From ad7ced3e7e5f797124d6cbb3e26b0fdeaf30f1ad Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 13 Oct 2016 11:40:23 -0400 Subject: [PATCH 001/879] One-way associations --- .travis.yml | 15 +- CHANGELOG.md | 9 + addon/db.js | 12 + addon/orm/associations/association.js | 91 ++++- addon/orm/associations/belongs-to.js | 114 ++++--- addon/orm/associations/has-many.js | 162 ++++----- addon/orm/collection.js | 42 +++ addon/orm/model.js | 323 ++++++++++++++++-- addon/orm/schema.js | 44 ++- addon/route-handlers/shorthands/delete.js | 2 +- addon/serializer.js | 17 +- addon/serializers/active-model-serializer.js | 4 + addon/serializers/rest-serializer.js | 5 + package.json | 2 +- testem.js | 4 +- tests/acceptance/serializers-test.js | 1 - tests/dummy/mirage/fixtures/word-smiths.js | 3 +- tests/dummy/mirage/models/blog-post.js | 4 +- tests/integration/factories/helpers-test.js | 59 ++-- .../orm/belongs-to/1-basic/_helper.js | 96 ++++++ .../belongs-to/1-basic/_regressions-test.js | 27 ++ .../orm/belongs-to/1-basic/accessor-test.js | 22 ++ .../1-basic/association-create-test.js | 26 ++ .../1-basic/association-new-test.js | 31 ++ .../1-basic/association-set-id-test.js | 41 +++ .../1-basic/association-set-test.js | 44 +++ .../orm/belongs-to/1-basic/create-test.js | 60 ++++ .../orm/belongs-to/1-basic/delete-test.js | 24 ++ .../belongs-to/1-basic/instantiating-test.js | 82 +++++ .../orm/belongs-to/2-named/_helper.js | 96 ++++++ .../orm/belongs-to/2-named/accessor-test.js | 22 ++ .../2-named/association-create-test.js | 26 ++ .../2-named/association-new-test.js | 31 ++ .../2-named/association-set-id-test.js | 41 +++ .../2-named/association-set-test.js | 44 +++ .../orm/belongs-to/2-named/create-test.js | 60 ++++ .../orm/belongs-to/2-named/delete-test.js | 24 ++ .../belongs-to/2-named/instantiating-test.js | 82 +++++ .../orm/belongs-to/3-reflexive/_helper.js | 95 ++++++ .../belongs-to/3-reflexive/accessor-test.js | 34 ++ .../3-reflexive/association-create-test.js | 33 ++ .../3-reflexive/association-new-test.js | 37 ++ .../3-reflexive/association-set-id-test.js | 53 +++ .../3-reflexive/association-set-test.js | 62 ++++ .../orm/belongs-to/3-reflexive/create-test.js | 62 ++++ .../orm/belongs-to/3-reflexive/delete-test.js | 24 ++ .../3-reflexive/instantiating-test.js | 83 +++++ .../belongs-to/4-named-reflexive/_helper.js | 95 ++++++ .../4-named-reflexive/accessor-test.js | 34 ++ .../association-create-test.js | 26 ++ .../4-named-reflexive/association-new-test.js | 31 ++ .../association-set-id-test.js | 41 +++ .../4-named-reflexive/association-set-test.js | 44 +++ .../4-named-reflexive/create-test.js | 62 ++++ .../4-named-reflexive/delete-test.js | 24 ++ .../4-named-reflexive/instantiating-test.js | 83 +++++ .../_helper.js | 95 ++++++ .../accessor-test.js | 34 ++ .../association-create-test.js | 26 ++ .../association-new-test.js | 31 ++ .../association-set-id-test.js | 41 +++ .../association-set-test.js | 44 +++ .../create-test.js | 62 ++++ .../delete-test.js | 24 ++ .../instantiating-test.js | 83 +++++ .../belongs-to/6-one-way-reflexive/_helper.js | 94 +++++ .../6-one-way-reflexive/accessor-test.js | 28 ++ .../association-create-test.js | 26 ++ .../association-new-test.js | 31 ++ .../association-set-id-test.js | 41 +++ .../association-set-test.js | 44 +++ .../6-one-way-reflexive/create-test.js | 60 ++++ .../6-one-way-reflexive/delete-test.js | 24 ++ .../6-one-way-reflexive/instantiating-test.js | 82 +++++ .../7-named-one-way-reflexive/_helper.js | 94 +++++ .../accessor-test.js | 28 ++ .../association-create-test.js | 26 ++ .../association-new-test.js | 31 ++ .../association-set-id-test.js | 41 +++ .../association-set-test.js | 44 +++ .../7-named-one-way-reflexive/create-test.js | 60 ++++ .../7-named-one-way-reflexive/delete-test.js | 24 ++ .../instantiating-test.js | 82 +++++ .../orm/belongs-to/8-one-to-one/_helper.js | 98 ++++++ .../belongs-to/8-one-to-one/accessor-test.js | 34 ++ .../8-one-to-one/association-create-test.js | 27 ++ .../8-one-to-one/association-new-test.js | 33 ++ .../8-one-to-one/association-set-id-test.js | 47 +++ .../8-one-to-one/association-set-test.js | 49 +++ .../belongs-to/8-one-to-one/create-test.js | 65 ++++ .../belongs-to/8-one-to-one/delete-test.js | 24 ++ .../8-one-to-one/instantiating-test.js | 83 +++++ .../orm/belongs-to/9-misc/misc-test.js | 18 + .../orm/belongs-to/accessor-test.js | 53 --- .../orm/belongs-to/belongs-to-helper.js | 91 ----- .../orm/belongs-to/create-association-test.js | 34 -- .../create-with-association-test.js | 65 ---- .../orm/belongs-to/instantiating-test.js | 101 ------ .../orm/belongs-to/new-association-test.js | 38 --- tests/integration/orm/belongs-to/notes.md | 43 +++ .../orm/belongs-to/set-association-id-test.js | 46 --- .../orm/belongs-to/set-association-test.js | 48 --- .../orm/has-many/1-basic/_helper.js | 124 +++++++ .../orm/has-many/1-basic/accessor-test.js | 30 ++ .../1-basic/association-create-test.js | 28 ++ .../has-many/1-basic/association-new-test.js | 33 ++ .../1-basic/association-set-ids-test.js | 34 ++ .../has-many/1-basic/association-set-test.js | 53 +++ .../orm/has-many/1-basic/create-test.js | 87 +++++ .../orm/has-many/1-basic/delete-test.js | 24 ++ .../has-many/1-basic/instantiating-test.js | 81 +++++ .../orm/has-many/2-named/_helper.js | 123 +++++++ .../orm/has-many/2-named/accessor-test.js | 30 ++ .../2-named/association-create-test.js | 28 ++ .../has-many/2-named/association-new-test.js | 33 ++ .../2-named/association-set-ids-test.js | 34 ++ .../has-many/2-named/association-set-test.js | 53 +++ .../orm/has-many/2-named/create-test.js | 87 +++++ .../orm/has-many/2-named/delete-test.js | 24 ++ .../has-many/2-named/instantiating-test.js | 81 +++++ .../orm/has-many/3-reflexive/_helper.js | 127 +++++++ .../orm/has-many/3-reflexive/accessor-test.js | 30 ++ .../3-reflexive/association-create-test.js | 29 ++ .../3-reflexive/association-new-test.js | 35 ++ .../3-reflexive/association-set-ids-test.js | 48 +++ .../3-reflexive/association-set-test.js | 81 +++++ .../orm/has-many/3-reflexive/create-test.js | 94 +++++ .../orm/has-many/3-reflexive/delete-test.js | 24 ++ .../orm/has-many/3-reflexive/new-test.js | 81 +++++ .../orm/has-many/4-named-reflexive/_helper.js | 127 +++++++ .../4-named-reflexive/accessor-test.js | 30 ++ .../association-create-test.js | 29 ++ .../4-named-reflexive/association-new-test.js | 35 ++ .../association-set-ids-test.js | 48 +++ .../4-named-reflexive/association-set-test.js | 81 +++++ .../has-many/4-named-reflexive/create-test.js | 94 +++++ .../has-many/4-named-reflexive/delete-test.js | 24 ++ .../has-many/4-named-reflexive/new-test.js | 81 +++++ .../_helper.js | 127 +++++++ .../accessor-test.js | 30 ++ .../association-create-test.js | 29 ++ .../association-new-test.js | 35 ++ .../association-set-ids-test.js | 48 +++ .../association-set-test.js | 81 +++++ .../create-test.js | 94 +++++ .../delete-test.js | 24 ++ .../new-test.js | 81 +++++ .../has-many/6-one-way-reflexive/_helper.js | 127 +++++++ .../6-one-way-reflexive/accessor-test.js | 27 ++ .../association-create-test.js | 29 ++ .../association-new-test.js | 35 ++ .../association-set-ids-test.js | 38 +++ .../association-set-test.js | 63 ++++ .../6-one-way-reflexive/create-test.js | 92 +++++ .../6-one-way-reflexive/delete-test.js | 24 ++ .../has-many/6-one-way-reflexive/new-test.js | 81 +++++ .../7-named-one-way-reflexive/_helper.js | 127 +++++++ .../accessor-test.js | 27 ++ .../association-create-test.js | 29 ++ .../association-new-test.js | 35 ++ .../association-set-ids-test.js | 38 +++ .../association-set-test.js | 63 ++++ .../7-named-one-way-reflexive/create-test.js | 92 +++++ .../7-named-one-way-reflexive/delete-test.js | 24 ++ .../7-named-one-way-reflexive/new-test.js | 81 +++++ .../orm/has-many/8-many-to-many/_helper.js | 135 ++++++++ .../has-many/8-many-to-many/accessor-test.js | 30 ++ .../8-many-to-many/association-create-test.js | 29 ++ .../8-many-to-many/association-new-test.js | 35 ++ .../association-set-ids-test.js | 49 +++ .../8-many-to-many/association-set-test.js | 82 +++++ .../has-many/8-many-to-many/create-test.js | 97 ++++++ .../has-many/8-many-to-many/delete-test.js | 24 ++ .../orm/has-many/8-many-to-many/new-test.js | 81 +++++ .../integration/orm/has-many/accessor-test.js | 24 -- .../orm/has-many/create-association-test.js | 42 --- .../orm/has-many/has-many-helper.js | 200 ----------- .../orm/has-many/instantiating-test.js | 108 ------ .../orm/has-many/new-association-test.js | 38 --- .../orm/has-many/set-association-ids-test.js | 52 --- .../orm/has-many/set-association-test.js | 124 ------- .../orm/mixed/1-one-to-many/_helper.js | 138 ++++++++ .../orm/mixed/1-one-to-many/accessor-test.js | 34 ++ .../1-one-to-many/association-create-test.js | 32 ++ .../1-one-to-many/association-new-test.js | 33 ++ .../1-one-to-many/association-set-ids-test.js | 59 ++++ .../1-one-to-many/association-set-test.js | 89 +++++ .../orm/mixed/1-one-to-many/create-test.js | 97 ++++++ .../mixed/1-one-to-many/instantiating-test.js | 81 +++++ .../orm/mixed/2-many-to-one/_helper.js | 104 ++++++ .../orm/mixed/2-many-to-one/accessor-test.js | 30 ++ .../2-many-to-one/association-create-test.js | 34 ++ .../2-many-to-one/association-new-test.js | 42 +++ .../2-many-to-one/association-set-ids-test.js | 54 +++ .../2-many-to-one/association-set-test.js | 67 ++++ .../orm/mixed/2-many-to-one/create-test.js | 71 ++++ .../mixed/2-many-to-one/instantiating-test.js | 96 ++++++ .../orm/named-associations-test.js | 246 ------------- .../orm/reinitialize-associations-test.js | 10 +- .../schema-verification/belongs-to-test.js | 136 ++++++++ .../orm/schema-verification/has-many-test.js | 53 +++ .../orm/schema-verification/mixed-test.js | 69 ++++ .../route-handlers/delete-shorthand-test.js | 4 +- .../active-model-serializer-test.js | 6 + .../sideloading-assorted-collections-test.js | 30 +- .../sideloading-collection-test.js | 104 +++--- .../associations/sideloading-model-test.js | 120 ++----- .../serializers/base/full-request-test.js | 3 +- .../serializers/base/serialize-ids-test.js | 12 +- .../associations/includes-test.js | 16 +- ...alizer-test.js => rest-serializer-test.js} | 3 + .../integration/serializers/schema-helper.js | 6 +- .../server/factory-creation-test.js | 1 + 213 files changed, 10010 insertions(+), 1698 deletions(-) create mode 100644 tests/integration/orm/belongs-to/1-basic/_helper.js create mode 100644 tests/integration/orm/belongs-to/1-basic/_regressions-test.js create mode 100644 tests/integration/orm/belongs-to/1-basic/accessor-test.js create mode 100644 tests/integration/orm/belongs-to/1-basic/association-create-test.js create mode 100644 tests/integration/orm/belongs-to/1-basic/association-new-test.js create mode 100644 tests/integration/orm/belongs-to/1-basic/association-set-id-test.js create mode 100644 tests/integration/orm/belongs-to/1-basic/association-set-test.js create mode 100644 tests/integration/orm/belongs-to/1-basic/create-test.js create mode 100644 tests/integration/orm/belongs-to/1-basic/delete-test.js create mode 100644 tests/integration/orm/belongs-to/1-basic/instantiating-test.js create mode 100644 tests/integration/orm/belongs-to/2-named/_helper.js create mode 100644 tests/integration/orm/belongs-to/2-named/accessor-test.js create mode 100644 tests/integration/orm/belongs-to/2-named/association-create-test.js create mode 100644 tests/integration/orm/belongs-to/2-named/association-new-test.js create mode 100644 tests/integration/orm/belongs-to/2-named/association-set-id-test.js create mode 100644 tests/integration/orm/belongs-to/2-named/association-set-test.js create mode 100644 tests/integration/orm/belongs-to/2-named/create-test.js create mode 100644 tests/integration/orm/belongs-to/2-named/delete-test.js create mode 100644 tests/integration/orm/belongs-to/2-named/instantiating-test.js create mode 100644 tests/integration/orm/belongs-to/3-reflexive/_helper.js create mode 100644 tests/integration/orm/belongs-to/3-reflexive/accessor-test.js create mode 100644 tests/integration/orm/belongs-to/3-reflexive/association-create-test.js create mode 100644 tests/integration/orm/belongs-to/3-reflexive/association-new-test.js create mode 100644 tests/integration/orm/belongs-to/3-reflexive/association-set-id-test.js create mode 100644 tests/integration/orm/belongs-to/3-reflexive/association-set-test.js create mode 100644 tests/integration/orm/belongs-to/3-reflexive/create-test.js create mode 100644 tests/integration/orm/belongs-to/3-reflexive/delete-test.js create mode 100644 tests/integration/orm/belongs-to/3-reflexive/instantiating-test.js create mode 100644 tests/integration/orm/belongs-to/4-named-reflexive/_helper.js create mode 100644 tests/integration/orm/belongs-to/4-named-reflexive/accessor-test.js create mode 100644 tests/integration/orm/belongs-to/4-named-reflexive/association-create-test.js create mode 100644 tests/integration/orm/belongs-to/4-named-reflexive/association-new-test.js create mode 100644 tests/integration/orm/belongs-to/4-named-reflexive/association-set-id-test.js create mode 100644 tests/integration/orm/belongs-to/4-named-reflexive/association-set-test.js create mode 100644 tests/integration/orm/belongs-to/4-named-reflexive/create-test.js create mode 100644 tests/integration/orm/belongs-to/4-named-reflexive/delete-test.js create mode 100644 tests/integration/orm/belongs-to/4-named-reflexive/instantiating-test.js create mode 100644 tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/_helper.js create mode 100644 tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/accessor-test.js create mode 100644 tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-create-test.js create mode 100644 tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-new-test.js create mode 100644 tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-id-test.js create mode 100644 tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-test.js create mode 100644 tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/create-test.js create mode 100644 tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/delete-test.js create mode 100644 tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/instantiating-test.js create mode 100644 tests/integration/orm/belongs-to/6-one-way-reflexive/_helper.js create mode 100644 tests/integration/orm/belongs-to/6-one-way-reflexive/accessor-test.js create mode 100644 tests/integration/orm/belongs-to/6-one-way-reflexive/association-create-test.js create mode 100644 tests/integration/orm/belongs-to/6-one-way-reflexive/association-new-test.js create mode 100644 tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-id-test.js create mode 100644 tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-test.js create mode 100644 tests/integration/orm/belongs-to/6-one-way-reflexive/create-test.js create mode 100644 tests/integration/orm/belongs-to/6-one-way-reflexive/delete-test.js create mode 100644 tests/integration/orm/belongs-to/6-one-way-reflexive/instantiating-test.js create mode 100644 tests/integration/orm/belongs-to/7-named-one-way-reflexive/_helper.js create mode 100644 tests/integration/orm/belongs-to/7-named-one-way-reflexive/accessor-test.js create mode 100644 tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-create-test.js create mode 100644 tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-new-test.js create mode 100644 tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-id-test.js create mode 100644 tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-test.js create mode 100644 tests/integration/orm/belongs-to/7-named-one-way-reflexive/create-test.js create mode 100644 tests/integration/orm/belongs-to/7-named-one-way-reflexive/delete-test.js create mode 100644 tests/integration/orm/belongs-to/7-named-one-way-reflexive/instantiating-test.js create mode 100644 tests/integration/orm/belongs-to/8-one-to-one/_helper.js create mode 100644 tests/integration/orm/belongs-to/8-one-to-one/accessor-test.js create mode 100644 tests/integration/orm/belongs-to/8-one-to-one/association-create-test.js create mode 100644 tests/integration/orm/belongs-to/8-one-to-one/association-new-test.js create mode 100644 tests/integration/orm/belongs-to/8-one-to-one/association-set-id-test.js create mode 100644 tests/integration/orm/belongs-to/8-one-to-one/association-set-test.js create mode 100644 tests/integration/orm/belongs-to/8-one-to-one/create-test.js create mode 100644 tests/integration/orm/belongs-to/8-one-to-one/delete-test.js create mode 100644 tests/integration/orm/belongs-to/8-one-to-one/instantiating-test.js create mode 100644 tests/integration/orm/belongs-to/9-misc/misc-test.js delete mode 100644 tests/integration/orm/belongs-to/accessor-test.js delete mode 100644 tests/integration/orm/belongs-to/belongs-to-helper.js delete mode 100644 tests/integration/orm/belongs-to/create-association-test.js delete mode 100644 tests/integration/orm/belongs-to/create-with-association-test.js delete mode 100644 tests/integration/orm/belongs-to/instantiating-test.js delete mode 100644 tests/integration/orm/belongs-to/new-association-test.js create mode 100644 tests/integration/orm/belongs-to/notes.md delete mode 100644 tests/integration/orm/belongs-to/set-association-id-test.js delete mode 100644 tests/integration/orm/belongs-to/set-association-test.js create mode 100644 tests/integration/orm/has-many/1-basic/_helper.js create mode 100644 tests/integration/orm/has-many/1-basic/accessor-test.js create mode 100644 tests/integration/orm/has-many/1-basic/association-create-test.js create mode 100644 tests/integration/orm/has-many/1-basic/association-new-test.js create mode 100644 tests/integration/orm/has-many/1-basic/association-set-ids-test.js create mode 100644 tests/integration/orm/has-many/1-basic/association-set-test.js create mode 100644 tests/integration/orm/has-many/1-basic/create-test.js create mode 100644 tests/integration/orm/has-many/1-basic/delete-test.js create mode 100644 tests/integration/orm/has-many/1-basic/instantiating-test.js create mode 100644 tests/integration/orm/has-many/2-named/_helper.js create mode 100644 tests/integration/orm/has-many/2-named/accessor-test.js create mode 100644 tests/integration/orm/has-many/2-named/association-create-test.js create mode 100644 tests/integration/orm/has-many/2-named/association-new-test.js create mode 100644 tests/integration/orm/has-many/2-named/association-set-ids-test.js create mode 100644 tests/integration/orm/has-many/2-named/association-set-test.js create mode 100644 tests/integration/orm/has-many/2-named/create-test.js create mode 100644 tests/integration/orm/has-many/2-named/delete-test.js create mode 100644 tests/integration/orm/has-many/2-named/instantiating-test.js create mode 100644 tests/integration/orm/has-many/3-reflexive/_helper.js create mode 100644 tests/integration/orm/has-many/3-reflexive/accessor-test.js create mode 100644 tests/integration/orm/has-many/3-reflexive/association-create-test.js create mode 100644 tests/integration/orm/has-many/3-reflexive/association-new-test.js create mode 100644 tests/integration/orm/has-many/3-reflexive/association-set-ids-test.js create mode 100644 tests/integration/orm/has-many/3-reflexive/association-set-test.js create mode 100644 tests/integration/orm/has-many/3-reflexive/create-test.js create mode 100644 tests/integration/orm/has-many/3-reflexive/delete-test.js create mode 100644 tests/integration/orm/has-many/3-reflexive/new-test.js create mode 100644 tests/integration/orm/has-many/4-named-reflexive/_helper.js create mode 100644 tests/integration/orm/has-many/4-named-reflexive/accessor-test.js create mode 100644 tests/integration/orm/has-many/4-named-reflexive/association-create-test.js create mode 100644 tests/integration/orm/has-many/4-named-reflexive/association-new-test.js create mode 100644 tests/integration/orm/has-many/4-named-reflexive/association-set-ids-test.js create mode 100644 tests/integration/orm/has-many/4-named-reflexive/association-set-test.js create mode 100644 tests/integration/orm/has-many/4-named-reflexive/create-test.js create mode 100644 tests/integration/orm/has-many/4-named-reflexive/delete-test.js create mode 100644 tests/integration/orm/has-many/4-named-reflexive/new-test.js create mode 100644 tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/_helper.js create mode 100644 tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/accessor-test.js create mode 100644 tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-create-test.js create mode 100644 tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-new-test.js create mode 100644 tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-ids-test.js create mode 100644 tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-test.js create mode 100644 tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/create-test.js create mode 100644 tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/delete-test.js create mode 100644 tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/new-test.js create mode 100644 tests/integration/orm/has-many/6-one-way-reflexive/_helper.js create mode 100644 tests/integration/orm/has-many/6-one-way-reflexive/accessor-test.js create mode 100644 tests/integration/orm/has-many/6-one-way-reflexive/association-create-test.js create mode 100644 tests/integration/orm/has-many/6-one-way-reflexive/association-new-test.js create mode 100644 tests/integration/orm/has-many/6-one-way-reflexive/association-set-ids-test.js create mode 100644 tests/integration/orm/has-many/6-one-way-reflexive/association-set-test.js create mode 100644 tests/integration/orm/has-many/6-one-way-reflexive/create-test.js create mode 100644 tests/integration/orm/has-many/6-one-way-reflexive/delete-test.js create mode 100644 tests/integration/orm/has-many/6-one-way-reflexive/new-test.js create mode 100644 tests/integration/orm/has-many/7-named-one-way-reflexive/_helper.js create mode 100644 tests/integration/orm/has-many/7-named-one-way-reflexive/accessor-test.js create mode 100644 tests/integration/orm/has-many/7-named-one-way-reflexive/association-create-test.js create mode 100644 tests/integration/orm/has-many/7-named-one-way-reflexive/association-new-test.js create mode 100644 tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-ids-test.js create mode 100644 tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-test.js create mode 100644 tests/integration/orm/has-many/7-named-one-way-reflexive/create-test.js create mode 100644 tests/integration/orm/has-many/7-named-one-way-reflexive/delete-test.js create mode 100644 tests/integration/orm/has-many/7-named-one-way-reflexive/new-test.js create mode 100644 tests/integration/orm/has-many/8-many-to-many/_helper.js create mode 100644 tests/integration/orm/has-many/8-many-to-many/accessor-test.js create mode 100644 tests/integration/orm/has-many/8-many-to-many/association-create-test.js create mode 100644 tests/integration/orm/has-many/8-many-to-many/association-new-test.js create mode 100644 tests/integration/orm/has-many/8-many-to-many/association-set-ids-test.js create mode 100644 tests/integration/orm/has-many/8-many-to-many/association-set-test.js create mode 100644 tests/integration/orm/has-many/8-many-to-many/create-test.js create mode 100644 tests/integration/orm/has-many/8-many-to-many/delete-test.js create mode 100644 tests/integration/orm/has-many/8-many-to-many/new-test.js delete mode 100644 tests/integration/orm/has-many/accessor-test.js delete mode 100644 tests/integration/orm/has-many/create-association-test.js delete mode 100644 tests/integration/orm/has-many/has-many-helper.js delete mode 100644 tests/integration/orm/has-many/instantiating-test.js delete mode 100644 tests/integration/orm/has-many/new-association-test.js delete mode 100644 tests/integration/orm/has-many/set-association-ids-test.js delete mode 100644 tests/integration/orm/has-many/set-association-test.js create mode 100644 tests/integration/orm/mixed/1-one-to-many/_helper.js create mode 100644 tests/integration/orm/mixed/1-one-to-many/accessor-test.js create mode 100644 tests/integration/orm/mixed/1-one-to-many/association-create-test.js create mode 100644 tests/integration/orm/mixed/1-one-to-many/association-new-test.js create mode 100644 tests/integration/orm/mixed/1-one-to-many/association-set-ids-test.js create mode 100644 tests/integration/orm/mixed/1-one-to-many/association-set-test.js create mode 100644 tests/integration/orm/mixed/1-one-to-many/create-test.js create mode 100644 tests/integration/orm/mixed/1-one-to-many/instantiating-test.js create mode 100644 tests/integration/orm/mixed/2-many-to-one/_helper.js create mode 100644 tests/integration/orm/mixed/2-many-to-one/accessor-test.js create mode 100644 tests/integration/orm/mixed/2-many-to-one/association-create-test.js create mode 100644 tests/integration/orm/mixed/2-many-to-one/association-new-test.js create mode 100644 tests/integration/orm/mixed/2-many-to-one/association-set-ids-test.js create mode 100644 tests/integration/orm/mixed/2-many-to-one/association-set-test.js create mode 100644 tests/integration/orm/mixed/2-many-to-one/create-test.js create mode 100644 tests/integration/orm/mixed/2-many-to-one/instantiating-test.js delete mode 100644 tests/integration/orm/named-associations-test.js create mode 100644 tests/integration/orm/schema-verification/belongs-to-test.js create mode 100644 tests/integration/orm/schema-verification/has-many-test.js create mode 100644 tests/integration/orm/schema-verification/mixed-test.js rename tests/integration/serializers/{rest-model-serializer-test.js => rest-serializer-test.js} (95%) diff --git a/.travis.yml b/.travis.yml index 331c7ac70..d16143973 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,8 @@ node_js: - "6" - "7" -sudo: false +sudo: required +dist: trusty cache: directories: @@ -26,11 +27,13 @@ matrix: - env: EMBER_TRY_SCENARIO=ember-canary before_install: - - npm config set spin false - - npm install -g bower - - bower --version - - npm install phantomjs-prebuilt - - node_modules/phantomjs-prebuilt/bin/phantomjs --version + - export CHROME_BIN=/usr/bin/google-chrome + - export DISPLAY=:99.0 + - sh -e /etc/init.d/xvfb start + - sudo apt-get update + - sudo apt-get install -y libappindicator1 fonts-liberation + - wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb + - sudo dpkg -i google-chrome*.deb install: - npm install diff --git a/CHANGELOG.md b/CHANGELOG.md index 195fd99f8..f405fb002 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,15 @@ Changes: - [ENHANCEMENT] [#995](https://github.com/samselikoff/ember-cli-mirage/pull/995) Invoke _getAttrsForRequest with correct model name @bwbuchanan - General improvements @azdaroth +- hasMany/belongsTo used to be autodefined, no longer + - explain why: sometimes one-way, sometimes ambiguous +- new serializer hook: `keyForForeignKey` + - used for belongsTo relationships (keyForRelationshipIds) + - TODO: this is an awful name, change it +- belongs to keys no longer automatically serialize + - need to explain why (one-sided relationships) + - change: either set `serializeIds` to `true`, or add missing relationships to `include: []` property on that model's serializer + ## 0.2.5 Update notes: None diff --git a/addon/db.js b/addon/db.js index 9ae54264b..e59e4abda 100644 --- a/addon/db.js +++ b/addon/db.js @@ -27,6 +27,18 @@ class Db { } } + /** + * @method dump + * @public + */ + dump() { + return this._collections.reduce((data, collection) => { + data[collection.name] = collection.all(); + + return data; + }, {}); + } + /** * @method createCollection * @param name diff --git a/addon/orm/associations/association.js b/addon/orm/associations/association.js index d1320b9e8..ff00db4b8 100644 --- a/addon/orm/associations/association.js +++ b/addon/orm/associations/association.js @@ -1,3 +1,6 @@ +import Model from '../model'; +import { dasherize } from 'ember-cli-mirage/utils/inflector'; + export default class Association { constructor(modelName, opts) { @@ -6,8 +9,9 @@ export default class Association { this.modelName = undefined; this.opts = modelName; } else { - // The modelName of the association - this.modelName = modelName; + // The modelName of the association. (Might not be passed in - set later + // by schema). + this.modelName = modelName ? dasherize(modelName) : ''; this.opts = opts || {}; } @@ -18,4 +22,87 @@ export default class Association { this.ownerModelName = ''; } + /** + * A setter for schema, since we don't have a reference at constuction time. + * + * @method setSchema + * @public + */ + setSchema(schema) { + this.schema = schema; + } + + /** + * Returns this association's inverse, if it exists + * + * @method inverse + * @return {Object} the inverse association + * @public + */ + inverse() { + let inverse; + + if (this.opts.inverse === null) { + inverse = null; + + } else if (this.isReflexive()) { + inverse = this; + + } else { + let associationsMap = this.schema.associationsFor(this.modelName); + let explicitInverse = this.opts.inverse; + if (explicitInverse) { + inverse = associationsMap[explicitInverse]; + } else { + let matches = Object.keys(associationsMap) + .map(key => associationsMap[key]) + .filter(association => association.modelName === this.ownerModelName); + + if (matches.length === 1) { + inverse = matches[0]; + } else { + inverse = null; + } + } + } + + return inverse; + } + + /** + * Returns true if the association is reflexive. + * + * @method isReflexive + * @return {Boolean} + * @public + */ + isReflexive() { + let isExplicitReflexive = !!(this.modelName === this.ownerModelName && this.opts.inverse); + let isImplicitReflexive = !!(this.opts.inverse === undefined && this.ownerModelName === this.modelName); + + return isExplicitReflexive || isImplicitReflexive; + } + + /** + * Used to check if models match each other. If models are saved, we check model type + * and id, since they could have other non-persisted properties that are different. + * + * @public + */ + inversesAlreadyAssociated(inverse, owner) { + let inverseKey = this.inverse().key; + let inverseAssociation = inverse[inverseKey]; + + if (inverseAssociation && owner) { + if (inverseAssociation instanceof Model) { + if (inverseAssociation.isSaved() && owner.isSaved()) { + return inverseAssociation.toString() === owner.toString(); + } else { + return inverseAssociation === owner; + } + } else { + return inverseAssociation.includes(owner); + } + } + } } diff --git a/addon/orm/associations/belongs-to.js b/addon/orm/associations/belongs-to.js index 94abaee0f..781dba845 100644 --- a/addon/orm/associations/belongs-to.js +++ b/addon/orm/associations/belongs-to.js @@ -5,16 +5,15 @@ import { toCollectionName } from 'ember-cli-mirage/utils/normalize-name'; import assert from 'ember-cli-mirage/assert'; /** + * The belongsTo association adds a fk to the owner of the association + * * @class BelongsTo * @extends Association * @constructor * @public */ -class BelongsTo extends Association { +export default class BelongsTo extends Association { - /* - The belongsTo association adds a fk to the owner of the association - */ /** * @method getForeignKeyArray * @return {Array} Array of camelized name of the model owning the association @@ -41,43 +40,62 @@ class BelongsTo extends Association { * * @method addMethodsToModelClass * @param {Function} ModelClass - * @param {String} key - * @param {Schema} schema + * @param {String} key the named key for the association * @public */ - addMethodsToModelClass(ModelClass, key, schema) { + addMethodsToModelClass(ModelClass, key) { let modelPrototype = ModelClass.prototype; let association = this; let foreignKey = this.getForeignKey(); + let associationHash = { [key]: this }; - let associationHash = {}; - associationHash[key] = this; modelPrototype.belongsToAssociations = _assign(modelPrototype.belongsToAssociations, associationHash); + + // Add to target's dependent associations array + this.schema.addDependentAssociation(this, this.modelName); + + // TODO: look how this is used. Are these necessary, seems like they could be gotten from the above? + // Or we could use a single data structure to store this information? modelPrototype.associationKeys.push(key); modelPrototype.associationIdKeys.push(foreignKey); - Object.defineProperty(modelPrototype, this.getForeignKey(), { + Object.defineProperty(modelPrototype, foreignKey, { /* object.parentId - returns the associated parent's id */ get() { - return this.attrs[foreignKey]; + this._tempAssociations = this._tempAssociations || {}; + let tempParent = this._tempAssociations[key]; + let id; + + if (tempParent === null) { + id = null; + } else if (tempParent) { + id = tempParent.id; + } else { + id = this.attrs[foreignKey]; + } + + return id; }, /* object.parentId = (parentId) - - sets the associated parent (via id) + - sets the associated parent via id */ set(id) { - assert( - !id || schema.db[toCollectionName(association.modelName)].find(id), - `Couldn\'t find ${association.modelName} with id = ${id}` - ); + let tempParent; + + if (id === null) { + tempParent = null; + } else if (id !== undefined) { + tempParent = association.schema[toCollectionName(association.modelName)].find(id); + assert(tempParent, `Couldn\'t find ${association.modelName} with id = ${id}`); + } - this.attrs[foreignKey] = id; - return this; + this[key] = tempParent; } }); @@ -87,32 +105,35 @@ class BelongsTo extends Association { - returns the associated parent */ get() { + this._tempAssociations = this._tempAssociations || {}; + + let tempParent = this._tempAssociations[key]; let foreignKeyId = this[foreignKey]; - if (foreignKeyId != null) { - association._tempParent = null; - return schema[toCollectionName(association.modelName)].find(foreignKeyId); + let model = null; - } else if (association._tempParent) { - return association._tempParent; - } else { - return null; + if (tempParent) { + model = tempParent; + } else if (foreignKeyId !== null) { + model = association.schema[toCollectionName(association.modelName)].find(foreignKeyId); } + + return model; }, /* object.parent = (parentModel) - - sets the associated parent (via model) + - sets the associated parent via model */ - set(newModel) { - if (newModel && newModel.isNew()) { - this[foreignKey] = null; - association._tempParent = newModel; - } else if (newModel) { - association._tempParent = null; - this[foreignKey] = newModel.id; - } else { - association._tempParent = null; - this[foreignKey] = null; + set(model) { + this._tempAssociations = this._tempAssociations || {}; + this._tempAssociations[key] = model; + + if ( + model && + association.inverse() && + !association.inversesAlreadyAssociated(model, this) // check for an existing match, to avoid recursion + ) { + model.associate(this, association.inverse()); } } }); @@ -122,7 +143,7 @@ class BelongsTo extends Association { - creates a new unsaved associated parent */ modelPrototype[`new${capitalize(key)}`] = function(attrs) { - let parent = schema[toCollectionName(association.modelName)].new(attrs); + let parent = association.schema[toCollectionName(association.modelName)].new(attrs); this[key] = parent; @@ -134,7 +155,7 @@ class BelongsTo extends Association { - creates a new saved associated parent, and immediately persists both models */ modelPrototype[`create${capitalize(key)}`] = function(attrs) { - let parent = schema[toCollectionName(association.modelName)].create(attrs); + let parent = association.schema[toCollectionName(association.modelName)].create(attrs); this[key] = parent; this.save(); @@ -143,6 +164,19 @@ class BelongsTo extends Association { }; } + /** + * + * + * @public + */ + disassociateAllDependentsFromTarget(model) { + let owner = this.ownerModelName; + let dependents = this.schema[toCollectionName(owner)] + .where({ [this.getForeignKey()]: model.id }); + + dependents.models.forEach(dependent => { + dependent.disassociate(model, this); + dependent.save(); + }); + } } - -export default BelongsTo; diff --git a/addon/orm/associations/has-many.js b/addon/orm/associations/has-many.js index a32c80dac..878eb9962 100644 --- a/addon/orm/associations/has-many.js +++ b/addon/orm/associations/has-many.js @@ -12,7 +12,7 @@ import assert from 'ember-cli-mirage/assert'; * @constructor * @public */ -class HasMany extends Association { +export default class HasMany extends Association { /** * @method getForeignKeyArray @@ -21,7 +21,7 @@ class HasMany extends Association { * @public */ getForeignKeyArray() { - return [camelize(this.modelName), this.getForeignKey()]; + return [camelize(this.ownerModelName), this.getForeignKey()]; } /** @@ -30,7 +30,7 @@ class HasMany extends Association { * @public */ getForeignKey() { - return `${this.opts.inverse || camelize(this.ownerModelName)}Id`; + return `${singularize(camelize(this.key))}Ids`; } /** @@ -41,65 +41,59 @@ class HasMany extends Association { * @method addMethodsToModelClass * @param {Function} ModelClass * @param {String} key - * @param {Schema} schema * @public */ - addMethodsToModelClass(ModelClass, key, schema) { + addMethodsToModelClass(ModelClass, key) { let modelPrototype = ModelClass.prototype; - this._model = modelPrototype; - this._key = key; - let association = this; let foreignKey = this.getForeignKey(); - let relationshipIdsKey = `${camelize(singularize(association.key))}Ids`; let associationHash = { [key]: this }; modelPrototype.hasManyAssociations = _assign(modelPrototype.hasManyAssociations, associationHash); + + // Add to target's dependent associations array + this.schema.addDependentAssociation(this, this.modelName); + + // TODO: look how this is used. Are these necessary, seems like they could be gotten from the above? + // Or we could use a single data structure to store this information? modelPrototype.associationKeys.push(key); - modelPrototype.associationIdKeys.push(relationshipIdsKey); + modelPrototype.associationIdKeys.push(foreignKey); - Object.defineProperty(modelPrototype, relationshipIdsKey, { + Object.defineProperty(modelPrototype, foreignKey, { /* object.childrenIds - returns an array of the associated children's ids */ get() { - let children = association._cachedChildren || new Collection(association.modelName); - - if (!this.isNew()) { - let query = { [foreignKey]: this.id }; - let savedChildren = schema[toCollectionName(association.modelName)].where(query); + this._tempAssociations = this._tempAssociations || {}; + let tempChildren = this._tempAssociations[key]; + let ids = []; - children.mergeCollection(savedChildren); + if (tempChildren) { + ids = tempChildren.models.map(model => model.id); + } else { + ids = this.attrs[foreignKey] || []; } - return children.models.map((model) => model.id); + return ids; }, /* object.childrenIds = ([childrenIds...]) - - sets the associated parent (via id) + - sets the associated children (via id) */ set(ids) { - ids = ids || []; - - if (this.isNew()) { - association._cachedChildren = schema[toCollectionName(association.modelName)].find(ids); - - } else { - // Set current children's fk to null - let query = { [foreignKey]: this.id }; - schema[toCollectionName(association.modelName)].where(query).update(foreignKey, null); + let tempChildren; - // Associate the new childrens to this model - schema[toCollectionName(association.modelName)].find(ids).update(foreignKey, this.id); - - // Clear out any old cached children - association._cachedChildren = new Collection(association.modelName); + if (ids === null) { + tempChildren = []; + } else if (ids !== undefined) { + assert(Array.isArray(ids), `You must pass an array in when seting ${foreignKey} on ${this}`); + tempChildren = association.schema[toCollectionName(association.modelName)].find(ids); } - return this; + this[key] = tempChildren; } }); @@ -110,46 +104,42 @@ class HasMany extends Association { - returns an array of associated children */ get() { - let temporaryChildren = association._cachedChildren || new Collection(association.modelName); - - if (this.isNew()) { - return temporaryChildren; + this._tempAssociations = this._tempAssociations || {}; + let collection = null; + if (this._tempAssociations[key]) { + collection = this._tempAssociations[key]; } else { - let query = { [foreignKey]: this.id }; - let savedChildren = schema[toCollectionName(association.modelName)].where(query); + if (this[foreignKey]) { + collection = association.schema[toCollectionName(association.modelName)].find(this[foreignKey]); + } else { + collection = new Collection(association.modelName); + } - return savedChildren.mergeCollection(temporaryChildren); + this._tempAssociations[key] = collection; } + + return collection; }, /* object.children = [model1, model2, ...] - - sets the associated children (via array of models) - - note: this method will persist unsaved chidren - + (why? because rails does) + - sets the associated children (via array of models or Collection) */ set(models) { - models = models ? _compact(models) : []; - - if (this.isNew()) { - association._cachedChildren = models instanceof Collection ? models : new Collection(association.modelName, models); - - } else { - - // Set current children's fk to null - let query = { [foreignKey]: this.id }; - schema[toCollectionName(association.modelName)].where(query).update(foreignKey, null); + if (models instanceof Collection) { + models = models.models; + } - // Save any children that are new - models.filter((model) => model.isNew()) - .forEach((model) => model.save()); + models = models ? _compact(models) : []; + this._tempAssociations = this._tempAssociations || {}; - // Associate the new children to this model - schema[toCollectionName(association.modelName)].find(models.map((m) => m.id)).update(foreignKey, this.id); + this._tempAssociations[key] = new Collection(association.modelName, models); - // Clear out any old cached children - association._cachedChildren = new Collection(association.modelName); + if (association.inverse()) { + models.forEach(model => { + model.associate(this, association.inverse()); + }); } } }); @@ -159,33 +149,51 @@ class HasMany extends Association { - creates a new unsaved associated child */ modelPrototype[`new${capitalize(camelize(singularize(association.key)))}`] = function(attrs = {}) { - if (!this.isNew()) { - attrs = _assign(attrs, { [foreignKey]: this.id }); - } + let child = association.schema[toCollectionName(association.modelName)].new(attrs); - let child = schema[toCollectionName(association.modelName)].new(attrs); - - association._cachedChildren = association._cachedChildren || new Collection(association.modelName); - association._cachedChildren.models.push(child); + let children = this[key].models; + children.push(child); + this[key] = children; return child; }; /* object.createChild - - creates an associated child, persists directly to db, and - updates the association's foreign key - - parent must be saved + - creates a new saved associated child, and immediately persists both models */ modelPrototype[`create${capitalize(camelize(singularize(association.key)))}`] = function(attrs = {}) { - assert(!this.isNew(), 'You cannot call create unless the parent is saved'); + let child = association.schema[toCollectionName(association.modelName)].create(attrs); - let augmentedAttrs = _assign(attrs, { [foreignKey]: this.id }); - let child = schema[toCollectionName(association.modelName)].create(augmentedAttrs); + // this[key].add(child); + let children = this[key].models; + children.push(child); + this[key] = children; - return child; + this.save(); + + return child.reload(); }; } -} -export default HasMany; + /** + * + * + * @public + */ + disassociateAllDependentsFromTarget(model) { + let owner = this.ownerModelName; + let dependents = this.schema[toCollectionName(owner)] + .where((potentialOwner) => { + let currentIds = potentialOwner[this.getForeignKey()]; + + // Need this check because currentIds could be null + return currentIds && currentIds.includes(model.id); + }); + + dependents.models.forEach(dependent => { + dependent.disassociate(model, this); + dependent.save(); + }); + } +} diff --git a/addon/orm/collection.js b/addon/orm/collection.js index 7eb480d9d..2e909da6d 100644 --- a/addon/orm/collection.js +++ b/addon/orm/collection.js @@ -1,5 +1,6 @@ import _invokeMap from 'lodash/invokeMap'; import assert from '../assert'; +import _isEqual from 'lodash/lang/isEqual'; /** * An array of models, returned from one of the schema query @@ -80,6 +81,47 @@ export default class Collection { return this; } + /** + * Adds a model to this collection + * + * @method add + * @return this + * @public + */ + add(model) { + this.models.push(model); + + return this; + } + + /** + * Removes a model to this collection + * + * @method remove + * @return this + * @public + */ + remove(model) { + let [ match ] = this.models.filter(m => _isEqual(m.attrs, model.attrs)); + if (match) { + let i = this.models.indexOf(match); + this.models.splice(i, 1); + } + + return this; + } + + /** + * Checks if the collection includes the model + * + * @method includes + * @return boolean + * @public + */ + includes(model) { + return this.models.filter(m => _isEqual(m.attrs, model.attrs)).length > 0; + } + /** * @method filter * @param f diff --git a/addon/orm/model.js b/addon/orm/model.js index cfdd5f373..333a5be6b 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -2,6 +2,7 @@ import { toCollectionName } from 'ember-cli-mirage/utils/normalize-name'; import extend from '../utils/extend'; import assert from '../assert'; import Collection from './collection'; +import _values from 'lodash/object/values'; /* The Model class. Notes: @@ -16,6 +17,7 @@ import Collection from './collection'; */ class Model { + // TODO: schema and modelName now set statically at registration, need to remove constructor(schema, modelName, attrs, fks) { assert(schema, 'A model requires a schema'); assert(modelName, 'A model requires a modelName'); @@ -51,7 +53,6 @@ class Model { this._schema.db[collection].update(this.attrs.id, this.attrs); } - // Update associated children this._saveAssociations(); return this; @@ -93,8 +94,12 @@ class Model { * @public */ destroy() { - let collection = toCollectionName(this.modelName); - this._schema.db[collection].remove(this.attrs.id); + if (this.isSaved()) { + this._disassociateFromDependents(); + + let collection = toCollectionName(this.modelName); + this._schema.db[collection].remove(this.attrs.id); + } } /** @@ -140,16 +145,21 @@ class Model { * @public */ reload() { - let collection = toCollectionName(this.modelName); - let attrs = this._schema.db[collection].find(this.id); + if (this.id) { + let collection = toCollectionName(this.modelName); + let attrs = this._schema.db[collection].find(this.id); + + Object.keys(attrs) + .filter(function(attr) { + return attr !== 'id'; + }) + .forEach(function(attr) { + this.attrs[attr] = attrs[attr]; + }, this); + } - Object.keys(attrs) - .filter(function(attr) { - return attr !== 'id'; - }) - .forEach(function(attr) { - this[attr] = attrs[attr]; - }, this); + // Clear temp associations + this._tempAssociations = {}; return this; } @@ -158,8 +168,55 @@ class Model { return this.attrs; } - // Private + /** + * Returns the association for the given key + * + * @method associationFor + * @param key + * @public + */ + associationFor(key) { + return this._schema.associationsFor(this.modelName)[key]; + } + /** + * Returns the inverse association, if it exists + * + * @method inverseAssociationFor + * @param key + * @public + */ + inverseAssociationFor(key) { + return this.associationFor(key).inverse(); + } + + associate(model, association) { + let { key } = association; + + if (association.constructor.name === 'HasMany') { + let currentModels = this[key].models; + if (currentModels.indexOf(model) === -1) { + this[key].add(model); + } + } else { + this[key] = model; + } + } + + disassociate(model, association) { + let fk = association.getForeignKey(); + + if (association.constructor.name === 'HasMany') { + let i = this[fk].map(key => key.toString()).indexOf(model.id.toString()); + if (i > -1) { + this.attrs[fk].splice(i, 1); + } + } else { + this.attrs[fk] = null; + } + } + + // Private /** * model.attrs represents the persistable attributes, i.e. your db * table fields. @@ -172,7 +229,10 @@ class Model { Object.keys(attrs) .filter((key) => { let value = attrs[key]; - return (value instanceof Model || value instanceof Collection); + let isModelOrCollection = (value instanceof Model || value instanceof Collection); + let isArrayOfModels = Array.isArray(value) && value.length && value.every(item => item instanceof Model); + + return isModelOrCollection || isArrayOfModels; }) .forEach((key) => { let modelOrCollection = attrs[key]; @@ -190,7 +250,7 @@ class Model { // Ensure fks are there this.fks.map(function(fk) { - hash[fk] = attrs[fk] || null; + hash[fk] = attrs[fk] !== undefined ? attrs[fk] : null; }); this.attrs = hash; @@ -235,47 +295,246 @@ class Model { } /** + * Foreign keys get set on attrs directly (to avoid potential recursion), but + * model references use the setter. + * + * We validate foreign keys during instantiation. + * * @method _setupRelationships * @param attrs * @private */ _setupRelationships(attrs) { - // Only want association keys and fks - let hash = Object.keys(attrs).reduce((memo, attr) => { - if (this.associationKeys.indexOf(attr) > -1 || this.associationIdKeys.indexOf(attr) > -1 || this.fks.indexOf(attr) > -1) { + let foreignKeysHash = Object.keys(attrs).reduce((memo, attr) => { + if (this.associationIdKeys.indexOf(attr) > -1 || this.fks.indexOf(attr) > -1) { memo[attr] = attrs[attr]; } return memo; }, {}); - Object.keys(hash).forEach(function(attr) { - this[attr] = hash[attr]; + Object.keys(foreignKeysHash).forEach(function(attr) { + let fk = foreignKeysHash[attr]; + if (fk !== undefined && fk !== null) { + this._validateForeignKeyExistsInDatabase(attr, fk); + } + + this.attrs[attr] = fk; + }, this); + + let associationKeysHash = Object.keys(attrs).reduce((memo, attr) => { + if (this.associationKeys.indexOf(attr) > -1) { + memo[attr] = attrs[attr]; + } + return memo; + }, {}); + Object.keys(associationKeysHash).forEach(function(attr) { + this[attr] = associationKeysHash[attr]; }, this); } + /** + * Originally we validated this via association.setId method, but it triggered + * recursion. That method is designed for updating an existing model's ID so + * this method is needed during instantiation. + * + * @method _validateForeignKeyExistsInDatabase + * @private + */ + _validateForeignKeyExistsInDatabase(foreignKeyName, foreignKeys) { + if (Array.isArray(foreignKeys)) { + let associationModelName = Object.keys(this.hasManyAssociations) + .map(key => this.hasManyAssociations[key]) + .filter(association => association.getForeignKey() === foreignKeyName)[0] + .modelName; + + let found = this._schema.db[toCollectionName(associationModelName)].find(foreignKeys); + assert(found.length === foreignKeys.length, `You're instantiating a ${this.modelName} that has a ${foreignKeyName} of ${foreignKeys}, but some of those records don't exist in the database.`); + + } else { + let associationModelName = Object.keys(this.belongsToAssociations) + .map(key => this.belongsToAssociations[key]) + .filter(association => association.getForeignKey() === foreignKeyName)[0] + .modelName; + + let found = this._schema.db[toCollectionName(associationModelName)].find(foreignKeys); + assert(found, `You're instantiating a ${this.modelName} that has a ${foreignKeyName} of ${foreignKeys}, but that record doesn't exist in the database.`); + } + } + /** * Update associated children when saving a collection + * * @method _saveAssociations * @private */ _saveAssociations() { - Object.keys(this.belongsToAssociations).forEach((key) => { - let association = this.belongsToAssociations[key]; - let parent = this[key]; - if (parent && parent.isNew()) { - let fk = association.getForeignKey(); - parent.save(); - this.update(fk, parent.id); - } + this._saveBelongsToAssociations(); + this._saveHasManyAssociations(); + } + + _saveBelongsToAssociations() { + _values(this.belongsToAssociations).forEach(association => { + this._disassociateFromOldInverses(association); + this._saveNewAssociates(association); + this._associateWithNewInverse(association); }); + } - Object.keys(this.hasManyAssociations).forEach((key) => { - let association = this.hasManyAssociations[key]; - let children = this[key]; - children.update(association.getForeignKey(), this.id); + _saveHasManyAssociations() { + _values(this.hasManyAssociations).forEach(association => { + this._disassociateFromOldInverses(association); + this._saveNewAssociates(association); + this._associateWithNewInverses(association); }); } + _disassociateFromOldInverses(association) { + if (association.constructor.name === 'HasMany') { + this._disassociateFromHasManyInverses(association); + } else if (association.constructor.name === 'BelongsTo') { + this._disassociateFromBelongsToInverse(association); + } + } + + _disassociateFromHasManyInverses(association) { + let { key } = association; + let fk = association.getForeignKey(); + let inverse = association.inverse(); + let tempAssociation = this._tempAssociations && this._tempAssociations[key]; + let oldInversesExist = this.attrs[fk]; + + if (inverse && tempAssociation && oldInversesExist) { + // Disassociate currently persisted models that are no longer associated + this._schema[toCollectionName(association.modelName)] + .find(this.attrs[fk] || []) // TODO: prob should initialize hasMany fks with [] + .models + .filter(model => !tempAssociation.includes(model)) // filter out models that will still be associated + .forEach(model => { + model.disassociate(this, inverse); + model.save(); + }); + } + } + + _disassociateFromBelongsToInverse(association) { + let { key } = association; + let fk = association.getForeignKey(); + let inverse = association.inverse(); + let tempAssociation = this._tempAssociations && this._tempAssociations[key]; + let oldInversesExist = this.attrs[fk]; + + if (inverse && (tempAssociation !== undefined) && oldInversesExist) { + // Disassociate currently persisted models that are no longer associated + let model = this._schema[toCollectionName(association.modelName)] + .find(this.attrs[fk]); + + model.disassociate(this, inverse); + model._updateInDb(model.attrs); + } + } + + _disassociateFromDependents() { + _values(this._schema.dependentAssociationsFor(this.modelName)) + .forEach(association => { + association.disassociateAllDependentsFromTarget(this); + }); + } + + _saveNewAssociates(association) { + let { key } = association; + let fk = association.getForeignKey(); + let tempAssociate = this._tempAssociations && this._tempAssociations[key]; + + if (tempAssociate !== undefined) { + this.__isSavingNewChildren = true; + delete this._tempAssociations[key]; + + if (tempAssociate instanceof Collection) { + tempAssociate.models.forEach(child => { + child.save(); + }); + + this._updateInDb({ [fk]: tempAssociate.models.map(child => child.id) }); + } else { + + if (tempAssociate === null) { + this._updateInDb({ [fk]: null }); + } else { + tempAssociate.save(); + this._updateInDb({ [fk]: tempAssociate.id }); + } + } + + this.__isSavingNewChildren = false; + } + } + + _associateWithNewInverse(association) { + let fk = association.getForeignKey(); + let inverse = association.inverse(); + + if (this[fk] && inverse && (inverse.constructor.name === 'BelongsTo') && !this.__isSavingNewChildren) { + let inverseFk = inverse.getForeignKey(); + + this._schema.db[toCollectionName(association.modelName)] + .update(this[fk], { [inverseFk]: this.id }); + + } else if (this[fk] && inverse && (inverse.constructor.name === 'HasMany') && !this.__isSavingNewChildren) { + let inverseFk = inverse.getForeignKey(); + let inverseCollection = this._schema.db[toCollectionName(association.modelName)]; + let currentIdsForInverse = inverseCollection.find(this[fk])[inverse.getForeignKey()] || []; + let newIdsForInverse = currentIdsForInverse; + + if (newIdsForInverse.indexOf(this.id) === -1) { + newIdsForInverse.push(this.id); + } + + inverseCollection.update(this[fk], { [inverseFk]: newIdsForInverse }); + } + } + + _associateWithNewInverses(association) { + let fk = association.getForeignKey(); + let inverse = association.inverse(); + + // Associate new models + if (inverse && (inverse.constructor.name === 'HasMany') && !this.__isSavingNewChildren) { + this._schema[toCollectionName(association.modelName)] + .find(this[fk]) + .models + .forEach(model => { + let inverseFk = inverse.getForeignKey(); + let ownerId = this.id; + let inverseCollection = this._schema.db[toCollectionName(model.modelName)]; + let currentIdsForInverse = inverseCollection.find(model.id)[inverse.getForeignKey()] || []; + let newIdsForInverse = currentIdsForInverse; + + if (newIdsForInverse.indexOf(ownerId) === -1) { + newIdsForInverse.push(ownerId); + } + + inverseCollection.update(model.id, { [inverseFk]: newIdsForInverse }); + }); + } else if (inverse && (inverse.constructor.name === 'BelongsTo') && !this.__isSavingNewChildren) { + this._schema[toCollectionName(association.modelName)] + .find(this[fk]) + .models + .forEach(model => { + let inverseFk = inverse.getForeignKey(); + let ownerId = this.id; + let inverseCollection = this._schema.db[toCollectionName(model.modelName)]; + + inverseCollection.update(model.id, { [inverseFk]: ownerId }); + }); + } + } + + // Used to update data directly, since #save and #update can retrigger saves, + // which can cause cycles with associations. + _updateInDb(attrs) { + this.attrs = this._schema.db[toCollectionName(this.modelName)].update(this.attrs.id, attrs); + } + /** * Simple string representation of the model and id. * @method toString diff --git a/addon/orm/schema.js b/addon/orm/schema.js index 5c1e47368..b11f1435d 100644 --- a/addon/orm/schema.js +++ b/addon/orm/schema.js @@ -18,6 +18,7 @@ export default class Schema { this.db = db; this._registry = {}; + this._dependentAssociations = {}; this.registerModels(modelsMap); } @@ -46,14 +47,19 @@ export default class Schema { ModelClass = ModelClass.extend(); // Store model & fks in registry + // TODO: don't think this is needed anymore this._registry[camelizedModelName] = this._registry[camelizedModelName] || { class: null, foreignKeys: [] }; // we may have created this key before, if another model added fks to it this._registry[camelizedModelName].class = ModelClass; + // TODO: set here, remove from model#constructor + ModelClass.prototype._schema = this; + ModelClass.prototype.modelName = modelName; // Set up associations ModelClass.prototype.hasManyAssociations = {}; // a registry of the model's hasMany associations. Key is key from model definition, value is association instance itself ModelClass.prototype.belongsToAssociations = {}; // a registry of the model's belongsTo associations. Key is key from model definition, value is association instance itself ModelClass.prototype.associationKeys = []; // ex: address.user, user.addresses - ModelClass.prototype.associationIdKeys = []; // ex: address.user_id, user.address_ids. may or may not be a fk. + ModelClass.prototype.associationIdKeys = []; // ex: address.user_id, user.address_ids + ModelClass.prototype.dependentAssociations = []; // a registry of associations that depend on this model, needed for deletion cleanup. let fksAddedFromThisModel = {}; for (let associationProperty in ModelClass.prototype) { @@ -62,6 +68,7 @@ export default class Schema { association.key = associationProperty; association.modelName = association.modelName || toModelName(associationProperty); association.ownerModelName = modelName; + association.setSchema(this); // Update the registry with this association's foreign keys. This is // essentially our "db migration", since we must know about the fks. @@ -79,7 +86,7 @@ export default class Schema { this._addForeignKeyToRegistry(fkHolder, fk); // Augment the Model's class with any methods added by this association - association.addMethodsToModelClass(ModelClass, associationProperty, this); + association.addMethodsToModelClass(ModelClass, associationProperty); } } @@ -120,6 +127,15 @@ export default class Schema { * @public */ new(type, attrs) { + + // let fk = foreignKeysHash[attr]; + // debugger; + // assert( + // !fk || this.schema.db[toCollectionName(association.modelName)].find(fk), + // `Couldn\'t find ${association.modelName} with id = ${fk}` + // ); + + // this[attr] = fk; return this._instantiateModel(dasherize(type), attrs); } @@ -157,7 +173,7 @@ export default class Schema { if (Array.isArray(ids)) { assert( records.length === ids.length, - `Couldn\'t find all ${pluralize(type)} with ids: (${ids.join(',')}) (found ${records.length} results, but was looking for ${ids.length})` + `Couldn't find all ${pluralize(type)} with ids: (${ids.join(',')}) (found ${records.length} results, but was looking for ${ids.length})` ); } @@ -202,6 +218,25 @@ export default class Schema { return this._hydrate(record, dasherize(type)); } + modelClassFor(modelName) { + return this._registry[camelize(modelName)].class.prototype; + } + + addDependentAssociation(association, modelName) { + this._dependentAssociations[modelName] = this._dependentAssociations[modelName] || []; + this._dependentAssociations[modelName].push(association); + } + + dependentAssociationsFor(modelName) { + return this._dependentAssociations[modelName]; + } + + associationsFor(modelName) { + let modelClass = this.modelClassFor(modelName); + + return Object.assign({}, modelClass.belongsToAssociations, modelClass.hasManyAssociations); + } + /* Private methods */ @@ -215,7 +250,7 @@ export default class Schema { let collection = toCollectionName(type); assert( this.db[collection], - `You\'re trying to find model(s) of type ${type} but this collection doesn\'t exist in the database.` + `You're trying to find model(s) of type ${type} but this collection doesn't exist in the database.` ); return this.db[collection]; @@ -270,6 +305,7 @@ export default class Schema { /** * Takes a record and returns a model, or an array of records * and returns a collection. + * * @method _hydrate * @param records * @param modelName diff --git a/addon/route-handlers/shorthands/delete.js b/addon/route-handlers/shorthands/delete.js index fba337b94..7eabdfaf8 100644 --- a/addon/route-handlers/shorthands/delete.js +++ b/addon/route-handlers/shorthands/delete.js @@ -25,7 +25,7 @@ export default class DeleteShorthandRouteHandler extends BaseShorthandRouteHandl /* Remove the model and child related models from the db. - This would remove the contact with id `:id`, and well + This would remove the contact with id `:id`, as well as this contact's addresses and phone numbers. Ex: this.del('/contacts/:id', ['contact', 'addresses', 'numbers'); */ diff --git a/addon/serializer.js b/addon/serializer.js index 9a296438d..ea306b20e 100644 --- a/addon/serializer.js +++ b/addon/serializer.js @@ -234,7 +234,7 @@ class Serializer { * @param model * @private */ - _attrsForModel(model, removeForeignKeys = false) { + _attrsForModel(model) { let attrs = {}; if (this.attrs) { @@ -246,9 +246,8 @@ class Serializer { attrs = _assign(attrs, model.attrs); } - if (removeForeignKeys) { - model.fks.forEach((key) => delete attrs[key]); - } + // Remove fks + model.fks.forEach(key => delete attrs[key]); return this._formatAttributeKeys(attrs); } @@ -268,6 +267,9 @@ class Serializer { if (this.isCollection(association)) { let formattedKey = this.keyForRelationshipIds(key); newHash[formattedKey] = model[key].models.map((m) => m.id); + } else if (association) { + let formattedKey = this.keyForForeignKey(key); + newHash[formattedKey] = model[key].id; } }); } else if (this.serializeIds === 'included') { @@ -276,6 +278,9 @@ class Serializer { if (this.isCollection(association)) { let formattedKey = this.keyForRelationshipIds(key); newHash[formattedKey] = model[key].models.map((m) => m.id); + } else if (association) { + let formattedKey = this.keyForForeignKey(key); + newHash[formattedKey] = model[key].id; } }); } @@ -356,6 +361,10 @@ class Serializer { return `${singularize(camelize(relationshipName))}Ids`; } + keyForForeignKey(relationshipName) { + return `${camelize(relationshipName)}Id`; + } + /** * This method is used by the POST and PUT shorthands. These shorthands * expect a valid JSON:API document as part of the request, so that diff --git a/addon/serializers/active-model-serializer.js b/addon/serializers/active-model-serializer.js index b1476634d..2469e127e 100644 --- a/addon/serializers/active-model-serializer.js +++ b/addon/serializers/active-model-serializer.js @@ -23,6 +23,10 @@ export default Serializer.extend({ return `${underscore(singularize(type))}_ids`; }, + keyForForeignKey(relationshipName) { + return `${underscore(relationshipName)}_id`; + }, + normalize(payload) { let type = Object.keys(payload)[0]; let attrs = payload[type]; diff --git a/addon/serializers/rest-serializer.js b/addon/serializers/rest-serializer.js index 9b7361e9d..dd137c5bf 100644 --- a/addon/serializers/rest-serializer.js +++ b/addon/serializers/rest-serializer.js @@ -21,5 +21,10 @@ export default ActiveModelSerializer.extend({ keyForRelationshipIds(type) { return `${camelize(singularize(type))}Ids`; + }, + + keyForForeignKey(relationshipName) { + return `${camelize(relationshipName)}Id`; } + }); diff --git a/package.json b/package.json index 6270efe27..cb8812368 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "0.2.9", + "version": "0.3.0-beta.5", "description": "A client-side HTTP server to develop, test and demo your Ember app", "directories": { "doc": "doc", diff --git a/testem.js b/testem.js index 7586db34e..15618d60b 100644 --- a/testem.js +++ b/testem.js @@ -4,9 +4,9 @@ module.exports = { "test_page": "tests/index.html?hidepassed", "disable_watching": true, "launch_in_ci": [ - "PhantomJS" + "Chrome" ], "launch_in_dev": [ - "PhantomJS" + "Chrome" ] }; diff --git a/tests/acceptance/serializers-test.js b/tests/acceptance/serializers-test.js index eff44e0b0..ecc93082d 100644 --- a/tests/acceptance/serializers-test.js +++ b/tests/acceptance/serializers-test.js @@ -21,4 +21,3 @@ test('Serializers can provide default includes', function(assert) { assert.equal(blogPostsInStore.get('length'), 3); }); }); - diff --git a/tests/dummy/mirage/fixtures/word-smiths.js b/tests/dummy/mirage/fixtures/word-smiths.js index 8e8c4dd3c..5e694af26 100644 --- a/tests/dummy/mirage/fixtures/word-smiths.js +++ b/tests/dummy/mirage/fixtures/word-smiths.js @@ -1,6 +1,7 @@ export default [ { id: 1, - name: 'Link' + name: 'Link', + blogPostIds: [1, 2, 3] } ]; diff --git a/tests/dummy/mirage/models/blog-post.js b/tests/dummy/mirage/models/blog-post.js index 3cc484b7a..6dec5c357 100644 --- a/tests/dummy/mirage/models/blog-post.js +++ b/tests/dummy/mirage/models/blog-post.js @@ -1,5 +1,7 @@ -import { Model } from 'ember-cli-mirage'; +import { Model, belongsTo } from 'ember-cli-mirage'; export default Model.extend({ + wordSmith: belongsTo() + }); diff --git a/tests/integration/factories/helpers-test.js b/tests/integration/factories/helpers-test.js index a038d05a2..46c7f683f 100644 --- a/tests/integration/factories/helpers-test.js +++ b/tests/integration/factories/helpers-test.js @@ -43,41 +43,32 @@ module('Integration | Server | Factories | helpers', { }); test('it creates associations with "association" helper combininig with traits', function(assert) { - this.server.create('post', 'withCategory'); + let post = this.server.create('post', 'withCategory'); - assert.equal(this.server.db.posts.length, 1); - assert.deepEqual( - this.server.db.posts[0], - { id: '1', title: 'Lorem ipsum', authorId: '1', kindId: '1' } - ); - assert.deepEqual( - this.server.schema.posts.find(1).author.attrs, - { id: '1', name: 'Sam' } - ); - assert.deepEqual( - this.server.schema.posts.find(1).kind.attrs, - { id: '1', name: 'awesome software' } - ); + assert.ok(post.kind); + assert.ok(post.author); - assert.equal(this.server.db.authors.length, 1); - assert.deepEqual( - this.server.db.authors[0], - { id: '1', name: 'Sam' } - ); - assert.equal(this.server.schema.authors.find(1).posts.models.length, 1); - assert.deepEqual( - this.server.schema.authors.find(1).posts.models[0].attrs, - { id: '1', title: 'Lorem ipsum', authorId: '1', kindId: '1' } - ); + let { db } = this.server; - assert.equal(this.server.db.categories.length, 1); - assert.deepEqual( - this.server.db.categories[0], - { id: '1', name: 'awesome software' } - ); - assert.equal(this.server.schema.categories.find(1).posts.models.length, 1); - assert.deepEqual( - this.server.schema.categories.find(1).posts.models[0].attrs, - { id: '1', title: 'Lorem ipsum', authorId: '1', kindId: '1' } - ); + assert.equal(db.posts.length, 1); + assert.deepEqual(db.posts[0], { + id: '1', + title: 'Lorem ipsum', + authorId: '1', + kindId: '1' + }); + + assert.equal(db.authors.length, 1); + assert.deepEqual(db.authors[0], { + id: '1', + name: 'Sam', + postIds: ['1'] + }); + + assert.equal(db.categories.length, 1); + assert.deepEqual(db.categories[0], { + id: '1', + name: 'awesome software', + postIds: ['1'] + }); }); diff --git a/tests/integration/orm/belongs-to/1-basic/_helper.js b/tests/integration/orm/belongs-to/1-basic/_helper.js new file mode 100644 index 000000000..4d27f4e57 --- /dev/null +++ b/tests/integration/orm/belongs-to/1-basic/_helper.js @@ -0,0 +1,96 @@ +import { Model, belongsTo } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +/* + A model with a belongsTo association can be in six states + with respect to its association. This helper class + returns a child (and its association) in these various states. + + The return value is an array of the form + + [ child, parent ] + + where the parent may be undefined. +*/ +export default class BelongsToHelper { + + constructor() { + this.db = new Db(); + + this.schema = new Schema(this.db, { + author: Model.extend(), + post: Model.extend({ + author: belongsTo() + }) + }); + } + + savedChildNoParent() { + let insertedPost = this.db.posts.insert({ title: 'Lorem' }); + + return [ this.schema.posts.find(insertedPost.id), undefined ]; + } + + savedChildNewParent() { + let insertedPost = this.db.posts.insert({ title: 'Lorem' }); + let post = this.schema.posts.find(insertedPost.id); + let author = this.schema.authors.new({ name: 'Bob' }); + + post.author = author; + + return [ post, author ]; + } + + savedChildSavedParent() { + let insertedAuthor = this.db.authors.insert({ name: 'Bob' }); + let insertedPost = this.db.posts.insert({ title: 'Lorem', authorId: insertedAuthor.id }); + let post = this.schema.posts.find(insertedPost.id); + let author = this.schema.authors.find(insertedAuthor.id); + + return [ post, author ]; + } + + newChildNoParent() { + return [ this.schema.posts.new({ title: 'Lorem' }), undefined ]; + } + + newChildNewParent() { + let post = this.schema.posts.new({ title: 'Lorem' }); + let newAuthor = this.schema.authors.new({ name: 'Bob' }); + post.author = newAuthor; + + return [ post, newAuthor ]; + } + + newChildSavedParent() { + let insertedAuthor = this.db.authors.insert({ name: 'Bob' }); + let post = this.schema.posts.new({ title: 'Lorem' }); + let savedAuthor = this.schema.authors.find(insertedAuthor.id); + + post.author = savedAuthor; + + return [ post, savedAuthor ]; + } + + // Just a saved unassociated parent. + savedParent() { + let insertedAuthor = this.db.authors.insert({ name: 'Bob' }); + + return this.schema.authors.find(insertedAuthor.id); + } + + newParent() { + return this.schema.authors.new({ name: 'Bob' }); + } + +} + +export const states = [ + 'savedChildNoParent', + 'savedChildNewParent', + 'savedChildSavedParent', + 'newChildNoParent', + 'newChildNewParent', + 'newChildSavedParent' +]; diff --git a/tests/integration/orm/belongs-to/1-basic/_regressions-test.js b/tests/integration/orm/belongs-to/1-basic/_regressions-test.js new file mode 100644 index 000000000..a11e2ced0 --- /dev/null +++ b/tests/integration/orm/belongs-to/1-basic/_regressions-test.js @@ -0,0 +1,27 @@ +import { Model, belongsTo } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Basic | regressions'); + +test('belongsTo accessors works when foreign key is present but falsy', function(assert) { + let db = new Db({ + posts: [ + { id: 1, authorId: 0, name: 'some post' } + ], + authors: [ + { id: 0, name: 'Foo' } + ] + }); + + let schema = new Schema(db, { + author: Model.extend(), + post: Model.extend({ + author: belongsTo() + }) + }); + + let post = schema.posts.find(1); + assert.equal(post.author.name, 'Foo'); +}); diff --git a/tests/integration/orm/belongs-to/1-basic/accessor-test.js b/tests/integration/orm/belongs-to/1-basic/accessor-test.js new file mode 100644 index 000000000..8421d0335 --- /dev/null +++ b/tests/integration/orm/belongs-to/1-basic/accessor-test.js @@ -0,0 +1,22 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Basic | accessor', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The reference to a belongs-to association is correct, for all states +*/ +states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ post, author ] = this.helper[state](); + + assert.deepEqual(post.author, author ? author : null, 'the model reference is correct'); + assert.equal(post.authorId, author ? author.id : null, 'the modelId reference is correct'); + }); + +}); diff --git a/tests/integration/orm/belongs-to/1-basic/association-create-test.js b/tests/integration/orm/belongs-to/1-basic/association-create-test.js new file mode 100644 index 000000000..73b7e2d8b --- /dev/null +++ b/tests/integration/orm/belongs-to/1-basic/association-create-test.js @@ -0,0 +1,26 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Basic | association #create', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can create a belongs-to association, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can create an associated parent`, function(assert) { + let [ post ] = this.helper[state](); + + let ganon = post.createAuthor({ name: 'Ganon' }); + + assert.ok(ganon.id, 'the parent was persisted'); + assert.deepEqual(post.author.attrs, ganon.attrs); + assert.equal(post.authorId, ganon.id); + assert.equal(this.helper.schema.posts.find(post.id).authorId, ganon.id, 'the child was persisted'); + }); + +}); diff --git a/tests/integration/orm/belongs-to/1-basic/association-new-test.js b/tests/integration/orm/belongs-to/1-basic/association-new-test.js new file mode 100644 index 000000000..db21b3c10 --- /dev/null +++ b/tests/integration/orm/belongs-to/1-basic/association-new-test.js @@ -0,0 +1,31 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Basic | association #new', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can make a new unsaved belongs-to association, for all states +*/ + +states.forEach((state) => { + + test(`a ${state} can build a new associated parent`, function(assert) { + let [ post ] = this.helper[state](); + + let ganon = post.newAuthor({ name: 'Ganon' }); + + assert.ok(!ganon.id, 'the parent was not persisted'); + assert.deepEqual(post.author, ganon); + assert.equal(post.authorId, null); + + post.save(); + + assert.ok(ganon.id, 'saving the child persists the parent'); + assert.equal(post.authorId, ganon.id, 'the childs fk was updated'); + }); + +}); diff --git a/tests/integration/orm/belongs-to/1-basic/association-set-id-test.js b/tests/integration/orm/belongs-to/1-basic/association-set-id-test.js new file mode 100644 index 000000000..f5dde0c89 --- /dev/null +++ b/tests/integration/orm/belongs-to/1-basic/association-set-id-test.js @@ -0,0 +1,41 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Basic | association #setId', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parentId, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ post ] = this.helper[state](); + let savedAuthor = this.helper.savedParent(); + + post.authorId = savedAuthor.id; + + assert.equal(post.authorId, savedAuthor.id); + assert.deepEqual(post.author.attrs, savedAuthor.attrs); + }); + +}); + +[ + 'savedChildSavedParent', + 'newChildSavedParent' +].forEach((state) => { + + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ post ] = this.helper[state](); + + post.authorId = null; + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/1-basic/association-set-test.js b/tests/integration/orm/belongs-to/1-basic/association-set-test.js new file mode 100644 index 000000000..4022e3dde --- /dev/null +++ b/tests/integration/orm/belongs-to/1-basic/association-set-test.js @@ -0,0 +1,44 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Basic | association #set', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parent, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ post ] = this.helper[state](); + let savedAuthor = this.helper.savedParent(); + + post.author = savedAuthor; + + assert.equal(post.authorId, savedAuthor.id); + assert.deepEqual(post.author, savedAuthor); + }); + + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ post ] = this.helper[state](); + let newAuthor = this.helper.newParent(); + + post.author = newAuthor; + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, newAuthor); + }); + + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ post ] = this.helper[state](); + + post.author = null; + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/1-basic/create-test.js b/tests/integration/orm/belongs-to/1-basic/create-test.js new file mode 100644 index 000000000..3facc387c --- /dev/null +++ b/tests/integration/orm/belongs-to/1-basic/create-test.js @@ -0,0 +1,60 @@ +import Helper from './_helper'; +import { Model } from 'ember-cli-mirage'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Basic | create', { + beforeEach() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + } +}); + +test('it sets up associations correctly when passing in the foreign key', function(assert) { + let author = this.helper.schema.create('author'); + let post = this.helper.schema.create('post', { + authorId: author.id + }); + + assert.equal(post.authorId, author.id); + assert.deepEqual(post.author.attrs, author.attrs); + assert.equal(this.helper.schema.db.authors.length, 1); + assert.deepEqual(this.helper.schema.db.authors[0], { id: '1' }); + assert.equal(this.helper.schema.db.posts.length, 1); + assert.deepEqual(this.helper.schema.db.posts[0], { id: '1', authorId: '1' }); +}); + +test('it sets up associations correctly when passing in the association itself', function(assert) { + let author = this.helper.schema.create('author'); + let post = this.helper.schema.create('post', { + author + }); + + assert.equal(post.authorId, author.id); + assert.deepEqual(post.author.attrs, author.attrs); + assert.equal(this.helper.schema.db.authors.length, 1); + assert.deepEqual(this.helper.schema.db.authors[0], { id: '1' }); + assert.equal(this.helper.schema.db.posts.length, 1); + assert.deepEqual(this.helper.schema.db.posts[0], { id: '1', authorId: '1' }); +}); + +test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('post', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); + + assert.throws(function() { + schema.create('post', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); +}); diff --git a/tests/integration/orm/belongs-to/1-basic/delete-test.js b/tests/integration/orm/belongs-to/1-basic/delete-test.js new file mode 100644 index 000000000..d58a4e1f9 --- /dev/null +++ b/tests/integration/orm/belongs-to/1-basic/delete-test.js @@ -0,0 +1,24 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Basic | delete', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ post, author ] = this.helper[state](); + + if (author) { + author.destroy(); + post.reload(); + } + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/1-basic/instantiating-test.js b/tests/integration/orm/belongs-to/1-basic/instantiating-test.js new file mode 100644 index 000000000..225a3d639 --- /dev/null +++ b/tests/integration/orm/belongs-to/1-basic/instantiating-test.js @@ -0,0 +1,82 @@ +import Helper from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Basic | instantiating', { + beforeEach() { + this.helper = new Helper(); + this.schema = this.helper.schema; + } +}); + +test('the child accepts a saved parent id', function(assert) { + let author = this.helper.savedParent(); + let post = this.schema.posts.new({ authorId: author.id }); + + assert.equal(post.authorId, author.id); + assert.deepEqual(post.author, author); + assert.deepEqual(post.attrs, { authorId: author.id }); +}); + +test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.posts.new({ authorId: 2 }); + }, /You're instantiating a post that has a authorId of 2, but that record doesn't exist in the database/); +}); + +test('the child accepts a null parent id', function(assert) { + let post = this.schema.posts.new({ authorId: null }); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + assert.deepEqual(post.attrs, { authorId: null }); +}); + +test('the child accepts a saved parent model', function(assert) { + let author = this.helper.savedParent(); + let post = this.schema.posts.new({ author }); + + assert.equal(post.authorId, 1); + assert.deepEqual(post.author, author); +}); + +test('the child accepts a new parent model', function(assert) { + let zelda = this.schema.authors.new({ name: 'Zelda' }); + let post = this.schema.posts.new({ author: zelda }); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, zelda); + assert.deepEqual(post.attrs, { authorId: null }); +}); + +test('the child accepts a null parent model', function(assert) { + let post = this.schema.posts.new({ author: null }); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + assert.deepEqual(post.attrs, { authorId: null }); +}); + +test('the child accepts a parent model and id', function(assert) { + let author = this.helper.savedParent(); + let post = this.schema.posts.new({ author, authorId: author.id }); + + assert.equal(post.authorId, '1'); + assert.deepEqual(post.author, author); + assert.deepEqual(post.attrs, { authorId: author.id }); +}); + +test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let post = this.schema.posts.new({}); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + assert.deepEqual(post.attrs, { authorId: null }); +}); + +test('the child accepts no reference to a parent id or model', function(assert) { + let post = this.schema.posts.new(); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + assert.deepEqual(post.attrs, { authorId: null }); +}); diff --git a/tests/integration/orm/belongs-to/2-named/_helper.js b/tests/integration/orm/belongs-to/2-named/_helper.js new file mode 100644 index 000000000..332999e6e --- /dev/null +++ b/tests/integration/orm/belongs-to/2-named/_helper.js @@ -0,0 +1,96 @@ +import { Model, belongsTo } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +/* + A model with a belongsTo association can be in six states + with respect to its association. This helper class + returns a child (and its association) in these various states. + + The return value is an array of the form + + [ child, parent ] + + where the parent may be undefined. +*/ +export default class BelongsToHelper { + + constructor() { + this.db = new Db(); + + this.schema = new Schema(this.db, { + user: Model.extend(), + post: Model.extend({ + author: belongsTo('user') + }) + }); + } + + savedChildNoParent() { + let insertedPost = this.db.posts.insert({ title: 'Lorem' }); + + return [ this.schema.posts.find(insertedPost.id), undefined ]; + } + + savedChildNewParent() { + let insertedPost = this.db.posts.insert({ title: 'Lorem' }); + let post = this.schema.posts.find(insertedPost.id); + let author = this.schema.users.new({ name: 'Bob' }); + + post.author = author; + + return [ post, author ]; + } + + savedChildSavedParent() { + let insertedAuthor = this.db.users.insert({ name: 'Bob' }); + let insertedPost = this.db.posts.insert({ title: 'Lorem', authorId: insertedAuthor.id }); + let post = this.schema.posts.find(insertedPost.id); + let author = this.schema.users.find(insertedAuthor.id); + + return [ post, author ]; + } + + newChildNoParent() { + return [ this.schema.posts.new({ title: 'Lorem' }), undefined ]; + } + + newChildNewParent() { + let post = this.schema.posts.new({ title: 'Lorem' }); + let newAuthor = this.schema.users.new({ name: 'Bob' }); + post.author = newAuthor; + + return [ post, newAuthor ]; + } + + newChildSavedParent() { + let insertedAuthor = this.db.users.insert({ name: 'Bob' }); + let post = this.schema.posts.new({ title: 'Lorem' }); + let savedAuthor = this.schema.users.find(insertedAuthor.id); + + post.author = savedAuthor; + + return [ post, savedAuthor ]; + } + + // Just a saved unassociated parent. + savedParent() { + let insertedAuthor = this.db.users.insert({ name: 'Bob' }); + + return this.schema.users.find(insertedAuthor.id); + } + + newParent() { + return this.schema.users.new({ name: 'Bob' }); + } + +} + +export const states = [ + 'savedChildNoParent', + 'savedChildNewParent', + 'savedChildSavedParent', + 'newChildNoParent', + 'newChildNewParent', + 'newChildSavedParent' +]; diff --git a/tests/integration/orm/belongs-to/2-named/accessor-test.js b/tests/integration/orm/belongs-to/2-named/accessor-test.js new file mode 100644 index 000000000..9b243357c --- /dev/null +++ b/tests/integration/orm/belongs-to/2-named/accessor-test.js @@ -0,0 +1,22 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named | accessor', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The reference to a belongs-to association is correct, for all states +*/ +states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ post, author ] = this.helper[state](); + + assert.deepEqual(post.author, author ? author : null, 'the model reference is correct'); + assert.equal(post.authorId, author ? author.id : null, 'the modelId reference is correct'); + }); + +}); diff --git a/tests/integration/orm/belongs-to/2-named/association-create-test.js b/tests/integration/orm/belongs-to/2-named/association-create-test.js new file mode 100644 index 000000000..e1ce09a5a --- /dev/null +++ b/tests/integration/orm/belongs-to/2-named/association-create-test.js @@ -0,0 +1,26 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named | association #create', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can create a belongs-to association, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can create an associated parent`, function(assert) { + let [ post ] = this.helper[state](); + + let ganon = post.createAuthor({ name: 'Ganon' }); + + assert.ok(ganon.id, 'the parent was persisted'); + assert.deepEqual(post.author, ganon); + assert.equal(post.authorId, ganon.id); + assert.equal(this.helper.schema.posts.find(post.id).authorId, ganon.id, 'the child was persisted'); + }); + +}); diff --git a/tests/integration/orm/belongs-to/2-named/association-new-test.js b/tests/integration/orm/belongs-to/2-named/association-new-test.js new file mode 100644 index 000000000..b60ac2da9 --- /dev/null +++ b/tests/integration/orm/belongs-to/2-named/association-new-test.js @@ -0,0 +1,31 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named | association #new', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can make a new unsaved belongs-to association, for all states +*/ + +states.forEach((state) => { + + test(`a ${state} can build a new associated parent`, function(assert) { + let [ post ] = this.helper[state](); + + let ganon = post.newAuthor({ name: 'Ganon' }); + + assert.ok(!ganon.id, 'the parent was not persisted'); + assert.deepEqual(post.author, ganon); + assert.equal(post.authorId, null); + + post.save(); + + assert.ok(ganon.id, 'saving the child persists the parent'); + assert.equal(post.authorId, ganon.id, 'the childs fk was updated'); + }); + +}); diff --git a/tests/integration/orm/belongs-to/2-named/association-set-id-test.js b/tests/integration/orm/belongs-to/2-named/association-set-id-test.js new file mode 100644 index 000000000..9fefaeb54 --- /dev/null +++ b/tests/integration/orm/belongs-to/2-named/association-set-id-test.js @@ -0,0 +1,41 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named | association #setId', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parentId, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ post ] = this.helper[state](); + let savedAuthor = this.helper.savedParent(); + + post.authorId = savedAuthor.id; + + assert.equal(post.authorId, savedAuthor.id); + assert.deepEqual(post.author, savedAuthor); + }); + +}); + +[ + 'savedChildSavedParent', + 'newChildSavedParent' +].forEach((state) => { + + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ post ] = this.helper[state](); + + post.authorId = null; + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/2-named/association-set-test.js b/tests/integration/orm/belongs-to/2-named/association-set-test.js new file mode 100644 index 000000000..bdf584a56 --- /dev/null +++ b/tests/integration/orm/belongs-to/2-named/association-set-test.js @@ -0,0 +1,44 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named | association #set', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parent, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ post ] = this.helper[state](); + let savedAuthor = this.helper.savedParent(); + + post.author = savedAuthor; + + assert.equal(post.authorId, savedAuthor.id); + assert.deepEqual(post.author, savedAuthor); + }); + + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ post ] = this.helper[state](); + let newAuthor = this.helper.newParent(); + + post.author = newAuthor; + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, newAuthor); + }); + + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ post ] = this.helper[state](); + + post.author = null; + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/2-named/create-test.js b/tests/integration/orm/belongs-to/2-named/create-test.js new file mode 100644 index 000000000..0b37c31fb --- /dev/null +++ b/tests/integration/orm/belongs-to/2-named/create-test.js @@ -0,0 +1,60 @@ +import Helper from './_helper'; +import { Model } from 'ember-cli-mirage'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named | create', { + beforeEach() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + } +}); + +test('it sets up associations correctly when passing in the foreign key', function(assert) { + let author = this.helper.schema.create('user'); + let post = this.helper.schema.create('post', { + authorId: author.id + }); + + assert.equal(post.authorId, author.id); + assert.deepEqual(post.author.attrs, author.attrs); + assert.equal(this.helper.schema.db.users.length, 1); + assert.deepEqual(this.helper.schema.db.users[0], { id: '1' }); + assert.equal(this.helper.schema.db.posts.length, 1); + assert.deepEqual(this.helper.schema.db.posts[0], { id: '1', authorId: '1' }); +}); + +test('it sets up associations correctly when passing in the association itself', function(assert) { + let author = this.helper.schema.create('user'); + let post = this.helper.schema.create('post', { + author + }); + + assert.equal(post.authorId, author.id); + assert.deepEqual(post.author.attrs, author.attrs); + assert.equal(this.helper.schema.db.users.length, 1); + assert.deepEqual(this.helper.schema.db.users[0], { id: '1' }); + assert.equal(this.helper.schema.db.posts.length, 1); + assert.deepEqual(this.helper.schema.db.posts[0], { id: '1', authorId: '1' }); +}); + +test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('post', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); + + assert.throws(function() { + schema.create('post', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); +}); diff --git a/tests/integration/orm/belongs-to/2-named/delete-test.js b/tests/integration/orm/belongs-to/2-named/delete-test.js new file mode 100644 index 000000000..7cabadbfa --- /dev/null +++ b/tests/integration/orm/belongs-to/2-named/delete-test.js @@ -0,0 +1,24 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named | delete', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ post, user ] = this.helper[state](); + + if (user) { + user.destroy(); + post.reload(); + } + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/2-named/instantiating-test.js b/tests/integration/orm/belongs-to/2-named/instantiating-test.js new file mode 100644 index 000000000..34ee3466d --- /dev/null +++ b/tests/integration/orm/belongs-to/2-named/instantiating-test.js @@ -0,0 +1,82 @@ +import Helper from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named | instantiating', { + beforeEach() { + this.helper = new Helper(); + this.schema = this.helper.schema; + } +}); + +test('the child accepts a saved parent id', function(assert) { + let author = this.helper.savedParent(); + let post = this.schema.posts.new({ authorId: author.id }); + + assert.equal(post.authorId, author.id); + assert.deepEqual(post.author, author); + assert.deepEqual(post.attrs, { authorId: author.id }); +}); + +test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.posts.new({ authorId: 2 }); + }, /You're instantiating a post that has a authorId of 2, but that record doesn't exist in the database/); +}); + +test('the child accepts a null parent id', function(assert) { + let post = this.schema.posts.new({ authorId: null }); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + assert.deepEqual(post.attrs, { authorId: null }); +}); + +test('the child accepts a saved parent model', function(assert) { + let author = this.helper.savedParent(); + let post = this.schema.posts.new({ author }); + + assert.equal(post.authorId, 1); + assert.deepEqual(post.author, author); +}); + +test('the child accepts a new parent model', function(assert) { + let zelda = this.schema.users.new({ name: 'Zelda' }); + let post = this.schema.posts.new({ author: zelda }); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, zelda); + assert.deepEqual(post.attrs, { authorId: null }); +}); + +test('the child accepts a null parent model', function(assert) { + let post = this.schema.posts.new({ author: null }); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + assert.deepEqual(post.attrs, { authorId: null }); +}); + +test('the child accepts a parent model and id', function(assert) { + let author = this.helper.savedParent(); + let post = this.schema.posts.new({ author, authorId: author.id }); + + assert.equal(post.authorId, '1'); + assert.deepEqual(post.author, author); + assert.deepEqual(post.attrs, { authorId: author.id }); +}); + +test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let post = this.schema.posts.new({}); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + assert.deepEqual(post.attrs, { authorId: null }); +}); + +test('the child accepts no reference to a parent id or model', function(assert) { + let post = this.schema.posts.new(); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + assert.deepEqual(post.attrs, { authorId: null }); +}); diff --git a/tests/integration/orm/belongs-to/3-reflexive/_helper.js b/tests/integration/orm/belongs-to/3-reflexive/_helper.js new file mode 100644 index 000000000..9d0c00fd1 --- /dev/null +++ b/tests/integration/orm/belongs-to/3-reflexive/_helper.js @@ -0,0 +1,95 @@ +import { Model, belongsTo } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +/* + A model with a belongsTo association can be in six states + with respect to its association. This helper class + returns a child (and its association) in these various states. + + The return value is an array of the form + + [ child, parent ] + + where the parent may be undefined. +*/ +export default class BelongsToHelper { + + constructor() { + this.db = new Db(); + + this.schema = new Schema(this.db, { + user: Model.extend({ + user: belongsTo() // implicit inverse + }) + }); + } + + savedChildNoParent() { + let insertedUser = this.db.users.insert({ name: 'Link' }); + + return [ this.schema.users.find(insertedUser.id), undefined ]; + } + + savedChildNewParent() { + let user = this.schema.users.create({ name: 'Link' }); + let friend = this.schema.users.new({ name: 'Bob' }); + + user.user = friend; + + return [ user, friend ]; + } + + savedChildSavedParent() { + let insertedFriend = this.db.users.insert({ name: 'Bob' }); + let insertedUser = this.db.users.insert({ name: 'Link', userId: insertedFriend.id }); + this.db.users.update(insertedFriend.id, { userId: insertedUser.id }); + let user = this.schema.users.find(insertedUser.id); + let friend = this.schema.users.find(insertedFriend.id); + + return [ user, friend ]; + } + + newChildNoParent() { + return [ this.schema.users.new({ name: 'Link' }), undefined ]; + } + + newChildNewParent() { + let friend = this.schema.users.new({ name: 'Link' }); + let user = this.schema.users.new({ name: 'Bob' }); + user.user = friend; + + return [ user, friend ]; + } + + newChildSavedParent() { + let insertedFriend = this.db.users.insert({ name: 'Bob' }); + let user = this.schema.users.new({ name: 'Link' }); + let savedFriend = this.schema.users.find(insertedFriend.id); + + user.user = savedFriend; + + return [ user, savedFriend ]; + } + + // Just a saved unassociated parent. + savedParent() { + let insertedParent = this.db.users.insert({ name: 'Bob' }); + + return this.schema.users.find(insertedParent.id); + } + + newParent() { + return this.schema.users.new({ name: 'Bob' }); + } + +} + +export const states = [ + 'savedChildNoParent', + 'savedChildNewParent', + 'savedChildSavedParent', + 'newChildNoParent', + 'newChildNewParent', + 'newChildSavedParent' +]; diff --git a/tests/integration/orm/belongs-to/3-reflexive/accessor-test.js b/tests/integration/orm/belongs-to/3-reflexive/accessor-test.js new file mode 100644 index 000000000..795be482e --- /dev/null +++ b/tests/integration/orm/belongs-to/3-reflexive/accessor-test.js @@ -0,0 +1,34 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Reflexive | accessor', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The reference to a belongs-to association is correct, for all states +*/ +states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ user, friend ] = this.helper[state](); + + // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison + if (friend) { + assert.deepEqual(user.user.attrs, friend.attrs, 'the model reference is correct'); + assert.equal(user.userId, friend.id, 'the modelId reference is correct'); + } else { + assert.deepEqual(user.user, null, 'the model reference is correct'); + assert.equal(user.userId, null, 'the modelId reference is correct'); + } + + // If there's a friend in this state, make sure the inverse association is correct + if (friend) { + assert.deepEqual(friend.user.attrs, user.attrs, 'the inverse model reference is correct'); + assert.equal(friend.userId, user.id, 'the inverse modelId reference is correct'); + } + }); + +}); diff --git a/tests/integration/orm/belongs-to/3-reflexive/association-create-test.js b/tests/integration/orm/belongs-to/3-reflexive/association-create-test.js new file mode 100644 index 000000000..5e6dfb3ba --- /dev/null +++ b/tests/integration/orm/belongs-to/3-reflexive/association-create-test.js @@ -0,0 +1,33 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Reflexive | association #create', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can create a belongs-to association, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can create an associated parent`, function(assert) { + let [ user, originalUser ] = this.helper[state](); + + let ganon = user.createUser({ name: 'Ganon' }); + + assert.ok(ganon.id, 'the parent was persisted'); + assert.deepEqual(user.user.attrs, ganon.attrs); + assert.deepEqual(ganon.user.attrs, user.attrs, 'the inverse was set'); + assert.equal(user.userId, ganon.id); + assert.equal(ganon.userId, user.id, 'the inverse was set'); + assert.equal(this.helper.schema.users.find(user.id).userId, ganon.id, 'the user was persisted'); + + if (originalUser) { + originalUser.reload(); + assert.equal(originalUser.userId, null, 'old inverses were cleared out'); + } + }); + +}); diff --git a/tests/integration/orm/belongs-to/3-reflexive/association-new-test.js b/tests/integration/orm/belongs-to/3-reflexive/association-new-test.js new file mode 100644 index 000000000..831bf3e56 --- /dev/null +++ b/tests/integration/orm/belongs-to/3-reflexive/association-new-test.js @@ -0,0 +1,37 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Reflexive | association #new', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can make a new unsaved belongs-to association, for all states +*/ + +states.forEach((state) => { + + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user, originalUser ] = this.helper[state](); + + let ganon = user.newUser({ name: 'Ganon' }); + + assert.ok(!ganon.id, 'the parent was not persisted'); + assert.deepEqual(user.user, ganon); + assert.equal(user.userId, null); + assert.deepEqual(ganon.user, user, 'the inverse was set'); + + user.save(); + + assert.ok(ganon.id, 'saving the child persists the parent'); + assert.equal(user.userId, ganon.id, 'the childs fk was updated'); + + if (originalUser) { + originalUser.reload(); + assert.equal(originalUser.userId, null, 'old inverses were cleared out'); + } + }); + +}); diff --git a/tests/integration/orm/belongs-to/3-reflexive/association-set-id-test.js b/tests/integration/orm/belongs-to/3-reflexive/association-set-id-test.js new file mode 100644 index 000000000..4dc63e22f --- /dev/null +++ b/tests/integration/orm/belongs-to/3-reflexive/association-set-id-test.js @@ -0,0 +1,53 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Reflexive | association #setId', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parentId, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user, originalUser ] = this.helper[state](); + let friend = this.helper.savedParent(); + + user.userId = friend.id; + + assert.equal(user.userId, friend.id); + assert.deepEqual(user.user.attrs, friend.attrs); + + user.save(); + if (originalUser) { + originalUser.reload(); + assert.equal(originalUser.userId, null, 'old inverses were cleared out'); + } + }); + +}); + +[ + 'savedChildSavedParent', + 'newChildSavedParent' +].forEach((state) => { + + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ user, originalUser ] = this.helper[state](); + + user.userId = null; + + assert.equal(user.userId, null); + assert.equal(user.user, null); + + user.save(); + if (originalUser) { + originalUser.reload(); + assert.equal(originalUser.userId, null, 'old inverses were cleared out'); + } + }); + +}); diff --git a/tests/integration/orm/belongs-to/3-reflexive/association-set-test.js b/tests/integration/orm/belongs-to/3-reflexive/association-set-test.js new file mode 100644 index 000000000..b253781db --- /dev/null +++ b/tests/integration/orm/belongs-to/3-reflexive/association-set-test.js @@ -0,0 +1,62 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Reflexive | association #set', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parent, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ user, originalUser ] = this.helper[state](); + let friend = this.helper.savedParent(); + + user.user = friend; + + assert.equal(user.userId, friend.id); + assert.deepEqual(user.user.attrs, friend.attrs); + + user.save(); + if (originalUser) { + originalUser.reload(); + assert.equal(originalUser.userId, null, 'old inverses were cleared out'); + } + }); + + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user, originalUser ] = this.helper[state](); + let friend = this.helper.newParent(); + + user.user = friend; + + assert.equal(user.userId, null); + assert.deepEqual(user.user.attrs, friend.attrs); + + user.save(); + if (originalUser) { + originalUser.reload(); + assert.equal(originalUser.userId, null, 'old inverses were cleared out'); + } + }); + + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ user, originalUser ] = this.helper[state](); + + user.user = null; + + assert.equal(user.userId, null); + assert.deepEqual(user.user, null); + + user.save(); + if (originalUser) { + originalUser.reload(); + assert.equal(originalUser.userId, null, 'old inverses were cleared out'); + } + }); + +}); diff --git a/tests/integration/orm/belongs-to/3-reflexive/create-test.js b/tests/integration/orm/belongs-to/3-reflexive/create-test.js new file mode 100644 index 000000000..72619a78a --- /dev/null +++ b/tests/integration/orm/belongs-to/3-reflexive/create-test.js @@ -0,0 +1,62 @@ +import Helper from './_helper'; +import { Model } from 'ember-cli-mirage'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Reflexive | create', { + beforeEach() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + } +}); + +test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let friend = schema.create('user'); + let user = schema.create('user', { + userId: friend.id + }); + + friend.reload(); + + assert.equal(user.userId, friend.id); + assert.deepEqual(user.user.attrs, friend.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', userId: '2' }); + assert.deepEqual(schema.db.users[1], { id: '2', userId: '1' }); +}); + +test('it sets up associations correctly when passing in the association itself', function(assert) { + let { schema } = this.helper; + let friend = schema.create('user'); + let user = schema.create('user', { + user: friend + }); + + assert.equal(user.userId, friend.id); + assert.deepEqual(user.user.attrs, friend.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', userId: '2' }); + assert.deepEqual(schema.db.users[1], { id: '2', userId: '1' }); +}); + +test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('user', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); + + assert.throws(function() { + schema.create('user', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); +}); diff --git a/tests/integration/orm/belongs-to/3-reflexive/delete-test.js b/tests/integration/orm/belongs-to/3-reflexive/delete-test.js new file mode 100644 index 000000000..956f4552b --- /dev/null +++ b/tests/integration/orm/belongs-to/3-reflexive/delete-test.js @@ -0,0 +1,24 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Reflexive | delete', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ user, targetUser ] = this.helper[state](); + + if (targetUser) { + targetUser.destroy(); + user.reload(); + } + + assert.equal(user.userId, null); + assert.deepEqual(user.user, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/3-reflexive/instantiating-test.js b/tests/integration/orm/belongs-to/3-reflexive/instantiating-test.js new file mode 100644 index 000000000..827feee3d --- /dev/null +++ b/tests/integration/orm/belongs-to/3-reflexive/instantiating-test.js @@ -0,0 +1,83 @@ +import Helper from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Reflexive | instantiating', { + beforeEach() { + this.helper = new Helper(); + this.schema = this.helper.schema; + } +}); + +test('the child accepts a saved parent id', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ userId: friend.id }); + + assert.equal(user.userId, friend.id); + assert.deepEqual(user.user.attrs, friend.attrs); + assert.deepEqual(user.attrs, { userId: friend.id }); +}); + +test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ userId: 2 }); + }, /You're instantiating a user that has a userId of 2, but that record doesn't exist in the database/); +}); + +test('the child accepts a null parent id', function(assert) { + let user = this.schema.users.new({ userId: null }); + + assert.equal(user.userId, null); + assert.equal(user.user, null); + assert.deepEqual(user.attrs, { userId: null }); +}); + +test('the child accepts a saved parent model', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ user: friend }); + + assert.equal(user.userId, 1); + assert.deepEqual(user.user.attrs, friend.attrs); + assert.deepEqual(user.attrs, { userId: null }); // this would update when saved +}); + +test('the child accepts a new parent model', function(assert) { + let zelda = this.schema.users.new({ name: 'Zelda' }); + let user = this.schema.users.new({ user: zelda }); + + assert.equal(user.userId, null); + assert.deepEqual(user.user, zelda); + assert.deepEqual(user.attrs, { userId: null }); +}); + +test('the child accepts a null parent model', function(assert) { + let user = this.schema.users.new({ user: null }); + + assert.equal(user.userId, null); + assert.deepEqual(user.user, null); + assert.deepEqual(user.attrs, { userId: null }); +}); + +test('the child accepts a parent model and id', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ user: friend, userId: friend.id }); + + assert.equal(user.userId, '1'); + assert.deepEqual(user.user, friend); + assert.deepEqual(user.attrs, { userId: friend.id }); +}); + +test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let user = this.schema.users.new({}); + + assert.equal(user.userId, null); + assert.deepEqual(user.user, null); + assert.deepEqual(user.attrs, { userId: null }); +}); + +test('the child accepts no reference to a parent id or model', function(assert) { + let user = this.schema.users.new(); + + assert.equal(user.userId, null); + assert.deepEqual(user.user, null); + assert.deepEqual(user.attrs, { userId: null }); +}); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/_helper.js b/tests/integration/orm/belongs-to/4-named-reflexive/_helper.js new file mode 100644 index 000000000..54a5b1017 --- /dev/null +++ b/tests/integration/orm/belongs-to/4-named-reflexive/_helper.js @@ -0,0 +1,95 @@ +import { Model, belongsTo } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +/* + A model with a belongsTo association can be in six states + with respect to its association. This helper class + returns a child (and its association) in these various states. + + The return value is an array of the form + + [ child, parent ] + + where the parent may be undefined. +*/ +export default class BelongsToHelper { + + constructor() { + this.db = new Db(); + + this.schema = new Schema(this.db, { + user: Model.extend({ + bestFriend: belongsTo('user') // implicit inverse + }) + }); + } + + savedChildNoParent() { + let insertedUser = this.db.users.insert({ name: 'Link' }); + + return [ this.schema.users.find(insertedUser.id), undefined ]; + } + + savedChildNewParent() { + let user = this.schema.users.create({ name: 'Link' }); + let friend = this.schema.users.new({ name: 'Bob' }); + + user.bestFriend = friend; + + return [ user, friend ]; + } + + savedChildSavedParent() { + let insertedFriend = this.db.users.insert({ name: 'Bob' }); + let insertedUser = this.db.users.insert({ name: 'Link', bestFriendId: insertedFriend.id }); + this.db.users.update(insertedFriend.id, { bestFriendId: insertedUser.id }); + let user = this.schema.users.find(insertedUser.id); + let friend = this.schema.users.find(insertedFriend.id); + + return [ user, friend ]; + } + + newChildNoParent() { + return [ this.schema.users.new({ name: 'Link' }), undefined ]; + } + + newChildNewParent() { + let friend = this.schema.users.new({ name: 'Link' }); + let user = this.schema.users.new({ name: 'Bob' }); + user.bestFriend = friend; + + return [ user, friend ]; + } + + newChildSavedParent() { + let insertedFriend = this.db.users.insert({ name: 'Bob' }); + let user = this.schema.users.new({ name: 'Link' }); + let savedFriend = this.schema.users.find(insertedFriend.id); + + user.bestFriend = savedFriend; + + return [ user, savedFriend ]; + } + + // Just a saved unassociated parent. + savedParent() { + let insertedParent = this.db.users.insert({ name: 'Bob' }); + + return this.schema.users.find(insertedParent.id); + } + + newParent() { + return this.schema.users.new({ name: 'Bob' }); + } + +} + +export const states = [ + 'savedChildNoParent', + 'savedChildNewParent', + 'savedChildSavedParent', + 'newChildNoParent', + 'newChildNewParent', + 'newChildSavedParent' +]; diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/accessor-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/accessor-test.js new file mode 100644 index 000000000..fbc65b1ff --- /dev/null +++ b/tests/integration/orm/belongs-to/4-named-reflexive/accessor-test.js @@ -0,0 +1,34 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named Reflexive | accessor', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The reference to a belongs-to association is correct, for all states +*/ +states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ user, friend ] = this.helper[state](); + + // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison + if (friend) { + assert.deepEqual(user.bestFriend.attrs, friend.attrs, 'the model reference is correct'); + assert.equal(user.bestFriendId, friend.id, 'the modelId reference is correct'); + } else { + assert.deepEqual(user.bestFriend, null, 'the model reference is correct'); + assert.equal(user.bestFriendId, null, 'the modelId reference is correct'); + } + + // If there's a friend in this state, make sure the inverse association is correct + if (friend) { + assert.deepEqual(friend.bestFriend.attrs, user.attrs, 'the inverse model reference is correct'); + assert.equal(friend.bestFriendId, user.id, 'the inverse modelId reference is correct'); + } + }); + +}); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/association-create-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/association-create-test.js new file mode 100644 index 000000000..51c371665 --- /dev/null +++ b/tests/integration/orm/belongs-to/4-named-reflexive/association-create-test.js @@ -0,0 +1,26 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named Reflexive | association #create', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can create a belongs-to association, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); + + let ganon = user.createBestFriend({ name: 'Ganon' }); + + assert.ok(ganon.id, 'the parent was persisted'); + assert.deepEqual(user.bestFriend.attrs, ganon.attrs); + assert.equal(user.bestFriendId, ganon.id); + assert.equal(this.helper.schema.users.find(user.id).bestFriendId, ganon.id, 'the user was persisted'); + }); + +}); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/association-new-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/association-new-test.js new file mode 100644 index 000000000..0a23352d4 --- /dev/null +++ b/tests/integration/orm/belongs-to/4-named-reflexive/association-new-test.js @@ -0,0 +1,31 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named Reflexive | association #new', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can make a new unsaved belongs-to association, for all states +*/ + +states.forEach((state) => { + + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); + + let ganon = user.newBestFriend({ name: 'Ganon' }); + + assert.ok(!ganon.id, 'the parent was not persisted'); + assert.deepEqual(user.bestFriend, ganon); + assert.equal(user.bestFriendId, null); + + user.save(); + + assert.ok(ganon.id, 'saving the child persists the parent'); + assert.equal(user.bestFriendId, ganon.id, 'the childs fk was updated'); + }); + +}); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/association-set-id-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/association-set-id-test.js new file mode 100644 index 000000000..c7aad9218 --- /dev/null +++ b/tests/integration/orm/belongs-to/4-named-reflexive/association-set-id-test.js @@ -0,0 +1,41 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named Reflexive | association #setId', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parentId, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user ] = this.helper[state](); + let friend = this.helper.savedParent(); + + user.bestFriendId = friend.id; + + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + }); + +}); + +[ + 'savedChildSavedParent', + 'newChildSavedParent' +].forEach((state) => { + + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ user ] = this.helper[state](); + + user.bestFriendId = null; + + assert.equal(user.bestFriendId, null); + assert.equal(user.bestFriend, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/association-set-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/association-set-test.js new file mode 100644 index 000000000..dba45bc5e --- /dev/null +++ b/tests/integration/orm/belongs-to/4-named-reflexive/association-set-test.js @@ -0,0 +1,44 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named Reflexive | association #set', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parent, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ user ] = this.helper[state](); + let friend = this.helper.savedParent(); + + user.bestFriend = friend; + + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + }); + + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user ] = this.helper[state](); + let friend = this.helper.newParent(); + + user.bestFriend = friend; + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + }); + + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ user ] = this.helper[state](); + + user.bestFriend = null; + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/create-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/create-test.js new file mode 100644 index 000000000..e36b1e15e --- /dev/null +++ b/tests/integration/orm/belongs-to/4-named-reflexive/create-test.js @@ -0,0 +1,62 @@ +import Helper from './_helper'; +import { Model } from 'ember-cli-mirage'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named Reflexive | create', { + beforeEach() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + } +}); + +test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let friend = schema.create('user'); + let user = schema.create('user', { + bestFriendId: friend.id + }); + + friend.reload(); + + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', bestFriendId: '2' }); + assert.deepEqual(schema.db.users[1], { id: '2', bestFriendId: '1' }); +}); + +test('it sets up associations correctly when passing in the association itself', function(assert) { + let { schema } = this.helper; + let friend = schema.create('user'); + let user = schema.create('user', { + bestFriend: friend + }); + + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', bestFriendId: '2' }); + assert.deepEqual(schema.db.users[1], { id: '2', bestFriendId: '1' }); +}); + +test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('user', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); + + assert.throws(function() { + schema.create('user', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); +}); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/delete-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/delete-test.js new file mode 100644 index 000000000..9e4d00cf0 --- /dev/null +++ b/tests/integration/orm/belongs-to/4-named-reflexive/delete-test.js @@ -0,0 +1,24 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named Reflexive | delete', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ user, bestFriend ] = this.helper[state](); + + if (bestFriend) { + bestFriend.destroy(); + user.reload(); + } + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/instantiating-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/instantiating-test.js new file mode 100644 index 000000000..a8e591108 --- /dev/null +++ b/tests/integration/orm/belongs-to/4-named-reflexive/instantiating-test.js @@ -0,0 +1,83 @@ +import Helper from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named Reflexive | instantiating', { + beforeEach() { + this.helper = new Helper(); + this.schema = this.helper.schema; + } +}); + +test('the child accepts a saved parent id', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ bestFriendId: friend.id }); + + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + assert.deepEqual(user.attrs, { bestFriendId: friend.id }); +}); + +test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ bestFriendId: 2 }); + }, /You're instantiating a user that has a bestFriendId of 2, but that record doesn't exist in the database/); +}); + +test('the child accepts a null parent id', function(assert) { + let user = this.schema.users.new({ bestFriendId: null }); + + assert.equal(user.bestFriendId, null); + assert.equal(user.bestFriend, null); + assert.deepEqual(user.attrs, { bestFriendId: null }); +}); + +test('the child accepts a saved parent model', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ bestFriend: friend }); + + assert.equal(user.bestFriendId, 1); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + assert.deepEqual(user.attrs, { bestFriendId: null }); // this would update when saved +}); + +test('the child accepts a new parent model', function(assert) { + let zelda = this.schema.users.new({ name: 'Zelda' }); + let user = this.schema.users.new({ bestFriend: zelda }); + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, zelda); + assert.deepEqual(user.attrs, { bestFriendId: null }); +}); + +test('the child accepts a null parent model', function(assert) { + let user = this.schema.users.new({ bestFriend: null }); + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + assert.deepEqual(user.attrs, { bestFriendId: null }); +}); + +test('the child accepts a parent model and id', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ bestFriend: friend, bestFriendId: friend.id }); + + assert.equal(user.bestFriendId, '1'); + assert.deepEqual(user.bestFriend, friend); + assert.deepEqual(user.attrs, { bestFriendId: friend.id }); +}); + +test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let user = this.schema.users.new({}); + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + assert.deepEqual(user.attrs, { bestFriendId: null }); +}); + +test('the child accepts no reference to a parent id or model', function(assert) { + let user = this.schema.users.new(); + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + assert.deepEqual(user.attrs, { bestFriendId: null }); +}); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/_helper.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/_helper.js new file mode 100644 index 000000000..1f3f25bb7 --- /dev/null +++ b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/_helper.js @@ -0,0 +1,95 @@ +import { Model, belongsTo } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +/* + A model with a belongsTo association can be in six states + with respect to its association. This helper class + returns a child (and its association) in these various states. + + The return value is an array of the form + + [ child, parent ] + + where the parent may be undefined. +*/ +export default class BelongsToHelper { + + constructor() { + this.db = new Db(); + + this.schema = new Schema(this.db, { + user: Model.extend({ + bestFriend: belongsTo('user', { inverse: 'bestFriend' }) + }) + }); + } + + savedChildNoParent() { + let insertedUser = this.db.users.insert({ name: 'Link' }); + + return [ this.schema.users.find(insertedUser.id), undefined ]; + } + + savedChildNewParent() { + let user = this.schema.users.create({ name: 'Link' }); + let friend = this.schema.users.new({ name: 'Bob' }); + + user.bestFriend = friend; + + return [ user, friend ]; + } + + savedChildSavedParent() { + let insertedFriend = this.db.users.insert({ name: 'Bob' }); + let insertedUser = this.db.users.insert({ name: 'Link', bestFriendId: insertedFriend.id }); + this.db.users.update(insertedFriend.id, { bestFriendId: insertedUser.id }); + let user = this.schema.users.find(insertedUser.id); + let friend = this.schema.users.find(insertedFriend.id); + + return [ user, friend ]; + } + + newChildNoParent() { + return [ this.schema.users.new({ name: 'Link' }), undefined ]; + } + + newChildNewParent() { + let friend = this.schema.users.new({ name: 'Link' }); + let user = this.schema.users.new({ name: 'Bob' }); + user.bestFriend = friend; + + return [ user, friend ]; + } + + newChildSavedParent() { + let insertedFriend = this.db.users.insert({ name: 'Bob' }); + let user = this.schema.users.new({ name: 'Link' }); + let savedFriend = this.schema.users.find(insertedFriend.id); + + user.bestFriend = savedFriend; + + return [ user, savedFriend ]; + } + + // Just a saved unassociated parent. + savedParent() { + let insertedParent = this.db.users.insert({ name: 'Bob' }); + + return this.schema.users.find(insertedParent.id); + } + + newParent() { + return this.schema.users.new({ name: 'Bob' }); + } + +} + +export const states = [ + 'savedChildNoParent', + 'savedChildNewParent', + 'savedChildSavedParent', + 'newChildNoParent', + 'newChildNewParent', + 'newChildSavedParent' +]; diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/accessor-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/accessor-test.js new file mode 100644 index 000000000..058de6687 --- /dev/null +++ b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/accessor-test.js @@ -0,0 +1,34 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | accessor', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The reference to a belongs-to association is correct, for all states +*/ +states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ user, friend ] = this.helper[state](); + + // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison + if (friend) { + assert.deepEqual(user.bestFriend.attrs, friend.attrs, 'the model reference is correct'); + assert.equal(user.bestFriendId, friend.id, 'the modelId reference is correct'); + } else { + assert.deepEqual(user.bestFriend, null, 'the model reference is correct'); + assert.equal(user.bestFriendId, null, 'the modelId reference is correct'); + } + + // If there's a friend in this state, make sure the inverse association is correct + if (friend) { + assert.deepEqual(friend.bestFriend.attrs, user.attrs, 'the inverse model reference is correct'); + assert.equal(friend.bestFriendId, user.id, 'the inverse modelId reference is correct'); + } + }); + +}); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-create-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-create-test.js new file mode 100644 index 000000000..9afb6ed70 --- /dev/null +++ b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-create-test.js @@ -0,0 +1,26 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | association #create', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can create a belongs-to association, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); + + let ganon = user.createBestFriend({ name: 'Ganon' }); + + assert.ok(ganon.id, 'the parent was persisted'); + assert.deepEqual(user.bestFriend.attrs, ganon.attrs); + assert.equal(user.bestFriendId, ganon.id); + assert.equal(this.helper.schema.users.find(user.id).bestFriendId, ganon.id, 'the user was persisted'); + }); + +}); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-new-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-new-test.js new file mode 100644 index 000000000..8adbcf5c2 --- /dev/null +++ b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-new-test.js @@ -0,0 +1,31 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | association #new', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can make a new unsaved belongs-to association, for all states +*/ + +states.forEach((state) => { + + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); + + let ganon = user.newBestFriend({ name: 'Ganon' }); + + assert.ok(!ganon.id, 'the parent was not persisted'); + assert.deepEqual(user.bestFriend, ganon); + assert.equal(user.bestFriendId, null); + + user.save(); + + assert.ok(ganon.id, 'saving the child persists the parent'); + assert.equal(user.bestFriendId, ganon.id, 'the childs fk was updated'); + }); + +}); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-id-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-id-test.js new file mode 100644 index 000000000..edd9e39a6 --- /dev/null +++ b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-id-test.js @@ -0,0 +1,41 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | association #setId', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parentId, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user ] = this.helper[state](); + let friend = this.helper.savedParent(); + + user.bestFriendId = friend.id; + + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + }); + +}); + +[ + 'savedChildSavedParent', + 'newChildSavedParent' +].forEach((state) => { + + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ user ] = this.helper[state](); + + user.bestFriendId = null; + + assert.equal(user.bestFriendId, null); + assert.equal(user.bestFriend, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-test.js new file mode 100644 index 000000000..7a427b7e8 --- /dev/null +++ b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-test.js @@ -0,0 +1,44 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | association #set', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parent, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ user ] = this.helper[state](); + let friend = this.helper.savedParent(); + + user.bestFriend = friend; + + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + }); + + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user ] = this.helper[state](); + let friend = this.helper.newParent(); + + user.bestFriend = friend; + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + }); + + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ user ] = this.helper[state](); + + user.bestFriend = null; + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/create-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/create-test.js new file mode 100644 index 000000000..bb4fc723e --- /dev/null +++ b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/create-test.js @@ -0,0 +1,62 @@ +import Helper from './_helper'; +import { Model } from 'ember-cli-mirage'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | create', { + beforeEach() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + } +}); + +test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let friend = schema.create('user'); + let user = schema.create('user', { + bestFriendId: friend.id + }); + + friend.reload(); + + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', bestFriendId: '2' }); + assert.deepEqual(schema.db.users[1], { id: '2', bestFriendId: '1' }); +}); + +test('it sets up associations correctly when passing in the association itself', function(assert) { + let { schema } = this.helper; + let friend = schema.create('user'); + let user = schema.create('user', { + bestFriend: friend + }); + + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', bestFriendId: '2' }); + assert.deepEqual(schema.db.users[1], { id: '2', bestFriendId: '1' }); +}); + +test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('user', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); + + assert.throws(function() { + schema.create('user', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); +}); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/delete-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/delete-test.js new file mode 100644 index 000000000..ab086808a --- /dev/null +++ b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/delete-test.js @@ -0,0 +1,24 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | delete', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ user, bestFriend ] = this.helper[state](); + + if (bestFriend) { + bestFriend.destroy(); + user.reload(); + } + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/instantiating-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/instantiating-test.js new file mode 100644 index 000000000..1de6ab5d6 --- /dev/null +++ b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/instantiating-test.js @@ -0,0 +1,83 @@ +import Helper from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | instantiating', { + beforeEach() { + this.helper = new Helper(); + this.schema = this.helper.schema; + } +}); + +test('the child accepts a saved parent id', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ bestFriendId: friend.id }); + + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + assert.deepEqual(user.attrs, { bestFriendId: friend.id }); +}); + +test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ bestFriendId: 2 }); + }, /You're instantiating a user that has a bestFriendId of 2, but that record doesn't exist in the database/); +}); + +test('the child accepts a null parent id', function(assert) { + let user = this.schema.users.new({ bestFriendId: null }); + + assert.equal(user.bestFriendId, null); + assert.equal(user.bestFriend, null); + assert.deepEqual(user.attrs, { bestFriendId: null }); +}); + +test('the child accepts a saved parent model', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ bestFriend: friend }); + + assert.equal(user.bestFriendId, 1); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + assert.deepEqual(user.attrs, { bestFriendId: null }); // this would update when saved +}); + +test('the child accepts a new parent model', function(assert) { + let zelda = this.schema.users.new({ name: 'Zelda' }); + let user = this.schema.users.new({ bestFriend: zelda }); + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, zelda); + assert.deepEqual(user.attrs, { bestFriendId: null }); +}); + +test('the child accepts a null parent model', function(assert) { + let user = this.schema.users.new({ bestFriend: null }); + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + assert.deepEqual(user.attrs, { bestFriendId: null }); +}); + +test('the child accepts a parent model and id', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ bestFriend: friend, bestFriendId: friend.id }); + + assert.equal(user.bestFriendId, '1'); + assert.deepEqual(user.bestFriend, friend); + assert.deepEqual(user.attrs, { bestFriendId: friend.id }); +}); + +test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let user = this.schema.users.new({}); + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + assert.deepEqual(user.attrs, { bestFriendId: null }); +}); + +test('the child accepts no reference to a parent id or model', function(assert) { + let user = this.schema.users.new(); + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + assert.deepEqual(user.attrs, { bestFriendId: null }); +}); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/_helper.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/_helper.js new file mode 100644 index 000000000..1c0dd99cb --- /dev/null +++ b/tests/integration/orm/belongs-to/6-one-way-reflexive/_helper.js @@ -0,0 +1,94 @@ +import { Model, belongsTo } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +/* + A model with a belongsTo association can be in six states + with respect to its association. This helper class + returns a child (and its association) in these various states. + + The return value is an array of the form + + [ child, parent ] + + where the parent may be undefined. +*/ +export default class BelongsToHelper { + + constructor() { + this.db = new Db(); + + this.schema = new Schema(this.db, { + user: Model.extend({ + user: belongsTo('user', { inverse: null }) + }) + }); + } + + savedChildNoParent() { + let insertedUser = this.db.users.insert({ name: 'Link' }); + + return [ this.schema.users.find(insertedUser.id), undefined ]; + } + + savedChildNewParent() { + let child = this.schema.users.create({ name: 'Link' }); + let parent = this.schema.users.new({ name: 'Bob' }); + + child.user = parent; + + return [ child, parent ]; + } + + savedChildSavedParent() { + let insertedParent = this.db.users.insert({ name: 'Bob' }); + let insertedChild = this.db.users.insert({ name: 'Link', userId: insertedParent.id }); + let child = this.schema.users.find(insertedChild.id); + let parent = this.schema.users.find(insertedParent.id); + + return [ child, parent ]; + } + + newChildNoParent() { + return [ this.schema.users.new({ name: 'Link' }), undefined ]; + } + + newChildNewParent() { + let parent = this.schema.users.new({ name: 'Link' }); + let child = this.schema.users.new({ name: 'Bob' }); + child.user = parent; + + return [ child, parent ]; + } + + newChildSavedParent() { + let insertedParent = this.db.users.insert({ name: 'Bob' }); + let child = this.schema.users.new({ name: 'Link' }); + let savedParent = this.schema.users.find(insertedParent.id); + + child.user = savedParent; + + return [ child, savedParent ]; + } + + // Just a saved unassociated parent. + savedParent() { + let insertedParent = this.db.users.insert({ name: 'Bob' }); + + return this.schema.users.find(insertedParent.id); + } + + newParent() { + return this.schema.users.new({ name: 'Bob' }); + } + +} + +export const states = [ + 'savedChildNoParent', + 'savedChildNewParent', + 'savedChildSavedParent', + 'newChildNoParent', + 'newChildNewParent', + 'newChildSavedParent' +]; diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/accessor-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/accessor-test.js new file mode 100644 index 000000000..f1bb8bb9f --- /dev/null +++ b/tests/integration/orm/belongs-to/6-one-way-reflexive/accessor-test.js @@ -0,0 +1,28 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One-Way Reflexive | accessor', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The reference to a belongs-to association is correct, for all states +*/ +states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ user, parent ] = this.helper[state](); + + // We use .attrs here to avoid infinite recursion + if (parent) { + assert.deepEqual(user.user.attrs, parent.attrs, 'the model reference is correct'); + assert.equal(user.userId, parent.id, 'the modelId reference is correct'); + } else { + assert.deepEqual(user.user, null, 'the model reference is correct'); + assert.equal(user.userId, null, 'the modelId reference is correct'); + } + }); + +}); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-create-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-create-test.js new file mode 100644 index 000000000..9e59fc121 --- /dev/null +++ b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-create-test.js @@ -0,0 +1,26 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One-Way Reflexive | association #create', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can create a belongs-to association, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can create an associated parent`, function(assert) { + let [ child ] = this.helper[state](); + + let ganon = child.createUser({ name: 'Ganon' }); + + assert.ok(ganon.id, 'the parent was persisted'); + assert.deepEqual(child.user.attrs, ganon.attrs); + assert.equal(child.userId, ganon.id); + assert.equal(this.helper.schema.users.find(child.id).userId, ganon.id, 'the child was persisted'); + }); + +}); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-new-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-new-test.js new file mode 100644 index 000000000..5bc1f7a3e --- /dev/null +++ b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-new-test.js @@ -0,0 +1,31 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One-Way Reflexive | association #new', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can make a new unsaved belongs-to association, for all states +*/ + +states.forEach((state) => { + + test(`a ${state} can build a new associated parent`, function(assert) { + let [ child ] = this.helper[state](); + + let ganon = child.newUser({ name: 'Ganon' }); + + assert.ok(!ganon.id, 'the parent was not persisted'); + assert.deepEqual(child.user, ganon); + assert.equal(child.userId, null); + + child.save(); + + assert.ok(ganon.id, 'saving the child persists the parent'); + assert.equal(child.userId, ganon.id, 'the childs fk was updated'); + }); + +}); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-id-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-id-test.js new file mode 100644 index 000000000..5a972eb44 --- /dev/null +++ b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-id-test.js @@ -0,0 +1,41 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One-Way Reflexive | association #setId', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parentId, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ child ] = this.helper[state](); + let savedParent = this.helper.savedParent(); + + child.userId = savedParent.id; + + assert.equal(child.userId, savedParent.id); + assert.deepEqual(child.user.attrs, savedParent.attrs); + }); + +}); + +[ + 'savedChildSavedParent', + 'newChildSavedParent' +].forEach((state) => { + + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ child ] = this.helper[state](); + + child.userId = null; + + assert.equal(child.userId, null); + assert.deepEqual(child.user, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-test.js new file mode 100644 index 000000000..80d501b39 --- /dev/null +++ b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-test.js @@ -0,0 +1,44 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One-Way Reflexive | association #set', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parent, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ child ] = this.helper[state](); + let savedParent = this.helper.savedParent(); + + child.user = savedParent; + + assert.equal(child.userId, savedParent.id); + assert.deepEqual(child.user.attrs, savedParent.attrs); + }); + + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ child ] = this.helper[state](); + let newParent = this.helper.newParent(); + + child.user = newParent; + + assert.equal(child.userId, null); + assert.deepEqual(child.user, newParent); + }); + + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ child ] = this.helper[state](); + + child.user = null; + + assert.equal(child.userId, null); + assert.deepEqual(child.user, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/create-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/create-test.js new file mode 100644 index 000000000..3b95dd459 --- /dev/null +++ b/tests/integration/orm/belongs-to/6-one-way-reflexive/create-test.js @@ -0,0 +1,60 @@ +import Helper from './_helper'; +import { Model } from 'ember-cli-mirage'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One-Way Reflexive | create', { + beforeEach() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + } +}); + +test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let parent = schema.create('user'); + let child = schema.create('user', { + userId: parent.id + }); + + assert.equal(child.userId, parent.id); + assert.deepEqual(child.user.attrs, parent.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', userId: null }); + assert.deepEqual(schema.db.users[1], { id: '2', userId: '1' }); +}); + +test('it sets up associations correctly when passing in the association itself', function(assert) { + let { schema } = this.helper; + let parent = schema.create('user'); + let child = schema.create('user', { + user: parent + }); + + assert.equal(child.userId, parent.id); + assert.deepEqual(child.user.attrs, parent.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', userId: null }); + assert.deepEqual(schema.db.users[1], { id: '2', userId: '1' }); +}); + +test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('user', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); + + assert.throws(function() { + schema.create('user', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); +}); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/delete-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/delete-test.js new file mode 100644 index 000000000..6370ed50c --- /dev/null +++ b/tests/integration/orm/belongs-to/6-one-way-reflexive/delete-test.js @@ -0,0 +1,24 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One-Way Reflexive | delete', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ user, targetUser ] = this.helper[state](); + + if (targetUser) { + targetUser.destroy(); + user.reload(); + } + + assert.equal(user.userId, null); + assert.deepEqual(user.user, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/instantiating-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/instantiating-test.js new file mode 100644 index 000000000..10d8f0a11 --- /dev/null +++ b/tests/integration/orm/belongs-to/6-one-way-reflexive/instantiating-test.js @@ -0,0 +1,82 @@ +import Helper from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One-Way Reflexive | instantiating', { + beforeEach() { + this.helper = new Helper(); + this.schema = this.helper.schema; + } +}); + +test('the child accepts a saved parent id', function(assert) { + let parent = this.helper.savedParent(); + let child = this.schema.users.new({ userId: parent.id }); + + assert.equal(child.userId, parent.id); + assert.deepEqual(child.user.attrs, parent.attrs); + assert.deepEqual(child.attrs, { userId: parent.id }); +}); + +test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ userId: 2 }); + }, /You're instantiating a user that has a userId of 2, but that record doesn't exist in the database/); +}); + +test('the child accepts a null parent id', function(assert) { + let child = this.schema.users.new({ userId: null }); + + assert.equal(child.userId, null); + assert.deepEqual(child.user, null); + assert.deepEqual(child.attrs, { userId: null }); +}); + +test('the child accepts a saved parent model', function(assert) { + let parent = this.helper.savedParent(); + let child = this.schema.users.new({ user: parent }); + + assert.equal(child.userId, 1); + assert.deepEqual(child.user.attrs, parent.attrs); +}); + +test('the child accepts a new parent model', function(assert) { + let zelda = this.schema.users.new({ name: 'Zelda' }); + let child = this.schema.users.new({ user: zelda }); + + assert.equal(child.userId, null); + assert.deepEqual(child.user, zelda); + assert.deepEqual(child.attrs, { userId: null }); +}); + +test('the child accepts a null parent model', function(assert) { + let child = this.schema.users.new({ user: null }); + + assert.equal(child.userId, null); + assert.deepEqual(child.user, null); + assert.deepEqual(child.attrs, { userId: null }); +}); + +test('the child accepts a parent model and id', function(assert) { + let parent = this.helper.savedParent(); + let child = this.schema.users.new({ user: parent, userId: parent.id }); + + assert.equal(child.userId, '1'); + assert.deepEqual(child.user.attrs, parent.attrs); + assert.deepEqual(child.attrs, { userId: parent.id }); +}); + +test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let child = this.schema.users.new({}); + + assert.equal(child.userId, null); + assert.deepEqual(child.user, null); + assert.deepEqual(child.attrs, { userId: null }); +}); + +test('the child accepts no reference to a parent id or model', function(assert) { + let child = this.schema.users.new(); + + assert.equal(child.userId, null); + assert.deepEqual(child.user, null); + assert.deepEqual(child.attrs, { userId: null }); +}); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/_helper.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/_helper.js new file mode 100644 index 000000000..00b522aa0 --- /dev/null +++ b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/_helper.js @@ -0,0 +1,94 @@ +import { Model, belongsTo } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +/* + A model with a belongsTo association can be in six states + with respect to its association. This helper class + returns a child (and its association) in these various states. + + The return value is an array of the form + + [ child, parent ] + + where the parent may be undefined. +*/ +export default class BelongsToHelper { + + constructor() { + this.db = new Db(); + + this.schema = new Schema(this.db, { + user: Model.extend({ + parent: belongsTo('user', { inverse: null }) + }) + }); + } + + savedChildNoParent() { + let insertedUser = this.db.users.insert({ name: 'Link' }); + + return [ this.schema.users.find(insertedUser.id), undefined ]; + } + + savedChildNewParent() { + let child = this.schema.users.create({ name: 'Link' }); + let parent = this.schema.users.new({ name: 'Bob' }); + + child.parent = parent; + + return [ child, parent ]; + } + + savedChildSavedParent() { + let insertedParent = this.db.users.insert({ name: 'Bob' }); + let insertedChild = this.db.users.insert({ name: 'Link', parentId: insertedParent.id }); + let child = this.schema.users.find(insertedChild.id); + let parent = this.schema.users.find(insertedParent.id); + + return [ child, parent ]; + } + + newChildNoParent() { + return [ this.schema.users.new({ name: 'Link' }), undefined ]; + } + + newChildNewParent() { + let parent = this.schema.users.new({ name: 'Link' }); + let child = this.schema.users.new({ name: 'Bob' }); + child.parent = parent; + + return [ child, parent ]; + } + + newChildSavedParent() { + let insertedParent = this.db.users.insert({ name: 'Bob' }); + let child = this.schema.users.new({ name: 'Link' }); + let savedParent = this.schema.users.find(insertedParent.id); + + child.parent = savedParent; + + return [ child, savedParent ]; + } + + // Just a saved unassociated parent. + savedParent() { + let insertedParent = this.db.users.insert({ name: 'Bob' }); + + return this.schema.users.find(insertedParent.id); + } + + newParent() { + return this.schema.users.new({ name: 'Bob' }); + } + +} + +export const states = [ + 'savedChildNoParent', + 'savedChildNewParent', + 'savedChildSavedParent', + 'newChildNoParent', + 'newChildNewParent', + 'newChildSavedParent' +]; diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/accessor-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/accessor-test.js new file mode 100644 index 000000000..8ec26f279 --- /dev/null +++ b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/accessor-test.js @@ -0,0 +1,28 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named One-Way Reflexive | accessor', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The reference to a belongs-to association is correct, for all states +*/ +states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ user, parent ] = this.helper[state](); + + // We use .attrs here to avoid infinite recursion + if (parent) { + assert.deepEqual(user.parent.attrs, parent.attrs, 'the model reference is correct'); + assert.equal(user.parentId, parent.id, 'the modelId reference is correct'); + } else { + assert.deepEqual(user.parent, null, 'the model reference is correct'); + assert.equal(user.parentId, null, 'the modelId reference is correct'); + } + }); + +}); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-create-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-create-test.js new file mode 100644 index 000000000..b8ba3e4bd --- /dev/null +++ b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-create-test.js @@ -0,0 +1,26 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named One-Way Reflexive | association #create', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can create a belongs-to association, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can create an associated parent`, function(assert) { + let [ child ] = this.helper[state](); + + let ganon = child.createParent({ name: 'Ganon' }); + + assert.ok(ganon.id, 'the parent was persisted'); + assert.deepEqual(child.parent.attrs, ganon.attrs); + assert.equal(child.parentId, ganon.id); + assert.equal(this.helper.schema.users.find(child.id).parentId, ganon.id, 'the child was persisted'); + }); + +}); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-new-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-new-test.js new file mode 100644 index 000000000..255ee4f39 --- /dev/null +++ b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-new-test.js @@ -0,0 +1,31 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named One-Way Reflexive | association #new', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can make a new unsaved belongs-to association, for all states +*/ + +states.forEach((state) => { + + test(`a ${state} can build a new associated parent`, function(assert) { + let [ child ] = this.helper[state](); + + let ganon = child.newParent({ name: 'Ganon' }); + + assert.ok(!ganon.id, 'the parent was not persisted'); + assert.deepEqual(child.parent, ganon); + assert.equal(child.parentId, null); + + child.save(); + + assert.ok(ganon.id, 'saving the child persists the parent'); + assert.equal(child.parentId, ganon.id, 'the childs fk was updated'); + }); + +}); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-id-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-id-test.js new file mode 100644 index 000000000..12e9f79bf --- /dev/null +++ b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-id-test.js @@ -0,0 +1,41 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named One-Way Reflexive | association #setId', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parentId, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ child ] = this.helper[state](); + let savedParent = this.helper.savedParent(); + + child.parentId = savedParent.id; + + assert.equal(child.parentId, savedParent.id); + assert.deepEqual(child.parent.attrs, savedParent.attrs); + }); + +}); + +[ + 'savedChildSavedParent', + 'newChildSavedParent' +].forEach((state) => { + + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ child ] = this.helper[state](); + + child.parentId = null; + + assert.equal(child.parentId, null); + assert.deepEqual(child.parent, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-test.js new file mode 100644 index 000000000..cee39ba39 --- /dev/null +++ b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-test.js @@ -0,0 +1,44 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named One-Way Reflexive | association #set', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parent, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ child ] = this.helper[state](); + let savedParent = this.helper.savedParent(); + + child.parent = savedParent; + + assert.equal(child.parentId, savedParent.id); + assert.deepEqual(child.parent.attrs, savedParent.attrs); + }); + + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ child ] = this.helper[state](); + let newParent = this.helper.newParent(); + + child.parent = newParent; + + assert.equal(child.parentId, null); + assert.deepEqual(child.parent, newParent); + }); + + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ child ] = this.helper[state](); + + child.parent = null; + + assert.equal(child.parentId, null); + assert.deepEqual(child.parent, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/create-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/create-test.js new file mode 100644 index 000000000..e6ffefc94 --- /dev/null +++ b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/create-test.js @@ -0,0 +1,60 @@ +import Helper from './_helper'; +import { Model } from 'ember-cli-mirage'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named One-Way Reflexive | create', { + beforeEach() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + } +}); + +test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let parent = schema.create('user'); + let child = schema.create('user', { + parentId: parent.id + }); + + assert.equal(child.parentId, parent.id); + assert.deepEqual(child.parent.attrs, parent.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', parentId: null }); + assert.deepEqual(schema.db.users[1], { id: '2', parentId: '1' }); +}); + +test('it sets up associations correctly when passing in the association itself', function(assert) { + let { schema } = this.helper; + let parent = schema.create('user'); + let child = schema.create('user', { + parent + }); + + assert.equal(child.parentId, parent.id); + assert.deepEqual(child.parent.attrs, parent.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', parentId: null }); + assert.deepEqual(schema.db.users[1], { id: '2', parentId: '1' }); +}); + +test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('user', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); + + assert.throws(function() { + schema.create('user', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); +}); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/delete-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/delete-test.js new file mode 100644 index 000000000..b6518e378 --- /dev/null +++ b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/delete-test.js @@ -0,0 +1,24 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named One-Way Reflexive | delete', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ user, parent ] = this.helper[state](); + + if (parent) { + parent.destroy(); + user.reload(); + } + + assert.equal(user.parentId, null); + assert.deepEqual(user.parent, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/instantiating-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/instantiating-test.js new file mode 100644 index 000000000..cb16bffcd --- /dev/null +++ b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/instantiating-test.js @@ -0,0 +1,82 @@ +import Helper from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named One-Way Reflexive | instantiating', { + beforeEach() { + this.helper = new Helper(); + this.schema = this.helper.schema; + } +}); + +test('the child accepts a saved parent id', function(assert) { + let parent = this.helper.savedParent(); + let child = this.schema.users.new({ parentId: parent.id }); + + assert.equal(child.parentId, parent.id); + assert.deepEqual(child.parent.attrs, parent.attrs); + assert.deepEqual(child.attrs, { parentId: parent.id }); +}); + +test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ parentId: 2 }); + }, /You're instantiating a user that has a parentId of 2, but that record doesn't exist in the database/); +}); + +test('the child accepts a null parent id', function(assert) { + let child = this.schema.users.new({ parentId: null }); + + assert.equal(child.parentId, null); + assert.deepEqual(child.parent, null); + assert.deepEqual(child.attrs, { parentId: null }); +}); + +test('the child accepts a saved parent model', function(assert) { + let parent = this.helper.savedParent(); + let child = this.schema.users.new({ parent }); + + assert.equal(child.parentId, 1); + assert.deepEqual(child.parent.attrs, parent.attrs); +}); + +test('the child accepts a new parent model', function(assert) { + let zelda = this.schema.users.new({ name: 'Zelda' }); + let child = this.schema.users.new({ parent: zelda }); + + assert.equal(child.parentId, null); + assert.deepEqual(child.parent, zelda); + assert.deepEqual(child.attrs, { parentId: null }); +}); + +test('the child accepts a null parent model', function(assert) { + let child = this.schema.users.new({ parent: null }); + + assert.equal(child.parentId, null); + assert.deepEqual(child.parent, null); + assert.deepEqual(child.attrs, { parentId: null }); +}); + +test('the child accepts a parent model and id', function(assert) { + let parent = this.helper.savedParent(); + let child = this.schema.users.new({ parent, parentId: parent.id }); + + assert.equal(child.parentId, '1'); + assert.deepEqual(child.parent.attrs, parent.attrs); + assert.deepEqual(child.attrs, { parentId: parent.id }); +}); + +test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let child = this.schema.users.new({}); + + assert.equal(child.parentId, null); + assert.deepEqual(child.parent, null); + assert.deepEqual(child.attrs, { parentId: null }); +}); + +test('the child accepts no reference to a parent id or model', function(assert) { + let child = this.schema.users.new(); + + assert.equal(child.parentId, null); + assert.deepEqual(child.parent, null); + assert.deepEqual(child.attrs, { parentId: null }); +}); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/_helper.js b/tests/integration/orm/belongs-to/8-one-to-one/_helper.js new file mode 100644 index 000000000..a1cde6151 --- /dev/null +++ b/tests/integration/orm/belongs-to/8-one-to-one/_helper.js @@ -0,0 +1,98 @@ +import { Model, belongsTo } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +/* + A model with a belongsTo association can be in six states + with respect to its association. This helper class + returns a child (and its association) in these various states. + + The return value is an array of the form + + [ child, parent ] + + where the parent may be undefined. +*/ +export default class BelongsToHelper { + + constructor() { + this.db = new Db(); + + this.schema = new Schema(this.db, { + user: Model.extend({ + profile: belongsTo() + }), + profile: Model.extend({ + user: belongsTo() + }) + }); + } + + savedChildNoParent() { + let insertedUser = this.db.users.insert({ name: 'Link' }); + + return [ this.schema.users.find(insertedUser.id), undefined ]; + } + + savedChildNewParent() { + let user = this.schema.users.create({ name: 'Link' }); + let profile = this.schema.profiles.new({ age: 300 }); + + user.profile = profile; + + return [ user, profile ]; + } + + savedChildSavedParent() { + let insertedProfile = this.db.profiles.insert({ age: 300 }); + let insertedUser = this.db.users.insert({ name: 'Link', profileId: insertedProfile.id }); + this.db.profiles.update(insertedProfile.id, { userId: insertedUser.id }); + let user = this.schema.users.find(insertedUser.id); + let profile = this.schema.profiles.find(insertedProfile.id); + + return [ user, profile ]; + } + + newChildNoParent() { + return [ this.schema.users.new({ name: 'Link' }), undefined ]; + } + + newChildNewParent() { + let profile = this.schema.profiles.new({ age: 300 }); + let user = this.schema.users.new({ name: 'Link' }); + user.profile = profile; + + return [ user, profile ]; + } + + newChildSavedParent() { + let insertedProfile = this.db.profiles.insert({ age: 300 }); + let user = this.schema.users.new({ name: 'Link' }); + let savedProfile = this.schema.profiles.find(insertedProfile.id); + + user.profile = savedProfile; + + return [ user, savedProfile ]; + } + + // Just a saved unassociated parent. + savedParent() { + let insertedProfile = this.db.profiles.insert({ age: 300 }); + + return this.schema.profiles.find(insertedProfile.id); + } + + newParent() { + return this.schema.profiles.new({ age: 300 }); + } + +} + +export const states = [ + 'savedChildNoParent', + 'savedChildNewParent', + 'savedChildSavedParent', + 'newChildNoParent', + 'newChildNewParent', + 'newChildSavedParent' +]; diff --git a/tests/integration/orm/belongs-to/8-one-to-one/accessor-test.js b/tests/integration/orm/belongs-to/8-one-to-one/accessor-test.js new file mode 100644 index 000000000..d3a4562d2 --- /dev/null +++ b/tests/integration/orm/belongs-to/8-one-to-one/accessor-test.js @@ -0,0 +1,34 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One To One | accessor', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The reference to a belongs-to association is correct, for all states +*/ +states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ user, profile ] = this.helper[state](); + + // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison + if (profile) { + assert.deepEqual(user.profile.attrs, profile.attrs, 'the model reference is correct'); + assert.equal(user.profileId, profile.id, 'the modelId reference is correct'); + } else { + assert.deepEqual(user.profile, null, 'the model reference is correct'); + assert.equal(user.profileId, null, 'the modelId reference is correct'); + } + + // If there's a profile in this state, make sure the inverse association is correct + if (profile) { + assert.deepEqual(profile.user.attrs, user.attrs, 'the inverse model reference is correct'); + assert.equal(profile.userId, user.id, 'the inverse modelId reference is correct'); + } + }); + +}); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/association-create-test.js b/tests/integration/orm/belongs-to/8-one-to-one/association-create-test.js new file mode 100644 index 000000000..fc2bbfba4 --- /dev/null +++ b/tests/integration/orm/belongs-to/8-one-to-one/association-create-test.js @@ -0,0 +1,27 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One To One | association #create', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can create a belongs-to association, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); + + let profile = user.createProfile({ age: 300 }); + + assert.ok(profile.id, 'the parent was persisted'); + assert.deepEqual(user.profile.attrs, profile.attrs); + assert.deepEqual(profile.user.attrs, user.attrs, 'the inverse was set'); + assert.equal(user.profileId, profile.id); + assert.equal(this.helper.schema.users.find(user.id).profileId, profile.id, 'the user was persisted'); + }); + +}); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/association-new-test.js b/tests/integration/orm/belongs-to/8-one-to-one/association-new-test.js new file mode 100644 index 000000000..ad9f5c80b --- /dev/null +++ b/tests/integration/orm/belongs-to/8-one-to-one/association-new-test.js @@ -0,0 +1,33 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One To One | association #new', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can make a new unsaved belongs-to association, for all states +*/ + +states.forEach((state) => { + + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); + + let profile = user.newProfile({ age: 300 }); + + assert.ok(!profile.id, 'the parent was not persisted'); + assert.deepEqual(user.profile, profile); + assert.equal(user.profileId, null); + assert.deepEqual(profile.user, user, 'the inverse was set'); + assert.equal(profile.userId, user.id); + + user.save(); + + assert.ok(profile.id, 'saving the child persists the parent'); + assert.equal(user.profileId, profile.id, 'the childs fk was updated'); + }); + +}); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/association-set-id-test.js b/tests/integration/orm/belongs-to/8-one-to-one/association-set-id-test.js new file mode 100644 index 000000000..3d34c65e7 --- /dev/null +++ b/tests/integration/orm/belongs-to/8-one-to-one/association-set-id-test.js @@ -0,0 +1,47 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One To One | association #setId', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parentId, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user ] = this.helper[state](); + let profile = this.helper.savedParent(); + + user.profileId = profile.id; + + assert.equal(user.profileId, profile.id); + assert.deepEqual(user.profile.attrs, profile.attrs); + + user.save(); + profile.reload(); + + assert.equal(profile.userId, user.id, 'the inverse was set'); + assert.deepEqual(profile.user.attrs, user.attrs); + }); + +}); + +// [ +// 'savedChildSavedParent', +// 'newChildSavedParent' +// ].forEach((state) => { +// +// test(`a ${state} can clear its association via a null parentId`, function(assert) { +// let [ user ] = this.helper[state](); +// +// user.userId = null; +// +// assert.equal(user.userId, null); +// assert.equal(user.user, null); +// }); +// +// }); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/association-set-test.js b/tests/integration/orm/belongs-to/8-one-to-one/association-set-test.js new file mode 100644 index 000000000..913bf477d --- /dev/null +++ b/tests/integration/orm/belongs-to/8-one-to-one/association-set-test.js @@ -0,0 +1,49 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One To One | association #set', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parent, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ user ] = this.helper[state](); + let profile = this.helper.savedParent(); + + user.profile = profile; + + assert.equal(user.profileId, profile.id); + assert.deepEqual(user.profile.attrs, profile.attrs); + assert.equal(profile.userId, user.id, 'the inverse was set'); + assert.deepEqual(profile.user.attrs, user.attrs); + }); + + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user ] = this.helper[state](); + let profile = this.helper.newParent(); + + user.profile = profile; + + assert.equal(user.profileId, null); + assert.deepEqual(user.profile.attrs, profile.attrs); + + assert.equal(profile.userId, user.id, 'the inverse was set'); + assert.deepEqual(profile.user.attrs, user.attrs); + }); + + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ user ] = this.helper[state](); + + user.profile = null; + + assert.equal(user.profileId, null); + assert.deepEqual(user.profile, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/create-test.js b/tests/integration/orm/belongs-to/8-one-to-one/create-test.js new file mode 100644 index 000000000..e0bb92750 --- /dev/null +++ b/tests/integration/orm/belongs-to/8-one-to-one/create-test.js @@ -0,0 +1,65 @@ +import Helper from './_helper'; +import { Model } from 'ember-cli-mirage'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One To One | create', { + beforeEach() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + } +}); + +test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let profile = schema.create('profile'); + let user = schema.create('user', { + profileId: profile.id + }); + profile.reload(); + + assert.equal(user.profileId, profile.id); + assert.deepEqual(user.profile.attrs, profile.attrs); + assert.deepEqual(profile.user.attrs, user.attrs); + assert.equal(schema.db.users.length, 1); + assert.equal(schema.db.profiles.length, 1); + assert.deepEqual(schema.db.users[0], { id: '1', profileId: '1' }); + assert.deepEqual(schema.db.profiles[0], { id: '1', userId: '1' }); +}); + +test('it sets up associations correctly when passing in the association itself', function(assert) { + let { schema } = this.helper; + let profile = schema.create('profile'); + let user = schema.create('user', { + profile + }); + + assert.equal(user.profileId, profile.id); + assert.deepEqual(user.profile.attrs, profile.attrs); + assert.deepEqual(profile.user.attrs, user.attrs); + assert.equal(schema.db.users.length, 1); + assert.equal(schema.db.profiles.length, 1); + assert.deepEqual(schema.db.users[0], { id: '1', profileId: '1' }); + assert.deepEqual(schema.db.profiles[0], { id: '1', userId: '1' }); +}); + +test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('user', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); + + assert.throws(function() { + schema.create('user', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); +}); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/delete-test.js b/tests/integration/orm/belongs-to/8-one-to-one/delete-test.js new file mode 100644 index 000000000..4dc9d52c9 --- /dev/null +++ b/tests/integration/orm/belongs-to/8-one-to-one/delete-test.js @@ -0,0 +1,24 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One To One | delete', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ user, profile ] = this.helper[state](); + + if (profile) { + profile.destroy(); + user.reload(); + } + + assert.equal(user.profileId, null); + assert.deepEqual(user.profile, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/instantiating-test.js b/tests/integration/orm/belongs-to/8-one-to-one/instantiating-test.js new file mode 100644 index 000000000..190b49e8b --- /dev/null +++ b/tests/integration/orm/belongs-to/8-one-to-one/instantiating-test.js @@ -0,0 +1,83 @@ +import Helper from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One To One | instantiating', { + beforeEach() { + this.helper = new Helper(); + this.schema = this.helper.schema; + } +}); + +test('the child accepts a saved parent id', function(assert) { + let profile = this.helper.savedParent(); + let user = this.schema.users.new({ profileId: profile.id }); + + assert.equal(user.profileId, profile.id); + assert.deepEqual(user.profile.attrs, profile.attrs); + assert.deepEqual(user.attrs, { profileId: profile.id }); +}); + +test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ profileId: 2 }); + }, /You're instantiating a user that has a profileId of 2, but that record doesn't exist in the database/); +}); + +test('the child accepts a null parent id', function(assert) { + let user = this.schema.users.new({ profileId: null }); + + assert.equal(user.profileId, null); + assert.equal(user.profile, null); + assert.deepEqual(user.attrs, { profileId: null }); +}); + +test('the child accepts a saved parent model', function(assert) { + let profile = this.helper.savedParent(); + let user = this.schema.users.new({ profile }); + + assert.equal(user.profileId, 1); + assert.deepEqual(user.profile.attrs, profile.attrs); + assert.deepEqual(user.attrs, { profileId: null }); // this would update when saved +}); + +test('the child accepts a new parent model', function(assert) { + let profile = this.schema.profiles.new({ age: 300 }); + let user = this.schema.users.new({ profile }); + + assert.equal(user.profileId, null); + assert.deepEqual(user.profile, profile); + assert.deepEqual(user.attrs, { profileId: null }); +}); + +test('the child accepts a null parent model', function(assert) { + let user = this.schema.users.new({ profile: null }); + + assert.equal(user.profileId, null); + assert.deepEqual(user.profile, null); + assert.deepEqual(user.attrs, { profileId: null }); +}); + +test('the child accepts a parent model and id', function(assert) { + let profile = this.helper.savedParent(); + let user = this.schema.users.new({ profile , profileId: profile.id }); + + assert.equal(user.profileId, '1'); + assert.deepEqual(user.profile, profile); + assert.deepEqual(user.attrs, { profileId: profile.id }); +}); + +test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let user = this.schema.users.new({}); + + assert.equal(user.profileId, null); + assert.deepEqual(user.profile, null); + assert.deepEqual(user.attrs, { profileId: null }); +}); + +test('the child accepts no reference to a parent id or model', function(assert) { + let user = this.schema.users.new(); + + assert.equal(user.profileId, null); + assert.deepEqual(user.profile, null); + assert.deepEqual(user.attrs, { profileId: null }); +}); diff --git a/tests/integration/orm/belongs-to/9-misc/misc-test.js b/tests/integration/orm/belongs-to/9-misc/misc-test.js new file mode 100644 index 000000000..3e0f370d3 --- /dev/null +++ b/tests/integration/orm/belongs-to/9-misc/misc-test.js @@ -0,0 +1,18 @@ +// import { Model, belongsTo } from 'ember-cli-mirage'; +// import Schema from 'ember-cli-mirage/orm/schema'; +// import Db from 'ember-cli-mirage/db'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Misc'); + +test('an ambiguous schema throws an error', function(assert) { + assert.ok(true); + // assert.throws(function() { + // new Schema(new Db(), { + // user: Model.extend({ + // foo: belongsTo('user'), + // bar: belongsTo('user') + // }) + // }); + // }, /You defined the 'foo' relationship on user, but multiple possible inverse relationships of type user exist. Please refer to the models documentation to learn how to explicitly specify inverses./); +}); diff --git a/tests/integration/orm/belongs-to/accessor-test.js b/tests/integration/orm/belongs-to/accessor-test.js deleted file mode 100644 index 1b9774fe3..000000000 --- a/tests/integration/orm/belongs-to/accessor-test.js +++ /dev/null @@ -1,53 +0,0 @@ -import BelongsToHelper from './belongs-to-helper'; -import Mirage from 'ember-cli-mirage'; -import Model from 'ember-cli-mirage/orm/model'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import {module, test} from 'qunit'; - -module('Integration | ORM | belongsTo #accessor', { - beforeEach() { - this.helper = new BelongsToHelper(); - } -}); - -/* - #association behavior works regardless of the state of the child -*/ - -[ - 'savedChildNoParent', - 'savedChildNewParent', - 'savedChildSavedParent', - 'newChildNoParent', - 'newChildNewParent', - 'newChildSavedParent' -].forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [address, user] = this.helper[state](); - - assert.deepEqual(address.user, user ? user : null, 'the model reference is correct'); - assert.equal(address.userId, user ? user.id : null, 'the modelId reference is correct'); - }); - -}); - -test('belongsTo accessors works when foreign key is present but falsy', function(assert) { - let db = new Db({ - users: [], - addresses: [] - }); - - let schema = new Schema(db, { - user: Model.extend(), - address: Model.extend({ - user: Mirage.belongsTo() - }) - }); - - db.users.insert({ id: 0, name: 'some user' }); - let insertedAddress = db.addresses.insert({ name: 'foo', userId: 0 }); - let relatedUser = schema.addresses.find(insertedAddress.id).user; - assert.equal('some user', relatedUser ? relatedUser.name : undefined); -}); diff --git a/tests/integration/orm/belongs-to/belongs-to-helper.js b/tests/integration/orm/belongs-to/belongs-to-helper.js deleted file mode 100644 index e1c709632..000000000 --- a/tests/integration/orm/belongs-to/belongs-to-helper.js +++ /dev/null @@ -1,91 +0,0 @@ -import Mirage from 'ember-cli-mirage'; -import Model from 'ember-cli-mirage/orm/model'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -/* - A model with a belongsTo association can be in six states - with respect to its association. This helper class - returns a child (and its association) in these various states. - - The return value is an array of the form - - [child, parent] - - where the parent may be undefined. -*/ -class BelongsToHelper { - - constructor() { - this.db = new Db(); - - this.schema = new Schema(this.db, { - user: Model.extend(), - address: Model.extend({ - user: Mirage.belongsTo() - }) - }); - } - - savedChildNoParent() { - let insertedAddress = this.db.addresses.insert({ name: 'foo' }); - - return [this.schema.addresses.find(insertedAddress.id), undefined]; - } - - savedChildNewParent() { - let insertedAddress = this.db.addresses.insert({ name: 'foo' }); - let address = this.schema.addresses.find(insertedAddress.id); - let user = this.schema.users.new({ name: 'Newbie' }); - - address.user = user; - - return [address, user]; - } - - savedChildSavedParent() { - let insertedUser = this.db.users.insert({ name: 'some user' }); - let insertedAddress = this.db.addresses.insert({ name: 'foo', userId: insertedUser.id }); - let address = this.schema.addresses.find(insertedAddress.id); - let user = this.schema.users.find(insertedUser.id); - - return [address, user]; - } - - newChildNoParent() { - return [this.schema.addresses.new({ name: 'New addr' }), undefined]; - } - - newChildNewParent() { - let address = this.schema.addresses.new({ name: 'New addr' }); - let newUser = this.schema.users.new({ name: 'Newbie' }); - address.user = newUser; - - return [address, newUser]; - } - - newChildSavedParent() { - let insertedUser = this.db.users.insert({ name: 'some user' }); - let address = this.schema.addresses.new({ name: 'New addr' }); - let savedUser = this.schema.users.find(insertedUser.id); - - address.user = savedUser; - - return [address, savedUser]; - } - - // Just a saved unassociated parent. The id is high so as not to - // interfere with any other parents - savedParent() { - let insertedUser = this.db.users.insert({ name: 'bar' }); - - return this.schema.users.find(insertedUser.id); - } - - newParent() { - return this.schema.users.new({ name: 'Newbie' }); - } - -} - -export default BelongsToHelper; diff --git a/tests/integration/orm/belongs-to/create-association-test.js b/tests/integration/orm/belongs-to/create-association-test.js deleted file mode 100644 index 9421ec9c7..000000000 --- a/tests/integration/orm/belongs-to/create-association-test.js +++ /dev/null @@ -1,34 +0,0 @@ -import BelongsToHelper from './belongs-to-helper'; -import {module, test} from 'qunit'; - -module('Integration | ORM | belongsTo #createAssociation', { - beforeEach() { - this.helper = new BelongsToHelper(); - } -}); - -/* - createAssociation behavior works regardless of the state of the child -*/ - -[ - 'savedChildNoParent', - 'savedChildNewParent', - 'savedChildSavedParent', - 'newChildNoParent', - 'newChildNewParent', - 'newChildSavedParent' -].forEach((state) => { - - test(`a ${state} can create an associated parent`, function(assert) { - let [address] = this.helper[state](); - - let ganon = address.createUser({ name: 'Ganon' }); - - assert.ok(ganon.id, 'the parent was persisted'); - assert.deepEqual(address.user, ganon); - assert.equal(address.userId, ganon.id); - assert.equal(this.helper.schema.addresses.find(address.id).userId, ganon.id, 'the child was persisted'); - }); - -}); diff --git a/tests/integration/orm/belongs-to/create-with-association-test.js b/tests/integration/orm/belongs-to/create-with-association-test.js deleted file mode 100644 index d9d9afffb..000000000 --- a/tests/integration/orm/belongs-to/create-with-association-test.js +++ /dev/null @@ -1,65 +0,0 @@ -import Mirage from 'ember-cli-mirage'; -import Model from 'ember-cli-mirage/orm/model'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import {module, test} from 'qunit'; - -module('Integration | ORM | belongsTo create with association', { - beforeEach() { - this.schema = new Schema(new Db(), { - user: Model.extend(), - address: Model.extend({ - user: Mirage.belongsTo() - }), - foo: Model - }); - } -}); - -test('it sets up associations correctly when passing in the foreign key', function(assert) { - let user = this.schema.create('user'); - let address = this.schema.create('address', { - userId: user.id - }); - - assert.equal(address.userId, user.id); - assert.deepEqual(address.user.attrs, user.attrs); - assert.equal(this.schema.db.users.length, 1); - assert.deepEqual(this.schema.db.users[0], { id: '1' }); - assert.equal(this.schema.db.addresses.length, 1); - assert.deepEqual(this.schema.db.addresses[0], { id: '1', userId: '1' }); -}); - -test('it sets up associations correctly when passing in the association itself', function(assert) { - let user = this.schema.create('user'); - let address = this.schema.create('address', { - user - }); - - assert.equal(address.userId, user.id); - assert.deepEqual(address.user.attrs, user.attrs); - assert.equal(this.schema.db.users.length, 1); - assert.deepEqual(this.schema.db.users[0], { id: '1' }); - assert.equal(this.schema.db.addresses.length, 1); - assert.deepEqual(this.schema.db.addresses[0], { id: '1', userId: '1' }); -}); - -test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let foo = this.schema.create('foo'); - assert.throws(function() { - this.schema.create('address', { - foo - }); - }, /you haven't defined that key as an association on your model/); -}); - -test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - this.schema.create('foo'); - this.schema.create('foo'); - - assert.throws(function() { - this.schema.create('address', { - foos: this.schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); -}); diff --git a/tests/integration/orm/belongs-to/instantiating-test.js b/tests/integration/orm/belongs-to/instantiating-test.js deleted file mode 100644 index 655693f6d..000000000 --- a/tests/integration/orm/belongs-to/instantiating-test.js +++ /dev/null @@ -1,101 +0,0 @@ -import Mirage from 'ember-cli-mirage'; -import Model from 'ember-cli-mirage/orm/model'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import {module, test} from 'qunit'; - -var schema, link; -module('Integration | ORM | belongsTo instantiating with params', { - beforeEach() { - let db = new Db({ - users: [ - { id: 1, name: 'Link' } - ], - addresses: [] - }); - - let User = Model.extend(); - let Address = Model.extend({ - user: Mirage.belongsTo() - }); - - schema = new Schema(db); - schema.registerModels({ - user: User, - address: Address - }); - - link = schema.users.find(1); - } -}); - -test('the child accepts a saved parents id', function(assert) { - let address = schema.addresses.new({ userId: 1 }); - - assert.equal(address.userId, 1); - assert.deepEqual(address.user, link); - assert.deepEqual(address.attrs, { userId: 1 }); -}); - -test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - schema.addresses.new({ userId: 2 }); - }, /Couldn't find user/); -}); - -test('the child accepts a null parent id', function(assert) { - let address = schema.addresses.new({ userId: null }); - - assert.equal(address.userId, null); - assert.deepEqual(address.user, null); - assert.deepEqual(address.attrs, { userId: null }); -}); - -test('the child accepts a saved parent model', function(assert) { - let address = schema.addresses.new({ user: link }); - - assert.equal(address.userId, 1); - assert.deepEqual(address.user, link); - assert.deepEqual(address.attrs, { userId: '1' }); -}); - -test('the child accepts a new parent model', function(assert) { - let zelda = schema.users.new({ name: 'Zelda' }); - let address = schema.addresses.new({ user: zelda }); - - assert.equal(address.userId, null); - assert.deepEqual(address.user, zelda); - assert.deepEqual(address.attrs, { userId: null }); -}); - -test('the child accepts a null parent model', function(assert) { - let address = schema.addresses.new({ user: null }); - - assert.equal(address.userId, null); - assert.deepEqual(address.user, null); - assert.deepEqual(address.attrs, { userId: null }); -}); - -test('the child accepts a parent model and id', function(assert) { - let address = schema.addresses.new({ user: link, userId: 1 }); - - assert.equal(address.userId, '1'); - assert.deepEqual(address.user, link); - assert.deepEqual(address.attrs, { userId: 1 }); -}); - -test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let address = schema.addresses.new({}); - - assert.equal(address.userId, null); - assert.deepEqual(address.user, null); - assert.deepEqual(address.attrs, { userId: null }); -}); - -test('the child accepts no reference to a parent id or model', function(assert) { - let address = schema.addresses.new(); - - assert.equal(address.userId, null); - assert.deepEqual(address.user, null); - assert.deepEqual(address.attrs, { userId: null }); -}); diff --git a/tests/integration/orm/belongs-to/new-association-test.js b/tests/integration/orm/belongs-to/new-association-test.js deleted file mode 100644 index b2ef7593d..000000000 --- a/tests/integration/orm/belongs-to/new-association-test.js +++ /dev/null @@ -1,38 +0,0 @@ -import BelongsToHelper from './belongs-to-helper'; -import {module, test} from 'qunit'; - -module('Integration | ORM | belongsTo #newAssociation', { - beforeEach() { - this.helper = new BelongsToHelper(); - } -}); - -/* - newAssociation behavior works regardless of the state of the child -*/ - -[ - 'savedChildNoParent', - 'savedChildNewParent', - 'savedChildSavedParent', - 'newChildNoParent', - 'newChildNewParent', - 'newChildSavedParent' -].forEach((state) => { - - test(`a ${state} can build a new associated parent`, function(assert) { - let [address] = this.helper[state](); - - let ganon = address.newUser({ name: 'Ganon' }); - - assert.ok(!ganon.id, 'the parent was not persisted'); - assert.deepEqual(address.user, ganon); - assert.equal(address.userId, null); - - address.save(); - - assert.ok(ganon.id, 'saving the child persists the parent'); - assert.equal(address.userId, ganon.id, 'the childs fk was updated'); - }); - -}); diff --git a/tests/integration/orm/belongs-to/notes.md b/tests/integration/orm/belongs-to/notes.md new file mode 100644 index 000000000..5785341ae --- /dev/null +++ b/tests/integration/orm/belongs-to/notes.md @@ -0,0 +1,43 @@ +A belongsTo relationship has the following possible schemas. For each schema, the child model can be in six states with respect to its parent: + + - the child can be saved and the parent can be one of: undefined, new or saved + + - the child can be new and the parent can be one of: undefined, new or saved + +This is how the tests in this directory are organized. + +# belongsTo +Given Post, Author models +For the Post model + +## basic +author: belongsTo() + +## named +writer: belongsTo('author') + +## reflexive, one-way +post: belongsTo() + +## named reflexive +childPost: belongsTo('post') + +## inverse (implicit) +author: belongsTo() + +(author) +posts: hasMany() + +## inverse (explicit) +author: belongsTo('author', { inverse: 'redPosts' }) + +(author) +posts: hasMany('post', { inverse: 'author' }) +drafts: hasMany('post') + +## multiple (conflict) +primaryAuthor: belongsTo('author') +secondaryAuthor: belongsTo('author') + +(author) +posts: hasMany() diff --git a/tests/integration/orm/belongs-to/set-association-id-test.js b/tests/integration/orm/belongs-to/set-association-id-test.js deleted file mode 100644 index e1c265c9d..000000000 --- a/tests/integration/orm/belongs-to/set-association-id-test.js +++ /dev/null @@ -1,46 +0,0 @@ -import BelongsToHelper from './belongs-to-helper'; -import {module, test} from 'qunit'; - -module('Integration | ORM | belongsTo #setAssociationId', { - beforeEach() { - this.helper = new BelongsToHelper(); - } -}); - -[ - 'savedChildNoParent', - 'savedChildNewParent', - 'savedChildSavedParent', - 'newChildNoParent', - 'newChildNewParent', - 'newChildSavedParent' -].forEach((state) => { - - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [address] = this.helper[state](); - let savedUser = this.helper.savedParent(); - - address.userId = savedUser.id; - - assert.equal(address.userId, savedUser.id); - assert.deepEqual(address.user, savedUser); - }); - -}); - -[ - 'savedChildSavedParent', - 'newChildSavedParent' -].forEach((state) => { - - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [address] = this.helper[state](); - - address.userId = null; - - assert.equal(address.userId, null); - assert.deepEqual(address.user, null); - }); - -}); - diff --git a/tests/integration/orm/belongs-to/set-association-test.js b/tests/integration/orm/belongs-to/set-association-test.js deleted file mode 100644 index 0b36a2310..000000000 --- a/tests/integration/orm/belongs-to/set-association-test.js +++ /dev/null @@ -1,48 +0,0 @@ -import BelongsToHelper from './belongs-to-helper'; -import {module, test} from 'qunit'; - -module('Integration | ORM | belongsTo #setAssociation', { - beforeEach() { - this.helper = new BelongsToHelper(); - } -}); - -[ - 'savedChildNoParent', - 'savedChildNewParent', - 'savedChildSavedParent', - 'newChildNoParent', - 'newChildNewParent', - 'newChildSavedParent' -].forEach((state) => { - - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [address] = this.helper[state](); - let savedUser = this.helper.savedParent(); - - address.user = savedUser; - - assert.equal(address.userId, savedUser.id); - assert.deepEqual(address.user, savedUser); - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [address] = this.helper[state](); - let newUser = this.helper.newParent(); - - address.user = newUser; - - assert.equal(address.userId, null); - assert.deepEqual(address.user, newUser); - }); - - test(`a ${state} can update its association to a null parent`, function(assert) { - let [address] = this.helper[state](); - - address.user = null; - - assert.equal(address.userId, null); - assert.deepEqual(address.user, null); - }); - -}); diff --git a/tests/integration/orm/has-many/1-basic/_helper.js b/tests/integration/orm/has-many/1-basic/_helper.js new file mode 100644 index 000000000..da1d233b7 --- /dev/null +++ b/tests/integration/orm/has-many/1-basic/_helper.js @@ -0,0 +1,124 @@ +import { Model, hasMany } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +/* + A model with a hasMany association can be in eight states + with respect to its association. This helper class + returns a parent (and its children) in these various states. + + The return value is an array of the form + + [ parent, [child1, child2...] ] + + where the children array may be empty. +*/ +export default class Helper { + + constructor() { + this.db = new Db(); + + this.schema = new Schema(this.db, { + user: Model.extend({ + posts: hasMany() + }), + post: Model + }); + } + + savedParentNoChildren() { + let user = this.db.users.insert({ name: 'Link' }); + + return [ this.schema.users.find(user.id), [] ]; + } + + savedParentNewChildren() { + let user = this.schema.users.create({ name: 'Link' }); + let post1 = this.schema.posts.new({ title: 'Lorem' }); + let post2 = this.schema.posts.new({ title: 'Ipsum' }); + + user.posts = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + savedParentSavedChildren() { + let user = this.schema.users.create({ name: 'Link' }); + let post1 = this.schema.posts.create({ title: 'Lorem' }); + let post2 = this.schema.posts.create({ title: 'Ipsum' }); + + user.posts = [ post1, post2 ]; + user.save(); + + return [ user, [ post1, post2 ] ]; + } + + savedParentMixedChildren() { + let user = this.schema.users.create({ name: 'Link' }); + let post1 = this.schema.posts.create({ title: 'Lorem' }); + let post2 = this.schema.posts.new({ title: 'Ipsum' }); + + user.posts = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + newParentNoChildren() { + let user = this.schema.users.new({ name: 'Link' }); + + return [ user, [] ]; + } + + newParentNewChildren() { + let user = this.schema.users.new({ name: 'Link' }); + let post1 = this.schema.posts.new({ title: 'Lorem' }); + let post2 = this.schema.posts.new({ title: 'Ipsum' }); + + user.posts = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + newParentSavedChildren() { + let user = this.schema.users.new({ name: 'Link' }); + let post1 = this.schema.posts.create({ title: 'Lorem' }); + let post2 = this.schema.posts.create({ title: 'Ipsum' }); + + user.posts = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + newParentMixedChildren() { + let user = this.schema.users.new({ name: 'Link' }); + let post1 = this.schema.posts.create({ title: 'Lorem' }); + let post2 = this.schema.posts.new({ title: 'Ipsum' }); + + user.posts = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + // Unassociated child models, used for setting tests + savedChild() { + let insertedPost = this.db.posts.insert({ title: 'Lorem' }); + + return this.schema.posts.find(insertedPost.id); + } + + newChild() { + return this.schema.posts.new({ title: 'Lorem' }); + } + +} + +export const states = [ + 'savedParentNoChildren', + 'savedParentNewChildren', + 'savedParentSavedChildren', + 'savedParentMixedChildren', + 'newParentNoChildren', + 'newParentNewChildren', + 'newParentSavedChildren', + 'newParentMixedChildren' +]; diff --git a/tests/integration/orm/has-many/1-basic/accessor-test.js b/tests/integration/orm/has-many/1-basic/accessor-test.js new file mode 100644 index 000000000..cb963e3b1 --- /dev/null +++ b/tests/integration/orm/has-many/1-basic/accessor-test.js @@ -0,0 +1,30 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Basic | accessor', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The reference to a belongs-to association is correct, for all states +*/ +states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ user, posts ] = this.helper[state](); + + assert.equal(user.posts.models.length, posts.length, 'the parent has the correct number of children'); + assert.equal(user.postIds.length, posts.length, 'the parent has the correct number of children ids'); + + posts.forEach((post, i) => { + assert.deepEqual(user.posts.models[i], posts[i], 'each child is in parent.children array'); + + if (post.isSaved()) { + assert.ok(user.postIds.indexOf(post.id) > -1, 'each saved child id is in parent.childrenIds array'); + } + }); + }); + +}); diff --git a/tests/integration/orm/has-many/1-basic/association-create-test.js b/tests/integration/orm/has-many/1-basic/association-create-test.js new file mode 100644 index 000000000..a90641f16 --- /dev/null +++ b/tests/integration/orm/has-many/1-basic/association-create-test.js @@ -0,0 +1,28 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Basic | association #create', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can create a has-many association, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.posts.models.length; + + let post = user.createPost({ title: 'Lorem ipsum' }); + + assert.ok(post.id, 'the child was persisted'); + assert.equal(user.posts.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.posts.includes(post), 'the model was added to user.posts'); + assert.ok(user.postIds.indexOf(post.id) > -1, 'the id was added to the fks array'); + assert.ok(user.attrs.postIds.indexOf(post.id) > -1, 'fks were persisted'); + }); + +}); diff --git a/tests/integration/orm/has-many/1-basic/association-new-test.js b/tests/integration/orm/has-many/1-basic/association-new-test.js new file mode 100644 index 000000000..d2d48617b --- /dev/null +++ b/tests/integration/orm/has-many/1-basic/association-new-test.js @@ -0,0 +1,33 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Basic | association #new', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can make a new unsaved belongs-to association, for all states +*/ + +states.forEach((state) => { + + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.posts.models.length; + + let post = user.newPost({ title: 'Lorem ipsum' }); + + assert.ok(!post.id, 'the child was not persisted'); + assert.equal(user.posts.models.length, initialCount + 1); + + post.save(); + + assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum' }, 'the child was persisted'); + assert.equal(user.posts.models.length, initialCount + 1, 'the collection size was increased'); + assert.deepEqual(user.posts.models.filter((a) => a.id === post.id)[0], post, 'the model was added to user.posts'); + assert.ok(user.postIds.indexOf(post.id) > -1, 'the id was added to the fks array'); + }); + +}); diff --git a/tests/integration/orm/has-many/1-basic/association-set-ids-test.js b/tests/integration/orm/has-many/1-basic/association-set-ids-test.js new file mode 100644 index 000000000..0d6526ba6 --- /dev/null +++ b/tests/integration/orm/has-many/1-basic/association-set-ids-test.js @@ -0,0 +1,34 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Basic | association #setIds', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parentId, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user ] = this.helper[state](); + let savedPost = this.helper.savedChild(); + + user.postIds = [ savedPost.id ]; + + assert.deepEqual(user.posts.models[0].attrs, savedPost.attrs); + assert.deepEqual(user.postIds, [ savedPost.id ]); + }); + + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ user ] = this.helper[state](); + + user.postIds = null; + + assert.deepEqual(user.posts.models, []); + assert.deepEqual(user.postIds, []); + }); + +}); diff --git a/tests/integration/orm/has-many/1-basic/association-set-test.js b/tests/integration/orm/has-many/1-basic/association-set-test.js new file mode 100644 index 000000000..94966d6c3 --- /dev/null +++ b/tests/integration/orm/has-many/1-basic/association-set-test.js @@ -0,0 +1,53 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Basic | association #set', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parent, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ user ] = this.helper[state](); + let savedPost = this.helper.savedChild(); + + user.posts = [ savedPost ]; + + assert.ok(user.posts.models.indexOf(savedPost) > -1); + assert.ok(user.postIds.indexOf(savedPost.id) > -1); + }); + + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user ] = this.helper[state](); + let newPost = this.helper.newChild(); + + user.posts = [ newPost ]; + + assert.deepEqual(user.postIds, [ undefined ]); + assert.deepEqual(user.posts.models[0], newPost); + }); + + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user ] = this.helper[state](); + + user.posts = [ ]; + + assert.deepEqual(user.postIds, [ ]); + assert.equal(user.posts.models.length, 0); + }); + + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user ] = this.helper[state](); + + user.posts = null; + + assert.deepEqual(user.postIds, [ ]); + assert.equal(user.posts.models.length, 0); + }); + +}); diff --git a/tests/integration/orm/has-many/1-basic/create-test.js b/tests/integration/orm/has-many/1-basic/create-test.js new file mode 100644 index 000000000..d95cf7fd2 --- /dev/null +++ b/tests/integration/orm/has-many/1-basic/create-test.js @@ -0,0 +1,87 @@ +import Helper from './_helper'; +import { Model } from 'ember-cli-mirage'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Basic | create', { + beforeEach() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + } +}); + +test('it sets up associations correctly when passing in the foreign key', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + postIds: [ post.id ] + }); + + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.attrs.postIds, [ post.id ], 'the ids were persisted'); + assert.deepEqual(user.posts.models[0].attrs, post.attrs); + assert.equal(this.helper.db.posts.length, 1); + assert.deepEqual(this.helper.db.posts[0], { id: '1' }); + assert.equal(this.helper.db.users.length, 1); + assert.deepEqual(this.helper.db.users[0], { id: '1', postIds: [ '1' ] }); +}); + +test('it sets up associations correctly when passing in an array of models', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + posts: [ post ] + }); + + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.attrs.postIds, [ post.id ], 'the ids were persisted'); + assert.deepEqual(user.posts.models[0].attrs, post.attrs); + assert.equal(this.helper.db.posts.length, 1); + assert.deepEqual(this.helper.db.posts[0], { id: '1' }); + assert.equal(this.helper.db.users.length, 1); + assert.deepEqual(this.helper.db.users[0], { id: '1', postIds: [ '1' ] }); +}); + +test('it sets up associations correctly when passing in a collection', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + posts: this.helper.schema.posts.all() + }); + + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.attrs.postIds, [ post.id ], 'the ids were persisted'); + assert.deepEqual(user.posts.models[0].attrs, post.attrs); + assert.equal(this.helper.db.posts.length, 1); + assert.deepEqual(this.helper.db.posts[0], { id: '1' }); + assert.equal(this.helper.db.users.length, 1); + assert.deepEqual(this.helper.db.users[0], { id: '1', postIds: [ '1' ] }); +}); + +test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('user', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('user', { + foos: [ schema.create('foo') ] + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); + + assert.throws(function() { + schema.create('post', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); +}); diff --git a/tests/integration/orm/has-many/1-basic/delete-test.js b/tests/integration/orm/has-many/1-basic/delete-test.js new file mode 100644 index 000000000..1b75534ee --- /dev/null +++ b/tests/integration/orm/has-many/1-basic/delete-test.js @@ -0,0 +1,24 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Basic | delete', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ user, posts ] = this.helper[state](); + + if (posts && posts.length) { + posts.forEach(p => p.destroy()); + user.reload(); + } + + assert.equal(user.posts.length, 0); + assert.equal(user.postIds.length, 0); + }); + +}); diff --git a/tests/integration/orm/has-many/1-basic/instantiating-test.js b/tests/integration/orm/has-many/1-basic/instantiating-test.js new file mode 100644 index 000000000..8b470b9b4 --- /dev/null +++ b/tests/integration/orm/has-many/1-basic/instantiating-test.js @@ -0,0 +1,81 @@ +import Helper from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Basic | instantiating', { + beforeEach() { + this.helper = new Helper(); + this.schema = this.helper.schema; + } +}); + +test('the parent accepts a saved child id', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ + postIds: [ post.id ] + }); + + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.posts.models[0], post); +}); + +test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ postIds: [ 2 ] }); + }, /You're instantiating a user that has a postIds of 2, but some of those records don't exist in the database/); +}); + +test('the parent accepts null children foreign key', function(assert) { + let user = this.schema.users.new({ postIds: null }); + + assert.equal(user.posts.models.length, 0); + assert.deepEqual(user.postIds, []); + assert.deepEqual(user.attrs, { postIds: null }); +}); + +test('the parent accepts saved children', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ posts: [ post ] }); + + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.posts.models[0], post); +}); + +test('the parent accepts new children', function(assert) { + let post = this.schema.posts.new({ title: 'Lorem' }); + let user = this.schema.users.new({ posts: [ post ] }); + + assert.deepEqual(user.postIds, [ undefined ]); + assert.deepEqual(user.posts.models[0], post); +}); + +test('the parent accepts null children', function(assert) { + let user = this.schema.users.new({ posts: null }); + + assert.equal(user.posts.models.length, 0); + assert.deepEqual(user.postIds, []); + assert.deepEqual(user.attrs, { postIds: null }); +}); + +test('the parent accepts children and child ids', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ posts: [ post ], postIds: [ post.id ] }); + + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.posts.models[0], post); +}); + +test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let user = this.schema.users.new({}); + + assert.deepEqual(user.postIds, []); + assert.deepEqual(user.posts.models, []); + assert.deepEqual(user.attrs, { postIds: null }); +}); + +test('the parent accepts no reference to children or child ids', function(assert) { + let user = this.schema.users.new(); + + assert.deepEqual(user.postIds, []); + assert.deepEqual(user.posts.models, []); + assert.deepEqual(user.attrs, { postIds: null }); +}); diff --git a/tests/integration/orm/has-many/2-named/_helper.js b/tests/integration/orm/has-many/2-named/_helper.js new file mode 100644 index 000000000..6fdc8e029 --- /dev/null +++ b/tests/integration/orm/has-many/2-named/_helper.js @@ -0,0 +1,123 @@ +import { Model, hasMany } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +/* + A model with a hasMany association can be in eight states + with respect to its association. This helper class + returns a parent (and its children) in these various states. + + The return value is an array of the form + + [ parent, [child1, child2...] ] + + where the children array may be empty. +*/ +export default class Helper { + + constructor() { + this.db = new Db(); + + this.schema = new Schema(this.db, { + user: Model.extend({ + blogPosts: hasMany('post') + }), + post: Model + }); + } + + savedParentNoChildren() { + let user = this.db.users.insert({ name: 'Link' }); + + return [ this.schema.users.find(user.id), [] ]; + } + + savedParentNewChildren() { + let user = this.schema.users.create({ name: 'Link' }); + let post1 = this.schema.posts.new({ title: 'Lorem' }); + let post2 = this.schema.posts.new({ title: 'Ipsum' }); + + user.blogPosts = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + savedParentSavedChildren() { + let user = this.schema.users.create({ name: 'Link' }); + let post1 = this.schema.posts.create({ title: 'Lorem' }); + let post2 = this.schema.posts.create({ title: 'Ipsum' }); + + user.blogPosts = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + savedParentMixedChildren() { + let user = this.schema.users.create({ name: 'Link' }); + let post1 = this.schema.posts.create({ title: 'Lorem' }); + let post2 = this.schema.posts.new({ title: 'Ipsum' }); + + user.blogPosts = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + newParentNoChildren() { + let user = this.schema.users.new({ name: 'Link' }); + + return [ user, [] ]; + } + + newParentNewChildren() { + let user = this.schema.users.new({ name: 'Link' }); + let post1 = this.schema.posts.new({ title: 'Lorem' }); + let post2 = this.schema.posts.new({ title: 'Ipsum' }); + + user.blogPosts = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + newParentSavedChildren() { + let user = this.schema.users.new({ name: 'Link' }); + let post1 = this.schema.posts.create({ title: 'Lorem' }); + let post2 = this.schema.posts.create({ title: 'Ipsum' }); + + user.blogPosts = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + newParentMixedChildren() { + let user = this.schema.users.new({ name: 'Link' }); + let post1 = this.schema.posts.create({ title: 'Lorem' }); + let post2 = this.schema.posts.new({ title: 'Ipsum' }); + + user.blogPosts = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + // Unassociated child models, used for setting tests + savedChild() { + let insertedPost = this.db.posts.insert({ title: 'Lorem' }); + + return this.schema.posts.find(insertedPost.id); + } + + newChild() { + return this.schema.posts.new({ title: 'Lorem' }); + } + +} + +export const states = [ + 'savedParentNoChildren', + 'savedParentNewChildren', + 'savedParentSavedChildren', + 'savedParentMixedChildren', + 'newParentNoChildren', + 'newParentNewChildren', + 'newParentSavedChildren', + 'newParentMixedChildren' +]; diff --git a/tests/integration/orm/has-many/2-named/accessor-test.js b/tests/integration/orm/has-many/2-named/accessor-test.js new file mode 100644 index 000000000..c98eb085c --- /dev/null +++ b/tests/integration/orm/has-many/2-named/accessor-test.js @@ -0,0 +1,30 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named | accessor', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The reference to a belongs-to association is correct, for all states +*/ +states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ user, posts ] = this.helper[state](); + + assert.equal(user.blogPosts.models.length, posts.length, 'the parent has the correct number of children'); + assert.equal(user.blogPostIds.length, posts.length, 'the parent has the correct number of children ids'); + + posts.forEach((post, i) => { + assert.deepEqual(user.blogPosts.models[i], posts[i], 'each child is in parent.children array'); + + if (post.isSaved()) { + assert.ok(user.blogPostIds.indexOf(post.id) > -1, 'each saved child id is in parent.childrenIds array'); + } + }); + }); + +}); diff --git a/tests/integration/orm/has-many/2-named/association-create-test.js b/tests/integration/orm/has-many/2-named/association-create-test.js new file mode 100644 index 000000000..24244d7c4 --- /dev/null +++ b/tests/integration/orm/has-many/2-named/association-create-test.js @@ -0,0 +1,28 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named | association #create', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can create a has-many association, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.blogPosts.models.length; + + let post = user.createBlogPost({ title: 'Lorem ipsum' }); + + assert.ok(post.id, 'the child was persisted'); + assert.equal(user.blogPosts.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.blogPosts.includes(post), 'the model was added to user.blogPosts'); + assert.ok(user.blogPostIds.indexOf(post.id) > -1, 'the id was added to the fks array'); + assert.ok(user.attrs.blogPostIds.indexOf(post.id) > -1, 'fks were persisted'); + }); + +}); diff --git a/tests/integration/orm/has-many/2-named/association-new-test.js b/tests/integration/orm/has-many/2-named/association-new-test.js new file mode 100644 index 000000000..19022bf45 --- /dev/null +++ b/tests/integration/orm/has-many/2-named/association-new-test.js @@ -0,0 +1,33 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named | association #new', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can make a new unsaved belongs-to association, for all states +*/ + +states.forEach((state) => { + + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.blogPosts.models.length; + + let post = user.newBlogPost({ title: 'Lorem ipsum' }); + + assert.ok(!post.id, 'the child was not persisted'); + assert.equal(user.blogPosts.models.length, initialCount + 1); + + post.save(); + + assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum' }, 'the child was persisted'); + assert.equal(user.blogPosts.models.length, initialCount + 1, 'the collection size was increased'); + assert.deepEqual(user.blogPosts.models.filter((a) => a.id === post.id)[0], post, 'the model was added to user.blogPosts'); + assert.ok(user.blogPostIds.indexOf(post.id) > -1, 'the id was added to the fks array'); + }); + +}); diff --git a/tests/integration/orm/has-many/2-named/association-set-ids-test.js b/tests/integration/orm/has-many/2-named/association-set-ids-test.js new file mode 100644 index 000000000..7ef39eb44 --- /dev/null +++ b/tests/integration/orm/has-many/2-named/association-set-ids-test.js @@ -0,0 +1,34 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named | association #setIds', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parentId, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user ] = this.helper[state](); + let savedPost = this.helper.savedChild(); + + user.blogPostIds = [ savedPost.id ]; + + assert.deepEqual(user.blogPosts.models[0].attrs, savedPost.attrs); + assert.deepEqual(user.blogPostIds, [ savedPost.id ]); + }); + + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ user ] = this.helper[state](); + + user.blogPostIds = null; + + assert.deepEqual(user.blogPosts.models, []); + assert.deepEqual(user.blogPostIds, []); + }); + +}); diff --git a/tests/integration/orm/has-many/2-named/association-set-test.js b/tests/integration/orm/has-many/2-named/association-set-test.js new file mode 100644 index 000000000..0df02e76b --- /dev/null +++ b/tests/integration/orm/has-many/2-named/association-set-test.js @@ -0,0 +1,53 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named | association #set', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parent, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ user ] = this.helper[state](); + let savedPost = this.helper.savedChild(); + + user.blogPosts = [ savedPost ]; + + assert.ok(user.blogPosts.models.indexOf(savedPost) > -1); + assert.ok(user.blogPostIds.indexOf(savedPost.id) > -1); + }); + + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user ] = this.helper[state](); + let newPost = this.helper.newChild(); + + user.blogPosts = [ newPost ]; + + assert.deepEqual(user.blogPostIds, [ undefined ]); + assert.deepEqual(user.blogPosts.models[0], newPost); + }); + + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user ] = this.helper[state](); + + user.blogPosts = [ ]; + + assert.deepEqual(user.blogPostIds, [ ]); + assert.equal(user.blogPosts.models.length, 0); + }); + + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user ] = this.helper[state](); + + user.blogPosts = null; + + assert.deepEqual(user.blogPostIds, [ ]); + assert.equal(user.blogPosts.models.length, 0); + }); + +}); diff --git a/tests/integration/orm/has-many/2-named/create-test.js b/tests/integration/orm/has-many/2-named/create-test.js new file mode 100644 index 000000000..782e25a25 --- /dev/null +++ b/tests/integration/orm/has-many/2-named/create-test.js @@ -0,0 +1,87 @@ +import Helper from './_helper'; +import { Model } from 'ember-cli-mirage'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named | create', { + beforeEach() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + } +}); + +test('it sets up associations correctly when passing in the foreign key', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + blogPostIds: [ post.id ] + }); + + assert.deepEqual(user.blogPostIds, [ post.id ]); + assert.deepEqual(user.attrs.blogPostIds, [ post.id ], 'the ids were persisted'); + assert.deepEqual(user.blogPosts.models[0].attrs, post.attrs); + assert.equal(this.helper.db.posts.length, 1); + assert.deepEqual(this.helper.db.posts[0], { id: '1' }); + assert.equal(this.helper.db.users.length, 1); + assert.deepEqual(this.helper.db.users[0], { id: '1', blogPostIds: [ '1' ] }); +}); + +test('it sets up associations correctly when passing in an array of models', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + blogPosts: [ post ] + }); + + assert.deepEqual(user.blogPostIds, [ post.id ]); + assert.deepEqual(user.attrs.blogPostIds, [ post.id ], 'the ids were persisted'); + assert.deepEqual(user.blogPosts.models[0].attrs, post.attrs); + assert.equal(this.helper.db.posts.length, 1); + assert.deepEqual(this.helper.db.posts[0], { id: '1' }); + assert.equal(this.helper.db.users.length, 1); + assert.deepEqual(this.helper.db.users[0], { id: '1', blogPostIds: [ '1' ] }); +}); + +test('it sets up associations correctly when passing in a collection', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + blogPosts: this.helper.schema.posts.all() + }); + + assert.deepEqual(user.blogPostIds, [ post.id ]); + assert.deepEqual(user.attrs.blogPostIds, [ post.id ], 'the ids were persisted'); + assert.deepEqual(user.blogPosts.models[0].attrs, post.attrs); + assert.equal(this.helper.db.posts.length, 1); + assert.deepEqual(this.helper.db.posts[0], { id: '1' }); + assert.equal(this.helper.db.users.length, 1); + assert.deepEqual(this.helper.db.users[0], { id: '1', blogPostIds: [ '1' ] }); +}); + +test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('user', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('user', { + foos: [ schema.create('foo') ] + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); + + assert.throws(function() { + schema.create('post', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); +}); diff --git a/tests/integration/orm/has-many/2-named/delete-test.js b/tests/integration/orm/has-many/2-named/delete-test.js new file mode 100644 index 000000000..6dc814ae8 --- /dev/null +++ b/tests/integration/orm/has-many/2-named/delete-test.js @@ -0,0 +1,24 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named | delete', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ user, blogPosts ] = this.helper[state](); + + if (blogPosts && blogPosts.length) { + blogPosts.forEach(p => p.destroy()); + user.reload(); + } + + assert.equal(user.blogPosts.length, 0); + assert.equal(user.blogPostIds.length, 0); + }); + +}); diff --git a/tests/integration/orm/has-many/2-named/instantiating-test.js b/tests/integration/orm/has-many/2-named/instantiating-test.js new file mode 100644 index 000000000..f2e1e2cf2 --- /dev/null +++ b/tests/integration/orm/has-many/2-named/instantiating-test.js @@ -0,0 +1,81 @@ +import Helper from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named | instantiating', { + beforeEach() { + this.helper = new Helper(); + this.schema = this.helper.schema; + } +}); + +test('the parent accepts a saved child id', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ + blogPostIds: [ post.id ] + }); + + assert.deepEqual(user.blogPostIds, [ post.id ]); + assert.deepEqual(user.blogPosts.models[0], post); +}); + +test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ blogPostIds: [ 2 ] }); + }, /You're instantiating a user that has a blogPostIds of 2, but some of those records don't exist in the database/); +}); + +test('the parent accepts null children foreign key', function(assert) { + let user = this.schema.users.new({ blogPostIds: null }); + + assert.equal(user.blogPosts.models.length, 0); + assert.deepEqual(user.blogPostIds, []); + assert.deepEqual(user.attrs, { blogPostIds: null }); +}); + +test('the parent accepts saved children', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ blogPosts: [ post ] }); + + assert.deepEqual(user.blogPostIds, [ post.id ]); + assert.deepEqual(user.blogPosts.models[0], post); +}); + +test('the parent accepts new children', function(assert) { + let post = this.schema.posts.new({ title: 'Lorem' }); + let user = this.schema.users.new({ blogPosts: [ post ] }); + + assert.deepEqual(user.blogPostIds, [ undefined ]); + assert.deepEqual(user.blogPosts.models[0], post); +}); + +test('the parent accepts null children', function(assert) { + let user = this.schema.users.new({ blogPosts: null }); + + assert.equal(user.blogPosts.models.length, 0); + assert.deepEqual(user.blogPostIds, []); + assert.deepEqual(user.attrs, { blogPostIds: null }); +}); + +test('the parent accepts children and child ids', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ blogPosts: [ post ], blogPostIds: [ post.id ] }); + + assert.deepEqual(user.blogPostIds, [ post.id ]); + assert.deepEqual(user.blogPosts.models[0], post); +}); + +test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let user = this.schema.users.new({}); + + assert.deepEqual(user.blogPostIds, []); + assert.deepEqual(user.blogPosts.models, []); + assert.deepEqual(user.attrs, { blogPostIds: null }); +}); + +test('the parent accepts no reference to children or child ids', function(assert) { + let user = this.schema.users.new(); + + assert.deepEqual(user.blogPostIds, []); + assert.deepEqual(user.blogPosts.models, []); + assert.deepEqual(user.attrs, { blogPostIds: null }); +}); diff --git a/tests/integration/orm/has-many/3-reflexive/_helper.js b/tests/integration/orm/has-many/3-reflexive/_helper.js new file mode 100644 index 000000000..f1390b5cd --- /dev/null +++ b/tests/integration/orm/has-many/3-reflexive/_helper.js @@ -0,0 +1,127 @@ +import { Model, hasMany } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +/* + A model with a hasMany association can be in eight states + with respect to its association. This helper class + returns a parent (and its children) in these various states. + + The return value is an array of the form + + [ parent, [child1, child2...] ] + + where the children array may be empty. +*/ +export default class Helper { + + constructor() { + this.db = new Db(); + + this.schema = new Schema(this.db, { + tag: Model.extend({ + tags: hasMany() // implicit inverse + }) + }); + } + + savedParentNoChildren() { + let tag = this.db.tags.insert({ name: 'Red' }); + + return [ this.schema.tags.find(tag.id), [] ]; + } + + savedParentNewChildren() { + let tag = this.schema.tags.create({ name: 'Red' }); + let tag1 = this.schema.tags.new({ name: 'Blue' }); + let tag2 = this.schema.tags.new({ name: 'Green' }); + + tag.tags = [ tag1, tag2 ]; + + return [ tag, [ tag1, tag2 ] ]; + } + + savedParentSavedChildren() { + let { schema } = this; + schema.db.tags.insert([ + { id: '1', name: 'Red', tagIds: ['2', '3'] }, + { id: '2', name: 'Blue', tagIds: ['1'] }, + { id: '3', name: 'Green', tagIds: ['1'] } + ]); + + return [ schema.tags.find(1), [ schema.tags.find(2), schema.tags.find(3) ] ]; + } + + savedParentMixedChildren() { + this.schema.db.tags.insert([ + { id: '1', name: 'Red', tagIds: ['2'] }, + { id: '2', name: 'Blue', tagIds: ['1'] } + ]); + let tag = this.schema.tags.find(1); + let blueTag = this.schema.tags.find(2); + let greenTag = this.schema.tags.new({ name: 'Green' }); + + tag.tags = [ blueTag, greenTag ]; + + return [ tag, [ blueTag, greenTag ] ]; + } + + newParentNoChildren() { + let tag = this.schema.tags.new({ name: 'Red' }); + + return [ tag, [] ]; + } + + newParentNewChildren() { + let tag = this.schema.tags.new({ name: 'Red' }); + let tag1 = this.schema.tags.new({ name: 'Blue' }); + let tag2 = this.schema.tags.new({ name: 'Green' }); + + tag.tags = [ tag1, tag2 ]; + + return [ tag, [ tag1, tag2 ] ]; + } + + newParentSavedChildren() { + let tag = this.schema.tags.new({ name: 'Red' }); + let tag1 = this.schema.tags.create({ name: 'Blue' }); + let tag2 = this.schema.tags.create({ name: 'Green' }); + + tag.tags = [ tag1, tag2 ]; + + return [ tag, [ tag1, tag2 ] ]; + } + + newParentMixedChildren() { + let tag = this.schema.tags.new({ name: 'Red' }); + let tag1 = this.schema.tags.create({ name: 'Blue' }); + let tag2 = this.schema.tags.new({ name: 'Green' }); + + tag.tags = [ tag1, tag2 ]; + + return [ tag, [ tag1, tag2 ] ]; + } + + // Unassociated child models, used for setting tests + savedChild() { + let insertedTag = this.db.tags.insert({ name: 'Blue' }); + + return this.schema.tags.find(insertedTag.id); + } + + newChild() { + return this.schema.tags.new({ name: 'Blue' }); + } + +} + +export const states = [ + 'savedParentNoChildren', + 'savedParentNewChildren', + 'savedParentMixedChildren', + 'savedParentSavedChildren', + 'newParentNoChildren', + 'newParentNewChildren', + 'newParentSavedChildren', + 'newParentMixedChildren' +]; diff --git a/tests/integration/orm/has-many/3-reflexive/accessor-test.js b/tests/integration/orm/has-many/3-reflexive/accessor-test.js new file mode 100644 index 000000000..0e8a6860f --- /dev/null +++ b/tests/integration/orm/has-many/3-reflexive/accessor-test.js @@ -0,0 +1,30 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Reflexive | accessor', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ tag, tags ] = this.helper[state](); + + assert.equal(tag.tags.models.length, tags.length, 'the parent has the correct number of children'); + assert.equal(tag.tagIds.length, tags.length, 'the parent has the correct number of children ids'); + + tags.forEach((t, i) => { + assert.deepEqual(tag.tags.models[i], t, 'each child is in parent.children array'); + + if (t.isSaved()) { + assert.ok(tag.tagIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); + } + + // Check the inverse + assert.ok(t.tags.includes(tag)); + }); + }); + +}); diff --git a/tests/integration/orm/has-many/3-reflexive/association-create-test.js b/tests/integration/orm/has-many/3-reflexive/association-create-test.js new file mode 100644 index 000000000..efe0b11da --- /dev/null +++ b/tests/integration/orm/has-many/3-reflexive/association-create-test.js @@ -0,0 +1,29 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Reflexive | association #create', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can create a has-many association, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can create an associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.tags.models.length; + + let orangeTag = tag.createTag({ name: 'Orange' }); + + assert.ok(orangeTag.id, 'the child was persisted'); + assert.equal(tag.tags.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.tags.includes(orangeTag), 'the model was added to tag.tags'); + assert.ok(tag.tagIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); + assert.ok(tag.attrs.tagIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); + assert.ok(orangeTag.tags.includes(tag), 'the inverse was set'); + }); + +}); diff --git a/tests/integration/orm/has-many/3-reflexive/association-new-test.js b/tests/integration/orm/has-many/3-reflexive/association-new-test.js new file mode 100644 index 000000000..64d4e2480 --- /dev/null +++ b/tests/integration/orm/has-many/3-reflexive/association-new-test.js @@ -0,0 +1,35 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Reflexive | association #new', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can make a new unsaved belongs-to association, for all states +*/ + +states.forEach((state) => { + + test(`a ${state} can build a new associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.tags.models.length; + + let blueTag = tag.newTag({ name: 'Blue' }); + + assert.ok(!blueTag.id, 'the child was not persisted'); + assert.equal(tag.tags.models.length, initialCount + 1); + assert.equal(blueTag.tags.models.length, 1, 'the inverse was set'); + + blueTag.save(); + + assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', tagIds: [ tag.id ] }, 'the child was persisted'); + assert.equal(tag.tags.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.tags.includes(blueTag), 'the model was added to tag.tags'); + assert.ok(tag.tagIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); + assert.ok(blueTag.tags.includes(tag), 'the inverse was set'); + }); + +}); diff --git a/tests/integration/orm/has-many/3-reflexive/association-set-ids-test.js b/tests/integration/orm/has-many/3-reflexive/association-set-ids-test.js new file mode 100644 index 000000000..4b1026af8 --- /dev/null +++ b/tests/integration/orm/has-many/3-reflexive/association-set-ids-test.js @@ -0,0 +1,48 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Reflexive | association #setIds', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let savedTag = this.helper.savedChild(); + + tag.tagIds = [ savedTag.id ]; + + assert.deepEqual(tag.tags.models[0].attrs, savedTag.attrs); + assert.deepEqual(tag.tagIds, [ savedTag.id ]); + + tag.save(); + savedTag.reload(); + + assert.deepEqual(savedTag.tags.models[0].attrs, tag.attrs, 'the inverse was set'); + originalTags.forEach(originalTag => { + if (originalTag.isSaved()) { + originalTag.reload(); + assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); + } + }); + }); + + test(`a ${state} can clear its association via a null childIds`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + + tag.tagIds = null; + + assert.deepEqual(tag.tags.models, []); + assert.deepEqual(tag.tagIds, []); + + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); + }); + }); + +}); diff --git a/tests/integration/orm/has-many/3-reflexive/association-set-test.js b/tests/integration/orm/has-many/3-reflexive/association-set-test.js new file mode 100644 index 000000000..27b7109ed --- /dev/null +++ b/tests/integration/orm/has-many/3-reflexive/association-set-test.js @@ -0,0 +1,81 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Reflexive | association #set', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parent, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let savedTag = this.helper.savedChild(); + + tag.tags = [ savedTag ]; + + assert.ok(tag.tags.includes(savedTag)); + assert.equal(tag.tagIds[0], savedTag.id); + assert.ok(savedTag.tags.includes(tag), 'the inverse was set'); + + tag.save(); + + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); + }); + }); + + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let newTag = this.helper.newChild(); + + tag.tags = [ newTag ]; + + assert.ok(tag.tags.includes(newTag)); + assert.equal(tag.tagIds[0], undefined); + assert.ok(newTag.tags.includes(tag), 'the inverse was set'); + + tag.save(); + + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); + }); + }); + + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + + tag.tags = [ ]; + + assert.deepEqual(tag.tagIds, [ ]); + assert.equal(tag.tags.models.length, 0); + + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); + }); + }); + + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + + tag.tags = null; + + assert.deepEqual(tag.tagIds, [ ]); + assert.equal(tag.tags.models.length, 0); + + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); + }); + }); + +}); diff --git a/tests/integration/orm/has-many/3-reflexive/create-test.js b/tests/integration/orm/has-many/3-reflexive/create-test.js new file mode 100644 index 000000000..0f80ef5b0 --- /dev/null +++ b/tests/integration/orm/has-many/3-reflexive/create-test.js @@ -0,0 +1,94 @@ +import Helper from './_helper'; +import { Model } from 'ember-cli-mirage'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Reflexive | create', { + beforeEach() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + } +}); + +test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + tagIds: [ tagA.id ] + }); + + tagA.reload(); + + assert.deepEqual(tagA.tagIds, [ tagB.id ]); + assert.deepEqual(tagB.tagIds, [ tagA.id ], 'the inverse was set'); + assert.deepEqual(tagA.attrs.tagIds, [ tagB.id ], 'the ids were persisted'); + assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ], 'the inverse ids were persisted'); + assert.deepEqual(tagA.tags.models[0].attrs, tagB.attrs); + assert.deepEqual(tagB.tags.models[0].attrs, tagA.attrs, 'the inverse was set'); + assert.equal(this.helper.db.tags.length, 2); + assert.deepEqual(this.helper.db.tags[0], { id: '1', tagIds: [ '2' ] }); + assert.deepEqual(this.helper.db.tags[1], { id: '2', tagIds: [ '1' ] }); +}); + +test('it sets up associations correctly when passing in an array of models', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + tags: [ tagA ] + }); + + tagA.reload(); + + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagA.tagIds, [ tagB.id ], 'the inverse was set'); + assert.deepEqual(tagA.attrs.tagIds, [ tagB.id ], 'the ids were persisted'); + assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ], 'the inverse was set'); + assert.equal(this.helper.db.tags.length, 2); +}); + +test('it sets up associations correctly when passing in a collection', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + tags: schema.tags.all() + }); + + tagA.reload(); + + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagA.tagIds, [ tagB.id ], 'the inverse was set'); + assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ]); + assert.deepEqual(tagA.attrs.tagIds, [ tagB.id ], 'the inverse was set'); + assert.equal(this.helper.db.tags.length, 2); +}); + +test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.tags.create({ + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.tags.create({ + foos: [ schema.create('foo') ] + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.foos.create(); + schema.foos.create(); + + assert.throws(function() { + schema.tags.create({ + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); +}); diff --git a/tests/integration/orm/has-many/3-reflexive/delete-test.js b/tests/integration/orm/has-many/3-reflexive/delete-test.js new file mode 100644 index 000000000..35691aafd --- /dev/null +++ b/tests/integration/orm/has-many/3-reflexive/delete-test.js @@ -0,0 +1,24 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Reflexive | delete', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ tag, tags ] = this.helper[state](); + + if (tags && tags.length) { + tags.forEach(t => t.destroy()); + tag.reload(); + } + + assert.equal(tag.tags.length, 0); + assert.equal(tag.tagIds.length, 0); + }); + +}); diff --git a/tests/integration/orm/has-many/3-reflexive/new-test.js b/tests/integration/orm/has-many/3-reflexive/new-test.js new file mode 100644 index 000000000..5a9a8f848 --- /dev/null +++ b/tests/integration/orm/has-many/3-reflexive/new-test.js @@ -0,0 +1,81 @@ +import Helper from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Reflexive | new', { + beforeEach() { + this.helper = new Helper(); + this.schema = this.helper.schema; + } +}); + +test('the parent accepts a saved child id', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ + tagIds: [ tagA.id ] + }); + + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagB.tags.models[0], tagA); +}); + +test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.tags.new({ tagIds: [ 2 ] }); + }, /You're instantiating a tag that has a tagIds of 2, but some of those records don't exist in the database/); +}); + +test('the parent accepts null children foreign key', function(assert) { + let tag = this.schema.tags.new({ tagIds: null }); + + assert.equal(tag.tags.models.length, 0); + assert.deepEqual(tag.tagIds, []); + assert.deepEqual(tag.attrs, { tagIds: null }); +}); + +test('the parent accepts saved children', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ tags: [ tagA ] }); + + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagB.tags.models[0], tagA); +}); + +test('the parent accepts new children', function(assert) { + let tagA = this.schema.tags.new({ color: 'Red' }); + let tagB = this.schema.tags.new({ tags: [ tagA ] }); + + assert.deepEqual(tagB.tagIds, [ undefined ]); + assert.deepEqual(tagB.tags.models[0], tagA); +}); + +test('the parent accepts null children', function(assert) { + let tag = this.schema.tags.new({ tags: null }); + + assert.equal(tag.tags.models.length, 0); + assert.deepEqual(tag.tagIds, []); + assert.deepEqual(tag.attrs, { tagIds: null }); +}); + +test('the parent accepts children and child ids', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ tags: [ tagA ], tagIds: [ tagA.id ] }); + + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagB.tags.models[0], tagA); +}); + +test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let tag = this.schema.tags.new({}); + + assert.deepEqual(tag.tagIds, []); + assert.deepEqual(tag.tags.models, []); + assert.deepEqual(tag.attrs, { tagIds: null }); +}); + +test('the parent accepts no reference to children or child ids', function(assert) { + let tag = this.schema.tags.new(); + + assert.deepEqual(tag.tagIds, []); + assert.deepEqual(tag.tags.models, []); + assert.deepEqual(tag.attrs, { tagIds: null }); +}); diff --git a/tests/integration/orm/has-many/4-named-reflexive/_helper.js b/tests/integration/orm/has-many/4-named-reflexive/_helper.js new file mode 100644 index 000000000..1b917ceeb --- /dev/null +++ b/tests/integration/orm/has-many/4-named-reflexive/_helper.js @@ -0,0 +1,127 @@ +import { Model, hasMany } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +/* + A model with a hasMany association can be in eight states + with respect to its association. This helper class + returns a parent (and its children) in these various states. + + The return value is an array of the form + + [ parent, [child1, child2...] ] + + where the children array may be empty. +*/ +export default class Helper { + + constructor() { + this.db = new Db(); + + this.schema = new Schema(this.db, { + tag: Model.extend({ + labels: hasMany('tag') // implicit inverse + }) + }); + } + + savedParentNoChildren() { + let tag = this.db.tags.insert({ name: 'Red' }); + + return [ this.schema.tags.find(tag.id), [] ]; + } + + savedParentNewChildren() { + let tag = this.schema.tags.create({ name: 'Red' }); + let tag1 = this.schema.tags.new({ name: 'Blue' }); + let tag2 = this.schema.tags.new({ name: 'Green' }); + + tag.labels = [ tag1, tag2 ]; + + return [ tag, [ tag1, tag2 ] ]; + } + + savedParentSavedChildren() { + let { schema } = this; + schema.db.tags.insert([ + { id: '1', name: 'Red', labelIds: ['2', '3'] }, + { id: '2', name: 'Blue', labelIds: ['1'] }, + { id: '3', name: 'Green', labelIds: ['1'] } + ]); + + return [ schema.tags.find(1), [ schema.tags.find(2), schema.tags.find(3) ] ]; + } + + savedParentMixedChildren() { + this.schema.db.tags.insert([ + { id: '1', name: 'Red', labelIds: ['2'] }, + { id: '2', name: 'Blue', labelIds: ['1'] } + ]); + let tag = this.schema.tags.find(1); + let blueTag = this.schema.tags.find(2); + let greenTag = this.schema.tags.new({ name: 'Green' }); + + tag.labels = [ blueTag, greenTag ]; + + return [ tag, [ blueTag, greenTag ] ]; + } + + newParentNoChildren() { + let tag = this.schema.tags.new({ name: 'Red' }); + + return [ tag, [] ]; + } + + newParentNewChildren() { + let tag = this.schema.tags.new({ name: 'Red' }); + let tag1 = this.schema.tags.new({ name: 'Blue' }); + let tag2 = this.schema.tags.new({ name: 'Green' }); + + tag.labels = [ tag1, tag2 ]; + + return [ tag, [ tag1, tag2 ] ]; + } + + newParentSavedChildren() { + let tag = this.schema.tags.new({ name: 'Red' }); + let tag1 = this.schema.tags.create({ name: 'Blue' }); + let tag2 = this.schema.tags.create({ name: 'Green' }); + + tag.labels = [ tag1, tag2 ]; + + return [ tag, [ tag1, tag2 ] ]; + } + + newParentMixedChildren() { + let tag = this.schema.tags.new({ name: 'Red' }); + let tag1 = this.schema.tags.create({ name: 'Blue' }); + let tag2 = this.schema.tags.new({ name: 'Green' }); + + tag.labels = [ tag1, tag2 ]; + + return [ tag, [ tag1, tag2 ] ]; + } + + // Unassociated child models, used for setting tests + savedChild() { + let insertedTag = this.db.tags.insert({ name: 'Blue' }); + + return this.schema.tags.find(insertedTag.id); + } + + newChild() { + return this.schema.tags.new({ name: 'Blue' }); + } + +} + +export const states = [ + 'savedParentNoChildren', + 'savedParentNewChildren', + 'savedParentMixedChildren', + 'savedParentSavedChildren', + 'newParentNoChildren', + 'newParentNewChildren', + 'newParentSavedChildren', + 'newParentMixedChildren' +]; diff --git a/tests/integration/orm/has-many/4-named-reflexive/accessor-test.js b/tests/integration/orm/has-many/4-named-reflexive/accessor-test.js new file mode 100644 index 000000000..dd8e5ae64 --- /dev/null +++ b/tests/integration/orm/has-many/4-named-reflexive/accessor-test.js @@ -0,0 +1,30 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named Reflexive | accessor', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ tag, tags ] = this.helper[state](); + + assert.equal(tag.labels.models.length, tags.length, 'the parent has the correct number of children'); + assert.equal(tag.labelIds.length, tags.length, 'the parent has the correct number of children ids'); + + tags.forEach((t, i) => { + assert.deepEqual(tag.labels.models[i], t, 'each child is in parent.children array'); + + if (t.isSaved()) { + assert.ok(tag.labelIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); + } + + // Check the inverse + assert.ok(t.labels.includes(tag)); + }); + }); + +}); diff --git a/tests/integration/orm/has-many/4-named-reflexive/association-create-test.js b/tests/integration/orm/has-many/4-named-reflexive/association-create-test.js new file mode 100644 index 000000000..93f9f48e2 --- /dev/null +++ b/tests/integration/orm/has-many/4-named-reflexive/association-create-test.js @@ -0,0 +1,29 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named Reflexive | association #create', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can create a has-many association, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can create an associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.labels.models.length; + + let orangeTag = tag.createLabel({ name: 'Orange' }); + + assert.ok(orangeTag.id, 'the child was persisted'); + assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.labels.includes(orangeTag), 'the model was added to tag.labels'); + assert.ok(tag.labelIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); + assert.ok(tag.attrs.labelIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); + assert.ok(orangeTag.labels.includes(tag), 'the inverse was set'); + }); + +}); diff --git a/tests/integration/orm/has-many/4-named-reflexive/association-new-test.js b/tests/integration/orm/has-many/4-named-reflexive/association-new-test.js new file mode 100644 index 000000000..944759dbc --- /dev/null +++ b/tests/integration/orm/has-many/4-named-reflexive/association-new-test.js @@ -0,0 +1,35 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named Reflexive | association #new', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can make a new unsaved belongs-to association, for all states +*/ + +states.forEach((state) => { + + test(`a ${state} can build a new associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.labels.models.length; + + let blueTag = tag.newLabel({ name: 'Blue' }); + + assert.ok(!blueTag.id, 'the child was not persisted'); + assert.equal(tag.labels.models.length, initialCount + 1); + assert.equal(blueTag.labels.models.length, 1, 'the inverse was set'); + + blueTag.save(); + + assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', labelIds: [ tag.id ] }, 'the child was persisted'); + assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.labels.includes(blueTag), 'the model was added to tag.labels'); + assert.ok(tag.labelIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); + assert.ok(blueTag.labels.includes(tag), 'the inverse was set'); + }); + +}); diff --git a/tests/integration/orm/has-many/4-named-reflexive/association-set-ids-test.js b/tests/integration/orm/has-many/4-named-reflexive/association-set-ids-test.js new file mode 100644 index 000000000..8edcd929e --- /dev/null +++ b/tests/integration/orm/has-many/4-named-reflexive/association-set-ids-test.js @@ -0,0 +1,48 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named Reflexive | association #setIds', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let savedTag = this.helper.savedChild(); + + tag.labelIds = [ savedTag.id ]; + + assert.deepEqual(tag.labels.models[0].attrs, savedTag.attrs); + assert.deepEqual(tag.labelIds, [ savedTag.id ]); + + tag.save(); + savedTag.reload(); + + assert.deepEqual(savedTag.labels.models[0].attrs, tag.attrs, 'the inverse was set'); + originalTags.forEach(originalTag => { + if (originalTag.isSaved()) { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + } + }); + }); + + test(`a ${state} can clear its association via a null childIds`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + + tag.labelIds = null; + + assert.deepEqual(tag.labels.models, []); + assert.deepEqual(tag.labelIds, []); + + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + }); + }); + +}); diff --git a/tests/integration/orm/has-many/4-named-reflexive/association-set-test.js b/tests/integration/orm/has-many/4-named-reflexive/association-set-test.js new file mode 100644 index 000000000..2c966da8a --- /dev/null +++ b/tests/integration/orm/has-many/4-named-reflexive/association-set-test.js @@ -0,0 +1,81 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named Reflexive | association #set', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parent, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let savedTag = this.helper.savedChild(); + + tag.labels = [ savedTag ]; + + assert.ok(tag.labels.includes(savedTag)); + assert.equal(tag.labelIds[0], savedTag.id); + assert.ok(savedTag.labels.includes(tag), 'the inverse was set'); + + tag.save(); + + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + }); + }); + + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let newTag = this.helper.newChild(); + + tag.labels = [ newTag ]; + + assert.ok(tag.labels.includes(newTag)); + assert.equal(tag.labelIds[0], undefined); + assert.ok(newTag.labels.includes(tag), 'the inverse was set'); + + tag.save(); + + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + }); + }); + + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + + tag.labels = [ ]; + + assert.deepEqual(tag.labelIds, [ ]); + assert.equal(tag.labels.models.length, 0); + + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + }); + }); + + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + + tag.labels = null; + + assert.deepEqual(tag.labelIds, [ ]); + assert.equal(tag.labels.models.length, 0); + + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + }); + }); + +}); diff --git a/tests/integration/orm/has-many/4-named-reflexive/create-test.js b/tests/integration/orm/has-many/4-named-reflexive/create-test.js new file mode 100644 index 000000000..d27842f02 --- /dev/null +++ b/tests/integration/orm/has-many/4-named-reflexive/create-test.js @@ -0,0 +1,94 @@ +import Helper from './_helper'; +import { Model } from 'ember-cli-mirage'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named Reflexive | create', { + beforeEach() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + } +}); + +test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labelIds: [ tagA.id ] + }); + + tagA.reload(); + + assert.deepEqual(tagA.labelIds, [ tagB.id ]); + assert.deepEqual(tagB.labelIds, [ tagA.id ], 'the inverse was set'); + assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the ids were persisted'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the inverse ids were persisted'); + assert.deepEqual(tagA.labels.models[0].attrs, tagB.attrs); + assert.deepEqual(tagB.labels.models[0].attrs, tagA.attrs, 'the inverse was set'); + assert.equal(this.helper.db.tags.length, 2); + assert.deepEqual(this.helper.db.tags[0], { id: '1', labelIds: [ '2' ] }); + assert.deepEqual(this.helper.db.tags[1], { id: '2', labelIds: [ '1' ] }); +}); + +test('it sets up associations correctly when passing in an array of models', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labels: [ tagA ] + }); + + tagA.reload(); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.labelIds, [ tagB.id ], 'the inverse was set'); + assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the ids were persisted'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the inverse was set'); + assert.equal(this.helper.db.tags.length, 2); +}); + +test('it sets up associations correctly when passing in a collection', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labels: schema.tags.all() + }); + + tagA.reload(); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.labelIds, [ tagB.id ], 'the inverse was set'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the inverse was set'); + assert.equal(this.helper.db.tags.length, 2); +}); + +test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.tags.create({ + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.tags.create({ + foos: [ schema.create('foo') ] + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.foos.create(); + schema.foos.create(); + + assert.throws(function() { + schema.tags.create({ + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); +}); diff --git a/tests/integration/orm/has-many/4-named-reflexive/delete-test.js b/tests/integration/orm/has-many/4-named-reflexive/delete-test.js new file mode 100644 index 000000000..8eddc9d2d --- /dev/null +++ b/tests/integration/orm/has-many/4-named-reflexive/delete-test.js @@ -0,0 +1,24 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named Reflexive | delete', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ tag, labels ] = this.helper[state](); + + if (labels && labels.length) { + labels.forEach(t => t.destroy()); + tag.reload(); + } + + assert.equal(tag.labels.length, 0); + assert.equal(tag.labelIds.length, 0); + }); + +}); diff --git a/tests/integration/orm/has-many/4-named-reflexive/new-test.js b/tests/integration/orm/has-many/4-named-reflexive/new-test.js new file mode 100644 index 000000000..a047a4959 --- /dev/null +++ b/tests/integration/orm/has-many/4-named-reflexive/new-test.js @@ -0,0 +1,81 @@ +import Helper from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named Reflexive | new', { + beforeEach() { + this.helper = new Helper(); + this.schema = this.helper.schema; + } +}); + +test('the parent accepts a saved child id', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ + labelIds: [ tagA.id ] + }); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagB.labels.models[0], tagA); +}); + +test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.tags.new({ labelIds: [ 2 ] }); + }, /You're instantiating a tag that has a labelIds of 2, but some of those records don't exist in the database/); +}); + +test('the parent accepts null children foreign key', function(assert) { + let tag = this.schema.tags.new({ labelIds: null }); + + assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.attrs, { labelIds: null }); +}); + +test('the parent accepts saved children', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ labels: [ tagA ] }); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagB.labels.models[0], tagA); +}); + +test('the parent accepts new children', function(assert) { + let tagA = this.schema.tags.new({ color: 'Red' }); + let tagB = this.schema.tags.new({ labels: [ tagA ] }); + + assert.deepEqual(tagB.labelIds, [ undefined ]); + assert.deepEqual(tagB.labels.models[0], tagA); +}); + +test('the parent accepts null children', function(assert) { + let tag = this.schema.tags.new({ labels: null }); + + assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.attrs, { labelIds: null }); +}); + +test('the parent accepts children and child ids', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ labels: [ tagA ], labelIds: [ tagA.id ] }); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagB.labels.models[0], tagA); +}); + +test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let tag = this.schema.tags.new({}); + + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.labels.models, []); + assert.deepEqual(tag.attrs, { labelIds: null }); +}); + +test('the parent accepts no reference to children or child ids', function(assert) { + let tag = this.schema.tags.new(); + + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.labels.models, []); + assert.deepEqual(tag.attrs, { labelIds: null }); +}); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/_helper.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/_helper.js new file mode 100644 index 000000000..acd2b1710 --- /dev/null +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/_helper.js @@ -0,0 +1,127 @@ +import { Model, hasMany } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +/* + A model with a hasMany association can be in eight states + with respect to its association. This helper class + returns a parent (and its children) in these various states. + + The return value is an array of the form + + [ parent, [child1, child2...] ] + + where the children array may be empty. +*/ +export default class Helper { + + constructor() { + this.db = new Db(); + + this.schema = new Schema(this.db, { + tag: Model.extend({ + labels: hasMany('tag', { inverse: 'labels' }) // implicit inverse + }) + }); + } + + savedParentNoChildren() { + let tag = this.db.tags.insert({ name: 'Red' }); + + return [ this.schema.tags.find(tag.id), [] ]; + } + + savedParentNewChildren() { + let tag = this.schema.tags.create({ name: 'Red' }); + let tag1 = this.schema.tags.new({ name: 'Blue' }); + let tag2 = this.schema.tags.new({ name: 'Green' }); + + tag.labels = [ tag1, tag2 ]; + + return [ tag, [ tag1, tag2 ] ]; + } + + savedParentSavedChildren() { + let { schema } = this; + schema.db.tags.insert([ + { id: '1', name: 'Red', labelIds: ['2', '3'] }, + { id: '2', name: 'Blue', labelIds: ['1'] }, + { id: '3', name: 'Green', labelIds: ['1'] } + ]); + + return [ schema.tags.find(1), [ schema.tags.find(2), schema.tags.find(3) ] ]; + } + + savedParentMixedChildren() { + this.schema.db.tags.insert([ + { id: '1', name: 'Red', labelIds: ['2'] }, + { id: '2', name: 'Blue', labelIds: ['1'] } + ]); + let tag = this.schema.tags.find(1); + let blueTag = this.schema.tags.find(2); + let greenTag = this.schema.tags.new({ name: 'Green' }); + + tag.labels = [ blueTag, greenTag ]; + + return [ tag, [ blueTag, greenTag ] ]; + } + + newParentNoChildren() { + let tag = this.schema.tags.new({ name: 'Red' }); + + return [ tag, [] ]; + } + + newParentNewChildren() { + let tag = this.schema.tags.new({ name: 'Red' }); + let tag1 = this.schema.tags.new({ name: 'Blue' }); + let tag2 = this.schema.tags.new({ name: 'Green' }); + + tag.labels = [ tag1, tag2 ]; + + return [ tag, [ tag1, tag2 ] ]; + } + + newParentSavedChildren() { + let tag = this.schema.tags.new({ name: 'Red' }); + let tag1 = this.schema.tags.create({ name: 'Blue' }); + let tag2 = this.schema.tags.create({ name: 'Green' }); + + tag.labels = [ tag1, tag2 ]; + + return [ tag, [ tag1, tag2 ] ]; + } + + newParentMixedChildren() { + let tag = this.schema.tags.new({ name: 'Red' }); + let tag1 = this.schema.tags.create({ name: 'Blue' }); + let tag2 = this.schema.tags.new({ name: 'Green' }); + + tag.labels = [ tag1, tag2 ]; + + return [ tag, [ tag1, tag2 ] ]; + } + + // Unassociated child models, used for setting tests + savedChild() { + let insertedTag = this.db.tags.insert({ name: 'Blue' }); + + return this.schema.tags.find(insertedTag.id); + } + + newChild() { + return this.schema.tags.new({ name: 'Blue' }); + } + +} + +export const states = [ + 'savedParentNoChildren', + 'savedParentNewChildren', + 'savedParentMixedChildren', + 'savedParentSavedChildren', + 'newParentNoChildren', + 'newParentNewChildren', + 'newParentSavedChildren', + 'newParentMixedChildren' +]; diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/accessor-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/accessor-test.js new file mode 100644 index 000000000..a471a1685 --- /dev/null +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/accessor-test.js @@ -0,0 +1,30 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | accessor', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ tag, tags ] = this.helper[state](); + + assert.equal(tag.labels.models.length, tags.length, 'the parent has the correct number of children'); + assert.equal(tag.labelIds.length, tags.length, 'the parent has the correct number of children ids'); + + tags.forEach((t, i) => { + assert.deepEqual(tag.labels.models[i], t, 'each child is in parent.children array'); + + if (t.isSaved()) { + assert.ok(tag.labelIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); + } + + // Check the inverse + assert.ok(t.labels.includes(tag)); + }); + }); + +}); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-create-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-create-test.js new file mode 100644 index 000000000..fdbe7da4a --- /dev/null +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-create-test.js @@ -0,0 +1,29 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | association #create', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can create a has-many association, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can create an associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.labels.models.length; + + let orangeTag = tag.createLabel({ name: 'Orange' }); + + assert.ok(orangeTag.id, 'the child was persisted'); + assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.labels.includes(orangeTag), 'the model was added to tag.labels'); + assert.ok(tag.labelIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); + assert.ok(tag.attrs.labelIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); + assert.ok(orangeTag.labels.includes(tag), 'the inverse was set'); + }); + +}); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-new-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-new-test.js new file mode 100644 index 000000000..68218f393 --- /dev/null +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-new-test.js @@ -0,0 +1,35 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | association #new', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can make a new unsaved belongs-to association, for all states +*/ + +states.forEach((state) => { + + test(`a ${state} can build a new associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.labels.models.length; + + let blueTag = tag.newLabel({ name: 'Blue' }); + + assert.ok(!blueTag.id, 'the child was not persisted'); + assert.equal(tag.labels.models.length, initialCount + 1); + assert.equal(blueTag.labels.models.length, 1, 'the inverse was set'); + + blueTag.save(); + + assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', labelIds: [ tag.id ] }, 'the child was persisted'); + assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.labels.includes(blueTag), 'the model was added to tag.labels'); + assert.ok(tag.labelIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); + assert.ok(blueTag.labels.includes(tag), 'the inverse was set'); + }); + +}); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-ids-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-ids-test.js new file mode 100644 index 000000000..b7be9ed49 --- /dev/null +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-ids-test.js @@ -0,0 +1,48 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | association #setIds', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let savedTag = this.helper.savedChild(); + + tag.labelIds = [ savedTag.id ]; + + assert.deepEqual(tag.labels.models[0].attrs, savedTag.attrs); + assert.deepEqual(tag.labelIds, [ savedTag.id ]); + + tag.save(); + savedTag.reload(); + + assert.deepEqual(savedTag.labels.models[0].attrs, tag.attrs, 'the inverse was set'); + originalTags.forEach(originalTag => { + if (originalTag.isSaved()) { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + } + }); + }); + + test(`a ${state} can clear its association via a null childIds`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + + tag.labelIds = null; + + assert.deepEqual(tag.labels.models, []); + assert.deepEqual(tag.labelIds, []); + + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + }); + }); + +}); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-test.js new file mode 100644 index 000000000..6ebf3b076 --- /dev/null +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-test.js @@ -0,0 +1,81 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | association #set', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parent, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let savedTag = this.helper.savedChild(); + + tag.labels = [ savedTag ]; + + assert.ok(tag.labels.includes(savedTag)); + assert.equal(tag.labelIds[0], savedTag.id); + assert.ok(savedTag.labels.includes(tag), 'the inverse was set'); + + tag.save(); + + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + }); + }); + + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let newTag = this.helper.newChild(); + + tag.labels = [ newTag ]; + + assert.ok(tag.labels.includes(newTag)); + assert.equal(tag.labelIds[0], undefined); + assert.ok(newTag.labels.includes(tag), 'the inverse was set'); + + tag.save(); + + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + }); + }); + + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + + tag.labels = [ ]; + + assert.deepEqual(tag.labelIds, [ ]); + assert.equal(tag.labels.models.length, 0); + + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + }); + }); + + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + + tag.labels = null; + + assert.deepEqual(tag.labelIds, [ ]); + assert.equal(tag.labels.models.length, 0); + + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + }); + }); + +}); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/create-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/create-test.js new file mode 100644 index 000000000..13d1b65a6 --- /dev/null +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/create-test.js @@ -0,0 +1,94 @@ +import Helper from './_helper'; +import { Model } from 'ember-cli-mirage'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | create', { + beforeEach() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + } +}); + +test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labelIds: [ tagA.id ] + }); + + tagA.reload(); + + assert.deepEqual(tagA.labelIds, [ tagB.id ]); + assert.deepEqual(tagB.labelIds, [ tagA.id ], 'the inverse was set'); + assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the ids were persisted'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the inverse ids were persisted'); + assert.deepEqual(tagA.labels.models[0].attrs, tagB.attrs); + assert.deepEqual(tagB.labels.models[0].attrs, tagA.attrs, 'the inverse was set'); + assert.equal(this.helper.db.tags.length, 2); + assert.deepEqual(this.helper.db.tags[0], { id: '1', labelIds: [ '2' ] }); + assert.deepEqual(this.helper.db.tags[1], { id: '2', labelIds: [ '1' ] }); +}); + +test('it sets up associations correctly when passing in an array of models', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labels: [ tagA ] + }); + + tagA.reload(); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.labelIds, [ tagB.id ], 'the inverse was set'); + assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the ids were persisted'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the inverse was set'); + assert.equal(this.helper.db.tags.length, 2); +}); + +test('it sets up associations correctly when passing in a collection', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labels: schema.tags.all() + }); + + tagA.reload(); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.labelIds, [ tagB.id ], 'the inverse was set'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the inverse was set'); + assert.equal(this.helper.db.tags.length, 2); +}); + +test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.tags.create({ + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.tags.create({ + foos: [ schema.create('foo') ] + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.foos.create(); + schema.foos.create(); + + assert.throws(function() { + schema.tags.create({ + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); +}); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/delete-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/delete-test.js new file mode 100644 index 000000000..13a7b40e1 --- /dev/null +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/delete-test.js @@ -0,0 +1,24 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | delete', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ tag, labels ] = this.helper[state](); + + if (labels && labels.length) { + labels.forEach(t => t.destroy()); + tag.reload(); + } + + assert.equal(tag.labels.length, 0); + assert.equal(tag.labelIds.length, 0); + }); + +}); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/new-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/new-test.js new file mode 100644 index 000000000..4c0142c79 --- /dev/null +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/new-test.js @@ -0,0 +1,81 @@ +import Helper from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | new', { + beforeEach() { + this.helper = new Helper(); + this.schema = this.helper.schema; + } +}); + +test('the parent accepts a saved child id', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ + labelIds: [ tagA.id ] + }); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagB.labels.models[0], tagA); +}); + +test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.tags.new({ labelIds: [ 2 ] }); + }, /You're instantiating a tag that has a labelIds of 2, but some of those records don't exist in the database/); +}); + +test('the parent accepts null children foreign key', function(assert) { + let tag = this.schema.tags.new({ labelIds: null }); + + assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.attrs, { labelIds: null }); +}); + +test('the parent accepts saved children', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ labels: [ tagA ] }); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagB.labels.models[0], tagA); +}); + +test('the parent accepts new children', function(assert) { + let tagA = this.schema.tags.new({ color: 'Red' }); + let tagB = this.schema.tags.new({ labels: [ tagA ] }); + + assert.deepEqual(tagB.labelIds, [ undefined ]); + assert.deepEqual(tagB.labels.models[0], tagA); +}); + +test('the parent accepts null children', function(assert) { + let tag = this.schema.tags.new({ labels: null }); + + assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.attrs, { labelIds: null }); +}); + +test('the parent accepts children and child ids', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ labels: [ tagA ], labelIds: [ tagA.id ] }); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagB.labels.models[0], tagA); +}); + +test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let tag = this.schema.tags.new({}); + + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.labels.models, []); + assert.deepEqual(tag.attrs, { labelIds: null }); +}); + +test('the parent accepts no reference to children or child ids', function(assert) { + let tag = this.schema.tags.new(); + + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.labels.models, []); + assert.deepEqual(tag.attrs, { labelIds: null }); +}); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/_helper.js b/tests/integration/orm/has-many/6-one-way-reflexive/_helper.js new file mode 100644 index 000000000..a5dd69876 --- /dev/null +++ b/tests/integration/orm/has-many/6-one-way-reflexive/_helper.js @@ -0,0 +1,127 @@ +import { Model, hasMany } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +/* + A model with a hasMany association can be in eight states + with respect to its association. This helper class + returns a parent (and its children) in these various states. + + The return value is an array of the form + + [ parent, [child1, child2...] ] + + where the children array may be empty. +*/ +export default class Helper { + + constructor() { + this.db = new Db(); + + this.schema = new Schema(this.db, { + tag: Model.extend({ + tags: hasMany('tag', { inverse: null }) + }) + }); + } + + savedParentNoChildren() { + let tag = this.db.tags.insert({ name: 'Red' }); + + return [ this.schema.tags.find(tag.id), [] ]; + } + + savedParentNewChildren() { + let tag = this.schema.tags.create({ name: 'Red' }); + let tag1 = this.schema.tags.new({ name: 'Blue' }); + let tag2 = this.schema.tags.new({ name: 'Green' }); + + tag.tags = [ tag1, tag2 ]; + + return [ tag, [ tag1, tag2 ] ]; + } + + savedParentSavedChildren() { + let { schema } = this; + schema.db.tags.insert([ + { id: '1', name: 'Red', tagIds: ['2', '3'] }, + { id: '2', name: 'Blue', tagIds: [] }, + { id: '3', name: 'Green', tagIds: [] } + ]); + + return [ schema.tags.find(1), [ schema.tags.find(2), schema.tags.find(3) ] ]; + } + + savedParentMixedChildren() { + this.schema.db.tags.insert([ + { id: '1', name: 'Red', tagIds: ['2'] }, + { id: '2', name: 'Blue', tagIds: [] } + ]); + let tag = this.schema.tags.find(1); + let blueTag = this.schema.tags.find(2); + let greenTag = this.schema.tags.new({ name: 'Green' }); + + tag.tags = [ blueTag, greenTag ]; + + return [ tag, [ blueTag, greenTag ] ]; + } + + newParentNoChildren() { + let tag = this.schema.tags.new({ name: 'Red' }); + + return [ tag, [] ]; + } + + newParentNewChildren() { + let tag = this.schema.tags.new({ name: 'Red' }); + let tag1 = this.schema.tags.new({ name: 'Blue' }); + let tag2 = this.schema.tags.new({ name: 'Green' }); + + tag.tags = [ tag1, tag2 ]; + + return [ tag, [ tag1, tag2 ] ]; + } + + newParentSavedChildren() { + let tag = this.schema.tags.new({ name: 'Red' }); + let tag1 = this.schema.tags.create({ name: 'Blue' }); + let tag2 = this.schema.tags.create({ name: 'Green' }); + + tag.tags = [ tag1, tag2 ]; + + return [ tag, [ tag1, tag2 ] ]; + } + + newParentMixedChildren() { + let tag = this.schema.tags.new({ name: 'Red' }); + let tag1 = this.schema.tags.create({ name: 'Blue' }); + let tag2 = this.schema.tags.new({ name: 'Green' }); + + tag.tags = [ tag1, tag2 ]; + + return [ tag, [ tag1, tag2 ] ]; + } + + // Unassociated child models, used for setting tests + savedChild() { + let insertedTag = this.db.tags.insert({ name: 'Blue' }); + + return this.schema.tags.find(insertedTag.id); + } + + newChild() { + return this.schema.tags.new({ name: 'Blue' }); + } + +} + +export const states = [ + 'savedParentNoChildren', + 'savedParentNewChildren', + 'savedParentMixedChildren', + 'savedParentSavedChildren', + 'newParentNoChildren', + 'newParentNewChildren', + 'newParentSavedChildren', + 'newParentMixedChildren' +]; diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/accessor-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/accessor-test.js new file mode 100644 index 000000000..5e4e2ed60 --- /dev/null +++ b/tests/integration/orm/has-many/6-one-way-reflexive/accessor-test.js @@ -0,0 +1,27 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | One-Way Reflexive | accessor', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ tag, tags ] = this.helper[state](); + + assert.equal(tag.tags.models.length, tags.length, 'the parent has the correct number of children'); + assert.equal(tag.tagIds.length, tags.length, 'the parent has the correct number of children ids'); + + tags.forEach((t, i) => { + assert.deepEqual(tag.tags.models[i], t, 'each child is in parent.children array'); + + if (t.isSaved()) { + assert.ok(tag.tagIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); + } + }); + }); + +}); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/association-create-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/association-create-test.js new file mode 100644 index 000000000..5736f5cfc --- /dev/null +++ b/tests/integration/orm/has-many/6-one-way-reflexive/association-create-test.js @@ -0,0 +1,29 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | One-Way Reflexive | association #create', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can create a has-many association, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can create an associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.tags.models.length; + + let orangeTag = tag.createTag({ name: 'Orange' }); + + assert.ok(orangeTag.id, 'the child was persisted'); + assert.equal(tag.tags.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.tags.includes(orangeTag), 'the model was added to tag.tags'); + assert.ok(tag.tagIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); + assert.ok(tag.attrs.tagIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); + assert.notOk(orangeTag.tags.includes(tag), 'the inverse was not set'); + }); + +}); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/association-new-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/association-new-test.js new file mode 100644 index 000000000..0e19a958a --- /dev/null +++ b/tests/integration/orm/has-many/6-one-way-reflexive/association-new-test.js @@ -0,0 +1,35 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | One-Way Reflexive | association #new', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can make a new unsaved belongs-to association, for all states +*/ + +states.forEach((state) => { + + test(`a ${state} can build a new associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.tags.models.length; + + let blueTag = tag.newTag({ name: 'Blue' }); + + assert.ok(!blueTag.id, 'the child was not persisted'); + assert.equal(tag.tags.models.length, initialCount + 1); + assert.equal(blueTag.tags.models.length, 0, 'the inverse was not set'); + + blueTag.save(); + + assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', tagIds: [ ] }, 'the child was persisted'); + assert.equal(tag.tags.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.tags.includes(blueTag), 'the model was added to tag.tags'); + assert.ok(tag.tagIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); + assert.notOk(blueTag.tags.includes(tag), 'the inverse was not set'); + }); + +}); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/association-set-ids-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/association-set-ids-test.js new file mode 100644 index 000000000..7a082e568 --- /dev/null +++ b/tests/integration/orm/has-many/6-one-way-reflexive/association-set-ids-test.js @@ -0,0 +1,38 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | One-Way Reflexive | association #setIds', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { + let [ tag ] = this.helper[state](); + let savedTag = this.helper.savedChild(); + + tag.tagIds = [ savedTag.id ]; + + assert.deepEqual(tag.tags.models[0].attrs, savedTag.attrs); + assert.deepEqual(tag.tagIds, [ savedTag.id ]); + + tag.save(); + savedTag.reload(); + + assert.equal(savedTag.tags.models.length, 0, 'the inverse was not set'); + }); + + test(`a ${state} can clear its association via a null childIds`, function(assert) { + let [ tag ] = this.helper[state](); + + tag.tagIds = null; + + assert.deepEqual(tag.tags.models, []); + assert.deepEqual(tag.tagIds, []); + + tag.save(); + }); + +}); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/association-set-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/association-set-test.js new file mode 100644 index 000000000..cc1e506ce --- /dev/null +++ b/tests/integration/orm/has-many/6-one-way-reflexive/association-set-test.js @@ -0,0 +1,63 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | One-Way Reflexive | association #set', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parent, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ tag ] = this.helper[state](); + let savedTag = this.helper.savedChild(); + + tag.tags = [ savedTag ]; + + assert.ok(tag.tags.includes(savedTag)); + assert.equal(tag.tagIds[0], savedTag.id); + assert.notOk(savedTag.tags.includes(tag), 'the inverse was not set'); + + tag.save(); + }); + + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ tag ] = this.helper[state](); + let newTag = this.helper.newChild(); + + tag.tags = [ newTag ]; + + assert.ok(tag.tags.includes(newTag)); + assert.equal(tag.tagIds[0], undefined); + assert.notOk(newTag.tags.includes(tag), 'the inverse was not set'); + + tag.save(); + }); + + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag ] = this.helper[state](); + + tag.tags = [ ]; + + assert.deepEqual(tag.tagIds, [ ]); + assert.equal(tag.tags.models.length, 0); + + tag.save(); + }); + + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag ] = this.helper[state](); + + tag.tags = null; + + assert.deepEqual(tag.tagIds, [ ]); + assert.equal(tag.tags.models.length, 0); + + tag.save(); + }); + +}); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/create-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/create-test.js new file mode 100644 index 000000000..c93912e20 --- /dev/null +++ b/tests/integration/orm/has-many/6-one-way-reflexive/create-test.js @@ -0,0 +1,92 @@ +import Helper from './_helper'; +import { Model } from 'ember-cli-mirage'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | One-Way Reflexive | create', { + beforeEach() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + } +}); + +test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + tagIds: [ tagA.id ] + }); + + tagA.reload(); + + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagA.tagIds, [ ], 'the inverse was not set'); + assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ], 'the ids were persisted'); + assert.deepEqual(tagB.tags.models[0].attrs, tagA.attrs); + assert.equal(this.helper.db.tags.length, 2); + assert.deepEqual(this.helper.db.tags[0], { id: '1', tagIds: null }); + assert.deepEqual(this.helper.db.tags[1], { id: '2', tagIds: [ '1' ] }); +}); + +test('it sets up associations correctly when passing in an array of models', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + tags: [ tagA ] + }); + + tagA.reload(); + + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagA.tagIds, [ ], 'the inverse was not set'); + assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ], 'the ids were persisted'); + assert.deepEqual(tagA.attrs.tagIds, null, 'the inverse was not set'); + assert.equal(this.helper.db.tags.length, 2); +}); + +test('it sets up associations correctly when passing in a collection', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + tags: schema.tags.all() + }); + + tagA.reload(); + + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagA.tagIds, [ ], 'the inverse was not set'); + assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ]); + assert.deepEqual(tagA.attrs.tagIds, null, 'the inverse was not set'); + assert.equal(this.helper.db.tags.length, 2); +}); + +test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.tags.create({ + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.tags.create({ + foos: [ schema.create('foo') ] + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.foos.create(); + schema.foos.create(); + + assert.throws(function() { + schema.tags.create({ + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); +}); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/delete-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/delete-test.js new file mode 100644 index 000000000..1a8b8688a --- /dev/null +++ b/tests/integration/orm/has-many/6-one-way-reflexive/delete-test.js @@ -0,0 +1,24 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | One-Way Reflexive | delete', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ tag, tags ] = this.helper[state](); + + if (tags && tags.length) { + tags.forEach(t => t.destroy()); + tag.reload(); + } + + assert.equal(tag.tags.length, 0); + assert.equal(tag.tagIds.length, 0); + }); + +}); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/new-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/new-test.js new file mode 100644 index 000000000..b1f7e00e4 --- /dev/null +++ b/tests/integration/orm/has-many/6-one-way-reflexive/new-test.js @@ -0,0 +1,81 @@ +import Helper from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | One-Way Reflexive | new', { + beforeEach() { + this.helper = new Helper(); + this.schema = this.helper.schema; + } +}); + +test('the parent accepts a saved child id', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ + tagIds: [ tagA.id ] + }); + + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagB.tags.models[0], tagA); +}); + +test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.tags.new({ tagIds: [ 2 ] }); + }, /You're instantiating a tag that has a tagIds of 2, but some of those records don't exist in the database/); +}); + +test('the parent accepts null children foreign key', function(assert) { + let tag = this.schema.tags.new({ tagIds: null }); + + assert.equal(tag.tags.models.length, 0); + assert.deepEqual(tag.tagIds, []); + assert.deepEqual(tag.attrs, { tagIds: null }); +}); + +test('the parent accepts saved children', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ tags: [ tagA ] }); + + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagB.tags.models[0], tagA); +}); + +test('the parent accepts new children', function(assert) { + let tagA = this.schema.tags.new({ color: 'Red' }); + let tagB = this.schema.tags.new({ tags: [ tagA ] }); + + assert.deepEqual(tagB.tagIds, [ undefined ]); + assert.deepEqual(tagB.tags.models[0], tagA); +}); + +test('the parent accepts null children', function(assert) { + let tag = this.schema.tags.new({ tags: null }); + + assert.equal(tag.tags.models.length, 0); + assert.deepEqual(tag.tagIds, []); + assert.deepEqual(tag.attrs, { tagIds: null }); +}); + +test('the parent accepts children and child ids', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ tags: [ tagA ], tagIds: [ tagA.id ] }); + + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagB.tags.models[0], tagA); +}); + +test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let tag = this.schema.tags.new({}); + + assert.deepEqual(tag.tagIds, []); + assert.deepEqual(tag.tags.models, []); + assert.deepEqual(tag.attrs, { tagIds: null }); +}); + +test('the parent accepts no reference to children or child ids', function(assert) { + let tag = this.schema.tags.new(); + + assert.deepEqual(tag.tagIds, []); + assert.deepEqual(tag.tags.models, []); + assert.deepEqual(tag.attrs, { tagIds: null }); +}); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/_helper.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/_helper.js new file mode 100644 index 000000000..bd80e643c --- /dev/null +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/_helper.js @@ -0,0 +1,127 @@ +import { Model, hasMany } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +/* + A model with a hasMany association can be in eight states + with respect to its association. This helper class + returns a parent (and its children) in these various states. + + The return value is an array of the form + + [ parent, [child1, child2...] ] + + where the children array may be empty. +*/ +export default class Helper { + + constructor() { + this.db = new Db(); + + this.schema = new Schema(this.db, { + tag: Model.extend({ + labels: hasMany('tag', { inverse: null }) + }) + }); + } + + savedParentNoChildren() { + let tag = this.db.tags.insert({ name: 'Red' }); + + return [ this.schema.tags.find(tag.id), [] ]; + } + + savedParentNewChildren() { + let tag = this.schema.tags.create({ name: 'Red' }); + let tag1 = this.schema.tags.new({ name: 'Blue' }); + let tag2 = this.schema.tags.new({ name: 'Green' }); + + tag.labels = [ tag1, tag2 ]; + + return [ tag, [ tag1, tag2 ] ]; + } + + savedParentSavedChildren() { + let { schema } = this; + schema.db.tags.insert([ + { id: '1', name: 'Red', labelIds: ['2', '3'] }, + { id: '2', name: 'Blue', labelIds: [] }, + { id: '3', name: 'Green', labelIds: [] } + ]); + + return [ schema.tags.find(1), [ schema.tags.find(2), schema.tags.find(3) ] ]; + } + + savedParentMixedChildren() { + this.schema.db.tags.insert([ + { id: '1', name: 'Red', labelIds: ['2'] }, + { id: '2', name: 'Blue', labelIds: [] } + ]); + let tag = this.schema.tags.find(1); + let blueTag = this.schema.tags.find(2); + let greenTag = this.schema.tags.new({ name: 'Green' }); + + tag.labels = [ blueTag, greenTag ]; + + return [ tag, [ blueTag, greenTag ] ]; + } + + newParentNoChildren() { + let tag = this.schema.tags.new({ name: 'Red' }); + + return [ tag, [] ]; + } + + newParentNewChildren() { + let tag = this.schema.tags.new({ name: 'Red' }); + let tag1 = this.schema.tags.new({ name: 'Blue' }); + let tag2 = this.schema.tags.new({ name: 'Green' }); + + tag.labels = [ tag1, tag2 ]; + + return [ tag, [ tag1, tag2 ] ]; + } + + newParentSavedChildren() { + let tag = this.schema.tags.new({ name: 'Red' }); + let tag1 = this.schema.tags.create({ name: 'Blue' }); + let tag2 = this.schema.tags.create({ name: 'Green' }); + + tag.labels = [ tag1, tag2 ]; + + return [ tag, [ tag1, tag2 ] ]; + } + + newParentMixedChildren() { + let tag = this.schema.tags.new({ name: 'Red' }); + let tag1 = this.schema.tags.create({ name: 'Blue' }); + let tag2 = this.schema.tags.new({ name: 'Green' }); + + tag.labels = [ tag1, tag2 ]; + + return [ tag, [ tag1, tag2 ] ]; + } + + // Unassociated child models, used for setting tests + savedChild() { + let insertedTag = this.db.tags.insert({ name: 'Blue' }); + + return this.schema.tags.find(insertedTag.id); + } + + newChild() { + return this.schema.tags.new({ name: 'Blue' }); + } + +} + +export const states = [ + 'savedParentNoChildren', + 'savedParentNewChildren', + 'savedParentMixedChildren', + 'savedParentSavedChildren', + 'newParentNoChildren', + 'newParentNewChildren', + 'newParentSavedChildren', + 'newParentMixedChildren' +]; diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/accessor-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/accessor-test.js new file mode 100644 index 000000000..d13fb51d4 --- /dev/null +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/accessor-test.js @@ -0,0 +1,27 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named One-Way Reflexive | accessor', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ tag, tags ] = this.helper[state](); + + assert.equal(tag.labels.models.length, tags.length, 'the parent has the correct number of children'); + assert.equal(tag.labelIds.length, tags.length, 'the parent has the correct number of children ids'); + + tags.forEach((t, i) => { + assert.deepEqual(tag.labels.models[i], t, 'each child is in parent.children array'); + + if (t.isSaved()) { + assert.ok(tag.labelIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); + } + }); + }); + +}); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-create-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-create-test.js new file mode 100644 index 000000000..83d0bd771 --- /dev/null +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-create-test.js @@ -0,0 +1,29 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named One-Way Reflexive | association #create', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can create a has-many association, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can create an associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.labels.models.length; + + let orangeTag = tag.createLabel({ name: 'Orange' }); + + assert.ok(orangeTag.id, 'the child was persisted'); + assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.labels.includes(orangeTag), 'the model was added to tag.labels'); + assert.ok(tag.labelIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); + assert.ok(tag.attrs.labelIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); + assert.notOk(orangeTag.labels.includes(tag), 'the inverse was not set'); + }); + +}); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-new-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-new-test.js new file mode 100644 index 000000000..2f4038d04 --- /dev/null +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-new-test.js @@ -0,0 +1,35 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named One-Way Reflexive | association #new', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can make a new unsaved belongs-to association, for all states +*/ + +states.forEach((state) => { + + test(`a ${state} can build a new associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.labels.models.length; + + let blueTag = tag.newLabel({ name: 'Blue' }); + + assert.ok(!blueTag.id, 'the child was not persisted'); + assert.equal(tag.labels.models.length, initialCount + 1); + assert.equal(blueTag.labels.models.length, 0, 'the inverse was not set'); + + blueTag.save(); + + assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', labelIds: [ ] }, 'the child was persisted'); + assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.labels.includes(blueTag), 'the model was added to tag.labels'); + assert.ok(tag.labelIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); + assert.notOk(blueTag.labels.includes(tag), 'the inverse was not set'); + }); + +}); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-ids-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-ids-test.js new file mode 100644 index 000000000..ee6a8066c --- /dev/null +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-ids-test.js @@ -0,0 +1,38 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named One-Way Reflexive | association #setIds', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { + let [ tag ] = this.helper[state](); + let savedTag = this.helper.savedChild(); + + tag.labelIds = [ savedTag.id ]; + + assert.deepEqual(tag.labels.models[0].attrs, savedTag.attrs); + assert.deepEqual(tag.labelIds, [ savedTag.id ]); + + tag.save(); + savedTag.reload(); + + assert.equal(savedTag.labels.models.length, 0, 'the inverse was not set'); + }); + + test(`a ${state} can clear its association via a null childIds`, function(assert) { + let [ tag ] = this.helper[state](); + + tag.labelIds = null; + + assert.deepEqual(tag.labels.models, []); + assert.deepEqual(tag.labelIds, []); + + tag.save(); + }); + +}); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-test.js new file mode 100644 index 000000000..4696bc010 --- /dev/null +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-test.js @@ -0,0 +1,63 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named One-Way Reflexive | association #set', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parent, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ tag ] = this.helper[state](); + let savedTag = this.helper.savedChild(); + + tag.labels = [ savedTag ]; + + assert.ok(tag.labels.includes(savedTag)); + assert.equal(tag.labelIds[0], savedTag.id); + assert.notOk(savedTag.labels.includes(tag), 'the inverse was not set'); + + tag.save(); + }); + + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ tag ] = this.helper[state](); + let newTag = this.helper.newChild(); + + tag.labels = [ newTag ]; + + assert.ok(tag.labels.includes(newTag)); + assert.equal(tag.labelIds[0], undefined); + assert.notOk(newTag.labels.includes(tag), 'the inverse was not set'); + + tag.save(); + }); + + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag ] = this.helper[state](); + + tag.labels = [ ]; + + assert.deepEqual(tag.labelIds, [ ]); + assert.equal(tag.labels.models.length, 0); + + tag.save(); + }); + + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag ] = this.helper[state](); + + tag.labels = null; + + assert.deepEqual(tag.labelIds, [ ]); + assert.equal(tag.labels.models.length, 0); + + tag.save(); + }); + +}); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/create-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/create-test.js new file mode 100644 index 000000000..80c60c09e --- /dev/null +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/create-test.js @@ -0,0 +1,92 @@ +import Helper from './_helper'; +import { Model } from 'ember-cli-mirage'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named One-Way Reflexive | create', { + beforeEach() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + } +}); + +test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labelIds: [ tagA.id ] + }); + + tagA.reload(); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.labelIds, [ ], 'the inverse was not set'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the ids were persisted'); + assert.deepEqual(tagB.labels.models[0].attrs, tagA.attrs); + assert.equal(this.helper.db.tags.length, 2); + assert.deepEqual(this.helper.db.tags[0], { id: '1', labelIds: null }); + assert.deepEqual(this.helper.db.tags[1], { id: '2', labelIds: [ '1' ] }); +}); + +test('it sets up associations correctly when passing in an array of models', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labels: [ tagA ] + }); + + tagA.reload(); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.labelIds, [ ], 'the inverse was not set'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the ids were persisted'); + assert.deepEqual(tagA.attrs.labelIds, null, 'the inverse was not set'); + assert.equal(this.helper.db.tags.length, 2); +}); + +test('it sets up associations correctly when passing in a collection', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labels: schema.tags.all() + }); + + tagA.reload(); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.labelIds, [ ], 'the inverse was not set'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.attrs.labelIds, null, 'the inverse was not set'); + assert.equal(this.helper.db.tags.length, 2); +}); + +test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.tags.create({ + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.tags.create({ + foos: [ schema.create('foo') ] + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.foos.create(); + schema.foos.create(); + + assert.throws(function() { + schema.tags.create({ + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); +}); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/delete-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/delete-test.js new file mode 100644 index 000000000..7de08e295 --- /dev/null +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/delete-test.js @@ -0,0 +1,24 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named One-Way Reflexive | delete', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ tag, labels ] = this.helper[state](); + + if (labels && labels.length) { + labels.forEach(t => t.destroy()); + tag.reload(); + } + + assert.equal(tag.labels.length, 0); + assert.equal(tag.labelIds.length, 0); + }); + +}); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/new-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/new-test.js new file mode 100644 index 000000000..6c111cdc0 --- /dev/null +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/new-test.js @@ -0,0 +1,81 @@ +import Helper from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Named One-Way Reflexive | new', { + beforeEach() { + this.helper = new Helper(); + this.schema = this.helper.schema; + } +}); + +test('the parent accepts a saved child id', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ + labelIds: [ tagA.id ] + }); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagB.labels.models[0], tagA); +}); + +test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.tags.new({ labelIds: [ 2 ] }); + }, /You're instantiating a tag that has a labelIds of 2, but some of those records don't exist in the database/); +}); + +test('the parent accepts null children foreign key', function(assert) { + let tag = this.schema.tags.new({ labelIds: null }); + + assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.attrs, { labelIds: null }); +}); + +test('the parent accepts saved children', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ labels: [ tagA ] }); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagB.labels.models[0], tagA); +}); + +test('the parent accepts new children', function(assert) { + let tagA = this.schema.tags.new({ color: 'Red' }); + let tagB = this.schema.tags.new({ labels: [ tagA ] }); + + assert.deepEqual(tagB.labelIds, [ undefined ]); + assert.deepEqual(tagB.labels.models[0], tagA); +}); + +test('the parent accepts null children', function(assert) { + let tag = this.schema.tags.new({ labels: null }); + + assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.attrs, { labelIds: null }); +}); + +test('the parent accepts children and child ids', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ labels: [ tagA ], labelIds: [ tagA.id ] }); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagB.labels.models[0], tagA); +}); + +test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let tag = this.schema.tags.new({}); + + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.labels.models, []); + assert.deepEqual(tag.attrs, { labelIds: null }); +}); + +test('the parent accepts no reference to children or child ids', function(assert) { + let tag = this.schema.tags.new(); + + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.labels.models, []); + assert.deepEqual(tag.attrs, { labelIds: null }); +}); diff --git a/tests/integration/orm/has-many/8-many-to-many/_helper.js b/tests/integration/orm/has-many/8-many-to-many/_helper.js new file mode 100644 index 000000000..a90bad32c --- /dev/null +++ b/tests/integration/orm/has-many/8-many-to-many/_helper.js @@ -0,0 +1,135 @@ +import { Model, hasMany } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +/* + A model with a hasMany association can be in eight states + with respect to its association. This helper class + returns a parent (and its children) in these various states. + + The return value is an array of the form + + [ parent, [child1, child2...] ] + + where the children array may be empty. +*/ +export default class Helper { + + constructor() { + this.db = new Db(); + + // implicit inverse + this.schema = new Schema(this.db, { + order: Model.extend({ + products: hasMany() + }), + product: Model.extend({ + orders: hasMany() + }) + }); + } + + savedParentNoChildren() { + let order = this.db.orders.insert({ name: 'Red' }); + + return [ this.schema.orders.find(order.id), [] ]; + } + + savedParentNewChildren() { + let order = this.schema.orders.create({ name: 'Red' }); + let product1 = this.schema.products.new({ name: 'Blue' }); + let product2 = this.schema.products.new({ name: 'Green' }); + + order.products = [ product1, product2 ]; + + return [ order, [ product1, product2 ] ]; + } + + savedParentSavedChildren() { + let { schema } = this; + schema.db.orders.insert([ + { id: '1', name: 'Red', productIds: ['2', '3'] } + ]); + schema.db.products.insert([ + { id: '2', name: 'Blue', orderIds: ['1'] }, + { id: '3', name: 'Green', orderIds: ['1'] } + ]); + + return [ schema.orders.find(1), [ schema.products.find(2), schema.products.find(3) ] ]; + } + + savedParentMixedChildren() { + this.schema.db.orders.insert([ + { id: '1', name: 'Red', productIds: ['2'] } + ]); + this.schema.db.products.insert([ + { id: '2', name: 'Blue', orderIds: ['1'] } + ]); + let order = this.schema.orders.find(1); + let product1 = this.schema.products.find(2); + let product2 = this.schema.products.new({ name: 'Green' }); + + order.products = [ product1, product2 ]; + + return [ order, [ product1, product2 ] ]; + } + + newParentNoChildren() { + let order = this.schema.orders.new({ name: 'Red' }); + + return [ order, [] ]; + } + + newParentNewChildren() { + let order = this.schema.orders.new({ name: 'Red' }); + let product1 = this.schema.products.new({ name: 'Blue' }); + let product2 = this.schema.products.new({ name: 'Green' }); + + order.products = [ product1, product2 ]; + + return [ order, [ product1, product2 ] ]; + } + + newParentSavedChildren() { + let order = this.schema.orders.new({ name: 'Red' }); + let product1 = this.schema.products.create({ name: 'Blue' }); + let product2 = this.schema.products.create({ name: 'Green' }); + + order.products = [ product1, product2 ]; + + return [ order, [ product1, product2 ] ]; + } + + newParentMixedChildren() { + let order = this.schema.orders.new({ name: 'Red' }); + let product1 = this.schema.products.create({ name: 'Blue' }); + let product2 = this.schema.products.new({ name: 'Green' }); + + order.products = [ product1, product2 ]; + + return [ order, [ product1, product2 ] ]; + } + + // Unassociated child models, used for setting tests + savedChild() { + let insertedProduct = this.db.products.insert({ name: 'Blue' }); + + return this.schema.products.find(insertedProduct.id); + } + + newChild() { + return this.schema.products.new({ name: 'Blue' }); + } + +} + +export const states = [ + 'savedParentNoChildren', + 'savedParentNewChildren', + 'savedParentMixedChildren', + 'savedParentSavedChildren', + 'newParentNoChildren', + 'newParentNewChildren', + 'newParentSavedChildren', + 'newParentMixedChildren' +]; diff --git a/tests/integration/orm/has-many/8-many-to-many/accessor-test.js b/tests/integration/orm/has-many/8-many-to-many/accessor-test.js new file mode 100644 index 000000000..1ed3a728b --- /dev/null +++ b/tests/integration/orm/has-many/8-many-to-many/accessor-test.js @@ -0,0 +1,30 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Many to Many | accessor', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ order, products ] = this.helper[state](); + + assert.equal(order.products.models.length, products.length, 'the parent has the correct number of children'); + assert.equal(order.productIds.length, products.length, 'the parent has the correct number of children ids'); + + products.forEach((p, i) => { + assert.deepEqual(order.products.models[i], p, 'each child is in parent.children array'); + + if (p.isSaved()) { + assert.ok(order.productIds.indexOf(p.id) > -1, 'each saved child id is in parent.childrenIds array'); + } + + // Check the inverse + assert.ok(p.orders.includes(order)); + }); + }); + +}); diff --git a/tests/integration/orm/has-many/8-many-to-many/association-create-test.js b/tests/integration/orm/has-many/8-many-to-many/association-create-test.js new file mode 100644 index 000000000..cce6f9a6c --- /dev/null +++ b/tests/integration/orm/has-many/8-many-to-many/association-create-test.js @@ -0,0 +1,29 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Many to Many | association #create', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can create a has-many association, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can create an associated child`, function(assert) { + let [ order ] = this.helper[state](); + let initialCount = order.products.models.length; + + let orangeProduct = order.createProduct({ name: 'Orange' }); + + assert.ok(orangeProduct.id, 'the child was persisted'); + assert.equal(order.products.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(order.products.includes(orangeProduct), 'the model was added to order.products'); + assert.ok(order.productIds.indexOf(orangeProduct.id) > -1, 'the id was added to the fks array'); + assert.ok(order.attrs.productIds.indexOf(orangeProduct.id) > -1, 'fks were persisted'); + assert.ok(orangeProduct.orders.includes(order), 'the inverse was set'); + }); + +}); diff --git a/tests/integration/orm/has-many/8-many-to-many/association-new-test.js b/tests/integration/orm/has-many/8-many-to-many/association-new-test.js new file mode 100644 index 000000000..2a000ea64 --- /dev/null +++ b/tests/integration/orm/has-many/8-many-to-many/association-new-test.js @@ -0,0 +1,35 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Many to Many | association #new', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can make a new unsaved belongs-to association, for all states +*/ + +states.forEach((state) => { + + test(`a ${state} can build a new associated child`, function(assert) { + let [ order ] = this.helper[state](); + let initialCount = order.products.models.length; + + let blueProduct = order.newProduct({ name: 'Blue' }); + + assert.ok(!blueProduct.id, 'the child was not persisted'); + assert.equal(order.products.models.length, initialCount + 1); + assert.equal(blueProduct.orders.models.length, 1, 'the inverse was set'); + + blueProduct.save(); + + assert.deepEqual(blueProduct.attrs, { id: blueProduct.id, name: 'Blue', orderIds: [ order.id ] }, 'the child was persisted'); + assert.equal(order.products.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(order.products.includes(blueProduct), 'the model was added to order.products'); + assert.ok(order.productIds.indexOf(blueProduct.id) > -1, 'the id was added to the fks array'); + assert.ok(blueProduct.orders.includes(order), 'the inverse was set'); + }); + +}); diff --git a/tests/integration/orm/has-many/8-many-to-many/association-set-ids-test.js b/tests/integration/orm/has-many/8-many-to-many/association-set-ids-test.js new file mode 100644 index 000000000..44202a771 --- /dev/null +++ b/tests/integration/orm/has-many/8-many-to-many/association-set-ids-test.js @@ -0,0 +1,49 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Many to Many | association #setIds', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { + let [ order, originalProducts ] = this.helper[state](); + let savedProduct = this.helper.savedChild(); + + order.productIds = [ savedProduct.id ]; + + assert.deepEqual(order.products.models[0].attrs, savedProduct.attrs); + assert.deepEqual(order.productIds, [ savedProduct.id ]); + + order.save(); + savedProduct.reload(); + + assert.deepEqual(savedProduct.orders.models[0].attrs, order.attrs, 'the inverse was set'); + originalProducts.forEach(p => { + if (p.isSaved()) { + p.reload(); + assert.notOk(p.orders.includes(order), 'old inverses were cleared'); + } + }); + }); + + test(`a ${state} can clear its association via a null childIds`, function(assert) { + let [ order, originalProducts ] = this.helper[state](); + + order.productIds = null; + + assert.deepEqual(order.products.models, []); + assert.deepEqual(order.productIds, []); + + order.save(); + + originalProducts.forEach(p => { + p.reload(); + assert.notOk(p.orders.includes(order), 'old inverses were cleared'); + }); + }); + +}); diff --git a/tests/integration/orm/has-many/8-many-to-many/association-set-test.js b/tests/integration/orm/has-many/8-many-to-many/association-set-test.js new file mode 100644 index 000000000..51d00c58c --- /dev/null +++ b/tests/integration/orm/has-many/8-many-to-many/association-set-test.js @@ -0,0 +1,82 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Many to Many | association #set', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parent, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ order, originalProducts ] = this.helper[state](); + let savedProduct = this.helper.savedChild(); + + order.products = [ savedProduct ]; + + assert.ok(order.products.includes(savedProduct)); + assert.equal(order.productIds[0], savedProduct.id); + assert.ok(savedProduct.orders.includes(order), 'the inverse was set'); + + order.save(); + + originalProducts.forEach(p => { + p.reload(); + assert.notOk(p.orders.includes(order), 'old inverses were cleared'); + }); + }); + + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ order, originalProducts ] = this.helper[state](); + let newProduct = this.helper.newChild(); + + order.products = [ newProduct ]; + + assert.ok(order.products.includes(newProduct)); + assert.equal(order.productIds[0], undefined); + assert.ok(newProduct.orders.includes(order), 'the inverse was set'); + + order.save(); + + originalProducts.forEach(p => { + p.reload(); + assert.notOk(p.orders.includes(order), 'old inverses were cleared'); + }); + }); + + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ order, originalProducts ] = this.helper[state](); + + order.products = [ ]; + + assert.deepEqual(order.productIds, [ ]); + assert.equal(order.products.models.length, 0); + + order.save(); + originalProducts.forEach(p => { + p.reload(); + assert.notOk(p.orders.includes(order), 'old inverses were cleared'); + }); + }); + + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ order, originalProducts ] = this.helper[state](); + + order.products = null; + + assert.deepEqual(order.productIds, [ ]); + assert.equal(order.products.models.length, 0); + + order.save(); + + originalProducts.forEach(p => { + p.reload(); + assert.notOk(p.orders.includes(order), 'old inverses were cleared'); + }); + }); + +}); diff --git a/tests/integration/orm/has-many/8-many-to-many/create-test.js b/tests/integration/orm/has-many/8-many-to-many/create-test.js new file mode 100644 index 000000000..0121ba5ee --- /dev/null +++ b/tests/integration/orm/has-many/8-many-to-many/create-test.js @@ -0,0 +1,97 @@ +import Helper from './_helper'; +import { Model } from 'ember-cli-mirage'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Many to Many | create', { + beforeEach() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + } +}); + +test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let product = schema.products.create(); + let order = schema.orders.create({ + productIds: [ product.id ] + }); + + product.reload(); + + assert.deepEqual(order.productIds, [ product.id ]); + assert.deepEqual(product.orderIds, [ order.id ], 'the inverse was set'); + assert.deepEqual(order.attrs.productIds, [ product.id ], 'the ids were persisted'); + assert.deepEqual(product.attrs.orderIds, [ order.id ], 'the inverse ids were persisted'); + assert.deepEqual(order.products.models[0].attrs, product.attrs); + assert.deepEqual(product.orders.models[0].attrs, order.attrs, 'the inverse was set'); + assert.equal(this.helper.db.orders.length, 1); + assert.equal(this.helper.db.products.length, 1); + assert.deepEqual(this.helper.db.orders[0], { id: '1', productIds: [ '1' ] }); + assert.deepEqual(this.helper.db.products[0], { id: '1', orderIds: [ '1' ] }); +}); + +test('it sets up associations correctly when passing in an array of models', function(assert) { + let { schema } = this.helper; + let product = schema.products.create(); + let order = schema.orders.create({ + products: [ product ] + }); + + product.reload(); + + assert.deepEqual(order.productIds, [ product.id ]); + assert.deepEqual(product.orderIds, [ order.id ], 'the inverse was set'); + assert.deepEqual(order.attrs.productIds, [ product.id ], 'the ids were persisted'); + assert.deepEqual(product.attrs.orderIds, [ order.id ], 'the inverse was set'); + assert.equal(this.helper.db.orders.length, 1); + assert.equal(this.helper.db.products.length, 1); +}); + +test('it sets up associations correctly when passing in a collection', function(assert) { + let { schema } = this.helper; + let product = schema.products.create(); + let order = schema.orders.create({ + products: schema.products.all() + }); + + product.reload(); + + assert.deepEqual(order.productIds, [ product.id ]); + assert.deepEqual(product.orderIds, [ order.id ], 'the inverse was set'); + assert.deepEqual(order.attrs.productIds, [ product.id ]); + assert.deepEqual(product.attrs.orderIds, [ order.id ], 'the inverse was set'); + assert.equal(this.helper.db.orders.length, 1); + assert.equal(this.helper.db.products.length, 1); +}); + +test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.orders.create({ + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.orders.create({ + foos: [ schema.create('foo') ] + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.foos.create(); + schema.foos.create(); + + assert.throws(function() { + schema.orders.create({ + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); +}); diff --git a/tests/integration/orm/has-many/8-many-to-many/delete-test.js b/tests/integration/orm/has-many/8-many-to-many/delete-test.js new file mode 100644 index 000000000..7545b080e --- /dev/null +++ b/tests/integration/orm/has-many/8-many-to-many/delete-test.js @@ -0,0 +1,24 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Many to Many | delete', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ order, products ] = this.helper[state](); + + if (products && products.length) { + products.forEach(t => t.destroy()); + order.reload(); + } + + assert.equal(order.products.length, 0); + assert.equal(order.productIds.length, 0); + }); + +}); diff --git a/tests/integration/orm/has-many/8-many-to-many/new-test.js b/tests/integration/orm/has-many/8-many-to-many/new-test.js new file mode 100644 index 000000000..d099ba357 --- /dev/null +++ b/tests/integration/orm/has-many/8-many-to-many/new-test.js @@ -0,0 +1,81 @@ +import Helper from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Many to Many | new', { + beforeEach() { + this.helper = new Helper(); + this.schema = this.helper.schema; + } +}); + +test('the parent accepts a saved child id', function(assert) { + let product = this.helper.savedChild(); + let order = this.schema.orders.new({ + productIds: [ product.id ] + }); + + assert.deepEqual(order.productIds, [ product.id ]); + assert.deepEqual(order.products.models[0], product); +}); + +test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.orders.new({ productIds: [ 2 ] }); + }, /You're instantiating a order that has a productIds of 2, but some of those records don't exist in the database/); +}); + +test('the parent accepts null children foreign key', function(assert) { + let order = this.schema.orders.new({ productIds: null }); + + assert.equal(order.products.models.length, 0); + assert.deepEqual(order.productIds, []); + assert.deepEqual(order.attrs, { productIds: null }); +}); + +test('the parent accepts saved children', function(assert) { + let product = this.helper.savedChild(); + let order = this.schema.orders.new({ products: [ product ] }); + + assert.deepEqual(order.productIds, [ product.id ]); + assert.deepEqual(order.products.models[0], product); +}); + +test('the parent accepts new children', function(assert) { + let product = this.schema.products.new({ color: 'Red' }); + let order = this.schema.orders.new({ products: [ product ] }); + + assert.deepEqual(order.productIds, [ undefined ]); + assert.deepEqual(order.products.models[0], product); +}); + +test('the parent accepts null children', function(assert) { + let order = this.schema.orders.new({ products: null }); + + assert.equal(order.products.models.length, 0); + assert.deepEqual(order.productIds, []); + assert.deepEqual(order.attrs, { productIds: null }); +}); + +test('the parent accepts children and child ids', function(assert) { + let product = this.helper.savedChild(); + let order = this.schema.orders.new({ products: [ product ], productIds: [ product.id ] }); + + assert.deepEqual(order.productIds, [ product.id ]); + assert.deepEqual(order.products.models[0], product); +}); + +test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let order = this.schema.orders.new({}); + + assert.deepEqual(order.productIds, []); + assert.deepEqual(order.products.models, []); + assert.deepEqual(order.attrs, { productIds: null }); +}); + +test('the parent accepts no reference to children or child ids', function(assert) { + let order = this.schema.orders.new(); + + assert.deepEqual(order.productIds, []); + assert.deepEqual(order.products.models, []); + assert.deepEqual(order.attrs, { productIds: null }); +}); diff --git a/tests/integration/orm/has-many/accessor-test.js b/tests/integration/orm/has-many/accessor-test.js deleted file mode 100644 index dff326347..000000000 --- a/tests/integration/orm/has-many/accessor-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import HasManyHelper from './has-many-helper'; -import {module, test} from 'qunit'; - -module('Integration | ORM | hasMany #accessor'); - -/* - #association behavior works regardless of the state of the parent -*/ - -HasManyHelper.forEachScenario((scenario) => { - test(`the references of a ${scenario.title} are correct`, function(assert) { - let { parent, children, accessor, idsAccessor } = scenario.go(); - assert.equal(parent[accessor].models.length, children.length, 'parent has correct number of children'); - assert.equal(parent[idsAccessor].length, children.length, 'parent has correct number of child ids'); - - children.forEach(function(child, i) { - assert.deepEqual(parent[accessor].models[i], children[i], 'each child is in parent.children array'); - - if (!child.isNew()) { - assert.ok(parent[idsAccessor].indexOf(child.id) > -1, 'each saved child id is in parent.childrenIds array'); - } - }); - }); -}); diff --git a/tests/integration/orm/has-many/create-association-test.js b/tests/integration/orm/has-many/create-association-test.js deleted file mode 100644 index 3be825869..000000000 --- a/tests/integration/orm/has-many/create-association-test.js +++ /dev/null @@ -1,42 +0,0 @@ -import HasManyHelper from './has-many-helper'; -import {module, test} from 'qunit'; - -module('Integration | ORM | hasMany #createAssociation'); - -HasManyHelper.forEachScenario((scenario) => { - if (/^savedParent/.test(scenario.state)) { - test(`${scenario.title} can create an associated child`, function(assert) { - let { parent: user, children, accessor, idsAccessor, createAccessor, otherIdAccessor } = scenario.go(); - - let startingCount = children.length; - - let springfield = user[createAccessor]({ name: '1 Springfield ave' }); - - assert.ok(springfield.id, 'the child was persisted'); - assert.equal(springfield[otherIdAccessor], 1, 'the fk is set'); - assert.equal(user[accessor].models.length, startingCount + 1, 'the collection length is correct'); - assert.deepEqual(user[accessor].filter((a) => a.id === springfield.id).models[0], springfield, 'the homeAddress was added to user.homeAddresses'); - assert.ok(user[idsAccessor].indexOf(springfield.id) > -1, 'the id was added to the fks array'); - }); - - test(`${scenario.title} can create an associated child without passing attrs (regression)`, function(assert) { - let { parent: user, accessor, createAccessor } = scenario.go(); - - let springfield = user[createAccessor](); - - assert.deepEqual(user[accessor].filter((a) => a.id === springfield.id).models[0], springfield, `the homeAddress was added to user.${accessor}`); - }); - } - - if (/^newParent/.test(scenario.state)) { - test(`${scenario.title} cannot create an associated child`, function(assert) { - let { parent, createAccessor } = scenario.go(); - - assert.throws(function() { - parent[createAccessor]({ name: '1 Springfield ave' }); - }, /unless the parent is saved/); - }); - - } - -}); diff --git a/tests/integration/orm/has-many/has-many-helper.js b/tests/integration/orm/has-many/has-many-helper.js deleted file mode 100644 index 5e936ff54..000000000 --- a/tests/integration/orm/has-many/has-many-helper.js +++ /dev/null @@ -1,200 +0,0 @@ -import Model from 'ember-cli-mirage/orm/model'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import { hasMany } from 'ember-cli-mirage'; -import { pluralize, singularize, capitalize, camelize } from 'ember-cli-mirage/utils/inflector'; -import _ from 'lodash'; - -/* - A model with a hasMany association can be in eight states - with respect to its association. This helper class - returns a parent (and its children) in these various states. - - The return value is an array of the form - - [parent, [child1, child2...]] - - where the children array may be undefined. -*/ -class HasManyHelper { - - constructor(opts) { - - let { ownKey, ownModel, otherKey, otherModel } = _.defaults({}, opts, { - ownKey: 'homeAddresses', - ownModel: 'user', - otherKey: 'user', - otherModel: 'homeAddress' - }); - - this.ownKey = ownKey; - this.ownModel = ownModel; - this.otherKey = otherKey; - this.otherModel = otherModel; - this.db = new Db(); - - let hasManyArgs = []; - if (pluralize(otherModel) !== ownKey) { - hasManyArgs.push(otherModel); - } - if (ownModel !== otherKey) { - hasManyArgs.push({ inverse: otherKey }); - } - - this.schema = new Schema(this.db, { - [ownModel]: Model.extend({ - [ownKey]: hasMany(...hasManyArgs) - }), - [otherModel]: Model - }); - } - - savedParentNoChildren() { - let insertedUser = this.db[pluralize(this.ownModel)].insert({ name: 'Link' }); - - return [this.schema[pluralize(this.ownModel)].find(insertedUser.id), []]; - } - - savedParentNewChildren() { - let insertedUser = this.db[pluralize(this.ownModel)].insert({ name: 'Link' }); - - let user = this.schema[pluralize(this.ownModel)].find(insertedUser.id); - let newHomeAddress = user[`new${singularize(capitalize(this.ownKey))}`](); - - return [user, [newHomeAddress]]; - } - - savedParentSavedChildren() { - let insertedUser = this.db[pluralize(this.ownModel)].insert({ name: 'Link' }); - let insertedHomeAddress = this.db[pluralize(this.otherModel)].insert({ name: '123 Hyrule Way', [`${camelize(this.otherKey)}Id`]: insertedUser.id }); - - let user = this.schema[pluralize(this.ownModel)].find(insertedUser.id); - let homeAddress = this.schema[pluralize(this.otherModel)].find(insertedHomeAddress.id); - - return [user, [homeAddress]]; - } - - savedParentMixedChildren() { - let insertedUser = this.db[pluralize(this.ownModel)].insert({ name: 'Link' }); - let insertedHomeAddress = this.db[pluralize(this.otherModel)].insert({ name: '123 Hyrule Way', [`${camelize(this.otherKey)}Id`]: insertedUser.id }); - - let user = this.schema[pluralize(this.ownModel)].find(insertedUser.id); - let savedHomeAddress = this.schema[pluralize(this.otherModel)].find(insertedHomeAddress.id); - let newHomeAddress = user[`new${singularize(capitalize(this.ownKey))}`](); - - return [user, [savedHomeAddress, newHomeAddress]]; - } - - newParentNoChildren() { - let user = this.schema[pluralize(this.ownModel)].new(); - - return [user, []]; - } - - newParentNewChildren() { - let user = this.schema[pluralize(this.ownModel)].new(); - let newHomeAddress = user[`new${singularize(capitalize(this.ownKey))}`](); - - return [user, [newHomeAddress]]; - } - - newParentSavedChildren() { - let insertedHomeAddress = this.db[pluralize(this.otherModel)].insert({ name: '123 Hyrule Way' }); - let savedHomeAddress = this.schema[pluralize(this.otherModel)].find(insertedHomeAddress.id); - let newUser = this.schema[pluralize(this.ownModel)].new({ [this.ownKey]: [savedHomeAddress] }); - - return [newUser, [savedHomeAddress]]; - } - - newParentMixedChildren() { - let insertedHomeAddress = this.db[pluralize(this.otherModel)].insert({ name: '123 Hyrule Way' }); - let savedHomeAddress = this.schema[pluralize(this.otherModel)].find(insertedHomeAddress.id); - let newHomeAddress = this.schema[pluralize(this.otherModel)].new(); - - let newUser = this.schema[pluralize(this.ownModel)].new({ [this.ownKey]: [savedHomeAddress, newHomeAddress] }); - - return [newUser, [savedHomeAddress, newHomeAddress]]; - } - - // Just a saved unassociated child. The id is high so as not to - // interfere with any other children - savedChild() { - let insertedHomeAddress = this.db[pluralize(this.otherModel)].insert({ name: 'foo' }); - - return this.schema[pluralize(this.otherModel)].find(insertedHomeAddress.id); - } - - newChild() { - return this.schema[pluralize(this.otherModel)].new({ name: 'Newbie' }); - } - -} - -HasManyHelper.forEachScenario = function(fn) { - [ - [true, true], - [true, false], - [false, true], - [false, false] - ].forEach(([useDefaultOwnKey, useDefaultOtherKey]) => { - - let accessor = 'homeAddresses'; - let idsAccessor = 'homeAddressIds'; - let createAccessor = 'createHomeAddress'; - let newAccessor = 'newHomeAddress'; - let otherAccessor = 'user'; - let otherIdAccessor = 'userId'; - - let opts = {}; - if (!useDefaultOwnKey) { - opts.ownKey = 'altHomeAddresses'; - accessor = 'altHomeAddresses'; - idsAccessor = 'altHomeAddressIds'; - createAccessor = 'createAltHomeAddress'; - newAccessor = 'newAltHomeAddress'; - } - if (!useDefaultOtherKey) { - opts.otherKey = 'altUser'; - otherAccessor = 'altUser'; - otherIdAccessor = 'altUserId'; - } - - [ - 'savedParentNoChildren', - 'savedParentNewChildren', - 'savedParentSavedChildren', - 'savedParentMixedChildren', - 'newParentNoChildren', - 'newParentNewChildren', - 'newParentSavedChildren', - 'newParentMixedChildren' - ].forEach((state) => { - let title = `${state} with ${useDefaultOwnKey ? 'default' : 'non-default'} own key and ${useDefaultOtherKey ? 'default' : 'non-default'} other key`; - fn({ - go() { - let helper = new HasManyHelper(opts); - - let [parent, children] = helper[state](); - return { - parent, - children, - title, - accessor, - idsAccessor, - createAccessor, - newAccessor, - otherAccessor, - otherIdAccessor, - helper - }; - }, - title, - state, - useDefaultOwnKey, - useDefaultOtherKey - }); - }); - }); -}; - -export default HasManyHelper; diff --git a/tests/integration/orm/has-many/instantiating-test.js b/tests/integration/orm/has-many/instantiating-test.js deleted file mode 100644 index 3316b14ea..000000000 --- a/tests/integration/orm/has-many/instantiating-test.js +++ /dev/null @@ -1,108 +0,0 @@ -import Mirage from 'ember-cli-mirage'; -import Model from 'ember-cli-mirage/orm/model'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import {module, test} from 'qunit'; - -var schema, child1, child2; -module('Integration | ORM | hasMany instantiating with params', { - beforeEach() { - let db = new Db({ - users: [], - homeAddresses: [ - { id: 1, name: '123 Hyrule Way' }, - { id: 2, name: '12 Goron City' } - ] - }); - schema = new Schema(db); - - let User = Model.extend({ - homeAddresses: Mirage.hasMany() - }); - let HomeAddress = Model.extend(); - - schema.registerModels({ - user: User, - homeAddress: HomeAddress - }); - - child1 = schema.homeAddresses.find(1); - child2 = schema.homeAddresses.find(2); - } -}); - -test('children have fks added to their attrs', function(assert) { - let newChild = schema.homeAddresses.new(); - assert.deepEqual(newChild.attrs, { userId: null }); - assert.deepEqual(child1.attrs, { id: '1', name: '123 Hyrule Way', userId: null }); -}); - -test('the parent accepts an array of saved children ids', function(assert) { - let user = schema.users.new({ homeAddressIds: [1, 2] }); - - assert.equal(user.homeAddresses.models.length, 2); - assert.deepEqual(user.homeAddresses.models[0], child1); - assert.deepEqual(user.homeAddresses.models[1], child2); - assert.deepEqual(user.homeAddressIds, ['1', '2']); -}); - -test('the parent errors if one of the child ids doesnt exist', function(assert) { - assert.throws(function() { - schema.users.new({ homeAddressIds: [1, 9] }); - }, /Couldn't find/); -}); - -test('the parent accepts an empty childIds array', function(assert) { - let user = schema.users.new({ homeAddressIds: [] }); - - assert.equal(user.homeAddresses.models.length, 0); -}); - -test('the parent accepts an array of saved child models', function(assert) { - let user = schema.users.new({ homeAddresses: [child1, child2] }); - - assert.deepEqual(user.homeAddressIds, ['1', '2']); - assert.equal(user.homeAddresses.models.length, 2); - assert.deepEqual(user.homeAddresses.models[0], child1); -}); - -test('the parent accepts an array of new child models', function(assert) { - let newAddress1 = schema.homeAddresses.new(); - let newAddress2 = schema.homeAddresses.new(); - let user = schema.users.new({ homeAddresses: [newAddress1, newAddress2] }); - - assert.deepEqual(user.homeAddressIds, [undefined, undefined]); - assert.equal(user.homeAddresses.models.length, 2); - assert.deepEqual(user.homeAddresses.models[0], newAddress1); -}); - -test('the parent accepts a mixed array of new and saved child models', function(assert) { - let newAddress1 = schema.homeAddresses.new(); - let user = schema.users.new({ homeAddresses: [child1, newAddress1] }); - - assert.deepEqual(user.homeAddressIds, ['1', undefined]); - assert.equal(user.homeAddresses.models.length, 2); - assert.deepEqual(user.homeAddresses.models[0], child1); - assert.deepEqual(user.homeAddresses.models[1], newAddress1); -}); - -test('the parent accepts null child models', function(assert) { - let user = schema.users.new({ addresses: [null] }); - - assert.deepEqual(user.homeAddressIds, []); - assert.equal(user.homeAddresses.models.length, 0); -}); - -test('the parent accepts no reference to a child id or model as empty obj', function(assert) { - let user = schema.users.new({}); - - assert.deepEqual(user.homeAddressIds, []); - assert.equal(user.homeAddresses.models.length, 0); -}); - -test('the parent accepts no reference to a child id or model', function(assert) { - let user = schema.users.new(); - - assert.deepEqual(user.homeAddressIds, []); - assert.equal(user.homeAddresses.models.length, 0); -}); diff --git a/tests/integration/orm/has-many/new-association-test.js b/tests/integration/orm/has-many/new-association-test.js deleted file mode 100644 index 192bd4763..000000000 --- a/tests/integration/orm/has-many/new-association-test.js +++ /dev/null @@ -1,38 +0,0 @@ -import HasManyHelper from './has-many-helper'; -import {module, test} from 'qunit'; - -module('Integration | ORM | hasMany #newAssociation'); - -HasManyHelper.forEachScenario((scenario) => { - - test(`${scenario.title} can build a new associated parent`, function(assert) { - let { parent: user, children: homeAddresses, newAccessor, accessor, otherIdAccessor } = scenario.go(); - - let startingCount = homeAddresses.length; - - let springfield = user[newAccessor]({ name: '1 Springfield ave' }); - - assert.ok(!springfield.id, 'the child was not persisted'); - assert.deepEqual(user[accessor].models[startingCount], springfield, `the child is appended to the parent's collection`); - - if (!user.isNew()) { - assert.equal(springfield[otherIdAccessor], user.id, `the new address's fk reference the saved parent`); - } - - user.save(); - - assert.ok(springfield.id, 'saving the parent persists the child'); - assert.equal(springfield[otherIdAccessor], user.id, 'the childs fk was updated'); - assert.equal(springfield.name, '1 Springfield ave', 'the childs attrs were saved'); - }); - - test(`${scenario.title} can build a new associated parent without passing in attrs (regression)`, function(assert) { - let { parent: user, children: homeAddresses, newAccessor, accessor } = scenario.go(); - let startingCount = homeAddresses.length; - - let springfield = user[newAccessor](); - - assert.deepEqual(user[accessor].models[startingCount], springfield, `the child is appended to the parent's collection`); - }); - -}); diff --git a/tests/integration/orm/has-many/set-association-ids-test.js b/tests/integration/orm/has-many/set-association-ids-test.js deleted file mode 100644 index 95d0d0933..000000000 --- a/tests/integration/orm/has-many/set-association-ids-test.js +++ /dev/null @@ -1,52 +0,0 @@ -import HasManyHelper from './has-many-helper'; -import {module, test} from 'qunit'; - -module('Integration | ORM | hasMany #setAssociationIds'); - -HasManyHelper.forEachScenario((scenario) => { - test(`${scenario.title} can update its associationIds to a list of saved child ids`, function(assert) { - let { parent: user, children: homeAddresses, helper, idsAccessor, accessor, otherIdAccessor } = scenario.go(); - - let savedHomeAddress = helper.savedChild(); - - user[idsAccessor] = [savedHomeAddress.id]; - savedHomeAddress.reload(); - - assert.deepEqual(user[accessor].models[0], savedHomeAddress); - homeAddresses.forEach(function(homeAddress) { - if (homeAddress.isSaved()) { - homeAddress.reload(); - assert.equal(homeAddress[otherIdAccessor], null, 'old saved children have their fks cleared'); - } - }); - }); - - if (/^savedParent/.test(scenario.state)) { - test(`updating associationIds to a list of saved children ids updates the child's fk, with ${scenario.title}`, function(assert) { - - let { parent: user, helper, idsAccessor, otherIdAccessor } = scenario.go(); - let savedHomeAddress = helper.savedChild(); - - user[idsAccessor] = [savedHomeAddress.id]; - savedHomeAddress.reload(); - - assert.equal(savedHomeAddress[otherIdAccessor], user.id, `the child's fk was set`); - }); - } - - test(`${scenario.title} can update its associationIds to an empty list`, function(assert) { - let { parent: user, children: homeAddresses, idsAccessor, accessor, otherIdAccessor } = scenario.go(); - - user[idsAccessor] = []; - - assert.equal(user[accessor].models.length, 0); - - homeAddresses.forEach(function(homeAddress) { - if (homeAddress.isSaved()) { - homeAddress.reload(); - assert.equal(homeAddress[otherIdAccessor], null, 'old saved children have their fks cleared'); - } - }); - }); - -}); diff --git a/tests/integration/orm/has-many/set-association-test.js b/tests/integration/orm/has-many/set-association-test.js deleted file mode 100644 index c99242820..000000000 --- a/tests/integration/orm/has-many/set-association-test.js +++ /dev/null @@ -1,124 +0,0 @@ -import HasManyHelper from './has-many-helper'; -import {module, test} from 'qunit'; - -module('Integration | ORM | hasMany #setAssociation', { - beforeEach() { - this.helper = new HasManyHelper(); - } -}); - -HasManyHelper.forEachScenario((scenario) => { - test(`${scenario.title} can update its association to a list of saved children`, function(assert) { - let { parent: user, children: homeAddresses, helper, accessor, otherIdAccessor } = scenario.go(); - let savedHomeAddress = helper.savedChild(); - - user[accessor] = [savedHomeAddress]; - savedHomeAddress.reload(); - - assert.deepEqual(user[accessor].models[0], savedHomeAddress); - homeAddresses.forEach(function(address) { - if (address.isSaved()) { - address.reload(); - assert.equal(address[otherIdAccessor], null, 'old saved children have their fks cleared'); - } - }); - }); - - if (/^savedParent/.test(scenario.state)) { - test(`updating an association to a list of saved children updates the child's fk when ${scenario.title}`, function(assert) { - let { parent: user, helper, accessor, otherIdAccessor } = scenario.go(); - let savedHomeAddress = helper.savedChild(); - - user[accessor] = [savedHomeAddress]; - savedHomeAddress.reload(); - - assert.equal(savedHomeAddress[otherIdAccessor], user.id, `the child's fk was set`); - }); - } - - test(`${scenario.title} can update its association to a list of new children`, function(assert) { - let { parent: user, children: homeAddresses, helper, accessor, otherIdAccessor } = scenario.go(); - let address = helper.newChild(); - - user[accessor] = [address]; - // The address is saved if the user is a saved user. In that case, we need to reload. - if (user.isSaved()) { - address.reload(); - } - - assert.deepEqual(user[accessor].models[0], address); - homeAddresses.forEach(function(address) { - if (address.isSaved()) { - address.reload(); - assert.equal(address[otherIdAccessor], null, 'old saved children have their fks cleared'); - } - }); - }); - - if (/^savedParent/.test(scenario.state)) { - - test(`updating an association to a list of new children saves the children and updates their fks when ${scenario.title}`, function(assert) { - let { parent: user, helper, accessor, otherIdAccessor } = scenario.go(); - let address = helper.newChild(); - - user[accessor] = [address]; - address.reload(); - - assert.ok(address.isSaved(), 'the new child was saved'); - assert.equal(address[otherIdAccessor], user.id, `the child's fk was set`); - }); - } - - test(`${scenario.title} can update its association to a list of mixed children`, function(assert) { - let { parent: user, children: homeAddresses, helper, accessor, otherIdAccessor } = scenario.go(); - let savedHomeAddress = helper.savedChild(); - let newAddress = helper.newChild(); - - user[accessor] = [savedHomeAddress, newAddress]; - savedHomeAddress.reload(); - // The new address is saved if the user is a saved user. In that case, we need to reload. - if (user.isSaved()) { - newAddress.reload(); - } - - assert.deepEqual(user[accessor].models[0], savedHomeAddress); - assert.deepEqual(user[accessor].models[1], newAddress); - homeAddresses.forEach(function(address) { - if (address.isSaved()) { - address.reload(); - assert.equal(address[otherIdAccessor], null, 'old saved children have their fks cleared'); - } - }); - }); - - if (/^savedParent/.test(scenario.state)) { - test(`updating an association to a list of mixed children saves the new children and updates all children's fks when ${scenario.title}`, function(assert) { - let { parent: user, helper, accessor, otherIdAccessor } = scenario.go(); - let savedHomeAddress = helper.savedChild(); - let newHomeAddress = helper.newChild(); - - user[accessor] = [savedHomeAddress, newHomeAddress]; - savedHomeAddress.reload(); - newHomeAddress.reload(); - - assert.ok(newHomeAddress.isSaved(), 'the new child was saved'); - assert.equal(savedHomeAddress[otherIdAccessor], user.id, `the saved child's fk was set`); - assert.equal(newHomeAddress[otherIdAccessor], user.id, `the new child's fk was set`); - }); - } - - test(`${scenario.title} can update its association to an empty list`, function(assert) { - let { parent: user, children: homeAddresses, accessor, otherIdAccessor } = scenario.go(); - - user[accessor] = []; - - assert.equal(user[accessor].models.length, 0); - homeAddresses.forEach(function(address) { - if (address.isSaved()) { - address.reload(); - assert.equal(address[otherIdAccessor], null, 'old saved children have their fks cleared'); - } - }); - }); - -}); diff --git a/tests/integration/orm/mixed/1-one-to-many/_helper.js b/tests/integration/orm/mixed/1-one-to-many/_helper.js new file mode 100644 index 000000000..cfc068c2d --- /dev/null +++ b/tests/integration/orm/mixed/1-one-to-many/_helper.js @@ -0,0 +1,138 @@ +import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +/* + A model with a hasMany association can be in eight states + with respect to its association. This helper class + returns a parent (and its children) in these various states. + + The return value is an array of the form + + [ parent, [child1, child2...] ] + + where the children array may be empty. +*/ +export default class Helper { + + constructor() { + this.db = new Db(); + + this.schema = new Schema(this.db, { + user: Model.extend({ + posts: hasMany() + }), + post: Model.extend({ + user: belongsTo() + }) + }); + } + + savedParentNoChildren() { + let user = this.db.users.insert({ name: 'Link' }); + + return [ this.schema.users.find(user.id), [] ]; + } + + savedParentNewChildren() { + let user = this.schema.users.create({ name: 'Link' }); + let post1 = this.schema.posts.new({ title: 'Lorem' }); + let post2 = this.schema.posts.new({ title: 'Ipsum' }); + + user.posts = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + savedParentSavedChildren() { + let { schema } = this; + schema.db.loadData({ + users: [ + { id: '1', name: 'Link', postIds: ['1', '2'] } + ], + posts: [ + { id: '1', title: 'Lorem', userId: '1' }, + { id: '2', title: 'Ipsum', userId: '1' } + ] + }); + + return [ schema.users.find(1), [ schema.posts.find(1), schema.posts.find(2) ] ]; + } + + savedParentMixedChildren() { + this.schema.db.loadData({ + users: [ + { id: '1', name: 'Link', postIds: ['1'] } + ], + posts: [ + { id: '1', title: 'Lorem', userId: '1' } + ] + }); + let user = this.schema.users.find(1); + let post1 = this.schema.posts.find(1); + let post2 = this.schema.posts.new({ name: 'Ipsum' }); + + user.posts = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + newParentNoChildren() { + let user = this.schema.users.new({ name: 'Link' }); + + return [ user, [] ]; + } + + newParentNewChildren() { + let user = this.schema.users.new({ name: 'Link' }); + let post1 = this.schema.posts.new({ title: 'Lorem' }); + let post2 = this.schema.posts.new({ title: 'Ipsum' }); + + user.posts = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + newParentSavedChildren() { + let user = this.schema.users.new({ name: 'Link' }); + let post1 = this.schema.posts.create({ title: 'Lorem' }); + let post2 = this.schema.posts.create({ title: 'Ipsum' }); + + user.posts = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + newParentMixedChildren() { + let user = this.schema.users.new({ name: 'Link' }); + let post1 = this.schema.posts.create({ title: 'Lorem' }); + let post2 = this.schema.posts.new({ title: 'Ipsum' }); + + user.posts = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + // Unassociated child models, used for setting tests + savedChild() { + let insertedPost = this.db.posts.insert({ title: 'Lorem' }); + + return this.schema.posts.find(insertedPost.id); + } + + newChild() { + return this.schema.posts.new({ title: 'Lorem' }); + } + +} + +export const states = [ + 'savedParentNoChildren', + 'savedParentNewChildren', + 'savedParentSavedChildren', + 'savedParentMixedChildren', + 'newParentNoChildren', + 'newParentNewChildren', + 'newParentSavedChildren', + 'newParentMixedChildren' +]; diff --git a/tests/integration/orm/mixed/1-one-to-many/accessor-test.js b/tests/integration/orm/mixed/1-one-to-many/accessor-test.js new file mode 100644 index 000000000..339c1c87c --- /dev/null +++ b/tests/integration/orm/mixed/1-one-to-many/accessor-test.js @@ -0,0 +1,34 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Mixed | One To Many | accessor', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The reference to a belongs-to association is correct, for all states +*/ +states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ user, posts ] = this.helper[state](); + + assert.equal(user.posts.models.length, posts.length, 'the parent has the correct number of children'); + assert.equal(user.postIds.length, posts.length, 'the parent has the correct number of children ids'); + + posts.forEach((post, i) => { + assert.deepEqual(user.posts.models[i], posts[i], 'each child is in parent.children array'); + + if (post.isSaved()) { + assert.ok(user.postIds.indexOf(post.id) > -1, 'each saved child id is in parent.childrenIds array'); + } + + // Check the inverse + assert.deepEqual(post.user.attrs, user.attrs); + assert.deepEqual(post.userId, user.id); + }); + }); + +}); diff --git a/tests/integration/orm/mixed/1-one-to-many/association-create-test.js b/tests/integration/orm/mixed/1-one-to-many/association-create-test.js new file mode 100644 index 000000000..b472f71cb --- /dev/null +++ b/tests/integration/orm/mixed/1-one-to-many/association-create-test.js @@ -0,0 +1,32 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Mixed | One To Many | association #create', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can create a has-many association, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.posts.models.length; + + let post = user.createPost({ title: 'Lorem ipsum' }); + + assert.ok(post.id, 'the child was persisted'); + assert.equal(user.posts.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.posts.includes(post), 'the model was added to user.posts'); + assert.ok(user.postIds.indexOf(post.id) > -1, 'the id was added to the fks array'); + assert.ok(user.attrs.postIds.indexOf(post.id) > -1, 'fks were persisted'); + + // Check the inverse + assert.deepEqual(post.user.attrs, user.attrs); + assert.deepEqual(post.userId, user.id); + }); + +}); diff --git a/tests/integration/orm/mixed/1-one-to-many/association-new-test.js b/tests/integration/orm/mixed/1-one-to-many/association-new-test.js new file mode 100644 index 000000000..e1d8b893d --- /dev/null +++ b/tests/integration/orm/mixed/1-one-to-many/association-new-test.js @@ -0,0 +1,33 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Mixed | One To Many | association #new', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can make a new unsaved belongs-to association, for all states +*/ + +states.forEach((state) => { + + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.posts.models.length; + + let post = user.newPost({ title: 'Lorem ipsum' }); + + assert.ok(!post.id, 'the child was not persisted'); + assert.equal(user.posts.models.length, initialCount + 1); + + post.save(); + + assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum', userId: user.id }, 'the child was persisted'); + assert.equal(user.posts.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.posts.includes(post), 'the model was added to user.posts'); + assert.ok(user.postIds.indexOf(post.id) > -1, 'the id was added to the fks array'); + }); + +}); diff --git a/tests/integration/orm/mixed/1-one-to-many/association-set-ids-test.js b/tests/integration/orm/mixed/1-one-to-many/association-set-ids-test.js new file mode 100644 index 000000000..c5039e236 --- /dev/null +++ b/tests/integration/orm/mixed/1-one-to-many/association-set-ids-test.js @@ -0,0 +1,59 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Mixed | One To Many | association #setIds', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parentId, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let savedPost = this.helper.savedChild(); + + user.postIds = [ savedPost.id ]; + + assert.ok(user.posts.includes(savedPost)); + assert.deepEqual(user.postIds, [ savedPost.id ]); + + user.save(); + savedPost.reload(); + + // Check the inverse + assert.deepEqual(savedPost.user.attrs, user.attrs); + assert.equal(savedPost.userId, user.id); + + // Check old associates + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } + }); + }); + + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + + user.postIds = null; + + assert.deepEqual(user.posts.models, []); + assert.deepEqual(user.postIds, []); + + user.save(); + + // Check old associates + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } + }); + }); + +}); diff --git a/tests/integration/orm/mixed/1-one-to-many/association-set-test.js b/tests/integration/orm/mixed/1-one-to-many/association-set-test.js new file mode 100644 index 000000000..8eb83a3d5 --- /dev/null +++ b/tests/integration/orm/mixed/1-one-to-many/association-set-test.js @@ -0,0 +1,89 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Mixed | One To Many | association #set', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parent, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let savedPost = this.helper.savedChild(); + + user.posts = [ savedPost ]; + + assert.ok(user.posts.includes(savedPost)); + assert.ok(user.postIds.indexOf(savedPost.id) > -1); + + user.save(); + + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } + }); + }); + + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let newPost = this.helper.newChild(); + + user.posts = [ newPost ]; + + assert.deepEqual(user.postIds, [ undefined ]); + assert.ok(user.posts.includes(newPost)); + + user.save(); + + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } + }); + }); + + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + + user.posts = [ ]; + + assert.deepEqual(user.postIds, [ ]); + assert.equal(user.posts.models.length, 0); + + user.save(); + + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } + }); + }); + + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + + user.posts = null; + + assert.deepEqual(user.postIds, [ ]); + assert.equal(user.posts.models.length, 0); + + user.save(); + + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } + }); + }); + +}); diff --git a/tests/integration/orm/mixed/1-one-to-many/create-test.js b/tests/integration/orm/mixed/1-one-to-many/create-test.js new file mode 100644 index 000000000..ff6070cce --- /dev/null +++ b/tests/integration/orm/mixed/1-one-to-many/create-test.js @@ -0,0 +1,97 @@ +import Helper from './_helper'; +import { Model } from 'ember-cli-mirage'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Mixed | One To Many | create', { + beforeEach() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + } +}); + +test('it sets up associations correctly when passing in the foreign key', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + postIds: [ post.id ] + }); + post.reload(); + + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.attrs.postIds, [ post.id ], 'the ids were persisted'); + assert.ok(user.posts.includes(post)); + assert.deepEqual(post.user.attrs, user.attrs); + + let { db } = this.helper; + assert.equal(db.posts.length, 1); + assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); + assert.equal(db.users.length, 1); + assert.deepEqual(db.users[0], { id: '1', postIds: [ '1' ] }); +}); + +test('it sets up associations correctly when passing in an array of models', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + posts: [ post ] + }); + + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.attrs.postIds, [ post.id ], 'the ids were persisted'); + assert.ok(user.posts.includes(post)); + assert.deepEqual(post.user.attrs, user.attrs); + + let { db } = this.helper; + assert.equal(db.posts.length, 1); + assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); + assert.equal(db.users.length, 1); + assert.deepEqual(db.users[0], { id: '1', postIds: [ '1' ] }); +}); + +test('it sets up associations correctly when passing in a collection', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + posts: this.helper.schema.posts.all() + }); + post.reload(); + + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.attrs.postIds, [ post.id ], 'the ids were persisted'); + assert.ok(user.posts.includes(post)); + + let { db } = this.helper; + assert.equal(db.posts.length, 1); + assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); + assert.equal(db.users.length, 1); + assert.deepEqual(db.users[0], { id: '1', postIds: [ '1' ] }); +}); + +test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('user', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('user', { + foos: [ schema.create('foo') ] + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); + + assert.throws(function() { + schema.create('post', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); +}); diff --git a/tests/integration/orm/mixed/1-one-to-many/instantiating-test.js b/tests/integration/orm/mixed/1-one-to-many/instantiating-test.js new file mode 100644 index 000000000..433791fc6 --- /dev/null +++ b/tests/integration/orm/mixed/1-one-to-many/instantiating-test.js @@ -0,0 +1,81 @@ +import Helper from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Mixed | One To Many | instantiating', { + beforeEach() { + this.helper = new Helper(); + this.schema = this.helper.schema; + } +}); + +test('the parent accepts a saved child id', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ + postIds: [ post.id ] + }); + + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.posts.models[0], post); +}); + +test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ postIds: [ 2 ] }); + }, /You're instantiating a user that has a postIds of 2, but some of those records don't exist in the database/); +}); + +test('the parent accepts null children foreign key', function(assert) { + let user = this.schema.users.new({ postIds: null }); + + assert.equal(user.posts.models.length, 0); + assert.deepEqual(user.postIds, []); + assert.deepEqual(user.attrs, { postIds: null }); +}); + +test('the parent accepts saved children', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ posts: [ post ] }); + + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.posts.models[0], post); +}); + +test('the parent accepts new children', function(assert) { + let post = this.schema.posts.new({ title: 'Lorem' }); + let user = this.schema.users.new({ posts: [ post ] }); + + assert.deepEqual(user.postIds, [ undefined ]); + assert.deepEqual(user.posts.models[0], post); +}); + +test('the parent accepts null children', function(assert) { + let user = this.schema.users.new({ posts: null }); + + assert.equal(user.posts.models.length, 0); + assert.deepEqual(user.postIds, []); + assert.deepEqual(user.attrs, { postIds: null }); +}); + +test('the parent accepts children and child ids', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ posts: [ post ], postIds: [ post.id ] }); + + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.posts.models[0], post); +}); + +test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let user = this.schema.users.new({}); + + assert.deepEqual(user.postIds, []); + assert.deepEqual(user.posts.models, []); + assert.deepEqual(user.attrs, { postIds: null }); +}); + +test('the parent accepts no reference to children or child ids', function(assert) { + let user = this.schema.users.new(); + + assert.deepEqual(user.postIds, []); + assert.deepEqual(user.posts.models, []); + assert.deepEqual(user.attrs, { postIds: null }); +}); diff --git a/tests/integration/orm/mixed/2-many-to-one/_helper.js b/tests/integration/orm/mixed/2-many-to-one/_helper.js new file mode 100644 index 000000000..530a63efc --- /dev/null +++ b/tests/integration/orm/mixed/2-many-to-one/_helper.js @@ -0,0 +1,104 @@ +import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +/* + A model with a hasMany association can be in eight states + with respect to its association. This helper class + returns a parent (and its children) in these various states. + + The return value is an array of the form + + [ parent, [child1, child2...] ] + + where the children array may be empty. +*/ +export default class Helper { + + constructor() { + this.db = new Db(); + + this.schema = new Schema(this.db, { + user: Model.extend({ + posts: hasMany() + }), + post: Model.extend({ + user: belongsTo() + }) + }); + } + + savedChildNoParent() { + let post = this.db.posts.insert({ title: 'Lorem' }); + + return [ this.schema.posts.find(post.id), null ]; + } + + savedChildNewParent() { + let post = this.schema.posts.create({ title: 'Lorem' }); + let user = this.schema.users.new({ name: 'Link' }); + + post.user = user; + + return [ post, user ]; + } + + savedChildSavedParent() { + let { schema } = this; + schema.db.loadData({ + posts: [ + { id: '1', title: 'Lorem', userId: '1' } + ], + users: [ + { id: '1', name: 'Link', postIds: ['1'] } + ] + }); + + return [ schema.posts.find(1), schema.users.find(1) ]; + } + + newChildNoParent() { + let post = this.schema.posts.new({ title: 'Lorem' }); + + return [ post, null ]; + } + + newChildNewParent() { + let post = this.schema.posts.new({ title: 'Lorem' }); + let user = this.schema.users.new({ name: 'Link' }); + + post.user = user; + + return [ post, user ]; + } + + newChildSavedParent() { + let post = this.schema.posts.create({ title: 'Lorem' }); + let user = this.schema.users.new({ name: 'Link' }); + + post.user = user; + + return [ post, user ]; + } + + // Unassociated models + savedParent() { + let insertedUser = this.db.users.insert({ name: 'Link' }); + + return this.schema.users.find(insertedUser.id); + } + + newParent() { + return this.schema.users.new({ name: 'Link' }); + } + +} + +export const states = [ + 'savedChildNoParent', + 'savedChildNewParent', + 'savedChildSavedParent', + 'newChildNoParent', + 'newChildNewParent', + 'newChildSavedParent' +]; diff --git a/tests/integration/orm/mixed/2-many-to-one/accessor-test.js b/tests/integration/orm/mixed/2-many-to-one/accessor-test.js new file mode 100644 index 000000000..27715940b --- /dev/null +++ b/tests/integration/orm/mixed/2-many-to-one/accessor-test.js @@ -0,0 +1,30 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Mixed | Many To One | accessor', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The reference to a belongs-to association is correct, for all states +*/ +states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ post, user ] = this.helper[state](); + + assert.deepEqual(post.user, user); + assert.equal(post.userId, user ? user.id : null); + + post.save(); + + // Check the inverse + if (user && user.isSaved()) { + user.reload(); + assert.ok(user.posts.includes(post)); + } + }); + +}); diff --git a/tests/integration/orm/mixed/2-many-to-one/association-create-test.js b/tests/integration/orm/mixed/2-many-to-one/association-create-test.js new file mode 100644 index 000000000..d68ad5858 --- /dev/null +++ b/tests/integration/orm/mixed/2-many-to-one/association-create-test.js @@ -0,0 +1,34 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Mixed | Many To One | association #create', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can create a has-many association, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can create an associated parent`, function(assert) { + let [ post, originalUser ] = this.helper[state](); + + let user = post.createUser({ name: 'Zelda' }); + + assert.ok(user.id, 'the parent was persisted'); + assert.deepEqual(post.user.attrs, user.attrs); + assert.equal(post.userId, user.id); + + // Check the inverse + assert.ok(user.posts.includes(post), 'the inverse was set'); + + // Ensure old inverse was cleared + if (originalUser && originalUser.isSaved()) { + originalUser.reload(); + assert.notOk(originalUser.posts.includes(post)); + } + }); + +}); diff --git a/tests/integration/orm/mixed/2-many-to-one/association-new-test.js b/tests/integration/orm/mixed/2-many-to-one/association-new-test.js new file mode 100644 index 000000000..8f86664a6 --- /dev/null +++ b/tests/integration/orm/mixed/2-many-to-one/association-new-test.js @@ -0,0 +1,42 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Mixed | Many To One | association #new', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can make a new unsaved belongs-to association, for all states +*/ + +states.forEach((state) => { + + test(`a ${state} can build a new associated parent`, function(assert) { + let [ post, originalUser ] = this.helper[state](); + + let user = post.newUser({ name: 'Zelda' }); + + assert.ok(!user.id, 'the child was not persisted'); + assert.deepEqual(post.user, user, 'the relationship was set'); + assert.ok(user.posts.includes(post), 'the inverse was set'); + + user.save(); + post.reload(); + + assert.ok(user.id, 'the parent was persisted'); + assert.deepEqual(post.user.attrs, user.attrs); + assert.equal(post.userId, user.id); + + // Check the inverse + assert.ok(user.posts.includes(post), 'the inverse was set'); + + // Ensure old inverse was cleared + if (originalUser && originalUser.isSaved()) { + originalUser.reload(); + assert.notOk(originalUser.posts.includes(post)); + } + }); + +}); diff --git a/tests/integration/orm/mixed/2-many-to-one/association-set-ids-test.js b/tests/integration/orm/mixed/2-many-to-one/association-set-ids-test.js new file mode 100644 index 000000000..c0efe4684 --- /dev/null +++ b/tests/integration/orm/mixed/2-many-to-one/association-set-ids-test.js @@ -0,0 +1,54 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Mixed | Many To One | association #setIds', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parentId, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ post, originalUser ] = this.helper[state](); + let user = this.helper.savedParent(); + + post.userId = user.id; + + assert.equal(post.userId, user.id); + assert.deepEqual(post.user.attrs, user.attrs); + + assert.ok(post.user.posts.includes(post), 'the inverse was set'); + + post.save(); + user.reload(); + + assert.ok(user.posts.includes(post)); + + // Old inverses were cleared + if (originalUser && originalUser.isSaved()) { + originalUser.reload(); + assert.notOk(originalUser.posts.includes(post)); + } + }); + + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ post, originalUser ] = this.helper[state](); + + post.userId = null; + + assert.deepEqual(post.user, null); + assert.deepEqual(post.userId, null); + + post.save(); + + if (originalUser && originalUser.isSaved()) { + originalUser.reload(); + assert.notOk(originalUser.posts.includes(post)); + } + }); + +}); diff --git a/tests/integration/orm/mixed/2-many-to-one/association-set-test.js b/tests/integration/orm/mixed/2-many-to-one/association-set-test.js new file mode 100644 index 000000000..b4cd9d8b8 --- /dev/null +++ b/tests/integration/orm/mixed/2-many-to-one/association-set-test.js @@ -0,0 +1,67 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Mixed | Many To One | association #set', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parent, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ post, originalUser ] = this.helper[state](); + let savedUser = this.helper.savedParent(); + + post.user = savedUser; + + assert.deepEqual(post.user, savedUser); + assert.ok(savedUser.posts.includes(post), 'the inverse was set'); + + post.save(); + + // Old inverse was cleared + if (originalUser && originalUser.isSaved()) { + originalUser.reload(); + assert.notOk(originalUser.posts.includes(post)); + } + }); + + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ post, originalUser ] = this.helper[state](); + let newUser = this.helper.newParent(); + + post.user = newUser; + + assert.deepEqual(post.user, newUser); + assert.ok(newUser.posts.includes(post), 'the inverse was set'); + + post.save(); + + // Old inverse was cleared + if (originalUser && originalUser.isSaved()) { + originalUser.reload(); + assert.notOk(originalUser.posts.includes(post)); + } + }); + + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ post, originalUser ] = this.helper[state](); + + post.user = null; + + assert.deepEqual(post.user, null); + + post.save(); + + // Old inverse was cleared + if (originalUser && originalUser.isSaved()) { + originalUser.reload(); + assert.notOk(originalUser.posts.includes(post)); + } + }); + +}); diff --git a/tests/integration/orm/mixed/2-many-to-one/create-test.js b/tests/integration/orm/mixed/2-many-to-one/create-test.js new file mode 100644 index 000000000..06af672e4 --- /dev/null +++ b/tests/integration/orm/mixed/2-many-to-one/create-test.js @@ -0,0 +1,71 @@ +import Helper from './_helper'; +import { Model } from 'ember-cli-mirage'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Mixed | Many To One | create', { + beforeEach() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + } +}); + +test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let user = schema.create('user'); + let post = schema.create('post', { + userId: user.id + }); + user.reload(); + + assert.deepEqual(post.user.attrs, user.attrs); + assert.equal(post.userId, user.id); + assert.ok(user.posts.includes(post), 'inverse was set'); + assert.deepEqual(user.postIds, [ post.id ]); + + let { db } = this.helper; + assert.equal(db.posts.length, 1); + assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); + assert.equal(db.users.length, 1); + assert.deepEqual(db.users[0], { id: '1', postIds: [ '1' ] }); +}); + +test('it sets up associations correctly when passing in the association itself', function(assert) { + let { schema } = this.helper; + let user = schema.create('user'); + let post = schema.create('post', { + user + }); + + assert.deepEqual(post.user.attrs, user.attrs); + assert.equal(post.userId, user.id); + assert.ok(user.posts.includes(post), 'inverse was set'); + assert.deepEqual(user.postIds, [ post.id ]); + + let { db } = this.helper; + assert.equal(db.posts.length, 1); + assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); + assert.equal(db.users.length, 1); + assert.deepEqual(db.users[0], { id: '1', postIds: [ '1' ] }); +}); + +test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('post', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); + + assert.throws(function() { + schema.create('post', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); +}); diff --git a/tests/integration/orm/mixed/2-many-to-one/instantiating-test.js b/tests/integration/orm/mixed/2-many-to-one/instantiating-test.js new file mode 100644 index 000000000..dc788e70e --- /dev/null +++ b/tests/integration/orm/mixed/2-many-to-one/instantiating-test.js @@ -0,0 +1,96 @@ +import Helper from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Mixed | One To Many | instantiating', { + beforeEach() { + this.helper = new Helper(); + this.schema = this.helper.schema; + } +}); + +test('the child accepts a saved parent id', function(assert) { + let user = this.helper.savedParent(); + let post = this.schema.posts.new({ userId: user.id }); + + assert.equal(post.userId, user.id); + assert.deepEqual(post.user.attrs, user.attrs); + assert.deepEqual(post.attrs, { userId: user.id }); + + post.save(); + user.reload(); + + assert.ok(user.posts.includes(post), 'the inverse was set'); +}); + +test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.posts.new({ userId: 2 }); + }, /You're instantiating a post that has a userId of 2, but that record doesn't exist in the database/); +}); + +test('the child accepts a null parent id', function(assert) { + let post = this.schema.posts.new({ userId: null }); + + assert.equal(post.userId, null); + assert.equal(post.user, null); + assert.deepEqual(post.attrs, { userId: null }); +}); + +test('the child accepts a saved parent model', function(assert) { + let user = this.helper.savedParent(); + let post = this.schema.posts.new({ user }); + + assert.equal(post.userId, 1); + assert.deepEqual(post.user.attrs, user.attrs); + assert.deepEqual(post.attrs, { userId: null }); + + post.save(); + user.reload(); + + assert.ok(user.posts.includes(post), 'the inverse was set'); +}); + +test('the child accepts a new parent model', function(assert) { + let user = this.schema.users.new({ age: 300 }); + let post = this.schema.posts.new({ user }); + + assert.equal(post.userId, null); + assert.deepEqual(post.user, user); + assert.deepEqual(post.attrs, { userId: null }); + assert.ok(user.posts.includes(post), 'the inverse was set'); +}); + +test('the child accepts a null parent model', function(assert) { + let post = this.schema.posts.new({ user: null }); + + assert.equal(post.userId, null); + assert.deepEqual(post.user, null); + assert.deepEqual(post.attrs, { userId: null }); +}); + +test('the child accepts a parent model and id', function(assert) { + let user = this.helper.savedParent(); + let post = this.schema.posts.new({ user , userId: user.id }); + + assert.equal(post.userId, '1'); + assert.deepEqual(post.user, user); + assert.deepEqual(post.attrs, { userId: user.id }); + + assert.ok(user.posts.includes(post), 'the inverse was set'); +}); + +test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let post = this.schema.posts.new({}); + + assert.equal(post.userId, null); + assert.deepEqual(post.user, null); + assert.deepEqual(post.attrs, { userId: null }); +}); + +test('the child accepts no reference to a parent id or model', function(assert) { + let post = this.schema.posts.new(); + + assert.equal(post.userId, null); + assert.deepEqual(post.user, null); + assert.deepEqual(post.attrs, { userId: null }); +}); diff --git a/tests/integration/orm/named-associations-test.js b/tests/integration/orm/named-associations-test.js deleted file mode 100644 index 33b8a6802..000000000 --- a/tests/integration/orm/named-associations-test.js +++ /dev/null @@ -1,246 +0,0 @@ -import { module, test } from 'qunit'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Model from 'ember-cli-mirage/orm/model'; -import Db from 'ember-cli-mirage/db'; -import { hasMany, belongsTo } from 'ember-cli-mirage'; - -module('Integration | ORM | Named associations test'); - -test('schemas with a single hasMany have correct foreign keys', function(assert) { - let schema = new Schema(new Db(), { - user: Model.extend({ - projects: hasMany() - }), - project: Model - }); - - // Fks are set up correctly - assert.deepEqual(schema._registry.user.foreignKeys, []); - assert.deepEqual(schema._registry.project.foreignKeys, ['userId']); - - let user = schema.users.create(); - let project = user.createProject(); - - assert.ok(user); - assert.ok(project); -}); - -test('schemas with a single hasMany with a different property name defaults to a foreign key named by type', function(assert) { - let schema = new Schema(new Db(), { - user: Model.extend({ - specialProjects: hasMany('project') - }), - project: Model - }); - - assert.deepEqual(schema._registry.user.foreignKeys, []); - assert.deepEqual(schema._registry.project.foreignKeys, ['userId']); -}); - -test('schemas with a single belongsTo have correct foreign keys', function(assert) { - let schema = new Schema(new Db(), { - user: Model, - project: Model.extend({ - user: belongsTo() - }) - }); - - // Fks are set up correctly - assert.deepEqual(schema._registry.user.foreignKeys, []); - assert.deepEqual(schema._registry.project.foreignKeys, ['userId']); - - let project = schema.projects.create(); - let user = project.createUser(); - - assert.ok(user); - assert.ok(project); -}); - -test('schemas with a single belongsTo with a different property name have correct foreign keys', function(assert) { - let schema = new Schema(new Db(), { - user: Model, - project: Model.extend({ - owner: belongsTo('user') - }) - }); - - // Fks are set up correctly - assert.deepEqual(schema._registry.user.foreignKeys, []); - assert.deepEqual(schema._registry.project.foreignKeys, ['ownerId']); - - let project = schema.projects.create(); - let user = project.createOwner(); - - assert.ok(user); - assert.ok(project); -}); - -test('schemas with a single hasMany and belongsTo have correct foreign keys', function(assert) { - let schema = new Schema(new Db(), { - user: Model.extend({ - projects: hasMany() - }), - project: Model.extend({ - user: belongsTo() - }) - }); - - // Fks are set up correctly - assert.deepEqual(schema._registry.user.foreignKeys, []); - assert.deepEqual(schema._registry.project.foreignKeys, ['userId']); - - let project = schema.projects.create(); - let user = project.createUser(); - - assert.ok(user); - assert.ok(project); -}); - -test('complex schemas have correct foreign keys', function(assert) { - let schema = new Schema(new Db(), { - user: Model.extend({ - projects: hasMany(), - tasks: hasMany() - }), - project: Model.extend({ - user: belongsTo(), - tasks: hasMany() - }), - task: Model.extend({ - user: belongsTo(), - project: belongsTo() - }) - }); - - // Fks are set up correctly - assert.deepEqual(schema._registry.user.foreignKeys, []); - assert.deepEqual(schema._registry.project.foreignKeys, ['userId']); - assert.deepEqual(schema._registry.task.foreignKeys, ['userId', 'projectId']); - - let user = schema.users.create(); - let project = user.createProject(); - let task = user.createTask(); - - assert.ok(user); - assert.ok(project); - assert.ok(task); -}); - -test('foreign keys should be named appropriately for multiword properties', function(assert) { - let schema = new Schema(new Db(), { - author: Model, - post: Model.extend({ - wordSmith: belongsTo('author') - }) - }); - - // Fks are set up correctly - assert.deepEqual(schema._registry.author.foreignKeys, []); - assert.deepEqual(schema._registry.post.foreignKeys, ['wordSmithId']); - - let post = schema.posts.create(); - let wordSmith = post.createWordSmith(); - - assert.ok(post); - assert.ok(wordSmith); - assert.equal(wordSmith.modelName, 'author'); -}); - -test('foreign keys should be named appropriately for multiword model names', function(assert) { - let schema = new Schema(new Db(), { - wordSmith: Model, - post: Model.extend({ - author: belongsTo('word-smith') - }) - }); - - assert.deepEqual(schema._registry.wordSmith.foreignKeys, []); - assert.deepEqual(schema._registry.post.foreignKeys, ['authorId']); - - let post = schema.posts.create(); - let author = post.createAuthor(); - - assert.ok(post); - assert.ok(author); - assert.equal(author.modelName, 'word-smith'); -}); - -test('foreign keys should be named appropriately for multiword properties and model names', function(assert) { - let schema = new Schema(new Db(), { - wordSmith: Model, - post: Model.extend({ - brilliantWriter: belongsTo('word-smith') - }) - }); - - assert.deepEqual(schema._registry.wordSmith.foreignKeys, []); - assert.deepEqual(schema._registry.post.foreignKeys, ['brilliantWriterId']); - - let post = schema.posts.create(); - let brilliantWriter = post.createBrilliantWriter(); - - assert.ok(post); - assert.ok(brilliantWriter); - assert.equal(brilliantWriter.modelName, 'word-smith'); -}); - -test('a model can have multiple belongsTo associations of the same type', function(assert) { - let schema = new Schema(new Db(), { - user: Model, - project: Model.extend({ - admin: belongsTo('user'), - specialUser: belongsTo('user') - }) - }); - - assert.deepEqual(schema._registry.user.foreignKeys, []); - assert.deepEqual(schema._registry.project.foreignKeys, ['adminId', 'specialUserId']); - - let project = schema.projects.create(); - let admin = project.createAdmin(); - let specialUser = project.createSpecialUser(); - - assert.ok(project); - assert.ok(admin); - assert.equal(admin.modelName, 'user'); - assert.ok(specialUser); - assert.equal(specialUser.modelName, 'user'); -}); - -test('multiple hasMany associations of the same type with no explicit inverses throw an error', function(assert) { - assert.throws(() => { - new Schema(new Db(), { - user: Model.extend({ - mainProjects: hasMany('project'), - specialProjects: hasMany('project') - }), - project: Model - }); - }, /multiple possible inverse relationships/); -}); - -test('multiple hasMany associations with explicit inverses sets up the correct foreign keys', function(assert) { - let schema = new Schema(new Db(), { - user: Model.extend({ - mainProjects: hasMany('project', { inverse: 'mainUser' }), - specialProjects: hasMany('project', { inverse: 'specialUser' }) - }), - project: Model - }); - - assert.deepEqual(schema._registry.user.foreignKeys, []); - assert.deepEqual(schema._registry.project.foreignKeys, ['mainUserId', 'specialUserId']); -}); - -test('multiple hasMany associations with one explicit inverse sets up the correct foreign keys', function(assert) { - let schema = new Schema(new Db(), { - user: Model.extend({ - projects: hasMany(), - specialProjects: hasMany('project', { inverse: 'specialUser' }) - }), - project: Model - }); - - assert.deepEqual(schema._registry.user.foreignKeys, []); - assert.deepEqual(schema._registry.project.foreignKeys, ['userId', 'specialUserId']); -}); diff --git a/tests/integration/orm/reinitialize-associations-test.js b/tests/integration/orm/reinitialize-associations-test.js index 1167cc291..7d31a8f91 100644 --- a/tests/integration/orm/reinitialize-associations-test.js +++ b/tests/integration/orm/reinitialize-associations-test.js @@ -1,12 +1,12 @@ -import Mirage from 'ember-cli-mirage'; -import Model from 'ember-cli-mirage/orm/model'; +// jscs:disable disallowVar +import { Model, hasMany } from 'ember-cli-mirage'; import Schema from 'ember-cli-mirage/orm/schema'; import Db from 'ember-cli-mirage/db'; import {module, test} from 'qunit'; // Model classes are defined statically, just like in a typical app var User = Model.extend({ - addresses: Mirage.hasMany() + addresses: hasMany() }); var Address = Model.extend(); @@ -17,8 +17,8 @@ module('Integration | ORM | reinitialize associations', { user: User }); - this.schema.users.create({ id: 1, name: 'Link' }); - this.schema.addresses.create({ id: 1, country: 'Hyrule', userId: 1 }); + this.schema.addresses.create({ id: 1, country: 'Hyrule' }); + this.schema.users.create({ id: 1, name: 'Link', addressIds: [ 1 ] }); } }); diff --git a/tests/integration/orm/schema-verification/belongs-to-test.js b/tests/integration/orm/schema-verification/belongs-to-test.js new file mode 100644 index 000000000..a2973a5ad --- /dev/null +++ b/tests/integration/orm/schema-verification/belongs-to-test.js @@ -0,0 +1,136 @@ +import { Model, belongsTo } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Schema Verification | Belongs To'); + +test('a one-way belongsTo association is correct', function(assert) { + let schema = new Schema(new Db(), { + author: Model.extend(), + post: Model.extend({ + author: belongsTo() + }) + }); + + let association = schema.modelClassFor('post').associationFor('author'); + + assert.equal(association.key, 'author'); + assert.equal(association.modelName, 'author'); + assert.equal(association.ownerModelName, 'post'); + assert.ok(association.inverse() === null, 'there is no inverse'); +}); + +test('a one-way named belongsTo association is correct', function(assert) { + let schema = new Schema(new Db(), { + user: Model.extend(), + post: Model.extend({ + author: belongsTo('user') + }) + }); + + let association = schema.modelClassFor('post').associationFor('author'); + + assert.equal(association.key, 'author'); + assert.equal(association.modelName, 'user'); + assert.equal(association.ownerModelName, 'post'); + assert.ok(association.inverse() === null, 'there is no inverse'); +}); + +test('a reflexive belongsTo association is correct and has an implicit inverse', function(assert) { + let schema = new Schema(new Db(), { + user: Model.extend({ + user: belongsTo() + }) + }); + + let association = schema.modelClassFor('user').associationFor('user'); + + assert.equal(association.key, 'user'); + assert.equal(association.modelName, 'user'); + assert.equal(association.ownerModelName, 'user'); + assert.ok(association.inverse() === association, 'the implicit inverse was found'); +}); + +test('a named reflexive belongsTo association with an implicit inverse is correct', function(assert) { + let schema = new Schema(new Db(), { + user: Model.extend({ + bestFriend: belongsTo('user') + }) + }); + + let association = schema.modelClassFor('user').associationFor('bestFriend'); + + assert.equal(association.key, 'bestFriend'); + assert.equal(association.modelName, 'user'); + assert.equal(association.ownerModelName, 'user'); + assert.ok(association.inverse() === association, 'the implicit inverse was found'); +}); + +test('a named reflexive belongsTo association with an explicit inverse is correct', function(assert) { + let schema = new Schema(new Db(), { + user: Model.extend({ + bestFriend: belongsTo('user', { inverse: 'bestFriend' }) + }) + }); + + let association = schema.modelClassFor('user').associationFor('bestFriend'); + + assert.equal(association.key, 'bestFriend'); + assert.equal(association.modelName, 'user'); + assert.equal(association.ownerModelName, 'user'); + assert.ok(association.inverse() === association, 'the implicit inverse was found'); +}); + +test('a one way reflexive belongsTo association with a null inverse is correct', function(assert) { + let schema = new Schema(new Db(), { + user: Model.extend({ + user: belongsTo('user', { inverse: null }) + }) + }); + + let association = schema.modelClassFor('user').associationFor('user'); + + assert.equal(association.key, 'user'); + assert.equal(association.modelName, 'user'); + assert.equal(association.ownerModelName, 'user'); + assert.ok(association.inverse() === null, 'there is no inverse'); +}); + +test('a named way reflexive belongsTo association with a null inverse is correct', function(assert) { + let schema = new Schema(new Db(), { + user: Model.extend({ + parent: belongsTo('user', { inverse: null }) + }) + }); + + let association = schema.modelClassFor('user').associationFor('parent'); + + assert.equal(association.key, 'parent'); + assert.equal(association.modelName, 'user'); + assert.equal(association.ownerModelName, 'user'); + assert.ok(association.inverse() === null, 'there is no inverse'); +}); + +test('a one to one belongsTo association with an implicit inverse is correct', function(assert) { + let schema = new Schema(new Db(), { + user: Model.extend({ + profile: belongsTo() + }), + profile: Model.extend({ + user: belongsTo() + }) + }); + + let association = schema.modelClassFor('profile').associationFor('user'); + + assert.equal(association.key, 'user'); + assert.equal(association.modelName, 'user'); + assert.equal(association.ownerModelName, 'profile'); + + let inverse = association.inverse(); + + assert.equal(inverse.key, 'profile'); + assert.equal(inverse.modelName, 'profile'); + assert.equal(inverse.ownerModelName, 'user'); +}); diff --git a/tests/integration/orm/schema-verification/has-many-test.js b/tests/integration/orm/schema-verification/has-many-test.js new file mode 100644 index 000000000..320ef36e3 --- /dev/null +++ b/tests/integration/orm/schema-verification/has-many-test.js @@ -0,0 +1,53 @@ +import { Model, hasMany } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Schema Verification | Has Many'); + +test('a one-way has many association is correct', function(assert) { + let schema = new Schema(new Db(), { + user: Model.extend({ + posts: hasMany() + }), + post: Model.extend() + }); + + let association = schema.modelClassFor('user').associationFor('posts'); + + assert.equal(association.key, 'posts'); + assert.equal(association.modelName, 'post'); + assert.equal(association.ownerModelName, 'user'); + assert.ok(association.inverse() === null, 'there is no inverse'); +}); + +test('a named one-way has many association is correct', function(assert) { + let schema = new Schema(new Db(), { + user: Model.extend({ + blogPosts: hasMany('post') + }), + post: Model.extend() + }); + + let association = schema.modelClassFor('user').associationFor('blogPosts'); + + assert.equal(association.key, 'blogPosts'); + assert.equal(association.modelName, 'post'); + assert.equal(association.ownerModelName, 'user'); + assert.ok(association.inverse() === null, 'there is no inverse'); +}); + +test('a reflexive hasMany association with an implicit inverse is correct', function(assert) { + let schema = new Schema(new Db(), { + tag: Model.extend({ + tags: hasMany() + }) + }); + + let association = schema.modelClassFor('tag').associationFor('tags'); + + assert.equal(association.key, 'tags'); + assert.equal(association.modelName, 'tag'); + assert.equal(association.ownerModelName, 'tag'); + assert.ok(association.inverse() === association, 'the implicit inverse was found'); +}); diff --git a/tests/integration/orm/schema-verification/mixed-test.js b/tests/integration/orm/schema-verification/mixed-test.js new file mode 100644 index 000000000..0952f0569 --- /dev/null +++ b/tests/integration/orm/schema-verification/mixed-test.js @@ -0,0 +1,69 @@ +import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Schema Verification | Mixed'); + +test('unnamed one-to-many associations are correct', function(assert) { + let schema = new Schema(new Db(), { + wordSmith: Model.extend({ + blogPosts: hasMany() + }), + blogPost: Model.extend({ + wordSmith: belongsTo() + }) + }); + + let association = schema.associationsFor('word-smith').blogPosts; + let inverse = schema.associationsFor('blog-post').wordSmith; + + assert.equal(association.key, 'blogPosts'); + assert.equal(association.modelName, 'blog-post'); + assert.equal(association.ownerModelName, 'word-smith'); + assert.deepEqual(association.inverse(), inverse); +}); + +test('a named one-to-many association is correct', function(assert) { + let schema = new Schema(new Db(), { + wordSmith: Model.extend({ + posts: hasMany('blog-post') + }), + blogPost: Model.extend({ + author: belongsTo('word-smith') + }) + }); + + let association = schema.associationsFor('word-smith').posts; + let inverse = schema.associationsFor('blog-post').author; + + assert.equal(association.key, 'posts'); + assert.equal(association.modelName, 'blog-post'); + assert.equal(association.ownerModelName, 'word-smith'); + assert.deepEqual(association.inverse(), inverse); +}); + +test('multiple has-many associations of the same type', function(assert) { + let schema = new Schema(new Db(), { + user: Model.extend({ + notes: hasMany('post', { inverse: 'author' }), + messages: hasMany('post', { inverse: 'messenger' }) + }), + post: Model.extend({ + author: belongsTo('user', { inverse: 'notes' }), + messenger: belongsTo('user', { inverse: 'messages' }) + }) + }); + + let { notes, messages } = schema.associationsFor('user'); + let { author, messenger } = schema.associationsFor('post'); + + assert.equal(notes.key, 'notes'); + assert.equal(notes.modelName, 'post'); + assert.equal(notes.ownerModelName, 'user'); + assert.deepEqual(notes.inverse(), author); + assert.equal(messages.key, 'messages'); + assert.equal(messages.modelName, 'post'); + assert.equal(messages.ownerModelName, 'user'); + assert.deepEqual(messages.inverse(), messenger); +}); diff --git a/tests/integration/route-handlers/delete-shorthand-test.js b/tests/integration/route-handlers/delete-shorthand-test.js index a9c7b3201..e22d15e80 100644 --- a/tests/integration/route-handlers/delete-shorthand-test.js +++ b/tests/integration/route-handlers/delete-shorthand-test.js @@ -21,7 +21,7 @@ module('Integration | Route Handlers | DELETE shorthand', { this.server.logging = false; let wordSmiths = [ - { id: 1, name: 'Ganon' } + { id: 1, name: 'Ganon', blogPostIds: [1] } ]; let blogPosts = [ { id: 1, title: 'Lorem', wordSmithId: '1' }, @@ -71,7 +71,7 @@ test('string shorthand deletes the record of the specified type', function(asser test('array shorthand deletes the record and all related records', function(assert) { let request = { url: '/word-smiths/1', params: { id: '1' } }; - let handler = new DeleteShorthandRouteHandler(this.schema, this.serializer, ['word-smith', 'blog-post']); + let handler = new DeleteShorthandRouteHandler(this.schema, this.serializer, ['word-smith', 'blog-posts']); let response = handler.handle(request); diff --git a/tests/integration/serializers/active-model-serializer-test.js b/tests/integration/serializers/active-model-serializer-test.js index de7d21691..601bb1c32 100644 --- a/tests/integration/serializers/active-model-serializer-test.js +++ b/tests/integration/serializers/active-model-serializer-test.js @@ -41,6 +41,12 @@ module('Integration | Serializer | ActiveModelSerializer', { attrs: ['id', 'name'], include: ['blogPosts'] }), + blogPost: ActiveModelSerializer.extend({ + include: ['wordSmith'] + }), + contactInfo: ActiveModelSerializer.extend({ + include: ['user'] + }), user: ActiveModelSerializer.extend({ attrs: ['id', 'name'], include: ['contactInfos'], diff --git a/tests/integration/serializers/base/associations/sideloading-assorted-collections-test.js b/tests/integration/serializers/base/associations/sideloading-assorted-collections-test.js index ea2b10a51..f66f6a625 100644 --- a/tests/integration/serializers/base/associations/sideloading-assorted-collections-test.js +++ b/tests/integration/serializers/base/associations/sideloading-assorted-collections-test.js @@ -1,11 +1,20 @@ +import { Model, hasMany } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import Serializer from 'ember-cli-mirage/serializer'; -import schemaHelper from '../../schema-helper'; -import {module, test} from 'qunit'; +import { module, test } from 'qunit'; module('Integration | Serializers | Base | Associations | Sideloading Assorted Collections', { beforeEach() { - this.schema = schemaHelper.setup(); + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + blogPosts: hasMany() + }), + blogPost: Model, + greatPhoto: Model + }); + let BaseSerializer = Serializer.extend({ embed: false }); @@ -19,13 +28,13 @@ module('Integration | Serializers | Base | Associations | Sideloading Assorted C }) }); this.wordSmiths = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' }, - { id: '3', name: 'Epona' } + { id: '1', name: 'Link', blogPostIds: ['1', '2'] }, + { id: '2', name: 'Zelda', blogPostIds: [] }, + { id: '3', name: 'Epona', blogPostIds: [] } ]; this.blogPosts = [ - { id: '1', title: 'Lorem', wordSmithId: '1' }, - { id: '2', title: 'Ipsum', wordSmithId: '1' } + { id: '1', title: 'Lorem' }, + { id: '2', title: 'Ipsum' } ]; this.greatPhotos = [ { id: '1', title: 'Amazing', location: 'Hyrule' }, @@ -49,10 +58,7 @@ test(`it can sideload an array of assorted collections that have relationships`, let result = this.registry.serialize([this.schema.wordSmiths.all(), this.schema.greatPhotos.all()]); assert.deepEqual(result, { - wordSmiths: this.wordSmiths.map((attrs) => { - attrs.blogPostIds = this.blogPosts.filter((blogPost) => blogPost.wordSmithId === attrs.id).map((blogPost) => blogPost.id); - return attrs; - }), + wordSmiths: this.wordSmiths, blogPosts: this.blogPosts, greatPhotos: this.greatPhotos.map((attrs) => { delete attrs.location; diff --git a/tests/integration/serializers/base/associations/sideloading-collection-test.js b/tests/integration/serializers/base/associations/sideloading-collection-test.js index a51d01057..6ea6e0f10 100644 --- a/tests/integration/serializers/base/associations/sideloading-collection-test.js +++ b/tests/integration/serializers/base/associations/sideloading-collection-test.js @@ -1,20 +1,33 @@ +import Schema from 'ember-cli-mirage/orm/schema'; +import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; +import Db from 'ember-cli-mirage/db'; import Serializer from 'ember-cli-mirage/serializer'; import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import schemaHelper from '../../schema-helper'; import { module, test } from 'qunit'; module('Integration | Serializers | Base | Associations | Sideloading Collections', { beforeEach() { - this.schema = schemaHelper.setup(); + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + posts: hasMany('blog-post') + }), + blogPost: Model.extend({ + author: belongsTo('word-smith'), + comments: hasMany('fine-comment') + }), + fineComment: Model.extend({ + post: belongsTo('blog-post') + }) + }); let link = this.schema.wordSmiths.create({ name: 'Link' }); - let blogPost = link.createBlogPost({ title: 'Lorem' }); - link.createBlogPost({ title: 'Ipsum' }); + let blogPost = link.createPost({ title: 'Lorem' }); + link.createPost({ title: 'Ipsum' }); - blogPost.createFineComment({ text: 'pwned' }); + blogPost.createComment({ text: 'pwned' }); let zelda = this.schema.wordSmiths.create({ name: 'Zelda' }); - zelda.createBlogPost({ title: `Zeldas blogPost` }); + zelda.createPost({ title: `Zeldas blogPost` }); this.BaseSerializer = Serializer.extend({ embed: false @@ -30,7 +43,7 @@ test(`it throws an error if embed is false and root is false`, function(assert) let registry = new SerializerRegistry(this.schema, { wordSmith: this.BaseSerializer.extend({ root: false, - include: ['blogPosts'] + include: ['posts'] }) }); @@ -46,7 +59,7 @@ test(`it can sideload an empty collection`, function(assert) { let registry = new SerializerRegistry(this.schema, { application: this.BaseSerializer, wordSmith: this.BaseSerializer.extend({ - include: ['blogPosts'] + include: ['posts'] }) }); @@ -62,7 +75,7 @@ test(`it can sideload a collection with a has-many relationship`, function(asser application: this.BaseSerializer, wordSmith: this.BaseSerializer.extend({ embed: false, - include: ['blogPosts'] + include: ['posts'] }) }); @@ -71,13 +84,13 @@ test(`it can sideload a collection with a has-many relationship`, function(asser assert.deepEqual(result, { wordSmiths: [ - { id: '1', name: 'Link', blogPostIds: ['1', '2'] }, - { id: '2', name: 'Zelda', blogPostIds: ['3'] } + { id: '1', name: 'Link', postIds: ['1', '2'] }, + { id: '2', name: 'Zelda', postIds: ['3'] } ], blogPosts: [ - { id: '1', title: 'Lorem', wordSmithId: '1' }, - { id: '2', title: 'Ipsum', wordSmithId: '1' }, - { id: '3', title: 'Zeldas blogPost', wordSmithId: '2' } + { id: '1', title: 'Lorem' }, + { id: '2', title: 'Ipsum' }, + { id: '3', title: 'Zeldas blogPost' } ] }); }); @@ -87,10 +100,10 @@ test(`it can sideload a collection with a chain of has-many relationships`, func application: this.BaseSerializer, wordSmith: this.BaseSerializer.extend({ embed: false, - include: ['blogPosts'] + include: ['posts'] }), blogPost: this.BaseSerializer.extend({ - include: ['fineComments'] + include: ['comments'] }) }); @@ -99,16 +112,16 @@ test(`it can sideload a collection with a chain of has-many relationships`, func assert.deepEqual(result, { wordSmiths: [ - { id: '1', name: 'Link', blogPostIds: ['1', '2'] }, - { id: '2', name: 'Zelda', blogPostIds: ['3'] } + { id: '1', name: 'Link', postIds: ['1', '2'] }, + { id: '2', name: 'Zelda', postIds: ['3'] } ], blogPosts: [ - { id: '1', title: 'Lorem', wordSmithId: '1', fineCommentIds: ['1'] }, - { id: '2', title: 'Ipsum', wordSmithId: '1', fineCommentIds: [] }, - { id: '3', title: 'Zeldas blogPost', wordSmithId: '2', fineCommentIds: [] } + { id: '1', title: 'Lorem', commentIds: ['1'] }, + { id: '2', title: 'Ipsum', commentIds: [] }, + { id: '3', title: 'Zeldas blogPost', commentIds: [] } ], fineComments: [ - { id: '1', text: 'pwned', blogPostId: '1' } + { id: '1', text: 'pwned' } ] }); }); @@ -118,10 +131,10 @@ test(`it avoids circularity when serializing a collection`, function(assert) { application: this.BaseSerializer, wordSmith: this.BaseSerializer.extend({ embed: false, - include: ['blogPosts'] + include: ['posts'] }), blogPost: this.BaseSerializer.extend({ - include: ['wordSmith'] + include: ['author'] }) }); @@ -130,13 +143,13 @@ test(`it avoids circularity when serializing a collection`, function(assert) { assert.deepEqual(result, { wordSmiths: [ - { id: '1', name: 'Link', blogPostIds: ['1', '2'] }, - { id: '2', name: 'Zelda', blogPostIds: ['3'] } + { id: '1', name: 'Link', postIds: ['1', '2'] }, + { id: '2', name: 'Zelda', postIds: ['3'] } ], blogPosts: [ - { id: '1', title: 'Lorem', wordSmithId: '1' }, - { id: '2', title: 'Ipsum', wordSmithId: '1' }, - { id: '3', title: 'Zeldas blogPost', wordSmithId: '2' } + { id: '1', title: 'Lorem', authorId: '1' }, + { id: '2', title: 'Ipsum', authorId: '1' }, + { id: '3', title: 'Zeldas blogPost', authorId: '2' } ] }); }); @@ -146,7 +159,7 @@ test(`it can sideload a collection with a belongs-to relationship`, function(ass application: this.BaseSerializer, blogPost: this.BaseSerializer.extend({ embed: false, - include: ['wordSmith'] + include: ['author'] }) }); @@ -155,9 +168,9 @@ test(`it can sideload a collection with a belongs-to relationship`, function(ass assert.deepEqual(result, { blogPosts: [ - { id: '1', title: 'Lorem', wordSmithId: '1' }, - { id: '2', title: 'Ipsum', wordSmithId: '1' }, - { id: '3', title: 'Zeldas blogPost', wordSmithId: '2' } + { id: '1', title: 'Lorem', authorId: '1' }, + { id: '2', title: 'Ipsum', authorId: '1' }, + { id: '3', title: 'Zeldas blogPost', authorId: '2' } ], wordSmiths: [ { id: '1', name: 'Link' }, @@ -171,10 +184,10 @@ test(`it can sideload a collection with a chain of belongs-to relationships`, fu application: this.BaseSerializer, fineComment: this.BaseSerializer.extend({ embed: false, - include: ['blogPost'] + include: ['post'] }), blogPost: this.BaseSerializer.extend({ - include: ['wordSmith'] + include: ['author'] }) }); @@ -183,30 +196,13 @@ test(`it can sideload a collection with a chain of belongs-to relationships`, fu assert.deepEqual(result, { fineComments: [ - { id: '1', text: 'pwned', blogPostId: '1' } + { id: '1', text: 'pwned', postId: '1' } ], blogPosts: [ - { id: '1', title: 'Lorem', wordSmithId: '1' } + { id: '1', title: 'Lorem', authorId: '1' } ], wordSmiths: [ { id: '1', name: 'Link' } ] }); }); - -test(`it skips an empty belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - foo: this.BaseSerializer.extend({ - include: ['bar'] - }) - }); - - let foo1 = this.schema.foos.create({ name: 'test foo' }); - let result = registry.serialize(foo1); - - assert.deepEqual(result, { - foo: - { id: '1', name: 'test foo', barId: null } - }); -}); diff --git a/tests/integration/serializers/base/associations/sideloading-model-test.js b/tests/integration/serializers/base/associations/sideloading-model-test.js index 8496f47a6..4ed443093 100644 --- a/tests/integration/serializers/base/associations/sideloading-model-test.js +++ b/tests/integration/serializers/base/associations/sideloading-model-test.js @@ -3,18 +3,28 @@ import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; import Db from 'ember-cli-mirage/db'; import Serializer from 'ember-cli-mirage/serializer'; import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import schemaHelper from '../../schema-helper'; import { module, test } from 'qunit'; module('Integration | Serializers | Base | Associations | Sideloading Models', { beforeEach() { - this.schema = schemaHelper.setup(); + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + posts: hasMany('blog-post') + }), + blogPost: Model.extend({ + author: belongsTo('word-smith'), + comments: hasMany('fine-comment') + }), + fineComment: Model.extend({ + post: belongsTo('blog-post') + }) + }); let wordSmith = this.schema.wordSmiths.create({ name: 'Link' }); - let blogPost = wordSmith.createBlogPost({ title: 'Lorem' }); - blogPost.createFineComment({ text: 'pwned' }); + let blogPost = wordSmith.createPost({ title: 'Lorem' }); + blogPost.createComment({ text: 'pwned' }); - wordSmith.createBlogPost({ title: 'Ipsum' }); + wordSmith.createPost({ title: 'Ipsum' }); this.schema.wordSmiths.create({ name: 'Zelda' }); @@ -32,7 +42,7 @@ test(`it throws an error if embed is false and root is false`, function(assert) let registry = new SerializerRegistry(this.schema, { wordSmith: this.BaseSerializer.extend({ root: false, - include: ['blogPosts'] + include: ['posts'] }) }); @@ -45,54 +55,24 @@ test(`it throws an error if embed is false and root is false`, function(assert) test(`it can sideload a model with a has-many relationship`, function(assert) { let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['blogPosts'] - }) - }); - - let link = this.schema.wordSmiths.find(1); - let result = registry.serialize(link); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - blogPostIds: ['1', '2'] - }, - blogPosts: [ - { id: '1', title: 'Lorem', wordSmithId: '1' }, - { id: '2', title: 'Ipsum', wordSmithId: '1' } - ] - }); -}); - -test(`it can sideload a named has-many association`, function(assert) { - let schema = new Schema(new Db(), { - wordSmith: Model.extend({ - posts: hasMany('blog-post') - }), - blogPost: Model - }); - let link = schema.wordSmiths.create({ name: 'Link' }); - link.createPost({ title: 'Lorem' }); - let registry = new SerializerRegistry(schema, { application: this.BaseSerializer, wordSmith: this.BaseSerializer.extend({ include: ['posts'] }) }); + let link = this.schema.wordSmiths.find(1); let result = registry.serialize(link); assert.deepEqual(result, { wordSmith: { id: '1', name: 'Link', - postIds: ['1'] + postIds: ['1', '2'] }, blogPosts: [ - { id: '1', title: 'Lorem', wordSmithId: '1' } + { id: '1', title: 'Lorem' }, + { id: '2', title: 'Ipsum' } ] }); }); @@ -101,10 +81,10 @@ test(`it can sideload a model with a chain of has-many relationships`, function( let registry = new SerializerRegistry(this.schema, { application: this.BaseSerializer, wordSmith: this.BaseSerializer.extend({ - include: ['blogPosts'] + include: ['posts'] }), blogPost: this.BaseSerializer.extend({ - include: ['fineComments'] + include: ['comments'] }) }); @@ -115,14 +95,14 @@ test(`it can sideload a model with a chain of has-many relationships`, function( wordSmith: { id: '1', name: 'Link', - blogPostIds: ['1', '2'] + postIds: ['1', '2'] }, blogPosts: [ - { id: '1', title: 'Lorem', wordSmithId: '1', fineCommentIds: ['1'] }, - { id: '2', title: 'Ipsum', wordSmithId: '1', fineCommentIds: [] } + { id: '1', title: 'Lorem', commentIds: ['1'] }, + { id: '2', title: 'Ipsum', commentIds: [] } ], fineComments: [ - { id: '1', text: 'pwned', blogPostId: '1' } + { id: '1', text: 'pwned' } ] }); }); @@ -131,10 +111,10 @@ test(`it avoids circularity when serializing a model`, function(assert) { let registry = new SerializerRegistry(this.schema, { application: this.BaseSerializer, wordSmith: this.BaseSerializer.extend({ - include: ['blogPosts'] + include: ['posts'] }), blogPost: this.BaseSerializer.extend({ - include: ['wordSmith'] + include: ['author'] }) }); @@ -145,11 +125,11 @@ test(`it avoids circularity when serializing a model`, function(assert) { wordSmith: { id: '1', name: 'Link', - blogPostIds: ['1', '2'] + postIds: ['1', '2'] }, blogPosts: [ - { id: '1', title: 'Lorem', wordSmithId: '1' }, - { id: '2', title: 'Ipsum', wordSmithId: '1' } + { id: '1', title: 'Lorem', authorId: '1' }, + { id: '2', title: 'Ipsum', authorId: '1' } ] }); }); @@ -158,41 +138,13 @@ test(`it can sideload a model with a belongs-to relationship`, function(assert) let registry = new SerializerRegistry(this.schema, { application: this.BaseSerializer, blogPost: this.BaseSerializer.extend({ - include: ['wordSmith'] + include: ['author'] }) }); let blogPost = this.schema.blogPosts.find(1); let result = registry.serialize(blogPost); - assert.deepEqual(result, { - blogPost: { - id: '1', title: 'Lorem', wordSmithId: '1' - }, - wordSmiths: [ - { id: '1', name: 'Link' } - ] - }); -}); - -test(`it can sideload a model with a named belongs-to relationship`, function(assert) { - let schema = new Schema(new Db(), { - wordSmith: Model, - blogPost: Model.extend({ - author: belongsTo('word-smith') - }) - }); - let post = schema.blogPosts.create({ title: 'Lorem' }); - post.createAuthor({ name: 'Link' }); - let registry = new SerializerRegistry(schema, { - application: this.BaseSerializer, - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let result = registry.serialize(post); - assert.deepEqual(result, { blogPost: { id: '1', title: 'Lorem', authorId: '1' @@ -207,10 +159,10 @@ test(`it can sideload a model with a chain of belongs-to relationships`, functio let registry = new SerializerRegistry(this.schema, { application: this.BaseSerializer, fineComment: this.BaseSerializer.extend({ - include: ['blogPost'] + include: ['post'] }), blogPost: this.BaseSerializer.extend({ - include: ['wordSmith'] + include: ['author'] }) }); @@ -219,10 +171,10 @@ test(`it can sideload a model with a chain of belongs-to relationships`, functio assert.deepEqual(result, { fineComment: { - id: '1', text: 'pwned', blogPostId: '1' + id: '1', text: 'pwned', postId: '1' }, blogPosts: [ - { id: '1', title: 'Lorem', wordSmithId: '1' } + { id: '1', title: 'Lorem', authorId: '1' } ], wordSmiths: [ { id: '1', name: 'Link' } diff --git a/tests/integration/serializers/base/full-request-test.js b/tests/integration/serializers/base/full-request-test.js index 773790297..a9a66d8bb 100644 --- a/tests/integration/serializers/base/full-request-test.js +++ b/tests/integration/serializers/base/full-request-test.js @@ -122,8 +122,7 @@ test('a response falls back to the application serializer, if it exists', functi assert.deepEqual(res, { id: '1', title: 'Lorem', - date: '20001010', - authorId: null + date: '20001010' }); done(); }); diff --git a/tests/integration/serializers/base/serialize-ids-test.js b/tests/integration/serializers/base/serialize-ids-test.js index 45d392cd1..c2e1932ee 100644 --- a/tests/integration/serializers/base/serialize-ids-test.js +++ b/tests/integration/serializers/base/serialize-ids-test.js @@ -46,16 +46,8 @@ test(`if serializeIds is 'include' it serializes ids of hasMany associations tha blogPostIds: ['1', '2'] }, blogPosts: [ - { - id: '1', - specialAuthorId: null, - wordSmithId: '1' - }, - { - id: '2', - specialAuthorId: null, - wordSmithId: '1' - } + { id: '1' }, + { id: '2' } ] }); }); diff --git a/tests/integration/serializers/json-api-serializer/associations/includes-test.js b/tests/integration/serializers/json-api-serializer/associations/includes-test.js index e6c2b9aa9..686ca873d 100644 --- a/tests/integration/serializers/json-api-serializer/associations/includes-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/includes-test.js @@ -320,19 +320,19 @@ test('query param includes support dot-paths when serializing a model', function this.schema.db.loadData({ wordSmiths: [ - { id: 1, name: 'Sam' } + { id: 1, name: 'Sam', blogPostIds: [2] } ], blogPosts: [ - { id: 2, wordSmithId: 1, title: 'Lorem Ipsum' } + { id: 2, wordSmithId: 1, fineCommentIds: [3], title: 'Lorem Ipsum' } ], fineComments: [ { id: 3, text: 'Foo', blogPostId: 2, categoryId: 10 } ], categories: [ - { id: 10, foo: 'bar' } + { id: 10, foo: 'bar', labelIds: [20] } ], labels: [ - { id: 20, name: 'Economics', categoryId: 10 } + { id: 20, name: 'Economics' } ] }); let request = { @@ -422,20 +422,20 @@ test('query param includes support dot-paths when serializing a collection', fun this.schema.db.loadData({ wordSmiths: [ - { id: 1, name: 'Sam' } + { id: 1, name: 'Sam', blogPostIds: [2, 5] } ], blogPosts: [ - { id: 2, wordSmithId: 1, title: 'Lorem Ipsum' }, + { id: 2, wordSmithId: 1, fineCommentIds: [3], title: 'Lorem Ipsum' }, { id: 5, wordSmithId: 1, title: 'Dolor' } ], fineComments: [ { id: 3, text: 'Foo', blogPostId: 2, categoryId: 10 } ], categories: [ - { id: 10, foo: 'bar' } + { id: 10, foo: 'bar', labelIds: [20] } ], labels: [ - { id: 20, name: 'Economics', categoryId: 10 } + { id: 20, name: 'Economics' } ] }); let request = { diff --git a/tests/integration/serializers/rest-model-serializer-test.js b/tests/integration/serializers/rest-serializer-test.js similarity index 95% rename from tests/integration/serializers/rest-model-serializer-test.js rename to tests/integration/serializers/rest-serializer-test.js index f8e1f8b9d..b5c6d13b8 100644 --- a/tests/integration/serializers/rest-model-serializer-test.js +++ b/tests/integration/serializers/rest-serializer-test.js @@ -30,6 +30,9 @@ module('Integration | Serializer | RestSerializer', { wordSmith: RestSerializer.extend({ attrs: ['id', 'name'], include: ['blogPosts'] + }), + blogPost: RestSerializer.extend({ + include: ['wordSmith'] }) }); }, diff --git a/tests/integration/serializers/schema-helper.js b/tests/integration/serializers/schema-helper.js index 25c533daf..a82362e9b 100644 --- a/tests/integration/serializers/schema-helper.js +++ b/tests/integration/serializers/schema-helper.js @@ -6,9 +6,7 @@ import Db from 'ember-cli-mirage/db'; export default { setup() { - let db = new Db(); - this.schema = new Schema(db); - this.schema.registerModels({ + return new Schema(new Db(), { wordSmith: Model.extend({ blogPosts: Mirage.hasMany() }), @@ -38,8 +36,6 @@ export default { }), lol: Model }); - - return this.schema; } }; diff --git a/tests/integration/server/factory-creation-test.js b/tests/integration/server/factory-creation-test.js index 08c3b88e3..53e71d1cd 100644 --- a/tests/integration/server/factory-creation-test.js +++ b/tests/integration/server/factory-creation-test.js @@ -78,6 +78,7 @@ test('create sets up the db correctly when passing in fks', function(assert) { let post = this.server.create('post', { authorId: author.id }); + author.reload(); assert.equal(author.posts.models.length, 1); assert.deepEqual(post.author.attrs, author.attrs); From c88b418c67987fef002581f55bdff6bf215fa36b Mon Sep 17 00:00:00 2001 From: Eric Kelly Date: Sat, 18 Feb 2017 18:02:04 -0700 Subject: [PATCH 002/879] Use lodash assign Fixes https://github.com/samselikoff/ember-cli-mirage/issues/979 `Object.assign` is not supported by PhantomJS, which is the default test runner for ember apps --- addon/orm/schema.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/addon/orm/schema.js b/addon/orm/schema.js index b11f1435d..7d1ee24c3 100644 --- a/addon/orm/schema.js +++ b/addon/orm/schema.js @@ -2,8 +2,9 @@ import { pluralize, camelize, dasherize } from '../utils/inflector'; import { toCollectionName, toModelName } from 'ember-cli-mirage/utils/normalize-name'; import Association from './associations/association'; import Collection from './collection'; -import _forIn from 'lodash/forIn'; -import _includes from 'lodash/includes'; +import _assign from 'lodash/object/assign'; +import _forIn from 'lodash/object/forIn'; +import _includes from 'lodash/collection/includes'; import assert from '../assert'; /** @@ -234,7 +235,7 @@ export default class Schema { associationsFor(modelName) { let modelClass = this.modelClassFor(modelName); - return Object.assign({}, modelClass.belongsToAssociations, modelClass.hasManyAssociations); + return _assign({}, modelClass.belongsToAssociations, modelClass.hasManyAssociations); } /* From 20bfcb50cf4a35701099988ce1c9c957db9fff70 Mon Sep 17 00:00:00 2001 From: Andrey Khomenko Date: Wed, 8 Mar 2017 23:29:36 -0500 Subject: [PATCH 003/879] =?UTF-8?q?RestSerializer=20relationships=20serial?= =?UTF-8?q?ization=20must=20be=20compatible=20with=20em=E2=80=A6=20(#1034)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * RestSerializer relationships serialization must be compatible with ember-data * Remove string interpolation --- addon/serializers/rest-serializer.js | 4 ++-- tests/integration/serializers/rest-serializer-test.js | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/addon/serializers/rest-serializer.js b/addon/serializers/rest-serializer.js index dd137c5bf..56caac47e 100644 --- a/addon/serializers/rest-serializer.js +++ b/addon/serializers/rest-serializer.js @@ -20,11 +20,11 @@ export default ActiveModelSerializer.extend({ }, keyForRelationshipIds(type) { - return `${camelize(singularize(type))}Ids`; + return camelize(pluralize(type)); }, keyForForeignKey(relationshipName) { - return `${camelize(relationshipName)}Id`; + return camelize(singularize(relationshipName)); } }); diff --git a/tests/integration/serializers/rest-serializer-test.js b/tests/integration/serializers/rest-serializer-test.js index b5c6d13b8..246d3dea4 100644 --- a/tests/integration/serializers/rest-serializer-test.js +++ b/tests/integration/serializers/rest-serializer-test.js @@ -50,18 +50,18 @@ test('it sideloads associations and camel-cases relationships and attributes cor wordSmith: { id: '1', name: 'Link', - blogPostIds: ['1', '2'] + blogPosts: ['1', '2'] }, blogPosts: [ { id: '1', title: 'Lorem', - wordSmithId: '1' + wordSmith: '1' }, { id: '2', title: 'Ipsum', - wordSmithId: '1' + wordSmith: '1' } ] }); From d243f791bc76fcf9681b9cf5c42f5314161ebf56 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 11 Mar 2017 10:19:53 -0500 Subject: [PATCH 004/879] Fix rebase conflicts --- .travis.yml | 2 ++ addon/orm/associations/belongs-to.js | 6 +++--- addon/orm/collection.js | 4 ++-- addon/orm/model.js | 2 +- addon/orm/schema.js | 6 +++--- package.json | 1 - .../orm/belongs-to/8-one-to-one/instantiating-test.js | 2 +- .../orm/mixed/2-many-to-one/instantiating-test.js | 2 +- 8 files changed, 13 insertions(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index d16143973..b15f6d907 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,6 +34,8 @@ before_install: - sudo apt-get install -y libappindicator1 fonts-liberation - wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb - sudo dpkg -i google-chrome*.deb + - npm config set spin false + - npm install -g bower phantomjs-prebuilt install: - npm install diff --git a/addon/orm/associations/belongs-to.js b/addon/orm/associations/belongs-to.js index 781dba845..7035b6d58 100644 --- a/addon/orm/associations/belongs-to.js +++ b/addon/orm/associations/belongs-to.js @@ -129,9 +129,9 @@ export default class BelongsTo extends Association { this._tempAssociations[key] = model; if ( - model && - association.inverse() && - !association.inversesAlreadyAssociated(model, this) // check for an existing match, to avoid recursion + model + && association.inverse() + && !association.inversesAlreadyAssociated(model, this) // check for an existing match, to avoid recursion ) { model.associate(this, association.inverse()); } diff --git a/addon/orm/collection.js b/addon/orm/collection.js index 2e909da6d..ecd5c5855 100644 --- a/addon/orm/collection.js +++ b/addon/orm/collection.js @@ -1,6 +1,6 @@ -import _invokeMap from 'lodash/invokeMap'; import assert from '../assert'; -import _isEqual from 'lodash/lang/isEqual'; +import _invokeMap from 'lodash/invokeMap'; +import _isEqual from 'lodash/isEqual'; /** * An array of models, returned from one of the schema query diff --git a/addon/orm/model.js b/addon/orm/model.js index 333a5be6b..27a479996 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -2,7 +2,7 @@ import { toCollectionName } from 'ember-cli-mirage/utils/normalize-name'; import extend from '../utils/extend'; import assert from '../assert'; import Collection from './collection'; -import _values from 'lodash/object/values'; +import _values from 'lodash/values'; /* The Model class. Notes: diff --git a/addon/orm/schema.js b/addon/orm/schema.js index 7d1ee24c3..3c17ab2e5 100644 --- a/addon/orm/schema.js +++ b/addon/orm/schema.js @@ -2,9 +2,9 @@ import { pluralize, camelize, dasherize } from '../utils/inflector'; import { toCollectionName, toModelName } from 'ember-cli-mirage/utils/normalize-name'; import Association from './associations/association'; import Collection from './collection'; -import _assign from 'lodash/object/assign'; -import _forIn from 'lodash/object/forIn'; -import _includes from 'lodash/collection/includes'; +import _assign from 'lodash/assign'; +import _forIn from 'lodash/forIn'; +import _includes from 'lodash/includes'; import assert from '../assert'; /** diff --git a/package.json b/package.json index cb8812368..c57622fec 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,6 @@ "ember-sinon": "0.5.1", "eslint-plugin-ember-suave": "^1.0.0", "loader.js": "^4.0.10", - "lodash": "3.10.1", "mocha": "^2.1.0" }, "keywords": [ diff --git a/tests/integration/orm/belongs-to/8-one-to-one/instantiating-test.js b/tests/integration/orm/belongs-to/8-one-to-one/instantiating-test.js index 190b49e8b..a0e1ba6b7 100644 --- a/tests/integration/orm/belongs-to/8-one-to-one/instantiating-test.js +++ b/tests/integration/orm/belongs-to/8-one-to-one/instantiating-test.js @@ -59,7 +59,7 @@ test('the child accepts a null parent model', function(assert) { test('the child accepts a parent model and id', function(assert) { let profile = this.helper.savedParent(); - let user = this.schema.users.new({ profile , profileId: profile.id }); + let user = this.schema.users.new({ profile, profileId: profile.id }); assert.equal(user.profileId, '1'); assert.deepEqual(user.profile, profile); diff --git a/tests/integration/orm/mixed/2-many-to-one/instantiating-test.js b/tests/integration/orm/mixed/2-many-to-one/instantiating-test.js index dc788e70e..d7bfdff7b 100644 --- a/tests/integration/orm/mixed/2-many-to-one/instantiating-test.js +++ b/tests/integration/orm/mixed/2-many-to-one/instantiating-test.js @@ -70,7 +70,7 @@ test('the child accepts a null parent model', function(assert) { test('the child accepts a parent model and id', function(assert) { let user = this.helper.savedParent(); - let post = this.schema.posts.new({ user , userId: user.id }); + let post = this.schema.posts.new({ user, userId: user.id }); assert.equal(post.userId, '1'); assert.deepEqual(post.user, user); From 255b04d8373ab5b68c881722244077e5bdf1270d Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 13 Mar 2017 03:12:36 -0400 Subject: [PATCH 005/879] Ensure #associate is idempotent --- addon/orm/model.js | 3 +-- .../has-many/3-reflexive/association-create-test.js | 12 +++++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/addon/orm/model.js b/addon/orm/model.js index 27a479996..67cb76e67 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -194,8 +194,7 @@ class Model { let { key } = association; if (association.constructor.name === 'HasMany') { - let currentModels = this[key].models; - if (currentModels.indexOf(model) === -1) { + if (!this[key].includes(model)) { this[key].add(model); } } else { diff --git a/tests/integration/orm/has-many/3-reflexive/association-create-test.js b/tests/integration/orm/has-many/3-reflexive/association-create-test.js index efe0b11da..fb5565971 100644 --- a/tests/integration/orm/has-many/3-reflexive/association-create-test.js +++ b/tests/integration/orm/has-many/3-reflexive/association-create-test.js @@ -17,13 +17,23 @@ states.forEach((state) => { let initialCount = tag.tags.models.length; let orangeTag = tag.createTag({ name: 'Orange' }); + let blueTag = tag.createTag({ name: 'Blue' }); assert.ok(orangeTag.id, 'the child was persisted'); - assert.equal(tag.tags.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(blueTag.id, 'the child was persisted'); + assert.equal(tag.tags.models.length, initialCount + 2, 'the collection size was increased'); assert.ok(tag.tags.includes(orangeTag), 'the model was added to tag.tags'); + assert.ok(tag.tags.includes(blueTag), 'the model was added to tag.tags'); assert.ok(tag.tagIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); + assert.ok(tag.tagIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); assert.ok(tag.attrs.tagIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); + assert.ok(tag.attrs.tagIds.indexOf(blueTag.id) > -1, 'fks were persisted'); + + // Check the inverse + assert.equal(orangeTag.tags.models.length, 1); assert.ok(orangeTag.tags.includes(tag), 'the inverse was set'); + assert.equal(blueTag.tags.models.length, 1); + assert.ok(blueTag.tags.includes(tag), 'the inverse was set'); }); }); From 2ffa57539b3c9520e2fa1093498f095b34ab9870 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 21 Mar 2017 01:34:49 -0400 Subject: [PATCH 006/879] Update changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f405fb002..947faa6cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Ember CLI Mirage Changelog +## 0.3.0 + +Update notes: View the [Upgrade guide](http://www.ember-cli-mirage.com/docs/v0.3.x/upgrading/#02x--03-upgrade-guide) on the 0.3.x docs page + +Changes: + + - [FEATURE] [#965](https://github.com/samselikoff/ember-cli-mirage/pull/965) One-way associations @samselikoff, @HeroicEric, @xomaczar + ## 0.2.9 Update notes: none From aca26720d930843dd084b508fce75b158ff0386e Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 21 Mar 2017 01:35:19 -0400 Subject: [PATCH 007/879] v0.3.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c57622fec..b0f3abe17 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "0.3.0-beta.5", + "version": "0.3.0", "description": "A client-side HTTP server to develop, test and demo your Ember app", "directories": { "doc": "doc", From 94932d533fe0c17c8df0870a5036114a4cd026a2 Mon Sep 17 00:00:00 2001 From: Sergio Arbeo Date: Thu, 23 Mar 2017 17:34:03 +0100 Subject: [PATCH 008/879] Update link in blueprint --- blueprints/ember-cli-mirage/files/__root__/config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blueprints/ember-cli-mirage/files/__root__/config.js b/blueprints/ember-cli-mirage/files/__root__/config.js index 93a1c5192..f9c077fcd 100644 --- a/blueprints/ember-cli-mirage/files/__root__/config.js +++ b/blueprints/ember-cli-mirage/files/__root__/config.js @@ -21,6 +21,6 @@ export default function() { this.put('/posts/:id'); // or this.patch this.del('/posts/:id'); - http://www.ember-cli-mirage.com/docs/v0.2.x/shorthands/ + http://www.ember-cli-mirage.com/docs/v0.3.x/shorthands/ */ } From 29f788a1b6723b3891e42efdd3bef27d516f1ee6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Czy=C5=BC?= Date: Thu, 23 Mar 2017 00:08:55 +0100 Subject: [PATCH 009/879] Update ISSUE_TEMPLATE.md --- ISSUE_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index 48fe09ce1..3b8971f96 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -1,6 +1,6 @@ If possible, please use the Mirage Boilerplate Twiddle to demonstrate your issue or bug: -- Open the [Mirage Boilerplate Twiddle](https://ember-twiddle.com/eedfd390d8394d54d5bfd0ed988a5d0f) +- Open the [Mirage Boilerplate Twiddle](https://ember-twiddle.com/14e543224d3349ec30cab38fc77b6e09) - Click File > Copy Twiddle - Reproduce your issue - Click File > Save to Github Gist From 4f52d82ea291b796f64bb219a0fb3d26c2804411 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 23 Mar 2017 12:34:58 -0400 Subject: [PATCH 010/879] Remove bad reflexive inverse logic --- addon/orm/associations/association.js | 3 --- .../orm/schema-verification/mixed-test.js | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/addon/orm/associations/association.js b/addon/orm/associations/association.js index ff00db4b8..87557347a 100644 --- a/addon/orm/associations/association.js +++ b/addon/orm/associations/association.js @@ -45,9 +45,6 @@ export default class Association { if (this.opts.inverse === null) { inverse = null; - } else if (this.isReflexive()) { - inverse = this; - } else { let associationsMap = this.schema.associationsFor(this.modelName); let explicitInverse = this.opts.inverse; diff --git a/tests/integration/orm/schema-verification/mixed-test.js b/tests/integration/orm/schema-verification/mixed-test.js index 0952f0569..d719b0c50 100644 --- a/tests/integration/orm/schema-verification/mixed-test.js +++ b/tests/integration/orm/schema-verification/mixed-test.js @@ -67,3 +67,20 @@ test('multiple has-many associations of the same type', function(assert) { assert.equal(messages.ownerModelName, 'user'); assert.deepEqual(messages.inverse(), messenger); }); + +test('one-to-many reflexive association is correct', function(assert) { + let schema = new Schema(new Db(), { + user: Model.extend({ + parent: belongsTo('user', { inverse: 'children' }), + children: hasMany('user', { inverse: 'parent' }) + }) + }); + + let association = schema.associationsFor('user').parent; + let inverse = schema.associationsFor('user').children; + + assert.equal(association.key, 'parent'); + assert.equal(association.modelName, 'user'); + assert.equal(association.ownerModelName, 'user'); + assert.deepEqual(association.inverse(), inverse); +}); From a515dbbf848cc7364825f68597de747bd365b7eb Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 23 Mar 2017 13:12:18 -0400 Subject: [PATCH 011/879] Update changelog --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 947faa6cc..725f2b35f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Ember CLI Mirage Changelog +## 0.3.1 + +Update notes: none + +Changes: + + - [BUGFIX] [1054](https://github.com/samselikoff/ember-cli-mirage/pull/1054) Remove bad reflexive inverse logic @samselikoff + - General enhancements @Serabe, @cs3b + ## 0.3.0 Update notes: View the [Upgrade guide](http://www.ember-cli-mirage.com/docs/v0.3.x/upgrading/#02x--03-upgrade-guide) on the 0.3.x docs page From 8760bffee42a51f793d745b4b0fd819cf3dbb30e Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 23 Mar 2017 13:12:23 -0400 Subject: [PATCH 012/879] 0.3.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b0f3abe17..51db1ec0f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "0.3.0", + "version": "0.3.1", "description": "A client-side HTTP server to develop, test and demo your Ember app", "directories": { "doc": "doc", From 3509d2f12d314e34f813e4c8c7511d81d32e2c11 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 23 Mar 2017 13:19:55 -0400 Subject: [PATCH 013/879] Update ISSUE_TEMPLATE.md --- ISSUE_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index 3b8971f96..e8b2897a7 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -1,6 +1,6 @@ If possible, please use the Mirage Boilerplate Twiddle to demonstrate your issue or bug: -- Open the [Mirage Boilerplate Twiddle](https://ember-twiddle.com/14e543224d3349ec30cab38fc77b6e09) +- Open the [Mirage Boilerplate Twiddle](https://ember-twiddle.com/072de99410f21ff42db8264bd9665ca3) - Click File > Copy Twiddle - Reproduce your issue - Click File > Save to Github Gist From 3cd81ef7ee3f67e5edfaf725cf64747ba2313183 Mon Sep 17 00:00:00 2001 From: Offir Golan Date: Sat, 25 Mar 2017 20:53:24 -0700 Subject: [PATCH 014/879] Auto generate models from ember data models --- addon/ember-data.js | 83 ++++++++++++++++++++++++++++ addon/index.js | 11 +++- addon/server.js | 9 +++ addon/utils/ember-data.js | 17 ++++++ app/initializers/ember-cli-mirage.js | 8 ++- package.json | 3 +- tests/integration/ember-data-test.js | 57 +++++++++++++++++++ 7 files changed, 185 insertions(+), 3 deletions(-) create mode 100644 addon/ember-data.js create mode 100644 addon/utils/ember-data.js create mode 100644 tests/integration/ember-data-test.js diff --git a/addon/ember-data.js b/addon/ember-data.js new file mode 100644 index 000000000..b24eac8a3 --- /dev/null +++ b/addon/ember-data.js @@ -0,0 +1,83 @@ +/* global requirejs */ +'use strict'; + +import require from 'require'; +import config from 'ember-get-config'; +import { hasEmberData, isDsModel } from 'ember-cli-mirage/utils/ember-data'; +import { Model, belongsTo, hasMany } from 'ember-cli-mirage'; + +const { + modulePrefix +} = config; + +// Caches +let DsModels, Models; + +/** + * Get all ember data models under the app's namespaces + * + * @method getDsModels + * @private + * @return {Object} models + */ +export function getDsModels() { + if (DsModels) { + return DsModels; + } + + let moduleMap = requirejs.entries; + let modelMatchRegex = new RegExp(`^${modulePrefix}/models`, 'i'); + + DsModels = {}; + + if (!hasEmberData) { + return DsModels; + } + + Object.keys(moduleMap) + .filter((module) => !!module.match(modelMatchRegex)) + .forEach((path) => { + let paths = path.split('/'); + let modelName = paths[paths.length - 1]; + let model = require(path, null, null, true).default; + + if (isDsModel(model)) { + DsModels[modelName] = model; + } + }); + + return DsModels; +} + +/** + * Get all mirage models for each of the ember-data models + * + * @method getModels + * @private + * @return {Object} models + */ +export function getModels() { + if (Models) { + return Models; + } + + let models = getDsModels(); + Models = {}; + + Object.keys(models).forEach(modelName => { + let model = models[modelName]; + let attrs = {}; + + model.eachRelationship((name, r) => { + if (r.kind === 'belongsTo') { + attrs[name] = belongsTo(r.type, r.options); + } else if (r.kind === 'hasMany') { + attrs[name] = hasMany(r.type, r.options); + } + }); + + Models[modelName] = Model.extend(attrs); + }); + + return Models; +} diff --git a/addon/index.js b/addon/index.js index 251964a15..351f17500 100644 --- a/addon/index.js +++ b/addon/index.js @@ -1,3 +1,4 @@ +import assert from './assert'; import Factory from './factory'; import trait from './trait'; import association from './association'; @@ -11,6 +12,7 @@ import JSONAPISerializer from './serializers/json-api-serializer'; import RestSerializer from './serializers/rest-serializer'; import HasMany from './orm/associations/has-many'; import BelongsTo from './orm/associations/belongs-to'; +import { getModels } from './ember-data'; function hasMany(...args) { return new HasMany(...args); @@ -19,6 +21,12 @@ function belongsTo(...args) { return new BelongsTo(...args); } +function modelFor(name) { + let models = getModels(); + assert(!!models[name], `Model of type '${name}' does not exist.`); + return models[name]; +} + export { Factory, trait, @@ -32,7 +40,8 @@ export { JSONAPISerializer, RestSerializer, hasMany, - belongsTo + belongsTo, + modelFor }; export default { diff --git a/addon/server.js b/addon/server.js index 942a549a9..eb797f335 100644 --- a/addon/server.js +++ b/addon/server.js @@ -2,6 +2,8 @@ import { pluralize, camelize } from './utils/inflector'; import { toCollectionName } from 'ember-cli-mirage/utils/normalize-name'; +import { getModels } from './ember-data'; +import { hasEmberData } from './utils/ember-data'; import Ember from 'ember'; import isAssociation from 'ember-cli-mirage/utils/is-association'; import Pretender from 'pretender'; @@ -156,6 +158,13 @@ export default class Server { this._defineRouteHandlerHelpers(); + // Merge models from autogenerated Ember Data models with user defined models + if (hasEmberData && config.autoGenerateEmberDataModels) { + let models = getModels(); + _assign(models, config.models || {}); + config.models = models; + } + this.db = this.db || new Db(); if (this.schema) { this.schema.registerModels(config.models); diff --git a/addon/utils/ember-data.js b/addon/utils/ember-data.js new file mode 100644 index 000000000..68c9a5355 --- /dev/null +++ b/addon/utils/ember-data.js @@ -0,0 +1,17 @@ +/* global requirejs */ +'use strict'; + +import _find from 'lodash/find'; + +function _hasEmberData() { + let matchRegex = /^ember-data/i; + return !!_find(Object.keys(requirejs.entries), (e) => !!e.match(matchRegex)); +} + +export const hasEmberData = _hasEmberData(); + +export function isDsModel(m) { + return m + && m.isModel + && typeof m.eachRelationship === 'function'; +} diff --git a/app/initializers/ember-cli-mirage.js b/app/initializers/ember-cli-mirage.js index 574b98dcb..5bc6ebeb8 100644 --- a/app/initializers/ember-cli-mirage.js +++ b/app/initializers/ember-cli-mirage.js @@ -1,9 +1,14 @@ +import Ember from 'ember'; import readModules from 'ember-cli-mirage/utils/read-modules'; import ENV from '../config/environment'; import baseConfig, { testConfig } from '../mirage/config'; import Server from 'ember-cli-mirage/server'; import _assign from 'lodash/assign'; +const { + getWithDefault +} = Ember; + export default { name: 'ember-cli-mirage', initialize: function(application) { @@ -20,8 +25,9 @@ export default { export function startMirage(env = ENV) { let environment = env.environment; + let autoGenerateEmberDataModels = getWithDefault(env['ember-cli-mirage'] || {}, 'autoGenerateEmberDataModels', false); let modules = readModules(env.modulePrefix); - let options = _assign(modules, {environment, baseConfig, testConfig}); + let options = _assign(modules, {environment, baseConfig, testConfig, autoGenerateEmberDataModels}); return new Server(options); } diff --git a/package.json b/package.json index 51db1ec0f..1b4856655 100644 --- a/package.json +++ b/package.json @@ -43,8 +43,8 @@ "ember-cli-test-loader": "^1.1.0", "ember-cli-uglify": "^1.2.0", "ember-data": "^2.10.0", - "ember-disable-proxy-controllers": "^1.0.1", "ember-disable-prototype-extensions": "^1.1.0", + "ember-disable-proxy-controllers": "^1.0.1", "ember-export-application-global": "^1.0.5", "ember-load-initializers": "^0.5.1", "ember-resolver": "^2.0.3", @@ -71,6 +71,7 @@ "ember-cli-babel": "^5.1.7", "ember-cli-node-assets": "^0.1.4", "ember-inflector": "^1.9.2", + "ember-get-config": "0.2.1", "ember-lodash": "^4.0", "exists-sync": "0.0.3", "fake-xml-http-request": "^1.4.0", diff --git a/tests/integration/ember-data-test.js b/tests/integration/ember-data-test.js new file mode 100644 index 000000000..91977da59 --- /dev/null +++ b/tests/integration/ember-data-test.js @@ -0,0 +1,57 @@ +import {module, test} from 'qunit'; +import Server from 'ember-cli-mirage/server'; +import { Model, modelFor } from 'ember-cli-mirage'; + +const CustomFriend = Model.extend(); +CustomFriend.__isCustom__ = true; + +module('Integration | Ember Data', { + beforeEach() { + this.server = new Server({ + environment: 'development', + autoGenerateEmberDataModels: true, + scenarios: { + default() {} + }, + models: { + // Friend exists in dummy/app/models. We want to make sure pre-defined + // models take precedence + friend: CustomFriend, + foo: Model.extend() + }, + factories: {} + }); + }, + afterEach() { + this.server.shutdown(); + } +}); + +test(`Ember data models were generated and loaded`, function(assert) { + let { schema } = this.server; + let registry = schema._registry; + + assert.ok(registry.foo, 'Pre defined model Foo has been registered'); + assert.ok(registry.address, 'Ember data model Address has been registered'); + assert.ok(registry.contact, 'Ember data model Contact has been registered'); + assert.equal(registry.address.foreignKeys.length, 1, 'Ember data model Address has the correct relationships'); +}); + +test(`Defined mirage models take precedence over autogenerated ones`, function(assert) { + let { schema } = this.server; + let registry = schema._registry; + + assert.ok(registry.friend, 'Model Friend has been registered'); + assert.ok(registry.friend.class.__isCustom__, 'Model Friend is not the autogenerated one'); +}); + +test(`Auto generated models can be extended via modelFor`, function(assert) { + let { schema } = this.server; + let registry = schema._registry; + + assert.ok(registry.address, 'Ember data model Address has been registered'); + assert.ok(modelFor('address'), 'Ember data model Address is found'); + assert.equal(typeof modelFor('address').extend, 'function', 'Ember data model Address can be extended'); + + assert.throws(modelFor('friend'), () => true, 'Pre defined mirage models cannot be found via modelFor'); +}); From 0d0e1da954b56e5ca396db695babd39bd74913bb Mon Sep 17 00:00:00 2001 From: Offir Golan Date: Sat, 25 Mar 2017 21:19:39 -0700 Subject: [PATCH 015/879] Server should not be writing to models hash --- addon/server.js | 4 ++-- tests/integration/ember-data-test.js | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/addon/server.js b/addon/server.js index eb797f335..5599b7cf5 100644 --- a/addon/server.js +++ b/addon/server.js @@ -160,8 +160,8 @@ export default class Server { // Merge models from autogenerated Ember Data models with user defined models if (hasEmberData && config.autoGenerateEmberDataModels) { - let models = getModels(); - _assign(models, config.models || {}); + let models = {}; + _assign(models, getModels(), config.models || {}); config.models = models; } diff --git a/tests/integration/ember-data-test.js b/tests/integration/ember-data-test.js index 91977da59..5056de3c3 100644 --- a/tests/integration/ember-data-test.js +++ b/tests/integration/ember-data-test.js @@ -53,5 +53,11 @@ test(`Auto generated models can be extended via modelFor`, function(assert) { assert.ok(modelFor('address'), 'Ember data model Address is found'); assert.equal(typeof modelFor('address').extend, 'function', 'Ember data model Address can be extended'); - assert.throws(modelFor('friend'), () => true, 'Pre defined mirage models cannot be found via modelFor'); + assert.notOk(modelFor('friend').__isCustom__, 'Friend address is not the pre defined one'); + assert.throws(() => modelFor('foo'), () => true, 'Pre defined mirage models cannot be found via modelFor'); +}); + +test(`modelFor is only for auto generated models`, function(assert) { + assert.notOk(modelFor('friend').__isCustom__, 'Friend model is not the pre defined one'); + assert.throws(() => modelFor('foo'), () => true, 'Pre defined mirage models cannot be found via modelFor'); }); From 10ba748d3279dfe6d4083112f810413f1fc47f33 Mon Sep 17 00:00:00 2001 From: Offir Golan Date: Sun, 26 Mar 2017 14:52:57 -0700 Subject: [PATCH 016/879] Remove use-strict for code climate --- addon/ember-data.js | 1 - addon/utils/ember-data.js | 1 - 2 files changed, 2 deletions(-) diff --git a/addon/ember-data.js b/addon/ember-data.js index b24eac8a3..ab655e1de 100644 --- a/addon/ember-data.js +++ b/addon/ember-data.js @@ -1,5 +1,4 @@ /* global requirejs */ -'use strict'; import require from 'require'; import config from 'ember-get-config'; diff --git a/addon/utils/ember-data.js b/addon/utils/ember-data.js index 68c9a5355..e17361336 100644 --- a/addon/utils/ember-data.js +++ b/addon/utils/ember-data.js @@ -1,5 +1,4 @@ /* global requirejs */ -'use strict'; import _find from 'lodash/find'; From e9307e50e6ab7bfd267f4d18b0926972ca3992ee Mon Sep 17 00:00:00 2001 From: Offir Golan Date: Sun, 26 Mar 2017 15:00:42 -0700 Subject: [PATCH 017/879] Fix test case --- tests/integration/ember-data-test.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/integration/ember-data-test.js b/tests/integration/ember-data-test.js index 5056de3c3..c0ad2d72a 100644 --- a/tests/integration/ember-data-test.js +++ b/tests/integration/ember-data-test.js @@ -52,9 +52,6 @@ test(`Auto generated models can be extended via modelFor`, function(assert) { assert.ok(registry.address, 'Ember data model Address has been registered'); assert.ok(modelFor('address'), 'Ember data model Address is found'); assert.equal(typeof modelFor('address').extend, 'function', 'Ember data model Address can be extended'); - - assert.notOk(modelFor('friend').__isCustom__, 'Friend address is not the pre defined one'); - assert.throws(() => modelFor('foo'), () => true, 'Pre defined mirage models cannot be found via modelFor'); }); test(`modelFor is only for auto generated models`, function(assert) { From 7b857d8cd6a134943cdc76f72e84ff82fb04c6a1 Mon Sep 17 00:00:00 2001 From: Offir Golan Date: Thu, 30 Mar 2017 18:19:16 -0700 Subject: [PATCH 018/879] Rename autoGenerateEmberDataModels to discoverEmberDataModels --- addon/server.js | 2 +- app/initializers/ember-cli-mirage.js | 4 ++-- tests/integration/ember-data-test.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addon/server.js b/addon/server.js index 5599b7cf5..493f881c9 100644 --- a/addon/server.js +++ b/addon/server.js @@ -159,7 +159,7 @@ export default class Server { this._defineRouteHandlerHelpers(); // Merge models from autogenerated Ember Data models with user defined models - if (hasEmberData && config.autoGenerateEmberDataModels) { + if (hasEmberData && config.discoverEmberDataModels) { let models = {}; _assign(models, getModels(), config.models || {}); config.models = models; diff --git a/app/initializers/ember-cli-mirage.js b/app/initializers/ember-cli-mirage.js index 5bc6ebeb8..8db5b6b85 100644 --- a/app/initializers/ember-cli-mirage.js +++ b/app/initializers/ember-cli-mirage.js @@ -25,9 +25,9 @@ export default { export function startMirage(env = ENV) { let environment = env.environment; - let autoGenerateEmberDataModels = getWithDefault(env['ember-cli-mirage'] || {}, 'autoGenerateEmberDataModels', false); + let discoverEmberDataModels = getWithDefault(env['ember-cli-mirage'] || {}, 'discoverEmberDataModels', false); let modules = readModules(env.modulePrefix); - let options = _assign(modules, {environment, baseConfig, testConfig, autoGenerateEmberDataModels}); + let options = _assign(modules, {environment, baseConfig, testConfig, discoverEmberDataModels}); return new Server(options); } diff --git a/tests/integration/ember-data-test.js b/tests/integration/ember-data-test.js index c0ad2d72a..2d3871254 100644 --- a/tests/integration/ember-data-test.js +++ b/tests/integration/ember-data-test.js @@ -9,7 +9,7 @@ module('Integration | Ember Data', { beforeEach() { this.server = new Server({ environment: 'development', - autoGenerateEmberDataModels: true, + discoverEmberDataModels: true, scenarios: { default() {} }, From 1d0168596aaf4cbe75930d5772b8cc7c5a98eca3 Mon Sep 17 00:00:00 2001 From: Offir Golan Date: Fri, 31 Mar 2017 10:25:16 -0700 Subject: [PATCH 019/879] Remove modelFor from public API --- addon/ember-data.js | 15 +++++++++++++++ addon/index.js | 11 +---------- tests/integration/ember-data-test.js | 5 +++-- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/addon/ember-data.js b/addon/ember-data.js index ab655e1de..6390d5a7c 100644 --- a/addon/ember-data.js +++ b/addon/ember-data.js @@ -2,6 +2,7 @@ import require from 'require'; import config from 'ember-get-config'; +import assert from './assert'; import { hasEmberData, isDsModel } from 'ember-cli-mirage/utils/ember-data'; import { Model, belongsTo, hasMany } from 'ember-cli-mirage'; @@ -80,3 +81,17 @@ export function getModels() { return Models; } + +/** + * A lookup method for an autogenerated model + * + * @method modelFor + * @private + * @param {String} name + * @return {Model} + */ +export function modelFor(name) { + let models = getModels(); + assert(!!models[name], `Model of type '${name}' does not exist.`); + return models[name]; +} diff --git a/addon/index.js b/addon/index.js index 351f17500..251964a15 100644 --- a/addon/index.js +++ b/addon/index.js @@ -1,4 +1,3 @@ -import assert from './assert'; import Factory from './factory'; import trait from './trait'; import association from './association'; @@ -12,7 +11,6 @@ import JSONAPISerializer from './serializers/json-api-serializer'; import RestSerializer from './serializers/rest-serializer'; import HasMany from './orm/associations/has-many'; import BelongsTo from './orm/associations/belongs-to'; -import { getModels } from './ember-data'; function hasMany(...args) { return new HasMany(...args); @@ -21,12 +19,6 @@ function belongsTo(...args) { return new BelongsTo(...args); } -function modelFor(name) { - let models = getModels(); - assert(!!models[name], `Model of type '${name}' does not exist.`); - return models[name]; -} - export { Factory, trait, @@ -40,8 +32,7 @@ export { JSONAPISerializer, RestSerializer, hasMany, - belongsTo, - modelFor + belongsTo }; export default { diff --git a/tests/integration/ember-data-test.js b/tests/integration/ember-data-test.js index 2d3871254..e0d984d7b 100644 --- a/tests/integration/ember-data-test.js +++ b/tests/integration/ember-data-test.js @@ -1,6 +1,7 @@ -import {module, test} from 'qunit'; +import { module, test } from 'qunit'; import Server from 'ember-cli-mirage/server'; -import { Model, modelFor } from 'ember-cli-mirage'; +import { Model } from 'ember-cli-mirage'; +import { modelFor } from 'ember-cli-mirage/ember-data'; const CustomFriend = Model.extend(); CustomFriend.__isCustom__ = true; From f930ccb6c5b3b26b4252737652c3fde293016414 Mon Sep 17 00:00:00 2001 From: Offir Golan Date: Tue, 18 Apr 2017 13:49:39 -0700 Subject: [PATCH 020/879] Remove isModel check as it was introduced in Ember Data 2.12+ --- addon/utils/ember-data.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/addon/utils/ember-data.js b/addon/utils/ember-data.js index e17361336..6882ddf34 100644 --- a/addon/utils/ember-data.js +++ b/addon/utils/ember-data.js @@ -10,7 +10,5 @@ function _hasEmberData() { export const hasEmberData = _hasEmberData(); export function isDsModel(m) { - return m - && m.isModel - && typeof m.eachRelationship === 'function'; + return m && typeof m.eachRelationship === 'function'; } From 0bcdd9a0c1c9e4550f185a2b26f0027433001b46 Mon Sep 17 00:00:00 2001 From: Ryan Schie Date: Fri, 21 Apr 2017 23:00:37 -0700 Subject: [PATCH 021/879] update 'resource' helper to accept custom route path --- addon/server.js | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/addon/server.js b/addon/server.js index 493f881c9..25c18618c 100644 --- a/addon/server.js +++ b/addon/server.js @@ -424,7 +424,14 @@ export default class Server { } } - resource(resourceName, { only, except } = {}) { + resource(resourceName, routePath, { only, except } = {}) { + if (typeof routePath === 'object') { + only = routePath.only; + except = routePath.except; + routePath = resourceName; + } + + routePath = routePath || resourceName; only = only || []; except = except || []; @@ -433,11 +440,11 @@ export default class Server { } let actionsMethodsAndsPathsMappings = { - index: { methods: ['get'], path: `/${resourceName}` }, - show: { methods: ['get'], path: `/${resourceName}/:id` }, - create: { methods: ['post'], path: `/${resourceName}` }, - update: { methods: ['put', 'patch'], path: `/${resourceName}/:id` }, - delete: { methods: ['del'], path: `/${resourceName}/:id` } + index: { methods: ['get'], path: `/${routePath}` }, + show: { methods: ['get'], path: `/${routePath}/:id` }, + create: { methods: ['post'], path: `/${routePath}` }, + update: { methods: ['put', 'patch'], path: `/${routePath}/:id` }, + delete: { methods: ['del'], path: `/${routePath}/:id` } }; let allActions = Object.keys(actionsMethodsAndsPathsMappings); @@ -448,7 +455,11 @@ export default class Server { actions.forEach((action) => { let methodsWithPath = actionsMethodsAndsPathsMappings[action]; - methodsWithPath.methods.forEach((method) => this[method](methodsWithPath.path)); + methodsWithPath.methods.forEach((method) => { + return routePath === resourceName + ? this[method](methodsWithPath.path) + : this[method](methodsWithPath.path, resourceName); + }); }); } From de8a370ad8a17c28234c57c01c351f4acc62a3f8 Mon Sep 17 00:00:00 2001 From: Ryan Schie Date: Fri, 21 Apr 2017 23:51:33 -0700 Subject: [PATCH 022/879] update resource helper tests --- .../server/resource-shorthand-test.js | 147 ++++++++++++++++-- 1 file changed, 132 insertions(+), 15 deletions(-) diff --git a/tests/integration/server/resource-shorthand-test.js b/tests/integration/server/resource-shorthand-test.js index 0ecc1eae0..ba40f5001 100644 --- a/tests/integration/server/resource-shorthand-test.js +++ b/tests/integration/server/resource-shorthand-test.js @@ -7,7 +7,8 @@ module('Integration | Server | Resource shorthand', { this.server = new Server({ environment: 'test', models: { - contact: Model + contact: Model, + blogPost: Model }, serializers: { application: ActiveModelSerializer @@ -22,17 +23,22 @@ module('Integration | Server | Resource shorthand', { }); test('resource generates get shorthand for index action', function(assert) { - assert.expect(2); - let done = assert.async(); + assert.expect(3); + let done = assert.async(2); this.server.db.loadData({ contacts: [ { id: 1, name: 'Link' }, { id: 2, name: 'Zelda' } + ], + blogPosts: [ + { id: 1, title: 'Post 1' }, + { id: 2, title: 'Post 2' } ] }); this.server.resource('contacts'); + this.server.resource('blog-posts', 'posts'); $.ajax({ method: 'GET', @@ -42,20 +48,36 @@ test('resource generates get shorthand for index action', function(assert) { assert.deepEqual(res, { contacts: [{ id: '1', name: 'Link' }, { id: '2', name: 'Zelda' }] }); done(); }); + + $.ajax({ + method: 'GET', + url: '/posts' + }).fail((xhr, textStatus, error) => { + assert.ok(false, 'failed to find custom path'); + done(); + }).done(function(res, status, xhr) { + assert.ok(true); + done(); + }); }); test('resource generates get shorthand for show action', function(assert) { - assert.expect(2); - let done = assert.async(); + assert.expect(3); + let done = assert.async(2); this.server.db.loadData({ contacts: [ { id: 1, name: 'Link' }, { id: 2, name: 'Zelda' } + ], + blogPosts: [ + { id: 1, title: 'Post 1' }, + { id: 2, title: 'Post 2' } ] }); this.server.resource('contacts'); + this.server.resource('blog-posts', 'posts'); $.ajax({ method: 'GET', @@ -65,14 +87,26 @@ test('resource generates get shorthand for show action', function(assert) { assert.deepEqual(res, { contact: { id: '2', name: 'Zelda' } }); done(); }); + + $.ajax({ + method: 'GET', + url: '/posts/2' + }).fail((xhr, textStatus, error) => { + assert.ok(false, 'failed to find custom path'); + done(); + }).done(function(res, status, xhr) { + assert.ok(true); + done(); + }); }); test('resource generates post shorthand', function(assert) { let { server } = this; - assert.expect(2); - let done = assert.async(); + assert.expect(3); + let done = assert.async(2); server.resource('contacts'); + server.resource('blog-posts', 'posts'); $.ajax({ method: 'POST', @@ -87,20 +121,40 @@ test('resource generates post shorthand', function(assert) { assert.equal(server.db.contacts.length, 1); done(); }); + + $.ajax({ + method: 'POST', + url: '/posts', + data: JSON.stringify({ + blog_post: { + name: 'Post 1' + } + }) + }).fail((xhr, textStatus, error) => { + assert.ok(false, 'failed to find custom path'); + done() + }).done((res, status, xhr) => { + assert.ok(true); + done(); + }); }); test('resource generates put shorthand', function(assert) { let { server } = this; - assert.expect(2); - let done = assert.async(); + assert.expect(3); + let done = assert.async(2); this.server.db.loadData({ contacts: [ { id: 1, name: 'Link' } + ], + blogPosts: [ + { id: 1, title: 'Post 1' } ] }); server.resource('contacts'); + server.resource('blog-posts', 'posts'); $.ajax({ method: 'PUT', @@ -115,20 +169,40 @@ test('resource generates put shorthand', function(assert) { assert.equal(server.db.contacts[0].name, 'Zelda'); done(); }); + + $.ajax({ + method: 'PUT', + url: '/posts/1', + data: JSON.stringify({ + blog_post: { + name: 'Post 2' + } + }) + }).fail((xhr, textStatus, error) => { + assert.ok(false, 'failed to find custom path'); + done(); + }).done((res, status, xhr) => { + assert.ok(true); + done(); + }); }); test('resource generates patch shorthand', function(assert) { let { server } = this; - assert.expect(2); - let done = assert.async(); + assert.expect(3); + let done = assert.async(2); this.server.db.loadData({ contacts: [ { id: 1, name: 'Link' } + ], + blogPosts: [ + { id: 1, title: 'Post 1' } ] }); server.resource('contacts'); + server.resource('blog-posts', 'posts'); $.ajax({ method: 'PATCH', @@ -143,20 +217,40 @@ test('resource generates patch shorthand', function(assert) { assert.equal(server.db.contacts[0].name, 'Zelda'); done(); }); + + $.ajax({ + method: 'PATCH', + url: '/posts/1', + data: JSON.stringify({ + blog_post: { + name: 'Post 2' + } + }) + }).fail((xhr, textStatus, error) => { + assert.ok(false, 'failed to find custom path'); + done(); + }).done((res, status, xhr) => { + assert.ok(true); + done(); + }); }); test('resource generates delete shorthand works', function(assert) { let { server } = this; - assert.expect(2); - let done = assert.async(); + assert.expect(3); + let done = assert.async(2); this.server.db.loadData({ contacts: [ { id: 1, name: 'Link' } + ], + blogPosts: [ + { id: 1, title: 'Post 1' } ] }); server.resource('contacts'); + server.resource('blog-posts', 'posts'); $.ajax({ method: 'DELETE', @@ -166,6 +260,17 @@ test('resource generates delete shorthand works', function(assert) { assert.equal(server.db.contacts.length, 0); done(); }); + + $.ajax({ + method: 'DELETE', + url: '/posts/1' + }).fail((xhr, textStatus, error) => { + assert.ok(false, 'failed to find custom path'); + done(); + }).done((res, status, xhr) => { + assert.ok(true); + done(); + }); }); test('resource does not accept both :all and :except options', function(assert) { @@ -178,8 +283,8 @@ test('resource does not accept both :all and :except options', function(assert) test('resource generates shorthands which are whitelisted by :only option', function(assert) { let { server } = this; - assert.expect(1); - let done = assert.async(); + assert.expect(2); + let done = assert.async(2); server.db.loadData({ contacts: [ @@ -189,6 +294,7 @@ test('resource generates shorthands which are whitelisted by :only option', func }); server.resource('contacts', { only: ['index'] }); + server.resource('blog-posts', 'posts', { only: ['index'] }); $.ajax({ method: 'GET', @@ -197,6 +303,17 @@ test('resource generates shorthands which are whitelisted by :only option', func assert.equal(xhr.status, 200); done(); }); + + $.ajax({ + method: 'GET', + url: '/posts' + }).fail(function() { + assert.ok(false, 'failed to find custom path'); + done(); + }).done((res, status, xhr) => { + assert.equal(xhr.status, 200); + done(); + }); }); test('resource does not generate shorthands which are not whitelisted with :only option', function(assert) { From e2766fa427359bf9a30cee0daa7dda8f36a0566d Mon Sep 17 00:00:00 2001 From: Ryan Schie Date: Sat, 22 Apr 2017 00:15:46 -0700 Subject: [PATCH 023/879] add missing semi-colon --- tests/integration/server/resource-shorthand-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/server/resource-shorthand-test.js b/tests/integration/server/resource-shorthand-test.js index ba40f5001..c4decc8aa 100644 --- a/tests/integration/server/resource-shorthand-test.js +++ b/tests/integration/server/resource-shorthand-test.js @@ -132,7 +132,7 @@ test('resource generates post shorthand', function(assert) { }) }).fail((xhr, textStatus, error) => { assert.ok(false, 'failed to find custom path'); - done() + done(); }).done((res, status, xhr) => { assert.ok(true); done(); From 2023c1c8e49c23544e2c6ff2be1202c7d3ed7d05 Mon Sep 17 00:00:00 2001 From: Ryan Schie Date: Sat, 22 Apr 2017 16:35:37 -0700 Subject: [PATCH 024/879] update resource helper custom path definition location --- addon/server.js | 22 +++++++------------ .../server/resource-shorthand-test.js | 14 ++++++------ 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/addon/server.js b/addon/server.js index 25c18618c..fb3515408 100644 --- a/addon/server.js +++ b/addon/server.js @@ -424,14 +424,8 @@ export default class Server { } } - resource(resourceName, routePath, { only, except } = {}) { - if (typeof routePath === 'object') { - only = routePath.only; - except = routePath.except; - routePath = resourceName; - } - - routePath = routePath || resourceName; + resource(resourceName, { only, except, rootPath } = {}) { + rootPath = rootPath || `/${resourceName}`; only = only || []; except = except || []; @@ -440,11 +434,11 @@ export default class Server { } let actionsMethodsAndsPathsMappings = { - index: { methods: ['get'], path: `/${routePath}` }, - show: { methods: ['get'], path: `/${routePath}/:id` }, - create: { methods: ['post'], path: `/${routePath}` }, - update: { methods: ['put', 'patch'], path: `/${routePath}/:id` }, - delete: { methods: ['del'], path: `/${routePath}/:id` } + index: { methods: ['get'], path: `${rootPath}` }, + show: { methods: ['get'], path: `${rootPath}/:id` }, + create: { methods: ['post'], path: `${rootPath}` }, + update: { methods: ['put', 'patch'], path: `${rootPath}/:id` }, + delete: { methods: ['del'], path: `${rootPath}/:id` } }; let allActions = Object.keys(actionsMethodsAndsPathsMappings); @@ -456,7 +450,7 @@ export default class Server { let methodsWithPath = actionsMethodsAndsPathsMappings[action]; methodsWithPath.methods.forEach((method) => { - return routePath === resourceName + return rootPath === resourceName ? this[method](methodsWithPath.path) : this[method](methodsWithPath.path, resourceName); }); diff --git a/tests/integration/server/resource-shorthand-test.js b/tests/integration/server/resource-shorthand-test.js index c4decc8aa..775c49066 100644 --- a/tests/integration/server/resource-shorthand-test.js +++ b/tests/integration/server/resource-shorthand-test.js @@ -38,7 +38,7 @@ test('resource generates get shorthand for index action', function(assert) { }); this.server.resource('contacts'); - this.server.resource('blog-posts', 'posts'); + this.server.resource('blog-posts', { rootPath: '/posts' }); $.ajax({ method: 'GET', @@ -77,7 +77,7 @@ test('resource generates get shorthand for show action', function(assert) { }); this.server.resource('contacts'); - this.server.resource('blog-posts', 'posts'); + this.server.resource('blog-posts', { rootPath: '/posts' }); $.ajax({ method: 'GET', @@ -106,7 +106,7 @@ test('resource generates post shorthand', function(assert) { let done = assert.async(2); server.resource('contacts'); - server.resource('blog-posts', 'posts'); + server.resource('blog-posts', { rootPath: 'posts' }); $.ajax({ method: 'POST', @@ -154,7 +154,7 @@ test('resource generates put shorthand', function(assert) { }); server.resource('contacts'); - server.resource('blog-posts', 'posts'); + server.resource('blog-posts', { rootPath: 'posts' }); $.ajax({ method: 'PUT', @@ -202,7 +202,7 @@ test('resource generates patch shorthand', function(assert) { }); server.resource('contacts'); - server.resource('blog-posts', 'posts'); + server.resource('blog-posts', { rootPath: 'posts' }); $.ajax({ method: 'PATCH', @@ -250,7 +250,7 @@ test('resource generates delete shorthand works', function(assert) { }); server.resource('contacts'); - server.resource('blog-posts', 'posts'); + server.resource('blog-posts', { rootPath: 'posts' }); $.ajax({ method: 'DELETE', @@ -294,7 +294,7 @@ test('resource generates shorthands which are whitelisted by :only option', func }); server.resource('contacts', { only: ['index'] }); - server.resource('blog-posts', 'posts', { only: ['index'] }); + server.resource('blog-posts', { rootPath: 'posts', only: ['index'] }); $.ajax({ method: 'GET', From 813e09b6e23e368f298183c84e50639eafadfbf8 Mon Sep 17 00:00:00 2001 From: Ryan Schie Date: Sat, 22 Apr 2017 16:39:43 -0700 Subject: [PATCH 025/879] update resoure helper 'rootPath' option to 'path' --- addon/server.js | 16 ++++++++-------- .../server/resource-shorthand-test.js | 14 +++++++------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/addon/server.js b/addon/server.js index fb3515408..64027532d 100644 --- a/addon/server.js +++ b/addon/server.js @@ -424,8 +424,8 @@ export default class Server { } } - resource(resourceName, { only, except, rootPath } = {}) { - rootPath = rootPath || `/${resourceName}`; + resource(resourceName, { only, except, path } = {}) { + path = path || `/${resourceName}`; only = only || []; except = except || []; @@ -434,11 +434,11 @@ export default class Server { } let actionsMethodsAndsPathsMappings = { - index: { methods: ['get'], path: `${rootPath}` }, - show: { methods: ['get'], path: `${rootPath}/:id` }, - create: { methods: ['post'], path: `${rootPath}` }, - update: { methods: ['put', 'patch'], path: `${rootPath}/:id` }, - delete: { methods: ['del'], path: `${rootPath}/:id` } + index: { methods: ['get'], path: `${path}` }, + show: { methods: ['get'], path: `${path}/:id` }, + create: { methods: ['post'], path: `${path}` }, + update: { methods: ['put', 'patch'], path: `${path}/:id` }, + delete: { methods: ['del'], path: `${path}/:id` } }; let allActions = Object.keys(actionsMethodsAndsPathsMappings); @@ -450,7 +450,7 @@ export default class Server { let methodsWithPath = actionsMethodsAndsPathsMappings[action]; methodsWithPath.methods.forEach((method) => { - return rootPath === resourceName + return path === resourceName ? this[method](methodsWithPath.path) : this[method](methodsWithPath.path, resourceName); }); diff --git a/tests/integration/server/resource-shorthand-test.js b/tests/integration/server/resource-shorthand-test.js index 775c49066..34c2e6361 100644 --- a/tests/integration/server/resource-shorthand-test.js +++ b/tests/integration/server/resource-shorthand-test.js @@ -38,7 +38,7 @@ test('resource generates get shorthand for index action', function(assert) { }); this.server.resource('contacts'); - this.server.resource('blog-posts', { rootPath: '/posts' }); + this.server.resource('blog-posts', { path: '/posts' }); $.ajax({ method: 'GET', @@ -77,7 +77,7 @@ test('resource generates get shorthand for show action', function(assert) { }); this.server.resource('contacts'); - this.server.resource('blog-posts', { rootPath: '/posts' }); + this.server.resource('blog-posts', { path: '/posts' }); $.ajax({ method: 'GET', @@ -106,7 +106,7 @@ test('resource generates post shorthand', function(assert) { let done = assert.async(2); server.resource('contacts'); - server.resource('blog-posts', { rootPath: 'posts' }); + server.resource('blog-posts', { path: 'posts' }); $.ajax({ method: 'POST', @@ -154,7 +154,7 @@ test('resource generates put shorthand', function(assert) { }); server.resource('contacts'); - server.resource('blog-posts', { rootPath: 'posts' }); + server.resource('blog-posts', { path: 'posts' }); $.ajax({ method: 'PUT', @@ -202,7 +202,7 @@ test('resource generates patch shorthand', function(assert) { }); server.resource('contacts'); - server.resource('blog-posts', { rootPath: 'posts' }); + server.resource('blog-posts', { path: 'posts' }); $.ajax({ method: 'PATCH', @@ -250,7 +250,7 @@ test('resource generates delete shorthand works', function(assert) { }); server.resource('contacts'); - server.resource('blog-posts', { rootPath: 'posts' }); + server.resource('blog-posts', { path: 'posts' }); $.ajax({ method: 'DELETE', @@ -294,7 +294,7 @@ test('resource generates shorthands which are whitelisted by :only option', func }); server.resource('contacts', { only: ['index'] }); - server.resource('blog-posts', { rootPath: 'posts', only: ['index'] }); + server.resource('blog-posts', { path: 'posts', only: ['index'] }); $.ajax({ method: 'GET', From 25f8f5b59b14d64f8a2261e3a02748726f03b00e Mon Sep 17 00:00:00 2001 From: Ryan Schie Date: Sat, 22 Apr 2017 16:51:27 -0700 Subject: [PATCH 026/879] update tests to use proper slash in resource helper path --- tests/integration/server/resource-shorthand-test.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/integration/server/resource-shorthand-test.js b/tests/integration/server/resource-shorthand-test.js index 34c2e6361..572610f2d 100644 --- a/tests/integration/server/resource-shorthand-test.js +++ b/tests/integration/server/resource-shorthand-test.js @@ -106,7 +106,7 @@ test('resource generates post shorthand', function(assert) { let done = assert.async(2); server.resource('contacts'); - server.resource('blog-posts', { path: 'posts' }); + server.resource('blog-posts', { path: '/posts' }); $.ajax({ method: 'POST', @@ -154,7 +154,7 @@ test('resource generates put shorthand', function(assert) { }); server.resource('contacts'); - server.resource('blog-posts', { path: 'posts' }); + server.resource('blog-posts', { path: '/posts' }); $.ajax({ method: 'PUT', @@ -202,7 +202,7 @@ test('resource generates patch shorthand', function(assert) { }); server.resource('contacts'); - server.resource('blog-posts', { path: 'posts' }); + server.resource('blog-posts', { path: '/posts' }); $.ajax({ method: 'PATCH', @@ -250,7 +250,7 @@ test('resource generates delete shorthand works', function(assert) { }); server.resource('contacts'); - server.resource('blog-posts', { path: 'posts' }); + server.resource('blog-posts', { path: '/posts' }); $.ajax({ method: 'DELETE', @@ -294,7 +294,7 @@ test('resource generates shorthands which are whitelisted by :only option', func }); server.resource('contacts', { only: ['index'] }); - server.resource('blog-posts', { path: 'posts', only: ['index'] }); + server.resource('blog-posts', { path: '/posts', only: ['index'] }); $.ajax({ method: 'GET', From f2011749b174537cbc97bd9f434b55d2cf3eb8c7 Mon Sep 17 00:00:00 2001 From: Beatriz Febles Date: Sun, 23 Apr 2017 13:43:45 +0200 Subject: [PATCH 027/879] add missing space in conditional (#1070) --- blueprints/ember-cli-mirage/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blueprints/ember-cli-mirage/index.js b/blueprints/ember-cli-mirage/index.js index ab5d1b12a..bafa583bd 100644 --- a/blueprints/ember-cli-mirage/index.js +++ b/blueprints/ember-cli-mirage/index.js @@ -37,7 +37,7 @@ module.exports = { after: '"predef": [\n' }).then(() =>{ if (existsSync('tests/helpers/destroy-app.js')) { - var shutdownText = ' if(window.server) {\n window.server.shutdown();\n }'; + var shutdownText = ' if (window.server) {\n window.server.shutdown();\n }'; return this.insertIntoFile('tests/helpers/destroy-app.js', shutdownText, { after: "Ember.run(application, 'destroy');\n" }); From 4f28c29f82ffaf68bdb359e3353c8684325525cc Mon Sep 17 00:00:00 2001 From: Andrew Heuermann Date: Mon, 1 May 2017 23:34:55 -0500 Subject: [PATCH 028/879] Updating docs link (#1073) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f94fc85cd..3d5d5c982 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ This project is new and the API is subject to change. When updating your project ## Getting started -Check out the [Docs](http://www.ember-cli-mirage.com/docs/v0.2.x/)! +Check out the [Docs](http://www.ember-cli-mirage.com/docs/v0.3.x/)! ## Support From 3335bebf6217f8b34bebf1b50a791c07f5949c68 Mon Sep 17 00:00:00 2001 From: John Griffin Date: Fri, 5 May 2017 13:00:36 -0400 Subject: [PATCH 029/879] Upgrade ember-inflector to 2.0.0 (#1077) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1b4856655..b67f65ac0 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "chalk": "^1.1.1", "ember-cli-babel": "^5.1.7", "ember-cli-node-assets": "^0.1.4", - "ember-inflector": "^1.9.2", + "ember-inflector": "^2.0.0", "ember-get-config": "0.2.1", "ember-lodash": "^4.0", "exists-sync": "0.0.3", From 448d6dbb25741a4d1f378d4cf801afa5ae5529f7 Mon Sep 17 00:00:00 2001 From: Marcelo Dominguez Date: Fri, 5 May 2017 10:01:03 -0700 Subject: [PATCH 030/879] Add server as a global for ESLint in afterInstall (#1066) --- blueprints/ember-cli-mirage/index.js | 72 +++++++++++++++++++--------- 1 file changed, 49 insertions(+), 23 deletions(-) diff --git a/blueprints/ember-cli-mirage/index.js b/blueprints/ember-cli-mirage/index.js index bafa583bd..cc36cda4b 100644 --- a/blueprints/ember-cli-mirage/index.js +++ b/blueprints/ember-cli-mirage/index.js @@ -29,30 +29,56 @@ module.exports = { }; }, + insertServerIntoESLintrc: function() { + // Insert server to globals declaration in eslintrc files. + // If globals declaration is not present insert it. + var text, after; + text = ' server: true,'; + after ='globals: {\n'; + return this.insertIntoFile('.eslintrc.js', text, { after: after }).then(() => { + return this.insertIntoFile('tests/.eslintrc.js', text, { after: after }).then(() => { + text = ' globals: {\n server: true,\n },'; + after = 'module.exports = {\n'; + return this.insertIntoFile('.eslintrc.js', text, { after: after }).then(() => { + return this.insertIntoFile('tests/.eslintrc.js', text, { after: after }); + }); + }); + }); + }, + + insertServerIntoJSHintrc: function() { + var text = ' "server",'; + var after = '"predef": [\n'; + + return this.insertIntoFile('.jshintrc', text, { after: after }).then(() => { + return this.insertIntoFile('tests/.jshintrc', text, { after: after }); + }); + }, + + insertShutdownIntoDestroyApp: function() { + if (existsSync('tests/helpers/destroy-app.js')) { + var shutdownText = ' if (window.server) {\n window.server.shutdown();\n }'; + return this.insertIntoFile('tests/helpers/destroy-app.js', shutdownText, { + after: "Ember.run(application, 'destroy');\n" + }); + } else { + this.ui.writeLine( + EOL + + chalk.yellow( + '******************************************************' + EOL + + 'destroy-app.js helper is not present. Please read this' + EOL + + 'https://gist.github.com/blimmer/35d3efbb64563029505a' + EOL + + 'to see how to fix the problem.' + EOL + + '******************************************************' + EOL + ) + ); + } + }, + afterInstall: function() { - return this.insertIntoFile('.jshintrc', ' "server",', { - after: '"predef": [\n' - }).then(() => { - return this.insertIntoFile('tests/.jshintrc', ' "server",', { - after: '"predef": [\n' - }).then(() =>{ - if (existsSync('tests/helpers/destroy-app.js')) { - var shutdownText = ' if (window.server) {\n window.server.shutdown();\n }'; - return this.insertIntoFile('tests/helpers/destroy-app.js', shutdownText, { - after: "Ember.run(application, 'destroy');\n" - }); - } else { - this.ui.writeLine( - EOL + - chalk.yellow( - '******************************************************' + EOL + - 'destroy-app.js helper is not present. Please read this' + EOL + - 'https://gist.github.com/blimmer/35d3efbb64563029505a' + EOL + - 'to see how to fix the problem.' + EOL + - '******************************************************' + EOL - ) - ); - } + return this.insertServerIntoESLintrc().then(() => { + return this.insertServerIntoJSHintrc().then(() => { + return this.insertShutdownIntoDestroyApp(); }); }); } From 1913507012b242827a44c8680eb264a0e57f3649 Mon Sep 17 00:00:00 2001 From: Simon Ihmig Date: Thu, 18 May 2017 14:09:27 +0200 Subject: [PATCH 031/879] Update ember-lodash (#1088) * Update ember-lodash Fixes #1084 * Update npm to at least v3 in Travis --- .travis.yml | 1 + package.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b15f6d907..4fe267cd6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,6 +34,7 @@ before_install: - sudo apt-get install -y libappindicator1 fonts-liberation - wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb - sudo dpkg -i google-chrome*.deb + - if [[ $(npm -v | cut -d '.' -f 1) -lt 3 ]]; then npm i -g npm@^3; fi - npm config set spin false - npm install -g bower phantomjs-prebuilt diff --git a/package.json b/package.json index b67f65ac0..cc6bcee2d 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "ember-cli-node-assets": "^0.1.4", "ember-inflector": "^2.0.0", "ember-get-config": "0.2.1", - "ember-lodash": "^4.0", + "ember-lodash": "^4.17.3", "exists-sync": "0.0.3", "fake-xml-http-request": "^1.4.0", "faker": "^3.0.0", From 32869033ce74d4f13625e7bbc7d2d53ec2a4825b Mon Sep 17 00:00:00 2001 From: Nick Pafundi Date: Fri, 19 May 2017 05:33:23 -0700 Subject: [PATCH 032/879] Normalize hasMany relationships (#1086) This commit updates `_getRequestAttrs` to normalize any `hasMany` relationships in a request's JSON data. By default, Ember Data will serialize `hasMany` relationships if they are many-to-none, many-to-many, or if serialization is forced via `serialize: true` in the `attrs` property on [DS.JSONSerializer](https://emberjs.com/api/data/classes/DS.JSONSerializer.html). (One-to-many are not serialized by default). Before this commit, Mirage only normalized attributes and `belongsTo` relationships. Because `hasMany` relationships weren't normalized, many- to-many relationships weren't saved via the shorthand route handlers or any custom route handlers that used `this.normalizedRequestAttrs()` (which calls `_getRequestAttrs`). For example, assume a many-to-many relationship between `Authors` and `Books`. In Ember, if additional `Books` are associated with an `Author` and saved, i.e.: ```javascript author.get('books').pushObjects([anotherBook, yetAnotherBook]); author.save(); ``` These changes wouldn't be saved and reflected in Mirage, because the normalization didn't include the new Ids. --- addon/route-handlers/base.js | 4 +++- .../route-handlers/shorthands/base-test.js | 20 ++++++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/addon/route-handlers/base.js b/addon/route-handlers/base.js index 6f5b2f80d..f378db70d 100644 --- a/addon/route-handlers/base.js +++ b/addon/route-handlers/base.js @@ -58,7 +58,9 @@ export default class BaseRouteHandler { Object.keys(json.data.relationships).forEach((key) => { let relationship = json.data.relationships[key]; - if (!Array.isArray(relationship.data)) { + if (Array.isArray(relationship.data)) { + attrs[`${camelize(singularize(key))}Ids`] = relationship.data.map(rel => rel.id); + } else { attrs[`${camelize(key)}Id`] = relationship.data && relationship.data.id; } }, {}); diff --git a/tests/unit/route-handlers/shorthands/base-test.js b/tests/unit/route-handlers/shorthands/base-test.js index 1c2e5bc0b..274f5d912 100644 --- a/tests/unit/route-handlers/shorthands/base-test.js +++ b/tests/unit/route-handlers/shorthands/base-test.js @@ -62,6 +62,21 @@ test('_getAttrsForRequest works with attributes and relationships', function(ass 'type': 'companies' } }, + 'employees': { + 'data': [{ + 'id': '1', + 'type': 'employees' + }, { + 'id': '2', + 'type': 'employees' + }, { + 'id': '3', + 'type': 'employees' + }] + }, + 'nothings': { + 'data': [] + }, 'github-account': { 'data': { 'id': '1', @@ -70,9 +85,6 @@ test('_getAttrsForRequest works with attributes and relationships', function(ass }, 'something': { 'data': null - }, - 'many-things': { - 'data': [] } }, 'type': 'github-account' @@ -91,6 +103,8 @@ test('_getAttrsForRequest works with attributes and relationships', function(ass name: 'Sam', doesMirage: true, companyId: '1', + employeeIds: ['1', '2', '3'], + nothingIds: [], githubAccountId: '1', somethingId: null }, From a796317174ffd63fddd2bfd9035adec277bad107 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 25 May 2017 01:36:18 -0400 Subject: [PATCH 033/879] Default `discoverEmberDataModels` to true --- app/initializers/ember-cli-mirage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/initializers/ember-cli-mirage.js b/app/initializers/ember-cli-mirage.js index 8db5b6b85..766a5e0ab 100644 --- a/app/initializers/ember-cli-mirage.js +++ b/app/initializers/ember-cli-mirage.js @@ -25,7 +25,7 @@ export default { export function startMirage(env = ENV) { let environment = env.environment; - let discoverEmberDataModels = getWithDefault(env['ember-cli-mirage'] || {}, 'discoverEmberDataModels', false); + let discoverEmberDataModels = getWithDefault(env['ember-cli-mirage'] || {}, 'discoverEmberDataModels', true); let modules = readModules(env.modulePrefix); let options = _assign(modules, {environment, baseConfig, testConfig, discoverEmberDataModels}); From 07ddd8a6d938742cd5bde1e97e41235e9ac7b71d Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 25 May 2017 02:23:43 -0400 Subject: [PATCH 034/879] Update changelog --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 725f2b35f..cf0810de0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Ember CLI Mirage Changelog +## 0.3.2 + +Update notes: none + +Changes: + + - [FEATURE][#1056](https://github.com/samselikoff/ember-cli-mirage/pull/1056) Auto generate models from Ember Data models @offirgolan + - [ENHANCEMENT][#1068](https://github.com/samselikoff/ember-cli-mirage/pull/1068) Add Resource helper custom path parameter @rjschie + - [ENHANCEMENT][#1077](https://github.com/samselikoff/ember-cli-mirage/pull/1077) Upgrade ember-inflector to 2.0 @john-griffin + - [ENHANCEMENT][#1088](https://github.com/samselikoff/ember-cli-mirage/pull/1088) Upgrade ember-lodash @john-griffin + - [ENHANCEMENT][#1086](https://github.com/samselikoff/ember-cli-mirage/pull/1086) Normalize hasMany relationships @npafundi + - General improvements: @kishiamy, @aheuermann, @marpo60, + ## 0.3.1 Update notes: none From 9668cf8e287bf922dfd6741af7e476e7ac54aaf4 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 25 May 2017 02:23:53 -0400 Subject: [PATCH 035/879] 0.3.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cc6bcee2d..04f19d64f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "0.3.1", + "version": "0.3.2", "description": "A client-side HTTP server to develop, test and demo your Ember app", "directories": { "doc": "doc", From 57be5513680eafaaddd10abef9500a2e696c87eb Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 3 Jun 2017 21:28:04 -0400 Subject: [PATCH 036/879] Polymorphic associations (#1080) --- addon/orm/associations/association.js | 58 +-- addon/orm/associations/belongs-to.js | 96 ++++- addon/orm/associations/has-many.js | 112 +++++- addon/orm/model.js | 353 +++++++++++++----- addon/orm/polymorphic-collection.js | 181 +++++++++ addon/orm/schema.js | 48 ++- addon/serializer.js | 67 +++- addon/serializers/active-model-serializer.js | 8 + package.json | 2 +- .../10-one-to-one-polymorphic/_helper.js | 105 ++++++ .../accessor-test.js | 34 ++ .../association-create-test.js | 27 ++ .../association-new-test.js | 33 ++ .../association-set-id-test.js | 47 +++ .../association-set-test.js | 49 +++ .../10-one-to-one-polymorphic/create-test.js | 65 ++++ .../10-one-to-one-polymorphic/delete-test.js | 24 ++ .../instantiating-test.js | 83 ++++ .../9-one-way-polymorphic/_helper.js | 113 ++++++ .../9-one-way-polymorphic/accessor-test.js | 22 ++ .../association-create-test.js | 26 ++ .../association-new-test.js | 31 ++ .../association-set-id-test.js | 41 ++ .../association-set-test.js | 44 +++ .../9-one-way-polymorphic/create-test.js | 38 ++ .../9-one-way-polymorphic/delete-test.js | 24 ++ .../instantiating-test.js | 84 +++++ .../orm/belongs-to/{9-misc => }/misc-test.js | 0 .../10-many-to-many-polymorphic/_helper.js | 143 +++++++ .../accessor-test.js | 37 ++ .../association-create-test.js | 33 ++ .../association-new-test.js | 37 ++ .../association-set-ids-test.js | 52 +++ .../association-set-test.js | 83 ++++ .../create-test.js | 57 +++ .../delete-test.js | 24 ++ .../instantiating-test.js | 81 ++++ .../3-reflexive/association-new-test.js | 1 + .../orm/has-many/3-reflexive/create-test.js | 4 +- .../has-many/9-one-way-polymorphic/_helper.js | 124 ++++++ .../9-one-way-polymorphic/accessor-test.js | 30 ++ .../association-create-test.js | 32 ++ .../association-new-test.js | 35 ++ .../association-set-ids-test.js | 34 ++ .../association-set-test.js | 53 +++ .../9-one-way-polymorphic/create-test.js | 87 +++++ .../9-one-way-polymorphic/delete-test.js | 24 ++ .../instantiating-test.js | 81 ++++ .../3-one-to-many-polymorphic/_helper.js | 138 +++++++ .../accessor-test.js | 36 ++ .../association-create-test.js | 36 ++ .../association-new-test.js | 35 ++ .../association-set-ids-test.js | 59 +++ .../association-set-test.js | 89 +++++ .../3-one-to-many-polymorphic/create-test.js | 65 ++++ .../3-one-to-many-polymorphic/delete-test.js | 24 ++ .../instantiating-test.js | 81 ++++ .../schema-verification/belongs-to-test.js | 106 ++++-- .../orm/schema-verification/has-many-test.js | 46 ++- .../orm/schema-verification/mixed-test.js | 93 +++-- .../active-model-serializer-test.js | 42 ++- .../polymorphic-belongs-to-test.js | 52 +++ .../associations/polymorphic-has-many-test.js | 53 +++ .../associations/polymorphic-test.js | 97 +++++ 64 files changed, 3639 insertions(+), 280 deletions(-) create mode 100644 addon/orm/polymorphic-collection.js create mode 100644 tests/integration/orm/belongs-to/10-one-to-one-polymorphic/_helper.js create mode 100644 tests/integration/orm/belongs-to/10-one-to-one-polymorphic/accessor-test.js create mode 100644 tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-create-test.js create mode 100644 tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-new-test.js create mode 100644 tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-id-test.js create mode 100644 tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-test.js create mode 100644 tests/integration/orm/belongs-to/10-one-to-one-polymorphic/create-test.js create mode 100644 tests/integration/orm/belongs-to/10-one-to-one-polymorphic/delete-test.js create mode 100644 tests/integration/orm/belongs-to/10-one-to-one-polymorphic/instantiating-test.js create mode 100644 tests/integration/orm/belongs-to/9-one-way-polymorphic/_helper.js create mode 100644 tests/integration/orm/belongs-to/9-one-way-polymorphic/accessor-test.js create mode 100644 tests/integration/orm/belongs-to/9-one-way-polymorphic/association-create-test.js create mode 100644 tests/integration/orm/belongs-to/9-one-way-polymorphic/association-new-test.js create mode 100644 tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-id-test.js create mode 100644 tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-test.js create mode 100644 tests/integration/orm/belongs-to/9-one-way-polymorphic/create-test.js create mode 100644 tests/integration/orm/belongs-to/9-one-way-polymorphic/delete-test.js create mode 100644 tests/integration/orm/belongs-to/9-one-way-polymorphic/instantiating-test.js rename tests/integration/orm/belongs-to/{9-misc => }/misc-test.js (100%) create mode 100644 tests/integration/orm/has-many/10-many-to-many-polymorphic/_helper.js create mode 100644 tests/integration/orm/has-many/10-many-to-many-polymorphic/accessor-test.js create mode 100644 tests/integration/orm/has-many/10-many-to-many-polymorphic/association-create-test.js create mode 100644 tests/integration/orm/has-many/10-many-to-many-polymorphic/association-new-test.js create mode 100644 tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-ids-test.js create mode 100644 tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-test.js create mode 100644 tests/integration/orm/has-many/10-many-to-many-polymorphic/create-test.js create mode 100644 tests/integration/orm/has-many/10-many-to-many-polymorphic/delete-test.js create mode 100644 tests/integration/orm/has-many/10-many-to-many-polymorphic/instantiating-test.js create mode 100644 tests/integration/orm/has-many/9-one-way-polymorphic/_helper.js create mode 100644 tests/integration/orm/has-many/9-one-way-polymorphic/accessor-test.js create mode 100644 tests/integration/orm/has-many/9-one-way-polymorphic/association-create-test.js create mode 100644 tests/integration/orm/has-many/9-one-way-polymorphic/association-new-test.js create mode 100644 tests/integration/orm/has-many/9-one-way-polymorphic/association-set-ids-test.js create mode 100644 tests/integration/orm/has-many/9-one-way-polymorphic/association-set-test.js create mode 100644 tests/integration/orm/has-many/9-one-way-polymorphic/create-test.js create mode 100644 tests/integration/orm/has-many/9-one-way-polymorphic/delete-test.js create mode 100644 tests/integration/orm/has-many/9-one-way-polymorphic/instantiating-test.js create mode 100644 tests/integration/orm/mixed/3-one-to-many-polymorphic/_helper.js create mode 100644 tests/integration/orm/mixed/3-one-to-many-polymorphic/accessor-test.js create mode 100644 tests/integration/orm/mixed/3-one-to-many-polymorphic/association-create-test.js create mode 100644 tests/integration/orm/mixed/3-one-to-many-polymorphic/association-new-test.js create mode 100644 tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-ids-test.js create mode 100644 tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-test.js create mode 100644 tests/integration/orm/mixed/3-one-to-many-polymorphic/create-test.js create mode 100644 tests/integration/orm/mixed/3-one-to-many-polymorphic/delete-test.js create mode 100644 tests/integration/orm/mixed/3-one-to-many-polymorphic/instantiating-test.js create mode 100644 tests/integration/serializers/base/associations/polymorphic-belongs-to-test.js create mode 100644 tests/integration/serializers/base/associations/polymorphic-has-many-test.js create mode 100644 tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js diff --git a/addon/orm/associations/association.js b/addon/orm/associations/association.js index 87557347a..013c60088 100644 --- a/addon/orm/associations/association.js +++ b/addon/orm/associations/association.js @@ -1,4 +1,3 @@ -import Model from '../model'; import { dasherize } from 'ember-cli-mirage/utils/inflector'; export default class Association { @@ -32,40 +31,6 @@ export default class Association { this.schema = schema; } - /** - * Returns this association's inverse, if it exists - * - * @method inverse - * @return {Object} the inverse association - * @public - */ - inverse() { - let inverse; - - if (this.opts.inverse === null) { - inverse = null; - - } else { - let associationsMap = this.schema.associationsFor(this.modelName); - let explicitInverse = this.opts.inverse; - if (explicitInverse) { - inverse = associationsMap[explicitInverse]; - } else { - let matches = Object.keys(associationsMap) - .map(key => associationsMap[key]) - .filter(association => association.modelName === this.ownerModelName); - - if (matches.length === 1) { - inverse = matches[0]; - } else { - inverse = null; - } - } - } - - return inverse; - } - /** * Returns true if the association is reflexive. * @@ -80,26 +45,7 @@ export default class Association { return isExplicitReflexive || isImplicitReflexive; } - /** - * Used to check if models match each other. If models are saved, we check model type - * and id, since they could have other non-persisted properties that are different. - * - * @public - */ - inversesAlreadyAssociated(inverse, owner) { - let inverseKey = this.inverse().key; - let inverseAssociation = inverse[inverseKey]; - - if (inverseAssociation && owner) { - if (inverseAssociation instanceof Model) { - if (inverseAssociation.isSaved() && owner.isSaved()) { - return inverseAssociation.toString() === owner.toString(); - } else { - return inverseAssociation === owner; - } - } else { - return inverseAssociation.includes(owner); - } - } + get isPolymorphic() { + return this.opts.polymorphic; } } diff --git a/addon/orm/associations/belongs-to.js b/addon/orm/associations/belongs-to.js index 7035b6d58..65a20e9fb 100644 --- a/addon/orm/associations/belongs-to.js +++ b/addon/orm/associations/belongs-to.js @@ -34,7 +34,7 @@ export default class BelongsTo extends Association { } /** - * registers belongs-to association defined by given key on given model, + * Registers belongs-to association defined by given key on given model, * defines getters / setters for associated parent and associated parent's id, * adds methods for creating unsaved parent record and creating a saved one * @@ -72,10 +72,22 @@ export default class BelongsTo extends Association { if (tempParent === null) { id = null; - } else if (tempParent) { - id = tempParent.id; } else { - id = this.attrs[foreignKey]; + + if (association.isPolymorphic) { + if (tempParent) { + id = { id: tempParent.id, type: tempParent.modelName }; + } else { + id = this.attrs[foreignKey]; + } + } else { + if (tempParent) { + id = tempParent.id; + } else { + id = this.attrs[foreignKey]; + } + } + } return id; @@ -91,8 +103,13 @@ export default class BelongsTo extends Association { if (id === null) { tempParent = null; } else if (id !== undefined) { - tempParent = association.schema[toCollectionName(association.modelName)].find(id); - assert(tempParent, `Couldn\'t find ${association.modelName} with id = ${id}`); + if (association.isPolymorphic) { + assert(typeof id === 'object', `You're setting an ID on the polymorphic association '${association.key}' but you didn't pass in an object. Polymorphic IDs need to be in the form { type, id }.`); + tempParent = association.schema[toCollectionName(id.type)].find(id.id); + } else { + tempParent = association.schema[toCollectionName(association.modelName)].find(id); + assert(tempParent, `Couldn\'t find ${association.modelName} with id = ${id}`); + } } this[key] = tempParent; @@ -114,7 +131,11 @@ export default class BelongsTo extends Association { if (tempParent) { model = tempParent; } else if (foreignKeyId !== null) { - model = association.schema[toCollectionName(association.modelName)].find(foreignKeyId); + if (association.isPolymorphic) { + model = association.schema[toCollectionName(foreignKeyId.type)].find(foreignKeyId.id); + } else { + model = association.schema[toCollectionName(association.modelName)].find(foreignKeyId); + } } return model; @@ -123,17 +144,25 @@ export default class BelongsTo extends Association { /* object.parent = (parentModel) - sets the associated parent via model + + I want to jot some notes about hasInverseFor. There used to be an + association.inverse() check, but adding polymorphic associations + complicated this. `comment.commentable`, you can't easily check for an + inverse since `comments: hasMany()` could be on any model. + + Instead of making it very complex and looking for an inverse on the + association in isoaltion, it was much simpler to ask the model being + passed in if it had an inverse for the setting model and with its + association. */ set(model) { this._tempAssociations = this._tempAssociations || {}; this._tempAssociations[key] = model; - if ( - model - && association.inverse() - && !association.inversesAlreadyAssociated(model, this) // check for an existing match, to avoid recursion - ) { - model.associate(this, association.inverse()); + if (model && model.hasInverseFor(association)) { + let inverse = model.inverseFor(association); + + model.associate(this, inverse); } } }); @@ -141,9 +170,21 @@ export default class BelongsTo extends Association { /* object.newParent - creates a new unsaved associated parent + + TODO: document polymorphic */ - modelPrototype[`new${capitalize(key)}`] = function(attrs) { - let parent = association.schema[toCollectionName(association.modelName)].new(attrs); + modelPrototype[`new${capitalize(key)}`] = function(...args) { + let modelName, attrs; + + if (association.isPolymorphic) { + modelName = args[0]; + attrs = args[1]; + } else { + modelName = association.modelName; + attrs = args[0]; + } + + let parent = association.schema[toCollectionName(modelName)].new(attrs); this[key] = parent; @@ -153,9 +194,20 @@ export default class BelongsTo extends Association { /* object.createParent - creates a new saved associated parent, and immediately persists both models + + TODO: document polymorphic */ - modelPrototype[`create${capitalize(key)}`] = function(attrs) { - let parent = association.schema[toCollectionName(association.modelName)].create(attrs); + modelPrototype[`create${capitalize(key)}`] = function(...args) { + let modelName, attrs; + if (association.isPolymorphic) { + modelName = args[0]; + attrs = args[1]; + } else { + modelName = association.modelName; + attrs = args[0]; + } + + let parent = association.schema[toCollectionName(modelName)].create(attrs); this[key] = parent; this.save(); @@ -171,8 +223,16 @@ export default class BelongsTo extends Association { */ disassociateAllDependentsFromTarget(model) { let owner = this.ownerModelName; + let fk; + + if (this.isPolymorphic) { + fk = { type: model.modelName, id: model.id }; + } else { + fk = model.id; + } + let dependents = this.schema[toCollectionName(owner)] - .where({ [this.getForeignKey()]: model.id }); + .where({ [this.getForeignKey()]: fk }); dependents.models.forEach(dependent => { dependent.disassociate(model, this); diff --git a/addon/orm/associations/has-many.js b/addon/orm/associations/has-many.js index 878eb9962..5cca214a4 100644 --- a/addon/orm/associations/has-many.js +++ b/addon/orm/associations/has-many.js @@ -1,5 +1,6 @@ import Association from './association'; import Collection from '../collection'; +import PolymorphicCollection from '../polymorphic-collection'; import _assign from 'lodash/assign'; import _compact from 'lodash/compact'; import { capitalize, camelize, singularize } from 'ember-cli-mirage/utils/inflector'; @@ -71,7 +72,11 @@ export default class HasMany extends Association { let ids = []; if (tempChildren) { - ids = tempChildren.models.map(model => model.id); + if (association.isPolymorphic) { + ids = tempChildren.models.map(model => ({ type: model.modelName, id: model.id })); + } else { + ids = tempChildren.models.map(model => model.id); + } } else { ids = this.attrs[foreignKey] || []; } @@ -90,7 +95,22 @@ export default class HasMany extends Association { tempChildren = []; } else if (ids !== undefined) { assert(Array.isArray(ids), `You must pass an array in when seting ${foreignKey} on ${this}`); - tempChildren = association.schema[toCollectionName(association.modelName)].find(ids); + + if (association.isPolymorphic) { + assert(ids.every((el) => { + return ((typeof el === 'object') + && (typeof el.type !== undefined) + && (typeof el.id !== undefined) + ); + }), `You must pass in an array of polymorphic identifiers (objects of shape { type, id }) when seting ${foreignKey} on ${this}`); + + let models = ids.map(({ type, id }) => { + return association.schema[toCollectionName(type)].find(id); + }); + tempChildren = new PolymorphicCollection(models); + } else { + tempChildren = association.schema[toCollectionName(association.modelName)].find(ids); + } } this[key] = tempChildren; @@ -110,10 +130,23 @@ export default class HasMany extends Association { if (this._tempAssociations[key]) { collection = this._tempAssociations[key]; } else { - if (this[foreignKey]) { - collection = association.schema[toCollectionName(association.modelName)].find(this[foreignKey]); + if (association.isPolymorphic) { + if (this[foreignKey]) { + let polymorphicIds = this[foreignKey]; + let models = polymorphicIds.map(({ type, id }) => { + return association.schema[toCollectionName(type)].find(id); + }); + + collection = new PolymorphicCollection(models); + } else { + collection = new PolymorphicCollection(association.modelName); + } } else { - collection = new Collection(association.modelName); + if (this[foreignKey]) { + collection = association.schema[toCollectionName(association.modelName)].find(this[foreignKey]); + } else { + collection = new Collection(association.modelName); + } } this._tempAssociations[key] = collection; @@ -127,20 +160,28 @@ export default class HasMany extends Association { - sets the associated children (via array of models or Collection) */ set(models) { - if (models instanceof Collection) { + if (models instanceof Collection || models instanceof PolymorphicCollection) { models = models.models; } models = models ? _compact(models) : []; this._tempAssociations = this._tempAssociations || {}; - this._tempAssociations[key] = new Collection(association.modelName, models); - - if (association.inverse()) { - models.forEach(model => { - model.associate(this, association.inverse()); - }); + let collection; + if (association.isPolymorphic) { + collection = new PolymorphicCollection(models); + } else { + collection = new Collection(association.modelName, models); } + this._tempAssociations[key] = collection; + + models.forEach(model => { + if (model.hasInverseFor(association)) { + let inverse = model.inverseFor(association); + + model.associate(this, inverse); + } + }); } }); @@ -148,10 +189,19 @@ export default class HasMany extends Association { object.newChild - creates a new unsaved associated child */ - modelPrototype[`new${capitalize(camelize(singularize(association.key)))}`] = function(attrs = {}) { - let child = association.schema[toCollectionName(association.modelName)].new(attrs); + modelPrototype[`new${capitalize(camelize(singularize(association.key)))}`] = function(...args) { + let modelName, attrs; + if (association.isPolymorphic) { + modelName = args[0]; + attrs = args[1]; + } else { + modelName = association.modelName; + attrs = args[0]; + } + let child = association.schema[toCollectionName(modelName)].new(attrs); let children = this[key].models; + children.push(child); this[key] = children; @@ -161,12 +211,24 @@ export default class HasMany extends Association { /* object.createChild - creates a new saved associated child, and immediately persists both models + + TODO: forgot why this[key].add(child) doesn't work, most likely + because these external APIs trigger saving cascades. Should probably + have an internal method like this[key]._add. */ - modelPrototype[`create${capitalize(camelize(singularize(association.key)))}`] = function(attrs = {}) { - let child = association.schema[toCollectionName(association.modelName)].create(attrs); + modelPrototype[`create${capitalize(camelize(singularize(association.key)))}`] = function(...args) { + let modelName, attrs; + if (association.isPolymorphic) { + modelName = args[0]; + attrs = args[1]; + } else { + modelName = association.modelName; + attrs = args[0]; + } - // this[key].add(child); + let child = association.schema[toCollectionName(modelName)].create(attrs); let children = this[key].models; + children.push(child); this[key] = children; @@ -183,12 +245,26 @@ export default class HasMany extends Association { */ disassociateAllDependentsFromTarget(model) { let owner = this.ownerModelName; + let fk; + + if (this.isPolymorphic) { + fk = { type: model.modelName, id: model.id }; + } else { + fk = model.id; + } + let dependents = this.schema[toCollectionName(owner)] .where((potentialOwner) => { let currentIds = potentialOwner[this.getForeignKey()]; // Need this check because currentIds could be null - return currentIds && currentIds.includes(model.id); + return currentIds && currentIds.find((id) => { + if (typeof id === 'object') { + return id.type === fk.type && id.id === fk.id; + } else { + return id === fk; + } + }); }); dependents.models.forEach(dependent => { diff --git a/addon/orm/model.js b/addon/orm/model.js index 67cb76e67..493a41132 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -2,7 +2,9 @@ import { toCollectionName } from 'ember-cli-mirage/utils/normalize-name'; import extend from '../utils/extend'; import assert from '../assert'; import Collection from './collection'; +import PolymorphicCollection from './polymorphic-collection'; import _values from 'lodash/values'; +import _compact from 'lodash/compact'; /* The Model class. Notes: @@ -180,17 +182,113 @@ class Model { } /** - * Returns the inverse association, if it exists + * Returns this model's inverse association for the given + * model-type-association pair, if it exists. * - * @method inverseAssociationFor - * @param key + * Example: + + post: Model.extend({ + comments: hasMany() + }), + comments: Model.extend({ + post: belongsTo() + }) + + post.inversefor(commentsPostAssociation) would return the + `post.comments` association object. + + Originally we had association.inverse() but that became impossible with + the addition of polymorphic models. Consider the following: + + post: Model.extend({ + comments: hasMany() + }), + picture: Model.extend({ + comments: hasMany() + }), + comments: Model.extend({ + commentable: belongsTo({ polymorphic: true }) + }) + + `commentable.inverse()` is ambiguous - does it return + `post.comments` or `picture.comments`? Instead we need to ask each model + if it has an inverse for a given association. post.inverseFor(commentable) + is no longer ambiguous. + * + * + * @method hasInverseFor + * @param {String} modelName The model name of the class we're scanning + * @param {ORM/Association} association + * @return {ORM/Association} * @public */ - inverseAssociationFor(key) { - return this.associationFor(key).inverse(); + inverseFor(association) { + let associations = this._schema.associationsFor(this.modelName); + let modelName = association.ownerModelName; + + let theInverse = _values(associations) + .filter(candidate => candidate.modelName === modelName) + .reduce((inverse, candidate) => { + let candidateInverse = candidate.opts.inverse; + let candidateIsImplicitInverse = candidateInverse === undefined; + let candidateIsExplicitInverse = (candidateInverse === association.key); + let candidateMatches = candidateIsImplicitInverse || candidateIsExplicitInverse; + + if (candidateMatches) { + // Need to move this check to compile-time init + assert(!inverse, `The ${this.modelName} model has multiple possible inverse associations for the ${association.key} association on the ${association.ownerModelName} model.`); + + inverse = candidate; + } + + return inverse; + }, null); + + return theInverse; + } + + /** + * Returns whether this model has an inverse association for the given + * model-type-association pair. + * + * @method hasInverseFor + * @param {String} modelName + * @param {ORM/Association} association + * @return {Boolean} + * @public + */ + hasInverseFor(association) { + return !!this.inverseFor(association); + } + + /** + * Used to check if models match each other. If models are saved, we check model type + * and id, since they could have other non-persisted properties that are different. + * + * @public + */ + alreadyAssociatedWith(model, association) { + let { key } = association; + let associatedModelOrCollection = this[key]; + + if (associatedModelOrCollection && model) { + if (associatedModelOrCollection instanceof Model) { + if (associatedModelOrCollection.isSaved() && model.isSaved()) { + return associatedModelOrCollection.toString() === model.toString(); + } else { + return associatedModelOrCollection === model; + } + } else { + return associatedModelOrCollection.includes(model); + } + } } associate(model, association) { + if (this.alreadyAssociatedWith(model, association)) { + return; + } + let { key } = association; if (association.constructor.name === 'HasMany') { @@ -206,7 +304,14 @@ class Model { let fk = association.getForeignKey(); if (association.constructor.name === 'HasMany') { - let i = this[fk].map(key => key.toString()).indexOf(model.id.toString()); + let i; + if (association.isPolymorphic) { + let found = this[fk].find(({ type, id }) => (type === model.modelName && id === model.id)); + i = found && this[fk].indexOf(found); + } else { + i = this[fk].map(key => key.toString()).indexOf(model.id.toString()); + } + if (i > -1) { this.attrs[fk].splice(i, 1); } @@ -228,7 +333,7 @@ class Model { Object.keys(attrs) .filter((key) => { let value = attrs[key]; - let isModelOrCollection = (value instanceof Model || value instanceof Collection); + let isModelOrCollection = (value instanceof Model || value instanceof Collection || value instanceof PolymorphicCollection); let isArrayOfModels = Array.isArray(value) && value.length && value.every(item => item instanceof Model); return isModelOrCollection || isArrayOfModels; @@ -341,22 +446,37 @@ class Model { */ _validateForeignKeyExistsInDatabase(foreignKeyName, foreignKeys) { if (Array.isArray(foreignKeys)) { - let associationModelName = Object.keys(this.hasManyAssociations) + let association = Object.keys(this.hasManyAssociations) .map(key => this.hasManyAssociations[key]) - .filter(association => association.getForeignKey() === foreignKeyName)[0] - .modelName; + .filter(association => association.getForeignKey() === foreignKeyName)[0]; - let found = this._schema.db[toCollectionName(associationModelName)].find(foreignKeys); - assert(found.length === foreignKeys.length, `You're instantiating a ${this.modelName} that has a ${foreignKeyName} of ${foreignKeys}, but some of those records don't exist in the database.`); + let found; + if (association.isPolymorphic) { + found = foreignKeys.map(({ type, id }) => { + return this._schema.db[toCollectionName(type)].find(id); + }); + found = _compact(found); + } else { + found = this._schema.db[toCollectionName(association.modelName)].find(foreignKeys); + } + + let foreignKeyLabel = association.isPolymorphic ? foreignKeys.map(fk => `${fk.type}:${fk.id}`).join(',') : foreignKeys; + assert(found.length === foreignKeys.length, `You're instantiating a ${this.modelName} that has a ${foreignKeyName} of ${foreignKeyLabel}, but some of those records don't exist in the database.`); } else { - let associationModelName = Object.keys(this.belongsToAssociations) + let association = Object.keys(this.belongsToAssociations) .map(key => this.belongsToAssociations[key]) - .filter(association => association.getForeignKey() === foreignKeyName)[0] - .modelName; + .filter(association => association.getForeignKey() === foreignKeyName)[0]; + + let found; + if (association.isPolymorphic) { + found = this._schema.db[toCollectionName(foreignKeys.type)].find(foreignKeys.id); + } else { + found = this._schema.db[toCollectionName(association.modelName)].find(foreignKeys); + } - let found = this._schema.db[toCollectionName(associationModelName)].find(foreignKeys); - assert(found, `You're instantiating a ${this.modelName} that has a ${foreignKeyName} of ${foreignKeys}, but that record doesn't exist in the database.`); + let foreignKeyLabel = association.isPolymorphic ? `${foreignKeys.type}:${foreignKeys.id}` : foreignKeys; + assert(found, `You're instantiating a ${this.modelName} that has a ${foreignKeyName} of ${foreignKeyLabel}, but that record doesn't exist in the database.`); } } @@ -375,7 +495,7 @@ class Model { _values(this.belongsToAssociations).forEach(association => { this._disassociateFromOldInverses(association); this._saveNewAssociates(association); - this._associateWithNewInverse(association); + this._associateWithNewInverses(association); }); } @@ -395,45 +515,84 @@ class Model { } } + // Disassociate currently persisted models that are no longer associated _disassociateFromHasManyInverses(association) { let { key } = association; let fk = association.getForeignKey(); - let inverse = association.inverse(); let tempAssociation = this._tempAssociations && this._tempAssociations[key]; - let oldInversesExist = this.attrs[fk]; - - if (inverse && tempAssociation && oldInversesExist) { - // Disassociate currently persisted models that are no longer associated - this._schema[toCollectionName(association.modelName)] - .find(this.attrs[fk] || []) // TODO: prob should initialize hasMany fks with [] - .models - .filter(model => !tempAssociation.includes(model)) // filter out models that will still be associated - .forEach(model => { - model.disassociate(this, inverse); - model.save(); + let associateIds = this.attrs[fk]; + + if (tempAssociation && associateIds) { + let models; + if (association.isPolymorphic) { + models = associateIds.map(({ type, id }) => { + return this._schema[toCollectionName(type)].find(id); + }); + } else { + // TODO: prob should initialize hasMany fks with [] + models = this._schema[toCollectionName(association.modelName)] + .find(associateIds || []) + .models; + } + + models + .filter(associate => !tempAssociation.includes(associate)) // filter out models that will still be associated + .forEach(associate => { + if (associate.hasInverseFor(association)) { + let inverse = associate.inverseFor(association); + + associate.disassociate(this, inverse); + associate.save(); + } }); } } + /* + Disassociate currently persisted models that are no longer associated. + + Example: + + post: Model.extend({ + comments: hasMany() + }), + + comment: Model.extend({ + post: belongsTo() + }) + + Assume `this` is comment:1. When saving, if comment:1 is no longer + associated with post:1, we need to remove comment:1 from post:1.comments. + In this example `association` would be `comment.post`. + */ _disassociateFromBelongsToInverse(association) { let { key } = association; let fk = association.getForeignKey(); - let inverse = association.inverse(); let tempAssociation = this._tempAssociations && this._tempAssociations[key]; - let oldInversesExist = this.attrs[fk]; + let associateId = this.attrs[fk]; - if (inverse && (tempAssociation !== undefined) && oldInversesExist) { - // Disassociate currently persisted models that are no longer associated - let model = this._schema[toCollectionName(association.modelName)] - .find(this.attrs[fk]); + if ((tempAssociation !== undefined) && associateId) { + let associate; + if (association.isPolymorphic) { + associate = this._schema[toCollectionName(associateId.type)] + .find(associateId.id); + } else { + associate = this._schema[toCollectionName(association.modelName)] + .find(associateId); + } - model.disassociate(this, inverse); - model._updateInDb(model.attrs); + if (associate.hasInverseFor(association)) { + let inverse = associate.inverseFor(association); + + associate.disassociate(this, inverse); + associate._updateInDb(associate.attrs); + } } } + // Find all other models that depend on me and update their foreign keys _disassociateFromDependents() { - _values(this._schema.dependentAssociationsFor(this.modelName)) + this._schema.dependentAssociationsFor(this.modelName) .forEach(association => { association.disassociateAllDependentsFromTarget(this); }); @@ -454,13 +613,32 @@ class Model { }); this._updateInDb({ [fk]: tempAssociate.models.map(child => child.id) }); + } else if (tempAssociate instanceof PolymorphicCollection) { + tempAssociate.models.forEach(child => { + child.save(); + }); + + this._updateInDb({ + [fk]: tempAssociate.models.map(child => { + return { type: child.modelName, id: child.id }; + }) + }); + } else { if (tempAssociate === null) { this._updateInDb({ [fk]: null }); } else { tempAssociate.save(); - this._updateInDb({ [fk]: tempAssociate.id }); + + let fkValue; + if (association.isPolymorphic) { + fkValue = { id: tempAssociate.id, type: tempAssociate.modelName}; + } else { + fkValue = tempAssociate.id; + } + + this._updateInDb({ [fk]: fkValue }); } } @@ -468,63 +646,60 @@ class Model { } } - _associateWithNewInverse(association) { - let fk = association.getForeignKey(); - let inverse = association.inverse(); + /* + Step 3 in saving associations. - if (this[fk] && inverse && (inverse.constructor.name === 'BelongsTo') && !this.__isSavingNewChildren) { - let inverseFk = inverse.getForeignKey(); + Example: - this._schema.db[toCollectionName(association.modelName)] - .update(this[fk], { [inverseFk]: this.id }); + // initial state + post.author = steinbeck; - } else if (this[fk] && inverse && (inverse.constructor.name === 'HasMany') && !this.__isSavingNewChildren) { - let inverseFk = inverse.getForeignKey(); - let inverseCollection = this._schema.db[toCollectionName(association.modelName)]; - let currentIdsForInverse = inverseCollection.find(this[fk])[inverse.getForeignKey()] || []; - let newIdsForInverse = currentIdsForInverse; + // new state + post.author = twain; + + 1. Disassociate from old inverse (remove post from steinbeck.posts) + 2. Save new associates (if twain.isNew, save twain) + -> 3. Associate with new inverse (add post to twain.posts) + */ + _associateWithNewInverses(association) { + if (!this.__isSavingNewChildren) { + let modelOrCollection = this[association.key]; + + if (modelOrCollection instanceof Model) { + this._associateModelWithInverse(modelOrCollection, association); - if (newIdsForInverse.indexOf(this.id) === -1) { - newIdsForInverse.push(this.id); + } else if (modelOrCollection instanceof Collection || modelOrCollection instanceof PolymorphicCollection) { + modelOrCollection.models + .forEach(model => { + this._associateModelWithInverse(model, association); + }); } - inverseCollection.update(this[fk], { [inverseFk]: newIdsForInverse }); + delete this._tempAssociations[association.key]; } } - _associateWithNewInverses(association) { - let fk = association.getForeignKey(); - let inverse = association.inverse(); - - // Associate new models - if (inverse && (inverse.constructor.name === 'HasMany') && !this.__isSavingNewChildren) { - this._schema[toCollectionName(association.modelName)] - .find(this[fk]) - .models - .forEach(model => { - let inverseFk = inverse.getForeignKey(); - let ownerId = this.id; - let inverseCollection = this._schema.db[toCollectionName(model.modelName)]; - let currentIdsForInverse = inverseCollection.find(model.id)[inverse.getForeignKey()] || []; - let newIdsForInverse = currentIdsForInverse; - - if (newIdsForInverse.indexOf(ownerId) === -1) { - newIdsForInverse.push(ownerId); - } + _associateModelWithInverse(model, association) { + if (model.hasInverseFor(association)) { + let inverse = model.inverseFor(association); + let inverseFk = inverse.getForeignKey(); - inverseCollection.update(model.id, { [inverseFk]: newIdsForInverse }); - }); - } else if (inverse && (inverse.constructor.name === 'BelongsTo') && !this.__isSavingNewChildren) { - this._schema[toCollectionName(association.modelName)] - .find(this[fk]) - .models - .forEach(model => { - let inverseFk = inverse.getForeignKey(); - let ownerId = this.id; - let inverseCollection = this._schema.db[toCollectionName(model.modelName)]; - - inverseCollection.update(model.id, { [inverseFk]: ownerId }); - }); + if (inverse.constructor.name === 'BelongsTo') { + this._schema.db[toCollectionName(model.modelName)] + .update(model.id, { [inverseFk]: this.id }); + + } else { + let ownerId = this.id; + let inverseCollection = this._schema.db[toCollectionName(model.modelName)]; + let currentIdsForInverse = inverseCollection.find(model.id)[inverse.getForeignKey()] || []; + let newIdsForInverse = currentIdsForInverse; + + if (newIdsForInverse.indexOf(ownerId) === -1) { + newIdsForInverse.push(ownerId); + } + + inverseCollection.update(model.id, { [inverseFk]: newIdsForInverse }); + } } } @@ -541,7 +716,9 @@ class Model { * @public */ toString() { - return `model:${this.modelName}(${this.id})`; + let idLabel = this.id ? `(${this.id})` : ''; + + return `model:${this.modelName}${idLabel}`; } } diff --git a/addon/orm/polymorphic-collection.js b/addon/orm/polymorphic-collection.js new file mode 100644 index 000000000..495f09389 --- /dev/null +++ b/addon/orm/polymorphic-collection.js @@ -0,0 +1,181 @@ +import _invokeMap from 'lodash/invokeMap'; +import _isEqual from 'lodash/isEqual'; + +/** + * An array of models, returned from one of the schema query + * methods (all, find, where). Knows how to update and destroy its models. + * + * Identical to Collection except it can contain a heterogeneous array of + * models. Thus, it has no `modelName` property. This lets serializers and + * other parts of the system interact with it differently. + * + * @class PolymorphicCollection + * @constructor + * @public + */ +export default class PolymorphicCollection { + constructor(models = []) { + this.models = models; + } + + /** + * Number of models in the collection. + * + * @property length + * @type Number + * @public + */ + get length() { + return this.models.length; + } + + /** + * Updates each model in the collection (persisting immediately to the db). + * @method update + * @param key + * @param val + * @return this + * @public + */ + update(...args) { + _invokeMap(this.models, 'update', ...args); + + return this; + } + + /** + * Destroys the db record for all models in the collection. + * @method destroy + * @return this + * @public + */ + destroy() { + _invokeMap(this.models, 'destroy'); + + return this; + } + + /** + * Saves all models in the collection. + * @method save + * @return this + * @public + */ + save() { + _invokeMap(this.models, 'save'); + + return this; + } + + /** + * Reloads each model in the collection. + * @method reload + * @return this + * @public + */ + reload() { + _invokeMap(this.models, 'reload'); + + return this; + } + + /** + * Adds a model to this collection + * + * @method add + * @return this + * @public + */ + add(model) { + this.models.push(model); + + return this; + } + + /** + * Removes a model to this collection + * + * @method remove + * @return this + * @public + */ + remove(model) { + let [ match ] = this.models.filter(m => _isEqual(m.attrs, model.attrs)); + if (match) { + let i = this.models.indexOf(match); + this.models.splice(i, 1); + } + + return this; + } + + /** + * Checks if the collection includes the model + * + * @method includes + * @return boolean + * @public + */ + includes(model) { + return this.models.filter(m => _isEqual(m.attrs, model.attrs)).length > 0; + } + + /** + * @method filter + * @param f + * @return {Collection} + * @public + */ + filter(f) { + let filteredModels = this.models.filter(f); + + return new PolymorphicCollection(filteredModels); + } + + /** + * @method sort + * @param f + * @return {Collection} + * @public + */ + sort(f) { + let sortedModels = this.models.concat().sort(f); + + return new PolymorphicCollection(sortedModels); + } + + /** + * @method slice + * @param {Integer} begin + * @param {Integer} end + * @return {Collection} + * @public + */ + slice(...args) { + let slicedModels = this.models.slice(...args); + + return new PolymorphicCollection(slicedModels); + } + + /** + * @method mergeCollection + * @param collection + * @return this + * @public + */ + mergeCollection(collection) { + this.models = this.models.concat(collection.models); + + return this; + } + + /** + * Simple string representation of the collection and id. + * @method toString + * @return {String} + * @public + */ + toString() { + return `collection:${this.modelName}(${this.models.map((m) => m.id).join(',')})`; + } +} diff --git a/addon/orm/schema.js b/addon/orm/schema.js index 3c17ab2e5..75a8000ce 100644 --- a/addon/orm/schema.js +++ b/addon/orm/schema.js @@ -19,7 +19,7 @@ export default class Schema { this.db = db; this._registry = {}; - this._dependentAssociations = {}; + this._dependentAssociations = { polymorphic: [] }; this.registerModels(modelsMap); } @@ -128,15 +128,6 @@ export default class Schema { * @public */ new(type, attrs) { - - // let fk = foreignKeysHash[attr]; - // debugger; - // assert( - // !fk || this.schema.db[toCollectionName(association.modelName)].find(fk), - // `Couldn\'t find ${association.modelName} with id = ${fk}` - // ); - - // this[attr] = fk; return this._instantiateModel(dasherize(type), attrs); } @@ -223,13 +214,44 @@ export default class Schema { return this._registry[camelize(modelName)].class.prototype; } + /* + This method updates the dependentAssociations registry, which is used to + keep track of which models depend on a given association. It's used when + deleting models - their dependents need to be looked up and foreign keys + updated. + + For example, + + schema = { + post: Model.extend(), + comment: Model.extend({ + post: belongsTo() + }) + }; + + comment1.post = post1; + ... + post1.destroy() + + Deleting this post should clear out comment1's foreign key. + + Polymorphic associations can have _any_ other model as a dependent, so we + handle them separately. + */ addDependentAssociation(association, modelName) { - this._dependentAssociations[modelName] = this._dependentAssociations[modelName] || []; - this._dependentAssociations[modelName].push(association); + if (association.isPolymorphic) { + this._dependentAssociations.polymorphic.push(association); + } else { + this._dependentAssociations[modelName] = this._dependentAssociations[modelName] || []; + this._dependentAssociations[modelName].push(association); + } } dependentAssociationsFor(modelName) { - return this._dependentAssociations[modelName]; + let directDependents = this._dependentAssociations[modelName] || []; + let polymorphicAssociations = this._dependentAssociations.polymorphic || []; + + return directDependents.concat(polymorphicAssociations); } associationsFor(modelName) { diff --git a/addon/serializer.js b/addon/serializer.js index ea306b20e..e9df848aa 100644 --- a/addon/serializer.js +++ b/addon/serializer.js @@ -1,5 +1,6 @@ import Model from './orm/model'; import Collection from './orm/collection'; +import PolymorphicCollection from './orm/polymorphic-collection'; import extend from './utils/extend'; import { singularize, pluralize, camelize } from './utils/inflector'; @@ -82,14 +83,23 @@ class Serializer { } getHashForIncludedResource(resource) { - let serializer = this.serializerFor(resource.modelName); - let [hash, addToIncludes] = serializer.getHashForResource(resource); + let hashWithRoot, addToIncludes; - // Included resources always have a root, and are always pushed to an array. - let rootKey = serializer.keyForRelationship(resource.modelName); - let hashWithRoot = _isArray(hash) ? { [rootKey]: hash } : { [rootKey]: [hash] }; + if (resource instanceof PolymorphicCollection) { + hashWithRoot = {}; + addToIncludes = resource.models; - return [hashWithRoot, addToIncludes]; + } else { + let serializer = this.serializerFor(resource.modelName); + let [ hash, newModels ] = serializer.getHashForResource(resource); + + // Included resources always have a root, and are always pushed to an array. + let rootKey = serializer.keyForRelationship(resource.modelName); + hashWithRoot = _isArray(hash) ? { [rootKey]: hash } : { [rootKey]: [hash] }; + addToIncludes = newModels; + } + + return [ hashWithRoot, addToIncludes ]; } getHashForResource(resource, removeForeignKeys = false, didSerialize = {}, lookupSerializer = false) { @@ -269,18 +279,39 @@ class Serializer { newHash[formattedKey] = model[key].models.map((m) => m.id); } else if (association) { let formattedKey = this.keyForForeignKey(key); - newHash[formattedKey] = model[key].id; + newHash[formattedKey] = model[`${key}Id`]; } }); } else if (this.serializeIds === 'included') { this.getKeysForIncluded().forEach((key) => { let association = model[key]; - if (this.isCollection(association)) { - let formattedKey = this.keyForRelationshipIds(key); - newHash[formattedKey] = model[key].models.map((m) => m.id); - } else if (association) { - let formattedKey = this.keyForForeignKey(key); - newHash[formattedKey] = model[key].id; + + if (model.associationFor(key).isPolymorphic) { + if (association instanceof PolymorphicCollection) { + let formattedKey = this.keyForRelationship(key); + + newHash[formattedKey] = model[`${singularize(key)}Ids`]; + } else if (association instanceof Collection) { + let formattedKey = this.keyForRelationshipIds(key); + + newHash[formattedKey] = model[key].models.map((m) => m.id); + } else { + let formattedTypeKey = this.keyForPolymorphicForeignKeyType(key); + let formattedIdKey = this.keyForPolymorphicForeignKeyId(key); + + newHash[formattedTypeKey] = model[`${key}Id`].type; + newHash[formattedIdKey] = model[`${key}Id`].id; + } + } else { + if (this.isCollection(association)) { + let formattedKey = this.keyForRelationshipIds(key); + + newHash[formattedKey] = model[key].models.map((m) => m.id); + } else if (association) { + let formattedKey = this.keyForForeignKey(key); + + newHash[formattedKey] = model[`${key}Id`]; + } } }); } @@ -365,6 +396,14 @@ class Serializer { return `${camelize(relationshipName)}Id`; } + keyForPolymorphicForeignKeyId(relationshipName) { + return `${camelize(relationshipName)}Id`; + } + + keyForPolymorphicForeignKeyType(relationshipName) { + return `${camelize(relationshipName)}Type`; + } + /** * This method is used by the POST and PUT shorthands. These shorthands * expect a valid JSON:API document as part of the request, so that @@ -401,7 +440,7 @@ class Serializer { * @public */ isCollection(object) { - return object instanceof Collection; + return (object instanceof Collection) || (object instanceof PolymorphicCollection); } /** diff --git a/addon/serializers/active-model-serializer.js b/addon/serializers/active-model-serializer.js index 2469e127e..a96ca67a2 100644 --- a/addon/serializers/active-model-serializer.js +++ b/addon/serializers/active-model-serializer.js @@ -27,6 +27,14 @@ export default Serializer.extend({ return `${underscore(relationshipName)}_id`; }, + keyForPolymorphicForeignKeyId(relationshipName) { + return `${underscore(relationshipName)}_id`; + }, + + keyForPolymorphicForeignKeyType(relationshipName) { + return `${underscore(relationshipName)}_type`; + }, + normalize(payload) { let type = Object.keys(payload)[0]; let attrs = payload[type]; diff --git a/package.json b/package.json index 04f19d64f..77f7436f2 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "ember-cli-sri": "^2.1.0", "ember-cli-test-loader": "^1.1.0", "ember-cli-uglify": "^1.2.0", - "ember-data": "^2.10.0", + "ember-data": "2.10.x", "ember-disable-prototype-extensions": "^1.1.0", "ember-disable-proxy-controllers": "^1.0.1", "ember-export-application-global": "^1.0.5", diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/_helper.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/_helper.js new file mode 100644 index 000000000..a5ad9814b --- /dev/null +++ b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/_helper.js @@ -0,0 +1,105 @@ +import { Model, belongsTo } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +/* + A model with a belongsTo association can be in six states + with respect to its association. This helper class + returns a child (and its association) in these various states. + + The return value is an array of the form + + [ child, parent ] + + where the parent may be undefined. +*/ +export default class BelongsToHelper { + + constructor() { + this.db = new Db(); + this.loadData = this.db.loadData.bind(this.db); + + this.schema = new Schema(this.db, { + post: Model.extend({ + comment: belongsTo() + }), + comment: Model.extend({ + commentable: belongsTo({ polymorphic: true }) + }) + }); + } + + savedChildNoParent() { + let insertedComment = this.db.comments.insert({ text: 'Lorem' }); + + return [ this.schema.comments.find(insertedComment.id), undefined ]; + } + + savedChildNewParent() { + let comment = this.schema.comments.create({ text: 'Lorem' }); + let post = this.schema.posts.new({ title: 'Post 1' }); + + comment.commentable = post; + + return [ comment, post ]; + } + + savedChildSavedParent() { + this.loadData({ + posts: [ + { id: '1', title: 'Post 1', commentId: '1' } + ], + comments: [ + { id: '1', text: 'Lorem', commentableId: { id: '1', type: 'post' } } + ] + }); + + let comment = this.schema.comments.find(1); + let post = this.schema.posts.find(1); + + return [ comment, post ]; + } + + newChildNoParent() { + return [ this.schema.comments.new({ text: 'Lorem' }), undefined ]; + } + + newChildNewParent() { + let post = this.schema.posts.new({ title: 'Post 1' }); + let comment = this.schema.comments.new({ text: 'Lorem' }); + comment.commentable = post; + + return [ comment, post ]; + } + + newChildSavedParent() { + let insertedPost = this.db.posts.insert({ title: 'Post 1' }); + let comment = this.schema.comments.new({ text: 'Lorem' }); + let savedProfile = this.schema.posts.find(insertedPost.id); + + comment.commentable = savedProfile; + + return [ comment, savedProfile ]; + } + + // Just a saved unassociated parent. + savedParent() { + let insertedPost = this.db.posts.insert({ title: 'Post 1' }); + + return this.schema.posts.find(insertedPost.id); + } + + newParent() { + return this.schema.posts.new({ title: 'Post 1' }); + } + +} + +export const states = [ + 'savedChildNoParent', + 'savedChildNewParent', + 'savedChildSavedParent', + 'newChildNoParent', + 'newChildNewParent', + 'newChildSavedParent' +]; diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/accessor-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/accessor-test.js new file mode 100644 index 000000000..5ab9ef182 --- /dev/null +++ b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/accessor-test.js @@ -0,0 +1,34 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One-to-one Polymorphic | accessor', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The reference to a belongs-to association is correct, for all states +*/ +states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ comment, post ] = this.helper[state](); + + // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison + if (post) { + assert.deepEqual(comment.commentable.attrs, post.attrs, 'the model reference is correct'); + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }, 'the modelId reference is correct'); + } else { + assert.deepEqual(comment.commentable, null, 'the model reference is correct'); + assert.equal(comment.commentableId, null, 'the modelId reference is correct'); + } + + // If there's a post in this state, make sure the inverse association is correct + if (post) { + assert.deepEqual(post.comment.attrs, comment.attrs, 'the inverse model reference is correct'); + assert.equal(post.commentId, comment.id, 'the inverse modelId reference is correct'); + } + }); + +}); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-create-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-create-test.js new file mode 100644 index 000000000..4fb7e164d --- /dev/null +++ b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-create-test.js @@ -0,0 +1,27 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One-to-one Polymorphic | association #create', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can create a belongs-to association, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can create an associated parent`, function(assert) { + let [ comment ] = this.helper[state](); + + let post = comment.createCommentable('post', { title: 'Lorem' }); + + assert.ok(post.id, 'the parent was persisted'); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.deepEqual(post.comment.attrs, comment.attrs, 'the inverse was set'); + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); + assert.deepEqual(this.helper.schema.comments.find(comment.id).commentableId, { type: 'post', id: post.id }, 'the comment was persisted'); + }); + +}); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-new-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-new-test.js new file mode 100644 index 000000000..5e711d21a --- /dev/null +++ b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-new-test.js @@ -0,0 +1,33 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One-to-one Polymorphic | association #new', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can make a new unsaved belongs-to association, for all states +*/ + +states.forEach((state) => { + + test(`a ${state} can build a new associated parent`, function(assert) { + let [ comment ] = this.helper[state](); + + let post = comment.newCommentable('post', { age: 300 }); + + assert.ok(!post.id, 'the parent was not persisted'); + assert.deepEqual(comment.commentable, post); + assert.deepEqual(comment.commentableId, { type: 'post', id: undefined }); + assert.deepEqual(post.comment, comment, 'the inverse was set'); + assert.equal(post.commentId, comment.id); + + comment.save(); + + assert.ok(post.id, 'saving the child persists the parent'); + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }, 'the childs fk was updated'); + }); + +}); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-id-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-id-test.js new file mode 100644 index 000000000..99022024f --- /dev/null +++ b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-id-test.js @@ -0,0 +1,47 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One-to-one Polymorphic | association #setId', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parentId, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ comment ] = this.helper[state](); + let post = this.helper.savedParent(); + + comment.commentableId = { type: 'post', id: post.id }; + + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); + assert.deepEqual(comment.commentable.attrs, post.attrs); + + comment.save(); + post.reload(); + + assert.equal(post.commentId, comment.id, 'the inverse was set'); + assert.deepEqual(post.comment.attrs, comment.attrs); + }); + +}); + +[ + 'savedChildSavedParent', + 'newChildSavedParent' +].forEach((state) => { + + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ comment ] = this.helper[state](); + + comment.commentableId = null; + + assert.equal(comment.commentableId, null); + assert.equal(comment.commentable, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-test.js new file mode 100644 index 000000000..c9cddccbe --- /dev/null +++ b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-test.js @@ -0,0 +1,49 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One-to-one Polymorphic | association #set', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parent, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ comment ] = this.helper[state](); + let post = this.helper.savedParent(); + + comment.commentable = post; + + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.equal(post.commentId, comment.id, 'the inverse was set'); + assert.deepEqual(post.comment.attrs, comment.attrs); + }); + + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ comment ] = this.helper[state](); + let post = this.helper.newParent(); + + comment.commentable = post; + + assert.deepEqual(comment.commentableId, { type: 'post', id: undefined }); + assert.deepEqual(comment.commentable.attrs, post.attrs); + + assert.equal(post.commentId, comment.id, 'the inverse was set'); + assert.deepEqual(post.comment.attrs, comment.attrs); + }); + + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ comment ] = this.helper[state](); + + comment.commentable = null; + + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/create-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/create-test.js new file mode 100644 index 000000000..9a116c389 --- /dev/null +++ b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/create-test.js @@ -0,0 +1,65 @@ +import Helper from './_helper'; +import { Model } from 'ember-cli-mirage'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One-to-one Polymorphic | create', { + beforeEach() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + } +}); + +test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let post = schema.create('post'); + let comment = schema.create('comment', { + commentableId: { type: 'post', id: post.id } + }); + post.reload(); + + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.deepEqual(post.comment.attrs, comment.attrs); + assert.equal(schema.db.comments.length, 1); + assert.equal(schema.db.posts.length, 1); + assert.deepEqual(schema.db.comments[0], { id: '1', commentableId: { type: 'post', id: '1' } }); + assert.deepEqual(schema.db.posts[0], { id: '1', commentId: '1' }); +}); + +test('it sets up associations correctly when passing in the association itself', function(assert) { + let { schema } = this.helper; + let post = schema.create('post'); + let comment = schema.create('comment', { + commentable: post + }); + + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.deepEqual(post.comment.attrs, comment.attrs); + assert.equal(schema.db.comments.length, 1); + assert.equal(schema.db.posts.length, 1); + assert.deepEqual(schema.db.comments[0], { id: '1', commentableId: { type: 'post', id: '1' } }); + assert.deepEqual(schema.db.posts[0], { id: '1', commentId: '1' }); +}); + +test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('comment', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); + + assert.throws(function() { + schema.create('comment', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); +}); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/delete-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/delete-test.js new file mode 100644 index 000000000..5618e4697 --- /dev/null +++ b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/delete-test.js @@ -0,0 +1,24 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One-to-one Polymorphic | delete', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ comment, post ] = this.helper[state](); + + if (post) { + post.destroy(); + comment.reload(); + } + + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/instantiating-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/instantiating-test.js new file mode 100644 index 000000000..bb1a83e78 --- /dev/null +++ b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/instantiating-test.js @@ -0,0 +1,83 @@ +import Helper from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One-to-one Polymorphic | instantiating', { + beforeEach() { + this.helper = new Helper(); + this.schema = this.helper.schema; + } +}); + +test('the child accepts a saved parent id', function(assert) { + let post = this.helper.savedParent(); + let comment = this.schema.comments.new({ commentableId: { type: 'post', id: post.id } }); + + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.deepEqual(comment.attrs, { commentableId: { type: 'post', id: post.id } }); +}); + +test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.comments.new({ commentableId: { type: 'post', id: 2 } }); + }, /You're instantiating a comment that has a commentableId of post:2, but that record doesn't exist in the database/); +}); + +test('the child accepts a null parent id', function(assert) { + let comment = this.schema.comments.new({ commentableId: null }); + + assert.equal(comment.commentableId, null); + assert.equal(comment.commentable, null); + assert.deepEqual(comment.attrs, { commentableId: null }); +}); + +test('the child accepts a saved parent model', function(assert) { + let post = this.helper.savedParent(); + let comment = this.schema.comments.new({ commentable: post }); + + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.deepEqual(comment.attrs, { commentableId: null }); // this would update when saved +}); + +test('the child accepts a new parent model', function(assert) { + let post = this.schema.posts.new({ age: 300 }); + let comment = this.schema.comments.new({ commentable: post }); + + assert.deepEqual(comment.commentableId, { type: 'post', id: undefined }); + assert.deepEqual(comment.commentable, post); + assert.deepEqual(comment.attrs, { commentableId: null }); +}); + +test('the child accepts a null parent model', function(assert) { + let comment = this.schema.comments.new({ commentable: null }); + + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + assert.deepEqual(comment.attrs, { commentableId: null }); +}); + +test('the child accepts a parent model and id', function(assert) { + let post = this.helper.savedParent(); + let comment = this.schema.comments.new({ commentable: post, commentableId: { type: 'post', id: post.id } }); + + assert.deepEqual(comment.commentableId, { type: 'post', id: '1' }); + assert.deepEqual(comment.commentable, post); + assert.deepEqual(comment.attrs, { commentableId: { type: 'post', id: post.id } }); +}); + +test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let comment = this.schema.comments.new({}); + + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + assert.deepEqual(comment.attrs, { commentableId: null }); +}); + +test('the child accepts no reference to a parent id or model', function(assert) { + let comment = this.schema.comments.new(); + + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + assert.deepEqual(comment.attrs, { commentableId: null }); +}); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/_helper.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/_helper.js new file mode 100644 index 000000000..87da0c9bb --- /dev/null +++ b/tests/integration/orm/belongs-to/9-one-way-polymorphic/_helper.js @@ -0,0 +1,113 @@ +import { Model, belongsTo } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +/* + A model with a belongsTo association can be in six states + with respect to its association. This helper class + returns a child (and its association) in these various states. + + The return value is an array of the form + + [ child, parent ] + + where the parent may be undefined. +*/ +export default class BelongsToHelper { + + constructor() { + this.db = new Db(); + this.loadData = this.db.loadData.bind(this.db); + + this.schema = new Schema(this.db, { + post: Model.extend(), + comment: Model.extend({ + commentable: belongsTo('commentable', { polymorphic: true }) + }) + }); + } + + savedChildNoParent() { + let insertedComment = this.db.comments.insert({ text: 'Lorem' }); + + return [ this.schema.comments.find(insertedComment.id), undefined ]; + } + + savedChildNewParent() { + this.loadData({ + comments: [ + { id: '1', text: 'Lorem' } + ] + }); + + let comment = this.schema.comments.find(1); + let post = this.schema.posts.new({ title: 'Bob' }); + + comment.commentable = post; + + return [ comment, post ]; + } + + savedChildSavedParent() { + this.loadData({ + posts: [ + { id: '1', title: 'Lorem ipsum' } + ], + comments: [ + { id: '1', text: 'Trolling', commentableId: { id: '1', type: 'post' } } + ] + }); + + let comment = this.schema.comments.find(1); + let post = this.schema.posts.find(1); + + return [ comment, post ]; + } + + newChildNoParent() { + return [ this.schema.comments.new({ text: 'Lorem' }), undefined ]; + } + + newChildNewParent() { + let comment = this.schema.comments.new({ text: 'Lorem' }); + let newPost = this.schema.posts.new({ title: 'Bob' }); + comment.commentable = newPost; + + return [ comment, newPost ]; + } + + newChildSavedParent() { + this.loadData({ + posts: [ + { id: '1', title: 'Lorem ipsum' } + ] + }); + let comment = this.schema.comments.new({ text: 'Lorem' }); + let savedPost = this.schema.posts.find(1); + + comment.commentable = savedPost; + + return [ comment, savedPost ]; + } + + // Just a saved unassociated parent. + savedParent() { + let insertedPost = this.db.posts.insert({ title: 'Bob' }); + + return this.schema.posts.find(insertedPost.id); + } + + newParent() { + return this.schema.posts.new({ title: 'Bob' }); + } + +} + +export const states = [ + 'savedChildNoParent', + 'savedChildNewParent', + 'savedChildSavedParent', + 'newChildNoParent', + 'newChildNewParent', + 'newChildSavedParent' +]; diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/accessor-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/accessor-test.js new file mode 100644 index 000000000..db7ebabca --- /dev/null +++ b/tests/integration/orm/belongs-to/9-one-way-polymorphic/accessor-test.js @@ -0,0 +1,22 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One-way Polymorphic | accessor', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The reference to a belongs-to association is correct, for all states +*/ +states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ comment, post ] = this.helper[state](); + + assert.deepEqual(comment.commentable, post ? post : null, 'the model reference is correct'); + assert.deepEqual(comment.commentableId, post ? { id: post.id, type: 'post' } : null, 'the modelId reference is correct'); + }); + +}); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-create-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-create-test.js new file mode 100644 index 000000000..34ad5af9c --- /dev/null +++ b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-create-test.js @@ -0,0 +1,26 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One-way Polymorphic | association #create', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can create a belongs-to association, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can create an associated parent`, function(assert) { + let [ comment ] = this.helper[state](); + + let post = comment.createCommentable('post', { title: 'Lorem ipsum' }); + + assert.ok(post.id, 'the parent was persisted'); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }); + assert.ok(this.helper.db.posts.find(post.id), 'the child was persisted'); + }); + +}); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-new-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-new-test.js new file mode 100644 index 000000000..c4051a38e --- /dev/null +++ b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-new-test.js @@ -0,0 +1,31 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One-way Polymorphic | association #new', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can make a new unsaved belongs-to association, for all states +*/ + +states.forEach((state) => { + + test(`a ${state} can build a new associated parent`, function(assert) { + let [ comment ] = this.helper[state](); + + let post = comment.newCommentable('post', { title: 'Lorem ipsum' }); + + assert.ok(!post.id, 'the parent was not persisted'); + assert.deepEqual(comment.commentable, post); + assert.deepEqual(comment.commentableId, { id: undefined, type: 'post' }); + + comment.save(); + + assert.ok(post.id, 'saving the child persists the parent'); + assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }, 'the childs fk was updated'); + }); + +}); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-id-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-id-test.js new file mode 100644 index 000000000..442c8d3f1 --- /dev/null +++ b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-id-test.js @@ -0,0 +1,41 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One-way Polymorphic | association #setId', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parentId, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ comment ] = this.helper[state](); + let savedPost = this.helper.savedParent(); + + comment.commentableId = { id: savedPost.id, type: 'post' }; + + assert.deepEqual(comment.commentableId, { id: savedPost.id, type: 'post' }); + assert.deepEqual(comment.commentable.attrs, savedPost.attrs); + }); + +}); + +[ + 'savedChildSavedParent', + 'newChildSavedParent' +].forEach((state) => { + + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ comment ] = this.helper[state](); + + comment.commentableId = null; + + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-test.js new file mode 100644 index 000000000..7d3715db2 --- /dev/null +++ b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-test.js @@ -0,0 +1,44 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One-way Polymorphic | association #set', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parent, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ comment ] = this.helper[state](); + let savedPost = this.helper.savedParent(); + + comment.commentable = savedPost; + + assert.deepEqual(comment.commentableId, { id: savedPost.id, type: 'post' }); + assert.deepEqual(comment.commentable, savedPost); + }); + + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ comment ] = this.helper[state](); + let newPost = this.helper.newParent(); + + comment.commentable = newPost; + + assert.deepEqual(comment.commentableId, { id: undefined, type: 'post' }); + assert.deepEqual(comment.commentable, newPost); + }); + + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ comment ] = this.helper[state](); + + comment.commentable = null; + + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/create-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/create-test.js new file mode 100644 index 000000000..fa15979e4 --- /dev/null +++ b/tests/integration/orm/belongs-to/9-one-way-polymorphic/create-test.js @@ -0,0 +1,38 @@ +import Helper from './_helper'; +import { Model } from 'ember-cli-mirage'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One-way Polymorphic | create', { + beforeEach() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + } +}); + +test('it sets up associations correctly when passing in the foreign key', function(assert) { + let post = this.helper.schema.create('post'); + let comment = this.helper.schema.create('comment', { + commentableId: { id: post.id, type: 'post' } + }); + + assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.equal(this.helper.schema.db.posts.length, 1); + assert.deepEqual(this.helper.schema.db.posts[0], { id: '1' }); + assert.equal(this.helper.schema.db.comments.length, 1); + assert.deepEqual(this.helper.schema.db.comments[0], { id: '1', commentableId: { id: '1', type: 'post' } }); +}); + +test('it sets up associations correctly when passing in the association itself', function(assert) { + let post = this.helper.schema.create('post'); + let comment = this.helper.schema.create('comment', { + commentable: post + }); + + assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.equal(this.helper.schema.db.posts.length, 1); + assert.deepEqual(this.helper.schema.db.posts[0], { id: '1' }); + assert.equal(this.helper.schema.db.comments.length, 1); + assert.deepEqual(this.helper.schema.db.comments[0], { id: '1', commentableId: { id: '1', type: 'post' } }); +}); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/delete-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/delete-test.js new file mode 100644 index 000000000..fc470ab30 --- /dev/null +++ b/tests/integration/orm/belongs-to/9-one-way-polymorphic/delete-test.js @@ -0,0 +1,24 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One-way Polymorphic | delete', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ comment, post ] = this.helper[state](); + + if (post) { + post.destroy(); + comment.reload(); + } + + assert.equal(comment.commentableId, null); + assert.equal(comment.post, null); + }); + +}); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/instantiating-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/instantiating-test.js new file mode 100644 index 000000000..419a67625 --- /dev/null +++ b/tests/integration/orm/belongs-to/9-one-way-polymorphic/instantiating-test.js @@ -0,0 +1,84 @@ +import Helper from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | One-way Polymorphic | instantiating', { + beforeEach() { + this.helper = new Helper(); + this.schema = this.helper.schema; + } +}); + +test('the child accepts a saved parent id', function(assert) { + let post = this.helper.savedParent(); + let comment = this.schema.comments.new({ + commentableId: { id: post.id, type: 'post' } + }); + + assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }); + assert.deepEqual(comment.commentable, post); + assert.deepEqual(comment.attrs, { commentableId: { id: post.id, type: 'post' } }); +}); + +test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.comments.new({ commentableId: { type: 'post', id: 2 } }); + }, /You're instantiating a comment that has a commentableId of post:2, but that record doesn't exist in the database/); +}); + +test('the child accepts a null parent id', function(assert) { + let comment = this.schema.comments.new({ commentableId: null }); + + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + assert.deepEqual(comment.attrs, { commentableId: null }); +}); + +test('the child accepts a saved parent model', function(assert) { + let post = this.helper.savedParent(); + let comment = this.schema.comments.new({ commentable: post }); + + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); + assert.deepEqual(comment.commentable, post); +}); + +test('the child accepts a new parent model', function(assert) { + let post = this.schema.posts.new({ text: 'foo' }); + let comment = this.schema.comments.new({ commentable: post }); + + assert.deepEqual(comment.commentableId, { type: 'post', id: undefined }); + assert.deepEqual(comment.commentable, post); + assert.deepEqual(comment.attrs, { commentableId: null }); +}); + +test('the child accepts a null parent model', function(assert) { + let comment = this.schema.comments.new({ commentable: null }); + + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + assert.deepEqual(comment.attrs, { commentableId: null }); +}); + +test('the child accepts a parent model and id', function(assert) { + let post = this.helper.savedParent(); + let comment = this.schema.comments.new({ commentable: post, commentableId: { type: 'post', id: post.id } }); + + assert.deepEqual(comment.commentableId, { type: 'post', id: '1' }); + assert.deepEqual(comment.commentable, post); + assert.deepEqual(comment.attrs, { commentableId: { type: 'post', id: post.id } }); +}); + +test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let comment = this.schema.comments.new({}); + + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + assert.deepEqual(comment.attrs, { commentableId: null }); +}); + +test('the child accepts no reference to a parent id or model', function(assert) { + let comment = this.schema.comments.new(); + + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + assert.deepEqual(comment.attrs, { commentableId: null }); +}); diff --git a/tests/integration/orm/belongs-to/9-misc/misc-test.js b/tests/integration/orm/belongs-to/misc-test.js similarity index 100% rename from tests/integration/orm/belongs-to/9-misc/misc-test.js rename to tests/integration/orm/belongs-to/misc-test.js diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/_helper.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/_helper.js new file mode 100644 index 000000000..ca38b0a60 --- /dev/null +++ b/tests/integration/orm/has-many/10-many-to-many-polymorphic/_helper.js @@ -0,0 +1,143 @@ +import { Model, hasMany } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +/* + A model with a hasMany association can be in eight states + with respect to its association. This helper class + returns a parent (and its children) in these various states. + + The return value is an array of the form + + [ parent, [child1, child2...] ] + + where the children array may be empty. +*/ +export default class Helper { + + constructor() { + this.db = new Db(); + this.loadData = this.db.loadData.bind(this.db); + + this.schema = new Schema(this.db, { + post: Model.extend({ + users: hasMany() + }), + user: Model.extend({ + commentables: hasMany({ polymorphic: true }) + }) + }); + } + + savedParentNoChildren() { + let user = this.db.users.insert({ name: 'Link' }); + + return [ this.schema.users.find(user.id), [] ]; + } + + savedParentNewChildren() { + let user = this.schema.users.create({ name: 'Link' }); + let post1 = this.schema.posts.new({ title: 'Lorem' }); + let post2 = this.schema.posts.new({ title: 'Ipsum' }); + + user.commentables = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + savedParentSavedChildren() { + this.loadData({ + posts: [ + { id: '1', title: 'Lorem', userIds: [ '1' ] }, + { id: '2', title: 'Ipsum', userIds: [ '1' ] } + ], + users: [ + { id: '1', name: 'Link', commentableIds: [ { type: 'post', id: '1' }, { type: 'post', id: '2' } ] } + ] + }); + + let user = this.schema.users.find(1); + let post1 = this.schema.posts.find(1); + let post2 = this.schema.posts.find(2); + + return [ user, [ post1, post2 ] ]; + } + + savedParentMixedChildren() { + this.loadData({ + posts: [ + { id: '1', title: 'Lorem', userIds: [ ] } + ], + users: [ + { id: '1', name: 'Link', commentableIds: [ ] } + ] + }); + + let user = this.schema.users.find(1); + let post1 = this.schema.posts.find(1); + let post2 = this.schema.posts.new({ title: 'Ipsum' }); + + user.commentables = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + newParentNoChildren() { + let user = this.schema.users.new({ name: 'Link' }); + + return [ user, [] ]; + } + + newParentNewChildren() { + let user = this.schema.users.new({ name: 'Link' }); + let post1 = this.schema.posts.new({ title: 'Lorem' }); + let post2 = this.schema.posts.new({ title: 'Ipsum' }); + + user.commentables = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + newParentSavedChildren() { + let user = this.schema.users.new({ name: 'Link' }); + let post1 = this.schema.posts.create({ title: 'Lorem' }); + let post2 = this.schema.posts.create({ title: 'Ipsum' }); + + user.commentables = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + newParentMixedChildren() { + let user = this.schema.users.new({ name: 'Link' }); + let post1 = this.schema.posts.create({ title: 'Lorem' }); + let post2 = this.schema.posts.new({ title: 'Ipsum' }); + + user.commentables = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + // Unassociated child models, used for setting tests + savedChild() { + let insertedPost = this.db.posts.insert({ title: 'Lorem' }); + + return this.schema.posts.find(insertedPost.id); + } + + newChild() { + return this.schema.posts.new({ title: 'Lorem' }); + } + +} + +export const states = [ + 'savedParentNoChildren', + 'savedParentNewChildren', + 'savedParentSavedChildren', + 'savedParentMixedChildren', + 'newParentNoChildren', + 'newParentNewChildren', + 'newParentSavedChildren', + 'newParentMixedChildren' +]; diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/accessor-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/accessor-test.js new file mode 100644 index 000000000..24f5e3f5e --- /dev/null +++ b/tests/integration/orm/has-many/10-many-to-many-polymorphic/accessor-test.js @@ -0,0 +1,37 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Many-to-many Polymorphic | accessor', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The reference to a belongs-to association is correct, for all states +*/ +states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ user, posts ] = this.helper[state](); + + assert.equal(user.commentables.models.length, posts.length, 'the parent has the correct number of children'); + assert.equal(user.commentableIds.length, posts.length, 'the parent has the correct number of children ids'); + + posts.forEach((post, i) => { + assert.ok(user.commentables.includes(post), 'each child is in parent.children array'); + + if (post.isSaved()) { + assert.deepEqual( + user.commentableIds[i], + { type: 'post', id: post.id }, + 'each saved child id is in parent.childrenIds array' + ); + } + + // Check the inverse + assert.ok(post.users.includes(user)); + }); + }); + +}); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-create-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-create-test.js new file mode 100644 index 000000000..3e29543fb --- /dev/null +++ b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-create-test.js @@ -0,0 +1,33 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Many-to-many Polymorphic | association #create', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can create a has-many association, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.commentables.models.length; + + let post = user.createCommentable('post', { title: 'Lorem ipsum' }); + + assert.ok(post.id, 'the child was persisted'); + assert.equal(user.commentables.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.commentables.includes(post), 'the model was added to the association'); + assert.ok(user.commentableIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'the id was added to the fks array'); + assert.ok(user.attrs.commentableIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'fks were persisted'); + assert.ok(post.users.includes(user), 'the inverse was set'); + }); + +}); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-new-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-new-test.js new file mode 100644 index 000000000..6a135f770 --- /dev/null +++ b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-new-test.js @@ -0,0 +1,37 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Many-to-many Polymorphic | association #new', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can make a new unsaved belongs-to association, for all states +*/ + +states.forEach((state) => { + + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.commentables.models.length; + + let post = user.newCommentable('post', { title: 'Lorem ipsum' }); + + assert.ok(!post.id, 'the child was not persisted'); + assert.equal(user.commentables.models.length, initialCount + 1); + assert.equal(post.users.models.length, 1, 'the inverse was set'); + + post.save(); + + assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum', userIds: [ user.id ] }, 'the child was persisted'); + assert.equal(user.commentables.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.commentables.includes(post), 'the model was added to user.commentables'); + assert.ok(user.commentableIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'the id was added to the fks array'); + assert.ok(post.users.includes(user), 'the inverse was set'); + }); + +}); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-ids-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-ids-test.js new file mode 100644 index 000000000..14843718d --- /dev/null +++ b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-ids-test.js @@ -0,0 +1,52 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Many-to-many Polymorphic | association #setIds', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parentId, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let savedPost = this.helper.savedChild(); + + user.commentableIds = [ { type: 'post', id: savedPost.id } ]; + + assert.ok(user.commentables.includes(savedPost)); + assert.ok(user.commentableIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); + + user.save(); + savedPost.reload(); + + assert.ok(savedPost.users.includes(user), 'the inverse was set'); + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.notOk(post.users.includes(user), 'old inverses were cleared'); + } + }); + }); + + test(`a ${state} can clear its association via a null ids`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + + user.commentableIds = null; + + assert.deepEqual(user.commentables.models, []); + assert.deepEqual(user.commentableIds, []); + + user.save(); + + originalPosts.forEach(post => { + post.reload(); + assert.notOk(post.users.includes(user), 'old inverses were cleared'); + }); + }); + +}); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-test.js new file mode 100644 index 000000000..55fab3651 --- /dev/null +++ b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-test.js @@ -0,0 +1,83 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Many-to-many Polymorphic | association #set', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parent, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let savedPost = this.helper.savedChild(); + + user.commentables = [ savedPost ]; + + assert.ok(user.commentables.models.includes(savedPost)); + assert.ok(user.commentableIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); + assert.ok(savedPost.users.includes(user), 'the inverse was set'); + + user.save(); + + originalPosts.forEach(post => { + post.reload(); + assert.notOk(post.users.includes(user), 'old inverses were cleared'); + }); + }); + + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let newPost = this.helper.newChild(); + + user.commentables = [ newPost ]; + + assert.deepEqual(user.commentableIds, [ { type: 'post', id: undefined } ]); + assert.deepEqual(user.commentables.models[0], newPost); + assert.ok(newPost.users.includes(user), 'the inverse was set'); + + user.save(); + + originalPosts.forEach(post => { + post.reload(); + assert.notOk(post.users.includes(user), 'old inverses were cleared'); + }); + }); + + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + + user.commentables = [ ]; + + assert.deepEqual(user.commentableIds, [ ]); + assert.equal(user.commentables.models.length, 0); + + user.save(); + + originalPosts.forEach(post => { + post.reload(); + assert.notOk(post.users.includes(user), 'old inverses were cleared'); + }); + }); + + test(`a ${state} can clear its association via null`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + + user.commentables = null; + + assert.deepEqual(user.commentableIds, [ ]); + assert.equal(user.commentables.models.length, 0); + + user.save(); + + originalPosts.forEach(post => { + post.reload(); + assert.notOk(post.users.includes(user), 'old inverses were cleared'); + }); + }); + +}); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/create-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/create-test.js new file mode 100644 index 000000000..809886525 --- /dev/null +++ b/tests/integration/orm/has-many/10-many-to-many-polymorphic/create-test.js @@ -0,0 +1,57 @@ +import Helper from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Many-to-many Polymorphic | create', { + beforeEach() { + this.helper = new Helper(); + } +}); + +test('it sets up associations correctly when passing in the foreign key', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + commentableIds: [ { type: 'post', id: post.id } ] + }); + + post.reload(); + + assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.attrs.commentableIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); + assert.deepEqual(user.commentables.models[0].attrs, post.attrs); + assert.equal(this.helper.db.posts.length, 1); + assert.equal(this.helper.db.users.length, 1); + assert.deepEqual(this.helper.db.posts[0], { id: '1', userIds: [ '1' ] }); + assert.deepEqual(this.helper.db.users[0], { id: '1', commentableIds: [ { type: 'post', id: '1' } ] }); +}); + +test('it sets up associations correctly when passing in an array of models', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + commentables: [ post ] + }); + + post.reload(); + + assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(post.userIds, [ '1' ], 'the inverse was set'); + assert.deepEqual(user.attrs.commentableIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); + assert.deepEqual(post.attrs.userIds, [ user.id ], 'the inverse was set'); + assert.equal(this.helper.db.users.length, 1); + assert.equal(this.helper.db.posts.length, 1); +}); + +test('it sets up associations correctly when passing in a collection', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + commentables: this.helper.schema.posts.all() + }); + + post.reload(); + + assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(post.userIds, [ user.id ], 'the inverse was set'); + assert.deepEqual(user.attrs.commentableIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(post.attrs.userIds, [ user.id ], 'the inverse was set'); + assert.equal(this.helper.db.users.length, 1); + assert.equal(this.helper.db.posts.length, 1); +}); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/delete-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/delete-test.js new file mode 100644 index 000000000..9d0688807 --- /dev/null +++ b/tests/integration/orm/has-many/10-many-to-many-polymorphic/delete-test.js @@ -0,0 +1,24 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Many-to-many Polymorphic | delete', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ user, posts ] = this.helper[state](); + + if (posts && posts.length) { + posts.forEach(p => p.destroy()); + user.reload(); + } + + assert.equal(user.commentables.length, 0); + assert.equal(user.commentableIds.length, 0); + }); + +}); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/instantiating-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/instantiating-test.js new file mode 100644 index 000000000..28c3695c0 --- /dev/null +++ b/tests/integration/orm/has-many/10-many-to-many-polymorphic/instantiating-test.js @@ -0,0 +1,81 @@ +import Helper from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | Many-to-many Polymorphic | instantiating', { + beforeEach() { + this.helper = new Helper(); + this.schema = this.helper.schema; + } +}); + +test('the parent accepts a saved child id', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ + commentableIds: [ { type: 'post', id: post.id } ] + }); + + assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); + assert.ok(user.commentables.includes(post)); +}); + +test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ commentableIds: [ { type: 'post', id: 2 } ] }); + }, /You're instantiating a user that has a commentableIds of post:2, but some of those records don't exist in the database/); +}); + +test('the parent accepts null children foreign key', function(assert) { + let user = this.schema.users.new({ commentableIds: null }); + + assert.equal(user.commentables.models.length, 0); + assert.deepEqual(user.commentableIds, []); + assert.deepEqual(user.attrs, { commentableIds: null }); +}); + +test('the parent accepts saved children', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ commentables: [ post ] }); + + assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); + assert.ok(user.commentables.includes(post)); +}); + +test('the parent accepts new children', function(assert) { + let post = this.schema.posts.new({ title: 'Lorem' }); + let user = this.schema.users.new({ commentables: [ post ] }); + + assert.deepEqual(user.commentableIds, [ { type: 'post', id: undefined } ]); + assert.ok(user.commentables.includes(post)); +}); + +test('the parent accepts null children', function(assert) { + let user = this.schema.users.new({ commentables: null }); + + assert.equal(user.commentables.models.length, 0); + assert.deepEqual(user.commentableIds, []); + assert.deepEqual(user.attrs, { commentableIds: null }); +}); + +test('the parent accepts children and child ids', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ commentables: [ post ], commentableIds: [ { type: 'post', id: post.id } ] }); + + assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); + assert.ok(user.commentables.includes(post)); +}); + +test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let user = this.schema.users.new({}); + + assert.deepEqual(user.commentableIds, []); + assert.deepEqual(user.commentables.models, []); + assert.deepEqual(user.attrs, { commentableIds: null }); +}); + +test('the parent accepts no reference to children or child ids', function(assert) { + let user = this.schema.users.new(); + + assert.deepEqual(user.commentableIds, []); + assert.deepEqual(user.commentables.models, []); + assert.deepEqual(user.attrs, { commentableIds: null }); +}); diff --git a/tests/integration/orm/has-many/3-reflexive/association-new-test.js b/tests/integration/orm/has-many/3-reflexive/association-new-test.js index 64d4e2480..2f2e7a71f 100644 --- a/tests/integration/orm/has-many/3-reflexive/association-new-test.js +++ b/tests/integration/orm/has-many/3-reflexive/association-new-test.js @@ -24,6 +24,7 @@ states.forEach((state) => { assert.equal(blueTag.tags.models.length, 1, 'the inverse was set'); blueTag.save(); + tag.reload(); assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', tagIds: [ tag.id ] }, 'the child was persisted'); assert.equal(tag.tags.models.length, initialCount + 1, 'the collection size was increased'); diff --git a/tests/integration/orm/has-many/3-reflexive/create-test.js b/tests/integration/orm/has-many/3-reflexive/create-test.js index 0f80ef5b0..4e534b4e4 100644 --- a/tests/integration/orm/has-many/3-reflexive/create-test.js +++ b/tests/integration/orm/has-many/3-reflexive/create-test.js @@ -22,8 +22,8 @@ test('it sets up associations correctly when passing in the foreign key', functi assert.deepEqual(tagB.tagIds, [ tagA.id ], 'the inverse was set'); assert.deepEqual(tagA.attrs.tagIds, [ tagB.id ], 'the ids were persisted'); assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ], 'the inverse ids were persisted'); - assert.deepEqual(tagA.tags.models[0].attrs, tagB.attrs); - assert.deepEqual(tagB.tags.models[0].attrs, tagA.attrs, 'the inverse was set'); + assert.ok(tagA.tags.includes(tagB)); + assert.ok(tagB.tags.includes(tagA), 'the inverse was set'); assert.equal(this.helper.db.tags.length, 2); assert.deepEqual(this.helper.db.tags[0], { id: '1', tagIds: [ '2' ] }); assert.deepEqual(this.helper.db.tags[1], { id: '2', tagIds: [ '1' ] }); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/_helper.js b/tests/integration/orm/has-many/9-one-way-polymorphic/_helper.js new file mode 100644 index 000000000..3330b7e7b --- /dev/null +++ b/tests/integration/orm/has-many/9-one-way-polymorphic/_helper.js @@ -0,0 +1,124 @@ +import { Model, hasMany } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +/* + A model with a hasMany association can be in eight states + with respect to its association. This helper class + returns a parent (and its children) in these various states. + + The return value is an array of the form + + [ parent, [child1, child2...] ] + + where the children array may be empty. +*/ +export default class Helper { + + constructor() { + this.db = new Db(); + + this.schema = new Schema(this.db, { + user: Model.extend({ + things: hasMany('thing', { polymorphic: true }) + }), + post: Model + }); + } + + savedParentNoChildren() { + let user = this.db.users.insert({ name: 'Link' }); + + return [ this.schema.users.find(user.id), [] ]; + } + + savedParentNewChildren() { + let user = this.schema.users.create({ name: 'Link' }); + let post1 = this.schema.posts.new({ title: 'Lorem' }); + let post2 = this.schema.posts.new({ title: 'Ipsum' }); + + user.things = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + savedParentSavedChildren() { + let user = this.schema.users.create({ name: 'Link' }); + let post1 = this.schema.posts.create({ title: 'Lorem' }); + let post2 = this.schema.posts.create({ title: 'Ipsum' }); + + user.things = [ post1, post2 ]; + user.save(); + + return [ user, [ post1, post2 ] ]; + } + + savedParentMixedChildren() { + let user = this.schema.users.create({ name: 'Link' }); + let post1 = this.schema.posts.create({ title: 'Lorem' }); + let post2 = this.schema.posts.new({ title: 'Ipsum' }); + + user.things = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + newParentNoChildren() { + let user = this.schema.users.new({ name: 'Link' }); + + return [ user, [] ]; + } + + newParentNewChildren() { + let user = this.schema.users.new({ name: 'Link' }); + let post1 = this.schema.posts.new({ title: 'Lorem' }); + let post2 = this.schema.posts.new({ title: 'Ipsum' }); + + user.things = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + newParentSavedChildren() { + let user = this.schema.users.new({ name: 'Link' }); + let post1 = this.schema.posts.create({ title: 'Lorem' }); + let post2 = this.schema.posts.create({ title: 'Ipsum' }); + + user.things = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + newParentMixedChildren() { + let user = this.schema.users.new({ name: 'Link' }); + let post1 = this.schema.posts.create({ title: 'Lorem' }); + let post2 = this.schema.posts.new({ title: 'Ipsum' }); + + user.things = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + // Unassociated child models, used for setting tests + savedChild() { + let insertedPost = this.db.posts.insert({ title: 'Lorem' }); + + return this.schema.posts.find(insertedPost.id); + } + + newChild() { + return this.schema.posts.new({ title: 'Lorem' }); + } + +} + +export const states = [ + 'savedParentNoChildren', + 'savedParentNewChildren', + 'savedParentSavedChildren', + 'savedParentMixedChildren', + 'newParentNoChildren', + 'newParentNewChildren', + 'newParentSavedChildren', + 'newParentMixedChildren' +]; diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/accessor-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/accessor-test.js new file mode 100644 index 000000000..235568df7 --- /dev/null +++ b/tests/integration/orm/has-many/9-one-way-polymorphic/accessor-test.js @@ -0,0 +1,30 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | One-way Polymorphic | accessor', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The reference to a belongs-to association is correct, for all states +*/ +states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ user, posts ] = this.helper[state](); + + assert.equal(user.things.models.length, posts.length, 'the parent has the correct number of children'); + assert.equal(user.thingIds.length, posts.length, 'the parent has the correct number of children ids'); + + posts.forEach((post, i) => { + assert.ok(user.things.includes(post), 'each child is in parent.children array'); + + if (post.isSaved()) { + assert.deepEqual(user.thingIds[i], { type: 'post', id: post.id }, 'each saved child id is in parent.childrenIds array'); + } + }); + }); + +}); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/association-create-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/association-create-test.js new file mode 100644 index 000000000..b2852296e --- /dev/null +++ b/tests/integration/orm/has-many/9-one-way-polymorphic/association-create-test.js @@ -0,0 +1,32 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | One-way Polymorphic | association #create', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can create a has-many association, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.things.models.length; + + let post = user.createThing('post', { title: 'Lorem ipsum' }); + + assert.ok(post.id, 'the child was persisted'); + assert.equal(user.things.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.things.includes(post), 'the model was added to user.posts'); + assert.ok(user.thingIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'the id was added to the fks array'); + assert.ok(user.attrs.thingIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'fks were persisted'); + }); + +}); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/association-new-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/association-new-test.js new file mode 100644 index 000000000..a9b3271c5 --- /dev/null +++ b/tests/integration/orm/has-many/9-one-way-polymorphic/association-new-test.js @@ -0,0 +1,35 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | One-way Polymorphic | association #new', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can make a new unsaved belongs-to association, for all states +*/ + +states.forEach((state) => { + + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.things.models.length; + + let post = user.newThing('post', { title: 'Lorem ipsum' }); + + assert.ok(!post.id, 'the child was not persisted'); + assert.equal(user.things.models.length, initialCount + 1); + + post.save(); + + assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum' }, 'the child was persisted'); + assert.equal(user.things.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.things.includes(post), 'the model was added to user.things'); + assert.ok(user.thingIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'the id was added to the fks array'); + }); + +}); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-ids-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-ids-test.js new file mode 100644 index 000000000..84ebf1cb4 --- /dev/null +++ b/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-ids-test.js @@ -0,0 +1,34 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | One-way Polymorphic | association #setIds', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parentId, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user ] = this.helper[state](); + let savedPost = this.helper.savedChild(); + + user.thingIds = [ { type: 'post', id: savedPost.id } ]; + + assert.ok(user.things.includes(savedPost)); + assert.ok(user.thingIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); + }); + + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ user ] = this.helper[state](); + + user.thingIds = null; + + assert.deepEqual(user.things.models, []); + assert.deepEqual(user.thingIds, []); + }); + +}); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-test.js new file mode 100644 index 000000000..88cc589b9 --- /dev/null +++ b/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-test.js @@ -0,0 +1,53 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | One-way Polymorphic | association #set', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parent, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ user ] = this.helper[state](); + let savedPost = this.helper.savedChild(); + + user.things = [ savedPost ]; + + assert.ok(user.things.models.includes(savedPost)); + assert.ok(user.thingIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); + }); + + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user ] = this.helper[state](); + let newPost = this.helper.newChild(); + + user.things = [ newPost ]; + + assert.deepEqual(user.thingIds, [ { type: 'post', id: undefined } ]); + assert.deepEqual(user.things.models[0], newPost); + }); + + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user ] = this.helper[state](); + + user.things = [ ]; + + assert.deepEqual(user.thingIds, [ ]); + assert.equal(user.things.models.length, 0); + }); + + test(`a ${state} can clear its association via null`, function(assert) { + let [ user ] = this.helper[state](); + + user.things = null; + + assert.deepEqual(user.thingIds, [ ]); + assert.equal(user.things.models.length, 0); + }); + +}); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/create-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/create-test.js new file mode 100644 index 000000000..e3d5f3a5b --- /dev/null +++ b/tests/integration/orm/has-many/9-one-way-polymorphic/create-test.js @@ -0,0 +1,87 @@ +import Helper from './_helper'; +import { Model } from 'ember-cli-mirage'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | One-way Polymorphic | create', { + beforeEach() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + } +}); + +test('it sets up associations correctly when passing in the foreign key', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + thingIds: [ { type: 'post', id: post.id } ] + }); + + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); + assert.deepEqual(user.things.models[0].attrs, post.attrs); + assert.equal(this.helper.db.posts.length, 1); + assert.deepEqual(this.helper.db.posts[0], { id: '1' }); + assert.equal(this.helper.db.users.length, 1); + assert.deepEqual(this.helper.db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); +}); + +test('it sets up associations correctly when passing in an array of models', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + things: [ post ] + }); + + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); + assert.ok(user.things.includes(post)); + assert.equal(this.helper.db.posts.length, 1); + assert.deepEqual(this.helper.db.posts[0], { id: '1' }); + assert.equal(this.helper.db.users.length, 1); + assert.deepEqual(this.helper.db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); +}); + +test('it sets up associations correctly when passing in a collection', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + things: this.helper.schema.posts.all() + }); + + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); + assert.ok(user.things.includes(post)); + assert.equal(this.helper.db.posts.length, 1); + assert.deepEqual(this.helper.db.posts[0], { id: '1' }); + assert.equal(this.helper.db.users.length, 1); + assert.deepEqual(this.helper.db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); +}); + +test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('user', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('user', { + foos: [ schema.create('foo') ] + }); + }, /you haven't defined that key as an association on your model/); +}); + +test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); + + assert.throws(function() { + schema.create('user', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); +}); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/delete-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/delete-test.js new file mode 100644 index 000000000..165b0b03a --- /dev/null +++ b/tests/integration/orm/has-many/9-one-way-polymorphic/delete-test.js @@ -0,0 +1,24 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | One-way Polymorphic | delete', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ user, posts ] = this.helper[state](); + + if (posts && posts.length) { + posts.forEach(p => p.destroy()); + user.reload(); + } + + assert.equal(user.things.length, 0); + assert.equal(user.thingIds.length, 0); + }); + +}); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/instantiating-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/instantiating-test.js new file mode 100644 index 000000000..e07b6a695 --- /dev/null +++ b/tests/integration/orm/has-many/9-one-way-polymorphic/instantiating-test.js @@ -0,0 +1,81 @@ +import Helper from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Has Many | One-way Polymorphic | instantiating', { + beforeEach() { + this.helper = new Helper(); + this.schema = this.helper.schema; + } +}); + +test('the parent accepts a saved child id', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ + thingIds: [ { type: 'post', id: post.id } ] + }); + + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.ok(user.things.includes(post)); +}); + +test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ thingIds: [ { type: 'post', id: 2 } ] }); + }, /You're instantiating a user that has a thingIds of post:2, but some of those records don't exist in the database/); +}); + +test('the parent accepts null children foreign key', function(assert) { + let user = this.schema.users.new({ thingIds: null }); + + assert.equal(user.things.models.length, 0); + assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.attrs, { thingIds: null }); +}); + +test('the parent accepts saved children', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ things: [ post ] }); + + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.ok(user.things.includes(post)); +}); + +test('the parent accepts new children', function(assert) { + let post = this.schema.posts.new({ title: 'Lorem' }); + let user = this.schema.users.new({ things: [ post ] }); + + assert.deepEqual(user.thingIds, [ { type: 'post', id: undefined } ]); + assert.ok(user.things.includes(post)); +}); + +test('the parent accepts null children', function(assert) { + let user = this.schema.users.new({ things: null }); + + assert.equal(user.things.models.length, 0); + assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.attrs, { thingIds: null }); +}); + +test('the parent accepts children and child ids', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ things: [ post ], thingIds: [ { type: 'post', id: post.id } ] }); + + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.ok(user.things.includes(post)); +}); + +test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let user = this.schema.users.new({}); + + assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.things.models, []); + assert.deepEqual(user.attrs, { thingIds: null }); +}); + +test('the parent accepts no reference to children or child ids', function(assert) { + let user = this.schema.users.new(); + + assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.things.models, []); + assert.deepEqual(user.attrs, { thingIds: null }); +}); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/_helper.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/_helper.js new file mode 100644 index 000000000..4552955c9 --- /dev/null +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/_helper.js @@ -0,0 +1,138 @@ +import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +/* + A model with a hasMany association can be in eight states + with respect to its association. This helper class + returns a parent (and its children) in these various states. + + The return value is an array of the form + + [ parent, [child1, child2...] ] + + where the children array may be empty. +*/ +export default class Helper { + + constructor() { + this.db = new Db(); + + this.schema = new Schema(this.db, { + user: Model.extend({ + things: hasMany({ polymorphic: true }) + }), + post: Model.extend({ + user: belongsTo() + }) + }); + } + + savedParentNoChildren() { + let user = this.db.users.insert({ name: 'Link' }); + + return [ this.schema.users.find(user.id), [] ]; + } + + savedParentNewChildren() { + let user = this.schema.users.create({ name: 'Link' }); + let post1 = this.schema.posts.new({ title: 'Lorem' }); + let post2 = this.schema.posts.new({ title: 'Ipsum' }); + + user.things = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + savedParentSavedChildren() { + let { schema } = this; + schema.db.loadData({ + users: [ + { id: '1', name: 'Link', thingIds: [ { type: 'post', id: '1' }, { type: 'post', id: '2' } ] } + ], + posts: [ + { id: '1', title: 'Lorem', userId: '1' }, + { id: '2', title: 'Ipsum', userId: '1' } + ] + }); + + return [ schema.users.find(1), [ schema.posts.find(1), schema.posts.find(2) ] ]; + } + + savedParentMixedChildren() { + this.schema.db.loadData({ + users: [ + { id: '1', name: 'Link', thingIds: [ { type: 'post', id: '1' } ] } + ], + posts: [ + { id: '1', title: 'Lorem', userId: '1' } + ] + }); + let user = this.schema.users.find(1); + let post1 = this.schema.posts.find(1); + let post2 = this.schema.posts.new({ name: 'Ipsum' }); + + user.things = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + newParentNoChildren() { + let user = this.schema.users.new({ name: 'Link' }); + + return [ user, [] ]; + } + + newParentNewChildren() { + let user = this.schema.users.new({ name: 'Link' }); + let post1 = this.schema.posts.new({ title: 'Lorem' }); + let post2 = this.schema.posts.new({ title: 'Ipsum' }); + + user.things = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + newParentSavedChildren() { + let user = this.schema.users.new({ name: 'Link' }); + let post1 = this.schema.posts.create({ title: 'Lorem' }); + let post2 = this.schema.posts.create({ title: 'Ipsum' }); + + user.things = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + newParentMixedChildren() { + let user = this.schema.users.new({ name: 'Link' }); + let post1 = this.schema.posts.create({ title: 'Lorem' }); + let post2 = this.schema.posts.new({ title: 'Ipsum' }); + + user.things = [ post1, post2 ]; + + return [ user, [ post1, post2 ] ]; + } + + // Unassociated child models, used for setting tests + savedChild() { + let insertedPost = this.db.posts.insert({ title: 'Lorem' }); + + return this.schema.posts.find(insertedPost.id); + } + + newChild() { + return this.schema.posts.new({ title: 'Lorem' }); + } + +} + +export const states = [ + 'savedParentNoChildren', + 'savedParentNewChildren', + 'savedParentSavedChildren', + 'savedParentMixedChildren', + 'newParentNoChildren', + 'newParentNewChildren', + 'newParentSavedChildren', + 'newParentMixedChildren' +]; diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/accessor-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/accessor-test.js new file mode 100644 index 000000000..75a70ea6c --- /dev/null +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/accessor-test.js @@ -0,0 +1,36 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Mixed | One To Many Polymorphic | accessor', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The reference to a belongs-to association is correct, for all states +*/ +states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ user, posts ] = this.helper[state](); + + assert.equal(user.things.models.length, posts.length, 'the parent has the correct number of children'); + assert.equal(user.thingIds.length, posts.length, 'the parent has the correct number of children ids'); + + posts.forEach((post, i) => { + assert.deepEqual(user.things.models[i], posts[i], 'each child is in parent.children array'); + + if (post.isSaved()) { + assert.ok(user.thingIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'each saved child id is in parent.childrenIds array'); + } + + // Check the inverse + assert.deepEqual(post.user.attrs, user.attrs); + assert.deepEqual(post.userId, user.id); + }); + }); + +}); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-create-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-create-test.js new file mode 100644 index 000000000..d470f0195 --- /dev/null +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-create-test.js @@ -0,0 +1,36 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Mixed | One To Many Polymorphic | association #create', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can create a has-many association, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.things.models.length; + + let post = user.createThing('post', { title: 'Lorem ipsum' }); + + assert.ok(post.id, 'the child was persisted'); + assert.equal(user.things.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.things.includes(post), 'the model was added to user.posts'); + assert.ok(user.thingIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'the id was added to the fks array'); + assert.ok(user.attrs.thingIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'fks were persisted'); + + // Check the inverse + assert.deepEqual(post.user.attrs, user.attrs); + assert.deepEqual(post.userId, user.id); + }); + +}); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-new-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-new-test.js new file mode 100644 index 000000000..942bc5014 --- /dev/null +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-new-test.js @@ -0,0 +1,35 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Mixed | One To Many Polymorphic | association #new', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can make a new unsaved belongs-to association, for all states +*/ + +states.forEach((state) => { + + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.things.models.length; + + let post = user.newThing('post', { title: 'Lorem ipsum' }); + + assert.ok(!post.id, 'the child was not persisted'); + assert.equal(user.things.models.length, initialCount + 1); + + post.save(); + + assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum', userId: user.id }, 'the child was persisted'); + assert.equal(user.things.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.things.includes(post), 'the model was added to user.things'); + assert.ok(user.thingIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'the id was added to the fks array'); + }); + +}); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-ids-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-ids-test.js new file mode 100644 index 000000000..ad5a51588 --- /dev/null +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-ids-test.js @@ -0,0 +1,59 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Mixed | One To Many Polymorphic | association #setIds', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parentId, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let savedPost = this.helper.savedChild(); + + user.thingIds = [ { type: 'post', id: savedPost.id } ]; + + assert.ok(user.things.includes(savedPost)); + assert.deepEqual(user.thingIds, [ { type: 'post', id: savedPost.id } ]); + + user.save(); + savedPost.reload(); + + // Check the inverse + assert.deepEqual(savedPost.user.attrs, user.attrs); + assert.equal(savedPost.userId, user.id); + + // Check old associates + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } + }); + }); + + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + + user.thingIds = null; + + assert.deepEqual(user.things.models, []); + assert.deepEqual(user.thingIds, []); + + user.save(); + + // Check old associates + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } + }); + }); + +}); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-test.js new file mode 100644 index 000000000..490f481d4 --- /dev/null +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-test.js @@ -0,0 +1,89 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Mixed | One To Many Polymorphic | association #set', { + beforeEach() { + this.helper = new Helper(); + } +}); + +/* + The model can update its association via parent, for all states +*/ +states.forEach((state) => { + + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let savedPost = this.helper.savedChild(); + + user.things = [ savedPost ]; + + assert.ok(user.things.includes(savedPost)); + assert.ok(user.thingIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); + + user.save(); + + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } + }); + }); + + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let newPost = this.helper.newChild(); + + user.things = [ newPost ]; + + assert.deepEqual(user.thingIds, [ { type: 'post', id: undefined } ]); + assert.ok(user.things.includes(newPost)); + + user.save(); + + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } + }); + }); + + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + + user.things = [ ]; + + assert.deepEqual(user.thingIds, [ ]); + assert.equal(user.things.models.length, 0); + + user.save(); + + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } + }); + }); + + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + + user.things = null; + + assert.deepEqual(user.thingIds, [ ]); + assert.equal(user.things.models.length, 0); + + user.save(); + + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } + }); + }); + +}); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/create-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/create-test.js new file mode 100644 index 000000000..5dd60580e --- /dev/null +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/create-test.js @@ -0,0 +1,65 @@ +import Helper from './_helper'; +import { Model } from 'ember-cli-mirage'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Mixed | One To Many Polymorphic | create', { + beforeEach() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + } +}); + +test('it sets up associations correctly when passing in the foreign key', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + thingIds: [ { type: 'post', id: post.id } ] + }); + post.reload(); + + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); + assert.ok(user.things.includes(post)); + assert.deepEqual(post.user.attrs, user.attrs); + + let { db } = this.helper; + assert.equal(db.posts.length, 1); + assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); + assert.equal(db.users.length, 1); + assert.deepEqual(db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); +}); + +test('it sets up associations correctly when passing in an array of models', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + things: [ post ] + }); + + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); + assert.ok(user.things.includes(post)); + assert.deepEqual(post.user.attrs, user.attrs); + + let { db } = this.helper; + assert.equal(db.posts.length, 1); + assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); + assert.equal(db.users.length, 1); + assert.deepEqual(db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); +}); + +test('it sets up associations correctly when passing in a collection', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + things: this.helper.schema.posts.all() + }); + post.reload(); + + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); + assert.ok(user.things.includes(post)); + + let { db } = this.helper; + assert.equal(db.posts.length, 1); + assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); + assert.equal(db.users.length, 1); + assert.deepEqual(db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); +}); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/delete-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/delete-test.js new file mode 100644 index 000000000..278ef454c --- /dev/null +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/delete-test.js @@ -0,0 +1,24 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Mixed | One To Many Polymorphic | delete', { + beforeEach() { + this.helper = new Helper(); + } +}); + +states.forEach((state) => { + + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ user, posts ] = this.helper[state](); + + if (posts && posts.length) { + posts.forEach(p => p.destroy()); + user.reload(); + } + + assert.equal(user.things.length, 0); + assert.equal(user.thingIds.length, 0); + }); + +}); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/instantiating-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/instantiating-test.js new file mode 100644 index 000000000..48b2c0584 --- /dev/null +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/instantiating-test.js @@ -0,0 +1,81 @@ +import Helper from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Mixed | One To Many Polymorphic | instantiating', { + beforeEach() { + this.helper = new Helper(); + this.schema = this.helper.schema; + } +}); + +test('the parent accepts a saved child id', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ + thingIds: [ { type: 'post', id: post.id } ] + }); + + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.things.models[0], post); +}); + +test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ thingIds: [ { type: 'post', id: 2 } ] }); + }, /You're instantiating a user that has a thingIds of post:2, but some of those records don't exist in the database/); +}); + +test('the parent accepts null children foreign key', function(assert) { + let user = this.schema.users.new({ thingIds: null }); + + assert.equal(user.things.models.length, 0); + assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.attrs, { thingIds: null }); +}); + +test('the parent accepts saved children', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ things: [ post ] }); + + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.things.models[0], post); +}); + +test('the parent accepts new children', function(assert) { + let post = this.schema.posts.new({ title: 'Lorem' }); + let user = this.schema.users.new({ things: [ post ] }); + + assert.deepEqual(user.thingIds, [ { type: 'post', id: undefined } ]); + assert.deepEqual(user.things.models[0], post); +}); + +test('the parent accepts null children', function(assert) { + let user = this.schema.users.new({ things: null }); + + assert.equal(user.things.models.length, 0); + assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.attrs, { thingIds: null }); +}); + +test('the parent accepts children and child ids', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ things: [ post ], thingIds: [ { type: 'post', id: post.id } ] }); + + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.things.models[0], post); +}); + +test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let user = this.schema.users.new({}); + + assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.things.models, []); + assert.deepEqual(user.attrs, { thingIds: null }); +}); + +test('the parent accepts no reference to children or child ids', function(assert) { + let user = this.schema.users.new(); + + assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.things.models, []); + assert.deepEqual(user.attrs, { thingIds: null }); +}); diff --git a/tests/integration/orm/schema-verification/belongs-to-test.js b/tests/integration/orm/schema-verification/belongs-to-test.js index a2973a5ad..b36db410e 100644 --- a/tests/integration/orm/schema-verification/belongs-to-test.js +++ b/tests/integration/orm/schema-verification/belongs-to-test.js @@ -6,114 +6,164 @@ import { module, test } from 'qunit'; module('Integration | ORM | Schema Verification | Belongs To'); test('a one-way belongsTo association is correct', function(assert) { - let schema = new Schema(new Db(), { + let schema = new Schema(new Db({ + authors: [ + { id: 1, name: 'Frodo' } + ], + posts: [ + { id: 1, title: 'Lorem ipsum' } + ] + }), { author: Model.extend(), post: Model.extend({ author: belongsTo() }) }); - let association = schema.modelClassFor('post').associationFor('author'); + let post = schema.posts.find(1); + let association = post.associationFor('author'); + let frodo = schema.authors.find(1); assert.equal(association.key, 'author'); assert.equal(association.modelName, 'author'); assert.equal(association.ownerModelName, 'post'); - assert.ok(association.inverse() === null, 'there is no inverse'); + assert.ok(frodo.inverseFor(association) === null, 'there is no inverse'); }); test('a one-way named belongsTo association is correct', function(assert) { - let schema = new Schema(new Db(), { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ], + posts: [ + { id: 1, title: 'Lorem ipsum' } + ] + }), { user: Model.extend(), post: Model.extend({ author: belongsTo('user') }) }); - let association = schema.modelClassFor('post').associationFor('author'); + let post = schema.posts.find(1); + let association = post.associationFor('author'); + let frodo = schema.users.find(1); assert.equal(association.key, 'author'); assert.equal(association.modelName, 'user'); assert.equal(association.ownerModelName, 'post'); - assert.ok(association.inverse() === null, 'there is no inverse'); + assert.ok(frodo.inverseFor(association) === null, 'there is no inverse'); }); test('a reflexive belongsTo association is correct and has an implicit inverse', function(assert) { - let schema = new Schema(new Db(), { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ] + }), { user: Model.extend({ user: belongsTo() }) }); - let association = schema.modelClassFor('user').associationFor('user'); + let frodo = schema.users.find(1); + let association = frodo.associationFor('user'); assert.equal(association.key, 'user'); assert.equal(association.modelName, 'user'); assert.equal(association.ownerModelName, 'user'); - assert.ok(association.inverse() === association, 'the implicit inverse was found'); + assert.ok(frodo.inverseFor(association) === association, 'the implicit inverse was found'); }); test('a named reflexive belongsTo association with an implicit inverse is correct', function(assert) { - let schema = new Schema(new Db(), { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ] + }), { user: Model.extend({ bestFriend: belongsTo('user') }) }); - let association = schema.modelClassFor('user').associationFor('bestFriend'); + let frodo = schema.users.find(1); + let association = frodo.associationFor('bestFriend'); assert.equal(association.key, 'bestFriend'); assert.equal(association.modelName, 'user'); assert.equal(association.ownerModelName, 'user'); - assert.ok(association.inverse() === association, 'the implicit inverse was found'); + assert.ok(frodo.inverseFor(association) === association, 'the implicit inverse was found'); }); test('a named reflexive belongsTo association with an explicit inverse is correct', function(assert) { - let schema = new Schema(new Db(), { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ] + }), { user: Model.extend({ bestFriend: belongsTo('user', { inverse: 'bestFriend' }) }) }); - let association = schema.modelClassFor('user').associationFor('bestFriend'); + let frodo = schema.users.find(1); + let association = frodo.associationFor('bestFriend'); assert.equal(association.key, 'bestFriend'); assert.equal(association.modelName, 'user'); assert.equal(association.ownerModelName, 'user'); - assert.ok(association.inverse() === association, 'the implicit inverse was found'); + assert.ok(frodo.inverseFor(association) === association, 'the explicit inverse was found'); }); -test('a one way reflexive belongsTo association with a null inverse is correct', function(assert) { - let schema = new Schema(new Db(), { +test('a one-way reflexive belongsTo association with a null inverse is correct', function(assert) { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ] + }), { user: Model.extend({ user: belongsTo('user', { inverse: null }) }) }); - let association = schema.modelClassFor('user').associationFor('user'); + let frodo = schema.users.find(1); + let association = frodo.associationFor('user'); assert.equal(association.key, 'user'); assert.equal(association.modelName, 'user'); assert.equal(association.ownerModelName, 'user'); - assert.ok(association.inverse() === null, 'there is no inverse'); + assert.ok(frodo.inverseFor(association) === null, 'there is no inverse'); }); -test('a named way reflexive belongsTo association with a null inverse is correct', function(assert) { - let schema = new Schema(new Db(), { +test('a named one-way way reflexive belongsTo association with a null inverse is correct', function(assert) { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ] + }), { user: Model.extend({ parent: belongsTo('user', { inverse: null }) }) }); - let association = schema.modelClassFor('user').associationFor('parent'); + let frodo = schema.users.find(1); + let association = frodo.associationFor('parent'); assert.equal(association.key, 'parent'); assert.equal(association.modelName, 'user'); assert.equal(association.ownerModelName, 'user'); - assert.ok(association.inverse() === null, 'there is no inverse'); + assert.ok(frodo.inverseFor(association) === null, 'there is no inverse'); }); -test('a one to one belongsTo association with an implicit inverse is correct', function(assert) { - let schema = new Schema(new Db(), { +test('a one-to-one belongsTo association with an implicit inverse is correct', function(assert) { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ], + profiles: [ + { id: 1, type: 'Admin' } + ] + }), { user: Model.extend({ profile: belongsTo() }), @@ -122,13 +172,15 @@ test('a one to one belongsTo association with an implicit inverse is correct', f }) }); - let association = schema.modelClassFor('profile').associationFor('user'); + let admin = schema.profiles.find(1); + let association = admin.associationFor('user'); assert.equal(association.key, 'user'); assert.equal(association.modelName, 'user'); assert.equal(association.ownerModelName, 'profile'); - let inverse = association.inverse(); + let frodo = schema.users.find(1); + let inverse = frodo.inverseFor(association); assert.equal(inverse.key, 'profile'); assert.equal(inverse.modelName, 'profile'); diff --git a/tests/integration/orm/schema-verification/has-many-test.js b/tests/integration/orm/schema-verification/has-many-test.js index 320ef36e3..106cdf3c1 100644 --- a/tests/integration/orm/schema-verification/has-many-test.js +++ b/tests/integration/orm/schema-verification/has-many-test.js @@ -6,48 +6,76 @@ import { module, test } from 'qunit'; module('Integration | ORM | Schema Verification | Has Many'); test('a one-way has many association is correct', function(assert) { - let schema = new Schema(new Db(), { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ], + posts: [ + { id: 1, title: 'Lorem' } + ] + }), { user: Model.extend({ posts: hasMany() }), post: Model.extend() }); - let association = schema.modelClassFor('user').associationFor('posts'); + let frodo = schema.users.find(1); + let association = frodo.associationFor('posts'); assert.equal(association.key, 'posts'); assert.equal(association.modelName, 'post'); assert.equal(association.ownerModelName, 'user'); - assert.ok(association.inverse() === null, 'there is no inverse'); + + let post = schema.posts.find(1); + + assert.ok(post.inverseFor(association) === null, 'there is no inverse'); }); test('a named one-way has many association is correct', function(assert) { - let schema = new Schema(new Db(), { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ], + posts: [ + { id: 1, title: 'Lorem' } + ] + }), { user: Model.extend({ blogPosts: hasMany('post') }), post: Model.extend() }); - let association = schema.modelClassFor('user').associationFor('blogPosts'); + let frodo = schema.users.find(1); + let association = frodo.associationFor('blogPosts'); assert.equal(association.key, 'blogPosts'); assert.equal(association.modelName, 'post'); assert.equal(association.ownerModelName, 'user'); - assert.ok(association.inverse() === null, 'there is no inverse'); + + let post = schema.posts.find(1); + + assert.ok(post.inverseFor(association) === null, 'there is no inverse'); }); test('a reflexive hasMany association with an implicit inverse is correct', function(assert) { - let schema = new Schema(new Db(), { + let schema = new Schema(new Db({ + tags: [ + { id: 1, name: 'economics' } + ] + }), { tag: Model.extend({ tags: hasMany() }) }); - let association = schema.modelClassFor('tag').associationFor('tags'); + let tag = schema.tags.find(1); + let association = tag.associationFor('tags'); assert.equal(association.key, 'tags'); assert.equal(association.modelName, 'tag'); assert.equal(association.ownerModelName, 'tag'); - assert.ok(association.inverse() === association, 'the implicit inverse was found'); + + assert.ok(tag.inverseFor(association) === association, 'the implicit inverse was found'); }); diff --git a/tests/integration/orm/schema-verification/mixed-test.js b/tests/integration/orm/schema-verification/mixed-test.js index d719b0c50..d12e34ecb 100644 --- a/tests/integration/orm/schema-verification/mixed-test.js +++ b/tests/integration/orm/schema-verification/mixed-test.js @@ -6,7 +6,14 @@ import { module, test } from 'qunit'; module('Integration | ORM | Schema Verification | Mixed'); test('unnamed one-to-many associations are correct', function(assert) { - let schema = new Schema(new Db(), { + let schema = new Schema(new Db({ + wordSmiths: [ + { id: 1, name: 'Frodo' } + ], + blogPosts: [ + { id: 1, title: 'Lorem' } + ] + }), { wordSmith: Model.extend({ blogPosts: hasMany() }), @@ -15,17 +22,27 @@ test('unnamed one-to-many associations are correct', function(assert) { }) }); - let association = schema.associationsFor('word-smith').blogPosts; - let inverse = schema.associationsFor('blog-post').wordSmith; + let frodo = schema.wordSmiths.find(1); + let association = frodo.associationFor('blogPosts'); assert.equal(association.key, 'blogPosts'); assert.equal(association.modelName, 'blog-post'); assert.equal(association.ownerModelName, 'word-smith'); - assert.deepEqual(association.inverse(), inverse); + + let post = schema.blogPosts.find(1); + + assert.deepEqual(post.inverseFor(association), post.associationFor('wordSmith')); }); test('a named one-to-many association is correct', function(assert) { - let schema = new Schema(new Db(), { + let schema = new Schema(new Db({ + wordSmiths: [ + { id: 1, name: 'Frodo' } + ], + blogPosts: [ + { id: 1, title: 'Lorem' } + ] + }), { wordSmith: Model.extend({ posts: hasMany('blog-post') }), @@ -34,17 +51,27 @@ test('a named one-to-many association is correct', function(assert) { }) }); - let association = schema.associationsFor('word-smith').posts; - let inverse = schema.associationsFor('blog-post').author; + let frodo = schema.wordSmiths.find(1); + let association = frodo.associationFor('posts'); assert.equal(association.key, 'posts'); assert.equal(association.modelName, 'blog-post'); assert.equal(association.ownerModelName, 'word-smith'); - assert.deepEqual(association.inverse(), inverse); + + let post = schema.blogPosts.find(1); + + assert.deepEqual(post.inverseFor(association), post.associationFor('author')); }); test('multiple has-many associations of the same type', function(assert) { - let schema = new Schema(new Db(), { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ], + posts: [ + { id: 1, title: 'Lorem' } + ] + }), { user: Model.extend({ notes: hasMany('post', { inverse: 'author' }), messages: hasMany('post', { inverse: 'messenger' }) @@ -55,32 +82,44 @@ test('multiple has-many associations of the same type', function(assert) { }) }); - let { notes, messages } = schema.associationsFor('user'); - let { author, messenger } = schema.associationsFor('post'); - - assert.equal(notes.key, 'notes'); - assert.equal(notes.modelName, 'post'); - assert.equal(notes.ownerModelName, 'user'); - assert.deepEqual(notes.inverse(), author); - assert.equal(messages.key, 'messages'); - assert.equal(messages.modelName, 'post'); - assert.equal(messages.ownerModelName, 'user'); - assert.deepEqual(messages.inverse(), messenger); + let frodo = schema.users.find(1); + let notesAssociation = frodo.associationFor('notes'); + + assert.equal(notesAssociation.key, 'notes'); + assert.equal(notesAssociation.modelName, 'post'); + assert.equal(notesAssociation.ownerModelName, 'user'); + + let post = schema.posts.find(1); + + assert.deepEqual(post.inverseFor(notesAssociation), post.associationFor('author')); + + let messagesAssociation = frodo.associationFor('messages'); + + assert.equal(messagesAssociation.key, 'messages'); + assert.equal(messagesAssociation.modelName, 'post'); + assert.equal(messagesAssociation.ownerModelName, 'user'); + + assert.deepEqual(post.inverseFor(messagesAssociation), post.associationFor('messenger')); }); test('one-to-many reflexive association is correct', function(assert) { - let schema = new Schema(new Db(), { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ] + }), { user: Model.extend({ parent: belongsTo('user', { inverse: 'children' }), children: hasMany('user', { inverse: 'parent' }) }) }); - let association = schema.associationsFor('user').parent; - let inverse = schema.associationsFor('user').children; + let frodo = schema.users.find(1); + let parentAssociation = frodo.associationFor('parent'); + + assert.equal(parentAssociation.key, 'parent'); + assert.equal(parentAssociation.modelName, 'user'); + assert.equal(parentAssociation.ownerModelName, 'user'); - assert.equal(association.key, 'parent'); - assert.equal(association.modelName, 'user'); - assert.equal(association.ownerModelName, 'user'); - assert.deepEqual(association.inverse(), inverse); + assert.deepEqual(frodo.inverseFor(parentAssociation), frodo.associationFor('children')); }); diff --git a/tests/integration/serializers/active-model-serializer-test.js b/tests/integration/serializers/active-model-serializer-test.js index 601bb1c32..124501407 100644 --- a/tests/integration/serializers/active-model-serializer-test.js +++ b/tests/integration/serializers/active-model-serializer-test.js @@ -13,18 +13,22 @@ module('Integration | Serializer | ActiveModelSerializer', { blogPosts: hasMany() }), blogPost: Model.extend({ - wordSmith: belongsTo() + wordSmith: belongsTo(), + comments: hasMany() }), user: Model.extend({ contactInfos: hasMany() }), contactInfo: Model.extend({ user: belongsTo() + }), + comment: Model.extend({ + commentable: belongsTo({ polymorphic: true }) }) }); let link = this.schema.wordSmiths.create({ name: 'Link', age: 123 }); - link.createBlogPost({ title: 'Lorem' }); + let post1 = link.createBlogPost({ title: 'Lorem' }); link.createBlogPost({ title: 'Ipsum' }); this.schema.wordSmiths.create({ name: 'Zelda', age: 230 }); @@ -34,6 +38,7 @@ module('Integration | Serializer | ActiveModelSerializer', { user.createContactInfo({ email: 'john3000@mail.com' }); this.schema.users.create({ name: 'Pine Apple', age: 230 }); + this.schema.comments.create({ text: 'Hi there', commentable: post1 }); this.registry = new SerializerRegistry(this.schema, { application: ActiveModelSerializer, @@ -42,7 +47,10 @@ module('Integration | Serializer | ActiveModelSerializer', { include: ['blogPosts'] }), blogPost: ActiveModelSerializer.extend({ - include: ['wordSmith'] + include: ['wordSmith', 'comments'] + }), + comment: ActiveModelSerializer.extend({ + include: ['commentable'] }), contactInfo: ActiveModelSerializer.extend({ include: ['user'] @@ -74,12 +82,22 @@ test('it sideloads associations and snake-cases relationships and attributes cor { id: '1', title: 'Lorem', - word_smith_id: '1' + word_smith_id: '1', + comment_ids: [ '1' ] }, { id: '2', title: 'Ipsum', - word_smith_id: '1' + word_smith_id: '1', + comment_ids: [ ] + } + ], + comments: [ + { + id: '1', + text: 'Hi there', + commentable_id: '1', + commentable_type: 'blog-post' } ] }); @@ -106,12 +124,22 @@ test('it sideloads associations and snake-cases relationships and attributes cor { id: '1', title: 'Lorem', - word_smith_id: '1' + word_smith_id: '1', + comment_ids: [ '1' ] }, { id: '2', title: 'Ipsum', - word_smith_id: '1' + word_smith_id: '1', + comment_ids: [ ] + } + ], + comments: [ + { + id: '1', + text: 'Hi there', + commentable_id: '1', + commentable_type: 'blog-post' } ] }); diff --git a/tests/integration/serializers/base/associations/polymorphic-belongs-to-test.js b/tests/integration/serializers/base/associations/polymorphic-belongs-to-test.js new file mode 100644 index 000000000..5cab2131c --- /dev/null +++ b/tests/integration/serializers/base/associations/polymorphic-belongs-to-test.js @@ -0,0 +1,52 @@ +import { Model, belongsTo } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; +import Serializer from 'ember-cli-mirage/serializer'; +import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; +import { module, test } from 'qunit'; + +module('Integration | Serializers | Base | Associations | Polymorphic Belongs To', { + beforeEach() { + this.schema = new Schema(new Db(), { + post: Model.extend(), + comment: Model.extend({ + commentable: belongsTo({ polymorphic: true }) + }) + }); + + let post = this.schema.posts.create({ title: 'Lorem ipsum' }); + this.schema.comments.create({ commentable: post, text: 'Foo' }); + + this.BaseSerializer = Serializer.extend({ + embed: false + }); + }, + + afterEach() { + this.schema.db.emptyData(); + } +}); + +test(`it can serialize a polymorphic belongs-to relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + comment: this.BaseSerializer.extend({ + include: ['commentable'] + }) + }); + + let comment = this.schema.comments.find(1); + let result = registry.serialize(comment); + + assert.deepEqual(result, { + comment: { + id: '1', + text: 'Foo', + commentableType: 'post', + commentableId: '1' + }, + posts: [ + { id: '1', title: 'Lorem ipsum' } + ] + }); +}); diff --git a/tests/integration/serializers/base/associations/polymorphic-has-many-test.js b/tests/integration/serializers/base/associations/polymorphic-has-many-test.js new file mode 100644 index 000000000..1c055bf44 --- /dev/null +++ b/tests/integration/serializers/base/associations/polymorphic-has-many-test.js @@ -0,0 +1,53 @@ +import { Model, hasMany } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; +import Serializer from 'ember-cli-mirage/serializer'; +import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; +import { module, test } from 'qunit'; + +module('Integration | Serializers | Base | Associations | Polymorphic Has Many', { + beforeEach() { + this.schema = new Schema(new Db(), { + user: Model.extend({ + things: hasMany({ polymorphic: true }) + }), + picture: Model.extend() + }); + + let post = this.schema.pictures.create({ title: 'Lorem ipsum' }); + this.schema.users.create({ things: [ post ], name: 'Ned' }); + + this.BaseSerializer = Serializer.extend({ + embed: false + }); + }, + + afterEach() { + this.schema.db.emptyData(); + } +}); + +test(`it can serialize a polymorphic has-many relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + user: this.BaseSerializer.extend({ + include: ['things'] + }) + }); + + let user = this.schema.users.find(1); + let result = registry.serialize(user); + + assert.deepEqual(result, { + user: { + id: '1', + name: 'Ned', + things: [ + { id: '1', type: 'picture' } + ] + }, + pictures: [ + { id: '1', title: 'Lorem ipsum' } + ] + }); +}); diff --git a/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js b/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js new file mode 100644 index 000000000..5c1ae3502 --- /dev/null +++ b/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js @@ -0,0 +1,97 @@ +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; +import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; +import { Model, belongsTo, hasMany, JSONAPISerializer } from 'ember-cli-mirage'; +import { module, test } from 'qunit'; + +module('Integration | Serializers | JSON API Serializer | Associations | Polymorphic'); + +test('it works for belongs to polymorphic relationships', function(assert) { + let schema = new Schema(new Db(), { + photo: Model.extend(), + video: Model.extend(), + comment: Model.extend({ + commentable: belongsTo({ polymorphic: true }) + }) + }); + + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer + }); + let photo = schema.photos.create({ title: 'Foo' }); + schema.comments.create({ text: 'Pretty foo!', commentable: photo }); + + let video = schema.videos.create({ title: 'Bar' }); + schema.comments.create({ text: 'Love the bar!', commentable: video }); + + let result = registry.serialize(schema.comments.all()); + assert.deepEqual(result, { + data: [ + { + "attributes": { + "text": "Pretty foo!" + }, + "id": "1", + "relationships": { + "commentable": { + "data": { id: '1', type: 'photos' } + } + }, + "type": "comments" + }, + { + "attributes": { + "text": "Love the bar!" + }, + "id": "2", + "relationships": { + "commentable": { + "data": { id: '1', type: 'videos' } + } + }, + "type": "comments" + } + ] + }); +}); + +test('it works for has many polymorphic relationships', function(assert) { + let schema = new Schema(new Db(), { + user: Model.extend({ + things: hasMany({ polymorphic: true }) + }), + car: Model.extend(), + watch: Model.extend() + }); + + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer + }); + + let car = schema.cars.create({ make: 'Infiniti' }); + let watch = schema.watches.create({ make: 'Citizen' }); + let user = schema.users.create({ + name: 'Sam', + things: [ car, watch ] + }); + + let json = registry.serialize(user); + + assert.deepEqual(json, { + data: { + "attributes": { + "name": "Sam" + }, + "id": "1", + "relationships": { + "things": { + "data": [ + { id: '1', type: 'cars' }, + { id: '1', type: 'watches' } + ] + } + }, + "type": "users" + } + }); +}); From 54ccce0cd0552548ae84eea0625afe4cba1f59b5 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 3 Jun 2017 21:30:01 -0400 Subject: [PATCH 037/879] Drop codeclimate' --- .codeclimate.yml | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 .codeclimate.yml diff --git a/.codeclimate.yml b/.codeclimate.yml deleted file mode 100644 index 299f85340..000000000 --- a/.codeclimate.yml +++ /dev/null @@ -1,16 +0,0 @@ -engines: - duplication: - enabled: true - config: - languages: - javascript: - mass_threshold: 50 - eslint: - enabled: true - channel: "eslint-3" - -ratings: - paths: - - "**.js" - -exclude_paths: From de784f9166e0e7df6bb9ca78387d5efaac3fab7f Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 3 Jun 2017 21:31:27 -0400 Subject: [PATCH 038/879] Update changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf0810de0..f428fa1e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Ember CLI Mirage Changelog +## 0.3.3 + +Update notes: none + +Changes: + + - [FEATURE][#1080](https://github.com/samselikoff/ember-cli-mirage/pull/1080) Polymorphic association support @samselikoff + ## 0.3.2 Update notes: none From 5b69f585df620a2808d69859b11e50a8f73d11aa Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 3 Jun 2017 21:54:07 -0400 Subject: [PATCH 039/879] 0.3.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 77f7436f2..0fdc07106 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "0.3.2", + "version": "0.3.3", "description": "A client-side HTTP server to develop, test and demo your Ember app", "directories": { "doc": "doc", From 419faac61ae0f43a5eef7ccf6d6012328f7e5fa2 Mon Sep 17 00:00:00 2001 From: Simon Ihmig Date: Sun, 4 Jun 2017 04:34:48 +0200 Subject: [PATCH 040/879] Fix FastBoot 1.0 (#1098) * Added FastBoot tests * Fix FastBoot 1.0 --- .travis.yml | 1 + app/initializers/ember-cli-mirage.js | 3 ++ config/ember-try.js | 7 +++ .../fixtures/fastboot/app/router.js | 12 ++++++ .../fixtures/fastboot/app/templates/index.hbs | 1 + fastboot-tests/index-test.js | 24 +++++++++++ index.js | 43 +++++++++++-------- package.json | 6 ++- 8 files changed, 76 insertions(+), 21 deletions(-) create mode 100644 fastboot-tests/fixtures/fastboot/app/router.js create mode 100644 fastboot-tests/fixtures/fastboot/app/templates/index.hbs create mode 100644 fastboot-tests/index-test.js diff --git a/.travis.yml b/.travis.yml index 4fe267cd6..4e128bd50 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,6 +20,7 @@ env: - EMBER_TRY_SCENARIO=ember-release - EMBER_TRY_SCENARIO=ember-beta - EMBER_TRY_SCENARIO=ember-canary + - EMBER_TRY_SCENARIO=fastboot-tests matrix: fast_finish: true diff --git a/app/initializers/ember-cli-mirage.js b/app/initializers/ember-cli-mirage.js index 766a5e0ab..3dd950182 100644 --- a/app/initializers/ember-cli-mirage.js +++ b/app/initializers/ember-cli-mirage.js @@ -33,6 +33,9 @@ export function startMirage(env = ENV) { } function _shouldUseMirage(env, addonConfig) { + if (typeof FastBoot !== 'undefined') { + return false; + } let userDeclaredEnabled = typeof addonConfig.enabled !== 'undefined'; let defaultEnabled = _defaultEnabled(env, addonConfig); diff --git a/config/ember-try.js b/config/ember-try.js index f6f8205a6..f839664e6 100644 --- a/config/ember-try.js +++ b/config/ember-try.js @@ -55,6 +55,13 @@ module.exports = { 'ember': 'canary' } } + }, + { + name: 'fastboot-tests', + command: 'ember fastboot:test', + npm: { + devDependencies: {} + } } ] }; diff --git a/fastboot-tests/fixtures/fastboot/app/router.js b/fastboot-tests/fixtures/fastboot/app/router.js new file mode 100644 index 000000000..cdc257875 --- /dev/null +++ b/fastboot-tests/fixtures/fastboot/app/router.js @@ -0,0 +1,12 @@ +import Ember from 'ember'; +import config from './config/environment'; + +const Router = Ember.Router.extend({ + location: config.locationType, + rootURL: config.rootURL +}); + +Router.map(function() { +}); + +export default Router; diff --git a/fastboot-tests/fixtures/fastboot/app/templates/index.hbs b/fastboot-tests/fixtures/fastboot/app/templates/index.hbs new file mode 100644 index 000000000..723a5016a --- /dev/null +++ b/fastboot-tests/fixtures/fastboot/app/templates/index.hbs @@ -0,0 +1 @@ +

ember-fastboot-addon-tests

\ No newline at end of file diff --git a/fastboot-tests/index-test.js b/fastboot-tests/index-test.js new file mode 100644 index 000000000..997fb5f5b --- /dev/null +++ b/fastboot-tests/index-test.js @@ -0,0 +1,24 @@ +'use strict'; + +const expect = require('chai').expect; +const setupTest = require('ember-fastboot-addon-tests').setupTest; + +describe('index', function() { + setupTest('fastboot', { + emberVersion: '2.13.3' + }); + + it('renders', function() { + return this.visit('/') + .then(function(res) { + let $ = res.jQuery; + let response = res.response; + + // add your real tests here + expect(response.statusCode).to.equal(200); + expect($('body').length).to.equal(1); + expect($('h1').text().trim()).to.equal('ember-fastboot-addon-tests'); + }); + }); + +}); \ No newline at end of file diff --git a/index.js b/index.js index e1d3813f3..d0654055c 100644 --- a/index.js +++ b/index.js @@ -1,8 +1,9 @@ /* eslint-env node */ 'use strict'; -var path = require('path'); -var mergeTrees = require('broccoli-merge-trees'); -var Funnel = require('broccoli-funnel'); +const path = require('path'); +const mergeTrees = require('broccoli-merge-trees'); +const Funnel = require('broccoli-funnel'); +const map = require('broccoli-stew').map; module.exports = { name: 'ember-cli-mirage', @@ -19,8 +20,8 @@ module.exports = { } }, - included: function included() { - var app; + included() { + let app; // If the addon has the _findHost() method (in ember-cli >= 2.7.0), we'll just // use that. @@ -29,7 +30,7 @@ module.exports = { } else { // Otherwise, we'll use this implementation borrowed from the _findHost() // method in ember-cli. - var current = this; + let current = this; do { app = current.app || app; } while (current.parent.parent && (current = current.parent)); @@ -60,11 +61,11 @@ module.exports = { } }, - blueprintsPath: function() { + blueprintsPath() { return path.join(__dirname, 'blueprints'); }, - treeFor: function(name) { + treeFor(name) { if (!this._shouldIncludeFiles()) { return; } @@ -72,8 +73,8 @@ module.exports = { return this._super.treeFor.apply(this, arguments); }, - _lintMirageTree: function(mirageTree) { - var lintedMirageTrees; + _lintMirageTree(mirageTree) { + let lintedMirageTrees; // _eachProjectAddonInvoke was added in ember-cli@2.5.0 // this conditional can be removed when we no longer support // versions older than 2.5.0 @@ -87,7 +88,7 @@ module.exports = { }).filter(Boolean); } - var lintedMirage = mergeTrees(lintedMirageTrees, { + let lintedMirage = mergeTrees(lintedMirageTrees, { overwrite: true, annotation: 'TreeMerger (mirage-lint)' }); @@ -97,9 +98,9 @@ module.exports = { }); }, - treeForApp: function(appTree) { - var trees = [ appTree ]; - var mirageFilesTree = new Funnel(this.mirageDirectory, { + treeForApp(appTree) { + let trees = [ appTree ]; + let mirageFilesTree = new Funnel(this.mirageDirectory, { destDir: 'mirage' }); trees.push(mirageFilesTree); @@ -111,14 +112,14 @@ module.exports = { return mergeTrees(trees); }, - _shouldIncludeFiles: function() { + _shouldIncludeFiles() { if (process.env.EMBER_CLI_FASTBOOT) { return false; } - var environment = this.app.env; - var enabledInProd = environment === 'production' && this.addonConfig.enabled; - var explicitExcludeFiles = this.addonConfig.excludeFilesFromBuild; + let environment = this.app.env; + let enabledInProd = environment === 'production' && this.addonConfig.enabled; + let explicitExcludeFiles = this.addonConfig.excludeFilesFromBuild; if (enabledInProd && explicitExcludeFiles) { throw new Error('Mirage was explicitly enabled in production, but its files were excluded ' + 'from the build. Please, use only ENV[\'ember-cli-mirage\'].enabled in ' @@ -132,7 +133,11 @@ function npmAsset(filePath) { return function() { return { enabled: this._shouldIncludeFiles(), - import: [filePath] + import: [filePath], + // guard against usage in FastBoot 1.0, where process.env.EMBER_CLI_FASTBOOT is not available + _processTree(input) { + return map(input, content => `if (typeof FastBoot !== 'undefined') { ${content} }`) + } }; }; } diff --git a/package.json b/package.json index 0fdc07106..2363680f9 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "devDependencies": { "active-model-adapter": "^2.0.3", "broccoli-asset-rev": "^2.4.5", - "chai": "2.0.0", + "chai": "^4.0.1", "ember-ajax": "^2.4.1", "ember-cli": "^2.9.1", "ember-cli-app-version": "^2.0.0", @@ -46,6 +46,7 @@ "ember-disable-prototype-extensions": "^1.1.0", "ember-disable-proxy-controllers": "^1.0.1", "ember-export-application-global": "^1.0.5", + "ember-fastboot-addon-tests": "^0.4.0", "ember-load-initializers": "^0.5.1", "ember-resolver": "^2.0.3", "ember-sinon": "0.5.1", @@ -66,12 +67,13 @@ "dependencies": { "broccoli-funnel": "^1.0.2", "broccoli-merge-trees": "^1.1.0", + "broccoli-stew": "^1.5.0", "broccoli-unwatched-tree": "^0.1.1", "chalk": "^1.1.1", "ember-cli-babel": "^5.1.7", "ember-cli-node-assets": "^0.1.4", - "ember-inflector": "^2.0.0", "ember-get-config": "0.2.1", + "ember-inflector": "^2.0.0", "ember-lodash": "^4.17.3", "exists-sync": "0.0.3", "fake-xml-http-request": "^1.4.0", From 1b7bf74f0670d2f741f28b11c57a92e1b975297f Mon Sep 17 00:00:00 2001 From: Daniel Guettler Date: Thu, 8 Jun 2017 10:55:07 -0400 Subject: [PATCH 041/879] Extend modelRegexp to match models in pod structure (#1102) --- addon/ember-data.js | 9 +++++++-- tests/dummy/app/pods/user/model.js | 4 ++++ tests/dummy/config/environment.js | 1 + tests/integration/ember-data-test.js | 1 + 4 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 tests/dummy/app/pods/user/model.js diff --git a/addon/ember-data.js b/addon/ember-data.js index 6390d5a7c..41f34a3d3 100644 --- a/addon/ember-data.js +++ b/addon/ember-data.js @@ -7,7 +7,8 @@ import { hasEmberData, isDsModel } from 'ember-cli-mirage/utils/ember-data'; import { Model, belongsTo, hasMany } from 'ember-cli-mirage'; const { - modulePrefix + modulePrefix, + podModulePrefix } = config; // Caches @@ -26,7 +27,7 @@ export function getDsModels() { } let moduleMap = requirejs.entries; - let modelMatchRegex = new RegExp(`^${modulePrefix}/models`, 'i'); + let modelMatchRegex = new RegExp(`^(${modulePrefix}/models|${podModulePrefix}/.*/model$)`, 'i'); DsModels = {}; @@ -41,6 +42,10 @@ export function getDsModels() { let modelName = paths[paths.length - 1]; let model = require(path, null, null, true).default; + if (modelName === 'model') { + modelName = paths[paths.length - 2]; + } + if (isDsModel(model)) { DsModels[modelName] = model; } diff --git a/tests/dummy/app/pods/user/model.js b/tests/dummy/app/pods/user/model.js new file mode 100644 index 000000000..7b5f4284f --- /dev/null +++ b/tests/dummy/app/pods/user/model.js @@ -0,0 +1,4 @@ +import DS from 'ember-data'; + +export default DS.Model.extend({ +}); diff --git a/tests/dummy/config/environment.js b/tests/dummy/config/environment.js index 6a378d3d4..f74e7be0f 100644 --- a/tests/dummy/config/environment.js +++ b/tests/dummy/config/environment.js @@ -3,6 +3,7 @@ module.exports = function(environment) { var ENV = { modulePrefix: 'dummy', + podModulePrefix: 'dummy/pods', environment: environment, rootURL: '/', locationType: 'auto', diff --git a/tests/integration/ember-data-test.js b/tests/integration/ember-data-test.js index e0d984d7b..0499351ad 100644 --- a/tests/integration/ember-data-test.js +++ b/tests/integration/ember-data-test.js @@ -35,6 +35,7 @@ test(`Ember data models were generated and loaded`, function(assert) { assert.ok(registry.foo, 'Pre defined model Foo has been registered'); assert.ok(registry.address, 'Ember data model Address has been registered'); assert.ok(registry.contact, 'Ember data model Contact has been registered'); + assert.ok(registry.user, 'Ember data model User has been registered'); assert.equal(registry.address.foreignKeys.length, 1, 'Ember data model Address has the correct relationships'); }); From ee0efc89615c0ae0553a5407286fcde4f17d7382 Mon Sep 17 00:00:00 2001 From: Denis Demchenko Date: Mon, 12 Jun 2017 16:22:47 +0300 Subject: [PATCH 042/879] Fixed existence of `relationships.data` if `links` are defined (#1096) * Fix JSONAPISerializer#_getResourceObjectForModel method The method fixed according to JSONAPI spec. The spec says that a "relationships" object must contain at least one of the props, but could contain all of them. So, `links` are able to be with `data` as well. Link to the article of the spec: http://jsonapi.org/format/#document-resource-object-relationships fixes #973 * Update tests for JSONAPISerializer `data` is allowed to exist if `links` already defined --- addon/serializers/json-api-serializer.js | 35 +++++++++---------- .../associations/links-test.js | 7 +++- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/addon/serializers/json-api-serializer.js b/addon/serializers/json-api-serializer.js index 75f6f9ee3..74cc98c57 100644 --- a/addon/serializers/json-api-serializer.js +++ b/addon/serializers/json-api-serializer.js @@ -137,34 +137,33 @@ export default Serializer.extend({ model.associationKeys.forEach((key) => { let relationship = model[key]; let relationshipKey = this.keyForRelationship(key); - let relationshipHash; + let relationshipHash = {}; hash.relationships = hash.relationships || {}; if (this.hasLinksForRelationship(model, key)) { let serializer = this.serializerFor(model.modelName); let links = serializer.links(model); - relationshipHash = { links: links[key] }; + relationshipHash.links = links[key]; + } - } else { - let data = null; + let data = null; - if (this.isModel(relationship)) { - data = { - type: this.typeKeyForModel(relationship), - id: relationship.id + if (this.isModel(relationship)) { + data = { + type: this.typeKeyForModel(relationship), + id: relationship.id + }; + } else if (this.isCollection(relationship)) { + data = relationship.models.map((model) => { + return { + type: this.typeKeyForModel(model), + id: model.id }; - } else if (this.isCollection(relationship)) { - data = relationship.models.map((model) => { - return { - type: this.typeKeyForModel(model), - id: model.id - }; - }); - } - - relationshipHash = { data }; + }); } + relationshipHash.data = data; + hash.relationships[relationshipKey] = relationshipHash; }); diff --git a/tests/integration/serializers/json-api-serializer/associations/links-test.js b/tests/integration/serializers/json-api-serializer/associations/links-test.js index c53c7ad5b..a07ce421f 100644 --- a/tests/integration/serializers/json-api-serializer/associations/links-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/links-test.js @@ -24,7 +24,7 @@ module('Integration | Serializers | JSON API Serializer | Associations | Links', } }); -test(`it can link to relationships, omitting 'data'`, function(assert) { +test(`it can link to relationships, including data'`, function(assert) { let registry = new SerializerRegistry(this.schema, { application: JSONAPISerializer, blogPost: JSONAPISerializer.extend({ @@ -57,12 +57,17 @@ test(`it can link to relationships, omitting 'data'`, function(assert) { }, relationships: { 'word-smith': { + data: { + id: "3", + type: "word-smiths" + }, links: { related: `/api/word_smiths/${link.id}`, self: `/api/blog_posts/${blogPost.id}/relationships/word_smith` } }, 'fine-comments': { + data: [], links: { related: `/api/fine_comments?blog_post_id=${blogPost.id}`, self: `/api/blog_posts/${blogPost.id}/relationships/fine_comments` From 9d6abc252cca6b51a24dd0ebefae0fcee41dedad Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 14 Jun 2017 12:50:21 -0400 Subject: [PATCH 043/879] [closes #1107] Better errors for custom route handlers --- addon/route-handler.js | 5 ++++- .../route-handlers/function-handler-test.js | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/addon/route-handler.js b/addon/route-handler.js index 9acdee0a7..fca8bcbfa 100644 --- a/addon/route-handler.js +++ b/addon/route-handler.js @@ -76,9 +76,12 @@ export default class RouteHandler { } catch(e) { if (e instanceof MirageError) { throw e; + } else { let message = (typeOf(e) === 'string') ? e : e.message; - throw new MirageError(`Your handler for the url ${request.url} threw an error: ${message}`); + let error = new MirageError(`Your ${request.method} handler for the url ${request.url} threw an error: ${message}`); + + result = new Response(500, {}, error.message); } } diff --git a/tests/integration/route-handlers/function-handler-test.js b/tests/integration/route-handlers/function-handler-test.js index e822ac9b7..0774c1fbb 100644 --- a/tests/integration/route-handlers/function-handler-test.js +++ b/tests/integration/route-handlers/function-handler-test.js @@ -33,6 +33,20 @@ module('Integration | Route handlers | Function handler', { } }); +test('a meaningful error is thrown if a custom route handler throws an error', function(assert) { + assert.expect(1); + let done = assert.async(); + + this.server.get('/users', function() { + throw 'I goofed'; + }); + + $.ajax({ method: 'GET', url: '/users' }).error(({ responseText }) => { + assert.equal(responseText, 'Mirage: Your GET handler for the url /users threw an error: I goofed'); + done(); + }); +}); + test('mirage response string is not serialized to string', function(assert) { assert.expect(1); let done = assert.async(); From 0d71c0efd8d3e085e0601a2ece5b31def0390f31 Mon Sep 17 00:00:00 2001 From: Kelly Selden Date: Wed, 14 Jun 2017 10:28:19 -0700 Subject: [PATCH 044/879] ignore artifacts in npm (#1106) --- .npmignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.npmignore b/.npmignore index 2c4ecf9a3..a1e78fbe2 100644 --- a/.npmignore +++ b/.npmignore @@ -1,6 +1,8 @@ +/.sass-cache /bower_components /config/ember-try.js /dist +/jekyll-tmp /tests /tmp **/.gitkeep @@ -13,3 +15,4 @@ bower.json ember-cli-build.js testem.js +*.md From fe8ec9c838feec42270e950beb55ef0619ecd6c6 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 14 Jun 2017 22:12:16 -0400 Subject: [PATCH 045/879] Create default.js --- blueprints/ember-cli-mirage/files/__root__/scenarios/default.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/blueprints/ember-cli-mirage/files/__root__/scenarios/default.js b/blueprints/ember-cli-mirage/files/__root__/scenarios/default.js index 0d2db8d3c..adb3af4c0 100644 --- a/blueprints/ember-cli-mirage/files/__root__/scenarios/default.js +++ b/blueprints/ember-cli-mirage/files/__root__/scenarios/default.js @@ -3,8 +3,6 @@ export default function(/* server */) { /* Seed your development database using your factories. This data will not be loaded in your tests. - - Make sure to define a factory for each model you want to create. */ // server.createList('post', 10); From ac56fdb0ad95b267f246b92c250971ae6242b066 Mon Sep 17 00:00:00 2001 From: Kelly Selden Date: Mon, 19 Jun 2017 16:29:35 -0700 Subject: [PATCH 046/879] only update root lint file (#1114) --- blueprints/ember-cli-mirage/index.js | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/blueprints/ember-cli-mirage/index.js b/blueprints/ember-cli-mirage/index.js index cc36cda4b..20c92d1b2 100644 --- a/blueprints/ember-cli-mirage/index.js +++ b/blueprints/ember-cli-mirage/index.js @@ -30,19 +30,16 @@ module.exports = { }, insertServerIntoESLintrc: function() { - // Insert server to globals declaration in eslintrc files. + // Insert server to globals declaration in eslintrc file. // If globals declaration is not present insert it. - var text, after; - text = ' server: true,'; - after ='globals: {\n'; + var text = ' server: true,'; + var after = 'globals: {\n'; + return this.insertIntoFile('.eslintrc.js', text, { after: after }).then(() => { - return this.insertIntoFile('tests/.eslintrc.js', text, { after: after }).then(() => { - text = ' globals: {\n server: true,\n },'; - after = 'module.exports = {\n'; - return this.insertIntoFile('.eslintrc.js', text, { after: after }).then(() => { - return this.insertIntoFile('tests/.eslintrc.js', text, { after: after }); - }); - }); + text = ' globals: {\n server: true,\n },'; + after = 'module.exports = {\n'; + + return this.insertIntoFile('.eslintrc.js', text, { after: after }); }); }, @@ -50,9 +47,7 @@ module.exports = { var text = ' "server",'; var after = '"predef": [\n'; - return this.insertIntoFile('.jshintrc', text, { after: after }).then(() => { - return this.insertIntoFile('tests/.jshintrc', text, { after: after }); - }); + return this.insertIntoFile('.jshintrc', text, { after: after }); }, insertShutdownIntoDestroyApp: function() { From d93713e90957a62b40507d1fb988dba4d929a18e Mon Sep 17 00:00:00 2001 From: Lennex Zinyando Date: Tue, 20 Jun 2017 01:30:32 +0200 Subject: [PATCH 047/879] Expose database in serializer (#1110) * Adds schema getter in serializer * Adds a test for accessing the database in serializer methods --- addon/serializer.js | 4 ++++ .../base/override-serialize-test.js | 21 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/addon/serializer.js b/addon/serializer.js index e9df848aa..ee8703724 100644 --- a/addon/serializer.js +++ b/addon/serializer.js @@ -466,6 +466,10 @@ class Serializer { return _isFunction(this.include) ? this.include(this.request) : this.include; } + get schema() { + return this.registry.schema; + } + /** * @method _formatAttributeKeys * @param attrs diff --git a/tests/integration/serializers/base/override-serialize-test.js b/tests/integration/serializers/base/override-serialize-test.js index 349bae98d..9bdc364e7 100644 --- a/tests/integration/serializers/base/override-serialize-test.js +++ b/tests/integration/serializers/base/override-serialize-test.js @@ -50,3 +50,24 @@ test(`it can access the request in a custom serialize function`, function(assert assert.deepEqual(result, 'bar'); }); + +test(`it can access the databse while in a serializer method`, function(assert) { + this.registry = new SerializerRegistry(this.schema, { + wordSmith: Serializer.extend({ + serialize(response, request) { + let id = request.params.id; + return this.schema.db.wordSmiths.find(id).title || 'No title'; + } + }) + }); + + let wordSmith = this.schema.wordSmiths.create({ + id: 1, + title: 'Title in database' + }); + + let request = { url: '/word-smiths/1?foo=bar', params: { id: '1' }, queryParams: { foo: 'bar' } }; + let result = this.registry.serialize(wordSmith, request); + + assert.deepEqual(result, 'Title in database'); +}); \ No newline at end of file From 2d8dd5feb19036bc955ce1e5b7a93c9d49a8a10b Mon Sep 17 00:00:00 2001 From: jelhan Date: Wed, 21 Jun 2017 03:43:52 +0200 Subject: [PATCH 048/879] adds support for custom identity managers per application and model (#977) --- addon/db-collection.js | 56 +----------- addon/db.js | 26 +++++- addon/identity-manager.js | 80 +++++++++++++++++ addon/index.js | 4 +- addon/server.js | 7 +- addon/utils/read-modules.js | 6 +- .../__root__/identity-managers/__name__.js | 35 ++++++++ blueprints/mirage-identity-manager/index.js | 20 +++++ tests/acceptance/contact-test.js | 4 +- tests/acceptance/edit-test.js | 5 +- tests/acceptance/identity-manager-test.js | 9 ++ .../dummy/mirage/identity-managers/author.js | 57 ++++++++++++ tests/dummy/mirage/models/author.js | 5 ++ tests/index-named-imports-test.js | 7 +- tests/integration/db/identity-manager-test.js | 88 +++++++++++++++++++ tests/unit/db-test.js | 39 ++++++++ tests/unit/db/identity-manager-test.js | 4 +- 17 files changed, 383 insertions(+), 69 deletions(-) create mode 100644 addon/identity-manager.js create mode 100644 blueprints/mirage-identity-manager/files/__root__/identity-managers/__name__.js create mode 100644 blueprints/mirage-identity-manager/index.js create mode 100644 tests/acceptance/identity-manager-test.js create mode 100644 tests/dummy/mirage/identity-managers/author.js create mode 100644 tests/dummy/mirage/models/author.js create mode 100644 tests/integration/db/identity-manager-test.js diff --git a/addon/db-collection.js b/addon/db-collection.js index e727dd41d..214865d0f 100644 --- a/addon/db-collection.js +++ b/addon/db-collection.js @@ -11,10 +11,6 @@ function duplicate(data) { } } -function isNumber(n) { - return (+n).toString() === n.toString(); -} - /** * A collection of db records i.e. a database table. * @class DbCollection @@ -23,7 +19,7 @@ function isNumber(n) { */ class DbCollection { - constructor(name, initialData) { + constructor(name, initialData, IdentityManager) { this.name = name; this._records = []; this.identityManager = new IdentityManager(); @@ -311,7 +307,7 @@ class DbCollection { let attrs = duplicate(data); if (attrs && (attrs.id === undefined || attrs.id === null)) { - attrs.id = this.identityManager.fetch(); + attrs.id = this.identityManager.fetch(attrs); } else { attrs.id = attrs.id.toString(); @@ -347,52 +343,4 @@ class DbCollection { } } -class IdentityManager { - constructor() { - this._nextId = 1; - this._ids = {}; - } - - get() { - return this._nextId; - } - - set(n) { - if (this._ids[n]) { - throw new Error(`Attempting to use the ID ${n}, but it's already been used`); - } - - if (isNumber(n) && +n >= this._nextId) { - this._nextId = +n + 1; - } - - this._ids[n] = true; - } - - inc() { - let nextValue = this.get() + 1; - - this._nextId = nextValue; - - return nextValue; - } - - fetch() { - let id = this.get(); - - this._ids[id] = true; - - this.inc(); - - return id.toString(); - } - - reset() { - this._nextId = 1; - this._ids = {}; - } -} - export default DbCollection; - -export { IdentityManager }; diff --git a/addon/db.js b/addon/db.js index e59e4abda..ec6fea6ae 100644 --- a/addon/db.js +++ b/addon/db.js @@ -1,4 +1,6 @@ import DbCollection from './db-collection'; +import IdentityManager from './identity-manager'; +import { singularize } from './utils/inflector'; /** * The db, an identity map. @@ -8,9 +10,11 @@ import DbCollection from './db-collection'; */ class Db { - constructor(initialData) { + constructor(initialData, identityManagers) { this._collections = []; + this.registerIdentityManagers(identityManagers); + if (initialData) { this.loadData(initialData); } @@ -47,7 +51,8 @@ class Db { */ createCollection(name, initialData) { if (!this[name]) { - let newCollection = new DbCollection(name, initialData); + let IdentityManager = this.identityManagerFor(name); + let newCollection = new DbCollection(name, initialData, IdentityManager); Object.defineProperty(this, name, { get() { @@ -89,6 +94,23 @@ class Db { emptyData() { this._collections.forEach((c) => c.remove()); } + + /** + * @method identityManagerFor + * @param name + * @public + */ + identityManagerFor(name) { + return this._identityManagers[singularize(name)] || this._identityManagers.application || IdentityManager; + } + + /** + * @method registerIdentityManagers + * @public + */ + registerIdentityManagers(identityManagers) { + this._identityManagers = identityManagers || {}; + } } export default Db; diff --git a/addon/identity-manager.js b/addon/identity-manager.js new file mode 100644 index 000000000..74e4e8e5c --- /dev/null +++ b/addon/identity-manager.js @@ -0,0 +1,80 @@ +function isNumber(n) { + return (+n).toString() === n.toString(); +} + +/** + * IdentityManager for a DbCollection + * @class + * @constructor + * @public + */ +class IdentityManager { + + constructor() { + this._nextId = 1; + this._ids = {}; + } + + /** + * @method get + * @private + */ + get() { + return this._nextId; + } + + /** + * @method set + * @param {String|Number} n + * @public + */ + set(n) { + if (this._ids[n]) { + throw new Error(`Attempting to use the ID ${n}, but it's already been used`); + } + + if (isNumber(n) && +n >= this._nextId) { + this._nextId = +n + 1; + } + + this._ids[n] = true; + } + + /** + * @method inc + * @private + */ + inc() { + let nextValue = this.get() + 1; + + this._nextId = nextValue; + + return nextValue; + } + + /** + * @method fetch + * @return {String} Unique identifier + * @public + */ + fetch() { + let id = this.get(); + + this._ids[id] = true; + + this.inc(); + + return id.toString(); + } + + /** + * @method reset + * @public + */ + reset() { + this._nextId = 1; + this._ids = {}; + } +} + +export default IdentityManager; diff --git a/addon/index.js b/addon/index.js index 251964a15..bed7f9d23 100644 --- a/addon/index.js +++ b/addon/index.js @@ -11,6 +11,7 @@ import JSONAPISerializer from './serializers/json-api-serializer'; import RestSerializer from './serializers/rest-serializer'; import HasMany from './orm/associations/has-many'; import BelongsTo from './orm/associations/belongs-to'; +import IdentityManager from './identity-manager'; function hasMany(...args) { return new HasMany(...args); @@ -32,7 +33,8 @@ export { JSONAPISerializer, RestSerializer, hasMany, - belongsTo + belongsTo, + IdentityManager }; export default { diff --git a/addon/server.js b/addon/server.js index 64027532d..77785beac 100644 --- a/addon/server.js +++ b/addon/server.js @@ -165,7 +165,12 @@ export default class Server { config.models = models; } - this.db = this.db || new Db(); + if (this.db) { + this.db.registerIdentityManagers(config.identityManagers); + } else { + this.db = new Db(undefined, config.identityManagers); + } + if (this.schema) { this.schema.registerModels(config.models); this.serializerOrRegistry.registerSerializers(config.serializers || {}); diff --git a/addon/utils/read-modules.js b/addon/utils/read-modules.js index 5abbd8c8d..11edbd9b9 100644 --- a/addon/utils/read-modules.js +++ b/addon/utils/read-modules.js @@ -15,10 +15,10 @@ const { assert } = Ember; a hash containing the names of the files as keys and the data as values. */ export default function(prefix) { - let modules = ['factories', 'fixtures', 'scenarios', 'models', 'serializers']; + let modules = ['factories', 'fixtures', 'scenarios', 'models', 'serializers', 'identity-managers']; let mirageModuleRegExp = new RegExp(`^${prefix}/mirage/(${modules.join('|')})`); let modulesMap = modules.reduce((memo, name) => { - memo[name] = {}; + memo[_camelCase(name)] = {}; return memo; }, {}); @@ -29,7 +29,7 @@ export default function(prefix) { return; } let moduleParts = moduleName.split('/'); - let moduleType = moduleParts[moduleParts.length - 2]; + let moduleType = _camelCase(moduleParts[moduleParts.length - 2]); let moduleKey = moduleParts[moduleParts.length - 1]; assert(`Subdirectories under ${moduleType} are not supported`, moduleParts[moduleParts.length - 3] === 'mirage'); diff --git a/blueprints/mirage-identity-manager/files/__root__/identity-managers/__name__.js b/blueprints/mirage-identity-manager/files/__root__/identity-managers/__name__.js new file mode 100644 index 000000000..8390e1057 --- /dev/null +++ b/blueprints/mirage-identity-manager/files/__root__/identity-managers/__name__.js @@ -0,0 +1,35 @@ +export default class { + /** + * Returns an unique identifier. + * + * @method fetch + * @param {Object} data Records attributes hash + * @return {String} Unique identifier + * @public + */ + fetch(data) { + + } + + /** + * Register an identifier. + * Must throw if identifier is already used. + * + * @method set + * @param {String|Number} id + * @public + */ + set(id) { + + } + + /** + * Reset identity manager. + * + * @method reset + * @public + */ + reset() { + + } +} diff --git a/blueprints/mirage-identity-manager/index.js b/blueprints/mirage-identity-manager/index.js new file mode 100644 index 000000000..0ffc209dc --- /dev/null +++ b/blueprints/mirage-identity-manager/index.js @@ -0,0 +1,20 @@ +/*jshint node:true*/ + +module.exports = { + description: 'Generates a Mirage identity manager', + + fileMapTokens: function() { + var self = this; + return { + __root__: function(options) { + if (!!self.project.config()['ember-cli-mirage'] && !!self.project.config()['ember-cli-mirage'].directory) { + return self.project.config()['ember-cli-mirage'].directory; + } else if (options.inAddon) { + return path.join('tests', 'dummy', 'mirage'); + } else { + return '/mirage'; + } + } + }; + } +}; diff --git a/tests/acceptance/contact-test.js b/tests/acceptance/contact-test.js index 673d05a10..ded258ee5 100644 --- a/tests/acceptance/contact-test.js +++ b/tests/acceptance/contact-test.js @@ -10,7 +10,7 @@ moduleForAcceptance('Acceptance | Contact', { }); test('I can view a contact', function(assert) { - visit('/1'); + visit(`${contact.id}`); andThen(function() { assert.equal(currentRouteName(), 'contact'); @@ -19,7 +19,7 @@ test('I can view a contact', function(assert) { }); test('I can delete a contact', function(assert) { - visit('/1'); + visit(`${contact.id}`); click('button:contains(Delete)'); andThen(function() { diff --git a/tests/acceptance/edit-test.js b/tests/acceptance/edit-test.js index c953c2328..bfbf7885c 100644 --- a/tests/acceptance/edit-test.js +++ b/tests/acceptance/edit-test.js @@ -4,9 +4,9 @@ import moduleForAcceptance from '../helpers/module-for-acceptance'; moduleForAcceptance('Acceptance | Edit'); test('I can edit a contact', function(assert) { - server.create('contact'); + let contact = server.create('contact'); - visit('/1'); + visit(`/${contact.id}`); click('button:contains(Edit)'); fillIn('input', 'Shiek'); click('button:contains(Save)'); @@ -16,4 +16,3 @@ test('I can edit a contact', function(assert) { assert.equal(find('p:first').text(), 'The contact is Shiek'); }); }); - diff --git a/tests/acceptance/identity-manager-test.js b/tests/acceptance/identity-manager-test.js new file mode 100644 index 000000000..2070bb4af --- /dev/null +++ b/tests/acceptance/identity-manager-test.js @@ -0,0 +1,9 @@ +import { test } from 'qunit'; +import moduleForAcceptance from '../../tests/helpers/module-for-acceptance'; + +moduleForAcceptance('Acceptance | identity manager'); + +test('uses custom identity manager', function(assert) { + let author = server.create('author'); + assert.equal(author.id, 'a'); +}); diff --git a/tests/dummy/mirage/identity-managers/author.js b/tests/dummy/mirage/identity-managers/author.js new file mode 100644 index 000000000..76f1564ad --- /dev/null +++ b/tests/dummy/mirage/identity-managers/author.js @@ -0,0 +1,57 @@ +export default class { + constructor() { + this.reset(); + } + + /** + * Returns an unique identifier. + * + * @method fetch + * @return {String} Unique identifier + * @public + */ + fetch() { + let alphabet = 'abcdefghijklmnopqrstuvwxyz'; + let id; + + if (this._nextId >= alphabet.length) { + throw new Error(`IdentityManager used for testing only supports ${alphabet.length} ids.`); + } + id = alphabet[this._nextId % alphabet.length]; + this._ids[id] = true; + this._nextId = this._nextid + 1; + return id; + } + + /** + * Register an identifier. + * Must throw if identifier is already used. + * + * @method set + * @param {String|Number} id + * @public + */ + set(id) { + if (typeof this._ids[id] !== 'undefined') { + throw new Error(`Id {id} is already used.`); + } + + this._ids[id] = true; + + let int = parseInt(id, 16); + if (!isNaN(int) && int > this._nextid) { + this._nextId = int; + } + } + + /** + * Reset identity manager. + * + * @method reset + * @public + */ + reset() { + this._nextId = 0; + this._ids = {}; + } +} diff --git a/tests/dummy/mirage/models/author.js b/tests/dummy/mirage/models/author.js new file mode 100644 index 000000000..3cc484b7a --- /dev/null +++ b/tests/dummy/mirage/models/author.js @@ -0,0 +1,5 @@ +import { Model } from 'ember-cli-mirage'; + +export default Model.extend({ + +}); diff --git a/tests/index-named-imports-test.js b/tests/index-named-imports-test.js index fc237be7b..d95c8291e 100644 --- a/tests/index-named-imports-test.js +++ b/tests/index-named-imports-test.js @@ -8,7 +8,8 @@ import { ActiveModelSerializer, JSONAPISerializer, hasMany, - belongsTo + belongsTo, + IdentityManager } from 'ember-cli-mirage'; test('Factory is present in named exports from ember-cli-mirage', function(assert) { @@ -37,3 +38,7 @@ test('relationship helpers are present in named exports from ember-cli-mirage', assert.ok(hasMany); assert.ok(belongsTo); }); + +test('IdentityManager ist present in named exports from ember-cli-mirage', function(assert) { + assert.ok(IdentityManager); +}); diff --git a/tests/integration/db/identity-manager-test.js b/tests/integration/db/identity-manager-test.js new file mode 100644 index 000000000..f99d780b0 --- /dev/null +++ b/tests/integration/db/identity-manager-test.js @@ -0,0 +1,88 @@ +import { module, test } from 'qunit'; +import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; +import Server from 'ember-cli-mirage/server'; +import DefaultIdentityManager from 'ember-cli-mirage/identity-manager'; + +const CustomIdentityManager = class { + constructor() { + this.wasCalled = false; + } + fetch() { + if (this.wasCalled) { + throw new Error('IdentityManager used for test only supports one call to fetch'); + } + this.wasCalled = true; + return 'custom-id'; + } + set(id) { + throw new Error('Not implemented for test.'); + } + reset() { + throw new Error('Not implemented for test.'); + } +}; + +module('Integration | Server | Factory creation', { + beforeEach() { + this.Post = Model.extend({ + author: belongsTo() + }); + this.Author = Model.extend({ + posts: hasMany() + }); + this.Comment = Model.extend({ + post: belongsTo() + }); + + this.server = new Server({ + environment: 'test', + identityManagers: { + post: DefaultIdentityManager, + author: CustomIdentityManager + }, + models: { + author: this.Author, + comment: this.Comment, + post: this.Post + } + }); + this.server.timing = 0; + this.server.logging = false; + }, + afterEach() { + this.server.shutdown(); + } +}); + +test('it uses identity managers defined by config', function(assert) { + let author = server.create('author'); + let comment = server.create('comment'); + let post = server.create('post'); + assert.equal(author.id, 'custom-id', 'custom identity manager defined in config is used'); + assert.equal(post.id, '1', 'ember-cli-mirage identity manager defined in config is used'); + assert.equal(comment.id, '1', 'falls back to ember-cli-mirage identity manager if no one is defined in config for model'); +}); + +test('attribute hash is passed to identity managers fetch method', function(assert) { + assert.expect(2); + + let dataForRecord = { + foo: 'bar' + }; + let IdentityManagerForTest = class { + fetch(data) { + assert.ok(data); + assert.deepEqual(data, dataForRecord); + } + }; + let serverForTest = new Server({ + environment: 'test', + identityManagers: { + application: IdentityManagerForTest + }, + models: { + foo: Model.extend() + } + }); + serverForTest.create('foo', dataForRecord); +}); diff --git a/tests/unit/db-test.js b/tests/unit/db-test.js index 13d9d43b2..b595b0a39 100644 --- a/tests/unit/db-test.js +++ b/tests/unit/db-test.js @@ -1,4 +1,5 @@ import Db from 'ember-cli-mirage/db'; +import DefaultIdentityManager from 'ember-cli-mirage/identity-manager'; import {module, test} from 'qunit'; @@ -595,3 +596,41 @@ test('does not require attrs', function(assert) { assert.equal(record.name, 'Luigi'); assert.ok(record.id); }); + +module('Unit | Db #registerIdentityManagers and #identityManagerFor'); + +test('identityManagerFor returns ember-cli-mirage default IdentityManager if there aren\'t any custom ones', function(assert) { + let db = new Db(); + assert.equal(db.identityManagerFor('foo'), DefaultIdentityManager); +}); + +test('it can register identity managers per db collection and for application', function(assert) { + let FooIdentityManager = class {}; + let ApplicationIdentityManager = class {}; + + let db = new Db(); + db.registerIdentityManagers({ + foo: FooIdentityManager, + application: ApplicationIdentityManager + }); + + assert.equal( + db.identityManagerFor('foo'), + FooIdentityManager, + 'it allows to declare an identity manager per db collection' + ); + assert.equal( + db.identityManagerFor('bar'), + ApplicationIdentityManager, + 'it falls back to application idenitity manager if there isn\'t one for a specific db collection' + ); +}); + +test('it can register idenitity managers on instantiation', function(assert) { + let CustomIdentityManager = class {}; + let db = new Db(undefined, { + foo: CustomIdentityManager + }); + assert.equal(db.identityManagerFor('foo'), CustomIdentityManager); + assert.equal(db.identityManagerFor('bar'), DefaultIdentityManager); +}); diff --git a/tests/unit/db/identity-manager-test.js b/tests/unit/db/identity-manager-test.js index 95cb37b8b..d3bbebbf6 100644 --- a/tests/unit/db/identity-manager-test.js +++ b/tests/unit/db/identity-manager-test.js @@ -1,8 +1,8 @@ -import { IdentityManager } from 'ember-cli-mirage/db-collection'; +import IdentityManager from 'ember-cli-mirage/identity-manager'; import {module, test} from 'qunit'; -module('Unit | DB | IdentityManager'); +module('Unit | Db | IdentityManager'); test('it can be instantiated', function(assert) { let manager = new IdentityManager(); From e74880901e4177f21d8a6bb22f69ac862015e728 Mon Sep 17 00:00:00 2001 From: Kelly Selden Date: Wed, 28 Jun 2017 23:50:59 -0700 Subject: [PATCH 049/879] remove unused gitkeep (#1119) --- tests/dummy/app/controllers/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tests/dummy/app/controllers/.gitkeep diff --git a/tests/dummy/app/controllers/.gitkeep b/tests/dummy/app/controllers/.gitkeep deleted file mode 100644 index e69de29bb..000000000 From 9abf0a6cc0084c8340290c72125afa7f78218c10 Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Fri, 30 Jun 2017 13:07:35 -0700 Subject: [PATCH 050/879] Remove broccoli-unwatched-tree dependency. (#1122) This package is unused in ember-cli-mirage (and it has been deprecated upstream). --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 2363680f9..d10e1f1e6 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,6 @@ "broccoli-funnel": "^1.0.2", "broccoli-merge-trees": "^1.1.0", "broccoli-stew": "^1.5.0", - "broccoli-unwatched-tree": "^0.1.1", "chalk": "^1.1.1", "ember-cli-babel": "^5.1.7", "ember-cli-node-assets": "^0.1.4", From 9fcc38c3f74f88539bb3167d5c94019cdb9b35e2 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 5 Jul 2017 10:47:14 -0400 Subject: [PATCH 051/879] Update changelog --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f428fa1e5..933f10ac9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Ember CLI Mirage Changelog +## 0.3.4 + +Update notes: none + +Changes: + + - [ENHANCEMENT][#1098](https://github.com/samselikoff/ember-cli-mirage/pull/1098) Fix for FastBoot 1.0 @simonihmig + - [ENHANCEMENT][#1102](https://github.com/samselikoff/ember-cli-mirage/pull/1102) Extend modelRegexp to match models in pod structure @dguettler + - [ENHANCEMENT][#1096](https://github.com/samselikoff/ember-cli-mirage/pull/1096) Fixed existence of `relationships.data` if `links` are defined @lancedikson + - [FEATURE][#1110](https://github.com/samselikoff/ember-cli-mirage/pull/1110) Expose database in serializer @zinyando + - [FEATURE][#977](https://github.com/samselikoff/ember-cli-mirage/pull/977) adds support for custom identity managers per application and model @jelhan + - General enhancements @samselikoff, @kellyselden, @rwjblue + ## 0.3.3 Update notes: none From d56c76ab5113df4f77adc28e294b952865a2af65 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 5 Jul 2017 10:47:20 -0400 Subject: [PATCH 052/879] 0.3.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d10e1f1e6..aa81ba258 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "0.3.3", + "version": "0.3.4", "description": "A client-side HTTP server to develop, test and demo your Ember app", "directories": { "doc": "doc", From 5da75536462259a641711e3018aa48f065db5a7b Mon Sep 17 00:00:00 2001 From: Eric Kelly Date: Fri, 7 Jul 2017 06:26:50 -0700 Subject: [PATCH 053/879] Replace "babel" -> "ember-cli-babel" (#1124) This satisfies the following deprecation warning: ``` DEPRECATION: Putting the "includePolyfill" option in "babel" is deprecated, please put it in "ember-cli-babel" instead. ``` --- ember-cli-build.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ember-cli-build.js b/ember-cli-build.js index 94fec27b6..f0319c514 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -4,7 +4,7 @@ var EmberAddon = require('ember-cli/lib/broccoli/ember-addon'); module.exports = function(defaults) { var app = new EmberAddon(defaults, { - babel: { + 'ember-cli-babel': { includePolyfill: true }, }); From 28e06fc34aed284ddfdb82bc96cb3ddc3719c8cd Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Mon, 10 Jul 2017 20:04:49 +0200 Subject: [PATCH 054/879] Update "ember-data" to v2.11.3 (#1127) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index aa81ba258..8d8c2d317 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "ember-cli-sri": "^2.1.0", "ember-cli-test-loader": "^1.1.0", "ember-cli-uglify": "^1.2.0", - "ember-data": "2.10.x", + "ember-data": "~2.11.0", "ember-disable-prototype-extensions": "^1.1.0", "ember-disable-proxy-controllers": "^1.0.1", "ember-export-application-global": "^1.0.5", From 299502e6b7ecaa217ba04fbf53f706a5767a49e0 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Tue, 11 Jul 2017 14:13:07 +0100 Subject: [PATCH 055/879] Add "yarn.lock" file (#1126) * Add "yarn.lock" file * CI: Use yarn instead of npm --- .travis.yml | 11 +- yarn.lock | 6138 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 6144 insertions(+), 5 deletions(-) create mode 100644 yarn.lock diff --git a/.travis.yml b/.travis.yml index 4e128bd50..c870479d7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,8 +9,8 @@ sudo: required dist: trusty cache: + yarn: true directories: - - $HOME/.npm - $HOME/.cache # includes bower's cache env: @@ -28,6 +28,8 @@ matrix: - env: EMBER_TRY_SCENARIO=ember-canary before_install: + - curl -o- -L https://yarnpkg.com/install.sh | bash + - export PATH=$HOME/.yarn/bin:$PATH - export CHROME_BIN=/usr/bin/google-chrome - export DISPLAY=:99.0 - sh -e /etc/init.d/xvfb start @@ -36,14 +38,13 @@ before_install: - wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb - sudo dpkg -i google-chrome*.deb - if [[ $(npm -v | cut -d '.' -f 1) -lt 3 ]]; then npm i -g npm@^3; fi - - npm config set spin false - - npm install -g bower phantomjs-prebuilt + - yarn global add bower phantomjs-prebuilt install: - - npm install + - yarn install --no-lockfile --non-interactive - bower install script: # Usually, it's ok to finish the test scenario without reverting # to the addon's original dependency state, skipping "cleanup". - - ember try:one $EMBER_TRY_SCENARIO test --skip-cleanup + - node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO test --skip-cleanup diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 000000000..98d8923ae --- /dev/null +++ b/yarn.lock @@ -0,0 +1,6138 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +abab@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d" + +abbrev@1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" + +accepts@1.3.3, accepts@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + dependencies: + mime-types "~2.1.11" + negotiator "0.6.1" + +acorn-globals@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" + dependencies: + acorn "^4.0.4" + +acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + dependencies: + acorn "^3.0.4" + +acorn@^3.0.4: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +acorn@^4.0.3, acorn@^4.0.4: + version "4.0.13" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + +acorn@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.1.tgz#53fe161111f912ab999ee887a90a0bc52822fd75" + +active-model-adapter@^2.0.3: + version "2.1.1" + resolved "https://registry.yarnpkg.com/active-model-adapter/-/active-model-adapter-2.1.1.tgz#ec088f391dc1cd4f163ad9ec0ecf61c69bc53613" + dependencies: + ember-cli-babel "^5.1.6" + +after@0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" + +ajv-keywords@^1.0.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" + +ajv@^4.7.0, ajv@^4.9.1: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +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" + +alter@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/alter/-/alter-0.2.0.tgz#c7588808617572034aae62480af26b1d4d1cb3cd" + dependencies: + stable "~0.1.3" + +amd-name-resolver@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-0.0.5.tgz#76962dac876ed3311b05d29c6a58c14e1ef3304b" + dependencies: + ensure-posix-path "^1.0.1" + +amd-name-resolver@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-0.0.6.tgz#d3e4ba2dfcaab1d820c1be9de947c67828cfe595" + dependencies: + ensure-posix-path "^1.0.1" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-escapes@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + +ansi-regex@^0.2.0, ansi-regex@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +ansi-styles@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-styles@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.1.0.tgz#09c202d5c917ec23188caa5c9cb9179cd9547750" + dependencies: + color-convert "^1.0.0" + +ansicolors@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" + +any-promise@^1.0.0, any-promise@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + +anymatch@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + dependencies: + arrify "^1.0.0" + micromatch "^2.1.5" + +aot-test-generators@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/aot-test-generators/-/aot-test-generators-0.1.0.tgz#43f0f615f97cb298d7919c1b0b4e6b7310b03cd0" + dependencies: + jsesc "^2.5.0" + +aproba@^1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" + +are-we-there-yet@~1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + +array-to-error@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-to-error/-/array-to-error-1.1.1.tgz#d68812926d14097a205579a667eeaf1856a44c07" + dependencies: + array-to-sentence "^1.1.0" + +array-to-sentence@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/array-to-sentence/-/array-to-sentence-1.1.0.tgz#c804956dafa53232495b205a9452753a258d39fc" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +arraybuffer.slice@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assertion-error@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" + +ast-traverse@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ast-traverse/-/ast-traverse-0.1.1.tgz#69cf2b8386f19dcda1bb1e05d68fe359d8897de6" + +ast-types@0.8.12: + version "0.8.12" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.12.tgz#a0d90e4351bb887716c83fd637ebf818af4adfcc" + +ast-types@0.8.15: + version "0.8.15" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.15.tgz#8eef0827f04dff0ec8857ba925abe3fea6194e52" + +ast-types@0.9.6: + version "0.9.6" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" + +async-disk-cache@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/async-disk-cache/-/async-disk-cache-1.3.2.tgz#ac53d6152843df202c9406e28d774362608d74dd" + dependencies: + debug "^2.1.3" + heimdalljs "^0.2.3" + istextorbinary "2.1.0" + mkdirp "^0.5.0" + rimraf "^2.5.3" + rsvp "^3.0.18" + username-sync "1.0.1" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async-promise-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-promise-queue/-/async-promise-queue-1.0.3.tgz#70c9c37635620f894978814b6c65e6e14e2573ee" + dependencies: + async "^2.4.1" + +async@^1.4.0, async@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@^2.4.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" + dependencies: + lodash "^4.14.0" + +async@~0.2.9: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +babel-code-frame@^6.16.0, babel-code-frame@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +babel-core@^5.0.0: + version "5.8.38" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-5.8.38.tgz#1fcaee79d7e61b750b00b8e54f6dfc9d0af86558" + dependencies: + babel-plugin-constant-folding "^1.0.1" + babel-plugin-dead-code-elimination "^1.0.2" + babel-plugin-eval "^1.0.1" + babel-plugin-inline-environment-variables "^1.0.1" + babel-plugin-jscript "^1.0.4" + babel-plugin-member-expression-literals "^1.0.1" + babel-plugin-property-literals "^1.0.1" + babel-plugin-proto-to-assign "^1.0.3" + babel-plugin-react-constant-elements "^1.0.3" + babel-plugin-react-display-name "^1.0.3" + babel-plugin-remove-console "^1.0.1" + babel-plugin-remove-debugger "^1.0.1" + babel-plugin-runtime "^1.0.7" + babel-plugin-undeclared-variables-check "^1.0.2" + babel-plugin-undefined-to-void "^1.1.6" + babylon "^5.8.38" + bluebird "^2.9.33" + chalk "^1.0.0" + convert-source-map "^1.1.0" + core-js "^1.0.0" + debug "^2.1.1" + detect-indent "^3.0.0" + esutils "^2.0.0" + fs-readdir-recursive "^0.1.0" + globals "^6.4.0" + home-or-tmp "^1.0.0" + is-integer "^1.0.4" + js-tokens "1.0.1" + json5 "^0.4.0" + lodash "^3.10.0" + minimatch "^2.0.3" + output-file-sync "^1.1.0" + path-exists "^1.0.0" + path-is-absolute "^1.0.0" + private "^0.1.6" + regenerator "0.8.40" + regexpu "^1.3.0" + repeating "^1.1.2" + resolve "^1.1.6" + shebang-regex "^1.0.0" + slash "^1.0.0" + source-map "^0.5.0" + source-map-support "^0.2.10" + to-fast-properties "^1.0.0" + trim-right "^1.0.0" + try-resolve "^1.0.0" + +babel-core@^6.14.0, babel-core@^6.24.1: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.25.0.tgz#7dd42b0463c742e9d5296deb3ec67a9322dad729" + dependencies: + babel-code-frame "^6.22.0" + babel-generator "^6.25.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.25.0" + babel-traverse "^6.25.0" + babel-types "^6.25.0" + babylon "^6.17.2" + convert-source-map "^1.1.0" + debug "^2.1.1" + json5 "^0.5.0" + lodash "^4.2.0" + minimatch "^3.0.2" + path-is-absolute "^1.0.0" + private "^0.1.6" + slash "^1.0.0" + source-map "^0.5.0" + +babel-generator@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.25.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-constant-folding@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-constant-folding/-/babel-plugin-constant-folding-1.0.1.tgz#8361d364c98e449c3692bdba51eff0844290aa8e" + +babel-plugin-dead-code-elimination@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz#5f7c451274dcd7cccdbfbb3e0b85dd28121f0f65" + +babel-plugin-debug-macros@^0.1.11, babel-plugin-debug-macros@^0.1.6: + version "0.1.11" + resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.1.11.tgz#6c562bf561fccd406ce14ab04f42c218cf956605" + dependencies: + semver "^5.3.0" + +babel-plugin-ember-modules-api-polyfill@^1.4.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-1.4.2.tgz#e254f8ed0ba7cf32ea6a71c4770b3568a8577402" + dependencies: + ember-rfc176-data "^0.2.0" + +babel-plugin-eval@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz#a2faed25ce6be69ade4bfec263f70169195950da" + +babel-plugin-feature-flags@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/babel-plugin-feature-flags/-/babel-plugin-feature-flags-0.2.3.tgz#81d81ed77bda2014098fa8243abcf03a551cbd4d" + dependencies: + json-stable-stringify "^1.0.1" + +babel-plugin-filter-imports@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-0.2.1.tgz#784f96a892f2f7ed2ccf0955688bd8916cd2e212" + dependencies: + json-stable-stringify "^1.0.1" + +babel-plugin-htmlbars-inline-precompile@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.1.0.tgz#b784723bd1f108796b56faf9f1c05eb5ca442983" + +babel-plugin-inline-environment-variables@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz#1f58ce91207ad6a826a8bf645fafe68ff5fe3ffe" + +babel-plugin-jscript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/babel-plugin-jscript/-/babel-plugin-jscript-1.0.4.tgz#8f342c38276e87a47d5fa0a8bd3d5eb6ccad8fcc" + +babel-plugin-member-expression-literals@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz#cc5edb0faa8dc927170e74d6d1c02440021624d3" + +babel-plugin-property-literals@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz#0252301900192980b1c118efea48ce93aab83336" + +babel-plugin-proto-to-assign@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz#c49e7afd02f577bc4da05ea2df002250cf7cd123" + dependencies: + lodash "^3.9.3" + +babel-plugin-react-constant-elements@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/babel-plugin-react-constant-elements/-/babel-plugin-react-constant-elements-1.0.3.tgz#946736e8378429cbc349dcff62f51c143b34e35a" + +babel-plugin-react-display-name@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/babel-plugin-react-display-name/-/babel-plugin-react-display-name-1.0.3.tgz#754fe38926e8424a4e7b15ab6ea6139dee0514fc" + +babel-plugin-remove-console@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-remove-console/-/babel-plugin-remove-console-1.0.1.tgz#d8f24556c3a05005d42aaaafd27787f53ff013a7" + +babel-plugin-remove-debugger@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-remove-debugger/-/babel-plugin-remove-debugger-1.0.1.tgz#fd2ea3cd61a428ad1f3b9c89882ff4293e8c14c7" + +babel-plugin-runtime@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz#bf7c7d966dd56ecd5c17fa1cb253c9acb7e54aaf" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + +babel-plugin-transform-async-to-generator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-plugin-transform-es2015-classes@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-modules-systemjs@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-regenerator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" + dependencies: + regenerator-transform "0.9.11" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-undeclared-variables-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-undeclared-variables-check/-/babel-plugin-undeclared-variables-check-1.0.2.tgz#5cf1aa539d813ff64e99641290af620965f65dee" + dependencies: + leven "^1.0.2" + +babel-plugin-undefined-to-void@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz#7f578ef8b78dfae6003385d8417a61eda06e2f81" + +babel-polyfill@^6.16.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" + dependencies: + babel-runtime "^6.22.0" + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-preset-env@^1.2.0, babel-preset-env@^1.5.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.0.tgz#2de1c782a780a0a5d605d199c957596da43c44e4" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^2.1.2" + invariant "^2.2.2" + semver "^5.3.0" + +babel-register@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" + dependencies: + babel-core "^6.24.1" + babel-runtime "^6.22.0" + core-js "^2.4.0" + home-or-tmp "^2.0.0" + lodash "^4.2.0" + mkdirp "^0.5.1" + source-map-support "^0.4.2" + +babel-runtime@^6.18.0, babel-runtime@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-template@^6.24.1, babel-template@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.25.0" + babel-types "^6.25.0" + babylon "^6.17.2" + lodash "^4.2.0" + +babel-traverse@^6.24.1, babel-traverse@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1" + dependencies: + babel-code-frame "^6.22.0" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.25.0" + babylon "^6.17.2" + debug "^2.2.0" + globals "^9.0.0" + invariant "^2.2.0" + lodash "^4.2.0" + +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e" + dependencies: + babel-runtime "^6.22.0" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + +babel5-plugin-strip-class-callcheck@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/babel5-plugin-strip-class-callcheck/-/babel5-plugin-strip-class-callcheck-5.1.0.tgz#77d4a40c8614d367b8a21a53908159806dba5f91" + +babel5-plugin-strip-heimdall@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/babel5-plugin-strip-heimdall/-/babel5-plugin-strip-heimdall-5.0.2.tgz#e1fe191c34de79686564d50a86f4217b8df629c1" + +babylon@^5.8.38: + version "5.8.38" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-5.8.38.tgz#ec9b120b11bf6ccd4173a18bf217e60b79859ffd" + +babylon@^6.17.2: + version "6.17.4" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.4.tgz#3e8b7402b88d22c3423e137a1577883b15ff869a" + +backbone@^1.1.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.3.3.tgz#4cc80ea7cb1631ac474889ce40f2f8bc683b2999" + dependencies: + underscore ">=1.8.3" + +backo2@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +base64-arraybuffer@0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + +base64id@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-0.1.0.tgz#02ce0fdeee0cef4f40080e1e73e834f0b1bfce3f" + +basic-auth@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.1.0.tgz#45221ee429f7ee1e5035be3f51533f1cdfd29884" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +better-assert@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + dependencies: + callsite "1.0.0" + +binary-extensions@^1.0.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" + +"binaryextensions@1 || 2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.0.0.tgz#e597d1a7a6a3558a2d1c7241a16c99965e6aa40f" + +blank-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/blank-object/-/blank-object-1.0.2.tgz#f990793fbe9a8c8dd013fb3219420bec81d5f4b9" + +blob@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^2.9.33: + version "2.11.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" + +bluebird@^3.1.1, bluebird@^3.4.6: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" + +body-parser@^1.2.0: + version "1.17.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.2.tgz#f8892abc8f9e627d42aedafbca66bf5ab99104ee" + dependencies: + bytes "2.4.0" + content-type "~1.0.2" + debug "2.6.7" + depd "~1.1.0" + http-errors "~1.6.1" + iconv-lite "0.4.15" + on-finished "~2.3.0" + qs "6.4.0" + raw-body "~2.2.0" + type-is "~1.6.15" + +body@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/body/-/body-5.1.0.tgz#e4ba0ce410a46936323367609ecb4e6553125069" + dependencies: + continuable-cache "^0.3.1" + error "^7.0.0" + raw-body "~1.1.0" + safe-json-parse "~1.0.1" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +bower-config@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/bower-config/-/bower-config-1.4.0.tgz#16c38c1135f8071c19f25938d61b0d8cbf18d3f1" + dependencies: + graceful-fs "^4.1.3" + mout "^1.0.0" + optimist "^0.6.1" + osenv "^0.1.3" + untildify "^2.1.0" + +bower-endpoint-parser@0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz#00b565adbfab6f2d35addde977e97962acbcb3f6" + +bower@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/bower/-/bower-1.8.0.tgz#55dbebef0ad9155382d9e9d3e497c1372345b44a" + +brace-expansion@^1.0.0, brace-expansion@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +breakable@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/breakable/-/breakable-1.0.0.tgz#784a797915a38ead27bad456b5572cb4bbaa78c1" + +broccoli-asset-rev@^2.4.5: + version "2.5.0" + resolved "https://registry.yarnpkg.com/broccoli-asset-rev/-/broccoli-asset-rev-2.5.0.tgz#f5f66eac962bf9f086286921f0eaeaab6d00d819" + dependencies: + broccoli-asset-rewrite "^1.1.0" + broccoli-filter "^1.2.2" + json-stable-stringify "^1.0.0" + matcher-collection "^1.0.1" + rsvp "^3.0.6" + +broccoli-asset-rewrite@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/broccoli-asset-rewrite/-/broccoli-asset-rewrite-1.1.0.tgz#77a5da56157aa318c59113245e8bafb4617f8830" + dependencies: + broccoli-filter "^1.2.3" + +broccoli-babel-transpiler@^5.5.0, broccoli-babel-transpiler@^5.6.2: + version "5.7.1" + resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-5.7.1.tgz#e10d831faed1c57e37272e4223748ba71a7926d1" + dependencies: + babel-core "^5.0.0" + broccoli-funnel "^1.0.0" + broccoli-merge-trees "^1.0.0" + broccoli-persistent-filter "^1.4.2" + clone "^0.2.0" + hash-for-dep "^1.0.2" + heimdalljs-logger "^0.1.7" + json-stable-stringify "^1.0.0" + rsvp "^3.5.0" + workerpool "^2.2.1" + +broccoli-babel-transpiler@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.1.1.tgz#938f470e1ddb47047a77ef5e38f34c21de0e85a8" + dependencies: + babel-core "^6.14.0" + broccoli-funnel "^1.0.0" + broccoli-merge-trees "^1.0.0" + broccoli-persistent-filter "^1.4.0" + clone "^2.0.0" + hash-for-dep "^1.0.2" + heimdalljs-logger "^0.1.7" + json-stable-stringify "^1.0.0" + rsvp "^3.5.0" + workerpool "^2.2.1" + +broccoli-brocfile-loader@^0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/broccoli-brocfile-loader/-/broccoli-brocfile-loader-0.18.0.tgz#2e86021c805c34ffc8d29a2fb721cf273e819e4b" + dependencies: + findup-sync "^0.4.2" + +broccoli-builder@^0.18.3: + version "0.18.8" + resolved "https://registry.yarnpkg.com/broccoli-builder/-/broccoli-builder-0.18.8.tgz#fe54694d544c3cdfdb01028e802eeca65749a879" + dependencies: + heimdalljs "^0.2.0" + promise-map-series "^0.2.1" + quick-temp "^0.1.2" + rimraf "^2.2.8" + rsvp "^3.0.17" + silent-error "^1.0.1" + +broccoli-caching-writer@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/broccoli-caching-writer/-/broccoli-caching-writer-2.3.1.tgz#b93cf58f9264f003075868db05774f4e7f25bd07" + dependencies: + broccoli-kitchen-sink-helpers "^0.2.5" + broccoli-plugin "1.1.0" + debug "^2.1.1" + rimraf "^2.2.8" + rsvp "^3.0.17" + walk-sync "^0.2.5" + +broccoli-caching-writer@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/broccoli-caching-writer/-/broccoli-caching-writer-3.0.3.tgz#0bd2c96a9738d6a6ab590f07ba35c5157d7db476" + dependencies: + broccoli-kitchen-sink-helpers "^0.3.1" + broccoli-plugin "^1.2.1" + debug "^2.1.1" + rimraf "^2.2.8" + rsvp "^3.0.17" + walk-sync "^0.3.0" + +broccoli-clean-css@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/broccoli-clean-css/-/broccoli-clean-css-1.1.0.tgz#9db143d9af7e0ae79c26e3ac5a9bb2d720ea19fa" + dependencies: + broccoli-persistent-filter "^1.1.6" + clean-css-promise "^0.1.0" + inline-source-map-comment "^1.0.5" + json-stable-stringify "^1.0.0" + +broccoli-concat@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.2.2.tgz#86ffdc52606eb590ba9f6b894c5ec7a016f5b7b9" + dependencies: + broccoli-kitchen-sink-helpers "^0.3.1" + broccoli-plugin "^1.3.0" + broccoli-stew "^1.3.3" + ensure-posix-path "^1.0.2" + fast-sourcemap-concat "^1.0.1" + find-index "^1.1.0" + fs-extra "^1.0.0" + fs-tree-diff "^0.5.6" + lodash.merge "^4.3.0" + lodash.omit "^4.1.0" + lodash.uniq "^4.2.0" + walk-sync "^0.3.1" + +broccoli-config-loader@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/broccoli-config-loader/-/broccoli-config-loader-1.0.1.tgz#d10aaf8ebc0cb45c1da5baa82720e1d88d28c80a" + dependencies: + broccoli-caching-writer "^3.0.3" + +broccoli-config-replace@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/broccoli-config-replace/-/broccoli-config-replace-1.1.2.tgz#6ea879d92a5bad634d11329b51fc5f4aafda9c00" + dependencies: + broccoli-kitchen-sink-helpers "^0.3.1" + broccoli-plugin "^1.2.0" + debug "^2.2.0" + fs-extra "^0.24.0" + +broccoli-debug@^0.6.1, broccoli-debug@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.2.tgz#4c6e89459fc3de7d5d4fc7b77e57f46019f44db1" + dependencies: + broccoli-plugin "^1.2.1" + fs-tree-diff "^0.5.2" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + minimatch "^3.0.3" + symlink-or-copy "^1.1.8" + tree-sync "^1.2.2" + +broccoli-file-creator@^1.0.0, broccoli-file-creator@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/broccoli-file-creator/-/broccoli-file-creator-1.1.1.tgz#1b35b67d215abdfadd8d49eeb69493c39e6c3450" + dependencies: + broccoli-kitchen-sink-helpers "~0.2.0" + broccoli-plugin "^1.1.0" + broccoli-writer "~0.1.1" + mkdirp "^0.5.1" + rsvp "~3.0.6" + symlink-or-copy "^1.0.1" + +broccoli-filter@^1.2.2, broccoli-filter@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/broccoli-filter/-/broccoli-filter-1.2.4.tgz#409afb94b9a3a6da9fac8134e91e205f40cc7330" + dependencies: + broccoli-kitchen-sink-helpers "^0.3.1" + broccoli-plugin "^1.0.0" + copy-dereference "^1.0.0" + debug "^2.2.0" + mkdirp "^0.5.1" + promise-map-series "^0.2.1" + rsvp "^3.0.18" + symlink-or-copy "^1.0.1" + walk-sync "^0.3.1" + +broccoli-funnel-reducer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/broccoli-funnel-reducer/-/broccoli-funnel-reducer-1.0.0.tgz#11365b2a785aec9b17972a36df87eef24c5cc0ea" + +broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.2, broccoli-funnel@^1.0.6, broccoli-funnel@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-1.2.0.tgz#cddc3afc5ff1685a8023488fff74ce6fb5a51296" + dependencies: + array-equal "^1.0.0" + blank-object "^1.0.1" + broccoli-plugin "^1.3.0" + debug "^2.2.0" + exists-sync "0.0.4" + fast-ordered-set "^1.0.0" + fs-tree-diff "^0.5.3" + heimdalljs "^0.2.0" + minimatch "^3.0.0" + mkdirp "^0.5.0" + path-posix "^1.0.0" + rimraf "^2.4.3" + symlink-or-copy "^1.0.0" + walk-sync "^0.3.1" + +broccoli-kitchen-sink-helpers@^0.2.5, broccoli-kitchen-sink-helpers@~0.2.0: + version "0.2.9" + resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz#a5e0986ed8d76fb5984b68c3f0450d3a96e36ecc" + dependencies: + glob "^5.0.10" + mkdirp "^0.5.1" + +broccoli-kitchen-sink-helpers@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.3.1.tgz#77c7c18194b9664163ec4fcee2793444926e0c06" + dependencies: + glob "^5.0.10" + mkdirp "^0.5.1" + +broccoli-lint-eslint@^3.1.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/broccoli-lint-eslint/-/broccoli-lint-eslint-3.3.1.tgz#35c675546a5a7ad8f3319edd732e3aad8ca241de" + dependencies: + aot-test-generators "^0.1.0" + broccoli-concat "^3.2.2" + broccoli-persistent-filter "^1.2.0" + eslint "^3.0.0" + json-stable-stringify "^1.0.1" + lodash.defaultsdeep "^4.6.0" + md5-hex "^2.0.0" + +broccoli-merge-trees@^1.0.0, broccoli-merge-trees@^1.1.0, broccoli-merge-trees@^1.1.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-1.2.4.tgz#a001519bb5067f06589d91afa2942445a2d0fdb5" + dependencies: + broccoli-plugin "^1.3.0" + can-symlink "^1.0.0" + fast-ordered-set "^1.0.2" + fs-tree-diff "^0.5.4" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + rimraf "^2.4.3" + symlink-or-copy "^1.0.0" + +broccoli-merge-trees@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-2.0.0.tgz#10aea46dd5cebcc8b8f7d5a54f0a84a4f0bb90b9" + dependencies: + broccoli-plugin "^1.3.0" + merge-trees "^1.0.1" + +broccoli-middleware@^1.0.0-beta.8: + version "1.0.0" + resolved "https://registry.yarnpkg.com/broccoli-middleware/-/broccoli-middleware-1.0.0.tgz#92f4e1fb9a791ea986245a7077f35cc648dab097" + dependencies: + handlebars "^4.0.4" + mime "^1.2.11" + +broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.2.0, broccoli-persistent-filter@^1.4.0, broccoli-persistent-filter@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.2.tgz#17af1278a25ff2556f9d7d23e115accfad3a7ce7" + dependencies: + async-disk-cache "^1.2.1" + async-promise-queue "^1.0.3" + broccoli-plugin "^1.0.0" + crypto "0.0.3" + fs-tree-diff "^0.5.2" + hash-for-dep "^1.0.2" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + mkdirp "^0.5.1" + promise-map-series "^0.2.1" + rimraf "^2.6.1" + rsvp "^3.0.18" + symlink-or-copy "^1.0.1" + walk-sync "^0.3.1" + +broccoli-plugin@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.1.0.tgz#73e2cfa05f8ea1e3fc1420c40c3d9e7dc724bf02" + dependencies: + promise-map-series "^0.2.1" + quick-temp "^0.1.3" + rimraf "^2.3.4" + symlink-or-copy "^1.0.1" + +broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli-plugin@^1.2.1, broccoli-plugin@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.0.tgz#bee704a8e42da08cb58e513aaa436efb7f0ef1ee" + dependencies: + promise-map-series "^0.2.1" + quick-temp "^0.1.3" + rimraf "^2.3.4" + symlink-or-copy "^1.1.8" + +broccoli-slow-trees@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-3.0.1.tgz#9bf2a9e2f8eb3ed3a3f2abdde988da437ccdc9b4" + dependencies: + heimdalljs "^0.2.1" + +broccoli-source@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/broccoli-source/-/broccoli-source-1.1.0.tgz#54f0e82c8b73f46580cbbc4f578f0b32fca8f809" + +broccoli-sri-hash@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/broccoli-sri-hash/-/broccoli-sri-hash-2.1.2.tgz#bc69905ed7a381ad325cc0d02ded071328ebf3f3" + dependencies: + broccoli-caching-writer "^2.2.0" + mkdirp "^0.5.1" + rsvp "^3.1.0" + sri-toolbox "^0.2.0" + symlink-or-copy "^1.0.1" + +broccoli-stew@^1.2.0, broccoli-stew@^1.3.3, broccoli-stew@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-1.5.0.tgz#d7af8c18511dce510e49d308a62e5977f461883c" + dependencies: + broccoli-debug "^0.6.1" + broccoli-funnel "^1.0.1" + broccoli-merge-trees "^1.0.0" + broccoli-persistent-filter "^1.1.6" + broccoli-plugin "^1.3.0" + chalk "^1.1.3" + debug "^2.4.0" + ensure-posix-path "^1.0.1" + fs-extra "^2.0.0" + minimatch "^3.0.2" + resolve "^1.1.6" + rsvp "^3.0.16" + symlink-or-copy "^1.1.8" + walk-sync "^0.3.0" + +broccoli-string-replace@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/broccoli-string-replace/-/broccoli-string-replace-0.1.2.tgz#1ed92f85680af8d503023925e754e4e33676b91f" + dependencies: + broccoli-persistent-filter "^1.1.5" + minimatch "^3.0.3" + +broccoli-uglify-sourcemap@^1.0.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/broccoli-uglify-sourcemap/-/broccoli-uglify-sourcemap-1.5.2.tgz#04f84ab0db539031fa868ccfa563c9932d50cedb" + dependencies: + broccoli-plugin "^1.2.1" + debug "^2.2.0" + lodash.merge "^4.5.1" + matcher-collection "^1.0.0" + mkdirp "^0.5.0" + source-map-url "^0.3.0" + symlink-or-copy "^1.0.1" + uglify-js "^2.7.0" + walk-sync "^0.1.3" + +broccoli-unwatched-tree@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/broccoli-unwatched-tree/-/broccoli-unwatched-tree-0.1.1.tgz#4312fde04bdafe67a05a967d72cc50b184a9f514" + +broccoli-writer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/broccoli-writer/-/broccoli-writer-0.1.1.tgz#d4d71aa8f2afbc67a3866b91a2da79084b96ab2d" + dependencies: + quick-temp "^0.1.0" + rsvp "^3.0.6" + +browser-stdout@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + +browserslist@^2.1.2: + version "2.1.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.1.5.tgz#e882550df3d1cd6d481c1a3e0038f2baf13a4711" + dependencies: + caniuse-lite "^1.0.30000684" + electron-to-chromium "^1.3.14" + +bser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + dependencies: + node-int64 "^0.4.0" + +builtins@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + +bytes@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8" + +bytes@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.3.0.tgz#d5b680a165b6201739acb611542aabc2d8ceb070" + +bytes@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" + +calculate-cache-key-for-tree@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-1.1.0.tgz#0c3e42c9c134f3c9de5358c0f16793627ea976d6" + dependencies: + json-stable-stringify "^1.0.1" + +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + dependencies: + callsites "^0.2.0" + +callsite@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + +camelcase@^1.0.2, camelcase@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +can-symlink@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/can-symlink/-/can-symlink-1.0.0.tgz#97b607d8a84bb6c6e228b902d864ecb594b9d219" + dependencies: + tmp "0.0.28" + +caniuse-lite@^1.0.30000684: + version "1.0.30000697" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000697.tgz#125fb00604b63fbb188db96a667ce2922dcd6cdd" + +capture-exit@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" + dependencies: + rsvp "^3.3.3" + +cardinal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-1.0.0.tgz#50e21c1b0aa37729f9377def196b5a9cec932ee9" + dependencies: + ansicolors "~0.2.1" + redeyed "~1.0.0" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +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" + +chai@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.0.2.tgz#2f7327c4de6f385dd7787999e2ab02697a32b83b" + dependencies: + assertion-error "^1.0.1" + check-error "^1.0.1" + deep-eql "^2.0.1" + get-func-name "^2.0.0" + pathval "^1.0.0" + type-detect "^4.0.0" + +chalk@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" + dependencies: + ansi-styles "^1.1.0" + escape-string-regexp "^1.0.0" + has-ansi "^0.1.0" + strip-ansi "^0.3.0" + supports-color "^0.2.0" + +chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +charm@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/charm/-/charm-1.0.2.tgz#8add367153a6d9a581331052c4090991da995e35" + dependencies: + inherits "^2.0.1" + +check-error@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + +chokidar@1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +circular-json@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" + +clean-base-url@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clean-base-url/-/clean-base-url-1.0.0.tgz#c901cf0a20b972435b0eccd52d056824a4351b7b" + +clean-css-promise@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/clean-css-promise/-/clean-css-promise-0.1.1.tgz#43f3d2c8dfcb2bf071481252cd9b76433c08eecb" + dependencies: + array-to-error "^1.0.0" + clean-css "^3.4.5" + pinkie-promise "^2.0.0" + +clean-css@^3.4.5: + version "3.4.27" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.4.27.tgz#adef75b31c160ffa5d72f4de67966e2660c1a255" + dependencies: + commander "2.8.x" + source-map "0.4.x" + +cli-cursor@^1.0.1, cli-cursor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + dependencies: + restore-cursor "^1.0.1" + +cli-spinners@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" + +cli-table2@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/cli-table2/-/cli-table2-0.2.0.tgz#2d1ef7f218a0e786e214540562d4bd177fe32d97" + dependencies: + lodash "^3.10.1" + string-width "^1.0.1" + optionalDependencies: + colors "^1.1.2" + +cli-table@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + dependencies: + colors "1.0.3" + +cli-width@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" + +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" + +clone@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" + +clone@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +color-convert@^1.0.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" + dependencies: + color-name "^1.1.1" + +color-name@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.2.tgz#5c8ab72b64bd2215d617ae9559ebb148475cf98d" + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + +colors@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06" + +commander@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873" + +commander@2.8.x: + version "2.8.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" + dependencies: + graceful-readlink ">= 1.0.0" + +commander@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +commander@^2.5.0, commander@^2.6.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + +commoner@~0.10.3: + version "0.10.8" + resolved "https://registry.yarnpkg.com/commoner/-/commoner-0.10.8.tgz#34fc3672cd24393e8bb47e70caa0293811f4f2c5" + dependencies: + commander "^2.5.0" + detective "^4.3.1" + glob "^5.0.15" + graceful-fs "^4.1.2" + iconv-lite "^0.4.5" + mkdirp "^0.5.0" + private "^0.1.6" + q "^1.1.2" + recast "^0.11.17" + +component-bind@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + +component-emitter@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" + +component-emitter@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + +component-inherit@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + +compressible@~2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.10.tgz#feda1c7f7617912732b29bf8cf26252a20b9eecd" + dependencies: + mime-db ">= 1.27.0 < 2" + +compression@^1.4.4: + version "1.6.2" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.6.2.tgz#cceb121ecc9d09c52d7ad0c3350ea93ddd402bc3" + dependencies: + accepts "~1.3.3" + bytes "2.3.0" + compressible "~2.0.8" + debug "~2.2.0" + on-headers "~1.0.1" + vary "~1.1.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@^1.4.7, concat-stream@^1.5.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + dependencies: + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +configstore@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.0.tgz#45df907073e26dfa1cf4b2d52f5b60545eaa11d1" + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +console-ui@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/console-ui/-/console-ui-1.0.3.tgz#31c524461b63422769f9e89c173495d91393721c" + dependencies: + chalk "^1.1.3" + inquirer "^1.2.3" + ora "^0.2.0" + through "^2.3.8" + +consolidate@^0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.14.5.tgz#5a25047bc76f73072667c8cb52c989888f494c63" + dependencies: + bluebird "^3.1.1" + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + +content-type-parser@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.1.tgz#c3e56988c53c65127fb46d4032a3a900246fdc94" + +content-type@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" + +continuable-cache@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f" + +convert-source-map@^1.1.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +copy-dereference@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/copy-dereference/-/copy-dereference-1.0.0.tgz#6b131865420fd81b413ba994b44d3655311152b6" + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + +core-js@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" + +core-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/core-object/-/core-object-1.1.0.tgz#86d63918733cf9da1a5aae729e62c0a88e66ad0a" + +core-object@^2.0.6: + version "2.1.1" + resolved "https://registry.yarnpkg.com/core-object/-/core-object-2.1.1.tgz#4b7a5f1edefcb1e6d0dcb58eab1b9f90bfc666a8" + dependencies: + chalk "^1.1.3" + +core-object@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/core-object/-/core-object-3.1.3.tgz#df399b3311bdb0c909e8aae8929fc3c1c4b25880" + dependencies: + chalk "^1.1.3" + +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" + +cpr@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cpr/-/cpr-2.1.0.tgz#a1b7baaa111cfbe55260772100a0296ec9d4a29d" + dependencies: + graceful-fs "^4.1.5" + minimist "^1.2.0" + mkdirp "~0.5.1" + rimraf "^2.5.4" + +cross-spawn@^5.0.1, cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + +crypto@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/crypto/-/crypto-0.0.3.tgz#470a81b86be4c5ee17acc8207a1f5315ae20dbb0" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + +"cssstyle@>= 0.2.37 < 0.3.0": + version "0.2.37" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + dependencies: + cssom "0.3.x" + +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + dependencies: + es5-ext "^0.10.9" + +dag-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dag-map/-/dag-map-2.0.2.tgz#9714b472de82a1843de2fba9b6876938cab44c68" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +debug@2.2.0, debug@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +debug@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" + dependencies: + ms "0.7.2" + +debug@2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" + dependencies: + ms "0.7.2" + +debug@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e" + dependencies: + ms "2.0.0" + +debug@2.6.8, debug@^2.1.0, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.4.0, debug@~2.6.7: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + dependencies: + ms "2.0.0" + +decamelize@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-eql@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-2.0.2.tgz#b1bac06e56f0a76777686d50c9feb75c2ed7679a" + dependencies: + type-detect "^3.0.0" + +deep-extend@~0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + +defs@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/defs/-/defs-1.1.1.tgz#b22609f2c7a11ba7a3db116805c139b1caffa9d2" + dependencies: + alter "~0.2.0" + ast-traverse "~0.1.1" + breakable "~1.0.0" + esprima-fb "~15001.1001.0-dev-harmony-fb" + simple-fmt "~0.1.0" + simple-is "~0.2.0" + stringmap "~0.2.2" + stringset "~0.2.1" + tryor "~0.1.2" + yargs "~3.27.0" + +del@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +depd@1.1.0, depd@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +detect-file@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" + dependencies: + fs-exists-sync "^0.1.0" + +detect-indent@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-3.0.1.tgz#9dc5e5ddbceef8325764b9451b02bc6d54084f75" + dependencies: + get-stdin "^4.0.1" + minimist "^1.1.0" + repeating "^1.1.0" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +detective@^4.3.1: + version "4.5.0" + resolved "https://registry.yarnpkg.com/detective/-/detective-4.5.0.tgz#6e5a8c6b26e6c7a254b1c6b6d7490d98ec91edd1" + dependencies: + acorn "^4.0.3" + defined "^1.0.0" + +diff@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" + +diff@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + +diff@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.0.tgz#056695150d7aa93237ca7e378ac3b1682b7963b9" + +doctrine@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +dot-prop@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.1.1.tgz#a8493f0b7b5eeec82525b5c7587fa7de7ca859c1" + dependencies: + is-obj "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +editions@^1.1.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.3.tgz#0907101bdda20fac3cbe334c27cbd0688dc99a5b" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +electron-to-chromium@^1.3.14: + version "1.3.15" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.15.tgz#08397934891cbcfaebbd18b82a95b5a481138369" + +ember-ajax@^2.4.1: + version "2.5.6" + resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-2.5.6.tgz#a75f743ccf1b95e979a5cf96013b3dba8fa625e4" + dependencies: + ember-cli-babel "^5.1.5" + +ember-cli-addon-tests@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/ember-cli-addon-tests/-/ember-cli-addon-tests-0.7.0.tgz#c7ad8f839f22ad1b3c22a4b993df6c0f691324ef" + dependencies: + chalk "^1.1.3" + cpr "^2.0.0" + debug "^2.2.0" + exists-sync "0.0.4" + findup-sync "^1.0.0" + fs-extra "^3.0.0" + fs-promise "^2.0.0" + lodash "^4.0.0" + mkdirp "^0.5.1" + rsvp "^3.1.0" + semver "^5.3.0" + symlink-or-copy "^1.1.3" + temp "^0.8.3" + +ember-cli-app-version@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ember-cli-app-version/-/ember-cli-app-version-2.0.2.tgz#aaeede608e92fae6c2e11f63d28a373c1cc3f070" + dependencies: + ember-cli-babel "^5.1.6" + ember-cli-htmlbars "^1.0.0" + git-repo-version "0.4.1" + +ember-cli-babel@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.1.0.tgz#d9c83a7d0c67cc8a3ccb9bd082971c3593e54fad" + dependencies: + amd-name-resolver "0.0.6" + babel-plugin-debug-macros "^0.1.6" + babel-plugin-transform-es2015-modules-amd "^6.24.0" + babel-polyfill "^6.16.0" + babel-preset-env "^1.2.0" + broccoli-babel-transpiler "^6.0.0" + broccoli-funnel "^1.0.0" + broccoli-source "^1.1.0" + clone "^2.0.0" + ember-cli-version-checker "^1.2.0" + +ember-cli-babel@^5.0.0, ember-cli-babel@^5.1.10, ember-cli-babel@^5.1.3, ember-cli-babel@^5.1.5, ember-cli-babel@^5.1.6, ember-cli-babel@^5.1.7, ember-cli-babel@^5.2.1: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-5.2.4.tgz#5ce4f46b08ed6f6d21e878619fb689719d6e8e13" + dependencies: + broccoli-babel-transpiler "^5.6.2" + broccoli-funnel "^1.0.0" + clone "^2.0.0" + ember-cli-version-checker "^1.0.2" + resolve "^1.1.2" + +ember-cli-babel@^6.0.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.6.0.tgz#a8362bc44841bfdf89b389f3197f104d7ba526da" + dependencies: + amd-name-resolver "0.0.6" + babel-plugin-debug-macros "^0.1.11" + babel-plugin-ember-modules-api-polyfill "^1.4.1" + babel-plugin-transform-es2015-modules-amd "^6.24.0" + babel-polyfill "^6.16.0" + babel-preset-env "^1.5.1" + broccoli-babel-transpiler "^6.0.0" + broccoli-debug "^0.6.2" + broccoli-funnel "^1.0.0" + broccoli-source "^1.1.0" + clone "^2.0.0" + ember-cli-version-checker "^2.0.0" + +ember-cli-broccoli-sane-watcher@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.0.4.tgz#f43f42f75b7509c212fb926cd9aea86ae19264c6" + dependencies: + broccoli-slow-trees "^3.0.1" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + rsvp "^3.0.18" + sane "^1.1.1" + +ember-cli-content-security-policy@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/ember-cli-content-security-policy/-/ember-cli-content-security-policy-0.4.0.tgz#71e4f228e68bcefc313f0ffae26f3600a0093276" + dependencies: + body-parser "^1.2.0" + +ember-cli-dependency-checker@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-1.4.0.tgz#2b13f977e1eea843fc1a21a001be6ca5d4ef1942" + dependencies: + chalk "^0.5.1" + is-git-url "^0.2.0" + semver "^4.1.0" + +ember-cli-eslint@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-eslint/-/ember-cli-eslint-3.0.0.tgz#83eb12b01e1bd41ce7d35fbd6dd18136faa1398b" + dependencies: + broccoli-lint-eslint "^3.1.0" + ember-cli-babel "^5.1.6" + js-string-escape "^1.0.0" + rsvp "^3.2.1" + walk-sync "^0.3.0" + +ember-cli-get-component-path-option@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-get-component-path-option/-/ember-cli-get-component-path-option-1.0.0.tgz#0d7b595559e2f9050abed804f1d8eff1b08bc771" + +ember-cli-get-dependency-depth@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-get-dependency-depth/-/ember-cli-get-dependency-depth-1.0.0.tgz#e0afecf82a2d52f00f28ab468295281aec368d11" + +ember-cli-htmlbars-inline-precompile@^0.3.3: + version "0.3.11" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-0.3.11.tgz#55f6858acf5576d9773678a674566b9ad9c79cbe" + dependencies: + babel-plugin-htmlbars-inline-precompile "^0.1.0" + ember-cli-babel "^5.1.3" + ember-cli-htmlbars "^1.0.0" + hash-for-dep "^1.0.2" + resolve "^1.3.3" + semver "^5.3.0" + silent-error "^1.1.0" + +ember-cli-htmlbars@^1.0.0, ember-cli-htmlbars@^1.0.10: + version "1.3.3" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-1.3.3.tgz#06815262c1577736235bd42ce99db559ce5ebfd1" + dependencies: + broccoli-persistent-filter "^1.0.3" + ember-cli-version-checker "^1.0.2" + hash-for-dep "^1.0.2" + json-stable-stringify "^1.0.0" + strip-bom "^2.0.0" + +ember-cli-inject-live-reload@^1.4.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-1.6.1.tgz#82b8f5be454815a75e7f6d42c9ce0bc883a914a3" + +ember-cli-is-package-missing@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-is-package-missing/-/ember-cli-is-package-missing-1.0.0.tgz#6e6184cafb92635dd93ca6c946b104292d4e3390" + +ember-cli-legacy-blueprints@^0.1.2: + version "0.1.5" + resolved "https://registry.yarnpkg.com/ember-cli-legacy-blueprints/-/ember-cli-legacy-blueprints-0.1.5.tgz#93c15ca242ec5107d62a8af7ec30f6ac538f3ad9" + dependencies: + chalk "^1.1.1" + ember-cli-get-component-path-option "^1.0.0" + ember-cli-get-dependency-depth "^1.0.0" + ember-cli-is-package-missing "^1.0.0" + ember-cli-lodash-subset "^1.0.7" + ember-cli-normalize-entity-name "^1.0.0" + ember-cli-path-utils "^1.0.0" + ember-cli-string-utils "^1.0.0" + ember-cli-test-info "^1.0.0" + ember-cli-valid-component-name "^1.0.0" + ember-cli-version-checker "^1.1.7" + ember-router-generator "^1.0.0" + exists-sync "0.0.3" + fs-extra "^0.24.0" + inflection "^1.7.1" + rsvp "^3.0.17" + silent-error "^1.0.0" + +ember-cli-lodash-subset@^1.0.11, ember-cli-lodash-subset@^1.0.7: + version "1.0.12" + resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-1.0.12.tgz#af2e77eba5dcb0d77f3308d3a6fd7d3450f6e537" + +ember-cli-node-assets@^0.1.1, ember-cli-node-assets@^0.1.4: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ember-cli-node-assets/-/ember-cli-node-assets-0.1.6.tgz#6488a2949048c801ad6d9e33753c7bce32fc1146" + dependencies: + broccoli-funnel "^1.0.1" + broccoli-merge-trees "^1.1.1" + broccoli-unwatched-tree "^0.1.1" + debug "^2.2.0" + lodash "^4.5.1" + resolve "^1.1.7" + +ember-cli-normalize-entity-name@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-normalize-entity-name/-/ember-cli-normalize-entity-name-1.0.0.tgz#0b14f7bcbc599aa117b5fddc81e4fd03c4bad5b7" + dependencies: + silent-error "^1.0.0" + +ember-cli-path-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-path-utils/-/ember-cli-path-utils-1.0.0.tgz#4e39af8b55301cddc5017739b77a804fba2071ed" + +ember-cli-preprocess-registry@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/ember-cli-preprocess-registry/-/ember-cli-preprocess-registry-3.1.1.tgz#38456c21c4d2b64945850cf9ec68db6ba769288a" + dependencies: + broccoli-clean-css "^1.1.0" + broccoli-funnel "^1.0.0" + broccoli-merge-trees "^1.0.0" + debug "^2.2.0" + ember-cli-lodash-subset "^1.0.7" + exists-sync "0.0.3" + process-relative-require "^1.0.0" + silent-error "^1.0.0" + +ember-cli-qunit@^3.0.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/ember-cli-qunit/-/ember-cli-qunit-3.1.2.tgz#f47063ad6af0c69cd76661ccfefd453a10d7a93b" + dependencies: + broccoli-babel-transpiler "^5.5.0" + broccoli-funnel "^1.0.1" + broccoli-merge-trees "^1.1.0" + ember-cli-babel "^5.1.5" + ember-cli-test-loader "^1.1.1" + ember-cli-version-checker "^1.1.4" + ember-qunit "^2.0.0-beta.1" + qunit-notifications "^0.1.1" + qunitjs "^2.0.1" + resolve "^1.1.6" + silent-error "^1.0.0" + +ember-cli-release@^0.2.9: + version "0.2.9" + resolved "https://registry.yarnpkg.com/ember-cli-release/-/ember-cli-release-0.2.9.tgz#5e8de3d034c65597933748023058470ec1231adb" + dependencies: + chalk "^1.0.0" + git-tools "^0.1.4" + make-array "^0.1.2" + merge "^1.2.0" + moment-timezone "^0.3.0" + nopt "^3.0.3" + rsvp "^3.0.17" + semver "^4.3.1" + silent-error "^1.0.0" + +ember-cli-sri@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ember-cli-sri/-/ember-cli-sri-2.1.1.tgz#971620934a4b9183cf7923cc03e178b83aa907fd" + dependencies: + broccoli-sri-hash "^2.1.0" + +ember-cli-string-utils@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz#39b677fc2805f55173735376fcef278eaa4452a1" + +ember-cli-test-info@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-test-info/-/ember-cli-test-info-1.0.0.tgz#ed4e960f249e97523cf891e4aed2072ce84577b4" + dependencies: + ember-cli-string-utils "^1.0.0" + +ember-cli-test-loader@^1.1.0, ember-cli-test-loader@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ember-cli-test-loader/-/ember-cli-test-loader-1.1.1.tgz#333311209b18185d0e0e95f918349da10cacf0b1" + dependencies: + ember-cli-babel "^5.2.1" + +ember-cli-uglify@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ember-cli-uglify/-/ember-cli-uglify-1.2.0.tgz#3208c32b54bc2783056e8bb0d5cfe9bbaf17ffb2" + dependencies: + broccoli-uglify-sourcemap "^1.0.0" + +ember-cli-valid-component-name@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-valid-component-name/-/ember-cli-valid-component-name-1.0.0.tgz#71550ce387e0233065f30b30b1510aa2dfbe87ef" + dependencies: + silent-error "^1.0.0" + +ember-cli-version-checker@^1.0.2, ember-cli-version-checker@^1.1.4, ember-cli-version-checker@^1.1.6, ember-cli-version-checker@^1.1.7, ember-cli-version-checker@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz#0bc2d134c830142da64bf9627a0eded10b61ae72" + dependencies: + semver "^5.3.0" + +ember-cli-version-checker@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.0.0.tgz#e1f7d8e4cdcd752ac35f1611e4daa8836db4c4c7" + dependencies: + resolve "^1.3.3" + semver "^5.3.0" + +ember-cli@^2.9.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-2.14.0.tgz#9aff1414168883183e8677fa32626d1e3228ccbc" + dependencies: + amd-name-resolver "0.0.6" + babel-plugin-transform-es2015-modules-amd "^6.24.0" + bower-config "^1.3.0" + bower-endpoint-parser "0.2.2" + broccoli-babel-transpiler "^6.0.0" + broccoli-brocfile-loader "^0.18.0" + broccoli-builder "^0.18.3" + broccoli-concat "^3.2.2" + broccoli-config-loader "^1.0.0" + broccoli-config-replace "^1.1.2" + broccoli-funnel "^1.0.6" + broccoli-funnel-reducer "^1.0.0" + broccoli-merge-trees "^2.0.0" + broccoli-middleware "^1.0.0-beta.8" + broccoli-source "^1.1.0" + broccoli-stew "^1.2.0" + calculate-cache-key-for-tree "^1.0.0" + capture-exit "^1.1.0" + chalk "^1.1.3" + clean-base-url "^1.0.0" + compression "^1.4.4" + configstore "^3.0.0" + console-ui "^1.0.2" + core-object "^3.1.3" + dag-map "^2.0.2" + diff "^3.2.0" + ember-cli-broccoli-sane-watcher "^2.0.4" + ember-cli-get-component-path-option "^1.0.0" + ember-cli-is-package-missing "^1.0.0" + ember-cli-legacy-blueprints "^0.1.2" + ember-cli-lodash-subset "^1.0.11" + ember-cli-normalize-entity-name "^1.0.0" + ember-cli-preprocess-registry "^3.1.0" + ember-cli-string-utils "^1.0.0" + ember-try "^0.2.15" + ensure-posix-path "^1.0.2" + escape-string-regexp "^1.0.3" + execa "^0.6.0" + exists-sync "0.0.4" + exit "^0.1.2" + express "^4.12.3" + filesize "^3.1.3" + find-up "^2.1.0" + fs-extra "^3.0.0" + fs-tree-diff "^0.5.2" + get-caller-file "^1.0.0" + git-repo-info "^1.4.1" + glob "7.1.1" + heimdalljs "^0.2.3" + heimdalljs-fs-monitor "^0.1.0" + heimdalljs-graph "^0.3.1" + heimdalljs-logger "^0.1.7" + http-proxy "^1.9.0" + inflection "^1.7.0" + is-git-url "^0.2.0" + isbinaryfile "^3.0.0" + js-yaml "^3.6.1" + json-stable-stringify "^1.0.1" + leek "0.0.24" + lodash.template "^4.2.5" + markdown-it "^8.3.0" + markdown-it-terminal "0.1.0" + minimatch "^3.0.0" + morgan "^1.8.1" + node-modules-path "^1.0.0" + nopt "^3.0.6" + npm-package-arg "^4.1.1" + portfinder "^1.0.7" + promise-map-series "^0.2.1" + quick-temp "^0.1.8" + resolve "^1.3.0" + rsvp "^3.3.3" + sane "^1.6.0" + semver "^5.1.1" + silent-error "^1.0.0" + sort-package-json "^1.4.0" + symlink-or-copy "^1.1.8" + temp "0.8.3" + testem "^1.15.0" + tiny-lr "^1.0.3" + tree-sync "^1.2.1" + uuid "^3.0.0" + validate-npm-package-name "^3.0.0" + walk-sync "^0.3.0" + yam "0.0.22" + +ember-data@~2.11.0: + version "2.11.3" + resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-2.11.3.tgz#46ba0e8411dce6dbb52cc02a29194f265b747ef9" + dependencies: + amd-name-resolver "0.0.5" + babel-plugin-feature-flags "^0.2.1" + babel-plugin-filter-imports "^0.2.0" + babel5-plugin-strip-class-callcheck "^5.1.0" + babel5-plugin-strip-heimdall "^5.0.2" + broccoli-babel-transpiler "^5.5.0" + broccoli-file-creator "^1.0.0" + broccoli-merge-trees "^1.0.0" + chalk "^1.1.1" + ember-cli-babel "^5.1.6" + ember-cli-path-utils "^1.0.0" + ember-cli-string-utils "^1.0.0" + ember-cli-test-info "^1.0.0" + ember-cli-version-checker "^1.1.4" + ember-inflector "^1.9.4" + ember-runtime-enumerable-includes-polyfill "^1.0.0" + exists-sync "0.0.3" + git-repo-info "^1.1.2" + heimdalljs "^0.3.0" + inflection "^1.8.0" + npm-git-info "^1.0.0" + semver "^5.1.0" + silent-error "^1.0.0" + +ember-disable-prototype-extensions@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/ember-disable-prototype-extensions/-/ember-disable-prototype-extensions-1.1.2.tgz#261cccaf6bf8fbb1836be7bdfe4278f9ab92b873" + dependencies: + bower "^1.8.0" + +ember-disable-proxy-controllers@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ember-disable-proxy-controllers/-/ember-disable-proxy-controllers-1.0.1.tgz#1254eeec0ba025c24eb9e8da611afa7b38754281" + dependencies: + ember-cli-babel "^5.0.0" + +ember-export-application-global@^1.0.5: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ember-export-application-global/-/ember-export-application-global-1.1.1.tgz#f257d5271268932a89d7392679ce4db89d7154af" + dependencies: + ember-cli-babel "^5.1.10" + +ember-fastboot-addon-tests@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/ember-fastboot-addon-tests/-/ember-fastboot-addon-tests-0.4.0.tgz#05f89f2cc4bd53d6abd6d952bbdde7c8af03a6f7" + dependencies: + chalk "^1.1.3" + core-object "^2.0.6" + debug "^2.2.0" + ember-cli-addon-tests "^0.7.0" + ember-cli-babel "^6.0.0" + ember-router-generator "^1.2.2" + fs-extra "^0.30.0" + jquery "^3.1.0" + jsdom "^9.5.0" + mocha "^3.0.2" + request "^2.74.0" + rsvp "^3.3.1" + +ember-get-config@0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.2.1.tgz#a1325cceefcb4534c78fc6ccb2be87a3feda6817" + dependencies: + broccoli-file-creator "^1.1.1" + ember-cli-babel "^5.1.6" + +ember-inflector@^1.9.4: + version "1.12.1" + resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-1.12.1.tgz#d8bd2ca2f327b439720f89923fe614d46b5da1ca" + dependencies: + ember-cli-babel "^5.1.7" + +ember-inflector@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-2.0.1.tgz#e9ac469ffa17992a43276bb1c9b8d87992b10d37" + dependencies: + ember-cli-babel "^6.0.0" + +ember-load-initializers@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-0.5.1.tgz#76e3db23c111dbdcd3ae6f687036bf0b56be0cbe" + +ember-lodash@^4.17.3: + version "4.17.4" + resolved "https://registry.yarnpkg.com/ember-lodash/-/ember-lodash-4.17.4.tgz#62a76e322e140281c31406b6dd5a11cf318c452d" + dependencies: + broccoli-debug "^0.6.1" + broccoli-funnel "^1.1.0" + broccoli-merge-trees "^2.0.0" + broccoli-string-replace "^0.1.1" + ember-cli-babel "6.1.0" + lodash-es "^4.17.4" + +ember-qunit@^2.0.0-beta.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-2.1.4.tgz#5732794e668f753d8fe1a353692ffeda73742d29" + dependencies: + ember-test-helpers "^0.6.3" + +ember-resolver@^2.0.3: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-2.1.1.tgz#5e4c1fffe9f5f48fc2194ad7592274ed0cd74f72" + dependencies: + ember-cli-babel "^5.1.6" + ember-cli-version-checker "^1.1.6" + +ember-rfc176-data@^0.2.0: + version "0.2.4" + resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.2.4.tgz#f6c5e52ffb14cf66c9fed5bd70fbe68fc91982e9" + +ember-router-generator@^1.0.0, ember-router-generator@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-1.2.3.tgz#8ed2ca86ff323363120fc14278191e9e8f1315ee" + dependencies: + recast "^0.11.3" + +ember-runtime-enumerable-includes-polyfill@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/ember-runtime-enumerable-includes-polyfill/-/ember-runtime-enumerable-includes-polyfill-1.0.4.tgz#16a7612e347a2edf07da8b2f2f09dbfee70deba0" + dependencies: + ember-cli-babel "^5.1.6" + ember-cli-version-checker "^1.1.6" + +ember-sinon@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/ember-sinon/-/ember-sinon-0.5.1.tgz#9a284a329a8db64cb6fd808b2cff4638bfc28d39" + dependencies: + ember-cli-babel "^5.1.6" + ember-cli-node-assets "^0.1.1" + sinon "^1.17.4" + +ember-test-helpers@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/ember-test-helpers/-/ember-test-helpers-0.6.3.tgz#f864cdf6f4e75f3f8768d6537785b5ab6e82d907" + +ember-try-config@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ember-try-config/-/ember-try-config-2.1.0.tgz#e0e156229a542346a58ee6f6ad605104c98edfe0" + dependencies: + lodash "^4.6.1" + node-fetch "^1.3.3" + rsvp "^3.2.1" + semver "^5.1.0" + +ember-try@^0.2.15: + version "0.2.15" + resolved "https://registry.yarnpkg.com/ember-try/-/ember-try-0.2.15.tgz#559c756058717595babe70068e541625bd5e210a" + dependencies: + chalk "^1.0.0" + cli-table2 "^0.2.0" + core-object "^1.1.0" + debug "^2.2.0" + ember-cli-version-checker "^1.1.6" + ember-try-config "^2.0.1" + extend "^3.0.0" + fs-extra "^0.26.0" + promise-map-series "^0.2.1" + resolve "^1.1.6" + rimraf "^2.3.2" + rsvp "^3.0.17" + semver "^5.1.0" + +encodeurl@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + +engine.io-client@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.0.tgz#7b730e4127414087596d9be3c88d2bc5fdb6cf5c" + dependencies: + component-emitter "1.2.1" + component-inherit "0.0.3" + debug "2.3.3" + engine.io-parser "1.3.1" + has-cors "1.1.0" + indexof "0.0.1" + parsejson "0.0.3" + parseqs "0.0.5" + parseuri "0.0.5" + ws "1.1.1" + xmlhttprequest-ssl "1.5.3" + yeast "0.1.2" + +engine.io-parser@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.1.tgz#9554f1ae33107d6fbd170ca5466d2f833f6a07cf" + dependencies: + after "0.8.1" + arraybuffer.slice "0.0.6" + base64-arraybuffer "0.1.5" + blob "0.0.4" + has-binary "0.1.6" + wtf-8 "1.0.0" + +engine.io@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.0.tgz#3eeb5f264cb75dbbec1baaea26d61f5a4eace2aa" + dependencies: + accepts "1.3.3" + base64id "0.1.0" + cookie "0.3.1" + debug "2.3.3" + engine.io-parser "1.3.1" + ws "1.1.1" + +ensure-posix-path@^1.0.0, ensure-posix-path@^1.0.1, ensure-posix-path@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.0.2.tgz#a65b3e42d0b71cfc585eb774f9943c8d9b91b0c2" + +entities@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + +error@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02" + dependencies: + string-template "~0.2.1" + xtend "~4.0.0" + +es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.23" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.23.tgz#7578b51be974207a5487821b56538c224e4e7b38" + dependencies: + es6-iterator "2" + es6-symbol "~3.1" + +es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512" + dependencies: + d "1" + es5-ext "^0.10.14" + es6-symbol "^3.1" + +es6-map@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-set "~0.1.5" + es6-symbol "~3.1.1" + event-emitter "~0.3.5" + +es6-set@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-symbol "3.1.1" + event-emitter "~0.3.5" + +es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + dependencies: + d "1" + es5-ext "~0.10.14" + +es6-weak-map@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" + dependencies: + d "1" + es5-ext "^0.10.14" + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +escape-string-regexp@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1" + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escodegen@^1.6.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +escope@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" + dependencies: + es6-map "^0.1.3" + es6-weak-map "^2.0.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-plugin-ember-suave@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember-suave/-/eslint-plugin-ember-suave-1.0.0.tgz#ea7d232a126562dcd8b1ee3aa2700ac3b626e514" + dependencies: + requireindex "~1.1.0" + +eslint@^3.0.0: + version "3.19.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc" + dependencies: + babel-code-frame "^6.16.0" + chalk "^1.1.3" + concat-stream "^1.5.2" + debug "^2.1.1" + doctrine "^2.0.0" + escope "^3.6.0" + espree "^3.4.0" + esquery "^1.0.0" + estraverse "^4.2.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + glob "^7.0.3" + globals "^9.14.0" + ignore "^3.2.0" + imurmurhash "^0.1.4" + inquirer "^0.12.0" + is-my-json-valid "^2.10.0" + is-resolvable "^1.0.0" + js-yaml "^3.5.1" + json-stable-stringify "^1.0.0" + levn "^0.3.0" + lodash "^4.0.0" + mkdirp "^0.5.0" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.1" + pluralize "^1.2.1" + progress "^1.1.8" + require-uncached "^1.0.2" + shelljs "^0.7.5" + strip-bom "^3.0.0" + strip-json-comments "~2.0.1" + table "^3.7.8" + text-table "~0.2.0" + user-home "^2.0.0" + +espree@^3.4.0: + version "3.4.3" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.3.tgz#2910b5ccd49ce893c2ffffaab4fd8b3a31b82374" + dependencies: + acorn "^5.0.1" + acorn-jsx "^3.0.0" + +esprima-fb@~15001.1001.0-dev-harmony-fb: + version "15001.1001.0-dev-harmony-fb" + resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz#43beb57ec26e8cf237d3dd8b33e42533577f2659" + +esprima@^2.6.0, esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + +esprima@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + +esprima@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.0.0.tgz#53cf247acda77313e551c3aa2e73342d3fb4f7d9" + +esprima@~3.1.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + +esquery@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" + dependencies: + estraverse "^4.1.0" + object-assign "^4.0.1" + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +esutils@^2.0.0, esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +etag@~1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051" + +event-emitter@~0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + dependencies: + d "1" + es5-ext "~0.10.14" + +eventemitter3@1.x.x: + version "1.2.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" + +events-to-array@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/events-to-array/-/events-to-array-1.1.2.tgz#2d41f563e1fe400ed4962fe1a4d5c6a7539df7f6" + +exec-sh@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.0.tgz#14f75de3f20d286ef933099b2ce50a90359cef10" + dependencies: + merge "^1.1.3" + +execa@^0.6.0: + version "0.6.3" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.6.3.tgz#57b69a594f081759c69e5370f0d17b9cb11658fe" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +exists-stat@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/exists-stat/-/exists-stat-1.0.0.tgz#0660e3525a2e89d9e446129440c272edfa24b529" + +exists-sync@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.3.tgz#b910000bedbb113b378b82f5f5a7638107622dcf" + +exists-sync@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.4.tgz#9744c2c428cc03b01060db454d4b12f0ef3c8879" + +exit-hook@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +expand-tilde@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" + dependencies: + os-homedir "^1.0.1" + +express@^4.10.7, express@^4.12.3: + version "4.15.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.15.3.tgz#bab65d0f03aa80c358408972fc700f916944b662" + dependencies: + accepts "~1.3.3" + array-flatten "1.1.1" + content-disposition "0.5.2" + content-type "~1.0.2" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.7" + depd "~1.1.0" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.0" + finalhandler "~1.0.3" + fresh "0.5.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.1" + path-to-regexp "0.1.7" + proxy-addr "~1.1.4" + qs "6.4.0" + range-parser "~1.2.0" + send "0.15.3" + serve-static "1.12.3" + setprototypeof "1.0.3" + statuses "~1.3.1" + type-is "~1.6.15" + utils-merge "1.0.0" + vary "~1.1.1" + +extend@^3.0.0, extend@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +external-editor@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-1.1.1.tgz#12d7b0db850f7ff7e7081baf4005700060c4600b" + dependencies: + extend "^3.0.0" + spawn-sync "^1.0.15" + tmp "^0.0.29" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extsprintf@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" + +fake-xml-http-request@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-1.5.0.tgz#d79602a97043d4d8fea671d5d904af38847b451d" + +faker@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/faker/-/faker-3.1.0.tgz#0f908faf4e6ec02524e54a57e432c5c013e08c9f" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +fast-ordered-set@^1.0.0, fast-ordered-set@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fast-ordered-set/-/fast-ordered-set-1.0.3.tgz#3fbb36634f7be79e4f7edbdb4a357dee25d184eb" + dependencies: + blank-object "^1.0.1" + +fast-sourcemap-concat@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-sourcemap-concat/-/fast-sourcemap-concat-1.1.0.tgz#a800767abed5eda02e67238ec063a709be61f9d4" + dependencies: + chalk "^0.5.1" + debug "^2.2.0" + fs-extra "^0.30.0" + memory-streams "^0.1.0" + mkdirp "^0.5.0" + rsvp "^3.0.14" + source-map "^0.4.2" + source-map-url "^0.3.0" + +faye-websocket@~0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + dependencies: + websocket-driver ">=0.5.1" + +fb-watchman@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + dependencies: + bser "^2.0.0" + +figures@^1.3.5: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +filesize@^3.1.3: + version "3.5.10" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.10.tgz#fc8fa23ddb4ef9e5e0ab6e1e64f679a24a56761f" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +finalhandler@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.3.tgz#ef47e77950e999780e86022a560e3217e0d0cc89" + dependencies: + debug "2.6.7" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.1" + statuses "~1.3.1" + unpipe "~1.0.0" + +find-index@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-index/-/find-index-1.1.0.tgz#53007c79cd30040d6816d79458e8837d5c5705ef" + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + +findup-sync@0.4.3, findup-sync@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" + dependencies: + detect-file "^0.1.0" + is-glob "^2.0.1" + micromatch "^2.3.7" + resolve-dir "^0.1.0" + +findup-sync@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-1.0.0.tgz#6f7e4b57b6ee3a4037b4414eaedea3f58f71e0ec" + dependencies: + detect-file "^0.1.0" + is-glob "^2.0.1" + micromatch "^2.3.7" + resolve-dir "^0.1.0" + +fireworm@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/fireworm/-/fireworm-0.7.1.tgz#ccf20f7941f108883fcddb99383dbe6e1861c758" + dependencies: + async "~0.2.9" + is-type "0.0.1" + lodash.debounce "^3.1.1" + lodash.flatten "^3.0.2" + minimatch "^3.0.2" + +flat-cache@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +formatio@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.1.1.tgz#5ed3ccd636551097383465d996199100e86161e9" + dependencies: + samsam "~1.1" + +forwarded@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" + +fresh@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" + +fs-exists-sync@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" + +fs-extra@^0.24.0: + version "0.24.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.24.0.tgz#d4e4342a96675cb7846633a6099249332b539952" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-extra@^0.26.0: + version "0.26.7" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-extra@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-extra@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + +fs-extra@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz#046c70163cef9aad46b0e4a7fa467fb22d71de35" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + +fs-extra@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^3.0.0" + universalify "^0.1.0" + +fs-promise@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fs-promise/-/fs-promise-2.0.3.tgz#f64e4f854bcf689aa8bddcba268916db3db46854" + dependencies: + any-promise "^1.3.0" + fs-extra "^2.0.0" + mz "^2.6.0" + thenify-all "^1.6.0" + +fs-readdir-recursive@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz#315b4fb8c1ca5b8c47defef319d073dad3568059" + +fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.6.tgz#342665749e8dca406800b672268c8f5073f3e623" + dependencies: + heimdalljs-logger "^0.1.7" + object-assign "^4.1.0" + path-posix "^1.0.0" + symlink-or-copy "^1.1.8" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.36" + +fstream-ignore@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +generate-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" + +generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + dependencies: + is-property "^1.0.0" + +get-caller-file@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +git-repo-info@^1.1.2, git-repo-info@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-1.4.1.tgz#2a072823254aaf62fcf0766007d7b6651bd41943" + +git-repo-info@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-1.2.0.tgz#43d8513e04a24dd441330a2f7c6655a709fdbaf2" + +git-repo-version@0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/git-repo-version/-/git-repo-version-0.4.1.tgz#75fab9a0a4ec8470755b0eea7fdaa6f9d41453bf" + dependencies: + git-repo-info "~1.2.0" + +git-tools@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/git-tools/-/git-tools-0.1.4.tgz#5e43e59443b8a5dedb39dba663da49e79f943978" + dependencies: + spawnback "~1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob@3.2.11: + version "3.2.11" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" + dependencies: + inherits "2" + minimatch "0.3" + +glob@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^5.0.10, glob@^5.0.15: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.0.4, glob@^7.0.5: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" + dependencies: + global-prefix "^0.1.4" + is-windows "^0.2.0" + +global-prefix@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" + dependencies: + homedir-polyfill "^1.0.0" + ini "^1.3.4" + is-windows "^0.2.0" + which "^1.2.12" + +globals@^6.4.0: + version "6.4.1" + resolved "https://registry.yarnpkg.com/globals/-/globals-6.4.1.tgz#8498032b3b6d1cc81eebc5f79690d8fe29fabf4f" + +globals@^9.0.0, globals@^9.14.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.4, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +growl@1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + +handlebars@^4.0.4: + version "4.0.10" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +has-ansi@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" + dependencies: + ansi-regex "^0.2.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-binary@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.6.tgz#25326f39cfa4f616ad8787894e3af2cfbc7b6e10" + dependencies: + isarray "0.0.1" + +has-binary@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" + dependencies: + isarray "0.0.1" + +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +hash-for-dep@^1.0.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.1.2.tgz#e3347ed92960eb0bb53a2c6c2b70e36d75b7cd0c" + dependencies: + broccoli-kitchen-sink-helpers "^0.3.1" + heimdalljs "^0.2.3" + heimdalljs-logger "^0.1.7" + resolve "^1.1.6" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +heimdalljs-fs-monitor@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/heimdalljs-fs-monitor/-/heimdalljs-fs-monitor-0.1.0.tgz#d404a65688c6714c485469ed3495da4853440272" + dependencies: + heimdalljs "^0.2.0" + heimdalljs-logger "^0.1.7" + +heimdalljs-graph@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/heimdalljs-graph/-/heimdalljs-graph-0.3.3.tgz#ea801dbba659c8d522fe1cb83b2d605726e4918f" + +heimdalljs-logger@^0.1.7: + version "0.1.9" + resolved "https://registry.yarnpkg.com/heimdalljs-logger/-/heimdalljs-logger-0.1.9.tgz#d76ada4e45b7bb6f786fc9c010a68eb2e2faf176" + dependencies: + debug "^2.2.0" + heimdalljs "^0.2.0" + +heimdalljs@^0.2.0, heimdalljs@^0.2.1, heimdalljs@^0.2.3: + version "0.2.5" + resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.2.5.tgz#6aa54308eee793b642cff9cf94781445f37730ac" + dependencies: + rsvp "~3.2.1" + +heimdalljs@^0.3.0: + version "0.3.3" + resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.3.3.tgz#e92d2c6f77fd46d5bf50b610d28ad31755054d0b" + dependencies: + rsvp "~3.2.1" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +home-or-tmp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-1.0.0.tgz#4b9f1e40800c3e50c6c27f781676afcce71f3985" + dependencies: + os-tmpdir "^1.0.1" + user-home "^1.1.1" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +homedir-polyfill@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.5: + version "2.5.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" + +html-encoding-sniffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz#79bf7a785ea495fe66165e734153f363ff5437da" + dependencies: + whatwg-encoding "^1.0.1" + +http-errors@~1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" + dependencies: + depd "1.1.0" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +http-proxy@^1.13.1, http-proxy@^1.9.0: + version "1.16.2" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" + dependencies: + eventemitter3 "1.x.x" + requires-port "1.x.x" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iconv-lite@0.4.13: + version "0.4.13" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" + +iconv-lite@0.4.15: + version "0.4.15" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" + +iconv-lite@^0.4.5, iconv-lite@~0.4.13: + version "0.4.18" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" + +ignore@^3.2.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + +inflection@^1.7.0, inflection@^1.7.1, inflection@^1.8.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + +ini@^1.3.4, ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +inline-source-map-comment@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/inline-source-map-comment/-/inline-source-map-comment-1.0.5.tgz#50a8a44c2a790dfac441b5c94eccd5462635faf6" + dependencies: + chalk "^1.0.0" + get-stdin "^4.0.1" + minimist "^1.1.1" + sum-up "^1.0.1" + xtend "^4.0.0" + +inquirer@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" + dependencies: + ansi-escapes "^1.1.0" + ansi-regex "^2.0.0" + chalk "^1.0.0" + cli-cursor "^1.0.1" + cli-width "^2.0.0" + figures "^1.3.5" + lodash "^4.3.0" + readline2 "^1.0.1" + run-async "^0.1.0" + rx-lite "^3.1.2" + string-width "^1.0.1" + strip-ansi "^3.0.0" + through "^2.3.6" + +inquirer@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-1.2.3.tgz#4dec6f32f37ef7bb0b2ed3f1d1a5c3f545074918" + dependencies: + ansi-escapes "^1.1.0" + chalk "^1.0.0" + cli-cursor "^1.0.1" + cli-width "^2.0.0" + external-editor "^1.1.0" + figures "^1.3.5" + lodash "^4.3.0" + mute-stream "0.0.6" + pinkie-promise "^2.0.0" + run-async "^2.2.0" + rx "^4.1.0" + string-width "^1.0.1" + strip-ansi "^3.0.0" + through "^2.3.6" + +interpret@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90" + +invariant@^2.2.0, invariant@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +ipaddr.js@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.3.0.tgz#1e03a52fdad83a8bbb2b25cbf4998b4cffcd3dec" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-git-url@^0.2.0: + version "0.2.3" + resolved "https://registry.yarnpkg.com/is-git-url/-/is-git-url-0.2.3.tgz#445200d6fbd6da028fb5e01440d9afc93f3ccb64" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-integer@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-integer/-/is-integer-1.0.7.tgz#6bde81aacddf78b659b6629d629cadc51a886d5c" + dependencies: + is-finite "^1.0.0" + +is-my-json-valid@^2.10.0: + version "2.16.0" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + dependencies: + path-is-inside "^1.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-resolvable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" + dependencies: + tryit "^1.0.1" + +is-stream@^1.0.1, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-type@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/is-type/-/is-type-0.0.1.tgz#f651d85c365d44955d14a51d8d7061f3f6b4779c" + dependencies: + core-util-is "~1.0.0" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +is-windows@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isbinaryfile@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +istextorbinary@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.1.0.tgz#dbed2a6f51be2f7475b68f89465811141b758874" + dependencies: + binaryextensions "1 || 2" + editions "^1.1.1" + textextensions "1 || 2" + +jade@0.26.3: + version "0.26.3" + resolved "https://registry.yarnpkg.com/jade/-/jade-0.26.3.tgz#8f10d7977d8d79f2f6ff862a81b0513ccb25686c" + dependencies: + commander "0.6.1" + mkdirp "0.3.0" + +jquery@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.2.1.tgz#5c4d9de652af6cd0a770154a631bba12b015c787" + +js-reporters@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/js-reporters/-/js-reporters-1.2.0.tgz#7cf2cb698196684790350d0c4ca07f4aed9ec17e" + +js-string-escape@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" + +js-tokens@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-1.0.1.tgz#cc435a5c8b94ad15acb7983140fc80182c89aeae" + +js-tokens@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.5.1, js-yaml@^3.6.1: + version "3.9.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.9.0.tgz#4ffbbf25c2ac963b8299dc74da7e3740de1c18ce" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jsdom@^9.5.0: + version "9.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" + dependencies: + abab "^1.0.3" + acorn "^4.0.4" + acorn-globals "^3.1.0" + array-equal "^1.0.0" + content-type-parser "^1.0.1" + cssom ">= 0.3.2 < 0.4.0" + cssstyle ">= 0.2.37 < 0.3.0" + escodegen "^1.6.1" + html-encoding-sniffer "^1.0.1" + nwmatcher ">= 1.3.9 < 2.0.0" + parse5 "^1.5.1" + request "^2.79.0" + sax "^1.2.1" + symbol-tree "^3.2.1" + tough-cookie "^2.3.2" + webidl-conversions "^4.0.0" + whatwg-encoding "^1.0.1" + whatwg-url "^4.3.0" + xml-name-validator "^2.0.1" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@^2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json3@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +json5@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d" + +json5@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsonpointer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" + +jsprim@^1.2.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" + dependencies: + assert-plus "1.0.0" + extsprintf "1.0.2" + json-schema "0.2.3" + verror "1.3.6" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + optionalDependencies: + graceful-fs "^4.1.9" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +leek@0.0.24: + version "0.0.24" + resolved "https://registry.yarnpkg.com/leek/-/leek-0.0.24.tgz#e400e57f0e60d8ef2bd4d068dc428a54345dbcda" + dependencies: + debug "^2.1.0" + lodash.assign "^3.2.0" + rsvp "^3.0.21" + +leven@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/leven/-/leven-1.0.2.tgz#9144b6eebca5f1d0680169f1a6770dcea60b75c3" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +linkify-it@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.0.3.tgz#d94a4648f9b1c179d64fa97291268bdb6ce9434f" + dependencies: + uc.micro "^1.0.1" + +livereload-js@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.2.2.tgz#6c87257e648ab475bc24ea257457edcc1f8d0bc2" + +loader.js@^4.0.10: + version "4.5.1" + resolved "https://registry.yarnpkg.com/loader.js/-/loader.js-4.5.1.tgz#c15ab15a6b8376bd4fbf7ea56f8d76cc557331da" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash-es@^4.17.4: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.4.tgz#dcc1d7552e150a0640073ba9cb31d70f032950e7" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basecreate@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" + +lodash._baseflatten@^3.0.0: + version "3.1.4" + resolved "https://registry.yarnpkg.com/lodash._baseflatten/-/lodash._baseflatten-3.1.4.tgz#0770ff80131af6e34f3b511796a7ba5214e65ff7" + dependencies: + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash._bindcallback@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + +lodash._createassigner@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" + dependencies: + lodash._bindcallback "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash.restparam "^3.0.0" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash._reinterpolate@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + +lodash.assign@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" + dependencies: + lodash._baseassign "^3.0.0" + lodash._createassigner "^3.0.0" + lodash.keys "^3.0.0" + +lodash.assignin@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" + +lodash.clonedeep@^4.4.1: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + +lodash.create@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" + dependencies: + lodash._baseassign "^3.0.0" + lodash._basecreate "^3.0.0" + lodash._isiterateecall "^3.0.0" + +lodash.debounce@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-3.1.1.tgz#812211c378a94cc29d5aa4e3346cf0bfce3a7df5" + dependencies: + lodash._getnative "^3.0.0" + +lodash.defaultsdeep@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.0.tgz#bec1024f85b1bd96cbea405b23c14ad6443a6f81" + +lodash.find@^4.5.1: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" + +lodash.flatten@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-3.0.2.tgz#de1cf57758f8f4479319d35c3e9cc60c4501938c" + dependencies: + lodash._baseflatten "^3.0.0" + lodash._isiterateecall "^3.0.0" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.merge@^4.3.0, lodash.merge@^4.4.0, lodash.merge@^4.5.1, lodash.merge@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5" + +lodash.omit@^4.1.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash.template@^4.2.5: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" + dependencies: + lodash._reinterpolate "~3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" + dependencies: + lodash._reinterpolate "~3.0.0" + +lodash.uniq@^4.2.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + +lodash.uniqby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" + +lodash@^3.10.0, lodash@^3.10.1, lodash@^3.9.3: + version "3.10.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + +lodash@^4.0.0, lodash@^4.14.0, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +lolex@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + +lru-cache@2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + +lru-cache@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +make-array@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/make-array/-/make-array-0.1.2.tgz#335e36ebb0c5a43154d21213a1ecaeae2a1bb3ef" + +make-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978" + dependencies: + pify "^2.3.0" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + dependencies: + tmpl "1.0.x" + +markdown-it-terminal@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/markdown-it-terminal/-/markdown-it-terminal-0.1.0.tgz#545abd8dd01c3d62353bfcea71db580b51d22bd9" + dependencies: + ansi-styles "^3.0.0" + cardinal "^1.0.0" + cli-table "^0.3.1" + lodash.merge "^4.6.0" + markdown-it "^8.3.1" + +markdown-it@^8.3.0, markdown-it@^8.3.1: + version "8.3.1" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.3.1.tgz#2f4b622948ccdc193d66f3ca2d43125ac4ac7323" + dependencies: + argparse "^1.0.7" + entities "~1.1.1" + linkify-it "^2.0.0" + mdurl "^1.0.1" + uc.micro "^1.0.3" + +matcher-collection@^1.0.0, matcher-collection@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.0.4.tgz#2f66ae0869996f29e43d0b62c83dd1d43e581755" + dependencies: + minimatch "^3.0.2" + +md5-hex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-2.0.0.tgz#d0588e9f1c74954492ecd24ac0ac6ce997d92e33" + dependencies: + md5-o-matic "^0.1.1" + +md5-o-matic@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" + +mdurl@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +memory-streams@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/memory-streams/-/memory-streams-0.1.2.tgz#273ff777ab60fec599b116355255282cca2c50c2" + dependencies: + readable-stream "~1.0.2" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + +merge-trees@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-trees/-/merge-trees-1.0.1.tgz#ccbe674569787f9def17fd46e6525f5700bbd23e" + dependencies: + can-symlink "^1.0.0" + fs-tree-diff "^0.5.4" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + rimraf "^2.4.3" + symlink-or-copy "^1.0.0" + +merge@^1.1.3, merge@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +micromatch@^2.1.5, micromatch@^2.3.7: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +"mime-db@>= 1.27.0 < 2": + version "1.28.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.28.0.tgz#fedd349be06d2865b7fc57d837c6de4f17d7ac3c" + +mime-db@~1.27.0: + version "1.27.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" + +mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.7: + version "2.1.15" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" + dependencies: + mime-db "~1.27.0" + +mime@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + +mime@^1.2.11: + version "1.3.6" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0" + +minimatch@0.3: + version "0.3.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimatch@^2.0.3: + version "2.0.10" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" + dependencies: + brace-expansion "^1.0.0" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + +mkdirp@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" + +mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +mktemp@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/mktemp/-/mktemp-0.4.0.tgz#6d0515611c8a8c84e484aa2000129b98e981ff0b" + +mocha@^2.1.0: + version "2.5.3" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-2.5.3.tgz#161be5bdeb496771eb9b35745050b622b5aefc58" + dependencies: + commander "2.3.0" + debug "2.2.0" + diff "1.4.0" + escape-string-regexp "1.0.2" + glob "3.2.11" + growl "1.9.2" + jade "0.26.3" + mkdirp "0.5.1" + supports-color "1.2.0" + to-iso-string "0.0.2" + +mocha@^3.0.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.4.2.tgz#d0ef4d332126dbf18d0d640c9b382dd48be97594" + dependencies: + browser-stdout "1.3.0" + commander "2.9.0" + debug "2.6.0" + diff "3.2.0" + escape-string-regexp "1.0.5" + glob "7.1.1" + growl "1.9.2" + json3 "3.3.2" + lodash.create "3.1.1" + mkdirp "0.5.1" + supports-color "3.1.2" + +moment-timezone@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.3.1.tgz#3ef47856b02d53b718a10a5ec2023aa299e07bf5" + dependencies: + moment ">= 2.6.0" + +"moment@>= 2.6.0": + version "2.18.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" + +morgan@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.8.2.tgz#784ac7734e4a453a9c6e6e8680a9329275c8b687" + dependencies: + basic-auth "~1.1.0" + debug "2.6.8" + depd "~1.1.0" + on-finished "~2.3.0" + on-headers "~1.0.1" + +mout@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mout/-/mout-1.0.0.tgz#9bdf1d4af57d66d47cb353a6335a3281098e1501" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +ms@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +mustache@^2.2.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.0.tgz#4028f7778b17708a489930a6e52ac3bca0da41d0" + +mute-stream@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" + +mute-stream@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" + +mz@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.6.0.tgz#c8b8521d958df0a4f2768025db69c719ee4ef1ce" + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nan@^2.3.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +node-fetch@^1.3.3: + version "1.7.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.1.tgz#899cb3d0a3c92f952c47f1b876f4c8aeabd400d5" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + +node-modules-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/node-modules-path/-/node-modules-path-1.0.1.tgz#40096b08ce7ad0ea14680863af449c7c75a5d1c8" + +node-notifier@^5.0.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.1.2.tgz#2fa9e12605fa10009d44549d6fcd8a63dde0e4ff" + dependencies: + growly "^1.3.0" + semver "^5.3.0" + shellwords "^0.1.0" + which "^1.2.12" + +node-pre-gyp@^0.6.36: + version "0.6.36" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" + dependencies: + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "^2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +nopt@^3.0.3, nopt@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +npm-git-info@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/npm-git-info/-/npm-git-info-1.0.3.tgz#a933c42ec321e80d3646e0d6e844afe94630e1d5" + +npm-package-arg@^4.1.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-4.2.1.tgz#593303fdea85f7c422775f17f9eb7670f680e3ec" + dependencies: + hosted-git-info "^2.1.5" + semver "^5.1.0" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + +npmlog@^4.0.0, npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +"nwmatcher@>= 1.3.9 < 2.0.0": + version "1.4.1" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.1.tgz#7ae9b07b0ea804db7e25f05cb5fe4097d4e4949f" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + +object-assign@4.1.1, object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-component@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + +once@^1.3.0, once@^1.3.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +onetime@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + +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" + +optionator@^0.8.1, optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +options@>=0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" + +ora@^0.2.0: + version "0.2.3" + resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4" + dependencies: + chalk "^1.1.1" + cli-cursor "^1.0.2" + cli-spinners "^0.1.2" + object-assign "^4.0.1" + +os-homedir@^1.0.0, os-homedir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-shim@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.3, osenv@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +output-file-sync@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + +p-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + +parse5@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" + +parsejson@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab" + dependencies: + better-assert "~1.0.0" + +parseqs@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + dependencies: + better-assert "~1.0.0" + +parseuri@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + dependencies: + better-assert "~1.0.0" + +parseurl@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" + +path-exists@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-1.0.0.tgz#d5a8998eb71ef37a74c34eb0d9eba6e878eea081" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-posix@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/path-posix/-/path-posix-1.0.0.tgz#06b26113f56beab042545a23bfa88003ccac260f" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + +pathval@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pluralize@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" + +portfinder@^1.0.7: + version "1.0.13" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" + dependencies: + async "^1.5.2" + debug "^2.2.0" + mkdirp "0.5.x" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +pretender@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/pretender/-/pretender-1.4.2.tgz#dde9995dfdf75b28a3dd7a73cde2f9f612e5e8f4" + dependencies: + fake-xml-http-request "^1.4.0" + route-recognizer "^0.2.3" + +printf@^0.2.3: + version "0.2.5" + resolved "https://registry.yarnpkg.com/printf/-/printf-0.2.5.tgz#c438ca2ca33e3927671db4ab69c0e52f936a4f0f" + +private@^0.1.6, private@~0.1.5: + version "0.1.7" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" + +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" + +process-relative-require@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/process-relative-require/-/process-relative-require-1.0.0.tgz#1590dfcf5b8f2983ba53e398446b68240b4cc68a" + dependencies: + node-modules-path "^1.0.0" + +progress@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + +promise-map-series@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/promise-map-series/-/promise-map-series-0.2.3.tgz#c2d377afc93253f6bd03dbb77755eb88ab20a847" + dependencies: + rsvp "^3.0.14" + +proxy-addr@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.4.tgz#27e545f6960a44a627d9b44467e35c1b6b4ce2f3" + dependencies: + forwarded "~0.1.0" + ipaddr.js "1.3.0" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +q@^1.1.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" + +qs@6.4.0, qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +qs@^6.4.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.0.tgz#8d04954d364def3efc55b5a0793e1e2c8b1e6e49" + +quick-temp@^0.1.0, quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quick-temp@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/quick-temp/-/quick-temp-0.1.8.tgz#bab02a242ab8fb0dd758a3c9776b32f9a5d94408" + dependencies: + mktemp "~0.4.0" + rimraf "^2.5.4" + underscore.string "~3.3.4" + +qunit-notifications@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/qunit-notifications/-/qunit-notifications-0.1.1.tgz#3001afc6a6a77dfbd962ccbcddde12dec5286c09" + +qunitjs@^2.0.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/qunitjs/-/qunitjs-2.4.0.tgz#58f3a81e846687f2e7f637c5bedc9c267f887261" + dependencies: + chokidar "1.6.1" + commander "2.9.0" + exists-stat "1.0.0" + findup-sync "0.4.3" + js-reporters "1.2.0" + resolve "1.3.2" + walk-sync "0.3.1" + +randomatic@^1.1.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +raw-body@~1.1.0: + version "1.1.7" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.1.7.tgz#1d027c2bfa116acc6623bca8f00016572a87d425" + dependencies: + bytes "1" + string_decoder "0.10" + +raw-body@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96" + dependencies: + bytes "2.4.0" + iconv-lite "0.4.15" + unpipe "1.0.0" + +rc@^1.1.7: + version "1.2.1" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +readable-stream@^2, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + +readable-stream@~1.0.2: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +readline2@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + mute-stream "0.0.5" + +recast@0.10.33: + version "0.10.33" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.33.tgz#942808f7aa016f1fa7142c461d7e5704aaa8d697" + dependencies: + ast-types "0.8.12" + esprima-fb "~15001.1001.0-dev-harmony-fb" + private "~0.1.5" + source-map "~0.5.0" + +recast@^0.10.10: + version "0.10.43" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.43.tgz#b95d50f6d60761a5f6252e15d80678168491ce7f" + dependencies: + ast-types "0.8.15" + esprima-fb "~15001.1001.0-dev-harmony-fb" + private "~0.1.5" + source-map "~0.5.0" + +recast@^0.11.17, recast@^0.11.3: + version "0.11.23" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" + dependencies: + ast-types "0.9.6" + esprima "~3.1.0" + private "~0.1.5" + source-map "~0.5.0" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + +redeyed@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-1.0.1.tgz#e96c193b40c0816b00aec842698e61185e55498a" + dependencies: + esprima "~3.0.0" + +regenerate@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" + +regenerator-runtime@^0.10.0: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + +regenerator-transform@0.9.11: + version "0.9.11" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regenerator@0.8.40: + version "0.8.40" + resolved "https://registry.yarnpkg.com/regenerator/-/regenerator-0.8.40.tgz#a0e457c58ebdbae575c9f8cd75127e93756435d8" + dependencies: + commoner "~0.10.3" + defs "~1.1.0" + esprima-fb "~15001.1001.0-dev-harmony-fb" + private "~0.1.5" + recast "0.10.33" + through "~2.3.8" + +regex-cache@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + dependencies: + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regexpu@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexpu/-/regexpu-1.3.0.tgz#e534dc991a9e5846050c98de6d7dd4a55c9ea16d" + dependencies: + esprima "^2.6.0" + recast "^0.10.10" + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz#69b062d978727ad14dc6b56ba4ab772fd8d70511" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^1.1.0, repeating@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" + dependencies: + is-finite "^1.0.0" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request@^2.74.0, request@^2.79.0, request@^2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +require-uncached@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + +requireindex@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162" + +requires-port@1.x.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + +resolve-dir@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" + dependencies: + expand-tilde "^1.2.2" + global-modules "^0.2.3" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + +resolve@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.2.tgz#1f0442c9e0cbb8136e87b9305f932f46c7f28235" + dependencies: + path-parse "^1.0.5" + +resolve@^1.1.2, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.0, resolve@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" + dependencies: + path-parse "^1.0.5" + +restore-cursor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + dependencies: + exit-hook "^1.0.0" + onetime "^1.0.0" + +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" + +rimraf@2, rimraf@^2.2.8, rimraf@^2.3.2, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.1, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" + dependencies: + glob "^7.0.5" + +rimraf@~2.2.6: + version "2.2.8" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + +route-recognizer@^0.2.3: + version "0.2.10" + resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.2.10.tgz#024b2283c2e68d13a7c7f5173a5924645e8902df" + +rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.2.1, rsvp@^3.3.1, rsvp@^3.3.3, rsvp@^3.5.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.1.tgz#34f4a7ac2859f7bacc8f49789c5604f1e26ae702" + +rsvp@~3.0.6: + version "3.0.21" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.0.21.tgz#49c588fe18ef293bcd0ab9f4e6756e6ac433359f" + +rsvp@~3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.2.1.tgz#07cb4a5df25add9e826ebc67dcc9fd89db27d84a" + +run-async@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" + dependencies: + once "^1.3.0" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + dependencies: + is-promise "^2.1.0" + +rx-lite@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" + +rx@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + +safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +safe-json-parse@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" + +samsam@1.1.2, samsam@~1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567" + +sane@^1.1.1, sane@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-1.7.0.tgz#b3579bccb45c94cf20355cc81124990dfd346e30" + dependencies: + anymatch "^1.3.0" + exec-sh "^0.2.0" + fb-watchman "^2.0.0" + minimatch "^3.0.2" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.10.0" + +sax@^1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + +semver@^4.1.0, semver@^4.3.1: + version "4.3.6" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + +semver@^5.1.0, semver@^5.1.1, semver@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +send@0.15.3: + version "0.15.3" + resolved "https://registry.yarnpkg.com/send/-/send-0.15.3.tgz#5013f9f99023df50d1bd9892c19e3defd1d53309" + dependencies: + debug "2.6.7" + depd "~1.1.0" + destroy "~1.0.4" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.0" + fresh "0.5.0" + http-errors "~1.6.1" + mime "1.3.4" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.3.1" + +serve-static@1.12.3: + version "1.12.3" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.3.tgz#9f4ba19e2f3030c547f8af99107838ec38d5b1e2" + dependencies: + encodeurl "~1.0.1" + escape-html "~1.0.3" + parseurl "~1.3.1" + send "0.15.3" + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +shelljs@^0.7.5: + version "0.7.8" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +shellwords@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14" + +sigmund@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +silent-error@^1.0.0, silent-error@^1.0.1, silent-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/silent-error/-/silent-error-1.1.0.tgz#2209706f1c850a9f1d10d0d840918b46f26e1bc9" + dependencies: + debug "^2.2.0" + +simple-fmt@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/simple-fmt/-/simple-fmt-0.1.0.tgz#191bf566a59e6530482cb25ab53b4a8dc85c3a6b" + +simple-is@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/simple-is/-/simple-is-0.2.0.tgz#2abb75aade39deb5cc815ce10e6191164850baf0" + +sinon@^1.17.4: + version "1.17.7" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.7.tgz#4542a4f49ba0c45c05eb2e9dd9d203e2b8efe0bf" + dependencies: + formatio "1.1.1" + lolex "1.3.2" + samsam "1.1.2" + util ">=0.10.3 <1" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + +slide@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +socket.io-adapter@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" + dependencies: + debug "2.3.3" + socket.io-parser "2.3.1" + +socket.io-client@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.6.0.tgz#5b668f4f771304dfeed179064708386fa6717853" + dependencies: + backo2 "1.0.2" + component-bind "1.0.0" + component-emitter "1.2.1" + debug "2.3.3" + engine.io-client "1.8.0" + has-binary "0.1.7" + indexof "0.0.1" + object-component "0.0.3" + parseuri "0.0.5" + socket.io-parser "2.3.1" + to-array "0.1.4" + +socket.io-parser@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0" + dependencies: + component-emitter "1.1.2" + debug "2.2.0" + isarray "0.0.1" + json3 "3.3.2" + +socket.io@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.6.0.tgz#3e40d932637e6bd923981b25caf7c53e83b6e2e1" + dependencies: + debug "2.3.3" + engine.io "1.8.0" + has-binary "0.1.7" + object-assign "4.1.0" + socket.io-adapter "0.5.0" + socket.io-client "1.6.0" + socket.io-parser "2.3.1" + +sort-object-keys@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.2.tgz#d3a6c48dc2ac97e6bc94367696e03f6d09d37952" + +sort-package-json@^1.4.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.7.0.tgz#13b362ff6400c5b4eaa9ba220f9ea7c3d6644b5f" + dependencies: + sort-object-keys "^1.1.1" + +source-map-support@^0.2.10: + version "0.2.10" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.2.10.tgz#ea5a3900a1c1cb25096a0ae8cc5c2b4b10ded3dc" + dependencies: + source-map "0.1.32" + +source-map-support@^0.4.2: + version "0.4.15" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" + dependencies: + source-map "^0.5.6" + +source-map-url@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" + +source-map@0.1.32: + version "0.1.32" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.32.tgz#c8b6c167797ba4740a8ea33252162ff08591b266" + dependencies: + amdefine ">=0.0.4" + +source-map@0.4.x, source-map@^0.4.2, 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.0, source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + dependencies: + amdefine ">=0.0.4" + +spawn-args@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/spawn-args/-/spawn-args-0.2.0.tgz#fb7d0bd1d70fd4316bd9e3dec389e65f9d6361bb" + +spawn-sync@^1.0.15: + version "1.0.15" + resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" + dependencies: + concat-stream "^1.4.7" + os-shim "^0.1.2" + +spawnback@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/spawnback/-/spawnback-1.0.0.tgz#f73662f7e54d95367eca74d6426c677dd7ea686f" + +sprintf-js@^1.0.3: + version "1.1.1" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sri-toolbox@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/sri-toolbox/-/sri-toolbox-0.2.0.tgz#a7fea5c3fde55e675cf1c8c06f3ebb5c2935835e" + +sshpk@^1.7.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +stable@~0.1.3: + version "0.1.6" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.6.tgz#910f5d2aed7b520c6e777499c1f32e139fdecb10" + +"statuses@>= 1.3.1 < 2", statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + +string-template@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.0.tgz#030664561fc146c9423ec7d978fe2457437fe6d0" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@0.10, string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + +stringmap@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stringmap/-/stringmap-0.2.2.tgz#556c137b258f942b8776f5b2ef582aa069d7d1b1" + +stringset@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/stringset/-/stringset-0.2.1.tgz#ef259c4e349344377fcd1c913dd2e848c9c042b5" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" + dependencies: + ansi-regex "^0.2.1" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +styled_string@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/styled_string/-/styled_string-0.0.1.tgz#d22782bd81295459bc4f1df18c4bad8e94dd124a" + +sum-up@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sum-up/-/sum-up-1.0.3.tgz#1c661f667057f63bcb7875aa1438bc162525156e" + dependencies: + chalk "^1.0.0" + +supports-color@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.2.0.tgz#ff1ed1e61169d06b3cf2d588e188b18d8847e17e" + +supports-color@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + dependencies: + has-flag "^1.0.0" + +supports-color@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +symbol-tree@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + +symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.3, symlink-or-copy@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.1.8.tgz#cabe61e0010c1c023c173b25ee5108b37f4b4aa3" + +table@^3.7.8: + version "3.8.3" + resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" + dependencies: + ajv "^4.7.0" + ajv-keywords "^1.0.0" + chalk "^1.1.1" + lodash "^4.0.0" + slice-ansi "0.0.4" + string-width "^2.0.0" + +tap-parser@^5.1.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-5.4.0.tgz#6907e89725d7b7fa6ae41ee2c464c3db43188aec" + dependencies: + events-to-array "^1.0.1" + js-yaml "^3.2.7" + optionalDependencies: + readable-stream "^2" + +tar-pack@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + +tar@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +temp@0.8.3, temp@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" + dependencies: + os-tmpdir "^1.0.0" + rimraf "~2.2.6" + +testem@^1.15.0: + version "1.18.0" + resolved "https://registry.yarnpkg.com/testem/-/testem-1.18.0.tgz#4a9f798509d260dca928823aaae5dbc6a9c977ee" + dependencies: + backbone "^1.1.2" + bluebird "^3.4.6" + charm "^1.0.0" + commander "^2.6.0" + consolidate "^0.14.0" + cross-spawn "^5.1.0" + express "^4.10.7" + fireworm "^0.7.0" + glob "^7.0.4" + http-proxy "^1.13.1" + js-yaml "^3.2.5" + lodash.assignin "^4.1.0" + lodash.clonedeep "^4.4.1" + lodash.find "^4.5.1" + lodash.uniqby "^4.7.0" + mkdirp "^0.5.1" + mustache "^2.2.1" + node-notifier "^5.0.1" + npmlog "^4.0.0" + printf "^0.2.3" + rimraf "^2.4.4" + socket.io "1.6.0" + spawn-args "^0.2.0" + styled_string "0.0.1" + tap-parser "^5.1.0" + xmldom "^0.1.19" + +text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +"textextensions@1 || 2": + version "2.1.0" + resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.1.0.tgz#1be0dc2a0dc244d44be8a09af6a85afb93c4dbc3" + +thenify-all@^1.0.0, thenify-all@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.0" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" + dependencies: + any-promise "^1.0.0" + +through@^2.3.6, through@^2.3.8, through@~2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +tiny-lr@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.0.5.tgz#21f40bf84ebd1f853056680375eef1670c334112" + dependencies: + body "^5.1.0" + debug "~2.6.7" + faye-websocket "~0.10.0" + livereload-js "^2.2.2" + object-assign "^4.1.0" + qs "^6.4.0" + +tmp@0.0.28: + version "0.0.28" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" + dependencies: + os-tmpdir "~1.0.1" + +tmp@^0.0.29: + version "0.0.29" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" + dependencies: + os-tmpdir "~1.0.1" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + +to-fast-properties@^1.0.0, to-fast-properties@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + +to-iso-string@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/to-iso-string/-/to-iso-string-0.0.2.tgz#4dc19e664dfccbe25bd8db508b00c6da158255d1" + +tough-cookie@^2.3.2, tough-cookie@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + +tree-sync@^1.2.1, tree-sync@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-sync/-/tree-sync-1.2.2.tgz#2cf76b8589f59ffedb58db5a3ac7cb013d0158b7" + dependencies: + debug "^2.2.0" + fs-tree-diff "^0.5.6" + mkdirp "^0.5.1" + quick-temp "^0.1.5" + walk-sync "^0.2.7" + +trim-right@^1.0.0, trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +try-resolve@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/try-resolve/-/try-resolve-1.0.1.tgz#cfde6fabd72d63e5797cfaab873abbe8e700e912" + +tryit@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" + +tryor@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/tryor/-/tryor-0.1.2.tgz#8145e4ca7caff40acde3ccf946e8b8bb75b4172b" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +type-detect@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-3.0.0.tgz#46d0cc8553abb7b13a352b0d6dea2fd58f2d9b55" + +type-detect@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.3.tgz#0e3f2670b44099b0b46c284d136a7ef49c74c2ea" + +type-is@~1.6.15: + version "1.6.15" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.15" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +uc.micro@^1.0.1, uc.micro@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.3.tgz#7ed50d5e0f9a9fb0a573379259f2a77458d50192" + +uglify-js@^2.6, uglify-js@^2.7.0: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.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" + +uid-number@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +ultron@1.0.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" + +underscore.string@~3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db" + dependencies: + sprintf-js "^1.0.3" + util-deprecate "^1.0.2" + +underscore@>=1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + dependencies: + crypto-random-string "^1.0.0" + +universalify@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.0.tgz#9eb1c4651debcc670cc94f1a75762332bb967778" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +untildify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-2.1.0.tgz#17eb2807987f76952e9c0485fc311d06a826a2e0" + dependencies: + os-homedir "^1.0.0" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +user-home@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" + dependencies: + os-homedir "^1.0.0" + +username-sync@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/username-sync/-/username-sync-1.0.1.tgz#1cde87eefcf94b8822984d938ba2b797426dae1f" + +util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +"util@>=0.10.3 <1": + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + +utils-merge@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" + +uuid@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" + +validate-npm-package-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + dependencies: + builtins "^1.0.3" + +vary@~1.1.0, vary@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" + +verror@1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" + dependencies: + extsprintf "1.0.2" + +walk-sync@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.1.tgz#558a16aeac8c0db59c028b73c66f397684ece465" + dependencies: + ensure-posix-path "^1.0.0" + matcher-collection "^1.0.0" + +walk-sync@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.1.3.tgz#8a07261a00bda6cfb1be25e9f100fad57546f583" + +walk-sync@^0.2.5, walk-sync@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.2.7.tgz#b49be4ee6867657aeb736978b56a29d10fa39969" + dependencies: + ensure-posix-path "^1.0.0" + matcher-collection "^1.0.0" + +walk-sync@^0.3.0, walk-sync@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.2.tgz#4827280afc42d0e035367c4a4e31eeac0d136f75" + dependencies: + ensure-posix-path "^1.0.0" + matcher-collection "^1.0.0" + +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + dependencies: + makeerror "1.0.x" + +watch@~0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + +webidl-conversions@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.1.tgz#8015a17ab83e7e1b311638486ace81da6ce206a0" + +websocket-driver@>=0.5.1: + version "0.6.5" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + dependencies: + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" + +whatwg-encoding@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz#3c6c451a198ee7aec55b1ec61d0920c67801a5f4" + dependencies: + iconv-lite "0.4.13" + +whatwg-url@^4.3.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@^1.2.12, which@^1.2.9: + version "1.2.14" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + dependencies: + string-width "^1.0.2" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +window-size@^0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" + +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" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +workerpool@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-2.2.2.tgz#1cf53bacafd98ca5d808ff54cc72f3fecb5e1d56" + dependencies: + object-assign "4.1.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.1.0.tgz#1769f4b551eedce419f0505deae2e26763542d37" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" + +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + dependencies: + mkdirp "^0.5.1" + +ws@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018" + dependencies: + options ">=0.0.5" + ultron "1.0.x" + +wtf-8@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + +xml-name-validator@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + +xmldom@^0.1.19: + version "0.1.27" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" + +xmlhttprequest-ssl@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" + +xtend@^4.0.0, xtend@~4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +y18n@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + +yam@0.0.22: + version "0.0.22" + resolved "https://registry.yarnpkg.com/yam/-/yam-0.0.22.tgz#38a76cb79a19284d9206ed49031e359a1340bd06" + dependencies: + fs-extra "^0.30.0" + lodash.merge "^4.4.0" + +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" + +yargs@~3.27.0: + version "3.27.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.27.0.tgz#21205469316e939131d59f2da0c6d7f98221ea40" + dependencies: + camelcase "^1.2.1" + cliui "^2.1.0" + decamelize "^1.0.0" + os-locale "^1.4.0" + window-size "^0.1.2" + y18n "^3.2.0" + +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" From 354a9a62d77034a8586b16afb0f364ca1df772b8 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Tue, 11 Jul 2017 14:14:30 +0100 Subject: [PATCH 056/879] Use headless Chrome of TravisCI (#1128) * CI: Use "chrome" addon on containerized runners * testem: Use headless Chrome by default * CI: Remove phantomjs --- .travis.yml | 17 ++++++----------- testem.js | 10 +++++++++- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index c870479d7..467e51683 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,9 +5,12 @@ node_js: - "6" - "7" -sudo: required +sudo: false dist: trusty +addons: + chrome: stable + cache: yarn: true directories: @@ -28,17 +31,9 @@ matrix: - env: EMBER_TRY_SCENARIO=ember-canary before_install: - - curl -o- -L https://yarnpkg.com/install.sh | bash - - export PATH=$HOME/.yarn/bin:$PATH - - export CHROME_BIN=/usr/bin/google-chrome - - export DISPLAY=:99.0 - - sh -e /etc/init.d/xvfb start - - sudo apt-get update - - sudo apt-get install -y libappindicator1 fonts-liberation - - wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb - - sudo dpkg -i google-chrome*.deb - if [[ $(npm -v | cut -d '.' -f 1) -lt 3 ]]; then npm i -g npm@^3; fi - - yarn global add bower phantomjs-prebuilt + - npm config set spin false + - npm install -g bower install: - yarn install --no-lockfile --non-interactive diff --git a/testem.js b/testem.js index 15618d60b..429757370 100644 --- a/testem.js +++ b/testem.js @@ -8,5 +8,13 @@ module.exports = { ], "launch_in_dev": [ "Chrome" - ] + ], + browser_args: { + Chrome: [ + '--disable-gpu', + '--headless', + '--remote-debugging-port=9222', + '--window-size=1440,900' + ] + } }; From 3554e31e86dadb54597e4d45ceb78b5f0bf4518a Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Tue, 11 Jul 2017 14:14:55 +0100 Subject: [PATCH 057/879] package.json: Update "engines" property (#1129) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8d8c2d317..14e85abc2 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "homepage": "https://github.com/samselikoff/ember-cli-mirage", "engines": { - "node": ">= 0.12.0" + "node": "^4.5 || 6.* || >= 7.*" }, "author": "Sam Selikoff", "license": "MIT", From 425606f91ede84b9f8327c9d64001ad67dcfef59 Mon Sep 17 00:00:00 2001 From: Kelly Selden Date: Tue, 11 Jul 2017 15:04:28 -0700 Subject: [PATCH 058/879] fix master --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 467e51683..9c01c70ec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,6 +31,8 @@ matrix: - env: EMBER_TRY_SCENARIO=ember-canary before_install: + - curl -o- -L https://yarnpkg.com/install.sh | bash + - export PATH=$HOME/.yarn/bin:$PATH - if [[ $(npm -v | cut -d '.' -f 1) -lt 3 ]]; then npm i -g npm@^3; fi - npm config set spin false - npm install -g bower From a8356bebb657edba0d237ac2d4559cbc86e68cfe Mon Sep 17 00:00:00 2001 From: Kelly Selden Date: Tue, 11 Jul 2017 13:01:22 -0700 Subject: [PATCH 059/879] fix template strings --- tests/acceptance/custom-handlers-test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/acceptance/custom-handlers-test.js b/tests/acceptance/custom-handlers-test.js index 4b0e0ee36..57d5beef6 100644 --- a/tests/acceptance/custom-handlers-test.js +++ b/tests/acceptance/custom-handlers-test.js @@ -26,7 +26,7 @@ test('You can customize the response by passing a handler function that returns test('You can customize the response code of a custom handler passing the code as 3rd argument', function(assert) { let done = assert.async(); let request = ajax({ - url: '/pets/${rex.id}', + url: `/pets/${rex.id}`, method: 'delete' }); @@ -55,7 +55,7 @@ test('You can can programatically returns a tailored response by returning a Mir test('returning a non-blank response from a custom handler whose default status is 204 changes the status to 200', function(assert) { let done = assert.async(); let request = ajax({ - url: '/pets/${rex.id}', + url: `/pets/${rex.id}`, method: 'put', data: JSON.stringify({ pet: { id: rex.id, name: 'The Rex', alive: true } }) }); From 42590897a6ca2db7db6655aef5c6e9ce5d9f038f Mon Sep 17 00:00:00 2001 From: Kelly Selden Date: Fri, 23 Jun 2017 14:18:50 -0700 Subject: [PATCH 060/879] add some namespace acceptance coverage --- tests/acceptance/custom-handlers-test.js | 6 +++--- tests/dummy/app/adapters/application.js | 4 +++- tests/dummy/app/adapters/word-smith.js | 8 ++++---- tests/dummy/mirage/config.js | 2 ++ 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/tests/acceptance/custom-handlers-test.js b/tests/acceptance/custom-handlers-test.js index 57d5beef6..6a5c9545c 100644 --- a/tests/acceptance/custom-handlers-test.js +++ b/tests/acceptance/custom-handlers-test.js @@ -26,7 +26,7 @@ test('You can customize the response by passing a handler function that returns test('You can customize the response code of a custom handler passing the code as 3rd argument', function(assert) { let done = assert.async(); let request = ajax({ - url: `/pets/${rex.id}`, + url: `/api/pets/${rex.id}`, method: 'delete' }); @@ -39,7 +39,7 @@ test('You can customize the response code of a custom handler passing the code a test('You can can programatically returns a tailored response by returning a Mirage.Response', function(assert) { let done = assert.async(); let request = ajax({ - url: '/pets', + url: '/api/pets', method: 'post', data: JSON.stringify({ pet: { alive: true } }) }); @@ -55,7 +55,7 @@ test('You can can programatically returns a tailored response by returning a Mir test('returning a non-blank response from a custom handler whose default status is 204 changes the status to 200', function(assert) { let done = assert.async(); let request = ajax({ - url: `/pets/${rex.id}`, + url: `/api/pets/${rex.id}`, method: 'put', data: JSON.stringify({ pet: { id: rex.id, name: 'The Rex', alive: true } }) }); diff --git a/tests/dummy/app/adapters/application.js b/tests/dummy/app/adapters/application.js index 0aa14480c..e230b3c54 100644 --- a/tests/dummy/app/adapters/application.js +++ b/tests/dummy/app/adapters/application.js @@ -1,3 +1,5 @@ import ActiveModelAdapter from 'active-model-adapter'; -export default ActiveModelAdapter; +export default ActiveModelAdapter.extend({ + namespace: 'api' +}); diff --git a/tests/dummy/app/adapters/word-smith.js b/tests/dummy/app/adapters/word-smith.js index 9c2d2e317..b37ab130e 100644 --- a/tests/dummy/app/adapters/word-smith.js +++ b/tests/dummy/app/adapters/word-smith.js @@ -1,5 +1,5 @@ -import DS from 'ember-data'; +import JSONAPIAdapter from 'ember-data/adapters/json-api'; -const { JSONAPIAdapter } = DS; - -export default JSONAPIAdapter; +export default JSONAPIAdapter.extend({ + namespace: 'api' +}); diff --git a/tests/dummy/mirage/config.js b/tests/dummy/mirage/config.js index 419fa990a..2faeaf81b 100644 --- a/tests/dummy/mirage/config.js +++ b/tests/dummy/mirage/config.js @@ -4,6 +4,8 @@ import Ember from 'ember'; const { isBlank } = Ember; export default function() { + this.namespace = '/api'; + // Contacts this.get('/contacts'); // this.get('/contacts', ['contacts', 'addresses']); From 353ae563a2225f7dc3cbb60642b0ba9121020930 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Wed, 12 Jul 2017 13:10:29 +0100 Subject: [PATCH 061/879] package.json: Sort contents according to documentation (#1135) --- package.json | 70 ++++++++++++++++++++++++++-------------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/package.json b/package.json index 14e85abc2..8f9c60b70 100644 --- a/package.json +++ b/package.json @@ -2,28 +2,48 @@ "name": "ember-cli-mirage", "version": "0.3.4", "description": "A client-side HTTP server to develop, test and demo your Ember app", + "keywords": [ + "ember-addon", + "pretender", + "prototype", + "server", + "testing" + ], + "homepage": "https://github.com/samselikoff/ember-cli-mirage", + "bugs": { + "url": "https://github.com/samselikoff/ember-cli-mirage/issues" + }, + "license": "MIT", + "author": "Sam Selikoff", "directories": { "doc": "doc", "test": "tests" }, - "scripts": { - "build": "ember build", - "start": "ember server", - "test": "ember try:each && mocha tests/**/*-test-node.js" - }, "repository": { "type": "git", "url": "https://github.com/samselikoff/ember-cli-mirage.git" }, - "bugs": { - "url": "https://github.com/samselikoff/ember-cli-mirage/issues" + "scripts": { + "build": "ember build", + "start": "ember server", + "test": "ember try:each && mocha tests/**/*-test-node.js" }, - "homepage": "https://github.com/samselikoff/ember-cli-mirage", - "engines": { - "node": "^4.5 || 6.* || >= 7.*" + "dependencies": { + "broccoli-funnel": "^1.0.2", + "broccoli-merge-trees": "^1.1.0", + "broccoli-stew": "^1.5.0", + "chalk": "^1.1.1", + "ember-cli-babel": "^5.1.7", + "ember-cli-node-assets": "^0.1.4", + "ember-get-config": "0.2.1", + "ember-inflector": "^2.0.0", + "ember-lodash": "^4.17.3", + "exists-sync": "0.0.3", + "fake-xml-http-request": "^1.4.0", + "faker": "^3.0.0", + "pretender": "^1.4.2", + "route-recognizer": "^0.2.3" }, - "author": "Sam Selikoff", - "license": "MIT", "devDependencies": { "active-model-adapter": "^2.0.3", "broccoli-asset-rev": "^2.4.5", @@ -54,30 +74,10 @@ "loader.js": "^4.0.10", "mocha": "^2.1.0" }, - "keywords": [ - "ember-addon", - "pretender", - "testing", - "prototype", - "server" - ], + "engines": { + "node": "^4.5 || 6.* || >= 7.*" + }, "ember-addon": { "configPath": "tests/dummy/config" - }, - "dependencies": { - "broccoli-funnel": "^1.0.2", - "broccoli-merge-trees": "^1.1.0", - "broccoli-stew": "^1.5.0", - "chalk": "^1.1.1", - "ember-cli-babel": "^5.1.7", - "ember-cli-node-assets": "^0.1.4", - "ember-get-config": "0.2.1", - "ember-inflector": "^2.0.0", - "ember-lodash": "^4.17.3", - "exists-sync": "0.0.3", - "fake-xml-http-request": "^1.4.0", - "faker": "^3.0.0", - "pretender": "^1.4.2", - "route-recognizer": "^0.2.3" } } From a67e80290256864fbed502cf21da3b90427e1eb5 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 12 Jul 2017 08:11:17 -0400 Subject: [PATCH 062/879] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3d5d5c982..6b082c3de 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ ember install ember-cli-mirage # install:addon for Ember CLI < 0.2.3 ## Updating -This project is new and the API is subject to change. When updating your project to a newer version of Ember CLI Mirage, please consult [the changelog](/CHANGELOG.md) for any update notes. +When updating your project to a newer version of Ember CLI Mirage, please consult [the changelog](/CHANGELOG.md) for any update notes. ## Getting started From e19fae6938ebaf37c4471f0b47016c6597f8bf1a Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Thu, 13 Jul 2017 04:18:13 +0200 Subject: [PATCH 063/879] CI: Use yarn to install bower (#1134) for real this time...! --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9c01c70ec..c533f5b31 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,8 +34,7 @@ before_install: - curl -o- -L https://yarnpkg.com/install.sh | bash - export PATH=$HOME/.yarn/bin:$PATH - if [[ $(npm -v | cut -d '.' -f 1) -lt 3 ]]; then npm i -g npm@^3; fi - - npm config set spin false - - npm install -g bower + - yarn global add bower install: - yarn install --no-lockfile --non-interactive From 8dde71d10c77d6986e2a4e33785a87b8a55bd579 Mon Sep 17 00:00:00 2001 From: bekzod Date: Tue, 18 Jul 2017 14:19:42 +0500 Subject: [PATCH 064/879] bump pretender and disable request tracking in pretender --- addon/server.js | 2 +- package.json | 2 +- yarn.lock | 72 ++++++++++++++----------------------------------- 3 files changed, 22 insertions(+), 54 deletions(-) diff --git a/addon/server.js b/addon/server.js index 77785beac..28a00684e 100644 --- a/addon/server.js +++ b/addon/server.js @@ -62,7 +62,7 @@ function createPretender(server) { mirage/config.js file. Did you forget to add your namespace?` ); }; - }); + }, { trackRequests: false }); } const defaultRouteOptions = { diff --git a/package.json b/package.json index 8f9c60b70..c84b71623 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "exists-sync": "0.0.3", "fake-xml-http-request": "^1.4.0", "faker": "^3.0.0", - "pretender": "^1.4.2", + "pretender": "^1.5.1", "route-recognizer": "^0.2.3" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 98d8923ae..170cef1ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -234,10 +234,6 @@ ast-types@0.8.12: version "0.8.12" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.12.tgz#a0d90e4351bb887716c83fd637ebf818af4adfcc" -ast-types@0.8.15: - version "0.8.15" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.15.tgz#8eef0827f04dff0ec8857ba925abe3fea6194e52" - ast-types@0.9.6: version "0.9.6" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" @@ -2954,6 +2950,10 @@ fake-xml-http-request@^1.4.0: version "1.5.0" resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-1.5.0.tgz#d79602a97043d4d8fea671d5d904af38847b451d" +fake-xml-http-request@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-1.6.0.tgz#bd0ac79ae3e2660098282048a12c730a6f64d550" + faker@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/faker/-/faker-3.1.0.tgz#0f908faf4e6ec02524e54a57e432c5c013e08c9f" @@ -3311,7 +3311,7 @@ glob@3.2.11: inherits "2" minimatch "0.3" -glob@7.1.1: +glob@7.1.1, glob@^7.0.0, glob@^7.0.3, glob@^7.0.4, glob@^7.0.5: version "7.1.1" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" dependencies: @@ -3332,17 +3332,6 @@ glob@^5.0.10, glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.4, glob@^7.0.5: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - global-modules@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" @@ -3561,14 +3550,10 @@ iconv-lite@0.4.13: version "0.4.13" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" -iconv-lite@0.4.15: +iconv-lite@0.4.15, iconv-lite@^0.4.5, iconv-lite@~0.4.13: version "0.4.15" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" -iconv-lite@^0.4.5, iconv-lite@~0.4.13: - version "0.4.18" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" - ignore@^3.2.0: version "3.3.3" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d" @@ -4358,7 +4343,7 @@ minimatch@0.3: lru-cache "2" sigmund "~1.0.0" -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: @@ -4370,7 +4355,7 @@ minimatch@^2.0.3: dependencies: brace-expansion "^1.0.0" -minimist@0.0.8: +minimist@0.0.8, minimist@~0.0.1: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -4378,10 +4363,6 @@ minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - mkdirp@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" @@ -4820,12 +4801,12 @@ preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" -pretender@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/pretender/-/pretender-1.4.2.tgz#dde9995dfdf75b28a3dd7a73cde2f9f612e5e8f4" +pretender@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pretender/-/pretender-1.5.1.tgz#bd9098c03d39c3bc7dcb84a28ee27e096e2e32b8" dependencies: - fake-xml-http-request "^1.4.0" - route-recognizer "^0.2.3" + fake-xml-http-request "^1.6.0" + route-recognizer "^0.3.3" printf@^0.2.3: version "0.2.5" @@ -4874,14 +4855,10 @@ q@^1.1.2: version "1.5.0" resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" -qs@6.4.0, qs@~6.4.0: +qs@6.4.0, qs@^6.4.0, qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" -qs@^6.4.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.0.tgz#8d04954d364def3efc55b5a0793e1e2c8b1e6e49" - quick-temp@^0.1.0, quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quick-temp@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/quick-temp/-/quick-temp-0.1.8.tgz#bab02a242ab8fb0dd758a3c9776b32f9a5d94408" @@ -4979,7 +4956,7 @@ readline2@^1.0.1: is-fullwidth-code-point "^1.0.0" mute-stream "0.0.5" -recast@0.10.33: +recast@0.10.33, recast@^0.10.10: version "0.10.33" resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.33.tgz#942808f7aa016f1fa7142c461d7e5704aaa8d697" dependencies: @@ -4988,15 +4965,6 @@ recast@0.10.33: private "~0.1.5" source-map "~0.5.0" -recast@^0.10.10: - version "0.10.43" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.43.tgz#b95d50f6d60761a5f6252e15d80678168491ce7f" - dependencies: - ast-types "0.8.15" - esprima-fb "~15001.1001.0-dev-harmony-fb" - private "~0.1.5" - source-map "~0.5.0" - recast@^0.11.17, recast@^0.11.3: version "0.11.23" resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" @@ -5196,6 +5164,10 @@ route-recognizer@^0.2.3: version "0.2.10" resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.2.10.tgz#024b2283c2e68d13a7c7f5173a5924645e8902df" +route-recognizer@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.3.tgz#1d365e27fa6995e091675f7dc940a8c00353bd29" + rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.2.1, rsvp@^3.3.1, rsvp@^3.3.3, rsvp@^3.5.0: version "3.6.1" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.1.tgz#34f4a7ac2859f7bacc8f49789c5604f1e26ae702" @@ -5481,11 +5453,7 @@ spawnback@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/spawnback/-/spawnback-1.0.0.tgz#f73662f7e54d95367eca74d6426c677dd7ea686f" -sprintf-js@^1.0.3: - version "1.1.1" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c" - -sprintf-js@~1.0.2: +sprintf-js@^1.0.3, sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" From eb9a03e27670712016f7f7bfddae318941d34152 Mon Sep 17 00:00:00 2001 From: Jonathan Johnson Date: Tue, 16 May 2017 01:14:32 -0700 Subject: [PATCH 065/879] RestSerializer should always serialize ids Override the default Serializer behavior in the RestSerializer to convert ids in the expected way. --- addon/serializers/rest-serializer.js | 1 + tests/unit/serializers/rest-serializer-test.js | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/addon/serializers/rest-serializer.js b/addon/serializers/rest-serializer.js index 56caac47e..439660cf5 100644 --- a/addon/serializers/rest-serializer.js +++ b/addon/serializers/rest-serializer.js @@ -2,6 +2,7 @@ import ActiveModelSerializer from './active-model-serializer'; import { camelize, singularize, pluralize } from '../utils/inflector'; export default ActiveModelSerializer.extend({ + serializeIds: 'always', keyForModel(type) { return camelize(type); diff --git a/tests/unit/serializers/rest-serializer-test.js b/tests/unit/serializers/rest-serializer-test.js index 60a852285..232777f7b 100644 --- a/tests/unit/serializers/rest-serializer-test.js +++ b/tests/unit/serializers/rest-serializer-test.js @@ -29,3 +29,8 @@ test('it hyphenates camelized words', function(assert) { } }); }); + +test('serializeIds defaults to "always"', function(assert) { + let defaultState = new RestSerializer; + assert.equal(defaultState.serializeIds, 'always'); +}); From 2856df9eab30a724a54fa23856238a6cec75f2b8 Mon Sep 17 00:00:00 2001 From: Jonathan Johnson Date: Sat, 24 Jun 2017 11:17:22 -0700 Subject: [PATCH 066/879] ActiveModel serializer should always serialize to ids Override the default Serializer behavior in the RestSerializer to convert ids in the expected way. --- addon/serializers/active-model-serializer.js | 1 + .../integration/serializers/active-model-serializer-test.js | 5 +++++ tests/unit/serializers/active-model-serializer-test.js | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/addon/serializers/active-model-serializer.js b/addon/serializers/active-model-serializer.js index a96ca67a2..397cf1889 100644 --- a/addon/serializers/active-model-serializer.js +++ b/addon/serializers/active-model-serializer.js @@ -2,6 +2,7 @@ import Serializer from '../serializer'; import { underscore, pluralize, dasherize, singularize } from '../utils/inflector'; export default Serializer.extend({ + serializeIds: 'always', keyForModel(type) { return underscore(type); diff --git a/tests/integration/serializers/active-model-serializer-test.js b/tests/integration/serializers/active-model-serializer-test.js index 124501407..9a1145389 100644 --- a/tests/integration/serializers/active-model-serializer-test.js +++ b/tests/integration/serializers/active-model-serializer-test.js @@ -43,19 +43,24 @@ module('Integration | Serializer | ActiveModelSerializer', { this.registry = new SerializerRegistry(this.schema, { application: ActiveModelSerializer, wordSmith: ActiveModelSerializer.extend({ + serializeIds: 'included', attrs: ['id', 'name'], include: ['blogPosts'] }), blogPost: ActiveModelSerializer.extend({ + serializeIds: 'included', include: ['wordSmith', 'comments'] }), comment: ActiveModelSerializer.extend({ + serializeIds: 'included', include: ['commentable'] }), contactInfo: ActiveModelSerializer.extend({ + serializeIds: 'included', include: ['user'] }), user: ActiveModelSerializer.extend({ + serializeIds: 'included', attrs: ['id', 'name'], include: ['contactInfos'], embed: true diff --git a/tests/unit/serializers/active-model-serializer-test.js b/tests/unit/serializers/active-model-serializer-test.js index 439757f41..24c45c9d2 100644 --- a/tests/unit/serializers/active-model-serializer-test.js +++ b/tests/unit/serializers/active-model-serializer-test.js @@ -68,3 +68,7 @@ test('it works without an id', function(assert) { }); }); +test('serializeIds defaults to "always"', function(assert) { + let defaultState = new ActiveModelSerializer; + assert.equal(defaultState.serializeIds, 'always'); +}); From bccbd720ec87658b2e39e5451a395f3ca6af0b4f Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Thu, 20 Jul 2017 16:05:14 +0200 Subject: [PATCH 067/879] Move Node tests into "node-tests" folder We don't want to transpile them into the Ember project test tree --- .../addon-tree-test-node.js => node-tests/addon-tree-test.js | 0 .../import-files-test.js | 0 package.json | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) rename tests/unit/addon-tree-test-node.js => node-tests/addon-tree-test.js (100%) rename tests/unit/import-files-test-node.js => node-tests/import-files-test.js (100%) diff --git a/tests/unit/addon-tree-test-node.js b/node-tests/addon-tree-test.js similarity index 100% rename from tests/unit/addon-tree-test-node.js rename to node-tests/addon-tree-test.js diff --git a/tests/unit/import-files-test-node.js b/node-tests/import-files-test.js similarity index 100% rename from tests/unit/import-files-test-node.js rename to node-tests/import-files-test.js diff --git a/package.json b/package.json index 8f9c60b70..08d5cc2fc 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "scripts": { "build": "ember build", "start": "ember server", - "test": "ember try:each && mocha tests/**/*-test-node.js" + "test": "ember try:each && mocha node-tests/**/*-test.js" }, "dependencies": { "broccoli-funnel": "^1.0.2", From a740f2946dccf2656574ce0d6f38e5c52a1fa278 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Thu, 20 Jul 2017 16:07:30 +0200 Subject: [PATCH 068/879] package.json: Add more "test" scripts --- package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 08d5cc2fc..86cf7c9ab 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,10 @@ "scripts": { "build": "ember build", "start": "ember server", - "test": "ember try:each && mocha node-tests/**/*-test.js" + "test": "ember test", + "test:all": "ember try:each", + "test:fastboot": "ember fastboot:test", + "test:node": "mocha node-tests/**/*-test.js" }, "dependencies": { "broccoli-funnel": "^1.0.2", From 4703af184680e375417f3f0c1e9e9733fb5009a0 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Thu, 20 Jul 2017 16:13:27 +0200 Subject: [PATCH 069/879] CI: Add "node-tests" scenario to build matrix --- .travis.yml | 1 + config/ember-try.js | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/.travis.yml b/.travis.yml index c533f5b31..2c8782507 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,6 +24,7 @@ env: - EMBER_TRY_SCENARIO=ember-beta - EMBER_TRY_SCENARIO=ember-canary - EMBER_TRY_SCENARIO=fastboot-tests + - EMBER_TRY_SCENARIO=node-tests matrix: fast_finish: true diff --git a/config/ember-try.js b/config/ember-try.js index f839664e6..49126a5df 100644 --- a/config/ember-try.js +++ b/config/ember-try.js @@ -56,6 +56,13 @@ module.exports = { } } }, + { + name: 'node-tests', + command: 'yarn run test:node', + npm: { + devDependencies: {} + } + }, { name: 'fastboot-tests', command: 'ember fastboot:test', From 0d61ac589c68c6b98d9a12da5d5e90fa0ff01179 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Thu, 20 Jul 2017 16:27:56 +0200 Subject: [PATCH 070/879] Update "ember-cli" to v2.14.0 --- .gitignore | 5 +++++ .npmignore | 1 + package.json | 2 +- testem.js | 14 +++++++------- yarn.lock | 2 +- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 9b1890c46..3c12fc211 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,8 @@ jekyll-tmp # IDE /.idea/ /*.iml + +# ember-try +.node_modules.ember-try/ +bower.json.ember-try +package.json.ember-try diff --git a/.npmignore b/.npmignore index a1e78fbe2..332f0736a 100644 --- a/.npmignore +++ b/.npmignore @@ -10,6 +10,7 @@ .editorconfig .ember-cli .gitignore +.eslintrc.js .watchmanconfig .travis.yml bower.json diff --git a/package.json b/package.json index 8f9c60b70..729ab4f10 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "broccoli-asset-rev": "^2.4.5", "chai": "^4.0.1", "ember-ajax": "^2.4.1", - "ember-cli": "^2.9.1", + "ember-cli": "^2.14.0", "ember-cli-app-version": "^2.0.0", "ember-cli-content-security-policy": "0.4.0", "ember-cli-dependency-checker": "^1.3.0", diff --git a/testem.js b/testem.js index 429757370..f0a69263e 100644 --- a/testem.js +++ b/testem.js @@ -1,13 +1,13 @@ /* eslint-env node */ + module.exports = { - "framework": "qunit", - "test_page": "tests/index.html?hidepassed", - "disable_watching": true, - "launch_in_ci": [ - "Chrome" + test_page: 'tests/index.html?hidepassed', + disable_watching: true, + launch_in_ci: [ + 'Chrome' ], - "launch_in_dev": [ - "Chrome" + launch_in_dev: [ + 'Chrome' ], browser_args: { Chrome: [ diff --git a/yarn.lock b/yarn.lock index 98d8923ae..35377efb0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2318,7 +2318,7 @@ ember-cli-version-checker@^2.0.0: resolve "^1.3.3" semver "^5.3.0" -ember-cli@^2.9.1: +ember-cli@^2.14.0: version "2.14.0" resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-2.14.0.tgz#9aff1414168883183e8677fa32626d1e3228ccbc" dependencies: From 0c443e4e00c52f7ab39cddb8abc0ade191ce6f53 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Thu, 20 Jul 2017 16:32:45 +0200 Subject: [PATCH 071/879] Update "ember-cli-qunit" to v4.0.0 --- package.json | 2 +- tests/test-helper.js | 6 +++--- yarn.lock | 27 ++++++++++++++++----------- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 729ab4f10..ebf16a330 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "ember-cli-htmlbars": "^1.0.10", "ember-cli-htmlbars-inline-precompile": "^0.3.3", "ember-cli-inject-live-reload": "^1.4.1", - "ember-cli-qunit": "^3.0.1", + "ember-cli-qunit": "^4.0.0", "ember-cli-release": "^0.2.9", "ember-cli-sri": "^2.1.0", "ember-cli-test-loader": "^1.1.0", diff --git a/tests/test-helper.js b/tests/test-helper.js index e6cfb70fe..d4c7e837d 100644 --- a/tests/test-helper.js +++ b/tests/test-helper.js @@ -1,6 +1,6 @@ import resolver from './helpers/resolver'; -import { - setResolver -} from 'ember-qunit'; +import { setResolver } from 'ember-qunit'; +import { start } from 'ember-cli-qunit'; setResolver(resolver); +start(); diff --git a/yarn.lock b/yarn.lock index 35377efb0..c3d3a1f82 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2092,7 +2092,7 @@ ember-cli-babel@^5.0.0, ember-cli-babel@^5.1.10, ember-cli-babel@^5.1.3, ember-c ember-cli-version-checker "^1.0.2" resolve "^1.1.2" -ember-cli-babel@^6.0.0: +ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7: version "6.6.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.6.0.tgz#a8362bc44841bfdf89b389f3197f104d7ba526da" dependencies: @@ -2241,17 +2241,16 @@ ember-cli-preprocess-registry@^3.1.0: process-relative-require "^1.0.0" silent-error "^1.0.0" -ember-cli-qunit@^3.0.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/ember-cli-qunit/-/ember-cli-qunit-3.1.2.tgz#f47063ad6af0c69cd76661ccfefd453a10d7a93b" +ember-cli-qunit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-qunit/-/ember-cli-qunit-4.0.0.tgz#1f0022469a5bd64f627b8102880a25e94e533a3b" dependencies: - broccoli-babel-transpiler "^5.5.0" broccoli-funnel "^1.0.1" - broccoli-merge-trees "^1.1.0" - ember-cli-babel "^5.1.5" - ember-cli-test-loader "^1.1.1" + broccoli-merge-trees "^2.0.0" + ember-cli-babel "^6.0.0-beta.7" + ember-cli-test-loader "^2.0.0" ember-cli-version-checker "^1.1.4" - ember-qunit "^2.0.0-beta.1" + ember-qunit "^2.1.3" qunit-notifications "^0.1.1" qunitjs "^2.0.1" resolve "^1.1.6" @@ -2287,12 +2286,18 @@ ember-cli-test-info@^1.0.0: dependencies: ember-cli-string-utils "^1.0.0" -ember-cli-test-loader@^1.1.0, ember-cli-test-loader@^1.1.1: +ember-cli-test-loader@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ember-cli-test-loader/-/ember-cli-test-loader-1.1.1.tgz#333311209b18185d0e0e95f918349da10cacf0b1" dependencies: ember-cli-babel "^5.2.1" +ember-cli-test-loader@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-test-loader/-/ember-cli-test-loader-2.1.0.tgz#16163bae0ac32cad1af13c4ed94c6c698b54d431" + dependencies: + ember-cli-babel "^6.0.0-beta.7" + ember-cli-uglify@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/ember-cli-uglify/-/ember-cli-uglify-1.2.0.tgz#3208c32b54bc2783056e8bb0d5cfe9bbaf17ffb2" @@ -2505,7 +2510,7 @@ ember-lodash@^4.17.3: ember-cli-babel "6.1.0" lodash-es "^4.17.4" -ember-qunit@^2.0.0-beta.1: +ember-qunit@^2.1.3: version "2.1.4" resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-2.1.4.tgz#5732794e668f753d8fe1a353692ffeda73742d29" dependencies: From c0345ecebd80d70ccc4976269d5f7a0125f284d8 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Thu, 20 Jul 2017 16:33:32 +0200 Subject: [PATCH 072/879] Remove obsolete QUnit subdependencies --- bower.json | 2 -- package.json | 1 - yarn.lock | 8 +------- 3 files changed, 1 insertion(+), 10 deletions(-) diff --git a/bower.json b/bower.json index 9d3780f6e..90692e4b2 100644 --- a/bower.json +++ b/bower.json @@ -4,8 +4,6 @@ "jquery": "2.1.4", "ember": "2.10.0", "ember-cli-shims": "0.1.3", - "ember-cli-test-loader": "0.2.2", - "ember-qunit-notifications": "0.1.0", "sinonjs": "~1.17.1" } } diff --git a/package.json b/package.json index ebf16a330..2f9e998d3 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,6 @@ "ember-cli-qunit": "^4.0.0", "ember-cli-release": "^0.2.9", "ember-cli-sri": "^2.1.0", - "ember-cli-test-loader": "^1.1.0", "ember-cli-uglify": "^1.2.0", "ember-data": "~2.11.0", "ember-disable-prototype-extensions": "^1.1.0", diff --git a/yarn.lock b/yarn.lock index c3d3a1f82..e13cbbedb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2082,7 +2082,7 @@ ember-cli-babel@6.1.0: clone "^2.0.0" ember-cli-version-checker "^1.2.0" -ember-cli-babel@^5.0.0, ember-cli-babel@^5.1.10, ember-cli-babel@^5.1.3, ember-cli-babel@^5.1.5, ember-cli-babel@^5.1.6, ember-cli-babel@^5.1.7, ember-cli-babel@^5.2.1: +ember-cli-babel@^5.0.0, ember-cli-babel@^5.1.10, ember-cli-babel@^5.1.3, ember-cli-babel@^5.1.5, ember-cli-babel@^5.1.6, ember-cli-babel@^5.1.7: version "5.2.4" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-5.2.4.tgz#5ce4f46b08ed6f6d21e878619fb689719d6e8e13" dependencies: @@ -2286,12 +2286,6 @@ ember-cli-test-info@^1.0.0: dependencies: ember-cli-string-utils "^1.0.0" -ember-cli-test-loader@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ember-cli-test-loader/-/ember-cli-test-loader-1.1.1.tgz#333311209b18185d0e0e95f918349da10cacf0b1" - dependencies: - ember-cli-babel "^5.2.1" - ember-cli-test-loader@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-cli-test-loader/-/ember-cli-test-loader-2.1.0.tgz#16163bae0ac32cad1af13c4ed94c6c698b54d431" From e5ec19c4c0cb6652dbb4b370075c0515443ace1e Mon Sep 17 00:00:00 2001 From: Dan Freeman Date: Thu, 20 Jul 2017 10:38:45 -0400 Subject: [PATCH 073/879] Unlock and upgrade ember-get-config (#1138) --- package.json | 2 +- yarn.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 8f9c60b70..8bea4da08 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "chalk": "^1.1.1", "ember-cli-babel": "^5.1.7", "ember-cli-node-assets": "^0.1.4", - "ember-get-config": "0.2.1", + "ember-get-config": "^0.2.2", "ember-inflector": "^2.0.0", "ember-lodash": "^4.17.3", "exists-sync": "0.0.3", diff --git a/yarn.lock b/yarn.lock index 98d8923ae..6808c2e91 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2471,9 +2471,9 @@ ember-fastboot-addon-tests@^0.4.0: request "^2.74.0" rsvp "^3.3.1" -ember-get-config@0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.2.1.tgz#a1325cceefcb4534c78fc6ccb2be87a3feda6817" +ember-get-config@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.2.2.tgz#54d96fae87bcd75a3dd710113ed1db3afbe4fe9d" dependencies: broccoli-file-creator "^1.1.1" ember-cli-babel "^5.1.6" From 8adc2f2b5b68a39b4a08f490eb069942f1464e86 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sun, 23 Jul 2017 17:00:58 +0200 Subject: [PATCH 074/879] Update to Babel 6 (#1143) * Update "ember-cli-babel" to v6.6.0 * Update "ember-cli-htmlbars-inline-precompile" to v0.4.0 --- package.json | 4 ++-- yarn.lock | 21 +++++++++------------ 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index eed6ce106..834f1ec3a 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "broccoli-merge-trees": "^1.1.0", "broccoli-stew": "^1.5.0", "chalk": "^1.1.1", - "ember-cli-babel": "^5.1.7", + "ember-cli-babel": "^6.6.0", "ember-cli-node-assets": "^0.1.4", "ember-get-config": "^0.2.2", "ember-inflector": "^2.0.0", @@ -58,7 +58,7 @@ "ember-cli-dependency-checker": "^1.3.0", "ember-cli-eslint": "3.0.0", "ember-cli-htmlbars": "^1.0.10", - "ember-cli-htmlbars-inline-precompile": "^0.3.3", + "ember-cli-htmlbars-inline-precompile": "^0.4.3", "ember-cli-inject-live-reload": "^1.4.1", "ember-cli-qunit": "^4.0.0", "ember-cli-release": "^0.2.9", diff --git a/yarn.lock b/yarn.lock index 6ec625b69..376dde3fa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -531,9 +531,9 @@ babel-plugin-filter-imports@^0.2.0: dependencies: json-stable-stringify "^1.0.1" -babel-plugin-htmlbars-inline-precompile@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.1.0.tgz#b784723bd1f108796b56faf9f1c05eb5ca442983" +babel-plugin-htmlbars-inline-precompile@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.2.3.tgz#cd365e278af409bfa6be7704c4354beee742446b" babel-plugin-inline-environment-variables@^1.0.1: version "1.0.1" @@ -2088,7 +2088,7 @@ ember-cli-babel@^5.0.0, ember-cli-babel@^5.1.10, ember-cli-babel@^5.1.3, ember-c ember-cli-version-checker "^1.0.2" resolve "^1.1.2" -ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7: +ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.6.0: version "6.6.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.6.0.tgz#a8362bc44841bfdf89b389f3197f104d7ba526da" dependencies: @@ -2147,16 +2147,13 @@ ember-cli-get-dependency-depth@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-get-dependency-depth/-/ember-cli-get-dependency-depth-1.0.0.tgz#e0afecf82a2d52f00f28ab468295281aec368d11" -ember-cli-htmlbars-inline-precompile@^0.3.3: - version "0.3.11" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-0.3.11.tgz#55f6858acf5576d9773678a674566b9ad9c79cbe" +ember-cli-htmlbars-inline-precompile@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-0.4.3.tgz#4123f507fea6c59ba4c272ef7e713a6d55ba06c9" dependencies: - babel-plugin-htmlbars-inline-precompile "^0.1.0" - ember-cli-babel "^5.1.3" - ember-cli-htmlbars "^1.0.0" + babel-plugin-htmlbars-inline-precompile "^0.2.3" + ember-cli-version-checker "^2.0.0" hash-for-dep "^1.0.2" - resolve "^1.3.3" - semver "^5.3.0" silent-error "^1.1.0" ember-cli-htmlbars@^1.0.0, ember-cli-htmlbars@^1.0.10: From 0c3dd5da7426403b77d7d417e049b374f6492b54 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sun, 23 Jul 2017 17:49:14 +0200 Subject: [PATCH 075/879] Update "mocha" to v3.4.2 --- package.json | 2 +- yarn.lock | 76 ++-------------------------------------------------- 2 files changed, 3 insertions(+), 75 deletions(-) diff --git a/package.json b/package.json index 834f1ec3a..c0eceeb68 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "ember-sinon": "0.5.1", "eslint-plugin-ember-suave": "^1.0.0", "loader.js": "^4.0.10", - "mocha": "^2.1.0" + "mocha": "^3.4.2" }, "engines": { "node": "^4.5 || 6.* || >= 7.*" diff --git a/yarn.lock b/yarn.lock index 376dde3fa..5bf2af2cd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1636,14 +1636,6 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" -commander@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06" - -commander@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873" - commander@2.8.x: version "2.8.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" @@ -1988,10 +1980,6 @@ detective@^4.3.1: acorn "^4.0.3" defined "^1.0.0" -diff@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" - diff@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" @@ -2078,7 +2066,7 @@ ember-cli-babel@6.1.0: clone "^2.0.0" ember-cli-version-checker "^1.2.0" -ember-cli-babel@^5.0.0, ember-cli-babel@^5.1.10, ember-cli-babel@^5.1.3, ember-cli-babel@^5.1.5, ember-cli-babel@^5.1.6, ember-cli-babel@^5.1.7: +ember-cli-babel@^5.0.0, ember-cli-babel@^5.1.10, ember-cli-babel@^5.1.5, ember-cli-babel@^5.1.6, ember-cli-babel@^5.1.7: version "5.2.4" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-5.2.4.tgz#5ce4f46b08ed6f6d21e878619fb689719d6e8e13" dependencies: @@ -2686,10 +2674,6 @@ escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" -escape-string-regexp@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1" - escape-string-regexp@1.0.5, escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -3300,13 +3284,6 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" -glob@3.2.11: - version "3.2.11" - resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" - dependencies: - inherits "2" - minimatch "0.3" - glob@7.1.1, glob@^7.0.0, glob@^7.0.3, glob@^7.0.4, glob@^7.0.5: version "7.1.1" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" @@ -3829,13 +3806,6 @@ istextorbinary@2.1.0: editions "^1.1.1" textextensions "1 || 2" -jade@0.26.3: - version "0.26.3" - resolved "https://registry.yarnpkg.com/jade/-/jade-0.26.3.tgz#8f10d7977d8d79f2f6ff862a81b0513ccb25686c" - dependencies: - commander "0.6.1" - mkdirp "0.3.0" - jquery@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.2.1.tgz#5c4d9de652af6cd0a770154a631bba12b015c787" @@ -4192,10 +4162,6 @@ loose-envify@^1.0.0: dependencies: js-tokens "^3.0.0" -lru-cache@2: - version "2.7.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" - lru-cache@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" @@ -4332,13 +4298,6 @@ mime@^1.2.11: version "1.3.6" resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0" -minimatch@0.3: - version "0.3.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" - dependencies: - lru-cache "2" - sigmund "~1.0.0" - "minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -4359,10 +4318,6 @@ minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -mkdirp@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" - mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" @@ -4373,22 +4328,7 @@ mktemp@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/mktemp/-/mktemp-0.4.0.tgz#6d0515611c8a8c84e484aa2000129b98e981ff0b" -mocha@^2.1.0: - version "2.5.3" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-2.5.3.tgz#161be5bdeb496771eb9b35745050b622b5aefc58" - dependencies: - commander "2.3.0" - debug "2.2.0" - diff "1.4.0" - escape-string-regexp "1.0.2" - glob "3.2.11" - growl "1.9.2" - jade "0.26.3" - mkdirp "0.5.1" - supports-color "1.2.0" - to-iso-string "0.0.2" - -mocha@^3.0.2: +mocha@^3.0.2, mocha@^3.4.2: version "3.4.2" resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.4.2.tgz#d0ef4d332126dbf18d0d640c9b382dd48be97594" dependencies: @@ -5293,10 +5233,6 @@ shellwords@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14" -sigmund@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" - signal-exit@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -5566,10 +5502,6 @@ sum-up@^1.0.1: dependencies: chalk "^1.0.0" -supports-color@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.2.0.tgz#ff1ed1e61169d06b3cf2d588e188b18d8847e17e" - supports-color@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" @@ -5730,10 +5662,6 @@ to-fast-properties@^1.0.0, to-fast-properties@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" -to-iso-string@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/to-iso-string/-/to-iso-string-0.0.2.tgz#4dc19e664dfccbe25bd8db508b00c6da158255d1" - tough-cookie@^2.3.2, tough-cookie@~2.3.0: version "2.3.2" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" From 128a67f6ca128d32ee0c624ede2dd633f2411529 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sun, 23 Jul 2017 17:51:01 +0200 Subject: [PATCH 076/879] Update "chai" to v4.1.0 --- package.json | 2 +- yarn.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index c0eceeb68..fc268fe9c 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "devDependencies": { "active-model-adapter": "^2.0.3", "broccoli-asset-rev": "^2.4.5", - "chai": "^4.0.1", + "chai": "^4.1.0", "ember-ajax": "^2.4.1", "ember-cli": "^2.14.0", "ember-cli-app-version": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index 5bf2af2cd..96220d3ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1480,9 +1480,9 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" -chai@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.0.2.tgz#2f7327c4de6f385dd7787999e2ab02697a32b83b" +chai@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.0.tgz#331a0391b55c3af8740ae9c3b7458bc1c3805e6d" dependencies: assertion-error "^1.0.1" check-error "^1.0.1" From 88e489b21c139efbcdc149907307028b060ec5b4 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Tue, 25 Jul 2017 22:28:27 +0200 Subject: [PATCH 077/879] Use "New Module Imports" instead of destructuring (#1145) --- addon/route-handler.js | 6 +++--- addon/server.js | 5 ++--- addon/utils/inflector.js | 7 ++----- addon/utils/read-modules.js | 4 +--- app/initializers/ember-cli-mirage.js | 7 ++----- fastboot-tests/fixtures/fastboot/app/router.js | 4 ++-- tests/acceptance/custom-handlers-test.js | 4 ++-- tests/acceptance/manually-starting-test.js | 4 +--- tests/dummy/app/app.js | 3 +-- tests/dummy/app/controllers/application.js | 4 +--- tests/dummy/app/router.js | 5 +++-- tests/dummy/app/routes/application.js | 4 +--- tests/dummy/app/routes/close-friends.js | 4 +--- tests/dummy/app/routes/contacts.js | 4 +--- tests/dummy/app/routes/friends.js | 4 +--- tests/dummy/app/routes/pets.js | 4 +--- tests/dummy/mirage/config.js | 5 ++--- tests/helpers/destroy-app.js | 4 +--- tests/helpers/module-for-acceptance.js | 5 ++--- tests/helpers/start-app.js | 6 +++--- tests/integration/route-handlers/function-handler-test.js | 5 ++--- 21 files changed, 35 insertions(+), 63 deletions(-) diff --git a/addon/route-handler.js b/addon/route-handler.js index fca8bcbfa..ab65fa14a 100644 --- a/addon/route-handler.js +++ b/addon/route-handler.js @@ -1,4 +1,6 @@ -import Ember from 'ember'; +import { isBlank, typeOf } from '@ember/utils'; +import { Promise } from 'rsvp'; + import { MirageError } from 'ember-cli-mirage/assert'; import Response from './response'; import FunctionHandler from './route-handlers/function'; @@ -9,8 +11,6 @@ import PutShorthandHandler from './route-handlers/shorthands/put'; import DeleteShorthandHandler from './route-handlers/shorthands/delete'; import HeadShorthandHandler from './route-handlers/shorthands/head'; -const { RSVP: { Promise }, isBlank, typeOf } = Ember; - function isNotBlankResponse(response) { return response && !(typeOf(response) === 'object' && Object.keys(response).length === 0) diff --git a/addon/server.js b/addon/server.js index 28a00684e..47823fb0b 100644 --- a/addon/server.js +++ b/addon/server.js @@ -1,10 +1,11 @@ /* eslint no-console: 0 */ +import { Promise } from 'rsvp'; + import { pluralize, camelize } from './utils/inflector'; import { toCollectionName } from 'ember-cli-mirage/utils/normalize-name'; import { getModels } from './ember-data'; import { hasEmberData } from './utils/ember-data'; -import Ember from 'ember'; import isAssociation from 'ember-cli-mirage/utils/is-association'; import Pretender from 'pretender'; import Db from './db'; @@ -19,8 +20,6 @@ import _find from 'lodash/find'; import _isPlainObject from 'lodash/isPlainObject'; import _isInteger from 'lodash/isInteger'; -const { RSVP: { Promise } } = Ember; - /** * Creates a new Pretender instance. * diff --git a/addon/utils/inflector.js b/addon/utils/inflector.js index b69f3002e..d16c72e71 100644 --- a/addon/utils/inflector.js +++ b/addon/utils/inflector.js @@ -1,7 +1,4 @@ -import Ember from 'ember'; +import { capitalize, camelize, dasherize, underscore } from '@ember/string'; export { singularize, pluralize } from 'ember-inflector'; -export var capitalize = Ember.String.capitalize; -export var camelize = Ember.String.camelize; -export var dasherize = Ember.String.dasherize; -export var underscore = Ember.String.underscore; +export { capitalize, camelize, dasherize, underscore }; diff --git a/addon/utils/read-modules.js b/addon/utils/read-modules.js index 11edbd9b9..e7526546c 100644 --- a/addon/utils/read-modules.js +++ b/addon/utils/read-modules.js @@ -2,13 +2,11 @@ /* eslint-env node */ 'use strict'; -import Ember from 'ember'; +import { assert } from '@ember/debug'; import _camelCase from 'lodash/camelCase'; import { pluralize } from 'ember-cli-mirage/utils/inflector'; import require from 'require'; -const { assert } = Ember; - /* This function looks through all files that have been loaded by Ember CLI and finds the ones under /mirage/[factories, fixtures, scenarios, models]/, and exports diff --git a/app/initializers/ember-cli-mirage.js b/app/initializers/ember-cli-mirage.js index 3dd950182..02710d65e 100644 --- a/app/initializers/ember-cli-mirage.js +++ b/app/initializers/ember-cli-mirage.js @@ -1,14 +1,11 @@ -import Ember from 'ember'; +import { getWithDefault } from '@ember/object'; + import readModules from 'ember-cli-mirage/utils/read-modules'; import ENV from '../config/environment'; import baseConfig, { testConfig } from '../mirage/config'; import Server from 'ember-cli-mirage/server'; import _assign from 'lodash/assign'; -const { - getWithDefault -} = Ember; - export default { name: 'ember-cli-mirage', initialize: function(application) { diff --git a/fastboot-tests/fixtures/fastboot/app/router.js b/fastboot-tests/fixtures/fastboot/app/router.js index cdc257875..d0bb00952 100644 --- a/fastboot-tests/fixtures/fastboot/app/router.js +++ b/fastboot-tests/fixtures/fastboot/app/router.js @@ -1,7 +1,7 @@ -import Ember from 'ember'; +import EmberRouter from '@ember/routing/router'; import config from './config/environment'; -const Router = Ember.Router.extend({ +const Router = EmberRouter.extend({ location: config.locationType, rootURL: config.rootURL }); diff --git a/tests/acceptance/custom-handlers-test.js b/tests/acceptance/custom-handlers-test.js index 6a5c9545c..c736f0950 100644 --- a/tests/acceptance/custom-handlers-test.js +++ b/tests/acceptance/custom-handlers-test.js @@ -1,8 +1,8 @@ -import Ember from 'ember'; +import $ from 'jquery'; import moduleForAcceptance from '../helpers/module-for-acceptance'; import { test } from 'qunit'; -const { ajax } = Ember.$; +const { ajax } = $; let appStore, rex; diff --git a/tests/acceptance/manually-starting-test.js b/tests/acceptance/manually-starting-test.js index 8fa2bf656..c4e0a45c4 100644 --- a/tests/acceptance/manually-starting-test.js +++ b/tests/acceptance/manually-starting-test.js @@ -1,11 +1,9 @@ -import Ember from 'ember'; +import { run } from '@ember/runloop'; import {module, test} from 'qunit'; import startApp from '../helpers/start-app'; import { startMirage } from 'dummy/initializers/ember-cli-mirage'; import ENV from 'dummy/config/environment'; -const { run } = Ember; - let App; module('Acceptance: Manually starting Mirage', { diff --git a/tests/dummy/app/app.js b/tests/dummy/app/app.js index 23b9ad028..e72c9ad74 100644 --- a/tests/dummy/app/app.js +++ b/tests/dummy/app/app.js @@ -1,10 +1,9 @@ import Ember from 'ember'; +import Application from '@ember/application'; import Resolver from './resolver'; import loadInitializers from 'ember-load-initializers'; import config from './config/environment'; -const { Application } = Ember; - Ember.MODEL_FACTORY_INJECTIONS = true; const App = Application.extend({ diff --git a/tests/dummy/app/controllers/application.js b/tests/dummy/app/controllers/application.js index 46ced9151..539345441 100644 --- a/tests/dummy/app/controllers/application.js +++ b/tests/dummy/app/controllers/application.js @@ -1,5 +1,3 @@ -import Ember from 'ember'; - -const { Controller } = Ember; +import Controller from '@ember/controller'; export default Controller.extend(); diff --git a/tests/dummy/app/router.js b/tests/dummy/app/router.js index ea07502c0..d5336b91f 100644 --- a/tests/dummy/app/router.js +++ b/tests/dummy/app/router.js @@ -1,7 +1,8 @@ -import Ember from 'ember'; +import EmberRouter from '@ember/routing/router'; + import config from './config/environment'; -const Router = Ember.Router.extend({ +const Router = EmberRouter.extend({ location: config.locationType, rootURL: config.rootURL }); diff --git a/tests/dummy/app/routes/application.js b/tests/dummy/app/routes/application.js index 701e1231f..6fc59dccc 100644 --- a/tests/dummy/app/routes/application.js +++ b/tests/dummy/app/routes/application.js @@ -1,6 +1,4 @@ -import Ember from 'ember'; - -const { Route } = Ember; +import Route from '@ember/routing/route'; export default Route.extend({ diff --git a/tests/dummy/app/routes/close-friends.js b/tests/dummy/app/routes/close-friends.js index 6fb75c379..d5c06fb08 100644 --- a/tests/dummy/app/routes/close-friends.js +++ b/tests/dummy/app/routes/close-friends.js @@ -1,6 +1,4 @@ -import Ember from 'ember'; - -const { Route } = Ember; +import Route from '@ember/routing/route'; export default Route.extend({ diff --git a/tests/dummy/app/routes/contacts.js b/tests/dummy/app/routes/contacts.js index 04941c6d7..511f32bf1 100644 --- a/tests/dummy/app/routes/contacts.js +++ b/tests/dummy/app/routes/contacts.js @@ -1,6 +1,4 @@ -import Ember from 'ember'; - -const { Route } = Ember; +import Route from '@ember/routing/route'; export default Route.extend({ diff --git a/tests/dummy/app/routes/friends.js b/tests/dummy/app/routes/friends.js index 9479f43d0..e307d1a46 100644 --- a/tests/dummy/app/routes/friends.js +++ b/tests/dummy/app/routes/friends.js @@ -1,6 +1,4 @@ -import Ember from 'ember'; - -const { Route } = Ember; +import Route from '@ember/routing/route'; export default Route.extend({ diff --git a/tests/dummy/app/routes/pets.js b/tests/dummy/app/routes/pets.js index 8803a0801..7f7ee9955 100644 --- a/tests/dummy/app/routes/pets.js +++ b/tests/dummy/app/routes/pets.js @@ -1,6 +1,4 @@ -import Ember from 'ember'; - -const { Route } = Ember; +import Route from '@ember/routing/route'; export default Route.extend({ diff --git a/tests/dummy/mirage/config.js b/tests/dummy/mirage/config.js index 2faeaf81b..474c1f81f 100644 --- a/tests/dummy/mirage/config.js +++ b/tests/dummy/mirage/config.js @@ -1,7 +1,6 @@ -import Mirage from 'ember-cli-mirage'; -import Ember from 'ember'; +import { isBlank } from '@ember/utils'; -const { isBlank } = Ember; +import Mirage from 'ember-cli-mirage'; export default function() { this.namespace = '/api'; diff --git a/tests/helpers/destroy-app.js b/tests/helpers/destroy-app.js index 116141188..f8d24fc36 100644 --- a/tests/helpers/destroy-app.js +++ b/tests/helpers/destroy-app.js @@ -1,6 +1,4 @@ -import Ember from 'ember'; - -const { run } = Ember; +import { run } from '@ember/runloop'; export default function destroyApp(application) { run(function() { diff --git a/tests/helpers/module-for-acceptance.js b/tests/helpers/module-for-acceptance.js index 76996fd04..30d9caa83 100644 --- a/tests/helpers/module-for-acceptance.js +++ b/tests/helpers/module-for-acceptance.js @@ -1,10 +1,9 @@ import { module } from 'qunit'; -import Ember from 'ember'; +import { Promise } from 'rsvp'; + import startApp from '../helpers/start-app'; import destroyApp from '../helpers/destroy-app'; -const { RSVP: { Promise } } = Ember; - export default function(name, options = {}) { module(name, { beforeEach() { diff --git a/tests/helpers/start-app.js b/tests/helpers/start-app.js index 83f842c52..cfdb08b50 100644 --- a/tests/helpers/start-app.js +++ b/tests/helpers/start-app.js @@ -1,9 +1,9 @@ -import Ember from 'ember'; +import { merge } from '@ember/polyfills'; +import { run } from '@ember/runloop'; + import Application from '../../app'; import config from '../../config/environment'; -const { merge, run } = Ember; - export default function startApp(attrs) { let application; diff --git a/tests/integration/route-handlers/function-handler-test.js b/tests/integration/route-handlers/function-handler-test.js index 0774c1fbb..5cb78f8b4 100644 --- a/tests/integration/route-handlers/function-handler-test.js +++ b/tests/integration/route-handlers/function-handler-test.js @@ -1,13 +1,12 @@ import { module, test } from 'qunit'; +import { Promise } from 'rsvp'; + import { Model, Collection, Serializer } from 'ember-cli-mirage'; -import Ember from 'ember'; import Server from 'ember-cli-mirage/server'; import Response from 'ember-cli-mirage/response'; import FunctionRouteHandler from 'ember-cli-mirage/route-handlers/function'; import _uniqBy from 'lodash/uniqBy'; -const { RSVP: { Promise } } = Ember; - module('Integration | Route handlers | Function handler', { beforeEach() { this.server = new Server({ From c297bb93f111635b552cdcc28936766444a2876c Mon Sep 17 00:00:00 2001 From: Luke Melia Date: Tue, 25 Jul 2017 18:05:39 -0400 Subject: [PATCH 078/879] Yapplabs bug/foreign key ids (#1148) * Failing test demonstrating underlying fixture data is affected when associations are updated. * Perform a deep clone of data being loaded to avoid it being mutated. * Move test to db#loadData --- addon/db.js | 3 ++- tests/unit/db-test.js | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/addon/db.js b/addon/db.js index ec6fea6ae..9a66764e3 100644 --- a/addon/db.js +++ b/addon/db.js @@ -1,6 +1,7 @@ import DbCollection from './db-collection'; import IdentityManager from './identity-manager'; import { singularize } from './utils/inflector'; +import _cloneDeep from 'lodash/cloneDeep'; /** * The db, an identity map. @@ -27,7 +28,7 @@ class Db { */ loadData(data) { for (let key in data) { - this.createCollection(key, data[key]); + this.createCollection(key, _cloneDeep(data[key])); } } diff --git a/tests/unit/db-test.js b/tests/unit/db-test.js index b595b0a39..eff4274df 100644 --- a/tests/unit/db-test.js +++ b/tests/unit/db-test.js @@ -75,6 +75,19 @@ test('it can load an object of data', function(assert) { assert.deepEqual(db.addresses, data.addresses); }); +test("it clones all data so nothing is passed by reference", function(assert) { + let data = { + contacts: [{ id: '1', someArray: ['foo', 'bar'] }] + }; + db.loadData(data); + + let contactRecord = db.contacts.find(1); + contactRecord.someArray.push('baz'); + + assert.equal(contactRecord.someArray.length, 3); + assert.equal(data.contacts[0].someArray.length, 2); +}); + module('Unit | Db #all', { beforeEach() { this.data = { From ab87ac40747d1f46e8b5d6fa22bcfa133271a07f Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 26 Jul 2017 23:52:02 -0400 Subject: [PATCH 079/879] [fixes #1146] Change default JSONAPI data linkage behavior (#1150) Add alwaysIncludeLinkageData option to JSONAPISerializer, default to false. By default, linkage data will be present for included resources. --- addon/serializers/json-api-serializer.js | 66 +++++++--- .../associations/collection-test.js | 123 ++++++++---------- .../associations/includes-test.js | 107 ++------------- .../associations/key-for-relationship-test.js | 23 +++- .../associations/links-test.js | 60 ++++++++- .../associations/model-test.js | 113 ++++------------ .../associations/polymorphic-test.js | 44 ++++++- 7 files changed, 256 insertions(+), 280 deletions(-) diff --git a/addon/serializers/json-api-serializer.js b/addon/serializers/json-api-serializer.js index 74cc98c57..d047081cb 100644 --- a/addon/serializers/json-api-serializer.js +++ b/addon/serializers/json-api-serializer.js @@ -4,7 +4,7 @@ import { dasherize, pluralize, camelize } from '../utils/inflector'; import _get from 'lodash/get'; import _ from 'lodash'; -export default Serializer.extend({ +const JSONAPISerializer = Serializer.extend({ keyForModel(modelName) { return dasherize(modelName); @@ -134,11 +134,14 @@ export default Serializer.extend({ attributes: attrs }; - model.associationKeys.forEach((key) => { + return this._maybeAddRelationshipsToResourceObjectForModel(hash, model); + }, + + _maybeAddRelationshipsToResourceObjectForModel(hash, model) { + let relationships = model.associationKeys.reduce((relationships, key) => { let relationship = model[key]; let relationshipKey = this.keyForRelationship(key); let relationshipHash = {}; - hash.relationships = hash.relationships || {}; if (this.hasLinksForRelationship(model, key)) { let serializer = this.serializerFor(model.modelName); @@ -146,26 +149,34 @@ export default Serializer.extend({ relationshipHash.links = links[key]; } - let data = null; - - if (this.isModel(relationship)) { - data = { - type: this.typeKeyForModel(relationship), - id: relationship.id - }; - } else if (this.isCollection(relationship)) { - data = relationship.models.map((model) => { - return { - type: this.typeKeyForModel(model), - id: model.id + if (this.alwaysIncludeLinkageData || this._relationshipIsIncluded(key)) { + let data = null; + if (this.isModel(relationship)) { + data = { + type: this.typeKeyForModel(relationship), + id: relationship.id }; - }); + } else if (this.isCollection(relationship)) { + data = relationship.models.map((model) => { + return { + type: this.typeKeyForModel(model), + id: model.id + }; + }); + } + relationshipHash.data = data; } - relationshipHash.data = data; + if (!_.isEmpty(relationshipHash)) { + relationships[relationshipKey] = relationshipHash; + } - hash.relationships[relationshipKey] = relationshipHash; - }); + return relationships; + }, {}); + + if (!_.isEmpty(relationships)) { + hash.relationships = relationships; + } return hash; }, @@ -180,6 +191,19 @@ export default Serializer.extend({ } }, + _relationshipIsIncluded(relationshipKey) { + if (this.request && this.request.queryParams && this.request.queryParams.include) { + let relationshipKeyAsString = this.keyForRelationship(relationshipKey); + + return this.request.queryParams + .include + .split(',') + .some(str => str.indexOf(relationshipKeyAsString) > -1); + } else { + return this.include.includes(relationshipKey); + } + }, + getQueryParamIncludes() { return (_get(this, 'request.queryParams.include')); }, @@ -193,3 +217,7 @@ export default Serializer.extend({ } }); + +JSONAPISerializer.prototype.alwaysIncludeLinkageData = false; + +export default JSONAPISerializer; diff --git a/tests/integration/serializers/json-api-serializer/associations/collection-test.js b/tests/integration/serializers/json-api-serializer/associations/collection-test.js index b7414c8bb..bd29663d5 100644 --- a/tests/integration/serializers/json-api-serializer/associations/collection-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/collection-test.js @@ -21,7 +21,7 @@ module('Integration | Serializers | JSON API Serializer | Associations | Collect } }); -test(`it includes all relationships for a collection, regardless of being included`, function(assert) { +test(`by default, it doesn't include a collection's relationships if those relationships are not included in the document and no links are defined`, function(assert) { let registry = new SerializerRegistry(this.schema, { application: JSONAPISerializer }); @@ -31,6 +31,37 @@ test(`it includes all relationships for a collection, regardless of being includ let collection = this.schema.wordSmiths.all(); let result = registry.serialize(collection); + assert.deepEqual(result, { + data: [{ + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link', + age: 123 + } + }, { + type: 'word-smiths', + id: '2', + attributes: { + 'first-name': 'Zelda', + age: 456 + } + }] + }); +}); + +test(`when alwaysIncludeLinkageData is true, it contains linkage data for all a collection's relationships, regardless of includes`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer.extend({ + alwaysIncludeLinkageData: true + }) + }); + this.schema.wordSmiths.create({ firstName: 'Link', age: 123 }); + this.schema.wordSmiths.create({ firstName: 'Zelda', age: 456 }); + + let collection = this.schema.wordSmiths.all(); + let result = registry.serialize(collection); + assert.deepEqual(result, { data: [{ type: 'word-smiths', @@ -60,7 +91,7 @@ test(`it includes all relationships for a collection, regardless of being includ }); }); -test(`it can serialize a collection with a has-many relationship`, function(assert) { +test(`it includes linkage data for a has-many relationship that's being included`, function(assert) { let registry = new SerializerRegistry(this.schema, { application: JSONAPISerializer, wordSmith: JSONAPISerializer.extend({ @@ -111,14 +142,6 @@ test(`it can serialize a collection with a has-many relationship`, function(asse id: '1', attributes: { title: 'Lorem' - }, - relationships: { - 'comments': { - data: [] - }, - 'author': { - data: { type: 'word-smiths', id: '1' } - } } }, { @@ -126,14 +149,6 @@ test(`it can serialize a collection with a has-many relationship`, function(asse id: '2', attributes: { title: 'Ipsum' - }, - relationships: { - 'comments': { - data: [] - }, - 'author': { - data: { type: 'word-smiths', id: '1' } - } } } ] @@ -202,9 +217,6 @@ test(`it can serialize a collection with a chain of has-many relationships`, fun data: [ { type: 'fine-comments', id: '1' } ] - }, - 'author': { - data: { type: 'word-smiths', id: '1' } } } }, @@ -213,11 +225,6 @@ test(`it can serialize a collection with a chain of has-many relationships`, fun id: '1', attributes: { text: 'pwned' - }, - relationships: { - 'post': { - data: { type: 'blog-posts', id: '1' } - } } }, { @@ -229,9 +236,6 @@ test(`it can serialize a collection with a chain of has-many relationships`, fun relationships: { 'comments': { data: [] - }, - 'author': { - data: { type: 'word-smiths', id: '1' } } } } @@ -265,11 +269,6 @@ test(`it can serialize a collection with a belongs-to relationship`, function(as title: 'Lorem' }, relationships: { - 'comments': { - data: [ - { type: 'fine-comments', id: '1' } - ] - }, 'author': { data: { type: 'word-smiths', id: '1' } } @@ -282,9 +281,6 @@ test(`it can serialize a collection with a belongs-to relationship`, function(as title: 'Ipsum' }, relationships: { - 'comments': { - data: [] - }, 'author': { data: { type: 'word-smiths', id: '1' } } @@ -297,14 +293,6 @@ test(`it can serialize a collection with a belongs-to relationship`, function(as id: '1', attributes: { 'first-name': 'Link' - }, - relationships: { - 'posts': { - data: [ - { type: 'blog-posts', id: '1' }, - { type: 'blog-posts', id: '2' } - ] - } } } ] @@ -354,14 +342,6 @@ test(`it can serialize a collection with a chain of belongs-to relationships`, f title: 'Lorem' }, relationships: { - 'comments': { - data: [ - { - id: '1', - type: 'fine-comments' - } - ] - }, 'author': { data: { type: 'word-smiths', id: '1' } } @@ -372,31 +352,23 @@ test(`it can serialize a collection with a chain of belongs-to relationships`, f id: '1', attributes: { 'first-name': 'Link' - }, - relationships: { - 'posts': { - data: [ - { - id: '1', - type: 'blog-posts' - }, - { - id: '2', - type: 'blog-posts' - } - ] - } } } ] }); }); -test(`it can serialize a collection of models that have both belongs-to and has-many relationships`, function(assert) { +test(`it propertly serializes complex relationships`, function(assert) { let registry = new SerializerRegistry(this.schema, { application: JSONAPISerializer, blogPost: JSONAPISerializer.extend({ include: ['author', 'comments'] + }), + wordSmith: JSONAPISerializer.extend({ + include: ['posts'] + }), + fineComment: JSONAPISerializer.extend({ + include: ['post'] }) }); @@ -447,6 +419,21 @@ test(`it can serialize a collection of models that have both belongs-to and has- } } }, + { + type: 'blog-posts', + id: '2', + attributes: { + 'title': 'Ipsum' + }, + relationships: { + author: { + data: { type: 'word-smiths', id: '1' } + }, + comments: { + data: [] + } + } + }, { type: 'fine-comments', id: '1', diff --git a/tests/integration/serializers/json-api-serializer/associations/includes-test.js b/tests/integration/serializers/json-api-serializer/associations/includes-test.js index 686ca873d..6a281ace6 100644 --- a/tests/integration/serializers/json-api-serializer/associations/includes-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/includes-test.js @@ -57,9 +57,6 @@ test('includes get serialized with correct serializer', function(assert) { 'title': 'We love Mirage!' }, relationships: { - 'fine-comments': { - 'data': [] - }, 'word-smith': { data: { type: 'word-smiths', id: '1' } } @@ -71,13 +68,6 @@ test('includes get serialized with correct serializer', function(assert) { id: '1', attributes: { 'first-name': 'Sam' - }, - relationships: { - 'blog-posts': { - data: [ - { type: 'blog-posts', id: '1' } - ] - } } } ] @@ -123,36 +113,17 @@ test('query param includes work when serializing a model', function(assert) { { type: 'word-smiths', id: '1', - attributes: {}, - relationships: { - 'blog-posts': { - data: [ - { type: 'blog-posts', id: '1' } - ] - } - } + attributes: {} }, { type: 'fine-comments', id: '1', - attributes: {}, - relationships: { - 'blog-post': { - data: { type: 'blog-posts', id: '1' } - }, - category: { data: null } - } + attributes: {} }, { type: 'fine-comments', id: '2', - attributes: {}, - relationships: { - 'blog-post': { - data: { type: 'blog-posts', id: '1' } - }, - category: { data: null } - } + attributes: {} } ] }); @@ -213,36 +184,17 @@ test('query param includes work when serializing a collection', function(assert) { type: 'word-smiths', id: '1', - attributes: {}, - relationships: { - 'blog-posts': { - data: [ - { type: 'blog-posts', id: '1' } - ] - } - } + attributes: {} }, { type: 'fine-comments', id: '1', - attributes: {}, - relationships: { - 'blog-post': { - data: { type: 'blog-posts', id: '1' } - }, - category: { data: null } - } + attributes: {} }, { type: 'fine-comments', id: '2', - attributes: {}, - relationships: { - 'blog-post': { - data: { type: 'blog-posts', id: '1' } - }, - category: { data: null } - } + attributes: {} } ] }); @@ -275,9 +227,6 @@ test('query param includes take precedence over default server includes', functi id: '1', attributes: {}, relationships: { - 'word-smith': { - data: { type: 'word-smiths', id: '1' } - }, 'fine-comments': { data: [ { type: 'fine-comments', id: '1' }, @@ -290,24 +239,12 @@ test('query param includes take precedence over default server includes', functi { type: 'fine-comments', id: '1', - attributes: {}, - relationships: { - 'blog-post': { - data: { type: 'blog-posts', id: '1' } - }, - category: { data: null } - } + attributes: {} }, { type: 'fine-comments', id: '2', - attributes: {}, - relationships: { - 'blog-post': { - data: { type: 'blog-posts', id: '1' } - }, - category: { data: null } - } + attributes: {} } ] }); @@ -337,7 +274,7 @@ test('query param includes support dot-paths when serializing a model', function }); let request = { queryParams: { - include: 'wordSmith,fineComments.category.labels' + include: 'word-smith,fine-comments.category.labels' } }; let result = registry.serialize(this.schema.blogPosts.first(), request); @@ -366,13 +303,6 @@ test('query param includes support dot-paths when serializing a model', function id: '1', attributes: { name: 'Sam' - }, - relationships: { - 'blog-posts': { - data: [ - { type: 'blog-posts', id: '2' } - ] - } } }, { @@ -382,9 +312,6 @@ test('query param includes support dot-paths when serializing a model', function text: 'Foo' }, relationships: { - 'blog-post': { - data: { type: 'blog-posts', id: '2' } - }, 'category': { data: { type: 'categories', id: '10' } } @@ -440,7 +367,7 @@ test('query param includes support dot-paths when serializing a collection', fun }); let request = { queryParams: { - include: 'wordSmith,fineComments.category.labels' + include: 'word-smith,fine-comments.category.labels' } }; let result = registry.serialize(this.schema.blogPosts.all(), request); @@ -475,8 +402,7 @@ test('query param includes support dot-paths when serializing a collection', fun data: { type: 'word-smiths', id: '1' } }, 'fine-comments': { - data: [ - ] + data: [] } } } @@ -487,14 +413,6 @@ test('query param includes support dot-paths when serializing a collection', fun id: '1', attributes: { name: 'Sam' - }, - relationships: { - 'blog-posts': { - data: [ - { type: 'blog-posts', id: '2' }, - { type: 'blog-posts', id: '5' } - ] - } } }, { @@ -504,9 +422,6 @@ test('query param includes support dot-paths when serializing a collection', fun text: 'Foo' }, relationships: { - 'blog-post': { - data: { type: 'blog-posts', id: '2' } - }, 'category': { data: { type: 'categories', id: '10' } } diff --git a/tests/integration/serializers/json-api-serializer/associations/key-for-relationship-test.js b/tests/integration/serializers/json-api-serializer/associations/key-for-relationship-test.js index 79d17d1c7..01cedda4b 100644 --- a/tests/integration/serializers/json-api-serializer/associations/key-for-relationship-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/key-for-relationship-test.js @@ -17,11 +17,15 @@ module('Integration | Serializers | JSON API Serializer | Key for relationship', }); test(`keyForRelationship works`, function(assert) { + let ApplicationSerializer = JSONAPISerializer.extend({ + keyForRelationship(key) { + return underscore(key); + } + }); let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer.extend({ - keyForRelationship(key) { - return underscore(key); - } + application: ApplicationSerializer, + wordSmith: ApplicationSerializer.extend({ + include: ['blogPosts'] }) }); let wordSmith = this.schema.wordSmiths.create({ @@ -50,6 +54,15 @@ test(`keyForRelationship works`, function(assert) { ] } } - } + }, + included: [ + { + attributes: { + title: "Lorem ipsum" + }, + id: "1", + type: "blog-posts" + } + ] }); }); diff --git a/tests/integration/serializers/json-api-serializer/associations/links-test.js b/tests/integration/serializers/json-api-serializer/associations/links-test.js index a07ce421f..678460b6c 100644 --- a/tests/integration/serializers/json-api-serializer/associations/links-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/links-test.js @@ -24,7 +24,7 @@ module('Integration | Serializers | JSON API Serializer | Associations | Links', } }); -test(`it can link to relationships, including data'`, function(assert) { +test(`it supports links`, function(assert) { let registry = new SerializerRegistry(this.schema, { application: JSONAPISerializer, blogPost: JSONAPISerializer.extend({ @@ -57,9 +57,61 @@ test(`it can link to relationships, including data'`, function(assert) { }, relationships: { 'word-smith': { - data: { - id: "3", - type: "word-smiths" + links: { + related: `/api/word_smiths/${link.id}`, + self: `/api/blog_posts/${blogPost.id}/relationships/word_smith` + } + }, + 'fine-comments': { + links: { + related: `/api/fine_comments?blog_post_id=${blogPost.id}`, + self: `/api/blog_posts/${blogPost.id}/relationships/fine_comments` + } + } + } + } + }); +}); + +test(`it supports links alongside data linkage`, function(assert) { + let ApplicationSerializer = JSONAPISerializer.extend({ + alwaysIncludeLinkageData: true + }); + let registry = new SerializerRegistry(this.schema, { + application: ApplicationSerializer, + blogPost: ApplicationSerializer.extend({ + links(model) { + return { + 'wordSmith': { + related: `/api/word_smiths/${model.wordSmith.id}`, + self: `/api/blog_posts/${model.id}/relationships/word_smith` + }, + 'fineComments': { + related: `/api/fine_comments?blog_post_id=${model.id}`, + self: `/api/blog_posts/${model.id}/relationships/fine_comments` + } + }; + } + }) + }); + + let link = this.schema.wordSmiths.create({ id: 3, name: 'Link' }); // specify id to really test our links function + let blogPost = link.createBlogPost({ title: 'Lorem ipsum' }); + + let result = registry.serialize(blogPost); + + assert.deepEqual(result, { + data: { + type: 'blog-posts', + id: blogPost.id, + attributes: { + 'title': 'Lorem ipsum' + }, + relationships: { + 'word-smith': { + "data": { + "id": "3", + "type": "word-smiths" }, links: { related: `/api/word_smiths/${link.id}`, diff --git a/tests/integration/serializers/json-api-serializer/associations/model-test.js b/tests/integration/serializers/json-api-serializer/associations/model-test.js index 75a4b4770..c7d3ef993 100644 --- a/tests/integration/serializers/json-api-serializer/associations/model-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/model-test.js @@ -21,7 +21,7 @@ module('Integration | Serializers | JSON API Serializer | Associations | Model', } }); -test(`it contains resource identifier objects for all a model's relationships, regardless of includes`, function(assert) { +test(`by default, it doesn't include a model's relationships if those relationships are not included in the document and no links are defined`, function(assert) { let registry = new SerializerRegistry(this.schema, { application: JSONAPISerializer }); @@ -31,6 +31,30 @@ test(`it contains resource identifier objects for all a model's relationships, r }); let post = link.createBlogPost({ title: 'Lorem ipsum' }); + let result = registry.serialize(post); + assert.deepEqual(result, { + data: { + type: 'blog-posts', + id: '1', + attributes: { + 'title': 'Lorem ipsum' + } + } + }); +}); + +test(`when alwaysIncludeLinkageData is true, it contains linkage data for all a model's relationships, regardless of includes`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer.extend({ + alwaysIncludeLinkageData: true + }) + }); + let link = this.schema.wordSmiths.create({ + firstName: 'Link', + age: 123 + }); + let post = link.createBlogPost({ title: 'Lorem ipsum' }); + let result = registry.serialize(post); assert.deepEqual(result, { data: { @@ -54,7 +78,7 @@ test(`it contains resource identifier objects for all a model's relationships, r }); }); -test(`it can include a has-many relationship`, function(assert) { +test(`it includes linkage data for a has-many relationship that's being included`, function(assert) { let registry = new SerializerRegistry(this.schema, { application: JSONAPISerializer, wordSmith: JSONAPISerializer.extend({ @@ -90,17 +114,6 @@ test(`it can include a has-many relationship`, function(assert) { id: '1', attributes: { title: 'Lorem' - }, - relationships: { - 'fine-comments': { - data: [] - }, - 'word-smith': { - data: { - id: '1', - type: 'word-smiths' - } - } } }, { @@ -108,17 +121,6 @@ test(`it can include a has-many relationship`, function(assert) { id: '2', attributes: { title: 'Ipsum' - }, - relationships: { - 'fine-comments': { - data: [] - }, - 'word-smith': { - data: { - id: '1', - type: 'word-smiths' - } - } } } ] @@ -171,12 +173,6 @@ test(`it can include a chain of has-many relationships`, function(assert) { data: [ { type: 'fine-comments', id: '1' } ] - }, - 'word-smith': { - data: { - id: '1', - type: 'word-smiths' - } } } }, @@ -185,14 +181,6 @@ test(`it can include a chain of has-many relationships`, function(assert) { id: '1', attributes: { text: 'pwned' - }, - relationships: { - 'blog-post': { - data: { - id: '1', - type: 'blog-posts' - } - } } }, { @@ -204,12 +192,6 @@ test(`it can include a chain of has-many relationships`, function(assert) { relationships: { 'fine-comments': { data: [] - }, - 'word-smith': { - data: { - id: '1', - type: 'word-smiths' - } } } } @@ -239,14 +221,6 @@ test(`it can include a belongs-to relationship`, function(assert) { title: 'Lorem' }, relationships: { - 'fine-comments': { - data: [ - { - id: '1', - type: 'fine-comments' - } - ] - }, 'word-smith': { data: { id: '1', @@ -261,17 +235,7 @@ test(`it can include a belongs-to relationship`, function(assert) { 'first-name': 'Link' }, id: '1', - type: 'word-smiths', - relationships: { - 'blog-posts': { - data: [ - { - id: '1', - type: 'blog-posts' - } - ] - } - } + type: 'word-smiths' } ] }); @@ -298,9 +262,6 @@ test(`it gracefully handles null belongs-to relationship`, function(assert) { relationships: { 'word-smith': { data: null - }, - 'fine-comments': { - data: [] } } } @@ -348,14 +309,6 @@ test(`it can include a chain of belongs-to relationships`, function(assert) { title: 'Lorem' }, relationships: { - 'fine-comments': { - data: [ - { - id: '1', - type: 'fine-comments' - } - ] - }, 'word-smith': { data: { type: 'word-smiths', @@ -369,23 +322,13 @@ test(`it can include a chain of belongs-to relationships`, function(assert) { id: '1', attributes: { 'first-name': 'Link' - }, - relationships: { - 'blog-posts': { - data: [ - { - id: '1', - type: 'blog-posts' - } - ] - } } } ] }); }); -test(`it ignores relationships that refer to serialized ancestor resources`, function(assert) { +test(`it properly serializes complex relationships`, function(assert) { let registry = new SerializerRegistry(this.schema, { application: JSONAPISerializer, wordSmith: JSONAPISerializer.extend({ diff --git a/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js b/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js index 5c1ae3502..fbb28aa37 100644 --- a/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js @@ -16,7 +16,10 @@ test('it works for belongs to polymorphic relationships', function(assert) { }); let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer + application: JSONAPISerializer, + comment: JSONAPISerializer.extend({ + include: ['commentable'] + }) }); let photo = schema.photos.create({ title: 'Foo' }); schema.comments.create({ text: 'Pretty foo!', commentable: photo }); @@ -51,6 +54,22 @@ test('it works for belongs to polymorphic relationships', function(assert) { }, "type": "comments" } + ], + included: [ + { + attributes: { + title: "Foo" + }, + id: "1", + type: "photos" + }, + { + attributes: { + "title": "Bar" + }, + id: "1", + type: "videos" + } ] }); }); @@ -65,7 +84,10 @@ test('it works for has many polymorphic relationships', function(assert) { }); let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer + application: JSONAPISerializer, + user: JSONAPISerializer.extend({ + include: ['things'] + }) }); let car = schema.cars.create({ make: 'Infiniti' }); @@ -92,6 +114,22 @@ test('it works for has many polymorphic relationships', function(assert) { } }, "type": "users" - } + }, + "included": [ + { + "attributes": { + "make": "Infiniti" + }, + "id": "1", + "type": "cars" + }, + { + "attributes": { + "make": "Citizen" + }, + "id": "1", + "type": "watches" + } + ] }); }); From ebc8c421e57f6a8be6a3fb1681259d4cbf92cb0f Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Mon, 31 Jul 2017 06:00:32 +0200 Subject: [PATCH 080/879] Revert "New Module Imports" in "app" folder (#1152) proper solution is to just reexport stuff in the `app` folder and have the real code in the `addon` folder, but reverting that part should be enough for now. --- app/initializers/ember-cli-mirage.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/initializers/ember-cli-mirage.js b/app/initializers/ember-cli-mirage.js index 02710d65e..3dd950182 100644 --- a/app/initializers/ember-cli-mirage.js +++ b/app/initializers/ember-cli-mirage.js @@ -1,11 +1,14 @@ -import { getWithDefault } from '@ember/object'; - +import Ember from 'ember'; import readModules from 'ember-cli-mirage/utils/read-modules'; import ENV from '../config/environment'; import baseConfig, { testConfig } from '../mirage/config'; import Server from 'ember-cli-mirage/server'; import _assign from 'lodash/assign'; +const { + getWithDefault +} = Ember; + export default { name: 'ember-cli-mirage', initialize: function(application) { From 967ab9bd5b50a029a57d16a075516c3e2016d2ff Mon Sep 17 00:00:00 2001 From: Tim Haines Date: Tue, 1 Aug 2017 22:53:28 -0700 Subject: [PATCH 081/879] Fix typo in error messages - seting to setting --- addon/orm/associations/has-many.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addon/orm/associations/has-many.js b/addon/orm/associations/has-many.js index 5cca214a4..f57576e52 100644 --- a/addon/orm/associations/has-many.js +++ b/addon/orm/associations/has-many.js @@ -94,7 +94,7 @@ export default class HasMany extends Association { if (ids === null) { tempChildren = []; } else if (ids !== undefined) { - assert(Array.isArray(ids), `You must pass an array in when seting ${foreignKey} on ${this}`); + assert(Array.isArray(ids), `You must pass an array in when setting ${foreignKey} on ${this}`); if (association.isPolymorphic) { assert(ids.every((el) => { @@ -102,7 +102,7 @@ export default class HasMany extends Association { && (typeof el.type !== undefined) && (typeof el.id !== undefined) ); - }), `You must pass in an array of polymorphic identifiers (objects of shape { type, id }) when seting ${foreignKey} on ${this}`); + }), `You must pass in an array of polymorphic identifiers (objects of shape { type, id }) when setting ${foreignKey} on ${this}`); let models = ids.map(({ type, id }) => { return association.schema[toCollectionName(type)].find(id); From 85a6ac052f38ffd80f41b6d8e87332a680d33740 Mon Sep 17 00:00:00 2001 From: Ivan Vanderbyl Date: Wed, 16 Aug 2017 08:58:05 +1000 Subject: [PATCH 082/879] Only _definePlainAttribute if not an association (#1078) --- addon/orm/model.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/addon/orm/model.js b/addon/orm/model.js index 493a41132..3b626901f 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -81,7 +81,9 @@ class Model { } Object.keys(attrs).forEach(function(attr) { - this._definePlainAttribute(attr); + if (this.associationKeys.indexOf(attr) === -1 && this.associationIdKeys.indexOf(attr) === -1) { + this._definePlainAttribute(attr); + } this[attr] = attrs[attr]; }, this); From 33f7f194bd03bd9a820b14360c41874bdf93e34f Mon Sep 17 00:00:00 2001 From: jeloba Date: Wed, 30 Aug 2017 13:40:32 +0200 Subject: [PATCH 083/879] Fix mirage directory in addon projects containing in-repo addons --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index d0654055c..c254de653 100644 --- a/index.js +++ b/index.js @@ -47,7 +47,7 @@ module.exports = { this.mirageDirectory = this.addonBuildConfig.directory; } else if (this.addonConfig.directory) { this.mirageDirectory = this.addonConfig.directory; - } else if (app.project.pkg['ember-addon'] && !app.project.pkg['ember-addon'].paths) { + } else if (app.project.pkg['ember-addon'] && app.project.pkg['ember-addon'].configPath) { this.mirageDirectory = path.resolve(app.project.root, path.join('tests', 'dummy', 'mirage')); } else { this.mirageDirectory = path.join(this.app.project.root, '/mirage'); From 73abb440aa8c875d5544fbdb4e5bd14f9dda56d5 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 2 Sep 2017 16:22:34 -0400 Subject: [PATCH 084/879] Upgrade Ember CLI + deps (#1171) --- .eslintrc.js | 4 +- .gitignore | 1 + .travis.yml | 2 + bower.json | 3 - config/ember-try.js | 42 ++ ember-cli-build.js | 7 +- package.json | 22 +- tests/.eslintrc.js | 2 +- tests/dummy/config/environment.js | 5 +- tests/dummy/config/targets.js | 9 + .../route-handlers/function-handler-test.js | 10 +- yarn.lock | 363 ++++++++++++------ 12 files changed, 321 insertions(+), 149 deletions(-) create mode 100644 tests/dummy/config/targets.js diff --git a/.eslintrc.js b/.eslintrc.js index cceb10f10..5ada896ff 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,7 +1,7 @@ module.exports = { root: true, parserOptions: { - ecmaVersion: 6, + ecmaVersion: 2017, sourceType: 'module' }, extends: [ @@ -9,7 +9,7 @@ module.exports = { 'plugin:ember-suave/recommended' ], env: { - 'browser': true + browser: true }, rules: { 'camelcase': 0, diff --git a/.gitignore b/.gitignore index 3c12fc211..dda961cae 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ /coverage/* /libpeerconnection.log npm-debug.log* +yarn-error.log testem.log .floo _site diff --git a/.travis.yml b/.travis.yml index 2c8782507..4243de0bf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,9 +20,11 @@ env: # we recommend testing LTS's and latest stable release (bonus points to beta/canary) - EMBER_TRY_SCENARIO=ember-1.13 - EMBER_TRY_SCENARIO=ember-lts-2.4 + - EMBER_TRY_SCENARIO=ember-lts-2.8 - EMBER_TRY_SCENARIO=ember-release - EMBER_TRY_SCENARIO=ember-beta - EMBER_TRY_SCENARIO=ember-canary + - EMBER_TRY_SCENARIO=ember-default - EMBER_TRY_SCENARIO=fastboot-tests - EMBER_TRY_SCENARIO=node-tests diff --git a/bower.json b/bower.json index 90692e4b2..5420da0b0 100644 --- a/bower.json +++ b/bower.json @@ -1,9 +1,6 @@ { "name": "ember-cli-mirage", "dependencies": { - "jquery": "2.1.4", - "ember": "2.10.0", - "ember-cli-shims": "0.1.3", "sinonjs": "~1.17.1" } } diff --git a/config/ember-try.js b/config/ember-try.js index 49126a5df..58ad33950 100644 --- a/config/ember-try.js +++ b/config/ember-try.js @@ -10,6 +10,11 @@ module.exports = { resolutions: { 'ember': '~1.13.0' } + }, + npm: { + devDependencies: { + 'ember-source': null + } } }, { @@ -21,6 +26,27 @@ module.exports = { resolutions: { 'ember': 'lts-2-4' } + }, + npm: { + devDependencies: { + 'ember-source': null + } + } + }, + { + name: 'ember-lts-2.8', + bower: { + dependencies: { + 'ember': 'components/ember#lts-2-8' + }, + resolutions: { + 'ember': 'lts-2-8' + } + }, + npm: { + devDependencies: { + 'ember-source': null + } } }, { @@ -32,6 +58,11 @@ module.exports = { resolutions: { 'ember': 'release' } + }, + npm: { + devDependencies: { + 'ember-source': null + } } }, { @@ -54,6 +85,17 @@ module.exports = { resolutions: { 'ember': 'canary' } + }, + npm: { + devDependencies: { + 'ember-source': null + } + } + }, + { + name: 'ember-default', + npm: { + devDependencies: {} } }, { diff --git a/ember-cli-build.js b/ember-cli-build.js index f0319c514..c26618150 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -1,9 +1,10 @@ /* eslint-env node */ -/* global require, module */ -var EmberAddon = require('ember-cli/lib/broccoli/ember-addon'); +'use strict'; + +const EmberAddon = require('ember-cli/lib/broccoli/ember-addon'); module.exports = function(defaults) { - var app = new EmberAddon(defaults, { + let app = new EmberAddon(defaults, { 'ember-cli-babel': { includePolyfill: true }, diff --git a/package.json b/package.json index fc268fe9c..2ae0117e1 100644 --- a/package.json +++ b/package.json @@ -51,29 +51,29 @@ "active-model-adapter": "^2.0.3", "broccoli-asset-rev": "^2.4.5", "chai": "^4.1.0", - "ember-ajax": "^2.4.1", - "ember-cli": "^2.14.0", + "ember-ajax": "^3.0.0", + "ember-cli": "~2.14.0", "ember-cli-app-version": "^2.0.0", - "ember-cli-content-security-policy": "0.4.0", "ember-cli-dependency-checker": "^1.3.0", - "ember-cli-eslint": "3.0.0", - "ember-cli-htmlbars": "^1.0.10", + "ember-cli-eslint": "^3.0.0", + "ember-cli-htmlbars": "^2.0.1", "ember-cli-htmlbars-inline-precompile": "^0.4.3", "ember-cli-inject-live-reload": "^1.4.1", "ember-cli-qunit": "^4.0.0", "ember-cli-release": "^0.2.9", + "ember-cli-shims": "^1.1.0", "ember-cli-sri": "^2.1.0", "ember-cli-uglify": "^1.2.0", "ember-data": "~2.11.0", - "ember-disable-prototype-extensions": "^1.1.0", - "ember-disable-proxy-controllers": "^1.0.1", - "ember-export-application-global": "^1.0.5", + "ember-disable-prototype-extensions": "^1.1.2", + "ember-export-application-global": "^2.0.0", "ember-fastboot-addon-tests": "^0.4.0", - "ember-load-initializers": "^0.5.1", - "ember-resolver": "^2.0.3", + "ember-load-initializers": "^1.0.0", + "ember-resolver": "^4.0.0", + "ember-source": "~2.14.0", "ember-sinon": "0.5.1", "eslint-plugin-ember-suave": "^1.0.0", - "loader.js": "^4.0.10", + "loader.js": "^4.2.3", "mocha": "^3.4.2" }, "engines": { diff --git a/tests/.eslintrc.js b/tests/.eslintrc.js index 377bbd962..4150467f9 100644 --- a/tests/.eslintrc.js +++ b/tests/.eslintrc.js @@ -1,6 +1,6 @@ module.exports = { env: { - 'embertest': true + embertest: true }, rules: { 'prefer-template': 0 diff --git a/tests/dummy/config/environment.js b/tests/dummy/config/environment.js index f74e7be0f..954583c3b 100644 --- a/tests/dummy/config/environment.js +++ b/tests/dummy/config/environment.js @@ -1,10 +1,11 @@ /* eslint-env node */ +'use strict'; module.exports = function(environment) { - var ENV = { + let ENV = { modulePrefix: 'dummy', podModulePrefix: 'dummy/pods', - environment: environment, + environment, rootURL: '/', locationType: 'auto', EmberENV: { diff --git a/tests/dummy/config/targets.js b/tests/dummy/config/targets.js new file mode 100644 index 000000000..df7664c25 --- /dev/null +++ b/tests/dummy/config/targets.js @@ -0,0 +1,9 @@ +/* eslint-env node */ +module.exports = { + browsers: [ + 'ie 9', + 'last 1 Chrome versions', + 'last 1 Firefox versions', + 'last 1 Safari versions' + ] +}; diff --git a/tests/integration/route-handlers/function-handler-test.js b/tests/integration/route-handlers/function-handler-test.js index 5cb78f8b4..60fd8cf94 100644 --- a/tests/integration/route-handlers/function-handler-test.js +++ b/tests/integration/route-handlers/function-handler-test.js @@ -40,9 +40,13 @@ test('a meaningful error is thrown if a custom route handler throws an error', f throw 'I goofed'; }); - $.ajax({ method: 'GET', url: '/users' }).error(({ responseText }) => { - assert.equal(responseText, 'Mirage: Your GET handler for the url /users threw an error: I goofed'); - done(); + $.ajax({ + method: 'GET', + url: '/users', + error: ({ responseText }) => { + assert.equal(responseText, 'Mirage: Your GET handler for the url /users threw an error: I goofed'); + done(); + } }); }); diff --git a/yarn.lock b/yarn.lock index 96220d3ec..cf7d297fa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,86 @@ # yarn lockfile v1 +"@glimmer/compiler@^0.22.3": + version "0.22.3" + resolved "https://registry.yarnpkg.com/@glimmer/compiler/-/compiler-0.22.3.tgz#3aef9448460af1d320a82423323498a6ff38a0c6" + dependencies: + "@glimmer/syntax" "^0.22.3" + "@glimmer/util" "^0.22.3" + "@glimmer/wire-format" "^0.22.3" + simple-html-tokenizer "^0.3.0" + +"@glimmer/di@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@glimmer/di/-/di-0.2.0.tgz#73bfd4a6ee4148a80bf092e8a5d29bcac9d4ce7e" + +"@glimmer/interfaces@^0.22.3": + version "0.22.3" + resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.22.3.tgz#1c2e3289ae41a750f0c8ddcc64529b9e90dda604" + dependencies: + "@glimmer/wire-format" "^0.22.3" + +"@glimmer/node@^0.22.3": + version "0.22.3" + resolved "https://registry.yarnpkg.com/@glimmer/node/-/node-0.22.3.tgz#ff33eea6e65147a20c1bd1f05fdc4a6c3595c54c" + dependencies: + "@glimmer/runtime" "^0.22.3" + simple-dom "^0.3.0" + +"@glimmer/object-reference@^0.22.3": + version "0.22.3" + resolved "https://registry.yarnpkg.com/@glimmer/object-reference/-/object-reference-0.22.3.tgz#31db68c8912324c63509b1ef83213f7ad4ef312b" + dependencies: + "@glimmer/reference" "^0.22.3" + "@glimmer/util" "^0.22.3" + +"@glimmer/object@^0.22.3": + version "0.22.3" + resolved "https://registry.yarnpkg.com/@glimmer/object/-/object-0.22.3.tgz#1fc9fd7465c7d12e5b92464ad40038b595de8ed0" + dependencies: + "@glimmer/object-reference" "^0.22.3" + "@glimmer/util" "^0.22.3" + +"@glimmer/reference@^0.22.3": + version "0.22.3" + resolved "https://registry.yarnpkg.com/@glimmer/reference/-/reference-0.22.3.tgz#6f2ef8cd97fe756d89fef75f8c3c79003502a2a9" + dependencies: + "@glimmer/util" "^0.22.3" + +"@glimmer/resolver@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@glimmer/resolver/-/resolver-0.4.1.tgz#cd9644572c556e7e799de1cf8eff2b999cf5b878" + dependencies: + "@glimmer/di" "^0.2.0" + +"@glimmer/runtime@^0.22.3": + version "0.22.3" + resolved "https://registry.yarnpkg.com/@glimmer/runtime/-/runtime-0.22.3.tgz#b8cb28efc9cc86c406ee996f5c2cf6730620d404" + dependencies: + "@glimmer/interfaces" "^0.22.3" + "@glimmer/object" "^0.22.3" + "@glimmer/object-reference" "^0.22.3" + "@glimmer/reference" "^0.22.3" + "@glimmer/util" "^0.22.3" + "@glimmer/wire-format" "^0.22.3" + +"@glimmer/syntax@^0.22.3": + version "0.22.3" + resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.22.3.tgz#8528d19324bf7f920f5cfd31925e452e51781b44" + dependencies: + handlebars "^4.0.6" + simple-html-tokenizer "^0.3.0" + +"@glimmer/util@^0.22.3": + version "0.22.3" + resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.22.3.tgz#8272f50905d1bb904ee371e8ade83fd779b51508" + +"@glimmer/wire-format@^0.22.3": + version "0.22.3" + resolved "https://registry.yarnpkg.com/@glimmer/wire-format/-/wire-format-0.22.3.tgz#19b226d9b93ba6ee54472d9ffb1d48e7c0d80a0d" + dependencies: + "@glimmer/util" "^0.22.3" + abab@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d" @@ -88,6 +168,12 @@ amd-name-resolver@0.0.6: dependencies: ensure-posix-path "^1.0.1" +amd-name-resolver@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-0.0.7.tgz#814301adfe8a2f109f6e84d5e935196efb669615" + dependencies: + ensure-posix-path "^1.0.1" + amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" @@ -503,7 +589,7 @@ babel-plugin-dead-code-elimination@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz#5f7c451274dcd7cccdbfbb3e0b85dd28121f0f65" -babel-plugin-debug-macros@^0.1.11, babel-plugin-debug-macros@^0.1.6: +babel-plugin-debug-macros@^0.1.10, babel-plugin-debug-macros@^0.1.11, babel-plugin-debug-macros@^0.1.6: version "0.1.11" resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.1.11.tgz#6c562bf561fccd406ce14ab04f42c218cf956605" dependencies: @@ -515,6 +601,12 @@ babel-plugin-ember-modules-api-polyfill@^1.4.1: dependencies: ember-rfc176-data "^0.2.0" +babel-plugin-ember-modules-api-polyfill@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.0.1.tgz#baaf26dcebe2ed1de120021bc42be29f520497b3" + dependencies: + ember-rfc176-data "^0.2.7" + babel-plugin-eval@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz#a2faed25ce6be69ade4bfec263f70169195950da" @@ -975,21 +1067,6 @@ bluebird@^3.1.1, bluebird@^3.4.6: version "3.5.0" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" -body-parser@^1.2.0: - version "1.17.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.2.tgz#f8892abc8f9e627d42aedafbca66bf5ab99104ee" - dependencies: - bytes "2.4.0" - content-type "~1.0.2" - debug "2.6.7" - depd "~1.1.0" - http-errors "~1.6.1" - iconv-lite "0.4.15" - on-finished "~2.3.0" - qs "6.4.0" - raw-body "~2.2.0" - type-is "~1.6.15" - body@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/body/-/body-5.1.0.tgz#e4ba0ce410a46936323367609ecb4e6553125069" @@ -1019,10 +1096,6 @@ bower-endpoint-parser@0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz#00b565adbfab6f2d35addde977e97962acbcb3f6" -bower@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/bower/-/bower-1.8.0.tgz#55dbebef0ad9155382d9e9d3e497c1372345b44a" - brace-expansion@^1.0.0, brace-expansion@^1.1.7: version "1.1.8" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" @@ -1088,13 +1161,28 @@ broccoli-babel-transpiler@^6.0.0: rsvp "^3.5.0" workerpool "^2.2.1" +broccoli-babel-transpiler@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.1.2.tgz#26019c045b5ea3e44cfef62821302f9bd483cabd" + dependencies: + babel-core "^6.14.0" + broccoli-funnel "^1.0.0" + broccoli-merge-trees "^1.0.0" + broccoli-persistent-filter "^1.4.0" + clone "^2.0.0" + hash-for-dep "^1.0.2" + heimdalljs-logger "^0.1.7" + json-stable-stringify "^1.0.0" + rsvp "^3.5.0" + workerpool "^2.2.1" + broccoli-brocfile-loader@^0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/broccoli-brocfile-loader/-/broccoli-brocfile-loader-0.18.0.tgz#2e86021c805c34ffc8d29a2fb721cf273e819e4b" dependencies: findup-sync "^0.4.2" -broccoli-builder@^0.18.3: +broccoli-builder@^0.18.8: version "0.18.8" resolved "https://registry.yarnpkg.com/broccoli-builder/-/broccoli-builder-0.18.8.tgz#fe54694d544c3cdfdb01028e802eeca65749a879" dependencies: @@ -1209,7 +1297,7 @@ broccoli-funnel-reducer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/broccoli-funnel-reducer/-/broccoli-funnel-reducer-1.0.0.tgz#11365b2a785aec9b17972a36df87eef24c5cc0ea" -broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.2, broccoli-funnel@^1.0.6, broccoli-funnel@^1.1.0: +broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.2, broccoli-funnel@^1.0.6, broccoli-funnel@^1.1.0, broccoli-funnel@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-1.2.0.tgz#cddc3afc5ff1685a8023488fff74ce6fb5a51296" dependencies: @@ -1242,7 +1330,7 @@ broccoli-kitchen-sink-helpers@^0.3.1: glob "^5.0.10" mkdirp "^0.5.1" -broccoli-lint-eslint@^3.1.0: +broccoli-lint-eslint@^3.3.0: version "3.3.1" resolved "https://registry.yarnpkg.com/broccoli-lint-eslint/-/broccoli-lint-eslint-3.3.1.tgz#35c675546a5a7ad8f3319edd732e3aad8ca241de" dependencies: @@ -1274,7 +1362,7 @@ broccoli-merge-trees@^2.0.0: broccoli-plugin "^1.3.0" merge-trees "^1.0.1" -broccoli-middleware@^1.0.0-beta.8: +broccoli-middleware@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/broccoli-middleware/-/broccoli-middleware-1.0.0.tgz#92f4e1fb9a791ea986245a7077f35cc648dab097" dependencies: @@ -1418,10 +1506,6 @@ bytes@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.3.0.tgz#d5b680a165b6201739acb611542aabc2d8ceb070" -bytes@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" - calculate-cache-key-for-tree@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-1.1.0.tgz#0c3e42c9c134f3c9de5358c0f16793627ea976d6" @@ -1642,16 +1726,12 @@ commander@2.8.x: dependencies: graceful-readlink ">= 1.0.0" -commander@2.9.0: +commander@2.9.0, commander@^2.5.0, commander@^2.6.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" dependencies: graceful-readlink ">= 1.0.0" -commander@^2.5.0, commander@^2.6.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" - commoner@~0.10.3: version "0.10.8" resolved "https://registry.yarnpkg.com/commoner/-/commoner-0.10.8.tgz#34fc3672cd24393e8bb47e70caa0293811f4f2c5" @@ -1980,14 +2060,10 @@ detective@^4.3.1: acorn "^4.0.3" defined "^1.0.0" -diff@3.2.0: +diff@3.2.0, diff@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" -diff@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.0.tgz#056695150d7aa93237ca7e378ac3b1682b7963b9" - doctrine@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" @@ -2019,11 +2095,11 @@ electron-to-chromium@^1.3.14: version "1.3.15" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.15.tgz#08397934891cbcfaebbd18b82a95b5a481138369" -ember-ajax@^2.4.1: - version "2.5.6" - resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-2.5.6.tgz#a75f743ccf1b95e979a5cf96013b3dba8fa625e4" +ember-ajax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-3.0.0.tgz#8f21e9da0c1d433cf879aa855fce464d517e9ab5" dependencies: - ember-cli-babel "^5.1.5" + ember-cli-babel "^6.0.0" ember-cli-addon-tests@^0.7.0: version "0.7.0" @@ -2066,7 +2142,7 @@ ember-cli-babel@6.1.0: clone "^2.0.0" ember-cli-version-checker "^1.2.0" -ember-cli-babel@^5.0.0, ember-cli-babel@^5.1.10, ember-cli-babel@^5.1.5, ember-cli-babel@^5.1.6, ember-cli-babel@^5.1.7: +ember-cli-babel@^5.1.6, ember-cli-babel@^5.1.7: version "5.2.4" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-5.2.4.tgz#5ce4f46b08ed6f6d21e878619fb689719d6e8e13" dependencies: @@ -2093,6 +2169,23 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.6.0: clone "^2.0.0" ember-cli-version-checker "^2.0.0" +ember-cli-babel@^6.8.1: + version "6.8.2" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.8.2.tgz#eac2785964f4743f4c815cd53c6288f00cc087d7" + dependencies: + amd-name-resolver "0.0.7" + babel-plugin-debug-macros "^0.1.11" + babel-plugin-ember-modules-api-polyfill "^2.0.1" + babel-plugin-transform-es2015-modules-amd "^6.24.0" + babel-polyfill "^6.16.0" + babel-preset-env "^1.5.1" + broccoli-babel-transpiler "^6.1.2" + broccoli-debug "^0.6.2" + broccoli-funnel "^1.0.0" + broccoli-source "^1.1.0" + clone "^2.0.0" + ember-cli-version-checker "^2.0.0" + ember-cli-broccoli-sane-watcher@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.0.4.tgz#f43f42f75b7509c212fb926cd9aea86ae19264c6" @@ -2103,12 +2196,6 @@ ember-cli-broccoli-sane-watcher@^2.0.4: rsvp "^3.0.18" sane "^1.1.1" -ember-cli-content-security-policy@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/ember-cli-content-security-policy/-/ember-cli-content-security-policy-0.4.0.tgz#71e4f228e68bcefc313f0ffae26f3600a0093276" - dependencies: - body-parser "^1.2.0" - ember-cli-dependency-checker@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-1.4.0.tgz#2b13f977e1eea843fc1a21a001be6ca5d4ef1942" @@ -2117,13 +2204,12 @@ ember-cli-dependency-checker@^1.3.0: is-git-url "^0.2.0" semver "^4.1.0" -ember-cli-eslint@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ember-cli-eslint/-/ember-cli-eslint-3.0.0.tgz#83eb12b01e1bd41ce7d35fbd6dd18136faa1398b" +ember-cli-eslint@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-eslint/-/ember-cli-eslint-3.1.0.tgz#8d9e2a867654835ac1b24858d9117e143fa54bd4" dependencies: - broccoli-lint-eslint "^3.1.0" - ember-cli-babel "^5.1.6" - js-string-escape "^1.0.0" + broccoli-lint-eslint "^3.3.0" + ember-cli-version-checker "^1.3.1" rsvp "^3.2.1" walk-sync "^0.3.0" @@ -2144,7 +2230,7 @@ ember-cli-htmlbars-inline-precompile@^0.4.3: hash-for-dep "^1.0.2" silent-error "^1.1.0" -ember-cli-htmlbars@^1.0.0, ember-cli-htmlbars@^1.0.10: +ember-cli-htmlbars@^1.0.0: version "1.3.3" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-1.3.3.tgz#06815262c1577736235bd42ce99db559ce5ebfd1" dependencies: @@ -2154,6 +2240,15 @@ ember-cli-htmlbars@^1.0.0, ember-cli-htmlbars@^1.0.10: json-stable-stringify "^1.0.0" strip-bom "^2.0.0" +ember-cli-htmlbars@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.3.tgz#e116e1500dba12f29c94b05b9ec90f52cb8bb042" + dependencies: + broccoli-persistent-filter "^1.0.3" + hash-for-dep "^1.0.2" + json-stable-stringify "^1.0.0" + strip-bom "^3.0.0" + ember-cli-inject-live-reload@^1.4.1: version "1.6.1" resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-1.6.1.tgz#82b8f5be454815a75e7f6d42c9ce0bc883a914a3" @@ -2251,13 +2346,21 @@ ember-cli-release@^0.2.9: semver "^4.3.1" silent-error "^1.0.0" +ember-cli-shims@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-shims/-/ember-cli-shims-1.1.0.tgz#0e3b8a048be865b4f81cc81d397ff1eeb13f75b6" + dependencies: + ember-cli-babel "^6.0.0-beta.7" + ember-cli-version-checker "^1.2.0" + silent-error "^1.0.1" + ember-cli-sri@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ember-cli-sri/-/ember-cli-sri-2.1.1.tgz#971620934a4b9183cf7923cc03e178b83aa907fd" dependencies: broccoli-sri-hash "^2.1.0" -ember-cli-string-utils@^1.0.0: +ember-cli-string-utils@^1.0.0, ember-cli-string-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz#39b677fc2805f55173735376fcef278eaa4452a1" @@ -2285,7 +2388,7 @@ ember-cli-valid-component-name@^1.0.0: dependencies: silent-error "^1.0.0" -ember-cli-version-checker@^1.0.2, ember-cli-version-checker@^1.1.4, ember-cli-version-checker@^1.1.6, ember-cli-version-checker@^1.1.7, ember-cli-version-checker@^1.2.0: +ember-cli-version-checker@^1.0.2, ember-cli-version-checker@^1.1.4, ember-cli-version-checker@^1.1.6, ember-cli-version-checker@^1.1.7, ember-cli-version-checker@^1.2.0, ember-cli-version-checker@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz#0bc2d134c830142da64bf9627a0eded10b61ae72" dependencies: @@ -2298,9 +2401,9 @@ ember-cli-version-checker@^2.0.0: resolve "^1.3.3" semver "^5.3.0" -ember-cli@^2.14.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-2.14.0.tgz#9aff1414168883183e8677fa32626d1e3228ccbc" +ember-cli@~2.14.0: + version "2.14.2" + resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-2.14.2.tgz#f2c8c75d486ce6cc6b7ffbc22ebef8b32bb242b7" dependencies: amd-name-resolver "0.0.6" babel-plugin-transform-es2015-modules-amd "^6.24.0" @@ -2308,14 +2411,14 @@ ember-cli@^2.14.0: bower-endpoint-parser "0.2.2" broccoli-babel-transpiler "^6.0.0" broccoli-brocfile-loader "^0.18.0" - broccoli-builder "^0.18.3" + broccoli-builder "^0.18.8" broccoli-concat "^3.2.2" broccoli-config-loader "^1.0.0" broccoli-config-replace "^1.1.2" broccoli-funnel "^1.0.6" broccoli-funnel-reducer "^1.0.0" broccoli-merge-trees "^2.0.0" - broccoli-middleware "^1.0.0-beta.8" + broccoli-middleware "^1.0.0" broccoli-source "^1.1.0" broccoli-stew "^1.2.0" calculate-cache-key-for-tree "^1.0.0" @@ -2416,23 +2519,15 @@ ember-data@~2.11.0: semver "^5.1.0" silent-error "^1.0.0" -ember-disable-prototype-extensions@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/ember-disable-prototype-extensions/-/ember-disable-prototype-extensions-1.1.2.tgz#261cccaf6bf8fbb1836be7bdfe4278f9ab92b873" - dependencies: - bower "^1.8.0" - -ember-disable-proxy-controllers@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ember-disable-proxy-controllers/-/ember-disable-proxy-controllers-1.0.1.tgz#1254eeec0ba025c24eb9e8da611afa7b38754281" - dependencies: - ember-cli-babel "^5.0.0" +ember-disable-prototype-extensions@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/ember-disable-prototype-extensions/-/ember-disable-prototype-extensions-1.1.3.tgz#1969135217654b5e278f9fe2d9d4e49b5720329e" -ember-export-application-global@^1.0.5: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ember-export-application-global/-/ember-export-application-global-1.1.1.tgz#f257d5271268932a89d7392679ce4db89d7154af" +ember-export-application-global@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ember-export-application-global/-/ember-export-application-global-2.0.0.tgz#8d6d7619ac8a1a3f8c43003549eb21ebed685bd2" dependencies: - ember-cli-babel "^5.1.10" + ember-cli-babel "^6.0.0-beta.7" ember-fastboot-addon-tests@^0.4.0: version "0.4.0" @@ -2470,9 +2565,11 @@ ember-inflector@^2.0.0: dependencies: ember-cli-babel "^6.0.0" -ember-load-initializers@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-0.5.1.tgz#76e3db23c111dbdcd3ae6f687036bf0b56be0cbe" +ember-load-initializers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-1.0.0.tgz#4919eaf06f6dfeca7e134633d8c05a6c9921e6e7" + dependencies: + ember-cli-babel "^6.0.0-beta.7" ember-lodash@^4.17.3: version "4.17.4" @@ -2491,17 +2588,26 @@ ember-qunit@^2.1.3: dependencies: ember-test-helpers "^0.6.3" -ember-resolver@^2.0.3: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-2.1.1.tgz#5e4c1fffe9f5f48fc2194ad7592274ed0cd74f72" +ember-resolver@^4.0.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-4.5.0.tgz#9248bf534dfc197fafe3118fff538d436078bf99" dependencies: - ember-cli-babel "^5.1.6" - ember-cli-version-checker "^1.1.6" + "@glimmer/resolver" "^0.4.1" + babel-plugin-debug-macros "^0.1.10" + broccoli-funnel "^1.1.0" + broccoli-merge-trees "^2.0.0" + ember-cli-babel "^6.8.1" + ember-cli-version-checker "^2.0.0" + resolve "^1.3.3" ember-rfc176-data@^0.2.0: version "0.2.4" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.2.4.tgz#f6c5e52ffb14cf66c9fed5bd70fbe68fc91982e9" +ember-rfc176-data@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.2.7.tgz#bd355bc9b473e08096b518784170a23388bc973b" + ember-router-generator@^1.0.0, ember-router-generator@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-1.2.3.tgz#8ed2ca86ff323363120fc14278191e9e8f1315ee" @@ -2523,6 +2629,31 @@ ember-sinon@0.5.1: ember-cli-node-assets "^0.1.1" sinon "^1.17.4" +ember-source@~2.14.0: + version "2.14.1" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-2.14.1.tgz#4abf0b4c916f2da8bf317349df4750905df7e628" + dependencies: + "@glimmer/compiler" "^0.22.3" + "@glimmer/node" "^0.22.3" + "@glimmer/reference" "^0.22.3" + "@glimmer/runtime" "^0.22.3" + "@glimmer/util" "^0.22.3" + broccoli-funnel "^1.2.0" + broccoli-merge-trees "^2.0.0" + ember-cli-get-component-path-option "^1.0.0" + ember-cli-normalize-entity-name "^1.0.0" + ember-cli-path-utils "^1.0.0" + ember-cli-string-utils "^1.1.0" + ember-cli-test-info "^1.0.0" + ember-cli-valid-component-name "^1.0.0" + ember-cli-version-checker "^1.3.1" + handlebars "^4.0.6" + jquery "^3.2.1" + resolve "^1.3.3" + rsvp "^3.5.0" + simple-dom "^0.3.0" + simple-html-tokenizer "^0.4.1" + ember-test-helpers@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/ember-test-helpers/-/ember-test-helpers-0.6.3.tgz#f864cdf6f4e75f3f8768d6537785b5ab6e82d907" @@ -3356,7 +3487,7 @@ growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" -handlebars@^4.0.4: +handlebars@^4.0.4, handlebars@^4.0.6: version "4.0.10" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f" dependencies: @@ -3519,14 +3650,10 @@ http-signature@~1.1.0: jsprim "^1.2.2" sshpk "^1.7.0" -iconv-lite@0.4.13: +iconv-lite@0.4.13, iconv-lite@^0.4.5, iconv-lite@~0.4.13: version "0.4.13" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" -iconv-lite@0.4.15, iconv-lite@^0.4.5, iconv-lite@~0.4.13: - version "0.4.15" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" - ignore@^3.2.0: version "3.3.3" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d" @@ -3806,7 +3933,7 @@ istextorbinary@2.1.0: editions "^1.1.1" textextensions "1 || 2" -jquery@^3.1.0: +jquery@^3.1.0, jquery@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.2.1.tgz#5c4d9de652af6cd0a770154a631bba12b015c787" @@ -3814,10 +3941,6 @@ js-reporters@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/js-reporters/-/js-reporters-1.2.0.tgz#7cf2cb698196684790350d0c4ca07f4aed9ec17e" -js-string-escape@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" - js-tokens@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-1.0.1.tgz#cc435a5c8b94ad15acb7983140fc80182c89aeae" @@ -3985,9 +4108,9 @@ livereload-js@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.2.2.tgz#6c87257e648ab475bc24ea257457edcc1f8d0bc2" -loader.js@^4.0.10: - version "4.5.1" - resolved "https://registry.yarnpkg.com/loader.js/-/loader.js-4.5.1.tgz#c15ab15a6b8376bd4fbf7ea56f8d76cc557331da" +loader.js@^4.2.3: + version "4.6.0" + resolved "https://registry.yarnpkg.com/loader.js/-/loader.js-4.6.0.tgz#b965663ddbe2d80da482454cb865efe496e93e22" locate-path@^2.0.0: version "2.0.0" @@ -4276,11 +4399,7 @@ micromatch@^2.1.5, micromatch@^2.3.7: parse-glob "^3.0.4" regex-cache "^0.4.2" -"mime-db@>= 1.27.0 < 2": - version "1.28.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.28.0.tgz#fedd349be06d2865b7fc57d837c6de4f17d7ac3c" - -mime-db@~1.27.0: +"mime-db@>= 1.27.0 < 2", mime-db@~1.27.0: version "1.27.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" @@ -4290,14 +4409,10 @@ mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.7: dependencies: mime-db "~1.27.0" -mime@1.3.4: +mime@1.3.4, mime@^1.2.11: version "1.3.4" resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" -mime@^1.2.11: - version "1.3.6" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0" - "minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -4837,14 +4952,6 @@ raw-body@~1.1.0: bytes "1" string_decoder "0.10" -raw-body@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96" - dependencies: - bytes "2.4.0" - iconv-lite "0.4.15" - unpipe "1.0.0" - rc@^1.1.7: version "1.2.1" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" @@ -5243,10 +5350,22 @@ silent-error@^1.0.0, silent-error@^1.0.1, silent-error@^1.1.0: dependencies: debug "^2.2.0" +simple-dom@^0.3.0: + version "0.3.2" + resolved "https://registry.yarnpkg.com/simple-dom/-/simple-dom-0.3.2.tgz#0663d10f1556f1500551d518f56e3aba0871371d" + simple-fmt@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/simple-fmt/-/simple-fmt-0.1.0.tgz#191bf566a59e6530482cb25ab53b4a8dc85c3a6b" +simple-html-tokenizer@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.3.0.tgz#9b8b5559d80e331a544dd13dd59382e5d0d94411" + +simple-html-tokenizer@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.4.1.tgz#028988bb7fe8b2e6645676d82052587d440b02d3" + simple-is@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/simple-is/-/simple-is-0.2.0.tgz#2abb75aade39deb5cc815ce10e6191164850baf0" @@ -5779,7 +5898,7 @@ universalify@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.0.tgz#9eb1c4651debcc670cc94f1a75762332bb967778" -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -5923,14 +6042,10 @@ window-size@^0.1.2: version "0.1.4" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" -wordwrap@0.0.2: +wordwrap@0.0.2, 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" - wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" From 60918b19c45b926ce3a9e9c26126e8ea8a0e3cfa Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 2 Sep 2017 17:26:58 -0400 Subject: [PATCH 085/879] Replace constructor.name with instanceof Don't use constructor.name == 'Foo', it breaks with minification. --- addon/orm/model.js | 12 +++++++----- testem.js | 1 - tests/dummy/config/environment.js | 4 ++++ 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/addon/orm/model.js b/addon/orm/model.js index 3b626901f..330857f4f 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -1,3 +1,5 @@ +import BelongsTo from './associations/belongs-to'; +import HasMany from './associations/has-many'; import { toCollectionName } from 'ember-cli-mirage/utils/normalize-name'; import extend from '../utils/extend'; import assert from '../assert'; @@ -293,7 +295,7 @@ class Model { let { key } = association; - if (association.constructor.name === 'HasMany') { + if (association instanceof HasMany) { if (!this[key].includes(model)) { this[key].add(model); } @@ -305,7 +307,7 @@ class Model { disassociate(model, association) { let fk = association.getForeignKey(); - if (association.constructor.name === 'HasMany') { + if (association instanceof HasMany) { let i; if (association.isPolymorphic) { let found = this[fk].find(({ type, id }) => (type === model.modelName && id === model.id)); @@ -510,9 +512,9 @@ class Model { } _disassociateFromOldInverses(association) { - if (association.constructor.name === 'HasMany') { + if (association instanceof HasMany) { this._disassociateFromHasManyInverses(association); - } else if (association.constructor.name === 'BelongsTo') { + } else if (association instanceof BelongsTo) { this._disassociateFromBelongsToInverse(association); } } @@ -686,7 +688,7 @@ class Model { let inverse = model.inverseFor(association); let inverseFk = inverse.getForeignKey(); - if (inverse.constructor.name === 'BelongsTo') { + if (inverse instanceof BelongsTo) { this._schema.db[toCollectionName(model.modelName)] .update(model.id, { [inverseFk]: this.id }); diff --git a/testem.js b/testem.js index f0a69263e..11d8c558f 100644 --- a/testem.js +++ b/testem.js @@ -7,7 +7,6 @@ module.exports = { 'Chrome' ], launch_in_dev: [ - 'Chrome' ], browser_args: { Chrome: [ diff --git a/tests/dummy/config/environment.js b/tests/dummy/config/environment.js index 954583c3b..e0fd69eef 100644 --- a/tests/dummy/config/environment.js +++ b/tests/dummy/config/environment.js @@ -22,6 +22,10 @@ module.exports = function(environment) { APP: { // Here you can pass flags/options to your application instance // when it is created + }, + + 'ember-cli-mirage': { + enabled: true } }; From 09a69786e4d671d57f09f615c7d9364bc9af3b11 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 4 Sep 2017 20:45:02 -0400 Subject: [PATCH 086/879] Remove enabled flag in production --- tests/dummy/config/environment.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tests/dummy/config/environment.js b/tests/dummy/config/environment.js index e0fd69eef..954583c3b 100644 --- a/tests/dummy/config/environment.js +++ b/tests/dummy/config/environment.js @@ -22,10 +22,6 @@ module.exports = function(environment) { APP: { // Here you can pass flags/options to your application instance // when it is created - }, - - 'ember-cli-mirage': { - enabled: true } }; From 4550cd80f90fcf07ae597184b57929c859c8f9c0 Mon Sep 17 00:00:00 2001 From: Dray Lacy Date: Fri, 16 Jun 2017 19:38:18 -0400 Subject: [PATCH 087/879] Add failing test to demonstrate #1112 --- .../orm/belongs-to/issue-1112-test.js | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 tests/integration/orm/belongs-to/issue-1112-test.js diff --git a/tests/integration/orm/belongs-to/issue-1112-test.js b/tests/integration/orm/belongs-to/issue-1112-test.js new file mode 100644 index 000000000..f90a0a85b --- /dev/null +++ b/tests/integration/orm/belongs-to/issue-1112-test.js @@ -0,0 +1,29 @@ +import { Model, belongsTo, hasMany } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Issue 1112'); + +test('deleting a record with a polymorphic belongsTo removes it from its parent', function(assert) { + let schema = new Schema(new Db(), { + comment: Model.extend({ + commentable: belongsTo({ polymorphic: true }), + user: belongsTo('user') + }), + + post: Model, + + user: Model.extend({ + comments: hasMany('comment') + }) + }); + + let user = schema.users.create(); + let post = schema.posts.create(); + let comment = schema.comments.create({ commentable: post, user }); + + comment.destroy(); + + assert.deepEqual(user.commentIds, []); +}); From bf487d9a22d79048297c505677144f72df6f24c9 Mon Sep 17 00:00:00 2001 From: Dray Lacy Date: Fri, 16 Jun 2017 19:38:25 -0400 Subject: [PATCH 088/879] Fix query in disassociateAllDependentsFromTarget See #1112. --- addon/orm/associations/belongs-to.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/addon/orm/associations/belongs-to.js b/addon/orm/associations/belongs-to.js index 65a20e9fb..33e228110 100644 --- a/addon/orm/associations/belongs-to.js +++ b/addon/orm/associations/belongs-to.js @@ -232,7 +232,19 @@ export default class BelongsTo extends Association { } let dependents = this.schema[toCollectionName(owner)] - .where({ [this.getForeignKey()]: fk }); + .where((potentialOwner) => { + let id = potentialOwner[this.getForeignKey()]; + + if (!id) { + return false; + } + + if (typeof id === 'object') { + return id.type === fk.type && id.id === fk.id; + } else { + return id === fk; + } + }); dependents.models.forEach(dependent => { dependent.disassociate(model, this); From d769e226895e7f6ffc9f32edff12fea0d101b72e Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 4 Sep 2017 13:20:21 -0400 Subject: [PATCH 089/879] Create regressions folder --- addon/orm/model.js | 3 ++- tests/dummy/app/app.js | 3 --- .../orm/belongs-to/{ => regressions}/issue-1112-test.js | 6 +++--- 3 files changed, 5 insertions(+), 7 deletions(-) rename tests/integration/orm/belongs-to/{ => regressions}/issue-1112-test.js (72%) diff --git a/addon/orm/model.js b/addon/orm/model.js index 330857f4f..549b7d5ab 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -7,6 +7,7 @@ import Collection from './collection'; import PolymorphicCollection from './polymorphic-collection'; import _values from 'lodash/values'; import _compact from 'lodash/compact'; +import _assign from 'lodash/assign'; /* The Model class. Notes: @@ -696,7 +697,7 @@ class Model { let ownerId = this.id; let inverseCollection = this._schema.db[toCollectionName(model.modelName)]; let currentIdsForInverse = inverseCollection.find(model.id)[inverse.getForeignKey()] || []; - let newIdsForInverse = currentIdsForInverse; + let newIdsForInverse = _assign([], currentIdsForInverse); if (newIdsForInverse.indexOf(ownerId) === -1) { newIdsForInverse.push(ownerId); diff --git a/tests/dummy/app/app.js b/tests/dummy/app/app.js index e72c9ad74..b3b2bd677 100644 --- a/tests/dummy/app/app.js +++ b/tests/dummy/app/app.js @@ -1,11 +1,8 @@ -import Ember from 'ember'; import Application from '@ember/application'; import Resolver from './resolver'; import loadInitializers from 'ember-load-initializers'; import config from './config/environment'; -Ember.MODEL_FACTORY_INJECTIONS = true; - const App = Application.extend({ modulePrefix: config.modulePrefix, podModulePrefix: config.podModulePrefix, diff --git a/tests/integration/orm/belongs-to/issue-1112-test.js b/tests/integration/orm/belongs-to/regressions/issue-1112-test.js similarity index 72% rename from tests/integration/orm/belongs-to/issue-1112-test.js rename to tests/integration/orm/belongs-to/regressions/issue-1112-test.js index f90a0a85b..62dd0f35b 100644 --- a/tests/integration/orm/belongs-to/issue-1112-test.js +++ b/tests/integration/orm/belongs-to/regressions/issue-1112-test.js @@ -3,9 +3,9 @@ import Schema from 'ember-cli-mirage/orm/schema'; import Db from 'ember-cli-mirage/db'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Issue 1112'); +module('Integration | ORM | Belongs To | Regressions | Issue 1112'); -test('deleting a record with a polymorphic belongsTo removes it from its parent', function(assert) { +test(`deleting a record with a polymorphic belongsTo doesn't interfere with other dependents`, function(assert) { let schema = new Schema(new Db(), { comment: Model.extend({ commentable: belongsTo({ polymorphic: true }), @@ -25,5 +25,5 @@ test('deleting a record with a polymorphic belongsTo removes it from its parent' comment.destroy(); - assert.deepEqual(user.commentIds, []); + assert.deepEqual(user.reload().commentIds, []); }); From 165813000908e2303ff96fd970735742bbf1984b Mon Sep 17 00:00:00 2001 From: Jon Hall Date: Mon, 4 Sep 2017 20:19:22 +0100 Subject: [PATCH 090/879] Add test demonstrating #1154. --- .../associations/polymorphic-has-many-test.js | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/integration/serializers/base/associations/polymorphic-has-many-test.js b/tests/integration/serializers/base/associations/polymorphic-has-many-test.js index 1c055bf44..31993d257 100644 --- a/tests/integration/serializers/base/associations/polymorphic-has-many-test.js +++ b/tests/integration/serializers/base/associations/polymorphic-has-many-test.js @@ -51,3 +51,29 @@ test(`it can serialize a polymorphic has-many relationship`, function(assert) { ] }); }); + +test(`it can serialize an embedded polymorphic has-many relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + user: this.BaseSerializer.extend({ + include: ['things'], + embed: true + }) + }); + + let user = this.schema.users.find(1); + let result = registry.serialize(user); + + assert.deepEqual(result, { + user: { + id: '1', + name: 'Ned', + things: [ + { + id: '1', + title: 'Lorem ipsum' + } + ] + } + }); +}); From 1d9737114057d7f331a34ff8c0d235bcd6e52419 Mon Sep 17 00:00:00 2001 From: Jon Hall Date: Mon, 4 Sep 2017 20:19:39 +0100 Subject: [PATCH 091/879] Fixes #1154 Make sure suitable serializers are used when embedding included, polymorphic, hasMany items. --- addon/serializer.js | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/addon/serializer.js b/addon/serializer.js index ee8703724..3e5792840 100644 --- a/addon/serializer.js +++ b/addon/serializer.js @@ -103,13 +103,32 @@ class Serializer { } getHashForResource(resource, removeForeignKeys = false, didSerialize = {}, lookupSerializer = false) { - let hash; - let serializer = lookupSerializer ? this.serializerFor(resource.modelName) : this; // this is used for embedded responses + let hash, + serializer; + + if (!lookupSerializer) { + serializer = this; // this is used for embedded responses + } + + // PolymorphicCollection lacks a modelName, but is dealt with in the map + // by looking up the serializer on a per-model basis + if (lookupSerializer && resource.modelName) { + serializer = this.serializerFor(resource.modelName); + } if (this.isModel(resource)) { hash = serializer._hashForModel(resource, removeForeignKeys, didSerialize); } else { - hash = resource.models.map((m) => serializer._hashForModel(m, removeForeignKeys, didSerialize)); + hash = resource.models.map((m) => { + let modelSerializer = serializer; + + if (!modelSerializer) { + // Can't get here if lookupSerializer is false, so look it up + modelSerializer = this.serializerFor(m.modelName); + } + + return modelSerializer._hashForModel(m, removeForeignKeys, didSerialize); + }); } if (this.embed) { From 079c47711c64fca3c07bf7089ab466479f88097f Mon Sep 17 00:00:00 2001 From: Vincent Eberle Date: Thu, 31 Aug 2017 13:11:59 -0400 Subject: [PATCH 092/879] #1076 Add breaking test for using 'association' helper in a dasherized factory --- tests/integration/factories/helpers-test.js | 104 +++++++++++++------- 1 file changed, 70 insertions(+), 34 deletions(-) diff --git a/tests/integration/factories/helpers-test.js b/tests/integration/factories/helpers-test.js index 46c7f683f..a53c0dfba 100644 --- a/tests/integration/factories/helpers-test.js +++ b/tests/integration/factories/helpers-test.js @@ -3,46 +3,82 @@ import { Model, Factory, belongsTo, hasMany, trait, association } from 'ember-cl import Server from 'ember-cli-mirage/server'; module('Integration | Server | Factories | helpers', { - beforeEach() { - this.server = new Server({ - environment: 'test', - models: { - author: Model.extend({ - posts: hasMany() - }), - category: Model.extend({ - posts: hasMany('post', { inverse: 'kind' }) - }), - post: Model.extend({ - author: belongsTo(), - kind: belongsTo('category') - }) - }, - factories: { - author: Factory.extend({ - name: 'Sam' - }), - category: Factory.extend({ - name: 'awesome software' - }), - post: Factory.extend({ - title: 'Lorem ipsum', - - author: association(), - - withCategory: trait({ - kind: association() - }) - }) - } - }); - }, afterEach() { this.server.shutdown(); } }); +test('it creates associations with "association" helper in a dasherized factory', function(assert) { + this.server = new Server({ + environment: 'test', + models: { + author: Model.extend({ + blogPosts: hasMany() + }), + blogPost: Model.extend({ + author: belongsTo() + }) + }, + factories: { + author: Factory.extend({ + name: 'Sam' + }), + blogPost: Factory.extend({ + title: 'Lorem ipsum', + + author: association() + }) + } + }); + + let blogPost = this.server.create('blog-post'); + + assert.ok(blogPost.author); + + let { db } = this.server; + + assert.equal(db.authors.length, 1); + assert.deepEqual(db.authors[0], { + id: '1', + name: 'Sam', + blogPostIds: ['1'] + }); +}); + test('it creates associations with "association" helper combininig with traits', function(assert) { + this.server = new Server({ + environment: 'test', + models: { + author: Model.extend({ + posts: hasMany() + }), + category: Model.extend({ + posts: hasMany('post', { inverse: 'kind' }) + }), + post: Model.extend({ + author: belongsTo(), + kind: belongsTo('category') + }) + }, + factories: { + author: Factory.extend({ + name: 'Sam' + }), + category: Factory.extend({ + name: 'awesome software' + }), + post: Factory.extend({ + title: 'Lorem ipsum', + + author: association(), + + withCategory: trait({ + kind: association() + }) + }) + } + }); + let post = this.server.create('post', 'withCategory'); assert.ok(post.kind); From 0bfbe012e2e7455be107c56257dc70c5438c6baf Mon Sep 17 00:00:00 2001 From: Vincent Eberle Date: Thu, 31 Aug 2017 13:12:51 -0400 Subject: [PATCH 093/879] #1076 Add logic to camelize model name before doing schema lookup for 'association' helper --- addon/server.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addon/server.js b/addon/server.js index 47823fb0b..049c83260 100644 --- a/addon/server.js +++ b/addon/server.js @@ -666,7 +666,8 @@ export default class Server { * @private */ _fetchAssociationNameFromModel(modelType, associationAttribute) { - let model = this.schema.modelFor(modelType); + let camelizedModelType = camelize(modelType); + let model = this.schema.modelFor(camelizedModelType); if (!model) { throw new Error(`Model not registered: ${modelType}`); } From b997176f1d46aaad4c8f82fb7920e7baa8db9e68 Mon Sep 17 00:00:00 2001 From: ChrisBarthol Date: Sun, 1 Oct 2017 20:43:01 -0400 Subject: [PATCH 094/879] serializer blueprint should extend the application serializer --- .../mirage-serializer/files/__root__/serializers/__name__.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blueprints/mirage-serializer/files/__root__/serializers/__name__.js b/blueprints/mirage-serializer/files/__root__/serializers/__name__.js index 6d47a3669..9678f197b 100644 --- a/blueprints/mirage-serializer/files/__root__/serializers/__name__.js +++ b/blueprints/mirage-serializer/files/__root__/serializers/__name__.js @@ -1,4 +1,4 @@ -import { JSONAPISerializer } from 'ember-cli-mirage'; +import ApplicationSerializer from './application'; -export default JSONAPISerializer.extend({ +export default ApplicationSerializer.extend({ }); From ce37a8f063358da656a8b426a85c820d85c8be67 Mon Sep 17 00:00:00 2001 From: Charles Lowell Date: Tue, 3 Oct 2017 16:01:05 -0500 Subject: [PATCH 095/879] Base Class.extend() on native es class syntax The extend mechanism, which we inherited from Ember pre-dates the advent of native ES class syntax. Among other things, this meant manually constructing the prototype chain when expressing the inheritance. This change lets the `class` syntax do the heavy lifting of prototype wiring while making the code more clear as to its intent. As a bonus, instances created with this class show up in development tools as `class Child` of instead of ``` function () { return parent.apply(this, arguments); } ``` Still not ideal, but better than the alternative. Finally, the `__super__` property was removed since it's of dubious value and did not cause any tests to fail. --- addon/utils/extend.js | 45 +++++++++++++++---------------------------- 1 file changed, 15 insertions(+), 30 deletions(-) diff --git a/addon/utils/extend.js b/addon/utils/extend.js index d49d3488b..178fe9771 100644 --- a/addon/utils/extend.js +++ b/addon/utils/extend.js @@ -1,44 +1,29 @@ import _assign from 'lodash/assign'; import _has from 'lodash/has'; -export default function(protoProps, staticProps) { - let parent = this; - let child; - - // The constructor function for the new subclass is either defined by you - // (the "constructor" property in your `extend` definition), or defaulted - // by us to simply call the parent's constructor. - if (protoProps && _has(protoProps, 'constructor')) { - child = protoProps.constructor; - } else { - child = function() { - return parent.apply(this, arguments); - }; +export default function extend(protoProps, staticProps) { + let Parent = this; + + class Child extends Parent { + constructor(...args) { + super(...args); + // The constructor function for the new subclass is optionally defined by you + // in your `extend` definition + if (protoProps && _has(protoProps, 'constructor')) { + protoProps.constructor.call(this, ...args); + } + } } // Add static properties to the constructor function, if supplied. - _assign(child, parent, staticProps); - - // Set the prototype chain to inherit from `parent`, without calling - // `parent`'s constructor function. - let Surrogate = function() { - this.constructor = child; - }; - - Surrogate.prototype = parent.prototype; - child.prototype = new Surrogate(); + _assign(Child, Parent, staticProps); // Add prototype properties (instance properties) to the subclass, // if supplied. if (protoProps) { - _assign(child.prototype, protoProps); + _assign(Child.prototype, protoProps); } - // if (protoProps) { _assign(child.prototype, protoProps); } - - // Set a convenience property in case the parent's prototype is needed - // later. - child.__super__ = parent.prototype; - return child; + return Child; } From 116a2cdd40f869f818aba7fb2d18d70cdfb2e9d2 Mon Sep 17 00:00:00 2001 From: Matt Long Date: Mon, 2 Oct 2017 11:16:07 -0400 Subject: [PATCH 096/879] update error message for 3.x version --- addon/orm/schema.js | 2 +- addon/route-handlers/base.js | 2 +- addon/server.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addon/orm/schema.js b/addon/orm/schema.js index 75a8000ce..dea820200 100644 --- a/addon/orm/schema.js +++ b/addon/orm/schema.js @@ -80,7 +80,7 @@ export default class Schema { !_includes(fksAddedFromThisModel[fkHolder], fk), `Your '${type}' model definition has multiple possible inverse relationships of type '${fkHolder}'. - Please read the associations guide and specify explicit inverses: http://www.ember-cli-mirage.com/docs/v0.2.x/models/#associations` + Please read the associations guide and specify explicit inverses: http://www.ember-cli-mirage.com/docs/v0.3.x/models/#associations` ); fksAddedFromThisModel[fkHolder].push(fk); diff --git a/addon/route-handlers/base.js b/addon/route-handlers/base.js index f378db70d..e2a7b9d3f 100644 --- a/addon/route-handlers/base.js +++ b/addon/route-handlers/base.js @@ -44,7 +44,7 @@ export default class BaseRouteHandler { assert( json.data && (json.data.attributes || json.data.type || json.data.relationships), - `You're using a shorthand or #normalizedRequestAttrs, but your serializer's normalize function did not return a valid JSON:API document. http://www.ember-cli-mirage.com/docs/v0.2.x/serializers/#normalizejson` + `You're using a shorthand or #normalizedRequestAttrs, but your serializer's normalize function did not return a valid JSON:API document. http://www.ember-cli-mirage.com/docs/v0.3.x/serializers/#normalizejson` ); if (json.data.attributes) { diff --git a/addon/server.js b/addon/server.js index 049c83260..cf52eb00c 100644 --- a/addon/server.js +++ b/addon/server.js @@ -674,7 +674,7 @@ export default class Server { let association = model.class.findBelongsToAssociation(associationAttribute); if (!association) { - throw new Error(`You're using the \`association\` factory helper on the '${associationAttribute}' attribute of your ${modelType} factory, but that attribute is not a \`belongsTo\` association. Read the Factories docs for more information: http://www.ember-cli-mirage.com/docs/v0.2.x/factories/#factories-and-relationships`); + throw new Error(`You're using the \`association\` factory helper on the '${associationAttribute}' attribute of your ${modelType} factory, but that attribute is not a \`belongsTo\` association. Read the Factories docs for more information: http://www.ember-cli-mirage.com/docs/v0.3.x/factories/#factories-and-relationships`); } return camelize(association.modelName); } From 4ee2b22247324e9f437dbb96643c16d7efa55e68 Mon Sep 17 00:00:00 2001 From: Matthew Beale Date: Sun, 15 Oct 2017 16:39:32 -0700 Subject: [PATCH 097/879] Bump ember-cli, ember-cli-babel --- .gitignore | 14 +- .npmignore | 4 +- .travis.yml | 30 +- addon/orm/associations/belongs-to.js | 2 +- addon/server.js | 2 +- addon/utils/read-modules.js | 4 +- app/initializers/ember-cli-mirage.js | 7 +- config/ember-try.js | 14 + ember-cli-build.js | 1 + package.json | 16 +- testem.js | 16 +- tests/dummy/app/index.html | 4 +- tests/dummy/app/router.js | 1 - tests/dummy/config/environment.js | 2 +- tests/helpers/module-for-acceptance.js | 5 +- tests/helpers/start-app.js | 14 +- tests/test-helper.js | 4 +- yarn.lock | 2383 +++++++++++++----------- 18 files changed, 1395 insertions(+), 1128 deletions(-) diff --git a/.gitignore b/.gitignore index dda961cae..c7f005ca1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -# See http://help.github.com/ignore-files/ for more about ignoring files. +# See https://help.github.com/ignore-files/ for more about ignoring files. # compiled output /dist @@ -16,6 +16,13 @@ npm-debug.log* yarn-error.log testem.log + +# ember-try +.node_modules.ember-try/ +bower.json.ember-try +package.json.ember-try + +# custom .floo _site jekyll-tmp @@ -23,8 +30,3 @@ jekyll-tmp # IDE /.idea/ /*.iml - -# ember-try -.node_modules.ember-try/ -bower.json.ember-try -package.json.ember-try diff --git a/.npmignore b/.npmignore index 332f0736a..563d2f43a 100644 --- a/.npmignore +++ b/.npmignore @@ -1,8 +1,6 @@ -/.sass-cache /bower_components /config/ember-try.js /dist -/jekyll-tmp /tests /tmp **/.gitkeep @@ -16,4 +14,6 @@ bower.json ember-cli-build.js testem.js +/.sass-cache +/jekyll-tmp *.md diff --git a/.travis.yml b/.travis.yml index 4243de0bf..28c43b602 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,8 @@ --- language: node_js node_js: + # we recommend testing addons with the same minimum supported node version as Ember CLI + # so that your addon works for all apps - "4" - "6" - "7" @@ -17,16 +19,22 @@ cache: - $HOME/.cache # includes bower's cache env: - # we recommend testing LTS's and latest stable release (bonus points to beta/canary) - - EMBER_TRY_SCENARIO=ember-1.13 - - EMBER_TRY_SCENARIO=ember-lts-2.4 - - EMBER_TRY_SCENARIO=ember-lts-2.8 - - EMBER_TRY_SCENARIO=ember-release - - EMBER_TRY_SCENARIO=ember-beta - - EMBER_TRY_SCENARIO=ember-canary - - EMBER_TRY_SCENARIO=ember-default - - EMBER_TRY_SCENARIO=fastboot-tests - - EMBER_TRY_SCENARIO=node-tests + global: + # See https://git.io/vdao3 for details. + - JOBS=1 + matrix: + # we recommend new addons test the current and previous LTS + # as well as latest stable release (bonus points to beta/canary) + - EMBER_TRY_SCENARIO=ember-1.13 + - EMBER_TRY_SCENARIO=ember-lts-2.4 + - EMBER_TRY_SCENARIO=ember-lts-2.8 + - EMBER_TRY_SCENARIO=ember-lts-2.12 + - EMBER_TRY_SCENARIO=ember-release + - EMBER_TRY_SCENARIO=ember-beta + - EMBER_TRY_SCENARIO=ember-canary + - EMBER_TRY_SCENARIO=ember-default + - EMBER_TRY_SCENARIO=fastboot-tests + - EMBER_TRY_SCENARIO=node-tests matrix: fast_finish: true @@ -46,4 +54,4 @@ install: script: # Usually, it's ok to finish the test scenario without reverting # to the addon's original dependency state, skipping "cleanup". - - node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO test --skip-cleanup + - node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO --skip-cleanup diff --git a/addon/orm/associations/belongs-to.js b/addon/orm/associations/belongs-to.js index 33e228110..2056eac1c 100644 --- a/addon/orm/associations/belongs-to.js +++ b/addon/orm/associations/belongs-to.js @@ -108,7 +108,7 @@ export default class BelongsTo extends Association { tempParent = association.schema[toCollectionName(id.type)].find(id.id); } else { tempParent = association.schema[toCollectionName(association.modelName)].find(id); - assert(tempParent, `Couldn\'t find ${association.modelName} with id = ${id}`); + assert(tempParent, `Couldn't find ${association.modelName} with id = ${id}`); } } diff --git a/addon/server.js b/addon/server.js index cf52eb00c..b3a47614c 100644 --- a/addon/server.js +++ b/addon/server.js @@ -146,7 +146,7 @@ export default class Server { config(config = {}) { let didOverrideConfig = (config.environment && (this.environment && (this.environment !== config.environment))); assert(!didOverrideConfig, - 'You cannot modify Mirage\'s environment once the server is created'); + 'You cannot modify Mirage\'s environment once the server is created'); this.environment = config.environment || 'development'; this.options = config; diff --git a/addon/utils/read-modules.js b/addon/utils/read-modules.js index e7526546c..68978bae3 100644 --- a/addon/utils/read-modules.js +++ b/addon/utils/read-modules.js @@ -30,11 +30,11 @@ export default function(prefix) { let moduleType = _camelCase(moduleParts[moduleParts.length - 2]); let moduleKey = moduleParts[moduleParts.length - 1]; assert(`Subdirectories under ${moduleType} are not supported`, - moduleParts[moduleParts.length - 3] === 'mirage'); + moduleParts[moduleParts.length - 3] === 'mirage'); if (moduleType === 'scenario') { assert('Only scenario/default.js is supported at this time.', - moduleKey !== 'default'); + moduleKey !== 'default'); } /* diff --git a/app/initializers/ember-cli-mirage.js b/app/initializers/ember-cli-mirage.js index 3dd950182..3e6923417 100644 --- a/app/initializers/ember-cli-mirage.js +++ b/app/initializers/ember-cli-mirage.js @@ -11,12 +11,7 @@ const { export default { name: 'ember-cli-mirage', - initialize: function(application) { - if (arguments.length > 1) { // Ember < 2.1 - var container = arguments[0], - application = arguments[1]; - } - + initialize() { if (_shouldUseMirage(ENV.environment, ENV['ember-cli-mirage'])) { startMirage(ENV); } diff --git a/config/ember-try.js b/config/ember-try.js index 58ad33950..ab3dbde8c 100644 --- a/config/ember-try.js +++ b/config/ember-try.js @@ -1,5 +1,6 @@ /* eslint-env node */ module.exports = { + useYarn: true, scenarios: [ { name: 'ember-1.13', @@ -49,6 +50,14 @@ module.exports = { } } }, + { + name: 'ember-lts-2.12', + npm: { + devDependencies: { + 'ember-source': '~2.12.0' + } + } + }, { name: 'ember-release', bower: { @@ -74,6 +83,11 @@ module.exports = { resolutions: { 'ember': 'beta' } + }, + npm: { + devDependencies: { + 'ember-source': null + } } }, { diff --git a/ember-cli-build.js b/ember-cli-build.js index c26618150..ddf6a13fa 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -5,6 +5,7 @@ const EmberAddon = require('ember-cli/lib/broccoli/ember-addon'); module.exports = function(defaults) { let app = new EmberAddon(defaults, { + // Add options here 'ember-cli-babel': { includePolyfill: true }, diff --git a/package.json b/package.json index 2ae0117e1..a1265213d 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "broccoli-merge-trees": "^1.1.0", "broccoli-stew": "^1.5.0", "chalk": "^1.1.1", - "ember-cli-babel": "^6.6.0", + "ember-cli-babel": "^6.8.2", "ember-cli-node-assets": "^0.1.4", "ember-get-config": "^0.2.2", "ember-inflector": "^2.0.0", @@ -52,25 +52,25 @@ "broccoli-asset-rev": "^2.4.5", "chai": "^4.1.0", "ember-ajax": "^3.0.0", - "ember-cli": "~2.14.0", + "ember-cli": "~2.16.2", "ember-cli-app-version": "^2.0.0", - "ember-cli-dependency-checker": "^1.3.0", - "ember-cli-eslint": "^3.0.0", + "ember-cli-dependency-checker": "^2.0.0", + "ember-cli-eslint": "^4.0.0", "ember-cli-htmlbars": "^2.0.1", - "ember-cli-htmlbars-inline-precompile": "^0.4.3", + "ember-cli-htmlbars-inline-precompile": "^1.0.0", "ember-cli-inject-live-reload": "^1.4.1", "ember-cli-qunit": "^4.0.0", "ember-cli-release": "^0.2.9", "ember-cli-shims": "^1.1.0", "ember-cli-sri": "^2.1.0", - "ember-cli-uglify": "^1.2.0", - "ember-data": "~2.11.0", + "ember-cli-uglify": "^2.0.0", + "ember-data": "~2.13.0", "ember-disable-prototype-extensions": "^1.1.2", "ember-export-application-global": "^2.0.0", "ember-fastboot-addon-tests": "^0.4.0", "ember-load-initializers": "^1.0.0", "ember-resolver": "^4.0.0", - "ember-source": "~2.14.0", + "ember-source": "~2.16.0", "ember-sinon": "0.5.1", "eslint-plugin-ember-suave": "^1.0.0", "loader.js": "^4.2.3", diff --git a/testem.js b/testem.js index 11d8c558f..f6598cb8d 100644 --- a/testem.js +++ b/testem.js @@ -1,5 +1,4 @@ /* eslint-env node */ - module.exports = { test_page: 'tests/index.html?hidepassed', disable_watching: true, @@ -9,11 +8,14 @@ module.exports = { launch_in_dev: [ ], browser_args: { - Chrome: [ - '--disable-gpu', - '--headless', - '--remote-debugging-port=9222', - '--window-size=1440,900' - ] + Chrome: { + mode: 'ci', + args: [ + '--disable-gpu', + '--headless', + '--remote-debugging-port=9222', + '--window-size=1440,900' + ] + }, } }; diff --git a/tests/dummy/app/index.html b/tests/dummy/app/index.html index 5120bd73f..61400b20f 100644 --- a/tests/dummy/app/index.html +++ b/tests/dummy/app/index.html @@ -9,8 +9,8 @@ {{content-for "head"}} - - + + {{content-for "head-footer"}} diff --git a/tests/dummy/app/router.js b/tests/dummy/app/router.js index d5336b91f..0c8551f27 100644 --- a/tests/dummy/app/router.js +++ b/tests/dummy/app/router.js @@ -1,5 +1,4 @@ import EmberRouter from '@ember/routing/router'; - import config from './config/environment'; const Router = EmberRouter.extend({ diff --git a/tests/dummy/config/environment.js b/tests/dummy/config/environment.js index 954583c3b..7cecef29f 100644 --- a/tests/dummy/config/environment.js +++ b/tests/dummy/config/environment.js @@ -45,7 +45,7 @@ module.exports = function(environment) { } if (environment === 'production') { - + // here you can enable a production-specific feature } return ENV; diff --git a/tests/helpers/module-for-acceptance.js b/tests/helpers/module-for-acceptance.js index 30d9caa83..90a93bac2 100644 --- a/tests/helpers/module-for-acceptance.js +++ b/tests/helpers/module-for-acceptance.js @@ -1,6 +1,5 @@ import { module } from 'qunit'; -import { Promise } from 'rsvp'; - +import { resolve } from 'rsvp'; import startApp from '../helpers/start-app'; import destroyApp from '../helpers/destroy-app'; @@ -16,7 +15,7 @@ export default function(name, options = {}) { afterEach() { let afterEach = options.afterEach && options.afterEach.apply(this, arguments); - return Promise.resolve(afterEach).then(() => destroyApp(this.application)); + return resolve(afterEach).then(() => destroyApp(this.application)); } }); } diff --git a/tests/helpers/start-app.js b/tests/helpers/start-app.js index cfdb08b50..681aa01a2 100644 --- a/tests/helpers/start-app.js +++ b/tests/helpers/start-app.js @@ -1,20 +1,16 @@ -import { merge } from '@ember/polyfills'; -import { run } from '@ember/runloop'; - import Application from '../../app'; import config from '../../config/environment'; +import { merge } from '@ember/polyfills'; +import { run } from '@ember/runloop'; export default function startApp(attrs) { - let application; - let attributes = merge({}, config.APP); attributes = merge(attributes, attrs); // use defaults, but you can override; - run(() => { - application = Application.create(attributes); + return run(() => { + let application = Application.create(attributes); application.setupForTesting(); application.injectTestHelpers(); + return application; }); - - return application; } diff --git a/tests/test-helper.js b/tests/test-helper.js index d4c7e837d..f219659e5 100644 --- a/tests/test-helper.js +++ b/tests/test-helper.js @@ -1,5 +1,7 @@ import resolver from './helpers/resolver'; -import { setResolver } from 'ember-qunit'; +import { + setResolver +} from 'ember-qunit'; import { start } from 'ember-cli-qunit'; setResolver(resolver); diff --git a/yarn.lock b/yarn.lock index cf7d297fa..c53a21572 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,51 +2,52 @@ # yarn lockfile v1 -"@glimmer/compiler@^0.22.3": - version "0.22.3" - resolved "https://registry.yarnpkg.com/@glimmer/compiler/-/compiler-0.22.3.tgz#3aef9448460af1d320a82423323498a6ff38a0c6" - dependencies: - "@glimmer/syntax" "^0.22.3" - "@glimmer/util" "^0.22.3" - "@glimmer/wire-format" "^0.22.3" +"@glimmer/compiler@^0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@glimmer/compiler/-/compiler-0.25.3.tgz#25eb06394f3ba1c1fae5af25c9cf7deb2c11ef4e" + dependencies: + "@glimmer/interfaces" "^0.25.3" + "@glimmer/syntax" "^0.25.3" + "@glimmer/util" "^0.25.3" + "@glimmer/wire-format" "^0.25.3" simple-html-tokenizer "^0.3.0" "@glimmer/di@^0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@glimmer/di/-/di-0.2.0.tgz#73bfd4a6ee4148a80bf092e8a5d29bcac9d4ce7e" -"@glimmer/interfaces@^0.22.3": - version "0.22.3" - resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.22.3.tgz#1c2e3289ae41a750f0c8ddcc64529b9e90dda604" +"@glimmer/interfaces@^0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.25.3.tgz#8c460b28ad5a17eaa1712e6aa7b8ebb49738c38f" dependencies: - "@glimmer/wire-format" "^0.22.3" + "@glimmer/wire-format" "^0.25.3" -"@glimmer/node@^0.22.3": - version "0.22.3" - resolved "https://registry.yarnpkg.com/@glimmer/node/-/node-0.22.3.tgz#ff33eea6e65147a20c1bd1f05fdc4a6c3595c54c" +"@glimmer/node@^0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@glimmer/node/-/node-0.25.3.tgz#301828e8455be141d5384b01980ed9be02984059" dependencies: - "@glimmer/runtime" "^0.22.3" + "@glimmer/runtime" "^0.25.3" simple-dom "^0.3.0" -"@glimmer/object-reference@^0.22.3": - version "0.22.3" - resolved "https://registry.yarnpkg.com/@glimmer/object-reference/-/object-reference-0.22.3.tgz#31db68c8912324c63509b1ef83213f7ad4ef312b" +"@glimmer/object-reference@^0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@glimmer/object-reference/-/object-reference-0.25.3.tgz#e0d1fa874f912e7d1232d487fcd2096e6b31b620" dependencies: - "@glimmer/reference" "^0.22.3" - "@glimmer/util" "^0.22.3" + "@glimmer/reference" "^0.25.3" + "@glimmer/util" "^0.25.3" -"@glimmer/object@^0.22.3": - version "0.22.3" - resolved "https://registry.yarnpkg.com/@glimmer/object/-/object-0.22.3.tgz#1fc9fd7465c7d12e5b92464ad40038b595de8ed0" +"@glimmer/object@^0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@glimmer/object/-/object-0.25.3.tgz#451eb208dadba1ede9c0c038a90dfe32637493fe" dependencies: - "@glimmer/object-reference" "^0.22.3" - "@glimmer/util" "^0.22.3" + "@glimmer/object-reference" "^0.25.3" + "@glimmer/util" "^0.25.3" -"@glimmer/reference@^0.22.3": - version "0.22.3" - resolved "https://registry.yarnpkg.com/@glimmer/reference/-/reference-0.22.3.tgz#6f2ef8cd97fe756d89fef75f8c3c79003502a2a9" +"@glimmer/reference@^0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@glimmer/reference/-/reference-0.25.3.tgz#a09ddc397bee0223de73ea5044a304a30935104f" dependencies: - "@glimmer/util" "^0.22.3" + "@glimmer/util" "^0.25.3" "@glimmer/resolver@^0.4.1": version "0.4.1" @@ -54,49 +55,58 @@ dependencies: "@glimmer/di" "^0.2.0" -"@glimmer/runtime@^0.22.3": - version "0.22.3" - resolved "https://registry.yarnpkg.com/@glimmer/runtime/-/runtime-0.22.3.tgz#b8cb28efc9cc86c406ee996f5c2cf6730620d404" +"@glimmer/runtime@^0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@glimmer/runtime/-/runtime-0.25.3.tgz#ae2101a1e4de3330d08f20806c18327dbfa86d78" dependencies: - "@glimmer/interfaces" "^0.22.3" - "@glimmer/object" "^0.22.3" - "@glimmer/object-reference" "^0.22.3" - "@glimmer/reference" "^0.22.3" - "@glimmer/util" "^0.22.3" - "@glimmer/wire-format" "^0.22.3" + "@glimmer/interfaces" "^0.25.3" + "@glimmer/object" "^0.25.3" + "@glimmer/object-reference" "^0.25.3" + "@glimmer/reference" "^0.25.3" + "@glimmer/util" "^0.25.3" + "@glimmer/wire-format" "^0.25.3" -"@glimmer/syntax@^0.22.3": - version "0.22.3" - resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.22.3.tgz#8528d19324bf7f920f5cfd31925e452e51781b44" +"@glimmer/syntax@^0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.25.3.tgz#b3f8a59bee616fd600301d778de3b649bf77036e" dependencies: + "@glimmer/interfaces" "^0.25.3" + "@glimmer/util" "^0.25.3" handlebars "^4.0.6" simple-html-tokenizer "^0.3.0" -"@glimmer/util@^0.22.3": - version "0.22.3" - resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.22.3.tgz#8272f50905d1bb904ee371e8ade83fd779b51508" +"@glimmer/util@^0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.25.3.tgz#7cedf72947137b519658c8be34d0d5965cebe3a1" -"@glimmer/wire-format@^0.22.3": - version "0.22.3" - resolved "https://registry.yarnpkg.com/@glimmer/wire-format/-/wire-format-0.22.3.tgz#19b226d9b93ba6ee54472d9ffb1d48e7c0d80a0d" +"@glimmer/wire-format@^0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@glimmer/wire-format/-/wire-format-0.25.3.tgz#046692b3a26a30a498712266cd0bdb47d7710f37" dependencies: - "@glimmer/util" "^0.22.3" + "@glimmer/util" "^0.25.3" abab@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d" + version "1.0.4" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" abbrev@1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" -accepts@1.3.3, accepts@~1.3.3: +accepts@1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" dependencies: mime-types "~2.1.11" negotiator "0.6.1" +accepts@~1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" + dependencies: + mime-types "~2.1.16" + negotiator "0.6.1" + acorn-globals@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" @@ -117,9 +127,9 @@ acorn@^4.0.3, acorn@^4.0.4: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" -acorn@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.1.tgz#53fe161111f912ab999ee887a90a0bc52822fd75" +acorn@^5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.2.tgz#911cb53e036807cf0fa778dc5d370fbd864246d7" active-model-adapter@^2.0.3: version "2.1.1" @@ -131,17 +141,26 @@ after@0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/after/-/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" -ajv-keywords@^1.0.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" +ajv-keywords@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.0.tgz#a296e17f7bfae7c1ce4f7e0de53d29cb32162df0" -ajv@^4.7.0, ajv@^4.9.1: +ajv@^4.9.1: version "4.11.8" resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" dependencies: co "^4.6.0" json-stable-stringify "^1.0.1" +ajv@^5.1.0, ajv@^5.2.0, ajv@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.3.tgz#c06f598778c44c6b161abafe3466b81ad1814ed2" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + json-schema-traverse "^0.3.0" + json-stable-stringify "^1.0.1" + 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" @@ -162,25 +181,25 @@ amd-name-resolver@0.0.5: dependencies: ensure-posix-path "^1.0.1" -amd-name-resolver@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-0.0.6.tgz#d3e4ba2dfcaab1d820c1be9de947c67828cfe595" - dependencies: - ensure-posix-path "^1.0.1" - amd-name-resolver@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-0.0.7.tgz#814301adfe8a2f109f6e84d5e935196efb669615" dependencies: ensure-posix-path "^1.0.1" +amd-name-resolver@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.0.0.tgz#0e593b28d6fa3326ab1798107edaea961046e8d8" + dependencies: + ensure-posix-path "^1.0.1" + amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" -ansi-escapes@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" +ansi-escapes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" ansi-regex@^0.2.0, ansi-regex@^0.2.1: version "0.2.1" @@ -202,11 +221,11 @@ ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" -ansi-styles@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.1.0.tgz#09c202d5c917ec23188caa5c9cb9179cd9547750" +ansi-styles@^3.0.0, ansi-styles@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" dependencies: - color-convert "^1.0.0" + color-convert "^1.9.0" ansicolors@~0.2.1: version "0.2.1" @@ -217,11 +236,11 @@ any-promise@^1.0.0, any-promise@^1.3.0: resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" anymatch@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" dependencies: - arrify "^1.0.0" micromatch "^2.1.5" + normalize-path "^2.0.0" aot-test-generators@^0.1.0: version "0.1.0" @@ -230,8 +249,8 @@ aot-test-generators@^0.1.0: jsesc "^2.5.0" aproba@^1.0.3: - version "1.1.2" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" are-we-there-yet@~1.1.2: version "1.1.4" @@ -320,13 +339,17 @@ ast-types@0.8.12: version "0.8.12" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.12.tgz#a0d90e4351bb887716c83fd637ebf818af4adfcc" +ast-types@0.8.15: + version "0.8.15" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.15.tgz#8eef0827f04dff0ec8857ba925abe3fea6194e52" + ast-types@0.9.6: version "0.9.6" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" async-disk-cache@^1.2.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/async-disk-cache/-/async-disk-cache-1.3.2.tgz#ac53d6152843df202c9406e28d774362608d74dd" + version "1.3.3" + resolved "https://registry.yarnpkg.com/async-disk-cache/-/async-disk-cache-1.3.3.tgz#6040486660b370e4051cd9fa9fee275e1fae3728" dependencies: debug "^2.1.3" heimdalljs "^0.2.3" @@ -341,10 +364,11 @@ async-each@^1.0.0: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" async-promise-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-promise-queue/-/async-promise-queue-1.0.3.tgz#70c9c37635620f894978814b6c65e6e14e2573ee" + version "1.0.4" + resolved "https://registry.yarnpkg.com/async-promise-queue/-/async-promise-queue-1.0.4.tgz#308baafbc74aff66a0bb6e7f4a18d4fe8434440c" dependencies: async "^2.4.1" + debug "^2.6.8" async@^1.4.0, async@^1.5.2: version "1.5.2" @@ -368,17 +392,21 @@ aws-sign2@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" -aws4@^1.2.1: +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + +aws4@^1.2.1, aws4@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" -babel-code-frame@^6.16.0, babel-code-frame@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" +babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" dependencies: - chalk "^1.1.0" + chalk "^1.1.3" esutils "^2.0.2" - js-tokens "^3.0.0" + js-tokens "^3.0.2" babel-core@^5.0.0: version "5.8.38" @@ -431,41 +459,41 @@ babel-core@^5.0.0: trim-right "^1.0.0" try-resolve "^1.0.0" -babel-core@^6.14.0, babel-core@^6.24.1: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.25.0.tgz#7dd42b0463c742e9d5296deb3ec67a9322dad729" +babel-core@^6.14.0, babel-core@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" dependencies: - babel-code-frame "^6.22.0" - babel-generator "^6.25.0" + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" babel-helpers "^6.24.1" babel-messages "^6.23.0" - babel-register "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.25.0" - babel-traverse "^6.25.0" - babel-types "^6.25.0" - babylon "^6.17.2" - convert-source-map "^1.1.0" - debug "^2.1.1" - json5 "^0.5.0" - lodash "^4.2.0" - minimatch "^3.0.2" - path-is-absolute "^1.0.0" - private "^0.1.6" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.0" + debug "^2.6.8" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.7" slash "^1.0.0" - source-map "^0.5.0" + source-map "^0.5.6" -babel-generator@^6.25.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc" +babel-generator@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" dependencies: babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-types "^6.25.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" detect-indent "^4.0.0" jsesc "^1.3.0" - lodash "^4.2.0" - source-map "^0.5.0" + lodash "^4.17.4" + source-map "^0.5.6" trim-right "^1.0.1" babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: @@ -486,13 +514,13 @@ babel-helper-call-delegate@^6.24.1: babel-types "^6.24.1" babel-helper-define-map@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080" + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" dependencies: babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - lodash "^4.2.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" babel-helper-explode-assignable-expression@^6.24.1: version "6.24.1" @@ -534,12 +562,12 @@ babel-helper-optimise-call-expression@^6.24.1: babel-types "^6.24.1" babel-helper-regex@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8" + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - lodash "^4.2.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" babel-helper-remap-async-to-generator@^6.24.1: version "6.24.1" @@ -589,39 +617,29 @@ babel-plugin-dead-code-elimination@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz#5f7c451274dcd7cccdbfbb3e0b85dd28121f0f65" -babel-plugin-debug-macros@^0.1.10, babel-plugin-debug-macros@^0.1.11, babel-plugin-debug-macros@^0.1.6: +babel-plugin-debug-macros@^0.1.10, babel-plugin-debug-macros@^0.1.11: version "0.1.11" resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.1.11.tgz#6c562bf561fccd406ce14ab04f42c218cf956605" dependencies: semver "^5.3.0" -babel-plugin-ember-modules-api-polyfill@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-1.4.2.tgz#e254f8ed0ba7cf32ea6a71c4770b3568a8577402" - dependencies: - ember-rfc176-data "^0.2.0" - babel-plugin-ember-modules-api-polyfill@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.0.1.tgz#baaf26dcebe2ed1de120021bc42be29f520497b3" + version "2.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.1.0.tgz#78848cc4fcc2274882a6c15cbb23fefcdc771301" dependencies: - ember-rfc176-data "^0.2.7" + ember-rfc176-data "^0.3.0" babel-plugin-eval@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz#a2faed25ce6be69ade4bfec263f70169195950da" -babel-plugin-feature-flags@^0.2.1: - version "0.2.3" - resolved "https://registry.yarnpkg.com/babel-plugin-feature-flags/-/babel-plugin-feature-flags-0.2.3.tgz#81d81ed77bda2014098fa8243abcf03a551cbd4d" - dependencies: - json-stable-stringify "^1.0.1" +babel-plugin-feature-flags@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-feature-flags/-/babel-plugin-feature-flags-0.3.1.tgz#9c827cf9a4eb9a19f725ccb239e85cab02036fc1" -babel-plugin-filter-imports@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-0.2.1.tgz#784f96a892f2f7ed2ccf0955688bd8916cd2e212" - dependencies: - json-stable-stringify "^1.0.1" +babel-plugin-filter-imports@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-0.3.1.tgz#e7859b56886b175dd2616425d277b219e209ea8b" babel-plugin-htmlbars-inline-precompile@^0.2.3: version "0.2.3" @@ -702,14 +720,14 @@ babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - lodash "^4.2.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" babel-plugin-transform-es2015-classes@^6.23.0: version "6.24.1" @@ -774,13 +792,13 @@ babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015 babel-template "^6.24.1" babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" dependencies: babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-types "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" babel-plugin-transform-es2015-modules-systemjs@^6.23.0: version "6.24.1" @@ -866,10 +884,10 @@ babel-plugin-transform-exponentiation-operator@^6.22.0: babel-runtime "^6.22.0" babel-plugin-transform-regenerator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" dependencies: - regenerator-transform "0.9.11" + regenerator-transform "^0.10.0" babel-plugin-transform-strict-mode@^6.24.1: version "6.24.1" @@ -889,14 +907,14 @@ babel-plugin-undefined-to-void@^1.1.6: resolved "https://registry.yarnpkg.com/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz#7f578ef8b78dfae6003385d8417a61eda06e2f81" babel-polyfill@^6.16.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" dependencies: - babel-runtime "^6.22.0" - core-js "^2.4.0" - regenerator-runtime "^0.10.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" -babel-preset-env@^1.2.0, babel-preset-env@^1.5.1: +babel-preset-env@^1.5.1: version "1.6.0" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.0.tgz#2de1c782a780a0a5d605d199c957596da43c44e4" dependencies: @@ -931,73 +949,73 @@ babel-preset-env@^1.2.0, babel-preset-env@^1.5.1: invariant "^2.2.2" semver "^5.3.0" -babel-register@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" dependencies: - babel-core "^6.24.1" - babel-runtime "^6.22.0" - core-js "^2.4.0" + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" home-or-tmp "^2.0.0" - lodash "^4.2.0" + lodash "^4.17.4" mkdirp "^0.5.1" - source-map-support "^0.4.2" + source-map-support "^0.4.15" -babel-runtime@^6.18.0, babel-runtime@^6.22.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" dependencies: core-js "^2.4.0" - regenerator-runtime "^0.10.0" + regenerator-runtime "^0.11.0" -babel-template@^6.24.1, babel-template@^6.25.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071" +babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.25.0" - babel-types "^6.25.0" - babylon "^6.17.2" - lodash "^4.2.0" + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" -babel-traverse@^6.24.1, babel-traverse@^6.25.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1" +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" dependencies: - babel-code-frame "^6.22.0" + babel-code-frame "^6.26.0" babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-types "^6.25.0" - babylon "^6.17.2" - debug "^2.2.0" - globals "^9.0.0" - invariant "^2.2.0" - lodash "^4.2.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" -babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.25.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e" +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" dependencies: - babel-runtime "^6.22.0" + babel-runtime "^6.26.0" esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^1.0.1" + lodash "^4.17.4" + to-fast-properties "^1.0.3" -babel5-plugin-strip-class-callcheck@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/babel5-plugin-strip-class-callcheck/-/babel5-plugin-strip-class-callcheck-5.1.0.tgz#77d4a40c8614d367b8a21a53908159806dba5f91" +babel6-plugin-strip-class-callcheck@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/babel6-plugin-strip-class-callcheck/-/babel6-plugin-strip-class-callcheck-6.0.0.tgz#de841c1abebbd39f78de0affb2c9a52ee228fddf" -babel5-plugin-strip-heimdall@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/babel5-plugin-strip-heimdall/-/babel5-plugin-strip-heimdall-5.0.2.tgz#e1fe191c34de79686564d50a86f4217b8df629c1" +babel6-plugin-strip-heimdall@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/babel6-plugin-strip-heimdall/-/babel6-plugin-strip-heimdall-6.0.1.tgz#35f80eddec1f7fffdc009811dfbd46d9965072b6" babylon@^5.8.38: version "5.8.38" resolved "https://registry.yarnpkg.com/babylon/-/babylon-5.8.38.tgz#ec9b120b11bf6ccd4173a18bf217e60b79859ffd" -babylon@^6.17.2: - version "6.17.4" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.4.tgz#3e8b7402b88d22c3423e137a1577883b15ff869a" +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" backbone@^1.1.2: version "1.3.3" @@ -1021,9 +1039,11 @@ base64id@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-0.1.0.tgz#02ce0fdeee0cef4f40080e1e73e834f0b1bfce3f" -basic-auth@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.1.0.tgz#45221ee429f7ee1e5035be3f51533f1cdfd29884" +basic-auth@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.0.tgz#015db3f353e02e56377755f962742e8981e7bbba" + dependencies: + safe-buffer "5.1.1" bcrypt-pbkdf@^1.0.0: version "1.0.1" @@ -1038,8 +1058,8 @@ better-assert@~1.0.0: callsite "1.0.0" binary-extensions@^1.0.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" + version "1.10.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0" "binaryextensions@1 || 2": version "2.0.0" @@ -1064,8 +1084,23 @@ bluebird@^2.9.33: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" bluebird@^3.1.1, bluebird@^3.4.6: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" + version "3.5.1" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" + +body-parser@1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.1" + http-errors "~1.6.2" + iconv-lite "0.4.19" + on-finished "~2.3.0" + qs "6.5.1" + raw-body "2.3.2" + type-is "~1.6.15" body@^5.1.0: version "5.1.0" @@ -1082,9 +1117,21 @@ boom@2.x.x: dependencies: hoek "2.x.x" +boom@4.x.x: + version "4.3.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" + dependencies: + hoek "4.x.x" + +boom@5.x.x: + version "5.2.0" + resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + dependencies: + hoek "4.x.x" + bower-config@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/bower-config/-/bower-config-1.4.0.tgz#16c38c1135f8071c19f25938d61b0d8cbf18d3f1" + version "1.4.1" + resolved "https://registry.yarnpkg.com/bower-config/-/bower-config-1.4.1.tgz#85fd9df367c2b8dbbd0caa4c5f2bad40cd84c2cc" dependencies: graceful-fs "^4.1.3" mout "^1.0.0" @@ -1116,13 +1163,13 @@ breakable@~1.0.0: resolved "https://registry.yarnpkg.com/breakable/-/breakable-1.0.0.tgz#784a797915a38ead27bad456b5572cb4bbaa78c1" broccoli-asset-rev@^2.4.5: - version "2.5.0" - resolved "https://registry.yarnpkg.com/broccoli-asset-rev/-/broccoli-asset-rev-2.5.0.tgz#f5f66eac962bf9f086286921f0eaeaab6d00d819" + version "2.6.0" + resolved "https://registry.yarnpkg.com/broccoli-asset-rev/-/broccoli-asset-rev-2.6.0.tgz#0633fc3a0b2ba0c2c1d56fa9feb7b331fc83be6d" dependencies: broccoli-asset-rewrite "^1.1.0" broccoli-filter "^1.2.2" json-stable-stringify "^1.0.0" - matcher-collection "^1.0.1" + minimatch "^3.0.4" rsvp "^3.0.6" broccoli-asset-rewrite@^1.1.0: @@ -1131,9 +1178,9 @@ broccoli-asset-rewrite@^1.1.0: dependencies: broccoli-filter "^1.2.3" -broccoli-babel-transpiler@^5.5.0, broccoli-babel-transpiler@^5.6.2: - version "5.7.1" - resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-5.7.1.tgz#e10d831faed1c57e37272e4223748ba71a7926d1" +broccoli-babel-transpiler@^5.6.2: + version "5.7.2" + resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-5.7.2.tgz#756c30544775144e984333b7115f42c916ba08e0" dependencies: babel-core "^5.0.0" broccoli-funnel "^1.0.0" @@ -1146,22 +1193,7 @@ broccoli-babel-transpiler@^5.5.0, broccoli-babel-transpiler@^5.6.2: rsvp "^3.5.0" workerpool "^2.2.1" -broccoli-babel-transpiler@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.1.1.tgz#938f470e1ddb47047a77ef5e38f34c21de0e85a8" - dependencies: - babel-core "^6.14.0" - broccoli-funnel "^1.0.0" - broccoli-merge-trees "^1.0.0" - broccoli-persistent-filter "^1.4.0" - clone "^2.0.0" - hash-for-dep "^1.0.2" - heimdalljs-logger "^0.1.7" - json-stable-stringify "^1.0.0" - rsvp "^3.5.0" - workerpool "^2.2.1" - -broccoli-babel-transpiler@^6.1.2: +broccoli-babel-transpiler@^6.0.0, broccoli-babel-transpiler@^6.1.2: version "6.1.2" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.1.2.tgz#26019c045b5ea3e44cfef62821302f9bd483cabd" dependencies: @@ -1256,9 +1288,9 @@ broccoli-config-replace@^1.1.2: debug "^2.2.0" fs-extra "^0.24.0" -broccoli-debug@^0.6.1, broccoli-debug@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.2.tgz#4c6e89459fc3de7d5d4fc7b77e57f46019f44db1" +broccoli-debug@^0.6.1, broccoli-debug@^0.6.2, broccoli-debug@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.3.tgz#1f33bb0eacb5db81366f0492524c82b1217eb578" dependencies: broccoli-plugin "^1.2.1" fs-tree-diff "^0.5.2" @@ -1297,7 +1329,7 @@ broccoli-funnel-reducer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/broccoli-funnel-reducer/-/broccoli-funnel-reducer-1.0.0.tgz#11365b2a785aec9b17972a36df87eef24c5cc0ea" -broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.2, broccoli-funnel@^1.0.6, broccoli-funnel@^1.1.0, broccoli-funnel@^1.2.0: +broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.2, broccoli-funnel@^1.1.0, broccoli-funnel@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-1.2.0.tgz#cddc3afc5ff1685a8023488fff74ce6fb5a51296" dependencies: @@ -1316,6 +1348,24 @@ broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.2, broccoli symlink-or-copy "^1.0.0" walk-sync "^0.3.1" +broccoli-funnel@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-2.0.1.tgz#6823c73b675ef78fffa7ab800f083e768b51d449" + dependencies: + array-equal "^1.0.0" + blank-object "^1.0.1" + broccoli-plugin "^1.3.0" + debug "^2.2.0" + fast-ordered-set "^1.0.0" + fs-tree-diff "^0.5.3" + heimdalljs "^0.2.0" + minimatch "^3.0.0" + mkdirp "^0.5.0" + path-posix "^1.0.0" + rimraf "^2.4.3" + symlink-or-copy "^1.0.0" + walk-sync "^0.3.1" + broccoli-kitchen-sink-helpers@^0.2.5, broccoli-kitchen-sink-helpers@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz#a5e0986ed8d76fb5984b68c3f0450d3a96e36ecc" @@ -1330,14 +1380,14 @@ broccoli-kitchen-sink-helpers@^0.3.1: glob "^5.0.10" mkdirp "^0.5.1" -broccoli-lint-eslint@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/broccoli-lint-eslint/-/broccoli-lint-eslint-3.3.1.tgz#35c675546a5a7ad8f3319edd732e3aad8ca241de" +broccoli-lint-eslint@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/broccoli-lint-eslint/-/broccoli-lint-eslint-4.1.0.tgz#dccfa1150dc62407cd66fd56a619273c5479a10e" dependencies: aot-test-generators "^0.1.0" broccoli-concat "^3.2.2" broccoli-persistent-filter "^1.2.0" - eslint "^3.0.0" + eslint "^4.0.0" json-stable-stringify "^1.0.1" lodash.defaultsdeep "^4.6.0" md5-hex "^2.0.0" @@ -1370,13 +1420,12 @@ broccoli-middleware@^1.0.0: mime "^1.2.11" broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.2.0, broccoli-persistent-filter@^1.4.0, broccoli-persistent-filter@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.2.tgz#17af1278a25ff2556f9d7d23e115accfad3a7ce7" + version "1.4.3" + resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.3.tgz#3511bc52fc53740cda51621f58a28152d9911bc1" dependencies: async-disk-cache "^1.2.1" async-promise-queue "^1.0.3" broccoli-plugin "^1.0.0" - crypto "0.0.3" fs-tree-diff "^0.5.2" hash-for-dep "^1.0.2" heimdalljs "^0.2.1" @@ -1452,23 +1501,25 @@ broccoli-string-replace@^0.1.1: broccoli-persistent-filter "^1.1.5" minimatch "^3.0.3" -broccoli-uglify-sourcemap@^1.0.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/broccoli-uglify-sourcemap/-/broccoli-uglify-sourcemap-1.5.2.tgz#04f84ab0db539031fa868ccfa563c9932d50cedb" +broccoli-uglify-sourcemap@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/broccoli-uglify-sourcemap/-/broccoli-uglify-sourcemap-2.0.0.tgz#2dc574e9d330c2e0dcc834b3d24c794b405a3803" dependencies: broccoli-plugin "^1.2.1" - debug "^2.2.0" - lodash.merge "^4.5.1" - matcher-collection "^1.0.0" + debug "^3.1.0" + lodash.defaultsdeep "^4.6.0" + matcher-collection "^1.0.5" mkdirp "^0.5.0" - source-map-url "^0.3.0" + source-map-url "^0.4.0" symlink-or-copy "^1.0.1" - uglify-js "^2.7.0" - walk-sync "^0.1.3" + uglify-es "^3.1.3" + walk-sync "^0.3.2" broccoli-unwatched-tree@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/broccoli-unwatched-tree/-/broccoli-unwatched-tree-0.1.1.tgz#4312fde04bdafe67a05a967d72cc50b184a9f514" + version "0.1.3" + resolved "https://registry.yarnpkg.com/broccoli-unwatched-tree/-/broccoli-unwatched-tree-0.1.3.tgz#ab0fb820f613845bf67a803baad820f68b1e3aae" + dependencies: + broccoli-source "^1.1.0" broccoli-writer@~0.1.1: version "0.1.1" @@ -1482,11 +1533,11 @@ browser-stdout@1.3.0: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" browserslist@^2.1.2: - version "2.1.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.1.5.tgz#e882550df3d1cd6d481c1a3e0038f2baf13a4711" + version "2.5.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.5.1.tgz#68e4bc536bbcc6086d62843a2ffccea8396821c6" dependencies: - caniuse-lite "^1.0.30000684" - electron-to-chromium "^1.3.14" + caniuse-lite "^1.0.30000744" + electron-to-chromium "^1.3.24" bser@^2.0.0: version "2.0.0" @@ -1502,9 +1553,9 @@ bytes@1: version "1.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8" -bytes@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.3.0.tgz#d5b680a165b6201739acb611542aabc2d8ceb070" +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" calculate-cache-key-for-tree@^1.0.0: version "1.1.0" @@ -1536,9 +1587,9 @@ can-symlink@^1.0.0: dependencies: tmp "0.0.28" -caniuse-lite@^1.0.30000684: - version "1.0.30000697" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000697.tgz#125fb00604b63fbb188db96a667ce2922dcd6cdd" +caniuse-lite@^1.0.30000744: + version "1.0.30000746" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000746.tgz#c64f95a3925cfd30207a308ed76c1ae96ea09ea0" capture-exit@^1.1.0: version "1.2.0" @@ -1565,12 +1616,12 @@ center-align@^0.1.1: lazy-cache "^1.0.3" chai@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.0.tgz#331a0391b55c3af8740ae9c3b7458bc1c3805e6d" + version "4.1.2" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" dependencies: assertion-error "^1.0.1" check-error "^1.0.1" - deep-eql "^2.0.1" + deep-eql "^3.0.0" get-func-name "^2.0.0" pathval "^1.0.0" type-detect "^4.0.0" @@ -1585,7 +1636,7 @@ chalk@^0.5.1: strip-ansi "^0.3.0" supports-color "^0.2.0" -chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: @@ -1595,6 +1646,14 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + charm@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/charm/-/charm-1.0.2.tgz#8add367153a6d9a581331052c4090991da995e35" @@ -1621,8 +1680,8 @@ chokidar@1.6.1: fsevents "^1.0.0" circular-json@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" clean-base-url@^1.0.0: version "1.0.0" @@ -1637,21 +1696,21 @@ clean-css-promise@^0.1.0: pinkie-promise "^2.0.0" clean-css@^3.4.5: - version "3.4.27" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.4.27.tgz#adef75b31c160ffa5d72f4de67966e2660c1a255" + version "3.4.28" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.4.28.tgz#bf1945e82fc808f55695e6ddeaec01400efd03ff" dependencies: commander "2.8.x" source-map "0.4.x" -cli-cursor@^1.0.1, cli-cursor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" dependencies: - restore-cursor "^1.0.1" + restore-cursor "^2.0.0" -cli-spinners@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" +cli-spinners@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.1.0.tgz#f1847b168844d917a671eb9d147e3df497c90d06" cli-table2@^0.2.0: version "0.2.0" @@ -1669,8 +1728,8 @@ cli-table@^0.3.1: colors "1.0.3" cli-width@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" cliui@^2.1.0: version "2.1.0" @@ -1696,15 +1755,15 @@ code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" -color-convert@^1.0.0: +color-convert@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" dependencies: color-name "^1.1.1" color-name@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.2.tgz#5c8ab72b64bd2215d617ae9559ebb148475cf98d" + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" colors@1.0.3: version "1.0.3" @@ -1726,12 +1785,16 @@ commander@2.8.x: dependencies: graceful-readlink ">= 1.0.0" -commander@2.9.0, commander@^2.5.0, commander@^2.6.0: +commander@2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" dependencies: graceful-readlink ">= 1.0.0" +commander@^2.5.0, commander@^2.6.0, commander@~2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + commoner@~0.10.3: version "0.10.8" resolved "https://registry.yarnpkg.com/commoner/-/commoner-0.10.8.tgz#34fc3672cd24393e8bb47e70caa0293811f4f2c5" @@ -1762,28 +1825,29 @@ component-inherit@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" -compressible@~2.0.8: - version "2.0.10" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.10.tgz#feda1c7f7617912732b29bf8cf26252a20b9eecd" +compressible@~2.0.11: + version "2.0.11" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.11.tgz#16718a75de283ed8e604041625a2064586797d8a" dependencies: - mime-db ">= 1.27.0 < 2" + mime-db ">= 1.29.0 < 2" compression@^1.4.4: - version "1.6.2" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.6.2.tgz#cceb121ecc9d09c52d7ad0c3350ea93ddd402bc3" + version "1.7.1" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.1.tgz#eff2603efc2e22cf86f35d2eb93589f9875373db" dependencies: - accepts "~1.3.3" - bytes "2.3.0" - compressible "~2.0.8" - debug "~2.2.0" + accepts "~1.3.4" + bytes "3.0.0" + compressible "~2.0.11" + debug "2.6.9" on-headers "~1.0.1" - vary "~1.1.0" + safe-buffer "5.1.1" + vary "~1.1.2" concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@^1.4.7, concat-stream@^1.5.2: +concat-stream@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" dependencies: @@ -1792,8 +1856,8 @@ concat-stream@^1.4.7, concat-stream@^1.5.2: typedarray "^0.0.6" configstore@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.0.tgz#45df907073e26dfa1cf4b2d52f5b60545eaa11d1" + version "3.1.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" dependencies: dot-prop "^4.1.0" graceful-fs "^4.1.2" @@ -1806,13 +1870,13 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" -console-ui@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/console-ui/-/console-ui-1.0.3.tgz#31c524461b63422769f9e89c173495d91393721c" +console-ui@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/console-ui/-/console-ui-2.0.0.tgz#159ef7d098a491f84705bb69cd63ecec9a367b14" dependencies: - chalk "^1.1.3" - inquirer "^1.2.3" - ora "^0.2.0" + chalk "^2.1.0" + inquirer "^3.2.1" + ora "^1.3.0" through "^2.3.8" consolidate@^0.14.0: @@ -1829,15 +1893,15 @@ content-type-parser@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.1.tgz#c3e56988c53c65127fb46d4032a3a900246fdc94" -content-type@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" continuable-cache@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f" -convert-source-map@^1.1.0: +convert-source-map@^1.1.0, convert-source-map@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" @@ -1857,9 +1921,9 @@ core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" -core-js@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" +core-js@^2.4.0, core-js@^2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" core-object@^1.1.0: version "1.1.0" @@ -1872,18 +1936,18 @@ core-object@^2.0.6: chalk "^1.1.3" core-object@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/core-object/-/core-object-3.1.3.tgz#df399b3311bdb0c909e8aae8929fc3c1c4b25880" + version "3.1.5" + resolved "https://registry.yarnpkg.com/core-object/-/core-object-3.1.5.tgz#fa627b87502adc98045e44678e9a8ec3b9c0d2a9" dependencies: - chalk "^1.1.3" + chalk "^2.0.0" -core-util-is@~1.0.0: +core-util-is@1.0.2, 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" cpr@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cpr/-/cpr-2.1.0.tgz#a1b7baaa111cfbe55260772100a0296ec9d4a29d" + version "2.2.0" + resolved "https://registry.yarnpkg.com/cpr/-/cpr-2.2.0.tgz#2dc6c87dfb78012489cdd994227628c320e9a17b" dependencies: graceful-fs "^4.1.5" minimist "^1.2.0" @@ -1904,14 +1968,16 @@ cryptiles@2.x.x: dependencies: boom "2.x.x" +cryptiles@3.x.x: + version "3.1.2" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" + dependencies: + boom "5.x.x" + crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" -crypto@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/crypto/-/crypto-0.0.3.tgz#470a81b86be4c5ee17acc8207a1f5315ae20dbb0" - cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": version "0.3.2" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" @@ -1922,12 +1988,6 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": dependencies: cssom "0.3.x" -d@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" - dependencies: - es5-ext "^0.10.9" - dag-map@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/dag-map/-/dag-map-2.0.2.tgz#9714b472de82a1843de2fba9b6876938cab44c68" @@ -1938,7 +1998,7 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -debug@2.2.0, debug@~2.2.0: +debug@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" dependencies: @@ -1950,21 +2010,21 @@ debug@2.3.3: dependencies: ms "0.7.2" -debug@2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" +debug@2.6.8: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" dependencies: - ms "0.7.2" + ms "2.0.0" -debug@2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e" +debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.4.0, debug@^2.6.8, debug@~2.6.7: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: ms "2.0.0" -debug@2.6.8, debug@^2.1.0, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.4.0, debug@~2.6.7: - version "2.6.8" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" +debug@^3.0.1, debug@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" dependencies: ms "2.0.0" @@ -1972,11 +2032,11 @@ decamelize@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" -deep-eql@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-2.0.2.tgz#b1bac06e56f0a76777686d50c9feb75c2ed7679a" +deep-eql@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" dependencies: - type-detect "^3.0.0" + type-detect "^4.0.0" deep-extend@~0.4.0: version "0.4.2" @@ -2025,9 +2085,9 @@ delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" -depd@1.1.0, depd@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" +depd@1.1.1, depd@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" destroy@~1.0.4: version "1.0.4" @@ -2060,10 +2120,14 @@ detective@^4.3.1: acorn "^4.0.3" defined "^1.0.0" -diff@3.2.0, diff@^3.2.0: +diff@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" +diff@^3.2.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" + doctrine@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" @@ -2072,8 +2136,8 @@ doctrine@^2.0.0: isarray "^1.0.0" dot-prop@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.1.1.tgz#a8493f0b7b5eeec82525b5c7587fa7de7ca859c1" + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" dependencies: is-obj "^1.0.0" @@ -2091,9 +2155,9 @@ ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" -electron-to-chromium@^1.3.14: - version "1.3.15" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.15.tgz#08397934891cbcfaebbd18b82a95b5a481138369" +electron-to-chromium@^1.3.24: + version "1.3.26" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.26.tgz#996427294861a74d9c7c82b9260ea301e8c02d66" ember-ajax@^3.0.0: version "3.0.0" @@ -2102,10 +2166,10 @@ ember-ajax@^3.0.0: ember-cli-babel "^6.0.0" ember-cli-addon-tests@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/ember-cli-addon-tests/-/ember-cli-addon-tests-0.7.0.tgz#c7ad8f839f22ad1b3c22a4b993df6c0f691324ef" + version "0.7.1" + resolved "https://registry.yarnpkg.com/ember-cli-addon-tests/-/ember-cli-addon-tests-0.7.1.tgz#6959c4cce1a9d16a4852465e2b2bed4bf26b46ec" dependencies: - chalk "^1.1.3" + chalk "^2.0.1" cpr "^2.0.0" debug "^2.2.0" exists-sync "0.0.4" @@ -2120,29 +2184,13 @@ ember-cli-addon-tests@^0.7.0: temp "^0.8.3" ember-cli-app-version@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ember-cli-app-version/-/ember-cli-app-version-2.0.2.tgz#aaeede608e92fae6c2e11f63d28a373c1cc3f070" + version "2.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-app-version/-/ember-cli-app-version-2.1.0.tgz#149101d4fd0d97875e12ec5e61ff105f508e5e2d" dependencies: - ember-cli-babel "^5.1.6" - ember-cli-htmlbars "^1.0.0" + ember-cli-babel "^6.8.0" git-repo-version "0.4.1" -ember-cli-babel@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.1.0.tgz#d9c83a7d0c67cc8a3ccb9bd082971c3593e54fad" - dependencies: - amd-name-resolver "0.0.6" - babel-plugin-debug-macros "^0.1.6" - babel-plugin-transform-es2015-modules-amd "^6.24.0" - babel-polyfill "^6.16.0" - babel-preset-env "^1.2.0" - broccoli-babel-transpiler "^6.0.0" - broccoli-funnel "^1.0.0" - broccoli-source "^1.1.0" - clone "^2.0.0" - ember-cli-version-checker "^1.2.0" - -ember-cli-babel@^5.1.6, ember-cli-babel@^5.1.7: +ember-cli-babel@^5.1.6: version "5.2.4" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-5.2.4.tgz#5ce4f46b08ed6f6d21e878619fb689719d6e8e13" dependencies: @@ -2152,24 +2200,7 @@ ember-cli-babel@^5.1.6, ember-cli-babel@^5.1.7: ember-cli-version-checker "^1.0.2" resolve "^1.1.2" -ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.6.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.6.0.tgz#a8362bc44841bfdf89b389f3197f104d7ba526da" - dependencies: - amd-name-resolver "0.0.6" - babel-plugin-debug-macros "^0.1.11" - babel-plugin-ember-modules-api-polyfill "^1.4.1" - babel-plugin-transform-es2015-modules-amd "^6.24.0" - babel-polyfill "^6.16.0" - babel-preset-env "^1.5.1" - broccoli-babel-transpiler "^6.0.0" - broccoli-debug "^0.6.2" - broccoli-funnel "^1.0.0" - broccoli-source "^1.1.0" - clone "^2.0.0" - ember-cli-version-checker "^2.0.0" - -ember-cli-babel@^6.8.1: +ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.3.0, ember-cli-babel@^6.4.1, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2: version "6.8.2" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.8.2.tgz#eac2785964f4743f4c815cd53c6288f00cc087d7" dependencies: @@ -2196,21 +2227,21 @@ ember-cli-broccoli-sane-watcher@^2.0.4: rsvp "^3.0.18" sane "^1.1.1" -ember-cli-dependency-checker@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-1.4.0.tgz#2b13f977e1eea843fc1a21a001be6ca5d4ef1942" +ember-cli-dependency-checker@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-2.0.1.tgz#e44cd2f8cdbf6a1043092de1ebfd62e7b8c00dd1" dependencies: - chalk "^0.5.1" - is-git-url "^0.2.0" - semver "^4.1.0" + chalk "^1.1.3" + is-git-url "^1.0.0" + semver "^5.3.0" -ember-cli-eslint@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ember-cli-eslint/-/ember-cli-eslint-3.1.0.tgz#8d9e2a867654835ac1b24858d9117e143fa54bd4" +ember-cli-eslint@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ember-cli-eslint/-/ember-cli-eslint-4.2.1.tgz#1718875632b3c10fa0da2f665d294c08f24b8ca3" dependencies: - broccoli-lint-eslint "^3.3.0" - ember-cli-version-checker "^1.3.1" - rsvp "^3.2.1" + broccoli-lint-eslint "^4.1.0" + ember-cli-version-checker "^2.1.0" + rsvp "^4.6.1" walk-sync "^0.3.0" ember-cli-get-component-path-option@^1.0.0: @@ -2221,28 +2252,19 @@ ember-cli-get-dependency-depth@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-get-dependency-depth/-/ember-cli-get-dependency-depth-1.0.0.tgz#e0afecf82a2d52f00f28ab468295281aec368d11" -ember-cli-htmlbars-inline-precompile@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-0.4.3.tgz#4123f507fea6c59ba4c272ef7e713a6d55ba06c9" +ember-cli-htmlbars-inline-precompile@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-1.0.2.tgz#5b544f664d5d9911f08cd979c5f70d8cb0ca2add" dependencies: babel-plugin-htmlbars-inline-precompile "^0.2.3" ember-cli-version-checker "^2.0.0" hash-for-dep "^1.0.2" + heimdalljs-logger "^0.1.7" silent-error "^1.1.0" -ember-cli-htmlbars@^1.0.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-1.3.3.tgz#06815262c1577736235bd42ce99db559ce5ebfd1" - dependencies: - broccoli-persistent-filter "^1.0.3" - ember-cli-version-checker "^1.0.2" - hash-for-dep "^1.0.2" - json-stable-stringify "^1.0.0" - strip-bom "^2.0.0" - -ember-cli-htmlbars@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.3.tgz#e116e1500dba12f29c94b05b9ec90f52cb8bb042" +ember-cli-htmlbars@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.3.tgz#e116e1500dba12f29c94b05b9ec90f52cb8bb042" dependencies: broccoli-persistent-filter "^1.0.3" hash-for-dep "^1.0.2" @@ -2250,8 +2272,8 @@ ember-cli-htmlbars@^2.0.1: strip-bom "^3.0.0" ember-cli-inject-live-reload@^1.4.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-1.6.1.tgz#82b8f5be454815a75e7f6d42c9ce0bc883a914a3" + version "1.7.0" + resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-1.7.0.tgz#af94336e015336127dfb98080ad442bb233e37ed" ember-cli-is-package-missing@^1.0.0: version "1.0.0" @@ -2279,10 +2301,14 @@ ember-cli-legacy-blueprints@^0.1.2: rsvp "^3.0.17" silent-error "^1.0.0" -ember-cli-lodash-subset@^1.0.11, ember-cli-lodash-subset@^1.0.7: +ember-cli-lodash-subset@^1.0.7: version "1.0.12" resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-1.0.12.tgz#af2e77eba5dcb0d77f3308d3a6fd7d3450f6e537" +ember-cli-lodash-subset@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-2.0.1.tgz#20cb68a790fe0fde2488ddfd8efbb7df6fe766f2" + ember-cli-node-assets@^0.1.1, ember-cli-node-assets@^0.1.4: version "0.1.6" resolved "https://registry.yarnpkg.com/ember-cli-node-assets/-/ember-cli-node-assets-0.1.6.tgz#6488a2949048c801ad6d9e33753c7bce32fc1146" @@ -2318,19 +2344,19 @@ ember-cli-preprocess-registry@^3.1.0: silent-error "^1.0.0" ember-cli-qunit@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/ember-cli-qunit/-/ember-cli-qunit-4.0.0.tgz#1f0022469a5bd64f627b8102880a25e94e533a3b" + version "4.0.1" + resolved "https://registry.yarnpkg.com/ember-cli-qunit/-/ember-cli-qunit-4.0.1.tgz#905aa07620ae9fdb417c7e48d45bd2277b62f864" dependencies: - broccoli-funnel "^1.0.1" + broccoli-funnel "^2.0.0" broccoli-merge-trees "^2.0.0" - ember-cli-babel "^6.0.0-beta.7" - ember-cli-test-loader "^2.0.0" - ember-cli-version-checker "^1.1.4" - ember-qunit "^2.1.3" + ember-cli-babel "^6.8.1" + ember-cli-test-loader "^2.2.0" + ember-cli-version-checker "^2.0.0" + ember-qunit "^2.2.0" qunit-notifications "^0.1.1" - qunitjs "^2.0.1" - resolve "^1.1.6" - silent-error "^1.0.0" + qunitjs "^2.4.0" + resolve "^1.4.0" + silent-error "^1.1.0" ember-cli-release@^0.2.9: version "0.2.9" @@ -2370,17 +2396,18 @@ ember-cli-test-info@^1.0.0: dependencies: ember-cli-string-utils "^1.0.0" -ember-cli-test-loader@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ember-cli-test-loader/-/ember-cli-test-loader-2.1.0.tgz#16163bae0ac32cad1af13c4ed94c6c698b54d431" +ember-cli-test-loader@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ember-cli-test-loader/-/ember-cli-test-loader-2.2.0.tgz#3fb8d5d1357e4460d3f0a092f5375e71b6f7c243" dependencies: - ember-cli-babel "^6.0.0-beta.7" + ember-cli-babel "^6.8.1" -ember-cli-uglify@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ember-cli-uglify/-/ember-cli-uglify-1.2.0.tgz#3208c32b54bc2783056e8bb0d5cfe9bbaf17ffb2" +ember-cli-uglify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-uglify/-/ember-cli-uglify-2.0.0.tgz#b096727d7d1718acc9bfe5d1bc81ce26cafdf6ca" dependencies: - broccoli-uglify-sourcemap "^1.0.0" + broccoli-uglify-sourcemap "^2.0.0" + lodash.defaultsdeep "^4.6.0" ember-cli-valid-component-name@^1.0.0: version "1.0.0" @@ -2394,18 +2421,18 @@ ember-cli-version-checker@^1.0.2, ember-cli-version-checker@^1.1.4, ember-cli-ve dependencies: semver "^5.3.0" -ember-cli-version-checker@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.0.0.tgz#e1f7d8e4cdcd752ac35f1611e4daa8836db4c4c7" +ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.1.0.tgz#fc79a56032f3717cf844ada7cbdec1a06fedb604" dependencies: resolve "^1.3.3" semver "^5.3.0" -ember-cli@~2.14.0: - version "2.14.2" - resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-2.14.2.tgz#f2c8c75d486ce6cc6b7ffbc22ebef8b32bb242b7" +ember-cli@~2.16.2: + version "2.16.2" + resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-2.16.2.tgz#53b922073a8e6f34255a6e0dcb1794a91ba3e1b7" dependencies: - amd-name-resolver "0.0.6" + amd-name-resolver "1.0.0" babel-plugin-transform-es2015-modules-amd "^6.24.0" bower-config "^1.3.0" bower-endpoint-parser "0.2.2" @@ -2415,7 +2442,8 @@ ember-cli@~2.14.0: broccoli-concat "^3.2.2" broccoli-config-loader "^1.0.0" broccoli-config-replace "^1.1.2" - broccoli-funnel "^1.0.6" + broccoli-debug "^0.6.3" + broccoli-funnel "^2.0.0" broccoli-funnel-reducer "^1.0.0" broccoli-merge-trees "^2.0.0" broccoli-middleware "^1.0.0" @@ -2423,32 +2451,30 @@ ember-cli@~2.14.0: broccoli-stew "^1.2.0" calculate-cache-key-for-tree "^1.0.0" capture-exit "^1.1.0" - chalk "^1.1.3" + chalk "^2.0.1" clean-base-url "^1.0.0" compression "^1.4.4" configstore "^3.0.0" - console-ui "^1.0.2" + console-ui "^2.0.0" core-object "^3.1.3" dag-map "^2.0.2" diff "^3.2.0" ember-cli-broccoli-sane-watcher "^2.0.4" - ember-cli-get-component-path-option "^1.0.0" ember-cli-is-package-missing "^1.0.0" ember-cli-legacy-blueprints "^0.1.2" - ember-cli-lodash-subset "^1.0.11" + ember-cli-lodash-subset "^2.0.1" ember-cli-normalize-entity-name "^1.0.0" ember-cli-preprocess-registry "^3.1.0" ember-cli-string-utils "^1.0.0" ember-try "^0.2.15" ensure-posix-path "^1.0.2" - escape-string-regexp "^1.0.3" - execa "^0.6.0" + execa "^0.8.0" exists-sync "0.0.4" exit "^0.1.2" express "^4.12.3" filesize "^3.1.3" find-up "^2.1.0" - fs-extra "^3.0.0" + fs-extra "^4.0.0" fs-tree-diff "^0.5.2" get-caller-file "^1.0.0" git-repo-info "^1.4.1" @@ -2459,7 +2485,7 @@ ember-cli@~2.14.0: heimdalljs-logger "^0.1.7" http-proxy "^1.9.0" inflection "^1.7.0" - is-git-url "^0.2.0" + is-git-url "^1.0.0" isbinaryfile "^3.0.0" js-yaml "^3.6.1" json-stable-stringify "^1.0.1" @@ -2476,14 +2502,14 @@ ember-cli@~2.14.0: promise-map-series "^0.2.1" quick-temp "^0.1.8" resolve "^1.3.0" - rsvp "^3.3.3" + rsvp "^3.6.0" sane "^1.6.0" semver "^5.1.1" silent-error "^1.0.0" sort-package-json "^1.4.0" symlink-or-copy "^1.1.8" temp "0.8.3" - testem "^1.15.0" + testem "^1.18.0" tiny-lr "^1.0.3" tree-sync "^1.2.1" uuid "^3.0.0" @@ -2491,26 +2517,26 @@ ember-cli@~2.14.0: walk-sync "^0.3.0" yam "0.0.22" -ember-data@~2.11.0: - version "2.11.3" - resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-2.11.3.tgz#46ba0e8411dce6dbb52cc02a29194f265b747ef9" +ember-data@~2.13.0: + version "2.13.2" + resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-2.13.2.tgz#151c93ad5152885d4ca50b1942d7c66e15865c74" dependencies: amd-name-resolver "0.0.5" - babel-plugin-feature-flags "^0.2.1" - babel-plugin-filter-imports "^0.2.0" - babel5-plugin-strip-class-callcheck "^5.1.0" - babel5-plugin-strip-heimdall "^5.0.2" - broccoli-babel-transpiler "^5.5.0" + babel-plugin-feature-flags "^0.3.1" + babel-plugin-filter-imports "^0.3.1" + babel6-plugin-strip-class-callcheck "^6.0.0" + babel6-plugin-strip-heimdall "^6.0.1" + broccoli-babel-transpiler "^6.0.0" broccoli-file-creator "^1.0.0" broccoli-merge-trees "^1.0.0" chalk "^1.1.1" - ember-cli-babel "^5.1.6" + ember-cli-babel "^6.0.0-beta.7" ember-cli-path-utils "^1.0.0" ember-cli-string-utils "^1.0.0" ember-cli-test-info "^1.0.0" ember-cli-version-checker "^1.1.4" - ember-inflector "^1.9.4" - ember-runtime-enumerable-includes-polyfill "^1.0.0" + ember-inflector "^2.0.0" + ember-runtime-enumerable-includes-polyfill "^2.0.0" exists-sync "0.0.3" git-repo-info "^1.1.2" heimdalljs "^0.3.0" @@ -2547,17 +2573,11 @@ ember-fastboot-addon-tests@^0.4.0: rsvp "^3.3.1" ember-get-config@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.2.2.tgz#54d96fae87bcd75a3dd710113ed1db3afbe4fe9d" + version "0.2.3" + resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.2.3.tgz#546e77c991792fffde2f6757a5edb0c5dd122c0e" dependencies: broccoli-file-creator "^1.1.1" - ember-cli-babel "^5.1.6" - -ember-inflector@^1.9.4: - version "1.12.1" - resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-1.12.1.tgz#d8bd2ca2f327b439720f89923fe614d46b5da1ca" - dependencies: - ember-cli-babel "^5.1.7" + ember-cli-babel "^6.3.0" ember-inflector@^2.0.0: version "2.0.1" @@ -2572,19 +2592,19 @@ ember-load-initializers@^1.0.0: ember-cli-babel "^6.0.0-beta.7" ember-lodash@^4.17.3: - version "4.17.4" - resolved "https://registry.yarnpkg.com/ember-lodash/-/ember-lodash-4.17.4.tgz#62a76e322e140281c31406b6dd5a11cf318c452d" + version "4.17.5" + resolved "https://registry.yarnpkg.com/ember-lodash/-/ember-lodash-4.17.5.tgz#bda557402facae144567d1ef530b3de7c38bcde1" dependencies: broccoli-debug "^0.6.1" broccoli-funnel "^1.1.0" broccoli-merge-trees "^2.0.0" broccoli-string-replace "^0.1.1" - ember-cli-babel "6.1.0" + ember-cli-babel "^6.4.1" lodash-es "^4.17.4" -ember-qunit@^2.1.3: - version "2.1.4" - resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-2.1.4.tgz#5732794e668f753d8fe1a353692ffeda73742d29" +ember-qunit@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-2.2.0.tgz#3cdf400031c93a38de781a7304819738753b7f99" dependencies: ember-test-helpers "^0.6.3" @@ -2600,25 +2620,21 @@ ember-resolver@^4.0.0: ember-cli-version-checker "^2.0.0" resolve "^1.3.3" -ember-rfc176-data@^0.2.0: - version "0.2.4" - resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.2.4.tgz#f6c5e52ffb14cf66c9fed5bd70fbe68fc91982e9" - -ember-rfc176-data@^0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.2.7.tgz#bd355bc9b473e08096b518784170a23388bc973b" +ember-rfc176-data@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.0.tgz#6aee728cb521c5f80710990965027b9c320f6f08" -ember-router-generator@^1.0.0, ember-router-generator@^1.2.2: +ember-router-generator@^1.0.0, ember-router-generator@^1.2.2, ember-router-generator@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-1.2.3.tgz#8ed2ca86ff323363120fc14278191e9e8f1315ee" dependencies: recast "^0.11.3" -ember-runtime-enumerable-includes-polyfill@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/ember-runtime-enumerable-includes-polyfill/-/ember-runtime-enumerable-includes-polyfill-1.0.4.tgz#16a7612e347a2edf07da8b2f2f09dbfee70deba0" +ember-runtime-enumerable-includes-polyfill@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ember-runtime-enumerable-includes-polyfill/-/ember-runtime-enumerable-includes-polyfill-2.0.0.tgz#6e9ba118bc909d1d7762de1b03a550d8955308a9" dependencies: - ember-cli-babel "^5.1.6" + ember-cli-babel "^6.0.0" ember-cli-version-checker "^1.1.6" ember-sinon@0.5.1: @@ -2629,28 +2645,29 @@ ember-sinon@0.5.1: ember-cli-node-assets "^0.1.1" sinon "^1.17.4" -ember-source@~2.14.0: - version "2.14.1" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-2.14.1.tgz#4abf0b4c916f2da8bf317349df4750905df7e628" +ember-source@~2.16.0: + version "2.16.0" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-2.16.0.tgz#2becd7966278fe453046b91178ede665c2cf241a" dependencies: - "@glimmer/compiler" "^0.22.3" - "@glimmer/node" "^0.22.3" - "@glimmer/reference" "^0.22.3" - "@glimmer/runtime" "^0.22.3" - "@glimmer/util" "^0.22.3" + "@glimmer/compiler" "^0.25.3" + "@glimmer/node" "^0.25.3" + "@glimmer/reference" "^0.25.3" + "@glimmer/runtime" "^0.25.3" broccoli-funnel "^1.2.0" broccoli-merge-trees "^2.0.0" ember-cli-get-component-path-option "^1.0.0" + ember-cli-is-package-missing "^1.0.0" ember-cli-normalize-entity-name "^1.0.0" ember-cli-path-utils "^1.0.0" ember-cli-string-utils "^1.1.0" ember-cli-test-info "^1.0.0" ember-cli-valid-component-name "^1.0.0" ember-cli-version-checker "^1.3.1" - handlebars "^4.0.6" + ember-router-generator "^1.2.3" + inflection "^1.12.0" jquery "^3.2.1" resolve "^1.3.3" - rsvp "^3.5.0" + rsvp "^3.6.1" simple-dom "^0.3.0" simple-html-tokenizer "^0.4.1" @@ -2668,8 +2685,8 @@ ember-try-config@^2.0.1: semver "^5.1.0" ember-try@^0.2.15: - version "0.2.15" - resolved "https://registry.yarnpkg.com/ember-try/-/ember-try-0.2.15.tgz#559c756058717595babe70068e541625bd5e210a" + version "0.2.17" + resolved "https://registry.yarnpkg.com/ember-try/-/ember-try-0.2.17.tgz#0ffff687630291b4cf94f5b196e728c1a92d8aec" dependencies: chalk "^1.0.0" cli-table2 "^0.2.0" @@ -2749,85 +2766,24 @@ error@^7.0.0: string-template "~0.2.1" xtend "~4.0.0" -es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.23" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.23.tgz#7578b51be974207a5487821b56538c224e4e7b38" - dependencies: - es6-iterator "2" - es6-symbol "~3.1" - -es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512" - dependencies: - d "1" - es5-ext "^0.10.14" - es6-symbol "^3.1" - -es6-map@^0.1.3: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-set "~0.1.5" - es6-symbol "~3.1.1" - event-emitter "~0.3.5" - -es6-set@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-symbol "3.1.1" - event-emitter "~0.3.5" - -es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" - dependencies: - d "1" - es5-ext "~0.10.14" - -es6-weak-map@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" - dependencies: - d "1" - es5-ext "^0.10.14" - es6-iterator "^2.0.1" - es6-symbol "^3.1.1" - escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5: +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" escodegen@^1.6.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + version "1.9.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852" dependencies: - esprima "^2.7.1" - estraverse "^1.9.1" + esprima "^3.1.3" + estraverse "^4.2.0" esutils "^2.0.2" optionator "^0.8.1" optionalDependencies: - source-map "~0.2.0" - -escope@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" - dependencies: - es6-map "^0.1.3" - es6-weak-map "^2.0.1" - esrecurse "^4.1.0" - estraverse "^4.1.1" + source-map "~0.5.6" eslint-plugin-ember-suave@^1.0.0: version "1.0.0" @@ -2835,61 +2791,74 @@ eslint-plugin-ember-suave@^1.0.0: dependencies: requireindex "~1.1.0" -eslint@^3.0.0: - version "3.19.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc" +eslint-scope@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" dependencies: - babel-code-frame "^6.16.0" - chalk "^1.1.3" - concat-stream "^1.5.2" - debug "^2.1.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint@^4.0.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.9.0.tgz#76879d274068261b191fe0f2f56c74c2f4208e8b" + dependencies: + ajv "^5.2.0" + babel-code-frame "^6.22.0" + chalk "^2.1.0" + concat-stream "^1.6.0" + cross-spawn "^5.1.0" + debug "^3.0.1" doctrine "^2.0.0" - escope "^3.6.0" - espree "^3.4.0" + eslint-scope "^3.7.1" + espree "^3.5.1" esquery "^1.0.0" estraverse "^4.2.0" esutils "^2.0.2" file-entry-cache "^2.0.0" - glob "^7.0.3" - globals "^9.14.0" - ignore "^3.2.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^9.17.0" + ignore "^3.3.3" imurmurhash "^0.1.4" - inquirer "^0.12.0" - is-my-json-valid "^2.10.0" + inquirer "^3.0.6" is-resolvable "^1.0.0" - js-yaml "^3.5.1" - json-stable-stringify "^1.0.0" + js-yaml "^3.9.1" + json-stable-stringify "^1.0.1" levn "^0.3.0" - lodash "^4.0.0" - mkdirp "^0.5.0" + lodash "^4.17.4" + minimatch "^3.0.2" + mkdirp "^0.5.1" natural-compare "^1.4.0" optionator "^0.8.2" - path-is-inside "^1.0.1" - pluralize "^1.2.1" - progress "^1.1.8" - require-uncached "^1.0.2" - shelljs "^0.7.5" - strip-bom "^3.0.0" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + require-uncached "^1.0.3" + semver "^5.3.0" + strip-ansi "^4.0.0" strip-json-comments "~2.0.1" - table "^3.7.8" + table "^4.0.1" text-table "~0.2.0" - user-home "^2.0.0" -espree@^3.4.0: - version "3.4.3" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.3.tgz#2910b5ccd49ce893c2ffffaab4fd8b3a31b82374" +espree@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.1.tgz#0c988b8ab46db53100a1954ae4ba995ddd27d87e" dependencies: - acorn "^5.0.1" + acorn "^5.1.1" acorn-jsx "^3.0.0" esprima-fb@~15001.1001.0-dev-harmony-fb: version "15001.1001.0-dev-harmony-fb" resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz#43beb57ec26e8cf237d3dd8b33e42533577f2659" -esprima@^2.6.0, esprima@^2.7.1: +esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" +esprima@^3.1.3, esprima@~3.1.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + esprima@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" @@ -2898,10 +2867,6 @@ esprima@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.0.0.tgz#53cf247acda77313e551c3aa2e73342d3fb4f7d9" -esprima@~3.1.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - esquery@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" @@ -2915,10 +2880,6 @@ esrecurse@^4.1.0: estraverse "^4.1.0" object-assign "^4.0.1" -estraverse@^1.9.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" - estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" @@ -2927,16 +2888,9 @@ esutils@^2.0.0, esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" -etag@~1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051" - -event-emitter@~0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - dependencies: - d "1" - es5-ext "~0.10.14" +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" eventemitter3@1.x.x: version "1.2.0" @@ -2947,14 +2901,14 @@ events-to-array@^1.0.1: resolved "https://registry.yarnpkg.com/events-to-array/-/events-to-array-1.1.2.tgz#2d41f563e1fe400ed4962fe1a4d5c6a7539df7f6" exec-sh@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.0.tgz#14f75de3f20d286ef933099b2ce50a90359cef10" + version "0.2.1" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" dependencies: merge "^1.1.3" -execa@^0.6.0: - version "0.6.3" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.6.3.tgz#57b69a594f081759c69e5370f0d17b9cb11658fe" +execa@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" @@ -2976,10 +2930,6 @@ exists-sync@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.4.tgz#9744c2c428cc03b01060db454d4b12f0ef3c8879" -exit-hook@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" - exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -3003,49 +2953,51 @@ expand-tilde@^1.2.2: os-homedir "^1.0.1" express@^4.10.7, express@^4.12.3: - version "4.15.3" - resolved "https://registry.yarnpkg.com/express/-/express-4.15.3.tgz#bab65d0f03aa80c358408972fc700f916944b662" + version "4.16.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" dependencies: - accepts "~1.3.3" + accepts "~1.3.4" array-flatten "1.1.1" + body-parser "1.18.2" content-disposition "0.5.2" - content-type "~1.0.2" + content-type "~1.0.4" cookie "0.3.1" cookie-signature "1.0.6" - debug "2.6.7" - depd "~1.1.0" + debug "2.6.9" + depd "~1.1.1" encodeurl "~1.0.1" escape-html "~1.0.3" - etag "~1.8.0" - finalhandler "~1.0.3" - fresh "0.5.0" + etag "~1.8.1" + finalhandler "1.1.0" + fresh "0.5.2" merge-descriptors "1.0.1" methods "~1.1.2" on-finished "~2.3.0" - parseurl "~1.3.1" + parseurl "~1.3.2" path-to-regexp "0.1.7" - proxy-addr "~1.1.4" - qs "6.4.0" + proxy-addr "~2.0.2" + qs "6.5.1" range-parser "~1.2.0" - send "0.15.3" - serve-static "1.12.3" - setprototypeof "1.0.3" + safe-buffer "5.1.1" + send "0.16.1" + serve-static "1.13.1" + setprototypeof "1.1.0" statuses "~1.3.1" type-is "~1.6.15" - utils-merge "1.0.0" - vary "~1.1.1" + utils-merge "1.0.1" + vary "~1.1.2" -extend@^3.0.0, extend@~3.0.0: +extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" -external-editor@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-1.1.1.tgz#12d7b0db850f7ff7e7081baf4005700060c4600b" +external-editor@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.5.tgz#52c249a3981b9ba187c7cacf5beb50bf1d91a6bc" dependencies: - extend "^3.0.0" - spawn-sync "^1.0.15" - tmp "^0.0.29" + iconv-lite "^0.4.17" + jschardet "^1.4.2" + tmp "^0.0.33" extglob@^0.3.1: version "0.3.2" @@ -3053,15 +3005,11 @@ extglob@^0.3.1: dependencies: is-extglob "^1.0.0" -extsprintf@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" - -fake-xml-http-request@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-1.5.0.tgz#d79602a97043d4d8fea671d5d904af38847b451d" +extsprintf@1.3.0, extsprintf@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" -fake-xml-http-request@^1.6.0: +fake-xml-http-request@^1.4.0, fake-xml-http-request@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-1.6.0.tgz#bd0ac79ae3e2660098282048a12c730a6f64d550" @@ -3069,6 +3017,10 @@ faker@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/faker/-/faker-3.1.0.tgz#0f908faf4e6ec02524e54a57e432c5c013e08c9f" +fast-deep-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" @@ -3080,17 +3032,18 @@ fast-ordered-set@^1.0.0, fast-ordered-set@^1.0.2: blank-object "^1.0.1" fast-sourcemap-concat@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-sourcemap-concat/-/fast-sourcemap-concat-1.1.0.tgz#a800767abed5eda02e67238ec063a709be61f9d4" + version "1.2.3" + resolved "https://registry.yarnpkg.com/fast-sourcemap-concat/-/fast-sourcemap-concat-1.2.3.tgz#22f14e92d739e37920334376ec8433bf675eaa04" dependencies: chalk "^0.5.1" - debug "^2.2.0" fs-extra "^0.30.0" + heimdalljs-logger "^0.1.7" memory-streams "^0.1.0" mkdirp "^0.5.0" rsvp "^3.0.14" source-map "^0.4.2" source-map-url "^0.3.0" + sourcemap-validator "^1.0.5" faye-websocket@~0.10.0: version "0.10.0" @@ -3104,12 +3057,11 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" -figures@^1.3.5: - version "1.7.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" dependencies: escape-string-regexp "^1.0.5" - object-assign "^4.1.0" file-entry-cache@^2.0.0: version "2.0.0" @@ -3136,15 +3088,15 @@ fill-range@^2.1.0: repeat-element "^1.1.2" repeat-string "^1.5.2" -finalhandler@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.3.tgz#ef47e77950e999780e86022a560e3217e0d0cc89" +finalhandler@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" dependencies: - debug "2.6.7" + debug "2.6.9" encodeurl "~1.0.1" escape-html "~1.0.3" on-finished "~2.3.0" - parseurl "~1.3.1" + parseurl "~1.3.2" statuses "~1.3.1" unpipe "~1.0.0" @@ -3187,8 +3139,8 @@ fireworm@^0.7.0: minimatch "^3.0.2" flat-cache@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" + version "1.3.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" dependencies: circular-json "^0.3.1" del "^2.0.2" @@ -3217,19 +3169,27 @@ form-data@~2.1.1: combined-stream "^1.0.5" mime-types "^2.1.12" +form-data@~2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + formatio@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.1.1.tgz#5ed3ccd636551097383465d996199100e86161e9" dependencies: samsam "~1.1" -forwarded@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" -fresh@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" fs-exists-sync@^0.1.0: version "0.1.0" @@ -3287,6 +3247,14 @@ fs-extra@^3.0.0: jsonfile "^3.0.0" universalify "^0.1.0" +fs-extra@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.2.tgz#f91704c53d1b461f893452b0c307d9997647ab6b" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-promise@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/fs-promise/-/fs-promise-2.0.3.tgz#f64e4f854bcf689aa8bddcba268916db3db46854" @@ -3337,6 +3305,10 @@ fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: mkdirp ">=0.5 0" rimraf "2" +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -3350,16 +3322,6 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -generate-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" - -generate-object-property@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" - dependencies: - is-property "^1.0.0" - get-caller-file@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" @@ -3415,7 +3377,7 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" -glob@7.1.1, glob@^7.0.0, glob@^7.0.3, glob@^7.0.4, glob@^7.0.5: +glob@7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" dependencies: @@ -3436,6 +3398,17 @@ glob@^5.0.10, glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.0.3, glob@^7.0.4, glob@^7.0.5, glob@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + global-modules@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" @@ -3456,7 +3429,7 @@ globals@^6.4.0: version "6.4.1" resolved "https://registry.yarnpkg.com/globals/-/globals-6.4.1.tgz#8498032b3b6d1cc81eebc5f79690d8fe29fabf4f" -globals@^9.0.0, globals@^9.14.0: +globals@^9.17.0, globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -3501,6 +3474,10 @@ har-schema@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + har-validator@~4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" @@ -3508,6 +3485,13 @@ har-validator@~4.2.1: ajv "^4.9.1" har-schema "^1.0.5" +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + has-ansi@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" @@ -3540,20 +3524,24 @@ has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" hash-for-dep@^1.0.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.1.2.tgz#e3347ed92960eb0bb53a2c6c2b70e36d75b7cd0c" + version "1.2.1" + resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.2.1.tgz#6bb45822342af46cf87bf91dcdcaeb6f14103f80" dependencies: broccoli-kitchen-sink-helpers "^0.3.1" heimdalljs "^0.2.3" heimdalljs-logger "^0.1.7" - resolve "^1.1.6" + resolve "^1.4.0" -hawk@~3.1.3: +hawk@3.1.3, hawk@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" dependencies: @@ -3562,6 +3550,19 @@ hawk@~3.1.3: hoek "2.x.x" sntp "1.x.x" +hawk@~6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + dependencies: + boom "4.x.x" + cryptiles "3.x.x" + hoek "4.x.x" + sntp "2.x.x" + +he@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + heimdalljs-fs-monitor@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/heimdalljs-fs-monitor/-/heimdalljs-fs-monitor-0.1.0.tgz#d404a65688c6714c485469ed3495da4853440272" @@ -3596,6 +3597,10 @@ hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" +hoek@4.x.x: + version "4.2.0" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" + home-or-tmp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-1.0.0.tgz#4b9f1e40800c3e50c6c27f781676afcce71f3985" @@ -3626,15 +3631,19 @@ html-encoding-sniffer@^1.0.1: dependencies: whatwg-encoding "^1.0.1" -http-errors@~1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" +http-errors@1.6.2, http-errors@~1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" dependencies: - depd "1.1.0" + depd "1.1.1" inherits "2.0.3" setprototypeof "1.0.3" statuses ">= 1.3.1 < 2" +http-parser-js@>=0.4.0: + version "0.4.9" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.9.tgz#ea1a04fb64adff0242e9974f297dd4c3cad271e1" + http-proxy@^1.13.1, http-proxy@^1.9.0: version "1.16.2" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" @@ -3650,13 +3659,25 @@ http-signature@~1.1.0: jsprim "^1.2.2" sshpk "^1.7.0" -iconv-lite@0.4.13, iconv-lite@^0.4.5, iconv-lite@~0.4.13: +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iconv-lite@0.4.13: version "0.4.13" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" -ignore@^3.2.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d" +iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@^0.4.5, iconv-lite@~0.4.13: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + +ignore@^3.3.3: + version "3.3.5" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.5.tgz#c4e715455f6073a8d7e5dae72d2fc9d71663dba6" imurmurhash@^0.1.4: version "0.1.4" @@ -3666,7 +3687,7 @@ indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" -inflection@^1.7.0, inflection@^1.7.1, inflection@^1.8.0: +inflection@^1.12.0, inflection@^1.7.0, inflection@^1.7.1, inflection@^1.8.0: version "1.12.0" resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" @@ -3699,48 +3720,26 @@ inline-source-map-comment@^1.0.5: sum-up "^1.0.1" xtend "^4.0.0" -inquirer@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" - dependencies: - ansi-escapes "^1.1.0" - ansi-regex "^2.0.0" - chalk "^1.0.0" - cli-cursor "^1.0.1" - cli-width "^2.0.0" - figures "^1.3.5" - lodash "^4.3.0" - readline2 "^1.0.1" - run-async "^0.1.0" - rx-lite "^3.1.2" - string-width "^1.0.1" - strip-ansi "^3.0.0" - through "^2.3.6" - -inquirer@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-1.2.3.tgz#4dec6f32f37ef7bb0b2ed3f1d1a5c3f545074918" +inquirer@^3.0.6, inquirer@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" dependencies: - ansi-escapes "^1.1.0" - chalk "^1.0.0" - cli-cursor "^1.0.1" + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" cli-width "^2.0.0" - external-editor "^1.1.0" - figures "^1.3.5" + external-editor "^2.0.4" + figures "^2.0.0" lodash "^4.3.0" - mute-stream "0.0.6" - pinkie-promise "^2.0.0" + mute-stream "0.0.7" run-async "^2.2.0" - rx "^4.1.0" - string-width "^1.0.1" - strip-ansi "^3.0.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" through "^2.3.6" -interpret@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90" - -invariant@^2.2.0, invariant@^2.2.2: +invariant@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" dependencies: @@ -3750,9 +3749,9 @@ invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" -ipaddr.js@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.3.0.tgz#1e03a52fdad83a8bbb2b25cbf4998b4cffcd3dec" +ipaddr.js@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" is-binary-path@^1.0.0: version "1.0.1" @@ -3798,9 +3797,9 @@ is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" -is-git-url@^0.2.0: - version "0.2.3" - resolved "https://registry.yarnpkg.com/is-git-url/-/is-git-url-0.2.3.tgz#445200d6fbd6da028fb5e01440d9afc93f3ccb64" +is-git-url@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-git-url/-/is-git-url-1.0.0.tgz#53f684cd143285b52c3244b4e6f28253527af66b" is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" @@ -3814,15 +3813,6 @@ is-integer@^1.0.4: dependencies: is-finite "^1.0.0" -is-my-json-valid@^2.10.0: - version "2.16.0" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" - dependencies: - generate-function "^2.0.0" - generate-object-property "^1.1.0" - jsonpointer "^4.0.0" - xtend "^4.0.0" - is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" @@ -3867,10 +3857,6 @@ is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" -is-property@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" - is-resolvable@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" @@ -3891,10 +3877,6 @@ is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - is-windows@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" @@ -3945,13 +3927,13 @@ js-tokens@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-1.0.1.tgz#cc435a5c8b94ad15acb7983140fc80182c89aeae" -js-tokens@^3.0.0: +js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" -js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.5.1, js-yaml@^3.6.1: - version "3.9.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.9.0.tgz#4ffbbf25c2ac963b8299dc74da7e3740de1c18ce" +js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.6.1, js-yaml@^3.9.1: + version "3.10.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -3960,6 +3942,10 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" +jschardet@^1.4.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.5.1.tgz#c519f629f86b3a5bedba58a88d311309eec097f9" + jsdom@^9.5.0: version "9.12.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" @@ -3992,10 +3978,18 @@ jsesc@^2.5.0: version "2.5.1" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" +jsesc@~0.3.x: + version "0.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.3.0.tgz#1bf5ee63b4539fe2e26d0c1e99c240b97a457972" + jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" @@ -4018,7 +4012,7 @@ json5@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d" -json5@^0.5.0: +json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -4034,22 +4028,24 @@ jsonfile@^3.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + optionalDependencies: + graceful-fs "^4.1.6" + jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" -jsonpointer@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" - jsprim@^1.2.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" dependencies: assert-plus "1.0.0" - extsprintf "1.0.2" + extsprintf "1.3.0" json-schema "0.2.3" - verror "1.3.6" + verror "1.10.0" kind-of@^3.0.2: version "3.2.2" @@ -4130,6 +4126,14 @@ lodash._baseassign@^3.0.0: lodash._basecopy "^3.0.0" lodash.keys "^3.0.0" +lodash._basebind@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash._basebind/-/lodash._basebind-2.3.0.tgz#2b5bc452a0e106143b21869f233bdb587417d248" + dependencies: + lodash._basecreate "~2.3.0" + lodash._setbinddata "~2.3.0" + lodash.isobject "~2.3.0" + lodash._basecopy@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" @@ -4138,6 +4142,32 @@ lodash._basecreate@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" +lodash._basecreate@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-2.3.0.tgz#9b88a86a4dcff7b7f3c61d83a2fcfc0671ec9de0" + dependencies: + lodash._renative "~2.3.0" + lodash.isobject "~2.3.0" + lodash.noop "~2.3.0" + +lodash._basecreatecallback@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash._basecreatecallback/-/lodash._basecreatecallback-2.3.0.tgz#37b2ab17591a339e988db3259fcd46019d7ac362" + dependencies: + lodash._setbinddata "~2.3.0" + lodash.bind "~2.3.0" + lodash.identity "~2.3.0" + lodash.support "~2.3.0" + +lodash._basecreatewrapper@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.3.0.tgz#aa0c61ad96044c3933376131483a9759c3651247" + dependencies: + lodash._basecreate "~2.3.0" + lodash._setbinddata "~2.3.0" + lodash._slice "~2.3.0" + lodash.isobject "~2.3.0" + lodash._baseflatten@^3.0.0: version "3.1.4" resolved "https://registry.yarnpkg.com/lodash._baseflatten/-/lodash._baseflatten-3.1.4.tgz#0770ff80131af6e34f3b511796a7ba5214e65ff7" @@ -4157,18 +4187,76 @@ lodash._createassigner@^3.0.0: lodash._isiterateecall "^3.0.0" lodash.restparam "^3.0.0" +lodash._createwrapper@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash._createwrapper/-/lodash._createwrapper-2.3.0.tgz#d1aae1102dadf440e8e06fc133a6edd7fe146075" + dependencies: + lodash._basebind "~2.3.0" + lodash._basecreatewrapper "~2.3.0" + lodash.isfunction "~2.3.0" + +lodash._escapehtmlchar@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.3.0.tgz#d03da6bd82eedf38dc0a5b503d740ecd0e894592" + dependencies: + lodash._htmlescapes "~2.3.0" + +lodash._escapestringchar@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.3.0.tgz#cce73ae60fc6da55d2bf8a0679c23ca2bab149fc" + lodash._getnative@^3.0.0: version "3.9.1" resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" +lodash._htmlescapes@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.3.0.tgz#1ca98863cadf1fa1d82c84f35f31e40556a04f3a" + lodash._isiterateecall@^3.0.0: version "3.0.9" resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" +lodash._objecttypes@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.3.0.tgz#6a3ea3987dd6eeb8021b2d5c9c303549cc2bae1e" + +lodash._reinterpolate@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.3.0.tgz#03ee9d85c0e55cbd590d71608a295bdda51128ec" + lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" +lodash._renative@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash._renative/-/lodash._renative-2.3.0.tgz#77d8edd4ced26dd5971f9e15a5f772e4e317fbd3" + +lodash._reunescapedhtml@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.3.0.tgz#db920b55ac7f3ff825939aceb9ba2c231713d24d" + dependencies: + lodash._htmlescapes "~2.3.0" + lodash.keys "~2.3.0" + +lodash._setbinddata@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash._setbinddata/-/lodash._setbinddata-2.3.0.tgz#e5610490acd13277d59858d95b5f2727f1508f04" + dependencies: + lodash._renative "~2.3.0" + lodash.noop "~2.3.0" + +lodash._shimkeys@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.3.0.tgz#611f93149e3e6c721096b48769ef29537ada8ba9" + dependencies: + lodash._objecttypes "~2.3.0" + +lodash._slice@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash._slice/-/lodash._slice-2.3.0.tgz#147198132859972e4680ca29a5992c855669aa5c" + lodash.assign@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" @@ -4181,6 +4269,14 @@ lodash.assignin@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" +lodash.bind@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-2.3.0.tgz#c2a8e18b68e5ecc152e2b168266116fea5b016cc" + dependencies: + lodash._createwrapper "~2.3.0" + lodash._renative "~2.3.0" + lodash._slice "~2.3.0" + lodash.clonedeep@^4.4.1: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -4199,10 +4295,25 @@ lodash.debounce@^3.1.1: dependencies: lodash._getnative "^3.0.0" +lodash.defaults@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.3.0.tgz#a832b001f138f3bb9721c2819a2a7cc5ae21ed25" + dependencies: + lodash._objecttypes "~2.3.0" + lodash.keys "~2.3.0" + lodash.defaultsdeep@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.0.tgz#bec1024f85b1bd96cbea405b23c14ad6443a6f81" +lodash.escape@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.3.0.tgz#844c38c58f844e1362ebe96726159b62cf5f2a58" + dependencies: + lodash._escapehtmlchar "~2.3.0" + lodash._reunescapedhtml "~2.3.0" + lodash.keys "~2.3.0" + lodash.find@^4.5.1: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" @@ -4214,6 +4325,25 @@ lodash.flatten@^3.0.2: lodash._baseflatten "^3.0.0" lodash._isiterateecall "^3.0.0" +lodash.foreach@~2.3.x: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-2.3.0.tgz#083404c91e846ee77245fdf9d76519c68b2af168" + dependencies: + lodash._basecreatecallback "~2.3.0" + lodash.forown "~2.3.0" + +lodash.forown@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash.forown/-/lodash.forown-2.3.0.tgz#24fb4aaf800d45fc2dc60bfec3ce04c836a3ad7f" + dependencies: + lodash._basecreatecallback "~2.3.0" + lodash._objecttypes "~2.3.0" + lodash.keys "~2.3.0" + +lodash.identity@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash.identity/-/lodash.identity-2.3.0.tgz#6b01a210c9485355c2a913b48b6711219a173ded" + lodash.isarguments@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" @@ -4222,6 +4352,16 @@ lodash.isarray@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" +lodash.isfunction@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-2.3.0.tgz#6b2973e47a647cf12e70d676aea13643706e5267" + +lodash.isobject@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.3.0.tgz#2e16d3fc583da9831968953f2d8e6d73434f6799" + dependencies: + lodash._objecttypes "~2.3.0" + lodash.keys@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" @@ -4230,10 +4370,22 @@ lodash.keys@^3.0.0: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" -lodash.merge@^4.3.0, lodash.merge@^4.4.0, lodash.merge@^4.5.1, lodash.merge@^4.6.0: +lodash.keys@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.3.0.tgz#b350f4f92caa9f45a4a2ecf018454cf2f28ae253" + dependencies: + lodash._renative "~2.3.0" + lodash._shimkeys "~2.3.0" + lodash.isobject "~2.3.0" + +lodash.merge@^4.3.0, lodash.merge@^4.4.0, lodash.merge@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5" +lodash.noop@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash.noop/-/lodash.noop-2.3.0.tgz#3059d628d51bbf937cd2a0b6fc3a7f212a669c2c" + lodash.omit@^4.1.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" @@ -4242,6 +4394,12 @@ lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" +lodash.support@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash.support/-/lodash.support-2.3.0.tgz#7eaf038af4f0d6aab776b44aa6dcfc80334c9bfd" + dependencies: + lodash._renative "~2.3.0" + lodash.template@^4.2.5: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" @@ -4249,12 +4407,31 @@ lodash.template@^4.2.5: lodash._reinterpolate "~3.0.0" lodash.templatesettings "^4.0.0" +lodash.template@~2.3.x: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.3.0.tgz#4e3e29c433b4cfea675ec835e6f12391c61fd22b" + dependencies: + lodash._escapestringchar "~2.3.0" + lodash._reinterpolate "~2.3.0" + lodash.defaults "~2.3.0" + lodash.escape "~2.3.0" + lodash.keys "~2.3.0" + lodash.templatesettings "~2.3.0" + lodash.values "~2.3.0" + lodash.templatesettings@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" dependencies: lodash._reinterpolate "~3.0.0" +lodash.templatesettings@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.3.0.tgz#303d132c342710040d5a18efaa2d572fd03f8cdc" + dependencies: + lodash._reinterpolate "~2.3.0" + lodash.escape "~2.3.0" + lodash.uniq@^4.2.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" @@ -4263,14 +4440,26 @@ lodash.uniqby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" +lodash.values@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.3.0.tgz#ca96fbe60a20b0b0ec2ba2ba5fc6a765bd14a3ba" + dependencies: + lodash.keys "~2.3.0" + lodash@^3.10.0, lodash@^3.10.1, lodash@^3.9.3: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" -lodash@^4.0.0, lodash@^4.14.0, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1: +lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" +log-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + dependencies: + chalk "^1.0.0" + lolex@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31" @@ -4319,8 +4508,8 @@ markdown-it-terminal@0.1.0: markdown-it "^8.3.1" markdown-it@^8.3.0, markdown-it@^8.3.1: - version "8.3.1" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.3.1.tgz#2f4b622948ccdc193d66f3ca2d43125ac4ac7323" + version "8.4.0" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.0.tgz#e2400881bf171f7018ed1bd9da441dac8af6306d" dependencies: argparse "^1.0.7" entities "~1.1.1" @@ -4328,9 +4517,9 @@ markdown-it@^8.3.0, markdown-it@^8.3.1: mdurl "^1.0.1" uc.micro "^1.0.3" -matcher-collection@^1.0.0, matcher-collection@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.0.4.tgz#2f66ae0869996f29e43d0b62c83dd1d43e581755" +matcher-collection@^1.0.0, matcher-collection@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.0.5.tgz#2ee095438372cb8884f058234138c05c644ec339" dependencies: minimatch "^3.0.2" @@ -4399,21 +4588,25 @@ micromatch@^2.1.5, micromatch@^2.3.7: parse-glob "^3.0.4" regex-cache "^0.4.2" -"mime-db@>= 1.27.0 < 2", mime-db@~1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" +"mime-db@>= 1.29.0 < 2", mime-db@~1.30.0: + version "1.30.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" -mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.7: - version "2.1.15" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" +mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7: + version "2.1.17" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" dependencies: - mime-db "~1.27.0" + mime-db "~1.30.0" -mime@1.3.4, mime@^1.2.11: - version "1.3.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" +mime@1.4.1, mime@^1.2.11: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + +mimic-fn@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3: +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: @@ -4425,7 +4618,7 @@ minimatch@^2.0.3: dependencies: brace-expansion "^1.0.0" -minimist@0.0.8, minimist@~0.0.1: +minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -4433,6 +4626,10 @@ minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" @@ -4444,16 +4641,17 @@ mktemp@~0.4.0: resolved "https://registry.yarnpkg.com/mktemp/-/mktemp-0.4.0.tgz#6d0515611c8a8c84e484aa2000129b98e981ff0b" mocha@^3.0.2, mocha@^3.4.2: - version "3.4.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.4.2.tgz#d0ef4d332126dbf18d0d640c9b382dd48be97594" + version "3.5.3" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.5.3.tgz#1e0480fe36d2da5858d1eb6acc38418b26eaa20d" dependencies: browser-stdout "1.3.0" commander "2.9.0" - debug "2.6.0" + debug "2.6.8" diff "3.2.0" escape-string-regexp "1.0.5" glob "7.1.1" growl "1.9.2" + he "1.1.1" json3 "3.3.2" lodash.create "3.1.1" mkdirp "0.5.1" @@ -4466,22 +4664,22 @@ moment-timezone@^0.3.0: moment ">= 2.6.0" "moment@>= 2.6.0": - version "2.18.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" + version "2.19.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.19.1.tgz#56da1a2d1cbf01d38b7e1afc31c10bcfa1929167" morgan@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.8.2.tgz#784ac7734e4a453a9c6e6e8680a9329275c8b687" + version "1.9.0" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.0.tgz#d01fa6c65859b76fcf31b3cb53a3821a311d8051" dependencies: - basic-auth "~1.1.0" - debug "2.6.8" - depd "~1.1.0" + basic-auth "~2.0.0" + debug "2.6.9" + depd "~1.1.1" on-finished "~2.3.0" on-headers "~1.0.1" mout@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/mout/-/mout-1.0.0.tgz#9bdf1d4af57d66d47cb353a6335a3281098e1501" + version "1.1.0" + resolved "https://registry.yarnpkg.com/mout/-/mout-1.1.0.tgz#0b29d41e6a80fa9e2d4a5be9d602e1d9d02177f6" ms@0.7.1: version "0.7.1" @@ -4499,25 +4697,21 @@ mustache@^2.2.1: version "2.3.0" resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.0.tgz#4028f7778b17708a489930a6e52ac3bca0da41d0" -mute-stream@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" - -mute-stream@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" mz@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.6.0.tgz#c8b8521d958df0a4f2768025db69c719ee4ef1ce" + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" dependencies: any-promise "^1.0.0" object-assign "^4.0.1" thenify-all "^1.0.0" nan@^2.3.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" + version "2.7.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" natural-compare@^1.4.0: version "1.4.0" @@ -4528,8 +4722,8 @@ negotiator@0.6.1: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" node-fetch@^1.3.3: - version "1.7.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.1.tgz#899cb3d0a3c92f952c47f1b876f4c8aeabd400d5" + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" dependencies: encoding "^0.1.11" is-stream "^1.0.1" @@ -4552,14 +4746,15 @@ node-notifier@^5.0.1: which "^1.2.12" node-pre-gyp@^0.6.36: - version "0.6.36" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" + version "0.6.38" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.38.tgz#e92a20f83416415bb4086f6d1fb78b3da73d113d" dependencies: + hawk "3.1.3" mkdirp "^0.5.1" nopt "^4.0.1" npmlog "^4.0.2" rc "^1.1.7" - request "^2.81.0" + request "2.81.0" rimraf "^2.6.1" semver "^5.3.0" tar "^2.2.1" @@ -4578,7 +4773,7 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" -normalize-path@^2.0.1: +normalize-path@^2.0.0, normalize-path@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" dependencies: @@ -4615,10 +4810,10 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" "nwmatcher@>= 1.3.9 < 2.0.0": - version "1.4.1" - resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.1.tgz#7ae9b07b0ea804db7e25f05cb5fe4097d4e4949f" + version "1.4.3" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c" -oauth-sign@~0.8.1: +oauth-sign@~0.8.1, oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" @@ -4657,9 +4852,11 @@ once@^1.3.0, once@^1.3.3: dependencies: wrappy "1" -onetime@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" optimist@^0.6.1: version "0.6.1" @@ -4683,14 +4880,14 @@ options@>=0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" -ora@^0.2.0: - version "0.2.3" - resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4" +ora@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-1.3.0.tgz#80078dd2b92a934af66a3ad72a5b910694ede51a" dependencies: chalk "^1.1.1" - cli-cursor "^1.0.2" - cli-spinners "^0.1.2" - object-assign "^4.0.1" + cli-cursor "^2.1.0" + cli-spinners "^1.0.0" + log-symbols "^1.0.2" os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" @@ -4702,11 +4899,7 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" -os-shim@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" - -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -4774,9 +4967,9 @@ parseuri@0.0.5: dependencies: better-assert "~1.0.0" -parseurl@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" +parseurl@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" path-exists@^1.0.0: version "1.0.0" @@ -4786,11 +4979,11 @@ path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" -path-is-absolute@^1.0.0: +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" -path-is-inside@^1.0.1: +path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" @@ -4818,6 +5011,10 @@ performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -4832,9 +5029,9 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" -pluralize@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" +pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" portfinder@^1.0.7: version "1.0.13" @@ -4853,8 +5050,8 @@ preserve@^0.2.0: resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" pretender@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pretender/-/pretender-1.5.1.tgz#bd9098c03d39c3bc7dcb84a28ee27e096e2e32b8" + version "1.6.0" + resolved "https://registry.yarnpkg.com/pretender/-/pretender-1.6.0.tgz#0bb6dc9622b576772938814bc36f7cf2f86660dd" dependencies: fake-xml-http-request "^1.6.0" route-recognizer "^0.3.3" @@ -4863,9 +5060,9 @@ printf@^0.2.3: version "0.2.5" resolved "https://registry.yarnpkg.com/printf/-/printf-0.2.5.tgz#c438ca2ca33e3927671db4ab69c0e52f936a4f0f" -private@^0.1.6, private@~0.1.5: - version "0.1.7" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" +private@^0.1.6, private@^0.1.7, private@~0.1.5: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" process-nextick-args@~1.0.6: version "1.0.7" @@ -4877,9 +5074,9 @@ process-relative-require@^1.0.0: dependencies: node-modules-path "^1.0.0" -progress@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" +progress@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" promise-map-series@^0.2.1: version "0.2.3" @@ -4887,12 +5084,12 @@ promise-map-series@^0.2.1: dependencies: rsvp "^3.0.14" -proxy-addr@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.4.tgz#27e545f6960a44a627d9b44467e35c1b6b4ce2f3" +proxy-addr@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec" dependencies: - forwarded "~0.1.0" - ipaddr.js "1.3.0" + forwarded "~0.1.2" + ipaddr.js "1.5.2" pseudomap@^1.0.2: version "1.0.2" @@ -4906,7 +5103,11 @@ q@^1.1.2: version "1.5.0" resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" -qs@6.4.0, qs@^6.4.0, qs@~6.4.0: +qs@6.5.1, qs@^6.4.0, qs@~6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + +qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" @@ -4922,7 +5123,7 @@ qunit-notifications@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/qunit-notifications/-/qunit-notifications-0.1.1.tgz#3001afc6a6a77dfbd962ccbcddde12dec5286c09" -qunitjs@^2.0.1: +qunitjs@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/qunitjs/-/qunitjs-2.4.0.tgz#58f3a81e846687f2e7f637c5bedc9c267f887261" dependencies: @@ -4945,6 +5146,15 @@ range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" +raw-body@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" + dependencies: + bytes "3.0.0" + http-errors "1.6.2" + iconv-lite "0.4.19" + unpipe "1.0.0" + raw-body@~1.1.0: version "1.1.7" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.1.7.tgz#1d027c2bfa116acc6623bca8f00016572a87d425" @@ -4953,8 +5163,8 @@ raw-body@~1.1.0: string_decoder "0.10" rc@^1.1.7: - version "1.2.1" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" + version "1.2.2" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077" dependencies: deep-extend "~0.4.0" ini "~1.3.0" @@ -4991,15 +5201,7 @@ readdirp@^2.0.0: readable-stream "^2.0.2" set-immediate-shim "^1.0.1" -readline2@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - mute-stream "0.0.5" - -recast@0.10.33, recast@^0.10.10: +recast@0.10.33: version "0.10.33" resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.33.tgz#942808f7aa016f1fa7142c461d7e5704aaa8d697" dependencies: @@ -5008,6 +5210,15 @@ recast@0.10.33, recast@^0.10.10: private "~0.1.5" source-map "~0.5.0" +recast@^0.10.10: + version "0.10.43" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.43.tgz#b95d50f6d60761a5f6252e15d80678168491ce7f" + dependencies: + ast-types "0.8.15" + esprima-fb "~15001.1001.0-dev-harmony-fb" + private "~0.1.5" + source-map "~0.5.0" + recast@^0.11.17, recast@^0.11.3: version "0.11.23" resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" @@ -5017,12 +5228,6 @@ recast@^0.11.17, recast@^0.11.3: private "~0.1.5" source-map "~0.5.0" -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - dependencies: - resolve "^1.1.6" - redeyed@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-1.0.1.tgz#e96c193b40c0816b00aec842698e61185e55498a" @@ -5030,16 +5235,20 @@ redeyed@~1.0.0: esprima "~3.0.0" regenerate@^1.2.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" + version "1.3.3" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" -regenerator-runtime@^0.10.0: +regenerator-runtime@^0.10.5: version "0.10.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" -regenerator-transform@0.9.11: - version "0.9.11" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" +regenerator-runtime@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" dependencies: babel-runtime "^6.18.0" babel-types "^6.19.0" @@ -5057,11 +5266,10 @@ regenerator@0.8.40: through "~2.3.8" regex-cache@^0.4.2: - version "0.4.3" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" dependencies: is-equal-shallow "^0.1.3" - is-primitive "^2.0.0" regexpu-core@^2.0.0: version "2.0.0" @@ -5092,8 +5300,8 @@ regjsparser@^0.1.4: jsesc "~0.5.0" remove-trailing-separator@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz#69b062d978727ad14dc6b56ba4ab772fd8d70511" + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" repeat-element@^1.1.2: version "1.1.2" @@ -5115,7 +5323,7 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request@^2.74.0, request@^2.79.0, request@^2.81.0: +request@2.81.0: version "2.81.0" resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" dependencies: @@ -5142,7 +5350,34 @@ request@^2.74.0, request@^2.79.0, request@^2.81.0: tunnel-agent "^0.6.0" uuid "^3.0.0" -require-uncached@^1.0.2: +request@^2.74.0, request@^2.79.0: + version "2.83.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + hawk "~6.0.2" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + stringstream "~0.0.5" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" dependencies: @@ -5174,18 +5409,18 @@ resolve@1.3.2: dependencies: path-parse "^1.0.5" -resolve@^1.1.2, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.0, resolve@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" +resolve@^1.1.2, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.0, resolve@^1.3.3, resolve@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86" dependencies: path-parse "^1.0.5" -restore-cursor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" dependencies: - exit-hook "^1.0.0" - onetime "^1.0.0" + onetime "^2.0.0" + signal-exit "^3.0.2" right-align@^0.1.1: version "0.1.3" @@ -5194,8 +5429,8 @@ right-align@^0.1.1: align-text "^0.1.1" rimraf@2, rimraf@^2.2.8, rimraf@^2.3.2, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.1, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: glob "^7.0.5" @@ -5211,9 +5446,13 @@ route-recognizer@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.3.tgz#1d365e27fa6995e091675f7dc940a8c00353bd29" -rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.2.1, rsvp@^3.3.1, rsvp@^3.3.3, rsvp@^3.5.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.1.tgz#34f4a7ac2859f7bacc8f49789c5604f1e26ae702" +rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.2.1, rsvp@^3.3.1, rsvp@^3.3.3, rsvp@^3.5.0, rsvp@^3.6.0, rsvp@^3.6.1: + version "3.6.2" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" + +rsvp@^4.6.1: + version "4.7.0" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.7.0.tgz#dc1b0b1a536f7dec9d2be45e0a12ad4197c9fd96" rsvp@~3.0.6: version "3.0.21" @@ -5223,27 +5462,23 @@ rsvp@~3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.2.1.tgz#07cb4a5df25add9e826ebc67dcc9fd89db27d84a" -run-async@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" - dependencies: - once "^1.3.0" - run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" dependencies: is-promise "^2.1.0" -rx-lite@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" -rx@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" -safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -5251,10 +5486,14 @@ safe-json-parse@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" -samsam@1.1.2, samsam@~1.1: +samsam@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567" +samsam@~1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.3.tgz#9f5087419b4d091f232571e7fa52e90b0f552621" + sane@^1.1.1, sane@^1.6.0: version "1.7.0" resolved "https://registry.yarnpkg.com/sane/-/sane-1.7.0.tgz#b3579bccb45c94cf20355cc81124990dfd346e30" @@ -5271,40 +5510,40 @@ sax@^1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" -semver@^4.1.0, semver@^4.3.1: +semver@^4.3.1: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" semver@^5.1.0, semver@^5.1.1, semver@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" -send@0.15.3: - version "0.15.3" - resolved "https://registry.yarnpkg.com/send/-/send-0.15.3.tgz#5013f9f99023df50d1bd9892c19e3defd1d53309" +send@0.16.1: + version "0.16.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" dependencies: - debug "2.6.7" - depd "~1.1.0" + debug "2.6.9" + depd "~1.1.1" destroy "~1.0.4" encodeurl "~1.0.1" escape-html "~1.0.3" - etag "~1.8.0" - fresh "0.5.0" - http-errors "~1.6.1" - mime "1.3.4" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" ms "2.0.0" on-finished "~2.3.0" range-parser "~1.2.0" statuses "~1.3.1" -serve-static@1.12.3: - version "1.12.3" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.3.tgz#9f4ba19e2f3030c547f8af99107838ec38d5b1e2" +serve-static@1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" dependencies: encodeurl "~1.0.1" escape-html "~1.0.3" - parseurl "~1.3.1" - send "0.15.3" + parseurl "~1.3.2" + send "0.16.1" set-blocking@~2.0.0: version "2.0.0" @@ -5318,6 +5557,10 @@ setprototypeof@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -5328,19 +5571,11 @@ shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" -shelljs@^0.7.5: - version "0.7.8" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - shellwords@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14" + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" -signal-exit@^3.0.0: +signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -5383,13 +5618,11 @@ slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" -slice-ansi@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" - -slide@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" +slice-ansi@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + dependencies: + is-fullwidth-code-point "^2.0.0" sntp@1.x.x: version "1.0.9" @@ -5397,6 +5630,12 @@ sntp@1.x.x: dependencies: hoek "2.x.x" +sntp@2.x.x: + version "2.0.2" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.0.2.tgz#5064110f0af85f7cfdb7d6b67a40028ce52b4b2b" + dependencies: + hoek "4.x.x" + socket.io-adapter@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" @@ -5446,8 +5685,8 @@ sort-object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.2.tgz#d3a6c48dc2ac97e6bc94367696e03f6d09d37952" sort-package-json@^1.4.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.7.0.tgz#13b362ff6400c5b4eaa9ba220f9ea7c3d6644b5f" + version "1.7.1" + resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.7.1.tgz#f2e5fbffe8420cc1bb04485f4509f05e73b4c0f2" dependencies: sort-object-keys "^1.1.1" @@ -5457,9 +5696,9 @@ source-map-support@^0.2.10: dependencies: source-map "0.1.32" -source-map-support@^0.4.2: - version "0.4.15" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" dependencies: source-map "^0.5.6" @@ -5467,6 +5706,10 @@ source-map-url@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + source-map@0.1.32: version "0.1.32" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.32.tgz#c8b6c167797ba4740a8ea33252162ff08591b266" @@ -5479,32 +5722,38 @@ source-map@0.4.x, source-map@^0.4.2, source-map@^0.4.4: dependencies: amdefine ">=0.0.4" -source-map@^0.5.0, source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" +source-map@^0.5.0, source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.1, source-map@~0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" -source-map@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" +source-map@~0.1.x: + version "0.1.43" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" dependencies: amdefine ">=0.0.4" +sourcemap-validator@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/sourcemap-validator/-/sourcemap-validator-1.0.6.tgz#abd2f1ecdae6a3c46c2c96c5f256705b2147c9c0" + dependencies: + jsesc "~0.3.x" + lodash.foreach "~2.3.x" + lodash.template "~2.3.x" + source-map "~0.1.x" + spawn-args@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/spawn-args/-/spawn-args-0.2.0.tgz#fb7d0bd1d70fd4316bd9e3dec389e65f9d6361bb" -spawn-sync@^1.0.15: - version "1.0.15" - resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" - dependencies: - concat-stream "^1.4.7" - os-shim "^0.1.2" - spawnback@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/spawnback/-/spawnback-1.0.0.tgz#f73662f7e54d95367eca74d6426c677dd7ea686f" -sprintf-js@^1.0.3, sprintf-js@~1.0.2: +sprintf-js@^1.0.3: + version "1.1.1" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c" + +sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -5546,9 +5795,9 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.0.tgz#030664561fc146c9423ec7d978fe2457437fe6d0" +string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" @@ -5571,7 +5820,7 @@ stringset@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/stringset/-/stringset-0.2.1.tgz#ef259c4e349344377fcd1c913dd2e848c9c042b5" -stringstream@~0.0.4: +stringstream@~0.0.4, stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -5593,12 +5842,6 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - dependencies: - is-utf8 "^0.2.0" - strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -5635,6 +5878,12 @@ supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" +supports-color@^4.0.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" + dependencies: + has-flag "^2.0.0" + symbol-tree@^3.2.1: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" @@ -5643,16 +5892,16 @@ symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.3, symlink- version "1.1.8" resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.1.8.tgz#cabe61e0010c1c023c173b25ee5108b37f4b4aa3" -table@^3.7.8: - version "3.8.3" - resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" +table@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" dependencies: - ajv "^4.7.0" - ajv-keywords "^1.0.0" - chalk "^1.1.1" - lodash "^4.0.0" - slice-ansi "0.0.4" - string-width "^2.0.0" + ajv "^5.2.3" + ajv-keywords "^2.1.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" tap-parser@^5.1.0: version "5.4.0" @@ -5691,9 +5940,9 @@ temp@0.8.3, temp@^0.8.3: os-tmpdir "^1.0.0" rimraf "~2.2.6" -testem@^1.15.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/testem/-/testem-1.18.0.tgz#4a9f798509d260dca928823aaae5dbc6a9c977ee" +testem@^1.18.0: + version "1.18.4" + resolved "https://registry.yarnpkg.com/testem/-/testem-1.18.4.tgz#e45fed922bec2f54a616c43f11922598ac97eb41" dependencies: backbone "^1.1.2" bluebird "^3.4.6" @@ -5763,11 +6012,11 @@ tmp@0.0.28: dependencies: os-tmpdir "~1.0.1" -tmp@^0.0.29: - version "0.0.29" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" dependencies: - os-tmpdir "~1.0.1" + os-tmpdir "~1.0.2" tmpl@1.0.x: version "1.0.4" @@ -5777,13 +6026,13 @@ to-array@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" -to-fast-properties@^1.0.0, to-fast-properties@^1.0.1: +to-fast-properties@^1.0.0, to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" -tough-cookie@^2.3.2, tough-cookie@~2.3.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" +tough-cookie@^2.3.2, tough-cookie@~2.3.0, tough-cookie@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" dependencies: punycode "^1.4.1" @@ -5833,10 +6082,6 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-3.0.0.tgz#46d0cc8553abb7b13a352b0d6dea2fd58f2d9b55" - type-detect@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.3.tgz#0e3f2670b44099b0b46c284d136a7ef49c74c2ea" @@ -5856,7 +6101,14 @@ uc.micro@^1.0.1, uc.micro@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.3.tgz#7ed50d5e0f9a9fb0a573379259f2a77458d50192" -uglify-js@^2.6, uglify-js@^2.7.0: +uglify-es@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.1.3.tgz#a21eeb149cb120a1f8302563689e19496550780b" + dependencies: + commander "~2.11.0" + source-map "~0.5.1" + +uglify-js@^2.6: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" dependencies: @@ -5895,10 +6147,10 @@ unique-string@^1.0.0: crypto-random-string "^1.0.0" universalify@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.0.tgz#9eb1c4651debcc670cc94f1a75762332bb967778" + version "0.1.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" -unpipe@~1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -5912,12 +6164,6 @@ user-home@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" -user-home@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" - dependencies: - os-homedir "^1.0.0" - username-sync@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/username-sync/-/username-sync-1.0.1.tgz#1cde87eefcf94b8822984d938ba2b797426dae1f" @@ -5932,11 +6178,11 @@ util-deprecate@^1.0.2, util-deprecate@~1.0.1: dependencies: inherits "2.0.1" -utils-merge@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" -uuid@^3.0.0: +uuid@^3.0.0, uuid@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" @@ -5946,15 +6192,17 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" -vary@~1.1.0, vary@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" -verror@1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" dependencies: - extsprintf "1.0.2" + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" walk-sync@0.3.1: version "0.3.1" @@ -5963,10 +6211,6 @@ walk-sync@0.3.1: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" -walk-sync@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.1.3.tgz#8a07261a00bda6cfb1be25e9f100fad57546f583" - walk-sync@^0.2.5, walk-sync@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.2.7.tgz#b49be4ee6867657aeb736978b56a29d10fa39969" @@ -5974,7 +6218,7 @@ walk-sync@^0.2.5, walk-sync@^0.2.7: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" -walk-sync@^0.3.0, walk-sync@^0.3.1: +walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.2.tgz#4827280afc42d0e035367c4a4e31eeac0d136f75" dependencies: @@ -5996,18 +6240,19 @@ webidl-conversions@^3.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" webidl-conversions@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.1.tgz#8015a17ab83e7e1b311638486ace81da6ce206a0" + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" websocket-driver@>=0.5.1: - version "0.6.5" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + version "0.7.0" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" dependencies: + http-parser-js ">=0.4.0" websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" + version "0.1.2" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.2.tgz#0e18781de629a18308ce1481650f67ffa2693a5d" whatwg-encoding@^1.0.1: version "1.0.1" @@ -6023,8 +6268,8 @@ whatwg-url@^4.3.0: webidl-conversions "^3.0.0" which@^1.2.12, which@^1.2.9: - version "1.2.14" - resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" dependencies: isexe "^2.0.0" @@ -6042,17 +6287,21 @@ window-size@^0.1.2: version "0.1.4" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" -wordwrap@0.0.2, wordwrap@~0.0.2: +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" + wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" workerpool@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-2.2.2.tgz#1cf53bacafd98ca5d808ff54cc72f3fecb5e1d56" + version "2.3.0" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-2.3.0.tgz#86c5cbe946b55e7dc9d12b1936c8801a6e2d744d" dependencies: object-assign "4.1.1" @@ -6061,12 +6310,12 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" write-file-atomic@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.1.0.tgz#1769f4b551eedce419f0505deae2e26763542d37" + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" - slide "^1.1.5" + signal-exit "^3.0.2" write@^0.2.1: version "0.2.1" From 289e9804d1598ae0ad0e95fe19c57cc3d305d2b8 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 26 Oct 2017 14:50:41 -0400 Subject: [PATCH 098/879] Update changelog --- CHANGELOG.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 933f10ac9..27229c8fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,26 @@ # Ember CLI Mirage Changelog +## 0.4.0 + +Update notes: + +We bumped our "major" to 0.4.x because support for Node 0.12 has been explicitly dropped from some of our dependencies. There's no Mirage-specific changes you need to make for this upgrade. + +_Special thanks to @turbo87 and @kellyselden for all their work on this release._ + +Changes: + + - [ENHANCEMENT][#1150](https://github.com/samselikoff/ember-cli-mirage/pull/1150) Change default JSONAPI data linkage behavior (reference #1146) @samselikoff + - [BUGFIX][#1148](https://github.com/samselikoff/ember-cli-mirage/pull/1148) Foreign key ids were being muted by collection creation @lukemelia + - [BUGFIX][#1078](https://github.com/samselikoff/ember-cli-mirage/pull/1078) Ensure #update works on associations @ivanvanderbyl + - [BUGFIX][#1112](https://github.com/samselikoff/ember-cli-mirage/pull/1112) Fix query in disassociateAllDepentsFromTarget @omghax + - [BUGFIX][#0176](https://github.com/samselikoff/ember-cli-mirage/pull/0176) Fix using `association` helper in a dasherized factory @ignatius-j + - [ENHANCEMENT][#1138](https://github.com/samselikoff/ember-cli-mirage/pull/1138) Unlock and upgrade ember-get-config @dfreeman + - [ENHANCEMENT][b997176f1d46aaad4c8f82fb7920e7baa8db9e68](https://github.com/samselikoff/ember-cli-mirage/pullb997176f1d46aaad4c8f82fb7920e7baa8db9e68) Serializer blueprint should extend the application serializer @ChrisBarthol + - [ENHANCEMENT][#187](https://github.com/samselikoff/ember-cli-mirage/pull/187) Use native ES class syntax for base Class.extend @cowboyd + - [ENHANCEMENT][#1137](https://github.com/samselikoff/ember-cli-mirage/pull/1137) Bump pretender and disable request tracking in pretender @bekzod + - General enhancements @heroiceric, @turbo87, @kellyselden, @bekzod, @timhaines, @wismer, @mixonic, @rwjblue + ## 0.3.4 Update notes: none From c51f2e7487927e2197f64a1b4a9bda1923c66560 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 26 Oct 2017 14:52:48 -0400 Subject: [PATCH 099/879] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 27229c8fb..1159ca781 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ Changes: - [BUGFIX][#1112](https://github.com/samselikoff/ember-cli-mirage/pull/1112) Fix query in disassociateAllDepentsFromTarget @omghax - [BUGFIX][#0176](https://github.com/samselikoff/ember-cli-mirage/pull/0176) Fix using `association` helper in a dasherized factory @ignatius-j - [ENHANCEMENT][#1138](https://github.com/samselikoff/ember-cli-mirage/pull/1138) Unlock and upgrade ember-get-config @dfreeman - - [ENHANCEMENT][b997176f1d46aaad4c8f82fb7920e7baa8db9e68](https://github.com/samselikoff/ember-cli-mirage/pullb997176f1d46aaad4c8f82fb7920e7baa8db9e68) Serializer blueprint should extend the application serializer @ChrisBarthol + - [ENHANCEMENT] [#b99717](https://github.com/samselikoff/ember-cli-mirage/commit/b997176f1d46aaad4c8f82fb7920e7baa8db9e68) Serializer blueprint should extend the application serializer @ChrisBarthol - [ENHANCEMENT][#187](https://github.com/samselikoff/ember-cli-mirage/pull/187) Use native ES class syntax for base Class.extend @cowboyd - [ENHANCEMENT][#1137](https://github.com/samselikoff/ember-cli-mirage/pull/1137) Bump pretender and disable request tracking in pretender @bekzod - General enhancements @heroiceric, @turbo87, @kellyselden, @bekzod, @timhaines, @wismer, @mixonic, @rwjblue From 1d220160fb6704ea00163d02143def70d290a1aa Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Thu, 26 Oct 2017 14:58:04 -0400 Subject: [PATCH 100/879] Only test in oldest supported Node. --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 28c43b602..d2314983a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,8 +4,6 @@ node_js: # we recommend testing addons with the same minimum supported node version as Ember CLI # so that your addon works for all apps - "4" - - "6" - - "7" sudo: false dist: trusty From 6d822401c11a1d48afe600de1e39a1c5425885fd Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 26 Oct 2017 15:37:27 -0400 Subject: [PATCH 101/879] 0.4.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a1265213d..b3c3f14fe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "0.3.4", + "version": "0.4.0", "description": "A client-side HTTP server to develop, test and demo your Ember app", "keywords": [ "ember-addon", From 9b0f1be33ca08773dd0e1d414f1d00322846e79a Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Thu, 26 Oct 2017 21:55:42 +0200 Subject: [PATCH 102/879] Update "ember-cli-eslint" to v4.2.1 --- package.json | 4 ++-- yarn.lock | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index b3c3f14fe..e07b487f4 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "ember-cli": "~2.16.2", "ember-cli-app-version": "^2.0.0", "ember-cli-dependency-checker": "^2.0.0", - "ember-cli-eslint": "^4.0.0", + "ember-cli-eslint": "^4.2.1", "ember-cli-htmlbars": "^2.0.1", "ember-cli-htmlbars-inline-precompile": "^1.0.0", "ember-cli-inject-live-reload": "^1.4.1", @@ -70,8 +70,8 @@ "ember-fastboot-addon-tests": "^0.4.0", "ember-load-initializers": "^1.0.0", "ember-resolver": "^4.0.0", - "ember-source": "~2.16.0", "ember-sinon": "0.5.1", + "ember-source": "~2.16.0", "eslint-plugin-ember-suave": "^1.0.0", "loader.js": "^4.2.3", "mocha": "^3.4.2" diff --git a/yarn.lock b/yarn.lock index c53a21572..6bb35f6e3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2235,7 +2235,7 @@ ember-cli-dependency-checker@^2.0.0: is-git-url "^1.0.0" semver "^5.3.0" -ember-cli-eslint@^4.0.0: +ember-cli-eslint@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/ember-cli-eslint/-/ember-cli-eslint-4.2.1.tgz#1718875632b3c10fa0da2f665d294c08f24b8ca3" dependencies: From cc085abf458f71e5ef3190cfed77939ef59b01d8 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Thu, 26 Oct 2017 21:56:14 +0200 Subject: [PATCH 103/879] Update "ember-cli-qunit" to v4.1.0-beta.2 --- package.json | 2 +- yarn.lock | 51 +++++++++++++++++++++++++++------------------------ 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/package.json b/package.json index e07b487f4..217c4a26a 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "ember-cli-htmlbars": "^2.0.1", "ember-cli-htmlbars-inline-precompile": "^1.0.0", "ember-cli-inject-live-reload": "^1.4.1", - "ember-cli-qunit": "^4.0.0", + "ember-cli-qunit": "^4.1.0-beta.2", "ember-cli-release": "^0.2.9", "ember-cli-shims": "^1.1.0", "ember-cli-sri": "^2.1.0", diff --git a/yarn.lock b/yarn.lock index 6bb35f6e3..e9e08bbd9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1348,7 +1348,7 @@ broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.2, broccoli symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-funnel@^2.0.0: +broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-2.0.1.tgz#6823c73b675ef78fffa7ab800f083e768b51d449" dependencies: @@ -1795,6 +1795,12 @@ commander@^2.5.0, commander@^2.6.0, commander@~2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" +common-tags@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.4.0.tgz#1187be4f3d4cf0c0427d43f74eef1f73501614c0" + dependencies: + babel-runtime "^6.18.0" + commoner@~0.10.3: version "0.10.8" resolved "https://registry.yarnpkg.com/commoner/-/commoner-0.10.8.tgz#34fc3672cd24393e8bb47e70caa0293811f4f2c5" @@ -2343,20 +2349,12 @@ ember-cli-preprocess-registry@^3.1.0: process-relative-require "^1.0.0" silent-error "^1.0.0" -ember-cli-qunit@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/ember-cli-qunit/-/ember-cli-qunit-4.0.1.tgz#905aa07620ae9fdb417c7e48d45bd2277b62f864" +ember-cli-qunit@^4.1.0-beta.2: + version "4.1.0-beta.2" + resolved "https://registry.yarnpkg.com/ember-cli-qunit/-/ember-cli-qunit-4.1.0-beta.2.tgz#712b91b3f494cc9641486bb5ee7211d87357e6af" dependencies: - broccoli-funnel "^2.0.0" - broccoli-merge-trees "^2.0.0" ember-cli-babel "^6.8.1" - ember-cli-test-loader "^2.2.0" - ember-cli-version-checker "^2.0.0" - ember-qunit "^2.2.0" - qunit-notifications "^0.1.1" - qunitjs "^2.4.0" - resolve "^1.4.0" - silent-error "^1.1.0" + ember-qunit "^3.0.0-beta.2" ember-cli-release@^0.2.9: version "0.2.9" @@ -2602,11 +2600,17 @@ ember-lodash@^4.17.3: ember-cli-babel "^6.4.1" lodash-es "^4.17.4" -ember-qunit@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-2.2.0.tgz#3cdf400031c93a38de781a7304819738753b7f99" +ember-qunit@^3.0.0-beta.2: + version "3.0.0-beta.4" + resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-3.0.0-beta.4.tgz#ae1b1b11e444f6c6155853410384e738ae904464" dependencies: - ember-test-helpers "^0.6.3" + broccoli-funnel "^2.0.1" + broccoli-merge-trees "^2.0.0" + common-tags "^1.4.0" + ember-cli-babel "^6.3.0" + ember-cli-test-loader "^2.2.0" + ember-test-helpers "^0.7.0-beta.7" + qunitjs "^2.4.0" ember-resolver@^4.0.0: version "4.5.0" @@ -2671,9 +2675,12 @@ ember-source@~2.16.0: simple-dom "^0.3.0" simple-html-tokenizer "^0.4.1" -ember-test-helpers@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/ember-test-helpers/-/ember-test-helpers-0.6.3.tgz#f864cdf6f4e75f3f8768d6537785b5ab6e82d907" +ember-test-helpers@^0.7.0-beta.7: + version "0.7.0-beta.8" + resolved "https://registry.yarnpkg.com/ember-test-helpers/-/ember-test-helpers-0.7.0-beta.8.tgz#9b5935a2fa667ac2d9191dd576a2435fcd0f6e10" + dependencies: + broccoli-funnel "^2.0.1" + ember-cli-babel "^6.8.1" ember-try-config@^2.0.1: version "2.1.0" @@ -5119,10 +5126,6 @@ quick-temp@^0.1.0, quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quic rimraf "^2.5.4" underscore.string "~3.3.4" -qunit-notifications@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/qunit-notifications/-/qunit-notifications-0.1.1.tgz#3001afc6a6a77dfbd962ccbcddde12dec5286c09" - qunitjs@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/qunitjs/-/qunitjs-2.4.0.tgz#58f3a81e846687f2e7f637c5bedc9c267f887261" From 7313c23e87feee27a3643647a450d680e7b55121 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Thu, 26 Oct 2017 21:57:39 +0200 Subject: [PATCH 104/879] Convert unit and integration tests to new QUnit testing API --- tests/integration/database-test.js | 25 +- tests/integration/db/identity-manager-test.js | 69 +- tests/integration/ember-data-test.js | 77 +- .../factories/after-create-test.js | 33 +- tests/integration/factories/helpers-test.js | 188 +- tests/integration/http-verbs-test.js | 185 +- tests/integration/load-fixtures-test.js | 47 +- tests/integration/orm/all-test.js | 56 +- tests/integration/orm/attrs-test.js | 23 +- .../belongs-to/1-basic/_regressions-test.js | 36 +- .../orm/belongs-to/1-basic/accessor-test.js | 26 +- .../1-basic/association-create-test.js | 39 +- .../1-basic/association-new-test.js | 43 +- .../1-basic/association-set-id-test.js | 59 +- .../1-basic/association-set-test.js | 63 +- .../orm/belongs-to/1-basic/create-test.js | 88 +- .../orm/belongs-to/1-basic/delete-test.js | 28 +- .../belongs-to/1-basic/instantiating-test.js | 159 +- .../accessor-test.js | 55 +- .../association-create-test.js | 41 +- .../association-new-test.js | 47 +- .../association-set-id-test.js | 67 +- .../association-set-test.js | 71 +- .../10-one-to-one-polymorphic/create-test.js | 105 +- .../10-one-to-one-polymorphic/delete-test.js | 35 +- .../instantiating-test.js | 161 +- .../orm/belongs-to/2-named/accessor-test.js | 26 +- .../2-named/association-create-test.js | 39 +- .../2-named/association-new-test.js | 43 +- .../2-named/association-set-id-test.js | 59 +- .../2-named/association-set-test.js | 63 +- .../orm/belongs-to/2-named/create-test.js | 88 +- .../orm/belongs-to/2-named/delete-test.js | 28 +- .../belongs-to/2-named/instantiating-test.js | 159 +- .../belongs-to/3-reflexive/accessor-test.js | 48 +- .../3-reflexive/association-create-test.js | 51 +- .../3-reflexive/association-new-test.js | 53 +- .../3-reflexive/association-set-id-test.js | 79 +- .../3-reflexive/association-set-test.js | 93 +- .../orm/belongs-to/3-reflexive/create-test.js | 90 +- .../orm/belongs-to/3-reflexive/delete-test.js | 28 +- .../3-reflexive/instantiating-test.js | 161 +- .../4-named-reflexive/accessor-test.js | 55 +- .../association-create-test.js | 39 +- .../4-named-reflexive/association-new-test.js | 43 +- .../association-set-id-test.js | 59 +- .../4-named-reflexive/association-set-test.js | 63 +- .../4-named-reflexive/create-test.js | 111 +- .../4-named-reflexive/delete-test.js | 35 +- .../4-named-reflexive/instantiating-test.js | 161 +- .../accessor-test.js | 55 +- .../association-create-test.js | 39 +- .../association-new-test.js | 43 +- .../association-set-id-test.js | 59 +- .../association-set-test.js | 63 +- .../create-test.js | 111 +- .../delete-test.js | 35 +- .../instantiating-test.js | 161 +- .../6-one-way-reflexive/accessor-test.js | 45 +- .../association-create-test.js | 39 +- .../association-new-test.js | 43 +- .../association-set-id-test.js | 59 +- .../association-set-test.js | 63 +- .../6-one-way-reflexive/create-test.js | 107 +- .../6-one-way-reflexive/delete-test.js | 35 +- .../6-one-way-reflexive/instantiating-test.js | 159 +- .../accessor-test.js | 45 +- .../association-create-test.js | 39 +- .../association-new-test.js | 43 +- .../association-set-id-test.js | 59 +- .../association-set-test.js | 63 +- .../7-named-one-way-reflexive/create-test.js | 107 +- .../7-named-one-way-reflexive/delete-test.js | 35 +- .../instantiating-test.js | 159 +- .../belongs-to/8-one-to-one/accessor-test.js | 55 +- .../8-one-to-one/association-create-test.js | 41 +- .../8-one-to-one/association-new-test.js | 47 +- .../8-one-to-one/association-set-id-test.js | 89 +- .../8-one-to-one/association-set-test.js | 71 +- .../belongs-to/8-one-to-one/create-test.js | 98 +- .../belongs-to/8-one-to-one/delete-test.js | 28 +- .../8-one-to-one/instantiating-test.js | 161 +- .../9-one-way-polymorphic/accessor-test.js | 33 +- .../association-create-test.js | 39 +- .../association-new-test.js | 43 +- .../association-set-id-test.js | 59 +- .../association-set-test.js | 63 +- .../9-one-way-polymorphic/create-test.js | 63 +- .../9-one-way-polymorphic/delete-test.js | 35 +- .../instantiating-test.js | 163 +- tests/integration/orm/belongs-to/misc-test.js | 24 +- .../belongs-to/regressions/issue-1112-test.js | 36 +- .../orm/collection-inflector-test.js | 30 +- tests/integration/orm/collection-test.js | 102 +- tests/integration/orm/create-test.js | 57 +- tests/integration/orm/destroy-test.js | 33 +- tests/integration/orm/find-test.js | 49 +- tests/integration/orm/first-test.js | 17 +- .../orm/has-many/1-basic/accessor-test.js | 36 +- .../1-basic/association-create-test.js | 43 +- .../has-many/1-basic/association-new-test.js | 47 +- .../1-basic/association-set-ids-test.js | 49 +- .../has-many/1-basic/association-set-test.js | 75 +- .../orm/has-many/1-basic/create-test.js | 132 +- .../orm/has-many/1-basic/delete-test.js | 28 +- .../has-many/1-basic/instantiating-test.js | 116 +- .../accessor-test.js | 57 +- .../association-create-test.js | 53 +- .../association-new-test.js | 55 +- .../association-set-ids-test.js | 77 +- .../association-set-test.js | 119 +- .../create-test.js | 109 +- .../delete-test.js | 35 +- .../instantiating-test.js | 157 +- .../orm/has-many/2-named/accessor-test.js | 36 +- .../2-named/association-create-test.js | 43 +- .../has-many/2-named/association-new-test.js | 47 +- .../2-named/association-set-ids-test.js | 49 +- .../has-many/2-named/association-set-test.js | 75 +- .../orm/has-many/2-named/create-test.js | 132 +- .../orm/has-many/2-named/delete-test.js | 28 +- .../has-many/2-named/instantiating-test.js | 116 +- .../orm/has-many/3-reflexive/accessor-test.js | 34 +- .../3-reflexive/association-create-test.js | 63 +- .../3-reflexive/association-new-test.js | 53 +- .../3-reflexive/association-set-ids-test.js | 71 +- .../3-reflexive/association-set-test.js | 119 +- .../orm/has-many/3-reflexive/create-test.js | 142 +- .../orm/has-many/3-reflexive/delete-test.js | 28 +- .../orm/has-many/3-reflexive/new-test.js | 116 +- .../4-named-reflexive/accessor-test.js | 43 +- .../association-create-test.js | 45 +- .../4-named-reflexive/association-new-test.js | 51 +- .../association-set-ids-test.js | 71 +- .../4-named-reflexive/association-set-test.js | 119 +- .../has-many/4-named-reflexive/create-test.js | 169 +- .../has-many/4-named-reflexive/delete-test.js | 35 +- .../has-many/4-named-reflexive/new-test.js | 116 +- .../accessor-test.js | 43 +- .../association-create-test.js | 45 +- .../association-new-test.js | 51 +- .../association-set-ids-test.js | 71 +- .../association-set-test.js | 119 +- .../create-test.js | 169 +- .../delete-test.js | 35 +- .../new-test.js | 157 +- .../6-one-way-reflexive/accessor-test.js | 39 +- .../association-create-test.js | 45 +- .../association-new-test.js | 51 +- .../association-set-ids-test.js | 51 +- .../association-set-test.js | 87 +- .../6-one-way-reflexive/create-test.js | 165 +- .../6-one-way-reflexive/delete-test.js | 35 +- .../has-many/6-one-way-reflexive/new-test.js | 157 +- .../accessor-test.js | 39 +- .../association-create-test.js | 45 +- .../association-new-test.js | 51 +- .../association-set-ids-test.js | 51 +- .../association-set-test.js | 87 +- .../7-named-one-way-reflexive/create-test.js | 165 +- .../7-named-one-way-reflexive/delete-test.js | 35 +- .../7-named-one-way-reflexive/new-test.js | 157 +- .../has-many/8-many-to-many/accessor-test.js | 43 +- .../8-many-to-many/association-create-test.js | 45 +- .../8-many-to-many/association-new-test.js | 51 +- .../association-set-ids-test.js | 71 +- .../8-many-to-many/association-set-test.js | 119 +- .../has-many/8-many-to-many/create-test.js | 148 +- .../has-many/8-many-to-many/delete-test.js | 28 +- .../orm/has-many/8-many-to-many/new-test.js | 116 +- .../9-one-way-polymorphic/accessor-test.js | 45 +- .../association-create-test.js | 51 +- .../association-new-test.js | 51 +- .../association-set-ids-test.js | 49 +- .../association-set-test.js | 75 +- .../9-one-way-polymorphic/create-test.js | 139 +- .../9-one-way-polymorphic/delete-test.js | 35 +- .../instantiating-test.js | 157 +- .../orm/mixed/1-one-to-many/accessor-test.js | 42 +- .../1-one-to-many/association-create-test.js | 49 +- .../1-one-to-many/association-new-test.js | 47 +- .../1-one-to-many/association-set-ids-test.js | 89 +- .../1-one-to-many/association-set-test.js | 131 +- .../orm/mixed/1-one-to-many/create-test.js | 150 +- .../mixed/1-one-to-many/instantiating-test.js | 157 +- .../orm/mixed/2-many-to-one/accessor-test.js | 38 +- .../2-many-to-one/association-create-test.js | 63 +- .../2-many-to-one/association-new-test.js | 61 +- .../2-many-to-one/association-set-ids-test.js | 77 +- .../2-many-to-one/association-set-test.js | 97 +- .../orm/mixed/2-many-to-one/create-test.js | 106 +- .../mixed/2-many-to-one/instantiating-test.js | 187 +- .../accessor-test.js | 55 +- .../association-create-test.js | 57 +- .../association-new-test.js | 51 +- .../association-set-ids-test.js | 89 +- .../association-set-test.js | 131 +- .../3-one-to-many-polymorphic/create-test.js | 107 +- .../3-one-to-many-polymorphic/delete-test.js | 35 +- .../instantiating-test.js | 157 +- .../orm/reinitialize-associations-test.js | 22 +- .../schema-verification/belongs-to-test.js | 334 +-- .../orm/schema-verification/has-many-test.js | 122 +- .../orm/schema-verification/mixed-test.js | 224 +- tests/integration/orm/update-test.js | 144 +- tests/integration/orm/where-test.js | 49 +- tests/integration/passthrough-test.js | 381 ++-- .../route-handlers/delete-shorthand-test.js | 86 +- .../route-handlers/function-handler-test.js | 251 +-- .../route-handlers/get-shorthand-test.js | 243 +-- .../route-handlers/head-shorthand-test.js | 127 +- .../route-handlers/post-shorthand-test.js | 81 +- .../route-handlers/put-shorthand-test.js | 83 +- .../active-model-serializer-test.js | 204 +- .../associations/embedded-collection-test.js | 291 +-- .../base/associations/embedded-model-test.js | 369 ++-- .../base/associations/many-to-many-test.js | 133 +- .../polymorphic-belongs-to-test.js | 79 +- .../associations/polymorphic-has-many-test.js | 81 +- .../sideloading-assorted-collections-test.js | 116 +- .../sideloading-collection-test.js | 389 ++-- .../associations/sideloading-model-test.js | 339 +-- .../base/assorted-collections-test.js | 72 +- .../base/attribute-key-formatting-test.js | 98 +- .../serializers/base/attrs-test.js | 61 +- .../serializers/base/basic-test.js | 111 +- .../serializers/base/full-request-test.js | 189 +- .../base/override-serialize-test.js | 116 +- .../integration/serializers/base/root-test.js | 61 +- .../base/serialize-array-of-models-test.js | 37 +- .../serializers/base/serialize-ids-test.js | 113 +- .../associations/collection-test.js | 819 +++---- .../associations/includes-test.js | 807 +++---- .../associations/key-for-relationship-test.js | 115 +- .../associations/links-test.js | 222 +- .../associations/many-to-many-test.js | 289 +-- .../associations/model-test.js | 731 +++---- .../associations/polymorphic-test.js | 239 ++- .../json-api-serializer/attrs-test.js | 177 +- .../json-api-serializer/base-test.js | 111 +- .../key-formatting-test.js | 131 +- .../serializers/rest-serializer-test.js | 50 +- tests/integration/server-config-test.js | 387 ++-- tests/integration/server-with-orm-test.js | 27 +- .../server/custom-function-handler-test.js | 135 +- .../customized-normalize-method-test.js | 127 +- .../server/factory-creation-test.js | 101 +- .../integration/server/get-full-path-test.js | 177 +- .../server/resource-shorthand-test.js | 819 +++---- .../server/shorthand-sanity-test.js | 217 +- tests/unit/collection-test.js | 96 +- tests/unit/db-test.js | 867 ++++---- tests/unit/db/identity-manager-test.js | 136 +- tests/unit/factory-test.js | 540 ++--- tests/unit/faker-test.js | 58 +- tests/unit/inflector-test.js | 22 +- tests/unit/model-test.js | 48 +- tests/unit/reference-sort-test.js | 56 +- tests/unit/response-test.js | 22 +- .../route-handlers/shorthands/base-test.js | 307 +-- tests/unit/schema-test.js | 48 +- .../active-model-serializer-test.js | 102 +- .../unit/serializers/rest-serializer-test.js | 42 +- tests/unit/server-test.js | 1911 +++++++++-------- tests/unit/utils/normalize-name-test.js | 34 +- 265 files changed, 15143 insertions(+), 14573 deletions(-) diff --git a/tests/integration/database-test.js b/tests/integration/database-test.js index cbe06c26c..3c947a280 100644 --- a/tests/integration/database-test.js +++ b/tests/integration/database-test.js @@ -2,8 +2,8 @@ import {module, test} from 'qunit'; import Server from 'ember-cli-mirage/server'; import { Model, Factory } from 'ember-cli-mirage'; -module('Integration | Database', { - beforeEach() { +module('Integration | Database', function(hooks) { + hooks.beforeEach(function() { this.server = new Server({ environment: 'development', scenarios: { @@ -21,19 +21,20 @@ module('Integration | Database', { ] } }); - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); - } -}); + }); -test(`[regression] When loaded, fixture files correctly update the database's autoincrement id`, function(assert) { - this.server.loadFixtures(); + test(`[regression] When loaded, fixture files correctly update the database's autoincrement id`, function(assert) { + this.server.loadFixtures(); - this.server.schema.authors.create({}); + this.server.schema.authors.create({}); - let { authors } = this.server.db; - assert.equal(authors.length, 2); - assert.deepEqual(authors.map((a) => a.id), ['1', '2']); + let { authors } = this.server.db; + assert.equal(authors.length, 2); + assert.deepEqual(authors.map((a) => a.id), ['1', '2']); + }); }); diff --git a/tests/integration/db/identity-manager-test.js b/tests/integration/db/identity-manager-test.js index f99d780b0..66da77d96 100644 --- a/tests/integration/db/identity-manager-test.js +++ b/tests/integration/db/identity-manager-test.js @@ -22,8 +22,8 @@ const CustomIdentityManager = class { } }; -module('Integration | Server | Factory creation', { - beforeEach() { +module('Integration | Server | Factory creation', function(hooks) { + hooks.beforeEach(function() { this.Post = Model.extend({ author: belongsTo() }); @@ -48,41 +48,42 @@ module('Integration | Server | Factory creation', { }); this.server.timing = 0; this.server.logging = false; - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); - } -}); + }); -test('it uses identity managers defined by config', function(assert) { - let author = server.create('author'); - let comment = server.create('comment'); - let post = server.create('post'); - assert.equal(author.id, 'custom-id', 'custom identity manager defined in config is used'); - assert.equal(post.id, '1', 'ember-cli-mirage identity manager defined in config is used'); - assert.equal(comment.id, '1', 'falls back to ember-cli-mirage identity manager if no one is defined in config for model'); -}); + test('it uses identity managers defined by config', function(assert) { + let author = server.create('author'); + let comment = server.create('comment'); + let post = server.create('post'); + assert.equal(author.id, 'custom-id', 'custom identity manager defined in config is used'); + assert.equal(post.id, '1', 'ember-cli-mirage identity manager defined in config is used'); + assert.equal(comment.id, '1', 'falls back to ember-cli-mirage identity manager if no one is defined in config for model'); + }); -test('attribute hash is passed to identity managers fetch method', function(assert) { - assert.expect(2); + test('attribute hash is passed to identity managers fetch method', function(assert) { + assert.expect(2); - let dataForRecord = { - foo: 'bar' - }; - let IdentityManagerForTest = class { - fetch(data) { - assert.ok(data); - assert.deepEqual(data, dataForRecord); - } - }; - let serverForTest = new Server({ - environment: 'test', - identityManagers: { - application: IdentityManagerForTest - }, - models: { - foo: Model.extend() - } + let dataForRecord = { + foo: 'bar' + }; + let IdentityManagerForTest = class { + fetch(data) { + assert.ok(data); + assert.deepEqual(data, dataForRecord); + } + }; + let serverForTest = new Server({ + environment: 'test', + identityManagers: { + application: IdentityManagerForTest + }, + models: { + foo: Model.extend() + } + }); + serverForTest.create('foo', dataForRecord); }); - serverForTest.create('foo', dataForRecord); }); diff --git a/tests/integration/ember-data-test.js b/tests/integration/ember-data-test.js index 0499351ad..7b9dda5e9 100644 --- a/tests/integration/ember-data-test.js +++ b/tests/integration/ember-data-test.js @@ -6,8 +6,8 @@ import { modelFor } from 'ember-cli-mirage/ember-data'; const CustomFriend = Model.extend(); CustomFriend.__isCustom__ = true; -module('Integration | Ember Data', { - beforeEach() { +module('Integration | Ember Data', function(hooks) { + hooks.beforeEach(function() { this.server = new Server({ environment: 'development', discoverEmberDataModels: true, @@ -22,41 +22,42 @@ module('Integration | Ember Data', { }, factories: {} }); - }, - afterEach() { - this.server.shutdown(); - } -}); - -test(`Ember data models were generated and loaded`, function(assert) { - let { schema } = this.server; - let registry = schema._registry; - - assert.ok(registry.foo, 'Pre defined model Foo has been registered'); - assert.ok(registry.address, 'Ember data model Address has been registered'); - assert.ok(registry.contact, 'Ember data model Contact has been registered'); - assert.ok(registry.user, 'Ember data model User has been registered'); - assert.equal(registry.address.foreignKeys.length, 1, 'Ember data model Address has the correct relationships'); -}); - -test(`Defined mirage models take precedence over autogenerated ones`, function(assert) { - let { schema } = this.server; - let registry = schema._registry; + }); - assert.ok(registry.friend, 'Model Friend has been registered'); - assert.ok(registry.friend.class.__isCustom__, 'Model Friend is not the autogenerated one'); -}); - -test(`Auto generated models can be extended via modelFor`, function(assert) { - let { schema } = this.server; - let registry = schema._registry; - - assert.ok(registry.address, 'Ember data model Address has been registered'); - assert.ok(modelFor('address'), 'Ember data model Address is found'); - assert.equal(typeof modelFor('address').extend, 'function', 'Ember data model Address can be extended'); -}); - -test(`modelFor is only for auto generated models`, function(assert) { - assert.notOk(modelFor('friend').__isCustom__, 'Friend model is not the pre defined one'); - assert.throws(() => modelFor('foo'), () => true, 'Pre defined mirage models cannot be found via modelFor'); + hooks.afterEach(function() { + this.server.shutdown(); + }); + + test(`Ember data models were generated and loaded`, function(assert) { + let { schema } = this.server; + let registry = schema._registry; + + assert.ok(registry.foo, 'Pre defined model Foo has been registered'); + assert.ok(registry.address, 'Ember data model Address has been registered'); + assert.ok(registry.contact, 'Ember data model Contact has been registered'); + assert.ok(registry.user, 'Ember data model User has been registered'); + assert.equal(registry.address.foreignKeys.length, 1, 'Ember data model Address has the correct relationships'); + }); + + test(`Defined mirage models take precedence over autogenerated ones`, function(assert) { + let { schema } = this.server; + let registry = schema._registry; + + assert.ok(registry.friend, 'Model Friend has been registered'); + assert.ok(registry.friend.class.__isCustom__, 'Model Friend is not the autogenerated one'); + }); + + test(`Auto generated models can be extended via modelFor`, function(assert) { + let { schema } = this.server; + let registry = schema._registry; + + assert.ok(registry.address, 'Ember data model Address has been registered'); + assert.ok(modelFor('address'), 'Ember data model Address is found'); + assert.equal(typeof modelFor('address').extend, 'function', 'Ember data model Address can be extended'); + }); + + test(`modelFor is only for auto generated models`, function(assert) { + assert.notOk(modelFor('friend').__isCustom__, 'Friend model is not the pre defined one'); + assert.throws(() => modelFor('foo'), () => true, 'Pre defined mirage models cannot be found via modelFor'); + }); }); diff --git a/tests/integration/factories/after-create-test.js b/tests/integration/factories/after-create-test.js index 3a999ac24..3536974d8 100644 --- a/tests/integration/factories/after-create-test.js +++ b/tests/integration/factories/after-create-test.js @@ -2,8 +2,8 @@ import { module, test } from 'qunit'; import { Model, Factory, belongsTo } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; -module('Integration | Server | Factories | afterCreate', { - beforeEach() { +module('Integration | Server | Factories | afterCreate', function(hooks) { + hooks.beforeEach(function() { this.server = new Server({ environment: 'test', models: { @@ -33,21 +33,22 @@ module('Integration | Server | Factories | afterCreate', { }) } }); - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); - } -}); + }); -test('it works for models', function(assert) { - let author = this.server.create('author'); + test('it works for models', function(assert) { + let author = this.server.create('author'); - assert.equal(author.name, 'Sam'); - assert.deepEqual(this.server.db.posts.length, 1); - assert.deepEqual(this.server.db.posts[0], { id: '1', title: 'Lorem ipsum', authorId: '1' }); - assert.deepEqual(this.server.db.comments.length, 1); - assert.deepEqual(this.server.db.comments[0], { id: '1', text: 'Yo soy el nino', postId: '1' }); -}); + assert.equal(author.name, 'Sam'); + assert.deepEqual(this.server.db.posts.length, 1); + assert.deepEqual(this.server.db.posts[0], { id: '1', title: 'Lorem ipsum', authorId: '1' }); + assert.deepEqual(this.server.db.comments.length, 1); + assert.deepEqual(this.server.db.comments[0], { id: '1', text: 'Yo soy el nino', postId: '1' }); + }); -// test('it works for db records', function(assert) { -// }); + // test('it works for db records', function(assert) { + // }); +}); diff --git a/tests/integration/factories/helpers-test.js b/tests/integration/factories/helpers-test.js index a53c0dfba..de2018224 100644 --- a/tests/integration/factories/helpers-test.js +++ b/tests/integration/factories/helpers-test.js @@ -2,109 +2,109 @@ import { module, test } from 'qunit'; import { Model, Factory, belongsTo, hasMany, trait, association } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; -module('Integration | Server | Factories | helpers', { - afterEach() { +module('Integration | Server | Factories | helpers', function(hooks) { + hooks.afterEach(function() { this.server.shutdown(); - } -}); - -test('it creates associations with "association" helper in a dasherized factory', function(assert) { - this.server = new Server({ - environment: 'test', - models: { - author: Model.extend({ - blogPosts: hasMany() - }), - blogPost: Model.extend({ - author: belongsTo() - }) - }, - factories: { - author: Factory.extend({ - name: 'Sam' - }), - blogPost: Factory.extend({ - title: 'Lorem ipsum', - - author: association() - }) - } - }); - - let blogPost = this.server.create('blog-post'); - - assert.ok(blogPost.author); - - let { db } = this.server; - - assert.equal(db.authors.length, 1); - assert.deepEqual(db.authors[0], { - id: '1', - name: 'Sam', - blogPostIds: ['1'] }); -}); -test('it creates associations with "association" helper combininig with traits', function(assert) { - this.server = new Server({ - environment: 'test', - models: { - author: Model.extend({ - posts: hasMany() - }), - category: Model.extend({ - posts: hasMany('post', { inverse: 'kind' }) - }), - post: Model.extend({ - author: belongsTo(), - kind: belongsTo('category') - }) - }, - factories: { - author: Factory.extend({ - name: 'Sam' - }), - category: Factory.extend({ - name: 'awesome software' - }), - post: Factory.extend({ - title: 'Lorem ipsum', - - author: association(), - - withCategory: trait({ - kind: association() + test('it creates associations with "association" helper in a dasherized factory', function(assert) { + this.server = new Server({ + environment: 'test', + models: { + author: Model.extend({ + blogPosts: hasMany() + }), + blogPost: Model.extend({ + author: belongsTo() }) - }) - } - }); + }, + factories: { + author: Factory.extend({ + name: 'Sam' + }), + blogPost: Factory.extend({ + title: 'Lorem ipsum', + + author: association() + }) + } + }); - let post = this.server.create('post', 'withCategory'); + let blogPost = this.server.create('blog-post'); - assert.ok(post.kind); - assert.ok(post.author); + assert.ok(blogPost.author); - let { db } = this.server; + let { db } = this.server; - assert.equal(db.posts.length, 1); - assert.deepEqual(db.posts[0], { - id: '1', - title: 'Lorem ipsum', - authorId: '1', - kindId: '1' + assert.equal(db.authors.length, 1); + assert.deepEqual(db.authors[0], { + id: '1', + name: 'Sam', + blogPostIds: ['1'] + }); }); - assert.equal(db.authors.length, 1); - assert.deepEqual(db.authors[0], { - id: '1', - name: 'Sam', - postIds: ['1'] - }); - - assert.equal(db.categories.length, 1); - assert.deepEqual(db.categories[0], { - id: '1', - name: 'awesome software', - postIds: ['1'] + test('it creates associations with "association" helper combininig with traits', function(assert) { + this.server = new Server({ + environment: 'test', + models: { + author: Model.extend({ + posts: hasMany() + }), + category: Model.extend({ + posts: hasMany('post', { inverse: 'kind' }) + }), + post: Model.extend({ + author: belongsTo(), + kind: belongsTo('category') + }) + }, + factories: { + author: Factory.extend({ + name: 'Sam' + }), + category: Factory.extend({ + name: 'awesome software' + }), + post: Factory.extend({ + title: 'Lorem ipsum', + + author: association(), + + withCategory: trait({ + kind: association() + }) + }) + } + }); + + let post = this.server.create('post', 'withCategory'); + + assert.ok(post.kind); + assert.ok(post.author); + + let { db } = this.server; + + assert.equal(db.posts.length, 1); + assert.deepEqual(db.posts[0], { + id: '1', + title: 'Lorem ipsum', + authorId: '1', + kindId: '1' + }); + + assert.equal(db.authors.length, 1); + assert.deepEqual(db.authors[0], { + id: '1', + name: 'Sam', + postIds: ['1'] + }); + + assert.equal(db.categories.length, 1); + assert.deepEqual(db.categories[0], { + id: '1', + name: 'awesome software', + postIds: ['1'] + }); }); }); diff --git a/tests/integration/http-verbs-test.js b/tests/integration/http-verbs-test.js index fe2d1cf19..1ace6ca68 100644 --- a/tests/integration/http-verbs-test.js +++ b/tests/integration/http-verbs-test.js @@ -2,8 +2,8 @@ import {module, test} from 'qunit'; import Server from 'ember-cli-mirage/server'; import { Model } from 'ember-cli-mirage'; -module('Integration | HTTP Verbs', { - beforeEach() { +module('Integration | HTTP Verbs', function(hooks) { + hooks.beforeEach(function() { this.server = new Server({ environment: 'development', models: { @@ -12,123 +12,124 @@ module('Integration | HTTP Verbs', { }); this.server.timing = 0; this.server.logging = false; - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); - } -}); + }); -test('mirage responds to get', function(assert) { - assert.expect(1); - let done = assert.async(); + test('mirage responds to get', function(assert) { + assert.expect(1); + let done = assert.async(); - this.server.get('/contacts', function() { - return true; - }); + this.server.get('/contacts', function() { + return true; + }); - $.ajax({ - method: 'GET', - url: '/contacts' - }).done(function(res) { - assert.equal(res, true); - done(); + $.ajax({ + method: 'GET', + url: '/contacts' + }).done(function(res) { + assert.equal(res, true); + done(); + }); }); -}); -test('mirage responds to post', function(assert) { - assert.expect(1); - let done = assert.async(); + test('mirage responds to post', function(assert) { + assert.expect(1); + let done = assert.async(); - this.server.post('/contacts', function() { - return true; - }); + this.server.post('/contacts', function() { + return true; + }); - $.ajax({ - method: 'POST', - url: '/contacts' - }).done(function(res) { - assert.equal(res, true); - done(); + $.ajax({ + method: 'POST', + url: '/contacts' + }).done(function(res) { + assert.equal(res, true); + done(); + }); }); -}); -test('mirage responds to put', function(assert) { - assert.expect(1); - let done = assert.async(); + test('mirage responds to put', function(assert) { + assert.expect(1); + let done = assert.async(); - this.server.put('/contacts', function() { - return true; - }); + this.server.put('/contacts', function() { + return true; + }); - $.ajax({ - method: 'PUT', - url: '/contacts' - }).done(function(res) { - assert.equal(res, true); - done(); + $.ajax({ + method: 'PUT', + url: '/contacts' + }).done(function(res) { + assert.equal(res, true); + done(); + }); }); -}); -test('mirage responds to delete', function(assert) { - assert.expect(1); - let done = assert.async(); + test('mirage responds to delete', function(assert) { + assert.expect(1); + let done = assert.async(); - this.server.delete('/contacts', function() { - return true; - }); + this.server.delete('/contacts', function() { + return true; + }); - $.ajax({ - method: 'DELETE', - url: '/contacts' - }).done(function(res) { - assert.equal(res, true); - done(); + $.ajax({ + method: 'DELETE', + url: '/contacts' + }).done(function(res) { + assert.equal(res, true); + done(); + }); }); -}); -test('mirage responds to patch', function(assert) { - assert.expect(1); - let done = assert.async(); + test('mirage responds to patch', function(assert) { + assert.expect(1); + let done = assert.async(); - this.server.patch('/contacts', function() { - return true; - }); + this.server.patch('/contacts', function() { + return true; + }); - $.ajax({ - method: 'PATCH', - url: '/contacts' - }).done(function(res) { - assert.equal(res, true); - done(); + $.ajax({ + method: 'PATCH', + url: '/contacts' + }).done(function(res) { + assert.equal(res, true); + done(); + }); }); -}); -test('mirage responds to resource', function(assert) { - assert.expect(0); - let done = assert.async(); + test('mirage responds to resource', function(assert) { + assert.expect(0); + let done = assert.async(); - this.server.resource('contacts'); + this.server.resource('contacts'); - $.ajax({ - method: 'GET', - url: '/contacts' - }).done(function() { - done(); + $.ajax({ + method: 'GET', + url: '/contacts' + }).done(function() { + done(); + }); }); -}); -test('response code can be customized', function(assert) { - assert.expect(1); - let done = assert.async(); + test('response code can be customized', function(assert) { + assert.expect(1); + let done = assert.async(); - this.server.get('/contacts', {}, 404); + this.server.get('/contacts', {}, 404); - $.ajax({ - method: 'GET', - url: '/contacts', - complete: function(res) { - assert.ok(res.status, 404); - done(); - } + $.ajax({ + method: 'GET', + url: '/contacts', + complete: function(res) { + assert.ok(res.status, 404); + done(); + } + }); }); }); diff --git a/tests/integration/load-fixtures-test.js b/tests/integration/load-fixtures-test.js index e142ee3e0..e7b3fa166 100644 --- a/tests/integration/load-fixtures-test.js +++ b/tests/integration/load-fixtures-test.js @@ -1,8 +1,8 @@ import {module, test} from 'qunit'; import Server from 'ember-cli-mirage/server'; -module('Integration | Server #loadFixtures', { - beforeEach() { +module('Integration | Server #loadFixtures', function(hooks) { + hooks.beforeEach(function() { this.server = new Server({ environment: 'development', scenarios: { @@ -27,32 +27,33 @@ module('Integration | Server #loadFixtures', { ] } }); - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); - } -}); + }); -test('it can load all fixtures in the map', function(assert) { - this.server.loadFixtures(); + test('it can load all fixtures in the map', function(assert) { + this.server.loadFixtures(); - assert.equal(this.server.db.authors.length, 2); - assert.equal(this.server.db.posts.length, 2); - assert.equal(this.server.db.comments.length, 1); -}); + assert.equal(this.server.db.authors.length, 2); + assert.equal(this.server.db.posts.length, 2); + assert.equal(this.server.db.comments.length, 1); + }); -test('it can load a single named fixture file', function(assert) { - this.server.loadFixtures('authors'); + test('it can load a single named fixture file', function(assert) { + this.server.loadFixtures('authors'); - assert.equal(this.server.db.authors.length, 2); - assert.equal(this.server.db.posts.length, 0); - assert.equal(this.server.db.comments.length, 0); -}); + assert.equal(this.server.db.authors.length, 2); + assert.equal(this.server.db.posts.length, 0); + assert.equal(this.server.db.comments.length, 0); + }); -test('it can load several named single fixtures', function(assert) { - this.server.loadFixtures('authors', 'posts'); + test('it can load several named single fixtures', function(assert) { + this.server.loadFixtures('authors', 'posts'); - assert.equal(this.server.db.authors.length, 2); - assert.equal(this.server.db.posts.length, 2); - assert.equal(this.server.db.comments.length, 0); + assert.equal(this.server.db.authors.length, 2); + assert.equal(this.server.db.posts.length, 2); + assert.equal(this.server.db.comments.length, 0); + }); }); diff --git a/tests/integration/orm/all-test.js b/tests/integration/orm/all-test.js index ae287adbf..5c5a6bf06 100644 --- a/tests/integration/orm/all-test.js +++ b/tests/integration/orm/all-test.js @@ -4,38 +4,38 @@ import Db from 'ember-cli-mirage/db'; import Collection from 'ember-cli-mirage/orm/collection'; import {module, test} from 'qunit'; -module('Integration | ORM | #all'); +module('Integration | ORM | #all', function() { + test('it can return all models', function(assert) { + let db = new Db({ + users: [ + { id: 1, name: 'Link' }, + { id: 2, name: 'Zelda' } + ] + }); + let User = Model.extend(); + let schema = new Schema(db, { + user: User + }); -test('it can return all models', function(assert) { - let db = new Db({ - users: [ - { id: 1, name: 'Link' }, - { id: 2, name: 'Zelda' } - ] - }); - let User = Model.extend(); - let schema = new Schema(db, { - user: User + let users = schema.users.all(); + assert.ok(users instanceof Collection, 'it returns a collection'); + assert.ok(users.models[0] instanceof User, 'each member of the collection is a model'); + assert.equal(users.models.length, 2); + assert.deepEqual(users.models[1].attrs, { id: '2', name: 'Zelda' }); }); - let users = schema.users.all(); - assert.ok(users instanceof Collection, 'it returns a collection'); - assert.ok(users.models[0] instanceof User, 'each member of the collection is a model'); - assert.equal(users.models.length, 2); - assert.deepEqual(users.models[1].attrs, { id: '2', name: 'Zelda' }); -}); + test('it returns an empty array when no models exist', function(assert) { + let db = new Db({ users: [] }); -test('it returns an empty array when no models exist', function(assert) { - let db = new Db({ users: [] }); + let User = Model.extend(); + let schema = new Schema(db, { + user: User + }); - let User = Model.extend(); - let schema = new Schema(db, { - user: User - }); + let users = schema.users.all(); - let users = schema.users.all(); - - assert.ok(users instanceof Collection, 'it returns a collection'); - assert.equal(users.modelName, 'user', 'the collection knows its type'); - assert.equal(users.models.length, 0); + assert.ok(users instanceof Collection, 'it returns a collection'); + assert.equal(users.modelName, 'user', 'the collection knows its type'); + assert.equal(users.models.length, 0); + }); }); diff --git a/tests/integration/orm/attrs-test.js b/tests/integration/orm/attrs-test.js index dffefdb17..12e2c5c3b 100644 --- a/tests/integration/orm/attrs-test.js +++ b/tests/integration/orm/attrs-test.js @@ -4,8 +4,9 @@ import Db from 'ember-cli-mirage/db'; import {module, test} from 'qunit'; var db, schema, User; -module('Integration | ORM | attrs', { - beforeEach() { + +module('Integration | ORM | attrs', function(hooks) { + hooks.beforeEach(function() { db = new Db({ users: [ { id: 1, name: 'Link', evil: false } ] }); @@ -14,17 +15,17 @@ module('Integration | ORM | attrs', { schema = new Schema(db, { user: User }); - } -}); + }); -test('attrs returns the models attributes', function(assert) { - let user = schema.users.find(1); + test('attrs returns the models attributes', function(assert) { + let user = schema.users.find(1); - assert.deepEqual(user.attrs, { id: '1', name: 'Link', evil: false }); -}); + assert.deepEqual(user.attrs, { id: '1', name: 'Link', evil: false }); + }); -test('attributes can be read via plain property access', function(assert) { - let user = schema.users.find(1); + test('attributes can be read via plain property access', function(assert) { + let user = schema.users.find(1); - assert.equal(user.name, 'Link'); + assert.equal(user.name, 'Link'); + }); }); diff --git a/tests/integration/orm/belongs-to/1-basic/_regressions-test.js b/tests/integration/orm/belongs-to/1-basic/_regressions-test.js index a11e2ced0..e8b46c257 100644 --- a/tests/integration/orm/belongs-to/1-basic/_regressions-test.js +++ b/tests/integration/orm/belongs-to/1-basic/_regressions-test.js @@ -3,25 +3,25 @@ import Schema from 'ember-cli-mirage/orm/schema'; import Db from 'ember-cli-mirage/db'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Basic | regressions'); +module('Integration | ORM | Belongs To | Basic | regressions', function() { + test('belongsTo accessors works when foreign key is present but falsy', function(assert) { + let db = new Db({ + posts: [ + { id: 1, authorId: 0, name: 'some post' } + ], + authors: [ + { id: 0, name: 'Foo' } + ] + }); -test('belongsTo accessors works when foreign key is present but falsy', function(assert) { - let db = new Db({ - posts: [ - { id: 1, authorId: 0, name: 'some post' } - ], - authors: [ - { id: 0, name: 'Foo' } - ] - }); + let schema = new Schema(db, { + author: Model.extend(), + post: Model.extend({ + author: belongsTo() + }) + }); - let schema = new Schema(db, { - author: Model.extend(), - post: Model.extend({ - author: belongsTo() - }) + let post = schema.posts.find(1); + assert.equal(post.author.name, 'Foo'); }); - - let post = schema.posts.find(1); - assert.equal(post.author.name, 'Foo'); }); diff --git a/tests/integration/orm/belongs-to/1-basic/accessor-test.js b/tests/integration/orm/belongs-to/1-basic/accessor-test.js index 8421d0335..72a8e9fec 100644 --- a/tests/integration/orm/belongs-to/1-basic/accessor-test.js +++ b/tests/integration/orm/belongs-to/1-basic/accessor-test.js @@ -1,22 +1,22 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Basic | accessor', { - beforeEach() { +module('Integration | ORM | Belongs To | Basic | accessor', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); - } -}); + }); -/* - The reference to a belongs-to association is correct, for all states -*/ -states.forEach((state) => { + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ post, author ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ post, author ] = this.helper[state](); - assert.deepEqual(post.author, author ? author : null, 'the model reference is correct'); - assert.equal(post.authorId, author ? author.id : null, 'the modelId reference is correct'); - }); + assert.deepEqual(post.author, author ? author : null, 'the model reference is correct'); + assert.equal(post.authorId, author ? author.id : null, 'the modelId reference is correct'); + }); + }); }); diff --git a/tests/integration/orm/belongs-to/1-basic/association-create-test.js b/tests/integration/orm/belongs-to/1-basic/association-create-test.js index 73b7e2d8b..50f09a186 100644 --- a/tests/integration/orm/belongs-to/1-basic/association-create-test.js +++ b/tests/integration/orm/belongs-to/1-basic/association-create-test.js @@ -1,26 +1,29 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Basic | association #create', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Basic | association #create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can create a belongs-to association, for all states -*/ -states.forEach((state) => { + /* + The model can create a belongs-to association, for all states + */ + states.forEach((state) => { - test(`a ${state} can create an associated parent`, function(assert) { - let [ post ] = this.helper[state](); + test(`a ${state} can create an associated parent`, function(assert) { + let [ post ] = this.helper[state](); - let ganon = post.createAuthor({ name: 'Ganon' }); + let ganon = post.createAuthor({ name: 'Ganon' }); - assert.ok(ganon.id, 'the parent was persisted'); - assert.deepEqual(post.author.attrs, ganon.attrs); - assert.equal(post.authorId, ganon.id); - assert.equal(this.helper.schema.posts.find(post.id).authorId, ganon.id, 'the child was persisted'); - }); + assert.ok(ganon.id, 'the parent was persisted'); + assert.deepEqual(post.author.attrs, ganon.attrs); + assert.equal(post.authorId, ganon.id); + assert.equal(this.helper.schema.posts.find(post.id).authorId, ganon.id, 'the child was persisted'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/1-basic/association-new-test.js b/tests/integration/orm/belongs-to/1-basic/association-new-test.js index db21b3c10..364c4a41d 100644 --- a/tests/integration/orm/belongs-to/1-basic/association-new-test.js +++ b/tests/integration/orm/belongs-to/1-basic/association-new-test.js @@ -1,31 +1,34 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Basic | association #new', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Basic | association #new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can make a new unsaved belongs-to association, for all states -*/ + /* + The model can make a new unsaved belongs-to association, for all states + */ -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can build a new associated parent`, function(assert) { - let [ post ] = this.helper[state](); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ post ] = this.helper[state](); - let ganon = post.newAuthor({ name: 'Ganon' }); + let ganon = post.newAuthor({ name: 'Ganon' }); - assert.ok(!ganon.id, 'the parent was not persisted'); - assert.deepEqual(post.author, ganon); - assert.equal(post.authorId, null); + assert.ok(!ganon.id, 'the parent was not persisted'); + assert.deepEqual(post.author, ganon); + assert.equal(post.authorId, null); - post.save(); + post.save(); - assert.ok(ganon.id, 'saving the child persists the parent'); - assert.equal(post.authorId, ganon.id, 'the childs fk was updated'); - }); + assert.ok(ganon.id, 'saving the child persists the parent'); + assert.equal(post.authorId, ganon.id, 'the childs fk was updated'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/1-basic/association-set-id-test.js b/tests/integration/orm/belongs-to/1-basic/association-set-id-test.js index f5dde0c89..75424aa75 100644 --- a/tests/integration/orm/belongs-to/1-basic/association-set-id-test.js +++ b/tests/integration/orm/belongs-to/1-basic/association-set-id-test.js @@ -1,41 +1,44 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Basic | association #setId', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Basic | association #setId', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parentId, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ post ] = this.helper[state](); - let savedAuthor = this.helper.savedParent(); + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ post ] = this.helper[state](); + let savedAuthor = this.helper.savedParent(); - post.authorId = savedAuthor.id; + post.authorId = savedAuthor.id; - assert.equal(post.authorId, savedAuthor.id); - assert.deepEqual(post.author.attrs, savedAuthor.attrs); - }); + assert.equal(post.authorId, savedAuthor.id); + assert.deepEqual(post.author.attrs, savedAuthor.attrs); + }); -}); + }); -[ - 'savedChildSavedParent', - 'newChildSavedParent' -].forEach((state) => { + [ + 'savedChildSavedParent', + 'newChildSavedParent' + ].forEach((state) => { - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ post ] = this.helper[state](); + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ post ] = this.helper[state](); - post.authorId = null; + post.authorId = null; - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - }); + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/1-basic/association-set-test.js b/tests/integration/orm/belongs-to/1-basic/association-set-test.js index 4022e3dde..0b368c261 100644 --- a/tests/integration/orm/belongs-to/1-basic/association-set-test.js +++ b/tests/integration/orm/belongs-to/1-basic/association-set-test.js @@ -1,44 +1,47 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Basic | association #set', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Basic | association #set', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parent, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ post ] = this.helper[state](); - let savedAuthor = this.helper.savedParent(); + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ post ] = this.helper[state](); + let savedAuthor = this.helper.savedParent(); - post.author = savedAuthor; + post.author = savedAuthor; - assert.equal(post.authorId, savedAuthor.id); - assert.deepEqual(post.author, savedAuthor); - }); + assert.equal(post.authorId, savedAuthor.id); + assert.deepEqual(post.author, savedAuthor); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ post ] = this.helper[state](); - let newAuthor = this.helper.newParent(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ post ] = this.helper[state](); + let newAuthor = this.helper.newParent(); - post.author = newAuthor; + post.author = newAuthor; - assert.equal(post.authorId, null); - assert.deepEqual(post.author, newAuthor); - }); + assert.equal(post.authorId, null); + assert.deepEqual(post.author, newAuthor); + }); - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ post ] = this.helper[state](); + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ post ] = this.helper[state](); - post.author = null; + post.author = null; - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - }); + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/1-basic/create-test.js b/tests/integration/orm/belongs-to/1-basic/create-test.js index 3facc387c..56ee68c3c 100644 --- a/tests/integration/orm/belongs-to/1-basic/create-test.js +++ b/tests/integration/orm/belongs-to/1-basic/create-test.js @@ -2,59 +2,59 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Basic | create', { - beforeEach() { +module('Integration | ORM | Belongs To | Basic | create', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); this.helper.schema.registerModel('foo', Model); - } -}); - -test('it sets up associations correctly when passing in the foreign key', function(assert) { - let author = this.helper.schema.create('author'); - let post = this.helper.schema.create('post', { - authorId: author.id }); - assert.equal(post.authorId, author.id); - assert.deepEqual(post.author.attrs, author.attrs); - assert.equal(this.helper.schema.db.authors.length, 1); - assert.deepEqual(this.helper.schema.db.authors[0], { id: '1' }); - assert.equal(this.helper.schema.db.posts.length, 1); - assert.deepEqual(this.helper.schema.db.posts[0], { id: '1', authorId: '1' }); -}); + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let author = this.helper.schema.create('author'); + let post = this.helper.schema.create('post', { + authorId: author.id + }); -test('it sets up associations correctly when passing in the association itself', function(assert) { - let author = this.helper.schema.create('author'); - let post = this.helper.schema.create('post', { - author + assert.equal(post.authorId, author.id); + assert.deepEqual(post.author.attrs, author.attrs); + assert.equal(this.helper.schema.db.authors.length, 1); + assert.deepEqual(this.helper.schema.db.authors[0], { id: '1' }); + assert.equal(this.helper.schema.db.posts.length, 1); + assert.deepEqual(this.helper.schema.db.posts[0], { id: '1', authorId: '1' }); }); - assert.equal(post.authorId, author.id); - assert.deepEqual(post.author.attrs, author.attrs); - assert.equal(this.helper.schema.db.authors.length, 1); - assert.deepEqual(this.helper.schema.db.authors[0], { id: '1' }); - assert.equal(this.helper.schema.db.posts.length, 1); - assert.deepEqual(this.helper.schema.db.posts[0], { id: '1', authorId: '1' }); -}); + test('it sets up associations correctly when passing in the association itself', function(assert) { + let author = this.helper.schema.create('author'); + let post = this.helper.schema.create('post', { + author + }); -test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + assert.equal(post.authorId, author.id); + assert.deepEqual(post.author.attrs, author.attrs); + assert.equal(this.helper.schema.db.authors.length, 1); + assert.deepEqual(this.helper.schema.db.authors[0], { id: '1' }); + assert.equal(this.helper.schema.db.posts.length, 1); + assert.deepEqual(this.helper.schema.db.posts[0], { id: '1', authorId: '1' }); + }); - assert.throws(function() { - schema.create('post', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); -}); + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('post', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); + }); -test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); - assert.throws(function() { - schema.create('post', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); + assert.throws(function() { + schema.create('post', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); }); diff --git a/tests/integration/orm/belongs-to/1-basic/delete-test.js b/tests/integration/orm/belongs-to/1-basic/delete-test.js index d58a4e1f9..d284dcc6d 100644 --- a/tests/integration/orm/belongs-to/1-basic/delete-test.js +++ b/tests/integration/orm/belongs-to/1-basic/delete-test.js @@ -1,24 +1,24 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Basic | delete', { - beforeEach() { +module('Integration | ORM | Belongs To | Basic | delete', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); - } -}); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ post, author ] = this.helper[state](); + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ post, author ] = this.helper[state](); - if (author) { - author.destroy(); - post.reload(); - } + if (author) { + author.destroy(); + post.reload(); + } - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - }); + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + }); + }); }); diff --git a/tests/integration/orm/belongs-to/1-basic/instantiating-test.js b/tests/integration/orm/belongs-to/1-basic/instantiating-test.js index 225a3d639..e5655c25e 100644 --- a/tests/integration/orm/belongs-to/1-basic/instantiating-test.js +++ b/tests/integration/orm/belongs-to/1-basic/instantiating-test.js @@ -1,82 +1,85 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Basic | instantiating', { - beforeEach() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module( + 'Integration | ORM | Belongs To | Basic | instantiating', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the child accepts a saved parent id', function(assert) { + let author = this.helper.savedParent(); + let post = this.schema.posts.new({ authorId: author.id }); + + assert.equal(post.authorId, author.id); + assert.deepEqual(post.author, author); + assert.deepEqual(post.attrs, { authorId: author.id }); + }); + + test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.posts.new({ authorId: 2 }); + }, /You're instantiating a post that has a authorId of 2, but that record doesn't exist in the database/); + }); + + test('the child accepts a null parent id', function(assert) { + let post = this.schema.posts.new({ authorId: null }); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + assert.deepEqual(post.attrs, { authorId: null }); + }); + + test('the child accepts a saved parent model', function(assert) { + let author = this.helper.savedParent(); + let post = this.schema.posts.new({ author }); + + assert.equal(post.authorId, 1); + assert.deepEqual(post.author, author); + }); + + test('the child accepts a new parent model', function(assert) { + let zelda = this.schema.authors.new({ name: 'Zelda' }); + let post = this.schema.posts.new({ author: zelda }); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, zelda); + assert.deepEqual(post.attrs, { authorId: null }); + }); + + test('the child accepts a null parent model', function(assert) { + let post = this.schema.posts.new({ author: null }); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + assert.deepEqual(post.attrs, { authorId: null }); + }); + + test('the child accepts a parent model and id', function(assert) { + let author = this.helper.savedParent(); + let post = this.schema.posts.new({ author, authorId: author.id }); + + assert.equal(post.authorId, '1'); + assert.deepEqual(post.author, author); + assert.deepEqual(post.attrs, { authorId: author.id }); + }); + + test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let post = this.schema.posts.new({}); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + assert.deepEqual(post.attrs, { authorId: null }); + }); + + test('the child accepts no reference to a parent id or model', function(assert) { + let post = this.schema.posts.new(); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + assert.deepEqual(post.attrs, { authorId: null }); + }); } -}); - -test('the child accepts a saved parent id', function(assert) { - let author = this.helper.savedParent(); - let post = this.schema.posts.new({ authorId: author.id }); - - assert.equal(post.authorId, author.id); - assert.deepEqual(post.author, author); - assert.deepEqual(post.attrs, { authorId: author.id }); -}); - -test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.posts.new({ authorId: 2 }); - }, /You're instantiating a post that has a authorId of 2, but that record doesn't exist in the database/); -}); - -test('the child accepts a null parent id', function(assert) { - let post = this.schema.posts.new({ authorId: null }); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - assert.deepEqual(post.attrs, { authorId: null }); -}); - -test('the child accepts a saved parent model', function(assert) { - let author = this.helper.savedParent(); - let post = this.schema.posts.new({ author }); - - assert.equal(post.authorId, 1); - assert.deepEqual(post.author, author); -}); - -test('the child accepts a new parent model', function(assert) { - let zelda = this.schema.authors.new({ name: 'Zelda' }); - let post = this.schema.posts.new({ author: zelda }); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, zelda); - assert.deepEqual(post.attrs, { authorId: null }); -}); - -test('the child accepts a null parent model', function(assert) { - let post = this.schema.posts.new({ author: null }); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - assert.deepEqual(post.attrs, { authorId: null }); -}); - -test('the child accepts a parent model and id', function(assert) { - let author = this.helper.savedParent(); - let post = this.schema.posts.new({ author, authorId: author.id }); - - assert.equal(post.authorId, '1'); - assert.deepEqual(post.author, author); - assert.deepEqual(post.attrs, { authorId: author.id }); -}); - -test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let post = this.schema.posts.new({}); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - assert.deepEqual(post.attrs, { authorId: null }); -}); - -test('the child accepts no reference to a parent id or model', function(assert) { - let post = this.schema.posts.new(); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - assert.deepEqual(post.attrs, { authorId: null }); -}); +); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/accessor-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/accessor-test.js index 5ab9ef182..ed84ab33d 100644 --- a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/accessor-test.js +++ b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/accessor-test.js @@ -1,34 +1,37 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One-to-one Polymorphic | accessor', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | One-to-one Polymorphic | accessor', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The reference to a belongs-to association is correct, for all states -*/ -states.forEach((state) => { + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ comment, post ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ comment, post ] = this.helper[state](); - // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison - if (post) { - assert.deepEqual(comment.commentable.attrs, post.attrs, 'the model reference is correct'); - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }, 'the modelId reference is correct'); - } else { - assert.deepEqual(comment.commentable, null, 'the model reference is correct'); - assert.equal(comment.commentableId, null, 'the modelId reference is correct'); - } + // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison + if (post) { + assert.deepEqual(comment.commentable.attrs, post.attrs, 'the model reference is correct'); + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }, 'the modelId reference is correct'); + } else { + assert.deepEqual(comment.commentable, null, 'the model reference is correct'); + assert.equal(comment.commentableId, null, 'the modelId reference is correct'); + } - // If there's a post in this state, make sure the inverse association is correct - if (post) { - assert.deepEqual(post.comment.attrs, comment.attrs, 'the inverse model reference is correct'); - assert.equal(post.commentId, comment.id, 'the inverse modelId reference is correct'); - } - }); + // If there's a post in this state, make sure the inverse association is correct + if (post) { + assert.deepEqual(post.comment.attrs, comment.attrs, 'the inverse model reference is correct'); + assert.equal(post.commentId, comment.id, 'the inverse modelId reference is correct'); + } + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-create-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-create-test.js index 4fb7e164d..f8071752f 100644 --- a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-create-test.js +++ b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-create-test.js @@ -1,27 +1,30 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One-to-one Polymorphic | association #create', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | One-to-one Polymorphic | association #create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can create a belongs-to association, for all states -*/ -states.forEach((state) => { + /* + The model can create a belongs-to association, for all states + */ + states.forEach((state) => { - test(`a ${state} can create an associated parent`, function(assert) { - let [ comment ] = this.helper[state](); + test(`a ${state} can create an associated parent`, function(assert) { + let [ comment ] = this.helper[state](); - let post = comment.createCommentable('post', { title: 'Lorem' }); + let post = comment.createCommentable('post', { title: 'Lorem' }); - assert.ok(post.id, 'the parent was persisted'); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.deepEqual(post.comment.attrs, comment.attrs, 'the inverse was set'); - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); - assert.deepEqual(this.helper.schema.comments.find(comment.id).commentableId, { type: 'post', id: post.id }, 'the comment was persisted'); - }); + assert.ok(post.id, 'the parent was persisted'); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.deepEqual(post.comment.attrs, comment.attrs, 'the inverse was set'); + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); + assert.deepEqual(this.helper.schema.comments.find(comment.id).commentableId, { type: 'post', id: post.id }, 'the comment was persisted'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-new-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-new-test.js index 5e711d21a..46c1b5812 100644 --- a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-new-test.js +++ b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-new-test.js @@ -1,33 +1,36 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One-to-one Polymorphic | association #new', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | One-to-one Polymorphic | association #new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can make a new unsaved belongs-to association, for all states -*/ + /* + The model can make a new unsaved belongs-to association, for all states + */ -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can build a new associated parent`, function(assert) { - let [ comment ] = this.helper[state](); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ comment ] = this.helper[state](); - let post = comment.newCommentable('post', { age: 300 }); + let post = comment.newCommentable('post', { age: 300 }); - assert.ok(!post.id, 'the parent was not persisted'); - assert.deepEqual(comment.commentable, post); - assert.deepEqual(comment.commentableId, { type: 'post', id: undefined }); - assert.deepEqual(post.comment, comment, 'the inverse was set'); - assert.equal(post.commentId, comment.id); + assert.ok(!post.id, 'the parent was not persisted'); + assert.deepEqual(comment.commentable, post); + assert.deepEqual(comment.commentableId, { type: 'post', id: undefined }); + assert.deepEqual(post.comment, comment, 'the inverse was set'); + assert.equal(post.commentId, comment.id); - comment.save(); + comment.save(); - assert.ok(post.id, 'saving the child persists the parent'); - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }, 'the childs fk was updated'); - }); + assert.ok(post.id, 'saving the child persists the parent'); + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }, 'the childs fk was updated'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-id-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-id-test.js index 99022024f..3e3689268 100644 --- a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-id-test.js +++ b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-id-test.js @@ -1,47 +1,50 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One-to-one Polymorphic | association #setId', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | One-to-one Polymorphic | association #setId', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parentId, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ comment ] = this.helper[state](); - let post = this.helper.savedParent(); + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ comment ] = this.helper[state](); + let post = this.helper.savedParent(); - comment.commentableId = { type: 'post', id: post.id }; + comment.commentableId = { type: 'post', id: post.id }; - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); - assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); + assert.deepEqual(comment.commentable.attrs, post.attrs); - comment.save(); - post.reload(); + comment.save(); + post.reload(); - assert.equal(post.commentId, comment.id, 'the inverse was set'); - assert.deepEqual(post.comment.attrs, comment.attrs); - }); + assert.equal(post.commentId, comment.id, 'the inverse was set'); + assert.deepEqual(post.comment.attrs, comment.attrs); + }); -}); + }); -[ - 'savedChildSavedParent', - 'newChildSavedParent' -].forEach((state) => { + [ + 'savedChildSavedParent', + 'newChildSavedParent' + ].forEach((state) => { - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ comment ] = this.helper[state](); + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ comment ] = this.helper[state](); - comment.commentableId = null; + comment.commentableId = null; - assert.equal(comment.commentableId, null); - assert.equal(comment.commentable, null); - }); + assert.equal(comment.commentableId, null); + assert.equal(comment.commentable, null); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-test.js index c9cddccbe..a05b1b6b9 100644 --- a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-test.js +++ b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-test.js @@ -1,49 +1,52 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One-to-one Polymorphic | association #set', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | One-to-one Polymorphic | association #set', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parent, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ comment ] = this.helper[state](); - let post = this.helper.savedParent(); + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ comment ] = this.helper[state](); + let post = this.helper.savedParent(); - comment.commentable = post; + comment.commentable = post; - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.equal(post.commentId, comment.id, 'the inverse was set'); - assert.deepEqual(post.comment.attrs, comment.attrs); - }); + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.equal(post.commentId, comment.id, 'the inverse was set'); + assert.deepEqual(post.comment.attrs, comment.attrs); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ comment ] = this.helper[state](); - let post = this.helper.newParent(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ comment ] = this.helper[state](); + let post = this.helper.newParent(); - comment.commentable = post; + comment.commentable = post; - assert.deepEqual(comment.commentableId, { type: 'post', id: undefined }); - assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.deepEqual(comment.commentableId, { type: 'post', id: undefined }); + assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.equal(post.commentId, comment.id, 'the inverse was set'); - assert.deepEqual(post.comment.attrs, comment.attrs); - }); + assert.equal(post.commentId, comment.id, 'the inverse was set'); + assert.deepEqual(post.comment.attrs, comment.attrs); + }); - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ comment ] = this.helper[state](); + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ comment ] = this.helper[state](); - comment.commentable = null; + comment.commentable = null; - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - }); + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/create-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/create-test.js index 9a116c389..293d88583 100644 --- a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/create-test.js +++ b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/create-test.js @@ -2,64 +2,67 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One-to-one Polymorphic | create', { - beforeEach() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - } -}); +module( + 'Integration | ORM | Belongs To | One-to-one Polymorphic | create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + }); -test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let post = schema.create('post'); - let comment = schema.create('comment', { - commentableId: { type: 'post', id: post.id } - }); - post.reload(); + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let post = schema.create('post'); + let comment = schema.create('comment', { + commentableId: { type: 'post', id: post.id } + }); + post.reload(); - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.deepEqual(post.comment.attrs, comment.attrs); - assert.equal(schema.db.comments.length, 1); - assert.equal(schema.db.posts.length, 1); - assert.deepEqual(schema.db.comments[0], { id: '1', commentableId: { type: 'post', id: '1' } }); - assert.deepEqual(schema.db.posts[0], { id: '1', commentId: '1' }); -}); + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.deepEqual(post.comment.attrs, comment.attrs); + assert.equal(schema.db.comments.length, 1); + assert.equal(schema.db.posts.length, 1); + assert.deepEqual(schema.db.comments[0], { id: '1', commentableId: { type: 'post', id: '1' } }); + assert.deepEqual(schema.db.posts[0], { id: '1', commentId: '1' }); + }); -test('it sets up associations correctly when passing in the association itself', function(assert) { - let { schema } = this.helper; - let post = schema.create('post'); - let comment = schema.create('comment', { - commentable: post - }); + test('it sets up associations correctly when passing in the association itself', function(assert) { + let { schema } = this.helper; + let post = schema.create('post'); + let comment = schema.create('comment', { + commentable: post + }); - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.deepEqual(post.comment.attrs, comment.attrs); - assert.equal(schema.db.comments.length, 1); - assert.equal(schema.db.posts.length, 1); - assert.deepEqual(schema.db.comments[0], { id: '1', commentableId: { type: 'post', id: '1' } }); - assert.deepEqual(schema.db.posts[0], { id: '1', commentId: '1' }); -}); + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.deepEqual(post.comment.attrs, comment.attrs); + assert.equal(schema.db.comments.length, 1); + assert.equal(schema.db.posts.length, 1); + assert.deepEqual(schema.db.comments[0], { id: '1', commentableId: { type: 'post', id: '1' } }); + assert.deepEqual(schema.db.posts[0], { id: '1', commentId: '1' }); + }); -test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.create('comment', { - foo: schema.create('foo') + assert.throws(function() { + schema.create('comment', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); }); - }, /you haven't defined that key as an association on your model/); -}); -test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); - assert.throws(function() { - schema.create('comment', { - foos: schema.foos.all() + assert.throws(function() { + schema.create('comment', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); }); - }, /you haven't defined that key as an association on your model/); -}); + } +); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/delete-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/delete-test.js index 5618e4697..36660e133 100644 --- a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/delete-test.js +++ b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/delete-test.js @@ -1,24 +1,27 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One-to-one Polymorphic | delete', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | One-to-one Polymorphic | delete', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ comment, post ] = this.helper[state](); + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ comment, post ] = this.helper[state](); - if (post) { - post.destroy(); - comment.reload(); - } + if (post) { + post.destroy(); + comment.reload(); + } - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - }); + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/instantiating-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/instantiating-test.js index bb1a83e78..c15c7f00a 100644 --- a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/instantiating-test.js +++ b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/instantiating-test.js @@ -1,83 +1,86 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One-to-one Polymorphic | instantiating', { - beforeEach() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module( + 'Integration | ORM | Belongs To | One-to-one Polymorphic | instantiating', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the child accepts a saved parent id', function(assert) { + let post = this.helper.savedParent(); + let comment = this.schema.comments.new({ commentableId: { type: 'post', id: post.id } }); + + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.deepEqual(comment.attrs, { commentableId: { type: 'post', id: post.id } }); + }); + + test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.comments.new({ commentableId: { type: 'post', id: 2 } }); + }, /You're instantiating a comment that has a commentableId of post:2, but that record doesn't exist in the database/); + }); + + test('the child accepts a null parent id', function(assert) { + let comment = this.schema.comments.new({ commentableId: null }); + + assert.equal(comment.commentableId, null); + assert.equal(comment.commentable, null); + assert.deepEqual(comment.attrs, { commentableId: null }); + }); + + test('the child accepts a saved parent model', function(assert) { + let post = this.helper.savedParent(); + let comment = this.schema.comments.new({ commentable: post }); + + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.deepEqual(comment.attrs, { commentableId: null }); // this would update when saved + }); + + test('the child accepts a new parent model', function(assert) { + let post = this.schema.posts.new({ age: 300 }); + let comment = this.schema.comments.new({ commentable: post }); + + assert.deepEqual(comment.commentableId, { type: 'post', id: undefined }); + assert.deepEqual(comment.commentable, post); + assert.deepEqual(comment.attrs, { commentableId: null }); + }); + + test('the child accepts a null parent model', function(assert) { + let comment = this.schema.comments.new({ commentable: null }); + + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + assert.deepEqual(comment.attrs, { commentableId: null }); + }); + + test('the child accepts a parent model and id', function(assert) { + let post = this.helper.savedParent(); + let comment = this.schema.comments.new({ commentable: post, commentableId: { type: 'post', id: post.id } }); + + assert.deepEqual(comment.commentableId, { type: 'post', id: '1' }); + assert.deepEqual(comment.commentable, post); + assert.deepEqual(comment.attrs, { commentableId: { type: 'post', id: post.id } }); + }); + + test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let comment = this.schema.comments.new({}); + + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + assert.deepEqual(comment.attrs, { commentableId: null }); + }); + + test('the child accepts no reference to a parent id or model', function(assert) { + let comment = this.schema.comments.new(); + + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + assert.deepEqual(comment.attrs, { commentableId: null }); + }); } -}); - -test('the child accepts a saved parent id', function(assert) { - let post = this.helper.savedParent(); - let comment = this.schema.comments.new({ commentableId: { type: 'post', id: post.id } }); - - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.deepEqual(comment.attrs, { commentableId: { type: 'post', id: post.id } }); -}); - -test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.comments.new({ commentableId: { type: 'post', id: 2 } }); - }, /You're instantiating a comment that has a commentableId of post:2, but that record doesn't exist in the database/); -}); - -test('the child accepts a null parent id', function(assert) { - let comment = this.schema.comments.new({ commentableId: null }); - - assert.equal(comment.commentableId, null); - assert.equal(comment.commentable, null); - assert.deepEqual(comment.attrs, { commentableId: null }); -}); - -test('the child accepts a saved parent model', function(assert) { - let post = this.helper.savedParent(); - let comment = this.schema.comments.new({ commentable: post }); - - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.deepEqual(comment.attrs, { commentableId: null }); // this would update when saved -}); - -test('the child accepts a new parent model', function(assert) { - let post = this.schema.posts.new({ age: 300 }); - let comment = this.schema.comments.new({ commentable: post }); - - assert.deepEqual(comment.commentableId, { type: 'post', id: undefined }); - assert.deepEqual(comment.commentable, post); - assert.deepEqual(comment.attrs, { commentableId: null }); -}); - -test('the child accepts a null parent model', function(assert) { - let comment = this.schema.comments.new({ commentable: null }); - - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - assert.deepEqual(comment.attrs, { commentableId: null }); -}); - -test('the child accepts a parent model and id', function(assert) { - let post = this.helper.savedParent(); - let comment = this.schema.comments.new({ commentable: post, commentableId: { type: 'post', id: post.id } }); - - assert.deepEqual(comment.commentableId, { type: 'post', id: '1' }); - assert.deepEqual(comment.commentable, post); - assert.deepEqual(comment.attrs, { commentableId: { type: 'post', id: post.id } }); -}); - -test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let comment = this.schema.comments.new({}); - - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - assert.deepEqual(comment.attrs, { commentableId: null }); -}); - -test('the child accepts no reference to a parent id or model', function(assert) { - let comment = this.schema.comments.new(); - - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - assert.deepEqual(comment.attrs, { commentableId: null }); -}); +); diff --git a/tests/integration/orm/belongs-to/2-named/accessor-test.js b/tests/integration/orm/belongs-to/2-named/accessor-test.js index 9b243357c..b4c0c8dca 100644 --- a/tests/integration/orm/belongs-to/2-named/accessor-test.js +++ b/tests/integration/orm/belongs-to/2-named/accessor-test.js @@ -1,22 +1,22 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named | accessor', { - beforeEach() { +module('Integration | ORM | Belongs To | Named | accessor', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); - } -}); + }); -/* - The reference to a belongs-to association is correct, for all states -*/ -states.forEach((state) => { + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ post, author ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ post, author ] = this.helper[state](); - assert.deepEqual(post.author, author ? author : null, 'the model reference is correct'); - assert.equal(post.authorId, author ? author.id : null, 'the modelId reference is correct'); - }); + assert.deepEqual(post.author, author ? author : null, 'the model reference is correct'); + assert.equal(post.authorId, author ? author.id : null, 'the modelId reference is correct'); + }); + }); }); diff --git a/tests/integration/orm/belongs-to/2-named/association-create-test.js b/tests/integration/orm/belongs-to/2-named/association-create-test.js index e1ce09a5a..65ccfffca 100644 --- a/tests/integration/orm/belongs-to/2-named/association-create-test.js +++ b/tests/integration/orm/belongs-to/2-named/association-create-test.js @@ -1,26 +1,29 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named | association #create', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Named | association #create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can create a belongs-to association, for all states -*/ -states.forEach((state) => { + /* + The model can create a belongs-to association, for all states + */ + states.forEach((state) => { - test(`a ${state} can create an associated parent`, function(assert) { - let [ post ] = this.helper[state](); + test(`a ${state} can create an associated parent`, function(assert) { + let [ post ] = this.helper[state](); - let ganon = post.createAuthor({ name: 'Ganon' }); + let ganon = post.createAuthor({ name: 'Ganon' }); - assert.ok(ganon.id, 'the parent was persisted'); - assert.deepEqual(post.author, ganon); - assert.equal(post.authorId, ganon.id); - assert.equal(this.helper.schema.posts.find(post.id).authorId, ganon.id, 'the child was persisted'); - }); + assert.ok(ganon.id, 'the parent was persisted'); + assert.deepEqual(post.author, ganon); + assert.equal(post.authorId, ganon.id); + assert.equal(this.helper.schema.posts.find(post.id).authorId, ganon.id, 'the child was persisted'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/2-named/association-new-test.js b/tests/integration/orm/belongs-to/2-named/association-new-test.js index b60ac2da9..374d84a5b 100644 --- a/tests/integration/orm/belongs-to/2-named/association-new-test.js +++ b/tests/integration/orm/belongs-to/2-named/association-new-test.js @@ -1,31 +1,34 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named | association #new', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Named | association #new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can make a new unsaved belongs-to association, for all states -*/ + /* + The model can make a new unsaved belongs-to association, for all states + */ -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can build a new associated parent`, function(assert) { - let [ post ] = this.helper[state](); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ post ] = this.helper[state](); - let ganon = post.newAuthor({ name: 'Ganon' }); + let ganon = post.newAuthor({ name: 'Ganon' }); - assert.ok(!ganon.id, 'the parent was not persisted'); - assert.deepEqual(post.author, ganon); - assert.equal(post.authorId, null); + assert.ok(!ganon.id, 'the parent was not persisted'); + assert.deepEqual(post.author, ganon); + assert.equal(post.authorId, null); - post.save(); + post.save(); - assert.ok(ganon.id, 'saving the child persists the parent'); - assert.equal(post.authorId, ganon.id, 'the childs fk was updated'); - }); + assert.ok(ganon.id, 'saving the child persists the parent'); + assert.equal(post.authorId, ganon.id, 'the childs fk was updated'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/2-named/association-set-id-test.js b/tests/integration/orm/belongs-to/2-named/association-set-id-test.js index 9fefaeb54..ed58770c1 100644 --- a/tests/integration/orm/belongs-to/2-named/association-set-id-test.js +++ b/tests/integration/orm/belongs-to/2-named/association-set-id-test.js @@ -1,41 +1,44 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named | association #setId', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Named | association #setId', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parentId, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ post ] = this.helper[state](); - let savedAuthor = this.helper.savedParent(); + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ post ] = this.helper[state](); + let savedAuthor = this.helper.savedParent(); - post.authorId = savedAuthor.id; + post.authorId = savedAuthor.id; - assert.equal(post.authorId, savedAuthor.id); - assert.deepEqual(post.author, savedAuthor); - }); + assert.equal(post.authorId, savedAuthor.id); + assert.deepEqual(post.author, savedAuthor); + }); -}); + }); -[ - 'savedChildSavedParent', - 'newChildSavedParent' -].forEach((state) => { + [ + 'savedChildSavedParent', + 'newChildSavedParent' + ].forEach((state) => { - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ post ] = this.helper[state](); + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ post ] = this.helper[state](); - post.authorId = null; + post.authorId = null; - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - }); + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/2-named/association-set-test.js b/tests/integration/orm/belongs-to/2-named/association-set-test.js index bdf584a56..e0ee36e47 100644 --- a/tests/integration/orm/belongs-to/2-named/association-set-test.js +++ b/tests/integration/orm/belongs-to/2-named/association-set-test.js @@ -1,44 +1,47 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named | association #set', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Named | association #set', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parent, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ post ] = this.helper[state](); - let savedAuthor = this.helper.savedParent(); + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ post ] = this.helper[state](); + let savedAuthor = this.helper.savedParent(); - post.author = savedAuthor; + post.author = savedAuthor; - assert.equal(post.authorId, savedAuthor.id); - assert.deepEqual(post.author, savedAuthor); - }); + assert.equal(post.authorId, savedAuthor.id); + assert.deepEqual(post.author, savedAuthor); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ post ] = this.helper[state](); - let newAuthor = this.helper.newParent(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ post ] = this.helper[state](); + let newAuthor = this.helper.newParent(); - post.author = newAuthor; + post.author = newAuthor; - assert.equal(post.authorId, null); - assert.deepEqual(post.author, newAuthor); - }); + assert.equal(post.authorId, null); + assert.deepEqual(post.author, newAuthor); + }); - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ post ] = this.helper[state](); + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ post ] = this.helper[state](); - post.author = null; + post.author = null; - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - }); + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/2-named/create-test.js b/tests/integration/orm/belongs-to/2-named/create-test.js index 0b37c31fb..200429048 100644 --- a/tests/integration/orm/belongs-to/2-named/create-test.js +++ b/tests/integration/orm/belongs-to/2-named/create-test.js @@ -2,59 +2,59 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named | create', { - beforeEach() { +module('Integration | ORM | Belongs To | Named | create', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); this.helper.schema.registerModel('foo', Model); - } -}); - -test('it sets up associations correctly when passing in the foreign key', function(assert) { - let author = this.helper.schema.create('user'); - let post = this.helper.schema.create('post', { - authorId: author.id }); - assert.equal(post.authorId, author.id); - assert.deepEqual(post.author.attrs, author.attrs); - assert.equal(this.helper.schema.db.users.length, 1); - assert.deepEqual(this.helper.schema.db.users[0], { id: '1' }); - assert.equal(this.helper.schema.db.posts.length, 1); - assert.deepEqual(this.helper.schema.db.posts[0], { id: '1', authorId: '1' }); -}); + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let author = this.helper.schema.create('user'); + let post = this.helper.schema.create('post', { + authorId: author.id + }); -test('it sets up associations correctly when passing in the association itself', function(assert) { - let author = this.helper.schema.create('user'); - let post = this.helper.schema.create('post', { - author + assert.equal(post.authorId, author.id); + assert.deepEqual(post.author.attrs, author.attrs); + assert.equal(this.helper.schema.db.users.length, 1); + assert.deepEqual(this.helper.schema.db.users[0], { id: '1' }); + assert.equal(this.helper.schema.db.posts.length, 1); + assert.deepEqual(this.helper.schema.db.posts[0], { id: '1', authorId: '1' }); }); - assert.equal(post.authorId, author.id); - assert.deepEqual(post.author.attrs, author.attrs); - assert.equal(this.helper.schema.db.users.length, 1); - assert.deepEqual(this.helper.schema.db.users[0], { id: '1' }); - assert.equal(this.helper.schema.db.posts.length, 1); - assert.deepEqual(this.helper.schema.db.posts[0], { id: '1', authorId: '1' }); -}); + test('it sets up associations correctly when passing in the association itself', function(assert) { + let author = this.helper.schema.create('user'); + let post = this.helper.schema.create('post', { + author + }); -test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + assert.equal(post.authorId, author.id); + assert.deepEqual(post.author.attrs, author.attrs); + assert.equal(this.helper.schema.db.users.length, 1); + assert.deepEqual(this.helper.schema.db.users[0], { id: '1' }); + assert.equal(this.helper.schema.db.posts.length, 1); + assert.deepEqual(this.helper.schema.db.posts[0], { id: '1', authorId: '1' }); + }); - assert.throws(function() { - schema.create('post', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); -}); + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('post', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); + }); -test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); - assert.throws(function() { - schema.create('post', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); + assert.throws(function() { + schema.create('post', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); }); diff --git a/tests/integration/orm/belongs-to/2-named/delete-test.js b/tests/integration/orm/belongs-to/2-named/delete-test.js index 7cabadbfa..855a3674d 100644 --- a/tests/integration/orm/belongs-to/2-named/delete-test.js +++ b/tests/integration/orm/belongs-to/2-named/delete-test.js @@ -1,24 +1,24 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named | delete', { - beforeEach() { +module('Integration | ORM | Belongs To | Named | delete', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); - } -}); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ post, user ] = this.helper[state](); + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ post, user ] = this.helper[state](); - if (user) { - user.destroy(); - post.reload(); - } + if (user) { + user.destroy(); + post.reload(); + } - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - }); + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + }); + }); }); diff --git a/tests/integration/orm/belongs-to/2-named/instantiating-test.js b/tests/integration/orm/belongs-to/2-named/instantiating-test.js index 34ee3466d..e2f1fbbb2 100644 --- a/tests/integration/orm/belongs-to/2-named/instantiating-test.js +++ b/tests/integration/orm/belongs-to/2-named/instantiating-test.js @@ -1,82 +1,85 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named | instantiating', { - beforeEach() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module( + 'Integration | ORM | Belongs To | Named | instantiating', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the child accepts a saved parent id', function(assert) { + let author = this.helper.savedParent(); + let post = this.schema.posts.new({ authorId: author.id }); + + assert.equal(post.authorId, author.id); + assert.deepEqual(post.author, author); + assert.deepEqual(post.attrs, { authorId: author.id }); + }); + + test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.posts.new({ authorId: 2 }); + }, /You're instantiating a post that has a authorId of 2, but that record doesn't exist in the database/); + }); + + test('the child accepts a null parent id', function(assert) { + let post = this.schema.posts.new({ authorId: null }); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + assert.deepEqual(post.attrs, { authorId: null }); + }); + + test('the child accepts a saved parent model', function(assert) { + let author = this.helper.savedParent(); + let post = this.schema.posts.new({ author }); + + assert.equal(post.authorId, 1); + assert.deepEqual(post.author, author); + }); + + test('the child accepts a new parent model', function(assert) { + let zelda = this.schema.users.new({ name: 'Zelda' }); + let post = this.schema.posts.new({ author: zelda }); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, zelda); + assert.deepEqual(post.attrs, { authorId: null }); + }); + + test('the child accepts a null parent model', function(assert) { + let post = this.schema.posts.new({ author: null }); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + assert.deepEqual(post.attrs, { authorId: null }); + }); + + test('the child accepts a parent model and id', function(assert) { + let author = this.helper.savedParent(); + let post = this.schema.posts.new({ author, authorId: author.id }); + + assert.equal(post.authorId, '1'); + assert.deepEqual(post.author, author); + assert.deepEqual(post.attrs, { authorId: author.id }); + }); + + test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let post = this.schema.posts.new({}); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + assert.deepEqual(post.attrs, { authorId: null }); + }); + + test('the child accepts no reference to a parent id or model', function(assert) { + let post = this.schema.posts.new(); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + assert.deepEqual(post.attrs, { authorId: null }); + }); } -}); - -test('the child accepts a saved parent id', function(assert) { - let author = this.helper.savedParent(); - let post = this.schema.posts.new({ authorId: author.id }); - - assert.equal(post.authorId, author.id); - assert.deepEqual(post.author, author); - assert.deepEqual(post.attrs, { authorId: author.id }); -}); - -test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.posts.new({ authorId: 2 }); - }, /You're instantiating a post that has a authorId of 2, but that record doesn't exist in the database/); -}); - -test('the child accepts a null parent id', function(assert) { - let post = this.schema.posts.new({ authorId: null }); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - assert.deepEqual(post.attrs, { authorId: null }); -}); - -test('the child accepts a saved parent model', function(assert) { - let author = this.helper.savedParent(); - let post = this.schema.posts.new({ author }); - - assert.equal(post.authorId, 1); - assert.deepEqual(post.author, author); -}); - -test('the child accepts a new parent model', function(assert) { - let zelda = this.schema.users.new({ name: 'Zelda' }); - let post = this.schema.posts.new({ author: zelda }); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, zelda); - assert.deepEqual(post.attrs, { authorId: null }); -}); - -test('the child accepts a null parent model', function(assert) { - let post = this.schema.posts.new({ author: null }); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - assert.deepEqual(post.attrs, { authorId: null }); -}); - -test('the child accepts a parent model and id', function(assert) { - let author = this.helper.savedParent(); - let post = this.schema.posts.new({ author, authorId: author.id }); - - assert.equal(post.authorId, '1'); - assert.deepEqual(post.author, author); - assert.deepEqual(post.attrs, { authorId: author.id }); -}); - -test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let post = this.schema.posts.new({}); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - assert.deepEqual(post.attrs, { authorId: null }); -}); - -test('the child accepts no reference to a parent id or model', function(assert) { - let post = this.schema.posts.new(); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - assert.deepEqual(post.attrs, { authorId: null }); -}); +); diff --git a/tests/integration/orm/belongs-to/3-reflexive/accessor-test.js b/tests/integration/orm/belongs-to/3-reflexive/accessor-test.js index 795be482e..10a59b71e 100644 --- a/tests/integration/orm/belongs-to/3-reflexive/accessor-test.js +++ b/tests/integration/orm/belongs-to/3-reflexive/accessor-test.js @@ -1,34 +1,34 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Reflexive | accessor', { - beforeEach() { +module('Integration | ORM | Belongs To | Reflexive | accessor', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); - } -}); + }); -/* - The reference to a belongs-to association is correct, for all states -*/ -states.forEach((state) => { + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ user, friend ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ user, friend ] = this.helper[state](); - // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison - if (friend) { - assert.deepEqual(user.user.attrs, friend.attrs, 'the model reference is correct'); - assert.equal(user.userId, friend.id, 'the modelId reference is correct'); - } else { - assert.deepEqual(user.user, null, 'the model reference is correct'); - assert.equal(user.userId, null, 'the modelId reference is correct'); - } + // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison + if (friend) { + assert.deepEqual(user.user.attrs, friend.attrs, 'the model reference is correct'); + assert.equal(user.userId, friend.id, 'the modelId reference is correct'); + } else { + assert.deepEqual(user.user, null, 'the model reference is correct'); + assert.equal(user.userId, null, 'the modelId reference is correct'); + } - // If there's a friend in this state, make sure the inverse association is correct - if (friend) { - assert.deepEqual(friend.user.attrs, user.attrs, 'the inverse model reference is correct'); - assert.equal(friend.userId, user.id, 'the inverse modelId reference is correct'); - } - }); + // If there's a friend in this state, make sure the inverse association is correct + if (friend) { + assert.deepEqual(friend.user.attrs, user.attrs, 'the inverse model reference is correct'); + assert.equal(friend.userId, user.id, 'the inverse modelId reference is correct'); + } + }); + }); }); diff --git a/tests/integration/orm/belongs-to/3-reflexive/association-create-test.js b/tests/integration/orm/belongs-to/3-reflexive/association-create-test.js index 5e6dfb3ba..60040b24b 100644 --- a/tests/integration/orm/belongs-to/3-reflexive/association-create-test.js +++ b/tests/integration/orm/belongs-to/3-reflexive/association-create-test.js @@ -1,33 +1,36 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Reflexive | association #create', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Reflexive | association #create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can create a belongs-to association, for all states -*/ -states.forEach((state) => { + /* + The model can create a belongs-to association, for all states + */ + states.forEach((state) => { - test(`a ${state} can create an associated parent`, function(assert) { - let [ user, originalUser ] = this.helper[state](); + test(`a ${state} can create an associated parent`, function(assert) { + let [ user, originalUser ] = this.helper[state](); - let ganon = user.createUser({ name: 'Ganon' }); + let ganon = user.createUser({ name: 'Ganon' }); - assert.ok(ganon.id, 'the parent was persisted'); - assert.deepEqual(user.user.attrs, ganon.attrs); - assert.deepEqual(ganon.user.attrs, user.attrs, 'the inverse was set'); - assert.equal(user.userId, ganon.id); - assert.equal(ganon.userId, user.id, 'the inverse was set'); - assert.equal(this.helper.schema.users.find(user.id).userId, ganon.id, 'the user was persisted'); + assert.ok(ganon.id, 'the parent was persisted'); + assert.deepEqual(user.user.attrs, ganon.attrs); + assert.deepEqual(ganon.user.attrs, user.attrs, 'the inverse was set'); + assert.equal(user.userId, ganon.id); + assert.equal(ganon.userId, user.id, 'the inverse was set'); + assert.equal(this.helper.schema.users.find(user.id).userId, ganon.id, 'the user was persisted'); - if (originalUser) { - originalUser.reload(); - assert.equal(originalUser.userId, null, 'old inverses were cleared out'); - } - }); + if (originalUser) { + originalUser.reload(); + assert.equal(originalUser.userId, null, 'old inverses were cleared out'); + } + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/3-reflexive/association-new-test.js b/tests/integration/orm/belongs-to/3-reflexive/association-new-test.js index 831bf3e56..25297e262 100644 --- a/tests/integration/orm/belongs-to/3-reflexive/association-new-test.js +++ b/tests/integration/orm/belongs-to/3-reflexive/association-new-test.js @@ -1,37 +1,40 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Reflexive | association #new', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Reflexive | association #new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can make a new unsaved belongs-to association, for all states -*/ + /* + The model can make a new unsaved belongs-to association, for all states + */ -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user, originalUser ] = this.helper[state](); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user, originalUser ] = this.helper[state](); - let ganon = user.newUser({ name: 'Ganon' }); + let ganon = user.newUser({ name: 'Ganon' }); - assert.ok(!ganon.id, 'the parent was not persisted'); - assert.deepEqual(user.user, ganon); - assert.equal(user.userId, null); - assert.deepEqual(ganon.user, user, 'the inverse was set'); + assert.ok(!ganon.id, 'the parent was not persisted'); + assert.deepEqual(user.user, ganon); + assert.equal(user.userId, null); + assert.deepEqual(ganon.user, user, 'the inverse was set'); - user.save(); + user.save(); - assert.ok(ganon.id, 'saving the child persists the parent'); - assert.equal(user.userId, ganon.id, 'the childs fk was updated'); + assert.ok(ganon.id, 'saving the child persists the parent'); + assert.equal(user.userId, ganon.id, 'the childs fk was updated'); - if (originalUser) { - originalUser.reload(); - assert.equal(originalUser.userId, null, 'old inverses were cleared out'); - } - }); + if (originalUser) { + originalUser.reload(); + assert.equal(originalUser.userId, null, 'old inverses were cleared out'); + } + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/3-reflexive/association-set-id-test.js b/tests/integration/orm/belongs-to/3-reflexive/association-set-id-test.js index 4dc63e22f..33aec779e 100644 --- a/tests/integration/orm/belongs-to/3-reflexive/association-set-id-test.js +++ b/tests/integration/orm/belongs-to/3-reflexive/association-set-id-test.js @@ -1,53 +1,56 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Reflexive | association #setId', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Reflexive | association #setId', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parentId, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user, originalUser ] = this.helper[state](); - let friend = this.helper.savedParent(); + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user, originalUser ] = this.helper[state](); + let friend = this.helper.savedParent(); - user.userId = friend.id; + user.userId = friend.id; - assert.equal(user.userId, friend.id); - assert.deepEqual(user.user.attrs, friend.attrs); + assert.equal(user.userId, friend.id); + assert.deepEqual(user.user.attrs, friend.attrs); - user.save(); - if (originalUser) { - originalUser.reload(); - assert.equal(originalUser.userId, null, 'old inverses were cleared out'); - } - }); + user.save(); + if (originalUser) { + originalUser.reload(); + assert.equal(originalUser.userId, null, 'old inverses were cleared out'); + } + }); -}); + }); -[ - 'savedChildSavedParent', - 'newChildSavedParent' -].forEach((state) => { + [ + 'savedChildSavedParent', + 'newChildSavedParent' + ].forEach((state) => { - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ user, originalUser ] = this.helper[state](); + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ user, originalUser ] = this.helper[state](); - user.userId = null; + user.userId = null; - assert.equal(user.userId, null); - assert.equal(user.user, null); + assert.equal(user.userId, null); + assert.equal(user.user, null); - user.save(); - if (originalUser) { - originalUser.reload(); - assert.equal(originalUser.userId, null, 'old inverses were cleared out'); - } - }); + user.save(); + if (originalUser) { + originalUser.reload(); + assert.equal(originalUser.userId, null, 'old inverses were cleared out'); + } + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/3-reflexive/association-set-test.js b/tests/integration/orm/belongs-to/3-reflexive/association-set-test.js index b253781db..9ba29d9ff 100644 --- a/tests/integration/orm/belongs-to/3-reflexive/association-set-test.js +++ b/tests/integration/orm/belongs-to/3-reflexive/association-set-test.js @@ -1,62 +1,65 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Reflexive | association #set', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Reflexive | association #set', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parent, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ user, originalUser ] = this.helper[state](); - let friend = this.helper.savedParent(); + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ user, originalUser ] = this.helper[state](); + let friend = this.helper.savedParent(); - user.user = friend; + user.user = friend; - assert.equal(user.userId, friend.id); - assert.deepEqual(user.user.attrs, friend.attrs); + assert.equal(user.userId, friend.id); + assert.deepEqual(user.user.attrs, friend.attrs); - user.save(); - if (originalUser) { - originalUser.reload(); - assert.equal(originalUser.userId, null, 'old inverses were cleared out'); - } - }); + user.save(); + if (originalUser) { + originalUser.reload(); + assert.equal(originalUser.userId, null, 'old inverses were cleared out'); + } + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user, originalUser ] = this.helper[state](); - let friend = this.helper.newParent(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user, originalUser ] = this.helper[state](); + let friend = this.helper.newParent(); - user.user = friend; + user.user = friend; - assert.equal(user.userId, null); - assert.deepEqual(user.user.attrs, friend.attrs); + assert.equal(user.userId, null); + assert.deepEqual(user.user.attrs, friend.attrs); - user.save(); - if (originalUser) { - originalUser.reload(); - assert.equal(originalUser.userId, null, 'old inverses were cleared out'); - } - }); + user.save(); + if (originalUser) { + originalUser.reload(); + assert.equal(originalUser.userId, null, 'old inverses were cleared out'); + } + }); - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ user, originalUser ] = this.helper[state](); + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ user, originalUser ] = this.helper[state](); - user.user = null; + user.user = null; - assert.equal(user.userId, null); - assert.deepEqual(user.user, null); + assert.equal(user.userId, null); + assert.deepEqual(user.user, null); - user.save(); - if (originalUser) { - originalUser.reload(); - assert.equal(originalUser.userId, null, 'old inverses were cleared out'); - } - }); + user.save(); + if (originalUser) { + originalUser.reload(); + assert.equal(originalUser.userId, null, 'old inverses were cleared out'); + } + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/3-reflexive/create-test.js b/tests/integration/orm/belongs-to/3-reflexive/create-test.js index 72619a78a..0189771f3 100644 --- a/tests/integration/orm/belongs-to/3-reflexive/create-test.js +++ b/tests/integration/orm/belongs-to/3-reflexive/create-test.js @@ -2,61 +2,61 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Reflexive | create', { - beforeEach() { +module('Integration | ORM | Belongs To | Reflexive | create', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); this.helper.schema.registerModel('foo', Model); - } -}); - -test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let friend = schema.create('user'); - let user = schema.create('user', { - userId: friend.id }); - friend.reload(); + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let friend = schema.create('user'); + let user = schema.create('user', { + userId: friend.id + }); - assert.equal(user.userId, friend.id); - assert.deepEqual(user.user.attrs, friend.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', userId: '2' }); - assert.deepEqual(schema.db.users[1], { id: '2', userId: '1' }); -}); + friend.reload(); -test('it sets up associations correctly when passing in the association itself', function(assert) { - let { schema } = this.helper; - let friend = schema.create('user'); - let user = schema.create('user', { - user: friend + assert.equal(user.userId, friend.id); + assert.deepEqual(user.user.attrs, friend.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', userId: '2' }); + assert.deepEqual(schema.db.users[1], { id: '2', userId: '1' }); }); - assert.equal(user.userId, friend.id); - assert.deepEqual(user.user.attrs, friend.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', userId: '2' }); - assert.deepEqual(schema.db.users[1], { id: '2', userId: '1' }); -}); + test('it sets up associations correctly when passing in the association itself', function(assert) { + let { schema } = this.helper; + let friend = schema.create('user'); + let user = schema.create('user', { + user: friend + }); -test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + assert.equal(user.userId, friend.id); + assert.deepEqual(user.user.attrs, friend.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', userId: '2' }); + assert.deepEqual(schema.db.users[1], { id: '2', userId: '1' }); + }); - assert.throws(function() { - schema.create('user', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); -}); + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('user', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); + }); -test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); - assert.throws(function() { - schema.create('user', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); + assert.throws(function() { + schema.create('user', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); }); diff --git a/tests/integration/orm/belongs-to/3-reflexive/delete-test.js b/tests/integration/orm/belongs-to/3-reflexive/delete-test.js index 956f4552b..1d94301ed 100644 --- a/tests/integration/orm/belongs-to/3-reflexive/delete-test.js +++ b/tests/integration/orm/belongs-to/3-reflexive/delete-test.js @@ -1,24 +1,24 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Reflexive | delete', { - beforeEach() { +module('Integration | ORM | Belongs To | Reflexive | delete', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); - } -}); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ user, targetUser ] = this.helper[state](); + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ user, targetUser ] = this.helper[state](); - if (targetUser) { - targetUser.destroy(); - user.reload(); - } + if (targetUser) { + targetUser.destroy(); + user.reload(); + } - assert.equal(user.userId, null); - assert.deepEqual(user.user, null); - }); + assert.equal(user.userId, null); + assert.deepEqual(user.user, null); + }); + }); }); diff --git a/tests/integration/orm/belongs-to/3-reflexive/instantiating-test.js b/tests/integration/orm/belongs-to/3-reflexive/instantiating-test.js index 827feee3d..50c66415b 100644 --- a/tests/integration/orm/belongs-to/3-reflexive/instantiating-test.js +++ b/tests/integration/orm/belongs-to/3-reflexive/instantiating-test.js @@ -1,83 +1,86 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Reflexive | instantiating', { - beforeEach() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module( + 'Integration | ORM | Belongs To | Reflexive | instantiating', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the child accepts a saved parent id', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ userId: friend.id }); + + assert.equal(user.userId, friend.id); + assert.deepEqual(user.user.attrs, friend.attrs); + assert.deepEqual(user.attrs, { userId: friend.id }); + }); + + test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ userId: 2 }); + }, /You're instantiating a user that has a userId of 2, but that record doesn't exist in the database/); + }); + + test('the child accepts a null parent id', function(assert) { + let user = this.schema.users.new({ userId: null }); + + assert.equal(user.userId, null); + assert.equal(user.user, null); + assert.deepEqual(user.attrs, { userId: null }); + }); + + test('the child accepts a saved parent model', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ user: friend }); + + assert.equal(user.userId, 1); + assert.deepEqual(user.user.attrs, friend.attrs); + assert.deepEqual(user.attrs, { userId: null }); // this would update when saved + }); + + test('the child accepts a new parent model', function(assert) { + let zelda = this.schema.users.new({ name: 'Zelda' }); + let user = this.schema.users.new({ user: zelda }); + + assert.equal(user.userId, null); + assert.deepEqual(user.user, zelda); + assert.deepEqual(user.attrs, { userId: null }); + }); + + test('the child accepts a null parent model', function(assert) { + let user = this.schema.users.new({ user: null }); + + assert.equal(user.userId, null); + assert.deepEqual(user.user, null); + assert.deepEqual(user.attrs, { userId: null }); + }); + + test('the child accepts a parent model and id', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ user: friend, userId: friend.id }); + + assert.equal(user.userId, '1'); + assert.deepEqual(user.user, friend); + assert.deepEqual(user.attrs, { userId: friend.id }); + }); + + test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let user = this.schema.users.new({}); + + assert.equal(user.userId, null); + assert.deepEqual(user.user, null); + assert.deepEqual(user.attrs, { userId: null }); + }); + + test('the child accepts no reference to a parent id or model', function(assert) { + let user = this.schema.users.new(); + + assert.equal(user.userId, null); + assert.deepEqual(user.user, null); + assert.deepEqual(user.attrs, { userId: null }); + }); } -}); - -test('the child accepts a saved parent id', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ userId: friend.id }); - - assert.equal(user.userId, friend.id); - assert.deepEqual(user.user.attrs, friend.attrs); - assert.deepEqual(user.attrs, { userId: friend.id }); -}); - -test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ userId: 2 }); - }, /You're instantiating a user that has a userId of 2, but that record doesn't exist in the database/); -}); - -test('the child accepts a null parent id', function(assert) { - let user = this.schema.users.new({ userId: null }); - - assert.equal(user.userId, null); - assert.equal(user.user, null); - assert.deepEqual(user.attrs, { userId: null }); -}); - -test('the child accepts a saved parent model', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ user: friend }); - - assert.equal(user.userId, 1); - assert.deepEqual(user.user.attrs, friend.attrs); - assert.deepEqual(user.attrs, { userId: null }); // this would update when saved -}); - -test('the child accepts a new parent model', function(assert) { - let zelda = this.schema.users.new({ name: 'Zelda' }); - let user = this.schema.users.new({ user: zelda }); - - assert.equal(user.userId, null); - assert.deepEqual(user.user, zelda); - assert.deepEqual(user.attrs, { userId: null }); -}); - -test('the child accepts a null parent model', function(assert) { - let user = this.schema.users.new({ user: null }); - - assert.equal(user.userId, null); - assert.deepEqual(user.user, null); - assert.deepEqual(user.attrs, { userId: null }); -}); - -test('the child accepts a parent model and id', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ user: friend, userId: friend.id }); - - assert.equal(user.userId, '1'); - assert.deepEqual(user.user, friend); - assert.deepEqual(user.attrs, { userId: friend.id }); -}); - -test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let user = this.schema.users.new({}); - - assert.equal(user.userId, null); - assert.deepEqual(user.user, null); - assert.deepEqual(user.attrs, { userId: null }); -}); - -test('the child accepts no reference to a parent id or model', function(assert) { - let user = this.schema.users.new(); - - assert.equal(user.userId, null); - assert.deepEqual(user.user, null); - assert.deepEqual(user.attrs, { userId: null }); -}); +); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/accessor-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/accessor-test.js index fbc65b1ff..18f7f12de 100644 --- a/tests/integration/orm/belongs-to/4-named-reflexive/accessor-test.js +++ b/tests/integration/orm/belongs-to/4-named-reflexive/accessor-test.js @@ -1,34 +1,37 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named Reflexive | accessor', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Named Reflexive | accessor', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The reference to a belongs-to association is correct, for all states -*/ -states.forEach((state) => { + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ user, friend ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ user, friend ] = this.helper[state](); - // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison - if (friend) { - assert.deepEqual(user.bestFriend.attrs, friend.attrs, 'the model reference is correct'); - assert.equal(user.bestFriendId, friend.id, 'the modelId reference is correct'); - } else { - assert.deepEqual(user.bestFriend, null, 'the model reference is correct'); - assert.equal(user.bestFriendId, null, 'the modelId reference is correct'); - } + // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison + if (friend) { + assert.deepEqual(user.bestFriend.attrs, friend.attrs, 'the model reference is correct'); + assert.equal(user.bestFriendId, friend.id, 'the modelId reference is correct'); + } else { + assert.deepEqual(user.bestFriend, null, 'the model reference is correct'); + assert.equal(user.bestFriendId, null, 'the modelId reference is correct'); + } - // If there's a friend in this state, make sure the inverse association is correct - if (friend) { - assert.deepEqual(friend.bestFriend.attrs, user.attrs, 'the inverse model reference is correct'); - assert.equal(friend.bestFriendId, user.id, 'the inverse modelId reference is correct'); - } - }); + // If there's a friend in this state, make sure the inverse association is correct + if (friend) { + assert.deepEqual(friend.bestFriend.attrs, user.attrs, 'the inverse model reference is correct'); + assert.equal(friend.bestFriendId, user.id, 'the inverse modelId reference is correct'); + } + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/association-create-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/association-create-test.js index 51c371665..f97df52bd 100644 --- a/tests/integration/orm/belongs-to/4-named-reflexive/association-create-test.js +++ b/tests/integration/orm/belongs-to/4-named-reflexive/association-create-test.js @@ -1,26 +1,29 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named Reflexive | association #create', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Named Reflexive | association #create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can create a belongs-to association, for all states -*/ -states.forEach((state) => { + /* + The model can create a belongs-to association, for all states + */ + states.forEach((state) => { - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); - let ganon = user.createBestFriend({ name: 'Ganon' }); + let ganon = user.createBestFriend({ name: 'Ganon' }); - assert.ok(ganon.id, 'the parent was persisted'); - assert.deepEqual(user.bestFriend.attrs, ganon.attrs); - assert.equal(user.bestFriendId, ganon.id); - assert.equal(this.helper.schema.users.find(user.id).bestFriendId, ganon.id, 'the user was persisted'); - }); + assert.ok(ganon.id, 'the parent was persisted'); + assert.deepEqual(user.bestFriend.attrs, ganon.attrs); + assert.equal(user.bestFriendId, ganon.id); + assert.equal(this.helper.schema.users.find(user.id).bestFriendId, ganon.id, 'the user was persisted'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/association-new-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/association-new-test.js index 0a23352d4..0fac991c1 100644 --- a/tests/integration/orm/belongs-to/4-named-reflexive/association-new-test.js +++ b/tests/integration/orm/belongs-to/4-named-reflexive/association-new-test.js @@ -1,31 +1,34 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named Reflexive | association #new', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Named Reflexive | association #new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can make a new unsaved belongs-to association, for all states -*/ + /* + The model can make a new unsaved belongs-to association, for all states + */ -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); - let ganon = user.newBestFriend({ name: 'Ganon' }); + let ganon = user.newBestFriend({ name: 'Ganon' }); - assert.ok(!ganon.id, 'the parent was not persisted'); - assert.deepEqual(user.bestFriend, ganon); - assert.equal(user.bestFriendId, null); + assert.ok(!ganon.id, 'the parent was not persisted'); + assert.deepEqual(user.bestFriend, ganon); + assert.equal(user.bestFriendId, null); - user.save(); + user.save(); - assert.ok(ganon.id, 'saving the child persists the parent'); - assert.equal(user.bestFriendId, ganon.id, 'the childs fk was updated'); - }); + assert.ok(ganon.id, 'saving the child persists the parent'); + assert.equal(user.bestFriendId, ganon.id, 'the childs fk was updated'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/association-set-id-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/association-set-id-test.js index c7aad9218..e17f487a3 100644 --- a/tests/integration/orm/belongs-to/4-named-reflexive/association-set-id-test.js +++ b/tests/integration/orm/belongs-to/4-named-reflexive/association-set-id-test.js @@ -1,41 +1,44 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named Reflexive | association #setId', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Named Reflexive | association #setId', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parentId, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user ] = this.helper[state](); - let friend = this.helper.savedParent(); + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user ] = this.helper[state](); + let friend = this.helper.savedParent(); - user.bestFriendId = friend.id; + user.bestFriendId = friend.id; - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - }); + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + }); -}); + }); -[ - 'savedChildSavedParent', - 'newChildSavedParent' -].forEach((state) => { + [ + 'savedChildSavedParent', + 'newChildSavedParent' + ].forEach((state) => { - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ user ] = this.helper[state](); + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ user ] = this.helper[state](); - user.bestFriendId = null; + user.bestFriendId = null; - assert.equal(user.bestFriendId, null); - assert.equal(user.bestFriend, null); - }); + assert.equal(user.bestFriendId, null); + assert.equal(user.bestFriend, null); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/association-set-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/association-set-test.js index dba45bc5e..324f5cf0b 100644 --- a/tests/integration/orm/belongs-to/4-named-reflexive/association-set-test.js +++ b/tests/integration/orm/belongs-to/4-named-reflexive/association-set-test.js @@ -1,44 +1,47 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named Reflexive | association #set', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Named Reflexive | association #set', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parent, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ user ] = this.helper[state](); - let friend = this.helper.savedParent(); + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ user ] = this.helper[state](); + let friend = this.helper.savedParent(); - user.bestFriend = friend; + user.bestFriend = friend; - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - }); + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user ] = this.helper[state](); - let friend = this.helper.newParent(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user ] = this.helper[state](); + let friend = this.helper.newParent(); - user.bestFriend = friend; + user.bestFriend = friend; - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - }); + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + }); - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ user ] = this.helper[state](); + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ user ] = this.helper[state](); - user.bestFriend = null; + user.bestFriend = null; - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - }); + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/create-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/create-test.js index e36b1e15e..a01a3b19a 100644 --- a/tests/integration/orm/belongs-to/4-named-reflexive/create-test.js +++ b/tests/integration/orm/belongs-to/4-named-reflexive/create-test.js @@ -2,61 +2,64 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named Reflexive | create', { - beforeEach() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - } -}); - -test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let friend = schema.create('user'); - let user = schema.create('user', { - bestFriendId: friend.id - }); - - friend.reload(); - - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', bestFriendId: '2' }); - assert.deepEqual(schema.db.users[1], { id: '2', bestFriendId: '1' }); -}); - -test('it sets up associations correctly when passing in the association itself', function(assert) { - let { schema } = this.helper; - let friend = schema.create('user'); - let user = schema.create('user', { - bestFriend: friend - }); - - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', bestFriendId: '2' }); - assert.deepEqual(schema.db.users[1], { id: '2', bestFriendId: '1' }); -}); - -test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.create('user', { - foo: schema.create('foo') +module( + 'Integration | ORM | Belongs To | Named Reflexive | create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + }); + + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let friend = schema.create('user'); + let user = schema.create('user', { + bestFriendId: friend.id + }); + + friend.reload(); + + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', bestFriendId: '2' }); + assert.deepEqual(schema.db.users[1], { id: '2', bestFriendId: '1' }); + }); + + test('it sets up associations correctly when passing in the association itself', function(assert) { + let { schema } = this.helper; + let friend = schema.create('user'); + let user = schema.create('user', { + bestFriend: friend + }); + + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', bestFriendId: '2' }); + assert.deepEqual(schema.db.users[1], { id: '2', bestFriendId: '1' }); + }); + + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('user', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); }); - }, /you haven't defined that key as an association on your model/); -}); -test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); - assert.throws(function() { - schema.create('user', { - foos: schema.foos.all() + assert.throws(function() { + schema.create('user', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); }); - }, /you haven't defined that key as an association on your model/); -}); + } +); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/delete-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/delete-test.js index 9e4d00cf0..2257dadce 100644 --- a/tests/integration/orm/belongs-to/4-named-reflexive/delete-test.js +++ b/tests/integration/orm/belongs-to/4-named-reflexive/delete-test.js @@ -1,24 +1,27 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named Reflexive | delete', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Named Reflexive | delete', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ user, bestFriend ] = this.helper[state](); + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ user, bestFriend ] = this.helper[state](); - if (bestFriend) { - bestFriend.destroy(); - user.reload(); - } + if (bestFriend) { + bestFriend.destroy(); + user.reload(); + } - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - }); + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/instantiating-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/instantiating-test.js index a8e591108..21a40f468 100644 --- a/tests/integration/orm/belongs-to/4-named-reflexive/instantiating-test.js +++ b/tests/integration/orm/belongs-to/4-named-reflexive/instantiating-test.js @@ -1,83 +1,86 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named Reflexive | instantiating', { - beforeEach() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module( + 'Integration | ORM | Belongs To | Named Reflexive | instantiating', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the child accepts a saved parent id', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ bestFriendId: friend.id }); + + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + assert.deepEqual(user.attrs, { bestFriendId: friend.id }); + }); + + test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ bestFriendId: 2 }); + }, /You're instantiating a user that has a bestFriendId of 2, but that record doesn't exist in the database/); + }); + + test('the child accepts a null parent id', function(assert) { + let user = this.schema.users.new({ bestFriendId: null }); + + assert.equal(user.bestFriendId, null); + assert.equal(user.bestFriend, null); + assert.deepEqual(user.attrs, { bestFriendId: null }); + }); + + test('the child accepts a saved parent model', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ bestFriend: friend }); + + assert.equal(user.bestFriendId, 1); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + assert.deepEqual(user.attrs, { bestFriendId: null }); // this would update when saved + }); + + test('the child accepts a new parent model', function(assert) { + let zelda = this.schema.users.new({ name: 'Zelda' }); + let user = this.schema.users.new({ bestFriend: zelda }); + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, zelda); + assert.deepEqual(user.attrs, { bestFriendId: null }); + }); + + test('the child accepts a null parent model', function(assert) { + let user = this.schema.users.new({ bestFriend: null }); + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + assert.deepEqual(user.attrs, { bestFriendId: null }); + }); + + test('the child accepts a parent model and id', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ bestFriend: friend, bestFriendId: friend.id }); + + assert.equal(user.bestFriendId, '1'); + assert.deepEqual(user.bestFriend, friend); + assert.deepEqual(user.attrs, { bestFriendId: friend.id }); + }); + + test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let user = this.schema.users.new({}); + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + assert.deepEqual(user.attrs, { bestFriendId: null }); + }); + + test('the child accepts no reference to a parent id or model', function(assert) { + let user = this.schema.users.new(); + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + assert.deepEqual(user.attrs, { bestFriendId: null }); + }); } -}); - -test('the child accepts a saved parent id', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ bestFriendId: friend.id }); - - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - assert.deepEqual(user.attrs, { bestFriendId: friend.id }); -}); - -test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ bestFriendId: 2 }); - }, /You're instantiating a user that has a bestFriendId of 2, but that record doesn't exist in the database/); -}); - -test('the child accepts a null parent id', function(assert) { - let user = this.schema.users.new({ bestFriendId: null }); - - assert.equal(user.bestFriendId, null); - assert.equal(user.bestFriend, null); - assert.deepEqual(user.attrs, { bestFriendId: null }); -}); - -test('the child accepts a saved parent model', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ bestFriend: friend }); - - assert.equal(user.bestFriendId, 1); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - assert.deepEqual(user.attrs, { bestFriendId: null }); // this would update when saved -}); - -test('the child accepts a new parent model', function(assert) { - let zelda = this.schema.users.new({ name: 'Zelda' }); - let user = this.schema.users.new({ bestFriend: zelda }); - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, zelda); - assert.deepEqual(user.attrs, { bestFriendId: null }); -}); - -test('the child accepts a null parent model', function(assert) { - let user = this.schema.users.new({ bestFriend: null }); - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - assert.deepEqual(user.attrs, { bestFriendId: null }); -}); - -test('the child accepts a parent model and id', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ bestFriend: friend, bestFriendId: friend.id }); - - assert.equal(user.bestFriendId, '1'); - assert.deepEqual(user.bestFriend, friend); - assert.deepEqual(user.attrs, { bestFriendId: friend.id }); -}); - -test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let user = this.schema.users.new({}); - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - assert.deepEqual(user.attrs, { bestFriendId: null }); -}); - -test('the child accepts no reference to a parent id or model', function(assert) { - let user = this.schema.users.new(); - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - assert.deepEqual(user.attrs, { bestFriendId: null }); -}); +); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/accessor-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/accessor-test.js index 058de6687..8200ecf84 100644 --- a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/accessor-test.js +++ b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/accessor-test.js @@ -1,34 +1,37 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | accessor', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | accessor', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The reference to a belongs-to association is correct, for all states -*/ -states.forEach((state) => { + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ user, friend ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ user, friend ] = this.helper[state](); - // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison - if (friend) { - assert.deepEqual(user.bestFriend.attrs, friend.attrs, 'the model reference is correct'); - assert.equal(user.bestFriendId, friend.id, 'the modelId reference is correct'); - } else { - assert.deepEqual(user.bestFriend, null, 'the model reference is correct'); - assert.equal(user.bestFriendId, null, 'the modelId reference is correct'); - } + // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison + if (friend) { + assert.deepEqual(user.bestFriend.attrs, friend.attrs, 'the model reference is correct'); + assert.equal(user.bestFriendId, friend.id, 'the modelId reference is correct'); + } else { + assert.deepEqual(user.bestFriend, null, 'the model reference is correct'); + assert.equal(user.bestFriendId, null, 'the modelId reference is correct'); + } - // If there's a friend in this state, make sure the inverse association is correct - if (friend) { - assert.deepEqual(friend.bestFriend.attrs, user.attrs, 'the inverse model reference is correct'); - assert.equal(friend.bestFriendId, user.id, 'the inverse modelId reference is correct'); - } - }); + // If there's a friend in this state, make sure the inverse association is correct + if (friend) { + assert.deepEqual(friend.bestFriend.attrs, user.attrs, 'the inverse model reference is correct'); + assert.equal(friend.bestFriendId, user.id, 'the inverse modelId reference is correct'); + } + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-create-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-create-test.js index 9afb6ed70..a450ad4ef 100644 --- a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-create-test.js +++ b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-create-test.js @@ -1,26 +1,29 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | association #create', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | association #create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can create a belongs-to association, for all states -*/ -states.forEach((state) => { + /* + The model can create a belongs-to association, for all states + */ + states.forEach((state) => { - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); - let ganon = user.createBestFriend({ name: 'Ganon' }); + let ganon = user.createBestFriend({ name: 'Ganon' }); - assert.ok(ganon.id, 'the parent was persisted'); - assert.deepEqual(user.bestFriend.attrs, ganon.attrs); - assert.equal(user.bestFriendId, ganon.id); - assert.equal(this.helper.schema.users.find(user.id).bestFriendId, ganon.id, 'the user was persisted'); - }); + assert.ok(ganon.id, 'the parent was persisted'); + assert.deepEqual(user.bestFriend.attrs, ganon.attrs); + assert.equal(user.bestFriendId, ganon.id); + assert.equal(this.helper.schema.users.find(user.id).bestFriendId, ganon.id, 'the user was persisted'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-new-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-new-test.js index 8adbcf5c2..6166e26e5 100644 --- a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-new-test.js +++ b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-new-test.js @@ -1,31 +1,34 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | association #new', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | association #new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can make a new unsaved belongs-to association, for all states -*/ + /* + The model can make a new unsaved belongs-to association, for all states + */ -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); - let ganon = user.newBestFriend({ name: 'Ganon' }); + let ganon = user.newBestFriend({ name: 'Ganon' }); - assert.ok(!ganon.id, 'the parent was not persisted'); - assert.deepEqual(user.bestFriend, ganon); - assert.equal(user.bestFriendId, null); + assert.ok(!ganon.id, 'the parent was not persisted'); + assert.deepEqual(user.bestFriend, ganon); + assert.equal(user.bestFriendId, null); - user.save(); + user.save(); - assert.ok(ganon.id, 'saving the child persists the parent'); - assert.equal(user.bestFriendId, ganon.id, 'the childs fk was updated'); - }); + assert.ok(ganon.id, 'saving the child persists the parent'); + assert.equal(user.bestFriendId, ganon.id, 'the childs fk was updated'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-id-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-id-test.js index edd9e39a6..4e909e7c3 100644 --- a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-id-test.js +++ b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-id-test.js @@ -1,41 +1,44 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | association #setId', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | association #setId', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parentId, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user ] = this.helper[state](); - let friend = this.helper.savedParent(); + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user ] = this.helper[state](); + let friend = this.helper.savedParent(); - user.bestFriendId = friend.id; + user.bestFriendId = friend.id; - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - }); + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + }); -}); + }); -[ - 'savedChildSavedParent', - 'newChildSavedParent' -].forEach((state) => { + [ + 'savedChildSavedParent', + 'newChildSavedParent' + ].forEach((state) => { - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ user ] = this.helper[state](); + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ user ] = this.helper[state](); - user.bestFriendId = null; + user.bestFriendId = null; - assert.equal(user.bestFriendId, null); - assert.equal(user.bestFriend, null); - }); + assert.equal(user.bestFriendId, null); + assert.equal(user.bestFriend, null); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-test.js index 7a427b7e8..f25151288 100644 --- a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-test.js +++ b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-test.js @@ -1,44 +1,47 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | association #set', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | association #set', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parent, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ user ] = this.helper[state](); - let friend = this.helper.savedParent(); + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ user ] = this.helper[state](); + let friend = this.helper.savedParent(); - user.bestFriend = friend; + user.bestFriend = friend; - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - }); + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user ] = this.helper[state](); - let friend = this.helper.newParent(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user ] = this.helper[state](); + let friend = this.helper.newParent(); - user.bestFriend = friend; + user.bestFriend = friend; - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - }); + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + }); - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ user ] = this.helper[state](); + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ user ] = this.helper[state](); - user.bestFriend = null; + user.bestFriend = null; - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - }); + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/create-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/create-test.js index bb4fc723e..d4d26b285 100644 --- a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/create-test.js +++ b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/create-test.js @@ -2,61 +2,64 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | create', { - beforeEach() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - } -}); - -test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let friend = schema.create('user'); - let user = schema.create('user', { - bestFriendId: friend.id - }); - - friend.reload(); - - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', bestFriendId: '2' }); - assert.deepEqual(schema.db.users[1], { id: '2', bestFriendId: '1' }); -}); - -test('it sets up associations correctly when passing in the association itself', function(assert) { - let { schema } = this.helper; - let friend = schema.create('user'); - let user = schema.create('user', { - bestFriend: friend - }); - - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', bestFriendId: '2' }); - assert.deepEqual(schema.db.users[1], { id: '2', bestFriendId: '1' }); -}); - -test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.create('user', { - foo: schema.create('foo') +module( + 'Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + }); + + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let friend = schema.create('user'); + let user = schema.create('user', { + bestFriendId: friend.id + }); + + friend.reload(); + + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', bestFriendId: '2' }); + assert.deepEqual(schema.db.users[1], { id: '2', bestFriendId: '1' }); + }); + + test('it sets up associations correctly when passing in the association itself', function(assert) { + let { schema } = this.helper; + let friend = schema.create('user'); + let user = schema.create('user', { + bestFriend: friend + }); + + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', bestFriendId: '2' }); + assert.deepEqual(schema.db.users[1], { id: '2', bestFriendId: '1' }); + }); + + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('user', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); }); - }, /you haven't defined that key as an association on your model/); -}); -test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); - assert.throws(function() { - schema.create('user', { - foos: schema.foos.all() + assert.throws(function() { + schema.create('user', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); }); - }, /you haven't defined that key as an association on your model/); -}); + } +); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/delete-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/delete-test.js index ab086808a..4b228a4d8 100644 --- a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/delete-test.js +++ b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/delete-test.js @@ -1,24 +1,27 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | delete', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | delete', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ user, bestFriend ] = this.helper[state](); + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ user, bestFriend ] = this.helper[state](); - if (bestFriend) { - bestFriend.destroy(); - user.reload(); - } + if (bestFriend) { + bestFriend.destroy(); + user.reload(); + } - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - }); + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/instantiating-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/instantiating-test.js index 1de6ab5d6..322fdff3d 100644 --- a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/instantiating-test.js +++ b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/instantiating-test.js @@ -1,83 +1,86 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | instantiating', { - beforeEach() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module( + 'Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | instantiating', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the child accepts a saved parent id', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ bestFriendId: friend.id }); + + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + assert.deepEqual(user.attrs, { bestFriendId: friend.id }); + }); + + test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ bestFriendId: 2 }); + }, /You're instantiating a user that has a bestFriendId of 2, but that record doesn't exist in the database/); + }); + + test('the child accepts a null parent id', function(assert) { + let user = this.schema.users.new({ bestFriendId: null }); + + assert.equal(user.bestFriendId, null); + assert.equal(user.bestFriend, null); + assert.deepEqual(user.attrs, { bestFriendId: null }); + }); + + test('the child accepts a saved parent model', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ bestFriend: friend }); + + assert.equal(user.bestFriendId, 1); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + assert.deepEqual(user.attrs, { bestFriendId: null }); // this would update when saved + }); + + test('the child accepts a new parent model', function(assert) { + let zelda = this.schema.users.new({ name: 'Zelda' }); + let user = this.schema.users.new({ bestFriend: zelda }); + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, zelda); + assert.deepEqual(user.attrs, { bestFriendId: null }); + }); + + test('the child accepts a null parent model', function(assert) { + let user = this.schema.users.new({ bestFriend: null }); + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + assert.deepEqual(user.attrs, { bestFriendId: null }); + }); + + test('the child accepts a parent model and id', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ bestFriend: friend, bestFriendId: friend.id }); + + assert.equal(user.bestFriendId, '1'); + assert.deepEqual(user.bestFriend, friend); + assert.deepEqual(user.attrs, { bestFriendId: friend.id }); + }); + + test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let user = this.schema.users.new({}); + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + assert.deepEqual(user.attrs, { bestFriendId: null }); + }); + + test('the child accepts no reference to a parent id or model', function(assert) { + let user = this.schema.users.new(); + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + assert.deepEqual(user.attrs, { bestFriendId: null }); + }); } -}); - -test('the child accepts a saved parent id', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ bestFriendId: friend.id }); - - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - assert.deepEqual(user.attrs, { bestFriendId: friend.id }); -}); - -test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ bestFriendId: 2 }); - }, /You're instantiating a user that has a bestFriendId of 2, but that record doesn't exist in the database/); -}); - -test('the child accepts a null parent id', function(assert) { - let user = this.schema.users.new({ bestFriendId: null }); - - assert.equal(user.bestFriendId, null); - assert.equal(user.bestFriend, null); - assert.deepEqual(user.attrs, { bestFriendId: null }); -}); - -test('the child accepts a saved parent model', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ bestFriend: friend }); - - assert.equal(user.bestFriendId, 1); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - assert.deepEqual(user.attrs, { bestFriendId: null }); // this would update when saved -}); - -test('the child accepts a new parent model', function(assert) { - let zelda = this.schema.users.new({ name: 'Zelda' }); - let user = this.schema.users.new({ bestFriend: zelda }); - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, zelda); - assert.deepEqual(user.attrs, { bestFriendId: null }); -}); - -test('the child accepts a null parent model', function(assert) { - let user = this.schema.users.new({ bestFriend: null }); - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - assert.deepEqual(user.attrs, { bestFriendId: null }); -}); - -test('the child accepts a parent model and id', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ bestFriend: friend, bestFriendId: friend.id }); - - assert.equal(user.bestFriendId, '1'); - assert.deepEqual(user.bestFriend, friend); - assert.deepEqual(user.attrs, { bestFriendId: friend.id }); -}); - -test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let user = this.schema.users.new({}); - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - assert.deepEqual(user.attrs, { bestFriendId: null }); -}); - -test('the child accepts no reference to a parent id or model', function(assert) { - let user = this.schema.users.new(); - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - assert.deepEqual(user.attrs, { bestFriendId: null }); -}); +); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/accessor-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/accessor-test.js index f1bb8bb9f..52b1e1c5f 100644 --- a/tests/integration/orm/belongs-to/6-one-way-reflexive/accessor-test.js +++ b/tests/integration/orm/belongs-to/6-one-way-reflexive/accessor-test.js @@ -1,28 +1,31 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One-Way Reflexive | accessor', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | One-Way Reflexive | accessor', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The reference to a belongs-to association is correct, for all states -*/ -states.forEach((state) => { + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ user, parent ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ user, parent ] = this.helper[state](); - // We use .attrs here to avoid infinite recursion - if (parent) { - assert.deepEqual(user.user.attrs, parent.attrs, 'the model reference is correct'); - assert.equal(user.userId, parent.id, 'the modelId reference is correct'); - } else { - assert.deepEqual(user.user, null, 'the model reference is correct'); - assert.equal(user.userId, null, 'the modelId reference is correct'); - } - }); + // We use .attrs here to avoid infinite recursion + if (parent) { + assert.deepEqual(user.user.attrs, parent.attrs, 'the model reference is correct'); + assert.equal(user.userId, parent.id, 'the modelId reference is correct'); + } else { + assert.deepEqual(user.user, null, 'the model reference is correct'); + assert.equal(user.userId, null, 'the modelId reference is correct'); + } + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-create-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-create-test.js index 9e59fc121..4da2652d6 100644 --- a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-create-test.js +++ b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-create-test.js @@ -1,26 +1,29 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One-Way Reflexive | association #create', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | One-Way Reflexive | association #create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can create a belongs-to association, for all states -*/ -states.forEach((state) => { + /* + The model can create a belongs-to association, for all states + */ + states.forEach((state) => { - test(`a ${state} can create an associated parent`, function(assert) { - let [ child ] = this.helper[state](); + test(`a ${state} can create an associated parent`, function(assert) { + let [ child ] = this.helper[state](); - let ganon = child.createUser({ name: 'Ganon' }); + let ganon = child.createUser({ name: 'Ganon' }); - assert.ok(ganon.id, 'the parent was persisted'); - assert.deepEqual(child.user.attrs, ganon.attrs); - assert.equal(child.userId, ganon.id); - assert.equal(this.helper.schema.users.find(child.id).userId, ganon.id, 'the child was persisted'); - }); + assert.ok(ganon.id, 'the parent was persisted'); + assert.deepEqual(child.user.attrs, ganon.attrs); + assert.equal(child.userId, ganon.id); + assert.equal(this.helper.schema.users.find(child.id).userId, ganon.id, 'the child was persisted'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-new-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-new-test.js index 5bc1f7a3e..d6ef421ba 100644 --- a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-new-test.js +++ b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-new-test.js @@ -1,31 +1,34 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One-Way Reflexive | association #new', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | One-Way Reflexive | association #new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can make a new unsaved belongs-to association, for all states -*/ + /* + The model can make a new unsaved belongs-to association, for all states + */ -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can build a new associated parent`, function(assert) { - let [ child ] = this.helper[state](); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ child ] = this.helper[state](); - let ganon = child.newUser({ name: 'Ganon' }); + let ganon = child.newUser({ name: 'Ganon' }); - assert.ok(!ganon.id, 'the parent was not persisted'); - assert.deepEqual(child.user, ganon); - assert.equal(child.userId, null); + assert.ok(!ganon.id, 'the parent was not persisted'); + assert.deepEqual(child.user, ganon); + assert.equal(child.userId, null); - child.save(); + child.save(); - assert.ok(ganon.id, 'saving the child persists the parent'); - assert.equal(child.userId, ganon.id, 'the childs fk was updated'); - }); + assert.ok(ganon.id, 'saving the child persists the parent'); + assert.equal(child.userId, ganon.id, 'the childs fk was updated'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-id-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-id-test.js index 5a972eb44..4852d73ab 100644 --- a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-id-test.js +++ b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-id-test.js @@ -1,41 +1,44 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One-Way Reflexive | association #setId', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | One-Way Reflexive | association #setId', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parentId, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ child ] = this.helper[state](); - let savedParent = this.helper.savedParent(); + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ child ] = this.helper[state](); + let savedParent = this.helper.savedParent(); - child.userId = savedParent.id; + child.userId = savedParent.id; - assert.equal(child.userId, savedParent.id); - assert.deepEqual(child.user.attrs, savedParent.attrs); - }); + assert.equal(child.userId, savedParent.id); + assert.deepEqual(child.user.attrs, savedParent.attrs); + }); -}); + }); -[ - 'savedChildSavedParent', - 'newChildSavedParent' -].forEach((state) => { + [ + 'savedChildSavedParent', + 'newChildSavedParent' + ].forEach((state) => { - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ child ] = this.helper[state](); + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ child ] = this.helper[state](); - child.userId = null; + child.userId = null; - assert.equal(child.userId, null); - assert.deepEqual(child.user, null); - }); + assert.equal(child.userId, null); + assert.deepEqual(child.user, null); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-test.js index 80d501b39..bfa722f6f 100644 --- a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-test.js +++ b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-test.js @@ -1,44 +1,47 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One-Way Reflexive | association #set', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | One-Way Reflexive | association #set', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parent, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ child ] = this.helper[state](); - let savedParent = this.helper.savedParent(); + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ child ] = this.helper[state](); + let savedParent = this.helper.savedParent(); - child.user = savedParent; + child.user = savedParent; - assert.equal(child.userId, savedParent.id); - assert.deepEqual(child.user.attrs, savedParent.attrs); - }); + assert.equal(child.userId, savedParent.id); + assert.deepEqual(child.user.attrs, savedParent.attrs); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ child ] = this.helper[state](); - let newParent = this.helper.newParent(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ child ] = this.helper[state](); + let newParent = this.helper.newParent(); - child.user = newParent; + child.user = newParent; - assert.equal(child.userId, null); - assert.deepEqual(child.user, newParent); - }); + assert.equal(child.userId, null); + assert.deepEqual(child.user, newParent); + }); - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ child ] = this.helper[state](); + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ child ] = this.helper[state](); - child.user = null; + child.user = null; - assert.equal(child.userId, null); - assert.deepEqual(child.user, null); - }); + assert.equal(child.userId, null); + assert.deepEqual(child.user, null); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/create-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/create-test.js index 3b95dd459..d5e057c03 100644 --- a/tests/integration/orm/belongs-to/6-one-way-reflexive/create-test.js +++ b/tests/integration/orm/belongs-to/6-one-way-reflexive/create-test.js @@ -2,59 +2,62 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One-Way Reflexive | create', { - beforeEach() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - } -}); - -test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let parent = schema.create('user'); - let child = schema.create('user', { - userId: parent.id - }); - - assert.equal(child.userId, parent.id); - assert.deepEqual(child.user.attrs, parent.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', userId: null }); - assert.deepEqual(schema.db.users[1], { id: '2', userId: '1' }); -}); - -test('it sets up associations correctly when passing in the association itself', function(assert) { - let { schema } = this.helper; - let parent = schema.create('user'); - let child = schema.create('user', { - user: parent - }); - - assert.equal(child.userId, parent.id); - assert.deepEqual(child.user.attrs, parent.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', userId: null }); - assert.deepEqual(schema.db.users[1], { id: '2', userId: '1' }); -}); - -test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.create('user', { - foo: schema.create('foo') +module( + 'Integration | ORM | Belongs To | One-Way Reflexive | create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + }); + + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let parent = schema.create('user'); + let child = schema.create('user', { + userId: parent.id + }); + + assert.equal(child.userId, parent.id); + assert.deepEqual(child.user.attrs, parent.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', userId: null }); + assert.deepEqual(schema.db.users[1], { id: '2', userId: '1' }); + }); + + test('it sets up associations correctly when passing in the association itself', function(assert) { + let { schema } = this.helper; + let parent = schema.create('user'); + let child = schema.create('user', { + user: parent + }); + + assert.equal(child.userId, parent.id); + assert.deepEqual(child.user.attrs, parent.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', userId: null }); + assert.deepEqual(schema.db.users[1], { id: '2', userId: '1' }); }); - }, /you haven't defined that key as an association on your model/); -}); -test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.create('user', { - foos: schema.foos.all() + assert.throws(function() { + schema.create('user', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); }); - }, /you haven't defined that key as an association on your model/); -}); + + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); + + assert.throws(function() { + schema.create('user', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); + } +); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/delete-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/delete-test.js index 6370ed50c..d351fd8d7 100644 --- a/tests/integration/orm/belongs-to/6-one-way-reflexive/delete-test.js +++ b/tests/integration/orm/belongs-to/6-one-way-reflexive/delete-test.js @@ -1,24 +1,27 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One-Way Reflexive | delete', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | One-Way Reflexive | delete', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ user, targetUser ] = this.helper[state](); + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ user, targetUser ] = this.helper[state](); - if (targetUser) { - targetUser.destroy(); - user.reload(); - } + if (targetUser) { + targetUser.destroy(); + user.reload(); + } - assert.equal(user.userId, null); - assert.deepEqual(user.user, null); - }); + assert.equal(user.userId, null); + assert.deepEqual(user.user, null); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/instantiating-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/instantiating-test.js index 10d8f0a11..d5301f406 100644 --- a/tests/integration/orm/belongs-to/6-one-way-reflexive/instantiating-test.js +++ b/tests/integration/orm/belongs-to/6-one-way-reflexive/instantiating-test.js @@ -1,82 +1,85 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One-Way Reflexive | instantiating', { - beforeEach() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module( + 'Integration | ORM | Belongs To | One-Way Reflexive | instantiating', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the child accepts a saved parent id', function(assert) { + let parent = this.helper.savedParent(); + let child = this.schema.users.new({ userId: parent.id }); + + assert.equal(child.userId, parent.id); + assert.deepEqual(child.user.attrs, parent.attrs); + assert.deepEqual(child.attrs, { userId: parent.id }); + }); + + test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ userId: 2 }); + }, /You're instantiating a user that has a userId of 2, but that record doesn't exist in the database/); + }); + + test('the child accepts a null parent id', function(assert) { + let child = this.schema.users.new({ userId: null }); + + assert.equal(child.userId, null); + assert.deepEqual(child.user, null); + assert.deepEqual(child.attrs, { userId: null }); + }); + + test('the child accepts a saved parent model', function(assert) { + let parent = this.helper.savedParent(); + let child = this.schema.users.new({ user: parent }); + + assert.equal(child.userId, 1); + assert.deepEqual(child.user.attrs, parent.attrs); + }); + + test('the child accepts a new parent model', function(assert) { + let zelda = this.schema.users.new({ name: 'Zelda' }); + let child = this.schema.users.new({ user: zelda }); + + assert.equal(child.userId, null); + assert.deepEqual(child.user, zelda); + assert.deepEqual(child.attrs, { userId: null }); + }); + + test('the child accepts a null parent model', function(assert) { + let child = this.schema.users.new({ user: null }); + + assert.equal(child.userId, null); + assert.deepEqual(child.user, null); + assert.deepEqual(child.attrs, { userId: null }); + }); + + test('the child accepts a parent model and id', function(assert) { + let parent = this.helper.savedParent(); + let child = this.schema.users.new({ user: parent, userId: parent.id }); + + assert.equal(child.userId, '1'); + assert.deepEqual(child.user.attrs, parent.attrs); + assert.deepEqual(child.attrs, { userId: parent.id }); + }); + + test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let child = this.schema.users.new({}); + + assert.equal(child.userId, null); + assert.deepEqual(child.user, null); + assert.deepEqual(child.attrs, { userId: null }); + }); + + test('the child accepts no reference to a parent id or model', function(assert) { + let child = this.schema.users.new(); + + assert.equal(child.userId, null); + assert.deepEqual(child.user, null); + assert.deepEqual(child.attrs, { userId: null }); + }); } -}); - -test('the child accepts a saved parent id', function(assert) { - let parent = this.helper.savedParent(); - let child = this.schema.users.new({ userId: parent.id }); - - assert.equal(child.userId, parent.id); - assert.deepEqual(child.user.attrs, parent.attrs); - assert.deepEqual(child.attrs, { userId: parent.id }); -}); - -test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ userId: 2 }); - }, /You're instantiating a user that has a userId of 2, but that record doesn't exist in the database/); -}); - -test('the child accepts a null parent id', function(assert) { - let child = this.schema.users.new({ userId: null }); - - assert.equal(child.userId, null); - assert.deepEqual(child.user, null); - assert.deepEqual(child.attrs, { userId: null }); -}); - -test('the child accepts a saved parent model', function(assert) { - let parent = this.helper.savedParent(); - let child = this.schema.users.new({ user: parent }); - - assert.equal(child.userId, 1); - assert.deepEqual(child.user.attrs, parent.attrs); -}); - -test('the child accepts a new parent model', function(assert) { - let zelda = this.schema.users.new({ name: 'Zelda' }); - let child = this.schema.users.new({ user: zelda }); - - assert.equal(child.userId, null); - assert.deepEqual(child.user, zelda); - assert.deepEqual(child.attrs, { userId: null }); -}); - -test('the child accepts a null parent model', function(assert) { - let child = this.schema.users.new({ user: null }); - - assert.equal(child.userId, null); - assert.deepEqual(child.user, null); - assert.deepEqual(child.attrs, { userId: null }); -}); - -test('the child accepts a parent model and id', function(assert) { - let parent = this.helper.savedParent(); - let child = this.schema.users.new({ user: parent, userId: parent.id }); - - assert.equal(child.userId, '1'); - assert.deepEqual(child.user.attrs, parent.attrs); - assert.deepEqual(child.attrs, { userId: parent.id }); -}); - -test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let child = this.schema.users.new({}); - - assert.equal(child.userId, null); - assert.deepEqual(child.user, null); - assert.deepEqual(child.attrs, { userId: null }); -}); - -test('the child accepts no reference to a parent id or model', function(assert) { - let child = this.schema.users.new(); - - assert.equal(child.userId, null); - assert.deepEqual(child.user, null); - assert.deepEqual(child.attrs, { userId: null }); -}); +); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/accessor-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/accessor-test.js index 8ec26f279..27c5749ef 100644 --- a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/accessor-test.js +++ b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/accessor-test.js @@ -1,28 +1,31 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named One-Way Reflexive | accessor', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Named One-Way Reflexive | accessor', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The reference to a belongs-to association is correct, for all states -*/ -states.forEach((state) => { + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ user, parent ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ user, parent ] = this.helper[state](); - // We use .attrs here to avoid infinite recursion - if (parent) { - assert.deepEqual(user.parent.attrs, parent.attrs, 'the model reference is correct'); - assert.equal(user.parentId, parent.id, 'the modelId reference is correct'); - } else { - assert.deepEqual(user.parent, null, 'the model reference is correct'); - assert.equal(user.parentId, null, 'the modelId reference is correct'); - } - }); + // We use .attrs here to avoid infinite recursion + if (parent) { + assert.deepEqual(user.parent.attrs, parent.attrs, 'the model reference is correct'); + assert.equal(user.parentId, parent.id, 'the modelId reference is correct'); + } else { + assert.deepEqual(user.parent, null, 'the model reference is correct'); + assert.equal(user.parentId, null, 'the modelId reference is correct'); + } + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-create-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-create-test.js index b8ba3e4bd..fea218230 100644 --- a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-create-test.js +++ b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-create-test.js @@ -1,26 +1,29 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named One-Way Reflexive | association #create', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Named One-Way Reflexive | association #create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can create a belongs-to association, for all states -*/ -states.forEach((state) => { + /* + The model can create a belongs-to association, for all states + */ + states.forEach((state) => { - test(`a ${state} can create an associated parent`, function(assert) { - let [ child ] = this.helper[state](); + test(`a ${state} can create an associated parent`, function(assert) { + let [ child ] = this.helper[state](); - let ganon = child.createParent({ name: 'Ganon' }); + let ganon = child.createParent({ name: 'Ganon' }); - assert.ok(ganon.id, 'the parent was persisted'); - assert.deepEqual(child.parent.attrs, ganon.attrs); - assert.equal(child.parentId, ganon.id); - assert.equal(this.helper.schema.users.find(child.id).parentId, ganon.id, 'the child was persisted'); - }); + assert.ok(ganon.id, 'the parent was persisted'); + assert.deepEqual(child.parent.attrs, ganon.attrs); + assert.equal(child.parentId, ganon.id); + assert.equal(this.helper.schema.users.find(child.id).parentId, ganon.id, 'the child was persisted'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-new-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-new-test.js index 255ee4f39..27cbf9889 100644 --- a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-new-test.js +++ b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-new-test.js @@ -1,31 +1,34 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named One-Way Reflexive | association #new', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Named One-Way Reflexive | association #new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can make a new unsaved belongs-to association, for all states -*/ + /* + The model can make a new unsaved belongs-to association, for all states + */ -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can build a new associated parent`, function(assert) { - let [ child ] = this.helper[state](); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ child ] = this.helper[state](); - let ganon = child.newParent({ name: 'Ganon' }); + let ganon = child.newParent({ name: 'Ganon' }); - assert.ok(!ganon.id, 'the parent was not persisted'); - assert.deepEqual(child.parent, ganon); - assert.equal(child.parentId, null); + assert.ok(!ganon.id, 'the parent was not persisted'); + assert.deepEqual(child.parent, ganon); + assert.equal(child.parentId, null); - child.save(); + child.save(); - assert.ok(ganon.id, 'saving the child persists the parent'); - assert.equal(child.parentId, ganon.id, 'the childs fk was updated'); - }); + assert.ok(ganon.id, 'saving the child persists the parent'); + assert.equal(child.parentId, ganon.id, 'the childs fk was updated'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-id-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-id-test.js index 12e9f79bf..4a6d31a41 100644 --- a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-id-test.js +++ b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-id-test.js @@ -1,41 +1,44 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named One-Way Reflexive | association #setId', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Named One-Way Reflexive | association #setId', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parentId, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ child ] = this.helper[state](); - let savedParent = this.helper.savedParent(); + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ child ] = this.helper[state](); + let savedParent = this.helper.savedParent(); - child.parentId = savedParent.id; + child.parentId = savedParent.id; - assert.equal(child.parentId, savedParent.id); - assert.deepEqual(child.parent.attrs, savedParent.attrs); - }); + assert.equal(child.parentId, savedParent.id); + assert.deepEqual(child.parent.attrs, savedParent.attrs); + }); -}); + }); -[ - 'savedChildSavedParent', - 'newChildSavedParent' -].forEach((state) => { + [ + 'savedChildSavedParent', + 'newChildSavedParent' + ].forEach((state) => { - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ child ] = this.helper[state](); + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ child ] = this.helper[state](); - child.parentId = null; + child.parentId = null; - assert.equal(child.parentId, null); - assert.deepEqual(child.parent, null); - }); + assert.equal(child.parentId, null); + assert.deepEqual(child.parent, null); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-test.js index cee39ba39..0bdc202c8 100644 --- a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-test.js +++ b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-test.js @@ -1,44 +1,47 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named One-Way Reflexive | association #set', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Named One-Way Reflexive | association #set', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parent, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ child ] = this.helper[state](); - let savedParent = this.helper.savedParent(); + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ child ] = this.helper[state](); + let savedParent = this.helper.savedParent(); - child.parent = savedParent; + child.parent = savedParent; - assert.equal(child.parentId, savedParent.id); - assert.deepEqual(child.parent.attrs, savedParent.attrs); - }); + assert.equal(child.parentId, savedParent.id); + assert.deepEqual(child.parent.attrs, savedParent.attrs); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ child ] = this.helper[state](); - let newParent = this.helper.newParent(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ child ] = this.helper[state](); + let newParent = this.helper.newParent(); - child.parent = newParent; + child.parent = newParent; - assert.equal(child.parentId, null); - assert.deepEqual(child.parent, newParent); - }); + assert.equal(child.parentId, null); + assert.deepEqual(child.parent, newParent); + }); - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ child ] = this.helper[state](); + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ child ] = this.helper[state](); - child.parent = null; + child.parent = null; - assert.equal(child.parentId, null); - assert.deepEqual(child.parent, null); - }); + assert.equal(child.parentId, null); + assert.deepEqual(child.parent, null); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/create-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/create-test.js index e6ffefc94..adc3c3621 100644 --- a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/create-test.js +++ b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/create-test.js @@ -2,59 +2,62 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named One-Way Reflexive | create', { - beforeEach() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - } -}); - -test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let parent = schema.create('user'); - let child = schema.create('user', { - parentId: parent.id - }); - - assert.equal(child.parentId, parent.id); - assert.deepEqual(child.parent.attrs, parent.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', parentId: null }); - assert.deepEqual(schema.db.users[1], { id: '2', parentId: '1' }); -}); - -test('it sets up associations correctly when passing in the association itself', function(assert) { - let { schema } = this.helper; - let parent = schema.create('user'); - let child = schema.create('user', { - parent - }); - - assert.equal(child.parentId, parent.id); - assert.deepEqual(child.parent.attrs, parent.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', parentId: null }); - assert.deepEqual(schema.db.users[1], { id: '2', parentId: '1' }); -}); - -test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.create('user', { - foo: schema.create('foo') +module( + 'Integration | ORM | Belongs To | Named One-Way Reflexive | create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + }); + + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let parent = schema.create('user'); + let child = schema.create('user', { + parentId: parent.id + }); + + assert.equal(child.parentId, parent.id); + assert.deepEqual(child.parent.attrs, parent.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', parentId: null }); + assert.deepEqual(schema.db.users[1], { id: '2', parentId: '1' }); + }); + + test('it sets up associations correctly when passing in the association itself', function(assert) { + let { schema } = this.helper; + let parent = schema.create('user'); + let child = schema.create('user', { + parent + }); + + assert.equal(child.parentId, parent.id); + assert.deepEqual(child.parent.attrs, parent.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', parentId: null }); + assert.deepEqual(schema.db.users[1], { id: '2', parentId: '1' }); }); - }, /you haven't defined that key as an association on your model/); -}); -test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.create('user', { - foos: schema.foos.all() + assert.throws(function() { + schema.create('user', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); }); - }, /you haven't defined that key as an association on your model/); -}); + + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); + + assert.throws(function() { + schema.create('user', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); + } +); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/delete-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/delete-test.js index b6518e378..3e6bbabbe 100644 --- a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/delete-test.js +++ b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/delete-test.js @@ -1,24 +1,27 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named One-Way Reflexive | delete', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | Named One-Way Reflexive | delete', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ user, parent ] = this.helper[state](); + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ user, parent ] = this.helper[state](); - if (parent) { - parent.destroy(); - user.reload(); - } + if (parent) { + parent.destroy(); + user.reload(); + } - assert.equal(user.parentId, null); - assert.deepEqual(user.parent, null); - }); + assert.equal(user.parentId, null); + assert.deepEqual(user.parent, null); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/instantiating-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/instantiating-test.js index cb16bffcd..ff3ddf7a8 100644 --- a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/instantiating-test.js +++ b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/instantiating-test.js @@ -1,82 +1,85 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Named One-Way Reflexive | instantiating', { - beforeEach() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module( + 'Integration | ORM | Belongs To | Named One-Way Reflexive | instantiating', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the child accepts a saved parent id', function(assert) { + let parent = this.helper.savedParent(); + let child = this.schema.users.new({ parentId: parent.id }); + + assert.equal(child.parentId, parent.id); + assert.deepEqual(child.parent.attrs, parent.attrs); + assert.deepEqual(child.attrs, { parentId: parent.id }); + }); + + test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ parentId: 2 }); + }, /You're instantiating a user that has a parentId of 2, but that record doesn't exist in the database/); + }); + + test('the child accepts a null parent id', function(assert) { + let child = this.schema.users.new({ parentId: null }); + + assert.equal(child.parentId, null); + assert.deepEqual(child.parent, null); + assert.deepEqual(child.attrs, { parentId: null }); + }); + + test('the child accepts a saved parent model', function(assert) { + let parent = this.helper.savedParent(); + let child = this.schema.users.new({ parent }); + + assert.equal(child.parentId, 1); + assert.deepEqual(child.parent.attrs, parent.attrs); + }); + + test('the child accepts a new parent model', function(assert) { + let zelda = this.schema.users.new({ name: 'Zelda' }); + let child = this.schema.users.new({ parent: zelda }); + + assert.equal(child.parentId, null); + assert.deepEqual(child.parent, zelda); + assert.deepEqual(child.attrs, { parentId: null }); + }); + + test('the child accepts a null parent model', function(assert) { + let child = this.schema.users.new({ parent: null }); + + assert.equal(child.parentId, null); + assert.deepEqual(child.parent, null); + assert.deepEqual(child.attrs, { parentId: null }); + }); + + test('the child accepts a parent model and id', function(assert) { + let parent = this.helper.savedParent(); + let child = this.schema.users.new({ parent, parentId: parent.id }); + + assert.equal(child.parentId, '1'); + assert.deepEqual(child.parent.attrs, parent.attrs); + assert.deepEqual(child.attrs, { parentId: parent.id }); + }); + + test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let child = this.schema.users.new({}); + + assert.equal(child.parentId, null); + assert.deepEqual(child.parent, null); + assert.deepEqual(child.attrs, { parentId: null }); + }); + + test('the child accepts no reference to a parent id or model', function(assert) { + let child = this.schema.users.new(); + + assert.equal(child.parentId, null); + assert.deepEqual(child.parent, null); + assert.deepEqual(child.attrs, { parentId: null }); + }); } -}); - -test('the child accepts a saved parent id', function(assert) { - let parent = this.helper.savedParent(); - let child = this.schema.users.new({ parentId: parent.id }); - - assert.equal(child.parentId, parent.id); - assert.deepEqual(child.parent.attrs, parent.attrs); - assert.deepEqual(child.attrs, { parentId: parent.id }); -}); - -test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ parentId: 2 }); - }, /You're instantiating a user that has a parentId of 2, but that record doesn't exist in the database/); -}); - -test('the child accepts a null parent id', function(assert) { - let child = this.schema.users.new({ parentId: null }); - - assert.equal(child.parentId, null); - assert.deepEqual(child.parent, null); - assert.deepEqual(child.attrs, { parentId: null }); -}); - -test('the child accepts a saved parent model', function(assert) { - let parent = this.helper.savedParent(); - let child = this.schema.users.new({ parent }); - - assert.equal(child.parentId, 1); - assert.deepEqual(child.parent.attrs, parent.attrs); -}); - -test('the child accepts a new parent model', function(assert) { - let zelda = this.schema.users.new({ name: 'Zelda' }); - let child = this.schema.users.new({ parent: zelda }); - - assert.equal(child.parentId, null); - assert.deepEqual(child.parent, zelda); - assert.deepEqual(child.attrs, { parentId: null }); -}); - -test('the child accepts a null parent model', function(assert) { - let child = this.schema.users.new({ parent: null }); - - assert.equal(child.parentId, null); - assert.deepEqual(child.parent, null); - assert.deepEqual(child.attrs, { parentId: null }); -}); - -test('the child accepts a parent model and id', function(assert) { - let parent = this.helper.savedParent(); - let child = this.schema.users.new({ parent, parentId: parent.id }); - - assert.equal(child.parentId, '1'); - assert.deepEqual(child.parent.attrs, parent.attrs); - assert.deepEqual(child.attrs, { parentId: parent.id }); -}); - -test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let child = this.schema.users.new({}); - - assert.equal(child.parentId, null); - assert.deepEqual(child.parent, null); - assert.deepEqual(child.attrs, { parentId: null }); -}); - -test('the child accepts no reference to a parent id or model', function(assert) { - let child = this.schema.users.new(); - - assert.equal(child.parentId, null); - assert.deepEqual(child.parent, null); - assert.deepEqual(child.attrs, { parentId: null }); -}); +); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/accessor-test.js b/tests/integration/orm/belongs-to/8-one-to-one/accessor-test.js index d3a4562d2..30f1abe56 100644 --- a/tests/integration/orm/belongs-to/8-one-to-one/accessor-test.js +++ b/tests/integration/orm/belongs-to/8-one-to-one/accessor-test.js @@ -1,34 +1,37 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One To One | accessor', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | One To One | accessor', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The reference to a belongs-to association is correct, for all states -*/ -states.forEach((state) => { + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ user, profile ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ user, profile ] = this.helper[state](); - // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison - if (profile) { - assert.deepEqual(user.profile.attrs, profile.attrs, 'the model reference is correct'); - assert.equal(user.profileId, profile.id, 'the modelId reference is correct'); - } else { - assert.deepEqual(user.profile, null, 'the model reference is correct'); - assert.equal(user.profileId, null, 'the modelId reference is correct'); - } + // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison + if (profile) { + assert.deepEqual(user.profile.attrs, profile.attrs, 'the model reference is correct'); + assert.equal(user.profileId, profile.id, 'the modelId reference is correct'); + } else { + assert.deepEqual(user.profile, null, 'the model reference is correct'); + assert.equal(user.profileId, null, 'the modelId reference is correct'); + } - // If there's a profile in this state, make sure the inverse association is correct - if (profile) { - assert.deepEqual(profile.user.attrs, user.attrs, 'the inverse model reference is correct'); - assert.equal(profile.userId, user.id, 'the inverse modelId reference is correct'); - } - }); + // If there's a profile in this state, make sure the inverse association is correct + if (profile) { + assert.deepEqual(profile.user.attrs, user.attrs, 'the inverse model reference is correct'); + assert.equal(profile.userId, user.id, 'the inverse modelId reference is correct'); + } + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/association-create-test.js b/tests/integration/orm/belongs-to/8-one-to-one/association-create-test.js index fc2bbfba4..32d396e66 100644 --- a/tests/integration/orm/belongs-to/8-one-to-one/association-create-test.js +++ b/tests/integration/orm/belongs-to/8-one-to-one/association-create-test.js @@ -1,27 +1,30 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One To One | association #create', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | One To One | association #create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can create a belongs-to association, for all states -*/ -states.forEach((state) => { + /* + The model can create a belongs-to association, for all states + */ + states.forEach((state) => { - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); - let profile = user.createProfile({ age: 300 }); + let profile = user.createProfile({ age: 300 }); - assert.ok(profile.id, 'the parent was persisted'); - assert.deepEqual(user.profile.attrs, profile.attrs); - assert.deepEqual(profile.user.attrs, user.attrs, 'the inverse was set'); - assert.equal(user.profileId, profile.id); - assert.equal(this.helper.schema.users.find(user.id).profileId, profile.id, 'the user was persisted'); - }); + assert.ok(profile.id, 'the parent was persisted'); + assert.deepEqual(user.profile.attrs, profile.attrs); + assert.deepEqual(profile.user.attrs, user.attrs, 'the inverse was set'); + assert.equal(user.profileId, profile.id); + assert.equal(this.helper.schema.users.find(user.id).profileId, profile.id, 'the user was persisted'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/association-new-test.js b/tests/integration/orm/belongs-to/8-one-to-one/association-new-test.js index ad9f5c80b..3fbe44d1b 100644 --- a/tests/integration/orm/belongs-to/8-one-to-one/association-new-test.js +++ b/tests/integration/orm/belongs-to/8-one-to-one/association-new-test.js @@ -1,33 +1,36 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One To One | association #new', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | One To One | association #new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can make a new unsaved belongs-to association, for all states -*/ + /* + The model can make a new unsaved belongs-to association, for all states + */ -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); - let profile = user.newProfile({ age: 300 }); + let profile = user.newProfile({ age: 300 }); - assert.ok(!profile.id, 'the parent was not persisted'); - assert.deepEqual(user.profile, profile); - assert.equal(user.profileId, null); - assert.deepEqual(profile.user, user, 'the inverse was set'); - assert.equal(profile.userId, user.id); + assert.ok(!profile.id, 'the parent was not persisted'); + assert.deepEqual(user.profile, profile); + assert.equal(user.profileId, null); + assert.deepEqual(profile.user, user, 'the inverse was set'); + assert.equal(profile.userId, user.id); - user.save(); + user.save(); - assert.ok(profile.id, 'saving the child persists the parent'); - assert.equal(user.profileId, profile.id, 'the childs fk was updated'); - }); + assert.ok(profile.id, 'saving the child persists the parent'); + assert.equal(user.profileId, profile.id, 'the childs fk was updated'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/association-set-id-test.js b/tests/integration/orm/belongs-to/8-one-to-one/association-set-id-test.js index 3d34c65e7..361b6467d 100644 --- a/tests/integration/orm/belongs-to/8-one-to-one/association-set-id-test.js +++ b/tests/integration/orm/belongs-to/8-one-to-one/association-set-id-test.js @@ -1,47 +1,50 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One To One | association #setId', { - beforeEach() { - this.helper = new Helper(); +module( + 'Integration | ORM | Belongs To | One To One | association #setId', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); + + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user ] = this.helper[state](); + let profile = this.helper.savedParent(); + + user.profileId = profile.id; + + assert.equal(user.profileId, profile.id); + assert.deepEqual(user.profile.attrs, profile.attrs); + + user.save(); + profile.reload(); + + assert.equal(profile.userId, user.id, 'the inverse was set'); + assert.deepEqual(profile.user.attrs, user.attrs); + }); + + }); + + // [ + // 'savedChildSavedParent', + // 'newChildSavedParent' + // ].forEach((state) => { + // + // test(`a ${state} can clear its association via a null parentId`, function(assert) { + // let [ user ] = this.helper[state](); + // + // user.userId = null; + // + // assert.equal(user.userId, null); + // assert.equal(user.user, null); + // }); + // + // }); } -}); - -/* - The model can update its association via parentId, for all states -*/ -states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user ] = this.helper[state](); - let profile = this.helper.savedParent(); - - user.profileId = profile.id; - - assert.equal(user.profileId, profile.id); - assert.deepEqual(user.profile.attrs, profile.attrs); - - user.save(); - profile.reload(); - - assert.equal(profile.userId, user.id, 'the inverse was set'); - assert.deepEqual(profile.user.attrs, user.attrs); - }); - -}); - -// [ -// 'savedChildSavedParent', -// 'newChildSavedParent' -// ].forEach((state) => { -// -// test(`a ${state} can clear its association via a null parentId`, function(assert) { -// let [ user ] = this.helper[state](); -// -// user.userId = null; -// -// assert.equal(user.userId, null); -// assert.equal(user.user, null); -// }); -// -// }); +); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/association-set-test.js b/tests/integration/orm/belongs-to/8-one-to-one/association-set-test.js index 913bf477d..ed32c5686 100644 --- a/tests/integration/orm/belongs-to/8-one-to-one/association-set-test.js +++ b/tests/integration/orm/belongs-to/8-one-to-one/association-set-test.js @@ -1,49 +1,52 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One To One | association #set', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | One To One | association #set', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parent, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ user ] = this.helper[state](); - let profile = this.helper.savedParent(); + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ user ] = this.helper[state](); + let profile = this.helper.savedParent(); - user.profile = profile; + user.profile = profile; - assert.equal(user.profileId, profile.id); - assert.deepEqual(user.profile.attrs, profile.attrs); - assert.equal(profile.userId, user.id, 'the inverse was set'); - assert.deepEqual(profile.user.attrs, user.attrs); - }); + assert.equal(user.profileId, profile.id); + assert.deepEqual(user.profile.attrs, profile.attrs); + assert.equal(profile.userId, user.id, 'the inverse was set'); + assert.deepEqual(profile.user.attrs, user.attrs); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user ] = this.helper[state](); - let profile = this.helper.newParent(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user ] = this.helper[state](); + let profile = this.helper.newParent(); - user.profile = profile; + user.profile = profile; - assert.equal(user.profileId, null); - assert.deepEqual(user.profile.attrs, profile.attrs); + assert.equal(user.profileId, null); + assert.deepEqual(user.profile.attrs, profile.attrs); - assert.equal(profile.userId, user.id, 'the inverse was set'); - assert.deepEqual(profile.user.attrs, user.attrs); - }); + assert.equal(profile.userId, user.id, 'the inverse was set'); + assert.deepEqual(profile.user.attrs, user.attrs); + }); - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ user ] = this.helper[state](); + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ user ] = this.helper[state](); - user.profile = null; + user.profile = null; - assert.equal(user.profileId, null); - assert.deepEqual(user.profile, null); - }); + assert.equal(user.profileId, null); + assert.deepEqual(user.profile, null); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/create-test.js b/tests/integration/orm/belongs-to/8-one-to-one/create-test.js index e0bb92750..f438c1abb 100644 --- a/tests/integration/orm/belongs-to/8-one-to-one/create-test.js +++ b/tests/integration/orm/belongs-to/8-one-to-one/create-test.js @@ -2,64 +2,64 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One To One | create', { - beforeEach() { +module('Integration | ORM | Belongs To | One To One | create', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); this.helper.schema.registerModel('foo', Model); - } -}); - -test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let profile = schema.create('profile'); - let user = schema.create('user', { - profileId: profile.id }); - profile.reload(); - assert.equal(user.profileId, profile.id); - assert.deepEqual(user.profile.attrs, profile.attrs); - assert.deepEqual(profile.user.attrs, user.attrs); - assert.equal(schema.db.users.length, 1); - assert.equal(schema.db.profiles.length, 1); - assert.deepEqual(schema.db.users[0], { id: '1', profileId: '1' }); - assert.deepEqual(schema.db.profiles[0], { id: '1', userId: '1' }); -}); + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let profile = schema.create('profile'); + let user = schema.create('user', { + profileId: profile.id + }); + profile.reload(); -test('it sets up associations correctly when passing in the association itself', function(assert) { - let { schema } = this.helper; - let profile = schema.create('profile'); - let user = schema.create('user', { - profile + assert.equal(user.profileId, profile.id); + assert.deepEqual(user.profile.attrs, profile.attrs); + assert.deepEqual(profile.user.attrs, user.attrs); + assert.equal(schema.db.users.length, 1); + assert.equal(schema.db.profiles.length, 1); + assert.deepEqual(schema.db.users[0], { id: '1', profileId: '1' }); + assert.deepEqual(schema.db.profiles[0], { id: '1', userId: '1' }); }); - assert.equal(user.profileId, profile.id); - assert.deepEqual(user.profile.attrs, profile.attrs); - assert.deepEqual(profile.user.attrs, user.attrs); - assert.equal(schema.db.users.length, 1); - assert.equal(schema.db.profiles.length, 1); - assert.deepEqual(schema.db.users[0], { id: '1', profileId: '1' }); - assert.deepEqual(schema.db.profiles[0], { id: '1', userId: '1' }); -}); + test('it sets up associations correctly when passing in the association itself', function(assert) { + let { schema } = this.helper; + let profile = schema.create('profile'); + let user = schema.create('user', { + profile + }); -test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + assert.equal(user.profileId, profile.id); + assert.deepEqual(user.profile.attrs, profile.attrs); + assert.deepEqual(profile.user.attrs, user.attrs); + assert.equal(schema.db.users.length, 1); + assert.equal(schema.db.profiles.length, 1); + assert.deepEqual(schema.db.users[0], { id: '1', profileId: '1' }); + assert.deepEqual(schema.db.profiles[0], { id: '1', userId: '1' }); + }); - assert.throws(function() { - schema.create('user', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); -}); + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('user', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); + }); -test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); - assert.throws(function() { - schema.create('user', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); + assert.throws(function() { + schema.create('user', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); }); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/delete-test.js b/tests/integration/orm/belongs-to/8-one-to-one/delete-test.js index 4dc9d52c9..0799df441 100644 --- a/tests/integration/orm/belongs-to/8-one-to-one/delete-test.js +++ b/tests/integration/orm/belongs-to/8-one-to-one/delete-test.js @@ -1,24 +1,24 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One To One | delete', { - beforeEach() { +module('Integration | ORM | Belongs To | One To One | delete', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); - } -}); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ user, profile ] = this.helper[state](); + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ user, profile ] = this.helper[state](); - if (profile) { - profile.destroy(); - user.reload(); - } + if (profile) { + profile.destroy(); + user.reload(); + } - assert.equal(user.profileId, null); - assert.deepEqual(user.profile, null); - }); + assert.equal(user.profileId, null); + assert.deepEqual(user.profile, null); + }); + }); }); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/instantiating-test.js b/tests/integration/orm/belongs-to/8-one-to-one/instantiating-test.js index a0e1ba6b7..c306fb8dd 100644 --- a/tests/integration/orm/belongs-to/8-one-to-one/instantiating-test.js +++ b/tests/integration/orm/belongs-to/8-one-to-one/instantiating-test.js @@ -1,83 +1,86 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One To One | instantiating', { - beforeEach() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module( + 'Integration | ORM | Belongs To | One To One | instantiating', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the child accepts a saved parent id', function(assert) { + let profile = this.helper.savedParent(); + let user = this.schema.users.new({ profileId: profile.id }); + + assert.equal(user.profileId, profile.id); + assert.deepEqual(user.profile.attrs, profile.attrs); + assert.deepEqual(user.attrs, { profileId: profile.id }); + }); + + test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ profileId: 2 }); + }, /You're instantiating a user that has a profileId of 2, but that record doesn't exist in the database/); + }); + + test('the child accepts a null parent id', function(assert) { + let user = this.schema.users.new({ profileId: null }); + + assert.equal(user.profileId, null); + assert.equal(user.profile, null); + assert.deepEqual(user.attrs, { profileId: null }); + }); + + test('the child accepts a saved parent model', function(assert) { + let profile = this.helper.savedParent(); + let user = this.schema.users.new({ profile }); + + assert.equal(user.profileId, 1); + assert.deepEqual(user.profile.attrs, profile.attrs); + assert.deepEqual(user.attrs, { profileId: null }); // this would update when saved + }); + + test('the child accepts a new parent model', function(assert) { + let profile = this.schema.profiles.new({ age: 300 }); + let user = this.schema.users.new({ profile }); + + assert.equal(user.profileId, null); + assert.deepEqual(user.profile, profile); + assert.deepEqual(user.attrs, { profileId: null }); + }); + + test('the child accepts a null parent model', function(assert) { + let user = this.schema.users.new({ profile: null }); + + assert.equal(user.profileId, null); + assert.deepEqual(user.profile, null); + assert.deepEqual(user.attrs, { profileId: null }); + }); + + test('the child accepts a parent model and id', function(assert) { + let profile = this.helper.savedParent(); + let user = this.schema.users.new({ profile, profileId: profile.id }); + + assert.equal(user.profileId, '1'); + assert.deepEqual(user.profile, profile); + assert.deepEqual(user.attrs, { profileId: profile.id }); + }); + + test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let user = this.schema.users.new({}); + + assert.equal(user.profileId, null); + assert.deepEqual(user.profile, null); + assert.deepEqual(user.attrs, { profileId: null }); + }); + + test('the child accepts no reference to a parent id or model', function(assert) { + let user = this.schema.users.new(); + + assert.equal(user.profileId, null); + assert.deepEqual(user.profile, null); + assert.deepEqual(user.attrs, { profileId: null }); + }); } -}); - -test('the child accepts a saved parent id', function(assert) { - let profile = this.helper.savedParent(); - let user = this.schema.users.new({ profileId: profile.id }); - - assert.equal(user.profileId, profile.id); - assert.deepEqual(user.profile.attrs, profile.attrs); - assert.deepEqual(user.attrs, { profileId: profile.id }); -}); - -test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ profileId: 2 }); - }, /You're instantiating a user that has a profileId of 2, but that record doesn't exist in the database/); -}); - -test('the child accepts a null parent id', function(assert) { - let user = this.schema.users.new({ profileId: null }); - - assert.equal(user.profileId, null); - assert.equal(user.profile, null); - assert.deepEqual(user.attrs, { profileId: null }); -}); - -test('the child accepts a saved parent model', function(assert) { - let profile = this.helper.savedParent(); - let user = this.schema.users.new({ profile }); - - assert.equal(user.profileId, 1); - assert.deepEqual(user.profile.attrs, profile.attrs); - assert.deepEqual(user.attrs, { profileId: null }); // this would update when saved -}); - -test('the child accepts a new parent model', function(assert) { - let profile = this.schema.profiles.new({ age: 300 }); - let user = this.schema.users.new({ profile }); - - assert.equal(user.profileId, null); - assert.deepEqual(user.profile, profile); - assert.deepEqual(user.attrs, { profileId: null }); -}); - -test('the child accepts a null parent model', function(assert) { - let user = this.schema.users.new({ profile: null }); - - assert.equal(user.profileId, null); - assert.deepEqual(user.profile, null); - assert.deepEqual(user.attrs, { profileId: null }); -}); - -test('the child accepts a parent model and id', function(assert) { - let profile = this.helper.savedParent(); - let user = this.schema.users.new({ profile, profileId: profile.id }); - - assert.equal(user.profileId, '1'); - assert.deepEqual(user.profile, profile); - assert.deepEqual(user.attrs, { profileId: profile.id }); -}); - -test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let user = this.schema.users.new({}); - - assert.equal(user.profileId, null); - assert.deepEqual(user.profile, null); - assert.deepEqual(user.attrs, { profileId: null }); -}); - -test('the child accepts no reference to a parent id or model', function(assert) { - let user = this.schema.users.new(); - - assert.equal(user.profileId, null); - assert.deepEqual(user.profile, null); - assert.deepEqual(user.attrs, { profileId: null }); -}); +); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/accessor-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/accessor-test.js index db7ebabca..74d3195e1 100644 --- a/tests/integration/orm/belongs-to/9-one-way-polymorphic/accessor-test.js +++ b/tests/integration/orm/belongs-to/9-one-way-polymorphic/accessor-test.js @@ -1,22 +1,25 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One-way Polymorphic | accessor', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | One-way Polymorphic | accessor', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The reference to a belongs-to association is correct, for all states -*/ -states.forEach((state) => { + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ comment, post ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ comment, post ] = this.helper[state](); - assert.deepEqual(comment.commentable, post ? post : null, 'the model reference is correct'); - assert.deepEqual(comment.commentableId, post ? { id: post.id, type: 'post' } : null, 'the modelId reference is correct'); - }); + assert.deepEqual(comment.commentable, post ? post : null, 'the model reference is correct'); + assert.deepEqual(comment.commentableId, post ? { id: post.id, type: 'post' } : null, 'the modelId reference is correct'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-create-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-create-test.js index 34ad5af9c..5d476e22b 100644 --- a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-create-test.js +++ b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-create-test.js @@ -1,26 +1,29 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One-way Polymorphic | association #create', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | One-way Polymorphic | association #create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can create a belongs-to association, for all states -*/ -states.forEach((state) => { + /* + The model can create a belongs-to association, for all states + */ + states.forEach((state) => { - test(`a ${state} can create an associated parent`, function(assert) { - let [ comment ] = this.helper[state](); + test(`a ${state} can create an associated parent`, function(assert) { + let [ comment ] = this.helper[state](); - let post = comment.createCommentable('post', { title: 'Lorem ipsum' }); + let post = comment.createCommentable('post', { title: 'Lorem ipsum' }); - assert.ok(post.id, 'the parent was persisted'); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }); - assert.ok(this.helper.db.posts.find(post.id), 'the child was persisted'); - }); + assert.ok(post.id, 'the parent was persisted'); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }); + assert.ok(this.helper.db.posts.find(post.id), 'the child was persisted'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-new-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-new-test.js index c4051a38e..3c188eda6 100644 --- a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-new-test.js +++ b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-new-test.js @@ -1,31 +1,34 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One-way Polymorphic | association #new', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | One-way Polymorphic | association #new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can make a new unsaved belongs-to association, for all states -*/ + /* + The model can make a new unsaved belongs-to association, for all states + */ -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can build a new associated parent`, function(assert) { - let [ comment ] = this.helper[state](); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ comment ] = this.helper[state](); - let post = comment.newCommentable('post', { title: 'Lorem ipsum' }); + let post = comment.newCommentable('post', { title: 'Lorem ipsum' }); - assert.ok(!post.id, 'the parent was not persisted'); - assert.deepEqual(comment.commentable, post); - assert.deepEqual(comment.commentableId, { id: undefined, type: 'post' }); + assert.ok(!post.id, 'the parent was not persisted'); + assert.deepEqual(comment.commentable, post); + assert.deepEqual(comment.commentableId, { id: undefined, type: 'post' }); - comment.save(); + comment.save(); - assert.ok(post.id, 'saving the child persists the parent'); - assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }, 'the childs fk was updated'); - }); + assert.ok(post.id, 'saving the child persists the parent'); + assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }, 'the childs fk was updated'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-id-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-id-test.js index 442c8d3f1..7f1226ecc 100644 --- a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-id-test.js +++ b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-id-test.js @@ -1,41 +1,44 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One-way Polymorphic | association #setId', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | One-way Polymorphic | association #setId', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parentId, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ comment ] = this.helper[state](); - let savedPost = this.helper.savedParent(); + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ comment ] = this.helper[state](); + let savedPost = this.helper.savedParent(); - comment.commentableId = { id: savedPost.id, type: 'post' }; + comment.commentableId = { id: savedPost.id, type: 'post' }; - assert.deepEqual(comment.commentableId, { id: savedPost.id, type: 'post' }); - assert.deepEqual(comment.commentable.attrs, savedPost.attrs); - }); + assert.deepEqual(comment.commentableId, { id: savedPost.id, type: 'post' }); + assert.deepEqual(comment.commentable.attrs, savedPost.attrs); + }); -}); + }); -[ - 'savedChildSavedParent', - 'newChildSavedParent' -].forEach((state) => { + [ + 'savedChildSavedParent', + 'newChildSavedParent' + ].forEach((state) => { - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ comment ] = this.helper[state](); + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ comment ] = this.helper[state](); - comment.commentableId = null; + comment.commentableId = null; - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - }); + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-test.js index 7d3715db2..f0a2389f0 100644 --- a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-test.js +++ b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-test.js @@ -1,44 +1,47 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One-way Polymorphic | association #set', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | One-way Polymorphic | association #set', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parent, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ comment ] = this.helper[state](); - let savedPost = this.helper.savedParent(); + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ comment ] = this.helper[state](); + let savedPost = this.helper.savedParent(); - comment.commentable = savedPost; + comment.commentable = savedPost; - assert.deepEqual(comment.commentableId, { id: savedPost.id, type: 'post' }); - assert.deepEqual(comment.commentable, savedPost); - }); + assert.deepEqual(comment.commentableId, { id: savedPost.id, type: 'post' }); + assert.deepEqual(comment.commentable, savedPost); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ comment ] = this.helper[state](); - let newPost = this.helper.newParent(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ comment ] = this.helper[state](); + let newPost = this.helper.newParent(); - comment.commentable = newPost; + comment.commentable = newPost; - assert.deepEqual(comment.commentableId, { id: undefined, type: 'post' }); - assert.deepEqual(comment.commentable, newPost); - }); + assert.deepEqual(comment.commentableId, { id: undefined, type: 'post' }); + assert.deepEqual(comment.commentable, newPost); + }); - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ comment ] = this.helper[state](); + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ comment ] = this.helper[state](); - comment.commentable = null; + comment.commentable = null; - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - }); + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/create-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/create-test.js index fa15979e4..106e8f687 100644 --- a/tests/integration/orm/belongs-to/9-one-way-polymorphic/create-test.js +++ b/tests/integration/orm/belongs-to/9-one-way-polymorphic/create-test.js @@ -2,37 +2,40 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One-way Polymorphic | create', { - beforeEach() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - } -}); +module( + 'Integration | ORM | Belongs To | One-way Polymorphic | create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + }); -test('it sets up associations correctly when passing in the foreign key', function(assert) { - let post = this.helper.schema.create('post'); - let comment = this.helper.schema.create('comment', { - commentableId: { id: post.id, type: 'post' } - }); + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let post = this.helper.schema.create('post'); + let comment = this.helper.schema.create('comment', { + commentableId: { id: post.id, type: 'post' } + }); - assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.equal(this.helper.schema.db.posts.length, 1); - assert.deepEqual(this.helper.schema.db.posts[0], { id: '1' }); - assert.equal(this.helper.schema.db.comments.length, 1); - assert.deepEqual(this.helper.schema.db.comments[0], { id: '1', commentableId: { id: '1', type: 'post' } }); -}); + assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.equal(this.helper.schema.db.posts.length, 1); + assert.deepEqual(this.helper.schema.db.posts[0], { id: '1' }); + assert.equal(this.helper.schema.db.comments.length, 1); + assert.deepEqual(this.helper.schema.db.comments[0], { id: '1', commentableId: { id: '1', type: 'post' } }); + }); -test('it sets up associations correctly when passing in the association itself', function(assert) { - let post = this.helper.schema.create('post'); - let comment = this.helper.schema.create('comment', { - commentable: post - }); + test('it sets up associations correctly when passing in the association itself', function(assert) { + let post = this.helper.schema.create('post'); + let comment = this.helper.schema.create('comment', { + commentable: post + }); - assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.equal(this.helper.schema.db.posts.length, 1); - assert.deepEqual(this.helper.schema.db.posts[0], { id: '1' }); - assert.equal(this.helper.schema.db.comments.length, 1); - assert.deepEqual(this.helper.schema.db.comments[0], { id: '1', commentableId: { id: '1', type: 'post' } }); -}); + assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.equal(this.helper.schema.db.posts.length, 1); + assert.deepEqual(this.helper.schema.db.posts[0], { id: '1' }); + assert.equal(this.helper.schema.db.comments.length, 1); + assert.deepEqual(this.helper.schema.db.comments[0], { id: '1', commentableId: { id: '1', type: 'post' } }); + }); + } +); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/delete-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/delete-test.js index fc470ab30..0293d0ea5 100644 --- a/tests/integration/orm/belongs-to/9-one-way-polymorphic/delete-test.js +++ b/tests/integration/orm/belongs-to/9-one-way-polymorphic/delete-test.js @@ -1,24 +1,27 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One-way Polymorphic | delete', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Belongs To | One-way Polymorphic | delete', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ comment, post ] = this.helper[state](); + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ comment, post ] = this.helper[state](); - if (post) { - post.destroy(); - comment.reload(); - } + if (post) { + post.destroy(); + comment.reload(); + } - assert.equal(comment.commentableId, null); - assert.equal(comment.post, null); - }); + assert.equal(comment.commentableId, null); + assert.equal(comment.post, null); + }); -}); + }); + } +); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/instantiating-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/instantiating-test.js index 419a67625..463dc5c58 100644 --- a/tests/integration/orm/belongs-to/9-one-way-polymorphic/instantiating-test.js +++ b/tests/integration/orm/belongs-to/9-one-way-polymorphic/instantiating-test.js @@ -1,84 +1,87 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | One-way Polymorphic | instantiating', { - beforeEach() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module( + 'Integration | ORM | Belongs To | One-way Polymorphic | instantiating', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the child accepts a saved parent id', function(assert) { + let post = this.helper.savedParent(); + let comment = this.schema.comments.new({ + commentableId: { id: post.id, type: 'post' } + }); + + assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }); + assert.deepEqual(comment.commentable, post); + assert.deepEqual(comment.attrs, { commentableId: { id: post.id, type: 'post' } }); + }); + + test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.comments.new({ commentableId: { type: 'post', id: 2 } }); + }, /You're instantiating a comment that has a commentableId of post:2, but that record doesn't exist in the database/); + }); + + test('the child accepts a null parent id', function(assert) { + let comment = this.schema.comments.new({ commentableId: null }); + + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + assert.deepEqual(comment.attrs, { commentableId: null }); + }); + + test('the child accepts a saved parent model', function(assert) { + let post = this.helper.savedParent(); + let comment = this.schema.comments.new({ commentable: post }); + + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); + assert.deepEqual(comment.commentable, post); + }); + + test('the child accepts a new parent model', function(assert) { + let post = this.schema.posts.new({ text: 'foo' }); + let comment = this.schema.comments.new({ commentable: post }); + + assert.deepEqual(comment.commentableId, { type: 'post', id: undefined }); + assert.deepEqual(comment.commentable, post); + assert.deepEqual(comment.attrs, { commentableId: null }); + }); + + test('the child accepts a null parent model', function(assert) { + let comment = this.schema.comments.new({ commentable: null }); + + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + assert.deepEqual(comment.attrs, { commentableId: null }); + }); + + test('the child accepts a parent model and id', function(assert) { + let post = this.helper.savedParent(); + let comment = this.schema.comments.new({ commentable: post, commentableId: { type: 'post', id: post.id } }); + + assert.deepEqual(comment.commentableId, { type: 'post', id: '1' }); + assert.deepEqual(comment.commentable, post); + assert.deepEqual(comment.attrs, { commentableId: { type: 'post', id: post.id } }); + }); + + test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let comment = this.schema.comments.new({}); + + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + assert.deepEqual(comment.attrs, { commentableId: null }); + }); + + test('the child accepts no reference to a parent id or model', function(assert) { + let comment = this.schema.comments.new(); + + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + assert.deepEqual(comment.attrs, { commentableId: null }); + }); } -}); - -test('the child accepts a saved parent id', function(assert) { - let post = this.helper.savedParent(); - let comment = this.schema.comments.new({ - commentableId: { id: post.id, type: 'post' } - }); - - assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }); - assert.deepEqual(comment.commentable, post); - assert.deepEqual(comment.attrs, { commentableId: { id: post.id, type: 'post' } }); -}); - -test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.comments.new({ commentableId: { type: 'post', id: 2 } }); - }, /You're instantiating a comment that has a commentableId of post:2, but that record doesn't exist in the database/); -}); - -test('the child accepts a null parent id', function(assert) { - let comment = this.schema.comments.new({ commentableId: null }); - - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - assert.deepEqual(comment.attrs, { commentableId: null }); -}); - -test('the child accepts a saved parent model', function(assert) { - let post = this.helper.savedParent(); - let comment = this.schema.comments.new({ commentable: post }); - - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); - assert.deepEqual(comment.commentable, post); -}); - -test('the child accepts a new parent model', function(assert) { - let post = this.schema.posts.new({ text: 'foo' }); - let comment = this.schema.comments.new({ commentable: post }); - - assert.deepEqual(comment.commentableId, { type: 'post', id: undefined }); - assert.deepEqual(comment.commentable, post); - assert.deepEqual(comment.attrs, { commentableId: null }); -}); - -test('the child accepts a null parent model', function(assert) { - let comment = this.schema.comments.new({ commentable: null }); - - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - assert.deepEqual(comment.attrs, { commentableId: null }); -}); - -test('the child accepts a parent model and id', function(assert) { - let post = this.helper.savedParent(); - let comment = this.schema.comments.new({ commentable: post, commentableId: { type: 'post', id: post.id } }); - - assert.deepEqual(comment.commentableId, { type: 'post', id: '1' }); - assert.deepEqual(comment.commentable, post); - assert.deepEqual(comment.attrs, { commentableId: { type: 'post', id: post.id } }); -}); - -test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let comment = this.schema.comments.new({}); - - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - assert.deepEqual(comment.attrs, { commentableId: null }); -}); - -test('the child accepts no reference to a parent id or model', function(assert) { - let comment = this.schema.comments.new(); - - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - assert.deepEqual(comment.attrs, { commentableId: null }); -}); +); diff --git a/tests/integration/orm/belongs-to/misc-test.js b/tests/integration/orm/belongs-to/misc-test.js index 3e0f370d3..481099bdb 100644 --- a/tests/integration/orm/belongs-to/misc-test.js +++ b/tests/integration/orm/belongs-to/misc-test.js @@ -3,16 +3,16 @@ // import Db from 'ember-cli-mirage/db'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Misc'); - -test('an ambiguous schema throws an error', function(assert) { - assert.ok(true); - // assert.throws(function() { - // new Schema(new Db(), { - // user: Model.extend({ - // foo: belongsTo('user'), - // bar: belongsTo('user') - // }) - // }); - // }, /You defined the 'foo' relationship on user, but multiple possible inverse relationships of type user exist. Please refer to the models documentation to learn how to explicitly specify inverses./); +module('Integration | ORM | Belongs To | Misc', function() { + test('an ambiguous schema throws an error', function(assert) { + assert.ok(true); + // assert.throws(function() { + // new Schema(new Db(), { + // user: Model.extend({ + // foo: belongsTo('user'), + // bar: belongsTo('user') + // }) + // }); + // }, /You defined the 'foo' relationship on user, but multiple possible inverse relationships of type user exist. Please refer to the models documentation to learn how to explicitly specify inverses./); + }); }); diff --git a/tests/integration/orm/belongs-to/regressions/issue-1112-test.js b/tests/integration/orm/belongs-to/regressions/issue-1112-test.js index 62dd0f35b..22bcc115b 100644 --- a/tests/integration/orm/belongs-to/regressions/issue-1112-test.js +++ b/tests/integration/orm/belongs-to/regressions/issue-1112-test.js @@ -3,27 +3,27 @@ import Schema from 'ember-cli-mirage/orm/schema'; import Db from 'ember-cli-mirage/db'; import { module, test } from 'qunit'; -module('Integration | ORM | Belongs To | Regressions | Issue 1112'); +module('Integration | ORM | Belongs To | Regressions | Issue 1112', function() { + test(`deleting a record with a polymorphic belongsTo doesn't interfere with other dependents`, function(assert) { + let schema = new Schema(new Db(), { + comment: Model.extend({ + commentable: belongsTo({ polymorphic: true }), + user: belongsTo('user') + }), -test(`deleting a record with a polymorphic belongsTo doesn't interfere with other dependents`, function(assert) { - let schema = new Schema(new Db(), { - comment: Model.extend({ - commentable: belongsTo({ polymorphic: true }), - user: belongsTo('user') - }), + post: Model, - post: Model, + user: Model.extend({ + comments: hasMany('comment') + }) + }); - user: Model.extend({ - comments: hasMany('comment') - }) - }); - - let user = schema.users.create(); - let post = schema.posts.create(); - let comment = schema.comments.create({ commentable: post, user }); + let user = schema.users.create(); + let post = schema.posts.create(); + let comment = schema.comments.create({ commentable: post, user }); - comment.destroy(); + comment.destroy(); - assert.deepEqual(user.reload().commentIds, []); + assert.deepEqual(user.reload().commentIds, []); + }); }); diff --git a/tests/integration/orm/collection-inflector-test.js b/tests/integration/orm/collection-inflector-test.js index 4d1a521c8..245a6e8f9 100644 --- a/tests/integration/orm/collection-inflector-test.js +++ b/tests/integration/orm/collection-inflector-test.js @@ -5,18 +5,22 @@ import Inflector from 'ember-inflector'; import {module, test} from 'qunit'; var db, schema, HeadOfState; -module('Integration | ORM | inflector-collectionName integration', { - beforeEach() { - Inflector.inflector.irregular('head-of-state', 'heads-of-state'); - HeadOfState = Model.extend(); - db = new Db({}); - schema = new Schema(db); - schema.registerModel('headOfState', HeadOfState); - } -}); +module( + 'Integration | ORM | inflector-collectionName integration', + function(hooks) { + hooks.beforeEach(function() { + Inflector.inflector.irregular('head-of-state', 'heads-of-state'); + + HeadOfState = Model.extend(); + db = new Db({}); + schema = new Schema(db); + schema.registerModel('headOfState', HeadOfState); + }); -test(' [regression] collection creation respects irregular plural rules', function(assert) { - assert.equal(schema.db._collections.length, 1); - assert.equal(schema.db._collections[0].name, 'headsOfState'); -}); + test(' [regression] collection creation respects irregular plural rules', function(assert) { + assert.equal(schema.db._collections.length, 1); + assert.equal(schema.db._collections[0].name, 'headsOfState'); + }); + } +); diff --git a/tests/integration/orm/collection-test.js b/tests/integration/orm/collection-test.js index 59751f77e..57603880c 100644 --- a/tests/integration/orm/collection-test.js +++ b/tests/integration/orm/collection-test.js @@ -4,8 +4,8 @@ import Db from 'ember-cli-mirage/db'; import Collection from 'ember-cli-mirage/orm/collection'; import {module, test} from 'qunit'; -module('Integration | ORM | collection', { - beforeEach() { +module('Integration | ORM | collection', function(hooks) { + hooks.beforeEach(function() { this.User = Model.extend(); this.db = new Db({ users: [ { id: 1, name: 'Link', good: true }, @@ -16,71 +16,71 @@ module('Integration | ORM | collection', { this.schema = new Schema(this.db, { user: this.User }); - } -}); + }); -test('a collection can save its models', function(assert) { - let collection = this.schema.users.all(); - collection.models[0].name = 'Sam'; - collection.save(); + test('a collection can save its models', function(assert) { + let collection = this.schema.users.all(); + collection.models[0].name = 'Sam'; + collection.save(); - assert.deepEqual(this.db.users[0], { id: '1', name: 'Sam', good: true }); -}); + assert.deepEqual(this.db.users[0], { id: '1', name: 'Sam', good: true }); + }); -test('a collection can reload its models', function(assert) { - let collection = this.schema.users.all(); - assert.equal(collection.models[0].name, 'Link'); + test('a collection can reload its models', function(assert) { + let collection = this.schema.users.all(); + assert.equal(collection.models[0].name, 'Link'); - collection.models[0].name = 'Sam'; - assert.equal(collection.models[0].name, 'Sam'); + collection.models[0].name = 'Sam'; + assert.equal(collection.models[0].name, 'Sam'); - collection.reload(); - assert.equal(collection.models[0].name, 'Link'); -}); + collection.reload(); + assert.equal(collection.models[0].name, 'Link'); + }); -test('a collection can filter its models', function(assert) { - let collection = this.schema.users.all(); - assert.equal(collection.models.length, 3); + test('a collection can filter its models', function(assert) { + let collection = this.schema.users.all(); + assert.equal(collection.models.length, 3); - let newCollection = collection.filter((author) => author.good); + let newCollection = collection.filter((author) => author.good); - assert.ok(newCollection instanceof Collection); - assert.equal(newCollection.modelName, 'user', 'the filtered collection has the right type'); - assert.equal(newCollection.models.length, 2); -}); + assert.ok(newCollection instanceof Collection); + assert.equal(newCollection.modelName, 'user', 'the filtered collection has the right type'); + assert.equal(newCollection.models.length, 2); + }); -test('a collection can sort its models', function(assert) { - let collection = this.schema.users.all(); - assert.deepEqual(collection.models.map((m) => m.name), ['Link', 'Zelda', 'Ganon']); + test('a collection can sort its models', function(assert) { + let collection = this.schema.users.all(); + assert.deepEqual(collection.models.map((m) => m.name), ['Link', 'Zelda', 'Ganon']); - let newCollection = collection.sort((a, b) => { - return a.name.localeCompare(b.name); - }); + let newCollection = collection.sort((a, b) => { + return a.name.localeCompare(b.name); + }); - assert.ok(newCollection instanceof Collection); - assert.equal(newCollection.modelName, 'user', 'the sorted collection has the right type'); - assert.deepEqual(newCollection.models.map((m) => m.name), ['Ganon', 'Link', 'Zelda']); -}); + assert.ok(newCollection instanceof Collection); + assert.equal(newCollection.modelName, 'user', 'the sorted collection has the right type'); + assert.deepEqual(newCollection.models.map((m) => m.name), ['Ganon', 'Link', 'Zelda']); + }); -test('a collection can slice its models', function(assert) { - let collection = this.schema.users.all(); - assert.deepEqual(collection.models.map(m => m.name), ['Link', 'Zelda', 'Ganon'], 'Starts with 3'); + test('a collection can slice its models', function(assert) { + let collection = this.schema.users.all(); + assert.deepEqual(collection.models.map(m => m.name), ['Link', 'Zelda', 'Ganon'], 'Starts with 3'); - let newCollection = collection.slice(-2); + let newCollection = collection.slice(-2); - assert.ok(newCollection instanceof Collection); - assert.equal(newCollection.modelName, 'user', 'the sliced collection has the right type'); - assert.deepEqual(newCollection.models.map(m => m.name), ['Zelda', 'Ganon']); -}); + assert.ok(newCollection instanceof Collection); + assert.equal(newCollection.modelName, 'user', 'the sliced collection has the right type'); + assert.deepEqual(newCollection.models.map(m => m.name), ['Zelda', 'Ganon']); + }); -test('a collection can merge with another collection', function(assert) { - let goodGuys = this.schema.users.where((user) => user.good); - let badGuys = this.schema.users.where((user) => !user.good); + test('a collection can merge with another collection', function(assert) { + let goodGuys = this.schema.users.where((user) => user.good); + let badGuys = this.schema.users.where((user) => !user.good); - assert.equal(goodGuys.models.length, 2); - assert.equal(badGuys.models.length, 1); + assert.equal(goodGuys.models.length, 2); + assert.equal(badGuys.models.length, 1); - goodGuys.mergeCollection(badGuys); + goodGuys.mergeCollection(badGuys); - assert.equal(goodGuys.models.length, 3); + assert.equal(goodGuys.models.length, 3); + }); }); diff --git a/tests/integration/orm/create-test.js b/tests/integration/orm/create-test.js index 08d7f2ed9..70f5b7498 100644 --- a/tests/integration/orm/create-test.js +++ b/tests/integration/orm/create-test.js @@ -4,47 +4,48 @@ import Db from 'ember-cli-mirage/db'; import {module, test} from 'qunit'; var db, schema, User; -module('Integration | ORM | create', { - beforeEach() { + +module('Integration | ORM | create', function(hooks) { + hooks.beforeEach(function() { User = Model.extend(); db = new Db(); schema = new Schema(db, { user: User }); - } -}); + }); -test('it cannot make new models that havent been registered', function(assert) { - assert.throws(function() { - schema.authors.new({ name: 'Link' }); + test('it cannot make new models that havent been registered', function(assert) { + assert.throws(function() { + schema.authors.new({ name: 'Link' }); + }); }); -}); -test('it cannot create models that havent been registered', function(assert) { - assert.throws(function() { - schema.authors.create({ name: 'Link' }); + test('it cannot create models that havent been registered', function(assert) { + assert.throws(function() { + schema.authors.create({ name: 'Link' }); + }); }); -}); -test('it can make new models and then save them', function(assert) { - let user = schema.users.new({ name: 'Link' }); + test('it can make new models and then save them', function(assert) { + let user = schema.users.new({ name: 'Link' }); - assert.ok(user instanceof User); - assert.deepEqual(user.attrs, { name: 'Link' }); - assert.deepEqual(db.users, []); + assert.ok(user instanceof User); + assert.deepEqual(user.attrs, { name: 'Link' }); + assert.deepEqual(db.users, []); - user.save(); + user.save(); - assert.ok(user.id, 'user has an id getter'); - assert.deepEqual(user.attrs, { id: '1', name: 'Link' }); - assert.deepEqual(db.users, [{ id: '1', name: 'Link' }]); -}); + assert.ok(user.id, 'user has an id getter'); + assert.deepEqual(user.attrs, { id: '1', name: 'Link' }); + assert.deepEqual(db.users, [{ id: '1', name: 'Link' }]); + }); -test('it can create new models, saved directly to the db', function(assert) { - let user = schema.users.create({ name: 'Link' }); + test('it can create new models, saved directly to the db', function(assert) { + let user = schema.users.create({ name: 'Link' }); - assert.ok(user instanceof Model); - assert.ok(user instanceof User); - assert.deepEqual(user.attrs, { id: '1', name: 'Link' }); - assert.deepEqual(db.users, [{ id: '1', name: 'Link' }]); + assert.ok(user instanceof Model); + assert.ok(user instanceof User); + assert.deepEqual(user.attrs, { id: '1', name: 'Link' }); + assert.deepEqual(db.users, [{ id: '1', name: 'Link' }]); + }); }); diff --git a/tests/integration/orm/destroy-test.js b/tests/integration/orm/destroy-test.js index bcf6b4388..0970c0299 100644 --- a/tests/integration/orm/destroy-test.js +++ b/tests/integration/orm/destroy-test.js @@ -4,8 +4,9 @@ import Db from 'ember-cli-mirage/db'; import {module, test} from 'qunit'; let db; -module('Integration | ORM | destroy', { - beforeEach() { + +module('Integration | ORM | destroy', function(hooks) { + hooks.beforeEach(function() { db = new Db({ users: [ { id: 1, name: 'Link', evil: false }, @@ -17,24 +18,24 @@ module('Integration | ORM | destroy', { this.schema = new Schema(db, { user: Model }); - } -}); + }); -test('destroying a model removes the associated record from the db', function(assert) { - assert.deepEqual(db.users.length, 3); + test('destroying a model removes the associated record from the db', function(assert) { + assert.deepEqual(db.users.length, 3); - let link = this.schema.users.find(1); - link.destroy(); + let link = this.schema.users.find(1); + link.destroy(); - assert.deepEqual(db.users.find(1), null); - assert.deepEqual(db.users.length, 2); -}); + assert.deepEqual(db.users.find(1), null); + assert.deepEqual(db.users.length, 2); + }); -test('destroying a collection removes the associated records from the db', function(assert) { - assert.deepEqual(db.users.length, 3); + test('destroying a collection removes the associated records from the db', function(assert) { + assert.deepEqual(db.users.length, 3); - let users = this.schema.users.all(); - users.destroy(); + let users = this.schema.users.all(); + users.destroy(); - assert.deepEqual(db.users, []); + assert.deepEqual(db.users, []); + }); }); diff --git a/tests/integration/orm/find-test.js b/tests/integration/orm/find-test.js index db9d775b0..9eb97565c 100644 --- a/tests/integration/orm/find-test.js +++ b/tests/integration/orm/find-test.js @@ -6,8 +6,9 @@ import {module, test} from 'qunit'; var schema; var User = Model.extend(); -module('Integration | ORM | #find', { - beforeEach() { + +module('Integration | ORM | #find', function(hooks) { + hooks.beforeEach(function() { let db = new Db({ users: [ { id: 1, name: 'Link' }, { id: 2, name: 'Zelda' } @@ -16,33 +17,33 @@ module('Integration | ORM | #find', { schema = new Schema(db, { user: User }); - } -}); + }); -test('it can find a model by id', function(assert) { - let zelda = schema.users.find(2); + test('it can find a model by id', function(assert) { + let zelda = schema.users.find(2); - assert.ok(zelda instanceof User); - assert.deepEqual(zelda.attrs, { id: '2', name: 'Zelda' }); -}); + assert.ok(zelda instanceof User); + assert.deepEqual(zelda.attrs, { id: '2', name: 'Zelda' }); + }); -test('it returns null if no model is found for an id', function(assert) { - let user = schema.users.find(4); + test('it returns null if no model is found for an id', function(assert) { + let user = schema.users.find(4); - assert.equal(user, null); -}); + assert.equal(user, null); + }); -test('it can find multiple models by ids', function(assert) { - let users = schema.users.find([1, 2]); + test('it can find multiple models by ids', function(assert) { + let users = schema.users.find([1, 2]); - assert.ok(users instanceof Collection, 'it returns a collection'); - assert.ok(users.models[0] instanceof User); - assert.equal(users.models.length, 2); - assert.deepEqual(users.models[1].attrs, { id: '2', name: 'Zelda' }); -}); + assert.ok(users instanceof Collection, 'it returns a collection'); + assert.ok(users.models[0] instanceof User); + assert.equal(users.models.length, 2); + assert.deepEqual(users.models[1].attrs, { id: '2', name: 'Zelda' }); + }); -test('it errors if incorrect number of models are found for an array of ids', function(assert) { - assert.throws(function() { - schema.users.find([1, 6]); - }, /Couldn't find all users/); + test('it errors if incorrect number of models are found for an array of ids', function(assert) { + assert.throws(function() { + schema.users.find([1, 6]); + }, /Couldn't find all users/); + }); }); diff --git a/tests/integration/orm/first-test.js b/tests/integration/orm/first-test.js index e1367eadc..731c2e6d4 100644 --- a/tests/integration/orm/first-test.js +++ b/tests/integration/orm/first-test.js @@ -5,20 +5,21 @@ import {module, test} from 'qunit'; let schema; let User = Model.extend(); -module('Integration | ORM | #first', { - beforeEach() { + +module('Integration | ORM | #first', function(hooks) { + hooks.beforeEach(function() { let db = new Db(); db.createCollection('users'); db.users.insert([{ id: 1, name: 'Link' }, { id: 2, name: 'Zelda' }]); schema = new Schema(db); schema.registerModel('user', User); - } -}); + }); -test('it can find the first model', function(assert) { - let user = schema.users.first(); + test('it can find the first model', function(assert) { + let user = schema.users.first(); - assert.ok(user instanceof User); - assert.deepEqual(user.attrs, { id: '1', name: 'Link' }); + assert.ok(user instanceof User); + assert.deepEqual(user.attrs, { id: '1', name: 'Link' }); + }); }); diff --git a/tests/integration/orm/has-many/1-basic/accessor-test.js b/tests/integration/orm/has-many/1-basic/accessor-test.js index cb963e3b1..f0eb0c597 100644 --- a/tests/integration/orm/has-many/1-basic/accessor-test.js +++ b/tests/integration/orm/has-many/1-basic/accessor-test.js @@ -1,30 +1,30 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Basic | accessor', { - beforeEach() { +module('Integration | ORM | Has Many | Basic | accessor', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); - } -}); + }); -/* - The reference to a belongs-to association is correct, for all states -*/ -states.forEach((state) => { + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ user, posts ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ user, posts ] = this.helper[state](); - assert.equal(user.posts.models.length, posts.length, 'the parent has the correct number of children'); - assert.equal(user.postIds.length, posts.length, 'the parent has the correct number of children ids'); + assert.equal(user.posts.models.length, posts.length, 'the parent has the correct number of children'); + assert.equal(user.postIds.length, posts.length, 'the parent has the correct number of children ids'); - posts.forEach((post, i) => { - assert.deepEqual(user.posts.models[i], posts[i], 'each child is in parent.children array'); + posts.forEach((post, i) => { + assert.deepEqual(user.posts.models[i], posts[i], 'each child is in parent.children array'); - if (post.isSaved()) { - assert.ok(user.postIds.indexOf(post.id) > -1, 'each saved child id is in parent.childrenIds array'); - } + if (post.isSaved()) { + assert.ok(user.postIds.indexOf(post.id) > -1, 'each saved child id is in parent.childrenIds array'); + } + }); }); - }); + }); }); diff --git a/tests/integration/orm/has-many/1-basic/association-create-test.js b/tests/integration/orm/has-many/1-basic/association-create-test.js index a90641f16..5d234aa0e 100644 --- a/tests/integration/orm/has-many/1-basic/association-create-test.js +++ b/tests/integration/orm/has-many/1-basic/association-create-test.js @@ -1,28 +1,31 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Basic | association #create', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Basic | association #create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can create a has-many association, for all states -*/ -states.forEach((state) => { + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.posts.models.length; + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.posts.models.length; - let post = user.createPost({ title: 'Lorem ipsum' }); + let post = user.createPost({ title: 'Lorem ipsum' }); - assert.ok(post.id, 'the child was persisted'); - assert.equal(user.posts.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.posts.includes(post), 'the model was added to user.posts'); - assert.ok(user.postIds.indexOf(post.id) > -1, 'the id was added to the fks array'); - assert.ok(user.attrs.postIds.indexOf(post.id) > -1, 'fks were persisted'); - }); + assert.ok(post.id, 'the child was persisted'); + assert.equal(user.posts.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.posts.includes(post), 'the model was added to user.posts'); + assert.ok(user.postIds.indexOf(post.id) > -1, 'the id was added to the fks array'); + assert.ok(user.attrs.postIds.indexOf(post.id) > -1, 'fks were persisted'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/1-basic/association-new-test.js b/tests/integration/orm/has-many/1-basic/association-new-test.js index d2d48617b..abbffa56e 100644 --- a/tests/integration/orm/has-many/1-basic/association-new-test.js +++ b/tests/integration/orm/has-many/1-basic/association-new-test.js @@ -1,33 +1,36 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Basic | association #new', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Basic | association #new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can make a new unsaved belongs-to association, for all states -*/ + /* + The model can make a new unsaved belongs-to association, for all states + */ -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.posts.models.length; + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.posts.models.length; - let post = user.newPost({ title: 'Lorem ipsum' }); + let post = user.newPost({ title: 'Lorem ipsum' }); - assert.ok(!post.id, 'the child was not persisted'); - assert.equal(user.posts.models.length, initialCount + 1); + assert.ok(!post.id, 'the child was not persisted'); + assert.equal(user.posts.models.length, initialCount + 1); - post.save(); + post.save(); - assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum' }, 'the child was persisted'); - assert.equal(user.posts.models.length, initialCount + 1, 'the collection size was increased'); - assert.deepEqual(user.posts.models.filter((a) => a.id === post.id)[0], post, 'the model was added to user.posts'); - assert.ok(user.postIds.indexOf(post.id) > -1, 'the id was added to the fks array'); - }); + assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum' }, 'the child was persisted'); + assert.equal(user.posts.models.length, initialCount + 1, 'the collection size was increased'); + assert.deepEqual(user.posts.models.filter((a) => a.id === post.id)[0], post, 'the model was added to user.posts'); + assert.ok(user.postIds.indexOf(post.id) > -1, 'the id was added to the fks array'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/1-basic/association-set-ids-test.js b/tests/integration/orm/has-many/1-basic/association-set-ids-test.js index 0d6526ba6..24b323e09 100644 --- a/tests/integration/orm/has-many/1-basic/association-set-ids-test.js +++ b/tests/integration/orm/has-many/1-basic/association-set-ids-test.js @@ -1,34 +1,37 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Basic | association #setIds', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Basic | association #setIds', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parentId, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user ] = this.helper[state](); - let savedPost = this.helper.savedChild(); + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user ] = this.helper[state](); + let savedPost = this.helper.savedChild(); - user.postIds = [ savedPost.id ]; + user.postIds = [ savedPost.id ]; - assert.deepEqual(user.posts.models[0].attrs, savedPost.attrs); - assert.deepEqual(user.postIds, [ savedPost.id ]); - }); + assert.deepEqual(user.posts.models[0].attrs, savedPost.attrs); + assert.deepEqual(user.postIds, [ savedPost.id ]); + }); - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ user ] = this.helper[state](); + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ user ] = this.helper[state](); - user.postIds = null; + user.postIds = null; - assert.deepEqual(user.posts.models, []); - assert.deepEqual(user.postIds, []); - }); + assert.deepEqual(user.posts.models, []); + assert.deepEqual(user.postIds, []); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/1-basic/association-set-test.js b/tests/integration/orm/has-many/1-basic/association-set-test.js index 94966d6c3..b546c2b70 100644 --- a/tests/integration/orm/has-many/1-basic/association-set-test.js +++ b/tests/integration/orm/has-many/1-basic/association-set-test.js @@ -1,53 +1,56 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Basic | association #set', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Basic | association #set', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parent, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ user ] = this.helper[state](); - let savedPost = this.helper.savedChild(); + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ user ] = this.helper[state](); + let savedPost = this.helper.savedChild(); - user.posts = [ savedPost ]; + user.posts = [ savedPost ]; - assert.ok(user.posts.models.indexOf(savedPost) > -1); - assert.ok(user.postIds.indexOf(savedPost.id) > -1); - }); + assert.ok(user.posts.models.indexOf(savedPost) > -1); + assert.ok(user.postIds.indexOf(savedPost.id) > -1); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user ] = this.helper[state](); - let newPost = this.helper.newChild(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user ] = this.helper[state](); + let newPost = this.helper.newChild(); - user.posts = [ newPost ]; + user.posts = [ newPost ]; - assert.deepEqual(user.postIds, [ undefined ]); - assert.deepEqual(user.posts.models[0], newPost); - }); + assert.deepEqual(user.postIds, [ undefined ]); + assert.deepEqual(user.posts.models[0], newPost); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user ] = this.helper[state](); - user.posts = [ ]; + user.posts = [ ]; - assert.deepEqual(user.postIds, [ ]); - assert.equal(user.posts.models.length, 0); - }); + assert.deepEqual(user.postIds, [ ]); + assert.equal(user.posts.models.length, 0); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user ] = this.helper[state](); - user.posts = null; + user.posts = null; - assert.deepEqual(user.postIds, [ ]); - assert.equal(user.posts.models.length, 0); - }); + assert.deepEqual(user.postIds, [ ]); + assert.equal(user.posts.models.length, 0); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/1-basic/create-test.js b/tests/integration/orm/has-many/1-basic/create-test.js index d95cf7fd2..4374c4842 100644 --- a/tests/integration/orm/has-many/1-basic/create-test.js +++ b/tests/integration/orm/has-many/1-basic/create-test.js @@ -2,86 +2,86 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Basic | create', { - beforeEach() { +module('Integration | ORM | Has Many | Basic | create', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); this.helper.schema.registerModel('foo', Model); - } -}); - -test('it sets up associations correctly when passing in the foreign key', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - postIds: [ post.id ] }); - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.attrs.postIds, [ post.id ], 'the ids were persisted'); - assert.deepEqual(user.posts.models[0].attrs, post.attrs); - assert.equal(this.helper.db.posts.length, 1); - assert.deepEqual(this.helper.db.posts[0], { id: '1' }); - assert.equal(this.helper.db.users.length, 1); - assert.deepEqual(this.helper.db.users[0], { id: '1', postIds: [ '1' ] }); -}); + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + postIds: [ post.id ] + }); -test('it sets up associations correctly when passing in an array of models', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - posts: [ post ] + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.attrs.postIds, [ post.id ], 'the ids were persisted'); + assert.deepEqual(user.posts.models[0].attrs, post.attrs); + assert.equal(this.helper.db.posts.length, 1); + assert.deepEqual(this.helper.db.posts[0], { id: '1' }); + assert.equal(this.helper.db.users.length, 1); + assert.deepEqual(this.helper.db.users[0], { id: '1', postIds: [ '1' ] }); }); - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.attrs.postIds, [ post.id ], 'the ids were persisted'); - assert.deepEqual(user.posts.models[0].attrs, post.attrs); - assert.equal(this.helper.db.posts.length, 1); - assert.deepEqual(this.helper.db.posts[0], { id: '1' }); - assert.equal(this.helper.db.users.length, 1); - assert.deepEqual(this.helper.db.users[0], { id: '1', postIds: [ '1' ] }); -}); + test('it sets up associations correctly when passing in an array of models', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + posts: [ post ] + }); -test('it sets up associations correctly when passing in a collection', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - posts: this.helper.schema.posts.all() + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.attrs.postIds, [ post.id ], 'the ids were persisted'); + assert.deepEqual(user.posts.models[0].attrs, post.attrs); + assert.equal(this.helper.db.posts.length, 1); + assert.deepEqual(this.helper.db.posts[0], { id: '1' }); + assert.equal(this.helper.db.users.length, 1); + assert.deepEqual(this.helper.db.users[0], { id: '1', postIds: [ '1' ] }); }); - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.attrs.postIds, [ post.id ], 'the ids were persisted'); - assert.deepEqual(user.posts.models[0].attrs, post.attrs); - assert.equal(this.helper.db.posts.length, 1); - assert.deepEqual(this.helper.db.posts[0], { id: '1' }); - assert.equal(this.helper.db.users.length, 1); - assert.deepEqual(this.helper.db.users[0], { id: '1', postIds: [ '1' ] }); -}); + test('it sets up associations correctly when passing in a collection', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + posts: this.helper.schema.posts.all() + }); + + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.attrs.postIds, [ post.id ], 'the ids were persisted'); + assert.deepEqual(user.posts.models[0].attrs, post.attrs); + assert.equal(this.helper.db.posts.length, 1); + assert.deepEqual(this.helper.db.posts[0], { id: '1' }); + assert.equal(this.helper.db.users.length, 1); + assert.deepEqual(this.helper.db.users[0], { id: '1', postIds: [ '1' ] }); + }); -test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.create('user', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); -}); + assert.throws(function() { + schema.create('user', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); + }); -test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.create('user', { - foos: [ schema.create('foo') ] - }); - }, /you haven't defined that key as an association on your model/); -}); + assert.throws(function() { + schema.create('user', { + foos: [ schema.create('foo') ] + }); + }, /you haven't defined that key as an association on your model/); + }); -test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); - assert.throws(function() { - schema.create('post', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); + assert.throws(function() { + schema.create('post', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); }); diff --git a/tests/integration/orm/has-many/1-basic/delete-test.js b/tests/integration/orm/has-many/1-basic/delete-test.js index 1b75534ee..fce706906 100644 --- a/tests/integration/orm/has-many/1-basic/delete-test.js +++ b/tests/integration/orm/has-many/1-basic/delete-test.js @@ -1,24 +1,24 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Basic | delete', { - beforeEach() { +module('Integration | ORM | Has Many | Basic | delete', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); - } -}); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ user, posts ] = this.helper[state](); + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ user, posts ] = this.helper[state](); - if (posts && posts.length) { - posts.forEach(p => p.destroy()); - user.reload(); - } + if (posts && posts.length) { + posts.forEach(p => p.destroy()); + user.reload(); + } - assert.equal(user.posts.length, 0); - assert.equal(user.postIds.length, 0); - }); + assert.equal(user.posts.length, 0); + assert.equal(user.postIds.length, 0); + }); + }); }); diff --git a/tests/integration/orm/has-many/1-basic/instantiating-test.js b/tests/integration/orm/has-many/1-basic/instantiating-test.js index 8b470b9b4..e0c01ebd4 100644 --- a/tests/integration/orm/has-many/1-basic/instantiating-test.js +++ b/tests/integration/orm/has-many/1-basic/instantiating-test.js @@ -1,81 +1,81 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Basic | instantiating', { - beforeEach() { +module('Integration | ORM | Has Many | Basic | instantiating', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); this.schema = this.helper.schema; - } -}); - -test('the parent accepts a saved child id', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ - postIds: [ post.id ] }); - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.posts.models[0], post); -}); + test('the parent accepts a saved child id', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ + postIds: [ post.id ] + }); -test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ postIds: [ 2 ] }); - }, /You're instantiating a user that has a postIds of 2, but some of those records don't exist in the database/); -}); + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.posts.models[0], post); + }); -test('the parent accepts null children foreign key', function(assert) { - let user = this.schema.users.new({ postIds: null }); + test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ postIds: [ 2 ] }); + }, /You're instantiating a user that has a postIds of 2, but some of those records don't exist in the database/); + }); - assert.equal(user.posts.models.length, 0); - assert.deepEqual(user.postIds, []); - assert.deepEqual(user.attrs, { postIds: null }); -}); + test('the parent accepts null children foreign key', function(assert) { + let user = this.schema.users.new({ postIds: null }); -test('the parent accepts saved children', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ posts: [ post ] }); + assert.equal(user.posts.models.length, 0); + assert.deepEqual(user.postIds, []); + assert.deepEqual(user.attrs, { postIds: null }); + }); - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.posts.models[0], post); -}); + test('the parent accepts saved children', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ posts: [ post ] }); + + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.posts.models[0], post); + }); -test('the parent accepts new children', function(assert) { - let post = this.schema.posts.new({ title: 'Lorem' }); - let user = this.schema.users.new({ posts: [ post ] }); + test('the parent accepts new children', function(assert) { + let post = this.schema.posts.new({ title: 'Lorem' }); + let user = this.schema.users.new({ posts: [ post ] }); - assert.deepEqual(user.postIds, [ undefined ]); - assert.deepEqual(user.posts.models[0], post); -}); + assert.deepEqual(user.postIds, [ undefined ]); + assert.deepEqual(user.posts.models[0], post); + }); -test('the parent accepts null children', function(assert) { - let user = this.schema.users.new({ posts: null }); + test('the parent accepts null children', function(assert) { + let user = this.schema.users.new({ posts: null }); - assert.equal(user.posts.models.length, 0); - assert.deepEqual(user.postIds, []); - assert.deepEqual(user.attrs, { postIds: null }); -}); + assert.equal(user.posts.models.length, 0); + assert.deepEqual(user.postIds, []); + assert.deepEqual(user.attrs, { postIds: null }); + }); -test('the parent accepts children and child ids', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ posts: [ post ], postIds: [ post.id ] }); + test('the parent accepts children and child ids', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ posts: [ post ], postIds: [ post.id ] }); - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.posts.models[0], post); -}); + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.posts.models[0], post); + }); -test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let user = this.schema.users.new({}); + test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let user = this.schema.users.new({}); - assert.deepEqual(user.postIds, []); - assert.deepEqual(user.posts.models, []); - assert.deepEqual(user.attrs, { postIds: null }); -}); + assert.deepEqual(user.postIds, []); + assert.deepEqual(user.posts.models, []); + assert.deepEqual(user.attrs, { postIds: null }); + }); -test('the parent accepts no reference to children or child ids', function(assert) { - let user = this.schema.users.new(); + test('the parent accepts no reference to children or child ids', function(assert) { + let user = this.schema.users.new(); - assert.deepEqual(user.postIds, []); - assert.deepEqual(user.posts.models, []); - assert.deepEqual(user.attrs, { postIds: null }); + assert.deepEqual(user.postIds, []); + assert.deepEqual(user.posts.models, []); + assert.deepEqual(user.attrs, { postIds: null }); + }); }); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/accessor-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/accessor-test.js index 24f5e3f5e..788ebfc58 100644 --- a/tests/integration/orm/has-many/10-many-to-many-polymorphic/accessor-test.js +++ b/tests/integration/orm/has-many/10-many-to-many-polymorphic/accessor-test.js @@ -1,37 +1,40 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Many-to-many Polymorphic | accessor', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Many-to-many Polymorphic | accessor', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The reference to a belongs-to association is correct, for all states -*/ -states.forEach((state) => { + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ user, posts ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ user, posts ] = this.helper[state](); - assert.equal(user.commentables.models.length, posts.length, 'the parent has the correct number of children'); - assert.equal(user.commentableIds.length, posts.length, 'the parent has the correct number of children ids'); + assert.equal(user.commentables.models.length, posts.length, 'the parent has the correct number of children'); + assert.equal(user.commentableIds.length, posts.length, 'the parent has the correct number of children ids'); - posts.forEach((post, i) => { - assert.ok(user.commentables.includes(post), 'each child is in parent.children array'); + posts.forEach((post, i) => { + assert.ok(user.commentables.includes(post), 'each child is in parent.children array'); - if (post.isSaved()) { - assert.deepEqual( - user.commentableIds[i], - { type: 'post', id: post.id }, - 'each saved child id is in parent.childrenIds array' - ); - } + if (post.isSaved()) { + assert.deepEqual( + user.commentableIds[i], + { type: 'post', id: post.id }, + 'each saved child id is in parent.childrenIds array' + ); + } - // Check the inverse - assert.ok(post.users.includes(user)); - }); - }); + // Check the inverse + assert.ok(post.users.includes(user)); + }); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-create-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-create-test.js index 3e29543fb..ea3847fb0 100644 --- a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-create-test.js +++ b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-create-test.js @@ -1,33 +1,36 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Many-to-many Polymorphic | association #create', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Many-to-many Polymorphic | association #create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can create a has-many association, for all states -*/ -states.forEach((state) => { + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.commentables.models.length; + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.commentables.models.length; - let post = user.createCommentable('post', { title: 'Lorem ipsum' }); + let post = user.createCommentable('post', { title: 'Lorem ipsum' }); - assert.ok(post.id, 'the child was persisted'); - assert.equal(user.commentables.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.commentables.includes(post), 'the model was added to the association'); - assert.ok(user.commentableIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'the id was added to the fks array'); - assert.ok(user.attrs.commentableIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'fks were persisted'); - assert.ok(post.users.includes(user), 'the inverse was set'); - }); + assert.ok(post.id, 'the child was persisted'); + assert.equal(user.commentables.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.commentables.includes(post), 'the model was added to the association'); + assert.ok(user.commentableIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'the id was added to the fks array'); + assert.ok(user.attrs.commentableIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'fks were persisted'); + assert.ok(post.users.includes(user), 'the inverse was set'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-new-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-new-test.js index 6a135f770..54396d931 100644 --- a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-new-test.js +++ b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-new-test.js @@ -1,37 +1,40 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Many-to-many Polymorphic | association #new', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Many-to-many Polymorphic | association #new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can make a new unsaved belongs-to association, for all states -*/ + /* + The model can make a new unsaved belongs-to association, for all states + */ -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.commentables.models.length; + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.commentables.models.length; - let post = user.newCommentable('post', { title: 'Lorem ipsum' }); + let post = user.newCommentable('post', { title: 'Lorem ipsum' }); - assert.ok(!post.id, 'the child was not persisted'); - assert.equal(user.commentables.models.length, initialCount + 1); - assert.equal(post.users.models.length, 1, 'the inverse was set'); + assert.ok(!post.id, 'the child was not persisted'); + assert.equal(user.commentables.models.length, initialCount + 1); + assert.equal(post.users.models.length, 1, 'the inverse was set'); - post.save(); + post.save(); - assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum', userIds: [ user.id ] }, 'the child was persisted'); - assert.equal(user.commentables.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.commentables.includes(post), 'the model was added to user.commentables'); - assert.ok(user.commentableIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'the id was added to the fks array'); - assert.ok(post.users.includes(user), 'the inverse was set'); - }); + assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum', userIds: [ user.id ] }, 'the child was persisted'); + assert.equal(user.commentables.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.commentables.includes(post), 'the model was added to user.commentables'); + assert.ok(user.commentableIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'the id was added to the fks array'); + assert.ok(post.users.includes(user), 'the inverse was set'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-ids-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-ids-test.js index 14843718d..b05b10e35 100644 --- a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-ids-test.js +++ b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-ids-test.js @@ -1,52 +1,55 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Many-to-many Polymorphic | association #setIds', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Many-to-many Polymorphic | association #setIds', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parentId, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let savedPost = this.helper.savedChild(); + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let savedPost = this.helper.savedChild(); - user.commentableIds = [ { type: 'post', id: savedPost.id } ]; + user.commentableIds = [ { type: 'post', id: savedPost.id } ]; - assert.ok(user.commentables.includes(savedPost)); - assert.ok(user.commentableIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); + assert.ok(user.commentables.includes(savedPost)); + assert.ok(user.commentableIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); - user.save(); - savedPost.reload(); + user.save(); + savedPost.reload(); - assert.ok(savedPost.users.includes(user), 'the inverse was set'); - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.notOk(post.users.includes(user), 'old inverses were cleared'); - } - }); - }); + assert.ok(savedPost.users.includes(user), 'the inverse was set'); + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.notOk(post.users.includes(user), 'old inverses were cleared'); + } + }); + }); - test(`a ${state} can clear its association via a null ids`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); + test(`a ${state} can clear its association via a null ids`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); - user.commentableIds = null; + user.commentableIds = null; - assert.deepEqual(user.commentables.models, []); - assert.deepEqual(user.commentableIds, []); + assert.deepEqual(user.commentables.models, []); + assert.deepEqual(user.commentableIds, []); - user.save(); + user.save(); - originalPosts.forEach(post => { - post.reload(); - assert.notOk(post.users.includes(user), 'old inverses were cleared'); - }); - }); + originalPosts.forEach(post => { + post.reload(); + assert.notOk(post.users.includes(user), 'old inverses were cleared'); + }); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-test.js index 55fab3651..59bc4bdbe 100644 --- a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-test.js +++ b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-test.js @@ -1,83 +1,86 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Many-to-many Polymorphic | association #set', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Many-to-many Polymorphic | association #set', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parent, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let savedPost = this.helper.savedChild(); + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let savedPost = this.helper.savedChild(); - user.commentables = [ savedPost ]; + user.commentables = [ savedPost ]; - assert.ok(user.commentables.models.includes(savedPost)); - assert.ok(user.commentableIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); - assert.ok(savedPost.users.includes(user), 'the inverse was set'); + assert.ok(user.commentables.models.includes(savedPost)); + assert.ok(user.commentableIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); + assert.ok(savedPost.users.includes(user), 'the inverse was set'); - user.save(); + user.save(); - originalPosts.forEach(post => { - post.reload(); - assert.notOk(post.users.includes(user), 'old inverses were cleared'); - }); - }); + originalPosts.forEach(post => { + post.reload(); + assert.notOk(post.users.includes(user), 'old inverses were cleared'); + }); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let newPost = this.helper.newChild(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let newPost = this.helper.newChild(); - user.commentables = [ newPost ]; + user.commentables = [ newPost ]; - assert.deepEqual(user.commentableIds, [ { type: 'post', id: undefined } ]); - assert.deepEqual(user.commentables.models[0], newPost); - assert.ok(newPost.users.includes(user), 'the inverse was set'); + assert.deepEqual(user.commentableIds, [ { type: 'post', id: undefined } ]); + assert.deepEqual(user.commentables.models[0], newPost); + assert.ok(newPost.users.includes(user), 'the inverse was set'); - user.save(); + user.save(); - originalPosts.forEach(post => { - post.reload(); - assert.notOk(post.users.includes(user), 'old inverses were cleared'); - }); - }); + originalPosts.forEach(post => { + post.reload(); + assert.notOk(post.users.includes(user), 'old inverses were cleared'); + }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); - user.commentables = [ ]; + user.commentables = [ ]; - assert.deepEqual(user.commentableIds, [ ]); - assert.equal(user.commentables.models.length, 0); + assert.deepEqual(user.commentableIds, [ ]); + assert.equal(user.commentables.models.length, 0); - user.save(); + user.save(); - originalPosts.forEach(post => { - post.reload(); - assert.notOk(post.users.includes(user), 'old inverses were cleared'); - }); - }); + originalPosts.forEach(post => { + post.reload(); + assert.notOk(post.users.includes(user), 'old inverses were cleared'); + }); + }); - test(`a ${state} can clear its association via null`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); + test(`a ${state} can clear its association via null`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); - user.commentables = null; + user.commentables = null; - assert.deepEqual(user.commentableIds, [ ]); - assert.equal(user.commentables.models.length, 0); + assert.deepEqual(user.commentableIds, [ ]); + assert.equal(user.commentables.models.length, 0); - user.save(); + user.save(); - originalPosts.forEach(post => { - post.reload(); - assert.notOk(post.users.includes(user), 'old inverses were cleared'); - }); - }); + originalPosts.forEach(post => { + post.reload(); + assert.notOk(post.users.includes(user), 'old inverses were cleared'); + }); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/create-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/create-test.js index 809886525..bdcf0d1b8 100644 --- a/tests/integration/orm/has-many/10-many-to-many-polymorphic/create-test.js +++ b/tests/integration/orm/has-many/10-many-to-many-polymorphic/create-test.js @@ -1,57 +1,60 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Many-to-many Polymorphic | create', { - beforeEach() { - this.helper = new Helper(); +module( + 'Integration | ORM | Has Many | Many-to-many Polymorphic | create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); + + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + commentableIds: [ { type: 'post', id: post.id } ] + }); + + post.reload(); + + assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.attrs.commentableIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); + assert.deepEqual(user.commentables.models[0].attrs, post.attrs); + assert.equal(this.helper.db.posts.length, 1); + assert.equal(this.helper.db.users.length, 1); + assert.deepEqual(this.helper.db.posts[0], { id: '1', userIds: [ '1' ] }); + assert.deepEqual(this.helper.db.users[0], { id: '1', commentableIds: [ { type: 'post', id: '1' } ] }); + }); + + test('it sets up associations correctly when passing in an array of models', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + commentables: [ post ] + }); + + post.reload(); + + assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(post.userIds, [ '1' ], 'the inverse was set'); + assert.deepEqual(user.attrs.commentableIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); + assert.deepEqual(post.attrs.userIds, [ user.id ], 'the inverse was set'); + assert.equal(this.helper.db.users.length, 1); + assert.equal(this.helper.db.posts.length, 1); + }); + + test('it sets up associations correctly when passing in a collection', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + commentables: this.helper.schema.posts.all() + }); + + post.reload(); + + assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(post.userIds, [ user.id ], 'the inverse was set'); + assert.deepEqual(user.attrs.commentableIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(post.attrs.userIds, [ user.id ], 'the inverse was set'); + assert.equal(this.helper.db.users.length, 1); + assert.equal(this.helper.db.posts.length, 1); + }); } -}); - -test('it sets up associations correctly when passing in the foreign key', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - commentableIds: [ { type: 'post', id: post.id } ] - }); - - post.reload(); - - assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.attrs.commentableIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); - assert.deepEqual(user.commentables.models[0].attrs, post.attrs); - assert.equal(this.helper.db.posts.length, 1); - assert.equal(this.helper.db.users.length, 1); - assert.deepEqual(this.helper.db.posts[0], { id: '1', userIds: [ '1' ] }); - assert.deepEqual(this.helper.db.users[0], { id: '1', commentableIds: [ { type: 'post', id: '1' } ] }); -}); - -test('it sets up associations correctly when passing in an array of models', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - commentables: [ post ] - }); - - post.reload(); - - assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(post.userIds, [ '1' ], 'the inverse was set'); - assert.deepEqual(user.attrs.commentableIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); - assert.deepEqual(post.attrs.userIds, [ user.id ], 'the inverse was set'); - assert.equal(this.helper.db.users.length, 1); - assert.equal(this.helper.db.posts.length, 1); -}); - -test('it sets up associations correctly when passing in a collection', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - commentables: this.helper.schema.posts.all() - }); - - post.reload(); - - assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(post.userIds, [ user.id ], 'the inverse was set'); - assert.deepEqual(user.attrs.commentableIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(post.attrs.userIds, [ user.id ], 'the inverse was set'); - assert.equal(this.helper.db.users.length, 1); - assert.equal(this.helper.db.posts.length, 1); -}); +); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/delete-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/delete-test.js index 9d0688807..c25c8cad0 100644 --- a/tests/integration/orm/has-many/10-many-to-many-polymorphic/delete-test.js +++ b/tests/integration/orm/has-many/10-many-to-many-polymorphic/delete-test.js @@ -1,24 +1,27 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Many-to-many Polymorphic | delete', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Many-to-many Polymorphic | delete', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ user, posts ] = this.helper[state](); + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ user, posts ] = this.helper[state](); - if (posts && posts.length) { - posts.forEach(p => p.destroy()); - user.reload(); - } + if (posts && posts.length) { + posts.forEach(p => p.destroy()); + user.reload(); + } - assert.equal(user.commentables.length, 0); - assert.equal(user.commentableIds.length, 0); - }); + assert.equal(user.commentables.length, 0); + assert.equal(user.commentableIds.length, 0); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/instantiating-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/instantiating-test.js index 28c3695c0..09baac8fd 100644 --- a/tests/integration/orm/has-many/10-many-to-many-polymorphic/instantiating-test.js +++ b/tests/integration/orm/has-many/10-many-to-many-polymorphic/instantiating-test.js @@ -1,81 +1,84 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Many-to-many Polymorphic | instantiating', { - beforeEach() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module( + 'Integration | ORM | Has Many | Many-to-many Polymorphic | instantiating', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the parent accepts a saved child id', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ + commentableIds: [ { type: 'post', id: post.id } ] + }); + + assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); + assert.ok(user.commentables.includes(post)); + }); + + test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ commentableIds: [ { type: 'post', id: 2 } ] }); + }, /You're instantiating a user that has a commentableIds of post:2, but some of those records don't exist in the database/); + }); + + test('the parent accepts null children foreign key', function(assert) { + let user = this.schema.users.new({ commentableIds: null }); + + assert.equal(user.commentables.models.length, 0); + assert.deepEqual(user.commentableIds, []); + assert.deepEqual(user.attrs, { commentableIds: null }); + }); + + test('the parent accepts saved children', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ commentables: [ post ] }); + + assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); + assert.ok(user.commentables.includes(post)); + }); + + test('the parent accepts new children', function(assert) { + let post = this.schema.posts.new({ title: 'Lorem' }); + let user = this.schema.users.new({ commentables: [ post ] }); + + assert.deepEqual(user.commentableIds, [ { type: 'post', id: undefined } ]); + assert.ok(user.commentables.includes(post)); + }); + + test('the parent accepts null children', function(assert) { + let user = this.schema.users.new({ commentables: null }); + + assert.equal(user.commentables.models.length, 0); + assert.deepEqual(user.commentableIds, []); + assert.deepEqual(user.attrs, { commentableIds: null }); + }); + + test('the parent accepts children and child ids', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ commentables: [ post ], commentableIds: [ { type: 'post', id: post.id } ] }); + + assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); + assert.ok(user.commentables.includes(post)); + }); + + test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let user = this.schema.users.new({}); + + assert.deepEqual(user.commentableIds, []); + assert.deepEqual(user.commentables.models, []); + assert.deepEqual(user.attrs, { commentableIds: null }); + }); + + test('the parent accepts no reference to children or child ids', function(assert) { + let user = this.schema.users.new(); + + assert.deepEqual(user.commentableIds, []); + assert.deepEqual(user.commentables.models, []); + assert.deepEqual(user.attrs, { commentableIds: null }); + }); } -}); - -test('the parent accepts a saved child id', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ - commentableIds: [ { type: 'post', id: post.id } ] - }); - - assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); - assert.ok(user.commentables.includes(post)); -}); - -test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ commentableIds: [ { type: 'post', id: 2 } ] }); - }, /You're instantiating a user that has a commentableIds of post:2, but some of those records don't exist in the database/); -}); - -test('the parent accepts null children foreign key', function(assert) { - let user = this.schema.users.new({ commentableIds: null }); - - assert.equal(user.commentables.models.length, 0); - assert.deepEqual(user.commentableIds, []); - assert.deepEqual(user.attrs, { commentableIds: null }); -}); - -test('the parent accepts saved children', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ commentables: [ post ] }); - - assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); - assert.ok(user.commentables.includes(post)); -}); - -test('the parent accepts new children', function(assert) { - let post = this.schema.posts.new({ title: 'Lorem' }); - let user = this.schema.users.new({ commentables: [ post ] }); - - assert.deepEqual(user.commentableIds, [ { type: 'post', id: undefined } ]); - assert.ok(user.commentables.includes(post)); -}); - -test('the parent accepts null children', function(assert) { - let user = this.schema.users.new({ commentables: null }); - - assert.equal(user.commentables.models.length, 0); - assert.deepEqual(user.commentableIds, []); - assert.deepEqual(user.attrs, { commentableIds: null }); -}); - -test('the parent accepts children and child ids', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ commentables: [ post ], commentableIds: [ { type: 'post', id: post.id } ] }); - - assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); - assert.ok(user.commentables.includes(post)); -}); - -test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let user = this.schema.users.new({}); - - assert.deepEqual(user.commentableIds, []); - assert.deepEqual(user.commentables.models, []); - assert.deepEqual(user.attrs, { commentableIds: null }); -}); - -test('the parent accepts no reference to children or child ids', function(assert) { - let user = this.schema.users.new(); - - assert.deepEqual(user.commentableIds, []); - assert.deepEqual(user.commentables.models, []); - assert.deepEqual(user.attrs, { commentableIds: null }); -}); +); diff --git a/tests/integration/orm/has-many/2-named/accessor-test.js b/tests/integration/orm/has-many/2-named/accessor-test.js index c98eb085c..acc99d4ec 100644 --- a/tests/integration/orm/has-many/2-named/accessor-test.js +++ b/tests/integration/orm/has-many/2-named/accessor-test.js @@ -1,30 +1,30 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named | accessor', { - beforeEach() { +module('Integration | ORM | Has Many | Named | accessor', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); - } -}); + }); -/* - The reference to a belongs-to association is correct, for all states -*/ -states.forEach((state) => { + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ user, posts ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ user, posts ] = this.helper[state](); - assert.equal(user.blogPosts.models.length, posts.length, 'the parent has the correct number of children'); - assert.equal(user.blogPostIds.length, posts.length, 'the parent has the correct number of children ids'); + assert.equal(user.blogPosts.models.length, posts.length, 'the parent has the correct number of children'); + assert.equal(user.blogPostIds.length, posts.length, 'the parent has the correct number of children ids'); - posts.forEach((post, i) => { - assert.deepEqual(user.blogPosts.models[i], posts[i], 'each child is in parent.children array'); + posts.forEach((post, i) => { + assert.deepEqual(user.blogPosts.models[i], posts[i], 'each child is in parent.children array'); - if (post.isSaved()) { - assert.ok(user.blogPostIds.indexOf(post.id) > -1, 'each saved child id is in parent.childrenIds array'); - } + if (post.isSaved()) { + assert.ok(user.blogPostIds.indexOf(post.id) > -1, 'each saved child id is in parent.childrenIds array'); + } + }); }); - }); + }); }); diff --git a/tests/integration/orm/has-many/2-named/association-create-test.js b/tests/integration/orm/has-many/2-named/association-create-test.js index 24244d7c4..872ca93f6 100644 --- a/tests/integration/orm/has-many/2-named/association-create-test.js +++ b/tests/integration/orm/has-many/2-named/association-create-test.js @@ -1,28 +1,31 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named | association #create', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Named | association #create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can create a has-many association, for all states -*/ -states.forEach((state) => { + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.blogPosts.models.length; + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.blogPosts.models.length; - let post = user.createBlogPost({ title: 'Lorem ipsum' }); + let post = user.createBlogPost({ title: 'Lorem ipsum' }); - assert.ok(post.id, 'the child was persisted'); - assert.equal(user.blogPosts.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.blogPosts.includes(post), 'the model was added to user.blogPosts'); - assert.ok(user.blogPostIds.indexOf(post.id) > -1, 'the id was added to the fks array'); - assert.ok(user.attrs.blogPostIds.indexOf(post.id) > -1, 'fks were persisted'); - }); + assert.ok(post.id, 'the child was persisted'); + assert.equal(user.blogPosts.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.blogPosts.includes(post), 'the model was added to user.blogPosts'); + assert.ok(user.blogPostIds.indexOf(post.id) > -1, 'the id was added to the fks array'); + assert.ok(user.attrs.blogPostIds.indexOf(post.id) > -1, 'fks were persisted'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/2-named/association-new-test.js b/tests/integration/orm/has-many/2-named/association-new-test.js index 19022bf45..c6bfc6060 100644 --- a/tests/integration/orm/has-many/2-named/association-new-test.js +++ b/tests/integration/orm/has-many/2-named/association-new-test.js @@ -1,33 +1,36 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named | association #new', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Named | association #new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can make a new unsaved belongs-to association, for all states -*/ + /* + The model can make a new unsaved belongs-to association, for all states + */ -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.blogPosts.models.length; + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.blogPosts.models.length; - let post = user.newBlogPost({ title: 'Lorem ipsum' }); + let post = user.newBlogPost({ title: 'Lorem ipsum' }); - assert.ok(!post.id, 'the child was not persisted'); - assert.equal(user.blogPosts.models.length, initialCount + 1); + assert.ok(!post.id, 'the child was not persisted'); + assert.equal(user.blogPosts.models.length, initialCount + 1); - post.save(); + post.save(); - assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum' }, 'the child was persisted'); - assert.equal(user.blogPosts.models.length, initialCount + 1, 'the collection size was increased'); - assert.deepEqual(user.blogPosts.models.filter((a) => a.id === post.id)[0], post, 'the model was added to user.blogPosts'); - assert.ok(user.blogPostIds.indexOf(post.id) > -1, 'the id was added to the fks array'); - }); + assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum' }, 'the child was persisted'); + assert.equal(user.blogPosts.models.length, initialCount + 1, 'the collection size was increased'); + assert.deepEqual(user.blogPosts.models.filter((a) => a.id === post.id)[0], post, 'the model was added to user.blogPosts'); + assert.ok(user.blogPostIds.indexOf(post.id) > -1, 'the id was added to the fks array'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/2-named/association-set-ids-test.js b/tests/integration/orm/has-many/2-named/association-set-ids-test.js index 7ef39eb44..02b726a7f 100644 --- a/tests/integration/orm/has-many/2-named/association-set-ids-test.js +++ b/tests/integration/orm/has-many/2-named/association-set-ids-test.js @@ -1,34 +1,37 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named | association #setIds', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Named | association #setIds', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parentId, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user ] = this.helper[state](); - let savedPost = this.helper.savedChild(); + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user ] = this.helper[state](); + let savedPost = this.helper.savedChild(); - user.blogPostIds = [ savedPost.id ]; + user.blogPostIds = [ savedPost.id ]; - assert.deepEqual(user.blogPosts.models[0].attrs, savedPost.attrs); - assert.deepEqual(user.blogPostIds, [ savedPost.id ]); - }); + assert.deepEqual(user.blogPosts.models[0].attrs, savedPost.attrs); + assert.deepEqual(user.blogPostIds, [ savedPost.id ]); + }); - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ user ] = this.helper[state](); + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ user ] = this.helper[state](); - user.blogPostIds = null; + user.blogPostIds = null; - assert.deepEqual(user.blogPosts.models, []); - assert.deepEqual(user.blogPostIds, []); - }); + assert.deepEqual(user.blogPosts.models, []); + assert.deepEqual(user.blogPostIds, []); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/2-named/association-set-test.js b/tests/integration/orm/has-many/2-named/association-set-test.js index 0df02e76b..0e9c94142 100644 --- a/tests/integration/orm/has-many/2-named/association-set-test.js +++ b/tests/integration/orm/has-many/2-named/association-set-test.js @@ -1,53 +1,56 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named | association #set', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Named | association #set', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parent, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ user ] = this.helper[state](); - let savedPost = this.helper.savedChild(); + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ user ] = this.helper[state](); + let savedPost = this.helper.savedChild(); - user.blogPosts = [ savedPost ]; + user.blogPosts = [ savedPost ]; - assert.ok(user.blogPosts.models.indexOf(savedPost) > -1); - assert.ok(user.blogPostIds.indexOf(savedPost.id) > -1); - }); + assert.ok(user.blogPosts.models.indexOf(savedPost) > -1); + assert.ok(user.blogPostIds.indexOf(savedPost.id) > -1); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user ] = this.helper[state](); - let newPost = this.helper.newChild(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user ] = this.helper[state](); + let newPost = this.helper.newChild(); - user.blogPosts = [ newPost ]; + user.blogPosts = [ newPost ]; - assert.deepEqual(user.blogPostIds, [ undefined ]); - assert.deepEqual(user.blogPosts.models[0], newPost); - }); + assert.deepEqual(user.blogPostIds, [ undefined ]); + assert.deepEqual(user.blogPosts.models[0], newPost); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user ] = this.helper[state](); - user.blogPosts = [ ]; + user.blogPosts = [ ]; - assert.deepEqual(user.blogPostIds, [ ]); - assert.equal(user.blogPosts.models.length, 0); - }); + assert.deepEqual(user.blogPostIds, [ ]); + assert.equal(user.blogPosts.models.length, 0); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user ] = this.helper[state](); - user.blogPosts = null; + user.blogPosts = null; - assert.deepEqual(user.blogPostIds, [ ]); - assert.equal(user.blogPosts.models.length, 0); - }); + assert.deepEqual(user.blogPostIds, [ ]); + assert.equal(user.blogPosts.models.length, 0); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/2-named/create-test.js b/tests/integration/orm/has-many/2-named/create-test.js index 782e25a25..7a18a1030 100644 --- a/tests/integration/orm/has-many/2-named/create-test.js +++ b/tests/integration/orm/has-many/2-named/create-test.js @@ -2,86 +2,86 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named | create', { - beforeEach() { +module('Integration | ORM | Has Many | Named | create', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); this.helper.schema.registerModel('foo', Model); - } -}); - -test('it sets up associations correctly when passing in the foreign key', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - blogPostIds: [ post.id ] }); - assert.deepEqual(user.blogPostIds, [ post.id ]); - assert.deepEqual(user.attrs.blogPostIds, [ post.id ], 'the ids were persisted'); - assert.deepEqual(user.blogPosts.models[0].attrs, post.attrs); - assert.equal(this.helper.db.posts.length, 1); - assert.deepEqual(this.helper.db.posts[0], { id: '1' }); - assert.equal(this.helper.db.users.length, 1); - assert.deepEqual(this.helper.db.users[0], { id: '1', blogPostIds: [ '1' ] }); -}); + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + blogPostIds: [ post.id ] + }); -test('it sets up associations correctly when passing in an array of models', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - blogPosts: [ post ] + assert.deepEqual(user.blogPostIds, [ post.id ]); + assert.deepEqual(user.attrs.blogPostIds, [ post.id ], 'the ids were persisted'); + assert.deepEqual(user.blogPosts.models[0].attrs, post.attrs); + assert.equal(this.helper.db.posts.length, 1); + assert.deepEqual(this.helper.db.posts[0], { id: '1' }); + assert.equal(this.helper.db.users.length, 1); + assert.deepEqual(this.helper.db.users[0], { id: '1', blogPostIds: [ '1' ] }); }); - assert.deepEqual(user.blogPostIds, [ post.id ]); - assert.deepEqual(user.attrs.blogPostIds, [ post.id ], 'the ids were persisted'); - assert.deepEqual(user.blogPosts.models[0].attrs, post.attrs); - assert.equal(this.helper.db.posts.length, 1); - assert.deepEqual(this.helper.db.posts[0], { id: '1' }); - assert.equal(this.helper.db.users.length, 1); - assert.deepEqual(this.helper.db.users[0], { id: '1', blogPostIds: [ '1' ] }); -}); + test('it sets up associations correctly when passing in an array of models', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + blogPosts: [ post ] + }); -test('it sets up associations correctly when passing in a collection', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - blogPosts: this.helper.schema.posts.all() + assert.deepEqual(user.blogPostIds, [ post.id ]); + assert.deepEqual(user.attrs.blogPostIds, [ post.id ], 'the ids were persisted'); + assert.deepEqual(user.blogPosts.models[0].attrs, post.attrs); + assert.equal(this.helper.db.posts.length, 1); + assert.deepEqual(this.helper.db.posts[0], { id: '1' }); + assert.equal(this.helper.db.users.length, 1); + assert.deepEqual(this.helper.db.users[0], { id: '1', blogPostIds: [ '1' ] }); }); - assert.deepEqual(user.blogPostIds, [ post.id ]); - assert.deepEqual(user.attrs.blogPostIds, [ post.id ], 'the ids were persisted'); - assert.deepEqual(user.blogPosts.models[0].attrs, post.attrs); - assert.equal(this.helper.db.posts.length, 1); - assert.deepEqual(this.helper.db.posts[0], { id: '1' }); - assert.equal(this.helper.db.users.length, 1); - assert.deepEqual(this.helper.db.users[0], { id: '1', blogPostIds: [ '1' ] }); -}); + test('it sets up associations correctly when passing in a collection', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + blogPosts: this.helper.schema.posts.all() + }); + + assert.deepEqual(user.blogPostIds, [ post.id ]); + assert.deepEqual(user.attrs.blogPostIds, [ post.id ], 'the ids were persisted'); + assert.deepEqual(user.blogPosts.models[0].attrs, post.attrs); + assert.equal(this.helper.db.posts.length, 1); + assert.deepEqual(this.helper.db.posts[0], { id: '1' }); + assert.equal(this.helper.db.users.length, 1); + assert.deepEqual(this.helper.db.users[0], { id: '1', blogPostIds: [ '1' ] }); + }); -test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.create('user', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); -}); + assert.throws(function() { + schema.create('user', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); + }); -test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.create('user', { - foos: [ schema.create('foo') ] - }); - }, /you haven't defined that key as an association on your model/); -}); + assert.throws(function() { + schema.create('user', { + foos: [ schema.create('foo') ] + }); + }, /you haven't defined that key as an association on your model/); + }); -test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); - assert.throws(function() { - schema.create('post', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); + assert.throws(function() { + schema.create('post', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); }); diff --git a/tests/integration/orm/has-many/2-named/delete-test.js b/tests/integration/orm/has-many/2-named/delete-test.js index 6dc814ae8..6d9484012 100644 --- a/tests/integration/orm/has-many/2-named/delete-test.js +++ b/tests/integration/orm/has-many/2-named/delete-test.js @@ -1,24 +1,24 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named | delete', { - beforeEach() { +module('Integration | ORM | Has Many | Named | delete', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); - } -}); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ user, blogPosts ] = this.helper[state](); + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ user, blogPosts ] = this.helper[state](); - if (blogPosts && blogPosts.length) { - blogPosts.forEach(p => p.destroy()); - user.reload(); - } + if (blogPosts && blogPosts.length) { + blogPosts.forEach(p => p.destroy()); + user.reload(); + } - assert.equal(user.blogPosts.length, 0); - assert.equal(user.blogPostIds.length, 0); - }); + assert.equal(user.blogPosts.length, 0); + assert.equal(user.blogPostIds.length, 0); + }); + }); }); diff --git a/tests/integration/orm/has-many/2-named/instantiating-test.js b/tests/integration/orm/has-many/2-named/instantiating-test.js index f2e1e2cf2..888e219b7 100644 --- a/tests/integration/orm/has-many/2-named/instantiating-test.js +++ b/tests/integration/orm/has-many/2-named/instantiating-test.js @@ -1,81 +1,81 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named | instantiating', { - beforeEach() { +module('Integration | ORM | Has Many | Named | instantiating', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); this.schema = this.helper.schema; - } -}); - -test('the parent accepts a saved child id', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ - blogPostIds: [ post.id ] }); - assert.deepEqual(user.blogPostIds, [ post.id ]); - assert.deepEqual(user.blogPosts.models[0], post); -}); + test('the parent accepts a saved child id', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ + blogPostIds: [ post.id ] + }); -test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ blogPostIds: [ 2 ] }); - }, /You're instantiating a user that has a blogPostIds of 2, but some of those records don't exist in the database/); -}); + assert.deepEqual(user.blogPostIds, [ post.id ]); + assert.deepEqual(user.blogPosts.models[0], post); + }); -test('the parent accepts null children foreign key', function(assert) { - let user = this.schema.users.new({ blogPostIds: null }); + test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ blogPostIds: [ 2 ] }); + }, /You're instantiating a user that has a blogPostIds of 2, but some of those records don't exist in the database/); + }); - assert.equal(user.blogPosts.models.length, 0); - assert.deepEqual(user.blogPostIds, []); - assert.deepEqual(user.attrs, { blogPostIds: null }); -}); + test('the parent accepts null children foreign key', function(assert) { + let user = this.schema.users.new({ blogPostIds: null }); -test('the parent accepts saved children', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ blogPosts: [ post ] }); + assert.equal(user.blogPosts.models.length, 0); + assert.deepEqual(user.blogPostIds, []); + assert.deepEqual(user.attrs, { blogPostIds: null }); + }); - assert.deepEqual(user.blogPostIds, [ post.id ]); - assert.deepEqual(user.blogPosts.models[0], post); -}); + test('the parent accepts saved children', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ blogPosts: [ post ] }); + + assert.deepEqual(user.blogPostIds, [ post.id ]); + assert.deepEqual(user.blogPosts.models[0], post); + }); -test('the parent accepts new children', function(assert) { - let post = this.schema.posts.new({ title: 'Lorem' }); - let user = this.schema.users.new({ blogPosts: [ post ] }); + test('the parent accepts new children', function(assert) { + let post = this.schema.posts.new({ title: 'Lorem' }); + let user = this.schema.users.new({ blogPosts: [ post ] }); - assert.deepEqual(user.blogPostIds, [ undefined ]); - assert.deepEqual(user.blogPosts.models[0], post); -}); + assert.deepEqual(user.blogPostIds, [ undefined ]); + assert.deepEqual(user.blogPosts.models[0], post); + }); -test('the parent accepts null children', function(assert) { - let user = this.schema.users.new({ blogPosts: null }); + test('the parent accepts null children', function(assert) { + let user = this.schema.users.new({ blogPosts: null }); - assert.equal(user.blogPosts.models.length, 0); - assert.deepEqual(user.blogPostIds, []); - assert.deepEqual(user.attrs, { blogPostIds: null }); -}); + assert.equal(user.blogPosts.models.length, 0); + assert.deepEqual(user.blogPostIds, []); + assert.deepEqual(user.attrs, { blogPostIds: null }); + }); -test('the parent accepts children and child ids', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ blogPosts: [ post ], blogPostIds: [ post.id ] }); + test('the parent accepts children and child ids', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ blogPosts: [ post ], blogPostIds: [ post.id ] }); - assert.deepEqual(user.blogPostIds, [ post.id ]); - assert.deepEqual(user.blogPosts.models[0], post); -}); + assert.deepEqual(user.blogPostIds, [ post.id ]); + assert.deepEqual(user.blogPosts.models[0], post); + }); -test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let user = this.schema.users.new({}); + test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let user = this.schema.users.new({}); - assert.deepEqual(user.blogPostIds, []); - assert.deepEqual(user.blogPosts.models, []); - assert.deepEqual(user.attrs, { blogPostIds: null }); -}); + assert.deepEqual(user.blogPostIds, []); + assert.deepEqual(user.blogPosts.models, []); + assert.deepEqual(user.attrs, { blogPostIds: null }); + }); -test('the parent accepts no reference to children or child ids', function(assert) { - let user = this.schema.users.new(); + test('the parent accepts no reference to children or child ids', function(assert) { + let user = this.schema.users.new(); - assert.deepEqual(user.blogPostIds, []); - assert.deepEqual(user.blogPosts.models, []); - assert.deepEqual(user.attrs, { blogPostIds: null }); + assert.deepEqual(user.blogPostIds, []); + assert.deepEqual(user.blogPosts.models, []); + assert.deepEqual(user.attrs, { blogPostIds: null }); + }); }); diff --git a/tests/integration/orm/has-many/3-reflexive/accessor-test.js b/tests/integration/orm/has-many/3-reflexive/accessor-test.js index 0e8a6860f..3d28ae6c8 100644 --- a/tests/integration/orm/has-many/3-reflexive/accessor-test.js +++ b/tests/integration/orm/has-many/3-reflexive/accessor-test.js @@ -1,30 +1,30 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Reflexive | accessor', { - beforeEach() { +module('Integration | ORM | Has Many | Reflexive | accessor', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); - } -}); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ tag, tags ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ tag, tags ] = this.helper[state](); - assert.equal(tag.tags.models.length, tags.length, 'the parent has the correct number of children'); - assert.equal(tag.tagIds.length, tags.length, 'the parent has the correct number of children ids'); + assert.equal(tag.tags.models.length, tags.length, 'the parent has the correct number of children'); + assert.equal(tag.tagIds.length, tags.length, 'the parent has the correct number of children ids'); - tags.forEach((t, i) => { - assert.deepEqual(tag.tags.models[i], t, 'each child is in parent.children array'); + tags.forEach((t, i) => { + assert.deepEqual(tag.tags.models[i], t, 'each child is in parent.children array'); - if (t.isSaved()) { - assert.ok(tag.tagIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); - } + if (t.isSaved()) { + assert.ok(tag.tagIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); + } - // Check the inverse - assert.ok(t.tags.includes(tag)); + // Check the inverse + assert.ok(t.tags.includes(tag)); + }); }); - }); + }); }); diff --git a/tests/integration/orm/has-many/3-reflexive/association-create-test.js b/tests/integration/orm/has-many/3-reflexive/association-create-test.js index fb5565971..0bfd7e6b5 100644 --- a/tests/integration/orm/has-many/3-reflexive/association-create-test.js +++ b/tests/integration/orm/has-many/3-reflexive/association-create-test.js @@ -1,39 +1,42 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Reflexive | association #create', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Reflexive | association #create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can create a has-many association, for all states -*/ -states.forEach((state) => { + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { - test(`a ${state} can create an associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.tags.models.length; + test(`a ${state} can create an associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.tags.models.length; - let orangeTag = tag.createTag({ name: 'Orange' }); - let blueTag = tag.createTag({ name: 'Blue' }); + let orangeTag = tag.createTag({ name: 'Orange' }); + let blueTag = tag.createTag({ name: 'Blue' }); - assert.ok(orangeTag.id, 'the child was persisted'); - assert.ok(blueTag.id, 'the child was persisted'); - assert.equal(tag.tags.models.length, initialCount + 2, 'the collection size was increased'); - assert.ok(tag.tags.includes(orangeTag), 'the model was added to tag.tags'); - assert.ok(tag.tags.includes(blueTag), 'the model was added to tag.tags'); - assert.ok(tag.tagIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); - assert.ok(tag.tagIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); - assert.ok(tag.attrs.tagIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); - assert.ok(tag.attrs.tagIds.indexOf(blueTag.id) > -1, 'fks were persisted'); + assert.ok(orangeTag.id, 'the child was persisted'); + assert.ok(blueTag.id, 'the child was persisted'); + assert.equal(tag.tags.models.length, initialCount + 2, 'the collection size was increased'); + assert.ok(tag.tags.includes(orangeTag), 'the model was added to tag.tags'); + assert.ok(tag.tags.includes(blueTag), 'the model was added to tag.tags'); + assert.ok(tag.tagIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); + assert.ok(tag.tagIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); + assert.ok(tag.attrs.tagIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); + assert.ok(tag.attrs.tagIds.indexOf(blueTag.id) > -1, 'fks were persisted'); - // Check the inverse - assert.equal(orangeTag.tags.models.length, 1); - assert.ok(orangeTag.tags.includes(tag), 'the inverse was set'); - assert.equal(blueTag.tags.models.length, 1); - assert.ok(blueTag.tags.includes(tag), 'the inverse was set'); - }); + // Check the inverse + assert.equal(orangeTag.tags.models.length, 1); + assert.ok(orangeTag.tags.includes(tag), 'the inverse was set'); + assert.equal(blueTag.tags.models.length, 1); + assert.ok(blueTag.tags.includes(tag), 'the inverse was set'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/3-reflexive/association-new-test.js b/tests/integration/orm/has-many/3-reflexive/association-new-test.js index 2f2e7a71f..7d7e91d99 100644 --- a/tests/integration/orm/has-many/3-reflexive/association-new-test.js +++ b/tests/integration/orm/has-many/3-reflexive/association-new-test.js @@ -1,36 +1,39 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Reflexive | association #new', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Reflexive | association #new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can make a new unsaved belongs-to association, for all states -*/ + /* + The model can make a new unsaved belongs-to association, for all states + */ -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can build a new associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.tags.models.length; + test(`a ${state} can build a new associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.tags.models.length; - let blueTag = tag.newTag({ name: 'Blue' }); + let blueTag = tag.newTag({ name: 'Blue' }); - assert.ok(!blueTag.id, 'the child was not persisted'); - assert.equal(tag.tags.models.length, initialCount + 1); - assert.equal(blueTag.tags.models.length, 1, 'the inverse was set'); + assert.ok(!blueTag.id, 'the child was not persisted'); + assert.equal(tag.tags.models.length, initialCount + 1); + assert.equal(blueTag.tags.models.length, 1, 'the inverse was set'); - blueTag.save(); - tag.reload(); + blueTag.save(); + tag.reload(); - assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', tagIds: [ tag.id ] }, 'the child was persisted'); - assert.equal(tag.tags.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.tags.includes(blueTag), 'the model was added to tag.tags'); - assert.ok(tag.tagIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); - assert.ok(blueTag.tags.includes(tag), 'the inverse was set'); - }); + assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', tagIds: [ tag.id ] }, 'the child was persisted'); + assert.equal(tag.tags.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.tags.includes(blueTag), 'the model was added to tag.tags'); + assert.ok(tag.tagIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); + assert.ok(blueTag.tags.includes(tag), 'the inverse was set'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/3-reflexive/association-set-ids-test.js b/tests/integration/orm/has-many/3-reflexive/association-set-ids-test.js index 4b1026af8..5e191948d 100644 --- a/tests/integration/orm/has-many/3-reflexive/association-set-ids-test.js +++ b/tests/integration/orm/has-many/3-reflexive/association-set-ids-test.js @@ -1,48 +1,51 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Reflexive | association #setIds', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Reflexive | association #setIds', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let savedTag = this.helper.savedChild(); + test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let savedTag = this.helper.savedChild(); - tag.tagIds = [ savedTag.id ]; + tag.tagIds = [ savedTag.id ]; - assert.deepEqual(tag.tags.models[0].attrs, savedTag.attrs); - assert.deepEqual(tag.tagIds, [ savedTag.id ]); + assert.deepEqual(tag.tags.models[0].attrs, savedTag.attrs); + assert.deepEqual(tag.tagIds, [ savedTag.id ]); - tag.save(); - savedTag.reload(); + tag.save(); + savedTag.reload(); - assert.deepEqual(savedTag.tags.models[0].attrs, tag.attrs, 'the inverse was set'); - originalTags.forEach(originalTag => { - if (originalTag.isSaved()) { - originalTag.reload(); - assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); - } - }); - }); + assert.deepEqual(savedTag.tags.models[0].attrs, tag.attrs, 'the inverse was set'); + originalTags.forEach(originalTag => { + if (originalTag.isSaved()) { + originalTag.reload(); + assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); + } + }); + }); - test(`a ${state} can clear its association via a null childIds`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); + test(`a ${state} can clear its association via a null childIds`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); - tag.tagIds = null; + tag.tagIds = null; - assert.deepEqual(tag.tags.models, []); - assert.deepEqual(tag.tagIds, []); + assert.deepEqual(tag.tags.models, []); + assert.deepEqual(tag.tagIds, []); - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); - }); - }); + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); + }); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/3-reflexive/association-set-test.js b/tests/integration/orm/has-many/3-reflexive/association-set-test.js index 27b7109ed..d9de5dd74 100644 --- a/tests/integration/orm/has-many/3-reflexive/association-set-test.js +++ b/tests/integration/orm/has-many/3-reflexive/association-set-test.js @@ -1,81 +1,84 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Reflexive | association #set', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Reflexive | association #set', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parent, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let savedTag = this.helper.savedChild(); + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let savedTag = this.helper.savedChild(); - tag.tags = [ savedTag ]; + tag.tags = [ savedTag ]; - assert.ok(tag.tags.includes(savedTag)); - assert.equal(tag.tagIds[0], savedTag.id); - assert.ok(savedTag.tags.includes(tag), 'the inverse was set'); + assert.ok(tag.tags.includes(savedTag)); + assert.equal(tag.tagIds[0], savedTag.id); + assert.ok(savedTag.tags.includes(tag), 'the inverse was set'); - tag.save(); + tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); - }); - }); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); + }); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let newTag = this.helper.newChild(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let newTag = this.helper.newChild(); - tag.tags = [ newTag ]; + tag.tags = [ newTag ]; - assert.ok(tag.tags.includes(newTag)); - assert.equal(tag.tagIds[0], undefined); - assert.ok(newTag.tags.includes(tag), 'the inverse was set'); + assert.ok(tag.tags.includes(newTag)); + assert.equal(tag.tagIds[0], undefined); + assert.ok(newTag.tags.includes(tag), 'the inverse was set'); - tag.save(); + tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); - }); - }); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); + }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); - tag.tags = [ ]; + tag.tags = [ ]; - assert.deepEqual(tag.tagIds, [ ]); - assert.equal(tag.tags.models.length, 0); + assert.deepEqual(tag.tagIds, [ ]); + assert.equal(tag.tags.models.length, 0); - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); - }); - }); + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); + }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); - tag.tags = null; + tag.tags = null; - assert.deepEqual(tag.tagIds, [ ]); - assert.equal(tag.tags.models.length, 0); + assert.deepEqual(tag.tagIds, [ ]); + assert.equal(tag.tags.models.length, 0); - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); - }); - }); + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); + }); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/3-reflexive/create-test.js b/tests/integration/orm/has-many/3-reflexive/create-test.js index 4e534b4e4..1ba9f2f68 100644 --- a/tests/integration/orm/has-many/3-reflexive/create-test.js +++ b/tests/integration/orm/has-many/3-reflexive/create-test.js @@ -2,93 +2,93 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Reflexive | create', { - beforeEach() { +module('Integration | ORM | Has Many | Reflexive | create', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); this.helper.schema.registerModel('foo', Model); - } -}); - -test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - tagIds: [ tagA.id ] }); - tagA.reload(); - - assert.deepEqual(tagA.tagIds, [ tagB.id ]); - assert.deepEqual(tagB.tagIds, [ tagA.id ], 'the inverse was set'); - assert.deepEqual(tagA.attrs.tagIds, [ tagB.id ], 'the ids were persisted'); - assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ], 'the inverse ids were persisted'); - assert.ok(tagA.tags.includes(tagB)); - assert.ok(tagB.tags.includes(tagA), 'the inverse was set'); - assert.equal(this.helper.db.tags.length, 2); - assert.deepEqual(this.helper.db.tags[0], { id: '1', tagIds: [ '2' ] }); - assert.deepEqual(this.helper.db.tags[1], { id: '2', tagIds: [ '1' ] }); -}); + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + tagIds: [ tagA.id ] + }); -test('it sets up associations correctly when passing in an array of models', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - tags: [ tagA ] + tagA.reload(); + + assert.deepEqual(tagA.tagIds, [ tagB.id ]); + assert.deepEqual(tagB.tagIds, [ tagA.id ], 'the inverse was set'); + assert.deepEqual(tagA.attrs.tagIds, [ tagB.id ], 'the ids were persisted'); + assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ], 'the inverse ids were persisted'); + assert.ok(tagA.tags.includes(tagB)); + assert.ok(tagB.tags.includes(tagA), 'the inverse was set'); + assert.equal(this.helper.db.tags.length, 2); + assert.deepEqual(this.helper.db.tags[0], { id: '1', tagIds: [ '2' ] }); + assert.deepEqual(this.helper.db.tags[1], { id: '2', tagIds: [ '1' ] }); }); - tagA.reload(); + test('it sets up associations correctly when passing in an array of models', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + tags: [ tagA ] + }); - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagA.tagIds, [ tagB.id ], 'the inverse was set'); - assert.deepEqual(tagA.attrs.tagIds, [ tagB.id ], 'the ids were persisted'); - assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ], 'the inverse was set'); - assert.equal(this.helper.db.tags.length, 2); -}); + tagA.reload(); -test('it sets up associations correctly when passing in a collection', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - tags: schema.tags.all() + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagA.tagIds, [ tagB.id ], 'the inverse was set'); + assert.deepEqual(tagA.attrs.tagIds, [ tagB.id ], 'the ids were persisted'); + assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ], 'the inverse was set'); + assert.equal(this.helper.db.tags.length, 2); }); - tagA.reload(); + test('it sets up associations correctly when passing in a collection', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + tags: schema.tags.all() + }); + + tagA.reload(); - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagA.tagIds, [ tagB.id ], 'the inverse was set'); - assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ]); - assert.deepEqual(tagA.attrs.tagIds, [ tagB.id ], 'the inverse was set'); - assert.equal(this.helper.db.tags.length, 2); -}); + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagA.tagIds, [ tagB.id ], 'the inverse was set'); + assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ]); + assert.deepEqual(tagA.attrs.tagIds, [ tagB.id ], 'the inverse was set'); + assert.equal(this.helper.db.tags.length, 2); + }); -test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.tags.create({ - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); -}); + assert.throws(function() { + schema.tags.create({ + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); + }); -test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.tags.create({ - foos: [ schema.create('foo') ] - }); - }, /you haven't defined that key as an association on your model/); -}); + assert.throws(function() { + schema.tags.create({ + foos: [ schema.create('foo') ] + }); + }, /you haven't defined that key as an association on your model/); + }); -test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.foos.create(); - schema.foos.create(); + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.foos.create(); + schema.foos.create(); - assert.throws(function() { - schema.tags.create({ - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); + assert.throws(function() { + schema.tags.create({ + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); }); diff --git a/tests/integration/orm/has-many/3-reflexive/delete-test.js b/tests/integration/orm/has-many/3-reflexive/delete-test.js index 35691aafd..1b009128b 100644 --- a/tests/integration/orm/has-many/3-reflexive/delete-test.js +++ b/tests/integration/orm/has-many/3-reflexive/delete-test.js @@ -1,24 +1,24 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Reflexive | delete', { - beforeEach() { +module('Integration | ORM | Has Many | Reflexive | delete', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); - } -}); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ tag, tags ] = this.helper[state](); + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ tag, tags ] = this.helper[state](); - if (tags && tags.length) { - tags.forEach(t => t.destroy()); - tag.reload(); - } + if (tags && tags.length) { + tags.forEach(t => t.destroy()); + tag.reload(); + } - assert.equal(tag.tags.length, 0); - assert.equal(tag.tagIds.length, 0); - }); + assert.equal(tag.tags.length, 0); + assert.equal(tag.tagIds.length, 0); + }); + }); }); diff --git a/tests/integration/orm/has-many/3-reflexive/new-test.js b/tests/integration/orm/has-many/3-reflexive/new-test.js index 5a9a8f848..8ebc34b50 100644 --- a/tests/integration/orm/has-many/3-reflexive/new-test.js +++ b/tests/integration/orm/has-many/3-reflexive/new-test.js @@ -1,81 +1,81 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Reflexive | new', { - beforeEach() { +module('Integration | ORM | Has Many | Reflexive | new', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); this.schema = this.helper.schema; - } -}); - -test('the parent accepts a saved child id', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ - tagIds: [ tagA.id ] }); - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagB.tags.models[0], tagA); -}); + test('the parent accepts a saved child id', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ + tagIds: [ tagA.id ] + }); -test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.tags.new({ tagIds: [ 2 ] }); - }, /You're instantiating a tag that has a tagIds of 2, but some of those records don't exist in the database/); -}); + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagB.tags.models[0], tagA); + }); -test('the parent accepts null children foreign key', function(assert) { - let tag = this.schema.tags.new({ tagIds: null }); + test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.tags.new({ tagIds: [ 2 ] }); + }, /You're instantiating a tag that has a tagIds of 2, but some of those records don't exist in the database/); + }); - assert.equal(tag.tags.models.length, 0); - assert.deepEqual(tag.tagIds, []); - assert.deepEqual(tag.attrs, { tagIds: null }); -}); + test('the parent accepts null children foreign key', function(assert) { + let tag = this.schema.tags.new({ tagIds: null }); -test('the parent accepts saved children', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ tags: [ tagA ] }); + assert.equal(tag.tags.models.length, 0); + assert.deepEqual(tag.tagIds, []); + assert.deepEqual(tag.attrs, { tagIds: null }); + }); - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagB.tags.models[0], tagA); -}); + test('the parent accepts saved children', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ tags: [ tagA ] }); + + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagB.tags.models[0], tagA); + }); -test('the parent accepts new children', function(assert) { - let tagA = this.schema.tags.new({ color: 'Red' }); - let tagB = this.schema.tags.new({ tags: [ tagA ] }); + test('the parent accepts new children', function(assert) { + let tagA = this.schema.tags.new({ color: 'Red' }); + let tagB = this.schema.tags.new({ tags: [ tagA ] }); - assert.deepEqual(tagB.tagIds, [ undefined ]); - assert.deepEqual(tagB.tags.models[0], tagA); -}); + assert.deepEqual(tagB.tagIds, [ undefined ]); + assert.deepEqual(tagB.tags.models[0], tagA); + }); -test('the parent accepts null children', function(assert) { - let tag = this.schema.tags.new({ tags: null }); + test('the parent accepts null children', function(assert) { + let tag = this.schema.tags.new({ tags: null }); - assert.equal(tag.tags.models.length, 0); - assert.deepEqual(tag.tagIds, []); - assert.deepEqual(tag.attrs, { tagIds: null }); -}); + assert.equal(tag.tags.models.length, 0); + assert.deepEqual(tag.tagIds, []); + assert.deepEqual(tag.attrs, { tagIds: null }); + }); -test('the parent accepts children and child ids', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ tags: [ tagA ], tagIds: [ tagA.id ] }); + test('the parent accepts children and child ids', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ tags: [ tagA ], tagIds: [ tagA.id ] }); - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagB.tags.models[0], tagA); -}); + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagB.tags.models[0], tagA); + }); -test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let tag = this.schema.tags.new({}); + test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let tag = this.schema.tags.new({}); - assert.deepEqual(tag.tagIds, []); - assert.deepEqual(tag.tags.models, []); - assert.deepEqual(tag.attrs, { tagIds: null }); -}); + assert.deepEqual(tag.tagIds, []); + assert.deepEqual(tag.tags.models, []); + assert.deepEqual(tag.attrs, { tagIds: null }); + }); -test('the parent accepts no reference to children or child ids', function(assert) { - let tag = this.schema.tags.new(); + test('the parent accepts no reference to children or child ids', function(assert) { + let tag = this.schema.tags.new(); - assert.deepEqual(tag.tagIds, []); - assert.deepEqual(tag.tags.models, []); - assert.deepEqual(tag.attrs, { tagIds: null }); + assert.deepEqual(tag.tagIds, []); + assert.deepEqual(tag.tags.models, []); + assert.deepEqual(tag.attrs, { tagIds: null }); + }); }); diff --git a/tests/integration/orm/has-many/4-named-reflexive/accessor-test.js b/tests/integration/orm/has-many/4-named-reflexive/accessor-test.js index dd8e5ae64..f062ce2a9 100644 --- a/tests/integration/orm/has-many/4-named-reflexive/accessor-test.js +++ b/tests/integration/orm/has-many/4-named-reflexive/accessor-test.js @@ -1,30 +1,33 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named Reflexive | accessor', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Named Reflexive | accessor', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ tag, tags ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ tag, tags ] = this.helper[state](); - assert.equal(tag.labels.models.length, tags.length, 'the parent has the correct number of children'); - assert.equal(tag.labelIds.length, tags.length, 'the parent has the correct number of children ids'); + assert.equal(tag.labels.models.length, tags.length, 'the parent has the correct number of children'); + assert.equal(tag.labelIds.length, tags.length, 'the parent has the correct number of children ids'); - tags.forEach((t, i) => { - assert.deepEqual(tag.labels.models[i], t, 'each child is in parent.children array'); + tags.forEach((t, i) => { + assert.deepEqual(tag.labels.models[i], t, 'each child is in parent.children array'); - if (t.isSaved()) { - assert.ok(tag.labelIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); - } + if (t.isSaved()) { + assert.ok(tag.labelIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); + } - // Check the inverse - assert.ok(t.labels.includes(tag)); - }); - }); + // Check the inverse + assert.ok(t.labels.includes(tag)); + }); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/4-named-reflexive/association-create-test.js b/tests/integration/orm/has-many/4-named-reflexive/association-create-test.js index 93f9f48e2..d0dbbd5e6 100644 --- a/tests/integration/orm/has-many/4-named-reflexive/association-create-test.js +++ b/tests/integration/orm/has-many/4-named-reflexive/association-create-test.js @@ -1,29 +1,32 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named Reflexive | association #create', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Named Reflexive | association #create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can create a has-many association, for all states -*/ -states.forEach((state) => { + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { - test(`a ${state} can create an associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.labels.models.length; + test(`a ${state} can create an associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.labels.models.length; - let orangeTag = tag.createLabel({ name: 'Orange' }); + let orangeTag = tag.createLabel({ name: 'Orange' }); - assert.ok(orangeTag.id, 'the child was persisted'); - assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.labels.includes(orangeTag), 'the model was added to tag.labels'); - assert.ok(tag.labelIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); - assert.ok(tag.attrs.labelIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); - assert.ok(orangeTag.labels.includes(tag), 'the inverse was set'); - }); + assert.ok(orangeTag.id, 'the child was persisted'); + assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.labels.includes(orangeTag), 'the model was added to tag.labels'); + assert.ok(tag.labelIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); + assert.ok(tag.attrs.labelIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); + assert.ok(orangeTag.labels.includes(tag), 'the inverse was set'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/4-named-reflexive/association-new-test.js b/tests/integration/orm/has-many/4-named-reflexive/association-new-test.js index 944759dbc..cb54ef9b9 100644 --- a/tests/integration/orm/has-many/4-named-reflexive/association-new-test.js +++ b/tests/integration/orm/has-many/4-named-reflexive/association-new-test.js @@ -1,35 +1,38 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named Reflexive | association #new', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Named Reflexive | association #new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can make a new unsaved belongs-to association, for all states -*/ + /* + The model can make a new unsaved belongs-to association, for all states + */ -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can build a new associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.labels.models.length; + test(`a ${state} can build a new associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.labels.models.length; - let blueTag = tag.newLabel({ name: 'Blue' }); + let blueTag = tag.newLabel({ name: 'Blue' }); - assert.ok(!blueTag.id, 'the child was not persisted'); - assert.equal(tag.labels.models.length, initialCount + 1); - assert.equal(blueTag.labels.models.length, 1, 'the inverse was set'); + assert.ok(!blueTag.id, 'the child was not persisted'); + assert.equal(tag.labels.models.length, initialCount + 1); + assert.equal(blueTag.labels.models.length, 1, 'the inverse was set'); - blueTag.save(); + blueTag.save(); - assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', labelIds: [ tag.id ] }, 'the child was persisted'); - assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.labels.includes(blueTag), 'the model was added to tag.labels'); - assert.ok(tag.labelIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); - assert.ok(blueTag.labels.includes(tag), 'the inverse was set'); - }); + assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', labelIds: [ tag.id ] }, 'the child was persisted'); + assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.labels.includes(blueTag), 'the model was added to tag.labels'); + assert.ok(tag.labelIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); + assert.ok(blueTag.labels.includes(tag), 'the inverse was set'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/4-named-reflexive/association-set-ids-test.js b/tests/integration/orm/has-many/4-named-reflexive/association-set-ids-test.js index 8edcd929e..3ee354739 100644 --- a/tests/integration/orm/has-many/4-named-reflexive/association-set-ids-test.js +++ b/tests/integration/orm/has-many/4-named-reflexive/association-set-ids-test.js @@ -1,48 +1,51 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named Reflexive | association #setIds', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Named Reflexive | association #setIds', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let savedTag = this.helper.savedChild(); + test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let savedTag = this.helper.savedChild(); - tag.labelIds = [ savedTag.id ]; + tag.labelIds = [ savedTag.id ]; - assert.deepEqual(tag.labels.models[0].attrs, savedTag.attrs); - assert.deepEqual(tag.labelIds, [ savedTag.id ]); + assert.deepEqual(tag.labels.models[0].attrs, savedTag.attrs); + assert.deepEqual(tag.labelIds, [ savedTag.id ]); - tag.save(); - savedTag.reload(); + tag.save(); + savedTag.reload(); - assert.deepEqual(savedTag.labels.models[0].attrs, tag.attrs, 'the inverse was set'); - originalTags.forEach(originalTag => { - if (originalTag.isSaved()) { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - } - }); - }); + assert.deepEqual(savedTag.labels.models[0].attrs, tag.attrs, 'the inverse was set'); + originalTags.forEach(originalTag => { + if (originalTag.isSaved()) { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + } + }); + }); - test(`a ${state} can clear its association via a null childIds`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); + test(`a ${state} can clear its association via a null childIds`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); - tag.labelIds = null; + tag.labelIds = null; - assert.deepEqual(tag.labels.models, []); - assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.labels.models, []); + assert.deepEqual(tag.labelIds, []); - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); - }); + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + }); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/4-named-reflexive/association-set-test.js b/tests/integration/orm/has-many/4-named-reflexive/association-set-test.js index 2c966da8a..01671e0fe 100644 --- a/tests/integration/orm/has-many/4-named-reflexive/association-set-test.js +++ b/tests/integration/orm/has-many/4-named-reflexive/association-set-test.js @@ -1,81 +1,84 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named Reflexive | association #set', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Named Reflexive | association #set', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parent, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let savedTag = this.helper.savedChild(); + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let savedTag = this.helper.savedChild(); - tag.labels = [ savedTag ]; + tag.labels = [ savedTag ]; - assert.ok(tag.labels.includes(savedTag)); - assert.equal(tag.labelIds[0], savedTag.id); - assert.ok(savedTag.labels.includes(tag), 'the inverse was set'); + assert.ok(tag.labels.includes(savedTag)); + assert.equal(tag.labelIds[0], savedTag.id); + assert.ok(savedTag.labels.includes(tag), 'the inverse was set'); - tag.save(); + tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); - }); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + }); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let newTag = this.helper.newChild(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let newTag = this.helper.newChild(); - tag.labels = [ newTag ]; + tag.labels = [ newTag ]; - assert.ok(tag.labels.includes(newTag)); - assert.equal(tag.labelIds[0], undefined); - assert.ok(newTag.labels.includes(tag), 'the inverse was set'); + assert.ok(tag.labels.includes(newTag)); + assert.equal(tag.labelIds[0], undefined); + assert.ok(newTag.labels.includes(tag), 'the inverse was set'); - tag.save(); + tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); - }); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); - tag.labels = [ ]; + tag.labels = [ ]; - assert.deepEqual(tag.labelIds, [ ]); - assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, [ ]); + assert.equal(tag.labels.models.length, 0); - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); - }); + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); - tag.labels = null; + tag.labels = null; - assert.deepEqual(tag.labelIds, [ ]); - assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, [ ]); + assert.equal(tag.labels.models.length, 0); - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); - }); + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + }); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/4-named-reflexive/create-test.js b/tests/integration/orm/has-many/4-named-reflexive/create-test.js index d27842f02..7d2d79e9f 100644 --- a/tests/integration/orm/has-many/4-named-reflexive/create-test.js +++ b/tests/integration/orm/has-many/4-named-reflexive/create-test.js @@ -2,93 +2,96 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named Reflexive | create', { - beforeEach() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - } -}); - -test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labelIds: [ tagA.id ] - }); - - tagA.reload(); - - assert.deepEqual(tagA.labelIds, [ tagB.id ]); - assert.deepEqual(tagB.labelIds, [ tagA.id ], 'the inverse was set'); - assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the ids were persisted'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the inverse ids were persisted'); - assert.deepEqual(tagA.labels.models[0].attrs, tagB.attrs); - assert.deepEqual(tagB.labels.models[0].attrs, tagA.attrs, 'the inverse was set'); - assert.equal(this.helper.db.tags.length, 2); - assert.deepEqual(this.helper.db.tags[0], { id: '1', labelIds: [ '2' ] }); - assert.deepEqual(this.helper.db.tags[1], { id: '2', labelIds: [ '1' ] }); -}); - -test('it sets up associations correctly when passing in an array of models', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labels: [ tagA ] - }); - - tagA.reload(); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.labelIds, [ tagB.id ], 'the inverse was set'); - assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the ids were persisted'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the inverse was set'); - assert.equal(this.helper.db.tags.length, 2); -}); - -test('it sets up associations correctly when passing in a collection', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labels: schema.tags.all() - }); - - tagA.reload(); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.labelIds, [ tagB.id ], 'the inverse was set'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the inverse was set'); - assert.equal(this.helper.db.tags.length, 2); -}); - -test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.tags.create({ - foo: schema.create('foo') +module( + 'Integration | ORM | Has Many | Named Reflexive | create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + }); + + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labelIds: [ tagA.id ] + }); + + tagA.reload(); + + assert.deepEqual(tagA.labelIds, [ tagB.id ]); + assert.deepEqual(tagB.labelIds, [ tagA.id ], 'the inverse was set'); + assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the ids were persisted'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the inverse ids were persisted'); + assert.deepEqual(tagA.labels.models[0].attrs, tagB.attrs); + assert.deepEqual(tagB.labels.models[0].attrs, tagA.attrs, 'the inverse was set'); + assert.equal(this.helper.db.tags.length, 2); + assert.deepEqual(this.helper.db.tags[0], { id: '1', labelIds: [ '2' ] }); + assert.deepEqual(this.helper.db.tags[1], { id: '2', labelIds: [ '1' ] }); + }); + + test('it sets up associations correctly when passing in an array of models', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labels: [ tagA ] + }); + + tagA.reload(); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.labelIds, [ tagB.id ], 'the inverse was set'); + assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the ids were persisted'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the inverse was set'); + assert.equal(this.helper.db.tags.length, 2); }); - }, /you haven't defined that key as an association on your model/); -}); -test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it sets up associations correctly when passing in a collection', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labels: schema.tags.all() + }); + + tagA.reload(); - assert.throws(function() { - schema.tags.create({ - foos: [ schema.create('foo') ] + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.labelIds, [ tagB.id ], 'the inverse was set'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the inverse was set'); + assert.equal(this.helper.db.tags.length, 2); }); - }, /you haven't defined that key as an association on your model/); -}); -test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.foos.create(); - schema.foos.create(); + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.tags.create({ - foos: schema.foos.all() + assert.throws(function() { + schema.tags.create({ + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); }); - }, /you haven't defined that key as an association on your model/); -}); + + test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.tags.create({ + foos: [ schema.create('foo') ] + }); + }, /you haven't defined that key as an association on your model/); + }); + + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.foos.create(); + schema.foos.create(); + + assert.throws(function() { + schema.tags.create({ + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); + } +); diff --git a/tests/integration/orm/has-many/4-named-reflexive/delete-test.js b/tests/integration/orm/has-many/4-named-reflexive/delete-test.js index 8eddc9d2d..f72738843 100644 --- a/tests/integration/orm/has-many/4-named-reflexive/delete-test.js +++ b/tests/integration/orm/has-many/4-named-reflexive/delete-test.js @@ -1,24 +1,27 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named Reflexive | delete', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Named Reflexive | delete', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ tag, labels ] = this.helper[state](); + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ tag, labels ] = this.helper[state](); - if (labels && labels.length) { - labels.forEach(t => t.destroy()); - tag.reload(); - } + if (labels && labels.length) { + labels.forEach(t => t.destroy()); + tag.reload(); + } - assert.equal(tag.labels.length, 0); - assert.equal(tag.labelIds.length, 0); - }); + assert.equal(tag.labels.length, 0); + assert.equal(tag.labelIds.length, 0); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/4-named-reflexive/new-test.js b/tests/integration/orm/has-many/4-named-reflexive/new-test.js index a047a4959..6e82bf224 100644 --- a/tests/integration/orm/has-many/4-named-reflexive/new-test.js +++ b/tests/integration/orm/has-many/4-named-reflexive/new-test.js @@ -1,81 +1,81 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named Reflexive | new', { - beforeEach() { +module('Integration | ORM | Has Many | Named Reflexive | new', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); this.schema = this.helper.schema; - } -}); - -test('the parent accepts a saved child id', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ - labelIds: [ tagA.id ] }); - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagB.labels.models[0], tagA); -}); + test('the parent accepts a saved child id', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ + labelIds: [ tagA.id ] + }); -test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.tags.new({ labelIds: [ 2 ] }); - }, /You're instantiating a tag that has a labelIds of 2, but some of those records don't exist in the database/); -}); + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagB.labels.models[0], tagA); + }); -test('the parent accepts null children foreign key', function(assert) { - let tag = this.schema.tags.new({ labelIds: null }); + test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.tags.new({ labelIds: [ 2 ] }); + }, /You're instantiating a tag that has a labelIds of 2, but some of those records don't exist in the database/); + }); - assert.equal(tag.labels.models.length, 0); - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.attrs, { labelIds: null }); -}); + test('the parent accepts null children foreign key', function(assert) { + let tag = this.schema.tags.new({ labelIds: null }); -test('the parent accepts saved children', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ labels: [ tagA ] }); + assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.attrs, { labelIds: null }); + }); - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagB.labels.models[0], tagA); -}); + test('the parent accepts saved children', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ labels: [ tagA ] }); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagB.labels.models[0], tagA); + }); -test('the parent accepts new children', function(assert) { - let tagA = this.schema.tags.new({ color: 'Red' }); - let tagB = this.schema.tags.new({ labels: [ tagA ] }); + test('the parent accepts new children', function(assert) { + let tagA = this.schema.tags.new({ color: 'Red' }); + let tagB = this.schema.tags.new({ labels: [ tagA ] }); - assert.deepEqual(tagB.labelIds, [ undefined ]); - assert.deepEqual(tagB.labels.models[0], tagA); -}); + assert.deepEqual(tagB.labelIds, [ undefined ]); + assert.deepEqual(tagB.labels.models[0], tagA); + }); -test('the parent accepts null children', function(assert) { - let tag = this.schema.tags.new({ labels: null }); + test('the parent accepts null children', function(assert) { + let tag = this.schema.tags.new({ labels: null }); - assert.equal(tag.labels.models.length, 0); - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.attrs, { labelIds: null }); -}); + assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.attrs, { labelIds: null }); + }); -test('the parent accepts children and child ids', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ labels: [ tagA ], labelIds: [ tagA.id ] }); + test('the parent accepts children and child ids', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ labels: [ tagA ], labelIds: [ tagA.id ] }); - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagB.labels.models[0], tagA); -}); + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagB.labels.models[0], tagA); + }); -test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let tag = this.schema.tags.new({}); + test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let tag = this.schema.tags.new({}); - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.labels.models, []); - assert.deepEqual(tag.attrs, { labelIds: null }); -}); + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.labels.models, []); + assert.deepEqual(tag.attrs, { labelIds: null }); + }); -test('the parent accepts no reference to children or child ids', function(assert) { - let tag = this.schema.tags.new(); + test('the parent accepts no reference to children or child ids', function(assert) { + let tag = this.schema.tags.new(); - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.labels.models, []); - assert.deepEqual(tag.attrs, { labelIds: null }); + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.labels.models, []); + assert.deepEqual(tag.attrs, { labelIds: null }); + }); }); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/accessor-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/accessor-test.js index a471a1685..84b83027f 100644 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/accessor-test.js +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/accessor-test.js @@ -1,30 +1,33 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | accessor', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Named Reflexive Explicit Inverse | accessor', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ tag, tags ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ tag, tags ] = this.helper[state](); - assert.equal(tag.labels.models.length, tags.length, 'the parent has the correct number of children'); - assert.equal(tag.labelIds.length, tags.length, 'the parent has the correct number of children ids'); + assert.equal(tag.labels.models.length, tags.length, 'the parent has the correct number of children'); + assert.equal(tag.labelIds.length, tags.length, 'the parent has the correct number of children ids'); - tags.forEach((t, i) => { - assert.deepEqual(tag.labels.models[i], t, 'each child is in parent.children array'); + tags.forEach((t, i) => { + assert.deepEqual(tag.labels.models[i], t, 'each child is in parent.children array'); - if (t.isSaved()) { - assert.ok(tag.labelIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); - } + if (t.isSaved()) { + assert.ok(tag.labelIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); + } - // Check the inverse - assert.ok(t.labels.includes(tag)); - }); - }); + // Check the inverse + assert.ok(t.labels.includes(tag)); + }); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-create-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-create-test.js index fdbe7da4a..c9364319c 100644 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-create-test.js +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-create-test.js @@ -1,29 +1,32 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | association #create', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Named Reflexive Explicit Inverse | association #create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can create a has-many association, for all states -*/ -states.forEach((state) => { + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { - test(`a ${state} can create an associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.labels.models.length; + test(`a ${state} can create an associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.labels.models.length; - let orangeTag = tag.createLabel({ name: 'Orange' }); + let orangeTag = tag.createLabel({ name: 'Orange' }); - assert.ok(orangeTag.id, 'the child was persisted'); - assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.labels.includes(orangeTag), 'the model was added to tag.labels'); - assert.ok(tag.labelIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); - assert.ok(tag.attrs.labelIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); - assert.ok(orangeTag.labels.includes(tag), 'the inverse was set'); - }); + assert.ok(orangeTag.id, 'the child was persisted'); + assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.labels.includes(orangeTag), 'the model was added to tag.labels'); + assert.ok(tag.labelIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); + assert.ok(tag.attrs.labelIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); + assert.ok(orangeTag.labels.includes(tag), 'the inverse was set'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-new-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-new-test.js index 68218f393..1e39d2aed 100644 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-new-test.js +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-new-test.js @@ -1,35 +1,38 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | association #new', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Named Reflexive Explicit Inverse | association #new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can make a new unsaved belongs-to association, for all states -*/ + /* + The model can make a new unsaved belongs-to association, for all states + */ -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can build a new associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.labels.models.length; + test(`a ${state} can build a new associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.labels.models.length; - let blueTag = tag.newLabel({ name: 'Blue' }); + let blueTag = tag.newLabel({ name: 'Blue' }); - assert.ok(!blueTag.id, 'the child was not persisted'); - assert.equal(tag.labels.models.length, initialCount + 1); - assert.equal(blueTag.labels.models.length, 1, 'the inverse was set'); + assert.ok(!blueTag.id, 'the child was not persisted'); + assert.equal(tag.labels.models.length, initialCount + 1); + assert.equal(blueTag.labels.models.length, 1, 'the inverse was set'); - blueTag.save(); + blueTag.save(); - assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', labelIds: [ tag.id ] }, 'the child was persisted'); - assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.labels.includes(blueTag), 'the model was added to tag.labels'); - assert.ok(tag.labelIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); - assert.ok(blueTag.labels.includes(tag), 'the inverse was set'); - }); + assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', labelIds: [ tag.id ] }, 'the child was persisted'); + assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.labels.includes(blueTag), 'the model was added to tag.labels'); + assert.ok(tag.labelIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); + assert.ok(blueTag.labels.includes(tag), 'the inverse was set'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-ids-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-ids-test.js index b7be9ed49..a60c874c4 100644 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-ids-test.js +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-ids-test.js @@ -1,48 +1,51 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | association #setIds', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Named Reflexive Explicit Inverse | association #setIds', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let savedTag = this.helper.savedChild(); + test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let savedTag = this.helper.savedChild(); - tag.labelIds = [ savedTag.id ]; + tag.labelIds = [ savedTag.id ]; - assert.deepEqual(tag.labels.models[0].attrs, savedTag.attrs); - assert.deepEqual(tag.labelIds, [ savedTag.id ]); + assert.deepEqual(tag.labels.models[0].attrs, savedTag.attrs); + assert.deepEqual(tag.labelIds, [ savedTag.id ]); - tag.save(); - savedTag.reload(); + tag.save(); + savedTag.reload(); - assert.deepEqual(savedTag.labels.models[0].attrs, tag.attrs, 'the inverse was set'); - originalTags.forEach(originalTag => { - if (originalTag.isSaved()) { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - } - }); - }); + assert.deepEqual(savedTag.labels.models[0].attrs, tag.attrs, 'the inverse was set'); + originalTags.forEach(originalTag => { + if (originalTag.isSaved()) { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + } + }); + }); - test(`a ${state} can clear its association via a null childIds`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); + test(`a ${state} can clear its association via a null childIds`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); - tag.labelIds = null; + tag.labelIds = null; - assert.deepEqual(tag.labels.models, []); - assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.labels.models, []); + assert.deepEqual(tag.labelIds, []); - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); - }); + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + }); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-test.js index 6ebf3b076..2083445ad 100644 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-test.js +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-test.js @@ -1,81 +1,84 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | association #set', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Named Reflexive Explicit Inverse | association #set', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parent, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let savedTag = this.helper.savedChild(); + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let savedTag = this.helper.savedChild(); - tag.labels = [ savedTag ]; + tag.labels = [ savedTag ]; - assert.ok(tag.labels.includes(savedTag)); - assert.equal(tag.labelIds[0], savedTag.id); - assert.ok(savedTag.labels.includes(tag), 'the inverse was set'); + assert.ok(tag.labels.includes(savedTag)); + assert.equal(tag.labelIds[0], savedTag.id); + assert.ok(savedTag.labels.includes(tag), 'the inverse was set'); - tag.save(); + tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); - }); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + }); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let newTag = this.helper.newChild(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let newTag = this.helper.newChild(); - tag.labels = [ newTag ]; + tag.labels = [ newTag ]; - assert.ok(tag.labels.includes(newTag)); - assert.equal(tag.labelIds[0], undefined); - assert.ok(newTag.labels.includes(tag), 'the inverse was set'); + assert.ok(tag.labels.includes(newTag)); + assert.equal(tag.labelIds[0], undefined); + assert.ok(newTag.labels.includes(tag), 'the inverse was set'); - tag.save(); + tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); - }); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); - tag.labels = [ ]; + tag.labels = [ ]; - assert.deepEqual(tag.labelIds, [ ]); - assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, [ ]); + assert.equal(tag.labels.models.length, 0); - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); - }); + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); - tag.labels = null; + tag.labels = null; - assert.deepEqual(tag.labelIds, [ ]); - assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, [ ]); + assert.equal(tag.labels.models.length, 0); - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); - }); + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + }); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/create-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/create-test.js index 13d1b65a6..9770f6ddb 100644 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/create-test.js +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/create-test.js @@ -2,93 +2,96 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | create', { - beforeEach() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - } -}); - -test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labelIds: [ tagA.id ] - }); - - tagA.reload(); - - assert.deepEqual(tagA.labelIds, [ tagB.id ]); - assert.deepEqual(tagB.labelIds, [ tagA.id ], 'the inverse was set'); - assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the ids were persisted'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the inverse ids were persisted'); - assert.deepEqual(tagA.labels.models[0].attrs, tagB.attrs); - assert.deepEqual(tagB.labels.models[0].attrs, tagA.attrs, 'the inverse was set'); - assert.equal(this.helper.db.tags.length, 2); - assert.deepEqual(this.helper.db.tags[0], { id: '1', labelIds: [ '2' ] }); - assert.deepEqual(this.helper.db.tags[1], { id: '2', labelIds: [ '1' ] }); -}); - -test('it sets up associations correctly when passing in an array of models', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labels: [ tagA ] - }); - - tagA.reload(); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.labelIds, [ tagB.id ], 'the inverse was set'); - assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the ids were persisted'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the inverse was set'); - assert.equal(this.helper.db.tags.length, 2); -}); - -test('it sets up associations correctly when passing in a collection', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labels: schema.tags.all() - }); - - tagA.reload(); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.labelIds, [ tagB.id ], 'the inverse was set'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the inverse was set'); - assert.equal(this.helper.db.tags.length, 2); -}); - -test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.tags.create({ - foo: schema.create('foo') +module( + 'Integration | ORM | Has Many | Named Reflexive Explicit Inverse | create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + }); + + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labelIds: [ tagA.id ] + }); + + tagA.reload(); + + assert.deepEqual(tagA.labelIds, [ tagB.id ]); + assert.deepEqual(tagB.labelIds, [ tagA.id ], 'the inverse was set'); + assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the ids were persisted'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the inverse ids were persisted'); + assert.deepEqual(tagA.labels.models[0].attrs, tagB.attrs); + assert.deepEqual(tagB.labels.models[0].attrs, tagA.attrs, 'the inverse was set'); + assert.equal(this.helper.db.tags.length, 2); + assert.deepEqual(this.helper.db.tags[0], { id: '1', labelIds: [ '2' ] }); + assert.deepEqual(this.helper.db.tags[1], { id: '2', labelIds: [ '1' ] }); + }); + + test('it sets up associations correctly when passing in an array of models', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labels: [ tagA ] + }); + + tagA.reload(); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.labelIds, [ tagB.id ], 'the inverse was set'); + assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the ids were persisted'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the inverse was set'); + assert.equal(this.helper.db.tags.length, 2); }); - }, /you haven't defined that key as an association on your model/); -}); -test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it sets up associations correctly when passing in a collection', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labels: schema.tags.all() + }); + + tagA.reload(); - assert.throws(function() { - schema.tags.create({ - foos: [ schema.create('foo') ] + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.labelIds, [ tagB.id ], 'the inverse was set'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the inverse was set'); + assert.equal(this.helper.db.tags.length, 2); }); - }, /you haven't defined that key as an association on your model/); -}); -test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.foos.create(); - schema.foos.create(); + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.tags.create({ - foos: schema.foos.all() + assert.throws(function() { + schema.tags.create({ + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); }); - }, /you haven't defined that key as an association on your model/); -}); + + test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.tags.create({ + foos: [ schema.create('foo') ] + }); + }, /you haven't defined that key as an association on your model/); + }); + + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.foos.create(); + schema.foos.create(); + + assert.throws(function() { + schema.tags.create({ + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); + } +); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/delete-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/delete-test.js index 13a7b40e1..2202ed172 100644 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/delete-test.js +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/delete-test.js @@ -1,24 +1,27 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | delete', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Named Reflexive Explicit Inverse | delete', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ tag, labels ] = this.helper[state](); + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ tag, labels ] = this.helper[state](); - if (labels && labels.length) { - labels.forEach(t => t.destroy()); - tag.reload(); - } + if (labels && labels.length) { + labels.forEach(t => t.destroy()); + tag.reload(); + } - assert.equal(tag.labels.length, 0); - assert.equal(tag.labelIds.length, 0); - }); + assert.equal(tag.labels.length, 0); + assert.equal(tag.labelIds.length, 0); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/new-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/new-test.js index 4c0142c79..a962280d1 100644 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/new-test.js +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/new-test.js @@ -1,81 +1,84 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | new', { - beforeEach() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module( + 'Integration | ORM | Has Many | Named Reflexive Explicit Inverse | new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the parent accepts a saved child id', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ + labelIds: [ tagA.id ] + }); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagB.labels.models[0], tagA); + }); + + test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.tags.new({ labelIds: [ 2 ] }); + }, /You're instantiating a tag that has a labelIds of 2, but some of those records don't exist in the database/); + }); + + test('the parent accepts null children foreign key', function(assert) { + let tag = this.schema.tags.new({ labelIds: null }); + + assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.attrs, { labelIds: null }); + }); + + test('the parent accepts saved children', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ labels: [ tagA ] }); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagB.labels.models[0], tagA); + }); + + test('the parent accepts new children', function(assert) { + let tagA = this.schema.tags.new({ color: 'Red' }); + let tagB = this.schema.tags.new({ labels: [ tagA ] }); + + assert.deepEqual(tagB.labelIds, [ undefined ]); + assert.deepEqual(tagB.labels.models[0], tagA); + }); + + test('the parent accepts null children', function(assert) { + let tag = this.schema.tags.new({ labels: null }); + + assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.attrs, { labelIds: null }); + }); + + test('the parent accepts children and child ids', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ labels: [ tagA ], labelIds: [ tagA.id ] }); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagB.labels.models[0], tagA); + }); + + test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let tag = this.schema.tags.new({}); + + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.labels.models, []); + assert.deepEqual(tag.attrs, { labelIds: null }); + }); + + test('the parent accepts no reference to children or child ids', function(assert) { + let tag = this.schema.tags.new(); + + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.labels.models, []); + assert.deepEqual(tag.attrs, { labelIds: null }); + }); } -}); - -test('the parent accepts a saved child id', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ - labelIds: [ tagA.id ] - }); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagB.labels.models[0], tagA); -}); - -test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.tags.new({ labelIds: [ 2 ] }); - }, /You're instantiating a tag that has a labelIds of 2, but some of those records don't exist in the database/); -}); - -test('the parent accepts null children foreign key', function(assert) { - let tag = this.schema.tags.new({ labelIds: null }); - - assert.equal(tag.labels.models.length, 0); - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.attrs, { labelIds: null }); -}); - -test('the parent accepts saved children', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ labels: [ tagA ] }); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagB.labels.models[0], tagA); -}); - -test('the parent accepts new children', function(assert) { - let tagA = this.schema.tags.new({ color: 'Red' }); - let tagB = this.schema.tags.new({ labels: [ tagA ] }); - - assert.deepEqual(tagB.labelIds, [ undefined ]); - assert.deepEqual(tagB.labels.models[0], tagA); -}); - -test('the parent accepts null children', function(assert) { - let tag = this.schema.tags.new({ labels: null }); - - assert.equal(tag.labels.models.length, 0); - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.attrs, { labelIds: null }); -}); - -test('the parent accepts children and child ids', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ labels: [ tagA ], labelIds: [ tagA.id ] }); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagB.labels.models[0], tagA); -}); - -test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let tag = this.schema.tags.new({}); - - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.labels.models, []); - assert.deepEqual(tag.attrs, { labelIds: null }); -}); - -test('the parent accepts no reference to children or child ids', function(assert) { - let tag = this.schema.tags.new(); - - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.labels.models, []); - assert.deepEqual(tag.attrs, { labelIds: null }); -}); +); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/accessor-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/accessor-test.js index 5e4e2ed60..85cabe47c 100644 --- a/tests/integration/orm/has-many/6-one-way-reflexive/accessor-test.js +++ b/tests/integration/orm/has-many/6-one-way-reflexive/accessor-test.js @@ -1,27 +1,30 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | One-Way Reflexive | accessor', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | One-Way Reflexive | accessor', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ tag, tags ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ tag, tags ] = this.helper[state](); - assert.equal(tag.tags.models.length, tags.length, 'the parent has the correct number of children'); - assert.equal(tag.tagIds.length, tags.length, 'the parent has the correct number of children ids'); + assert.equal(tag.tags.models.length, tags.length, 'the parent has the correct number of children'); + assert.equal(tag.tagIds.length, tags.length, 'the parent has the correct number of children ids'); - tags.forEach((t, i) => { - assert.deepEqual(tag.tags.models[i], t, 'each child is in parent.children array'); + tags.forEach((t, i) => { + assert.deepEqual(tag.tags.models[i], t, 'each child is in parent.children array'); - if (t.isSaved()) { - assert.ok(tag.tagIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); - } - }); - }); + if (t.isSaved()) { + assert.ok(tag.tagIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); + } + }); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/association-create-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/association-create-test.js index 5736f5cfc..cdada6830 100644 --- a/tests/integration/orm/has-many/6-one-way-reflexive/association-create-test.js +++ b/tests/integration/orm/has-many/6-one-way-reflexive/association-create-test.js @@ -1,29 +1,32 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | One-Way Reflexive | association #create', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | One-Way Reflexive | association #create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can create a has-many association, for all states -*/ -states.forEach((state) => { + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { - test(`a ${state} can create an associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.tags.models.length; + test(`a ${state} can create an associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.tags.models.length; - let orangeTag = tag.createTag({ name: 'Orange' }); + let orangeTag = tag.createTag({ name: 'Orange' }); - assert.ok(orangeTag.id, 'the child was persisted'); - assert.equal(tag.tags.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.tags.includes(orangeTag), 'the model was added to tag.tags'); - assert.ok(tag.tagIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); - assert.ok(tag.attrs.tagIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); - assert.notOk(orangeTag.tags.includes(tag), 'the inverse was not set'); - }); + assert.ok(orangeTag.id, 'the child was persisted'); + assert.equal(tag.tags.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.tags.includes(orangeTag), 'the model was added to tag.tags'); + assert.ok(tag.tagIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); + assert.ok(tag.attrs.tagIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); + assert.notOk(orangeTag.tags.includes(tag), 'the inverse was not set'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/association-new-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/association-new-test.js index 0e19a958a..deb786060 100644 --- a/tests/integration/orm/has-many/6-one-way-reflexive/association-new-test.js +++ b/tests/integration/orm/has-many/6-one-way-reflexive/association-new-test.js @@ -1,35 +1,38 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | One-Way Reflexive | association #new', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | One-Way Reflexive | association #new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can make a new unsaved belongs-to association, for all states -*/ + /* + The model can make a new unsaved belongs-to association, for all states + */ -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can build a new associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.tags.models.length; + test(`a ${state} can build a new associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.tags.models.length; - let blueTag = tag.newTag({ name: 'Blue' }); + let blueTag = tag.newTag({ name: 'Blue' }); - assert.ok(!blueTag.id, 'the child was not persisted'); - assert.equal(tag.tags.models.length, initialCount + 1); - assert.equal(blueTag.tags.models.length, 0, 'the inverse was not set'); + assert.ok(!blueTag.id, 'the child was not persisted'); + assert.equal(tag.tags.models.length, initialCount + 1); + assert.equal(blueTag.tags.models.length, 0, 'the inverse was not set'); - blueTag.save(); + blueTag.save(); - assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', tagIds: [ ] }, 'the child was persisted'); - assert.equal(tag.tags.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.tags.includes(blueTag), 'the model was added to tag.tags'); - assert.ok(tag.tagIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); - assert.notOk(blueTag.tags.includes(tag), 'the inverse was not set'); - }); + assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', tagIds: [ ] }, 'the child was persisted'); + assert.equal(tag.tags.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.tags.includes(blueTag), 'the model was added to tag.tags'); + assert.ok(tag.tagIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); + assert.notOk(blueTag.tags.includes(tag), 'the inverse was not set'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/association-set-ids-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/association-set-ids-test.js index 7a082e568..cbe796d4c 100644 --- a/tests/integration/orm/has-many/6-one-way-reflexive/association-set-ids-test.js +++ b/tests/integration/orm/has-many/6-one-way-reflexive/association-set-ids-test.js @@ -1,38 +1,41 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | One-Way Reflexive | association #setIds', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | One-Way Reflexive | association #setIds', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { - let [ tag ] = this.helper[state](); - let savedTag = this.helper.savedChild(); + test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { + let [ tag ] = this.helper[state](); + let savedTag = this.helper.savedChild(); - tag.tagIds = [ savedTag.id ]; + tag.tagIds = [ savedTag.id ]; - assert.deepEqual(tag.tags.models[0].attrs, savedTag.attrs); - assert.deepEqual(tag.tagIds, [ savedTag.id ]); + assert.deepEqual(tag.tags.models[0].attrs, savedTag.attrs); + assert.deepEqual(tag.tagIds, [ savedTag.id ]); - tag.save(); - savedTag.reload(); + tag.save(); + savedTag.reload(); - assert.equal(savedTag.tags.models.length, 0, 'the inverse was not set'); - }); + assert.equal(savedTag.tags.models.length, 0, 'the inverse was not set'); + }); - test(`a ${state} can clear its association via a null childIds`, function(assert) { - let [ tag ] = this.helper[state](); + test(`a ${state} can clear its association via a null childIds`, function(assert) { + let [ tag ] = this.helper[state](); - tag.tagIds = null; + tag.tagIds = null; - assert.deepEqual(tag.tags.models, []); - assert.deepEqual(tag.tagIds, []); + assert.deepEqual(tag.tags.models, []); + assert.deepEqual(tag.tagIds, []); - tag.save(); - }); + tag.save(); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/association-set-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/association-set-test.js index cc1e506ce..27a694902 100644 --- a/tests/integration/orm/has-many/6-one-way-reflexive/association-set-test.js +++ b/tests/integration/orm/has-many/6-one-way-reflexive/association-set-test.js @@ -1,63 +1,66 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | One-Way Reflexive | association #set', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | One-Way Reflexive | association #set', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parent, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ tag ] = this.helper[state](); - let savedTag = this.helper.savedChild(); + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ tag ] = this.helper[state](); + let savedTag = this.helper.savedChild(); - tag.tags = [ savedTag ]; + tag.tags = [ savedTag ]; - assert.ok(tag.tags.includes(savedTag)); - assert.equal(tag.tagIds[0], savedTag.id); - assert.notOk(savedTag.tags.includes(tag), 'the inverse was not set'); + assert.ok(tag.tags.includes(savedTag)); + assert.equal(tag.tagIds[0], savedTag.id); + assert.notOk(savedTag.tags.includes(tag), 'the inverse was not set'); - tag.save(); - }); + tag.save(); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ tag ] = this.helper[state](); - let newTag = this.helper.newChild(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ tag ] = this.helper[state](); + let newTag = this.helper.newChild(); - tag.tags = [ newTag ]; + tag.tags = [ newTag ]; - assert.ok(tag.tags.includes(newTag)); - assert.equal(tag.tagIds[0], undefined); - assert.notOk(newTag.tags.includes(tag), 'the inverse was not set'); + assert.ok(tag.tags.includes(newTag)); + assert.equal(tag.tagIds[0], undefined); + assert.notOk(newTag.tags.includes(tag), 'the inverse was not set'); - tag.save(); - }); + tag.save(); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag ] = this.helper[state](); - tag.tags = [ ]; + tag.tags = [ ]; - assert.deepEqual(tag.tagIds, [ ]); - assert.equal(tag.tags.models.length, 0); + assert.deepEqual(tag.tagIds, [ ]); + assert.equal(tag.tags.models.length, 0); - tag.save(); - }); + tag.save(); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag ] = this.helper[state](); - tag.tags = null; + tag.tags = null; - assert.deepEqual(tag.tagIds, [ ]); - assert.equal(tag.tags.models.length, 0); + assert.deepEqual(tag.tagIds, [ ]); + assert.equal(tag.tags.models.length, 0); - tag.save(); - }); + tag.save(); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/create-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/create-test.js index c93912e20..81485d6f1 100644 --- a/tests/integration/orm/has-many/6-one-way-reflexive/create-test.js +++ b/tests/integration/orm/has-many/6-one-way-reflexive/create-test.js @@ -2,91 +2,94 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | One-Way Reflexive | create', { - beforeEach() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - } -}); - -test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - tagIds: [ tagA.id ] - }); - - tagA.reload(); - - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagA.tagIds, [ ], 'the inverse was not set'); - assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ], 'the ids were persisted'); - assert.deepEqual(tagB.tags.models[0].attrs, tagA.attrs); - assert.equal(this.helper.db.tags.length, 2); - assert.deepEqual(this.helper.db.tags[0], { id: '1', tagIds: null }); - assert.deepEqual(this.helper.db.tags[1], { id: '2', tagIds: [ '1' ] }); -}); - -test('it sets up associations correctly when passing in an array of models', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - tags: [ tagA ] - }); - - tagA.reload(); - - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagA.tagIds, [ ], 'the inverse was not set'); - assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ], 'the ids were persisted'); - assert.deepEqual(tagA.attrs.tagIds, null, 'the inverse was not set'); - assert.equal(this.helper.db.tags.length, 2); -}); - -test('it sets up associations correctly when passing in a collection', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - tags: schema.tags.all() - }); - - tagA.reload(); - - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagA.tagIds, [ ], 'the inverse was not set'); - assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ]); - assert.deepEqual(tagA.attrs.tagIds, null, 'the inverse was not set'); - assert.equal(this.helper.db.tags.length, 2); -}); - -test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.tags.create({ - foo: schema.create('foo') +module( + 'Integration | ORM | Has Many | One-Way Reflexive | create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + }); + + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + tagIds: [ tagA.id ] + }); + + tagA.reload(); + + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagA.tagIds, [ ], 'the inverse was not set'); + assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ], 'the ids were persisted'); + assert.deepEqual(tagB.tags.models[0].attrs, tagA.attrs); + assert.equal(this.helper.db.tags.length, 2); + assert.deepEqual(this.helper.db.tags[0], { id: '1', tagIds: null }); + assert.deepEqual(this.helper.db.tags[1], { id: '2', tagIds: [ '1' ] }); + }); + + test('it sets up associations correctly when passing in an array of models', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + tags: [ tagA ] + }); + + tagA.reload(); + + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagA.tagIds, [ ], 'the inverse was not set'); + assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ], 'the ids were persisted'); + assert.deepEqual(tagA.attrs.tagIds, null, 'the inverse was not set'); + assert.equal(this.helper.db.tags.length, 2); }); - }, /you haven't defined that key as an association on your model/); -}); -test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it sets up associations correctly when passing in a collection', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + tags: schema.tags.all() + }); + + tagA.reload(); - assert.throws(function() { - schema.tags.create({ - foos: [ schema.create('foo') ] + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagA.tagIds, [ ], 'the inverse was not set'); + assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ]); + assert.deepEqual(tagA.attrs.tagIds, null, 'the inverse was not set'); + assert.equal(this.helper.db.tags.length, 2); }); - }, /you haven't defined that key as an association on your model/); -}); -test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.foos.create(); - schema.foos.create(); + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.tags.create({ - foos: schema.foos.all() + assert.throws(function() { + schema.tags.create({ + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); }); - }, /you haven't defined that key as an association on your model/); -}); + + test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.tags.create({ + foos: [ schema.create('foo') ] + }); + }, /you haven't defined that key as an association on your model/); + }); + + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.foos.create(); + schema.foos.create(); + + assert.throws(function() { + schema.tags.create({ + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); + } +); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/delete-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/delete-test.js index 1a8b8688a..a6e2cd2e3 100644 --- a/tests/integration/orm/has-many/6-one-way-reflexive/delete-test.js +++ b/tests/integration/orm/has-many/6-one-way-reflexive/delete-test.js @@ -1,24 +1,27 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | One-Way Reflexive | delete', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | One-Way Reflexive | delete', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ tag, tags ] = this.helper[state](); + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ tag, tags ] = this.helper[state](); - if (tags && tags.length) { - tags.forEach(t => t.destroy()); - tag.reload(); - } + if (tags && tags.length) { + tags.forEach(t => t.destroy()); + tag.reload(); + } - assert.equal(tag.tags.length, 0); - assert.equal(tag.tagIds.length, 0); - }); + assert.equal(tag.tags.length, 0); + assert.equal(tag.tagIds.length, 0); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/new-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/new-test.js index b1f7e00e4..4df044cbe 100644 --- a/tests/integration/orm/has-many/6-one-way-reflexive/new-test.js +++ b/tests/integration/orm/has-many/6-one-way-reflexive/new-test.js @@ -1,81 +1,84 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | One-Way Reflexive | new', { - beforeEach() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module( + 'Integration | ORM | Has Many | One-Way Reflexive | new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the parent accepts a saved child id', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ + tagIds: [ tagA.id ] + }); + + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagB.tags.models[0], tagA); + }); + + test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.tags.new({ tagIds: [ 2 ] }); + }, /You're instantiating a tag that has a tagIds of 2, but some of those records don't exist in the database/); + }); + + test('the parent accepts null children foreign key', function(assert) { + let tag = this.schema.tags.new({ tagIds: null }); + + assert.equal(tag.tags.models.length, 0); + assert.deepEqual(tag.tagIds, []); + assert.deepEqual(tag.attrs, { tagIds: null }); + }); + + test('the parent accepts saved children', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ tags: [ tagA ] }); + + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagB.tags.models[0], tagA); + }); + + test('the parent accepts new children', function(assert) { + let tagA = this.schema.tags.new({ color: 'Red' }); + let tagB = this.schema.tags.new({ tags: [ tagA ] }); + + assert.deepEqual(tagB.tagIds, [ undefined ]); + assert.deepEqual(tagB.tags.models[0], tagA); + }); + + test('the parent accepts null children', function(assert) { + let tag = this.schema.tags.new({ tags: null }); + + assert.equal(tag.tags.models.length, 0); + assert.deepEqual(tag.tagIds, []); + assert.deepEqual(tag.attrs, { tagIds: null }); + }); + + test('the parent accepts children and child ids', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ tags: [ tagA ], tagIds: [ tagA.id ] }); + + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagB.tags.models[0], tagA); + }); + + test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let tag = this.schema.tags.new({}); + + assert.deepEqual(tag.tagIds, []); + assert.deepEqual(tag.tags.models, []); + assert.deepEqual(tag.attrs, { tagIds: null }); + }); + + test('the parent accepts no reference to children or child ids', function(assert) { + let tag = this.schema.tags.new(); + + assert.deepEqual(tag.tagIds, []); + assert.deepEqual(tag.tags.models, []); + assert.deepEqual(tag.attrs, { tagIds: null }); + }); } -}); - -test('the parent accepts a saved child id', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ - tagIds: [ tagA.id ] - }); - - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagB.tags.models[0], tagA); -}); - -test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.tags.new({ tagIds: [ 2 ] }); - }, /You're instantiating a tag that has a tagIds of 2, but some of those records don't exist in the database/); -}); - -test('the parent accepts null children foreign key', function(assert) { - let tag = this.schema.tags.new({ tagIds: null }); - - assert.equal(tag.tags.models.length, 0); - assert.deepEqual(tag.tagIds, []); - assert.deepEqual(tag.attrs, { tagIds: null }); -}); - -test('the parent accepts saved children', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ tags: [ tagA ] }); - - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagB.tags.models[0], tagA); -}); - -test('the parent accepts new children', function(assert) { - let tagA = this.schema.tags.new({ color: 'Red' }); - let tagB = this.schema.tags.new({ tags: [ tagA ] }); - - assert.deepEqual(tagB.tagIds, [ undefined ]); - assert.deepEqual(tagB.tags.models[0], tagA); -}); - -test('the parent accepts null children', function(assert) { - let tag = this.schema.tags.new({ tags: null }); - - assert.equal(tag.tags.models.length, 0); - assert.deepEqual(tag.tagIds, []); - assert.deepEqual(tag.attrs, { tagIds: null }); -}); - -test('the parent accepts children and child ids', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ tags: [ tagA ], tagIds: [ tagA.id ] }); - - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagB.tags.models[0], tagA); -}); - -test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let tag = this.schema.tags.new({}); - - assert.deepEqual(tag.tagIds, []); - assert.deepEqual(tag.tags.models, []); - assert.deepEqual(tag.attrs, { tagIds: null }); -}); - -test('the parent accepts no reference to children or child ids', function(assert) { - let tag = this.schema.tags.new(); - - assert.deepEqual(tag.tagIds, []); - assert.deepEqual(tag.tags.models, []); - assert.deepEqual(tag.attrs, { tagIds: null }); -}); +); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/accessor-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/accessor-test.js index d13fb51d4..81eae07ea 100644 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/accessor-test.js +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/accessor-test.js @@ -1,27 +1,30 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named One-Way Reflexive | accessor', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Named One-Way Reflexive | accessor', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ tag, tags ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ tag, tags ] = this.helper[state](); - assert.equal(tag.labels.models.length, tags.length, 'the parent has the correct number of children'); - assert.equal(tag.labelIds.length, tags.length, 'the parent has the correct number of children ids'); + assert.equal(tag.labels.models.length, tags.length, 'the parent has the correct number of children'); + assert.equal(tag.labelIds.length, tags.length, 'the parent has the correct number of children ids'); - tags.forEach((t, i) => { - assert.deepEqual(tag.labels.models[i], t, 'each child is in parent.children array'); + tags.forEach((t, i) => { + assert.deepEqual(tag.labels.models[i], t, 'each child is in parent.children array'); - if (t.isSaved()) { - assert.ok(tag.labelIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); - } - }); - }); + if (t.isSaved()) { + assert.ok(tag.labelIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); + } + }); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-create-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-create-test.js index 83d0bd771..3e3e0af44 100644 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-create-test.js +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-create-test.js @@ -1,29 +1,32 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named One-Way Reflexive | association #create', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Named One-Way Reflexive | association #create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can create a has-many association, for all states -*/ -states.forEach((state) => { + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { - test(`a ${state} can create an associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.labels.models.length; + test(`a ${state} can create an associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.labels.models.length; - let orangeTag = tag.createLabel({ name: 'Orange' }); + let orangeTag = tag.createLabel({ name: 'Orange' }); - assert.ok(orangeTag.id, 'the child was persisted'); - assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.labels.includes(orangeTag), 'the model was added to tag.labels'); - assert.ok(tag.labelIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); - assert.ok(tag.attrs.labelIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); - assert.notOk(orangeTag.labels.includes(tag), 'the inverse was not set'); - }); + assert.ok(orangeTag.id, 'the child was persisted'); + assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.labels.includes(orangeTag), 'the model was added to tag.labels'); + assert.ok(tag.labelIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); + assert.ok(tag.attrs.labelIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); + assert.notOk(orangeTag.labels.includes(tag), 'the inverse was not set'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-new-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-new-test.js index 2f4038d04..990fe9f4e 100644 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-new-test.js +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-new-test.js @@ -1,35 +1,38 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named One-Way Reflexive | association #new', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Named One-Way Reflexive | association #new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can make a new unsaved belongs-to association, for all states -*/ + /* + The model can make a new unsaved belongs-to association, for all states + */ -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can build a new associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.labels.models.length; + test(`a ${state} can build a new associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.labels.models.length; - let blueTag = tag.newLabel({ name: 'Blue' }); + let blueTag = tag.newLabel({ name: 'Blue' }); - assert.ok(!blueTag.id, 'the child was not persisted'); - assert.equal(tag.labels.models.length, initialCount + 1); - assert.equal(blueTag.labels.models.length, 0, 'the inverse was not set'); + assert.ok(!blueTag.id, 'the child was not persisted'); + assert.equal(tag.labels.models.length, initialCount + 1); + assert.equal(blueTag.labels.models.length, 0, 'the inverse was not set'); - blueTag.save(); + blueTag.save(); - assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', labelIds: [ ] }, 'the child was persisted'); - assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.labels.includes(blueTag), 'the model was added to tag.labels'); - assert.ok(tag.labelIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); - assert.notOk(blueTag.labels.includes(tag), 'the inverse was not set'); - }); + assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', labelIds: [ ] }, 'the child was persisted'); + assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.labels.includes(blueTag), 'the model was added to tag.labels'); + assert.ok(tag.labelIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); + assert.notOk(blueTag.labels.includes(tag), 'the inverse was not set'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-ids-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-ids-test.js index ee6a8066c..6fbd71fae 100644 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-ids-test.js +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-ids-test.js @@ -1,38 +1,41 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named One-Way Reflexive | association #setIds', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Named One-Way Reflexive | association #setIds', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { - let [ tag ] = this.helper[state](); - let savedTag = this.helper.savedChild(); + test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { + let [ tag ] = this.helper[state](); + let savedTag = this.helper.savedChild(); - tag.labelIds = [ savedTag.id ]; + tag.labelIds = [ savedTag.id ]; - assert.deepEqual(tag.labels.models[0].attrs, savedTag.attrs); - assert.deepEqual(tag.labelIds, [ savedTag.id ]); + assert.deepEqual(tag.labels.models[0].attrs, savedTag.attrs); + assert.deepEqual(tag.labelIds, [ savedTag.id ]); - tag.save(); - savedTag.reload(); + tag.save(); + savedTag.reload(); - assert.equal(savedTag.labels.models.length, 0, 'the inverse was not set'); - }); + assert.equal(savedTag.labels.models.length, 0, 'the inverse was not set'); + }); - test(`a ${state} can clear its association via a null childIds`, function(assert) { - let [ tag ] = this.helper[state](); + test(`a ${state} can clear its association via a null childIds`, function(assert) { + let [ tag ] = this.helper[state](); - tag.labelIds = null; + tag.labelIds = null; - assert.deepEqual(tag.labels.models, []); - assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.labels.models, []); + assert.deepEqual(tag.labelIds, []); - tag.save(); - }); + tag.save(); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-test.js index 4696bc010..807073112 100644 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-test.js +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-test.js @@ -1,63 +1,66 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named One-Way Reflexive | association #set', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Named One-Way Reflexive | association #set', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parent, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ tag ] = this.helper[state](); - let savedTag = this.helper.savedChild(); + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ tag ] = this.helper[state](); + let savedTag = this.helper.savedChild(); - tag.labels = [ savedTag ]; + tag.labels = [ savedTag ]; - assert.ok(tag.labels.includes(savedTag)); - assert.equal(tag.labelIds[0], savedTag.id); - assert.notOk(savedTag.labels.includes(tag), 'the inverse was not set'); + assert.ok(tag.labels.includes(savedTag)); + assert.equal(tag.labelIds[0], savedTag.id); + assert.notOk(savedTag.labels.includes(tag), 'the inverse was not set'); - tag.save(); - }); + tag.save(); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ tag ] = this.helper[state](); - let newTag = this.helper.newChild(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ tag ] = this.helper[state](); + let newTag = this.helper.newChild(); - tag.labels = [ newTag ]; + tag.labels = [ newTag ]; - assert.ok(tag.labels.includes(newTag)); - assert.equal(tag.labelIds[0], undefined); - assert.notOk(newTag.labels.includes(tag), 'the inverse was not set'); + assert.ok(tag.labels.includes(newTag)); + assert.equal(tag.labelIds[0], undefined); + assert.notOk(newTag.labels.includes(tag), 'the inverse was not set'); - tag.save(); - }); + tag.save(); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag ] = this.helper[state](); - tag.labels = [ ]; + tag.labels = [ ]; - assert.deepEqual(tag.labelIds, [ ]); - assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, [ ]); + assert.equal(tag.labels.models.length, 0); - tag.save(); - }); + tag.save(); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag ] = this.helper[state](); - tag.labels = null; + tag.labels = null; - assert.deepEqual(tag.labelIds, [ ]); - assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, [ ]); + assert.equal(tag.labels.models.length, 0); - tag.save(); - }); + tag.save(); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/create-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/create-test.js index 80c60c09e..f9e5c919b 100644 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/create-test.js +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/create-test.js @@ -2,91 +2,94 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named One-Way Reflexive | create', { - beforeEach() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - } -}); - -test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labelIds: [ tagA.id ] - }); - - tagA.reload(); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.labelIds, [ ], 'the inverse was not set'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the ids were persisted'); - assert.deepEqual(tagB.labels.models[0].attrs, tagA.attrs); - assert.equal(this.helper.db.tags.length, 2); - assert.deepEqual(this.helper.db.tags[0], { id: '1', labelIds: null }); - assert.deepEqual(this.helper.db.tags[1], { id: '2', labelIds: [ '1' ] }); -}); - -test('it sets up associations correctly when passing in an array of models', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labels: [ tagA ] - }); - - tagA.reload(); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.labelIds, [ ], 'the inverse was not set'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the ids were persisted'); - assert.deepEqual(tagA.attrs.labelIds, null, 'the inverse was not set'); - assert.equal(this.helper.db.tags.length, 2); -}); - -test('it sets up associations correctly when passing in a collection', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labels: schema.tags.all() - }); - - tagA.reload(); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.labelIds, [ ], 'the inverse was not set'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.attrs.labelIds, null, 'the inverse was not set'); - assert.equal(this.helper.db.tags.length, 2); -}); - -test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.tags.create({ - foo: schema.create('foo') +module( + 'Integration | ORM | Has Many | Named One-Way Reflexive | create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + }); + + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labelIds: [ tagA.id ] + }); + + tagA.reload(); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.labelIds, [ ], 'the inverse was not set'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the ids were persisted'); + assert.deepEqual(tagB.labels.models[0].attrs, tagA.attrs); + assert.equal(this.helper.db.tags.length, 2); + assert.deepEqual(this.helper.db.tags[0], { id: '1', labelIds: null }); + assert.deepEqual(this.helper.db.tags[1], { id: '2', labelIds: [ '1' ] }); + }); + + test('it sets up associations correctly when passing in an array of models', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labels: [ tagA ] + }); + + tagA.reload(); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.labelIds, [ ], 'the inverse was not set'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the ids were persisted'); + assert.deepEqual(tagA.attrs.labelIds, null, 'the inverse was not set'); + assert.equal(this.helper.db.tags.length, 2); }); - }, /you haven't defined that key as an association on your model/); -}); -test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it sets up associations correctly when passing in a collection', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labels: schema.tags.all() + }); + + tagA.reload(); - assert.throws(function() { - schema.tags.create({ - foos: [ schema.create('foo') ] + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.labelIds, [ ], 'the inverse was not set'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.attrs.labelIds, null, 'the inverse was not set'); + assert.equal(this.helper.db.tags.length, 2); }); - }, /you haven't defined that key as an association on your model/); -}); -test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.foos.create(); - schema.foos.create(); + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.tags.create({ - foos: schema.foos.all() + assert.throws(function() { + schema.tags.create({ + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); }); - }, /you haven't defined that key as an association on your model/); -}); + + test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.tags.create({ + foos: [ schema.create('foo') ] + }); + }, /you haven't defined that key as an association on your model/); + }); + + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.foos.create(); + schema.foos.create(); + + assert.throws(function() { + schema.tags.create({ + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); + } +); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/delete-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/delete-test.js index 7de08e295..0b434b5e2 100644 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/delete-test.js +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/delete-test.js @@ -1,24 +1,27 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named One-Way Reflexive | delete', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Named One-Way Reflexive | delete', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ tag, labels ] = this.helper[state](); + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ tag, labels ] = this.helper[state](); - if (labels && labels.length) { - labels.forEach(t => t.destroy()); - tag.reload(); - } + if (labels && labels.length) { + labels.forEach(t => t.destroy()); + tag.reload(); + } - assert.equal(tag.labels.length, 0); - assert.equal(tag.labelIds.length, 0); - }); + assert.equal(tag.labels.length, 0); + assert.equal(tag.labelIds.length, 0); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/new-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/new-test.js index 6c111cdc0..473583204 100644 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/new-test.js +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/new-test.js @@ -1,81 +1,84 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Named One-Way Reflexive | new', { - beforeEach() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module( + 'Integration | ORM | Has Many | Named One-Way Reflexive | new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the parent accepts a saved child id', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ + labelIds: [ tagA.id ] + }); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagB.labels.models[0], tagA); + }); + + test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.tags.new({ labelIds: [ 2 ] }); + }, /You're instantiating a tag that has a labelIds of 2, but some of those records don't exist in the database/); + }); + + test('the parent accepts null children foreign key', function(assert) { + let tag = this.schema.tags.new({ labelIds: null }); + + assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.attrs, { labelIds: null }); + }); + + test('the parent accepts saved children', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ labels: [ tagA ] }); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagB.labels.models[0], tagA); + }); + + test('the parent accepts new children', function(assert) { + let tagA = this.schema.tags.new({ color: 'Red' }); + let tagB = this.schema.tags.new({ labels: [ tagA ] }); + + assert.deepEqual(tagB.labelIds, [ undefined ]); + assert.deepEqual(tagB.labels.models[0], tagA); + }); + + test('the parent accepts null children', function(assert) { + let tag = this.schema.tags.new({ labels: null }); + + assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.attrs, { labelIds: null }); + }); + + test('the parent accepts children and child ids', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ labels: [ tagA ], labelIds: [ tagA.id ] }); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagB.labels.models[0], tagA); + }); + + test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let tag = this.schema.tags.new({}); + + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.labels.models, []); + assert.deepEqual(tag.attrs, { labelIds: null }); + }); + + test('the parent accepts no reference to children or child ids', function(assert) { + let tag = this.schema.tags.new(); + + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.labels.models, []); + assert.deepEqual(tag.attrs, { labelIds: null }); + }); } -}); - -test('the parent accepts a saved child id', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ - labelIds: [ tagA.id ] - }); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagB.labels.models[0], tagA); -}); - -test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.tags.new({ labelIds: [ 2 ] }); - }, /You're instantiating a tag that has a labelIds of 2, but some of those records don't exist in the database/); -}); - -test('the parent accepts null children foreign key', function(assert) { - let tag = this.schema.tags.new({ labelIds: null }); - - assert.equal(tag.labels.models.length, 0); - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.attrs, { labelIds: null }); -}); - -test('the parent accepts saved children', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ labels: [ tagA ] }); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagB.labels.models[0], tagA); -}); - -test('the parent accepts new children', function(assert) { - let tagA = this.schema.tags.new({ color: 'Red' }); - let tagB = this.schema.tags.new({ labels: [ tagA ] }); - - assert.deepEqual(tagB.labelIds, [ undefined ]); - assert.deepEqual(tagB.labels.models[0], tagA); -}); - -test('the parent accepts null children', function(assert) { - let tag = this.schema.tags.new({ labels: null }); - - assert.equal(tag.labels.models.length, 0); - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.attrs, { labelIds: null }); -}); - -test('the parent accepts children and child ids', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ labels: [ tagA ], labelIds: [ tagA.id ] }); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagB.labels.models[0], tagA); -}); - -test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let tag = this.schema.tags.new({}); - - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.labels.models, []); - assert.deepEqual(tag.attrs, { labelIds: null }); -}); - -test('the parent accepts no reference to children or child ids', function(assert) { - let tag = this.schema.tags.new(); - - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.labels.models, []); - assert.deepEqual(tag.attrs, { labelIds: null }); -}); +); diff --git a/tests/integration/orm/has-many/8-many-to-many/accessor-test.js b/tests/integration/orm/has-many/8-many-to-many/accessor-test.js index 1ed3a728b..b40de1b10 100644 --- a/tests/integration/orm/has-many/8-many-to-many/accessor-test.js +++ b/tests/integration/orm/has-many/8-many-to-many/accessor-test.js @@ -1,30 +1,33 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Many to Many | accessor', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Many to Many | accessor', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ order, products ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ order, products ] = this.helper[state](); - assert.equal(order.products.models.length, products.length, 'the parent has the correct number of children'); - assert.equal(order.productIds.length, products.length, 'the parent has the correct number of children ids'); + assert.equal(order.products.models.length, products.length, 'the parent has the correct number of children'); + assert.equal(order.productIds.length, products.length, 'the parent has the correct number of children ids'); - products.forEach((p, i) => { - assert.deepEqual(order.products.models[i], p, 'each child is in parent.children array'); + products.forEach((p, i) => { + assert.deepEqual(order.products.models[i], p, 'each child is in parent.children array'); - if (p.isSaved()) { - assert.ok(order.productIds.indexOf(p.id) > -1, 'each saved child id is in parent.childrenIds array'); - } + if (p.isSaved()) { + assert.ok(order.productIds.indexOf(p.id) > -1, 'each saved child id is in parent.childrenIds array'); + } - // Check the inverse - assert.ok(p.orders.includes(order)); - }); - }); + // Check the inverse + assert.ok(p.orders.includes(order)); + }); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/8-many-to-many/association-create-test.js b/tests/integration/orm/has-many/8-many-to-many/association-create-test.js index cce6f9a6c..6d06568cb 100644 --- a/tests/integration/orm/has-many/8-many-to-many/association-create-test.js +++ b/tests/integration/orm/has-many/8-many-to-many/association-create-test.js @@ -1,29 +1,32 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Many to Many | association #create', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Many to Many | association #create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can create a has-many association, for all states -*/ -states.forEach((state) => { + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { - test(`a ${state} can create an associated child`, function(assert) { - let [ order ] = this.helper[state](); - let initialCount = order.products.models.length; + test(`a ${state} can create an associated child`, function(assert) { + let [ order ] = this.helper[state](); + let initialCount = order.products.models.length; - let orangeProduct = order.createProduct({ name: 'Orange' }); + let orangeProduct = order.createProduct({ name: 'Orange' }); - assert.ok(orangeProduct.id, 'the child was persisted'); - assert.equal(order.products.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(order.products.includes(orangeProduct), 'the model was added to order.products'); - assert.ok(order.productIds.indexOf(orangeProduct.id) > -1, 'the id was added to the fks array'); - assert.ok(order.attrs.productIds.indexOf(orangeProduct.id) > -1, 'fks were persisted'); - assert.ok(orangeProduct.orders.includes(order), 'the inverse was set'); - }); + assert.ok(orangeProduct.id, 'the child was persisted'); + assert.equal(order.products.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(order.products.includes(orangeProduct), 'the model was added to order.products'); + assert.ok(order.productIds.indexOf(orangeProduct.id) > -1, 'the id was added to the fks array'); + assert.ok(order.attrs.productIds.indexOf(orangeProduct.id) > -1, 'fks were persisted'); + assert.ok(orangeProduct.orders.includes(order), 'the inverse was set'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/8-many-to-many/association-new-test.js b/tests/integration/orm/has-many/8-many-to-many/association-new-test.js index 2a000ea64..fbf971d51 100644 --- a/tests/integration/orm/has-many/8-many-to-many/association-new-test.js +++ b/tests/integration/orm/has-many/8-many-to-many/association-new-test.js @@ -1,35 +1,38 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Many to Many | association #new', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Many to Many | association #new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can make a new unsaved belongs-to association, for all states -*/ + /* + The model can make a new unsaved belongs-to association, for all states + */ -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can build a new associated child`, function(assert) { - let [ order ] = this.helper[state](); - let initialCount = order.products.models.length; + test(`a ${state} can build a new associated child`, function(assert) { + let [ order ] = this.helper[state](); + let initialCount = order.products.models.length; - let blueProduct = order.newProduct({ name: 'Blue' }); + let blueProduct = order.newProduct({ name: 'Blue' }); - assert.ok(!blueProduct.id, 'the child was not persisted'); - assert.equal(order.products.models.length, initialCount + 1); - assert.equal(blueProduct.orders.models.length, 1, 'the inverse was set'); + assert.ok(!blueProduct.id, 'the child was not persisted'); + assert.equal(order.products.models.length, initialCount + 1); + assert.equal(blueProduct.orders.models.length, 1, 'the inverse was set'); - blueProduct.save(); + blueProduct.save(); - assert.deepEqual(blueProduct.attrs, { id: blueProduct.id, name: 'Blue', orderIds: [ order.id ] }, 'the child was persisted'); - assert.equal(order.products.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(order.products.includes(blueProduct), 'the model was added to order.products'); - assert.ok(order.productIds.indexOf(blueProduct.id) > -1, 'the id was added to the fks array'); - assert.ok(blueProduct.orders.includes(order), 'the inverse was set'); - }); + assert.deepEqual(blueProduct.attrs, { id: blueProduct.id, name: 'Blue', orderIds: [ order.id ] }, 'the child was persisted'); + assert.equal(order.products.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(order.products.includes(blueProduct), 'the model was added to order.products'); + assert.ok(order.productIds.indexOf(blueProduct.id) > -1, 'the id was added to the fks array'); + assert.ok(blueProduct.orders.includes(order), 'the inverse was set'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/8-many-to-many/association-set-ids-test.js b/tests/integration/orm/has-many/8-many-to-many/association-set-ids-test.js index 44202a771..97b00cc18 100644 --- a/tests/integration/orm/has-many/8-many-to-many/association-set-ids-test.js +++ b/tests/integration/orm/has-many/8-many-to-many/association-set-ids-test.js @@ -1,49 +1,52 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Many to Many | association #setIds', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Many to Many | association #setIds', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { - let [ order, originalProducts ] = this.helper[state](); - let savedProduct = this.helper.savedChild(); + test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { + let [ order, originalProducts ] = this.helper[state](); + let savedProduct = this.helper.savedChild(); - order.productIds = [ savedProduct.id ]; + order.productIds = [ savedProduct.id ]; - assert.deepEqual(order.products.models[0].attrs, savedProduct.attrs); - assert.deepEqual(order.productIds, [ savedProduct.id ]); + assert.deepEqual(order.products.models[0].attrs, savedProduct.attrs); + assert.deepEqual(order.productIds, [ savedProduct.id ]); - order.save(); - savedProduct.reload(); + order.save(); + savedProduct.reload(); - assert.deepEqual(savedProduct.orders.models[0].attrs, order.attrs, 'the inverse was set'); - originalProducts.forEach(p => { - if (p.isSaved()) { - p.reload(); - assert.notOk(p.orders.includes(order), 'old inverses were cleared'); - } - }); - }); + assert.deepEqual(savedProduct.orders.models[0].attrs, order.attrs, 'the inverse was set'); + originalProducts.forEach(p => { + if (p.isSaved()) { + p.reload(); + assert.notOk(p.orders.includes(order), 'old inverses were cleared'); + } + }); + }); - test(`a ${state} can clear its association via a null childIds`, function(assert) { - let [ order, originalProducts ] = this.helper[state](); + test(`a ${state} can clear its association via a null childIds`, function(assert) { + let [ order, originalProducts ] = this.helper[state](); - order.productIds = null; + order.productIds = null; - assert.deepEqual(order.products.models, []); - assert.deepEqual(order.productIds, []); + assert.deepEqual(order.products.models, []); + assert.deepEqual(order.productIds, []); - order.save(); + order.save(); - originalProducts.forEach(p => { - p.reload(); - assert.notOk(p.orders.includes(order), 'old inverses were cleared'); - }); - }); + originalProducts.forEach(p => { + p.reload(); + assert.notOk(p.orders.includes(order), 'old inverses were cleared'); + }); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/8-many-to-many/association-set-test.js b/tests/integration/orm/has-many/8-many-to-many/association-set-test.js index 51d00c58c..8a8b8340b 100644 --- a/tests/integration/orm/has-many/8-many-to-many/association-set-test.js +++ b/tests/integration/orm/has-many/8-many-to-many/association-set-test.js @@ -1,82 +1,85 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Many to Many | association #set', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | Many to Many | association #set', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parent, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ order, originalProducts ] = this.helper[state](); - let savedProduct = this.helper.savedChild(); + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ order, originalProducts ] = this.helper[state](); + let savedProduct = this.helper.savedChild(); - order.products = [ savedProduct ]; + order.products = [ savedProduct ]; - assert.ok(order.products.includes(savedProduct)); - assert.equal(order.productIds[0], savedProduct.id); - assert.ok(savedProduct.orders.includes(order), 'the inverse was set'); + assert.ok(order.products.includes(savedProduct)); + assert.equal(order.productIds[0], savedProduct.id); + assert.ok(savedProduct.orders.includes(order), 'the inverse was set'); - order.save(); + order.save(); - originalProducts.forEach(p => { - p.reload(); - assert.notOk(p.orders.includes(order), 'old inverses were cleared'); - }); - }); + originalProducts.forEach(p => { + p.reload(); + assert.notOk(p.orders.includes(order), 'old inverses were cleared'); + }); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ order, originalProducts ] = this.helper[state](); - let newProduct = this.helper.newChild(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ order, originalProducts ] = this.helper[state](); + let newProduct = this.helper.newChild(); - order.products = [ newProduct ]; + order.products = [ newProduct ]; - assert.ok(order.products.includes(newProduct)); - assert.equal(order.productIds[0], undefined); - assert.ok(newProduct.orders.includes(order), 'the inverse was set'); + assert.ok(order.products.includes(newProduct)); + assert.equal(order.productIds[0], undefined); + assert.ok(newProduct.orders.includes(order), 'the inverse was set'); - order.save(); + order.save(); - originalProducts.forEach(p => { - p.reload(); - assert.notOk(p.orders.includes(order), 'old inverses were cleared'); - }); - }); + originalProducts.forEach(p => { + p.reload(); + assert.notOk(p.orders.includes(order), 'old inverses were cleared'); + }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ order, originalProducts ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ order, originalProducts ] = this.helper[state](); - order.products = [ ]; + order.products = [ ]; - assert.deepEqual(order.productIds, [ ]); - assert.equal(order.products.models.length, 0); + assert.deepEqual(order.productIds, [ ]); + assert.equal(order.products.models.length, 0); - order.save(); - originalProducts.forEach(p => { - p.reload(); - assert.notOk(p.orders.includes(order), 'old inverses were cleared'); - }); - }); + order.save(); + originalProducts.forEach(p => { + p.reload(); + assert.notOk(p.orders.includes(order), 'old inverses were cleared'); + }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ order, originalProducts ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ order, originalProducts ] = this.helper[state](); - order.products = null; + order.products = null; - assert.deepEqual(order.productIds, [ ]); - assert.equal(order.products.models.length, 0); + assert.deepEqual(order.productIds, [ ]); + assert.equal(order.products.models.length, 0); - order.save(); + order.save(); - originalProducts.forEach(p => { - p.reload(); - assert.notOk(p.orders.includes(order), 'old inverses were cleared'); - }); - }); + originalProducts.forEach(p => { + p.reload(); + assert.notOk(p.orders.includes(order), 'old inverses were cleared'); + }); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/8-many-to-many/create-test.js b/tests/integration/orm/has-many/8-many-to-many/create-test.js index 0121ba5ee..1fbf55f09 100644 --- a/tests/integration/orm/has-many/8-many-to-many/create-test.js +++ b/tests/integration/orm/has-many/8-many-to-many/create-test.js @@ -2,96 +2,96 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Many to Many | create', { - beforeEach() { +module('Integration | ORM | Has Many | Many to Many | create', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); this.helper.schema.registerModel('foo', Model); - } -}); - -test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let product = schema.products.create(); - let order = schema.orders.create({ - productIds: [ product.id ] }); - product.reload(); - - assert.deepEqual(order.productIds, [ product.id ]); - assert.deepEqual(product.orderIds, [ order.id ], 'the inverse was set'); - assert.deepEqual(order.attrs.productIds, [ product.id ], 'the ids were persisted'); - assert.deepEqual(product.attrs.orderIds, [ order.id ], 'the inverse ids were persisted'); - assert.deepEqual(order.products.models[0].attrs, product.attrs); - assert.deepEqual(product.orders.models[0].attrs, order.attrs, 'the inverse was set'); - assert.equal(this.helper.db.orders.length, 1); - assert.equal(this.helper.db.products.length, 1); - assert.deepEqual(this.helper.db.orders[0], { id: '1', productIds: [ '1' ] }); - assert.deepEqual(this.helper.db.products[0], { id: '1', orderIds: [ '1' ] }); -}); + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let product = schema.products.create(); + let order = schema.orders.create({ + productIds: [ product.id ] + }); -test('it sets up associations correctly when passing in an array of models', function(assert) { - let { schema } = this.helper; - let product = schema.products.create(); - let order = schema.orders.create({ - products: [ product ] + product.reload(); + + assert.deepEqual(order.productIds, [ product.id ]); + assert.deepEqual(product.orderIds, [ order.id ], 'the inverse was set'); + assert.deepEqual(order.attrs.productIds, [ product.id ], 'the ids were persisted'); + assert.deepEqual(product.attrs.orderIds, [ order.id ], 'the inverse ids were persisted'); + assert.deepEqual(order.products.models[0].attrs, product.attrs); + assert.deepEqual(product.orders.models[0].attrs, order.attrs, 'the inverse was set'); + assert.equal(this.helper.db.orders.length, 1); + assert.equal(this.helper.db.products.length, 1); + assert.deepEqual(this.helper.db.orders[0], { id: '1', productIds: [ '1' ] }); + assert.deepEqual(this.helper.db.products[0], { id: '1', orderIds: [ '1' ] }); }); - product.reload(); + test('it sets up associations correctly when passing in an array of models', function(assert) { + let { schema } = this.helper; + let product = schema.products.create(); + let order = schema.orders.create({ + products: [ product ] + }); - assert.deepEqual(order.productIds, [ product.id ]); - assert.deepEqual(product.orderIds, [ order.id ], 'the inverse was set'); - assert.deepEqual(order.attrs.productIds, [ product.id ], 'the ids were persisted'); - assert.deepEqual(product.attrs.orderIds, [ order.id ], 'the inverse was set'); - assert.equal(this.helper.db.orders.length, 1); - assert.equal(this.helper.db.products.length, 1); -}); + product.reload(); -test('it sets up associations correctly when passing in a collection', function(assert) { - let { schema } = this.helper; - let product = schema.products.create(); - let order = schema.orders.create({ - products: schema.products.all() + assert.deepEqual(order.productIds, [ product.id ]); + assert.deepEqual(product.orderIds, [ order.id ], 'the inverse was set'); + assert.deepEqual(order.attrs.productIds, [ product.id ], 'the ids were persisted'); + assert.deepEqual(product.attrs.orderIds, [ order.id ], 'the inverse was set'); + assert.equal(this.helper.db.orders.length, 1); + assert.equal(this.helper.db.products.length, 1); }); - product.reload(); + test('it sets up associations correctly when passing in a collection', function(assert) { + let { schema } = this.helper; + let product = schema.products.create(); + let order = schema.orders.create({ + products: schema.products.all() + }); + + product.reload(); - assert.deepEqual(order.productIds, [ product.id ]); - assert.deepEqual(product.orderIds, [ order.id ], 'the inverse was set'); - assert.deepEqual(order.attrs.productIds, [ product.id ]); - assert.deepEqual(product.attrs.orderIds, [ order.id ], 'the inverse was set'); - assert.equal(this.helper.db.orders.length, 1); - assert.equal(this.helper.db.products.length, 1); -}); + assert.deepEqual(order.productIds, [ product.id ]); + assert.deepEqual(product.orderIds, [ order.id ], 'the inverse was set'); + assert.deepEqual(order.attrs.productIds, [ product.id ]); + assert.deepEqual(product.attrs.orderIds, [ order.id ], 'the inverse was set'); + assert.equal(this.helper.db.orders.length, 1); + assert.equal(this.helper.db.products.length, 1); + }); -test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.orders.create({ - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); -}); + assert.throws(function() { + schema.orders.create({ + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); + }); -test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.orders.create({ - foos: [ schema.create('foo') ] - }); - }, /you haven't defined that key as an association on your model/); -}); + assert.throws(function() { + schema.orders.create({ + foos: [ schema.create('foo') ] + }); + }, /you haven't defined that key as an association on your model/); + }); -test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.foos.create(); - schema.foos.create(); + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.foos.create(); + schema.foos.create(); - assert.throws(function() { - schema.orders.create({ - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); + assert.throws(function() { + schema.orders.create({ + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); }); diff --git a/tests/integration/orm/has-many/8-many-to-many/delete-test.js b/tests/integration/orm/has-many/8-many-to-many/delete-test.js index 7545b080e..463c27125 100644 --- a/tests/integration/orm/has-many/8-many-to-many/delete-test.js +++ b/tests/integration/orm/has-many/8-many-to-many/delete-test.js @@ -1,24 +1,24 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Many to Many | delete', { - beforeEach() { +module('Integration | ORM | Has Many | Many to Many | delete', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); - } -}); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ order, products ] = this.helper[state](); + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ order, products ] = this.helper[state](); - if (products && products.length) { - products.forEach(t => t.destroy()); - order.reload(); - } + if (products && products.length) { + products.forEach(t => t.destroy()); + order.reload(); + } - assert.equal(order.products.length, 0); - assert.equal(order.productIds.length, 0); - }); + assert.equal(order.products.length, 0); + assert.equal(order.productIds.length, 0); + }); + }); }); diff --git a/tests/integration/orm/has-many/8-many-to-many/new-test.js b/tests/integration/orm/has-many/8-many-to-many/new-test.js index d099ba357..2cd917fe8 100644 --- a/tests/integration/orm/has-many/8-many-to-many/new-test.js +++ b/tests/integration/orm/has-many/8-many-to-many/new-test.js @@ -1,81 +1,81 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | Many to Many | new', { - beforeEach() { +module('Integration | ORM | Has Many | Many to Many | new', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); this.schema = this.helper.schema; - } -}); - -test('the parent accepts a saved child id', function(assert) { - let product = this.helper.savedChild(); - let order = this.schema.orders.new({ - productIds: [ product.id ] }); - assert.deepEqual(order.productIds, [ product.id ]); - assert.deepEqual(order.products.models[0], product); -}); + test('the parent accepts a saved child id', function(assert) { + let product = this.helper.savedChild(); + let order = this.schema.orders.new({ + productIds: [ product.id ] + }); -test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.orders.new({ productIds: [ 2 ] }); - }, /You're instantiating a order that has a productIds of 2, but some of those records don't exist in the database/); -}); + assert.deepEqual(order.productIds, [ product.id ]); + assert.deepEqual(order.products.models[0], product); + }); -test('the parent accepts null children foreign key', function(assert) { - let order = this.schema.orders.new({ productIds: null }); + test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.orders.new({ productIds: [ 2 ] }); + }, /You're instantiating a order that has a productIds of 2, but some of those records don't exist in the database/); + }); - assert.equal(order.products.models.length, 0); - assert.deepEqual(order.productIds, []); - assert.deepEqual(order.attrs, { productIds: null }); -}); + test('the parent accepts null children foreign key', function(assert) { + let order = this.schema.orders.new({ productIds: null }); -test('the parent accepts saved children', function(assert) { - let product = this.helper.savedChild(); - let order = this.schema.orders.new({ products: [ product ] }); + assert.equal(order.products.models.length, 0); + assert.deepEqual(order.productIds, []); + assert.deepEqual(order.attrs, { productIds: null }); + }); - assert.deepEqual(order.productIds, [ product.id ]); - assert.deepEqual(order.products.models[0], product); -}); + test('the parent accepts saved children', function(assert) { + let product = this.helper.savedChild(); + let order = this.schema.orders.new({ products: [ product ] }); + + assert.deepEqual(order.productIds, [ product.id ]); + assert.deepEqual(order.products.models[0], product); + }); -test('the parent accepts new children', function(assert) { - let product = this.schema.products.new({ color: 'Red' }); - let order = this.schema.orders.new({ products: [ product ] }); + test('the parent accepts new children', function(assert) { + let product = this.schema.products.new({ color: 'Red' }); + let order = this.schema.orders.new({ products: [ product ] }); - assert.deepEqual(order.productIds, [ undefined ]); - assert.deepEqual(order.products.models[0], product); -}); + assert.deepEqual(order.productIds, [ undefined ]); + assert.deepEqual(order.products.models[0], product); + }); -test('the parent accepts null children', function(assert) { - let order = this.schema.orders.new({ products: null }); + test('the parent accepts null children', function(assert) { + let order = this.schema.orders.new({ products: null }); - assert.equal(order.products.models.length, 0); - assert.deepEqual(order.productIds, []); - assert.deepEqual(order.attrs, { productIds: null }); -}); + assert.equal(order.products.models.length, 0); + assert.deepEqual(order.productIds, []); + assert.deepEqual(order.attrs, { productIds: null }); + }); -test('the parent accepts children and child ids', function(assert) { - let product = this.helper.savedChild(); - let order = this.schema.orders.new({ products: [ product ], productIds: [ product.id ] }); + test('the parent accepts children and child ids', function(assert) { + let product = this.helper.savedChild(); + let order = this.schema.orders.new({ products: [ product ], productIds: [ product.id ] }); - assert.deepEqual(order.productIds, [ product.id ]); - assert.deepEqual(order.products.models[0], product); -}); + assert.deepEqual(order.productIds, [ product.id ]); + assert.deepEqual(order.products.models[0], product); + }); -test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let order = this.schema.orders.new({}); + test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let order = this.schema.orders.new({}); - assert.deepEqual(order.productIds, []); - assert.deepEqual(order.products.models, []); - assert.deepEqual(order.attrs, { productIds: null }); -}); + assert.deepEqual(order.productIds, []); + assert.deepEqual(order.products.models, []); + assert.deepEqual(order.attrs, { productIds: null }); + }); -test('the parent accepts no reference to children or child ids', function(assert) { - let order = this.schema.orders.new(); + test('the parent accepts no reference to children or child ids', function(assert) { + let order = this.schema.orders.new(); - assert.deepEqual(order.productIds, []); - assert.deepEqual(order.products.models, []); - assert.deepEqual(order.attrs, { productIds: null }); + assert.deepEqual(order.productIds, []); + assert.deepEqual(order.products.models, []); + assert.deepEqual(order.attrs, { productIds: null }); + }); }); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/accessor-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/accessor-test.js index 235568df7..431a4c470 100644 --- a/tests/integration/orm/has-many/9-one-way-polymorphic/accessor-test.js +++ b/tests/integration/orm/has-many/9-one-way-polymorphic/accessor-test.js @@ -1,30 +1,33 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | One-way Polymorphic | accessor', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | One-way Polymorphic | accessor', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The reference to a belongs-to association is correct, for all states -*/ -states.forEach((state) => { + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ user, posts ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ user, posts ] = this.helper[state](); - assert.equal(user.things.models.length, posts.length, 'the parent has the correct number of children'); - assert.equal(user.thingIds.length, posts.length, 'the parent has the correct number of children ids'); + assert.equal(user.things.models.length, posts.length, 'the parent has the correct number of children'); + assert.equal(user.thingIds.length, posts.length, 'the parent has the correct number of children ids'); - posts.forEach((post, i) => { - assert.ok(user.things.includes(post), 'each child is in parent.children array'); + posts.forEach((post, i) => { + assert.ok(user.things.includes(post), 'each child is in parent.children array'); - if (post.isSaved()) { - assert.deepEqual(user.thingIds[i], { type: 'post', id: post.id }, 'each saved child id is in parent.childrenIds array'); - } - }); - }); + if (post.isSaved()) { + assert.deepEqual(user.thingIds[i], { type: 'post', id: post.id }, 'each saved child id is in parent.childrenIds array'); + } + }); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/association-create-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/association-create-test.js index b2852296e..67a82d9cf 100644 --- a/tests/integration/orm/has-many/9-one-way-polymorphic/association-create-test.js +++ b/tests/integration/orm/has-many/9-one-way-polymorphic/association-create-test.js @@ -1,32 +1,35 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | One-way Polymorphic | association #create', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | One-way Polymorphic | association #create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can create a has-many association, for all states -*/ -states.forEach((state) => { + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.things.models.length; + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.things.models.length; - let post = user.createThing('post', { title: 'Lorem ipsum' }); + let post = user.createThing('post', { title: 'Lorem ipsum' }); - assert.ok(post.id, 'the child was persisted'); - assert.equal(user.things.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.things.includes(post), 'the model was added to user.posts'); - assert.ok(user.thingIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'the id was added to the fks array'); - assert.ok(user.attrs.thingIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'fks were persisted'); - }); + assert.ok(post.id, 'the child was persisted'); + assert.equal(user.things.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.things.includes(post), 'the model was added to user.posts'); + assert.ok(user.thingIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'the id was added to the fks array'); + assert.ok(user.attrs.thingIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'fks were persisted'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/association-new-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/association-new-test.js index a9b3271c5..efb7ee9f7 100644 --- a/tests/integration/orm/has-many/9-one-way-polymorphic/association-new-test.js +++ b/tests/integration/orm/has-many/9-one-way-polymorphic/association-new-test.js @@ -1,35 +1,38 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | One-way Polymorphic | association #new', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | One-way Polymorphic | association #new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can make a new unsaved belongs-to association, for all states -*/ + /* + The model can make a new unsaved belongs-to association, for all states + */ -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.things.models.length; + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.things.models.length; - let post = user.newThing('post', { title: 'Lorem ipsum' }); + let post = user.newThing('post', { title: 'Lorem ipsum' }); - assert.ok(!post.id, 'the child was not persisted'); - assert.equal(user.things.models.length, initialCount + 1); + assert.ok(!post.id, 'the child was not persisted'); + assert.equal(user.things.models.length, initialCount + 1); - post.save(); + post.save(); - assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum' }, 'the child was persisted'); - assert.equal(user.things.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.things.includes(post), 'the model was added to user.things'); - assert.ok(user.thingIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'the id was added to the fks array'); - }); + assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum' }, 'the child was persisted'); + assert.equal(user.things.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.things.includes(post), 'the model was added to user.things'); + assert.ok(user.thingIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'the id was added to the fks array'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-ids-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-ids-test.js index 84ebf1cb4..befa80b0b 100644 --- a/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-ids-test.js +++ b/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-ids-test.js @@ -1,34 +1,37 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | One-way Polymorphic | association #setIds', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | One-way Polymorphic | association #setIds', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parentId, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user ] = this.helper[state](); - let savedPost = this.helper.savedChild(); + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user ] = this.helper[state](); + let savedPost = this.helper.savedChild(); - user.thingIds = [ { type: 'post', id: savedPost.id } ]; + user.thingIds = [ { type: 'post', id: savedPost.id } ]; - assert.ok(user.things.includes(savedPost)); - assert.ok(user.thingIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); - }); + assert.ok(user.things.includes(savedPost)); + assert.ok(user.thingIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); + }); - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ user ] = this.helper[state](); + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ user ] = this.helper[state](); - user.thingIds = null; + user.thingIds = null; - assert.deepEqual(user.things.models, []); - assert.deepEqual(user.thingIds, []); - }); + assert.deepEqual(user.things.models, []); + assert.deepEqual(user.thingIds, []); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-test.js index 88cc589b9..4312ecc29 100644 --- a/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-test.js +++ b/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-test.js @@ -1,53 +1,56 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | One-way Polymorphic | association #set', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | One-way Polymorphic | association #set', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parent, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ user ] = this.helper[state](); - let savedPost = this.helper.savedChild(); + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ user ] = this.helper[state](); + let savedPost = this.helper.savedChild(); - user.things = [ savedPost ]; + user.things = [ savedPost ]; - assert.ok(user.things.models.includes(savedPost)); - assert.ok(user.thingIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); - }); + assert.ok(user.things.models.includes(savedPost)); + assert.ok(user.thingIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user ] = this.helper[state](); - let newPost = this.helper.newChild(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user ] = this.helper[state](); + let newPost = this.helper.newChild(); - user.things = [ newPost ]; + user.things = [ newPost ]; - assert.deepEqual(user.thingIds, [ { type: 'post', id: undefined } ]); - assert.deepEqual(user.things.models[0], newPost); - }); + assert.deepEqual(user.thingIds, [ { type: 'post', id: undefined } ]); + assert.deepEqual(user.things.models[0], newPost); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user ] = this.helper[state](); - user.things = [ ]; + user.things = [ ]; - assert.deepEqual(user.thingIds, [ ]); - assert.equal(user.things.models.length, 0); - }); + assert.deepEqual(user.thingIds, [ ]); + assert.equal(user.things.models.length, 0); + }); - test(`a ${state} can clear its association via null`, function(assert) { - let [ user ] = this.helper[state](); + test(`a ${state} can clear its association via null`, function(assert) { + let [ user ] = this.helper[state](); - user.things = null; + user.things = null; - assert.deepEqual(user.thingIds, [ ]); - assert.equal(user.things.models.length, 0); - }); + assert.deepEqual(user.thingIds, [ ]); + assert.equal(user.things.models.length, 0); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/create-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/create-test.js index e3d5f3a5b..5c5848ae2 100644 --- a/tests/integration/orm/has-many/9-one-way-polymorphic/create-test.js +++ b/tests/integration/orm/has-many/9-one-way-polymorphic/create-test.js @@ -2,86 +2,89 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | One-way Polymorphic | create', { - beforeEach() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - } -}); +module( + 'Integration | ORM | Has Many | One-way Polymorphic | create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + }); -test('it sets up associations correctly when passing in the foreign key', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - thingIds: [ { type: 'post', id: post.id } ] - }); + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + thingIds: [ { type: 'post', id: post.id } ] + }); - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); - assert.deepEqual(user.things.models[0].attrs, post.attrs); - assert.equal(this.helper.db.posts.length, 1); - assert.deepEqual(this.helper.db.posts[0], { id: '1' }); - assert.equal(this.helper.db.users.length, 1); - assert.deepEqual(this.helper.db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); -}); + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); + assert.deepEqual(user.things.models[0].attrs, post.attrs); + assert.equal(this.helper.db.posts.length, 1); + assert.deepEqual(this.helper.db.posts[0], { id: '1' }); + assert.equal(this.helper.db.users.length, 1); + assert.deepEqual(this.helper.db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); + }); -test('it sets up associations correctly when passing in an array of models', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - things: [ post ] - }); + test('it sets up associations correctly when passing in an array of models', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + things: [ post ] + }); - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); - assert.ok(user.things.includes(post)); - assert.equal(this.helper.db.posts.length, 1); - assert.deepEqual(this.helper.db.posts[0], { id: '1' }); - assert.equal(this.helper.db.users.length, 1); - assert.deepEqual(this.helper.db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); -}); + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); + assert.ok(user.things.includes(post)); + assert.equal(this.helper.db.posts.length, 1); + assert.deepEqual(this.helper.db.posts[0], { id: '1' }); + assert.equal(this.helper.db.users.length, 1); + assert.deepEqual(this.helper.db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); + }); -test('it sets up associations correctly when passing in a collection', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - things: this.helper.schema.posts.all() - }); + test('it sets up associations correctly when passing in a collection', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + things: this.helper.schema.posts.all() + }); - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); - assert.ok(user.things.includes(post)); - assert.equal(this.helper.db.posts.length, 1); - assert.deepEqual(this.helper.db.posts[0], { id: '1' }); - assert.equal(this.helper.db.users.length, 1); - assert.deepEqual(this.helper.db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); -}); + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); + assert.ok(user.things.includes(post)); + assert.equal(this.helper.db.posts.length, 1); + assert.deepEqual(this.helper.db.posts[0], { id: '1' }); + assert.equal(this.helper.db.users.length, 1); + assert.deepEqual(this.helper.db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); + }); -test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.create('user', { - foo: schema.create('foo') + assert.throws(function() { + schema.create('user', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); }); - }, /you haven't defined that key as an association on your model/); -}); -test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.create('user', { - foos: [ schema.create('foo') ] + assert.throws(function() { + schema.create('user', { + foos: [ schema.create('foo') ] + }); + }, /you haven't defined that key as an association on your model/); }); - }, /you haven't defined that key as an association on your model/); -}); -test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); - assert.throws(function() { - schema.create('user', { - foos: schema.foos.all() + assert.throws(function() { + schema.create('user', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); }); - }, /you haven't defined that key as an association on your model/); -}); + } +); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/delete-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/delete-test.js index 165b0b03a..9794aef42 100644 --- a/tests/integration/orm/has-many/9-one-way-polymorphic/delete-test.js +++ b/tests/integration/orm/has-many/9-one-way-polymorphic/delete-test.js @@ -1,24 +1,27 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | One-way Polymorphic | delete', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Has Many | One-way Polymorphic | delete', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ user, posts ] = this.helper[state](); + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ user, posts ] = this.helper[state](); - if (posts && posts.length) { - posts.forEach(p => p.destroy()); - user.reload(); - } + if (posts && posts.length) { + posts.forEach(p => p.destroy()); + user.reload(); + } - assert.equal(user.things.length, 0); - assert.equal(user.thingIds.length, 0); - }); + assert.equal(user.things.length, 0); + assert.equal(user.thingIds.length, 0); + }); -}); + }); + } +); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/instantiating-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/instantiating-test.js index e07b6a695..8f1536978 100644 --- a/tests/integration/orm/has-many/9-one-way-polymorphic/instantiating-test.js +++ b/tests/integration/orm/has-many/9-one-way-polymorphic/instantiating-test.js @@ -1,81 +1,84 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Has Many | One-way Polymorphic | instantiating', { - beforeEach() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module( + 'Integration | ORM | Has Many | One-way Polymorphic | instantiating', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the parent accepts a saved child id', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ + thingIds: [ { type: 'post', id: post.id } ] + }); + + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.ok(user.things.includes(post)); + }); + + test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ thingIds: [ { type: 'post', id: 2 } ] }); + }, /You're instantiating a user that has a thingIds of post:2, but some of those records don't exist in the database/); + }); + + test('the parent accepts null children foreign key', function(assert) { + let user = this.schema.users.new({ thingIds: null }); + + assert.equal(user.things.models.length, 0); + assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.attrs, { thingIds: null }); + }); + + test('the parent accepts saved children', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ things: [ post ] }); + + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.ok(user.things.includes(post)); + }); + + test('the parent accepts new children', function(assert) { + let post = this.schema.posts.new({ title: 'Lorem' }); + let user = this.schema.users.new({ things: [ post ] }); + + assert.deepEqual(user.thingIds, [ { type: 'post', id: undefined } ]); + assert.ok(user.things.includes(post)); + }); + + test('the parent accepts null children', function(assert) { + let user = this.schema.users.new({ things: null }); + + assert.equal(user.things.models.length, 0); + assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.attrs, { thingIds: null }); + }); + + test('the parent accepts children and child ids', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ things: [ post ], thingIds: [ { type: 'post', id: post.id } ] }); + + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.ok(user.things.includes(post)); + }); + + test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let user = this.schema.users.new({}); + + assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.things.models, []); + assert.deepEqual(user.attrs, { thingIds: null }); + }); + + test('the parent accepts no reference to children or child ids', function(assert) { + let user = this.schema.users.new(); + + assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.things.models, []); + assert.deepEqual(user.attrs, { thingIds: null }); + }); } -}); - -test('the parent accepts a saved child id', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ - thingIds: [ { type: 'post', id: post.id } ] - }); - - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.ok(user.things.includes(post)); -}); - -test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ thingIds: [ { type: 'post', id: 2 } ] }); - }, /You're instantiating a user that has a thingIds of post:2, but some of those records don't exist in the database/); -}); - -test('the parent accepts null children foreign key', function(assert) { - let user = this.schema.users.new({ thingIds: null }); - - assert.equal(user.things.models.length, 0); - assert.deepEqual(user.thingIds, []); - assert.deepEqual(user.attrs, { thingIds: null }); -}); - -test('the parent accepts saved children', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ things: [ post ] }); - - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.ok(user.things.includes(post)); -}); - -test('the parent accepts new children', function(assert) { - let post = this.schema.posts.new({ title: 'Lorem' }); - let user = this.schema.users.new({ things: [ post ] }); - - assert.deepEqual(user.thingIds, [ { type: 'post', id: undefined } ]); - assert.ok(user.things.includes(post)); -}); - -test('the parent accepts null children', function(assert) { - let user = this.schema.users.new({ things: null }); - - assert.equal(user.things.models.length, 0); - assert.deepEqual(user.thingIds, []); - assert.deepEqual(user.attrs, { thingIds: null }); -}); - -test('the parent accepts children and child ids', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ things: [ post ], thingIds: [ { type: 'post', id: post.id } ] }); - - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.ok(user.things.includes(post)); -}); - -test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let user = this.schema.users.new({}); - - assert.deepEqual(user.thingIds, []); - assert.deepEqual(user.things.models, []); - assert.deepEqual(user.attrs, { thingIds: null }); -}); - -test('the parent accepts no reference to children or child ids', function(assert) { - let user = this.schema.users.new(); - - assert.deepEqual(user.thingIds, []); - assert.deepEqual(user.things.models, []); - assert.deepEqual(user.attrs, { thingIds: null }); -}); +); diff --git a/tests/integration/orm/mixed/1-one-to-many/accessor-test.js b/tests/integration/orm/mixed/1-one-to-many/accessor-test.js index 339c1c87c..598de8f37 100644 --- a/tests/integration/orm/mixed/1-one-to-many/accessor-test.js +++ b/tests/integration/orm/mixed/1-one-to-many/accessor-test.js @@ -1,34 +1,34 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Mixed | One To Many | accessor', { - beforeEach() { +module('Integration | ORM | Mixed | One To Many | accessor', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); - } -}); + }); -/* - The reference to a belongs-to association is correct, for all states -*/ -states.forEach((state) => { + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ user, posts ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ user, posts ] = this.helper[state](); - assert.equal(user.posts.models.length, posts.length, 'the parent has the correct number of children'); - assert.equal(user.postIds.length, posts.length, 'the parent has the correct number of children ids'); + assert.equal(user.posts.models.length, posts.length, 'the parent has the correct number of children'); + assert.equal(user.postIds.length, posts.length, 'the parent has the correct number of children ids'); - posts.forEach((post, i) => { - assert.deepEqual(user.posts.models[i], posts[i], 'each child is in parent.children array'); + posts.forEach((post, i) => { + assert.deepEqual(user.posts.models[i], posts[i], 'each child is in parent.children array'); - if (post.isSaved()) { - assert.ok(user.postIds.indexOf(post.id) > -1, 'each saved child id is in parent.childrenIds array'); - } + if (post.isSaved()) { + assert.ok(user.postIds.indexOf(post.id) > -1, 'each saved child id is in parent.childrenIds array'); + } - // Check the inverse - assert.deepEqual(post.user.attrs, user.attrs); - assert.deepEqual(post.userId, user.id); + // Check the inverse + assert.deepEqual(post.user.attrs, user.attrs); + assert.deepEqual(post.userId, user.id); + }); }); - }); + }); }); diff --git a/tests/integration/orm/mixed/1-one-to-many/association-create-test.js b/tests/integration/orm/mixed/1-one-to-many/association-create-test.js index b472f71cb..09879c083 100644 --- a/tests/integration/orm/mixed/1-one-to-many/association-create-test.js +++ b/tests/integration/orm/mixed/1-one-to-many/association-create-test.js @@ -1,32 +1,35 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Mixed | One To Many | association #create', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Mixed | One To Many | association #create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can create a has-many association, for all states -*/ -states.forEach((state) => { + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.posts.models.length; + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.posts.models.length; - let post = user.createPost({ title: 'Lorem ipsum' }); + let post = user.createPost({ title: 'Lorem ipsum' }); - assert.ok(post.id, 'the child was persisted'); - assert.equal(user.posts.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.posts.includes(post), 'the model was added to user.posts'); - assert.ok(user.postIds.indexOf(post.id) > -1, 'the id was added to the fks array'); - assert.ok(user.attrs.postIds.indexOf(post.id) > -1, 'fks were persisted'); + assert.ok(post.id, 'the child was persisted'); + assert.equal(user.posts.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.posts.includes(post), 'the model was added to user.posts'); + assert.ok(user.postIds.indexOf(post.id) > -1, 'the id was added to the fks array'); + assert.ok(user.attrs.postIds.indexOf(post.id) > -1, 'fks were persisted'); - // Check the inverse - assert.deepEqual(post.user.attrs, user.attrs); - assert.deepEqual(post.userId, user.id); - }); + // Check the inverse + assert.deepEqual(post.user.attrs, user.attrs); + assert.deepEqual(post.userId, user.id); + }); -}); + }); + } +); diff --git a/tests/integration/orm/mixed/1-one-to-many/association-new-test.js b/tests/integration/orm/mixed/1-one-to-many/association-new-test.js index e1d8b893d..4b01049d9 100644 --- a/tests/integration/orm/mixed/1-one-to-many/association-new-test.js +++ b/tests/integration/orm/mixed/1-one-to-many/association-new-test.js @@ -1,33 +1,36 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Mixed | One To Many | association #new', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Mixed | One To Many | association #new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can make a new unsaved belongs-to association, for all states -*/ + /* + The model can make a new unsaved belongs-to association, for all states + */ -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.posts.models.length; + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.posts.models.length; - let post = user.newPost({ title: 'Lorem ipsum' }); + let post = user.newPost({ title: 'Lorem ipsum' }); - assert.ok(!post.id, 'the child was not persisted'); - assert.equal(user.posts.models.length, initialCount + 1); + assert.ok(!post.id, 'the child was not persisted'); + assert.equal(user.posts.models.length, initialCount + 1); - post.save(); + post.save(); - assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum', userId: user.id }, 'the child was persisted'); - assert.equal(user.posts.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.posts.includes(post), 'the model was added to user.posts'); - assert.ok(user.postIds.indexOf(post.id) > -1, 'the id was added to the fks array'); - }); + assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum', userId: user.id }, 'the child was persisted'); + assert.equal(user.posts.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.posts.includes(post), 'the model was added to user.posts'); + assert.ok(user.postIds.indexOf(post.id) > -1, 'the id was added to the fks array'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/mixed/1-one-to-many/association-set-ids-test.js b/tests/integration/orm/mixed/1-one-to-many/association-set-ids-test.js index c5039e236..bf98ea4ab 100644 --- a/tests/integration/orm/mixed/1-one-to-many/association-set-ids-test.js +++ b/tests/integration/orm/mixed/1-one-to-many/association-set-ids-test.js @@ -1,59 +1,62 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Mixed | One To Many | association #setIds', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Mixed | One To Many | association #setIds', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parentId, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let savedPost = this.helper.savedChild(); + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let savedPost = this.helper.savedChild(); - user.postIds = [ savedPost.id ]; + user.postIds = [ savedPost.id ]; - assert.ok(user.posts.includes(savedPost)); - assert.deepEqual(user.postIds, [ savedPost.id ]); + assert.ok(user.posts.includes(savedPost)); + assert.deepEqual(user.postIds, [ savedPost.id ]); - user.save(); - savedPost.reload(); + user.save(); + savedPost.reload(); - // Check the inverse - assert.deepEqual(savedPost.user.attrs, user.attrs); - assert.equal(savedPost.userId, user.id); + // Check the inverse + assert.deepEqual(savedPost.user.attrs, user.attrs); + assert.equal(savedPost.userId, user.id); - // Check old associates - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); - }); + // Check old associates + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } + }); + }); - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); - user.postIds = null; + user.postIds = null; - assert.deepEqual(user.posts.models, []); - assert.deepEqual(user.postIds, []); + assert.deepEqual(user.posts.models, []); + assert.deepEqual(user.postIds, []); - user.save(); + user.save(); - // Check old associates - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); - }); + // Check old associates + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } + }); + }); -}); + }); + } +); diff --git a/tests/integration/orm/mixed/1-one-to-many/association-set-test.js b/tests/integration/orm/mixed/1-one-to-many/association-set-test.js index 8eb83a3d5..34446bbed 100644 --- a/tests/integration/orm/mixed/1-one-to-many/association-set-test.js +++ b/tests/integration/orm/mixed/1-one-to-many/association-set-test.js @@ -1,89 +1,92 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Mixed | One To Many | association #set', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Mixed | One To Many | association #set', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parent, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let savedPost = this.helper.savedChild(); + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let savedPost = this.helper.savedChild(); - user.posts = [ savedPost ]; + user.posts = [ savedPost ]; - assert.ok(user.posts.includes(savedPost)); - assert.ok(user.postIds.indexOf(savedPost.id) > -1); + assert.ok(user.posts.includes(savedPost)); + assert.ok(user.postIds.indexOf(savedPost.id) > -1); - user.save(); + user.save(); - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); - }); + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } + }); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let newPost = this.helper.newChild(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let newPost = this.helper.newChild(); - user.posts = [ newPost ]; + user.posts = [ newPost ]; - assert.deepEqual(user.postIds, [ undefined ]); - assert.ok(user.posts.includes(newPost)); + assert.deepEqual(user.postIds, [ undefined ]); + assert.ok(user.posts.includes(newPost)); - user.save(); + user.save(); - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); - }); + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } + }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); - user.posts = [ ]; + user.posts = [ ]; - assert.deepEqual(user.postIds, [ ]); - assert.equal(user.posts.models.length, 0); + assert.deepEqual(user.postIds, [ ]); + assert.equal(user.posts.models.length, 0); - user.save(); + user.save(); - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); - }); + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } + }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); - user.posts = null; + user.posts = null; - assert.deepEqual(user.postIds, [ ]); - assert.equal(user.posts.models.length, 0); + assert.deepEqual(user.postIds, [ ]); + assert.equal(user.posts.models.length, 0); - user.save(); + user.save(); - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); - }); + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } + }); + }); -}); + }); + } +); diff --git a/tests/integration/orm/mixed/1-one-to-many/create-test.js b/tests/integration/orm/mixed/1-one-to-many/create-test.js index ff6070cce..3faab874a 100644 --- a/tests/integration/orm/mixed/1-one-to-many/create-test.js +++ b/tests/integration/orm/mixed/1-one-to-many/create-test.js @@ -2,96 +2,96 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | ORM | Mixed | One To Many | create', { - beforeEach() { +module('Integration | ORM | Mixed | One To Many | create', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); this.helper.schema.registerModel('foo', Model); - } -}); - -test('it sets up associations correctly when passing in the foreign key', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - postIds: [ post.id ] }); - post.reload(); - - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.attrs.postIds, [ post.id ], 'the ids were persisted'); - assert.ok(user.posts.includes(post)); - assert.deepEqual(post.user.attrs, user.attrs); - - let { db } = this.helper; - assert.equal(db.posts.length, 1); - assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); - assert.equal(db.users.length, 1); - assert.deepEqual(db.users[0], { id: '1', postIds: [ '1' ] }); -}); -test('it sets up associations correctly when passing in an array of models', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - posts: [ post ] + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + postIds: [ post.id ] + }); + post.reload(); + + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.attrs.postIds, [ post.id ], 'the ids were persisted'); + assert.ok(user.posts.includes(post)); + assert.deepEqual(post.user.attrs, user.attrs); + + let { db } = this.helper; + assert.equal(db.posts.length, 1); + assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); + assert.equal(db.users.length, 1); + assert.deepEqual(db.users[0], { id: '1', postIds: [ '1' ] }); }); - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.attrs.postIds, [ post.id ], 'the ids were persisted'); - assert.ok(user.posts.includes(post)); - assert.deepEqual(post.user.attrs, user.attrs); + test('it sets up associations correctly when passing in an array of models', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + posts: [ post ] + }); - let { db } = this.helper; - assert.equal(db.posts.length, 1); - assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); - assert.equal(db.users.length, 1); - assert.deepEqual(db.users[0], { id: '1', postIds: [ '1' ] }); -}); + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.attrs.postIds, [ post.id ], 'the ids were persisted'); + assert.ok(user.posts.includes(post)); + assert.deepEqual(post.user.attrs, user.attrs); -test('it sets up associations correctly when passing in a collection', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - posts: this.helper.schema.posts.all() + let { db } = this.helper; + assert.equal(db.posts.length, 1); + assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); + assert.equal(db.users.length, 1); + assert.deepEqual(db.users[0], { id: '1', postIds: [ '1' ] }); }); - post.reload(); - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.attrs.postIds, [ post.id ], 'the ids were persisted'); - assert.ok(user.posts.includes(post)); + test('it sets up associations correctly when passing in a collection', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + posts: this.helper.schema.posts.all() + }); + post.reload(); + + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.attrs.postIds, [ post.id ], 'the ids were persisted'); + assert.ok(user.posts.includes(post)); - let { db } = this.helper; - assert.equal(db.posts.length, 1); - assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); - assert.equal(db.users.length, 1); - assert.deepEqual(db.users[0], { id: '1', postIds: [ '1' ] }); -}); + let { db } = this.helper; + assert.equal(db.posts.length, 1); + assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); + assert.equal(db.users.length, 1); + assert.deepEqual(db.users[0], { id: '1', postIds: [ '1' ] }); + }); -test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.create('user', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); -}); + assert.throws(function() { + schema.create('user', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); + }); -test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.create('user', { - foos: [ schema.create('foo') ] - }); - }, /you haven't defined that key as an association on your model/); -}); + assert.throws(function() { + schema.create('user', { + foos: [ schema.create('foo') ] + }); + }, /you haven't defined that key as an association on your model/); + }); -test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); - assert.throws(function() { - schema.create('post', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); + assert.throws(function() { + schema.create('post', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); }); diff --git a/tests/integration/orm/mixed/1-one-to-many/instantiating-test.js b/tests/integration/orm/mixed/1-one-to-many/instantiating-test.js index 433791fc6..7913dd2e4 100644 --- a/tests/integration/orm/mixed/1-one-to-many/instantiating-test.js +++ b/tests/integration/orm/mixed/1-one-to-many/instantiating-test.js @@ -1,81 +1,84 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Mixed | One To Many | instantiating', { - beforeEach() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module( + 'Integration | ORM | Mixed | One To Many | instantiating', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the parent accepts a saved child id', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ + postIds: [ post.id ] + }); + + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.posts.models[0], post); + }); + + test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ postIds: [ 2 ] }); + }, /You're instantiating a user that has a postIds of 2, but some of those records don't exist in the database/); + }); + + test('the parent accepts null children foreign key', function(assert) { + let user = this.schema.users.new({ postIds: null }); + + assert.equal(user.posts.models.length, 0); + assert.deepEqual(user.postIds, []); + assert.deepEqual(user.attrs, { postIds: null }); + }); + + test('the parent accepts saved children', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ posts: [ post ] }); + + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.posts.models[0], post); + }); + + test('the parent accepts new children', function(assert) { + let post = this.schema.posts.new({ title: 'Lorem' }); + let user = this.schema.users.new({ posts: [ post ] }); + + assert.deepEqual(user.postIds, [ undefined ]); + assert.deepEqual(user.posts.models[0], post); + }); + + test('the parent accepts null children', function(assert) { + let user = this.schema.users.new({ posts: null }); + + assert.equal(user.posts.models.length, 0); + assert.deepEqual(user.postIds, []); + assert.deepEqual(user.attrs, { postIds: null }); + }); + + test('the parent accepts children and child ids', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ posts: [ post ], postIds: [ post.id ] }); + + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.posts.models[0], post); + }); + + test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let user = this.schema.users.new({}); + + assert.deepEqual(user.postIds, []); + assert.deepEqual(user.posts.models, []); + assert.deepEqual(user.attrs, { postIds: null }); + }); + + test('the parent accepts no reference to children or child ids', function(assert) { + let user = this.schema.users.new(); + + assert.deepEqual(user.postIds, []); + assert.deepEqual(user.posts.models, []); + assert.deepEqual(user.attrs, { postIds: null }); + }); } -}); - -test('the parent accepts a saved child id', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ - postIds: [ post.id ] - }); - - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.posts.models[0], post); -}); - -test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ postIds: [ 2 ] }); - }, /You're instantiating a user that has a postIds of 2, but some of those records don't exist in the database/); -}); - -test('the parent accepts null children foreign key', function(assert) { - let user = this.schema.users.new({ postIds: null }); - - assert.equal(user.posts.models.length, 0); - assert.deepEqual(user.postIds, []); - assert.deepEqual(user.attrs, { postIds: null }); -}); - -test('the parent accepts saved children', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ posts: [ post ] }); - - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.posts.models[0], post); -}); - -test('the parent accepts new children', function(assert) { - let post = this.schema.posts.new({ title: 'Lorem' }); - let user = this.schema.users.new({ posts: [ post ] }); - - assert.deepEqual(user.postIds, [ undefined ]); - assert.deepEqual(user.posts.models[0], post); -}); - -test('the parent accepts null children', function(assert) { - let user = this.schema.users.new({ posts: null }); - - assert.equal(user.posts.models.length, 0); - assert.deepEqual(user.postIds, []); - assert.deepEqual(user.attrs, { postIds: null }); -}); - -test('the parent accepts children and child ids', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ posts: [ post ], postIds: [ post.id ] }); - - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.posts.models[0], post); -}); - -test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let user = this.schema.users.new({}); - - assert.deepEqual(user.postIds, []); - assert.deepEqual(user.posts.models, []); - assert.deepEqual(user.attrs, { postIds: null }); -}); - -test('the parent accepts no reference to children or child ids', function(assert) { - let user = this.schema.users.new(); - - assert.deepEqual(user.postIds, []); - assert.deepEqual(user.posts.models, []); - assert.deepEqual(user.attrs, { postIds: null }); -}); +); diff --git a/tests/integration/orm/mixed/2-many-to-one/accessor-test.js b/tests/integration/orm/mixed/2-many-to-one/accessor-test.js index 27715940b..01f077bbd 100644 --- a/tests/integration/orm/mixed/2-many-to-one/accessor-test.js +++ b/tests/integration/orm/mixed/2-many-to-one/accessor-test.js @@ -1,30 +1,30 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Mixed | Many To One | accessor', { - beforeEach() { +module('Integration | ORM | Mixed | Many To One | accessor', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); - } -}); + }); -/* - The reference to a belongs-to association is correct, for all states -*/ -states.forEach((state) => { + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ post, user ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ post, user ] = this.helper[state](); - assert.deepEqual(post.user, user); - assert.equal(post.userId, user ? user.id : null); + assert.deepEqual(post.user, user); + assert.equal(post.userId, user ? user.id : null); - post.save(); + post.save(); - // Check the inverse - if (user && user.isSaved()) { - user.reload(); - assert.ok(user.posts.includes(post)); - } - }); + // Check the inverse + if (user && user.isSaved()) { + user.reload(); + assert.ok(user.posts.includes(post)); + } + }); + }); }); diff --git a/tests/integration/orm/mixed/2-many-to-one/association-create-test.js b/tests/integration/orm/mixed/2-many-to-one/association-create-test.js index d68ad5858..89d3ebf77 100644 --- a/tests/integration/orm/mixed/2-many-to-one/association-create-test.js +++ b/tests/integration/orm/mixed/2-many-to-one/association-create-test.js @@ -1,34 +1,37 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Mixed | Many To One | association #create', { - beforeEach() { - this.helper = new Helper(); +module( + 'Integration | ORM | Mixed | Many To One | association #create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); + + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { + + test(`a ${state} can create an associated parent`, function(assert) { + let [ post, originalUser ] = this.helper[state](); + + let user = post.createUser({ name: 'Zelda' }); + + assert.ok(user.id, 'the parent was persisted'); + assert.deepEqual(post.user.attrs, user.attrs); + assert.equal(post.userId, user.id); + + // Check the inverse + assert.ok(user.posts.includes(post), 'the inverse was set'); + + // Ensure old inverse was cleared + if (originalUser && originalUser.isSaved()) { + originalUser.reload(); + assert.notOk(originalUser.posts.includes(post)); + } + }); + + }); } -}); - -/* - The model can create a has-many association, for all states -*/ -states.forEach((state) => { - - test(`a ${state} can create an associated parent`, function(assert) { - let [ post, originalUser ] = this.helper[state](); - - let user = post.createUser({ name: 'Zelda' }); - - assert.ok(user.id, 'the parent was persisted'); - assert.deepEqual(post.user.attrs, user.attrs); - assert.equal(post.userId, user.id); - - // Check the inverse - assert.ok(user.posts.includes(post), 'the inverse was set'); - - // Ensure old inverse was cleared - if (originalUser && originalUser.isSaved()) { - originalUser.reload(); - assert.notOk(originalUser.posts.includes(post)); - } - }); - -}); +); diff --git a/tests/integration/orm/mixed/2-many-to-one/association-new-test.js b/tests/integration/orm/mixed/2-many-to-one/association-new-test.js index 8f86664a6..c46293b81 100644 --- a/tests/integration/orm/mixed/2-many-to-one/association-new-test.js +++ b/tests/integration/orm/mixed/2-many-to-one/association-new-test.js @@ -1,42 +1,45 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Mixed | Many To One | association #new', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Mixed | Many To One | association #new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can make a new unsaved belongs-to association, for all states -*/ + /* + The model can make a new unsaved belongs-to association, for all states + */ -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can build a new associated parent`, function(assert) { - let [ post, originalUser ] = this.helper[state](); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ post, originalUser ] = this.helper[state](); - let user = post.newUser({ name: 'Zelda' }); + let user = post.newUser({ name: 'Zelda' }); - assert.ok(!user.id, 'the child was not persisted'); - assert.deepEqual(post.user, user, 'the relationship was set'); - assert.ok(user.posts.includes(post), 'the inverse was set'); + assert.ok(!user.id, 'the child was not persisted'); + assert.deepEqual(post.user, user, 'the relationship was set'); + assert.ok(user.posts.includes(post), 'the inverse was set'); - user.save(); - post.reload(); + user.save(); + post.reload(); - assert.ok(user.id, 'the parent was persisted'); - assert.deepEqual(post.user.attrs, user.attrs); - assert.equal(post.userId, user.id); + assert.ok(user.id, 'the parent was persisted'); + assert.deepEqual(post.user.attrs, user.attrs); + assert.equal(post.userId, user.id); - // Check the inverse - assert.ok(user.posts.includes(post), 'the inverse was set'); + // Check the inverse + assert.ok(user.posts.includes(post), 'the inverse was set'); - // Ensure old inverse was cleared - if (originalUser && originalUser.isSaved()) { - originalUser.reload(); - assert.notOk(originalUser.posts.includes(post)); - } - }); + // Ensure old inverse was cleared + if (originalUser && originalUser.isSaved()) { + originalUser.reload(); + assert.notOk(originalUser.posts.includes(post)); + } + }); -}); + }); + } +); diff --git a/tests/integration/orm/mixed/2-many-to-one/association-set-ids-test.js b/tests/integration/orm/mixed/2-many-to-one/association-set-ids-test.js index c0efe4684..0ea712efc 100644 --- a/tests/integration/orm/mixed/2-many-to-one/association-set-ids-test.js +++ b/tests/integration/orm/mixed/2-many-to-one/association-set-ids-test.js @@ -1,54 +1,57 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Mixed | Many To One | association #setIds', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Mixed | Many To One | association #setIds', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parentId, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ post, originalUser ] = this.helper[state](); - let user = this.helper.savedParent(); + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ post, originalUser ] = this.helper[state](); + let user = this.helper.savedParent(); - post.userId = user.id; + post.userId = user.id; - assert.equal(post.userId, user.id); - assert.deepEqual(post.user.attrs, user.attrs); + assert.equal(post.userId, user.id); + assert.deepEqual(post.user.attrs, user.attrs); - assert.ok(post.user.posts.includes(post), 'the inverse was set'); + assert.ok(post.user.posts.includes(post), 'the inverse was set'); - post.save(); - user.reload(); + post.save(); + user.reload(); - assert.ok(user.posts.includes(post)); + assert.ok(user.posts.includes(post)); - // Old inverses were cleared - if (originalUser && originalUser.isSaved()) { - originalUser.reload(); - assert.notOk(originalUser.posts.includes(post)); - } - }); + // Old inverses were cleared + if (originalUser && originalUser.isSaved()) { + originalUser.reload(); + assert.notOk(originalUser.posts.includes(post)); + } + }); - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ post, originalUser ] = this.helper[state](); + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ post, originalUser ] = this.helper[state](); - post.userId = null; + post.userId = null; - assert.deepEqual(post.user, null); - assert.deepEqual(post.userId, null); + assert.deepEqual(post.user, null); + assert.deepEqual(post.userId, null); - post.save(); + post.save(); - if (originalUser && originalUser.isSaved()) { - originalUser.reload(); - assert.notOk(originalUser.posts.includes(post)); - } - }); + if (originalUser && originalUser.isSaved()) { + originalUser.reload(); + assert.notOk(originalUser.posts.includes(post)); + } + }); -}); + }); + } +); diff --git a/tests/integration/orm/mixed/2-many-to-one/association-set-test.js b/tests/integration/orm/mixed/2-many-to-one/association-set-test.js index b4cd9d8b8..fe4596ea3 100644 --- a/tests/integration/orm/mixed/2-many-to-one/association-set-test.js +++ b/tests/integration/orm/mixed/2-many-to-one/association-set-test.js @@ -1,67 +1,70 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Mixed | Many To One | association #set', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Mixed | Many To One | association #set', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parent, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ post, originalUser ] = this.helper[state](); - let savedUser = this.helper.savedParent(); + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ post, originalUser ] = this.helper[state](); + let savedUser = this.helper.savedParent(); - post.user = savedUser; + post.user = savedUser; - assert.deepEqual(post.user, savedUser); - assert.ok(savedUser.posts.includes(post), 'the inverse was set'); + assert.deepEqual(post.user, savedUser); + assert.ok(savedUser.posts.includes(post), 'the inverse was set'); - post.save(); + post.save(); - // Old inverse was cleared - if (originalUser && originalUser.isSaved()) { - originalUser.reload(); - assert.notOk(originalUser.posts.includes(post)); - } - }); + // Old inverse was cleared + if (originalUser && originalUser.isSaved()) { + originalUser.reload(); + assert.notOk(originalUser.posts.includes(post)); + } + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ post, originalUser ] = this.helper[state](); - let newUser = this.helper.newParent(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ post, originalUser ] = this.helper[state](); + let newUser = this.helper.newParent(); - post.user = newUser; + post.user = newUser; - assert.deepEqual(post.user, newUser); - assert.ok(newUser.posts.includes(post), 'the inverse was set'); + assert.deepEqual(post.user, newUser); + assert.ok(newUser.posts.includes(post), 'the inverse was set'); - post.save(); + post.save(); - // Old inverse was cleared - if (originalUser && originalUser.isSaved()) { - originalUser.reload(); - assert.notOk(originalUser.posts.includes(post)); - } - }); + // Old inverse was cleared + if (originalUser && originalUser.isSaved()) { + originalUser.reload(); + assert.notOk(originalUser.posts.includes(post)); + } + }); - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ post, originalUser ] = this.helper[state](); + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ post, originalUser ] = this.helper[state](); - post.user = null; + post.user = null; - assert.deepEqual(post.user, null); + assert.deepEqual(post.user, null); - post.save(); + post.save(); - // Old inverse was cleared - if (originalUser && originalUser.isSaved()) { - originalUser.reload(); - assert.notOk(originalUser.posts.includes(post)); - } - }); + // Old inverse was cleared + if (originalUser && originalUser.isSaved()) { + originalUser.reload(); + assert.notOk(originalUser.posts.includes(post)); + } + }); -}); + }); + } +); diff --git a/tests/integration/orm/mixed/2-many-to-one/create-test.js b/tests/integration/orm/mixed/2-many-to-one/create-test.js index 06af672e4..dc4f96df1 100644 --- a/tests/integration/orm/mixed/2-many-to-one/create-test.js +++ b/tests/integration/orm/mixed/2-many-to-one/create-test.js @@ -2,70 +2,70 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | ORM | Mixed | Many To One | create', { - beforeEach() { +module('Integration | ORM | Mixed | Many To One | create', function(hooks) { + hooks.beforeEach(function() { this.helper = new Helper(); this.helper.schema.registerModel('foo', Model); - } -}); - -test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let user = schema.create('user'); - let post = schema.create('post', { - userId: user.id }); - user.reload(); - assert.deepEqual(post.user.attrs, user.attrs); - assert.equal(post.userId, user.id); - assert.ok(user.posts.includes(post), 'inverse was set'); - assert.deepEqual(user.postIds, [ post.id ]); + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let user = schema.create('user'); + let post = schema.create('post', { + userId: user.id + }); + user.reload(); - let { db } = this.helper; - assert.equal(db.posts.length, 1); - assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); - assert.equal(db.users.length, 1); - assert.deepEqual(db.users[0], { id: '1', postIds: [ '1' ] }); -}); + assert.deepEqual(post.user.attrs, user.attrs); + assert.equal(post.userId, user.id); + assert.ok(user.posts.includes(post), 'inverse was set'); + assert.deepEqual(user.postIds, [ post.id ]); -test('it sets up associations correctly when passing in the association itself', function(assert) { - let { schema } = this.helper; - let user = schema.create('user'); - let post = schema.create('post', { - user + let { db } = this.helper; + assert.equal(db.posts.length, 1); + assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); + assert.equal(db.users.length, 1); + assert.deepEqual(db.users[0], { id: '1', postIds: [ '1' ] }); }); - assert.deepEqual(post.user.attrs, user.attrs); - assert.equal(post.userId, user.id); - assert.ok(user.posts.includes(post), 'inverse was set'); - assert.deepEqual(user.postIds, [ post.id ]); + test('it sets up associations correctly when passing in the association itself', function(assert) { + let { schema } = this.helper; + let user = schema.create('user'); + let post = schema.create('post', { + user + }); - let { db } = this.helper; - assert.equal(db.posts.length, 1); - assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); - assert.equal(db.users.length, 1); - assert.deepEqual(db.users[0], { id: '1', postIds: [ '1' ] }); -}); + assert.deepEqual(post.user.attrs, user.attrs); + assert.equal(post.userId, user.id); + assert.ok(user.posts.includes(post), 'inverse was set'); + assert.deepEqual(user.postIds, [ post.id ]); -test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + let { db } = this.helper; + assert.equal(db.posts.length, 1); + assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); + assert.equal(db.users.length, 1); + assert.deepEqual(db.users[0], { id: '1', postIds: [ '1' ] }); + }); - assert.throws(function() { - schema.create('post', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); -}); + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('post', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); + }); -test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); - assert.throws(function() { - schema.create('post', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); + assert.throws(function() { + schema.create('post', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); }); diff --git a/tests/integration/orm/mixed/2-many-to-one/instantiating-test.js b/tests/integration/orm/mixed/2-many-to-one/instantiating-test.js index d7bfdff7b..d52c6623e 100644 --- a/tests/integration/orm/mixed/2-many-to-one/instantiating-test.js +++ b/tests/integration/orm/mixed/2-many-to-one/instantiating-test.js @@ -1,96 +1,99 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Mixed | One To Many | instantiating', { - beforeEach() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module( + 'Integration | ORM | Mixed | One To Many | instantiating', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the child accepts a saved parent id', function(assert) { + let user = this.helper.savedParent(); + let post = this.schema.posts.new({ userId: user.id }); + + assert.equal(post.userId, user.id); + assert.deepEqual(post.user.attrs, user.attrs); + assert.deepEqual(post.attrs, { userId: user.id }); + + post.save(); + user.reload(); + + assert.ok(user.posts.includes(post), 'the inverse was set'); + }); + + test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.posts.new({ userId: 2 }); + }, /You're instantiating a post that has a userId of 2, but that record doesn't exist in the database/); + }); + + test('the child accepts a null parent id', function(assert) { + let post = this.schema.posts.new({ userId: null }); + + assert.equal(post.userId, null); + assert.equal(post.user, null); + assert.deepEqual(post.attrs, { userId: null }); + }); + + test('the child accepts a saved parent model', function(assert) { + let user = this.helper.savedParent(); + let post = this.schema.posts.new({ user }); + + assert.equal(post.userId, 1); + assert.deepEqual(post.user.attrs, user.attrs); + assert.deepEqual(post.attrs, { userId: null }); + + post.save(); + user.reload(); + + assert.ok(user.posts.includes(post), 'the inverse was set'); + }); + + test('the child accepts a new parent model', function(assert) { + let user = this.schema.users.new({ age: 300 }); + let post = this.schema.posts.new({ user }); + + assert.equal(post.userId, null); + assert.deepEqual(post.user, user); + assert.deepEqual(post.attrs, { userId: null }); + assert.ok(user.posts.includes(post), 'the inverse was set'); + }); + + test('the child accepts a null parent model', function(assert) { + let post = this.schema.posts.new({ user: null }); + + assert.equal(post.userId, null); + assert.deepEqual(post.user, null); + assert.deepEqual(post.attrs, { userId: null }); + }); + + test('the child accepts a parent model and id', function(assert) { + let user = this.helper.savedParent(); + let post = this.schema.posts.new({ user, userId: user.id }); + + assert.equal(post.userId, '1'); + assert.deepEqual(post.user, user); + assert.deepEqual(post.attrs, { userId: user.id }); + + assert.ok(user.posts.includes(post), 'the inverse was set'); + }); + + test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let post = this.schema.posts.new({}); + + assert.equal(post.userId, null); + assert.deepEqual(post.user, null); + assert.deepEqual(post.attrs, { userId: null }); + }); + + test('the child accepts no reference to a parent id or model', function(assert) { + let post = this.schema.posts.new(); + + assert.equal(post.userId, null); + assert.deepEqual(post.user, null); + assert.deepEqual(post.attrs, { userId: null }); + }); } -}); - -test('the child accepts a saved parent id', function(assert) { - let user = this.helper.savedParent(); - let post = this.schema.posts.new({ userId: user.id }); - - assert.equal(post.userId, user.id); - assert.deepEqual(post.user.attrs, user.attrs); - assert.deepEqual(post.attrs, { userId: user.id }); - - post.save(); - user.reload(); - - assert.ok(user.posts.includes(post), 'the inverse was set'); -}); - -test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.posts.new({ userId: 2 }); - }, /You're instantiating a post that has a userId of 2, but that record doesn't exist in the database/); -}); - -test('the child accepts a null parent id', function(assert) { - let post = this.schema.posts.new({ userId: null }); - - assert.equal(post.userId, null); - assert.equal(post.user, null); - assert.deepEqual(post.attrs, { userId: null }); -}); - -test('the child accepts a saved parent model', function(assert) { - let user = this.helper.savedParent(); - let post = this.schema.posts.new({ user }); - - assert.equal(post.userId, 1); - assert.deepEqual(post.user.attrs, user.attrs); - assert.deepEqual(post.attrs, { userId: null }); - - post.save(); - user.reload(); - - assert.ok(user.posts.includes(post), 'the inverse was set'); -}); - -test('the child accepts a new parent model', function(assert) { - let user = this.schema.users.new({ age: 300 }); - let post = this.schema.posts.new({ user }); - - assert.equal(post.userId, null); - assert.deepEqual(post.user, user); - assert.deepEqual(post.attrs, { userId: null }); - assert.ok(user.posts.includes(post), 'the inverse was set'); -}); - -test('the child accepts a null parent model', function(assert) { - let post = this.schema.posts.new({ user: null }); - - assert.equal(post.userId, null); - assert.deepEqual(post.user, null); - assert.deepEqual(post.attrs, { userId: null }); -}); - -test('the child accepts a parent model and id', function(assert) { - let user = this.helper.savedParent(); - let post = this.schema.posts.new({ user, userId: user.id }); - - assert.equal(post.userId, '1'); - assert.deepEqual(post.user, user); - assert.deepEqual(post.attrs, { userId: user.id }); - - assert.ok(user.posts.includes(post), 'the inverse was set'); -}); - -test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let post = this.schema.posts.new({}); - - assert.equal(post.userId, null); - assert.deepEqual(post.user, null); - assert.deepEqual(post.attrs, { userId: null }); -}); - -test('the child accepts no reference to a parent id or model', function(assert) { - let post = this.schema.posts.new(); - - assert.equal(post.userId, null); - assert.deepEqual(post.user, null); - assert.deepEqual(post.attrs, { userId: null }); -}); +); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/accessor-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/accessor-test.js index 75a70ea6c..e95edc43c 100644 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/accessor-test.js +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/accessor-test.js @@ -1,36 +1,39 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Mixed | One To Many Polymorphic | accessor', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Mixed | One To Many Polymorphic | accessor', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The reference to a belongs-to association is correct, for all states -*/ -states.forEach((state) => { + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ user, posts ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ user, posts ] = this.helper[state](); - assert.equal(user.things.models.length, posts.length, 'the parent has the correct number of children'); - assert.equal(user.thingIds.length, posts.length, 'the parent has the correct number of children ids'); + assert.equal(user.things.models.length, posts.length, 'the parent has the correct number of children'); + assert.equal(user.thingIds.length, posts.length, 'the parent has the correct number of children ids'); - posts.forEach((post, i) => { - assert.deepEqual(user.things.models[i], posts[i], 'each child is in parent.children array'); + posts.forEach((post, i) => { + assert.deepEqual(user.things.models[i], posts[i], 'each child is in parent.children array'); - if (post.isSaved()) { - assert.ok(user.thingIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'each saved child id is in parent.childrenIds array'); - } + if (post.isSaved()) { + assert.ok(user.thingIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'each saved child id is in parent.childrenIds array'); + } - // Check the inverse - assert.deepEqual(post.user.attrs, user.attrs); - assert.deepEqual(post.userId, user.id); - }); - }); + // Check the inverse + assert.deepEqual(post.user.attrs, user.attrs); + assert.deepEqual(post.userId, user.id); + }); + }); -}); + }); + } +); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-create-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-create-test.js index d470f0195..074c32a4a 100644 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-create-test.js +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-create-test.js @@ -1,36 +1,39 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Mixed | One To Many Polymorphic | association #create', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Mixed | One To Many Polymorphic | association #create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can create a has-many association, for all states -*/ -states.forEach((state) => { + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.things.models.length; + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.things.models.length; - let post = user.createThing('post', { title: 'Lorem ipsum' }); + let post = user.createThing('post', { title: 'Lorem ipsum' }); - assert.ok(post.id, 'the child was persisted'); - assert.equal(user.things.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.things.includes(post), 'the model was added to user.posts'); - assert.ok(user.thingIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'the id was added to the fks array'); - assert.ok(user.attrs.thingIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'fks were persisted'); + assert.ok(post.id, 'the child was persisted'); + assert.equal(user.things.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.things.includes(post), 'the model was added to user.posts'); + assert.ok(user.thingIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'the id was added to the fks array'); + assert.ok(user.attrs.thingIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'fks were persisted'); - // Check the inverse - assert.deepEqual(post.user.attrs, user.attrs); - assert.deepEqual(post.userId, user.id); - }); + // Check the inverse + assert.deepEqual(post.user.attrs, user.attrs); + assert.deepEqual(post.userId, user.id); + }); -}); + }); + } +); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-new-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-new-test.js index 942bc5014..531f7d646 100644 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-new-test.js +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-new-test.js @@ -1,35 +1,38 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Mixed | One To Many Polymorphic | association #new', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Mixed | One To Many Polymorphic | association #new', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can make a new unsaved belongs-to association, for all states -*/ + /* + The model can make a new unsaved belongs-to association, for all states + */ -states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.things.models.length; + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.things.models.length; - let post = user.newThing('post', { title: 'Lorem ipsum' }); + let post = user.newThing('post', { title: 'Lorem ipsum' }); - assert.ok(!post.id, 'the child was not persisted'); - assert.equal(user.things.models.length, initialCount + 1); + assert.ok(!post.id, 'the child was not persisted'); + assert.equal(user.things.models.length, initialCount + 1); - post.save(); + post.save(); - assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum', userId: user.id }, 'the child was persisted'); - assert.equal(user.things.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.things.includes(post), 'the model was added to user.things'); - assert.ok(user.thingIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'the id was added to the fks array'); - }); + assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum', userId: user.id }, 'the child was persisted'); + assert.equal(user.things.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.things.includes(post), 'the model was added to user.things'); + assert.ok(user.thingIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'the id was added to the fks array'); + }); -}); + }); + } +); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-ids-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-ids-test.js index ad5a51588..d09b59de4 100644 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-ids-test.js +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-ids-test.js @@ -1,59 +1,62 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Mixed | One To Many Polymorphic | association #setIds', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Mixed | One To Many Polymorphic | association #setIds', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parentId, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let savedPost = this.helper.savedChild(); + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let savedPost = this.helper.savedChild(); - user.thingIds = [ { type: 'post', id: savedPost.id } ]; + user.thingIds = [ { type: 'post', id: savedPost.id } ]; - assert.ok(user.things.includes(savedPost)); - assert.deepEqual(user.thingIds, [ { type: 'post', id: savedPost.id } ]); + assert.ok(user.things.includes(savedPost)); + assert.deepEqual(user.thingIds, [ { type: 'post', id: savedPost.id } ]); - user.save(); - savedPost.reload(); + user.save(); + savedPost.reload(); - // Check the inverse - assert.deepEqual(savedPost.user.attrs, user.attrs); - assert.equal(savedPost.userId, user.id); + // Check the inverse + assert.deepEqual(savedPost.user.attrs, user.attrs); + assert.equal(savedPost.userId, user.id); - // Check old associates - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); - }); + // Check old associates + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } + }); + }); - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); - user.thingIds = null; + user.thingIds = null; - assert.deepEqual(user.things.models, []); - assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.things.models, []); + assert.deepEqual(user.thingIds, []); - user.save(); + user.save(); - // Check old associates - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); - }); + // Check old associates + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } + }); + }); -}); + }); + } +); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-test.js index 490f481d4..322216a87 100644 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-test.js +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-test.js @@ -1,89 +1,92 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Mixed | One To Many Polymorphic | association #set', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Mixed | One To Many Polymorphic | association #set', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -/* - The model can update its association via parent, for all states -*/ -states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let savedPost = this.helper.savedChild(); + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let savedPost = this.helper.savedChild(); - user.things = [ savedPost ]; + user.things = [ savedPost ]; - assert.ok(user.things.includes(savedPost)); - assert.ok(user.thingIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); + assert.ok(user.things.includes(savedPost)); + assert.ok(user.thingIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); - user.save(); + user.save(); - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); - }); + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } + }); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let newPost = this.helper.newChild(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let newPost = this.helper.newChild(); - user.things = [ newPost ]; + user.things = [ newPost ]; - assert.deepEqual(user.thingIds, [ { type: 'post', id: undefined } ]); - assert.ok(user.things.includes(newPost)); + assert.deepEqual(user.thingIds, [ { type: 'post', id: undefined } ]); + assert.ok(user.things.includes(newPost)); - user.save(); + user.save(); - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); - }); + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } + }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); - user.things = [ ]; + user.things = [ ]; - assert.deepEqual(user.thingIds, [ ]); - assert.equal(user.things.models.length, 0); + assert.deepEqual(user.thingIds, [ ]); + assert.equal(user.things.models.length, 0); - user.save(); + user.save(); - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); - }); + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } + }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); - user.things = null; + user.things = null; - assert.deepEqual(user.thingIds, [ ]); - assert.equal(user.things.models.length, 0); + assert.deepEqual(user.thingIds, [ ]); + assert.equal(user.things.models.length, 0); - user.save(); + user.save(); - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); - }); + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } + }); + }); -}); + }); + } +); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/create-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/create-test.js index 5dd60580e..9caccd993 100644 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/create-test.js +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/create-test.js @@ -2,64 +2,67 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | ORM | Mixed | One To Many Polymorphic | create', { - beforeEach() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - } -}); +module( + 'Integration | ORM | Mixed | One To Many Polymorphic | create', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + }); -test('it sets up associations correctly when passing in the foreign key', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - thingIds: [ { type: 'post', id: post.id } ] - }); - post.reload(); + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + thingIds: [ { type: 'post', id: post.id } ] + }); + post.reload(); - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); - assert.ok(user.things.includes(post)); - assert.deepEqual(post.user.attrs, user.attrs); + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); + assert.ok(user.things.includes(post)); + assert.deepEqual(post.user.attrs, user.attrs); - let { db } = this.helper; - assert.equal(db.posts.length, 1); - assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); - assert.equal(db.users.length, 1); - assert.deepEqual(db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); -}); + let { db } = this.helper; + assert.equal(db.posts.length, 1); + assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); + assert.equal(db.users.length, 1); + assert.deepEqual(db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); + }); -test('it sets up associations correctly when passing in an array of models', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - things: [ post ] - }); + test('it sets up associations correctly when passing in an array of models', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + things: [ post ] + }); - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); - assert.ok(user.things.includes(post)); - assert.deepEqual(post.user.attrs, user.attrs); + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); + assert.ok(user.things.includes(post)); + assert.deepEqual(post.user.attrs, user.attrs); - let { db } = this.helper; - assert.equal(db.posts.length, 1); - assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); - assert.equal(db.users.length, 1); - assert.deepEqual(db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); -}); + let { db } = this.helper; + assert.equal(db.posts.length, 1); + assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); + assert.equal(db.users.length, 1); + assert.deepEqual(db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); + }); -test('it sets up associations correctly when passing in a collection', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - things: this.helper.schema.posts.all() - }); - post.reload(); + test('it sets up associations correctly when passing in a collection', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + things: this.helper.schema.posts.all() + }); + post.reload(); - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); - assert.ok(user.things.includes(post)); + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); + assert.ok(user.things.includes(post)); - let { db } = this.helper; - assert.equal(db.posts.length, 1); - assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); - assert.equal(db.users.length, 1); - assert.deepEqual(db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); -}); + let { db } = this.helper; + assert.equal(db.posts.length, 1); + assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); + assert.equal(db.users.length, 1); + assert.deepEqual(db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); + }); + } +); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/delete-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/delete-test.js index 278ef454c..add43f760 100644 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/delete-test.js +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/delete-test.js @@ -1,24 +1,27 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Mixed | One To Many Polymorphic | delete', { - beforeEach() { - this.helper = new Helper(); - } -}); +module( + 'Integration | ORM | Mixed | One To Many Polymorphic | delete', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); -states.forEach((state) => { + states.forEach((state) => { - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ user, posts ] = this.helper[state](); + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ user, posts ] = this.helper[state](); - if (posts && posts.length) { - posts.forEach(p => p.destroy()); - user.reload(); - } + if (posts && posts.length) { + posts.forEach(p => p.destroy()); + user.reload(); + } - assert.equal(user.things.length, 0); - assert.equal(user.thingIds.length, 0); - }); + assert.equal(user.things.length, 0); + assert.equal(user.thingIds.length, 0); + }); -}); + }); + } +); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/instantiating-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/instantiating-test.js index 48b2c0584..be0f9b7e3 100644 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/instantiating-test.js +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/instantiating-test.js @@ -1,81 +1,84 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module('Integration | ORM | Mixed | One To Many Polymorphic | instantiating', { - beforeEach() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module( + 'Integration | ORM | Mixed | One To Many Polymorphic | instantiating', + function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the parent accepts a saved child id', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ + thingIds: [ { type: 'post', id: post.id } ] + }); + + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.things.models[0], post); + }); + + test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ thingIds: [ { type: 'post', id: 2 } ] }); + }, /You're instantiating a user that has a thingIds of post:2, but some of those records don't exist in the database/); + }); + + test('the parent accepts null children foreign key', function(assert) { + let user = this.schema.users.new({ thingIds: null }); + + assert.equal(user.things.models.length, 0); + assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.attrs, { thingIds: null }); + }); + + test('the parent accepts saved children', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ things: [ post ] }); + + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.things.models[0], post); + }); + + test('the parent accepts new children', function(assert) { + let post = this.schema.posts.new({ title: 'Lorem' }); + let user = this.schema.users.new({ things: [ post ] }); + + assert.deepEqual(user.thingIds, [ { type: 'post', id: undefined } ]); + assert.deepEqual(user.things.models[0], post); + }); + + test('the parent accepts null children', function(assert) { + let user = this.schema.users.new({ things: null }); + + assert.equal(user.things.models.length, 0); + assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.attrs, { thingIds: null }); + }); + + test('the parent accepts children and child ids', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ things: [ post ], thingIds: [ { type: 'post', id: post.id } ] }); + + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.things.models[0], post); + }); + + test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let user = this.schema.users.new({}); + + assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.things.models, []); + assert.deepEqual(user.attrs, { thingIds: null }); + }); + + test('the parent accepts no reference to children or child ids', function(assert) { + let user = this.schema.users.new(); + + assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.things.models, []); + assert.deepEqual(user.attrs, { thingIds: null }); + }); } -}); - -test('the parent accepts a saved child id', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ - thingIds: [ { type: 'post', id: post.id } ] - }); - - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.things.models[0], post); -}); - -test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ thingIds: [ { type: 'post', id: 2 } ] }); - }, /You're instantiating a user that has a thingIds of post:2, but some of those records don't exist in the database/); -}); - -test('the parent accepts null children foreign key', function(assert) { - let user = this.schema.users.new({ thingIds: null }); - - assert.equal(user.things.models.length, 0); - assert.deepEqual(user.thingIds, []); - assert.deepEqual(user.attrs, { thingIds: null }); -}); - -test('the parent accepts saved children', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ things: [ post ] }); - - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.things.models[0], post); -}); - -test('the parent accepts new children', function(assert) { - let post = this.schema.posts.new({ title: 'Lorem' }); - let user = this.schema.users.new({ things: [ post ] }); - - assert.deepEqual(user.thingIds, [ { type: 'post', id: undefined } ]); - assert.deepEqual(user.things.models[0], post); -}); - -test('the parent accepts null children', function(assert) { - let user = this.schema.users.new({ things: null }); - - assert.equal(user.things.models.length, 0); - assert.deepEqual(user.thingIds, []); - assert.deepEqual(user.attrs, { thingIds: null }); -}); - -test('the parent accepts children and child ids', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ things: [ post ], thingIds: [ { type: 'post', id: post.id } ] }); - - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.things.models[0], post); -}); - -test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let user = this.schema.users.new({}); - - assert.deepEqual(user.thingIds, []); - assert.deepEqual(user.things.models, []); - assert.deepEqual(user.attrs, { thingIds: null }); -}); - -test('the parent accepts no reference to children or child ids', function(assert) { - let user = this.schema.users.new(); - - assert.deepEqual(user.thingIds, []); - assert.deepEqual(user.things.models, []); - assert.deepEqual(user.attrs, { thingIds: null }); -}); +); diff --git a/tests/integration/orm/reinitialize-associations-test.js b/tests/integration/orm/reinitialize-associations-test.js index 7d31a8f91..7f65409ef 100644 --- a/tests/integration/orm/reinitialize-associations-test.js +++ b/tests/integration/orm/reinitialize-associations-test.js @@ -10,8 +10,8 @@ var User = Model.extend({ }); var Address = Model.extend(); -module('Integration | ORM | reinitialize associations', { - beforeEach() { +module('Integration | ORM | reinitialize associations', function(hooks) { + hooks.beforeEach(function() { this.schema = new Schema(new Db(), { address: Address, user: User @@ -19,14 +19,14 @@ module('Integration | ORM | reinitialize associations', { this.schema.addresses.create({ id: 1, country: 'Hyrule' }); this.schema.users.create({ id: 1, name: 'Link', addressIds: [ 1 ] }); - } -}); + }); -// By running two tests, we force the statically-defined classes to be -// registered twice. -test('safely initializes associations', function(assert) { - assert.equal(this.schema.users.find(1).addresses.models[0].country, 'Hyrule'); -}); -test('safely initializes associations again', function(assert) { - assert.equal(this.schema.users.find(1).addresses.models[0].country, 'Hyrule'); + // By running two tests, we force the statically-defined classes to be + // registered twice. + test('safely initializes associations', function(assert) { + assert.equal(this.schema.users.find(1).addresses.models[0].country, 'Hyrule'); + }); + test('safely initializes associations again', function(assert) { + assert.equal(this.schema.users.find(1).addresses.models[0].country, 'Hyrule'); + }); }); diff --git a/tests/integration/orm/schema-verification/belongs-to-test.js b/tests/integration/orm/schema-verification/belongs-to-test.js index b36db410e..d43fab15e 100644 --- a/tests/integration/orm/schema-verification/belongs-to-test.js +++ b/tests/integration/orm/schema-verification/belongs-to-test.js @@ -3,186 +3,186 @@ import Schema from 'ember-cli-mirage/orm/schema'; import Db from 'ember-cli-mirage/db'; import { module, test } from 'qunit'; -module('Integration | ORM | Schema Verification | Belongs To'); - -test('a one-way belongsTo association is correct', function(assert) { - let schema = new Schema(new Db({ - authors: [ - { id: 1, name: 'Frodo' } - ], - posts: [ - { id: 1, title: 'Lorem ipsum' } - ] - }), { - author: Model.extend(), - post: Model.extend({ - author: belongsTo() - }) +module('Integration | ORM | Schema Verification | Belongs To', function() { + test('a one-way belongsTo association is correct', function(assert) { + let schema = new Schema(new Db({ + authors: [ + { id: 1, name: 'Frodo' } + ], + posts: [ + { id: 1, title: 'Lorem ipsum' } + ] + }), { + author: Model.extend(), + post: Model.extend({ + author: belongsTo() + }) + }); + + let post = schema.posts.find(1); + let association = post.associationFor('author'); + let frodo = schema.authors.find(1); + + assert.equal(association.key, 'author'); + assert.equal(association.modelName, 'author'); + assert.equal(association.ownerModelName, 'post'); + assert.ok(frodo.inverseFor(association) === null, 'there is no inverse'); }); - let post = schema.posts.find(1); - let association = post.associationFor('author'); - let frodo = schema.authors.find(1); - - assert.equal(association.key, 'author'); - assert.equal(association.modelName, 'author'); - assert.equal(association.ownerModelName, 'post'); - assert.ok(frodo.inverseFor(association) === null, 'there is no inverse'); -}); - -test('a one-way named belongsTo association is correct', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ], - posts: [ - { id: 1, title: 'Lorem ipsum' } - ] - }), { - user: Model.extend(), - post: Model.extend({ - author: belongsTo('user') - }) + test('a one-way named belongsTo association is correct', function(assert) { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ], + posts: [ + { id: 1, title: 'Lorem ipsum' } + ] + }), { + user: Model.extend(), + post: Model.extend({ + author: belongsTo('user') + }) + }); + + let post = schema.posts.find(1); + let association = post.associationFor('author'); + let frodo = schema.users.find(1); + + assert.equal(association.key, 'author'); + assert.equal(association.modelName, 'user'); + assert.equal(association.ownerModelName, 'post'); + assert.ok(frodo.inverseFor(association) === null, 'there is no inverse'); }); - let post = schema.posts.find(1); - let association = post.associationFor('author'); - let frodo = schema.users.find(1); - - assert.equal(association.key, 'author'); - assert.equal(association.modelName, 'user'); - assert.equal(association.ownerModelName, 'post'); - assert.ok(frodo.inverseFor(association) === null, 'there is no inverse'); -}); - -test('a reflexive belongsTo association is correct and has an implicit inverse', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ] - }), { - user: Model.extend({ - user: belongsTo() - }) + test('a reflexive belongsTo association is correct and has an implicit inverse', function(assert) { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ] + }), { + user: Model.extend({ + user: belongsTo() + }) + }); + + let frodo = schema.users.find(1); + let association = frodo.associationFor('user'); + + assert.equal(association.key, 'user'); + assert.equal(association.modelName, 'user'); + assert.equal(association.ownerModelName, 'user'); + assert.ok(frodo.inverseFor(association) === association, 'the implicit inverse was found'); }); - let frodo = schema.users.find(1); - let association = frodo.associationFor('user'); - - assert.equal(association.key, 'user'); - assert.equal(association.modelName, 'user'); - assert.equal(association.ownerModelName, 'user'); - assert.ok(frodo.inverseFor(association) === association, 'the implicit inverse was found'); -}); - -test('a named reflexive belongsTo association with an implicit inverse is correct', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ] - }), { - user: Model.extend({ - bestFriend: belongsTo('user') - }) + test('a named reflexive belongsTo association with an implicit inverse is correct', function(assert) { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ] + }), { + user: Model.extend({ + bestFriend: belongsTo('user') + }) + }); + + let frodo = schema.users.find(1); + let association = frodo.associationFor('bestFriend'); + + assert.equal(association.key, 'bestFriend'); + assert.equal(association.modelName, 'user'); + assert.equal(association.ownerModelName, 'user'); + assert.ok(frodo.inverseFor(association) === association, 'the implicit inverse was found'); }); - let frodo = schema.users.find(1); - let association = frodo.associationFor('bestFriend'); - - assert.equal(association.key, 'bestFriend'); - assert.equal(association.modelName, 'user'); - assert.equal(association.ownerModelName, 'user'); - assert.ok(frodo.inverseFor(association) === association, 'the implicit inverse was found'); -}); - -test('a named reflexive belongsTo association with an explicit inverse is correct', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ] - }), { - user: Model.extend({ - bestFriend: belongsTo('user', { inverse: 'bestFriend' }) - }) + test('a named reflexive belongsTo association with an explicit inverse is correct', function(assert) { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ] + }), { + user: Model.extend({ + bestFriend: belongsTo('user', { inverse: 'bestFriend' }) + }) + }); + + let frodo = schema.users.find(1); + let association = frodo.associationFor('bestFriend'); + + assert.equal(association.key, 'bestFriend'); + assert.equal(association.modelName, 'user'); + assert.equal(association.ownerModelName, 'user'); + assert.ok(frodo.inverseFor(association) === association, 'the explicit inverse was found'); }); - let frodo = schema.users.find(1); - let association = frodo.associationFor('bestFriend'); - - assert.equal(association.key, 'bestFriend'); - assert.equal(association.modelName, 'user'); - assert.equal(association.ownerModelName, 'user'); - assert.ok(frodo.inverseFor(association) === association, 'the explicit inverse was found'); -}); - -test('a one-way reflexive belongsTo association with a null inverse is correct', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ] - }), { - user: Model.extend({ - user: belongsTo('user', { inverse: null }) - }) + test('a one-way reflexive belongsTo association with a null inverse is correct', function(assert) { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ] + }), { + user: Model.extend({ + user: belongsTo('user', { inverse: null }) + }) + }); + + let frodo = schema.users.find(1); + let association = frodo.associationFor('user'); + + assert.equal(association.key, 'user'); + assert.equal(association.modelName, 'user'); + assert.equal(association.ownerModelName, 'user'); + assert.ok(frodo.inverseFor(association) === null, 'there is no inverse'); }); - let frodo = schema.users.find(1); - let association = frodo.associationFor('user'); - - assert.equal(association.key, 'user'); - assert.equal(association.modelName, 'user'); - assert.equal(association.ownerModelName, 'user'); - assert.ok(frodo.inverseFor(association) === null, 'there is no inverse'); -}); - -test('a named one-way way reflexive belongsTo association with a null inverse is correct', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ] - }), { - user: Model.extend({ - parent: belongsTo('user', { inverse: null }) - }) + test('a named one-way way reflexive belongsTo association with a null inverse is correct', function(assert) { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ] + }), { + user: Model.extend({ + parent: belongsTo('user', { inverse: null }) + }) + }); + + let frodo = schema.users.find(1); + let association = frodo.associationFor('parent'); + + assert.equal(association.key, 'parent'); + assert.equal(association.modelName, 'user'); + assert.equal(association.ownerModelName, 'user'); + assert.ok(frodo.inverseFor(association) === null, 'there is no inverse'); }); - let frodo = schema.users.find(1); - let association = frodo.associationFor('parent'); - - assert.equal(association.key, 'parent'); - assert.equal(association.modelName, 'user'); - assert.equal(association.ownerModelName, 'user'); - assert.ok(frodo.inverseFor(association) === null, 'there is no inverse'); -}); - -test('a one-to-one belongsTo association with an implicit inverse is correct', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ], - profiles: [ - { id: 1, type: 'Admin' } - ] - }), { - user: Model.extend({ - profile: belongsTo() - }), - profile: Model.extend({ - user: belongsTo() - }) + test('a one-to-one belongsTo association with an implicit inverse is correct', function(assert) { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ], + profiles: [ + { id: 1, type: 'Admin' } + ] + }), { + user: Model.extend({ + profile: belongsTo() + }), + profile: Model.extend({ + user: belongsTo() + }) + }); + + let admin = schema.profiles.find(1); + let association = admin.associationFor('user'); + + assert.equal(association.key, 'user'); + assert.equal(association.modelName, 'user'); + assert.equal(association.ownerModelName, 'profile'); + + let frodo = schema.users.find(1); + let inverse = frodo.inverseFor(association); + + assert.equal(inverse.key, 'profile'); + assert.equal(inverse.modelName, 'profile'); + assert.equal(inverse.ownerModelName, 'user'); }); - - let admin = schema.profiles.find(1); - let association = admin.associationFor('user'); - - assert.equal(association.key, 'user'); - assert.equal(association.modelName, 'user'); - assert.equal(association.ownerModelName, 'profile'); - - let frodo = schema.users.find(1); - let inverse = frodo.inverseFor(association); - - assert.equal(inverse.key, 'profile'); - assert.equal(inverse.modelName, 'profile'); - assert.equal(inverse.ownerModelName, 'user'); }); diff --git a/tests/integration/orm/schema-verification/has-many-test.js b/tests/integration/orm/schema-verification/has-many-test.js index 106cdf3c1..55c2498af 100644 --- a/tests/integration/orm/schema-verification/has-many-test.js +++ b/tests/integration/orm/schema-verification/has-many-test.js @@ -3,79 +3,79 @@ import Schema from 'ember-cli-mirage/orm/schema'; import Db from 'ember-cli-mirage/db'; import { module, test } from 'qunit'; -module('Integration | ORM | Schema Verification | Has Many'); +module('Integration | ORM | Schema Verification | Has Many', function() { + test('a one-way has many association is correct', function(assert) { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ], + posts: [ + { id: 1, title: 'Lorem' } + ] + }), { + user: Model.extend({ + posts: hasMany() + }), + post: Model.extend() + }); -test('a one-way has many association is correct', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ], - posts: [ - { id: 1, title: 'Lorem' } - ] - }), { - user: Model.extend({ - posts: hasMany() - }), - post: Model.extend() - }); - - let frodo = schema.users.find(1); - let association = frodo.associationFor('posts'); + let frodo = schema.users.find(1); + let association = frodo.associationFor('posts'); - assert.equal(association.key, 'posts'); - assert.equal(association.modelName, 'post'); - assert.equal(association.ownerModelName, 'user'); + assert.equal(association.key, 'posts'); + assert.equal(association.modelName, 'post'); + assert.equal(association.ownerModelName, 'user'); - let post = schema.posts.find(1); - - assert.ok(post.inverseFor(association) === null, 'there is no inverse'); -}); + let post = schema.posts.find(1); -test('a named one-way has many association is correct', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ], - posts: [ - { id: 1, title: 'Lorem' } - ] - }), { - user: Model.extend({ - blogPosts: hasMany('post') - }), - post: Model.extend() + assert.ok(post.inverseFor(association) === null, 'there is no inverse'); }); - let frodo = schema.users.find(1); - let association = frodo.associationFor('blogPosts'); + test('a named one-way has many association is correct', function(assert) { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ], + posts: [ + { id: 1, title: 'Lorem' } + ] + }), { + user: Model.extend({ + blogPosts: hasMany('post') + }), + post: Model.extend() + }); - assert.equal(association.key, 'blogPosts'); - assert.equal(association.modelName, 'post'); - assert.equal(association.ownerModelName, 'user'); + let frodo = schema.users.find(1); + let association = frodo.associationFor('blogPosts'); - let post = schema.posts.find(1); + assert.equal(association.key, 'blogPosts'); + assert.equal(association.modelName, 'post'); + assert.equal(association.ownerModelName, 'user'); - assert.ok(post.inverseFor(association) === null, 'there is no inverse'); -}); + let post = schema.posts.find(1); -test('a reflexive hasMany association with an implicit inverse is correct', function(assert) { - let schema = new Schema(new Db({ - tags: [ - { id: 1, name: 'economics' } - ] - }), { - tag: Model.extend({ - tags: hasMany() - }) + assert.ok(post.inverseFor(association) === null, 'there is no inverse'); }); - let tag = schema.tags.find(1); - let association = tag.associationFor('tags'); + test('a reflexive hasMany association with an implicit inverse is correct', function(assert) { + let schema = new Schema(new Db({ + tags: [ + { id: 1, name: 'economics' } + ] + }), { + tag: Model.extend({ + tags: hasMany() + }) + }); + + let tag = schema.tags.find(1); + let association = tag.associationFor('tags'); - assert.equal(association.key, 'tags'); - assert.equal(association.modelName, 'tag'); - assert.equal(association.ownerModelName, 'tag'); + assert.equal(association.key, 'tags'); + assert.equal(association.modelName, 'tag'); + assert.equal(association.ownerModelName, 'tag'); - assert.ok(tag.inverseFor(association) === association, 'the implicit inverse was found'); + assert.ok(tag.inverseFor(association) === association, 'the implicit inverse was found'); + }); }); diff --git a/tests/integration/orm/schema-verification/mixed-test.js b/tests/integration/orm/schema-verification/mixed-test.js index d12e34ecb..52a277ebf 100644 --- a/tests/integration/orm/schema-verification/mixed-test.js +++ b/tests/integration/orm/schema-verification/mixed-test.js @@ -3,123 +3,123 @@ import Schema from 'ember-cli-mirage/orm/schema'; import Db from 'ember-cli-mirage/db'; import { module, test } from 'qunit'; -module('Integration | ORM | Schema Verification | Mixed'); - -test('unnamed one-to-many associations are correct', function(assert) { - let schema = new Schema(new Db({ - wordSmiths: [ - { id: 1, name: 'Frodo' } - ], - blogPosts: [ - { id: 1, title: 'Lorem' } - ] - }), { - wordSmith: Model.extend({ - blogPosts: hasMany() - }), - blogPost: Model.extend({ - wordSmith: belongsTo() - }) +module('Integration | ORM | Schema Verification | Mixed', function() { + test('unnamed one-to-many associations are correct', function(assert) { + let schema = new Schema(new Db({ + wordSmiths: [ + { id: 1, name: 'Frodo' } + ], + blogPosts: [ + { id: 1, title: 'Lorem' } + ] + }), { + wordSmith: Model.extend({ + blogPosts: hasMany() + }), + blogPost: Model.extend({ + wordSmith: belongsTo() + }) + }); + + let frodo = schema.wordSmiths.find(1); + let association = frodo.associationFor('blogPosts'); + + assert.equal(association.key, 'blogPosts'); + assert.equal(association.modelName, 'blog-post'); + assert.equal(association.ownerModelName, 'word-smith'); + + let post = schema.blogPosts.find(1); + + assert.deepEqual(post.inverseFor(association), post.associationFor('wordSmith')); }); - let frodo = schema.wordSmiths.find(1); - let association = frodo.associationFor('blogPosts'); - - assert.equal(association.key, 'blogPosts'); - assert.equal(association.modelName, 'blog-post'); - assert.equal(association.ownerModelName, 'word-smith'); - - let post = schema.blogPosts.find(1); - - assert.deepEqual(post.inverseFor(association), post.associationFor('wordSmith')); -}); - -test('a named one-to-many association is correct', function(assert) { - let schema = new Schema(new Db({ - wordSmiths: [ - { id: 1, name: 'Frodo' } - ], - blogPosts: [ - { id: 1, title: 'Lorem' } - ] - }), { - wordSmith: Model.extend({ - posts: hasMany('blog-post') - }), - blogPost: Model.extend({ - author: belongsTo('word-smith') - }) + test('a named one-to-many association is correct', function(assert) { + let schema = new Schema(new Db({ + wordSmiths: [ + { id: 1, name: 'Frodo' } + ], + blogPosts: [ + { id: 1, title: 'Lorem' } + ] + }), { + wordSmith: Model.extend({ + posts: hasMany('blog-post') + }), + blogPost: Model.extend({ + author: belongsTo('word-smith') + }) + }); + + let frodo = schema.wordSmiths.find(1); + let association = frodo.associationFor('posts'); + + assert.equal(association.key, 'posts'); + assert.equal(association.modelName, 'blog-post'); + assert.equal(association.ownerModelName, 'word-smith'); + + let post = schema.blogPosts.find(1); + + assert.deepEqual(post.inverseFor(association), post.associationFor('author')); }); - let frodo = schema.wordSmiths.find(1); - let association = frodo.associationFor('posts'); - - assert.equal(association.key, 'posts'); - assert.equal(association.modelName, 'blog-post'); - assert.equal(association.ownerModelName, 'word-smith'); - - let post = schema.blogPosts.find(1); - - assert.deepEqual(post.inverseFor(association), post.associationFor('author')); -}); - -test('multiple has-many associations of the same type', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ], - posts: [ - { id: 1, title: 'Lorem' } - ] - }), { - user: Model.extend({ - notes: hasMany('post', { inverse: 'author' }), - messages: hasMany('post', { inverse: 'messenger' }) - }), - post: Model.extend({ - author: belongsTo('user', { inverse: 'notes' }), - messenger: belongsTo('user', { inverse: 'messages' }) - }) + test('multiple has-many associations of the same type', function(assert) { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ], + posts: [ + { id: 1, title: 'Lorem' } + ] + }), { + user: Model.extend({ + notes: hasMany('post', { inverse: 'author' }), + messages: hasMany('post', { inverse: 'messenger' }) + }), + post: Model.extend({ + author: belongsTo('user', { inverse: 'notes' }), + messenger: belongsTo('user', { inverse: 'messages' }) + }) + }); + + let frodo = schema.users.find(1); + let notesAssociation = frodo.associationFor('notes'); + + assert.equal(notesAssociation.key, 'notes'); + assert.equal(notesAssociation.modelName, 'post'); + assert.equal(notesAssociation.ownerModelName, 'user'); + + let post = schema.posts.find(1); + + assert.deepEqual(post.inverseFor(notesAssociation), post.associationFor('author')); + + let messagesAssociation = frodo.associationFor('messages'); + + assert.equal(messagesAssociation.key, 'messages'); + assert.equal(messagesAssociation.modelName, 'post'); + assert.equal(messagesAssociation.ownerModelName, 'user'); + + assert.deepEqual(post.inverseFor(messagesAssociation), post.associationFor('messenger')); }); - let frodo = schema.users.find(1); - let notesAssociation = frodo.associationFor('notes'); - - assert.equal(notesAssociation.key, 'notes'); - assert.equal(notesAssociation.modelName, 'post'); - assert.equal(notesAssociation.ownerModelName, 'user'); - - let post = schema.posts.find(1); - - assert.deepEqual(post.inverseFor(notesAssociation), post.associationFor('author')); - - let messagesAssociation = frodo.associationFor('messages'); - - assert.equal(messagesAssociation.key, 'messages'); - assert.equal(messagesAssociation.modelName, 'post'); - assert.equal(messagesAssociation.ownerModelName, 'user'); - - assert.deepEqual(post.inverseFor(messagesAssociation), post.associationFor('messenger')); -}); - -test('one-to-many reflexive association is correct', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ] - }), { - user: Model.extend({ - parent: belongsTo('user', { inverse: 'children' }), - children: hasMany('user', { inverse: 'parent' }) - }) + test('one-to-many reflexive association is correct', function(assert) { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ] + }), { + user: Model.extend({ + parent: belongsTo('user', { inverse: 'children' }), + children: hasMany('user', { inverse: 'parent' }) + }) + }); + + let frodo = schema.users.find(1); + let parentAssociation = frodo.associationFor('parent'); + + assert.equal(parentAssociation.key, 'parent'); + assert.equal(parentAssociation.modelName, 'user'); + assert.equal(parentAssociation.ownerModelName, 'user'); + + assert.deepEqual(frodo.inverseFor(parentAssociation), frodo.associationFor('children')); }); - - let frodo = schema.users.find(1); - let parentAssociation = frodo.associationFor('parent'); - - assert.equal(parentAssociation.key, 'parent'); - assert.equal(parentAssociation.modelName, 'user'); - assert.equal(parentAssociation.ownerModelName, 'user'); - - assert.deepEqual(frodo.inverseFor(parentAssociation), frodo.associationFor('children')); }); diff --git a/tests/integration/orm/update-test.js b/tests/integration/orm/update-test.js index dfbf0c80f..6e55a8ee2 100644 --- a/tests/integration/orm/update-test.js +++ b/tests/integration/orm/update-test.js @@ -3,8 +3,8 @@ import Model from 'ember-cli-mirage/orm/model'; import Db from 'ember-cli-mirage/db'; import {module, test} from 'qunit'; -module('Integration | ORM | update', { - beforeEach() { +module('Integration | ORM | update', function(hooks) { + hooks.beforeEach(function() { this.db = new Db({ users: [ { id: 1, name: 'Link', location: 'Hyrule', evil: false }, @@ -15,74 +15,74 @@ module('Integration | ORM | update', { this.schema = new Schema(this.db, { user: Model }); - } -}); - -test('a collection can update its models with a key and value', function(assert) { - let collection = this.schema.users.all(); - collection.update('evil', true); - - assert.deepEqual(this.db.users, [ - { id: '1', name: 'Link', location: 'Hyrule', evil: true }, - { id: '2', name: 'Zelda', location: 'Hyrule', evil: true } - ]); - assert.deepEqual(collection.models[0].attrs, { id: '1', name: 'Link', location: 'Hyrule', evil: true }); -}); - -test('it can update its models with a hash of attrs', function(assert) { - let collection = this.schema.users.all(); - collection.update({ location: 'The water temple', evil: true }); - - assert.deepEqual(this.db.users, [ - { id: '1', name: 'Link', location: 'The water temple', evil: true }, - { id: '2', name: 'Zelda', location: 'The water temple', evil: true } - ]); - assert.deepEqual(collection.models[0].attrs, { id: '1', name: 'Link', location: 'The water temple', evil: true }); - assert.deepEqual(collection.models[1].attrs, { id: '2', name: 'Zelda', location: 'The water temple', evil: true }); -}); - -test('it can set an attribute and then save the model', function(assert) { - let user = this.schema.users.find(1); - - user.name = 'Young link'; - - assert.deepEqual(user.attrs, { id: '1', name: 'Young link', location: 'Hyrule', evil: false }); - assert.deepEqual(this.db.users.find(1), { id: '1', name: 'Link', location: 'Hyrule', evil: false }); - - user.save(); - - assert.deepEqual(user.attrs, { id: '1', name: 'Young link', location: 'Hyrule', evil: false }); - assert.deepEqual(this.db.users.find(1), { id: '1', name: 'Young link', location: 'Hyrule', evil: false }); -}); - -test('it can update and immediately persist a single attribute', function(assert) { - let link = this.schema.users.find(1); - link.update('evil', true); - - assert.deepEqual(link.attrs, { id: '1', name: 'Link', location: 'Hyrule', evil: true }); - assert.deepEqual(this.db.users.find(1), { id: '1', name: 'Link', location: 'Hyrule', evil: true }); -}); - -test('it can update a hash of attrs immediately', function(assert) { - var link = this.schema.users.find(1); - link.update({ name: 'Evil link', evil: true }); - - assert.deepEqual(link.attrs, { id: '1', name: 'Evil link', location: 'Hyrule', evil: true }); - assert.deepEqual(this.db.users.find(1), { id: '1', name: 'Evil link', location: 'Hyrule', evil: true }); -}); - -test('it can update a non-existing attribute', function(assert) { - var link = this.schema.users.find(1); - link.update({ name: 'Evil link', evil: true, reallyEvil: 'absolutely evil' }); - - assert.deepEqual(link.attrs, { id: '1', name: 'Evil link', location: 'Hyrule', evil: true, reallyEvil: 'absolutely evil' }); - assert.deepEqual(this.db.users.find(1), { id: '1', name: 'Evil link', location: 'Hyrule', evil: true, reallyEvil: 'absolutely evil' }); -}); - -test('if users sets incorrectly an attribute without using update, it will still work', function(assert) { - var link = this.schema.users.find(1); - link.reallyEvil = 'absolutely evil'; - link.update({ reallyEvil: 'a little flower', evil: true }); - assert.deepEqual(link.attrs, { id: '1', reallyEvil: 'a little flower', evil: true, location: 'Hyrule', name: 'Link' }); - assert.deepEqual(this.db.users.find(1), { id: '1', reallyEvil: 'a little flower', evil: true, location: 'Hyrule', name: 'Link' }); + }); + + test('a collection can update its models with a key and value', function(assert) { + let collection = this.schema.users.all(); + collection.update('evil', true); + + assert.deepEqual(this.db.users, [ + { id: '1', name: 'Link', location: 'Hyrule', evil: true }, + { id: '2', name: 'Zelda', location: 'Hyrule', evil: true } + ]); + assert.deepEqual(collection.models[0].attrs, { id: '1', name: 'Link', location: 'Hyrule', evil: true }); + }); + + test('it can update its models with a hash of attrs', function(assert) { + let collection = this.schema.users.all(); + collection.update({ location: 'The water temple', evil: true }); + + assert.deepEqual(this.db.users, [ + { id: '1', name: 'Link', location: 'The water temple', evil: true }, + { id: '2', name: 'Zelda', location: 'The water temple', evil: true } + ]); + assert.deepEqual(collection.models[0].attrs, { id: '1', name: 'Link', location: 'The water temple', evil: true }); + assert.deepEqual(collection.models[1].attrs, { id: '2', name: 'Zelda', location: 'The water temple', evil: true }); + }); + + test('it can set an attribute and then save the model', function(assert) { + let user = this.schema.users.find(1); + + user.name = 'Young link'; + + assert.deepEqual(user.attrs, { id: '1', name: 'Young link', location: 'Hyrule', evil: false }); + assert.deepEqual(this.db.users.find(1), { id: '1', name: 'Link', location: 'Hyrule', evil: false }); + + user.save(); + + assert.deepEqual(user.attrs, { id: '1', name: 'Young link', location: 'Hyrule', evil: false }); + assert.deepEqual(this.db.users.find(1), { id: '1', name: 'Young link', location: 'Hyrule', evil: false }); + }); + + test('it can update and immediately persist a single attribute', function(assert) { + let link = this.schema.users.find(1); + link.update('evil', true); + + assert.deepEqual(link.attrs, { id: '1', name: 'Link', location: 'Hyrule', evil: true }); + assert.deepEqual(this.db.users.find(1), { id: '1', name: 'Link', location: 'Hyrule', evil: true }); + }); + + test('it can update a hash of attrs immediately', function(assert) { + var link = this.schema.users.find(1); + link.update({ name: 'Evil link', evil: true }); + + assert.deepEqual(link.attrs, { id: '1', name: 'Evil link', location: 'Hyrule', evil: true }); + assert.deepEqual(this.db.users.find(1), { id: '1', name: 'Evil link', location: 'Hyrule', evil: true }); + }); + + test('it can update a non-existing attribute', function(assert) { + var link = this.schema.users.find(1); + link.update({ name: 'Evil link', evil: true, reallyEvil: 'absolutely evil' }); + + assert.deepEqual(link.attrs, { id: '1', name: 'Evil link', location: 'Hyrule', evil: true, reallyEvil: 'absolutely evil' }); + assert.deepEqual(this.db.users.find(1), { id: '1', name: 'Evil link', location: 'Hyrule', evil: true, reallyEvil: 'absolutely evil' }); + }); + + test('if users sets incorrectly an attribute without using update, it will still work', function(assert) { + var link = this.schema.users.find(1); + link.reallyEvil = 'absolutely evil'; + link.update({ reallyEvil: 'a little flower', evil: true }); + assert.deepEqual(link.attrs, { id: '1', reallyEvil: 'a little flower', evil: true, location: 'Hyrule', name: 'Link' }); + assert.deepEqual(this.db.users.find(1), { id: '1', reallyEvil: 'a little flower', evil: true, location: 'Hyrule', name: 'Link' }); + }); }); diff --git a/tests/integration/orm/where-test.js b/tests/integration/orm/where-test.js index 19c89e962..8e797b6d7 100644 --- a/tests/integration/orm/where-test.js +++ b/tests/integration/orm/where-test.js @@ -6,8 +6,9 @@ import {module, test} from 'qunit'; let schema; let User = Model.extend(); -module('Integration | ORM | #where', { - beforeEach() { + +module('Integration | ORM | #where', function(hooks) { + hooks.beforeEach(function() { let db = new Db({ users: [ { id: 1, name: 'Link', good: true }, { id: 2, name: 'Zelda', good: true }, @@ -17,32 +18,32 @@ module('Integration | ORM | #where', { schema = new Schema(db, { user: User }); - } -}); - -test('it returns models that match a query with where', function(assert) { - let users = schema.users.where({ good: false }); + }); - assert.ok(users instanceof Collection, 'it returns a collection'); - assert.equal(users.models.length, 1); - assert.ok(users.models[0] instanceof User); - assert.deepEqual(users.models[0].attrs, { id: '3', name: 'Ganon', good: false }); -}); + test('it returns models that match a query with where', function(assert) { + let users = schema.users.where({ good: false }); -test('it returns models that match using a query function', function(assert) { - let users = schema.users.where(function(rec) { - return !rec.good; + assert.ok(users instanceof Collection, 'it returns a collection'); + assert.equal(users.models.length, 1); + assert.ok(users.models[0] instanceof User); + assert.deepEqual(users.models[0].attrs, { id: '3', name: 'Ganon', good: false }); }); - assert.ok(users instanceof Collection, 'it returns a collection'); - assert.equal(users.models.length, 1); - assert.ok(users.models[0] instanceof User); - assert.deepEqual(users.models[0].attrs, { id: '3', name: 'Ganon', good: false }); -}); + test('it returns models that match using a query function', function(assert) { + let users = schema.users.where(function(rec) { + return !rec.good; + }); -test('it returns an empty collection if no models match a query', function(assert) { - let users = schema.users.where({ name: 'Link', good: false }); + assert.ok(users instanceof Collection, 'it returns a collection'); + assert.equal(users.models.length, 1); + assert.ok(users.models[0] instanceof User); + assert.deepEqual(users.models[0].attrs, { id: '3', name: 'Ganon', good: false }); + }); - assert.ok(users instanceof Collection, 'it returns a collection'); - assert.equal(users.models.length, 0); + test('it returns an empty collection if no models match a query', function(assert) { + let users = schema.users.where({ name: 'Link', good: false }); + + assert.ok(users instanceof Collection, 'it returns a collection'); + assert.equal(users.models.length, 0); + }); }); diff --git a/tests/integration/passthrough-test.js b/tests/integration/passthrough-test.js index 285137d5c..46c92dd98 100644 --- a/tests/integration/passthrough-test.js +++ b/tests/integration/passthrough-test.js @@ -1,239 +1,240 @@ import {module, test} from 'qunit'; import Server from 'ember-cli-mirage/server'; -module('Integration | Passthrough', { - beforeEach() { +module('Integration | Passthrough', function(hooks) { + hooks.beforeEach(function() { this.server = new Server({ environment: 'development' }); this.server.timing = 0; this.server.logging = false; - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); - } -}); + }); -test('it can passthrough individual paths', function(assert) { - assert.expect(2); - let done1 = assert.async(); - let done2 = assert.async(); - let { server } = this; + test('it can passthrough individual paths', function(assert) { + assert.expect(2); + let done1 = assert.async(); + let done2 = assert.async(); + let { server } = this; - server.loadConfig(function() { - this.get('/contacts', function() { - return 123; + server.loadConfig(function() { + this.get('/contacts', function() { + return 123; + }); + this.passthrough('/addresses'); }); - this.passthrough('/addresses'); - }); - $.ajax({ - method: 'GET', - url: '/contacts', - success(data) { - assert.equal(data, 123); - done1(); - } - }); + $.ajax({ + method: 'GET', + url: '/contacts', + success(data) { + assert.equal(data, 123); + done1(); + } + }); - $.ajax({ - method: 'GET', - url: '/addresses', - error(reason) { - assert.equal(reason.status, 404); - done2(); - } + $.ajax({ + method: 'GET', + url: '/addresses', + error(reason) { + assert.equal(reason.status, 404); + done2(); + } + }); }); -}); -test('it can passthrough certain verbs for individual paths', function(assert) { - assert.expect(3); - let done1 = assert.async(); - let done2 = assert.async(); - let done3 = assert.async(); - let { server } = this; + test('it can passthrough certain verbs for individual paths', function(assert) { + assert.expect(3); + let done1 = assert.async(); + let done2 = assert.async(); + let done3 = assert.async(); + let { server } = this; - server.loadConfig(function() { - this.get('/contacts', function() { - return 123; + server.loadConfig(function() { + this.get('/contacts', function() { + return 123; + }); + this.passthrough('/addresses', ['post']); + }); + server.pretender.unhandledRequest = function(/* verb, path */) { + assert.ok(true, 'it doesnt passthrough GET'); + done2(); + }; + + $.ajax({ + method: 'GET', + url: '/contacts', + success(data) { + assert.equal(data, 123); + done1(); + } }); - this.passthrough('/addresses', ['post']); - }); - server.pretender.unhandledRequest = function(/* verb, path */) { - assert.ok(true, 'it doesnt passthrough GET'); - done2(); - }; - - $.ajax({ - method: 'GET', - url: '/contacts', - success(data) { - assert.equal(data, 123); - done1(); - } - }); - $.ajax({ - method: 'GET', - url: '/addresses' - }); + $.ajax({ + method: 'GET', + url: '/addresses' + }); - $.ajax({ - method: 'POST', - url: '/addresses', - error(reason) { - assert.equal(reason.status, 404); - done3(); - } + $.ajax({ + method: 'POST', + url: '/addresses', + error(reason) { + assert.equal(reason.status, 404); + done3(); + } + }); }); -}); -test('it can passthrough multiple paths in a single call', function(assert) { - assert.expect(2); - let done1 = assert.async(); - let done2 = assert.async(); - let { server } = this; + test('it can passthrough multiple paths in a single call', function(assert) { + assert.expect(2); + let done1 = assert.async(); + let done2 = assert.async(); + let { server } = this; - server.loadConfig(function() { - this.get('/contacts', function() { - return 123; + server.loadConfig(function() { + this.get('/contacts', function() { + return 123; + }); + this.passthrough('/contacts', '/addresses'); }); - this.passthrough('/contacts', '/addresses'); - }); - $.ajax({ - method: 'GET', - url: '/contacts', - error(reason) { - assert.equal(reason.status, 404); - done1(); - } - }); + $.ajax({ + method: 'GET', + url: '/contacts', + error(reason) { + assert.equal(reason.status, 404); + done1(); + } + }); - $.ajax({ - method: 'POST', - url: '/addresses', - error(reason) { - assert.equal(reason.status, 404); - done2(); - } + $.ajax({ + method: 'POST', + url: '/addresses', + error(reason) { + assert.equal(reason.status, 404); + done2(); + } + }); }); -}); -test('user can call passthrough multiple times', function(assert) { - assert.expect(2); - let done1 = assert.async(); - let done2 = assert.async(); - let { server } = this; + test('user can call passthrough multiple times', function(assert) { + assert.expect(2); + let done1 = assert.async(); + let done2 = assert.async(); + let { server } = this; - server.loadConfig(function() { - this.passthrough('/contacts'); - this.passthrough('/addresses', ['post']); - }); + server.loadConfig(function() { + this.passthrough('/contacts'); + this.passthrough('/addresses', ['post']); + }); - $.ajax({ - method: 'GET', - url: '/contacts', - error(reason) { - assert.equal(reason.status, 404); - done1(); - } - }); + $.ajax({ + method: 'GET', + url: '/contacts', + error(reason) { + assert.equal(reason.status, 404); + done1(); + } + }); - $.ajax({ - method: 'POST', - url: '/addresses', - error(reason) { - assert.equal(reason.status, 404); - done2(); - } + $.ajax({ + method: 'POST', + url: '/addresses', + error(reason) { + assert.equal(reason.status, 404); + done2(); + } + }); }); -}); -test('passthrough without args allows all paths on the current domain to passthrough', function(assert) { - assert.expect(2); - let done1 = assert.async(); - let done2 = assert.async(); - let { server } = this; + test('passthrough without args allows all paths on the current domain to passthrough', function(assert) { + assert.expect(2); + let done1 = assert.async(); + let done2 = assert.async(); + let { server } = this; - server.loadConfig(function() { - this.get('/contacts', function() { - return 123; + server.loadConfig(function() { + this.get('/contacts', function() { + return 123; + }); + this.passthrough(); }); - this.passthrough(); - }); - $.ajax({ - method: 'GET', - url: '/contacts', - success(data) { - assert.equal(data, 123); - done1(); - } - }); + $.ajax({ + method: 'GET', + url: '/contacts', + success(data) { + assert.equal(data, 123); + done1(); + } + }); - $.ajax({ - method: 'GET', - url: '/addresses', - error(reason) { - assert.equal(reason.status, 404); - done2(); - } + $.ajax({ + method: 'GET', + url: '/addresses', + error(reason) { + assert.equal(reason.status, 404); + done2(); + } + }); }); -}); -test('passthrough without args allows index route on current domain to passthrough', function(assert) { - assert.expect(2); - let done1 = assert.async(); - let done2 = assert.async(); - let { server } = this; + test('passthrough without args allows index route on current domain to passthrough', function(assert) { + assert.expect(2); + let done1 = assert.async(); + let done2 = assert.async(); + let { server } = this; - server.loadConfig(function() { - this.get('/contacts', function() { - return 123; + server.loadConfig(function() { + this.get('/contacts', function() { + return 123; + }); + this.passthrough(); }); - this.passthrough(); - }); - $.ajax({ - method: 'GET', - url: '/contacts', - success(data) { - assert.equal(data, 123, 'contacts is intercepted'); - done1(); - } - }); + $.ajax({ + method: 'GET', + url: '/contacts', + success(data) { + assert.equal(data, 123, 'contacts is intercepted'); + done1(); + } + }); - $.ajax({ - method: 'GET', - url: '/', - error() { - done2(); // test will fail bc only 1 assertion, but we don't have to wait - }, - success(html) { - // a passthrough request to index on the current domain - // actually succeeds here, since that's where the test runner is served - assert.ok(html, '/ is passed through'); - done2(); // test will fail bc only 1 assertion, but we don't have to wait - } + $.ajax({ + method: 'GET', + url: '/', + error() { + done2(); // test will fail bc only 1 assertion, but we don't have to wait + }, + success(html) { + // a passthrough request to index on the current domain + // actually succeeds here, since that's where the test runner is served + assert.ok(html, '/ is passed through'); + done2(); // test will fail bc only 1 assertion, but we don't have to wait + } + }); }); -}); -test('it can passthrough other-origin hosts', function(assert) { - assert.expect(1); - let done1 = assert.async(); - let { server } = this; + test('it can passthrough other-origin hosts', function(assert) { + assert.expect(1); + let done1 = assert.async(); + let { server } = this; - server.loadConfig(function() { - this.passthrough('http://api.foo.bar/**'); - }); + server.loadConfig(function() { + this.passthrough('http://api.foo.bar/**'); + }); - $.ajax({ - method: 'GET', - url: 'http://api.foo.bar/contacts', - error() { - assert.ok(true); - done1(); - } + $.ajax({ + method: 'GET', + url: 'http://api.foo.bar/contacts', + error() { + assert.ok(true); + done1(); + } + }); }); }); diff --git a/tests/integration/route-handlers/delete-shorthand-test.js b/tests/integration/route-handlers/delete-shorthand-test.js index e22d15e80..c5a8c894c 100644 --- a/tests/integration/route-handlers/delete-shorthand-test.js +++ b/tests/integration/route-handlers/delete-shorthand-test.js @@ -5,9 +5,8 @@ import Mirage from 'ember-cli-mirage'; import DeleteShorthandRouteHandler from 'ember-cli-mirage/route-handlers/shorthands/delete'; import JSONAPISerializer from 'ember-cli-mirage/serializers/json-api-serializer'; -module('Integration | Route Handlers | DELETE shorthand', { - - beforeEach() { +module('Integration | Route Handlers | DELETE shorthand', function(hooks) { + hooks.beforeEach(function() { this.server = new Server({ environment: 'development', models: { @@ -31,61 +30,60 @@ module('Integration | Route Handlers | DELETE shorthand', { this.schema = this.server.schema; this.serializer = new JSONAPISerializer(); - }, + }); - afterEach() { + hooks.afterEach(function() { this.server.shutdown(); - } + }); -}); + test('undefined shorthand deletes the record and returns null', function(assert) { + let request = { url: '/word-smiths/1', params: { id: '1' } }; + let handler = new DeleteShorthandRouteHandler(this.schema, this.serializer, undefined, '/word-smiths/:id'); -test('undefined shorthand deletes the record and returns null', function(assert) { - let request = { url: '/word-smiths/1', params: { id: '1' } }; - let handler = new DeleteShorthandRouteHandler(this.schema, this.serializer, undefined, '/word-smiths/:id'); + let response = handler.handle(request); - let response = handler.handle(request); + assert.equal(this.schema.db.wordSmiths.length, 0); + assert.equal(response, null); + }); - assert.equal(this.schema.db.wordSmiths.length, 0); - assert.equal(response, null); -}); + test('query params are ignored', function(assert) { + let request = { url: '/word-smiths/1?foo=bar', params: { id: '1' }, queryParams: { foo: 'bar' } }; + let handler = new DeleteShorthandRouteHandler(this.schema, this.serializer, undefined, '/word-smiths/:id'); -test('query params are ignored', function(assert) { - let request = { url: '/word-smiths/1?foo=bar', params: { id: '1' }, queryParams: { foo: 'bar' } }; - let handler = new DeleteShorthandRouteHandler(this.schema, this.serializer, undefined, '/word-smiths/:id'); + let response = handler.handle(request); - let response = handler.handle(request); + assert.equal(this.schema.db.wordSmiths.length, 0); + assert.equal(response, null); + }); - assert.equal(this.schema.db.wordSmiths.length, 0); - assert.equal(response, null); -}); + test('string shorthand deletes the record of the specified type', function(assert) { + let request = { url: '/word-smiths/1?foo=bar', params: { id: '1' }, queryParams: { foo: 'bar' } }; + let handler = new DeleteShorthandRouteHandler(this.schema, this.serializer, undefined, '/word-smiths/:id'); -test('string shorthand deletes the record of the specified type', function(assert) { - let request = { url: '/word-smiths/1?foo=bar', params: { id: '1' }, queryParams: { foo: 'bar' } }; - let handler = new DeleteShorthandRouteHandler(this.schema, this.serializer, undefined, '/word-smiths/:id'); + let response = handler.handle(request); - let response = handler.handle(request); + assert.equal(this.schema.db.wordSmiths.length, 0); + assert.equal(response, null); + }); - assert.equal(this.schema.db.wordSmiths.length, 0); - assert.equal(response, null); -}); - -test('array shorthand deletes the record and all related records', function(assert) { - let request = { url: '/word-smiths/1', params: { id: '1' } }; - let handler = new DeleteShorthandRouteHandler(this.schema, this.serializer, ['word-smith', 'blog-posts']); + test('array shorthand deletes the record and all related records', function(assert) { + let request = { url: '/word-smiths/1', params: { id: '1' } }; + let handler = new DeleteShorthandRouteHandler(this.schema, this.serializer, ['word-smith', 'blog-posts']); - let response = handler.handle(request); + let response = handler.handle(request); - assert.equal(this.schema.db.wordSmiths.length, 0); - assert.equal(this.schema.db.blogPosts.length, 1); - assert.equal(response, null); -}); + assert.equal(this.schema.db.wordSmiths.length, 0); + assert.equal(this.schema.db.blogPosts.length, 1); + assert.equal(response, null); + }); -test('if a shorthand tries to access an unknown type it throws an error', function(assert) { - let request = { url: '/foobars/1', params: { id: '1' } }; - let handler = new DeleteShorthandRouteHandler(this.schema, this.serializer, undefined, '/foobars/:id'); + test('if a shorthand tries to access an unknown type it throws an error', function(assert) { + let request = { url: '/foobars/1', params: { id: '1' } }; + let handler = new DeleteShorthandRouteHandler(this.schema, this.serializer, undefined, '/foobars/:id'); - assert.throws(function() { - handler.handle(request); - }, /model doesn't exist/); - assert.ok(true); + assert.throws(function() { + handler.handle(request); + }, /model doesn't exist/); + assert.ok(true); + }); }); diff --git a/tests/integration/route-handlers/function-handler-test.js b/tests/integration/route-handlers/function-handler-test.js index 60fd8cf94..a971de9bb 100644 --- a/tests/integration/route-handlers/function-handler-test.js +++ b/tests/integration/route-handlers/function-handler-test.js @@ -7,8 +7,8 @@ import Response from 'ember-cli-mirage/response'; import FunctionRouteHandler from 'ember-cli-mirage/route-handlers/function'; import _uniqBy from 'lodash/uniqBy'; -module('Integration | Route handlers | Function handler', { - beforeEach() { +module('Integration | Route handlers | Function handler', function(hooks) { + hooks.beforeEach(function() { this.server = new Server({ environment: 'development', models: { @@ -26,172 +26,173 @@ module('Integration | Route handlers | Function handler', { this.functionHandler = new FunctionRouteHandler(this.server.schema, this.server.serializerOrRegistry); this.schema = this.server.schema; - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); - } -}); + }); -test('a meaningful error is thrown if a custom route handler throws an error', function(assert) { - assert.expect(1); - let done = assert.async(); + test('a meaningful error is thrown if a custom route handler throws an error', function(assert) { + assert.expect(1); + let done = assert.async(); - this.server.get('/users', function() { - throw 'I goofed'; - }); + this.server.get('/users', function() { + throw 'I goofed'; + }); - $.ajax({ - method: 'GET', - url: '/users', - error: ({ responseText }) => { - assert.equal(responseText, 'Mirage: Your GET handler for the url /users threw an error: I goofed'); - done(); - } + $.ajax({ + method: 'GET', + url: '/users', + error: ({ responseText }) => { + assert.equal(responseText, 'Mirage: Your GET handler for the url /users threw an error: I goofed'); + done(); + } + }); }); -}); -test('mirage response string is not serialized to string', function(assert) { - assert.expect(1); - let done = assert.async(); + test('mirage response string is not serialized to string', function(assert) { + assert.expect(1); + let done = assert.async(); - this.server.get('/users', function() { - return new Response(200, { 'Content-Type': 'text/csv' }, 'firstname,lastname\nbob,dylon'); - }); + this.server.get('/users', function() { + return new Response(200, { 'Content-Type': 'text/csv' }, 'firstname,lastname\nbob,dylon'); + }); - $.ajax({ method: 'GET', url: '/users' }).done(function(res) { - assert.equal(res, 'firstname,lastname\nbob,dylon'); - done(); + $.ajax({ method: 'GET', url: '/users' }).done(function(res) { + assert.equal(res, 'firstname,lastname\nbob,dylon'); + done(); + }); }); -}); -test('function can return a promise with non-serializable content', function(assert) { - assert.expect(1); - let done = assert.async(); + test('function can return a promise with non-serializable content', function(assert) { + assert.expect(1); + let done = assert.async(); - this.server.get('/users', function() { - return new Promise(resolve => { - resolve(new Response(200, { 'Content-Type': 'text/csv' }, 'firstname,lastname\nbob,dylan')); + this.server.get('/users', function() { + return new Promise(resolve => { + resolve(new Response(200, { 'Content-Type': 'text/csv' }, 'firstname,lastname\nbob,dylan')); + }); }); - }); - $.ajax({ method: 'GET', url: '/users' }).done(function(res) { - assert.equal(res, 'firstname,lastname\nbob,dylan'); - done(); + $.ajax({ method: 'GET', url: '/users' }).done(function(res) { + assert.equal(res, 'firstname,lastname\nbob,dylan'); + done(); + }); }); -}); -test('function can return a promise with serializable content', function(assert) { - assert.expect(1); - let done = assert.async(); + test('function can return a promise with serializable content', function(assert) { + assert.expect(1); + let done = assert.async(); - let user = this.schema.users.create({ name: 'Sam' }); + let user = this.schema.users.create({ name: 'Sam' }); - this.server.get('/users', function(schema) { - return new Promise(resolve => { - resolve(schema.users.all()); + this.server.get('/users', function(schema) { + return new Promise(resolve => { + resolve(schema.users.all()); + }); }); - }); - $.ajax({ method: 'GET', url: '/users' }).done(function(res) { - assert.deepEqual(res, { users: [ { id: user.id, name: 'Sam' } ] }); - done(); + $.ajax({ method: 'GET', url: '/users' }).done(function(res) { + assert.deepEqual(res, { users: [ { id: user.id, name: 'Sam' } ] }); + done(); + }); }); -}); -test('function can return a promise with an empty string', function(assert) { - assert.expect(1); - let done = assert.async(); + test('function can return a promise with an empty string', function(assert) { + assert.expect(1); + let done = assert.async(); - this.server.get('/users', function() { - return new Promise(resolve => { - resolve(new Response(200, { 'Content-Type': 'text/csv' }, '')); + this.server.get('/users', function() { + return new Promise(resolve => { + resolve(new Response(200, { 'Content-Type': 'text/csv' }, '')); + }); }); - }); - $.ajax({ method: 'GET', url: '/users' }).done(function(res) { - assert.equal(res, ''); - done(); + $.ajax({ method: 'GET', url: '/users' }).done(function(res) { + assert.equal(res, ''); + done(); + }); }); -}); -test('#serialize uses the default serializer on a model', function(assert) { - this.schema.users.create({ name: 'Sam' }); + test('#serialize uses the default serializer on a model', function(assert) { + this.schema.users.create({ name: 'Sam' }); - let user = this.schema.users.first(); - let json = this.functionHandler.serialize(user); + let user = this.schema.users.first(); + let json = this.functionHandler.serialize(user); - assert.deepEqual(json, { - user: { - id: '1', - name: 'Sam' - } + assert.deepEqual(json, { + user: { + id: '1', + name: 'Sam' + } + }); }); -}); -test('#serialize uses the default serializer on a collection', function(assert) { - this.schema.users.create({ name: 'Sam' }); + test('#serialize uses the default serializer on a collection', function(assert) { + this.schema.users.create({ name: 'Sam' }); - let users = this.schema.users.all(); - let json = this.functionHandler.serialize(users); + let users = this.schema.users.all(); + let json = this.functionHandler.serialize(users); - assert.deepEqual(json, { - users: [ - { id: '1', name: 'Sam' } - ] + assert.deepEqual(json, { + users: [ + { id: '1', name: 'Sam' } + ] + }); }); -}); -test('#serialize takes an optional serializer type', function(assert) { - this.schema.users.create({ name: 'Sam', tall: true, evil: false }); - this.schema.users.create({ name: 'Ganondorf', tall: true, evil: true }); + test('#serialize takes an optional serializer type', function(assert) { + this.schema.users.create({ name: 'Sam', tall: true, evil: false }); + this.schema.users.create({ name: 'Ganondorf', tall: true, evil: true }); - let users = this.schema.users.all(); - let json = this.functionHandler.serialize(users, 'sparse-user'); + let users = this.schema.users.all(); + let json = this.functionHandler.serialize(users, 'sparse-user'); - assert.deepEqual(json, { - users: [ - { id: '1', name: 'Sam', tall: true }, - { id: '2', name: 'Ganondorf', tall: true } - ] + assert.deepEqual(json, { + users: [ + { id: '1', name: 'Sam', tall: true }, + { id: '2', name: 'Ganondorf', tall: true } + ] + }); }); -}); -test('#serialize throws an error when trying to specify a serializer that doesnt exist', function(assert) { - this.schema.users.create({ name: 'Sam' }); + test('#serialize throws an error when trying to specify a serializer that doesnt exist', function(assert) { + this.schema.users.create({ name: 'Sam' }); - let users = this.schema.users.all(); + let users = this.schema.users.all(); - assert.throws(function() { - this.functionHandler.serialize(users, 'foo-user'); - }, /that serializer doesn't exist/); -}); + assert.throws(function() { + this.functionHandler.serialize(users, 'foo-user'); + }, /that serializer doesn't exist/); + }); -test('#serialize noops on plain JS arrays', function(assert) { - this.server.schema.users.create({ name: 'Sam' }); - this.server.schema.users.create({ name: 'Sam' }); - this.server.schema.users.create({ name: 'Ganondorf' }); + test('#serialize noops on plain JS arrays', function(assert) { + this.server.schema.users.create({ name: 'Sam' }); + this.server.schema.users.create({ name: 'Sam' }); + this.server.schema.users.create({ name: 'Ganondorf' }); - let users = this.schema.users.all().models; - let uniqueNames = _uniqBy(users, 'name'); - let serializedResponse = this.functionHandler.serialize(uniqueNames); + let users = this.schema.users.all().models; + let uniqueNames = _uniqBy(users, 'name'); + let serializedResponse = this.functionHandler.serialize(uniqueNames); - assert.deepEqual(serializedResponse, uniqueNames); -}); + assert.deepEqual(serializedResponse, uniqueNames); + }); -test('#serialize on a Collection takes an optional serializer type', function(assert) { - this.server.schema.users.create({ name: 'Sam', tall: true, evil: false }); - this.server.schema.users.create({ name: 'Sam', tall: true, evil: false }); - this.server.schema.users.create({ name: 'Ganondorf', tall: true, evil: true }); - - let users = this.schema.users.all().models; - let uniqueNames = _uniqBy(users, 'name'); - let collection = new Collection('user', uniqueNames); - let json = this.functionHandler.serialize(collection, 'sparse-user'); - - assert.deepEqual(json, { - users: [ - { id: '1', name: 'Sam', tall: true }, - { id: '3', name: 'Ganondorf', tall: true } - ] + test('#serialize on a Collection takes an optional serializer type', function(assert) { + this.server.schema.users.create({ name: 'Sam', tall: true, evil: false }); + this.server.schema.users.create({ name: 'Sam', tall: true, evil: false }); + this.server.schema.users.create({ name: 'Ganondorf', tall: true, evil: true }); + + let users = this.schema.users.all().models; + let uniqueNames = _uniqBy(users, 'name'); + let collection = new Collection('user', uniqueNames); + let json = this.functionHandler.serialize(collection, 'sparse-user'); + + assert.deepEqual(json, { + users: [ + { id: '1', name: 'Sam', tall: true }, + { id: '3', name: 'Ganondorf', tall: true } + ] + }); }); }); diff --git a/tests/integration/route-handlers/get-shorthand-test.js b/tests/integration/route-handlers/get-shorthand-test.js index f16af4dfa..55a95f6eb 100644 --- a/tests/integration/route-handlers/get-shorthand-test.js +++ b/tests/integration/route-handlers/get-shorthand-test.js @@ -10,8 +10,8 @@ import Collection from 'ember-cli-mirage/orm/collection'; import Server from 'ember-cli-mirage/server'; import GetShorthandRouteHandler from 'ember-cli-mirage/route-handlers/shorthands/get'; -module('Integration | Route Handlers | GET shorthand', { - beforeEach() { +module('Integration | Route Handlers | GET shorthand', function(hooks) { + hooks.beforeEach(function() { this.server = new Server({ environment: 'development', models: { @@ -57,163 +57,164 @@ module('Integration | Route Handlers | GET shorthand', { this.schema = this.server.schema; this.serializer = new JSONAPISerializer(); - }, - afterEach() { - this.server.shutdown(); - } -}); + }); -test('undefined shorthand returns the collection of models', function(assert) { - let request = { url: '/authors' }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors'); + hooks.afterEach(function() { + this.server.shutdown(); + }); - let authors = handler.handle(request); + test('undefined shorthand returns the collection of models', function(assert) { + let request = { url: '/authors' }; + let handler = new GetShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors'); - assert.equal(authors.models.length, 3); - assert.ok(authors.models[0] instanceof Model); - assert.equal(authors.models[0].modelName, 'author'); -}); + let authors = handler.handle(request); -test('undefined shorthand ignores query params', function(assert) { - let request = { url: '/authors?foo=bar' }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors'); + assert.equal(authors.models.length, 3); + assert.ok(authors.models[0] instanceof Model); + assert.equal(authors.models[0].modelName, 'author'); + }); - let authors = handler.handle(request); + test('undefined shorthand ignores query params', function(assert) { + let request = { url: '/authors?foo=bar' }; + let handler = new GetShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors'); - assert.equal(authors.models.length, 3); - assert.ok(authors.models[0] instanceof Model); - assert.equal(authors.models[0].modelName, 'author'); -}); + let authors = handler.handle(request); -test('undefined shorthand can return a single model', function(assert) { - let request = { url: '/authors/2', params: { id: 2 } }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors/:id'); + assert.equal(authors.models.length, 3); + assert.ok(authors.models[0] instanceof Model); + assert.equal(authors.models[0].modelName, 'author'); + }); - let author = handler.handle(request); + test('undefined shorthand can return a single model', function(assert) { + let request = { url: '/authors/2', params: { id: 2 } }; + let handler = new GetShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors/:id'); - assert.ok(author instanceof Model); - assert.equal(author.modelName, 'author'); - assert.equal(author.name, 'Zelda'); -}); + let author = handler.handle(request); -test('undefined shorthand returns a 404 if a singular resource does not exist', function(assert) { - let request = { url: '/authors/99', params: { id: 99 } }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors/:id'); + assert.ok(author instanceof Model); + assert.equal(author.modelName, 'author'); + assert.equal(author.name, 'Zelda'); + }); - let author = handler.handle(request); + test('undefined shorthand returns a 404 if a singular resource does not exist', function(assert) { + let request = { url: '/authors/99', params: { id: 99 } }; + let handler = new GetShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors/:id'); - assert.ok(author instanceof Response); - assert.equal(author.code, 404); -}); + let author = handler.handle(request); -test('undefined shorthand ignores query params for a singular resource', function(assert) { - let request = { url: '/authors/2?foo=bar', params: { id: 2 } }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors/:id'); + assert.ok(author instanceof Response); + assert.equal(author.code, 404); + }); - let author = handler.handle(request); + test('undefined shorthand ignores query params for a singular resource', function(assert) { + let request = { url: '/authors/2?foo=bar', params: { id: 2 } }; + let handler = new GetShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors/:id'); - assert.ok(author instanceof Model); - assert.equal(author.modelName, 'author'); - assert.equal(author.name, 'Zelda'); -}); + let author = handler.handle(request); -test('undefined shorthand with coalesce true returns the appropriate models', function(assert) { - let request = { url: '/authors?ids[]=1&ids[]=3', queryParams: { ids: [1, 3] } }; - let options = { coalesce: true }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors', options); + assert.ok(author instanceof Model); + assert.equal(author.modelName, 'author'); + assert.equal(author.name, 'Zelda'); + }); - let authors = handler.handle(request); + test('undefined shorthand with coalesce true returns the appropriate models', function(assert) { + let request = { url: '/authors?ids[]=1&ids[]=3', queryParams: { ids: [1, 3] } }; + let options = { coalesce: true }; + let handler = new GetShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors', options); - assert.equal(authors.models.length, 2); - assert.deepEqual(authors.models.map((author) => author.name), ['Link', 'Epona']); -}); + let authors = handler.handle(request); -test('string shorthand returns the correct collection of models', function(assert) { - let request = { url: '/people' }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, 'author'); + assert.equal(authors.models.length, 2); + assert.deepEqual(authors.models.map((author) => author.name), ['Link', 'Epona']); + }); - let authors = handler.handle(request); + test('string shorthand returns the correct collection of models', function(assert) { + let request = { url: '/people' }; + let handler = new GetShorthandRouteHandler(this.schema, this.serializer, 'author'); - assert.equal(authors.models.length, 3); - assert.ok(authors.models[0] instanceof Model); - assert.equal(authors.models[0].modelName, 'author'); -}); + let authors = handler.handle(request); -test('string shorthand with an id returns the correct model', function(assert) { - let request = { url: '/people/2', params: { id: 2 } }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, 'author'); + assert.equal(authors.models.length, 3); + assert.ok(authors.models[0] instanceof Model); + assert.equal(authors.models[0].modelName, 'author'); + }); - let author = handler.handle(request); + test('string shorthand with an id returns the correct model', function(assert) { + let request = { url: '/people/2', params: { id: 2 } }; + let handler = new GetShorthandRouteHandler(this.schema, this.serializer, 'author'); - assert.ok(author instanceof Model); - assert.equal(author.modelName, 'author'); - assert.equal(author.name, 'Zelda'); -}); + let author = handler.handle(request); -test('string shorthand with an id 404s if the model is not found', function(assert) { - let request = { url: '/people/99', params: { id: 99 } }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, 'author'); + assert.ok(author instanceof Model); + assert.equal(author.modelName, 'author'); + assert.equal(author.name, 'Zelda'); + }); - let author = handler.handle(request); + test('string shorthand with an id 404s if the model is not found', function(assert) { + let request = { url: '/people/99', params: { id: 99 } }; + let handler = new GetShorthandRouteHandler(this.schema, this.serializer, 'author'); - assert.ok(author instanceof Response); - assert.equal(author.code, 404); -}); + let author = handler.handle(request); -test('string shorthand with coalesce returns the correct models', function(assert) { - let request = { url: '/people?ids[]=1&ids[]=3', queryParams: { ids: [1, 3] } }; - let options = { coalesce: true }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, 'author', '/people', options); + assert.ok(author instanceof Response); + assert.equal(author.code, 404); + }); - let authors = handler.handle(request); + test('string shorthand with coalesce returns the correct models', function(assert) { + let request = { url: '/people?ids[]=1&ids[]=3', queryParams: { ids: [1, 3] } }; + let options = { coalesce: true }; + let handler = new GetShorthandRouteHandler(this.schema, this.serializer, 'author', '/people', options); - assert.equal(authors.models.length, 2); - assert.deepEqual(authors.models.map((author) => author.name), ['Link', 'Epona']); -}); + let authors = handler.handle(request); -test('array shorthand returns the correct models', function(assert) { - let url = '/home'; - let request = { url }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, ['authors', 'photos'], url); + assert.equal(authors.models.length, 2); + assert.deepEqual(authors.models.map((author) => author.name), ['Link', 'Epona']); + }); - let models = handler.handle(request); + test('array shorthand returns the correct models', function(assert) { + let url = '/home'; + let request = { url }; + let handler = new GetShorthandRouteHandler(this.schema, this.serializer, ['authors', 'photos'], url); - assert.ok(models[0] instanceof Collection); - assert.equal(models[0].modelName, 'author'); - assert.equal(models[0].models.length, this.authors.length); + let models = handler.handle(request); - assert.ok(models[1] instanceof Collection); - assert.equal(models[1].modelName, 'photo'); - assert.equal(models[1].models.length, this.photos.length); -}); + assert.ok(models[0] instanceof Collection); + assert.equal(models[0].modelName, 'author'); + assert.equal(models[0].models.length, this.authors.length); -test('array shorthand for a singular resource errors', function(assert) { - let url = '/authors/1'; - let request = { url, params: { id: 1 } }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, ['author', 'posts'], url); + assert.ok(models[1] instanceof Collection); + assert.equal(models[1].modelName, 'photo'); + assert.equal(models[1].models.length, this.photos.length); + }); - assert.throws(function() { - handler.handle(request); - }, /create a serializer/); -}); + test('array shorthand for a singular resource errors', function(assert) { + let url = '/authors/1'; + let request = { url, params: { id: 1 } }; + let handler = new GetShorthandRouteHandler(this.schema, this.serializer, ['author', 'posts'], url); -test('shorthand for list of models with a dash in their name', function(assert) { - let url = '/project-owners'; - let request = { url }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, undefined, url); - let models = handler.handle(request); + assert.throws(function() { + handler.handle(request); + }, /create a serializer/); + }); - assert.equal(models.models.length, 1); - assert.ok(models.models[0] instanceof Model); - assert.equal(models.models[0].modelName, 'project-owner'); -}); + test('shorthand for list of models with a dash in their name', function(assert) { + let url = '/project-owners'; + let request = { url }; + let handler = new GetShorthandRouteHandler(this.schema, this.serializer, undefined, url); + let models = handler.handle(request); -test('if a shorthand tries to access an unknown type it throws an error', function(assert) { - let url = '/foobars'; - let request = { url }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, undefined, url); + assert.equal(models.models.length, 1); + assert.ok(models.models[0] instanceof Model); + assert.equal(models.models[0].modelName, 'project-owner'); + }); - assert.throws(function() { - handler.handle(request); - }, /model doesn't exist/); + test('if a shorthand tries to access an unknown type it throws an error', function(assert) { + let url = '/foobars'; + let request = { url }; + let handler = new GetShorthandRouteHandler(this.schema, this.serializer, undefined, url); + + assert.throws(function() { + handler.handle(request); + }, /model doesn't exist/); + }); }); diff --git a/tests/integration/route-handlers/head-shorthand-test.js b/tests/integration/route-handlers/head-shorthand-test.js index 2bddfa21b..e1c4426f5 100644 --- a/tests/integration/route-handlers/head-shorthand-test.js +++ b/tests/integration/route-handlers/head-shorthand-test.js @@ -7,8 +7,8 @@ import { import Server from 'ember-cli-mirage/server'; import HeadShorthandRouteHandler from 'ember-cli-mirage/route-handlers/shorthands/head'; -module('Integration | Route Handlers | HEAD shorthand', { - beforeEach() { +module('Integration | Route Handlers | HEAD shorthand', function(hooks) { + hooks.beforeEach(function() { this.server = new Server({ environment: 'development', models: { @@ -35,90 +35,91 @@ module('Integration | Route Handlers | HEAD shorthand', { this.schema = this.server.schema; this.serializer = new JSONAPISerializer(); - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); - } -}); + }); -test('undefined shorthand with an ID that is not in the DB will return a 404 Response', function(assert) { - let request = { url: '/authors', params: { id: 101 } }; - let handler = new HeadShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors'); + test('undefined shorthand with an ID that is not in the DB will return a 404 Response', function(assert) { + let request = { url: '/authors', params: { id: 101 } }; + let handler = new HeadShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors'); - let response = handler.handle(request); + let response = handler.handle(request); - assert.ok(response instanceof Response); - assert.equal(response.code, 404); -}); + assert.ok(response instanceof Response); + assert.equal(response.code, 404); + }); -test('undefined shorthand with an ID that is in the DB will return a 204 Response', function(assert) { - let request = { url: '/authors', params: { id: 1 } }; - let handler = new HeadShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors'); + test('undefined shorthand with an ID that is in the DB will return a 204 Response', function(assert) { + let request = { url: '/authors', params: { id: 1 } }; + let handler = new HeadShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors'); - let response = handler.handle(request); + let response = handler.handle(request); - assert.ok(response instanceof Response); - assert.equal(response.code, 204); -}); + assert.ok(response instanceof Response); + assert.equal(response.code, 204); + }); -test('undefined shorthand with coalesce true will return a 204 response if one of the IDs are found', function(assert) { - let request = { url: '/authors?ids[]=1&ids[]=3', queryParams: { ids: [1, 3] } }; - let options = { coalesce: true }; - let handler = new HeadShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors', options); + test('undefined shorthand with coalesce true will return a 204 response if one of the IDs are found', function(assert) { + let request = { url: '/authors?ids[]=1&ids[]=3', queryParams: { ids: [1, 3] } }; + let options = { coalesce: true }; + let handler = new HeadShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors', options); - let response = handler.handle(request); + let response = handler.handle(request); - assert.ok(response instanceof Response); - assert.equal(response.code, 204); -}); + assert.ok(response instanceof Response); + assert.equal(response.code, 204); + }); -test('undefined shorthand string (no id) shorthand returns a 204 (regardless of the length of the collection)', function(assert) { - let request = { url: '/authors' }; - let handler = new HeadShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors'); + test('undefined shorthand string (no id) shorthand returns a 204 (regardless of the length of the collection)', function(assert) { + let request = { url: '/authors' }; + let handler = new HeadShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors'); - let response = handler.handle(request); + let response = handler.handle(request); - assert.ok(response instanceof Response); - assert.equal(response.code, 204); -}); + assert.ok(response instanceof Response); + assert.equal(response.code, 204); + }); -test('string shorthand with an ID that is not in the DB will return a 404 Response', function(assert) { - let request = { url: '/authors', params: { id: 101 } }; - let handler = new HeadShorthandRouteHandler(this.schema, this.serializer, 'author'); + test('string shorthand with an ID that is not in the DB will return a 404 Response', function(assert) { + let request = { url: '/authors', params: { id: 101 } }; + let handler = new HeadShorthandRouteHandler(this.schema, this.serializer, 'author'); - let response = handler.handle(request); + let response = handler.handle(request); - assert.ok(response instanceof Response); - assert.equal(response.code, 404); -}); + assert.ok(response instanceof Response); + assert.equal(response.code, 404); + }); -test('string shorthand with an ID that is in the DB will return a 204 Response', function(assert) { - let request = { url: '/authors', params: { id: 1 } }; - let handler = new HeadShorthandRouteHandler(this.schema, this.serializer, 'author'); + test('string shorthand with an ID that is in the DB will return a 204 Response', function(assert) { + let request = { url: '/authors', params: { id: 1 } }; + let handler = new HeadShorthandRouteHandler(this.schema, this.serializer, 'author'); - let response = handler.handle(request); + let response = handler.handle(request); - assert.ok(response instanceof Response); - assert.equal(response.code, 204); -}); + assert.ok(response instanceof Response); + assert.equal(response.code, 204); + }); -test('string shorthand with coalesce true will return a 204 response if one of the IDs are found', function(assert) { - let request = { url: '/authors?ids[]=1&ids[]=3', queryParams: { ids: [1, 3] } }; - let options = { coalesce: true }; - let handler = new HeadShorthandRouteHandler(this.schema, this.serializer, 'author', '/people', options); + test('string shorthand with coalesce true will return a 204 response if one of the IDs are found', function(assert) { + let request = { url: '/authors?ids[]=1&ids[]=3', queryParams: { ids: [1, 3] } }; + let options = { coalesce: true }; + let handler = new HeadShorthandRouteHandler(this.schema, this.serializer, 'author', '/people', options); - let response = handler.handle(request); + let response = handler.handle(request); - assert.ok(response instanceof Response); - assert.equal(response.code, 204); -}); + assert.ok(response instanceof Response); + assert.equal(response.code, 204); + }); -test('string shorthand string (no id) shorthand returns a 204 (regardless of the length of the collection)', function(assert) { - let request = { url: '/authors' }; - let handler = new HeadShorthandRouteHandler(this.schema, this.serializer, 'author'); + test('string shorthand string (no id) shorthand returns a 204 (regardless of the length of the collection)', function(assert) { + let request = { url: '/authors' }; + let handler = new HeadShorthandRouteHandler(this.schema, this.serializer, 'author'); - let response = handler.handle(request); + let response = handler.handle(request); - assert.ok(response instanceof Response); - assert.equal(response.code, 204); + assert.ok(response instanceof Response); + assert.equal(response.code, 204); + }); }); diff --git a/tests/integration/route-handlers/post-shorthand-test.js b/tests/integration/route-handlers/post-shorthand-test.js index 37d592678..ef778ce41 100644 --- a/tests/integration/route-handlers/post-shorthand-test.js +++ b/tests/integration/route-handlers/post-shorthand-test.js @@ -4,8 +4,8 @@ import Model from 'ember-cli-mirage/orm/model'; import PostShorthandRouteHandler from 'ember-cli-mirage/route-handlers/shorthands/post'; import JSONAPISerializer from 'ember-cli-mirage/serializers/json-api-serializer'; -module('Integration | Route Handlers | POST shorthand', { - beforeEach() { +module('Integration | Route Handlers | POST shorthand', function(hooks) { + hooks.beforeEach(function() { this.server = new Server({ environment: 'development', models: { @@ -27,54 +27,55 @@ module('Integration | Route Handlers | POST shorthand', { } } }; - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); - } -}); + }); -test('string shorthand creates a record of the specified type and returns the new model', function(assert) { - let request = { requestBody: JSON.stringify(this.body), url: '/people' }; - let handler = new PostShorthandRouteHandler(this.schema, this.serializer, 'author'); + test('string shorthand creates a record of the specified type and returns the new model', function(assert) { + let request = { requestBody: JSON.stringify(this.body), url: '/people' }; + let handler = new PostShorthandRouteHandler(this.schema, this.serializer, 'author'); - let model = handler.handle(request); + let model = handler.handle(request); - assert.equal(this.schema.db.authors.length, 1); - assert.ok(model instanceof Model); - assert.equal(model.modelName, 'author'); - assert.equal(model.firstName, 'Ganon'); -}); + assert.equal(this.schema.db.authors.length, 1); + assert.ok(model instanceof Model); + assert.equal(model.modelName, 'author'); + assert.equal(model.firstName, 'Ganon'); + }); -test('query params are ignored', function(assert) { - let request = { requestBody: JSON.stringify(this.body), url: '/authors?foo=bar', queryParams: { foo: 'bar' } }; - let handler = new PostShorthandRouteHandler(this.schema, this.serializer, 'author'); + test('query params are ignored', function(assert) { + let request = { requestBody: JSON.stringify(this.body), url: '/authors?foo=bar', queryParams: { foo: 'bar' } }; + let handler = new PostShorthandRouteHandler(this.schema, this.serializer, 'author'); - let model = handler.handle(request); + let model = handler.handle(request); - assert.equal(this.schema.db.authors.length, 1); - assert.ok(model instanceof Model); - assert.equal(model.modelName, 'author'); - assert.equal(model.firstName, 'Ganon'); -}); + assert.equal(this.schema.db.authors.length, 1); + assert.ok(model instanceof Model); + assert.equal(model.modelName, 'author'); + assert.equal(model.firstName, 'Ganon'); + }); -test('undefined shorthand creates a record and returns the new model', function(assert) { - let request = { requestBody: JSON.stringify(this.body), url: '/authors' }; - let handler = new PostShorthandRouteHandler(this.schema, this.serializer, null, '/authors'); + test('undefined shorthand creates a record and returns the new model', function(assert) { + let request = { requestBody: JSON.stringify(this.body), url: '/authors' }; + let handler = new PostShorthandRouteHandler(this.schema, this.serializer, null, '/authors'); - let model = handler.handle(request); + let model = handler.handle(request); - assert.equal(this.schema.db.authors.length, 1); - assert.ok(model instanceof Model); - assert.equal(model.modelName, 'author'); - assert.equal(model.firstName, 'Ganon'); -}); + assert.equal(this.schema.db.authors.length, 1); + assert.ok(model instanceof Model); + assert.equal(model.modelName, 'author'); + assert.equal(model.firstName, 'Ganon'); + }); -test('if a shorthand tries to access an unknown type it throws an error', function(assert) { - let request = { requestBody: JSON.stringify(this.body), url: '/foobars' }; - let handler = new PostShorthandRouteHandler(this.schema, this.serializer, 'foobar'); + test('if a shorthand tries to access an unknown type it throws an error', function(assert) { + let request = { requestBody: JSON.stringify(this.body), url: '/foobars' }; + let handler = new PostShorthandRouteHandler(this.schema, this.serializer, 'foobar'); - assert.throws(function() { - handler.handle(request); - }, /model doesn't exist/); - assert.ok(true); + assert.throws(function() { + handler.handle(request); + }, /model doesn't exist/); + assert.ok(true); + }); }); diff --git a/tests/integration/route-handlers/put-shorthand-test.js b/tests/integration/route-handlers/put-shorthand-test.js index 3fa2bfeaa..d890ab571 100644 --- a/tests/integration/route-handlers/put-shorthand-test.js +++ b/tests/integration/route-handlers/put-shorthand-test.js @@ -4,9 +4,8 @@ import Server from 'ember-cli-mirage/server'; import Model from 'ember-cli-mirage/orm/model'; import JSONAPISerializer from 'ember-cli-mirage/serializers/json-api-serializer'; -module('Integration | Route Handlers | PUT shorthand', { - - beforeEach() { +module('Integration | Route Handlers | PUT shorthand', function(hooks) { + hooks.beforeEach(function() { this.server = new Server({ environment: 'development', models: { @@ -35,55 +34,55 @@ module('Integration | Route Handlers | PUT shorthand', { } } }; - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); - } + }); -}); + test('undefined shorthand updates the record and returns the model', function(assert) { + let handler = new PutShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors/:id'); + let request = { requestBody: JSON.stringify(this.body), url: '/authors/1', params: { id: '1' } }; -test('undefined shorthand updates the record and returns the model', function(assert) { - let handler = new PutShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors/:id'); - let request = { requestBody: JSON.stringify(this.body), url: '/authors/1', params: { id: '1' } }; + let model = handler.handle(request); - let model = handler.handle(request); + assert.equal(this.schema.db.authors.length, 1); + assert.ok(model instanceof Model); + assert.equal(model.modelName, 'author'); + assert.equal(model.firstName, 'Ganondorf'); + }); - assert.equal(this.schema.db.authors.length, 1); - assert.ok(model instanceof Model); - assert.equal(model.modelName, 'author'); - assert.equal(model.firstName, 'Ganondorf'); -}); + test('query params are ignored', function(assert) { + let handler = new PutShorthandRouteHandler(this.schema, this.serializer, 'author'); + let request = { requestBody: JSON.stringify(this.body), url: '/authors/1?foo=bar', params: { id: '1' }, queryParams: { foo: 'bar' } }; -test('query params are ignored', function(assert) { - let handler = new PutShorthandRouteHandler(this.schema, this.serializer, 'author'); - let request = { requestBody: JSON.stringify(this.body), url: '/authors/1?foo=bar', params: { id: '1' }, queryParams: { foo: 'bar' } }; + let model = handler.handle(request); - let model = handler.handle(request); + assert.equal(this.schema.db.authors.length, 1); + assert.ok(model instanceof Model); + assert.equal(model.modelName, 'author'); + assert.equal(model.firstName, 'Ganondorf'); + }); - assert.equal(this.schema.db.authors.length, 1); - assert.ok(model instanceof Model); - assert.equal(model.modelName, 'author'); - assert.equal(model.firstName, 'Ganondorf'); -}); - -test('string shorthand updates the record of the specified type and returns the model', function(assert) { - let handler = new PutShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors/:id'); - let request = { requestBody: JSON.stringify(this.body), url: '/authors/1', params: { id: '1' } }; + test('string shorthand updates the record of the specified type and returns the model', function(assert) { + let handler = new PutShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors/:id'); + let request = { requestBody: JSON.stringify(this.body), url: '/authors/1', params: { id: '1' } }; - let model = handler.handle(request); + let model = handler.handle(request); - assert.equal(this.schema.db.authors.length, 1); - assert.ok(model instanceof Model); - assert.equal(model.modelName, 'author'); - assert.equal(model.firstName, 'Ganondorf'); -}); + assert.equal(this.schema.db.authors.length, 1); + assert.ok(model instanceof Model); + assert.equal(model.modelName, 'author'); + assert.equal(model.firstName, 'Ganondorf'); + }); -test('if a shorthand tries to access an unknown type it throws an error', function(assert) { - let handler = new PutShorthandRouteHandler(this.schema, this.serializer, undefined, '/foobars/:id'); - let request = { requestBody: JSON.stringify(this.body), url: '/foobars/1', params: { id: '1' } }; + test('if a shorthand tries to access an unknown type it throws an error', function(assert) { + let handler = new PutShorthandRouteHandler(this.schema, this.serializer, undefined, '/foobars/:id'); + let request = { requestBody: JSON.stringify(this.body), url: '/foobars/1', params: { id: '1' } }; - assert.throws(function() { - handler.handle(request); - }, /model doesn't exist/); - assert.ok(true); + assert.throws(function() { + handler.handle(request); + }, /model doesn't exist/); + assert.ok(true); + }); }); diff --git a/tests/integration/serializers/active-model-serializer-test.js b/tests/integration/serializers/active-model-serializer-test.js index 124501407..165a08d91 100644 --- a/tests/integration/serializers/active-model-serializer-test.js +++ b/tests/integration/serializers/active-model-serializer-test.js @@ -4,8 +4,8 @@ import Db from 'ember-cli-mirage/db'; import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { module, test } from 'qunit'; -module('Integration | Serializer | ActiveModelSerializer', { - beforeEach() { +module('Integration | Serializer | ActiveModelSerializer', function(hooks) { + hooks.beforeEach(function() { let db = new Db(); this.schema = new Schema(db); this.schema.registerModels({ @@ -61,117 +61,117 @@ module('Integration | Serializer | ActiveModelSerializer', { embed: true }) }); - }, + }); - afterEach() { + hooks.afterEach(function() { this.schema.db.emptyData(); - } -}); - -test('it sideloads associations and snake-cases relationships and attributes correctly for a model', function(assert) { - let link = this.schema.wordSmiths.find(1); - let result = this.registry.serialize(link); - - assert.deepEqual(result, { - word_smith: { - id: '1', - name: 'Link', - blog_post_ids: ['1', '2'] - }, - blog_posts: [ - { - id: '1', - title: 'Lorem', - word_smith_id: '1', - comment_ids: [ '1' ] - }, - { - id: '2', - title: 'Ipsum', - word_smith_id: '1', - comment_ids: [ ] - } - ], - comments: [ - { - id: '1', - text: 'Hi there', - commentable_id: '1', - commentable_type: 'blog-post' - } - ] }); -}); -test('it sideloads associations and snake-cases relationships and attributes correctly for a collection', function(assert) { - let wordSmiths = this.schema.wordSmiths.all(); - let result = this.registry.serialize(wordSmiths); + test('it sideloads associations and snake-cases relationships and attributes correctly for a model', function(assert) { + let link = this.schema.wordSmiths.find(1); + let result = this.registry.serialize(link); - assert.deepEqual(result, { - word_smiths: [ - { + assert.deepEqual(result, { + word_smith: { id: '1', name: 'Link', blog_post_ids: ['1', '2'] }, - { - id: '2', - name: 'Zelda', - blog_post_ids: [] - } - ], - blog_posts: [ - { - id: '1', - title: 'Lorem', - word_smith_id: '1', - comment_ids: [ '1' ] - }, - { - id: '2', - title: 'Ipsum', - word_smith_id: '1', - comment_ids: [ ] - } - ], - comments: [ - { - id: '1', - text: 'Hi there', - commentable_id: '1', - commentable_type: 'blog-post' - } - ] + blog_posts: [ + { + id: '1', + title: 'Lorem', + word_smith_id: '1', + comment_ids: [ '1' ] + }, + { + id: '2', + title: 'Ipsum', + word_smith_id: '1', + comment_ids: [ ] + } + ], + comments: [ + { + id: '1', + text: 'Hi there', + commentable_id: '1', + commentable_type: 'blog-post' + } + ] + }); }); -}); -test('it embeds associations and snake-cases relationships and attributes correctly for a collection', function(assert) { - let users = this.schema.users.all(); - let result = this.registry.serialize(users); + test('it sideloads associations and snake-cases relationships and attributes correctly for a collection', function(assert) { + let wordSmiths = this.schema.wordSmiths.all(); + let result = this.registry.serialize(wordSmiths); - assert.deepEqual(result, { - users: [ - { - id: '1', - name: 'John Peach', - contact_infos: [ - { - id: '1', - email: 'peach@bb.me', - user_id: '1' - }, - { - id: '2', - email: 'john3000@mail.com', - user_id: '1' - } - ] - }, - { - id: '2', - name: 'Pine Apple', - contact_infos: [] - } - ] + assert.deepEqual(result, { + word_smiths: [ + { + id: '1', + name: 'Link', + blog_post_ids: ['1', '2'] + }, + { + id: '2', + name: 'Zelda', + blog_post_ids: [] + } + ], + blog_posts: [ + { + id: '1', + title: 'Lorem', + word_smith_id: '1', + comment_ids: [ '1' ] + }, + { + id: '2', + title: 'Ipsum', + word_smith_id: '1', + comment_ids: [ ] + } + ], + comments: [ + { + id: '1', + text: 'Hi there', + commentable_id: '1', + commentable_type: 'blog-post' + } + ] + }); + }); + + test('it embeds associations and snake-cases relationships and attributes correctly for a collection', function(assert) { + let users = this.schema.users.all(); + let result = this.registry.serialize(users); + + assert.deepEqual(result, { + users: [ + { + id: '1', + name: 'John Peach', + contact_infos: [ + { + id: '1', + email: 'peach@bb.me', + user_id: '1' + }, + { + id: '2', + email: 'john3000@mail.com', + user_id: '1' + } + ] + }, + { + id: '2', + name: 'Pine Apple', + contact_infos: [] + } + ] + }); }); }); diff --git a/tests/integration/serializers/base/associations/embedded-collection-test.js b/tests/integration/serializers/base/associations/embedded-collection-test.js index 7cc1d9e35..e6a166236 100644 --- a/tests/integration/serializers/base/associations/embedded-collection-test.js +++ b/tests/integration/serializers/base/associations/embedded-collection-test.js @@ -5,164 +5,167 @@ import Serializer from 'ember-cli-mirage/serializer'; import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { module, test } from 'qunit'; -module('Integration | Serializers | Base | Associations | Embedded Collections', { - beforeEach() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - posts: hasMany('blogPost', { inverse: 'author' }) - }), - blogPost: Model.extend({ - author: belongsTo('wordSmith', { inverse: 'posts' }), - comments: hasMany('fineComment', { inverse: 'post' }) - }), - fineComment: Model.extend({ - post: belongsTo('blogPost') - }) +module( + 'Integration | Serializers | Base | Associations | Embedded Collections', + function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + posts: hasMany('blogPost', { inverse: 'author' }) + }), + blogPost: Model.extend({ + author: belongsTo('wordSmith', { inverse: 'posts' }), + comments: hasMany('fineComment', { inverse: 'post' }) + }), + fineComment: Model.extend({ + post: belongsTo('blogPost') + }) + }); + + let wordSmith = this.schema.wordSmiths.create({ name: 'Link' }); + let blogPost = wordSmith.createPost({ title: 'Lorem' }); + blogPost.createComment({ text: 'pwned' }); + + wordSmith.createPost({ title: 'Ipsum' }); + + this.schema.wordSmiths.create({ name: 'Zelda' }); + + this.BaseSerializer = Serializer.extend({ + embed: true + }); }); - let wordSmith = this.schema.wordSmiths.create({ name: 'Link' }); - let blogPost = wordSmith.createPost({ title: 'Lorem' }); - blogPost.createComment({ text: 'pwned' }); + hooks.afterEach(function() { + this.schema.db.emptyData(); + }); - wordSmith.createPost({ title: 'Ipsum' }); + test(`it can embed a collection with a has-many relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + include: ['posts'] + }) + }); - this.schema.wordSmiths.create({ name: 'Zelda' }); + let wordSmiths = this.schema.wordSmiths.all(); + let result = registry.serialize(wordSmiths); - this.BaseSerializer = Serializer.extend({ - embed: true + assert.deepEqual(result, { + wordSmiths: [ + { + id: '1', + name: 'Link', + posts: [ + { id: '1', title: 'Lorem' }, + { id: '2', title: 'Ipsum' } + ] + }, + { + id: '2', + name: 'Zelda', + posts: [] + } + ] + }); }); - }, - afterEach() { - this.schema.db.emptyData(); - } -}); - -test(`it can embed a collection with a has-many relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }) - }); - - let wordSmiths = this.schema.wordSmiths.all(); - let result = registry.serialize(wordSmiths); - - assert.deepEqual(result, { - wordSmiths: [ - { - id: '1', - name: 'Link', - posts: [ - { id: '1', title: 'Lorem' }, - { id: '2', title: 'Ipsum' } + test(`it can embed a collection with a chain of has-many relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + include: ['posts'] + }), + blogPost: this.BaseSerializer.extend({ + include: ['comments'] + }) + }); + + let wordSmiths = this.schema.wordSmiths.all(); + let result = registry.serialize(wordSmiths); + + assert.deepEqual(result, { + wordSmiths: [ + { + id: '1', + name: 'Link', + posts: [ + { + id: '1', + title: 'Lorem', + comments: [ + { id: '1', text: 'pwned' } + ] + }, + { + id: '2', + title: 'Ipsum', + comments: [] + } + ] + }, + { + id: '2', + name: 'Zelda', + posts: [] + } ] - }, - { - id: '2', - name: 'Zelda', - posts: [] - } - ] - }); -}); - -test(`it can embed a collection with a chain of has-many relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['comments'] - }) - }); - - let wordSmiths = this.schema.wordSmiths.all(); - let result = registry.serialize(wordSmiths); - - assert.deepEqual(result, { - wordSmiths: [ - { - id: '1', - name: 'Link', - posts: [ + }); + }); + + test(`it can embed a collection with a belongs-to relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + blogPost: this.BaseSerializer.extend({ + include: ['author'] + }) + }); + + let blogPosts = this.schema.blogPosts.all(); + let result = registry.serialize(blogPosts); + + assert.deepEqual(result, { + blogPosts: [ { id: '1', title: 'Lorem', - comments: [ - { id: '1', text: 'pwned' } - ] + author: { id: '1', name: 'Link' } }, { id: '2', title: 'Ipsum', - comments: [] + author: { id: '1', name: 'Link' } } ] - }, - { - id: '2', - name: 'Zelda', - posts: [] - } - ] - }); -}); - -test(`it can embed a collection with a belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let blogPosts = this.schema.blogPosts.all(); - let result = registry.serialize(blogPosts); - - assert.deepEqual(result, { - blogPosts: [ - { - id: '1', - title: 'Lorem', - author: { id: '1', name: 'Link' } - }, - { - id: '2', - title: 'Ipsum', - author: { id: '1', name: 'Link' } - } - ] - }); -}); - -test(`it can embed a collection with a chain of belongs-to relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - fineComment: this.BaseSerializer.extend({ - include: ['post'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let fineComments = this.schema.fineComments.all(); - let result = registry.serialize(fineComments); - - assert.deepEqual(result, { - fineComments: [ - { - id: '1', - text: 'pwned', - post: { - id: '1', - title: 'Lorem', - author: { id: '1', name: 'Link' } - } - } - ] - }); -}); + }); + }); + + test(`it can embed a collection with a chain of belongs-to relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + fineComment: this.BaseSerializer.extend({ + include: ['post'] + }), + blogPost: this.BaseSerializer.extend({ + include: ['author'] + }) + }); + + let fineComments = this.schema.fineComments.all(); + let result = registry.serialize(fineComments); + + assert.deepEqual(result, { + fineComments: [ + { + id: '1', + text: 'pwned', + post: { + id: '1', + title: 'Lorem', + author: { id: '1', name: 'Link' } + } + } + ] + }); + }); + } +); diff --git a/tests/integration/serializers/base/associations/embedded-model-test.js b/tests/integration/serializers/base/associations/embedded-model-test.js index 1e01de488..f14ebe13a 100644 --- a/tests/integration/serializers/base/associations/embedded-model-test.js +++ b/tests/integration/serializers/base/associations/embedded-model-test.js @@ -5,194 +5,197 @@ import Serializer from 'ember-cli-mirage/serializer'; import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { module, test } from 'qunit'; -module('Integration | Serializers | Base | Associations | Embedded Models', { - beforeEach() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - posts: hasMany('blogPost', { inverse: 'author' }) - }), - blogPost: Model.extend({ - author: belongsTo('wordSmith', { inverse: 'posts' }), - comments: hasMany('fineComment', { inverse: 'post' }) - }), - fineComment: Model.extend({ - post: belongsTo('blogPost') - }) +module( + 'Integration | Serializers | Base | Associations | Embedded Models', + function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + posts: hasMany('blogPost', { inverse: 'author' }) + }), + blogPost: Model.extend({ + author: belongsTo('wordSmith', { inverse: 'posts' }), + comments: hasMany('fineComment', { inverse: 'post' }) + }), + fineComment: Model.extend({ + post: belongsTo('blogPost') + }) + }); + + let wordSmith = this.schema.wordSmiths.create({ name: 'Link' }); + let post = wordSmith.createPost({ title: 'Lorem' }); + post.createComment({ text: 'pwned' }); + + wordSmith.createPost({ title: 'Ipsum' }); + + this.schema.wordSmiths.create({ name: 'Zelda' }); + + this.BaseSerializer = Serializer.extend({ + embed: true + }); }); - let wordSmith = this.schema.wordSmiths.create({ name: 'Link' }); - let post = wordSmith.createPost({ title: 'Lorem' }); - post.createComment({ text: 'pwned' }); + hooks.afterEach(function() { + this.schema.db.emptyData(); + }); - wordSmith.createPost({ title: 'Ipsum' }); + test(`it can embed has-many relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + include: ['posts'] + }) + }); + + let link = this.schema.wordSmiths.find(1); + let result = registry.serialize(link); + + assert.deepEqual(result, { + wordSmith: { + id: '1', + name: 'Link', + posts: [ + { id: '1', title: 'Lorem' }, + { id: '2', title: 'Ipsum' } + ] + } + }); + }); - this.schema.wordSmiths.create({ name: 'Zelda' }); + test(`it can embed a chain of has-many relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + include: ['posts'] + }), + blogPost: this.BaseSerializer.extend({ + include: ['comments'] + }) + }); + + let wordSmith = this.schema.wordSmiths.find(1); + let result = registry.serialize(wordSmith); + + assert.deepEqual(result, { + wordSmith: { + id: '1', + name: 'Link', + posts: [ + { id: '1', title: 'Lorem', comments: [ + { id: '1', text: 'pwned' } + ] }, + { id: '2', title: 'Ipsum', comments: [] } + ] + } + }); + }); - this.BaseSerializer = Serializer.extend({ - embed: true + test(`it can embed a belongs-to relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + blogPost: this.BaseSerializer.extend({ + embed: true, + include: ['author'] + }) + }); + + let blogPost = this.schema.blogPosts.find(1); + let result = registry.serialize(blogPost); + + assert.deepEqual(result, { + blogPost: { + id: '1', + title: 'Lorem', + author: { id: '1', name: 'Link' } + } + }); }); - }, - afterEach() { - this.schema.db.emptyData(); - } -}); - -test(`it can embed has-many relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }) - }); - - let link = this.schema.wordSmiths.find(1); - let result = registry.serialize(link); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - posts: [ - { id: '1', title: 'Lorem' }, - { id: '2', title: 'Ipsum' } - ] - } - }); -}); - -test(`it can embed a chain of has-many relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['comments'] - }) - }); - - let wordSmith = this.schema.wordSmiths.find(1); - let result = registry.serialize(wordSmith); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - posts: [ - { id: '1', title: 'Lorem', comments: [ - { id: '1', text: 'pwned' } - ] }, - { id: '2', title: 'Ipsum', comments: [] } - ] - } - }); -}); - -test(`it can embed a belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - blogPost: this.BaseSerializer.extend({ - embed: true, - include: ['author'] - }) - }); - - let blogPost = this.schema.blogPosts.find(1); - let result = registry.serialize(blogPost); - - assert.deepEqual(result, { - blogPost: { - id: '1', - title: 'Lorem', - author: { id: '1', name: 'Link' } - } - }); -}); - -test(`it can serialize a chain of belongs-to relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - fineComment: this.BaseSerializer.extend({ - include: ['post'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let fineComment = this.schema.fineComments.find(1); - let result = registry.serialize(fineComment); - - assert.deepEqual(result, { - fineComment: { - id: '1', - text: 'pwned', - post: { - id: '1', - title: 'Lorem', - author: { - id: '1', name: 'Link' + test(`it can serialize a chain of belongs-to relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + fineComment: this.BaseSerializer.extend({ + include: ['post'] + }), + blogPost: this.BaseSerializer.extend({ + include: ['author'] + }) + }); + + let fineComment = this.schema.fineComments.find(1); + let result = registry.serialize(fineComment); + + assert.deepEqual(result, { + fineComment: { + id: '1', + text: 'pwned', + post: { + id: '1', + title: 'Lorem', + author: { + id: '1', name: 'Link' + } + } } - } - } - }); -}); - -test(`it ignores relationships that refer to serialized ancestor resources`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let wordSmith = this.schema.wordSmiths.find(1); - let result = registry.serialize(wordSmith); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - posts: [ - { id: '1', title: 'Lorem' }, - { id: '2', title: 'Ipsum' } - ] - } - }); -}); - -test(`it ignores relationships that refer to serialized ancestor resources, multiple levels down`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - embed: true, - include: ['posts'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['author', 'comments'] - }), - fineComment: this.BaseSerializer.extend({ - include: ['post'] - }) - }); - - let wordSmith = this.schema.wordSmiths.find(1); - let result = registry.serialize(wordSmith); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - posts: [ - { id: '1', title: 'Lorem', comments: [ - { id: '1', text: 'pwned' } - ] }, - { id: '2', title: 'Ipsum', comments: [] } - ] - } - }); -}); + }); + }); + + test(`it ignores relationships that refer to serialized ancestor resources`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + include: ['posts'] + }), + blogPost: this.BaseSerializer.extend({ + include: ['author'] + }) + }); + + let wordSmith = this.schema.wordSmiths.find(1); + let result = registry.serialize(wordSmith); + + assert.deepEqual(result, { + wordSmith: { + id: '1', + name: 'Link', + posts: [ + { id: '1', title: 'Lorem' }, + { id: '2', title: 'Ipsum' } + ] + } + }); + }); + + test(`it ignores relationships that refer to serialized ancestor resources, multiple levels down`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + embed: true, + include: ['posts'] + }), + blogPost: this.BaseSerializer.extend({ + include: ['author', 'comments'] + }), + fineComment: this.BaseSerializer.extend({ + include: ['post'] + }) + }); + + let wordSmith = this.schema.wordSmiths.find(1); + let result = registry.serialize(wordSmith); + + assert.deepEqual(result, { + wordSmith: { + id: '1', + name: 'Link', + posts: [ + { id: '1', title: 'Lorem', comments: [ + { id: '1', text: 'pwned' } + ] }, + { id: '2', title: 'Ipsum', comments: [] } + ] + } + }); + }); + } +); diff --git a/tests/integration/serializers/base/associations/many-to-many-test.js b/tests/integration/serializers/base/associations/many-to-many-test.js index 8f04023c6..d5e4f0e6e 100644 --- a/tests/integration/serializers/base/associations/many-to-many-test.js +++ b/tests/integration/serializers/base/associations/many-to-many-test.js @@ -4,75 +4,78 @@ import Db from 'ember-cli-mirage/db'; import Schema from 'ember-cli-mirage/orm/schema'; import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -module('Integration | Serializers | Base | Associations | Many To Many', { - beforeEach() { - let db = new Db(); +module( + 'Integration | Serializers | Base | Associations | Many To Many', + function(hooks) { + hooks.beforeEach(function() { + let db = new Db(); - let schema = new Schema(db, { - contact: Model.extend({ - addresses: hasMany(), - contactAddresses: hasMany() - }), - address: Model.extend({ - contacts: hasMany(), - contactAddresses: hasMany() - }), - contactAddress: Model.extend({ - contact: belongsTo(), - address: belongsTo() - }) - }); + let schema = new Schema(db, { + contact: Model.extend({ + addresses: hasMany(), + contactAddresses: hasMany() + }), + address: Model.extend({ + contacts: hasMany(), + contactAddresses: hasMany() + }), + contactAddress: Model.extend({ + contact: belongsTo(), + address: belongsTo() + }) + }); - let registry = new SerializerRegistry(schema, { - contact: Serializer.extend({ - include: ['addresses'], - addresses(model) { - let models = model.contactAddresses.models.map((ca) => ca.address); - return new Collection('address', models); - } - }), - address: Serializer.extend({ - include: ['contacts'], - contacts(model) { - let models = model.contactAddresses.models.map((ca) => ca.contact); - return new Collection('contact', models); - } - }) - }); + let registry = new SerializerRegistry(schema, { + contact: Serializer.extend({ + include: ['addresses'], + addresses(model) { + let models = model.contactAddresses.models.map((ca) => ca.address); + return new Collection('address', models); + } + }), + address: Serializer.extend({ + include: ['contacts'], + contacts(model) { + let models = model.contactAddresses.models.map((ca) => ca.contact); + return new Collection('contact', models); + } + }) + }); - let mario = schema.contacts.create({ name: 'Mario' }); - let newYork = schema.addresses.create({ street: 'Some New York Street' }); - let mushroomKingdom = schema.addresses.create({ street: 'Some Mushroom Kingdom Street' }); + let mario = schema.contacts.create({ name: 'Mario' }); + let newYork = schema.addresses.create({ street: 'Some New York Street' }); + let mushroomKingdom = schema.addresses.create({ street: 'Some Mushroom Kingdom Street' }); - schema.contactAddresses.create({ contact: mario, address: newYork }); - schema.contactAddresses.create({ contact: mario, address: mushroomKingdom }); + schema.contactAddresses.create({ contact: mario, address: newYork }); + schema.contactAddresses.create({ contact: mario, address: mushroomKingdom }); - this.schema = schema; - this.registry = registry; - } -}); + this.schema = schema; + this.registry = registry; + }); -skip(`it serializes manyToMany if properly configured to passthrough`, function(assert) { - let contact = this.schema.contacts.find(1); - let result = this.registry.serialize(contact); + skip(`it serializes manyToMany if properly configured to passthrough`, function(assert) { + let contact = this.schema.contacts.find(1); + let result = this.registry.serialize(contact); - assert.deepEqual(result, { - addresses: [{ - contactId: null, // side-effect of having a HasMany on the contactAddress side of things - contactIds: ['1'], - id: '1', - street: 'Some New York Street' - }, { - contactId: null, - contactIds: ['1'], - id: '2', - street: 'Some Mushroom Kingdom Street' - }], - contact: { - addressId: null, // side-effect of having a HasMany on the contactAddress side of things - addressIds: ['1', '2'], - id: '1', - name: 'Mario' - } - }); -}); + assert.deepEqual(result, { + addresses: [{ + contactId: null, // side-effect of having a HasMany on the contactAddress side of things + contactIds: ['1'], + id: '1', + street: 'Some New York Street' + }, { + contactId: null, + contactIds: ['1'], + id: '2', + street: 'Some Mushroom Kingdom Street' + }], + contact: { + addressId: null, // side-effect of having a HasMany on the contactAddress side of things + addressIds: ['1', '2'], + id: '1', + name: 'Mario' + } + }); + }); + } +); diff --git a/tests/integration/serializers/base/associations/polymorphic-belongs-to-test.js b/tests/integration/serializers/base/associations/polymorphic-belongs-to-test.js index 5cab2131c..37731dba7 100644 --- a/tests/integration/serializers/base/associations/polymorphic-belongs-to-test.js +++ b/tests/integration/serializers/base/associations/polymorphic-belongs-to-test.js @@ -5,48 +5,51 @@ import Serializer from 'ember-cli-mirage/serializer'; import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { module, test } from 'qunit'; -module('Integration | Serializers | Base | Associations | Polymorphic Belongs To', { - beforeEach() { - this.schema = new Schema(new Db(), { - post: Model.extend(), - comment: Model.extend({ - commentable: belongsTo({ polymorphic: true }) - }) - }); +module( + 'Integration | Serializers | Base | Associations | Polymorphic Belongs To', + function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + post: Model.extend(), + comment: Model.extend({ + commentable: belongsTo({ polymorphic: true }) + }) + }); - let post = this.schema.posts.create({ title: 'Lorem ipsum' }); - this.schema.comments.create({ commentable: post, text: 'Foo' }); + let post = this.schema.posts.create({ title: 'Lorem ipsum' }); + this.schema.comments.create({ commentable: post, text: 'Foo' }); - this.BaseSerializer = Serializer.extend({ - embed: false + this.BaseSerializer = Serializer.extend({ + embed: false + }); }); - }, - afterEach() { - this.schema.db.emptyData(); - } -}); + hooks.afterEach(function() { + this.schema.db.emptyData(); + }); -test(`it can serialize a polymorphic belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - comment: this.BaseSerializer.extend({ - include: ['commentable'] - }) - }); + test(`it can serialize a polymorphic belongs-to relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + comment: this.BaseSerializer.extend({ + include: ['commentable'] + }) + }); - let comment = this.schema.comments.find(1); - let result = registry.serialize(comment); + let comment = this.schema.comments.find(1); + let result = registry.serialize(comment); - assert.deepEqual(result, { - comment: { - id: '1', - text: 'Foo', - commentableType: 'post', - commentableId: '1' - }, - posts: [ - { id: '1', title: 'Lorem ipsum' } - ] - }); -}); + assert.deepEqual(result, { + comment: { + id: '1', + text: 'Foo', + commentableType: 'post', + commentableId: '1' + }, + posts: [ + { id: '1', title: 'Lorem ipsum' } + ] + }); + }); + } +); diff --git a/tests/integration/serializers/base/associations/polymorphic-has-many-test.js b/tests/integration/serializers/base/associations/polymorphic-has-many-test.js index 1c055bf44..7e915f233 100644 --- a/tests/integration/serializers/base/associations/polymorphic-has-many-test.js +++ b/tests/integration/serializers/base/associations/polymorphic-has-many-test.js @@ -5,49 +5,52 @@ import Serializer from 'ember-cli-mirage/serializer'; import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { module, test } from 'qunit'; -module('Integration | Serializers | Base | Associations | Polymorphic Has Many', { - beforeEach() { - this.schema = new Schema(new Db(), { - user: Model.extend({ - things: hasMany({ polymorphic: true }) - }), - picture: Model.extend() - }); +module( + 'Integration | Serializers | Base | Associations | Polymorphic Has Many', + function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + user: Model.extend({ + things: hasMany({ polymorphic: true }) + }), + picture: Model.extend() + }); - let post = this.schema.pictures.create({ title: 'Lorem ipsum' }); - this.schema.users.create({ things: [ post ], name: 'Ned' }); + let post = this.schema.pictures.create({ title: 'Lorem ipsum' }); + this.schema.users.create({ things: [ post ], name: 'Ned' }); - this.BaseSerializer = Serializer.extend({ - embed: false + this.BaseSerializer = Serializer.extend({ + embed: false + }); }); - }, - afterEach() { - this.schema.db.emptyData(); - } -}); + hooks.afterEach(function() { + this.schema.db.emptyData(); + }); -test(`it can serialize a polymorphic has-many relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - user: this.BaseSerializer.extend({ - include: ['things'] - }) - }); + test(`it can serialize a polymorphic has-many relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + user: this.BaseSerializer.extend({ + include: ['things'] + }) + }); - let user = this.schema.users.find(1); - let result = registry.serialize(user); + let user = this.schema.users.find(1); + let result = registry.serialize(user); - assert.deepEqual(result, { - user: { - id: '1', - name: 'Ned', - things: [ - { id: '1', type: 'picture' } - ] - }, - pictures: [ - { id: '1', title: 'Lorem ipsum' } - ] - }); -}); + assert.deepEqual(result, { + user: { + id: '1', + name: 'Ned', + things: [ + { id: '1', type: 'picture' } + ] + }, + pictures: [ + { id: '1', title: 'Lorem ipsum' } + ] + }); + }); + } +); diff --git a/tests/integration/serializers/base/associations/sideloading-assorted-collections-test.js b/tests/integration/serializers/base/associations/sideloading-assorted-collections-test.js index f66f6a625..1763d3105 100644 --- a/tests/integration/serializers/base/associations/sideloading-assorted-collections-test.js +++ b/tests/integration/serializers/base/associations/sideloading-assorted-collections-test.js @@ -5,64 +5,68 @@ import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import Serializer from 'ember-cli-mirage/serializer'; import { module, test } from 'qunit'; -module('Integration | Serializers | Base | Associations | Sideloading Assorted Collections', { - beforeEach() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - blogPosts: hasMany() - }), - blogPost: Model, - greatPhoto: Model - }); +module( + 'Integration | Serializers | Base | Associations | Sideloading Assorted Collections', + function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + blogPosts: hasMany() + }), + blogPost: Model, + greatPhoto: Model + }); - let BaseSerializer = Serializer.extend({ - embed: false - }); - this.registry = new SerializerRegistry(this.schema, { - application: BaseSerializer, - wordSmith: BaseSerializer.extend({ - include: ['blogPosts'] - }), - greatPhoto: BaseSerializer.extend({ - attrs: ['id', 'title'] - }) + let BaseSerializer = Serializer.extend({ + embed: false + }); + this.registry = new SerializerRegistry(this.schema, { + application: BaseSerializer, + wordSmith: BaseSerializer.extend({ + include: ['blogPosts'] + }), + greatPhoto: BaseSerializer.extend({ + attrs: ['id', 'title'] + }) + }); + this.wordSmiths = [ + { id: '1', name: 'Link', blogPostIds: ['1', '2'] }, + { id: '2', name: 'Zelda', blogPostIds: [] }, + { id: '3', name: 'Epona', blogPostIds: [] } + ]; + this.blogPosts = [ + { id: '1', title: 'Lorem' }, + { id: '2', title: 'Ipsum' } + ]; + this.greatPhotos = [ + { id: '1', title: 'Amazing', location: 'Hyrule' }, + { id: '2', title: 'greatPhoto', location: 'Goron City' } + ]; + this.schema.db.loadData({ + wordSmiths: this.wordSmiths, + blogPosts: this.blogPosts, + greatPhotos: this.greatPhotos + }); }); - this.wordSmiths = [ - { id: '1', name: 'Link', blogPostIds: ['1', '2'] }, - { id: '2', name: 'Zelda', blogPostIds: [] }, - { id: '3', name: 'Epona', blogPostIds: [] } - ]; - this.blogPosts = [ - { id: '1', title: 'Lorem' }, - { id: '2', title: 'Ipsum' } - ]; - this.greatPhotos = [ - { id: '1', title: 'Amazing', location: 'Hyrule' }, - { id: '2', title: 'greatPhoto', location: 'Goron City' } - ]; - this.schema.db.loadData({ - wordSmiths: this.wordSmiths, - blogPosts: this.blogPosts, - greatPhotos: this.greatPhotos + + hooks.afterEach(function() { + this.schema.db.emptyData(); }); - }, - afterEach() { - this.schema.db.emptyData(); - } -}); -/* - This is a strange response from a route handler, but it's used in the array get shorthand. Deprecate that shorthand? -*/ -test(`it can sideload an array of assorted collections that have relationships`, function(assert) { - let result = this.registry.serialize([this.schema.wordSmiths.all(), this.schema.greatPhotos.all()]); + /* + This is a strange response from a route handler, but it's used in the array get shorthand. Deprecate that shorthand? + */ + test(`it can sideload an array of assorted collections that have relationships`, function(assert) { + let result = this.registry.serialize([this.schema.wordSmiths.all(), this.schema.greatPhotos.all()]); - assert.deepEqual(result, { - wordSmiths: this.wordSmiths, - blogPosts: this.blogPosts, - greatPhotos: this.greatPhotos.map((attrs) => { - delete attrs.location; - return attrs; - }) - }); -}); + assert.deepEqual(result, { + wordSmiths: this.wordSmiths, + blogPosts: this.blogPosts, + greatPhotos: this.greatPhotos.map((attrs) => { + delete attrs.location; + return attrs; + }) + }); + }); + } +); diff --git a/tests/integration/serializers/base/associations/sideloading-collection-test.js b/tests/integration/serializers/base/associations/sideloading-collection-test.js index 6ea6e0f10..996f613c6 100644 --- a/tests/integration/serializers/base/associations/sideloading-collection-test.js +++ b/tests/integration/serializers/base/associations/sideloading-collection-test.js @@ -5,204 +5,207 @@ import Serializer from 'ember-cli-mirage/serializer'; import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { module, test } from 'qunit'; -module('Integration | Serializers | Base | Associations | Sideloading Collections', { - beforeEach() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - posts: hasMany('blog-post') - }), - blogPost: Model.extend({ - author: belongsTo('word-smith'), - comments: hasMany('fine-comment') - }), - fineComment: Model.extend({ - post: belongsTo('blog-post') - }) +module( + 'Integration | Serializers | Base | Associations | Sideloading Collections', + function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + posts: hasMany('blog-post') + }), + blogPost: Model.extend({ + author: belongsTo('word-smith'), + comments: hasMany('fine-comment') + }), + fineComment: Model.extend({ + post: belongsTo('blog-post') + }) + }); + + let link = this.schema.wordSmiths.create({ name: 'Link' }); + let blogPost = link.createPost({ title: 'Lorem' }); + link.createPost({ title: 'Ipsum' }); + + blogPost.createComment({ text: 'pwned' }); + + let zelda = this.schema.wordSmiths.create({ name: 'Zelda' }); + zelda.createPost({ title: `Zeldas blogPost` }); + + this.BaseSerializer = Serializer.extend({ + embed: false + }); }); - let link = this.schema.wordSmiths.create({ name: 'Link' }); - let blogPost = link.createPost({ title: 'Lorem' }); - link.createPost({ title: 'Ipsum' }); + hooks.afterEach(function() { + this.schema.db.emptyData(); + }); + + test(`it throws an error if embed is false and root is false`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + wordSmith: this.BaseSerializer.extend({ + root: false, + include: ['posts'] + }) + }); + + let wordSmiths = this.schema.wordSmiths.all(); + + assert.throws(function() { + registry.serialize(wordSmiths); + }, /disables the root/); + }); + + test(`it can sideload an empty collection`, function(assert) { + this.schema.db.emptyData(); + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + include: ['posts'] + }) + }); + + let result = registry.serialize(this.schema.wordSmiths.all()); - blogPost.createComment({ text: 'pwned' }); + assert.deepEqual(result, { + wordSmiths: [] + }); + }); + + test(`it can sideload a collection with a has-many relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + embed: false, + include: ['posts'] + }) + }); + + let wordSmiths = this.schema.wordSmiths.all(); + let result = registry.serialize(wordSmiths); + + assert.deepEqual(result, { + wordSmiths: [ + { id: '1', name: 'Link', postIds: ['1', '2'] }, + { id: '2', name: 'Zelda', postIds: ['3'] } + ], + blogPosts: [ + { id: '1', title: 'Lorem' }, + { id: '2', title: 'Ipsum' }, + { id: '3', title: 'Zeldas blogPost' } + ] + }); + }); - let zelda = this.schema.wordSmiths.create({ name: 'Zelda' }); - zelda.createPost({ title: `Zeldas blogPost` }); + test(`it can sideload a collection with a chain of has-many relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + embed: false, + include: ['posts'] + }), + blogPost: this.BaseSerializer.extend({ + include: ['comments'] + }) + }); + + let wordSmiths = this.schema.wordSmiths.all(); + let result = registry.serialize(wordSmiths); + + assert.deepEqual(result, { + wordSmiths: [ + { id: '1', name: 'Link', postIds: ['1', '2'] }, + { id: '2', name: 'Zelda', postIds: ['3'] } + ], + blogPosts: [ + { id: '1', title: 'Lorem', commentIds: ['1'] }, + { id: '2', title: 'Ipsum', commentIds: [] }, + { id: '3', title: 'Zeldas blogPost', commentIds: [] } + ], + fineComments: [ + { id: '1', text: 'pwned' } + ] + }); + }); - this.BaseSerializer = Serializer.extend({ - embed: false + test(`it avoids circularity when serializing a collection`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + embed: false, + include: ['posts'] + }), + blogPost: this.BaseSerializer.extend({ + include: ['author'] + }) + }); + + let wordSmiths = this.schema.wordSmiths.all(); + let result = registry.serialize(wordSmiths); + + assert.deepEqual(result, { + wordSmiths: [ + { id: '1', name: 'Link', postIds: ['1', '2'] }, + { id: '2', name: 'Zelda', postIds: ['3'] } + ], + blogPosts: [ + { id: '1', title: 'Lorem', authorId: '1' }, + { id: '2', title: 'Ipsum', authorId: '1' }, + { id: '3', title: 'Zeldas blogPost', authorId: '2' } + ] + }); }); - }, - afterEach() { - this.schema.db.emptyData(); + test(`it can sideload a collection with a belongs-to relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + blogPost: this.BaseSerializer.extend({ + embed: false, + include: ['author'] + }) + }); + + let blogPosts = this.schema.blogPosts.all(); + let result = registry.serialize(blogPosts); + + assert.deepEqual(result, { + blogPosts: [ + { id: '1', title: 'Lorem', authorId: '1' }, + { id: '2', title: 'Ipsum', authorId: '1' }, + { id: '3', title: 'Zeldas blogPost', authorId: '2' } + ], + wordSmiths: [ + { id: '1', name: 'Link' }, + { id: '2', name: 'Zelda' } + ] + }); + }); + + test(`it can sideload a collection with a chain of belongs-to relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + fineComment: this.BaseSerializer.extend({ + embed: false, + include: ['post'] + }), + blogPost: this.BaseSerializer.extend({ + include: ['author'] + }) + }); + + let fineComments = this.schema.fineComments.all(); + let result = registry.serialize(fineComments); + + assert.deepEqual(result, { + fineComments: [ + { id: '1', text: 'pwned', postId: '1' } + ], + blogPosts: [ + { id: '1', title: 'Lorem', authorId: '1' } + ], + wordSmiths: [ + { id: '1', name: 'Link' } + ] + }); + }); } -}); - -test(`it throws an error if embed is false and root is false`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - wordSmith: this.BaseSerializer.extend({ - root: false, - include: ['posts'] - }) - }); - - let wordSmiths = this.schema.wordSmiths.all(); - - assert.throws(function() { - registry.serialize(wordSmiths); - }, /disables the root/); -}); - -test(`it can sideload an empty collection`, function(assert) { - this.schema.db.emptyData(); - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }) - }); - - let result = registry.serialize(this.schema.wordSmiths.all()); - - assert.deepEqual(result, { - wordSmiths: [] - }); -}); - -test(`it can sideload a collection with a has-many relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - embed: false, - include: ['posts'] - }) - }); - - let wordSmiths = this.schema.wordSmiths.all(); - let result = registry.serialize(wordSmiths); - - assert.deepEqual(result, { - wordSmiths: [ - { id: '1', name: 'Link', postIds: ['1', '2'] }, - { id: '2', name: 'Zelda', postIds: ['3'] } - ], - blogPosts: [ - { id: '1', title: 'Lorem' }, - { id: '2', title: 'Ipsum' }, - { id: '3', title: 'Zeldas blogPost' } - ] - }); -}); - -test(`it can sideload a collection with a chain of has-many relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - embed: false, - include: ['posts'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['comments'] - }) - }); - - let wordSmiths = this.schema.wordSmiths.all(); - let result = registry.serialize(wordSmiths); - - assert.deepEqual(result, { - wordSmiths: [ - { id: '1', name: 'Link', postIds: ['1', '2'] }, - { id: '2', name: 'Zelda', postIds: ['3'] } - ], - blogPosts: [ - { id: '1', title: 'Lorem', commentIds: ['1'] }, - { id: '2', title: 'Ipsum', commentIds: [] }, - { id: '3', title: 'Zeldas blogPost', commentIds: [] } - ], - fineComments: [ - { id: '1', text: 'pwned' } - ] - }); -}); - -test(`it avoids circularity when serializing a collection`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - embed: false, - include: ['posts'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let wordSmiths = this.schema.wordSmiths.all(); - let result = registry.serialize(wordSmiths); - - assert.deepEqual(result, { - wordSmiths: [ - { id: '1', name: 'Link', postIds: ['1', '2'] }, - { id: '2', name: 'Zelda', postIds: ['3'] } - ], - blogPosts: [ - { id: '1', title: 'Lorem', authorId: '1' }, - { id: '2', title: 'Ipsum', authorId: '1' }, - { id: '3', title: 'Zeldas blogPost', authorId: '2' } - ] - }); -}); - -test(`it can sideload a collection with a belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - blogPost: this.BaseSerializer.extend({ - embed: false, - include: ['author'] - }) - }); - - let blogPosts = this.schema.blogPosts.all(); - let result = registry.serialize(blogPosts); - - assert.deepEqual(result, { - blogPosts: [ - { id: '1', title: 'Lorem', authorId: '1' }, - { id: '2', title: 'Ipsum', authorId: '1' }, - { id: '3', title: 'Zeldas blogPost', authorId: '2' } - ], - wordSmiths: [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ] - }); -}); - -test(`it can sideload a collection with a chain of belongs-to relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - fineComment: this.BaseSerializer.extend({ - embed: false, - include: ['post'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let fineComments = this.schema.fineComments.all(); - let result = registry.serialize(fineComments); - - assert.deepEqual(result, { - fineComments: [ - { id: '1', text: 'pwned', postId: '1' } - ], - blogPosts: [ - { id: '1', title: 'Lorem', authorId: '1' } - ], - wordSmiths: [ - { id: '1', name: 'Link' } - ] - }); -}); +); diff --git a/tests/integration/serializers/base/associations/sideloading-model-test.js b/tests/integration/serializers/base/associations/sideloading-model-test.js index 4ed443093..2cdb41609 100644 --- a/tests/integration/serializers/base/associations/sideloading-model-test.js +++ b/tests/integration/serializers/base/associations/sideloading-model-test.js @@ -5,179 +5,182 @@ import Serializer from 'ember-cli-mirage/serializer'; import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { module, test } from 'qunit'; -module('Integration | Serializers | Base | Associations | Sideloading Models', { - beforeEach() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - posts: hasMany('blog-post') - }), - blogPost: Model.extend({ - author: belongsTo('word-smith'), - comments: hasMany('fine-comment') - }), - fineComment: Model.extend({ - post: belongsTo('blog-post') - }) +module( + 'Integration | Serializers | Base | Associations | Sideloading Models', + function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + posts: hasMany('blog-post') + }), + blogPost: Model.extend({ + author: belongsTo('word-smith'), + comments: hasMany('fine-comment') + }), + fineComment: Model.extend({ + post: belongsTo('blog-post') + }) + }); + + let wordSmith = this.schema.wordSmiths.create({ name: 'Link' }); + let blogPost = wordSmith.createPost({ title: 'Lorem' }); + blogPost.createComment({ text: 'pwned' }); + + wordSmith.createPost({ title: 'Ipsum' }); + + this.schema.wordSmiths.create({ name: 'Zelda' }); + + this.BaseSerializer = Serializer.extend({ + embed: false + }); }); - let wordSmith = this.schema.wordSmiths.create({ name: 'Link' }); - let blogPost = wordSmith.createPost({ title: 'Lorem' }); - blogPost.createComment({ text: 'pwned' }); + hooks.afterEach(function() { + this.schema.db.emptyData(); + }); + + test(`it throws an error if embed is false and root is false`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + wordSmith: this.BaseSerializer.extend({ + root: false, + include: ['posts'] + }) + }); + + let link = this.schema.wordSmiths.find(1); + assert.throws(function() { + registry.serialize(link); + }, /disables the root/); + + }); - wordSmith.createPost({ title: 'Ipsum' }); + test(`it can sideload a model with a has-many relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + include: ['posts'] + }) + }); + + let link = this.schema.wordSmiths.find(1); + let result = registry.serialize(link); + + assert.deepEqual(result, { + wordSmith: { + id: '1', + name: 'Link', + postIds: ['1', '2'] + }, + blogPosts: [ + { id: '1', title: 'Lorem' }, + { id: '2', title: 'Ipsum' } + ] + }); + }); - this.schema.wordSmiths.create({ name: 'Zelda' }); + test(`it can sideload a model with a chain of has-many relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + include: ['posts'] + }), + blogPost: this.BaseSerializer.extend({ + include: ['comments'] + }) + }); + + let link = this.schema.wordSmiths.find(1); + let result = registry.serialize(link); + + assert.deepEqual(result, { + wordSmith: { + id: '1', + name: 'Link', + postIds: ['1', '2'] + }, + blogPosts: [ + { id: '1', title: 'Lorem', commentIds: ['1'] }, + { id: '2', title: 'Ipsum', commentIds: [] } + ], + fineComments: [ + { id: '1', text: 'pwned' } + ] + }); + }); - this.BaseSerializer = Serializer.extend({ - embed: false + test(`it avoids circularity when serializing a model`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + include: ['posts'] + }), + blogPost: this.BaseSerializer.extend({ + include: ['author'] + }) + }); + + let link = this.schema.wordSmiths.find(1); + let result = registry.serialize(link); + + assert.deepEqual(result, { + wordSmith: { + id: '1', + name: 'Link', + postIds: ['1', '2'] + }, + blogPosts: [ + { id: '1', title: 'Lorem', authorId: '1' }, + { id: '2', title: 'Ipsum', authorId: '1' } + ] + }); }); - }, - afterEach() { - this.schema.db.emptyData(); + test(`it can sideload a model with a belongs-to relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + blogPost: this.BaseSerializer.extend({ + include: ['author'] + }) + }); + + let blogPost = this.schema.blogPosts.find(1); + let result = registry.serialize(blogPost); + + assert.deepEqual(result, { + blogPost: { + id: '1', title: 'Lorem', authorId: '1' + }, + wordSmiths: [ + { id: '1', name: 'Link' } + ] + }); + }); + + test(`it can sideload a model with a chain of belongs-to relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + fineComment: this.BaseSerializer.extend({ + include: ['post'] + }), + blogPost: this.BaseSerializer.extend({ + include: ['author'] + }) + }); + + let fineComment = this.schema.fineComments.find(1); + let result = registry.serialize(fineComment); + + assert.deepEqual(result, { + fineComment: { + id: '1', text: 'pwned', postId: '1' + }, + blogPosts: [ + { id: '1', title: 'Lorem', authorId: '1' } + ], + wordSmiths: [ + { id: '1', name: 'Link' } + ] + }); + }); } -}); - -test(`it throws an error if embed is false and root is false`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - wordSmith: this.BaseSerializer.extend({ - root: false, - include: ['posts'] - }) - }); - - let link = this.schema.wordSmiths.find(1); - assert.throws(function() { - registry.serialize(link); - }, /disables the root/); - -}); - -test(`it can sideload a model with a has-many relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }) - }); - - let link = this.schema.wordSmiths.find(1); - let result = registry.serialize(link); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - postIds: ['1', '2'] - }, - blogPosts: [ - { id: '1', title: 'Lorem' }, - { id: '2', title: 'Ipsum' } - ] - }); -}); - -test(`it can sideload a model with a chain of has-many relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['comments'] - }) - }); - - let link = this.schema.wordSmiths.find(1); - let result = registry.serialize(link); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - postIds: ['1', '2'] - }, - blogPosts: [ - { id: '1', title: 'Lorem', commentIds: ['1'] }, - { id: '2', title: 'Ipsum', commentIds: [] } - ], - fineComments: [ - { id: '1', text: 'pwned' } - ] - }); -}); - -test(`it avoids circularity when serializing a model`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let link = this.schema.wordSmiths.find(1); - let result = registry.serialize(link); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - postIds: ['1', '2'] - }, - blogPosts: [ - { id: '1', title: 'Lorem', authorId: '1' }, - { id: '2', title: 'Ipsum', authorId: '1' } - ] - }); -}); - -test(`it can sideload a model with a belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let blogPost = this.schema.blogPosts.find(1); - let result = registry.serialize(blogPost); - - assert.deepEqual(result, { - blogPost: { - id: '1', title: 'Lorem', authorId: '1' - }, - wordSmiths: [ - { id: '1', name: 'Link' } - ] - }); -}); - -test(`it can sideload a model with a chain of belongs-to relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - fineComment: this.BaseSerializer.extend({ - include: ['post'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let fineComment = this.schema.fineComments.find(1); - let result = registry.serialize(fineComment); - - assert.deepEqual(result, { - fineComment: { - id: '1', text: 'pwned', postId: '1' - }, - blogPosts: [ - { id: '1', title: 'Lorem', authorId: '1' } - ], - wordSmiths: [ - { id: '1', name: 'Link' } - ] - }); -}); +); diff --git a/tests/integration/serializers/base/assorted-collections-test.js b/tests/integration/serializers/base/assorted-collections-test.js index ffb101acb..76482b8aa 100644 --- a/tests/integration/serializers/base/assorted-collections-test.js +++ b/tests/integration/serializers/base/assorted-collections-test.js @@ -3,41 +3,45 @@ import Serializer from 'ember-cli-mirage/serializer'; import schemaHelper from '../schema-helper'; import {module, test} from 'qunit'; -module('Integration | Serializers | Base | Assorted Collections', { - beforeEach() { - this.schema = schemaHelper.setup(); - this.registry = new SerializerRegistry(this.schema, { - greatPhoto: Serializer.extend({ - attrs: ['id', 'title'] - }) +module( + 'Integration | Serializers | Base | Assorted Collections', + function(hooks) { + hooks.beforeEach(function() { + this.schema = schemaHelper.setup(); + this.registry = new SerializerRegistry(this.schema, { + greatPhoto: Serializer.extend({ + attrs: ['id', 'title'] + }) + }); + this.wordSmiths = [ + { id: '1', name: 'Link' }, + { id: '2', name: 'Zelda' }, + { id: '3', name: 'Epona' } + ]; + this.greatPhotos = [ + { id: '1', title: 'Amazing', location: 'Hyrule' }, + { id: '2', title: 'greatPhoto', location: 'Goron City' } + ]; + this.schema.db.loadData({ + wordSmiths: this.wordSmiths, + greatPhotos: this.greatPhotos + }); }); - this.wordSmiths = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' }, - { id: '3', name: 'Epona' } - ]; - this.greatPhotos = [ - { id: '1', title: 'Amazing', location: 'Hyrule' }, - { id: '2', title: 'greatPhoto', location: 'Goron City' } - ]; - this.schema.db.loadData({ - wordSmiths: this.wordSmiths, - greatPhotos: this.greatPhotos + + hooks.afterEach(function() { + this.schema.db.emptyData(); }); - }, - afterEach() { - this.schema.db.emptyData(); - } -}); -test(`an array of assorted collections can be serialized`, function(assert) { - let result = this.registry.serialize([this.schema.wordSmiths.all(), this.schema.greatPhotos.all()]); + test(`an array of assorted collections can be serialized`, function(assert) { + let result = this.registry.serialize([this.schema.wordSmiths.all(), this.schema.greatPhotos.all()]); - assert.deepEqual(result, { - wordSmiths: this.wordSmiths, - greatPhotos: this.greatPhotos.map((attrs) => { - delete attrs.location; - return attrs; - }) - }); -}); + assert.deepEqual(result, { + wordSmiths: this.wordSmiths, + greatPhotos: this.greatPhotos.map((attrs) => { + delete attrs.location; + return attrs; + }) + }); + }); + } +); diff --git a/tests/integration/serializers/base/attribute-key-formatting-test.js b/tests/integration/serializers/base/attribute-key-formatting-test.js index 863ebc029..3bc55b7ac 100644 --- a/tests/integration/serializers/base/attribute-key-formatting-test.js +++ b/tests/integration/serializers/base/attribute-key-formatting-test.js @@ -4,53 +4,57 @@ import schemaHelper from '../schema-helper'; import { camelize } from 'ember-cli-mirage/utils/inflector'; import {module, test} from 'qunit'; -module('Integration | Serializers | Base | Attribute Key Formatting', { - beforeEach() { - this.schema = schemaHelper.setup(); - this.registry = new SerializerRegistry(this.schema, { - wordSmith: Serializer.extend({ - keyForAttribute(key) { - return camelize(key); +module( + 'Integration | Serializers | Base | Attribute Key Formatting', + function(hooks) { + hooks.beforeEach(function() { + this.schema = schemaHelper.setup(); + this.registry = new SerializerRegistry(this.schema, { + wordSmith: Serializer.extend({ + keyForAttribute(key) { + return camelize(key); + } + }) + }); + }); + + hooks.afterEach(function() { + this.schema.db.emptyData(); + }); + + test(`keyForAttribute formats the attributes of a model`, function(assert) { + let wordSmith = this.schema.wordSmiths.create({ + id: 1, + 'first-name': 'Link', + 'last-name': 'Jackson', + age: 323 + }); + + let result = this.registry.serialize(wordSmith); + + assert.deepEqual(result, { + wordSmith: { + id: '1', + firstName: 'Link', + lastName: 'Jackson', + age: 323 } - }) + }); + }); + + test(`keyForAttribute also formats the models in a collections`, function(assert) { + this.schema.wordSmiths.create({ id: 1, 'first-name': 'Link', 'last-name': 'Jackson' }); + this.schema.wordSmiths.create({ id: 2, 'first-name': 'Zelda', 'last-name': 'Brown' }); + let wordSmiths = this.schema.wordSmiths.all(); + + let result = this.registry.serialize(wordSmiths); + + assert.deepEqual(result, { + wordSmiths: [ + { id: '1', firstName: 'Link', lastName: 'Jackson' }, + { id: '2', firstName: 'Zelda', lastName: 'Brown' } + ] + }); }); - }, - afterEach() { - this.schema.db.emptyData(); } -}); - -test(`keyForAttribute formats the attributes of a model`, function(assert) { - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - 'first-name': 'Link', - 'last-name': 'Jackson', - age: 323 - }); - - let result = this.registry.serialize(wordSmith); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - firstName: 'Link', - lastName: 'Jackson', - age: 323 - } - }); -}); - -test(`keyForAttribute also formats the models in a collections`, function(assert) { - this.schema.wordSmiths.create({ id: 1, 'first-name': 'Link', 'last-name': 'Jackson' }); - this.schema.wordSmiths.create({ id: 2, 'first-name': 'Zelda', 'last-name': 'Brown' }); - let wordSmiths = this.schema.wordSmiths.all(); - - let result = this.registry.serialize(wordSmiths); - - assert.deepEqual(result, { - wordSmiths: [ - { id: '1', firstName: 'Link', lastName: 'Jackson' }, - { id: '2', firstName: 'Zelda', lastName: 'Brown' } - ] - }); -}); +); diff --git a/tests/integration/serializers/base/attrs-test.js b/tests/integration/serializers/base/attrs-test.js index 9d52e39bb..075cf842d 100644 --- a/tests/integration/serializers/base/attrs-test.js +++ b/tests/integration/serializers/base/attrs-test.js @@ -3,48 +3,49 @@ import Serializer from 'ember-cli-mirage/serializer'; import schemaHelper from '../schema-helper'; import { module, test } from 'qunit'; -module('Integration | Serializers | Base | Attrs List', { - beforeEach() { +module('Integration | Serializers | Base | Attrs List', function(hooks) { + hooks.beforeEach(function() { this.schema = schemaHelper.setup(); this.registry = new SerializerRegistry(this.schema, { wordSmith: Serializer.extend({ attrs: ['id', 'name'] }) }); - }, - afterEach() { - this.schema.db.emptyData(); - } -}); + }); -test(`it returns only the whitelisted attrs when serializing a model`, function(assert) { - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - name: 'Link', - age: 123 + hooks.afterEach(function() { + this.schema.db.emptyData(); }); - let result = this.registry.serialize(wordSmith); - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link' - } + test(`it returns only the whitelisted attrs when serializing a model`, function(assert) { + let wordSmith = this.schema.wordSmiths.create({ + id: 1, + name: 'Link', + age: 123 + }); + + let result = this.registry.serialize(wordSmith); + assert.deepEqual(result, { + wordSmith: { + id: '1', + name: 'Link' + } + }); }); -}); -test(`it returns only the whitelisted attrs when serializing a collection`, function(assert) { - let { schema } = this; - schema.wordSmiths.create({ id: 1, name: 'Link', age: 123 }); - schema.wordSmiths.create({ id: 2, name: 'Zelda', age: 456 }); + test(`it returns only the whitelisted attrs when serializing a collection`, function(assert) { + let { schema } = this; + schema.wordSmiths.create({ id: 1, name: 'Link', age: 123 }); + schema.wordSmiths.create({ id: 2, name: 'Zelda', age: 456 }); - let collection = this.schema.wordSmiths.all(); - let result = this.registry.serialize(collection); + let collection = this.schema.wordSmiths.all(); + let result = this.registry.serialize(collection); - assert.deepEqual(result, { - wordSmiths: [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ] + assert.deepEqual(result, { + wordSmiths: [ + { id: '1', name: 'Link' }, + { id: '2', name: 'Zelda' } + ] + }); }); }); diff --git a/tests/integration/serializers/base/basic-test.js b/tests/integration/serializers/base/basic-test.js index dfeb3e255..dabef7757 100644 --- a/tests/integration/serializers/base/basic-test.js +++ b/tests/integration/serializers/base/basic-test.js @@ -4,83 +4,84 @@ import { module, test } from 'qunit'; import _uniqBy from 'lodash/uniqBy'; -module('Integration | Serializers | Base | Basic', { - beforeEach() { +module('Integration | Serializers | Base | Basic', function(hooks) { + hooks.beforeEach(function() { this.schema = schemaHelper.setup(); this.registry = new SerializerRegistry(this.schema); - }, - afterEach() { - this.schema.db.emptyData(); - } -}); + }); -test('it returns objects unaffected', function(assert) { - let result = this.registry.serialize({ oh: 'hai' }); + hooks.afterEach(function() { + this.schema.db.emptyData(); + }); - assert.deepEqual(result, { oh: 'hai' }); -}); + test('it returns objects unaffected', function(assert) { + let result = this.registry.serialize({ oh: 'hai' }); -test('it returns arrays unaffected', function(assert) { - let data = [{ id: '1', name: 'Link' }, { id: '2', name: 'Zelda' }]; - let result = this.registry.serialize(data); + assert.deepEqual(result, { oh: 'hai' }); + }); - assert.deepEqual(result, data); -}); + test('it returns arrays unaffected', function(assert) { + let data = [{ id: '1', name: 'Link' }, { id: '2', name: 'Zelda' }]; + let result = this.registry.serialize(data); -test('it returns empty arrays unaffected', function(assert) { - let result = this.registry.serialize([]); + assert.deepEqual(result, data); + }); - assert.deepEqual(result, []); -}); + test('it returns empty arrays unaffected', function(assert) { + let result = this.registry.serialize([]); -test(`it serializes a model by returning its attrs under a root`, function(assert) { - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - name: 'Link' + assert.deepEqual(result, []); }); - let result = this.registry.serialize(wordSmith); - assert.deepEqual(result, { - wordSmith: { - id: '1', + test(`it serializes a model by returning its attrs under a root`, function(assert) { + let wordSmith = this.schema.wordSmiths.create({ + id: 1, name: 'Link' - } + }); + let result = this.registry.serialize(wordSmith); + + assert.deepEqual(result, { + wordSmith: { + id: '1', + name: 'Link' + } + }); }); -}); -test(`it serializes a collection of models by returning an array of their attrs under a pluralized root`, function(assert) { - this.schema.wordSmiths.create({ id: 1, name: 'Link' }); - this.schema.wordSmiths.create({ id: 2, name: 'Zelda' }); + test(`it serializes a collection of models by returning an array of their attrs under a pluralized root`, function(assert) { + this.schema.wordSmiths.create({ id: 1, name: 'Link' }); + this.schema.wordSmiths.create({ id: 2, name: 'Zelda' }); - let wordSmiths = this.schema.wordSmiths.all(); + let wordSmiths = this.schema.wordSmiths.all(); - let result = this.registry.serialize(wordSmiths); + let result = this.registry.serialize(wordSmiths); - assert.deepEqual(result, { - wordSmiths: [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ] + assert.deepEqual(result, { + wordSmiths: [ + { id: '1', name: 'Link' }, + { id: '2', name: 'Zelda' } + ] + }); }); -}); -test(`it can serialize an empty collection`, function(assert) { - let wordSmiths = this.schema.wordSmiths.all(); - let result = this.registry.serialize(wordSmiths); + test(`it can serialize an empty collection`, function(assert) { + let wordSmiths = this.schema.wordSmiths.all(); + let result = this.registry.serialize(wordSmiths); - assert.deepEqual(result, { - wordSmiths: [] + assert.deepEqual(result, { + wordSmiths: [] + }); }); -}); -test('it returns POJAs of models unaffected', function(assert) { - this.schema.wordSmiths.create({ name: 'Sam' }); - this.schema.wordSmiths.create({ name: 'Sam' }); - this.schema.wordSmiths.create({ name: 'Ganondorf' }); + test('it returns POJAs of models unaffected', function(assert) { + this.schema.wordSmiths.create({ name: 'Sam' }); + this.schema.wordSmiths.create({ name: 'Sam' }); + this.schema.wordSmiths.create({ name: 'Ganondorf' }); - let wordSmiths = this.schema.wordSmiths.all().models; - let uniqueNames = _uniqBy(wordSmiths, 'name'); - let result = this.registry.serialize(uniqueNames); + let wordSmiths = this.schema.wordSmiths.all().models; + let uniqueNames = _uniqBy(wordSmiths, 'name'); + let result = this.registry.serialize(uniqueNames); - assert.deepEqual(result, uniqueNames); + assert.deepEqual(result, uniqueNames); + }); }); diff --git a/tests/integration/serializers/base/full-request-test.js b/tests/integration/serializers/base/full-request-test.js index a9a66d8bb..97536406e 100644 --- a/tests/integration/serializers/base/full-request-test.js +++ b/tests/integration/serializers/base/full-request-test.js @@ -4,8 +4,8 @@ import Model from 'ember-cli-mirage/orm/model'; import Serializer from 'ember-cli-mirage/serializer'; import {module, test} from 'qunit'; -module('Integration | Serializers | Base | Full Request', { - beforeEach() { +module('Integration | Serializers | Base | Full Request', function(hooks) { + hooks.beforeEach(function() { this.server = new Server({ environment: 'development', models: { @@ -41,122 +41,123 @@ module('Integration | Serializers | Base | Full Request', { }); this.server.timing = 0; this.server.logging = false; - }, - afterEach() { - this.server.shutdown(); - } -}); - -test('the appropriate serializer is used', function(assert) { - assert.expect(1); - let done = assert.async(); - let author = this.server.schema.authors.create({ - first: 'Link', - last: 'of Hyrule', - age: 323 }); - author.createPost({ title: 'Lorem ipsum' }); - this.server.get('/authors/:id', function(schema, request) { - let { id } = request.params; - - return schema.authors.find(id); + hooks.afterEach(function() { + this.server.shutdown(); }); - $.ajax({ - method: 'GET', - url: '/authors/1' - }).done(function(res) { - assert.deepEqual(res, { - author: { - id: '1', - first: 'Link', - posts: [ - { id: '1', title: 'Lorem ipsum' } - ] - } + test('the appropriate serializer is used', function(assert) { + assert.expect(1); + let done = assert.async(); + let author = this.server.schema.authors.create({ + first: 'Link', + last: 'of Hyrule', + age: 323 }); - done(); - }); -}); + author.createPost({ title: 'Lorem ipsum' }); -test('components decoded', function(assert) { - assert.expect(1); - let done = assert.async(); + this.server.get('/authors/:id', function(schema, request) { + let { id } = request.params; - this.server.get('/authors/:id', function(schema, request) { - let { id } = request.params; - - return { data: { id } }; - }); + return schema.authors.find(id); + }); - $.ajax({ - method: 'GET', - url: '/authors/%3A1' - }).done(function(res) { - assert.deepEqual(res, { - data: { id: ':1' } + $.ajax({ + method: 'GET', + url: '/authors/1' + }).done(function(res) { + assert.deepEqual(res, { + author: { + id: '1', + first: 'Link', + posts: [ + { id: '1', title: 'Lorem ipsum' } + ] + } + }); + done(); }); - done(); }); -}); -test('a response falls back to the application serializer, if it exists', function(assert) { - assert.expect(1); - let done = assert.async(); - this.server.schema.posts.create({ - title: 'Lorem', - date: '20001010' - }); + test('components decoded', function(assert) { + assert.expect(1); + let done = assert.async(); - this.server.get('/posts/:id', function(schema, request) { - let { id } = request.params; + this.server.get('/authors/:id', function(schema, request) { + let { id } = request.params; - return schema.posts.find(id); + return { data: { id } }; + }); + + $.ajax({ + method: 'GET', + url: '/authors/%3A1' + }).done(function(res) { + assert.deepEqual(res, { + data: { id: ':1' } + }); + done(); + }); }); - $.ajax({ - method: 'GET', - url: '/posts/1' - }).done(function(res) { - assert.deepEqual(res, { - id: '1', + test('a response falls back to the application serializer, if it exists', function(assert) { + assert.expect(1); + let done = assert.async(); + this.server.schema.posts.create({ title: 'Lorem', date: '20001010' }); - done(); - }); -}); -test('serializer.include is invoked when it is a function', function(assert) { - assert.expect(1); - let done = assert.async(); - let post = this.server.schema.posts.create({ - title: 'Lorem', - date: '20001010' - }); - post.createComment({ - description: 'Lorem is the best' - }); + this.server.get('/posts/:id', function(schema, request) { + let { id } = request.params; - this.server.get('/comments/:id', function(schema, request) { - let { id } = request.params; - return schema.comments.find(id); - }); + return schema.posts.find(id); + }); - $.ajax({ - method: 'GET', - url: '/comments/1?include_post=true' - }).done(function(res) { - assert.deepEqual(res, { - id: '1', - description: 'Lorem is the best', - post: { + $.ajax({ + method: 'GET', + url: '/posts/1' + }).done(function(res) { + assert.deepEqual(res, { id: '1', title: 'Lorem', date: '20001010' - } + }); + done(); + }); + }); + + test('serializer.include is invoked when it is a function', function(assert) { + assert.expect(1); + let done = assert.async(); + let post = this.server.schema.posts.create({ + title: 'Lorem', + date: '20001010' + }); + post.createComment({ + description: 'Lorem is the best' + }); + + this.server.get('/comments/:id', function(schema, request) { + let { id } = request.params; + return schema.comments.find(id); + }); + + $.ajax({ + method: 'GET', + url: '/comments/1?include_post=true' + }).done(function(res) { + assert.deepEqual(res, { + id: '1', + description: 'Lorem is the best', + post: { + id: '1', + title: 'Lorem', + date: '20001010' + } + }); + done(); }); - done(); }); }); diff --git a/tests/integration/serializers/base/override-serialize-test.js b/tests/integration/serializers/base/override-serialize-test.js index 9bdc364e7..8f6e1651e 100644 --- a/tests/integration/serializers/base/override-serialize-test.js +++ b/tests/integration/serializers/base/override-serialize-test.js @@ -3,71 +3,75 @@ import Serializer from 'ember-cli-mirage/serializer'; import schemaHelper from '../schema-helper'; import { module, test } from 'qunit'; -module('Integration | Serializers | Base | Overriding Serialize', { - beforeEach() { - this.schema = schemaHelper.setup(); - }, - afterEach() { - this.schema.db.emptyData(); - } -}); +module( + 'Integration | Serializers | Base | Overriding Serialize', + function(hooks) { + hooks.beforeEach(function() { + this.schema = schemaHelper.setup(); + }); + + hooks.afterEach(function() { + this.schema.db.emptyData(); + }); -test(`it can use a completely custom serialize function`, function(assert) { - this.registry = new SerializerRegistry(this.schema, { - wordSmith: Serializer.extend({ - serialize() { - return 'blah'; - } - }) - }); + test(`it can use a completely custom serialize function`, function(assert) { + this.registry = new SerializerRegistry(this.schema, { + wordSmith: Serializer.extend({ + serialize() { + return 'blah'; + } + }) + }); - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - title: 'Link' - }); + let wordSmith = this.schema.wordSmiths.create({ + id: 1, + title: 'Link' + }); - let result = this.registry.serialize(wordSmith); + let result = this.registry.serialize(wordSmith); - assert.deepEqual(result, 'blah'); -}); + assert.deepEqual(result, 'blah'); + }); -test(`it can access the request in a custom serialize function`, function(assert) { - this.registry = new SerializerRegistry(this.schema, { - wordSmith: Serializer.extend({ - serialize(response, request) { - return request.queryParams.foo || 'blah'; - } - }) - }); + test(`it can access the request in a custom serialize function`, function(assert) { + this.registry = new SerializerRegistry(this.schema, { + wordSmith: Serializer.extend({ + serialize(response, request) { + return request.queryParams.foo || 'blah'; + } + }) + }); - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - title: 'Link' - }); + let wordSmith = this.schema.wordSmiths.create({ + id: 1, + title: 'Link' + }); - let request = { url: '/word-smiths/1?foo=bar', params: { id: '1' }, queryParams: { foo: 'bar' } }; - let result = this.registry.serialize(wordSmith, request); + let request = { url: '/word-smiths/1?foo=bar', params: { id: '1' }, queryParams: { foo: 'bar' } }; + let result = this.registry.serialize(wordSmith, request); - assert.deepEqual(result, 'bar'); -}); + assert.deepEqual(result, 'bar'); + }); -test(`it can access the databse while in a serializer method`, function(assert) { - this.registry = new SerializerRegistry(this.schema, { - wordSmith: Serializer.extend({ - serialize(response, request) { - let id = request.params.id; - return this.schema.db.wordSmiths.find(id).title || 'No title'; - } - }) - }); + test(`it can access the databse while in a serializer method`, function(assert) { + this.registry = new SerializerRegistry(this.schema, { + wordSmith: Serializer.extend({ + serialize(response, request) { + let id = request.params.id; + return this.schema.db.wordSmiths.find(id).title || 'No title'; + } + }) + }); - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - title: 'Title in database' - }); + let wordSmith = this.schema.wordSmiths.create({ + id: 1, + title: 'Title in database' + }); - let request = { url: '/word-smiths/1?foo=bar', params: { id: '1' }, queryParams: { foo: 'bar' } }; - let result = this.registry.serialize(wordSmith, request); + let request = { url: '/word-smiths/1?foo=bar', params: { id: '1' }, queryParams: { foo: 'bar' } }; + let result = this.registry.serialize(wordSmith, request); - assert.deepEqual(result, 'Title in database'); -}); \ No newline at end of file + assert.deepEqual(result, 'Title in database'); + }); + } +); \ No newline at end of file diff --git a/tests/integration/serializers/base/root-test.js b/tests/integration/serializers/base/root-test.js index 604a89834..9be6947e1 100644 --- a/tests/integration/serializers/base/root-test.js +++ b/tests/integration/serializers/base/root-test.js @@ -3,8 +3,8 @@ import Serializer from 'ember-cli-mirage/serializer'; import schemaHelper from '../schema-helper'; import { module, test } from 'qunit'; -module('Integration | Serializers | Base | Root', { - beforeEach() { +module('Integration | Serializers | Base | Root', function(hooks) { + hooks.beforeEach(function() { this.schema = schemaHelper.setup(); this.registry = new SerializerRegistry(this.schema, { wordSmith: Serializer.extend({ @@ -12,41 +12,42 @@ module('Integration | Serializers | Base | Root', { root: false }) }); - }, - afterEach() { - this.schema.db.emptyData(); - } -}); + }); -test(`if root is false, it serializes a model by returning its attrs`, function(assert) { - let wordSmith = this.schema.wordSmiths.create({ - id: '1', - name: 'Link' + hooks.afterEach(function() { + this.schema.db.emptyData(); }); - let result = this.registry.serialize(wordSmith); - assert.deepEqual(result, { - id: '1', - name: 'Link' + test(`if root is false, it serializes a model by returning its attrs`, function(assert) { + let wordSmith = this.schema.wordSmiths.create({ + id: '1', + name: 'Link' + }); + + let result = this.registry.serialize(wordSmith); + assert.deepEqual(result, { + id: '1', + name: 'Link' + }); }); -}); -test(`if root is false, it serializes a collection of models by returning an array of their attrs`, function(assert) { - this.schema.wordSmiths.create({ id: 1, name: 'Link' }); - this.schema.wordSmiths.create({ id: 2, name: 'Zelda' }); - let wordSmiths = this.schema.wordSmiths.all(); + test(`if root is false, it serializes a collection of models by returning an array of their attrs`, function(assert) { + this.schema.wordSmiths.create({ id: 1, name: 'Link' }); + this.schema.wordSmiths.create({ id: 2, name: 'Zelda' }); + let wordSmiths = this.schema.wordSmiths.all(); - let result = this.registry.serialize(wordSmiths); + let result = this.registry.serialize(wordSmiths); - assert.deepEqual(result, [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ]); -}); + assert.deepEqual(result, [ + { id: '1', name: 'Link' }, + { id: '2', name: 'Zelda' } + ]); + }); -test(`if root is false, it serializes an empty collection by returning an empty array`, function(assert) { - let emptywordSmithCollection = this.schema.wordSmiths.all(); - let result = this.registry.serialize(emptywordSmithCollection); + test(`if root is false, it serializes an empty collection by returning an empty array`, function(assert) { + let emptywordSmithCollection = this.schema.wordSmiths.all(); + let result = this.registry.serialize(emptywordSmithCollection); - assert.deepEqual(result, []); + assert.deepEqual(result, []); + }); }); diff --git a/tests/integration/serializers/base/serialize-array-of-models-test.js b/tests/integration/serializers/base/serialize-array-of-models-test.js index 4e15c949e..367ac8009 100644 --- a/tests/integration/serializers/base/serialize-array-of-models-test.js +++ b/tests/integration/serializers/base/serialize-array-of-models-test.js @@ -3,28 +3,29 @@ import Serializer from 'ember-cli-mirage/serializer'; import schemaHelper from '../schema-helper'; import { module, test } from 'qunit'; -module('Integration | Serializers | Base | Array of Models', { - beforeEach() { +module('Integration | Serializers | Base | Array of Models', function(hooks) { + hooks.beforeEach(function() { this.schema = schemaHelper.setup(); this.schema.wordSmiths.create({ id: 1, title: 'Link' }); - }, - afterEach() { + }); + + hooks.afterEach(function() { this.schema.db.emptyData(); - } -}); + }); -test(`it applies correct serializer when the response is an array of models`, function(assert) { - assert.expect(1); + test(`it applies correct serializer when the response is an array of models`, function(assert) { + assert.expect(1); - let wordSmiths = this.schema.wordSmiths.all().filter(() => true); - let registry = new SerializerRegistry(this.schema, { - wordSmith: Serializer.extend({ - serialize() { - assert.ok('serializer ran'); - return {}; - } - }) - }); + let wordSmiths = this.schema.wordSmiths.all().filter(() => true); + let registry = new SerializerRegistry(this.schema, { + wordSmith: Serializer.extend({ + serialize() { + assert.ok('serializer ran'); + return {}; + } + }) + }); - registry.serialize(wordSmiths); + registry.serialize(wordSmiths); + }); }); diff --git a/tests/integration/serializers/base/serialize-ids-test.js b/tests/integration/serializers/base/serialize-ids-test.js index c2e1932ee..41f885771 100644 --- a/tests/integration/serializers/base/serialize-ids-test.js +++ b/tests/integration/serializers/base/serialize-ids-test.js @@ -4,8 +4,8 @@ import Db from 'ember-cli-mirage/db'; import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { Serializer, Model, hasMany } from 'ember-cli-mirage'; -module('Integration | Serializers | Base | Serialize ids', { - beforeEach() { +module('Integration | Serializers | Base | Serialize ids', function(hooks) { + hooks.beforeEach(function() { this.schema = new Schema(new Db(), { wordSmith: Model.extend({ blogPosts: hasMany(), @@ -13,67 +13,68 @@ module('Integration | Serializers | Base | Serialize ids', { }), blogPost: Model }); - }, - afterEach() { - this.schema.db.emptyData(); - } -}); - -test(`if serializeIds is 'include' it serializes ids of hasMany associations that are included`, function(assert) { - let ApplicationSerializer = Serializer.extend({ - serializeIds: 'included' - }); - let registry = new SerializerRegistry(this.schema, { - application: ApplicationSerializer, - wordSmith: ApplicationSerializer.extend({ - include: ['blogPosts'] - }) }); - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - name: 'Link' + hooks.afterEach(function() { + this.schema.db.emptyData(); }); - wordSmith.createBlogPost(); - wordSmith.createBlogPost(); - wordSmith.createSpecialPost(); - let result = registry.serialize(wordSmith); - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - blogPostIds: ['1', '2'] - }, - blogPosts: [ - { id: '1' }, - { id: '2' } - ] - }); -}); + test(`if serializeIds is 'include' it serializes ids of hasMany associations that are included`, function(assert) { + let ApplicationSerializer = Serializer.extend({ + serializeIds: 'included' + }); + let registry = new SerializerRegistry(this.schema, { + application: ApplicationSerializer, + wordSmith: ApplicationSerializer.extend({ + include: ['blogPosts'] + }) + }); -test(`if serializeIds is 'always' it serializes ids of all hasMany associations`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: Serializer.extend({ - serializeIds: 'always' - }) - }); + let wordSmith = this.schema.wordSmiths.create({ + id: 1, + name: 'Link' + }); + wordSmith.createBlogPost(); + wordSmith.createBlogPost(); + wordSmith.createSpecialPost(); + let result = registry.serialize(wordSmith); - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - name: 'Link' + assert.deepEqual(result, { + wordSmith: { + id: '1', + name: 'Link', + blogPostIds: ['1', '2'] + }, + blogPosts: [ + { id: '1' }, + { id: '2' } + ] + }); }); - wordSmith.createBlogPost(); - wordSmith.createBlogPost(); - wordSmith.createSpecialPost(); - let result = registry.serialize(wordSmith); - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - blogPostIds: ['1', '2'], - specialPostIds: ['3'] - } + test(`if serializeIds is 'always' it serializes ids of all hasMany associations`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: Serializer.extend({ + serializeIds: 'always' + }) + }); + + let wordSmith = this.schema.wordSmiths.create({ + id: 1, + name: 'Link' + }); + wordSmith.createBlogPost(); + wordSmith.createBlogPost(); + wordSmith.createSpecialPost(); + let result = registry.serialize(wordSmith); + + assert.deepEqual(result, { + wordSmith: { + id: '1', + name: 'Link', + blogPostIds: ['1', '2'], + specialPostIds: ['3'] + } + }); }); }); diff --git a/tests/integration/serializers/json-api-serializer/associations/collection-test.js b/tests/integration/serializers/json-api-serializer/associations/collection-test.js index bd29663d5..458679ab7 100644 --- a/tests/integration/serializers/json-api-serializer/associations/collection-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/collection-test.js @@ -4,452 +4,455 @@ import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { Model, hasMany, belongsTo, JSONAPISerializer } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | Serializers | JSON API Serializer | Associations | Collection', { - beforeEach() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - posts: hasMany('blogPost', { inverse: 'author' }) - }), - blogPost: Model.extend({ - author: belongsTo('wordSmith', { inverse: 'posts' }), - comments: hasMany('fineComment', { inverse: 'post' }) - }), - fineComment: Model.extend({ - post: belongsTo('blogPost') - }) +module( + 'Integration | Serializers | JSON API Serializer | Associations | Collection', + function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + posts: hasMany('blogPost', { inverse: 'author' }) + }), + blogPost: Model.extend({ + author: belongsTo('wordSmith', { inverse: 'posts' }), + comments: hasMany('fineComment', { inverse: 'post' }) + }), + fineComment: Model.extend({ + post: belongsTo('blogPost') + }) + }); }); - } -}); -test(`by default, it doesn't include a collection's relationships if those relationships are not included in the document and no links are defined`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer - }); - this.schema.wordSmiths.create({ firstName: 'Link', age: 123 }); - this.schema.wordSmiths.create({ firstName: 'Zelda', age: 456 }); + test(`by default, it doesn't include a collection's relationships if those relationships are not included in the document and no links are defined`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer + }); + this.schema.wordSmiths.create({ firstName: 'Link', age: 123 }); + this.schema.wordSmiths.create({ firstName: 'Zelda', age: 456 }); - let collection = this.schema.wordSmiths.all(); - let result = registry.serialize(collection); + let collection = this.schema.wordSmiths.all(); + let result = registry.serialize(collection); - assert.deepEqual(result, { - data: [{ - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link', - age: 123 - } - }, { - type: 'word-smiths', - id: '2', - attributes: { - 'first-name': 'Zelda', - age: 456 - } - }] - }); -}); + assert.deepEqual(result, { + data: [{ + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link', + age: 123 + } + }, { + type: 'word-smiths', + id: '2', + attributes: { + 'first-name': 'Zelda', + age: 456 + } + }] + }); + }); -test(`when alwaysIncludeLinkageData is true, it contains linkage data for all a collection's relationships, regardless of includes`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer.extend({ - alwaysIncludeLinkageData: true - }) - }); - this.schema.wordSmiths.create({ firstName: 'Link', age: 123 }); - this.schema.wordSmiths.create({ firstName: 'Zelda', age: 456 }); + test(`when alwaysIncludeLinkageData is true, it contains linkage data for all a collection's relationships, regardless of includes`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer.extend({ + alwaysIncludeLinkageData: true + }) + }); + this.schema.wordSmiths.create({ firstName: 'Link', age: 123 }); + this.schema.wordSmiths.create({ firstName: 'Zelda', age: 456 }); - let collection = this.schema.wordSmiths.all(); - let result = registry.serialize(collection); + let collection = this.schema.wordSmiths.all(); + let result = registry.serialize(collection); - assert.deepEqual(result, { - data: [{ - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link', - age: 123 - }, - relationships: { - 'posts': { - data: [] - } - } - }, { - type: 'word-smiths', - id: '2', - attributes: { - 'first-name': 'Zelda', - age: 456 - }, - relationships: { - 'posts': { - data: [] - } - } - }] - }); -}); + assert.deepEqual(result, { + data: [{ + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link', + age: 123 + }, + relationships: { + 'posts': { + data: [] + } + } + }, { + type: 'word-smiths', + id: '2', + attributes: { + 'first-name': 'Zelda', + age: 456 + }, + relationships: { + 'posts': { + data: [] + } + } + }] + }); + }); -test(`it includes linkage data for a has-many relationship that's being included`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - wordSmith: JSONAPISerializer.extend({ - include: ['posts'] - }) - }); - let link = this.schema.wordSmiths.create({ firstName: 'Link' }); - link.createPost({ title: 'Lorem' }); - link.createPost({ title: 'Ipsum' }); - this.schema.wordSmiths.create({ firstName: 'Zelda' }); + test(`it includes linkage data for a has-many relationship that's being included`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + wordSmith: JSONAPISerializer.extend({ + include: ['posts'] + }) + }); + let link = this.schema.wordSmiths.create({ firstName: 'Link' }); + link.createPost({ title: 'Lorem' }); + link.createPost({ title: 'Ipsum' }); + this.schema.wordSmiths.create({ firstName: 'Zelda' }); - let collection = this.schema.wordSmiths.all(); - let result = registry.serialize(collection); + let collection = this.schema.wordSmiths.all(); + let result = registry.serialize(collection); - assert.deepEqual(result, { - data: [ - { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - }, - relationships: { - 'posts': { - data: [ - { type: 'blog-posts', id: '1' }, - { type: 'blog-posts', id: '2' } - ] + assert.deepEqual(result, { + data: [ + { + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link' + }, + relationships: { + 'posts': { + data: [ + { type: 'blog-posts', id: '1' }, + { type: 'blog-posts', id: '2' } + ] + } + } + }, + { + type: 'word-smiths', + id: '2', + attributes: { + 'first-name': 'Zelda' + }, + relationships: { + 'posts': { + data: [] + } + } } - } - }, - { - type: 'word-smiths', - id: '2', - attributes: { - 'first-name': 'Zelda' - }, - relationships: { - 'posts': { - data: [] + ], + included: [ + { + type: 'blog-posts', + id: '1', + attributes: { + title: 'Lorem' + } + }, + { + type: 'blog-posts', + id: '2', + attributes: { + title: 'Ipsum' + } } - } - } - ], - included: [ - { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - } - }, - { - type: 'blog-posts', - id: '2', - attributes: { - title: 'Ipsum' - } - } - ] - }); -}); + ] + }); + }); -test(`it can serialize a collection with a chain of has-many relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - wordSmith: JSONAPISerializer.extend({ - include: ['posts'] - }), - blogPost: JSONAPISerializer.extend({ - include: ['comments'] - }) - }); + test(`it can serialize a collection with a chain of has-many relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + wordSmith: JSONAPISerializer.extend({ + include: ['posts'] + }), + blogPost: JSONAPISerializer.extend({ + include: ['comments'] + }) + }); - let link = this.schema.wordSmiths.create({ firstName: 'Link' }); - let lorem = link.createPost({ title: 'Lorem' }); - lorem.createComment({ text: 'pwned' }); - link.createPost({ title: 'Ipsum' }); - this.schema.wordSmiths.create({ firstName: 'Zelda' }); + let link = this.schema.wordSmiths.create({ firstName: 'Link' }); + let lorem = link.createPost({ title: 'Lorem' }); + lorem.createComment({ text: 'pwned' }); + link.createPost({ title: 'Ipsum' }); + this.schema.wordSmiths.create({ firstName: 'Zelda' }); - let collection = this.schema.wordSmiths.all(); - let result = registry.serialize(collection); + let collection = this.schema.wordSmiths.all(); + let result = registry.serialize(collection); - assert.deepEqual(result, { - data: [ - { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - }, - relationships: { - 'posts': { - data: [ - { type: 'blog-posts', id: '1' }, - { type: 'blog-posts', id: '2' } - ] - } - } - }, - { - type: 'word-smiths', - id: '2', - attributes: { - 'first-name': 'Zelda' - }, - relationships: { - 'posts': { - data: [] - } - } - } - ], - included: [ - { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - }, - relationships: { - 'comments': { - data: [ - { type: 'fine-comments', id: '1' } - ] + assert.deepEqual(result, { + data: [ + { + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link' + }, + relationships: { + 'posts': { + data: [ + { type: 'blog-posts', id: '1' }, + { type: 'blog-posts', id: '2' } + ] + } + } + }, + { + type: 'word-smiths', + id: '2', + attributes: { + 'first-name': 'Zelda' + }, + relationships: { + 'posts': { + data: [] + } + } } - } - }, - { - type: 'fine-comments', - id: '1', - attributes: { - text: 'pwned' - } - }, - { - type: 'blog-posts', - id: '2', - attributes: { - title: 'Ipsum' - }, - relationships: { - 'comments': { - data: [] + ], + included: [ + { + type: 'blog-posts', + id: '1', + attributes: { + title: 'Lorem' + }, + relationships: { + 'comments': { + data: [ + { type: 'fine-comments', id: '1' } + ] + } + } + }, + { + type: 'fine-comments', + id: '1', + attributes: { + text: 'pwned' + } + }, + { + type: 'blog-posts', + id: '2', + attributes: { + title: 'Ipsum' + }, + relationships: { + 'comments': { + data: [] + } + } } - } - } - ] - }); -}); + ] + }); + }); -test(`it can serialize a collection with a belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - include: ['author'] - }) - }); + test(`it can serialize a collection with a belongs-to relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + blogPost: JSONAPISerializer.extend({ + include: ['author'] + }) + }); - let link = this.schema.wordSmiths.create({ firstName: 'Link' }); - let post = link.createPost({ title: 'Lorem' }); - post.createComment(); - link.createPost({ title: 'Ipsum' }); - this.schema.wordSmiths.create({ firstName: 'Zelda' }); + let link = this.schema.wordSmiths.create({ firstName: 'Link' }); + let post = link.createPost({ title: 'Lorem' }); + post.createComment(); + link.createPost({ title: 'Ipsum' }); + this.schema.wordSmiths.create({ firstName: 'Zelda' }); - let blogPosts = this.schema.blogPosts.all(); - let result = registry.serialize(blogPosts); + let blogPosts = this.schema.blogPosts.all(); + let result = registry.serialize(blogPosts); - assert.deepEqual(result, { - data: [ - { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - }, - relationships: { - 'author': { - data: { type: 'word-smiths', id: '1' } + assert.deepEqual(result, { + data: [ + { + type: 'blog-posts', + id: '1', + attributes: { + title: 'Lorem' + }, + relationships: { + 'author': { + data: { type: 'word-smiths', id: '1' } + } + } + }, + { + type: 'blog-posts', + id: '2', + attributes: { + title: 'Ipsum' + }, + relationships: { + 'author': { + data: { type: 'word-smiths', id: '1' } + } + } } - } - }, - { - type: 'blog-posts', - id: '2', - attributes: { - title: 'Ipsum' - }, - relationships: { - 'author': { - data: { type: 'word-smiths', id: '1' } + ], + included: [ + { + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link' + } } - } - } - ], - included: [ - { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - } - } - ] - }); -}); + ] + }); + }); -test(`it can serialize a collection with a chain of belongs-to relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - fineComment: JSONAPISerializer.extend({ - include: ['post'] - }), - blogPost: JSONAPISerializer.extend({ - include: ['author'] - }) - }); + test(`it can serialize a collection with a chain of belongs-to relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + fineComment: JSONAPISerializer.extend({ + include: ['post'] + }), + blogPost: JSONAPISerializer.extend({ + include: ['author'] + }) + }); - let link = this.schema.wordSmiths.create({ firstName: 'Link' }); - let post = link.createPost({ title: 'Lorem' }); - post.createComment({ text: 'pwned' }); - link.createPost({ title: 'Ipsum' }); - this.schema.wordSmiths.create({ firstName: 'Zelda' }); + let link = this.schema.wordSmiths.create({ firstName: 'Link' }); + let post = link.createPost({ title: 'Lorem' }); + post.createComment({ text: 'pwned' }); + link.createPost({ title: 'Ipsum' }); + this.schema.wordSmiths.create({ firstName: 'Zelda' }); - let fineComments = this.schema.fineComments.all(); - let result = registry.serialize(fineComments); + let fineComments = this.schema.fineComments.all(); + let result = registry.serialize(fineComments); - assert.deepEqual(result, { - data: [ - { - type: 'fine-comments', - id: '1', - attributes: { - text: 'pwned' - }, - relationships: { - 'post': { - data: { type: 'blog-posts', id: '1' } + assert.deepEqual(result, { + data: [ + { + type: 'fine-comments', + id: '1', + attributes: { + text: 'pwned' + }, + relationships: { + 'post': { + data: { type: 'blog-posts', id: '1' } + } + } } - } - } - ], - included: [ - { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - }, - relationships: { - 'author': { - data: { type: 'word-smiths', id: '1' } + ], + included: [ + { + type: 'blog-posts', + id: '1', + attributes: { + title: 'Lorem' + }, + relationships: { + 'author': { + data: { type: 'word-smiths', id: '1' } + } + } + }, + { + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link' + } } - } - }, - { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - } - } - ] - }); -}); + ] + }); + }); -test(`it propertly serializes complex relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - include: ['author', 'comments'] - }), - wordSmith: JSONAPISerializer.extend({ - include: ['posts'] - }), - fineComment: JSONAPISerializer.extend({ - include: ['post'] - }) - }); + test(`it propertly serializes complex relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + blogPost: JSONAPISerializer.extend({ + include: ['author', 'comments'] + }), + wordSmith: JSONAPISerializer.extend({ + include: ['posts'] + }), + fineComment: JSONAPISerializer.extend({ + include: ['post'] + }) + }); - let link = this.schema.wordSmiths.create({ firstName: 'Link' }); - let post = link.createPost({ title: 'Lorem' }); - post.createComment({ text: 'pwned' }); - link.createPost({ title: 'Ipsum' }); - this.schema.wordSmiths.create({ firstName: 'Zelda' }); + let link = this.schema.wordSmiths.create({ firstName: 'Link' }); + let post = link.createPost({ title: 'Lorem' }); + post.createComment({ text: 'pwned' }); + link.createPost({ title: 'Ipsum' }); + this.schema.wordSmiths.create({ firstName: 'Zelda' }); - let blogPost = this.schema.blogPosts.find(1); - let result = registry.serialize(blogPost); + let blogPost = this.schema.blogPosts.find(1); + let result = registry.serialize(blogPost); - assert.deepEqual(result, { - data: { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - }, - relationships: { - 'author': { - data: { type: 'word-smiths', id: '1' } - }, - 'comments': { - data: [{ type: 'fine-comments', id: '1' }] - } - } - }, - included: [ - { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' + assert.deepEqual(result, { + data: { + type: 'blog-posts', + id: '1', + attributes: { + title: 'Lorem' + }, + relationships: { + 'author': { + data: { type: 'word-smiths', id: '1' } + }, + 'comments': { + data: [{ type: 'fine-comments', id: '1' }] + } + } }, - relationships: { - 'posts': { - data: [ - { - id: '1', - type: 'blog-posts' + included: [ + { + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link' + }, + relationships: { + 'posts': { + data: [ + { + id: '1', + type: 'blog-posts' + }, + { + id: '2', + type: 'blog-posts' + } + ] + } + } + }, + { + type: 'blog-posts', + id: '2', + attributes: { + 'title': 'Ipsum' + }, + relationships: { + author: { + data: { type: 'word-smiths', id: '1' } }, - { - id: '2', - type: 'blog-posts' + comments: { + data: [] } - ] - } - } - }, - { - type: 'blog-posts', - id: '2', - attributes: { - 'title': 'Ipsum' - }, - relationships: { - author: { - data: { type: 'word-smiths', id: '1' } + } }, - comments: { - data: [] - } - } - }, - { - type: 'fine-comments', - id: '1', - attributes: { - 'text': 'pwned' - }, - relationships: { - 'post': { - data: { - id: '1', - type: 'blog-posts' + { + type: 'fine-comments', + id: '1', + attributes: { + 'text': 'pwned' + }, + relationships: { + 'post': { + data: { + id: '1', + type: 'blog-posts' + } + } } } - } - } - ] - }); + ] + }); -}); + }); + } +); diff --git a/tests/integration/serializers/json-api-serializer/associations/includes-test.js b/tests/integration/serializers/json-api-serializer/associations/includes-test.js index 6a281ace6..9710f494c 100644 --- a/tests/integration/serializers/json-api-serializer/associations/includes-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/includes-test.js @@ -4,450 +4,453 @@ import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { JSONAPISerializer, Model, hasMany, belongsTo } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | Serializers | JSON API Serializer | Associations | Includes', { - beforeEach() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - blogPosts: hasMany() - }), +module( + 'Integration | Serializers | JSON API Serializer | Associations | Includes', + function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + blogPosts: hasMany() + }), - blogPost: Model.extend({ - wordSmith: belongsTo(), - fineComments: hasMany() - }), + blogPost: Model.extend({ + wordSmith: belongsTo(), + fineComments: hasMany() + }), - fineComment: Model.extend({ - blogPost: belongsTo(), - category: belongsTo() - }), + fineComment: Model.extend({ + blogPost: belongsTo(), + category: belongsTo() + }), - category: Model.extend({ - labels: hasMany() - }), + category: Model.extend({ + labels: hasMany() + }), - label: Model.extend({ + label: Model.extend({ - }) + }) + }); }); - } -}); -test('includes get serialized with correct serializer', function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - attrs: ['title'], - include: ['wordSmith'] - }), - wordSmith: JSONAPISerializer.extend({ - attrs: ['firstName'] - }) - }); + test('includes get serialized with correct serializer', function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + blogPost: JSONAPISerializer.extend({ + attrs: ['title'], + include: ['wordSmith'] + }), + wordSmith: JSONAPISerializer.extend({ + attrs: ['firstName'] + }) + }); - let post = this.schema.blogPosts.create({ title: 'We love Mirage!' }); - post.createWordSmith({ firstName: 'Sam' }); + let post = this.schema.blogPosts.create({ title: 'We love Mirage!' }); + post.createWordSmith({ firstName: 'Sam' }); - let result = registry.serialize(post); + let result = registry.serialize(post); - assert.propEqual(result, { - data: { - type: 'blog-posts', - id: '1', - attributes: { - 'title': 'We love Mirage!' - }, - relationships: { - 'word-smith': { - data: { type: 'word-smiths', id: '1' } - } - } - }, - included: [ - { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Sam' - } - } - ] - }); -}); + assert.propEqual(result, { + data: { + type: 'blog-posts', + id: '1', + attributes: { + 'title': 'We love Mirage!' + }, + relationships: { + 'word-smith': { + data: { type: 'word-smiths', id: '1' } + } + } + }, + included: [ + { + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Sam' + } + } + ] + }); + }); -test('query param includes work when serializing a model', function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer - }); + test('query param includes work when serializing a model', function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer + }); - let post = this.schema.blogPosts.create(); - post.createWordSmith(); - post.createFineComment(); - post.createFineComment(); + let post = this.schema.blogPosts.create(); + post.createWordSmith(); + post.createFineComment(); + post.createFineComment(); - let request = { - queryParams: { - include: 'word-smith,fine-comments' - } - }; + let request = { + queryParams: { + include: 'word-smith,fine-comments' + } + }; - let result = registry.serialize(post, request); + let result = registry.serialize(post, request); - assert.propEqual(result, { - data: { - type: 'blog-posts', - id: '1', - attributes: {}, - relationships: { - 'word-smith': { - data: { type: 'word-smiths', id: '1' } + assert.propEqual(result, { + data: { + type: 'blog-posts', + id: '1', + attributes: {}, + relationships: { + 'word-smith': { + data: { type: 'word-smiths', id: '1' } + }, + 'fine-comments': { + data: [ + { type: 'fine-comments', id: '1' }, + { type: 'fine-comments', id: '2' } + ] + } + } }, - 'fine-comments': { - data: [ - { type: 'fine-comments', id: '1' }, - { type: 'fine-comments', id: '2' } - ] - } - } - }, - included: [ - { - type: 'word-smiths', - id: '1', - attributes: {} - }, - { - type: 'fine-comments', - id: '1', - attributes: {} - }, - { - type: 'fine-comments', - id: '2', - attributes: {} - } - ] - }); -}); + included: [ + { + type: 'word-smiths', + id: '1', + attributes: {} + }, + { + type: 'fine-comments', + id: '1', + attributes: {} + }, + { + type: 'fine-comments', + id: '2', + attributes: {} + } + ] + }); + }); -test('query param includes work when serializing a collection', function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer - }); + test('query param includes work when serializing a collection', function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer + }); - let post1 = this.schema.blogPosts.create(); - post1.createWordSmith(); - post1.createFineComment(); - post1.createFineComment(); - this.schema.blogPosts.create(); + let post1 = this.schema.blogPosts.create(); + post1.createWordSmith(); + post1.createFineComment(); + post1.createFineComment(); + this.schema.blogPosts.create(); - let request = { - queryParams: { - include: 'word-smith,fine-comments' - } - }; + let request = { + queryParams: { + include: 'word-smith,fine-comments' + } + }; - let result = registry.serialize(this.schema.blogPosts.all(), request); + let result = registry.serialize(this.schema.blogPosts.all(), request); - assert.propEqual(result, { - data: [ - { - type: 'blog-posts', - id: '1', - attributes: {}, - relationships: { - 'word-smith': { - data: { type: 'word-smiths', id: '1' } + assert.propEqual(result, { + data: [ + { + type: 'blog-posts', + id: '1', + attributes: {}, + relationships: { + 'word-smith': { + data: { type: 'word-smiths', id: '1' } + }, + 'fine-comments': { + data: [ + { type: 'fine-comments', id: '1' }, + { type: 'fine-comments', id: '2' } + ] + } + } }, - 'fine-comments': { - data: [ - { type: 'fine-comments', id: '1' }, - { type: 'fine-comments', id: '2' } - ] + { + type: 'blog-posts', + id: '2', + attributes: {}, + relationships: { + 'word-smith': { + data: null + }, + 'fine-comments': { + data: [] + } + } } - } - }, - { - type: 'blog-posts', - id: '2', - attributes: {}, - relationships: { - 'word-smith': { - data: null + ], + included: [ + { + type: 'word-smiths', + id: '1', + attributes: {} + }, + { + type: 'fine-comments', + id: '1', + attributes: {} }, - 'fine-comments': { - data: [] + { + type: 'fine-comments', + id: '2', + attributes: {} } - } - } - ], - included: [ - { - type: 'word-smiths', - id: '1', - attributes: {} - }, - { - type: 'fine-comments', - id: '1', - attributes: {} - }, - { - type: 'fine-comments', - id: '2', - attributes: {} - } - ] - }); -}); - -test('query param includes take precedence over default server includes', function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - include: ['wordSmith'] - }) - }); - - let post = this.schema.blogPosts.create(); - post.createWordSmith(); - post.createFineComment(); - post.createFineComment(); + ] + }); + }); - let request = { - queryParams: { - include: 'fine-comments' - } - }; + test('query param includes take precedence over default server includes', function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + blogPost: JSONAPISerializer.extend({ + include: ['wordSmith'] + }) + }); - let result = registry.serialize(post, request); + let post = this.schema.blogPosts.create(); + post.createWordSmith(); + post.createFineComment(); + post.createFineComment(); - assert.propEqual(result, { - data: { - type: 'blog-posts', - id: '1', - attributes: {}, - relationships: { - 'fine-comments': { - data: [ - { type: 'fine-comments', id: '1' }, - { type: 'fine-comments', id: '2' } - ] + let request = { + queryParams: { + include: 'fine-comments' } - } - }, - included: [ - { - type: 'fine-comments', - id: '1', - attributes: {} - }, - { - type: 'fine-comments', - id: '2', - attributes: {} - } - ] - }); -}); - -test('query param includes support dot-paths when serializing a model', function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer - }); + }; - this.schema.db.loadData({ - wordSmiths: [ - { id: 1, name: 'Sam', blogPostIds: [2] } - ], - blogPosts: [ - { id: 2, wordSmithId: 1, fineCommentIds: [3], title: 'Lorem Ipsum' } - ], - fineComments: [ - { id: 3, text: 'Foo', blogPostId: 2, categoryId: 10 } - ], - categories: [ - { id: 10, foo: 'bar', labelIds: [20] } - ], - labels: [ - { id: 20, name: 'Economics' } - ] - }); - let request = { - queryParams: { - include: 'word-smith,fine-comments.category.labels' - } - }; - let result = registry.serialize(this.schema.blogPosts.first(), request); + let result = registry.serialize(post, request); - assert.propEqual(result, { - data: { - type: 'blog-posts', - id: '2', - attributes: { - title: 'Lorem Ipsum' - }, - relationships: { - 'word-smith': { - data: { type: 'word-smiths', id: '1' } - }, - 'fine-comments': { - data: [ - { type: 'fine-comments', id: '3' } - ] - } - } - }, - included: [ - { - type: 'word-smiths', - id: '1', - attributes: { - name: 'Sam' - } - }, - { - type: 'fine-comments', - id: '3', - attributes: { - text: 'Foo' - }, - relationships: { - 'category': { - data: { type: 'categories', id: '10' } + assert.propEqual(result, { + data: { + type: 'blog-posts', + id: '1', + attributes: {}, + relationships: { + 'fine-comments': { + data: [ + { type: 'fine-comments', id: '1' }, + { type: 'fine-comments', id: '2' } + ] + } } - } - }, - { - type: 'categories', - id: '10', - attributes: { - foo: 'bar' }, - relationships: { - 'labels': { - data: [ - { type: 'labels', id: '20' } - ] + included: [ + { + type: 'fine-comments', + id: '1', + attributes: {} + }, + { + type: 'fine-comments', + id: '2', + attributes: {} } - } - }, - { - type: 'labels', - id: '20', - attributes: { - name: 'Economics' - } - } - ] - }); -}); + ] + }); + }); -test('query param includes support dot-paths when serializing a collection', function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer - }); + test('query param includes support dot-paths when serializing a model', function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer + }); - this.schema.db.loadData({ - wordSmiths: [ - { id: 1, name: 'Sam', blogPostIds: [2, 5] } - ], - blogPosts: [ - { id: 2, wordSmithId: 1, fineCommentIds: [3], title: 'Lorem Ipsum' }, - { id: 5, wordSmithId: 1, title: 'Dolor' } - ], - fineComments: [ - { id: 3, text: 'Foo', blogPostId: 2, categoryId: 10 } - ], - categories: [ - { id: 10, foo: 'bar', labelIds: [20] } - ], - labels: [ - { id: 20, name: 'Economics' } - ] - }); - let request = { - queryParams: { - include: 'word-smith,fine-comments.category.labels' - } - }; - let result = registry.serialize(this.schema.blogPosts.all(), request); + this.schema.db.loadData({ + wordSmiths: [ + { id: 1, name: 'Sam', blogPostIds: [2] } + ], + blogPosts: [ + { id: 2, wordSmithId: 1, fineCommentIds: [3], title: 'Lorem Ipsum' } + ], + fineComments: [ + { id: 3, text: 'Foo', blogPostId: 2, categoryId: 10 } + ], + categories: [ + { id: 10, foo: 'bar', labelIds: [20] } + ], + labels: [ + { id: 20, name: 'Economics' } + ] + }); + let request = { + queryParams: { + include: 'word-smith,fine-comments.category.labels' + } + }; + let result = registry.serialize(this.schema.blogPosts.first(), request); - assert.propEqual(result, { - data: [ - { - type: 'blog-posts', - id: '2', - attributes: { - title: 'Lorem Ipsum' - }, - relationships: { - 'word-smith': { - data: { type: 'word-smiths', id: '1' } + assert.propEqual(result, { + data: { + type: 'blog-posts', + id: '2', + attributes: { + title: 'Lorem Ipsum' }, - 'fine-comments': { - data: [ - { type: 'fine-comments', id: '3' } - ] + relationships: { + 'word-smith': { + data: { type: 'word-smiths', id: '1' } + }, + 'fine-comments': { + data: [ + { type: 'fine-comments', id: '3' } + ] + } } - } - }, - { - type: 'blog-posts', - id: '5', - attributes: { - title: 'Dolor' }, - relationships: { - 'word-smith': { - data: { type: 'word-smiths', id: '1' } + included: [ + { + type: 'word-smiths', + id: '1', + attributes: { + name: 'Sam' + } + }, + { + type: 'fine-comments', + id: '3', + attributes: { + text: 'Foo' + }, + relationships: { + 'category': { + data: { type: 'categories', id: '10' } + } + } + }, + { + type: 'categories', + id: '10', + attributes: { + foo: 'bar' + }, + relationships: { + 'labels': { + data: [ + { type: 'labels', id: '20' } + ] + } + } }, - 'fine-comments': { - data: [] + { + type: 'labels', + id: '20', + attributes: { + name: 'Economics' + } } + ] + }); + }); + + test('query param includes support dot-paths when serializing a collection', function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer + }); + + this.schema.db.loadData({ + wordSmiths: [ + { id: 1, name: 'Sam', blogPostIds: [2, 5] } + ], + blogPosts: [ + { id: 2, wordSmithId: 1, fineCommentIds: [3], title: 'Lorem Ipsum' }, + { id: 5, wordSmithId: 1, title: 'Dolor' } + ], + fineComments: [ + { id: 3, text: 'Foo', blogPostId: 2, categoryId: 10 } + ], + categories: [ + { id: 10, foo: 'bar', labelIds: [20] } + ], + labels: [ + { id: 20, name: 'Economics' } + ] + }); + let request = { + queryParams: { + include: 'word-smith,fine-comments.category.labels' } - } - ], - included: [ - { - type: 'word-smiths', - id: '1', - attributes: { - name: 'Sam' - } - }, - { - type: 'fine-comments', - id: '3', - attributes: { - text: 'Foo' - }, - relationships: { - 'category': { - data: { type: 'categories', id: '10' } + }; + let result = registry.serialize(this.schema.blogPosts.all(), request); + + assert.propEqual(result, { + data: [ + { + type: 'blog-posts', + id: '2', + attributes: { + title: 'Lorem Ipsum' + }, + relationships: { + 'word-smith': { + data: { type: 'word-smiths', id: '1' } + }, + 'fine-comments': { + data: [ + { type: 'fine-comments', id: '3' } + ] + } + } + }, + { + type: 'blog-posts', + id: '5', + attributes: { + title: 'Dolor' + }, + relationships: { + 'word-smith': { + data: { type: 'word-smiths', id: '1' } + }, + 'fine-comments': { + data: [] + } + } } - } - }, - { - type: 'categories', - id: '10', - attributes: { - foo: 'bar' - }, - relationships: { - 'labels': { - data: [ - { type: 'labels', id: '20' } - ] + ], + included: [ + { + type: 'word-smiths', + id: '1', + attributes: { + name: 'Sam' + } + }, + { + type: 'fine-comments', + id: '3', + attributes: { + text: 'Foo' + }, + relationships: { + 'category': { + data: { type: 'categories', id: '10' } + } + } + }, + { + type: 'categories', + id: '10', + attributes: { + foo: 'bar' + }, + relationships: { + 'labels': { + data: [ + { type: 'labels', id: '20' } + ] + } + } + }, + { + type: 'labels', + id: '20', + attributes: { + name: 'Economics' + } } - } - }, - { - type: 'labels', - id: '20', - attributes: { - name: 'Economics' - } - } - ] - }); -}); + ] + }); + }); + } +); diff --git a/tests/integration/serializers/json-api-serializer/associations/key-for-relationship-test.js b/tests/integration/serializers/json-api-serializer/associations/key-for-relationship-test.js index 01cedda4b..50a2edb69 100644 --- a/tests/integration/serializers/json-api-serializer/associations/key-for-relationship-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/key-for-relationship-test.js @@ -5,64 +5,67 @@ import { Model, hasMany, JSONAPISerializer } from 'ember-cli-mirage'; import { underscore } from 'ember-cli-mirage/utils/inflector'; import { module, test } from 'qunit'; -module('Integration | Serializers | JSON API Serializer | Key for relationship', { - beforeEach() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - blogPosts: hasMany() - }), - blogPost: Model +module( + 'Integration | Serializers | JSON API Serializer | Key for relationship', + function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + blogPosts: hasMany() + }), + blogPost: Model + }); }); - } -}); -test(`keyForRelationship works`, function(assert) { - let ApplicationSerializer = JSONAPISerializer.extend({ - keyForRelationship(key) { - return underscore(key); - } - }); - let registry = new SerializerRegistry(this.schema, { - application: ApplicationSerializer, - wordSmith: ApplicationSerializer.extend({ - include: ['blogPosts'] - }) - }); - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - firstName: 'Link', - lastName: 'Jackson', - age: 323 - }); - wordSmith.createBlogPost({ title: 'Lorem ipsum' }); + test(`keyForRelationship works`, function(assert) { + let ApplicationSerializer = JSONAPISerializer.extend({ + keyForRelationship(key) { + return underscore(key); + } + }); + let registry = new SerializerRegistry(this.schema, { + application: ApplicationSerializer, + wordSmith: ApplicationSerializer.extend({ + include: ['blogPosts'] + }) + }); + let wordSmith = this.schema.wordSmiths.create({ + id: 1, + firstName: 'Link', + lastName: 'Jackson', + age: 323 + }); + wordSmith.createBlogPost({ title: 'Lorem ipsum' }); - let result = registry.serialize(wordSmith); + let result = registry.serialize(wordSmith); - assert.deepEqual(result, { - data: { - type: 'word-smiths', - id: '1', - attributes: { - age: 323, - 'first-name': 'Link', - 'last-name': 'Jackson' - }, - relationships: { - 'blog_posts': { - data: [ - { id: '1', type: 'blog-posts' } - ] - } - } - }, - included: [ - { - attributes: { - title: "Lorem ipsum" + assert.deepEqual(result, { + data: { + type: 'word-smiths', + id: '1', + attributes: { + age: 323, + 'first-name': 'Link', + 'last-name': 'Jackson' + }, + relationships: { + 'blog_posts': { + data: [ + { id: '1', type: 'blog-posts' } + ] + } + } }, - id: "1", - type: "blog-posts" - } - ] - }); -}); + included: [ + { + attributes: { + title: "Lorem ipsum" + }, + id: "1", + type: "blog-posts" + } + ] + }); + }); + } +); diff --git a/tests/integration/serializers/json-api-serializer/associations/links-test.js b/tests/integration/serializers/json-api-serializer/associations/links-test.js index 678460b6c..d63f4b54b 100644 --- a/tests/integration/serializers/json-api-serializer/associations/links-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/links-test.js @@ -4,128 +4,132 @@ import { module, test } from 'qunit'; import Db from 'ember-cli-mirage/db'; import Schema from 'ember-cli-mirage/orm/schema'; -module('Integration | Serializers | JSON API Serializer | Associations | Links', { - beforeEach() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - blogPosts: hasMany() - }), - blogPost: Model.extend({ - wordSmith: belongsTo(), - fineComments: hasMany() - }), - fineComment: Model.extend({ - blogPost: belongsTo() - }) +module( + 'Integration | Serializers | JSON API Serializer | Associations | Links', + function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + blogPosts: hasMany() + }), + blogPost: Model.extend({ + wordSmith: belongsTo(), + fineComments: hasMany() + }), + fineComment: Model.extend({ + blogPost: belongsTo() + }) + }); }); - }, - afterEach() { - this.schema.db.emptyData(); - } -}); -test(`it supports links`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - links(model) { - return { - 'wordSmith': { - related: `/api/word_smiths/${model.wordSmith.id}`, - self: `/api/blog_posts/${model.id}/relationships/word_smith` - }, - 'fineComments': { - related: `/api/fine_comments?blog_post_id=${model.id}`, - self: `/api/blog_posts/${model.id}/relationships/fine_comments` + hooks.afterEach(function() { + this.schema.db.emptyData(); + }); + + test(`it supports links`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + blogPost: JSONAPISerializer.extend({ + links(model) { + return { + 'wordSmith': { + related: `/api/word_smiths/${model.wordSmith.id}`, + self: `/api/blog_posts/${model.id}/relationships/word_smith` + }, + 'fineComments': { + related: `/api/fine_comments?blog_post_id=${model.id}`, + self: `/api/blog_posts/${model.id}/relationships/fine_comments` + } + }; } - }; - } - }) - }); + }) + }); - let link = this.schema.wordSmiths.create({ id: 3, name: 'Link' }); // specify id to really test our links function - let blogPost = link.createBlogPost({ title: 'Lorem ipsum' }); + let link = this.schema.wordSmiths.create({ id: 3, name: 'Link' }); // specify id to really test our links function + let blogPost = link.createBlogPost({ title: 'Lorem ipsum' }); - let result = registry.serialize(blogPost); + let result = registry.serialize(blogPost); - assert.deepEqual(result, { - data: { - type: 'blog-posts', - id: blogPost.id, - attributes: { - 'title': 'Lorem ipsum' - }, - relationships: { - 'word-smith': { - links: { - related: `/api/word_smiths/${link.id}`, - self: `/api/blog_posts/${blogPost.id}/relationships/word_smith` - } - }, - 'fine-comments': { - links: { - related: `/api/fine_comments?blog_post_id=${blogPost.id}`, - self: `/api/blog_posts/${blogPost.id}/relationships/fine_comments` + assert.deepEqual(result, { + data: { + type: 'blog-posts', + id: blogPost.id, + attributes: { + 'title': 'Lorem ipsum' + }, + relationships: { + 'word-smith': { + links: { + related: `/api/word_smiths/${link.id}`, + self: `/api/blog_posts/${blogPost.id}/relationships/word_smith` + } + }, + 'fine-comments': { + links: { + related: `/api/fine_comments?blog_post_id=${blogPost.id}`, + self: `/api/blog_posts/${blogPost.id}/relationships/fine_comments` + } + } } } - } - } - }); -}); + }); + }); -test(`it supports links alongside data linkage`, function(assert) { - let ApplicationSerializer = JSONAPISerializer.extend({ - alwaysIncludeLinkageData: true - }); - let registry = new SerializerRegistry(this.schema, { - application: ApplicationSerializer, - blogPost: ApplicationSerializer.extend({ - links(model) { - return { - 'wordSmith': { - related: `/api/word_smiths/${model.wordSmith.id}`, - self: `/api/blog_posts/${model.id}/relationships/word_smith` - }, - 'fineComments': { - related: `/api/fine_comments?blog_post_id=${model.id}`, - self: `/api/blog_posts/${model.id}/relationships/fine_comments` + test(`it supports links alongside data linkage`, function(assert) { + let ApplicationSerializer = JSONAPISerializer.extend({ + alwaysIncludeLinkageData: true + }); + let registry = new SerializerRegistry(this.schema, { + application: ApplicationSerializer, + blogPost: ApplicationSerializer.extend({ + links(model) { + return { + 'wordSmith': { + related: `/api/word_smiths/${model.wordSmith.id}`, + self: `/api/blog_posts/${model.id}/relationships/word_smith` + }, + 'fineComments': { + related: `/api/fine_comments?blog_post_id=${model.id}`, + self: `/api/blog_posts/${model.id}/relationships/fine_comments` + } + }; } - }; - } - }) - }); + }) + }); - let link = this.schema.wordSmiths.create({ id: 3, name: 'Link' }); // specify id to really test our links function - let blogPost = link.createBlogPost({ title: 'Lorem ipsum' }); + let link = this.schema.wordSmiths.create({ id: 3, name: 'Link' }); // specify id to really test our links function + let blogPost = link.createBlogPost({ title: 'Lorem ipsum' }); - let result = registry.serialize(blogPost); + let result = registry.serialize(blogPost); - assert.deepEqual(result, { - data: { - type: 'blog-posts', - id: blogPost.id, - attributes: { - 'title': 'Lorem ipsum' - }, - relationships: { - 'word-smith': { - "data": { - "id": "3", - "type": "word-smiths" + assert.deepEqual(result, { + data: { + type: 'blog-posts', + id: blogPost.id, + attributes: { + 'title': 'Lorem ipsum' }, - links: { - related: `/api/word_smiths/${link.id}`, - self: `/api/blog_posts/${blogPost.id}/relationships/word_smith` - } - }, - 'fine-comments': { - data: [], - links: { - related: `/api/fine_comments?blog_post_id=${blogPost.id}`, - self: `/api/blog_posts/${blogPost.id}/relationships/fine_comments` + relationships: { + 'word-smith': { + "data": { + "id": "3", + "type": "word-smiths" + }, + links: { + related: `/api/word_smiths/${link.id}`, + self: `/api/blog_posts/${blogPost.id}/relationships/word_smith` + } + }, + 'fine-comments': { + data: [], + links: { + related: `/api/fine_comments?blog_post_id=${blogPost.id}`, + self: `/api/blog_posts/${blogPost.id}/relationships/fine_comments` + } + } } } - } - } - }); -}); + }); + }); + } +); diff --git a/tests/integration/serializers/json-api-serializer/associations/many-to-many-test.js b/tests/integration/serializers/json-api-serializer/associations/many-to-many-test.js index eb7a26353..ec035ee4c 100644 --- a/tests/integration/serializers/json-api-serializer/associations/many-to-many-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/many-to-many-test.js @@ -4,152 +4,155 @@ import Db from 'ember-cli-mirage/db'; import Schema from 'ember-cli-mirage/orm/schema'; import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -module('Integration | Serializers | JSON API Serializer | Associations | Many To Many', { - beforeEach() { - let db = new Db(); - - let schema = new Schema(db, { - contact: Model.extend({ - addresses: hasMany(), - contactAddresses: hasMany() - }), - address: Model.extend({ - contacts: hasMany(), - contactAddresses: hasMany() - }), - contactAddress: Model.extend({ - contact: belongsTo(), - address: belongsTo() - }) +module( + 'Integration | Serializers | JSON API Serializer | Associations | Many To Many', + function(hooks) { + hooks.beforeEach(function() { + let db = new Db(); + + let schema = new Schema(db, { + contact: Model.extend({ + addresses: hasMany(), + contactAddresses: hasMany() + }), + address: Model.extend({ + contacts: hasMany(), + contactAddresses: hasMany() + }), + contactAddress: Model.extend({ + contact: belongsTo(), + address: belongsTo() + }) + }); + + let mario = schema.contacts.create({ name: 'Mario' }); + let newYork = schema.addresses.create({ street: 'Some New York Street' }); + let mushroomKingdom = schema.addresses.create({ street: 'Some Mushroom Kingdom Street' }); + + schema.contactAddresses.create({ contact: mario, address: newYork }); + schema.contactAddresses.create({ contact: mario, address: mushroomKingdom }); + + this.schema = schema; }); - let mario = schema.contacts.create({ name: 'Mario' }); - let newYork = schema.addresses.create({ street: 'Some New York Street' }); - let mushroomKingdom = schema.addresses.create({ street: 'Some Mushroom Kingdom Street' }); + skip(`it serializes manyToMany if properly configured to passthrough `, function(assert) { + let contactSerializer = JSONAPISerializer.extend({ + addresses(model) { + let models = model.contactAddresses.models.map((ca) => ca.address); + return new Collection('address', models); + } + }); - schema.contactAddresses.create({ contact: mario, address: newYork }); - schema.contactAddresses.create({ contact: mario, address: mushroomKingdom }); + let addressSerializer = JSONAPISerializer.extend({ + contacts(model) { + let models = model.contactAddresses.models.map((ca) => ca.contact); + return new Collection('contact', models); + } + }); + + let registry = new SerializerRegistry(this.schema, { + address: addressSerializer, + contact: contactSerializer + }); + + let contact = this.schema.contacts.find(1); + let result = registry.serialize(contact); + + assert.deepEqual(result, { + data: { + id: '1', + type: 'contacts', + attributes: { + name: 'Mario' + }, + relationships: { + addresses: { + data: [ + { id: '1', type: 'addresses' }, + { id: '2', type: 'addresses' } + ] + }, + 'contact-addresses': { + data: [ + { id: '1', type: 'contact-addresses' }, + { id: '2', type: 'contact-addresses' } + ] + } + } + } + }); + }); - this.schema = schema; - } -}); - -skip(`it serializes manyToMany if properly configured to passthrough `, function(assert) { - let contactSerializer = JSONAPISerializer.extend({ - addresses(model) { - let models = model.contactAddresses.models.map((ca) => ca.address); - return new Collection('address', models); - } - }); - - let addressSerializer = JSONAPISerializer.extend({ - contacts(model) { - let models = model.contactAddresses.models.map((ca) => ca.contact); - return new Collection('contact', models); - } - }); - - let registry = new SerializerRegistry(this.schema, { - address: addressSerializer, - contact: contactSerializer - }); - - let contact = this.schema.contacts.find(1); - let result = registry.serialize(contact); - - assert.deepEqual(result, { - data: { - id: '1', - type: 'contacts', - attributes: { - name: 'Mario' - }, - relationships: { - addresses: { - data: [ - { id: '1', type: 'addresses' }, - { id: '2', type: 'addresses' } - ] + skip(`it sideloads manyToMany if properly configured to passthrough and include`, function(assert) { + let contactSerializer = JSONAPISerializer.extend({ + include: ['addresses'], + addresses(model) { + let models = model.contactAddresses.models.map((ca) => ca.address); + return new Collection('address', models); + } + }); + + let addressSerializer = JSONAPISerializer.extend({ + include: ['contacts'], + contacts(model) { + let models = model.contactAddresses.models.map((ca) => ca.contact); + return new Collection('contact', models); + } + }); + + let registry = new SerializerRegistry(this.schema, { + address: addressSerializer, + contact: contactSerializer + }); + + let contact = this.schema.contacts.find(1); + let result = registry.serialize(contact); + + let { data, included } = result; + + assert.deepEqual(data, { + id: '1', + type: 'contacts', + attributes: { + name: 'Mario' + }, + relationships: { + addresses: { + data: [ + { id: '1', type: 'addresses' }, + { id: '2', type: 'addresses' } + ] + }, + 'contact-addresses': { + data: [ + { id: '1', type: 'contact-addresses' }, + { id: '2', type: 'contact-addresses' } + ] + } + } + }); + + assert.deepEqual(included, [{ + id: '1', + type: 'addresses', + attributes: { + street: 'Some New York Street' }, - 'contact-addresses': { - data: [ - { id: '1', type: 'contact-addresses' }, - { id: '2', type: 'contact-addresses' } - ] + relationships: { + contacts: { data: [{ id: '1', type: 'contacts' }] }, + 'contact-addresses': { data: [{ id: '1', type: 'contact-addresses' }] } } - } - } - }); -}); - -skip(`it sideloads manyToMany if properly configured to passthrough and include`, function(assert) { - let contactSerializer = JSONAPISerializer.extend({ - include: ['addresses'], - addresses(model) { - let models = model.contactAddresses.models.map((ca) => ca.address); - return new Collection('address', models); - } - }); - - let addressSerializer = JSONAPISerializer.extend({ - include: ['contacts'], - contacts(model) { - let models = model.contactAddresses.models.map((ca) => ca.contact); - return new Collection('contact', models); - } - }); - - let registry = new SerializerRegistry(this.schema, { - address: addressSerializer, - contact: contactSerializer - }); - - let contact = this.schema.contacts.find(1); - let result = registry.serialize(contact); - - let { data, included } = result; - - assert.deepEqual(data, { - id: '1', - type: 'contacts', - attributes: { - name: 'Mario' - }, - relationships: { - addresses: { - data: [ - { id: '1', type: 'addresses' }, - { id: '2', type: 'addresses' } - ] - }, - 'contact-addresses': { - data: [ - { id: '1', type: 'contact-addresses' }, - { id: '2', type: 'contact-addresses' } - ] - } - } - }); - - assert.deepEqual(included, [{ - id: '1', - type: 'addresses', - attributes: { - street: 'Some New York Street' - }, - relationships: { - contacts: { data: [{ id: '1', type: 'contacts' }] }, - 'contact-addresses': { data: [{ id: '1', type: 'contact-addresses' }] } - } - }, { - id: '2', - type: 'addresses', - attributes: { - street: 'Some Mushroom Kingdom Street' - }, - relationships: { - contacts: { data: [{ id: '1', type: 'contacts' }] }, - 'contact-addresses': { data: [{ id: '2', type: 'contact-addresses' }] } - } - }]); -}); + }, { + id: '2', + type: 'addresses', + attributes: { + street: 'Some Mushroom Kingdom Street' + }, + relationships: { + contacts: { data: [{ id: '1', type: 'contacts' }] }, + 'contact-addresses': { data: [{ id: '2', type: 'contact-addresses' }] } + } + }]); + }); + } +); diff --git a/tests/integration/serializers/json-api-serializer/associations/model-test.js b/tests/integration/serializers/json-api-serializer/associations/model-test.js index c7d3ef993..256763c70 100644 --- a/tests/integration/serializers/json-api-serializer/associations/model-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/model-test.js @@ -4,412 +4,415 @@ import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { Model, hasMany, belongsTo, JSONAPISerializer } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | Serializers | JSON API Serializer | Associations | Model', { - beforeEach() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - blogPosts: hasMany() - }), - blogPost: Model.extend({ - wordSmith: belongsTo(), - fineComments: hasMany() - }), - fineComment: Model.extend({ - blogPost: belongsTo() - }) +module( + 'Integration | Serializers | JSON API Serializer | Associations | Model', + function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + blogPosts: hasMany() + }), + blogPost: Model.extend({ + wordSmith: belongsTo(), + fineComments: hasMany() + }), + fineComment: Model.extend({ + blogPost: belongsTo() + }) + }); }); - } -}); -test(`by default, it doesn't include a model's relationships if those relationships are not included in the document and no links are defined`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer - }); - let link = this.schema.wordSmiths.create({ - firstName: 'Link', - age: 123 - }); - let post = link.createBlogPost({ title: 'Lorem ipsum' }); + test(`by default, it doesn't include a model's relationships if those relationships are not included in the document and no links are defined`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer + }); + let link = this.schema.wordSmiths.create({ + firstName: 'Link', + age: 123 + }); + let post = link.createBlogPost({ title: 'Lorem ipsum' }); - let result = registry.serialize(post); - assert.deepEqual(result, { - data: { - type: 'blog-posts', - id: '1', - attributes: { - 'title': 'Lorem ipsum' - } - } - }); -}); + let result = registry.serialize(post); + assert.deepEqual(result, { + data: { + type: 'blog-posts', + id: '1', + attributes: { + 'title': 'Lorem ipsum' + } + } + }); + }); -test(`when alwaysIncludeLinkageData is true, it contains linkage data for all a model's relationships, regardless of includes`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer.extend({ - alwaysIncludeLinkageData: true - }) - }); - let link = this.schema.wordSmiths.create({ - firstName: 'Link', - age: 123 - }); - let post = link.createBlogPost({ title: 'Lorem ipsum' }); + test(`when alwaysIncludeLinkageData is true, it contains linkage data for all a model's relationships, regardless of includes`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer.extend({ + alwaysIncludeLinkageData: true + }) + }); + let link = this.schema.wordSmiths.create({ + firstName: 'Link', + age: 123 + }); + let post = link.createBlogPost({ title: 'Lorem ipsum' }); - let result = registry.serialize(post); - assert.deepEqual(result, { - data: { - type: 'blog-posts', - id: '1', - attributes: { - 'title': 'Lorem ipsum' - }, - relationships: { - 'word-smith': { - data: { - type: 'word-smiths', - id: '1' + let result = registry.serialize(post); + assert.deepEqual(result, { + data: { + type: 'blog-posts', + id: '1', + attributes: { + 'title': 'Lorem ipsum' + }, + relationships: { + 'word-smith': { + data: { + type: 'word-smiths', + id: '1' + } + }, + 'fine-comments': { + data: [] + } } - }, - 'fine-comments': { - data: [] } - } - } - }); -}); + }); + }); -test(`it includes linkage data for a has-many relationship that's being included`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - wordSmith: JSONAPISerializer.extend({ - include: ['blogPosts'] - }) - }); + test(`it includes linkage data for a has-many relationship that's being included`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + wordSmith: JSONAPISerializer.extend({ + include: ['blogPosts'] + }) + }); - let link = this.schema.wordSmiths.create({ firstName: 'Link' }); - link.createBlogPost({ title: 'Lorem' }); - link.createBlogPost({ title: 'Ipsum' }); + let link = this.schema.wordSmiths.create({ firstName: 'Link' }); + link.createBlogPost({ title: 'Lorem' }); + link.createBlogPost({ title: 'Ipsum' }); - let result = registry.serialize(link); + let result = registry.serialize(link); - assert.deepEqual(result, { - data: { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - }, - relationships: { - 'blog-posts': { - data: [ - { type: 'blog-posts', id: '1' }, - { type: 'blog-posts', id: '2' } - ] - } - } - }, - included: [ - { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - } - }, - { - type: 'blog-posts', - id: '2', - attributes: { - title: 'Ipsum' - } - } - ] - }); -}); + assert.deepEqual(result, { + data: { + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link' + }, + relationships: { + 'blog-posts': { + data: [ + { type: 'blog-posts', id: '1' }, + { type: 'blog-posts', id: '2' } + ] + } + } + }, + included: [ + { + type: 'blog-posts', + id: '1', + attributes: { + title: 'Lorem' + } + }, + { + type: 'blog-posts', + id: '2', + attributes: { + title: 'Ipsum' + } + } + ] + }); + }); -test(`it can include a chain of has-many relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - wordSmith: JSONAPISerializer.extend({ - include: ['blogPosts'] - }), - blogPost: JSONAPISerializer.extend({ - include: ['fineComments'] - }) - }); + test(`it can include a chain of has-many relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + wordSmith: JSONAPISerializer.extend({ + include: ['blogPosts'] + }), + blogPost: JSONAPISerializer.extend({ + include: ['fineComments'] + }) + }); - let link = this.schema.wordSmiths.create({ firstName: 'Link' }); - let post1 = link.createBlogPost({ title: 'Lorem' }); - post1.createFineComment({ text: 'pwned' }); - link.createBlogPost({ title: 'Ipsum' }); + let link = this.schema.wordSmiths.create({ firstName: 'Link' }); + let post1 = link.createBlogPost({ title: 'Lorem' }); + post1.createFineComment({ text: 'pwned' }); + link.createBlogPost({ title: 'Ipsum' }); - let result = registry.serialize(link); + let result = registry.serialize(link); - assert.deepEqual(result, { - data: { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - }, - relationships: { - 'blog-posts': { - data: [ - { type: 'blog-posts', id: '1' }, - { type: 'blog-posts', id: '2' } - ] - } - } - }, - included: [ - { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - }, - relationships: { - 'fine-comments': { - data: [ - { type: 'fine-comments', id: '1' } - ] + assert.deepEqual(result, { + data: { + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link' + }, + relationships: { + 'blog-posts': { + data: [ + { type: 'blog-posts', id: '1' }, + { type: 'blog-posts', id: '2' } + ] + } } - } - }, - { - type: 'fine-comments', - id: '1', - attributes: { - text: 'pwned' - } - }, - { - type: 'blog-posts', - id: '2', - attributes: { - title: 'Ipsum' }, - relationships: { - 'fine-comments': { - data: [] + included: [ + { + type: 'blog-posts', + id: '1', + attributes: { + title: 'Lorem' + }, + relationships: { + 'fine-comments': { + data: [ + { type: 'fine-comments', id: '1' } + ] + } + } + }, + { + type: 'fine-comments', + id: '1', + attributes: { + text: 'pwned' + } + }, + { + type: 'blog-posts', + id: '2', + attributes: { + title: 'Ipsum' + }, + relationships: { + 'fine-comments': { + data: [] + } + } } - } - } - ] - }); -}); + ] + }); + }); -test(`it can include a belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - include: ['wordSmith'] - }) - }); + test(`it can include a belongs-to relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + blogPost: JSONAPISerializer.extend({ + include: ['wordSmith'] + }) + }); - let link = this.schema.wordSmiths.create({ firstName: 'Link' }); - let blogPost = link.createBlogPost({ title: 'Lorem' }); - blogPost.createFineComment(); + let link = this.schema.wordSmiths.create({ firstName: 'Link' }); + let blogPost = link.createBlogPost({ title: 'Lorem' }); + blogPost.createFineComment(); - let result = registry.serialize(blogPost); + let result = registry.serialize(blogPost); - assert.deepEqual(result, { - data: { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - }, - relationships: { - 'word-smith': { - data: { + assert.deepEqual(result, { + data: { + type: 'blog-posts', + id: '1', + attributes: { + title: 'Lorem' + }, + relationships: { + 'word-smith': { + data: { + id: '1', + type: 'word-smiths' + } + } + } + }, + 'included': [ + { + attributes: { + 'first-name': 'Link' + }, id: '1', type: 'word-smiths' } - } - } - }, - 'included': [ - { - attributes: { - 'first-name': 'Link' - }, - id: '1', - type: 'word-smiths' - } - ] - }); -}); + ] + }); + }); -test(`it gracefully handles null belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - include: ['wordSmith'] - }) - }); + test(`it gracefully handles null belongs-to relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + blogPost: JSONAPISerializer.extend({ + include: ['wordSmith'] + }) + }); - let blogPost = this.schema.blogPosts.create({ title: 'Lorem' }); - let result = registry.serialize(blogPost); + let blogPost = this.schema.blogPosts.create({ title: 'Lorem' }); + let result = registry.serialize(blogPost); - assert.deepEqual(result, { - data: { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - }, - relationships: { - 'word-smith': { - data: null + assert.deepEqual(result, { + data: { + type: 'blog-posts', + id: '1', + attributes: { + title: 'Lorem' + }, + relationships: { + 'word-smith': { + data: null + } + } } - } - } - }); -}); + }); + }); -test(`it can include a chain of belongs-to relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - include: ['wordSmith'] - }), - fineComment: JSONAPISerializer.extend({ - include: ['blogPost'] - }) - }); + test(`it can include a chain of belongs-to relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + blogPost: JSONAPISerializer.extend({ + include: ['wordSmith'] + }), + fineComment: JSONAPISerializer.extend({ + include: ['blogPost'] + }) + }); - let wordSmith = this.schema.wordSmiths.create({ firstName: 'Link' }); - let post = wordSmith.createBlogPost({ title: 'Lorem' }); - let comment = post.createFineComment({ text: 'pwned' }); + let wordSmith = this.schema.wordSmiths.create({ firstName: 'Link' }); + let post = wordSmith.createBlogPost({ title: 'Lorem' }); + let comment = post.createFineComment({ text: 'pwned' }); - let result = registry.serialize(comment); + let result = registry.serialize(comment); - assert.deepEqual(result, { - data: { - type: 'fine-comments', - id: '1', - attributes: { - text: 'pwned' - }, - relationships: { - 'blog-post': { - data: { - id: '1', - type: 'blog-posts' + assert.deepEqual(result, { + data: { + type: 'fine-comments', + id: '1', + attributes: { + text: 'pwned' + }, + relationships: { + 'blog-post': { + data: { + id: '1', + type: 'blog-posts' + } + } } - } - } - }, - 'included': [ - { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' }, - relationships: { - 'word-smith': { - data: { - type: 'word-smiths', - id: '1' + 'included': [ + { + type: 'blog-posts', + id: '1', + attributes: { + title: 'Lorem' + }, + relationships: { + 'word-smith': { + data: { + type: 'word-smiths', + id: '1' + } + } + } + }, + { + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link' } } - } - }, - { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - } - } - ] - }); -}); + ] + }); + }); -test(`it properly serializes complex relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - wordSmith: JSONAPISerializer.extend({ - include: ['blogPosts'] - }), - blogPost: JSONAPISerializer.extend({ - include: ['wordSmith', 'fineComments'] - }), - fineComment: JSONAPISerializer.extend({ - include: ['blogPost'] - }) - }); + test(`it properly serializes complex relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + wordSmith: JSONAPISerializer.extend({ + include: ['blogPosts'] + }), + blogPost: JSONAPISerializer.extend({ + include: ['wordSmith', 'fineComments'] + }), + fineComment: JSONAPISerializer.extend({ + include: ['blogPost'] + }) + }); - let wordSmith = this.schema.wordSmiths.create({ firstName: 'Link' }); - let post = wordSmith.createBlogPost({ title: 'Lorem' }); - wordSmith.createBlogPost({ title: 'Ipsum' }); - post.createFineComment({ text: 'pwned' }); + let wordSmith = this.schema.wordSmiths.create({ firstName: 'Link' }); + let post = wordSmith.createBlogPost({ title: 'Lorem' }); + wordSmith.createBlogPost({ title: 'Ipsum' }); + post.createFineComment({ text: 'pwned' }); - let result = registry.serialize(wordSmith); + let result = registry.serialize(wordSmith); - assert.deepEqual(result, { - data: { - attributes: { - 'first-name': 'Link' - }, - id: '1', - relationships: { - 'blog-posts': { - data: [ - { type: 'blog-posts', id: '1' }, - { type: 'blog-posts', id: '2' } - ] - } - }, - type: 'word-smiths' - }, - included: [ - { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - }, - relationships: { - 'word-smith': { - data: { type: 'word-smiths', id: '1' } + assert.deepEqual(result, { + data: { + attributes: { + 'first-name': 'Link' }, - 'fine-comments': { - data: [ - { type: 'fine-comments', id: '1' } - ] - } - } - }, - { - type: 'fine-comments', - id: '1', - attributes: { - text: 'pwned' - }, - relationships: { - 'blog-post': { - data: { type: 'blog-posts', id: '1' } - } - } - }, - { - type: 'blog-posts', - id: '2', - attributes: { - title: 'Ipsum' + id: '1', + relationships: { + 'blog-posts': { + data: [ + { type: 'blog-posts', id: '1' }, + { type: 'blog-posts', id: '2' } + ] + } + }, + type: 'word-smiths' }, - relationships: { - 'word-smith': { - data: { type: 'word-smiths', id: '1' } + included: [ + { + type: 'blog-posts', + id: '1', + attributes: { + title: 'Lorem' + }, + relationships: { + 'word-smith': { + data: { type: 'word-smiths', id: '1' } + }, + 'fine-comments': { + data: [ + { type: 'fine-comments', id: '1' } + ] + } + } + }, + { + type: 'fine-comments', + id: '1', + attributes: { + text: 'pwned' + }, + relationships: { + 'blog-post': { + data: { type: 'blog-posts', id: '1' } + } + } }, - 'fine-comments': { - data: [] + { + type: 'blog-posts', + id: '2', + attributes: { + title: 'Ipsum' + }, + relationships: { + 'word-smith': { + data: { type: 'word-smiths', id: '1' } + }, + 'fine-comments': { + data: [] + } + } } - } - } - ] - }); -}); + ] + }); + }); + } +); diff --git a/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js b/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js index fbb28aa37..cfed7aa4b 100644 --- a/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js @@ -4,132 +4,135 @@ import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { Model, belongsTo, hasMany, JSONAPISerializer } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | Serializers | JSON API Serializer | Associations | Polymorphic'); +module( + 'Integration | Serializers | JSON API Serializer | Associations | Polymorphic', + function() { + test('it works for belongs to polymorphic relationships', function(assert) { + let schema = new Schema(new Db(), { + photo: Model.extend(), + video: Model.extend(), + comment: Model.extend({ + commentable: belongsTo({ polymorphic: true }) + }) + }); -test('it works for belongs to polymorphic relationships', function(assert) { - let schema = new Schema(new Db(), { - photo: Model.extend(), - video: Model.extend(), - comment: Model.extend({ - commentable: belongsTo({ polymorphic: true }) - }) - }); + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + comment: JSONAPISerializer.extend({ + include: ['commentable'] + }) + }); + let photo = schema.photos.create({ title: 'Foo' }); + schema.comments.create({ text: 'Pretty foo!', commentable: photo }); - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - comment: JSONAPISerializer.extend({ - include: ['commentable'] - }) - }); - let photo = schema.photos.create({ title: 'Foo' }); - schema.comments.create({ text: 'Pretty foo!', commentable: photo }); + let video = schema.videos.create({ title: 'Bar' }); + schema.comments.create({ text: 'Love the bar!', commentable: video }); - let video = schema.videos.create({ title: 'Bar' }); - schema.comments.create({ text: 'Love the bar!', commentable: video }); - - let result = registry.serialize(schema.comments.all()); - assert.deepEqual(result, { - data: [ - { - "attributes": { - "text": "Pretty foo!" - }, - "id": "1", - "relationships": { - "commentable": { - "data": { id: '1', type: 'photos' } + let result = registry.serialize(schema.comments.all()); + assert.deepEqual(result, { + data: [ + { + "attributes": { + "text": "Pretty foo!" + }, + "id": "1", + "relationships": { + "commentable": { + "data": { id: '1', type: 'photos' } + } + }, + "type": "comments" + }, + { + "attributes": { + "text": "Love the bar!" + }, + "id": "2", + "relationships": { + "commentable": { + "data": { id: '1', type: 'videos' } + } + }, + "type": "comments" } - }, - "type": "comments" - }, - { - "attributes": { - "text": "Love the bar!" - }, - "id": "2", - "relationships": { - "commentable": { - "data": { id: '1', type: 'videos' } + ], + included: [ + { + attributes: { + title: "Foo" + }, + id: "1", + type: "photos" + }, + { + attributes: { + "title": "Bar" + }, + id: "1", + type: "videos" } - }, - "type": "comments" - } - ], - included: [ - { - attributes: { - title: "Foo" - }, - id: "1", - type: "photos" - }, - { - attributes: { - "title": "Bar" - }, - id: "1", - type: "videos" - } - ] - }); -}); + ] + }); + }); -test('it works for has many polymorphic relationships', function(assert) { - let schema = new Schema(new Db(), { - user: Model.extend({ - things: hasMany({ polymorphic: true }) - }), - car: Model.extend(), - watch: Model.extend() - }); + test('it works for has many polymorphic relationships', function(assert) { + let schema = new Schema(new Db(), { + user: Model.extend({ + things: hasMany({ polymorphic: true }) + }), + car: Model.extend(), + watch: Model.extend() + }); - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - user: JSONAPISerializer.extend({ - include: ['things'] - }) - }); + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + user: JSONAPISerializer.extend({ + include: ['things'] + }) + }); - let car = schema.cars.create({ make: 'Infiniti' }); - let watch = schema.watches.create({ make: 'Citizen' }); - let user = schema.users.create({ - name: 'Sam', - things: [ car, watch ] - }); + let car = schema.cars.create({ make: 'Infiniti' }); + let watch = schema.watches.create({ make: 'Citizen' }); + let user = schema.users.create({ + name: 'Sam', + things: [ car, watch ] + }); - let json = registry.serialize(user); + let json = registry.serialize(user); - assert.deepEqual(json, { - data: { - "attributes": { - "name": "Sam" - }, - "id": "1", - "relationships": { - "things": { - "data": [ - { id: '1', type: 'cars' }, - { id: '1', type: 'watches' } - ] - } - }, - "type": "users" - }, - "included": [ - { - "attributes": { - "make": "Infiniti" + assert.deepEqual(json, { + data: { + "attributes": { + "name": "Sam" + }, + "id": "1", + "relationships": { + "things": { + "data": [ + { id: '1', type: 'cars' }, + { id: '1', type: 'watches' } + ] + } + }, + "type": "users" }, - "id": "1", - "type": "cars" - }, - { - "attributes": { - "make": "Citizen" - }, - "id": "1", - "type": "watches" - } - ] - }); -}); + "included": [ + { + "attributes": { + "make": "Infiniti" + }, + "id": "1", + "type": "cars" + }, + { + "attributes": { + "make": "Citizen" + }, + "id": "1", + "type": "watches" + } + ] + }); + }); + } +); diff --git a/tests/integration/serializers/json-api-serializer/attrs-test.js b/tests/integration/serializers/json-api-serializer/attrs-test.js index 465a95b44..bd75f40f2 100644 --- a/tests/integration/serializers/json-api-serializer/attrs-test.js +++ b/tests/integration/serializers/json-api-serializer/attrs-test.js @@ -4,100 +4,103 @@ import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { Model, JSONAPISerializer } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | Serializers | JSON API Serializer | Attrs List', { - beforeEach() { - this.schema = new Schema(new Db(), { - wordSmith: Model, - photograph: Model +module( + 'Integration | Serializers | JSON API Serializer | Attrs List', + function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model, + photograph: Model + }); }); - } -}); -test(`it returns only the whitelisted attrs when serializing a model`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - wordSmith: JSONAPISerializer.extend({ - attrs: ['firstName'] - }) - }); - let user = this.schema.wordSmiths.create({ - id: 1, - firstName: 'Link', - age: 123 - }); + test(`it returns only the whitelisted attrs when serializing a model`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + wordSmith: JSONAPISerializer.extend({ + attrs: ['firstName'] + }) + }); + let user = this.schema.wordSmiths.create({ + id: 1, + firstName: 'Link', + age: 123 + }); - let result = registry.serialize(user); + let result = registry.serialize(user); - assert.deepEqual(result, { - data: { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - } - } - }); -}); + assert.deepEqual(result, { + data: { + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link' + } + } + }); + }); -test(`it returns only the whitelisted attrs when serializing a collection`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - wordSmith: JSONAPISerializer.extend({ - attrs: ['firstName'] - }) - }); - this.schema.wordSmiths.create({ id: 1, firstName: 'Link', age: 123 }); - this.schema.wordSmiths.create({ id: 2, firstName: 'Zelda', age: 456 }); + test(`it returns only the whitelisted attrs when serializing a collection`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + wordSmith: JSONAPISerializer.extend({ + attrs: ['firstName'] + }) + }); + this.schema.wordSmiths.create({ id: 1, firstName: 'Link', age: 123 }); + this.schema.wordSmiths.create({ id: 2, firstName: 'Zelda', age: 456 }); - let collection = this.schema.wordSmiths.all(); - let result = registry.serialize(collection); + let collection = this.schema.wordSmiths.all(); + let result = registry.serialize(collection); - assert.deepEqual(result, { - data: [{ - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - } - }, { - type: 'word-smiths', - id: '2', - attributes: { - 'first-name': 'Zelda' - } - }] - }); -}); + assert.deepEqual(result, { + data: [{ + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link' + } + }, { + type: 'word-smiths', + id: '2', + attributes: { + 'first-name': 'Zelda' + } + }] + }); + }); -test(`it can use different attr whitelists for different serializers`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - wordSmith: JSONAPISerializer.extend({ - attrs: ['firstName'] - }), - photograph: JSONAPISerializer.extend({ - attrs: ['title'] - }) - }); + test(`it can use different attr whitelists for different serializers`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + wordSmith: JSONAPISerializer.extend({ + attrs: ['firstName'] + }), + photograph: JSONAPISerializer.extend({ + attrs: ['title'] + }) + }); - let link = this.schema.wordSmiths.create({ id: 1, firstName: 'Link', age: 123 }); - assert.deepEqual(registry.serialize(link), { - data: { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - } - } - }); + let link = this.schema.wordSmiths.create({ id: 1, firstName: 'Link', age: 123 }); + assert.deepEqual(registry.serialize(link), { + data: { + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link' + } + } + }); - let photo = this.schema.photographs.create({ id: 1, title: 'Lorem ipsum', createdAt: '2010-01-01' }); - assert.deepEqual(registry.serialize(photo), { - data: { - type: 'photographs', - id: '1', - attributes: { - 'title': 'Lorem ipsum' - } - } - }); -}); + let photo = this.schema.photographs.create({ id: 1, title: 'Lorem ipsum', createdAt: '2010-01-01' }); + assert.deepEqual(registry.serialize(photo), { + data: { + type: 'photographs', + id: '1', + attributes: { + 'title': 'Lorem ipsum' + } + } + }); + }); + } +); diff --git a/tests/integration/serializers/json-api-serializer/base-test.js b/tests/integration/serializers/json-api-serializer/base-test.js index bc17f14a2..59d065d48 100644 --- a/tests/integration/serializers/json-api-serializer/base-test.js +++ b/tests/integration/serializers/json-api-serializer/base-test.js @@ -4,65 +4,68 @@ import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { Model, JSONAPISerializer } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module('Integration | Serializers | JSON API Serializer | Base', { - beforeEach() { - this.schema = new Schema(new Db(), { - wordSmith: Model +module( + 'Integration | Serializers | JSON API Serializer | Base', + function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model + }); + this.registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer + }); }); - this.registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer - }); - } -}); -test(`it includes all attributes for a model`, function(assert) { - let link = this.schema.wordSmiths.create({ firstName: 'Link', age: 123 }); - let result = this.registry.serialize(link); + test(`it includes all attributes for a model`, function(assert) { + let link = this.schema.wordSmiths.create({ firstName: 'Link', age: 123 }); + let result = this.registry.serialize(link); - assert.deepEqual(result, { - data: { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link', - age: 123 - } - } - }); -}); + assert.deepEqual(result, { + data: { + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link', + age: 123 + } + } + }); + }); -test(`it includes all attributes for each model in a collection`, function(assert) { - this.schema.wordSmiths.create({ firstName: 'Link', age: 123 }); - this.schema.wordSmiths.create({ id: 1, firstName: 'Link', age: 123 }); - this.schema.wordSmiths.create({ id: 2, firstName: 'Zelda', age: 456 }); + test(`it includes all attributes for each model in a collection`, function(assert) { + this.schema.wordSmiths.create({ firstName: 'Link', age: 123 }); + this.schema.wordSmiths.create({ id: 1, firstName: 'Link', age: 123 }); + this.schema.wordSmiths.create({ id: 2, firstName: 'Zelda', age: 456 }); - let collection = this.schema.wordSmiths.all(); - let result = this.registry.serialize(collection); + let collection = this.schema.wordSmiths.all(); + let result = this.registry.serialize(collection); - assert.deepEqual(result, { - data: [{ - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link', - age: 123 - } - }, { - type: 'word-smiths', - id: '2', - attributes: { - 'first-name': 'Zelda', - age: 456 - } - }] - }); -}); + assert.deepEqual(result, { + data: [{ + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link', + age: 123 + } + }, { + type: 'word-smiths', + id: '2', + attributes: { + 'first-name': 'Zelda', + age: 456 + } + }] + }); + }); -test(`it can serialize an empty collection`, function(assert) { - let wordSmiths = this.schema.wordSmiths.all(); - let result = this.registry.serialize(wordSmiths); + test(`it can serialize an empty collection`, function(assert) { + let wordSmiths = this.schema.wordSmiths.all(); + let result = this.registry.serialize(wordSmiths); - assert.deepEqual(result, { - data: [] - }); -}); + assert.deepEqual(result, { + data: [] + }); + }); + } +); diff --git a/tests/integration/serializers/json-api-serializer/key-formatting-test.js b/tests/integration/serializers/json-api-serializer/key-formatting-test.js index 62c60791c..9f1e8fb1e 100644 --- a/tests/integration/serializers/json-api-serializer/key-formatting-test.js +++ b/tests/integration/serializers/json-api-serializer/key-formatting-test.js @@ -5,75 +5,78 @@ import { Model, JSONAPISerializer } from 'ember-cli-mirage'; import { underscore } from 'ember-cli-mirage/utils/inflector'; import { module, test } from 'qunit'; -module('Integration | Serializers | JSON API Serializer | Key Formatting', { - beforeEach() { - this.schema = new Schema(new Db(), { - wordSmith: Model, - photograph: Model +module( + 'Integration | Serializers | JSON API Serializer | Key Formatting', + function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model, + photograph: Model + }); }); - } -}); -test(`keyForAttribute formats the attributes of a model`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer.extend({ - keyForAttribute(key) { - return underscore(key); - } - }) - }); - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - firstName: 'Link', - lastName: 'Jackson', - age: 323 - }); + test(`keyForAttribute formats the attributes of a model`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer.extend({ + keyForAttribute(key) { + return underscore(key); + } + }) + }); + let wordSmith = this.schema.wordSmiths.create({ + id: 1, + firstName: 'Link', + lastName: 'Jackson', + age: 323 + }); - let result = registry.serialize(wordSmith); + let result = registry.serialize(wordSmith); - assert.deepEqual(result, { - data: { - type: 'word-smiths', - id: '1', - attributes: { - age: 323, - first_name: 'Link', - last_name: 'Jackson' - } - } - }); -}); + assert.deepEqual(result, { + data: { + type: 'word-smiths', + id: '1', + attributes: { + age: 323, + first_name: 'Link', + last_name: 'Jackson' + } + } + }); + }); -test(`keyForAttribute also formats the models in a collections`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer.extend({ - keyForAttribute(key) { - return underscore(key); - } - }) - }); + test(`keyForAttribute also formats the models in a collections`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer.extend({ + keyForAttribute(key) { + return underscore(key); + } + }) + }); - this.schema.wordSmiths.create({ id: 1, 'firstName': 'Link', 'lastName': 'Jackson' }); - this.schema.wordSmiths.create({ id: 2, 'firstName': 'Zelda', 'lastName': 'Brown' }); - let wordSmiths = this.schema.wordSmiths.all(); + this.schema.wordSmiths.create({ id: 1, 'firstName': 'Link', 'lastName': 'Jackson' }); + this.schema.wordSmiths.create({ id: 2, 'firstName': 'Zelda', 'lastName': 'Brown' }); + let wordSmiths = this.schema.wordSmiths.all(); - let result = registry.serialize(wordSmiths); + let result = registry.serialize(wordSmiths); - assert.deepEqual(result, { - data: [{ - type: 'word-smiths', - id: '1', - attributes: { - 'first_name': 'Link', - 'last_name': 'Jackson' - } - }, { - type: 'word-smiths', - id: '2', - attributes: { - 'first_name': 'Zelda', - 'last_name': 'Brown' - } - }] - }); -}); + assert.deepEqual(result, { + data: [{ + type: 'word-smiths', + id: '1', + attributes: { + 'first_name': 'Link', + 'last_name': 'Jackson' + } + }, { + type: 'word-smiths', + id: '2', + attributes: { + 'first_name': 'Zelda', + 'last_name': 'Brown' + } + }] + }); + }); + } +); diff --git a/tests/integration/serializers/rest-serializer-test.js b/tests/integration/serializers/rest-serializer-test.js index 246d3dea4..b44294983 100644 --- a/tests/integration/serializers/rest-serializer-test.js +++ b/tests/integration/serializers/rest-serializer-test.js @@ -6,8 +6,8 @@ import Db from 'ember-cli-mirage/db'; import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { module, test } from 'qunit'; -module('Integration | Serializer | RestSerializer', { - beforeEach() { +module('Integration | Serializer | RestSerializer', function(hooks) { + hooks.beforeEach(function() { let db = new Db(); this.schema = new Schema(db); this.schema.registerModels({ @@ -35,34 +35,34 @@ module('Integration | Serializer | RestSerializer', { include: ['wordSmith'] }) }); - }, + }); - afterEach() { + hooks.afterEach(function() { this.schema.db.emptyData(); - } -}); + }); -test('it sideloads associations and camel-cases relationships and attributes correctly for a model', function(assert) { - let link = this.schema.wordSmiths.find(1); - let result = this.registry.serialize(link); + test('it sideloads associations and camel-cases relationships and attributes correctly for a model', function(assert) { + let link = this.schema.wordSmiths.find(1); + let result = this.registry.serialize(link); - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - blogPosts: ['1', '2'] - }, - blogPosts: [ - { + assert.deepEqual(result, { + wordSmith: { id: '1', - title: 'Lorem', - wordSmith: '1' + name: 'Link', + blogPosts: ['1', '2'] }, - { - id: '2', - title: 'Ipsum', - wordSmith: '1' - } - ] + blogPosts: [ + { + id: '1', + title: 'Lorem', + wordSmith: '1' + }, + { + id: '2', + title: 'Ipsum', + wordSmith: '1' + } + ] + }); }); }); diff --git a/tests/integration/server-config-test.js b/tests/integration/server-config-test.js index 2fa87f687..9f390f544 100644 --- a/tests/integration/server-config-test.js +++ b/tests/integration/server-config-test.js @@ -4,8 +4,8 @@ import Server from 'ember-cli-mirage/server'; import ActiveModelSerializer from 'ember-cli-mirage/serializers/active-model-serializer'; import RestSerializer from 'ember-cli-mirage/serializers/rest-serializer'; -module('Integration | Server Config', { - beforeEach() { +module('Integration | Server Config', function(hooks) { + hooks.beforeEach(function() { this.server = new Server({ environment: 'development', models: { @@ -18,235 +18,236 @@ module('Integration | Server Config', { }); this.server.timing = 0; this.server.logging = false; - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); - } -}); + }); -test('namespace can be configured', function(assert) { - assert.expect(1); - let done = assert.async(); + test('namespace can be configured', function(assert) { + assert.expect(1); + let done = assert.async(); - let contacts = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ]; - this.server.db.loadData({ - contacts - }); - this.server.namespace = 'api'; - this.server.get('/contacts'); + let contacts = [ + { id: '1', name: 'Link' }, + { id: '2', name: 'Zelda' } + ]; + this.server.db.loadData({ + contacts + }); + this.server.namespace = 'api'; + this.server.get('/contacts'); - $.getJSON('/api/contacts', function(data) { - assert.deepEqual(data, { contacts }); - done(); + $.getJSON('/api/contacts', function(data) { + assert.deepEqual(data, { contacts }); + done(); + }); }); -}); -test('urlPrefix can be configured', function(assert) { - assert.expect(1); - let done = assert.async(); - let { server } = this; - - let contacts = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ]; - server.db.loadData({ - contacts - }); - server.urlPrefix = 'http://localhost:3000'; - server.get('/contacts'); + test('urlPrefix can be configured', function(assert) { + assert.expect(1); + let done = assert.async(); + let { server } = this; - $.getJSON('http://localhost:3000/contacts', function(data) { - assert.deepEqual(data, { contacts }); - done(); - }); -}); + let contacts = [ + { id: '1', name: 'Link' }, + { id: '2', name: 'Zelda' } + ]; + server.db.loadData({ + contacts + }); + server.urlPrefix = 'http://localhost:3000'; + server.get('/contacts'); -test('urlPrefix and namespace can be configured simultaneously', function(assert) { - assert.expect(1); - let done = assert.async(); - let { server } = this; - - let contacts = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ]; - server.db.loadData({ - contacts + $.getJSON('http://localhost:3000/contacts', function(data) { + assert.deepEqual(data, { contacts }); + done(); + }); }); - server.urlPrefix = 'http://localhost:3000'; - server.namespace = 'api'; - server.get('/contacts'); - $.getJSON('http://localhost:3000/api/contacts', function(data) { - assert.deepEqual(data, { contacts }); - done(); - }); -}); + test('urlPrefix and namespace can be configured simultaneously', function(assert) { + assert.expect(1); + let done = assert.async(); + let { server } = this; -test('fully qualified domain names can be used in configuration', function(assert) { - assert.expect(1); - let done = assert.async(); + let contacts = [ + { id: '1', name: 'Link' }, + { id: '2', name: 'Zelda' } + ]; + server.db.loadData({ + contacts + }); + server.urlPrefix = 'http://localhost:3000'; + server.namespace = 'api'; + server.get('/contacts'); - let contacts = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ]; - this.server.db.loadData({ - contacts + $.getJSON('http://localhost:3000/api/contacts', function(data) { + assert.deepEqual(data, { contacts }); + done(); + }); }); - this.server.get('http://example.org/api/contacts'); - $.getJSON('http://example.org/api/contacts', function(data) { - assert.deepEqual(data, { contacts }); - done(); - }); -}); + test('fully qualified domain names can be used in configuration', function(assert) { + assert.expect(1); + let done = assert.async(); -test('urlPrefix/namespace are ignored when fully qualified domain names are used in configuration', function(assert) { - assert.expect(1); - let done = assert.async(); - let { server } = this; - - let contacts = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ]; - server.db.loadData({ - contacts - }); - this.urlPrefix = 'https://example.net'; - server.get('http://example.org/api/contacts'); + let contacts = [ + { id: '1', name: 'Link' }, + { id: '2', name: 'Zelda' } + ]; + this.server.db.loadData({ + contacts + }); + this.server.get('http://example.org/api/contacts'); - $.getJSON('http://example.org/api/contacts', function(data) { - assert.deepEqual(data, { contacts }); - done(); + $.getJSON('http://example.org/api/contacts', function(data) { + assert.deepEqual(data, { contacts }); + done(); + }); }); -}); -test('blank urlPrefix and namespace ends up as /', function(assert) { - assert.expect(1); - let done = assert.async(); + test('urlPrefix/namespace are ignored when fully qualified domain names are used in configuration', function(assert) { + assert.expect(1); + let done = assert.async(); + let { server } = this; - let contacts = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ]; - this.server.db.loadData({ - contacts - }); - this.server.namespace = ''; - this.server.urlPrefix = ''; - this.server.get('contacts'); + let contacts = [ + { id: '1', name: 'Link' }, + { id: '2', name: 'Zelda' } + ]; + server.db.loadData({ + contacts + }); + this.urlPrefix = 'https://example.net'; + server.get('http://example.org/api/contacts'); - $.getJSON('/contacts', function(data) { - assert.deepEqual(data, { contacts }); - done(); + $.getJSON('http://example.org/api/contacts', function(data) { + assert.deepEqual(data, { contacts }); + done(); + }); }); -}); -test('namespace with no slash gets one', function(assert) { - assert.expect(1); - let done = assert.async(); + test('blank urlPrefix and namespace ends up as /', function(assert) { + assert.expect(1); + let done = assert.async(); - let contacts = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ]; - this.server.db.loadData({ - contacts - }); - this.server.namespace = 'api'; - this.server.get('contacts'); + let contacts = [ + { id: '1', name: 'Link' }, + { id: '2', name: 'Zelda' } + ]; + this.server.db.loadData({ + contacts + }); + this.server.namespace = ''; + this.server.urlPrefix = ''; + this.server.get('contacts'); - $.getJSON('/api/contacts', function(data) { - assert.deepEqual(data, { contacts }); - done(); + $.getJSON('/contacts', function(data) { + assert.deepEqual(data, { contacts }); + done(); + }); }); -}); -test('urlPrefix with no slash gets one', function(assert) { - assert.expect(1); - let done = assert.async(); + test('namespace with no slash gets one', function(assert) { + assert.expect(1); + let done = assert.async(); - let contacts = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ]; - this.server.db.loadData({ - contacts - }); - this.server.urlPrefix = 'pre'; - this.server.get('contacts'); + let contacts = [ + { id: '1', name: 'Link' }, + { id: '2', name: 'Zelda' } + ]; + this.server.db.loadData({ + contacts + }); + this.server.namespace = 'api'; + this.server.get('contacts'); - $.getJSON('/pre/contacts', function(data) { - assert.deepEqual(data, { contacts }); - done(); + $.getJSON('/api/contacts', function(data) { + assert.deepEqual(data, { contacts }); + done(); + }); }); -}); -test('namespace of / works', function(assert) { - assert.expect(1); - let done = assert.async(); + test('urlPrefix with no slash gets one', function(assert) { + assert.expect(1); + let done = assert.async(); - let contacts = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ]; - this.server.db.loadData({ - contacts - }); - this.server.namespace = '/'; - this.server.get('contacts'); + let contacts = [ + { id: '1', name: 'Link' }, + { id: '2', name: 'Zelda' } + ]; + this.server.db.loadData({ + contacts + }); + this.server.urlPrefix = 'pre'; + this.server.get('contacts'); - $.getJSON('/contacts', function(data) { - assert.deepEqual(data, { contacts }); - done(); + $.getJSON('/pre/contacts', function(data) { + assert.deepEqual(data, { contacts }); + done(); + }); }); -}); -test('redefining options using the config method works', function(assert) { - assert.expect(5); - let done = assert.async(); - let { server } = this; - - let contacts = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ]; - server.config({ - namespace: 'api', - urlPrefix: 'http://localhost:3000', - timing: 1000, - serializers: { - post: RestSerializer - } - }); - server.db.loadData({ - contacts - }); - server.get('contacts'); + test('namespace of / works', function(assert) { + assert.expect(1); + let done = assert.async(); - assert.equal(server.timing, 1000); - $.getJSON('http://localhost:3000/api/contacts', function(data) { - assert.deepEqual(data, { contacts }); - done(); + let contacts = [ + { id: '1', name: 'Link' }, + { id: '2', name: 'Zelda' } + ]; + this.server.db.loadData({ + contacts + }); + this.server.namespace = '/'; + this.server.get('contacts'); + + $.getJSON('/contacts', function(data) { + assert.deepEqual(data, { contacts }); + done(); + }); }); - let serializerMap = server.serializerOrRegistry._serializerMap; - assert.equal(Object.keys(serializerMap).length, 2); - assert.equal(serializerMap.contact, ActiveModelSerializer); - assert.equal(serializerMap.post, RestSerializer); -}); -test('changing the environment of the server throws an error', function(assert) { - let { server } = this; + test('redefining options using the config method works', function(assert) { + assert.expect(5); + let done = assert.async(); + let { server } = this; - assert.throws(function() { + let contacts = [ + { id: '1', name: 'Link' }, + { id: '2', name: 'Zelda' } + ]; server.config({ - environment: 'test' + namespace: 'api', + urlPrefix: 'http://localhost:3000', + timing: 1000, + serializers: { + post: RestSerializer + } + }); + server.db.loadData({ + contacts }); - }, /You cannot modify Mirage's environment once the server is created/); + server.get('contacts'); + + assert.equal(server.timing, 1000); + $.getJSON('http://localhost:3000/api/contacts', function(data) { + assert.deepEqual(data, { contacts }); + done(); + }); + let serializerMap = server.serializerOrRegistry._serializerMap; + assert.equal(Object.keys(serializerMap).length, 2); + assert.equal(serializerMap.contact, ActiveModelSerializer); + assert.equal(serializerMap.post, RestSerializer); + }); + + test('changing the environment of the server throws an error', function(assert) { + let { server } = this; + + assert.throws(function() { + server.config({ + environment: 'test' + }); + }, /You cannot modify Mirage's environment once the server is created/); + }); }); diff --git a/tests/integration/server-with-orm-test.js b/tests/integration/server-with-orm-test.js index d4ae226d0..5d63690e4 100644 --- a/tests/integration/server-with-orm-test.js +++ b/tests/integration/server-with-orm-test.js @@ -2,8 +2,8 @@ import {module, test} from 'qunit'; import { Model, Factory } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; -module('Integration | Server with ORM', { - beforeEach() { +module('Integration | Server with ORM', function(hooks) { + hooks.beforeEach(function() { this.server = new Server({ environment: 'test', models: { @@ -15,19 +15,20 @@ module('Integration | Server with ORM', { }); this.server.timing = 0; this.server.logging = false; - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); - } -}); + }); -test('a single blogPost db collection is made', function(assert) { - assert.equal(this.server.db._collections.length, 1); - assert.equal(this.server.db._collections[0].name, 'blogPosts'); -}); + test('a single blogPost db collection is made', function(assert) { + assert.equal(this.server.db._collections.length, 1); + assert.equal(this.server.db._collections[0].name, 'blogPosts'); + }); -test('create looks up the appropriate db collection', function(assert) { - server.create('blog-post'); + test('create looks up the appropriate db collection', function(assert) { + server.create('blog-post'); - assert.equal(this.server.db.blogPosts.length, 1); + assert.equal(this.server.db.blogPosts.length, 1); + }); }); diff --git a/tests/integration/server/custom-function-handler-test.js b/tests/integration/server/custom-function-handler-test.js index e55dd6f92..331b0ce23 100644 --- a/tests/integration/server/custom-function-handler-test.js +++ b/tests/integration/server/custom-function-handler-test.js @@ -2,8 +2,8 @@ import { module, test } from 'qunit'; import { Model, Factory, ActiveModelSerializer } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; -module('Integration | Server | Custom function handler', { - beforeEach() { +module('Integration | Server | Custom function handler', function(hooks) { + hooks.beforeEach(function() { this.server = new Server({ environment: 'test', models: { @@ -18,86 +18,87 @@ module('Integration | Server | Custom function handler', { }); this.server.timing = 0; this.server.logging = false; - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); - } -}); + }); -test(`a POJA of models defaults to responding with an array of each model's attrs`, function(assert) { - assert.expect(1); - let done = assert.async(); - let { server } = this; + test(`a POJA of models defaults to responding with an array of each model's attrs`, function(assert) { + assert.expect(1); + let done = assert.async(); + let { server } = this; - server.createList('contact', 3); - server.get('/contacts', (schema) => { - return schema.contacts.all().models; - }); + server.createList('contact', 3); + server.get('/contacts', (schema) => { + return schema.contacts.all().models; + }); - $.ajax({ - method: 'GET', - url: '/contacts' - }).done((res) => { - assert.deepEqual(res, [{ id: '1' }, { id: '2' }, { id: '3' }]); - done(); + $.ajax({ + method: 'GET', + url: '/contacts' + }).done((res) => { + assert.deepEqual(res, [{ id: '1' }, { id: '2' }, { id: '3' }]); + done(); + }); }); -}); -test(`#normalizedRequestAttrs returns an object with the primary resource's attrs and belongsTo keys camelized`, function(assert) { - assert.expect(1); - let done = assert.async(); - let { server } = this; + test(`#normalizedRequestAttrs returns an object with the primary resource's attrs and belongsTo keys camelized`, function(assert) { + assert.expect(1); + let done = assert.async(); + let { server } = this; - server.post('/contacts', function() { - let attrs = this.normalizedRequestAttrs(); + server.post('/contacts', function() { + let attrs = this.normalizedRequestAttrs(); - assert.deepEqual(attrs, { - firstName: 'Sam', - lastName: 'Selikoff', - teamId: 1 - }); + assert.deepEqual(attrs, { + firstName: 'Sam', + lastName: 'Selikoff', + teamId: 1 + }); - return {}; - }); + return {}; + }); - $.ajax({ - method: 'POST', - url: '/contacts', - contentType: 'application/json', - data: JSON.stringify({ - contact: { - first_name: 'Sam', - last_name: 'Selikoff', - team_id: 1 - } - }) - }).done(() => { - done(); + $.ajax({ + method: 'POST', + url: '/contacts', + contentType: 'application/json', + data: JSON.stringify({ + contact: { + first_name: 'Sam', + last_name: 'Selikoff', + team_id: 1 + } + }) + }).done(() => { + done(); + }); }); -}); -test(`#normalizedRequestAttrs parses a x-www-form-urlencoded request and returns a POJO`, function(assert) { - assert.expect(1); - let done = assert.async(); - let { server } = this; + test(`#normalizedRequestAttrs parses a x-www-form-urlencoded request and returns a POJO`, function(assert) { + assert.expect(1); + let done = assert.async(); + let { server } = this; - server.post('/form-test', function() { - let attrs = this.normalizedRequestAttrs(); + server.post('/form-test', function() { + let attrs = this.normalizedRequestAttrs(); - assert.deepEqual(attrs, { - name: 'Sam Selikoff', - company: 'TED', - email: 'sam.selikoff@gmail.com' - }, '#normalizedRequestAttrs successfully returned the parsed x-www-form-urlencoded request body'); + assert.deepEqual(attrs, { + name: 'Sam Selikoff', + company: 'TED', + email: 'sam.selikoff@gmail.com' + }, '#normalizedRequestAttrs successfully returned the parsed x-www-form-urlencoded request body'); - return {}; - }); + return {}; + }); - $.ajax({ - method: 'POST', - url: '/form-test', - data: 'name=Sam+Selikoff&company=TED&email=sam.selikoff@gmail.com' - }).done(() => { - done(); + $.ajax({ + method: 'POST', + url: '/form-test', + data: 'name=Sam+Selikoff&company=TED&email=sam.selikoff@gmail.com' + }).done(() => { + done(); + }); }); }); diff --git a/tests/integration/server/customized-normalize-method-test.js b/tests/integration/server/customized-normalize-method-test.js index c96fdd996..be567c545 100644 --- a/tests/integration/server/customized-normalize-method-test.js +++ b/tests/integration/server/customized-normalize-method-test.js @@ -3,8 +3,8 @@ import { Model, ActiveModelSerializer } from 'ember-cli-mirage'; import { camelize } from 'ember-cli-mirage/utils/inflector'; import Server from 'ember-cli-mirage/server'; -module('Integration | Server | Customized normalize method', { - beforeEach() { +module('Integration | Server | Customized normalize method', function(hooks) { + hooks.beforeEach(function() { this.server = new Server({ environment: 'test', models: { @@ -30,78 +30,79 @@ module('Integration | Server | Customized normalize method', { }); this.server.timing = 0; this.server.logging = false; - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); - } -}); + }); -test('custom model-specific normalize functions are used', function(assert) { - let { server } = this; - assert.expect(3); - let done = assert.async(); + test('custom model-specific normalize functions are used', function(assert) { + let { server } = this; + assert.expect(3); + let done = assert.async(); - server.post('/contacts'); + server.post('/contacts'); - $.ajax({ - method: 'POST', - url: '/contacts', - data: JSON.stringify({ - some: { - random: [ - { - format: true - }, - { - attrs: { - first_name: 'Zelda' + $.ajax({ + method: 'POST', + url: '/contacts', + data: JSON.stringify({ + some: { + random: [ + { + format: true + }, + { + attrs: { + first_name: 'Zelda' + } } - } - ] - } - }) - }).done((res, status, xhr) => { - assert.equal(xhr.status, 201); - assert.equal(server.db.contacts.length, 1); - assert.equal(server.db.contacts[0].firstName, 'Zelda'); - done(); + ] + } + }) + }).done((res, status, xhr) => { + assert.equal(xhr.status, 201); + assert.equal(server.db.contacts.length, 1); + assert.equal(server.db.contacts[0].firstName, 'Zelda'); + done(); + }); }); -}); -test('custom model-specific normalize functions are used with custom function handlers', function(assert) { - let { server } = this; - let done = assert.async(); + test('custom model-specific normalize functions are used with custom function handlers', function(assert) { + let { server } = this; + let done = assert.async(); - server.put('/contacts/:id', function(schema, request) { - let attrs = this.normalizedRequestAttrs(); + server.put('/contacts/:id', function(schema, request) { + let attrs = this.normalizedRequestAttrs(); - assert.deepEqual(attrs, { - id: '1', - firstName: 'Zelda' - }); + assert.deepEqual(attrs, { + id: '1', + firstName: 'Zelda' + }); - return {}; - }); + return {}; + }); - $.ajax({ - method: 'PUT', - url: '/contacts/1', - contentType: 'application/json', - data: JSON.stringify({ - some: { - random: [ - { - format: true - }, - { - attrs: { - first_name: 'Zelda' + $.ajax({ + method: 'PUT', + url: '/contacts/1', + contentType: 'application/json', + data: JSON.stringify({ + some: { + random: [ + { + format: true + }, + { + attrs: { + first_name: 'Zelda' + } } - } - ] - } - }) - }).done(() => { - done(); + ] + } + }) + }).done(() => { + done(); + }); }); }); diff --git a/tests/integration/server/factory-creation-test.js b/tests/integration/server/factory-creation-test.js index 53e71d1cd..3df02b0b8 100644 --- a/tests/integration/server/factory-creation-test.js +++ b/tests/integration/server/factory-creation-test.js @@ -2,8 +2,8 @@ import { module, test } from 'qunit'; import { Model, Factory, hasMany, belongsTo } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; -module('Integration | Server | Factory creation', { - beforeEach() { +module('Integration | Server | Factory creation', function(hooks) { + hooks.beforeEach(function() { this.Contact = Model.extend(); this.AmazingContact = Model.extend(); this.Post = Model.extend({ @@ -28,70 +28,71 @@ module('Integration | Server | Factory creation', { }); this.server.timing = 0; this.server.logging = false; - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); - } -}); + }); -test('create returns a Model if one is defined', function(assert) { - let contact = this.server.create('contact'); + test('create returns a Model if one is defined', function(assert) { + let contact = this.server.create('contact'); - assert.ok(contact instanceof this.Contact, 'expected a Contact'); -}); + assert.ok(contact instanceof this.Contact, 'expected a Contact'); + }); -test('createList returns Models if one is defined', function(assert) { - let contacts = this.server.createList('contact', 1); + test('createList returns Models if one is defined', function(assert) { + let contacts = this.server.createList('contact', 1); - assert.ok(contacts[0] instanceof this.Contact, 'expected a Contactl'); -}); + assert.ok(contacts[0] instanceof this.Contact, 'expected a Contactl'); + }); -test('create returns a Model if one is defined, when using a compound name', function(assert) { - let contact = this.server.create('amazing-contact'); + test('create returns a Model if one is defined, when using a compound name', function(assert) { + let contact = this.server.create('amazing-contact'); - assert.ok(contact instanceof this.AmazingContact, 'expected an AmazingContact'); -}); + assert.ok(contact instanceof this.AmazingContact, 'expected an AmazingContact'); + }); -test('createList returns Models if one is defined, when using a compound name', function(assert) { - let contacts = this.server.createList('amazing-contact', 1); + test('createList returns Models if one is defined, when using a compound name', function(assert) { + let contacts = this.server.createList('amazing-contact', 1); - assert.ok(contacts[0] instanceof this.AmazingContact, 'expected an AmazingContact'); -}); - -test('create falls back to a model if no factory is defined', function(assert) { - let post = this.server.create('post'); + assert.ok(contacts[0] instanceof this.AmazingContact, 'expected an AmazingContact'); + }); - assert.ok(post instanceof this.Post); - assert.equal(post.id, 1); -}); + test('create falls back to a model if no factory is defined', function(assert) { + let post = this.server.create('post'); -test('createList falls back to a model if no factory is defined', function(assert) { - let posts = this.server.createList('post', 2); + assert.ok(post instanceof this.Post); + assert.equal(post.id, 1); + }); - assert.ok(posts[0] instanceof this.Post); - assert.equal(posts.length, 2); - assert.equal(posts[0].id, 1); -}); + test('createList falls back to a model if no factory is defined', function(assert) { + let posts = this.server.createList('post', 2); -test('create sets up the db correctly when passing in fks', function(assert) { - let author = server.create('author'); - let post = this.server.create('post', { - authorId: author.id + assert.ok(posts[0] instanceof this.Post); + assert.equal(posts.length, 2); + assert.equal(posts[0].id, 1); }); - author.reload(); - assert.equal(author.posts.models.length, 1); - assert.deepEqual(post.author.attrs, author.attrs); - assert.equal(this.server.db.posts[0].authorId, author.id); -}); + test('create sets up the db correctly when passing in fks', function(assert) { + let author = server.create('author'); + let post = this.server.create('post', { + authorId: author.id + }); + author.reload(); -test('create sets up the db correctly when passing in models', function(assert) { - let author = server.create('author'); - let post = this.server.create('post', { - author + assert.equal(author.posts.models.length, 1); + assert.deepEqual(post.author.attrs, author.attrs); + assert.equal(this.server.db.posts[0].authorId, author.id); }); - assert.equal(author.posts.models.length, 1); - assert.deepEqual(post.author.attrs, author.attrs); - assert.equal(this.server.db.posts[0].authorId, author.id); + test('create sets up the db correctly when passing in models', function(assert) { + let author = server.create('author'); + let post = this.server.create('post', { + author + }); + + assert.equal(author.posts.models.length, 1); + assert.deepEqual(post.author.attrs, author.attrs); + assert.equal(this.server.db.posts[0].authorId, author.id); + }); }); diff --git a/tests/integration/server/get-full-path-test.js b/tests/integration/server/get-full-path-test.js index ec5b2e5d8..4cf8304d9 100644 --- a/tests/integration/server/get-full-path-test.js +++ b/tests/integration/server/get-full-path-test.js @@ -1,98 +1,99 @@ import {module, test} from 'qunit'; import Server from 'ember-cli-mirage/server'; -module('Integration | Server | Get full path', { - beforeEach() { +module('Integration | Server | Get full path', function(hooks) { + hooks.beforeEach(function() { this.server = new Server({ environment: 'test' }); this.server.timing = 0; this.server.logging = false; - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); - } -}); - -test('it works with a configured namespace with a leading slash', function(assert) { - assert.expect(1); - let { server } = this; - server.namespace = '/api'; - - assert.equal(server._getFullPath('/contacts'), '/api/contacts'); -}); - -test('it works with a configured namespace with a trailing slash', function(assert) { - assert.expect(1); - let { server } = this; - server.namespace = 'api/'; - - assert.equal(server._getFullPath('/contacts'), '/api/contacts'); -}); - -test('it works with a configured namespace without a leading slash', function(assert) { - assert.expect(1); - let { server } = this; - server.namespace = 'api'; - - assert.equal(server._getFullPath('/contacts'), '/api/contacts'); -}); - -test('it works with a configured namespace is an empty string', function(assert) { - assert.expect(1); - let { server } = this; - server.namespace = ''; - - assert.equal(server._getFullPath('/contacts'), '/contacts'); -}); - -test('it works with a configured urlPrefix with a trailing slash', function(assert) { - assert.expect(1); - let { server } = this; - server.urlPrefix = 'http://localhost:3000/'; - - assert.equal(server._getFullPath('/contacts'), 'http://localhost:3000/contacts'); -}); - -test('it works with a configured urlPrefix without a trailing slash', function(assert) { - assert.expect(1); - let { server } = this; - server.urlPrefix = 'http://localhost:3000'; - - assert.equal(server._getFullPath('/contacts'), 'http://localhost:3000/contacts'); -}); - -test('it works with a configured urlPrefix as an empty string', function(assert) { - assert.expect(1); - let { server } = this; - server.urlPrefix = ''; - - assert.equal(server._getFullPath('/contacts'), '/contacts'); -}); - -test('it works with a configured namespace and a urlPrefix', function(assert) { - assert.expect(1); - let { server } = this; - server.namespace = 'api'; - server.urlPrefix = 'http://localhost:3000'; - - assert.equal(server._getFullPath('/contacts'), 'http://localhost:3000/api/contacts'); -}); - -test('it works with a configured namespace with a leading slash and a urlPrefix', function(assert) { - assert.expect(1); - let { server } = this; - server.namespace = '/api'; - server.urlPrefix = 'http://localhost:3000'; - - assert.equal(server._getFullPath('/contacts'), 'http://localhost:3000/api/contacts'); -}); - -test('it works with a configured namespace and a urlPrefix as empty strings', function(assert) { - assert.expect(1); - let { server } = this; - server.namespace = ''; - server.urlPrefix = ''; - - assert.equal(server._getFullPath('/contacts'), '/contacts'); + }); + + test('it works with a configured namespace with a leading slash', function(assert) { + assert.expect(1); + let { server } = this; + server.namespace = '/api'; + + assert.equal(server._getFullPath('/contacts'), '/api/contacts'); + }); + + test('it works with a configured namespace with a trailing slash', function(assert) { + assert.expect(1); + let { server } = this; + server.namespace = 'api/'; + + assert.equal(server._getFullPath('/contacts'), '/api/contacts'); + }); + + test('it works with a configured namespace without a leading slash', function(assert) { + assert.expect(1); + let { server } = this; + server.namespace = 'api'; + + assert.equal(server._getFullPath('/contacts'), '/api/contacts'); + }); + + test('it works with a configured namespace is an empty string', function(assert) { + assert.expect(1); + let { server } = this; + server.namespace = ''; + + assert.equal(server._getFullPath('/contacts'), '/contacts'); + }); + + test('it works with a configured urlPrefix with a trailing slash', function(assert) { + assert.expect(1); + let { server } = this; + server.urlPrefix = 'http://localhost:3000/'; + + assert.equal(server._getFullPath('/contacts'), 'http://localhost:3000/contacts'); + }); + + test('it works with a configured urlPrefix without a trailing slash', function(assert) { + assert.expect(1); + let { server } = this; + server.urlPrefix = 'http://localhost:3000'; + + assert.equal(server._getFullPath('/contacts'), 'http://localhost:3000/contacts'); + }); + + test('it works with a configured urlPrefix as an empty string', function(assert) { + assert.expect(1); + let { server } = this; + server.urlPrefix = ''; + + assert.equal(server._getFullPath('/contacts'), '/contacts'); + }); + + test('it works with a configured namespace and a urlPrefix', function(assert) { + assert.expect(1); + let { server } = this; + server.namespace = 'api'; + server.urlPrefix = 'http://localhost:3000'; + + assert.equal(server._getFullPath('/contacts'), 'http://localhost:3000/api/contacts'); + }); + + test('it works with a configured namespace with a leading slash and a urlPrefix', function(assert) { + assert.expect(1); + let { server } = this; + server.namespace = '/api'; + server.urlPrefix = 'http://localhost:3000'; + + assert.equal(server._getFullPath('/contacts'), 'http://localhost:3000/api/contacts'); + }); + + test('it works with a configured namespace and a urlPrefix as empty strings', function(assert) { + assert.expect(1); + let { server } = this; + server.namespace = ''; + server.urlPrefix = ''; + + assert.equal(server._getFullPath('/contacts'), '/contacts'); + }); }); \ No newline at end of file diff --git a/tests/integration/server/resource-shorthand-test.js b/tests/integration/server/resource-shorthand-test.js index 572610f2d..008da999c 100644 --- a/tests/integration/server/resource-shorthand-test.js +++ b/tests/integration/server/resource-shorthand-test.js @@ -2,8 +2,8 @@ import {module, test} from 'qunit'; import { Model, ActiveModelSerializer } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; -module('Integration | Server | Resource shorthand', { - beforeEach() { +module('Integration | Server | Resource shorthand', function(hooks) { + hooks.beforeEach(function() { this.server = new Server({ environment: 'test', models: { @@ -16,481 +16,482 @@ module('Integration | Server | Resource shorthand', { }); this.server.timing = 0; this.server.logging = false; - }, - afterEach() { - this.server.shutdown(); - } -}); - -test('resource generates get shorthand for index action', function(assert) { - assert.expect(3); - let done = assert.async(2); - - this.server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' }, - { id: 2, name: 'Zelda' } - ], - blogPosts: [ - { id: 1, title: 'Post 1' }, - { id: 2, title: 'Post 2' } - ] }); - this.server.resource('contacts'); - this.server.resource('blog-posts', { path: '/posts' }); - - $.ajax({ - method: 'GET', - url: '/contacts' - }).done(function(res, status, xhr) { - assert.equal(xhr.status, 200); - assert.deepEqual(res, { contacts: [{ id: '1', name: 'Link' }, { id: '2', name: 'Zelda' }] }); - done(); + hooks.afterEach(function() { + this.server.shutdown(); }); - $.ajax({ - method: 'GET', - url: '/posts' - }).fail((xhr, textStatus, error) => { - assert.ok(false, 'failed to find custom path'); - done(); - }).done(function(res, status, xhr) { - assert.ok(true); - done(); - }); -}); + test('resource generates get shorthand for index action', function(assert) { + assert.expect(3); + let done = assert.async(2); -test('resource generates get shorthand for show action', function(assert) { - assert.expect(3); - let done = assert.async(2); - - this.server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' }, - { id: 2, name: 'Zelda' } - ], - blogPosts: [ - { id: 1, title: 'Post 1' }, - { id: 2, title: 'Post 2' } - ] - }); + this.server.db.loadData({ + contacts: [ + { id: 1, name: 'Link' }, + { id: 2, name: 'Zelda' } + ], + blogPosts: [ + { id: 1, title: 'Post 1' }, + { id: 2, title: 'Post 2' } + ] + }); - this.server.resource('contacts'); - this.server.resource('blog-posts', { path: '/posts' }); + this.server.resource('contacts'); + this.server.resource('blog-posts', { path: '/posts' }); - $.ajax({ - method: 'GET', - url: '/contacts/2' - }).done(function(res, status, xhr) { - assert.equal(xhr.status, 200); - assert.deepEqual(res, { contact: { id: '2', name: 'Zelda' } }); - done(); - }); + $.ajax({ + method: 'GET', + url: '/contacts' + }).done(function(res, status, xhr) { + assert.equal(xhr.status, 200); + assert.deepEqual(res, { contacts: [{ id: '1', name: 'Link' }, { id: '2', name: 'Zelda' }] }); + done(); + }); - $.ajax({ - method: 'GET', - url: '/posts/2' - }).fail((xhr, textStatus, error) => { - assert.ok(false, 'failed to find custom path'); - done(); - }).done(function(res, status, xhr) { - assert.ok(true); - done(); + $.ajax({ + method: 'GET', + url: '/posts' + }).fail((xhr, textStatus, error) => { + assert.ok(false, 'failed to find custom path'); + done(); + }).done(function(res, status, xhr) { + assert.ok(true); + done(); + }); }); -}); -test('resource generates post shorthand', function(assert) { - let { server } = this; - assert.expect(3); - let done = assert.async(2); + test('resource generates get shorthand for show action', function(assert) { + assert.expect(3); + let done = assert.async(2); - server.resource('contacts'); - server.resource('blog-posts', { path: '/posts' }); + this.server.db.loadData({ + contacts: [ + { id: 1, name: 'Link' }, + { id: 2, name: 'Zelda' } + ], + blogPosts: [ + { id: 1, title: 'Post 1' }, + { id: 2, title: 'Post 2' } + ] + }); - $.ajax({ - method: 'POST', - url: '/contacts', - data: JSON.stringify({ - contact: { - name: 'Zelda' - } - }) - }).done((res, status, xhr) => { - assert.equal(xhr.status, 201); - assert.equal(server.db.contacts.length, 1); - done(); - }); + this.server.resource('contacts'); + this.server.resource('blog-posts', { path: '/posts' }); - $.ajax({ - method: 'POST', - url: '/posts', - data: JSON.stringify({ - blog_post: { - name: 'Post 1' - } - }) - }).fail((xhr, textStatus, error) => { - assert.ok(false, 'failed to find custom path'); - done(); - }).done((res, status, xhr) => { - assert.ok(true); - done(); - }); -}); + $.ajax({ + method: 'GET', + url: '/contacts/2' + }).done(function(res, status, xhr) { + assert.equal(xhr.status, 200); + assert.deepEqual(res, { contact: { id: '2', name: 'Zelda' } }); + done(); + }); -test('resource generates put shorthand', function(assert) { - let { server } = this; - assert.expect(3); - let done = assert.async(2); - - this.server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' } - ], - blogPosts: [ - { id: 1, title: 'Post 1' } - ] + $.ajax({ + method: 'GET', + url: '/posts/2' + }).fail((xhr, textStatus, error) => { + assert.ok(false, 'failed to find custom path'); + done(); + }).done(function(res, status, xhr) { + assert.ok(true); + done(); + }); }); - server.resource('contacts'); - server.resource('blog-posts', { path: '/posts' }); + test('resource generates post shorthand', function(assert) { + let { server } = this; + assert.expect(3); + let done = assert.async(2); + + server.resource('contacts'); + server.resource('blog-posts', { path: '/posts' }); + + $.ajax({ + method: 'POST', + url: '/contacts', + data: JSON.stringify({ + contact: { + name: 'Zelda' + } + }) + }).done((res, status, xhr) => { + assert.equal(xhr.status, 201); + assert.equal(server.db.contacts.length, 1); + done(); + }); - $.ajax({ - method: 'PUT', - url: '/contacts/1', - data: JSON.stringify({ - contact: { - name: 'Zelda' - } - }) - }).done((res, status, xhr) => { - assert.equal(xhr.status, 200); - assert.equal(server.db.contacts[0].name, 'Zelda'); - done(); + $.ajax({ + method: 'POST', + url: '/posts', + data: JSON.stringify({ + blog_post: { + name: 'Post 1' + } + }) + }).fail((xhr, textStatus, error) => { + assert.ok(false, 'failed to find custom path'); + done(); + }).done((res, status, xhr) => { + assert.ok(true); + done(); + }); }); - $.ajax({ - method: 'PUT', - url: '/posts/1', - data: JSON.stringify({ - blog_post: { - name: 'Post 2' - } - }) - }).fail((xhr, textStatus, error) => { - assert.ok(false, 'failed to find custom path'); - done(); - }).done((res, status, xhr) => { - assert.ok(true); - done(); - }); -}); + test('resource generates put shorthand', function(assert) { + let { server } = this; + assert.expect(3); + let done = assert.async(2); -test('resource generates patch shorthand', function(assert) { - let { server } = this; - assert.expect(3); - let done = assert.async(2); - - this.server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' } - ], - blogPosts: [ - { id: 1, title: 'Post 1' } - ] - }); + this.server.db.loadData({ + contacts: [ + { id: 1, name: 'Link' } + ], + blogPosts: [ + { id: 1, title: 'Post 1' } + ] + }); - server.resource('contacts'); - server.resource('blog-posts', { path: '/posts' }); + server.resource('contacts'); + server.resource('blog-posts', { path: '/posts' }); + + $.ajax({ + method: 'PUT', + url: '/contacts/1', + data: JSON.stringify({ + contact: { + name: 'Zelda' + } + }) + }).done((res, status, xhr) => { + assert.equal(xhr.status, 200); + assert.equal(server.db.contacts[0].name, 'Zelda'); + done(); + }); - $.ajax({ - method: 'PATCH', - url: '/contacts/1', - data: JSON.stringify({ - contact: { - name: 'Zelda' - } - }) - }).done((res, status, xhr) => { - assert.equal(xhr.status, 200); - assert.equal(server.db.contacts[0].name, 'Zelda'); - done(); + $.ajax({ + method: 'PUT', + url: '/posts/1', + data: JSON.stringify({ + blog_post: { + name: 'Post 2' + } + }) + }).fail((xhr, textStatus, error) => { + assert.ok(false, 'failed to find custom path'); + done(); + }).done((res, status, xhr) => { + assert.ok(true); + done(); + }); }); - $.ajax({ - method: 'PATCH', - url: '/posts/1', - data: JSON.stringify({ - blog_post: { - name: 'Post 2' - } - }) - }).fail((xhr, textStatus, error) => { - assert.ok(false, 'failed to find custom path'); - done(); - }).done((res, status, xhr) => { - assert.ok(true); - done(); - }); -}); + test('resource generates patch shorthand', function(assert) { + let { server } = this; + assert.expect(3); + let done = assert.async(2); -test('resource generates delete shorthand works', function(assert) { - let { server } = this; - assert.expect(3); - let done = assert.async(2); - - this.server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' } - ], - blogPosts: [ - { id: 1, title: 'Post 1' } - ] - }); + this.server.db.loadData({ + contacts: [ + { id: 1, name: 'Link' } + ], + blogPosts: [ + { id: 1, title: 'Post 1' } + ] + }); - server.resource('contacts'); - server.resource('blog-posts', { path: '/posts' }); + server.resource('contacts'); + server.resource('blog-posts', { path: '/posts' }); + + $.ajax({ + method: 'PATCH', + url: '/contacts/1', + data: JSON.stringify({ + contact: { + name: 'Zelda' + } + }) + }).done((res, status, xhr) => { + assert.equal(xhr.status, 200); + assert.equal(server.db.contacts[0].name, 'Zelda'); + done(); + }); - $.ajax({ - method: 'DELETE', - url: '/contacts/1' - }).done((res, status, xhr) => { - assert.equal(xhr.status, 204); - assert.equal(server.db.contacts.length, 0); - done(); + $.ajax({ + method: 'PATCH', + url: '/posts/1', + data: JSON.stringify({ + blog_post: { + name: 'Post 2' + } + }) + }).fail((xhr, textStatus, error) => { + assert.ok(false, 'failed to find custom path'); + done(); + }).done((res, status, xhr) => { + assert.ok(true); + done(); + }); }); - $.ajax({ - method: 'DELETE', - url: '/posts/1' - }).fail((xhr, textStatus, error) => { - assert.ok(false, 'failed to find custom path'); - done(); - }).done((res, status, xhr) => { - assert.ok(true); - done(); - }); -}); + test('resource generates delete shorthand works', function(assert) { + let { server } = this; + assert.expect(3); + let done = assert.async(2); -test('resource does not accept both :all and :except options', function(assert) { - let { server } = this; + this.server.db.loadData({ + contacts: [ + { id: 1, name: 'Link' } + ], + blogPosts: [ + { id: 1, title: 'Post 1' } + ] + }); - assert.throws(() => { - server.resource('contacts', { only: ['index'], except: ['create'] }); - }, 'cannot use both :only and :except options'); -}); + server.resource('contacts'); + server.resource('blog-posts', { path: '/posts' }); -test('resource generates shorthands which are whitelisted by :only option', function(assert) { - let { server } = this; - assert.expect(2); - let done = assert.async(2); + $.ajax({ + method: 'DELETE', + url: '/contacts/1' + }).done((res, status, xhr) => { + assert.equal(xhr.status, 204); + assert.equal(server.db.contacts.length, 0); + done(); + }); - server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' }, - { id: 2, name: 'Zelda' } - ] + $.ajax({ + method: 'DELETE', + url: '/posts/1' + }).fail((xhr, textStatus, error) => { + assert.ok(false, 'failed to find custom path'); + done(); + }).done((res, status, xhr) => { + assert.ok(true); + done(); + }); }); - server.resource('contacts', { only: ['index'] }); - server.resource('blog-posts', { path: '/posts', only: ['index'] }); - - $.ajax({ - method: 'GET', - url: '/contacts' - }).done((res, status, xhr) => { - assert.equal(xhr.status, 200); - done(); - }); + test('resource does not accept both :all and :except options', function(assert) { + let { server } = this; - $.ajax({ - method: 'GET', - url: '/posts' - }).fail(function() { - assert.ok(false, 'failed to find custom path'); - done(); - }).done((res, status, xhr) => { - assert.equal(xhr.status, 200); - done(); + assert.throws(() => { + server.resource('contacts', { only: ['index'], except: ['create'] }); + }, 'cannot use both :only and :except options'); }); -}); -test('resource does not generate shorthands which are not whitelisted with :only option', function(assert) { - let { server } = this; - assert.expect(5); + test('resource generates shorthands which are whitelisted by :only option', function(assert) { + let { server } = this; + assert.expect(2); + let done = assert.async(2); - server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' } - ] - }); + server.db.loadData({ + contacts: [ + { id: 1, name: 'Link' }, + { id: 2, name: 'Zelda' } + ] + }); - server.resource('contacts', { only: ['index'] }); + server.resource('contacts', { only: ['index'] }); + server.resource('blog-posts', { path: '/posts', only: ['index'] }); - let doneForShow = assert.async(); + $.ajax({ + method: 'GET', + url: '/contacts' + }).done((res, status, xhr) => { + assert.equal(xhr.status, 200); + done(); + }); - $.ajax({ - method: 'GET', - url: '/contacts/1' - }).fail((xhr, textStatus, error) => { - assert.ok(error.message.indexOf("Mirage: Your Ember app tried to GET '/contacts/1'") !== -1); - doneForShow(); + $.ajax({ + method: 'GET', + url: '/posts' + }).fail(function() { + assert.ok(false, 'failed to find custom path'); + done(); + }).done((res, status, xhr) => { + assert.equal(xhr.status, 200); + done(); + }); }); - let doneForCreate = assert.async(); + test('resource does not generate shorthands which are not whitelisted with :only option', function(assert) { + let { server } = this; + assert.expect(5); - $.ajax({ - method: 'POST', - url: '/contacts', - data: JSON.stringify({ - contact: { - name: 'Zelda' - } - }) - }).fail((xhr, textStatus, error) => { - assert.ok(error.message.indexOf("Mirage: Your Ember app tried to POST '/contacts'") !== -1); - doneForCreate(); - }); + server.db.loadData({ + contacts: [ + { id: 1, name: 'Link' } + ] + }); - let doneForPut = assert.async(); + server.resource('contacts', { only: ['index'] }); - $.ajax({ - method: 'PUT', - url: '/contacts/1', - data: JSON.stringify({ - contact: { - name: 'Zelda' - } - }) - }).fail((xhr, textStatus, error) => { - assert.ok(error.message.indexOf("Mirage: Your Ember app tried to PUT '/contacts/1'") !== -1); - doneForPut(); - }); + let doneForShow = assert.async(); - let doneForPatch = assert.async(); + $.ajax({ + method: 'GET', + url: '/contacts/1' + }).fail((xhr, textStatus, error) => { + assert.ok(error.message.indexOf("Mirage: Your Ember app tried to GET '/contacts/1'") !== -1); + doneForShow(); + }); - $.ajax({ - method: 'PATCH', - url: '/contacts/1', - data: JSON.stringify({ - contact: { - name: 'Zelda' - } - }) - }).fail((xhr, textStatus, error) => { - assert.ok(error.message.indexOf("Mirage: Your Ember app tried to PATCH '/contacts/1'") !== -1); - doneForPatch(); - }); + let doneForCreate = assert.async(); + + $.ajax({ + method: 'POST', + url: '/contacts', + data: JSON.stringify({ + contact: { + name: 'Zelda' + } + }) + }).fail((xhr, textStatus, error) => { + assert.ok(error.message.indexOf("Mirage: Your Ember app tried to POST '/contacts'") !== -1); + doneForCreate(); + }); - let doneForDelete = assert.async(); + let doneForPut = assert.async(); + + $.ajax({ + method: 'PUT', + url: '/contacts/1', + data: JSON.stringify({ + contact: { + name: 'Zelda' + } + }) + }).fail((xhr, textStatus, error) => { + assert.ok(error.message.indexOf("Mirage: Your Ember app tried to PUT '/contacts/1'") !== -1); + doneForPut(); + }); - $.ajax({ - method: 'DELETE', - url: '/contacts/1' - }).fail((xhr, textStatus, error) => { - assert.ok(error.message.indexOf("Mirage: Your Ember app tried to DELETE '/contacts/1'") !== -1); - doneForDelete(); - }); -}); + let doneForPatch = assert.async(); + + $.ajax({ + method: 'PATCH', + url: '/contacts/1', + data: JSON.stringify({ + contact: { + name: 'Zelda' + } + }) + }).fail((xhr, textStatus, error) => { + assert.ok(error.message.indexOf("Mirage: Your Ember app tried to PATCH '/contacts/1'") !== -1); + doneForPatch(); + }); -test('resource generates shorthands which are not blacklisted by :except option', function(assert) { - let { server } = this; - assert.expect(2); + let doneForDelete = assert.async(); - server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' } - ] + $.ajax({ + method: 'DELETE', + url: '/contacts/1' + }).fail((xhr, textStatus, error) => { + assert.ok(error.message.indexOf("Mirage: Your Ember app tried to DELETE '/contacts/1'") !== -1); + doneForDelete(); + }); }); - server.resource('contacts', { except: ['create', 'update', 'delete'] }); + test('resource generates shorthands which are not blacklisted by :except option', function(assert) { + let { server } = this; + assert.expect(2); - let doneForIndex = assert.async(); + server.db.loadData({ + contacts: [ + { id: 1, name: 'Link' } + ] + }); - $.ajax({ - method: 'GET', - url: '/contacts' - }).done((res, status, xhr) => { - assert.equal(xhr.status, 200); - doneForIndex(); - }); + server.resource('contacts', { except: ['create', 'update', 'delete'] }); - let doneForShow = assert.async(); + let doneForIndex = assert.async(); - $.ajax({ - method: 'GET', - url: '/contacts' - }).done((res, status, xhr) => { - assert.equal(xhr.status, 200); - doneForShow(); - }); -}); + $.ajax({ + method: 'GET', + url: '/contacts' + }).done((res, status, xhr) => { + assert.equal(xhr.status, 200); + doneForIndex(); + }); -test('resource does not generate shorthands which are blacklisted by :except option', function(assert) { - let { server } = this; - assert.expect(4); + let doneForShow = assert.async(); - server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' } - ] + $.ajax({ + method: 'GET', + url: '/contacts' + }).done((res, status, xhr) => { + assert.equal(xhr.status, 200); + doneForShow(); + }); }); - server.resource('contacts', { except: ['create', 'update', 'delete'] }); - - let doneForCreate = assert.async(); + test('resource does not generate shorthands which are blacklisted by :except option', function(assert) { + let { server } = this; + assert.expect(4); - $.ajax({ - method: 'POST', - url: '/contacts', - data: JSON.stringify({ - contact: { - name: 'Zelda' - } - }) - }).fail((xhr, textStatus, error) => { - assert.ok(error.message.indexOf("Mirage: Your Ember app tried to POST '/contacts'") !== -1); - doneForCreate(); - }); - - let doneForPut = assert.async(); + server.db.loadData({ + contacts: [ + { id: 1, name: 'Link' } + ] + }); - $.ajax({ - method: 'PUT', - url: '/contacts/1', - data: JSON.stringify({ - contact: { - name: 'Zelda' - } - }) - }).fail((xhr, textStatus, error) => { - assert.ok(error.message.indexOf("Mirage: Your Ember app tried to PUT '/contacts/1'") !== -1); - doneForPut(); - }); + server.resource('contacts', { except: ['create', 'update', 'delete'] }); + + let doneForCreate = assert.async(); + + $.ajax({ + method: 'POST', + url: '/contacts', + data: JSON.stringify({ + contact: { + name: 'Zelda' + } + }) + }).fail((xhr, textStatus, error) => { + assert.ok(error.message.indexOf("Mirage: Your Ember app tried to POST '/contacts'") !== -1); + doneForCreate(); + }); - let doneForPatch = assert.async(); + let doneForPut = assert.async(); + + $.ajax({ + method: 'PUT', + url: '/contacts/1', + data: JSON.stringify({ + contact: { + name: 'Zelda' + } + }) + }).fail((xhr, textStatus, error) => { + assert.ok(error.message.indexOf("Mirage: Your Ember app tried to PUT '/contacts/1'") !== -1); + doneForPut(); + }); - $.ajax({ - method: 'PATCH', - url: '/contacts/1', - data: JSON.stringify({ - contact: { - name: 'Zelda' - } - }) - }).fail((xhr, textStatus, error) => { - assert.ok(error.message.indexOf("Mirage: Your Ember app tried to PATCH '/contacts/1'") !== -1); - doneForPatch(); - }); + let doneForPatch = assert.async(); + + $.ajax({ + method: 'PATCH', + url: '/contacts/1', + data: JSON.stringify({ + contact: { + name: 'Zelda' + } + }) + }).fail((xhr, textStatus, error) => { + assert.ok(error.message.indexOf("Mirage: Your Ember app tried to PATCH '/contacts/1'") !== -1); + doneForPatch(); + }); - let doneForDelete = assert.async(); + let doneForDelete = assert.async(); - $.ajax({ - method: 'DELETE', - url: '/contacts/1' - }).fail((xhr, textStatus, error) => { - assert.ok(error.message.indexOf("Mirage: Your Ember app tried to DELETE '/contacts/1'") !== -1); - doneForDelete(); + $.ajax({ + method: 'DELETE', + url: '/contacts/1' + }).fail((xhr, textStatus, error) => { + assert.ok(error.message.indexOf("Mirage: Your Ember app tried to DELETE '/contacts/1'") !== -1); + doneForDelete(); + }); }); }); diff --git a/tests/integration/server/shorthand-sanity-test.js b/tests/integration/server/shorthand-sanity-test.js index 9d7851870..ab1a96b13 100644 --- a/tests/integration/server/shorthand-sanity-test.js +++ b/tests/integration/server/shorthand-sanity-test.js @@ -2,8 +2,8 @@ import {module, test} from 'qunit'; import { Model, ActiveModelSerializer } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; -module('Integration | Server | Shorthand sanity check', { - beforeEach() { +module('Integration | Server | Shorthand sanity check', function(hooks) { + hooks.beforeEach(function() { this.server = new Server({ environment: 'test', models: { @@ -15,131 +15,132 @@ module('Integration | Server | Shorthand sanity check', { }); this.server.timing = 0; this.server.logging = false; - }, - afterEach() { - this.server.shutdown(); - } -}); - -test('a get shorthand works', function(assert) { - assert.expect(2); - let done = assert.async(); - - this.server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' } - ] }); - this.server.get('/contacts'); - - $.ajax({ - method: 'GET', - url: '/contacts' - }).done(function(res, status, xhr) { - assert.equal(xhr.status, 200); - assert.deepEqual(res, { contacts: [{ id: '1', name: 'Link' }] }); - done(); + hooks.afterEach(function() { + this.server.shutdown(); }); -}); -test('a post shorthand works', function(assert) { - let { server } = this; - assert.expect(2); - let done = assert.async(); + test('a get shorthand works', function(assert) { + assert.expect(2); + let done = assert.async(); - server.post('/contacts'); - - $.ajax({ - method: 'POST', - url: '/contacts', - data: JSON.stringify({ - contact: { - name: 'Zelda' - } - }) - }).done((res, status, xhr) => { - assert.equal(xhr.status, 201); - assert.equal(server.db.contacts.length, 1); - done(); - }); -}); + this.server.db.loadData({ + contacts: [ + { id: 1, name: 'Link' } + ] + }); -test('a put shorthand works', function(assert) { - let { server } = this; - assert.expect(2); - let done = assert.async(); + this.server.get('/contacts'); - this.server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' } - ] + $.ajax({ + method: 'GET', + url: '/contacts' + }).done(function(res, status, xhr) { + assert.equal(xhr.status, 200); + assert.deepEqual(res, { contacts: [{ id: '1', name: 'Link' }] }); + done(); + }); }); - server.put('/contacts/:id'); - - $.ajax({ - method: 'PUT', - url: '/contacts/1', - data: JSON.stringify({ - contact: { - name: 'Zelda' - } - }) - }).done((res, status, xhr) => { - assert.equal(xhr.status, 200); - assert.equal(server.db.contacts[0].name, 'Zelda'); - done(); + test('a post shorthand works', function(assert) { + let { server } = this; + assert.expect(2); + let done = assert.async(); + + server.post('/contacts'); + + $.ajax({ + method: 'POST', + url: '/contacts', + data: JSON.stringify({ + contact: { + name: 'Zelda' + } + }) + }).done((res, status, xhr) => { + assert.equal(xhr.status, 201); + assert.equal(server.db.contacts.length, 1); + done(); + }); }); -}); -test('a patch shorthand works', function(assert) { - let { server } = this; - assert.expect(2); - let done = assert.async(); + test('a put shorthand works', function(assert) { + let { server } = this; + assert.expect(2); + let done = assert.async(); - this.server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' } - ] + this.server.db.loadData({ + contacts: [ + { id: 1, name: 'Link' } + ] + }); + + server.put('/contacts/:id'); + + $.ajax({ + method: 'PUT', + url: '/contacts/1', + data: JSON.stringify({ + contact: { + name: 'Zelda' + } + }) + }).done((res, status, xhr) => { + assert.equal(xhr.status, 200); + assert.equal(server.db.contacts[0].name, 'Zelda'); + done(); + }); }); - server.patch('/contacts/:id'); + test('a patch shorthand works', function(assert) { + let { server } = this; + assert.expect(2); + let done = assert.async(); - $.ajax({ - method: 'PATCH', - url: '/contacts/1', - data: JSON.stringify({ - contact: { - name: 'Zelda' - } - }) - }).done((res, status, xhr) => { - assert.equal(xhr.status, 200); - assert.equal(server.db.contacts[0].name, 'Zelda'); - done(); + this.server.db.loadData({ + contacts: [ + { id: 1, name: 'Link' } + ] + }); + + server.patch('/contacts/:id'); + + $.ajax({ + method: 'PATCH', + url: '/contacts/1', + data: JSON.stringify({ + contact: { + name: 'Zelda' + } + }) + }).done((res, status, xhr) => { + assert.equal(xhr.status, 200); + assert.equal(server.db.contacts[0].name, 'Zelda'); + done(); + }); }); -}); -test('a delete shorthand works', function(assert) { - let { server } = this; - assert.expect(2); - let done = assert.async(); + test('a delete shorthand works', function(assert) { + let { server } = this; + assert.expect(2); + let done = assert.async(); - this.server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' } - ] - }); + this.server.db.loadData({ + contacts: [ + { id: 1, name: 'Link' } + ] + }); - server.del('/contacts/:id'); + server.del('/contacts/:id'); - $.ajax({ - method: 'DELETE', - url: '/contacts/1' - }).done((res, status, xhr) => { - assert.equal(xhr.status, 204); - assert.equal(server.db.contacts.length, 0); - done(); + $.ajax({ + method: 'DELETE', + url: '/contacts/1' + }).done((res, status, xhr) => { + assert.equal(xhr.status, 204); + assert.equal(server.db.contacts.length, 0); + done(); + }); }); }); diff --git a/tests/unit/collection-test.js b/tests/unit/collection-test.js index 7cf5e8bde..48a6333ac 100644 --- a/tests/unit/collection-test.js +++ b/tests/unit/collection-test.js @@ -1,64 +1,64 @@ import Collection from 'ember-cli-mirage/orm/collection'; import {module, test} from 'qunit'; -module('Unit | Collection'); +module('Unit | Collection', function() { + test('it can be instantiated', function(assert) { + let collection = new Collection('plant'); -test('it can be instantiated', function(assert) { - let collection = new Collection('plant'); + assert.ok(collection); + }); - assert.ok(collection); -}); + test('it cannot be instantiated without a modelName', function(assert) { + assert.throws(() => { + new Collection(); + }, /must pass a `modelName`/); + }); -test('it cannot be instantiated without a modelName', function(assert) { - assert.throws(() => { - new Collection(); - }, /must pass a `modelName`/); -}); + test('it knows its modelname', function(assert) { + let collection = new Collection('author'); -test('it knows its modelname', function(assert) { - let collection = new Collection('author'); + assert.equal(collection.modelName, 'author'); + }); - assert.equal(collection.modelName, 'author'); -}); + test('it can be instantiated with an array of models', function(assert) { + let models = [{ id: 1 }, { id: 2 }, { id: 3 }]; + let collection = new Collection('author', models); -test('it can be instantiated with an array of models', function(assert) { - let models = [{ id: 1 }, { id: 2 }, { id: 3 }]; - let collection = new Collection('author', models); + assert.ok(collection); + }); - assert.ok(collection); -}); + test('#models returns the underlying array', function(assert) { + let models = [{ id: 1 }, { id: 2 }, { id: 3 }]; + let collection = new Collection('author', models); -test('#models returns the underlying array', function(assert) { - let models = [{ id: 1 }, { id: 2 }, { id: 3 }]; - let collection = new Collection('author', models); + assert.deepEqual(collection.models, models); + }); - assert.deepEqual(collection.models, models); -}); + test('#length returns the number of elements', function(assert) { + let models = [{ id: 1 }, { id: 2 }]; + let collection = new Collection('post', models); -test('#length returns the number of elements', function(assert) { - let models = [{ id: 1 }, { id: 2 }]; - let collection = new Collection('post', models); + assert.equal(collection.length, 2); - assert.equal(collection.length, 2); + collection.models = [{ id: 1 }]; + assert.equal(collection.length, 1); + }); - collection.models = [{ id: 1 }]; - assert.equal(collection.length, 1); + // test('collection.filter returns collection instance', function(assert) { + // let collection = new Collection('plant'); + // let filteredCollection = collection.filter(Boolean); + // assert.ok(filteredCollection instanceof Collection); + // assert.equal(filteredCollection.modelName, 'plant'); + // }); + // + // test('collection.mergeCollection works', function(assert) { + // let collection1 = new Collection('plant', { name: 'chrerry' }, { name: 'uchreaflier' }); + // let collection2 = new Collection('plant', { name: 'vlip' }); + // assert.equal(collection1.length, 2); + // assert.equal(collection2.length, 1); + // collection2.mergeCollection(collection1); + // assert.equal(collection2.length, 3); + // assert.equal(collection2.modelName, 'plant'); + // }); + // }); - -// test('collection.filter returns collection instance', function(assert) { -// let collection = new Collection('plant'); -// let filteredCollection = collection.filter(Boolean); -// assert.ok(filteredCollection instanceof Collection); -// assert.equal(filteredCollection.modelName, 'plant'); -// }); -// -// test('collection.mergeCollection works', function(assert) { -// let collection1 = new Collection('plant', { name: 'chrerry' }, { name: 'uchreaflier' }); -// let collection2 = new Collection('plant', { name: 'vlip' }); -// assert.equal(collection1.length, 2); -// assert.equal(collection2.length, 1); -// collection2.mergeCollection(collection1); -// assert.equal(collection2.length, 3); -// assert.equal(collection2.modelName, 'plant'); -// }); -// diff --git a/tests/unit/db-test.js b/tests/unit/db-test.js index eff4274df..d612c7c2f 100644 --- a/tests/unit/db-test.js +++ b/tests/unit/db-test.js @@ -4,230 +4,234 @@ import DefaultIdentityManager from 'ember-cli-mirage/identity-manager'; import {module, test} from 'qunit'; let db; -module('Unit | Db'); -test('it can be instantiated', function(assert) { - db = new Db(); - assert.ok(db); -}); - -test('it can load data on instantiation', function(assert) { - db = new Db({ - users: [{ id: 1, name: 'Link' }], - addresses: [{ id: 1, name: '123 Hyrule Way' }, { id: 2, name: 'Lorem ipsum' }] +module('Unit | Db', function() { + test('it can be instantiated', function(assert) { + db = new Db(); + assert.ok(db); }); - assert.equal(db.users.length, 1); - assert.equal(db.addresses.length, 2); -}); + test('it can load data on instantiation', function(assert) { + db = new Db({ + users: [{ id: 1, name: 'Link' }], + addresses: [{ id: 1, name: '123 Hyrule Way' }, { id: 2, name: 'Lorem ipsum' }] + }); -test('it can empty its data', function(assert) { - db = new Db({ - users: [{ id: 1, name: 'Link' }], - addresses: [{ id: 1, name: '123 Hyrule Way' }, { id: 2, name: 'Lorem ipsum' }] + assert.equal(db.users.length, 1); + assert.equal(db.addresses.length, 2); }); - db.emptyData(); + test('it can empty its data', function(assert) { + db = new Db({ + users: [{ id: 1, name: 'Link' }], + addresses: [{ id: 1, name: '123 Hyrule Way' }, { id: 2, name: 'Lorem ipsum' }] + }); + + db.emptyData(); - assert.equal(db.users.length, 0); - assert.equal(db.addresses.length, 0); + assert.equal(db.users.length, 0); + assert.equal(db.addresses.length, 0); + }); }); -module('Unit | Db #createCollection', { - beforeEach() { +module('Unit | Db #createCollection', function(hooks) { + hooks.beforeEach(function() { db = new Db(); - }, - afterEach() { + }); + + hooks.afterEach(function() { db.emptyData(); - } -}); + }); -test('it can create an empty collection', function(assert) { - db.createCollection('contacts'); + test('it can create an empty collection', function(assert) { + db.createCollection('contacts'); - assert.ok(db.contacts); -}); + assert.ok(db.contacts); + }); -test('it can create many collections', function(assert) { - db.createCollections('contacts', 'addresses'); + test('it can create many collections', function(assert) { + db.createCollections('contacts', 'addresses'); - assert.ok(db.contacts); - assert.ok(db.addresses); + assert.ok(db.contacts); + assert.ok(db.addresses); + }); }); -module('Unit | Db #loadData', { - beforeEach() { +module('Unit | Db #loadData', function(hooks) { + hooks.beforeEach(function() { db = new Db(); - }, - afterEach() { + }); + + hooks.afterEach(function() { db.emptyData(); - } -}); + }); -test('it can load an object of data', function(assert) { - let data = { - contacts: [{ id: '1', name: 'Link' }], - addresses: [{ id: '1', name: '123 Hyrule Way' }] - }; - db.loadData(data); + test('it can load an object of data', function(assert) { + let data = { + contacts: [{ id: '1', name: 'Link' }], + addresses: [{ id: '1', name: '123 Hyrule Way' }] + }; + db.loadData(data); - assert.deepEqual(db.contacts, data.contacts); - assert.deepEqual(db.addresses, data.addresses); -}); + assert.deepEqual(db.contacts, data.contacts); + assert.deepEqual(db.addresses, data.addresses); + }); -test("it clones all data so nothing is passed by reference", function(assert) { - let data = { - contacts: [{ id: '1', someArray: ['foo', 'bar'] }] - }; - db.loadData(data); + test("it clones all data so nothing is passed by reference", function(assert) { + let data = { + contacts: [{ id: '1', someArray: ['foo', 'bar'] }] + }; + db.loadData(data); - let contactRecord = db.contacts.find(1); - contactRecord.someArray.push('baz'); + let contactRecord = db.contacts.find(1); + contactRecord.someArray.push('baz'); - assert.equal(contactRecord.someArray.length, 3); - assert.equal(data.contacts[0].someArray.length, 2); + assert.equal(contactRecord.someArray.length, 3); + assert.equal(data.contacts[0].someArray.length, 2); + }); }); -module('Unit | Db #all', { - beforeEach() { +module('Unit | Db #all', function(hooks) { + hooks.beforeEach(function() { this.data = { contacts: [{ id: '1', name: 'Link' }], addresses: [{ id: '1', name: '123 Hyrule Way' }] }; db = new Db(this.data); - }, - afterEach() { + }); + + hooks.afterEach(function() { db.emptyData(); - } -}); + }); -test('it can return a collection', function(assert) { - assert.deepEqual(db.contacts, this.data.contacts); - assert.deepEqual(db.addresses, this.data.addresses); -}); + test('it can return a collection', function(assert) { + assert.deepEqual(db.contacts, this.data.contacts); + assert.deepEqual(db.addresses, this.data.addresses); + }); -test('the collection is a copy', function(assert) { - let { contacts } = db; + test('the collection is a copy', function(assert) { + let { contacts } = db; - assert.deepEqual(contacts, this.data.contacts); - contacts[0].name = 'Zelda'; + assert.deepEqual(contacts, this.data.contacts); + contacts[0].name = 'Zelda'; - assert.deepEqual(db.contacts, this.data.contacts); + assert.deepEqual(db.contacts, this.data.contacts); + }); }); -module('Unit | Db #insert', { - beforeEach() { +module('Unit | Db #insert', function(hooks) { + hooks.beforeEach(function() { db = new Db(); db.createCollection('contacts'); - }, + }); - afterEach() { + hooks.afterEach(function() { db.emptyData(); - } -}); + }); -test('it inserts an object and returns it', function(assert) { - let link = db.contacts.insert({ name: 'Link' }); - let expectedRecord = { - id: '1', - name: 'Link' - }; + test('it inserts an object and returns it', function(assert) { + let link = db.contacts.insert({ name: 'Link' }); + let expectedRecord = { + id: '1', + name: 'Link' + }; - assert.deepEqual(db.contacts, [expectedRecord]); - assert.deepEqual(link, expectedRecord); -}); + assert.deepEqual(db.contacts, [expectedRecord]); + assert.deepEqual(link, expectedRecord); + }); -test('it returns a copy', function(assert) { - let link = db.contacts.insert({ name: 'Link' }); - let expectedRecord = { - id: '1', - name: 'Link' - }; + test('it returns a copy', function(assert) { + let link = db.contacts.insert({ name: 'Link' }); + let expectedRecord = { + id: '1', + name: 'Link' + }; - assert.deepEqual(link, expectedRecord); + assert.deepEqual(link, expectedRecord); - link.name = 'Young link'; + link.name = 'Young link'; - assert.deepEqual(db.contacts.find(1), expectedRecord); -}); + assert.deepEqual(db.contacts.find(1), expectedRecord); + }); -test('it can insert objects sequentially', function(assert) { - db.contacts.insert({ name: 'Link' }); - db.contacts.insert({ name: 'Ganon' }); + test('it can insert objects sequentially', function(assert) { + db.contacts.insert({ name: 'Link' }); + db.contacts.insert({ name: 'Ganon' }); - let records = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Ganon' } - ]; + let records = [ + { id: '1', name: 'Link' }, + { id: '2', name: 'Ganon' } + ]; - assert.deepEqual(db.contacts, records); -}); + assert.deepEqual(db.contacts, records); + }); -test('it does not add an id if present', function(assert) { - let attrs = { id: '5', name: 'Link' }; + test('it does not add an id if present', function(assert) { + let attrs = { id: '5', name: 'Link' }; - db.contacts.insert(attrs); + db.contacts.insert(attrs); - assert.deepEqual(db.contacts, [attrs]); -}); + assert.deepEqual(db.contacts, [attrs]); + }); -test('it can insert an array and return it', function(assert) { - db.contacts.insert({ name: 'Link' }); + test('it can insert an array and return it', function(assert) { + db.contacts.insert({ name: 'Link' }); - let contacts = db.contacts.insert([{ name: 'Zelda' }, { name: 'Ganon' }]); + let contacts = db.contacts.insert([{ name: 'Zelda' }, { name: 'Ganon' }]); - assert.deepEqual(db.contacts, [{ id: '1', name: 'Link' }, { id: '2', name: 'Zelda' }, { id: '3', name: 'Ganon' }]); - assert.deepEqual(contacts, [{ id: '2', name: 'Zelda' }, { id: '3', name: 'Ganon' }]); -}); - -test('it does not add ids to array data if present', function(assert) { - db.contacts.insert([{ id: 2, name: 'Link' }, { id: 1, name: 'Ganon' }]); + assert.deepEqual(db.contacts, [{ id: '1', name: 'Link' }, { id: '2', name: 'Zelda' }, { id: '3', name: 'Ganon' }]); + assert.deepEqual(contacts, [{ id: '2', name: 'Zelda' }, { id: '3', name: 'Ganon' }]); + }); - assert.deepEqual(db.contacts, [{ id: '1', name: 'Ganon' }, { id: '2', name: 'Link' }]); -}); + test('it does not add ids to array data if present', function(assert) { + db.contacts.insert([{ id: 2, name: 'Link' }, { id: 1, name: 'Ganon' }]); -test('it can insert a record with an id of 0', function(assert) { - db.contacts.insert({ id: 0, name: 'Link' }); + assert.deepEqual(db.contacts, [{ id: '1', name: 'Ganon' }, { id: '2', name: 'Link' }]); + }); - assert.deepEqual(db.contacts, [{ id: '0', name: 'Link' }]); -}); + test('it can insert a record with an id of 0', function(assert) { + db.contacts.insert({ id: 0, name: 'Link' }); -test('IDs increment correctly, even after a record is removed', function(assert) { - let records = db.contacts.insert([{ name: 'Link' }, { name: 'Ganon' }]); + assert.deepEqual(db.contacts, [{ id: '0', name: 'Link' }]); + }); - db.contacts.remove(records[0]); + test('IDs increment correctly, even after a record is removed', function(assert) { + let records = db.contacts.insert([{ name: 'Link' }, { name: 'Ganon' }]); - let record = db.contacts.insert({ name: 'Zelda' }); + db.contacts.remove(records[0]); - assert.equal(record.id, 3); -}); + let record = db.contacts.insert({ name: 'Zelda' }); -test('inserting a record with an already used ID throws an error', function(assert) { - assert.expect(2); + assert.equal(record.id, 3); + }); - db.contacts.insert({ id: 1, name: 'Duncan McCleod' }); + test('inserting a record with an already used ID throws an error', function(assert) { + assert.expect(2); - assert.throws(function() { db.contacts.insert({ id: 1, name: 'Duncan McCleod' }); - }); - db.contacts.insert({ id: 'atp', name: 'Adenosine Triphosphate' }); + assert.throws(function() { + db.contacts.insert({ id: 1, name: 'Duncan McCleod' }); + }); - assert.throws(function() { db.contacts.insert({ id: 'atp', name: 'Adenosine Triphosphate' }); + + assert.throws(function() { + db.contacts.insert({ id: 'atp', name: 'Adenosine Triphosphate' }); + }); }); -}); -test('tracks the correct IDs being used', function(assert) { - db.contacts.insert({ name: 'Vegeta' }); - db.contacts.insert({ id: 2, name: 'Krilli' }); + test('tracks the correct IDs being used', function(assert) { + db.contacts.insert({ name: 'Vegeta' }); + db.contacts.insert({ id: 2, name: 'Krilli' }); - assert.equal(db.contacts.length, 2); + assert.equal(db.contacts.length, 2); + }); }); -module('Unit | Db #findBy', { - beforeEach() { +module('Unit | Db #findBy', function(hooks) { + hooks.beforeEach(function() { db = new Db(); db.createCollection('contacts'); db.contacts.insert([ @@ -237,46 +241,47 @@ module('Unit | Db #findBy', { { name: 'Epona', race: 'Centaur' }, { id: 'abc', name: 'Ganon' } ]); - }, - afterEach() { + }); + + hooks.afterEach(function() { db.emptyData(); - } -}); + }); -test('returns a record that matches the given name', function(assert) { - let contact = db.contacts.findBy({ 'name': 'Link' }); + test('returns a record that matches the given name', function(assert) { + let contact = db.contacts.findBy({ 'name': 'Link' }); - assert.deepEqual(contact, { id: '2', name: 'Link' }); -}); + assert.deepEqual(contact, { id: '2', name: 'Link' }); + }); -test('returns a copy not a reference', function(assert) { - let contact = db.contacts.findBy({ 'name': 'Link' }); + test('returns a copy not a reference', function(assert) { + let contact = db.contacts.findBy({ 'name': 'Link' }); - contact.name = 'blah'; + contact.name = 'blah'; - assert.deepEqual(db.contacts.find(2), { id: '2', name: 'Link' }); -}); + assert.deepEqual(db.contacts.find(2), { id: '2', name: 'Link' }); + }); -test('returns the first record matching the criteria', function(assert) { - let contact = db.contacts.findBy({ 'name': 'Epona' }); + test('returns the first record matching the criteria', function(assert) { + let contact = db.contacts.findBy({ 'name': 'Epona' }); - assert.deepEqual(contact, { id: '3', name: 'Epona', race: 'Horse' }); -}); + assert.deepEqual(contact, { id: '3', name: 'Epona', race: 'Horse' }); + }); -test('returns a record only matching multiple criteria', function(assert) { - let contact = db.contacts.findBy({ 'name': 'Epona', 'race': 'Centaur' }); + test('returns a record only matching multiple criteria', function(assert) { + let contact = db.contacts.findBy({ 'name': 'Epona', 'race': 'Centaur' }); - assert.deepEqual(contact, { id: '4', name: 'Epona', race: 'Centaur' }); -}); + assert.deepEqual(contact, { id: '4', name: 'Epona', race: 'Centaur' }); + }); -test('returns null when no record is found', function(assert) { - let contact = db.contacts.findBy({ 'name': 'Fi' }); + test('returns null when no record is found', function(assert) { + let contact = db.contacts.findBy({ 'name': 'Fi' }); - assert.equal(contact, null); + assert.equal(contact, null); + }); }); -module('Unit | Db #find', { - beforeEach() { +module('Unit | Db #find', function(hooks) { + hooks.beforeEach(function() { db = new Db(); db.createCollection('contacts'); db.contacts.insert([ @@ -284,64 +289,65 @@ module('Unit | Db #find', { { name: 'Link' }, { id: 'abc', name: 'Ganon' } ]); - }, - afterEach() { + }); + + hooks.afterEach(function() { db.emptyData(); - } -}); + }); -test('returns a record that matches a numerical id', function(assert) { - let contact = db.contacts.find(2); + test('returns a record that matches a numerical id', function(assert) { + let contact = db.contacts.find(2); - assert.deepEqual(contact, { id: '2', name: 'Link' }); -}); + assert.deepEqual(contact, { id: '2', name: 'Link' }); + }); -test('returns a copy not a reference', function(assert) { - let contact = db.contacts.find(2); + test('returns a copy not a reference', function(assert) { + let contact = db.contacts.find(2); - assert.deepEqual(contact, { id: '2', name: 'Link' }); + assert.deepEqual(contact, { id: '2', name: 'Link' }); - contact.name = 'blah'; + contact.name = 'blah'; - assert.deepEqual(db.contacts.find(2), { id: '2', name: 'Link' }); -}); + assert.deepEqual(db.contacts.find(2), { id: '2', name: 'Link' }); + }); -test('returns a record that matches a string id', function(assert) { - let contact = db.contacts.find('abc'); + test('returns a record that matches a string id', function(assert) { + let contact = db.contacts.find('abc'); - assert.deepEqual(contact, { id: 'abc', name: 'Ganon' }); -}); + assert.deepEqual(contact, { id: 'abc', name: 'Ganon' }); + }); -test('returns multiple record that matches an array of ids', function(assert) { - let contacts = db.contacts.find([1, 2]); + test('returns multiple record that matches an array of ids', function(assert) { + let contacts = db.contacts.find([1, 2]); - assert.deepEqual(contacts, [{ id: '1', name: 'Zelda' }, { id: '2', name: 'Link' }]); -}); - -test('returns a record whose id is a string that start with numbers', function(assert) { - db.contacts.insert({ - id: '123-456', - name: 'Epona' + assert.deepEqual(contacts, [{ id: '1', name: 'Zelda' }, { id: '2', name: 'Link' }]); }); - let contact = db.contacts.find('123-456'); - assert.deepEqual(contact, { id: '123-456', name: 'Epona' }); -}); + test('returns a record whose id is a string that start with numbers', function(assert) { + db.contacts.insert({ + id: '123-456', + name: 'Epona' + }); + + let contact = db.contacts.find('123-456'); + assert.deepEqual(contact, { id: '123-456', name: 'Epona' }); + }); -test('returns multiple record that match an array of ids', function(assert) { - let contacts = db.contacts.find([1, 2]); + test('returns multiple record that match an array of ids', function(assert) { + let contacts = db.contacts.find([1, 2]); - assert.deepEqual(contacts, [{ id: '1', name: 'Zelda' }, { id: '2', name: 'Link' }]); -}); + assert.deepEqual(contacts, [{ id: '1', name: 'Zelda' }, { id: '2', name: 'Link' }]); + }); -test('returns an empty array when it doesnt find multiple ids', function(assert) { - let contacts = db.contacts.find([99, 100]); + test('returns an empty array when it doesnt find multiple ids', function(assert) { + let contacts = db.contacts.find([99, 100]); - assert.deepEqual(contacts, []); + assert.deepEqual(contacts, []); + }); }); -module('Unit | Db #where', { - beforeEach() { +module('Unit | Db #where', function(hooks) { + hooks.beforeEach(function() { db = new Db(); db.createCollection('contacts'); db.contacts.insert([ @@ -349,60 +355,61 @@ module('Unit | Db #where', { { name: 'Zelda', evil: false, age: 17 }, { name: 'Ganon', evil: true, age: 45 } ]); - }, - afterEach() { - db.emptyData(); - } -}); + }); -test('returns an array of records that match the query', function(assert) { - let result = db.contacts.where({ evil: true }); + hooks.afterEach(function() { + db.emptyData(); + }); - assert.deepEqual(result, [ - { id: '3', name: 'Ganon', evil: true, age: 45 } - ]); -}); + test('returns an array of records that match the query', function(assert) { + let result = db.contacts.where({ evil: true }); -test('it coerces query params to strings', function(assert) { - let result = db.contacts.where({ age: '45' }); + assert.deepEqual(result, [ + { id: '3', name: 'Ganon', evil: true, age: 45 } + ]); + }); - assert.deepEqual(result, [ - { id: '3', name: 'Ganon', evil: true, age: 45 } - ]); -}); + test('it coerces query params to strings', function(assert) { + let result = db.contacts.where({ age: '45' }); -test('returns a copy, not a referecne', function(assert) { - let result = db.contacts.where({ evil: true }); + assert.deepEqual(result, [ + { id: '3', name: 'Ganon', evil: true, age: 45 } + ]); + }); - assert.deepEqual(result, [ - { id: '3', name: 'Ganon', evil: true, age: 45 } - ]); + test('returns a copy, not a referecne', function(assert) { + let result = db.contacts.where({ evil: true }); - result[0].evil = false; + assert.deepEqual(result, [ + { id: '3', name: 'Ganon', evil: true, age: 45 } + ]); - assert.deepEqual(db.contacts.where({ evil: true }), [ - { id: '3', name: 'Ganon', evil: true, age: 45 } - ]); -}); + result[0].evil = false; -test('returns an empty array if no records match the query', function(assert) { - let result = db.contacts.where({ name: 'Link', evil: true }); + assert.deepEqual(db.contacts.where({ evil: true }), [ + { id: '3', name: 'Ganon', evil: true, age: 45 } + ]); + }); - assert.deepEqual(result, []); -}); + test('returns an empty array if no records match the query', function(assert) { + let result = db.contacts.where({ name: 'Link', evil: true }); -test('accepts a filter function', function(assert) { - let result = db.contacts.where(function(record) { - return record.age === 45; + assert.deepEqual(result, []); }); - assert.deepEqual(result, [ - { id: '3', name: 'Ganon', evil: true, age: 45 } - ]); + test('accepts a filter function', function(assert) { + let result = db.contacts.where(function(record) { + return record.age === 45; + }); + + assert.deepEqual(result, [ + { id: '3', name: 'Ganon', evil: true, age: 45 } + ]); + }); }); -module('Unit | Db #update', { - beforeEach() { +module('Unit | Db #update', function(hooks) { + hooks.beforeEach(function() { db = new Db(); db.createCollection('contacts'); db.contacts.insert([ @@ -411,100 +418,101 @@ module('Unit | Db #update', { { name: 'Ganon', evil: true }, { id: '123-abc', name: 'Epona', evil: false } ]); - }, - afterEach() { + }); + + hooks.afterEach(function() { db.emptyData(); - } -}); + }); -test('it can update the whole collection', function(assert) { - db.contacts.update({ name: 'Sam', evil: false }); - - let actualContacts = db.contacts; - - let expectedContacts = [ - { id: '123-abc', name: 'Sam', evil: false }, - { id: '1', name: 'Sam', evil: false }, - { id: '2', name: 'Sam', evil: false }, - { id: '3', name: 'Sam', evil: false } - ]; - - assert.deepEqual( - actualContacts, expectedContacts, [actualContacts.map(function(r) { - return r.id; - }).join(','), expectedContacts.map(function(r) { - return r.id; - }).join(',')].join(';') - ); -}); + test('it can update the whole collection', function(assert) { + db.contacts.update({ name: 'Sam', evil: false }); + + let actualContacts = db.contacts; + + let expectedContacts = [ + { id: '123-abc', name: 'Sam', evil: false }, + { id: '1', name: 'Sam', evil: false }, + { id: '2', name: 'Sam', evil: false }, + { id: '3', name: 'Sam', evil: false } + ]; + + assert.deepEqual( + actualContacts, expectedContacts, [actualContacts.map(function(r) { + return r.id; + }).join(','), expectedContacts.map(function(r) { + return r.id; + }).join(',')].join(';') + ); + }); -test('it can update a record by id', function(assert) { - db.contacts.update(3, { name: 'Ganondorf', evil: false }); - let ganon = db.contacts.find(3); + test('it can update a record by id', function(assert) { + db.contacts.update(3, { name: 'Ganondorf', evil: false }); + let ganon = db.contacts.find(3); - assert.deepEqual(ganon, { id: '3', name: 'Ganondorf', evil: false }); -}); + assert.deepEqual(ganon, { id: '3', name: 'Ganondorf', evil: false }); + }); -test('it can update a record by id when the id is a string', function(assert) { - db.contacts.update('123-abc', { evil: true }); - let epona = db.contacts.find('123-abc'); + test('it can update a record by id when the id is a string', function(assert) { + db.contacts.update('123-abc', { evil: true }); + let epona = db.contacts.find('123-abc'); - assert.deepEqual(epona, { id: '123-abc', name: 'Epona', evil: true }); -}); + assert.deepEqual(epona, { id: '123-abc', name: 'Epona', evil: true }); + }); -test('it can update multiple records by ids', function(assert) { - db.contacts.update([1, 2], { evil: true }); - let link = db.contacts.find(1); - let zelda = db.contacts.find(2); + test('it can update multiple records by ids', function(assert) { + db.contacts.update([1, 2], { evil: true }); + let link = db.contacts.find(1); + let zelda = db.contacts.find(2); - assert.equal(link.evil, true); - assert.equal(zelda.evil, true); -}); + assert.equal(link.evil, true); + assert.equal(zelda.evil, true); + }); -test('it can update records by query', function(assert) { - db.contacts.update({ evil: false }, { name: 'Sam' }); + test('it can update records by query', function(assert) { + db.contacts.update({ evil: false }, { name: 'Sam' }); - assert.deepEqual(db.contacts, [ - { id: '123-abc', name: 'Sam', evil: false }, - { id: '1', name: 'Sam', evil: false }, - { id: '2', name: 'Sam', evil: false }, - { id: '3', name: 'Ganon', evil: true } - ]); -}); + assert.deepEqual(db.contacts, [ + { id: '123-abc', name: 'Sam', evil: false }, + { id: '1', name: 'Sam', evil: false }, + { id: '2', name: 'Sam', evil: false }, + { id: '3', name: 'Ganon', evil: true } + ]); + }); -test('updating a single record returns that record', function(assert) { - let ganon = db.contacts.update(3, { name: 'Ganondorf' }); - assert.deepEqual(ganon, { id: '3', name: 'Ganondorf', evil: true }); -}); + test('updating a single record returns that record', function(assert) { + let ganon = db.contacts.update(3, { name: 'Ganondorf' }); + assert.deepEqual(ganon, { id: '3', name: 'Ganondorf', evil: true }); + }); -test('updating a collection returns the updated records', function(assert) { - let characters = db.contacts.update({ evil: true }); - assert.deepEqual(characters, [ - { id: '123-abc', name: 'Epona', evil: true }, - { id: '1', name: 'Link', evil: true }, - { id: '2', name: 'Zelda', evil: true } - ]); -}); + test('updating a collection returns the updated records', function(assert) { + let characters = db.contacts.update({ evil: true }); + assert.deepEqual(characters, [ + { id: '123-abc', name: 'Epona', evil: true }, + { id: '1', name: 'Link', evil: true }, + { id: '2', name: 'Zelda', evil: true } + ]); + }); -test('updating multiple records returns the updated records', function(assert) { - let characters = db.contacts.update({ evil: false }, { evil: true }); - assert.deepEqual(characters, [ - { id: '123-abc', name: 'Epona', evil: true }, - { id: '1', name: 'Link', evil: true }, - { id: '2', name: 'Zelda', evil: true } - ]); -}); + test('updating multiple records returns the updated records', function(assert) { + let characters = db.contacts.update({ evil: false }, { evil: true }); + assert.deepEqual(characters, [ + { id: '123-abc', name: 'Epona', evil: true }, + { id: '1', name: 'Link', evil: true }, + { id: '2', name: 'Zelda', evil: true } + ]); + }); -test('throws when updating an ID is attempted', function(assert) { - assert.expect(1); + test('throws when updating an ID is attempted', function(assert) { + assert.expect(1); - assert.throws(function() { - db.contacts.update(1, { id: 3 }); + assert.throws(function() { + db.contacts.update(1, { id: 3 }); + }); }); }); -module('Unit | Db #remove', { - beforeEach() { +module('Unit | Db #remove', function(hooks) { + hooks.beforeEach(function() { db = new Db(); db.createCollection('contacts'); db.contacts.insert([ @@ -513,68 +521,68 @@ module('Unit | Db #remove', { { name: 'Ganon', evil: true }, { id: '123-abc', name: 'Epona', evil: false } ]); - }, + }); - afterEach() { + hooks.afterEach(function() { db.emptyData(); - } -}); + }); -test('it can remove an entire collection', function(assert) { - db.contacts.remove(); + test('it can remove an entire collection', function(assert) { + db.contacts.remove(); - assert.deepEqual(db.contacts, []); -}); + assert.deepEqual(db.contacts, []); + }); -test('it can remove a single record by id', function(assert) { - db.contacts.remove(1); + test('it can remove a single record by id', function(assert) { + db.contacts.remove(1); - assert.deepEqual(db.contacts, [ - { id: '123-abc', name: 'Epona', evil: false }, - { id: '2', name: 'Zelda', evil: false }, - { id: '3', name: 'Ganon', evil: true } - ]); -}); + assert.deepEqual(db.contacts, [ + { id: '123-abc', name: 'Epona', evil: false }, + { id: '2', name: 'Zelda', evil: false }, + { id: '3', name: 'Ganon', evil: true } + ]); + }); -test('it can remove a single record when the id is a string', function(assert) { - db.contacts.remove('123-abc'); + test('it can remove a single record when the id is a string', function(assert) { + db.contacts.remove('123-abc'); - assert.deepEqual(db.contacts, [ - { id: '1', name: 'Link', evil: false }, - { id: '2', name: 'Zelda', evil: false }, - { id: '3', name: 'Ganon', evil: true } - ]); -}); + assert.deepEqual(db.contacts, [ + { id: '1', name: 'Link', evil: false }, + { id: '2', name: 'Zelda', evil: false }, + { id: '3', name: 'Ganon', evil: true } + ]); + }); -test('it can remove multiple records by ids', function(assert) { - db.contacts.remove([1, 2]); + test('it can remove multiple records by ids', function(assert) { + db.contacts.remove([1, 2]); - assert.deepEqual(db.contacts, [ - { id: '123-abc', name: 'Epona', evil: false }, - { id: '3', name: 'Ganon', evil: true } - ]); -}); + assert.deepEqual(db.contacts, [ + { id: '123-abc', name: 'Epona', evil: false }, + { id: '3', name: 'Ganon', evil: true } + ]); + }); -test('it can remove multiple records by query', function(assert) { - db.contacts.remove({ evil: false }); + test('it can remove multiple records by query', function(assert) { + db.contacts.remove({ evil: false }); - assert.deepEqual(db.contacts, [ - { id: '3', name: 'Ganon', evil: true } - ]); -}); + assert.deepEqual(db.contacts, [ + { id: '3', name: 'Ganon', evil: true } + ]); + }); -test('it can add a record after removing all records', function(assert) { - db.contacts.remove(); - db.contacts.insert({ name: 'Foo' }); + test('it can add a record after removing all records', function(assert) { + db.contacts.remove(); + db.contacts.insert({ name: 'Foo' }); - assert.equal(db.contacts.length, 1); - assert.deepEqual(db.contacts, [ - { id: '1', name: 'Foo' } - ]); + assert.equal(db.contacts.length, 1); + assert.deepEqual(db.contacts, [ + { id: '1', name: 'Foo' } + ]); + }); }); -module('Unit | Db #firstOrCreate', { - beforeEach() { +module('Unit | Db #firstOrCreate', function(hooks) { + hooks.beforeEach(function() { db = new Db(); db.createCollection('contacts'); db.contacts.insert([ @@ -582,68 +590,71 @@ module('Unit | Db #firstOrCreate', { { id: 2, name: 'Zelda', evil: false }, { id: 3, name: 'Ganon', evil: true } ]); - }, + }); - afterEach() { + hooks.afterEach(function() { db.emptyData(); - } -}); - -test('it can find the first record available from the query', function(assert) { - let record = db.contacts.firstOrCreate({ name: 'Link' }); - - assert.deepEqual(record, { id: '1', name: 'Link', evil: false }); -}); - -test('it creates a new record from query + attrs if none found', function(assert) { - let record = db.contacts.firstOrCreate({ name: 'Mario' }, { evil: false }); - - assert.equal(record.name, 'Mario'); - assert.equal(record.evil, false); - assert.ok(record.id); -}); + }); -test('does not require attrs', function(assert) { - let record = db.contacts.firstOrCreate({ name: 'Luigi' }); + test('it can find the first record available from the query', function(assert) { + let record = db.contacts.firstOrCreate({ name: 'Link' }); - assert.equal(record.name, 'Luigi'); - assert.ok(record.id); -}); + assert.deepEqual(record, { id: '1', name: 'Link', evil: false }); + }); -module('Unit | Db #registerIdentityManagers and #identityManagerFor'); + test('it creates a new record from query + attrs if none found', function(assert) { + let record = db.contacts.firstOrCreate({ name: 'Mario' }, { evil: false }); -test('identityManagerFor returns ember-cli-mirage default IdentityManager if there aren\'t any custom ones', function(assert) { - let db = new Db(); - assert.equal(db.identityManagerFor('foo'), DefaultIdentityManager); -}); + assert.equal(record.name, 'Mario'); + assert.equal(record.evil, false); + assert.ok(record.id); + }); -test('it can register identity managers per db collection and for application', function(assert) { - let FooIdentityManager = class {}; - let ApplicationIdentityManager = class {}; - - let db = new Db(); - db.registerIdentityManagers({ - foo: FooIdentityManager, - application: ApplicationIdentityManager - }); - - assert.equal( - db.identityManagerFor('foo'), - FooIdentityManager, - 'it allows to declare an identity manager per db collection' - ); - assert.equal( - db.identityManagerFor('bar'), - ApplicationIdentityManager, - 'it falls back to application idenitity manager if there isn\'t one for a specific db collection' - ); -}); + test('does not require attrs', function(assert) { + let record = db.contacts.firstOrCreate({ name: 'Luigi' }); -test('it can register idenitity managers on instantiation', function(assert) { - let CustomIdentityManager = class {}; - let db = new Db(undefined, { - foo: CustomIdentityManager + assert.equal(record.name, 'Luigi'); + assert.ok(record.id); }); - assert.equal(db.identityManagerFor('foo'), CustomIdentityManager); - assert.equal(db.identityManagerFor('bar'), DefaultIdentityManager); }); + +module( + 'Unit | Db #registerIdentityManagers and #identityManagerFor', + function() { + test('identityManagerFor returns ember-cli-mirage default IdentityManager if there aren\'t any custom ones', function(assert) { + let db = new Db(); + assert.equal(db.identityManagerFor('foo'), DefaultIdentityManager); + }); + + test('it can register identity managers per db collection and for application', function(assert) { + let FooIdentityManager = class {}; + let ApplicationIdentityManager = class {}; + + let db = new Db(); + db.registerIdentityManagers({ + foo: FooIdentityManager, + application: ApplicationIdentityManager + }); + + assert.equal( + db.identityManagerFor('foo'), + FooIdentityManager, + 'it allows to declare an identity manager per db collection' + ); + assert.equal( + db.identityManagerFor('bar'), + ApplicationIdentityManager, + 'it falls back to application idenitity manager if there isn\'t one for a specific db collection' + ); + }); + + test('it can register idenitity managers on instantiation', function(assert) { + let CustomIdentityManager = class {}; + let db = new Db(undefined, { + foo: CustomIdentityManager + }); + assert.equal(db.identityManagerFor('foo'), CustomIdentityManager); + assert.equal(db.identityManagerFor('bar'), DefaultIdentityManager); + }); + } +); diff --git a/tests/unit/db/identity-manager-test.js b/tests/unit/db/identity-manager-test.js index d3bbebbf6..2e59a580d 100644 --- a/tests/unit/db/identity-manager-test.js +++ b/tests/unit/db/identity-manager-test.js @@ -2,85 +2,85 @@ import IdentityManager from 'ember-cli-mirage/identity-manager'; import {module, test} from 'qunit'; -module('Unit | Db | IdentityManager'); - -test('it can be instantiated', function(assert) { - let manager = new IdentityManager(); - assert.ok(manager); -}); - -test(`fetch returns the latest number`, function(assert) { - let manager = new IdentityManager(); - - assert.equal(manager.fetch(), 1); - assert.equal(manager.fetch(), 2); - assert.equal(manager.fetch(), 3); -}); - -test(`get returns the upcoming id used for fetch`, function(assert) { - let manager = new IdentityManager(); - - assert.equal(manager.fetch(), 1); - assert.equal(manager.get(), 2); - assert.equal(manager.fetch(), 2); -}); - -test(`set indicates an id is being used`, function(assert) { - let manager = new IdentityManager(); - manager.set('abc'); - - assert.throws(function() { +module('Unit | Db | IdentityManager', function() { + test('it can be instantiated', function(assert) { + let manager = new IdentityManager(); + assert.ok(manager); + }); + + test(`fetch returns the latest number`, function(assert) { + let manager = new IdentityManager(); + + assert.equal(manager.fetch(), 1); + assert.equal(manager.fetch(), 2); + assert.equal(manager.fetch(), 3); + }); + + test(`get returns the upcoming id used for fetch`, function(assert) { + let manager = new IdentityManager(); + + assert.equal(manager.fetch(), 1); + assert.equal(manager.get(), 2); + assert.equal(manager.fetch(), 2); + }); + + test(`set indicates an id is being used`, function(assert) { + let manager = new IdentityManager(); manager.set('abc'); - }, /already been used/); -}); -test(`a numerical value passed into set affects future ids used by fetch`, function(assert) { - let manager = new IdentityManager(); - manager.set(5); + assert.throws(function() { + manager.set('abc'); + }, /already been used/); + }); - assert.equal(manager.fetch(), 6); - assert.equal(manager.fetch(), 7); -}); + test(`a numerical value passed into set affects future ids used by fetch`, function(assert) { + let manager = new IdentityManager(); + manager.set(5); -test(`multiple numerical values passed into set affects future ids used by fetch`, function(assert) { - let manager = new IdentityManager(); - manager.set(5); - manager.set(6); + assert.equal(manager.fetch(), 6); + assert.equal(manager.fetch(), 7); + }); - assert.equal(manager.fetch(), 7); - assert.equal(manager.fetch(), 8); -}); + test(`multiple numerical values passed into set affects future ids used by fetch`, function(assert) { + let manager = new IdentityManager(); + manager.set(5); + manager.set(6); -test(`an int as a string passed into set affects future ids used by fetch`, function(assert) { - let manager = new IdentityManager(); - manager.set('5'); + assert.equal(manager.fetch(), 7); + assert.equal(manager.fetch(), 8); + }); - assert.equal(manager.fetch(), 6); - assert.equal(manager.fetch(), 7); -}); + test(`an int as a string passed into set affects future ids used by fetch`, function(assert) { + let manager = new IdentityManager(); + manager.set('5'); -test(`multiple ints as a string passed into set affects future ids used by fetch`, function(assert) { - let manager = new IdentityManager(); - manager.set('5'); - manager.set('6'); + assert.equal(manager.fetch(), 6); + assert.equal(manager.fetch(), 7); + }); - assert.equal(manager.fetch(), 7); - assert.equal(manager.fetch(), 8); -}); + test(`multiple ints as a string passed into set affects future ids used by fetch`, function(assert) { + let manager = new IdentityManager(); + manager.set('5'); + manager.set('6'); -test(`a string value that doesn't parse as an int passed into set doesn't affect future ids used by fetch`, function(assert) { - let manager = new IdentityManager(); - manager.set('123-abc'); + assert.equal(manager.fetch(), 7); + assert.equal(manager.fetch(), 8); + }); - assert.equal(manager.fetch(), 1); - assert.equal(manager.fetch(), 2); -}); + test(`a string value that doesn't parse as an int passed into set doesn't affect future ids used by fetch`, function(assert) { + let manager = new IdentityManager(); + manager.set('123-abc'); + + assert.equal(manager.fetch(), 1); + assert.equal(manager.fetch(), 2); + }); -test(`reset clears the managers memory`, function(assert) { - let manager = new IdentityManager(); - manager.set('abc'); - manager.reset(); - manager.set('abc'); + test(`reset clears the managers memory`, function(assert) { + let manager = new IdentityManager(); + manager.set('abc'); + manager.reset(); + manager.set('abc'); - assert.ok(true); + assert.ok(true); + }); }); diff --git a/tests/unit/factory-test.js b/tests/unit/factory-test.js index 183e12f13..b53dad1d8 100644 --- a/tests/unit/factory-test.js +++ b/tests/unit/factory-test.js @@ -3,345 +3,345 @@ import { trait } from 'ember-cli-mirage'; import {module, test} from 'qunit'; -module('Unit | Factory'); - -test('it exists', function(assert) { - assert.ok(Mirage.Factory); -}); +module('Unit | Factory', function() { + test('it exists', function(assert) { + assert.ok(Mirage.Factory); + }); -test('the base class builds empty objects', function(assert) { - let f = new Mirage.Factory(); - let data = f.build(); + test('the base class builds empty objects', function(assert) { + let f = new Mirage.Factory(); + let data = f.build(); - assert.deepEqual(data, {}); -}); - -test('a noop extension builds empty objects', function(assert) { - let EmptyFactory = Mirage.Factory.extend(); - let f = new EmptyFactory(); - let data = f.build(); + assert.deepEqual(data, {}); + }); - assert.deepEqual(data, {}); -}); + test('a noop extension builds empty objects', function(assert) { + let EmptyFactory = Mirage.Factory.extend(); + let f = new EmptyFactory(); + let data = f.build(); -test('it works with strings, numbers and booleans', function(assert) { - let AFactory = Mirage.Factory.extend({ - name: 'Sam', - age: 28, - alive: true + assert.deepEqual(data, {}); }); - let f = new AFactory(); - let data = f.build(); + test('it works with strings, numbers and booleans', function(assert) { + let AFactory = Mirage.Factory.extend({ + name: 'Sam', + age: 28, + alive: true + }); - assert.deepEqual(data, { name: 'Sam', age: 28, alive: true }); -}); + let f = new AFactory(); + let data = f.build(); -test('it supports inheritance', function(assert) { - let PersonFactory = Mirage.Factory.extend({ - species: 'human' - }); - let ManFactory = PersonFactory.extend({ - gender: 'male' + assert.deepEqual(data, { name: 'Sam', age: 28, alive: true }); }); - let SamFactory = ManFactory.extend({ - name: 'Sam' + + test('it supports inheritance', function(assert) { + let PersonFactory = Mirage.Factory.extend({ + species: 'human' + }); + let ManFactory = PersonFactory.extend({ + gender: 'male' + }); + let SamFactory = ManFactory.extend({ + name: 'Sam' + }); + + let p = new PersonFactory(); + let m = new ManFactory(); + let s = new SamFactory(); + + assert.deepEqual(p.build(), { species: 'human' }); + assert.deepEqual(m.build(), { species: 'human', gender: 'male' }); + assert.deepEqual(s.build(), { species: 'human', gender: 'male', name: 'Sam' }); }); - let p = new PersonFactory(); - let m = new ManFactory(); - let s = new SamFactory(); + test('it can use sequences', function(assert) { + let PostFactory = Mirage.Factory.extend({ + likes(i) { + return 5 * i; + } + }); - assert.deepEqual(p.build(), { species: 'human' }); - assert.deepEqual(m.build(), { species: 'human', gender: 'male' }); - assert.deepEqual(s.build(), { species: 'human', gender: 'male', name: 'Sam' }); -}); + let p = new PostFactory(); + let post1 = p.build(1); + let post2 = p.build(2); -test('it can use sequences', function(assert) { - let PostFactory = Mirage.Factory.extend({ - likes(i) { - return 5 * i; - } + assert.deepEqual(post1, { likes: 5 }); + assert.deepEqual(post2, { likes: 10 }); }); - let p = new PostFactory(); - let post1 = p.build(1); - let post2 = p.build(2); + test('it can reuse static properties', function(assert) { + let BazFactory = Mirage.Factory.extend({ + foo: 5, + bar(i) { + return this.foo * i; + } + }); - assert.deepEqual(post1, { likes: 5 }); - assert.deepEqual(post2, { likes: 10 }); -}); + let b = new BazFactory(); + let baz1 = b.build(1); + let baz2 = b.build(2); -test('it can reuse static properties', function(assert) { - let BazFactory = Mirage.Factory.extend({ - foo: 5, - bar(i) { - return this.foo * i; - } + assert.deepEqual(baz1, { foo: 5, bar: 5 }); + assert.deepEqual(baz2, { foo: 5, bar: 10 }); }); - let b = new BazFactory(); - let baz1 = b.build(1); - let baz2 = b.build(2); + test('it can reuse dynamic properties', function(assert) { + let BazFactory = Mirage.Factory.extend({ + foo(i) { + return 5 * i; + }, + bar() { + return this.foo * 2; + } + }); - assert.deepEqual(baz1, { foo: 5, bar: 5 }); - assert.deepEqual(baz2, { foo: 5, bar: 10 }); -}); + let b = new BazFactory(); + let baz1 = b.build(1); + let baz2 = b.build(2); -test('it can reuse dynamic properties', function(assert) { - let BazFactory = Mirage.Factory.extend({ - foo(i) { - return 5 * i; - }, - bar() { - return this.foo * 2; - } + assert.deepEqual(baz1, { foo: 5, bar: 10 }); + assert.deepEqual(baz2, { foo: 10, bar: 20 }); }); - let b = new BazFactory(); - let baz1 = b.build(1); - let baz2 = b.build(2); + test('it can have dynamic properties that depend on another', function(assert) { + let BazFactory = Mirage.Factory.extend({ + name() { + return 'foo'; + }, + bar() { + return this.name.substr(1); + } + }); - assert.deepEqual(baz1, { foo: 5, bar: 10 }); - assert.deepEqual(baz2, { foo: 10, bar: 20 }); -}); + let b = new BazFactory(); + let baz1 = b.build(1); -test('it can have dynamic properties that depend on another', function(assert) { - let BazFactory = Mirage.Factory.extend({ - name() { - return 'foo'; - }, - bar() { - return this.name.substr(1); - } + assert.deepEqual(baz1, { name: 'foo', bar: 'oo' }); }); - let b = new BazFactory(); - let baz1 = b.build(1); + test('it can reference properties out of order', function(assert) { + let BazFactory = Mirage.Factory.extend({ + bar() { + return this.foo + 2; + }, - assert.deepEqual(baz1, { name: 'foo', bar: 'oo' }); -}); + baz: 6, -test('it can reference properties out of order', function(assert) { - let BazFactory = Mirage.Factory.extend({ - bar() { - return this.foo + 2; - }, + foo(i) { + return this.baz * i; + } + }); - baz: 6, + let b = new BazFactory(); + let baz1 = b.build(1); + let baz2 = b.build(2); - foo(i) { - return this.baz * i; - } + assert.deepEqual(baz1, { baz: 6, foo: 6, bar: 8 }); + assert.deepEqual(baz2, { baz: 6, foo: 12, bar: 14 }); }); - let b = new BazFactory(); - let baz1 = b.build(1); - let baz2 = b.build(2); + test('it can reference multiple properties in any order', function(assert) { + let FooFactory = Mirage.Factory.extend({ + foo() { + return this.bar + this.baz; + }, - assert.deepEqual(baz1, { baz: 6, foo: 6, bar: 8 }); - assert.deepEqual(baz2, { baz: 6, foo: 12, bar: 14 }); -}); - -test('it can reference multiple properties in any order', function(assert) { - let FooFactory = Mirage.Factory.extend({ - foo() { - return this.bar + this.baz; - }, - - bar: 6, + bar: 6, - baz: 10 - }); + baz: 10 + }); - let BarFactory = Mirage.Factory.extend({ - bar: 6, + let BarFactory = Mirage.Factory.extend({ + bar: 6, - foo() { - return this.bar + this.baz; - }, + foo() { + return this.bar + this.baz; + }, - baz: 10 - }); + baz: 10 + }); - let BazFactory = Mirage.Factory.extend({ - bar: 6, + let BazFactory = Mirage.Factory.extend({ + bar: 6, - baz: 10, + baz: 10, - foo() { - return this.bar + this.baz; - } - }); + foo() { + return this.bar + this.baz; + } + }); - let Foo = new FooFactory(); - let Bar = new BarFactory(); - let Baz = new BazFactory(); + let Foo = new FooFactory(); + let Bar = new BarFactory(); + let Baz = new BazFactory(); - let foo = Foo.build(1); - let bar = Bar.build(1); - let baz = Baz.build(1); + let foo = Foo.build(1); + let bar = Bar.build(1); + let baz = Baz.build(1); - assert.deepEqual(foo, { foo: 16, bar: 6, baz: 10 }); - assert.deepEqual(bar, { foo: 16, bar: 6, baz: 10 }); - assert.deepEqual(baz, { foo: 16, bar: 6, baz: 10 }); -}); + assert.deepEqual(foo, { foo: 16, bar: 6, baz: 10 }); + assert.deepEqual(bar, { foo: 16, bar: 6, baz: 10 }); + assert.deepEqual(baz, { foo: 16, bar: 6, baz: 10 }); + }); -test('it can reference properties on complex object', function(assert) { - let AbcFactory = Mirage.Factory.extend({ - a(i) { - return this.b + i; - }, - b() { - return this.c + 1; - }, - c() { - return this.f + 1; - }, - d(i) { - return this.e + i; - }, - e() { - return this.c + 1; - }, - f: 1, - g: 2, - h: 3 + test('it can reference properties on complex object', function(assert) { + let AbcFactory = Mirage.Factory.extend({ + a(i) { + return this.b + i; + }, + b() { + return this.c + 1; + }, + c() { + return this.f + 1; + }, + d(i) { + return this.e + i; + }, + e() { + return this.c + 1; + }, + f: 1, + g: 2, + h: 3 + }); + + let b = new AbcFactory(); + let abc1 = b.build(1); + let abc2 = b.build(2); + + assert.deepEqual(abc1, { a: 4, b: 3, c: 2, d: 4, e: 3, f: 1, g: 2, h: 3 }); + assert.deepEqual(abc2, { a: 5, b: 3, c: 2, d: 5, e: 3, f: 1, g: 2, h: 3 }); }); - let b = new AbcFactory(); - let abc1 = b.build(1); - let abc2 = b.build(2); + test('throws meaningfull exception on circular reference', function(assert) { + let BazFactory = Mirage.Factory.extend({ + bar() { + return this.foo; + }, - assert.deepEqual(abc1, { a: 4, b: 3, c: 2, d: 4, e: 3, f: 1, g: 2, h: 3 }); - assert.deepEqual(abc2, { a: 5, b: 3, c: 2, d: 5, e: 3, f: 1, g: 2, h: 3 }); -}); + foo() { + return this.bar; + } + }); + + let b = new BazFactory(); + assert.throws(function() { + b.build(1); + }, function(e) { + return e.toString() === 'Error: Cyclic dependency in properties ["foo","bar"]'; + }); + }); -test('throws meaningfull exception on circular reference', function(assert) { - let BazFactory = Mirage.Factory.extend({ - bar() { - return this.foo; - }, + test('#build skips invoking `afterCreate`', function(assert) { + let skipped = true; + let PostFactory = Mirage.Factory.extend({ + afterCreate() { + skipped = false; + } + }); - foo() { - return this.bar; - } - }); + let factory = new PostFactory(); + let post = factory.build(0); - let b = new BazFactory(); - assert.throws(function() { - b.build(1); - }, function(e) { - return e.toString() === 'Error: Cyclic dependency in properties ["foo","bar"]'; + assert.ok(skipped, 'skips invoking `afterCreate`'); + assert.equal( + typeof post.afterCreate, + 'undefined', + 'does not build `afterCreate` attribute' + ); }); -}); -test('#build skips invoking `afterCreate`', function(assert) { - let skipped = true; - let PostFactory = Mirage.Factory.extend({ - afterCreate() { - skipped = false; - } - }); + test('extractAfterCreateCallbacks returns all afterCreate callbacks from factory with the base one being first', function(assert) { + let PostFactory = Mirage.Factory.extend({ + published: trait({ + afterCreate() { + return 'from published'; + } + }), - let factory = new PostFactory(); - let post = factory.build(0); + withComments: trait({ + afterCreate() { + return 'from withComments'; + } + }), - assert.ok(skipped, 'skips invoking `afterCreate`'); - assert.equal( - typeof post.afterCreate, - 'undefined', - 'does not build `afterCreate` attribute' - ); -}); + otherTrait: trait({}), -test('extractAfterCreateCallbacks returns all afterCreate callbacks from factory with the base one being first', function(assert) { - let PostFactory = Mirage.Factory.extend({ - published: trait({ afterCreate() { - return 'from published'; + return 'from base'; } - }), + }); - withComments: trait({ - afterCreate() { - return 'from withComments'; - } - }), - - otherTrait: trait({}), - - afterCreate() { - return 'from base'; - } + let callbacks = PostFactory.extractAfterCreateCallbacks(); + assert.equal(callbacks.length, 3); + assert.deepEqual(callbacks.map((cb) => cb()), ['from base', 'from published', 'from withComments']); }); - let callbacks = PostFactory.extractAfterCreateCallbacks(); - assert.equal(callbacks.length, 3); - assert.deepEqual(callbacks.map((cb) => cb()), ['from base', 'from published', 'from withComments']); -}); + test('extractAfterCreateCallbacks filters traits from which the afterCreate callbacks will be extracted from', function(assert) { + let PostFactory = Mirage.Factory.extend({ + published: trait({ + afterCreate() { + return 'from published'; + } + }), -test('extractAfterCreateCallbacks filters traits from which the afterCreate callbacks will be extracted from', function(assert) { - let PostFactory = Mirage.Factory.extend({ - published: trait({ - afterCreate() { - return 'from published'; - } - }), + withComments: trait({ + afterCreate() { + return 'from withComments'; + } + }), + + otherTrait: trait({}), - withComments: trait({ afterCreate() { - return 'from withComments'; + return 'from base'; } - }), - - otherTrait: trait({}), - - afterCreate() { - return 'from base'; - } + }); + + assert.equal(PostFactory.extractAfterCreateCallbacks({ traits: [] }).length, 1); + assert.deepEqual( + PostFactory.extractAfterCreateCallbacks({ traits: [] }).map((cb) => cb()), + ['from base'] + ); + + assert.equal(PostFactory.extractAfterCreateCallbacks({ traits: ['withComments'] }).length, 2); + assert.deepEqual( + PostFactory.extractAfterCreateCallbacks({ traits: ['withComments'] }).map((cb) => cb()), + ['from base', 'from withComments'] + ); + + assert.equal(PostFactory.extractAfterCreateCallbacks({ traits: ['withComments', 'published'] }).length, 3); + assert.deepEqual( + PostFactory.extractAfterCreateCallbacks({ traits: ['withComments', 'published'] }).map((cb) => cb()), + ['from base', 'from withComments', 'from published'] + ); + + assert.equal(PostFactory.extractAfterCreateCallbacks({ traits: ['withComments', 'otherTrait'] }).length, 2); + assert.deepEqual( + PostFactory.extractAfterCreateCallbacks({ traits: ['withComments', 'otherTrait'] }).map((cb) => cb()), + ['from base', 'from withComments'] + ); }); - assert.equal(PostFactory.extractAfterCreateCallbacks({ traits: [] }).length, 1); - assert.deepEqual( - PostFactory.extractAfterCreateCallbacks({ traits: [] }).map((cb) => cb()), - ['from base'] - ); - - assert.equal(PostFactory.extractAfterCreateCallbacks({ traits: ['withComments'] }).length, 2); - assert.deepEqual( - PostFactory.extractAfterCreateCallbacks({ traits: ['withComments'] }).map((cb) => cb()), - ['from base', 'from withComments'] - ); - - assert.equal(PostFactory.extractAfterCreateCallbacks({ traits: ['withComments', 'published'] }).length, 3); - assert.deepEqual( - PostFactory.extractAfterCreateCallbacks({ traits: ['withComments', 'published'] }).map((cb) => cb()), - ['from base', 'from withComments', 'from published'] - ); - - assert.equal(PostFactory.extractAfterCreateCallbacks({ traits: ['withComments', 'otherTrait'] }).length, 2); - assert.deepEqual( - PostFactory.extractAfterCreateCallbacks({ traits: ['withComments', 'otherTrait'] }).map((cb) => cb()), - ['from base', 'from withComments'] - ); -}); + test('isTrait returns true if there is a trait with given name', function(assert) { + let PostFactory = Mirage.Factory.extend({ + title: 'Lorem ipsum', -test('isTrait returns true if there is a trait with given name', function(assert) { - let PostFactory = Mirage.Factory.extend({ - title: 'Lorem ipsum', + published: trait({ + isPublished: true + }), - published: trait({ - isPublished: true - }), + someNestedObject: { + value: 'nested' + } + }); - someNestedObject: { - value: 'nested' - } + assert.ok(!PostFactory.isTrait('title')); + assert.ok(PostFactory.isTrait('published')); + assert.ok(!PostFactory.isTrait('someNestedObject')); + assert.ok(!PostFactory.isTrait('notdefined')); }); - - assert.ok(!PostFactory.isTrait('title')); - assert.ok(PostFactory.isTrait('published')); - assert.ok(!PostFactory.isTrait('someNestedObject')); - assert.ok(!PostFactory.isTrait('notdefined')); }); diff --git a/tests/unit/faker-test.js b/tests/unit/faker-test.js index 78bfa36be..39fea2728 100644 --- a/tests/unit/faker-test.js +++ b/tests/unit/faker-test.js @@ -2,33 +2,33 @@ import faker from 'ember-cli-mirage/faker'; import {module, test} from 'qunit'; -module('Unit | Faker'); - -test('#cycle - returns a function', function(assert) { - let callback = faker.list.cycle('first', 'second'); - assert.ok(typeof callback === 'function', 'result is a function'); -}); - -test('#cycle - cycles the passed data', function(assert) { - let callback = faker.list.cycle('first', 'second', 'third'); - - assert.equal(callback(0), 'first', 'return the first result for sequence 0'); - assert.equal(callback(1), 'second', 'return the first result for sequence 1'); - assert.equal(callback(2), 'third', 'return the first result for sequence 2'); - assert.equal(callback(3), 'first', 'return the first result for sequence 3'); -}); - -test('#random - returns random element from a list', function(assert) { - let callback = faker.list.random('first', 'second', 'third'); - - assert.notEqual(['first', 'second', 'third'].indexOf(callback()), -1, 'returns random value'); -}); - -test('#range - creates a random number in a range', function(assert) { - let min = 0; - let max = 10; - - let callback = faker.random.number.range(min, max); - assert.equal(callback() >= min, true, 'result is higher or equal than low value'); - assert.equal(callback() <= max, true, 'result is lower or equal than high value'); +module('Unit | Faker', function() { + test('#cycle - returns a function', function(assert) { + let callback = faker.list.cycle('first', 'second'); + assert.ok(typeof callback === 'function', 'result is a function'); + }); + + test('#cycle - cycles the passed data', function(assert) { + let callback = faker.list.cycle('first', 'second', 'third'); + + assert.equal(callback(0), 'first', 'return the first result for sequence 0'); + assert.equal(callback(1), 'second', 'return the first result for sequence 1'); + assert.equal(callback(2), 'third', 'return the first result for sequence 2'); + assert.equal(callback(3), 'first', 'return the first result for sequence 3'); + }); + + test('#random - returns random element from a list', function(assert) { + let callback = faker.list.random('first', 'second', 'third'); + + assert.notEqual(['first', 'second', 'third'].indexOf(callback()), -1, 'returns random value'); + }); + + test('#range - creates a random number in a range', function(assert) { + let min = 0; + let max = 10; + + let callback = faker.random.number.range(min, max); + assert.equal(callback() >= min, true, 'result is higher or equal than low value'); + assert.equal(callback() <= max, true, 'result is lower or equal than high value'); + }); }); diff --git a/tests/unit/inflector-test.js b/tests/unit/inflector-test.js index 8c2e91510..63263e599 100644 --- a/tests/unit/inflector-test.js +++ b/tests/unit/inflector-test.js @@ -2,16 +2,16 @@ import { singularize, pluralize } from 'ember-cli-mirage/utils/inflector'; import {module, test} from 'qunit'; -module('Unit | Inflector'); +module('Unit | Inflector', function() { + test('can singularize', function(assert) { + assert.equal(singularize('tests'), 'test'); + assert.equal(singularize('watches'), 'watch'); + assert.equal(singularize('sheep'), 'sheep'); + }); -test('can singularize', function(assert) { - assert.equal(singularize('tests'), 'test'); - assert.equal(singularize('watches'), 'watch'); - assert.equal(singularize('sheep'), 'sheep'); -}); - -test('can pluralize', function(assert) { - assert.equal(pluralize('test'), 'tests'); - assert.equal(pluralize('watch'), 'watches'); - assert.equal(pluralize('sheep'), 'sheep'); + test('can pluralize', function(assert) { + assert.equal(pluralize('test'), 'tests'); + assert.equal(pluralize('watch'), 'watches'); + assert.equal(pluralize('sheep'), 'sheep'); + }); }); diff --git a/tests/unit/model-test.js b/tests/unit/model-test.js index dc3877029..4bfeb876e 100644 --- a/tests/unit/model-test.js +++ b/tests/unit/model-test.js @@ -1,32 +1,32 @@ import Model from 'ember-cli-mirage/orm/model'; import {module, test} from 'qunit'; -module('Unit | Model'); +module('Unit | Model', function() { + test('it can be instantiated', function(assert) { + let model = new Model({}, 'user'); + assert.ok(model); + }); -test('it can be instantiated', function(assert) { - let model = new Model({}, 'user'); - assert.ok(model); -}); - -test('it cannot be instantiated without a schema', function(assert) { - assert.throws(function() { - new Model(); - }, /requires a schema/); -}); + test('it cannot be instantiated without a schema', function(assert) { + assert.throws(function() { + new Model(); + }, /requires a schema/); + }); -test('it cannot be instantiated without a modelName', function(assert) { - assert.throws(function() { - new Model({}); - }, /requires a modelName/); -}); + test('it cannot be instantiated without a modelName', function(assert) { + assert.throws(function() { + new Model({}); + }, /requires a modelName/); + }); -test('findBelongsToAssociation returns association for given type if defined', function(assert) { - let ModelClass = Model.extend(); - let authorAssociationMock = {}; - ModelClass.prototype.belongsToAssociations = { - author: authorAssociationMock - }; + test('findBelongsToAssociation returns association for given type if defined', function(assert) { + let ModelClass = Model.extend(); + let authorAssociationMock = {}; + ModelClass.prototype.belongsToAssociations = { + author: authorAssociationMock + }; - assert.equal(ModelClass.findBelongsToAssociation('article'), null); - assert.deepEqual(ModelClass.findBelongsToAssociation('author'), authorAssociationMock); + assert.equal(ModelClass.findBelongsToAssociation('article'), null); + assert.deepEqual(ModelClass.findBelongsToAssociation('author'), authorAssociationMock); + }); }); diff --git a/tests/unit/reference-sort-test.js b/tests/unit/reference-sort-test.js index 2ea753bf0..520225543 100644 --- a/tests/unit/reference-sort-test.js +++ b/tests/unit/reference-sort-test.js @@ -1,38 +1,38 @@ import referenceSort from 'ember-cli-mirage/utils/reference-sort'; import {module, test} from 'qunit'; -module('mirage:reference-sort'); +module('mirage:reference-sort', function() { + test('it sorts property references', function(assert) { + let sorted = referenceSort([ + ['propA'], + ['propB', 'propC'], + ['propC', 'propA'], + ['propD'] + ]); -test('it sorts property references', function(assert) { - let sorted = referenceSort([ - ['propA'], - ['propB', 'propC'], - ['propC', 'propA'], - ['propD'] - ]); + assert.deepEqual(sorted, ['propD', 'propA', 'propC', 'propB']); + }); - assert.deepEqual(sorted, ['propD', 'propA', 'propC', 'propB']); -}); + test('it throws on circular dependency', function(assert) { + assert.throws(function() { + referenceSort([ + ['propA', 'propB'], + ['propB', 'propA'] + ]); + }, function(e) { + return e.toString() === 'Error: Cyclic dependency in properties ["propB","propA"]'; + }); -test('it throws on circular dependency', function(assert) { - assert.throws(function() { - referenceSort([ - ['propA', 'propB'], - ['propB', 'propA'] - ]); - }, function(e) { - return e.toString() === 'Error: Cyclic dependency in properties ["propB","propA"]'; }); -}); - -test('it works with no references', function(assert) { - let sorted = referenceSort([ - ['propA'], - ['propB'], - ['propC'], - ['propD'] - ]); + test('it works with no references', function(assert) { + let sorted = referenceSort([ + ['propA'], + ['propB'], + ['propC'], + ['propD'] + ]); - assert.deepEqual(sorted, ['propD', 'propC', 'propB', 'propA']); + assert.deepEqual(sorted, ['propD', 'propC', 'propB', 'propA']); + }); }); diff --git a/tests/unit/response-test.js b/tests/unit/response-test.js index 60b0576c8..4ac380417 100644 --- a/tests/unit/response-test.js +++ b/tests/unit/response-test.js @@ -2,18 +2,18 @@ import Response from 'ember-cli-mirage/response'; import {module, test} from 'qunit'; -module('Unit | Response'); +module('Unit | Response', function() { + test('it can be instantiated and return a rack response', function(assert) { + let response = new Response(404, {}, {}); -test('it can be instantiated and return a rack response', function(assert) { - let response = new Response(404, {}, {}); + assert.ok(response); + assert.ok(response.toRackResponse()); + }); - assert.ok(response); - assert.ok(response.toRackResponse()); -}); - -test('it can be instantiated with just a response code', function(assert) { - let response = new Response(404); + test('it can be instantiated with just a response code', function(assert) { + let response = new Response(404); - assert.ok(response); - assert.ok(response.toRackResponse()); + assert.ok(response); + assert.ok(response.toRackResponse()); + }); }); diff --git a/tests/unit/route-handlers/shorthands/base-test.js b/tests/unit/route-handlers/shorthands/base-test.js index 274f5d912..e5e1e7a08 100644 --- a/tests/unit/route-handlers/shorthands/base-test.js +++ b/tests/unit/route-handlers/shorthands/base-test.js @@ -2,158 +2,161 @@ import BaseShorthandRouteHandler from 'ember-cli-mirage/route-handlers/shorthand import {module, test} from 'qunit'; -module('Unit | Route handlers | Shorthands | BaseShorthandRouteHandler', { - beforeEach() { - this.handler = new BaseShorthandRouteHandler(); - this.request = { params: { id: '' } }; - } -}); - -test('it returns a number if it\'s a number', function(assert) { - this.request.params.id = 2; - assert.equal(this.handler._getIdForRequest(this.request), 2, 'it returns a number'); -}); - -test('it returns a number if it\'s a string represented number', function(assert) { - this.request.params.id = '2'; - assert.equal(this.handler._getIdForRequest(this.request), 2, 'it returns a number'); -}); - -test('it returns a string it\'s a dasherized number', function(assert) { - this.request.params.id = '2-1'; - assert.equal(this.handler._getIdForRequest(this.request), '2-1', 'it returns a number'); -}); - -test('it returns a string if it\'s a string', function(assert) { - this.request.params.id = 'someID'; - assert.equal(this.handler._getIdForRequest(this.request), 'someID', 'it returns a number'); -}); - -test('getModelClassFromPath works', function(assert) { - let urlWithSlash = '/api/fancy-users'; - let urlWithIdAndSlash = '/api/fancy-users/:id'; - - assert.equal(this.handler.getModelClassFromPath(urlWithSlash), 'fancy-user', 'it returns a singular model name'); - assert.equal(this.handler.getModelClassFromPath(urlWithIdAndSlash, true), 'fancy-user', 'it returns a singular model name'); -}); - -test('it can read the id from the url', function(assert) { - let request = { params: { id: 'test-id' } }; - assert.equal(this.handler._getIdForRequest(request), 'test-id', 'it returns id from url parameters.'); -}); - -test('it can read the id from the request body', function(assert) { - let request = { params: {} }; - let jsonApiDoc = { data: { id: 'jsonapi-id' } }; - assert.equal(this.handler._getIdForRequest(request, jsonApiDoc), 'jsonapi-id', 'it returns id from json api data.'); -}); - -test('_getAttrsForRequest works with attributes and relationships', function(assert) { - let payload = { - 'data': { - 'attributes': { - 'does-mirage': true, - 'name': 'Sam' - }, - 'relationships': { - 'company': { - 'data': { - 'id': '1', - 'type': 'companies' - } - }, - 'employees': { - 'data': [{ - 'id': '1', - 'type': 'employees' - }, { - 'id': '2', - 'type': 'employees' - }, { - 'id': '3', - 'type': 'employees' - }] - }, - 'nothings': { - 'data': [] - }, - 'github-account': { - 'data': { - 'id': '1', - 'type': 'github-accounts' - } +module( + 'Unit | Route handlers | Shorthands | BaseShorthandRouteHandler', + function(hooks) { + hooks.beforeEach(function() { + this.handler = new BaseShorthandRouteHandler(); + this.request = { params: { id: '' } }; + }); + + test('it returns a number if it\'s a number', function(assert) { + this.request.params.id = 2; + assert.equal(this.handler._getIdForRequest(this.request), 2, 'it returns a number'); + }); + + test('it returns a number if it\'s a string represented number', function(assert) { + this.request.params.id = '2'; + assert.equal(this.handler._getIdForRequest(this.request), 2, 'it returns a number'); + }); + + test('it returns a string it\'s a dasherized number', function(assert) { + this.request.params.id = '2-1'; + assert.equal(this.handler._getIdForRequest(this.request), '2-1', 'it returns a number'); + }); + + test('it returns a string if it\'s a string', function(assert) { + this.request.params.id = 'someID'; + assert.equal(this.handler._getIdForRequest(this.request), 'someID', 'it returns a number'); + }); + + test('getModelClassFromPath works', function(assert) { + let urlWithSlash = '/api/fancy-users'; + let urlWithIdAndSlash = '/api/fancy-users/:id'; + + assert.equal(this.handler.getModelClassFromPath(urlWithSlash), 'fancy-user', 'it returns a singular model name'); + assert.equal(this.handler.getModelClassFromPath(urlWithIdAndSlash, true), 'fancy-user', 'it returns a singular model name'); + }); + + test('it can read the id from the url', function(assert) { + let request = { params: { id: 'test-id' } }; + assert.equal(this.handler._getIdForRequest(request), 'test-id', 'it returns id from url parameters.'); + }); + + test('it can read the id from the request body', function(assert) { + let request = { params: {} }; + let jsonApiDoc = { data: { id: 'jsonapi-id' } }; + assert.equal(this.handler._getIdForRequest(request, jsonApiDoc), 'jsonapi-id', 'it returns id from json api data.'); + }); + + test('_getAttrsForRequest works with attributes and relationships', function(assert) { + let payload = { + 'data': { + 'attributes': { + 'does-mirage': true, + 'name': 'Sam' + }, + 'relationships': { + 'company': { + 'data': { + 'id': '1', + 'type': 'companies' + } + }, + 'employees': { + 'data': [{ + 'id': '1', + 'type': 'employees' + }, { + 'id': '2', + 'type': 'employees' + }, { + 'id': '3', + 'type': 'employees' + }] + }, + 'nothings': { + 'data': [] + }, + 'github-account': { + 'data': { + 'id': '1', + 'type': 'github-accounts' + } + }, + 'something': { + 'data': null + } + }, + 'type': 'github-account' + } + }; + + this.handler._getJsonApiDocForRequest = function() { + return payload; + }; + + let attrs = this.handler._getAttrsForRequest(this.request, 'user'); + + assert.deepEqual( + attrs, + { + name: 'Sam', + doesMirage: true, + companyId: '1', + employeeIds: ['1', '2', '3'], + nothingIds: [], + githubAccountId: '1', + somethingId: null }, - 'something': { - 'data': null + 'it normalizes data correctly.' + ); + }); + + test('_getAttrsForRequest works with just relationships', function(assert) { + let payload = { + 'data': { + 'relationships': { + 'company': { + 'data': { + 'id': '1', + 'type': 'companies' + } + } + }, + 'type': 'github-account' } - }, - 'type': 'github-account' - } - }; - - this.handler._getJsonApiDocForRequest = function() { - return payload; - }; - - let attrs = this.handler._getAttrsForRequest(this.request, 'user'); - - assert.deepEqual( - attrs, - { - name: 'Sam', - doesMirage: true, - companyId: '1', - employeeIds: ['1', '2', '3'], - nothingIds: [], - githubAccountId: '1', - somethingId: null - }, - 'it normalizes data correctly.' - ); -}); - -test('_getAttrsForRequest works with just relationships', function(assert) { - let payload = { - 'data': { - 'relationships': { - 'company': { - 'data': { - 'id': '1', - 'type': 'companies' - } + }; + + this.handler._getJsonApiDocForRequest = function() { + return payload; + }; + + let attrs = this.handler._getAttrsForRequest(this.request, 'user'); + + assert.deepEqual( + attrs, + { + companyId: '1' + }, + 'it normalizes data correctly.' + ); + }); + + test('_getAttrsForRequest works with just type', function(assert) { + let payload = { + 'data': { + 'type': 'github-account' } - }, - 'type': 'github-account' - } - }; - - this.handler._getJsonApiDocForRequest = function() { - return payload; - }; - - let attrs = this.handler._getAttrsForRequest(this.request, 'user'); - - assert.deepEqual( - attrs, - { - companyId: '1' - }, - 'it normalizes data correctly.' - ); -}); - -test('_getAttrsForRequest works with just type', function(assert) { - let payload = { - 'data': { - 'type': 'github-account' - } - }; - - this.handler._getJsonApiDocForRequest = function(request, modelName) { - return payload; - }; - - let attrs = this.handler._getAttrsForRequest(this.request, 'user'); - - assert.deepEqual(attrs, {}); -}); + }; + + this.handler._getJsonApiDocForRequest = function(request, modelName) { + return payload; + }; + + let attrs = this.handler._getAttrsForRequest(this.request, 'user'); + + assert.deepEqual(attrs, {}); + }); + } +); diff --git a/tests/unit/schema-test.js b/tests/unit/schema-test.js index 28f0d340b..e79edcd07 100644 --- a/tests/unit/schema-test.js +++ b/tests/unit/schema-test.js @@ -3,34 +3,34 @@ import Db from 'ember-cli-mirage/db'; import { Model, belongsTo } from 'ember-cli-mirage'; import {module, test} from 'qunit'; -module('Unit | Schema'); +module('Unit | Schema', function() { + test('it can be instantiated', function(assert) { + let dbMock = {}; + let schema = new Schema(dbMock); + assert.ok(schema); + }); -test('it can be instantiated', function(assert) { - let dbMock = {}; - let schema = new Schema(dbMock); - assert.ok(schema); -}); + test('it cannot be instantiated without a db', function(assert) { + assert.throws(function() { + new Schema(); + }, /requires a db/); + }); -test('it cannot be instantiated without a db', function(assert) { - assert.throws(function() { - new Schema(); - }, /requires a db/); -}); + test('modelFor returns model for given type if registered', function(assert) { + let db = new Db(); + let schema = new Schema(db); -test('modelFor returns model for given type if registered', function(assert) { - let db = new Db(); - let schema = new Schema(db); + assert.equal(schema.modelFor('article'), null); - assert.equal(schema.modelFor('article'), null); + let authorModel = Model.extend({ + }); + let articleModel = Model.extend({ + author: belongsTo() + }); + schema.registerModel('article', articleModel); + schema.registerModel('author', authorModel); - let authorModel = Model.extend({ - }); - let articleModel = Model.extend({ - author: belongsTo() + assert.deepEqual(schema.modelFor('article').foreignKeys, ['authorId']); + assert.deepEqual(schema.modelFor('author').foreignKeys, []); }); - schema.registerModel('article', articleModel); - schema.registerModel('author', authorModel); - - assert.deepEqual(schema.modelFor('article').foreignKeys, ['authorId']); - assert.deepEqual(schema.modelFor('author').foreignKeys, []); }); diff --git a/tests/unit/serializers/active-model-serializer-test.js b/tests/unit/serializers/active-model-serializer-test.js index 439757f41..935700990 100644 --- a/tests/unit/serializers/active-model-serializer-test.js +++ b/tests/unit/serializers/active-model-serializer-test.js @@ -2,69 +2,69 @@ import ActiveModelSerializer from 'ember-cli-mirage/serializers/active-model-ser import {module, test} from 'qunit'; -module('Unit | Serializers | ActiveModelSerializer', { - beforeEach() { +module('Unit | Serializers | ActiveModelSerializer', function(hooks) { + hooks.beforeEach(function() { this.serializer = new ActiveModelSerializer(); - } -}); - -test('normalize works', function(assert) { - let payload = { - contact: { - id: 1, - name: 'Link' - } - }; - let jsonApiDoc = this.serializer.normalize(payload); + }); - assert.deepEqual(jsonApiDoc, { - data: { - type: 'contacts', - id: 1, - attributes: { + test('normalize works', function(assert) { + let payload = { + contact: { + id: 1, name: 'Link' } - } + }; + let jsonApiDoc = this.serializer.normalize(payload); + + assert.deepEqual(jsonApiDoc, { + data: { + type: 'contacts', + id: 1, + attributes: { + name: 'Link' + } + } + }); }); -}); -test('it hyphenates snake_cased words', function(assert) { - let payload = { - contact: { - id: 1, - first_name: 'Link' - } - }; - let jsonApiDoc = this.serializer.normalize(payload); + test('it hyphenates snake_cased words', function(assert) { + let payload = { + contact: { + id: 1, + first_name: 'Link' + } + }; + let jsonApiDoc = this.serializer.normalize(payload); - assert.deepEqual(jsonApiDoc, { - data: { - type: 'contacts', - id: 1, - attributes: { - 'first-name': 'Link' + assert.deepEqual(jsonApiDoc, { + data: { + type: 'contacts', + id: 1, + attributes: { + 'first-name': 'Link' + } } - } + }); }); -}); -test('it works without an id', function(assert) { - let payload = { - contact: { - first_name: 'Link', - last_name: 'zor' - } - }; - let jsonApiDoc = this.serializer.normalize(payload); + test('it works without an id', function(assert) { + let payload = { + contact: { + first_name: 'Link', + last_name: 'zor' + } + }; + let jsonApiDoc = this.serializer.normalize(payload); - assert.deepEqual(jsonApiDoc, { - data: { - type: 'contacts', - attributes: { - 'first-name': 'Link', - 'last-name': 'zor' + assert.deepEqual(jsonApiDoc, { + data: { + type: 'contacts', + attributes: { + 'first-name': 'Link', + 'last-name': 'zor' + } } - } + }); }); }); diff --git a/tests/unit/serializers/rest-serializer-test.js b/tests/unit/serializers/rest-serializer-test.js index 60a852285..60e2a4105 100644 --- a/tests/unit/serializers/rest-serializer-test.js +++ b/tests/unit/serializers/rest-serializer-test.js @@ -2,30 +2,30 @@ import RestSerializer from 'ember-cli-mirage/serializers/rest-serializer'; import {module, test} from 'qunit'; -module('Unit | Serializers | RestSerializer', { - beforeEach() { +module('Unit | Serializers | RestSerializer', function(hooks) { + hooks.beforeEach(function() { this.serializer = new RestSerializer(); - } -}); + }); -test('it hyphenates camelized words', function(assert) { - let payload = { - 'person': { - 'id': 1, - 'firstName': 'Rick', - 'lastName': 'Sanchez' - } - }; - let jsonApiDoc = this.serializer.normalize(payload); + test('it hyphenates camelized words', function(assert) { + let payload = { + 'person': { + 'id': 1, + 'firstName': 'Rick', + 'lastName': 'Sanchez' + } + }; + let jsonApiDoc = this.serializer.normalize(payload); - assert.deepEqual(jsonApiDoc, { - data: { - type: 'people', - id: 1, - attributes: { - 'first-name': 'Rick', - 'last-name': 'Sanchez' + assert.deepEqual(jsonApiDoc, { + data: { + type: 'people', + id: 1, + attributes: { + 'first-name': 'Rick', + 'last-name': 'Sanchez' + } } - } + }); }); }); diff --git a/tests/unit/server-test.js b/tests/unit/server-test.js index 16ad60bd0..c5c099c58 100644 --- a/tests/unit/server-test.js +++ b/tests/unit/server-test.js @@ -2,1277 +2,1280 @@ import Server, { defaultPassthroughs } from 'ember-cli-mirage/server'; import {module, test} from 'qunit'; import { Model, Factory, belongsTo, hasMany, trait, association } from 'ember-cli-mirage'; -module('Unit | Server'); +module('Unit | Server', function() { + test('it can be instantiated', function(assert) { + let server = new Server({ environment: 'test' }); -test('it can be instantiated', function(assert) { - let server = new Server({ environment: 'test' }); + assert.ok(server); - assert.ok(server); - - server.shutdown(); -}); + server.shutdown(); + }); -test('it runs the default scenario in non-test environments', function(assert) { - assert.expect(1); + test('it runs the default scenario in non-test environments', function(assert) { + assert.expect(1); - let server = new Server({ - environment: 'development', - scenarios: { - default() { - assert.ok(true); + let server = new Server({ + environment: 'development', + scenarios: { + default() { + assert.ok(true); + } } - } - }); + }); - server.shutdown(); + server.shutdown(); + }); }); -module('Unit | Server #loadConfig'); +module('Unit | Server #loadConfig', function() { + test('forces timing to 0 in test environment', function(assert) { + let server = new Server({ environment: 'test' }); + + server.loadConfig(function() { + this.timing = 50; + }); -test('forces timing to 0 in test environment', function(assert) { - let server = new Server({ environment: 'test' }); + assert.equal(server.timing, 0); - server.loadConfig(function() { - this.timing = 50; + server.shutdown(); }); - assert.equal(server.timing, 0); + test("doesn't modify user's timing config in other environments", function(assert) { + let server = new Server({ environment: 'blah' }); - server.shutdown(); -}); + server.loadConfig(function() { + this.timing = 50; + }); -test("doesn't modify user's timing config in other environments", function(assert) { - let server = new Server({ environment: 'blah' }); + assert.equal(server.timing, 50); - server.loadConfig(function() { - this.timing = 50; + server.shutdown(); }); - - assert.equal(server.timing, 50); - - server.shutdown(); }); -module('Unit | Server #db'); +module('Unit | Server #db', function() { + test('its db is isolated across instances', function(assert) { + let server1 = new Server({ environment: 'test' }); -test('its db is isolated across instances', function(assert) { - let server1 = new Server({ environment: 'test' }); + server1.db.createCollection('contacts'); + server1.db.contacts.insert({ name: 'Sam' }); - server1.db.createCollection('contacts'); - server1.db.contacts.insert({ name: 'Sam' }); + server1.shutdown(); - server1.shutdown(); + let server2 = new Server({ environment: 'test' }); - let server2 = new Server({ environment: 'test' }); + assert.equal(server2.contacts, undefined); - assert.equal(server2.contacts, undefined); - - server2.shutdown(); + server2.shutdown(); + }); }); -module('Unit | Server #create'); +module('Unit | Server #create', function() { + test('create fails when no factories or models are registered', function(assert) { + let server = new Server({ environment: 'test' }); -test('create fails when no factories or models are registered', function(assert) { - let server = new Server({ environment: 'test' }); + assert.throws(function() { + server.create('contact'); + }); - assert.throws(function() { - server.create('contact'); + server.shutdown(); }); - server.shutdown(); -}); + test('create fails when an expected factory isn\'t registered', function(assert) { + let server = new Server({ + environment: 'test', + factories: { + address: Factory + } + }); -test('create fails when an expected factory isn\'t registered', function(assert) { - let server = new Server({ - environment: 'test', - factories: { - address: Factory - } + assert.throws(function() { + server.create('contact'); + }, /no model or factory was found/); + + server.shutdown(); }); - assert.throws(function() { + test('create works when models but no factories are registered', function(assert) { + let server = new Server({ + environment: 'test', + models: { + contact: Model + } + }); + server.create('contact'); - }, /no model or factory was found/); - server.shutdown(); -}); + assert.equal(server.db.contacts.length, 1); -test('create works when models but no factories are registered', function(assert) { - let server = new Server({ - environment: 'test', - models: { - contact: Model - } + server.shutdown(); }); - server.create('contact'); + test('create adds the data to the db', function(assert) { + let server = new Server({ + environment: 'test', + factories: { + contact: Factory.extend({ + name: 'Sam' + }) + } + }); - assert.equal(server.db.contacts.length, 1); + server.create('contact'); + let contactsInDb = server.db.contacts; - server.shutdown(); -}); + assert.equal(contactsInDb.length, 1); + assert.deepEqual(contactsInDb[0], { id: '1', name: 'Sam' }); -test('create adds the data to the db', function(assert) { - let server = new Server({ - environment: 'test', - factories: { - contact: Factory.extend({ - name: 'Sam' - }) - } + server.shutdown(); }); - server.create('contact'); - let contactsInDb = server.db.contacts; + test('create returns the new data in the db', function(assert) { + let server = new Server({ + environment: 'test', + factories: { + contact: Factory.extend({ + name: 'Sam' + }) + } + }); - assert.equal(contactsInDb.length, 1); - assert.deepEqual(contactsInDb[0], { id: '1', name: 'Sam' }); + let contact = server.create('contact'); - server.shutdown(); -}); + assert.deepEqual(contact, { id: '1', name: 'Sam' }); -test('create returns the new data in the db', function(assert) { - let server = new Server({ - environment: 'test', - factories: { - contact: Factory.extend({ - name: 'Sam' - }) - } + server.shutdown(); }); - let contact = server.create('contact'); + test('create allows for attr overrides', function(assert) { + let server = new Server({ + environment: 'test', + factories: { + contact: Factory.extend({ + name: 'Sam' + }) + } + }); - assert.deepEqual(contact, { id: '1', name: 'Sam' }); + let sam = server.create('contact'); + let link = server.create('contact', { name: 'Link' }); - server.shutdown(); -}); + assert.deepEqual(sam, { id: '1', name: 'Sam' }); + assert.deepEqual(link, { id: '2', name: 'Link' }); -test('create allows for attr overrides', function(assert) { - let server = new Server({ - environment: 'test', - factories: { - contact: Factory.extend({ - name: 'Sam' - }) - } + server.shutdown(); }); - let sam = server.create('contact'); - let link = server.create('contact', { name: 'Link' }); + test('create allows for attr overrides with extended factories', function(assert) { + let ContactFactory = Factory.extend({ + name: 'Link', + age: 500 + }); + let FriendFactory = ContactFactory.extend({ + is_young() { + return this.age < 18; + } + }); - assert.deepEqual(sam, { id: '1', name: 'Sam' }); - assert.deepEqual(link, { id: '2', name: 'Link' }); + let server = new Server({ + environment: 'test', + factories: { + contact: ContactFactory, + friend: FriendFactory + } + }); - server.shutdown(); -}); + let link = server.create('friend'); + let youngLink = server.create('friend', { age: 10 }); -test('create allows for attr overrides with extended factories', function(assert) { - let ContactFactory = Factory.extend({ - name: 'Link', - age: 500 - }); - let FriendFactory = ContactFactory.extend({ - is_young() { - return this.age < 18; - } - }); + assert.deepEqual(link, { id: '1', name: 'Link', age: 500, is_young: false }); + assert.deepEqual(youngLink, { id: '2', name: 'Link', age: 10, is_young: true }); - let server = new Server({ - environment: 'test', - factories: { - contact: ContactFactory, - friend: FriendFactory - } + server.shutdown(); }); - let link = server.create('friend'); - let youngLink = server.create('friend', { age: 10 }); + test('create allows for attr overrides with arrays', function(assert) { + let server = new Server({ + environment: 'test', + factories: { + contact: Factory.extend({ + name: ['Sam', 'Carl'] + }) + } + }); - assert.deepEqual(link, { id: '1', name: 'Link', age: 500, is_young: false }); - assert.deepEqual(youngLink, { id: '2', name: 'Link', age: 10, is_young: true }); + let sam = server.create('contact'); + let link = server.create('contact', { name: ['Link'] }); + let noname = server.create('contact', { name: [] }); - server.shutdown(); -}); + assert.deepEqual(sam, { id: '1', name: ['Sam', 'Carl'] }); + assert.deepEqual(link, { id: '2', name: ['Link'] }); + assert.deepEqual(noname, { id: '3', name: [] }); -test('create allows for attr overrides with arrays', function(assert) { - let server = new Server({ - environment: 'test', - factories: { - contact: Factory.extend({ - name: ['Sam', 'Carl'] - }) - } + server.shutdown(); }); - let sam = server.create('contact'); - let link = server.create('contact', { name: ['Link'] }); - let noname = server.create('contact', { name: [] }); + test('create allows for nested attr overrides', function(assert) { + let server = new Server({ + environment: 'test', + factories: { + contact: Factory.extend({ + address: { + streetName: 'Main', + streetAddress(i) { + return 1000 + i; + } + } + }) + } + }); - assert.deepEqual(sam, { id: '1', name: ['Sam', 'Carl'] }); - assert.deepEqual(link, { id: '2', name: ['Link'] }); - assert.deepEqual(noname, { id: '3', name: [] }); + let contact1 = server.create('contact'); + let contact2 = server.create('contact'); - server.shutdown(); -}); + assert.deepEqual(contact1, { id: '1', address: { streetName: 'Main', streetAddress: 1000 } }); + assert.deepEqual(contact2, { id: '2', address: { streetName: 'Main', streetAddress: 1001 } }); -test('create allows for nested attr overrides', function(assert) { - let server = new Server({ - environment: 'test', - factories: { - contact: Factory.extend({ - address: { - streetName: 'Main', - streetAddress(i) { - return 1000 + i; - } - } - }) - } + server.shutdown(); }); - let contact1 = server.create('contact'); - let contact2 = server.create('contact'); + test('factories can have dynamic properties that depend on attr overrides', function(assert) { + let server = new Server({ + environment: 'test', + factories: { + baz: Factory.extend({ + bar() { + return this.name.substr(1); + } + }) + } + }); - assert.deepEqual(contact1, { id: '1', address: { streetName: 'Main', streetAddress: 1000 } }); - assert.deepEqual(contact2, { id: '2', address: { streetName: 'Main', streetAddress: 1001 } }); + let baz1 = server.create('baz', { name: 'foo' }); - server.shutdown(); -}); + assert.deepEqual(baz1, { id: '1', name: 'foo', bar: 'oo' }); -test('factories can have dynamic properties that depend on attr overrides', function(assert) { - let server = new Server({ - environment: 'test', - factories: { - baz: Factory.extend({ - bar() { - return this.name.substr(1); - } - }) - } + server.shutdown(); }); - let baz1 = server.create('baz', { name: 'foo' }); + test('create allows for arrays of attr overrides', function(assert) { + let server = new Server({ + environment: 'test', + factories: { + contact: Factory.extend({ + websites: [ + 'http://example.com', + function(i) { + return `http://placekitten.com/${320 + i}/${240 + i}`; + } + ] + }) + } + }); - assert.deepEqual(baz1, { id: '1', name: 'foo', bar: 'oo' }); + let contact1 = server.create('contact'); + let contact2 = server.create('contact'); - server.shutdown(); -}); + assert.deepEqual(contact1, { id: '1', websites: ['http://example.com', 'http://placekitten.com/320/240'] }); + assert.deepEqual(contact2, { id: '2', websites: ['http://example.com', 'http://placekitten.com/321/241'] }); -test('create allows for arrays of attr overrides', function(assert) { - let server = new Server({ - environment: 'test', - factories: { - contact: Factory.extend({ - websites: [ - 'http://example.com', - function(i) { - return `http://placekitten.com/${320 + i}/${240 + i}`; - } - ] - }) - } + server.shutdown(); }); - let contact1 = server.create('contact'); - let contact2 = server.create('contact'); + test('create allows to extend factory with trait', function(assert) { + let ArticleFactory = Factory.extend({ + title: 'Lorem ipsum', - assert.deepEqual(contact1, { id: '1', websites: ['http://example.com', 'http://placekitten.com/320/240'] }); - assert.deepEqual(contact2, { id: '2', websites: ['http://example.com', 'http://placekitten.com/321/241'] }); + published: trait({ + isPublished: true, + publishedAt: '2010-01-01 10:00:00' + }) + }); - server.shutdown(); -}); + let server = new Server({ + environment: 'test', + factories: { + article: ArticleFactory + } + }); -test('create allows to extend factory with trait', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', + let article = server.create('article'); + let publishedArticle = server.create('article', 'published'); - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }) - }); + assert.deepEqual(article, { id: '1', title: 'Lorem ipsum' }); + assert.deepEqual(publishedArticle, { id: '2', title: 'Lorem ipsum', isPublished: true, + publishedAt: '2010-01-01 10:00:00' }); - let server = new Server({ - environment: 'test', - factories: { - article: ArticleFactory - } + server.shutdown(); }); - let article = server.create('article'); - let publishedArticle = server.create('article', 'published'); + test('create allows to extend factory with multiple traits', function(assert) { + let ArticleFactory = Factory.extend({ + title: 'Lorem ipsum', - assert.deepEqual(article, { id: '1', title: 'Lorem ipsum' }); - assert.deepEqual(publishedArticle, { id: '2', title: 'Lorem ipsum', isPublished: true, - publishedAt: '2010-01-01 10:00:00' }); + published: trait({ + isPublished: true, + publishedAt: '2010-01-01 10:00:00' + }), - server.shutdown(); -}); + withContent: trait({ + content: 'content' + }) + }); -test('create allows to extend factory with multiple traits', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', + let server = new Server({ + environment: 'test', + factories: { + article: ArticleFactory + } + }); - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), + let article = server.create('article'); + let publishedArticle = server.create('article', 'published'); + let publishedArticleWithContent = server.create('article', 'published', 'withContent'); - withContent: trait({ - content: 'content' - }) - }); + assert.deepEqual(article, { id: '1', title: 'Lorem ipsum' }); + assert.deepEqual(publishedArticle, { id: '2', title: 'Lorem ipsum', isPublished: true, + publishedAt: '2010-01-01 10:00:00' }); + assert.deepEqual(publishedArticleWithContent, { id: '3', title: 'Lorem ipsum', isPublished: true, + publishedAt: '2010-01-01 10:00:00', content: 'content' }); - let server = new Server({ - environment: 'test', - factories: { - article: ArticleFactory - } + server.shutdown(); }); - let article = server.create('article'); - let publishedArticle = server.create('article', 'published'); - let publishedArticleWithContent = server.create('article', 'published', 'withContent'); + test('create allows to extend factory with traits containing afterCreate callbacks', function(assert) { + let CommentFactory = Factory.extend({ + content: 'content' + }); + let ArticleFactory = Factory.extend({ + title: 'Lorem ipsum', - assert.deepEqual(article, { id: '1', title: 'Lorem ipsum' }); - assert.deepEqual(publishedArticle, { id: '2', title: 'Lorem ipsum', isPublished: true, - publishedAt: '2010-01-01 10:00:00' }); - assert.deepEqual(publishedArticleWithContent, { id: '3', title: 'Lorem ipsum', isPublished: true, - publishedAt: '2010-01-01 10:00:00', content: 'content' }); + withComments: trait({ + afterCreate(article, server) { + server.createList('comment', 3, { article }); + } + }) + }); - server.shutdown(); -}); + let server = new Server({ + environment: 'test', + factories: { + article: ArticleFactory, + comment: CommentFactory + } + }); -test('create allows to extend factory with traits containing afterCreate callbacks', function(assert) { - let CommentFactory = Factory.extend({ - content: 'content' - }); - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', + let articleWithComments = server.create('article', 'withComments'); - withComments: trait({ - afterCreate(article, server) { - server.createList('comment', 3, { article }); - } - }) - }); + assert.deepEqual(articleWithComments, { id: '1', title: 'Lorem ipsum' }); + assert.equal(server.db.comments.length, 3); - let server = new Server({ - environment: 'test', - factories: { - article: ArticleFactory, - comment: CommentFactory - } + server.shutdown(); }); - let articleWithComments = server.create('article', 'withComments'); + test('create does not execute afterCreate callbacks from traits that are not applied', function(assert) { + let CommentFactory = Factory.extend({ + content: 'content' + }); + let ArticleFactory = Factory.extend({ + title: 'Lorem ipsum', - assert.deepEqual(articleWithComments, { id: '1', title: 'Lorem ipsum' }); - assert.equal(server.db.comments.length, 3); + withComments: trait({ + afterCreate(article, server) { + server.createList('comment', 3, { article }); + } + }) + }); - server.shutdown(); -}); + let server = new Server({ + environment: 'test', + factories: { + article: ArticleFactory, + comment: CommentFactory + } + }); -test('create does not execute afterCreate callbacks from traits that are not applied', function(assert) { - let CommentFactory = Factory.extend({ - content: 'content' - }); - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', + let articleWithComments = server.create('article'); - withComments: trait({ - afterCreate(article, server) { - server.createList('comment', 3, { article }); - } - }) - }); + assert.deepEqual(articleWithComments, { id: '1', title: 'Lorem ipsum' }); + assert.equal(server.db.comments.length, 0); - let server = new Server({ - environment: 'test', - factories: { - article: ArticleFactory, - comment: CommentFactory - } + server.shutdown(); }); - let articleWithComments = server.create('article'); + test('create allows to extend with multiple traits and to apply attr overrides', function(assert) { + let ArticleFactory = Factory.extend({ + title: 'Lorem ipsum', - assert.deepEqual(articleWithComments, { id: '1', title: 'Lorem ipsum' }); - assert.equal(server.db.comments.length, 0); + published: trait({ + isPublished: true, + publishedAt: '2010-01-01 10:00:00' + }), - server.shutdown(); -}); + withContent: trait({ + content: 'content' + }) + }); -test('create allows to extend with multiple traits and to apply attr overrides', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', + let server = new Server({ + environment: 'test', + factories: { + article: ArticleFactory + } + }); - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), + let overrides = { + publishedAt: '2012-01-01 10:00:00' + }; + let publishedArticleWithContent = server.create('article', 'published', 'withContent', overrides); - withContent: trait({ - content: 'content' - }) - }); + assert.deepEqual(publishedArticleWithContent, { id: '1', title: 'Lorem ipsum', isPublished: true, + publishedAt: '2012-01-01 10:00:00', content: 'content' }); - let server = new Server({ - environment: 'test', - factories: { - article: ArticleFactory - } + server.shutdown(); }); - let overrides = { - publishedAt: '2012-01-01 10:00:00' - }; - let publishedArticleWithContent = server.create('article', 'published', 'withContent', overrides); + test('create throws errors when using trait that is not defined and distinquishes between traits and non-traits', function(assert) { + let ArticleFactory = Factory.extend({ + title: 'Lorem ipsum', - assert.deepEqual(publishedArticleWithContent, { id: '1', title: 'Lorem ipsum', isPublished: true, - publishedAt: '2012-01-01 10:00:00', content: 'content' }); + published: trait({ + isPublished: true, + publishedAt: '2010-01-01 10:00:00' + }), - server.shutdown(); -}); + private: { + someAttr: 'value' + } + }); -test('create throws errors when using trait that is not defined and distinquishes between traits and non-traits', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', + let server = new Server({ + environment: 'test', + factories: { + article: ArticleFactory + } + }); - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), + assert.throws(() => { + server.create('article', 'private'); + }, /'private' trait is not registered in 'article' factory/); - private: { - someAttr: 'value' - } + server.shutdown(); }); - let server = new Server({ - environment: 'test', - factories: { - article: ArticleFactory - } - }); + test('create allows to create objects with associations', function(assert) { + let AuthorFactory = Factory.extend({ + name: 'Sam' + }); + let CategoryFactory = Factory.extend({ + name: 'splendid software' + }); + let ArticleFactory = Factory.extend({ + title: 'Lorem ipsum', - assert.throws(() => { - server.create('article', 'private'); - }, /'private' trait is not registered in 'article' factory/); + withCategory: trait({ + awesomeCategory: association() + }), - server.shutdown(); -}); + author: association() + }); + + let server = new Server({ + environment: 'test', + models: { + author: Model.extend({ + articles: hasMany() + }), + category: Model.extend({ + }), + article: Model.extend({ + author: belongsTo(), + awesomeCategory: belongsTo('category') + }) + }, + factories: { + article: ArticleFactory, + author: AuthorFactory, + category: CategoryFactory + } + }); -test('create allows to create objects with associations', function(assert) { - let AuthorFactory = Factory.extend({ - name: 'Sam' - }); - let CategoryFactory = Factory.extend({ - name: 'splendid software' - }); - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', + let article = server.create('article', 'withCategory'); - withCategory: trait({ - awesomeCategory: association() - }), + assert.deepEqual(article.attrs, { title: 'Lorem ipsum', id: '1', authorId: '1', awesomeCategoryId: '1' }); + assert.equal(server.db.authors.length, 1); + assert.equal(server.db.categories.length, 1); - author: association() + let anotherArticle = server.create('article', 'withCategory'); + assert.deepEqual(anotherArticle.attrs, { title: 'Lorem ipsum', id: '2', authorId: '2', awesomeCategoryId: '2' }); + assert.equal(server.db.authors.length, 2); + assert.equal(server.db.categories.length, 2); }); - let server = new Server({ - environment: 'test', - models: { - author: Model.extend({ - articles: hasMany() - }), - category: Model.extend({ - }), - article: Model.extend({ - author: belongsTo(), - awesomeCategory: belongsTo('category') - }) - }, - factories: { - article: ArticleFactory, - author: AuthorFactory, - category: CategoryFactory - } - }); - - let article = server.create('article', 'withCategory'); + test('create allows to create objects with associations with traits and overrides for associations', function(assert) { + let CategoryFactory = Factory.extend({ + name: 'splendid software', - assert.deepEqual(article.attrs, { title: 'Lorem ipsum', id: '1', authorId: '1', awesomeCategoryId: '1' }); - assert.equal(server.db.authors.length, 1); - assert.equal(server.db.categories.length, 1); + published: trait({ + isPublished: true, + publishedAt: '2014-01-01 10:00:00' + }) + }); + let ArticleFactory = Factory.extend({ + title: 'Lorem ipsum', - let anotherArticle = server.create('article', 'withCategory'); - assert.deepEqual(anotherArticle.attrs, { title: 'Lorem ipsum', id: '2', authorId: '2', awesomeCategoryId: '2' }); - assert.equal(server.db.authors.length, 2); - assert.equal(server.db.categories.length, 2); -}); + withCategory: trait({ + category: association('published', { publishedAt: '2016-01-01 12:00:00' }) + }) + }); + + let server = new Server({ + environment: 'test', + factories: { + article: ArticleFactory, + category: CategoryFactory + }, + models: { + category: Model.extend({ + }), + article: Model.extend({ + category: belongsTo('category') + }) + } + }); -test('create allows to create objects with associations with traits and overrides for associations', function(assert) { - let CategoryFactory = Factory.extend({ - name: 'splendid software', + let article = server.create('article', 'withCategory'); - published: trait({ - isPublished: true, - publishedAt: '2014-01-01 10:00:00' - }) + assert.deepEqual(article.attrs, { title: 'Lorem ipsum', id: '1', categoryId: '1' }); + assert.equal(server.db.categories.length, 1); + assert.deepEqual( + server.db.categories[0], + { name: 'splendid software', id: '1', isPublished: true, publishedAt: '2016-01-01 12:00:00' } + ); }); - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', +}); - withCategory: trait({ - category: association('published', { publishedAt: '2016-01-01 12:00:00' }) - }) +module('Unit | Server #createList', function(hooks) { + hooks.beforeEach(function() { + this.server = new Server({ environment: 'test' }); }); - let server = new Server({ - environment: 'test', - factories: { - article: ArticleFactory, - category: CategoryFactory - }, - models: { - category: Model.extend({ - }), - article: Model.extend({ - category: belongsTo('category') - }) - } + hooks.afterEach(function() { + this.server.shutdown(); }); - let article = server.create('article', 'withCategory'); + test('createList adds the given number of elements to the db', function(assert) { + this.server.loadFactories({ + contact: Factory.extend({ name: 'Sam' }) + }); - assert.deepEqual(article.attrs, { title: 'Lorem ipsum', id: '1', categoryId: '1' }); - assert.equal(server.db.categories.length, 1); - assert.deepEqual( - server.db.categories[0], - { name: 'splendid software', id: '1', isPublished: true, publishedAt: '2016-01-01 12:00:00' } - ); -}); - -module('Unit | Server #createList', { - beforeEach() { - this.server = new Server({ environment: 'test' }); - }, - afterEach() { - this.server.shutdown(); - } -}); + this.server.createList('contact', 3); + let contactsInDb = this.server.db.contacts; -test('createList adds the given number of elements to the db', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ name: 'Sam' }) + assert.equal(contactsInDb.length, 3); + assert.deepEqual(contactsInDb[0], { id: '1', name: 'Sam' }); + assert.deepEqual(contactsInDb[1], { id: '2', name: 'Sam' }); + assert.deepEqual(contactsInDb[2], { id: '3', name: 'Sam' }); }); - this.server.createList('contact', 3); - let contactsInDb = this.server.db.contacts; + test('createList returns the created elements', function(assert) { + this.server.loadFactories({ + contact: Factory.extend({ name: 'Sam' }) + }); - assert.equal(contactsInDb.length, 3); - assert.deepEqual(contactsInDb[0], { id: '1', name: 'Sam' }); - assert.deepEqual(contactsInDb[1], { id: '2', name: 'Sam' }); - assert.deepEqual(contactsInDb[2], { id: '3', name: 'Sam' }); -}); + this.server.create('contact'); + let contacts = this.server.createList('contact', 3); -test('createList returns the created elements', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ name: 'Sam' }) + assert.equal(contacts.length, 3); + assert.deepEqual(contacts[0], { id: '2', name: 'Sam' }); + assert.deepEqual(contacts[1], { id: '3', name: 'Sam' }); + assert.deepEqual(contacts[2], { id: '4', name: 'Sam' }); }); - this.server.create('contact'); - let contacts = this.server.createList('contact', 3); + test('createList respects sequences', function(assert) { + this.server.loadFactories({ + contact: Factory.extend({ + name(i) { + return `name${i}`; + } + }) + }); - assert.equal(contacts.length, 3); - assert.deepEqual(contacts[0], { id: '2', name: 'Sam' }); - assert.deepEqual(contacts[1], { id: '3', name: 'Sam' }); - assert.deepEqual(contacts[2], { id: '4', name: 'Sam' }); -}); + let contacts = this.server.createList('contact', 3); -test('createList respects sequences', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ - name(i) { - return `name${i}`; - } - }) + assert.deepEqual(contacts[0], { id: '1', name: 'name0' }); + assert.deepEqual(contacts[1], { id: '2', name: 'name1' }); + assert.deepEqual(contacts[2], { id: '3', name: 'name2' }); }); - let contacts = this.server.createList('contact', 3); + test('createList respects attr overrides', function(assert) { + this.server.loadFactories({ + contact: Factory.extend({ name: 'Sam' }) + }); - assert.deepEqual(contacts[0], { id: '1', name: 'name0' }); - assert.deepEqual(contacts[1], { id: '2', name: 'name1' }); - assert.deepEqual(contacts[2], { id: '3', name: 'name2' }); -}); + let sams = this.server.createList('contact', 2); + let links = this.server.createList('contact', 2, { name: 'Link' }); -test('createList respects attr overrides', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ name: 'Sam' }) + assert.deepEqual(sams[0], { id: '1', name: 'Sam' }); + assert.deepEqual(sams[1], { id: '2', name: 'Sam' }); + assert.deepEqual(links[0], { id: '3', name: 'Link' }); + assert.deepEqual(links[1], { id: '4', name: 'Link' }); }); - let sams = this.server.createList('contact', 2); - let links = this.server.createList('contact', 2, { name: 'Link' }); + test('createList respects traits', function(assert) { + let ArticleFactory = Factory.extend({ + title: 'Lorem ipsum', - assert.deepEqual(sams[0], { id: '1', name: 'Sam' }); - assert.deepEqual(sams[1], { id: '2', name: 'Sam' }); - assert.deepEqual(links[0], { id: '3', name: 'Link' }); - assert.deepEqual(links[1], { id: '4', name: 'Link' }); -}); + published: trait({ + isPublished: true, + publishedAt: '2010-01-01 10:00:00' + }), -test('createList respects traits', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', + withContent: trait({ + content: 'content' + }) + }); - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), + this.server.loadFactories({ + article: ArticleFactory + }); - withContent: trait({ - content: 'content' - }) - }); + let articles = this.server.createList('article', 2, 'published', 'withContent'); - this.server.loadFactories({ - article: ArticleFactory + assert.deepEqual(articles[0], { id: '1', title: 'Lorem ipsum', isPublished: true, + publishedAt: '2010-01-01 10:00:00', content: 'content' }); + assert.deepEqual(articles[1], { id: '2', title: 'Lorem ipsum', isPublished: true, + publishedAt: '2010-01-01 10:00:00', content: 'content' }); }); - let articles = this.server.createList('article', 2, 'published', 'withContent'); + test('createList respects traits with attr overrides', function(assert) { + let ArticleFactory = Factory.extend({ + title: 'Lorem ipsum', - assert.deepEqual(articles[0], { id: '1', title: 'Lorem ipsum', isPublished: true, - publishedAt: '2010-01-01 10:00:00', content: 'content' }); - assert.deepEqual(articles[1], { id: '2', title: 'Lorem ipsum', isPublished: true, - publishedAt: '2010-01-01 10:00:00', content: 'content' }); -}); + published: trait({ + isPublished: true, + publishedAt: '2010-01-01 10:00:00' + }), -test('createList respects traits with attr overrides', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', + withContent: trait({ + content: 'content' + }) + }); - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), + this.server.loadFactories({ + article: ArticleFactory + }); - withContent: trait({ - content: 'content' - }) - }); + let overrides = { publishedAt: '2012-01-01 10:00:00' }; + let articles = this.server.createList('article', 2, 'published', 'withContent', overrides); - this.server.loadFactories({ - article: ArticleFactory + assert.deepEqual(articles[0], { id: '1', title: 'Lorem ipsum', isPublished: true, + publishedAt: '2012-01-01 10:00:00', content: 'content' }); + assert.deepEqual(articles[1], { id: '2', title: 'Lorem ipsum', isPublished: true, + publishedAt: '2012-01-01 10:00:00', content: 'content' }); }); - let overrides = { publishedAt: '2012-01-01 10:00:00' }; - let articles = this.server.createList('article', 2, 'published', 'withContent', overrides); + test('createList throws errors when using trait that is not defined and distinquishes between traits and non-traits', function(assert) { + let ArticleFactory = Factory.extend({ + title: 'Lorem ipsum', - assert.deepEqual(articles[0], { id: '1', title: 'Lorem ipsum', isPublished: true, - publishedAt: '2012-01-01 10:00:00', content: 'content' }); - assert.deepEqual(articles[1], { id: '2', title: 'Lorem ipsum', isPublished: true, - publishedAt: '2012-01-01 10:00:00', content: 'content' }); -}); - -test('createList throws errors when using trait that is not defined and distinquishes between traits and non-traits', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', + published: trait({ + isPublished: true, + publishedAt: '2010-01-01 10:00:00' + }), - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), + private: { + someAttr: 'value' + } + }); - private: { - someAttr: 'value' - } - }); + this.server.loadFactories({ + article: ArticleFactory + }); - this.server.loadFactories({ - article: ArticleFactory + assert.throws(() => { + this.server.createList('article', 2, 'private'); + }, /'private' trait is not registered in 'article' factory/); }); - assert.throws(() => { - this.server.createList('article', 2, 'private'); - }, /'private' trait is not registered in 'article' factory/); -}); + test('createList throws an error if the second argument is not an integer', function(assert) { + let ArticleFactory = Factory.extend({ + title: 'Lorem ipsum', -test('createList throws an error if the second argument is not an integer', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', + published: trait({ + isPublished: true, + publishedAt: '2010-01-01 10:00:00' + }) + }); - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }) - }); + this.server.loadFactories({ + article: ArticleFactory + }); - this.server.loadFactories({ - article: ArticleFactory + assert.throws(() => { + this.server.createList('article', 'published'); + }, /second argument has to be an integer, you passed: string/); }); - - assert.throws(() => { - this.server.createList('article', 'published'); - }, /second argument has to be an integer, you passed: string/); }); -module('Unit | Server #build', { - beforeEach() { +module('Unit | Server #build', function(hooks) { + hooks.beforeEach(function() { this.server = new Server({ environment: 'test' }); - }, - afterEach() { - this.server.shutdown(); - } -}); + }); -test('build does not add the data to the db', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ name: 'Sam' }) + hooks.afterEach(function() { + this.server.shutdown(); }); - this.server.build('contact'); - let contactsInDb = this.server.db.contacts; + test('build does not add the data to the db', function(assert) { + this.server.loadFactories({ + contact: Factory.extend({ name: 'Sam' }) + }); - assert.equal(contactsInDb.length, 0); -}); + this.server.build('contact'); + let contactsInDb = this.server.db.contacts; -test('build returns the new attrs with no id', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ name: 'Sam' }) + assert.equal(contactsInDb.length, 0); }); - let contact = this.server.build('contact'); + test('build returns the new attrs with no id', function(assert) { + this.server.loadFactories({ + contact: Factory.extend({ name: 'Sam' }) + }); - assert.deepEqual(contact, { name: 'Sam' }); -}); + let contact = this.server.build('contact'); -test('build allows for attr overrides', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ name: 'Sam' }) + assert.deepEqual(contact, { name: 'Sam' }); }); - let sam = this.server.build('contact'); - let link = this.server.build('contact', { name: 'Link' }); + test('build allows for attr overrides', function(assert) { + this.server.loadFactories({ + contact: Factory.extend({ name: 'Sam' }) + }); - assert.deepEqual(sam, { name: 'Sam' }); - assert.deepEqual(link, { name: 'Link' }); -}); + let sam = this.server.build('contact'); + let link = this.server.build('contact', { name: 'Link' }); -test('build allows for attr overrides with extended factories', function(assert) { - let ContactFactory = Factory.extend({ - name: 'Link', - age: 500 - }); - let FriendFactory = ContactFactory.extend({ - is_young() { - return this.age < 18; - } - }); - this.server.loadFactories({ - contact: ContactFactory, - friend: FriendFactory + assert.deepEqual(sam, { name: 'Sam' }); + assert.deepEqual(link, { name: 'Link' }); }); - let link = this.server.build('friend'); - let youngLink = this.server.build('friend', { age: 10 }); + test('build allows for attr overrides with extended factories', function(assert) { + let ContactFactory = Factory.extend({ + name: 'Link', + age: 500 + }); + let FriendFactory = ContactFactory.extend({ + is_young() { + return this.age < 18; + } + }); + this.server.loadFactories({ + contact: ContactFactory, + friend: FriendFactory + }); - assert.deepEqual(link, { name: 'Link', age: 500, is_young: false }); - assert.deepEqual(youngLink, { name: 'Link', age: 10, is_young: true }); -}); + let link = this.server.build('friend'); + let youngLink = this.server.build('friend', { age: 10 }); -test('build allows for attr overrides with arrays', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ name: ['Sam', 'Carl'] }) + assert.deepEqual(link, { name: 'Link', age: 500, is_young: false }); + assert.deepEqual(youngLink, { name: 'Link', age: 10, is_young: true }); }); - let sam = this.server.build('contact'); - let link = this.server.build('contact', { name: ['Link'] }); - let noname = this.server.build('contact', { name: [] }); + test('build allows for attr overrides with arrays', function(assert) { + this.server.loadFactories({ + contact: Factory.extend({ name: ['Sam', 'Carl'] }) + }); - assert.deepEqual(sam, { name: ['Sam', 'Carl'] }); - assert.deepEqual(link, { name: ['Link'] }); - assert.deepEqual(noname, { name: [] }); -}); + let sam = this.server.build('contact'); + let link = this.server.build('contact', { name: ['Link'] }); + let noname = this.server.build('contact', { name: [] }); -test('build allows for nested attr overrides', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ - address: { - streetName: 'Main', - streetAddress(i) { - return 1000 + i; - } - } - }) + assert.deepEqual(sam, { name: ['Sam', 'Carl'] }); + assert.deepEqual(link, { name: ['Link'] }); + assert.deepEqual(noname, { name: [] }); }); - let contact1 = this.server.build('contact'); - let contact2 = this.server.build('contact'); - - assert.deepEqual(contact1, { address: { streetName: 'Main', streetAddress: 1000 } }); - assert.deepEqual(contact2, { address: { streetName: 'Main', streetAddress: 1001 } }); -}); - -test('build allows for arrays of attr overrides', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ - websites: [ - 'http://example.com', - function(i) { - return `http://placekitten.com/${320 + i}/${240 + i}`; + test('build allows for nested attr overrides', function(assert) { + this.server.loadFactories({ + contact: Factory.extend({ + address: { + streetName: 'Main', + streetAddress(i) { + return 1000 + i; + } } - ] - }) - }); + }) + }); - let contact1 = this.server.build('contact'); - let contact2 = this.server.build('contact'); + let contact1 = this.server.build('contact'); + let contact2 = this.server.build('contact'); - assert.deepEqual(contact1, { websites: ['http://example.com', 'http://placekitten.com/320/240'] }); - assert.deepEqual(contact2, { websites: ['http://example.com', 'http://placekitten.com/321/241'] }); -}); + assert.deepEqual(contact1, { address: { streetName: 'Main', streetAddress: 1000 } }); + assert.deepEqual(contact2, { address: { streetName: 'Main', streetAddress: 1001 } }); + }); -test('build allows to extend factory with trait', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', + test('build allows for arrays of attr overrides', function(assert) { + this.server.loadFactories({ + contact: Factory.extend({ + websites: [ + 'http://example.com', + function(i) { + return `http://placekitten.com/${320 + i}/${240 + i}`; + } + ] + }) + }); - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }) - }); + let contact1 = this.server.build('contact'); + let contact2 = this.server.build('contact'); - this.server.loadFactories({ - article: ArticleFactory + assert.deepEqual(contact1, { websites: ['http://example.com', 'http://placekitten.com/320/240'] }); + assert.deepEqual(contact2, { websites: ['http://example.com', 'http://placekitten.com/321/241'] }); }); - let article = this.server.build('article'); - let publishedArticle = this.server.build('article', 'published'); + test('build allows to extend factory with trait', function(assert) { + let ArticleFactory = Factory.extend({ + title: 'Lorem ipsum', - assert.deepEqual(article, { title: 'Lorem ipsum' }); - assert.deepEqual(publishedArticle, { title: 'Lorem ipsum', isPublished: true, - publishedAt: '2010-01-01 10:00:00' }); -}); + published: trait({ + isPublished: true, + publishedAt: '2010-01-01 10:00:00' + }) + }); -test('build allows to extend factory with multiple traits', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', + this.server.loadFactories({ + article: ArticleFactory + }); - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), + let article = this.server.build('article'); + let publishedArticle = this.server.build('article', 'published'); - withContent: trait({ - content: 'content' - }) + assert.deepEqual(article, { title: 'Lorem ipsum' }); + assert.deepEqual(publishedArticle, { title: 'Lorem ipsum', isPublished: true, + publishedAt: '2010-01-01 10:00:00' }); }); - this.server.loadFactories({ - article: ArticleFactory - }); + test('build allows to extend factory with multiple traits', function(assert) { + let ArticleFactory = Factory.extend({ + title: 'Lorem ipsum', - let article = this.server.build('article'); - let publishedArticle = this.server.build('article', 'published'); - let publishedArticleWithContent = this.server.build('article', 'published', 'withContent'); + published: trait({ + isPublished: true, + publishedAt: '2010-01-01 10:00:00' + }), - assert.deepEqual(article, { title: 'Lorem ipsum' }); - assert.deepEqual(publishedArticle, { title: 'Lorem ipsum', isPublished: true, - publishedAt: '2010-01-01 10:00:00' }); - assert.deepEqual(publishedArticleWithContent, { title: 'Lorem ipsum', isPublished: true, - publishedAt: '2010-01-01 10:00:00', content: 'content' }); -}); + withContent: trait({ + content: 'content' + }) + }); -test('build allows to extend with multiple traits and to apply attr overrides', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', + this.server.loadFactories({ + article: ArticleFactory + }); - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), + let article = this.server.build('article'); + let publishedArticle = this.server.build('article', 'published'); + let publishedArticleWithContent = this.server.build('article', 'published', 'withContent'); - withContent: trait({ - content: 'content' - }) + assert.deepEqual(article, { title: 'Lorem ipsum' }); + assert.deepEqual(publishedArticle, { title: 'Lorem ipsum', isPublished: true, + publishedAt: '2010-01-01 10:00:00' }); + assert.deepEqual(publishedArticleWithContent, { title: 'Lorem ipsum', isPublished: true, + publishedAt: '2010-01-01 10:00:00', content: 'content' }); }); - this.server.loadFactories({ - article: ArticleFactory - }); + test('build allows to extend with multiple traits and to apply attr overrides', function(assert) { + let ArticleFactory = Factory.extend({ + title: 'Lorem ipsum', - let overrides = { - publishedAt: '2012-01-01 10:00:00' - }; - let publishedArticleWithContent = this.server.build('article', 'published', 'withContent', overrides); - - assert.deepEqual(publishedArticleWithContent, { title: 'Lorem ipsum', isPublished: true, - publishedAt: '2012-01-01 10:00:00', content: 'content' }); -}); - -test('build allows to build objects with associations', function(assert) { - let AuthorFactory = Factory.extend({ - name: 'Yehuda' - }); - let CategoryFactory = Factory.extend({ - name: 'splendid software' - }); - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', + published: trait({ + isPublished: true, + publishedAt: '2010-01-01 10:00:00' + }), - withCategory: trait({ - awesomeCategory: association() - }), + withContent: trait({ + content: 'content' + }) + }); - someOtherTrait: trait({ - user: association() - }), + this.server.loadFactories({ + article: ArticleFactory + }); - author: association() - }); + let overrides = { + publishedAt: '2012-01-01 10:00:00' + }; + let publishedArticleWithContent = this.server.build('article', 'published', 'withContent', overrides); - this.server.loadFactories({ - article: ArticleFactory, - author: AuthorFactory, - category: CategoryFactory + assert.deepEqual(publishedArticleWithContent, { title: 'Lorem ipsum', isPublished: true, + publishedAt: '2012-01-01 10:00:00', content: 'content' }); }); - this.server.schema.registerModels({ - author: Model.extend({ - articles: hasMany() - }), - category: Model.extend({ - }), - article: Model.extend({ - author: belongsTo(), - awesomeCategory: belongsTo('category') - }) - }); - - let article = this.server.build('article', 'withCategory'); - assert.deepEqual(article, { title: 'Lorem ipsum', authorId: '1', awesomeCategoryId: '1' }); - assert.equal(server.db.authors.length, 1); - assert.equal(server.db.categories.length, 1); -}); + test('build allows to build objects with associations', function(assert) { + let AuthorFactory = Factory.extend({ + name: 'Yehuda' + }); + let CategoryFactory = Factory.extend({ + name: 'splendid software' + }); + let ArticleFactory = Factory.extend({ + title: 'Lorem ipsum', -test('build allows to build objects with associations with traits and overrides for associations', function(assert) { - let CategoryFactory = Factory.extend({ - name: 'splendid software', + withCategory: trait({ + awesomeCategory: association() + }), - published: trait({ - isPublished: true, - publishedAt: '2014-01-01 10:00:00' - }) - }); - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', + someOtherTrait: trait({ + user: association() + }), - withCategory: trait({ - category: association('published', { publishedAt: '2016-01-01 12:00:00' }) - }) - }); + author: association() + }); - let server = new Server({ - environment: 'test', - factories: { + this.server.loadFactories({ article: ArticleFactory, + author: AuthorFactory, category: CategoryFactory - }, - models: { + }); + this.server.schema.registerModels({ + author: Model.extend({ + articles: hasMany() + }), category: Model.extend({ }), article: Model.extend({ - category: belongsTo() + author: belongsTo(), + awesomeCategory: belongsTo('category') }) - } + }); + + let article = this.server.build('article', 'withCategory'); + + assert.deepEqual(article, { title: 'Lorem ipsum', authorId: '1', awesomeCategoryId: '1' }); + assert.equal(server.db.authors.length, 1); + assert.equal(server.db.categories.length, 1); }); - let article = server.build('article', 'withCategory'); + test('build allows to build objects with associations with traits and overrides for associations', function(assert) { + let CategoryFactory = Factory.extend({ + name: 'splendid software', - assert.deepEqual(article, { title: 'Lorem ipsum', categoryId: '1' }); - assert.equal(server.db.categories.length, 1); - assert.deepEqual( - server.db.categories[0], - { name: 'splendid software', id: '1', isPublished: true, publishedAt: '2016-01-01 12:00:00' } - ); -}); + published: trait({ + isPublished: true, + publishedAt: '2014-01-01 10:00:00' + }) + }); + let ArticleFactory = Factory.extend({ + title: 'Lorem ipsum', -test('build throws errors when using trait that is not defined and distinquishes between traits and non-traits', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', + withCategory: trait({ + category: association('published', { publishedAt: '2016-01-01 12:00:00' }) + }) + }); + + let server = new Server({ + environment: 'test', + factories: { + article: ArticleFactory, + category: CategoryFactory + }, + models: { + category: Model.extend({ + }), + article: Model.extend({ + category: belongsTo() + }) + } + }); - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), + let article = server.build('article', 'withCategory'); - private: { - someAttr: 'value' - } + assert.deepEqual(article, { title: 'Lorem ipsum', categoryId: '1' }); + assert.equal(server.db.categories.length, 1); + assert.deepEqual( + server.db.categories[0], + { name: 'splendid software', id: '1', isPublished: true, publishedAt: '2016-01-01 12:00:00' } + ); }); - this.server.loadFactories({ - article: ArticleFactory - }); + test('build throws errors when using trait that is not defined and distinquishes between traits and non-traits', function(assert) { + let ArticleFactory = Factory.extend({ + title: 'Lorem ipsum', - assert.throws(() => { - this.server.build('article', 'private'); - }, /'private' trait is not registered in 'article' factory/); -}); + published: trait({ + isPublished: true, + publishedAt: '2010-01-01 10:00:00' + }), -test('build does not build objects and throws error if model is not registered and association helper is used', function(assert) { - let CategoryFactory = Factory.extend({ - name: 'splendid software', + private: { + someAttr: 'value' + } + }); - published: trait({ - isPublished: true, - publishedAt: '2014-01-01 10:00:00' - }) - }); - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', + this.server.loadFactories({ + article: ArticleFactory + }); - withCategory: trait({ - category: association('published', { publishedAt: '2016-01-01 12:00:00' }) - }) + assert.throws(() => { + this.server.build('article', 'private'); + }, /'private' trait is not registered in 'article' factory/); }); - let server = new Server({ - environment: 'test', - factories: { - article: ArticleFactory, - category: CategoryFactory - }, - models: { - category: Model.extend({ + test('build does not build objects and throws error if model is not registered and association helper is used', function(assert) { + let CategoryFactory = Factory.extend({ + name: 'splendid software', + + published: trait({ + isPublished: true, + publishedAt: '2014-01-01 10:00:00' + }) + }); + let ArticleFactory = Factory.extend({ + title: 'Lorem ipsum', + + withCategory: trait({ + category: association('published', { publishedAt: '2016-01-01 12:00:00' }) }) - } + }); + + let server = new Server({ + environment: 'test', + factories: { + article: ArticleFactory, + category: CategoryFactory + }, + models: { + category: Model.extend({ + }) + } + }); + + assert.throws(() => { + server.build('article', 'withCategory'); + }, /Model not registered: article/); }); - assert.throws(() => { - server.build('article', 'withCategory'); - }, /Model not registered: article/); -}); + test('build does not build objects and throws error if model for given association is not registered', function(assert) { + let CategoryFactory = Factory.extend({ + name: 'splendid software', + + published: trait({ + isPublished: true, + publishedAt: '2014-01-01 10:00:00' + }) + }); + let ArticleFactory = Factory.extend({ + title: 'Lorem ipsum', -test('build does not build objects and throws error if model for given association is not registered', function(assert) { - let CategoryFactory = Factory.extend({ - name: 'splendid software', + withCategory: trait({ + category: association('published', { publishedAt: '2016-01-01 12:00:00' }) + }) + }); + + let server = new Server({ + environment: 'test', + factories: { + article: ArticleFactory, + category: CategoryFactory + }, + models: { + article: Model.extend() + } + }); - published: trait({ - isPublished: true, - publishedAt: '2014-01-01 10:00:00' - }) + assert.throws(() => { + server.build('article', 'withCategory'); + }, /You're using the `association` factory helper on the 'category' attribute/); }); - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', +}); - withCategory: trait({ - category: association('published', { publishedAt: '2016-01-01 12:00:00' }) - }) +module('Unit | Server #buildList', function(hooks) { + hooks.beforeEach(function() { + this.server = new Server({ environment: 'test' }); }); - let server = new Server({ - environment: 'test', - factories: { - article: ArticleFactory, - category: CategoryFactory - }, - models: { - article: Model.extend() - } + hooks.afterEach(function() { + this.server.shutdown(); }); - assert.throws(() => { - server.build('article', 'withCategory'); - }, /You're using the `association` factory helper on the 'category' attribute/); -}); + test('buildList does not add elements to the db', function(assert) { + this.server.loadFactories({ + contact: Factory.extend({ name: 'Sam' }) + }); -module('Unit | Server #buildList', { - beforeEach() { - this.server = new Server({ environment: 'test' }); - }, - afterEach() { - this.server.shutdown(); - } -}); + this.server.buildList('contact', 3); + let contactsInDb = this.server.db.contacts; -test('buildList does not add elements to the db', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ name: 'Sam' }) + assert.equal(contactsInDb.length, 0); }); - this.server.buildList('contact', 3); - let contactsInDb = this.server.db.contacts; + test('buildList returns the built elements without ids', function(assert) { + this.server.loadFactories({ + contact: Factory.extend({ name: 'Sam' }) + }); - assert.equal(contactsInDb.length, 0); -}); + this.server.create('contact'); + let contacts = this.server.buildList('contact', 3); -test('buildList returns the built elements without ids', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ name: 'Sam' }) + assert.equal(contacts.length, 3); + assert.deepEqual(contacts[0], { name: 'Sam' }); + assert.deepEqual(contacts[1], { name: 'Sam' }); + assert.deepEqual(contacts[2], { name: 'Sam' }); }); - this.server.create('contact'); - let contacts = this.server.buildList('contact', 3); + test('buildList respects sequences', function(assert) { + this.server.loadFactories({ + contact: Factory.extend({ + name(i) { + return `name${i}`; + } + }) + }); - assert.equal(contacts.length, 3); - assert.deepEqual(contacts[0], { name: 'Sam' }); - assert.deepEqual(contacts[1], { name: 'Sam' }); - assert.deepEqual(contacts[2], { name: 'Sam' }); -}); + let contacts = this.server.buildList('contact', 3); -test('buildList respects sequences', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ - name(i) { - return `name${i}`; - } - }) + assert.deepEqual(contacts[0], { name: 'name0' }); + assert.deepEqual(contacts[1], { name: 'name1' }); + assert.deepEqual(contacts[2], { name: 'name2' }); }); - let contacts = this.server.buildList('contact', 3); + test('buildList respects attr overrides', function(assert) { + this.server.loadFactories({ + contact: Factory.extend({ name: 'Sam' }) + }); - assert.deepEqual(contacts[0], { name: 'name0' }); - assert.deepEqual(contacts[1], { name: 'name1' }); - assert.deepEqual(contacts[2], { name: 'name2' }); -}); + let sams = this.server.buildList('contact', 2); + let links = this.server.buildList('contact', 2, { name: 'Link' }); -test('buildList respects attr overrides', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ name: 'Sam' }) + assert.deepEqual(sams[0], { name: 'Sam' }); + assert.deepEqual(sams[1], { name: 'Sam' }); + assert.deepEqual(links[0], { name: 'Link' }); + assert.deepEqual(links[1], { name: 'Link' }); }); - let sams = this.server.buildList('contact', 2); - let links = this.server.buildList('contact', 2, { name: 'Link' }); + test('buildList respects traits', function(assert) { + let ArticleFactory = Factory.extend({ + title: 'Lorem ipsum', - assert.deepEqual(sams[0], { name: 'Sam' }); - assert.deepEqual(sams[1], { name: 'Sam' }); - assert.deepEqual(links[0], { name: 'Link' }); - assert.deepEqual(links[1], { name: 'Link' }); -}); + published: trait({ + isPublished: true, + publishedAt: '2010-01-01 10:00:00' + }), -test('buildList respects traits', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', + withContent: trait({ + content: 'content' + }) + }); - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), + this.server.loadFactories({ + article: ArticleFactory + }); - withContent: trait({ - content: 'content' - }) - }); + let articles = this.server.buildList('article', 2, 'published', 'withContent'); - this.server.loadFactories({ - article: ArticleFactory + assert.deepEqual(articles[0], { title: 'Lorem ipsum', isPublished: true, + publishedAt: '2010-01-01 10:00:00', content: 'content' }); + assert.deepEqual(articles[1], { title: 'Lorem ipsum', isPublished: true, + publishedAt: '2010-01-01 10:00:00', content: 'content' }); }); - let articles = this.server.buildList('article', 2, 'published', 'withContent'); + test('buildList respects traits with attr overrides', function(assert) { + let ArticleFactory = Factory.extend({ + title: 'Lorem ipsum', - assert.deepEqual(articles[0], { title: 'Lorem ipsum', isPublished: true, - publishedAt: '2010-01-01 10:00:00', content: 'content' }); - assert.deepEqual(articles[1], { title: 'Lorem ipsum', isPublished: true, - publishedAt: '2010-01-01 10:00:00', content: 'content' }); -}); + published: trait({ + isPublished: true, + publishedAt: '2010-01-01 10:00:00' + }), -test('buildList respects traits with attr overrides', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', + withContent: trait({ + content: 'content' + }) + }); - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), + this.server.loadFactories({ + article: ArticleFactory + }); - withContent: trait({ - content: 'content' - }) - }); + let overrides = { publishedAt: '2012-01-01 10:00:00' }; + let articles = this.server.buildList('article', 2, 'published', 'withContent', overrides); - this.server.loadFactories({ - article: ArticleFactory + assert.deepEqual(articles[0], { title: 'Lorem ipsum', isPublished: true, + publishedAt: '2012-01-01 10:00:00', content: 'content' }); + assert.deepEqual(articles[1], { title: 'Lorem ipsum', isPublished: true, + publishedAt: '2012-01-01 10:00:00', content: 'content' }); }); - let overrides = { publishedAt: '2012-01-01 10:00:00' }; - let articles = this.server.buildList('article', 2, 'published', 'withContent', overrides); - - assert.deepEqual(articles[0], { title: 'Lorem ipsum', isPublished: true, - publishedAt: '2012-01-01 10:00:00', content: 'content' }); - assert.deepEqual(articles[1], { title: 'Lorem ipsum', isPublished: true, - publishedAt: '2012-01-01 10:00:00', content: 'content' }); -}); + test('buildList throws errors when using trait that is not defined and distinquishes between traits and non-traits', function(assert) { + let ArticleFactory = Factory.extend({ + title: 'Lorem ipsum', -test('buildList throws errors when using trait that is not defined and distinquishes between traits and non-traits', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', + published: trait({ + isPublished: true, + publishedAt: '2010-01-01 10:00:00' + }), - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), + private: { + someAttr: 'value' + } + }); - private: { - someAttr: 'value' - } - }); + this.server.loadFactories({ + article: ArticleFactory + }); - this.server.loadFactories({ - article: ArticleFactory + assert.throws(() => { + this.server.buildList('article', 2, 'private'); + }, /'private' trait is not registered in 'article' factory/); }); - assert.throws(() => { - this.server.buildList('article', 2, 'private'); - }, /'private' trait is not registered in 'article' factory/); -}); + test('buildList throws an error if the second argument is not an integer', function(assert) { + let ArticleFactory = Factory.extend({ + title: 'Lorem ipsum', -test('buildList throws an error if the second argument is not an integer', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', + published: trait({ + isPublished: true, + publishedAt: '2010-01-01 10:00:00' + }) + }); - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }) - }); + this.server.loadFactories({ + article: ArticleFactory + }); - this.server.loadFactories({ - article: ArticleFactory + assert.throws(() => { + this.server.buildList('article', 'published'); + }, /second argument has to be an integer, you passed: string/); }); - - assert.throws(() => { - this.server.buildList('article', 'published'); - }, /second argument has to be an integer, you passed: string/); }); -module('Unit | Server #defaultPassthroughs'); +module('Unit | Server #defaultPassthroughs', function() { + test('server configures default passthroughs when useDefaultPassthroughs is true', function(assert) { + let server = new Server({ useDefaultPassthroughs: true }); -test('server configures default passthroughs when useDefaultPassthroughs is true', function(assert) { - let server = new Server({ useDefaultPassthroughs: true }); + assert.expect(defaultPassthroughs.length); + defaultPassthroughs.forEach((passthroughUrl) => { + let passthroughRequest = { method: 'GET', url: passthroughUrl }; + let isPassedThrough = server.pretender.checkPassthrough(passthroughRequest); - assert.expect(defaultPassthroughs.length); - defaultPassthroughs.forEach((passthroughUrl) => { - let passthroughRequest = { method: 'GET', url: passthroughUrl }; - let isPassedThrough = server.pretender.checkPassthrough(passthroughRequest); + assert.ok(isPassedThrough); + }); - assert.ok(isPassedThrough); + server.shutdown(); }); - server.shutdown(); -}); + test('server does not configure default passthroughs when useDefaultPassthroughs is false', function(assert) { + let server = new Server({ useDefaultPassthroughs: false }); -test('server does not configure default passthroughs when useDefaultPassthroughs is false', function(assert) { - let server = new Server({ useDefaultPassthroughs: false }); + assert.expect(defaultPassthroughs.length); + defaultPassthroughs.forEach((passthroughUrl) => { + let passthroughRequest = { method: 'GET', url: passthroughUrl }; + let isPassedThrough = server.pretender.checkPassthrough(passthroughRequest); - assert.expect(defaultPassthroughs.length); - defaultPassthroughs.forEach((passthroughUrl) => { - let passthroughRequest = { method: 'GET', url: passthroughUrl }; - let isPassedThrough = server.pretender.checkPassthrough(passthroughRequest); + assert.ok(!isPassedThrough); + }); - assert.ok(!isPassedThrough); + server.shutdown(); }); - - server.shutdown(); }); diff --git a/tests/unit/utils/normalize-name-test.js b/tests/unit/utils/normalize-name-test.js index d17963cd8..f9853a0e8 100644 --- a/tests/unit/utils/normalize-name-test.js +++ b/tests/unit/utils/normalize-name-test.js @@ -3,24 +3,24 @@ import Inflector from 'ember-inflector'; import {module, test} from 'qunit'; -module('Unit | Normalize name'); +module('Unit | Normalize name', function() { + test('can convert Model name to DbCollection name', function(assert) { + assert.equal(toCollectionName('test'), 'tests'); + assert.equal(toCollectionName('hard-test'), 'hardTests'); + }); -test('can convert Model name to DbCollection name', function(assert) { - assert.equal(toCollectionName('test'), 'tests'); - assert.equal(toCollectionName('hard-test'), 'hardTests'); -}); - -test('can convert DbCollection name to Model name', function(assert) { - assert.equal(toModelName('tests'), 'test'); - assert.equal(toModelName('hardTests'), 'hard-test'); -}); + test('can convert DbCollection name to Model name', function(assert) { + assert.equal(toModelName('tests'), 'test'); + assert.equal(toModelName('hardTests'), 'hard-test'); + }); -test('can convert Model name to DbCollection using custom inflector rules', function(assert) { - Inflector.inflector.irregular('head-of-state', 'heads-of-state'); - assert.equal(toCollectionName('head-of-state'), 'headsOfState'); -}); + test('can convert Model name to DbCollection using custom inflector rules', function(assert) { + Inflector.inflector.irregular('head-of-state', 'heads-of-state'); + assert.equal(toCollectionName('head-of-state'), 'headsOfState'); + }); -test('can convert DbCollection name to Model name using custom inflector rules', function(assert) { - Inflector.inflector.irregular('head-of-state', 'heads-of-state'); - assert.equal(toModelName('headsOfState'), 'head-of-state'); + test('can convert DbCollection name to Model name using custom inflector rules', function(assert) { + Inflector.inflector.irregular('head-of-state', 'heads-of-state'); + assert.equal(toModelName('headsOfState'), 'head-of-state'); + }); }); From d310ea2123c2af28892e6a994e71e148f90b0bd4 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Thu, 26 Oct 2017 23:13:09 +0200 Subject: [PATCH 105/879] tests: Remove unnecessary line breaks and indentation --- .../1-basic/association-create-test.js | 39 +- .../1-basic/association-new-test.js | 43 +- .../1-basic/association-set-id-test.js | 57 +- .../1-basic/association-set-test.js | 63 +- .../belongs-to/1-basic/instantiating-test.js | 161 ++-- .../accessor-test.js | 55 +- .../association-create-test.js | 41 +- .../association-new-test.js | 47 +- .../association-set-id-test.js | 65 +- .../association-set-test.js | 77 +- .../10-one-to-one-polymorphic/create-test.js | 107 ++- .../10-one-to-one-polymorphic/delete-test.js | 35 +- .../instantiating-test.js | 163 ++-- .../2-named/association-create-test.js | 39 +- .../2-named/association-new-test.js | 43 +- .../2-named/association-set-id-test.js | 57 +- .../2-named/association-set-test.js | 63 +- .../belongs-to/2-named/instantiating-test.js | 161 ++-- .../3-reflexive/association-create-test.js | 51 +- .../3-reflexive/association-new-test.js | 53 +- .../3-reflexive/association-set-id-test.js | 85 +- .../3-reflexive/association-set-test.js | 101 ++- .../3-reflexive/instantiating-test.js | 163 ++-- .../4-named-reflexive/accessor-test.js | 55 +- .../association-create-test.js | 39 +- .../4-named-reflexive/association-new-test.js | 43 +- .../association-set-id-test.js | 57 +- .../4-named-reflexive/association-set-test.js | 63 +- .../4-named-reflexive/create-test.js | 99 ++- .../4-named-reflexive/delete-test.js | 35 +- .../4-named-reflexive/instantiating-test.js | 163 ++-- .../accessor-test.js | 55 +- .../association-create-test.js | 39 +- .../association-new-test.js | 43 +- .../association-set-id-test.js | 57 +- .../association-set-test.js | 63 +- .../create-test.js | 99 ++- .../delete-test.js | 35 +- .../instantiating-test.js | 163 ++-- .../6-one-way-reflexive/accessor-test.js | 45 +- .../association-create-test.js | 39 +- .../association-new-test.js | 43 +- .../association-set-id-test.js | 57 +- .../association-set-test.js | 63 +- .../6-one-way-reflexive/create-test.js | 99 ++- .../6-one-way-reflexive/delete-test.js | 35 +- .../6-one-way-reflexive/instantiating-test.js | 161 ++-- .../accessor-test.js | 45 +- .../association-create-test.js | 39 +- .../association-new-test.js | 43 +- .../association-set-id-test.js | 57 +- .../association-set-test.js | 63 +- .../7-named-one-way-reflexive/create-test.js | 99 ++- .../7-named-one-way-reflexive/delete-test.js | 35 +- .../instantiating-test.js | 161 ++-- .../belongs-to/8-one-to-one/accessor-test.js | 55 +- .../8-one-to-one/association-create-test.js | 41 +- .../8-one-to-one/association-new-test.js | 47 +- .../8-one-to-one/association-set-id-test.js | 75 +- .../8-one-to-one/association-set-test.js | 77 +- .../8-one-to-one/instantiating-test.js | 163 ++-- .../9-one-way-polymorphic/accessor-test.js | 33 +- .../association-create-test.js | 39 +- .../association-new-test.js | 43 +- .../association-set-id-test.js | 57 +- .../association-set-test.js | 63 +- .../9-one-way-polymorphic/create-test.js | 61 +- .../9-one-way-polymorphic/delete-test.js | 35 +- .../instantiating-test.js | 161 ++-- .../orm/collection-inflector-test.js | 29 +- .../1-basic/association-create-test.js | 43 +- .../has-many/1-basic/association-new-test.js | 47 +- .../1-basic/association-set-ids-test.js | 49 +- .../has-many/1-basic/association-set-test.js | 75 +- .../accessor-test.js | 67 +- .../association-create-test.js | 53 +- .../association-new-test.js | 55 +- .../association-set-ids-test.js | 73 +- .../association-set-test.js | 111 ++- .../create-test.js | 93 ++- .../delete-test.js | 35 +- .../instantiating-test.js | 125 ++- .../2-named/association-create-test.js | 43 +- .../has-many/2-named/association-new-test.js | 47 +- .../2-named/association-set-ids-test.js | 49 +- .../has-many/2-named/association-set-test.js | 75 +- .../3-reflexive/association-create-test.js | 63 +- .../3-reflexive/association-new-test.js | 53 +- .../3-reflexive/association-set-ids-test.js | 67 +- .../3-reflexive/association-set-test.js | 111 ++- .../4-named-reflexive/accessor-test.js | 41 +- .../association-create-test.js | 45 +- .../4-named-reflexive/association-new-test.js | 51 +- .../association-set-ids-test.js | 67 +- .../4-named-reflexive/association-set-test.js | 111 ++- .../has-many/4-named-reflexive/create-test.js | 153 ++-- .../has-many/4-named-reflexive/delete-test.js | 35 +- .../accessor-test.js | 41 +- .../association-create-test.js | 45 +- .../association-new-test.js | 51 +- .../association-set-ids-test.js | 67 +- .../association-set-test.js | 111 ++- .../create-test.js | 153 ++-- .../delete-test.js | 35 +- .../new-test.js | 125 ++- .../6-one-way-reflexive/accessor-test.js | 37 +- .../association-create-test.js | 45 +- .../association-new-test.js | 51 +- .../association-set-ids-test.js | 51 +- .../association-set-test.js | 87 +-- .../6-one-way-reflexive/create-test.js | 149 ++-- .../6-one-way-reflexive/delete-test.js | 35 +- .../has-many/6-one-way-reflexive/new-test.js | 125 ++- .../accessor-test.js | 37 +- .../association-create-test.js | 45 +- .../association-new-test.js | 51 +- .../association-set-ids-test.js | 51 +- .../association-set-test.js | 87 +-- .../7-named-one-way-reflexive/create-test.js | 149 ++-- .../7-named-one-way-reflexive/delete-test.js | 35 +- .../7-named-one-way-reflexive/new-test.js | 125 ++- .../has-many/8-many-to-many/accessor-test.js | 41 +- .../8-many-to-many/association-create-test.js | 45 +- .../8-many-to-many/association-new-test.js | 51 +- .../association-set-ids-test.js | 67 +- .../8-many-to-many/association-set-test.js | 111 ++- .../9-one-way-polymorphic/accessor-test.js | 43 +- .../association-create-test.js | 51 +- .../association-new-test.js | 51 +- .../association-set-ids-test.js | 49 +- .../association-set-test.js | 75 +- .../9-one-way-polymorphic/create-test.js | 141 ++-- .../9-one-way-polymorphic/delete-test.js | 35 +- .../instantiating-test.js | 125 ++- .../1-one-to-many/association-create-test.js | 49 +- .../1-one-to-many/association-new-test.js | 47 +- .../1-one-to-many/association-set-ids-test.js | 99 ++- .../1-one-to-many/association-set-test.js | 123 ++- .../mixed/1-one-to-many/instantiating-test.js | 125 ++- .../2-many-to-one/association-create-test.js | 51 +- .../2-many-to-one/association-new-test.js | 61 +- .../2-many-to-one/association-set-ids-test.js | 77 +- .../2-many-to-one/association-set-test.js | 97 ++- .../mixed/2-many-to-one/instantiating-test.js | 189 +++-- .../accessor-test.js | 65 +- .../association-create-test.js | 57 +- .../association-new-test.js | 51 +- .../association-set-ids-test.js | 99 ++- .../association-set-test.js | 123 ++- .../3-one-to-many-polymorphic/create-test.js | 103 ++- .../3-one-to-many-polymorphic/delete-test.js | 35 +- .../instantiating-test.js | 125 ++- .../associations/embedded-collection-test.js | 293 ++++--- .../base/associations/embedded-model-test.js | 343 ++++---- .../base/associations/many-to-many-test.js | 131 ++-- .../polymorphic-belongs-to-test.js | 77 +- .../associations/polymorphic-has-many-test.js | 77 +- .../sideloading-assorted-collections-test.js | 115 ++- .../sideloading-collection-test.js | 365 +++++---- .../associations/sideloading-model-test.js | 321 ++++---- .../base/assorted-collections-test.js | 71 +- .../base/attribute-key-formatting-test.js | 87 +-- .../base/override-serialize-test.js | 111 ++- .../associations/collection-test.js | 735 +++++++++--------- .../associations/includes-test.js | 719 +++++++++-------- .../associations/key-for-relationship-test.js | 111 ++- .../associations/links-test.js | 215 +++-- .../associations/many-to-many-test.js | 237 +++--- .../associations/model-test.js | 645 ++++++++------- .../associations/polymorphic-test.js | 227 +++--- .../json-api-serializer/attrs-test.js | 165 ++-- .../json-api-serializer/base-test.js | 103 ++- .../key-formatting-test.js | 125 ++- tests/unit/db-test.js | 69 +- .../route-handlers/shorthands/base-test.js | 301 ++++--- 175 files changed, 8072 insertions(+), 8597 deletions(-) diff --git a/tests/integration/orm/belongs-to/1-basic/association-create-test.js b/tests/integration/orm/belongs-to/1-basic/association-create-test.js index 50f09a186..7b787ec6e 100644 --- a/tests/integration/orm/belongs-to/1-basic/association-create-test.js +++ b/tests/integration/orm/belongs-to/1-basic/association-create-test.js @@ -1,29 +1,26 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Basic | association #create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a belongs-to association, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | Basic | association #create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can create an associated parent`, function(assert) { - let [ post ] = this.helper[state](); + /* + The model can create a belongs-to association, for all states + */ + states.forEach((state) => { - let ganon = post.createAuthor({ name: 'Ganon' }); + test(`a ${state} can create an associated parent`, function(assert) { + let [ post ] = this.helper[state](); - assert.ok(ganon.id, 'the parent was persisted'); - assert.deepEqual(post.author.attrs, ganon.attrs); - assert.equal(post.authorId, ganon.id); - assert.equal(this.helper.schema.posts.find(post.id).authorId, ganon.id, 'the child was persisted'); - }); + let ganon = post.createAuthor({ name: 'Ganon' }); + assert.ok(ganon.id, 'the parent was persisted'); + assert.deepEqual(post.author.attrs, ganon.attrs); + assert.equal(post.authorId, ganon.id); + assert.equal(this.helper.schema.posts.find(post.id).authorId, ganon.id, 'the child was persisted'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/1-basic/association-new-test.js b/tests/integration/orm/belongs-to/1-basic/association-new-test.js index 364c4a41d..82043ff86 100644 --- a/tests/integration/orm/belongs-to/1-basic/association-new-test.js +++ b/tests/integration/orm/belongs-to/1-basic/association-new-test.js @@ -1,34 +1,31 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Basic | association #new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ +module('Integration | ORM | Belongs To | Basic | association #new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + /* + The model can make a new unsaved belongs-to association, for all states + */ - test(`a ${state} can build a new associated parent`, function(assert) { - let [ post ] = this.helper[state](); + states.forEach((state) => { - let ganon = post.newAuthor({ name: 'Ganon' }); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ post ] = this.helper[state](); - assert.ok(!ganon.id, 'the parent was not persisted'); - assert.deepEqual(post.author, ganon); - assert.equal(post.authorId, null); + let ganon = post.newAuthor({ name: 'Ganon' }); - post.save(); + assert.ok(!ganon.id, 'the parent was not persisted'); + assert.deepEqual(post.author, ganon); + assert.equal(post.authorId, null); - assert.ok(ganon.id, 'saving the child persists the parent'); - assert.equal(post.authorId, ganon.id, 'the childs fk was updated'); - }); + post.save(); + assert.ok(ganon.id, 'saving the child persists the parent'); + assert.equal(post.authorId, ganon.id, 'the childs fk was updated'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/1-basic/association-set-id-test.js b/tests/integration/orm/belongs-to/1-basic/association-set-id-test.js index 75424aa75..6e0394465 100644 --- a/tests/integration/orm/belongs-to/1-basic/association-set-id-test.js +++ b/tests/integration/orm/belongs-to/1-basic/association-set-id-test.js @@ -1,44 +1,41 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Basic | association #setId', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | Basic | association #setId', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ post ] = this.helper[state](); - let savedAuthor = this.helper.savedParent(); + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - post.authorId = savedAuthor.id; + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ post ] = this.helper[state](); + let savedAuthor = this.helper.savedParent(); - assert.equal(post.authorId, savedAuthor.id); - assert.deepEqual(post.author.attrs, savedAuthor.attrs); - }); + post.authorId = savedAuthor.id; + assert.equal(post.authorId, savedAuthor.id); + assert.deepEqual(post.author.attrs, savedAuthor.attrs); }); - [ - 'savedChildSavedParent', - 'newChildSavedParent' - ].forEach((state) => { + }); - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ post ] = this.helper[state](); + [ + 'savedChildSavedParent', + 'newChildSavedParent' + ].forEach((state) => { - post.authorId = null; + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ post ] = this.helper[state](); - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - }); + post.authorId = null; + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/1-basic/association-set-test.js b/tests/integration/orm/belongs-to/1-basic/association-set-test.js index 0b368c261..9da46642b 100644 --- a/tests/integration/orm/belongs-to/1-basic/association-set-test.js +++ b/tests/integration/orm/belongs-to/1-basic/association-set-test.js @@ -1,47 +1,44 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Basic | association #set', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | Basic | association #set', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ post ] = this.helper[state](); - let savedAuthor = this.helper.savedParent(); + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - post.author = savedAuthor; + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ post ] = this.helper[state](); + let savedAuthor = this.helper.savedParent(); - assert.equal(post.authorId, savedAuthor.id); - assert.deepEqual(post.author, savedAuthor); - }); + post.author = savedAuthor; - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ post ] = this.helper[state](); - let newAuthor = this.helper.newParent(); + assert.equal(post.authorId, savedAuthor.id); + assert.deepEqual(post.author, savedAuthor); + }); - post.author = newAuthor; + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ post ] = this.helper[state](); + let newAuthor = this.helper.newParent(); - assert.equal(post.authorId, null); - assert.deepEqual(post.author, newAuthor); - }); + post.author = newAuthor; - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ post ] = this.helper[state](); + assert.equal(post.authorId, null); + assert.deepEqual(post.author, newAuthor); + }); - post.author = null; + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ post ] = this.helper[state](); - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - }); + post.author = null; + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/1-basic/instantiating-test.js b/tests/integration/orm/belongs-to/1-basic/instantiating-test.js index e5655c25e..4d27ee4a3 100644 --- a/tests/integration/orm/belongs-to/1-basic/instantiating-test.js +++ b/tests/integration/orm/belongs-to/1-basic/instantiating-test.js @@ -1,85 +1,82 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Basic | instantiating', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the child accepts a saved parent id', function(assert) { - let author = this.helper.savedParent(); - let post = this.schema.posts.new({ authorId: author.id }); - - assert.equal(post.authorId, author.id); - assert.deepEqual(post.author, author); - assert.deepEqual(post.attrs, { authorId: author.id }); - }); - - test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.posts.new({ authorId: 2 }); - }, /You're instantiating a post that has a authorId of 2, but that record doesn't exist in the database/); - }); - - test('the child accepts a null parent id', function(assert) { - let post = this.schema.posts.new({ authorId: null }); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - assert.deepEqual(post.attrs, { authorId: null }); - }); - - test('the child accepts a saved parent model', function(assert) { - let author = this.helper.savedParent(); - let post = this.schema.posts.new({ author }); - - assert.equal(post.authorId, 1); - assert.deepEqual(post.author, author); - }); - - test('the child accepts a new parent model', function(assert) { - let zelda = this.schema.authors.new({ name: 'Zelda' }); - let post = this.schema.posts.new({ author: zelda }); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, zelda); - assert.deepEqual(post.attrs, { authorId: null }); - }); - - test('the child accepts a null parent model', function(assert) { - let post = this.schema.posts.new({ author: null }); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - assert.deepEqual(post.attrs, { authorId: null }); - }); - - test('the child accepts a parent model and id', function(assert) { - let author = this.helper.savedParent(); - let post = this.schema.posts.new({ author, authorId: author.id }); - - assert.equal(post.authorId, '1'); - assert.deepEqual(post.author, author); - assert.deepEqual(post.attrs, { authorId: author.id }); - }); - - test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let post = this.schema.posts.new({}); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - assert.deepEqual(post.attrs, { authorId: null }); - }); - - test('the child accepts no reference to a parent id or model', function(assert) { - let post = this.schema.posts.new(); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - assert.deepEqual(post.attrs, { authorId: null }); - }); - } -); +module('Integration | ORM | Belongs To | Basic | instantiating', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the child accepts a saved parent id', function(assert) { + let author = this.helper.savedParent(); + let post = this.schema.posts.new({ authorId: author.id }); + + assert.equal(post.authorId, author.id); + assert.deepEqual(post.author, author); + assert.deepEqual(post.attrs, { authorId: author.id }); + }); + + test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.posts.new({ authorId: 2 }); + }, /You're instantiating a post that has a authorId of 2, but that record doesn't exist in the database/); + }); + + test('the child accepts a null parent id', function(assert) { + let post = this.schema.posts.new({ authorId: null }); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + assert.deepEqual(post.attrs, { authorId: null }); + }); + + test('the child accepts a saved parent model', function(assert) { + let author = this.helper.savedParent(); + let post = this.schema.posts.new({ author }); + + assert.equal(post.authorId, 1); + assert.deepEqual(post.author, author); + }); + + test('the child accepts a new parent model', function(assert) { + let zelda = this.schema.authors.new({ name: 'Zelda' }); + let post = this.schema.posts.new({ author: zelda }); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, zelda); + assert.deepEqual(post.attrs, { authorId: null }); + }); + + test('the child accepts a null parent model', function(assert) { + let post = this.schema.posts.new({ author: null }); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + assert.deepEqual(post.attrs, { authorId: null }); + }); + + test('the child accepts a parent model and id', function(assert) { + let author = this.helper.savedParent(); + let post = this.schema.posts.new({ author, authorId: author.id }); + + assert.equal(post.authorId, '1'); + assert.deepEqual(post.author, author); + assert.deepEqual(post.attrs, { authorId: author.id }); + }); + + test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let post = this.schema.posts.new({}); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + assert.deepEqual(post.attrs, { authorId: null }); + }); + + test('the child accepts no reference to a parent id or model', function(assert) { + let post = this.schema.posts.new(); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + assert.deepEqual(post.attrs, { authorId: null }); + }); +}); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/accessor-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/accessor-test.js index ed84ab33d..5483c2bcd 100644 --- a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/accessor-test.js +++ b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/accessor-test.js @@ -1,37 +1,34 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One-to-one Polymorphic | accessor', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | One-to-one Polymorphic | accessor', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`the references of a ${state} are correct`, function(assert) { - let [ comment, post ] = this.helper[state](); + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { - // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison - if (post) { - assert.deepEqual(comment.commentable.attrs, post.attrs, 'the model reference is correct'); - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }, 'the modelId reference is correct'); - } else { - assert.deepEqual(comment.commentable, null, 'the model reference is correct'); - assert.equal(comment.commentableId, null, 'the modelId reference is correct'); - } + test(`the references of a ${state} are correct`, function(assert) { + let [ comment, post ] = this.helper[state](); - // If there's a post in this state, make sure the inverse association is correct - if (post) { - assert.deepEqual(post.comment.attrs, comment.attrs, 'the inverse model reference is correct'); - assert.equal(post.commentId, comment.id, 'the inverse modelId reference is correct'); - } - }); + // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison + if (post) { + assert.deepEqual(comment.commentable.attrs, post.attrs, 'the model reference is correct'); + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }, 'the modelId reference is correct'); + } else { + assert.deepEqual(comment.commentable, null, 'the model reference is correct'); + assert.equal(comment.commentableId, null, 'the modelId reference is correct'); + } + // If there's a post in this state, make sure the inverse association is correct + if (post) { + assert.deepEqual(post.comment.attrs, comment.attrs, 'the inverse model reference is correct'); + assert.equal(post.commentId, comment.id, 'the inverse modelId reference is correct'); + } }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-create-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-create-test.js index f8071752f..ab8b7ea8a 100644 --- a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-create-test.js +++ b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-create-test.js @@ -1,30 +1,27 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One-to-one Polymorphic | association #create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a belongs-to association, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | One-to-one Polymorphic | association #create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can create an associated parent`, function(assert) { - let [ comment ] = this.helper[state](); + /* + The model can create a belongs-to association, for all states + */ + states.forEach((state) => { - let post = comment.createCommentable('post', { title: 'Lorem' }); + test(`a ${state} can create an associated parent`, function(assert) { + let [ comment ] = this.helper[state](); - assert.ok(post.id, 'the parent was persisted'); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.deepEqual(post.comment.attrs, comment.attrs, 'the inverse was set'); - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); - assert.deepEqual(this.helper.schema.comments.find(comment.id).commentableId, { type: 'post', id: post.id }, 'the comment was persisted'); - }); + let post = comment.createCommentable('post', { title: 'Lorem' }); + assert.ok(post.id, 'the parent was persisted'); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.deepEqual(post.comment.attrs, comment.attrs, 'the inverse was set'); + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); + assert.deepEqual(this.helper.schema.comments.find(comment.id).commentableId, { type: 'post', id: post.id }, 'the comment was persisted'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-new-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-new-test.js index 46c1b5812..7fb5aefeb 100644 --- a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-new-test.js +++ b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-new-test.js @@ -1,36 +1,33 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One-to-one Polymorphic | association #new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ +module('Integration | ORM | Belongs To | One-to-one Polymorphic | association #new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + /* + The model can make a new unsaved belongs-to association, for all states + */ - test(`a ${state} can build a new associated parent`, function(assert) { - let [ comment ] = this.helper[state](); + states.forEach((state) => { - let post = comment.newCommentable('post', { age: 300 }); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ comment ] = this.helper[state](); - assert.ok(!post.id, 'the parent was not persisted'); - assert.deepEqual(comment.commentable, post); - assert.deepEqual(comment.commentableId, { type: 'post', id: undefined }); - assert.deepEqual(post.comment, comment, 'the inverse was set'); - assert.equal(post.commentId, comment.id); + let post = comment.newCommentable('post', { age: 300 }); - comment.save(); + assert.ok(!post.id, 'the parent was not persisted'); + assert.deepEqual(comment.commentable, post); + assert.deepEqual(comment.commentableId, { type: 'post', id: undefined }); + assert.deepEqual(post.comment, comment, 'the inverse was set'); + assert.equal(post.commentId, comment.id); - assert.ok(post.id, 'saving the child persists the parent'); - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }, 'the childs fk was updated'); - }); + comment.save(); + assert.ok(post.id, 'saving the child persists the parent'); + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }, 'the childs fk was updated'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-id-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-id-test.js index 3e3689268..2f15f0b7c 100644 --- a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-id-test.js +++ b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-id-test.js @@ -1,50 +1,47 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One-to-one Polymorphic | association #setId', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | One-to-one Polymorphic | association #setId', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ comment ] = this.helper[state](); - let post = this.helper.savedParent(); + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - comment.commentableId = { type: 'post', id: post.id }; + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ comment ] = this.helper[state](); + let post = this.helper.savedParent(); - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); - assert.deepEqual(comment.commentable.attrs, post.attrs); + comment.commentableId = { type: 'post', id: post.id }; - comment.save(); - post.reload(); + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); + assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.equal(post.commentId, comment.id, 'the inverse was set'); - assert.deepEqual(post.comment.attrs, comment.attrs); - }); + comment.save(); + post.reload(); + assert.equal(post.commentId, comment.id, 'the inverse was set'); + assert.deepEqual(post.comment.attrs, comment.attrs); }); - [ - 'savedChildSavedParent', - 'newChildSavedParent' - ].forEach((state) => { + }); - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ comment ] = this.helper[state](); + [ + 'savedChildSavedParent', + 'newChildSavedParent' + ].forEach((state) => { - comment.commentableId = null; + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ comment ] = this.helper[state](); - assert.equal(comment.commentableId, null); - assert.equal(comment.commentable, null); - }); + comment.commentableId = null; + assert.equal(comment.commentableId, null); + assert.equal(comment.commentable, null); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-test.js index a05b1b6b9..f034f2cb8 100644 --- a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-test.js +++ b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-test.js @@ -1,52 +1,49 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One-to-one Polymorphic | association #set', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); +module('Integration | ORM | Belongs To | One-to-one Polymorphic | association #set', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); + + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ comment ] = this.helper[state](); + let post = this.helper.savedParent(); + + comment.commentable = post; + + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.equal(post.commentId, comment.id, 'the inverse was set'); + assert.deepEqual(post.comment.attrs, comment.attrs); }); - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ comment ] = this.helper[state](); + let post = this.helper.newParent(); - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ comment ] = this.helper[state](); - let post = this.helper.savedParent(); + comment.commentable = post; - comment.commentable = post; + assert.deepEqual(comment.commentableId, { type: 'post', id: undefined }); + assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.equal(post.commentId, comment.id, 'the inverse was set'); - assert.deepEqual(post.comment.attrs, comment.attrs); - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ comment ] = this.helper[state](); - let post = this.helper.newParent(); - - comment.commentable = post; - - assert.deepEqual(comment.commentableId, { type: 'post', id: undefined }); - assert.deepEqual(comment.commentable.attrs, post.attrs); - - assert.equal(post.commentId, comment.id, 'the inverse was set'); - assert.deepEqual(post.comment.attrs, comment.attrs); - }); - - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ comment ] = this.helper[state](); + assert.equal(post.commentId, comment.id, 'the inverse was set'); + assert.deepEqual(post.comment.attrs, comment.attrs); + }); - comment.commentable = null; + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ comment ] = this.helper[state](); - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - }); + comment.commentable = null; + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/create-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/create-test.js index 293d88583..7de39aa98 100644 --- a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/create-test.js +++ b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/create-test.js @@ -2,67 +2,64 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One-to-one Polymorphic | create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let post = schema.create('post'); - let comment = schema.create('comment', { - commentableId: { type: 'post', id: post.id } - }); - post.reload(); +module('Integration | ORM | Belongs To | One-to-one Polymorphic | create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + }); - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.deepEqual(post.comment.attrs, comment.attrs); - assert.equal(schema.db.comments.length, 1); - assert.equal(schema.db.posts.length, 1); - assert.deepEqual(schema.db.comments[0], { id: '1', commentableId: { type: 'post', id: '1' } }); - assert.deepEqual(schema.db.posts[0], { id: '1', commentId: '1' }); + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let post = schema.create('post'); + let comment = schema.create('comment', { + commentableId: { type: 'post', id: post.id } }); + post.reload(); - test('it sets up associations correctly when passing in the association itself', function(assert) { - let { schema } = this.helper; - let post = schema.create('post'); - let comment = schema.create('comment', { - commentable: post - }); + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.deepEqual(post.comment.attrs, comment.attrs); + assert.equal(schema.db.comments.length, 1); + assert.equal(schema.db.posts.length, 1); + assert.deepEqual(schema.db.comments[0], { id: '1', commentableId: { type: 'post', id: '1' } }); + assert.deepEqual(schema.db.posts[0], { id: '1', commentId: '1' }); + }); - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.deepEqual(post.comment.attrs, comment.attrs); - assert.equal(schema.db.comments.length, 1); - assert.equal(schema.db.posts.length, 1); - assert.deepEqual(schema.db.comments[0], { id: '1', commentableId: { type: 'post', id: '1' } }); - assert.deepEqual(schema.db.posts[0], { id: '1', commentId: '1' }); + test('it sets up associations correctly when passing in the association itself', function(assert) { + let { schema } = this.helper; + let post = schema.create('post'); + let comment = schema.create('comment', { + commentable: post }); - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.deepEqual(post.comment.attrs, comment.attrs); + assert.equal(schema.db.comments.length, 1); + assert.equal(schema.db.posts.length, 1); + assert.deepEqual(schema.db.comments[0], { id: '1', commentableId: { type: 'post', id: '1' } }); + assert.deepEqual(schema.db.posts[0], { id: '1', commentId: '1' }); + }); - assert.throws(function() { - schema.create('comment', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); + assert.throws(function() { + schema.create('comment', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); + }); - assert.throws(function() { - schema.create('comment', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); - } -); + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); + + assert.throws(function() { + schema.create('comment', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); +}); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/delete-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/delete-test.js index 36660e133..567d24065 100644 --- a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/delete-test.js +++ b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/delete-test.js @@ -1,27 +1,24 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One-to-one Polymorphic | delete', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { +module('Integration | ORM | Belongs To | One-to-one Polymorphic | delete', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ comment, post ] = this.helper[state](); + states.forEach((state) => { - if (post) { - post.destroy(); - comment.reload(); - } + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ comment, post ] = this.helper[state](); - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - }); + if (post) { + post.destroy(); + comment.reload(); + } + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/instantiating-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/instantiating-test.js index c15c7f00a..bdbfd0367 100644 --- a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/instantiating-test.js +++ b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/instantiating-test.js @@ -1,86 +1,83 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One-to-one Polymorphic | instantiating', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the child accepts a saved parent id', function(assert) { - let post = this.helper.savedParent(); - let comment = this.schema.comments.new({ commentableId: { type: 'post', id: post.id } }); - - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.deepEqual(comment.attrs, { commentableId: { type: 'post', id: post.id } }); - }); - - test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.comments.new({ commentableId: { type: 'post', id: 2 } }); - }, /You're instantiating a comment that has a commentableId of post:2, but that record doesn't exist in the database/); - }); - - test('the child accepts a null parent id', function(assert) { - let comment = this.schema.comments.new({ commentableId: null }); - - assert.equal(comment.commentableId, null); - assert.equal(comment.commentable, null); - assert.deepEqual(comment.attrs, { commentableId: null }); - }); - - test('the child accepts a saved parent model', function(assert) { - let post = this.helper.savedParent(); - let comment = this.schema.comments.new({ commentable: post }); - - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.deepEqual(comment.attrs, { commentableId: null }); // this would update when saved - }); - - test('the child accepts a new parent model', function(assert) { - let post = this.schema.posts.new({ age: 300 }); - let comment = this.schema.comments.new({ commentable: post }); - - assert.deepEqual(comment.commentableId, { type: 'post', id: undefined }); - assert.deepEqual(comment.commentable, post); - assert.deepEqual(comment.attrs, { commentableId: null }); - }); - - test('the child accepts a null parent model', function(assert) { - let comment = this.schema.comments.new({ commentable: null }); - - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - assert.deepEqual(comment.attrs, { commentableId: null }); - }); - - test('the child accepts a parent model and id', function(assert) { - let post = this.helper.savedParent(); - let comment = this.schema.comments.new({ commentable: post, commentableId: { type: 'post', id: post.id } }); - - assert.deepEqual(comment.commentableId, { type: 'post', id: '1' }); - assert.deepEqual(comment.commentable, post); - assert.deepEqual(comment.attrs, { commentableId: { type: 'post', id: post.id } }); - }); - - test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let comment = this.schema.comments.new({}); - - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - assert.deepEqual(comment.attrs, { commentableId: null }); - }); - - test('the child accepts no reference to a parent id or model', function(assert) { - let comment = this.schema.comments.new(); - - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - assert.deepEqual(comment.attrs, { commentableId: null }); - }); - } -); +module('Integration | ORM | Belongs To | One-to-one Polymorphic | instantiating', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the child accepts a saved parent id', function(assert) { + let post = this.helper.savedParent(); + let comment = this.schema.comments.new({ commentableId: { type: 'post', id: post.id } }); + + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.deepEqual(comment.attrs, { commentableId: { type: 'post', id: post.id } }); + }); + + test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.comments.new({ commentableId: { type: 'post', id: 2 } }); + }, /You're instantiating a comment that has a commentableId of post:2, but that record doesn't exist in the database/); + }); + + test('the child accepts a null parent id', function(assert) { + let comment = this.schema.comments.new({ commentableId: null }); + + assert.equal(comment.commentableId, null); + assert.equal(comment.commentable, null); + assert.deepEqual(comment.attrs, { commentableId: null }); + }); + + test('the child accepts a saved parent model', function(assert) { + let post = this.helper.savedParent(); + let comment = this.schema.comments.new({ commentable: post }); + + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.deepEqual(comment.attrs, { commentableId: null }); // this would update when saved + }); + + test('the child accepts a new parent model', function(assert) { + let post = this.schema.posts.new({ age: 300 }); + let comment = this.schema.comments.new({ commentable: post }); + + assert.deepEqual(comment.commentableId, { type: 'post', id: undefined }); + assert.deepEqual(comment.commentable, post); + assert.deepEqual(comment.attrs, { commentableId: null }); + }); + + test('the child accepts a null parent model', function(assert) { + let comment = this.schema.comments.new({ commentable: null }); + + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + assert.deepEqual(comment.attrs, { commentableId: null }); + }); + + test('the child accepts a parent model and id', function(assert) { + let post = this.helper.savedParent(); + let comment = this.schema.comments.new({ commentable: post, commentableId: { type: 'post', id: post.id } }); + + assert.deepEqual(comment.commentableId, { type: 'post', id: '1' }); + assert.deepEqual(comment.commentable, post); + assert.deepEqual(comment.attrs, { commentableId: { type: 'post', id: post.id } }); + }); + + test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let comment = this.schema.comments.new({}); + + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + assert.deepEqual(comment.attrs, { commentableId: null }); + }); + + test('the child accepts no reference to a parent id or model', function(assert) { + let comment = this.schema.comments.new(); + + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + assert.deepEqual(comment.attrs, { commentableId: null }); + }); +}); diff --git a/tests/integration/orm/belongs-to/2-named/association-create-test.js b/tests/integration/orm/belongs-to/2-named/association-create-test.js index 65ccfffca..0974532b3 100644 --- a/tests/integration/orm/belongs-to/2-named/association-create-test.js +++ b/tests/integration/orm/belongs-to/2-named/association-create-test.js @@ -1,29 +1,26 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named | association #create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a belongs-to association, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | Named | association #create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can create an associated parent`, function(assert) { - let [ post ] = this.helper[state](); + /* + The model can create a belongs-to association, for all states + */ + states.forEach((state) => { - let ganon = post.createAuthor({ name: 'Ganon' }); + test(`a ${state} can create an associated parent`, function(assert) { + let [ post ] = this.helper[state](); - assert.ok(ganon.id, 'the parent was persisted'); - assert.deepEqual(post.author, ganon); - assert.equal(post.authorId, ganon.id); - assert.equal(this.helper.schema.posts.find(post.id).authorId, ganon.id, 'the child was persisted'); - }); + let ganon = post.createAuthor({ name: 'Ganon' }); + assert.ok(ganon.id, 'the parent was persisted'); + assert.deepEqual(post.author, ganon); + assert.equal(post.authorId, ganon.id); + assert.equal(this.helper.schema.posts.find(post.id).authorId, ganon.id, 'the child was persisted'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/2-named/association-new-test.js b/tests/integration/orm/belongs-to/2-named/association-new-test.js index 374d84a5b..ff83afa23 100644 --- a/tests/integration/orm/belongs-to/2-named/association-new-test.js +++ b/tests/integration/orm/belongs-to/2-named/association-new-test.js @@ -1,34 +1,31 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named | association #new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ +module('Integration | ORM | Belongs To | Named | association #new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + /* + The model can make a new unsaved belongs-to association, for all states + */ - test(`a ${state} can build a new associated parent`, function(assert) { - let [ post ] = this.helper[state](); + states.forEach((state) => { - let ganon = post.newAuthor({ name: 'Ganon' }); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ post ] = this.helper[state](); - assert.ok(!ganon.id, 'the parent was not persisted'); - assert.deepEqual(post.author, ganon); - assert.equal(post.authorId, null); + let ganon = post.newAuthor({ name: 'Ganon' }); - post.save(); + assert.ok(!ganon.id, 'the parent was not persisted'); + assert.deepEqual(post.author, ganon); + assert.equal(post.authorId, null); - assert.ok(ganon.id, 'saving the child persists the parent'); - assert.equal(post.authorId, ganon.id, 'the childs fk was updated'); - }); + post.save(); + assert.ok(ganon.id, 'saving the child persists the parent'); + assert.equal(post.authorId, ganon.id, 'the childs fk was updated'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/2-named/association-set-id-test.js b/tests/integration/orm/belongs-to/2-named/association-set-id-test.js index ed58770c1..fa8682ec6 100644 --- a/tests/integration/orm/belongs-to/2-named/association-set-id-test.js +++ b/tests/integration/orm/belongs-to/2-named/association-set-id-test.js @@ -1,44 +1,41 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named | association #setId', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | Named | association #setId', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ post ] = this.helper[state](); - let savedAuthor = this.helper.savedParent(); + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - post.authorId = savedAuthor.id; + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ post ] = this.helper[state](); + let savedAuthor = this.helper.savedParent(); - assert.equal(post.authorId, savedAuthor.id); - assert.deepEqual(post.author, savedAuthor); - }); + post.authorId = savedAuthor.id; + assert.equal(post.authorId, savedAuthor.id); + assert.deepEqual(post.author, savedAuthor); }); - [ - 'savedChildSavedParent', - 'newChildSavedParent' - ].forEach((state) => { + }); - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ post ] = this.helper[state](); + [ + 'savedChildSavedParent', + 'newChildSavedParent' + ].forEach((state) => { - post.authorId = null; + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ post ] = this.helper[state](); - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - }); + post.authorId = null; + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/2-named/association-set-test.js b/tests/integration/orm/belongs-to/2-named/association-set-test.js index e0ee36e47..a3e0b775f 100644 --- a/tests/integration/orm/belongs-to/2-named/association-set-test.js +++ b/tests/integration/orm/belongs-to/2-named/association-set-test.js @@ -1,47 +1,44 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named | association #set', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | Named | association #set', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ post ] = this.helper[state](); - let savedAuthor = this.helper.savedParent(); + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - post.author = savedAuthor; + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ post ] = this.helper[state](); + let savedAuthor = this.helper.savedParent(); - assert.equal(post.authorId, savedAuthor.id); - assert.deepEqual(post.author, savedAuthor); - }); + post.author = savedAuthor; - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ post ] = this.helper[state](); - let newAuthor = this.helper.newParent(); + assert.equal(post.authorId, savedAuthor.id); + assert.deepEqual(post.author, savedAuthor); + }); - post.author = newAuthor; + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ post ] = this.helper[state](); + let newAuthor = this.helper.newParent(); - assert.equal(post.authorId, null); - assert.deepEqual(post.author, newAuthor); - }); + post.author = newAuthor; - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ post ] = this.helper[state](); + assert.equal(post.authorId, null); + assert.deepEqual(post.author, newAuthor); + }); - post.author = null; + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ post ] = this.helper[state](); - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - }); + post.author = null; + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/2-named/instantiating-test.js b/tests/integration/orm/belongs-to/2-named/instantiating-test.js index e2f1fbbb2..2570e37c9 100644 --- a/tests/integration/orm/belongs-to/2-named/instantiating-test.js +++ b/tests/integration/orm/belongs-to/2-named/instantiating-test.js @@ -1,85 +1,82 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named | instantiating', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the child accepts a saved parent id', function(assert) { - let author = this.helper.savedParent(); - let post = this.schema.posts.new({ authorId: author.id }); - - assert.equal(post.authorId, author.id); - assert.deepEqual(post.author, author); - assert.deepEqual(post.attrs, { authorId: author.id }); - }); - - test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.posts.new({ authorId: 2 }); - }, /You're instantiating a post that has a authorId of 2, but that record doesn't exist in the database/); - }); - - test('the child accepts a null parent id', function(assert) { - let post = this.schema.posts.new({ authorId: null }); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - assert.deepEqual(post.attrs, { authorId: null }); - }); - - test('the child accepts a saved parent model', function(assert) { - let author = this.helper.savedParent(); - let post = this.schema.posts.new({ author }); - - assert.equal(post.authorId, 1); - assert.deepEqual(post.author, author); - }); - - test('the child accepts a new parent model', function(assert) { - let zelda = this.schema.users.new({ name: 'Zelda' }); - let post = this.schema.posts.new({ author: zelda }); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, zelda); - assert.deepEqual(post.attrs, { authorId: null }); - }); - - test('the child accepts a null parent model', function(assert) { - let post = this.schema.posts.new({ author: null }); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - assert.deepEqual(post.attrs, { authorId: null }); - }); - - test('the child accepts a parent model and id', function(assert) { - let author = this.helper.savedParent(); - let post = this.schema.posts.new({ author, authorId: author.id }); - - assert.equal(post.authorId, '1'); - assert.deepEqual(post.author, author); - assert.deepEqual(post.attrs, { authorId: author.id }); - }); - - test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let post = this.schema.posts.new({}); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - assert.deepEqual(post.attrs, { authorId: null }); - }); - - test('the child accepts no reference to a parent id or model', function(assert) { - let post = this.schema.posts.new(); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - assert.deepEqual(post.attrs, { authorId: null }); - }); - } -); +module('Integration | ORM | Belongs To | Named | instantiating', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the child accepts a saved parent id', function(assert) { + let author = this.helper.savedParent(); + let post = this.schema.posts.new({ authorId: author.id }); + + assert.equal(post.authorId, author.id); + assert.deepEqual(post.author, author); + assert.deepEqual(post.attrs, { authorId: author.id }); + }); + + test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.posts.new({ authorId: 2 }); + }, /You're instantiating a post that has a authorId of 2, but that record doesn't exist in the database/); + }); + + test('the child accepts a null parent id', function(assert) { + let post = this.schema.posts.new({ authorId: null }); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + assert.deepEqual(post.attrs, { authorId: null }); + }); + + test('the child accepts a saved parent model', function(assert) { + let author = this.helper.savedParent(); + let post = this.schema.posts.new({ author }); + + assert.equal(post.authorId, 1); + assert.deepEqual(post.author, author); + }); + + test('the child accepts a new parent model', function(assert) { + let zelda = this.schema.users.new({ name: 'Zelda' }); + let post = this.schema.posts.new({ author: zelda }); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, zelda); + assert.deepEqual(post.attrs, { authorId: null }); + }); + + test('the child accepts a null parent model', function(assert) { + let post = this.schema.posts.new({ author: null }); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + assert.deepEqual(post.attrs, { authorId: null }); + }); + + test('the child accepts a parent model and id', function(assert) { + let author = this.helper.savedParent(); + let post = this.schema.posts.new({ author, authorId: author.id }); + + assert.equal(post.authorId, '1'); + assert.deepEqual(post.author, author); + assert.deepEqual(post.attrs, { authorId: author.id }); + }); + + test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let post = this.schema.posts.new({}); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + assert.deepEqual(post.attrs, { authorId: null }); + }); + + test('the child accepts no reference to a parent id or model', function(assert) { + let post = this.schema.posts.new(); + + assert.equal(post.authorId, null); + assert.deepEqual(post.author, null); + assert.deepEqual(post.attrs, { authorId: null }); + }); +}); diff --git a/tests/integration/orm/belongs-to/3-reflexive/association-create-test.js b/tests/integration/orm/belongs-to/3-reflexive/association-create-test.js index 60040b24b..d660cce01 100644 --- a/tests/integration/orm/belongs-to/3-reflexive/association-create-test.js +++ b/tests/integration/orm/belongs-to/3-reflexive/association-create-test.js @@ -1,36 +1,33 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Reflexive | association #create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a belongs-to association, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | Reflexive | association #create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can create an associated parent`, function(assert) { - let [ user, originalUser ] = this.helper[state](); + /* + The model can create a belongs-to association, for all states + */ + states.forEach((state) => { - let ganon = user.createUser({ name: 'Ganon' }); + test(`a ${state} can create an associated parent`, function(assert) { + let [ user, originalUser ] = this.helper[state](); - assert.ok(ganon.id, 'the parent was persisted'); - assert.deepEqual(user.user.attrs, ganon.attrs); - assert.deepEqual(ganon.user.attrs, user.attrs, 'the inverse was set'); - assert.equal(user.userId, ganon.id); - assert.equal(ganon.userId, user.id, 'the inverse was set'); - assert.equal(this.helper.schema.users.find(user.id).userId, ganon.id, 'the user was persisted'); + let ganon = user.createUser({ name: 'Ganon' }); - if (originalUser) { - originalUser.reload(); - assert.equal(originalUser.userId, null, 'old inverses were cleared out'); - } - }); + assert.ok(ganon.id, 'the parent was persisted'); + assert.deepEqual(user.user.attrs, ganon.attrs); + assert.deepEqual(ganon.user.attrs, user.attrs, 'the inverse was set'); + assert.equal(user.userId, ganon.id); + assert.equal(ganon.userId, user.id, 'the inverse was set'); + assert.equal(this.helper.schema.users.find(user.id).userId, ganon.id, 'the user was persisted'); + if (originalUser) { + originalUser.reload(); + assert.equal(originalUser.userId, null, 'old inverses were cleared out'); + } }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/3-reflexive/association-new-test.js b/tests/integration/orm/belongs-to/3-reflexive/association-new-test.js index 25297e262..2955a9c88 100644 --- a/tests/integration/orm/belongs-to/3-reflexive/association-new-test.js +++ b/tests/integration/orm/belongs-to/3-reflexive/association-new-test.js @@ -1,40 +1,37 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Reflexive | association #new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ +module('Integration | ORM | Belongs To | Reflexive | association #new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + /* + The model can make a new unsaved belongs-to association, for all states + */ - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user, originalUser ] = this.helper[state](); + states.forEach((state) => { - let ganon = user.newUser({ name: 'Ganon' }); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user, originalUser ] = this.helper[state](); - assert.ok(!ganon.id, 'the parent was not persisted'); - assert.deepEqual(user.user, ganon); - assert.equal(user.userId, null); - assert.deepEqual(ganon.user, user, 'the inverse was set'); + let ganon = user.newUser({ name: 'Ganon' }); - user.save(); + assert.ok(!ganon.id, 'the parent was not persisted'); + assert.deepEqual(user.user, ganon); + assert.equal(user.userId, null); + assert.deepEqual(ganon.user, user, 'the inverse was set'); - assert.ok(ganon.id, 'saving the child persists the parent'); - assert.equal(user.userId, ganon.id, 'the childs fk was updated'); + user.save(); - if (originalUser) { - originalUser.reload(); - assert.equal(originalUser.userId, null, 'old inverses were cleared out'); - } - }); + assert.ok(ganon.id, 'saving the child persists the parent'); + assert.equal(user.userId, ganon.id, 'the childs fk was updated'); + if (originalUser) { + originalUser.reload(); + assert.equal(originalUser.userId, null, 'old inverses were cleared out'); + } }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/3-reflexive/association-set-id-test.js b/tests/integration/orm/belongs-to/3-reflexive/association-set-id-test.js index 33aec779e..0c3e7a719 100644 --- a/tests/integration/orm/belongs-to/3-reflexive/association-set-id-test.js +++ b/tests/integration/orm/belongs-to/3-reflexive/association-set-id-test.js @@ -1,56 +1,53 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Reflexive | association #setId', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); +module('Integration | ORM | Belongs To | Reflexive | association #setId', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); + + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user, originalUser ] = this.helper[state](); + let friend = this.helper.savedParent(); + + user.userId = friend.id; + + assert.equal(user.userId, friend.id); + assert.deepEqual(user.user.attrs, friend.attrs); + + user.save(); + if (originalUser) { + originalUser.reload(); + assert.equal(originalUser.userId, null, 'old inverses were cleared out'); + } }); - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { + }); - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user, originalUser ] = this.helper[state](); - let friend = this.helper.savedParent(); + [ + 'savedChildSavedParent', + 'newChildSavedParent' + ].forEach((state) => { - user.userId = friend.id; + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ user, originalUser ] = this.helper[state](); - assert.equal(user.userId, friend.id); - assert.deepEqual(user.user.attrs, friend.attrs); + user.userId = null; - user.save(); - if (originalUser) { - originalUser.reload(); - assert.equal(originalUser.userId, null, 'old inverses were cleared out'); - } - }); + assert.equal(user.userId, null); + assert.equal(user.user, null); + user.save(); + if (originalUser) { + originalUser.reload(); + assert.equal(originalUser.userId, null, 'old inverses were cleared out'); + } }); - [ - 'savedChildSavedParent', - 'newChildSavedParent' - ].forEach((state) => { - - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ user, originalUser ] = this.helper[state](); - - user.userId = null; - - assert.equal(user.userId, null); - assert.equal(user.user, null); - - user.save(); - if (originalUser) { - originalUser.reload(); - assert.equal(originalUser.userId, null, 'old inverses were cleared out'); - } - }); - - }); - } -); + }); +}); diff --git a/tests/integration/orm/belongs-to/3-reflexive/association-set-test.js b/tests/integration/orm/belongs-to/3-reflexive/association-set-test.js index 9ba29d9ff..843099bf8 100644 --- a/tests/integration/orm/belongs-to/3-reflexive/association-set-test.js +++ b/tests/integration/orm/belongs-to/3-reflexive/association-set-test.js @@ -1,65 +1,62 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Reflexive | association #set', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); +module('Integration | ORM | Belongs To | Reflexive | association #set', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); + + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ user, originalUser ] = this.helper[state](); + let friend = this.helper.savedParent(); + + user.user = friend; + + assert.equal(user.userId, friend.id); + assert.deepEqual(user.user.attrs, friend.attrs); + + user.save(); + if (originalUser) { + originalUser.reload(); + assert.equal(originalUser.userId, null, 'old inverses were cleared out'); + } }); - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user, originalUser ] = this.helper[state](); + let friend = this.helper.newParent(); - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ user, originalUser ] = this.helper[state](); - let friend = this.helper.savedParent(); + user.user = friend; - user.user = friend; + assert.equal(user.userId, null); + assert.deepEqual(user.user.attrs, friend.attrs); - assert.equal(user.userId, friend.id); - assert.deepEqual(user.user.attrs, friend.attrs); - - user.save(); - if (originalUser) { - originalUser.reload(); - assert.equal(originalUser.userId, null, 'old inverses were cleared out'); - } - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user, originalUser ] = this.helper[state](); - let friend = this.helper.newParent(); - - user.user = friend; - - assert.equal(user.userId, null); - assert.deepEqual(user.user.attrs, friend.attrs); - - user.save(); - if (originalUser) { - originalUser.reload(); - assert.equal(originalUser.userId, null, 'old inverses were cleared out'); - } - }); - - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ user, originalUser ] = this.helper[state](); + user.save(); + if (originalUser) { + originalUser.reload(); + assert.equal(originalUser.userId, null, 'old inverses were cleared out'); + } + }); - user.user = null; + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ user, originalUser ] = this.helper[state](); - assert.equal(user.userId, null); - assert.deepEqual(user.user, null); + user.user = null; - user.save(); - if (originalUser) { - originalUser.reload(); - assert.equal(originalUser.userId, null, 'old inverses were cleared out'); - } - }); + assert.equal(user.userId, null); + assert.deepEqual(user.user, null); + user.save(); + if (originalUser) { + originalUser.reload(); + assert.equal(originalUser.userId, null, 'old inverses were cleared out'); + } }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/3-reflexive/instantiating-test.js b/tests/integration/orm/belongs-to/3-reflexive/instantiating-test.js index 50c66415b..da45fb1e0 100644 --- a/tests/integration/orm/belongs-to/3-reflexive/instantiating-test.js +++ b/tests/integration/orm/belongs-to/3-reflexive/instantiating-test.js @@ -1,86 +1,83 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Reflexive | instantiating', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the child accepts a saved parent id', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ userId: friend.id }); - - assert.equal(user.userId, friend.id); - assert.deepEqual(user.user.attrs, friend.attrs); - assert.deepEqual(user.attrs, { userId: friend.id }); - }); - - test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ userId: 2 }); - }, /You're instantiating a user that has a userId of 2, but that record doesn't exist in the database/); - }); - - test('the child accepts a null parent id', function(assert) { - let user = this.schema.users.new({ userId: null }); - - assert.equal(user.userId, null); - assert.equal(user.user, null); - assert.deepEqual(user.attrs, { userId: null }); - }); - - test('the child accepts a saved parent model', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ user: friend }); - - assert.equal(user.userId, 1); - assert.deepEqual(user.user.attrs, friend.attrs); - assert.deepEqual(user.attrs, { userId: null }); // this would update when saved - }); - - test('the child accepts a new parent model', function(assert) { - let zelda = this.schema.users.new({ name: 'Zelda' }); - let user = this.schema.users.new({ user: zelda }); - - assert.equal(user.userId, null); - assert.deepEqual(user.user, zelda); - assert.deepEqual(user.attrs, { userId: null }); - }); - - test('the child accepts a null parent model', function(assert) { - let user = this.schema.users.new({ user: null }); - - assert.equal(user.userId, null); - assert.deepEqual(user.user, null); - assert.deepEqual(user.attrs, { userId: null }); - }); - - test('the child accepts a parent model and id', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ user: friend, userId: friend.id }); - - assert.equal(user.userId, '1'); - assert.deepEqual(user.user, friend); - assert.deepEqual(user.attrs, { userId: friend.id }); - }); - - test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let user = this.schema.users.new({}); - - assert.equal(user.userId, null); - assert.deepEqual(user.user, null); - assert.deepEqual(user.attrs, { userId: null }); - }); - - test('the child accepts no reference to a parent id or model', function(assert) { - let user = this.schema.users.new(); - - assert.equal(user.userId, null); - assert.deepEqual(user.user, null); - assert.deepEqual(user.attrs, { userId: null }); - }); - } -); +module('Integration | ORM | Belongs To | Reflexive | instantiating', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the child accepts a saved parent id', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ userId: friend.id }); + + assert.equal(user.userId, friend.id); + assert.deepEqual(user.user.attrs, friend.attrs); + assert.deepEqual(user.attrs, { userId: friend.id }); + }); + + test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ userId: 2 }); + }, /You're instantiating a user that has a userId of 2, but that record doesn't exist in the database/); + }); + + test('the child accepts a null parent id', function(assert) { + let user = this.schema.users.new({ userId: null }); + + assert.equal(user.userId, null); + assert.equal(user.user, null); + assert.deepEqual(user.attrs, { userId: null }); + }); + + test('the child accepts a saved parent model', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ user: friend }); + + assert.equal(user.userId, 1); + assert.deepEqual(user.user.attrs, friend.attrs); + assert.deepEqual(user.attrs, { userId: null }); // this would update when saved + }); + + test('the child accepts a new parent model', function(assert) { + let zelda = this.schema.users.new({ name: 'Zelda' }); + let user = this.schema.users.new({ user: zelda }); + + assert.equal(user.userId, null); + assert.deepEqual(user.user, zelda); + assert.deepEqual(user.attrs, { userId: null }); + }); + + test('the child accepts a null parent model', function(assert) { + let user = this.schema.users.new({ user: null }); + + assert.equal(user.userId, null); + assert.deepEqual(user.user, null); + assert.deepEqual(user.attrs, { userId: null }); + }); + + test('the child accepts a parent model and id', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ user: friend, userId: friend.id }); + + assert.equal(user.userId, '1'); + assert.deepEqual(user.user, friend); + assert.deepEqual(user.attrs, { userId: friend.id }); + }); + + test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let user = this.schema.users.new({}); + + assert.equal(user.userId, null); + assert.deepEqual(user.user, null); + assert.deepEqual(user.attrs, { userId: null }); + }); + + test('the child accepts no reference to a parent id or model', function(assert) { + let user = this.schema.users.new(); + + assert.equal(user.userId, null); + assert.deepEqual(user.user, null); + assert.deepEqual(user.attrs, { userId: null }); + }); +}); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/accessor-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/accessor-test.js index 18f7f12de..d3011430b 100644 --- a/tests/integration/orm/belongs-to/4-named-reflexive/accessor-test.js +++ b/tests/integration/orm/belongs-to/4-named-reflexive/accessor-test.js @@ -1,37 +1,34 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named Reflexive | accessor', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | Named Reflexive | accessor', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`the references of a ${state} are correct`, function(assert) { - let [ user, friend ] = this.helper[state](); + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { - // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison - if (friend) { - assert.deepEqual(user.bestFriend.attrs, friend.attrs, 'the model reference is correct'); - assert.equal(user.bestFriendId, friend.id, 'the modelId reference is correct'); - } else { - assert.deepEqual(user.bestFriend, null, 'the model reference is correct'); - assert.equal(user.bestFriendId, null, 'the modelId reference is correct'); - } + test(`the references of a ${state} are correct`, function(assert) { + let [ user, friend ] = this.helper[state](); - // If there's a friend in this state, make sure the inverse association is correct - if (friend) { - assert.deepEqual(friend.bestFriend.attrs, user.attrs, 'the inverse model reference is correct'); - assert.equal(friend.bestFriendId, user.id, 'the inverse modelId reference is correct'); - } - }); + // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison + if (friend) { + assert.deepEqual(user.bestFriend.attrs, friend.attrs, 'the model reference is correct'); + assert.equal(user.bestFriendId, friend.id, 'the modelId reference is correct'); + } else { + assert.deepEqual(user.bestFriend, null, 'the model reference is correct'); + assert.equal(user.bestFriendId, null, 'the modelId reference is correct'); + } + // If there's a friend in this state, make sure the inverse association is correct + if (friend) { + assert.deepEqual(friend.bestFriend.attrs, user.attrs, 'the inverse model reference is correct'); + assert.equal(friend.bestFriendId, user.id, 'the inverse modelId reference is correct'); + } }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/association-create-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/association-create-test.js index f97df52bd..5107cee5f 100644 --- a/tests/integration/orm/belongs-to/4-named-reflexive/association-create-test.js +++ b/tests/integration/orm/belongs-to/4-named-reflexive/association-create-test.js @@ -1,29 +1,26 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named Reflexive | association #create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a belongs-to association, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | Named Reflexive | association #create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); + /* + The model can create a belongs-to association, for all states + */ + states.forEach((state) => { - let ganon = user.createBestFriend({ name: 'Ganon' }); + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); - assert.ok(ganon.id, 'the parent was persisted'); - assert.deepEqual(user.bestFriend.attrs, ganon.attrs); - assert.equal(user.bestFriendId, ganon.id); - assert.equal(this.helper.schema.users.find(user.id).bestFriendId, ganon.id, 'the user was persisted'); - }); + let ganon = user.createBestFriend({ name: 'Ganon' }); + assert.ok(ganon.id, 'the parent was persisted'); + assert.deepEqual(user.bestFriend.attrs, ganon.attrs); + assert.equal(user.bestFriendId, ganon.id); + assert.equal(this.helper.schema.users.find(user.id).bestFriendId, ganon.id, 'the user was persisted'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/association-new-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/association-new-test.js index 0fac991c1..4a38a1113 100644 --- a/tests/integration/orm/belongs-to/4-named-reflexive/association-new-test.js +++ b/tests/integration/orm/belongs-to/4-named-reflexive/association-new-test.js @@ -1,34 +1,31 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named Reflexive | association #new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ +module('Integration | ORM | Belongs To | Named Reflexive | association #new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + /* + The model can make a new unsaved belongs-to association, for all states + */ - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); + states.forEach((state) => { - let ganon = user.newBestFriend({ name: 'Ganon' }); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); - assert.ok(!ganon.id, 'the parent was not persisted'); - assert.deepEqual(user.bestFriend, ganon); - assert.equal(user.bestFriendId, null); + let ganon = user.newBestFriend({ name: 'Ganon' }); - user.save(); + assert.ok(!ganon.id, 'the parent was not persisted'); + assert.deepEqual(user.bestFriend, ganon); + assert.equal(user.bestFriendId, null); - assert.ok(ganon.id, 'saving the child persists the parent'); - assert.equal(user.bestFriendId, ganon.id, 'the childs fk was updated'); - }); + user.save(); + assert.ok(ganon.id, 'saving the child persists the parent'); + assert.equal(user.bestFriendId, ganon.id, 'the childs fk was updated'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/association-set-id-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/association-set-id-test.js index e17f487a3..012fa66f5 100644 --- a/tests/integration/orm/belongs-to/4-named-reflexive/association-set-id-test.js +++ b/tests/integration/orm/belongs-to/4-named-reflexive/association-set-id-test.js @@ -1,44 +1,41 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named Reflexive | association #setId', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | Named Reflexive | association #setId', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user ] = this.helper[state](); - let friend = this.helper.savedParent(); + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - user.bestFriendId = friend.id; + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user ] = this.helper[state](); + let friend = this.helper.savedParent(); - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - }); + user.bestFriendId = friend.id; + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); }); - [ - 'savedChildSavedParent', - 'newChildSavedParent' - ].forEach((state) => { + }); - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ user ] = this.helper[state](); + [ + 'savedChildSavedParent', + 'newChildSavedParent' + ].forEach((state) => { - user.bestFriendId = null; + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ user ] = this.helper[state](); - assert.equal(user.bestFriendId, null); - assert.equal(user.bestFriend, null); - }); + user.bestFriendId = null; + assert.equal(user.bestFriendId, null); + assert.equal(user.bestFriend, null); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/association-set-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/association-set-test.js index 324f5cf0b..bd19b6eef 100644 --- a/tests/integration/orm/belongs-to/4-named-reflexive/association-set-test.js +++ b/tests/integration/orm/belongs-to/4-named-reflexive/association-set-test.js @@ -1,47 +1,44 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named Reflexive | association #set', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | Named Reflexive | association #set', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ user ] = this.helper[state](); - let friend = this.helper.savedParent(); + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - user.bestFriend = friend; + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ user ] = this.helper[state](); + let friend = this.helper.savedParent(); - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - }); + user.bestFriend = friend; - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user ] = this.helper[state](); - let friend = this.helper.newParent(); + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + }); - user.bestFriend = friend; + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user ] = this.helper[state](); + let friend = this.helper.newParent(); - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - }); + user.bestFriend = friend; - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ user ] = this.helper[state](); + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + }); - user.bestFriend = null; + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ user ] = this.helper[state](); - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - }); + user.bestFriend = null; + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/create-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/create-test.js index a01a3b19a..3bd081637 100644 --- a/tests/integration/orm/belongs-to/4-named-reflexive/create-test.js +++ b/tests/integration/orm/belongs-to/4-named-reflexive/create-test.js @@ -2,64 +2,61 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named Reflexive | create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); +module('Integration | ORM | Belongs To | Named Reflexive | create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + }); + + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let friend = schema.create('user'); + let user = schema.create('user', { + bestFriendId: friend.id }); - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let friend = schema.create('user'); - let user = schema.create('user', { - bestFriendId: friend.id - }); + friend.reload(); - friend.reload(); + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', bestFriendId: '2' }); + assert.deepEqual(schema.db.users[1], { id: '2', bestFriendId: '1' }); + }); - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', bestFriendId: '2' }); - assert.deepEqual(schema.db.users[1], { id: '2', bestFriendId: '1' }); + test('it sets up associations correctly when passing in the association itself', function(assert) { + let { schema } = this.helper; + let friend = schema.create('user'); + let user = schema.create('user', { + bestFriend: friend }); - test('it sets up associations correctly when passing in the association itself', function(assert) { - let { schema } = this.helper; - let friend = schema.create('user'); - let user = schema.create('user', { - bestFriend: friend - }); - - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', bestFriendId: '2' }); - assert.deepEqual(schema.db.users[1], { id: '2', bestFriendId: '1' }); - }); + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', bestFriendId: '2' }); + assert.deepEqual(schema.db.users[1], { id: '2', bestFriendId: '1' }); + }); - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.create('user', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); + assert.throws(function() { + schema.create('user', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); + }); - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); - assert.throws(function() { - schema.create('user', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); - } -); + assert.throws(function() { + schema.create('user', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); +}); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/delete-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/delete-test.js index 2257dadce..04a42a0d8 100644 --- a/tests/integration/orm/belongs-to/4-named-reflexive/delete-test.js +++ b/tests/integration/orm/belongs-to/4-named-reflexive/delete-test.js @@ -1,27 +1,24 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named Reflexive | delete', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { +module('Integration | ORM | Belongs To | Named Reflexive | delete', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ user, bestFriend ] = this.helper[state](); + states.forEach((state) => { - if (bestFriend) { - bestFriend.destroy(); - user.reload(); - } + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ user, bestFriend ] = this.helper[state](); - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - }); + if (bestFriend) { + bestFriend.destroy(); + user.reload(); + } + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/instantiating-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/instantiating-test.js index 21a40f468..654277944 100644 --- a/tests/integration/orm/belongs-to/4-named-reflexive/instantiating-test.js +++ b/tests/integration/orm/belongs-to/4-named-reflexive/instantiating-test.js @@ -1,86 +1,83 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named Reflexive | instantiating', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the child accepts a saved parent id', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ bestFriendId: friend.id }); - - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - assert.deepEqual(user.attrs, { bestFriendId: friend.id }); - }); - - test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ bestFriendId: 2 }); - }, /You're instantiating a user that has a bestFriendId of 2, but that record doesn't exist in the database/); - }); - - test('the child accepts a null parent id', function(assert) { - let user = this.schema.users.new({ bestFriendId: null }); - - assert.equal(user.bestFriendId, null); - assert.equal(user.bestFriend, null); - assert.deepEqual(user.attrs, { bestFriendId: null }); - }); - - test('the child accepts a saved parent model', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ bestFriend: friend }); - - assert.equal(user.bestFriendId, 1); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - assert.deepEqual(user.attrs, { bestFriendId: null }); // this would update when saved - }); - - test('the child accepts a new parent model', function(assert) { - let zelda = this.schema.users.new({ name: 'Zelda' }); - let user = this.schema.users.new({ bestFriend: zelda }); - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, zelda); - assert.deepEqual(user.attrs, { bestFriendId: null }); - }); - - test('the child accepts a null parent model', function(assert) { - let user = this.schema.users.new({ bestFriend: null }); - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - assert.deepEqual(user.attrs, { bestFriendId: null }); - }); - - test('the child accepts a parent model and id', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ bestFriend: friend, bestFriendId: friend.id }); - - assert.equal(user.bestFriendId, '1'); - assert.deepEqual(user.bestFriend, friend); - assert.deepEqual(user.attrs, { bestFriendId: friend.id }); - }); - - test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let user = this.schema.users.new({}); - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - assert.deepEqual(user.attrs, { bestFriendId: null }); - }); - - test('the child accepts no reference to a parent id or model', function(assert) { - let user = this.schema.users.new(); - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - assert.deepEqual(user.attrs, { bestFriendId: null }); - }); - } -); +module('Integration | ORM | Belongs To | Named Reflexive | instantiating', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the child accepts a saved parent id', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ bestFriendId: friend.id }); + + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + assert.deepEqual(user.attrs, { bestFriendId: friend.id }); + }); + + test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ bestFriendId: 2 }); + }, /You're instantiating a user that has a bestFriendId of 2, but that record doesn't exist in the database/); + }); + + test('the child accepts a null parent id', function(assert) { + let user = this.schema.users.new({ bestFriendId: null }); + + assert.equal(user.bestFriendId, null); + assert.equal(user.bestFriend, null); + assert.deepEqual(user.attrs, { bestFriendId: null }); + }); + + test('the child accepts a saved parent model', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ bestFriend: friend }); + + assert.equal(user.bestFriendId, 1); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + assert.deepEqual(user.attrs, { bestFriendId: null }); // this would update when saved + }); + + test('the child accepts a new parent model', function(assert) { + let zelda = this.schema.users.new({ name: 'Zelda' }); + let user = this.schema.users.new({ bestFriend: zelda }); + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, zelda); + assert.deepEqual(user.attrs, { bestFriendId: null }); + }); + + test('the child accepts a null parent model', function(assert) { + let user = this.schema.users.new({ bestFriend: null }); + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + assert.deepEqual(user.attrs, { bestFriendId: null }); + }); + + test('the child accepts a parent model and id', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ bestFriend: friend, bestFriendId: friend.id }); + + assert.equal(user.bestFriendId, '1'); + assert.deepEqual(user.bestFriend, friend); + assert.deepEqual(user.attrs, { bestFriendId: friend.id }); + }); + + test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let user = this.schema.users.new({}); + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + assert.deepEqual(user.attrs, { bestFriendId: null }); + }); + + test('the child accepts no reference to a parent id or model', function(assert) { + let user = this.schema.users.new(); + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + assert.deepEqual(user.attrs, { bestFriendId: null }); + }); +}); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/accessor-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/accessor-test.js index 8200ecf84..a6a646856 100644 --- a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/accessor-test.js +++ b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/accessor-test.js @@ -1,37 +1,34 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | accessor', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | accessor', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`the references of a ${state} are correct`, function(assert) { - let [ user, friend ] = this.helper[state](); + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { - // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison - if (friend) { - assert.deepEqual(user.bestFriend.attrs, friend.attrs, 'the model reference is correct'); - assert.equal(user.bestFriendId, friend.id, 'the modelId reference is correct'); - } else { - assert.deepEqual(user.bestFriend, null, 'the model reference is correct'); - assert.equal(user.bestFriendId, null, 'the modelId reference is correct'); - } + test(`the references of a ${state} are correct`, function(assert) { + let [ user, friend ] = this.helper[state](); - // If there's a friend in this state, make sure the inverse association is correct - if (friend) { - assert.deepEqual(friend.bestFriend.attrs, user.attrs, 'the inverse model reference is correct'); - assert.equal(friend.bestFriendId, user.id, 'the inverse modelId reference is correct'); - } - }); + // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison + if (friend) { + assert.deepEqual(user.bestFriend.attrs, friend.attrs, 'the model reference is correct'); + assert.equal(user.bestFriendId, friend.id, 'the modelId reference is correct'); + } else { + assert.deepEqual(user.bestFriend, null, 'the model reference is correct'); + assert.equal(user.bestFriendId, null, 'the modelId reference is correct'); + } + // If there's a friend in this state, make sure the inverse association is correct + if (friend) { + assert.deepEqual(friend.bestFriend.attrs, user.attrs, 'the inverse model reference is correct'); + assert.equal(friend.bestFriendId, user.id, 'the inverse modelId reference is correct'); + } }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-create-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-create-test.js index a450ad4ef..8d0680193 100644 --- a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-create-test.js +++ b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-create-test.js @@ -1,29 +1,26 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | association #create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a belongs-to association, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | association #create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); + /* + The model can create a belongs-to association, for all states + */ + states.forEach((state) => { - let ganon = user.createBestFriend({ name: 'Ganon' }); + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); - assert.ok(ganon.id, 'the parent was persisted'); - assert.deepEqual(user.bestFriend.attrs, ganon.attrs); - assert.equal(user.bestFriendId, ganon.id); - assert.equal(this.helper.schema.users.find(user.id).bestFriendId, ganon.id, 'the user was persisted'); - }); + let ganon = user.createBestFriend({ name: 'Ganon' }); + assert.ok(ganon.id, 'the parent was persisted'); + assert.deepEqual(user.bestFriend.attrs, ganon.attrs); + assert.equal(user.bestFriendId, ganon.id); + assert.equal(this.helper.schema.users.find(user.id).bestFriendId, ganon.id, 'the user was persisted'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-new-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-new-test.js index 6166e26e5..510bfd4ac 100644 --- a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-new-test.js +++ b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-new-test.js @@ -1,34 +1,31 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | association #new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ +module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | association #new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + /* + The model can make a new unsaved belongs-to association, for all states + */ - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); + states.forEach((state) => { - let ganon = user.newBestFriend({ name: 'Ganon' }); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); - assert.ok(!ganon.id, 'the parent was not persisted'); - assert.deepEqual(user.bestFriend, ganon); - assert.equal(user.bestFriendId, null); + let ganon = user.newBestFriend({ name: 'Ganon' }); - user.save(); + assert.ok(!ganon.id, 'the parent was not persisted'); + assert.deepEqual(user.bestFriend, ganon); + assert.equal(user.bestFriendId, null); - assert.ok(ganon.id, 'saving the child persists the parent'); - assert.equal(user.bestFriendId, ganon.id, 'the childs fk was updated'); - }); + user.save(); + assert.ok(ganon.id, 'saving the child persists the parent'); + assert.equal(user.bestFriendId, ganon.id, 'the childs fk was updated'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-id-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-id-test.js index 4e909e7c3..06e1c202b 100644 --- a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-id-test.js +++ b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-id-test.js @@ -1,44 +1,41 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | association #setId', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | association #setId', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user ] = this.helper[state](); - let friend = this.helper.savedParent(); + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - user.bestFriendId = friend.id; + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user ] = this.helper[state](); + let friend = this.helper.savedParent(); - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - }); + user.bestFriendId = friend.id; + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); }); - [ - 'savedChildSavedParent', - 'newChildSavedParent' - ].forEach((state) => { + }); - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ user ] = this.helper[state](); + [ + 'savedChildSavedParent', + 'newChildSavedParent' + ].forEach((state) => { - user.bestFriendId = null; + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ user ] = this.helper[state](); - assert.equal(user.bestFriendId, null); - assert.equal(user.bestFriend, null); - }); + user.bestFriendId = null; + assert.equal(user.bestFriendId, null); + assert.equal(user.bestFriend, null); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-test.js index f25151288..a87fa4221 100644 --- a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-test.js +++ b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-test.js @@ -1,47 +1,44 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | association #set', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | association #set', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ user ] = this.helper[state](); - let friend = this.helper.savedParent(); + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - user.bestFriend = friend; + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ user ] = this.helper[state](); + let friend = this.helper.savedParent(); - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - }); + user.bestFriend = friend; - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user ] = this.helper[state](); - let friend = this.helper.newParent(); + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + }); - user.bestFriend = friend; + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user ] = this.helper[state](); + let friend = this.helper.newParent(); - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - }); + user.bestFriend = friend; - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ user ] = this.helper[state](); + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + }); - user.bestFriend = null; + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ user ] = this.helper[state](); - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - }); + user.bestFriend = null; + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/create-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/create-test.js index d4d26b285..1065c7295 100644 --- a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/create-test.js +++ b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/create-test.js @@ -2,64 +2,61 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); +module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + }); + + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let friend = schema.create('user'); + let user = schema.create('user', { + bestFriendId: friend.id }); - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let friend = schema.create('user'); - let user = schema.create('user', { - bestFriendId: friend.id - }); + friend.reload(); - friend.reload(); + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', bestFriendId: '2' }); + assert.deepEqual(schema.db.users[1], { id: '2', bestFriendId: '1' }); + }); - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', bestFriendId: '2' }); - assert.deepEqual(schema.db.users[1], { id: '2', bestFriendId: '1' }); + test('it sets up associations correctly when passing in the association itself', function(assert) { + let { schema } = this.helper; + let friend = schema.create('user'); + let user = schema.create('user', { + bestFriend: friend }); - test('it sets up associations correctly when passing in the association itself', function(assert) { - let { schema } = this.helper; - let friend = schema.create('user'); - let user = schema.create('user', { - bestFriend: friend - }); - - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', bestFriendId: '2' }); - assert.deepEqual(schema.db.users[1], { id: '2', bestFriendId: '1' }); - }); + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', bestFriendId: '2' }); + assert.deepEqual(schema.db.users[1], { id: '2', bestFriendId: '1' }); + }); - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.create('user', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); + assert.throws(function() { + schema.create('user', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); + }); - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); - assert.throws(function() { - schema.create('user', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); - } -); + assert.throws(function() { + schema.create('user', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); +}); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/delete-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/delete-test.js index 4b228a4d8..8396b5d6c 100644 --- a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/delete-test.js +++ b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/delete-test.js @@ -1,27 +1,24 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | delete', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { +module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | delete', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ user, bestFriend ] = this.helper[state](); + states.forEach((state) => { - if (bestFriend) { - bestFriend.destroy(); - user.reload(); - } + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ user, bestFriend ] = this.helper[state](); - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - }); + if (bestFriend) { + bestFriend.destroy(); + user.reload(); + } + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/instantiating-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/instantiating-test.js index 322fdff3d..3567a9cb5 100644 --- a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/instantiating-test.js +++ b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/instantiating-test.js @@ -1,86 +1,83 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | instantiating', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the child accepts a saved parent id', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ bestFriendId: friend.id }); - - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - assert.deepEqual(user.attrs, { bestFriendId: friend.id }); - }); - - test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ bestFriendId: 2 }); - }, /You're instantiating a user that has a bestFriendId of 2, but that record doesn't exist in the database/); - }); - - test('the child accepts a null parent id', function(assert) { - let user = this.schema.users.new({ bestFriendId: null }); - - assert.equal(user.bestFriendId, null); - assert.equal(user.bestFriend, null); - assert.deepEqual(user.attrs, { bestFriendId: null }); - }); - - test('the child accepts a saved parent model', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ bestFriend: friend }); - - assert.equal(user.bestFriendId, 1); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - assert.deepEqual(user.attrs, { bestFriendId: null }); // this would update when saved - }); - - test('the child accepts a new parent model', function(assert) { - let zelda = this.schema.users.new({ name: 'Zelda' }); - let user = this.schema.users.new({ bestFriend: zelda }); - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, zelda); - assert.deepEqual(user.attrs, { bestFriendId: null }); - }); - - test('the child accepts a null parent model', function(assert) { - let user = this.schema.users.new({ bestFriend: null }); - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - assert.deepEqual(user.attrs, { bestFriendId: null }); - }); - - test('the child accepts a parent model and id', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ bestFriend: friend, bestFriendId: friend.id }); - - assert.equal(user.bestFriendId, '1'); - assert.deepEqual(user.bestFriend, friend); - assert.deepEqual(user.attrs, { bestFriendId: friend.id }); - }); - - test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let user = this.schema.users.new({}); - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - assert.deepEqual(user.attrs, { bestFriendId: null }); - }); - - test('the child accepts no reference to a parent id or model', function(assert) { - let user = this.schema.users.new(); - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - assert.deepEqual(user.attrs, { bestFriendId: null }); - }); - } -); +module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | instantiating', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the child accepts a saved parent id', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ bestFriendId: friend.id }); + + assert.equal(user.bestFriendId, friend.id); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + assert.deepEqual(user.attrs, { bestFriendId: friend.id }); + }); + + test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ bestFriendId: 2 }); + }, /You're instantiating a user that has a bestFriendId of 2, but that record doesn't exist in the database/); + }); + + test('the child accepts a null parent id', function(assert) { + let user = this.schema.users.new({ bestFriendId: null }); + + assert.equal(user.bestFriendId, null); + assert.equal(user.bestFriend, null); + assert.deepEqual(user.attrs, { bestFriendId: null }); + }); + + test('the child accepts a saved parent model', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ bestFriend: friend }); + + assert.equal(user.bestFriendId, 1); + assert.deepEqual(user.bestFriend.attrs, friend.attrs); + assert.deepEqual(user.attrs, { bestFriendId: null }); // this would update when saved + }); + + test('the child accepts a new parent model', function(assert) { + let zelda = this.schema.users.new({ name: 'Zelda' }); + let user = this.schema.users.new({ bestFriend: zelda }); + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, zelda); + assert.deepEqual(user.attrs, { bestFriendId: null }); + }); + + test('the child accepts a null parent model', function(assert) { + let user = this.schema.users.new({ bestFriend: null }); + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + assert.deepEqual(user.attrs, { bestFriendId: null }); + }); + + test('the child accepts a parent model and id', function(assert) { + let friend = this.helper.savedParent(); + let user = this.schema.users.new({ bestFriend: friend, bestFriendId: friend.id }); + + assert.equal(user.bestFriendId, '1'); + assert.deepEqual(user.bestFriend, friend); + assert.deepEqual(user.attrs, { bestFriendId: friend.id }); + }); + + test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let user = this.schema.users.new({}); + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + assert.deepEqual(user.attrs, { bestFriendId: null }); + }); + + test('the child accepts no reference to a parent id or model', function(assert) { + let user = this.schema.users.new(); + + assert.equal(user.bestFriendId, null); + assert.deepEqual(user.bestFriend, null); + assert.deepEqual(user.attrs, { bestFriendId: null }); + }); +}); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/accessor-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/accessor-test.js index 52b1e1c5f..02b643655 100644 --- a/tests/integration/orm/belongs-to/6-one-way-reflexive/accessor-test.js +++ b/tests/integration/orm/belongs-to/6-one-way-reflexive/accessor-test.js @@ -1,31 +1,28 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One-Way Reflexive | accessor', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | One-Way Reflexive | accessor', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`the references of a ${state} are correct`, function(assert) { - let [ user, parent ] = this.helper[state](); + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { - // We use .attrs here to avoid infinite recursion - if (parent) { - assert.deepEqual(user.user.attrs, parent.attrs, 'the model reference is correct'); - assert.equal(user.userId, parent.id, 'the modelId reference is correct'); - } else { - assert.deepEqual(user.user, null, 'the model reference is correct'); - assert.equal(user.userId, null, 'the modelId reference is correct'); - } - }); + test(`the references of a ${state} are correct`, function(assert) { + let [ user, parent ] = this.helper[state](); + // We use .attrs here to avoid infinite recursion + if (parent) { + assert.deepEqual(user.user.attrs, parent.attrs, 'the model reference is correct'); + assert.equal(user.userId, parent.id, 'the modelId reference is correct'); + } else { + assert.deepEqual(user.user, null, 'the model reference is correct'); + assert.equal(user.userId, null, 'the modelId reference is correct'); + } }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-create-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-create-test.js index 4da2652d6..23d6230d0 100644 --- a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-create-test.js +++ b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-create-test.js @@ -1,29 +1,26 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One-Way Reflexive | association #create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a belongs-to association, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | One-Way Reflexive | association #create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can create an associated parent`, function(assert) { - let [ child ] = this.helper[state](); + /* + The model can create a belongs-to association, for all states + */ + states.forEach((state) => { - let ganon = child.createUser({ name: 'Ganon' }); + test(`a ${state} can create an associated parent`, function(assert) { + let [ child ] = this.helper[state](); - assert.ok(ganon.id, 'the parent was persisted'); - assert.deepEqual(child.user.attrs, ganon.attrs); - assert.equal(child.userId, ganon.id); - assert.equal(this.helper.schema.users.find(child.id).userId, ganon.id, 'the child was persisted'); - }); + let ganon = child.createUser({ name: 'Ganon' }); + assert.ok(ganon.id, 'the parent was persisted'); + assert.deepEqual(child.user.attrs, ganon.attrs); + assert.equal(child.userId, ganon.id); + assert.equal(this.helper.schema.users.find(child.id).userId, ganon.id, 'the child was persisted'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-new-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-new-test.js index d6ef421ba..9e3080664 100644 --- a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-new-test.js +++ b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-new-test.js @@ -1,34 +1,31 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One-Way Reflexive | association #new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ +module('Integration | ORM | Belongs To | One-Way Reflexive | association #new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + /* + The model can make a new unsaved belongs-to association, for all states + */ - test(`a ${state} can build a new associated parent`, function(assert) { - let [ child ] = this.helper[state](); + states.forEach((state) => { - let ganon = child.newUser({ name: 'Ganon' }); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ child ] = this.helper[state](); - assert.ok(!ganon.id, 'the parent was not persisted'); - assert.deepEqual(child.user, ganon); - assert.equal(child.userId, null); + let ganon = child.newUser({ name: 'Ganon' }); - child.save(); + assert.ok(!ganon.id, 'the parent was not persisted'); + assert.deepEqual(child.user, ganon); + assert.equal(child.userId, null); - assert.ok(ganon.id, 'saving the child persists the parent'); - assert.equal(child.userId, ganon.id, 'the childs fk was updated'); - }); + child.save(); + assert.ok(ganon.id, 'saving the child persists the parent'); + assert.equal(child.userId, ganon.id, 'the childs fk was updated'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-id-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-id-test.js index 4852d73ab..08112deda 100644 --- a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-id-test.js +++ b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-id-test.js @@ -1,44 +1,41 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One-Way Reflexive | association #setId', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | One-Way Reflexive | association #setId', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ child ] = this.helper[state](); - let savedParent = this.helper.savedParent(); + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - child.userId = savedParent.id; + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ child ] = this.helper[state](); + let savedParent = this.helper.savedParent(); - assert.equal(child.userId, savedParent.id); - assert.deepEqual(child.user.attrs, savedParent.attrs); - }); + child.userId = savedParent.id; + assert.equal(child.userId, savedParent.id); + assert.deepEqual(child.user.attrs, savedParent.attrs); }); - [ - 'savedChildSavedParent', - 'newChildSavedParent' - ].forEach((state) => { + }); - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ child ] = this.helper[state](); + [ + 'savedChildSavedParent', + 'newChildSavedParent' + ].forEach((state) => { - child.userId = null; + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ child ] = this.helper[state](); - assert.equal(child.userId, null); - assert.deepEqual(child.user, null); - }); + child.userId = null; + assert.equal(child.userId, null); + assert.deepEqual(child.user, null); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-test.js index bfa722f6f..8fc9f88f3 100644 --- a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-test.js +++ b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-test.js @@ -1,47 +1,44 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One-Way Reflexive | association #set', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | One-Way Reflexive | association #set', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ child ] = this.helper[state](); - let savedParent = this.helper.savedParent(); + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - child.user = savedParent; + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ child ] = this.helper[state](); + let savedParent = this.helper.savedParent(); - assert.equal(child.userId, savedParent.id); - assert.deepEqual(child.user.attrs, savedParent.attrs); - }); + child.user = savedParent; - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ child ] = this.helper[state](); - let newParent = this.helper.newParent(); + assert.equal(child.userId, savedParent.id); + assert.deepEqual(child.user.attrs, savedParent.attrs); + }); - child.user = newParent; + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ child ] = this.helper[state](); + let newParent = this.helper.newParent(); - assert.equal(child.userId, null); - assert.deepEqual(child.user, newParent); - }); + child.user = newParent; - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ child ] = this.helper[state](); + assert.equal(child.userId, null); + assert.deepEqual(child.user, newParent); + }); - child.user = null; + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ child ] = this.helper[state](); - assert.equal(child.userId, null); - assert.deepEqual(child.user, null); - }); + child.user = null; + assert.equal(child.userId, null); + assert.deepEqual(child.user, null); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/create-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/create-test.js index d5e057c03..4a60f5e98 100644 --- a/tests/integration/orm/belongs-to/6-one-way-reflexive/create-test.js +++ b/tests/integration/orm/belongs-to/6-one-way-reflexive/create-test.js @@ -2,62 +2,59 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One-Way Reflexive | create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); +module('Integration | ORM | Belongs To | One-Way Reflexive | create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + }); + + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let parent = schema.create('user'); + let child = schema.create('user', { + userId: parent.id }); - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let parent = schema.create('user'); - let child = schema.create('user', { - userId: parent.id - }); - - assert.equal(child.userId, parent.id); - assert.deepEqual(child.user.attrs, parent.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', userId: null }); - assert.deepEqual(schema.db.users[1], { id: '2', userId: '1' }); + assert.equal(child.userId, parent.id); + assert.deepEqual(child.user.attrs, parent.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', userId: null }); + assert.deepEqual(schema.db.users[1], { id: '2', userId: '1' }); + }); + + test('it sets up associations correctly when passing in the association itself', function(assert) { + let { schema } = this.helper; + let parent = schema.create('user'); + let child = schema.create('user', { + user: parent }); - test('it sets up associations correctly when passing in the association itself', function(assert) { - let { schema } = this.helper; - let parent = schema.create('user'); - let child = schema.create('user', { - user: parent - }); - - assert.equal(child.userId, parent.id); - assert.deepEqual(child.user.attrs, parent.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', userId: null }); - assert.deepEqual(schema.db.users[1], { id: '2', userId: '1' }); - }); + assert.equal(child.userId, parent.id); + assert.deepEqual(child.user.attrs, parent.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', userId: null }); + assert.deepEqual(schema.db.users[1], { id: '2', userId: '1' }); + }); - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.create('user', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); + assert.throws(function() { + schema.create('user', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); + }); - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); - assert.throws(function() { - schema.create('user', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); - } -); + assert.throws(function() { + schema.create('user', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); +}); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/delete-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/delete-test.js index d351fd8d7..a8f9238e7 100644 --- a/tests/integration/orm/belongs-to/6-one-way-reflexive/delete-test.js +++ b/tests/integration/orm/belongs-to/6-one-way-reflexive/delete-test.js @@ -1,27 +1,24 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One-Way Reflexive | delete', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { +module('Integration | ORM | Belongs To | One-Way Reflexive | delete', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ user, targetUser ] = this.helper[state](); + states.forEach((state) => { - if (targetUser) { - targetUser.destroy(); - user.reload(); - } + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ user, targetUser ] = this.helper[state](); - assert.equal(user.userId, null); - assert.deepEqual(user.user, null); - }); + if (targetUser) { + targetUser.destroy(); + user.reload(); + } + assert.equal(user.userId, null); + assert.deepEqual(user.user, null); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/instantiating-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/instantiating-test.js index d5301f406..886f7b9ad 100644 --- a/tests/integration/orm/belongs-to/6-one-way-reflexive/instantiating-test.js +++ b/tests/integration/orm/belongs-to/6-one-way-reflexive/instantiating-test.js @@ -1,85 +1,82 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One-Way Reflexive | instantiating', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the child accepts a saved parent id', function(assert) { - let parent = this.helper.savedParent(); - let child = this.schema.users.new({ userId: parent.id }); - - assert.equal(child.userId, parent.id); - assert.deepEqual(child.user.attrs, parent.attrs); - assert.deepEqual(child.attrs, { userId: parent.id }); - }); - - test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ userId: 2 }); - }, /You're instantiating a user that has a userId of 2, but that record doesn't exist in the database/); - }); - - test('the child accepts a null parent id', function(assert) { - let child = this.schema.users.new({ userId: null }); - - assert.equal(child.userId, null); - assert.deepEqual(child.user, null); - assert.deepEqual(child.attrs, { userId: null }); - }); - - test('the child accepts a saved parent model', function(assert) { - let parent = this.helper.savedParent(); - let child = this.schema.users.new({ user: parent }); - - assert.equal(child.userId, 1); - assert.deepEqual(child.user.attrs, parent.attrs); - }); - - test('the child accepts a new parent model', function(assert) { - let zelda = this.schema.users.new({ name: 'Zelda' }); - let child = this.schema.users.new({ user: zelda }); - - assert.equal(child.userId, null); - assert.deepEqual(child.user, zelda); - assert.deepEqual(child.attrs, { userId: null }); - }); - - test('the child accepts a null parent model', function(assert) { - let child = this.schema.users.new({ user: null }); - - assert.equal(child.userId, null); - assert.deepEqual(child.user, null); - assert.deepEqual(child.attrs, { userId: null }); - }); - - test('the child accepts a parent model and id', function(assert) { - let parent = this.helper.savedParent(); - let child = this.schema.users.new({ user: parent, userId: parent.id }); - - assert.equal(child.userId, '1'); - assert.deepEqual(child.user.attrs, parent.attrs); - assert.deepEqual(child.attrs, { userId: parent.id }); - }); - - test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let child = this.schema.users.new({}); - - assert.equal(child.userId, null); - assert.deepEqual(child.user, null); - assert.deepEqual(child.attrs, { userId: null }); - }); - - test('the child accepts no reference to a parent id or model', function(assert) { - let child = this.schema.users.new(); - - assert.equal(child.userId, null); - assert.deepEqual(child.user, null); - assert.deepEqual(child.attrs, { userId: null }); - }); - } -); +module('Integration | ORM | Belongs To | One-Way Reflexive | instantiating', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the child accepts a saved parent id', function(assert) { + let parent = this.helper.savedParent(); + let child = this.schema.users.new({ userId: parent.id }); + + assert.equal(child.userId, parent.id); + assert.deepEqual(child.user.attrs, parent.attrs); + assert.deepEqual(child.attrs, { userId: parent.id }); + }); + + test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ userId: 2 }); + }, /You're instantiating a user that has a userId of 2, but that record doesn't exist in the database/); + }); + + test('the child accepts a null parent id', function(assert) { + let child = this.schema.users.new({ userId: null }); + + assert.equal(child.userId, null); + assert.deepEqual(child.user, null); + assert.deepEqual(child.attrs, { userId: null }); + }); + + test('the child accepts a saved parent model', function(assert) { + let parent = this.helper.savedParent(); + let child = this.schema.users.new({ user: parent }); + + assert.equal(child.userId, 1); + assert.deepEqual(child.user.attrs, parent.attrs); + }); + + test('the child accepts a new parent model', function(assert) { + let zelda = this.schema.users.new({ name: 'Zelda' }); + let child = this.schema.users.new({ user: zelda }); + + assert.equal(child.userId, null); + assert.deepEqual(child.user, zelda); + assert.deepEqual(child.attrs, { userId: null }); + }); + + test('the child accepts a null parent model', function(assert) { + let child = this.schema.users.new({ user: null }); + + assert.equal(child.userId, null); + assert.deepEqual(child.user, null); + assert.deepEqual(child.attrs, { userId: null }); + }); + + test('the child accepts a parent model and id', function(assert) { + let parent = this.helper.savedParent(); + let child = this.schema.users.new({ user: parent, userId: parent.id }); + + assert.equal(child.userId, '1'); + assert.deepEqual(child.user.attrs, parent.attrs); + assert.deepEqual(child.attrs, { userId: parent.id }); + }); + + test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let child = this.schema.users.new({}); + + assert.equal(child.userId, null); + assert.deepEqual(child.user, null); + assert.deepEqual(child.attrs, { userId: null }); + }); + + test('the child accepts no reference to a parent id or model', function(assert) { + let child = this.schema.users.new(); + + assert.equal(child.userId, null); + assert.deepEqual(child.user, null); + assert.deepEqual(child.attrs, { userId: null }); + }); +}); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/accessor-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/accessor-test.js index 27c5749ef..4eb66e5ee 100644 --- a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/accessor-test.js +++ b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/accessor-test.js @@ -1,31 +1,28 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named One-Way Reflexive | accessor', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | Named One-Way Reflexive | accessor', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`the references of a ${state} are correct`, function(assert) { - let [ user, parent ] = this.helper[state](); + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { - // We use .attrs here to avoid infinite recursion - if (parent) { - assert.deepEqual(user.parent.attrs, parent.attrs, 'the model reference is correct'); - assert.equal(user.parentId, parent.id, 'the modelId reference is correct'); - } else { - assert.deepEqual(user.parent, null, 'the model reference is correct'); - assert.equal(user.parentId, null, 'the modelId reference is correct'); - } - }); + test(`the references of a ${state} are correct`, function(assert) { + let [ user, parent ] = this.helper[state](); + // We use .attrs here to avoid infinite recursion + if (parent) { + assert.deepEqual(user.parent.attrs, parent.attrs, 'the model reference is correct'); + assert.equal(user.parentId, parent.id, 'the modelId reference is correct'); + } else { + assert.deepEqual(user.parent, null, 'the model reference is correct'); + assert.equal(user.parentId, null, 'the modelId reference is correct'); + } }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-create-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-create-test.js index fea218230..edd67ff21 100644 --- a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-create-test.js +++ b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-create-test.js @@ -1,29 +1,26 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named One-Way Reflexive | association #create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a belongs-to association, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | Named One-Way Reflexive | association #create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can create an associated parent`, function(assert) { - let [ child ] = this.helper[state](); + /* + The model can create a belongs-to association, for all states + */ + states.forEach((state) => { - let ganon = child.createParent({ name: 'Ganon' }); + test(`a ${state} can create an associated parent`, function(assert) { + let [ child ] = this.helper[state](); - assert.ok(ganon.id, 'the parent was persisted'); - assert.deepEqual(child.parent.attrs, ganon.attrs); - assert.equal(child.parentId, ganon.id); - assert.equal(this.helper.schema.users.find(child.id).parentId, ganon.id, 'the child was persisted'); - }); + let ganon = child.createParent({ name: 'Ganon' }); + assert.ok(ganon.id, 'the parent was persisted'); + assert.deepEqual(child.parent.attrs, ganon.attrs); + assert.equal(child.parentId, ganon.id); + assert.equal(this.helper.schema.users.find(child.id).parentId, ganon.id, 'the child was persisted'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-new-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-new-test.js index 27cbf9889..556c3df43 100644 --- a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-new-test.js +++ b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-new-test.js @@ -1,34 +1,31 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named One-Way Reflexive | association #new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ +module('Integration | ORM | Belongs To | Named One-Way Reflexive | association #new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + /* + The model can make a new unsaved belongs-to association, for all states + */ - test(`a ${state} can build a new associated parent`, function(assert) { - let [ child ] = this.helper[state](); + states.forEach((state) => { - let ganon = child.newParent({ name: 'Ganon' }); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ child ] = this.helper[state](); - assert.ok(!ganon.id, 'the parent was not persisted'); - assert.deepEqual(child.parent, ganon); - assert.equal(child.parentId, null); + let ganon = child.newParent({ name: 'Ganon' }); - child.save(); + assert.ok(!ganon.id, 'the parent was not persisted'); + assert.deepEqual(child.parent, ganon); + assert.equal(child.parentId, null); - assert.ok(ganon.id, 'saving the child persists the parent'); - assert.equal(child.parentId, ganon.id, 'the childs fk was updated'); - }); + child.save(); + assert.ok(ganon.id, 'saving the child persists the parent'); + assert.equal(child.parentId, ganon.id, 'the childs fk was updated'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-id-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-id-test.js index 4a6d31a41..effec45a1 100644 --- a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-id-test.js +++ b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-id-test.js @@ -1,44 +1,41 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named One-Way Reflexive | association #setId', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | Named One-Way Reflexive | association #setId', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ child ] = this.helper[state](); - let savedParent = this.helper.savedParent(); + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - child.parentId = savedParent.id; + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ child ] = this.helper[state](); + let savedParent = this.helper.savedParent(); - assert.equal(child.parentId, savedParent.id); - assert.deepEqual(child.parent.attrs, savedParent.attrs); - }); + child.parentId = savedParent.id; + assert.equal(child.parentId, savedParent.id); + assert.deepEqual(child.parent.attrs, savedParent.attrs); }); - [ - 'savedChildSavedParent', - 'newChildSavedParent' - ].forEach((state) => { + }); - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ child ] = this.helper[state](); + [ + 'savedChildSavedParent', + 'newChildSavedParent' + ].forEach((state) => { - child.parentId = null; + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ child ] = this.helper[state](); - assert.equal(child.parentId, null); - assert.deepEqual(child.parent, null); - }); + child.parentId = null; + assert.equal(child.parentId, null); + assert.deepEqual(child.parent, null); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-test.js index 0bdc202c8..9bc5cf453 100644 --- a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-test.js +++ b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-test.js @@ -1,47 +1,44 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named One-Way Reflexive | association #set', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | Named One-Way Reflexive | association #set', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ child ] = this.helper[state](); - let savedParent = this.helper.savedParent(); + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - child.parent = savedParent; + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ child ] = this.helper[state](); + let savedParent = this.helper.savedParent(); - assert.equal(child.parentId, savedParent.id); - assert.deepEqual(child.parent.attrs, savedParent.attrs); - }); + child.parent = savedParent; - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ child ] = this.helper[state](); - let newParent = this.helper.newParent(); + assert.equal(child.parentId, savedParent.id); + assert.deepEqual(child.parent.attrs, savedParent.attrs); + }); - child.parent = newParent; + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ child ] = this.helper[state](); + let newParent = this.helper.newParent(); - assert.equal(child.parentId, null); - assert.deepEqual(child.parent, newParent); - }); + child.parent = newParent; - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ child ] = this.helper[state](); + assert.equal(child.parentId, null); + assert.deepEqual(child.parent, newParent); + }); - child.parent = null; + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ child ] = this.helper[state](); - assert.equal(child.parentId, null); - assert.deepEqual(child.parent, null); - }); + child.parent = null; + assert.equal(child.parentId, null); + assert.deepEqual(child.parent, null); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/create-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/create-test.js index adc3c3621..c5be2d821 100644 --- a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/create-test.js +++ b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/create-test.js @@ -2,62 +2,59 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named One-Way Reflexive | create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); +module('Integration | ORM | Belongs To | Named One-Way Reflexive | create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + }); + + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let parent = schema.create('user'); + let child = schema.create('user', { + parentId: parent.id }); - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let parent = schema.create('user'); - let child = schema.create('user', { - parentId: parent.id - }); - - assert.equal(child.parentId, parent.id); - assert.deepEqual(child.parent.attrs, parent.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', parentId: null }); - assert.deepEqual(schema.db.users[1], { id: '2', parentId: '1' }); + assert.equal(child.parentId, parent.id); + assert.deepEqual(child.parent.attrs, parent.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', parentId: null }); + assert.deepEqual(schema.db.users[1], { id: '2', parentId: '1' }); + }); + + test('it sets up associations correctly when passing in the association itself', function(assert) { + let { schema } = this.helper; + let parent = schema.create('user'); + let child = schema.create('user', { + parent }); - test('it sets up associations correctly when passing in the association itself', function(assert) { - let { schema } = this.helper; - let parent = schema.create('user'); - let child = schema.create('user', { - parent - }); - - assert.equal(child.parentId, parent.id); - assert.deepEqual(child.parent.attrs, parent.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', parentId: null }); - assert.deepEqual(schema.db.users[1], { id: '2', parentId: '1' }); - }); + assert.equal(child.parentId, parent.id); + assert.deepEqual(child.parent.attrs, parent.attrs); + assert.equal(schema.db.users.length, 2); + assert.deepEqual(schema.db.users[0], { id: '1', parentId: null }); + assert.deepEqual(schema.db.users[1], { id: '2', parentId: '1' }); + }); - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.create('user', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); + assert.throws(function() { + schema.create('user', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); + }); - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); - assert.throws(function() { - schema.create('user', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); - } -); + assert.throws(function() { + schema.create('user', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); +}); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/delete-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/delete-test.js index 3e6bbabbe..3c2e080c9 100644 --- a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/delete-test.js +++ b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/delete-test.js @@ -1,27 +1,24 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named One-Way Reflexive | delete', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { +module('Integration | ORM | Belongs To | Named One-Way Reflexive | delete', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ user, parent ] = this.helper[state](); + states.forEach((state) => { - if (parent) { - parent.destroy(); - user.reload(); - } + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ user, parent ] = this.helper[state](); - assert.equal(user.parentId, null); - assert.deepEqual(user.parent, null); - }); + if (parent) { + parent.destroy(); + user.reload(); + } + assert.equal(user.parentId, null); + assert.deepEqual(user.parent, null); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/instantiating-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/instantiating-test.js index ff3ddf7a8..b7cb0751b 100644 --- a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/instantiating-test.js +++ b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/instantiating-test.js @@ -1,85 +1,82 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | Named One-Way Reflexive | instantiating', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the child accepts a saved parent id', function(assert) { - let parent = this.helper.savedParent(); - let child = this.schema.users.new({ parentId: parent.id }); - - assert.equal(child.parentId, parent.id); - assert.deepEqual(child.parent.attrs, parent.attrs); - assert.deepEqual(child.attrs, { parentId: parent.id }); - }); - - test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ parentId: 2 }); - }, /You're instantiating a user that has a parentId of 2, but that record doesn't exist in the database/); - }); - - test('the child accepts a null parent id', function(assert) { - let child = this.schema.users.new({ parentId: null }); - - assert.equal(child.parentId, null); - assert.deepEqual(child.parent, null); - assert.deepEqual(child.attrs, { parentId: null }); - }); - - test('the child accepts a saved parent model', function(assert) { - let parent = this.helper.savedParent(); - let child = this.schema.users.new({ parent }); - - assert.equal(child.parentId, 1); - assert.deepEqual(child.parent.attrs, parent.attrs); - }); - - test('the child accepts a new parent model', function(assert) { - let zelda = this.schema.users.new({ name: 'Zelda' }); - let child = this.schema.users.new({ parent: zelda }); - - assert.equal(child.parentId, null); - assert.deepEqual(child.parent, zelda); - assert.deepEqual(child.attrs, { parentId: null }); - }); - - test('the child accepts a null parent model', function(assert) { - let child = this.schema.users.new({ parent: null }); - - assert.equal(child.parentId, null); - assert.deepEqual(child.parent, null); - assert.deepEqual(child.attrs, { parentId: null }); - }); - - test('the child accepts a parent model and id', function(assert) { - let parent = this.helper.savedParent(); - let child = this.schema.users.new({ parent, parentId: parent.id }); - - assert.equal(child.parentId, '1'); - assert.deepEqual(child.parent.attrs, parent.attrs); - assert.deepEqual(child.attrs, { parentId: parent.id }); - }); - - test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let child = this.schema.users.new({}); - - assert.equal(child.parentId, null); - assert.deepEqual(child.parent, null); - assert.deepEqual(child.attrs, { parentId: null }); - }); - - test('the child accepts no reference to a parent id or model', function(assert) { - let child = this.schema.users.new(); - - assert.equal(child.parentId, null); - assert.deepEqual(child.parent, null); - assert.deepEqual(child.attrs, { parentId: null }); - }); - } -); +module('Integration | ORM | Belongs To | Named One-Way Reflexive | instantiating', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the child accepts a saved parent id', function(assert) { + let parent = this.helper.savedParent(); + let child = this.schema.users.new({ parentId: parent.id }); + + assert.equal(child.parentId, parent.id); + assert.deepEqual(child.parent.attrs, parent.attrs); + assert.deepEqual(child.attrs, { parentId: parent.id }); + }); + + test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ parentId: 2 }); + }, /You're instantiating a user that has a parentId of 2, but that record doesn't exist in the database/); + }); + + test('the child accepts a null parent id', function(assert) { + let child = this.schema.users.new({ parentId: null }); + + assert.equal(child.parentId, null); + assert.deepEqual(child.parent, null); + assert.deepEqual(child.attrs, { parentId: null }); + }); + + test('the child accepts a saved parent model', function(assert) { + let parent = this.helper.savedParent(); + let child = this.schema.users.new({ parent }); + + assert.equal(child.parentId, 1); + assert.deepEqual(child.parent.attrs, parent.attrs); + }); + + test('the child accepts a new parent model', function(assert) { + let zelda = this.schema.users.new({ name: 'Zelda' }); + let child = this.schema.users.new({ parent: zelda }); + + assert.equal(child.parentId, null); + assert.deepEqual(child.parent, zelda); + assert.deepEqual(child.attrs, { parentId: null }); + }); + + test('the child accepts a null parent model', function(assert) { + let child = this.schema.users.new({ parent: null }); + + assert.equal(child.parentId, null); + assert.deepEqual(child.parent, null); + assert.deepEqual(child.attrs, { parentId: null }); + }); + + test('the child accepts a parent model and id', function(assert) { + let parent = this.helper.savedParent(); + let child = this.schema.users.new({ parent, parentId: parent.id }); + + assert.equal(child.parentId, '1'); + assert.deepEqual(child.parent.attrs, parent.attrs); + assert.deepEqual(child.attrs, { parentId: parent.id }); + }); + + test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let child = this.schema.users.new({}); + + assert.equal(child.parentId, null); + assert.deepEqual(child.parent, null); + assert.deepEqual(child.attrs, { parentId: null }); + }); + + test('the child accepts no reference to a parent id or model', function(assert) { + let child = this.schema.users.new(); + + assert.equal(child.parentId, null); + assert.deepEqual(child.parent, null); + assert.deepEqual(child.attrs, { parentId: null }); + }); +}); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/accessor-test.js b/tests/integration/orm/belongs-to/8-one-to-one/accessor-test.js index 30f1abe56..f72e04488 100644 --- a/tests/integration/orm/belongs-to/8-one-to-one/accessor-test.js +++ b/tests/integration/orm/belongs-to/8-one-to-one/accessor-test.js @@ -1,37 +1,34 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One To One | accessor', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | One To One | accessor', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`the references of a ${state} are correct`, function(assert) { - let [ user, profile ] = this.helper[state](); + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { - // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison - if (profile) { - assert.deepEqual(user.profile.attrs, profile.attrs, 'the model reference is correct'); - assert.equal(user.profileId, profile.id, 'the modelId reference is correct'); - } else { - assert.deepEqual(user.profile, null, 'the model reference is correct'); - assert.equal(user.profileId, null, 'the modelId reference is correct'); - } + test(`the references of a ${state} are correct`, function(assert) { + let [ user, profile ] = this.helper[state](); - // If there's a profile in this state, make sure the inverse association is correct - if (profile) { - assert.deepEqual(profile.user.attrs, user.attrs, 'the inverse model reference is correct'); - assert.equal(profile.userId, user.id, 'the inverse modelId reference is correct'); - } - }); + // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison + if (profile) { + assert.deepEqual(user.profile.attrs, profile.attrs, 'the model reference is correct'); + assert.equal(user.profileId, profile.id, 'the modelId reference is correct'); + } else { + assert.deepEqual(user.profile, null, 'the model reference is correct'); + assert.equal(user.profileId, null, 'the modelId reference is correct'); + } + // If there's a profile in this state, make sure the inverse association is correct + if (profile) { + assert.deepEqual(profile.user.attrs, user.attrs, 'the inverse model reference is correct'); + assert.equal(profile.userId, user.id, 'the inverse modelId reference is correct'); + } }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/association-create-test.js b/tests/integration/orm/belongs-to/8-one-to-one/association-create-test.js index 32d396e66..e8ec1ae35 100644 --- a/tests/integration/orm/belongs-to/8-one-to-one/association-create-test.js +++ b/tests/integration/orm/belongs-to/8-one-to-one/association-create-test.js @@ -1,30 +1,27 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One To One | association #create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a belongs-to association, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | One To One | association #create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); + /* + The model can create a belongs-to association, for all states + */ + states.forEach((state) => { - let profile = user.createProfile({ age: 300 }); + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); - assert.ok(profile.id, 'the parent was persisted'); - assert.deepEqual(user.profile.attrs, profile.attrs); - assert.deepEqual(profile.user.attrs, user.attrs, 'the inverse was set'); - assert.equal(user.profileId, profile.id); - assert.equal(this.helper.schema.users.find(user.id).profileId, profile.id, 'the user was persisted'); - }); + let profile = user.createProfile({ age: 300 }); + assert.ok(profile.id, 'the parent was persisted'); + assert.deepEqual(user.profile.attrs, profile.attrs); + assert.deepEqual(profile.user.attrs, user.attrs, 'the inverse was set'); + assert.equal(user.profileId, profile.id); + assert.equal(this.helper.schema.users.find(user.id).profileId, profile.id, 'the user was persisted'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/association-new-test.js b/tests/integration/orm/belongs-to/8-one-to-one/association-new-test.js index 3fbe44d1b..51951ffe5 100644 --- a/tests/integration/orm/belongs-to/8-one-to-one/association-new-test.js +++ b/tests/integration/orm/belongs-to/8-one-to-one/association-new-test.js @@ -1,36 +1,33 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One To One | association #new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ +module('Integration | ORM | Belongs To | One To One | association #new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + /* + The model can make a new unsaved belongs-to association, for all states + */ - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); + states.forEach((state) => { - let profile = user.newProfile({ age: 300 }); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); - assert.ok(!profile.id, 'the parent was not persisted'); - assert.deepEqual(user.profile, profile); - assert.equal(user.profileId, null); - assert.deepEqual(profile.user, user, 'the inverse was set'); - assert.equal(profile.userId, user.id); + let profile = user.newProfile({ age: 300 }); - user.save(); + assert.ok(!profile.id, 'the parent was not persisted'); + assert.deepEqual(user.profile, profile); + assert.equal(user.profileId, null); + assert.deepEqual(profile.user, user, 'the inverse was set'); + assert.equal(profile.userId, user.id); - assert.ok(profile.id, 'saving the child persists the parent'); - assert.equal(user.profileId, profile.id, 'the childs fk was updated'); - }); + user.save(); + assert.ok(profile.id, 'saving the child persists the parent'); + assert.equal(user.profileId, profile.id, 'the childs fk was updated'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/association-set-id-test.js b/tests/integration/orm/belongs-to/8-one-to-one/association-set-id-test.js index 361b6467d..3ba448827 100644 --- a/tests/integration/orm/belongs-to/8-one-to-one/association-set-id-test.js +++ b/tests/integration/orm/belongs-to/8-one-to-one/association-set-id-test.js @@ -1,50 +1,47 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One To One | association #setId', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | One To One | association #setId', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user ] = this.helper[state](); - let profile = this.helper.savedParent(); + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - user.profileId = profile.id; + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user ] = this.helper[state](); + let profile = this.helper.savedParent(); - assert.equal(user.profileId, profile.id); - assert.deepEqual(user.profile.attrs, profile.attrs); + user.profileId = profile.id; - user.save(); - profile.reload(); + assert.equal(user.profileId, profile.id); + assert.deepEqual(user.profile.attrs, profile.attrs); - assert.equal(profile.userId, user.id, 'the inverse was set'); - assert.deepEqual(profile.user.attrs, user.attrs); - }); + user.save(); + profile.reload(); + assert.equal(profile.userId, user.id, 'the inverse was set'); + assert.deepEqual(profile.user.attrs, user.attrs); }); - // [ - // 'savedChildSavedParent', - // 'newChildSavedParent' - // ].forEach((state) => { - // - // test(`a ${state} can clear its association via a null parentId`, function(assert) { - // let [ user ] = this.helper[state](); - // - // user.userId = null; - // - // assert.equal(user.userId, null); - // assert.equal(user.user, null); - // }); - // - // }); - } -); + }); + + // [ + // 'savedChildSavedParent', + // 'newChildSavedParent' + // ].forEach((state) => { + // + // test(`a ${state} can clear its association via a null parentId`, function(assert) { + // let [ user ] = this.helper[state](); + // + // user.userId = null; + // + // assert.equal(user.userId, null); + // assert.equal(user.user, null); + // }); + // + // }); +}); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/association-set-test.js b/tests/integration/orm/belongs-to/8-one-to-one/association-set-test.js index ed32c5686..8ef6095c6 100644 --- a/tests/integration/orm/belongs-to/8-one-to-one/association-set-test.js +++ b/tests/integration/orm/belongs-to/8-one-to-one/association-set-test.js @@ -1,52 +1,49 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One To One | association #set', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); +module('Integration | ORM | Belongs To | One To One | association #set', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); + + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ user ] = this.helper[state](); + let profile = this.helper.savedParent(); + + user.profile = profile; + + assert.equal(user.profileId, profile.id); + assert.deepEqual(user.profile.attrs, profile.attrs); + assert.equal(profile.userId, user.id, 'the inverse was set'); + assert.deepEqual(profile.user.attrs, user.attrs); }); - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user ] = this.helper[state](); + let profile = this.helper.newParent(); - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ user ] = this.helper[state](); - let profile = this.helper.savedParent(); + user.profile = profile; - user.profile = profile; + assert.equal(user.profileId, null); + assert.deepEqual(user.profile.attrs, profile.attrs); - assert.equal(user.profileId, profile.id); - assert.deepEqual(user.profile.attrs, profile.attrs); - assert.equal(profile.userId, user.id, 'the inverse was set'); - assert.deepEqual(profile.user.attrs, user.attrs); - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user ] = this.helper[state](); - let profile = this.helper.newParent(); - - user.profile = profile; - - assert.equal(user.profileId, null); - assert.deepEqual(user.profile.attrs, profile.attrs); - - assert.equal(profile.userId, user.id, 'the inverse was set'); - assert.deepEqual(profile.user.attrs, user.attrs); - }); - - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ user ] = this.helper[state](); + assert.equal(profile.userId, user.id, 'the inverse was set'); + assert.deepEqual(profile.user.attrs, user.attrs); + }); - user.profile = null; + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ user ] = this.helper[state](); - assert.equal(user.profileId, null); - assert.deepEqual(user.profile, null); - }); + user.profile = null; + assert.equal(user.profileId, null); + assert.deepEqual(user.profile, null); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/instantiating-test.js b/tests/integration/orm/belongs-to/8-one-to-one/instantiating-test.js index c306fb8dd..312290b0a 100644 --- a/tests/integration/orm/belongs-to/8-one-to-one/instantiating-test.js +++ b/tests/integration/orm/belongs-to/8-one-to-one/instantiating-test.js @@ -1,86 +1,83 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One To One | instantiating', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the child accepts a saved parent id', function(assert) { - let profile = this.helper.savedParent(); - let user = this.schema.users.new({ profileId: profile.id }); - - assert.equal(user.profileId, profile.id); - assert.deepEqual(user.profile.attrs, profile.attrs); - assert.deepEqual(user.attrs, { profileId: profile.id }); - }); - - test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ profileId: 2 }); - }, /You're instantiating a user that has a profileId of 2, but that record doesn't exist in the database/); - }); - - test('the child accepts a null parent id', function(assert) { - let user = this.schema.users.new({ profileId: null }); - - assert.equal(user.profileId, null); - assert.equal(user.profile, null); - assert.deepEqual(user.attrs, { profileId: null }); - }); - - test('the child accepts a saved parent model', function(assert) { - let profile = this.helper.savedParent(); - let user = this.schema.users.new({ profile }); - - assert.equal(user.profileId, 1); - assert.deepEqual(user.profile.attrs, profile.attrs); - assert.deepEqual(user.attrs, { profileId: null }); // this would update when saved - }); - - test('the child accepts a new parent model', function(assert) { - let profile = this.schema.profiles.new({ age: 300 }); - let user = this.schema.users.new({ profile }); - - assert.equal(user.profileId, null); - assert.deepEqual(user.profile, profile); - assert.deepEqual(user.attrs, { profileId: null }); - }); - - test('the child accepts a null parent model', function(assert) { - let user = this.schema.users.new({ profile: null }); - - assert.equal(user.profileId, null); - assert.deepEqual(user.profile, null); - assert.deepEqual(user.attrs, { profileId: null }); - }); - - test('the child accepts a parent model and id', function(assert) { - let profile = this.helper.savedParent(); - let user = this.schema.users.new({ profile, profileId: profile.id }); - - assert.equal(user.profileId, '1'); - assert.deepEqual(user.profile, profile); - assert.deepEqual(user.attrs, { profileId: profile.id }); - }); - - test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let user = this.schema.users.new({}); - - assert.equal(user.profileId, null); - assert.deepEqual(user.profile, null); - assert.deepEqual(user.attrs, { profileId: null }); - }); - - test('the child accepts no reference to a parent id or model', function(assert) { - let user = this.schema.users.new(); - - assert.equal(user.profileId, null); - assert.deepEqual(user.profile, null); - assert.deepEqual(user.attrs, { profileId: null }); - }); - } -); +module('Integration | ORM | Belongs To | One To One | instantiating', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the child accepts a saved parent id', function(assert) { + let profile = this.helper.savedParent(); + let user = this.schema.users.new({ profileId: profile.id }); + + assert.equal(user.profileId, profile.id); + assert.deepEqual(user.profile.attrs, profile.attrs); + assert.deepEqual(user.attrs, { profileId: profile.id }); + }); + + test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ profileId: 2 }); + }, /You're instantiating a user that has a profileId of 2, but that record doesn't exist in the database/); + }); + + test('the child accepts a null parent id', function(assert) { + let user = this.schema.users.new({ profileId: null }); + + assert.equal(user.profileId, null); + assert.equal(user.profile, null); + assert.deepEqual(user.attrs, { profileId: null }); + }); + + test('the child accepts a saved parent model', function(assert) { + let profile = this.helper.savedParent(); + let user = this.schema.users.new({ profile }); + + assert.equal(user.profileId, 1); + assert.deepEqual(user.profile.attrs, profile.attrs); + assert.deepEqual(user.attrs, { profileId: null }); // this would update when saved + }); + + test('the child accepts a new parent model', function(assert) { + let profile = this.schema.profiles.new({ age: 300 }); + let user = this.schema.users.new({ profile }); + + assert.equal(user.profileId, null); + assert.deepEqual(user.profile, profile); + assert.deepEqual(user.attrs, { profileId: null }); + }); + + test('the child accepts a null parent model', function(assert) { + let user = this.schema.users.new({ profile: null }); + + assert.equal(user.profileId, null); + assert.deepEqual(user.profile, null); + assert.deepEqual(user.attrs, { profileId: null }); + }); + + test('the child accepts a parent model and id', function(assert) { + let profile = this.helper.savedParent(); + let user = this.schema.users.new({ profile, profileId: profile.id }); + + assert.equal(user.profileId, '1'); + assert.deepEqual(user.profile, profile); + assert.deepEqual(user.attrs, { profileId: profile.id }); + }); + + test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let user = this.schema.users.new({}); + + assert.equal(user.profileId, null); + assert.deepEqual(user.profile, null); + assert.deepEqual(user.attrs, { profileId: null }); + }); + + test('the child accepts no reference to a parent id or model', function(assert) { + let user = this.schema.users.new(); + + assert.equal(user.profileId, null); + assert.deepEqual(user.profile, null); + assert.deepEqual(user.attrs, { profileId: null }); + }); +}); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/accessor-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/accessor-test.js index 74d3195e1..d8bb00b3b 100644 --- a/tests/integration/orm/belongs-to/9-one-way-polymorphic/accessor-test.js +++ b/tests/integration/orm/belongs-to/9-one-way-polymorphic/accessor-test.js @@ -1,25 +1,22 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One-way Polymorphic | accessor', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | One-way Polymorphic | accessor', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`the references of a ${state} are correct`, function(assert) { - let [ comment, post ] = this.helper[state](); + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { - assert.deepEqual(comment.commentable, post ? post : null, 'the model reference is correct'); - assert.deepEqual(comment.commentableId, post ? { id: post.id, type: 'post' } : null, 'the modelId reference is correct'); - }); + test(`the references of a ${state} are correct`, function(assert) { + let [ comment, post ] = this.helper[state](); + assert.deepEqual(comment.commentable, post ? post : null, 'the model reference is correct'); + assert.deepEqual(comment.commentableId, post ? { id: post.id, type: 'post' } : null, 'the modelId reference is correct'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-create-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-create-test.js index 5d476e22b..730612014 100644 --- a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-create-test.js +++ b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-create-test.js @@ -1,29 +1,26 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One-way Polymorphic | association #create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a belongs-to association, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | One-way Polymorphic | association #create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can create an associated parent`, function(assert) { - let [ comment ] = this.helper[state](); + /* + The model can create a belongs-to association, for all states + */ + states.forEach((state) => { - let post = comment.createCommentable('post', { title: 'Lorem ipsum' }); + test(`a ${state} can create an associated parent`, function(assert) { + let [ comment ] = this.helper[state](); - assert.ok(post.id, 'the parent was persisted'); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }); - assert.ok(this.helper.db.posts.find(post.id), 'the child was persisted'); - }); + let post = comment.createCommentable('post', { title: 'Lorem ipsum' }); + assert.ok(post.id, 'the parent was persisted'); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }); + assert.ok(this.helper.db.posts.find(post.id), 'the child was persisted'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-new-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-new-test.js index 3c188eda6..88c5f14fd 100644 --- a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-new-test.js +++ b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-new-test.js @@ -1,34 +1,31 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One-way Polymorphic | association #new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ +module('Integration | ORM | Belongs To | One-way Polymorphic | association #new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + /* + The model can make a new unsaved belongs-to association, for all states + */ - test(`a ${state} can build a new associated parent`, function(assert) { - let [ comment ] = this.helper[state](); + states.forEach((state) => { - let post = comment.newCommentable('post', { title: 'Lorem ipsum' }); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ comment ] = this.helper[state](); - assert.ok(!post.id, 'the parent was not persisted'); - assert.deepEqual(comment.commentable, post); - assert.deepEqual(comment.commentableId, { id: undefined, type: 'post' }); + let post = comment.newCommentable('post', { title: 'Lorem ipsum' }); - comment.save(); + assert.ok(!post.id, 'the parent was not persisted'); + assert.deepEqual(comment.commentable, post); + assert.deepEqual(comment.commentableId, { id: undefined, type: 'post' }); - assert.ok(post.id, 'saving the child persists the parent'); - assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }, 'the childs fk was updated'); - }); + comment.save(); + assert.ok(post.id, 'saving the child persists the parent'); + assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }, 'the childs fk was updated'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-id-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-id-test.js index 7f1226ecc..a74907048 100644 --- a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-id-test.js +++ b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-id-test.js @@ -1,44 +1,41 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One-way Polymorphic | association #setId', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | One-way Polymorphic | association #setId', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ comment ] = this.helper[state](); - let savedPost = this.helper.savedParent(); + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - comment.commentableId = { id: savedPost.id, type: 'post' }; + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ comment ] = this.helper[state](); + let savedPost = this.helper.savedParent(); - assert.deepEqual(comment.commentableId, { id: savedPost.id, type: 'post' }); - assert.deepEqual(comment.commentable.attrs, savedPost.attrs); - }); + comment.commentableId = { id: savedPost.id, type: 'post' }; + assert.deepEqual(comment.commentableId, { id: savedPost.id, type: 'post' }); + assert.deepEqual(comment.commentable.attrs, savedPost.attrs); }); - [ - 'savedChildSavedParent', - 'newChildSavedParent' - ].forEach((state) => { + }); - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ comment ] = this.helper[state](); + [ + 'savedChildSavedParent', + 'newChildSavedParent' + ].forEach((state) => { - comment.commentableId = null; + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ comment ] = this.helper[state](); - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - }); + comment.commentableId = null; + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-test.js index f0a2389f0..2eae479d5 100644 --- a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-test.js +++ b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-test.js @@ -1,47 +1,44 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One-way Polymorphic | association #set', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Belongs To | One-way Polymorphic | association #set', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ comment ] = this.helper[state](); - let savedPost = this.helper.savedParent(); + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - comment.commentable = savedPost; + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ comment ] = this.helper[state](); + let savedPost = this.helper.savedParent(); - assert.deepEqual(comment.commentableId, { id: savedPost.id, type: 'post' }); - assert.deepEqual(comment.commentable, savedPost); - }); + comment.commentable = savedPost; - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ comment ] = this.helper[state](); - let newPost = this.helper.newParent(); + assert.deepEqual(comment.commentableId, { id: savedPost.id, type: 'post' }); + assert.deepEqual(comment.commentable, savedPost); + }); - comment.commentable = newPost; + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ comment ] = this.helper[state](); + let newPost = this.helper.newParent(); - assert.deepEqual(comment.commentableId, { id: undefined, type: 'post' }); - assert.deepEqual(comment.commentable, newPost); - }); + comment.commentable = newPost; - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ comment ] = this.helper[state](); + assert.deepEqual(comment.commentableId, { id: undefined, type: 'post' }); + assert.deepEqual(comment.commentable, newPost); + }); - comment.commentable = null; + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ comment ] = this.helper[state](); - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - }); + comment.commentable = null; + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/create-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/create-test.js index 106e8f687..b927fc3df 100644 --- a/tests/integration/orm/belongs-to/9-one-way-polymorphic/create-test.js +++ b/tests/integration/orm/belongs-to/9-one-way-polymorphic/create-test.js @@ -2,40 +2,37 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One-way Polymorphic | create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let post = this.helper.schema.create('post'); - let comment = this.helper.schema.create('comment', { - commentableId: { id: post.id, type: 'post' } - }); +module('Integration | ORM | Belongs To | One-way Polymorphic | create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + }); - assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.equal(this.helper.schema.db.posts.length, 1); - assert.deepEqual(this.helper.schema.db.posts[0], { id: '1' }); - assert.equal(this.helper.schema.db.comments.length, 1); - assert.deepEqual(this.helper.schema.db.comments[0], { id: '1', commentableId: { id: '1', type: 'post' } }); + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let post = this.helper.schema.create('post'); + let comment = this.helper.schema.create('comment', { + commentableId: { id: post.id, type: 'post' } }); - test('it sets up associations correctly when passing in the association itself', function(assert) { - let post = this.helper.schema.create('post'); - let comment = this.helper.schema.create('comment', { - commentable: post - }); + assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.equal(this.helper.schema.db.posts.length, 1); + assert.deepEqual(this.helper.schema.db.posts[0], { id: '1' }); + assert.equal(this.helper.schema.db.comments.length, 1); + assert.deepEqual(this.helper.schema.db.comments[0], { id: '1', commentableId: { id: '1', type: 'post' } }); + }); - assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.equal(this.helper.schema.db.posts.length, 1); - assert.deepEqual(this.helper.schema.db.posts[0], { id: '1' }); - assert.equal(this.helper.schema.db.comments.length, 1); - assert.deepEqual(this.helper.schema.db.comments[0], { id: '1', commentableId: { id: '1', type: 'post' } }); + test('it sets up associations correctly when passing in the association itself', function(assert) { + let post = this.helper.schema.create('post'); + let comment = this.helper.schema.create('comment', { + commentable: post }); - } -); + + assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }); + assert.deepEqual(comment.commentable.attrs, post.attrs); + assert.equal(this.helper.schema.db.posts.length, 1); + assert.deepEqual(this.helper.schema.db.posts[0], { id: '1' }); + assert.equal(this.helper.schema.db.comments.length, 1); + assert.deepEqual(this.helper.schema.db.comments[0], { id: '1', commentableId: { id: '1', type: 'post' } }); + }); +}); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/delete-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/delete-test.js index 0293d0ea5..8fabed15c 100644 --- a/tests/integration/orm/belongs-to/9-one-way-polymorphic/delete-test.js +++ b/tests/integration/orm/belongs-to/9-one-way-polymorphic/delete-test.js @@ -1,27 +1,24 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One-way Polymorphic | delete', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { +module('Integration | ORM | Belongs To | One-way Polymorphic | delete', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ comment, post ] = this.helper[state](); + states.forEach((state) => { - if (post) { - post.destroy(); - comment.reload(); - } + test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { + let [ comment, post ] = this.helper[state](); - assert.equal(comment.commentableId, null); - assert.equal(comment.post, null); - }); + if (post) { + post.destroy(); + comment.reload(); + } + assert.equal(comment.commentableId, null); + assert.equal(comment.post, null); }); - } -); + + }); +}); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/instantiating-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/instantiating-test.js index 463dc5c58..7b711f945 100644 --- a/tests/integration/orm/belongs-to/9-one-way-polymorphic/instantiating-test.js +++ b/tests/integration/orm/belongs-to/9-one-way-polymorphic/instantiating-test.js @@ -1,87 +1,84 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Belongs To | One-way Polymorphic | instantiating', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module('Integration | ORM | Belongs To | One-way Polymorphic | instantiating', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the child accepts a saved parent id', function(assert) { + let post = this.helper.savedParent(); + let comment = this.schema.comments.new({ + commentableId: { id: post.id, type: 'post' } }); - test('the child accepts a saved parent id', function(assert) { - let post = this.helper.savedParent(); - let comment = this.schema.comments.new({ - commentableId: { id: post.id, type: 'post' } - }); - - assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }); - assert.deepEqual(comment.commentable, post); - assert.deepEqual(comment.attrs, { commentableId: { id: post.id, type: 'post' } }); - }); - - test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.comments.new({ commentableId: { type: 'post', id: 2 } }); - }, /You're instantiating a comment that has a commentableId of post:2, but that record doesn't exist in the database/); - }); - - test('the child accepts a null parent id', function(assert) { - let comment = this.schema.comments.new({ commentableId: null }); - - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - assert.deepEqual(comment.attrs, { commentableId: null }); - }); - - test('the child accepts a saved parent model', function(assert) { - let post = this.helper.savedParent(); - let comment = this.schema.comments.new({ commentable: post }); - - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); - assert.deepEqual(comment.commentable, post); - }); - - test('the child accepts a new parent model', function(assert) { - let post = this.schema.posts.new({ text: 'foo' }); - let comment = this.schema.comments.new({ commentable: post }); - - assert.deepEqual(comment.commentableId, { type: 'post', id: undefined }); - assert.deepEqual(comment.commentable, post); - assert.deepEqual(comment.attrs, { commentableId: null }); - }); - - test('the child accepts a null parent model', function(assert) { - let comment = this.schema.comments.new({ commentable: null }); - - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - assert.deepEqual(comment.attrs, { commentableId: null }); - }); - - test('the child accepts a parent model and id', function(assert) { - let post = this.helper.savedParent(); - let comment = this.schema.comments.new({ commentable: post, commentableId: { type: 'post', id: post.id } }); - - assert.deepEqual(comment.commentableId, { type: 'post', id: '1' }); - assert.deepEqual(comment.commentable, post); - assert.deepEqual(comment.attrs, { commentableId: { type: 'post', id: post.id } }); - }); - - test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let comment = this.schema.comments.new({}); - - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - assert.deepEqual(comment.attrs, { commentableId: null }); - }); - - test('the child accepts no reference to a parent id or model', function(assert) { - let comment = this.schema.comments.new(); - - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - assert.deepEqual(comment.attrs, { commentableId: null }); - }); - } -); + assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }); + assert.deepEqual(comment.commentable, post); + assert.deepEqual(comment.attrs, { commentableId: { id: post.id, type: 'post' } }); + }); + + test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.comments.new({ commentableId: { type: 'post', id: 2 } }); + }, /You're instantiating a comment that has a commentableId of post:2, but that record doesn't exist in the database/); + }); + + test('the child accepts a null parent id', function(assert) { + let comment = this.schema.comments.new({ commentableId: null }); + + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + assert.deepEqual(comment.attrs, { commentableId: null }); + }); + + test('the child accepts a saved parent model', function(assert) { + let post = this.helper.savedParent(); + let comment = this.schema.comments.new({ commentable: post }); + + assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); + assert.deepEqual(comment.commentable, post); + }); + + test('the child accepts a new parent model', function(assert) { + let post = this.schema.posts.new({ text: 'foo' }); + let comment = this.schema.comments.new({ commentable: post }); + + assert.deepEqual(comment.commentableId, { type: 'post', id: undefined }); + assert.deepEqual(comment.commentable, post); + assert.deepEqual(comment.attrs, { commentableId: null }); + }); + + test('the child accepts a null parent model', function(assert) { + let comment = this.schema.comments.new({ commentable: null }); + + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + assert.deepEqual(comment.attrs, { commentableId: null }); + }); + + test('the child accepts a parent model and id', function(assert) { + let post = this.helper.savedParent(); + let comment = this.schema.comments.new({ commentable: post, commentableId: { type: 'post', id: post.id } }); + + assert.deepEqual(comment.commentableId, { type: 'post', id: '1' }); + assert.deepEqual(comment.commentable, post); + assert.deepEqual(comment.attrs, { commentableId: { type: 'post', id: post.id } }); + }); + + test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let comment = this.schema.comments.new({}); + + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + assert.deepEqual(comment.attrs, { commentableId: null }); + }); + + test('the child accepts no reference to a parent id or model', function(assert) { + let comment = this.schema.comments.new(); + + assert.equal(comment.commentableId, null); + assert.deepEqual(comment.commentable, null); + assert.deepEqual(comment.attrs, { commentableId: null }); + }); +}); diff --git a/tests/integration/orm/collection-inflector-test.js b/tests/integration/orm/collection-inflector-test.js index 245a6e8f9..1ed387e4a 100644 --- a/tests/integration/orm/collection-inflector-test.js +++ b/tests/integration/orm/collection-inflector-test.js @@ -6,21 +6,18 @@ import {module, test} from 'qunit'; var db, schema, HeadOfState; -module( - 'Integration | ORM | inflector-collectionName integration', - function(hooks) { - hooks.beforeEach(function() { - Inflector.inflector.irregular('head-of-state', 'heads-of-state'); +module('Integration | ORM | inflector-collectionName integration', function(hooks) { + hooks.beforeEach(function() { + Inflector.inflector.irregular('head-of-state', 'heads-of-state'); - HeadOfState = Model.extend(); - db = new Db({}); - schema = new Schema(db); - schema.registerModel('headOfState', HeadOfState); - }); + HeadOfState = Model.extend(); + db = new Db({}); + schema = new Schema(db); + schema.registerModel('headOfState', HeadOfState); + }); - test(' [regression] collection creation respects irregular plural rules', function(assert) { - assert.equal(schema.db._collections.length, 1); - assert.equal(schema.db._collections[0].name, 'headsOfState'); - }); - } -); + test(' [regression] collection creation respects irregular plural rules', function(assert) { + assert.equal(schema.db._collections.length, 1); + assert.equal(schema.db._collections[0].name, 'headsOfState'); + }); +}); diff --git a/tests/integration/orm/has-many/1-basic/association-create-test.js b/tests/integration/orm/has-many/1-basic/association-create-test.js index 5d234aa0e..5f47567d1 100644 --- a/tests/integration/orm/has-many/1-basic/association-create-test.js +++ b/tests/integration/orm/has-many/1-basic/association-create-test.js @@ -1,31 +1,28 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Basic | association #create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Has Many | Basic | association #create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.posts.models.length; + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { - let post = user.createPost({ title: 'Lorem ipsum' }); + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.posts.models.length; - assert.ok(post.id, 'the child was persisted'); - assert.equal(user.posts.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.posts.includes(post), 'the model was added to user.posts'); - assert.ok(user.postIds.indexOf(post.id) > -1, 'the id was added to the fks array'); - assert.ok(user.attrs.postIds.indexOf(post.id) > -1, 'fks were persisted'); - }); + let post = user.createPost({ title: 'Lorem ipsum' }); + assert.ok(post.id, 'the child was persisted'); + assert.equal(user.posts.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.posts.includes(post), 'the model was added to user.posts'); + assert.ok(user.postIds.indexOf(post.id) > -1, 'the id was added to the fks array'); + assert.ok(user.attrs.postIds.indexOf(post.id) > -1, 'fks were persisted'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/1-basic/association-new-test.js b/tests/integration/orm/has-many/1-basic/association-new-test.js index abbffa56e..754a279bf 100644 --- a/tests/integration/orm/has-many/1-basic/association-new-test.js +++ b/tests/integration/orm/has-many/1-basic/association-new-test.js @@ -1,36 +1,33 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Basic | association #new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ +module('Integration | ORM | Has Many | Basic | association #new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + /* + The model can make a new unsaved belongs-to association, for all states + */ - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.posts.models.length; + states.forEach((state) => { - let post = user.newPost({ title: 'Lorem ipsum' }); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.posts.models.length; - assert.ok(!post.id, 'the child was not persisted'); - assert.equal(user.posts.models.length, initialCount + 1); + let post = user.newPost({ title: 'Lorem ipsum' }); - post.save(); + assert.ok(!post.id, 'the child was not persisted'); + assert.equal(user.posts.models.length, initialCount + 1); - assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum' }, 'the child was persisted'); - assert.equal(user.posts.models.length, initialCount + 1, 'the collection size was increased'); - assert.deepEqual(user.posts.models.filter((a) => a.id === post.id)[0], post, 'the model was added to user.posts'); - assert.ok(user.postIds.indexOf(post.id) > -1, 'the id was added to the fks array'); - }); + post.save(); + assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum' }, 'the child was persisted'); + assert.equal(user.posts.models.length, initialCount + 1, 'the collection size was increased'); + assert.deepEqual(user.posts.models.filter((a) => a.id === post.id)[0], post, 'the model was added to user.posts'); + assert.ok(user.postIds.indexOf(post.id) > -1, 'the id was added to the fks array'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/1-basic/association-set-ids-test.js b/tests/integration/orm/has-many/1-basic/association-set-ids-test.js index 24b323e09..316b5a78c 100644 --- a/tests/integration/orm/has-many/1-basic/association-set-ids-test.js +++ b/tests/integration/orm/has-many/1-basic/association-set-ids-test.js @@ -1,37 +1,34 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Basic | association #setIds', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Has Many | Basic | association #setIds', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user ] = this.helper[state](); - let savedPost = this.helper.savedChild(); + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - user.postIds = [ savedPost.id ]; + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user ] = this.helper[state](); + let savedPost = this.helper.savedChild(); - assert.deepEqual(user.posts.models[0].attrs, savedPost.attrs); - assert.deepEqual(user.postIds, [ savedPost.id ]); - }); + user.postIds = [ savedPost.id ]; - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ user ] = this.helper[state](); + assert.deepEqual(user.posts.models[0].attrs, savedPost.attrs); + assert.deepEqual(user.postIds, [ savedPost.id ]); + }); - user.postIds = null; + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ user ] = this.helper[state](); - assert.deepEqual(user.posts.models, []); - assert.deepEqual(user.postIds, []); - }); + user.postIds = null; + assert.deepEqual(user.posts.models, []); + assert.deepEqual(user.postIds, []); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/1-basic/association-set-test.js b/tests/integration/orm/has-many/1-basic/association-set-test.js index b546c2b70..6d90d9d55 100644 --- a/tests/integration/orm/has-many/1-basic/association-set-test.js +++ b/tests/integration/orm/has-many/1-basic/association-set-test.js @@ -1,56 +1,53 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Basic | association #set', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Has Many | Basic | association #set', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ user ] = this.helper[state](); - let savedPost = this.helper.savedChild(); + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - user.posts = [ savedPost ]; + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ user ] = this.helper[state](); + let savedPost = this.helper.savedChild(); - assert.ok(user.posts.models.indexOf(savedPost) > -1); - assert.ok(user.postIds.indexOf(savedPost.id) > -1); - }); + user.posts = [ savedPost ]; - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user ] = this.helper[state](); - let newPost = this.helper.newChild(); + assert.ok(user.posts.models.indexOf(savedPost) > -1); + assert.ok(user.postIds.indexOf(savedPost.id) > -1); + }); - user.posts = [ newPost ]; + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user ] = this.helper[state](); + let newPost = this.helper.newChild(); - assert.deepEqual(user.postIds, [ undefined ]); - assert.deepEqual(user.posts.models[0], newPost); - }); + user.posts = [ newPost ]; - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user ] = this.helper[state](); + assert.deepEqual(user.postIds, [ undefined ]); + assert.deepEqual(user.posts.models[0], newPost); + }); - user.posts = [ ]; + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user ] = this.helper[state](); - assert.deepEqual(user.postIds, [ ]); - assert.equal(user.posts.models.length, 0); - }); + user.posts = [ ]; - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user ] = this.helper[state](); + assert.deepEqual(user.postIds, [ ]); + assert.equal(user.posts.models.length, 0); + }); - user.posts = null; + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user ] = this.helper[state](); - assert.deepEqual(user.postIds, [ ]); - assert.equal(user.posts.models.length, 0); - }); + user.posts = null; + assert.deepEqual(user.postIds, [ ]); + assert.equal(user.posts.models.length, 0); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/accessor-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/accessor-test.js index 788ebfc58..c994c97b8 100644 --- a/tests/integration/orm/has-many/10-many-to-many-polymorphic/accessor-test.js +++ b/tests/integration/orm/has-many/10-many-to-many-polymorphic/accessor-test.js @@ -1,40 +1,37 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Many-to-many Polymorphic | accessor', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ user, posts ] = this.helper[state](); - - assert.equal(user.commentables.models.length, posts.length, 'the parent has the correct number of children'); - assert.equal(user.commentableIds.length, posts.length, 'the parent has the correct number of children ids'); - - posts.forEach((post, i) => { - assert.ok(user.commentables.includes(post), 'each child is in parent.children array'); - - if (post.isSaved()) { - assert.deepEqual( - user.commentableIds[i], - { type: 'post', id: post.id }, - 'each saved child id is in parent.childrenIds array' - ); - } - - // Check the inverse - assert.ok(post.users.includes(user)); - }); +module('Integration | ORM | Has Many | Many-to-many Polymorphic | accessor', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); + + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ user, posts ] = this.helper[state](); + + assert.equal(user.commentables.models.length, posts.length, 'the parent has the correct number of children'); + assert.equal(user.commentableIds.length, posts.length, 'the parent has the correct number of children ids'); + + posts.forEach((post, i) => { + assert.ok(user.commentables.includes(post), 'each child is in parent.children array'); + + if (post.isSaved()) { + assert.deepEqual( + user.commentableIds[i], + { type: 'post', id: post.id }, + 'each saved child id is in parent.childrenIds array' + ); + } + + // Check the inverse + assert.ok(post.users.includes(user)); }); - }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-create-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-create-test.js index ea3847fb0..d62cb5135 100644 --- a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-create-test.js +++ b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-create-test.js @@ -1,36 +1,33 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Many-to-many Polymorphic | association #create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Has Many | Many-to-many Polymorphic | association #create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.commentables.models.length; + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { - let post = user.createCommentable('post', { title: 'Lorem ipsum' }); + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.commentables.models.length; - assert.ok(post.id, 'the child was persisted'); - assert.equal(user.commentables.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.commentables.includes(post), 'the model was added to the association'); - assert.ok(user.commentableIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'the id was added to the fks array'); - assert.ok(user.attrs.commentableIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'fks were persisted'); - assert.ok(post.users.includes(user), 'the inverse was set'); - }); + let post = user.createCommentable('post', { title: 'Lorem ipsum' }); + assert.ok(post.id, 'the child was persisted'); + assert.equal(user.commentables.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.commentables.includes(post), 'the model was added to the association'); + assert.ok(user.commentableIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'the id was added to the fks array'); + assert.ok(user.attrs.commentableIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'fks were persisted'); + assert.ok(post.users.includes(user), 'the inverse was set'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-new-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-new-test.js index 54396d931..e849ae02c 100644 --- a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-new-test.js +++ b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-new-test.js @@ -1,40 +1,37 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Many-to-many Polymorphic | association #new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ +module('Integration | ORM | Has Many | Many-to-many Polymorphic | association #new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + /* + The model can make a new unsaved belongs-to association, for all states + */ - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.commentables.models.length; + states.forEach((state) => { - let post = user.newCommentable('post', { title: 'Lorem ipsum' }); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.commentables.models.length; - assert.ok(!post.id, 'the child was not persisted'); - assert.equal(user.commentables.models.length, initialCount + 1); - assert.equal(post.users.models.length, 1, 'the inverse was set'); + let post = user.newCommentable('post', { title: 'Lorem ipsum' }); - post.save(); + assert.ok(!post.id, 'the child was not persisted'); + assert.equal(user.commentables.models.length, initialCount + 1); + assert.equal(post.users.models.length, 1, 'the inverse was set'); - assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum', userIds: [ user.id ] }, 'the child was persisted'); - assert.equal(user.commentables.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.commentables.includes(post), 'the model was added to user.commentables'); - assert.ok(user.commentableIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'the id was added to the fks array'); - assert.ok(post.users.includes(user), 'the inverse was set'); - }); + post.save(); + assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum', userIds: [ user.id ] }, 'the child was persisted'); + assert.equal(user.commentables.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.commentables.includes(post), 'the model was added to user.commentables'); + assert.ok(user.commentableIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'the id was added to the fks array'); + assert.ok(post.users.includes(user), 'the inverse was set'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-ids-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-ids-test.js index b05b10e35..1cac266bf 100644 --- a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-ids-test.js +++ b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-ids-test.js @@ -1,55 +1,52 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Many-to-many Polymorphic | association #setIds', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); +module('Integration | ORM | Has Many | Many-to-many Polymorphic | association #setIds', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let savedPost = this.helper.savedChild(); + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let savedPost = this.helper.savedChild(); - user.commentableIds = [ { type: 'post', id: savedPost.id } ]; + user.commentableIds = [ { type: 'post', id: savedPost.id } ]; - assert.ok(user.commentables.includes(savedPost)); - assert.ok(user.commentableIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); + assert.ok(user.commentables.includes(savedPost)); + assert.ok(user.commentableIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); - user.save(); - savedPost.reload(); + user.save(); + savedPost.reload(); - assert.ok(savedPost.users.includes(user), 'the inverse was set'); - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.notOk(post.users.includes(user), 'old inverses were cleared'); - } - }); + assert.ok(savedPost.users.includes(user), 'the inverse was set'); + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.notOk(post.users.includes(user), 'old inverses were cleared'); + } }); + }); - test(`a ${state} can clear its association via a null ids`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); + test(`a ${state} can clear its association via a null ids`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); - user.commentableIds = null; + user.commentableIds = null; - assert.deepEqual(user.commentables.models, []); - assert.deepEqual(user.commentableIds, []); + assert.deepEqual(user.commentables.models, []); + assert.deepEqual(user.commentableIds, []); - user.save(); + user.save(); - originalPosts.forEach(post => { - post.reload(); - assert.notOk(post.users.includes(user), 'old inverses were cleared'); - }); + originalPosts.forEach(post => { + post.reload(); + assert.notOk(post.users.includes(user), 'old inverses were cleared'); }); - }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-test.js index 59bc4bdbe..85288b194 100644 --- a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-test.js +++ b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-test.js @@ -1,86 +1,83 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Many-to-many Polymorphic | association #set', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); +module('Integration | ORM | Has Many | Many-to-many Polymorphic | association #set', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let savedPost = this.helper.savedChild(); + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let savedPost = this.helper.savedChild(); - user.commentables = [ savedPost ]; + user.commentables = [ savedPost ]; - assert.ok(user.commentables.models.includes(savedPost)); - assert.ok(user.commentableIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); - assert.ok(savedPost.users.includes(user), 'the inverse was set'); + assert.ok(user.commentables.models.includes(savedPost)); + assert.ok(user.commentableIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); + assert.ok(savedPost.users.includes(user), 'the inverse was set'); - user.save(); + user.save(); - originalPosts.forEach(post => { - post.reload(); - assert.notOk(post.users.includes(user), 'old inverses were cleared'); - }); + originalPosts.forEach(post => { + post.reload(); + assert.notOk(post.users.includes(user), 'old inverses were cleared'); }); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let newPost = this.helper.newChild(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let newPost = this.helper.newChild(); - user.commentables = [ newPost ]; + user.commentables = [ newPost ]; - assert.deepEqual(user.commentableIds, [ { type: 'post', id: undefined } ]); - assert.deepEqual(user.commentables.models[0], newPost); - assert.ok(newPost.users.includes(user), 'the inverse was set'); + assert.deepEqual(user.commentableIds, [ { type: 'post', id: undefined } ]); + assert.deepEqual(user.commentables.models[0], newPost); + assert.ok(newPost.users.includes(user), 'the inverse was set'); - user.save(); + user.save(); - originalPosts.forEach(post => { - post.reload(); - assert.notOk(post.users.includes(user), 'old inverses were cleared'); - }); + originalPosts.forEach(post => { + post.reload(); + assert.notOk(post.users.includes(user), 'old inverses were cleared'); }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); - user.commentables = [ ]; + user.commentables = [ ]; - assert.deepEqual(user.commentableIds, [ ]); - assert.equal(user.commentables.models.length, 0); + assert.deepEqual(user.commentableIds, [ ]); + assert.equal(user.commentables.models.length, 0); - user.save(); + user.save(); - originalPosts.forEach(post => { - post.reload(); - assert.notOk(post.users.includes(user), 'old inverses were cleared'); - }); + originalPosts.forEach(post => { + post.reload(); + assert.notOk(post.users.includes(user), 'old inverses were cleared'); }); + }); - test(`a ${state} can clear its association via null`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); + test(`a ${state} can clear its association via null`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); - user.commentables = null; + user.commentables = null; - assert.deepEqual(user.commentableIds, [ ]); - assert.equal(user.commentables.models.length, 0); + assert.deepEqual(user.commentableIds, [ ]); + assert.equal(user.commentables.models.length, 0); - user.save(); + user.save(); - originalPosts.forEach(post => { - post.reload(); - assert.notOk(post.users.includes(user), 'old inverses were cleared'); - }); + originalPosts.forEach(post => { + post.reload(); + assert.notOk(post.users.includes(user), 'old inverses were cleared'); }); - }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/create-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/create-test.js index bdcf0d1b8..297032b1a 100644 --- a/tests/integration/orm/has-many/10-many-to-many-polymorphic/create-test.js +++ b/tests/integration/orm/has-many/10-many-to-many-polymorphic/create-test.js @@ -1,60 +1,57 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Many-to-many Polymorphic | create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); +module('Integration | ORM | Has Many | Many-to-many Polymorphic | create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); + + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + commentableIds: [ { type: 'post', id: post.id } ] }); - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - commentableIds: [ { type: 'post', id: post.id } ] - }); - - post.reload(); - - assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.attrs.commentableIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); - assert.deepEqual(user.commentables.models[0].attrs, post.attrs); - assert.equal(this.helper.db.posts.length, 1); - assert.equal(this.helper.db.users.length, 1); - assert.deepEqual(this.helper.db.posts[0], { id: '1', userIds: [ '1' ] }); - assert.deepEqual(this.helper.db.users[0], { id: '1', commentableIds: [ { type: 'post', id: '1' } ] }); + post.reload(); + + assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.attrs.commentableIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); + assert.deepEqual(user.commentables.models[0].attrs, post.attrs); + assert.equal(this.helper.db.posts.length, 1); + assert.equal(this.helper.db.users.length, 1); + assert.deepEqual(this.helper.db.posts[0], { id: '1', userIds: [ '1' ] }); + assert.deepEqual(this.helper.db.users[0], { id: '1', commentableIds: [ { type: 'post', id: '1' } ] }); + }); + + test('it sets up associations correctly when passing in an array of models', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + commentables: [ post ] }); - test('it sets up associations correctly when passing in an array of models', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - commentables: [ post ] - }); + post.reload(); - post.reload(); + assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(post.userIds, [ '1' ], 'the inverse was set'); + assert.deepEqual(user.attrs.commentableIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); + assert.deepEqual(post.attrs.userIds, [ user.id ], 'the inverse was set'); + assert.equal(this.helper.db.users.length, 1); + assert.equal(this.helper.db.posts.length, 1); + }); - assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(post.userIds, [ '1' ], 'the inverse was set'); - assert.deepEqual(user.attrs.commentableIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); - assert.deepEqual(post.attrs.userIds, [ user.id ], 'the inverse was set'); - assert.equal(this.helper.db.users.length, 1); - assert.equal(this.helper.db.posts.length, 1); + test('it sets up associations correctly when passing in a collection', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + commentables: this.helper.schema.posts.all() }); - test('it sets up associations correctly when passing in a collection', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - commentables: this.helper.schema.posts.all() - }); + post.reload(); - post.reload(); - - assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(post.userIds, [ user.id ], 'the inverse was set'); - assert.deepEqual(user.attrs.commentableIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(post.attrs.userIds, [ user.id ], 'the inverse was set'); - assert.equal(this.helper.db.users.length, 1); - assert.equal(this.helper.db.posts.length, 1); - }); - } -); + assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(post.userIds, [ user.id ], 'the inverse was set'); + assert.deepEqual(user.attrs.commentableIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(post.attrs.userIds, [ user.id ], 'the inverse was set'); + assert.equal(this.helper.db.users.length, 1); + assert.equal(this.helper.db.posts.length, 1); + }); +}); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/delete-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/delete-test.js index c25c8cad0..70dae8c9c 100644 --- a/tests/integration/orm/has-many/10-many-to-many-polymorphic/delete-test.js +++ b/tests/integration/orm/has-many/10-many-to-many-polymorphic/delete-test.js @@ -1,27 +1,24 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Many-to-many Polymorphic | delete', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { +module('Integration | ORM | Has Many | Many-to-many Polymorphic | delete', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ user, posts ] = this.helper[state](); + states.forEach((state) => { - if (posts && posts.length) { - posts.forEach(p => p.destroy()); - user.reload(); - } + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ user, posts ] = this.helper[state](); - assert.equal(user.commentables.length, 0); - assert.equal(user.commentableIds.length, 0); - }); + if (posts && posts.length) { + posts.forEach(p => p.destroy()); + user.reload(); + } + assert.equal(user.commentables.length, 0); + assert.equal(user.commentableIds.length, 0); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/instantiating-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/instantiating-test.js index 09baac8fd..4fabb718d 100644 --- a/tests/integration/orm/has-many/10-many-to-many-polymorphic/instantiating-test.js +++ b/tests/integration/orm/has-many/10-many-to-many-polymorphic/instantiating-test.js @@ -1,84 +1,81 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Many-to-many Polymorphic | instantiating', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module('Integration | ORM | Has Many | Many-to-many Polymorphic | instantiating', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the parent accepts a saved child id', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ + commentableIds: [ { type: 'post', id: post.id } ] }); - test('the parent accepts a saved child id', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ - commentableIds: [ { type: 'post', id: post.id } ] - }); + assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); + assert.ok(user.commentables.includes(post)); + }); - assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); - assert.ok(user.commentables.includes(post)); - }); + test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ commentableIds: [ { type: 'post', id: 2 } ] }); + }, /You're instantiating a user that has a commentableIds of post:2, but some of those records don't exist in the database/); + }); - test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ commentableIds: [ { type: 'post', id: 2 } ] }); - }, /You're instantiating a user that has a commentableIds of post:2, but some of those records don't exist in the database/); - }); + test('the parent accepts null children foreign key', function(assert) { + let user = this.schema.users.new({ commentableIds: null }); - test('the parent accepts null children foreign key', function(assert) { - let user = this.schema.users.new({ commentableIds: null }); + assert.equal(user.commentables.models.length, 0); + assert.deepEqual(user.commentableIds, []); + assert.deepEqual(user.attrs, { commentableIds: null }); + }); - assert.equal(user.commentables.models.length, 0); - assert.deepEqual(user.commentableIds, []); - assert.deepEqual(user.attrs, { commentableIds: null }); - }); + test('the parent accepts saved children', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ commentables: [ post ] }); - test('the parent accepts saved children', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ commentables: [ post ] }); - - assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); - assert.ok(user.commentables.includes(post)); - }); + assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); + assert.ok(user.commentables.includes(post)); + }); - test('the parent accepts new children', function(assert) { - let post = this.schema.posts.new({ title: 'Lorem' }); - let user = this.schema.users.new({ commentables: [ post ] }); + test('the parent accepts new children', function(assert) { + let post = this.schema.posts.new({ title: 'Lorem' }); + let user = this.schema.users.new({ commentables: [ post ] }); - assert.deepEqual(user.commentableIds, [ { type: 'post', id: undefined } ]); - assert.ok(user.commentables.includes(post)); - }); + assert.deepEqual(user.commentableIds, [ { type: 'post', id: undefined } ]); + assert.ok(user.commentables.includes(post)); + }); - test('the parent accepts null children', function(assert) { - let user = this.schema.users.new({ commentables: null }); + test('the parent accepts null children', function(assert) { + let user = this.schema.users.new({ commentables: null }); - assert.equal(user.commentables.models.length, 0); - assert.deepEqual(user.commentableIds, []); - assert.deepEqual(user.attrs, { commentableIds: null }); - }); + assert.equal(user.commentables.models.length, 0); + assert.deepEqual(user.commentableIds, []); + assert.deepEqual(user.attrs, { commentableIds: null }); + }); - test('the parent accepts children and child ids', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ commentables: [ post ], commentableIds: [ { type: 'post', id: post.id } ] }); + test('the parent accepts children and child ids', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ commentables: [ post ], commentableIds: [ { type: 'post', id: post.id } ] }); - assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); - assert.ok(user.commentables.includes(post)); - }); + assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); + assert.ok(user.commentables.includes(post)); + }); - test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let user = this.schema.users.new({}); + test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let user = this.schema.users.new({}); - assert.deepEqual(user.commentableIds, []); - assert.deepEqual(user.commentables.models, []); - assert.deepEqual(user.attrs, { commentableIds: null }); - }); + assert.deepEqual(user.commentableIds, []); + assert.deepEqual(user.commentables.models, []); + assert.deepEqual(user.attrs, { commentableIds: null }); + }); - test('the parent accepts no reference to children or child ids', function(assert) { - let user = this.schema.users.new(); + test('the parent accepts no reference to children or child ids', function(assert) { + let user = this.schema.users.new(); - assert.deepEqual(user.commentableIds, []); - assert.deepEqual(user.commentables.models, []); - assert.deepEqual(user.attrs, { commentableIds: null }); - }); - } -); + assert.deepEqual(user.commentableIds, []); + assert.deepEqual(user.commentables.models, []); + assert.deepEqual(user.attrs, { commentableIds: null }); + }); +}); diff --git a/tests/integration/orm/has-many/2-named/association-create-test.js b/tests/integration/orm/has-many/2-named/association-create-test.js index 872ca93f6..5ba24f5a7 100644 --- a/tests/integration/orm/has-many/2-named/association-create-test.js +++ b/tests/integration/orm/has-many/2-named/association-create-test.js @@ -1,31 +1,28 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named | association #create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Has Many | Named | association #create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.blogPosts.models.length; + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { - let post = user.createBlogPost({ title: 'Lorem ipsum' }); + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.blogPosts.models.length; - assert.ok(post.id, 'the child was persisted'); - assert.equal(user.blogPosts.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.blogPosts.includes(post), 'the model was added to user.blogPosts'); - assert.ok(user.blogPostIds.indexOf(post.id) > -1, 'the id was added to the fks array'); - assert.ok(user.attrs.blogPostIds.indexOf(post.id) > -1, 'fks were persisted'); - }); + let post = user.createBlogPost({ title: 'Lorem ipsum' }); + assert.ok(post.id, 'the child was persisted'); + assert.equal(user.blogPosts.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.blogPosts.includes(post), 'the model was added to user.blogPosts'); + assert.ok(user.blogPostIds.indexOf(post.id) > -1, 'the id was added to the fks array'); + assert.ok(user.attrs.blogPostIds.indexOf(post.id) > -1, 'fks were persisted'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/2-named/association-new-test.js b/tests/integration/orm/has-many/2-named/association-new-test.js index c6bfc6060..227b37c43 100644 --- a/tests/integration/orm/has-many/2-named/association-new-test.js +++ b/tests/integration/orm/has-many/2-named/association-new-test.js @@ -1,36 +1,33 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named | association #new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ +module('Integration | ORM | Has Many | Named | association #new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + /* + The model can make a new unsaved belongs-to association, for all states + */ - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.blogPosts.models.length; + states.forEach((state) => { - let post = user.newBlogPost({ title: 'Lorem ipsum' }); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.blogPosts.models.length; - assert.ok(!post.id, 'the child was not persisted'); - assert.equal(user.blogPosts.models.length, initialCount + 1); + let post = user.newBlogPost({ title: 'Lorem ipsum' }); - post.save(); + assert.ok(!post.id, 'the child was not persisted'); + assert.equal(user.blogPosts.models.length, initialCount + 1); - assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum' }, 'the child was persisted'); - assert.equal(user.blogPosts.models.length, initialCount + 1, 'the collection size was increased'); - assert.deepEqual(user.blogPosts.models.filter((a) => a.id === post.id)[0], post, 'the model was added to user.blogPosts'); - assert.ok(user.blogPostIds.indexOf(post.id) > -1, 'the id was added to the fks array'); - }); + post.save(); + assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum' }, 'the child was persisted'); + assert.equal(user.blogPosts.models.length, initialCount + 1, 'the collection size was increased'); + assert.deepEqual(user.blogPosts.models.filter((a) => a.id === post.id)[0], post, 'the model was added to user.blogPosts'); + assert.ok(user.blogPostIds.indexOf(post.id) > -1, 'the id was added to the fks array'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/2-named/association-set-ids-test.js b/tests/integration/orm/has-many/2-named/association-set-ids-test.js index 02b726a7f..6921290bb 100644 --- a/tests/integration/orm/has-many/2-named/association-set-ids-test.js +++ b/tests/integration/orm/has-many/2-named/association-set-ids-test.js @@ -1,37 +1,34 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named | association #setIds', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Has Many | Named | association #setIds', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user ] = this.helper[state](); - let savedPost = this.helper.savedChild(); + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - user.blogPostIds = [ savedPost.id ]; + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user ] = this.helper[state](); + let savedPost = this.helper.savedChild(); - assert.deepEqual(user.blogPosts.models[0].attrs, savedPost.attrs); - assert.deepEqual(user.blogPostIds, [ savedPost.id ]); - }); + user.blogPostIds = [ savedPost.id ]; - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ user ] = this.helper[state](); + assert.deepEqual(user.blogPosts.models[0].attrs, savedPost.attrs); + assert.deepEqual(user.blogPostIds, [ savedPost.id ]); + }); - user.blogPostIds = null; + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ user ] = this.helper[state](); - assert.deepEqual(user.blogPosts.models, []); - assert.deepEqual(user.blogPostIds, []); - }); + user.blogPostIds = null; + assert.deepEqual(user.blogPosts.models, []); + assert.deepEqual(user.blogPostIds, []); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/2-named/association-set-test.js b/tests/integration/orm/has-many/2-named/association-set-test.js index 0e9c94142..0106d6863 100644 --- a/tests/integration/orm/has-many/2-named/association-set-test.js +++ b/tests/integration/orm/has-many/2-named/association-set-test.js @@ -1,56 +1,53 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named | association #set', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Has Many | Named | association #set', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ user ] = this.helper[state](); - let savedPost = this.helper.savedChild(); + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - user.blogPosts = [ savedPost ]; + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ user ] = this.helper[state](); + let savedPost = this.helper.savedChild(); - assert.ok(user.blogPosts.models.indexOf(savedPost) > -1); - assert.ok(user.blogPostIds.indexOf(savedPost.id) > -1); - }); + user.blogPosts = [ savedPost ]; - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user ] = this.helper[state](); - let newPost = this.helper.newChild(); + assert.ok(user.blogPosts.models.indexOf(savedPost) > -1); + assert.ok(user.blogPostIds.indexOf(savedPost.id) > -1); + }); - user.blogPosts = [ newPost ]; + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user ] = this.helper[state](); + let newPost = this.helper.newChild(); - assert.deepEqual(user.blogPostIds, [ undefined ]); - assert.deepEqual(user.blogPosts.models[0], newPost); - }); + user.blogPosts = [ newPost ]; - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user ] = this.helper[state](); + assert.deepEqual(user.blogPostIds, [ undefined ]); + assert.deepEqual(user.blogPosts.models[0], newPost); + }); - user.blogPosts = [ ]; + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user ] = this.helper[state](); - assert.deepEqual(user.blogPostIds, [ ]); - assert.equal(user.blogPosts.models.length, 0); - }); + user.blogPosts = [ ]; - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user ] = this.helper[state](); + assert.deepEqual(user.blogPostIds, [ ]); + assert.equal(user.blogPosts.models.length, 0); + }); - user.blogPosts = null; + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user ] = this.helper[state](); - assert.deepEqual(user.blogPostIds, [ ]); - assert.equal(user.blogPosts.models.length, 0); - }); + user.blogPosts = null; + assert.deepEqual(user.blogPostIds, [ ]); + assert.equal(user.blogPosts.models.length, 0); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/3-reflexive/association-create-test.js b/tests/integration/orm/has-many/3-reflexive/association-create-test.js index 0bfd7e6b5..f29a2f6cf 100644 --- a/tests/integration/orm/has-many/3-reflexive/association-create-test.js +++ b/tests/integration/orm/has-many/3-reflexive/association-create-test.js @@ -1,42 +1,39 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Reflexive | association #create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Has Many | Reflexive | association #create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can create an associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.tags.models.length; + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { - let orangeTag = tag.createTag({ name: 'Orange' }); - let blueTag = tag.createTag({ name: 'Blue' }); + test(`a ${state} can create an associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.tags.models.length; - assert.ok(orangeTag.id, 'the child was persisted'); - assert.ok(blueTag.id, 'the child was persisted'); - assert.equal(tag.tags.models.length, initialCount + 2, 'the collection size was increased'); - assert.ok(tag.tags.includes(orangeTag), 'the model was added to tag.tags'); - assert.ok(tag.tags.includes(blueTag), 'the model was added to tag.tags'); - assert.ok(tag.tagIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); - assert.ok(tag.tagIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); - assert.ok(tag.attrs.tagIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); - assert.ok(tag.attrs.tagIds.indexOf(blueTag.id) > -1, 'fks were persisted'); + let orangeTag = tag.createTag({ name: 'Orange' }); + let blueTag = tag.createTag({ name: 'Blue' }); - // Check the inverse - assert.equal(orangeTag.tags.models.length, 1); - assert.ok(orangeTag.tags.includes(tag), 'the inverse was set'); - assert.equal(blueTag.tags.models.length, 1); - assert.ok(blueTag.tags.includes(tag), 'the inverse was set'); - }); + assert.ok(orangeTag.id, 'the child was persisted'); + assert.ok(blueTag.id, 'the child was persisted'); + assert.equal(tag.tags.models.length, initialCount + 2, 'the collection size was increased'); + assert.ok(tag.tags.includes(orangeTag), 'the model was added to tag.tags'); + assert.ok(tag.tags.includes(blueTag), 'the model was added to tag.tags'); + assert.ok(tag.tagIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); + assert.ok(tag.tagIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); + assert.ok(tag.attrs.tagIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); + assert.ok(tag.attrs.tagIds.indexOf(blueTag.id) > -1, 'fks were persisted'); + // Check the inverse + assert.equal(orangeTag.tags.models.length, 1); + assert.ok(orangeTag.tags.includes(tag), 'the inverse was set'); + assert.equal(blueTag.tags.models.length, 1); + assert.ok(blueTag.tags.includes(tag), 'the inverse was set'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/3-reflexive/association-new-test.js b/tests/integration/orm/has-many/3-reflexive/association-new-test.js index 7d7e91d99..203c8c4ee 100644 --- a/tests/integration/orm/has-many/3-reflexive/association-new-test.js +++ b/tests/integration/orm/has-many/3-reflexive/association-new-test.js @@ -1,39 +1,36 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Reflexive | association #new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ +module('Integration | ORM | Has Many | Reflexive | association #new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + /* + The model can make a new unsaved belongs-to association, for all states + */ - test(`a ${state} can build a new associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.tags.models.length; + states.forEach((state) => { - let blueTag = tag.newTag({ name: 'Blue' }); + test(`a ${state} can build a new associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.tags.models.length; - assert.ok(!blueTag.id, 'the child was not persisted'); - assert.equal(tag.tags.models.length, initialCount + 1); - assert.equal(blueTag.tags.models.length, 1, 'the inverse was set'); + let blueTag = tag.newTag({ name: 'Blue' }); - blueTag.save(); - tag.reload(); + assert.ok(!blueTag.id, 'the child was not persisted'); + assert.equal(tag.tags.models.length, initialCount + 1); + assert.equal(blueTag.tags.models.length, 1, 'the inverse was set'); - assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', tagIds: [ tag.id ] }, 'the child was persisted'); - assert.equal(tag.tags.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.tags.includes(blueTag), 'the model was added to tag.tags'); - assert.ok(tag.tagIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); - assert.ok(blueTag.tags.includes(tag), 'the inverse was set'); - }); + blueTag.save(); + tag.reload(); + assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', tagIds: [ tag.id ] }, 'the child was persisted'); + assert.equal(tag.tags.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.tags.includes(blueTag), 'the model was added to tag.tags'); + assert.ok(tag.tagIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); + assert.ok(blueTag.tags.includes(tag), 'the inverse was set'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/3-reflexive/association-set-ids-test.js b/tests/integration/orm/has-many/3-reflexive/association-set-ids-test.js index 5e191948d..1ff25cda1 100644 --- a/tests/integration/orm/has-many/3-reflexive/association-set-ids-test.js +++ b/tests/integration/orm/has-many/3-reflexive/association-set-ids-test.js @@ -1,51 +1,48 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Reflexive | association #setIds', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); +module('Integration | ORM | Has Many | Reflexive | association #setIds', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let savedTag = this.helper.savedChild(); + test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let savedTag = this.helper.savedChild(); - tag.tagIds = [ savedTag.id ]; + tag.tagIds = [ savedTag.id ]; - assert.deepEqual(tag.tags.models[0].attrs, savedTag.attrs); - assert.deepEqual(tag.tagIds, [ savedTag.id ]); + assert.deepEqual(tag.tags.models[0].attrs, savedTag.attrs); + assert.deepEqual(tag.tagIds, [ savedTag.id ]); - tag.save(); - savedTag.reload(); + tag.save(); + savedTag.reload(); - assert.deepEqual(savedTag.tags.models[0].attrs, tag.attrs, 'the inverse was set'); - originalTags.forEach(originalTag => { - if (originalTag.isSaved()) { - originalTag.reload(); - assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); - } - }); + assert.deepEqual(savedTag.tags.models[0].attrs, tag.attrs, 'the inverse was set'); + originalTags.forEach(originalTag => { + if (originalTag.isSaved()) { + originalTag.reload(); + assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); + } }); + }); - test(`a ${state} can clear its association via a null childIds`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); + test(`a ${state} can clear its association via a null childIds`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); - tag.tagIds = null; + tag.tagIds = null; - assert.deepEqual(tag.tags.models, []); - assert.deepEqual(tag.tagIds, []); + assert.deepEqual(tag.tags.models, []); + assert.deepEqual(tag.tagIds, []); - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); - }); + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); }); - }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/3-reflexive/association-set-test.js b/tests/integration/orm/has-many/3-reflexive/association-set-test.js index d9de5dd74..9edd77e0b 100644 --- a/tests/integration/orm/has-many/3-reflexive/association-set-test.js +++ b/tests/integration/orm/has-many/3-reflexive/association-set-test.js @@ -1,84 +1,81 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Reflexive | association #set', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); +module('Integration | ORM | Has Many | Reflexive | association #set', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let savedTag = this.helper.savedChild(); + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let savedTag = this.helper.savedChild(); - tag.tags = [ savedTag ]; + tag.tags = [ savedTag ]; - assert.ok(tag.tags.includes(savedTag)); - assert.equal(tag.tagIds[0], savedTag.id); - assert.ok(savedTag.tags.includes(tag), 'the inverse was set'); + assert.ok(tag.tags.includes(savedTag)); + assert.equal(tag.tagIds[0], savedTag.id); + assert.ok(savedTag.tags.includes(tag), 'the inverse was set'); - tag.save(); + tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); - }); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); }); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let newTag = this.helper.newChild(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let newTag = this.helper.newChild(); - tag.tags = [ newTag ]; + tag.tags = [ newTag ]; - assert.ok(tag.tags.includes(newTag)); - assert.equal(tag.tagIds[0], undefined); - assert.ok(newTag.tags.includes(tag), 'the inverse was set'); + assert.ok(tag.tags.includes(newTag)); + assert.equal(tag.tagIds[0], undefined); + assert.ok(newTag.tags.includes(tag), 'the inverse was set'); - tag.save(); + tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); - }); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); - tag.tags = [ ]; + tag.tags = [ ]; - assert.deepEqual(tag.tagIds, [ ]); - assert.equal(tag.tags.models.length, 0); + assert.deepEqual(tag.tagIds, [ ]); + assert.equal(tag.tags.models.length, 0); - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); - }); + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); - tag.tags = null; + tag.tags = null; - assert.deepEqual(tag.tagIds, [ ]); - assert.equal(tag.tags.models.length, 0); + assert.deepEqual(tag.tagIds, [ ]); + assert.equal(tag.tags.models.length, 0); - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); - }); + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); }); - }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/4-named-reflexive/accessor-test.js b/tests/integration/orm/has-many/4-named-reflexive/accessor-test.js index f062ce2a9..8b94106b3 100644 --- a/tests/integration/orm/has-many/4-named-reflexive/accessor-test.js +++ b/tests/integration/orm/has-many/4-named-reflexive/accessor-test.js @@ -1,33 +1,30 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named Reflexive | accessor', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); +module('Integration | ORM | Has Many | Named Reflexive | accessor', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ tag, tags ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ tag, tags ] = this.helper[state](); - assert.equal(tag.labels.models.length, tags.length, 'the parent has the correct number of children'); - assert.equal(tag.labelIds.length, tags.length, 'the parent has the correct number of children ids'); + assert.equal(tag.labels.models.length, tags.length, 'the parent has the correct number of children'); + assert.equal(tag.labelIds.length, tags.length, 'the parent has the correct number of children ids'); - tags.forEach((t, i) => { - assert.deepEqual(tag.labels.models[i], t, 'each child is in parent.children array'); + tags.forEach((t, i) => { + assert.deepEqual(tag.labels.models[i], t, 'each child is in parent.children array'); - if (t.isSaved()) { - assert.ok(tag.labelIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); - } + if (t.isSaved()) { + assert.ok(tag.labelIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); + } - // Check the inverse - assert.ok(t.labels.includes(tag)); - }); + // Check the inverse + assert.ok(t.labels.includes(tag)); }); - }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/4-named-reflexive/association-create-test.js b/tests/integration/orm/has-many/4-named-reflexive/association-create-test.js index d0dbbd5e6..2a22bc255 100644 --- a/tests/integration/orm/has-many/4-named-reflexive/association-create-test.js +++ b/tests/integration/orm/has-many/4-named-reflexive/association-create-test.js @@ -1,32 +1,29 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named Reflexive | association #create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Has Many | Named Reflexive | association #create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can create an associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.labels.models.length; + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { - let orangeTag = tag.createLabel({ name: 'Orange' }); + test(`a ${state} can create an associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.labels.models.length; - assert.ok(orangeTag.id, 'the child was persisted'); - assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.labels.includes(orangeTag), 'the model was added to tag.labels'); - assert.ok(tag.labelIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); - assert.ok(tag.attrs.labelIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); - assert.ok(orangeTag.labels.includes(tag), 'the inverse was set'); - }); + let orangeTag = tag.createLabel({ name: 'Orange' }); + assert.ok(orangeTag.id, 'the child was persisted'); + assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.labels.includes(orangeTag), 'the model was added to tag.labels'); + assert.ok(tag.labelIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); + assert.ok(tag.attrs.labelIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); + assert.ok(orangeTag.labels.includes(tag), 'the inverse was set'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/4-named-reflexive/association-new-test.js b/tests/integration/orm/has-many/4-named-reflexive/association-new-test.js index cb54ef9b9..cdf76a76c 100644 --- a/tests/integration/orm/has-many/4-named-reflexive/association-new-test.js +++ b/tests/integration/orm/has-many/4-named-reflexive/association-new-test.js @@ -1,38 +1,35 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named Reflexive | association #new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ +module('Integration | ORM | Has Many | Named Reflexive | association #new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + /* + The model can make a new unsaved belongs-to association, for all states + */ - test(`a ${state} can build a new associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.labels.models.length; + states.forEach((state) => { - let blueTag = tag.newLabel({ name: 'Blue' }); + test(`a ${state} can build a new associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.labels.models.length; - assert.ok(!blueTag.id, 'the child was not persisted'); - assert.equal(tag.labels.models.length, initialCount + 1); - assert.equal(blueTag.labels.models.length, 1, 'the inverse was set'); + let blueTag = tag.newLabel({ name: 'Blue' }); - blueTag.save(); + assert.ok(!blueTag.id, 'the child was not persisted'); + assert.equal(tag.labels.models.length, initialCount + 1); + assert.equal(blueTag.labels.models.length, 1, 'the inverse was set'); - assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', labelIds: [ tag.id ] }, 'the child was persisted'); - assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.labels.includes(blueTag), 'the model was added to tag.labels'); - assert.ok(tag.labelIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); - assert.ok(blueTag.labels.includes(tag), 'the inverse was set'); - }); + blueTag.save(); + assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', labelIds: [ tag.id ] }, 'the child was persisted'); + assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.labels.includes(blueTag), 'the model was added to tag.labels'); + assert.ok(tag.labelIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); + assert.ok(blueTag.labels.includes(tag), 'the inverse was set'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/4-named-reflexive/association-set-ids-test.js b/tests/integration/orm/has-many/4-named-reflexive/association-set-ids-test.js index 3ee354739..237ded8c0 100644 --- a/tests/integration/orm/has-many/4-named-reflexive/association-set-ids-test.js +++ b/tests/integration/orm/has-many/4-named-reflexive/association-set-ids-test.js @@ -1,51 +1,48 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named Reflexive | association #setIds', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); +module('Integration | ORM | Has Many | Named Reflexive | association #setIds', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let savedTag = this.helper.savedChild(); + test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let savedTag = this.helper.savedChild(); - tag.labelIds = [ savedTag.id ]; + tag.labelIds = [ savedTag.id ]; - assert.deepEqual(tag.labels.models[0].attrs, savedTag.attrs); - assert.deepEqual(tag.labelIds, [ savedTag.id ]); + assert.deepEqual(tag.labels.models[0].attrs, savedTag.attrs); + assert.deepEqual(tag.labelIds, [ savedTag.id ]); - tag.save(); - savedTag.reload(); + tag.save(); + savedTag.reload(); - assert.deepEqual(savedTag.labels.models[0].attrs, tag.attrs, 'the inverse was set'); - originalTags.forEach(originalTag => { - if (originalTag.isSaved()) { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - } - }); + assert.deepEqual(savedTag.labels.models[0].attrs, tag.attrs, 'the inverse was set'); + originalTags.forEach(originalTag => { + if (originalTag.isSaved()) { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + } }); + }); - test(`a ${state} can clear its association via a null childIds`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); + test(`a ${state} can clear its association via a null childIds`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); - tag.labelIds = null; + tag.labelIds = null; - assert.deepEqual(tag.labels.models, []); - assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.labels.models, []); + assert.deepEqual(tag.labelIds, []); - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); }); - }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/4-named-reflexive/association-set-test.js b/tests/integration/orm/has-many/4-named-reflexive/association-set-test.js index 01671e0fe..5e4e2c494 100644 --- a/tests/integration/orm/has-many/4-named-reflexive/association-set-test.js +++ b/tests/integration/orm/has-many/4-named-reflexive/association-set-test.js @@ -1,84 +1,81 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named Reflexive | association #set', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); +module('Integration | ORM | Has Many | Named Reflexive | association #set', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let savedTag = this.helper.savedChild(); + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let savedTag = this.helper.savedChild(); - tag.labels = [ savedTag ]; + tag.labels = [ savedTag ]; - assert.ok(tag.labels.includes(savedTag)); - assert.equal(tag.labelIds[0], savedTag.id); - assert.ok(savedTag.labels.includes(tag), 'the inverse was set'); + assert.ok(tag.labels.includes(savedTag)); + assert.equal(tag.labelIds[0], savedTag.id); + assert.ok(savedTag.labels.includes(tag), 'the inverse was set'); - tag.save(); + tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); }); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let newTag = this.helper.newChild(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let newTag = this.helper.newChild(); - tag.labels = [ newTag ]; + tag.labels = [ newTag ]; - assert.ok(tag.labels.includes(newTag)); - assert.equal(tag.labelIds[0], undefined); - assert.ok(newTag.labels.includes(tag), 'the inverse was set'); + assert.ok(tag.labels.includes(newTag)); + assert.equal(tag.labelIds[0], undefined); + assert.ok(newTag.labels.includes(tag), 'the inverse was set'); - tag.save(); + tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); - tag.labels = [ ]; + tag.labels = [ ]; - assert.deepEqual(tag.labelIds, [ ]); - assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, [ ]); + assert.equal(tag.labels.models.length, 0); - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); - tag.labels = null; + tag.labels = null; - assert.deepEqual(tag.labelIds, [ ]); - assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, [ ]); + assert.equal(tag.labels.models.length, 0); - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); }); - }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/4-named-reflexive/create-test.js b/tests/integration/orm/has-many/4-named-reflexive/create-test.js index 7d2d79e9f..40e5c6dfa 100644 --- a/tests/integration/orm/has-many/4-named-reflexive/create-test.js +++ b/tests/integration/orm/has-many/4-named-reflexive/create-test.js @@ -2,96 +2,93 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named Reflexive | create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); +module('Integration | ORM | Has Many | Named Reflexive | create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + }); + + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labelIds: [ tagA.id ] }); - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labelIds: [ tagA.id ] - }); - - tagA.reload(); - - assert.deepEqual(tagA.labelIds, [ tagB.id ]); - assert.deepEqual(tagB.labelIds, [ tagA.id ], 'the inverse was set'); - assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the ids were persisted'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the inverse ids were persisted'); - assert.deepEqual(tagA.labels.models[0].attrs, tagB.attrs); - assert.deepEqual(tagB.labels.models[0].attrs, tagA.attrs, 'the inverse was set'); - assert.equal(this.helper.db.tags.length, 2); - assert.deepEqual(this.helper.db.tags[0], { id: '1', labelIds: [ '2' ] }); - assert.deepEqual(this.helper.db.tags[1], { id: '2', labelIds: [ '1' ] }); + tagA.reload(); + + assert.deepEqual(tagA.labelIds, [ tagB.id ]); + assert.deepEqual(tagB.labelIds, [ tagA.id ], 'the inverse was set'); + assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the ids were persisted'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the inverse ids were persisted'); + assert.deepEqual(tagA.labels.models[0].attrs, tagB.attrs); + assert.deepEqual(tagB.labels.models[0].attrs, tagA.attrs, 'the inverse was set'); + assert.equal(this.helper.db.tags.length, 2); + assert.deepEqual(this.helper.db.tags[0], { id: '1', labelIds: [ '2' ] }); + assert.deepEqual(this.helper.db.tags[1], { id: '2', labelIds: [ '1' ] }); + }); + + test('it sets up associations correctly when passing in an array of models', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labels: [ tagA ] }); - test('it sets up associations correctly when passing in an array of models', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labels: [ tagA ] - }); + tagA.reload(); - tagA.reload(); + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.labelIds, [ tagB.id ], 'the inverse was set'); + assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the ids were persisted'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the inverse was set'); + assert.equal(this.helper.db.tags.length, 2); + }); - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.labelIds, [ tagB.id ], 'the inverse was set'); - assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the ids were persisted'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the inverse was set'); - assert.equal(this.helper.db.tags.length, 2); + test('it sets up associations correctly when passing in a collection', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labels: schema.tags.all() }); - test('it sets up associations correctly when passing in a collection', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labels: schema.tags.all() - }); - - tagA.reload(); + tagA.reload(); - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.labelIds, [ tagB.id ], 'the inverse was set'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the inverse was set'); - assert.equal(this.helper.db.tags.length, 2); - }); + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.labelIds, [ tagB.id ], 'the inverse was set'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the inverse was set'); + assert.equal(this.helper.db.tags.length, 2); + }); - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.tags.create({ - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); + assert.throws(function() { + schema.tags.create({ + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); + }); - test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.tags.create({ - foos: [ schema.create('foo') ] - }); - }, /you haven't defined that key as an association on your model/); - }); + assert.throws(function() { + schema.tags.create({ + foos: [ schema.create('foo') ] + }); + }, /you haven't defined that key as an association on your model/); + }); - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.foos.create(); - schema.foos.create(); + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.foos.create(); + schema.foos.create(); - assert.throws(function() { - schema.tags.create({ - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); - } -); + assert.throws(function() { + schema.tags.create({ + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); +}); diff --git a/tests/integration/orm/has-many/4-named-reflexive/delete-test.js b/tests/integration/orm/has-many/4-named-reflexive/delete-test.js index f72738843..af5427909 100644 --- a/tests/integration/orm/has-many/4-named-reflexive/delete-test.js +++ b/tests/integration/orm/has-many/4-named-reflexive/delete-test.js @@ -1,27 +1,24 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named Reflexive | delete', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { +module('Integration | ORM | Has Many | Named Reflexive | delete', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ tag, labels ] = this.helper[state](); + states.forEach((state) => { - if (labels && labels.length) { - labels.forEach(t => t.destroy()); - tag.reload(); - } + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ tag, labels ] = this.helper[state](); - assert.equal(tag.labels.length, 0); - assert.equal(tag.labelIds.length, 0); - }); + if (labels && labels.length) { + labels.forEach(t => t.destroy()); + tag.reload(); + } + assert.equal(tag.labels.length, 0); + assert.equal(tag.labelIds.length, 0); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/accessor-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/accessor-test.js index 84b83027f..73727d22b 100644 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/accessor-test.js +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/accessor-test.js @@ -1,33 +1,30 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named Reflexive Explicit Inverse | accessor', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); +module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | accessor', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ tag, tags ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ tag, tags ] = this.helper[state](); - assert.equal(tag.labels.models.length, tags.length, 'the parent has the correct number of children'); - assert.equal(tag.labelIds.length, tags.length, 'the parent has the correct number of children ids'); + assert.equal(tag.labels.models.length, tags.length, 'the parent has the correct number of children'); + assert.equal(tag.labelIds.length, tags.length, 'the parent has the correct number of children ids'); - tags.forEach((t, i) => { - assert.deepEqual(tag.labels.models[i], t, 'each child is in parent.children array'); + tags.forEach((t, i) => { + assert.deepEqual(tag.labels.models[i], t, 'each child is in parent.children array'); - if (t.isSaved()) { - assert.ok(tag.labelIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); - } + if (t.isSaved()) { + assert.ok(tag.labelIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); + } - // Check the inverse - assert.ok(t.labels.includes(tag)); - }); + // Check the inverse + assert.ok(t.labels.includes(tag)); }); - }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-create-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-create-test.js index c9364319c..465e63f90 100644 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-create-test.js +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-create-test.js @@ -1,32 +1,29 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named Reflexive Explicit Inverse | association #create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | association #create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can create an associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.labels.models.length; + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { - let orangeTag = tag.createLabel({ name: 'Orange' }); + test(`a ${state} can create an associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.labels.models.length; - assert.ok(orangeTag.id, 'the child was persisted'); - assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.labels.includes(orangeTag), 'the model was added to tag.labels'); - assert.ok(tag.labelIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); - assert.ok(tag.attrs.labelIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); - assert.ok(orangeTag.labels.includes(tag), 'the inverse was set'); - }); + let orangeTag = tag.createLabel({ name: 'Orange' }); + assert.ok(orangeTag.id, 'the child was persisted'); + assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.labels.includes(orangeTag), 'the model was added to tag.labels'); + assert.ok(tag.labelIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); + assert.ok(tag.attrs.labelIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); + assert.ok(orangeTag.labels.includes(tag), 'the inverse was set'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-new-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-new-test.js index 1e39d2aed..3c6467c43 100644 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-new-test.js +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-new-test.js @@ -1,38 +1,35 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named Reflexive Explicit Inverse | association #new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ +module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | association #new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + /* + The model can make a new unsaved belongs-to association, for all states + */ - test(`a ${state} can build a new associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.labels.models.length; + states.forEach((state) => { - let blueTag = tag.newLabel({ name: 'Blue' }); + test(`a ${state} can build a new associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.labels.models.length; - assert.ok(!blueTag.id, 'the child was not persisted'); - assert.equal(tag.labels.models.length, initialCount + 1); - assert.equal(blueTag.labels.models.length, 1, 'the inverse was set'); + let blueTag = tag.newLabel({ name: 'Blue' }); - blueTag.save(); + assert.ok(!blueTag.id, 'the child was not persisted'); + assert.equal(tag.labels.models.length, initialCount + 1); + assert.equal(blueTag.labels.models.length, 1, 'the inverse was set'); - assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', labelIds: [ tag.id ] }, 'the child was persisted'); - assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.labels.includes(blueTag), 'the model was added to tag.labels'); - assert.ok(tag.labelIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); - assert.ok(blueTag.labels.includes(tag), 'the inverse was set'); - }); + blueTag.save(); + assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', labelIds: [ tag.id ] }, 'the child was persisted'); + assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.labels.includes(blueTag), 'the model was added to tag.labels'); + assert.ok(tag.labelIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); + assert.ok(blueTag.labels.includes(tag), 'the inverse was set'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-ids-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-ids-test.js index a60c874c4..cd30e8d43 100644 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-ids-test.js +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-ids-test.js @@ -1,51 +1,48 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named Reflexive Explicit Inverse | association #setIds', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); +module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | association #setIds', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let savedTag = this.helper.savedChild(); + test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let savedTag = this.helper.savedChild(); - tag.labelIds = [ savedTag.id ]; + tag.labelIds = [ savedTag.id ]; - assert.deepEqual(tag.labels.models[0].attrs, savedTag.attrs); - assert.deepEqual(tag.labelIds, [ savedTag.id ]); + assert.deepEqual(tag.labels.models[0].attrs, savedTag.attrs); + assert.deepEqual(tag.labelIds, [ savedTag.id ]); - tag.save(); - savedTag.reload(); + tag.save(); + savedTag.reload(); - assert.deepEqual(savedTag.labels.models[0].attrs, tag.attrs, 'the inverse was set'); - originalTags.forEach(originalTag => { - if (originalTag.isSaved()) { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - } - }); + assert.deepEqual(savedTag.labels.models[0].attrs, tag.attrs, 'the inverse was set'); + originalTags.forEach(originalTag => { + if (originalTag.isSaved()) { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); + } }); + }); - test(`a ${state} can clear its association via a null childIds`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); + test(`a ${state} can clear its association via a null childIds`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); - tag.labelIds = null; + tag.labelIds = null; - assert.deepEqual(tag.labels.models, []); - assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.labels.models, []); + assert.deepEqual(tag.labelIds, []); - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); }); - }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-test.js index 2083445ad..fc11b1dcc 100644 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-test.js +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-test.js @@ -1,84 +1,81 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named Reflexive Explicit Inverse | association #set', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); +module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | association #set', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let savedTag = this.helper.savedChild(); + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let savedTag = this.helper.savedChild(); - tag.labels = [ savedTag ]; + tag.labels = [ savedTag ]; - assert.ok(tag.labels.includes(savedTag)); - assert.equal(tag.labelIds[0], savedTag.id); - assert.ok(savedTag.labels.includes(tag), 'the inverse was set'); + assert.ok(tag.labels.includes(savedTag)); + assert.equal(tag.labelIds[0], savedTag.id); + assert.ok(savedTag.labels.includes(tag), 'the inverse was set'); - tag.save(); + tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); }); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let newTag = this.helper.newChild(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); + let newTag = this.helper.newChild(); - tag.labels = [ newTag ]; + tag.labels = [ newTag ]; - assert.ok(tag.labels.includes(newTag)); - assert.equal(tag.labelIds[0], undefined); - assert.ok(newTag.labels.includes(tag), 'the inverse was set'); + assert.ok(tag.labels.includes(newTag)); + assert.equal(tag.labelIds[0], undefined); + assert.ok(newTag.labels.includes(tag), 'the inverse was set'); - tag.save(); + tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); - tag.labels = [ ]; + tag.labels = [ ]; - assert.deepEqual(tag.labelIds, [ ]); - assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, [ ]); + assert.equal(tag.labels.models.length, 0); - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag, originalTags ] = this.helper[state](); - tag.labels = null; + tag.labels = null; - assert.deepEqual(tag.labelIds, [ ]); - assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, [ ]); + assert.equal(tag.labels.models.length, 0); - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); + tag.save(); + originalTags.forEach(originalTag => { + originalTag.reload(); + assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); }); - }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/create-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/create-test.js index 9770f6ddb..b98d351f1 100644 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/create-test.js +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/create-test.js @@ -2,96 +2,93 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named Reflexive Explicit Inverse | create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); +module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + }); + + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labelIds: [ tagA.id ] }); - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labelIds: [ tagA.id ] - }); - - tagA.reload(); - - assert.deepEqual(tagA.labelIds, [ tagB.id ]); - assert.deepEqual(tagB.labelIds, [ tagA.id ], 'the inverse was set'); - assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the ids were persisted'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the inverse ids were persisted'); - assert.deepEqual(tagA.labels.models[0].attrs, tagB.attrs); - assert.deepEqual(tagB.labels.models[0].attrs, tagA.attrs, 'the inverse was set'); - assert.equal(this.helper.db.tags.length, 2); - assert.deepEqual(this.helper.db.tags[0], { id: '1', labelIds: [ '2' ] }); - assert.deepEqual(this.helper.db.tags[1], { id: '2', labelIds: [ '1' ] }); + tagA.reload(); + + assert.deepEqual(tagA.labelIds, [ tagB.id ]); + assert.deepEqual(tagB.labelIds, [ tagA.id ], 'the inverse was set'); + assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the ids were persisted'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the inverse ids were persisted'); + assert.deepEqual(tagA.labels.models[0].attrs, tagB.attrs); + assert.deepEqual(tagB.labels.models[0].attrs, tagA.attrs, 'the inverse was set'); + assert.equal(this.helper.db.tags.length, 2); + assert.deepEqual(this.helper.db.tags[0], { id: '1', labelIds: [ '2' ] }); + assert.deepEqual(this.helper.db.tags[1], { id: '2', labelIds: [ '1' ] }); + }); + + test('it sets up associations correctly when passing in an array of models', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labels: [ tagA ] }); - test('it sets up associations correctly when passing in an array of models', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labels: [ tagA ] - }); + tagA.reload(); - tagA.reload(); + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.labelIds, [ tagB.id ], 'the inverse was set'); + assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the ids were persisted'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the inverse was set'); + assert.equal(this.helper.db.tags.length, 2); + }); - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.labelIds, [ tagB.id ], 'the inverse was set'); - assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the ids were persisted'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the inverse was set'); - assert.equal(this.helper.db.tags.length, 2); + test('it sets up associations correctly when passing in a collection', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labels: schema.tags.all() }); - test('it sets up associations correctly when passing in a collection', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labels: schema.tags.all() - }); - - tagA.reload(); + tagA.reload(); - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.labelIds, [ tagB.id ], 'the inverse was set'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the inverse was set'); - assert.equal(this.helper.db.tags.length, 2); - }); + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.labelIds, [ tagB.id ], 'the inverse was set'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the inverse was set'); + assert.equal(this.helper.db.tags.length, 2); + }); - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.tags.create({ - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); + assert.throws(function() { + schema.tags.create({ + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); + }); - test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.tags.create({ - foos: [ schema.create('foo') ] - }); - }, /you haven't defined that key as an association on your model/); - }); + assert.throws(function() { + schema.tags.create({ + foos: [ schema.create('foo') ] + }); + }, /you haven't defined that key as an association on your model/); + }); - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.foos.create(); - schema.foos.create(); + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.foos.create(); + schema.foos.create(); - assert.throws(function() { - schema.tags.create({ - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); - } -); + assert.throws(function() { + schema.tags.create({ + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); +}); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/delete-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/delete-test.js index 2202ed172..1f277205e 100644 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/delete-test.js +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/delete-test.js @@ -1,27 +1,24 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named Reflexive Explicit Inverse | delete', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { +module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | delete', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ tag, labels ] = this.helper[state](); + states.forEach((state) => { - if (labels && labels.length) { - labels.forEach(t => t.destroy()); - tag.reload(); - } + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ tag, labels ] = this.helper[state](); - assert.equal(tag.labels.length, 0); - assert.equal(tag.labelIds.length, 0); - }); + if (labels && labels.length) { + labels.forEach(t => t.destroy()); + tag.reload(); + } + assert.equal(tag.labels.length, 0); + assert.equal(tag.labelIds.length, 0); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/new-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/new-test.js index a962280d1..6c2fbc3e5 100644 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/new-test.js +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/new-test.js @@ -1,84 +1,81 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named Reflexive Explicit Inverse | new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the parent accepts a saved child id', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ + labelIds: [ tagA.id ] }); - test('the parent accepts a saved child id', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ - labelIds: [ tagA.id ] - }); + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagB.labels.models[0], tagA); + }); - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagB.labels.models[0], tagA); - }); + test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.tags.new({ labelIds: [ 2 ] }); + }, /You're instantiating a tag that has a labelIds of 2, but some of those records don't exist in the database/); + }); - test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.tags.new({ labelIds: [ 2 ] }); - }, /You're instantiating a tag that has a labelIds of 2, but some of those records don't exist in the database/); - }); + test('the parent accepts null children foreign key', function(assert) { + let tag = this.schema.tags.new({ labelIds: null }); - test('the parent accepts null children foreign key', function(assert) { - let tag = this.schema.tags.new({ labelIds: null }); + assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.attrs, { labelIds: null }); + }); - assert.equal(tag.labels.models.length, 0); - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.attrs, { labelIds: null }); - }); + test('the parent accepts saved children', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ labels: [ tagA ] }); - test('the parent accepts saved children', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ labels: [ tagA ] }); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagB.labels.models[0], tagA); - }); + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagB.labels.models[0], tagA); + }); - test('the parent accepts new children', function(assert) { - let tagA = this.schema.tags.new({ color: 'Red' }); - let tagB = this.schema.tags.new({ labels: [ tagA ] }); + test('the parent accepts new children', function(assert) { + let tagA = this.schema.tags.new({ color: 'Red' }); + let tagB = this.schema.tags.new({ labels: [ tagA ] }); - assert.deepEqual(tagB.labelIds, [ undefined ]); - assert.deepEqual(tagB.labels.models[0], tagA); - }); + assert.deepEqual(tagB.labelIds, [ undefined ]); + assert.deepEqual(tagB.labels.models[0], tagA); + }); - test('the parent accepts null children', function(assert) { - let tag = this.schema.tags.new({ labels: null }); + test('the parent accepts null children', function(assert) { + let tag = this.schema.tags.new({ labels: null }); - assert.equal(tag.labels.models.length, 0); - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.attrs, { labelIds: null }); - }); + assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.attrs, { labelIds: null }); + }); - test('the parent accepts children and child ids', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ labels: [ tagA ], labelIds: [ tagA.id ] }); + test('the parent accepts children and child ids', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ labels: [ tagA ], labelIds: [ tagA.id ] }); - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagB.labels.models[0], tagA); - }); + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagB.labels.models[0], tagA); + }); - test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let tag = this.schema.tags.new({}); + test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let tag = this.schema.tags.new({}); - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.labels.models, []); - assert.deepEqual(tag.attrs, { labelIds: null }); - }); + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.labels.models, []); + assert.deepEqual(tag.attrs, { labelIds: null }); + }); - test('the parent accepts no reference to children or child ids', function(assert) { - let tag = this.schema.tags.new(); + test('the parent accepts no reference to children or child ids', function(assert) { + let tag = this.schema.tags.new(); - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.labels.models, []); - assert.deepEqual(tag.attrs, { labelIds: null }); - }); - } -); + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.labels.models, []); + assert.deepEqual(tag.attrs, { labelIds: null }); + }); +}); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/accessor-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/accessor-test.js index 85cabe47c..cef4f4597 100644 --- a/tests/integration/orm/has-many/6-one-way-reflexive/accessor-test.js +++ b/tests/integration/orm/has-many/6-one-way-reflexive/accessor-test.js @@ -1,30 +1,27 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | One-Way Reflexive | accessor', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); +module('Integration | ORM | Has Many | One-Way Reflexive | accessor', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ tag, tags ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ tag, tags ] = this.helper[state](); - assert.equal(tag.tags.models.length, tags.length, 'the parent has the correct number of children'); - assert.equal(tag.tagIds.length, tags.length, 'the parent has the correct number of children ids'); + assert.equal(tag.tags.models.length, tags.length, 'the parent has the correct number of children'); + assert.equal(tag.tagIds.length, tags.length, 'the parent has the correct number of children ids'); - tags.forEach((t, i) => { - assert.deepEqual(tag.tags.models[i], t, 'each child is in parent.children array'); + tags.forEach((t, i) => { + assert.deepEqual(tag.tags.models[i], t, 'each child is in parent.children array'); - if (t.isSaved()) { - assert.ok(tag.tagIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); - } - }); + if (t.isSaved()) { + assert.ok(tag.tagIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); + } }); - }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/association-create-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/association-create-test.js index cdada6830..c47933a63 100644 --- a/tests/integration/orm/has-many/6-one-way-reflexive/association-create-test.js +++ b/tests/integration/orm/has-many/6-one-way-reflexive/association-create-test.js @@ -1,32 +1,29 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | One-Way Reflexive | association #create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Has Many | One-Way Reflexive | association #create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can create an associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.tags.models.length; + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { - let orangeTag = tag.createTag({ name: 'Orange' }); + test(`a ${state} can create an associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.tags.models.length; - assert.ok(orangeTag.id, 'the child was persisted'); - assert.equal(tag.tags.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.tags.includes(orangeTag), 'the model was added to tag.tags'); - assert.ok(tag.tagIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); - assert.ok(tag.attrs.tagIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); - assert.notOk(orangeTag.tags.includes(tag), 'the inverse was not set'); - }); + let orangeTag = tag.createTag({ name: 'Orange' }); + assert.ok(orangeTag.id, 'the child was persisted'); + assert.equal(tag.tags.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.tags.includes(orangeTag), 'the model was added to tag.tags'); + assert.ok(tag.tagIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); + assert.ok(tag.attrs.tagIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); + assert.notOk(orangeTag.tags.includes(tag), 'the inverse was not set'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/association-new-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/association-new-test.js index deb786060..5ec493c62 100644 --- a/tests/integration/orm/has-many/6-one-way-reflexive/association-new-test.js +++ b/tests/integration/orm/has-many/6-one-way-reflexive/association-new-test.js @@ -1,38 +1,35 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | One-Way Reflexive | association #new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ +module('Integration | ORM | Has Many | One-Way Reflexive | association #new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + /* + The model can make a new unsaved belongs-to association, for all states + */ - test(`a ${state} can build a new associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.tags.models.length; + states.forEach((state) => { - let blueTag = tag.newTag({ name: 'Blue' }); + test(`a ${state} can build a new associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.tags.models.length; - assert.ok(!blueTag.id, 'the child was not persisted'); - assert.equal(tag.tags.models.length, initialCount + 1); - assert.equal(blueTag.tags.models.length, 0, 'the inverse was not set'); + let blueTag = tag.newTag({ name: 'Blue' }); - blueTag.save(); + assert.ok(!blueTag.id, 'the child was not persisted'); + assert.equal(tag.tags.models.length, initialCount + 1); + assert.equal(blueTag.tags.models.length, 0, 'the inverse was not set'); - assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', tagIds: [ ] }, 'the child was persisted'); - assert.equal(tag.tags.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.tags.includes(blueTag), 'the model was added to tag.tags'); - assert.ok(tag.tagIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); - assert.notOk(blueTag.tags.includes(tag), 'the inverse was not set'); - }); + blueTag.save(); + assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', tagIds: [ ] }, 'the child was persisted'); + assert.equal(tag.tags.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.tags.includes(blueTag), 'the model was added to tag.tags'); + assert.ok(tag.tagIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); + assert.notOk(blueTag.tags.includes(tag), 'the inverse was not set'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/association-set-ids-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/association-set-ids-test.js index cbe796d4c..9a3eeb6a3 100644 --- a/tests/integration/orm/has-many/6-one-way-reflexive/association-set-ids-test.js +++ b/tests/integration/orm/has-many/6-one-way-reflexive/association-set-ids-test.js @@ -1,41 +1,38 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | One-Way Reflexive | association #setIds', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { +module('Integration | ORM | Has Many | One-Way Reflexive | association #setIds', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { - let [ tag ] = this.helper[state](); - let savedTag = this.helper.savedChild(); + states.forEach((state) => { - tag.tagIds = [ savedTag.id ]; + test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { + let [ tag ] = this.helper[state](); + let savedTag = this.helper.savedChild(); - assert.deepEqual(tag.tags.models[0].attrs, savedTag.attrs); - assert.deepEqual(tag.tagIds, [ savedTag.id ]); + tag.tagIds = [ savedTag.id ]; - tag.save(); - savedTag.reload(); + assert.deepEqual(tag.tags.models[0].attrs, savedTag.attrs); + assert.deepEqual(tag.tagIds, [ savedTag.id ]); - assert.equal(savedTag.tags.models.length, 0, 'the inverse was not set'); - }); + tag.save(); + savedTag.reload(); - test(`a ${state} can clear its association via a null childIds`, function(assert) { - let [ tag ] = this.helper[state](); + assert.equal(savedTag.tags.models.length, 0, 'the inverse was not set'); + }); - tag.tagIds = null; + test(`a ${state} can clear its association via a null childIds`, function(assert) { + let [ tag ] = this.helper[state](); - assert.deepEqual(tag.tags.models, []); - assert.deepEqual(tag.tagIds, []); + tag.tagIds = null; - tag.save(); - }); + assert.deepEqual(tag.tags.models, []); + assert.deepEqual(tag.tagIds, []); + tag.save(); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/association-set-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/association-set-test.js index 27a694902..8955cbed9 100644 --- a/tests/integration/orm/has-many/6-one-way-reflexive/association-set-test.js +++ b/tests/integration/orm/has-many/6-one-way-reflexive/association-set-test.js @@ -1,66 +1,63 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | One-Way Reflexive | association #set', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Has Many | One-Way Reflexive | association #set', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ tag ] = this.helper[state](); - let savedTag = this.helper.savedChild(); + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - tag.tags = [ savedTag ]; + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ tag ] = this.helper[state](); + let savedTag = this.helper.savedChild(); - assert.ok(tag.tags.includes(savedTag)); - assert.equal(tag.tagIds[0], savedTag.id); - assert.notOk(savedTag.tags.includes(tag), 'the inverse was not set'); + tag.tags = [ savedTag ]; - tag.save(); - }); + assert.ok(tag.tags.includes(savedTag)); + assert.equal(tag.tagIds[0], savedTag.id); + assert.notOk(savedTag.tags.includes(tag), 'the inverse was not set'); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ tag ] = this.helper[state](); - let newTag = this.helper.newChild(); + tag.save(); + }); - tag.tags = [ newTag ]; + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ tag ] = this.helper[state](); + let newTag = this.helper.newChild(); - assert.ok(tag.tags.includes(newTag)); - assert.equal(tag.tagIds[0], undefined); - assert.notOk(newTag.tags.includes(tag), 'the inverse was not set'); + tag.tags = [ newTag ]; - tag.save(); - }); + assert.ok(tag.tags.includes(newTag)); + assert.equal(tag.tagIds[0], undefined); + assert.notOk(newTag.tags.includes(tag), 'the inverse was not set'); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag ] = this.helper[state](); + tag.save(); + }); - tag.tags = [ ]; + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag ] = this.helper[state](); - assert.deepEqual(tag.tagIds, [ ]); - assert.equal(tag.tags.models.length, 0); + tag.tags = [ ]; - tag.save(); - }); + assert.deepEqual(tag.tagIds, [ ]); + assert.equal(tag.tags.models.length, 0); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag ] = this.helper[state](); + tag.save(); + }); - tag.tags = null; + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag ] = this.helper[state](); - assert.deepEqual(tag.tagIds, [ ]); - assert.equal(tag.tags.models.length, 0); + tag.tags = null; - tag.save(); - }); + assert.deepEqual(tag.tagIds, [ ]); + assert.equal(tag.tags.models.length, 0); + tag.save(); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/create-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/create-test.js index 81485d6f1..1d0360863 100644 --- a/tests/integration/orm/has-many/6-one-way-reflexive/create-test.js +++ b/tests/integration/orm/has-many/6-one-way-reflexive/create-test.js @@ -2,94 +2,91 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | One-Way Reflexive | create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); +module('Integration | ORM | Has Many | One-Way Reflexive | create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + }); + + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + tagIds: [ tagA.id ] }); - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - tagIds: [ tagA.id ] - }); - - tagA.reload(); - - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagA.tagIds, [ ], 'the inverse was not set'); - assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ], 'the ids were persisted'); - assert.deepEqual(tagB.tags.models[0].attrs, tagA.attrs); - assert.equal(this.helper.db.tags.length, 2); - assert.deepEqual(this.helper.db.tags[0], { id: '1', tagIds: null }); - assert.deepEqual(this.helper.db.tags[1], { id: '2', tagIds: [ '1' ] }); + tagA.reload(); + + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagA.tagIds, [ ], 'the inverse was not set'); + assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ], 'the ids were persisted'); + assert.deepEqual(tagB.tags.models[0].attrs, tagA.attrs); + assert.equal(this.helper.db.tags.length, 2); + assert.deepEqual(this.helper.db.tags[0], { id: '1', tagIds: null }); + assert.deepEqual(this.helper.db.tags[1], { id: '2', tagIds: [ '1' ] }); + }); + + test('it sets up associations correctly when passing in an array of models', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + tags: [ tagA ] }); - test('it sets up associations correctly when passing in an array of models', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - tags: [ tagA ] - }); + tagA.reload(); - tagA.reload(); + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagA.tagIds, [ ], 'the inverse was not set'); + assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ], 'the ids were persisted'); + assert.deepEqual(tagA.attrs.tagIds, null, 'the inverse was not set'); + assert.equal(this.helper.db.tags.length, 2); + }); - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagA.tagIds, [ ], 'the inverse was not set'); - assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ], 'the ids were persisted'); - assert.deepEqual(tagA.attrs.tagIds, null, 'the inverse was not set'); - assert.equal(this.helper.db.tags.length, 2); + test('it sets up associations correctly when passing in a collection', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + tags: schema.tags.all() }); - test('it sets up associations correctly when passing in a collection', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - tags: schema.tags.all() - }); - - tagA.reload(); + tagA.reload(); - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagA.tagIds, [ ], 'the inverse was not set'); - assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ]); - assert.deepEqual(tagA.attrs.tagIds, null, 'the inverse was not set'); - assert.equal(this.helper.db.tags.length, 2); - }); + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagA.tagIds, [ ], 'the inverse was not set'); + assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ]); + assert.deepEqual(tagA.attrs.tagIds, null, 'the inverse was not set'); + assert.equal(this.helper.db.tags.length, 2); + }); - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.tags.create({ - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); + assert.throws(function() { + schema.tags.create({ + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); + }); - test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.tags.create({ - foos: [ schema.create('foo') ] - }); - }, /you haven't defined that key as an association on your model/); - }); + assert.throws(function() { + schema.tags.create({ + foos: [ schema.create('foo') ] + }); + }, /you haven't defined that key as an association on your model/); + }); - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.foos.create(); - schema.foos.create(); + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.foos.create(); + schema.foos.create(); - assert.throws(function() { - schema.tags.create({ - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); - } -); + assert.throws(function() { + schema.tags.create({ + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); +}); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/delete-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/delete-test.js index a6e2cd2e3..fbd7a9968 100644 --- a/tests/integration/orm/has-many/6-one-way-reflexive/delete-test.js +++ b/tests/integration/orm/has-many/6-one-way-reflexive/delete-test.js @@ -1,27 +1,24 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | One-Way Reflexive | delete', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { +module('Integration | ORM | Has Many | One-Way Reflexive | delete', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ tag, tags ] = this.helper[state](); + states.forEach((state) => { - if (tags && tags.length) { - tags.forEach(t => t.destroy()); - tag.reload(); - } + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ tag, tags ] = this.helper[state](); - assert.equal(tag.tags.length, 0); - assert.equal(tag.tagIds.length, 0); - }); + if (tags && tags.length) { + tags.forEach(t => t.destroy()); + tag.reload(); + } + assert.equal(tag.tags.length, 0); + assert.equal(tag.tagIds.length, 0); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/new-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/new-test.js index 4df044cbe..ada65b6e9 100644 --- a/tests/integration/orm/has-many/6-one-way-reflexive/new-test.js +++ b/tests/integration/orm/has-many/6-one-way-reflexive/new-test.js @@ -1,84 +1,81 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | One-Way Reflexive | new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module('Integration | ORM | Has Many | One-Way Reflexive | new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the parent accepts a saved child id', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ + tagIds: [ tagA.id ] }); - test('the parent accepts a saved child id', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ - tagIds: [ tagA.id ] - }); + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagB.tags.models[0], tagA); + }); - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagB.tags.models[0], tagA); - }); + test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.tags.new({ tagIds: [ 2 ] }); + }, /You're instantiating a tag that has a tagIds of 2, but some of those records don't exist in the database/); + }); - test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.tags.new({ tagIds: [ 2 ] }); - }, /You're instantiating a tag that has a tagIds of 2, but some of those records don't exist in the database/); - }); + test('the parent accepts null children foreign key', function(assert) { + let tag = this.schema.tags.new({ tagIds: null }); - test('the parent accepts null children foreign key', function(assert) { - let tag = this.schema.tags.new({ tagIds: null }); + assert.equal(tag.tags.models.length, 0); + assert.deepEqual(tag.tagIds, []); + assert.deepEqual(tag.attrs, { tagIds: null }); + }); - assert.equal(tag.tags.models.length, 0); - assert.deepEqual(tag.tagIds, []); - assert.deepEqual(tag.attrs, { tagIds: null }); - }); + test('the parent accepts saved children', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ tags: [ tagA ] }); - test('the parent accepts saved children', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ tags: [ tagA ] }); - - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagB.tags.models[0], tagA); - }); + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagB.tags.models[0], tagA); + }); - test('the parent accepts new children', function(assert) { - let tagA = this.schema.tags.new({ color: 'Red' }); - let tagB = this.schema.tags.new({ tags: [ tagA ] }); + test('the parent accepts new children', function(assert) { + let tagA = this.schema.tags.new({ color: 'Red' }); + let tagB = this.schema.tags.new({ tags: [ tagA ] }); - assert.deepEqual(tagB.tagIds, [ undefined ]); - assert.deepEqual(tagB.tags.models[0], tagA); - }); + assert.deepEqual(tagB.tagIds, [ undefined ]); + assert.deepEqual(tagB.tags.models[0], tagA); + }); - test('the parent accepts null children', function(assert) { - let tag = this.schema.tags.new({ tags: null }); + test('the parent accepts null children', function(assert) { + let tag = this.schema.tags.new({ tags: null }); - assert.equal(tag.tags.models.length, 0); - assert.deepEqual(tag.tagIds, []); - assert.deepEqual(tag.attrs, { tagIds: null }); - }); + assert.equal(tag.tags.models.length, 0); + assert.deepEqual(tag.tagIds, []); + assert.deepEqual(tag.attrs, { tagIds: null }); + }); - test('the parent accepts children and child ids', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ tags: [ tagA ], tagIds: [ tagA.id ] }); + test('the parent accepts children and child ids', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ tags: [ tagA ], tagIds: [ tagA.id ] }); - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagB.tags.models[0], tagA); - }); + assert.deepEqual(tagB.tagIds, [ tagA.id ]); + assert.deepEqual(tagB.tags.models[0], tagA); + }); - test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let tag = this.schema.tags.new({}); + test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let tag = this.schema.tags.new({}); - assert.deepEqual(tag.tagIds, []); - assert.deepEqual(tag.tags.models, []); - assert.deepEqual(tag.attrs, { tagIds: null }); - }); + assert.deepEqual(tag.tagIds, []); + assert.deepEqual(tag.tags.models, []); + assert.deepEqual(tag.attrs, { tagIds: null }); + }); - test('the parent accepts no reference to children or child ids', function(assert) { - let tag = this.schema.tags.new(); + test('the parent accepts no reference to children or child ids', function(assert) { + let tag = this.schema.tags.new(); - assert.deepEqual(tag.tagIds, []); - assert.deepEqual(tag.tags.models, []); - assert.deepEqual(tag.attrs, { tagIds: null }); - }); - } -); + assert.deepEqual(tag.tagIds, []); + assert.deepEqual(tag.tags.models, []); + assert.deepEqual(tag.attrs, { tagIds: null }); + }); +}); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/accessor-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/accessor-test.js index 81eae07ea..0fa0ac9a9 100644 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/accessor-test.js +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/accessor-test.js @@ -1,30 +1,27 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named One-Way Reflexive | accessor', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); +module('Integration | ORM | Has Many | Named One-Way Reflexive | accessor', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ tag, tags ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ tag, tags ] = this.helper[state](); - assert.equal(tag.labels.models.length, tags.length, 'the parent has the correct number of children'); - assert.equal(tag.labelIds.length, tags.length, 'the parent has the correct number of children ids'); + assert.equal(tag.labels.models.length, tags.length, 'the parent has the correct number of children'); + assert.equal(tag.labelIds.length, tags.length, 'the parent has the correct number of children ids'); - tags.forEach((t, i) => { - assert.deepEqual(tag.labels.models[i], t, 'each child is in parent.children array'); + tags.forEach((t, i) => { + assert.deepEqual(tag.labels.models[i], t, 'each child is in parent.children array'); - if (t.isSaved()) { - assert.ok(tag.labelIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); - } - }); + if (t.isSaved()) { + assert.ok(tag.labelIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); + } }); - }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-create-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-create-test.js index 3e3e0af44..e9fff42b4 100644 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-create-test.js +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-create-test.js @@ -1,32 +1,29 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named One-Way Reflexive | association #create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Has Many | Named One-Way Reflexive | association #create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can create an associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.labels.models.length; + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { - let orangeTag = tag.createLabel({ name: 'Orange' }); + test(`a ${state} can create an associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.labels.models.length; - assert.ok(orangeTag.id, 'the child was persisted'); - assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.labels.includes(orangeTag), 'the model was added to tag.labels'); - assert.ok(tag.labelIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); - assert.ok(tag.attrs.labelIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); - assert.notOk(orangeTag.labels.includes(tag), 'the inverse was not set'); - }); + let orangeTag = tag.createLabel({ name: 'Orange' }); + assert.ok(orangeTag.id, 'the child was persisted'); + assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.labels.includes(orangeTag), 'the model was added to tag.labels'); + assert.ok(tag.labelIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); + assert.ok(tag.attrs.labelIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); + assert.notOk(orangeTag.labels.includes(tag), 'the inverse was not set'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-new-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-new-test.js index 990fe9f4e..67733eb24 100644 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-new-test.js +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-new-test.js @@ -1,38 +1,35 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named One-Way Reflexive | association #new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ +module('Integration | ORM | Has Many | Named One-Way Reflexive | association #new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + /* + The model can make a new unsaved belongs-to association, for all states + */ - test(`a ${state} can build a new associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.labels.models.length; + states.forEach((state) => { - let blueTag = tag.newLabel({ name: 'Blue' }); + test(`a ${state} can build a new associated child`, function(assert) { + let [ tag ] = this.helper[state](); + let initialCount = tag.labels.models.length; - assert.ok(!blueTag.id, 'the child was not persisted'); - assert.equal(tag.labels.models.length, initialCount + 1); - assert.equal(blueTag.labels.models.length, 0, 'the inverse was not set'); + let blueTag = tag.newLabel({ name: 'Blue' }); - blueTag.save(); + assert.ok(!blueTag.id, 'the child was not persisted'); + assert.equal(tag.labels.models.length, initialCount + 1); + assert.equal(blueTag.labels.models.length, 0, 'the inverse was not set'); - assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', labelIds: [ ] }, 'the child was persisted'); - assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.labels.includes(blueTag), 'the model was added to tag.labels'); - assert.ok(tag.labelIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); - assert.notOk(blueTag.labels.includes(tag), 'the inverse was not set'); - }); + blueTag.save(); + assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', labelIds: [ ] }, 'the child was persisted'); + assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(tag.labels.includes(blueTag), 'the model was added to tag.labels'); + assert.ok(tag.labelIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); + assert.notOk(blueTag.labels.includes(tag), 'the inverse was not set'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-ids-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-ids-test.js index 6fbd71fae..d207dca42 100644 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-ids-test.js +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-ids-test.js @@ -1,41 +1,38 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named One-Way Reflexive | association #setIds', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { +module('Integration | ORM | Has Many | Named One-Way Reflexive | association #setIds', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { - let [ tag ] = this.helper[state](); - let savedTag = this.helper.savedChild(); + states.forEach((state) => { - tag.labelIds = [ savedTag.id ]; + test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { + let [ tag ] = this.helper[state](); + let savedTag = this.helper.savedChild(); - assert.deepEqual(tag.labels.models[0].attrs, savedTag.attrs); - assert.deepEqual(tag.labelIds, [ savedTag.id ]); + tag.labelIds = [ savedTag.id ]; - tag.save(); - savedTag.reload(); + assert.deepEqual(tag.labels.models[0].attrs, savedTag.attrs); + assert.deepEqual(tag.labelIds, [ savedTag.id ]); - assert.equal(savedTag.labels.models.length, 0, 'the inverse was not set'); - }); + tag.save(); + savedTag.reload(); - test(`a ${state} can clear its association via a null childIds`, function(assert) { - let [ tag ] = this.helper[state](); + assert.equal(savedTag.labels.models.length, 0, 'the inverse was not set'); + }); - tag.labelIds = null; + test(`a ${state} can clear its association via a null childIds`, function(assert) { + let [ tag ] = this.helper[state](); - assert.deepEqual(tag.labels.models, []); - assert.deepEqual(tag.labelIds, []); + tag.labelIds = null; - tag.save(); - }); + assert.deepEqual(tag.labels.models, []); + assert.deepEqual(tag.labelIds, []); + tag.save(); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-test.js index 807073112..6fa110d3a 100644 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-test.js +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-test.js @@ -1,66 +1,63 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named One-Way Reflexive | association #set', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Has Many | Named One-Way Reflexive | association #set', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ tag ] = this.helper[state](); - let savedTag = this.helper.savedChild(); + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - tag.labels = [ savedTag ]; + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ tag ] = this.helper[state](); + let savedTag = this.helper.savedChild(); - assert.ok(tag.labels.includes(savedTag)); - assert.equal(tag.labelIds[0], savedTag.id); - assert.notOk(savedTag.labels.includes(tag), 'the inverse was not set'); + tag.labels = [ savedTag ]; - tag.save(); - }); + assert.ok(tag.labels.includes(savedTag)); + assert.equal(tag.labelIds[0], savedTag.id); + assert.notOk(savedTag.labels.includes(tag), 'the inverse was not set'); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ tag ] = this.helper[state](); - let newTag = this.helper.newChild(); + tag.save(); + }); - tag.labels = [ newTag ]; + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ tag ] = this.helper[state](); + let newTag = this.helper.newChild(); - assert.ok(tag.labels.includes(newTag)); - assert.equal(tag.labelIds[0], undefined); - assert.notOk(newTag.labels.includes(tag), 'the inverse was not set'); + tag.labels = [ newTag ]; - tag.save(); - }); + assert.ok(tag.labels.includes(newTag)); + assert.equal(tag.labelIds[0], undefined); + assert.notOk(newTag.labels.includes(tag), 'the inverse was not set'); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag ] = this.helper[state](); + tag.save(); + }); - tag.labels = [ ]; + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag ] = this.helper[state](); - assert.deepEqual(tag.labelIds, [ ]); - assert.equal(tag.labels.models.length, 0); + tag.labels = [ ]; - tag.save(); - }); + assert.deepEqual(tag.labelIds, [ ]); + assert.equal(tag.labels.models.length, 0); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag ] = this.helper[state](); + tag.save(); + }); - tag.labels = null; + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ tag ] = this.helper[state](); - assert.deepEqual(tag.labelIds, [ ]); - assert.equal(tag.labels.models.length, 0); + tag.labels = null; - tag.save(); - }); + assert.deepEqual(tag.labelIds, [ ]); + assert.equal(tag.labels.models.length, 0); + tag.save(); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/create-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/create-test.js index f9e5c919b..84f92e013 100644 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/create-test.js +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/create-test.js @@ -2,94 +2,91 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named One-Way Reflexive | create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); +module('Integration | ORM | Has Many | Named One-Way Reflexive | create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + }); + + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labelIds: [ tagA.id ] }); - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labelIds: [ tagA.id ] - }); - - tagA.reload(); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.labelIds, [ ], 'the inverse was not set'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the ids were persisted'); - assert.deepEqual(tagB.labels.models[0].attrs, tagA.attrs); - assert.equal(this.helper.db.tags.length, 2); - assert.deepEqual(this.helper.db.tags[0], { id: '1', labelIds: null }); - assert.deepEqual(this.helper.db.tags[1], { id: '2', labelIds: [ '1' ] }); + tagA.reload(); + + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.labelIds, [ ], 'the inverse was not set'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the ids were persisted'); + assert.deepEqual(tagB.labels.models[0].attrs, tagA.attrs); + assert.equal(this.helper.db.tags.length, 2); + assert.deepEqual(this.helper.db.tags[0], { id: '1', labelIds: null }); + assert.deepEqual(this.helper.db.tags[1], { id: '2', labelIds: [ '1' ] }); + }); + + test('it sets up associations correctly when passing in an array of models', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labels: [ tagA ] }); - test('it sets up associations correctly when passing in an array of models', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labels: [ tagA ] - }); + tagA.reload(); - tagA.reload(); + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.labelIds, [ ], 'the inverse was not set'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the ids were persisted'); + assert.deepEqual(tagA.attrs.labelIds, null, 'the inverse was not set'); + assert.equal(this.helper.db.tags.length, 2); + }); - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.labelIds, [ ], 'the inverse was not set'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the ids were persisted'); - assert.deepEqual(tagA.attrs.labelIds, null, 'the inverse was not set'); - assert.equal(this.helper.db.tags.length, 2); + test('it sets up associations correctly when passing in a collection', function(assert) { + let { schema } = this.helper; + let tagA = schema.tags.create(); + let tagB = schema.tags.create({ + labels: schema.tags.all() }); - test('it sets up associations correctly when passing in a collection', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labels: schema.tags.all() - }); - - tagA.reload(); + tagA.reload(); - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.labelIds, [ ], 'the inverse was not set'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.attrs.labelIds, null, 'the inverse was not set'); - assert.equal(this.helper.db.tags.length, 2); - }); + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.labelIds, [ ], 'the inverse was not set'); + assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ]); + assert.deepEqual(tagA.attrs.labelIds, null, 'the inverse was not set'); + assert.equal(this.helper.db.tags.length, 2); + }); - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.tags.create({ - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); + assert.throws(function() { + schema.tags.create({ + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); + }); - test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - assert.throws(function() { - schema.tags.create({ - foos: [ schema.create('foo') ] - }); - }, /you haven't defined that key as an association on your model/); - }); + assert.throws(function() { + schema.tags.create({ + foos: [ schema.create('foo') ] + }); + }, /you haven't defined that key as an association on your model/); + }); - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.foos.create(); - schema.foos.create(); + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.foos.create(); + schema.foos.create(); - assert.throws(function() { - schema.tags.create({ - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); - } -); + assert.throws(function() { + schema.tags.create({ + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); +}); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/delete-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/delete-test.js index 0b434b5e2..267c6b752 100644 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/delete-test.js +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/delete-test.js @@ -1,27 +1,24 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named One-Way Reflexive | delete', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { +module('Integration | ORM | Has Many | Named One-Way Reflexive | delete', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ tag, labels ] = this.helper[state](); + states.forEach((state) => { - if (labels && labels.length) { - labels.forEach(t => t.destroy()); - tag.reload(); - } + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ tag, labels ] = this.helper[state](); - assert.equal(tag.labels.length, 0); - assert.equal(tag.labelIds.length, 0); - }); + if (labels && labels.length) { + labels.forEach(t => t.destroy()); + tag.reload(); + } + assert.equal(tag.labels.length, 0); + assert.equal(tag.labelIds.length, 0); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/new-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/new-test.js index 473583204..0958bec81 100644 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/new-test.js +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/new-test.js @@ -1,84 +1,81 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Named One-Way Reflexive | new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module('Integration | ORM | Has Many | Named One-Way Reflexive | new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the parent accepts a saved child id', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ + labelIds: [ tagA.id ] }); - test('the parent accepts a saved child id', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ - labelIds: [ tagA.id ] - }); + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagB.labels.models[0], tagA); + }); - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagB.labels.models[0], tagA); - }); + test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.tags.new({ labelIds: [ 2 ] }); + }, /You're instantiating a tag that has a labelIds of 2, but some of those records don't exist in the database/); + }); - test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.tags.new({ labelIds: [ 2 ] }); - }, /You're instantiating a tag that has a labelIds of 2, but some of those records don't exist in the database/); - }); + test('the parent accepts null children foreign key', function(assert) { + let tag = this.schema.tags.new({ labelIds: null }); - test('the parent accepts null children foreign key', function(assert) { - let tag = this.schema.tags.new({ labelIds: null }); + assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.attrs, { labelIds: null }); + }); - assert.equal(tag.labels.models.length, 0); - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.attrs, { labelIds: null }); - }); + test('the parent accepts saved children', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ labels: [ tagA ] }); - test('the parent accepts saved children', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ labels: [ tagA ] }); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagB.labels.models[0], tagA); - }); + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagB.labels.models[0], tagA); + }); - test('the parent accepts new children', function(assert) { - let tagA = this.schema.tags.new({ color: 'Red' }); - let tagB = this.schema.tags.new({ labels: [ tagA ] }); + test('the parent accepts new children', function(assert) { + let tagA = this.schema.tags.new({ color: 'Red' }); + let tagB = this.schema.tags.new({ labels: [ tagA ] }); - assert.deepEqual(tagB.labelIds, [ undefined ]); - assert.deepEqual(tagB.labels.models[0], tagA); - }); + assert.deepEqual(tagB.labelIds, [ undefined ]); + assert.deepEqual(tagB.labels.models[0], tagA); + }); - test('the parent accepts null children', function(assert) { - let tag = this.schema.tags.new({ labels: null }); + test('the parent accepts null children', function(assert) { + let tag = this.schema.tags.new({ labels: null }); - assert.equal(tag.labels.models.length, 0); - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.attrs, { labelIds: null }); - }); + assert.equal(tag.labels.models.length, 0); + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.attrs, { labelIds: null }); + }); - test('the parent accepts children and child ids', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ labels: [ tagA ], labelIds: [ tagA.id ] }); + test('the parent accepts children and child ids', function(assert) { + let tagA = this.helper.savedChild(); + let tagB = this.schema.tags.new({ labels: [ tagA ], labelIds: [ tagA.id ] }); - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagB.labels.models[0], tagA); - }); + assert.deepEqual(tagB.labelIds, [ tagA.id ]); + assert.deepEqual(tagB.labels.models[0], tagA); + }); - test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let tag = this.schema.tags.new({}); + test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let tag = this.schema.tags.new({}); - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.labels.models, []); - assert.deepEqual(tag.attrs, { labelIds: null }); - }); + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.labels.models, []); + assert.deepEqual(tag.attrs, { labelIds: null }); + }); - test('the parent accepts no reference to children or child ids', function(assert) { - let tag = this.schema.tags.new(); + test('the parent accepts no reference to children or child ids', function(assert) { + let tag = this.schema.tags.new(); - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.labels.models, []); - assert.deepEqual(tag.attrs, { labelIds: null }); - }); - } -); + assert.deepEqual(tag.labelIds, []); + assert.deepEqual(tag.labels.models, []); + assert.deepEqual(tag.attrs, { labelIds: null }); + }); +}); diff --git a/tests/integration/orm/has-many/8-many-to-many/accessor-test.js b/tests/integration/orm/has-many/8-many-to-many/accessor-test.js index b40de1b10..092ab7d41 100644 --- a/tests/integration/orm/has-many/8-many-to-many/accessor-test.js +++ b/tests/integration/orm/has-many/8-many-to-many/accessor-test.js @@ -1,33 +1,30 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Many to Many | accessor', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); +module('Integration | ORM | Has Many | Many to Many | accessor', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ order, products ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ order, products ] = this.helper[state](); - assert.equal(order.products.models.length, products.length, 'the parent has the correct number of children'); - assert.equal(order.productIds.length, products.length, 'the parent has the correct number of children ids'); + assert.equal(order.products.models.length, products.length, 'the parent has the correct number of children'); + assert.equal(order.productIds.length, products.length, 'the parent has the correct number of children ids'); - products.forEach((p, i) => { - assert.deepEqual(order.products.models[i], p, 'each child is in parent.children array'); + products.forEach((p, i) => { + assert.deepEqual(order.products.models[i], p, 'each child is in parent.children array'); - if (p.isSaved()) { - assert.ok(order.productIds.indexOf(p.id) > -1, 'each saved child id is in parent.childrenIds array'); - } + if (p.isSaved()) { + assert.ok(order.productIds.indexOf(p.id) > -1, 'each saved child id is in parent.childrenIds array'); + } - // Check the inverse - assert.ok(p.orders.includes(order)); - }); + // Check the inverse + assert.ok(p.orders.includes(order)); }); - }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/8-many-to-many/association-create-test.js b/tests/integration/orm/has-many/8-many-to-many/association-create-test.js index 6d06568cb..7cffd3fcd 100644 --- a/tests/integration/orm/has-many/8-many-to-many/association-create-test.js +++ b/tests/integration/orm/has-many/8-many-to-many/association-create-test.js @@ -1,32 +1,29 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Many to Many | association #create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Has Many | Many to Many | association #create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can create an associated child`, function(assert) { - let [ order ] = this.helper[state](); - let initialCount = order.products.models.length; + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { - let orangeProduct = order.createProduct({ name: 'Orange' }); + test(`a ${state} can create an associated child`, function(assert) { + let [ order ] = this.helper[state](); + let initialCount = order.products.models.length; - assert.ok(orangeProduct.id, 'the child was persisted'); - assert.equal(order.products.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(order.products.includes(orangeProduct), 'the model was added to order.products'); - assert.ok(order.productIds.indexOf(orangeProduct.id) > -1, 'the id was added to the fks array'); - assert.ok(order.attrs.productIds.indexOf(orangeProduct.id) > -1, 'fks were persisted'); - assert.ok(orangeProduct.orders.includes(order), 'the inverse was set'); - }); + let orangeProduct = order.createProduct({ name: 'Orange' }); + assert.ok(orangeProduct.id, 'the child was persisted'); + assert.equal(order.products.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(order.products.includes(orangeProduct), 'the model was added to order.products'); + assert.ok(order.productIds.indexOf(orangeProduct.id) > -1, 'the id was added to the fks array'); + assert.ok(order.attrs.productIds.indexOf(orangeProduct.id) > -1, 'fks were persisted'); + assert.ok(orangeProduct.orders.includes(order), 'the inverse was set'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/8-many-to-many/association-new-test.js b/tests/integration/orm/has-many/8-many-to-many/association-new-test.js index fbf971d51..12ffd4f32 100644 --- a/tests/integration/orm/has-many/8-many-to-many/association-new-test.js +++ b/tests/integration/orm/has-many/8-many-to-many/association-new-test.js @@ -1,38 +1,35 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Many to Many | association #new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ +module('Integration | ORM | Has Many | Many to Many | association #new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + /* + The model can make a new unsaved belongs-to association, for all states + */ - test(`a ${state} can build a new associated child`, function(assert) { - let [ order ] = this.helper[state](); - let initialCount = order.products.models.length; + states.forEach((state) => { - let blueProduct = order.newProduct({ name: 'Blue' }); + test(`a ${state} can build a new associated child`, function(assert) { + let [ order ] = this.helper[state](); + let initialCount = order.products.models.length; - assert.ok(!blueProduct.id, 'the child was not persisted'); - assert.equal(order.products.models.length, initialCount + 1); - assert.equal(blueProduct.orders.models.length, 1, 'the inverse was set'); + let blueProduct = order.newProduct({ name: 'Blue' }); - blueProduct.save(); + assert.ok(!blueProduct.id, 'the child was not persisted'); + assert.equal(order.products.models.length, initialCount + 1); + assert.equal(blueProduct.orders.models.length, 1, 'the inverse was set'); - assert.deepEqual(blueProduct.attrs, { id: blueProduct.id, name: 'Blue', orderIds: [ order.id ] }, 'the child was persisted'); - assert.equal(order.products.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(order.products.includes(blueProduct), 'the model was added to order.products'); - assert.ok(order.productIds.indexOf(blueProduct.id) > -1, 'the id was added to the fks array'); - assert.ok(blueProduct.orders.includes(order), 'the inverse was set'); - }); + blueProduct.save(); + assert.deepEqual(blueProduct.attrs, { id: blueProduct.id, name: 'Blue', orderIds: [ order.id ] }, 'the child was persisted'); + assert.equal(order.products.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(order.products.includes(blueProduct), 'the model was added to order.products'); + assert.ok(order.productIds.indexOf(blueProduct.id) > -1, 'the id was added to the fks array'); + assert.ok(blueProduct.orders.includes(order), 'the inverse was set'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/8-many-to-many/association-set-ids-test.js b/tests/integration/orm/has-many/8-many-to-many/association-set-ids-test.js index 97b00cc18..a81ac6254 100644 --- a/tests/integration/orm/has-many/8-many-to-many/association-set-ids-test.js +++ b/tests/integration/orm/has-many/8-many-to-many/association-set-ids-test.js @@ -1,52 +1,49 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Many to Many | association #setIds', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); +module('Integration | ORM | Has Many | Many to Many | association #setIds', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + states.forEach((state) => { - test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { - let [ order, originalProducts ] = this.helper[state](); - let savedProduct = this.helper.savedChild(); + test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { + let [ order, originalProducts ] = this.helper[state](); + let savedProduct = this.helper.savedChild(); - order.productIds = [ savedProduct.id ]; + order.productIds = [ savedProduct.id ]; - assert.deepEqual(order.products.models[0].attrs, savedProduct.attrs); - assert.deepEqual(order.productIds, [ savedProduct.id ]); + assert.deepEqual(order.products.models[0].attrs, savedProduct.attrs); + assert.deepEqual(order.productIds, [ savedProduct.id ]); - order.save(); - savedProduct.reload(); + order.save(); + savedProduct.reload(); - assert.deepEqual(savedProduct.orders.models[0].attrs, order.attrs, 'the inverse was set'); - originalProducts.forEach(p => { - if (p.isSaved()) { - p.reload(); - assert.notOk(p.orders.includes(order), 'old inverses were cleared'); - } - }); + assert.deepEqual(savedProduct.orders.models[0].attrs, order.attrs, 'the inverse was set'); + originalProducts.forEach(p => { + if (p.isSaved()) { + p.reload(); + assert.notOk(p.orders.includes(order), 'old inverses were cleared'); + } }); + }); - test(`a ${state} can clear its association via a null childIds`, function(assert) { - let [ order, originalProducts ] = this.helper[state](); + test(`a ${state} can clear its association via a null childIds`, function(assert) { + let [ order, originalProducts ] = this.helper[state](); - order.productIds = null; + order.productIds = null; - assert.deepEqual(order.products.models, []); - assert.deepEqual(order.productIds, []); + assert.deepEqual(order.products.models, []); + assert.deepEqual(order.productIds, []); - order.save(); + order.save(); - originalProducts.forEach(p => { - p.reload(); - assert.notOk(p.orders.includes(order), 'old inverses were cleared'); - }); + originalProducts.forEach(p => { + p.reload(); + assert.notOk(p.orders.includes(order), 'old inverses were cleared'); }); - }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/8-many-to-many/association-set-test.js b/tests/integration/orm/has-many/8-many-to-many/association-set-test.js index 8a8b8340b..5344530ea 100644 --- a/tests/integration/orm/has-many/8-many-to-many/association-set-test.js +++ b/tests/integration/orm/has-many/8-many-to-many/association-set-test.js @@ -1,85 +1,82 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | Many to Many | association #set', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); +module('Integration | ORM | Has Many | Many to Many | association #set', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ order, originalProducts ] = this.helper[state](); - let savedProduct = this.helper.savedChild(); + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ order, originalProducts ] = this.helper[state](); + let savedProduct = this.helper.savedChild(); - order.products = [ savedProduct ]; + order.products = [ savedProduct ]; - assert.ok(order.products.includes(savedProduct)); - assert.equal(order.productIds[0], savedProduct.id); - assert.ok(savedProduct.orders.includes(order), 'the inverse was set'); + assert.ok(order.products.includes(savedProduct)); + assert.equal(order.productIds[0], savedProduct.id); + assert.ok(savedProduct.orders.includes(order), 'the inverse was set'); - order.save(); + order.save(); - originalProducts.forEach(p => { - p.reload(); - assert.notOk(p.orders.includes(order), 'old inverses were cleared'); - }); + originalProducts.forEach(p => { + p.reload(); + assert.notOk(p.orders.includes(order), 'old inverses were cleared'); }); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ order, originalProducts ] = this.helper[state](); - let newProduct = this.helper.newChild(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ order, originalProducts ] = this.helper[state](); + let newProduct = this.helper.newChild(); - order.products = [ newProduct ]; + order.products = [ newProduct ]; - assert.ok(order.products.includes(newProduct)); - assert.equal(order.productIds[0], undefined); - assert.ok(newProduct.orders.includes(order), 'the inverse was set'); + assert.ok(order.products.includes(newProduct)); + assert.equal(order.productIds[0], undefined); + assert.ok(newProduct.orders.includes(order), 'the inverse was set'); - order.save(); + order.save(); - originalProducts.forEach(p => { - p.reload(); - assert.notOk(p.orders.includes(order), 'old inverses were cleared'); - }); + originalProducts.forEach(p => { + p.reload(); + assert.notOk(p.orders.includes(order), 'old inverses were cleared'); }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ order, originalProducts ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ order, originalProducts ] = this.helper[state](); - order.products = [ ]; + order.products = [ ]; - assert.deepEqual(order.productIds, [ ]); - assert.equal(order.products.models.length, 0); + assert.deepEqual(order.productIds, [ ]); + assert.equal(order.products.models.length, 0); - order.save(); - originalProducts.forEach(p => { - p.reload(); - assert.notOk(p.orders.includes(order), 'old inverses were cleared'); - }); + order.save(); + originalProducts.forEach(p => { + p.reload(); + assert.notOk(p.orders.includes(order), 'old inverses were cleared'); }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ order, originalProducts ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ order, originalProducts ] = this.helper[state](); - order.products = null; + order.products = null; - assert.deepEqual(order.productIds, [ ]); - assert.equal(order.products.models.length, 0); + assert.deepEqual(order.productIds, [ ]); + assert.equal(order.products.models.length, 0); - order.save(); + order.save(); - originalProducts.forEach(p => { - p.reload(); - assert.notOk(p.orders.includes(order), 'old inverses were cleared'); - }); + originalProducts.forEach(p => { + p.reload(); + assert.notOk(p.orders.includes(order), 'old inverses were cleared'); }); - }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/accessor-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/accessor-test.js index 431a4c470..7076d2ad2 100644 --- a/tests/integration/orm/has-many/9-one-way-polymorphic/accessor-test.js +++ b/tests/integration/orm/has-many/9-one-way-polymorphic/accessor-test.js @@ -1,33 +1,30 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | One-way Polymorphic | accessor', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); +module('Integration | ORM | Has Many | One-way Polymorphic | accessor', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { - test(`the references of a ${state} are correct`, function(assert) { - let [ user, posts ] = this.helper[state](); + test(`the references of a ${state} are correct`, function(assert) { + let [ user, posts ] = this.helper[state](); - assert.equal(user.things.models.length, posts.length, 'the parent has the correct number of children'); - assert.equal(user.thingIds.length, posts.length, 'the parent has the correct number of children ids'); + assert.equal(user.things.models.length, posts.length, 'the parent has the correct number of children'); + assert.equal(user.thingIds.length, posts.length, 'the parent has the correct number of children ids'); - posts.forEach((post, i) => { - assert.ok(user.things.includes(post), 'each child is in parent.children array'); + posts.forEach((post, i) => { + assert.ok(user.things.includes(post), 'each child is in parent.children array'); - if (post.isSaved()) { - assert.deepEqual(user.thingIds[i], { type: 'post', id: post.id }, 'each saved child id is in parent.childrenIds array'); - } - }); + if (post.isSaved()) { + assert.deepEqual(user.thingIds[i], { type: 'post', id: post.id }, 'each saved child id is in parent.childrenIds array'); + } }); - }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/association-create-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/association-create-test.js index 67a82d9cf..c38564673 100644 --- a/tests/integration/orm/has-many/9-one-way-polymorphic/association-create-test.js +++ b/tests/integration/orm/has-many/9-one-way-polymorphic/association-create-test.js @@ -1,35 +1,32 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | One-way Polymorphic | association #create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Has Many | One-way Polymorphic | association #create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.things.models.length; + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { - let post = user.createThing('post', { title: 'Lorem ipsum' }); + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.things.models.length; - assert.ok(post.id, 'the child was persisted'); - assert.equal(user.things.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.things.includes(post), 'the model was added to user.posts'); - assert.ok(user.thingIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'the id was added to the fks array'); - assert.ok(user.attrs.thingIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'fks were persisted'); - }); + let post = user.createThing('post', { title: 'Lorem ipsum' }); + assert.ok(post.id, 'the child was persisted'); + assert.equal(user.things.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.things.includes(post), 'the model was added to user.posts'); + assert.ok(user.thingIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'the id was added to the fks array'); + assert.ok(user.attrs.thingIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'fks were persisted'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/association-new-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/association-new-test.js index efb7ee9f7..5c8974d32 100644 --- a/tests/integration/orm/has-many/9-one-way-polymorphic/association-new-test.js +++ b/tests/integration/orm/has-many/9-one-way-polymorphic/association-new-test.js @@ -1,38 +1,35 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | One-way Polymorphic | association #new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ +module('Integration | ORM | Has Many | One-way Polymorphic | association #new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + /* + The model can make a new unsaved belongs-to association, for all states + */ - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.things.models.length; + states.forEach((state) => { - let post = user.newThing('post', { title: 'Lorem ipsum' }); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.things.models.length; - assert.ok(!post.id, 'the child was not persisted'); - assert.equal(user.things.models.length, initialCount + 1); + let post = user.newThing('post', { title: 'Lorem ipsum' }); - post.save(); + assert.ok(!post.id, 'the child was not persisted'); + assert.equal(user.things.models.length, initialCount + 1); - assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum' }, 'the child was persisted'); - assert.equal(user.things.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.things.includes(post), 'the model was added to user.things'); - assert.ok(user.thingIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'the id was added to the fks array'); - }); + post.save(); + assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum' }, 'the child was persisted'); + assert.equal(user.things.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.things.includes(post), 'the model was added to user.things'); + assert.ok(user.thingIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'the id was added to the fks array'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-ids-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-ids-test.js index befa80b0b..bcbe821c1 100644 --- a/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-ids-test.js +++ b/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-ids-test.js @@ -1,37 +1,34 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | One-way Polymorphic | association #setIds', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Has Many | One-way Polymorphic | association #setIds', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user ] = this.helper[state](); - let savedPost = this.helper.savedChild(); + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - user.thingIds = [ { type: 'post', id: savedPost.id } ]; + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user ] = this.helper[state](); + let savedPost = this.helper.savedChild(); - assert.ok(user.things.includes(savedPost)); - assert.ok(user.thingIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); - }); + user.thingIds = [ { type: 'post', id: savedPost.id } ]; - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ user ] = this.helper[state](); + assert.ok(user.things.includes(savedPost)); + assert.ok(user.thingIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); + }); - user.thingIds = null; + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ user ] = this.helper[state](); - assert.deepEqual(user.things.models, []); - assert.deepEqual(user.thingIds, []); - }); + user.thingIds = null; + assert.deepEqual(user.things.models, []); + assert.deepEqual(user.thingIds, []); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-test.js index 4312ecc29..f1f1e191f 100644 --- a/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-test.js +++ b/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-test.js @@ -1,56 +1,53 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | One-way Polymorphic | association #set', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Has Many | One-way Polymorphic | association #set', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ user ] = this.helper[state](); - let savedPost = this.helper.savedChild(); + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - user.things = [ savedPost ]; + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ user ] = this.helper[state](); + let savedPost = this.helper.savedChild(); - assert.ok(user.things.models.includes(savedPost)); - assert.ok(user.thingIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); - }); + user.things = [ savedPost ]; - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user ] = this.helper[state](); - let newPost = this.helper.newChild(); + assert.ok(user.things.models.includes(savedPost)); + assert.ok(user.thingIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); + }); - user.things = [ newPost ]; + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user ] = this.helper[state](); + let newPost = this.helper.newChild(); - assert.deepEqual(user.thingIds, [ { type: 'post', id: undefined } ]); - assert.deepEqual(user.things.models[0], newPost); - }); + user.things = [ newPost ]; - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user ] = this.helper[state](); + assert.deepEqual(user.thingIds, [ { type: 'post', id: undefined } ]); + assert.deepEqual(user.things.models[0], newPost); + }); - user.things = [ ]; + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user ] = this.helper[state](); - assert.deepEqual(user.thingIds, [ ]); - assert.equal(user.things.models.length, 0); - }); + user.things = [ ]; - test(`a ${state} can clear its association via null`, function(assert) { - let [ user ] = this.helper[state](); + assert.deepEqual(user.thingIds, [ ]); + assert.equal(user.things.models.length, 0); + }); - user.things = null; + test(`a ${state} can clear its association via null`, function(assert) { + let [ user ] = this.helper[state](); - assert.deepEqual(user.thingIds, [ ]); - assert.equal(user.things.models.length, 0); - }); + user.things = null; + assert.deepEqual(user.thingIds, [ ]); + assert.equal(user.things.models.length, 0); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/create-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/create-test.js index 5c5848ae2..edd75a259 100644 --- a/tests/integration/orm/has-many/9-one-way-polymorphic/create-test.js +++ b/tests/integration/orm/has-many/9-one-way-polymorphic/create-test.js @@ -2,89 +2,86 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | One-way Polymorphic | create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - thingIds: [ { type: 'post', id: post.id } ] - }); +module('Integration | ORM | Has Many | One-way Polymorphic | create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + }); - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); - assert.deepEqual(user.things.models[0].attrs, post.attrs); - assert.equal(this.helper.db.posts.length, 1); - assert.deepEqual(this.helper.db.posts[0], { id: '1' }); - assert.equal(this.helper.db.users.length, 1); - assert.deepEqual(this.helper.db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + thingIds: [ { type: 'post', id: post.id } ] }); - test('it sets up associations correctly when passing in an array of models', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - things: [ post ] - }); + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); + assert.deepEqual(user.things.models[0].attrs, post.attrs); + assert.equal(this.helper.db.posts.length, 1); + assert.deepEqual(this.helper.db.posts[0], { id: '1' }); + assert.equal(this.helper.db.users.length, 1); + assert.deepEqual(this.helper.db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); + }); - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); - assert.ok(user.things.includes(post)); - assert.equal(this.helper.db.posts.length, 1); - assert.deepEqual(this.helper.db.posts[0], { id: '1' }); - assert.equal(this.helper.db.users.length, 1); - assert.deepEqual(this.helper.db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); + test('it sets up associations correctly when passing in an array of models', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + things: [ post ] }); - test('it sets up associations correctly when passing in a collection', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - things: this.helper.schema.posts.all() - }); + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); + assert.ok(user.things.includes(post)); + assert.equal(this.helper.db.posts.length, 1); + assert.deepEqual(this.helper.db.posts[0], { id: '1' }); + assert.equal(this.helper.db.users.length, 1); + assert.deepEqual(this.helper.db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); + }); - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); - assert.ok(user.things.includes(post)); - assert.equal(this.helper.db.posts.length, 1); - assert.deepEqual(this.helper.db.posts[0], { id: '1' }); - assert.equal(this.helper.db.users.length, 1); - assert.deepEqual(this.helper.db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); + test('it sets up associations correctly when passing in a collection', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + things: this.helper.schema.posts.all() }); - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); + assert.ok(user.things.includes(post)); + assert.equal(this.helper.db.posts.length, 1); + assert.deepEqual(this.helper.db.posts[0], { id: '1' }); + assert.equal(this.helper.db.users.length, 1); + assert.deepEqual(this.helper.db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); + }); - assert.throws(function() { - schema.create('user', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); + test('it throws an error if a model is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; - test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; + assert.throws(function() { + schema.create('user', { + foo: schema.create('foo') + }); + }, /you haven't defined that key as an association on your model/); + }); - assert.throws(function() { - schema.create('user', { - foos: [ schema.create('foo') ] - }); - }, /you haven't defined that key as an association on your model/); - }); + test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + + assert.throws(function() { + schema.create('user', { + foos: [ schema.create('foo') ] + }); + }, /you haven't defined that key as an association on your model/); + }); - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); + test('it throws an error if a collection is passed in without a defined relationship', function(assert) { + let { schema } = this.helper; + schema.create('foo'); + schema.create('foo'); - assert.throws(function() { - schema.create('user', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); - } -); + assert.throws(function() { + schema.create('user', { + foos: schema.foos.all() + }); + }, /you haven't defined that key as an association on your model/); + }); +}); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/delete-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/delete-test.js index 9794aef42..986baa699 100644 --- a/tests/integration/orm/has-many/9-one-way-polymorphic/delete-test.js +++ b/tests/integration/orm/has-many/9-one-way-polymorphic/delete-test.js @@ -1,27 +1,24 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | One-way Polymorphic | delete', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { +module('Integration | ORM | Has Many | One-way Polymorphic | delete', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ user, posts ] = this.helper[state](); + states.forEach((state) => { - if (posts && posts.length) { - posts.forEach(p => p.destroy()); - user.reload(); - } + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ user, posts ] = this.helper[state](); - assert.equal(user.things.length, 0); - assert.equal(user.thingIds.length, 0); - }); + if (posts && posts.length) { + posts.forEach(p => p.destroy()); + user.reload(); + } + assert.equal(user.things.length, 0); + assert.equal(user.thingIds.length, 0); }); - } -); + + }); +}); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/instantiating-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/instantiating-test.js index 8f1536978..abbe5efd1 100644 --- a/tests/integration/orm/has-many/9-one-way-polymorphic/instantiating-test.js +++ b/tests/integration/orm/has-many/9-one-way-polymorphic/instantiating-test.js @@ -1,84 +1,81 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Has Many | One-way Polymorphic | instantiating', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module('Integration | ORM | Has Many | One-way Polymorphic | instantiating', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the parent accepts a saved child id', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ + thingIds: [ { type: 'post', id: post.id } ] }); - test('the parent accepts a saved child id', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ - thingIds: [ { type: 'post', id: post.id } ] - }); + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.ok(user.things.includes(post)); + }); - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.ok(user.things.includes(post)); - }); + test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ thingIds: [ { type: 'post', id: 2 } ] }); + }, /You're instantiating a user that has a thingIds of post:2, but some of those records don't exist in the database/); + }); - test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ thingIds: [ { type: 'post', id: 2 } ] }); - }, /You're instantiating a user that has a thingIds of post:2, but some of those records don't exist in the database/); - }); + test('the parent accepts null children foreign key', function(assert) { + let user = this.schema.users.new({ thingIds: null }); - test('the parent accepts null children foreign key', function(assert) { - let user = this.schema.users.new({ thingIds: null }); + assert.equal(user.things.models.length, 0); + assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.attrs, { thingIds: null }); + }); - assert.equal(user.things.models.length, 0); - assert.deepEqual(user.thingIds, []); - assert.deepEqual(user.attrs, { thingIds: null }); - }); + test('the parent accepts saved children', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ things: [ post ] }); - test('the parent accepts saved children', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ things: [ post ] }); - - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.ok(user.things.includes(post)); - }); + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.ok(user.things.includes(post)); + }); - test('the parent accepts new children', function(assert) { - let post = this.schema.posts.new({ title: 'Lorem' }); - let user = this.schema.users.new({ things: [ post ] }); + test('the parent accepts new children', function(assert) { + let post = this.schema.posts.new({ title: 'Lorem' }); + let user = this.schema.users.new({ things: [ post ] }); - assert.deepEqual(user.thingIds, [ { type: 'post', id: undefined } ]); - assert.ok(user.things.includes(post)); - }); + assert.deepEqual(user.thingIds, [ { type: 'post', id: undefined } ]); + assert.ok(user.things.includes(post)); + }); - test('the parent accepts null children', function(assert) { - let user = this.schema.users.new({ things: null }); + test('the parent accepts null children', function(assert) { + let user = this.schema.users.new({ things: null }); - assert.equal(user.things.models.length, 0); - assert.deepEqual(user.thingIds, []); - assert.deepEqual(user.attrs, { thingIds: null }); - }); + assert.equal(user.things.models.length, 0); + assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.attrs, { thingIds: null }); + }); - test('the parent accepts children and child ids', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ things: [ post ], thingIds: [ { type: 'post', id: post.id } ] }); + test('the parent accepts children and child ids', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ things: [ post ], thingIds: [ { type: 'post', id: post.id } ] }); - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.ok(user.things.includes(post)); - }); + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.ok(user.things.includes(post)); + }); - test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let user = this.schema.users.new({}); + test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let user = this.schema.users.new({}); - assert.deepEqual(user.thingIds, []); - assert.deepEqual(user.things.models, []); - assert.deepEqual(user.attrs, { thingIds: null }); - }); + assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.things.models, []); + assert.deepEqual(user.attrs, { thingIds: null }); + }); - test('the parent accepts no reference to children or child ids', function(assert) { - let user = this.schema.users.new(); + test('the parent accepts no reference to children or child ids', function(assert) { + let user = this.schema.users.new(); - assert.deepEqual(user.thingIds, []); - assert.deepEqual(user.things.models, []); - assert.deepEqual(user.attrs, { thingIds: null }); - }); - } -); + assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.things.models, []); + assert.deepEqual(user.attrs, { thingIds: null }); + }); +}); diff --git a/tests/integration/orm/mixed/1-one-to-many/association-create-test.js b/tests/integration/orm/mixed/1-one-to-many/association-create-test.js index 09879c083..1ab67369a 100644 --- a/tests/integration/orm/mixed/1-one-to-many/association-create-test.js +++ b/tests/integration/orm/mixed/1-one-to-many/association-create-test.js @@ -1,35 +1,32 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Mixed | One To Many | association #create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Mixed | One To Many | association #create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.posts.models.length; + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { - let post = user.createPost({ title: 'Lorem ipsum' }); + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.posts.models.length; - assert.ok(post.id, 'the child was persisted'); - assert.equal(user.posts.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.posts.includes(post), 'the model was added to user.posts'); - assert.ok(user.postIds.indexOf(post.id) > -1, 'the id was added to the fks array'); - assert.ok(user.attrs.postIds.indexOf(post.id) > -1, 'fks were persisted'); + let post = user.createPost({ title: 'Lorem ipsum' }); - // Check the inverse - assert.deepEqual(post.user.attrs, user.attrs); - assert.deepEqual(post.userId, user.id); - }); + assert.ok(post.id, 'the child was persisted'); + assert.equal(user.posts.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.posts.includes(post), 'the model was added to user.posts'); + assert.ok(user.postIds.indexOf(post.id) > -1, 'the id was added to the fks array'); + assert.ok(user.attrs.postIds.indexOf(post.id) > -1, 'fks were persisted'); + // Check the inverse + assert.deepEqual(post.user.attrs, user.attrs); + assert.deepEqual(post.userId, user.id); }); - } -); + + }); +}); diff --git a/tests/integration/orm/mixed/1-one-to-many/association-new-test.js b/tests/integration/orm/mixed/1-one-to-many/association-new-test.js index 4b01049d9..a578e1a3c 100644 --- a/tests/integration/orm/mixed/1-one-to-many/association-new-test.js +++ b/tests/integration/orm/mixed/1-one-to-many/association-new-test.js @@ -1,36 +1,33 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Mixed | One To Many | association #new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ +module('Integration | ORM | Mixed | One To Many | association #new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + /* + The model can make a new unsaved belongs-to association, for all states + */ - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.posts.models.length; + states.forEach((state) => { - let post = user.newPost({ title: 'Lorem ipsum' }); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.posts.models.length; - assert.ok(!post.id, 'the child was not persisted'); - assert.equal(user.posts.models.length, initialCount + 1); + let post = user.newPost({ title: 'Lorem ipsum' }); - post.save(); + assert.ok(!post.id, 'the child was not persisted'); + assert.equal(user.posts.models.length, initialCount + 1); - assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum', userId: user.id }, 'the child was persisted'); - assert.equal(user.posts.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.posts.includes(post), 'the model was added to user.posts'); - assert.ok(user.postIds.indexOf(post.id) > -1, 'the id was added to the fks array'); - }); + post.save(); + assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum', userId: user.id }, 'the child was persisted'); + assert.equal(user.posts.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.posts.includes(post), 'the model was added to user.posts'); + assert.ok(user.postIds.indexOf(post.id) > -1, 'the id was added to the fks array'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/mixed/1-one-to-many/association-set-ids-test.js b/tests/integration/orm/mixed/1-one-to-many/association-set-ids-test.js index bf98ea4ab..1853485ac 100644 --- a/tests/integration/orm/mixed/1-one-to-many/association-set-ids-test.js +++ b/tests/integration/orm/mixed/1-one-to-many/association-set-ids-test.js @@ -1,62 +1,59 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Mixed | One To Many | association #setIds', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let savedPost = this.helper.savedChild(); - - user.postIds = [ savedPost.id ]; - - assert.ok(user.posts.includes(savedPost)); - assert.deepEqual(user.postIds, [ savedPost.id ]); - - user.save(); - savedPost.reload(); - - // Check the inverse - assert.deepEqual(savedPost.user.attrs, user.attrs); - assert.equal(savedPost.userId, user.id); - - // Check old associates - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); +module('Integration | ORM | Mixed | One To Many | association #setIds', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); + + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let savedPost = this.helper.savedChild(); + + user.postIds = [ savedPost.id ]; + + assert.ok(user.posts.includes(savedPost)); + assert.deepEqual(user.postIds, [ savedPost.id ]); + + user.save(); + savedPost.reload(); + + // Check the inverse + assert.deepEqual(savedPost.user.attrs, user.attrs); + assert.equal(savedPost.userId, user.id); + + // Check old associates + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } }); + }); - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); - user.postIds = null; + user.postIds = null; - assert.deepEqual(user.posts.models, []); - assert.deepEqual(user.postIds, []); + assert.deepEqual(user.posts.models, []); + assert.deepEqual(user.postIds, []); - user.save(); + user.save(); - // Check old associates - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); + // Check old associates + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } }); - }); - } -); + + }); +}); diff --git a/tests/integration/orm/mixed/1-one-to-many/association-set-test.js b/tests/integration/orm/mixed/1-one-to-many/association-set-test.js index 34446bbed..3502dca4b 100644 --- a/tests/integration/orm/mixed/1-one-to-many/association-set-test.js +++ b/tests/integration/orm/mixed/1-one-to-many/association-set-test.js @@ -1,92 +1,89 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Mixed | One To Many | association #set', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); +module('Integration | ORM | Mixed | One To Many | association #set', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let savedPost = this.helper.savedChild(); + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let savedPost = this.helper.savedChild(); - user.posts = [ savedPost ]; + user.posts = [ savedPost ]; - assert.ok(user.posts.includes(savedPost)); - assert.ok(user.postIds.indexOf(savedPost.id) > -1); + assert.ok(user.posts.includes(savedPost)); + assert.ok(user.postIds.indexOf(savedPost.id) > -1); - user.save(); + user.save(); - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } }); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let newPost = this.helper.newChild(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let newPost = this.helper.newChild(); - user.posts = [ newPost ]; + user.posts = [ newPost ]; - assert.deepEqual(user.postIds, [ undefined ]); - assert.ok(user.posts.includes(newPost)); + assert.deepEqual(user.postIds, [ undefined ]); + assert.ok(user.posts.includes(newPost)); - user.save(); + user.save(); - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); - user.posts = [ ]; + user.posts = [ ]; - assert.deepEqual(user.postIds, [ ]); - assert.equal(user.posts.models.length, 0); + assert.deepEqual(user.postIds, [ ]); + assert.equal(user.posts.models.length, 0); - user.save(); + user.save(); - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); - user.posts = null; + user.posts = null; - assert.deepEqual(user.postIds, [ ]); - assert.equal(user.posts.models.length, 0); + assert.deepEqual(user.postIds, [ ]); + assert.equal(user.posts.models.length, 0); - user.save(); + user.save(); - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } }); - }); - } -); + + }); +}); diff --git a/tests/integration/orm/mixed/1-one-to-many/instantiating-test.js b/tests/integration/orm/mixed/1-one-to-many/instantiating-test.js index 7913dd2e4..ce4276f9c 100644 --- a/tests/integration/orm/mixed/1-one-to-many/instantiating-test.js +++ b/tests/integration/orm/mixed/1-one-to-many/instantiating-test.js @@ -1,84 +1,81 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Mixed | One To Many | instantiating', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module('Integration | ORM | Mixed | One To Many | instantiating', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the parent accepts a saved child id', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ + postIds: [ post.id ] }); - test('the parent accepts a saved child id', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ - postIds: [ post.id ] - }); + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.posts.models[0], post); + }); - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.posts.models[0], post); - }); + test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ postIds: [ 2 ] }); + }, /You're instantiating a user that has a postIds of 2, but some of those records don't exist in the database/); + }); - test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ postIds: [ 2 ] }); - }, /You're instantiating a user that has a postIds of 2, but some of those records don't exist in the database/); - }); + test('the parent accepts null children foreign key', function(assert) { + let user = this.schema.users.new({ postIds: null }); - test('the parent accepts null children foreign key', function(assert) { - let user = this.schema.users.new({ postIds: null }); + assert.equal(user.posts.models.length, 0); + assert.deepEqual(user.postIds, []); + assert.deepEqual(user.attrs, { postIds: null }); + }); - assert.equal(user.posts.models.length, 0); - assert.deepEqual(user.postIds, []); - assert.deepEqual(user.attrs, { postIds: null }); - }); + test('the parent accepts saved children', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ posts: [ post ] }); - test('the parent accepts saved children', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ posts: [ post ] }); - - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.posts.models[0], post); - }); + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.posts.models[0], post); + }); - test('the parent accepts new children', function(assert) { - let post = this.schema.posts.new({ title: 'Lorem' }); - let user = this.schema.users.new({ posts: [ post ] }); + test('the parent accepts new children', function(assert) { + let post = this.schema.posts.new({ title: 'Lorem' }); + let user = this.schema.users.new({ posts: [ post ] }); - assert.deepEqual(user.postIds, [ undefined ]); - assert.deepEqual(user.posts.models[0], post); - }); + assert.deepEqual(user.postIds, [ undefined ]); + assert.deepEqual(user.posts.models[0], post); + }); - test('the parent accepts null children', function(assert) { - let user = this.schema.users.new({ posts: null }); + test('the parent accepts null children', function(assert) { + let user = this.schema.users.new({ posts: null }); - assert.equal(user.posts.models.length, 0); - assert.deepEqual(user.postIds, []); - assert.deepEqual(user.attrs, { postIds: null }); - }); + assert.equal(user.posts.models.length, 0); + assert.deepEqual(user.postIds, []); + assert.deepEqual(user.attrs, { postIds: null }); + }); - test('the parent accepts children and child ids', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ posts: [ post ], postIds: [ post.id ] }); + test('the parent accepts children and child ids', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ posts: [ post ], postIds: [ post.id ] }); - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.posts.models[0], post); - }); + assert.deepEqual(user.postIds, [ post.id ]); + assert.deepEqual(user.posts.models[0], post); + }); - test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let user = this.schema.users.new({}); + test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let user = this.schema.users.new({}); - assert.deepEqual(user.postIds, []); - assert.deepEqual(user.posts.models, []); - assert.deepEqual(user.attrs, { postIds: null }); - }); + assert.deepEqual(user.postIds, []); + assert.deepEqual(user.posts.models, []); + assert.deepEqual(user.attrs, { postIds: null }); + }); - test('the parent accepts no reference to children or child ids', function(assert) { - let user = this.schema.users.new(); + test('the parent accepts no reference to children or child ids', function(assert) { + let user = this.schema.users.new(); - assert.deepEqual(user.postIds, []); - assert.deepEqual(user.posts.models, []); - assert.deepEqual(user.attrs, { postIds: null }); - }); - } -); + assert.deepEqual(user.postIds, []); + assert.deepEqual(user.posts.models, []); + assert.deepEqual(user.attrs, { postIds: null }); + }); +}); diff --git a/tests/integration/orm/mixed/2-many-to-one/association-create-test.js b/tests/integration/orm/mixed/2-many-to-one/association-create-test.js index 89d3ebf77..df8fe2177 100644 --- a/tests/integration/orm/mixed/2-many-to-one/association-create-test.js +++ b/tests/integration/orm/mixed/2-many-to-one/association-create-test.js @@ -1,37 +1,34 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Mixed | Many To One | association #create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Mixed | Many To One | association #create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can create an associated parent`, function(assert) { - let [ post, originalUser ] = this.helper[state](); + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { - let user = post.createUser({ name: 'Zelda' }); + test(`a ${state} can create an associated parent`, function(assert) { + let [ post, originalUser ] = this.helper[state](); - assert.ok(user.id, 'the parent was persisted'); - assert.deepEqual(post.user.attrs, user.attrs); - assert.equal(post.userId, user.id); + let user = post.createUser({ name: 'Zelda' }); - // Check the inverse - assert.ok(user.posts.includes(post), 'the inverse was set'); + assert.ok(user.id, 'the parent was persisted'); + assert.deepEqual(post.user.attrs, user.attrs); + assert.equal(post.userId, user.id); - // Ensure old inverse was cleared - if (originalUser && originalUser.isSaved()) { - originalUser.reload(); - assert.notOk(originalUser.posts.includes(post)); - } - }); + // Check the inverse + assert.ok(user.posts.includes(post), 'the inverse was set'); + // Ensure old inverse was cleared + if (originalUser && originalUser.isSaved()) { + originalUser.reload(); + assert.notOk(originalUser.posts.includes(post)); + } }); - } -); + + }); +}); diff --git a/tests/integration/orm/mixed/2-many-to-one/association-new-test.js b/tests/integration/orm/mixed/2-many-to-one/association-new-test.js index c46293b81..891705dcc 100644 --- a/tests/integration/orm/mixed/2-many-to-one/association-new-test.js +++ b/tests/integration/orm/mixed/2-many-to-one/association-new-test.js @@ -1,45 +1,42 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Mixed | Many To One | association #new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ +module('Integration | ORM | Mixed | Many To One | association #new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + /* + The model can make a new unsaved belongs-to association, for all states + */ - test(`a ${state} can build a new associated parent`, function(assert) { - let [ post, originalUser ] = this.helper[state](); + states.forEach((state) => { - let user = post.newUser({ name: 'Zelda' }); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ post, originalUser ] = this.helper[state](); - assert.ok(!user.id, 'the child was not persisted'); - assert.deepEqual(post.user, user, 'the relationship was set'); - assert.ok(user.posts.includes(post), 'the inverse was set'); + let user = post.newUser({ name: 'Zelda' }); - user.save(); - post.reload(); + assert.ok(!user.id, 'the child was not persisted'); + assert.deepEqual(post.user, user, 'the relationship was set'); + assert.ok(user.posts.includes(post), 'the inverse was set'); - assert.ok(user.id, 'the parent was persisted'); - assert.deepEqual(post.user.attrs, user.attrs); - assert.equal(post.userId, user.id); + user.save(); + post.reload(); - // Check the inverse - assert.ok(user.posts.includes(post), 'the inverse was set'); + assert.ok(user.id, 'the parent was persisted'); + assert.deepEqual(post.user.attrs, user.attrs); + assert.equal(post.userId, user.id); - // Ensure old inverse was cleared - if (originalUser && originalUser.isSaved()) { - originalUser.reload(); - assert.notOk(originalUser.posts.includes(post)); - } - }); + // Check the inverse + assert.ok(user.posts.includes(post), 'the inverse was set'); + // Ensure old inverse was cleared + if (originalUser && originalUser.isSaved()) { + originalUser.reload(); + assert.notOk(originalUser.posts.includes(post)); + } }); - } -); + + }); +}); diff --git a/tests/integration/orm/mixed/2-many-to-one/association-set-ids-test.js b/tests/integration/orm/mixed/2-many-to-one/association-set-ids-test.js index 0ea712efc..3d56b504e 100644 --- a/tests/integration/orm/mixed/2-many-to-one/association-set-ids-test.js +++ b/tests/integration/orm/mixed/2-many-to-one/association-set-ids-test.js @@ -1,57 +1,54 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Mixed | Many To One | association #setIds', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Mixed | Many To One | association #setIds', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ post, originalUser ] = this.helper[state](); - let user = this.helper.savedParent(); + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { - post.userId = user.id; + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ post, originalUser ] = this.helper[state](); + let user = this.helper.savedParent(); - assert.equal(post.userId, user.id); - assert.deepEqual(post.user.attrs, user.attrs); + post.userId = user.id; - assert.ok(post.user.posts.includes(post), 'the inverse was set'); + assert.equal(post.userId, user.id); + assert.deepEqual(post.user.attrs, user.attrs); - post.save(); - user.reload(); + assert.ok(post.user.posts.includes(post), 'the inverse was set'); - assert.ok(user.posts.includes(post)); + post.save(); + user.reload(); - // Old inverses were cleared - if (originalUser && originalUser.isSaved()) { - originalUser.reload(); - assert.notOk(originalUser.posts.includes(post)); - } - }); + assert.ok(user.posts.includes(post)); - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ post, originalUser ] = this.helper[state](); + // Old inverses were cleared + if (originalUser && originalUser.isSaved()) { + originalUser.reload(); + assert.notOk(originalUser.posts.includes(post)); + } + }); - post.userId = null; + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ post, originalUser ] = this.helper[state](); - assert.deepEqual(post.user, null); - assert.deepEqual(post.userId, null); + post.userId = null; - post.save(); + assert.deepEqual(post.user, null); + assert.deepEqual(post.userId, null); - if (originalUser && originalUser.isSaved()) { - originalUser.reload(); - assert.notOk(originalUser.posts.includes(post)); - } - }); + post.save(); + if (originalUser && originalUser.isSaved()) { + originalUser.reload(); + assert.notOk(originalUser.posts.includes(post)); + } }); - } -); + + }); +}); diff --git a/tests/integration/orm/mixed/2-many-to-one/association-set-test.js b/tests/integration/orm/mixed/2-many-to-one/association-set-test.js index fe4596ea3..4cd92aa0c 100644 --- a/tests/integration/orm/mixed/2-many-to-one/association-set-test.js +++ b/tests/integration/orm/mixed/2-many-to-one/association-set-test.js @@ -1,70 +1,67 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Mixed | Many To One | association #set', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Mixed | Many To One | association #set', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ post, originalUser ] = this.helper[state](); - let savedUser = this.helper.savedParent(); + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - post.user = savedUser; + test(`a ${state} can update its association to a saved parent`, function(assert) { + let [ post, originalUser ] = this.helper[state](); + let savedUser = this.helper.savedParent(); - assert.deepEqual(post.user, savedUser); - assert.ok(savedUser.posts.includes(post), 'the inverse was set'); + post.user = savedUser; - post.save(); + assert.deepEqual(post.user, savedUser); + assert.ok(savedUser.posts.includes(post), 'the inverse was set'); - // Old inverse was cleared - if (originalUser && originalUser.isSaved()) { - originalUser.reload(); - assert.notOk(originalUser.posts.includes(post)); - } - }); + post.save(); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ post, originalUser ] = this.helper[state](); - let newUser = this.helper.newParent(); + // Old inverse was cleared + if (originalUser && originalUser.isSaved()) { + originalUser.reload(); + assert.notOk(originalUser.posts.includes(post)); + } + }); - post.user = newUser; + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ post, originalUser ] = this.helper[state](); + let newUser = this.helper.newParent(); - assert.deepEqual(post.user, newUser); - assert.ok(newUser.posts.includes(post), 'the inverse was set'); + post.user = newUser; - post.save(); + assert.deepEqual(post.user, newUser); + assert.ok(newUser.posts.includes(post), 'the inverse was set'); - // Old inverse was cleared - if (originalUser && originalUser.isSaved()) { - originalUser.reload(); - assert.notOk(originalUser.posts.includes(post)); - } - }); + post.save(); - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ post, originalUser ] = this.helper[state](); + // Old inverse was cleared + if (originalUser && originalUser.isSaved()) { + originalUser.reload(); + assert.notOk(originalUser.posts.includes(post)); + } + }); - post.user = null; + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ post, originalUser ] = this.helper[state](); - assert.deepEqual(post.user, null); + post.user = null; - post.save(); + assert.deepEqual(post.user, null); - // Old inverse was cleared - if (originalUser && originalUser.isSaved()) { - originalUser.reload(); - assert.notOk(originalUser.posts.includes(post)); - } - }); + post.save(); + // Old inverse was cleared + if (originalUser && originalUser.isSaved()) { + originalUser.reload(); + assert.notOk(originalUser.posts.includes(post)); + } }); - } -); + + }); +}); diff --git a/tests/integration/orm/mixed/2-many-to-one/instantiating-test.js b/tests/integration/orm/mixed/2-many-to-one/instantiating-test.js index d52c6623e..e956c1dae 100644 --- a/tests/integration/orm/mixed/2-many-to-one/instantiating-test.js +++ b/tests/integration/orm/mixed/2-many-to-one/instantiating-test.js @@ -1,99 +1,96 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Mixed | One To Many | instantiating', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the child accepts a saved parent id', function(assert) { - let user = this.helper.savedParent(); - let post = this.schema.posts.new({ userId: user.id }); - - assert.equal(post.userId, user.id); - assert.deepEqual(post.user.attrs, user.attrs); - assert.deepEqual(post.attrs, { userId: user.id }); - - post.save(); - user.reload(); - - assert.ok(user.posts.includes(post), 'the inverse was set'); - }); - - test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.posts.new({ userId: 2 }); - }, /You're instantiating a post that has a userId of 2, but that record doesn't exist in the database/); - }); - - test('the child accepts a null parent id', function(assert) { - let post = this.schema.posts.new({ userId: null }); - - assert.equal(post.userId, null); - assert.equal(post.user, null); - assert.deepEqual(post.attrs, { userId: null }); - }); - - test('the child accepts a saved parent model', function(assert) { - let user = this.helper.savedParent(); - let post = this.schema.posts.new({ user }); - - assert.equal(post.userId, 1); - assert.deepEqual(post.user.attrs, user.attrs); - assert.deepEqual(post.attrs, { userId: null }); - - post.save(); - user.reload(); - - assert.ok(user.posts.includes(post), 'the inverse was set'); - }); - - test('the child accepts a new parent model', function(assert) { - let user = this.schema.users.new({ age: 300 }); - let post = this.schema.posts.new({ user }); - - assert.equal(post.userId, null); - assert.deepEqual(post.user, user); - assert.deepEqual(post.attrs, { userId: null }); - assert.ok(user.posts.includes(post), 'the inverse was set'); - }); - - test('the child accepts a null parent model', function(assert) { - let post = this.schema.posts.new({ user: null }); - - assert.equal(post.userId, null); - assert.deepEqual(post.user, null); - assert.deepEqual(post.attrs, { userId: null }); - }); - - test('the child accepts a parent model and id', function(assert) { - let user = this.helper.savedParent(); - let post = this.schema.posts.new({ user, userId: user.id }); - - assert.equal(post.userId, '1'); - assert.deepEqual(post.user, user); - assert.deepEqual(post.attrs, { userId: user.id }); - - assert.ok(user.posts.includes(post), 'the inverse was set'); - }); - - test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let post = this.schema.posts.new({}); - - assert.equal(post.userId, null); - assert.deepEqual(post.user, null); - assert.deepEqual(post.attrs, { userId: null }); - }); - - test('the child accepts no reference to a parent id or model', function(assert) { - let post = this.schema.posts.new(); - - assert.equal(post.userId, null); - assert.deepEqual(post.user, null); - assert.deepEqual(post.attrs, { userId: null }); - }); - } -); +module('Integration | ORM | Mixed | One To Many | instantiating', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the child accepts a saved parent id', function(assert) { + let user = this.helper.savedParent(); + let post = this.schema.posts.new({ userId: user.id }); + + assert.equal(post.userId, user.id); + assert.deepEqual(post.user.attrs, user.attrs); + assert.deepEqual(post.attrs, { userId: user.id }); + + post.save(); + user.reload(); + + assert.ok(user.posts.includes(post), 'the inverse was set'); + }); + + test('the child errors if the parent id doesnt exist', function(assert) { + assert.throws(function() { + this.schema.posts.new({ userId: 2 }); + }, /You're instantiating a post that has a userId of 2, but that record doesn't exist in the database/); + }); + + test('the child accepts a null parent id', function(assert) { + let post = this.schema.posts.new({ userId: null }); + + assert.equal(post.userId, null); + assert.equal(post.user, null); + assert.deepEqual(post.attrs, { userId: null }); + }); + + test('the child accepts a saved parent model', function(assert) { + let user = this.helper.savedParent(); + let post = this.schema.posts.new({ user }); + + assert.equal(post.userId, 1); + assert.deepEqual(post.user.attrs, user.attrs); + assert.deepEqual(post.attrs, { userId: null }); + + post.save(); + user.reload(); + + assert.ok(user.posts.includes(post), 'the inverse was set'); + }); + + test('the child accepts a new parent model', function(assert) { + let user = this.schema.users.new({ age: 300 }); + let post = this.schema.posts.new({ user }); + + assert.equal(post.userId, null); + assert.deepEqual(post.user, user); + assert.deepEqual(post.attrs, { userId: null }); + assert.ok(user.posts.includes(post), 'the inverse was set'); + }); + + test('the child accepts a null parent model', function(assert) { + let post = this.schema.posts.new({ user: null }); + + assert.equal(post.userId, null); + assert.deepEqual(post.user, null); + assert.deepEqual(post.attrs, { userId: null }); + }); + + test('the child accepts a parent model and id', function(assert) { + let user = this.helper.savedParent(); + let post = this.schema.posts.new({ user, userId: user.id }); + + assert.equal(post.userId, '1'); + assert.deepEqual(post.user, user); + assert.deepEqual(post.attrs, { userId: user.id }); + + assert.ok(user.posts.includes(post), 'the inverse was set'); + }); + + test('the child accepts no reference to a parent id or model as empty obj', function(assert) { + let post = this.schema.posts.new({}); + + assert.equal(post.userId, null); + assert.deepEqual(post.user, null); + assert.deepEqual(post.attrs, { userId: null }); + }); + + test('the child accepts no reference to a parent id or model', function(assert) { + let post = this.schema.posts.new(); + + assert.equal(post.userId, null); + assert.deepEqual(post.user, null); + assert.deepEqual(post.attrs, { userId: null }); + }); +}); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/accessor-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/accessor-test.js index e95edc43c..a58958e44 100644 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/accessor-test.js +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/accessor-test.js @@ -1,39 +1,36 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Mixed | One To Many Polymorphic | accessor', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ user, posts ] = this.helper[state](); - - assert.equal(user.things.models.length, posts.length, 'the parent has the correct number of children'); - assert.equal(user.thingIds.length, posts.length, 'the parent has the correct number of children ids'); - - posts.forEach((post, i) => { - assert.deepEqual(user.things.models[i], posts[i], 'each child is in parent.children array'); - - if (post.isSaved()) { - assert.ok(user.thingIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'each saved child id is in parent.childrenIds array'); - } - - // Check the inverse - assert.deepEqual(post.user.attrs, user.attrs); - assert.deepEqual(post.userId, user.id); - }); +module('Integration | ORM | Mixed | One To Many Polymorphic | accessor', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); + + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ user, posts ] = this.helper[state](); + + assert.equal(user.things.models.length, posts.length, 'the parent has the correct number of children'); + assert.equal(user.thingIds.length, posts.length, 'the parent has the correct number of children ids'); + + posts.forEach((post, i) => { + assert.deepEqual(user.things.models[i], posts[i], 'each child is in parent.children array'); + + if (post.isSaved()) { + assert.ok(user.thingIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'each saved child id is in parent.childrenIds array'); + } + + // Check the inverse + assert.deepEqual(post.user.attrs, user.attrs); + assert.deepEqual(post.userId, user.id); }); - }); - } -); + + }); +}); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-create-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-create-test.js index 074c32a4a..b93b146ad 100644 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-create-test.js +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-create-test.js @@ -1,39 +1,36 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Mixed | One To Many Polymorphic | association #create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { +module('Integration | ORM | Mixed | One To Many Polymorphic | association #create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.things.models.length; + /* + The model can create a has-many association, for all states + */ + states.forEach((state) => { - let post = user.createThing('post', { title: 'Lorem ipsum' }); + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.things.models.length; - assert.ok(post.id, 'the child was persisted'); - assert.equal(user.things.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.things.includes(post), 'the model was added to user.posts'); - assert.ok(user.thingIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'the id was added to the fks array'); - assert.ok(user.attrs.thingIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'fks were persisted'); + let post = user.createThing('post', { title: 'Lorem ipsum' }); - // Check the inverse - assert.deepEqual(post.user.attrs, user.attrs); - assert.deepEqual(post.userId, user.id); - }); + assert.ok(post.id, 'the child was persisted'); + assert.equal(user.things.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.things.includes(post), 'the model was added to user.posts'); + assert.ok(user.thingIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'the id was added to the fks array'); + assert.ok(user.attrs.thingIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'fks were persisted'); + // Check the inverse + assert.deepEqual(post.user.attrs, user.attrs); + assert.deepEqual(post.userId, user.id); }); - } -); + + }); +}); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-new-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-new-test.js index 531f7d646..7a2435467 100644 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-new-test.js +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-new-test.js @@ -1,38 +1,35 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Mixed | One To Many Polymorphic | association #new', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ +module('Integration | ORM | Mixed | One To Many Polymorphic | association #new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - states.forEach((state) => { + /* + The model can make a new unsaved belongs-to association, for all states + */ - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.things.models.length; + states.forEach((state) => { - let post = user.newThing('post', { title: 'Lorem ipsum' }); + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); + let initialCount = user.things.models.length; - assert.ok(!post.id, 'the child was not persisted'); - assert.equal(user.things.models.length, initialCount + 1); + let post = user.newThing('post', { title: 'Lorem ipsum' }); - post.save(); + assert.ok(!post.id, 'the child was not persisted'); + assert.equal(user.things.models.length, initialCount + 1); - assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum', userId: user.id }, 'the child was persisted'); - assert.equal(user.things.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.things.includes(post), 'the model was added to user.things'); - assert.ok(user.thingIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'the id was added to the fks array'); - }); + post.save(); + assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum', userId: user.id }, 'the child was persisted'); + assert.equal(user.things.models.length, initialCount + 1, 'the collection size was increased'); + assert.ok(user.things.includes(post), 'the model was added to user.things'); + assert.ok(user.thingIds.find(obj => { + return (obj.id === post.id && obj.type === 'post'); + }), 'the id was added to the fks array'); }); - } -); + + }); +}); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-ids-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-ids-test.js index d09b59de4..6153fe2f3 100644 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-ids-test.js +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-ids-test.js @@ -1,62 +1,59 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Mixed | One To Many Polymorphic | association #setIds', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let savedPost = this.helper.savedChild(); - - user.thingIds = [ { type: 'post', id: savedPost.id } ]; - - assert.ok(user.things.includes(savedPost)); - assert.deepEqual(user.thingIds, [ { type: 'post', id: savedPost.id } ]); - - user.save(); - savedPost.reload(); - - // Check the inverse - assert.deepEqual(savedPost.user.attrs, user.attrs); - assert.equal(savedPost.userId, user.id); - - // Check old associates - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); +module('Integration | ORM | Mixed | One To Many Polymorphic | association #setIds', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); + + /* + The model can update its association via parentId, for all states + */ + states.forEach((state) => { + + test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let savedPost = this.helper.savedChild(); + + user.thingIds = [ { type: 'post', id: savedPost.id } ]; + + assert.ok(user.things.includes(savedPost)); + assert.deepEqual(user.thingIds, [ { type: 'post', id: savedPost.id } ]); + + user.save(); + savedPost.reload(); + + // Check the inverse + assert.deepEqual(savedPost.user.attrs, user.attrs); + assert.equal(savedPost.userId, user.id); + + // Check old associates + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } }); + }); - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); - user.thingIds = null; + user.thingIds = null; - assert.deepEqual(user.things.models, []); - assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.things.models, []); + assert.deepEqual(user.thingIds, []); - user.save(); + user.save(); - // Check old associates - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); + // Check old associates + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } }); - }); - } -); + + }); +}); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-test.js index 322216a87..dc5897bf3 100644 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-test.js +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-test.js @@ -1,92 +1,89 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Mixed | One To Many Polymorphic | association #set', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); +module('Integration | ORM | Mixed | One To Many Polymorphic | association #set', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let savedPost = this.helper.savedChild(); + test(`a ${state} can update its association to a list of saved children`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let savedPost = this.helper.savedChild(); - user.things = [ savedPost ]; + user.things = [ savedPost ]; - assert.ok(user.things.includes(savedPost)); - assert.ok(user.thingIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); + assert.ok(user.things.includes(savedPost)); + assert.ok(user.thingIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); - user.save(); + user.save(); - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } }); + }); - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let newPost = this.helper.newChild(); + test(`a ${state} can update its association to a new parent`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); + let newPost = this.helper.newChild(); - user.things = [ newPost ]; + user.things = [ newPost ]; - assert.deepEqual(user.thingIds, [ { type: 'post', id: undefined } ]); - assert.ok(user.things.includes(newPost)); + assert.deepEqual(user.thingIds, [ { type: 'post', id: undefined } ]); + assert.ok(user.things.includes(newPost)); - user.save(); + user.save(); - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); - user.things = [ ]; + user.things = [ ]; - assert.deepEqual(user.thingIds, [ ]); - assert.equal(user.things.models.length, 0); + assert.deepEqual(user.thingIds, [ ]); + assert.equal(user.things.models.length, 0); - user.save(); + user.save(); - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } }); + }); - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); + test(`a ${state} can clear its association via an empty list`, function(assert) { + let [ user, originalPosts ] = this.helper[state](); - user.things = null; + user.things = null; - assert.deepEqual(user.thingIds, [ ]); - assert.equal(user.things.models.length, 0); + assert.deepEqual(user.thingIds, [ ]); + assert.equal(user.things.models.length, 0); - user.save(); + user.save(); - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); + originalPosts.forEach(post => { + if (post.isSaved()) { + post.reload(); + assert.equal(post.user, null); + } }); - }); - } -); + + }); +}); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/create-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/create-test.js index 9caccd993..41d268552 100644 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/create-test.js +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/create-test.js @@ -2,67 +2,64 @@ import Helper from './_helper'; import { Model } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Mixed | One To Many Polymorphic | create', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); +module('Integration | ORM | Mixed | One To Many Polymorphic | create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.helper.schema.registerModel('foo', Model); + }); + + test('it sets up associations correctly when passing in the foreign key', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + thingIds: [ { type: 'post', id: post.id } ] }); + post.reload(); - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - thingIds: [ { type: 'post', id: post.id } ] - }); - post.reload(); + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); + assert.ok(user.things.includes(post)); + assert.deepEqual(post.user.attrs, user.attrs); - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); - assert.ok(user.things.includes(post)); - assert.deepEqual(post.user.attrs, user.attrs); + let { db } = this.helper; + assert.equal(db.posts.length, 1); + assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); + assert.equal(db.users.length, 1); + assert.deepEqual(db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); + }); - let { db } = this.helper; - assert.equal(db.posts.length, 1); - assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); - assert.equal(db.users.length, 1); - assert.deepEqual(db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); + test('it sets up associations correctly when passing in an array of models', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + things: [ post ] }); - test('it sets up associations correctly when passing in an array of models', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - things: [ post ] - }); + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); + assert.ok(user.things.includes(post)); + assert.deepEqual(post.user.attrs, user.attrs); - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); - assert.ok(user.things.includes(post)); - assert.deepEqual(post.user.attrs, user.attrs); + let { db } = this.helper; + assert.equal(db.posts.length, 1); + assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); + assert.equal(db.users.length, 1); + assert.deepEqual(db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); + }); - let { db } = this.helper; - assert.equal(db.posts.length, 1); - assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); - assert.equal(db.users.length, 1); - assert.deepEqual(db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); + test('it sets up associations correctly when passing in a collection', function(assert) { + let post = this.helper.schema.create('post'); + let user = this.helper.schema.create('user', { + things: this.helper.schema.posts.all() }); + post.reload(); - test('it sets up associations correctly when passing in a collection', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - things: this.helper.schema.posts.all() - }); - post.reload(); - - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); - assert.ok(user.things.includes(post)); + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); + assert.ok(user.things.includes(post)); - let { db } = this.helper; - assert.equal(db.posts.length, 1); - assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); - assert.equal(db.users.length, 1); - assert.deepEqual(db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); - }); - } -); + let { db } = this.helper; + assert.equal(db.posts.length, 1); + assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); + assert.equal(db.users.length, 1); + assert.deepEqual(db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); + }); +}); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/delete-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/delete-test.js index add43f760..c92699e5d 100644 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/delete-test.js +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/delete-test.js @@ -1,27 +1,24 @@ import Helper, { states } from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Mixed | One To Many Polymorphic | delete', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { +module('Integration | ORM | Mixed | One To Many Polymorphic | delete', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ user, posts ] = this.helper[state](); + states.forEach((state) => { - if (posts && posts.length) { - posts.forEach(p => p.destroy()); - user.reload(); - } + test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { + let [ user, posts ] = this.helper[state](); - assert.equal(user.things.length, 0); - assert.equal(user.thingIds.length, 0); - }); + if (posts && posts.length) { + posts.forEach(p => p.destroy()); + user.reload(); + } + assert.equal(user.things.length, 0); + assert.equal(user.thingIds.length, 0); }); - } -); + + }); +}); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/instantiating-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/instantiating-test.js index be0f9b7e3..dc0591591 100644 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/instantiating-test.js +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/instantiating-test.js @@ -1,84 +1,81 @@ import Helper from './_helper'; import { module, test } from 'qunit'; -module( - 'Integration | ORM | Mixed | One To Many Polymorphic | instantiating', - function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; +module('Integration | ORM | Mixed | One To Many Polymorphic | instantiating', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + this.schema = this.helper.schema; + }); + + test('the parent accepts a saved child id', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ + thingIds: [ { type: 'post', id: post.id } ] }); - test('the parent accepts a saved child id', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ - thingIds: [ { type: 'post', id: post.id } ] - }); + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.things.models[0], post); + }); - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.things.models[0], post); - }); + test('the parent errors if the children ids don\'t exist', function(assert) { + assert.throws(function() { + this.schema.users.new({ thingIds: [ { type: 'post', id: 2 } ] }); + }, /You're instantiating a user that has a thingIds of post:2, but some of those records don't exist in the database/); + }); - test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ thingIds: [ { type: 'post', id: 2 } ] }); - }, /You're instantiating a user that has a thingIds of post:2, but some of those records don't exist in the database/); - }); + test('the parent accepts null children foreign key', function(assert) { + let user = this.schema.users.new({ thingIds: null }); - test('the parent accepts null children foreign key', function(assert) { - let user = this.schema.users.new({ thingIds: null }); + assert.equal(user.things.models.length, 0); + assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.attrs, { thingIds: null }); + }); - assert.equal(user.things.models.length, 0); - assert.deepEqual(user.thingIds, []); - assert.deepEqual(user.attrs, { thingIds: null }); - }); + test('the parent accepts saved children', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ things: [ post ] }); - test('the parent accepts saved children', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ things: [ post ] }); - - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.things.models[0], post); - }); + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.things.models[0], post); + }); - test('the parent accepts new children', function(assert) { - let post = this.schema.posts.new({ title: 'Lorem' }); - let user = this.schema.users.new({ things: [ post ] }); + test('the parent accepts new children', function(assert) { + let post = this.schema.posts.new({ title: 'Lorem' }); + let user = this.schema.users.new({ things: [ post ] }); - assert.deepEqual(user.thingIds, [ { type: 'post', id: undefined } ]); - assert.deepEqual(user.things.models[0], post); - }); + assert.deepEqual(user.thingIds, [ { type: 'post', id: undefined } ]); + assert.deepEqual(user.things.models[0], post); + }); - test('the parent accepts null children', function(assert) { - let user = this.schema.users.new({ things: null }); + test('the parent accepts null children', function(assert) { + let user = this.schema.users.new({ things: null }); - assert.equal(user.things.models.length, 0); - assert.deepEqual(user.thingIds, []); - assert.deepEqual(user.attrs, { thingIds: null }); - }); + assert.equal(user.things.models.length, 0); + assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.attrs, { thingIds: null }); + }); - test('the parent accepts children and child ids', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ things: [ post ], thingIds: [ { type: 'post', id: post.id } ] }); + test('the parent accepts children and child ids', function(assert) { + let post = this.helper.savedChild(); + let user = this.schema.users.new({ things: [ post ], thingIds: [ { type: 'post', id: post.id } ] }); - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.things.models[0], post); - }); + assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); + assert.deepEqual(user.things.models[0], post); + }); - test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let user = this.schema.users.new({}); + test('the parent accepts no reference to children or child ids as empty obj', function(assert) { + let user = this.schema.users.new({}); - assert.deepEqual(user.thingIds, []); - assert.deepEqual(user.things.models, []); - assert.deepEqual(user.attrs, { thingIds: null }); - }); + assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.things.models, []); + assert.deepEqual(user.attrs, { thingIds: null }); + }); - test('the parent accepts no reference to children or child ids', function(assert) { - let user = this.schema.users.new(); + test('the parent accepts no reference to children or child ids', function(assert) { + let user = this.schema.users.new(); - assert.deepEqual(user.thingIds, []); - assert.deepEqual(user.things.models, []); - assert.deepEqual(user.attrs, { thingIds: null }); - }); - } -); + assert.deepEqual(user.thingIds, []); + assert.deepEqual(user.things.models, []); + assert.deepEqual(user.attrs, { thingIds: null }); + }); +}); diff --git a/tests/integration/serializers/base/associations/embedded-collection-test.js b/tests/integration/serializers/base/associations/embedded-collection-test.js index e6a166236..88d339a37 100644 --- a/tests/integration/serializers/base/associations/embedded-collection-test.js +++ b/tests/integration/serializers/base/associations/embedded-collection-test.js @@ -5,167 +5,164 @@ import Serializer from 'ember-cli-mirage/serializer'; import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { module, test } from 'qunit'; -module( - 'Integration | Serializers | Base | Associations | Embedded Collections', - function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - posts: hasMany('blogPost', { inverse: 'author' }) - }), - blogPost: Model.extend({ - author: belongsTo('wordSmith', { inverse: 'posts' }), - comments: hasMany('fineComment', { inverse: 'post' }) - }), - fineComment: Model.extend({ - post: belongsTo('blogPost') - }) - }); - - let wordSmith = this.schema.wordSmiths.create({ name: 'Link' }); - let blogPost = wordSmith.createPost({ title: 'Lorem' }); - blogPost.createComment({ text: 'pwned' }); - - wordSmith.createPost({ title: 'Ipsum' }); - - this.schema.wordSmiths.create({ name: 'Zelda' }); - - this.BaseSerializer = Serializer.extend({ - embed: true - }); +module('Integration | Serializers | Base | Associations | Embedded Collections', function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + posts: hasMany('blogPost', { inverse: 'author' }) + }), + blogPost: Model.extend({ + author: belongsTo('wordSmith', { inverse: 'posts' }), + comments: hasMany('fineComment', { inverse: 'post' }) + }), + fineComment: Model.extend({ + post: belongsTo('blogPost') + }) }); - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); + let wordSmith = this.schema.wordSmiths.create({ name: 'Link' }); + let blogPost = wordSmith.createPost({ title: 'Lorem' }); + blogPost.createComment({ text: 'pwned' }); - test(`it can embed a collection with a has-many relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }) - }); + wordSmith.createPost({ title: 'Ipsum' }); - let wordSmiths = this.schema.wordSmiths.all(); - let result = registry.serialize(wordSmiths); + this.schema.wordSmiths.create({ name: 'Zelda' }); - assert.deepEqual(result, { - wordSmiths: [ - { - id: '1', - name: 'Link', - posts: [ - { id: '1', title: 'Lorem' }, - { id: '2', title: 'Ipsum' } - ] - }, - { - id: '2', - name: 'Zelda', - posts: [] - } - ] - }); + this.BaseSerializer = Serializer.extend({ + embed: true + }); + }); + + hooks.afterEach(function() { + this.schema.db.emptyData(); + }); + + test(`it can embed a collection with a has-many relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + include: ['posts'] + }) }); - test(`it can embed a collection with a chain of has-many relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['comments'] - }) - }); - - let wordSmiths = this.schema.wordSmiths.all(); - let result = registry.serialize(wordSmiths); - - assert.deepEqual(result, { - wordSmiths: [ - { - id: '1', - name: 'Link', - posts: [ - { - id: '1', - title: 'Lorem', - comments: [ - { id: '1', text: 'pwned' } - ] - }, - { - id: '2', - title: 'Ipsum', - comments: [] - } - ] - }, - { - id: '2', - name: 'Zelda', - posts: [] - } - ] - }); + let wordSmiths = this.schema.wordSmiths.all(); + let result = registry.serialize(wordSmiths); + + assert.deepEqual(result, { + wordSmiths: [ + { + id: '1', + name: 'Link', + posts: [ + { id: '1', title: 'Lorem' }, + { id: '2', title: 'Ipsum' } + ] + }, + { + id: '2', + name: 'Zelda', + posts: [] + } + ] + }); + }); + + test(`it can embed a collection with a chain of has-many relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + include: ['posts'] + }), + blogPost: this.BaseSerializer.extend({ + include: ['comments'] + }) + }); + + let wordSmiths = this.schema.wordSmiths.all(); + let result = registry.serialize(wordSmiths); + + assert.deepEqual(result, { + wordSmiths: [ + { + id: '1', + name: 'Link', + posts: [ + { + id: '1', + title: 'Lorem', + comments: [ + { id: '1', text: 'pwned' } + ] + }, + { + id: '2', + title: 'Ipsum', + comments: [] + } + ] + }, + { + id: '2', + name: 'Zelda', + posts: [] + } + ] + }); + }); + + test(`it can embed a collection with a belongs-to relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + blogPost: this.BaseSerializer.extend({ + include: ['author'] + }) }); - test(`it can embed a collection with a belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); + let blogPosts = this.schema.blogPosts.all(); + let result = registry.serialize(blogPosts); + + assert.deepEqual(result, { + blogPosts: [ + { + id: '1', + title: 'Lorem', + author: { id: '1', name: 'Link' } + }, + { + id: '2', + title: 'Ipsum', + author: { id: '1', name: 'Link' } + } + ] + }); + }); + + test(`it can embed a collection with a chain of belongs-to relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + fineComment: this.BaseSerializer.extend({ + include: ['post'] + }), + blogPost: this.BaseSerializer.extend({ + include: ['author'] + }) + }); - let blogPosts = this.schema.blogPosts.all(); - let result = registry.serialize(blogPosts); + let fineComments = this.schema.fineComments.all(); + let result = registry.serialize(fineComments); - assert.deepEqual(result, { - blogPosts: [ - { + assert.deepEqual(result, { + fineComments: [ + { + id: '1', + text: 'pwned', + post: { id: '1', title: 'Lorem', author: { id: '1', name: 'Link' } - }, - { - id: '2', - title: 'Ipsum', - author: { id: '1', name: 'Link' } - } - ] - }); - }); - - test(`it can embed a collection with a chain of belongs-to relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - fineComment: this.BaseSerializer.extend({ - include: ['post'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let fineComments = this.schema.fineComments.all(); - let result = registry.serialize(fineComments); - - assert.deepEqual(result, { - fineComments: [ - { - id: '1', - text: 'pwned', - post: { - id: '1', - title: 'Lorem', - author: { id: '1', name: 'Link' } - } } - ] - }); + } + ] }); - } -); + }); +}); diff --git a/tests/integration/serializers/base/associations/embedded-model-test.js b/tests/integration/serializers/base/associations/embedded-model-test.js index f14ebe13a..91d07e0ac 100644 --- a/tests/integration/serializers/base/associations/embedded-model-test.js +++ b/tests/integration/serializers/base/associations/embedded-model-test.js @@ -5,197 +5,194 @@ import Serializer from 'ember-cli-mirage/serializer'; import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { module, test } from 'qunit'; -module( - 'Integration | Serializers | Base | Associations | Embedded Models', - function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - posts: hasMany('blogPost', { inverse: 'author' }) - }), - blogPost: Model.extend({ - author: belongsTo('wordSmith', { inverse: 'posts' }), - comments: hasMany('fineComment', { inverse: 'post' }) - }), - fineComment: Model.extend({ - post: belongsTo('blogPost') - }) - }); - - let wordSmith = this.schema.wordSmiths.create({ name: 'Link' }); - let post = wordSmith.createPost({ title: 'Lorem' }); - post.createComment({ text: 'pwned' }); - - wordSmith.createPost({ title: 'Ipsum' }); - - this.schema.wordSmiths.create({ name: 'Zelda' }); - - this.BaseSerializer = Serializer.extend({ - embed: true - }); +module('Integration | Serializers | Base | Associations | Embedded Models', function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + posts: hasMany('blogPost', { inverse: 'author' }) + }), + blogPost: Model.extend({ + author: belongsTo('wordSmith', { inverse: 'posts' }), + comments: hasMany('fineComment', { inverse: 'post' }) + }), + fineComment: Model.extend({ + post: belongsTo('blogPost') + }) }); - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); + let wordSmith = this.schema.wordSmiths.create({ name: 'Link' }); + let post = wordSmith.createPost({ title: 'Lorem' }); + post.createComment({ text: 'pwned' }); - test(`it can embed has-many relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }) - }); + wordSmith.createPost({ title: 'Ipsum' }); - let link = this.schema.wordSmiths.find(1); - let result = registry.serialize(link); + this.schema.wordSmiths.create({ name: 'Zelda' }); - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - posts: [ - { id: '1', title: 'Lorem' }, - { id: '2', title: 'Ipsum' } - ] - } - }); + this.BaseSerializer = Serializer.extend({ + embed: true + }); + }); + + hooks.afterEach(function() { + this.schema.db.emptyData(); + }); + + test(`it can embed has-many relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + include: ['posts'] + }) }); - test(`it can embed a chain of has-many relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['comments'] - }) - }); - - let wordSmith = this.schema.wordSmiths.find(1); - let result = registry.serialize(wordSmith); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - posts: [ - { id: '1', title: 'Lorem', comments: [ - { id: '1', text: 'pwned' } - ] }, - { id: '2', title: 'Ipsum', comments: [] } - ] - } - }); + let link = this.schema.wordSmiths.find(1); + let result = registry.serialize(link); + + assert.deepEqual(result, { + wordSmith: { + id: '1', + name: 'Link', + posts: [ + { id: '1', title: 'Lorem' }, + { id: '2', title: 'Ipsum' } + ] + } + }); + }); + + test(`it can embed a chain of has-many relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + include: ['posts'] + }), + blogPost: this.BaseSerializer.extend({ + include: ['comments'] + }) }); - test(`it can embed a belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - blogPost: this.BaseSerializer.extend({ - embed: true, - include: ['author'] - }) - }); + let wordSmith = this.schema.wordSmiths.find(1); + let result = registry.serialize(wordSmith); + + assert.deepEqual(result, { + wordSmith: { + id: '1', + name: 'Link', + posts: [ + { id: '1', title: 'Lorem', comments: [ + { id: '1', text: 'pwned' } + ] }, + { id: '2', title: 'Ipsum', comments: [] } + ] + } + }); + }); + + test(`it can embed a belongs-to relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + blogPost: this.BaseSerializer.extend({ + embed: true, + include: ['author'] + }) + }); - let blogPost = this.schema.blogPosts.find(1); - let result = registry.serialize(blogPost); + let blogPost = this.schema.blogPosts.find(1); + let result = registry.serialize(blogPost); - assert.deepEqual(result, { - blogPost: { - id: '1', - title: 'Lorem', - author: { id: '1', name: 'Link' } - } - }); + assert.deepEqual(result, { + blogPost: { + id: '1', + title: 'Lorem', + author: { id: '1', name: 'Link' } + } + }); + }); + + test(`it can serialize a chain of belongs-to relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + fineComment: this.BaseSerializer.extend({ + include: ['post'] + }), + blogPost: this.BaseSerializer.extend({ + include: ['author'] + }) }); - test(`it can serialize a chain of belongs-to relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - fineComment: this.BaseSerializer.extend({ - include: ['post'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let fineComment = this.schema.fineComments.find(1); - let result = registry.serialize(fineComment); - - assert.deepEqual(result, { - fineComment: { + let fineComment = this.schema.fineComments.find(1); + let result = registry.serialize(fineComment); + + assert.deepEqual(result, { + fineComment: { + id: '1', + text: 'pwned', + post: { id: '1', - text: 'pwned', - post: { - id: '1', - title: 'Lorem', - author: { - id: '1', name: 'Link' - } + title: 'Lorem', + author: { + id: '1', name: 'Link' } } - }); + } + }); + }); + + test(`it ignores relationships that refer to serialized ancestor resources`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + include: ['posts'] + }), + blogPost: this.BaseSerializer.extend({ + include: ['author'] + }) }); - test(`it ignores relationships that refer to serialized ancestor resources`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let wordSmith = this.schema.wordSmiths.find(1); - let result = registry.serialize(wordSmith); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - posts: [ - { id: '1', title: 'Lorem' }, - { id: '2', title: 'Ipsum' } - ] - } - }); + let wordSmith = this.schema.wordSmiths.find(1); + let result = registry.serialize(wordSmith); + + assert.deepEqual(result, { + wordSmith: { + id: '1', + name: 'Link', + posts: [ + { id: '1', title: 'Lorem' }, + { id: '2', title: 'Ipsum' } + ] + } + }); + }); + + test(`it ignores relationships that refer to serialized ancestor resources, multiple levels down`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + embed: true, + include: ['posts'] + }), + blogPost: this.BaseSerializer.extend({ + include: ['author', 'comments'] + }), + fineComment: this.BaseSerializer.extend({ + include: ['post'] + }) }); - test(`it ignores relationships that refer to serialized ancestor resources, multiple levels down`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - embed: true, - include: ['posts'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['author', 'comments'] - }), - fineComment: this.BaseSerializer.extend({ - include: ['post'] - }) - }); - - let wordSmith = this.schema.wordSmiths.find(1); - let result = registry.serialize(wordSmith); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - posts: [ - { id: '1', title: 'Lorem', comments: [ - { id: '1', text: 'pwned' } - ] }, - { id: '2', title: 'Ipsum', comments: [] } - ] - } - }); + let wordSmith = this.schema.wordSmiths.find(1); + let result = registry.serialize(wordSmith); + + assert.deepEqual(result, { + wordSmith: { + id: '1', + name: 'Link', + posts: [ + { id: '1', title: 'Lorem', comments: [ + { id: '1', text: 'pwned' } + ] }, + { id: '2', title: 'Ipsum', comments: [] } + ] + } }); - } -); + }); +}); diff --git a/tests/integration/serializers/base/associations/many-to-many-test.js b/tests/integration/serializers/base/associations/many-to-many-test.js index d5e4f0e6e..bc2db6fe0 100644 --- a/tests/integration/serializers/base/associations/many-to-many-test.js +++ b/tests/integration/serializers/base/associations/many-to-many-test.js @@ -4,78 +4,75 @@ import Db from 'ember-cli-mirage/db'; import Schema from 'ember-cli-mirage/orm/schema'; import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -module( - 'Integration | Serializers | Base | Associations | Many To Many', - function(hooks) { - hooks.beforeEach(function() { - let db = new Db(); +module('Integration | Serializers | Base | Associations | Many To Many', function(hooks) { + hooks.beforeEach(function() { + let db = new Db(); - let schema = new Schema(db, { - contact: Model.extend({ - addresses: hasMany(), - contactAddresses: hasMany() - }), - address: Model.extend({ - contacts: hasMany(), - contactAddresses: hasMany() - }), - contactAddress: Model.extend({ - contact: belongsTo(), - address: belongsTo() - }) - }); + let schema = new Schema(db, { + contact: Model.extend({ + addresses: hasMany(), + contactAddresses: hasMany() + }), + address: Model.extend({ + contacts: hasMany(), + contactAddresses: hasMany() + }), + contactAddress: Model.extend({ + contact: belongsTo(), + address: belongsTo() + }) + }); - let registry = new SerializerRegistry(schema, { - contact: Serializer.extend({ - include: ['addresses'], - addresses(model) { - let models = model.contactAddresses.models.map((ca) => ca.address); - return new Collection('address', models); - } - }), - address: Serializer.extend({ - include: ['contacts'], - contacts(model) { - let models = model.contactAddresses.models.map((ca) => ca.contact); - return new Collection('contact', models); - } - }) - }); + let registry = new SerializerRegistry(schema, { + contact: Serializer.extend({ + include: ['addresses'], + addresses(model) { + let models = model.contactAddresses.models.map((ca) => ca.address); + return new Collection('address', models); + } + }), + address: Serializer.extend({ + include: ['contacts'], + contacts(model) { + let models = model.contactAddresses.models.map((ca) => ca.contact); + return new Collection('contact', models); + } + }) + }); - let mario = schema.contacts.create({ name: 'Mario' }); - let newYork = schema.addresses.create({ street: 'Some New York Street' }); - let mushroomKingdom = schema.addresses.create({ street: 'Some Mushroom Kingdom Street' }); + let mario = schema.contacts.create({ name: 'Mario' }); + let newYork = schema.addresses.create({ street: 'Some New York Street' }); + let mushroomKingdom = schema.addresses.create({ street: 'Some Mushroom Kingdom Street' }); - schema.contactAddresses.create({ contact: mario, address: newYork }); - schema.contactAddresses.create({ contact: mario, address: mushroomKingdom }); + schema.contactAddresses.create({ contact: mario, address: newYork }); + schema.contactAddresses.create({ contact: mario, address: mushroomKingdom }); - this.schema = schema; - this.registry = registry; - }); + this.schema = schema; + this.registry = registry; + }); - skip(`it serializes manyToMany if properly configured to passthrough`, function(assert) { - let contact = this.schema.contacts.find(1); - let result = this.registry.serialize(contact); + skip(`it serializes manyToMany if properly configured to passthrough`, function(assert) { + let contact = this.schema.contacts.find(1); + let result = this.registry.serialize(contact); - assert.deepEqual(result, { - addresses: [{ - contactId: null, // side-effect of having a HasMany on the contactAddress side of things - contactIds: ['1'], - id: '1', - street: 'Some New York Street' - }, { - contactId: null, - contactIds: ['1'], - id: '2', - street: 'Some Mushroom Kingdom Street' - }], - contact: { - addressId: null, // side-effect of having a HasMany on the contactAddress side of things - addressIds: ['1', '2'], - id: '1', - name: 'Mario' - } - }); + assert.deepEqual(result, { + addresses: [{ + contactId: null, // side-effect of having a HasMany on the contactAddress side of things + contactIds: ['1'], + id: '1', + street: 'Some New York Street' + }, { + contactId: null, + contactIds: ['1'], + id: '2', + street: 'Some Mushroom Kingdom Street' + }], + contact: { + addressId: null, // side-effect of having a HasMany on the contactAddress side of things + addressIds: ['1', '2'], + id: '1', + name: 'Mario' + } }); - } -); + }); +}); diff --git a/tests/integration/serializers/base/associations/polymorphic-belongs-to-test.js b/tests/integration/serializers/base/associations/polymorphic-belongs-to-test.js index 37731dba7..1d14d517e 100644 --- a/tests/integration/serializers/base/associations/polymorphic-belongs-to-test.js +++ b/tests/integration/serializers/base/associations/polymorphic-belongs-to-test.js @@ -5,51 +5,48 @@ import Serializer from 'ember-cli-mirage/serializer'; import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { module, test } from 'qunit'; -module( - 'Integration | Serializers | Base | Associations | Polymorphic Belongs To', - function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - post: Model.extend(), - comment: Model.extend({ - commentable: belongsTo({ polymorphic: true }) - }) - }); +module('Integration | Serializers | Base | Associations | Polymorphic Belongs To', function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + post: Model.extend(), + comment: Model.extend({ + commentable: belongsTo({ polymorphic: true }) + }) + }); - let post = this.schema.posts.create({ title: 'Lorem ipsum' }); - this.schema.comments.create({ commentable: post, text: 'Foo' }); + let post = this.schema.posts.create({ title: 'Lorem ipsum' }); + this.schema.comments.create({ commentable: post, text: 'Foo' }); - this.BaseSerializer = Serializer.extend({ - embed: false - }); + this.BaseSerializer = Serializer.extend({ + embed: false }); + }); - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); + hooks.afterEach(function() { + this.schema.db.emptyData(); + }); - test(`it can serialize a polymorphic belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - comment: this.BaseSerializer.extend({ - include: ['commentable'] - }) - }); + test(`it can serialize a polymorphic belongs-to relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + comment: this.BaseSerializer.extend({ + include: ['commentable'] + }) + }); - let comment = this.schema.comments.find(1); - let result = registry.serialize(comment); + let comment = this.schema.comments.find(1); + let result = registry.serialize(comment); - assert.deepEqual(result, { - comment: { - id: '1', - text: 'Foo', - commentableType: 'post', - commentableId: '1' - }, - posts: [ - { id: '1', title: 'Lorem ipsum' } - ] - }); + assert.deepEqual(result, { + comment: { + id: '1', + text: 'Foo', + commentableType: 'post', + commentableId: '1' + }, + posts: [ + { id: '1', title: 'Lorem ipsum' } + ] }); - } -); + }); +}); diff --git a/tests/integration/serializers/base/associations/polymorphic-has-many-test.js b/tests/integration/serializers/base/associations/polymorphic-has-many-test.js index 7e915f233..818072d98 100644 --- a/tests/integration/serializers/base/associations/polymorphic-has-many-test.js +++ b/tests/integration/serializers/base/associations/polymorphic-has-many-test.js @@ -5,52 +5,49 @@ import Serializer from 'ember-cli-mirage/serializer'; import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { module, test } from 'qunit'; -module( - 'Integration | Serializers | Base | Associations | Polymorphic Has Many', - function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - user: Model.extend({ - things: hasMany({ polymorphic: true }) - }), - picture: Model.extend() - }); +module('Integration | Serializers | Base | Associations | Polymorphic Has Many', function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + user: Model.extend({ + things: hasMany({ polymorphic: true }) + }), + picture: Model.extend() + }); - let post = this.schema.pictures.create({ title: 'Lorem ipsum' }); - this.schema.users.create({ things: [ post ], name: 'Ned' }); + let post = this.schema.pictures.create({ title: 'Lorem ipsum' }); + this.schema.users.create({ things: [ post ], name: 'Ned' }); - this.BaseSerializer = Serializer.extend({ - embed: false - }); + this.BaseSerializer = Serializer.extend({ + embed: false }); + }); - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); + hooks.afterEach(function() { + this.schema.db.emptyData(); + }); - test(`it can serialize a polymorphic has-many relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - user: this.BaseSerializer.extend({ - include: ['things'] - }) - }); + test(`it can serialize a polymorphic has-many relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + user: this.BaseSerializer.extend({ + include: ['things'] + }) + }); - let user = this.schema.users.find(1); - let result = registry.serialize(user); + let user = this.schema.users.find(1); + let result = registry.serialize(user); - assert.deepEqual(result, { - user: { - id: '1', - name: 'Ned', - things: [ - { id: '1', type: 'picture' } - ] - }, - pictures: [ - { id: '1', title: 'Lorem ipsum' } + assert.deepEqual(result, { + user: { + id: '1', + name: 'Ned', + things: [ + { id: '1', type: 'picture' } ] - }); + }, + pictures: [ + { id: '1', title: 'Lorem ipsum' } + ] }); - } -); + }); +}); diff --git a/tests/integration/serializers/base/associations/sideloading-assorted-collections-test.js b/tests/integration/serializers/base/associations/sideloading-assorted-collections-test.js index 1763d3105..b0d1db9eb 100644 --- a/tests/integration/serializers/base/associations/sideloading-assorted-collections-test.js +++ b/tests/integration/serializers/base/associations/sideloading-assorted-collections-test.js @@ -5,68 +5,65 @@ import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import Serializer from 'ember-cli-mirage/serializer'; import { module, test } from 'qunit'; -module( - 'Integration | Serializers | Base | Associations | Sideloading Assorted Collections', - function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - blogPosts: hasMany() - }), - blogPost: Model, - greatPhoto: Model - }); - - let BaseSerializer = Serializer.extend({ - embed: false - }); - this.registry = new SerializerRegistry(this.schema, { - application: BaseSerializer, - wordSmith: BaseSerializer.extend({ - include: ['blogPosts'] - }), - greatPhoto: BaseSerializer.extend({ - attrs: ['id', 'title'] - }) - }); - this.wordSmiths = [ - { id: '1', name: 'Link', blogPostIds: ['1', '2'] }, - { id: '2', name: 'Zelda', blogPostIds: [] }, - { id: '3', name: 'Epona', blogPostIds: [] } - ]; - this.blogPosts = [ - { id: '1', title: 'Lorem' }, - { id: '2', title: 'Ipsum' } - ]; - this.greatPhotos = [ - { id: '1', title: 'Amazing', location: 'Hyrule' }, - { id: '2', title: 'greatPhoto', location: 'Goron City' } - ]; - this.schema.db.loadData({ - wordSmiths: this.wordSmiths, - blogPosts: this.blogPosts, - greatPhotos: this.greatPhotos - }); +module('Integration | Serializers | Base | Associations | Sideloading Assorted Collections', function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + blogPosts: hasMany() + }), + blogPost: Model, + greatPhoto: Model }); - hooks.afterEach(function() { - this.schema.db.emptyData(); + let BaseSerializer = Serializer.extend({ + embed: false + }); + this.registry = new SerializerRegistry(this.schema, { + application: BaseSerializer, + wordSmith: BaseSerializer.extend({ + include: ['blogPosts'] + }), + greatPhoto: BaseSerializer.extend({ + attrs: ['id', 'title'] + }) }); + this.wordSmiths = [ + { id: '1', name: 'Link', blogPostIds: ['1', '2'] }, + { id: '2', name: 'Zelda', blogPostIds: [] }, + { id: '3', name: 'Epona', blogPostIds: [] } + ]; + this.blogPosts = [ + { id: '1', title: 'Lorem' }, + { id: '2', title: 'Ipsum' } + ]; + this.greatPhotos = [ + { id: '1', title: 'Amazing', location: 'Hyrule' }, + { id: '2', title: 'greatPhoto', location: 'Goron City' } + ]; + this.schema.db.loadData({ + wordSmiths: this.wordSmiths, + blogPosts: this.blogPosts, + greatPhotos: this.greatPhotos + }); + }); + + hooks.afterEach(function() { + this.schema.db.emptyData(); + }); - /* - This is a strange response from a route handler, but it's used in the array get shorthand. Deprecate that shorthand? - */ - test(`it can sideload an array of assorted collections that have relationships`, function(assert) { - let result = this.registry.serialize([this.schema.wordSmiths.all(), this.schema.greatPhotos.all()]); + /* + This is a strange response from a route handler, but it's used in the array get shorthand. Deprecate that shorthand? + */ + test(`it can sideload an array of assorted collections that have relationships`, function(assert) { + let result = this.registry.serialize([this.schema.wordSmiths.all(), this.schema.greatPhotos.all()]); - assert.deepEqual(result, { - wordSmiths: this.wordSmiths, - blogPosts: this.blogPosts, - greatPhotos: this.greatPhotos.map((attrs) => { - delete attrs.location; - return attrs; - }) - }); + assert.deepEqual(result, { + wordSmiths: this.wordSmiths, + blogPosts: this.blogPosts, + greatPhotos: this.greatPhotos.map((attrs) => { + delete attrs.location; + return attrs; + }) }); - } -); + }); +}); diff --git a/tests/integration/serializers/base/associations/sideloading-collection-test.js b/tests/integration/serializers/base/associations/sideloading-collection-test.js index 996f613c6..d934793d9 100644 --- a/tests/integration/serializers/base/associations/sideloading-collection-test.js +++ b/tests/integration/serializers/base/associations/sideloading-collection-test.js @@ -5,207 +5,204 @@ import Serializer from 'ember-cli-mirage/serializer'; import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { module, test } from 'qunit'; -module( - 'Integration | Serializers | Base | Associations | Sideloading Collections', - function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - posts: hasMany('blog-post') - }), - blogPost: Model.extend({ - author: belongsTo('word-smith'), - comments: hasMany('fine-comment') - }), - fineComment: Model.extend({ - post: belongsTo('blog-post') - }) - }); - - let link = this.schema.wordSmiths.create({ name: 'Link' }); - let blogPost = link.createPost({ title: 'Lorem' }); - link.createPost({ title: 'Ipsum' }); - - blogPost.createComment({ text: 'pwned' }); - - let zelda = this.schema.wordSmiths.create({ name: 'Zelda' }); - zelda.createPost({ title: `Zeldas blogPost` }); - - this.BaseSerializer = Serializer.extend({ - embed: false - }); +module('Integration | Serializers | Base | Associations | Sideloading Collections', function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + posts: hasMany('blog-post') + }), + blogPost: Model.extend({ + author: belongsTo('word-smith'), + comments: hasMany('fine-comment') + }), + fineComment: Model.extend({ + post: belongsTo('blog-post') + }) }); - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); + let link = this.schema.wordSmiths.create({ name: 'Link' }); + let blogPost = link.createPost({ title: 'Lorem' }); + link.createPost({ title: 'Ipsum' }); - test(`it throws an error if embed is false and root is false`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - wordSmith: this.BaseSerializer.extend({ - root: false, - include: ['posts'] - }) - }); + blogPost.createComment({ text: 'pwned' }); - let wordSmiths = this.schema.wordSmiths.all(); + let zelda = this.schema.wordSmiths.create({ name: 'Zelda' }); + zelda.createPost({ title: `Zeldas blogPost` }); - assert.throws(function() { - registry.serialize(wordSmiths); - }, /disables the root/); + this.BaseSerializer = Serializer.extend({ + embed: false + }); + }); + + hooks.afterEach(function() { + this.schema.db.emptyData(); + }); + + test(`it throws an error if embed is false and root is false`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + wordSmith: this.BaseSerializer.extend({ + root: false, + include: ['posts'] + }) }); - test(`it can sideload an empty collection`, function(assert) { - this.schema.db.emptyData(); - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }) - }); + let wordSmiths = this.schema.wordSmiths.all(); + + assert.throws(function() { + registry.serialize(wordSmiths); + }, /disables the root/); + }); + + test(`it can sideload an empty collection`, function(assert) { + this.schema.db.emptyData(); + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + include: ['posts'] + }) + }); - let result = registry.serialize(this.schema.wordSmiths.all()); + let result = registry.serialize(this.schema.wordSmiths.all()); - assert.deepEqual(result, { - wordSmiths: [] - }); + assert.deepEqual(result, { + wordSmiths: [] + }); + }); + + test(`it can sideload a collection with a has-many relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + embed: false, + include: ['posts'] + }) }); - test(`it can sideload a collection with a has-many relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - embed: false, - include: ['posts'] - }) - }); - - let wordSmiths = this.schema.wordSmiths.all(); - let result = registry.serialize(wordSmiths); - - assert.deepEqual(result, { - wordSmiths: [ - { id: '1', name: 'Link', postIds: ['1', '2'] }, - { id: '2', name: 'Zelda', postIds: ['3'] } - ], - blogPosts: [ - { id: '1', title: 'Lorem' }, - { id: '2', title: 'Ipsum' }, - { id: '3', title: 'Zeldas blogPost' } - ] - }); + let wordSmiths = this.schema.wordSmiths.all(); + let result = registry.serialize(wordSmiths); + + assert.deepEqual(result, { + wordSmiths: [ + { id: '1', name: 'Link', postIds: ['1', '2'] }, + { id: '2', name: 'Zelda', postIds: ['3'] } + ], + blogPosts: [ + { id: '1', title: 'Lorem' }, + { id: '2', title: 'Ipsum' }, + { id: '3', title: 'Zeldas blogPost' } + ] + }); + }); + + test(`it can sideload a collection with a chain of has-many relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + embed: false, + include: ['posts'] + }), + blogPost: this.BaseSerializer.extend({ + include: ['comments'] + }) }); - test(`it can sideload a collection with a chain of has-many relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - embed: false, - include: ['posts'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['comments'] - }) - }); - - let wordSmiths = this.schema.wordSmiths.all(); - let result = registry.serialize(wordSmiths); - - assert.deepEqual(result, { - wordSmiths: [ - { id: '1', name: 'Link', postIds: ['1', '2'] }, - { id: '2', name: 'Zelda', postIds: ['3'] } - ], - blogPosts: [ - { id: '1', title: 'Lorem', commentIds: ['1'] }, - { id: '2', title: 'Ipsum', commentIds: [] }, - { id: '3', title: 'Zeldas blogPost', commentIds: [] } - ], - fineComments: [ - { id: '1', text: 'pwned' } - ] - }); + let wordSmiths = this.schema.wordSmiths.all(); + let result = registry.serialize(wordSmiths); + + assert.deepEqual(result, { + wordSmiths: [ + { id: '1', name: 'Link', postIds: ['1', '2'] }, + { id: '2', name: 'Zelda', postIds: ['3'] } + ], + blogPosts: [ + { id: '1', title: 'Lorem', commentIds: ['1'] }, + { id: '2', title: 'Ipsum', commentIds: [] }, + { id: '3', title: 'Zeldas blogPost', commentIds: [] } + ], + fineComments: [ + { id: '1', text: 'pwned' } + ] + }); + }); + + test(`it avoids circularity when serializing a collection`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + embed: false, + include: ['posts'] + }), + blogPost: this.BaseSerializer.extend({ + include: ['author'] + }) }); - test(`it avoids circularity when serializing a collection`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - embed: false, - include: ['posts'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let wordSmiths = this.schema.wordSmiths.all(); - let result = registry.serialize(wordSmiths); - - assert.deepEqual(result, { - wordSmiths: [ - { id: '1', name: 'Link', postIds: ['1', '2'] }, - { id: '2', name: 'Zelda', postIds: ['3'] } - ], - blogPosts: [ - { id: '1', title: 'Lorem', authorId: '1' }, - { id: '2', title: 'Ipsum', authorId: '1' }, - { id: '3', title: 'Zeldas blogPost', authorId: '2' } - ] - }); + let wordSmiths = this.schema.wordSmiths.all(); + let result = registry.serialize(wordSmiths); + + assert.deepEqual(result, { + wordSmiths: [ + { id: '1', name: 'Link', postIds: ['1', '2'] }, + { id: '2', name: 'Zelda', postIds: ['3'] } + ], + blogPosts: [ + { id: '1', title: 'Lorem', authorId: '1' }, + { id: '2', title: 'Ipsum', authorId: '1' }, + { id: '3', title: 'Zeldas blogPost', authorId: '2' } + ] + }); + }); + + test(`it can sideload a collection with a belongs-to relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + blogPost: this.BaseSerializer.extend({ + embed: false, + include: ['author'] + }) }); - test(`it can sideload a collection with a belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - blogPost: this.BaseSerializer.extend({ - embed: false, - include: ['author'] - }) - }); - - let blogPosts = this.schema.blogPosts.all(); - let result = registry.serialize(blogPosts); - - assert.deepEqual(result, { - blogPosts: [ - { id: '1', title: 'Lorem', authorId: '1' }, - { id: '2', title: 'Ipsum', authorId: '1' }, - { id: '3', title: 'Zeldas blogPost', authorId: '2' } - ], - wordSmiths: [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ] - }); + let blogPosts = this.schema.blogPosts.all(); + let result = registry.serialize(blogPosts); + + assert.deepEqual(result, { + blogPosts: [ + { id: '1', title: 'Lorem', authorId: '1' }, + { id: '2', title: 'Ipsum', authorId: '1' }, + { id: '3', title: 'Zeldas blogPost', authorId: '2' } + ], + wordSmiths: [ + { id: '1', name: 'Link' }, + { id: '2', name: 'Zelda' } + ] + }); + }); + + test(`it can sideload a collection with a chain of belongs-to relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + fineComment: this.BaseSerializer.extend({ + embed: false, + include: ['post'] + }), + blogPost: this.BaseSerializer.extend({ + include: ['author'] + }) }); - test(`it can sideload a collection with a chain of belongs-to relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - fineComment: this.BaseSerializer.extend({ - embed: false, - include: ['post'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let fineComments = this.schema.fineComments.all(); - let result = registry.serialize(fineComments); - - assert.deepEqual(result, { - fineComments: [ - { id: '1', text: 'pwned', postId: '1' } - ], - blogPosts: [ - { id: '1', title: 'Lorem', authorId: '1' } - ], - wordSmiths: [ - { id: '1', name: 'Link' } - ] - }); + let fineComments = this.schema.fineComments.all(); + let result = registry.serialize(fineComments); + + assert.deepEqual(result, { + fineComments: [ + { id: '1', text: 'pwned', postId: '1' } + ], + blogPosts: [ + { id: '1', title: 'Lorem', authorId: '1' } + ], + wordSmiths: [ + { id: '1', name: 'Link' } + ] }); - } -); + }); +}); diff --git a/tests/integration/serializers/base/associations/sideloading-model-test.js b/tests/integration/serializers/base/associations/sideloading-model-test.js index 2cdb41609..aa8bd8b7a 100644 --- a/tests/integration/serializers/base/associations/sideloading-model-test.js +++ b/tests/integration/serializers/base/associations/sideloading-model-test.js @@ -5,182 +5,179 @@ import Serializer from 'ember-cli-mirage/serializer'; import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { module, test } from 'qunit'; -module( - 'Integration | Serializers | Base | Associations | Sideloading Models', - function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - posts: hasMany('blog-post') - }), - blogPost: Model.extend({ - author: belongsTo('word-smith'), - comments: hasMany('fine-comment') - }), - fineComment: Model.extend({ - post: belongsTo('blog-post') - }) - }); - - let wordSmith = this.schema.wordSmiths.create({ name: 'Link' }); - let blogPost = wordSmith.createPost({ title: 'Lorem' }); - blogPost.createComment({ text: 'pwned' }); - - wordSmith.createPost({ title: 'Ipsum' }); - - this.schema.wordSmiths.create({ name: 'Zelda' }); - - this.BaseSerializer = Serializer.extend({ - embed: false - }); +module('Integration | Serializers | Base | Associations | Sideloading Models', function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + posts: hasMany('blog-post') + }), + blogPost: Model.extend({ + author: belongsTo('word-smith'), + comments: hasMany('fine-comment') + }), + fineComment: Model.extend({ + post: belongsTo('blog-post') + }) }); - hooks.afterEach(function() { - this.schema.db.emptyData(); + let wordSmith = this.schema.wordSmiths.create({ name: 'Link' }); + let blogPost = wordSmith.createPost({ title: 'Lorem' }); + blogPost.createComment({ text: 'pwned' }); + + wordSmith.createPost({ title: 'Ipsum' }); + + this.schema.wordSmiths.create({ name: 'Zelda' }); + + this.BaseSerializer = Serializer.extend({ + embed: false + }); + }); + + hooks.afterEach(function() { + this.schema.db.emptyData(); + }); + + test(`it throws an error if embed is false and root is false`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + wordSmith: this.BaseSerializer.extend({ + root: false, + include: ['posts'] + }) }); - test(`it throws an error if embed is false and root is false`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - wordSmith: this.BaseSerializer.extend({ - root: false, - include: ['posts'] - }) - }); + let link = this.schema.wordSmiths.find(1); + assert.throws(function() { + registry.serialize(link); + }, /disables the root/); - let link = this.schema.wordSmiths.find(1); - assert.throws(function() { - registry.serialize(link); - }, /disables the root/); + }); + test(`it can sideload a model with a has-many relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + include: ['posts'] + }) }); - test(`it can sideload a model with a has-many relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }) - }); - - let link = this.schema.wordSmiths.find(1); - let result = registry.serialize(link); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - postIds: ['1', '2'] - }, - blogPosts: [ - { id: '1', title: 'Lorem' }, - { id: '2', title: 'Ipsum' } - ] - }); + let link = this.schema.wordSmiths.find(1); + let result = registry.serialize(link); + + assert.deepEqual(result, { + wordSmith: { + id: '1', + name: 'Link', + postIds: ['1', '2'] + }, + blogPosts: [ + { id: '1', title: 'Lorem' }, + { id: '2', title: 'Ipsum' } + ] + }); + }); + + test(`it can sideload a model with a chain of has-many relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + include: ['posts'] + }), + blogPost: this.BaseSerializer.extend({ + include: ['comments'] + }) }); - test(`it can sideload a model with a chain of has-many relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['comments'] - }) - }); - - let link = this.schema.wordSmiths.find(1); - let result = registry.serialize(link); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - postIds: ['1', '2'] - }, - blogPosts: [ - { id: '1', title: 'Lorem', commentIds: ['1'] }, - { id: '2', title: 'Ipsum', commentIds: [] } - ], - fineComments: [ - { id: '1', text: 'pwned' } - ] - }); + let link = this.schema.wordSmiths.find(1); + let result = registry.serialize(link); + + assert.deepEqual(result, { + wordSmith: { + id: '1', + name: 'Link', + postIds: ['1', '2'] + }, + blogPosts: [ + { id: '1', title: 'Lorem', commentIds: ['1'] }, + { id: '2', title: 'Ipsum', commentIds: [] } + ], + fineComments: [ + { id: '1', text: 'pwned' } + ] + }); + }); + + test(`it avoids circularity when serializing a model`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + include: ['posts'] + }), + blogPost: this.BaseSerializer.extend({ + include: ['author'] + }) }); - test(`it avoids circularity when serializing a model`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let link = this.schema.wordSmiths.find(1); - let result = registry.serialize(link); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - postIds: ['1', '2'] - }, - blogPosts: [ - { id: '1', title: 'Lorem', authorId: '1' }, - { id: '2', title: 'Ipsum', authorId: '1' } - ] - }); + let link = this.schema.wordSmiths.find(1); + let result = registry.serialize(link); + + assert.deepEqual(result, { + wordSmith: { + id: '1', + name: 'Link', + postIds: ['1', '2'] + }, + blogPosts: [ + { id: '1', title: 'Lorem', authorId: '1' }, + { id: '2', title: 'Ipsum', authorId: '1' } + ] + }); + }); + + test(`it can sideload a model with a belongs-to relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + blogPost: this.BaseSerializer.extend({ + include: ['author'] + }) }); - test(`it can sideload a model with a belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let blogPost = this.schema.blogPosts.find(1); - let result = registry.serialize(blogPost); - - assert.deepEqual(result, { - blogPost: { - id: '1', title: 'Lorem', authorId: '1' - }, - wordSmiths: [ - { id: '1', name: 'Link' } - ] - }); + let blogPost = this.schema.blogPosts.find(1); + let result = registry.serialize(blogPost); + + assert.deepEqual(result, { + blogPost: { + id: '1', title: 'Lorem', authorId: '1' + }, + wordSmiths: [ + { id: '1', name: 'Link' } + ] + }); + }); + + test(`it can sideload a model with a chain of belongs-to relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + fineComment: this.BaseSerializer.extend({ + include: ['post'] + }), + blogPost: this.BaseSerializer.extend({ + include: ['author'] + }) }); - test(`it can sideload a model with a chain of belongs-to relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - fineComment: this.BaseSerializer.extend({ - include: ['post'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let fineComment = this.schema.fineComments.find(1); - let result = registry.serialize(fineComment); - - assert.deepEqual(result, { - fineComment: { - id: '1', text: 'pwned', postId: '1' - }, - blogPosts: [ - { id: '1', title: 'Lorem', authorId: '1' } - ], - wordSmiths: [ - { id: '1', name: 'Link' } - ] - }); + let fineComment = this.schema.fineComments.find(1); + let result = registry.serialize(fineComment); + + assert.deepEqual(result, { + fineComment: { + id: '1', text: 'pwned', postId: '1' + }, + blogPosts: [ + { id: '1', title: 'Lorem', authorId: '1' } + ], + wordSmiths: [ + { id: '1', name: 'Link' } + ] }); - } -); + }); +}); diff --git a/tests/integration/serializers/base/assorted-collections-test.js b/tests/integration/serializers/base/assorted-collections-test.js index 76482b8aa..54c9fc602 100644 --- a/tests/integration/serializers/base/assorted-collections-test.js +++ b/tests/integration/serializers/base/assorted-collections-test.js @@ -3,45 +3,42 @@ import Serializer from 'ember-cli-mirage/serializer'; import schemaHelper from '../schema-helper'; import {module, test} from 'qunit'; -module( - 'Integration | Serializers | Base | Assorted Collections', - function(hooks) { - hooks.beforeEach(function() { - this.schema = schemaHelper.setup(); - this.registry = new SerializerRegistry(this.schema, { - greatPhoto: Serializer.extend({ - attrs: ['id', 'title'] - }) - }); - this.wordSmiths = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' }, - { id: '3', name: 'Epona' } - ]; - this.greatPhotos = [ - { id: '1', title: 'Amazing', location: 'Hyrule' }, - { id: '2', title: 'greatPhoto', location: 'Goron City' } - ]; - this.schema.db.loadData({ - wordSmiths: this.wordSmiths, - greatPhotos: this.greatPhotos - }); +module('Integration | Serializers | Base | Assorted Collections', function(hooks) { + hooks.beforeEach(function() { + this.schema = schemaHelper.setup(); + this.registry = new SerializerRegistry(this.schema, { + greatPhoto: Serializer.extend({ + attrs: ['id', 'title'] + }) }); - - hooks.afterEach(function() { - this.schema.db.emptyData(); + this.wordSmiths = [ + { id: '1', name: 'Link' }, + { id: '2', name: 'Zelda' }, + { id: '3', name: 'Epona' } + ]; + this.greatPhotos = [ + { id: '1', title: 'Amazing', location: 'Hyrule' }, + { id: '2', title: 'greatPhoto', location: 'Goron City' } + ]; + this.schema.db.loadData({ + wordSmiths: this.wordSmiths, + greatPhotos: this.greatPhotos }); + }); + + hooks.afterEach(function() { + this.schema.db.emptyData(); + }); - test(`an array of assorted collections can be serialized`, function(assert) { - let result = this.registry.serialize([this.schema.wordSmiths.all(), this.schema.greatPhotos.all()]); + test(`an array of assorted collections can be serialized`, function(assert) { + let result = this.registry.serialize([this.schema.wordSmiths.all(), this.schema.greatPhotos.all()]); - assert.deepEqual(result, { - wordSmiths: this.wordSmiths, - greatPhotos: this.greatPhotos.map((attrs) => { - delete attrs.location; - return attrs; - }) - }); + assert.deepEqual(result, { + wordSmiths: this.wordSmiths, + greatPhotos: this.greatPhotos.map((attrs) => { + delete attrs.location; + return attrs; + }) }); - } -); + }); +}); diff --git a/tests/integration/serializers/base/attribute-key-formatting-test.js b/tests/integration/serializers/base/attribute-key-formatting-test.js index 3bc55b7ac..2d9d63c40 100644 --- a/tests/integration/serializers/base/attribute-key-formatting-test.js +++ b/tests/integration/serializers/base/attribute-key-formatting-test.js @@ -4,57 +4,54 @@ import schemaHelper from '../schema-helper'; import { camelize } from 'ember-cli-mirage/utils/inflector'; import {module, test} from 'qunit'; -module( - 'Integration | Serializers | Base | Attribute Key Formatting', - function(hooks) { - hooks.beforeEach(function() { - this.schema = schemaHelper.setup(); - this.registry = new SerializerRegistry(this.schema, { - wordSmith: Serializer.extend({ - keyForAttribute(key) { - return camelize(key); - } - }) - }); +module('Integration | Serializers | Base | Attribute Key Formatting', function(hooks) { + hooks.beforeEach(function() { + this.schema = schemaHelper.setup(); + this.registry = new SerializerRegistry(this.schema, { + wordSmith: Serializer.extend({ + keyForAttribute(key) { + return camelize(key); + } + }) }); - - hooks.afterEach(function() { - this.schema.db.emptyData(); + }); + + hooks.afterEach(function() { + this.schema.db.emptyData(); + }); + + test(`keyForAttribute formats the attributes of a model`, function(assert) { + let wordSmith = this.schema.wordSmiths.create({ + id: 1, + 'first-name': 'Link', + 'last-name': 'Jackson', + age: 323 }); - test(`keyForAttribute formats the attributes of a model`, function(assert) { - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - 'first-name': 'Link', - 'last-name': 'Jackson', - age: 323 - }); - - let result = this.registry.serialize(wordSmith); + let result = this.registry.serialize(wordSmith); - assert.deepEqual(result, { - wordSmith: { - id: '1', - firstName: 'Link', - lastName: 'Jackson', - age: 323 - } - }); + assert.deepEqual(result, { + wordSmith: { + id: '1', + firstName: 'Link', + lastName: 'Jackson', + age: 323 + } }); + }); - test(`keyForAttribute also formats the models in a collections`, function(assert) { - this.schema.wordSmiths.create({ id: 1, 'first-name': 'Link', 'last-name': 'Jackson' }); - this.schema.wordSmiths.create({ id: 2, 'first-name': 'Zelda', 'last-name': 'Brown' }); - let wordSmiths = this.schema.wordSmiths.all(); + test(`keyForAttribute also formats the models in a collections`, function(assert) { + this.schema.wordSmiths.create({ id: 1, 'first-name': 'Link', 'last-name': 'Jackson' }); + this.schema.wordSmiths.create({ id: 2, 'first-name': 'Zelda', 'last-name': 'Brown' }); + let wordSmiths = this.schema.wordSmiths.all(); - let result = this.registry.serialize(wordSmiths); + let result = this.registry.serialize(wordSmiths); - assert.deepEqual(result, { - wordSmiths: [ - { id: '1', firstName: 'Link', lastName: 'Jackson' }, - { id: '2', firstName: 'Zelda', lastName: 'Brown' } - ] - }); + assert.deepEqual(result, { + wordSmiths: [ + { id: '1', firstName: 'Link', lastName: 'Jackson' }, + { id: '2', firstName: 'Zelda', lastName: 'Brown' } + ] }); - } -); + }); +}); diff --git a/tests/integration/serializers/base/override-serialize-test.js b/tests/integration/serializers/base/override-serialize-test.js index 8f6e1651e..0908307e8 100644 --- a/tests/integration/serializers/base/override-serialize-test.js +++ b/tests/integration/serializers/base/override-serialize-test.js @@ -3,75 +3,72 @@ import Serializer from 'ember-cli-mirage/serializer'; import schemaHelper from '../schema-helper'; import { module, test } from 'qunit'; -module( - 'Integration | Serializers | Base | Overriding Serialize', - function(hooks) { - hooks.beforeEach(function() { - this.schema = schemaHelper.setup(); - }); +module('Integration | Serializers | Base | Overriding Serialize', function(hooks) { + hooks.beforeEach(function() { + this.schema = schemaHelper.setup(); + }); + + hooks.afterEach(function() { + this.schema.db.emptyData(); + }); - hooks.afterEach(function() { - this.schema.db.emptyData(); + test(`it can use a completely custom serialize function`, function(assert) { + this.registry = new SerializerRegistry(this.schema, { + wordSmith: Serializer.extend({ + serialize() { + return 'blah'; + } + }) }); - test(`it can use a completely custom serialize function`, function(assert) { - this.registry = new SerializerRegistry(this.schema, { - wordSmith: Serializer.extend({ - serialize() { - return 'blah'; - } - }) - }); + let wordSmith = this.schema.wordSmiths.create({ + id: 1, + title: 'Link' + }); - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - title: 'Link' - }); + let result = this.registry.serialize(wordSmith); - let result = this.registry.serialize(wordSmith); + assert.deepEqual(result, 'blah'); + }); - assert.deepEqual(result, 'blah'); + test(`it can access the request in a custom serialize function`, function(assert) { + this.registry = new SerializerRegistry(this.schema, { + wordSmith: Serializer.extend({ + serialize(response, request) { + return request.queryParams.foo || 'blah'; + } + }) }); - test(`it can access the request in a custom serialize function`, function(assert) { - this.registry = new SerializerRegistry(this.schema, { - wordSmith: Serializer.extend({ - serialize(response, request) { - return request.queryParams.foo || 'blah'; - } - }) - }); + let wordSmith = this.schema.wordSmiths.create({ + id: 1, + title: 'Link' + }); - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - title: 'Link' - }); + let request = { url: '/word-smiths/1?foo=bar', params: { id: '1' }, queryParams: { foo: 'bar' } }; + let result = this.registry.serialize(wordSmith, request); - let request = { url: '/word-smiths/1?foo=bar', params: { id: '1' }, queryParams: { foo: 'bar' } }; - let result = this.registry.serialize(wordSmith, request); + assert.deepEqual(result, 'bar'); + }); - assert.deepEqual(result, 'bar'); + test(`it can access the databse while in a serializer method`, function(assert) { + this.registry = new SerializerRegistry(this.schema, { + wordSmith: Serializer.extend({ + serialize(response, request) { + let id = request.params.id; + return this.schema.db.wordSmiths.find(id).title || 'No title'; + } + }) }); - test(`it can access the databse while in a serializer method`, function(assert) { - this.registry = new SerializerRegistry(this.schema, { - wordSmith: Serializer.extend({ - serialize(response, request) { - let id = request.params.id; - return this.schema.db.wordSmiths.find(id).title || 'No title'; - } - }) - }); - - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - title: 'Title in database' - }); + let wordSmith = this.schema.wordSmiths.create({ + id: 1, + title: 'Title in database' + }); - let request = { url: '/word-smiths/1?foo=bar', params: { id: '1' }, queryParams: { foo: 'bar' } }; - let result = this.registry.serialize(wordSmith, request); + let request = { url: '/word-smiths/1?foo=bar', params: { id: '1' }, queryParams: { foo: 'bar' } }; + let result = this.registry.serialize(wordSmith, request); - assert.deepEqual(result, 'Title in database'); - }); - } -); \ No newline at end of file + assert.deepEqual(result, 'Title in database'); + }); +}); diff --git a/tests/integration/serializers/json-api-serializer/associations/collection-test.js b/tests/integration/serializers/json-api-serializer/associations/collection-test.js index 458679ab7..47cf84066 100644 --- a/tests/integration/serializers/json-api-serializer/associations/collection-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/collection-test.js @@ -4,455 +4,452 @@ import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { Model, hasMany, belongsTo, JSONAPISerializer } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module( - 'Integration | Serializers | JSON API Serializer | Associations | Collection', - function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - posts: hasMany('blogPost', { inverse: 'author' }) - }), - blogPost: Model.extend({ - author: belongsTo('wordSmith', { inverse: 'posts' }), - comments: hasMany('fineComment', { inverse: 'post' }) - }), - fineComment: Model.extend({ - post: belongsTo('blogPost') - }) - }); +module('Integration | Serializers | JSON API Serializer | Associations | Collection', function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + posts: hasMany('blogPost', { inverse: 'author' }) + }), + blogPost: Model.extend({ + author: belongsTo('wordSmith', { inverse: 'posts' }), + comments: hasMany('fineComment', { inverse: 'post' }) + }), + fineComment: Model.extend({ + post: belongsTo('blogPost') + }) }); + }); - test(`by default, it doesn't include a collection's relationships if those relationships are not included in the document and no links are defined`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer - }); - this.schema.wordSmiths.create({ firstName: 'Link', age: 123 }); - this.schema.wordSmiths.create({ firstName: 'Zelda', age: 456 }); + test(`by default, it doesn't include a collection's relationships if those relationships are not included in the document and no links are defined`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer + }); + this.schema.wordSmiths.create({ firstName: 'Link', age: 123 }); + this.schema.wordSmiths.create({ firstName: 'Zelda', age: 456 }); - let collection = this.schema.wordSmiths.all(); - let result = registry.serialize(collection); + let collection = this.schema.wordSmiths.all(); + let result = registry.serialize(collection); - assert.deepEqual(result, { - data: [{ - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link', - age: 123 + assert.deepEqual(result, { + data: [{ + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link', + age: 123 + } + }, { + type: 'word-smiths', + id: '2', + attributes: { + 'first-name': 'Zelda', + age: 456 + } + }] + }); + }); + + test(`when alwaysIncludeLinkageData is true, it contains linkage data for all a collection's relationships, regardless of includes`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer.extend({ + alwaysIncludeLinkageData: true + }) + }); + this.schema.wordSmiths.create({ firstName: 'Link', age: 123 }); + this.schema.wordSmiths.create({ firstName: 'Zelda', age: 456 }); + + let collection = this.schema.wordSmiths.all(); + let result = registry.serialize(collection); + + assert.deepEqual(result, { + data: [{ + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link', + age: 123 + }, + relationships: { + 'posts': { + data: [] } - }, { - type: 'word-smiths', - id: '2', - attributes: { - 'first-name': 'Zelda', - age: 456 + } + }, { + type: 'word-smiths', + id: '2', + attributes: { + 'first-name': 'Zelda', + age: 456 + }, + relationships: { + 'posts': { + data: [] } - }] - }); + } + }] }); + }); - test(`when alwaysIncludeLinkageData is true, it contains linkage data for all a collection's relationships, regardless of includes`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer.extend({ - alwaysIncludeLinkageData: true - }) - }); - this.schema.wordSmiths.create({ firstName: 'Link', age: 123 }); - this.schema.wordSmiths.create({ firstName: 'Zelda', age: 456 }); + test(`it includes linkage data for a has-many relationship that's being included`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + wordSmith: JSONAPISerializer.extend({ + include: ['posts'] + }) + }); + let link = this.schema.wordSmiths.create({ firstName: 'Link' }); + link.createPost({ title: 'Lorem' }); + link.createPost({ title: 'Ipsum' }); + this.schema.wordSmiths.create({ firstName: 'Zelda' }); - let collection = this.schema.wordSmiths.all(); - let result = registry.serialize(collection); + let collection = this.schema.wordSmiths.all(); + let result = registry.serialize(collection); - assert.deepEqual(result, { - data: [{ + assert.deepEqual(result, { + data: [ + { type: 'word-smiths', id: '1', attributes: { - 'first-name': 'Link', - age: 123 + 'first-name': 'Link' }, relationships: { 'posts': { - data: [] + data: [ + { type: 'blog-posts', id: '1' }, + { type: 'blog-posts', id: '2' } + ] } } - }, { + }, + { type: 'word-smiths', id: '2', attributes: { - 'first-name': 'Zelda', - age: 456 + 'first-name': 'Zelda' }, relationships: { 'posts': { data: [] } } - }] - }); - }); - - test(`it includes linkage data for a has-many relationship that's being included`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - wordSmith: JSONAPISerializer.extend({ - include: ['posts'] - }) - }); - let link = this.schema.wordSmiths.create({ firstName: 'Link' }); - link.createPost({ title: 'Lorem' }); - link.createPost({ title: 'Ipsum' }); - this.schema.wordSmiths.create({ firstName: 'Zelda' }); - - let collection = this.schema.wordSmiths.all(); - let result = registry.serialize(collection); - - assert.deepEqual(result, { - data: [ - { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - }, - relationships: { - 'posts': { - data: [ - { type: 'blog-posts', id: '1' }, - { type: 'blog-posts', id: '2' } - ] - } - } - }, - { - type: 'word-smiths', - id: '2', - attributes: { - 'first-name': 'Zelda' - }, - relationships: { - 'posts': { - data: [] - } - } + } + ], + included: [ + { + type: 'blog-posts', + id: '1', + attributes: { + title: 'Lorem' } - ], - included: [ - { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - } - }, - { - type: 'blog-posts', - id: '2', - attributes: { - title: 'Ipsum' - } + }, + { + type: 'blog-posts', + id: '2', + attributes: { + title: 'Ipsum' } - ] - }); + } + ] }); + }); - test(`it can serialize a collection with a chain of has-many relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - wordSmith: JSONAPISerializer.extend({ - include: ['posts'] - }), - blogPost: JSONAPISerializer.extend({ - include: ['comments'] - }) - }); + test(`it can serialize a collection with a chain of has-many relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + wordSmith: JSONAPISerializer.extend({ + include: ['posts'] + }), + blogPost: JSONAPISerializer.extend({ + include: ['comments'] + }) + }); - let link = this.schema.wordSmiths.create({ firstName: 'Link' }); - let lorem = link.createPost({ title: 'Lorem' }); - lorem.createComment({ text: 'pwned' }); - link.createPost({ title: 'Ipsum' }); - this.schema.wordSmiths.create({ firstName: 'Zelda' }); + let link = this.schema.wordSmiths.create({ firstName: 'Link' }); + let lorem = link.createPost({ title: 'Lorem' }); + lorem.createComment({ text: 'pwned' }); + link.createPost({ title: 'Ipsum' }); + this.schema.wordSmiths.create({ firstName: 'Zelda' }); - let collection = this.schema.wordSmiths.all(); - let result = registry.serialize(collection); + let collection = this.schema.wordSmiths.all(); + let result = registry.serialize(collection); - assert.deepEqual(result, { - data: [ - { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - }, - relationships: { - 'posts': { - data: [ - { type: 'blog-posts', id: '1' }, - { type: 'blog-posts', id: '2' } - ] - } - } + assert.deepEqual(result, { + data: [ + { + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link' }, - { - type: 'word-smiths', - id: '2', - attributes: { - 'first-name': 'Zelda' - }, - relationships: { - 'posts': { - data: [] - } + relationships: { + 'posts': { + data: [ + { type: 'blog-posts', id: '1' }, + { type: 'blog-posts', id: '2' } + ] } } - ], - included: [ - { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - }, - relationships: { - 'comments': { - data: [ - { type: 'fine-comments', id: '1' } - ] - } + }, + { + type: 'word-smiths', + id: '2', + attributes: { + 'first-name': 'Zelda' + }, + relationships: { + 'posts': { + data: [] } + } + } + ], + included: [ + { + type: 'blog-posts', + id: '1', + attributes: { + title: 'Lorem' }, - { - type: 'fine-comments', - id: '1', - attributes: { - text: 'pwned' + relationships: { + 'comments': { + data: [ + { type: 'fine-comments', id: '1' } + ] } + } + }, + { + type: 'fine-comments', + id: '1', + attributes: { + text: 'pwned' + } + }, + { + type: 'blog-posts', + id: '2', + attributes: { + title: 'Ipsum' }, - { - type: 'blog-posts', - id: '2', - attributes: { - title: 'Ipsum' - }, - relationships: { - 'comments': { - data: [] - } + relationships: { + 'comments': { + data: [] } } - ] - }); + } + ] }); + }); - test(`it can serialize a collection with a belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - include: ['author'] - }) - }); + test(`it can serialize a collection with a belongs-to relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + blogPost: JSONAPISerializer.extend({ + include: ['author'] + }) + }); - let link = this.schema.wordSmiths.create({ firstName: 'Link' }); - let post = link.createPost({ title: 'Lorem' }); - post.createComment(); - link.createPost({ title: 'Ipsum' }); - this.schema.wordSmiths.create({ firstName: 'Zelda' }); + let link = this.schema.wordSmiths.create({ firstName: 'Link' }); + let post = link.createPost({ title: 'Lorem' }); + post.createComment(); + link.createPost({ title: 'Ipsum' }); + this.schema.wordSmiths.create({ firstName: 'Zelda' }); - let blogPosts = this.schema.blogPosts.all(); - let result = registry.serialize(blogPosts); + let blogPosts = this.schema.blogPosts.all(); + let result = registry.serialize(blogPosts); - assert.deepEqual(result, { - data: [ - { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - }, - relationships: { - 'author': { - data: { type: 'word-smiths', id: '1' } - } - } + assert.deepEqual(result, { + data: [ + { + type: 'blog-posts', + id: '1', + attributes: { + title: 'Lorem' }, - { - type: 'blog-posts', - id: '2', - attributes: { - title: 'Ipsum' - }, - relationships: { - 'author': { - data: { type: 'word-smiths', id: '1' } - } + relationships: { + 'author': { + data: { type: 'word-smiths', id: '1' } } } - ], - included: [ - { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' + }, + { + type: 'blog-posts', + id: '2', + attributes: { + title: 'Ipsum' + }, + relationships: { + 'author': { + data: { type: 'word-smiths', id: '1' } } } - ] - }); + } + ], + included: [ + { + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link' + } + } + ] }); + }); - test(`it can serialize a collection with a chain of belongs-to relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - fineComment: JSONAPISerializer.extend({ - include: ['post'] - }), - blogPost: JSONAPISerializer.extend({ - include: ['author'] - }) - }); + test(`it can serialize a collection with a chain of belongs-to relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + fineComment: JSONAPISerializer.extend({ + include: ['post'] + }), + blogPost: JSONAPISerializer.extend({ + include: ['author'] + }) + }); - let link = this.schema.wordSmiths.create({ firstName: 'Link' }); - let post = link.createPost({ title: 'Lorem' }); - post.createComment({ text: 'pwned' }); - link.createPost({ title: 'Ipsum' }); - this.schema.wordSmiths.create({ firstName: 'Zelda' }); + let link = this.schema.wordSmiths.create({ firstName: 'Link' }); + let post = link.createPost({ title: 'Lorem' }); + post.createComment({ text: 'pwned' }); + link.createPost({ title: 'Ipsum' }); + this.schema.wordSmiths.create({ firstName: 'Zelda' }); - let fineComments = this.schema.fineComments.all(); - let result = registry.serialize(fineComments); + let fineComments = this.schema.fineComments.all(); + let result = registry.serialize(fineComments); - assert.deepEqual(result, { - data: [ - { - type: 'fine-comments', - id: '1', - attributes: { - text: 'pwned' - }, - relationships: { - 'post': { - data: { type: 'blog-posts', id: '1' } - } + assert.deepEqual(result, { + data: [ + { + type: 'fine-comments', + id: '1', + attributes: { + text: 'pwned' + }, + relationships: { + 'post': { + data: { type: 'blog-posts', id: '1' } } } - ], - included: [ - { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - }, - relationships: { - 'author': { - data: { type: 'word-smiths', id: '1' } - } - } + } + ], + included: [ + { + type: 'blog-posts', + id: '1', + attributes: { + title: 'Lorem' }, - { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' + relationships: { + 'author': { + data: { type: 'word-smiths', id: '1' } } } - ] - }); + }, + { + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link' + } + } + ] }); + }); - test(`it propertly serializes complex relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - include: ['author', 'comments'] - }), - wordSmith: JSONAPISerializer.extend({ - include: ['posts'] - }), - fineComment: JSONAPISerializer.extend({ - include: ['post'] - }) - }); + test(`it propertly serializes complex relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + blogPost: JSONAPISerializer.extend({ + include: ['author', 'comments'] + }), + wordSmith: JSONAPISerializer.extend({ + include: ['posts'] + }), + fineComment: JSONAPISerializer.extend({ + include: ['post'] + }) + }); - let link = this.schema.wordSmiths.create({ firstName: 'Link' }); - let post = link.createPost({ title: 'Lorem' }); - post.createComment({ text: 'pwned' }); - link.createPost({ title: 'Ipsum' }); - this.schema.wordSmiths.create({ firstName: 'Zelda' }); + let link = this.schema.wordSmiths.create({ firstName: 'Link' }); + let post = link.createPost({ title: 'Lorem' }); + post.createComment({ text: 'pwned' }); + link.createPost({ title: 'Ipsum' }); + this.schema.wordSmiths.create({ firstName: 'Zelda' }); - let blogPost = this.schema.blogPosts.find(1); - let result = registry.serialize(blogPost); + let blogPost = this.schema.blogPosts.find(1); + let result = registry.serialize(blogPost); - assert.deepEqual(result, { - data: { - type: 'blog-posts', + assert.deepEqual(result, { + data: { + type: 'blog-posts', + id: '1', + attributes: { + title: 'Lorem' + }, + relationships: { + 'author': { + data: { type: 'word-smiths', id: '1' } + }, + 'comments': { + data: [{ type: 'fine-comments', id: '1' }] + } + } + }, + included: [ + { + type: 'word-smiths', id: '1', attributes: { - title: 'Lorem' + 'first-name': 'Link' }, relationships: { - 'author': { - data: { type: 'word-smiths', id: '1' } - }, - 'comments': { - data: [{ type: 'fine-comments', id: '1' }] + 'posts': { + data: [ + { + id: '1', + type: 'blog-posts' + }, + { + id: '2', + type: 'blog-posts' + } + ] } } }, - included: [ - { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - }, - relationships: { - 'posts': { - data: [ - { - id: '1', - type: 'blog-posts' - }, - { - id: '2', - type: 'blog-posts' - } - ] - } - } + { + type: 'blog-posts', + id: '2', + attributes: { + 'title': 'Ipsum' }, - { - type: 'blog-posts', - id: '2', - attributes: { - 'title': 'Ipsum' + relationships: { + author: { + data: { type: 'word-smiths', id: '1' } }, - relationships: { - author: { - data: { type: 'word-smiths', id: '1' } - }, - comments: { - data: [] - } + comments: { + data: [] } + } + }, + { + type: 'fine-comments', + id: '1', + attributes: { + 'text': 'pwned' }, - { - type: 'fine-comments', - id: '1', - attributes: { - 'text': 'pwned' - }, - relationships: { - 'post': { - data: { - id: '1', - type: 'blog-posts' - } + relationships: { + 'post': { + data: { + id: '1', + type: 'blog-posts' } } } - ] - }); - + } + ] }); - } -); + + }); +}); diff --git a/tests/integration/serializers/json-api-serializer/associations/includes-test.js b/tests/integration/serializers/json-api-serializer/associations/includes-test.js index 9710f494c..342ed4819 100644 --- a/tests/integration/serializers/json-api-serializer/associations/includes-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/includes-test.js @@ -4,97 +4,152 @@ import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { JSONAPISerializer, Model, hasMany, belongsTo } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module( - 'Integration | Serializers | JSON API Serializer | Associations | Includes', - function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - blogPosts: hasMany() - }), +module('Integration | Serializers | JSON API Serializer | Associations | Includes', function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + blogPosts: hasMany() + }), - blogPost: Model.extend({ - wordSmith: belongsTo(), - fineComments: hasMany() - }), + blogPost: Model.extend({ + wordSmith: belongsTo(), + fineComments: hasMany() + }), - fineComment: Model.extend({ - blogPost: belongsTo(), - category: belongsTo() - }), + fineComment: Model.extend({ + blogPost: belongsTo(), + category: belongsTo() + }), - category: Model.extend({ - labels: hasMany() - }), + category: Model.extend({ + labels: hasMany() + }), - label: Model.extend({ + label: Model.extend({ - }) - }); + }) }); + }); - test('includes get serialized with correct serializer', function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - attrs: ['title'], - include: ['wordSmith'] - }), - wordSmith: JSONAPISerializer.extend({ - attrs: ['firstName'] - }) - }); + test('includes get serialized with correct serializer', function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + blogPost: JSONAPISerializer.extend({ + attrs: ['title'], + include: ['wordSmith'] + }), + wordSmith: JSONAPISerializer.extend({ + attrs: ['firstName'] + }) + }); - let post = this.schema.blogPosts.create({ title: 'We love Mirage!' }); - post.createWordSmith({ firstName: 'Sam' }); + let post = this.schema.blogPosts.create({ title: 'We love Mirage!' }); + post.createWordSmith({ firstName: 'Sam' }); - let result = registry.serialize(post); + let result = registry.serialize(post); - assert.propEqual(result, { - data: { - type: 'blog-posts', + assert.propEqual(result, { + data: { + type: 'blog-posts', + id: '1', + attributes: { + 'title': 'We love Mirage!' + }, + relationships: { + 'word-smith': { + data: { type: 'word-smiths', id: '1' } + } + } + }, + included: [ + { + type: 'word-smiths', id: '1', attributes: { - 'title': 'We love Mirage!' + 'first-name': 'Sam' + } + } + ] + }); + }); + + test('query param includes work when serializing a model', function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer + }); + + let post = this.schema.blogPosts.create(); + post.createWordSmith(); + post.createFineComment(); + post.createFineComment(); + + let request = { + queryParams: { + include: 'word-smith,fine-comments' + } + }; + + let result = registry.serialize(post, request); + + assert.propEqual(result, { + data: { + type: 'blog-posts', + id: '1', + attributes: {}, + relationships: { + 'word-smith': { + data: { type: 'word-smiths', id: '1' } }, - relationships: { - 'word-smith': { - data: { type: 'word-smiths', id: '1' } - } + 'fine-comments': { + data: [ + { type: 'fine-comments', id: '1' }, + { type: 'fine-comments', id: '2' } + ] } + } + }, + included: [ + { + type: 'word-smiths', + id: '1', + attributes: {} }, - included: [ - { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Sam' - } - } - ] - }); + { + type: 'fine-comments', + id: '1', + attributes: {} + }, + { + type: 'fine-comments', + id: '2', + attributes: {} + } + ] }); + }); - test('query param includes work when serializing a model', function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer - }); + test('query param includes work when serializing a collection', function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer + }); - let post = this.schema.blogPosts.create(); - post.createWordSmith(); - post.createFineComment(); - post.createFineComment(); + let post1 = this.schema.blogPosts.create(); + post1.createWordSmith(); + post1.createFineComment(); + post1.createFineComment(); + this.schema.blogPosts.create(); - let request = { - queryParams: { - include: 'word-smith,fine-comments' - } - }; + let request = { + queryParams: { + include: 'word-smith,fine-comments' + } + }; - let result = registry.serialize(post, request); + let result = registry.serialize(this.schema.blogPosts.all(), request); - assert.propEqual(result, { - data: { + assert.propEqual(result, { + data: [ + { type: 'blog-posts', id: '1', attributes: {}, @@ -110,178 +165,215 @@ module( } } }, - included: [ - { - type: 'word-smiths', - id: '1', - attributes: {} - }, - { - type: 'fine-comments', - id: '1', - attributes: {} - }, - { - type: 'fine-comments', - id: '2', - attributes: {} + { + type: 'blog-posts', + id: '2', + attributes: {}, + relationships: { + 'word-smith': { + data: null + }, + 'fine-comments': { + data: [] + } } - ] - }); + } + ], + included: [ + { + type: 'word-smiths', + id: '1', + attributes: {} + }, + { + type: 'fine-comments', + id: '1', + attributes: {} + }, + { + type: 'fine-comments', + id: '2', + attributes: {} + } + ] }); + }); - test('query param includes work when serializing a collection', function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer - }); + test('query param includes take precedence over default server includes', function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + blogPost: JSONAPISerializer.extend({ + include: ['wordSmith'] + }) + }); - let post1 = this.schema.blogPosts.create(); - post1.createWordSmith(); - post1.createFineComment(); - post1.createFineComment(); - this.schema.blogPosts.create(); + let post = this.schema.blogPosts.create(); + post.createWordSmith(); + post.createFineComment(); + post.createFineComment(); - let request = { - queryParams: { - include: 'word-smith,fine-comments' - } - }; + let request = { + queryParams: { + include: 'fine-comments' + } + }; - let result = registry.serialize(this.schema.blogPosts.all(), request); + let result = registry.serialize(post, request); - assert.propEqual(result, { - data: [ - { - type: 'blog-posts', - id: '1', - attributes: {}, - relationships: { - 'word-smith': { - data: { type: 'word-smiths', id: '1' } - }, - 'fine-comments': { - data: [ - { type: 'fine-comments', id: '1' }, - { type: 'fine-comments', id: '2' } - ] - } - } - }, - { - type: 'blog-posts', - id: '2', - attributes: {}, - relationships: { - 'word-smith': { - data: null - }, - 'fine-comments': { - data: [] - } - } - } - ], - included: [ - { - type: 'word-smiths', - id: '1', - attributes: {} - }, - { - type: 'fine-comments', - id: '1', - attributes: {} - }, - { - type: 'fine-comments', - id: '2', - attributes: {} + assert.propEqual(result, { + data: { + type: 'blog-posts', + id: '1', + attributes: {}, + relationships: { + 'fine-comments': { + data: [ + { type: 'fine-comments', id: '1' }, + { type: 'fine-comments', id: '2' } + ] } - ] - }); + } + }, + included: [ + { + type: 'fine-comments', + id: '1', + attributes: {} + }, + { + type: 'fine-comments', + id: '2', + attributes: {} + } + ] }); + }); - test('query param includes take precedence over default server includes', function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - include: ['wordSmith'] - }) - }); + test('query param includes support dot-paths when serializing a model', function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer + }); - let post = this.schema.blogPosts.create(); - post.createWordSmith(); - post.createFineComment(); - post.createFineComment(); + this.schema.db.loadData({ + wordSmiths: [ + { id: 1, name: 'Sam', blogPostIds: [2] } + ], + blogPosts: [ + { id: 2, wordSmithId: 1, fineCommentIds: [3], title: 'Lorem Ipsum' } + ], + fineComments: [ + { id: 3, text: 'Foo', blogPostId: 2, categoryId: 10 } + ], + categories: [ + { id: 10, foo: 'bar', labelIds: [20] } + ], + labels: [ + { id: 20, name: 'Economics' } + ] + }); + let request = { + queryParams: { + include: 'word-smith,fine-comments.category.labels' + } + }; + let result = registry.serialize(this.schema.blogPosts.first(), request); - let request = { - queryParams: { - include: 'fine-comments' + assert.propEqual(result, { + data: { + type: 'blog-posts', + id: '2', + attributes: { + title: 'Lorem Ipsum' + }, + relationships: { + 'word-smith': { + data: { type: 'word-smiths', id: '1' } + }, + 'fine-comments': { + data: [ + { type: 'fine-comments', id: '3' } + ] + } } - }; - - let result = registry.serialize(post, request); - - assert.propEqual(result, { - data: { - type: 'blog-posts', + }, + included: [ + { + type: 'word-smiths', id: '1', - attributes: {}, + attributes: { + name: 'Sam' + } + }, + { + type: 'fine-comments', + id: '3', + attributes: { + text: 'Foo' + }, relationships: { - 'fine-comments': { + 'category': { + data: { type: 'categories', id: '10' } + } + } + }, + { + type: 'categories', + id: '10', + attributes: { + foo: 'bar' + }, + relationships: { + 'labels': { data: [ - { type: 'fine-comments', id: '1' }, - { type: 'fine-comments', id: '2' } + { type: 'labels', id: '20' } ] } } }, - included: [ - { - type: 'fine-comments', - id: '1', - attributes: {} - }, - { - type: 'fine-comments', - id: '2', - attributes: {} + { + type: 'labels', + id: '20', + attributes: { + name: 'Economics' } - ] - }); + } + ] }); + }); - test('query param includes support dot-paths when serializing a model', function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer - }); + test('query param includes support dot-paths when serializing a collection', function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer + }); - this.schema.db.loadData({ - wordSmiths: [ - { id: 1, name: 'Sam', blogPostIds: [2] } - ], - blogPosts: [ - { id: 2, wordSmithId: 1, fineCommentIds: [3], title: 'Lorem Ipsum' } - ], - fineComments: [ - { id: 3, text: 'Foo', blogPostId: 2, categoryId: 10 } - ], - categories: [ - { id: 10, foo: 'bar', labelIds: [20] } - ], - labels: [ - { id: 20, name: 'Economics' } - ] - }); - let request = { - queryParams: { - include: 'word-smith,fine-comments.category.labels' - } - }; - let result = registry.serialize(this.schema.blogPosts.first(), request); + this.schema.db.loadData({ + wordSmiths: [ + { id: 1, name: 'Sam', blogPostIds: [2, 5] } + ], + blogPosts: [ + { id: 2, wordSmithId: 1, fineCommentIds: [3], title: 'Lorem Ipsum' }, + { id: 5, wordSmithId: 1, title: 'Dolor' } + ], + fineComments: [ + { id: 3, text: 'Foo', blogPostId: 2, categoryId: 10 } + ], + categories: [ + { id: 10, foo: 'bar', labelIds: [20] } + ], + labels: [ + { id: 20, name: 'Economics' } + ] + }); + let request = { + queryParams: { + include: 'word-smith,fine-comments.category.labels' + } + }; + let result = registry.serialize(this.schema.blogPosts.all(), request); - assert.propEqual(result, { - data: { + assert.propEqual(result, { + data: [ + { type: 'blog-posts', id: '2', attributes: { @@ -298,159 +390,64 @@ module( } } }, - included: [ - { - type: 'word-smiths', - id: '1', - attributes: { - name: 'Sam' - } - }, - { - type: 'fine-comments', - id: '3', - attributes: { - text: 'Foo' - }, - relationships: { - 'category': { - data: { type: 'categories', id: '10' } - } - } + { + type: 'blog-posts', + id: '5', + attributes: { + title: 'Dolor' }, - { - type: 'categories', - id: '10', - attributes: { - foo: 'bar' + relationships: { + 'word-smith': { + data: { type: 'word-smiths', id: '1' } }, - relationships: { - 'labels': { - data: [ - { type: 'labels', id: '20' } - ] - } - } - }, - { - type: 'labels', - id: '20', - attributes: { - name: 'Economics' + 'fine-comments': { + data: [] } } - ] - }); - }); - - test('query param includes support dot-paths when serializing a collection', function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer - }); - - this.schema.db.loadData({ - wordSmiths: [ - { id: 1, name: 'Sam', blogPostIds: [2, 5] } - ], - blogPosts: [ - { id: 2, wordSmithId: 1, fineCommentIds: [3], title: 'Lorem Ipsum' }, - { id: 5, wordSmithId: 1, title: 'Dolor' } - ], - fineComments: [ - { id: 3, text: 'Foo', blogPostId: 2, categoryId: 10 } - ], - categories: [ - { id: 10, foo: 'bar', labelIds: [20] } - ], - labels: [ - { id: 20, name: 'Economics' } - ] - }); - let request = { - queryParams: { - include: 'word-smith,fine-comments.category.labels' } - }; - let result = registry.serialize(this.schema.blogPosts.all(), request); - - assert.propEqual(result, { - data: [ - { - type: 'blog-posts', - id: '2', - attributes: { - title: 'Lorem Ipsum' - }, - relationships: { - 'word-smith': { - data: { type: 'word-smiths', id: '1' } - }, - 'fine-comments': { - data: [ - { type: 'fine-comments', id: '3' } - ] - } - } - }, - { - type: 'blog-posts', - id: '5', - attributes: { - title: 'Dolor' - }, - relationships: { - 'word-smith': { - data: { type: 'word-smiths', id: '1' } - }, - 'fine-comments': { - data: [] - } - } + ], + included: [ + { + type: 'word-smiths', + id: '1', + attributes: { + name: 'Sam' } - ], - included: [ - { - type: 'word-smiths', - id: '1', - attributes: { - name: 'Sam' - } - }, - { - type: 'fine-comments', - id: '3', - attributes: { - text: 'Foo' - }, - relationships: { - 'category': { - data: { type: 'categories', id: '10' } - } - } + }, + { + type: 'fine-comments', + id: '3', + attributes: { + text: 'Foo' }, - { - type: 'categories', - id: '10', - attributes: { - foo: 'bar' - }, - relationships: { - 'labels': { - data: [ - { type: 'labels', id: '20' } - ] - } + relationships: { + 'category': { + data: { type: 'categories', id: '10' } } + } + }, + { + type: 'categories', + id: '10', + attributes: { + foo: 'bar' }, - { - type: 'labels', - id: '20', - attributes: { - name: 'Economics' + relationships: { + 'labels': { + data: [ + { type: 'labels', id: '20' } + ] } } - ] - }); + }, + { + type: 'labels', + id: '20', + attributes: { + name: 'Economics' + } + } + ] }); - } -); + }); +}); diff --git a/tests/integration/serializers/json-api-serializer/associations/key-for-relationship-test.js b/tests/integration/serializers/json-api-serializer/associations/key-for-relationship-test.js index 50a2edb69..b4427e6bf 100644 --- a/tests/integration/serializers/json-api-serializer/associations/key-for-relationship-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/key-for-relationship-test.js @@ -5,67 +5,64 @@ import { Model, hasMany, JSONAPISerializer } from 'ember-cli-mirage'; import { underscore } from 'ember-cli-mirage/utils/inflector'; import { module, test } from 'qunit'; -module( - 'Integration | Serializers | JSON API Serializer | Key for relationship', - function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - blogPosts: hasMany() - }), - blogPost: Model - }); +module('Integration | Serializers | JSON API Serializer | Key for relationship', function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + blogPosts: hasMany() + }), + blogPost: Model }); + }); - test(`keyForRelationship works`, function(assert) { - let ApplicationSerializer = JSONAPISerializer.extend({ - keyForRelationship(key) { - return underscore(key); - } - }); - let registry = new SerializerRegistry(this.schema, { - application: ApplicationSerializer, - wordSmith: ApplicationSerializer.extend({ - include: ['blogPosts'] - }) - }); - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - firstName: 'Link', - lastName: 'Jackson', - age: 323 - }); - wordSmith.createBlogPost({ title: 'Lorem ipsum' }); + test(`keyForRelationship works`, function(assert) { + let ApplicationSerializer = JSONAPISerializer.extend({ + keyForRelationship(key) { + return underscore(key); + } + }); + let registry = new SerializerRegistry(this.schema, { + application: ApplicationSerializer, + wordSmith: ApplicationSerializer.extend({ + include: ['blogPosts'] + }) + }); + let wordSmith = this.schema.wordSmiths.create({ + id: 1, + firstName: 'Link', + lastName: 'Jackson', + age: 323 + }); + wordSmith.createBlogPost({ title: 'Lorem ipsum' }); - let result = registry.serialize(wordSmith); + let result = registry.serialize(wordSmith); - assert.deepEqual(result, { - data: { - type: 'word-smiths', - id: '1', - attributes: { - age: 323, - 'first-name': 'Link', - 'last-name': 'Jackson' - }, - relationships: { - 'blog_posts': { - data: [ - { id: '1', type: 'blog-posts' } - ] - } - } + assert.deepEqual(result, { + data: { + type: 'word-smiths', + id: '1', + attributes: { + age: 323, + 'first-name': 'Link', + 'last-name': 'Jackson' }, - included: [ - { - attributes: { - title: "Lorem ipsum" - }, - id: "1", - type: "blog-posts" + relationships: { + 'blog_posts': { + data: [ + { id: '1', type: 'blog-posts' } + ] } - ] - }); + } + }, + included: [ + { + attributes: { + title: "Lorem ipsum" + }, + id: "1", + type: "blog-posts" + } + ] }); - } -); + }); +}); diff --git a/tests/integration/serializers/json-api-serializer/associations/links-test.js b/tests/integration/serializers/json-api-serializer/associations/links-test.js index d63f4b54b..074dfe986 100644 --- a/tests/integration/serializers/json-api-serializer/associations/links-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/links-test.js @@ -4,132 +4,129 @@ import { module, test } from 'qunit'; import Db from 'ember-cli-mirage/db'; import Schema from 'ember-cli-mirage/orm/schema'; -module( - 'Integration | Serializers | JSON API Serializer | Associations | Links', - function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - blogPosts: hasMany() - }), - blogPost: Model.extend({ - wordSmith: belongsTo(), - fineComments: hasMany() - }), - fineComment: Model.extend({ - blogPost: belongsTo() - }) - }); +module('Integration | Serializers | JSON API Serializer | Associations | Links', function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + blogPosts: hasMany() + }), + blogPost: Model.extend({ + wordSmith: belongsTo(), + fineComments: hasMany() + }), + fineComment: Model.extend({ + blogPost: belongsTo() + }) }); + }); - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); + hooks.afterEach(function() { + this.schema.db.emptyData(); + }); - test(`it supports links`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - links(model) { - return { - 'wordSmith': { - related: `/api/word_smiths/${model.wordSmith.id}`, - self: `/api/blog_posts/${model.id}/relationships/word_smith` - }, - 'fineComments': { - related: `/api/fine_comments?blog_post_id=${model.id}`, - self: `/api/blog_posts/${model.id}/relationships/fine_comments` - } - }; - } - }) - }); + test(`it supports links`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + blogPost: JSONAPISerializer.extend({ + links(model) { + return { + 'wordSmith': { + related: `/api/word_smiths/${model.wordSmith.id}`, + self: `/api/blog_posts/${model.id}/relationships/word_smith` + }, + 'fineComments': { + related: `/api/fine_comments?blog_post_id=${model.id}`, + self: `/api/blog_posts/${model.id}/relationships/fine_comments` + } + }; + } + }) + }); - let link = this.schema.wordSmiths.create({ id: 3, name: 'Link' }); // specify id to really test our links function - let blogPost = link.createBlogPost({ title: 'Lorem ipsum' }); + let link = this.schema.wordSmiths.create({ id: 3, name: 'Link' }); // specify id to really test our links function + let blogPost = link.createBlogPost({ title: 'Lorem ipsum' }); - let result = registry.serialize(blogPost); + let result = registry.serialize(blogPost); - assert.deepEqual(result, { - data: { - type: 'blog-posts', - id: blogPost.id, - attributes: { - 'title': 'Lorem ipsum' + assert.deepEqual(result, { + data: { + type: 'blog-posts', + id: blogPost.id, + attributes: { + 'title': 'Lorem ipsum' + }, + relationships: { + 'word-smith': { + links: { + related: `/api/word_smiths/${link.id}`, + self: `/api/blog_posts/${blogPost.id}/relationships/word_smith` + } }, - relationships: { - 'word-smith': { - links: { - related: `/api/word_smiths/${link.id}`, - self: `/api/blog_posts/${blogPost.id}/relationships/word_smith` - } - }, - 'fine-comments': { - links: { - related: `/api/fine_comments?blog_post_id=${blogPost.id}`, - self: `/api/blog_posts/${blogPost.id}/relationships/fine_comments` - } + 'fine-comments': { + links: { + related: `/api/fine_comments?blog_post_id=${blogPost.id}`, + self: `/api/blog_posts/${blogPost.id}/relationships/fine_comments` } } } - }); + } }); + }); - test(`it supports links alongside data linkage`, function(assert) { - let ApplicationSerializer = JSONAPISerializer.extend({ - alwaysIncludeLinkageData: true - }); - let registry = new SerializerRegistry(this.schema, { - application: ApplicationSerializer, - blogPost: ApplicationSerializer.extend({ - links(model) { - return { - 'wordSmith': { - related: `/api/word_smiths/${model.wordSmith.id}`, - self: `/api/blog_posts/${model.id}/relationships/word_smith` - }, - 'fineComments': { - related: `/api/fine_comments?blog_post_id=${model.id}`, - self: `/api/blog_posts/${model.id}/relationships/fine_comments` - } - }; - } - }) - }); + test(`it supports links alongside data linkage`, function(assert) { + let ApplicationSerializer = JSONAPISerializer.extend({ + alwaysIncludeLinkageData: true + }); + let registry = new SerializerRegistry(this.schema, { + application: ApplicationSerializer, + blogPost: ApplicationSerializer.extend({ + links(model) { + return { + 'wordSmith': { + related: `/api/word_smiths/${model.wordSmith.id}`, + self: `/api/blog_posts/${model.id}/relationships/word_smith` + }, + 'fineComments': { + related: `/api/fine_comments?blog_post_id=${model.id}`, + self: `/api/blog_posts/${model.id}/relationships/fine_comments` + } + }; + } + }) + }); - let link = this.schema.wordSmiths.create({ id: 3, name: 'Link' }); // specify id to really test our links function - let blogPost = link.createBlogPost({ title: 'Lorem ipsum' }); + let link = this.schema.wordSmiths.create({ id: 3, name: 'Link' }); // specify id to really test our links function + let blogPost = link.createBlogPost({ title: 'Lorem ipsum' }); - let result = registry.serialize(blogPost); + let result = registry.serialize(blogPost); - assert.deepEqual(result, { - data: { - type: 'blog-posts', - id: blogPost.id, - attributes: { - 'title': 'Lorem ipsum' - }, - relationships: { - 'word-smith': { - "data": { - "id": "3", - "type": "word-smiths" - }, - links: { - related: `/api/word_smiths/${link.id}`, - self: `/api/blog_posts/${blogPost.id}/relationships/word_smith` - } + assert.deepEqual(result, { + data: { + type: 'blog-posts', + id: blogPost.id, + attributes: { + 'title': 'Lorem ipsum' + }, + relationships: { + 'word-smith': { + "data": { + "id": "3", + "type": "word-smiths" }, - 'fine-comments': { - data: [], - links: { - related: `/api/fine_comments?blog_post_id=${blogPost.id}`, - self: `/api/blog_posts/${blogPost.id}/relationships/fine_comments` - } + links: { + related: `/api/word_smiths/${link.id}`, + self: `/api/blog_posts/${blogPost.id}/relationships/word_smith` + } + }, + 'fine-comments': { + data: [], + links: { + related: `/api/fine_comments?blog_post_id=${blogPost.id}`, + self: `/api/blog_posts/${blogPost.id}/relationships/fine_comments` } } } - }); + } }); - } -); + }); +}); diff --git a/tests/integration/serializers/json-api-serializer/associations/many-to-many-test.js b/tests/integration/serializers/json-api-serializer/associations/many-to-many-test.js index ec035ee4c..e6a89fa71 100644 --- a/tests/integration/serializers/json-api-serializer/associations/many-to-many-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/many-to-many-test.js @@ -4,113 +4,60 @@ import Db from 'ember-cli-mirage/db'; import Schema from 'ember-cli-mirage/orm/schema'; import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -module( - 'Integration | Serializers | JSON API Serializer | Associations | Many To Many', - function(hooks) { - hooks.beforeEach(function() { - let db = new Db(); - - let schema = new Schema(db, { - contact: Model.extend({ - addresses: hasMany(), - contactAddresses: hasMany() - }), - address: Model.extend({ - contacts: hasMany(), - contactAddresses: hasMany() - }), - contactAddress: Model.extend({ - contact: belongsTo(), - address: belongsTo() - }) - }); - - let mario = schema.contacts.create({ name: 'Mario' }); - let newYork = schema.addresses.create({ street: 'Some New York Street' }); - let mushroomKingdom = schema.addresses.create({ street: 'Some Mushroom Kingdom Street' }); - - schema.contactAddresses.create({ contact: mario, address: newYork }); - schema.contactAddresses.create({ contact: mario, address: mushroomKingdom }); - - this.schema = schema; +module('Integration | Serializers | JSON API Serializer | Associations | Many To Many', function(hooks) { + hooks.beforeEach(function() { + let db = new Db(); + + let schema = new Schema(db, { + contact: Model.extend({ + addresses: hasMany(), + contactAddresses: hasMany() + }), + address: Model.extend({ + contacts: hasMany(), + contactAddresses: hasMany() + }), + contactAddress: Model.extend({ + contact: belongsTo(), + address: belongsTo() + }) }); - skip(`it serializes manyToMany if properly configured to passthrough `, function(assert) { - let contactSerializer = JSONAPISerializer.extend({ - addresses(model) { - let models = model.contactAddresses.models.map((ca) => ca.address); - return new Collection('address', models); - } - }); + let mario = schema.contacts.create({ name: 'Mario' }); + let newYork = schema.addresses.create({ street: 'Some New York Street' }); + let mushroomKingdom = schema.addresses.create({ street: 'Some Mushroom Kingdom Street' }); - let addressSerializer = JSONAPISerializer.extend({ - contacts(model) { - let models = model.contactAddresses.models.map((ca) => ca.contact); - return new Collection('contact', models); - } - }); - - let registry = new SerializerRegistry(this.schema, { - address: addressSerializer, - contact: contactSerializer - }); - - let contact = this.schema.contacts.find(1); - let result = registry.serialize(contact); - - assert.deepEqual(result, { - data: { - id: '1', - type: 'contacts', - attributes: { - name: 'Mario' - }, - relationships: { - addresses: { - data: [ - { id: '1', type: 'addresses' }, - { id: '2', type: 'addresses' } - ] - }, - 'contact-addresses': { - data: [ - { id: '1', type: 'contact-addresses' }, - { id: '2', type: 'contact-addresses' } - ] - } - } - } - }); - }); + schema.contactAddresses.create({ contact: mario, address: newYork }); + schema.contactAddresses.create({ contact: mario, address: mushroomKingdom }); - skip(`it sideloads manyToMany if properly configured to passthrough and include`, function(assert) { - let contactSerializer = JSONAPISerializer.extend({ - include: ['addresses'], - addresses(model) { - let models = model.contactAddresses.models.map((ca) => ca.address); - return new Collection('address', models); - } - }); + this.schema = schema; + }); - let addressSerializer = JSONAPISerializer.extend({ - include: ['contacts'], - contacts(model) { - let models = model.contactAddresses.models.map((ca) => ca.contact); - return new Collection('contact', models); - } - }); + skip(`it serializes manyToMany if properly configured to passthrough `, function(assert) { + let contactSerializer = JSONAPISerializer.extend({ + addresses(model) { + let models = model.contactAddresses.models.map((ca) => ca.address); + return new Collection('address', models); + } + }); - let registry = new SerializerRegistry(this.schema, { - address: addressSerializer, - contact: contactSerializer - }); + let addressSerializer = JSONAPISerializer.extend({ + contacts(model) { + let models = model.contactAddresses.models.map((ca) => ca.contact); + return new Collection('contact', models); + } + }); - let contact = this.schema.contacts.find(1); - let result = registry.serialize(contact); + let registry = new SerializerRegistry(this.schema, { + address: addressSerializer, + contact: contactSerializer + }); - let { data, included } = result; + let contact = this.schema.contacts.find(1); + let result = registry.serialize(contact); - assert.deepEqual(data, { + assert.deepEqual(result, { + data: { id: '1', type: 'contacts', attributes: { @@ -130,29 +77,79 @@ module( ] } } - }); + } + }); + }); + + skip(`it sideloads manyToMany if properly configured to passthrough and include`, function(assert) { + let contactSerializer = JSONAPISerializer.extend({ + include: ['addresses'], + addresses(model) { + let models = model.contactAddresses.models.map((ca) => ca.address); + return new Collection('address', models); + } + }); - assert.deepEqual(included, [{ - id: '1', - type: 'addresses', - attributes: { - street: 'Some New York Street' - }, - relationships: { - contacts: { data: [{ id: '1', type: 'contacts' }] }, - 'contact-addresses': { data: [{ id: '1', type: 'contact-addresses' }] } - } - }, { - id: '2', - type: 'addresses', - attributes: { - street: 'Some Mushroom Kingdom Street' + let addressSerializer = JSONAPISerializer.extend({ + include: ['contacts'], + contacts(model) { + let models = model.contactAddresses.models.map((ca) => ca.contact); + return new Collection('contact', models); + } + }); + + let registry = new SerializerRegistry(this.schema, { + address: addressSerializer, + contact: contactSerializer + }); + + let contact = this.schema.contacts.find(1); + let result = registry.serialize(contact); + + let { data, included } = result; + + assert.deepEqual(data, { + id: '1', + type: 'contacts', + attributes: { + name: 'Mario' + }, + relationships: { + addresses: { + data: [ + { id: '1', type: 'addresses' }, + { id: '2', type: 'addresses' } + ] }, - relationships: { - contacts: { data: [{ id: '1', type: 'contacts' }] }, - 'contact-addresses': { data: [{ id: '2', type: 'contact-addresses' }] } + 'contact-addresses': { + data: [ + { id: '1', type: 'contact-addresses' }, + { id: '2', type: 'contact-addresses' } + ] } - }]); + } }); - } -); + + assert.deepEqual(included, [{ + id: '1', + type: 'addresses', + attributes: { + street: 'Some New York Street' + }, + relationships: { + contacts: { data: [{ id: '1', type: 'contacts' }] }, + 'contact-addresses': { data: [{ id: '1', type: 'contact-addresses' }] } + } + }, { + id: '2', + type: 'addresses', + attributes: { + street: 'Some Mushroom Kingdom Street' + }, + relationships: { + contacts: { data: [{ id: '1', type: 'contacts' }] }, + 'contact-addresses': { data: [{ id: '2', type: 'contact-addresses' }] } + } + }]); + }); +}); diff --git a/tests/integration/serializers/json-api-serializer/associations/model-test.js b/tests/integration/serializers/json-api-serializer/associations/model-test.js index 256763c70..bb81975ab 100644 --- a/tests/integration/serializers/json-api-serializer/associations/model-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/model-test.js @@ -4,218 +4,304 @@ import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { Model, hasMany, belongsTo, JSONAPISerializer } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module( - 'Integration | Serializers | JSON API Serializer | Associations | Model', - function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - blogPosts: hasMany() - }), - blogPost: Model.extend({ - wordSmith: belongsTo(), - fineComments: hasMany() - }), - fineComment: Model.extend({ - blogPost: belongsTo() - }) - }); +module('Integration | Serializers | JSON API Serializer | Associations | Model', function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + blogPosts: hasMany() + }), + blogPost: Model.extend({ + wordSmith: belongsTo(), + fineComments: hasMany() + }), + fineComment: Model.extend({ + blogPost: belongsTo() + }) }); + }); - test(`by default, it doesn't include a model's relationships if those relationships are not included in the document and no links are defined`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer - }); - let link = this.schema.wordSmiths.create({ - firstName: 'Link', - age: 123 - }); - let post = link.createBlogPost({ title: 'Lorem ipsum' }); + test(`by default, it doesn't include a model's relationships if those relationships are not included in the document and no links are defined`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer + }); + let link = this.schema.wordSmiths.create({ + firstName: 'Link', + age: 123 + }); + let post = link.createBlogPost({ title: 'Lorem ipsum' }); - let result = registry.serialize(post); - assert.deepEqual(result, { - data: { - type: 'blog-posts', - id: '1', - attributes: { - 'title': 'Lorem ipsum' + let result = registry.serialize(post); + assert.deepEqual(result, { + data: { + type: 'blog-posts', + id: '1', + attributes: { + 'title': 'Lorem ipsum' + } + } + }); + }); + + test(`when alwaysIncludeLinkageData is true, it contains linkage data for all a model's relationships, regardless of includes`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer.extend({ + alwaysIncludeLinkageData: true + }) + }); + let link = this.schema.wordSmiths.create({ + firstName: 'Link', + age: 123 + }); + let post = link.createBlogPost({ title: 'Lorem ipsum' }); + + let result = registry.serialize(post); + assert.deepEqual(result, { + data: { + type: 'blog-posts', + id: '1', + attributes: { + 'title': 'Lorem ipsum' + }, + relationships: { + 'word-smith': { + data: { + type: 'word-smiths', + id: '1' + } + }, + 'fine-comments': { + data: [] } } - }); + } }); + }); - test(`when alwaysIncludeLinkageData is true, it contains linkage data for all a model's relationships, regardless of includes`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer.extend({ - alwaysIncludeLinkageData: true - }) - }); - let link = this.schema.wordSmiths.create({ - firstName: 'Link', - age: 123 - }); - let post = link.createBlogPost({ title: 'Lorem ipsum' }); + test(`it includes linkage data for a has-many relationship that's being included`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + wordSmith: JSONAPISerializer.extend({ + include: ['blogPosts'] + }) + }); - let result = registry.serialize(post); - assert.deepEqual(result, { - data: { + let link = this.schema.wordSmiths.create({ firstName: 'Link' }); + link.createBlogPost({ title: 'Lorem' }); + link.createBlogPost({ title: 'Ipsum' }); + + let result = registry.serialize(link); + + assert.deepEqual(result, { + data: { + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link' + }, + relationships: { + 'blog-posts': { + data: [ + { type: 'blog-posts', id: '1' }, + { type: 'blog-posts', id: '2' } + ] + } + } + }, + included: [ + { type: 'blog-posts', id: '1', attributes: { - 'title': 'Lorem ipsum' - }, - relationships: { - 'word-smith': { - data: { - type: 'word-smiths', - id: '1' - } - }, - 'fine-comments': { - data: [] - } + title: 'Lorem' + } + }, + { + type: 'blog-posts', + id: '2', + attributes: { + title: 'Ipsum' } } - }); + ] }); + }); - test(`it includes linkage data for a has-many relationship that's being included`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - wordSmith: JSONAPISerializer.extend({ - include: ['blogPosts'] - }) - }); + test(`it can include a chain of has-many relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + wordSmith: JSONAPISerializer.extend({ + include: ['blogPosts'] + }), + blogPost: JSONAPISerializer.extend({ + include: ['fineComments'] + }) + }); - let link = this.schema.wordSmiths.create({ firstName: 'Link' }); - link.createBlogPost({ title: 'Lorem' }); - link.createBlogPost({ title: 'Ipsum' }); + let link = this.schema.wordSmiths.create({ firstName: 'Link' }); + let post1 = link.createBlogPost({ title: 'Lorem' }); + post1.createFineComment({ text: 'pwned' }); + link.createBlogPost({ title: 'Ipsum' }); - let result = registry.serialize(link); + let result = registry.serialize(link); - assert.deepEqual(result, { - data: { - type: 'word-smiths', + assert.deepEqual(result, { + data: { + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link' + }, + relationships: { + 'blog-posts': { + data: [ + { type: 'blog-posts', id: '1' }, + { type: 'blog-posts', id: '2' } + ] + } + } + }, + included: [ + { + type: 'blog-posts', id: '1', attributes: { - 'first-name': 'Link' + title: 'Lorem' }, relationships: { - 'blog-posts': { + 'fine-comments': { data: [ - { type: 'blog-posts', id: '1' }, - { type: 'blog-posts', id: '2' } + { type: 'fine-comments', id: '1' } ] } } }, - included: [ - { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - } + { + type: 'fine-comments', + id: '1', + attributes: { + text: 'pwned' + } + }, + { + type: 'blog-posts', + id: '2', + attributes: { + title: 'Ipsum' }, - { - type: 'blog-posts', - id: '2', - attributes: { - title: 'Ipsum' + relationships: { + 'fine-comments': { + data: [] } } - ] - }); + } + ] }); + }); - test(`it can include a chain of has-many relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - wordSmith: JSONAPISerializer.extend({ - include: ['blogPosts'] - }), - blogPost: JSONAPISerializer.extend({ - include: ['fineComments'] - }) - }); + test(`it can include a belongs-to relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + blogPost: JSONAPISerializer.extend({ + include: ['wordSmith'] + }) + }); - let link = this.schema.wordSmiths.create({ firstName: 'Link' }); - let post1 = link.createBlogPost({ title: 'Lorem' }); - post1.createFineComment({ text: 'pwned' }); - link.createBlogPost({ title: 'Ipsum' }); + let link = this.schema.wordSmiths.create({ firstName: 'Link' }); + let blogPost = link.createBlogPost({ title: 'Lorem' }); + blogPost.createFineComment(); - let result = registry.serialize(link); + let result = registry.serialize(blogPost); - assert.deepEqual(result, { - data: { - type: 'word-smiths', - id: '1', + assert.deepEqual(result, { + data: { + type: 'blog-posts', + id: '1', + attributes: { + title: 'Lorem' + }, + relationships: { + 'word-smith': { + data: { + id: '1', + type: 'word-smiths' + } + } + } + }, + 'included': [ + { attributes: { 'first-name': 'Link' }, - relationships: { - 'blog-posts': { - data: [ - { type: 'blog-posts', id: '1' }, - { type: 'blog-posts', id: '2' } - ] - } - } + id: '1', + type: 'word-smiths' + } + ] + }); + }); + + test(`it gracefully handles null belongs-to relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + blogPost: JSONAPISerializer.extend({ + include: ['wordSmith'] + }) + }); + + let blogPost = this.schema.blogPosts.create({ title: 'Lorem' }); + let result = registry.serialize(blogPost); + + assert.deepEqual(result, { + data: { + type: 'blog-posts', + id: '1', + attributes: { + title: 'Lorem' }, - included: [ - { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - }, - relationships: { - 'fine-comments': { - data: [ - { type: 'fine-comments', id: '1' } - ] - } - } - }, - { - type: 'fine-comments', - id: '1', - attributes: { - text: 'pwned' - } - }, - { - type: 'blog-posts', - id: '2', - attributes: { - title: 'Ipsum' - }, - relationships: { - 'fine-comments': { - data: [] - } - } + relationships: { + 'word-smith': { + data: null } - ] - }); + } + } }); + }); - test(`it can include a belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - include: ['wordSmith'] - }) - }); + test(`it can include a chain of belongs-to relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + blogPost: JSONAPISerializer.extend({ + include: ['wordSmith'] + }), + fineComment: JSONAPISerializer.extend({ + include: ['blogPost'] + }) + }); - let link = this.schema.wordSmiths.create({ firstName: 'Link' }); - let blogPost = link.createBlogPost({ title: 'Lorem' }); - blogPost.createFineComment(); + let wordSmith = this.schema.wordSmiths.create({ firstName: 'Link' }); + let post = wordSmith.createBlogPost({ title: 'Lorem' }); + let comment = post.createFineComment({ text: 'pwned' }); - let result = registry.serialize(blogPost); + let result = registry.serialize(comment); - assert.deepEqual(result, { - data: { + assert.deepEqual(result, { + data: { + type: 'fine-comments', + id: '1', + attributes: { + text: 'pwned' + }, + relationships: { + 'blog-post': { + data: { + id: '1', + type: 'blog-posts' + } + } + } + }, + 'included': [ + { type: 'blog-posts', id: '1', attributes: { @@ -224,37 +310,62 @@ module( relationships: { 'word-smith': { data: { - id: '1', - type: 'word-smiths' + type: 'word-smiths', + id: '1' } } } }, - 'included': [ - { - attributes: { - 'first-name': 'Link' - }, - id: '1', - type: 'word-smiths' + { + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link' } - ] - }); + } + ] + }); + }); + + test(`it properly serializes complex relationships`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + wordSmith: JSONAPISerializer.extend({ + include: ['blogPosts'] + }), + blogPost: JSONAPISerializer.extend({ + include: ['wordSmith', 'fineComments'] + }), + fineComment: JSONAPISerializer.extend({ + include: ['blogPost'] + }) }); - test(`it gracefully handles null belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - include: ['wordSmith'] - }) - }); + let wordSmith = this.schema.wordSmiths.create({ firstName: 'Link' }); + let post = wordSmith.createBlogPost({ title: 'Lorem' }); + wordSmith.createBlogPost({ title: 'Ipsum' }); + post.createFineComment({ text: 'pwned' }); - let blogPost = this.schema.blogPosts.create({ title: 'Lorem' }); - let result = registry.serialize(blogPost); + let result = registry.serialize(wordSmith); - assert.deepEqual(result, { - data: { + assert.deepEqual(result, { + data: { + attributes: { + 'first-name': 'Link' + }, + id: '1', + relationships: { + 'blog-posts': { + data: [ + { type: 'blog-posts', id: '1' }, + { type: 'blog-posts', id: '2' } + ] + } + }, + type: 'word-smiths' + }, + included: [ + { type: 'blog-posts', id: '1', attributes: { @@ -262,32 +373,16 @@ module( }, relationships: { 'word-smith': { - data: null + data: { type: 'word-smiths', id: '1' } + }, + 'fine-comments': { + data: [ + { type: 'fine-comments', id: '1' } + ] } } - } - }); - }); - - test(`it can include a chain of belongs-to relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - include: ['wordSmith'] - }), - fineComment: JSONAPISerializer.extend({ - include: ['blogPost'] - }) - }); - - let wordSmith = this.schema.wordSmiths.create({ firstName: 'Link' }); - let post = wordSmith.createBlogPost({ title: 'Lorem' }); - let comment = post.createFineComment({ text: 'pwned' }); - - let result = registry.serialize(comment); - - assert.deepEqual(result, { - data: { + }, + { type: 'fine-comments', id: '1', attributes: { @@ -295,124 +390,26 @@ module( }, relationships: { 'blog-post': { - data: { - id: '1', - type: 'blog-posts' - } + data: { type: 'blog-posts', id: '1' } } } }, - 'included': [ - { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - }, - relationships: { - 'word-smith': { - data: { - type: 'word-smiths', - id: '1' - } - } - } - }, - { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - } - } - ] - }); - }); - - test(`it properly serializes complex relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - wordSmith: JSONAPISerializer.extend({ - include: ['blogPosts'] - }), - blogPost: JSONAPISerializer.extend({ - include: ['wordSmith', 'fineComments'] - }), - fineComment: JSONAPISerializer.extend({ - include: ['blogPost'] - }) - }); - - let wordSmith = this.schema.wordSmiths.create({ firstName: 'Link' }); - let post = wordSmith.createBlogPost({ title: 'Lorem' }); - wordSmith.createBlogPost({ title: 'Ipsum' }); - post.createFineComment({ text: 'pwned' }); - - let result = registry.serialize(wordSmith); - - assert.deepEqual(result, { - data: { + { + type: 'blog-posts', + id: '2', attributes: { - 'first-name': 'Link' + title: 'Ipsum' }, - id: '1', relationships: { - 'blog-posts': { - data: [ - { type: 'blog-posts', id: '1' }, - { type: 'blog-posts', id: '2' } - ] - } - }, - type: 'word-smiths' - }, - included: [ - { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - }, - relationships: { - 'word-smith': { - data: { type: 'word-smiths', id: '1' } - }, - 'fine-comments': { - data: [ - { type: 'fine-comments', id: '1' } - ] - } - } - }, - { - type: 'fine-comments', - id: '1', - attributes: { - text: 'pwned' - }, - relationships: { - 'blog-post': { - data: { type: 'blog-posts', id: '1' } - } - } - }, - { - type: 'blog-posts', - id: '2', - attributes: { - title: 'Ipsum' + 'word-smith': { + data: { type: 'word-smiths', id: '1' } }, - relationships: { - 'word-smith': { - data: { type: 'word-smiths', id: '1' } - }, - 'fine-comments': { - data: [] - } + 'fine-comments': { + data: [] } } - ] - }); + } + ] }); - } -); + }); +}); diff --git a/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js b/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js index cfed7aa4b..294783c51 100644 --- a/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js @@ -4,135 +4,132 @@ import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { Model, belongsTo, hasMany, JSONAPISerializer } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module( - 'Integration | Serializers | JSON API Serializer | Associations | Polymorphic', - function() { - test('it works for belongs to polymorphic relationships', function(assert) { - let schema = new Schema(new Db(), { - photo: Model.extend(), - video: Model.extend(), - comment: Model.extend({ - commentable: belongsTo({ polymorphic: true }) - }) - }); +module('Integration | Serializers | JSON API Serializer | Associations | Polymorphic', function() { + test('it works for belongs to polymorphic relationships', function(assert) { + let schema = new Schema(new Db(), { + photo: Model.extend(), + video: Model.extend(), + comment: Model.extend({ + commentable: belongsTo({ polymorphic: true }) + }) + }); - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - comment: JSONAPISerializer.extend({ - include: ['commentable'] - }) - }); - let photo = schema.photos.create({ title: 'Foo' }); - schema.comments.create({ text: 'Pretty foo!', commentable: photo }); + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + comment: JSONAPISerializer.extend({ + include: ['commentable'] + }) + }); + let photo = schema.photos.create({ title: 'Foo' }); + schema.comments.create({ text: 'Pretty foo!', commentable: photo }); - let video = schema.videos.create({ title: 'Bar' }); - schema.comments.create({ text: 'Love the bar!', commentable: video }); + let video = schema.videos.create({ title: 'Bar' }); + schema.comments.create({ text: 'Love the bar!', commentable: video }); - let result = registry.serialize(schema.comments.all()); - assert.deepEqual(result, { - data: [ - { - "attributes": { - "text": "Pretty foo!" - }, - "id": "1", - "relationships": { - "commentable": { - "data": { id: '1', type: 'photos' } - } - }, - "type": "comments" + let result = registry.serialize(schema.comments.all()); + assert.deepEqual(result, { + data: [ + { + "attributes": { + "text": "Pretty foo!" }, - { - "attributes": { - "text": "Love the bar!" - }, - "id": "2", - "relationships": { - "commentable": { - "data": { id: '1', type: 'videos' } - } - }, - "type": "comments" - } - ], - included: [ - { - attributes: { - title: "Foo" - }, - id: "1", - type: "photos" + "id": "1", + "relationships": { + "commentable": { + "data": { id: '1', type: 'photos' } + } }, - { - attributes: { - "title": "Bar" - }, - id: "1", - type: "videos" - } - ] - }); + "type": "comments" + }, + { + "attributes": { + "text": "Love the bar!" + }, + "id": "2", + "relationships": { + "commentable": { + "data": { id: '1', type: 'videos' } + } + }, + "type": "comments" + } + ], + included: [ + { + attributes: { + title: "Foo" + }, + id: "1", + type: "photos" + }, + { + attributes: { + "title": "Bar" + }, + id: "1", + type: "videos" + } + ] }); + }); - test('it works for has many polymorphic relationships', function(assert) { - let schema = new Schema(new Db(), { - user: Model.extend({ - things: hasMany({ polymorphic: true }) - }), - car: Model.extend(), - watch: Model.extend() - }); + test('it works for has many polymorphic relationships', function(assert) { + let schema = new Schema(new Db(), { + user: Model.extend({ + things: hasMany({ polymorphic: true }) + }), + car: Model.extend(), + watch: Model.extend() + }); - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - user: JSONAPISerializer.extend({ - include: ['things'] - }) - }); + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + user: JSONAPISerializer.extend({ + include: ['things'] + }) + }); - let car = schema.cars.create({ make: 'Infiniti' }); - let watch = schema.watches.create({ make: 'Citizen' }); - let user = schema.users.create({ - name: 'Sam', - things: [ car, watch ] - }); + let car = schema.cars.create({ make: 'Infiniti' }); + let watch = schema.watches.create({ make: 'Citizen' }); + let user = schema.users.create({ + name: 'Sam', + things: [ car, watch ] + }); - let json = registry.serialize(user); + let json = registry.serialize(user); - assert.deepEqual(json, { - data: { + assert.deepEqual(json, { + data: { + "attributes": { + "name": "Sam" + }, + "id": "1", + "relationships": { + "things": { + "data": [ + { id: '1', type: 'cars' }, + { id: '1', type: 'watches' } + ] + } + }, + "type": "users" + }, + "included": [ + { "attributes": { - "name": "Sam" + "make": "Infiniti" }, "id": "1", - "relationships": { - "things": { - "data": [ - { id: '1', type: 'cars' }, - { id: '1', type: 'watches' } - ] - } - }, - "type": "users" + "type": "cars" }, - "included": [ - { - "attributes": { - "make": "Infiniti" - }, - "id": "1", - "type": "cars" + { + "attributes": { + "make": "Citizen" }, - { - "attributes": { - "make": "Citizen" - }, - "id": "1", - "type": "watches" - } - ] - }); + "id": "1", + "type": "watches" + } + ] }); - } -); + }); +}); diff --git a/tests/integration/serializers/json-api-serializer/attrs-test.js b/tests/integration/serializers/json-api-serializer/attrs-test.js index bd75f40f2..9c3bce0be 100644 --- a/tests/integration/serializers/json-api-serializer/attrs-test.js +++ b/tests/integration/serializers/json-api-serializer/attrs-test.js @@ -4,103 +4,100 @@ import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { Model, JSONAPISerializer } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module( - 'Integration | Serializers | JSON API Serializer | Attrs List', - function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model, - photograph: Model - }); +module('Integration | Serializers | JSON API Serializer | Attrs List', function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model, + photograph: Model }); + }); - test(`it returns only the whitelisted attrs when serializing a model`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - wordSmith: JSONAPISerializer.extend({ - attrs: ['firstName'] - }) - }); - let user = this.schema.wordSmiths.create({ - id: 1, - firstName: 'Link', - age: 123 - }); + test(`it returns only the whitelisted attrs when serializing a model`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + wordSmith: JSONAPISerializer.extend({ + attrs: ['firstName'] + }) + }); + let user = this.schema.wordSmiths.create({ + id: 1, + firstName: 'Link', + age: 123 + }); - let result = registry.serialize(user); + let result = registry.serialize(user); - assert.deepEqual(result, { - data: { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - } + assert.deepEqual(result, { + data: { + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link' } - }); + } }); + }); - test(`it returns only the whitelisted attrs when serializing a collection`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - wordSmith: JSONAPISerializer.extend({ - attrs: ['firstName'] - }) - }); - this.schema.wordSmiths.create({ id: 1, firstName: 'Link', age: 123 }); - this.schema.wordSmiths.create({ id: 2, firstName: 'Zelda', age: 456 }); + test(`it returns only the whitelisted attrs when serializing a collection`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + wordSmith: JSONAPISerializer.extend({ + attrs: ['firstName'] + }) + }); + this.schema.wordSmiths.create({ id: 1, firstName: 'Link', age: 123 }); + this.schema.wordSmiths.create({ id: 2, firstName: 'Zelda', age: 456 }); - let collection = this.schema.wordSmiths.all(); - let result = registry.serialize(collection); + let collection = this.schema.wordSmiths.all(); + let result = registry.serialize(collection); - assert.deepEqual(result, { - data: [{ - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - } - }, { - type: 'word-smiths', - id: '2', - attributes: { - 'first-name': 'Zelda' - } - }] - }); + assert.deepEqual(result, { + data: [{ + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link' + } + }, { + type: 'word-smiths', + id: '2', + attributes: { + 'first-name': 'Zelda' + } + }] }); + }); - test(`it can use different attr whitelists for different serializers`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - wordSmith: JSONAPISerializer.extend({ - attrs: ['firstName'] - }), - photograph: JSONAPISerializer.extend({ - attrs: ['title'] - }) - }); + test(`it can use different attr whitelists for different serializers`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + wordSmith: JSONAPISerializer.extend({ + attrs: ['firstName'] + }), + photograph: JSONAPISerializer.extend({ + attrs: ['title'] + }) + }); - let link = this.schema.wordSmiths.create({ id: 1, firstName: 'Link', age: 123 }); - assert.deepEqual(registry.serialize(link), { - data: { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - } + let link = this.schema.wordSmiths.create({ id: 1, firstName: 'Link', age: 123 }); + assert.deepEqual(registry.serialize(link), { + data: { + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link' } - }); + } + }); - let photo = this.schema.photographs.create({ id: 1, title: 'Lorem ipsum', createdAt: '2010-01-01' }); - assert.deepEqual(registry.serialize(photo), { - data: { - type: 'photographs', - id: '1', - attributes: { - 'title': 'Lorem ipsum' - } + let photo = this.schema.photographs.create({ id: 1, title: 'Lorem ipsum', createdAt: '2010-01-01' }); + assert.deepEqual(registry.serialize(photo), { + data: { + type: 'photographs', + id: '1', + attributes: { + 'title': 'Lorem ipsum' } - }); + } }); - } -); + }); +}); diff --git a/tests/integration/serializers/json-api-serializer/base-test.js b/tests/integration/serializers/json-api-serializer/base-test.js index 59d065d48..753b082c2 100644 --- a/tests/integration/serializers/json-api-serializer/base-test.js +++ b/tests/integration/serializers/json-api-serializer/base-test.js @@ -4,68 +4,65 @@ import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { Model, JSONAPISerializer } from 'ember-cli-mirage'; import { module, test } from 'qunit'; -module( - 'Integration | Serializers | JSON API Serializer | Base', - function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model - }); - this.registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer - }); +module('Integration | Serializers | JSON API Serializer | Base', function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model }); + this.registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer + }); + }); - test(`it includes all attributes for a model`, function(assert) { - let link = this.schema.wordSmiths.create({ firstName: 'Link', age: 123 }); - let result = this.registry.serialize(link); + test(`it includes all attributes for a model`, function(assert) { + let link = this.schema.wordSmiths.create({ firstName: 'Link', age: 123 }); + let result = this.registry.serialize(link); - assert.deepEqual(result, { - data: { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link', - age: 123 - } + assert.deepEqual(result, { + data: { + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link', + age: 123 } - }); + } }); + }); - test(`it includes all attributes for each model in a collection`, function(assert) { - this.schema.wordSmiths.create({ firstName: 'Link', age: 123 }); - this.schema.wordSmiths.create({ id: 1, firstName: 'Link', age: 123 }); - this.schema.wordSmiths.create({ id: 2, firstName: 'Zelda', age: 456 }); + test(`it includes all attributes for each model in a collection`, function(assert) { + this.schema.wordSmiths.create({ firstName: 'Link', age: 123 }); + this.schema.wordSmiths.create({ id: 1, firstName: 'Link', age: 123 }); + this.schema.wordSmiths.create({ id: 2, firstName: 'Zelda', age: 456 }); - let collection = this.schema.wordSmiths.all(); - let result = this.registry.serialize(collection); + let collection = this.schema.wordSmiths.all(); + let result = this.registry.serialize(collection); - assert.deepEqual(result, { - data: [{ - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link', - age: 123 - } - }, { - type: 'word-smiths', - id: '2', - attributes: { - 'first-name': 'Zelda', - age: 456 - } - }] - }); + assert.deepEqual(result, { + data: [{ + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link', + age: 123 + } + }, { + type: 'word-smiths', + id: '2', + attributes: { + 'first-name': 'Zelda', + age: 456 + } + }] }); + }); - test(`it can serialize an empty collection`, function(assert) { - let wordSmiths = this.schema.wordSmiths.all(); - let result = this.registry.serialize(wordSmiths); + test(`it can serialize an empty collection`, function(assert) { + let wordSmiths = this.schema.wordSmiths.all(); + let result = this.registry.serialize(wordSmiths); - assert.deepEqual(result, { - data: [] - }); + assert.deepEqual(result, { + data: [] }); - } -); + }); +}); diff --git a/tests/integration/serializers/json-api-serializer/key-formatting-test.js b/tests/integration/serializers/json-api-serializer/key-formatting-test.js index 9f1e8fb1e..9f4a7cd7b 100644 --- a/tests/integration/serializers/json-api-serializer/key-formatting-test.js +++ b/tests/integration/serializers/json-api-serializer/key-formatting-test.js @@ -5,78 +5,75 @@ import { Model, JSONAPISerializer } from 'ember-cli-mirage'; import { underscore } from 'ember-cli-mirage/utils/inflector'; import { module, test } from 'qunit'; -module( - 'Integration | Serializers | JSON API Serializer | Key Formatting', - function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model, - photograph: Model - }); +module('Integration | Serializers | JSON API Serializer | Key Formatting', function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model, + photograph: Model }); + }); - test(`keyForAttribute formats the attributes of a model`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer.extend({ - keyForAttribute(key) { - return underscore(key); - } - }) - }); - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - firstName: 'Link', - lastName: 'Jackson', - age: 323 - }); + test(`keyForAttribute formats the attributes of a model`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer.extend({ + keyForAttribute(key) { + return underscore(key); + } + }) + }); + let wordSmith = this.schema.wordSmiths.create({ + id: 1, + firstName: 'Link', + lastName: 'Jackson', + age: 323 + }); - let result = registry.serialize(wordSmith); + let result = registry.serialize(wordSmith); - assert.deepEqual(result, { - data: { - type: 'word-smiths', - id: '1', - attributes: { - age: 323, - first_name: 'Link', - last_name: 'Jackson' - } + assert.deepEqual(result, { + data: { + type: 'word-smiths', + id: '1', + attributes: { + age: 323, + first_name: 'Link', + last_name: 'Jackson' } - }); + } }); + }); - test(`keyForAttribute also formats the models in a collections`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer.extend({ - keyForAttribute(key) { - return underscore(key); - } - }) - }); + test(`keyForAttribute also formats the models in a collections`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer.extend({ + keyForAttribute(key) { + return underscore(key); + } + }) + }); - this.schema.wordSmiths.create({ id: 1, 'firstName': 'Link', 'lastName': 'Jackson' }); - this.schema.wordSmiths.create({ id: 2, 'firstName': 'Zelda', 'lastName': 'Brown' }); - let wordSmiths = this.schema.wordSmiths.all(); + this.schema.wordSmiths.create({ id: 1, 'firstName': 'Link', 'lastName': 'Jackson' }); + this.schema.wordSmiths.create({ id: 2, 'firstName': 'Zelda', 'lastName': 'Brown' }); + let wordSmiths = this.schema.wordSmiths.all(); - let result = registry.serialize(wordSmiths); + let result = registry.serialize(wordSmiths); - assert.deepEqual(result, { - data: [{ - type: 'word-smiths', - id: '1', - attributes: { - 'first_name': 'Link', - 'last_name': 'Jackson' - } - }, { - type: 'word-smiths', - id: '2', - attributes: { - 'first_name': 'Zelda', - 'last_name': 'Brown' - } - }] - }); + assert.deepEqual(result, { + data: [{ + type: 'word-smiths', + id: '1', + attributes: { + 'first_name': 'Link', + 'last_name': 'Jackson' + } + }, { + type: 'word-smiths', + id: '2', + attributes: { + 'first_name': 'Zelda', + 'last_name': 'Brown' + } + }] }); - } -); + }); +}); diff --git a/tests/unit/db-test.js b/tests/unit/db-test.js index d612c7c2f..723d7f753 100644 --- a/tests/unit/db-test.js +++ b/tests/unit/db-test.js @@ -618,43 +618,40 @@ module('Unit | Db #firstOrCreate', function(hooks) { }); }); -module( - 'Unit | Db #registerIdentityManagers and #identityManagerFor', - function() { - test('identityManagerFor returns ember-cli-mirage default IdentityManager if there aren\'t any custom ones', function(assert) { - let db = new Db(); - assert.equal(db.identityManagerFor('foo'), DefaultIdentityManager); - }); +module('Unit | Db #registerIdentityManagers and #identityManagerFor', function() { + test('identityManagerFor returns ember-cli-mirage default IdentityManager if there aren\'t any custom ones', function(assert) { + let db = new Db(); + assert.equal(db.identityManagerFor('foo'), DefaultIdentityManager); + }); + + test('it can register identity managers per db collection and for application', function(assert) { + let FooIdentityManager = class {}; + let ApplicationIdentityManager = class {}; - test('it can register identity managers per db collection and for application', function(assert) { - let FooIdentityManager = class {}; - let ApplicationIdentityManager = class {}; - - let db = new Db(); - db.registerIdentityManagers({ - foo: FooIdentityManager, - application: ApplicationIdentityManager - }); - - assert.equal( - db.identityManagerFor('foo'), - FooIdentityManager, - 'it allows to declare an identity manager per db collection' - ); - assert.equal( - db.identityManagerFor('bar'), - ApplicationIdentityManager, - 'it falls back to application idenitity manager if there isn\'t one for a specific db collection' - ); + let db = new Db(); + db.registerIdentityManagers({ + foo: FooIdentityManager, + application: ApplicationIdentityManager }); - test('it can register idenitity managers on instantiation', function(assert) { - let CustomIdentityManager = class {}; - let db = new Db(undefined, { - foo: CustomIdentityManager - }); - assert.equal(db.identityManagerFor('foo'), CustomIdentityManager); - assert.equal(db.identityManagerFor('bar'), DefaultIdentityManager); + assert.equal( + db.identityManagerFor('foo'), + FooIdentityManager, + 'it allows to declare an identity manager per db collection' + ); + assert.equal( + db.identityManagerFor('bar'), + ApplicationIdentityManager, + 'it falls back to application idenitity manager if there isn\'t one for a specific db collection' + ); + }); + + test('it can register idenitity managers on instantiation', function(assert) { + let CustomIdentityManager = class {}; + let db = new Db(undefined, { + foo: CustomIdentityManager }); - } -); + assert.equal(db.identityManagerFor('foo'), CustomIdentityManager); + assert.equal(db.identityManagerFor('bar'), DefaultIdentityManager); + }); +}); diff --git a/tests/unit/route-handlers/shorthands/base-test.js b/tests/unit/route-handlers/shorthands/base-test.js index e5e1e7a08..8c9b47a4b 100644 --- a/tests/unit/route-handlers/shorthands/base-test.js +++ b/tests/unit/route-handlers/shorthands/base-test.js @@ -2,161 +2,158 @@ import BaseShorthandRouteHandler from 'ember-cli-mirage/route-handlers/shorthand import {module, test} from 'qunit'; -module( - 'Unit | Route handlers | Shorthands | BaseShorthandRouteHandler', - function(hooks) { - hooks.beforeEach(function() { - this.handler = new BaseShorthandRouteHandler(); - this.request = { params: { id: '' } }; - }); - - test('it returns a number if it\'s a number', function(assert) { - this.request.params.id = 2; - assert.equal(this.handler._getIdForRequest(this.request), 2, 'it returns a number'); - }); - - test('it returns a number if it\'s a string represented number', function(assert) { - this.request.params.id = '2'; - assert.equal(this.handler._getIdForRequest(this.request), 2, 'it returns a number'); - }); - - test('it returns a string it\'s a dasherized number', function(assert) { - this.request.params.id = '2-1'; - assert.equal(this.handler._getIdForRequest(this.request), '2-1', 'it returns a number'); - }); - - test('it returns a string if it\'s a string', function(assert) { - this.request.params.id = 'someID'; - assert.equal(this.handler._getIdForRequest(this.request), 'someID', 'it returns a number'); - }); - - test('getModelClassFromPath works', function(assert) { - let urlWithSlash = '/api/fancy-users'; - let urlWithIdAndSlash = '/api/fancy-users/:id'; - - assert.equal(this.handler.getModelClassFromPath(urlWithSlash), 'fancy-user', 'it returns a singular model name'); - assert.equal(this.handler.getModelClassFromPath(urlWithIdAndSlash, true), 'fancy-user', 'it returns a singular model name'); - }); - - test('it can read the id from the url', function(assert) { - let request = { params: { id: 'test-id' } }; - assert.equal(this.handler._getIdForRequest(request), 'test-id', 'it returns id from url parameters.'); - }); - - test('it can read the id from the request body', function(assert) { - let request = { params: {} }; - let jsonApiDoc = { data: { id: 'jsonapi-id' } }; - assert.equal(this.handler._getIdForRequest(request, jsonApiDoc), 'jsonapi-id', 'it returns id from json api data.'); - }); - - test('_getAttrsForRequest works with attributes and relationships', function(assert) { - let payload = { - 'data': { - 'attributes': { - 'does-mirage': true, - 'name': 'Sam' +module('Unit | Route handlers | Shorthands | BaseShorthandRouteHandler', function(hooks) { + hooks.beforeEach(function() { + this.handler = new BaseShorthandRouteHandler(); + this.request = { params: { id: '' } }; + }); + + test('it returns a number if it\'s a number', function(assert) { + this.request.params.id = 2; + assert.equal(this.handler._getIdForRequest(this.request), 2, 'it returns a number'); + }); + + test('it returns a number if it\'s a string represented number', function(assert) { + this.request.params.id = '2'; + assert.equal(this.handler._getIdForRequest(this.request), 2, 'it returns a number'); + }); + + test('it returns a string it\'s a dasherized number', function(assert) { + this.request.params.id = '2-1'; + assert.equal(this.handler._getIdForRequest(this.request), '2-1', 'it returns a number'); + }); + + test('it returns a string if it\'s a string', function(assert) { + this.request.params.id = 'someID'; + assert.equal(this.handler._getIdForRequest(this.request), 'someID', 'it returns a number'); + }); + + test('getModelClassFromPath works', function(assert) { + let urlWithSlash = '/api/fancy-users'; + let urlWithIdAndSlash = '/api/fancy-users/:id'; + + assert.equal(this.handler.getModelClassFromPath(urlWithSlash), 'fancy-user', 'it returns a singular model name'); + assert.equal(this.handler.getModelClassFromPath(urlWithIdAndSlash, true), 'fancy-user', 'it returns a singular model name'); + }); + + test('it can read the id from the url', function(assert) { + let request = { params: { id: 'test-id' } }; + assert.equal(this.handler._getIdForRequest(request), 'test-id', 'it returns id from url parameters.'); + }); + + test('it can read the id from the request body', function(assert) { + let request = { params: {} }; + let jsonApiDoc = { data: { id: 'jsonapi-id' } }; + assert.equal(this.handler._getIdForRequest(request, jsonApiDoc), 'jsonapi-id', 'it returns id from json api data.'); + }); + + test('_getAttrsForRequest works with attributes and relationships', function(assert) { + let payload = { + 'data': { + 'attributes': { + 'does-mirage': true, + 'name': 'Sam' + }, + 'relationships': { + 'company': { + 'data': { + 'id': '1', + 'type': 'companies' + } + }, + 'employees': { + 'data': [{ + 'id': '1', + 'type': 'employees' + }, { + 'id': '2', + 'type': 'employees' + }, { + 'id': '3', + 'type': 'employees' + }] + }, + 'nothings': { + 'data': [] }, - 'relationships': { - 'company': { - 'data': { - 'id': '1', - 'type': 'companies' - } - }, - 'employees': { - 'data': [{ - 'id': '1', - 'type': 'employees' - }, { - 'id': '2', - 'type': 'employees' - }, { - 'id': '3', - 'type': 'employees' - }] - }, - 'nothings': { - 'data': [] - }, - 'github-account': { - 'data': { - 'id': '1', - 'type': 'github-accounts' - } - }, - 'something': { - 'data': null + 'github-account': { + 'data': { + 'id': '1', + 'type': 'github-accounts' } }, - 'type': 'github-account' - } - }; - - this.handler._getJsonApiDocForRequest = function() { - return payload; - }; - - let attrs = this.handler._getAttrsForRequest(this.request, 'user'); - - assert.deepEqual( - attrs, - { - name: 'Sam', - doesMirage: true, - companyId: '1', - employeeIds: ['1', '2', '3'], - nothingIds: [], - githubAccountId: '1', - somethingId: null + 'something': { + 'data': null + } }, - 'it normalizes data correctly.' - ); - }); - - test('_getAttrsForRequest works with just relationships', function(assert) { - let payload = { - 'data': { - 'relationships': { - 'company': { - 'data': { - 'id': '1', - 'type': 'companies' - } + 'type': 'github-account' + } + }; + + this.handler._getJsonApiDocForRequest = function() { + return payload; + }; + + let attrs = this.handler._getAttrsForRequest(this.request, 'user'); + + assert.deepEqual( + attrs, + { + name: 'Sam', + doesMirage: true, + companyId: '1', + employeeIds: ['1', '2', '3'], + nothingIds: [], + githubAccountId: '1', + somethingId: null + }, + 'it normalizes data correctly.' + ); + }); + + test('_getAttrsForRequest works with just relationships', function(assert) { + let payload = { + 'data': { + 'relationships': { + 'company': { + 'data': { + 'id': '1', + 'type': 'companies' } - }, - 'type': 'github-account' - } - }; - - this.handler._getJsonApiDocForRequest = function() { - return payload; - }; - - let attrs = this.handler._getAttrsForRequest(this.request, 'user'); - - assert.deepEqual( - attrs, - { - companyId: '1' + } }, - 'it normalizes data correctly.' - ); - }); - - test('_getAttrsForRequest works with just type', function(assert) { - let payload = { - 'data': { - 'type': 'github-account' - } - }; - - this.handler._getJsonApiDocForRequest = function(request, modelName) { - return payload; - }; - - let attrs = this.handler._getAttrsForRequest(this.request, 'user'); - - assert.deepEqual(attrs, {}); - }); - } -); + 'type': 'github-account' + } + }; + + this.handler._getJsonApiDocForRequest = function() { + return payload; + }; + + let attrs = this.handler._getAttrsForRequest(this.request, 'user'); + + assert.deepEqual( + attrs, + { + companyId: '1' + }, + 'it normalizes data correctly.' + ); + }); + + test('_getAttrsForRequest works with just type', function(assert) { + let payload = { + 'data': { + 'type': 'github-account' + } + }; + + this.handler._getJsonApiDocForRequest = function(request, modelName) { + return payload; + }; + + let attrs = this.handler._getAttrsForRequest(this.request, 'user'); + + assert.deepEqual(attrs, {}); + }); +}); From a624549331e2878c154aac1f48d5fcd6ef0c2d7a Mon Sep 17 00:00:00 2001 From: Andy Brown Date: Sun, 29 Oct 2017 18:14:24 +0100 Subject: [PATCH 106/879] feat: can pass singular model name to resource helper --- addon/server.js | 1 + .../server/resource-shorthand-test.js | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/addon/server.js b/addon/server.js index b3a47614c..e2d03b40e 100644 --- a/addon/server.js +++ b/addon/server.js @@ -429,6 +429,7 @@ export default class Server { } resource(resourceName, { only, except, path } = {}) { + resourceName = pluralize(resourceName); path = path || `/${resourceName}`; only = only || []; except = except || []; diff --git a/tests/integration/server/resource-shorthand-test.js b/tests/integration/server/resource-shorthand-test.js index 008da999c..bb4edbf40 100644 --- a/tests/integration/server/resource-shorthand-test.js +++ b/tests/integration/server/resource-shorthand-test.js @@ -273,6 +273,45 @@ module('Integration | Server | Resource shorthand', function(hooks) { }); }); + test('resource accepts singular name', function(assert) { + assert.expect(3); + let done = assert.async(2); + + this.server.db.loadData({ + contacts: [ + { id: 1, name: 'Link' }, + { id: 2, name: 'Zelda' } + ], + blogPosts: [ + { id: 1, title: 'Post 1' }, + { id: 2, title: 'Post 2' } + ] + }); + + this.server.resource('contact'); + this.server.resource('blog-post', { path: '/posts' }); + + $.ajax({ + method: 'GET', + url: '/contacts' + }).done(function(res, status, xhr) { + assert.equal(xhr.status, 200); + assert.deepEqual(res, { contacts: [{ id: '1', name: 'Link' }, { id: '2', name: 'Zelda' }] }); + done(); + }); + + $.ajax({ + method: 'GET', + url: '/posts' + }).fail((xhr, textStatus, error) => { + assert.ok(false, 'failed to find custom path'); + done(); + }).done(function(res, status, xhr) { + assert.ok(true); + done(); + }); + }); + test('resource does not accept both :all and :except options', function(assert) { let { server } = this; From 73f39f12b9e75f81a9e07340a758b3027f9e0974 Mon Sep 17 00:00:00 2001 From: Andy Brown Date: Tue, 7 Nov 2017 00:23:51 +0100 Subject: [PATCH 107/879] refactor: move custom path behaviour into one test --- .../server/resource-shorthand-test.js | 199 +++++++++--------- 1 file changed, 98 insertions(+), 101 deletions(-) diff --git a/tests/integration/server/resource-shorthand-test.js b/tests/integration/server/resource-shorthand-test.js index bb4edbf40..94e7ab937 100644 --- a/tests/integration/server/resource-shorthand-test.js +++ b/tests/integration/server/resource-shorthand-test.js @@ -23,8 +23,8 @@ module('Integration | Server | Resource shorthand', function(hooks) { }); test('resource generates get shorthand for index action', function(assert) { - assert.expect(3); - let done = assert.async(2); + assert.expect(2); + let done = assert.async(1); this.server.db.loadData({ contacts: [ @@ -38,7 +38,6 @@ module('Integration | Server | Resource shorthand', function(hooks) { }); this.server.resource('contacts'); - this.server.resource('blog-posts', { path: '/posts' }); $.ajax({ method: 'GET', @@ -48,22 +47,11 @@ module('Integration | Server | Resource shorthand', function(hooks) { assert.deepEqual(res, { contacts: [{ id: '1', name: 'Link' }, { id: '2', name: 'Zelda' }] }); done(); }); - - $.ajax({ - method: 'GET', - url: '/posts' - }).fail((xhr, textStatus, error) => { - assert.ok(false, 'failed to find custom path'); - done(); - }).done(function(res, status, xhr) { - assert.ok(true); - done(); - }); }); test('resource generates get shorthand for show action', function(assert) { - assert.expect(3); - let done = assert.async(2); + assert.expect(2); + let done = assert.async(1); this.server.db.loadData({ contacts: [ @@ -87,26 +75,14 @@ module('Integration | Server | Resource shorthand', function(hooks) { assert.deepEqual(res, { contact: { id: '2', name: 'Zelda' } }); done(); }); - - $.ajax({ - method: 'GET', - url: '/posts/2' - }).fail((xhr, textStatus, error) => { - assert.ok(false, 'failed to find custom path'); - done(); - }).done(function(res, status, xhr) { - assert.ok(true); - done(); - }); }); test('resource generates post shorthand', function(assert) { let { server } = this; - assert.expect(3); - let done = assert.async(2); + assert.expect(2); + let done = assert.async(1); server.resource('contacts'); - server.resource('blog-posts', { path: '/posts' }); $.ajax({ method: 'POST', @@ -121,28 +97,12 @@ module('Integration | Server | Resource shorthand', function(hooks) { assert.equal(server.db.contacts.length, 1); done(); }); - - $.ajax({ - method: 'POST', - url: '/posts', - data: JSON.stringify({ - blog_post: { - name: 'Post 1' - } - }) - }).fail((xhr, textStatus, error) => { - assert.ok(false, 'failed to find custom path'); - done(); - }).done((res, status, xhr) => { - assert.ok(true); - done(); - }); }); test('resource generates put shorthand', function(assert) { let { server } = this; - assert.expect(3); - let done = assert.async(2); + assert.expect(2); + let done = assert.async(1); this.server.db.loadData({ contacts: [ @@ -154,7 +114,6 @@ module('Integration | Server | Resource shorthand', function(hooks) { }); server.resource('contacts'); - server.resource('blog-posts', { path: '/posts' }); $.ajax({ method: 'PUT', @@ -169,28 +128,12 @@ module('Integration | Server | Resource shorthand', function(hooks) { assert.equal(server.db.contacts[0].name, 'Zelda'); done(); }); - - $.ajax({ - method: 'PUT', - url: '/posts/1', - data: JSON.stringify({ - blog_post: { - name: 'Post 2' - } - }) - }).fail((xhr, textStatus, error) => { - assert.ok(false, 'failed to find custom path'); - done(); - }).done((res, status, xhr) => { - assert.ok(true); - done(); - }); }); test('resource generates patch shorthand', function(assert) { let { server } = this; - assert.expect(3); - let done = assert.async(2); + assert.expect(2); + let done = assert.async(1); this.server.db.loadData({ contacts: [ @@ -202,7 +145,6 @@ module('Integration | Server | Resource shorthand', function(hooks) { }); server.resource('contacts'); - server.resource('blog-posts', { path: '/posts' }); $.ajax({ method: 'PATCH', @@ -217,28 +159,12 @@ module('Integration | Server | Resource shorthand', function(hooks) { assert.equal(server.db.contacts[0].name, 'Zelda'); done(); }); - - $.ajax({ - method: 'PATCH', - url: '/posts/1', - data: JSON.stringify({ - blog_post: { - name: 'Post 2' - } - }) - }).fail((xhr, textStatus, error) => { - assert.ok(false, 'failed to find custom path'); - done(); - }).done((res, status, xhr) => { - assert.ok(true); - done(); - }); }); test('resource generates delete shorthand works', function(assert) { let { server } = this; - assert.expect(3); - let done = assert.async(2); + assert.expect(2); + let done = assert.async(1); this.server.db.loadData({ contacts: [ @@ -250,7 +176,6 @@ module('Integration | Server | Resource shorthand', function(hooks) { }); server.resource('contacts'); - server.resource('blog-posts', { path: '/posts' }); $.ajax({ method: 'DELETE', @@ -260,6 +185,90 @@ module('Integration | Server | Resource shorthand', function(hooks) { assert.equal(server.db.contacts.length, 0); done(); }); + }); + + test('resource accepts a custom path for a resource', function(assert) { + assert.expect(6); + let done = assert.async(6); + + this.server.db.loadData({ + blogPosts: [ + { id: 1, title: 'Post 1' }, + { id: 2, title: 'Post 2' } + ] + }); + + this.server.resource('blog-posts', { path: '/posts' }); + + $.ajax({ + method: 'GET', + url: '/posts' + }).fail((xhr, textStatus, error) => { + assert.ok(false, 'failed to find custom path'); + done(); + }).done(function(res, status, xhr) { + assert.ok(true); + done(); + }); + + $.ajax({ + method: 'GET', + url: '/posts/2' + }).fail((xhr, textStatus, error) => { + assert.ok(false, 'failed to find custom path'); + done(); + }).done(function(res, status, xhr) { + assert.ok(true); + done(); + }); + + $.ajax({ + method: 'POST', + url: '/posts', + data: JSON.stringify({ + blog_post: { + name: 'Post 1' + } + }) + }).fail((xhr, textStatus, error) => { + assert.ok(false, 'failed to find custom path'); + done(); + }).done((res, status, xhr) => { + assert.ok(true); + done(); + }); + + $.ajax({ + method: 'PUT', + url: '/posts/1', + data: JSON.stringify({ + blog_post: { + name: 'Post 2' + } + }) + }).fail((xhr, textStatus, error) => { + assert.ok(false, 'failed to find custom path'); + done(); + }).done((res, status, xhr) => { + assert.ok(true); + done(); + }); + + $.ajax({ + method: 'PATCH', + url: '/posts/1', + data: JSON.stringify({ + blog_post: { + name: 'Post 2' + } + }) + }).fail((xhr, textStatus, error) => { + assert.ok(false, 'failed to find custom path'); + done(); + }).done((res, status, xhr) => { + assert.ok(true); + done(); + }); $.ajax({ method: 'DELETE', @@ -322,8 +331,8 @@ module('Integration | Server | Resource shorthand', function(hooks) { test('resource generates shorthands which are whitelisted by :only option', function(assert) { let { server } = this; - assert.expect(2); - let done = assert.async(2); + assert.expect(1); + let done = assert.async(1); server.db.loadData({ contacts: [ @@ -333,7 +342,6 @@ module('Integration | Server | Resource shorthand', function(hooks) { }); server.resource('contacts', { only: ['index'] }); - server.resource('blog-posts', { path: '/posts', only: ['index'] }); $.ajax({ method: 'GET', @@ -342,17 +350,6 @@ module('Integration | Server | Resource shorthand', function(hooks) { assert.equal(xhr.status, 200); done(); }); - - $.ajax({ - method: 'GET', - url: '/posts' - }).fail(function() { - assert.ok(false, 'failed to find custom path'); - done(); - }).done((res, status, xhr) => { - assert.equal(xhr.status, 200); - done(); - }); }); test('resource does not generate shorthands which are not whitelisted with :only option', function(assert) { From dbbbfa79c767f38b6d9d596c65e0cf1ba358eb75 Mon Sep 17 00:00:00 2001 From: Andy Brown Date: Fri, 10 Nov 2017 00:41:07 +0100 Subject: [PATCH 108/879] refactor(ajax): promisify ajax --- tests/helpers/promise-ajax.js | 9 + tests/integration/http-verbs-test.js | 46 ++--- tests/integration/passthrough-test.js | 155 ++++++++--------- .../route-handlers/function-handler-test.js | 28 +-- .../serializers/base/full-request-test.js | 25 +-- .../server/custom-function-handler-test.js | 15 +- .../customized-normalize-method-test.js | 11 +- .../server/resource-shorthand-test.js | 163 +++++++++--------- .../server/shorthand-sanity-test.js | 33 ++-- 9 files changed, 243 insertions(+), 242 deletions(-) create mode 100644 tests/helpers/promise-ajax.js diff --git a/tests/helpers/promise-ajax.js b/tests/helpers/promise-ajax.js new file mode 100644 index 000000000..240800f90 --- /dev/null +++ b/tests/helpers/promise-ajax.js @@ -0,0 +1,9 @@ +import { Promise } from 'rsvp'; + +export default (options) => { + return new Promise((resolve, reject) => { + $.ajax(options) + .done((data, status, xhr) => resolve({data, status, xhr})) + .fail((xhr, status, error) => reject({xhr, status, error})); + }); +}; \ No newline at end of file diff --git a/tests/integration/http-verbs-test.js b/tests/integration/http-verbs-test.js index 1ace6ca68..fddfbc368 100644 --- a/tests/integration/http-verbs-test.js +++ b/tests/integration/http-verbs-test.js @@ -1,6 +1,7 @@ import {module, test} from 'qunit'; import Server from 'ember-cli-mirage/server'; import { Model } from 'ember-cli-mirage'; +import promiseAjax from '../helpers/promise-ajax'; module('Integration | HTTP Verbs', function(hooks) { hooks.beforeEach(function() { @@ -26,11 +27,11 @@ module('Integration | HTTP Verbs', function(hooks) { return true; }); - $.ajax({ + promiseAjax({ method: 'GET', url: '/contacts' - }).done(function(res) { - assert.equal(res, true); + }).then((response) => { + assert.equal(response.data, true); done(); }); }); @@ -43,11 +44,11 @@ module('Integration | HTTP Verbs', function(hooks) { return true; }); - $.ajax({ + promiseAjax({ method: 'POST', url: '/contacts' - }).done(function(res) { - assert.equal(res, true); + }).then((response) => { + assert.equal(response.data, true); done(); }); }); @@ -60,11 +61,11 @@ module('Integration | HTTP Verbs', function(hooks) { return true; }); - $.ajax({ + promiseAjax({ method: 'PUT', url: '/contacts' - }).done(function(res) { - assert.equal(res, true); + }).then((response) => { + assert.equal(response.data, true); done(); }); }); @@ -77,11 +78,11 @@ module('Integration | HTTP Verbs', function(hooks) { return true; }); - $.ajax({ + promiseAjax({ method: 'DELETE', url: '/contacts' - }).done(function(res) { - assert.equal(res, true); + }).then((response) => { + assert.equal(response.data, true); done(); }); }); @@ -94,11 +95,11 @@ module('Integration | HTTP Verbs', function(hooks) { return true; }); - $.ajax({ + promiseAjax({ method: 'PATCH', url: '/contacts' - }).done(function(res) { - assert.equal(res, true); + }).then((response) => { + assert.equal(response.data, true); done(); }); }); @@ -109,10 +110,10 @@ module('Integration | HTTP Verbs', function(hooks) { this.server.resource('contacts'); - $.ajax({ + promiseAjax({ method: 'GET', url: '/contacts' - }).done(function() { + }).then(function() { done(); }); }); @@ -123,13 +124,12 @@ module('Integration | HTTP Verbs', function(hooks) { this.server.get('/contacts', {}, 404); - $.ajax({ + promiseAjax({ method: 'GET', - url: '/contacts', - complete: function(res) { - assert.ok(res.status, 404); - done(); - } + url: '/contacts' + }).catch(function(error) { + assert.ok(error.xhr.status, 404); + done(); }); }); }); diff --git a/tests/integration/passthrough-test.js b/tests/integration/passthrough-test.js index 46c92dd98..ef05cb254 100644 --- a/tests/integration/passthrough-test.js +++ b/tests/integration/passthrough-test.js @@ -1,5 +1,6 @@ import {module, test} from 'qunit'; import Server from 'ember-cli-mirage/server'; +import promiseAjax from '../helpers/promise-ajax'; module('Integration | Passthrough', function(hooks) { hooks.beforeEach(function() { @@ -27,22 +28,20 @@ module('Integration | Passthrough', function(hooks) { this.passthrough('/addresses'); }); - $.ajax({ + promiseAjax({ method: 'GET', - url: '/contacts', - success(data) { - assert.equal(data, 123); - done1(); - } + url: '/contacts' + }).then((response) => { + assert.equal(response.data, 123); + done1(); }); - $.ajax({ + promiseAjax({ method: 'GET', - url: '/addresses', - error(reason) { - assert.equal(reason.status, 404); - done2(); - } + url: '/addresses' + }).catch((error) => { + assert.equal(error.xhr.status, 404); + done2(); }); }); @@ -64,27 +63,25 @@ module('Integration | Passthrough', function(hooks) { done2(); }; - $.ajax({ + promiseAjax({ method: 'GET', - url: '/contacts', - success(data) { - assert.equal(data, 123); - done1(); - } + url: '/contacts' + }).then((response) => { + assert.equal(response.data, 123); + done1(); }); - $.ajax({ + promiseAjax({ method: 'GET', url: '/addresses' }); - $.ajax({ + promiseAjax({ method: 'POST', - url: '/addresses', - error(reason) { - assert.equal(reason.status, 404); - done3(); - } + url: '/addresses' + }).catch((error) => { + assert.equal(error.xhr.status, 404); + done3(); }); }); @@ -101,22 +98,20 @@ module('Integration | Passthrough', function(hooks) { this.passthrough('/contacts', '/addresses'); }); - $.ajax({ + promiseAjax({ method: 'GET', - url: '/contacts', - error(reason) { - assert.equal(reason.status, 404); - done1(); - } + url: '/contacts' + }).catch((error) => { + assert.equal(error.xhr.status, 404); + done1(); }); - $.ajax({ + promiseAjax({ method: 'POST', - url: '/addresses', - error(reason) { - assert.equal(reason.status, 404); - done2(); - } + url: '/addresses' + }).catch((error) => { + assert.equal(error.xhr.status, 404); + done2(); }); }); @@ -131,22 +126,20 @@ module('Integration | Passthrough', function(hooks) { this.passthrough('/addresses', ['post']); }); - $.ajax({ + promiseAjax({ method: 'GET', - url: '/contacts', - error(reason) { - assert.equal(reason.status, 404); - done1(); - } + url: '/contacts' + }).catch((error) => { + assert.equal(error.xhr.status, 404); + done1(); }); - $.ajax({ + promiseAjax({ method: 'POST', - url: '/addresses', - error(reason) { - assert.equal(reason.status, 404); - done2(); - } + url: '/addresses' + }).catch((error) => { + assert.equal(error.xhr.status, 404); + done2(); }); }); @@ -163,22 +156,20 @@ module('Integration | Passthrough', function(hooks) { this.passthrough(); }); - $.ajax({ + promiseAjax({ method: 'GET', - url: '/contacts', - success(data) { - assert.equal(data, 123); - done1(); - } + url: '/contacts' + }).then((response) => { + assert.equal(response.data, 123); + done1(); }); - $.ajax({ + promiseAjax({ method: 'GET', - url: '/addresses', - error(reason) { - assert.equal(reason.status, 404); - done2(); - } + url: '/addresses' + }).catch((error) => { + assert.equal(error.xhr.status, 404); + done2(); }); }); @@ -195,27 +186,24 @@ module('Integration | Passthrough', function(hooks) { this.passthrough(); }); - $.ajax({ + promiseAjax({ method: 'GET', - url: '/contacts', - success(data) { - assert.equal(data, 123, 'contacts is intercepted'); - done1(); - } + url: '/contacts' + }).then((response) => { + assert.equal(response.data, 123, 'contacts is intercepted'); + done1(); // test will fail bc only 1 assertion, but we don't have to wait }); - $.ajax({ + promiseAjax({ method: 'GET', - url: '/', - error() { - done2(); // test will fail bc only 1 assertion, but we don't have to wait - }, - success(html) { - // a passthrough request to index on the current domain - // actually succeeds here, since that's where the test runner is served - assert.ok(html, '/ is passed through'); - done2(); // test will fail bc only 1 assertion, but we don't have to wait - } + url: '/' + }).then((response) => { + // a passthrough request to index on the current domain + // actually succeeds here, since that's where the test runner is served + assert.ok(response.data, '/ is passed through'); + done2(); + }).catch(() => { + done2(); // test will fail bc only 1 assertion, but we don't have to wait }); }); @@ -228,13 +216,12 @@ module('Integration | Passthrough', function(hooks) { this.passthrough('http://api.foo.bar/**'); }); - $.ajax({ + promiseAjax({ method: 'GET', - url: 'http://api.foo.bar/contacts', - error() { - assert.ok(true); - done1(); - } + url: '/addresses' + }).catch((error) => { + assert.ok(true); + done1(); }); }); }); diff --git a/tests/integration/route-handlers/function-handler-test.js b/tests/integration/route-handlers/function-handler-test.js index a971de9bb..740304cf5 100644 --- a/tests/integration/route-handlers/function-handler-test.js +++ b/tests/integration/route-handlers/function-handler-test.js @@ -6,6 +6,7 @@ import Server from 'ember-cli-mirage/server'; import Response from 'ember-cli-mirage/response'; import FunctionRouteHandler from 'ember-cli-mirage/route-handlers/function'; import _uniqBy from 'lodash/uniqBy'; +import promiseAjax from '../../helpers/promise-ajax'; module('Integration | Route handlers | Function handler', function(hooks) { hooks.beforeEach(function() { @@ -40,13 +41,12 @@ module('Integration | Route handlers | Function handler', function(hooks) { throw 'I goofed'; }); - $.ajax({ + promiseAjax({ method: 'GET', - url: '/users', - error: ({ responseText }) => { - assert.equal(responseText, 'Mirage: Your GET handler for the url /users threw an error: I goofed'); - done(); - } + url: '/users' + }).catch((error) => { + assert.equal(error.xhr.responseText, 'Mirage: Your GET handler for the url /users threw an error: I goofed'); + done(); }); }); @@ -58,8 +58,8 @@ module('Integration | Route handlers | Function handler', function(hooks) { return new Response(200, { 'Content-Type': 'text/csv' }, 'firstname,lastname\nbob,dylon'); }); - $.ajax({ method: 'GET', url: '/users' }).done(function(res) { - assert.equal(res, 'firstname,lastname\nbob,dylon'); + promiseAjax({ method: 'GET', url: '/users' }).then((response) => { + assert.equal(response.data, 'firstname,lastname\nbob,dylon'); done(); }); }); @@ -74,8 +74,8 @@ module('Integration | Route handlers | Function handler', function(hooks) { }); }); - $.ajax({ method: 'GET', url: '/users' }).done(function(res) { - assert.equal(res, 'firstname,lastname\nbob,dylan'); + promiseAjax({ method: 'GET', url: '/users' }).then((response) => { + assert.equal(response.data, 'firstname,lastname\nbob,dylan'); done(); }); }); @@ -92,8 +92,8 @@ module('Integration | Route handlers | Function handler', function(hooks) { }); }); - $.ajax({ method: 'GET', url: '/users' }).done(function(res) { - assert.deepEqual(res, { users: [ { id: user.id, name: 'Sam' } ] }); + promiseAjax({ method: 'GET', url: '/users' }).then((response) => { + assert.deepEqual(response.data, { users: [ { id: user.id, name: 'Sam' } ] }); done(); }); }); @@ -108,8 +108,8 @@ module('Integration | Route handlers | Function handler', function(hooks) { }); }); - $.ajax({ method: 'GET', url: '/users' }).done(function(res) { - assert.equal(res, ''); + promiseAjax({ method: 'GET', url: '/users' }).then((response) => { + assert.equal(response.data, ''); done(); }); }); diff --git a/tests/integration/serializers/base/full-request-test.js b/tests/integration/serializers/base/full-request-test.js index 97536406e..dfec4c6f9 100644 --- a/tests/integration/serializers/base/full-request-test.js +++ b/tests/integration/serializers/base/full-request-test.js @@ -3,6 +3,7 @@ import Server from 'ember-cli-mirage/server'; import Model from 'ember-cli-mirage/orm/model'; import Serializer from 'ember-cli-mirage/serializer'; import {module, test} from 'qunit'; +import promiseAjax from '../../../helpers/promise-ajax'; module('Integration | Serializers | Base | Full Request', function(hooks) { hooks.beforeEach(function() { @@ -63,11 +64,11 @@ module('Integration | Serializers | Base | Full Request', function(hooks) { return schema.authors.find(id); }); - $.ajax({ + promiseAjax({ method: 'GET', url: '/authors/1' - }).done(function(res) { - assert.deepEqual(res, { + }).then((response) => { + assert.deepEqual(response.data, { author: { id: '1', first: 'Link', @@ -90,11 +91,11 @@ module('Integration | Serializers | Base | Full Request', function(hooks) { return { data: { id } }; }); - $.ajax({ + promiseAjax({ method: 'GET', url: '/authors/%3A1' - }).done(function(res) { - assert.deepEqual(res, { + }).then((response) => { + assert.deepEqual(response.data, { data: { id: ':1' } }); done(); @@ -115,11 +116,11 @@ module('Integration | Serializers | Base | Full Request', function(hooks) { return schema.posts.find(id); }); - $.ajax({ + promiseAjax({ method: 'GET', url: '/posts/1' - }).done(function(res) { - assert.deepEqual(res, { + }).then((response) => { + assert.deepEqual(response.data, { id: '1', title: 'Lorem', date: '20001010' @@ -144,11 +145,11 @@ module('Integration | Serializers | Base | Full Request', function(hooks) { return schema.comments.find(id); }); - $.ajax({ + promiseAjax({ method: 'GET', url: '/comments/1?include_post=true' - }).done(function(res) { - assert.deepEqual(res, { + }).then((response) => { + assert.deepEqual(response.data, { id: '1', description: 'Lorem is the best', post: { diff --git a/tests/integration/server/custom-function-handler-test.js b/tests/integration/server/custom-function-handler-test.js index 331b0ce23..b5dab6539 100644 --- a/tests/integration/server/custom-function-handler-test.js +++ b/tests/integration/server/custom-function-handler-test.js @@ -1,6 +1,7 @@ import { module, test } from 'qunit'; import { Model, Factory, ActiveModelSerializer } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; +import promiseAjax from '../../helpers/promise-ajax'; module('Integration | Server | Custom function handler', function(hooks) { hooks.beforeEach(function() { @@ -34,11 +35,11 @@ module('Integration | Server | Custom function handler', function(hooks) { return schema.contacts.all().models; }); - $.ajax({ + promiseAjax({ method: 'GET', url: '/contacts' - }).done((res) => { - assert.deepEqual(res, [{ id: '1' }, { id: '2' }, { id: '3' }]); + }).then((response) => { + assert.deepEqual(response.data, [{ id: '1' }, { id: '2' }, { id: '3' }]); done(); }); }); @@ -60,7 +61,7 @@ module('Integration | Server | Custom function handler', function(hooks) { return {}; }); - $.ajax({ + promiseAjax({ method: 'POST', url: '/contacts', contentType: 'application/json', @@ -71,7 +72,7 @@ module('Integration | Server | Custom function handler', function(hooks) { team_id: 1 } }) - }).done(() => { + }).then(() => { done(); }); }); @@ -93,11 +94,11 @@ module('Integration | Server | Custom function handler', function(hooks) { return {}; }); - $.ajax({ + promiseAjax({ method: 'POST', url: '/form-test', data: 'name=Sam+Selikoff&company=TED&email=sam.selikoff@gmail.com' - }).done(() => { + }).then(() => { done(); }); }); diff --git a/tests/integration/server/customized-normalize-method-test.js b/tests/integration/server/customized-normalize-method-test.js index be567c545..4a1c37118 100644 --- a/tests/integration/server/customized-normalize-method-test.js +++ b/tests/integration/server/customized-normalize-method-test.js @@ -2,6 +2,7 @@ import {module, test} from 'qunit'; import { Model, ActiveModelSerializer } from 'ember-cli-mirage'; import { camelize } from 'ember-cli-mirage/utils/inflector'; import Server from 'ember-cli-mirage/server'; +import promiseAjax from '../../helpers/promise-ajax'; module('Integration | Server | Customized normalize method', function(hooks) { hooks.beforeEach(function() { @@ -43,7 +44,7 @@ module('Integration | Server | Customized normalize method', function(hooks) { server.post('/contacts'); - $.ajax({ + promiseAjax({ method: 'POST', url: '/contacts', data: JSON.stringify({ @@ -60,8 +61,8 @@ module('Integration | Server | Customized normalize method', function(hooks) { ] } }) - }).done((res, status, xhr) => { - assert.equal(xhr.status, 201); + }).then((response) => { + assert.equal(response.xhr.status, 201); assert.equal(server.db.contacts.length, 1); assert.equal(server.db.contacts[0].firstName, 'Zelda'); done(); @@ -83,7 +84,7 @@ module('Integration | Server | Customized normalize method', function(hooks) { return {}; }); - $.ajax({ + promiseAjax({ method: 'PUT', url: '/contacts/1', contentType: 'application/json', @@ -101,7 +102,7 @@ module('Integration | Server | Customized normalize method', function(hooks) { ] } }) - }).done(() => { + }).then(() => { done(); }); }); diff --git a/tests/integration/server/resource-shorthand-test.js b/tests/integration/server/resource-shorthand-test.js index 94e7ab937..a5d57a30e 100644 --- a/tests/integration/server/resource-shorthand-test.js +++ b/tests/integration/server/resource-shorthand-test.js @@ -1,6 +1,7 @@ import {module, test} from 'qunit'; import { Model, ActiveModelSerializer } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; +import promiseAjax from '../../helpers/promise-ajax'; module('Integration | Server | Resource shorthand', function(hooks) { hooks.beforeEach(function() { @@ -39,12 +40,12 @@ module('Integration | Server | Resource shorthand', function(hooks) { this.server.resource('contacts'); - $.ajax({ + promiseAjax({ method: 'GET', url: '/contacts' - }).done(function(res, status, xhr) { - assert.equal(xhr.status, 200); - assert.deepEqual(res, { contacts: [{ id: '1', name: 'Link' }, { id: '2', name: 'Zelda' }] }); + }).then((response) => { + assert.equal(response.xhr.status, 200); + assert.deepEqual(response.data, { contacts: [{ id: '1', name: 'Link' }, { id: '2', name: 'Zelda' }] }); done(); }); }); @@ -67,12 +68,12 @@ module('Integration | Server | Resource shorthand', function(hooks) { this.server.resource('contacts'); this.server.resource('blog-posts', { path: '/posts' }); - $.ajax({ + promiseAjax({ method: 'GET', url: '/contacts/2' - }).done(function(res, status, xhr) { - assert.equal(xhr.status, 200); - assert.deepEqual(res, { contact: { id: '2', name: 'Zelda' } }); + }).then((response) => { + assert.equal(response.xhr.status, 200); + assert.deepEqual(response.data, { contact: { id: '2', name: 'Zelda' } }); done(); }); }); @@ -84,7 +85,7 @@ module('Integration | Server | Resource shorthand', function(hooks) { server.resource('contacts'); - $.ajax({ + promiseAjax({ method: 'POST', url: '/contacts', data: JSON.stringify({ @@ -92,8 +93,8 @@ module('Integration | Server | Resource shorthand', function(hooks) { name: 'Zelda' } }) - }).done((res, status, xhr) => { - assert.equal(xhr.status, 201); + }).then((response) => { + assert.equal(response.xhr.status, 201); assert.equal(server.db.contacts.length, 1); done(); }); @@ -115,7 +116,7 @@ module('Integration | Server | Resource shorthand', function(hooks) { server.resource('contacts'); - $.ajax({ + promiseAjax({ method: 'PUT', url: '/contacts/1', data: JSON.stringify({ @@ -123,8 +124,8 @@ module('Integration | Server | Resource shorthand', function(hooks) { name: 'Zelda' } }) - }).done((res, status, xhr) => { - assert.equal(xhr.status, 200); + }).then((response) => { + assert.equal(response.xhr.status, 200); assert.equal(server.db.contacts[0].name, 'Zelda'); done(); }); @@ -146,7 +147,7 @@ module('Integration | Server | Resource shorthand', function(hooks) { server.resource('contacts'); - $.ajax({ + promiseAjax({ method: 'PATCH', url: '/contacts/1', data: JSON.stringify({ @@ -154,8 +155,8 @@ module('Integration | Server | Resource shorthand', function(hooks) { name: 'Zelda' } }) - }).done((res, status, xhr) => { - assert.equal(xhr.status, 200); + }).then((response) => { + assert.equal(response.xhr.status, 200); assert.equal(server.db.contacts[0].name, 'Zelda'); done(); }); @@ -177,11 +178,11 @@ module('Integration | Server | Resource shorthand', function(hooks) { server.resource('contacts'); - $.ajax({ + promiseAjax({ method: 'DELETE', url: '/contacts/1' - }).done((res, status, xhr) => { - assert.equal(xhr.status, 204); + }).then((response) => { + assert.equal(response.xhr.status, 204); assert.equal(server.db.contacts.length, 0); done(); }); @@ -200,29 +201,29 @@ module('Integration | Server | Resource shorthand', function(hooks) { this.server.resource('blog-posts', { path: '/posts' }); - $.ajax({ + promiseAjax({ method: 'GET', url: '/posts' - }).fail((xhr, textStatus, error) => { + }).catch((errors) => { assert.ok(false, 'failed to find custom path'); done(); - }).done(function(res, status, xhr) { + }).then((response) => { assert.ok(true); done(); }); - $.ajax({ + promiseAjax({ method: 'GET', url: '/posts/2' - }).fail((xhr, textStatus, error) => { + }).catch((errors) => { assert.ok(false, 'failed to find custom path'); done(); - }).done(function(res, status, xhr) { + }).then((response) => { assert.ok(true); done(); }); - $.ajax({ + promiseAjax({ method: 'POST', url: '/posts', data: JSON.stringify({ @@ -230,15 +231,15 @@ module('Integration | Server | Resource shorthand', function(hooks) { name: 'Post 1' } }) - }).fail((xhr, textStatus, error) => { + }).catch((errors) => { assert.ok(false, 'failed to find custom path'); done(); - }).done((res, status, xhr) => { + }).then((response) => { assert.ok(true); done(); }); - $.ajax({ + promiseAjax({ method: 'PUT', url: '/posts/1', data: JSON.stringify({ @@ -246,15 +247,15 @@ module('Integration | Server | Resource shorthand', function(hooks) { name: 'Post 2' } }) - }).fail((xhr, textStatus, error) => { + }).catch((errors) => { assert.ok(false, 'failed to find custom path'); done(); - }).done((res, status, xhr) => { + }).then((response) => { assert.ok(true); done(); }); - $.ajax({ + promiseAjax({ method: 'PATCH', url: '/posts/1', data: JSON.stringify({ @@ -262,21 +263,21 @@ module('Integration | Server | Resource shorthand', function(hooks) { name: 'Post 2' } }) - }).fail((xhr, textStatus, error) => { + }).catch((errors) => { assert.ok(false, 'failed to find custom path'); done(); - }).done((res, status, xhr) => { + }).then((response) => { assert.ok(true); done(); }); - $.ajax({ + promiseAjax({ method: 'DELETE', url: '/posts/1' - }).fail((xhr, textStatus, error) => { + }).catch((errors) => { assert.ok(false, 'failed to find custom path'); done(); - }).done((res, status, xhr) => { + }).then((response) => { assert.ok(true); done(); }); @@ -300,22 +301,22 @@ module('Integration | Server | Resource shorthand', function(hooks) { this.server.resource('contact'); this.server.resource('blog-post', { path: '/posts' }); - $.ajax({ + promiseAjax({ method: 'GET', url: '/contacts' - }).done(function(res, status, xhr) { - assert.equal(xhr.status, 200); - assert.deepEqual(res, { contacts: [{ id: '1', name: 'Link' }, { id: '2', name: 'Zelda' }] }); + }).then((response) => { + assert.equal(response.xhr.status, 200); + assert.deepEqual(response.data, { contacts: [{ id: '1', name: 'Link' }, { id: '2', name: 'Zelda' }] }); done(); }); - $.ajax({ + promiseAjax({ method: 'GET', url: '/posts' - }).fail((xhr, textStatus, error) => { + }).catch((errors) => { assert.ok(false, 'failed to find custom path'); done(); - }).done(function(res, status, xhr) { + }).then((response) => { assert.ok(true); done(); }); @@ -343,11 +344,11 @@ module('Integration | Server | Resource shorthand', function(hooks) { server.resource('contacts', { only: ['index'] }); - $.ajax({ + promiseAjax({ method: 'GET', url: '/contacts' - }).done((res, status, xhr) => { - assert.equal(xhr.status, 200); + }).then((response) => { + assert.equal(response.xhr.status, 200); done(); }); }); @@ -366,17 +367,17 @@ module('Integration | Server | Resource shorthand', function(hooks) { let doneForShow = assert.async(); - $.ajax({ + promiseAjax({ method: 'GET', url: '/contacts/1' - }).fail((xhr, textStatus, error) => { - assert.ok(error.message.indexOf("Mirage: Your Ember app tried to GET '/contacts/1'") !== -1); + }).catch((errors) => { + assert.ok(errors.error.message.indexOf("Mirage: Your Ember app tried to GET '/contacts/1'") !== -1); doneForShow(); }); let doneForCreate = assert.async(); - $.ajax({ + promiseAjax({ method: 'POST', url: '/contacts', data: JSON.stringify({ @@ -384,14 +385,14 @@ module('Integration | Server | Resource shorthand', function(hooks) { name: 'Zelda' } }) - }).fail((xhr, textStatus, error) => { - assert.ok(error.message.indexOf("Mirage: Your Ember app tried to POST '/contacts'") !== -1); + }).catch((errors) => { + assert.ok(errors.error.message.indexOf("Mirage: Your Ember app tried to POST '/contacts'") !== -1); doneForCreate(); }); let doneForPut = assert.async(); - $.ajax({ + promiseAjax({ method: 'PUT', url: '/contacts/1', data: JSON.stringify({ @@ -399,14 +400,14 @@ module('Integration | Server | Resource shorthand', function(hooks) { name: 'Zelda' } }) - }).fail((xhr, textStatus, error) => { - assert.ok(error.message.indexOf("Mirage: Your Ember app tried to PUT '/contacts/1'") !== -1); + }).catch((errors) => { + assert.ok(errors.error.message.indexOf("Mirage: Your Ember app tried to PUT '/contacts/1'") !== -1); doneForPut(); }); let doneForPatch = assert.async(); - $.ajax({ + promiseAjax({ method: 'PATCH', url: '/contacts/1', data: JSON.stringify({ @@ -414,18 +415,18 @@ module('Integration | Server | Resource shorthand', function(hooks) { name: 'Zelda' } }) - }).fail((xhr, textStatus, error) => { - assert.ok(error.message.indexOf("Mirage: Your Ember app tried to PATCH '/contacts/1'") !== -1); + }).catch((errors) => { + assert.ok(errors.error.message.indexOf("Mirage: Your Ember app tried to PATCH '/contacts/1'") !== -1); doneForPatch(); }); let doneForDelete = assert.async(); - $.ajax({ + promiseAjax({ method: 'DELETE', url: '/contacts/1' - }).fail((xhr, textStatus, error) => { - assert.ok(error.message.indexOf("Mirage: Your Ember app tried to DELETE '/contacts/1'") !== -1); + }).catch((errors) => { + assert.ok(errors.error.message.indexOf("Mirage: Your Ember app tried to DELETE '/contacts/1'") !== -1); doneForDelete(); }); }); @@ -444,21 +445,21 @@ module('Integration | Server | Resource shorthand', function(hooks) { let doneForIndex = assert.async(); - $.ajax({ + promiseAjax({ method: 'GET', url: '/contacts' - }).done((res, status, xhr) => { - assert.equal(xhr.status, 200); + }).then((response) => { + assert.equal(response.xhr.status, 200); doneForIndex(); }); let doneForShow = assert.async(); - $.ajax({ + promiseAjax({ method: 'GET', url: '/contacts' - }).done((res, status, xhr) => { - assert.equal(xhr.status, 200); + }).then((response) => { + assert.equal(response.xhr.status, 200); doneForShow(); }); }); @@ -477,7 +478,7 @@ module('Integration | Server | Resource shorthand', function(hooks) { let doneForCreate = assert.async(); - $.ajax({ + promiseAjax({ method: 'POST', url: '/contacts', data: JSON.stringify({ @@ -485,14 +486,14 @@ module('Integration | Server | Resource shorthand', function(hooks) { name: 'Zelda' } }) - }).fail((xhr, textStatus, error) => { - assert.ok(error.message.indexOf("Mirage: Your Ember app tried to POST '/contacts'") !== -1); + }).catch((errors) => { + assert.ok(errors.error.message.indexOf("Mirage: Your Ember app tried to POST '/contacts'") !== -1); doneForCreate(); }); let doneForPut = assert.async(); - $.ajax({ + promiseAjax({ method: 'PUT', url: '/contacts/1', data: JSON.stringify({ @@ -500,14 +501,14 @@ module('Integration | Server | Resource shorthand', function(hooks) { name: 'Zelda' } }) - }).fail((xhr, textStatus, error) => { - assert.ok(error.message.indexOf("Mirage: Your Ember app tried to PUT '/contacts/1'") !== -1); + }).catch((errors) => { + assert.ok(errors.error.message.indexOf("Mirage: Your Ember app tried to PUT '/contacts/1'") !== -1); doneForPut(); }); let doneForPatch = assert.async(); - $.ajax({ + promiseAjax({ method: 'PATCH', url: '/contacts/1', data: JSON.stringify({ @@ -515,18 +516,18 @@ module('Integration | Server | Resource shorthand', function(hooks) { name: 'Zelda' } }) - }).fail((xhr, textStatus, error) => { - assert.ok(error.message.indexOf("Mirage: Your Ember app tried to PATCH '/contacts/1'") !== -1); + }).catch((errors) => { + assert.ok(errors.error.message.indexOf("Mirage: Your Ember app tried to PATCH '/contacts/1'") !== -1); doneForPatch(); }); let doneForDelete = assert.async(); - $.ajax({ + promiseAjax({ method: 'DELETE', url: '/contacts/1' - }).fail((xhr, textStatus, error) => { - assert.ok(error.message.indexOf("Mirage: Your Ember app tried to DELETE '/contacts/1'") !== -1); + }).catch((errors) => { + assert.ok(errors.error.message.indexOf("Mirage: Your Ember app tried to DELETE '/contacts/1'") !== -1); doneForDelete(); }); }); diff --git a/tests/integration/server/shorthand-sanity-test.js b/tests/integration/server/shorthand-sanity-test.js index ab1a96b13..89dcbe7e5 100644 --- a/tests/integration/server/shorthand-sanity-test.js +++ b/tests/integration/server/shorthand-sanity-test.js @@ -1,6 +1,7 @@ import {module, test} from 'qunit'; import { Model, ActiveModelSerializer } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; +import promiseAjax from '../../helpers/promise-ajax'; module('Integration | Server | Shorthand sanity check', function(hooks) { hooks.beforeEach(function() { @@ -33,12 +34,12 @@ module('Integration | Server | Shorthand sanity check', function(hooks) { this.server.get('/contacts'); - $.ajax({ + promiseAjax({ method: 'GET', url: '/contacts' - }).done(function(res, status, xhr) { - assert.equal(xhr.status, 200); - assert.deepEqual(res, { contacts: [{ id: '1', name: 'Link' }] }); + }).then((response) => { + assert.equal(response.xhr.status, 200); + assert.deepEqual(response.data, { contacts: [{ id: '1', name: 'Link' }] }); done(); }); }); @@ -50,7 +51,7 @@ module('Integration | Server | Shorthand sanity check', function(hooks) { server.post('/contacts'); - $.ajax({ + promiseAjax({ method: 'POST', url: '/contacts', data: JSON.stringify({ @@ -58,8 +59,8 @@ module('Integration | Server | Shorthand sanity check', function(hooks) { name: 'Zelda' } }) - }).done((res, status, xhr) => { - assert.equal(xhr.status, 201); + }).then((response) => { + assert.equal(response.xhr.status, 201); assert.equal(server.db.contacts.length, 1); done(); }); @@ -78,7 +79,7 @@ module('Integration | Server | Shorthand sanity check', function(hooks) { server.put('/contacts/:id'); - $.ajax({ + promiseAjax({ method: 'PUT', url: '/contacts/1', data: JSON.stringify({ @@ -86,8 +87,8 @@ module('Integration | Server | Shorthand sanity check', function(hooks) { name: 'Zelda' } }) - }).done((res, status, xhr) => { - assert.equal(xhr.status, 200); + }).then((response) => { + assert.equal(response.xhr.status, 200); assert.equal(server.db.contacts[0].name, 'Zelda'); done(); }); @@ -106,7 +107,7 @@ module('Integration | Server | Shorthand sanity check', function(hooks) { server.patch('/contacts/:id'); - $.ajax({ + promiseAjax({ method: 'PATCH', url: '/contacts/1', data: JSON.stringify({ @@ -114,8 +115,8 @@ module('Integration | Server | Shorthand sanity check', function(hooks) { name: 'Zelda' } }) - }).done((res, status, xhr) => { - assert.equal(xhr.status, 200); + }).then((response) => { + assert.equal(response.xhr.status, 200); assert.equal(server.db.contacts[0].name, 'Zelda'); done(); }); @@ -134,11 +135,11 @@ module('Integration | Server | Shorthand sanity check', function(hooks) { server.del('/contacts/:id'); - $.ajax({ + promiseAjax({ method: 'DELETE', url: '/contacts/1' - }).done((res, status, xhr) => { - assert.equal(xhr.status, 204); + }).then((response) => { + assert.equal(response.xhr.status, 204); assert.equal(server.db.contacts.length, 0); done(); }); From da46f91f7ebf4ba05d6478cb537a182529527be0 Mon Sep 17 00:00:00 2001 From: Patrick Holloway Date: Tue, 14 Nov 2017 14:44:30 -0500 Subject: [PATCH 109/879] make pretender request tracking configurable --- addon/server.js | 17 ++++++++- tests/integration/server-config-test.js | 47 +++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/addon/server.js b/addon/server.js index e2d03b40e..bd8767bb8 100644 --- a/addon/server.js +++ b/addon/server.js @@ -61,7 +61,7 @@ function createPretender(server) { mirage/config.js file. Did you forget to add your namespace?` ); }; - }, { trackRequests: false }); + }, { trackRequests: server.shouldTrackRequests() }); } const defaultRouteOptions = { @@ -154,6 +154,7 @@ export default class Server { this.timing = this.timing || config.timing || 400; this.namespace = this.namespace || config.namespace || ''; this.urlPrefix = this.urlPrefix || config.urlPrefix || ''; + this.trackRequests = config.trackRequests; this._defineRouteHandlerHelpers(); @@ -181,6 +182,9 @@ export default class Server { let hasFactories = this._hasModulesOfType(config, 'factories'); let hasDefaultScenario = config.scenarios && config.scenarios.hasOwnProperty('default'); + let didOverridePretenderConfig = (config.trackRequests !== undefined) && this.pretender; + assert(!didOverridePretenderConfig, + 'You cannot modify Pretender\'s request tracking once the server is created'); this.pretender = this.pretender || createPretender(this); if (config.baseConfig) { @@ -232,6 +236,17 @@ export default class Server { return typeof this.logging !== 'undefined' ? this.logging : !this.isTest(); } + /** + * Determines if the server should track requests. + * + * @method shouldTrackRequests + * @return The value of this.trackRequests if defined, false otherwise. + * @public + */ + shouldTrackRequests() { + return typeof this.trackRequests !== 'undefined' ? this.trackRequests : false; + } + /** * Load the configuration given, setting timing to 0 if in the test * environment. diff --git a/tests/integration/server-config-test.js b/tests/integration/server-config-test.js index 9f390f544..cd13cfdaa 100644 --- a/tests/integration/server-config-test.js +++ b/tests/integration/server-config-test.js @@ -250,4 +250,51 @@ module('Integration | Server Config', function(hooks) { }); }, /You cannot modify Mirage's environment once the server is created/); }); + + test('changing the trackRequests configuration of the server throws an error', function(assert) { + let { server } = this; + + assert.throws(function() { + server.config({ + trackRequests: true + }); + }, /You cannot modify Pretender's request tracking once the server is created/); + }); +}); + +module('Integration | Server Config | Pretender', function(hooks) { + hooks.beforeEach(function() { + this.server = new Server({ + environment: 'development', + models: { + contact: Model, + post: Model + }, + serializers: { + contact: ActiveModelSerializer + }, + trackRequests: true + }); + this.server.timing = 0; + this.server.logging = false; + }), + + hooks.afterEach(function() { + this.server.shutdown(); + }), + + test('pretender request logging can be configured', function(assert) { + assert.expect(1); + let done = assert.async(); + + let { server } = this; + server.trackRequests = true; + server.get('/contacts'); + + $.getJSON('/contacts', function(data) { + let handledRequest = server.pretender.handledRequests[0]; + assert.equal(handledRequest.method, 'GET'); + done(); + }); + }); }); From 33eb00408e9150a89f635d6e584ff54a4139a1b9 Mon Sep 17 00:00:00 2001 From: Patrick Holloway Date: Wed, 15 Nov 2017 15:51:13 -0500 Subject: [PATCH 110/879] configuration for pretender tracking needs to be in environment config --- app/initializers/ember-cli-mirage.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/initializers/ember-cli-mirage.js b/app/initializers/ember-cli-mirage.js index 3e6923417..5df8567cf 100644 --- a/app/initializers/ember-cli-mirage.js +++ b/app/initializers/ember-cli-mirage.js @@ -22,7 +22,8 @@ export function startMirage(env = ENV) { let environment = env.environment; let discoverEmberDataModels = getWithDefault(env['ember-cli-mirage'] || {}, 'discoverEmberDataModels', true); let modules = readModules(env.modulePrefix); - let options = _assign(modules, {environment, baseConfig, testConfig, discoverEmberDataModels}); + let trackRequests = env['ember-cli-mirage']; + let options = _assign(modules, {environment, baseConfig, testConfig, discoverEmberDataModels, trackRequests}); return new Server(options); } From 552348effa67dfd508f98319106319ecbd91acfe Mon Sep 17 00:00:00 2001 From: Andy Brown Date: Sun, 19 Nov 2017 20:42:24 +0100 Subject: [PATCH 111/879] refactor: use async/await in tests --- tests/integration/http-verbs-test.js | 68 ++- .../route-handlers/function-handler-test.js | 57 +-- .../serializers/base/full-request-test.js | 81 ++-- .../server/custom-function-handler-test.js | 24 +- .../customized-normalize-method-test.js | 21 +- .../server/resource-shorthand-test.js | 448 ++++++++---------- .../server/shorthand-sanity-test.js | 60 +-- 7 files changed, 337 insertions(+), 422 deletions(-) diff --git a/tests/integration/http-verbs-test.js b/tests/integration/http-verbs-test.js index fddfbc368..b6b8fb346 100644 --- a/tests/integration/http-verbs-test.js +++ b/tests/integration/http-verbs-test.js @@ -19,89 +19,79 @@ module('Integration | HTTP Verbs', function(hooks) { this.server.shutdown(); }); - test('mirage responds to get', function(assert) { + test('mirage responds to get', async function(assert) { assert.expect(1); - let done = assert.async(); this.server.get('/contacts', function() { return true; }); - promiseAjax({ + let { data } = await promiseAjax({ method: 'GET', url: '/contacts' - }).then((response) => { - assert.equal(response.data, true); - done(); }); + + assert.equal(data, true); }); - test('mirage responds to post', function(assert) { + test('mirage responds to post', async function(assert) { assert.expect(1); - let done = assert.async(); this.server.post('/contacts', function() { return true; }); - promiseAjax({ + let { data } = await promiseAjax({ method: 'POST', url: '/contacts' - }).then((response) => { - assert.equal(response.data, true); - done(); }); + + assert.equal(data, true); }); - test('mirage responds to put', function(assert) { + test('mirage responds to put', async function(assert) { assert.expect(1); - let done = assert.async(); this.server.put('/contacts', function() { return true; }); - promiseAjax({ + let { data } = await promiseAjax({ method: 'PUT', url: '/contacts' - }).then((response) => { - assert.equal(response.data, true); - done(); }); + + assert.equal(data, true); }); - test('mirage responds to delete', function(assert) { + test('mirage responds to delete', async function(assert) { assert.expect(1); - let done = assert.async(); this.server.delete('/contacts', function() { return true; }); - promiseAjax({ + let { data } = await promiseAjax({ method: 'DELETE', url: '/contacts' - }).then((response) => { - assert.equal(response.data, true); - done(); }); + + assert.equal(data, true); }); - test('mirage responds to patch', function(assert) { + test('mirage responds to patch', async function(assert) { assert.expect(1); - let done = assert.async(); this.server.patch('/contacts', function() { return true; }); - promiseAjax({ + let { data } = await promiseAjax({ method: 'PATCH', url: '/contacts' - }).then((response) => { - assert.equal(response.data, true); - done(); }); + + assert.equal(data, true); }); test('mirage responds to resource', function(assert) { @@ -118,18 +108,18 @@ module('Integration | HTTP Verbs', function(hooks) { }); }); - test('response code can be customized', function(assert) { + test('response code can be customized', async function(assert) { assert.expect(1); - let done = assert.async(); this.server.get('/contacts', {}, 404); - promiseAjax({ - method: 'GET', - url: '/contacts' - }).catch(function(error) { - assert.ok(error.xhr.status, 404); - done(); - }); + try { + await promiseAjax({ + method: 'GET', + url: '/contacts' + }); + } catch(e) { + assert.ok(e.xhr.status, 404); + } }); }); diff --git a/tests/integration/route-handlers/function-handler-test.js b/tests/integration/route-handlers/function-handler-test.js index 740304cf5..661e03f3d 100644 --- a/tests/integration/route-handlers/function-handler-test.js +++ b/tests/integration/route-handlers/function-handler-test.js @@ -33,40 +33,39 @@ module('Integration | Route handlers | Function handler', function(hooks) { this.server.shutdown(); }); - test('a meaningful error is thrown if a custom route handler throws an error', function(assert) { + test('a meaningful error is thrown if a custom route handler throws an error', async function(assert) { assert.expect(1); - let done = assert.async(); this.server.get('/users', function() { throw 'I goofed'; }); - promiseAjax({ - method: 'GET', - url: '/users' - }).catch((error) => { - assert.equal(error.xhr.responseText, 'Mirage: Your GET handler for the url /users threw an error: I goofed'); - done(); - }); + try { + await promiseAjax({ + method: 'GET', + url: '/users' + }); + } catch(e) { + assert.equal( + e.xhr.responseText, + 'Mirage: Your GET handler for the url /users threw an error: I goofed' + ); + } }); - test('mirage response string is not serialized to string', function(assert) { + test('mirage response string is not serialized to string', async function(assert) { assert.expect(1); - let done = assert.async(); this.server.get('/users', function() { return new Response(200, { 'Content-Type': 'text/csv' }, 'firstname,lastname\nbob,dylon'); }); - promiseAjax({ method: 'GET', url: '/users' }).then((response) => { - assert.equal(response.data, 'firstname,lastname\nbob,dylon'); - done(); - }); + let { data } = await promiseAjax({ method: 'GET', url: '/users' }); + assert.equal(data, 'firstname,lastname\nbob,dylon'); }); - test('function can return a promise with non-serializable content', function(assert) { + test('function can return a promise with non-serializable content', async function(assert) { assert.expect(1); - let done = assert.async(); this.server.get('/users', function() { return new Promise(resolve => { @@ -74,15 +73,12 @@ module('Integration | Route handlers | Function handler', function(hooks) { }); }); - promiseAjax({ method: 'GET', url: '/users' }).then((response) => { - assert.equal(response.data, 'firstname,lastname\nbob,dylan'); - done(); - }); + let { data } = await promiseAjax({ method: 'GET', url: '/users' }); + assert.equal(data, 'firstname,lastname\nbob,dylan'); }); - test('function can return a promise with serializable content', function(assert) { + test('function can return a promise with serializable content', async function(assert) { assert.expect(1); - let done = assert.async(); let user = this.schema.users.create({ name: 'Sam' }); @@ -92,15 +88,12 @@ module('Integration | Route handlers | Function handler', function(hooks) { }); }); - promiseAjax({ method: 'GET', url: '/users' }).then((response) => { - assert.deepEqual(response.data, { users: [ { id: user.id, name: 'Sam' } ] }); - done(); - }); + let { data } = await promiseAjax({ method: 'GET', url: '/users' }); + assert.deepEqual(data, { users: [ { id: user.id, name: 'Sam' } ] }); }); - test('function can return a promise with an empty string', function(assert) { + test('function can return a promise with an empty string', async function(assert) { assert.expect(1); - let done = assert.async(); this.server.get('/users', function() { return new Promise(resolve => { @@ -108,10 +101,8 @@ module('Integration | Route handlers | Function handler', function(hooks) { }); }); - promiseAjax({ method: 'GET', url: '/users' }).then((response) => { - assert.equal(response.data, ''); - done(); - }); + let { data } = await promiseAjax({ method: 'GET', url: '/users' }); + assert.equal(data, ''); }); test('#serialize uses the default serializer on a model', function(assert) { diff --git a/tests/integration/serializers/base/full-request-test.js b/tests/integration/serializers/base/full-request-test.js index dfec4c6f9..89ebe4df0 100644 --- a/tests/integration/serializers/base/full-request-test.js +++ b/tests/integration/serializers/base/full-request-test.js @@ -48,9 +48,9 @@ module('Integration | Serializers | Base | Full Request', function(hooks) { this.server.shutdown(); }); - test('the appropriate serializer is used', function(assert) { + test('the appropriate serializer is used', async function(assert) { assert.expect(1); - let done = assert.async(); + let author = this.server.schema.authors.create({ first: 'Link', last: 'of Hyrule', @@ -64,26 +64,24 @@ module('Integration | Serializers | Base | Full Request', function(hooks) { return schema.authors.find(id); }); - promiseAjax({ + let { data } = await promiseAjax({ method: 'GET', url: '/authors/1' - }).then((response) => { - assert.deepEqual(response.data, { - author: { - id: '1', - first: 'Link', - posts: [ - { id: '1', title: 'Lorem ipsum' } - ] - } - }); - done(); + }); + + assert.deepEqual(data, { + author: { + id: '1', + first: 'Link', + posts: [ + { id: '1', title: 'Lorem ipsum' } + ] + } }); }); - test('components decoded', function(assert) { + test('components decoded', async function(assert) { assert.expect(1); - let done = assert.async(); this.server.get('/authors/:id', function(schema, request) { let { id } = request.params; @@ -91,20 +89,16 @@ module('Integration | Serializers | Base | Full Request', function(hooks) { return { data: { id } }; }); - promiseAjax({ + let { data } = await promiseAjax({ method: 'GET', url: '/authors/%3A1' - }).then((response) => { - assert.deepEqual(response.data, { - data: { id: ':1' } - }); - done(); }); + + assert.deepEqual(data, { data: { id: ':1' } }); }); - test('a response falls back to the application serializer, if it exists', function(assert) { + test('a response falls back to the application serializer, if it exists', async function(assert) { assert.expect(1); - let done = assert.async(); this.server.schema.posts.create({ title: 'Lorem', date: '20001010' @@ -116,22 +110,20 @@ module('Integration | Serializers | Base | Full Request', function(hooks) { return schema.posts.find(id); }); - promiseAjax({ + let { data } = await promiseAjax({ method: 'GET', url: '/posts/1' - }).then((response) => { - assert.deepEqual(response.data, { - id: '1', - title: 'Lorem', - date: '20001010' - }); - done(); + }); + + assert.deepEqual(data, { + id: '1', + title: 'Lorem', + date: '20001010' }); }); - test('serializer.include is invoked when it is a function', function(assert) { + test('serializer.include is invoked when it is a function', async function(assert) { assert.expect(1); - let done = assert.async(); let post = this.server.schema.posts.create({ title: 'Lorem', date: '20001010' @@ -145,20 +137,19 @@ module('Integration | Serializers | Base | Full Request', function(hooks) { return schema.comments.find(id); }); - promiseAjax({ + let { data } = await promiseAjax({ method: 'GET', url: '/comments/1?include_post=true' - }).then((response) => { - assert.deepEqual(response.data, { + }); + + assert.deepEqual(data, { + id: '1', + description: 'Lorem is the best', + post: { id: '1', - description: 'Lorem is the best', - post: { - id: '1', - title: 'Lorem', - date: '20001010' - } - }); - done(); + title: 'Lorem', + date: '20001010' + } }); }); }); diff --git a/tests/integration/server/custom-function-handler-test.js b/tests/integration/server/custom-function-handler-test.js index b5dab6539..118309e9b 100644 --- a/tests/integration/server/custom-function-handler-test.js +++ b/tests/integration/server/custom-function-handler-test.js @@ -25,9 +25,8 @@ module('Integration | Server | Custom function handler', function(hooks) { this.server.shutdown(); }); - test(`a POJA of models defaults to responding with an array of each model's attrs`, function(assert) { + test(`a POJA of models defaults to responding with an array of each model's attrs`, async function(assert) { assert.expect(1); - let done = assert.async(); let { server } = this; server.createList('contact', 3); @@ -35,18 +34,16 @@ module('Integration | Server | Custom function handler', function(hooks) { return schema.contacts.all().models; }); - promiseAjax({ + let { data } = await promiseAjax({ method: 'GET', url: '/contacts' - }).then((response) => { - assert.deepEqual(response.data, [{ id: '1' }, { id: '2' }, { id: '3' }]); - done(); }); + + assert.deepEqual(data, [{ id: '1' }, { id: '2' }, { id: '3' }]); }); - test(`#normalizedRequestAttrs returns an object with the primary resource's attrs and belongsTo keys camelized`, function(assert) { + test(`#normalizedRequestAttrs returns an object with the primary resource's attrs and belongsTo keys camelized`, async function(assert) { assert.expect(1); - let done = assert.async(); let { server } = this; server.post('/contacts', function() { @@ -61,7 +58,7 @@ module('Integration | Server | Custom function handler', function(hooks) { return {}; }); - promiseAjax({ + await promiseAjax({ method: 'POST', url: '/contacts', contentType: 'application/json', @@ -72,14 +69,11 @@ module('Integration | Server | Custom function handler', function(hooks) { team_id: 1 } }) - }).then(() => { - done(); }); }); - test(`#normalizedRequestAttrs parses a x-www-form-urlencoded request and returns a POJO`, function(assert) { + test(`#normalizedRequestAttrs parses a x-www-form-urlencoded request and returns a POJO`, async function(assert) { assert.expect(1); - let done = assert.async(); let { server } = this; server.post('/form-test', function() { @@ -94,12 +88,10 @@ module('Integration | Server | Custom function handler', function(hooks) { return {}; }); - promiseAjax({ + await promiseAjax({ method: 'POST', url: '/form-test', data: 'name=Sam+Selikoff&company=TED&email=sam.selikoff@gmail.com' - }).then(() => { - done(); }); }); }); diff --git a/tests/integration/server/customized-normalize-method-test.js b/tests/integration/server/customized-normalize-method-test.js index 4a1c37118..c6bd65cea 100644 --- a/tests/integration/server/customized-normalize-method-test.js +++ b/tests/integration/server/customized-normalize-method-test.js @@ -37,14 +37,13 @@ module('Integration | Server | Customized normalize method', function(hooks) { this.server.shutdown(); }); - test('custom model-specific normalize functions are used', function(assert) { + test('custom model-specific normalize functions are used', async function(assert) { let { server } = this; assert.expect(3); - let done = assert.async(); server.post('/contacts'); - promiseAjax({ + let { xhr } = await promiseAjax({ method: 'POST', url: '/contacts', data: JSON.stringify({ @@ -61,17 +60,15 @@ module('Integration | Server | Customized normalize method', function(hooks) { ] } }) - }).then((response) => { - assert.equal(response.xhr.status, 201); - assert.equal(server.db.contacts.length, 1); - assert.equal(server.db.contacts[0].firstName, 'Zelda'); - done(); }); + + assert.equal(xhr.status, 201); + assert.equal(server.db.contacts.length, 1); + assert.equal(server.db.contacts[0].firstName, 'Zelda'); }); - test('custom model-specific normalize functions are used with custom function handlers', function(assert) { + test('custom model-specific normalize functions are used with custom function handlers', async function(assert) { let { server } = this; - let done = assert.async(); server.put('/contacts/:id', function(schema, request) { let attrs = this.normalizedRequestAttrs(); @@ -84,7 +81,7 @@ module('Integration | Server | Customized normalize method', function(hooks) { return {}; }); - promiseAjax({ + await promiseAjax({ method: 'PUT', url: '/contacts/1', contentType: 'application/json', @@ -102,8 +99,6 @@ module('Integration | Server | Customized normalize method', function(hooks) { ] } }) - }).then(() => { - done(); }); }); }); diff --git a/tests/integration/server/resource-shorthand-test.js b/tests/integration/server/resource-shorthand-test.js index a5d57a30e..5808081a1 100644 --- a/tests/integration/server/resource-shorthand-test.js +++ b/tests/integration/server/resource-shorthand-test.js @@ -23,9 +23,8 @@ module('Integration | Server | Resource shorthand', function(hooks) { this.server.shutdown(); }); - test('resource generates get shorthand for index action', function(assert) { + test('resource generates get shorthand for index action', async function(assert) { assert.expect(2); - let done = assert.async(1); this.server.db.loadData({ contacts: [ @@ -40,19 +39,17 @@ module('Integration | Server | Resource shorthand', function(hooks) { this.server.resource('contacts'); - promiseAjax({ + let { data, xhr } = await promiseAjax({ method: 'GET', url: '/contacts' - }).then((response) => { - assert.equal(response.xhr.status, 200); - assert.deepEqual(response.data, { contacts: [{ id: '1', name: 'Link' }, { id: '2', name: 'Zelda' }] }); - done(); }); + + assert.equal(xhr.status, 200); + assert.deepEqual(data, { contacts: [{ id: '1', name: 'Link' }, { id: '2', name: 'Zelda' }] }); }); - test('resource generates get shorthand for show action', function(assert) { + test('resource generates get shorthand for show action', async function(assert) { assert.expect(2); - let done = assert.async(1); this.server.db.loadData({ contacts: [ @@ -68,24 +65,22 @@ module('Integration | Server | Resource shorthand', function(hooks) { this.server.resource('contacts'); this.server.resource('blog-posts', { path: '/posts' }); - promiseAjax({ + let { data, xhr } = await promiseAjax({ method: 'GET', url: '/contacts/2' - }).then((response) => { - assert.equal(response.xhr.status, 200); - assert.deepEqual(response.data, { contact: { id: '2', name: 'Zelda' } }); - done(); }); + + assert.equal(xhr.status, 200); + assert.deepEqual(data, { contact: { id: '2', name: 'Zelda' } }); }); - test('resource generates post shorthand', function(assert) { + test('resource generates post shorthand', async function(assert) { let { server } = this; assert.expect(2); - let done = assert.async(1); server.resource('contacts'); - promiseAjax({ + let { xhr } = await promiseAjax({ method: 'POST', url: '/contacts', data: JSON.stringify({ @@ -93,17 +88,15 @@ module('Integration | Server | Resource shorthand', function(hooks) { name: 'Zelda' } }) - }).then((response) => { - assert.equal(response.xhr.status, 201); - assert.equal(server.db.contacts.length, 1); - done(); }); + + assert.equal(xhr.status, 201); + assert.equal(server.db.contacts.length, 1); }); - test('resource generates put shorthand', function(assert) { + test('resource generates put shorthand', async function(assert) { let { server } = this; assert.expect(2); - let done = assert.async(1); this.server.db.loadData({ contacts: [ @@ -116,7 +109,7 @@ module('Integration | Server | Resource shorthand', function(hooks) { server.resource('contacts'); - promiseAjax({ + let { xhr } = await promiseAjax({ method: 'PUT', url: '/contacts/1', data: JSON.stringify({ @@ -124,17 +117,15 @@ module('Integration | Server | Resource shorthand', function(hooks) { name: 'Zelda' } }) - }).then((response) => { - assert.equal(response.xhr.status, 200); - assert.equal(server.db.contacts[0].name, 'Zelda'); - done(); }); + + assert.equal(xhr.status, 200); + assert.equal(server.db.contacts[0].name, 'Zelda'); }); - test('resource generates patch shorthand', function(assert) { + test('resource generates patch shorthand', async function(assert) { let { server } = this; assert.expect(2); - let done = assert.async(1); this.server.db.loadData({ contacts: [ @@ -147,7 +138,7 @@ module('Integration | Server | Resource shorthand', function(hooks) { server.resource('contacts'); - promiseAjax({ + let { xhr } = await promiseAjax({ method: 'PATCH', url: '/contacts/1', data: JSON.stringify({ @@ -155,17 +146,15 @@ module('Integration | Server | Resource shorthand', function(hooks) { name: 'Zelda' } }) - }).then((response) => { - assert.equal(response.xhr.status, 200); - assert.equal(server.db.contacts[0].name, 'Zelda'); - done(); }); + + assert.equal(xhr.status, 200); + assert.equal(server.db.contacts[0].name, 'Zelda'); }); - test('resource generates delete shorthand works', function(assert) { + test('resource generates delete shorthand works', async function(assert) { let { server } = this; assert.expect(2); - let done = assert.async(1); this.server.db.loadData({ contacts: [ @@ -178,19 +167,17 @@ module('Integration | Server | Resource shorthand', function(hooks) { server.resource('contacts'); - promiseAjax({ + let { xhr } = await promiseAjax({ method: 'DELETE', url: '/contacts/1' - }).then((response) => { - assert.equal(response.xhr.status, 204); - assert.equal(server.db.contacts.length, 0); - done(); }); + + assert.equal(xhr.status, 204); + assert.equal(server.db.contacts.length, 0); }); - test('resource accepts a custom path for a resource', function(assert) { + test('resource accepts a custom path for a resource', async function(assert) { assert.expect(6); - let done = assert.async(6); this.server.db.loadData({ blogPosts: [ @@ -201,29 +188,19 @@ module('Integration | Server | Resource shorthand', function(hooks) { this.server.resource('blog-posts', { path: '/posts' }); - promiseAjax({ + let indexResponse = await promiseAjax({ method: 'GET', url: '/posts' - }).catch((errors) => { - assert.ok(false, 'failed to find custom path'); - done(); - }).then((response) => { - assert.ok(true); - done(); }); + assert.equal(indexResponse.xhr.status, 200, 'Should receive a 200 response from resource index action'); - promiseAjax({ + let showResponse = await promiseAjax({ method: 'GET', url: '/posts/2' - }).catch((errors) => { - assert.ok(false, 'failed to find custom path'); - done(); - }).then((response) => { - assert.ok(true); - done(); }); + assert.equal(showResponse.xhr.status, 200, 'Should receive a 200 response from resource show action'); - promiseAjax({ + let createResponse = await promiseAjax({ method: 'POST', url: '/posts', data: JSON.stringify({ @@ -231,15 +208,10 @@ module('Integration | Server | Resource shorthand', function(hooks) { name: 'Post 1' } }) - }).catch((errors) => { - assert.ok(false, 'failed to find custom path'); - done(); - }).then((response) => { - assert.ok(true); - done(); }); + assert.equal(createResponse.xhr.status, 201, 'Should receive 201 response from resource create action'); - promiseAjax({ + let updatePutResponse = await promiseAjax({ method: 'PUT', url: '/posts/1', data: JSON.stringify({ @@ -247,15 +219,10 @@ module('Integration | Server | Resource shorthand', function(hooks) { name: 'Post 2' } }) - }).catch((errors) => { - assert.ok(false, 'failed to find custom path'); - done(); - }).then((response) => { - assert.ok(true); - done(); }); + assert.equal(updatePutResponse.xhr.status, 200, 'Should receive 200 response from resource update action with PUT'); - promiseAjax({ + let updatePatchResponse = await promiseAjax({ method: 'PATCH', url: '/posts/1', data: JSON.stringify({ @@ -263,29 +230,18 @@ module('Integration | Server | Resource shorthand', function(hooks) { name: 'Post 2' } }) - }).catch((errors) => { - assert.ok(false, 'failed to find custom path'); - done(); - }).then((response) => { - assert.ok(true); - done(); }); + assert.equal(updatePatchResponse.xhr.status, 200, 'Should receive 200 response from resource update action with PATCH'); - promiseAjax({ + let deleteResponse = await promiseAjax({ method: 'DELETE', url: '/posts/1' - }).catch((errors) => { - assert.ok(false, 'failed to find custom path'); - done(); - }).then((response) => { - assert.ok(true); - done(); }); + assert.equal(deleteResponse.xhr.status, 204, 'Should receive 204 response from the resource delete action'); }); - test('resource accepts singular name', function(assert) { - assert.expect(3); - let done = assert.async(2); + test('resource accepts singular name', async function(assert) { + assert.expect(4); this.server.db.loadData({ contacts: [ @@ -301,25 +257,27 @@ module('Integration | Server | Resource shorthand', function(hooks) { this.server.resource('contact'); this.server.resource('blog-post', { path: '/posts' }); - promiseAjax({ + let contactsResponse = await promiseAjax({ method: 'GET', url: '/contacts' - }).then((response) => { - assert.equal(response.xhr.status, 200); - assert.deepEqual(response.data, { contacts: [{ id: '1', name: 'Link' }, { id: '2', name: 'Zelda' }] }); - done(); }); - promiseAjax({ + assert.equal(contactsResponse.xhr.status, 200); + assert.deepEqual( + contactsResponse.data, + { contacts: [{ id: '1', name: 'Link' }, { id: '2', name: 'Zelda' }] } + ); + + let postsResponse = await promiseAjax({ method: 'GET', url: '/posts' - }).catch((errors) => { - assert.ok(false, 'failed to find custom path'); - done(); - }).then((response) => { - assert.ok(true); - done(); }); + + assert.equal(postsResponse.xhr.status, 200); + assert.deepEqual( + postsResponse.data, + { blog_posts: [{ id: '1', title: 'Post 1' }, { id: '2', title: 'Post 2' }] } + ); }); test('resource does not accept both :all and :except options', function(assert) { @@ -330,10 +288,9 @@ module('Integration | Server | Resource shorthand', function(hooks) { }, 'cannot use both :only and :except options'); }); - test('resource generates shorthands which are whitelisted by :only option', function(assert) { + test('resource generates shorthands which are whitelisted by :only option', async function(assert) { let { server } = this; assert.expect(1); - let done = assert.async(1); server.db.loadData({ contacts: [ @@ -344,16 +301,15 @@ module('Integration | Server | Resource shorthand', function(hooks) { server.resource('contacts', { only: ['index'] }); - promiseAjax({ + let { xhr } = await promiseAjax({ method: 'GET', url: '/contacts' - }).then((response) => { - assert.equal(response.xhr.status, 200); - done(); }); + + assert.equal(xhr.status, 200); }); - test('resource does not generate shorthands which are not whitelisted with :only option', function(assert) { + test('resource does not generate shorthands which are not whitelisted with :only option', async function(assert) { let { server } = this; assert.expect(5); @@ -365,73 +321,83 @@ module('Integration | Server | Resource shorthand', function(hooks) { server.resource('contacts', { only: ['index'] }); - let doneForShow = assert.async(); - - promiseAjax({ - method: 'GET', - url: '/contacts/1' - }).catch((errors) => { - assert.ok(errors.error.message.indexOf("Mirage: Your Ember app tried to GET '/contacts/1'") !== -1); - doneForShow(); - }); - - let doneForCreate = assert.async(); - - promiseAjax({ - method: 'POST', - url: '/contacts', - data: JSON.stringify({ - contact: { - name: 'Zelda' - } - }) - }).catch((errors) => { - assert.ok(errors.error.message.indexOf("Mirage: Your Ember app tried to POST '/contacts'") !== -1); - doneForCreate(); - }); - - let doneForPut = assert.async(); - - promiseAjax({ - method: 'PUT', - url: '/contacts/1', - data: JSON.stringify({ - contact: { - name: 'Zelda' - } - }) - }).catch((errors) => { - assert.ok(errors.error.message.indexOf("Mirage: Your Ember app tried to PUT '/contacts/1'") !== -1); - doneForPut(); - }); - - let doneForPatch = assert.async(); - - promiseAjax({ - method: 'PATCH', - url: '/contacts/1', - data: JSON.stringify({ - contact: { - name: 'Zelda' - } - }) - }).catch((errors) => { - assert.ok(errors.error.message.indexOf("Mirage: Your Ember app tried to PATCH '/contacts/1'") !== -1); - doneForPatch(); - }); - - let doneForDelete = assert.async(); - - promiseAjax({ - method: 'DELETE', - url: '/contacts/1' - }).catch((errors) => { - assert.ok(errors.error.message.indexOf("Mirage: Your Ember app tried to DELETE '/contacts/1'") !== -1); - doneForDelete(); - }); + try { + await promiseAjax({ + method: 'GET', + url: '/contacts/1' + }); + } catch(e) { + assert.ok( + e.error.message.indexOf("Mirage: Your Ember app tried to GET '/contacts/1'") > -1, + 'Should receive an error from Mirage when requesting the show action' + ); + } + + try { + await promiseAjax({ + method: 'POST', + url: '/contacts', + data: JSON.stringify({ + contact: { + name: 'Zelda' + } + }) + }); + } catch(e) { + assert.ok( + e.error.message.indexOf("Mirage: Your Ember app tried to POST '/contacts'") > -1, + 'Should receive an error from Mirage when requesting the create action' + ); + } + + try { + await promiseAjax({ + method: 'PUT', + url: '/contacts/1', + data: JSON.stringify({ + contact: { + name: 'Zelda' + } + }) + }); + } catch(e) { + assert.ok( + e.error.message.indexOf("Mirage: Your Ember app tried to PUT '/contacts/1'") > -1, + 'Should receive an error from Mirage when requesting the update action with PUT' + ); + } + + try { + await promiseAjax({ + method: 'PATCH', + url: '/contacts/1', + data: JSON.stringify({ + contact: { + name: 'Zelda' + } + }) + }); + } catch(e) { + assert.ok( + e.error.message.indexOf("Mirage: Your Ember app tried to PATCH '/contacts/1'") > -1, + 'Should receive an error from Mirage when requesting the update action with PATCH' + ); + } + + try { + await promiseAjax({ + method: 'DELETE', + url: '/contacts/1' + }); + } catch(e) { + assert.ok( + e.error.message.indexOf("Mirage: Your Ember app tried to DELETE '/contacts/1'") > -1, + 'Should receive an error from Mirage when requesting the delet action' + ); + } }); - test('resource generates shorthands which are not blacklisted by :except option', function(assert) { + test('resource generates shorthands which are not blacklisted by :except option', async function(assert) { let { server } = this; assert.expect(2); @@ -443,28 +409,20 @@ module('Integration | Server | Resource shorthand', function(hooks) { server.resource('contacts', { except: ['create', 'update', 'delete'] }); - let doneForIndex = assert.async(); - - promiseAjax({ + let indexResponse = await promiseAjax({ method: 'GET', url: '/contacts' - }).then((response) => { - assert.equal(response.xhr.status, 200); - doneForIndex(); }); + assert.equal(indexResponse.xhr.status, 200, 'Should receive a 200 response from resource index action'); - let doneForShow = assert.async(); - - promiseAjax({ + let showResponse = await promiseAjax({ method: 'GET', - url: '/contacts' - }).then((response) => { - assert.equal(response.xhr.status, 200); - doneForShow(); + url: '/contacts/1' }); + assert.equal(showResponse.xhr.status, 200, 'Should receive a 200 response from resource show action'); }); - test('resource does not generate shorthands which are blacklisted by :except option', function(assert) { + test('resource does not generate shorthands which are blacklisted by :except option', async function(assert) { let { server } = this; assert.expect(4); @@ -476,59 +434,67 @@ module('Integration | Server | Resource shorthand', function(hooks) { server.resource('contacts', { except: ['create', 'update', 'delete'] }); - let doneForCreate = assert.async(); - - promiseAjax({ - method: 'POST', - url: '/contacts', - data: JSON.stringify({ - contact: { - name: 'Zelda' - } - }) - }).catch((errors) => { - assert.ok(errors.error.message.indexOf("Mirage: Your Ember app tried to POST '/contacts'") !== -1); - doneForCreate(); - }); - - let doneForPut = assert.async(); - - promiseAjax({ - method: 'PUT', - url: '/contacts/1', - data: JSON.stringify({ - contact: { - name: 'Zelda' - } - }) - }).catch((errors) => { - assert.ok(errors.error.message.indexOf("Mirage: Your Ember app tried to PUT '/contacts/1'") !== -1); - doneForPut(); - }); - - let doneForPatch = assert.async(); - - promiseAjax({ - method: 'PATCH', - url: '/contacts/1', - data: JSON.stringify({ - contact: { - name: 'Zelda' - } - }) - }).catch((errors) => { - assert.ok(errors.error.message.indexOf("Mirage: Your Ember app tried to PATCH '/contacts/1'") !== -1); - doneForPatch(); - }); - - let doneForDelete = assert.async(); - - promiseAjax({ - method: 'DELETE', - url: '/contacts/1' - }).catch((errors) => { - assert.ok(errors.error.message.indexOf("Mirage: Your Ember app tried to DELETE '/contacts/1'") !== -1); - doneForDelete(); - }); + try { + await promiseAjax({ + method: 'POST', + url: '/contacts', + data: JSON.stringify({ + contact: { + name: 'Zelda' + } + }) + }); + } catch(e) { + assert.ok( + e.error.message.indexOf("Mirage: Your Ember app tried to POST '/contacts'") > -1, + 'Should receive an error from Mirage when requesting the create action' + ); + } + + try { + await promiseAjax({ + method: 'PUT', + url: '/contacts/1', + data: JSON.stringify({ + contact: { + name: 'Zelda' + } + }) + }); + } catch(e) { + assert.ok( + e.error.message.indexOf("Mirage: Your Ember app tried to PUT '/contacts/1'") > -1, + 'Should receive an error from Mirage when requesting the update action with PUT' + ); + } + + try { + await promiseAjax({ + method: 'PATCH', + url: '/contacts/1', + data: JSON.stringify({ + contact: { + name: 'Zelda' + } + }) + }); + } catch(e) { + assert.ok( + e.error.message.indexOf("Mirage: Your Ember app tried to PATCH '/contacts/1'") > -1, + 'Should receive an error from Mirage when requesting the update action with PATCH' + ); + } + + try { + await promiseAjax({ + method: 'DELETE', + url: '/contacts/1' + }); + } catch(e) { + assert.ok( + e.error.message.indexOf("Mirage: Your Ember app tried to DELETE '/contacts/1'") > -1, + 'Should receive an error from Mirage when requesting the delet action' + ); + } }); }); diff --git a/tests/integration/server/shorthand-sanity-test.js b/tests/integration/server/shorthand-sanity-test.js index 89dcbe7e5..be2a7ff44 100644 --- a/tests/integration/server/shorthand-sanity-test.js +++ b/tests/integration/server/shorthand-sanity-test.js @@ -22,9 +22,8 @@ module('Integration | Server | Shorthand sanity check', function(hooks) { this.server.shutdown(); }); - test('a get shorthand works', function(assert) { + test('a get shorthand works', async function(assert) { assert.expect(2); - let done = assert.async(); this.server.db.loadData({ contacts: [ @@ -34,24 +33,22 @@ module('Integration | Server | Shorthand sanity check', function(hooks) { this.server.get('/contacts'); - promiseAjax({ + let { xhr, data } = await promiseAjax({ method: 'GET', url: '/contacts' - }).then((response) => { - assert.equal(response.xhr.status, 200); - assert.deepEqual(response.data, { contacts: [{ id: '1', name: 'Link' }] }); - done(); }); + + assert.equal(xhr.status, 200); + assert.deepEqual(data, { contacts: [{ id: '1', name: 'Link' }] }); }); - test('a post shorthand works', function(assert) { + test('a post shorthand works', async function(assert) { let { server } = this; assert.expect(2); - let done = assert.async(); server.post('/contacts'); - promiseAjax({ + let { xhr } = await promiseAjax({ method: 'POST', url: '/contacts', data: JSON.stringify({ @@ -59,17 +56,15 @@ module('Integration | Server | Shorthand sanity check', function(hooks) { name: 'Zelda' } }) - }).then((response) => { - assert.equal(response.xhr.status, 201); - assert.equal(server.db.contacts.length, 1); - done(); }); + + assert.equal(xhr.status, 201); + assert.equal(server.db.contacts.length, 1); }); - test('a put shorthand works', function(assert) { + test('a put shorthand works', async function(assert) { let { server } = this; assert.expect(2); - let done = assert.async(); this.server.db.loadData({ contacts: [ @@ -79,7 +74,7 @@ module('Integration | Server | Shorthand sanity check', function(hooks) { server.put('/contacts/:id'); - promiseAjax({ + let { xhr } = await promiseAjax({ method: 'PUT', url: '/contacts/1', data: JSON.stringify({ @@ -87,17 +82,15 @@ module('Integration | Server | Shorthand sanity check', function(hooks) { name: 'Zelda' } }) - }).then((response) => { - assert.equal(response.xhr.status, 200); - assert.equal(server.db.contacts[0].name, 'Zelda'); - done(); }); + + assert.equal(xhr.status, 200); + assert.equal(server.db.contacts[0].name, 'Zelda'); }); - test('a patch shorthand works', function(assert) { + test('a patch shorthand works', async function(assert) { let { server } = this; assert.expect(2); - let done = assert.async(); this.server.db.loadData({ contacts: [ @@ -107,7 +100,7 @@ module('Integration | Server | Shorthand sanity check', function(hooks) { server.patch('/contacts/:id'); - promiseAjax({ + let { xhr } = await promiseAjax({ method: 'PATCH', url: '/contacts/1', data: JSON.stringify({ @@ -115,17 +108,15 @@ module('Integration | Server | Shorthand sanity check', function(hooks) { name: 'Zelda' } }) - }).then((response) => { - assert.equal(response.xhr.status, 200); - assert.equal(server.db.contacts[0].name, 'Zelda'); - done(); }); + + assert.equal(xhr.status, 200); + assert.equal(server.db.contacts[0].name, 'Zelda'); }); - test('a delete shorthand works', function(assert) { + test('a delete shorthand works', async function(assert) { let { server } = this; assert.expect(2); - let done = assert.async(); this.server.db.loadData({ contacts: [ @@ -135,13 +126,12 @@ module('Integration | Server | Shorthand sanity check', function(hooks) { server.del('/contacts/:id'); - promiseAjax({ + let { xhr } = await promiseAjax({ method: 'DELETE', url: '/contacts/1' - }).then((response) => { - assert.equal(response.xhr.status, 204); - assert.equal(server.db.contacts.length, 0); - done(); }); + + assert.equal(xhr.status, 204); + assert.equal(server.db.contacts.length, 0); }); }); From 8bee346713d01aa9ce8efb50742d7464f8122909 Mon Sep 17 00:00:00 2001 From: Andy Brown Date: Sat, 25 Nov 2017 16:05:14 +0100 Subject: [PATCH 112/879] chore(pretender): upgrade to 1.6.1 --- package.json | 2 +- yarn.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 217c4a26a..f8d3f9db9 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "exists-sync": "0.0.3", "fake-xml-http-request": "^1.4.0", "faker": "^3.0.0", - "pretender": "^1.5.1", + "pretender": "^1.6.1", "route-recognizer": "^0.2.3" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index e9e08bbd9..7450c2b10 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5056,9 +5056,9 @@ preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" -pretender@^1.5.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/pretender/-/pretender-1.6.0.tgz#0bb6dc9622b576772938814bc36f7cf2f86660dd" +pretender@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/pretender/-/pretender-1.6.1.tgz#77d1e42ac8c6b298f5cd43534a87645df035db8c" dependencies: fake-xml-http-request "^1.6.0" route-recognizer "^0.3.3" From 8d620d01c6f18398c0d0ef6666f9486614ed9c78 Mon Sep 17 00:00:00 2001 From: Andy Brown Date: Tue, 28 Nov 2017 18:58:11 +0100 Subject: [PATCH 113/879] chore(changelog): changes for 0.4.1 release --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1159ca781..2bd8d8efc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Ember CLI Mirage Changelog +# Ember CLI Mirage Changelog + +## 0.4.1 + +Update notes: none + +Changes: + + - [BUGFIX][#1217](https://github.com/samselikoff/ember-cli-mirage/pull/1217) Make tracking pretender requests configurable after it was hardcoded false #1137. @patrickjholloway + - General upgrade to use async/await in tests @geekygrappler + - [ENHANCEMENT][#1203](https://github.com/samselikoff/ember-cli-mirage/pull/1203) pass singular model name to resource helper @geekygrappler + - [ENHANCEMENT][#1199](https://github.com/samselikoff/ember-cli-mirage/pull/1199) upgrade to new QUnit testing API @turbo87 ## 0.4.0 Update notes: From 1a1c6de93dab8e3c9ac600bf759894125f186d22 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 28 Nov 2017 13:28:21 -0500 Subject: [PATCH 114/879] 0.4.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f8d3f9db9..1879d7c06 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "0.4.0", + "version": "0.4.1", "description": "A client-side HTTP server to develop, test and demo your Ember app", "keywords": [ "ember-addon", From ccfaea2cfe837d11f9b7e54d53eceacde2f7b5b6 Mon Sep 17 00:00:00 2001 From: Andy Brown Date: Wed, 29 Nov 2017 10:14:13 +0100 Subject: [PATCH 115/879] Remove duplicate title on change log --- CHANGELOG.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2bd8d8efc..dff393fa2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,5 @@ # Ember CLI Mirage Changelog -# Ember CLI Mirage Changelog - ## 0.4.1 Update notes: none From 4e3ff6c924e32a323afb568dad7cec596d0ece20 Mon Sep 17 00:00:00 2001 From: Andy Brown Date: Wed, 29 Nov 2017 13:50:06 +0100 Subject: [PATCH 116/879] fix[request-tracking]: request tracking defaults to false --- addon/server.js | 2 +- app/initializers/ember-cli-mirage.js | 4 +- .../enable-request-tracking-test.js | 54 +++++++++++++++++++ tests/integration/server-config-test.js | 37 ------------- 4 files changed, 57 insertions(+), 40 deletions(-) create mode 100644 tests/acceptance/enable-request-tracking-test.js diff --git a/addon/server.js b/addon/server.js index bd8767bb8..0f4f7366d 100644 --- a/addon/server.js +++ b/addon/server.js @@ -244,7 +244,7 @@ export default class Server { * @public */ shouldTrackRequests() { - return typeof this.trackRequests !== 'undefined' ? this.trackRequests : false; + return Boolean(this.trackRequests); } /** diff --git a/app/initializers/ember-cli-mirage.js b/app/initializers/ember-cli-mirage.js index 5df8567cf..49307e828 100644 --- a/app/initializers/ember-cli-mirage.js +++ b/app/initializers/ember-cli-mirage.js @@ -22,8 +22,8 @@ export function startMirage(env = ENV) { let environment = env.environment; let discoverEmberDataModels = getWithDefault(env['ember-cli-mirage'] || {}, 'discoverEmberDataModels', true); let modules = readModules(env.modulePrefix); - let trackRequests = env['ember-cli-mirage']; - let options = _assign(modules, {environment, baseConfig, testConfig, discoverEmberDataModels, trackRequests}); + let options = _assign(modules, {environment, baseConfig, testConfig, discoverEmberDataModels}); + options.trackRequests = env['ember-cli-mirage'].trackRequests; return new Server(options); } diff --git a/tests/acceptance/enable-request-tracking-test.js b/tests/acceptance/enable-request-tracking-test.js new file mode 100644 index 000000000..4a0152160 --- /dev/null +++ b/tests/acceptance/enable-request-tracking-test.js @@ -0,0 +1,54 @@ +import { run } from '@ember/runloop'; +import {module, test} from 'qunit'; +import startApp from '../helpers/start-app'; +import ENV from 'dummy/config/environment'; +import promiseAjax from '../helpers/promise-ajax'; + +let App; + +module('Acceptance: Enabling request tracking', { + afterEach() { + server.shutdown(); + run(App, 'destroy'); + ENV['ember-cli-mirage'].enabled = undefined; + } +}); + +test('Request tracking defaults to false', async function(assert) { + App = startApp(); + + server.get('/contacts'); + await promiseAjax({ + method: 'GET', + url: '/api/contacts' + }); + + assert.equal(server.pretender.handledRequests.length, 0, 'request tracking should be false by default'); +}); + +test('Request tracking treats undefined config as false', async function(assert) { + ENV['ember-cli-mirage'] = { trackRequests: undefined }; + App = startApp(); + + server.get('/contacts'); + await promiseAjax({ + method: 'GET', + url: '/api/contacts' + }); + + assert.equal(server.pretender.handledRequests.length, 0, 'request tracking should be false when undefined in config'); +}); + +test('Request tracking can be set to true in config', async function(assert) { + ENV['ember-cli-mirage'] = { trackRequests: true }; + App = startApp(); + + server.get('/contacts'); + await promiseAjax({ + method: 'GET', + url: '/api/contacts' + }); + + assert.equal(server.pretender.handledRequests.length, 1, 'request tracking can be turned on in config and track requests'); + assert.equal(server.pretender.handledRequests[0].method, 'GET', 'tracked request method should match the requests method'); +}); \ No newline at end of file diff --git a/tests/integration/server-config-test.js b/tests/integration/server-config-test.js index cd13cfdaa..37459f30c 100644 --- a/tests/integration/server-config-test.js +++ b/tests/integration/server-config-test.js @@ -261,40 +261,3 @@ module('Integration | Server Config', function(hooks) { }, /You cannot modify Pretender's request tracking once the server is created/); }); }); - -module('Integration | Server Config | Pretender', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'development', - models: { - contact: Model, - post: Model - }, - serializers: { - contact: ActiveModelSerializer - }, - trackRequests: true - }); - this.server.timing = 0; - this.server.logging = false; - }), - - hooks.afterEach(function() { - this.server.shutdown(); - }), - - test('pretender request logging can be configured', function(assert) { - assert.expect(1); - let done = assert.async(); - - let { server } = this; - server.trackRequests = true; - server.get('/contacts'); - - $.getJSON('/contacts', function(data) { - let handledRequest = server.pretender.handledRequests[0]; - assert.equal(handledRequest.method, 'GET'); - done(); - }); - }); -}); From bcb1ade892f7f3d1144a53f7660b66e69a89fcea Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sun, 17 Dec 2017 11:10:58 -0500 Subject: [PATCH 117/879] [closes #1240] Fix many-to-many set bug --- addon/orm/associations/belongs-to.js | 2 +- addon/orm/model.js | 66 +++++++++++-------- addon/orm/schema.js | 3 +- .../2-named/association-create-test.js | 2 +- .../many-to-many-inverse-set-bug.js | 42 ++++++++++++ 5 files changed, 85 insertions(+), 30 deletions(-) create mode 100644 tests/integration/orm/has-many/regressions/many-to-many-inverse-set-bug.js diff --git a/addon/orm/associations/belongs-to.js b/addon/orm/associations/belongs-to.js index 2056eac1c..8a123ff2d 100644 --- a/addon/orm/associations/belongs-to.js +++ b/addon/orm/associations/belongs-to.js @@ -212,7 +212,7 @@ export default class BelongsTo extends Association { this[key] = parent; this.save(); - return parent; + return parent.reload(); }; } diff --git a/addon/orm/model.js b/addon/orm/model.js index 549b7d5ab..976c04f59 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -27,7 +27,7 @@ class Model { assert(schema, 'A model requires a schema'); assert(modelName, 'A model requires a modelName'); - this._schema = schema; + this.schema = schema; this.modelName = modelName; this.fks = fks || []; attrs = attrs || {}; @@ -49,17 +49,19 @@ class Model { if (this.isNew()) { // Update the attrs with the db response - this.attrs = this._schema.db[collection].insert(this.attrs); + this.attrs = this.schema.db[collection].insert(this.attrs); // Ensure the id getter/setter is set this._definePlainAttribute('id'); } else { - this._schema.db[collection].update(this.attrs.id, this.attrs); + this.schema.isSaving[this.toString()] = true; + this.schema.db[collection].update(this.attrs.id, this.attrs); } this._saveAssociations(); + this.schema.isSaving[this.toString()] = false; return this; } @@ -105,7 +107,7 @@ class Model { this._disassociateFromDependents(); let collection = toCollectionName(this.modelName); - this._schema.db[collection].remove(this.attrs.id); + this.schema.db[collection].remove(this.attrs.id); } } @@ -126,7 +128,7 @@ class Model { if (hasId) { let collectionName = toCollectionName(this.modelName); - let record = this._schema.db[collectionName].find(this.attrs.id); + let record = this.schema.db[collectionName].find(this.attrs.id); if (record) { hasDbRecord = true; } @@ -154,7 +156,7 @@ class Model { reload() { if (this.id) { let collection = toCollectionName(this.modelName); - let attrs = this._schema.db[collection].find(this.id); + let attrs = this.schema.db[collection].find(this.id); Object.keys(attrs) .filter(function(attr) { @@ -183,7 +185,7 @@ class Model { * @public */ associationFor(key) { - return this._schema.associationsFor(this.modelName)[key]; + return this.schema.associationsFor(this.modelName)[key]; } /** @@ -228,7 +230,7 @@ class Model { * @public */ inverseFor(association) { - let associations = this._schema.associationsFor(this.modelName); + let associations = this.schema.associationsFor(this.modelName); let modelName = association.ownerModelName; let theInverse = _values(associations) @@ -325,6 +327,10 @@ class Model { } } + get isSaving() { + return this.schema.isSaving[this.toString()]; + } + // Private /** * model.attrs represents the persistable attributes, i.e. your db @@ -458,11 +464,11 @@ class Model { let found; if (association.isPolymorphic) { found = foreignKeys.map(({ type, id }) => { - return this._schema.db[toCollectionName(type)].find(id); + return this.schema.db[toCollectionName(type)].find(id); }); found = _compact(found); } else { - found = this._schema.db[toCollectionName(association.modelName)].find(foreignKeys); + found = this.schema.db[toCollectionName(association.modelName)].find(foreignKeys); } let foreignKeyLabel = association.isPolymorphic ? foreignKeys.map(fk => `${fk.type}:${fk.id}`).join(',') : foreignKeys; @@ -475,9 +481,9 @@ class Model { let found; if (association.isPolymorphic) { - found = this._schema.db[toCollectionName(foreignKeys.type)].find(foreignKeys.id); + found = this.schema.db[toCollectionName(foreignKeys.type)].find(foreignKeys.id); } else { - found = this._schema.db[toCollectionName(association.modelName)].find(foreignKeys); + found = this.schema.db[toCollectionName(association.modelName)].find(foreignKeys); } let foreignKeyLabel = association.isPolymorphic ? `${foreignKeys.type}:${foreignKeys.id}` : foreignKeys; @@ -531,16 +537,17 @@ class Model { let models; if (association.isPolymorphic) { models = associateIds.map(({ type, id }) => { - return this._schema[toCollectionName(type)].find(id); + return this.schema[toCollectionName(type)].find(id); }); } else { // TODO: prob should initialize hasMany fks with [] - models = this._schema[toCollectionName(association.modelName)] + models = this.schema[toCollectionName(association.modelName)] .find(associateIds || []) .models; } models + .filter(associate => !associate.isSaving) // filter out models that are already being saved .filter(associate => !tempAssociation.includes(associate)) // filter out models that will still be associated .forEach(associate => { if (associate.hasInverseFor(association)) { @@ -579,10 +586,10 @@ class Model { if ((tempAssociation !== undefined) && associateId) { let associate; if (association.isPolymorphic) { - associate = this._schema[toCollectionName(associateId.type)] + associate = this.schema[toCollectionName(associateId.type)] .find(associateId.id); } else { - associate = this._schema[toCollectionName(association.modelName)] + associate = this.schema[toCollectionName(association.modelName)] .find(associateId); } @@ -597,7 +604,7 @@ class Model { // Find all other models that depend on me and update their foreign keys _disassociateFromDependents() { - this._schema.dependentAssociationsFor(this.modelName) + this.schema.dependentAssociationsFor(this.modelName) .forEach(association => { association.disassociateAllDependentsFromTarget(this); }); @@ -613,15 +620,20 @@ class Model { delete this._tempAssociations[key]; if (tempAssociate instanceof Collection) { - tempAssociate.models.forEach(child => { - child.save(); - }); + tempAssociate.models + .filter(model => !model.isSaving) + .forEach(child => { + child.save(); + }); this._updateInDb({ [fk]: tempAssociate.models.map(child => child.id) }); + } else if (tempAssociate instanceof PolymorphicCollection) { - tempAssociate.models.forEach(child => { - child.save(); - }); + tempAssociate.models + .filter(model => !model.isSaving) + .forEach(child => { + child.save(); + }); this._updateInDb({ [fk]: tempAssociate.models.map(child => { @@ -633,7 +645,7 @@ class Model { if (tempAssociate === null) { this._updateInDb({ [fk]: null }); - } else { + } else if (!tempAssociate.isSaving) { tempAssociate.save(); let fkValue; @@ -690,12 +702,12 @@ class Model { let inverseFk = inverse.getForeignKey(); if (inverse instanceof BelongsTo) { - this._schema.db[toCollectionName(model.modelName)] + this.schema.db[toCollectionName(model.modelName)] .update(model.id, { [inverseFk]: this.id }); } else { let ownerId = this.id; - let inverseCollection = this._schema.db[toCollectionName(model.modelName)]; + let inverseCollection = this.schema.db[toCollectionName(model.modelName)]; let currentIdsForInverse = inverseCollection.find(model.id)[inverse.getForeignKey()] || []; let newIdsForInverse = _assign([], currentIdsForInverse); @@ -711,7 +723,7 @@ class Model { // Used to update data directly, since #save and #update can retrigger saves, // which can cause cycles with associations. _updateInDb(attrs) { - this.attrs = this._schema.db[toCollectionName(this.modelName)].update(this.attrs.id, attrs); + this.attrs = this.schema.db[toCollectionName(this.modelName)].update(this.attrs.id, attrs); } /** diff --git a/addon/orm/schema.js b/addon/orm/schema.js index dea820200..7fffef9bd 100644 --- a/addon/orm/schema.js +++ b/addon/orm/schema.js @@ -21,6 +21,7 @@ export default class Schema { this._registry = {}; this._dependentAssociations = { polymorphic: [] }; this.registerModels(modelsMap); + this.isSaving = {}; // a hash of models that are being saved, used to avoid cycles } /** @@ -53,7 +54,7 @@ export default class Schema { this._registry[camelizedModelName].class = ModelClass; // TODO: set here, remove from model#constructor - ModelClass.prototype._schema = this; + ModelClass.prototype.schema = this; ModelClass.prototype.modelName = modelName; // Set up associations ModelClass.prototype.hasManyAssociations = {}; // a registry of the model's hasMany associations. Key is key from model definition, value is association instance itself diff --git a/tests/integration/orm/belongs-to/2-named/association-create-test.js b/tests/integration/orm/belongs-to/2-named/association-create-test.js index 0974532b3..501979a33 100644 --- a/tests/integration/orm/belongs-to/2-named/association-create-test.js +++ b/tests/integration/orm/belongs-to/2-named/association-create-test.js @@ -17,7 +17,7 @@ module('Integration | ORM | Belongs To | Named | association #create', function( let ganon = post.createAuthor({ name: 'Ganon' }); assert.ok(ganon.id, 'the parent was persisted'); - assert.deepEqual(post.author, ganon); + assert.deepEqual(post.author.attrs, ganon.attrs); assert.equal(post.authorId, ganon.id); assert.equal(this.helper.schema.posts.find(post.id).authorId, ganon.id, 'the child was persisted'); }); diff --git a/tests/integration/orm/has-many/regressions/many-to-many-inverse-set-bug.js b/tests/integration/orm/has-many/regressions/many-to-many-inverse-set-bug.js new file mode 100644 index 000000000..2478e0d4a --- /dev/null +++ b/tests/integration/orm/has-many/regressions/many-to-many-inverse-set-bug.js @@ -0,0 +1,42 @@ +import { module, test } from 'qunit'; +import { Model, hasMany } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +module('Integration | ORM | Has Many | Regressions | Many to many inverse set bug', function(hooks) { + hooks.beforeEach(function() { + this.db = new Db(); + + this.schema = new Schema(this.db, { + post: Model.extend({ + tags: hasMany() + }), + tag: Model.extend({ + posts: hasMany() + }) + }); + }); + + test(`it works`, function(assert) { + this.db.loadData({ + posts: [ + { id: '1', tagIds: [ '15', '16' ] } + ], + tags: [ + { id: '15', postIds: [ '1' ] }, + { id: '16', postIds: [ '1' ] } + ] + }); + + let post = this.schema.posts.find(1); + let tagA = this.schema.tags.find(15); + let tagB = this.schema.tags.find(16); + + post.update('tagIds', [ '15' ]); + + assert.equal(post.tags.length, 1); + assert.deepEqual(post.reload().tagIds, [ '15' ]); + assert.deepEqual(tagA.reload().postIds, [ '1' ]); + assert.deepEqual(tagB.reload().postIds, [ ]); + }); +}); From bb6a83f8fd18526cd22c3cb683b0d3fab6cf29d5 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 2 Jan 2018 17:46:58 -0500 Subject: [PATCH 118/879] Make sure regression test actually runs.. --- ...js => many-to-many-inverse-set-bug-test.js} | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) rename tests/integration/orm/has-many/regressions/{many-to-many-inverse-set-bug.js => many-to-many-inverse-set-bug-test.js} (60%) diff --git a/tests/integration/orm/has-many/regressions/many-to-many-inverse-set-bug.js b/tests/integration/orm/has-many/regressions/many-to-many-inverse-set-bug-test.js similarity index 60% rename from tests/integration/orm/has-many/regressions/many-to-many-inverse-set-bug.js rename to tests/integration/orm/has-many/regressions/many-to-many-inverse-set-bug-test.js index 2478e0d4a..f0d3ef071 100644 --- a/tests/integration/orm/has-many/regressions/many-to-many-inverse-set-bug.js +++ b/tests/integration/orm/has-many/regressions/many-to-many-inverse-set-bug-test.js @@ -20,23 +20,19 @@ module('Integration | ORM | Has Many | Regressions | Many to many inverse set bu test(`it works`, function(assert) { this.db.loadData({ posts: [ - { id: '1', tagIds: [ '15', '16' ] } + { id: '1', tagIds: [ '15', '16' ] }, + { id: '2', tagIds: [ '16' ] } ], tags: [ { id: '15', postIds: [ '1' ] }, - { id: '16', postIds: [ '1' ] } + { id: '16', postIds: [ '1', '2' ] } ] }); - let post = this.schema.posts.find(1); - let tagA = this.schema.tags.find(15); - let tagB = this.schema.tags.find(16); + this.schema.posts.find(1).update({ tagIds: [ '15' ] }); - post.update('tagIds', [ '15' ]); - - assert.equal(post.tags.length, 1); - assert.deepEqual(post.reload().tagIds, [ '15' ]); - assert.deepEqual(tagA.reload().postIds, [ '1' ]); - assert.deepEqual(tagB.reload().postIds, [ ]); + assert.deepEqual(this.db.posts.find(1).tagIds, [ '15' ]); + assert.deepEqual(this.db.tags.find(15).postIds, [ '1' ]); + assert.deepEqual(this.db.tags.find(16).postIds, [ '2' ]); }); }); From 6a9c8489368c86af4ca4b2c15052aff4ebbe4303 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 2 Jan 2018 21:35:28 -0500 Subject: [PATCH 119/879] Fix buggy includes implementation --- addon/orm/collection.js | 5 +- .../regressions/many-to-many-bug-test.js | 78 +++++++++++++++++++ 2 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 tests/integration/server/regressions/many-to-many-bug-test.js diff --git a/addon/orm/collection.js b/addon/orm/collection.js index ecd5c5855..ec0e60d9e 100644 --- a/addon/orm/collection.js +++ b/addon/orm/collection.js @@ -1,6 +1,5 @@ import assert from '../assert'; import _invokeMap from 'lodash/invokeMap'; -import _isEqual from 'lodash/isEqual'; /** * An array of models, returned from one of the schema query @@ -102,7 +101,7 @@ export default class Collection { * @public */ remove(model) { - let [ match ] = this.models.filter(m => _isEqual(m.attrs, model.attrs)); + let [ match ] = this.models.filter(m => m.toString() === model.toString()); if (match) { let i = this.models.indexOf(match); this.models.splice(i, 1); @@ -119,7 +118,7 @@ export default class Collection { * @public */ includes(model) { - return this.models.filter(m => _isEqual(m.attrs, model.attrs)).length > 0; + return this.models.filter(m => m.toString() === model.toString()).length > 0; } /** diff --git a/tests/integration/server/regressions/many-to-many-bug-test.js b/tests/integration/server/regressions/many-to-many-bug-test.js new file mode 100644 index 000000000..7689c3b98 --- /dev/null +++ b/tests/integration/server/regressions/many-to-many-bug-test.js @@ -0,0 +1,78 @@ +import { module, test } from 'qunit'; +import { Model, hasMany, JSONAPISerializer } from 'ember-cli-mirage'; +import Server from 'ember-cli-mirage/server'; +import promiseAjax from 'dummy/tests/helpers/promise-ajax'; + +module('Integration | Server | Regressions | Many to many bug', function(hooks) { + hooks.beforeEach(function() { + this.server = new Server({ + environment: 'test', + models: { + post: Model.extend({ + tags: hasMany() + }), + tag: Model.extend({ + posts: hasMany() + }) + }, + serializers: { + application: JSONAPISerializer + }, + baseConfig() { + this.resource('posts'); + } + }); + }); + + hooks.afterEach(function() { + this.server.shutdown(); + }); + + test('it works', async function(assert) { + assert.expect(6); + + let serverTagA = this.server.create('tag', { name: 'A', slug: 'a' }); + let serverTagB = this.server.create('tag', { name: 'B', slug: 'b' }); + let serverPost = this.server.create('post', { + title: 'Post 1', + tags: [ serverTagA, serverTagB ] + }); + + assert.equal(serverTagA.postIds.length, 1); + assert.equal(serverTagB.postIds.length, 1); + assert.deepEqual(serverPost.tagIds, [ '1', '2' ]); + + await promiseAjax({ + method: 'PATCH', + url: '/posts/1', + data: JSON.stringify({ + "data": { + "id": "1", + "attributes": { + "title": "Post 2" + }, + "relationships": { + "tags": { + "data": [ + { + "type": "tags", + "id": "2" + } + ] + } + }, + "type": "posts" + } + }) + }); + + serverTagA.reload(); + serverTagB.reload(); + serverPost.reload(); + + assert.deepEqual(serverTagA.postIds, []); + assert.deepEqual(serverTagB.postIds, [ '1' ]); + assert.deepEqual(serverPost.tagIds, [ '2' ]); + }); + +}); From cb4ea6e702178458085b9425a51092fd765a7fa8 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sun, 14 Jan 2018 12:07:19 -0500 Subject: [PATCH 120/879] Update ISSUE_TEMPLATE.md --- ISSUE_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index e8b2897a7..f4d6f10f7 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -1,6 +1,6 @@ If possible, please use the Mirage Boilerplate Twiddle to demonstrate your issue or bug: -- Open the [Mirage Boilerplate Twiddle](https://ember-twiddle.com/072de99410f21ff42db8264bd9665ca3) +- Open the Mirage Boilerplate Twiddle: https://ember-twiddle.com/eedfd390d8394d54d5bfd0ed988a5d0f?openFiles=templates.application.hbs%2C - Click File > Copy Twiddle - Reproduce your issue - Click File > Save to Github Gist From 9b87d7a434f72b1520b95b7ac88158e8cc0582f0 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 19 Jan 2018 15:19:24 -0500 Subject: [PATCH 121/879] [closes #1251] Ensure JSONAPISerializer supports include as function --- addon/serializers/json-api-serializer.js | 8 ++-- .../associations/includes-test.js | 44 +++++++++++++++++++ 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/addon/serializers/json-api-serializer.js b/addon/serializers/json-api-serializer.js index d047081cb..eb80bdaa8 100644 --- a/addon/serializers/json-api-serializer.js +++ b/addon/serializers/json-api-serializer.js @@ -61,7 +61,7 @@ const JSONAPISerializer = Serializer.extend({ getAddToIncludesForResource(resource) { let relationshipPaths; - if (_get(this, 'request.queryParams.include')) { + if (this.hasQueryParamIncludes()) { relationshipPaths = this.request.queryParams.include.split(','); } else { let serializer = this.serializerFor(resource.modelName); @@ -192,7 +192,7 @@ const JSONAPISerializer = Serializer.extend({ }, _relationshipIsIncluded(relationshipKey) { - if (this.request && this.request.queryParams && this.request.queryParams.include) { + if (this.hasQueryParamIncludes()) { let relationshipKeyAsString = this.keyForRelationship(relationshipKey); return this.request.queryParams @@ -200,7 +200,9 @@ const JSONAPISerializer = Serializer.extend({ .split(',') .some(str => str.indexOf(relationshipKeyAsString) > -1); } else { - return this.include.includes(relationshipKey); + let relationshipPaths = this.getKeysForIncluded(); + + return relationshipPaths.includes(relationshipKey); } }, diff --git a/tests/integration/serializers/json-api-serializer/associations/includes-test.js b/tests/integration/serializers/json-api-serializer/associations/includes-test.js index 342ed4819..6ae633406 100644 --- a/tests/integration/serializers/json-api-serializer/associations/includes-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/includes-test.js @@ -73,6 +73,50 @@ module('Integration | Serializers | JSON API Serializer | Associations | Include }); }); + test('includes can be a function', function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + blogPost: JSONAPISerializer.extend({ + attrs: ['title'], + include() { + return [ 'wordSmith' ]; + } + }), + wordSmith: JSONAPISerializer.extend({ + attrs: ['firstName'] + }) + }); + + let post = this.schema.blogPosts.create({ title: 'We love Mirage!' }); + post.createWordSmith({ firstName: 'Sam' }); + + let result = registry.serialize(post); + + assert.propEqual(result, { + data: { + type: 'blog-posts', + id: '1', + attributes: { + 'title': 'We love Mirage!' + }, + relationships: { + 'word-smith': { + data: { type: 'word-smiths', id: '1' } + } + } + }, + included: [ + { + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Sam' + } + } + ] + }); + }); + test('query param includes work when serializing a model', function(assert) { let registry = new SerializerRegistry(this.schema, { application: JSONAPISerializer From c30fd5d1d10526186586d1dbcd6f7a2b64fa7993 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 19 Jan 2018 16:31:28 -0500 Subject: [PATCH 122/879] Try fix for intel thing? --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d2314983a..cc402dd31 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ node_js: # so that your addon works for all apps - "4" -sudo: false +sudo: true dist: trusty addons: From 275369d719389073a7fb1e71991652fa88cb66e9 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Wed, 2 Aug 2017 00:36:43 -0700 Subject: [PATCH 123/879] Cursory performance tests for record creation --- tests/performance/faker-factory-test.js | 38 ++++++++++++++++++++++++ tests/performance/simple-factory-test.js | 38 ++++++++++++++++++++++++ tests/performance/utils.js | 30 +++++++++++++++++++ 3 files changed, 106 insertions(+) create mode 100644 tests/performance/faker-factory-test.js create mode 100644 tests/performance/simple-factory-test.js create mode 100644 tests/performance/utils.js diff --git a/tests/performance/faker-factory-test.js b/tests/performance/faker-factory-test.js new file mode 100644 index 000000000..b2df725da --- /dev/null +++ b/tests/performance/faker-factory-test.js @@ -0,0 +1,38 @@ +import { module } from 'qunit'; +import { Model, Factory, faker } from 'ember-cli-mirage'; +import Server from 'ember-cli-mirage/server'; +import { perfTest } from './utils'; + +module('Performance | Factory | Faker', { + beforeEach() { + this.Car = Model.extend(); + this.CarFactory = Factory.extend({ + make: faker.commerce.product, + model: () => `${faker.list.random('a', 'b', 'c', 'x')}${faker.random.number({ min: 1, max: 15 }) * 100}`, + year: () => faker.random.number({ min: 1980, max: 2017 }) + }); + + this.server = new Server({ + environment: 'test', + models: { + car: this.Car + }, + factories: { + car: this.CarFactory + } + }); + this.server.timing = 0; + this.server.logging = false; + }, + afterEach() { + this.server.shutdown(); + } +}); + +const carMaker = (count) => { + server.createList('car', count); +}; + +perfTest(50, 'models', carMaker); +perfTest(500, 'models', carMaker); +perfTest(5000, 'models', carMaker); diff --git a/tests/performance/simple-factory-test.js b/tests/performance/simple-factory-test.js new file mode 100644 index 000000000..3fdb6182a --- /dev/null +++ b/tests/performance/simple-factory-test.js @@ -0,0 +1,38 @@ +import { module } from 'qunit'; +import { Model, Factory } from 'ember-cli-mirage'; +import Server from 'ember-cli-mirage/server'; +import { perfTest } from './utils'; + +module('Performance | Factory | Simple', { + beforeEach() { + this.Car = Model.extend(); + this.CarFactory = Factory.extend({ + make: 'Fjord', + model: 'Wagon', + year: '1886' + }); + + this.server = new Server({ + environment: 'test', + models: { + car: this.Car + }, + factories: { + car: this.CarFactory + } + }); + this.server.timing = 0; + this.server.logging = false; + }, + afterEach() { + this.server.shutdown(); + } +}); + +const carMaker = (count) => { + server.createList('car', count); +}; + +perfTest(50, 'models', carMaker); +perfTest(500, 'models', carMaker); +perfTest(5000, 'models', carMaker); diff --git a/tests/performance/utils.js b/tests/performance/utils.js new file mode 100644 index 000000000..4dc8aaf25 --- /dev/null +++ b/tests/performance/utils.js @@ -0,0 +1,30 @@ +import { test } from 'qunit'; + +export function perfTest(count, message, testFn, timeout = 0) { + test(`(${count}) ${message}`, function(assert) { + var duration = time(() => { + testFn(count); + }); + + if (timeout) { + assert.ok(duration < timeout, `${duration}ms (${timeout}ms timeout)`); + } else { + assert.ok(true, `${duration}ms`); + } + }); +} + +export function time(fn) { + var start = now(); + fn(); + + return now() - start; +} + +export function now() { + return performance + ? performance.now() + : Date.now + ? Date.now() + : +new Date(); +} From 94b3fe701836db68e847ec49d3f58ade5f87b0e2 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Wed, 6 Dec 2017 15:33:58 -0800 Subject: [PATCH 124/879] New internal db interface that doesn't protect against mutations Making a copy of the db.model for every operation is very expensive, but is done so end users can safely get a reference and mutate it locally without mutating the db. However, internally, Mirage can get a huge performance win by copying the records for every db operation. This comes at the cost of not being safe against accidental mutations, but that's an acceptable consequence since it only impacts private APIs. --- addon/db.js | 20 ++++++++++++++++++++ addon/orm/model.js | 24 ++++++++++++------------ addon/server.js | 6 +++--- addon/utils/normalize-name.js | 4 ++++ 4 files changed, 39 insertions(+), 15 deletions(-) diff --git a/addon/db.js b/addon/db.js index 9a66764e3..139efddf3 100644 --- a/addon/db.js +++ b/addon/db.js @@ -55,6 +55,8 @@ class Db { let IdentityManager = this.identityManagerFor(name); let newCollection = new DbCollection(name, initialData, IdentityManager); + // Public API has a convenient array interface. It comes at the cost of + // returning a copy of all records to avoid accidental mutations. Object.defineProperty(this, name, { get() { let recordsCopy = newCollection.all(); @@ -70,6 +72,24 @@ class Db { } }); + // Private API does not have the array interface. This means internally, only + // db-collection methods can be used. This is so records aren't copied redundantly + // internally, which leads to accidental O(n^2) operations (e.g., createList). + Object.defineProperty(this, `_${name}`, { + get() { + let recordsCopy = []; + + ['insert', 'find', 'findBy', 'where', 'update', 'remove', 'firstOrCreate'] + .forEach(function(method) { + recordsCopy[method] = function() { + return newCollection[method](...arguments); + }; + }); + + return recordsCopy; + } + }); + this._collections.push(newCollection); } else if (initialData) { diff --git a/addon/orm/model.js b/addon/orm/model.js index 976c04f59..bb92a53ef 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -1,6 +1,6 @@ import BelongsTo from './associations/belongs-to'; import HasMany from './associations/has-many'; -import { toCollectionName } from 'ember-cli-mirage/utils/normalize-name'; +import { toCollectionName, toInternalCollectionName } from 'ember-cli-mirage/utils/normalize-name'; import extend from '../utils/extend'; import assert from '../assert'; import Collection from './collection'; @@ -45,7 +45,7 @@ class Model { * @public */ save() { - let collection = toCollectionName(this.modelName); + let collection = toInternalCollectionName(this.modelName); if (this.isNew()) { // Update the attrs with the db response @@ -106,7 +106,7 @@ class Model { if (this.isSaved()) { this._disassociateFromDependents(); - let collection = toCollectionName(this.modelName); + let collection = toInternalCollectionName(this.modelName); this.schema.db[collection].remove(this.attrs.id); } } @@ -127,7 +127,7 @@ class Model { let hasId = this.attrs.id !== undefined && this.attrs.id !== null; if (hasId) { - let collectionName = toCollectionName(this.modelName); + let collectionName = toInternalCollectionName(this.modelName); let record = this.schema.db[collectionName].find(this.attrs.id); if (record) { hasDbRecord = true; @@ -155,7 +155,7 @@ class Model { */ reload() { if (this.id) { - let collection = toCollectionName(this.modelName); + let collection = toInternalCollectionName(this.modelName); let attrs = this.schema.db[collection].find(this.id); Object.keys(attrs) @@ -464,11 +464,11 @@ class Model { let found; if (association.isPolymorphic) { found = foreignKeys.map(({ type, id }) => { - return this.schema.db[toCollectionName(type)].find(id); + return this.schema.db[toInternalCollectionName(type)].find(id); }); found = _compact(found); } else { - found = this.schema.db[toCollectionName(association.modelName)].find(foreignKeys); + found = this.schema.db[toInternalCollectionName(association.modelName)].find(foreignKeys); } let foreignKeyLabel = association.isPolymorphic ? foreignKeys.map(fk => `${fk.type}:${fk.id}`).join(',') : foreignKeys; @@ -481,9 +481,9 @@ class Model { let found; if (association.isPolymorphic) { - found = this.schema.db[toCollectionName(foreignKeys.type)].find(foreignKeys.id); + found = this.schema.db[toInternalCollectionName(foreignKeys.type)].find(foreignKeys.id); } else { - found = this.schema.db[toCollectionName(association.modelName)].find(foreignKeys); + found = this.schema.db[toInternalCollectionName(association.modelName)].find(foreignKeys); } let foreignKeyLabel = association.isPolymorphic ? `${foreignKeys.type}:${foreignKeys.id}` : foreignKeys; @@ -702,12 +702,12 @@ class Model { let inverseFk = inverse.getForeignKey(); if (inverse instanceof BelongsTo) { - this.schema.db[toCollectionName(model.modelName)] + this.schema.db[toInternalCollectionName(model.modelName)] .update(model.id, { [inverseFk]: this.id }); } else { let ownerId = this.id; - let inverseCollection = this.schema.db[toCollectionName(model.modelName)]; + let inverseCollection = this.schema.db[toInternalCollectionName(model.modelName)]; let currentIdsForInverse = inverseCollection.find(model.id)[inverse.getForeignKey()] || []; let newIdsForInverse = _assign([], currentIdsForInverse); @@ -723,7 +723,7 @@ class Model { // Used to update data directly, since #save and #update can retrigger saves, // which can cause cycles with associations. _updateInDb(attrs) { - this.attrs = this.schema.db[toCollectionName(this.modelName)].update(this.attrs.id, attrs); + this.attrs = this.schema.db[toInternalCollectionName(this.modelName)].update(this.attrs.id, attrs); } /** diff --git a/addon/server.js b/addon/server.js index 0f4f7366d..cca9909a2 100644 --- a/addon/server.js +++ b/addon/server.js @@ -3,7 +3,7 @@ import { Promise } from 'rsvp'; import { pluralize, camelize } from './utils/inflector'; -import { toCollectionName } from 'ember-cli-mirage/utils/normalize-name'; +import { toCollectionName, toInternalCollectionName } from 'ember-cli-mirage/utils/normalize-name'; import { getModels } from './ember-data'; import { hasEmberData } from './utils/ember-data'; import isAssociation from 'ember-cli-mirage/utils/is-association'; @@ -404,7 +404,7 @@ export default class Server { if (collectionFromCreateList) { collection = collectionFromCreateList; } else { - collectionName = this.schema ? toCollectionName(type) : pluralize(type); + collectionName = this.schema ? toInternalCollectionName(type) : `_${pluralize(type)}`; collection = this.db[collectionName]; } @@ -426,7 +426,7 @@ export default class Server { assert(_isInteger(amount), `second argument has to be an integer, you passed: ${typeof amount}`); let list = []; - let collectionName = this.schema ? toCollectionName(type) : pluralize(type); + let collectionName = this.schema ? toInternalCollectionName(type) : `_${pluralize(type)}`; let collection = this.db[collectionName]; for (let i = 0; i < amount; i++) { diff --git a/addon/utils/normalize-name.js b/addon/utils/normalize-name.js index abefabc40..2cd4c9e87 100644 --- a/addon/utils/normalize-name.js +++ b/addon/utils/normalize-name.js @@ -10,6 +10,10 @@ export function toCollectionName(type) { return camelize(pluralize(modelName)); } +export function toInternalCollectionName(type) { + return `_${toCollectionName(type)}`; +} + export function toModelName(type) { let modelName = dasherize(type); return singularize(modelName); From 96729d5c9f2f30c8c5422113e65b32086c131079 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Wed, 6 Dec 2017 15:49:48 -0800 Subject: [PATCH 125/879] Bring back Chrome as a dev test runner --- testem.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/testem.js b/testem.js index f6598cb8d..cf870d39c 100644 --- a/testem.js +++ b/testem.js @@ -6,6 +6,7 @@ module.exports = { 'Chrome' ], launch_in_dev: [ + 'Chrome' ], browser_args: { Chrome: { @@ -16,6 +17,6 @@ module.exports = { '--remote-debugging-port=9222', '--window-size=1440,900' ] - }, + } } }; From 1e2ae4f6377b97c4df87cdfca863eca0e4a19df3 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 19 Jan 2018 15:02:39 -0500 Subject: [PATCH 126/879] Fix trailing space --- addon/orm/model.js | 1 + 1 file changed, 1 insertion(+) diff --git a/addon/orm/model.js b/addon/orm/model.js index bb92a53ef..7a9dae044 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -129,6 +129,7 @@ class Model { if (hasId) { let collectionName = toInternalCollectionName(this.modelName); let record = this.schema.db[collectionName].find(this.attrs.id); + if (record) { hasDbRecord = true; } From 459f3c5d14cbb117ded1cad27db380f19e846082 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 1 Feb 2018 10:30:44 -0500 Subject: [PATCH 127/879] Update CHANGELOG.md --- CHANGELOG.md | 75 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 71 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dff393fa2..91ac09146 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## 0.4.1 -Update notes: none +Upgrade notes: none Changes: @@ -10,17 +10,84 @@ Changes: - General upgrade to use async/await in tests @geekygrappler - [ENHANCEMENT][#1203](https://github.com/samselikoff/ember-cli-mirage/pull/1203) pass singular model name to resource helper @geekygrappler - [ENHANCEMENT][#1199](https://github.com/samselikoff/ember-cli-mirage/pull/1199) upgrade to new QUnit testing API @turbo87 + ## 0.4.0 -Update notes: +Upgrade notes: + +- There is one primary change that could break your app. In 0.3.x, Mirage's JSONAPISerializer included all related foreign keys whenever serializing a model or collection, even if those relationships were not `?included` in the payload. + + This actually goes against JSON:API's design. Foreign keys in the payload are known as [Resource Linkage](http://jsonapi.org/format/#document-resource-object-linkage) and are intended to be used by API clients to link together all resources in the JSON:API compound document. In fact, most server-side JSON:API libraries do not behave in this way, and only return linkage data for related resources when they are being included in a single document. + + By including linkage data for every relationship in 0.3, it was easy to develop Ember apps that would work with Mirage but would behave differently when hooked up to a standard JSON:API server. Since Mirage always included linkage data, an Ember app might automatically be able to fetch related resources using the ids from that linkage data plus its knowledge about the API. For example, if a `post` came back like this: + + ```js + // GET /posts/1 + { + data: { + type: 'posts', + id: '1', + attributes: { ... }, + relationships: { + author: { + data: { + type: 'users', + id: '1' + } + } + } + } + } + ``` + + and you forgot to `?include=author` in your GET request, Ember Data would potentially use the `user:1` foreign key and lazily fetch the `author` by making a request to `GET /authors/1`. This is problematic because + + 1. This is not how foreign keys are intended to be used + 2. It'd be better to see no data and, to fix the problem, go back up to where you're loading the post and add `?include=author`, or + 3. If you do want your interface to lazily load the author, use `links` instead of the linkage data: + + ```js + // GET /posts/1 + { + data: { + type: 'posts', + id: '1', + attributes: { ... }, + relationships: { + author: { + links: { + related: '/api/users/1' + } + } + } + } + } + ``` + + Resource links can be defined on Mirage serializers using the [links](http://www.ember-cli-mirage.com/docs/v0.3.x/serializers/#linksmodel) method (though `including` is likely the far more simpler and common approach to fetching related data). + + So, Mirage 0.4 changed this behavior and by default, the JSONAPISerializer only includes linkage data for relationships that are being included in the current payload (i.e. within the same compound document). + + This behavior is configurable via the `alwaysIncludeLinkageData` key on your JSONAPISerializers. It is set to `false` by default, but if you want to opt-in to 0.3 behavior and always include linkage data, set it to `true`: + + ```js + // mirage/serializers/application.js + import { JSONAPISerializer } from 'ember-cli-mirage'; + + export default JSONAPISerializer.extend({ + alwaysIncludeLinkageData: true + }); + ``` + + If you do this, I would recommend looking closely at how your real server behaves when serializing resources' relationships and whether it uses resource `links` or resource linkage `data`, and to update your Mirage code accordingly to give you the most faithful representation of your server. -We bumped our "major" to 0.4.x because support for Node 0.12 has been explicitly dropped from some of our dependencies. There's no Mirage-specific changes you need to make for this upgrade. +- Support for Node 0.12 has been explicitly dropped from some of our dependencies _Special thanks to @turbo87 and @kellyselden for all their work on this release._ Changes: - - [ENHANCEMENT][#1150](https://github.com/samselikoff/ember-cli-mirage/pull/1150) Change default JSONAPI data linkage behavior (reference #1146) @samselikoff + - [BREAKING CHANGE][#1150](https://github.com/samselikoff/ember-cli-mirage/pull/1150) Change default JSONAPI data linkage behavior (reference #1146) @samselikoff - [BUGFIX][#1148](https://github.com/samselikoff/ember-cli-mirage/pull/1148) Foreign key ids were being muted by collection creation @lukemelia - [BUGFIX][#1078](https://github.com/samselikoff/ember-cli-mirage/pull/1078) Ensure #update works on associations @ivanvanderbyl - [BUGFIX][#1112](https://github.com/samselikoff/ember-cli-mirage/pull/1112) Fix query in disassociateAllDepentsFromTarget @omghax From c333c1b1a38c85be243c40e18cc092bcbbe15e3f Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 19 Jan 2018 11:41:45 -0700 Subject: [PATCH 128/879] Updated changelog with an accurate link --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 91ac09146..6bd2c22fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -91,7 +91,7 @@ Changes: - [BUGFIX][#1148](https://github.com/samselikoff/ember-cli-mirage/pull/1148) Foreign key ids were being muted by collection creation @lukemelia - [BUGFIX][#1078](https://github.com/samselikoff/ember-cli-mirage/pull/1078) Ensure #update works on associations @ivanvanderbyl - [BUGFIX][#1112](https://github.com/samselikoff/ember-cli-mirage/pull/1112) Fix query in disassociateAllDepentsFromTarget @omghax - - [BUGFIX][#0176](https://github.com/samselikoff/ember-cli-mirage/pull/0176) Fix using `association` helper in a dasherized factory @ignatius-j + - [BUGFIX][#0176](https://github.com/samselikoff/ember-cli-mirage/pull/1170) Fix using `association` helper in a dasherized factory @ignatius-j - [ENHANCEMENT][#1138](https://github.com/samselikoff/ember-cli-mirage/pull/1138) Unlock and upgrade ember-get-config @dfreeman - [ENHANCEMENT] [#b99717](https://github.com/samselikoff/ember-cli-mirage/commit/b997176f1d46aaad4c8f82fb7920e7baa8db9e68) Serializer blueprint should extend the application serializer @ChrisBarthol - [ENHANCEMENT][#187](https://github.com/samselikoff/ember-cli-mirage/pull/187) Use native ES class syntax for base Class.extend @cowboyd From 99371ef4a7e5365b6559e5228fbce6824b01c647 Mon Sep 17 00:00:00 2001 From: Ruslan Hrabovyi Date: Thu, 7 Dec 2017 20:17:50 +0100 Subject: [PATCH 129/879] fix autogeneration of nested ember-data models --- addon/ember-data.js | 22 ++++++++++------------ tests/dummy/app/models/pet/dog.js | 3 +++ tests/integration/ember-data-test.js | 7 +++++++ 3 files changed, 20 insertions(+), 12 deletions(-) create mode 100644 tests/dummy/app/models/pet/dog.js diff --git a/addon/ember-data.js b/addon/ember-data.js index 41f34a3d3..55730d3f9 100644 --- a/addon/ember-data.js +++ b/addon/ember-data.js @@ -27,7 +27,8 @@ export function getDsModels() { } let moduleMap = requirejs.entries; - let modelMatchRegex = new RegExp(`^(${modulePrefix}/models|${podModulePrefix}/.*/model$)`, 'i'); + let classicModelMatchRegex = new RegExp(`^${modulePrefix}/models/(.*)$`, 'i'); + let podModelMatchRegex = new RegExp(`^${podModulePrefix}/(.*)/model$`, 'i'); DsModels = {}; @@ -36,18 +37,15 @@ export function getDsModels() { } Object.keys(moduleMap) - .filter((module) => !!module.match(modelMatchRegex)) .forEach((path) => { - let paths = path.split('/'); - let modelName = paths[paths.length - 1]; - let model = require(path, null, null, true).default; - - if (modelName === 'model') { - modelName = paths[paths.length - 2]; - } - - if (isDsModel(model)) { - DsModels[modelName] = model; + let matches = path.match(classicModelMatchRegex) || path.match(podModelMatchRegex); + if (matches && matches[1]) { + let modelName = matches[1]; + + let model = require(path, null, null, true).default; + if (isDsModel(model)) { + DsModels[modelName] = model; + } } }); diff --git a/tests/dummy/app/models/pet/dog.js b/tests/dummy/app/models/pet/dog.js new file mode 100644 index 000000000..418056b01 --- /dev/null +++ b/tests/dummy/app/models/pet/dog.js @@ -0,0 +1,3 @@ +import Pet from '../pet'; + +export default Pet.extend({}); diff --git a/tests/integration/ember-data-test.js b/tests/integration/ember-data-test.js index 7b9dda5e9..c6f6d367e 100644 --- a/tests/integration/ember-data-test.js +++ b/tests/integration/ember-data-test.js @@ -39,6 +39,13 @@ module('Integration | Ember Data', function(hooks) { assert.equal(registry.address.foreignKeys.length, 1, 'Ember data model Address has the correct relationships'); }); + test(`It works with nested models`, function(assert) { + let { schema } = this.server; + let registry = schema._registry; + + assert.ok(registry['pet/dog'], 'Model pet/dog has been registered'); + }); + test(`Defined mirage models take precedence over autogenerated ones`, function(assert) { let { schema } = this.server; let registry = schema._registry; From bbb99eeb260f51a88d738ce843015cbe7272986d Mon Sep 17 00:00:00 2001 From: simonihmig Date: Fri, 1 Dec 2017 12:16:28 +0100 Subject: [PATCH 130/879] Support coalesce option properly according to JSON:API spec Introduces a new `getCoalescedIds` method for serializers, to encapsulate knowledge on how to deserialize coalesced Ids from the given request in that layer, so we can support the proper way for each serializer independently. Fixes #1202 --- addon/route-handlers/shorthands/get.js | 10 +++--- addon/serializer-registry.js | 4 +++ addon/serializer.js | 3 ++ addon/serializers/active-model-serializer.js | 4 +++ addon/serializers/json-api-serializer.js | 9 +++++- addon/serializers/rest-serializer.js | 4 +++ .../route-handlers/get-shorthand-test.js | 31 ++++++++++++++++--- .../active-model-serializer-test.js | 10 ++++++ .../serializers/json-api-serializer-test.js | 18 +++++++++++ .../unit/serializers/rest-serializer-test.js | 12 ++++++- 10 files changed, 95 insertions(+), 10 deletions(-) create mode 100644 tests/unit/serializers/json-api-serializer-test.js diff --git a/addon/route-handlers/shorthands/get.js b/addon/route-handlers/shorthands/get.js index b27ea1898..403e31f80 100644 --- a/addon/route-handlers/shorthands/get.js +++ b/addon/route-handlers/shorthands/get.js @@ -29,11 +29,13 @@ export default class GetShorthandRouteHandler extends BaseShorthandRouteHandler } else { return model; } - } else if (this.options.coalesce && request.queryParams && request.queryParams.ids) { - return modelClass.find(request.queryParams.ids); - } else { - return modelClass.all(); + } else if (this.options.coalesce) { + let ids = this.serializerOrRegistry.getCoalescedIds(request, camelizedModelName); + if (ids) { + return modelClass.find(ids); + } } + return modelClass.all(); } /* diff --git a/addon/serializer-registry.js b/addon/serializer-registry.js index f6ff4227e..c3a632da3 100644 --- a/addon/serializer-registry.js +++ b/addon/serializer-registry.js @@ -83,4 +83,8 @@ export default class SerializerRegistry { ); } + getCoalescedIds(request, modelName) { + return this.serializerFor(modelName).getCoalescedIds(request); + } + } diff --git a/addon/serializer.js b/addon/serializer.js index ee8703724..fa55262bf 100644 --- a/addon/serializer.js +++ b/addon/serializer.js @@ -485,6 +485,9 @@ class Serializer { return formattedAttrs; } + + getCoalescedIds(/* request */) { + } } // Defaults diff --git a/addon/serializers/active-model-serializer.js b/addon/serializers/active-model-serializer.js index a96ca67a2..a58fb1448 100644 --- a/addon/serializers/active-model-serializer.js +++ b/addon/serializers/active-model-serializer.js @@ -55,6 +55,10 @@ export default Serializer.extend({ }); return jsonApiPayload; + }, + + getCoalescedIds(request) { + return request.queryParams && request.queryParams.ids; } }); diff --git a/addon/serializers/json-api-serializer.js b/addon/serializers/json-api-serializer.js index eb80bdaa8..48c72f378 100644 --- a/addon/serializers/json-api-serializer.js +++ b/addon/serializers/json-api-serializer.js @@ -216,8 +216,15 @@ const JSONAPISerializer = Serializer.extend({ typeKeyForModel(model) { return dasherize(pluralize(model.modelName)); - } + }, + getCoalescedIds(request) { + let ids = request.queryParams && request.queryParams['filter[id]']; + if (typeof ids === 'string') { + return ids.split(','); + } + return ids; + } }); JSONAPISerializer.prototype.alwaysIncludeLinkageData = false; diff --git a/addon/serializers/rest-serializer.js b/addon/serializers/rest-serializer.js index 56caac47e..e38430187 100644 --- a/addon/serializers/rest-serializer.js +++ b/addon/serializers/rest-serializer.js @@ -25,6 +25,10 @@ export default ActiveModelSerializer.extend({ keyForForeignKey(relationshipName) { return camelize(singularize(relationshipName)); + }, + + getCoalescedIds(request) { + return request.queryParams && request.queryParams.ids; } }); diff --git a/tests/integration/route-handlers/get-shorthand-test.js b/tests/integration/route-handlers/get-shorthand-test.js index 55a95f6eb..29b3d1eb7 100644 --- a/tests/integration/route-handlers/get-shorthand-test.js +++ b/tests/integration/route-handlers/get-shorthand-test.js @@ -4,6 +4,7 @@ import { hasMany, belongsTo, JSONAPISerializer, + RestSerializer, Response } from 'ember-cli-mirage'; import Collection from 'ember-cli-mirage/orm/collection'; @@ -117,8 +118,8 @@ module('Integration | Route Handlers | GET shorthand', function(hooks) { assert.equal(author.name, 'Zelda'); }); - test('undefined shorthand with coalesce true returns the appropriate models', function(assert) { - let request = { url: '/authors?ids[]=1&ids[]=3', queryParams: { ids: [1, 3] } }; + test('undefined shorthand with coalesce true returns the appropriate models [JSONAPI]', function(assert) { + let request = { url: '/authors?filter[id]=1,3', queryParams: { 'filter[id]': '1,3' } }; let options = { coalesce: true }; let handler = new GetShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors', options); @@ -128,6 +129,17 @@ module('Integration | Route Handlers | GET shorthand', function(hooks) { assert.deepEqual(authors.models.map((author) => author.name), ['Link', 'Epona']); }); + test('undefined shorthand with coalesce true returns the appropriate models [REST]', function(assert) { + let request = { url: '/authors?ids[]=1&ids[]=3', queryParams: { ids: [1, 3] } }; + let options = { coalesce: true }; + let handler = new GetShorthandRouteHandler(this.schema, new RestSerializer(), undefined, '/authors', options); + + let authors = handler.handle(request); + + assert.equal(authors.models.length, 2); + assert.deepEqual(authors.models.map((author) => author.name), ['Link', 'Epona']); + }); + test('string shorthand returns the correct collection of models', function(assert) { let request = { url: '/people' }; let handler = new GetShorthandRouteHandler(this.schema, this.serializer, 'author'); @@ -160,8 +172,8 @@ module('Integration | Route Handlers | GET shorthand', function(hooks) { assert.equal(author.code, 404); }); - test('string shorthand with coalesce returns the correct models', function(assert) { - let request = { url: '/people?ids[]=1&ids[]=3', queryParams: { ids: [1, 3] } }; + test('string shorthand with coalesce returns the correct models [JSONAPI]', function(assert) { + let request = { url: '/authors?filter[id]=1,3', queryParams: { 'filter[id]': '1,3' } }; let options = { coalesce: true }; let handler = new GetShorthandRouteHandler(this.schema, this.serializer, 'author', '/people', options); @@ -171,6 +183,17 @@ module('Integration | Route Handlers | GET shorthand', function(hooks) { assert.deepEqual(authors.models.map((author) => author.name), ['Link', 'Epona']); }); + test('string shorthand with coalesce returns the correct models [REST]', function(assert) { + let request = { url: '/people?ids[]=1&ids[]=3', queryParams: { ids: [1, 3] } }; + let options = { coalesce: true }; + let handler = new GetShorthandRouteHandler(this.schema, new RestSerializer(), 'author', '/people', options); + + let authors = handler.handle(request); + + assert.equal(authors.models.length, 2); + assert.deepEqual(authors.models.map((author) => author.name), ['Link', 'Epona']); + }); + test('array shorthand returns the correct models', function(assert) { let url = '/home'; let request = { url }; diff --git a/tests/unit/serializers/active-model-serializer-test.js b/tests/unit/serializers/active-model-serializer-test.js index 935700990..f954a7081 100644 --- a/tests/unit/serializers/active-model-serializer-test.js +++ b/tests/unit/serializers/active-model-serializer-test.js @@ -66,5 +66,15 @@ module('Unit | Serializers | ActiveModelSerializer', function(hooks) { } }); }); + + test('it returns coalesce Ids if present', function(assert) { + let request = { url: '/authors', queryParams: { ids: ['1', '3'] } }; + assert.deepEqual(this.serializer.getCoalescedIds(request), ['1', '3']); + }); + + test('it returns undefined coalesce Ids if not present', function(assert) { + let request = { url: '/authors', queryParams: {} }; + assert.strictEqual(this.serializer.getCoalescedIds(request), undefined); + }); }); diff --git a/tests/unit/serializers/json-api-serializer-test.js b/tests/unit/serializers/json-api-serializer-test.js new file mode 100644 index 000000000..e92b1365f --- /dev/null +++ b/tests/unit/serializers/json-api-serializer-test.js @@ -0,0 +1,18 @@ +import JSONAPISerializer from 'ember-cli-mirage/serializers/json-api-serializer'; +import { module, test } from 'qunit'; + +module('Unit | Serializers | JSON API Serializer', function(hooks) { + hooks.beforeEach(function() { + this.serializer = new JSONAPISerializer(); + }); + + test('it returns coalesce Ids if present', function(assert) { + let request = { url: '/authors', queryParams: { 'filter[id]': '1,3' } }; + assert.deepEqual(this.serializer.getCoalescedIds(request), ['1', '3']); + }); + + test('it returns undefined coalesce Ids if not present', function(assert) { + let request = { url: '/authors', queryParams: {} }; + assert.strictEqual(this.serializer.getCoalescedIds(request), undefined); + }); +}); diff --git a/tests/unit/serializers/rest-serializer-test.js b/tests/unit/serializers/rest-serializer-test.js index 60e2a4105..7f3aca3a0 100644 --- a/tests/unit/serializers/rest-serializer-test.js +++ b/tests/unit/serializers/rest-serializer-test.js @@ -1,6 +1,6 @@ import RestSerializer from 'ember-cli-mirage/serializers/rest-serializer'; -import {module, test} from 'qunit'; +import { module, test } from 'qunit'; module('Unit | Serializers | RestSerializer', function(hooks) { hooks.beforeEach(function() { @@ -28,4 +28,14 @@ module('Unit | Serializers | RestSerializer', function(hooks) { } }); }); + + test('it returns coalesce Ids if present', function(assert) { + let request = { url: '/authors', queryParams: { ids: ['1', '3'] } }; + assert.deepEqual(this.serializer.getCoalescedIds(request), ['1', '3']); + }); + + test('it returns undefined coalesce Ids if not present', function(assert) { + let request = { url: '/authors', queryParams: {} }; + assert.strictEqual(this.serializer.getCoalescedIds(request), undefined); + }); }); From 88aeb89c710fe919767aca1b629019c9bf767172 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 1 Feb 2018 13:01:17 -0500 Subject: [PATCH 131/879] Update README.md --- README.md | 36 +++++++++++++----------------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 6b082c3de..d34c069d3 100644 --- a/README.md +++ b/README.md @@ -1,44 +1,34 @@ +# Ember CLI Mirage + [![Build Status](https://travis-ci.org/samselikoff/ember-cli-mirage.svg?branch=master)](https://travis-ci.org/samselikoff/ember-cli-mirage) [![npm version](https://badge.fury.io/js/ember-cli-mirage.svg)](http://badge.fury.io/js/ember-cli-mirage) [![Ember Observer Score](http://emberobserver.com/badges/ember-cli-mirage.svg)](http://emberobserver.com/addons/ember-cli-mirage) -# Ember CLI Mirage - - A client-side server to develop, test and prototype your Ember CLI app. - +[View the docs here.](http://www.ember-cli-mirage.com/) ---- -Are you tired of - -- Writing one set of fixtures for your tests, and another for development? -- Wiring up tests for each of your apps manually, from scratch? -- Changing lots of files/tests when your API changes? - -Ember CLI Mirage may be for you! It lets you create a client-side server using [Pretender](https://github.com/trek/pretender) to help you develop and test your app. By default, it only runs if you're not in production and if you're not proxying to an explicit API server via `ember serve --proxy`. - ## Installation ```sh -ember install ember-cli-mirage # install:addon for Ember CLI < 0.2.3 +ember install ember-cli-mirage ``` -## Updating - -When updating your project to a newer version of Ember CLI Mirage, please consult [the changelog](/CHANGELOG.md) for any update notes. - -## Getting started - -Check out the [Docs](http://www.ember-cli-mirage.com/docs/v0.3.x/)! - ## Support -Having trouble? Open an issue! +Having trouble? -You can use the [Mirage Boilerplate Twiddle](https://ember-twiddle.com/eedfd390d8394d54d5bfd0ed988a5d0f) to reproduce your issue. +- **Join #ec-mirage** on the Ember Community Slack +- **Open an issue**, and if possible reproduce it using the [Mirage Boilerplate Twiddle](https://ember-twiddle.com/ec3a4c625c43e7a38f3c6c0c1b8232ec?openFiles=twiddle.json%2C). ## Contributing Have a look at our [Contributing guidelines](./CONTRIBUTING.md). + +## About + +This library is developed and maintained by [EmberMap](https://embermap.com/). We have a [Mirage tips and tricks](https://embermap.com/topics/mirage-tips-and-tricks) video series if you're looking to learn how to get the most out of Mirage. + +Thanks to all our amazing [contributors](https://github.com/samselikoff/ember-cli-mirage/graphs/contributors)! From 438ca008af6a3bf7b1f771d61571acc725ffc66f Mon Sep 17 00:00:00 2001 From: Kenneth Buck Date: Thu, 7 Dec 2017 00:37:28 -0500 Subject: [PATCH 132/879] Add noop initializer when mirage is excluded from build --- index.js | 16 ++++++++++++++++ package.json | 1 + yarn.lock | 28 +++++++++++++++++++++++++++- 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index d0654055c..e125fe716 100644 --- a/index.js +++ b/index.js @@ -4,6 +4,8 @@ const path = require('path'); const mergeTrees = require('broccoli-merge-trees'); const Funnel = require('broccoli-funnel'); const map = require('broccoli-stew').map; +const rm = require('broccoli-stew').rm; +const replace = require('broccoli-replace'); module.exports = { name: 'ember-cli-mirage', @@ -67,6 +69,20 @@ module.exports = { treeFor(name) { if (!this._shouldIncludeFiles()) { + if(name === 'app') { + // include a noop initializer even when mirage is excluded from the build + const initializerFileName = 'initializers/ember-cli-mirage.js'; + const tree = rm(this._super.treeFor.apply(this, arguments), (path) => path !== initializerFileName); + + return replace(tree, { + files: [initializerFileName], + patterns: [{ + match: /[\S\s]*/m, + replacement: 'export default {name: \'ember-cli-mirage\',initialize() {}};' + }] + }) ; + } + return; } diff --git a/package.json b/package.json index 1879d7c06..643508f9e 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "dependencies": { "broccoli-funnel": "^1.0.2", "broccoli-merge-trees": "^1.1.0", + "broccoli-replace": "^0.12.0", "broccoli-stew": "^1.5.0", "chalk": "^1.1.1", "ember-cli-babel": "^6.8.2", diff --git a/yarn.lock b/yarn.lock index 7450c2b10..1267c8f21 100644 --- a/yarn.lock +++ b/yarn.lock @@ -248,6 +248,14 @@ aot-test-generators@^0.1.0: dependencies: jsesc "^2.5.0" +applause@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/applause/-/applause-1.2.2.tgz#a8468579e81f67397bb5634c29953bedcd0f56c0" + dependencies: + cson-parser "^1.1.0" + js-yaml "^3.3.0" + lodash "^3.10.0" + aproba@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -1455,6 +1463,14 @@ broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli rimraf "^2.3.4" symlink-or-copy "^1.1.8" +broccoli-replace@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/broccoli-replace/-/broccoli-replace-0.12.0.tgz#36460a984c45c61731638c53068b0ab12ea8fdb7" + dependencies: + applause "1.2.2" + broccoli-persistent-filter "^1.2.0" + minimatch "^3.0.0" + broccoli-slow-trees@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-3.0.1.tgz#9bf2a9e2f8eb3ed3a3f2abdde988da437ccdc9b4" @@ -1755,6 +1771,10 @@ code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" +coffee-script@^1.10.0: + version "1.12.7" + resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.7.tgz#c05dae0cb79591d05b3070a8433a98c9a89ccc53" + color-convert@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" @@ -1984,6 +2004,12 @@ crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" +cson-parser@^1.1.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/cson-parser/-/cson-parser-1.3.5.tgz#7ec675e039145533bf2a6a856073f1599d9c2d24" + dependencies: + coffee-script "^1.10.0" + cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": version "0.3.2" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" @@ -3938,7 +3964,7 @@ js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" -js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.6.1, js-yaml@^3.9.1: +js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.3.0, js-yaml@^3.6.1, js-yaml@^3.9.1: version "3.10.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" dependencies: From a95e74fbe2f304b07d27cb6f812b6d0484ffe35c Mon Sep 17 00:00:00 2001 From: Kenneth Buck Date: Thu, 7 Dec 2017 00:48:33 -0500 Subject: [PATCH 133/879] Change const to let to match code style --- index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index e125fe716..5c7944561 100644 --- a/index.js +++ b/index.js @@ -71,8 +71,8 @@ module.exports = { if (!this._shouldIncludeFiles()) { if(name === 'app') { // include a noop initializer even when mirage is excluded from the build - const initializerFileName = 'initializers/ember-cli-mirage.js'; - const tree = rm(this._super.treeFor.apply(this, arguments), (path) => path !== initializerFileName); + let initializerFileName = 'initializers/ember-cli-mirage.js'; + let tree = rm(this._super.treeFor.apply(this, arguments), (path) => path !== initializerFileName); return replace(tree, { files: [initializerFileName], From a4c23e7da420d8cceed4d8d2c870a7d18d07c143 Mon Sep 17 00:00:00 2001 From: Kenneth Buck Date: Thu, 7 Dec 2017 21:13:31 -0500 Subject: [PATCH 134/879] Ensure initializer is included for app and addon in prod builds --- index.js | 2 +- node-tests/addon-tree-test.js | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index 5c7944561..6afb55f7c 100644 --- a/index.js +++ b/index.js @@ -69,7 +69,7 @@ module.exports = { treeFor(name) { if (!this._shouldIncludeFiles()) { - if(name === 'app') { + if(name === 'app' || name === 'addon') { // include a noop initializer even when mirage is excluded from the build let initializerFileName = 'initializers/ember-cli-mirage.js'; let tree = rm(this._super.treeFor.apply(this, arguments), (path) => path !== initializerFileName); diff --git a/node-tests/addon-tree-test.js b/node-tests/addon-tree-test.js index a67b22968..c79a7535d 100644 --- a/node-tests/addon-tree-test.js +++ b/node-tests/addon-tree-test.js @@ -31,11 +31,12 @@ describe('Addon', function() { }); var treeForTests = function(name) { - it('returns an empty tree in production environment by default', function() { + it('returns a tree with only the initializer in production environment by default', function() { process.env.EMBER_ENV = 'production'; var addonTree = getMirageAddon().treeFor(name); - expect(addonTree).to.be.undefined; + expect(addonTree.files.length).to.equal(1); + expect(addonTree.files[0]).to.equal('initializers/ember-cli-mirage.js'); }); ['development', 'test'].forEach(function(environment) { From 0c894d4557d8d25ee676f44fbf8475ba4b6e435e Mon Sep 17 00:00:00 2001 From: Casey Watts Date: Wed, 8 Nov 2017 15:49:20 -0500 Subject: [PATCH 135/879] test that ember-data model detection even works when the key isn't the same as the data model type --- tests/dummy/app/models/address.js | 3 ++- tests/integration/ember-data-test.js | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/dummy/app/models/address.js b/tests/dummy/app/models/address.js index 31fb290d5..86a5cd784 100644 --- a/tests/dummy/app/models/address.js +++ b/tests/dummy/app/models/address.js @@ -5,5 +5,6 @@ const { Model, attr, belongsTo } = DS; export default Model.extend({ street: attr('string'), - contact: belongsTo('contact') + contact: belongsTo('contact'), + primaryContact: belongsTo('contact') }); diff --git a/tests/integration/ember-data-test.js b/tests/integration/ember-data-test.js index c6f6d367e..ea7a3d670 100644 --- a/tests/integration/ember-data-test.js +++ b/tests/integration/ember-data-test.js @@ -36,7 +36,9 @@ module('Integration | Ember Data', function(hooks) { assert.ok(registry.address, 'Ember data model Address has been registered'); assert.ok(registry.contact, 'Ember data model Contact has been registered'); assert.ok(registry.user, 'Ember data model User has been registered'); - assert.equal(registry.address.foreignKeys.length, 1, 'Ember data model Address has the correct relationships'); + assert.equal(registry.address.foreignKeys.length, 2, 'Ember data model Address has the correct relationships'); + assert.equal(registry.address.foreignKeys[0], 'contactId', 'Ember data model Address has the correct relationships'); + assert.equal(registry.address.foreignKeys[1], 'primaryContactId', 'Ember data model Address has the correct relationships'); }); test(`It works with nested models`, function(assert) { From d6fbca289e4a674ff740aeeb14c2fa4e671519e0 Mon Sep 17 00:00:00 2001 From: Casey Watts Date: Wed, 8 Nov 2017 15:51:41 -0500 Subject: [PATCH 136/879] rename models to emberDataModels for clarity --- addon/ember-data.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addon/ember-data.js b/addon/ember-data.js index 55730d3f9..5a60efbf2 100644 --- a/addon/ember-data.js +++ b/addon/ember-data.js @@ -64,11 +64,11 @@ export function getModels() { return Models; } - let models = getDsModels(); + let emberDataModels = getDsModels(); Models = {}; - Object.keys(models).forEach(modelName => { - let model = models[modelName]; + Object.keys(emberDataModels).forEach(modelName => { + let model = emberDataModels[modelName]; let attrs = {}; model.eachRelationship((name, r) => { From c5f1224f5795edfd9317a3e2440d83f32c52e456 Mon Sep 17 00:00:00 2001 From: Casey Watts Date: Thu, 30 Nov 2017 15:19:28 -0500 Subject: [PATCH 137/879] make a new model 'state' to use when testing mirage with keys that are different from models --- tests/dummy/app/models/address.js | 2 +- tests/dummy/app/models/state.js | 7 +++++++ tests/integration/ember-data-test.js | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 tests/dummy/app/models/state.js diff --git a/tests/dummy/app/models/address.js b/tests/dummy/app/models/address.js index 86a5cd784..c9d395559 100644 --- a/tests/dummy/app/models/address.js +++ b/tests/dummy/app/models/address.js @@ -6,5 +6,5 @@ export default Model.extend({ street: attr('string'), contact: belongsTo('contact'), - primaryContact: belongsTo('contact') + province: belongsTo('state') }); diff --git a/tests/dummy/app/models/state.js b/tests/dummy/app/models/state.js new file mode 100644 index 000000000..17ecd8d9f --- /dev/null +++ b/tests/dummy/app/models/state.js @@ -0,0 +1,7 @@ +import DS from 'ember-data'; + +const { Model, hasMany } = DS; + +export default Model.extend({ + addresses: hasMany('address') +}); diff --git a/tests/integration/ember-data-test.js b/tests/integration/ember-data-test.js index ea7a3d670..8b33ec4f5 100644 --- a/tests/integration/ember-data-test.js +++ b/tests/integration/ember-data-test.js @@ -38,7 +38,7 @@ module('Integration | Ember Data', function(hooks) { assert.ok(registry.user, 'Ember data model User has been registered'); assert.equal(registry.address.foreignKeys.length, 2, 'Ember data model Address has the correct relationships'); assert.equal(registry.address.foreignKeys[0], 'contactId', 'Ember data model Address has the correct relationships'); - assert.equal(registry.address.foreignKeys[1], 'primaryContactId', 'Ember data model Address has the correct relationships'); + assert.equal(registry.address.foreignKeys[1], 'provinceId', 'Ember data model Address has the correct relationships'); }); test(`It works with nested models`, function(assert) { From af2e3397e3d701e0cf1fd52020b8121e2ad61502 Mon Sep 17 00:00:00 2001 From: Sivakumar Kailasam Date: Wed, 7 Feb 2018 11:28:07 +0530 Subject: [PATCH 138/879] Remove sinon since its unused --- .travis.yml | 2 - bower.json | 6 - package.json | 1 - yarn.lock | 2086 +++++++++++++++++++++++++++++--------------------- 4 files changed, 1201 insertions(+), 894 deletions(-) delete mode 100644 bower.json diff --git a/.travis.yml b/.travis.yml index cc402dd31..48543f7e0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -43,11 +43,9 @@ before_install: - curl -o- -L https://yarnpkg.com/install.sh | bash - export PATH=$HOME/.yarn/bin:$PATH - if [[ $(npm -v | cut -d '.' -f 1) -lt 3 ]]; then npm i -g npm@^3; fi - - yarn global add bower install: - yarn install --no-lockfile --non-interactive - - bower install script: # Usually, it's ok to finish the test scenario without reverting diff --git a/bower.json b/bower.json deleted file mode 100644 index 5420da0b0..000000000 --- a/bower.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "ember-cli-mirage", - "dependencies": { - "sinonjs": "~1.17.1" - } -} diff --git a/package.json b/package.json index 643508f9e..8a883b291 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,6 @@ "ember-fastboot-addon-tests": "^0.4.0", "ember-load-initializers": "^1.0.0", "ember-resolver": "^4.0.0", - "ember-sinon": "0.5.1", "ember-source": "~2.16.0", "eslint-plugin-ember-suave": "^1.0.0", "loader.js": "^4.2.3", diff --git a/yarn.lock b/yarn.lock index 1267c8f21..8c761adf3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,89 +2,24 @@ # yarn lockfile v1 -"@glimmer/compiler@^0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@glimmer/compiler/-/compiler-0.25.3.tgz#25eb06394f3ba1c1fae5af25c9cf7deb2c11ef4e" +"@ember/test-helpers@^0.7.9": + version "0.7.16" + resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-0.7.16.tgz#73a4acf4c7d1b92ce866f4c9e40c9723da4cf1e8" dependencies: - "@glimmer/interfaces" "^0.25.3" - "@glimmer/syntax" "^0.25.3" - "@glimmer/util" "^0.25.3" - "@glimmer/wire-format" "^0.25.3" - simple-html-tokenizer "^0.3.0" + broccoli-funnel "^2.0.1" + ember-cli-babel "^6.10.0" + ember-cli-htmlbars-inline-precompile "^1.0.0" "@glimmer/di@^0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@glimmer/di/-/di-0.2.0.tgz#73bfd4a6ee4148a80bf092e8a5d29bcac9d4ce7e" -"@glimmer/interfaces@^0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.25.3.tgz#8c460b28ad5a17eaa1712e6aa7b8ebb49738c38f" - dependencies: - "@glimmer/wire-format" "^0.25.3" - -"@glimmer/node@^0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@glimmer/node/-/node-0.25.3.tgz#301828e8455be141d5384b01980ed9be02984059" - dependencies: - "@glimmer/runtime" "^0.25.3" - simple-dom "^0.3.0" - -"@glimmer/object-reference@^0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@glimmer/object-reference/-/object-reference-0.25.3.tgz#e0d1fa874f912e7d1232d487fcd2096e6b31b620" - dependencies: - "@glimmer/reference" "^0.25.3" - "@glimmer/util" "^0.25.3" - -"@glimmer/object@^0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@glimmer/object/-/object-0.25.3.tgz#451eb208dadba1ede9c0c038a90dfe32637493fe" - dependencies: - "@glimmer/object-reference" "^0.25.3" - "@glimmer/util" "^0.25.3" - -"@glimmer/reference@^0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@glimmer/reference/-/reference-0.25.3.tgz#a09ddc397bee0223de73ea5044a304a30935104f" - dependencies: - "@glimmer/util" "^0.25.3" - "@glimmer/resolver@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@glimmer/resolver/-/resolver-0.4.1.tgz#cd9644572c556e7e799de1cf8eff2b999cf5b878" + version "0.4.2" + resolved "https://registry.yarnpkg.com/@glimmer/resolver/-/resolver-0.4.2.tgz#60c9b492e90bc3956ac82b3134649bd337e1651c" dependencies: "@glimmer/di" "^0.2.0" -"@glimmer/runtime@^0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@glimmer/runtime/-/runtime-0.25.3.tgz#ae2101a1e4de3330d08f20806c18327dbfa86d78" - dependencies: - "@glimmer/interfaces" "^0.25.3" - "@glimmer/object" "^0.25.3" - "@glimmer/object-reference" "^0.25.3" - "@glimmer/reference" "^0.25.3" - "@glimmer/util" "^0.25.3" - "@glimmer/wire-format" "^0.25.3" - -"@glimmer/syntax@^0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.25.3.tgz#b3f8a59bee616fd600301d778de3b649bf77036e" - dependencies: - "@glimmer/interfaces" "^0.25.3" - "@glimmer/util" "^0.25.3" - handlebars "^4.0.6" - simple-html-tokenizer "^0.3.0" - -"@glimmer/util@^0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.25.3.tgz#7cedf72947137b519658c8be34d0d5965cebe3a1" - -"@glimmer/wire-format@^0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@glimmer/wire-format/-/wire-format-0.25.3.tgz#046692b3a26a30a498712266cd0bdb47d7710f37" - dependencies: - "@glimmer/util" "^0.25.3" - abab@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" @@ -123,27 +58,28 @@ acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" -acorn@^4.0.3, acorn@^4.0.4: +acorn@^4.0.4: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" -acorn@^5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.2.tgz#911cb53e036807cf0fa778dc5d370fbd864246d7" +acorn@^5.4.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.4.1.tgz#fdc58d9d17f4a4e98d102ded826a9b9759125102" active-model-adapter@^2.0.3: - version "2.1.1" - resolved "https://registry.yarnpkg.com/active-model-adapter/-/active-model-adapter-2.1.1.tgz#ec088f391dc1cd4f163ad9ec0ecf61c69bc53613" + version "2.2.0" + resolved "https://registry.yarnpkg.com/active-model-adapter/-/active-model-adapter-2.2.0.tgz#6885d6968574809f17f398c499b688a921c30f91" dependencies: - ember-cli-babel "^5.1.6" + ember-cli-babel "^6.8.2" + ember-inflector "^2.0.0" after@0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/after/-/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" ajv-keywords@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.0.tgz#a296e17f7bfae7c1ce4f7e0de53d29cb32162df0" + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" ajv@^4.9.1: version "4.11.8" @@ -152,14 +88,14 @@ ajv@^4.9.1: co "^4.6.0" json-stable-stringify "^1.0.1" -ajv@^5.1.0, ajv@^5.2.0, ajv@^5.2.3: - version "5.2.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.3.tgz#c06f598778c44c6b161abafe3466b81ad1814ed2" +ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" dependencies: co "^4.6.0" fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" - json-stable-stringify "^1.0.1" align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" @@ -169,12 +105,6 @@ align-text@^0.1.1, align-text@^0.1.3: longest "^1.0.1" repeat-string "^1.5.2" -alter@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/alter/-/alter-0.2.0.tgz#c7588808617572034aae62480af26b1d4d1cb3cd" - dependencies: - stable "~0.1.3" - amd-name-resolver@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-0.0.5.tgz#76962dac876ed3311b05d29c6a58c14e1ef3304b" @@ -197,6 +127,10 @@ amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" +ansi-escapes@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + ansi-escapes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" @@ -279,14 +213,26 @@ arr-diff@^2.0.0: dependencies: arr-flatten "^1.0.1" -arr-flatten@^1.0.1: +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + array-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -315,6 +261,10 @@ array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + arraybuffer.slice@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" @@ -336,20 +286,12 @@ assert-plus@^0.2.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" assertion-error@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" - -ast-traverse@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ast-traverse/-/ast-traverse-0.1.1.tgz#69cf2b8386f19dcda1bb1e05d68fe359d8897de6" - -ast-types@0.8.12: - version "0.8.12" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.12.tgz#a0d90e4351bb887716c83fd637ebf818af4adfcc" + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" -ast-types@0.8.15: - version "0.8.15" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.15.tgz#8eef0827f04dff0ec8857ba925abe3fea6194e52" +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" ast-types@0.9.6: version "0.9.6" @@ -383,8 +325,8 @@ async@^1.4.0, async@^1.5.2: resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" async@^2.4.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" + version "2.6.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" dependencies: lodash "^4.14.0" @@ -396,6 +338,10 @@ asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" +atob@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d" + aws-sign2@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" @@ -416,57 +362,6 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^5.0.0: - version "5.8.38" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-5.8.38.tgz#1fcaee79d7e61b750b00b8e54f6dfc9d0af86558" - dependencies: - babel-plugin-constant-folding "^1.0.1" - babel-plugin-dead-code-elimination "^1.0.2" - babel-plugin-eval "^1.0.1" - babel-plugin-inline-environment-variables "^1.0.1" - babel-plugin-jscript "^1.0.4" - babel-plugin-member-expression-literals "^1.0.1" - babel-plugin-property-literals "^1.0.1" - babel-plugin-proto-to-assign "^1.0.3" - babel-plugin-react-constant-elements "^1.0.3" - babel-plugin-react-display-name "^1.0.3" - babel-plugin-remove-console "^1.0.1" - babel-plugin-remove-debugger "^1.0.1" - babel-plugin-runtime "^1.0.7" - babel-plugin-undeclared-variables-check "^1.0.2" - babel-plugin-undefined-to-void "^1.1.6" - babylon "^5.8.38" - bluebird "^2.9.33" - chalk "^1.0.0" - convert-source-map "^1.1.0" - core-js "^1.0.0" - debug "^2.1.1" - detect-indent "^3.0.0" - esutils "^2.0.0" - fs-readdir-recursive "^0.1.0" - globals "^6.4.0" - home-or-tmp "^1.0.0" - is-integer "^1.0.4" - js-tokens "1.0.1" - json5 "^0.4.0" - lodash "^3.10.0" - minimatch "^2.0.3" - output-file-sync "^1.1.0" - path-exists "^1.0.0" - path-is-absolute "^1.0.0" - private "^0.1.6" - regenerator "0.8.40" - regexpu "^1.3.0" - repeating "^1.1.2" - resolve "^1.1.6" - shebang-regex "^1.0.0" - slash "^1.0.0" - source-map "^0.5.0" - source-map-support "^0.2.10" - to-fast-properties "^1.0.0" - trim-right "^1.0.0" - try-resolve "^1.0.0" - babel-core@^6.14.0, babel-core@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" @@ -492,8 +387,8 @@ babel-core@^6.14.0, babel-core@^6.26.0: source-map "^0.5.6" babel-generator@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" dependencies: babel-messages "^6.23.0" babel-runtime "^6.26.0" @@ -501,7 +396,7 @@ babel-generator@^6.26.0: detect-indent "^4.0.0" jsesc "^1.3.0" lodash "^4.17.4" - source-map "^0.5.6" + source-map "^0.5.7" trim-right "^1.0.1" babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: @@ -617,30 +512,18 @@ babel-plugin-check-es2015-constants@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-constant-folding@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-constant-folding/-/babel-plugin-constant-folding-1.0.1.tgz#8361d364c98e449c3692bdba51eff0844290aa8e" - -babel-plugin-dead-code-elimination@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz#5f7c451274dcd7cccdbfbb3e0b85dd28121f0f65" - babel-plugin-debug-macros@^0.1.10, babel-plugin-debug-macros@^0.1.11: version "0.1.11" resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.1.11.tgz#6c562bf561fccd406ce14ab04f42c218cf956605" dependencies: semver "^5.3.0" -babel-plugin-ember-modules-api-polyfill@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.1.0.tgz#78848cc4fcc2274882a6c15cbb23fefcdc771301" +babel-plugin-ember-modules-api-polyfill@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.3.0.tgz#0c01f359658cfb9c797f705af6b09f6220205ae0" dependencies: ember-rfc176-data "^0.3.0" -babel-plugin-eval@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz#a2faed25ce6be69ade4bfec263f70169195950da" - babel-plugin-feature-flags@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/babel-plugin-feature-flags/-/babel-plugin-feature-flags-0.3.1.tgz#9c827cf9a4eb9a19f725ccb239e85cab02036fc1" @@ -653,48 +536,6 @@ babel-plugin-htmlbars-inline-precompile@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.2.3.tgz#cd365e278af409bfa6be7704c4354beee742446b" -babel-plugin-inline-environment-variables@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz#1f58ce91207ad6a826a8bf645fafe68ff5fe3ffe" - -babel-plugin-jscript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/babel-plugin-jscript/-/babel-plugin-jscript-1.0.4.tgz#8f342c38276e87a47d5fa0a8bd3d5eb6ccad8fcc" - -babel-plugin-member-expression-literals@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz#cc5edb0faa8dc927170e74d6d1c02440021624d3" - -babel-plugin-property-literals@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz#0252301900192980b1c118efea48ce93aab83336" - -babel-plugin-proto-to-assign@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz#c49e7afd02f577bc4da05ea2df002250cf7cd123" - dependencies: - lodash "^3.9.3" - -babel-plugin-react-constant-elements@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/babel-plugin-react-constant-elements/-/babel-plugin-react-constant-elements-1.0.3.tgz#946736e8378429cbc349dcff62f51c143b34e35a" - -babel-plugin-react-display-name@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/babel-plugin-react-display-name/-/babel-plugin-react-display-name-1.0.3.tgz#754fe38926e8424a4e7b15ab6ea6139dee0514fc" - -babel-plugin-remove-console@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-remove-console/-/babel-plugin-remove-console-1.0.1.tgz#d8f24556c3a05005d42aaaafd27787f53ff013a7" - -babel-plugin-remove-debugger@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-remove-debugger/-/babel-plugin-remove-debugger-1.0.1.tgz#fd2ea3cd61a428ad1f3b9c89882ff4293e8c14c7" - -babel-plugin-runtime@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz#bf7c7d966dd56ecd5c17fa1cb253c9acb7e54aaf" - babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" @@ -904,16 +745,6 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-plugin-undeclared-variables-check@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-undeclared-variables-check/-/babel-plugin-undeclared-variables-check-1.0.2.tgz#5cf1aa539d813ff64e99641290af620965f65dee" - dependencies: - leven "^1.0.2" - -babel-plugin-undefined-to-void@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz#7f578ef8b78dfae6003385d8417a61eda06e2f81" - babel-polyfill@^6.16.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" @@ -923,8 +754,8 @@ babel-polyfill@^6.16.0: regenerator-runtime "^0.10.5" babel-preset-env@^1.5.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.0.tgz#2de1c782a780a0a5d605d199c957596da43c44e4" + version "1.6.1" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" dependencies: babel-plugin-check-es2015-constants "^6.22.0" babel-plugin-syntax-trailing-function-commas "^6.22.0" @@ -1017,10 +848,6 @@ babel6-plugin-strip-heimdall@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/babel6-plugin-strip-heimdall/-/babel6-plugin-strip-heimdall-6.0.1.tgz#35f80eddec1f7fffdc009811dfbd46d9965072b6" -babylon@^5.8.38: - version "5.8.38" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-5.8.38.tgz#ec9b120b11bf6ccd4173a18bf217e60b79859ffd" - babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" @@ -1047,6 +874,18 @@ base64id@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-0.1.0.tgz#02ce0fdeee0cef4f40080e1e73e834f0b1bfce3f" +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + basic-auth@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.0.tgz#015db3f353e02e56377755f962742e8981e7bbba" @@ -1066,12 +905,12 @@ better-assert@~1.0.0: callsite "1.0.0" binary-extensions@^1.0.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0" + version "1.11.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" "binaryextensions@1 || 2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.0.0.tgz#e597d1a7a6a3558a2d1c7241a16c99965e6aa40f" + version "2.1.1" + resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.1.tgz#3209a51ca4a4ad541a3b8d3d6a6d5b83a2485935" blank-object@^1.0.1: version "1.0.2" @@ -1087,10 +926,6 @@ block-stream@*: dependencies: inherits "~2.0.0" -bluebird@^2.9.33: - version "2.11.0" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" - bluebird@^3.1.1, bluebird@^3.4.6: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" @@ -1151,7 +986,7 @@ bower-endpoint-parser@0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz#00b565adbfab6f2d35addde977e97962acbcb3f6" -brace-expansion@^1.0.0, brace-expansion@^1.1.7: +brace-expansion@^1.1.7: version "1.1.8" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" dependencies: @@ -1166,9 +1001,21 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" -breakable@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/breakable/-/breakable-1.0.0.tgz#784a797915a38ead27bad456b5572cb4bbaa78c1" +braces@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.0.tgz#a46941cb5fb492156b3d6a656e06c35364e3e66e" + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + define-property "^1.0.0" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" broccoli-asset-rev@^2.4.5: version "2.6.0" @@ -1186,24 +1033,9 @@ broccoli-asset-rewrite@^1.1.0: dependencies: broccoli-filter "^1.2.3" -broccoli-babel-transpiler@^5.6.2: - version "5.7.2" - resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-5.7.2.tgz#756c30544775144e984333b7115f42c916ba08e0" - dependencies: - babel-core "^5.0.0" - broccoli-funnel "^1.0.0" - broccoli-merge-trees "^1.0.0" - broccoli-persistent-filter "^1.4.2" - clone "^0.2.0" - hash-for-dep "^1.0.2" - heimdalljs-logger "^0.1.7" - json-stable-stringify "^1.0.0" - rsvp "^3.5.0" - workerpool "^2.2.1" - broccoli-babel-transpiler@^6.0.0, broccoli-babel-transpiler@^6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.1.2.tgz#26019c045b5ea3e44cfef62821302f9bd483cabd" + version "6.1.4" + resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.1.4.tgz#8be8074c42abf2e17ff79b2d2a21df5c51143c82" dependencies: babel-core "^6.14.0" broccoli-funnel "^1.0.0" @@ -1214,7 +1046,7 @@ broccoli-babel-transpiler@^6.0.0, broccoli-babel-transpiler@^6.1.2: heimdalljs-logger "^0.1.7" json-stable-stringify "^1.0.0" rsvp "^3.5.0" - workerpool "^2.2.1" + workerpool "^2.3.0" broccoli-brocfile-loader@^0.18.0: version "0.18.0" @@ -1223,8 +1055,8 @@ broccoli-brocfile-loader@^0.18.0: findup-sync "^0.4.2" broccoli-builder@^0.18.8: - version "0.18.8" - resolved "https://registry.yarnpkg.com/broccoli-builder/-/broccoli-builder-0.18.8.tgz#fe54694d544c3cdfdb01028e802eeca65749a879" + version "0.18.11" + resolved "https://registry.yarnpkg.com/broccoli-builder/-/broccoli-builder-0.18.11.tgz#a42393c7b10bb0380df255a616307945f5e26efb" dependencies: heimdalljs "^0.2.0" promise-map-series "^0.2.1" @@ -1297,14 +1129,13 @@ broccoli-config-replace@^1.1.2: fs-extra "^0.24.0" broccoli-debug@^0.6.1, broccoli-debug@^0.6.2, broccoli-debug@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.3.tgz#1f33bb0eacb5db81366f0492524c82b1217eb578" + version "0.6.4" + resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.4.tgz#986eb3d2005e00e3bb91f9d0a10ab137210cd150" dependencies: broccoli-plugin "^1.2.1" fs-tree-diff "^0.5.2" heimdalljs "^0.2.1" heimdalljs-logger "^0.1.7" - minimatch "^3.0.3" symlink-or-copy "^1.1.8" tree-sync "^1.2.2" @@ -1388,13 +1219,13 @@ broccoli-kitchen-sink-helpers@^0.3.1: glob "^5.0.10" mkdirp "^0.5.1" -broccoli-lint-eslint@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/broccoli-lint-eslint/-/broccoli-lint-eslint-4.1.0.tgz#dccfa1150dc62407cd66fd56a619273c5479a10e" +broccoli-lint-eslint@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/broccoli-lint-eslint/-/broccoli-lint-eslint-4.2.1.tgz#f780dc083a7357a9746a9cfa8f76feb092777477" dependencies: aot-test-generators "^0.1.0" broccoli-concat "^3.2.2" - broccoli-persistent-filter "^1.2.0" + broccoli-persistent-filter "^1.4.3" eslint "^4.0.0" json-stable-stringify "^1.0.1" lodash.defaultsdeep "^4.6.0" @@ -1427,7 +1258,7 @@ broccoli-middleware@^1.0.0: handlebars "^4.0.4" mime "^1.2.11" -broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.2.0, broccoli-persistent-filter@^1.4.0, broccoli-persistent-filter@^1.4.2: +broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.2.0, broccoli-persistent-filter@^1.4.0, broccoli-persistent-filter@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.3.tgz#3511bc52fc53740cda51621f58a28152d9911bc1" dependencies: @@ -1518,8 +1349,8 @@ broccoli-string-replace@^0.1.1: minimatch "^3.0.3" broccoli-uglify-sourcemap@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/broccoli-uglify-sourcemap/-/broccoli-uglify-sourcemap-2.0.0.tgz#2dc574e9d330c2e0dcc834b3d24c794b405a3803" + version "2.0.2" + resolved "https://registry.yarnpkg.com/broccoli-uglify-sourcemap/-/broccoli-uglify-sourcemap-2.0.2.tgz#f4a73112f1f56b46043e2e89cba5ce7762cddeb3" dependencies: broccoli-plugin "^1.2.1" debug "^3.1.0" @@ -1549,11 +1380,11 @@ browser-stdout@1.3.0: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" browserslist@^2.1.2: - version "2.5.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.5.1.tgz#68e4bc536bbcc6086d62843a2ffccea8396821c6" + version "2.11.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" dependencies: - caniuse-lite "^1.0.30000744" - electron-to-chromium "^1.3.24" + caniuse-lite "^1.0.30000792" + electron-to-chromium "^1.3.30" bser@^2.0.0: version "2.0.0" @@ -1561,6 +1392,10 @@ bser@^2.0.0: dependencies: node-int64 "^0.4.0" +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" @@ -1573,6 +1408,20 @@ bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + calculate-cache-key-for-tree@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-1.1.0.tgz#0c3e42c9c134f3c9de5358c0f16793627ea976d6" @@ -1593,19 +1442,30 @@ callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" -camelcase@^1.0.2, camelcase@^1.2.1: +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + can-symlink@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/can-symlink/-/can-symlink-1.0.0.tgz#97b607d8a84bb6c6e228b902d864ecb594b9d219" dependencies: tmp "0.0.28" -caniuse-lite@^1.0.30000744: - version "1.0.30000746" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000746.tgz#c64f95a3925cfd30207a308ed76c1ae96ea09ea0" +caniuse-lite@^1.0.30000792: + version "1.0.30000803" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000803.tgz#9939c37149d38d5f4540430490d240c03106a0f5" capture-exit@^1.1.0: version "1.2.0" @@ -1663,13 +1523,17 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: supports-color "^2.0.0" chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" + version "2.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" dependencies: ansi-styles "^3.1.0" escape-string-regexp "^1.0.5" supports-color "^4.0.0" +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + charm@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/charm/-/charm-1.0.2.tgz#8add367153a6d9a581331052c4090991da995e35" @@ -1680,9 +1544,9 @@ check-error@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" -chokidar@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" +chokidar@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" dependencies: anymatch "^1.3.0" async-each "^1.0.0" @@ -1699,6 +1563,15 @@ circular-json@^0.3.1: version "0.3.3" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + clean-base-url@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clean-base-url/-/clean-base-url-1.0.0.tgz#c901cf0a20b972435b0eccd52d056824a4351b7b" @@ -1718,13 +1591,19 @@ clean-css@^3.4.5: commander "2.8.x" source-map "0.4.x" +cli-cursor@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + dependencies: + restore-cursor "^1.0.1" + cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" dependencies: restore-cursor "^2.0.0" -cli-spinners@^1.0.0: +cli-spinners@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.1.0.tgz#f1847b168844d917a671eb9d147e3df497c90d06" @@ -1755,10 +1634,6 @@ cliui@^2.1.0: right-align "^0.1.1" wordwrap "0.0.2" -clone@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" - clone@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" @@ -1775,9 +1650,16 @@ coffee-script@^1.10.0: version "1.12.7" resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.7.tgz#c05dae0cb79591d05b3070a8433a98c9a89ccc53" +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + color-convert@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" dependencies: color-name "^1.1.1" @@ -1799,6 +1681,10 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" +commander@2.12.2: + version "2.12.2" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555" + commander@2.8.x: version "2.8.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" @@ -1811,29 +1697,19 @@ commander@2.9.0: dependencies: graceful-readlink ">= 1.0.0" -commander@^2.5.0, commander@^2.6.0, commander@~2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" +commander@^2.6.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.0.tgz#7b25325963e6aace20d3a9285b09379b0c2208b5" -common-tags@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.4.0.tgz#1187be4f3d4cf0c0427d43f74eef1f73501614c0" - dependencies: - babel-runtime "^6.18.0" +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" -commoner@~0.10.3: - version "0.10.8" - resolved "https://registry.yarnpkg.com/commoner/-/commoner-0.10.8.tgz#34fc3672cd24393e8bb47e70caa0293811f4f2c5" +common-tags@^1.4.0: + version "1.7.2" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.7.2.tgz#24d9768c63d253a56ecff93845b44b4df1d52771" dependencies: - commander "^2.5.0" - detective "^4.3.1" - glob "^5.0.15" - graceful-fs "^4.1.2" - iconv-lite "^0.4.5" - mkdirp "^0.5.0" - private "^0.1.6" - q "^1.1.2" - recast "^0.11.17" + babel-runtime "^6.26.0" component-bind@1.0.0: version "1.0.0" @@ -1843,7 +1719,7 @@ component-emitter@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" -component-emitter@1.2.1: +component-emitter@1.2.1, component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" @@ -1852,10 +1728,10 @@ component-inherit@0.0.3: resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" compressible@~2.0.11: - version "2.0.11" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.11.tgz#16718a75de283ed8e604041625a2064586797d8a" + version "2.0.12" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.12.tgz#c59a5c99db76767e9876500e271ef63b3493bd66" dependencies: - mime-db ">= 1.29.0 < 2" + mime-db ">= 1.30.0 < 2" compression@^1.4.4: version "1.7.1" @@ -1873,7 +1749,7 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@^1.6.0: +concat-stream@^1.4.7, concat-stream@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" dependencies: @@ -1897,13 +1773,15 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" console-ui@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/console-ui/-/console-ui-2.0.0.tgz#159ef7d098a491f84705bb69cd63ecec9a367b14" + version "2.1.0" + resolved "https://registry.yarnpkg.com/console-ui/-/console-ui-2.1.0.tgz#e1d5279d27621a75123d7d594f9fa59f866ea3e3" dependencies: chalk "^2.1.0" - inquirer "^3.2.1" + inquirer "^2" + json-stable-stringify "^1.0.1" ora "^1.3.0" through "^2.3.8" + user-info "^1.0.0" consolidate@^0.14.0: version "0.14.5" @@ -1916,8 +1794,8 @@ content-disposition@0.5.2: resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" content-type-parser@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.1.tgz#c3e56988c53c65127fb46d4032a3a900246fdc94" + version "1.0.2" + resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" content-type@~1.0.4: version "1.0.4" @@ -1927,9 +1805,9 @@ continuable-cache@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f" -convert-source-map@^1.1.0, convert-source-map@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" +convert-source-map@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" cookie-signature@1.0.6: version "1.0.6" @@ -1943,13 +1821,13 @@ copy-dereference@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/copy-dereference/-/copy-dereference-1.0.0.tgz#6b131865420fd81b413ba994b44d3655311152b6" -core-js@^1.0.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" core-js@^2.4.0, core-js@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" + version "2.5.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" core-object@^1.1.0: version "1.1.0" @@ -2020,6 +1898,12 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": dependencies: cssom "0.3.x" +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + dependencies: + array-find-index "^1.0.1" + dag-map@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/dag-map/-/dag-map-2.0.2.tgz#9714b472de82a1843de2fba9b6876938cab44c68" @@ -2048,22 +1932,26 @@ debug@2.6.8: dependencies: ms "2.0.0" -debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.4.0, debug@^2.6.8, debug@~2.6.7: +debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.4.0, debug@^2.6.8, debug@~2.6.7: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: ms "2.0.0" -debug@^3.0.1, debug@^3.1.0: +debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" dependencies: ms "2.0.0" -decamelize@^1.0.0: +decamelize@^1.0.0, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + deep-eql@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" @@ -2078,24 +1966,17 @@ deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + dependencies: + is-descriptor "^0.1.0" -defs@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/defs/-/defs-1.1.1.tgz#b22609f2c7a11ba7a3db116805c139b1caffa9d2" - dependencies: - alter "~0.2.0" - ast-traverse "~0.1.1" - breakable "~1.0.0" - esprima-fb "~15001.1001.0-dev-harmony-fb" - simple-fmt "~0.1.0" - simple-is "~0.2.0" - stringmap "~0.2.2" - stringset "~0.2.1" - tryor "~0.1.2" - yargs "~3.27.0" +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + dependencies: + is-descriptor "^1.0.0" del@^2.0.2: version "2.2.2" @@ -2117,10 +1998,14 @@ delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" -depd@1.1.1, depd@~1.1.1: +depd@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" +depd@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" @@ -2131,13 +2016,9 @@ detect-file@^0.1.0: dependencies: fs-exists-sync "^0.1.0" -detect-indent@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-3.0.1.tgz#9dc5e5ddbceef8325764b9451b02bc6d54084f75" - dependencies: - get-stdin "^4.0.1" - minimist "^1.1.0" - repeating "^1.1.0" +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" detect-indent@^4.0.0: version "4.0.0" @@ -2145,12 +2026,9 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" -detective@^4.3.1: - version "4.5.0" - resolved "https://registry.yarnpkg.com/detective/-/detective-4.5.0.tgz#6e5a8c6b26e6c7a254b1c6b6d7490d98ec91edd1" - dependencies: - acorn "^4.0.3" - defined "^1.0.0" +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" diff@3.2.0: version "3.2.0" @@ -2160,12 +2038,11 @@ diff@^3.2.0: version "3.4.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" -doctrine@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" dependencies: esutils "^2.0.2" - isarray "^1.0.0" dot-prop@^4.1.0: version "4.2.0" @@ -2180,16 +2057,16 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" editions@^1.1.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.3.tgz#0907101bdda20fac3cbe334c27cbd0688dc99a5b" + version "1.3.4" + resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" -electron-to-chromium@^1.3.24: - version "1.3.26" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.26.tgz#996427294861a74d9c7c82b9260ea301e8c02d66" +electron-to-chromium@^1.3.30: + version "1.3.32" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.32.tgz#11d0684c0840e003c4be8928f8ac5f35dbc2b4e6" ember-ajax@^3.0.0: version "3.0.0" @@ -2222,23 +2099,13 @@ ember-cli-app-version@^2.0.0: ember-cli-babel "^6.8.0" git-repo-version "0.4.1" -ember-cli-babel@^5.1.6: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-5.2.4.tgz#5ce4f46b08ed6f6d21e878619fb689719d6e8e13" - dependencies: - broccoli-babel-transpiler "^5.6.2" - broccoli-funnel "^1.0.0" - clone "^2.0.0" - ember-cli-version-checker "^1.0.2" - resolve "^1.1.2" - -ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.3.0, ember-cli-babel@^6.4.1, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2: - version "6.8.2" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.8.2.tgz#eac2785964f4743f4c815cd53c6288f00cc087d7" +ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2, ember-cli-babel@^6.9.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.11.0.tgz#79cb184bac3c05bfe181ddc306bac100ab1f9493" dependencies: amd-name-resolver "0.0.7" babel-plugin-debug-macros "^0.1.11" - babel-plugin-ember-modules-api-polyfill "^2.0.1" + babel-plugin-ember-modules-api-polyfill "^2.3.0" babel-plugin-transform-es2015-modules-amd "^6.24.0" babel-polyfill "^6.16.0" babel-preset-env "^1.5.1" @@ -2247,7 +2114,8 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.3.0, e broccoli-funnel "^1.0.0" broccoli-source "^1.1.0" clone "^2.0.0" - ember-cli-version-checker "^2.0.0" + ember-cli-version-checker "^2.1.0" + semver "^5.4.1" ember-cli-broccoli-sane-watcher@^2.0.4: version "2.0.4" @@ -2260,18 +2128,19 @@ ember-cli-broccoli-sane-watcher@^2.0.4: sane "^1.1.1" ember-cli-dependency-checker@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-2.0.1.tgz#e44cd2f8cdbf6a1043092de1ebfd62e7b8c00dd1" + version "2.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-2.1.0.tgz#9d66286a7c778e94733eaf21320d129c4fd0dd64" dependencies: chalk "^1.1.3" is-git-url "^1.0.0" + resolve "^1.5.0" semver "^5.3.0" ember-cli-eslint@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ember-cli-eslint/-/ember-cli-eslint-4.2.1.tgz#1718875632b3c10fa0da2f665d294c08f24b8ca3" + version "4.2.3" + resolved "https://registry.yarnpkg.com/ember-cli-eslint/-/ember-cli-eslint-4.2.3.tgz#2844d3f5e8184f19b2d7132ba99eb0b370b55598" dependencies: - broccoli-lint-eslint "^4.1.0" + broccoli-lint-eslint "^4.2.1" ember-cli-version-checker "^2.1.0" rsvp "^4.6.1" walk-sync "^0.3.0" @@ -2341,7 +2210,7 @@ ember-cli-lodash-subset@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-2.0.1.tgz#20cb68a790fe0fde2488ddfd8efbb7df6fe766f2" -ember-cli-node-assets@^0.1.1, ember-cli-node-assets@^0.1.4: +ember-cli-node-assets@^0.1.4: version "0.1.6" resolved "https://registry.yarnpkg.com/ember-cli-node-assets/-/ember-cli-node-assets-0.1.6.tgz#6488a2949048c801ad6d9e33753c7bce32fc1146" dependencies: @@ -2376,11 +2245,11 @@ ember-cli-preprocess-registry@^3.1.0: silent-error "^1.0.0" ember-cli-qunit@^4.1.0-beta.2: - version "4.1.0-beta.2" - resolved "https://registry.yarnpkg.com/ember-cli-qunit/-/ember-cli-qunit-4.1.0-beta.2.tgz#712b91b3f494cc9641486bb5ee7211d87357e6af" + version "4.3.0" + resolved "https://registry.yarnpkg.com/ember-cli-qunit/-/ember-cli-qunit-4.3.0.tgz#1ce65dea553d18f5fd9b6b08d3d5128afb2ab94e" dependencies: ember-cli-babel "^6.8.1" - ember-qunit "^3.0.0-beta.2" + ember-qunit "^3.3.0" ember-cli-release@^0.2.9: version "0.2.9" @@ -2397,11 +2266,13 @@ ember-cli-release@^0.2.9: silent-error "^1.0.0" ember-cli-shims@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ember-cli-shims/-/ember-cli-shims-1.1.0.tgz#0e3b8a048be865b4f81cc81d397ff1eeb13f75b6" + version "1.2.0" + resolved "https://registry.yarnpkg.com/ember-cli-shims/-/ember-cli-shims-1.2.0.tgz#0f53aff0aab80b5f29da3a9731bac56169dd941f" dependencies: - ember-cli-babel "^6.0.0-beta.7" - ember-cli-version-checker "^1.2.0" + broccoli-file-creator "^1.1.1" + broccoli-merge-trees "^2.0.0" + ember-cli-version-checker "^2.0.0" + ember-rfc176-data "^0.3.1" silent-error "^1.0.1" ember-cli-sri@^2.1.0: @@ -2439,7 +2310,7 @@ ember-cli-valid-component-name@^1.0.0: dependencies: silent-error "^1.0.0" -ember-cli-version-checker@^1.0.2, ember-cli-version-checker@^1.1.4, ember-cli-version-checker@^1.1.6, ember-cli-version-checker@^1.1.7, ember-cli-version-checker@^1.2.0, ember-cli-version-checker@^1.3.1: +ember-cli-version-checker@^1.1.4, ember-cli-version-checker@^1.1.7, ember-cli-version-checker@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz#0bc2d134c830142da64bf9627a0eded10b61ae72" dependencies: @@ -2597,15 +2468,15 @@ ember-fastboot-addon-tests@^0.4.0: rsvp "^3.3.1" ember-get-config@^0.2.2: - version "0.2.3" - resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.2.3.tgz#546e77c991792fffde2f6757a5edb0c5dd122c0e" + version "0.2.4" + resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.2.4.tgz#118492a2a03d73e46004ed777928942021fe1ecd" dependencies: broccoli-file-creator "^1.1.1" ember-cli-babel "^6.3.0" ember-inflector@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-2.0.1.tgz#e9ac469ffa17992a43276bb1c9b8d87992b10d37" + version "2.1.0" + resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-2.1.0.tgz#afcb92d022a4eab58f08ff4578eafc3a1de2d09b" dependencies: ember-cli-babel "^6.0.0" @@ -2616,27 +2487,27 @@ ember-load-initializers@^1.0.0: ember-cli-babel "^6.0.0-beta.7" ember-lodash@^4.17.3: - version "4.17.5" - resolved "https://registry.yarnpkg.com/ember-lodash/-/ember-lodash-4.17.5.tgz#bda557402facae144567d1ef530b3de7c38bcde1" + version "4.18.0" + resolved "https://registry.yarnpkg.com/ember-lodash/-/ember-lodash-4.18.0.tgz#45de700d6a4f68f1cd62888d90b50aa6477b9a83" dependencies: broccoli-debug "^0.6.1" - broccoli-funnel "^1.1.0" + broccoli-funnel "^2.0.1" broccoli-merge-trees "^2.0.0" broccoli-string-replace "^0.1.1" - ember-cli-babel "^6.4.1" + ember-cli-babel "^6.10.0" lodash-es "^4.17.4" -ember-qunit@^3.0.0-beta.2: - version "3.0.0-beta.4" - resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-3.0.0-beta.4.tgz#ae1b1b11e444f6c6155853410384e738ae904464" +ember-qunit@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-3.3.0.tgz#98c0c8d9473808fa7be48808989255cbfa70e760" dependencies: + "@ember/test-helpers" "^0.7.9" broccoli-funnel "^2.0.1" broccoli-merge-trees "^2.0.0" common-tags "^1.4.0" ember-cli-babel "^6.3.0" ember-cli-test-loader "^2.2.0" - ember-test-helpers "^0.7.0-beta.7" - qunitjs "^2.4.0" + qunit "^2.5.0" ember-resolver@^4.0.0: version "4.5.0" @@ -2650,9 +2521,9 @@ ember-resolver@^4.0.0: ember-cli-version-checker "^2.0.0" resolve "^1.3.3" -ember-rfc176-data@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.0.tgz#6aee728cb521c5f80710990965027b9c320f6f08" +ember-rfc176-data@^0.3.0, ember-rfc176-data@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.1.tgz#6a5a4b8b82ec3af34f3010965fa96b936ca94519" ember-router-generator@^1.0.0, ember-router-generator@^1.2.2, ember-router-generator@^1.2.3: version "1.2.3" @@ -2661,28 +2532,16 @@ ember-router-generator@^1.0.0, ember-router-generator@^1.2.2, ember-router-gener recast "^0.11.3" ember-runtime-enumerable-includes-polyfill@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ember-runtime-enumerable-includes-polyfill/-/ember-runtime-enumerable-includes-polyfill-2.0.0.tgz#6e9ba118bc909d1d7762de1b03a550d8955308a9" - dependencies: - ember-cli-babel "^6.0.0" - ember-cli-version-checker "^1.1.6" - -ember-sinon@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/ember-sinon/-/ember-sinon-0.5.1.tgz#9a284a329a8db64cb6fd808b2cff4638bfc28d39" + version "2.1.0" + resolved "https://registry.yarnpkg.com/ember-runtime-enumerable-includes-polyfill/-/ember-runtime-enumerable-includes-polyfill-2.1.0.tgz#dc6d4a028471e4acc350dfd2a149874fb20913f5" dependencies: - ember-cli-babel "^5.1.6" - ember-cli-node-assets "^0.1.1" - sinon "^1.17.4" + ember-cli-babel "^6.9.0" + ember-cli-version-checker "^2.1.0" ember-source@~2.16.0: - version "2.16.0" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-2.16.0.tgz#2becd7966278fe453046b91178ede665c2cf241a" + version "2.16.2" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-2.16.2.tgz#ebc29ce36dec3ecc80f6b1b02218d63ca5041088" dependencies: - "@glimmer/compiler" "^0.25.3" - "@glimmer/node" "^0.25.3" - "@glimmer/reference" "^0.25.3" - "@glimmer/runtime" "^0.25.3" broccoli-funnel "^1.2.0" broccoli-merge-trees "^2.0.0" ember-cli-get-component-path-option "^1.0.0" @@ -2694,23 +2553,14 @@ ember-source@~2.16.0: ember-cli-valid-component-name "^1.0.0" ember-cli-version-checker "^1.3.1" ember-router-generator "^1.2.3" + fs-extra "^4.0.1" inflection "^1.12.0" jquery "^3.2.1" resolve "^1.3.3" - rsvp "^3.6.1" - simple-dom "^0.3.0" - simple-html-tokenizer "^0.4.1" -ember-test-helpers@^0.7.0-beta.7: - version "0.7.0-beta.8" - resolved "https://registry.yarnpkg.com/ember-test-helpers/-/ember-test-helpers-0.7.0-beta.8.tgz#9b5935a2fa667ac2d9191dd576a2435fcd0f6e10" - dependencies: - broccoli-funnel "^2.0.1" - ember-cli-babel "^6.8.1" - -ember-try-config@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ember-try-config/-/ember-try-config-2.1.0.tgz#e0e156229a542346a58ee6f6ad605104c98edfe0" +ember-try-config@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ember-try-config/-/ember-try-config-2.2.0.tgz#6be0af6c71949813e02ac793564fddbf8336b807" dependencies: lodash "^4.6.1" node-fetch "^1.3.3" @@ -2718,15 +2568,14 @@ ember-try-config@^2.0.1: semver "^5.1.0" ember-try@^0.2.15: - version "0.2.17" - resolved "https://registry.yarnpkg.com/ember-try/-/ember-try-0.2.17.tgz#0ffff687630291b4cf94f5b196e728c1a92d8aec" + version "0.2.23" + resolved "https://registry.yarnpkg.com/ember-try/-/ember-try-0.2.23.tgz#39b57141b4907541d0ac8b503d211e6946b08718" dependencies: chalk "^1.0.0" cli-table2 "^0.2.0" core-object "^1.1.0" debug "^2.2.0" - ember-cli-version-checker "^1.1.6" - ember-try-config "^2.0.1" + ember-try-config "^2.2.0" extend "^3.0.0" fs-extra "^0.26.0" promise-map-series "^0.2.1" @@ -2736,8 +2585,8 @@ ember-try@^0.2.15: semver "^5.1.0" encodeurl@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" encoding@^0.1.11: version "0.1.12" @@ -2792,6 +2641,12 @@ entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" +error-ex@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + error@^7.0.0: version "7.0.2" resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02" @@ -2831,32 +2686,36 @@ eslint-scope@^3.7.1: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + eslint@^4.0.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.9.0.tgz#76879d274068261b191fe0f2f56c74c2f4208e8b" + version "4.17.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.17.0.tgz#dc24bb51ede48df629be7031c71d9dc0ee4f3ddf" dependencies: - ajv "^5.2.0" + ajv "^5.3.0" babel-code-frame "^6.22.0" chalk "^2.1.0" concat-stream "^1.6.0" cross-spawn "^5.1.0" - debug "^3.0.1" - doctrine "^2.0.0" + debug "^3.1.0" + doctrine "^2.1.0" eslint-scope "^3.7.1" - espree "^3.5.1" + eslint-visitor-keys "^1.0.0" + espree "^3.5.2" esquery "^1.0.0" - estraverse "^4.2.0" esutils "^2.0.2" file-entry-cache "^2.0.0" functional-red-black-tree "^1.0.1" glob "^7.1.2" - globals "^9.17.0" + globals "^11.0.1" ignore "^3.3.3" imurmurhash "^0.1.4" inquirer "^3.0.6" is-resolvable "^1.0.0" js-yaml "^3.9.1" - json-stable-stringify "^1.0.1" + json-stable-stringify-without-jsonify "^1.0.1" levn "^0.3.0" lodash "^4.17.4" minimatch "^3.0.2" @@ -2873,21 +2732,13 @@ eslint@^4.0.0: table "^4.0.1" text-table "~0.2.0" -espree@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.1.tgz#0c988b8ab46db53100a1954ae4ba995ddd27d87e" +espree@^3.5.2: + version "3.5.3" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.3.tgz#931e0af64e7fbbed26b050a29daad1fc64799fa6" dependencies: - acorn "^5.1.1" + acorn "^5.4.0" acorn-jsx "^3.0.0" -esprima-fb@~15001.1001.0-dev-harmony-fb: - version "15001.1001.0-dev-harmony-fb" - resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz#43beb57ec26e8cf237d3dd8b33e42533577f2659" - -esprima@^2.6.0: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - esprima@^3.1.3, esprima@~3.1.0: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" @@ -2917,7 +2768,7 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" -esutils@^2.0.0, esutils@^2.0.2: +esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -2933,6 +2784,14 @@ events-to-array@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/events-to-array/-/events-to-array-1.1.2.tgz#2d41f563e1fe400ed4962fe1a4d5c6a7539df7f6" +exec-file-sync@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/exec-file-sync/-/exec-file-sync-2.0.2.tgz#58d441db46e40de6d1f30de5be022785bd89e328" + dependencies: + is-obj "^1.0.0" + object-assign "^4.0.1" + spawn-sync "^1.0.11" + exec-sh@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" @@ -2963,6 +2822,10 @@ exists-sync@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.4.tgz#9744c2c428cc03b01060db454d4b12f0ef3c8879" +exit-hook@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -2973,6 +2836,18 @@ expand-brackets@^0.1.4: dependencies: is-posix-bracket "^0.1.0" +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" @@ -2985,8 +2860,14 @@ expand-tilde@^1.2.2: dependencies: os-homedir "^1.0.1" -express@^4.10.7, express@^4.12.3: - version "4.16.2" +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + dependencies: + homedir-polyfill "^1.0.1" + +express@^4.10.7, express@^4.12.3: + version "4.16.2" resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" dependencies: accepts "~1.3.4" @@ -3020,16 +2901,37 @@ express@^4.10.7, express@^4.12.3: utils-merge "1.0.1" vary "~1.1.2" +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" +external-editor@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-1.1.1.tgz#12d7b0db850f7ff7e7081baf4005700060c4600b" + dependencies: + extend "^3.0.0" + spawn-sync "^1.0.15" + tmp "^0.0.29" + external-editor@^2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.5.tgz#52c249a3981b9ba187c7cacf5beb50bf1d91a6bc" + version "2.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" dependencies: + chardet "^0.4.0" iconv-lite "^0.4.17" - jschardet "^1.4.2" tmp "^0.0.33" extglob@^0.3.1: @@ -3038,10 +2940,27 @@ extglob@^0.3.1: dependencies: is-extglob "^1.0.0" -extsprintf@1.3.0, extsprintf@^1.2.0: +extglob@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + fake-xml-http-request@^1.4.0, fake-xml-http-request@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-1.6.0.tgz#bd0ac79ae3e2660098282048a12c730a6f64d550" @@ -3054,6 +2973,10 @@ fast-deep-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" @@ -3108,8 +3031,8 @@ filename-regex@^2.0.0: resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" filesize@^3.1.3: - version "3.5.10" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.10.tgz#fc8fa23ddb4ef9e5e0ab6e1e64f679a24a56761f" + version "3.6.0" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.0.tgz#22d079615624bb6fd3c04026120628a41b3f4efa" fill-range@^2.1.0: version "2.2.3" @@ -3121,6 +3044,15 @@ fill-range@^2.1.0: repeat-element "^1.1.2" repeat-string "^1.5.2" +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + finalhandler@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" @@ -3137,13 +3069,29 @@ find-index@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-index/-/find-index-1.1.0.tgz#53007c79cd30040d6816d79458e8837d5c5705ef" +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" dependencies: locate-path "^2.0.0" -findup-sync@0.4.3, findup-sync@^0.4.2: +findup-sync@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" + dependencies: + detect-file "^1.0.0" + is-glob "^3.1.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +findup-sync@^0.4.2: version "0.4.3" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" dependencies: @@ -3180,7 +3128,7 @@ flat-cache@^1.2.1: graceful-fs "^4.1.2" write "^0.2.1" -for-in@^1.0.1: +for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -3210,16 +3158,16 @@ form-data@~2.3.1: combined-stream "^1.0.5" mime-types "^2.1.12" -formatio@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.1.1.tgz#5ed3ccd636551097383465d996199100e86161e9" - dependencies: - samsam "~1.1" - forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + dependencies: + map-cache "^0.2.2" + fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -3280,9 +3228,9 @@ fs-extra@^3.0.0: jsonfile "^3.0.0" universalify "^0.1.0" -fs-extra@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.2.tgz#f91704c53d1b461f893452b0c307d9997647ab6b" +fs-extra@^4.0.0, fs-extra@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" @@ -3297,13 +3245,9 @@ fs-promise@^2.0.0: mz "^2.6.0" thenify-all "^1.6.0" -fs-readdir-recursive@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz#315b4fb8c1ca5b8c47defef319d073dad3568059" - fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6: - version "0.5.6" - resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.6.tgz#342665749e8dca406800b672268c8f5073f3e623" + version "0.5.7" + resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.7.tgz#315e2b098d5fe7f622880ac965b1b051868ac871" dependencies: heimdalljs-logger "^0.1.7" object-assign "^4.1.0" @@ -3315,11 +3259,11 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" fsevents@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" + version "1.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" dependencies: nan "^2.3.0" - node-pre-gyp "^0.6.36" + node-pre-gyp "^0.6.39" fstream-ignore@^1.0.5: version "1.0.5" @@ -3371,6 +3315,10 @@ get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -3421,7 +3369,7 @@ glob@7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^5.0.10, glob@^5.0.15: +glob@^5.0.10: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" dependencies: @@ -3449,6 +3397,14 @@ global-modules@^0.2.3: global-prefix "^0.1.4" is-windows "^0.2.0" +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + global-prefix@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" @@ -3458,11 +3414,21 @@ global-prefix@^0.1.4: is-windows "^0.2.0" which "^1.2.12" -globals@^6.4.0: - version "6.4.1" - resolved "https://registry.yarnpkg.com/globals/-/globals-6.4.1.tgz#8498032b3b6d1cc81eebc5f79690d8fe29fabf4f" +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +globals@^11.0.1: + version "11.3.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.3.0.tgz#e04fdb7b9796d8adac9c8f64c14837b2313378b0" -globals@^9.17.0, globals@^9.18.0: +globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -3477,7 +3443,7 @@ globby@^5.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.4, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -3493,9 +3459,9 @@ growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" -handlebars@^4.0.4, handlebars@^4.0.6: - version "4.0.10" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f" +handlebars@^4.0.4: + version "4.0.11" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" dependencies: async "^1.4.0" optimist "^0.6.1" @@ -3565,9 +3531,36 @@ has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + hash-for-dep@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.2.1.tgz#6bb45822342af46cf87bf91dcdcaeb6f14103f80" + version "1.2.3" + resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.2.3.tgz#5ec69fca32c23523972d52acb5bb65ffc3664cab" dependencies: broccoli-kitchen-sink-helpers "^0.3.1" heimdalljs "^0.2.3" @@ -3604,8 +3597,8 @@ heimdalljs-fs-monitor@^0.1.0: heimdalljs-logger "^0.1.7" heimdalljs-graph@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/heimdalljs-graph/-/heimdalljs-graph-0.3.3.tgz#ea801dbba659c8d522fe1cb83b2d605726e4918f" + version "0.3.4" + resolved "https://registry.yarnpkg.com/heimdalljs-graph/-/heimdalljs-graph-0.3.4.tgz#0bd75797beeaa20b0ed59017aed3b2d95312acee" heimdalljs-logger@^0.1.7: version "0.1.9" @@ -3634,13 +3627,6 @@ hoek@4.x.x: version "4.2.0" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" -home-or-tmp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-1.0.0.tgz#4b9f1e40800c3e50c6c27f781676afcce71f3985" - dependencies: - os-tmpdir "^1.0.1" - user-home "^1.1.1" - home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" @@ -3648,19 +3634,19 @@ home-or-tmp@^2.0.0: os-homedir "^1.0.0" os-tmpdir "^1.0.1" -homedir-polyfill@^1.0.0: +homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" dependencies: parse-passwd "^1.0.0" -hosted-git-info@^2.1.5: +hosted-git-info@^2.1.4, hosted-git-info@^2.1.5: version "2.5.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" html-encoding-sniffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz#79bf7a785ea495fe66165e734153f363ff5437da" + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" dependencies: whatwg-encoding "^1.0.1" @@ -3674,8 +3660,8 @@ http-errors@1.6.2, http-errors@~1.6.2: statuses ">= 1.3.1 < 2" http-parser-js@>=0.4.0: - version "0.4.9" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.9.tgz#ea1a04fb64adff0242e9974f297dd4c3cad271e1" + version "0.4.10" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" http-proxy@^1.13.1, http-proxy@^1.9.0: version "1.16.2" @@ -3700,22 +3686,24 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -iconv-lite@0.4.13: - version "0.4.13" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" - -iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@^0.4.5, iconv-lite@~0.4.13: +iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@~0.4.13: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" ignore@^3.3.3: - version "3.3.5" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.5.tgz#c4e715455f6073a8d7e5dae72d2fc9d71663dba6" + version "3.3.7" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" + indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" @@ -3735,13 +3723,9 @@ inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, i version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - ini@^1.3.4, ini@~1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" inline-source-map-comment@^1.0.5: version "1.0.5" @@ -3753,7 +3737,26 @@ inline-source-map-comment@^1.0.5: sum-up "^1.0.1" xtend "^4.0.0" -inquirer@^3.0.6, inquirer@^3.2.1: +inquirer@^2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-2.0.0.tgz#e1351687b90d150ca403ceaa3cefb1e3065bef4b" + dependencies: + ansi-escapes "^1.1.0" + chalk "^1.0.0" + cli-cursor "^1.0.1" + cli-width "^2.0.0" + external-editor "^1.1.0" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.6" + pinkie-promise "^2.0.0" + run-async "^2.2.0" + rx "^4.1.0" + string-width "^2.0.0" + strip-ansi "^3.0.0" + through "^2.3.6" + +inquirer@^3.0.6: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" dependencies: @@ -3778,14 +3781,26 @@ invariant@^2.2.2: dependencies: loose-envify "^1.0.0" -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - ipaddr.js@1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -3793,8 +3808,42 @@ is-binary-path@^1.0.0: binary-extensions "^1.0.0" is-buffer@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" is-dotfile@^1.0.0: version "1.0.3" @@ -3806,14 +3855,24 @@ is-equal-shallow@^0.1.3: dependencies: is-primitive "^2.0.0" -is-extendable@^0.1.1: +is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + dependencies: + is-plain-object "^2.0.4" + is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" +is-extglob@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + is-finite@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" @@ -3840,11 +3899,11 @@ is-glob@^2.0.0, is-glob@^2.0.1: dependencies: is-extglob "^1.0.0" -is-integer@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-integer/-/is-integer-1.0.7.tgz#6bde81aacddf78b659b6629d629cadc51a886d5c" +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" dependencies: - is-finite "^1.0.0" + is-extglob "^2.1.0" is-number@^2.1.0: version "2.1.0" @@ -3862,6 +3921,12 @@ is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" +is-odd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-1.0.0.tgz#3b8a932eb028b3775c39bb09e91767accdb69088" + dependencies: + is-number "^3.0.0" + is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" @@ -3873,11 +3938,17 @@ is-path-in-cwd@^1.0.0: is-path-inside "^1.0.0" is-path-inside@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" dependencies: path-is-inside "^1.0.1" +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + dependencies: + isobject "^3.0.1" + is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" @@ -3891,10 +3962,8 @@ is-promise@^2.1.0: resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" is-resolvable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" - dependencies: - tryit "^1.0.1" + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" @@ -3910,15 +3979,23 @@ is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + is-windows@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" +is-windows@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.1.tgz#310db70f742d259a16a369202b51af84233310d9" + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: +isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -3936,6 +4013,10 @@ isobject@^2.0.0: dependencies: isarray "1.0.0" +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -3949,16 +4030,12 @@ istextorbinary@2.1.0: textextensions "1 || 2" jquery@^3.1.0, jquery@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.2.1.tgz#5c4d9de652af6cd0a770154a631bba12b015c787" - -js-reporters@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/js-reporters/-/js-reporters-1.2.0.tgz#7cf2cb698196684790350d0c4ca07f4aed9ec17e" + version "3.3.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" -js-tokens@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-1.0.1.tgz#cc435a5c8b94ad15acb7983140fc80182c89aeae" +js-reporters@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/js-reporters/-/js-reporters-1.2.1.tgz#f88c608e324a3373a95bcc45ad305e5c979c459b" js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" @@ -3975,10 +4052,6 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" -jschardet@^1.4.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.5.1.tgz#c519f629f86b3a5bedba58a88d311309eec097f9" - jsdom@^9.5.0: version "9.12.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" @@ -4027,6 +4100,10 @@ json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" @@ -4041,10 +4118,6 @@ json3@3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" -json5@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d" - json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -4080,7 +4153,7 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -kind-of@^3.0.2: +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" dependencies: @@ -4092,6 +4165,14 @@ kind-of@^4.0.0: dependencies: is-buffer "^1.1.5" +kind-of@^5.0.0, kind-of@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" @@ -4102,11 +4183,11 @@ lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" +lazy-cache@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" dependencies: - invert-kv "^1.0.0" + set-getter "^0.1.0" leek@0.0.24: version "0.0.24" @@ -4116,10 +4197,6 @@ leek@0.0.24: lodash.assign "^3.2.0" rsvp "^3.0.21" -leven@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/leven/-/leven-1.0.2.tgz#9144b6eebca5f1d0680169f1a6770dcea60b75c3" - levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -4133,9 +4210,19 @@ linkify-it@^2.0.0: dependencies: uc.micro "^1.0.1" -livereload-js@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.2.2.tgz#6c87257e648ab475bc24ea257457edcc1f8d0bc2" +livereload-js@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.3.0.tgz#c3ab22e8aaf5bf3505d80d098cbad67726548c9a" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" loader.js@^4.2.3: version "4.6.0" @@ -4149,8 +4236,8 @@ locate-path@^2.0.0: path-exists "^3.0.0" lodash-es@^4.17.4: - version "4.17.4" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.4.tgz#dcc1d7552e150a0640073ba9cb31d70f032950e7" + version "4.17.5" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.5.tgz#9fc6e737b1c4d151d8f9cae2247305d552ce748f" lodash._baseassign@^3.0.0: version "3.2.0" @@ -4412,8 +4499,8 @@ lodash.keys@~2.3.0: lodash.isobject "~2.3.0" lodash.merge@^4.3.0, lodash.merge@^4.4.0, lodash.merge@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5" + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" lodash.noop@~2.3.0: version "2.3.0" @@ -4479,23 +4566,19 @@ lodash.values@~2.3.0: dependencies: lodash.keys "~2.3.0" -lodash@^3.10.0, lodash@^3.10.1, lodash@^3.9.3: +lodash@^3.10.0, lodash@^3.10.1: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1: - version "4.17.4" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + version "4.17.5" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" -log-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" +log-symbols@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" dependencies: - chalk "^1.0.0" - -lolex@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31" + chalk "^2.0.1" longest@^1.0.1: version "1.0.1" @@ -4507,6 +4590,13 @@ loose-envify@^1.0.0: dependencies: js-tokens "^3.0.0" +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + lru-cache@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" @@ -4519,10 +4609,10 @@ make-array@^0.1.2: resolved "https://registry.yarnpkg.com/make-array/-/make-array-0.1.2.tgz#335e36ebb0c5a43154d21213a1ecaeae2a1bb3ef" make-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978" + version "1.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51" dependencies: - pify "^2.3.0" + pify "^3.0.0" makeerror@1.0.x: version "1.0.11" @@ -4530,6 +4620,20 @@ makeerror@1.0.x: dependencies: tmpl "1.0.x" +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + dependencies: + object-visit "^1.0.0" + markdown-it-terminal@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/markdown-it-terminal/-/markdown-it-terminal-0.1.0.tgz#545abd8dd01c3d62353bfcea71db580b51d22bd9" @@ -4575,11 +4679,26 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" memory-streams@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/memory-streams/-/memory-streams-0.1.2.tgz#273ff777ab60fec599b116355255282cca2c50c2" + version "0.1.3" + resolved "https://registry.yarnpkg.com/memory-streams/-/memory-streams-0.1.3.tgz#d9b0017b4b87f1d92f55f2745c9caacb1dc93ceb" dependencies: readable-stream "~1.0.2" +meow@^3.4.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -4621,7 +4740,29 @@ micromatch@^2.1.5, micromatch@^2.3.7: parse-glob "^3.0.4" regex-cache "^0.4.2" -"mime-db@>= 1.29.0 < 2", mime-db@~1.30.0: +micromatch@^3.0.4: + version "3.1.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.5.tgz#d05e168c206472dfbca985bfef4f57797b4cd4ba" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.0" + define-property "^1.0.0" + extend-shallow "^2.0.1" + extglob "^2.0.2" + fragment-cache "^0.2.1" + kind-of "^6.0.0" + nanomatch "^1.2.5" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +"mime-db@>= 1.30.0 < 2": + version "1.32.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.32.0.tgz#485b3848b01a3cda5f968b4882c0771e58e09414" + +mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" @@ -4631,13 +4772,17 @@ mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.16, dependencies: mime-db "~1.30.0" -mime@1.4.1, mime@^1.2.11: +mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" +mime@^1.2.11: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + mimic-fn@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" "minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" @@ -4645,17 +4790,11 @@ mimic-fn@^1.0.0: dependencies: brace-expansion "^1.1.7" -minimatch@^2.0.3: - version "2.0.10" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" - dependencies: - brace-expansion "^1.0.0" - minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0: +minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -4663,6 +4802,13 @@ minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" +mixin-deep@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.0.tgz#47a8732ba97799457c8c1eca28f95132d7e8150a" + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" @@ -4697,8 +4843,8 @@ moment-timezone@^0.3.0: moment ">= 2.6.0" "moment@>= 2.6.0": - version "2.19.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.19.1.tgz#56da1a2d1cbf01d38b7e1afc31c10bcfa1929167" + version "2.20.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.20.1.tgz#d6eb1a46cbcc14a2b2f9434112c1ff8907f313fd" morgan@^1.8.1: version "1.9.0" @@ -4730,6 +4876,10 @@ mustache@^2.2.1: version "2.3.0" resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.0.tgz#4028f7778b17708a489930a6e52ac3bca0da41d0" +mute-stream@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" + mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -4743,8 +4893,24 @@ mz@^2.6.0: thenify-all "^1.0.0" nan@^2.3.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" + version "2.8.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" + +nanomatch@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.7.tgz#53cd4aa109ff68b7f869591fdc9d10daeeea3e79" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^1.0.0" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + is-odd "^1.0.0" + kind-of "^5.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" natural-compare@^1.4.0: version "1.4.0" @@ -4770,18 +4936,19 @@ node-modules-path@^1.0.0: resolved "https://registry.yarnpkg.com/node-modules-path/-/node-modules-path-1.0.1.tgz#40096b08ce7ad0ea14680863af449c7c75a5d1c8" node-notifier@^5.0.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.1.2.tgz#2fa9e12605fa10009d44549d6fcd8a63dde0e4ff" + version "5.2.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" dependencies: growly "^1.3.0" - semver "^5.3.0" - shellwords "^0.1.0" - which "^1.2.12" + semver "^5.4.1" + shellwords "^0.1.1" + which "^1.3.0" -node-pre-gyp@^0.6.36: - version "0.6.38" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.38.tgz#e92a20f83416415bb4086f6d1fb78b3da73d113d" +node-pre-gyp@^0.6.39: + version "0.6.39" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" dependencies: + detect-libc "^1.0.2" hawk "3.1.3" mkdirp "^0.5.1" nopt "^4.0.1" @@ -4806,6 +4973,15 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + normalize-path@^2.0.0, normalize-path@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" @@ -4862,6 +5038,20 @@ object-component@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + dependencies: + isobject "^3.0.0" + object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" @@ -4869,6 +5059,12 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + dependencies: + isobject "^3.0.1" + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -4885,6 +5081,10 @@ once@^1.3.0, once@^1.3.3: dependencies: wrappy "1" +onetime@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" @@ -4914,23 +5114,21 @@ options@>=0.0.5: resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" ora@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-1.3.0.tgz#80078dd2b92a934af66a3ad72a5b910694ede51a" + version "1.4.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-1.4.0.tgz#884458215b3a5d4097592285f93321bb7a79e2e5" dependencies: - chalk "^1.1.1" + chalk "^2.1.0" cli-cursor "^2.1.0" - cli-spinners "^1.0.0" - log-symbols "^1.0.2" + cli-spinners "^1.0.1" + log-symbols "^2.1.0" os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - dependencies: - lcid "^1.0.0" +os-shim@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" @@ -4943,21 +5141,15 @@ osenv@^0.1.3, osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -output-file-sync@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" - dependencies: - graceful-fs "^4.1.4" - mkdirp "^0.5.1" - object-assign "^4.1.0" - p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" p-limit@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" + dependencies: + p-try "^1.0.0" p-locate@^2.0.0: version "2.0.0" @@ -4965,6 +5157,10 @@ p-locate@^2.0.0: dependencies: p-limit "^1.1.0" +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" @@ -4974,6 +5170,12 @@ parse-glob@^3.0.4: is-extglob "^1.0.0" is-glob "^2.0.0" +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" @@ -5004,9 +5206,21 @@ parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" -path-exists@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-1.0.0.tgz#d5a8998eb71ef37a74c34eb0d9eba6e878eea081" +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + +passwd-user@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/passwd-user/-/passwd-user-1.2.1.tgz#a01a5dc639ef007dc56364b8178569080ad3a7b8" + dependencies: + exec-file-sync "^2.0.0" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" path-exists@^3.0.0: version "3.0.0" @@ -5036,6 +5250,14 @@ path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + pathval@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" @@ -5048,10 +5270,14 @@ performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" -pify@^2.0.0, pify@^2.3.0: +pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" @@ -5074,6 +5300,10 @@ portfinder@^1.0.7: debug "^2.2.0" mkdirp "0.5.x" +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -5132,10 +5362,6 @@ punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" -q@^1.1.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" - qs@6.5.1, qs@^6.4.0, qs@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" @@ -5152,17 +5378,18 @@ quick-temp@^0.1.0, quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quic rimraf "^2.5.4" underscore.string "~3.3.4" -qunitjs@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/qunitjs/-/qunitjs-2.4.0.tgz#58f3a81e846687f2e7f637c5bedc9c267f887261" +qunit@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.5.0.tgz#64cbe30a1193ef02edc5b278efcdf1d0bae96b22" dependencies: - chokidar "1.6.1" - commander "2.9.0" + chokidar "1.7.0" + commander "2.12.2" exists-stat "1.0.0" - findup-sync "0.4.3" - js-reporters "1.2.0" - resolve "1.3.2" - walk-sync "0.3.1" + findup-sync "2.0.0" + js-reporters "1.2.1" + resolve "1.5.0" + shelljs "^0.2.6" + walk-sync "0.3.2" randomatic@^1.1.3: version "1.1.7" @@ -5192,14 +5419,29 @@ raw-body@~1.1.0: string_decoder "0.10" rc@^1.1.7: - version "1.2.2" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077" + version "1.2.5" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd" dependencies: deep-extend "~0.4.0" ini "~1.3.0" minimist "^1.2.0" strip-json-comments "~2.0.1" +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + readable-stream@^2, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" @@ -5230,25 +5472,7 @@ readdirp@^2.0.0: readable-stream "^2.0.2" set-immediate-shim "^1.0.1" -recast@0.10.33: - version "0.10.33" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.33.tgz#942808f7aa016f1fa7142c461d7e5704aaa8d697" - dependencies: - ast-types "0.8.12" - esprima-fb "~15001.1001.0-dev-harmony-fb" - private "~0.1.5" - source-map "~0.5.0" - -recast@^0.10.10: - version "0.10.43" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.43.tgz#b95d50f6d60761a5f6252e15d80678168491ce7f" - dependencies: - ast-types "0.8.15" - esprima-fb "~15001.1001.0-dev-harmony-fb" - private "~0.1.5" - source-map "~0.5.0" - -recast@^0.11.17, recast@^0.11.3: +recast@^0.11.3: version "0.11.23" resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" dependencies: @@ -5257,6 +5481,13 @@ recast@^0.11.17, recast@^0.11.3: private "~0.1.5" source-map "~0.5.0" +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + redeyed@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-1.0.1.tgz#e96c193b40c0816b00aec842698e61185e55498a" @@ -5272,8 +5503,8 @@ regenerator-runtime@^0.10.5: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" regenerator-runtime@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" regenerator-transform@^0.10.0: version "0.10.1" @@ -5283,23 +5514,18 @@ regenerator-transform@^0.10.0: babel-types "^6.19.0" private "^0.1.6" -regenerator@0.8.40: - version "0.8.40" - resolved "https://registry.yarnpkg.com/regenerator/-/regenerator-0.8.40.tgz#a0e457c58ebdbae575c9f8cd75127e93756435d8" - dependencies: - commoner "~0.10.3" - defs "~1.1.0" - esprima-fb "~15001.1001.0-dev-harmony-fb" - private "~0.1.5" - recast "0.10.33" - through "~2.3.8" - regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" dependencies: is-equal-shallow "^0.1.3" +regex-not@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.0.tgz#42f83e39771622df826b02af176525d6a5f157f9" + dependencies: + extend-shallow "^2.0.1" + regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" @@ -5308,16 +5534,6 @@ regexpu-core@^2.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" -regexpu@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/regexpu/-/regexpu-1.3.0.tgz#e534dc991a9e5846050c98de6d7dd4a55c9ea16d" - dependencies: - esprima "^2.6.0" - recast "^0.10.10" - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" @@ -5336,16 +5552,10 @@ repeat-element@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" -repeat-string@^1.5.2: +repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" -repeating@^1.1.0, repeating@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" - dependencies: - is-finite "^1.0.0" - repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" @@ -5428,21 +5638,33 @@ resolve-dir@^0.1.0: expand-tilde "^1.2.2" global-modules "^0.2.3" +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" -resolve@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.2.tgz#1f0442c9e0cbb8136e87b9305f932f46c7f28235" +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + +resolve@1.5.0, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.0, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" dependencies: path-parse "^1.0.5" -resolve@^1.1.2, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.0, resolve@^1.3.3, resolve@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86" +restore-cursor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" dependencies: - path-parse "^1.0.5" + exit-hook "^1.0.0" + onetime "^1.0.0" restore-cursor@^2.0.0: version "2.0.0" @@ -5475,13 +5697,13 @@ route-recognizer@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.3.tgz#1d365e27fa6995e091675f7dc940a8c00353bd29" -rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.2.1, rsvp@^3.3.1, rsvp@^3.3.3, rsvp@^3.5.0, rsvp@^3.6.0, rsvp@^3.6.1: +rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.2.1, rsvp@^3.3.1, rsvp@^3.3.3, rsvp@^3.5.0, rsvp@^3.6.0: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" rsvp@^4.6.1: - version "4.7.0" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.7.0.tgz#dc1b0b1a536f7dec9d2be45e0a12ad4197c9fd96" + version "4.8.1" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.1.tgz#168addb3963222de37ee351b70e3876bdb2ac285" rsvp@~3.0.6: version "3.0.21" @@ -5507,6 +5729,10 @@ rx-lite@*, rx-lite@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" +rx@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -5515,14 +5741,6 @@ safe-json-parse@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" -samsam@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567" - -samsam@~1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.3.tgz#9f5087419b4d091f232571e7fa52e90b0f552621" - sane@^1.1.1, sane@^1.6.0: version "1.7.0" resolved "https://registry.yarnpkg.com/sane/-/sane-1.7.0.tgz#b3579bccb45c94cf20355cc81124990dfd346e30" @@ -5539,14 +5757,14 @@ sax@^1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" +"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.1.1, semver@^5.3.0, semver@^5.4.1: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + semver@^4.3.1: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" -semver@^5.1.0, semver@^5.1.1, semver@^5.3.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" - send@0.16.1: version "0.16.1" resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" @@ -5578,10 +5796,34 @@ set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" +set-getter@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376" + dependencies: + to-object-path "^0.3.0" + set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + setprototypeof@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" @@ -5600,7 +5842,11 @@ shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" -shellwords@^0.1.0: +shelljs@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.2.6.tgz#90492d72ffcc8159976baba62fb0f6884f0c3378" + +shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" @@ -5614,35 +5860,6 @@ silent-error@^1.0.0, silent-error@^1.0.1, silent-error@^1.1.0: dependencies: debug "^2.2.0" -simple-dom@^0.3.0: - version "0.3.2" - resolved "https://registry.yarnpkg.com/simple-dom/-/simple-dom-0.3.2.tgz#0663d10f1556f1500551d518f56e3aba0871371d" - -simple-fmt@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/simple-fmt/-/simple-fmt-0.1.0.tgz#191bf566a59e6530482cb25ab53b4a8dc85c3a6b" - -simple-html-tokenizer@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.3.0.tgz#9b8b5559d80e331a544dd13dd59382e5d0d94411" - -simple-html-tokenizer@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.4.1.tgz#028988bb7fe8b2e6645676d82052587d440b02d3" - -simple-is@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/simple-is/-/simple-is-0.2.0.tgz#2abb75aade39deb5cc815ce10e6191164850baf0" - -sinon@^1.17.4: - version "1.17.7" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.7.tgz#4542a4f49ba0c45c05eb2e9dd9d203e2b8efe0bf" - dependencies: - formatio "1.1.1" - lolex "1.3.2" - samsam "1.1.2" - util ">=0.10.3 <1" - slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" @@ -5653,6 +5870,33 @@ slice-ansi@1.0.0: dependencies: is-fullwidth-code-point "^2.0.0" +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.1.tgz#e12b5487faded3e3dea0ac91e9400bf75b401370" + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^2.0.0" + sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" @@ -5660,8 +5904,8 @@ sntp@1.x.x: hoek "2.x.x" sntp@2.x.x: - version "2.0.2" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.0.2.tgz#5064110f0af85f7cfdb7d6b67a40028ce52b4b2b" + version "2.1.0" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" dependencies: hoek "4.x.x" @@ -5719,11 +5963,15 @@ sort-package-json@^1.4.0: dependencies: sort-object-keys "^1.1.1" -source-map-support@^0.2.10: - version "0.2.10" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.2.10.tgz#ea5a3900a1c1cb25096a0ae8cc5c2b4b10ded3dc" +source-map-resolve@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" dependencies: - source-map "0.1.32" + atob "^2.0.0" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" source-map-support@^0.4.15: version "0.4.18" @@ -5739,19 +5987,13 @@ source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" -source-map@0.1.32: - version "0.1.32" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.32.tgz#c8b6c167797ba4740a8ea33252162ff08591b266" - dependencies: - amdefine ">=0.0.4" - source-map@0.4.x, source-map@^0.4.2, 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.0, source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.1, source-map@~0.5.6: +source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.1, source-map@~0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -5761,6 +6003,10 @@ source-map@~0.1.x: dependencies: amdefine ">=0.0.4" +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + sourcemap-validator@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/sourcemap-validator/-/sourcemap-validator-1.0.6.tgz#abd2f1ecdae6a3c46c2c96c5f256705b2147c9c0" @@ -5774,10 +6020,37 @@ spawn-args@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/spawn-args/-/spawn-args-0.2.0.tgz#fb7d0bd1d70fd4316bd9e3dec389e65f9d6361bb" +spawn-sync@^1.0.11, spawn-sync@^1.0.15: + version "1.0.15" + resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" + dependencies: + concat-stream "^1.4.7" + os-shim "^0.1.2" + spawnback@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/spawnback/-/spawnback-1.0.0.tgz#f73662f7e54d95367eca74d6426c677dd7ea686f" +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + dependencies: + extend-shallow "^3.0.0" + sprintf-js@^1.0.3: version "1.1.1" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c" @@ -5804,11 +6077,18 @@ sshpk@^1.7.0: jsbn "~0.1.0" tweetnacl "~0.14.0" -stable@~0.1.3: - version "0.1.6" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.6.tgz#910f5d2aed7b520c6e777499c1f32e139fdecb10" +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.3.1 < 2": + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" -"statuses@>= 1.3.1 < 2", statuses@~1.3.1: +statuses@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" @@ -5824,7 +6104,7 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.1.0, string-width@^2.1.1: +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" dependencies: @@ -5841,14 +6121,6 @@ string_decoder@~1.0.3: dependencies: safe-buffer "~5.1.0" -stringmap@~0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/stringmap/-/stringmap-0.2.2.tgz#556c137b258f942b8776f5b2ef582aa069d7d1b1" - -stringset@~0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/stringset/-/stringset-0.2.1.tgz#ef259c4e349344377fcd1c913dd2e848c9c042b5" - stringstream@~0.0.4, stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -5871,6 +6143,12 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -5879,6 +6157,12 @@ strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -5908,8 +6192,8 @@ supports-color@^2.0.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" supports-color@^4.0.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" + version "4.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" dependencies: has-flag "^2.0.0" @@ -5942,8 +6226,8 @@ tap-parser@^5.1.0: readable-stream "^2" tar-pack@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" + version "3.4.1" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" dependencies: debug "^2.2.0" fstream "^1.0.10" @@ -6005,8 +6289,8 @@ text-table@~0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" "textextensions@1 || 2": - version "2.1.0" - resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.1.0.tgz#1be0dc2a0dc244d44be8a09af6a85afb93c4dbc3" + version "2.2.0" + resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.2.0.tgz#38ac676151285b658654581987a0ce1a4490d286" thenify-all@^1.0.0, thenify-all@^1.6.0: version "1.6.0" @@ -6020,18 +6304,18 @@ thenify-all@^1.0.0, thenify-all@^1.6.0: dependencies: any-promise "^1.0.0" -through@^2.3.6, through@^2.3.8, through@~2.3.8: +through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" tiny-lr@^1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.0.5.tgz#21f40bf84ebd1f853056680375eef1670c334112" + version "1.1.0" + resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.1.0.tgz#a373bce2a4b58cef9a64433360ba593155f4cd45" dependencies: body "^5.1.0" debug "~2.6.7" faye-websocket "~0.10.0" - livereload-js "^2.2.2" + livereload-js "^2.3.0" object-assign "^4.1.0" qs "^6.4.0" @@ -6041,6 +6325,12 @@ tmp@0.0.28: dependencies: os-tmpdir "~1.0.1" +tmp@^0.0.29: + version "0.0.29" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" + dependencies: + os-tmpdir "~1.0.1" + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -6055,10 +6345,31 @@ to-array@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" -to-fast-properties@^1.0.0, to-fast-properties@^1.0.3: +to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.1.tgz#15358bee4a2c83bd76377ba1dc049d0f18837aae" + dependencies: + define-property "^0.2.5" + extend-shallow "^2.0.1" + regex-not "^1.0.0" + tough-cookie@^2.3.2, tough-cookie@~2.3.0, tough-cookie@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" @@ -6079,21 +6390,13 @@ tree-sync@^1.2.1, tree-sync@^1.2.2: quick-temp "^0.1.5" walk-sync "^0.2.7" -trim-right@^1.0.0, trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" -try-resolve@^1.0.0: +trim-right@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/try-resolve/-/try-resolve-1.0.1.tgz#cfde6fabd72d63e5797cfaab873abbe8e700e912" - -tryit@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" - -tryor@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/tryor/-/tryor-0.1.2.tgz#8145e4ca7caff40acde3ccf946e8b8bb75b4172b" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" tunnel-agent@^0.6.0: version "0.6.0" @@ -6112,8 +6415,8 @@ type-check@~0.3.2: prelude-ls "~1.1.2" type-detect@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.3.tgz#0e3f2670b44099b0b46c284d136a7ef49c74c2ea" + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" type-is@~1.6.15: version "1.6.15" @@ -6127,15 +6430,15 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" uc.micro@^1.0.1, uc.micro@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.3.tgz#7ed50d5e0f9a9fb0a573379259f2a77458d50192" + version "1.0.5" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376" uglify-es@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.1.3.tgz#a21eeb149cb120a1f8302563689e19496550780b" + version "3.3.9" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" dependencies: - commander "~2.11.0" - source-map "~0.5.1" + commander "~2.13.0" + source-map "~0.6.1" uglify-js@^2.6: version "2.8.29" @@ -6169,6 +6472,15 @@ underscore@>=1.8.3: version "1.8.3" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + unique-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" @@ -6183,37 +6495,67 @@ unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + untildify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/untildify/-/untildify-2.1.0.tgz#17eb2807987f76952e9c0485fc311d06a826a2e0" dependencies: os-homedir "^1.0.0" -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + +use@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8" + dependencies: + define-property "^0.2.5" + isobject "^3.0.0" + lazy-cache "^2.0.2" + +user-info@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/user-info/-/user-info-1.0.0.tgz#81c82b7ed63e674c2475667653413b3c76fde239" + dependencies: + os-homedir "^1.0.1" + passwd-user "^1.2.1" + username "^1.0.1" username-sync@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/username-sync/-/username-sync-1.0.1.tgz#1cde87eefcf94b8822984d938ba2b797426dae1f" +username@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/username/-/username-1.0.1.tgz#e1f72295e3e58e06f002c6327ce06897a99cd67f" + dependencies: + meow "^3.4.0" + util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" -"util@>=0.10.3 <1": - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - dependencies: - inherits "2.0.1" - utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" uuid@^3.0.0, uuid@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" + version "3.2.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" + +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" validate-npm-package-name@^3.0.0: version "3.0.0" @@ -6233,9 +6575,9 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -walk-sync@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.1.tgz#558a16aeac8c0db59c028b73c66f397684ece465" +walk-sync@0.3.2, walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.2.tgz#4827280afc42d0e035367c4a4e31eeac0d136f75" dependencies: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" @@ -6247,13 +6589,6 @@ walk-sync@^0.2.5, walk-sync@^0.2.7: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" -walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.2.tgz#4827280afc42d0e035367c4a4e31eeac0d136f75" - dependencies: - ensure-posix-path "^1.0.0" - matcher-collection "^1.0.0" - walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -6280,14 +6615,14 @@ websocket-driver@>=0.5.1: websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.2.tgz#0e18781de629a18308ce1481650f67ffa2693a5d" + version "0.1.3" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" whatwg-encoding@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz#3c6c451a198ee7aec55b1ec61d0920c67801a5f4" + version "1.0.3" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" dependencies: - iconv-lite "0.4.13" + iconv-lite "0.4.19" whatwg-url@^4.3.0: version "4.8.0" @@ -6296,7 +6631,7 @@ whatwg-url@^4.3.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -which@^1.2.12, which@^1.2.9: +which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" dependencies: @@ -6312,10 +6647,6 @@ window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" -window-size@^0.1.2: - version "0.1.4" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" - wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" @@ -6328,7 +6659,7 @@ wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" -workerpool@^2.2.1: +workerpool@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-2.3.0.tgz#86c5cbe946b55e7dc9d12b1936c8801a6e2d744d" dependencies: @@ -6383,10 +6714,6 @@ xtend@^4.0.0, xtend@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" -y18n@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -6407,17 +6734,6 @@ yargs@~3.10.0: decamelize "^1.0.0" window-size "0.1.0" -yargs@~3.27.0: - version "3.27.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.27.0.tgz#21205469316e939131d59f2da0c6d7f98221ea40" - dependencies: - camelcase "^1.2.1" - cliui "^2.1.0" - decamelize "^1.0.0" - os-locale "^1.4.0" - window-size "^0.1.2" - y18n "^3.2.0" - yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" From d5b006cd2957b1fba04efa8ec06d6d9088e57d3f Mon Sep 17 00:00:00 2001 From: Kelly Selden Date: Mon, 12 Feb 2018 16:18:05 -0800 Subject: [PATCH 139/879] match new blueprint This code wasn't matching the new blueprint style. --- blueprints/ember-cli-mirage/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blueprints/ember-cli-mirage/index.js b/blueprints/ember-cli-mirage/index.js index 20c92d1b2..764385ed5 100644 --- a/blueprints/ember-cli-mirage/index.js +++ b/blueprints/ember-cli-mirage/index.js @@ -54,7 +54,7 @@ module.exports = { if (existsSync('tests/helpers/destroy-app.js')) { var shutdownText = ' if (window.server) {\n window.server.shutdown();\n }'; return this.insertIntoFile('tests/helpers/destroy-app.js', shutdownText, { - after: "Ember.run(application, 'destroy');\n" + after: "run(application, 'destroy');\n" }); } else { this.ui.writeLine( From 484ffaf94e89d6a73d6e112447f28f19e516ed26 Mon Sep 17 00:00:00 2001 From: Ben Demboski Date: Wed, 14 Feb 2018 14:37:30 -0800 Subject: [PATCH 140/879] Update to ember-cli 2.18.2 --- .eslintrc.js | 57 +++++++- .npmignore | 8 +- .travis.yml | 6 +- LICENSE.md | 2 +- config/ember-try.js | 9 +- config/environment.js | 15 +- ember-cli-build.js | 3 +- index.js | 7 +- package.json | 13 +- testem.js | 8 +- tests/.eslintrc.js | 14 -- tests/dummy/config/environment.js | 2 +- tests/dummy/config/targets.js | 1 - tests/dummy/public/crossdomain.xml | 15 -- tests/helpers/start-app.js | 1 + tests/test-helper.js | 15 +- yarn.lock | 218 +++++++++++++++++++++-------- 17 files changed, 278 insertions(+), 116 deletions(-) delete mode 100644 tests/.eslintrc.js delete mode 100644 tests/dummy/public/crossdomain.xml diff --git a/.eslintrc.js b/.eslintrc.js index 5ada896ff..42118c150 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -27,5 +27,60 @@ module.exports = { faker: true, server: true, $: true - } + }, + overrides: [ + // node files + { + files: [ + 'index.js', + 'testem.js', + 'ember-cli-build.js', + 'config/**/*.js', + 'tests/dummy/config/**/*.js' + ], + excludedFiles: [ + 'app/**', + 'addon/**', + 'tests/dummy/app/**' + ], + parserOptions: { + sourceType: 'script', + ecmaVersion: 2015 + }, + env: { + browser: false, + node: true + }, + plugins: ['node'], + rules: Object.assign({}, require('eslint-plugin-node').configs.recommended.rules, { + // add your custom rules and overrides for node files here + }) + }, + + // test files + { + files: ['tests/**/*.js'], + excludedFiles: ['tests/dummy/**/*.js'], + env: { + embertest: true + } + }, + + // node test files + { + files: [ + 'fastboot-tests/**/*.js', + 'node-tests/**/*.js' + ], + rules: { + 'prefer-template': 0 + }, + globals: { + require: true, + describe: true, + afterEach: true, + it: true + } + } + ] }; diff --git a/.npmignore b/.npmignore index 563d2f43a..2afeacf66 100644 --- a/.npmignore +++ b/.npmignore @@ -7,13 +7,19 @@ .bowerrc .editorconfig .ember-cli -.gitignore .eslintrc.js +.gitignore .watchmanconfig .travis.yml bower.json ember-cli-build.js testem.js + +# ember-try +.node_modules.ember-try/ +bower.json.ember-try +package.json.ember-try + /.sass-cache /jekyll-tmp *.md diff --git a/.travis.yml b/.travis.yml index 48543f7e0..b77e5ecd9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ node_js: # so that your addon works for all apps - "4" -sudo: true +sudo: false dist: trusty addons: @@ -13,8 +13,6 @@ addons: cache: yarn: true - directories: - - $HOME/.cache # includes bower's cache env: global: @@ -27,6 +25,7 @@ env: - EMBER_TRY_SCENARIO=ember-lts-2.4 - EMBER_TRY_SCENARIO=ember-lts-2.8 - EMBER_TRY_SCENARIO=ember-lts-2.12 + - EMBER_TRY_SCENARIO=ember-lts-2.16 - EMBER_TRY_SCENARIO=ember-release - EMBER_TRY_SCENARIO=ember-beta - EMBER_TRY_SCENARIO=ember-canary @@ -48,6 +47,7 @@ install: - yarn install --no-lockfile --non-interactive script: + - npm run lint:js # Usually, it's ok to finish the test scenario without reverting # to the addon's original dependency state, skipping "cleanup". - node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO --skip-cleanup diff --git a/LICENSE.md b/LICENSE.md index 02000b56e..198f6dacf 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2016 +Copyright (c) 2018 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: diff --git a/config/ember-try.js b/config/ember-try.js index ab3dbde8c..36e6f4caa 100644 --- a/config/ember-try.js +++ b/config/ember-try.js @@ -1,4 +1,3 @@ -/* eslint-env node */ module.exports = { useYarn: true, scenarios: [ @@ -58,6 +57,14 @@ module.exports = { } } }, + { + name: 'ember-lts-2.16', + npm: { + devDependencies: { + 'ember-source': '~2.16.0' + } + } + }, { name: 'ember-release', bower: { diff --git a/config/environment.js b/config/environment.js index f0d875e1a..758941cfa 100644 --- a/config/environment.js +++ b/config/environment.js @@ -1,26 +1,27 @@ -/* eslint-env node */ 'use strict'; var fs = require('fs'); function usingProxy() { - var usingProxyArg = !!process.argv.filter(function (arg) { + var usingProxyArg = !!process.argv.filter(function(arg) { return arg.indexOf('--proxy') === 0 || arg.indexOf('-pr') === 0 || arg.indexOf('-pxy') === 0; }).length; var hasGeneratedProxies = false; - var proxiesDir = process.env.PWD + '/server/proxies'; + var proxiesDir = `${process.env.PWD }/server/proxies`; try { fs.lstatSync(proxiesDir); hasGeneratedProxies = true; - } catch (e) {} + } catch(e) { + // ignore + } return usingProxyArg || hasGeneratedProxies; } module.exports = function(environment, appConfig) { appConfig['ember-cli-mirage'] = appConfig['ember-cli-mirage'] || {}; - appConfig['ember-cli-mirage']['usingProxy'] = usingProxy(); - appConfig['ember-cli-mirage']['useDefaultPassthroughs'] = true; + appConfig['ember-cli-mirage'].usingProxy = usingProxy(); + appConfig['ember-cli-mirage'].useDefaultPassthroughs = true; return {}; -}; \ No newline at end of file +}; diff --git a/ember-cli-build.js b/ember-cli-build.js index ddf6a13fa..0e2af11de 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -1,4 +1,3 @@ -/* eslint-env node */ 'use strict'; const EmberAddon = require('ember-cli/lib/broccoli/ember-addon'); @@ -8,7 +7,7 @@ module.exports = function(defaults) { // Add options here 'ember-cli-babel': { includePolyfill: true - }, + } }); /* diff --git a/index.js b/index.js index 6afb55f7c..386a07d67 100644 --- a/index.js +++ b/index.js @@ -1,4 +1,3 @@ -/* eslint-env node */ 'use strict'; const path = require('path'); const mergeTrees = require('broccoli-merge-trees'); @@ -69,7 +68,7 @@ module.exports = { treeFor(name) { if (!this._shouldIncludeFiles()) { - if(name === 'app' || name === 'addon') { + if (name === 'app' || name === 'addon') { // include a noop initializer even when mirage is excluded from the build let initializerFileName = 'initializers/ember-cli-mirage.js'; let tree = rm(this._super.treeFor.apply(this, arguments), (path) => path !== initializerFileName); @@ -80,7 +79,7 @@ module.exports = { match: /[\S\s]*/m, replacement: 'export default {name: \'ember-cli-mirage\',initialize() {}};' }] - }) ; + }); } return; @@ -152,7 +151,7 @@ function npmAsset(filePath) { import: [filePath], // guard against usage in FastBoot 1.0, where process.env.EMBER_CLI_FASTBOOT is not available _processTree(input) { - return map(input, content => `if (typeof FastBoot !== 'undefined') { ${content} }`) + return map(input, content => `if (typeof FastBoot !== 'undefined') { ${content} }`); } }; }; diff --git a/package.json b/package.json index 8a883b291..4f614fb3b 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,8 @@ }, "scripts": { "build": "ember build", - "start": "ember server", + "lint:js": "eslint ./*.js addon addon-test-support app config lib server test-support tests", + "start": "ember serve", "test": "ember test", "test:all": "ember try:each", "test:fastboot": "ember fastboot:test", @@ -53,16 +54,16 @@ "broccoli-asset-rev": "^2.4.5", "chai": "^4.1.0", "ember-ajax": "^3.0.0", - "ember-cli": "~2.16.2", + "ember-cli": "~2.18.2", "ember-cli-app-version": "^2.0.0", "ember-cli-dependency-checker": "^2.0.0", "ember-cli-eslint": "^4.2.1", "ember-cli-htmlbars": "^2.0.1", "ember-cli-htmlbars-inline-precompile": "^1.0.0", "ember-cli-inject-live-reload": "^1.4.1", - "ember-cli-qunit": "^4.1.0-beta.2", + "ember-cli-qunit": "^4.1.1", "ember-cli-release": "^0.2.9", - "ember-cli-shims": "^1.1.0", + "ember-cli-shims": "^1.2.0", "ember-cli-sri": "^2.1.0", "ember-cli-uglify": "^2.0.0", "ember-data": "~2.13.0", @@ -71,8 +72,10 @@ "ember-fastboot-addon-tests": "^0.4.0", "ember-load-initializers": "^1.0.0", "ember-resolver": "^4.0.0", - "ember-source": "~2.16.0", + "ember-source": "~2.18.0", + "eslint-plugin-ember": "^5.0.0", "eslint-plugin-ember-suave": "^1.0.0", + "eslint-plugin-node": "^5.2.1", "loader.js": "^4.2.3", "mocha": "^3.4.2" }, diff --git a/testem.js b/testem.js index cf870d39c..d1755a4ea 100644 --- a/testem.js +++ b/testem.js @@ -1,4 +1,3 @@ -/* eslint-env node */ module.exports = { test_page: 'tests/index.html?hidepassed', disable_watching: true, @@ -12,11 +11,14 @@ module.exports = { Chrome: { mode: 'ci', args: [ + // --no-sandbox is needed when running Chrome inside a container + process.env.TRAVIS ? '--no-sandbox' : null, + '--disable-gpu', '--headless', - '--remote-debugging-port=9222', + '--remote-debugging-port=0', '--window-size=1440,900' - ] + ].filter(Boolean) } } }; diff --git a/tests/.eslintrc.js b/tests/.eslintrc.js deleted file mode 100644 index 4150467f9..000000000 --- a/tests/.eslintrc.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = { - env: { - embertest: true - }, - rules: { - 'prefer-template': 0 - }, - globals: { - require: true, - describe: true, - afterEach: true, - it: true - } -}; diff --git a/tests/dummy/config/environment.js b/tests/dummy/config/environment.js index 7cecef29f..3d1b2d75c 100644 --- a/tests/dummy/config/environment.js +++ b/tests/dummy/config/environment.js @@ -1,4 +1,3 @@ -/* eslint-env node */ 'use strict'; module.exports = function(environment) { @@ -42,6 +41,7 @@ module.exports = function(environment) { ENV.APP.LOG_VIEW_LOOKUPS = false; ENV.APP.rootElement = '#ember-testing'; + ENV.APP.autoboot = false; } if (environment === 'production') { diff --git a/tests/dummy/config/targets.js b/tests/dummy/config/targets.js index df7664c25..082e68b51 100644 --- a/tests/dummy/config/targets.js +++ b/tests/dummy/config/targets.js @@ -1,4 +1,3 @@ -/* eslint-env node */ module.exports = { browsers: [ 'ie 9', diff --git a/tests/dummy/public/crossdomain.xml b/tests/dummy/public/crossdomain.xml deleted file mode 100644 index 0c16a7a07..000000000 --- a/tests/dummy/public/crossdomain.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - diff --git a/tests/helpers/start-app.js b/tests/helpers/start-app.js index 681aa01a2..99d35dcf4 100644 --- a/tests/helpers/start-app.js +++ b/tests/helpers/start-app.js @@ -5,6 +5,7 @@ import { run } from '@ember/runloop'; export default function startApp(attrs) { let attributes = merge({}, config.APP); + attributes.autoboot = true; attributes = merge(attributes, attrs); // use defaults, but you can override; return run(() => { diff --git a/tests/test-helper.js b/tests/test-helper.js index f219659e5..36050ce1e 100644 --- a/tests/test-helper.js +++ b/tests/test-helper.js @@ -1,8 +1,19 @@ +import Application from '../app'; +import config from '../config/environment'; +import { setApplication } from '@ember/test-helpers'; +import { start } from 'ember-qunit'; + import resolver from './helpers/resolver'; import { setResolver } from 'ember-qunit'; -import { start } from 'ember-cli-qunit'; -setResolver(resolver); +import Ember from 'ember'; + +if (Ember.VERSION === "1.13.13") { + setResolver(resolver); +} else { + setApplication(Application.create(config.APP)); +} + start(); diff --git a/yarn.lock b/yarn.lock index 8c761adf3..ff96a76c8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,9 +2,9 @@ # yarn lockfile v1 -"@ember/test-helpers@^0.7.9": - version "0.7.16" - resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-0.7.16.tgz#73a4acf4c7d1b92ce866f4c9e40c9723da4cf1e8" +"@ember/test-helpers@^0.7.17": + version "0.7.17" + resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-0.7.17.tgz#17ff5f1d005d8b6331585e99013d66626a8d8068" dependencies: broccoli-funnel "^2.0.1" ember-cli-babel "^6.10.0" @@ -155,7 +155,7 @@ ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" -ansi-styles@^3.0.0, ansi-styles@^3.1.0: +ansi-styles@^3.0.0, ansi-styles@^3.1.0, ansi-styles@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" dependencies: @@ -1168,7 +1168,7 @@ broccoli-funnel-reducer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/broccoli-funnel-reducer/-/broccoli-funnel-reducer-1.0.0.tgz#11365b2a785aec9b17972a36df87eef24c5cc0ea" -broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.2, broccoli-funnel@^1.1.0, broccoli-funnel@^1.2.0: +broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.2, broccoli-funnel@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-1.2.0.tgz#cddc3afc5ff1685a8023488fff74ce6fb5a51296" dependencies: @@ -1530,6 +1530,14 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: escape-string-regexp "^1.0.5" supports-color "^4.0.0" +chalk@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796" + dependencies: + ansi-styles "^3.2.0" + escape-string-regexp "^1.0.5" + supports-color "^5.2.0" + chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" @@ -2099,7 +2107,7 @@ ember-cli-app-version@^2.0.0: ember-cli-babel "^6.8.0" git-repo-version "0.4.1" -ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2, ember-cli-babel@^6.9.0: +ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2, ember-cli-babel@^6.9.0: version "6.11.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.11.0.tgz#79cb184bac3c05bfe181ddc306bac100ab1f9493" dependencies: @@ -2180,26 +2188,26 @@ ember-cli-is-package-missing@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-is-package-missing/-/ember-cli-is-package-missing-1.0.0.tgz#6e6184cafb92635dd93ca6c946b104292d4e3390" -ember-cli-legacy-blueprints@^0.1.2: - version "0.1.5" - resolved "https://registry.yarnpkg.com/ember-cli-legacy-blueprints/-/ember-cli-legacy-blueprints-0.1.5.tgz#93c15ca242ec5107d62a8af7ec30f6ac538f3ad9" +ember-cli-legacy-blueprints@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ember-cli-legacy-blueprints/-/ember-cli-legacy-blueprints-0.2.1.tgz#480f37cb83f1eda2d46bbc7d07c59ea2e8ce9b84" dependencies: - chalk "^1.1.1" + chalk "^2.3.0" ember-cli-get-component-path-option "^1.0.0" ember-cli-get-dependency-depth "^1.0.0" ember-cli-is-package-missing "^1.0.0" - ember-cli-lodash-subset "^1.0.7" + ember-cli-lodash-subset "^2.0.1" ember-cli-normalize-entity-name "^1.0.0" ember-cli-path-utils "^1.0.0" ember-cli-string-utils "^1.0.0" ember-cli-test-info "^1.0.0" ember-cli-valid-component-name "^1.0.0" - ember-cli-version-checker "^1.1.7" + ember-cli-version-checker "^2.1.0" ember-router-generator "^1.0.0" exists-sync "0.0.3" - fs-extra "^0.24.0" + fs-extra "^4.0.0" inflection "^1.7.1" - rsvp "^3.0.17" + rsvp "^4.7.0" silent-error "^1.0.0" ember-cli-lodash-subset@^1.0.7: @@ -2244,12 +2252,12 @@ ember-cli-preprocess-registry@^3.1.0: process-relative-require "^1.0.0" silent-error "^1.0.0" -ember-cli-qunit@^4.1.0-beta.2: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ember-cli-qunit/-/ember-cli-qunit-4.3.0.tgz#1ce65dea553d18f5fd9b6b08d3d5128afb2ab94e" +ember-cli-qunit@^4.1.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ember-cli-qunit/-/ember-cli-qunit-4.3.1.tgz#fcbf3585392299b27de26e57d0cf9f9049a76181" dependencies: - ember-cli-babel "^6.8.1" - ember-qunit "^3.3.0" + ember-cli-babel "^6.11.0" + ember-qunit "^3.3.1" ember-cli-release@^0.2.9: version "0.2.9" @@ -2265,7 +2273,7 @@ ember-cli-release@^0.2.9: semver "^4.3.1" silent-error "^1.0.0" -ember-cli-shims@^1.1.0: +ember-cli-shims@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/ember-cli-shims/-/ember-cli-shims-1.2.0.tgz#0f53aff0aab80b5f29da3a9731bac56169dd941f" dependencies: @@ -2310,7 +2318,7 @@ ember-cli-valid-component-name@^1.0.0: dependencies: silent-error "^1.0.0" -ember-cli-version-checker@^1.1.4, ember-cli-version-checker@^1.1.7, ember-cli-version-checker@^1.3.1: +ember-cli-version-checker@^1.1.4: version "1.3.1" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz#0bc2d134c830142da64bf9627a0eded10b61ae72" dependencies: @@ -2323,9 +2331,9 @@ ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0: resolve "^1.3.3" semver "^5.3.0" -ember-cli@~2.16.2: - version "2.16.2" - resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-2.16.2.tgz#53b922073a8e6f34255a6e0dcb1794a91ba3e1b7" +ember-cli@~2.18.2: + version "2.18.2" + resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-2.18.2.tgz#bb15313a15139a85248a86d203643f918ba40f57" dependencies: amd-name-resolver "1.0.0" babel-plugin-transform-es2015-modules-amd "^6.24.0" @@ -2356,7 +2364,7 @@ ember-cli@~2.16.2: diff "^3.2.0" ember-cli-broccoli-sane-watcher "^2.0.4" ember-cli-is-package-missing "^1.0.0" - ember-cli-legacy-blueprints "^0.1.2" + ember-cli-legacy-blueprints "^0.2.0" ember-cli-lodash-subset "^2.0.1" ember-cli-normalize-entity-name "^1.0.0" ember-cli-preprocess-registry "^3.1.0" @@ -2392,19 +2400,19 @@ ember-cli@~2.16.2: morgan "^1.8.1" node-modules-path "^1.0.0" nopt "^3.0.6" - npm-package-arg "^4.1.1" + npm-package-arg "^6.0.0" portfinder "^1.0.7" promise-map-series "^0.2.1" quick-temp "^0.1.8" resolve "^1.3.0" - rsvp "^3.6.0" - sane "^1.6.0" + rsvp "^4.7.0" + sane "^2.2.0" semver "^5.1.1" silent-error "^1.0.0" sort-package-json "^1.4.0" symlink-or-copy "^1.1.8" temp "0.8.3" - testem "^1.18.0" + testem "^2.0.0" tiny-lr "^1.0.3" tree-sync "^1.2.1" uuid "^3.0.0" @@ -2497,11 +2505,11 @@ ember-lodash@^4.17.3: ember-cli-babel "^6.10.0" lodash-es "^4.17.4" -ember-qunit@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-3.3.0.tgz#98c0c8d9473808fa7be48808989255cbfa70e760" +ember-qunit@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-3.3.1.tgz#8d68ef30cfd6f2acbf1d0f4e368439642e726903" dependencies: - "@ember/test-helpers" "^0.7.9" + "@ember/test-helpers" "^0.7.17" broccoli-funnel "^2.0.1" broccoli-merge-trees "^2.0.0" common-tags "^1.4.0" @@ -2521,6 +2529,10 @@ ember-resolver@^4.0.0: ember-cli-version-checker "^2.0.0" resolve "^1.3.3" +ember-rfc176-data@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.2.7.tgz#bd355bc9b473e08096b518784170a23388bc973b" + ember-rfc176-data@^0.3.0, ember-rfc176-data@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.1.tgz#6a5a4b8b82ec3af34f3010965fa96b936ca94519" @@ -2538,11 +2550,11 @@ ember-runtime-enumerable-includes-polyfill@^2.0.0: ember-cli-babel "^6.9.0" ember-cli-version-checker "^2.1.0" -ember-source@~2.16.0: - version "2.16.2" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-2.16.2.tgz#ebc29ce36dec3ecc80f6b1b02218d63ca5041088" +ember-source@~2.18.0: + version "2.18.1" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-2.18.1.tgz#bc02fc809f9e9b68d63e790aa3fac16bc6242bd5" dependencies: - broccoli-funnel "^1.2.0" + broccoli-funnel "^2.0.1" broccoli-merge-trees "^2.0.0" ember-cli-get-component-path-option "^1.0.0" ember-cli-is-package-missing "^1.0.0" @@ -2551,9 +2563,8 @@ ember-source@~2.16.0: ember-cli-string-utils "^1.1.0" ember-cli-test-info "^1.0.0" ember-cli-valid-component-name "^1.0.0" - ember-cli-version-checker "^1.3.1" + ember-cli-version-checker "^2.1.0" ember-router-generator "^1.2.3" - fs-extra "^4.0.1" inflection "^1.12.0" jquery "^3.2.1" resolve "^1.3.3" @@ -2679,6 +2690,23 @@ eslint-plugin-ember-suave@^1.0.0: dependencies: requireindex "~1.1.0" +eslint-plugin-ember@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-5.0.3.tgz#9f5e2048ab3ddc1548d4d17bf318cf1bb5cf37f1" + dependencies: + ember-rfc176-data "^0.2.7" + require-folder-tree "^1.4.5" + snake-case "^2.1.0" + +eslint-plugin-node@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz#80df3253c4d7901045ec87fa660a284e32bdca29" + dependencies: + ignore "^3.3.6" + minimatch "^3.0.4" + resolve "^1.3.3" + semver "5.3.0" + eslint-scope@^3.7.1: version "3.7.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" @@ -2810,6 +2838,18 @@ execa@^0.8.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.9.0.tgz#adb7ce62cf985071f60580deb4a88b9e34712d01" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + exists-stat@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/exists-stat/-/exists-stat-1.0.0.tgz#0660e3525a2e89d9e446129440c272edfa24b529" @@ -3228,7 +3268,7 @@ fs-extra@^3.0.0: jsonfile "^3.0.0" universalify "^0.1.0" -fs-extra@^4.0.0, fs-extra@^4.0.1: +fs-extra@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" dependencies: @@ -3258,7 +3298,7 @@ fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" -fsevents@^1.0.0: +fsevents@^1.0.0, fsevents@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" dependencies: @@ -3527,6 +3567,10 @@ has-flag@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -3640,7 +3684,7 @@ homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: dependencies: parse-passwd "^1.0.0" -hosted-git-info@^2.1.4, hosted-git-info@^2.1.5: +hosted-git-info@^2.1.4, hosted-git-info@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" @@ -3690,7 +3734,7 @@ iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@~0.4.13: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" -ignore@^3.3.3: +ignore@^3.3.3, ignore@^3.3.6: version "3.3.7" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" @@ -4397,6 +4441,10 @@ lodash.bind@~2.3.0: lodash._renative "~2.3.0" lodash._slice "~2.3.0" +lodash.castarray@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" + lodash.clonedeep@^4.4.1: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -4566,6 +4614,10 @@ lodash.values@~2.3.0: dependencies: lodash.keys "~2.3.0" +lodash@3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.8.0.tgz#376eb98bdcd9382a9365c33c4cb8250de1325b91" + lodash@^3.10.0, lodash@^3.10.1: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" @@ -4597,6 +4649,10 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + lru-cache@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" @@ -4920,6 +4976,12 @@ negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + dependencies: + lower-case "^1.1.1" + node-fetch@^1.3.3: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" @@ -4992,12 +5054,14 @@ npm-git-info@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/npm-git-info/-/npm-git-info-1.0.3.tgz#a933c42ec321e80d3646e0d6e844afe94630e1d5" -npm-package-arg@^4.1.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-4.2.1.tgz#593303fdea85f7c422775f17f9eb7670f680e3ec" +npm-package-arg@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.0.0.tgz#8cce04b49d3f9faec3f56b0fe5f4391aeb9d2fac" dependencies: - hosted-git-info "^2.1.5" - semver "^5.1.0" + hosted-git-info "^2.5.0" + osenv "^0.1.4" + semver "^5.4.1" + validate-npm-package-name "^3.0.0" npm-run-path@^2.0.0: version "2.0.2" @@ -5616,6 +5680,12 @@ request@^2.74.0, request@^2.79.0: tunnel-agent "^0.6.0" uuid "^3.1.0" +require-folder-tree@^1.4.5: + version "1.4.5" + resolved "https://registry.yarnpkg.com/require-folder-tree/-/require-folder-tree-1.4.5.tgz#dfe553cbab98cc88e1c56a3f2f358f06ef85bcb0" + dependencies: + lodash "3.8.0" + require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" @@ -5697,11 +5767,11 @@ route-recognizer@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.3.tgz#1d365e27fa6995e091675f7dc940a8c00353bd29" -rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.2.1, rsvp@^3.3.1, rsvp@^3.3.3, rsvp@^3.5.0, rsvp@^3.6.0: +rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.2.1, rsvp@^3.3.1, rsvp@^3.3.3, rsvp@^3.5.0: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" -rsvp@^4.6.1: +rsvp@^4.6.1, rsvp@^4.7.0: version "4.8.1" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.1.tgz#168addb3963222de37ee351b70e3876bdb2ac285" @@ -5741,7 +5811,7 @@ safe-json-parse@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" -sane@^1.1.1, sane@^1.6.0: +sane@^1.1.1: version "1.7.0" resolved "https://registry.yarnpkg.com/sane/-/sane-1.7.0.tgz#b3579bccb45c94cf20355cc81124990dfd346e30" dependencies: @@ -5753,6 +5823,20 @@ sane@^1.1.1, sane@^1.6.0: walker "~1.0.5" watch "~0.10.0" +sane@^2.2.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/sane/-/sane-2.4.1.tgz#29f991208cf28636720efdc584293e7fd66663a5" + dependencies: + anymatch "^1.3.0" + exec-sh "^0.2.0" + fb-watchman "^2.0.0" + minimatch "^3.0.2" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.18.0" + optionalDependencies: + fsevents "^1.1.1" + sax@^1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -5761,6 +5845,10 @@ sax@^1.2.1: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" +semver@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + semver@^4.3.1: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" @@ -5870,6 +5958,12 @@ slice-ansi@1.0.0: dependencies: is-fullwidth-code-point "^2.0.0" +snake-case@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f" + dependencies: + no-case "^2.2.0" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -6197,6 +6291,12 @@ supports-color@^4.0.0: dependencies: has-flag "^2.0.0" +supports-color@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.2.0.tgz#b0d5333b1184dd3666cbe5aa0b45c5ac7ac17a4a" + dependencies: + has-flag "^3.0.0" + symbol-tree@^3.2.1: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" @@ -6253,22 +6353,23 @@ temp@0.8.3, temp@^0.8.3: os-tmpdir "^1.0.0" rimraf "~2.2.6" -testem@^1.18.0: - version "1.18.4" - resolved "https://registry.yarnpkg.com/testem/-/testem-1.18.4.tgz#e45fed922bec2f54a616c43f11922598ac97eb41" +testem@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/testem/-/testem-2.0.0.tgz#b05c96200c7ac98bae998d71c94c0c5345907d13" dependencies: backbone "^1.1.2" bluebird "^3.4.6" charm "^1.0.0" commander "^2.6.0" consolidate "^0.14.0" - cross-spawn "^5.1.0" + execa "^0.9.0" express "^4.10.7" fireworm "^0.7.0" glob "^7.0.4" http-proxy "^1.13.1" js-yaml "^3.2.5" lodash.assignin "^4.1.0" + lodash.castarray "^4.4.0" lodash.clonedeep "^4.4.1" lodash.find "^4.5.1" lodash.uniqby "^4.7.0" @@ -6599,6 +6700,13 @@ watch@~0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" +watch@~0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" + dependencies: + exec-sh "^0.2.0" + minimist "^1.2.0" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" From 42bed1919250ddf4bf94ef8b7d420c478e205fab Mon Sep 17 00:00:00 2001 From: Ben Demboski Date: Thu, 15 Feb 2018 22:02:44 -0800 Subject: [PATCH 141/879] Support rfc232/rfc268 tests Implement `setupMirageTest()` that can be called in rfc232/rfc268 tests to start mirage and set it as `this.server`. Also implement an instance initializer that, if the `env['ember-cli-mirage'].autostart` option is set, will automatically start mirage and set it as `this.server` in every rfc232/rfc268 test. Fixes #1257 --- addon-test-support/setup-mirage-test.js | 24 +++++ addon/get-rfc232-test-context.js | 15 +++ .../ember-cli-mirage-autostart.js | 46 +++++++++ addon/start-mirage.js | 52 ++++++++++ app/initializers/ember-cli-mirage.js | 44 +++++---- .../ember-cli-mirage-autostart.js | 1 + package.json | 3 +- .../enable-request-tracking-test.js | 2 +- tests/acceptance/legacy-start-mirage-test.js | 59 +++++++++++ tests/acceptance/manually-starting-test.js | 34 ------- tests/acceptance/start-mirage-test.js | 97 +++++++++++++++++++ tests/helpers/promise-ajax.js | 2 +- yarn.lock | 7 ++ 13 files changed, 331 insertions(+), 55 deletions(-) create mode 100644 addon-test-support/setup-mirage-test.js create mode 100644 addon/get-rfc232-test-context.js create mode 100644 addon/instance-initializers/ember-cli-mirage-autostart.js create mode 100644 addon/start-mirage.js create mode 100644 app/instance-initializers/ember-cli-mirage-autostart.js create mode 100644 tests/acceptance/legacy-start-mirage-test.js delete mode 100644 tests/acceptance/manually-starting-test.js create mode 100644 tests/acceptance/start-mirage-test.js diff --git a/addon-test-support/setup-mirage-test.js b/addon-test-support/setup-mirage-test.js new file mode 100644 index 000000000..7f99613a1 --- /dev/null +++ b/addon-test-support/setup-mirage-test.js @@ -0,0 +1,24 @@ +import startMirage from 'ember-cli-mirage/start-mirage'; + +// +// Used to set up mirage for a test. Must be called after one of the +// `ember-qunit` `setup*Test()` methods. It starts the server and sets +// `this.server` to point to it, and shuts the server down when the test +// finishes. +// +export default function setupMirageTest(hooks) { + hooks.beforeEach(function() { + if (!this.owner) { + throw new Error('You must call one of the ember-qunit setupTest(),' + + ' setupRenderingTest() or setupApplicationTest() methods before' + + ' calling setupMirageTest()'); + } + + this.server = startMirage(this.owner); + }); + + hooks.afterEach(function() { + this.server.shutdown(); + delete this.server; + }); +} diff --git a/addon/get-rfc232-test-context.js b/addon/get-rfc232-test-context.js new file mode 100644 index 000000000..52c4c07d7 --- /dev/null +++ b/addon/get-rfc232-test-context.js @@ -0,0 +1,15 @@ +import require from 'require'; + +// +// Helper to get our rfc232/rfc268 test context object, or null if we're not in +// such a test. +// +export default function getRfc232TestContext() { + // Support older versions of `ember-qunit` that don't have + // `@ember/test-helpers` (and therefore cannot possibly be running an + // rfc232/rfc268 test). + if (require.has('@ember/test-helpers')) { + let { getContext } = require('@ember/test-helpers'); + return getContext(); + } +} diff --git a/addon/instance-initializers/ember-cli-mirage-autostart.js b/addon/instance-initializers/ember-cli-mirage-autostart.js new file mode 100644 index 000000000..ae820768c --- /dev/null +++ b/addon/instance-initializers/ember-cli-mirage-autostart.js @@ -0,0 +1,46 @@ +import EmberObject from '@ember/object'; +import getRfc232TestContext from 'ember-cli-mirage/get-rfc232-test-context'; +import startMirage from 'ember-cli-mirage/start-mirage'; + +// +// If we are running an rfc232/rfc268 test then we want to support the +// `autostart` configuration option, which auto-starts mirage before the test +// runs and shuts it down afterwards, and also sets `this.server` on the test +// context so the tests don't need to use the global `server`. We do this in an +// instance initializer because initializers only run once per test run, not +// before and after each test. +// +export function initialize(appInstance) { + let testContext = getRfc232TestContext(); + if (testContext) { + let { + 'ember-cli-mirage': { autostart } = {} + } = appInstance.resolveRegistration('config:environment'); + + if (autostart) { + let server = startMirage(appInstance); + testContext.server = server; + + // To ensure that the server is shut down when the application is + // destroyed, register and create a singleton object that shuts the server + // down in its willDestroy() hook. + appInstance.register('mirage:shutdown', MirageShutdown); + let shutdown = appInstance.lookup('mirage:shutdown'); + shutdown.set('testContext', testContext); + } + } +} + +export default { + initialize +}; + +const MirageShutdown = EmberObject.extend({ + testContext: null, + + willDestroy() { + let testContext = this.get('testContext'); + testContext.server.shutdown(); + delete testContext.server; + } +}); diff --git a/addon/start-mirage.js b/addon/start-mirage.js new file mode 100644 index 000000000..541726773 --- /dev/null +++ b/addon/start-mirage.js @@ -0,0 +1,52 @@ +import Ember from 'ember'; +import readModules from 'ember-cli-mirage/utils/read-modules'; +import Server from 'ember-cli-mirage/server'; +import _assign from 'lodash/assign'; + +const { + getWithDefault +} = Ember; + +// +// Helper to start mirage. This should not be called directly. In rfc232/rfc268 +// tests, use `setupMirageTest()` or the `autoboot` option in the addon config +// in the environment. In legacy tests that call `startMirage` directly, this +// should be called via the `startMirage` method exported from +// `/initializers/ember-cli-mirage`. +// +// This is intended to be called with only the `owner` argument (which would be +// `this.owner` in an rfc232/rfc268 test, or the application instance if called +// from an instance initializer). However, to support the legacy initializer, it +// can instead accept a hash of the environment and config objects. +// +export default function startMirage(owner, { env, baseConfig, testConfig } = {}) { + if (!env || !baseConfig) { + if (!owner) { + throw new Error('You must pass `owner` to startMirage()'); + } + + env = env || resolveRegistration(owner, 'config:environment'); + // These are set from `/initializers/ember-cli-mirage` + baseConfig = baseConfig || resolveRegistration(owner, 'mirage:base-config'); + testConfig = testConfig || resolveRegistration(owner, 'mirage:test-config'); + } + + let environment = env.environment; + let discoverEmberDataModels = getWithDefault(env['ember-cli-mirage'] || {}, 'discoverEmberDataModels', true); + let modules = readModules(env.modulePrefix); + let options = _assign(modules, {environment, baseConfig, testConfig, discoverEmberDataModels}); + options.trackRequests = env['ember-cli-mirage'].trackRequests; + + return new Server(options); +} + +// Support Ember 1.13 +function resolveRegistration(owner, ...args) { + if (owner.resolveRegistration) { + return owner.resolveRegistration(...args); + } else if (owner.__container__) { + return owner.__container__.lookupFactory(...args); + } else { + return owner.container.lookupFactory(...args); + } +} diff --git a/app/initializers/ember-cli-mirage.js b/app/initializers/ember-cli-mirage.js index 49307e828..5e7aa932a 100644 --- a/app/initializers/ember-cli-mirage.js +++ b/app/initializers/ember-cli-mirage.js @@ -1,17 +1,28 @@ -import Ember from 'ember'; -import readModules from 'ember-cli-mirage/utils/read-modules'; import ENV from '../config/environment'; import baseConfig, { testConfig } from '../mirage/config'; -import Server from 'ember-cli-mirage/server'; -import _assign from 'lodash/assign'; - -const { - getWithDefault -} = Ember; - +import getRfc232TestContext from 'ember-cli-mirage/get-rfc232-test-context'; +import newStartMirage from 'ember-cli-mirage/start-mirage'; + +// +// This initializer does two things: +// +// 1. Pulls the mirage config objects from the application's config and +// registers them in the container so `ember-cli-mirage/start-mirage` can +// find them (since it doesn't have access to the app's namespace). +// 2. Provides legacy support for auto-starting mirage in pre-rfc268 acceptance +// tests. +// export default { - name: 'ember-cli-mirage', - initialize() { + name: 'ember-cli-mirage-config', + initialize(application) { + if (baseConfig) { + application.register('mirage:base-config', baseConfig, { instantiate: false }); + } + if (testConfig) { + application.register('mirage:test-config', testConfig, { instantiate: false }); + } + + ENV['ember-cli-mirage'] = ENV['ember-cli-mirage'] || {}; if (_shouldUseMirage(ENV.environment, ENV['ember-cli-mirage'])) { startMirage(ENV); } @@ -19,19 +30,16 @@ export default { }; export function startMirage(env = ENV) { - let environment = env.environment; - let discoverEmberDataModels = getWithDefault(env['ember-cli-mirage'] || {}, 'discoverEmberDataModels', true); - let modules = readModules(env.modulePrefix); - let options = _assign(modules, {environment, baseConfig, testConfig, discoverEmberDataModels}); - options.trackRequests = env['ember-cli-mirage'].trackRequests; - - return new Server(options); + return newStartMirage(null, { env, baseConfig, testConfig }); } function _shouldUseMirage(env, addonConfig) { if (typeof FastBoot !== 'undefined') { return false; } + if (getRfc232TestContext()) { + return false; + } let userDeclaredEnabled = typeof addonConfig.enabled !== 'undefined'; let defaultEnabled = _defaultEnabled(env, addonConfig); diff --git a/app/instance-initializers/ember-cli-mirage-autostart.js b/app/instance-initializers/ember-cli-mirage-autostart.js new file mode 100644 index 000000000..6977ada09 --- /dev/null +++ b/app/instance-initializers/ember-cli-mirage-autostart.js @@ -0,0 +1 @@ +export { default } from 'ember-cli-mirage/instance-initializers/ember-cli-mirage-autostart'; diff --git a/package.json b/package.json index 4f614fb3b..f55104ba6 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,8 @@ "eslint-plugin-ember-suave": "^1.0.0", "eslint-plugin-node": "^5.2.1", "loader.js": "^4.2.3", - "mocha": "^3.4.2" + "mocha": "^3.4.2", + "qunit-dom": "^0.5.0" }, "engines": { "node": "^4.5 || 6.* || >= 7.*" diff --git a/tests/acceptance/enable-request-tracking-test.js b/tests/acceptance/enable-request-tracking-test.js index 4a0152160..67727ed82 100644 --- a/tests/acceptance/enable-request-tracking-test.js +++ b/tests/acceptance/enable-request-tracking-test.js @@ -51,4 +51,4 @@ test('Request tracking can be set to true in config', async function(assert) { assert.equal(server.pretender.handledRequests.length, 1, 'request tracking can be turned on in config and track requests'); assert.equal(server.pretender.handledRequests[0].method, 'GET', 'tracked request method should match the requests method'); -}); \ No newline at end of file +}); diff --git a/tests/acceptance/legacy-start-mirage-test.js b/tests/acceptance/legacy-start-mirage-test.js new file mode 100644 index 000000000..eb9b7f064 --- /dev/null +++ b/tests/acceptance/legacy-start-mirage-test.js @@ -0,0 +1,59 @@ +import {module, test} from 'qunit'; +import startApp from '../helpers/start-app'; +import destroyApp from '../helpers/destroy-app'; +import { startMirage } from 'dummy/initializers/ember-cli-mirage'; +import ENV from 'dummy/config/environment'; + +module('Acceptance: Starting mirage (legacy)', function(hooks) { + let app, oldEnv, addonConfig; + + hooks.beforeEach(function() { + oldEnv = ENV['ember-cli-mirage']; + ENV['ember-cli-mirage'] = addonConfig = {}; + }); + + hooks.afterEach(function() { + destroyApp(app); + ENV['ember-cli-mirage'] = oldEnv; + }); + + test('The server starts automatically when configured with enabled undefined', async function(assert) { + app = startApp(); + + assert.ok(window.server, 'There is a server after starting'); + + let contact = window.server.create('contact'); + await window.visit('/1'); + + assert.equal(window.currentRouteName(), 'contact'); + assert.dom('p').hasText(`The contact is ${contact.name}`, 'The automatically started server works'); + }); + + test('The server starts automatically when configured with { enabled: true }', async function(assert) { + addonConfig.enabled = true; + app = startApp(); + + assert.ok(window.server, 'There is a server after starting'); + + let contact = window.server.create('contact'); + await window.visit('/1'); + + assert.equal(window.currentRouteName(), 'contact'); + assert.dom('p').hasText(`The contact is ${contact.name}`, 'The automatically started server works'); + }); + + test('The server can be started manually when configured with { enabled: false }', async function(assert) { + addonConfig.enabled = false; + app = startApp(); + + assert.equal(window.server, undefined, 'There is no server at first'); + startMirage(); + assert.ok(window.server, 'There is a server after starting'); + + let contact = window.server.create('contact'); + await window.visit('/1'); + + assert.equal(window.currentRouteName(), 'contact'); + assert.dom('p').hasText(`The contact is ${contact.name}`, 'The manually started server works'); + }); +}); diff --git a/tests/acceptance/manually-starting-test.js b/tests/acceptance/manually-starting-test.js deleted file mode 100644 index c4e0a45c4..000000000 --- a/tests/acceptance/manually-starting-test.js +++ /dev/null @@ -1,34 +0,0 @@ -import { run } from '@ember/runloop'; -import {module, test} from 'qunit'; -import startApp from '../helpers/start-app'; -import { startMirage } from 'dummy/initializers/ember-cli-mirage'; -import ENV from 'dummy/config/environment'; - -let App; - -module('Acceptance: Manually starting Mirage', { - beforeEach() { - ENV['ember-cli-mirage'] = { enabled: false }; - App = startApp(); - }, - - afterEach() { - server.shutdown(); - run(App, 'destroy'); - ENV['ember-cli-mirage'].enabled = undefined; - } -}); - -test('The server can be started manually when configured with { enabled: false }', function(assert) { - assert.equal(window.server, undefined, 'There is no server at first'); - startMirage(); - assert.ok(window.server, 'There is a server after starting'); - - let contact = server.create('contact'); - visit('/1'); - - andThen(function() { - assert.equal(currentRouteName(), 'contact'); - assert.equal(find('p:first').text(), `The contact is ${contact.name}`, 'The manually started server works'); - }); -}); diff --git a/tests/acceptance/start-mirage-test.js b/tests/acceptance/start-mirage-test.js new file mode 100644 index 000000000..9b0381110 --- /dev/null +++ b/tests/acceptance/start-mirage-test.js @@ -0,0 +1,97 @@ +import Ember from 'ember'; +import {module as qunitModule, test} from 'qunit'; +import {setupTest} from 'ember-qunit'; +import {visit, currentRouteName} from '@ember/test-helpers'; +import startMirage from 'ember-cli-mirage/start-mirage'; +import setupMirageTest from 'ember-cli-mirage/test-support/setup-mirage-test'; +import ENV from 'dummy/config/environment'; + +let module; +if (Ember.VERSION === '1.13.13') { + module = () => null; +} else { + module = qunitModule; +} + +module('Acceptance: Starting mirage', function(hooks) { + let oldEnv, addonConfig, dynamicAfterEach; + + hooks.beforeEach(function() { + oldEnv = ENV['ember-cli-mirage']; + ENV['ember-cli-mirage'] = addonConfig = {}; + // When running in non-legacy mode we shoud ignore this, so we set it so we + // can make sure that tests that it doesn't cause the server to start when + // it shouldn't in the cases that test that + addonConfig.enabled = true; + + dynamicAfterEach = () => undefined; + }); + + hooks.afterEach(function() { + dynamicAfterEach(); + }); + + hooks.afterEach(function() { + ENV['ember-cli-mirage'] = oldEnv; + }); + + module('without autostart', function(hooks) { + setupTest(hooks); + + test('it does not autostart but can be started manually', async function(assert) { + assert.equal(window.server, undefined, 'There is no global server at first'); + let server = startMirage(this.owner); + assert.ok(server, 'There is a server after starting'); + assert.ok(window.server, 'There is a global server after starting'); + dynamicAfterEach = () => server.shutdown(); + + let contact = server.create('contact'); + await visit('/1'); + + assert.equal(currentRouteName(), 'contact'); + assert.dom('p').hasText(`The contact is ${contact.name}`, 'The manually started server works'); + }); + + module('setupMirageTest()', function(hooks) { + setupMirageTest(hooks); + + test('it works', async function(assert) { + assert.ok(this.server, 'There is a server'); + assert.ok(window.server, 'There is a global server'); + dynamicAfterEach = () => { + assert.notOk(this.server, 'The server was shut down'); + assert.notOk(window.server, 'The global server is gone'); + }; + + let contact = this.server.create('contact'); + await visit('/1'); + + assert.equal(currentRouteName(), 'contact'); + assert.dom('p').hasText(`The contact is ${contact.name}`, 'The manually started server works'); + }); + }); + }); + + module('with autostart', function(hooks) { + hooks.beforeEach(function() { + addonConfig.autostart = true; + }); + + setupTest(hooks); + + test('it autostarts', async function(assert) { + assert.ok(this.server, 'There is a server'); + assert.ok(window.server, 'There is a global server'); + dynamicAfterEach = () => { + assert.notOk(this.server, 'The server was shut down'); + assert.notOk(window.server, 'The global server is gone'); + }; + + let contact = this.server.create('contact'); + await visit('/1'); + + assert.equal(currentRouteName(), 'contact'); + assert.dom('p').hasText(`The contact is ${contact.name}`, 'The manually started server works'); + }); + }); +}); diff --git a/tests/helpers/promise-ajax.js b/tests/helpers/promise-ajax.js index 240800f90..f84ad8631 100644 --- a/tests/helpers/promise-ajax.js +++ b/tests/helpers/promise-ajax.js @@ -6,4 +6,4 @@ export default (options) => { .done((data, status, xhr) => resolve({data, status, xhr})) .fail((xhr, status, error) => reject({xhr, status, error})); }); -}; \ No newline at end of file +}; diff --git a/yarn.lock b/yarn.lock index ff96a76c8..4a6494805 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5442,6 +5442,13 @@ quick-temp@^0.1.0, quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quic rimraf "^2.5.4" underscore.string "~3.3.4" +qunit-dom@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-0.5.0.tgz#b08db6f919656e0589ebf8bd85bc313febb454d8" + dependencies: + broccoli-funnel "^2.0.0" + broccoli-merge-trees "^2.0.0" + qunit@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.5.0.tgz#64cbe30a1193ef02edc5b278efcdf1d0bae96b22" From a10a8424f6784f56b30d4fa2b261fe82144240aa Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Wed, 21 Feb 2018 16:43:14 +0000 Subject: [PATCH 142/879] Add options verb mocking --- addon/server.js | 2 +- tests/integration/http-verbs-test.js | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/addon/server.js b/addon/server.js index cca9909a2..b7fe949e2 100644 --- a/addon/server.js +++ b/addon/server.js @@ -482,7 +482,7 @@ export default class Server { * @private */ _defineRouteHandlerHelpers() { - [['get'], ['post'], ['put'], ['delete', 'del'], ['patch'], ['head']].forEach(([verb, alias]) => { + [['get'], ['post'], ['put'], ['delete', 'del'], ['patch'], ['head'], ['options']].forEach(([verb, alias]) => { this[verb] = (path, ...args) => { let [ rawHandler, customizedCode, options ] = extractRouteArguments(args); this._registerRouteHandler(verb, path, rawHandler, customizedCode, options); diff --git a/tests/integration/http-verbs-test.js b/tests/integration/http-verbs-test.js index b6b8fb346..ad5fa43c2 100644 --- a/tests/integration/http-verbs-test.js +++ b/tests/integration/http-verbs-test.js @@ -122,4 +122,19 @@ module('Integration | HTTP Verbs', function(hooks) { assert.ok(e.xhr.status, 404); } }); + + test('mirage responds to options', async function(assert) { + assert.expect(1); + + this.server.options('/contacts', function() { + return true; + }); + + let { data } = await promiseAjax({ + method: 'OPTIONS', + url: '/contacts' + }); + + assert.equal(data, true); + }); }); From ade9f1a9a250eb453f38398ba4c7acb9182664a6 Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Wed, 21 Feb 2018 17:27:18 +0000 Subject: [PATCH 143/879] Rename inner options to _options --- addon/server.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addon/server.js b/addon/server.js index b7fe949e2..443e1d8a0 100644 --- a/addon/server.js +++ b/addon/server.js @@ -149,7 +149,7 @@ export default class Server { 'You cannot modify Mirage\'s environment once the server is created'); this.environment = config.environment || 'development'; - this.options = config; + this._options = config; this.timing = this.timing || config.timing || 400; this.namespace = this.namespace || config.namespace || ''; @@ -270,7 +270,7 @@ export default class Server { * @public */ passthrough(...paths) { - let verbs = ['get', 'post', 'put', 'delete', 'patch']; + let verbs = ['get', 'post', 'put', 'delete', 'patch', 'options']; let lastArg = paths[paths.length - 1]; if (paths.length === 0) { @@ -296,7 +296,7 @@ export default class Server { * @public */ loadFixtures(...args) { - let { fixtures } = this.options; + let { fixtures } = this._options; if (args.length) { let camelizedArgs = args.map(camelize); fixtures = _pick(fixtures, ...camelizedArgs); From f12d68db60f6afe4803f3cbad82896e5dbfa7f71 Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Wed, 21 Feb 2018 18:00:59 +0000 Subject: [PATCH 144/879] Rename _options to _config --- addon/server.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addon/server.js b/addon/server.js index 443e1d8a0..36b4ebc22 100644 --- a/addon/server.js +++ b/addon/server.js @@ -149,7 +149,7 @@ export default class Server { 'You cannot modify Mirage\'s environment once the server is created'); this.environment = config.environment || 'development'; - this._options = config; + this._config = config; this.timing = this.timing || config.timing || 400; this.namespace = this.namespace || config.namespace || ''; @@ -296,7 +296,7 @@ export default class Server { * @public */ loadFixtures(...args) { - let { fixtures } = this._options; + let { fixtures } = this._config; if (args.length) { let camelizedArgs = args.map(camelize); fixtures = _pick(fixtures, ...camelizedArgs); From 2f6d49d4d9035ea40d32bf31bd3119ab33a6ba46 Mon Sep 17 00:00:00 2001 From: Ben Demboski Date: Fri, 23 Feb 2018 08:32:37 -0800 Subject: [PATCH 145/879] Restore correct copyright date --- LICENSE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE.md b/LICENSE.md index 198f6dacf..02000b56e 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018 +Copyright (c) 2016 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: From 90d71416765ea7388b3450504e9a8069c54b94f1 Mon Sep 17 00:00:00 2001 From: Ben Demboski Date: Tue, 27 Feb 2018 10:14:04 -0800 Subject: [PATCH 146/879] Address PR feedback --- .../{setup-mirage-test.js => setup-mirage.js} | 6 +++-- .../ember-cli-mirage-autostart.js | 22 ++++++++++--------- addon/start-mirage.js | 8 ++----- app/initializers/ember-cli-mirage.js | 4 ++-- tests/acceptance/start-mirage-test.js | 6 ++--- 5 files changed, 23 insertions(+), 23 deletions(-) rename addon-test-support/{setup-mirage-test.js => setup-mirage.js} (81%) diff --git a/addon-test-support/setup-mirage-test.js b/addon-test-support/setup-mirage.js similarity index 81% rename from addon-test-support/setup-mirage-test.js rename to addon-test-support/setup-mirage.js index 7f99613a1..221bda9e9 100644 --- a/addon-test-support/setup-mirage-test.js +++ b/addon-test-support/setup-mirage.js @@ -6,12 +6,14 @@ import startMirage from 'ember-cli-mirage/start-mirage'; // `this.server` to point to it, and shuts the server down when the test // finishes. // -export default function setupMirageTest(hooks) { +// NOTE: the `hooks = self` is for mocha support +// +export default function setupMirage(hooks = self) { hooks.beforeEach(function() { if (!this.owner) { throw new Error('You must call one of the ember-qunit setupTest(),' + ' setupRenderingTest() or setupApplicationTest() methods before' - + ' calling setupMirageTest()'); + + ' calling setupMirage()'); } this.server = startMirage(this.owner); diff --git a/addon/instance-initializers/ember-cli-mirage-autostart.js b/addon/instance-initializers/ember-cli-mirage-autostart.js index ae820768c..ad518d9fd 100644 --- a/addon/instance-initializers/ember-cli-mirage-autostart.js +++ b/addon/instance-initializers/ember-cli-mirage-autostart.js @@ -2,6 +2,18 @@ import EmberObject from '@ember/object'; import getRfc232TestContext from 'ember-cli-mirage/get-rfc232-test-context'; import startMirage from 'ember-cli-mirage/start-mirage'; +// An object we can register with the container to ensure that mirage is shut +// down when the application is destroyed +const MirageShutdown = EmberObject.extend({ + testContext: null, + + willDestroy() { + let testContext = this.get('testContext'); + testContext.server.shutdown(); + delete testContext.server; + } +}); + // // If we are running an rfc232/rfc268 test then we want to support the // `autostart` configuration option, which auto-starts mirage before the test @@ -34,13 +46,3 @@ export function initialize(appInstance) { export default { initialize }; - -const MirageShutdown = EmberObject.extend({ - testContext: null, - - willDestroy() { - let testContext = this.get('testContext'); - testContext.server.shutdown(); - delete testContext.server; - } -}); diff --git a/addon/start-mirage.js b/addon/start-mirage.js index 541726773..5078ef6be 100644 --- a/addon/start-mirage.js +++ b/addon/start-mirage.js @@ -1,15 +1,11 @@ -import Ember from 'ember'; +import { getWithDefault } from '@ember/object'; import readModules from 'ember-cli-mirage/utils/read-modules'; import Server from 'ember-cli-mirage/server'; import _assign from 'lodash/assign'; -const { - getWithDefault -} = Ember; - // // Helper to start mirage. This should not be called directly. In rfc232/rfc268 -// tests, use `setupMirageTest()` or the `autoboot` option in the addon config +// tests, use `setupMirage()` or the `autoboot` option in the addon config // in the environment. In legacy tests that call `startMirage` directly, this // should be called via the `startMirage` method exported from // `/initializers/ember-cli-mirage`. diff --git a/app/initializers/ember-cli-mirage.js b/app/initializers/ember-cli-mirage.js index 5e7aa932a..1ba0dfc0d 100644 --- a/app/initializers/ember-cli-mirage.js +++ b/app/initializers/ember-cli-mirage.js @@ -1,7 +1,7 @@ import ENV from '../config/environment'; import baseConfig, { testConfig } from '../mirage/config'; import getRfc232TestContext from 'ember-cli-mirage/get-rfc232-test-context'; -import newStartMirage from 'ember-cli-mirage/start-mirage'; +import startMirageImpl from 'ember-cli-mirage/start-mirage'; // // This initializer does two things: @@ -30,7 +30,7 @@ export default { }; export function startMirage(env = ENV) { - return newStartMirage(null, { env, baseConfig, testConfig }); + return startMirageImpl(null, { env, baseConfig, testConfig }); } function _shouldUseMirage(env, addonConfig) { diff --git a/tests/acceptance/start-mirage-test.js b/tests/acceptance/start-mirage-test.js index 9b0381110..e018625f2 100644 --- a/tests/acceptance/start-mirage-test.js +++ b/tests/acceptance/start-mirage-test.js @@ -3,7 +3,7 @@ import {module as qunitModule, test} from 'qunit'; import {setupTest} from 'ember-qunit'; import {visit, currentRouteName} from '@ember/test-helpers'; import startMirage from 'ember-cli-mirage/start-mirage'; -import setupMirageTest from 'ember-cli-mirage/test-support/setup-mirage-test'; +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import ENV from 'dummy/config/environment'; let module; @@ -52,8 +52,8 @@ module('Acceptance: Starting mirage', function(hooks) { assert.dom('p').hasText(`The contact is ${contact.name}`, 'The manually started server works'); }); - module('setupMirageTest()', function(hooks) { - setupMirageTest(hooks); + module('setupMirage()', function(hooks) { + setupMirage(hooks); test('it works', async function(assert) { assert.ok(this.server, 'There is a server'); From 9693d6e34ba1046c15604ea6970123508513dc1c Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 1 Mar 2018 16:42:17 -0500 Subject: [PATCH 147/879] Update changelog --- CHANGELOG.md | 43 +++++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bd2c22fa..3daab087d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,28 @@ # Ember CLI Mirage Changelog +## 0.4.2 + +- Adds support for new style (RFC232/RFC268) tests +- Parts of Mirage's factory layer that create data are faster +- Serializers support coalesced IDs +- Ensure JSONAPISerializer supports `include` as function +- Add support for `options` mocking + +### How it works in different types of tests + +* **Old-style non-acceptance tests**: mirage will not automatically start, and can still be manually started using the `startMirage()` import from `/initializers/ember-cli-mirage`. +* **Old-style acceptance tests**: mirage will still be started before each test by `/initializers/ember-cli-mirage` and shut down by the code that `ember-cli-mirage`'s blueprint adds to `destroyApp()`. +* **RFC232 and RFC268 tests**: `/initializers/ember-cli-mirage` will detect that it's an RFC232/RFC268 test and not start the mirage server automatically in the way that is problematic for the new tests, and since the new tests don't use `destroyApp()`, it's not at play either. So there are two options: + - In each test that needs it, the user can call `setupMirageTest()`, which will register `beforeEach`/`afterEach` hooks to set up and shut down the mirage server and make it accessible via `this.server` (and also the `server` global). + - The user can set `autostart: true` in their `ember-cli-mirage` config object in `config/environment` which will cause an instance initializer that runs before each test (**every** RFC232/RFC268 test, not just "acceptance" (application) tests) to start mirage and set it as `this.server` on the test context (and also the `server` global), and also register and create a singleton that, when destroyed during app shutdown, will shut down the mirage server. + +### Upgrade path + +This is **not** a breaking change -- existing tests will run just as they are once this PR is merged and released. Furthermore, new and old tests can live side by side and work properly with mirage if the right setup is done, so users are not forced to migrate their whole suite all at once. As they migrate tests, they have two options: + +* As non-acceptance tests are migrated, delete the manual starting/stopping of mirage in `beforeEach`/`afterEach` and replace it with a call to `setupMirageTest()` and continue using `this.server`. As acceptance tests are migrated, add a call to `setupMirageTest()` and optionally switch from using the `server` global to using `this.server`. +* Set `autostart: true` in `config/environment`, and then as non-acceptance tests are migrated, just delete the manual starting/stopping of the mirage server and continue using `this.server`. As acceptance tests are migrated, no changes are necessary, but users can optionally switch from using the `server` global to using `this.server`. + ## 0.4.1 Upgrade notes: none @@ -18,9 +41,9 @@ Upgrade notes: - There is one primary change that could break your app. In 0.3.x, Mirage's JSONAPISerializer included all related foreign keys whenever serializing a model or collection, even if those relationships were not `?included` in the payload. This actually goes against JSON:API's design. Foreign keys in the payload are known as [Resource Linkage](http://jsonapi.org/format/#document-resource-object-linkage) and are intended to be used by API clients to link together all resources in the JSON:API compound document. In fact, most server-side JSON:API libraries do not behave in this way, and only return linkage data for related resources when they are being included in a single document. - + By including linkage data for every relationship in 0.3, it was easy to develop Ember apps that would work with Mirage but would behave differently when hooked up to a standard JSON:API server. Since Mirage always included linkage data, an Ember app might automatically be able to fetch related resources using the ids from that linkage data plus its knowledge about the API. For example, if a `post` came back like this: - + ```js // GET /posts/1 { @@ -39,13 +62,13 @@ Upgrade notes: } } ``` - + and you forgot to `?include=author` in your GET request, Ember Data would potentially use the `user:1` foreign key and lazily fetch the `author` by making a request to `GET /authors/1`. This is problematic because - + 1. This is not how foreign keys are intended to be used 2. It'd be better to see no data and, to fix the problem, go back up to where you're loading the post and add `?include=author`, or 3. If you do want your interface to lazily load the author, use `links` instead of the linkage data: - + ```js // GET /posts/1 { @@ -63,13 +86,13 @@ Upgrade notes: } } ``` - + Resource links can be defined on Mirage serializers using the [links](http://www.ember-cli-mirage.com/docs/v0.3.x/serializers/#linksmodel) method (though `including` is likely the far more simpler and common approach to fetching related data). - + So, Mirage 0.4 changed this behavior and by default, the JSONAPISerializer only includes linkage data for relationships that are being included in the current payload (i.e. within the same compound document). - + This behavior is configurable via the `alwaysIncludeLinkageData` key on your JSONAPISerializers. It is set to `false` by default, but if you want to opt-in to 0.3 behavior and always include linkage data, set it to `true`: - + ```js // mirage/serializers/application.js import { JSONAPISerializer } from 'ember-cli-mirage'; @@ -78,7 +101,7 @@ Upgrade notes: alwaysIncludeLinkageData: true }); ``` - + If you do this, I would recommend looking closely at how your real server behaves when serializing resources' relationships and whether it uses resource `links` or resource linkage `data`, and to update your Mirage code accordingly to give you the most faithful representation of your server. - Support for Node 0.12 has been explicitly dropped from some of our dependencies From 49ca35cec7c9c7ee4c6a9c2cd2ed26a76e16174f Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 1 Mar 2018 16:43:03 -0500 Subject: [PATCH 148/879] 0.4.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f55104ba6..c0e2c4f7d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "0.4.1", + "version": "0.4.2", "description": "A client-side HTTP server to develop, test and demo your Ember app", "keywords": [ "ember-addon", From 1675bc797f70470cb4de4f0de3dea3672859dd71 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 8 Mar 2018 16:46:26 -0800 Subject: [PATCH 149/879] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index d34c069d3..269e2e209 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,12 @@ A client-side server to develop, test and prototype your Ember CLI app. ember install ember-cli-mirage ``` +## Feature requests + +I want to use Canny for feature requests, and keep GitHub issues to actionable items: bugs, and features that are currently being implemented. + +For feature requests, visit our [Canny board](https://ember-cli-mirage.canny.io/admin/board/feature-requests). + ## Support Having trouble? From 356444ac700d14ff2f28577acf4e2967e4e4184e Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 8 Mar 2018 16:47:31 -0800 Subject: [PATCH 150/879] Update ISSUE_TEMPLATE.md --- ISSUE_TEMPLATE.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index f4d6f10f7..9609a88d9 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -1,3 +1,5 @@ +> Is this a feature request? If so, please visit our [Canny board](https://ember-cli-mirage.canny.io/admin/board/feature-requests). + If possible, please use the Mirage Boilerplate Twiddle to demonstrate your issue or bug: - Open the Mirage Boilerplate Twiddle: https://ember-twiddle.com/eedfd390d8394d54d5bfd0ed988a5d0f?openFiles=templates.application.hbs%2C From 96dcbf6d9b4d11f43add33ca240724dd6f43cfab Mon Sep 17 00:00:00 2001 From: Ryan Toronto Date: Sun, 11 Mar 2018 11:37:36 -0700 Subject: [PATCH 151/879] Add inverse for polymorphic relationships Refactor the inverseFor code to run a different set of checks if the there is an explicit inverse defined. --- addon/orm/model.js | 41 ++++++++++++++++--- .../orm/schema-verification/mixed-test.js | 38 +++++++++++++++++ 2 files changed, 74 insertions(+), 5 deletions(-) diff --git a/addon/orm/model.js b/addon/orm/model.js index 7a9dae044..b6e44a864 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -231,28 +231,59 @@ class Model { * @public */ inverseFor(association) { + return this._explicitInverseFor(association) || this._implicitInverseFor(association); + } + + /** + * Finds the inverse for an association that explicity defines it's inverse + * + * @private + */ + _explicitInverseFor(association) { + let associations = this.schema.associationsFor(this.modelName); + let inverse = association.opts.inverse; + let candidate = inverse ? associations[inverse] : null; + let matchingPolymorphic = candidate && candidate.isPolymorphic; + let matchingInverse = candidate && candidate.modelName === association.ownerModelName; + let candidateInverse = candidate && candidate.opts.inverse; + + if (candidateInverse && candidate.opts.inverse !== association.key) { + assert( + false, + `You specified an inverse of ${inverse} for ${association.key}, but it does not match ${candidate.modelName} ${candidate.key}'s inverse` + ); + } + + return matchingPolymorphic || matchingInverse ? candidate : null; + } + + /** + * Finds if there is an inverse for an association that does not + * explicitly define one. + * + * @private + */ + _implicitInverseFor(association) { let associations = this.schema.associationsFor(this.modelName); let modelName = association.ownerModelName; - let theInverse = _values(associations) + return _values(associations) .filter(candidate => candidate.modelName === modelName) .reduce((inverse, candidate) => { let candidateInverse = candidate.opts.inverse; let candidateIsImplicitInverse = candidateInverse === undefined; - let candidateIsExplicitInverse = (candidateInverse === association.key); + let candidateIsExplicitInverse = candidateInverse === association.key; + let candidateMatches = candidateIsImplicitInverse || candidateIsExplicitInverse; if (candidateMatches) { // Need to move this check to compile-time init assert(!inverse, `The ${this.modelName} model has multiple possible inverse associations for the ${association.key} association on the ${association.ownerModelName} model.`); - inverse = candidate; } return inverse; }, null); - - return theInverse; } /** diff --git a/tests/integration/orm/schema-verification/mixed-test.js b/tests/integration/orm/schema-verification/mixed-test.js index 52a277ebf..967f44a05 100644 --- a/tests/integration/orm/schema-verification/mixed-test.js +++ b/tests/integration/orm/schema-verification/mixed-test.js @@ -122,4 +122,42 @@ module('Integration | ORM | Schema Verification | Mixed', function() { assert.deepEqual(frodo.inverseFor(parentAssociation), frodo.associationFor('children')); }); + + test('one-to-many polymorphic association is correct', function(assert) { + let schema = new Schema(new Db({ + authors: [ + { id: 1, name: 'Peter' } + ], + posts: [ + { id: 1, title: 'Lorem' } + ], + articles: [ + { id: 1, title: 'Ipsum' } + ] + }), { + author: Model.extend({ + writings: hasMany({ polymorphic: true }) + }), + post: Model.extend({ + author: belongsTo('author', { inverse: 'writings' }) + }), + article: Model.extend({ + author: belongsTo('author', { inverse: 'writings' }) + }) + }); + + let author = schema.authors.find(1); + let writingsAssociation = author.associationFor('writings'); + + let post = schema.posts.find(1); + let postAuthorAssociation = post.associationFor('author'); + + let article = schema.articles.find(1); + let articleAuthorAssociation = article.associationFor('author'); + + assert.deepEqual(post.inverseFor(writingsAssociation), postAuthorAssociation); + assert.deepEqual(article.inverseFor(writingsAssociation), articleAuthorAssociation); + assert.deepEqual(author.inverseFor(postAuthorAssociation), writingsAssociation); + assert.deepEqual(author.inverseFor(postAuthorAssociation), writingsAssociation); + }); }); From 44499a0f679e6ba87fd3d8831e8a91ebec046664 Mon Sep 17 00:00:00 2001 From: Ryan Toronto Date: Sun, 11 Mar 2018 13:22:20 -0700 Subject: [PATCH 152/879] Test that inverse does not already contain record --- addon/orm/model.js | 13 +++++++++++-- .../orm/mixed/3-one-to-many-polymorphic/_helper.js | 2 +- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/addon/orm/model.js b/addon/orm/model.js index b6e44a864..25bcca500 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -742,9 +742,18 @@ class Model { let inverseCollection = this.schema.db[toInternalCollectionName(model.modelName)]; let currentIdsForInverse = inverseCollection.find(model.id)[inverse.getForeignKey()] || []; let newIdsForInverse = _assign([], currentIdsForInverse); + let newId, alreadyAssociatedWith; - if (newIdsForInverse.indexOf(ownerId) === -1) { - newIdsForInverse.push(ownerId); + if (inverse.isPolymorphic) { + newId = { type: this.modelName, id: ownerId }; + alreadyAssociatedWith = newIdsForInverse.some(key => (key.type == this.modelName && key.id == ownerId)); + } else { + newId = ownerId; + alreadyAssociatedWith = newIdsForInverse.indexOf(ownerId) !== -1; + } + + if (!alreadyAssociatedWith) { + newIdsForInverse.push(newId); } inverseCollection.update(model.id, { [inverseFk]: newIdsForInverse }); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/_helper.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/_helper.js index 4552955c9..fb9065896 100644 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/_helper.js +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/_helper.js @@ -23,7 +23,7 @@ export default class Helper { things: hasMany({ polymorphic: true }) }), post: Model.extend({ - user: belongsTo() + user: belongsTo({ inverse: 'things' }) }) }); } From 6249671e80f2f0a5ad94258295ed783a280998ae Mon Sep 17 00:00:00 2001 From: Nick Pafundi Date: Tue, 25 Jul 2017 15:20:28 -0700 Subject: [PATCH 153/879] Fix serialization of sideloaded associations with embedded associations Consider the following models, and note the serialization method: ``` // User (serializer sideloads posts) export default Model.extend({ posts: hasMany('post') }); // Post (serializer embeds comments) export default Model.extend({ authors: hasMany('user') comments: hasMany('comments') }); // Comment export default Model.extend({ post: belongsTo('post') }); ``` Assuming we have populated our database and we serialize a user, the resulting serialization may look like this: ``` { user: { id: '1', name: 'John', postIds: ['1', '2'] }, posts: [ { id: '1', title: 'Lorem', comments: [{ id: '1', text: 'first' }] }, { id: '2', title: 'Ipsum', comments: [] } ] } ``` Currently, there is a bug in Mirage which causes an error to be thrown when attempting this kind of serialization: `TypeError: Cannot read property 'filter' of undefined` This commit fixes the bug, and adds multiples tests to ensure proper serialization. --- addon/serializer.js | 2 +- .../sideloading-collection-test.js | 57 +++++++++++++++++++ .../associations/sideloading-model-test.js | 57 +++++++++++++++++++ 3 files changed, 115 insertions(+), 1 deletion(-) diff --git a/addon/serializer.js b/addon/serializer.js index fa55262bf..9de8e9c22 100644 --- a/addon/serializer.js +++ b/addon/serializer.js @@ -113,7 +113,7 @@ class Serializer { } if (this.embed) { - return [hash]; + return [hash, []]; } else { let addToIncludes = _(serializer.getKeysForIncluded()) diff --git a/tests/integration/serializers/base/associations/sideloading-collection-test.js b/tests/integration/serializers/base/associations/sideloading-collection-test.js index d934793d9..2c800fccf 100644 --- a/tests/integration/serializers/base/associations/sideloading-collection-test.js +++ b/tests/integration/serializers/base/associations/sideloading-collection-test.js @@ -125,6 +125,35 @@ module('Integration | Serializers | Base | Associations | Sideloading Collection }); }); + test(`it can sideload a collection with a has-many relationship containing embedded models`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + embed: false, + include: ["posts"] + }), + blogPost: this.BaseSerializer.extend({ + embed: true, + include: ["comments"] + }) + }); + + let wordSmiths = this.schema.wordSmiths.all(); + let result = registry.serialize(wordSmiths); + + assert.deepEqual(result, { + wordSmiths: [ + { id: "1", name: "Link", postIds: ["1", "2"] }, + { id: "2", name: "Zelda", postIds: ["3"] } + ], + blogPosts: [ + { id: "1", title: "Lorem", comments: [{ id: "1", text: "pwned" }] }, + { id: "2", title: "Ipsum", comments: [] }, + { id: "3", title: "Zeldas blogPost", comments: [] } + ] + }); + }); + test(`it avoids circularity when serializing a collection`, function(assert) { let registry = new SerializerRegistry(this.schema, { application: this.BaseSerializer, @@ -205,4 +234,32 @@ module('Integration | Serializers | Base | Associations | Sideloading Collection ] }); }); + + test(`it can sideload a collection with a belongs-to relationship containing embedded models`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + fineComment: this.BaseSerializer.extend({ + embed: false, + include: ["post"] + }), + blogPost: this.BaseSerializer.extend({ + embed: true, + include: ["author"] + }) + }); + + let fineComments = this.schema.fineComments.all(); + let result = registry.serialize(fineComments); + + assert.deepEqual(result, { + fineComments: [{ id: "1", text: "pwned", postId: "1" }], + blogPosts: [ + { + id: "1", + title: "Lorem", + author: { id: "1", name: "Link" } + } + ] + }); + }); }); diff --git a/tests/integration/serializers/base/associations/sideloading-model-test.js b/tests/integration/serializers/base/associations/sideloading-model-test.js index aa8bd8b7a..0f793473d 100644 --- a/tests/integration/serializers/base/associations/sideloading-model-test.js +++ b/tests/integration/serializers/base/associations/sideloading-model-test.js @@ -106,6 +106,35 @@ module('Integration | Serializers | Base | Associations | Sideloading Models', f }); }); + test(`it can sideload a model with a has-many relationship containing embedded models`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + embed: false, + include: ["posts"] + }), + blogPost: this.BaseSerializer.extend({ + embed: true, + include: ["comments"] + }) + }); + + let link = this.schema.wordSmiths.find(1); + let result = registry.serialize(link); + + assert.deepEqual(result, { + wordSmith: { + id: "1", + name: "Link", + postIds: ["1", "2"] + }, + blogPosts: [ + { id: "1", title: "Lorem", comments: [{ id: "1", text: "pwned" }] }, + { id: "2", title: "Ipsum", comments: [] } + ] + }); + }); + test(`it avoids circularity when serializing a model`, function(assert) { let registry = new SerializerRegistry(this.schema, { application: this.BaseSerializer, @@ -180,4 +209,32 @@ module('Integration | Serializers | Base | Associations | Sideloading Models', f ] }); }); + + test(`it can sideload a model with a belongs-to relationship containing embedded models`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + fineComment: this.BaseSerializer.extend({ + embed: false, + include: ["post"] + }), + blogPost: this.BaseSerializer.extend({ + embed: true, + include: ["author"] + }) + }); + + let fineComment = this.schema.fineComments.find(1); + let result = registry.serialize(fineComment); + + assert.deepEqual(result, { + fineComment: { id: "1", text: "pwned", postId: "1" }, + blogPosts: [ + { + id: "1", + title: "Lorem", + author: { id: "1", name: "Link" } + } + ] + }); + }); }); From 0f1b4159b6a18184b889c41f2190b69630ff61bb Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 19 Mar 2018 17:04:29 -0400 Subject: [PATCH 154/879] Fix sideloaded-and-embedded serializer use case --- ...ideloading-and-embedded-collection-test.js | 97 +++++++++++++++++++ .../sideloading-and-embedded-model-test.js | 96 ++++++++++++++++++ .../sideloading-collection-test.js | 56 ----------- .../associations/sideloading-model-test.js | 57 ----------- 4 files changed, 193 insertions(+), 113 deletions(-) create mode 100644 tests/integration/serializers/base/associations/sideloading-and-embedded-collection-test.js create mode 100644 tests/integration/serializers/base/associations/sideloading-and-embedded-model-test.js diff --git a/tests/integration/serializers/base/associations/sideloading-and-embedded-collection-test.js b/tests/integration/serializers/base/associations/sideloading-and-embedded-collection-test.js new file mode 100644 index 000000000..22a199f81 --- /dev/null +++ b/tests/integration/serializers/base/associations/sideloading-and-embedded-collection-test.js @@ -0,0 +1,97 @@ +import Schema from 'ember-cli-mirage/orm/schema'; +import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; +import Db from 'ember-cli-mirage/db'; +import Serializer from 'ember-cli-mirage/serializer'; +import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; +import { module, test } from 'qunit'; + +module('Integration | Serializers | Base | Associations | Sideloading and Embedded Collections', function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + posts: hasMany('blog-post') + }), + blogPost: Model.extend({ + author: belongsTo('word-smith'), + comments: hasMany('fine-comment') + }), + fineComment: Model.extend({ + post: belongsTo('blog-post') + }) + }); + + let link = this.schema.wordSmiths.create({ name: 'Link' }); + let blogPost = link.createPost({ title: 'Lorem' }); + link.createPost({ title: 'Ipsum' }); + + blogPost.createComment({ text: 'pwned' }); + + let zelda = this.schema.wordSmiths.create({ name: 'Zelda' }); + zelda.createPost({ title: `Zeldas blogPost` }); + + this.BaseSerializer = Serializer.extend({ + embed: false + }); + }); + + hooks.afterEach(function() { + this.schema.db.emptyData(); + }); + + test(`it can sideload a collection with a has-many relationship containing embedded models`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + embed: false, + include: ["posts"] + }), + blogPost: this.BaseSerializer.extend({ + embed: true, + include: ["comments"] + }) + }); + + let wordSmiths = this.schema.wordSmiths.all(); + let result = registry.serialize(wordSmiths); + + assert.deepEqual(result, { + wordSmiths: [ + { id: "1", name: "Link", postIds: ["1", "2"] }, + { id: "2", name: "Zelda", postIds: ["3"] } + ], + blogPosts: [ + { id: "1", title: "Lorem", comments: [{ id: "1", text: "pwned" }] }, + { id: "2", title: "Ipsum", comments: [] }, + { id: "3", title: "Zeldas blogPost", comments: [] } + ] + }); + }); + + test(`it can sideload a collection with a belongs-to relationship containing embedded models`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + fineComment: this.BaseSerializer.extend({ + embed: false, + include: ["post"] + }), + blogPost: this.BaseSerializer.extend({ + embed: true, + include: ["author"] + }) + }); + + let fineComments = this.schema.fineComments.all(); + let result = registry.serialize(fineComments); + + assert.deepEqual(result, { + fineComments: [{ id: "1", text: "pwned", postId: "1" }], + blogPosts: [ + { + id: "1", + title: "Lorem", + author: { id: "1", name: "Link" } + } + ] + }); + }); +}); diff --git a/tests/integration/serializers/base/associations/sideloading-and-embedded-model-test.js b/tests/integration/serializers/base/associations/sideloading-and-embedded-model-test.js new file mode 100644 index 000000000..eb116b044 --- /dev/null +++ b/tests/integration/serializers/base/associations/sideloading-and-embedded-model-test.js @@ -0,0 +1,96 @@ +import Schema from 'ember-cli-mirage/orm/schema'; +import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; +import Db from 'ember-cli-mirage/db'; +import Serializer from 'ember-cli-mirage/serializer'; +import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; +import { module, test } from 'qunit'; + +module('Integration | Serializers | Base | Associations | Sideloading and Embedded Models', function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + posts: hasMany('blog-post') + }), + blogPost: Model.extend({ + author: belongsTo('word-smith'), + comments: hasMany('fine-comment') + }), + fineComment: Model.extend({ + post: belongsTo('blog-post') + }) + }); + + let wordSmith = this.schema.wordSmiths.create({ name: 'Link' }); + let blogPost = wordSmith.createPost({ title: 'Lorem' }); + blogPost.createComment({ text: 'pwned' }); + + wordSmith.createPost({ title: 'Ipsum' }); + + this.schema.wordSmiths.create({ name: 'Zelda' }); + + this.BaseSerializer = Serializer.extend({ + embed: false + }); + }); + + hooks.afterEach(function() { + this.schema.db.emptyData(); + }); + + test(`it can sideload a model with a has-many relationship containing embedded models`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + wordSmith: this.BaseSerializer.extend({ + embed: false, + include: ["posts"] + }), + blogPost: this.BaseSerializer.extend({ + embed: true, + include: ["comments"] + }) + }); + + let link = this.schema.wordSmiths.find(1); + let result = registry.serialize(link); + + assert.deepEqual(result, { + wordSmith: { + id: "1", + name: "Link", + postIds: ["1", "2"] + }, + blogPosts: [ + { id: "1", title: "Lorem", comments: [{ id: "1", text: "pwned" }] }, + { id: "2", title: "Ipsum", comments: [] } + ] + }); + }); + + test(`it can sideload a model with a belongs-to relationship containing embedded models`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + fineComment: this.BaseSerializer.extend({ + embed: false, + include: ["post"] + }), + blogPost: this.BaseSerializer.extend({ + embed: true, + include: ["author"] + }) + }); + + let fineComment = this.schema.fineComments.find(1); + let result = registry.serialize(fineComment); + + assert.deepEqual(result, { + fineComment: { id: "1", text: "pwned", postId: "1" }, + blogPosts: [ + { + id: "1", + title: "Lorem", + author: { id: "1", name: "Link" } + } + ] + }); + }); +}); diff --git a/tests/integration/serializers/base/associations/sideloading-collection-test.js b/tests/integration/serializers/base/associations/sideloading-collection-test.js index 2c800fccf..145342dd0 100644 --- a/tests/integration/serializers/base/associations/sideloading-collection-test.js +++ b/tests/integration/serializers/base/associations/sideloading-collection-test.js @@ -125,35 +125,6 @@ module('Integration | Serializers | Base | Associations | Sideloading Collection }); }); - test(`it can sideload a collection with a has-many relationship containing embedded models`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - embed: false, - include: ["posts"] - }), - blogPost: this.BaseSerializer.extend({ - embed: true, - include: ["comments"] - }) - }); - - let wordSmiths = this.schema.wordSmiths.all(); - let result = registry.serialize(wordSmiths); - - assert.deepEqual(result, { - wordSmiths: [ - { id: "1", name: "Link", postIds: ["1", "2"] }, - { id: "2", name: "Zelda", postIds: ["3"] } - ], - blogPosts: [ - { id: "1", title: "Lorem", comments: [{ id: "1", text: "pwned" }] }, - { id: "2", title: "Ipsum", comments: [] }, - { id: "3", title: "Zeldas blogPost", comments: [] } - ] - }); - }); - test(`it avoids circularity when serializing a collection`, function(assert) { let registry = new SerializerRegistry(this.schema, { application: this.BaseSerializer, @@ -235,31 +206,4 @@ module('Integration | Serializers | Base | Associations | Sideloading Collection }); }); - test(`it can sideload a collection with a belongs-to relationship containing embedded models`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - fineComment: this.BaseSerializer.extend({ - embed: false, - include: ["post"] - }), - blogPost: this.BaseSerializer.extend({ - embed: true, - include: ["author"] - }) - }); - - let fineComments = this.schema.fineComments.all(); - let result = registry.serialize(fineComments); - - assert.deepEqual(result, { - fineComments: [{ id: "1", text: "pwned", postId: "1" }], - blogPosts: [ - { - id: "1", - title: "Lorem", - author: { id: "1", name: "Link" } - } - ] - }); - }); }); diff --git a/tests/integration/serializers/base/associations/sideloading-model-test.js b/tests/integration/serializers/base/associations/sideloading-model-test.js index 0f793473d..aa8bd8b7a 100644 --- a/tests/integration/serializers/base/associations/sideloading-model-test.js +++ b/tests/integration/serializers/base/associations/sideloading-model-test.js @@ -106,35 +106,6 @@ module('Integration | Serializers | Base | Associations | Sideloading Models', f }); }); - test(`it can sideload a model with a has-many relationship containing embedded models`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - embed: false, - include: ["posts"] - }), - blogPost: this.BaseSerializer.extend({ - embed: true, - include: ["comments"] - }) - }); - - let link = this.schema.wordSmiths.find(1); - let result = registry.serialize(link); - - assert.deepEqual(result, { - wordSmith: { - id: "1", - name: "Link", - postIds: ["1", "2"] - }, - blogPosts: [ - { id: "1", title: "Lorem", comments: [{ id: "1", text: "pwned" }] }, - { id: "2", title: "Ipsum", comments: [] } - ] - }); - }); - test(`it avoids circularity when serializing a model`, function(assert) { let registry = new SerializerRegistry(this.schema, { application: this.BaseSerializer, @@ -209,32 +180,4 @@ module('Integration | Serializers | Base | Associations | Sideloading Models', f ] }); }); - - test(`it can sideload a model with a belongs-to relationship containing embedded models`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - fineComment: this.BaseSerializer.extend({ - embed: false, - include: ["post"] - }), - blogPost: this.BaseSerializer.extend({ - embed: true, - include: ["author"] - }) - }); - - let fineComment = this.schema.fineComments.find(1); - let result = registry.serialize(fineComment); - - assert.deepEqual(result, { - fineComment: { id: "1", text: "pwned", postId: "1" }, - blogPosts: [ - { - id: "1", - title: "Lorem", - author: { id: "1", name: "Link" } - } - ] - }); - }); }); From 06a5e9520383b496435c12ef155553be6771a391 Mon Sep 17 00:00:00 2001 From: Nick Pafundi Date: Tue, 25 Jul 2017 12:44:37 -0700 Subject: [PATCH 155/879] Improve detection/determination of inverse associations `inverseFor` currently throws an error when there are multiple potential inverse associations defined, unless they are all explicit. It is possible to have multiple explicit and implicit inverses on the same model, and still detect the correct associations. Consider the following example: ``` // User posts: belongsTo('post', { inverse: 'authors' }) // Post authors: hasMany('user', { inverse: 'posts' }), editor: belongsTo('user'), ``` `user.posts` is explicitly defined as the inverse of `post.authors` (and vice-versa), so we know these are meant to be inverse associations. This commit updates `inverseFor` to first choose the explicit inverse (if provided), before defaulting to implicit inverses. It will also throw an error if multiple explicit inverses are defined with the same key, or if multiple implicit inverses are defined. --- .../orm/schema-verification/mixed-test.js | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/tests/integration/orm/schema-verification/mixed-test.js b/tests/integration/orm/schema-verification/mixed-test.js index 967f44a05..afc132df4 100644 --- a/tests/integration/orm/schema-verification/mixed-test.js +++ b/tests/integration/orm/schema-verification/mixed-test.js @@ -161,3 +161,87 @@ module('Integration | ORM | Schema Verification | Mixed', function() { assert.deepEqual(author.inverseFor(postAuthorAssociation), writingsAssociation); }); }); + +test('multiple implicit inverse associations with the same key throws an error', function(assert) { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ], + posts: [ + { id: 1, title: 'Lorem' } + ] + }), { + user: Model.extend({ + posts: hasMany('post') + }), + post: Model.extend({ + editor: belongsTo('user'), + authors: hasMany('user') + }) + }); + + let frodo = schema.users.find(1); + let userPostsAssociation = frodo.associationFor('posts'); + let post = schema.posts.find(1); + + assert.throws(function() { + post.inverseFor(userPostsAssociation); + }, /The post model has multiple possible inverse associations for the user.posts association./); +}); + +test('multiple explicit inverse associations with the same key throws an error', function(assert) { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ], + posts: [ + { id: 1, title: 'Lorem' } + ] + }), { + user: Model.extend({ + posts: hasMany('post', { inverse: 'authors' }) + }), + post: Model.extend({ + editor: belongsTo('user', { inverse: 'posts' }), + authors: hasMany('user', { inverse: 'posts' }) + }) + }); + + let frodo = schema.users.find(1); + let userPostsAssociation = frodo.associationFor('posts'); + let post = schema.posts.find(1); + + assert.throws(function() { + post.inverseFor(userPostsAssociation); + }, /The post model has defined multiple explicit inverse associations for the user.posts association./); +}); + +test('explicit inverse is chosen over implicit inverses', function(assert) { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ], + posts: [ + { id: 1, title: 'Lorem' } + ] + }), { + user: Model.extend({ + posts: hasMany('post', { inverse: 'authors' }) + }), + post: Model.extend({ + editor: belongsTo('user'), + authors: hasMany('user', { inverse: 'posts' }) + }) + }); + + let frodo = schema.users.find(1); + let userPostsAssociation = frodo.associationFor('posts'); + + assert.equal(userPostsAssociation.key, 'posts'); + assert.equal(userPostsAssociation.modelName, 'post'); + assert.equal(userPostsAssociation.ownerModelName, 'user'); + + let post = schema.posts.find(1); + + assert.deepEqual(post.inverseFor(userPostsAssociation), post.associationFor('authors')); +}); From 7645cf55f34eddca21476881bcad915de6eb22e6 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 20 Mar 2018 14:29:34 -0400 Subject: [PATCH 156/879] Rebase on master, tidy up code --- addon/orm/model.js | 27 +++- .../orm/schema-verification/mixed-test.js | 144 +++++++++--------- 2 files changed, 98 insertions(+), 73 deletions(-) diff --git a/addon/orm/model.js b/addon/orm/model.js index 25bcca500..ff0688a43 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -240,6 +240,8 @@ class Model { * @private */ _explicitInverseFor(association) { + this._checkForMultipleExplicitInverses(association); + let associations = this.schema.associationsFor(this.modelName); let inverse = association.opts.inverse; let candidate = inverse ? associations[inverse] : null; @@ -257,6 +259,29 @@ class Model { return matchingPolymorphic || matchingInverse ? candidate : null; } + /** + * Ensures multiple explicit inverses don't exist on the current model + * for the given association. + * + * TODO: move this to compile-time check + * + * @private + */ + _checkForMultipleExplicitInverses(association) { + let associations = this.schema.associationsFor(this.modelName); + let matchingExplicitInverses = Object.keys(associations).filter(key => { + let candidate = associations[key]; + let modelMatches = association.modelName === candidate.ownerModelName; + let inverseKeyMatches = association.key === candidate.opts.inverse; + + return modelMatches && inverseKeyMatches; + }); + assert( + matchingExplicitInverses.length <= 1, + `The ${this.modelName} model has defined multiple explicit inverse associations for the ${association.ownerModelName}.${association.key} association.` + ); + } + /** * Finds if there is an inverse for an association that does not * explicitly define one. @@ -278,7 +303,7 @@ class Model { if (candidateMatches) { // Need to move this check to compile-time init - assert(!inverse, `The ${this.modelName} model has multiple possible inverse associations for the ${association.key} association on the ${association.ownerModelName} model.`); + assert(!inverse, `The ${this.modelName} model has multiple possible inverse associations for the ${association.ownerModelName}.${association.key} association.`); inverse = candidate; } diff --git a/tests/integration/orm/schema-verification/mixed-test.js b/tests/integration/orm/schema-verification/mixed-test.js index afc132df4..904919e12 100644 --- a/tests/integration/orm/schema-verification/mixed-test.js +++ b/tests/integration/orm/schema-verification/mixed-test.js @@ -160,88 +160,88 @@ module('Integration | ORM | Schema Verification | Mixed', function() { assert.deepEqual(author.inverseFor(postAuthorAssociation), writingsAssociation); assert.deepEqual(author.inverseFor(postAuthorAssociation), writingsAssociation); }); -}); - -test('multiple implicit inverse associations with the same key throws an error', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ], - posts: [ - { id: 1, title: 'Lorem' } - ] - }), { - user: Model.extend({ - posts: hasMany('post') - }), - post: Model.extend({ - editor: belongsTo('user'), - authors: hasMany('user') - }) - }); - let frodo = schema.users.find(1); - let userPostsAssociation = frodo.associationFor('posts'); - let post = schema.posts.find(1); + test('multiple implicit inverse associations with the same key throws an error', function(assert) { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ], + posts: [ + { id: 1, title: 'Lorem' } + ] + }), { + user: Model.extend({ + posts: hasMany('post') + }), + post: Model.extend({ + editor: belongsTo('user'), + authors: hasMany('user') + }) + }); - assert.throws(function() { - post.inverseFor(userPostsAssociation); - }, /The post model has multiple possible inverse associations for the user.posts association./); -}); + let frodo = schema.users.find(1); + let userPostsAssociation = frodo.associationFor('posts'); + let post = schema.posts.find(1); -test('multiple explicit inverse associations with the same key throws an error', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ], - posts: [ - { id: 1, title: 'Lorem' } - ] - }), { - user: Model.extend({ - posts: hasMany('post', { inverse: 'authors' }) - }), - post: Model.extend({ - editor: belongsTo('user', { inverse: 'posts' }), - authors: hasMany('user', { inverse: 'posts' }) - }) + assert.throws(function() { + post.inverseFor(userPostsAssociation); + }, /The post model has multiple possible inverse associations for the user.posts association./); }); - let frodo = schema.users.find(1); - let userPostsAssociation = frodo.associationFor('posts'); - let post = schema.posts.find(1); + test('multiple explicit inverse associations with the same key throws an error', function(assert) { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ], + posts: [ + { id: 1, title: 'Lorem' } + ] + }), { + user: Model.extend({ + posts: hasMany('post', { inverse: 'authors' }) + }), + post: Model.extend({ + editor: belongsTo('user', { inverse: 'posts' }), + authors: hasMany('user', { inverse: 'posts' }) + }) + }); - assert.throws(function() { - post.inverseFor(userPostsAssociation); - }, /The post model has defined multiple explicit inverse associations for the user.posts association./); -}); + let frodo = schema.users.find(1); + let userPostsAssociation = frodo.associationFor('posts'); + let post = schema.posts.find(1); -test('explicit inverse is chosen over implicit inverses', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ], - posts: [ - { id: 1, title: 'Lorem' } - ] - }), { - user: Model.extend({ - posts: hasMany('post', { inverse: 'authors' }) - }), - post: Model.extend({ - editor: belongsTo('user'), - authors: hasMany('user', { inverse: 'posts' }) - }) + assert.throws(function() { + post.inverseFor(userPostsAssociation); + }, /The post model has defined multiple explicit inverse associations for the user.posts association./); }); - let frodo = schema.users.find(1); - let userPostsAssociation = frodo.associationFor('posts'); + test('explicit inverse is chosen over implicit inverses', function(assert) { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ], + posts: [ + { id: 1, title: 'Lorem' } + ] + }), { + user: Model.extend({ + posts: hasMany('post', { inverse: 'authors' }) + }), + post: Model.extend({ + editor: belongsTo('user'), + authors: hasMany('user', { inverse: 'posts' }) + }) + }); + + let frodo = schema.users.find(1); + let userPostsAssociation = frodo.associationFor('posts'); - assert.equal(userPostsAssociation.key, 'posts'); - assert.equal(userPostsAssociation.modelName, 'post'); - assert.equal(userPostsAssociation.ownerModelName, 'user'); + assert.equal(userPostsAssociation.key, 'posts'); + assert.equal(userPostsAssociation.modelName, 'post'); + assert.equal(userPostsAssociation.ownerModelName, 'user'); - let post = schema.posts.find(1); + let post = schema.posts.find(1); - assert.deepEqual(post.inverseFor(userPostsAssociation), post.associationFor('authors')); + assert.deepEqual(post.inverseFor(userPostsAssociation), post.associationFor('authors')); + }); }); From 5cfbf269b519309603404500bc8900c2e280f9bc Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 20 Mar 2018 22:01:47 -0400 Subject: [PATCH 157/879] Update chnagelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3daab087d..e71545aa1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Ember CLI Mirage Changelog +## 0.4.3 + +- Improve detection of model inverses +- Fix a bug related to serializing responsese that are both sideloaded and embedded + + ## 0.4.2 - Adds support for new style (RFC232/RFC268) tests From a71f5ff2407addea1f88b61c34d197a5f1524ad0 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 20 Mar 2018 22:01:50 -0400 Subject: [PATCH 158/879] 0.4.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c0e2c4f7d..c3bef1fca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "0.4.2", + "version": "0.4.3", "description": "A client-side HTTP server to develop, test and demo your Ember app", "keywords": [ "ember-addon", From 0f145c33b01c56a19ee1829420826aa4c41298f7 Mon Sep 17 00:00:00 2001 From: Chuck Carpenter Date: Sat, 24 Mar 2018 09:40:22 -0400 Subject: [PATCH 159/879] [1223] - fix to allow null value for belongsTo and test (#1289) * fix to allow null value for belongsTo and test * remove unused import * update expected test results --- addon/serializer.js | 2 +- .../base/associations/embedded-model-test.js | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/addon/serializer.js b/addon/serializer.js index 9de8e9c22..a69de6b6c 100644 --- a/addon/serializer.js +++ b/addon/serializer.js @@ -221,7 +221,7 @@ class Serializer { this.getKeysForIncluded().forEach((key) => { let associatedResource = model[key]; - if (!_get(newDidSerialize, `${associatedResource.modelName}.${associatedResource.id}`)) { + if (associatedResource && !_get(newDidSerialize, `${associatedResource.modelName}.${associatedResource.id}`)) { let [ associatedResourceHash ] = this.getHashForResource(associatedResource, true, newDidSerialize, true); let formattedKey = this.keyForEmbeddedRelationship(key); attrs[formattedKey] = associatedResourceHash; diff --git a/tests/integration/serializers/base/associations/embedded-model-test.js b/tests/integration/serializers/base/associations/embedded-model-test.js index 91d07e0ac..10cabaef5 100644 --- a/tests/integration/serializers/base/associations/embedded-model-test.js +++ b/tests/integration/serializers/base/associations/embedded-model-test.js @@ -138,6 +138,27 @@ module('Integration | Serializers | Base | Associations | Embedded Models', func }); }); + test(`it can have a null value on a belongs-to relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + blogPost: this.BaseSerializer.extend({ + embed: true, + include: ['author'] + }) + }); + + let blogPost = this.schema.blogPosts.find(1); + blogPost.update('author', null); + let result = registry.serialize(blogPost); + + assert.deepEqual(result, { + blogPost: { + id: '1', + title: 'Lorem' + } + }); + }); + test(`it ignores relationships that refer to serialized ancestor resources`, function(assert) { let registry = new SerializerRegistry(this.schema, { application: this.BaseSerializer, From 8654bcaa28a87c529efa216d601ddc96c7952f8a Mon Sep 17 00:00:00 2001 From: Ben Demboski Date: Mon, 2 Apr 2018 03:11:18 -0700 Subject: [PATCH 160/879] Revert initializer name (#1291) I didn't mean to change this, and it breaks apps that have initializers that reference this one in their `before` or `after` fields. --- app/initializers/ember-cli-mirage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/initializers/ember-cli-mirage.js b/app/initializers/ember-cli-mirage.js index 1ba0dfc0d..cd05f7ac3 100644 --- a/app/initializers/ember-cli-mirage.js +++ b/app/initializers/ember-cli-mirage.js @@ -13,7 +13,7 @@ import startMirageImpl from 'ember-cli-mirage/start-mirage'; // tests. // export default { - name: 'ember-cli-mirage-config', + name: 'ember-cli-mirage', initialize(application) { if (baseConfig) { application.register('mirage:base-config', baseConfig, { instantiate: false }); From 031dc765be7c4474ea7af14f1292c46d8147dc77 Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Tue, 27 Mar 2018 12:13:20 -0700 Subject: [PATCH 161/879] Add method to return empty collection for type --- addon/orm/schema.js | 10 ++++++++++ tests/integration/orm/none-test.js | 29 +++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 tests/integration/orm/none-test.js diff --git a/addon/orm/schema.js b/addon/orm/schema.js index 7fffef9bd..c282c3ba0 100644 --- a/addon/orm/schema.js +++ b/addon/orm/schema.js @@ -107,6 +107,7 @@ export default class Schema { find: (attrs) => this.find(camelizedModelName, attrs), findBy: (attrs) => this.findBy(camelizedModelName, attrs), where: (attrs) => this.where(camelizedModelName, attrs), + none: (attrs) => this.none(camelizedModelName, attrs), first: (attrs) => this.first(camelizedModelName, attrs) }; @@ -153,6 +154,15 @@ export default class Schema { return this._hydrate(collection, dasherize(type)); } + /** + * @method none + * @param type + * @public + */ + none(type) { + return this._hydrate([], dasherize(type)); + } + /** * @method find * @param type diff --git a/tests/integration/orm/none-test.js b/tests/integration/orm/none-test.js new file mode 100644 index 000000000..c7e9c0337 --- /dev/null +++ b/tests/integration/orm/none-test.js @@ -0,0 +1,29 @@ +import Schema from 'ember-cli-mirage/orm/schema'; +import Model from 'ember-cli-mirage/orm/model'; +import Db from 'ember-cli-mirage/db'; +import Collection from 'ember-cli-mirage/orm/collection'; +import {module, test} from 'qunit'; + +let schema; +let User = Model.extend(); + +module('Integration | ORM | #none', function(hooks) { + hooks.beforeEach(function() { + let db = new Db({ users: [ + { id: 1, name: 'Link', good: true }, + { id: 2, name: 'Zelda', good: true }, + { id: 3, name: 'Ganon', good: false } + ] }); + + schema = new Schema(db, { + user: User + }); + }); + + test('it returns an empty collection', function(assert) { + let users = schema.users.none(); + + assert.ok(users instanceof Collection, 'it returns a collection'); + assert.equal(users.models.length, 0); + }); +}); From 29c3977fbe5ba920d622dce75f5cf2dfaad0e8bd Mon Sep 17 00:00:00 2001 From: Nicolas Joyard Date: Tue, 17 Apr 2018 18:01:15 +0200 Subject: [PATCH 162/879] Allow passthrough HEAD --- addon/server.js | 2 +- tests/integration/passthrough-test.js | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/addon/server.js b/addon/server.js index 36b4ebc22..8a51d3e20 100644 --- a/addon/server.js +++ b/addon/server.js @@ -270,7 +270,7 @@ export default class Server { * @public */ passthrough(...paths) { - let verbs = ['get', 'post', 'put', 'delete', 'patch', 'options']; + let verbs = ['get', 'post', 'put', 'delete', 'patch', 'options', 'head']; let lastArg = paths[paths.length - 1]; if (paths.length === 0) { diff --git a/tests/integration/passthrough-test.js b/tests/integration/passthrough-test.js index ef05cb254..81f5b7c7b 100644 --- a/tests/integration/passthrough-test.js +++ b/tests/integration/passthrough-test.js @@ -85,6 +85,28 @@ module('Integration | Passthrough', function(hooks) { }); }); + test('it can passthrough all verbs by default', function(assert) { + let verbs = ['GET', 'HEAD', 'PUT', 'POST', 'PATCH', 'DELETE', 'OPTIONS']; + assert.expect(verbs.length); + + let done = verbs.map(() => assert.async()); + let { server } = this; + + server.loadConfig(function() { + this.passthrough('/addresses'); + }); + + verbs.forEach((verb, index) => { + promiseAjax({ + method: verb, + url: '/addresses' + }).catch(error => { + assert.equal(error.xhr.status, 404); + done[index](); + }); + }); + }); + test('it can passthrough multiple paths in a single call', function(assert) { assert.expect(2); let done1 = assert.async(); From 7d45a508f4575b81e0879149c701ccae1c89397b Mon Sep 17 00:00:00 2001 From: Jonathan Johnson Date: Tue, 17 Apr 2018 23:50:28 -0700 Subject: [PATCH 163/879] Normalize relationship ids when normalizeIds is set to true REST includes data in the form of ids in an array, these need to be normalized into objects in order to be consumed by JSONApi --- addon/serializers/active-model-serializer.js | 42 +++++++++++++++-- .../active-model-serializer-test.js | 46 ++++++++++++++++++- .../unit/serializers/rest-serializer-test.js | 10 +++- 3 files changed, 92 insertions(+), 6 deletions(-) diff --git a/addon/serializers/active-model-serializer.js b/addon/serializers/active-model-serializer.js index a58fb1448..c7bd91fde 100644 --- a/addon/serializers/active-model-serializer.js +++ b/addon/serializers/active-model-serializer.js @@ -1,8 +1,8 @@ import Serializer from '../serializer'; -import { underscore, pluralize, dasherize, singularize } from '../utils/inflector'; +import { underscore, pluralize, dasherize, singularize, camelize } from '../utils/inflector'; export default Serializer.extend({ - + normalizeIds: false, keyForModel(type) { return underscore(type); }, @@ -38,6 +38,11 @@ export default Serializer.extend({ normalize(payload) { let type = Object.keys(payload)[0]; let attrs = payload[type]; + let modelName = camelize(type); + let modelClass = this.schema.modelClassFor(modelName); + let { belongsToAssociations, hasManyAssociations } = modelClass; + let belongsToKeys = Object.keys(belongsToAssociations); + let hasManyKeys = Object.keys(hasManyAssociations); let jsonApiPayload = { data: { @@ -48,11 +53,42 @@ export default Serializer.extend({ if (attrs.id) { jsonApiPayload.data.id = attrs.id; } + + let relationships = {}; + Object.keys(attrs).forEach((key) => { if (key !== 'id') { - jsonApiPayload.data.attributes[dasherize(key)] = attrs[key]; + if (this.normalizeIds) { + if (belongsToKeys.includes(key)) { + let association = belongsToAssociations[key]; + let associationModel = association.modelName; + relationships[dasherize(key)] = { + data: { + type: associationModel, + id: attrs[key] + } + }; + } else if (hasManyKeys.includes(key)) { + let association = hasManyAssociations[key]; + let associationModel = association.modelName; + let data = attrs[key].map(id => { + return { + type: associationModel, + id + }; + }); + relationships[dasherize(key)] = { data }; + } else { + jsonApiPayload.data.attributes[dasherize(key)] = attrs[key]; + } + } else { + jsonApiPayload.data.attributes[dasherize(key)] = attrs[key]; + } } }); + if (Object.keys(relationships).length) { + jsonApiPayload.data.relationships = relationships; + } return jsonApiPayload; }, diff --git a/tests/unit/serializers/active-model-serializer-test.js b/tests/unit/serializers/active-model-serializer-test.js index f954a7081..d8013a677 100644 --- a/tests/unit/serializers/active-model-serializer-test.js +++ b/tests/unit/serializers/active-model-serializer-test.js @@ -1,10 +1,23 @@ +import { Model, belongsTo } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; import ActiveModelSerializer from 'ember-cli-mirage/serializers/active-model-serializer'; import {module, test} from 'qunit'; module('Unit | Serializers | ActiveModelSerializer', function(hooks) { hooks.beforeEach(function() { - this.serializer = new ActiveModelSerializer(); + let schema = new Schema(new Db(), { + contact: Model.extend({ + address: belongsTo() + }), + address: Model.extend({ + contact: belongsTo() + }) + }); + this.serializer = new ActiveModelSerializer({ + schema + }); }); test('normalize works', function(assert) { @@ -76,5 +89,34 @@ module('Unit | Serializers | ActiveModelSerializer', function(hooks) { let request = { url: '/authors', queryParams: {} }; assert.strictEqual(this.serializer.getCoalescedIds(request), undefined); }); -}); + test('normalize works with normalizeIds set to true', function(assert) { + this.serializer.normalizeIds = true; + let payload = { + contact: { + id: 1, + name: 'Link', + address: 1 + } + }; + let jsonApiDoc = this.serializer.normalize(payload); + + assert.deepEqual(jsonApiDoc, { + data: { + type: 'contacts', + id: 1, + attributes: { + name: 'Link' + }, + relationships: { + address: { + data: { + type: 'address', + id: 1 + } + } + } + } + }); + }); +}); diff --git a/tests/unit/serializers/rest-serializer-test.js b/tests/unit/serializers/rest-serializer-test.js index 7f3aca3a0..de28c8d00 100644 --- a/tests/unit/serializers/rest-serializer-test.js +++ b/tests/unit/serializers/rest-serializer-test.js @@ -1,10 +1,18 @@ import RestSerializer from 'ember-cli-mirage/serializers/rest-serializer'; import { module, test } from 'qunit'; +import { Model } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; module('Unit | Serializers | RestSerializer', function(hooks) { hooks.beforeEach(function() { - this.serializer = new RestSerializer(); + let schema = new Schema(new Db(), { + person: Model + }); + this.serializer = new RestSerializer({ + schema + }); }); test('it hyphenates camelized words', function(assert) { From 3d71463d3970394d8411aebfa0bffcfe720bb869 Mon Sep 17 00:00:00 2001 From: Jonathan Johnson Date: Tue, 17 Apr 2018 22:29:16 -0700 Subject: [PATCH 164/879] Allow for the same inverse association key to exists many times --- addon/orm/model.js | 2 +- .../orm/schema-verification/mixed-test.js | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/addon/orm/model.js b/addon/orm/model.js index ff0688a43..340b6db26 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -271,7 +271,7 @@ class Model { let associations = this.schema.associationsFor(this.modelName); let matchingExplicitInverses = Object.keys(associations).filter(key => { let candidate = associations[key]; - let modelMatches = association.modelName === candidate.ownerModelName; + let modelMatches = association.ownerModelName === candidate.modelName; let inverseKeyMatches = association.key === candidate.opts.inverse; return modelMatches && inverseKeyMatches; diff --git a/tests/integration/orm/schema-verification/mixed-test.js b/tests/integration/orm/schema-verification/mixed-test.js index 904919e12..bdeea839d 100644 --- a/tests/integration/orm/schema-verification/mixed-test.js +++ b/tests/integration/orm/schema-verification/mixed-test.js @@ -244,4 +244,42 @@ module('Integration | ORM | Schema Verification | Mixed', function() { assert.deepEqual(post.inverseFor(userPostsAssociation), post.associationFor('authors')); }); + + test('multiple explicit inverse associations with the same key but different models does not throw an error', function(assert) { + let schema = new Schema(new Db({ + users: [ + { id: 1, name: 'Frodo' } + ], + posts: [ + { id: 1, title: 'Lorem' } + ], + books: [ + { id: 1, title: 'Ipsum' } + ] + }), { + user: Model.extend({ + authoredPosts: hasMany('post', { inverse: 'authors' }), + authoredBooks: hasMany('book', { inverse: 'authors' }) + }), + post: Model.extend({ + authors: hasMany('user', { inverse: 'authoredPosts' }) + }), + book: Model.extend({ + authors: hasMany('user', { inverse: 'authoredBooks' }) + }) + }); + + let frodo = schema.users.find(1); + let post = schema.posts.find(1); + let book = schema.books.find(1); + + let userAuthoredPostsAssociation = frodo.associationFor('authoredPosts'); + let userAuthoredBooksAssociation = frodo.associationFor('authoredBooks'); + let postsAuthorsAssociation = post.associationFor('authors'); + let bookAuthorsAssociation = book.associationFor('authors'); + assert.deepEqual(post.inverseFor(userAuthoredPostsAssociation), post.associationFor('authors')); + assert.deepEqual(book.inverseFor(userAuthoredBooksAssociation), book.associationFor('authors')); + assert.deepEqual(frodo.inverseFor(postsAuthorsAssociation), frodo.associationFor('authoredPosts')); + assert.deepEqual(frodo.inverseFor(bookAuthorsAssociation), frodo.associationFor('authoredBooks')); + }); }); From 210627fb5c37e1cf85aa3eb9aa5d38082b21a2f7 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 20 Apr 2018 18:19:28 -0400 Subject: [PATCH 165/879] Update changelog --- CHANGELOG.md | 853 +-------------------------------------------------- 1 file changed, 2 insertions(+), 851 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e71545aa1..2ee0c89e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,852 +1,3 @@ -# Ember CLI Mirage Changelog +# Ember CLI Mirage Change log -## 0.4.3 - -- Improve detection of model inverses -- Fix a bug related to serializing responsese that are both sideloaded and embedded - - -## 0.4.2 - -- Adds support for new style (RFC232/RFC268) tests -- Parts of Mirage's factory layer that create data are faster -- Serializers support coalesced IDs -- Ensure JSONAPISerializer supports `include` as function -- Add support for `options` mocking - -### How it works in different types of tests - -* **Old-style non-acceptance tests**: mirage will not automatically start, and can still be manually started using the `startMirage()` import from `/initializers/ember-cli-mirage`. -* **Old-style acceptance tests**: mirage will still be started before each test by `/initializers/ember-cli-mirage` and shut down by the code that `ember-cli-mirage`'s blueprint adds to `destroyApp()`. -* **RFC232 and RFC268 tests**: `/initializers/ember-cli-mirage` will detect that it's an RFC232/RFC268 test and not start the mirage server automatically in the way that is problematic for the new tests, and since the new tests don't use `destroyApp()`, it's not at play either. So there are two options: - - In each test that needs it, the user can call `setupMirageTest()`, which will register `beforeEach`/`afterEach` hooks to set up and shut down the mirage server and make it accessible via `this.server` (and also the `server` global). - - The user can set `autostart: true` in their `ember-cli-mirage` config object in `config/environment` which will cause an instance initializer that runs before each test (**every** RFC232/RFC268 test, not just "acceptance" (application) tests) to start mirage and set it as `this.server` on the test context (and also the `server` global), and also register and create a singleton that, when destroyed during app shutdown, will shut down the mirage server. - -### Upgrade path - -This is **not** a breaking change -- existing tests will run just as they are once this PR is merged and released. Furthermore, new and old tests can live side by side and work properly with mirage if the right setup is done, so users are not forced to migrate their whole suite all at once. As they migrate tests, they have two options: - -* As non-acceptance tests are migrated, delete the manual starting/stopping of mirage in `beforeEach`/`afterEach` and replace it with a call to `setupMirageTest()` and continue using `this.server`. As acceptance tests are migrated, add a call to `setupMirageTest()` and optionally switch from using the `server` global to using `this.server`. -* Set `autostart: true` in `config/environment`, and then as non-acceptance tests are migrated, just delete the manual starting/stopping of the mirage server and continue using `this.server`. As acceptance tests are migrated, no changes are necessary, but users can optionally switch from using the `server` global to using `this.server`. - -## 0.4.1 - -Upgrade notes: none - -Changes: - - - [BUGFIX][#1217](https://github.com/samselikoff/ember-cli-mirage/pull/1217) Make tracking pretender requests configurable after it was hardcoded false #1137. @patrickjholloway - - General upgrade to use async/await in tests @geekygrappler - - [ENHANCEMENT][#1203](https://github.com/samselikoff/ember-cli-mirage/pull/1203) pass singular model name to resource helper @geekygrappler - - [ENHANCEMENT][#1199](https://github.com/samselikoff/ember-cli-mirage/pull/1199) upgrade to new QUnit testing API @turbo87 - -## 0.4.0 - -Upgrade notes: - -- There is one primary change that could break your app. In 0.3.x, Mirage's JSONAPISerializer included all related foreign keys whenever serializing a model or collection, even if those relationships were not `?included` in the payload. - - This actually goes against JSON:API's design. Foreign keys in the payload are known as [Resource Linkage](http://jsonapi.org/format/#document-resource-object-linkage) and are intended to be used by API clients to link together all resources in the JSON:API compound document. In fact, most server-side JSON:API libraries do not behave in this way, and only return linkage data for related resources when they are being included in a single document. - - By including linkage data for every relationship in 0.3, it was easy to develop Ember apps that would work with Mirage but would behave differently when hooked up to a standard JSON:API server. Since Mirage always included linkage data, an Ember app might automatically be able to fetch related resources using the ids from that linkage data plus its knowledge about the API. For example, if a `post` came back like this: - - ```js - // GET /posts/1 - { - data: { - type: 'posts', - id: '1', - attributes: { ... }, - relationships: { - author: { - data: { - type: 'users', - id: '1' - } - } - } - } - } - ``` - - and you forgot to `?include=author` in your GET request, Ember Data would potentially use the `user:1` foreign key and lazily fetch the `author` by making a request to `GET /authors/1`. This is problematic because - - 1. This is not how foreign keys are intended to be used - 2. It'd be better to see no data and, to fix the problem, go back up to where you're loading the post and add `?include=author`, or - 3. If you do want your interface to lazily load the author, use `links` instead of the linkage data: - - ```js - // GET /posts/1 - { - data: { - type: 'posts', - id: '1', - attributes: { ... }, - relationships: { - author: { - links: { - related: '/api/users/1' - } - } - } - } - } - ``` - - Resource links can be defined on Mirage serializers using the [links](http://www.ember-cli-mirage.com/docs/v0.3.x/serializers/#linksmodel) method (though `including` is likely the far more simpler and common approach to fetching related data). - - So, Mirage 0.4 changed this behavior and by default, the JSONAPISerializer only includes linkage data for relationships that are being included in the current payload (i.e. within the same compound document). - - This behavior is configurable via the `alwaysIncludeLinkageData` key on your JSONAPISerializers. It is set to `false` by default, but if you want to opt-in to 0.3 behavior and always include linkage data, set it to `true`: - - ```js - // mirage/serializers/application.js - import { JSONAPISerializer } from 'ember-cli-mirage'; - - export default JSONAPISerializer.extend({ - alwaysIncludeLinkageData: true - }); - ``` - - If you do this, I would recommend looking closely at how your real server behaves when serializing resources' relationships and whether it uses resource `links` or resource linkage `data`, and to update your Mirage code accordingly to give you the most faithful representation of your server. - -- Support for Node 0.12 has been explicitly dropped from some of our dependencies - -_Special thanks to @turbo87 and @kellyselden for all their work on this release._ - -Changes: - - - [BREAKING CHANGE][#1150](https://github.com/samselikoff/ember-cli-mirage/pull/1150) Change default JSONAPI data linkage behavior (reference #1146) @samselikoff - - [BUGFIX][#1148](https://github.com/samselikoff/ember-cli-mirage/pull/1148) Foreign key ids were being muted by collection creation @lukemelia - - [BUGFIX][#1078](https://github.com/samselikoff/ember-cli-mirage/pull/1078) Ensure #update works on associations @ivanvanderbyl - - [BUGFIX][#1112](https://github.com/samselikoff/ember-cli-mirage/pull/1112) Fix query in disassociateAllDepentsFromTarget @omghax - - [BUGFIX][#0176](https://github.com/samselikoff/ember-cli-mirage/pull/1170) Fix using `association` helper in a dasherized factory @ignatius-j - - [ENHANCEMENT][#1138](https://github.com/samselikoff/ember-cli-mirage/pull/1138) Unlock and upgrade ember-get-config @dfreeman - - [ENHANCEMENT] [#b99717](https://github.com/samselikoff/ember-cli-mirage/commit/b997176f1d46aaad4c8f82fb7920e7baa8db9e68) Serializer blueprint should extend the application serializer @ChrisBarthol - - [ENHANCEMENT][#187](https://github.com/samselikoff/ember-cli-mirage/pull/187) Use native ES class syntax for base Class.extend @cowboyd - - [ENHANCEMENT][#1137](https://github.com/samselikoff/ember-cli-mirage/pull/1137) Bump pretender and disable request tracking in pretender @bekzod - - General enhancements @heroiceric, @turbo87, @kellyselden, @bekzod, @timhaines, @wismer, @mixonic, @rwjblue - -## 0.3.4 - -Update notes: none - -Changes: - - - [ENHANCEMENT][#1098](https://github.com/samselikoff/ember-cli-mirage/pull/1098) Fix for FastBoot 1.0 @simonihmig - - [ENHANCEMENT][#1102](https://github.com/samselikoff/ember-cli-mirage/pull/1102) Extend modelRegexp to match models in pod structure @dguettler - - [ENHANCEMENT][#1096](https://github.com/samselikoff/ember-cli-mirage/pull/1096) Fixed existence of `relationships.data` if `links` are defined @lancedikson - - [FEATURE][#1110](https://github.com/samselikoff/ember-cli-mirage/pull/1110) Expose database in serializer @zinyando - - [FEATURE][#977](https://github.com/samselikoff/ember-cli-mirage/pull/977) adds support for custom identity managers per application and model @jelhan - - General enhancements @samselikoff, @kellyselden, @rwjblue - -## 0.3.3 - -Update notes: none - -Changes: - - - [FEATURE][#1080](https://github.com/samselikoff/ember-cli-mirage/pull/1080) Polymorphic association support @samselikoff - -## 0.3.2 - -Update notes: none - -Changes: - - - [FEATURE][#1056](https://github.com/samselikoff/ember-cli-mirage/pull/1056) Auto generate models from Ember Data models @offirgolan - - [ENHANCEMENT][#1068](https://github.com/samselikoff/ember-cli-mirage/pull/1068) Add Resource helper custom path parameter @rjschie - - [ENHANCEMENT][#1077](https://github.com/samselikoff/ember-cli-mirage/pull/1077) Upgrade ember-inflector to 2.0 @john-griffin - - [ENHANCEMENT][#1088](https://github.com/samselikoff/ember-cli-mirage/pull/1088) Upgrade ember-lodash @john-griffin - - [ENHANCEMENT][#1086](https://github.com/samselikoff/ember-cli-mirage/pull/1086) Normalize hasMany relationships @npafundi - - General improvements: @kishiamy, @aheuermann, @marpo60, - -## 0.3.1 - -Update notes: none - -Changes: - - - [BUGFIX] [1054](https://github.com/samselikoff/ember-cli-mirage/pull/1054) Remove bad reflexive inverse logic @samselikoff - - General enhancements @Serabe, @cs3b - -## 0.3.0 - -Update notes: View the [Upgrade guide](http://www.ember-cli-mirage.com/docs/v0.3.x/upgrading/#02x--03-upgrade-guide) on the 0.3.x docs page - -Changes: - - - [FEATURE] [#965](https://github.com/samselikoff/ember-cli-mirage/pull/965) One-way associations @samselikoff, @HeroicEric, @xomaczar - -## 0.2.9 - -Update notes: none - -Changes: - - - [ENHANCEMENT] [#1006](https://github.com/samselikoff/ember-cli-mirage/pull/1006) Make host/namespace support more robust @zinyando - -## 0.2.8 - -Update notes: none - -Changes: - - - [BUGFIX] [#1026](https://github.com/samselikoff/ember-cli-mirage/pull/1040) Import `require` to avoid issue in babel@6 @rwjblue - - [BUGFIX] [#1026](https://github.com/samselikoff/ember-cli-mirage/pull/1026) Fixes generated code for destroy app helper @NLincoln - -## 0.2.7 - -Update notes: 0.2.6 introduced a breaking change for PhantomJS users, so we've reverted a change and published 0.2.7. See [#1024](https://github.com/samselikoff/ember-cli-mirage/pull/1024) for details. - -Changes: - - - [BUGFIX [#1025](https://github.com/samselikoff/ember-cli-mirage/pull/1025) Fix factory association feature @yratanov - - [BUGFIX [#1024](https://github.com/samselikoff/ember-cli-mirage/pull/1024) Replace Number.isInteger with lodash isInteger @ilucin - - [ENHANCEMENT [#1023](https://github.com/samselikoff/ember-cli-mirage/pull/1023) Allow route handlers to return empty string responses @bendemboski - - [ENHANCEMENT [#1030](https://github.com/samselikoff/ember-cli-mirage/pull/1030) Code Climate config with ESLint and duplication @larkinscott - -## 0.2.6 - -Update notes: None - -Changes: - - - [ENHANCEMENT] [#1010](https://github.com/samselikoff/ember-cli-mirage/pull/1010) Better support for nested addons @samselikoff - - [ENHANCEMENT] [#998](https://github.com/samselikoff/ember-cli-mirage/pull/998) Adapting to use lodash 4 using latest ember-lodash @eturino - - [ENHANCEMENT] [#1008](https://github.com/samselikoff/ember-cli-mirage/pull/1008) Upgrade to Ember CLI 2.9 @cibernox - - [ENHANCEMENT] [#995](https://github.com/samselikoff/ember-cli-mirage/pull/995) Invoke _getAttrsForRequest with correct model name @bwbuchanan - - General improvements @azdaroth - -- hasMany/belongsTo used to be autodefined, no longer - - explain why: sometimes one-way, sometimes ambiguous -- new serializer hook: `keyForForeignKey` - - used for belongsTo relationships (keyForRelationshipIds) - - TODO: this is an awful name, change it -- belongs to keys no longer automatically serialize - - need to explain why (one-sided relationships) - - change: either set `serializeIds` to `true`, or add missing relationships to `include: []` property on that model's serializer - -## 0.2.5 - -Update notes: None - -Changes: - - - [FEATURE] [#880](https://github.com/samselikoff/ember-cli-mirage/pull/880) Add association helper @azdaroth - - [FEATURE] [#948](https://github.com/samselikoff/ember-cli-mirage/pull/948) Add length to collections @mfazekas - - [FEATURE] [#957](https://github.com/samselikoff/ember-cli-mirage/pull/957) Add slice method to collections @alexparker - - [ENHANCEMENT] [#796](https://github.com/samselikoff/ember-cli-mirage/pull/796) improve `normalizedRequestAttrs` helper @jbailey4 - - [ENHANCEMENT] [#928](https://github.com/samselikoff/ember-cli-mirage/pull/928) add a default passthrough @anulman - - [ENHANCEMENT] [#987](https://github.com/samselikoff/ember-cli-mirage/pull/987) Added falsy condition to exclude faker.js & pretender.js in production build @renpinto - - [BUGFIX] [#984](https://github.com/samselikoff/ember-cli-mirage/pull/984) Blueprint.prototype.insertIntoFile is async @stefanpennar - - [BUGFIX] [#905](https://github.com/samselikoff/ember-cli-mirage/pull/905) Serialize on key instead of modelName @jessedijkstra - - [BUGFIX] [#950](https://github.com/samselikoff/ember-cli-mirage/pull/950) fix JSON:API includes @deepflame - - General improvements @jessedijkstra @bantic @alecho @alexparker @mfazekas @azdaroth - -## 0.2.4 - -Update notes: None - -Changes: - - - [ENHANCEMENT] Let faker float from 3.0.0 @Dhaulagiri - - To improve backwards compatibility concerns raised by the changes from [#863](https://github.com/samselikoff/ember-cli-mirage/pull/863), [#932](https://github.com/samselikoff/ember-cli-mirage/pull/932) allows the version of Faker.js used in ember-cli-mirage to float from `3.0.0`. If you need to use a specific older `3.x` version in your project you can specify it in your project's package.json. - - General improvements @Gaurav0 - -## 0.2.3 - -Update notes: None - -Changes: - - Newer versions of Pretender will [show a warning](https://github.com/pretenderjs/pretender/pull/178) - if you forget to shut down a pretender server before starting another one. Mirage does this - for you in acceptance tests, but if you are starting Mirage manually in other tests, remember - to shut down the server when you are done. - (see [#925](https://github.com/samselikoff/ember-cli-mirage/pull/925)) - -Changes: - - - [FEATURE] Add support for promises in route functions - ([#924](https://github.com/samselikoff/ember-cli-mirage/pull/924)) - @dustinfarris - - [BUGFIX] Adjust afterCreate callbacks execution order - ([#893](https://github.com/samselikoff/ember-cli-mirage/pull/893)) - @Azdaroth - - [INTERNAL] Shutdown pretender servers in unit tests - ([#917](https://github.com/samselikoff/ember-cli-mirage/pull/917)) - @dustinfarris - -## 0.2.2 - -Update notes: - - - None - -Changes: - - - [FEATURE] Add sort to orm/collection @lukemelia - - [FEATURE] Add :resource helper @Azdaroth - - [FEATURE] Add traits @Azdaroth - - [FEATURE] Extract .config out of constructor @Leooo - - [FEATURE] #795 Adds findBy to db/schema @promisedlandt - - [ENHANCEMENT] #837 Allow namespace of / to be used @jrjohnson - - [ENHANCEMENT] #869 improve logging format @mariogintili - - [ENHANCEMENT] #781 rewrite serializers @samselikoff - - [BUGFIX] #821 JSONAPIAdapter fix @chrisdpeters - - [BUGFIX] #846 Allow new attributes to be defined in #update @Leooo - - General improvements @fotinakis, @jtrees, @dfreeman, @escobera, @Azdaroth, @Dhaulagiri - -## 0.2.1 - -Update notes: - - - None - -Changes: - - - [ENHANCEMENT] Ensure mirage tree is linted @rwjblue - - [FEATURE] #762 adds `afterCreate` to factories @seanpdoyle, @samselikoff - - [BUGFIX] #769 ensure embedded collection keys are dynamic @arnodirlam - -## 0.2.0 - -Update notes: - - - The `inverseOf` options was renamed to `inverse`, to be consistent with Ember Data - -Changes: - - - [BREAKING CHANGE] #640 `inverseOf` was renamed to `inverse` @samselikoff - - [FEATURE] #729 Add `this.normalizedRequestAttrs` helper method to function route handler @samselikoff - - [ENHANCEMENT] #743 Ensure associations can be passed in during model creation @samselikoff - - [BUGFIX] #738 Ensure directory location can be configured @gthmb - - General cleanup, updates and docs @lizzerdrix, @timjcook, @samselikoff - -## 0.2.0-beta.9 - -This release contains some breaking changes from 0.2.0-beta.8. - -Update notes: - - - Schema model classes are now pluralized. They used to be singularized, taking after Rails' conventions, but I think it's better to match our db conventions (e.g. `db.users`). - - So you'll need to change - - ```js - schema.user.all() - schema.user.find(1) - ``` - - to - - ```js - schema.users.all() - schema.users.find(1) - ``` - - and so on. The upgrade should be a relatively straightforward. - - - Breaking changes on ORM/Collection: - - - There's now a `.models` property on Collections, which gives you access to the underlying JavaScript array. This should be used if you want to munge the collection using Lodash, Ramda et al. - - ```js - let usersCollection = schema.users.all(); - let uniqueUsers = _.uniqBy(usersCollection.models, 'firstName'); - ``` - - - Collection no longer attempts to mimic an array. This turned out to be confusing, since you can't really subclass arrays in JavaScript, and it would sometimes be compatible with functions that operate on arrays, but sometimes not. - - So, you can no longer use the array accessor on a collection, meaning the following won't work: - - ```js - let authors = schema.authors.all(); - - // The following no longer work - authors[1]; - authors.length; - authors.push(model); - authors.map(f); - authors.forEach(f); - authors.reduce(f); - authors.toArray(); // use authors.models instead - ``` - - Instead, if you need to use array-methods on `Collections`, access the `.models` property. You can always convert your transformed array back to a `Collection`, for example to tell Mirage to serialize your response: - - ```js - import { Collection } from 'ember-cli-mirage'; - - let authors = schema.authors.all().models; - let topPosts = authors.map((a) => a.topPost); - - return new Collection('post', topPosts); - ``` - -Changes: - - - [BREAKING CHANGE] #705 Drop Collection.[], add Collection.models @samselikoff - - [BREAKING CHANGE] #705 Pluralize Schema class names @samselikoff - - [FEATURE] #705 Add this.serialize to function route handlers @samselikoff - - [ENHANCEMENT] Server.create falls back to Models if Factories don't exist @samselikoff - - [ENHANCEMENT] Support aliases for --proxy @elbeezy - - [ENHANCEMENT] Do not include files if on Fastboot @locks - - [BUGFIX] #709 Fix Serializer include logic @cibernox - - [BUGFIX] #666 Ensure model serializers are used for JSONAPI @samselikoff - - General cleanup, updates and docs @lizzerdrix, @lependu, @amyrlam, @blimmer, @noslouch, @bgentry, @mitchlloyd, @BrianSipple, @acorncom, @stefanpennar - -## 0.2.0.beta-8 - -Update notes: - -Changes: - - - [FEATURE] #622 Add `links` method to JSONAPISerializer @richmolj - - [FEATURE] #655 Add importable rest-serializer @rondale-sc - - [FEATURE] #269 Dynamic factory attributes can reference other dynamic attributes @lazybensch - - [FEATURE] #603 Support inverse foreign keys @ef4 - - [ENHANCEMENT] #323 Extract startMirage from initializer @mitchlloyd - - [ENHANCEMENT] #617 JSON:API Serializer includes intermediate relationships when using dot paths @RSSchermer - - [ENHANCEMENT] #610 Allow Mirage to be a dependency of another addon @donovan-graham - - General cleanup and updates @lolmaus, @samselikoff - -## 0.2.0.beta-7 - -Update notes: none. - -Changes: - - - [BUGFIX] #602 Fix regression in Db IdentityManager @samselikoff - -## 0.2.0.beta-6 - -Update notes: None. - -Changes: - - - [BUGFIX] #585 Ensure DB autoincrement ids account for string ints @samselikoff - - [BUGFIX] #592 GET shorthands 404s for nonexistant singular resources @samselikoff - -## 0.2.0.beta-5 - -Update notes: None. - -Changes: - - - [ENHANCEMENT] Allow files to be excluded from non-prodution builds Danail Nachev - - [ENHANCEMENT] #552 Add default passthroughs @anulman - - [ENHANCEMENT] #427 Factories return models @ef4 - - [ENHANCEMENT] #561 Ensure foreign keys are picked up in shorthands @abuiles - - [ENHANCEMENT] #546 Add named associations @samselikoff - - [BUGFIX] #548 Shorthands can read ID from json:api request body @lkhaas - - General cleanup and updates @ef4 @abuiles @elwayman02 - -## 0.2.0.beta-4 - -Update notes: None. - -Changes: - - - [ENHANCEMENT] #501 Adds ModelClass.first @lependu - - [BUGFIX] #543 Ensure Mirage works within Addons @cibernox - - [BUGFIX] #535 Include original message on rethrow errors @hamled - - [BUGFIX] #515 Ensure serializer#serialize always receives request @2468ben - - [BUGFIX] #506 Ensure serializer#normalize looks up model-specific serializers @2468ben - - [BUGFIX] #507 Ensure foreign keys are added once @samselikoff - - General cleanup @bekzod, @alecho, @koriroys, @cibernox - -## 0.2.0.beta-3 - -Update notes: - - - There was a bug where dasherized multiword serializers and fixtures were not registered correctly. This has been fixed, so if you happen to have camelized multiword serializers or fixtures - - /mirage/serializers/blogPost.js - /mirage/fixtures/blogPosts.js - - you can rename these to dasherized names - - /mirage/serializers/blog-post.js - /mirage/fixtures/blog-posts.js - - In Mirage 0.2, all filenames should be dasherized, following the conventions of Ember CLI. If you ever encounter a situation where this doesn't work, please file an issue, as this is a bug. - -Changes: - - - [ENHANCEMENT] Better blueprints - - [BUGFIX] Ensure multiword dasherized serializers work #333 - - [BUGFIX] Ensure multiword dasherized fixtures work - -## 0.2.0.beta-2 - -Update notes: - - `Serializer#relationships` was renamed to `Serializer#include`. - - Before: - - ``` - export default Serializer.extend({ - relationships: ['comments'] - }); - ``` - - After: - - ``` - export default Serializer.extend({ - include: ['comments'] - }); - ``` - - - We now use `destroyApp` test helper in Ember-CLI to shutdown the Mirage server after each test to resolve a memory leak reported in #226. It's important to run `ember g ember-cli-mirage` when upgrading to take advantage of this fix. - - Inserting records with numerical IDs that have already have been used will throw an error per changes from #417 - - `model.type` was renamed to `model.modelName`, and is dasherized (instead of camelized) - -Changes: - - [BREAKING CHANGE] POST and PUT shorthands require a Serializer#normalize function, and will transform your attrs to camelCase. (If you're using JsonApiSerializer or ActiveModelSerializer, this is done for you). To keep using the db yourself, write custom POST and PUT route handlers. - - [BREAKING CHANGE] Serializer#relationships was renamed to Serializer#include #424 @lolmaus - - [BREAKING CHANGE] Change `model.type` to `model.modelName`, ensure it's dasherized #454 - - [BREAKING CHANGE] Inserting records with numerical IDs that have already have been used will throw an per changes from #417 - - [BREAKING CHANGE] DB stores ids as strings #462 @jherdman - - [BREAKING CHANGE] GET shorthand with single owner and many children throws an error. - - [BREAKING CHANGE] Arrays in shorthands should always contain singularzied model names (e.g. dasherized) - - [FEATURE] Add `?include` query param support in JSONAPISerializer @lolmaus - - [FEATURE] Add `build` & `buildList` to factories #459 @ballpointpenguin - - [ENHANCEMENT] JSONAPISerializer defaults to dasherized types and relationships (and other JSONAPI enhancements) @lolmaus - - [ENHANCEMENT] shutdown Mirage server on destroyAppp @blimmer - - [ENHANCEMENT] createList perf enhancement @alvinvogelzang - - [ENHANCEMENT] improve DB autoincrement @jherdman - - [ENHANCEMENT] #493 Ability to set timing parameter for individual routes @bekzod - - [FEATURE] [Allow nested factory objects](https://github.com/samselikoff/ember-cli-mirage/commit/a73a195c1b991d226429ee369e2af688a95c7d95) @john-kurkowski - - Other bugfixes/enhancements @jherdman, @ef4, @seanpdoyle, @alecho, @bekzod - -## 0.2.0.beta-1 - -Update notes: - - Move `/app/mirage` to `/mirage` - -Changes: - - [FEATURE] ORM, Serializers - - [ENHANCEMENT] @heroiceric - - [BREAKING CHANGE] missing routes will now throw an Error instead of logging to the Logger's `error` channel. - -## 0.1.11 - -Update notes: none - -Changes: - - [BUGFIX] - -## 0.1.10 - -Update notes: none - -Changes: - - [BUGFIX] - -## 0.1.9 - -Update notes: - - When this library first came out, you defined routes using `this.stub('get', '/path'...)` in your `mirage/config.js` file. `stub` has been removed, so if you happen to be using it, just replace those calls with the `this.get`, `this.post`, etc. helper methods. - - If you happen to be using the orm (it's private + not ready yet), know that there were some changes to how the data is stored. Contact me if you want to upgrade. - -Changes: - - [BREAKING CHANGE] remove #stub from Server (see update note) @samselikoff - - [FEATURE] add `.passthrough` API @samselikoff - - [FEATURE] add `.loadFixtures` API @samselikoff - - [FEATURE] add .random.number.range to faker @iamjulianacosta - - [IMPROVEMENT] better missing route message @blimmer - - [IMPROVEMENT] upgrade Ember CLI 1.13.8 @blimmer - - [IMPROVEMENT] improve logging @gaborsar - - [IMPROVEMENT] cleanup @jherdman - - [BUGFIX] fixup blueprints @samsinite - - [BUGFIX] fix ie8 bug @jerel - - [BUGFIX] avoid dep warning in Ember 2.x @mixonic - - -## 0.1.8 - -Update notes: none - -Changes: - - [BUGFIX] remove console.log from server.js - -## 0.1.7 - -Update notes: - - We use `ember-inflector` from NPM now, so after upgrading you should remove `ember-inflector` from your bower.json. - -Changes: - - [ENHANCEMENT] Add support for fully qualified domain name @jamesdixon - - [IMPROVEMENT] upgrade Ember CLI, Pretender 0.9 @cibernox @blimmer - - [IMPROVEMENT] use ember-inflector from NPM @alexlafroscia @eptis - - [IMPROVEMENT] note requirement of .bind @brettchalupa - -## 0.1.6 - -Update notes: - - If you happened to be manipulating db objects using object references instead of the db API, e.g. - - ``` - let contact = db.contacts.find(1); - contact.name = 'Gandalf'; - ``` - - this will no longer work, as the db query methods now return copies of db data. This was considered a private API. You'll need to use the db api (e.g. `db.update`) to make changes to db data. - -Changes: - - [ENHANCEMENT] add PATCH to mirage @samselikoff - - [ENHANCEMENT] update Faker to 3.0, expose all methods @blimmer - - [ENHANCEMENT] add basics of orm layer @samselikoff - - [IMPROVEMENT] general refactorings @makepanic @cibernox - -## 0.1.5 - -Update notes: none - -Changes: - - [BUGFIX] fixtures bug @bantic - - [BUGFIX] jshint on blueprint files @dukex - - [BUGFIX] allow beta to break build @bantic - -## 0.1.4 - -Update notes: - - If you run the generator to update deps, the blueprint will put a file under `/scenarios/default.js`. The presence of this file will mean your fixtures will be ignored during development. If you'd still like to use your fixtures, delete the `/scenarios` directory. - -Changes: - - [IMPROVEMENT] factory-focused initial blueprints - -## 0.1.3 - -Update notes: none - -Changes: - - [ENHANCEMENT] #29 add faker + list helpers @mupkoo - - [IMPROVEMENT] upgrade ember cli to 0.2.7 @blimmer - - [BUGFIX] #167 allow ids of 0 @samselikoff - -## 0.1.2 - -- empty release - -## 0.1.1 - -Update notes: none - -Changes: - - [IMPROVEMENT] remove unrelated folders from npm @mupkoo - - [BUGFIX] allow testConfig to be optional @samselikoff - -## 0.1.0 - -Update notes: none - -Changes: - - [ENHANCEMENT] Ability to use factories to seed development database @g-cassie - - [ENHANCEMENT] Ability to specify test-only Mirage routes @cball - - [BUGFIX] `db.where` now coerces query params to string @cibernox - - [BUGFIX] #146 fix es6 template bug with blueprint - -## 0.0.29 - -Update notes: none - -Changes: - - [BUGFIX] fix url with slash before ? @knownasilya - -## 0.0.28 - -Update notes: none - -Changes: - - [ENHANCEMENT] 'coalesce' option to support GET multiple ids @cibernox - - [ENHANCEMENT] #117 db.find supports array of ids @samselikoff - - [BUGFIX] #115 IE8 safe @samselikoff - - [BUGFIX] can remove collection then add records again @seawatts - - [IMPROVEMENT] automatically add server to .jshint @bdvholmes - - [IMPROVEMENT] use lodash.extend instead of jQuery.extend @seawatts - - [IMPROVEMENT] use 200 HTTP code if responseBody exists @cibernox - - [IMPROVEMENT] better logging @bdvholmes - -## 0.0.27 - -Update notes: none - -Changes: - - [IMPROVEMENT] remove `tmp` dir from git @ahmadsoe - - [BUGFIX] ensure string ids that start with ints can be used @cibernox - -## 0.0.26 - -Update notes: none. - -Changes: - - [ENHANCEMENT] #70 Allow function route handler to customize status - code, HTTP headers and data. See [the -wiki](https://github.com/samselikoff/ember-cli-mirage/wiki/HTTP%20Verb%20function%20handler#dynamic-status-codes-and-http-headers) -for details. - - [BUGFIX] #81 Include assets in dev build, in case users visit /tests - from `ember s`. - - [BUGFIX] smarter id coercion in controller @mikehollis - - [IMPROVEMENT] import mergeTrees and funnel @willrax @cibernox - - [IMPROVEMENT] better status code lookup @cibernox - - [IMPROVEMENT] use ember-try @willrax - -## 0.0.25 - - - npm is hard :( - -## 0.0.24 - -Update notes: The config options `force` or `disable` aren't support anymore, please use `enabled` as explained here: https://github.com/samselikoff/ember-cli-mirage/wiki/Configuration#enabled - -Changes: - - [BREAKING CHANGE] There's no more `force` or `disable` option, simply specify - - ENV['ember-cli-mirage'].enabled = [true|false] - - in whichever environment you need to override the default behavior. - - - [ENHANCEMENT] #51 Adds generators: `ember g factory contact` and `ember g fixture contacts` - - [ENHANCEMENT] Allow response logging in tests via `server.logging = true` - - [BUGFIX] #66 ignore query params in shorthands - -## 0.0.23 -Update notes: None. - -Change: - - - #53 allow arbitrary factory attrs - - #50 do not use Mirage if /server/proxies dir exists - - load fixtures in test environment if no factories exist - -## 0.0.22 -Update notes: - - Rename your `/app/mirage/data` directory to `/app/mirage/fixtures`. - - Move your `/tests/factories` directory to `/app/mirage/factories`. - - `store`, the data cache your routes interact with, has been renamed to `db` and its API has changed. - - Your shorthand routes should not be affected, but you'll need to update any routes where you passed in a function and interacted with the store.See [the wiki entry](../../wiki/Database) for more details, and the new API. - -Changes: - - - [BREAKING CHANGE] Rename `/data` directory to `/fixtures`. - - [BREAKING CHANGE] Move `/tests/factories` directory to `app/mirage/factories` - - #41 [BREAKING CHANGE] Renamed `store` to `db`, and changed API. See [the wiki entry](../../wiki/Database). - - #42 [ENHANCEMENT] Add ability to change timing within tests, e.g. to test the UI on long delays. - - #6 [ENHANCEMENT] Add ability to force an error response from a route. - - [ENHANCEMENT] Return POJO from route - - [BUGFIX] ignore assets if Mirage isn't being used - -## 0.0.21 -Update notes: - -This project has been renamed from ember-pretenderify to ember-cli-mirage. Please update your `package.json` dependency accordingly, and - - rename the `/app/pretender` dir to `/app/mirage` - - if you have factories, change - - import EP from 'ember-pretenderify'; - - to - - import Mirage from 'ember-cli-mirage'; - -Changes: - - - #26 [ENHANCEMENT] Added support for factory inheritance - - #36 [BUGFIX] Fix bug where createList didn't respect attr overrides @ashton - - #37 [INTERNAL] Add tests for createList @cibernox - - #35 [INTERNAL] Return [] from store#findAll - -## 0.0.20 - -- Deprecation notice for new name. - -## 0.0.19 -Hotfix for #34, no changes require to update. - -## 0.0.18 -Update notes: - - the testing API has changed. Before, you used `store.loadData`, now you use factories. See the Getting Started guide below for an example, or the factories wiki page for the full API. - -Changes: - - Basic factory support - -## 0.0.17 -Update notes: - - the testing API has changed. Before, you added data directly to `serverData`, e.g. - - serverData.contacts = [{id: 1, name: 'Link'}]; - - Now, use the store directly: - - store.loadData({ - contacts: [{id: 1, name: 'Link'}] - }); - - - `this` in your config file no longer refers to the Pretender instance; use `this.pretender` instead. - -Changes: - - [FEATURE] you can use `this.get`, `this.post`, `this.put` and `this.del` instead of `this.stub(verb)` now - - bug fixes + refactoring - -## 0.0.16 -Update notes: None. - -Changes: - - *actually* fix bower package version of inflector - -## 0.0.15 -Update notes: None. - -Changes: - - fix bower package version of inflector - -## 0.0.14 -Update notes: None. - -Changes: - - clean up [string].pluralize calls - -## 0.0.13 -Update notes: - - - Run `bower install`. This brings along `ember-inflector` as a separate package. - - This update contained one or more breaking changes (see below). - -Changes: - -- [breaking change] If you happen to be using `store.find(type)` to return a collection (e.g. without an `id`), use `store.findAll(type)` instead -- Various updates/refactorings to store -- Don't log server responses during testing -- Use standalone ember-inflector package, no more dependency on ember data - -## 0.0.12 -Update notes: - - Before, the following was part of the install: - - *Testing* - - In your `tests/helpers/start-app.js`, - - ```js - import pretenderifyTesting from '../../ember-pretenderify/testing'; - - export default function startApp(attrs) { - ... - - pretenderifyTesting.setup(application); - - return application; - } - ``` - - You no longer need this code, so just delete it all from the `start-app` file. The server will automatically instantiate via the initializer during tests. - -Changes: - -- fixed bug with stub#delete (so it works more than once. hah.) -- instantiate server in initializer +Releases (along with upgrade instructions) are documented on the Github [Releases](https://github.com/samselikoff/ember-cli-mirage/releases) page. From 74906ef931d229cf1045d8ee952071920d5a613b Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 20 Apr 2018 18:19:31 -0400 Subject: [PATCH 166/879] 0.4.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c3bef1fca..6102d95ef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "0.4.3", + "version": "0.4.4", "description": "A client-side HTTP server to develop, test and demo your Ember app", "keywords": [ "ember-addon", From 3b708ed4d228d7b1c939f2c6e73eb7af2c762a3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20Melga=C3=A7o?= Date: Sun, 22 Apr 2018 02:49:16 -0300 Subject: [PATCH 167/879] Update contributing.md git checkout --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7c1bee13a..677d8587b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -22,7 +22,7 @@ To make more substantial changes, you'll want to be able to write locally. The d 2. Checkout the `gh-pages` branch: ``` - git co gh-pages + git checkout gh-pages ``` 3. Start the Jekyll build: From ce428fd56330f6cec4e665f0b83566452377f5ad Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 23 Apr 2018 16:32:56 -0400 Subject: [PATCH 168/879] 0.4.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6102d95ef..822e568d4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "0.4.4", + "version": "0.4.5", "description": "A client-side HTTP server to develop, test and demo your Ember app", "keywords": [ "ember-addon", From 378507f4d4dbab4282f3e21d2be4396507f961e5 Mon Sep 17 00:00:00 2001 From: Kelly Selden Date: Wed, 25 Apr 2018 17:12:00 -0700 Subject: [PATCH 169/879] return pretender handler --- addon/server.js | 4 ++-- tests/unit/server-test.js | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/addon/server.js b/addon/server.js index 8a51d3e20..ef11d571f 100644 --- a/addon/server.js +++ b/addon/server.js @@ -485,7 +485,7 @@ export default class Server { [['get'], ['post'], ['put'], ['delete', 'del'], ['patch'], ['head'], ['options']].forEach(([verb, alias]) => { this[verb] = (path, ...args) => { let [ rawHandler, customizedCode, options ] = extractRouteArguments(args); - this._registerRouteHandler(verb, path, rawHandler, customizedCode, options); + return this._registerRouteHandler(verb, path, rawHandler, customizedCode, options); }; if (alias) { @@ -515,7 +515,7 @@ export default class Server { let fullPath = this._getFullPath(path); let timing = options.timing !== undefined ? options.timing : (() => this.timing); - this.pretender[verb]( + return this.pretender[verb]( fullPath, (request) => { return new Promise(resolve => { diff --git a/tests/unit/server-test.js b/tests/unit/server-test.js index c5c099c58..ee0db9f67 100644 --- a/tests/unit/server-test.js +++ b/tests/unit/server-test.js @@ -11,6 +11,16 @@ module('Unit | Server', function() { server.shutdown(); }); + test('it can be instantiated', function(assert) { + let server = new Server({ environment: 'test' }); + + let handler = server.post('foo'); + + assert.strictEqual(handler.numberOfCalls, 0); + + server.shutdown(); + }); + test('it runs the default scenario in non-test environments', function(assert) { assert.expect(1); From d0ee0809f9ea560e850dd6776f40705d4619d491 Mon Sep 17 00:00:00 2001 From: Kelly Selden Date: Thu, 26 Apr 2018 09:38:29 -0700 Subject: [PATCH 170/879] fix test name bad copy/paste --- tests/unit/server-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/server-test.js b/tests/unit/server-test.js index ee0db9f67..c2bd31edc 100644 --- a/tests/unit/server-test.js +++ b/tests/unit/server-test.js @@ -11,7 +11,7 @@ module('Unit | Server', function() { server.shutdown(); }); - test('it can be instantiated', function(assert) { + test('routes return pretender handler', function(assert) { let server = new Server({ environment: 'test' }); let handler = server.post('foo'); From 8f308721ed895ee22aeb8463f2a773b3e7472a70 Mon Sep 17 00:00:00 2001 From: Kelly Selden Date: Thu, 26 Apr 2018 09:53:53 -0700 Subject: [PATCH 171/879] 0.4.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 822e568d4..24df6ba59 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "0.4.5", + "version": "0.4.6", "description": "A client-side HTTP server to develop, test and demo your Ember app", "keywords": [ "ember-addon", From c0c326fce6852a724154665c317b45a916506a52 Mon Sep 17 00:00:00 2001 From: Giovanni Collazo Date: Sat, 28 Apr 2018 14:33:19 -0400 Subject: [PATCH 172/879] Enhance log messages * Default message stays the same * Groups logs using console.groupCollapsed * Adds request to logged data * Adds "raw" request to logged data --- addon/server.js | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/addon/server.js b/addon/server.js index ef11d571f..6c91d5388 100644 --- a/addon/server.js +++ b/addon/server.js @@ -38,17 +38,31 @@ function createPretender(server) { this.handledRequest = function(verb, path, request) { if (server.shouldLog()) { - console.log(`Mirage: [${request.status}] ${verb.toUpperCase()} ${request.url}`); - let { responseText } = request; + console.groupCollapsed( + `Mirage: [${request.status}] ${verb.toUpperCase()} ${request.url}` + ); + let { requestBody, responseText } = request; + let loggedRequest; let loggedResponse; + try { + loggedRequest = JSON.parse(requestBody); + } catch (e) { + loggedRequest = requestBody; + } + try { loggedResponse = JSON.parse(responseText); } catch(e) { loggedResponse = responseText; } - console.log(loggedResponse); + console.log({ + request: loggedRequest, + response: loggedResponse, + raw: request + }); + console.groupEnd(); } }; From 949591084d97875937b5dbd94be20b70fd058010 Mon Sep 17 00:00:00 2001 From: Giovanni Collazo Date: Sat, 28 Apr 2018 14:39:40 -0400 Subject: [PATCH 173/879] Fix code style --- addon/server.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/addon/server.js b/addon/server.js index 6c91d5388..185368e23 100644 --- a/addon/server.js +++ b/addon/server.js @@ -42,12 +42,11 @@ function createPretender(server) { `Mirage: [${request.status}] ${verb.toUpperCase()} ${request.url}` ); let { requestBody, responseText } = request; - let loggedRequest; - let loggedResponse; + let loggedRequest, loggedResponse; try { loggedRequest = JSON.parse(requestBody); - } catch (e) { + } catch(e) { loggedRequest = requestBody; } From ad6c4f8f58d64a142b66e7703cdff810651559db Mon Sep 17 00:00:00 2001 From: Luke Melia Date: Wed, 2 May 2018 11:43:25 -0400 Subject: [PATCH 174/879] Fix bug setting id of inverse polymorphic belongsTo relationship --- addon/orm/model.js | 12 ++++++---- .../belongs-to/regressions/pr-1312-test.js | 23 +++++++++++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 tests/integration/orm/belongs-to/regressions/pr-1312-test.js diff --git a/addon/orm/model.js b/addon/orm/model.js index 340b6db26..9934f4cef 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -758,12 +758,16 @@ class Model { let inverse = model.inverseFor(association); let inverseFk = inverse.getForeignKey(); + let ownerId = this.id; if (inverse instanceof BelongsTo) { - this.schema.db[toInternalCollectionName(model.modelName)] - .update(model.id, { [inverseFk]: this.id }); - + let newId; + if (inverse.isPolymorphic) { + newId = { type: this.modelName, id: ownerId }; + } else { + newId = ownerId; + } + this.schema.db[toInternalCollectionName(model.modelName)].update(model.id, { [inverseFk]: newId }); } else { - let ownerId = this.id; let inverseCollection = this.schema.db[toInternalCollectionName(model.modelName)]; let currentIdsForInverse = inverseCollection.find(model.id)[inverse.getForeignKey()] || []; let newIdsForInverse = _assign([], currentIdsForInverse); diff --git a/tests/integration/orm/belongs-to/regressions/pr-1312-test.js b/tests/integration/orm/belongs-to/regressions/pr-1312-test.js new file mode 100644 index 000000000..f7734e6eb --- /dev/null +++ b/tests/integration/orm/belongs-to/regressions/pr-1312-test.js @@ -0,0 +1,23 @@ +import { Model, belongsTo, hasMany } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Regressions | pr-1312', function() { + test(`creating and using a record with a polymorphic hasMany and explicit inverse does not fail when accessing the association`, function(assert) { + let schema = new Schema(new Db(), { + comment: Model.extend({ + commentable: belongsTo({ polymorphic: true, inverse: 'comments' }) + }), + + post: Model.extend({ + comments: hasMany('comment', { inverse: 'commentable' }) + }) + }); + + let post = schema.posts.create(); + post.createComment(); + + assert.equal(post.comments.models.length, 1); + }); +}); From 5848f304d9c5d46d58d6c1f34fb6b299783745d7 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 2 May 2018 13:53:48 -0700 Subject: [PATCH 175/879] Update issue templates --- .github/ISSUE_TEMPLATE/Bug_report.md | 35 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/Feature_request.md | 17 +++++++++++ 2 files changed, 52 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/Bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/Feature_request.md diff --git a/.github/ISSUE_TEMPLATE/Bug_report.md b/.github/ISSUE_TEMPLATE/Bug_report.md new file mode 100644 index 000000000..4de26c77d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/Bug_report.md @@ -0,0 +1,35 @@ +--- +name: Bug report +about: Create a report to help us improve + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/Feature_request.md b/.github/ISSUE_TEMPLATE/Feature_request.md new file mode 100644 index 000000000..538429512 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/Feature_request.md @@ -0,0 +1,17 @@ +--- +name: Feature request +about: Suggest an idea for this project + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. From 10465c86091ee0a1eb17743233045797b244aa3f Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 2 May 2018 13:56:35 -0700 Subject: [PATCH 176/879] Update Bug_report.md --- .github/ISSUE_TEMPLATE/Bug_report.md | 34 +++++----------------------- 1 file changed, 6 insertions(+), 28 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/Bug_report.md b/.github/ISSUE_TEMPLATE/Bug_report.md index 4de26c77d..401023ec8 100644 --- a/.github/ISSUE_TEMPLATE/Bug_report.md +++ b/.github/ISSUE_TEMPLATE/Bug_report.md @@ -4,32 +4,10 @@ about: Create a report to help us improve --- -**Describe the bug** -A clear and concise description of what the bug is. +If possible, please use the Mirage Boilerplate Twiddle to demonstrate your issue or bug: -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] - -**Smartphone (please complete the following information):** - - Device: [e.g. iPhone6] - - OS: [e.g. iOS8.1] - - Browser [e.g. stock browser, safari] - - Version [e.g. 22] - -**Additional context** -Add any other context about the problem here. +- Open the Mirage Boilerplate Twiddle: https://ember-twiddle.com/eedfd390d8394d54d5bfd0ed988a5d0f?openFiles=templates.application.hbs%2C +- Click File > Copy Twiddle +- Reproduce your issue +- Click File > Save to Github Gist +- Include the URL to your Twiddle in your issue From b2824bbc20ccdf7d73025952cb5981367200ee13 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 2 May 2018 14:06:04 -0700 Subject: [PATCH 177/879] Remove new issue templates --- .github/ISSUE_TEMPLATE/Bug_report.md | 13 ------------- .github/ISSUE_TEMPLATE/Feature_request.md | 17 ----------------- 2 files changed, 30 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/Bug_report.md delete mode 100644 .github/ISSUE_TEMPLATE/Feature_request.md diff --git a/.github/ISSUE_TEMPLATE/Bug_report.md b/.github/ISSUE_TEMPLATE/Bug_report.md deleted file mode 100644 index 401023ec8..000000000 --- a/.github/ISSUE_TEMPLATE/Bug_report.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve - ---- - -If possible, please use the Mirage Boilerplate Twiddle to demonstrate your issue or bug: - -- Open the Mirage Boilerplate Twiddle: https://ember-twiddle.com/eedfd390d8394d54d5bfd0ed988a5d0f?openFiles=templates.application.hbs%2C -- Click File > Copy Twiddle -- Reproduce your issue -- Click File > Save to Github Gist -- Include the URL to your Twiddle in your issue diff --git a/.github/ISSUE_TEMPLATE/Feature_request.md b/.github/ISSUE_TEMPLATE/Feature_request.md deleted file mode 100644 index 538429512..000000000 --- a/.github/ISSUE_TEMPLATE/Feature_request.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. From 451dc6a74eaaccb0e58770405416bbb583812bf0 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 2 May 2018 14:22:59 -0700 Subject: [PATCH 178/879] Fixup test --- .../associations/polymorphic-has-many-test.js | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/tests/integration/serializers/base/associations/polymorphic-has-many-test.js b/tests/integration/serializers/base/associations/polymorphic-has-many-test.js index 993db06a6..6410bfd87 100644 --- a/tests/integration/serializers/base/associations/polymorphic-has-many-test.js +++ b/tests/integration/serializers/base/associations/polymorphic-has-many-test.js @@ -50,30 +50,30 @@ module('Integration | Serializers | Base | Associations | Polymorphic Has Many', ] }); }); -}); -test(`it can serialize an embedded polymorphic has-many relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - user: this.BaseSerializer.extend({ - include: ['things'], - embed: true - }) - }); + test(`it can serialize an embedded polymorphic has-many relationship`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: this.BaseSerializer, + user: this.BaseSerializer.extend({ + include: ['things'], + embed: true + }) + }); - let user = this.schema.users.find(1); - let result = registry.serialize(user); + let user = this.schema.users.find(1); + let result = registry.serialize(user); - assert.deepEqual(result, { - user: { - id: '1', - name: 'Ned', - things: [ - { - id: '1', - title: 'Lorem ipsum' - } - ] - } + assert.deepEqual(result, { + user: { + id: '1', + name: 'Ned', + things: [ + { + id: '1', + title: 'Lorem ipsum' + } + ] + } + }); }); }); From 5cc5de86ec12fe9f03dc2ee58f34f53e76e9baeb Mon Sep 17 00:00:00 2001 From: Don Denton Date: Sun, 6 May 2018 01:10:23 -0500 Subject: [PATCH 179/879] Create failing test for issue #1298 --- tests/unit/server-test.js | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/tests/unit/server-test.js b/tests/unit/server-test.js index c2bd31edc..70460a70c 100644 --- a/tests/unit/server-test.js +++ b/tests/unit/server-test.js @@ -563,6 +563,37 @@ module('Unit | Server #create', function() { { name: 'splendid software', id: '1', isPublished: true, publishedAt: '2016-01-01 12:00:00' } ); }); + + test('create does not create (extra) models on associations when they are passed in as overrides', function(assert) { + let MotherFactory = Factory.extend({ + name: 'Should not create' + }); + let ChildFactory = Factory.extend({ + mother: association() + }); + + let server = new Server({ + environment: 'test', + factories: { + mother: MotherFactory, + child: ChildFactory + }, + models: { + mother: Model.extend({ + children: hasMany('child') + }), + child: Model.extend({ + mother: belongsTo('mother') + }) + } + }); + + let mother = server.create('mother', { name: 'Lynda' }); + server.create('child', { name: 'Don', mother }); + server.create('child', { name: 'Dan', mother }); + + assert.equal(server.db.mothers.length, 1); + }); }); module('Unit | Server #createList', function(hooks) { From 65e844a2341f0b84cef39f8198338c793c22248a Mon Sep 17 00:00:00 2001 From: Don Denton Date: Sun, 6 May 2018 02:24:04 -0500 Subject: [PATCH 180/879] Do not create an association if one is passed in as an override fixes #1298 --- addon/server.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/addon/server.js b/addon/server.js index ef11d571f..a55e1d8c9 100644 --- a/addon/server.js +++ b/addon/server.js @@ -358,7 +358,7 @@ export default class Server { let attrs = OriginalFactory.attrs || {}; this._validateTraits(traits, OriginalFactory, type); let mergedExtensions = this._mergeExtensions(attrs, traits, overrides); - this._mapAssociationsFromAttributes(type, attrs); + this._mapAssociationsFromAttributes(type, attrs, overrides); this._mapAssociationsFromAttributes(type, mergedExtensions); let Factory = OriginalFactory.extend(mergedExtensions); @@ -665,14 +665,16 @@ export default class Server { * * @private */ - _mapAssociationsFromAttributes(modelType, attributes) { + _mapAssociationsFromAttributes(modelType, attributes, overrides = {}) { Object.keys(attributes || {}).filter((attr) => { return isAssociation(attributes[attr]); }).forEach((attr) => { let association = attributes[attr]; let associationName = this._fetchAssociationNameFromModel(modelType, attr); let foreignKey = `${camelize(attr)}Id`; - attributes[foreignKey] = this.create(associationName, ...association.traitsAndOverrides).id; + if (!overrides[attr]) { + attributes[foreignKey] = this.create(associationName, ...association.traitsAndOverrides).id; + } delete attributes[attr]; }); } From fd849ca3325a369969ca834083eff1a5d667a173 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sun, 13 May 2018 00:11:20 -0400 Subject: [PATCH 181/879] [closes #1318] Fix linkage data bug --- addon/serializer.js | 2 +- addon/serializers/json-api-serializer.js | 143 ++++++++- testem.js | 1 - .../regressions/1318-linkage-data-bug-test.js | 74 +++++ ...ncludes-graph-snapshot-collections-test.js | 127 ++++++++ ...eate-includes-graph-snapshot-mixed-test.js | 92 ++++++ ...ate-includes-graph-snapshot-models-test.js | 285 ++++++++++++++++++ 7 files changed, 714 insertions(+), 10 deletions(-) create mode 100644 tests/integration/server/regressions/1318-linkage-data-bug-test.js create mode 100644 tests/unit/serializers/json-api-serializer/create-includes-graph-snapshot-collections-test.js create mode 100644 tests/unit/serializers/json-api-serializer/create-includes-graph-snapshot-mixed-test.js create mode 100644 tests/unit/serializers/json-api-serializer/create-includes-graph-snapshot-models-test.js diff --git a/addon/serializer.js b/addon/serializer.js index b0ffc34df..b6e375064 100644 --- a/addon/serializer.js +++ b/addon/serializer.js @@ -14,7 +14,7 @@ import _ from 'lodash'; class Serializer { - constructor(registry, type, request) { + constructor(registry, type, request = {}) { this.registry = registry; this.type = type; this.request = request; diff --git a/addon/serializers/json-api-serializer.js b/addon/serializers/json-api-serializer.js index 48c72f378..4f5b3f8fd 100644 --- a/addon/serializers/json-api-serializer.js +++ b/addon/serializers/json-api-serializer.js @@ -1,6 +1,5 @@ import Serializer from '../serializer'; import { dasherize, pluralize, camelize } from '../utils/inflector'; - import _get from 'lodash/get'; import _ from 'lodash'; @@ -23,6 +22,8 @@ const JSONAPISerializer = Serializer.extend({ }, getHashForPrimaryResource(resource) { + this._createRequestedIncludesGraph(resource); + let resourceHash = this.getHashForResource(resource); let hashWithRoot = { data: resourceHash }; let addToIncludes = this.getAddToIncludesForResource(resource); @@ -149,7 +150,7 @@ const JSONAPISerializer = Serializer.extend({ relationshipHash.links = links[key]; } - if (this.alwaysIncludeLinkageData || this._relationshipIsIncluded(key)) { + if (this.alwaysIncludeLinkageData || this._relationshipIsIncludedForModel(key, model)) { let data = null; if (this.isModel(relationship)) { data = { @@ -191,14 +192,30 @@ const JSONAPISerializer = Serializer.extend({ } }, - _relationshipIsIncluded(relationshipKey) { + /* + This code (and a lot of this serializer) need to be re-worked according to + the graph logic... + */ + _relationshipIsIncludedForModel(relationshipKey, model) { if (this.hasQueryParamIncludes()) { - let relationshipKeyAsString = this.keyForRelationship(relationshipKey); + let graph = this.request._includesGraph; + let graphKey = this._graphKeyForModel(model); + + // Find the resource in the graph + let graphResource; + + // Check primary data + if (graph.data[graphKey]) { + graphResource = graph.data[graphKey]; + + // Check includes + } else if (graph.included[dasherize(pluralize(model.modelName))]) { + graphResource = graph.included[dasherize(pluralize(model.modelName))][graphKey]; + } + + // If the model's in the graph, check if relationshipKey should be included + return graphResource && graphResource.relationships && graphResource.relationships.hasOwnProperty(dasherize(relationshipKey)); - return this.request.queryParams - .include - .split(',') - .some(str => str.indexOf(relationshipKeyAsString) > -1); } else { let relationshipPaths = this.getKeysForIncluded(); @@ -206,6 +223,116 @@ const JSONAPISerializer = Serializer.extend({ } }, + /* + This is needed for _relationshipIsIncludedForModel - see the note there for + more background. + + If/when we can refactor this serializer, the logic in this method would + probably be the basis for the new overall json/graph creation. + */ + _createRequestedIncludesGraph(primaryResource, secondaryResource = null) { + let graph = { + data: {} + }; + + if (this.isModel(primaryResource)) { + let primaryResourceKey = this._graphKeyForModel(primaryResource); + graph.data[primaryResourceKey] = {}; + + this._addPrimaryModelToRequestedIncludesGraph(graph, primaryResource); + + } else if (this.isCollection(primaryResource)) { + primaryResource.models.forEach(model => { + let primaryResourceKey = this._graphKeyForModel(model); + graph.data[primaryResourceKey] = {}; + + this._addPrimaryModelToRequestedIncludesGraph(graph, model); + }); + } + + // Hack :/ Need to think of a better palce to put this if + // refactoring json:api serializer. + this.request._includesGraph = graph; + }, + + _addPrimaryModelToRequestedIncludesGraph(graph, model) { + let graphKey = this._graphKeyForModel(model); + + if (this.hasQueryParamIncludes()) { + let queryParamIncludes = this.getQueryParamIncludes(); + queryParamIncludes.split(',') + // includesPath is post.comments + .forEach(includesPath => { + graph.data[graphKey].relationships = graph.data[graphKey].relationships || {}; + let relationshipKeys = includesPath.split('.'); + let relationshipKey = relationshipKeys[0]; + let relationship = model[camelize(relationshipKey)]; + let relationshipData; + + if (this.isModel(relationship)) { + relationshipData = this._graphKeyForModel(relationship); + } else if (this.isCollection(relationship)) { + relationshipData = relationship.models.map(this._graphKeyForModel); + } else { + relationshipData = null; + } + + graph.data[graphKey].relationships[relationshipKey] = relationshipData; + + if (relationship) { + this._addResourceToRequestedIncludesGraph(graph, relationship, relationshipKeys.slice(1)); + } + }); + } + }, + + _addResourceToRequestedIncludesGraph(graph, resource, relationshipNames) { + let collectionName = dasherize(pluralize(resource.modelName)); + graph.included = graph.included || {}; + graph.included[collectionName] = graph.included[collectionName] || {}; + + let models = this.isCollection(resource) ? resource.models : [ resource ]; + models.forEach(model => { + this._addModelToRequestedIncludesGraph(graph, model, relationshipNames); + }); + }, + + _addModelToRequestedIncludesGraph(graph, model, relationshipNames) { + let collectionName = dasherize(pluralize(model.modelName)); + let resourceKey = this._graphKeyForModel(model); + graph.included[collectionName][resourceKey] = graph.included[collectionName][resourceKey] || {}; + + if (relationshipNames.length) { + this._addResourceRelationshipsToRequestedIncludesGraph(graph, collectionName, resourceKey, model, relationshipNames); + } + }, + + /* + Lot of the same logic here from _addPrimaryModelToRequestedIncludesGraph, could refactor & share + */ + _addResourceRelationshipsToRequestedIncludesGraph(graph, collectionName, resourceKey, model, relationshipNames) { + graph.included[collectionName][resourceKey].relationships = graph.included[collectionName][resourceKey].relationships || {}; + + let relationshipName = relationshipNames[0]; + let relationship = model[camelize(relationshipName)]; + let relationshipData; + + if (this.isModel(relationship)) { + relationshipData = this._graphKeyForModel(relationship); + } else if (this.isCollection(relationship)) { + relationshipData = relationship.models.map(this._graphKeyForModel); + } + graph.included[collectionName][resourceKey].relationships[relationshipName] = relationshipData; + + if (relationship) { + this._addResourceToRequestedIncludesGraph(graph, relationship, relationshipNames.slice(1)); + } + }, + + _graphKeyForModel(model) { + return `${model.modelName}:${model.id}`; + }, + getQueryParamIncludes() { return (_get(this, 'request.queryParams.include')); }, diff --git a/testem.js b/testem.js index d1755a4ea..3a29d4059 100644 --- a/testem.js +++ b/testem.js @@ -5,7 +5,6 @@ module.exports = { 'Chrome' ], launch_in_dev: [ - 'Chrome' ], browser_args: { Chrome: { diff --git a/tests/integration/server/regressions/1318-linkage-data-bug-test.js b/tests/integration/server/regressions/1318-linkage-data-bug-test.js new file mode 100644 index 000000000..a6cf49612 --- /dev/null +++ b/tests/integration/server/regressions/1318-linkage-data-bug-test.js @@ -0,0 +1,74 @@ +import { module, test } from 'qunit'; +import { Model, hasMany, belongsTo, JSONAPISerializer } from 'ember-cli-mirage'; +import Server from 'ember-cli-mirage/server'; +import promiseAjax from 'dummy/tests/helpers/promise-ajax'; + +module('Integration | Server | Regressions | 1318 Linkage bug test', function(hooks) { + hooks.beforeEach(function() { + this.server = new Server({ + environment: 'test', + models: { + happyUser: Model.extend({ + happyLicenses: hasMany() + }), + happyLicense: Model.extend({ + happyUser: belongsTo(), + happySubscription: belongsTo() + }), + happySubscription: Model.extend({ + happyLicenses: hasMany() + }) + }, + serializers: { + application: JSONAPISerializer + }, + baseConfig() { + this.resource('happy-users'); + } + }); + }); + + hooks.afterEach(function() { + this.server.shutdown(); + }); + + test('it works', async function(assert) { + let happySubscription = this.server.create('happy-subscription'); + + let user1 = this.server.create('happy-user'); + this.server.create('happy-license', { happyUser: user1, happySubscription }); + + let user2 = this.server.create('happy-user'); + this.server.create('happy-license', { happyUser: user2, happySubscription }); + + assert.expect(1); + + let response = await promiseAjax({ + method: 'GET', + url: '/happy-users/1?include=happy-licenses.happy-subscription' + }); + let json = response.data; + + assert.deepEqual(json.included, [ + { + id: '1', + type: 'happy-licenses', + attributes: {}, + relationships: { + 'happy-subscription': { + data: { + type: 'happy-subscriptions', + id: '1' + } + } + } + }, + { + id: '1', + type: 'happy-subscriptions', + attributes: {} + } + ]); + }); + +}); diff --git a/tests/unit/serializers/json-api-serializer/create-includes-graph-snapshot-collections-test.js b/tests/unit/serializers/json-api-serializer/create-includes-graph-snapshot-collections-test.js new file mode 100644 index 000000000..75d81341d --- /dev/null +++ b/tests/unit/serializers/json-api-serializer/create-includes-graph-snapshot-collections-test.js @@ -0,0 +1,127 @@ +import JSONAPISerializer from 'ember-cli-mirage/serializers/json-api-serializer'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; +import { module, test } from 'qunit'; +import { Model, hasMany } from 'ember-cli-mirage'; + +/* + This test is heavily coupled to the implementation and can be deleted + during a future refactoring. +*/ +module('Unit | Serializers | JSON API Serializer | #_createIncludesGraphSnapshot collections', function(hooks) { + hooks.beforeEach(function() { + let serializer; + let registry = { + serializerFor() { + return serializer; + } + }; + let type = 'foo'; + let request = {}; + + serializer = new JSONAPISerializer(registry, type, request); + this.serializer = serializer; + }); + + test('it works on collections with no includes', function(assert) { + let schema = new Schema(new Db(), { + wordSmith: Model.extend({ + }) + }); + schema.wordSmiths.create(); + schema.wordSmiths.create(); + + this.serializer._createRequestedIncludesGraph(schema.wordSmiths.all()); + + assert.deepEqual(this.serializer.request._includesGraph, { + data: { + 'word-smith:1': {}, + 'word-smith:2': {} + } + }); + }); + + test('it works on collections with hasMany relationships and dot-path includes', function(assert) { + let schema = new Schema(new Db(), { + wordSmith: Model.extend({ + redTags: hasMany(), + bluePosts: hasMany() + }), + bluePost: Model.extend({ + redTags: hasMany() + }), + redTag: Model.extend({ + someColors: hasMany() + }), + someColor: Model.extend() + }); + let wordSmith1 = schema.wordSmiths.create(); + wordSmith1.createRedTag(); + wordSmith1.createRedTag(); + + let bluePost = wordSmith1.createBluePost(); + let redTag = bluePost.createRedTag(); + redTag.createSomeColor(); + + let wordSmith2 = schema.wordSmiths.create(); + wordSmith2.createRedTag(); + + let bluePost2 = wordSmith2.createBluePost(); + let redTag2 = bluePost2.createRedTag(); + redTag2.createSomeColor(); + + this.serializer.request = { queryParams: { include: 'red-tags,blue-posts.red-tags.some-colors' } }; + + this.serializer._createRequestedIncludesGraph(schema.wordSmiths.all()); + + assert.deepEqual(this.serializer.request._includesGraph, { + data: { + 'word-smith:1': { + relationships: { + 'red-tags': [ 'red-tag:1', 'red-tag:2' ], + 'blue-posts': [ 'blue-post:1' ] + } + }, + 'word-smith:2': { + relationships: { + 'red-tags': [ 'red-tag:4' ], + 'blue-posts': [ 'blue-post:2' ] + } + } + }, + included: { + 'red-tags': { + 'red-tag:1': {}, + 'red-tag:2': {}, + 'red-tag:3': { + relationships: { + 'some-colors': [ 'some-color:1' ] + } + }, + 'red-tag:4': {}, + 'red-tag:5': { + relationships: { + 'some-colors': [ 'some-color:2' ] + } + } + }, + 'blue-posts': { + 'blue-post:1': { + relationships: { + 'red-tags': [ 'red-tag:3' ] + } + }, + 'blue-post:2': { + relationships: { + 'red-tags': [ 'red-tag:5' ] + } + } + }, + 'some-colors': { + 'some-color:1': {}, + 'some-color:2': {} + } + } + }); + }); +}); diff --git a/tests/unit/serializers/json-api-serializer/create-includes-graph-snapshot-mixed-test.js b/tests/unit/serializers/json-api-serializer/create-includes-graph-snapshot-mixed-test.js new file mode 100644 index 000000000..0d17a74ae --- /dev/null +++ b/tests/unit/serializers/json-api-serializer/create-includes-graph-snapshot-mixed-test.js @@ -0,0 +1,92 @@ +import JSONAPISerializer from 'ember-cli-mirage/serializers/json-api-serializer'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; +import { module, test } from 'qunit'; +import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; + +/* + This test is heavily coupled to the implementation and can be deleted + during a future refactoring. +*/ +module('Unit | Serializers | JSON API Serializer | #_createIncludesGraphSnapshot mixed', function(hooks) { + hooks.beforeEach(function() { + let serializer; + let registry = { + serializerFor() { + return serializer; + } + }; + let type = 'foo'; + let request = {}; + + serializer = new JSONAPISerializer(registry, type, request); + this.serializer = serializer; + }); + + test('it works on models and collections with dot-path includes', function(assert) { + let schema = new Schema(new Db(), { + wordSmith: Model.extend({ + blogPosts: hasMany() + }), + blogPost: Model.extend({ + happyTag: belongsTo() + }), + happyTag: Model.extend({ + happyColor: belongsTo() + }), + happyColor: Model.extend() + }); + let wordSmith = schema.wordSmiths.create(); + let blogPost1 = wordSmith.createBlogPost(); + let happyTag = blogPost1.createHappyTag(); + happyTag.createHappyColor(); + + let blogPost2 = wordSmith.createBlogPost(); + let happyTag2 = blogPost2.createHappyTag(); + happyTag2.createHappyColor(); + + this.serializer.request = { queryParams: { include: 'blog-posts.happy-tag.happy-color' } }; + + this.serializer._createRequestedIncludesGraph(wordSmith); + + assert.deepEqual(this.serializer.request._includesGraph, { + data: { + 'word-smith:1': { + relationships: { + 'blog-posts': [ 'blog-post:1', 'blog-post:2' ] + } + } + }, + included: { + 'blog-posts': { + 'blog-post:1': { + relationships: { + 'happy-tag': 'happy-tag:1' + } + }, + 'blog-post:2': { + relationships: { + 'happy-tag': 'happy-tag:2' + } + } + }, + 'happy-tags': { + 'happy-tag:1': { + relationships: { + 'happy-color': 'happy-color:1' + } + }, + 'happy-tag:2': { + relationships: { + 'happy-color': 'happy-color:2' + } + } + }, + 'happy-colors': { + 'happy-color:1': {}, + 'happy-color:2': {} + } + } + }); + }); +}); diff --git a/tests/unit/serializers/json-api-serializer/create-includes-graph-snapshot-models-test.js b/tests/unit/serializers/json-api-serializer/create-includes-graph-snapshot-models-test.js new file mode 100644 index 000000000..6fb696a73 --- /dev/null +++ b/tests/unit/serializers/json-api-serializer/create-includes-graph-snapshot-models-test.js @@ -0,0 +1,285 @@ +import JSONAPISerializer from 'ember-cli-mirage/serializers/json-api-serializer'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; +import { Model, belongsTo, hasMany } from 'ember-cli-mirage'; +import { module, test } from 'qunit'; + +/* + This test is heavily coupled to the implementation and can be deleted + during a future refactoring. +*/ +module('Unit | Serializers | JSON API Serializer | #_createIncludesGraphSnapshot models', function(hooks) { + hooks.beforeEach(function() { + let serializer; + let registry = { + serializerFor() { + return serializer; + } + }; + let type = 'foo'; + let request = {}; + + serializer = new JSONAPISerializer(registry, type, request); + this.serializer = serializer; + }); + + test('it works on models with no includes', function(assert) { + let schema = new Schema(new Db(), { + wordSmith: Model.extend({ + }) + }); + let wordSmith = schema.wordSmiths.create(); + + this.serializer._createRequestedIncludesGraph(wordSmith); + + assert.deepEqual(this.serializer.request._includesGraph, { + data: { + 'word-smith:1': {} + } + }); + }); + + test("it doesn't choke on an empty belongsTo relationship", function(assert) { + let schema = new Schema(new Db(), { + wordSmith: Model.extend({ + blogPost: belongsTo() + }), + blogPost: Model.extend({ + happyCategory: belongsTo() + }), + happyCategory: Model.extend() + }); + let wordSmith = schema.wordSmiths.create(); + wordSmith.createBlogPost(); + + this.serializer.request = { queryParams: { include: 'blog-post.happy-category' } }; + + this.serializer._createRequestedIncludesGraph(wordSmith); + + assert.deepEqual(this.serializer.request._includesGraph, { + data: { + 'word-smith:1': { + relationships: { + 'blog-post': 'blog-post:1' + } + } + }, + included: { + 'blog-posts': { + 'blog-post:1': { + relationships: { + 'happy-category': undefined + } + } + } + } + }); + }); + + test('it works on models with belongsTo relationships', function(assert) { + let schema = new Schema(new Db(), { + wordSmith: Model.extend({ + redTag: belongsTo(), + bluePost: belongsTo() + }), + bluePost: Model.extend({ + redTag: belongsTo() + }), + redTag: Model.extend() + }); + let wordSmith = schema.wordSmiths.create(); + wordSmith.createRedTag(); + + let bluePost = wordSmith.createBluePost(); + bluePost.createRedTag(); + + this.serializer.request = { queryParams: { include: 'red-tag,blue-post' } }; + + this.serializer._createRequestedIncludesGraph(wordSmith); + + assert.deepEqual(this.serializer.request._includesGraph, { + data: { + 'word-smith:1': { + relationships: { + 'red-tag': 'red-tag:1', + 'blue-post': 'blue-post:1' + } + } + }, + included: { + 'red-tags': { + 'red-tag:1': { + } + }, + 'blue-posts': { + 'blue-post:1': { + } + } + } + }); + }); + + test('it works on models with belongsTo relationships and dot-path includes', function(assert) { + let schema = new Schema(new Db(), { + wordSmith: Model.extend({ + redTag: belongsTo(), + bluePost: belongsTo() + }), + bluePost: Model.extend({ + redTag: belongsTo() + }), + redTag: Model.extend({ + someColor: belongsTo() + }), + someColor: Model.extend({ + }) + }); + let wordSmith = schema.wordSmiths.create(); + wordSmith.createRedTag(); + + let bluePost = wordSmith.createBluePost(); + let redTag = bluePost.createRedTag(); + redTag.createSomeColor(); + + this.serializer.request = { queryParams: { include: 'red-tag,blue-post.red-tag.some-color' } }; + + this.serializer._createRequestedIncludesGraph(wordSmith); + + assert.deepEqual(this.serializer.request._includesGraph, { + data: { + 'word-smith:1': { + relationships: { + 'red-tag': 'red-tag:1', + 'blue-post': 'blue-post:1' + } + } + }, + included: { + 'red-tags': { + 'red-tag:1': { + }, + 'red-tag:2': { + relationships: { + 'some-color': 'some-color:1' + } + } + }, + 'blue-posts': { + 'blue-post:1': { + relationships: { + 'red-tag': 'red-tag:2' + } + } + }, + 'some-colors': { + 'some-color:1': {} + } + } + }); + }); + + test('it works on models with hasMany relationships', function(assert) { + let schema = new Schema(new Db(), { + wordSmith: Model.extend({ + redTags: hasMany(), + bluePosts: hasMany() + }), + bluePost: Model.extend({ + redTags: hasMany() + }), + redTag: Model.extend() + }); + let wordSmith = schema.wordSmiths.create(); + wordSmith.createRedTag(); + wordSmith.createRedTag(); + + let bluePost = wordSmith.createBluePost(); + bluePost.createRedTag(); + + this.serializer.request = { queryParams: { include: 'red-tags,blue-posts' } }; + + this.serializer._createRequestedIncludesGraph(wordSmith); + + assert.deepEqual(this.serializer.request._includesGraph, { + data: { + 'word-smith:1': { + relationships: { + 'red-tags': [ 'red-tag:1', 'red-tag:2' ], + 'blue-posts': [ 'blue-post:1' ] + } + } + }, + included: { + 'red-tags': { + 'red-tag:1': { + }, + 'red-tag:2': { + } + }, + 'blue-posts': { + 'blue-post:1': { + } + } + } + }); + }); + + test('it works on models with hasMany relationships and dot-path includes', function(assert) { + let schema = new Schema(new Db(), { + wordSmith: Model.extend({ + redTags: hasMany(), + bluePosts: hasMany() + }), + bluePost: Model.extend({ + redTags: hasMany() + }), + redTag: Model.extend({ + someColors: hasMany() + }), + someColor: Model.extend() + }); + let wordSmith = schema.wordSmiths.create(); + wordSmith.createRedTag(); + wordSmith.createRedTag(); + + let bluePost = wordSmith.createBluePost(); + let redTag = bluePost.createRedTag(); + redTag.createSomeColor(); + + this.serializer.request = { queryParams: { include: 'red-tags,blue-posts.red-tags.some-colors' } }; + + this.serializer._createRequestedIncludesGraph(wordSmith); + + assert.deepEqual(this.serializer.request._includesGraph, { + data: { + 'word-smith:1': { + relationships: { + 'red-tags': [ 'red-tag:1', 'red-tag:2' ], + 'blue-posts': [ 'blue-post:1' ] + } + } + }, + included: { + 'red-tags': { + 'red-tag:1': {}, + 'red-tag:2': {}, + 'red-tag:3': { + relationships: { + 'some-colors': [ 'some-color:1' ] + } + } + }, + 'blue-posts': { + 'blue-post:1': { + relationships: { + 'red-tags': [ 'red-tag:3' ] + } + } + }, + 'some-colors': { + 'some-color:1': {} + } + } + }); + }); +}); From 51ceafb867211458e1fd8696df42bafbf0e15306 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sun, 13 May 2018 12:06:28 -0400 Subject: [PATCH 182/879] 0.4.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 24df6ba59..17ff805a5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "0.4.6", + "version": "0.4.7", "description": "A client-side HTTP server to develop, test and demo your Ember app", "keywords": [ "ember-addon", From ab05604a8a01ea02a0e24c40c58ed2cb306a23d0 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 18 May 2018 18:13:07 -0400 Subject: [PATCH 183/879] Lint --- tests/unit/serializers/active-model-serializer-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/serializers/active-model-serializer-test.js b/tests/unit/serializers/active-model-serializer-test.js index 11ff79dad..19e913a2a 100644 --- a/tests/unit/serializers/active-model-serializer-test.js +++ b/tests/unit/serializers/active-model-serializer-test.js @@ -119,7 +119,7 @@ module('Unit | Serializers | ActiveModelSerializer', function(hooks) { } }); }); - + test('serializeIds defaults to "always"', function(assert) { let defaultState = new ActiveModelSerializer; assert.equal(defaultState.serializeIds, 'always'); From dbe761ff8a1bbe7a86c2ce1d02bfb3af03573ee9 Mon Sep 17 00:00:00 2001 From: Cory Date: Tue, 5 Jun 2018 14:22:26 -0400 Subject: [PATCH 184/879] Failing test for #1322 --- ...22-relationship-path-normalization-test.js | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 tests/integration/server/regressions/1322-relationship-path-normalization-test.js diff --git a/tests/integration/server/regressions/1322-relationship-path-normalization-test.js b/tests/integration/server/regressions/1322-relationship-path-normalization-test.js new file mode 100644 index 000000000..fdcb169ad --- /dev/null +++ b/tests/integration/server/regressions/1322-relationship-path-normalization-test.js @@ -0,0 +1,73 @@ +import { module, test } from 'qunit'; +import { Model, hasMany, belongsTo, JSONAPISerializer } from 'ember-cli-mirage'; +import Server from 'ember-cli-mirage/server'; +import promiseAjax from 'dummy/tests/helpers/promise-ajax'; + +module('Integration | Server | Regressions | 1322 Relationship Path Normalization Test', function(hooks) { + hooks.beforeEach(function() { + this.server = new Server({ + environment: 'test', + models: { + happyUser: Model.extend({ + happyLicenses: hasMany() + }), + happyLicense: Model.extend({ + happyUser: belongsTo() + }) + }, + serializers: { + application: JSONAPISerializer.extend({ + keyForRelationship(relationshipName) { + if (relationshipName === 'happyUser') { + return 'happy_user'; + } else { + return JSONAPISerializer.prototype.keyForRelationship.apply(this, arguments); + } + } + }) + }, + baseConfig() { + this.resource('happy-licenses'); + } + }); + }); + + hooks.afterEach(function() { + this.server.shutdown(); + }); + + test('it works', async function(assert) { + let user1 = this.server.create('happy-user'); + this.server.create('happy-license', { happyUser: user1 }); + + assert.expect(2); + + let response = await promiseAjax({ + method: 'GET', + url: '/happy-licenses/1?include=happy_user' + }); + let json = response.data; + + assert.deepEqual(json.data, { + attributes: {}, + id: "1", + relationships: { + "happy_user": { + data: { + id: user1.id, + type: "happy-users" + } + } + }, + type: "happy-licenses" + }); + assert.deepEqual(json.included, [ + { + id: user1.id, + type: 'happy-users', + attributes: {} + } + ]); + }); + +}); From 8c31eef9a66e262ae944c40fcb871c4f99edbcad Mon Sep 17 00:00:00 2001 From: Cory Date: Tue, 5 Jun 2018 14:22:49 -0400 Subject: [PATCH 185/879] Dasherize relationship path names when adding to internal graph Fixes #1322 --- addon/serializers/json-api-serializer.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addon/serializers/json-api-serializer.js b/addon/serializers/json-api-serializer.js index 4f5b3f8fd..f03a8d7a5 100644 --- a/addon/serializers/json-api-serializer.js +++ b/addon/serializers/json-api-serializer.js @@ -266,6 +266,7 @@ const JSONAPISerializer = Serializer.extend({ graph.data[graphKey].relationships = graph.data[graphKey].relationships || {}; let relationshipKeys = includesPath.split('.'); let relationshipKey = relationshipKeys[0]; + let graphRelationshipKey = dasherize(relationshipKey); let relationship = model[camelize(relationshipKey)]; let relationshipData; @@ -277,7 +278,7 @@ const JSONAPISerializer = Serializer.extend({ relationshipData = null; } - graph.data[graphKey].relationships[relationshipKey] = relationshipData; + graph.data[graphKey].relationships[graphRelationshipKey] = relationshipData; if (relationship) { this._addResourceToRequestedIncludesGraph(graph, relationship, relationshipKeys.slice(1)); From 8a6ba9d35a274d98dc8e27a4076f238e2f0ffc0b Mon Sep 17 00:00:00 2001 From: Cory Date: Thu, 7 Jun 2018 16:00:03 -0400 Subject: [PATCH 186/879] Throw when `include`ing a value that doesn't match an associationKey This prevents downstream errors when a property of the model is being passed around that Mirage thinks is an association but is in reality a primitive (such as a string) property of the model. Fixes #1327 --- addon/serializers/json-api-serializer.js | 8 ++++++- .../associations/includes-test.js | 21 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/addon/serializers/json-api-serializer.js b/addon/serializers/json-api-serializer.js index 4f5b3f8fd..19373d720 100644 --- a/addon/serializers/json-api-serializer.js +++ b/addon/serializers/json-api-serializer.js @@ -2,6 +2,7 @@ import Serializer from '../serializer'; import { dasherize, pluralize, camelize } from '../utils/inflector'; import _get from 'lodash/get'; import _ from 'lodash'; +import assert from 'ember-cli-mirage/assert'; const JSONAPISerializer = Serializer.extend({ @@ -266,7 +267,12 @@ const JSONAPISerializer = Serializer.extend({ graph.data[graphKey].relationships = graph.data[graphKey].relationships || {}; let relationshipKeys = includesPath.split('.'); let relationshipKey = relationshipKeys[0]; - let relationship = model[camelize(relationshipKey)]; + let normalizedRelationshipKey = camelize(relationshipKey); + let hasAssociation = model.associationKeys.includes(normalizedRelationshipKey); + + assert(hasAssociation, `You tried to include "${relationshipKey}" with ${model} but no association named "${normalizedRelationshipKey}" is defined on the model.`); + + let relationship = model[normalizedRelationshipKey]; let relationshipData; if (this.isModel(relationship)) { diff --git a/tests/integration/serializers/json-api-serializer/associations/includes-test.js b/tests/integration/serializers/json-api-serializer/associations/includes-test.js index 6ae633406..7e980b329 100644 --- a/tests/integration/serializers/json-api-serializer/associations/includes-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/includes-test.js @@ -494,4 +494,25 @@ module('Integration | Serializers | JSON API Serializer | Associations | Include ] }); }); + + test('queryParamIncludes throws if including something that is not an association', function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer + }); + + this.schema.db.loadData({ + blogPosts: [ + { id: 2, title: 'Lorem Ipsum' } + ] + }); + let request = { + queryParams: { + include: 'title' + } + }; + + assert.throws(() => { + registry.serialize(this.schema.blogPosts.first(), request); + }, /You tried to include "title".*but no association named "title" is defined/); + }); }); From e7da1225c4843f389b850748979f6763d805d5b5 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 11 Jun 2018 00:00:12 -0400 Subject: [PATCH 187/879] Update json-api-serializer.js --- addon/serializers/json-api-serializer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addon/serializers/json-api-serializer.js b/addon/serializers/json-api-serializer.js index b7696f1b6..556015a63 100644 --- a/addon/serializers/json-api-serializer.js +++ b/addon/serializers/json-api-serializer.js @@ -270,9 +270,9 @@ const JSONAPISerializer = Serializer.extend({ let graphRelationshipKey = dasherize(relationshipKey); let normalizedRelationshipKey = camelize(relationshipKey); let hasAssociation = model.associationKeys.includes(normalizedRelationshipKey); - + assert(hasAssociation, `You tried to include "${relationshipKey}" with ${model} but no association named "${normalizedRelationshipKey}" is defined on the model.`); - + let relationship = model[normalizedRelationshipKey]; let relationshipData; From 6aaad6b15094bbb9924bd376066ab99a9c6b806b Mon Sep 17 00:00:00 2001 From: Scott Kidder Date: Wed, 27 Jun 2018 12:49:09 -0400 Subject: [PATCH 188/879] fix exists-sync deprecation by replacing with fs.existsSync --- blueprints/ember-cli-mirage/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blueprints/ember-cli-mirage/index.js b/blueprints/ember-cli-mirage/index.js index 764385ed5..9f21580ea 100644 --- a/blueprints/ember-cli-mirage/index.js +++ b/blueprints/ember-cli-mirage/index.js @@ -3,7 +3,7 @@ 'use strict'; var path = require('path'); -var existsSync = require('exists-sync'); +var fs = require('fs'); var chalk = require('chalk'); var EOL = require('os').EOL; @@ -51,7 +51,7 @@ module.exports = { }, insertShutdownIntoDestroyApp: function() { - if (existsSync('tests/helpers/destroy-app.js')) { + if (fs.existsSync('tests/helpers/destroy-app.js')) { var shutdownText = ' if (window.server) {\n window.server.shutdown();\n }'; return this.insertIntoFile('tests/helpers/destroy-app.js', shutdownText, { after: "run(application, 'destroy');\n" From d8b051518e4cf9957ebf27c3da46231d45953de1 Mon Sep 17 00:00:00 2001 From: Scott Kidder Date: Wed, 27 Jun 2018 12:55:02 -0400 Subject: [PATCH 189/879] remove exists-sync from dependencies --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 17ff805a5..5f2e7e8df 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,6 @@ "ember-get-config": "^0.2.2", "ember-inflector": "^2.0.0", "ember-lodash": "^4.17.3", - "exists-sync": "0.0.3", "fake-xml-http-request": "^1.4.0", "faker": "^3.0.0", "pretender": "^1.6.1", From a19814654721bbce9131454ad72b4d931de9339a Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 29 Jun 2018 14:44:47 -0400 Subject: [PATCH 190/879] Improve polymorphism support - Adds polymorphism support to shorthands - Adds polymorphism support to normalizedRequestAttrs Co-authored-by: Aidan Nulman --- addon/orm/associations/association.js | 14 +- addon/orm/model.js | 12 ++ addon/route-handlers/base.js | 19 +- ...patch-shorthand-with-relationships-test.js | 148 +++++++++++++++ .../post-shorthand-with-relationships-test.js | 175 ++++++++++++++++++ .../route-handlers/shorthands/base-test.js | 109 ----------- 6 files changed, 362 insertions(+), 115 deletions(-) create mode 100644 tests/integration/server/shorthands/patch-shorthand-with-relationships-test.js create mode 100644 tests/integration/server/shorthands/post-shorthand-with-relationships-test.js diff --git a/addon/orm/associations/association.js b/addon/orm/associations/association.js index 013c60088..be3bac2c6 100644 --- a/addon/orm/associations/association.js +++ b/addon/orm/associations/association.js @@ -1,4 +1,4 @@ -import { dasherize } from 'ember-cli-mirage/utils/inflector'; +import { camelize, singularize, dasherize } from 'ember-cli-mirage/utils/inflector'; export default class Association { @@ -48,4 +48,16 @@ export default class Association { get isPolymorphic() { return this.opts.polymorphic; } + + get isHasMany() { + return this.constructor.name === 'HasMany'; + } + + get isBelongsTo() { + return this.constructor.name === 'BelongsTo'; + } + + get identifier() { + return this.isHasMany ? `${camelize(singularize(this.key))}Ids` : `${camelize(this.key)}Id`; + } } diff --git a/addon/orm/model.js b/addon/orm/model.js index 9934f4cef..1ce291057 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -807,6 +807,18 @@ class Model { return `model:${this.modelName}${idLabel}`; } + + /** + * Checks the equality of this model and the passed-in model + * + * @method equals + * @return boolean + * @public + */ + equals(model) { + return this.toString() === model.toString(); + } + } Model.extend = extend; diff --git a/addon/route-handlers/base.js b/addon/route-handlers/base.js index e2a7b9d3f..bea40e9b2 100644 --- a/addon/route-handlers/base.js +++ b/addon/route-handlers/base.js @@ -55,14 +55,23 @@ export default class BaseRouteHandler { } if (json.data.relationships) { - Object.keys(json.data.relationships).forEach((key) => { - let relationship = json.data.relationships[key]; + Object.keys(json.data.relationships).forEach((relationshipName) => { + let relationship = json.data.relationships[relationshipName]; + let modelClass = this.schema.modelClassFor(modelName); + let association = modelClass.associationFor(relationshipName); + let valueForRelationship; + + if (association.isPolymorphic) { + valueForRelationship = relationship.data; + + } else if (association.isHasMany) { + valueForRelationship = relationship.data && relationship.data.map(rel => rel.id); - if (Array.isArray(relationship.data)) { - attrs[`${camelize(singularize(key))}Ids`] = relationship.data.map(rel => rel.id); } else { - attrs[`${camelize(key)}Id`] = relationship.data && relationship.data.id; + valueForRelationship = relationship.data && relationship.data.id; } + + attrs[association.identifier] = valueForRelationship; }, {}); } diff --git a/tests/integration/server/shorthands/patch-shorthand-with-relationships-test.js b/tests/integration/server/shorthands/patch-shorthand-with-relationships-test.js new file mode 100644 index 000000000..969af8fa0 --- /dev/null +++ b/tests/integration/server/shorthands/patch-shorthand-with-relationships-test.js @@ -0,0 +1,148 @@ +import { module, test } from 'qunit'; +import Server from 'ember-cli-mirage/server'; +import { Model, belongsTo, hasMany } from 'ember-cli-mirage'; +import PostShorthandRouteHandler from 'ember-cli-mirage/route-handlers/shorthands/post'; +import JSONAPISerializer from 'ember-cli-mirage/serializers/json-api-serializer'; +import promiseAjax from '../../../helpers/promise-ajax'; + +module('Integration | Server | Shorthands | Patch with relationships', function(hooks) { + hooks.beforeEach(function() { + this.newServerWithSchema = function(schema) { + this.server = new Server({ + environment: 'development', + models: schema + }); + this.server.timing = 0; + this.server.logging = false; + this.schema = this.server.schema; + + this.serializer = new JSONAPISerializer(); + + return this.server; + }; + + this.handleRequest = function({ url, body }) { + let request = { requestBody: JSON.stringify(body), url }; + let handler = new PostShorthandRouteHandler(this.schema, this.serializer); + return handler.handle(request); + }; + }); + + hooks.afterEach(function() { + this.server.shutdown(); + }); + + test('it can null out belongs to relationships', async function(assert) { + let server = this.newServerWithSchema({ + author: Model.extend({ + posts: hasMany() + }), + post: Model.extend({ + author: belongsTo() + }) + }); + server.loadConfig(function() { + this.patch('/posts/:id'); + }); + + let author = server.create('author'); + let post = server.create('post', { author }); + + await promiseAjax({ + method: 'PATCH', + url: `/posts/${post.id}`, + data: JSON.stringify({ + data: { + attributes: { + title: 'Post 1' + }, + relationships: { + author: { + data: null + } + } + } + }) + }); + + post.reload(); + assert.equal(post.author, null); + }); + + test('it can null out belongs to polymorphic relationships', async function(assert) { + let server = this.newServerWithSchema({ + video: Model.extend(), + post: Model.extend(), + comment: Model.extend({ + commentable: belongsTo({ polymorphic: true }) + }) + }); + server.loadConfig(function() { + this.patch('/comments/:id'); + }); + + let video = server.create('video'); + let comment = server.create('comment', { + commentable: video + }); + + await promiseAjax({ + method: 'PATCH', + url: `/comments/${comment.id}`, + data: JSON.stringify({ + data: { + attributes: { + title: 'Post 1' + }, + relationships: { + commentable: { + data: null + } + } + } + }) + }); + + comment.reload(); + assert.equal(comment.commentable, null); + }); + + test('it can null out has many polymorphic relationships', async function(assert) { + let server = this.newServerWithSchema({ + car: Model.extend(), + watch: Model.extend(), + user: Model.extend({ + collectibles: hasMany({ polymorphic: true }) + }) + }); + server.loadConfig(function() { + this.patch('/users/:id'); + }); + + let car = server.create('car'); + let watch = server.create('watch'); + let user = server.create('user', { + collectibles: [ car, watch ] + }); + + await promiseAjax({ + method: 'PATCH', + url: `/users/${user.id}`, + data: JSON.stringify({ + data: { + attributes: { + }, + relationships: { + collectibles: { + data: null + } + } + } + }) + }); + + user.reload(); + assert.equal(user.collectibles.length, 0); + }); + +}); diff --git a/tests/integration/server/shorthands/post-shorthand-with-relationships-test.js b/tests/integration/server/shorthands/post-shorthand-with-relationships-test.js new file mode 100644 index 000000000..7c049e6c2 --- /dev/null +++ b/tests/integration/server/shorthands/post-shorthand-with-relationships-test.js @@ -0,0 +1,175 @@ +import { module, test } from 'qunit'; +import Server from 'ember-cli-mirage/server'; +import { Model, belongsTo, hasMany } from 'ember-cli-mirage'; +import PostShorthandRouteHandler from 'ember-cli-mirage/route-handlers/shorthands/post'; +import JSONAPISerializer from 'ember-cli-mirage/serializers/json-api-serializer'; +import promiseAjax from '../../../helpers/promise-ajax'; + +module('Integration | Server | Shorthands | Post with relationships', function(hooks) { + hooks.beforeEach(function() { + this.newServerWithSchema = function(schema) { + this.server = new Server({ + environment: 'development', + models: schema + }); + this.server.timing = 0; + this.server.logging = false; + this.schema = this.server.schema; + + this.serializer = new JSONAPISerializer(); + + return this.server; + }; + + this.handleRequest = function({ url, body }) { + let request = { requestBody: JSON.stringify(body), url }; + let handler = new PostShorthandRouteHandler(this.schema, this.serializer); + return handler.handle(request); + }; + }); + + hooks.afterEach(function() { + this.server.shutdown(); + }); + + test('it works for belongs to', async function(assert) { + let server = this.newServerWithSchema({ + author: Model.extend({ + posts: hasMany() + }), + post: Model.extend({ + author: belongsTo() + }) + }); + server.loadConfig(function() { + this.post('/posts'); + }); + + assert.equal(server.db.posts.length, 0); + + let author = server.create('author'); + + let response = await promiseAjax({ + method: 'POST', + url: '/posts', + data: JSON.stringify({ + data: { + attributes: { + title: 'Post 1' + }, + relationships: { + author: { + data: { + type: 'authors', + id: author.id + } + } + } + } + }) + }); + + let postId = response.data.post.id; + let post = server.schema.posts.find(postId); + + assert.ok(post); + assert.equal(post.author.id, author.id); + }); + + test('it works for belongs to polymorphic', async function(assert) { + let server = this.newServerWithSchema({ + video: Model.extend(), + post: Model.extend(), + comment: Model.extend({ + commentable: belongsTo({ polymorphic: true }) + }) + }); + server.loadConfig(function() { + this.post('/comments'); + }); + + assert.equal(server.db.comments.length, 0); + + let video = server.create('video'); + + let response = await promiseAjax({ + method: 'POST', + url: '/comments', + data: JSON.stringify({ + data: { + type: 'comments', + attributes: { + text: 'Comment 1' + }, + relationships: { + commentable: { + data: { + type: 'videos', + id: video.id + } + } + } + } + }) + }); + + let commentId = response.data.comment.id; + let comment = server.schema.comments.find(commentId); + + assert.ok(comment); + assert.ok(comment.commentable.equals(video)); + }); + + test('it works for has many polymorphic', async function(assert) { + let server = this.newServerWithSchema({ + car: Model.extend(), + watch: Model.extend(), + user: Model.extend({ + collectibles: hasMany({ polymorphic: true }) + }) + }); + server.loadConfig(function() { + this.post('/users'); + }); + + assert.equal(server.db.users.length, 0); + + let car = server.create('car'); + let watch = server.create('watch'); + + let response = await promiseAjax({ + method: 'POST', + url: '/users', + data: JSON.stringify({ + data: { + type: 'users', + attributes: { + name: 'Elon Musk' + }, + relationships: { + collectibles: { + data: [ + { + type: 'cars', + id: car.id + }, + { + type: 'watches', + id: watch.id + } + ] + } + } + } + }) + }); + + let userId = response.data.user.id; + let user = server.schema.users.find(userId); + + assert.ok(user); + assert.ok(user.collectibles.includes(car)); + assert.ok(user.collectibles.includes(watch)); + }); + +}); diff --git a/tests/unit/route-handlers/shorthands/base-test.js b/tests/unit/route-handlers/shorthands/base-test.js index 8c9b47a4b..497636a5d 100644 --- a/tests/unit/route-handlers/shorthands/base-test.js +++ b/tests/unit/route-handlers/shorthands/base-test.js @@ -47,113 +47,4 @@ module('Unit | Route handlers | Shorthands | BaseShorthandRouteHandler', functio assert.equal(this.handler._getIdForRequest(request, jsonApiDoc), 'jsonapi-id', 'it returns id from json api data.'); }); - test('_getAttrsForRequest works with attributes and relationships', function(assert) { - let payload = { - 'data': { - 'attributes': { - 'does-mirage': true, - 'name': 'Sam' - }, - 'relationships': { - 'company': { - 'data': { - 'id': '1', - 'type': 'companies' - } - }, - 'employees': { - 'data': [{ - 'id': '1', - 'type': 'employees' - }, { - 'id': '2', - 'type': 'employees' - }, { - 'id': '3', - 'type': 'employees' - }] - }, - 'nothings': { - 'data': [] - }, - 'github-account': { - 'data': { - 'id': '1', - 'type': 'github-accounts' - } - }, - 'something': { - 'data': null - } - }, - 'type': 'github-account' - } - }; - - this.handler._getJsonApiDocForRequest = function() { - return payload; - }; - - let attrs = this.handler._getAttrsForRequest(this.request, 'user'); - - assert.deepEqual( - attrs, - { - name: 'Sam', - doesMirage: true, - companyId: '1', - employeeIds: ['1', '2', '3'], - nothingIds: [], - githubAccountId: '1', - somethingId: null - }, - 'it normalizes data correctly.' - ); - }); - - test('_getAttrsForRequest works with just relationships', function(assert) { - let payload = { - 'data': { - 'relationships': { - 'company': { - 'data': { - 'id': '1', - 'type': 'companies' - } - } - }, - 'type': 'github-account' - } - }; - - this.handler._getJsonApiDocForRequest = function() { - return payload; - }; - - let attrs = this.handler._getAttrsForRequest(this.request, 'user'); - - assert.deepEqual( - attrs, - { - companyId: '1' - }, - 'it normalizes data correctly.' - ); - }); - - test('_getAttrsForRequest works with just type', function(assert) { - let payload = { - 'data': { - 'type': 'github-account' - } - }; - - this.handler._getJsonApiDocForRequest = function(request, modelName) { - return payload; - }; - - let attrs = this.handler._getAttrsForRequest(this.request, 'user'); - - assert.deepEqual(attrs, {}); - }); }); From dcd0a7dc1e548c6cbd82ae50afebfe9edc2f0289 Mon Sep 17 00:00:00 2001 From: Bryan Robles Date: Fri, 29 Jun 2018 16:15:03 -0700 Subject: [PATCH 191/879] Allow for named route path variables other than :id when using a call to `getModelClassFromPath` This happens when you call `this.normalizedRequestAttrs` inside a route handler --- addon/route-handlers/base.js | 4 +++- tests/unit/route-handlers/shorthands/base-test.js | 14 +++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/addon/route-handlers/base.js b/addon/route-handlers/base.js index e2a7b9d3f..3c404fd5f 100644 --- a/addon/route-handlers/base.js +++ b/addon/route-handlers/base.js @@ -1,6 +1,8 @@ import assert from 'ember-cli-mirage/assert'; import { camelize, singularize, dasherize } from 'ember-cli-mirage/utils/inflector'; +const PATH_VAR_REGEXP = /^:/; + export default class BaseRouteHandler { getModelClassFromPath(fullPath) { @@ -11,7 +13,7 @@ export default class BaseRouteHandler { let lastPath; while (path.length > 0) { lastPath = path.splice(-1)[0]; - if (lastPath && lastPath !== ':id') { + if (lastPath && !PATH_VAR_REGEXP.test(lastPath)) { break; } } diff --git a/tests/unit/route-handlers/shorthands/base-test.js b/tests/unit/route-handlers/shorthands/base-test.js index 8c9b47a4b..6340fe055 100644 --- a/tests/unit/route-handlers/shorthands/base-test.js +++ b/tests/unit/route-handlers/shorthands/base-test.js @@ -28,12 +28,24 @@ module('Unit | Route handlers | Shorthands | BaseShorthandRouteHandler', functio assert.equal(this.handler._getIdForRequest(this.request), 'someID', 'it returns a number'); }); - test('getModelClassFromPath works', function(assert) { + test('getModelClassFromPath works with various named route path variable', function(assert) { let urlWithSlash = '/api/fancy-users'; let urlWithIdAndSlash = '/api/fancy-users/:id'; assert.equal(this.handler.getModelClassFromPath(urlWithSlash), 'fancy-user', 'it returns a singular model name'); assert.equal(this.handler.getModelClassFromPath(urlWithIdAndSlash, true), 'fancy-user', 'it returns a singular model name'); + + urlWithSlash = '/api/exquisite-users'; + urlWithIdAndSlash = '/api/exquisite-users/:objectId'; + + assert.equal(this.handler.getModelClassFromPath(urlWithSlash), 'exquisite-user', 'it returns a singular model name'); + assert.equal(this.handler.getModelClassFromPath(urlWithIdAndSlash, true), 'exquisite-user', 'it returns a singular model name'); + + urlWithSlash = '/api/elegant-users'; + urlWithIdAndSlash = '/api/elegant-users/:firstName/:lastName'; + + assert.equal(this.handler.getModelClassFromPath(urlWithSlash), 'elegant-user', 'it returns a singular model name'); + assert.equal(this.handler.getModelClassFromPath(urlWithIdAndSlash, true), 'elegant-user', 'it returns a singular model name'); }); test('it can read the id from the url', function(assert) { From ad8ab8ed56a58fc56b1108852aa723d901c5e673 Mon Sep 17 00:00:00 2001 From: jelhan Date: Tue, 17 Jul 2018 23:09:26 +0200 Subject: [PATCH 192/879] fix: remove outdated warning about missing destroy-app helper This warning was introduced for applications generated with ember-cli <= 1.13.8. It's safe to assume that none of the applications which weren't updated yet will install ember-cli-mirage now if they haven't so far. On the other hand this warning is misleading for all new generated projects with ember-cli >= 3.0.0. Fixes #1300 --- blueprints/ember-cli-mirage/index.js | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/blueprints/ember-cli-mirage/index.js b/blueprints/ember-cli-mirage/index.js index 9f21580ea..6a86d33ea 100644 --- a/blueprints/ember-cli-mirage/index.js +++ b/blueprints/ember-cli-mirage/index.js @@ -56,17 +56,6 @@ module.exports = { return this.insertIntoFile('tests/helpers/destroy-app.js', shutdownText, { after: "run(application, 'destroy');\n" }); - } else { - this.ui.writeLine( - EOL + - chalk.yellow( - '******************************************************' + EOL + - 'destroy-app.js helper is not present. Please read this' + EOL + - 'https://gist.github.com/blimmer/35d3efbb64563029505a' + EOL + - 'to see how to fix the problem.' + EOL + - '******************************************************' + EOL - ) - ); } }, From f1d05ec13b20ce0d770bd4973f3dc58b82ab25ac Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sun, 22 Jul 2018 14:29:01 -0400 Subject: [PATCH 193/879] [fixes #1274] Fix relationship ID bug for polymorphic includes --- addon/serializer.js | 46 +++++++--------- .../belongs-to-test.js} | 2 +- .../has-many-test.js} | 54 ++++++++++++++----- 3 files changed, 62 insertions(+), 40 deletions(-) rename tests/integration/serializers/base/associations/{polymorphic-belongs-to-test.js => polymorphic/belongs-to-test.js} (97%) rename tests/integration/serializers/base/associations/{polymorphic-has-many-test.js => polymorphic/has-many-test.js} (58%) diff --git a/addon/serializer.js b/addon/serializer.js index b6e375064..f53a0f86a 100644 --- a/addon/serializer.js +++ b/addon/serializer.js @@ -292,45 +292,39 @@ class Serializer { if (this.serializeIds === 'always') { model.associationKeys.forEach((key) => { - let association = model[key]; - if (this.isCollection(association)) { + let resource = model[key]; + + if (this.isCollection(resource)) { let formattedKey = this.keyForRelationshipIds(key); - newHash[formattedKey] = model[key].models.map((m) => m.id); - } else if (association) { + newHash[formattedKey] = model[`${singularize(key)}Ids`]; + + } else if (resource) { let formattedKey = this.keyForForeignKey(key); newHash[formattedKey] = model[`${key}Id`]; } }); + } else if (this.serializeIds === 'included') { this.getKeysForIncluded().forEach((key) => { - let association = model[key]; + let resource = model[key]; + let association = model.associationFor(key); - if (model.associationFor(key).isPolymorphic) { - if (association instanceof PolymorphicCollection) { - let formattedKey = this.keyForRelationship(key); + if (this.isCollection(resource)) { + let formattedKey = this.keyForRelationshipIds(key); - newHash[formattedKey] = model[`${singularize(key)}Ids`]; - } else if (association instanceof Collection) { - let formattedKey = this.keyForRelationshipIds(key); + newHash[formattedKey] = model[`${singularize(key)}Ids`]; - newHash[formattedKey] = model[key].models.map((m) => m.id); - } else { - let formattedTypeKey = this.keyForPolymorphicForeignKeyType(key); - let formattedIdKey = this.keyForPolymorphicForeignKeyId(key); + } else if (this.isModel(resource) && association.isPolymorphic) { + let formattedTypeKey = this.keyForPolymorphicForeignKeyType(key); + let formattedIdKey = this.keyForPolymorphicForeignKeyId(key); - newHash[formattedTypeKey] = model[`${key}Id`].type; - newHash[formattedIdKey] = model[`${key}Id`].id; - } - } else { - if (this.isCollection(association)) { - let formattedKey = this.keyForRelationshipIds(key); + newHash[formattedTypeKey] = model[`${key}Id`].type; + newHash[formattedIdKey] = model[`${key}Id`].id; - newHash[formattedKey] = model[key].models.map((m) => m.id); - } else if (association) { - let formattedKey = this.keyForForeignKey(key); + } else if (this.isModel(resource)) { + let formattedKey = this.keyForForeignKey(key); - newHash[formattedKey] = model[`${key}Id`]; - } + newHash[formattedKey] = model[`${key}Id`]; } }); } diff --git a/tests/integration/serializers/base/associations/polymorphic-belongs-to-test.js b/tests/integration/serializers/base/associations/polymorphic/belongs-to-test.js similarity index 97% rename from tests/integration/serializers/base/associations/polymorphic-belongs-to-test.js rename to tests/integration/serializers/base/associations/polymorphic/belongs-to-test.js index 1d14d517e..89395c1a0 100644 --- a/tests/integration/serializers/base/associations/polymorphic-belongs-to-test.js +++ b/tests/integration/serializers/base/associations/polymorphic/belongs-to-test.js @@ -5,7 +5,7 @@ import Serializer from 'ember-cli-mirage/serializer'; import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { module, test } from 'qunit'; -module('Integration | Serializers | Base | Associations | Polymorphic Belongs To', function(hooks) { +module('Integration | Serializers | Base | Associations | Polymorphic | Belongs To', function(hooks) { hooks.beforeEach(function() { this.schema = new Schema(new Db(), { post: Model.extend(), diff --git a/tests/integration/serializers/base/associations/polymorphic-has-many-test.js b/tests/integration/serializers/base/associations/polymorphic/has-many-test.js similarity index 58% rename from tests/integration/serializers/base/associations/polymorphic-has-many-test.js rename to tests/integration/serializers/base/associations/polymorphic/has-many-test.js index 6410bfd87..91255d899 100644 --- a/tests/integration/serializers/base/associations/polymorphic-has-many-test.js +++ b/tests/integration/serializers/base/associations/polymorphic/has-many-test.js @@ -5,7 +5,7 @@ import Serializer from 'ember-cli-mirage/serializer'; import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { module, test } from 'qunit'; -module('Integration | Serializers | Base | Associations | Polymorphic Has Many', function(hooks) { +module('Integration | Serializers | Base | Associations | Polymorphic | Has Many', function(hooks) { hooks.beforeEach(function() { this.schema = new Schema(new Db(), { user: Model.extend({ @@ -16,20 +16,21 @@ module('Integration | Serializers | Base | Associations | Polymorphic Has Many', let post = this.schema.pictures.create({ title: 'Lorem ipsum' }); this.schema.users.create({ things: [ post ], name: 'Ned' }); - - this.BaseSerializer = Serializer.extend({ - embed: false - }); }); hooks.afterEach(function() { this.schema.db.emptyData(); }); - test(`it can serialize a polymorphic has-many relationship`, function(assert) { + test(`it can serialize a polymorphic has-many relationship when serializeIds is set to included`, function(assert) { + let BaseSerializer = Serializer.extend({ + embed: false, + serializeIds: 'included' + }); let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - user: this.BaseSerializer.extend({ + application: BaseSerializer, + user: BaseSerializer.extend({ + serializeIds: 'included', include: ['things'] }) }); @@ -41,7 +42,7 @@ module('Integration | Serializers | Base | Associations | Polymorphic Has Many', user: { id: '1', name: 'Ned', - things: [ + thingIds: [ { id: '1', type: 'picture' } ] }, @@ -51,12 +52,39 @@ module('Integration | Serializers | Base | Associations | Polymorphic Has Many', }); }); + test(`it can serialize a polymorphic has-many relationship when serializeIds is set to always`, function(assert) { + let BaseSerializer = Serializer.extend({ + embed: false, + serializeIds: 'always' + }); + let registry = new SerializerRegistry(this.schema, { + application: BaseSerializer, + user: BaseSerializer + }); + + let user = this.schema.users.find(1); + let result = registry.serialize(user); + + assert.deepEqual(result, { + user: { + id: '1', + name: 'Ned', + thingIds: [ + { id: '1', type: 'picture' } + ] + } + }); + }); + test(`it can serialize an embedded polymorphic has-many relationship`, function(assert) { + let BaseSerializer = Serializer.extend({ + embed: true, + serializeIds: 'included' + }); let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - user: this.BaseSerializer.extend({ - include: ['things'], - embed: true + application: BaseSerializer, + user: BaseSerializer.extend({ + include: ['things'] }) }); From f7fb311137ca9fe7421b8fdfed071893187b77cd Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sun, 22 Jul 2018 14:41:57 -0400 Subject: [PATCH 194/879] Fix teardown when pending requests Co-authored-by: Peter Wagenet --- addon-test-support/setup-mirage.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/addon-test-support/setup-mirage.js b/addon-test-support/setup-mirage.js index 221bda9e9..d650bf648 100644 --- a/addon-test-support/setup-mirage.js +++ b/addon-test-support/setup-mirage.js @@ -1,4 +1,5 @@ import startMirage from 'ember-cli-mirage/start-mirage'; +import { settled } from '@ember/test-helpers'; // // Used to set up mirage for a test. Must be called after one of the @@ -20,7 +21,9 @@ export default function setupMirage(hooks = self) { }); hooks.afterEach(function() { - this.server.shutdown(); - delete this.server; + return settled().then(() => { + this.server.shutdown(); + delete this.server; + }); }); } From d7f9f47c56f832d3c2ea55c3dea2a9aff6db423c Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sun, 22 Jul 2018 16:54:25 -0400 Subject: [PATCH 195/879] Add test to ensure correct behavior for polymorphic has many on RESTSerializer --- .../serializers/rest-serializer-test.js | 100 +++++++++++------- 1 file changed, 63 insertions(+), 37 deletions(-) diff --git a/tests/integration/serializers/rest-serializer-test.js b/tests/integration/serializers/rest-serializer-test.js index b44294983..5966fff2e 100644 --- a/tests/integration/serializers/rest-serializer-test.js +++ b/tests/integration/serializers/rest-serializer-test.js @@ -1,49 +1,39 @@ -import RestSerializer from 'ember-cli-mirage/serializers/rest-serializer'; -import { hasMany, belongsTo } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Model from 'ember-cli-mirage/orm/model'; -import Db from 'ember-cli-mirage/db'; -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import { module, test } from 'qunit'; +import Server from 'ember-cli-mirage/server'; +import { Model, hasMany, belongsTo, RestSerializer } from 'ember-cli-mirage'; module('Integration | Serializer | RestSerializer', function(hooks) { - hooks.beforeEach(function() { - let db = new Db(); - this.schema = new Schema(db); - this.schema.registerModels({ - wordSmith: Model.extend({ - blogPosts: hasMany() - }), - blogPost: Model.extend({ - wordSmith: belongsTo() - }) + + test('it sideloads associations and camel-cases relationships and attributes correctly for a model', function(assert) { + let server = new Server({ + environment: 'test', + models: { + wordSmith: Model.extend({ + blogPosts: hasMany() + }), + blogPost: Model.extend({ + wordSmith: belongsTo() + }) + }, + serializers: { + application: RestSerializer, + wordSmith: RestSerializer.extend({ + attrs: ['id', 'name'], + include: ['blogPosts'] + }), + blogPost: RestSerializer.extend({ + include: ['wordSmith'] + }) + } }); - let link = this.schema.wordSmiths.create({ name: 'Link', age: 123 }); + let link = server.create('word-smith', { name: 'Link', age: 123 }); link.createBlogPost({ title: 'Lorem' }); link.createBlogPost({ title: 'Ipsum' }); - this.schema.wordSmiths.create({ name: 'Zelda', age: 230 }); - - this.registry = new SerializerRegistry(this.schema, { - application: RestSerializer, - wordSmith: RestSerializer.extend({ - attrs: ['id', 'name'], - include: ['blogPosts'] - }), - blogPost: RestSerializer.extend({ - include: ['wordSmith'] - }) - }); - }); - - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); + server.create('word-smith', { name: 'Zelda', age: 230 }); - test('it sideloads associations and camel-cases relationships and attributes correctly for a model', function(assert) { - let link = this.schema.wordSmiths.find(1); - let result = this.registry.serialize(link); + let result = server.serializerOrRegistry.serialize(link); assert.deepEqual(result, { wordSmith: { @@ -65,4 +55,40 @@ module('Integration | Serializer | RestSerializer', function(hooks) { ] }); }); + + test('it works for has-many polymorphic associations', function(assert) { + let server = new Server({ + environment: 'test', + models: { + wordSmith: Model.extend({ + posts: hasMany({ polymorphic: true }) + }), + blogPost: Model.extend() + }, + serializers: { + application: RestSerializer + } + }); + + let post = server.create('blog-post', { title: 'Post 1' }); + let link = server.create('word-smith', { + name: 'Link', + age: 123, + posts: [ post ] + }); + + let result = server.serializerOrRegistry.serialize(link); + + assert.deepEqual(result, { + wordSmith: { + id: '1', + name: 'Link', + age: 123, + posts: [ + { id: '1', type: 'blog-post' } + ] + } + }); + }); + }); From 118fb155633c00b0229efa7e0d9b8c7963784eb0 Mon Sep 17 00:00:00 2001 From: Mirko Akov Date: Fri, 27 Jul 2018 11:32:41 +0300 Subject: [PATCH 196/879] Camelize the relationship name before getting the association --- addon/route-handlers/base.js | 2 +- ...patch-shorthand-with-relationships-test.js | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/addon/route-handlers/base.js b/addon/route-handlers/base.js index ca8373d04..8b3980fd7 100644 --- a/addon/route-handlers/base.js +++ b/addon/route-handlers/base.js @@ -60,7 +60,7 @@ export default class BaseRouteHandler { Object.keys(json.data.relationships).forEach((relationshipName) => { let relationship = json.data.relationships[relationshipName]; let modelClass = this.schema.modelClassFor(modelName); - let association = modelClass.associationFor(relationshipName); + let association = modelClass.associationFor(camelize(relationshipName)); let valueForRelationship; if (association.isPolymorphic) { diff --git a/tests/integration/server/shorthands/patch-shorthand-with-relationships-test.js b/tests/integration/server/shorthands/patch-shorthand-with-relationships-test.js index 969af8fa0..b1be6758e 100644 --- a/tests/integration/server/shorthands/patch-shorthand-with-relationships-test.js +++ b/tests/integration/server/shorthands/patch-shorthand-with-relationships-test.js @@ -145,4 +145,43 @@ module('Integration | Server | Shorthands | Patch with relationships', function( assert.equal(user.collectibles.length, 0); }); + test('it camelizes relationship names', async function(assert) { + let server = this.newServerWithSchema({ + postAuthor: Model.extend({ + posts: hasMany() + }), + post: Model.extend({ + postAuthor: belongsTo() + }) + }); + + server.loadConfig(function() { + this.patch('/posts/:id'); + }); + + let postAuthor = server.create('post-author'); + let post = server.create('post'); + + await promiseAjax({ + method: 'PATCH', + url: `/posts/${post.id}`, + data: JSON.stringify({ + data: { + attributes: { + }, + relationships: { + 'post-author': { + data: { + id: postAuthor.id, + type: 'post-authors' + } + } + } + } + }) + }); + + post.reload(); + assert.equal(post.postAuthorId, postAuthor.id, 'relationship gets updated successfully'); + }); }); From 8978405c914fa52055866a5588564f52c083c976 Mon Sep 17 00:00:00 2001 From: Mirko Akov Date: Fri, 27 Jul 2018 10:21:31 +0300 Subject: [PATCH 197/879] Check if there is a server before shutting it down --- addon-test-support/setup-mirage.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/addon-test-support/setup-mirage.js b/addon-test-support/setup-mirage.js index d650bf648..59ce995de 100644 --- a/addon-test-support/setup-mirage.js +++ b/addon-test-support/setup-mirage.js @@ -22,8 +22,10 @@ export default function setupMirage(hooks = self) { hooks.afterEach(function() { return settled().then(() => { - this.server.shutdown(); - delete this.server; + if (this.server) { + this.server.shutdown(); + delete this.server; + } }); }); } From 4cbd5bf4d6eaaee57656db4216fb52b92ebc5b28 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 27 Jul 2018 18:14:03 -0400 Subject: [PATCH 198/879] Throw if using association() helper on a self-referential belongsTo relationship --- addon/association.js | 1 + addon/orm/schema.js | 6 +++- addon/server.js | 36 ++++++++------------- tests/integration/factories/helpers-test.js | 21 ++++++++++++ tests/unit/server-test.js | 2 +- 5 files changed, 42 insertions(+), 24 deletions(-) diff --git a/addon/association.js b/addon/association.js index bc5d67d18..20248bfbf 100644 --- a/addon/association.js +++ b/addon/association.js @@ -1,5 +1,6 @@ let association = function(...traitsAndOverrides) { let __isAssociation__ = true; + return { __isAssociation__, traitsAndOverrides diff --git a/addon/orm/schema.js b/addon/orm/schema.js index c282c3ba0..b18e38e1b 100644 --- a/addon/orm/schema.js +++ b/addon/orm/schema.js @@ -222,7 +222,11 @@ export default class Schema { } modelClassFor(modelName) { - return this._registry[camelize(modelName)].class.prototype; + let model = this._registry[camelize(modelName)]; + + assert(model, `Model not registered: ${modelName}`); + + return model.class.prototype; } /* diff --git a/addon/server.js b/addon/server.js index 7dd3253ee..b929ec538 100644 --- a/addon/server.js +++ b/addon/server.js @@ -678,35 +678,27 @@ export default class Server { * * @private */ - _mapAssociationsFromAttributes(modelType, attributes, overrides = {}) { + _mapAssociationsFromAttributes(modelName, attributes, overrides = {}) { Object.keys(attributes || {}).filter((attr) => { return isAssociation(attributes[attr]); }).forEach((attr) => { - let association = attributes[attr]; - let associationName = this._fetchAssociationNameFromModel(modelType, attr); + let modelClass = this.schema.modelClassFor(modelName); + let association = modelClass.associationFor(attr); + + assert(association && association.isBelongsTo, + `You're using the \`association\` factory helper on the '${attr}' attribute of your ${modelName} factory, but that attribute is not a \`belongsTo\` association. Read the Factories docs for more information: http://www.ember-cli-mirage.com/docs/v0.3.x/factories/#factories-and-relationships` + ); + + let isSelfReferentialBelongsTo = association && association.isBelongsTo && association.modelName === modelName; + + assert(!isSelfReferentialBelongsTo, `You're using the association() helper on your ${modelName} factory for ${attr}, which is a belongsTo self-referential relationship. You can't do this as it will lead to infinite recursion. You can move the helper inside of a trait and use it selectively.`); + + let factoryAssociation = attributes[attr]; let foreignKey = `${camelize(attr)}Id`; if (!overrides[attr]) { - attributes[foreignKey] = this.create(associationName, ...association.traitsAndOverrides).id; + attributes[foreignKey] = this.create(association.modelName, ...factoryAssociation.traitsAndOverrides).id; } delete attributes[attr]; }); } - - /** - * - * @private - */ - _fetchAssociationNameFromModel(modelType, associationAttribute) { - let camelizedModelType = camelize(modelType); - let model = this.schema.modelFor(camelizedModelType); - if (!model) { - throw new Error(`Model not registered: ${modelType}`); - } - - let association = model.class.findBelongsToAssociation(associationAttribute); - if (!association) { - throw new Error(`You're using the \`association\` factory helper on the '${associationAttribute}' attribute of your ${modelType} factory, but that attribute is not a \`belongsTo\` association. Read the Factories docs for more information: http://www.ember-cli-mirage.com/docs/v0.3.x/factories/#factories-and-relationships`); - } - return camelize(association.modelName); - } } diff --git a/tests/integration/factories/helpers-test.js b/tests/integration/factories/helpers-test.js index de2018224..d78e15031 100644 --- a/tests/integration/factories/helpers-test.js +++ b/tests/integration/factories/helpers-test.js @@ -107,4 +107,25 @@ module('Integration | Server | Factories | helpers', function(hooks) { postIds: ['1'] }); }); + + test('it throws if using the association helper on a self-referential belongsTo relationship', function(assert) { + this.server = new Server({ + environment: 'test', + models: { + page: Model.extend({ + parentPage: belongsTo('page', { inverse: 'childPages' }), + childPages: hasMany('page', { inverse: 'parentPage' }) + }) + }, + factories: { + page: Factory.extend({ + parentPage: association() + }) + } + }); + + assert.throws(() => { + this.server.create('page'); + }, /You're using the association\(\) helper on your page factory for parentPage, which is a belongsTo self-referential relationship. You can't do this as it will lead to infinite recursion. You can move the helper inside of a trait and use it selectively./); + }); }); diff --git a/tests/unit/server-test.js b/tests/unit/server-test.js index 70460a70c..03fe0bc1e 100644 --- a/tests/unit/server-test.js +++ b/tests/unit/server-test.js @@ -1127,7 +1127,7 @@ module('Unit | Server #build', function(hooks) { assert.throws(() => { server.build('article', 'withCategory'); - }, /You're using the `association` factory helper on the 'category' attribute/); + }, /You're using the `association` factory helper on the 'category' attribute of your article factory/); }); }); From 68c503e3f29048ebd043f85274e944a76ce93765 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 28 Jul 2018 12:21:43 -0400 Subject: [PATCH 199/879] Add more ORM assertions --- addon/orm/model.js | 68 ++++++++++++++++++----- tests/integration/orm/assertions-test.js | 69 ++++++++++++++++++++++++ 2 files changed, 123 insertions(+), 14 deletions(-) create mode 100644 tests/integration/orm/assertions-test.js diff --git a/addon/orm/model.js b/addon/orm/model.js index 1ce291057..295aca474 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -397,20 +397,7 @@ class Model { * @private */ _setupAttrs(attrs) { - // Verify no undefined associations are passed in - Object.keys(attrs) - .filter((key) => { - let value = attrs[key]; - let isModelOrCollection = (value instanceof Model || value instanceof Collection || value instanceof PolymorphicCollection); - let isArrayOfModels = Array.isArray(value) && value.length && value.every(item => item instanceof Model); - - return isModelOrCollection || isArrayOfModels; - }) - .forEach((key) => { - let modelOrCollection = attrs[key]; - - assert(this.associationKeys.indexOf(key) > -1, `You're trying to create a ${this.modelName} model and you passed in a ${modelOrCollection.toString()} under the ${key} key, but you haven't defined that key as an association on your model.`); - }); + this._validateAttrs(attrs); // Filter out association keys let hash = Object.keys(attrs).reduce((memo, key) => { @@ -504,6 +491,59 @@ class Model { }, this); } + /** + * @method _validateAttrs + * @private + */ + _validateAttrs(attrs) { + // Verify attrs passed in for associations are actually associations + Object.keys(attrs) + .filter(key => this.associationKeys.includes(key)) + .forEach(key => { + let value = attrs[key]; + let association = this.associationFor(key); + let isNull = value === null; + + if (association.isHasMany) { + let isCollection = value instanceof Collection || value instanceof PolymorphicCollection; + let isArrayOfModels = Array.isArray(value) && value.length && value.every(item => item instanceof Model); + + assert(isCollection || isArrayOfModels || isNull, `You're trying to create a ${this.modelName} model and you passed in "${value}" under the ${key} key, but that key is a HasMany relationship. You must pass in a Collection, PolymorphicCollection, array of Models, or null.`); + + } else if (association.isBelongsTo) { + assert(value instanceof Model || isNull, `You're trying to create a ${this.modelName} model and you passed in "${value}" under the ${key} key, but that key is a BelongsTo relationship. You must pass in a Model or null.`); + } + }); + + // Verify attrs passed in for association foreign keys are actually fks + Object.keys(attrs) + .filter(key => this.associationIdKeys.includes(key)) + .forEach(key => { + let value = attrs[key]; + + if (key.match(/Ids$/)) { + let isArray = Array.isArray(value); + let isNull = value === null; + assert(isArray || isNull, `You're trying to create a ${this.modelName} model and you passed in "${value}" under the ${key} key, but that key is a foreign key for a HasMany relationship. You must pass in an array of ids or null.`); + } + }); + + // Verify no undefined associations are passed in + Object.keys(attrs) + .filter(key => { + let value = attrs[key]; + let isModelOrCollection = (value instanceof Model || value instanceof Collection || value instanceof PolymorphicCollection); + let isArrayOfModels = Array.isArray(value) && value.length && value.every(item => item instanceof Model); + + return isModelOrCollection || isArrayOfModels; + }) + .forEach(key => { + let modelOrCollection = attrs[key]; + + assert(this.associationKeys.indexOf(key) > -1, `You're trying to create a ${this.modelName} model and you passed in a ${modelOrCollection.toString()} under the ${key} key, but you haven't defined that key as an association on your model.`); + }); + } + /** * Originally we validated this via association.setId method, but it triggered * recursion. That method is designed for updating an existing model's ID so diff --git a/tests/integration/orm/assertions-test.js b/tests/integration/orm/assertions-test.js new file mode 100644 index 000000000..2a02c0b42 --- /dev/null +++ b/tests/integration/orm/assertions-test.js @@ -0,0 +1,69 @@ +import { module, test } from 'qunit'; +import Server from 'ember-cli-mirage/server'; +import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; + +module('Integration | ORM | assertions', function(hooks) { + + hooks.beforeEach(function() { + this.server = new Server({ + models: { + user: Model.extend({ + posts: hasMany() + }), + post: Model.extend({ + author: belongsTo('user') + }) + } + }); + }); + + hooks.afterEach(function() { + this.server.shutdown(); + }); + + test('it errors when passing in the wrong type for a HasMany association', function(assert) { + assert.throws(() => { + this.server.schema.users.create({ + name: 'Sam', + posts: [ 1 ] + }); + }, /You're trying to create a user model and you passed in "1" under the posts key, but that key is a HasMany relationship./); + }); + + test('it errors when passing in the wrong type for a HasMany association foreign key', function(assert) { + assert.throws(() => { + this.server.schema.users.create({ + name: 'Sam', + postIds: 'foo' + }); + }, /You're trying to create a user model and you passed in "foo" under the postIds key, but that key is a foreign key for a HasMany relationship./); + }); + + test('it errors when passing in a missing foreign key for a HasMany association foreign key', function(assert) { + assert.throws(() => { + this.server.schema.users.create({ + name: 'Sam', + postIds: [ 2 ] + }); + }, /You're instantiating a user that has a postIds of 2, but some of those records don't exist in the database/); + }); + + test('it errors when passing in the wrong type for a BelongsTo association', function(assert) { + assert.throws(() => { + this.server.schema.posts.create({ + title: 'Post 1', + author: 'sam' + }); + }, /You're trying to create a post model and you passed in "sam" under the author key, but that key is a BelongsTo relationship./); + }); + + test('it errors when passing in a missing foreign key for a BelongsTo association foreign key', function(assert) { + assert.throws(() => { + this.server.schema.posts.create({ + title: 'Post 1', + authorId: 1 + }); + }, /You're instantiating a post that has a authorId of 1, but that record doesn't exist in the database/); + }); + +}); From e611e4ddd1860a471beaf3be3e6cdf1a38320c64 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sun, 29 Jul 2018 17:51:58 -0400 Subject: [PATCH 200/879] Add test apps (#1359) Use a nested sample app for build-time testing --- .eslintrc.js | 26 +- .npmignore | 2 + .travis.yml | 76 +- .../fixtures/fastboot/app/templates/index.hbs | 1 - fastboot-tests/index-test.js | 24 - node-tests/addon-tree-test.js | 68 - node-tests/import-files-test.js | 55 - package.json | 21 +- scripts/link.sh | 22 + scripts/parallel | 11892 ++++++++++++++++ scripts/test.sh | 6 + test-apps/basic-app/.bin | 1 + test-apps/basic-app/.editorconfig | 20 + test-apps/basic-app/.ember-cli | 9 + test-apps/basic-app/.eslintignore | 4 + test-apps/basic-app/.eslintrc.js | 2 + test-apps/basic-app/.gitignore | 23 + test-apps/basic-app/.npmignore | 1 + test-apps/basic-app/.travis.yml | 29 + test-apps/basic-app/.watchmanconfig | 3 + test-apps/basic-app/README.md | 57 + test-apps/basic-app/app/app.js | 14 + test-apps/basic-app/app/components/.gitkeep | 0 test-apps/basic-app/app/controllers/.gitkeep | 0 .../basic-app/app/controllers/application.js | 22 + test-apps/basic-app/app/helpers/.gitkeep | 0 test-apps/basic-app/app/index.html | 25 + test-apps/basic-app/app/models/.gitkeep | 0 test-apps/basic-app/app/resolver.js | 3 + .../basic-app}/app/router.js | 0 test-apps/basic-app/app/routes/.gitkeep | 0 test-apps/basic-app/app/styles/app.css | 0 .../basic-app/app/templates/application.hbs | 22 + .../app/templates/components/.gitkeep | 0 test-apps/basic-app/config/environment.js | 57 + test-apps/basic-app/config/targets.js | 18 + test-apps/basic-app/ember-cli-build.js | 24 + .../fastboot-tests/included-files-test.js | 85 + test-apps/basic-app/mirage/config.js | 2 + test-apps/basic-app/package.json | 50 + test-apps/basic-app/public/robots.txt | 3 + test-apps/basic-app/testem.js | 24 + .../basic-app/tests/helpers/destroy-app.js | 9 + .../tests/helpers/module-for-acceptance.js | 21 + .../basic-app/tests/helpers/promise-ajax.js | 9 + test-apps/basic-app/tests/helpers/resolver.js | 11 + .../basic-app/tests/helpers/start-app.js | 17 + test-apps/basic-app/tests/index.html | 33 + test-apps/basic-app/tests/test-helper.js | 8 + test-apps/basic-app/vendor/.gitkeep | 0 yarn.lock | 632 +- 51 files changed, 13193 insertions(+), 238 deletions(-) delete mode 100644 fastboot-tests/fixtures/fastboot/app/templates/index.hbs delete mode 100644 fastboot-tests/index-test.js delete mode 100644 node-tests/addon-tree-test.js delete mode 100644 node-tests/import-files-test.js create mode 100755 scripts/link.sh create mode 100755 scripts/parallel create mode 100755 scripts/test.sh create mode 120000 test-apps/basic-app/.bin create mode 100644 test-apps/basic-app/.editorconfig create mode 100644 test-apps/basic-app/.ember-cli create mode 100644 test-apps/basic-app/.eslintignore create mode 100644 test-apps/basic-app/.eslintrc.js create mode 100644 test-apps/basic-app/.gitignore create mode 100644 test-apps/basic-app/.npmignore create mode 100644 test-apps/basic-app/.travis.yml create mode 100644 test-apps/basic-app/.watchmanconfig create mode 100644 test-apps/basic-app/README.md create mode 100644 test-apps/basic-app/app/app.js create mode 100644 test-apps/basic-app/app/components/.gitkeep create mode 100644 test-apps/basic-app/app/controllers/.gitkeep create mode 100644 test-apps/basic-app/app/controllers/application.js create mode 100644 test-apps/basic-app/app/helpers/.gitkeep create mode 100644 test-apps/basic-app/app/index.html create mode 100644 test-apps/basic-app/app/models/.gitkeep create mode 100644 test-apps/basic-app/app/resolver.js rename {fastboot-tests/fixtures/fastboot => test-apps/basic-app}/app/router.js (100%) create mode 100644 test-apps/basic-app/app/routes/.gitkeep create mode 100644 test-apps/basic-app/app/styles/app.css create mode 100644 test-apps/basic-app/app/templates/application.hbs create mode 100644 test-apps/basic-app/app/templates/components/.gitkeep create mode 100644 test-apps/basic-app/config/environment.js create mode 100644 test-apps/basic-app/config/targets.js create mode 100644 test-apps/basic-app/ember-cli-build.js create mode 100644 test-apps/basic-app/fastboot-tests/included-files-test.js create mode 100644 test-apps/basic-app/mirage/config.js create mode 100644 test-apps/basic-app/package.json create mode 100644 test-apps/basic-app/public/robots.txt create mode 100644 test-apps/basic-app/testem.js create mode 100644 test-apps/basic-app/tests/helpers/destroy-app.js create mode 100644 test-apps/basic-app/tests/helpers/module-for-acceptance.js create mode 100644 test-apps/basic-app/tests/helpers/promise-ajax.js create mode 100644 test-apps/basic-app/tests/helpers/resolver.js create mode 100644 test-apps/basic-app/tests/helpers/start-app.js create mode 100644 test-apps/basic-app/tests/index.html create mode 100644 test-apps/basic-app/tests/test-helper.js create mode 100644 test-apps/basic-app/vendor/.gitkeep diff --git a/.eslintrc.js b/.eslintrc.js index 42118c150..b0ab1872c 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,9 +1,13 @@ module.exports = { root: true, + parser: 'babel-eslint', parserOptions: { ecmaVersion: 2017, sourceType: 'module' }, + plugins: [ + 'ember' + ], extends: [ 'eslint:recommended', 'plugin:ember-suave/recommended' @@ -36,7 +40,8 @@ module.exports = { 'testem.js', 'ember-cli-build.js', 'config/**/*.js', - 'tests/dummy/config/**/*.js' + 'tests/dummy/config/**/*.js', + 'fastboot-tests/**/*.js' ], excludedFiles: [ 'app/**', @@ -45,7 +50,7 @@ module.exports = { ], parserOptions: { sourceType: 'script', - ecmaVersion: 2015 + ecmaVersion: 2018 }, env: { browser: false, @@ -65,22 +70,5 @@ module.exports = { embertest: true } }, - - // node test files - { - files: [ - 'fastboot-tests/**/*.js', - 'node-tests/**/*.js' - ], - rules: { - 'prefer-template': 0 - }, - globals: { - require: true, - describe: true, - afterEach: true, - it: true - } - } ] }; diff --git a/.npmignore b/.npmignore index 2afeacf66..eb85fce1d 100644 --- a/.npmignore +++ b/.npmignore @@ -23,3 +23,5 @@ package.json.ember-try /.sass-cache /jekyll-tmp *.md + +/test-apps diff --git a/.travis.yml b/.travis.yml index b77e5ecd9..5b0d426a7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,7 @@ --- language: node_js node_js: - # we recommend testing addons with the same minimum supported node version as Ember CLI - # so that your addon works for all apps - - "4" + - "8" sudo: false dist: trusty @@ -18,36 +16,58 @@ env: global: # See https://git.io/vdao3 for details. - JOBS=1 - matrix: - # we recommend new addons test the current and previous LTS - # as well as latest stable release (bonus points to beta/canary) - - EMBER_TRY_SCENARIO=ember-1.13 - - EMBER_TRY_SCENARIO=ember-lts-2.4 - - EMBER_TRY_SCENARIO=ember-lts-2.8 - - EMBER_TRY_SCENARIO=ember-lts-2.12 - - EMBER_TRY_SCENARIO=ember-lts-2.16 - - EMBER_TRY_SCENARIO=ember-release - - EMBER_TRY_SCENARIO=ember-beta - - EMBER_TRY_SCENARIO=ember-canary - - EMBER_TRY_SCENARIO=ember-default - - EMBER_TRY_SCENARIO=fastboot-tests - - EMBER_TRY_SCENARIO=node-tests - -matrix: - fast_finish: true - allow_failures: - - env: EMBER_TRY_SCENARIO=ember-canary - -before_install: - - curl -o- -L https://yarnpkg.com/install.sh | bash - - export PATH=$HOME/.yarn/bin:$PATH - - if [[ $(npm -v | cut -d '.' -f 1) -lt 3 ]]; then npm i -g npm@^3; fi install: - yarn install --no-lockfile --non-interactive script: - - npm run lint:js + - yarn lint:js # Usually, it's ok to finish the test scenario without reverting # to the addon's original dependency state, skipping "cleanup". - node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO --skip-cleanup + +notifications: + email: false + +stages: + - locked dependencies + +jobs: + fail_fast: true + + include: + - stage: locked dependencies + env: NAME=browser tests + install: yarn install + script: yarn test:browser + - env: NAME=node tests + install: yarn install + script: yarn test:node + + - stage: floating dependencies + env: NAME=browser tests + script: yarn test:browser + - env: NAME=node tests + script: yarn test:node + + - stage: versioned tests + env: EMBER_TRY_SCENARIO=ember-lts-2.4 + script: yarn test:browser + - env: EMBER_TRY_SCENARIO=ember-lts-2.8 + script: yarn test:browser + - env: EMBER_TRY_SCENARIO=ember-lts-2.12 + script: yarn test:browser + - env: EMBER_TRY_SCENARIO=ember-lts-2.16 + script: yarn test:browser + - env: EMBER_TRY_SCENARIO=ember-release + script: yarn test:browser + - env: EMBER_TRY_SCENARIO=ember-beta + script: yarn test:browser + - env: EMBER_TRY_SCENARIO=ember-canary + script: yarn test:browser + - env: EMBER_TRY_SCENARIO=ember-default + script: yarn test:browser + + allow_failures: + - env: EMBER_TRY_SCENARIO=ember-beta + - env: EMBER_TRY_SCENARIO=ember-canary diff --git a/fastboot-tests/fixtures/fastboot/app/templates/index.hbs b/fastboot-tests/fixtures/fastboot/app/templates/index.hbs deleted file mode 100644 index 723a5016a..000000000 --- a/fastboot-tests/fixtures/fastboot/app/templates/index.hbs +++ /dev/null @@ -1 +0,0 @@ -

ember-fastboot-addon-tests

\ No newline at end of file diff --git a/fastboot-tests/index-test.js b/fastboot-tests/index-test.js deleted file mode 100644 index 997fb5f5b..000000000 --- a/fastboot-tests/index-test.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict'; - -const expect = require('chai').expect; -const setupTest = require('ember-fastboot-addon-tests').setupTest; - -describe('index', function() { - setupTest('fastboot', { - emberVersion: '2.13.3' - }); - - it('renders', function() { - return this.visit('/') - .then(function(res) { - let $ = res.jQuery; - let response = res.response; - - // add your real tests here - expect(response.statusCode).to.equal(200); - expect($('body').length).to.equal(1); - expect($('h1').text().trim()).to.equal('ember-fastboot-addon-tests'); - }); - }); - -}); \ No newline at end of file diff --git a/node-tests/addon-tree-test.js b/node-tests/addon-tree-test.js deleted file mode 100644 index c79a7535d..000000000 --- a/node-tests/addon-tree-test.js +++ /dev/null @@ -1,68 +0,0 @@ -/* eslint-env node */ - -var expect = require('chai').expect; -var EmberAddon = require('ember-cli/lib/broccoli/ember-addon'); -var path = require('path'); - -function getMirageAddon(options) { - options = options || {}; - options['ember-cli-mirage'] = options['ember-cli-mirage'] || {}; - options['ember-cli-mirage'].directory = options['ember-cli-mirage'].directory || path.resolve(__dirname, path.join('..', 'dummy', 'mirage')); - - var dummyApp = new EmberAddon(options); - - return findMirage(dummyApp); -} - -function findMirage(app) { - var addons = app.project.addons; - for (var i = 0; i < addons.length; i++) { - if (addons[i].name === 'ember-cli-mirage') { - return addons[i]; - } - } -} - -describe('Addon', function() { - this.timeout(15000); - - afterEach(function() { - delete process.env.EMBER_ENV; - }); - - var treeForTests = function(name) { - it('returns a tree with only the initializer in production environment by default', function() { - process.env.EMBER_ENV = 'production'; - var addonTree = getMirageAddon().treeFor(name); - - expect(addonTree.files.length).to.equal(1); - expect(addonTree.files[0]).to.equal('initializers/ember-cli-mirage.js'); - }); - - ['development', 'test'].forEach(function(environment) { - it('returns a tree in ' + environment + ' environment by default', function() { - process.env.EMBER_ENV = environment; - var addonTree = getMirageAddon().treeFor(name); - - expect(addonTree._inputNodes.length).to.not.equal(0); - }); - }); - - it('returns a tree in production environment when enabled is specified', function() { - process.env.EMBER_ENV = 'production'; - var addon = getMirageAddon({ configPath: 'tests/fixtures/config/environment-production-enabled' }); - var addonTree = addon.treeFor(name); - - expect(addonTree._inputNodes.length).to.not.equal(0); - }); - }; - - describe('#treeFor addon', function() { - treeForTests('addon'); - }); - - describe('#treeFor app', function() { - treeForTests('app'); - }); - -}); diff --git a/node-tests/import-files-test.js b/node-tests/import-files-test.js deleted file mode 100644 index e8112222c..000000000 --- a/node-tests/import-files-test.js +++ /dev/null @@ -1,55 +0,0 @@ -/* eslint-env node */ - -var expect = require('chai').expect; -var EmberAddon = require('ember-cli/lib/broccoli/ember-addon'); -var _ = require('lodash'); - -describe('import files', function() { - this.timeout(15000); - - afterEach(function() { - delete process.env.EMBER_ENV; - }); - - it('doesn\'t include third party libraries in production environment by default', function() { - process.env.EMBER_ENV = 'production'; - var addon = new EmberAddon(); - - expect(_.values(addon._scriptOutputFiles)[0]).to.not.include.members([ - 'vendor/fake-xml-http-request/fake_xml_http_request.js', - 'vendor/route-recognizer/dist/route-recognizer.js', - 'vendor/pretender/pretender.js', - 'vendor/faker/build/build/faker.js', - 'vendor/ember-cli-mirage/pretender-shim.js' - ]); - }); - - ['development', 'test'].forEach(function(environment) { - it('includes third party libraries in ' + environment + ' environment by default', function() { - process.env.EMBER_ENV = environment; - var addon = new EmberAddon(); - - expect(_.values(addon._scriptOutputFiles)[0]).to.include.members([ - 'vendor/fake-xml-http-request/fake_xml_http_request.js', - 'vendor/route-recognizer/dist/route-recognizer.js', - 'vendor/pretender/pretender.js', - 'vendor/faker/build/build/faker.js', - 'vendor/ember-cli-mirage/pretender-shim.js' - ]); - }); - }); - - it('includes third party libraries in production when enabled is set to true', function() { - process.env.EMBER_ENV = 'production'; - var addon = new EmberAddon({ configPath: 'tests/fixtures/config/environment-production-enabled' }); - - expect(_.values(addon._scriptOutputFiles)[0]).to.include.members([ - 'vendor/fake-xml-http-request/fake_xml_http_request.js', - 'vendor/route-recognizer/dist/route-recognizer.js', - 'vendor/pretender/pretender.js', - 'vendor/faker/build/build/faker.js', - 'vendor/ember-cli-mirage/pretender-shim.js' - ]); - }); - -}); diff --git a/package.json b/package.json index 5f2e7e8df..d7055e970 100644 --- a/package.json +++ b/package.json @@ -27,10 +27,11 @@ "build": "ember build", "lint:js": "eslint ./*.js addon addon-test-support app config lib server test-support tests", "start": "ember serve", - "test": "ember test", + "test": "./scripts/test.sh", "test:all": "ember try:each", - "test:fastboot": "ember fastboot:test", - "test:node": "mocha node-tests/**/*-test.js" + "test:browser": "ember test --test-port=0", + "test:node": "cd test-apps/basic-app && yarn test:fastboot", + "prepare": "./scripts/link.sh" }, "dependencies": { "broccoli-funnel": "^1.0.2", @@ -45,18 +46,22 @@ "ember-lodash": "^4.17.3", "fake-xml-http-request": "^1.4.0", "faker": "^3.0.0", + "jsdom": "^11.12.0", "pretender": "^1.6.1", "route-recognizer": "^0.2.3" }, "devDependencies": { "active-model-adapter": "^2.0.3", + "babel-eslint": "^8.2.6", "broccoli-asset-rev": "^2.4.5", + "broccoli-test-helper": "^1.3.0", "chai": "^4.1.0", "ember-ajax": "^3.0.0", "ember-cli": "~2.18.2", "ember-cli-app-version": "^2.0.0", "ember-cli-dependency-checker": "^2.0.0", "ember-cli-eslint": "^4.2.1", + "ember-cli-fastboot": "^1.1.4-beta.1", "ember-cli-htmlbars": "^2.0.1", "ember-cli-htmlbars-inline-precompile": "^1.0.0", "ember-cli-inject-live-reload": "^1.4.1", @@ -74,15 +79,19 @@ "ember-source": "~2.18.0", "eslint-plugin-ember": "^5.0.0", "eslint-plugin-ember-suave": "^1.0.0", - "eslint-plugin-node": "^5.2.1", + "eslint-plugin-node": "^6.0.1", + "fastboot": "^1.2.0", "loader.js": "^4.2.3", "mocha": "^3.4.2", "qunit-dom": "^0.5.0" }, "engines": { - "node": "^4.5 || 6.* || >= 7.*" + "node": "6.* || >= 7.*" }, "ember-addon": { - "configPath": "tests/dummy/config" + "configPath": "tests/dummy/config", + "before": [ + "ember-cli-babel" + ] } } diff --git a/scripts/link.sh b/scripts/link.sh new file mode 100755 index 000000000..4ef12dfeb --- /dev/null +++ b/scripts/link.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +set -e + +# Copied from https://github.com/ef4/ember-auto-import/blob/9e48e9ec9639ce05ca2a2688581ea41fdd627c5c/scripts/link-them.sh + +# All packages get a node_modules directory and a .bin link +for package in "basic-app"; do + mkdir -p ./test-apps/$package/node_modules + pushd ./test-apps/$package/node_modules > /dev/null + rm -rf .bin + ln -s ../../../node_modules/.bin .bin + popd > /dev/null +done + +# These packages get to depend on ember-cli-mirage +for package in "basic-app"; do + pushd ./test-apps/$package/node_modules > /dev/null + rm -rf ./ember-cli-mirage + ln -s ../../.. ./ember-cli-mirage + popd > /dev/null +done diff --git a/scripts/parallel b/scripts/parallel new file mode 100755 index 000000000..955b4dc38 --- /dev/null +++ b/scripts/parallel @@ -0,0 +1,11892 @@ +#!/usr/bin/env perl + +# Copyright (C) 2007,2008,2009,2010,2011,2012,2013,2014,2015,2016, +# 2017,2018 Ole Tange and Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see +# or write to the Free Software Foundation, Inc., 51 Franklin St, +# Fifth Floor, Boston, MA 02110-1301 USA + +# open3 used in Job::start +use IPC::Open3; +# &WNOHANG used in reaper +use POSIX qw(:sys_wait_h setsid ceil :errno_h); +# gensym used in Job::start +use Symbol qw(gensym); +# tempfile used in Job::start +use File::Temp qw(tempfile tempdir); +# mkpath used in openresultsfile +use File::Path; +# GetOptions used in get_options_from_array +use Getopt::Long; +# Used to ensure code quality +use strict; +use File::Basename; + +save_stdin_stdout_stderr(); +save_original_signal_handler(); +parse_options(); +::debug("init", "Open file descriptors: ", join(" ",keys %Global::fd), "\n"); +my $number_of_args; +if($Global::max_number_of_args) { + $number_of_args = $Global::max_number_of_args; +} elsif ($opt::X or $opt::m or $opt::xargs) { + $number_of_args = undef; +} else { + $number_of_args = 1; +} + +my @command = @ARGV; +my @input_source_fh; +if($opt::pipepart) { + if($opt::tee) { + @input_source_fh = map { open_or_exit($_) } @opt::a; + # Remove the first: It will be the file piped. + shift @input_source_fh; + if(not @input_source_fh and not $opt::pipe) { + @input_source_fh = (*STDIN); + } + } else { + # -a is used for data - not for command line args + @input_source_fh = map { open_or_exit($_) } "/dev/null"; + } +} else { + @input_source_fh = map { open_or_exit($_) } @opt::a; + if(not @input_source_fh and not $opt::pipe) { + @input_source_fh = (*STDIN); + } +} +if($opt::sqlmaster) { + # Create SQL table to hold joblog + output + $Global::sql->create_table($#input_source_fh+1); + if($opt::sqlworker) { + # Start a real --sqlworker in the background later + $Global::start_sqlworker = 1; + $opt::sqlworker = undef; + } +} + +if($opt::skip_first_line) { + # Skip the first line for the first file handle + my $fh = $input_source_fh[0]; + <$fh>; +} + +set_input_source_header(); + +if($opt::filter_hosts and (@opt::sshlogin or @opt::sshloginfile)) { + # Parallel check all hosts are up. Remove hosts that are down + filter_hosts(); +} + +if($opt::nonall or $opt::onall) { + onall(\@input_source_fh,@command); + wait_and_exit(min(undef_as_zero($Global::exitstatus),254)); +} + +$Global::JobQueue = JobQueue->new( + \@command,\@input_source_fh,$Global::ContextReplace, + $number_of_args,\@Global::transfer_files,\@Global::ret_files); + +if($opt::pipepart) { + pipepart_setup(); +} elsif($opt::pipe and $opt::tee) { + pipe_tee_setup(); +} + +if($opt::eta or $opt::bar or $opt::shuf or $Global::halt_pct) { + # Count the number of jobs or shuffle all jobs + # before starting any. + # Must be done after ungetting any --pipepart jobs. + $Global::JobQueue->total_jobs(); +} +# Compute $Global::max_jobs_running +# Must be done after ungetting any --pipepart jobs. +max_jobs_running(); + +init_run_jobs(); +my $sem; +if($Global::semaphore) { + $sem = acquire_semaphore(); +} +$SIG{TERM} = \&start_no_new_jobs; +start_more_jobs(); +if($opt::tee) { + # All jobs must be running in parallel for --tee + $Global::start_no_new_jobs = 1; +} elsif($opt::pipe and not $opt::pipepart) { + spreadstdin(); +} +::debug("init", "Start draining\n"); +drain_job_queue(); +::debug("init", "Done draining\n"); +reaper(); +::debug("init", "Done reaping\n"); +if($Global::semaphore) { + $sem->release(); +} +cleanup(); +::debug("init", "Halt\n"); +halt(); + +sub set_input_source_header { + if($opt::header and not $opt::pipe) { + # split with colsep or \t + # $header force $colsep = \t if undef? + my $delimiter = defined $opt::colsep ? $opt::colsep : "\t"; + # regexp for {= + my $left = "\Q$Global::parensleft\E"; + my $l = $Global::parensleft; + # regexp for =} + my $right = "\Q$Global::parensright\E"; + my $r = $Global::parensright; + my $id = 1; + for my $fh (@input_source_fh) { + my $line = <$fh>; + chomp($line); + ::debug("init", "Delimiter: '$delimiter'"); + for my $s (split /$delimiter/o, $line) { + ::debug("init", "Colname: '$s'"); + # Replace {colname} with {2} + for(@command,@Global::ret_files,@Global::transfer_files, + $opt::tagstring, $opt::workdir, $opt::results, $opt::retries) { + # Skip if undefined + $_ or next; + s:\{$s(|/|//|\.|/\.)\}:\{$id$1\}:g; + # {=header1 ... =} => {=1 ... =} + s:$left $s (.*?) $right:$l$id$1$r:gx; + } + $Global::input_source_header{$id} = $s; + $id++; + } + } + } else { + my $id = 1; + for my $fh (@input_source_fh) { + $Global::input_source_header{$id} = $id; + $id++; + } + } +} + +sub max_jobs_running { + # Compute $Global::max_jobs_running as the max number of jobs + # running on each sshlogin. + # Returns: + # $Global::max_jobs_running + if(not $Global::max_jobs_running) { + + for my $sshlogin (values %Global::host) { + $sshlogin->max_jobs_running(); + } + } + return $Global::max_jobs_running; +} + +sub halt { + # Compute exit value, + # wait for children to complete + # and exit + if($opt::halt and $Global::halt_when ne "never") { + if(not defined $Global::halt_exitstatus) { + if($Global::halt_pct) { + $Global::halt_exitstatus = + ::ceil($Global::total_failed / $Global::total_started * 100); + } elsif($Global::halt_count) { + $Global::halt_exitstatus = + ::min(undef_as_zero($Global::total_failed),101); + } + } + wait_and_exit($Global::halt_exitstatus); + } else { + wait_and_exit(min(undef_as_zero($Global::exitstatus),101)); + } +} + +sub __PIPE_MODE__ {} + +sub pipepart_setup { + # Compute the blocksize + # Generate the commands to extract the blocks + # Push the commands on queue + # Changes: + # @Global::cat_prepends + # $Global::JobQueue + if($opt::tee) { + # Prepend each command with + # < file + my $cat_string = "< ".::shell_quote_scalar($opt::a[0]); + for(1..$Global::JobQueue->total_jobs()) { + push @Global::cat_appends, $cat_string; + push @Global::cat_prepends, ""; + } + } else { + if(not $opt::blocksize) { + # --blocksize with 10 jobs per jobslot + $opt::blocksize = -10; + } + if($opt::roundrobin) { + # --blocksize with 1 job per jobslot + $opt::blocksize = -1; + } + if($opt::blocksize < 0) { + my $size = 0; + # Compute size of -a + for(@opt::a) { + if(-f $_) { + $size += -s $_; + } elsif(-b $_) { + $size += size_of_block_dev($_); + } else { + ::error("$_ is neither a file nor a block device"); + wait_and_exit(255); + } + } + # Run in total $job_slots*(- $blocksize) jobs + # Set --blocksize = size / no of proc / (- $blocksize) + $Global::dummy_jobs = 1; + $Global::blocksize = 1 + + int($size / max_jobs_running() / -$opt::blocksize); + } + @Global::cat_prepends = map { pipe_part_files($_) } @opt::a; + # Unget the empty arg as many times as there are parts + $Global::JobQueue->{'commandlinequeue'}{'arg_queue'}->unget( + map { [Arg->new("\0")] } @Global::cat_prepends + ); + } +} + +sub pipe_tee_setup { + # Create temporary fifos + # Run 'tee fifo1 fifo2 fifo3 ... fifoN' in the background + # This will spread the input to fifos + # Generate commands that reads from fifo1..N: + # cat fifo | user_command + # Changes: + # @Global::cat_prepends + my @fifos; + for(1..$Global::JobQueue->total_jobs()) { + push @fifos, tmpfifo(); + } + # cat foo | tee fifo1 fifo2 fifo3 fifo4 fifo5 > /dev/null + if(not fork()){ + # Let tee inherit our stdin + # and redirect stdout to null + open STDOUT, ">","/dev/null"; + exec "tee",@fifos; + } + # For each fifo + # (rm fifo1; grep 1) < fifo1 + # (rm fifo2; grep 2) < fifo2 + # (rm fifo3; grep 3) < fifo3 + # Remove the tmpfifo as soon as it is open + @Global::cat_prepends = map { "(rm $_;" } @fifos; + @Global::cat_appends = map { ") < $_" } @fifos; +} + +sub pipe_part_files { + # Given the bigfile + # find header and split positions + # make commands that 'cat's the partial file + # Input: + # $file = the file to read + # Returns: + # @commands that will cat_partial each part + my ($file) = @_; + my $buf = ""; + if(not -f $file and not -b $file) { + ::error("$file is not a seekable file."); + ::wait_and_exit(255); + } + my $header = find_header(\$buf,open_or_exit($file)); + # find positions + my @pos = find_split_positions($file,$Global::blocksize,length $header); + # Make @cat_prepends + my @cat_prepends = (); + for(my $i=0; $i<$#pos; $i++) { + push(@cat_prepends, + cat_partial($file, 0, length($header), $pos[$i], $pos[$i+1])); + } + return @cat_prepends; +} + +sub find_header { + # Compute the header based on $opt::header + # Input: + # $buf_ref = reference to read-in buffer + # $fh = filehandle to read from + # Uses: + # $opt::header + # $Global::blocksize + # Returns: + # $header string + my ($buf_ref, $fh) = @_; + my $header = ""; + if($opt::header) { + if($opt::header eq ":") { $opt::header = "(.*\n)"; } + # Number = number of lines + $opt::header =~ s/^(\d+)$/"(.*\n)"x$1/e; + while(read($fh,substr($$buf_ref,length $$buf_ref,0),$Global::blocksize)) { + if($$buf_ref=~s/^($opt::header)//) { + $header = $1; + last; + } + } + } + return $header; +} + +sub find_split_positions { + # Find positions in bigfile where recend is followed by recstart + # Input: + # $file = the file to read + # $block = (minimal) --block-size of each chunk + # $headerlen = length of header to be skipped + # Uses: + # $opt::recstart + # $opt::recend + # Returns: + # @positions of block start/end + my($file, $block, $headerlen) = @_; + my $size = -s $file; + if(-b $file) { + # $file is a blockdevice + $size = size_of_block_dev($file); + } + $block = int $block; + # The optimal dd blocksize for mint, redhat, solaris, openbsd = 2^17..2^20 + # The optimal dd blocksize for freebsd = 2^15..2^17 + my $dd_block_size = 131072; # 2^17 + my @pos; + my ($recstart,$recend) = recstartrecend(); + my $recendrecstart = $recend.$recstart; + my $fh = ::open_or_exit($file); + push(@pos,$headerlen); + for(my $pos = $block+$headerlen; $pos < $size; $pos += $block) { + my $buf; + if($recendrecstart eq "") { + # records ends anywhere + push(@pos,$pos); + } else { + # Seek the the block start + seek($fh, $pos, 0) || die; + while(read($fh,substr($buf,length $buf,0),$dd_block_size)) { + if($opt::regexp) { + # If match /$recend$recstart/ => Record position + if($buf =~ /^(.*$recend)$recstart/os) { + # Start looking for next record _after_ this match + $pos += length($1); + push(@pos,$pos); + last; + } + } else { + # If match $recend$recstart => Record position + # TODO optimize to only look at the appended + # $dd_block_size + len $recendrecstart + # TODO increase $dd_block_size to optimize for longer records + my $i = index64(\$buf,$recendrecstart); + if($i != -1) { + # Start looking for next record _after_ this match + $pos += $i + length($recend); + push(@pos,$pos); + last; + } + } + } + } + } + if($pos[$#pos] != $size) { + # Last splitpoint was not at end of the file: add it + push(@pos,$size); + } + close $fh; + return @pos; +} + +sub cat_partial { + # Efficient command to copy from byte X to byte Y + # Input: + # $file = the file to read + # ($start, $end, [$start2, $end2, ...]) = start byte, end byte + # Returns: + # Efficient command to copy $start..$end, $start2..$end2, ... to stdout + my($file, @start_end) = @_; + my($start, $i); + # Convert (start,end) to (start,len) + my @start_len = map { + if(++$i % 2) { $start = $_; } else { $_-$start } + } @start_end; + # This can read 7 GB/s using a single core + my $script = spacefree + (0, + q{ + while(@ARGV) { + sysseek(STDIN,shift,0) || die; + $left = shift; + while($read = + sysread(STDIN,$buf, $left > 131072 ? 131072 : $left)){ + $left -= $read; + syswrite(STDOUT,$buf); + } + } + }); + return "<". shell_quote_scalar($file) . + " perl -e '$script' @start_len |"; +} + +sub spreadstdin { + # read a record + # Spawn a job and print the record to it. + # Uses: + # $Global::blocksize + # STDIN + # $opt::r + # $Global::max_lines + # $Global::max_number_of_args + # $opt::regexp + # $Global::start_no_new_jobs + # $opt::roundrobin + # %Global::running + # Returns: N/A + + if($opt::tee) { + # Spawn all jobs + # read a record + # Write record to all jobs + if(not $Global::JobQueue->empty()) { + ::error("--tee requres --jobs to be higher. Try --jobs 0."); + } + } + + my $buf = ""; + my ($recstart,$recend) = recstartrecend(); + my $recendrecstart = $recend.$recstart; + my $chunk_number = 1; + my $one_time_through; + my $two_gb = 2**31-1; + my $blocksize = $Global::blocksize; + my $in = *STDIN; + my $header = find_header(\$buf,$in); + while(1) { + my $anything_written = 0; + my $buflen = length $buf; + my $readsize = ($buflen < $blocksize) ? $blocksize-$buflen : $blocksize; + # If $buf < $blocksize, append so it is $blocksize long after reading. + # Otherwise append a full $blocksize + if(not read($in,substr($buf,$buflen,0),$readsize)) { + # End-of-file + $chunk_number != 1 and last; + # Force the while-loop once if everything was read by header reading + $one_time_through++ and last; + } + if($opt::r) { + # Remove empty lines + $buf =~ s/^\s*\n//gm; + if(length $buf == 0) { + next; + } + } + if($Global::max_lines and not $Global::max_number_of_args) { + # Read n-line records + my $n_lines = $buf =~ tr/\n/\n/; + my $last_newline_pos = rindex64(\$buf,"\n"); + # Go backwards until there are full n-line records + while($n_lines % $Global::max_lines) { + $n_lines--; + $last_newline_pos = rindex64(\$buf,"\n",$last_newline_pos-1); + } + # Chop at $last_newline_pos as that is where n-line record ends + $anything_written += + write_record_to_pipe($chunk_number++,\$header,\$buf, + $recstart,$recend,$last_newline_pos+1); + shorten(\$buf,$last_newline_pos+1); + } elsif($opt::regexp) { + if($Global::max_number_of_args) { + # -N => (start..*?end){n} + # -L -N => (start..*?end){n*l} + my $read_n_lines = -1+ + $Global::max_number_of_args * ($Global::max_lines || 1); + # (?!negative lookahead) is needed to avoid backtracking + # See: https://unix.stackexchange.com/questions/439356/ + while($buf =~ /# From start up till recend + ^((?:(?!$recend$recstart).)*?$recend + # Then n-1 times recstart.*recend + (?:$recstart(?:(?!$recend$recstart).)*?$recend){$read_n_lines}) + # Followed by recstart + (?=$recstart)/osx) { + $anything_written += + write_record_to_pipe($chunk_number++,\$header,\$buf, + $recstart,$recend,length $1); + shorten(\$buf,length $1); + } + } else { + eof($in) and last; + # Find the last recend-recstart in $buf + if($buf =~ /^(.*$recend)$recstart.*?$/os) { + $anything_written += + write_record_to_pipe($chunk_number++,\$header,\$buf, + $recstart,$recend,length $1); + shorten(\$buf,length $1); + } + } + } elsif($opt::csv) { + # Read a full CSV record + # even number of " + end of line + my $last_newline_pos = length $buf; + do { + # find last EOL + $last_newline_pos = rindex64(\$buf,"\n",$last_newline_pos-1); + # While uneven " + } while((substr($buf,0,$last_newline_pos) =~ y/"/"/)%2 + and $last_newline_pos >= 0); + # Chop at $last_newline_pos as that is where CSV record ends + $anything_written += + write_record_to_pipe($chunk_number++,\$header,\$buf, + $recstart,$recend,$last_newline_pos+1); + shorten(\$buf,$last_newline_pos+1); + } else { + if($Global::max_number_of_args) { + # -N => (start..*?end){n} + my $i = 0; + my $read_n_lines = + $Global::max_number_of_args * ($Global::max_lines || 1); + while(($i = nindex(\$buf,$recendrecstart,$read_n_lines)) != -1) { + $i += length $recend; # find the actual splitting location + $anything_written += + write_record_to_pipe($chunk_number++,\$header,\$buf, + $recstart,$recend,$i); + shorten(\$buf,$i); + } + } else { + eof($in) and last; + # Find the last recend+recstart in $buf + my $i = rindex64(\$buf,$recendrecstart); + if($i != -1) { + $i += length $recend; # find the actual splitting location + $anything_written += + write_record_to_pipe($chunk_number++,\$header,\$buf, + $recstart,$recend,$i); + shorten(\$buf,$i); + } + } + } + if(not $anything_written + and not eof($in) + and not $Global::no_autoexpand_block) { + # Nothing was written - maybe the block size < record size? + # Increase blocksize exponentially up to 2GB-1 (2GB causes problems) + if($blocksize < $two_gb) { + my $old_blocksize = $blocksize; + $blocksize = ::min(ceil($blocksize * 1.3 + 1), $two_gb); + ::warning("A record was longer than $old_blocksize. " . + "Increasing to --blocksize $blocksize."); + } + } + } + ::debug("init", "Done reading input\n"); + + # If there is anything left in the buffer write it + write_record_to_pipe($chunk_number++, \$header, \$buf, $recstart, + $recend, length $buf); + + if($opt::retries) { + $Global::no_more_input = 1; + # We need to start no more jobs: At most we need to retry some + # of the already running. + my @running = values %Global::running; + # Stop any virgins. + for my $job (@running) { + if(defined $job and $job->virgin()) { + close $job->fh(0,"w"); + } + } + # Wait for running jobs to be done + my $sleep =1; + while($Global::total_running > 0) { + $sleep = ::reap_usleep($sleep); + } + } + $Global::start_no_new_jobs ||= 1; + if($opt::roundrobin) { + # Flush blocks to roundrobin procs + my $sleep = 1; + while(%Global::running) { + my $something_written = 0; + for my $job (values %Global::running) { + if($job->block_length()) { + $something_written += $job->non_blocking_write(); + } else { + close $job->fh(0,"w"); + } + } + if($something_written) { + $sleep = $sleep/2+0.001; + } + $sleep = ::reap_usleep($sleep); + } + } +} + +sub recstartrecend { + # Uses: + # $opt::recstart + # $opt::recend + # Returns: + # $recstart,$recend with default values and regexp conversion + my($recstart,$recend); + if(defined($opt::recstart) and defined($opt::recend)) { + # If both --recstart and --recend is given then both must match + $recstart = $opt::recstart; + $recend = $opt::recend; + } elsif(defined($opt::recstart)) { + # If --recstart is given it must match start of record + $recstart = $opt::recstart; + $recend = ""; + } elsif(defined($opt::recend)) { + # If --recend is given then it must match end of record + $recstart = ""; + $recend = $opt::recend; + } + + if($opt::regexp) { + # If $recstart/$recend contains '|' this should only apply to the regexp + $recstart = "(?:".$recstart.")"; + $recend = "(?:".$recend.")"; + } else { + # $recstart/$recend = printf strings (\n) + $recstart =~ s/\\([0rnt\'\"\\])/"qq|\\$1|"/gee; + $recend =~ s/\\([0rnt\'\"\\])/"qq|\\$1|"/gee; + } + return ($recstart,$recend); +} + +sub nindex { + # See if string is in buffer N times + # Returns: + # the position where the Nth copy is found + my ($buf_ref, $str, $n) = @_; + my $i = 0; + for(1..$n) { + $i = index64($buf_ref,$str,$i+1); + if($i == -1) { last } + } + return $i; +} + +{ + my @robin_queue; + my $sleep = 1; + + sub round_robin_write { + # Input: + # $header_ref = ref to $header string + # $block_ref = ref to $block to be written + # $recstart = record start string + # $recend = record end string + # $endpos = end position of $block + # Uses: + # %Global::running + # Returns: + # $something_written = amount of bytes written + my ($header_ref,$buffer_ref,$recstart,$recend,$endpos) = @_; + my $written = 0; + my $block_passed = 0; + while(not $block_passed) { + # Continue flushing existing buffers + # until one is empty and a new block is passed + if(@robin_queue) { + # Rotate queue once so new blocks get a fair chance + # to be given to another block + push @robin_queue, shift @robin_queue; + } else { + # Make a queue to spread the blocks evenly + push @robin_queue, (sort { $a->seq() <=> $b->seq() } + values %Global::running); + } + if($opt::keeporder) { + for my $job (@robin_queue) { + if($job->block_length() > 0) { + $written += $job->non_blocking_write(); + } else { + $job->set_block($header_ref,$buffer_ref,$endpos,$recstart,$recend); + $block_passed = 1; + $job->set_virgin(0); + $written += $job->non_blocking_write(); + last; + } + } + } else { + do { + $written = 0; + for my $job (@robin_queue) { + if($job->block_length() > 0) { + $written += $job->non_blocking_write(); + } else { + $job->set_block($header_ref,$buffer_ref, + $endpos,$recstart,$recend); + $block_passed = 1; + $job->set_virgin(0); + $written += $job->non_blocking_write(); + last; + } + } + if($written) { + $sleep = $sleep/1.5+0.001; + } + } while($written and not $block_passed); + } + $sleep = ::reap_usleep($sleep); + } + return $written; + } +} + +sub index64 { + # Do index on strings > 2GB. + # index in Perl < v5.22 does not work for > 2GB + # Input: + # as index except STR which must be passed as a reference + # Output: + # as index + my $ref = shift; + my $match = shift; + my $pos = shift || 0; + my $block_size = 2**31-1; + my $strlen = length($$ref); + # No point in doing extra work if we don't need to. + if($strlen < $block_size or $] > 5.022) { + return index($$ref, $match, $pos); + } + + my $matchlen = length($match); + my $ret; + my $offset = $pos; + while($offset < $strlen) { + $ret = index( + substr($$ref, $offset, $block_size), + $match, $pos-$offset); + if($ret != -1) { + return $ret + $offset; + } + $offset += ($block_size - $matchlen - 1); + } + return -1; +} + +sub rindex64 { + # Do rindex on strings > 2GB. + # rindex in Perl < v5.22 does not work for > 2GB + # Input: + # as rindex except STR which must be passed as a reference + # Output: + # as rindex + my $ref = shift; + my $match = shift; + my $pos = shift; + my $block_size = 2**31-1; + my $strlen = length($$ref); + # Default: search from end + $pos = defined $pos ? $pos : $strlen; + # No point in doing extra work if we don't need to. + if($strlen < $block_size) { + return rindex($$ref, $match, $pos); + } + + my $matchlen = length($match); + my $ret; + my $offset = $pos - $block_size + $matchlen; + if($offset < 0) { + # The offset is less than a $block_size + # Set the $offset to 0 and + # Adjust block_size accordingly + $block_size = $block_size + $offset; + $offset = 0; + } + while($offset >= 0) { + $ret = rindex( + substr($$ref, $offset, $block_size), + $match); + if($ret != -1) { + return $ret + $offset; + } + $offset -= ($block_size - $matchlen - 1); + } + return -1; +} + +sub shorten { + # Do: substr($buf,0,$i) = ""; + # Some Perl versions do not support $i > 2GB, so do this in 2GB chunks + # Input: + # $buf_ref = \$buf + # $i = position to shorten to + # Returns: N/A + my ($buf_ref, $i) = @_; + my $two_gb = 2**31-1; + while($i > $two_gb) { + substr($$buf_ref,0,$two_gb) = ""; + $i -= $two_gb; + } + substr($$buf_ref,0,$i) = ""; +} + +sub write_record_to_pipe { + # Fork then + # Write record from pos 0 .. $endpos to pipe + # Input: + # $chunk_number = sequence number - to see if already run + # $header_ref = reference to header string to prepend + # $buffer_ref = reference to record to write + # $recstart = start string of record + # $recend = end string of record + # $endpos = position in $buffer_ref where record ends + # Uses: + # $Global::job_already_run + # $opt::roundrobin + # @Global::virgin_jobs + # Returns: + # Number of chunks written (0 or 1) + my ($chunk_number,$header_ref,$buffer_ref,$recstart,$recend,$endpos) = @_; + if($endpos == 0) { return 0; } + if(vec($Global::job_already_run,$chunk_number,1)) { return 1; } + if($opt::roundrobin) { + # Write the block to one of the already running jobs + return round_robin_write($header_ref,$buffer_ref,$recstart,$recend,$endpos); + } + # If no virgin found, backoff + my $sleep = 0.0001; # 0.01 ms - better performance on highend + while(not @Global::virgin_jobs) { + ::debug("pipe", "No virgin jobs"); + $sleep = ::reap_usleep($sleep); + # Jobs may not be started because of loadavg + # or too little time between each ssh login + # or retrying failed jobs. + start_more_jobs(); + } + my $job = shift @Global::virgin_jobs; + # Job is no longer virgin + $job->set_virgin(0); + + if($opt::retries) { + # Copy $buffer[0..$endpos] to $job->{'block'} + # Remove rec_sep + # Run $job->add_transfersize + $job->set_block($header_ref,$buffer_ref,$endpos,$recstart,$recend); + if(fork()) { + # Skip + } else { + $job->write($job->block_ref()); + close $job->fh(0,"w"); + exit(0); + } + } else { + # We ignore the removed rec_sep which is technically wrong. + $job->add_transfersize($endpos + length $$header_ref); + if(fork()) { + # Skip + } else { + # Chop of at $endpos as we do not know how many rec_sep will + # be removed. + substr($$buffer_ref,$endpos,length $$buffer_ref) = ""; + # Remove rec_sep + if($opt::remove_rec_sep) { + Job::remove_rec_sep($buffer_ref,$recstart,$recend); + } + $job->write($header_ref); + $job->write($buffer_ref); + close $job->fh(0,"w"); + exit(0); + } + } + close $job->fh(0,"w"); + return 1; +} + + +sub __SEM_MODE__ {} + + +sub acquire_semaphore { + # Acquires semaphore. If needed: spawns to the background + # Uses: + # @Global::host + # Returns: + # The semaphore to be released when jobs is complete + $Global::host{':'} = SSHLogin->new(":"); + my $sem = Semaphore->new($Semaphore::name,$Global::host{':'}->max_jobs_running()); + $sem->acquire(); + if($Semaphore::fg) { + # skip + } else { + if(fork()) { + exit(0); + } else { + # If run in the background, the PID will change + $sem->pid_change(); + } + } + return $sem; +} + + +sub __PARSE_OPTIONS__ {} + + +sub options_hash { + # Returns: + # %hash = the GetOptions config + return + ("debug|D=s" => \$opt::D, + "xargs" => \$opt::xargs, + "m" => \$opt::m, + "X" => \$opt::X, + "v" => \@opt::v, + "sql=s" => \$opt::retired, + "sqlmaster=s" => \$opt::sqlmaster, + "sqlworker=s" => \$opt::sqlworker, + "sqlandworker=s" => \$opt::sqlandworker, + "joblog|jl=s" => \$opt::joblog, + "results|result|res=s" => \$opt::results, + "resume" => \$opt::resume, + "resume-failed|resumefailed" => \$opt::resume_failed, + "retry-failed|retryfailed" => \$opt::retry_failed, + "silent" => \$opt::silent, + "keep-order|keeporder|k" => \$opt::keeporder, + "no-keep-order|nokeeporder|nok|no-k" => \$opt::nokeeporder, + "group" => \$opt::group, + "g" => \$opt::retired, + "ungroup|u" => \$opt::ungroup, + "linebuffer|linebuffered|line-buffer|line-buffered|lb" => \$opt::linebuffer, + "tmux" => \$opt::tmux, + "tmuxpane" => \$opt::tmuxpane, + "null|0" => \$opt::null, + "quote|q" => \$opt::q, + # Replacement strings + "parens=s" => \$opt::parens, + "rpl=s" => \@opt::rpl, + "plus" => \$opt::plus, + "I=s" => \$opt::I, + "extensionreplace|er=s" => \$opt::U, + "U=s" => \$opt::retired, + "basenamereplace|bnr=s" => \$opt::basenamereplace, + "dirnamereplace|dnr=s" => \$opt::dirnamereplace, + "basenameextensionreplace|bner=s" => \$opt::basenameextensionreplace, + "seqreplace=s" => \$opt::seqreplace, + "slotreplace=s" => \$opt::slotreplace, + "jobs|j=s" => \$opt::jobs, + "delay=s" => \$opt::delay, + "sshdelay=f" => \$opt::sshdelay, + "load=s" => \$opt::load, + "noswap" => \$opt::noswap, + "max-line-length-allowed" => \$opt::max_line_length_allowed, + "number-of-cpus" => \$opt::number_of_cpus, + "number-of-cores" => \$opt::number_of_cores, + "use-cpus-instead-of-cores" => \$opt::use_cpus_instead_of_cores, + "shellquote|shell_quote|shell-quote" => \$opt::shellquote, + "nice=i" => \$opt::nice, + "tag" => \$opt::tag, + "tagstring|tag-string=s" => \$opt::tagstring, + "onall" => \$opt::onall, + "nonall" => \$opt::nonall, + "filter-hosts|filterhosts|filter-host" => \$opt::filter_hosts, + "sshlogin|S=s" => \@opt::sshlogin, + "sshloginfile|slf=s" => \@opt::sshloginfile, + "controlmaster|M" => \$opt::controlmaster, + "ssh=s" => \$opt::ssh, + "transfer-file|transferfile|transfer-files|transferfiles|tf=s" + => \@opt::transfer_files, + "return=s" => \@opt::return, + "trc=s" => \@opt::trc, + "transfer" => \$opt::transfer, + "cleanup" => \$opt::cleanup, + "basefile|bf=s" => \@opt::basefile, + "B=s" => \$opt::retired, + "ctrlc|ctrl-c" => \$opt::retired, + "noctrlc|no-ctrlc|no-ctrl-c" => \$opt::retired, + "workdir|work-dir|wd=s" => \$opt::workdir, + "W=s" => \$opt::retired, + "rsync-opts|rsyncopts=s" => \$opt::rsync_opts, + "tmpdir|tempdir=s" => \$opt::tmpdir, + "use-compress-program|compress-program=s" => \$opt::compress_program, + "use-decompress-program|decompress-program=s" => \$opt::decompress_program, + "compress" => \$opt::compress, + "tty" => \$opt::tty, + "T" => \$opt::retired, + "H=i" => \$opt::retired, + "dry-run|dryrun|dr" => \$opt::dryrun, + "progress" => \$opt::progress, + "eta" => \$opt::eta, + "bar" => \$opt::bar, + "shuf" => \$opt::shuf, + "arg-sep|argsep=s" => \$opt::arg_sep, + "arg-file-sep|argfilesep=s" => \$opt::arg_file_sep, + "trim=s" => \$opt::trim, + "env=s" => \@opt::env, + "recordenv|record-env" => \$opt::record_env, + "session" => \$opt::session, + "plain" => \$opt::plain, + "profile|J=s" => \@opt::profile, + "pipe|spreadstdin" => \$opt::pipe, + "robin|round-robin|roundrobin" => \$opt::roundrobin, + "recstart=s" => \$opt::recstart, + "recend=s" => \$opt::recend, + "regexp|regex" => \$opt::regexp, + "remove-rec-sep|removerecsep|rrs" => \$opt::remove_rec_sep, + "files|output-as-files|outputasfiles" => \$opt::files, + "block|block-size|blocksize=s" => \$opt::blocksize, + "tollef" => \$opt::tollef, + "gnu" => \$opt::gnu, + "link|xapply" => \$opt::link, + "linkinputsource|xapplyinputsource=i" => \@opt::linkinputsource, + "bibtex|citation" => \$opt::citation, + "wc|willcite|will-cite|nn|nonotice|no-notice" => \$opt::willcite, + # Termination and retries + "halt-on-error|halt=s" => \$opt::halt, + "limit=s" => \$opt::limit, + "memfree=s" => \$opt::memfree, + "retries=s" => \$opt::retries, + "timeout=s" => \$opt::timeout, + "termseq|term-seq=s" => \$opt::termseq, + # xargs-compatibility - implemented, man, testsuite + "max-procs|P=s" => \$opt::jobs, + "delimiter|d=s" => \$opt::d, + "max-chars|s=i" => \$opt::max_chars, + "arg-file|a=s" => \@opt::a, + "no-run-if-empty|r" => \$opt::r, + "replace|i:s" => \$opt::i, + "E=s" => \$opt::eof, + "eof|e:s" => \$opt::eof, + "max-args|maxargs|n=i" => \$opt::max_args, + "max-replace-args|N=i" => \$opt::max_replace_args, + "colsep|col-sep|C=s" => \$opt::colsep, + "csv"=> \$opt::csv, + "help|h" => \$opt::help, + "L=f" => \$opt::L, + "max-lines|l:f" => \$opt::max_lines, + "interactive|p" => \$opt::interactive, + "verbose|t" => \$opt::verbose, + "version|V" => \$opt::version, + "minversion|min-version=i" => \$opt::minversion, + "show-limits|showlimits" => \$opt::show_limits, + "exit|x" => \$opt::x, + # Semaphore + "semaphore" => \$opt::semaphore, + "semaphoretimeout|st=i" => \$opt::semaphoretimeout, + "semaphorename|id=s" => \$opt::semaphorename, + "fg" => \$opt::fg, + "bg" => \$opt::bg, + "wait" => \$opt::wait, + # Shebang #!/usr/bin/parallel --shebang + "shebang|hashbang" => \$opt::shebang, + "internal-pipe-means-argfiles" => \$opt::internal_pipe_means_argfiles, + "Y" => \$opt::retired, + "skip-first-line" => \$opt::skip_first_line, + "bug" => \$opt::bug, + "header=s" => \$opt::header, + "cat" => \$opt::cat, + "fifo" => \$opt::fifo, + "pipepart|pipe-part" => \$opt::pipepart, + "tee" => \$opt::tee, + "hgrp|hostgrp|hostgroup|hostgroups" => \$opt::hostgroups, + "embed" => \$opt::embed, + ); +} + +sub get_options_from_array { + # Run GetOptions on @array + # Input: + # $array_ref = ref to @ARGV to parse + # @keep_only = Keep only these options + # Uses: + # @ARGV + # Returns: + # true if parsing worked + # false if parsing failed + # @$array_ref is changed + my ($array_ref, @keep_only) = @_; + if(not @$array_ref) { + # Empty array: No need to look more at that + return 1; + } + # A bit of shuffling of @ARGV needed as GetOptionsFromArray is not + # supported everywhere + my @save_argv; + my $this_is_ARGV = (\@::ARGV == $array_ref); + if(not $this_is_ARGV) { + @save_argv = @::ARGV; + @::ARGV = @{$array_ref}; + } + # If @keep_only set: Ignore all values except @keep_only + my %options = options_hash(); + if(@keep_only) { + my (%keep,@dummy); + @keep{@keep_only} = @keep_only; + for my $k (grep { not $keep{$_} } keys %options) { + # Store the value of the option in @dummy + $options{$k} = \@dummy; + } + } + my $retval = GetOptions(%options); + if(not $this_is_ARGV) { + @{$array_ref} = @::ARGV; + @::ARGV = @save_argv; + } + return $retval; +} + +sub parse_options { + # Returns: N/A + init_globals(); + my @argv_before = @ARGV; + @ARGV = read_options(); + + if(defined $opt::citation) { + citation(\@argv_before,\@ARGV); + wait_and_exit(0); + } + # no-* overrides * + if($opt::nokeeporder) { $opt::keeporder = undef; } + + if(@opt::v) { $Global::verbose = $#opt::v+1; } # Convert -v -v to v=2 + if($opt::bug) { ::die_bug("test-bug"); } + $Global::debug = $opt::D; + $Global::shell = $ENV{'PARALLEL_SHELL'} || parent_shell($$) + || $ENV{'SHELL'} || "/bin/sh"; + if(not -x $Global::shell and not which($Global::shell)) { + ::error("Shell '$Global::shell' not found."); + wait_and_exit(255); + } + ::debug("init","Global::shell $Global::shell\n"); + $Global::cshell = $Global::shell =~ m:(/[-a-z]*)?csh:; + if(defined $opt::X) { $Global::ContextReplace = 1; } + if(defined $opt::silent) { $Global::verbose = 0; } + if(defined $opt::null) { $/ = "\0"; } + if(defined $opt::d) { $/ = unquote_printf($opt::d) } + if(defined $opt::tagstring) { + $opt::tagstring = unquote_printf($opt::tagstring); + } + if(defined $opt::interactive) { $Global::interactive = $opt::interactive; } + if(defined $opt::q) { $Global::quoting = 1; } + if(defined $opt::r) { $Global::ignore_empty = 1; } + if(defined $opt::verbose) { $Global::stderr_verbose = 1; } + parse_replacement_string_options(); + if(defined $opt::eof) { $Global::end_of_file_string = $opt::eof; } + if(defined $opt::max_args) { + $Global::max_number_of_args = $opt::max_args; + } + if(defined $opt::timeout) { + $Global::timeoutq = TimeoutQueue->new($opt::timeout); + } + if(defined $opt::tmpdir) { $ENV{'TMPDIR'} = $opt::tmpdir; } + $ENV{'PARALLEL_RSYNC_OPTS'} = $opt::rsync_opts || + $ENV{'PARALLEL_RSYNC_OPTS'} || '-rlDzR'; + $opt::nice ||= 0; + if(defined $opt::help) { usage(); exit(0); } + if(defined $opt::embed) { embed(); exit(0); } + if(defined $opt::sqlandworker) { + $opt::sqlmaster = $opt::sqlworker = $opt::sqlandworker; + } + if(defined $opt::tmuxpane) { $opt::tmux = $opt::tmuxpane; } + if(defined $opt::colsep) { $Global::trim = 'lr'; } + if(defined $opt::csv) { + $Global::use{"Text::CSV"} ||= eval "use Text::CSV; 1;"; + $opt::colsep = defined $opt::colsep ? $opt::colsep : ","; + my $csv_setting = { binary => 1, sep_char => $opt::colsep }; + my $sep = $csv_setting->{sep_char}; + $Global::csv = Text::CSV->new($csv_setting) + or die "Cannot use CSV: ".Text::CSV->error_diag (); + } + if(defined $opt::header) { + $opt::colsep = defined $opt::colsep ? $opt::colsep : "\t"; + } + if(defined $opt::trim) { $Global::trim = $opt::trim; } + if(defined $opt::arg_sep) { $Global::arg_sep = $opt::arg_sep; } + if(defined $opt::arg_file_sep) { + $Global::arg_file_sep = $opt::arg_file_sep; + } + if(defined $opt::number_of_cpus) { + print SSHLogin::no_of_cpus(),"\n"; wait_and_exit(0); + } + if(defined $opt::number_of_cores) { + print SSHLogin::no_of_cores(),"\n"; wait_and_exit(0); + } + if(defined $opt::max_line_length_allowed) { + print Limits::Command::real_max_length(),"\n"; wait_and_exit(0); + } + if(defined $opt::version) { version(); wait_and_exit(0); } + if(defined $opt::record_env) { record_env(); wait_and_exit(0); } + if(defined $opt::show_limits) { show_limits(); } + if(@opt::sshlogin) { @Global::sshlogin = @opt::sshlogin; } + if(@opt::sshloginfile) { read_sshloginfiles(@opt::sshloginfile); } + if(@opt::return) { push @Global::ret_files, @opt::return; } + if($opt::transfer) { + push @Global::transfer_files, $opt::i || $opt::I || "{}"; + } + push @Global::transfer_files, @opt::transfer_files; + if(not defined $opt::recstart and + not defined $opt::recend) { $opt::recend = "\n"; } + $Global::blocksize = multiply_binary_prefix($opt::blocksize || "1M"); + if($Global::blocksize > 2**31-1 and not $opt::pipepart) { + warning("--blocksize >= 2G causes problems. Using 2G-1."); + $Global::blocksize = 2**31-1; + } + if($^O eq "cygwin" and + ($opt::pipe or $opt::pipepart or $opt::roundrobin) + and $Global::blocksize > 65535) { + warning("--blocksize >= 64K causes problems on Cygwin."); + } + $opt::memfree = multiply_binary_prefix($opt::memfree); + check_invalid_option_combinations(); + if((defined $opt::fifo or defined $opt::cat) + and not $opt::pipepart) { + $opt::pipe = 1; + } + if(defined $opt::minversion) { + print $Global::version,"\n"; + if($Global::version < $opt::minversion) { + wait_and_exit(255); + } else { + wait_and_exit(0); + } + } + if(not defined $opt::delay) { + # Set --delay to --sshdelay if not set + $opt::delay = $opt::sshdelay; + } + $opt::delay = multiply_time_units($opt::delay); + if($opt::compress_program) { + $opt::compress = 1; + $opt::decompress_program ||= $opt::compress_program." -dc"; + } + + if(defined $opt::results) { + # Is the output a dir or CSV-file? + if($opt::results =~ /\.csv$/i) { + # CSV with , as separator + $Global::csvsep = ","; + $Global::membuffer ||= 1; + } elsif($opt::results =~ /\.tsv$/i) { + # CSV with TAB as separator + $Global::csvsep = "\t"; + $Global::membuffer ||= 1; + } + } + if($opt::compress) { + my ($compress, $decompress) = find_compression_program(); + $opt::compress_program ||= $compress; + $opt::decompress_program ||= $decompress; + if(($opt::results and not $Global::csvsep) or $opt::files) { + # No need for decompressing + $opt::decompress_program = "cat >/dev/null"; + } + } + if(defined $opt::dryrun) { + # Force grouping due to bug #51039: --dry-run --timeout 3600 -u breaks + $opt::ungroup = 0; + $opt::group = 1; + } + if(defined $opt::nonall) { + # Append a dummy empty argument if there are no arguments + # on the command line to avoid reading from STDIN. + # arg_sep = random 50 char + # \0 => nothing (not the empty string) + $Global::arg_sep = join "", + map { (0..9,"a".."z","A".."Z")[rand(62)] } (1..50); + push @ARGV, $Global::arg_sep, "\0"; + } + if(defined $opt::tee) { + if(not defined $opt::jobs) { + $opt::jobs = 0; + } + } + if(defined $opt::tty) { + # Defaults for --tty: -j1 -u + # Can be overridden with -jXXX -g + if(not defined $opt::jobs) { + $opt::jobs = 1; + } + if(not defined $opt::group) { + $opt::ungroup = 1; + } + } + if(@opt::trc) { + push @Global::ret_files, @opt::trc; + if(not @Global::transfer_files) { + # Defaults to --transferfile {} + push @Global::transfer_files, $opt::i || $opt::I || "{}"; + } + $opt::cleanup = 1; + } + if(defined $opt::max_lines) { + if($opt::max_lines eq "-0") { + # -l -0 (swallowed -0) + $opt::max_lines = 1; + $opt::null = 1; + $/ = "\0"; + } elsif ($opt::max_lines == 0) { + # If not given (or if 0 is given) => 1 + $opt::max_lines = 1; + } + $Global::max_lines = $opt::max_lines; + if(not $opt::pipe) { + # --pipe -L means length of record - not max_number_of_args + $Global::max_number_of_args ||= $Global::max_lines; + } + } + + # Read more than one arg at a time (-L, -N) + if(defined $opt::L) { + $Global::max_lines = $opt::L; + if(not $opt::pipe) { + # --pipe -L means length of record - not max_number_of_args + $Global::max_number_of_args ||= $Global::max_lines; + } + } + if(defined $opt::max_replace_args) { + $Global::max_number_of_args = $opt::max_replace_args; + $Global::ContextReplace = 1; + } + if((defined $opt::L or defined $opt::max_replace_args) + and + not ($opt::xargs or $opt::m)) { + $Global::ContextReplace = 1; + } + if(defined $opt::tag and not defined $opt::tagstring) { + # Default = {} + $opt::tagstring = $Global::parensleft.$Global::parensright; + } + if(grep /^$Global::arg_sep\+?$|^$Global::arg_file_sep\+?$/o, @ARGV) { + # Deal with ::: :::+ :::: and ::::+ + @ARGV = read_args_from_command_line(); + } + parse_semaphore(); + + if(defined $opt::eta) { $opt::progress = $opt::eta; } + if(defined $opt::bar) { $opt::progress = $opt::bar; } + citation_notice(); + + parse_halt(); + parse_sshlogin(); + + if(remote_hosts() and ($opt::X or $opt::m or $opt::xargs)) { + # As we do not know the max line length on the remote machine + # long commands generated by xargs may fail + # If $opt::max_replace_args is set, it is probably safe + ::warning("Using -X or -m with --sshlogin may fail."); + } + + if(not defined $opt::jobs) { $opt::jobs = "100%"; } + open_joblog(); + open_csv(); + if($opt::sqlmaster or $opt::sqlworker) { + $Global::sql = SQL->new($opt::sqlmaster || $opt::sqlworker); + } + if($opt::sqlworker) { $Global::membuffer ||= 1; } +} + +sub check_invalid_option_combinations { + if(defined $opt::timeout and + $opt::timeout !~ /^\d+(\.\d+)?%?$|^(\d+(\.\d+)?[dhms])+$/i) { + ::error("--timeout must be seconds or percentage."); + wait_and_exit(255); + } + if(defined $opt::fifo and defined $opt::cat) { + ::error("--fifo cannot be combined with --cat."); + ::wait_and_exit(255); + } + if(defined $opt::retries and defined $opt::roundrobin) { + ::error("--retries cannot be combined with --roundrobin."); + ::wait_and_exit(255); + } + if(defined $opt::pipepart and + (defined $opt::L or defined $opt::max_lines + or defined $opt::max_replace_args)) { + ::error("--pipepart is incompatible with --max-replace-args, ". + "--max-lines, and -L."); + wait_and_exit(255); + } + if(defined $opt::group and $opt::ungroup) { + ::error("--group cannot be combined with --ungroup."); + ::wait_and_exit(255); + } + if(defined $opt::group and $opt::linebuffer) { + ::error("--group cannot be combined with --line-buffer."); + ::wait_and_exit(255); + } + if(defined $opt::ungroup and $opt::linebuffer) { + ::error("--ungroup cannot be combined with --line-buffer."); + ::wait_and_exit(255); + } + if(defined $opt::tollef and not $opt::gnu) { + ::error("--tollef has been retired.", + "Remove --tollef or use --gnu to override --tollef."); + ::wait_and_exit(255); + } + if(defined $opt::retired) { + ::error("-g has been retired. Use --group.", + "-B has been retired. Use --bf.", + "-T has been retired. Use --tty.", + "-U has been retired. Use --er.", + "-W has been retired. Use --wd.", + "-Y has been retired. Use --shebang.", + "-H has been retired. Use --halt.", + "--sql has been retired. Use --sqlmaster.", + "--ctrlc has been retired.", + "--noctrlc has been retired."); + ::wait_and_exit(255); + } +} + +sub init_globals { + # Defaults: + $Global::version = 20180622; + $Global::progname = 'parallel'; + $Global::infinity = 2**31; + $Global::debug = 0; + $Global::verbose = 0; + $Global::quoting = 0; + $Global::total_completed = 0; + # Read only table with default --rpl values + %Global::replace = + ( + '{}' => '', + '{#}' => '1 $_=$job->seq()', + '{%}' => '1 $_=$job->slot()', + '{/}' => 's:.*/::', + '{//}' => + ('$Global::use{"File::Basename"} ||= eval "use File::Basename; 1;"; '. + '$_ = dirname($_);'), + '{/.}' => 's:.*/::; s:\.[^/.]+$::;', + '{.}' => 's:\.[^/.]+$::', + ); + %Global::plus = + ( + # {} = {+/}/{/} + # = {.}.{+.} = {+/}/{/.}.{+.} + # = {..}.{+..} = {+/}/{/..}.{+..} + # = {...}.{+...} = {+/}/{/...}.{+...} + '{+/}' => 's:/[^/]*$::', + '{+.}' => 's:.*\.::', + '{+..}' => 's:.*\.([^.]*\.):$1:', + '{+...}' => 's:.*\.([^.]*\.[^.]*\.):$1:', + '{..}' => 's:\.[^/.]+$::; s:\.[^/.]+$::', + '{...}' => 's:\.[^/.]+$::; s:\.[^/.]+$::; s:\.[^/.]+$::', + '{/..}' => 's:.*/::; s:\.[^/.]+$::; s:\.[^/.]+$::', + '{/...}' => 's:.*/::; s:\.[^/.]+$::; s:\.[^/.]+$::; s:\.[^/.]+$::', + '{choose_k}' => 'for $t (2..$#arg){ if($arg[$t-1] ge $arg[$t]) { skip() } }', + # {##} = number of jobs + '{##}' => '$_=total_jobs()', + # Bash ${a:-myval} + '{:-([^}]+?)}' => '$_ ||= $$1', + # Bash ${a:2} + '{:(\d+?)}' => 'substr($_,0,$$1) = ""', + # Bash ${a:2:3} + '{:(\d+?):(\d+?)}' => '$_ = substr($_,$$1,$$2);', + # Bash ${a#bc} + '{#([^#}][^}]*?)}' => 's/^$$1//;', + # Bash ${a%def} + '{%([^}]+?)}' => 's/$$1$//;', + # Bash ${a/def/ghi} ${a/def/} + '{/([^}]+?)/([^}]*?)}' => 's/$$1/$$2/;', + # Bash ${a^a} + '{^([^}]+?)}' => 's/^($$1)/uc($1)/e;', + # Bash ${a^^a} + '{^^([^}]+?)}' => 's/($$1)/uc($1)/eg;', + # Bash ${a,A} + '{,([^}]+?)}' => 's/^($$1)/lc($1)/e;', + # Bash ${a,,A} + '{,,([^}]+?)}' => 's/($$1)/lc($1)/eg;', + ); + # Modifiable copy of %Global::replace + %Global::rpl = %Global::replace; + $/ = "\n"; + $Global::ignore_empty = 0; + $Global::interactive = 0; + $Global::stderr_verbose = 0; + $Global::default_simultaneous_sshlogins = 9; + $Global::exitstatus = 0; + $Global::arg_sep = ":::"; + $Global::arg_file_sep = "::::"; + $Global::trim = 'n'; + $Global::max_jobs_running = 0; + $Global::job_already_run = ''; + # LC_ALL workaround for multibyte chars containing special shell chars + $ENV{'LC_ALL'} = 'C'; + $ENV{'TMPDIR'} ||= "/tmp"; + if(not $ENV{HOME}) { + # $ENV{HOME} is sometimes not set if called from PHP + ::warning("\$HOME not set. Using /tmp."); + $ENV{HOME} = "/tmp"; + } + # no warnings to allow for undefined $XDG_* + no warnings 'uninitialized'; + # $xdg_config_home is needed to make env_parallel.fish stop complaining + my $xdg_config_home = $ENV{'XDG_CONFIG_HOME'}; + # config_dirs = $PARALLEL_HOME, $XDG_CONFIG_HOME/parallel, + # $(each XDG_CONFIG_DIRS)/parallel, $HOME/.parallel + # Keep only dirs that exist + @Global::config_dirs = + (grep { -d $_ } + $ENV{'PARALLEL_HOME'}, + (map { "$_/parallel" } + $xdg_config_home, + split /:/, $ENV{'XDG_CONFIG_DIRS'}), + $ENV{'HOME'} . "/.parallel"); + # Use first dir as config dir + $Global::config_dir = $Global::config_dirs[0] || + $ENV{'HOME'} . "/.parallel"; + # cache_dirs = $PARALLEL_HOME, $XDG_CACHE_HOME/parallel, + # Keep only dirs that exist + @Global::cache_dirs = + (grep { -d $_ } + $ENV{'PARALLEL_HOME'}, $ENV{'XDG_CACHE_HOME'}."/parallel"); + $Global::cache_dir = $Global::cache_dirs[0] || + $ENV{'HOME'} . "/.parallel"; +} + +sub parse_halt { + # $opt::halt flavours + # Uses: + # $opt::halt + # $Global::halt_when + # $Global::halt_fail + # $Global::halt_success + # $Global::halt_pct + # $Global::halt_count + if(defined $opt::halt) { + my %halt_expansion = ( + "0" => "never", + "1" => "soon,fail=1", + "2" => "now,fail=1", + "-1" => "soon,success=1", + "-2" => "now,success=1", + ); + # Expand -2,-1,0,1,2 into long form + $opt::halt = $halt_expansion{$opt::halt} || $opt::halt; + # --halt 5% == --halt soon,fail=5% + $opt::halt =~ s/^(\d+)%$/soon,fail=$1%/; + # Split: soon,fail=5% + my ($when,$fail_success,$pct_count) = split /[,=]/, $opt::halt; + if(not grep { $when eq $_ } qw(never soon now)) { + ::error("--halt must have 'never', 'soon', or 'now'."); + ::wait_and_exit(255); + } + $Global::halt_when = $when; + if($when ne "never") { + if($fail_success eq "fail") { + $Global::halt_fail = 1; + } elsif($fail_success eq "success") { + $Global::halt_success = 1; + } elsif($fail_success eq "done") { + $Global::halt_done = 1; + } else { + ::error("--halt $when must be followed by ,success or ,fail."); + ::wait_and_exit(255); + } + if($pct_count =~ /^(\d+)%$/) { + $Global::halt_pct = $1/100; + } elsif($pct_count =~ /^(\d+)$/) { + $Global::halt_count = $1; + } else { + ::error("--halt $when,$fail_success ". + "must be followed by ,number or ,percent%."); + ::wait_and_exit(255); + } + } + } +} + +sub parse_replacement_string_options { + # Deal with --rpl + # Uses: + # %Global::rpl + # $Global::parensleft + # $Global::parensright + # $opt::parens + # $Global::parensleft + # $Global::parensright + # $opt::plus + # %Global::plus + # $opt::I + # $opt::U + # $opt::i + # $opt::basenamereplace + # $opt::dirnamereplace + # $opt::seqreplace + # $opt::slotreplace + # $opt::basenameextensionreplace + + sub rpl { + # Modify %Global::rpl + # Replace $old with $new + my ($old,$new) = @_; + if($old ne $new) { + $Global::rpl{$new} = $Global::rpl{$old}; + delete $Global::rpl{$old}; + } + } + my $parens = "{==}"; + if(defined $opt::parens) { $parens = $opt::parens; } + my $parenslen = 0.5*length $parens; + $Global::parensleft = substr($parens,0,$parenslen); + $Global::parensright = substr($parens,$parenslen); + if(defined $opt::plus) { %Global::rpl = (%Global::plus,%Global::rpl); } + if(defined $opt::I) { rpl('{}',$opt::I); } + if(defined $opt::i and $opt::i) { rpl('{}',$opt::i); } + if(defined $opt::U) { rpl('{.}',$opt::U); } + if(defined $opt::basenamereplace) { rpl('{/}',$opt::basenamereplace); } + if(defined $opt::dirnamereplace) { rpl('{//}',$opt::dirnamereplace); } + if(defined $opt::seqreplace) { rpl('{#}',$opt::seqreplace); } + if(defined $opt::slotreplace) { rpl('{%}',$opt::slotreplace); } + if(defined $opt::basenameextensionreplace) { + rpl('{/.}',$opt::basenameextensionreplace); + } + for(@opt::rpl) { + # Create $Global::rpl entries for --rpl options + # E.g: "{..} s:\.[^.]+$:;s:\.[^.]+$:;" + my ($shorthand,$long) = split/ /,$_,2; + $Global::rpl{$shorthand} = $long; + } +} + +sub parse_semaphore { + # Semaphore defaults + # Must be done before computing number of processes and max_line_length + # because when running as a semaphore GNU Parallel does not read args + # Uses: + # $opt::semaphore + # $Global::semaphore + # $opt::semaphoretimeout + # $Semaphore::timeout + # $opt::semaphorename + # $Semaphore::name + # $opt::fg + # $Semaphore::fg + # $opt::wait + # $Semaphore::wait + # $opt::bg + # @opt::a + # @Global::unget_argv + # $Global::default_simultaneous_sshlogins + # $opt::jobs + # $Global::interactive + $Global::semaphore ||= ($0 =~ m:(^|/)sem$:); # called as 'sem' + if(defined $opt::semaphore) { $Global::semaphore = 1; } + if(defined $opt::semaphoretimeout) { $Global::semaphore = 1; } + if(defined $opt::semaphorename) { $Global::semaphore = 1; } + if(defined $opt::fg and not $opt::tmux and not $opt::tmuxpane) { + $Global::semaphore = 1; + } + if(defined $opt::bg) { $Global::semaphore = 1; } + if(defined $opt::wait and not $opt::sqlmaster) { + $Global::semaphore = 1; @ARGV = "true"; + } + if($Global::semaphore) { + if(@opt::a) { + # A semaphore does not take input from neither stdin nor file + ::error("A semaphore does not take input from neither stdin nor a file\n"); + ::wait_and_exit(255); + } + @opt::a = ("/dev/null"); + # Append a dummy empty argument + # \0 => nothing (not the empty string) + push(@Global::unget_argv, [Arg->new("\0")]); + $Semaphore::timeout = $opt::semaphoretimeout || 0; + if(defined $opt::semaphorename) { + $Semaphore::name = $opt::semaphorename; + } else { + local $/ = "\n"; + $Semaphore::name = `tty`; + chomp $Semaphore::name; + } + $Semaphore::fg = $opt::fg; + $Semaphore::wait = $opt::wait; + $Global::default_simultaneous_sshlogins = 1; + if(not defined $opt::jobs) { + $opt::jobs = 1; + } + if($Global::interactive and $opt::bg) { + ::error("Jobs running in the ". + "background cannot be interactive."); + ::wait_and_exit(255); + } + } +} + +sub record_env { + # Record current %ENV-keys in $PARALLEL_HOME/ignored_vars + # Returns: N/A + my $ignore_filename = $Global::config_dir . "/ignored_vars"; + if(open(my $vars_fh, ">", $ignore_filename)) { + print $vars_fh map { $_,"\n" } keys %ENV; + } else { + ::error("Cannot write to $ignore_filename."); + ::wait_and_exit(255); + } +} + +sub open_joblog { + # Open joblog as specified by --joblog + # Uses: + # $opt::resume + # $opt::resume_failed + # $opt::joblog + # $opt::results + # $Global::job_already_run + # %Global::fd + my $append = 0; + if(($opt::resume or $opt::resume_failed) + and + not ($opt::joblog or $opt::results)) { + ::error("--resume and --resume-failed require --joblog or --results."); + ::wait_and_exit(255); + } + if(defined $opt::joblog and $opt::joblog =~ s/^\+//) { + # --joblog +filename = append to filename + $append = 1; + } + if($opt::joblog + and + ($opt::sqlmaster + or + not $opt::sqlworker)) { + # Do not log if --sqlworker + if($opt::resume || $opt::resume_failed || $opt::retry_failed) { + if(open(my $joblog_fh, "<", $opt::joblog)) { + # Read the joblog + # If there is a header: Open as append later + $append = <$joblog_fh>; + my $joblog_regexp; + if($opt::retry_failed) { + # Make a regexp that only matches commands with exit+signal=0 + # 4 host 1360490623.067 3.445 1023 1222 0 0 command + $joblog_regexp='^(\d+)(?:\t[^\t]+){5}\t0\t0\t'; + my @group; + { + local $/ = "\n"; + while(<$joblog_fh>) { + if(/$joblog_regexp/o) { + # This is 30% faster than set_job_already_run($1); + vec($Global::job_already_run,($1||0),1) = 1; + $Global::total_completed++; + $group[$1-1] = "true"; + } elsif(/(\d+)\s+\S+(\s+[-0-9.]+){6}\s+(.*)$/) { + # Grab out the command + $group[$1-1] = $3; + } else { + chomp; + ::error("Format of '$opt::joblog' is wrong: $_"); + ::wait_and_exit(255); + } + } + } + if(@group) { + my ($outfh,$name) = ::tmpfile(SUFFIX => ".arg"); + unlink($name); + # Put args into argfile + if(grep /\0/, @group) { + # force --null to deal with \n in commandlines + ::warning("Command lines contain newline. Forcing --null."); + $opt::null = 1; + $/ = "\0"; + } + # Replace \0 with '\n' as used in print_joblog() + print $outfh map { s/\0/\n/g; $_,$/ } @group; + seek $outfh, 0, 0; + exit_if_disk_full(); + # Set filehandle to -a + @opt::a = ($outfh); + } + # Remove $command (so -a is run) + @ARGV = (); + } + if($opt::resume || $opt::resume_failed) { + if($opt::resume_failed) { + # Make a regexp that only matches commands with exit+signal=0 + # 4 host 1360490623.067 3.445 1023 1222 0 0 command + $joblog_regexp='^(\d+)(?:\t[^\t]+){5}\t0\t0\t'; + } else { + # Just match the job number + $joblog_regexp='^(\d+)'; + } + while(<$joblog_fh>) { + if(/$joblog_regexp/o) { + # This is 30% faster than set_job_already_run($1); + vec($Global::job_already_run,($1||0),1) = 1; + $Global::total_completed++; + } elsif(not /\d+\s+[^\s]+\s+([-0-9.]+\s+){6}/) { + ::error("Format of '$opt::joblog' is wrong: $_"); + ::wait_and_exit(255); + } + } + } + close $joblog_fh; + } + } + if($opt::dryrun) { + # Do not write to joblog in a dry-run + if(not open($Global::joblog, ">", "/dev/null")) { + ::error("Cannot write to --joblog $opt::joblog."); + ::wait_and_exit(255); + } + } elsif($append) { + # Append to joblog + if(not open($Global::joblog, ">>", $opt::joblog)) { + ::error("Cannot append to --joblog $opt::joblog."); + ::wait_and_exit(255); + } + } else { + if($opt::joblog eq "-") { + # Use STDOUT as joblog + $Global::joblog = $Global::fd{1}; + } elsif(not open($Global::joblog, ">", $opt::joblog)) { + # Overwrite the joblog + ::error("Cannot write to --joblog $opt::joblog."); + ::wait_and_exit(255); + } + print $Global::joblog + join("\t", "Seq", "Host", "Starttime", "JobRuntime", + "Send", "Receive", "Exitval", "Signal", "Command" + ). "\n"; + } + } +} + +sub open_csv { + if($opt::results) { + # Output as CSV/TSV + if($opt::results eq "-.csv" + or + $opt::results eq "-.tsv") { + # Output as CSV/TSV on stdout + open $Global::csv_fh, ">&", "STDOUT" or + ::die_bug("Can't dup STDOUT in csv: $!"); + # Do not print any other output to STDOUT + # by forcing all other output to /dev/null + open my $fd, ">", "/dev/null" or + ::die_bug("Can't >/dev/null in csv: $!"); + $Global::fd{1} = $fd; + $Global::fd{2} = $fd; + } elsif($Global::csvsep) { + if(not open($Global::csv_fh,">",$opt::results)) { + ::error("Cannot open results file `$opt::results': ". + "$!."); + wait_and_exit(255); + } + } + } +} + +sub find_compression_program { + # Find a fast compression program + # Returns: + # $compress_program = compress program with options + # $decompress_program = decompress program with options + + # Search for these. Sorted by speed on 128 core + + # seq 120000000|shuf > 1gb & + # apt-get update + # apt install make g++ htop + # wget -O - pi.dk/3 | bash + # apt install zstd clzip liblz4-tool lzop pigz pxz gzip plzip pbzip2 lzma xz-utils lzip bzip2 lbzip2 lrzip pixz + # git clone https://github.com/facebook/zstd.git + # (cd zstd/contrib/pzstd; make -j; cp pzstd /usr/local/bin) + # echo 'lrzip -L $((-$1))' >/usr/local/bin/lrz + # chmod +x /usr/local/bin/lrz + # wait + # onethread="zstd clzip lz4 lzop gzip lzma xz bzip2" + # multithread="pzstd pigz pxz plzip pbzip2 lzip lbzip2 lrz pixz" + # parallel --shuf -j1 --joblog jl-m --arg-sep , parallel --compress-program \'{3}" "-{2}\' cat ::: 1gb '>'/dev/null , 1 2 3 , {1..3} , $multithread + # parallel --shuf -j50% --delay 1 --joblog jl-s --arg-sep , parallel --compress-program \'{3}" "-{2}\' cat ::: 1gb '>'/dev/null , 1 2 3 , {1..3} , $onethread + # sort -nk4 jl-? + + # 1-core: + # 2-cores: pzstd zstd lz4 lzop pigz gzip lbzip2 pbzip2 lrz bzip2 lzma pxz plzip xz lzip clzip + # 4-cores: + # 8-cores: pzstd lz4 zstd pigz lzop lbzip2 pbzip2 gzip lzip lrz plzip pxz bzip2 lzma xz clzip + # 16-cores: pzstd lz4 pigz lzop lbzip2 pbzip2 plzip lzip lrz pxz gzip lzma xz bzip2 + # 32-cores: pzstd lbzip2 pbzip2 zstd pigz lz4 lzop plzip lzip lrz gzip pxz lzma bzip2 xz clzip + # 64-cores: pzstd lbzip2 pbzip2 pigz zstd pixz lz4 plzip lzop lzip lrz gzip pxz lzma bzip2 xz clzip + # 128-core: pzstd lbzip2 pbzip2 zstd pixz lz4 pigz lzop plzip lzip gzip lrz pxz bzip2 lzma xz clzip + + my @prg = qw(pzstd lbzip2 pbzip2 zstd pixz lz4 pigz lzop plzip lzip gzip + lrz pxz bzip2 lzma xz clzip); + for my $p (@prg) { + if(which($p)) { + return ("$p -c -1","$p -dc"); + } + } + # Fall back to cat + return ("cat","cat"); +} + +sub read_options { + # Read options from command line, profile and $PARALLEL + # Uses: + # $opt::shebang_wrap + # $opt::shebang + # @ARGV + # $opt::plain + # @opt::profile + # $ENV{'HOME'} + # $ENV{'PARALLEL'} + # Returns: + # @ARGV_no_opt = @ARGV without --options + + # This must be done first as this may exec myself + if(defined $ARGV[0] and ($ARGV[0] =~ /^--shebang/ or + $ARGV[0] =~ /^--shebang-?wrap/ or + $ARGV[0] =~ /^--hashbang/)) { + # Program is called from #! line in script + # remove --shebang-wrap if it is set + $opt::shebang_wrap = ($ARGV[0] =~ s/^--shebang-?wrap *//); + # remove --shebang if it is set + $opt::shebang = ($ARGV[0] =~ s/^--shebang *//); + # remove --hashbang if it is set + $opt::shebang .= ($ARGV[0] =~ s/^--hashbang *//); + if($opt::shebang) { + my $argfile = shell_quote_scalar(pop @ARGV); + # exec myself to split $ARGV[0] into separate fields + exec "$0 --skip-first-line -a $argfile @ARGV"; + } + if($opt::shebang_wrap) { + my @options; + my @parser; + if ($^O eq 'freebsd') { + # FreeBSD's #! puts different values in @ARGV than Linux' does. + my @nooptions = @ARGV; + get_options_from_array(\@nooptions); + while($#ARGV > $#nooptions) { + push @options, shift @ARGV; + } + while(@ARGV and $ARGV[0] ne ":::") { + push @parser, shift @ARGV; + } + if(@ARGV and $ARGV[0] eq ":::") { + shift @ARGV; + } + } else { + @options = shift @ARGV; + } + my $script = shell_quote_scalar(shift @ARGV); + # exec myself to split $ARGV[0] into separate fields + exec "$0 --internal-pipe-means-argfiles @options @parser $script ". + "::: @ARGV"; + } + } + if($ARGV[0] =~ / --shebang(-?wrap)? /) { + ::warning("--shebang and --shebang-wrap must be the first argument.\n"); + } + + Getopt::Long::Configure("bundling","require_order"); + my @ARGV_copy = @ARGV; + my @ARGV_orig = @ARGV; + # Check if there is a --profile to set @opt::profile + get_options_from_array(\@ARGV_copy,"profile|J=s","plain") || die_usage(); + my @ARGV_profile = (); + my @ARGV_env = (); + if(not $opt::plain) { + # Add options from $PARALLEL_HOME/config and other profiles + my @config_profiles = ( + "/etc/parallel/config", + (map { "$_/config" } @Global::config_dirs), + $ENV{'HOME'}."/.parallelrc"); + my @profiles = @config_profiles; + if(@opt::profile) { + # --profile overrides default profiles + @profiles = (); + for my $profile (@opt::profile) { + # Look for the $profile in . and @Global::config_dirs + push @profiles, grep { -r $_ } + map { "$_/$profile" } ".", @Global::config_dirs; + } + } + for my $profile (@profiles) { + if(-r $profile) { + local $/ = "\n"; + open (my $in_fh, "<", $profile) || + ::die_bug("read-profile: $profile"); + while(<$in_fh>) { + /^\s*\#/ and next; + chomp; + push @ARGV_profile, shell_words($_); + } + close $in_fh; + } else { + if(grep /^$profile$/, @config_profiles) { + # config file is not required to exist + } else { + ::error("$profile not readable."); + wait_and_exit(255); + } + } + } + # Add options from shell variable $PARALLEL + if($ENV{'PARALLEL'}) { + @ARGV_env = shell_words($ENV{'PARALLEL'}); + } + } + Getopt::Long::Configure("bundling","require_order"); + get_options_from_array(\@ARGV_profile) || die_usage(); + get_options_from_array(\@ARGV_env) || die_usage(); + get_options_from_array(\@ARGV) || die_usage(); + # What were the options given on the command line? + # Used to start --sqlworker + my $ai = arrayindex(\@ARGV_orig, \@ARGV); + @Global::options_in_argv = @ARGV_orig[0..$ai-1]; + # Prepend non-options to @ARGV (such as commands like 'nice') + unshift @ARGV, @ARGV_profile, @ARGV_env; + return @ARGV; +} + +sub arrayindex { + # Similar to Perl's index function, but for arrays + # Input: + # $arr_ref1 = ref to @array1 to search in + # $arr_ref2 = ref to @array2 to search for + my ($arr_ref1,$arr_ref2) = @_; + my $array1_as_string = join "", map { "\0".$_ } @$arr_ref1; + my $array2_as_string = join "", map { "\0".$_ } @$arr_ref2; + my $i = index($array1_as_string,$array2_as_string,0); + if($i == -1) { return -1 } + my @before = split /\0/, substr($array1_as_string,0,$i); + return $#before; +} + +sub read_args_from_command_line { + # Arguments given on the command line after: + # ::: ($Global::arg_sep) + # :::: ($Global::arg_file_sep) + # :::+ ($Global::arg_sep with --link) + # ::::+ ($Global::arg_file_sep with --link) + # Removes the arguments from @ARGV and: + # - puts filenames into -a + # - puts arguments into files and add the files to -a + # - adds --linkinputsource with 0/1 for each -a depending on :::+/::::+ + # Input: + # @::ARGV = command option ::: arg arg arg :::: argfiles + # Uses: + # $Global::arg_sep + # $Global::arg_file_sep + # $opt::internal_pipe_means_argfiles + # $opt::pipe + # @opt::a + # Returns: + # @argv_no_argsep = @::ARGV without ::: and :::: and following args + my @new_argv = (); + for(my $arg = shift @ARGV; @ARGV; $arg = shift @ARGV) { + if($arg eq $Global::arg_sep + or + $arg eq $Global::arg_sep."+" + or + $arg eq $Global::arg_file_sep + or + $arg eq $Global::arg_file_sep."+") { + my $group_sep = $arg; # This group of arguments is args or argfiles + my @group; + while(defined ($arg = shift @ARGV)) { + if($arg eq $Global::arg_sep + or + $arg eq $Global::arg_sep."+" + or + $arg eq $Global::arg_file_sep + or + $arg eq $Global::arg_file_sep."+") { + # exit while loop if finding new separator + last; + } else { + # If not hitting ::: :::+ :::: or ::::+ + # Append it to the group + push @group, $arg; + } + } + my $is_linked = ($group_sep =~ /\+$/) ? 1 : 0; + my $is_file = ($group_sep eq $Global::arg_file_sep + or + $group_sep eq $Global::arg_file_sep."+"); + if($is_file) { + # :::: / ::::+ + push @opt::linkinputsource, map { $is_linked } @group; + } else { + # ::: / :::+ + push @opt::linkinputsource, $is_linked; + } + if($is_file + or ($opt::internal_pipe_means_argfiles and $opt::pipe) + ) { + # Group of file names on the command line. + # Append args into -a + push @opt::a, @group; + } else { + # Group of arguments on the command line. + # Put them into a file. + # Create argfile + my ($outfh,$name) = ::tmpfile(SUFFIX => ".arg"); + unlink($name); + # Put args into argfile + print $outfh map { $_,$/ } @group; + seek $outfh, 0, 0; + exit_if_disk_full(); + # Append filehandle to -a + push @opt::a, $outfh; + } + if(defined($arg)) { + # $arg is ::: :::+ :::: or ::::+ + # so there is another group + redo; + } else { + # $arg is undef -> @ARGV empty + last; + } + } + push @new_argv, $arg; + } + # Output: @ARGV = command to run with options + return @new_argv; +} + +sub cleanup { + # Returns: N/A + unlink keys %Global::unlink; + map { rmdir $_ } keys %Global::unlink; + if(@opt::basefile and $opt::cleanup) { cleanup_basefile(); } + for(keys %Global::sshmaster) { + # If 'ssh -M's are running: kill them + kill "TERM", $_; + } +} + + +sub __QUOTING_ARGUMENTS_FOR_SHELL__ {} + + +sub shell_quote { + # Input: + # @strings = strings to be quoted + # Output: + # @shell_quoted_strings = string quoted with \ as needed by the shell + return wantarray ? + (map { shell_quote_scalar($_) } @_) + : (join" ",map { shell_quote_scalar($_) } @_); +} + +sub shell_quote_scalar_rc { + # Quote for the rc-shell + my $a = $_[0]; + if(defined $a) { + if(($a =~ s/'/''/g) + + + ($a =~ s/[\n\002-\011\013-\032\\\#\?\`\(\)\{\}\[\]\^\*\<\=\>\~\|\; \"\!\$\&\'\202-\377]+/'$&'/go)) { + # A string was replaced + # No need to test for "" or \0 + } elsif($a eq "") { + $a = "''"; + } elsif($a eq "\0") { + $a = ""; + } + } + return $a; +} + +sub shell_quote_scalar_csh { + # Quote for (t)csh + my $a = $_[0]; + if(defined $a) { + # $a =~ s/([\002-\011\013-\032\\\#\?\`\(\)\{\}\[\]\^\*\>\<\~\|\; \"\!\$\&\'\202-\377])/\\$1/g; + # This is 1% faster than the above + if(($a =~ s/[\002-\011\013-\032\\\#\?\`\(\)\{\}\[\]\^\*\<\=\>\~\|\; \"\!\$\&\'\202-\377]/\\$&/go) + + + # quote newline in csh as \\\n + ($a =~ s/[\n]/"\\\n"/go)) { + # A string was replaced + # No need to test for "" or \0 + } elsif($a eq "") { + $a = "''"; + } elsif($a eq "\0") { + $a = ""; + } + } + return $a; +} + +sub shell_quote_scalar_default { + # Quote for other shells + my $a = $_[0]; + if(defined $a) { + # zsh wants '=' quoted + # Solaris sh wants ^ quoted. + # $a =~ s/([\002-\011\013-\032\\\#\?\`\(\)\{\}\[\]\^\*\>\<\~\|\; \"\!\$\&\'\202-\377])/\\$1/g; + # This is 1% faster than the above + if(($a =~ s/[\002-\011\013-\032\\\#\?\`\(\)\{\}\[\]\^\*\<\=\>\~\|\; \"\!\$\&\'\202-\377]/\\$&/go) + + + # quote newline as '\n' + ($a =~ s/[\n]/'\n'/go)) { + # A string was replaced + # No need to test for "" or \0 + } elsif($a eq "") { + $a = "''"; + } elsif($a eq "\0") { + $a = ""; + } + } + return $a; +} + +sub shell_quote_scalar { + # Quote the string so the shell will not expand any special chars + # Inputs: + # $string = string to be quoted + # Returns: + # $shell_quoted = string quoted as needed by the shell + + # Speed optimization: Choose the correct shell_quote_scalar_* + # and call that directly from now on + no warnings 'redefine'; + if($Global::cshell) { + # (t)csh + *shell_quote_scalar = \&shell_quote_scalar_csh; + } elsif($Global::shell =~ m:(^|/)rc$:) { + # rc-shell + *shell_quote_scalar = \&shell_quote_scalar_rc; + } else { + # other shells + *shell_quote_scalar = \&shell_quote_scalar_default; + } + # The sub is now redefined. Call it + return shell_quote_scalar(@_); +} + +sub shell_quote_file { + # Quote the string so shell will not expand any special chars + # and prepend ./ if needed + # Input: + # $filename = filename to be shell quoted + # Returns: + # $quoted_filename = filename quoted with \ and ./ if needed + my $a = shell_quote_scalar(shift); + if(defined $a) { + if($a =~ m:^/: or $a =~ m:^\./:) { + # /abs/path or ./rel/path => skip + } else { + # rel/path => ./rel/path + $a = "./".$a; + } + } + return $a; +} + +sub shell_words { + # Input: + # $string = shell line + # Returns: + # @shell_words = $string split into words as shell would do + $Global::use{"Text::ParseWords"} ||= eval "use Text::ParseWords; 1;"; + return Text::ParseWords::shellwords(@_); +} + +sub perl_quote_scalar { + # Quote the string so perl's eval will not expand any special chars + # Inputs: + # $string = string to be quoted + # Returns: + # $perl_quoted = string quoted with \ as needed by perl's eval + my $a = $_[0]; + if(defined $a) { + $a =~ s/[\\\"\$\@]/\\$&/go; + } + return $a; +} + +sub unquote_printf { + # Convert \t \n \r \000 \0 + $_ = shift; + s/\\t/\t/g; + s/\\n/\n/g; + s/\\r/\r/g; + s/\\(\d\d\d)/eval 'sprintf "\\'.$1.'"'/ge; + s/\\(\d)/eval 'sprintf "\\'.$1.'"'/ge; + return $_; +} + + +sub __FILEHANDLES__ {} + + +sub save_stdin_stdout_stderr { + # Remember the original STDIN, STDOUT and STDERR + # and file descriptors opened by the shell (e.g. 3>/tmp/foo) + # Uses: + # %Global::fd + # $Global::original_stderr + # $Global::original_stdin + # Returns: N/A + + # TODO Disabled until we have an open3 that will take n filehandles + # for my $fdno (1..61) { + # # /dev/fd/62 and above are used by bash for <(cmd) + # # Find file descriptors that are already opened (by the shell) + # Only focus on stdout+stderr for now + for my $fdno (1..2) { + my $fh; + # 2-argument-open is used to be compatible with old perl 5.8.0 + # bug #43570: Perl 5.8.0 creates 61 files + if(open($fh,">&=$fdno")) { + $Global::fd{$fdno}=$fh; + } + } + open $Global::original_stderr, ">&", "STDERR" or + ::die_bug("Can't dup STDERR: $!"); + open $Global::status_fd, ">&", "STDERR" or + ::die_bug("Can't dup STDERR: $!"); + open $Global::original_stdin, "<&", "STDIN" or + ::die_bug("Can't dup STDIN: $!"); +} + +sub enough_file_handles { + # Check that we have enough filehandles available for starting + # another job + # Uses: + # $opt::ungroup + # %Global::fd + # Returns: + # 1 if ungrouped (thus not needing extra filehandles) + # 0 if too few filehandles + # 1 if enough filehandles + if(not $opt::ungroup) { + my %fh; + my $enough_filehandles = 1; + # perl uses 7 filehandles for something? + # open3 uses 2 extra filehandles temporarily + # We need a filehandle for each redirected file descriptor + # (normally just STDOUT and STDERR) + for my $i (1..(7+2+keys %Global::fd)) { + $enough_filehandles &&= open($fh{$i}, "<", "/dev/null"); + } + for (values %fh) { close $_; } + return $enough_filehandles; + } else { + # Ungrouped does not need extra file handles + return 1; + } +} + +sub open_or_exit { + # Open a file name or exit if the file cannot be opened + # Inputs: + # $file = filehandle or filename to open + # Uses: + # $Global::original_stdin + # Returns: + # $fh = file handle to read-opened file + my $file = shift; + if($file eq "-") { + return ($Global::original_stdin || *STDIN); + } + if(ref $file eq "GLOB") { + # This is an open filehandle + return $file; + } + my $fh = gensym; + if(not open($fh, "<", $file)) { + ::error("Cannot open input file `$file': No such file or directory."); + wait_and_exit(255); + } + return $fh; +} + +sub set_fh_blocking { + # Set filehandle as blocking + # Inputs: + # $fh = filehandle to be blocking + # Returns: + # N/A + my $fh = shift; + $Global::use{"Fcntl"} ||= eval "use Fcntl qw(:DEFAULT :flock); 1;"; + my $flags; + # Get the current flags on the filehandle + fcntl($fh, &F_GETFL, $flags) || die $!; + # Remove non-blocking from the flags + $flags &= ~&O_NONBLOCK; + # Set the flags on the filehandle + fcntl($fh, &F_SETFL, $flags) || die $!; +} + +sub set_fh_non_blocking { + # Set filehandle as non-blocking + # Inputs: + # $fh = filehandle to be blocking + # Returns: + # N/A + my $fh = shift; + $Global::use{"Fcntl"} ||= eval "use Fcntl qw(:DEFAULT :flock); 1;"; + my $flags; + # Get the current flags on the filehandle + fcntl($fh, &F_GETFL, $flags) || die $!; + # Add non-blocking to the flags + $flags |= &O_NONBLOCK; + # Set the flags on the filehandle + fcntl($fh, &F_SETFL, $flags) || die $!; +} + + +sub __RUNNING_THE_JOBS_AND_PRINTING_PROGRESS__ {} + + +# Variable structure: +# +# $Global::running{$pid} = Pointer to Job-object +# @Global::virgin_jobs = Pointer to Job-object that have received no input +# $Global::host{$sshlogin} = Pointer to SSHLogin-object +# $Global::total_running = total number of running jobs +# $Global::total_started = total jobs started +# $Global::max_procs_file = filename if --jobs is given a filename +# $Global::JobQueue = JobQueue object for the queue of jobs +# $Global::timeoutq = queue of times where jobs timeout +# $Global::newest_job = Job object of the most recent job started +# $Global::newest_starttime = timestamp of $Global::newest_job +# @Global::sshlogin +# $Global::minimal_command_line_length = minimum length supported by all sshlogins +# $Global::start_no_new_jobs = should more jobs be started? +# $Global::original_stderr = file handle for STDERR when the program started +# $Global::total_started = total number of jobs started +# $Global::joblog = filehandle of joblog +# $Global::debug = Is debugging on? +# $Global::exitstatus = status code of GNU Parallel +# $Global::quoting = quote the command to run + +sub init_run_jobs { + # Set Global variables and progress signal handlers + # Do the copying of basefiles + # Returns: N/A + $Global::total_running = 0; + $Global::total_started = 0; + $SIG{USR1} = \&list_running_jobs; + $SIG{USR2} = \&toggle_progress; + if(@opt::basefile) { setup_basefile(); } +} + +{ + my $last_time; + my %last_mtime; + my $max_procs_file_last_mod; + + sub changed_procs_file { + # If --jobs is a file and it is modfied: + # Force recomputing of max_jobs_running for each $sshlogin + # Uses: + # $Global::max_procs_file + # %Global::host + # Returns: N/A + if($Global::max_procs_file) { + # --jobs filename + my $mtime = (stat($Global::max_procs_file))[9]; + $max_procs_file_last_mod ||= 0; + if($mtime > $max_procs_file_last_mod) { + # file changed: Force re-computing max_jobs_running + $max_procs_file_last_mod = $mtime; + for my $sshlogin (values %Global::host) { + $sshlogin->set_max_jobs_running(undef); + } + } + } + } + + sub changed_sshloginfile { + # If --slf is changed: + # reload --slf + # filter_hosts + # setup_basefile + # Uses: + # @opt::sshloginfile + # @Global::sshlogin + # %Global::host + # $opt::filter_hosts + # Returns: N/A + if(@opt::sshloginfile) { + # Is --sshloginfile changed? + for my $slf (@opt::sshloginfile) { + my $actual_file = expand_slf_shorthand($slf); + my $mtime = (stat($actual_file))[9]; + $last_mtime{$actual_file} ||= $mtime; + if($mtime - $last_mtime{$actual_file} > 1) { + ::debug("run","--sshloginfile $actual_file changed. reload\n"); + $last_mtime{$actual_file} = $mtime; + # Reload $slf + # Empty sshlogins + @Global::sshlogin = (); + for (values %Global::host) { + # Don't start new jobs on any host + # except the ones added back later + $_->set_max_jobs_running(0); + } + # This will set max_jobs_running on the SSHlogins + read_sshloginfile($actual_file); + parse_sshlogin(); + $opt::filter_hosts and filter_hosts(); + setup_basefile(); + } + } + } + } + + sub start_more_jobs { + # Run start_another_job() but only if: + # * not $Global::start_no_new_jobs set + # * not JobQueue is empty + # * not load on server is too high + # * not server swapping + # * not too short time since last remote login + # Uses: + # %Global::host + # $Global::start_no_new_jobs + # $Global::JobQueue + # $opt::pipe + # $opt::load + # $opt::noswap + # $opt::delay + # $Global::newest_starttime + # Returns: + # $jobs_started = number of jobs started + my $jobs_started = 0; + my $jobs_started_this_round = 0; + if($Global::start_no_new_jobs) { + return $jobs_started; + } + if(time - ($last_time||0) > 1) { + # At most do this every second + $last_time = time; + changed_procs_file(); + changed_sshloginfile(); + } + do { + $jobs_started_this_round = 0; + # This will start 1 job on each --sshlogin (if possible) + # thus distribute the jobs on the --sshlogins round robin + for my $sshlogin (values %Global::host) { + if($Global::JobQueue->empty() and not $opt::pipe) { + # No more jobs in the queue + last; + } + debug("run", "Running jobs before on ", $sshlogin->string(), ": ", + $sshlogin->jobs_running(), "\n"); + if ($sshlogin->jobs_running() < $sshlogin->max_jobs_running()) { + if($opt::delay + and + $opt::delay > ::now() - $Global::newest_starttime) { + # It has been too short since last start + next; + } + if($opt::load and $sshlogin->loadavg_too_high()) { + # The load is too high or unknown + next; + } + if($opt::noswap and $sshlogin->swapping()) { + # The server is swapping + next; + } + if($opt::limit and $sshlogin->limit()) { + # Over limit + next; + } + if($opt::memfree and $sshlogin->memfree() < $opt::memfree) { + # The server has not enough mem free + ::debug("mem", "Not starting job: not enough mem\n"); + next; + } + if($sshlogin->too_fast_remote_login()) { + # It has been too short since + next; + } + debug("run", $sshlogin->string(), + " has ", $sshlogin->jobs_running(), + " out of ", $sshlogin->max_jobs_running(), + " jobs running. Start another.\n"); + if(start_another_job($sshlogin) == 0) { + # No more jobs to start on this $sshlogin + debug("run","No jobs started on ", + $sshlogin->string(), "\n"); + next; + } + $sshlogin->inc_jobs_running(); + $sshlogin->set_last_login_at(::now()); + $jobs_started++; + $jobs_started_this_round++; + } + debug("run","Running jobs after on ", $sshlogin->string(), ": ", + $sshlogin->jobs_running(), " of ", + $sshlogin->max_jobs_running(), "\n"); + } + } while($jobs_started_this_round); + + return $jobs_started; + } +} + +{ + my $no_more_file_handles_warned; + + sub start_another_job { + # If there are enough filehandles + # and JobQueue not empty + # and not $job is in joblog + # Then grab a job from Global::JobQueue, + # start it at sshlogin + # mark it as virgin_job + # Inputs: + # $sshlogin = the SSHLogin to start the job on + # Uses: + # $Global::JobQueue + # $opt::pipe + # $opt::results + # $opt::resume + # @Global::virgin_jobs + # Returns: + # 1 if another jobs was started + # 0 otherwise + my $sshlogin = shift; + # Do we have enough file handles to start another job? + if(enough_file_handles()) { + if($Global::JobQueue->empty() and not $opt::pipe) { + # No more commands to run + debug("start", "Not starting: JobQueue empty\n"); + return 0; + } else { + my $job; + # Skip jobs already in job log + # Skip jobs already in results + do { + $job = get_job_with_sshlogin($sshlogin); + if(not defined $job) { + # No command available for that sshlogin + debug("start", "Not starting: no jobs available for ", + $sshlogin->string(), "\n"); + return 0; + } + if($job->is_already_in_joblog()) { + $job->free_slot(); + } + } while ($job->is_already_in_joblog() + or + ($opt::results and $opt::resume and $job->is_already_in_results())); + debug("start", "Command to run on '", $job->sshlogin()->string(), "': '", + $job->replaced(),"'\n"); + if($job->start()) { + if($opt::pipe) { + if($job->virgin()) { + push(@Global::virgin_jobs,$job); + } else { + # Block already set: This is a retry + if(fork()) { + ::debug("pipe","\n\nWriting ",length ${$job->block_ref()}, + " to ", $job->seq(),"\n"); + close $job->fh(0,"w"); + } else { + $job->write($job->block_ref()); + close $job->fh(0,"w"); + exit(0); + } + } + } + debug("start", "Started as seq ", $job->seq(), + " pid:", $job->pid(), "\n"); + return 1; + } else { + # Not enough processes to run the job. + # Put it back on the queue. + $Global::JobQueue->unget($job); + # Count down the number of jobs to run for this SSHLogin. + my $max = $sshlogin->max_jobs_running(); + if($max > 1) { $max--; } else { + my @arg; + for my $record (@{$job->{'commandline'}->{'arg_list'}}) { + push @arg, map { $_->orig() } @$record; + } + ::error("No more processes: cannot run a single job. Something is wrong at @arg."); + ::wait_and_exit(255); + } + $sshlogin->set_max_jobs_running($max); + # Sleep up to 300 ms to give other processes time to die + ::usleep(rand()*300); + ::warning("No more processes: ". + "Decreasing number of running jobs to $max.", + "Raising ulimit -u or /etc/security/limits.conf may help."); + return 0; + } + } + } else { + # No more file handles + $no_more_file_handles_warned++ or + ::warning("No more file handles. ", + "Raising ulimit -n or /etc/security/limits.conf may help."); + debug("start", "No more file handles. "); + return 0; + } + } +} + +sub init_progress { + # Uses: + # $opt::bar + # Returns: + # list of computers for progress output + $|=1; + if($opt::bar) { + return("",""); + } + my %progress = progress(); + return ("\nComputers / CPU cores / Max jobs to run\n", + $progress{'workerlist'}); +} + +sub drain_job_queue { + # Uses: + # $opt::progress + # $Global::total_running + # $Global::max_jobs_running + # %Global::running + # $Global::JobQueue + # %Global::host + # $Global::start_no_new_jobs + # Returns: N/A + if($opt::progress) { + ::status_no_nl(init_progress()); + } + my $last_header = ""; + my $sleep = 0.2; + do { + while($Global::total_running > 0) { + debug($Global::total_running, "==", scalar + keys %Global::running," slots: ", $Global::max_jobs_running); + if($opt::pipe) { + # When using --pipe sometimes file handles are not closed properly + for my $job (values %Global::running) { + close $job->fh(0,"w"); + } + } + if($opt::progress) { + my %progress = progress(); + if($last_header ne $progress{'header'}) { + ::status("", $progress{'header'}); + $last_header = $progress{'header'}; + } + ::status_no_nl("\r",$progress{'status'}); + } + if($Global::total_running < $Global::max_jobs_running + and not $Global::JobQueue->empty()) { + # These jobs may not be started because of loadavg + # or too little time between each ssh login. + if(start_more_jobs() > 0) { + # Exponential back-on if jobs were started + $sleep = $sleep/2+0.001; + } + } + # Exponential back-off sleeping + $sleep = ::reap_usleep($sleep); + } + if(not $Global::JobQueue->empty()) { + # These jobs may not be started: + # * because there the --filter-hosts has removed all + if(not %Global::host) { + ::error("There are no hosts left to run on."); + ::wait_and_exit(255); + } + # * because of loadavg + # * because of too little time between each ssh login. + start_more_jobs(); + $sleep = ::reap_usleep($sleep); + if($Global::max_jobs_running == 0) { + ::warning("There are no job slots available. Increase --jobs."); + } + } + while($opt::sqlmaster and not $Global::sql->finished()) { + # SQL master + $sleep = ::reap_usleep($sleep); + if($Global::start_sqlworker) { + # Start an SQL worker as we are now sure there is work to do + $Global::start_sqlworker = 0; + if(my $pid = fork()) { + $Global::unkilled_sqlworker = $pid; + } else { + # Replace --sql/--sqlandworker with --sqlworker + my @ARGV = map { s/^--sql(andworker)?$/--sqlworker/; $_ } @Global::options_in_argv; + # exec the --sqlworker + exec($0,::shell_quote(@ARGV),@command); + } + } + } + } while ($Global::total_running > 0 + or + not $Global::start_no_new_jobs and not $Global::JobQueue->empty() + or + $opt::sqlmaster and not $Global::sql->finished()); + if($opt::progress) { + my %progress = progress(); + ::status("\r".$progress{'status'}); + } +} + +sub toggle_progress { + # Turn on/off progress view + # Uses: + # $opt::progress + # Returns: N/A + $opt::progress = not $opt::progress; + if($opt::progress) { + ::status_no_nl(init_progress()); + } +} + +sub progress { + # Uses: + # $opt::bar + # $opt::eta + # %Global::host + # $Global::total_started + # Returns: + # $workerlist = list of workers + # $header = that will fit on the screen + # $status = message that will fit on the screen + if($opt::bar) { + return ("workerlist" => "", "header" => "", "status" => bar()); + } + my $eta = ""; + my ($status,$header)=("",""); + if($opt::eta) { + my($total, $completed, $left, $pctcomplete, $avgtime, $this_eta) = + compute_eta(); + $eta = sprintf("ETA: %ds Left: %d AVG: %.2fs ", + $this_eta, $left, $avgtime); + } + my $termcols = terminal_columns(); + my @workers = sort keys %Global::host; + my %sshlogin = map { $_ eq ":" ? ($_ => "local") : ($_ => $_) } @workers; + my $workerno = 1; + my %workerno = map { ($_=>$workerno++) } @workers; + my $workerlist = ""; + for my $w (@workers) { + $workerlist .= + $workerno{$w}.":".$sshlogin{$w} ." / ". + ($Global::host{$w}->ncpus() || "-")." / ". + $Global::host{$w}->max_jobs_running()."\n"; + } + $status = "x"x($termcols+1); + # Select an output format that will fit on a single line + if(length $status > $termcols) { + # sshlogin1:XX/XX/XX%/XX.Xs sshlogin2:XX/XX/XX%/XX.Xs sshlogin3:XX/XX/XX%/XX.Xs + $header = "Computer:jobs running/jobs completed/%of started jobs/Average seconds to complete"; + $status = $eta . + join(" ",map + { + if($Global::total_started) { + my $completed = ($Global::host{$_}->jobs_completed()||0); + my $running = $Global::host{$_}->jobs_running(); + my $time = $completed ? (time-$^T)/($completed) : "0"; + sprintf("%s:%d/%d/%d%%/%.1fs ", + $sshlogin{$_}, $running, $completed, + ($running+$completed)*100 + / $Global::total_started, $time); + } + } @workers); + } + if(length $status > $termcols) { + # 1:XX/XX/XX%/XX.Xs 2:XX/XX/XX%/XX.Xs 3:XX/XX/XX%/XX.Xs 4:XX/XX/XX%/XX.Xs + $header = "Computer:jobs running/jobs completed/%of started jobs"; + $status = $eta . + join(" ",map + { + if($Global::total_started) { + my $completed = ($Global::host{$_}->jobs_completed()||0); + my $running = $Global::host{$_}->jobs_running(); + my $time = $completed ? (time-$^T)/($completed) : "0"; + sprintf("%s:%d/%d/%d%%/%.1fs ", + $workerno{$_}, $running, $completed, + ($running+$completed)*100 + / $Global::total_started, $time); + } + } @workers); + } + if(length $status > $termcols) { + # sshlogin1:XX/XX/XX% sshlogin2:XX/XX/XX% sshlogin3:XX/XX/XX% + $header = "Computer:jobs running/jobs completed/%of started jobs"; + $status = $eta . + join(" ",map + { + if($Global::total_started) { + sprintf("%s:%d/%d/%d%%", + $sshlogin{$_}, + $Global::host{$_}->jobs_running(), + ($Global::host{$_}->jobs_completed()||0), + ($Global::host{$_}->jobs_running()+ + ($Global::host{$_}->jobs_completed()||0))*100 + / $Global::total_started) + } + } + @workers); + } + if(length $status > $termcols) { + # 1:XX/XX/XX% 2:XX/XX/XX% 3:XX/XX/XX% 4:XX/XX/XX% 5:XX/XX/XX% 6:XX/XX/XX% + $header = "Computer:jobs running/jobs completed/%of started jobs"; + $status = $eta . + join(" ",map + { + if($Global::total_started) { + sprintf("%s:%d/%d/%d%%", + $workerno{$_}, + $Global::host{$_}->jobs_running(), + ($Global::host{$_}->jobs_completed()||0), + ($Global::host{$_}->jobs_running()+ + ($Global::host{$_}->jobs_completed()||0))*100 + / $Global::total_started) + } + } + @workers); + } + if(length $status > $termcols) { + # sshlogin1:XX/XX/XX% sshlogin2:XX/XX/XX% sshlogin3:XX/XX sshlogin4:XX/XX + $header = "Computer:jobs running/jobs completed"; + $status = $eta . + join(" ",map + { sprintf("%s:%d/%d", + $sshlogin{$_}, $Global::host{$_}->jobs_running(), + ($Global::host{$_}->jobs_completed()||0)) } + @workers); + } + if(length $status > $termcols) { + # sshlogin1:XX/XX sshlogin2:XX/XX sshlogin3:XX/XX sshlogin4:XX/XX + $header = "Computer:jobs running/jobs completed"; + $status = $eta . + join(" ",map + { sprintf("%s:%d/%d", + $sshlogin{$_}, $Global::host{$_}->jobs_running(), + ($Global::host{$_}->jobs_completed()||0)) } + @workers); + } + if(length $status > $termcols) { + # 1:XX/XX 2:XX/XX 3:XX/XX 4:XX/XX 5:XX/XX 6:XX/XX + $header = "Computer:jobs running/jobs completed"; + $status = $eta . + join(" ",map + { sprintf("%s:%d/%d", + $workerno{$_}, $Global::host{$_}->jobs_running(), + ($Global::host{$_}->jobs_completed()||0)) } + @workers); + } + if(length $status > $termcols) { + # sshlogin1:XX sshlogin2:XX sshlogin3:XX sshlogin4:XX sshlogin5:XX + $header = "Computer:jobs completed"; + $status = $eta . + join(" ",map + { sprintf("%s:%d", + $sshlogin{$_}, + ($Global::host{$_}->jobs_completed()||0)) } + @workers); + } + if(length $status > $termcols) { + # 1:XX 2:XX 3:XX 4:XX 5:XX 6:XX + $header = "Computer:jobs completed"; + $status = $eta . + join(" ",map + { sprintf("%s:%d", + $workerno{$_}, + ($Global::host{$_}->jobs_completed()||0)) } + @workers); + } + return ("workerlist" => $workerlist, "header" => $header, "status" => $status); +} + +{ + + my ($total, $first_completed, $smoothed_avg_time, $last_eta); + + sub compute_eta { + # Calculate important numbers for ETA + # Returns: + # $total = number of jobs in total + # $completed = number of jobs completed + # $left = number of jobs left + # $pctcomplete = percent of jobs completed + # $avgtime = averaged time + # $eta = smoothed eta + $total = $Global::JobQueue->total_jobs(); + my $completed = $Global::total_completed; + my $left = $total - $completed; + if(not $completed) { + return($total, $completed, $left, 0, 0, 0); + } + my $pctcomplete = $completed / $total; + $first_completed ||= time; + my $timepassed = (time - $first_completed); + my $avgtime = $timepassed / $completed; + $smoothed_avg_time ||= $avgtime; + # Smooth the eta so it does not jump wildly + $smoothed_avg_time = (1 - $pctcomplete) * $smoothed_avg_time + + $pctcomplete * $avgtime; + my $eta = int($left * $smoothed_avg_time); + if($eta*0.90 < $last_eta and $last_eta < $eta) { + # Eta jumped less that 10% up: Keep the last eta instead + $eta = $last_eta; + } else { + $last_eta = $eta; + } + return($total, $completed, $left, $pctcomplete, $avgtime, $eta); + } +} + +{ + my ($rev,$reset); + + sub bar { + # Return: + # $status = bar with eta, completed jobs, arg and pct + $rev ||= "\033[7m"; + $reset ||= "\033[0m"; + my($total, $completed, $left, $pctcomplete, $avgtime, $eta) = + compute_eta(); + my $arg = $Global::newest_job ? + $Global::newest_job->{'commandline'}-> + replace_placeholders(["\257<\257>"],0,0) : ""; + # These chars mess up display in the terminal + $arg =~ tr/[\011-\016\033\302-\365]//d; + my $eta_dhms = ::seconds_to_time_units($eta); + my $bar_text = + sprintf("%d%% %d:%d=%s %s", + $pctcomplete*100, $completed, $left, $eta_dhms, $arg); + my $terminal_width = terminal_columns(); + my $s = sprintf("%-${terminal_width}s", + substr($bar_text." "x$terminal_width, + 0,$terminal_width)); + my $width = int($terminal_width * $pctcomplete); + substr($s,$width,0) = $reset; + my $zenity = sprintf("%-${terminal_width}s", + substr("# $eta sec $arg", + 0,$terminal_width)); + $s = "\r" . $zenity . "\r" . $pctcomplete*100 . # Prefix with zenity header + "\r" . $rev . $s . $reset; + return $s; + } +} + +{ + my ($columns,$last_column_time); + + sub terminal_columns { + # Get the number of columns of the terminal. + # Only update once per second. + # Returns: + # number of columns of the screen + if(not $columns or $last_column_time < time) { + $last_column_time = time; + $columns = $ENV{'COLUMNS'}; + if(not $columns) { + my $stty = ::qqx("stty -a get()) { + if($sshlogin->in_hostgroups($job->hostgroups())) { + # Found a job to be run on a hostgroup of this + # $sshlogin + last; + } else { + # This job was not in the hostgroups of $sshlogin + push @other_hostgroup_jobs, $job; + } + } + $Global::JobQueue->unget(@other_hostgroup_jobs); + if(not defined $job) { + # No more jobs + return undef; + } + } else { + $job = $Global::JobQueue->get(); + if(not defined $job) { + # No more jobs + ::debug("start", "No more jobs: JobQueue empty\n"); + return undef; + } + } + + my $clean_command = $job->replaced(); + if($clean_command =~ /^\s*$/) { + # Do not run empty lines + if(not $Global::JobQueue->empty()) { + return get_job_with_sshlogin($sshlogin); + } else { + return undef; + } + } + $job->set_sshlogin($sshlogin); + if($opt::retries and $clean_command and + $job->failed_here()) { + # This command with these args failed for this sshlogin + my ($no_of_failed_sshlogins,$min_failures) = $job->min_failed(); + # Only look at the Global::host that have > 0 jobslots + if($no_of_failed_sshlogins == + grep { $_->max_jobs_running() > 0 } values %Global::host + and $job->failed_here() == $min_failures) { + # It failed the same or more times on another host: + # run it on this host + } else { + # If it failed fewer times on another host: + # Find another job to run + my $nextjob; + if(not $Global::JobQueue->empty()) { + # This can potentially recurse for all args + no warnings 'recursion'; + $nextjob = get_job_with_sshlogin($sshlogin); + } + # Push the command back on the queue + $Global::JobQueue->unget($job); + return $nextjob; + } + } + return $job; +} + + +sub __REMOTE_SSH__ {} + + +sub read_sshloginfiles { + # Read a list of --slf's + # Input: + # @files = files or symbolic file names to read + # Returns: N/A + for my $s (@_) { + read_sshloginfile(expand_slf_shorthand($s)); + } +} + +sub expand_slf_shorthand { + # Expand --slf shorthand into a read file name + # Input: + # $file = file or symbolic file name to read + # Returns: + # $file = actual file name to read + my $file = shift; + if($file eq "-") { + # skip: It is stdin + } elsif($file eq "..") { + $file = $Global::config_dir."/sshloginfile"; + } elsif($file eq ".") { + $file = "/etc/parallel/sshloginfile"; + } elsif(not -r $file) { + for(@Global::config_dirs) { + if(not -r $_."/".$file) { + # Try prepending $PARALLEL_HOME + ::error("Cannot open $file."); + ::wait_and_exit(255); + } else { + $file = $_."/".$file; + last; + } + } + } + return $file; +} + +sub read_sshloginfile { + # Read sshloginfile into @Global::sshlogin + # Input: + # $file = file to read + # Uses: + # @Global::sshlogin + # Returns: N/A + local $/ = "\n"; + my $file = shift; + my $close = 1; + my $in_fh; + ::debug("init","--slf ",$file); + if($file eq "-") { + $in_fh = *STDIN; + $close = 0; + } else { + if(not open($in_fh, "<", $file)) { + # Try the filename + ::error("Cannot open $file."); + ::wait_and_exit(255); + } + } + while(<$in_fh>) { + chomp; + /^\s*#/ and next; + /^\s*$/ and next; + push @Global::sshlogin, $_; + } + if($close) { + close $in_fh; + } +} + +sub parse_sshlogin { + # Parse @Global::sshlogin into %Global::host. + # Keep only hosts that are in one of the given ssh hostgroups. + # Uses: + # @Global::sshlogin + # $Global::minimal_command_line_length + # %Global::host + # $opt::transfer + # @opt::return + # $opt::cleanup + # @opt::basefile + # @opt::trc + # Returns: N/A + my @login; + if(not @Global::sshlogin) { @Global::sshlogin = (":"); } + for my $sshlogin (@Global::sshlogin) { + # Split up -S sshlogin,sshlogin + for my $s (split /,|\n/, $sshlogin) { + if ($s eq ".." or $s eq "-") { + # This may add to @Global::sshlogin - possibly bug + read_sshloginfile(expand_slf_shorthand($s)); + } else { + $s =~ s/\s*$//; + push (@login, $s); + } + } + } + $Global::minimal_command_line_length = 8_000_000; + my @allowed_hostgroups; + for my $ncpu_sshlogin_string (::uniq(@login)) { + my $sshlogin = SSHLogin->new($ncpu_sshlogin_string); + my $sshlogin_string = $sshlogin->string(); + if($sshlogin_string eq "") { + # This is an ssh group: -S @webservers + push @allowed_hostgroups, $sshlogin->hostgroups(); + next; + } + if($Global::host{$sshlogin_string}) { + # This sshlogin has already been added: + # It is probably a host that has come back + # Set the max_jobs_running back to the original + debug("run","Already seen $sshlogin_string\n"); + if($sshlogin->{'ncpus'}) { + # If ncpus set by '#/' of the sshlogin, overwrite it: + $Global::host{$sshlogin_string}->set_ncpus($sshlogin->ncpus()); + } + $Global::host{$sshlogin_string}->set_max_jobs_running(undef); + next; + } + $sshlogin->set_maxlength(Limits::Command::max_length()); + + $Global::minimal_command_line_length = + ::min($Global::minimal_command_line_length, $sshlogin->maxlength()); + $Global::host{$sshlogin_string} = $sshlogin; + } + if(@allowed_hostgroups) { + # Remove hosts that are not in these groups + while (my ($string, $sshlogin) = each %Global::host) { + if(not $sshlogin->in_hostgroups(@allowed_hostgroups)) { + delete $Global::host{$string}; + } + } + } + + # debug("start", "sshlogin: ", my_dump(%Global::host),"\n"); + if(@Global::transfer_files or @opt::return or $opt::cleanup or @opt::basefile) { + if(not remote_hosts()) { + # There are no remote hosts + if(@opt::trc) { + ::warning("--trc ignored as there are no remote --sshlogin."); + } elsif (defined $opt::transfer) { + ::warning("--transfer ignored as there are no remote --sshlogin."); + } elsif (@opt::transfer_files) { + ::warning("--transferfile ignored as there are no remote --sshlogin."); + } elsif (@opt::return) { + ::warning("--return ignored as there are no remote --sshlogin."); + } elsif (defined $opt::cleanup) { + ::warning("--cleanup ignored as there are no remote --sshlogin."); + } elsif (@opt::basefile) { + ::warning("--basefile ignored as there are no remote --sshlogin."); + } + } + } +} + +sub remote_hosts { + # Return sshlogins that are not ':' + # Uses: + # %Global::host + # Returns: + # list of sshlogins with ':' removed + return grep !/^:$/, keys %Global::host; +} + +sub setup_basefile { + # Transfer basefiles to each $sshlogin + # This needs to be done before first jobs on $sshlogin is run + # Uses: + # %Global::host + # @opt::basefile + # Returns: N/A + my @cmd; + my $rsync_destdir; + my $workdir; + for my $sshlogin (values %Global::host) { + if($sshlogin->string() eq ":") { next } + for my $file (@opt::basefile) { + if($file !~ m:^/: and $opt::workdir eq "...") { + ::error("Work dir '...' will not work with relative basefiles."); + ::wait_and_exit(255); + } + if(not $workdir) { + my $dummycmdline = CommandLine->new(1,["true"],{},0,0,[],[],{},{},{}); + my $dummyjob = Job->new($dummycmdline); + $workdir = $dummyjob->workdir(); + } + push @cmd, $sshlogin->rsync_transfer_cmd($file,$workdir); + } + } + debug("init", "basesetup: @cmd\n"); + my ($exitstatus,$stdout_ref,$stderr_ref) = + run_parallel((join "\n",@cmd),"-j0","--retries",5); + if($exitstatus) { + my @stdout = @$stdout_ref; + my @stderr = @$stderr_ref; + ::error("Copying of --basefile failed: @stdout@stderr"); + ::wait_and_exit(255); + } +} + +sub cleanup_basefile { + # Remove the basefiles transferred + # Uses: + # %Global::host + # @opt::basefile + # Returns: N/A + my @cmd; + my $workdir; + if(not $workdir) { + my $dummycmdline = CommandLine->new(1,"true",0,0,0,0,0,{},{},{}); + my $dummyjob = Job->new($dummycmdline); + $workdir = $dummyjob->workdir(); + } + for my $sshlogin (values %Global::host) { + if($sshlogin->string() eq ":") { next } + for my $file (@opt::basefile) { + push @cmd, $sshlogin->cleanup_cmd($file,$workdir); + } + } + debug("init", "basecleanup: @cmd\n"); + my ($exitstatus,$stdout_ref,$stderr_ref) = + run_parallel(join("\n",@cmd),"-j0","--retries",5); + if($exitstatus) { + my @stdout = @$stdout_ref; + my @stderr = @$stderr_ref; + ::error("Cleanup of --basefile failed: @stdout@stderr"); + ::wait_and_exit(255); + } +} + +sub run_parallel { + my ($stdin,@args) = @_; + my $cmd = join "",map { " $_ & " } split /\n/, $stdin; + print $Global::original_stderr ` $cmd wait` ; + return 0 +} + +sub _run_parallel { + # Run GNU Parallel + # This should ideally just fork an internal copy + # and not start it through a shell + # Input: + # $stdin = data to provide on stdin for GNU Parallel + # @args = command line arguments + # Returns: + # $exitstatus = exitcode of GNU Parallel run + # \@stdout = standard output + # \@stderr = standard error + my ($stdin,@args) = @_; + my ($exitstatus,@stdout,@stderr); + my ($stdin_fh,$stdout_fh)=(gensym(),gensym()); + my ($stderr_fh, $stderrname) = ::tmpfile(SUFFIX => ".par"); + unlink $stderrname; + + my $pid = ::open3($stdin_fh,$stdout_fh,$stderr_fh, + $0,qw(--plain --shell /bin/sh --will-cite), @args); + if(my $writerpid = fork()) { + close $stdin_fh; + @stdout = <$stdout_fh>; + # Now stdout is closed: + # These pids should be dead or die very soon + while(kill 0, $writerpid) { ::usleep(1); } + die; +# reap $writerpid; +# while(kill 0, $pid) { ::usleep(1); } +# reap $writerpid; + $exitstatus = $?; + seek $stderr_fh, 0, 0; + @stderr = <$stderr_fh>; + close $stdout_fh; + close $stderr_fh; + } else { + close $stdout_fh; + close $stderr_fh; + print $stdin_fh $stdin; + close $stdin_fh; + exit(0); + } + return ($exitstatus,\@stdout,\@stderr); +} + +sub filter_hosts { + # Remove down --sshlogins from active duty. + # Find ncpus, ncores, maxlen, time-to-login for each host. + # Uses: + # %Global::host + # $Global::minimal_command_line_length + # $opt::use_cpus_instead_of_cores + # Returns: N/A + + my ($ncores_ref, $ncpus_ref, $time_to_login_ref, $maxlen_ref, + $echo_ref, $down_hosts_ref) = + parse_host_filtering(parallelized_host_filtering()); + + delete @Global::host{@$down_hosts_ref}; + @$down_hosts_ref and ::warning("Removed @$down_hosts_ref."); + + $Global::minimal_command_line_length = 8_000_000; + while (my ($sshlogin, $obj) = each %Global::host) { + if($sshlogin eq ":") { next } + $ncpus_ref->{$sshlogin} or + ::die_bug("ncpus missing: ".$obj->serverlogin()); + $ncores_ref->{$sshlogin} or + ::die_bug("ncores missing: ".$obj->serverlogin()); + $time_to_login_ref->{$sshlogin} or + ::die_bug("time_to_login missing: ".$obj->serverlogin()); + $maxlen_ref->{$sshlogin} or + ::die_bug("maxlen missing: ".$obj->serverlogin()); + if($opt::use_cpus_instead_of_cores) { + $obj->set_ncpus($ncpus_ref->{$sshlogin}); + } else { + $obj->set_ncpus($ncores_ref->{$sshlogin}); + } + $obj->set_time_to_login($time_to_login_ref->{$sshlogin}); + $obj->set_maxlength($maxlen_ref->{$sshlogin}); + $Global::minimal_command_line_length = + ::min($Global::minimal_command_line_length, + int($maxlen_ref->{$sshlogin}/2)); + ::debug("init", "Timing from -S:$sshlogin ", + " ncpus:",$ncpus_ref->{$sshlogin}, + " ncores:", $ncores_ref->{$sshlogin}, + " time_to_login:", $time_to_login_ref->{$sshlogin}, + " maxlen:", $maxlen_ref->{$sshlogin}, + " min_max_len:", $Global::minimal_command_line_length,"\n"); + } +} + +sub parse_host_filtering { + # Input: + # @lines = output from parallelized_host_filtering() + # Returns: + # \%ncores = number of cores of {host} + # \%ncpus = number of cpus of {host} + # \%time_to_login = time_to_login on {host} + # \%maxlen = max command len on {host} + # \%echo = echo received from {host} + # \@down_hosts = list of hosts with no answer + local $/ = "\n"; + my (%ncores, %ncpus, %time_to_login, %maxlen, %echo, @down_hosts); + for (@_) { + ::debug("init",$_); + chomp; + my @col = split /\t/, $_; + if($col[0] =~ /^parallel: Warning:/) { + # Timed out job: Ignore it + next; + } elsif(defined $col[6]) { + # This is a line from --joblog + # seq host time spent sent received exit signal command + # 2 : 1372607672.654 0.675 0 0 0 0 eval true\ m\;ssh\ m\ parallel\ --number-of-cores + if($col[0] eq "Seq" and $col[1] eq "Host" and + $col[2] eq "Starttime") { + # Header => skip + next; + } + # Get server from: eval true server\; + $col[8] =~ /eval true..([^;]+).;/ or + ::die_bug("col8 does not contain host: $col[8]"); + my $host = $1; + $host =~ tr/\\//d; + $Global::host{$host} or next; + if($col[6] eq "255" or $col[6] eq "-1" or $col[6] eq "1") { + # exit == 255 or exit == timeout (-1): ssh failed/timedout + # exit == 1: lsh failed + # Remove sshlogin + ::debug("init", "--filtered $host\n"); + push(@down_hosts, $host); + } elsif($col[6] eq "127") { + # signal == 127: parallel not installed remote + # Set ncpus and ncores = 1 + ::warning("Could not figure out ". + "number of cpus on $host. Using 1."); + $ncores{$host} = 1; + $ncpus{$host} = 1; + $maxlen{$host} = Limits::Command::max_length(); + } elsif($col[0] =~ /^\d+$/ and $Global::host{$host}) { + # Remember how log it took to log in + # 2 : 1372607672.654 0.675 0 0 0 0 eval true\ m\;ssh\ m\ echo + $time_to_login{$host} = ::min($time_to_login{$host},$col[3]); + } else { + ::die_bug("host check unmatched long jobline: $_"); + } + } elsif($Global::host{$col[0]}) { + # This output from --number-of-cores, --number-of-cpus, + # --max-line-length-allowed + # ncores: server 8 + # ncpus: server 2 + # maxlen: server 131071 + if(/parallel: Warning: Cannot figure out number of/) { + next; + } + if(not $ncores{$col[0]}) { + $ncores{$col[0]} = $col[1]; + } elsif(not $ncpus{$col[0]}) { + $ncpus{$col[0]} = $col[1]; + } elsif(not $maxlen{$col[0]}) { + $maxlen{$col[0]} = $col[1]; + } elsif(not $echo{$col[0]}) { + $echo{$col[0]} = $col[1]; + } elsif(m/perl: warning:|LANGUAGE =|LC_ALL =|LANG =|are supported and installed/) { + # Skip these: + # perl: warning: Setting locale failed. + # perl: warning: Please check that your locale settings: + # LANGUAGE = (unset), + # LC_ALL = (unset), + # LANG = "en_US.UTF-8" + # are supported and installed on your system. + # perl: warning: Falling back to the standard locale ("C"). + } else { + ::die_bug("host check too many col0: $_"); + } + } else { + ::die_bug("host check unmatched short jobline ($col[0]): $_"); + } + } + @down_hosts = uniq(@down_hosts); + return(\%ncores, \%ncpus, \%time_to_login, \%maxlen, \%echo, \@down_hosts); +} + +sub parallelized_host_filtering { + # Uses: + # %Global::host + # Returns: + # text entries with: + # * joblog line + # * hostname \t number of cores + # * hostname \t number of cpus + # * hostname \t max-line-length-allowed + # * hostname \t empty + + sub sshwrapped { + # Wrap with ssh and --env + my $sshlogin = shift; + my $command = shift; + my $commandline = CommandLine->new(1,[$command],{},0,0,[],[],{},{},{}); + my $job = Job->new($commandline); + $job->set_sshlogin($sshlogin); + $job->wrapped(); + return($job->{'wrapped'}); + } + + my(@cores, @cpus, @maxline, @echo); + while (my ($host, $sshlogin) = each %Global::host) { + if($host eq ":") { next } + # The 'true' is used to get the $host out later + push(@cores, $host."\t"."true $host; ". + sshwrapped($sshlogin,"parallel --number-of-cores")."\n\0"); + push(@cpus, $host."\t"."true $host; ". + sshwrapped($sshlogin,"parallel --number-of-cpus")."\n\0"); + push(@maxline, $host."\t"."true $host; ". + sshwrapped($sshlogin,"parallel --max-line-length-allowed")."\n\0"); + # 'echo' is used to get the fastest possible ssh login time + my $sshcmd = "true $host; exec " .$sshlogin->sshcommand()." ". + $sshlogin->serverlogin(); + push(@echo, $host."\t".$sshcmd." -- echo\n\0"); + } + + # --timeout 10: Setting up an SSH connection and running a simple + # command should never take > 10 sec. + # --delay 0.1: If multiple sshlogins use the same proxy the delay + # will make it less likely to overload the ssh daemon. + # --retries 3: If the ssh daemon is overloaded, try 3 times + my $cmd = + "$0 -j0 --timeout 10 --joblog - --plain --delay 0.1 --retries 3 ". + "--tag --tagstring '{1}' -0 --colsep '\t' -k eval '{2}' && true "; + $cmd = $Global::shell." -c ".::shell_quote_scalar($cmd); + ::debug("init", $cmd, "\n"); + my @out; + my $prepend = ""; + + my ($host_fh,$in,$err); + open3($in, $host_fh, $err, $cmd) || ::die_bug("parallel host check: $cmd"); + if(not fork()) { + # Give the commands to run to the $cmd + close $host_fh; + print $in @cores, @cpus, @maxline, @echo; + close $in; + exit(); + } + close $in; + for(<$host_fh>) { + if(/\'$/) { + # if last char = ' then append next line + # This may be due to quoting of \n in environment var + $prepend .= $_; + next; + } + $_ = $prepend . $_; + $prepend = ""; + push @out, $_; + } + close $host_fh; + return @out; +} + +sub onall { + # Runs @command on all hosts. + # Uses parallel to run @command on each host. + # --jobs = number of hosts to run on simultaneously. + # For each host a parallel command with the args will be running. + # Uses: + # $Global::quoting + # @opt::basefile + # $opt::jobs + # $opt::linebuffer + # $opt::ungroup + # $opt::group + # $opt::keeporder + # $opt::D + # $opt::plain + # $opt::max_chars + # $opt::linebuffer + # $opt::files + # $opt::colsep + # $opt::timeout + # $opt::plain + # $opt::retries + # $opt::max_chars + # $opt::arg_sep + # $opt::arg_file_sep + # @opt::v + # @opt::env + # %Global::host + # $Global::exitstatus + # $Global::debug + # $Global::joblog + # $opt::joblog + # $opt::tag + # $opt::tee + # Input: + # @command = command to run on all hosts + # Returns: N/A + sub tmp_joblog { + # Input: + # $joblog = filename of joblog - undef if none + # Returns: + # $tmpfile = temp file for joblog - undef if none + my $joblog = shift; + if(not defined $joblog) { + return undef; + } + my ($fh, $tmpfile) = ::tmpfile(SUFFIX => ".log"); + close $fh; + return $tmpfile; + } + my ($input_source_fh_ref,@command) = @_; + if($Global::quoting) { + @command = shell_quote(@command); + } + + # Copy all @input_source_fh (-a and :::) into tempfiles + my @argfiles = (); + for my $fh (@$input_source_fh_ref) { + my ($outfh, $name) = ::tmpfile(SUFFIX => ".all", UNLINK => not $opt::D); + print $outfh (<$fh>); + close $outfh; + push @argfiles, $name; + } + if(@opt::basefile) { setup_basefile(); } + # for each sshlogin do: + # parallel -S $sshlogin $command :::: @argfiles + # + # Pass some of the options to the sub-parallels, not all of them as + # -P should only go to the first, and -S should not be copied at all. + my $options = + join(" ", + ((defined $opt::D) ? "-D $opt::D" : ""), + ((defined $opt::group) ? "-g" : ""), + ((defined $opt::jobs) ? "-P $opt::jobs" : ""), + ((defined $opt::keeporder) ? "--keeporder" : ""), + ((defined $opt::linebuffer) ? "--linebuffer" : ""), + ((defined $opt::max_chars) ? "--max-chars ".$opt::max_chars : ""), + ((defined $opt::plain) ? "--plain" : ""), + ((defined $opt::ungroup) ? "-u" : ""), + ((defined $opt::tee) ? "--tee" : ""), + ); + my $suboptions = + join(" ", + ((defined $opt::D) ? "-D $opt::D" : ""), + ((defined $opt::arg_file_sep) ? "--arg-file-sep ".$opt::arg_file_sep : ""), + ((defined $opt::arg_sep) ? "--arg-sep ".$opt::arg_sep : ""), + ((defined $opt::colsep) ? "--colsep ".shell_quote($opt::colsep) : ""), + ((defined $opt::files) ? "--files" : ""), + ((defined $opt::group) ? "-g" : ""), + ((defined $opt::cleanup) ? "--cleanup" : ""), + ((defined $opt::keeporder) ? "--keeporder" : ""), + ((defined $opt::linebuffer) ? "--linebuffer" : ""), + ((defined $opt::max_chars) ? "--max-chars ".$opt::max_chars : ""), + ((defined $opt::plain) ? "--plain" : ""), + ((defined $opt::retries) ? "--retries ".$opt::retries : ""), + ((defined $opt::timeout) ? "--timeout ".$opt::timeout : ""), + ((defined $opt::ungroup) ? "-u" : ""), + ((defined $opt::tee) ? "--tee" : ""), + ((defined $opt::workdir) ? "--wd ".::shell_quote_scalar($opt::workdir) : ""), + (@Global::transfer_files ? map { "--tf ".::shell_quote_scalar($_) } + @Global::transfer_files : ""), + (@Global::ret_files ? map { "--return ".::shell_quote_scalar($_) } + @Global::ret_files : ""), + (@opt::env ? map { "--env ".::shell_quote_scalar($_) } @opt::env : ""), + (map { "-v" } @opt::v), + ); + ::debug("init", "| $0 $options\n"); + open(my $parallel_fh, "|-", "$0 --will-cite -j0 $options") || + ::die_bug("This does not run GNU Parallel: $0 $options"); + my @joblogs; + for my $host (sort keys %Global::host) { + my $sshlogin = $Global::host{$host}; + my $joblog = tmp_joblog($opt::joblog); + if($joblog) { + push @joblogs, $joblog; + $joblog = "--joblog $joblog"; + } + my $quad = $opt::arg_file_sep || "::::"; + ::debug("init", "$0 $suboptions -j1 $joblog ", + ((defined $opt::tag) ? + "--tagstring ".shell_quote_scalar($sshlogin->string()) : ""), + " -S ", shell_quote_scalar($sshlogin->string())," ", + join(" ",shell_quote(@command))," $quad @argfiles\n"); + print $parallel_fh "$0 $suboptions -j1 $joblog ", + ((defined $opt::tag) ? + "--tagstring ".shell_quote_scalar($sshlogin->string()) : ""), + " -S ", shell_quote_scalar($sshlogin->string())," ", + join(" ",shell_quote(@command))," $quad @argfiles\n"; + } + close $parallel_fh; + $Global::exitstatus = $? >> 8; + debug("init", "--onall exitvalue ", $?); + if(@opt::basefile and $opt::cleanup) { cleanup_basefile(); } + $Global::debug or unlink(@argfiles); + my %seen; + for my $joblog (@joblogs) { + # Append to $joblog + open(my $fh, "<", $joblog) || ::die_bug("Cannot open tmp joblog $joblog"); + # Skip first line (header); + <$fh>; + print $Global::joblog (<$fh>); + close $fh; + unlink($joblog); + } +} + + +sub __SIGNAL_HANDLING__ {} + + +sub sigtstp { + # Send TSTP signal (Ctrl-Z) to all children process groups + # Uses: + # %SIG + # Returns: N/A + signal_children("TSTP"); +} + +sub sigpipe { + # Send SIGPIPE signal to all children process groups + # Uses: + # %SIG + # Returns: N/A + signal_children("PIPE"); +} + +sub signal_children { + # Send signal to all children process groups + # and GNU Parallel itself + # Uses: + # %SIG + # Returns: N/A + my $signal = shift; + debug("run", "Sending $signal "); + kill $signal, map { -$_ } keys %Global::running; + # Use default signal handler for GNU Parallel itself + $SIG{$signal} = undef; + kill $signal, $$; +} + +sub save_original_signal_handler { + # Remember the original signal handler + # Uses: + # %Global::original_sig + # Returns: N/A + $SIG{INT} = sub { + if($opt::tmux) { ::qqx("tmux kill-session -t p$$"); } + wait_and_exit(255); + }; + $SIG{TERM} = sub { + if($opt::tmux) { ::qqx("tmux kill-session -t p$$"); } + wait_and_exit(255); + }; + %Global::original_sig = %SIG; + $SIG{TERM} = sub {}; # Dummy until jobs really start + $SIG{ALRM} = 'IGNORE'; + # Allow Ctrl-Z to suspend and `fg` to continue + $SIG{TSTP} = \&sigtstp; + $SIG{PIPE} = \&sigpipe; + $SIG{CONT} = sub { + # Set $SIG{TSTP} again (it is undef'ed in sigtstp() ) + $SIG{TSTP} = \&sigtstp; + # Send continue signal to all children process groups + kill "CONT", map { -$_ } keys %Global::running; + }; +} + +sub list_running_jobs { + # Print running jobs on tty + # Uses: + # %Global::running + # Returns: N/A + for my $job (values %Global::running) { + ::status("$Global::progname: ".$job->replaced()); + } +} + +sub start_no_new_jobs { + # Start no more jobs + # Uses: + # %Global::original_sig + # %Global::unlink + # $Global::start_no_new_jobs + # Returns: N/A + $SIG{TERM} = $Global::original_sig{TERM}; + unlink keys %Global::unlink; + ::status + ("$Global::progname: SIGTERM received. No new jobs will be started.", + "$Global::progname: Waiting for these ".(keys %Global::running). + " jobs to finish. Send SIGTERM again to stop now."); + list_running_jobs(); + $Global::start_no_new_jobs ||= 1; +} + +sub reaper { + # A job finished. + # Print the output. + # Start another job + # Uses: + # %Global::sshmaster + # %Global::running + # $opt::timeout + # $Global::timeoutq + # $opt::halt + # $opt::keeporder + # $Global::total_running + # Returns: + # @pids_reaped = PIDs of children finished + my $stiff; + my @pids_reaped; + my $children_reaped = 0; + debug("run", "Reaper "); + # For efficiency surround with BEGIN/COMMIT when using $opt::sqlmaster + $opt::sqlmaster and $Global::sql->run("BEGIN;"); + while (($stiff = waitpid(-1, &WNOHANG)) > 0) { + # $stiff = pid of dead process + if(wantarray) { + push(@pids_reaped,$stiff); + } else { + $children_reaped++; + } + if($Global::sshmaster{$stiff}) { + # This is one of the ssh -M: ignore + next; + } + my $job = $Global::running{$stiff}; + + # '-a <(seq 10)' will give us a pid not in %Global::running + $job or next; + delete $Global::running{$stiff}; + $Global::total_running--; + if($job->{'commandline'}{'skip'}) { + # $job->skip() was called + $job->set_exitstatus(-2); + $job->set_exitsignal(0); + } else { + $job->set_exitstatus($? >> 8); + $job->set_exitsignal($? & 127); + } + + debug("run", "seq ",$job->seq()," died (", $job->exitstatus(), ")"); + $job->set_endtime(::now()); + my $sshlogin = $job->sshlogin(); + $sshlogin->dec_jobs_running(); + if($job->should_be_retried()) { + $job->free_ressources(); + } else { + # The job is done + $sshlogin->inc_jobs_completed(); + # Free the jobslot + $job->free_slot(); + if($opt::timeout and not $job->exitstatus()) { + # Update average runtime for timeout only for successful jobs + $Global::timeoutq->update_median_runtime($job->runtime()); + } + if($opt::keeporder) { + $job->print_earlier_jobs(); + } else { + $job->print(); + } + if($job->should_we_halt() eq "now") { + # Kill children + ::kill_sleep_seq($job->pid()); + ::killall(); + ::wait_and_exit($Global::halt_exitstatus); + } + } + $job->cleanup(); + start_more_jobs(); + if($opt::progress) { + my %progress = progress(); + ::status_no_nl("\r",$progress{'status'}); + } + } + $opt::sqlmaster and $Global::sql->run("COMMIT;"); + debug("run", "done "); + return wantarray ? @pids_reaped : $children_reaped; +} + + +sub __USAGE__ {} + + +sub killall { + # Kill all jobs by killing their process groups + + $Global::start_no_new_jobs ||= 1; + $Global::killall ||= 1; + kill_sleep_seq(keys %Global::running); +} + +sub kill_sleep_seq { + # Send jobs TERM,TERM,KILL to processgroups + # Input: + # @pids = list of pids that are also processgroups + # Convert pids to process groups ($processgroup = -$pid) + my @pgrps = map { -$_ } @_; + my @term_seq = split/,/,$opt::termseq; + if(not @term_seq) { + @term_seq = ("TERM",200,"TERM",100,"TERM",50,"KILL",25); + } + while(@term_seq) { + @pgrps = kill_sleep(shift @term_seq, shift @term_seq, @pgrps); + } +} + +sub kill_sleep { + my ($signal, $sleep_max, @pids) = @_; + ::debug("kill","kill_sleep $signal ",(join " ",sort @pids),"\n"); + kill $signal, @pids; + my $sleepsum = 0; + my $sleep = 0.001; + my @dead; + + while(@pids and $sleepsum < $sleep_max) { + if($Global::killall) { + # Killall => don't run reaper + my $stiff; + while (($stiff = waitpid(-1, &WNOHANG)) > 0) { + # remove $stiff from @pids + @pids = grep { $_ != $stiff } @pids; + $sleep = $sleep/2+0.001; + } + } elsif(@dead = reaper()) { + # Remove reaped pids + for my $stiff (@dead) { + @pids = grep { $_ != $stiff } @pids; + } + $sleep = $sleep/2+0.001; + } + @pids = grep { kill( 0, $_) } @pids; + $sleep *= 1.1; + ::usleep($sleep); + $sleepsum += $sleep; + # Remove dead children + @pids = grep { kill( 0, $_) } @pids; + } + return @pids; +} + +sub wait_and_exit { + # If we do not wait, we sometimes get segfault + # Returns: N/A + my $error = shift; + unlink keys %Global::unlink; + if($error) { + # Kill all jobs without printing + killall(); + } + for (keys %Global::unkilled_children) { + # Kill any (non-jobs) children + kill 9, $_; + waitpid($_,0); + delete $Global::unkilled_children{$_}; + } + if($Global::unkilled_sqlworker) { + waitpid($Global::unkilled_sqlworker,0); + } + exit($error); +} + +sub die_usage { + # Returns: N/A + usage(); + wait_and_exit(255); +} + +sub usage { + # Returns: N/A + print join + ("\n", + "Usage:", + "", + "$Global::progname [options] [command [arguments]] < list_of_arguments", + "$Global::progname [options] [command [arguments]] (::: arguments|:::: argfile(s))...", + "cat ... | $Global::progname --pipe [options] [command [arguments]]", + "", + "-j n Run n jobs in parallel", + "-k Keep same order", + "-X Multiple arguments with context replace", + "--colsep regexp Split input on regexp for positional replacements", + "{} {.} {/} {/.} {#} {%} {= perl code =} Replacement strings", + "{3} {3.} {3/} {3/.} {=3 perl code =} Positional replacement strings", + "With --plus: {} = {+/}/{/} = {.}.{+.} = {+/}/{/.}.{+.} = {..}.{+..} =", + " {+/}/{/..}.{+..} = {...}.{+...} = {+/}/{/...}.{+...}", + "", + "-S sshlogin Example: foo\@server.example.com", + "--slf .. Use ~/.parallel/sshloginfile as the list of sshlogins", + "--trc {}.bar Shorthand for --transfer --return {}.bar --cleanup", + "--onall Run the given command with argument on all sshlogins", + "--nonall Run the given command with no arguments on all sshlogins", + "", + "--pipe Split stdin (standard input) to multiple jobs.", + "--recend str Record end separator for --pipe.", + "--recstart str Record start separator for --pipe.", + "", + "See 'man $Global::progname' for details", + "", + "Academic tradition requires you to cite works you base your article on.", + "If you use programs that use GNU Parallel to process data for an article in a", + "scientific publication, please cite:", + "", + " O. Tange (2018): GNU Parallel 2018, Mar 2018, ISBN 9781387509881,", + " DOI https://doi.org/10.5281/zenodo.1146014", + "", + "This helps funding further development; AND IT WON'T COST YOU A CENT.", + "If you pay 10000 EUR you should feel free to use GNU Parallel without citing.", + "", + "",); +} + +sub citation_notice { + # if --will-cite or --plain: do nothing + # if stderr redirected: do nothing + # if $PARALLEL_HOME/will-cite: do nothing + # else: print citation notice to stderr + if($opt::willcite + or + $opt::plain + or + not -t $Global::original_stderr + or + grep { -e "$_/will-cite" } @Global::config_dirs) { + # skip + } else { + ::status + ("Academic tradition requires you to cite works you base your article on.", + "If you use programs that use GNU Parallel to process data for an article in a", + "scientific publication, please cite:", + "", + " O. Tange (2018): GNU Parallel 2018, Mar 2018, ISBN 9781387509881,", + " DOI https://doi.org/10.5281/zenodo.1146014", + "", + "This helps funding further development; AND IT WON'T COST YOU A CENT.", + "If you pay 10000 EUR you should feel free to use GNU Parallel without citing.", + "", + "More about funding GNU Parallel and the citation notice:", + "https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice", + "", + "To silence this citation notice: run 'parallel --citation' once.", + "" + ); + } +} + +sub status { + my @w = @_; + my $fh = $Global::status_fd || *STDERR; + print $fh map { ($_, "\n") } @w; + flush $fh; +} + +sub status_no_nl { + my @w = @_; + my $fh = $Global::status_fd || *STDERR; + print $fh @w; + flush $fh; +} + +sub warning { + my @w = @_; + my $prog = $Global::progname || "parallel"; + status_no_nl(map { ($prog, ": Warning: ", $_, "\n"); } @w); +} + +sub error { + my @w = @_; + my $prog = $Global::progname || "parallel"; + status(map { ($prog.": Error: ". $_); } @w); +} + +sub die_bug { + my $bugid = shift; + print STDERR + ("$Global::progname: This should not happen. You have found a bug.\n", + "Please contact and follow\n", + "https://www.gnu.org/software/parallel/man.html#REPORTING-BUGS\n", + "\n", + "Include this in the report:\n", + "* The version number: $Global::version\n", + "* The bugid: $bugid\n", + "* The command line being run\n", + "* The files being read (put the files on a webserver if they are big)\n", + "\n", + "If you get the error on smaller/fewer files, please include those instead.\n"); + ::wait_and_exit(255); +} + +sub version { + # Returns: N/A + print join("\n", + "GNU $Global::progname $Global::version", + "Copyright (C) 2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018", + "Ole Tange and Free Software Foundation, Inc.", + "License GPLv3+: GNU GPL version 3 or later ", + "This is free software: you are free to change and redistribute it.", + "GNU $Global::progname comes with no warranty.", + "", + "Web site: http://www.gnu.org/software/${Global::progname}\n", + "When using programs that use GNU Parallel to process data for publication", + "please cite as described in 'parallel --citation'.\n", + ); +} + +sub citation { + # Returns: N/A + my ($all_argv_ref,$argv_options_removed_ref) = @_; + my $all_argv = "@$all_argv_ref"; + my $no_opts = "@$argv_options_removed_ref"; + $all_argv=~s/--citation//; + if($all_argv ne $no_opts) { + ::warning("--citation ignores all other options and arguments."); + ::status(""); + } + + ::status( + "Academic tradition requires you to cite works you base your article on.", + "If you use programs that use GNU Parallel to process data for an article in a", + "scientific publication, please cite:", + "", + "\@book{tange_ole_2018_1146014,", + " author = {Tange, Ole},", + " title = {GNU Parallel 2018},", + " publisher = {Ole Tange},", + " month = Mar,", + " year = 2018,", + " ISBN = {9781387509881},", + " doi = {10.5281/zenodo.1146014},", + " url = {https://doi.org/10.5281/zenodo.1146014}", + "}", + "", + "(Feel free to use \\nocite{tange_ole_2018_1146014})", + "", + "This helps funding further development; AND IT WON'T COST YOU A CENT.", + "If you pay 10000 EUR you should feel free to use GNU Parallel without citing.", + "", + "More about funding GNU Parallel and the citation notice:", + "https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice", + "", + "If you send a copy of your published article to tange\@gnu.org, it will be", + "mentioned in the release notes of next version of GNU Parallel.", + "" + ); + while(not grep { -e "$_/will-cite" } @Global::config_dirs) { + print "\nType: 'will cite' and press enter.\n> "; + my $input = ; + if(not defined $input) { + exit(255); + } + if($input =~ /will cite/i) { + mkdir $Global::config_dir; + if(open (my $fh, ">", $Global::config_dir."/will-cite")) { + close $fh; + ::status( + "", + "Thank you for your support. It is much appreciated. The citation", + "notice is now silenced.", + ""); + } else { + ::status( + "", + "Thank you for your support. It is much appreciated. The citation", + "cannot permanently be silenced. Use '--will-cite' instead.", + "", + "If you use '--will-cite' in scripts to be run by others you are making", + "it harder for others to see the citation notice. The development of", + "GNU parallel is indirectly financed through citations, so if users", + "do not know they should cite then you are making it harder to finance", + "development. However, if you pay 10000 EUR, you should feel free to", + "use '--will-cite' in scripts.", + ""); + last; + } + } + } +} + +sub show_limits { + # Returns: N/A + print("Maximal size of command: ",Limits::Command::real_max_length(),"\n", + "Maximal used size of command: ",Limits::Command::max_length(),"\n", + "\n", + "Execution of will continue now, and it will try to read its input\n", + "and run commands; if this is not what you wanted to happen, please\n", + "press CTRL-D or CTRL-C\n"); +} + +sub embed { + # Give an embeddable version of GNU Parallel + # Tested with: bash, zsh, ksh, ash, dash, sh + my $randomstring = "cut-here-".join"", + map { (0..9,"a".."z","A".."Z")[rand(62)] } (1..20); + if(not -f $0 or not -r $0) { + ::error("--embed only works if parallel is a readable file"); + exit(255); + } + if(open(my $fh, "<", $0)) { + # Read the source from $0 + my @source = <$fh>; + my $user = $ENV{LOGNAME} || $ENV{USERNAME} || $ENV{USER}; + my @env_parallel_source = (); + my $shell = $Global::shell; + $shell =~ s:.*/::; + for(which("env_parallel.$shell")) { + -r $_ or next; + # Read the source of env_parallel.shellname + open(my $env_parallel_source_fh, $_) || die; + @env_parallel_source = <$env_parallel_source_fh>; + close $env_parallel_source_fh; + last; + } + print "#!$Global::shell + +# Copyright (C) 2007,2008,2009,2010,2011,2012,2013,2014,2015,2016, +# 2017,2018 $user, Ole Tange and Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see +# or write to the Free Software Foundation, Inc., 51 Franklin St, +# Fifth Floor, Boston, MA 02110-1301 USA +"; + + print q! +# Embedded GNU Parallel created with --embed +parallel() { + # Start GNU Parallel without leaving temporary files + # + # Not all shells support 'perl <(cat ...)' + # This is a complex way of doing: + # perl <(cat <<'cut-here' + # [...] + # ) "$@" + # and also avoiding: + # [1]+ Done cat + + # Make a temporary fifo that perl can read from + _fifo_with_parallel_source=`perl -e 'use POSIX qw(mkfifo); + do { + $f = "/tmp/parallel-".join"", + map { (0..9,"a".."z","A".."Z")[rand(62)] } (1..5); + } while(-e $f); + mkfifo($f,0600); + print $f;'` + # Put source code into temporary file + # so it is easy to copy to the fifo + _file_with_parallel_source=`mktemp`; +!, + "cat <<'$randomstring' > \$_file_with_parallel_source\n", + @source, + $randomstring,"\n", + q! + # Copy the source code from the file to the fifo + # and remove the file and fifo ASAP + # 'sh -c' is needed to avoid + # [1]+ Done cat + sh -c "(rm $_file_with_parallel_source; cat >$_fifo_with_parallel_source; rm $_fifo_with_parallel_source) < $_file_with_parallel_source &" + + # Read the source from the fifo + perl $_fifo_with_parallel_source "$@" +} +!, + @env_parallel_source, + q! + +# This will call the functions above +parallel -k echo ::: Put your code here +env_parallel --session +env_parallel -k echo ::: Put your code here +parset p,y,c,h -k echo ::: Put your code here +echo $p $y $c $h +!; + } else { + ::error("Cannot open $0"); + exit(255); + } + ::status("Redirect the output to a file and add your changes at the end:", + " $0 --embed > new_script"); +} + +sub __GENERIC_COMMON_FUNCTION__ {} + + +sub mkdir_or_die { + # If dir is not executable: die + my $dir = shift; + # The eval is needed to catch exception from mkdir + eval { File::Path::mkpath($dir); }; + if(not -x $dir) { + ::error("Cannot change into non-executable dir $dir: $!"); + ::wait_and_exit(255); + } +} + +sub tmpfile { + # Create tempfile as $TMPDIR/parXXXXX + # Returns: + # $filehandle = opened file handle + # $filename = file name created + my($filehandle,$filename) = + ::tempfile(DIR=>$ENV{'TMPDIR'}, TEMPLATE => 'parXXXXX', @_); + if(wantarray) { + return($filehandle,$filename); + } else { + # Separate unlink due to NFS dealing badly with File::Temp + unlink $filename; + return $filehandle; + } +} + +sub tmpname { + # Select a name that does not exist + # Do not create the file as it may be used for creating a socket (by tmux) + # Remember the name in $Global::unlink to avoid hitting the same name twice + my $name = shift; + my($tmpname); + if(not -w $ENV{'TMPDIR'}) { + if(not -e $ENV{'TMPDIR'}) { + ::error("Tmpdir '$ENV{'TMPDIR'}' does not exist.","Try 'mkdir $ENV{'TMPDIR'}'"); + } else { + ::error("Tmpdir '$ENV{'TMPDIR'}' is not writable.","Try 'chmod +w $ENV{'TMPDIR'}'"); + } + ::wait_and_exit(255); + } + do { + $tmpname = $ENV{'TMPDIR'}."/".$name. + join"", map { (0..9,"a".."z","A".."Z")[rand(62)] } (1..5); + } while(-e $tmpname or $Global::unlink{$tmpname}++); + return $tmpname; +} + +sub tmpfifo { + # Find an unused name and mkfifo on it + use POSIX qw(mkfifo); + my $tmpfifo = tmpname("fif",@_); + mkfifo($tmpfifo,0600); + return $tmpfifo; +} + +sub rm { + # Remove file and remove it from %Global::unlink + # Uses: + # %Global::unlink + delete @Global::unlink{@_}; + unlink @_; +} + +sub size_of_block_dev { + # Like -s but for block devices + # Input: + # $blockdev = file name of block device + # Returns: + # $size = in bytes, undef if error + my $blockdev = shift; + if(open(my $fh, "<", $blockdev)) { + seek($fh,0,2) || ::die_bug("cannot seek $blockdev"); + my $size = tell($fh); + close $fh; + return $size; + } else { + ::error("cannot open $blockdev"); + wait_and_exit(255); + } +} + +sub qqx { + # Like qx but with clean environment (except for @keep) + # and STDERR ignored + # This is needed if the environment contains functions + # that /bin/sh does not understand + my $PATH = $ENV{'PATH'}; + my %env; + # ssh with ssh-agent needs PATH SSH_AUTH_SOCK SSH_AGENT_PID + # ssh with Kerberos needs KRB5CCNAME + # tmux needs LC_CTYPE + my @keep = qw(PATH SSH_AUTH_SOCK SSH_AGENT_PID KRB5CCNAME LC_CTYPE); + @env{@keep} = @ENV{@keep}; + local %ENV; + %ENV = %env; + if($Global::debug) { + return qx{ @_ && true }; + } else { + return qx{ ( @_ ) 2>/dev/null }; + } +} + +sub uniq { + # Remove duplicates and return unique values + return keys %{{ map { $_ => 1 } @_ }}; +} + +sub min { + # Returns: + # Minimum value of array + my $min; + for (@_) { + # Skip undefs + defined $_ or next; + defined $min or do { $min = $_; next; }; # Set $_ to the first non-undef + $min = ($min < $_) ? $min : $_; + } + return $min; +} + +sub max { + # Returns: + # Maximum value of array + my $max; + for (@_) { + # Skip undefs + defined $_ or next; + defined $max or do { $max = $_; next; }; # Set $_ to the first non-undef + $max = ($max > $_) ? $max : $_; + } + return $max; +} + +sub sum { + # Returns: + # Sum of values of array + my @args = @_; + my $sum = 0; + for (@args) { + # Skip undefs + $_ and do { $sum += $_; } + } + return $sum; +} + +sub undef_as_zero { + my $a = shift; + return $a ? $a : 0; +} + +sub undef_as_empty { + my $a = shift; + return $a ? $a : ""; +} + +sub undef_if_empty { + if(defined($_[0]) and $_[0] eq "") { + return undef; + } + return $_[0]; +} + +sub multiply_binary_prefix { + # Evalualte numbers with binary prefix + # Ki=2^10, Mi=2^20, Gi=2^30, Ti=2^40, Pi=2^50, Ei=2^70, Zi=2^80, Yi=2^80 + # ki=2^10, mi=2^20, gi=2^30, ti=2^40, pi=2^50, ei=2^70, zi=2^80, yi=2^80 + # K =2^10, M =2^20, G =2^30, T =2^40, P =2^50, E =2^70, Z =2^80, Y =2^80 + # k =10^3, m =10^6, g =10^9, t=10^12, p=10^15, e=10^18, z=10^21, y=10^24 + # 13G = 13*1024*1024*1024 = 13958643712 + # Input: + # $s = string with prefixes + # Returns: + # $value = int with prefixes multiplied + my @v = @_; + for(@v) { + defined $_ or next; + s/ki/*1024/gi; + s/mi/*1024*1024/gi; + s/gi/*1024*1024*1024/gi; + s/ti/*1024*1024*1024*1024/gi; + s/pi/*1024*1024*1024*1024*1024/gi; + s/ei/*1024*1024*1024*1024*1024*1024/gi; + s/zi/*1024*1024*1024*1024*1024*1024*1024/gi; + s/yi/*1024*1024*1024*1024*1024*1024*1024*1024/gi; + s/xi/*1024*1024*1024*1024*1024*1024*1024*1024*1024/gi; + + s/K/*1024/g; + s/M/*1024*1024/g; + s/G/*1024*1024*1024/g; + s/T/*1024*1024*1024*1024/g; + s/P/*1024*1024*1024*1024*1024/g; + s/E/*1024*1024*1024*1024*1024*1024/g; + s/Z/*1024*1024*1024*1024*1024*1024*1024/g; + s/Y/*1024*1024*1024*1024*1024*1024*1024*1024/g; + s/X/*1024*1024*1024*1024*1024*1024*1024*1024*1024/g; + + s/k/*1000/g; + s/m/*1000*1000/g; + s/g/*1000*1000*1000/g; + s/t/*1000*1000*1000*1000/g; + s/p/*1000*1000*1000*1000*1000/g; + s/e/*1000*1000*1000*1000*1000*1000/g; + s/z/*1000*1000*1000*1000*1000*1000*1000/g; + s/y/*1000*1000*1000*1000*1000*1000*1000*1000/g; + s/x/*1000*1000*1000*1000*1000*1000*1000*1000*1000/g; + + $_ = eval $_; + } + return wantarray ? @v : $v[0]; +} + +sub multiply_time_units { + # Evalualte numbers with time units + # s=1, m=60, h=3600, d=86400 + # Input: + # $s = string time units + # Returns: + # $value = int in seconds + my @v = @_; + for(@v) { + defined $_ or next; + if(/[dhms]/i) { + s/s/*1+/gi; + s/m/*60+/gi; + s/h/*3600+/gi; + s/d/*86400+/gi; + $_ = eval $_."0"; + } + } + return wantarray ? @v : $v[0]; +} + +sub seconds_to_time_units { + # Convert seconds into ??d??h??m??s + # s=1, m=60, h=3600, d=86400 + # Input: + # $s = int in seconds + # Returns: + # $str = string time units + my $s = shift; + my $str; + my $d = int($s/86400); + $s -= $d * 86400; + my $h = int($s/3600); + $s -= $h * 3600; + my $m = int($s/60); + $s -= $m * 60; + if($d) { + $str = sprintf("%dd%02dh%02dm%02ds",$d,$h,$m,$s); + } elsif($h) { + $str = sprintf("%dh%02dm%02ds",$h,$m,$s); + } elsif($m) { + $str = sprintf("%dm%02ds",$m,$s); + } else { + $str = sprintf("%ds",$s); + } + return $str; +} + +{ + my ($disk_full_fh, $b8193, $error_printed); + sub exit_if_disk_full { + # Checks if $TMPDIR is full by writing 8kb to a tmpfile + # If the disk is full: Exit immediately. + # Returns: + # N/A + if(not $disk_full_fh) { + $disk_full_fh = ::tmpfile(SUFFIX => ".df"); + $b8193 = "x"x8193; + } + # Linux does not discover if a disk is full if writing <= 8192 + # Tested on: + # bfs btrfs cramfs ext2 ext3 ext4 ext4dev jffs2 jfs minix msdos + # ntfs reiserfs tmpfs ubifs vfat xfs + # TODO this should be tested on different OS similar to this: + # + # doit() { + # sudo mount /dev/ram0 /mnt/loop; sudo chmod 1777 /mnt/loop + # seq 100000 | parallel --tmpdir /mnt/loop/ true & + # seq 6900000 > /mnt/loop/i && echo seq OK + # seq 6980868 > /mnt/loop/i + # seq 10000 > /mnt/loop/ii + # sleep 3 + # sudo umount /mnt/loop/ || sudo umount -l /mnt/loop/ + # echo >&2 + # } + print $disk_full_fh $b8193; + if(not $disk_full_fh + or + tell $disk_full_fh != 8193) { + # On raspbian the disk can be full except for 10 chars. + if(not $error_printed) { + ::error("Output is incomplete.", + "Cannot append to buffer file in $ENV{'TMPDIR'}.", + "Is the disk full?", + "Change \$TMPDIR with --tmpdir or use --compress."); + $error_printed = 1; + } + ::wait_and_exit(255); + } + truncate $disk_full_fh, 0; + seek($disk_full_fh, 0, 0) || die; + } +} + +sub spacefree { + # Remove comments and spaces + # Inputs: + # $spaces = keep 1 space? + # $s = string to remove spaces from + # Returns: + # $s = with spaces removed + my $spaces = shift; + my $s = shift; + $s =~ s/#.*//mg; + if(1 == $spaces) { + $s =~ s/\s+/ /mg; + } elsif(2 == $spaces) { + # Keep newlines + $s =~ s/\n\n+/\n/sg; + $s =~ s/[ \t]+/ /mg; + } else { + $s =~ s/\s//mg; + } + return $s; +} + +{ + my $hostname; + sub hostname { + local $/ = "\n"; + if(not $hostname) { + $hostname = `hostname`; + chomp($hostname); + $hostname ||= "nohostname"; + } + return $hostname; + } +} + +sub which { + # Input: + # @programs = programs to find the path to + # Returns: + # @full_path = full paths to @programs. Nothing if not found + my @which; + ::debug("which", "@_ in $ENV{'PATH'}\n"); + for my $prg (@_) { + push(@which, grep { not -d $_ and -x $_ } + map { $_."/".$prg } split(":",$ENV{'PATH'})); + if($prg =~ m:/:) { + # Including path + push(@which, grep { not -d $_ and -x $_ } $prg); + } + } + return @which; +} + +{ + my ($regexp,$shell,%fakename); + + sub parent_shell { + # Input: + # $pid = pid to see if (grand)*parent is a shell + # Returns: + # $shellpath = path to shell - undef if no shell found + my $pid = shift; + ::debug("init","Parent of $pid\n"); + if(not $regexp) { + # All shells known to mankind + # + # ash bash csh dash fdsh fish fizsh ksh ksh93 mksh pdksh + # posh rbash rc rush rzsh sash sh static-sh tcsh yash zsh + + my @shells = (qw(ash bash bsd-csh csh dash fdsh fish fizsh + ksh ksh93 lksh mksh pdksh posh rbash rc rush rzsh sash sh + static-sh tcsh yash zsh -sh -csh -bash), + '-sh (sh)' # sh on FreeBSD + ); + # Can be formatted as: + # [sh] -sh sh busybox sh -sh (sh) + # /bin/sh /sbin/sh /opt/csw/sh + # But not: foo.sh sshd crash flush pdflush scosh fsflush ssh + $shell = "(?:".join("|",map { "\Q$_\E" } @shells).")"; + $regexp = '^((\[)(-?)('. $shell. ')(\])|(|\S+/|busybox )'. + '(-?)('. $shell. '))( *$| [^(])'; + %fakename = ( + # sh disguises itself as -sh (sh) on FreeBSD + "-sh (sh)" => ["sh"], + # csh and tcsh disguise themselves as -sh/-csh + # E.g.: ssh -tt csh@lo 'ps aux;true' |egrep ^csh + # but sh also disguise itself as -sh + # (When?) + "-sh" => ["sh"], + "-csh" => ["tcsh", "csh"], + # ash disguises itself as -ash + "-ash" => ["ash", "dash", "sh"], + # dash disguises itself as -dash + "-dash" => ["dash", "ash", "sh"], + # bash disguises itself as -bash + "-bash" => ["bash", "sh"], + # ksh disguises itself as -ash + "-ksh" => ["ksh", "sh"], + # zsh disguises itself as -zsh + "-zsh" => ["zsh", "sh"], + ); + } + # if -sh or -csh try readlink /proc/$$/exe + my ($children_of_ref, $parent_of_ref, $name_of_ref) = pid_table(); + my $shellpath; + my $testpid = $pid; + while($testpid) { + if($name_of_ref->{$testpid} =~ /$regexp/o) { + my $shellname = $4 || $8; + my $dash = $3 || $7; + if($shellname eq "sh" and $dash) { + # -sh => csh or sh + if($shellpath = readlink "/proc/$testpid/exe") { + ::debug("init","procpath $shellpath\n"); + if($shellpath =~ m:/$shell$:o) { + ::debug("init", "proc which ".$shellpath." => "); + return $shellpath; + } + } + } + ::debug("init", "which ".$shellname." => "); + $shellpath = (which($shellname,@{$fakename{$shellname}}))[0]; + ::debug("init", "shell path $shellpath\n"); + $shellpath and last; + } + if($testpid == $parent_of_ref->{$testpid}) { + # In Solaris zones, the PPID of the zsched process is itself + last; + } + $testpid = $parent_of_ref->{$testpid}; + } + return $shellpath; + } +} + +{ + my %pid_parentpid_cmd; + + sub pid_table { + # Returns: + # %children_of = { pid -> children of pid } + # %parent_of = { pid -> pid of parent } + # %name_of = { pid -> commandname } + + if(not %pid_parentpid_cmd) { + # Filter for SysV-style `ps` + my $sysv = q( ps -ef | perl -ane '1..1 and /^(.*)CO?MM?A?N?D/ and $s=length $1;). + q(s/^.{$s}//; print "@F[1,2] $_"' ); + # Crazy msys: ' is not accepted on the cmd line, but " are treated as ' + my $msys = q( ps -ef | perl -ane "1..1 and /^(.*)CO?MM?A?N?D/ and $s=length $1;). + q(s/^.{$s}//; print qq{@F[1,2] $_}" ); + # BSD-style `ps` + my $bsd = q(ps -o pid,ppid,command -ax); + %pid_parentpid_cmd = + ( + 'aix' => $sysv, + 'android' => $sysv, + 'cygwin' => $sysv, + 'darwin' => $bsd, + 'dec_osf' => $sysv, + 'dragonfly' => $bsd, + 'freebsd' => $bsd, + 'gnu' => $sysv, + 'hpux' => $sysv, + 'linux' => $sysv, + 'mirbsd' => $bsd, + 'msys' => $msys, + 'MSWin32' => $sysv, + 'netbsd' => $bsd, + 'nto' => $sysv, + 'openbsd' => $bsd, + 'solaris' => $sysv, + 'svr5' => $sysv, + 'syllable' => "echo ps not supported", + ); + } + $pid_parentpid_cmd{$^O} or ::die_bug("pid_parentpid_cmd for $^O missing"); + + my (@pidtable,%parent_of,%children_of,%name_of); + # Table with pid -> children of pid + @pidtable = `$pid_parentpid_cmd{$^O}`; + my $p=$$; + for (@pidtable) { + # must match: 24436 21224 busybox ash + # must match: 24436 21224 <> + # must match: 24436 21224 <> + # or: perl -e 'while($0=" "){}' + if(/^\s*(\S+)\s+(\S+)\s+(\S+.*)/ + or + /^\s*(\S+)\s+(\S+)\s+()$/) { + $parent_of{$1} = $2; + push @{$children_of{$2}}, $1; + $name_of{$1} = $3; + } else { + ::die_bug("pidtable format: $_"); + } + } + return(\%children_of, \%parent_of, \%name_of); + } +} + +sub now { + # Returns time since epoch as in seconds with 3 decimals + # Uses: + # @Global::use + # Returns: + # $time = time now with millisecond accuracy + if(not $Global::use{"Time::HiRes"}) { + if(eval "use Time::HiRes qw ( time );") { + eval "sub TimeHiRestime { return Time::HiRes::time };"; + } else { + eval "sub TimeHiRestime { return time() };"; + } + $Global::use{"Time::HiRes"} = 1; + } + + return (int(TimeHiRestime()*1000))/1000; +} + +sub usleep { + # Sleep this many milliseconds. + # Input: + # $ms = milliseconds to sleep + my $ms = shift; + ::debug("timing",int($ms),"ms "); + select(undef, undef, undef, $ms/1000); +} + +sub reap_usleep { + # Reap dead children. + # If no dead children: Sleep specified amount with exponential backoff + # Input: + # $ms = milliseconds to sleep + # Returns: + # $ms/2+0.001 if children reaped + # $ms*1.1 if no children reaped + my $ms = shift; + if(reaper()) { + if(not $Global::total_completed % 100) { + if($opt::timeout) { + # Force cleaning the timeout queue for every 1000 jobs + # Fixes potential memleak + $Global::timeoutq->process_timeouts(); + } + } + # Sleep exponentially shorter (1/2^n) if a job finished + return $ms/2+0.001; + } else { + if($opt::timeout) { + $Global::timeoutq->process_timeouts(); + } + if($opt::memfree) { + kill_youngster_if_not_enough_mem(); + } + if($opt::limit) { + kill_youngest_if_over_limit(); + } + if($ms > 0.002) { + # When a child dies, wake up from sleep (or select(,,,)) + $SIG{CHLD} = sub { kill "ALRM", $$ }; + usleep($ms); + # --compress needs $SIG{CHLD} unset + $SIG{CHLD} = 'DEFAULT'; + } + exit_if_disk_full(); + if($opt::linebuffer) { + my $something_printed = 0; + if($opt::keeporder) { + for my $job (values %Global::running) { + $something_printed += $job->print_earlier_jobs(); + } + } else { + for my $job (values %Global::running) { + $something_printed += $job->print(); + } + } + if($something_printed) { + $ms = $ms/2+0.001; + } + } + # Sleep exponentially longer (1.1^n) if a job did not finish, + # though at most 1000 ms. + return (($ms < 1000) ? ($ms * 1.1) : ($ms)); + } +} + +sub kill_youngest_if_over_limit { + # Check each $sshlogin we are over limit + # If over limit: kill off the youngest child + # Put the child back in the queue. + # Uses: + # %Global::running + my %jobs_of; + my @sshlogins; + + for my $job (values %Global::running) { + if(not $jobs_of{$job->sshlogin()}) { + push @sshlogins, $job->sshlogin(); + } + push @{$jobs_of{$job->sshlogin()}}, $job; + } + for my $sshlogin (@sshlogins) { + for my $job (sort { $b->seq() <=> $a->seq() } @{$jobs_of{$sshlogin}}) { + if($sshlogin->limit() == 2) { + $job->kill(); + last; + } + } + } +} + +sub kill_youngster_if_not_enough_mem { + # Check each $sshlogin if there is enough mem. + # If less than 50% enough free mem: kill off the youngest child + # Put the child back in the queue. + # Uses: + # %Global::running + my %jobs_of; + my @sshlogins; + + for my $job (values %Global::running) { + if(not $jobs_of{$job->sshlogin()}) { + push @sshlogins, $job->sshlogin(); + } + push @{$jobs_of{$job->sshlogin()}}, $job; + } + for my $sshlogin (@sshlogins) { + for my $job (sort { $b->seq() <=> $a->seq() } @{$jobs_of{$sshlogin}}) { + if($sshlogin->memfree() < $opt::memfree * 0.5) { + ::debug("mem","\n",map { $_->seq()." " } + (sort { $b->seq() <=> $a->seq() } + @{$jobs_of{$sshlogin}})); + ::debug("mem","\n", $job->seq(), "killed ", + $sshlogin->memfree()," < ",$opt::memfree * 0.5); + $job->kill(); + $sshlogin->memfree_recompute(); + } else { + last; + } + } + ::debug("mem","Free mem OK ", + $sshlogin->memfree()," > ",$opt::memfree * 0.5); + } +} + + +sub __DEBUGGING__ {} + + +sub debug { + # Uses: + # $Global::debug + # %Global::fd + # Returns: N/A + $Global::debug or return; + @_ = grep { defined $_ ? $_ : "" } @_; + if($Global::debug eq "all" or $Global::debug eq $_[0]) { + if($Global::fd{1}) { + # Original stdout was saved + my $stdout = $Global::fd{1}; + print $stdout @_[1..$#_]; + } else { + print @_[1..$#_]; + } + } +} + +sub my_memory_usage { + # Returns: + # memory usage if found + # 0 otherwise + use strict; + use FileHandle; + + local $/ = "\n"; + my $pid = $$; + if(-e "/proc/$pid/stat") { + my $fh = FileHandle->new("; + chomp $data; + $fh->close; + + my @procinfo = split(/\s+/,$data); + + return undef_as_zero($procinfo[22]); + } else { + return 0; + } +} + +sub my_size { + # Returns: + # $size = size of object if Devel::Size is installed + # -1 otherwise + my @size_this = (@_); + eval "use Devel::Size qw(size total_size)"; + if ($@) { + return -1; + } else { + return total_size(@_); + } +} + +sub my_dump { + # Returns: + # ascii expression of object if Data::Dump(er) is installed + # error code otherwise + my @dump_this = (@_); + eval "use Data::Dump qw(dump);"; + if ($@) { + # Data::Dump not installed + eval "use Data::Dumper;"; + if ($@) { + my $err = "Neither Data::Dump nor Data::Dumper is installed\n". + "Not dumping output\n"; + ::status($err); + return $err; + } else { + return Dumper(@dump_this); + } + } else { + # Create a dummy Data::Dump:dump as Hans Schou sometimes has + # it undefined + eval "sub Data::Dump:dump {}"; + eval "use Data::Dump qw(dump);"; + return (Data::Dump::dump(@dump_this)); + } +} + +sub my_croak { + eval "use Carp; 1"; + $Carp::Verbose = 1; + croak(@_); +} + +sub my_carp { + eval "use Carp; 1"; + $Carp::Verbose = 1; + carp(@_); +} + + +sub __OBJECT_ORIENTED_PARTS__ {} + + +package SSHLogin; + +sub new { + my $class = shift; + my $sshlogin_string = shift; + my $ncpus; + my %hostgroups; + # SSHLogins can have these formats: + # @grp+grp/ncpu//usr/bin/ssh user@server + # ncpu//usr/bin/ssh user@server + # /usr/bin/ssh user@server + # user@server + # ncpu/user@server + # @grp+grp/user@server + if($sshlogin_string =~ s:^\@([^/]+)/?::) { + # Look for SSHLogin hostgroups + %hostgroups = map { $_ => 1 } split(/\+/, $1); + } + # An SSHLogin is always in the hostgroup of its "numcpu/host" + $hostgroups{$sshlogin_string} = 1; + if ($sshlogin_string =~ s:^(\d+)/::) { + # Override default autodetected ncpus unless missing + $ncpus = $1; + } + my $string = $sshlogin_string; + # An SSHLogin is always in the hostgroup of its $string-name + $hostgroups{$string} = 1; + @Global::hostgroups{keys %hostgroups} = values %hostgroups; + my @unget = (); + my $no_slash_string = $string; + $no_slash_string =~ s/[^-a-z0-9:]/_/gi; + return bless { + 'string' => $string, + 'jobs_running' => 0, + 'jobs_completed' => 0, + 'maxlength' => undef, + 'max_jobs_running' => undef, + 'orig_max_jobs_running' => undef, + 'ncpus' => $ncpus, + 'hostgroups' => \%hostgroups, + 'sshcommand' => undef, + 'serverlogin' => undef, + 'control_path_dir' => undef, + 'control_path' => undef, + 'time_to_login' => undef, + 'last_login_at' => undef, + 'loadavg_file' => $Global::cache_dir . "/tmp/sshlogin/" . + $no_slash_string . "/loadavg", + 'loadavg' => undef, + 'last_loadavg_update' => 0, + 'swap_activity_file' => $Global::cache_dir . "/tmp/sshlogin/" . + $no_slash_string . "/swap_activity", + 'swap_activity' => undef, + }, ref($class) || $class; +} + +sub DESTROY { + my $self = shift; + # Remove temporary files if they are created. + ::rm($self->{'loadavg_file'}); + ::rm($self->{'swap_activity_file'}); +} + +sub string { + my $self = shift; + return $self->{'string'}; +} + +sub jobs_running { + my $self = shift; + return ($self->{'jobs_running'} || "0"); +} + +sub inc_jobs_running { + my $self = shift; + $self->{'jobs_running'}++; +} + +sub dec_jobs_running { + my $self = shift; + $self->{'jobs_running'}--; +} + +sub set_maxlength { + my $self = shift; + $self->{'maxlength'} = shift; +} + +sub maxlength { + my $self = shift; + return $self->{'maxlength'}; +} + +sub jobs_completed { + my $self = shift; + return $self->{'jobs_completed'}; +} + +sub in_hostgroups { + # Input: + # @hostgroups = the hostgroups to look for + # Returns: + # true if intersection of @hostgroups and the hostgroups of this + # SSHLogin is non-empty + my $self = shift; + return grep { defined $self->{'hostgroups'}{$_} } @_; +} + +sub hostgroups { + my $self = shift; + return keys %{$self->{'hostgroups'}}; +} + +sub inc_jobs_completed { + my $self = shift; + $self->{'jobs_completed'}++; + $Global::total_completed++; +} + +sub set_max_jobs_running { + my $self = shift; + if(defined $self->{'max_jobs_running'}) { + $Global::max_jobs_running -= $self->{'max_jobs_running'}; + } + $self->{'max_jobs_running'} = shift; + if(defined $self->{'max_jobs_running'}) { + # max_jobs_running could be resat if -j is a changed file + $Global::max_jobs_running += $self->{'max_jobs_running'}; + } + # Initialize orig to the first non-zero value that comes around + $self->{'orig_max_jobs_running'} ||= $self->{'max_jobs_running'}; +} + +sub memfree { + # Returns: + # $memfree in bytes + my $self = shift; + $self->memfree_recompute(); + return (not defined $self->{'memfree'} or $self->{'memfree'}) +} + +sub memfree_recompute { + my $self = shift; + my $script = memfreescript(); + + # TODO add sshlogin and backgrounding + # Run the script twice if it gives 0 (typically intermittent error) + $self->{'memfree'} = ::qqx($script) || ::qqx($script); + if(not $self->{'memfree'}) { + ::die_bug("Less than 1 byte free"); + } + #::debug("mem","New free:",$self->{'memfree'}," "); +} + +{ + my $script; + + sub memfreescript { + # Returns: + # shellscript for giving available memory in bytes + if(not $script) { + my %script_of = ( + # /proc/meminfo + # MemFree: 7012 kB + # Buffers: 19876 kB + # Cached: 431192 kB + # SwapCached: 0 kB + "linux" => + q[ print 1024 * qx{ ]. + q[ awk '/^((Swap)?Cached|MemFree|Buffers):/ ]. + q[ { sum += \$2} END { print sum }' ]. + q[ /proc/meminfo } ], + # $ vmstat 1 1 + # procs memory page faults cpu + # r b w avm free re at pi po fr de sr in sy cs us sy id + # 1 0 0 242793 389737 5 1 0 0 0 0 0 107 978 60 1 1 99 + "hpux" => + q[ print (((reverse `vmstat 1 1`)[0] ]. + q[ =~ /(?:\d+\D+){4}(\d+)/)[0]*1024) ], + # $ vmstat 1 2 + # kthr memory page disk faults cpu + # r b w swap free re mf pi po fr de sr s3 s4 -- -- in sy cs us sy id + # 0 0 0 6496720 5170320 68 260 8 2 1 0 0 -0 3 0 0 309 1371 255 1 2 97 + # 0 0 0 6434088 5072656 7 15 8 0 0 0 0 0 261 0 0 1889 1899 3222 0 8 92 + # + # The second free value is correct + "solaris" => + q[ print (((reverse `vmstat 1 2`)[0] ]. + q[ =~ /(?:\d+\D+){4}(\d+)/)[0]*1024) ], + "freebsd" => q{ + for(qx{/sbin/sysctl -a}) { + if (/^([^:]+):\s+(.+)\s*$/s) { + $sysctl->{$1} = $2; + } + } + print $sysctl->{"hw.pagesize"} * + ($sysctl->{"vm.stats.vm.v_cache_count"} + + $sysctl->{"vm.stats.vm.v_inactive_count"} + + $sysctl->{"vm.stats.vm.v_free_count"}); + }, + # Mach Virtual Memory Statistics: (page size of 4096 bytes) + # Pages free: 198061. + # Pages active: 159701. + # Pages inactive: 47378. + # Pages speculative: 29707. + # Pages wired down: 89231. + # "Translation faults": 928901425. + # Pages copy-on-write: 156988239. + # Pages zero filled: 271267894. + # Pages reactivated: 48895. + # Pageins: 1798068. + # Pageouts: 257. + # Object cache: 6603 hits of 1713223 lookups (0% hit rate) + 'darwin' => + q[ $vm = `vm_stat`; + print (($vm =~ /page size of (\d+)/)[0] * + (($vm =~ /Pages free:\s+(\d+)/)[0] + + ($vm =~ /Pages inactive:\s+(\d+)/)[0])); + ], + ); + my $perlscript = ""; + # Make a perl script that detects the OS ($^O) and runs + # the appropriate command + for my $os (keys %script_of) { + $perlscript .= 'if($^O eq "'.$os.'") { '.$script_of{$os}.'}'; + } + $perlscript =~ s/[\t\n ]+/ /g; + $script = "perl -e " . ::shell_quote_scalar($perlscript); + } + return $script; + } +} + +sub limit { + # Returns: + # 0 = Below limit. Start another job. + # 1 = Over limit. Start no jobs. + # 2 = Kill youngest job + my $self = shift; + + if(not defined $self->{'limitscript'}) { + my %limitscripts = + ("io" => q! + io() { + limit=$1; + io_file=$2; + # Do the measurement in the background + (tmp=$(tempfile); + LANG=C iostat -x 1 2 > $tmp; + mv $tmp $io_file) & + perl -e '-e $ARGV[0] or exit(1); + for(reverse <>) { + /Device:/ and last; + /(\S+)$/ and $max = $max > $1 ? $max : $1; } + exit ($max < '$limit')' $io_file; + }; + export -f io; + io %s %s + !, + "mem" => q! + mem() { + limit=$1; + awk '/^((Swap)?Cached|MemFree|Buffers):/{ sum += $2} + END { + if (sum*1024 < '$limit'/2) { exit 2; } + else { exit (sum*1024 < '$limit') } + }' /proc/meminfo; + }; + export -f mem; + mem %s; + !, + "load" => q! + load() { + limit=$1; + ps ax -o state,command | + grep -E '^[DOR].[^[]' | + wc -l | + perl -ne 'exit ('$limit' < $_)'; + }; + export -f load; + load %s; + !, + ); + my ($cmd,@args) = split /\s+/,$opt::limit; + if($limitscripts{$cmd}) { + my $tmpfile = ::tmpname("parlmt"); + ++$Global::unlink{$tmpfile}; + $self->{'limitscript'} = + ::spacefree(1, sprintf($limitscripts{$cmd}, + ::multiply_binary_prefix(@args),$tmpfile)); + } else { + $self->{'limitscript'} = $opt::limit; + } + } + + my %env = %ENV; + local %ENV = %env; + $ENV{'SSHLOGIN'} = $self->string(); + system($Global::shell,"-c",$self->{'limitscript'}); + ::debug("limit","limit `".$self->{'limitscript'}."` result ".($?>>8)."\n"); + return $?>>8; +} + + +sub swapping { + my $self = shift; + my $swapping = $self->swap_activity(); + return (not defined $swapping or $swapping) +} + +sub swap_activity { + # If the currently known swap activity is too old: + # Recompute a new one in the background + # Returns: + # last swap activity computed + my $self = shift; + # Should we update the swap_activity file? + my $update_swap_activity_file = 0; + if(-r $self->{'swap_activity_file'}) { + open(my $swap_fh, "<", $self->{'swap_activity_file'}) || ::die_bug("swap_activity_file-r"); + my $swap_out = <$swap_fh>; + close $swap_fh; + if($swap_out =~ /^(\d+)$/) { + $self->{'swap_activity'} = $1; + ::debug("swap", "New swap_activity: ", $self->{'swap_activity'}); + } + ::debug("swap", "Last update: ", $self->{'last_swap_activity_update'}); + if(time - $self->{'last_swap_activity_update'} > 10) { + # last swap activity update was started 10 seconds ago + ::debug("swap", "Older than 10 sec: ", $self->{'swap_activity_file'}); + $update_swap_activity_file = 1; + } + } else { + ::debug("swap", "No swap_activity file: ", $self->{'swap_activity_file'}); + $self->{'swap_activity'} = undef; + $update_swap_activity_file = 1; + } + if($update_swap_activity_file) { + ::debug("swap", "Updating swap_activity file ", $self->{'swap_activity_file'}); + $self->{'last_swap_activity_update'} = time; + my $dir = ::dirname($self->{'swap_activity_file'}); + -d $dir or eval { File::Path::mkpath($dir); }; + my $swap_activity; + $swap_activity = swapactivityscript(); + if($self->{'string'} ne ":") { + $swap_activity = $self->sshcommand() . " " . $self->serverlogin() . " " . + ::shell_quote_scalar($swap_activity); + } + # Run swap_activity measuring. + # As the command can take long to run if run remote + # save it to a tmp file before moving it to the correct file + my $file = $self->{'swap_activity_file'}; + my ($dummy_fh, $tmpfile) = ::tmpfile(SUFFIX => ".swp"); + ::debug("swap", "\n", $swap_activity, "\n"); + ::qqx("($swap_activity > $tmpfile && mv $tmpfile $file || rm $tmpfile &)"); + } + return $self->{'swap_activity'}; +} + +{ + my $script; + + sub swapactivityscript { + # Returns: + # shellscript for detecting swap activity + # + # arguments for vmstat are OS dependant + # swap_in and swap_out are in different columns depending on OS + # + if(not $script) { + my %vmstat = ( + # linux: $7*$8 + # $ vmstat 1 2 + # procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- + # r b swpd free buff cache si so bi bo in cs us sy id wa + # 5 0 51208 1701096 198012 18857888 0 0 37 153 28 19 56 11 33 1 + # 3 0 51208 1701288 198012 18857972 0 0 0 0 3638 10412 15 3 82 0 + 'linux' => ['vmstat 1 2 | tail -n1', '$7*$8'], + + # solaris: $6*$7 + # $ vmstat -S 1 2 + # kthr memory page disk faults cpu + # r b w swap free si so pi po fr de sr s3 s4 -- -- in sy cs us sy id + # 0 0 0 4628952 3208408 0 0 3 1 1 0 0 -0 2 0 0 263 613 246 1 2 97 + # 0 0 0 4552504 3166360 0 0 0 0 0 0 0 0 0 0 0 246 213 240 1 1 98 + 'solaris' => ['vmstat -S 1 2 | tail -1', '$6*$7'], + + # darwin (macosx): $21*$22 + # $ vm_stat -c 2 1 + # Mach Virtual Memory Statistics: (page size of 4096 bytes) + # free active specul inactive throttle wired prgable faults copy 0fill reactive purged file-backed anonymous cmprssed cmprssor dcomprs comprs pageins pageout swapins swapouts + # 346306 829050 74871 606027 0 240231 90367 544858K 62343596 270837K 14178 415070 570102 939846 356 370 116 922 4019813 4 0 0 + # 345740 830383 74875 606031 0 239234 90369 2696 359 553 0 0 570110 941179 356 370 0 0 0 0 0 0 + 'darwin' => ['vm_stat -c 2 1 | tail -n1', '$21*$22'], + + # ultrix: $12*$13 + # $ vmstat -S 1 2 + # procs faults cpu memory page disk + # r b w in sy cs us sy id avm fre si so pi po fr de sr s0 + # 1 0 0 4 23 2 3 0 97 7743 217k 0 0 0 0 0 0 0 0 + # 1 0 0 6 40 8 0 1 99 7743 217k 0 0 3 0 0 0 0 0 + 'ultrix' => ['vmstat -S 1 2 | tail -1', '$12*$13'], + + # aix: $6*$7 + # $ vmstat 1 2 + # System configuration: lcpu=1 mem=2048MB + # + # kthr memory page faults cpu + # ----- ----------- ------------------------ ------------ ----------- + # r b avm fre re pi po fr sr cy in sy cs us sy id wa + # 0 0 333933 241803 0 0 0 0 0 0 10 143 90 0 0 99 0 + # 0 0 334125 241569 0 0 0 0 0 0 37 5368 184 0 9 86 5 + 'aix' => ['vmstat 1 2 | tail -n1', '$6*$7'], + + # freebsd: $8*$9 + # $ vmstat -H 1 2 + # procs memory page disks faults cpu + # r b w avm fre flt re pi po fr sr ad0 ad1 in sy cs us sy id + # 1 0 0 596716 19560 32 0 0 0 33 8 0 0 11 220 277 0 0 99 + # 0 0 0 596716 19560 2 0 0 0 0 0 0 0 11 144 263 0 1 99 + 'freebsd' => ['vmstat -H 1 2 | tail -n1', '$8*$9'], + + # mirbsd: $8*$9 + # $ vmstat 1 2 + # procs memory page disks traps cpu + # r b w avm fre flt re pi po fr sr wd0 cd0 int sys cs us sy id + # 0 0 0 25776 164968 34 0 0 0 0 0 0 0 230 259 38 4 0 96 + # 0 0 0 25776 164968 24 0 0 0 0 0 0 0 237 275 37 0 0 100 + 'mirbsd' => ['vmstat 1 2 | tail -n1', '$8*$9'], + + # netbsd: $7*$8 + # $ vmstat 1 2 + # procs memory page disks faults cpu + # r b avm fre flt re pi po fr sr w0 w1 in sy cs us sy id + # 0 0 138452 6012 54 0 0 0 1 2 3 0 4 100 23 0 0 100 + # 0 0 138456 6008 1 0 0 0 0 0 0 0 7 26 19 0 0 100 + 'netbsd' => ['vmstat 1 2 | tail -n1', '$7*$8'], + + # openbsd: $8*$9 + # $ vmstat 1 2 + # procs memory page disks traps cpu + # r b w avm fre flt re pi po fr sr wd0 wd1 int sys cs us sy id + # 0 0 0 76596 109944 73 0 0 0 0 0 0 1 5 259 22 0 1 99 + # 0 0 0 76604 109936 24 0 0 0 0 0 0 0 7 114 20 0 1 99 + 'openbsd' => ['vmstat 1 2 | tail -n1', '$8*$9'], + + # hpux: $8*$9 + # $ vmstat 1 2 + # procs memory page faults cpu + # r b w avm free re at pi po fr de sr in sy cs us sy id + # 1 0 0 247211 216476 4 1 0 0 0 0 0 102 73005 54 6 11 83 + # 1 0 0 247211 216421 43 9 0 0 0 0 0 144 1675 96 25269512791222387000 25269512791222387000 105 + 'hpux' => ['vmstat 1 2 | tail -n1', '$8*$9'], + + # dec_osf (tru64): $11*$12 + # $ vmstat 1 2 + # Virtual Memory Statistics: (pagesize = 8192) + # procs memory pages intr cpu + # r w u act free wire fault cow zero react pin pout in sy cs us sy id + # 3 181 36 51K 1895 8696 348M 59M 122M 259 79M 0 5 218 302 4 1 94 + # 3 181 36 51K 1893 8696 3 15 21 0 28 0 4 81 321 1 1 98 + 'dec_osf' => ['vmstat 1 2 | tail -n1', '$11*$12'], + + # gnu (hurd): $7*$8 + # $ vmstat -k 1 2 + # (pagesize: 4, size: 512288, swap size: 894972) + # free actv inact wired zeroed react pgins pgouts pfaults cowpfs hrat caobj cache swfree + # 371940 30844 89228 20276 298348 0 48192 19016 756105 99808 98% 876 20628 894972 + # 371940 30844 89228 20276 +0 +0 +0 +0 +42 +2 98% 876 20628 894972 + 'gnu' => ['vmstat -k 1 2 | tail -n1', '$7*$8'], + + # -nto (qnx has no swap) + #-irix + #-svr5 (scosysv) + ); + my $perlscript = ""; + # Make a perl script that detects the OS ($^O) and runs + # the appropriate vmstat command + for my $os (keys %vmstat) { + $vmstat{$os}[1] =~ s/\$/\\\\\\\$/g; # $ => \\\$ + $perlscript .= 'if($^O eq "'.$os.'") { print `'.$vmstat{$os}[0].' | awk "{print ' . + $vmstat{$os}[1] . '}"` }'; + } + $script = "perl -e " . ::shell_quote_scalar($perlscript); + } + return $script; + } +} + +sub too_fast_remote_login { + my $self = shift; + if($self->{'last_login_at'} and $self->{'time_to_login'}) { + # sshd normally allows 10 simultaneous logins + # A login takes time_to_login + # So time_to_login/5 should be safe + # If now <= last_login + time_to_login/5: Then it is too soon. + my $too_fast = (::now() <= $self->{'last_login_at'} + + $self->{'time_to_login'}/5); + ::debug("run", "Too fast? $too_fast "); + return $too_fast; + } else { + # No logins so far (or time_to_login not computed): it is not too fast + return 0; + } +} + +sub last_login_at { + my $self = shift; + return $self->{'last_login_at'}; +} + +sub set_last_login_at { + my $self = shift; + $self->{'last_login_at'} = shift; +} + +sub loadavg_too_high { + my $self = shift; + my $loadavg = $self->loadavg(); + return (not defined $loadavg or + $loadavg > $self->max_loadavg()); +} + +{ + my $cmd; + sub loadavg_cmd { + if(not $cmd) { + # aix => "ps -ae -o state,command" # state wrong + # bsd => "ps ax -o state,command" + # sysv => "ps -ef -o s -o comm" + # cygwin => perl -ne 'close STDERR; /Name/ and print"\n"; \ + # /(Name|Pid|Ppid|State):\s+(\S+)/ and print "$2\t";' /proc/*/status | + # awk '{print $2,$1}' + # dec_osf => bsd + # dragonfly => bsd + # freebsd => bsd + # gnu => bsd + # hpux => ps -el|awk '{print $2,$14,$15}' + # irix => ps -ef -o state -o comm + # linux => bsd + # minix => ps el|awk '{print \$1,\$11}' + # mirbsd => bsd + # netbsd => bsd + # openbsd => bsd + # solaris => sysv + # svr5 => sysv + # ultrix => ps -ax | awk '{print $3,$5}' + # unixware => ps -el|awk '{print $2,$14,$15}' + my $ps = ::spacefree(1,q{ + $sysv="ps -ef -o s -o comm"; + $sysv2="ps -ef -o state -o comm"; + $bsd="ps ax -o state,command"; + # Treat threads as processes + $bsd2="ps axH -o state,command"; + $psel="ps -el|awk '{ print \$2,\$14,\$15 }'"; + $cygwin=q{ perl -ne 'close STDERR; /Name/ and print"\n"; + /(Name|Pid|Ppid|State):\s+(\S+)/ and print "$2\t";' /proc/*/status | + awk '{print $2,$1}' }; + $dummy="echo S COMMAND;echo R dummy"; + %ps=( + # TODO Find better code for AIX + 'aix' => "uptime", + 'cygwin' => $cygwin, + 'darwin' => $bsd, + 'dec_osf' => $sysv2, + 'dragonfly' => $bsd, + 'freebsd' => $bsd2, + 'gnu' => $bsd, + 'hpux' => $psel, + 'irix' => $sysv2, + 'linux' => $bsd2, + 'minix' => "ps el|awk '{print \$1,\$11}'", + 'mirbsd' => $bsd, + 'msys' => $cygwin, + 'MSWin32' => $sysv, + 'netbsd' => $bsd, + 'nto' => $dummy, + 'openbsd' => $bsd, + 'solaris' => $sysv, + 'svr5' => $psel, + 'ultrix' => "ps -ax | awk '{print \$3,\$5}'", + ); + print `$ps{$^O}`; + }); + # The command is too long for csh, so base64_wrap the command + $cmd = Job::base64_wrap($ps); + } + return $cmd; + } +} + + +sub loadavg { + # If the currently know loadavg is too old: + # Recompute a new one in the background + # The load average is computed as the number of processes waiting for disk + # or CPU right now. So it is the server load this instant and not averaged over + # several minutes. This is needed so GNU Parallel will at most start one job + # that will push the load over the limit. + # + # Returns: + # $last_loadavg = last load average computed (undef if none) + my $self = shift; + # Should we update the loadavg file? + my $update_loadavg_file = 0; + if(open(my $load_fh, "<", $self->{'loadavg_file'})) { + local $/; # $/ = undef => slurp whole file + my $load_out = <$load_fh>; + close $load_fh; + if($load_out =~ /\S/) { + # Content can be empty if ~/ is on NFS + # due to reading being non-atomic. + # + # Count lines starting with D,O,R but command does not start with [ + my $load =()= ($load_out=~/(^\s?[DOR]\S* +(?=[^\[])\S)/gm); + if($load > 0) { + # load is overestimated by 1 + $self->{'loadavg'} = $load - 1; + ::debug("load", "New loadavg: ", $self->{'loadavg'},"\n"); + } elsif ($load_out=~/average: (\d+.\d+)/) { + # AIX does not support instant load average + # 04:11AM up 21 days, 12:55, 1 user, load average: 1.85, 1.57, 1.55 + $self->{'loadavg'} = $1; + } else { + ::die_bug("loadavg_invalid_content: " . + $self->{'loadavg_file'} . "\n$load_out"); + } + } + $update_loadavg_file = 1; + } else { + ::debug("load", "No loadavg file: ", $self->{'loadavg_file'}); + $self->{'loadavg'} = undef; + $update_loadavg_file = 1; + } + if($update_loadavg_file) { + ::debug("load", "Updating loadavg file", $self->{'loadavg_file'}, "\n"); + $self->{'last_loadavg_update'} = time; + my $dir = ::dirname($self->{'swap_activity_file'}); + -d $dir or eval { File::Path::mkpath($dir); }; + -w $dir or ::die_bug("Cannot write to $dir"); + my $cmd = ""; + if($self->{'string'} ne ":") { + $cmd = $self->sshcommand() . " " . $self->serverlogin() . " " . + ::shell_quote_scalar(loadavg_cmd()); + } else { + $cmd .= loadavg_cmd(); + } + # As the command can take long to run if run remote + # save it to a tmp file before moving it to the correct file + ::debug("load", "Cmd: ", $cmd,"\n"); + my $file = $self->{'loadavg_file'}; + # tmpfile on same filesystem as $file + my $tmpfile = $file.$$; + ::qqx("($cmd > $tmpfile && mv $tmpfile $file || rm $tmpfile & )"); + } + return $self->{'loadavg'}; +} + +sub max_loadavg { + my $self = shift; + # If --load is a file it might be changed + if($Global::max_load_file) { + my $mtime = (stat($Global::max_load_file))[9]; + if($mtime > $Global::max_load_file_last_mod) { + $Global::max_load_file_last_mod = $mtime; + for my $sshlogin (values %Global::host) { + $sshlogin->set_max_loadavg(undef); + } + } + } + if(not defined $self->{'max_loadavg'}) { + $self->{'max_loadavg'} = + $self->compute_max_loadavg($opt::load); + } + ::debug("load", "max_loadavg: ", $self->string(), " ", $self->{'max_loadavg'}); + return $self->{'max_loadavg'}; +} + +sub set_max_loadavg { + my $self = shift; + $self->{'max_loadavg'} = shift; +} + +sub compute_max_loadavg { + # Parse the max loadaverage that the user asked for using --load + # Returns: + # max loadaverage + my $self = shift; + my $loadspec = shift; + my $load; + if(defined $loadspec) { + if($loadspec =~ /^\+(\d+)$/) { + # E.g. --load +2 + my $j = $1; + $load = + $self->ncpus() + $j; + } elsif ($loadspec =~ /^-(\d+)$/) { + # E.g. --load -2 + my $j = $1; + $load = + $self->ncpus() - $j; + } elsif ($loadspec =~ /^(\d+)\%$/) { + my $j = $1; + $load = + $self->ncpus() * $j / 100; + } elsif ($loadspec =~ /^(\d+(\.\d+)?)$/) { + $load = $1; + } elsif (-f $loadspec) { + $Global::max_load_file = $loadspec; + $Global::max_load_file_last_mod = (stat($Global::max_load_file))[9]; + if(open(my $in_fh, "<", $Global::max_load_file)) { + my $opt_load_file = join("",<$in_fh>); + close $in_fh; + $load = $self->compute_max_loadavg($opt_load_file); + } else { + ::error("Cannot open $loadspec."); + ::wait_and_exit(255); + } + } else { + ::error("Parsing of --load failed."); + ::die_usage(); + } + if($load < 0.01) { + $load = 0.01; + } + } + return $load; +} + +sub time_to_login { + my $self = shift; + return $self->{'time_to_login'}; +} + +sub set_time_to_login { + my $self = shift; + $self->{'time_to_login'} = shift; +} + +sub max_jobs_running { + my $self = shift; + if(not defined $self->{'max_jobs_running'}) { + my $nproc = $self->compute_number_of_processes($opt::jobs); + $self->set_max_jobs_running($nproc); + } + return $self->{'max_jobs_running'}; +} + +sub orig_max_jobs_running { + my $self = shift; + return $self->{'orig_max_jobs_running'}; +} + +sub compute_number_of_processes { + # Number of processes wanted and limited by system resources + # Returns: + # Number of processes + my $self = shift; + my $opt_P = shift; + my $wanted_processes = $self->user_requested_processes($opt_P); + if(not defined $wanted_processes) { + $wanted_processes = $Global::default_simultaneous_sshlogins; + } + ::debug("load", "Wanted procs: $wanted_processes\n"); + my $system_limit = + $self->processes_available_by_system_limit($wanted_processes); + ::debug("load", "Limited to procs: $system_limit\n"); + return $system_limit; +} + +{ + my @children; + my $max_system_proc_reached; + my $more_filehandles; + my %fh; + my $tmpfhname; + my $count_jobs_already_read; + my @jobs; + my $job; + my @args; + my $arg; + + sub reserve_filehandles { + # Reserves filehandle + my $n = shift; + for (1..$n) { + $more_filehandles &&= open($fh{$tmpfhname++}, "<", "/dev/null"); + } + } + + sub reserve_process { + # Spawn a dummy process + my $child; + if($child = fork()) { + push @children, $child; + $Global::unkilled_children{$child} = 1; + } elsif(defined $child) { + # This is the child + # The child takes one process slot + # It will be killed later + $SIG{'TERM'} = $Global::original_sig{'TERM'}; + if($^O eq "cygwin" or $^O eq "msys") { + # The exec does not work on Cygwin + sleep 10101010; + } else { + # 'exec sleep' takes less RAM than sleeping in perl + exec 'sleep', 10101; + } + exit(0); + } else { + # Failed to spawn + $max_system_proc_reached = 1; + } + } + + sub get_args_or_jobs { + # Get an arg or a job (depending on mode) + if($Global::semaphore or ($opt::pipe and not $opt::tee)) { + # Skip: No need to get args + return 1; + } elsif(defined $opt::retries and $count_jobs_already_read) { + # For retries we may need to run all jobs on this sshlogin + # so include the already read jobs for this sshlogin + $count_jobs_already_read--; + return 1; + } else { + if($opt::X or $opt::m) { + # The arguments may have to be re-spread over several jobslots + # So pessimistically only read one arg per jobslot + # instead of a full commandline + if($Global::JobQueue->{'commandlinequeue'}->{'arg_queue'}->empty()) { + if($Global::JobQueue->empty()) { + return 0; + } else { + $job = $Global::JobQueue->get(); + push(@jobs, $job); + return 1; + } + } else { + $arg = $Global::JobQueue->{'commandlinequeue'}->{'arg_queue'}->get(); + push(@args, $arg); + return 1; + } + } else { + # If there are no more command lines, then we have a process + # per command line, so no need to go further + if($Global::JobQueue->empty()) { + return 0; + } else { + $job = $Global::JobQueue->get(); + push(@jobs, $job); + return 1; + } + } + } + } + + sub cleanup { + # Cleanup: Close the files + for (values %fh) { close $_ } + # Cleanup: Kill the children + for my $pid (@children) { + kill 9, $pid; + waitpid($pid,0); + delete $Global::unkilled_children{$pid}; + } + # Cleanup: Unget the command_lines or the @args + $Global::JobQueue->{'commandlinequeue'}->{'arg_queue'}->unget(@args); + @args = (); + $Global::JobQueue->unget(@jobs); + @jobs = (); + } + + sub processes_available_by_system_limit { + # If the wanted number of processes is bigger than the system limits: + # Limit them to the system limits + # Limits are: File handles, number of input lines, processes, + # and taking > 1 second to spawn 10 extra processes + # Returns: + # Number of processes + my $self = shift; + my $wanted_processes = shift; + my $system_limit = 0; + my $slow_spawning_warning_printed = 0; + my $time = time; + $more_filehandles = 1; + $tmpfhname = "TmpFhNamE"; + + # perl uses 7 filehandles for something? + # parallel uses 1 for memory_usage + # parallel uses 4 for ? + reserve_filehandles(12); + # Two processes for load avg and ? + reserve_process(); + reserve_process(); + + # For --retries count also jobs already run + $count_jobs_already_read = $Global::JobQueue->next_seq(); + my $wait_time_for_getting_args = 0; + my $start_time = time; + while(1) { + $system_limit >= $wanted_processes and last; + not $more_filehandles and last; + $max_system_proc_reached and last; + + my $before_getting_arg = time; + if(!$Global::dummy_jobs) { + get_args_or_jobs() or last; + } + $wait_time_for_getting_args += time - $before_getting_arg; + $system_limit++; + + # Every simultaneous process uses 2 filehandles to write to + # and 2 filehandles to read from + reserve_filehandles(4); + + # System process limit + reserve_process(); + + my $forktime = time - $time - $wait_time_for_getting_args; + ::debug("run", "Time to fork $system_limit procs: $wait_time_for_getting_args ", + $forktime, + " (processes so far: ", $system_limit,")\n"); + if($system_limit > 10 and + $forktime > 1 and + $forktime > $system_limit * 0.01 + and not $slow_spawning_warning_printed) { + # It took more than 0.01 second to fork a processes on avg. + # Give the user a warning. He can press Ctrl-C if this + # sucks. + ::warning("Starting $system_limit processes took > $forktime sec.", + "Consider adjusting -j. Press CTRL-C to stop."); + $slow_spawning_warning_printed = 1; + } + } + cleanup(); + + if($system_limit < $wanted_processes) { + # The system_limit is less than the wanted_processes + if($system_limit < 1 and not $Global::JobQueue->empty()) { + ::warning("Cannot spawn any jobs. ". + "Raising ulimit -u or 'nproc' in /etc/security/limits.conf", + "or /proc/sys/kernel/pid_max may help."); + ::wait_and_exit(255); + } + if(not $more_filehandles) { + ::warning("Only enough file handles to run ". + $system_limit. " jobs in parallel.", + "Running 'parallel -j0 -N $system_limit --pipe parallel -j0' or", + "raising 'ulimit -n' or 'nofile' in /etc/security/limits.conf", + "or /proc/sys/fs/file-max may help."); + } + if($max_system_proc_reached) { + ::warning("Only enough available processes to run ". + $system_limit. " jobs in parallel.", + "Raising ulimit -u or /etc/security/limits.conf ", + "or /proc/sys/kernel/pid_max may help."); + } + } + if($] == 5.008008 and $system_limit > 1000) { + # https://savannah.gnu.org/bugs/?36942 + $system_limit = 1000; + } + if($Global::JobQueue->empty()) { + $system_limit ||= 1; + } + if($self->string() ne ":" and + $system_limit > $Global::default_simultaneous_sshlogins) { + $system_limit = + $self->simultaneous_sshlogin_limit($system_limit); + } + return $system_limit; + } +} + +sub simultaneous_sshlogin_limit { + # Test by logging in wanted number of times simultaneously + # Returns: + # min($wanted_processes,$working_simultaneous_ssh_logins-1) + my $self = shift; + my $wanted_processes = shift; + if($self->{'time_to_login'}) { + return $wanted_processes; + } + + # Try twice because it guesses wrong sometimes + # Choose the minimal + my $ssh_limit = + ::min($self->simultaneous_sshlogin($wanted_processes), + $self->simultaneous_sshlogin($wanted_processes)); + if($ssh_limit < $wanted_processes) { + my $serverlogin = $self->serverlogin(); + ::warning("ssh to $serverlogin only allows ". + "for $ssh_limit simultaneous logins.", + "You may raise this by changing ". + "/etc/ssh/sshd_config:MaxStartups and MaxSessions on $serverlogin.", + "You can also try --sshdelay 0.1", + "Using only ".($ssh_limit-1)." connections ". + "to avoid race conditions."); + # Race condition can cause problem if using all sshs. + if($ssh_limit > 1) { $ssh_limit -= 1; } + } + return $ssh_limit; +} + +sub simultaneous_sshlogin { + # Using $sshlogin try to see if we can do $wanted_processes + # simultaneous logins + # (ssh host echo simultaneouslogin & ssh host echo simultaneouslogin & ...)|grep simul|wc -l + # Returns: + # Number of succesful logins + local $/ = "\n"; + my $self = shift; + my $wanted_processes = shift; + my $sshcmd = $self->sshcommand(); + my $serverlogin = $self->serverlogin(); + my $sshdelay = $opt::sshdelay ? "sleep $opt::sshdelay;" : ""; + # TODO sh -c wrapper to work for csh + my $cmd = "$sshdelay$sshcmd $serverlogin -- echo simultaneouslogin &1 &"x$wanted_processes; + ::debug("init", "Trying $wanted_processes logins at $serverlogin\n"); + open (my $simul_fh, "-|", "($cmd)|grep simultaneouslogin | wc -l") or + ::die_bug("simultaneouslogin"); + my $ssh_limit = <$simul_fh>; + close $simul_fh; + chomp $ssh_limit; + return $ssh_limit; +} + +sub set_ncpus { + my $self = shift; + $self->{'ncpus'} = shift; +} + +sub user_requested_processes { + # Parse the number of processes that the user asked for using -j + # Returns: + # the number of processes to run on this sshlogin + my $self = shift; + my $opt_P = shift; + my $processes; + if(defined $opt_P) { + if($opt_P =~ /^\+(\d+)$/) { + # E.g. -P +2 + my $j = $1; + $processes = + $self->ncpus() + $j; + } elsif ($opt_P =~ /^-(\d+)$/) { + # E.g. -P -2 + my $j = $1; + $processes = + $self->ncpus() - $j; + } elsif ($opt_P =~ /^(\d+(\.\d+)?)\%$/) { + # E.g. -P 10.5% + my $j = $1; + $processes = + $self->ncpus() * $j / 100; + } elsif ($opt_P =~ /^(\d+)$/) { + $processes = $1; + if($processes == 0) { + # -P 0 = infinity (or at least close) + $processes = $Global::infinity; + } + } elsif (-f $opt_P) { + $Global::max_procs_file = $opt_P; + if(open(my $in_fh, "<", $Global::max_procs_file)) { + my $opt_P_file = join("",<$in_fh>); + close $in_fh; + $processes = $self->user_requested_processes($opt_P_file); + } else { + ::error("Cannot open $opt_P."); + ::wait_and_exit(255); + } + } else { + ::error("Parsing of --jobs/-j/--max-procs/-P failed."); + ::die_usage(); + } + $processes = ::ceil($processes); + } + return $processes; +} + +sub ncpus { + local $/ = "\n"; + my $self = shift; + if(not defined $self->{'ncpus'}) { + my $sshcmd = $self->sshcommand(); + my $serverlogin = $self->serverlogin(); + if($serverlogin eq ":") { + if($opt::use_cpus_instead_of_cores) { + $self->{'ncpus'} = no_of_cpus(); + } else { + $self->{'ncpus'} = no_of_cores(); + } + } else { + my $ncpu; + if($opt::use_cpus_instead_of_cores) { + $ncpu = ::qqx("echo|$sshcmd $serverlogin -- parallel --number-of-cpus"); + } else { + ::debug("init",qq(echo|$sshcmd $serverlogin -- parallel --number-of-cores\n)); + $ncpu = ::qqx("echo|$sshcmd $serverlogin -- parallel --number-of-cores"); + } + chomp $ncpu; + if($ncpu =~ /^\s*[0-9]+\s*$/s) { + $self->{'ncpus'} = $ncpu; + } else { + ::warning("Could not figure out ". + "number of cpus on $serverlogin ($ncpu). Using 1."); + $self->{'ncpus'} = 1; + } + } + } + return $self->{'ncpus'}; +} + +sub no_of_cpus { + # Returns: + # Number of physical CPUs + local $/ = "\n"; # If delimiter is set, then $/ will be wrong + my $no_of_cpus; + if ($^O eq 'linux') { + $no_of_cpus = no_of_cpus_gnu_linux() || no_of_cores_gnu_linux(); + } elsif ($^O eq 'freebsd') { + $no_of_cpus = no_of_cpus_freebsd(); + } elsif ($^O eq 'netbsd') { + $no_of_cpus = no_of_cpus_netbsd(); + } elsif ($^O eq 'openbsd') { + $no_of_cpus = no_of_cpus_openbsd(); + } elsif ($^O eq 'gnu') { + $no_of_cpus = no_of_cpus_hurd(); + } elsif ($^O eq 'darwin') { + $no_of_cpus = no_of_cpus_darwin(); + } elsif ($^O eq 'solaris') { + $no_of_cpus = no_of_cpus_solaris() || nproc(); + } elsif ($^O eq 'aix') { + $no_of_cpus = no_of_cpus_aix(); + } elsif ($^O eq 'hpux') { + $no_of_cpus = no_of_cpus_hpux(); + } elsif ($^O eq 'nto') { + $no_of_cpus = no_of_cpus_qnx(); + } elsif ($^O eq 'svr5') { + $no_of_cpus = no_of_cpus_openserver(); + } elsif ($^O eq 'irix') { + $no_of_cpus = no_of_cpus_irix(); + } elsif ($^O eq 'dec_osf') { + $no_of_cpus = no_of_cpus_tru64(); + } else { + $no_of_cpus = (no_of_cpus_gnu_linux() + || no_of_cpus_freebsd() + || no_of_cpus_netbsd() + || no_of_cpus_openbsd() + || no_of_cpus_hurd() + || no_of_cpus_darwin() + || no_of_cpus_solaris() + || no_of_cpus_aix() + || no_of_cpus_hpux() + || no_of_cpus_qnx() + || no_of_cpus_openserver() + || no_of_cpus_irix() + || no_of_cpus_tru64() + # Number of cores is better than no guess for #CPUs + || nproc() + ); + } + if($no_of_cpus) { + chomp $no_of_cpus; + return $no_of_cpus; + } else { + ::warning("Cannot figure out number of cpus. Using 1."); + return 1; + } +} + +sub no_of_cores { + # Returns: + # Number of CPU cores + local $/ = "\n"; # If delimiter is set, then $/ will be wrong + my $no_of_cores; + if ($^O eq 'linux') { + $no_of_cores = no_of_cores_gnu_linux(); + } elsif ($^O eq 'freebsd') { + $no_of_cores = no_of_cores_freebsd(); + } elsif ($^O eq 'netbsd') { + $no_of_cores = no_of_cores_netbsd(); + } elsif ($^O eq 'openbsd') { + $no_of_cores = no_of_cores_openbsd(); + } elsif ($^O eq 'gnu') { + $no_of_cores = no_of_cores_hurd(); + } elsif ($^O eq 'darwin') { + $no_of_cores = no_of_cores_darwin(); + } elsif ($^O eq 'solaris') { + $no_of_cores = no_of_cores_solaris() || nproc(); + } elsif ($^O eq 'aix') { + $no_of_cores = no_of_cores_aix(); + } elsif ($^O eq 'hpux') { + $no_of_cores = no_of_cores_hpux(); + } elsif ($^O eq 'nto') { + $no_of_cores = no_of_cores_qnx(); + } elsif ($^O eq 'svr5') { + $no_of_cores = no_of_cores_openserver(); + } elsif ($^O eq 'irix') { + $no_of_cores = no_of_cores_irix(); + } elsif ($^O eq 'dec_osf') { + $no_of_cores = no_of_cores_tru64(); + } else { + $no_of_cores = (no_of_cores_gnu_linux() + || no_of_cores_freebsd() + || no_of_cores_netbsd() + || no_of_cores_openbsd() + || no_of_cores_hurd() + || no_of_cores_darwin() + || no_of_cores_solaris() + || no_of_cores_aix() + || no_of_cores_hpux() + || no_of_cores_qnx() + || no_of_cores_openserver() + || no_of_cores_irix() + || no_of_cores_tru64() + || nproc() + ); + } + if($no_of_cores) { + chomp $no_of_cores; + return $no_of_cores; + } else { + ::warning("Cannot figure out number of CPU cores. Using 1."); + return 1; + } +} + +sub nproc { + # Returns: + # Number of cores using `nproc` + my $no_of_cores = ::qqx("nproc"); + return $no_of_cores; +} + +sub no_of_cpus_gnu_linux { + # Returns: + # Number of physical CPUs on GNU/Linux + # undef if not GNU/Linux + my $no_of_cpus; + my $no_of_cores; + my $no_of_active_cores; + if(-e "/proc/cpuinfo") { + $no_of_cpus = 0; + $no_of_cores = 0; + my %seen; + if(open(my $in_fh, "<", "/proc/cpuinfo")) { + while(<$in_fh>) { + if(/^physical id.*[:](.*)/ and not $seen{$1}++) { + $no_of_cpus++; + } + /^processor.*[:]/i and $no_of_cores++; + } + close $in_fh; + } + } + if(-e "/proc/self/status") { + # if 'taskset' is used to limit number of cores + if(open(my $in_fh, "<", "/proc/self/status")) { + while(<$in_fh>) { + if(/^Cpus_allowed:\s*(\S+)/) { + my $a = $1; + $a =~ tr/,//d; + $no_of_active_cores = unpack ("%32b*", pack ("H*",$a)); + } + } + close $in_fh; + } + } + return (::min($no_of_cpus || $no_of_cores,$no_of_active_cores)); +} + +sub no_of_cores_gnu_linux { + # Returns: + # Number of CPU cores on GNU/Linux + # undef if not GNU/Linux + my $no_of_cores; + my $no_of_active_cores; + if(-e "/proc/cpuinfo") { + $no_of_cores = 0; + open(my $in_fh, "<", "/proc/cpuinfo") || return undef; + while(<$in_fh>) { + /^processor.*[:]/i and $no_of_cores++; + } + close $in_fh; + } + if(-e "/proc/self/status") { + # if 'taskset' is used to limit number of cores + if(open(my $in_fh, "<", "/proc/self/status")) { + while(<$in_fh>) { + if(/^Cpus_allowed:\s*(\S+)/) { + my $a = $1; + $a =~ tr/,//d; + $no_of_active_cores = unpack ("%32b*", pack ("H*",$a)); + } + } + close $in_fh; + } + } + return (::min($no_of_cores,$no_of_active_cores)); +} + +sub no_of_cpus_freebsd { + # Returns: + # Number of physical CPUs on FreeBSD + # undef if not FreeBSD + local $/ = "\n"; + my $no_of_cpus = + (::qqx(qq{ sysctl -a dev.cpu | grep \%parent | awk '{ print \$2 }' | uniq | wc -l | awk '{ print \$1 }' }) + or + ::qqx(qq{ sysctl hw.ncpu | awk '{ print \$2 }' })); + chomp $no_of_cpus; + return $no_of_cpus; +} + +sub no_of_cores_freebsd { + # Returns: + # Number of CPU cores on FreeBSD + # undef if not FreeBSD + local $/ = "\n"; + my $no_of_cores = + (::qqx(qq{ sysctl hw.ncpu | awk '{ print \$2 }' }) + or + ::qqx(qq{ sysctl -a dev.cpu | grep \%parent | awk '{ print \$2 }' | uniq | wc -l | awk '{ print \$1 }' })); + chomp $no_of_cores; + return $no_of_cores; +} + +sub no_of_cpus_netbsd { + # Returns: + # Number of physical CPUs on NetBSD + # undef if not NetBSD + local $/ = "\n"; + my $no_of_cpus = ::qqx("sysctl -n hw.ncpu"); + chomp $no_of_cpus; + return $no_of_cpus; +} + +sub no_of_cores_netbsd { + # Returns: + # Number of CPU cores on NetBSD + # undef if not NetBSD + local $/ = "\n"; + my $no_of_cores = ::qqx("sysctl -n hw.ncpu"); + chomp $no_of_cores; + return $no_of_cores; +} + +sub no_of_cpus_openbsd { + # Returns: + # Number of physical CPUs on OpenBSD + # undef if not OpenBSD + local $/ = "\n"; + my $no_of_cpus = ::qqx('sysctl -n hw.ncpu'); + chomp $no_of_cpus; + return $no_of_cpus; +} + +sub no_of_cores_openbsd { + # Returns: + # Number of CPU cores on OpenBSD + # undef if not OpenBSD + local $/ = "\n"; + my $no_of_cores = ::qqx('sysctl -n hw.ncpu'); + chomp $no_of_cores; + return $no_of_cores; +} + +sub no_of_cpus_hurd { + # Returns: + # Number of physical CPUs on HURD + # undef if not HURD + local $/ = "\n"; + my $no_of_cpus = ::qqx("nproc"); + chomp $no_of_cpus; + return $no_of_cpus; +} + +sub no_of_cores_hurd { + # Returns: + # Number of physical CPUs on HURD + # undef if not HURD + local $/ = "\n"; + my $no_of_cores = ::qqx("nproc"); + chomp $no_of_cores; + return $no_of_cores; +} + +sub no_of_cpus_darwin { + # Returns: + # Number of physical CPUs on MacOSX Darwin + # undef if not MacOSX Darwin + my $no_of_cpus = + (::qqx('sysctl -n hw.physicalcpu') + or + ::qqx(qq{ sysctl -a hw | grep [^a-z]physicalcpu[^a-z] | awk '{ print \$2 }' })); + return $no_of_cpus; +} + +sub no_of_cores_darwin { + # Returns: + # Number of CPU cores on Mac Darwin + # undef if not Mac Darwin + my $no_of_cores = + (::qqx('sysctl -n hw.logicalcpu') + or + ::qqx(qq{ sysctl -a hw | grep [^a-z]logicalcpu[^a-z] | awk '{ print \$2 }' })); + return $no_of_cores; +} + +sub no_of_cpus_solaris { + # Returns: + # Number of physical CPUs on Solaris + # undef if not Solaris + if(-x "/usr/sbin/psrinfo") { + my @psrinfo = ::qqx("/usr/sbin/psrinfo"); + if($#psrinfo >= 0) { + return $#psrinfo +1; + } + } + if(-x "/usr/sbin/prtconf") { + my @prtconf = ::qqx("/usr/sbin/prtconf | grep cpu..instance"); + if($#prtconf >= 0) { + return $#prtconf +1; + } + } + if(-x "/usr/sbin/prtconf") { + my @prtconf = ::qqx("/usr/sbin/prtconf | grep cpu..instance"); + if($#prtconf >= 0) { + return $#prtconf +1; + } + } + return undef; +} + +sub no_of_cores_solaris { + # Returns: + # Number of CPU cores on Solaris + # undef if not Solaris + if(-x "/usr/sbin/psrinfo") { + my @psrinfo = ::qqx("/usr/sbin/psrinfo"); + if($#psrinfo >= 0) { + return $#psrinfo +1; + } + } + if(-x "/usr/sbin/prtconf") { + my @prtconf = ::qqx("/usr/sbin/prtconf | grep cpu..instance"); + if($#prtconf >= 0) { + return $#prtconf +1; + } + } + return undef; +} + +sub no_of_cpus_aix { + # Returns: + # Number of physical CPUs on AIX + # undef if not AIX + local $/ = "\n"; + my $no_of_cpus = 0; + if(-x "/usr/sbin/lscfg") { + open(my $in_fh, "-|", "/usr/sbin/lscfg -vs |grep proc | wc -l|tr -d ' '") + || return undef; + $no_of_cpus = <$in_fh>; + chomp ($no_of_cpus); + close $in_fh; + } + return $no_of_cpus; +} + +sub no_of_cores_aix { + # Returns: + # Number of CPU cores on AIX + # undef if not AIX + my $no_of_cores; + if(-x "/usr/bin/vmstat") { + open(my $in_fh, "-|", "/usr/bin/vmstat 1 1") || return undef; + while(<$in_fh>) { + /lcpu=([0-9]*) / and $no_of_cores = $1; + } + close $in_fh; + } + return $no_of_cores; +} + +sub no_of_cpus_hpux { + # Returns: + # Number of physical CPUs on HP-UX + # undef if not HP-UX + my $no_of_cpus = + ::qqx(qq{ /usr/bin/mpsched -s 2>&1 | grep 'Locality Domain Count' | awk '{ print \$4 }'}); + return $no_of_cpus; +} + +sub no_of_cores_hpux { + # Returns: + # Number of CPU cores on HP-UX + # undef if not HP-UX + my $no_of_cores = + ::qqx(qq{ /usr/bin/mpsched -s 2>&1 | perl -ne '/Processor Count\\D+(\\d+)/ and print "\$1\n"'}); + return $no_of_cores; +} + +sub no_of_cpus_qnx { + # Returns: + # Number of physical CPUs on QNX + # undef if not QNX + # BUG: It is not known how to calculate this. + my $no_of_cpus = 0; + return $no_of_cpus; +} + +sub no_of_cores_qnx { + # Returns: + # Number of CPU cores on QNX + # undef if not QNX + # BUG: It is not known how to calculate this. + my $no_of_cores = 0; + return $no_of_cores; +} + +sub no_of_cpus_openserver { + # Returns: + # Number of physical CPUs on SCO OpenServer + # undef if not SCO OpenServer + my $no_of_cpus = 0; + if(-x "/usr/sbin/psrinfo") { + my @psrinfo = ::qqx("/usr/sbin/psrinfo"); + if($#psrinfo >= 0) { + return $#psrinfo +1; + } + } + return $no_of_cpus; +} + +sub no_of_cores_openserver { + # Returns: + # Number of CPU cores on SCO OpenServer + # undef if not SCO OpenServer + my $no_of_cores = 0; + if(-x "/usr/sbin/psrinfo") { + my @psrinfo = ::qqx("/usr/sbin/psrinfo"); + if($#psrinfo >= 0) { + return $#psrinfo +1; + } + } + return $no_of_cores; +} + +sub no_of_cpus_irix { + # Returns: + # Number of physical CPUs on IRIX + # undef if not IRIX + my $no_of_cpus = ::qqx(qq{ hinv | grep HZ | grep Processor | awk '{print \$1}' }); + return $no_of_cpus; +} + +sub no_of_cores_irix { + # Returns: + # Number of CPU cores on IRIX + # undef if not IRIX + my $no_of_cores = ::qqx(qq{ hinv | grep HZ | grep Processor | awk '{print \$1}' }); + return $no_of_cores; +} + +sub no_of_cpus_tru64 { + # Returns: + # Number of physical CPUs on Tru64 + # undef if not Tru64 + my $no_of_cpus = ::qqx("sizer -pr"); + return $no_of_cpus; +} + +sub no_of_cores_tru64 { + # Returns: + # Number of CPU cores on Tru64 + # undef if not Tru64 + my $no_of_cores = ::qqx("sizer -pr"); + return $no_of_cores; +} + +sub sshcommand { + my $self = shift; + if (not defined $self->{'sshcommand'}) { + $self->sshcommand_of_sshlogin(); + } + return $self->{'sshcommand'}; +} + +sub serverlogin { + my $self = shift; + if (not defined $self->{'serverlogin'}) { + $self->sshcommand_of_sshlogin(); + } + return $self->{'serverlogin'}; +} + +sub sshcommand_of_sshlogin { + # 'server' -> ('ssh -S /tmp/parallel-ssh-RANDOM/host-','server') + # 'user@server' -> ('ssh','user@server') + # 'myssh user@server' -> ('myssh','user@server') + # 'myssh -l user server' -> ('myssh -l user','server') + # '/usr/bin/myssh -l user server' -> ('/usr/bin/myssh -l user','server') + # Returns: + # sshcommand - defaults to 'ssh' + # login@host + my $self = shift; + my ($sshcmd, $serverlogin); + # If $opt::ssh is unset, use $PARALLEL_SSH or 'ssh' + $opt::ssh ||= $ENV{'PARALLEL_SSH'} || "ssh"; + if($self->{'string'} =~ /(.+) (\S+)$/) { + # Own ssh command + $sshcmd = $1; $serverlogin = $2; + } else { + # Normal ssh + if($opt::controlmaster) { + # Use control_path to make ssh faster + my $control_path = $self->control_path_dir()."/ssh-%r@%h:%p"; + $sshcmd = $opt::ssh." -S ".$control_path; + $serverlogin = $self->{'string'}; + if(not $self->{'control_path'}{$control_path}++) { + # Master is not running for this control_path + # Start it + my $pid = fork(); + if($pid) { + $Global::sshmaster{$pid} ||= 1; + } else { + $SIG{'TERM'} = undef; + # Ignore the 'foo' being printed + open(STDOUT,">","/dev/null"); + # STDERR >/dev/null to ignore + open(STDERR,">","/dev/null"); + open(STDIN,"<","/dev/null"); + # Run a sleep that outputs data, so it will discover + # if the ssh connection closes. + my $sleep = ::shell_quote_scalar + ('$|=1;while(1){sleep 1;print "foo\n"}'); + my @master = ($opt::ssh, "-MTS", + $control_path, $serverlogin, "--", "perl", "-e", + $sleep); + exec(@master); + } + } + } else { + $sshcmd = $opt::ssh; $serverlogin = $self->{'string'}; + } + } + + if($serverlogin =~ s/(\S+)\@(\S+)/$2/) { + # convert user@server to '-l user server' + # because lsh does not support user@server + $sshcmd = $sshcmd." -l ".$1; + } + + $self->{'sshcommand'} = $sshcmd; + $self->{'serverlogin'} = $serverlogin; +} + +sub control_path_dir { + # Returns: + # path to directory + my $self = shift; + if(not defined $self->{'control_path_dir'}) { + $self->{'control_path_dir'} = + # Use $ENV{'TMPDIR'} as that is typically not + # NFS mounted + File::Temp::tempdir($ENV{'TMPDIR'} + . "/control_path_dir-XXXX", + CLEANUP => 1); + } + return $self->{'control_path_dir'}; +} + +sub rsync_transfer_cmd { + # Command to run to transfer a file + # Input: + # $file = filename of file to transfer + # $workdir = destination dir + # Returns: + # $cmd = rsync command to run to transfer $file ("" if unreadable) + my $self = shift; + my $file = shift; + my $workdir = shift; + if(not -r $file) { + ::warning($file. " is not readable and will not be transferred."); + return "true"; + } + my $rsync_destdir; + my $relpath = ($file !~ m:^/:) || ($file =~ m:/\./:); # Is the path relative or /./? + if($relpath) { + $rsync_destdir = ::shell_quote_file($workdir); + } else { + # rsync /foo/bar / + $rsync_destdir = "/"; + } + $file = ::shell_quote_file($file); + my $sshcmd = $self->sshcommand(); + my $rsync_opts = $ENV{'PARALLEL_RSYNC_OPTS'}. + " -e".::shell_quote_scalar($sshcmd); + my $serverlogin = $self->serverlogin(); + # Make dir if it does not exist + return "$sshcmd $serverlogin -- mkdir -p $rsync_destdir && " . + rsync()." $rsync_opts $file $serverlogin:$rsync_destdir"; +} + +sub cleanup_cmd { + # Command to run to remove the remote file + # Input: + # $file = filename to remove + # $workdir = destination dir + # Returns: + # $cmd = ssh command to run to remove $file and empty parent dirs + my $self = shift; + my $file = shift; + my $workdir = shift; + my $f = $file; + if($f =~ m:/\./:) { + # foo/bar/./baz/quux => workdir/baz/quux + # /foo/bar/./baz/quux => workdir/baz/quux + $f =~ s:.*/\./:$workdir/:; + } elsif($f =~ m:^[^/]:) { + # foo/bar => workdir/foo/bar + $f = $workdir."/".$f; + } + my @subdirs = split m:/:, ::dirname($f); + my @rmdir; + my $dir = ""; + for(@subdirs) { + $dir .= $_."/"; + unshift @rmdir, ::shell_quote_file($dir); + } + my $rmdir = @rmdir ? "sh -c ".::shell_quote_scalar("rmdir @rmdir 2>/dev/null;") : ""; + if(defined $opt::workdir and $opt::workdir eq "...") { + $rmdir .= ::shell_quote_scalar("rm -rf " . ::shell_quote_file($workdir).';'); + } + + $f = ::shell_quote_file($f); + my $sshcmd = $self->sshcommand(); + my $serverlogin = $self->serverlogin(); + return "$sshcmd $serverlogin -- ".::shell_quote_scalar("rm -f $f; $rmdir"); +} + +{ + my $rsync; + + sub rsync { + # rsync 3.1.x uses protocol 31 which is unsupported by 2.5.7. + # If the version >= 3.1.0: downgrade to protocol 30 + if(not $rsync) { + my @out = `rsync --version`; + for (@out) { + if(/version (\d+.\d+)(.\d+)?/) { + if($1 >= 3.1) { + # Version 3.1.0 or later: Downgrade to protocol 30 + $rsync = "rsync --protocol 30"; + } else { + $rsync = "rsync"; + } + } + } + $rsync or ::die_bug("Cannot figure out version of rsync: @out"); + } + return $rsync; + } +} + + +package JobQueue; + +sub new { + my $class = shift; + my $commandref = shift; + my $read_from = shift; + my $context_replace = shift; + my $max_number_of_args = shift; + my $transfer_files = shift; + my $return_files = shift; + my $commandlinequeue = CommandLineQueue->new + ($commandref, $read_from, $context_replace, $max_number_of_args, + $transfer_files, $return_files); + my @unget = (); + return bless { + 'unget' => \@unget, + 'commandlinequeue' => $commandlinequeue, + 'this_job_no' => 0, + 'total_jobs' => undef, + }, ref($class) || $class; +} + +sub get { + my $self = shift; + + $self->{'this_job_no'}++; + if(@{$self->{'unget'}}) { + return shift @{$self->{'unget'}}; + } else { + my $commandline = $self->{'commandlinequeue'}->get(); + if(defined $commandline) { + return Job->new($commandline); + } else { + $self->{'this_job_no'}--; + return undef; + } + } +} + +sub unget { + my $self = shift; + unshift @{$self->{'unget'}}, @_; + $self->{'this_job_no'} -= @_; +} + +sub empty { + my $self = shift; + my $empty = (not @{$self->{'unget'}}) + && $self->{'commandlinequeue'}->empty(); + ::debug("run", "JobQueue->empty $empty "); + return $empty; +} + +sub total_jobs { + my $self = shift; + if(not defined $self->{'total_jobs'}) { + if($opt::pipe and not $opt::tee) { + ::error("--pipe is incompatible with --eta/--bar/--shuf"); + ::wait_and_exit(255); + } + if($opt::sqlworker) { + $self->{'total_jobs'} = $Global::sql->total_jobs(); + } else { + my $record; + my @arg_records; + my $record_queue = $self->{'commandlinequeue'}{'arg_queue'}; + my $start = time; + while($record = $record_queue->get()) { + push @arg_records, $record; + if(time - $start > 10) { + ::warning("Reading ".scalar(@arg_records). + " arguments took longer than 10 seconds."); + $opt::eta && ::warning("Consider removing --eta."); + $opt::bar && ::warning("Consider removing --bar."); + $opt::shuf && ::warning("Consider removing --shuf."); + last; + } + } + while($record = $record_queue->get()) { + push @arg_records, $record; + } + if($opt::shuf) { + my $i = @arg_records; + while (--$i) { + my $j = int rand($i+1); + @arg_records[$i,$j] = @arg_records[$j,$i]; + } + } + $record_queue->unget(@arg_records); + $self->{'total_jobs'} = + ::ceil((1+$#arg_records+$self->{'this_job_no'}) + / ::max($Global::max_number_of_args,1)); + ::debug("init","Total jobs: ".$self->{'total_jobs'}. + " (".(1+$#arg_records)."+".$self->{'this_job_no'}.")\n"); + } + } + return $self->{'total_jobs'}; +} + +sub flush_total_jobs { + # Unset total_jobs to force recomputing + my $self = shift; + $self->{'total_jobs'} = undef; +} + +sub next_seq { + my $self = shift; + + return $self->{'commandlinequeue'}->seq(); +} + +sub quote_args { + my $self = shift; + return $self->{'commandlinequeue'}->quote_args(); +} + + +package Job; + +sub new { + my $class = shift; + my $commandlineref = shift; + return bless { + 'commandline' => $commandlineref, # CommandLine object + 'workdir' => undef, # --workdir + # filehandle for stdin (used for --pipe) + # filename for writing stdout to (used for --files) + # remaining data not sent to stdin (used for --pipe) + # tmpfiles to cleanup when job is done + 'unlink' => [], + # amount of data sent via stdin (used for --pipe) + 'transfersize' => 0, # size of files using --transfer + 'returnsize' => 0, # size of files using --return + 'pid' => undef, + # hash of { SSHLogins => number of times the command failed there } + 'failed' => undef, + 'sshlogin' => undef, + # The commandline wrapped with rsync and ssh + 'sshlogin_wrap' => undef, + 'exitstatus' => undef, + 'exitsignal' => undef, + # Timestamp for timeout if any + 'timeout' => undef, + 'virgin' => 1, + # Output used for SQL and CSV-output + 'output' => { 1 => [], 2 => [] }, + 'halfline' => { 1 => [], 2 => [] }, + }, ref($class) || $class; +} + +sub replaced { + my $self = shift; + $self->{'commandline'} or ::die_bug("commandline empty"); + return $self->{'commandline'}->replaced(); +} + +sub seq { + my $self = shift; + return $self->{'commandline'}->seq(); +} + +sub set_seq { + my $self = shift; + return $self->{'commandline'}->set_seq(shift); +} + +sub slot { + my $self = shift; + return $self->{'commandline'}->slot(); +} + +sub free_slot { + my $self = shift; + push @Global::slots, $self->slot(); +} + +{ + my($cattail); + + sub cattail { + # Returns: + # $cattail = perl program for: + # cattail "decompress program" writerpid [file_to_decompress or stdin] [file_to_unlink] + if(not $cattail) { + $cattail = q{ + # cat followed by tail (possibly with rm as soon at the file is opened) + # If $writerpid dead: finish after this round + use Fcntl; + $|=1; + + my ($comfile, $cmd, $writerpid, $read_file, $unlink_file) = @ARGV; + if($read_file) { + open(IN,"<",$read_file) || die("cattail: Cannot open $read_file"); + } else { + *IN = *STDIN; + } + while(! -s $comfile) { + # Writer has not opened the buffer file, so we cannot remove it yet + $sleep = ($sleep < 30) ? ($sleep * 1.001 + 0.01) : ($sleep); + usleep($sleep); + } + # The writer and we have both opened the file, so it is safe to unlink it + unlink $unlink_file; + unlink $comfile; + + my $first_round = 1; + my $flags; + fcntl(IN, F_GETFL, $flags) || die $!; # Get the current flags on the filehandle + $flags |= O_NONBLOCK; # Add non-blocking to the flags + fcntl(IN, F_SETFL, $flags) || die $!; # Set the flags on the filehandle + + while(1) { + # clear EOF + seek(IN,0,1); + my $writer_running = kill 0, $writerpid; + $read = sysread(IN,$buf,131072); + if($read) { + if($first_round) { + # Only start the command if there any input to process + $first_round = 0; + open(OUT,"|-",$cmd) || die("cattail: Cannot run $cmd"); + } + + # Blocking print + while($buf) { + my $bytes_written = syswrite(OUT,$buf); + # syswrite may be interrupted by SIGHUP + substr($buf,0,$bytes_written) = ""; + } + # Something printed: Wait less next time + $sleep /= 2; + } else { + if(eof(IN) and not $writer_running) { + # Writer dead: There will never be sent more to the decompressor + close OUT; + exit; + } + # TODO This could probably be done more efficiently using select(2) + # Nothing read: Wait longer before next read + # Up to 100 milliseconds + $sleep = ($sleep < 100) ? ($sleep * 1.001 + 0.01) : ($sleep); + usleep($sleep); + } + } + + sub usleep { + # Sleep this many milliseconds. + my $secs = shift; + select(undef, undef, undef, $secs/1000); + } + }; + $cattail =~ s/#.*//mg; + $cattail =~ s/\s+/ /g; + } + return $cattail; + } +} + +sub openoutputfiles { + # Open files for STDOUT and STDERR + # Set file handles in $self->fh + my $self = shift; + my ($outfhw, $errfhw, $outname, $errname); + + if($opt::linebuffer and not + ($opt::keeporder or $opt::files or $opt::results or + $opt::compress or $opt::compress_program or + $opt::decompress_program)) { + # Do not save to files: Use non-blocking pipe + my ($outfhr, $errfhr); + pipe($outfhr, $outfhw) || die; + pipe($errfhr, $errfhw) || die; + $self->set_fh(1,'w',$outfhw); + $self->set_fh(2,'w',$errfhw); + $self->set_fh(1,'r',$outfhr); + $self->set_fh(2,'r',$errfhr); + # Make it possible to read non-blocking from the pipe + for my $fdno (1,2) { + ::set_fh_non_blocking($self->fh($fdno,'r')); + } + # Return immediately because we do not need setting filenames + return; + } elsif($opt::results and not $Global::csvsep) { + my $out = $self->{'commandline'}->results_out(); + my $seqname; + if($out eq $opt::results or $out =~ m:/$:) { + # $opt::results = simple string or ending in / + # => $out is a dir/ + # prefix/name1/val1/name2/val2/seq + $seqname = $out."seq"; + # prefix/name1/val1/name2/val2/stdout + $outname = $out."stdout"; + # prefix/name1/val1/name2/val2/stderr + $errname = $out."stderr"; + } else { + # $opt::results = replacement string not ending in / + # => $out is a file + $outname = $out; + $errname = "$out.err"; + $seqname = "$out.seq"; + } + my $seqfhw; + if(not open($seqfhw, "+>", $seqname)) { + ::error("Cannot write to `$seqname'."); + ::wait_and_exit(255); + } + print $seqfhw $self->seq(); + close $seqfhw; + if(not open($outfhw, "+>", $outname)) { + ::error("Cannot write to `$outname'."); + ::wait_and_exit(255); + } + if(not open($errfhw, "+>", $errname)) { + ::error("Cannot write to `$errname'."); + ::wait_and_exit(255); + } + $self->set_fh(1,"unlink",""); + $self->set_fh(2,"unlink",""); + if($opt::sqlworker) { + # Save the filenames in SQL table + $Global::sql->update("SET Stdout = ?, Stderr = ? ". + "WHERE Seq = ". $self->seq(), + $outname, $errname); + } + } elsif(not $opt::ungroup) { + # To group we create temporary files for STDOUT and STDERR + # To avoid the cleanup unlink the files immediately (but keep them open) + if($opt::files) { + ($outfhw, $outname) = ::tmpfile(SUFFIX => ".par"); + ($errfhw, $errname) = ::tmpfile(SUFFIX => ".par"); + # --files => only remove stderr + $self->set_fh(1,"unlink",""); + $self->set_fh(2,"unlink",$errname); + } else { + ($outfhw, $outname) = ::tmpfile(SUFFIX => ".par"); + ($errfhw, $errname) = ::tmpfile(SUFFIX => ".par"); + $self->set_fh(1,"unlink",$outname); + $self->set_fh(2,"unlink",$errname); + } + } else { + # --ungroup + open($outfhw,">&",$Global::fd{1}) || die; + open($errfhw,">&",$Global::fd{2}) || die; + # File name must be empty as it will otherwise be printed + $outname = ""; + $errname = ""; + $self->set_fh(1,"unlink",$outname); + $self->set_fh(2,"unlink",$errname); + } + # Set writing FD + $self->set_fh(1,'w',$outfhw); + $self->set_fh(2,'w',$errfhw); + $self->set_fh(1,'name',$outname); + $self->set_fh(2,'name',$errname); + if($opt::compress) { + $self->filter_through_compress(); + } elsif(not $opt::ungroup) { + $self->grouped(); + } + if($opt::linebuffer) { + # Make it possible to read non-blocking from + # the buffer files + # Used for --linebuffer with -k, --files, --res, --compress* + for my $fdno (1,2) { + ::set_fh_non_blocking($self->fh($fdno,'r')); + } + } +} + +sub print_verbose_dryrun { + # If -v set: print command to stdout (possibly buffered) + # This must be done before starting the command + my $self = shift; + if($Global::verbose or $opt::dryrun) { + my $fh = $self->fh(1,"w"); + if($Global::verbose <= 1) { + print $fh $self->replaced(),"\n"; + } else { + # Verbose level > 1: Print the rsync and stuff + print $fh $self->wrapped(),"\n"; + } + } + if($opt::sqlworker) { + $Global::sql->update("SET Command = ? WHERE Seq = ".$self->seq(), + $self->replaced()); + } +} + +sub add_rm { + # Files to remove when job is done + my $self = shift; + push @{$self->{'unlink'}}, @_; +} + +sub get_rm { + # Files to remove when job is done + my $self = shift; + return @{$self->{'unlink'}}; +} + +sub cleanup { + # Remove files when job is done + my $self = shift; + unlink $self->get_rm(); + delete @Global::unlink{$self->get_rm()}; +} + +sub grouped { + my $self = shift; + # Set reading FD if using --group (--ungroup does not need) + for my $fdno (1,2) { + # Re-open the file for reading + # so fdw can be closed seperately + # and fdr can be seeked seperately (for --line-buffer) + open(my $fdr,"<", $self->fh($fdno,'name')) || + ::die_bug("fdr: Cannot open ".$self->fh($fdno,'name')); + $self->set_fh($fdno,'r',$fdr); + # Unlink if required + $Global::debug or ::rm($self->fh($fdno,"unlink")); + } +} + +sub empty_input_wrapper { + # If no input: exit(0) + # If some input: Pass input as input to command on STDIN + # This avoids starting the command if there is no input. + # Input: + # $command = command to pipe data to + # Returns: + # $wrapped_command = the wrapped command + my $command = shift; + my $script = + ::spacefree(0,q{ + if(sysread(STDIN, $buf, 1)) { + open($fh, "|-", @ARGV) || die; + syswrite($fh, $buf); + # Align up to 128k block + if($read = sysread(STDIN, $buf, 131071)) { + syswrite($fh, $buf); + } + while($read = sysread(STDIN, $buf, 131072)) { + syswrite($fh, $buf); + } + close $fh; + exit ($?&127 ? 128+($?&127) : 1+$?>>8) + } + }); + ::debug("run",'Empty wrap: perl -e '.::shell_quote_scalar($script)."\n"); + if($Global::cshell + and + length $command > 499) { + # csh does not like words longer than 1000 (499 quoted) + # $command = "perl -e '".base64_zip_eval()."' ". + # join" ",string_zip_base64( + # 'exec "'.::perl_quote_scalar($command).'"'); + return 'perl -e '.::shell_quote_scalar($script)." ". + base64_wrap("exec \"$Global::shell\",'-c',\"". + ::perl_quote_scalar($command).'"'); + } else { + return 'perl -e '.::shell_quote_scalar($script)." ". + $Global::shell." -c ".::shell_quote_scalar($command); + } +} + +sub filter_through_compress { + my $self = shift; + # Send stdout to stdin for $opt::compress_program(1) + # Send stderr to stdin for $opt::compress_program(2) + # cattail get pid: $pid = $self->fh($fdno,'rpid'); + my $cattail = cattail(); + + for my $fdno (1,2) { + # Make a communication file. + my ($fh, $comfile) = ::tmpfile(SUFFIX => ".pac"); + close $fh; + # Compressor: (echo > $comfile; compress pipe) > output + # When the echo is written to $comfile, + # it is known that output file is opened, + # thus output file can then be removed by the decompressor. + my $wpid = open(my $fdw,"|-", "(echo > $comfile; ". + empty_input_wrapper($opt::compress_program).") >". + $self->fh($fdno,'name')) || die $?; + $self->set_fh($fdno,'w',$fdw); + $self->set_fh($fdno,'wpid',$wpid); + # Decompressor: open output; -s $comfile > 0: rm $comfile output; + # decompress output > stdout + my $rpid = open(my $fdr, "-|", "perl", "-e", $cattail, $comfile, + $opt::decompress_program, $wpid, + $self->fh($fdno,'name'),$self->fh($fdno,'unlink')) + || die $?; + $self->set_fh($fdno,'r',$fdr); + $self->set_fh($fdno,'rpid',$rpid); + } +} + + + +sub set_fh { + # Set file handle + my ($self, $fd_no, $key, $fh) = @_; + $self->{'fd'}{$fd_no,$key} = $fh; +} + +sub fh { + # Get file handle + my ($self, $fd_no, $key) = @_; + return $self->{'fd'}{$fd_no,$key}; +} + +sub write { + my $self = shift; + my $remaining_ref = shift; + my $stdin_fh = $self->fh(0,"w"); + + my $len = length $$remaining_ref; + # syswrite may not write all in one go, + # so make sure everything is written. + my $written; + + # If writing is to a closed pipe: + # Do not call signal handler, but let nothing be written + local $SIG{PIPE} = undef; + while($written = syswrite($stdin_fh,$$remaining_ref)){ + substr($$remaining_ref,0,$written) = ""; + } +} + +sub set_block { + # Copy stdin buffer from $block_ref up to $endpos + # Prepend with $header_ref if virgin (i.e. not --roundrobin) + # Remove $recstart and $recend if needed + # Input: + # $header_ref = ref to $header to prepend + # $buffer_ref = ref to $buffer containing the block + # $endpos = length of $block to pass on + # $recstart = --recstart regexp + # $recend = --recend regexp + # Returns: + # N/A + my $self = shift; + my ($header_ref,$buffer_ref,$endpos,$recstart,$recend) = @_; + $self->{'block'} = ($self->virgin() ? $$header_ref : ""). + substr($$buffer_ref,0,$endpos); + if($opt::remove_rec_sep) { + remove_rec_sep(\$self->{'block'},$recstart,$recend); + } + $self->{'block_length'} = length $self->{'block'}; + $self->{'block_pos'} = 0; + $self->add_transfersize($self->{'block_length'}); +} + +sub block_ref { + my $self = shift; + return \$self->{'block'}; +} + + +sub block_length { + my $self = shift; + return $self->{'block_length'}; +} + +sub remove_rec_sep { + my ($block_ref,$recstart,$recend) = @_; + # Remove record separator + $$block_ref =~ s/$recend$recstart//gos; + $$block_ref =~ s/^$recstart//os; + $$block_ref =~ s/$recend$//os; +} + +sub non_blocking_write { + my $self = shift; + my $something_written = 0; + use POSIX qw(:errno_h); + + my $in = $self->fh(0,"w"); + my $rv = syswrite($in, + substr($self->{'block'},$self->{'block_pos'})); + if (!defined($rv) && $! == EAGAIN) { + # would block - but would have written + $something_written = 0; + # avoid triggering auto expanding block + $Global::no_autoexpand_block ||= 1; + } elsif ($self->{'block_pos'}+$rv != $self->{'block_length'}) { + # incomplete write + # Remove the written part + $self->{'block_pos'} += $rv; + $something_written = $rv; + } else { + # successfully wrote everything + # Empty block to free memory + my $a = ""; + $self->set_block(\$a,\$a,0,"",""); + $something_written = $rv; + } + ::debug("pipe", "Non-block: ", $something_written); + return $something_written; +} + + +sub virgin { + my $self = shift; + return $self->{'virgin'}; +} + +sub set_virgin { + my $self = shift; + $self->{'virgin'} = shift; +} + +sub pid { + my $self = shift; + return $self->{'pid'}; +} + +sub set_pid { + my $self = shift; + $self->{'pid'} = shift; +} + +sub starttime { + # Returns: + # UNIX-timestamp this job started + my $self = shift; + return sprintf("%.3f",$self->{'starttime'}); +} + +sub set_starttime { + my $self = shift; + my $starttime = shift || ::now(); + $self->{'starttime'} = $starttime; + $opt::sqlworker and + $Global::sql->update("SET Starttime = ? WHERE Seq = ".$self->seq(), + $starttime); +} + +sub runtime { + # Returns: + # Run time in seconds with 3 decimals + my $self = shift; + return sprintf("%.3f", + int(($self->endtime() - $self->starttime())*1000)/1000); +} + +sub endtime { + # Returns: + # UNIX-timestamp this job ended + # 0 if not ended yet + my $self = shift; + return ($self->{'endtime'} || 0); +} + +sub set_endtime { + my $self = shift; + my $endtime = shift; + $self->{'endtime'} = $endtime; + $opt::sqlworker and + $Global::sql->update("SET JobRuntime = ? WHERE Seq = ".$self->seq(), + $self->runtime()); +} + +sub is_timedout { + # Is the job timedout? + # Input: + # $delta_time = time that the job may run + # Returns: + # True or false + my $self = shift; + my $delta_time = shift; + return time > $self->{'starttime'} + $delta_time; +} + +sub kill { + my $self = shift; + $self->set_exitstatus(-1); + ::kill_sleep_seq($self->pid()); +} + +sub failed { + # return number of times failed for this $sshlogin + # Input: + # $sshlogin + # Returns: + # Number of times failed for $sshlogin + my $self = shift; + my $sshlogin = shift; + return $self->{'failed'}{$sshlogin}; +} + +sub failed_here { + # return number of times failed for the current $sshlogin + # Returns: + # Number of times failed for this sshlogin + my $self = shift; + return $self->{'failed'}{$self->sshlogin()}; +} + +sub add_failed { + # increase the number of times failed for this $sshlogin + my $self = shift; + my $sshlogin = shift; + $self->{'failed'}{$sshlogin}++; +} + +sub add_failed_here { + # increase the number of times failed for the current $sshlogin + my $self = shift; + $self->{'failed'}{$self->sshlogin()}++; +} + +sub reset_failed { + # increase the number of times failed for this $sshlogin + my $self = shift; + my $sshlogin = shift; + delete $self->{'failed'}{$sshlogin}; +} + +sub reset_failed_here { + # increase the number of times failed for this $sshlogin + my $self = shift; + delete $self->{'failed'}{$self->sshlogin()}; +} + +sub min_failed { + # Returns: + # the number of sshlogins this command has failed on + # the minimal number of times this command has failed + my $self = shift; + my $min_failures = + ::min(map { $self->{'failed'}{$_} } keys %{$self->{'failed'}}); + my $number_of_sshlogins_failed_on = scalar keys %{$self->{'failed'}}; + return ($number_of_sshlogins_failed_on,$min_failures); +} + +sub total_failed { + # Returns: + # $total_failures = the number of times this command has failed + my $self = shift; + my $total_failures = 0; + for (values %{$self->{'failed'}}) { + $total_failures += $_; + } + return $total_failures; +} + +{ + my $script; + + sub postpone_exit_and_cleanup { + # Command to remove files and dirs (given as args) without + # affecting the exit value in $?/$status. + if(not $script) { + $script = "perl -e '". + ::spacefree(0,q{ + $bash=shift; + $csh=shift; + for(@ARGV){ + unlink; + rmdir; + } + if($bash=~s/h//) { + exit $bash; + } + exit $csh; + }). + "' ".'"$?h" "$status" '; + } + return $script + } +} + +{ + my $script; + + sub fifo_wrap { + # Script to create a fifo, run a command on the fifo + # while copying STDIN to the fifo, and finally + # remove the fifo and return the exit code of the command. + if(not $script) { + # {} == $PARALLEL_TMP for --fifo + # To make it csh compatible a wrapper needs to: + # * mkfifo + # * spawn $command & + # * cat > fifo + # * waitpid to get the exit code from $command + # * be less than 1000 chars long + $script = "perl -e '". + (::spacefree + (0, q{ + ($s,$c,$f) = @ARGV; + # mkfifo $PARALLEL_TMP + system "mkfifo", $f; + # spawn $shell -c $command & + $pid = fork || exec $s, "-c", $c; + open($o,">",$f) || die $!; + # cat > $PARALLEL_TMP + while(sysread(STDIN,$buf,131072)){ + syswrite $o, $buf; + } + close $o; + # waitpid to get the exit code from $command + waitpid $pid,0; + # Cleanup + unlink $f; + exit $?/256; + }))."'"; + } + return $script; + } +} + +sub wrapped { + # Wrap command with: + # * --shellquote + # * --nice + # * --cat + # * --fifo + # * --sshlogin + # * --pipepart (@Global::cat_prepends) + # * --tee (@Global::cat_prepends) + # * --pipe + # * --tmux + # The ordering of the wrapping is important: + # * --nice/--cat/--fifo should be done on the remote machine + # * --pipepart/--pipe should be done on the local machine inside --tmux + # Uses: + # $opt::shellquote + # $opt::nice + # $Global::shell + # $opt::cat + # $opt::fifo + # @Global::cat_prepends + # $opt::pipe + # $opt::tmux + # Returns: + # $self->{'wrapped'} = the command wrapped with the above + my $self = shift; + if(not defined $self->{'wrapped'}) { + my $command = $self->replaced(); + # Bug in Bash and Ksh when running multiline aliases + # This will force them to run correctly, but will fail in + # tcsh so we do not do it. + # $command .= "\n\n"; + if($opt::shellquote) { + # Prepend /bin/echo (echo no-/bin is wrong in csh) + # and quote twice + $command = "/bin/echo " . + ::shell_quote_scalar(::shell_quote_scalar($command)); + } + if($ENV{'PARALLEL_ENV'}) { + if(-e $ENV{'PARALLEL_ENV'}) { + # This is a file/fifo: Replace envvar with content of file + open(my $parallel_env, "<", $ENV{'PARALLEL_ENV'}) || + ::die_bug("Cannot read parallel_env from $ENV{'PARALLEL_ENV'}"); + local $/; + $ENV{'PARALLEL_ENV'} = <$parallel_env>; + close $parallel_env; + } + # If $PARALLEL_ENV set, put that in front of the command + # Used for env_parallel.* + # Map \001 to \n to make it easer to quote \n in $PARALLEL_ENV + $ENV{'PARALLEL_ENV'} =~ s/\001/\n/g; + if($Global::shell =~ /zsh/) { + # The extra 'eval' will make aliases work, too + $command = $ENV{'PARALLEL_ENV'}."\n". + "eval ".::shell_quote_scalar($command); + } else { + $command = $ENV{'PARALLEL_ENV'}."\n".$command; + } + } + if($opt::cat) { + # In '--cat' and '--fifo' {} == $PARALLEL_TMP. + # This is to make it possible to compute $PARALLEL_TMP on + # the fly when running remotely. + # $ENV{PARALLEL_TMP} is set in the remote wrapper before + # the command is run. + # + # Prepend 'cat > $PARALLEL_TMP;' + # Append 'unlink $PARALLEL_TMP without affecting $?' + $command = + 'cat > $PARALLEL_TMP;'. + $command.";". postpone_exit_and_cleanup(). + '$PARALLEL_TMP'; + } elsif($opt::fifo) { + # Prepend fifo-wrapper. In essence: + # mkfifo {} + # ( $command ) & + # # $command must read {}, otherwise this 'cat' will block + # cat > {}; + # wait; rm {} + # without affecting $? + $command = fifo_wrap(). " ". + $Global::shell. " ". + ::shell_quote_scalar($command). + ' $PARALLEL_TMP'. + ';'; + } + # Wrap with ssh + tranferring of files + $command = $self->sshlogin_wrap($command); + if(@Global::cat_prepends) { + # --pipepart: prepend: + # < /tmp/foo perl -e 'while(@ARGV) { + # sysseek(STDIN,shift,0) || die; $left = shift; + # while($read = sysread(STDIN,$buf, ($left > 131072 ? 131072 : $left))){ + # $left -= $read; syswrite(STDOUT,$buf); + # } + # }' 0 0 0 11 | + # + # --pipepart --tee: prepend: + # < dash-a-file + # + # --pipe --tee: wrap: + # (rm fifo; ... ) < fifo + $command = (shift @Global::cat_prepends). "($command)". + (shift @Global::cat_appends); + } elsif($opt::pipe) { + # Wrap with EOF-detector to avoid starting $command if EOF. + $command = empty_input_wrapper($command); + } + if($opt::tmux) { + # Wrap command with 'tmux' + $command = $self->tmux_wrap($command); + } + if($Global::cshell + and + length $command > 499) { + # csh does not like words longer than 1000 (499 quoted) + # $command = "perl -e '".base64_zip_eval()."' ". + # join" ",string_zip_base64( + # 'exec "'.::perl_quote_scalar($command).'"'); + $command = base64_wrap("exec \"$Global::shell\",'-c',\"". + ::perl_quote_scalar($command).'"'); + } + $self->{'wrapped'} = $command; + } + return $self->{'wrapped'}; +} + +sub set_sshlogin { + my $self = shift; + my $sshlogin = shift; + $self->{'sshlogin'} = $sshlogin; + delete $self->{'sshlogin_wrap'}; # If sshlogin is changed the wrap is wrong + delete $self->{'wrapped'}; + + if($opt::sqlworker) { + # Identify worker as --sqlworker often runs on different machines + my $host = $sshlogin->string(); + if($host eq ":") { + $host = ::hostname(); + } + $Global::sql->update("SET Host = ? WHERE Seq = ".$self->seq(), $host); + } +} + +sub sshlogin { + my $self = shift; + return $self->{'sshlogin'}; +} + +sub string_base64 { + # Base64 encode strings into 1000 byte blocks. + # 1000 bytes is the largest word size csh supports + # Input: + # @strings = to be encoded + # Returns: + # @base64 = 1000 byte block + $Global::use{"MIME::Base64"} ||= eval "use MIME::Base64; 1;"; + my @base64 = unpack("(A1000)*",encode_base64((join"",@_),"")); + return @base64; +} + +sub string_zip_base64 { + # Pipe string through 'bzip2 -9' and base64 encode it into 1000 + # byte blocks. + # 1000 bytes is the largest word size csh supports + # Zipping will make exporting big environments work, too + # Input: + # @strings = to be encoded + # Returns: + # @base64 = 1000 byte block + my($zipin_fh, $zipout_fh,@base64); + ::open3($zipin_fh,$zipout_fh,">&STDERR","bzip2 -9"); + if(fork) { + close $zipin_fh; + $Global::use{"MIME::Base64"} ||= eval "use MIME::Base64; 1;"; + # Split base64 encoded into 1000 byte blocks + @base64 = unpack("(A1000)*",encode_base64((join"",<$zipout_fh>),"")); + close $zipout_fh; + } else { + close $zipout_fh; + print $zipin_fh @_; + close $zipin_fh; + exit; + } + ::debug("base64","Orig:@_\nAs bzip2 base64:@base64\n"); + return @base64; +} + +sub base64_zip_eval { + # Script that: + # * reads base64 strings from @ARGV + # * decodes them + # * pipes through 'bzip2 -dc' + # * evals the result + # Reverse of string_zip_base64 + eval + # Will be wrapped in ' so single quote is forbidden + # Returns: + # $script = 1-liner for perl -e + my $script = ::spacefree(0,q{ + @GNU_Parallel = split /_/, "use_IPC::Open3;_use_MIME::Base64"; + eval"@GNU_Parallel"; + $chld = $SIG{CHLD}; + $SIG{CHLD} = "IGNORE"; + # Search for bzip2. Not found => use default path + my $zip = (grep { -x $_ } "/usr/local/bin/bzip2")[0] || "bzip2"; + # $in = stdin on $zip, $out = stdout from $zip + # Forget my() to save chars for csh + # my($in, $out,$eval); + open3($in,$out,">&STDERR",$zip,"-dc"); + if(my $perlpid = fork) { + close $in; + $eval = join "", <$out>; + close $out; + } else { + close $out; + # Pipe decoded base64 into 'bzip2 -dc' + print $in (decode_base64(join"",@ARGV)); + close $in; + exit; + } + wait; + $SIG{CHLD} = $chld; + eval $eval; + }); + ::debug("base64",$script,"\n"); + return $script; +} + +sub base64_wrap { + # base64 encode Perl code + # Split it into chunks of < 1000 bytes + # Prepend it with a decoder that eval's it + # Input: + # $eval_string = Perl code to run + # Returns: + # $shell_command = shell command that runs $eval_string + my $eval_string = shift; + return + "perl -e ". + ::shell_quote_scalar(base64_zip_eval())." ". + join" ",::shell_quote(string_zip_base64($eval_string)); +} + +sub base64_eval { + # Script that: + # * reads base64 strings from @ARGV + # * decodes them + # * evals the result + # Reverse of string_base64 + eval + # Will be wrapped in ' so single quote is forbidden. + # Spaces are stripped so spaces cannot be significant. + # The funny 'use IPC::Open3'-syntax is to avoid spaces and + # to make it clear that this is a GNU Parallel command + # when looking at the process table. + # Returns: + # $script = 1-liner for perl -e + my $script = ::spacefree(0,q{ + @GNU_Parallel=("use","IPC::Open3;","use","MIME::Base64"); + eval "@GNU_Parallel"; + my $eval = decode_base64(join"",@ARGV); + eval $eval; + }); + ::debug("base64",$script,"\n"); + return $script; +} + +sub sshlogin_wrap { + # Wrap the command with the commands needed to run remotely + # Input: + # $command = command to run + # Returns: + # $self->{'sshlogin_wrap'} = command wrapped with ssh+transfer commands + sub monitor_parent_sshd_script { + # This script is to solve the problem of + # * not mixing STDERR and STDOUT + # * terminating with ctrl-c + # If its parent is ssh: all good + # If its parent is init(1): ssh died, so kill children + my $monitor_parent_sshd_script; + + if(not $monitor_parent_sshd_script) { + $monitor_parent_sshd_script = + # This will be packed in ', so only use " + ::spacefree(0,'$shell = "'.($ENV{'PARALLEL_SHELL'} || '$ENV{SHELL}').'";'. + '$tmpdir = "'.::perl_quote_scalar($ENV{'TMPDIR'}).'";'. + '$nice = '.$opt::nice.';'. + q{ + # Set $PARALLEL_TMP to a non-existent file name in $TMPDIR + do { + $ENV{PARALLEL_TMP} = $tmpdir."/par". + join"", map { (0..9,"a".."z","A".."Z")[rand(62)] } (1..5); + } while(-e $ENV{PARALLEL_TMP}); + $SIG{CHLD} = sub { $done = 1; }; + $pid = fork; + unless($pid) { + # Make own process group to be able to kill HUP it later + eval { setpgrp }; + eval { setpriority(0,0,$nice) }; + exec $shell, "-c", ($bashfunc."@ARGV"); + die "exec: $!\n"; + } + do { + # Parent is not init (ppid=1), so sshd is alive + # Exponential sleep up to 1 sec + $s = $s < 1 ? 0.001 + $s * 1.03 : $s; + select(undef, undef, undef, $s); + } until ($done || getppid == 1); + # Kill HUP the process group if job not done + kill(SIGHUP, -${pid}) unless $done; + wait; + exit ($?&127 ? 128+($?&127) : 1+$?>>8) + }); + } + return $monitor_parent_sshd_script; + } + + sub vars_to_export { + # Uses: + # @opt::env + my @vars = ("parallel_bash_environment"); + for my $varstring (@opt::env) { + # Split up --env VAR1,VAR2 + push @vars, split /,/, $varstring; + } + for (@vars) { + if(-r $_ and not -d) { + # Read as environment definition bug #44041 + # TODO parse this + my $fh = ::open_or_exit($_); + $Global::envdef = join("",<$fh>); + close $fh; + } + } + if(grep { /^_$/ } @vars) { + local $/ = "\n"; + # --env _ + # Include all vars that are not in a clean environment + if(open(my $vars_fh, "<", $Global::config_dir . "/ignored_vars")) { + my @ignore = <$vars_fh>; + chomp @ignore; + my %ignore; + @ignore{@ignore} = @ignore; + close $vars_fh; + push @vars, grep { not defined $ignore{$_} } keys %ENV; + @vars = grep { not /^_$/ } @vars; + } else { + ::error("Run '$Global::progname --record-env' ". + "in a clean environment first."); + ::wait_and_exit(255); + } + } + # Duplicate vars as BASH functions to include post-shellshock functions (v1+v2) + # So --env myfunc should look for BASH_FUNC_myfunc() and BASH_FUNC_myfunc%% + push(@vars, "PARALLEL_PID", "PARALLEL_SEQ", + map { ("BASH_FUNC_$_()", "BASH_FUNC_$_%%") } @vars); + # Keep only defined variables + return grep { defined($ENV{$_}) } @vars; + } + + sub env_as_eval { + # Returns: + # $eval = '$ENV{"..."}=...; ...' + my @vars = vars_to_export(); + my $csh_friendly = not grep { /\n/ } @ENV{@vars}; + my @bash_functions = grep { substr($ENV{$_},0,4) eq "() {" } @vars; + my @non_functions = (grep { !/PARALLEL_ENV/ } + grep { substr($ENV{$_},0,4) ne "() {" } @vars); + + # eval of @envset will set %ENV + my $envset = join"", map { + '$ENV{"'.::perl_quote_scalar($_).'"}="'. + ::perl_quote_scalar($ENV{$_}).'";'; } @non_functions; + + # running @bashfunc on the command line, will set the functions + my @bashfunc = map { + my $v=$_; + s/BASH_FUNC_(.*)(\(\)|%%)/$1/; + "$_$ENV{$v};export -f $_ >/dev/null;" } @bash_functions; + # eval $bashfuncset will set $bashfunc + my $bashfuncset; + if(@bashfunc) { + # Functions are not supported for all shells + if($Global::shell !~ m:(bash|rbash|zsh|rzsh|dash|ksh):) { + ::warning("Shell functions may not be supported in $Global::shell."); + } + $bashfuncset = + '@bash_functions=qw('."@bash_functions".");". + ::spacefree(1,'$shell="'.($ENV{'PARALLEL_SHELL'} || '$ENV{SHELL}').'";'.q{ + if($shell=~/csh/) { + print STDERR "CSH/TCSH DO NOT SUPPORT newlines IN VARIABLES/FUNCTIONS. Unset @bash_functions\n"; + exec "false"; + } + }). + "\n".'$bashfunc = "'.::perl_quote_scalar("@bashfunc").'";'; + } else { + $bashfuncset = '$bashfunc = "";' + } + if($ENV{"parallel_bash_environment"}) { + $bashfuncset .= '$bashfunc .= "eval\ \"\$parallel_bash_environment\"\;";'; + } + ::debug("base64",$envset,$bashfuncset,"\n"); + return $csh_friendly,$envset,$bashfuncset; + } + + my $self = shift; + my $command = shift; + # TODO test that *sh -c 'parallel --env' use *sh + if(not defined $self->{'sshlogin_wrap'}) { + my $sshlogin = $self->sshlogin(); + my $serverlogin = $sshlogin->serverlogin(); + my $quoted_remote_command; + $ENV{'PARALLEL_SEQ'} = $self->seq(); + $ENV{'PARALLEL_PID'} = $$; + if($serverlogin eq ":") { + if($opt::workdir) { + # Create workdir if needed. Then cd to it. + my $wd = $self->workdir(); + if($opt::workdir eq "." or $opt::workdir eq "...") { + # If $wd does not start with '/': Prepend $HOME + $wd =~ s:^([^/]):$ENV{'HOME'}/$1:; + } + ::mkdir_or_die($wd); + $command = "cd ".::shell_quote_scalar($wd)." || exit 255; ".$command; + } + if(@opt::env) { + # Prepend with environment setter, which sets functions in zsh + my ($csh_friendly,$envset,$bashfuncset) = env_as_eval(); + my $perl_code = $envset.$bashfuncset. + '@ARGV="'.::perl_quote_scalar($command).'";'. + "exec\"$Global::shell\",\"-c\",\(\$bashfunc.\"\@ARGV\"\)\;die\"exec:\$\!\\n\"\;"; + if(length $perl_code > 999 + or + not $csh_friendly + or + $command =~ /\n/) { + # csh does not deal well with > 1000 chars in one word + # csh does not deal well with $ENV with \n + $self->{'sshlogin_wrap'} = base64_wrap($perl_code); + } else { + $self->{'sshlogin_wrap'} = "perl -e ".::shell_quote_scalar($perl_code); + } + } else { + $self->{'sshlogin_wrap'} = $command; + } + } else { + my $pwd = ""; + if($opt::workdir) { + # Create remote workdir if needed. Then cd to it. + my $wd = $self->workdir(); + $pwd = qq{system("mkdir","-p","--","$wd"); chdir "$wd" ||}. + qq{print(STDERR "parallel: Cannot chdir to $wd\\n") && exit 255;}; + } + my ($csh_friendly,$envset,$bashfuncset) = env_as_eval(); + my $remote_command = $pwd.$envset.$bashfuncset. + '@ARGV="'.::perl_quote_scalar($command).'";'. + monitor_parent_sshd_script(); + $quoted_remote_command = "perl -e ". + ::shell_quote_scalar($remote_command); + my $dq_remote_command = + ::shell_quote_scalar($quoted_remote_command); + if(length $dq_remote_command > 999 + or + not $csh_friendly + or + $command =~ /\n/) { + # csh does not deal well with > 1000 chars in one word + # csh does not deal well with $ENV with \n + $quoted_remote_command = + "perl -e ". + ::shell_quote_scalar(::shell_quote_scalar(base64_zip_eval()))." ". + join" ",::shell_quote(::shell_quote(string_zip_base64($remote_command))); + } else { + $quoted_remote_command = $dq_remote_command; + } + + my $sshcmd = $sshlogin->sshcommand(); + my ($pre,$post,$cleanup)=("","",""); + # --transfer + $pre .= $self->sshtransfer(); + # --return + $post .= $self->sshreturn(); + # --cleanup + $post .= $self->sshcleanup(); + if($post) { + # We need to save the exit status of the job + $post = '_EXIT_status=$?; ' . $post . ' exit $_EXIT_status;'; + } + $self->{'sshlogin_wrap'} = + ($pre + . "$sshcmd $serverlogin -- exec " + . $quoted_remote_command + . ";" + . $post); + } + } + return $self->{'sshlogin_wrap'}; +} + +sub transfer { + # Files to transfer + # Non-quoted and with {...} substituted + # Returns: + # @transfer - File names of files to transfer + my $self = shift; + + my $transfersize = 0; + my @transfer = $self->{'commandline'}-> + replace_placeholders($self->{'commandline'}{'transfer_files'},0,0); + for(@transfer) { + # filesize + if(-e $_) { + $transfersize += (stat($_))[7]; + } + } + $self->add_transfersize($transfersize); + return @transfer; +} + +sub transfersize { + my $self = shift; + return $self->{'transfersize'}; +} + +sub add_transfersize { + my $self = shift; + my $transfersize = shift; + $self->{'transfersize'} += $transfersize; + $opt::sqlworker and + $Global::sql->update("SET Send = ? WHERE Seq = ".$self->seq(), + $self->{'transfersize'}); +} + +sub sshtransfer { + # Returns for each transfer file: + # rsync $file remote:$workdir + my $self = shift; + my @pre; + my $sshlogin = $self->sshlogin(); + my $workdir = $self->workdir(); + for my $file ($self->transfer()) { + push @pre, $sshlogin->rsync_transfer_cmd($file,$workdir).";"; + } + return join("",@pre); +} + +sub return { + # Files to return + # Non-quoted and with {...} substituted + # Returns: + # @non_quoted_filenames + my $self = shift; + return $self->{'commandline'}-> + replace_placeholders($self->{'commandline'}{'return_files'},0,0); +} + +sub returnsize { + # This is called after the job has finished + # Returns: + # $number_of_bytes transferred in return + my $self = shift; + for my $file ($self->return()) { + if(-e $file) { + $self->{'returnsize'} += (stat($file))[7]; + } + } + return $self->{'returnsize'}; +} + +sub add_returnsize { + my $self = shift; + my $returnsize = shift; + $self->{'returnsize'} += $returnsize; + $opt::sqlworker and + $Global::sql->update("SET Receive = ? WHERE Seq = ".$self->seq(), + $self->{'returnsize'}); +} + +sub sshreturn { + # Returns for each return-file: + # rsync remote:$workdir/$file . + my $self = shift; + my $sshlogin = $self->sshlogin(); + my $sshcmd = $sshlogin->sshcommand(); + my $serverlogin = $sshlogin->serverlogin(); + my $rsync_opts = $ENV{'PARALLEL_RSYNC_OPTS'}. + " -e".::shell_quote_scalar($sshcmd); + my $pre = ""; + for my $file ($self->return()) { + $file =~ s:^\./::g; # Remove ./ if any + my $relpath = ($file !~ m:^/:) || ($file =~ m:/\./:); # Is the path relative or /./? + my $cd = ""; + my $wd = ""; + if($relpath) { + # rsync -avR /foo/./bar/baz.c remote:/tmp/ + # == (on old systems) + # rsync -avR --rsync-path="cd /foo; rsync" remote:bar/baz.c /tmp/ + $wd = ::shell_quote_file($self->workdir()."/"); + } + # Only load File::Basename if actually needed + $Global::use{"File::Basename"} ||= eval "use File::Basename; 1;"; + # dir/./file means relative to dir, so remove dir on remote + $file =~ m:(.*)/\./:; + my $basedir = $1 ? ::shell_quote_file($1."/") : ""; + my $nobasedir = $file; + $nobasedir =~ s:.*/\./::; + $cd = ::shell_quote_file(::dirname($nobasedir)); + my $rsync_cd = '--rsync-path='.::shell_quote_scalar("cd $wd$cd; rsync"); + my $basename = + ::shell_quote_scalar(::shell_quote_file(::basename($file))); + # --return + # mkdir -p /home/tange/dir/subdir/; + # rsync (--protocol 30) -rlDzR + # --rsync-path="cd /home/tange/dir/subdir/; rsync" + # server:file.gz /home/tange/dir/subdir/ + $pre .= "mkdir -p $basedir$cd && ". $sshlogin->rsync(). + " $rsync_cd $rsync_opts $serverlogin:". + $basename . " ".$basedir.$cd.";"; + } + return $pre; +} + +sub sshcleanup { + # Return the sshcommand needed to remove the file + # Returns: + # ssh command needed to remove files from sshlogin + my $self = shift; + my $sshlogin = $self->sshlogin(); + my $sshcmd = $sshlogin->sshcommand(); + my $serverlogin = $sshlogin->serverlogin(); + my $workdir = $self->workdir(); + my $cleancmd = ""; + + for my $file ($self->remote_cleanup()) { + my @subworkdirs = parentdirs_of($file); + $cleancmd .= $sshlogin->cleanup_cmd($file,$workdir).";"; + } + if(defined $opt::workdir and $opt::workdir eq "...") { + $cleancmd .= "$sshcmd $serverlogin -- rm -rf " . ::shell_quote_scalar($workdir).';'; + } + return $cleancmd; +} + +sub remote_cleanup { + # Returns: + # Files to remove at cleanup + my $self = shift; + if($opt::cleanup) { + my @transfer = $self->transfer(); + my @return = $self->return(); + return (@transfer,@return); + } else { + return (); + } +} + +sub workdir { + # Returns: + # the workdir on a remote machine + my $self = shift; + if(not defined $self->{'workdir'}) { + my $workdir; + if(defined $opt::workdir) { + if($opt::workdir eq ".") { + # . means current dir + my $home = $ENV{'HOME'}; + eval 'use Cwd'; + my $cwd = cwd(); + $workdir = $cwd; + if($home) { + # If homedir exists: remove the homedir from + # workdir if cwd starts with homedir + # E.g. /home/foo/my/dir => my/dir + # E.g. /tmp/my/dir => /tmp/my/dir + my ($home_dev, $home_ino) = (stat($home))[0,1]; + my $parent = ""; + my @dir_parts = split(m:/:,$cwd); + my $part; + while(defined ($part = shift @dir_parts)) { + $part eq "" and next; + $parent .= "/".$part; + my ($parent_dev, $parent_ino) = (stat($parent))[0,1]; + if($parent_dev == $home_dev and $parent_ino == $home_ino) { + # dev and ino is the same: We found the homedir. + $workdir = join("/",@dir_parts); + last; + } + } + } + if($workdir eq "") { + $workdir = "."; + } + } elsif($opt::workdir eq "...") { + $workdir = ".parallel/tmp/" . ::hostname() . "-" . $$ + . "-" . $self->seq(); + } else { + $workdir = $self->{'commandline'}-> + replace_placeholders([$opt::workdir],0,0); + #$workdir = $opt::workdir; + # Rsync treats /./ special. We dont want that + $workdir =~ s:/\./:/:g; # Remove /./ + $workdir =~ s:(.)/+$:$1:; # Remove ending / if any + $workdir =~ s:^\./::g; # Remove starting ./ if any + } + } else { + $workdir = "."; + } + $self->{'workdir'} = ::shell_quote_scalar($workdir); + } + return $self->{'workdir'}; +} + +sub parentdirs_of { + # Return: + # all parentdirs except . of this dir or file - sorted desc by length + my $d = shift; + my @parents = (); + while($d =~ s:/[^/]+$::) { + if($d ne ".") { + push @parents, $d; + } + } + return @parents; +} + +sub start { + # Setup STDOUT and STDERR for a job and start it. + # Returns: + # job-object or undef if job not to run + + sub open3_setpgrp_internal { + # Run open3+setpgrp followed by the command + # Input: + # $stdin_fh = Filehandle to use as STDIN + # $stdout_fh = Filehandle to use as STDOUT + # $stderr_fh = Filehandle to use as STDERR + # $command = Command to run + # Returns: + # $pid = Process group of job started + my ($stdin_fh,$stdout_fh,$stderr_fh,$command) = @_; + my $pid; + local (*OUT,*ERR); + open OUT, '>&', $stdout_fh or ::die_bug("Can't dup STDOUT: $!"); + open ERR, '>&', $stderr_fh or ::die_bug("Can't dup STDERR: $!"); + # The eval is needed to catch exception from open3 + eval { + if(not $pid = ::open3($stdin_fh, ">&OUT", ">&ERR", "-")) { + # Each child gets its own process group to make it safe to killall + eval{ setpgrp(0,0) }; + eval{ setpriority(0,0,$opt::nice) }; + exec($Global::shell,"-c",$command) + || ::die_bug("open3-$stdin_fh $command"); + } + }; + return $pid; + } + + sub open3_setpgrp_external { + # Run open3 on $command wrapped with a perl script doing setpgrp + # Works on systems that do not support open3(,,,"-") + # Input: + # $stdin_fh = Filehandle to use as STDIN + # $stdout_fh = Filehandle to use as STDOUT + # $stderr_fh = Filehandle to use as STDERR + # $command = Command to run + # Returns: + # $pid = Process group of job started + my ($stdin_fh,$stdout_fh,$stderr_fh,$command) = @_; + local (*OUT,*ERR); + open OUT, '>&', $stdout_fh or ::die_bug("Can't dup STDOUT: $!"); + open ERR, '>&', $stderr_fh or ::die_bug("Can't dup STDERR: $!"); + + my $pid; + my @setpgrp_wrap = + ('perl','-e', + "eval\{setpgrp\}\;eval\{setpriority\(0,0,$opt::nice\)\}\;". + "exec '$Global::shell', '-c', \@ARGV"); + # The eval is needed to catch exception from open3 + eval { + $pid = ::open3($stdin_fh, ">&OUT", ">&ERR", @setpgrp_wrap, $command) + || ::die_bug("open3-$stdin_fh"); + 1; + }; + return $pid; + } + + sub open3_setpgrp { + # Select and run open3_setpgrp_internal/open3_setpgrp_external + no warnings 'redefine'; + my ($outfh,$name) = ::tmpfile(SUFFIX => ".tst"); + # Test to see if open3(x,x,x,"-") is fully supported + # Can an exported bash function be called via open3? + my $script = 'if($pid=::open3($i,$o,$e,"-")) { wait; } '. + 'else { exec("bash","-c","testfun && true"); }'; + my $bash = + ::shell_quote_scalar_default( + "testfun() { rm $name; }; export -f testfun; ". + "perl -MIPC::Open3 -e ". + ::shell_quote_scalar_default($script) + ); + # Redirect STDERR temporarily, + # so errors on MacOS X are ignored. + open my $saveerr, ">&STDERR"; + open STDERR, '>', "/dev/null"; + # Run the test + ::debug("init",qq{bash -c $bash 2>/dev/null}); + qx{ bash -c $bash 2>/dev/null }; + open STDERR, ">&", $saveerr; + + if(-e $name) { + # Does not support open3(x,x,x,"-") + # or does not have bash: + # Use (slow) external version + unlink($name); + *open3_setpgrp = \&open3_setpgrp_external; + ::debug("init","open3_setpgrp_external chosen\n"); + } else { + # Supports open3(x,x,x,"-") + # This is 0.5 ms faster to run + *open3_setpgrp = \&open3_setpgrp_internal; + ::debug("init","open3_setpgrp_internal chosen\n"); + } + # The sub is now redefined. Call it + return open3_setpgrp(@_); + } + + my $job = shift; + # Get the shell command to be executed (possibly with ssh infront). + my $command = $job->wrapped(); + my $pid; + + if($Global::interactive or $Global::stderr_verbose) { + $job->interactive_start(); + } + # Must be run after $job->interactive_start(): + # $job->interactive_start() may call $job->skip() + if($job->{'commandline'}{'skip'}) { + # $job->skip() was called + $command = "true"; + } + $job->openoutputfiles(); + $job->print_verbose_dryrun(); + # Call slot to store the slot value + $job->slot(); + my($stdout_fh,$stderr_fh) = ($job->fh(1,"w"),$job->fh(2,"w")); + if($opt::dryrun or $opt::sqlmaster) { $command = "true"; } + $ENV{'PARALLEL_SEQ'} = $job->seq(); + $ENV{'PARALLEL_PID'} = $$; + $ENV{'PARALLEL_TMP'} = ::tmpname("par"); + $job->add_rm($ENV{'PARALLEL_TMP'}); + ::debug("run", $Global::total_running, " processes . Starting (", + $job->seq(), "): $command\n"); + if($opt::pipe) { + my ($stdin_fh) = ::gensym(); + $pid = open3_setpgrp($stdin_fh,$stdout_fh,$stderr_fh,$command); + if($opt::roundrobin and not $opt::keeporder) { + # --keep-order will make sure the order will be reproducible + ::set_fh_non_blocking($stdin_fh); + } + $job->set_fh(0,"w",$stdin_fh); + if($opt::tee) { $job->set_virgin(0); } + } elsif ($opt::tty and -c "/dev/tty" and + open(my $devtty_fh, "<", "/dev/tty")) { + # Give /dev/tty to the command if no one else is using it + # The eval is needed to catch exception from open3 + local (*IN,*OUT,*ERR); + open OUT, '>&', $stdout_fh or ::die_bug("Can't dup STDOUT: $!"); + open ERR, '>&', $stderr_fh or ::die_bug("Can't dup STDERR: $!"); + *IN = $devtty_fh; + # The eval is needed to catch exception from open3 + my @wrap = ('perl','-e', + "eval\{setpriority\(0,0,$opt::nice\)\}\;". + "exec '$Global::shell', '-c', \@ARGV"); + eval { + $pid = ::open3("<&IN", ">&OUT", ">&ERR", @wrap, $command) + || ::die_bug("open3-/dev/tty"); + 1; + }; + close $devtty_fh; + $job->set_virgin(0); + } else { + $pid = open3_setpgrp(::gensym(),$stdout_fh,$stderr_fh,$command); + $job->set_virgin(0); + } + if($pid) { + # A job was started + $Global::total_running++; + $Global::total_started++; + $job->set_pid($pid); + $job->set_starttime(); + $Global::running{$job->pid()} = $job; + if($opt::timeout) { + $Global::timeoutq->insert($job); + } + $Global::newest_job = $job; + $Global::newest_starttime = ::now(); + return $job; + } else { + # No more processes + ::debug("run", "Cannot spawn more jobs.\n"); + return undef; + } +} + +sub interactive_start { + my $self = shift; + my $command = $self->wrapped(); + if($Global::interactive) { + ::status_no_nl("$command ?..."); + open(my $tty_fh, "<", "/dev/tty") || ::die_bug("interactive-tty"); + my $answer = <$tty_fh>; + close $tty_fh; + my $run_yes = ($answer =~ /^\s*y/i); + if (not $run_yes) { + $self->{'commandline'}->skip(); + } + } else { + print $Global::original_stderr "$command\n"; + } +} + +{ + my $tmuxsocket; + + sub tmux_wrap { + # Wrap command with tmux for session pPID + # Input: + # $actual_command = the actual command being run (incl ssh wrap) + my $self = shift; + my $actual_command = shift; + # Temporary file name. Used for fifo to communicate exit val + my $tmpfifo = ::tmpname("tmx"); + $self->add_rm($tmpfifo); + + if(length($tmpfifo) >=100) { + ::error("tmux does not support sockets with path > 100."); + ::wait_and_exit(255); + } + if($opt::tmuxpane) { + # Move the command into a pane in window 0 + $actual_command = $ENV{'PARALLEL_TMUX'}.' joinp -t :0 ; '. + $ENV{'PARALLEL_TMUX'}.' select-layout -t :0 tiled ; '. + $actual_command; + } + my $visual_command = $self->replaced(); + my $title = $visual_command; + if($visual_command =~ /\0/) { + ::error("Command line contains NUL. tmux is confused by NUL."); + ::wait_and_exit(255); + } + # ; causes problems + # ascii 194-245 annoys tmux + $title =~ tr/[\011-\016;\302-\365]/ /s; + $title = ::shell_quote_scalar($title); + + my $l_act = length($actual_command); + my $l_tit = length($title); + my $l_fifo = length($tmpfifo); + # The line to run contains a 118 chars extra code + the title 2x + my $l_tot = 2 * $l_tit + $l_act + $l_fifo; + + my $quoted_space75 = ::shell_quote_scalar(" ")x75; + while($l_tit < 1000 and + ( + (890 < $l_tot and $l_tot < 1350) + or + (9250 < $l_tot and $l_tot < 9800) + )) { + # tmux blocks for certain lengths: + # 900 < title + command < 1200 + # 9250 < title + command < 9800 + # but only if title < 1000, so expand the title with 75 spaces + # The measured lengths are: + # 996 < (title + whole command) < 1127 + # 9331 < (title + whole command) < 9636 + $title .= $quoted_space75; + $l_tit = length($title); + $l_tot = 2 * $l_tit + $l_act + $l_fifo; + } + + my $tmux; + $ENV{'PARALLEL_TMUX'} ||= "tmux"; + if(not $tmuxsocket) { + $tmuxsocket = ::tmpname("tms"); + if($opt::fg) { + if(not fork) { + # Run tmux in the foreground + # Wait for the socket to appear + while (not -e $tmuxsocket) { } + `$ENV{'PARALLEL_TMUX'} -S $tmuxsocket attach`; + exit; + } + } + ::status("See output with: $ENV{'PARALLEL_TMUX'} -S $tmuxsocket attach"); + } + $tmux = "sh -c '". + $ENV{'PARALLEL_TMUX'}." -S $tmuxsocket new-session -s p$$ -d \"sleep .2\" >/dev/null 2>&1';" . + $ENV{'PARALLEL_TMUX'}." -S $tmuxsocket new-window -t p$$ -n $title"; + + ::debug("tmux", "title len:", $l_tit, " act ", $l_act, " max ", + $Limits::Command::line_max_len, " tot ", + $l_tot, "\n"); + + return "mkfifo $tmpfifo && $tmux ". + # Run in tmux + ::shell_quote_scalar + ( + "(".$actual_command.');'. + # The triple print is needed - otherwise the testsuite fails + q[ perl -e 'while($t++<3){ print $ARGV[0],"\n" }' $?h/$status >> ].$tmpfifo."&". + "echo $title; echo \007Job finished at: `date`;sleep 10" + ). + # Run outside tmux + # Read a / separated line: 0h/2 for csh, 2/0 for bash. + # If csh the first will be 0h, so use the second as exit value. + # Otherwise just use the first value as exit value. + q{; exec perl -e '$/="/";$_=<>;$c=<>;unlink $ARGV; /(\d+)h/ and exit($1);exit$c' }.$tmpfifo; + } +} + +sub is_already_in_results { + # Do we already have results for this job? + # Returns: + # $job_already_run = bool whether there is output for this or not + my $job = $_[0]; + my $out = $job->{'commandline'}->results_out(); + ::debug("run", "Test ${out}stdout", -e "${out}stdout", "\n"); + return(-e $out."stdout" or -f $out); +} + +sub is_already_in_joblog { + my $job = shift; + return vec($Global::job_already_run,$job->seq(),1); +} + +sub set_job_in_joblog { + my $job = shift; + vec($Global::job_already_run,$job->seq(),1) = 1; +} + +sub should_be_retried { + # Should this job be retried? + # Returns + # 0 - do not retry + # 1 - job queued for retry + my $self = shift; + if (not $opt::retries) { + return 0; + } + if(not $self->exitstatus() and not $self->exitsignal()) { + # Completed with success. If there is a recorded failure: forget it + $self->reset_failed_here(); + return 0; + } else { + # The job failed. Should it be retried? + $self->add_failed_here(); + my $retries = $self->{'commandline'}-> + replace_placeholders([$opt::retries],0,0); + if($self->total_failed() == $retries) { + # This has been retried enough + return 0; + } else { + # This command should be retried + $self->set_endtime(undef); + $self->reset_exitstatus(); + $Global::JobQueue->unget($self); + ::debug("run", "Retry ", $self->seq(), "\n"); + return 1; + } + } +} + +{ + my (%print_later,$job_seq_to_print); + + sub print_earlier_jobs { + # Print jobs whose output is postponed due to --keep-order + # Returns: N/A + my $job = shift; + $print_later{$job->seq()} = $job; + $job_seq_to_print ||= 1; + my $returnsize = 0; + ::debug("run", "Looking for: $job_seq_to_print ", + "This: ", $job->seq(), "\n"); + for(;vec($Global::job_already_run,$job_seq_to_print,1); + $job_seq_to_print++) {} + while(my $j = $print_later{$job_seq_to_print}) { + $returnsize += $j->print(); + if($j->endtime()) { + # Job finished - look at the next + delete $print_later{$job_seq_to_print}; + $job_seq_to_print++; + next; + } else { + # Job not finished yet - look at it again next round + last; + } + } + return $returnsize; + } +} + +sub print { + # Print the output of the jobs + # Returns: N/A + + my $self = shift; + ::debug("print", ">>joboutput ", $self->replaced(), "\n"); + if($opt::dryrun) { + # Nothing was printed to this job: + # cleanup tmp files if --files was set + ::rm($self->fh(1,"name")); + } + if($opt::pipe and $self->virgin() and not $opt::tee) { + # Skip --joblog, --dryrun, --verbose + } else { + if($opt::ungroup) { + # NULL returnsize = 0 returnsize + $self->returnsize() or $self->add_returnsize(0); + if($Global::joblog and defined $self->{'exitstatus'}) { + # Add to joblog when finished + $self->print_joblog(); + # Printing is only relevant for grouped/--line-buffer output. + $opt::ungroup and return; + } + } + + # Check for disk full + ::exit_if_disk_full(); + } + + my $returnsize = $self->returnsize(); + for my $fdno (sort { $a <=> $b } keys %Global::fd) { + # Sort by file descriptor numerically: 1,2,3,..,9,10,11 + $fdno == 0 and next; + my $out_fd = $Global::fd{$fdno}; + my $in_fh = $self->fh($fdno,"r"); + if(not $in_fh) { + if(not $Job::file_descriptor_warning_printed{$fdno}++) { + # ::warning("File descriptor $fdno not defined\n"); + } + next; + } + ::debug("print", "File descriptor $fdno (", $self->fh($fdno,"name"), "):\n"); + if($opt::linebuffer) { + # Line buffered print out + $self->print_linebuffer($fdno,$in_fh,$out_fd); + } elsif($opt::files) { + $self->print_files($fdno,$in_fh,$out_fd); + } elsif($opt::tag or defined $opt::tagstring) { + $self->print_tag($fdno,$in_fh,$out_fd); + } else { + $self->print_normal($fdno,$in_fh,$out_fd); + } + flush $out_fd; + } + ::debug("print", "<{'exitstatus'} + and not ($self->virgin() and $opt::pipe)) { + if($Global::joblog and not $opt::sqlworker) { + # Add to joblog when finished + $self->print_joblog(); + } + if($opt::sqlworker and not $opt::results) { + $Global::sql->output($self); + } + if($Global::csvsep) { + # Add output to CSV when finished + $self->print_csv(); + } + } + return $returnsize - $self->returnsize(); +} + +{ + my $header_printed; + + sub print_csv { + my $self = shift; + my $cmd; + if($Global::verbose <= 1) { + $cmd = $self->replaced(); + } else { + # Verbose level > 1: Print the rsync and stuff + $cmd = "@command"; + } + my $record_ref = $self->{'commandline'}{'arg_list_flat_orig'}; + + if(not $header_printed) { + # Variable headers + # Normal => V1..Vn + # --header : => first value from column + my @V; + if($opt::header) { + my $i = 1; + @V = (map { $Global::input_source_header{$i++} } + @$record_ref[1..$#$record_ref]); + } else { + my $V = "V1"; + @V = (map { $V++ } @$record_ref[1..$#$record_ref]); + } + print $Global::csv_fh + (map { $$_ } + combine_ref("Seq", "Host", "Starttime", "JobRuntime", + "Send", "Receive", "Exitval", "Signal", "Command", + @V, + "Stdout","Stderr" + )),"\n"; + $header_printed++; + } + # Memory optimization: Overwrite with the joined output + $self->{'output'}{1} = join("", @{$self->{'output'}{1}}); + $self->{'output'}{2} = join("", @{$self->{'output'}{2}}); + print $Global::csv_fh + (map { $$_ } + combine_ref + ($self->seq(), + $self->sshlogin()->string(), + $self->starttime(), sprintf("%0.3f",$self->runtime()), + $self->transfersize(), $self->returnsize(), + $self->exitstatus(), $self->exitsignal(), \$cmd, + \@$record_ref[1..$#$record_ref], + \$self->{'output'}{1}, + \$self->{'output'}{2})),"\n"; + } +} + +sub combine_ref { + # Inspired by Text::CSV_PP::_combine (by Makamaka Hannyaharamitu) + my @part = @_; + my $sep = $Global::csvsep; + my $quot = '"'; + my @out = (); + + my $must_be_quoted; + for my $column (@part) { + # Memory optimization: Content transferred as reference + if(ref $column ne "SCALAR") { + # Convert all columns to scalar references + my $v = $column; + $column = \$v; + } + if(not defined $$column) { + $$column = ''; + next; + } + + $must_be_quoted = 0; + + if($$column =~ s/$quot/$quot$quot/go){ + # Replace " => "" + $must_be_quoted ||=1; + } + if($$column =~ /[\s\Q$sep\E]/o){ + # Put quotes around if the column contains , + $must_be_quoted ||=1; + } + + $Global::use{"bytes"} ||= eval "use bytes; 1;"; + if ($$column =~ /\0/) { + # Contains \0 => put quotes around + $must_be_quoted ||=1; + } + if($must_be_quoted){ + push @out, \$sep, \$quot, $column, \$quot; + } else { + push @out, \$sep, $column; + } + } + # Pop off a $sep + shift @out; + return @out; +} + +sub print_files { + # Print the name of the file containing stdout on stdout + # Uses: + # $opt::pipe + # $opt::group = Print when job is done + # $opt::linebuffer = Print ASAP + # Returns: N/A + my $self = shift; + my ($fdno,$in_fh,$out_fd) = @_; + + # If the job is dead: close printing fh. Needed for --compress + close $self->fh($fdno,"w"); + if($? and $opt::compress) { + ::error($opt::compress_program." failed."); + $self->set_exitstatus(255); + } + if($opt::compress) { + # Kill the decompressor which will not be needed + CORE::kill "TERM", $self->fh($fdno,"rpid"); + } + close $in_fh; + + if($opt::pipe and $self->virgin()) { + # Nothing was printed to this job: + # cleanup unused tmp files because --files was set + for my $fdno (1,2) { + ::rm($self->fh($fdno,"name")); + ::rm($self->fh($fdno,"unlink")); + } + } elsif($fdno == 1 and $self->fh($fdno,"name")) { + print $out_fd $self->tag(),$self->fh($fdno,"name"),"\n"; + if($Global::membuffer) { + push @{$self->{'output'}{$fdno}}, + $self->tag(), $self->fh($fdno,"name"); + } + $self->add_returnsize(-s $self->fh($fdno,"name")); + # Mark as printed - do not print again + $self->set_fh($fdno,"name",undef); + } +} + +sub print_linebuffer { + my $self = shift; + my ($fdno,$in_fh,$out_fd) = @_; + if(defined $self->{'exitstatus'}) { + # If the job is dead: close printing fh. Needed for --compress + close $self->fh($fdno,"w"); + if($? and $opt::compress) { + ::error($opt::compress_program." failed."); + $self->set_exitstatus(255); + } + if($opt::compress) { + # Blocked reading in final round + for my $fdno (1,2) { + ::set_fh_blocking($self->fh($fdno,'r')); + } + } + } + if(not $self->virgin()) { + if($opt::files or ($opt::results and not $Global::csvsep)) { + # Print filename + if($fdno == 1 and not $self->fh($fdno,"printed")) { + print $out_fd $self->tag(),$self->fh($fdno,"name"),"\n"; + if($Global::membuffer) { + push(@{$self->{'output'}{$fdno}}, $self->tag(), + $self->fh($fdno,"name")); + } + $self->set_fh($fdno,"printed",1); + } + # No need for reading $in_fh, as it is from "cat >/dev/null" + } else { + # Read halflines and print full lines + my $outputlength = 0; + my $halfline_ref = $self->{'halfline'}{$fdno}; + my ($buf,$i,$rv); + while($rv = sysread($in_fh, $buf, 131072)) { + $outputlength += $rv; + # Treat both \n and \r as line end + $i = (rindex($buf,"\n")+1) || (rindex($buf,"\r")+1); + if($i) { + # One or more complete lines were found + if($opt::tag or defined $opt::tagstring) { + # Replace ^ with $tag within the full line + my $tag = $self->tag(); + substr($buf,0,$i-1) =~ s/(?<=[\n\r])/$tag/gm; + # The length changed, so find the new ending pos + $i = (rindex($buf,"\n")+1) || (rindex($buf,"\r")+1); + unshift @$halfline_ref, $tag; + } + # Print the partial line (halfline) and the last half + print $out_fd @$halfline_ref, substr($buf,0,$i); + # Buffer in memory for SQL and CSV-output + if($Global::membuffer) { + push(@{$self->{'output'}{$fdno}}, + @$halfline_ref, substr($buf,0,$i)); + } + # Remove the printed part by keeping the unprinted part + @$halfline_ref = (substr($buf,$i)); + } else { + # No newline, so append to the halfline + push @$halfline_ref, $buf; + } + } + $self->add_returnsize($outputlength); + } + if(defined $self->{'exitstatus'}) { + if($opt::files or ($opt::results and not $Global::csvsep)) { + $self->add_returnsize(-s $self->fh($fdno,"name")); + } else { + # If the job is dead: print the remaining partial line + # read remaining + my $halfline_ref = $self->{'halfline'}{$fdno}; + if(grep /./, @$halfline_ref) { + $self->add_returnsize(length join("",@$halfline_ref)); + if($opt::tag or defined $opt::tagstring) { + # Prepend $tag the the remaining half line + unshift @$halfline_ref, $self->tag(); + } + # Print the partial line (halfline) + print $out_fd @{$self->{'halfline'}{$fdno}}; + # Buffer in memory for SQL and CSV-output + if($Global::membuffer) { + push(@{$self->{'output'}{$fdno}}, @$halfline_ref); + } + @$halfline_ref = (); + } + } + if($self->fh($fdno,"rpid") and + CORE::kill 0, $self->fh($fdno,"rpid")) { + # decompress still running + } else { + # decompress done: close fh + close $in_fh; + if($? and $opt::compress) { + ::error($opt::decompress_program." failed."); + $self->set_exitstatus(255); + } + } + } + } +} + +sub print_tag { + return print_normal(@_); +} + +sub free_ressources() { + my $self = shift; + if(not $opt::ungroup) { + for my $fdno (sort { $a <=> $b } keys %Global::fd) { + close $self->fh($fdno,"w"); + close $self->fh($fdno,"r"); + } + } +} + +sub print_normal { + my $self = shift; + my ($fdno,$in_fh,$out_fd) = @_; + my $buf; + close $self->fh($fdno,"w"); + if($? and $opt::compress) { + ::error($opt::compress_program." failed."); + $self->set_exitstatus(255); + } + if(not $self->virgin()) { + seek $in_fh, 0, 0; + # $in_fh is now ready for reading at position 0 + my $outputlength = 0; + my @output; + + if($opt::tag or $opt::tagstring) { + # Read line by line + local $/ = "\n"; + my $tag = $self->tag(); + while(<$in_fh>) { + print $out_fd $tag,$_; + $outputlength += length $_; + if($Global::membuffer) { + push @{$self->{'output'}{$fdno}}, $tag, $_; + } + } + } else { + while(sysread($in_fh,$buf,131072)) { + print $out_fd $buf; + $outputlength += length $buf; + if($Global::membuffer) { + push @{$self->{'output'}{$fdno}}, $buf; + } + } + } + if($fdno == 1) { + $self->add_returnsize($outputlength); + } + close $in_fh; + if($? and $opt::compress) { + ::error($opt::decompress_program." failed."); + $self->set_exitstatus(255); + } + } +} + +sub print_joblog { + my $self = shift; + my $cmd; + if($Global::verbose <= 1) { + $cmd = $self->replaced(); + } else { + # Verbose level > 1: Print the rsync and stuff + $cmd = "@command"; + } + # Newlines make it hard to parse the joblog + $cmd =~ s/\n/\0/g; + print $Global::joblog + join("\t", $self->seq(), $self->sshlogin()->string(), + $self->starttime(), sprintf("%10.3f",$self->runtime()), + $self->transfersize(), $self->returnsize(), + $self->exitstatus(), $self->exitsignal(), $cmd + ). "\n"; + flush $Global::joblog; + $self->set_job_in_joblog(); +} + +sub tag { + my $self = shift; + if(not defined $self->{'tag'}) { + if($opt::tag or defined $opt::tagstring) { + $self->{'tag'} = $self->{'commandline'}-> + replace_placeholders([$opt::tagstring],0,0)."\t"; + } else { + $self->{'tag'} = ""; + } + } + return $self->{'tag'}; +} + +sub hostgroups { + my $self = shift; + if(not defined $self->{'hostgroups'}) { + $self->{'hostgroups'} = + $self->{'commandline'}->{'arg_list'}[0][0]->{'hostgroups'}; + } + return @{$self->{'hostgroups'}}; +} + +sub exitstatus { + my $self = shift; + return $self->{'exitstatus'}; +} + +sub set_exitstatus { + my $self = shift; + my $exitstatus = shift; + if($exitstatus) { + # Overwrite status if non-zero + $self->{'exitstatus'} = $exitstatus; + } else { + # Set status but do not overwrite + # Status may have been set by --timeout + $self->{'exitstatus'} ||= $exitstatus; + } + $opt::sqlworker and + $Global::sql->update("SET Exitval = ? WHERE Seq = ".$self->seq(), + $exitstatus); +} + +sub reset_exitstatus { + my $self = shift; + undef $self->{'exitstatus'}; +} + +sub exitsignal { + my $self = shift; + return $self->{'exitsignal'}; +} + +sub set_exitsignal { + my $self = shift; + my $exitsignal = shift; + $self->{'exitsignal'} = $exitsignal; + $opt::sqlworker and + $Global::sql->update("SET _Signal = ? WHERE Seq = ".$self->seq(), + $exitsignal); +} + +{ + my $status_printed; + my $total_jobs; + + sub should_we_halt { + # Should we halt? Immediately? Gracefully? + # Returns: N/A + my $job = shift; + my $limit; + if($job->exitstatus() or $job->exitsignal()) { + # Job failed + $Global::exitstatus++; + $Global::total_failed++; + if($Global::halt_fail) { + ::status("$Global::progname: This job failed:", + $job->replaced()); + $limit = $Global::total_failed; + } + } elsif($Global::halt_success) { + ::status("$Global::progname: This job succeeded:", + $job->replaced()); + $limit = $Global::total_completed - $Global::total_failed; + } + if($Global::halt_done) { + ::status("$Global::progname: This job finished:", + $job->replaced()); + $limit = $Global::total_completed; + } + if(not defined $limit) { + return "" + } + # --halt # => 1..100 (number of jobs failed, 101 means > 100) + # --halt % => 1..100 (pct of jobs failed) + if($Global::halt_pct and not $Global::halt_count) { + $total_jobs ||= $Global::JobQueue->total_jobs(); + # From the pct compute the number of jobs that must fail/succeed + $Global::halt_count = $total_jobs * $Global::halt_pct; + } + if($limit >= $Global::halt_count) { + # At least N jobs have failed/succeded/completed + # or at least N% have failed/succeded/completed + # So we should prepare for exit + if($Global::halt_fail or $Global::halt_done) { + # Set exit status + if(not defined $Global::halt_exitstatus) { + if($Global::halt_pct) { + # --halt now,fail=X% or soon,fail=X% + # --halt now,done=X% or soon,done=X% + $Global::halt_exitstatus = + ::ceil($Global::total_failed / $total_jobs * 100); + } elsif($Global::halt_count) { + # --halt now,fail=X or soon,fail=X + # --halt now,done=X or soon,done=X + $Global::halt_exitstatus = + ::min($Global::total_failed,101); + } + if($Global::halt_count and $Global::halt_count == 1) { + # --halt now,fail=1 or soon,fail=1 + # --halt now,done=1 or soon,done=1 + # Emulate Bash's +128 if there is a signal + $Global::halt_exitstatus = + ($job->exitstatus() + or + $job->exitsignal() ? $job->exitsignal() + 128 : 0); + } + } + ::debug("halt","Pct: ",$Global::halt_pct, + " count: ",$Global::halt_count, + " status: ",$Global::halt_exitstatus,"\n"); + } elsif($Global::halt_success) { + $Global::halt_exitstatus = 0; + } + if($Global::halt_when eq "soon" + and + (scalar(keys %Global::running) > 0 + or + $Global::max_jobs_running == 1)) { + ::status + ("$Global::progname: Starting no more jobs. ". + "Waiting for ". (keys %Global::running). + " jobs to finish."); + $Global::start_no_new_jobs ||= 1; + } + return($Global::halt_when); + } + return ""; + } +} + + +package CommandLine; + +sub new { + my $class = shift; + my $seq = shift; + my $commandref = shift; + $commandref || die; + my $arg_queue = shift; + my $context_replace = shift; + my $max_number_of_args = shift; # for -N and normal (-n1) + my $transfer_files = shift; + my $return_files = shift; + my $replacecount_ref = shift; + my $len_ref = shift; + my %replacecount = %$replacecount_ref; + my %len = %$len_ref; + for (keys %$replacecount_ref) { + # Total length of this replacement string {} replaced with all args + $len{$_} = 0; + } + return bless { + 'command' => $commandref, + 'seq' => $seq, + 'len' => \%len, + 'arg_list' => [], + 'arg_list_flat' => [], + 'arg_list_flat_orig' => [undef], + 'arg_queue' => $arg_queue, + 'max_number_of_args' => $max_number_of_args, + 'replacecount' => \%replacecount, + 'context_replace' => $context_replace, + 'transfer_files' => $transfer_files, + 'return_files' => $return_files, + 'replaced' => undef, + }, ref($class) || $class; +} + +sub seq { + my $self = shift; + return $self->{'seq'}; +} + +sub set_seq { + my $self = shift; + $self->{'seq'} = shift; +} + +sub slot { + # Find the number of a free job slot and return it + # Uses: + # @Global::slots - list with free jobslots + # Returns: + # $jobslot = number of jobslot + my $self = shift; + if(not $self->{'slot'}) { + if(not @Global::slots) { + # $max_slot_number will typically be $Global::max_jobs_running + push @Global::slots, ++$Global::max_slot_number; + } + $self->{'slot'} = shift @Global::slots; + } + return $self->{'slot'}; +} + +{ + my $already_spread; + + sub populate { + # Add arguments from arg_queue until the number of arguments or + # max line length is reached + # Uses: + # $Global::minimal_command_line_length + # $opt::cat + # $opt::fifo + # $Global::JobQueue + # $opt::m + # $opt::X + # $Global::max_jobs_running + # Returns: N/A + my $self = shift; + my $next_arg; + my $max_len = $Global::minimal_command_line_length + || Limits::Command::max_length(); + + if($opt::cat or $opt::fifo) { + # Get the empty arg added by --pipepart (if any) + $Global::JobQueue->{'commandlinequeue'}->{'arg_queue'}->get(); + # $PARALLEL_TMP will point to a tempfile that will be used as {} + $Global::JobQueue->{'commandlinequeue'}->{'arg_queue'}-> + unget([Arg->new('$PARALLEL_TMP')]); + } + while (not $self->{'arg_queue'}->empty()) { + $next_arg = $self->{'arg_queue'}->get(); + if(not defined $next_arg) { + next; + } + $self->push($next_arg); + if($self->len() >= $max_len) { + # Command length is now > max_length + # If there are arguments: remove the last + # If there are no arguments: Error + # TODO stuff about -x opt_x + if($self->number_of_args() > 1) { + # There is something to work on + $self->{'arg_queue'}->unget($self->pop()); + last; + } else { + my $args = join(" ", map { $_->orig() } @$next_arg); + ::error("Command line too long (". + $self->len(). " >= ". + $max_len. + ") at input ". + $self->{'arg_queue'}->arg_number(). + ": ". + ((length $args > 50) ? + (substr($args,0,50))."..." : + $args)); + $self->{'arg_queue'}->unget($self->pop()); + ::wait_and_exit(255); + } + } + + if(defined $self->{'max_number_of_args'}) { + if($self->number_of_args() >= $self->{'max_number_of_args'}) { + last; + } + } + } + if(($opt::m or $opt::X) and not $already_spread + and $self->{'arg_queue'}->empty() and $Global::max_jobs_running) { + # -m or -X and EOF => Spread the arguments over all jobslots + # (unless they are already spread) + $already_spread ||= 1; + if($self->number_of_args() > 1) { + $self->{'max_number_of_args'} = + ::ceil($self->number_of_args()/$Global::max_jobs_running); + $Global::JobQueue->{'commandlinequeue'}->{'max_number_of_args'} = + $self->{'max_number_of_args'}; + $self->{'arg_queue'}->unget($self->pop_all()); + while($self->number_of_args() < $self->{'max_number_of_args'}) { + $self->push($self->{'arg_queue'}->get()); + } + } + $Global::JobQueue->flush_total_jobs(); + } + + if($opt::sqlmaster) { + # Insert the V1..Vn for this $seq in SQL table instead of generating one + $Global::sql->insert_records($self->seq(), $self->{'command'}, + $self->{'arg_list_flat_orig'}); + } + } +} + +sub push { + # Add one or more records as arguments + # Returns: N/A + my $self = shift; + my $record = shift; + push @{$self->{'arg_list_flat_orig'}}, map { $_->orig() } @$record; + push @{$self->{'arg_list_flat'}}, @$record; + push @{$self->{'arg_list'}}, $record; + # Make @arg available for {= =} + *Arg::arg = $self->{'arg_list_flat_orig'}; + + my $quote_arg = $Global::noquote ? 0 : not $Global::quoting; + for my $perlexpr (keys %{$self->{'replacecount'}}) { + if($perlexpr =~ /^(\d+) /) { + # Positional + defined($record->[$1-1]) or next; + $self->{'len'}{$perlexpr} += + length $record->[$1-1]->replace($perlexpr,$quote_arg,$self); + } else { + for my $arg (@$record) { + if(defined $arg) { + $self->{'len'}{$perlexpr} += + length $arg->replace($perlexpr,$quote_arg,$self); + } + } + } + } +} + +sub pop { + # Remove last argument + # Returns: + # the last record + my $self = shift; + my $record = pop @{$self->{'arg_list'}}; + # pop off arguments from @$record + splice @{$self->{'arg_list_flat_orig'}}, -($#$record+1), $#$record+1; + splice @{$self->{'arg_list_flat'}}, -($#$record+1), $#$record+1; + my $quote_arg = $Global::noquote ? 0 : not $Global::quoting; + for my $perlexpr (keys %{$self->{'replacecount'}}) { + if($perlexpr =~ /^(\d+) /) { + # Positional + defined($record->[$1-1]) or next; + $self->{'len'}{$perlexpr} -= + length $record->[$1-1]->replace($perlexpr,$quote_arg,$self); + } else { + for my $arg (@$record) { + if(defined $arg) { + $self->{'len'}{$perlexpr} -= + length $arg->replace($perlexpr,$quote_arg,$self); + } + } + } + } + return $record; +} + +sub pop_all { + # Remove all arguments and zeros the length of replacement perlexpr + # Returns: + # all records + my $self = shift; + my @popped = @{$self->{'arg_list'}}; + for my $perlexpr (keys %{$self->{'replacecount'}}) { + $self->{'len'}{$perlexpr} = 0; + } + $self->{'arg_list'} = []; + $self->{'arg_list_flat_orig'} = [undef]; + $self->{'arg_list_flat'} = []; + return @popped; +} + +sub number_of_args { + # The number of records + # Returns: + # number of records + my $self = shift; + # This is really the number of records + return $#{$self->{'arg_list'}}+1; +} + +sub number_of_recargs { + # The number of args in records + # Returns: + # number of args records + my $self = shift; + my $sum = 0; + my $nrec = scalar @{$self->{'arg_list'}}; + if($nrec) { + $sum = $nrec * (scalar @{$self->{'arg_list'}[0]}); + } + return $sum; +} + +sub args_as_string { + # Returns: + # all unmodified arguments joined with ' ' (similar to {}) + my $self = shift; + return (join " ", map { $_->orig() } + map { @$_ } @{$self->{'arg_list'}}); +} + +sub results_out { + sub max_file_name_length { + # Figure out the max length of a subdir + # TODO and the max total length + # Ext4 = 255,130816 + # Uses: + # $Global::max_file_length is set + # Returns: + # $Global::max_file_length + my $testdir = shift; + + my $upper = 8_000_000; + # Dir length of 8 chars is supported everywhere + my $len = 8; + my $dir = "x"x$len; + do { + rmdir($testdir."/".$dir); + $len *= 16; + $dir = "x"x$len; + } while ($len < $upper and mkdir $testdir."/".$dir); + # Then search for the actual max length between $len/16 and $len + my $min = $len/16; + my $max = $len; + while($max-$min > 5) { + # If we are within 5 chars of the exact value: + # it is not worth the extra time to find the exact value + my $test = int(($min+$max)/2); + $dir = "x"x$test; + if(mkdir $testdir."/".$dir) { + rmdir($testdir."/".$dir); + $min = $test; + } else { + $max = $test; + } + } + $Global::max_file_length = $min; + return $min; + } + + my $self = shift; + my $out = $self->replace_placeholders([$opt::results],0,0); + if($out eq $opt::results) { + # $opt::results simple string: Append args_as_dirname + my $args_as_dirname = $self->args_as_dirname(); + # Output in: prefix/name1/val1/name2/val2/stdout + $out = $opt::results."/".$args_as_dirname; + if(-d $out or eval{ File::Path::mkpath($out); }) { + # OK + } else { + # mkpath failed: Argument probably too long. + # Set $Global::max_file_length, which will keep the individual + # dir names shorter than the max length + max_file_name_length($opt::results); + $args_as_dirname = $self->args_as_dirname(); + # prefix/name1/val1/name2/val2/ + $out = $opt::results."/".$args_as_dirname; + File::Path::mkpath($out); + } + $out .="/"; + } else { + if($out =~ m:/$:) { + # / = dir + if(-d $out or eval{ File::Path::mkpath($out); }) { + # OK + } else { + ::error("Cannot make dir '$out'."); + ::wait_and_exit(255); + } + } else { + $out =~ m:(.*)/:; + File::Path::mkpath($1); + } + } + return $out; +} + +sub args_as_dirname { + # Returns: + # all unmodified arguments joined with '/' (similar to {}) + # \t \0 \\ and / are quoted as: \t \0 \\ \_ + # If $Global::max_file_length: Keep subdirs < $Global::max_file_length + my $self = shift; + my @res = (); + + for my $rec_ref (@{$self->{'arg_list'}}) { + # If headers are used, sort by them. + # Otherwise keep the order from the command line. + my @header_indexes_sorted = header_indexes_sorted($#$rec_ref+1); + for my $n (@header_indexes_sorted) { + CORE::push(@res, + $Global::input_source_header{$n}, + map { my $s = $_; + # \t \0 \\ and / are quoted as: \t \0 \\ \_ + $s =~ s/\\/\\\\/g; + $s =~ s/\t/\\t/g; + $s =~ s/\0/\\0/g; + $s =~ s:/:\\_:g; + if($Global::max_file_length) { + # Keep each subdir shorter than the longest + # allowed file name + $s = substr($s,0,$Global::max_file_length); + } + $s; } + $rec_ref->[$n-1]->orig()); + } + } + return join "/", @res; +} + +sub header_indexes_sorted { + # Sort headers first by number then by name. + # E.g.: 1a 1b 11a 11b + # Returns: + # Indexes of %Global::input_source_header sorted + my $max_col = shift; + + no warnings 'numeric'; + for my $col (1 .. $max_col) { + # Make sure the header is defined. If it is not: use column number + if(not defined $Global::input_source_header{$col}) { + $Global::input_source_header{$col} = $col; + } + } + my @header_indexes_sorted = sort { + # Sort headers numerically then asciibetically + $Global::input_source_header{$a} <=> $Global::input_source_header{$b} + or + $Global::input_source_header{$a} cmp $Global::input_source_header{$b} + } 1 .. $max_col; + return @header_indexes_sorted; +} + +sub len { + # Uses: + # $opt::shellquote + # The length of the command line with args substituted + my $self = shift; + my $len = 0; + # Add length of the original command with no args + # Length of command w/ all replacement args removed + $len += $self->{'len'}{'noncontext'} + @{$self->{'command'}} -1; + ::debug("length", "noncontext + command: $len\n"); + my $recargs = $self->number_of_recargs(); + if($self->{'context_replace'}) { + # Context is duplicated for each arg + $len += $recargs * $self->{'len'}{'context'}; + for my $replstring (keys %{$self->{'replacecount'}}) { + # If the replacements string is more than once: mulitply its length + $len += $self->{'len'}{$replstring} * + $self->{'replacecount'}{$replstring}; + ::debug("length", $replstring, " ", $self->{'len'}{$replstring}, "*", + $self->{'replacecount'}{$replstring}, "\n"); + } + # echo 11 22 33 44 55 66 77 88 99 1010 + # echo 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 + # 5 + ctxgrp*arg + ::debug("length", "Ctxgrp: ", $self->{'len'}{'contextgroups'}, + " Groups: ", $self->{'len'}{'noncontextgroups'}, "\n"); + # Add space between context groups + $len += ($recargs-1) * ($self->{'len'}{'contextgroups'}); + } else { + # Each replacement string may occur several times + # Add the length for each time + $len += 1*$self->{'len'}{'context'}; + ::debug("length", "context+noncontext + command: $len\n"); + for my $replstring (keys %{$self->{'replacecount'}}) { + # (space between regargs + length of replacement) + # * number this replacement is used + $len += ($recargs -1 + $self->{'len'}{$replstring}) * + $self->{'replacecount'}{$replstring}; + } + } + if($Global::quoting) { + # Pessimistic length if -q is set + # Worse than worst case: every char needs to be quoted with \ + $len *= 2; + } + if($opt::shellquote) { + # Pessimistic length if --shellquote is set + # Worse than worst case: every char needs to be quoted with \ twice + $len *= 4; + } + # If we are using --env, add the prefix for that, too. + $len += 0; + return $len; +} + +sub replaced { + # Uses: + # $Global::noquote + # $Global::quoting + # Returns: + # $replaced = command with place holders replaced and prepended + my $self = shift; + if(not defined $self->{'replaced'}) { + # Don't quote arguments if the input is the full command line + my $quote_arg = $Global::noquote ? 0 : not $Global::quoting; + # or if ($opt::cat or $opt::pipe) as they use $PARALLEL_TMP + $quote_arg = ($opt::cat || $opt::fifo) ? 0 : $quote_arg; + $self->{'replaced'} = $self-> + replace_placeholders($self->{'command'},$Global::quoting, + $quote_arg); + my $len = length $self->{'replaced'}; + if ($len != $self->len()) { + ::debug("length", $len, " != ", $self->len(), + " ", $self->{'replaced'}, "\n"); + } else { + ::debug("length", $len, " == ", $self->len(), + " ", $self->{'replaced'}, "\n"); + } + } + return $self->{'replaced'}; +} + +{ + my @target; + my $context_replace; + my $perl_expressions_as_re; + my @arg; + my %words_with_rpl_strings; + + sub fish_out_words_with_rpl_strings { + if(not $words_with_rpl_strings{$context_replace,@target}) { + my %word; + for (@target) { + my $tt = $_; + ::debug("replace", "Target: $tt"); + # Command line template: + # a{1}b{}c{}d + # becomes: + # a{=1 $_=$_ =}b{= $_=$_ =}c{= $_=$_ =}d + # becomes: + # a\257<1 $_=$_ \257>b\257< $_=$_ \257>c\257< $_=$_ \257>d + # Input A B C (no context) becomes: + # A B C => aAbA B CcA B Cd + # Input A B C (context -X) becomes: + # A B C => aAbAcAd aAbBcBd aAbCcCd + if($context_replace) { + while($tt =~ s/([^\s\257]* # before {= + (?: + \257< # {= + (?: (?! \257[<>]). )* # The perl expression + \257> # =} + [^\s\257]* # after =} + )+)/ /xs) { + # $1 = pre \257< perlexpr \257> post + $word{"$1"} ||= 1; + } + } else { + while($tt =~ s/( \257<(?: (?! \257[<>]). )*\257> )//xs) { + # $1 = \257< perlexpr \257> + $word{$1} ||= 1; + } + } + } + @{$words_with_rpl_strings{$context_replace,@target}} = keys %word + } + return @{$words_with_rpl_strings{$context_replace,@target}}; + } + + sub replace_placeholders { + # Replace foo{}bar with fooargbar + # Uses: + # @Arg::arg = arguments as strings to be use in {= =} + # Input: + # $targetref = command as shell words + # $quote = should everything be quoted? + # $quote_arg = should replaced arguments be quoted? + # Returns: + # @target with placeholders replaced + my $self = shift; + my $targetref = shift; + my $quote = shift; + my $quote_arg = shift; + my %replace; + # -X = context replace (fish_out_words_with_rpl_strings) + $context_replace = $self->{'context_replace'}; + @target = @$targetref; + ::debug("replace", "Replace @target\n"); + if(not @target) { + # @target is empty: Return empty array + return @target; + } + # Make it possible to use $arg[2] in {= =} + *Arg::arg = $self->{'arg_list_flat_orig'}; + # Flat list: + # $self->{'arg_list'} = [ [Arg11, Arg12], [Arg21, Arg22], [Arg31, Arg32] ] + # $self->{'arg_list_flat'} = [ Arg11, Arg12, Arg21, Arg22, Arg31, Arg32 ] + if(not @{$self->{'arg_list_flat'}}) { + @{$self->{'arg_list_flat'}} = Arg->new(""); + } + my $argref = $self->{'arg_list_flat'}; + # Number of arguments - used for positional arguments + my $n = $#$argref+1; + + # $self is actually a CommandLine-object, + # but it looks nice to be able to say {= $job->slot() =} + my $job = $self; + $perl_expressions_as_re = + join("|", map {s/^-?\d+//; "\Q$_\E"} keys %{$self->{'replacecount'}}); + # Fish out the words that have replacement strings in them + for my $word (fish_out_words_with_rpl_strings()) { + # word = AB \257< perlexpr \257> CD \257< perlexpr \257> EF + ::debug("replace", "Replacing in $word\n"); + my $normal_replace; + + # for each arg: + # replace replacement strings with replacement in the word value + # push to replace word value + for my $arg (@$argref) { + my $val = $word; + # Replace {= perl expr =} with value for each arg + $val =~ s{\257<(-?\d+)?($perl_expressions_as_re)\257>} + { + if($1) { + # Positional replace + # Find the relevant arg and replace it + ($argref->[$1 > 0 ? $1-1 : $n+$1] ? # If defined: replace + $argref->[$1 > 0 ? $1-1 : $n+$1]-> + replace($2,$quote_arg,$self) + : ""); + } else { + # Normal replace + $normal_replace ||= 1; + ($arg ? $arg->replace($2,$quote_arg,$self) : ""); + } + }gxe; + if($quote) { + CORE::push(@{$replace{::shell_quote_scalar($word)}}, + ::shell_quote_scalar($val)); + } else { + CORE::push(@{$replace{$word}}, $val); + } + # No normal replacements => only run once + $normal_replace or last; + } + } + *Arg::arg = []; + if($quote) { + @target = ::shell_quote(@target); + } + if(%replace) { + # Substitute the replace strings with the replacement values + # Must be sorted by length if a short word is a substring of a long word + my $regexp = join('|', map { my $s = $_; $s =~ s/(\W)/\\$1/g; $s } + sort { length $b <=> length $a } keys %replace); + for(@target) { + s/($regexp)/join(" ",@{$replace{$1}})/ge; + } + } + if($Global::escape_string_present) { + # Command line contains \257: Unescape it \257\256 => \257 + # If a replacement resulted in \257\256 + # it will have been escaped into \\\257\\\\256 + # and will not be matched below + for(@target) { + s/\257\256/\257/g; + } + if($opt::q) { + # \257 will be quoted too much + for(@target) { + s/\\\257\\\256/\\\257/g; + } + } + } + ::debug("replace", "Return @target\n"); + return wantarray ? @target : "@target"; + } +} + +sub skip { + # Skip this job + my $self = shift; + $self->{'skip'} = 1; +} + + +package CommandLineQueue; + +sub new { + my $class = shift; + my $commandref = shift; + my $read_from = shift; + my $context_replace = shift || 0; + my $max_number_of_args = shift; + my $transfer_files = shift; + my $return_files = shift; + my @unget = (); + my ($count,$posrpl,$perlexpr); + my ($replacecount_ref, $len_ref); + my @command = @$commandref; + my $dummy = ''; + my $seq = 1; + # Replace replacement strings with {= perl expr =} + # '{=' 'perlexpr' '=}' => '{= perlexpr =}' + @command = merge_rpl_parts(@command); + + # Protect matching inside {= perl expr =} + # by replacing {= and =} with \257< and \257> + # in options that can contain replacement strings: + # @command, --transferfile, --return, + # --tagstring, --workdir, --results + for(@command, @$transfer_files, @$return_files, + $opt::tagstring, $opt::workdir, $opt::results, $opt::retries) { + # Skip if undefined + $_ or next; + # Escape \257 => \257\256 + $Global::escape_string_present += s/\257/\257\256/g; + # Needs to match rightmost left parens (Perl defaults to leftmost) + # to deal with: {={==} and {={==}=} + # Replace {= -> \257< and =} -> \257> + # + # Complex way to do: + # s/{=(.*)=}/\257<$1\257>/g + # which would not work + s[\Q$Global::parensleft\E # Match {= + # Match . unless the next string is {= or =} + # needed to force matching the shortest {= =} + ((?:(?! \Q$Global::parensleft\E|\Q$Global::parensright\E ).)*?) + \Q$Global::parensright\E ] # Match =} + {\257<$1\257>}gx; + for my $rpl (sort { length $b <=> length $a } keys %Global::rpl) { + # Replace long --rpl's before short ones, as a short may be a + # substring of a long: + # --rpl '% s/a/b/' --rpl '%% s/b/a/' + # + # Replace the shorthand string (--rpl) + # with the {= perl expr =} + # + # Avoid searching for shorthand strings inside existing {= perl expr =} + # + # Replace $$1 in {= perl expr =} with groupings in shorthand string + # + # --rpl '{/(\.\S+)/(\.\S+)} s/$$1/$$2/g;' + # echo {/.tar/.gz} ::: UU.tar.gz + my ($prefix,$grp_regexp,$postfix) = + $rpl =~ /^( [^(]* ) # Prefix - e.g. {%% + ( \(.*\) )? # Group capture regexp - e.g (.*) + ( [^)]* )$ # Postfix - e.g } + /xs; + $grp_regexp ||= ''; + my $rplval = $Global::rpl{$rpl}; + while(s{( (?: ^|\257> ) (?: (?! \257[<>])(?:.|\n) )*? ) + # Don't replace after \257 unless \257> + \Q$prefix\E $grp_regexp \Q$postfix\E} + { + # The start remains the same + my $unchanged = $1; + # Dummy entry to start at 1. + my @grp = (1); + # $2 = first ()-group in $grp_regexp + # Put $2 in $grp[1], Put $3 in $grp[2] + # so first ()-group in $grp_regexp is $grp[1]; + for(my $i = 2; defined $grp[$#grp]; $i++) { + push @grp, eval '$'.$i; + } + my $rv = $rplval; + # replace $$1 with $_pAr_gRp1, $$2 with $_pAr_gRp2 + # in the code to be executed + $rv =~ s/\$\$ (\d+)/\$_pAr_gRp$1/gx; + # prepend with $_pAr_gRp1 = perlquote($1), + my $set_args = ""; + for(my $i = 1;defined $grp[$i]; $i++) { + $set_args .= "\$_pAr_gRp$i = \"" . + ::perl_quote_scalar($grp[$i]) . "\";"; + } + $unchanged . "\257<" . $set_args . $rv . "\257>" + }gxes) { + } + # Do the same for the positional replacement strings + $posrpl = $rpl; + if($posrpl =~ s/^\{//) { + # Only do this if the shorthand start with { + $prefix=~s/^\{//; + # Don't replace after \257 unless \257> + while(s{( (?: ^|\257> ) (?: (?! \257[<>]). )*? ) + \{(-?\d+) \s* \Q$prefix\E $grp_regexp \Q$postfix\E} + { + # The start remains the same + my $unchanged = $1; + my $position = $2; + # Dummy entry to start at 1. + my @grp = (1); + # $3 = first ()-group in $grp_regexp + # Put $3 in $grp[1], Put $4 in $grp[2] + # so first ()-group in $grp_regexp is $grp[1]; + for(my $i = 3; defined $grp[$#grp]; $i++) { + push @grp, eval '$'.$i; + } + my $rv = $rplval; + # replace $$1 with $_pAr_gRp1, $$2 with $_pAr_gRp2 + # in the code to be executed + $rv =~ s/\$\$ (\d+)/\$_pAr_gRp$1/gx; + # prepend with $_pAr_gRp1 = perlquote($1), + my $set_args = ""; + for(my $i = 1;defined $grp[$i]; $i++) { + $set_args .= "\$_pAr_gRp$i = \"" . + ::perl_quote_scalar($grp[$i]) . "\";"; + } + $unchanged . "\257<" . $position . $set_args . $rv . "\257>" + }gxes) { + } + } + } + } + + # Add {} if no replacement strings in @command + ($replacecount_ref, $len_ref, @command) = + replacement_counts_and_lengths($transfer_files,$return_files,@command); + if("@command" =~ /^[^ \t\n=]*\257append()) { + $seq = $Global::sql->max_seq() + 1; + } + + return bless { + 'unget' => \@unget, + 'command' => \@command, + 'replacecount' => $replacecount_ref, + 'arg_queue' => RecordQueue->new($read_from,$opt::colsep), + 'context_replace' => $context_replace, + 'len' => $len_ref, + 'max_number_of_args' => $max_number_of_args, + 'size' => undef, + 'transfer_files' => $transfer_files, + 'return_files' => $return_files, + 'seq' => $seq, + }, ref($class) || $class; +} + +sub merge_rpl_parts { + # '{=' 'perlexpr' '=}' => '{= perlexpr =}' + # Input: + # @in = the @command as given by the user + # Uses: + # $Global::parensleft + # $Global::parensright + # Returns: + # @command with parts merged to keep {= and =} as one + my @in = @_; + my @out; + my $l = quotemeta($Global::parensleft); + my $r = quotemeta($Global::parensright); + + while(@in) { + my $s = shift @in; + $_ = $s; + # Remove matching (right most) parens + while(s/(.*)$l.*?$r/$1/o) {} + if(/$l/o) { + # Missing right parens + while(@in) { + $s .= " ".shift @in; + $_ = $s; + while(s/(.*)$l.*?$r/$1/o) {} + if(not /$l/o) { + last; + } + } + } + push @out, $s; + } + return @out; +} + +sub replacement_counts_and_lengths { + # Count the number of different replacement strings. + # Find the lengths of context for context groups and non-context + # groups. + # If no {} found in @command: add it to @command + # + # Input: + # \@transfer_files = array of filenames to transfer + # \@return_files = array of filenames to return + # @command = command template + # Output: + # \%replacecount, \%len, @command + my $transfer_files = shift; + my $return_files = shift; + my @command = @_; + my (%replacecount,%len); + my $sum = 0; + while($sum == 0) { + # Count how many times each replacement string is used + my @cmd = @command; + my $contextlen = 0; + my $noncontextlen = 0; + my $contextgroups = 0; + for my $c (@cmd) { + while($c =~ s/ \257<( (?: (?! \257[<>]). )*?)\257> /\000/xs) { + # %replacecount = { "perlexpr" => number of times seen } + # e.g { "s/a/b/" => 2 } + $replacecount{$1}++; + $sum++; + } + # Measure the length of the context around the {= perl expr =} + # Use that {=...=} has been replaced with \000 above + # So there is no need to deal with \257< + while($c =~ s/ (\S*\000\S*) //xs) { + my $w = $1; + $w =~ tr/\000//d; # Remove all \000's + $contextlen += length($w); + $contextgroups++; + } + # All {= perl expr =} have been removed: The rest is non-context + $noncontextlen += length $c; + } + for(@$transfer_files, @$return_files, + $opt::tagstring, $opt::workdir, $opt::results, $opt::retries) { + # Options that can contain replacement strings + $_ or next; + my $t = $_; + while($t =~ s/ \257<( (?: (?! \257[<>]). )* )\257> //xs) { + # %replacecount = { "perlexpr" => number of times seen } + # e.g { "$_++" => 2 } + # But for tagstring we just need to mark it as seen + $replacecount{$1} ||= 1; + } + } + if($opt::bar) { + # If the command does not contain {} force it to be computed + # as it is being used by --bar + $replacecount{""} ||= 1; + } + + $len{'context'} = 0+$contextlen; + $len{'noncontext'} = $noncontextlen; + $len{'contextgroups'} = $contextgroups; + $len{'noncontextgroups'} = @cmd-$contextgroups; + ::debug("length", "@command Context: ", $len{'context'}, + " Non: ", $len{'noncontext'}, " Ctxgrp: ", $len{'contextgroups'}, + " NonCtxGrp: ", $len{'noncontextgroups'}, "\n"); + if($sum == 0) { + if(not @command) { + # Default command = {} + @command = ("\257<\257>"); + } elsif(($opt::pipe or $opt::pipepart) + and not $opt::fifo and not $opt::cat) { + # With --pipe / --pipe-part you can have no replacement + last; + } else { + # Append {} to the command if there are no {...}'s and no {=...=} + push @command, ("\257<\257>"); + } + } + } + return(\%replacecount,\%len,@command); +} + +sub get { + my $self = shift; + if(@{$self->{'unget'}}) { + my $cmd_line = shift @{$self->{'unget'}}; + return ($cmd_line); + } else { + if($opt::sqlworker) { + # Get the sequence number from the SQL table + $self->set_seq($SQL::next_seq); + # Get the command from the SQL table + $self->{'command'} = $SQL::command_ref; + my @command; + # Recompute replace counts based on the read command + ($self->{'replacecount'}, + $self->{'len'}, @command) = + replacement_counts_and_lengths($self->{'transfer_files'}, + $self->{'return_files'}, + @$SQL::command_ref); + if("@command" =~ /^[^ \t\n=]*\257new($self->seq(), + $self->{'command'}, + $self->{'arg_queue'}, + $self->{'context_replace'}, + $self->{'max_number_of_args'}, + $self->{'transfer_files'}, + $self->{'return_files'}, + $self->{'replacecount'}, + $self->{'len'}, + ); + $cmd_line->populate(); + ::debug("init","cmd_line->number_of_args ", + $cmd_line->number_of_args(), "\n"); + if(not $Global::no_more_input and ($opt::pipe or $opt::pipepart)) { + if($cmd_line->replaced() eq "") { + # Empty command - pipe requires a command + ::error("--pipe/--pipepart must have a command to pipe into ". + "(e.g. 'cat')."); + ::wait_and_exit(255); + } + } else { + if($cmd_line->number_of_args() == 0) { + # We did not get more args - maybe at EOF string? + return undef; + } elsif($cmd_line->replaced() eq "") { + # Empty command - get the next instead + return $self->get(); + } + } + $self->set_seq($self->seq()+1); + return $cmd_line; + } +} + +sub unget { + my $self = shift; + unshift @{$self->{'unget'}}, @_; +} + +sub empty { + my $self = shift; + my $empty = (not @{$self->{'unget'}}) && $self->{'arg_queue'}->empty(); + ::debug("run", "CommandLineQueue->empty $empty"); + return $empty; +} + +sub seq { + my $self = shift; + return $self->{'seq'}; +} + +sub set_seq { + my $self = shift; + $self->{'seq'} = shift; +} + +sub quote_args { + my $self = shift; + # If there is not command emulate |bash + return $self->{'command'}; +} + + +package Limits::Command; + +# Maximal command line length (for -m and -X) +sub max_length { + # Find the max_length of a command line and cache it + # Returns: + # number of chars on the longest command line allowed + if(not $Limits::Command::line_max_len) { + # Disk cache of max command line length + my $len_cache = $Global::cache_dir . "/tmp/sshlogin/" . ::hostname() . + "/linelen"; + my $cached_limit; + if(-e $len_cache) { + open(my $fh, "<", $len_cache) || ::die_bug("Cannot read $len_cache"); + $cached_limit = <$fh>; + close $fh; + } else { + $cached_limit = real_max_length(); + # If $HOME is write protected: Do not fail + my $dir = ::dirname($len_cache); + -d $dir or eval { File::Path::mkpath($dir); }; + open(my $fh, ">", $len_cache); + print $fh $cached_limit; + close $fh; + } + $Limits::Command::line_max_len = tmux_length($cached_limit); + if($opt::max_chars) { + if($opt::max_chars <= $cached_limit) { + $Limits::Command::line_max_len = $opt::max_chars; + } else { + ::warning("Value for -s option should be < $cached_limit."); + } + } + } + return int($Limits::Command::line_max_len); +} + +sub real_max_length { + # Find the max_length of a command line + # Returns: + # The maximal command line length + # Use an upper bound of 8 MB if the shell allows for infinite long lengths + my $upper = 8_000_000; + my $len = 8; + do { + if($len > $upper) { return $len }; + $len *= 16; + } while (is_acceptable_command_line_length($len)); + # Then search for the actual max length between 0 and upper bound + return binary_find_max_length(int($len/16),$len); +} + +sub binary_find_max_length { + # Given a lower and upper bound find the max_length of a command line + # Returns: + # number of chars on the longest command line allowed + my ($lower, $upper) = (@_); + if($lower == $upper or $lower == $upper-1) { return $lower; } + my $middle = int (($upper-$lower)/2 + $lower); + ::debug("init", "Maxlen: $lower,$upper,$middle : "); + if (is_acceptable_command_line_length($middle)) { + return binary_find_max_length($middle,$upper); + } else { + return binary_find_max_length($lower,$middle); + } +} + +sub is_acceptable_command_line_length { + # Test if a command line of this length can run + # in the current environment + # Returns: + # 0 if the command line length is too long + # 1 otherwise + my $len = shift; + if($ENV{PARALLEL_ENV}) { + $len += length $ENV{PARALLEL_ENV} + (-s $ENV{PARALLEL_ENV})*2; + } + ::qqx("true "."x"x$len); + ::debug("init", "$len=$? "); + return not $?; +} + +sub tmux_length { + # If $opt::tmux set, find the limit for tmux + # tmux 1.8 has a 2kB limit + # tmux 1.9 has a 16kB limit + # tmux 2.0 has a 16kB limit + # tmux 2.1 has a 16kB limit + # tmux 2.2 has a 16kB limit + # Input: + # $len = maximal command line length + # Returns: + # $tmux_len = maximal length runable in tmux + local $/ = "\n"; + my $len = shift; + if($opt::tmux) { + $ENV{'PARALLEL_TMUX'} ||= "tmux"; + if(not ::which($ENV{'PARALLEL_TMUX'})) { + ::error($ENV{'PARALLEL_TMUX'}." not found in \$PATH."); + ::wait_and_exit(255); + } + my @out; + for my $l (1, 2020, 16320, 100000, $len) { + my $tmpfile = ::tmpname("tms"); + my $tmuxcmd = $ENV{'PARALLEL_TMUX'}. + " -S $tmpfile new-session -d -n echo $l". + ("x"x$l). " && echo $l; rm -f $tmpfile"; + push @out, ::qqx($tmuxcmd); + ::rm($tmpfile); + } + ::debug("tmux","tmux-out ",@out); + chomp @out; + # The arguments is given 3 times on the command line + # and the wrapping is around 30 chars + # (29 for tmux1.9, 33 for tmux1.8) + my $tmux_len = ::max(@out); + $len = ::min($len,int($tmux_len/4-33)); + ::debug("tmux","tmux-length ",$len); + } + return $len; +} + + +package RecordQueue; + +sub new { + my $class = shift; + my $fhs = shift; + my $colsep = shift; + my @unget = (); + my $arg_sub_queue; + if($opt::sqlworker) { + # Open SQL table + $arg_sub_queue = SQLRecordQueue->new(); + } elsif(defined $colsep) { + # Open one file with colsep or CSV + $arg_sub_queue = RecordColQueue->new($fhs); + } else { + # Open one or more files if multiple -a + $arg_sub_queue = MultifileQueue->new($fhs); + } + return bless { + 'unget' => \@unget, + 'arg_number' => 0, + 'arg_sub_queue' => $arg_sub_queue, + }, ref($class) || $class; +} + +sub get { + # Returns: + # reference to array of Arg-objects + my $self = shift; + if(@{$self->{'unget'}}) { + $self->{'arg_number'}++; + # Flush cached computed replacements in Arg-objects + # To fix: parallel --bar echo {%} ::: a b c ::: d e f + my $ret = shift @{$self->{'unget'}}; + if($ret) { + map { $_->flush_cache() } @$ret; + } + return $ret; + } + my $ret = $self->{'arg_sub_queue'}->get(); + if($ret) { + if(grep { index($_->orig(),"\0") > 0 } @$ret) { + # Allow for \0 in position 0 because GNU Parallel uses "\0" + # to mean no-string + ::warning("a NUL character occurred in the input.", + "It cannot be passed through in the argument list.", + "Did you mean to use the --null option?"); + } + if(defined $Global::max_number_of_args + and $Global::max_number_of_args == 0) { + ::debug("run", "Read 1 but return 0 args\n"); + # \0 => nothing (not the empty string) + map { $_->set_orig("\0"); } @$ret; + } + # Flush cached computed replacements in Arg-objects + # To fix: parallel --bar echo {%} ::: a b c ::: d e f + map { $_->flush_cache() } @$ret; + } + return $ret; +} + +sub unget { + my $self = shift; + ::debug("run", "RecordQueue-unget '@_'\n"); + $self->{'arg_number'} -= @_; + unshift @{$self->{'unget'}}, @_; +} + +sub empty { + my $self = shift; + my $empty = not @{$self->{'unget'}}; + $empty &&= $self->{'arg_sub_queue'}->empty(); + ::debug("run", "RecordQueue->empty $empty"); + return $empty; +} + +sub arg_number { + my $self = shift; + return $self->{'arg_number'}; +} + + +package RecordColQueue; + +sub new { + my $class = shift; + my $fhs = shift; + my @unget = (); + my $arg_sub_queue = MultifileQueue->new($fhs); + return bless { + 'unget' => \@unget, + 'arg_sub_queue' => $arg_sub_queue, + }, ref($class) || $class; +} + +sub get { + # Returns: + # reference to array of Arg-objects + my $self = shift; + if(@{$self->{'unget'}}) { + return shift @{$self->{'unget'}}; + } + my $unget_ref = $self->{'unget'}; + if($self->{'arg_sub_queue'}->empty()) { + return undef; + } + my $in_record = $self->{'arg_sub_queue'}->get(); + if(defined $in_record) { + my @out_record = (); + for my $arg (@$in_record) { + ::debug("run", "RecordColQueue::arg $arg\n"); + my $line = $arg->orig(); + ::debug("run", "line='$line'\n"); + if($line ne "") { + if($opt::csv) { + # Parse CSV + chomp $line; + if(not $Global::csv->parse($line)) { + die "CSV has unexpected format: ^$line^"; + } + for($Global::csv->fields()) { + push @out_record, Arg->new($_); + } + } else { + for my $s (split /$opt::colsep/o, $line, -1) { + push @out_record, Arg->new($s); + } + } + } else { + push @out_record, Arg->new(""); + } + } + return \@out_record; + } else { + return undef; + } +} + +sub unget { + my $self = shift; + ::debug("run", "RecordColQueue-unget '@_'\n"); + unshift @{$self->{'unget'}}, @_; +} + +sub empty { + my $self = shift; + my $empty = (not @{$self->{'unget'}} and + $self->{'arg_sub_queue'}->empty()); + ::debug("run", "RecordColQueue->empty $empty"); + return $empty; +} + + +package SQLRecordQueue; + +sub new { + my $class = shift; + my @unget = (); + return bless { + 'unget' => \@unget, + }, ref($class) || $class; +} + +sub get { + # Returns: + # reference to array of Arg-objects + my $self = shift; + if(@{$self->{'unget'}}) { + return shift @{$self->{'unget'}}; + } + return $Global::sql->get_record(); +} + +sub unget { + my $self = shift; + ::debug("run", "SQLRecordQueue-unget '@_'\n"); + unshift @{$self->{'unget'}}, @_; +} + +sub empty { + my $self = shift; + if(@{$self->{'unget'}}) { return 0; } + my $get = $self->get(); + if(defined $get) { + $self->unget($get); + } + my $empty = not $get; + ::debug("run", "SQLRecordQueue->empty $empty"); + return $empty; +} + + +package MultifileQueue; + +@Global::unget_argv=(); + +sub new { + my $class = shift; + my $fhs = shift; + for my $fh (@$fhs) { + if(-t $fh and -t ($Global::status_fd || *STDERR)) { + ::warning("Input is read from the terminal. You either know what you", + "are doing (in which case: YOU ARE AWESOME!) or you forgot", + "::: or :::: or to pipe data into parallel. If so", + "consider going through the tutorial: man parallel_tutorial", + "Press CTRL-D to exit."); + } + } + return bless { + 'unget' => \@Global::unget_argv, + 'fhs' => $fhs, + 'arg_matrix' => undef, + }, ref($class) || $class; +} + +sub get { + my $self = shift; + if($opt::link) { + return $self->link_get(); + } else { + return $self->nest_get(); + } +} + +sub unget { + my $self = shift; + ::debug("run", "MultifileQueue-unget '@_'\n"); + unshift @{$self->{'unget'}}, @_; +} + +sub empty { + my $self = shift; + my $empty = (not @Global::unget_argv + and not @{$self->{'unget'}}); + for my $fh (@{$self->{'fhs'}}) { + $empty &&= eof($fh); + } + ::debug("run", "MultifileQueue->empty $empty "); + return $empty; +} + +sub link_get { + my $self = shift; + if(@{$self->{'unget'}}) { + return shift @{$self->{'unget'}}; + } + my @record = (); + my $prepend; + my $empty = 1; + for my $fh (@{$self->{'fhs'}}) { + my $arg = read_arg_from_fh($fh); + if(defined $arg) { + # Record $arg for recycling at end of file + push @{$self->{'arg_matrix'}{$fh}}, $arg; + push @record, $arg; + $empty = 0; + } else { + ::debug("run", "EOA "); + # End of file: Recycle arguments + push @{$self->{'arg_matrix'}{$fh}}, shift @{$self->{'arg_matrix'}{$fh}}; + # return last @{$args->{'args'}{$fh}}; + push @record, @{$self->{'arg_matrix'}{$fh}}[-1]; + } + } + if($empty) { + return undef; + } else { + return \@record; + } +} + +sub nest_get { + my $self = shift; + if(@{$self->{'unget'}}) { + return shift @{$self->{'unget'}}; + } + my @record = (); + my $prepend; + my $empty = 1; + my $no_of_inputsources = $#{$self->{'fhs'}} + 1; + if(not $self->{'arg_matrix'}) { + # Initialize @arg_matrix with one arg from each file + # read one line from each file + my @first_arg_set; + my $all_empty = 1; + for (my $fhno = 0; $fhno < $no_of_inputsources ; $fhno++) { + my $arg = read_arg_from_fh($self->{'fhs'}[$fhno]); + if(defined $arg) { + $all_empty = 0; + } + $self->{'arg_matrix'}[$fhno][0] = $arg || Arg->new(""); + push @first_arg_set, $self->{'arg_matrix'}[$fhno][0]; + } + if($all_empty) { + # All filehandles were at eof or eof-string + return undef; + } + return [@first_arg_set]; + } + + # Treat the case with one input source special. For multiple + # input sources we need to remember all previously read values to + # generate all combinations. But for one input source we can + # forget the value after first use. + if($no_of_inputsources == 1) { + my $arg = read_arg_from_fh($self->{'fhs'}[0]); + if(defined($arg)) { + return [$arg]; + } + return undef; + } + for (my $fhno = $no_of_inputsources - 1; $fhno >= 0; $fhno--) { + if(eof($self->{'fhs'}[$fhno])) { + next; + } else { + # read one + my $arg = read_arg_from_fh($self->{'fhs'}[$fhno]); + defined($arg) || next; # If we just read an EOF string: Treat this as EOF + my $len = $#{$self->{'arg_matrix'}[$fhno]} + 1; + $self->{'arg_matrix'}[$fhno][$len] = $arg; + # make all new combinations + my @combarg = (); + for (my $fhn = 0; $fhn < $no_of_inputsources; $fhn++) { + push(@combarg, [0, $#{$self->{'arg_matrix'}[$fhn]}], + # Is input source --link'ed to the next? + $opt::linkinputsource[$fhn+1]); + } + # Find only combinations with this new entry + $combarg[2*$fhno] = [$len,$len]; + # map combinations + # [ 1, 3, 7 ], [ 2, 4, 1 ] + # => + # [ m[0][1], m[1][3], m[2][7] ], [ m[0][2], m[1][4], m[2][1] ] + my @mapped; + for my $c (expand_combinations(@combarg)) { + my @a; + for my $n (0 .. $no_of_inputsources - 1 ) { + push @a, $self->{'arg_matrix'}[$n][$$c[$n]]; + } + push @mapped, \@a; + } + # append the mapped to the ungotten arguments + push @{$self->{'unget'}}, @mapped; + # get the first + if(@mapped) { + return shift @{$self->{'unget'}}; + } + } + } + # all are eof or at EOF string; return from the unget queue + return shift @{$self->{'unget'}}; +} + +sub read_arg_from_fh { + # Read one Arg from filehandle + # Returns: + # Arg-object with one read line + # undef if end of file + my $fh = shift; + my $prepend; + my $arg; + my $half_record = 0; + do {{ + # This makes 10% faster + if(not defined ($arg = <$fh>)) { + if(defined $prepend) { + return Arg->new($prepend); + } else { + return undef; + } + } + if($opt::csv) { + # We need to read a full CSV line. + if(($arg =~ y/"/"/) % 2 ) { + # The number of " on the line is uneven: + # If we were in a half_record => we have a full record now + # If we were ouside a half_record => we are in a half record now + $half_record = not $half_record; + } + if($half_record) { + # CSV half-record with quoting: + # col1,"col2 2""x3"" board newline <-this one + # cont",col3 + $prepend .= $arg; + redo; + } else { + # Now we have a full CSV record + } + } + # Remove delimiter + chomp $arg; + if($Global::end_of_file_string and + $arg eq $Global::end_of_file_string) { + # Ignore the rest of input file + close $fh; + ::debug("run", "EOF-string ($arg) met\n"); + if(defined $prepend) { + return Arg->new($prepend); + } else { + return undef; + } + } + if(defined $prepend) { + $arg = $prepend.$arg; # For line continuation + undef $prepend; + } + if($Global::ignore_empty) { + if($arg =~ /^\s*$/) { + redo; # Try the next line + } + } + if($Global::max_lines) { + if($arg =~ /\s$/) { + # Trailing space => continued on next line + $prepend = $arg; + redo; + } + } + }} while (1 == 0); # Dummy loop {{}} for redo + if(defined $arg) { + return Arg->new($arg); + } else { + ::die_bug("multiread arg undefined"); + } +} + +sub expand_combinations { + # Input: + # ([xmin,xmax], [ymin,ymax], ...) + # Returns: ([x,y,...],[x,y,...]) + # where xmin <= x <= xmax and ymin <= y <= ymax + my $minmax_ref = shift; + my $link = shift; # This is linked to the next input source + my $xmin = $$minmax_ref[0]; + my $xmax = $$minmax_ref[1]; + my @p; + if(@_) { + my @rest = expand_combinations(@_); + if($link) { + # Linked to next col with --link/:::+/::::+ + # TODO BUG does not wrap values if not same number of vals + push(@p, map { [$$_[0], @$_] } + grep { $xmin <= $$_[0] and $$_[0] <= $xmax } @rest); + } else { + # If there are more columns: Compute those recursively + for(my $x = $xmin; $x <= $xmax; $x++) { + push @p, map { [$x, @$_] } @rest; + } + } + } else { + for(my $x = $xmin; $x <= $xmax; $x++) { + push @p, [$x]; + } + } + return @p; +} + + +package Arg; + +sub new { + my $class = shift; + my $orig = shift; + my @hostgroups; + if($opt::hostgroups) { + if($orig =~ s:@(.+)::) { + # We found hostgroups on the arg + @hostgroups = split(/\+/, $1); + if(not grep { defined $Global::hostgroups{$_} } @hostgroups) { + # This hostgroup is not defined using -S + # Add it + ::warning("Adding hostgroups: @hostgroups"); + # Add sshlogin + for(grep { not defined $Global::hostgroups{$_} } @hostgroups) { + my $sshlogin = SSHLogin->new($_); + my $sshlogin_string = $sshlogin->string(); + $Global::host{$sshlogin_string} = $sshlogin; + $Global::hostgroups{$sshlogin_string} = 1; + } + } + } else { + # No hostgroup on the arg => any hostgroup + @hostgroups = (keys %Global::hostgroups); + } + } + return bless { + 'orig' => $orig, + 'hostgroups' => \@hostgroups, + }, ref($class) || $class; +} + +sub Q { + # Q alias for ::shell_quote_scalar + # Run shell_quote_scalar once to set the reference to the sub + my $a = ::shell_quote_scalar(@_); + *Q = \&::shell_quote_scalar; + return $a; +} + +sub pQ { + # pQ alias for ::perl_quote_scalar + *pQ = \&::perl_quote_scalar; + return pQ(@_); +} + +sub total_jobs { + return $Global::JobQueue->total_jobs(); +} + +{ + my %perleval; + my $job; + sub skip { + # shorthand for $job->skip(); + $job->skip(); + } + sub slot { + # shorthand for $job->slot(); + $job->slot(); + } + sub seq { + # shorthand for $job->seq(); + $job->seq(); + } + + sub replace { + # Calculates the corresponding value for a given perl expression + # Returns: + # The calculated string (quoted if asked for) + my $self = shift; + my $perlexpr = shift; # E.g. $_=$_ or s/.gz// + my $quote = (shift) ? 1 : 0; # should the string be quoted? + # This is actually a CommandLine-object, + # but it looks nice to be able to say {= $job->slot() =} + $job = shift; + $perlexpr =~ s/^(-?\d+)? *//; # Positional replace treated as normal replace + if(not $self->{'cache'}{$perlexpr}) { + # Only compute the value once + # Use $_ as the variable to change + local $_; + if($Global::trim eq "n") { + $_ = $self->{'orig'}; + } else { + # Trim the input + $_ = trim_of($self->{'orig'}); + } + ::debug("replace", "eval ", $perlexpr, " ", $_, "\n"); + if(not $perleval{$perlexpr}) { + # Make an anonymous function of the $perlexpr + # And more importantly: Compile it only once + if($perleval{$perlexpr} = + eval('sub { no strict; no warnings; my $job = shift; '. + $perlexpr.' }')) { + # All is good + } else { + # The eval failed. Maybe $perlexpr is invalid perl? + ::error("Cannot use $perlexpr: $@"); + ::wait_and_exit(255); + } + } + # Execute the function + $perleval{$perlexpr}->($job); + $self->{'cache'}{$perlexpr} = $_; + } + # Return the value quoted if needed + return($quote ? ::shell_quote_scalar($self->{'cache'}{$perlexpr}) + : $self->{'cache'}{$perlexpr}); + } +} + +sub flush_cache { + # Flush cache of computed values + my $self = shift; + $self->{'cache'} = undef; +} + +sub orig { + my $self = shift; + return $self->{'orig'}; +} + +sub set_orig { + my $self = shift; + $self->{'orig'} = shift; +} + +sub trim_of { + # Removes white space as specifed by --trim: + # n = nothing + # l = start + # r = end + # lr|rl = both + # Returns: + # string with white space removed as needed + my @strings = map { defined $_ ? $_ : "" } (@_); + my $arg; + if($Global::trim eq "n") { + # skip + } elsif($Global::trim eq "l") { + for my $arg (@strings) { $arg =~ s/^\s+//; } + } elsif($Global::trim eq "r") { + for my $arg (@strings) { $arg =~ s/\s+$//; } + } elsif($Global::trim eq "rl" or $Global::trim eq "lr") { + for my $arg (@strings) { $arg =~ s/^\s+//; $arg =~ s/\s+$//; } + } else { + ::error("--trim must be one of: r l rl lr."); + ::wait_and_exit(255); + } + return wantarray ? @strings : "@strings"; +} + + +package TimeoutQueue; + +sub new { + my $class = shift; + my $delta_time = shift; + my ($pct); + if($delta_time =~ /(\d+(\.\d+)?)%/) { + # Timeout in percent + $pct = $1/100; + $delta_time = 1_000_000; + } + $delta_time = ::multiply_time_units($delta_time); + + return bless { + 'queue' => [], + 'delta_time' => $delta_time, + 'pct' => $pct, + 'remedian_idx' => 0, + 'remedian_arr' => [], + 'remedian' => undef, + }, ref($class) || $class; +} + +sub delta_time { + my $self = shift; + return $self->{'delta_time'}; +} + +sub set_delta_time { + my $self = shift; + $self->{'delta_time'} = shift; +} + +sub remedian { + my $self = shift; + return $self->{'remedian'}; +} + +sub set_remedian { + # Set median of the last 999^3 (=997002999) values using Remedian + # + # Rousseeuw, Peter J., and Gilbert W. Bassett Jr. "The remedian: A + # robust averaging method for large data sets." Journal of the + # American Statistical Association 85.409 (1990): 97-104. + my $self = shift; + my $val = shift; + my $i = $self->{'remedian_idx'}++; + my $rref = $self->{'remedian_arr'}; + $rref->[0][$i%999] = $val; + $rref->[1][$i/999%999] = (sort @{$rref->[0]})[$#{$rref->[0]}/2]; + $rref->[2][$i/999/999%999] = (sort @{$rref->[1]})[$#{$rref->[1]}/2]; + $self->{'remedian'} = (sort @{$rref->[2]})[$#{$rref->[2]}/2]; +} + +sub update_median_runtime { + # Update delta_time based on runtime of finished job if timeout is + # a percentage + my $self = shift; + my $runtime = shift; + if($self->{'pct'}) { + $self->set_remedian($runtime); + $self->{'delta_time'} = $self->{'pct'} * $self->remedian(); + ::debug("run", "Timeout: $self->{'delta_time'}s "); + } +} + +sub process_timeouts { + # Check if there was a timeout + my $self = shift; + # $self->{'queue'} is sorted by start time + while (@{$self->{'queue'}}) { + my $job = $self->{'queue'}[0]; + if($job->endtime()) { + # Job already finished. No need to timeout the job + # This could be because of --keep-order + shift @{$self->{'queue'}}; + } elsif($job->is_timedout($self->{'delta_time'})) { + # Need to shift off queue before kill + # because kill calls usleep that calls process_timeouts + shift @{$self->{'queue'}}; + ::warning("This job was killed because it timed out:", + $job->replaced()); + $job->kill(); + } else { + # Because they are sorted by start time the rest are later + last; + } + } +} + +sub insert { + my $self = shift; + my $in = shift; + push @{$self->{'queue'}}, $in; +} + + +package SQL; + +sub new { + my $class = shift; + my $dburl = shift; + $Global::use{"DBI"} ||= eval "use DBI; 1;"; + # +DBURL = append to this DBURL + my $append = $dburl=~s/^\+//; + my %options = parse_dburl(get_alias($dburl)); + my %driveralias = ("sqlite" => "SQLite", + "sqlite3" => "SQLite", + "pg" => "Pg", + "postgres" => "Pg", + "postgresql" => "Pg", + "csv" => "CSV", + "oracle" => "Oracle", + "ora" => "Oracle"); + my $driver = $driveralias{$options{'databasedriver'}} || + $options{'databasedriver'}; + my $database = $options{'database'}; + my $host = $options{'host'} ? ";host=".$options{'host'} : ""; + my $port = $options{'port'} ? ";port=".$options{'port'} : ""; + my $dsn = "DBI:$driver:dbname=$database$host$port"; + my $userid = $options{'user'}; + my $password = $options{'password'};; + my $dbh = DBI->connect($dsn, $userid, $password, + { RaiseError => 1, AutoInactiveDestroy => 1 }) + or die $DBI::errstr; + $dbh->{'PrintWarn'} = $Global::debug || 0; + $dbh->{'PrintError'} = $Global::debug || 0; + $dbh->{'RaiseError'} = 1; + $dbh->{'ShowErrorStatement'} = 1; + $dbh->{'HandleError'} = sub {}; + + if(not defined $options{'table'}) { + ::error("The DBURL ($dburl) must contain a table."); + ::wait_and_exit(255); + } + + return bless { + 'dbh' => $dbh, + 'driver' => $driver, + 'max_number_of_args' => undef, + 'table' => $options{'table'}, + 'append' => $append, + }, ref($class) || $class; +} + +sub get_alias { + my $alias = shift; + $alias =~ s/^(sql:)*//; # Accept aliases prepended with sql: + if ($alias !~ /^:/) { + return $alias; + } + + # Find the alias + my $path; + if (-l $0) { + ($path) = readlink($0) =~ m|^(.*)/|; + } else { + ($path) = $0 =~ m|^(.*)/|; + } + + my @deprecated = ("$ENV{HOME}/.dburl.aliases", + "$path/dburl.aliases", "$path/dburl.aliases.dist"); + for (@deprecated) { + if(-r $_) { + ::warning("$_ is deprecated. ". + "Use .sql/aliases instead (read man sql)."); + } + } + my @urlalias=(); + check_permissions("$ENV{HOME}/.sql/aliases"); + check_permissions("$ENV{HOME}/.dburl.aliases"); + my @search = ("$ENV{HOME}/.sql/aliases", + "$ENV{HOME}/.dburl.aliases", "/etc/sql/aliases", + "$path/dburl.aliases", "$path/dburl.aliases.dist"); + for my $alias_file (@search) { + # local $/ needed if -0 set + local $/ = "\n"; + if(-r $alias_file) { + open(my $in, "<", $alias_file) || die; + push @urlalias, <$in>; + close $in; + } + } + my ($alias_part,$rest) = $alias=~/(:\w*)(.*)/; + # If we saw this before: we have an alias loop + if(grep {$_ eq $alias_part } @Private::seen_aliases) { + ::error("$alias_part is a cyclic alias."); + exit -1; + } else { + push @Private::seen_aliases, $alias_part; + } + + my $dburl; + for (@urlalias) { + /^$alias_part\s+(\S+.*)/ and do { $dburl = $1; last; } + } + + if($dburl) { + return get_alias($dburl.$rest); + } else { + ::error("$alias is not defined in @search"); + exit(-1); + } +} + +sub check_permissions { + my $file = shift; + + if(-e $file) { + if(not -o $file) { + my $username = (getpwuid($<))[0]; + ::warning("$file should be owned by $username: ". + "chown $username $file"); + } + my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, + $atime,$mtime,$ctime,$blksize,$blocks) = stat($file); + if($mode & 077) { + my $username = (getpwuid($<))[0]; + ::warning("$file should be only be readable by $username: ". + "chmod 600 $file"); + } + } +} + +sub parse_dburl { + my $url = shift; + my %options = (); + # sql:mysql://[[user][:password]@][host][:port]/[database[/table][?query]] + + if($url=~m!(?:sql:)? # You can prefix with 'sql:' + ((?:oracle|ora|mysql|pg|postgres|postgresql)(?:s|ssl|)| + (?:sqlite|sqlite2|sqlite3|csv)):// # Databasedriver ($1) + (?: + ([^:@/][^:@]*|) # Username ($2) + (?: + :([^@]*) # Password ($3) + )? + @)? + ([^:/]*)? # Hostname ($4) + (?: + : + ([^/]*)? # Port ($5) + )? + (?: + / + ([^/?]*)? # Database ($6) + )? + (?: + / + ([^?]*)? # Table ($7) + )? + (?: + \? + (.*)? # Query ($8) + )? + !ix) { + $options{databasedriver} = ::undef_if_empty(lc(uri_unescape($1))); + $options{user} = ::undef_if_empty(uri_unescape($2)); + $options{password} = ::undef_if_empty(uri_unescape($3)); + $options{host} = ::undef_if_empty(uri_unescape($4)); + $options{port} = ::undef_if_empty(uri_unescape($5)); + $options{database} = ::undef_if_empty(uri_unescape($6)); + $options{table} = ::undef_if_empty(uri_unescape($7)); + $options{query} = ::undef_if_empty(uri_unescape($8)); + ::debug("sql", "dburl $url\n"); + ::debug("sql", "databasedriver ", $options{databasedriver}, + " user ", $options{user}, + " password ", $options{password}, " host ", $options{host}, + " port ", $options{port}, " database ", $options{database}, + " table ", $options{table}, " query ", $options{query}, "\n"); + } else { + ::error("$url is not a valid DBURL"); + exit 255; + } + return %options; +} + +sub uri_unescape { + # Copied from http://cpansearch.perl.org/src/GAAS/URI-1.55/URI/Escape.pm + # to avoid depending on URI::Escape + # This section is (C) Gisle Aas. + # Note from RFC1630: "Sequences which start with a percent sign + # but are not followed by two hexadecimal characters are reserved + # for future extension" + my $str = shift; + if (@_ && wantarray) { + # not executed for the common case of a single argument + my @str = ($str, @_); # need to copy + foreach (@str) { + s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg; + } + return @str; + } + $str =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg if defined $str; + $str; +} + +sub run { + my $self = shift; + my $stmt = shift; + if($self->{'driver'} eq "CSV") { + $stmt=~ s/;$//; + if($stmt eq "BEGIN" or + $stmt eq "COMMIT") { + return undef; + } + } + my @retval; + my $dbh = $self->{'dbh'}; + ::debug("sql","$opt::sqlmaster$opt::sqlworker run $stmt\n"); + # Execute with the rest of the args - if any + my $rv; + my $sth; + my $lockretry = 0; + while($lockretry < 10) { + $sth = $dbh->prepare($stmt); + if($sth + and + eval { $rv = $sth->execute(@_) }) { + last; + } else { + if($@ =~ /no such table|Table .* doesn.t exist|relation ".*" does not exist/ + or + $DBI::errstr =~ /no such table|Table .* doesn.t exist|relation ".*" does not exist/) { + # This is fine: + # It is just a worker that reported back too late - + # another worker had finished the job first + # and the table was then dropped + $rv = $sth = 0; + last; + } + if($DBI::errstr =~ /locked/) { + ::debug("sql", "Lock retry: $lockretry"); + $lockretry++; + ::usleep(rand()*300); + } elsif(not $sth) { + # Try again + $lockretry++; + } else { + ::error($DBI::errstr); + ::wait_and_exit(255); + } + } + } + if($lockretry >= 10) { + ::die_bug("retry > 10: $DBI::errstr"); + } + if($rv < 0 and $DBI::errstr){ + ::error($DBI::errstr); + ::wait_and_exit(255); + } + return $sth; +} + +sub get { + my $self = shift; + my $sth = $self->run(@_); + my @retval; + # If $sth = 0 it means the table was dropped by another process + while($sth) { + my @row = $sth->fetchrow_array(); + @row or last; + push @retval, \@row; + } + return \@retval; +} + +sub table { + my $self = shift; + return $self->{'table'}; +} + +sub append { + my $self = shift; + return $self->{'append'}; +} + +sub update { + my $self = shift; + my $stmt = shift; + my $table = $self->table(); + $self->run("UPDATE $table $stmt",@_); +} + +sub output { + my $self = shift; + my $commandline = shift; + + $self->update("SET Stdout = ?, Stderr = ? WHERE Seq = ". + $commandline->seq(), + join("",@{$commandline->{'output'}{1}}), + join("",@{$commandline->{'output'}{2}})); +} + +sub max_number_of_args { + # Maximal number of args for this table + my $self = shift; + if(not $self->{'max_number_of_args'}) { + # Read the number of args from the SQL table + my $table = $self->table(); + my $v = $self->get("SELECT * FROM $table LIMIT 1;"); + my @reserved_columns = qw(Seq Host Starttime JobRuntime Send + Receive Exitval _Signal Command Stdout Stderr); + if(not $v) { + ::error("$table contains no records"); + } + # Count the number of Vx columns + $self->{'max_number_of_args'} = $#{$v->[0]} - $#reserved_columns; + } + return $self->{'max_number_of_args'}; +} + +sub set_max_number_of_args { + my $self = shift; + $self->{'max_number_of_args'} = shift; +} + +sub create_table { + my $self = shift; + if($self->append()) { return; } + my $max_number_of_args = shift; + $self->set_max_number_of_args($max_number_of_args); + my $table = $self->table(); + $self->run(qq(DROP TABLE IF EXISTS $table;)); + # BIGINT and TEXT are not supported in these databases or are too small + my %vartype = ( + "Oracle" => { "BIGINT" => "NUMBER(19,0)", + "TEXT" => "CLOB", }, + "mysql" => { "TEXT" => "LONGTEXT", }, + "CSV" => { "BIGINT" => "INT", + "FLOAT" => "REAL", }, + ); + my $BIGINT = $vartype{$self->{'driver'}}{"BIGINT"} || "BIGINT"; + my $TEXT = $vartype{$self->{'driver'}}{"TEXT"} || "TEXT"; + my $FLOAT = $vartype{$self->{'driver'}}{"FLOAT"} || "FLOAT(44)"; + my $v_def = join "", map { "V$_ $TEXT," } (1..$self->max_number_of_args()); + $self->run(qq{CREATE TABLE $table + (Seq $BIGINT, + Host $TEXT, + Starttime $FLOAT, + JobRuntime $FLOAT, + Send $BIGINT, + Receive $BIGINT, + Exitval $BIGINT, + _Signal $BIGINT, + Command $TEXT,}. + $v_def. + qq{Stdout $TEXT, + Stderr $TEXT);}); +} + +sub insert_records { + my $self = shift; + my $seq = shift; + my $command_ref = shift; + my $record_ref = shift; + my $table = $self->table(); + # For SQL encode the command with \257 space as split points + my $command = join("\257 ",@$command_ref); + my $v_cols = join ",", map { "V$_" } (1..$self->max_number_of_args()); + # Two extra value due to $seq, Exitval, Send + my $v_vals = join ",", map { "?" } (1..$self->max_number_of_args()+4); + $self->run("INSERT INTO $table (Seq,Command,Exitval,Send,$v_cols) ". + "VALUES ($v_vals);", $seq, $command, -1000, + 0, @$record_ref[1..$#$record_ref]); +} + +sub get_record { + my $self = shift; + my @retval; + my $table = $self->table(); + my $v_cols = join ",", map { "V$_" } (1..$self->max_number_of_args()); + my $v = $self->get("SELECT Seq, Command, $v_cols FROM $table ". + "WHERE Exitval = -1000 ORDER BY Seq LIMIT 1;"); + if($v->[0]) { + my $val_ref = $v->[0]; + # Mark record as taken + my $seq = shift @$val_ref; + # Save the sequence number to use when running the job + $SQL::next_seq = $seq; + $self->update("SET Exitval = ? WHERE Seq = ".$seq, -1220); + my @command = split /\257 /, shift @$val_ref; + $SQL::command_ref = \@command; + for (@$val_ref) { + push @retval, Arg->new($_); + } + } + if(@retval) { + return \@retval; + } else { + return undef; + } +} + +sub total_jobs { + my $self = shift; + my $table = $self->table(); + my $v = $self->get("SELECT count(*) FROM $table;"); + if($v->[0]) { + return $v->[0]->[0]; + } else { + ::die_bug("SQL::total_jobs"); + } +} + +sub max_seq { + my $self = shift; + my $table = $self->table(); + my $v = $self->get("SELECT max(Seq) FROM $table;"); + if($v->[0]) { + return $v->[0]->[0]; + } else { + ::die_bug("SQL::max_seq"); + } +} + +sub finished { + # Check if there are any jobs left in the SQL table that do not + # have a "real" exitval + my $self = shift; + if($opt::wait or $Global::start_sqlworker) { + my $table = $self->table(); + my $rv = $self->get("select Seq,Exitval from $table ". + "where Exitval <= -1000 limit 1"); + return not $rv->[0]; + } else { + return 1; + } +} + +package Semaphore; + +# This package provides a counting semaphore +# +# If a process dies without releasing the semaphore the next process +# that needs that entry will clean up dead semaphores +# +# The semaphores are stored in $PARALLEL_HOME/semaphores/id- Each +# file in $PARALLEL_HOME/semaphores/id-/ is the process ID of the +# process holding the entry. If the process dies, the entry can be +# taken by another process. + +sub new { + my $class = shift; + my $id = shift; + my $count = shift; + $id =~ s/([^-_a-z0-9])/unpack("H*",$1)/ige; # Convert non-word chars to hex + $id = "id-".$id; # To distinguish it from a process id + my $parallel_locks = $Global::cache_dir . "/semaphores"; + -d $parallel_locks or ::mkdir_or_die($parallel_locks); + my $lockdir = "$parallel_locks/$id"; + + my $lockfile = $lockdir.".lock"; + if($count < 1) { ::die_bug("semaphore-count: $count"); } + return bless { + 'lockfile' => $lockfile, + 'lockfh' => Symbol::gensym(), + 'lockdir' => $lockdir, + 'id' => $id, + 'idfile' => $lockdir."/".$id, + 'pid' => $$, + 'pidfile' => $lockdir."/".$$.'@'.::hostname(), + 'count' => $count + 1 # nlinks returns a link for the 'id-' as well + }, ref($class) || $class; +} + +sub remove_dead_locks { + my $self = shift; + my $lockdir = $self->{'lockdir'}; + + for my $d (glob "$lockdir/*") { + $d =~ m:$lockdir/([0-9]+)\@([-\._a-z0-9]+)$:o or next; + my ($pid, $host) = ($1, $2); + if($host eq ::hostname()) { + if(kill 0, $pid) { + ::debug("sem", "Alive: $pid $d\n"); + } else { + ::debug("sem", "Dead: $d\n"); + ::rm($d); + } + } + } +} + +sub acquire { + my $self = shift; + my $sleep = 1; # 1 ms + my $start_time = time; + while(1) { + # Can we get a lock? + $self->atomic_link_if_count_less_than() and last; + $self->remove_dead_locks(); + # Retry slower and slower up to 1 second + $sleep = ($sleep < 1000) ? ($sleep * 1.1) : ($sleep); + # Random to avoid every sleeping job waking up at the same time + ::usleep(rand()*$sleep); + if($opt::semaphoretimeout) { + if($opt::semaphoretimeout > 0 + and + time - $start_time > $opt::semaphoretimeout) { + # Timeout: Take the semaphore anyway + ::warning("Semaphore timed out. Stealing the semaphore."); + if(not -e $self->{'idfile'}) { + open (my $fh, ">", $self->{'idfile'}) or + ::die_bug("timeout_write_idfile: $self->{'idfile'}"); + close $fh; + } + link $self->{'idfile'}, $self->{'pidfile'}; + last; + } + if($opt::semaphoretimeout < 0 + and + time - $start_time > -$opt::semaphoretimeout) { + # Timeout: Exit + ::warning("Semaphore timed out. Exiting."); + exit(1); + last; + } + } + } + ::debug("sem", "acquired $self->{'pid'}\n"); +} + +sub release { + my $self = shift; + ::rm($self->{'pidfile'}); + if($self->nlinks() == 1) { + # This is the last link, so atomic cleanup + $self->lock(); + if($self->nlinks() == 1) { + ::rm($self->{'idfile'}); + rmdir $self->{'lockdir'}; + } + $self->unlock(); + } + ::debug("run", "released $self->{'pid'}\n"); +} + +sub pid_change { + # This should do what release()+acquire() would do without having + # to re-acquire the semaphore + my $self = shift; + + my $old_pidfile = $self->{'pidfile'}; + $self->{'pid'} = $$; + $self->{'pidfile'} = $self->{'lockdir'}."/".$$.'@'.::hostname(); + my $retval = link $self->{'idfile'}, $self->{'pidfile'}; + ::debug("sem","link($self->{'idfile'},$self->{'pidfile'})=$retval\n"); + ::rm($old_pidfile); +} + +sub atomic_link_if_count_less_than { + # Link $file1 to $file2 if nlinks to $file1 < $count + my $self = shift; + my $retval = 0; + $self->lock(); + my $nlinks = $self->nlinks(); + ::debug("sem","$nlinks<$self->{'count'} "); + if($nlinks < $self->{'count'}) { + -d $self->{'lockdir'} or ::mkdir_or_die($self->{'lockdir'}); + if(not -e $self->{'idfile'}) { + open (my $fh, ">", $self->{'idfile'}) or + ::die_bug("write_idfile: $self->{'idfile'}"); + close $fh; + } + $retval = link $self->{'idfile'}, $self->{'pidfile'}; + ::debug("sem","link($self->{'idfile'},$self->{'pidfile'})=$retval\n"); + } + $self->unlock(); + ::debug("sem", "atomic $retval"); + return $retval; +} + +sub nlinks { + my $self = shift; + if(-e $self->{'idfile'}) { + return (stat(_))[3]; + } else { + return 0; + } +} + +sub lock { + my $self = shift; + my $sleep = 100; # 100 ms + my $total_sleep = 0; + $Global::use{"Fcntl"} ||= eval "use Fcntl qw(:DEFAULT :flock); 1;"; + my $locked = 0; + while(not $locked) { + if(tell($self->{'lockfh'}) == -1) { + # File not open + open($self->{'lockfh'}, ">", $self->{'lockfile'}) + or ::debug("run", "Cannot open $self->{'lockfile'}"); + } + if($self->{'lockfh'}) { + # File is open + chmod 0666, $self->{'lockfile'}; # assuming you want it a+rw + if(flock($self->{'lockfh'}, LOCK_EX()|LOCK_NB())) { + # The file is locked: No need to retry + $locked = 1; + last; + } else { + if ($! =~ m/Function not implemented/) { + ::warning("flock: $!", + "Will wait for a random while."); + ::usleep(rand(5000)); + # File cannot be locked: No need to retry + $locked = 2; + last; + } + } + } + # Locking failed in first round + # Sleep and try again + $sleep = ($sleep < 1000) ? ($sleep * 1.1) : ($sleep); + # Random to avoid every sleeping job waking up at the same time + ::usleep(rand()*$sleep); + $total_sleep += $sleep; + if($opt::semaphoretimeout) { + if($opt::semaphoretimeout > 0 + and + $total_sleep/1000 > $opt::semaphoretimeout) { + # Timeout: Take the semaphore anyway + ::warning("Semaphore timed out. Taking the semaphore."); + $locked = 3; + last; + } + if($opt::semaphoretimeout < 0 + and + $total_sleep/1000 > -$opt::semaphoretimeout) { + # Timeout: Exit + ::warning("Semaphore timed out. Exiting."); + $locked = 4; + last; + } + } else { + if($total_sleep/1000 > 30) { + ::warning("Semaphore stuck for 30 seconds. ". + "Consider using --semaphoretimeout."); + } + } + } + ::debug("run", "locked $self->{'lockfile'}"); +} + +sub unlock { + my $self = shift; + ::rm($self->{'lockfile'}); + close $self->{'lockfh'}; + ::debug("run", "unlocked\n"); +} + +# Keep perl -w happy + +$opt::x = $Semaphore::timeout = $Semaphore::wait = +$Job::file_descriptor_warning_printed = $Global::envdef = @Arg::arg = +$Global::max_slot_number = $opt::session; diff --git a/scripts/test.sh b/scripts/test.sh new file mode 100755 index 000000000..5141348a1 --- /dev/null +++ b/scripts/test.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +./scripts/parallel --tag <` this repository +* `cd basic-app` +* `yarn install` + +## Running / Development + +* `ember serve` +* Visit your app at [http://localhost:4200](http://localhost:4200). +* Visit your tests at [http://localhost:4200/tests](http://localhost:4200/tests). + +### Code Generators + +Make use of the many generators for code, try `ember help generate` for more details + +### Running Tests + +* `ember test` +* `ember test --server` + +### Linting + +* `yarn lint:js` +* `yarn lint:js --fix` + +### Building + +* `ember build` (development) +* `ember build --environment production` (production) + +### Deploying + +Specify what it takes to deploy your app. + +## Further Reading / Useful Links + +* [ember.js](https://emberjs.com/) +* [ember-cli](https://ember-cli.com/) +* Development Browser Extensions + * [ember inspector for chrome](https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi) + * [ember inspector for firefox](https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/) diff --git a/test-apps/basic-app/app/app.js b/test-apps/basic-app/app/app.js new file mode 100644 index 000000000..b3b2bd677 --- /dev/null +++ b/test-apps/basic-app/app/app.js @@ -0,0 +1,14 @@ +import Application from '@ember/application'; +import Resolver from './resolver'; +import loadInitializers from 'ember-load-initializers'; +import config from './config/environment'; + +const App = Application.extend({ + modulePrefix: config.modulePrefix, + podModulePrefix: config.podModulePrefix, + Resolver +}); + +loadInitializers(App, config.modulePrefix); + +export default App; diff --git a/test-apps/basic-app/app/components/.gitkeep b/test-apps/basic-app/app/components/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test-apps/basic-app/app/controllers/.gitkeep b/test-apps/basic-app/app/controllers/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test-apps/basic-app/app/controllers/application.js b/test-apps/basic-app/app/controllers/application.js new file mode 100644 index 000000000..ebf85aef1 --- /dev/null +++ b/test-apps/basic-app/app/controllers/application.js @@ -0,0 +1,22 @@ +/* global requirejs */ +import Controller from '@ember/controller'; +import { computed } from '@ember/object'; +import ENV from 'basic-app/config/environment'; + +export default Controller.extend({ + + environment: ENV.environment, + + mirageModules: computed(function() { + return Object.keys(requirejs.entries) + .filter(key => key.match('^ember-cli-mirage')); + }), + + otherIncludedModules: computed(function() { + return Object.keys(requirejs.entries) + .filter(key => { + return key.match('^pretender') || key.match('^lodash') || key.match('initializers/ember-cli-mirage'); + }); + }) + +}); diff --git a/test-apps/basic-app/app/helpers/.gitkeep b/test-apps/basic-app/app/helpers/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test-apps/basic-app/app/index.html b/test-apps/basic-app/app/index.html new file mode 100644 index 000000000..326f147b5 --- /dev/null +++ b/test-apps/basic-app/app/index.html @@ -0,0 +1,25 @@ + + + + + + BasicApp + + + + {{content-for "head"}} + + + + + {{content-for "head-footer"}} + + + {{content-for "body"}} + + + + + {{content-for "body-footer"}} + + diff --git a/test-apps/basic-app/app/models/.gitkeep b/test-apps/basic-app/app/models/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test-apps/basic-app/app/resolver.js b/test-apps/basic-app/app/resolver.js new file mode 100644 index 000000000..2fb563d6c --- /dev/null +++ b/test-apps/basic-app/app/resolver.js @@ -0,0 +1,3 @@ +import Resolver from 'ember-resolver'; + +export default Resolver; diff --git a/fastboot-tests/fixtures/fastboot/app/router.js b/test-apps/basic-app/app/router.js similarity index 100% rename from fastboot-tests/fixtures/fastboot/app/router.js rename to test-apps/basic-app/app/router.js diff --git a/test-apps/basic-app/app/routes/.gitkeep b/test-apps/basic-app/app/routes/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test-apps/basic-app/app/styles/app.css b/test-apps/basic-app/app/styles/app.css new file mode 100644 index 000000000..e69de29bb diff --git a/test-apps/basic-app/app/templates/application.hbs b/test-apps/basic-app/app/templates/application.hbs new file mode 100644 index 000000000..14ccd024c --- /dev/null +++ b/test-apps/basic-app/app/templates/application.hbs @@ -0,0 +1,22 @@ +

Welcome to Ember

+ +

+ Environment: + + {{environment}} + +

+ +

+ Mirage modules in project: + + {{mirageModules.length}} + +

+ +

+ Other modules in project: + + {{otherIncludedModules.length}} + +

diff --git a/test-apps/basic-app/app/templates/components/.gitkeep b/test-apps/basic-app/app/templates/components/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test-apps/basic-app/config/environment.js b/test-apps/basic-app/config/environment.js new file mode 100644 index 000000000..07f245faa --- /dev/null +++ b/test-apps/basic-app/config/environment.js @@ -0,0 +1,57 @@ +'use strict'; + +module.exports = function(environment) { + let ENV = { + modulePrefix: 'basic-app', + environment, + rootURL: '/', + locationType: 'auto', + EmberENV: { + FEATURES: { + // Here you can enable experimental features on an ember canary build + // e.g. 'with-controller': true + }, + EXTEND_PROTOTYPES: { + // Prevent Ember Data from overriding Date.parse. + Date: false + } + }, + + APP: { + // Here you can pass flags/options to your application instance + // when it is created + } + }; + + if (process.env.MIRAGE_ENABLED) { + ENV['ember-cli-mirage'] = { + enabled: true + }; + } + + if (environment === 'development') { + // ENV.APP.LOG_RESOLVER = true; + // ENV.APP.LOG_ACTIVE_GENERATION = true; + // ENV.APP.LOG_TRANSITIONS = true; + // ENV.APP.LOG_TRANSITIONS_INTERNAL = true; + // ENV.APP.LOG_VIEW_LOOKUPS = true; + } + + if (environment === 'test') { + // Testem prefers this... + ENV.locationType = 'none'; + + // keep test console output quieter + ENV.APP.LOG_ACTIVE_GENERATION = false; + ENV.APP.LOG_VIEW_LOOKUPS = false; + + ENV.APP.rootElement = '#ember-testing'; + ENV.APP.autoboot = false; + } + + if (environment === 'production') { + // here you can enable a production-specific feature + } + + return ENV; +}; diff --git a/test-apps/basic-app/config/targets.js b/test-apps/basic-app/config/targets.js new file mode 100644 index 000000000..8ffae3636 --- /dev/null +++ b/test-apps/basic-app/config/targets.js @@ -0,0 +1,18 @@ +'use strict'; + +const browsers = [ + 'last 1 Chrome versions', + 'last 1 Firefox versions', + 'last 1 Safari versions' +]; + +const isCI = !!process.env.CI; +const isProduction = process.env.EMBER_ENV === 'production'; + +if (isCI || isProduction) { + browsers.push('ie 11'); +} + +module.exports = { + browsers +}; diff --git a/test-apps/basic-app/ember-cli-build.js b/test-apps/basic-app/ember-cli-build.js new file mode 100644 index 000000000..d690a2531 --- /dev/null +++ b/test-apps/basic-app/ember-cli-build.js @@ -0,0 +1,24 @@ +'use strict'; + +const EmberApp = require('ember-cli/lib/broccoli/ember-app'); + +module.exports = function(defaults) { + let app = new EmberApp(defaults, { + // Add options here + }); + + // Use `app.import` to add additional libraries to the generated + // output files. + // + // If you need to use different assets in different + // environments, specify an object as the first parameter. That + // object's keys should be the environment name and the values + // should be the asset to use in that environment. + // + // If the library that you are including contains AMD or ES6 + // modules that you would like to import into your application + // please specify an object with the list of modules as keys + // along with the exports of each module as its value. + + return app.toTree(); +}; diff --git a/test-apps/basic-app/fastboot-tests/included-files-test.js b/test-apps/basic-app/fastboot-tests/included-files-test.js new file mode 100644 index 000000000..f4e1a6acf --- /dev/null +++ b/test-apps/basic-app/fastboot-tests/included-files-test.js @@ -0,0 +1,85 @@ +const FastBoot = require('fastboot'); +const { execFileSync } = require('child_process'); +const { module: qModule, test } = require('qunit'); +const jsdom = require('jsdom'); +const { JSDOM } = jsdom; + +const findTextFromHtml = (html, selector) => { + let document = new JSDOM(html).window.document; + return document.querySelector(selector) + .textContent + .trim(); +}; + +qModule('basic-app | fastboot | included files', function(hooks) { + + test('it includes all modules in development by default', async function(assert) { + execFileSync('node', [ + require.resolve('ember-cli/bin/ember'), + 'build' + ]); + let fastboot = new FastBoot({ + distPath: 'dist', + resilient: false + }); + + let page = await fastboot.visit('/'); + let html = await page.html(); + + assert.equal(findTextFromHtml(html, '[data-test-id="environment"]'), 'development'); + assert.ok(+findTextFromHtml(html, '[data-test-id="mirage-module-count"]') > 1); + assert.ok(+findTextFromHtml(html, '[data-test-id="other-module-count"]') > 1); + }); + + test('it includes all modules in test by default', async function(assert) { + execFileSync('node', [ + require.resolve('ember-cli/bin/ember'), + 'build', + '--environment=test' + ]); + let fastboot = new FastBoot({ + distPath: 'dist', + resilient: false + }); + + let page = await fastboot.visit('/'); + let html = await page.html(); + + assert.equal(findTextFromHtml(html, '[data-test-id="environment"]'), 'test'); + assert.ok(+findTextFromHtml(html, '[data-test-id="mirage-module-count"]') > 1); + assert.ok(+findTextFromHtml(html, '[data-test-id="other-module-count"]') > 1); + }); + + test('it only includes an initializer in production by default', async function(assert) { + execFileSync('node', [require.resolve('ember-cli/bin/ember'), 'build', '-prod']); + let fastboot = new FastBoot({ + distPath: 'dist', + resilient: false + }); + let page = await fastboot.visit('/'); + let html = await page.html(); + + assert.equal(findTextFromHtml(html, '[data-test-id="environment"]'), 'production'); + assert.equal(findTextFromHtml(html, '[data-test-id="mirage-module-count"]'), '0'); + assert.equal(findTextFromHtml(html, '[data-test-id="other-module-count"]'), '1'); + }); + + test('all files can be included in production by explicitly setting enabled to true', async function(assert) { + process.env.MIRAGE_ENABLED = 'true'; + execFileSync('node', [ + require.resolve('ember-cli/bin/ember'), + 'build', + '-prod' + ]); + let fastboot = new FastBoot({ + distPath: 'dist', + resilient: false + }); + let page = await fastboot.visit('/'); + let html = await page.html(); + + assert.equal(findTextFromHtml(html, '[data-test-id="environment"]'), 'production'); + assert.ok(+findTextFromHtml(html, '[data-test-id="mirage-module-count"]') > 1); + assert.ok(+findTextFromHtml(html, '[data-test-id="other-module-count"]') > 1); + }); +}); diff --git a/test-apps/basic-app/mirage/config.js b/test-apps/basic-app/mirage/config.js new file mode 100644 index 000000000..ab35aa45a --- /dev/null +++ b/test-apps/basic-app/mirage/config.js @@ -0,0 +1,2 @@ +export default function() { +} diff --git a/test-apps/basic-app/package.json b/test-apps/basic-app/package.json new file mode 100644 index 000000000..8a3d2afb3 --- /dev/null +++ b/test-apps/basic-app/package.json @@ -0,0 +1,50 @@ +{ + "name": "basic-app", + "version": "0.0.0", + "private": true, + "description": "Small description for basic-app goes here", + "license": "MIT", + "author": "", + "directories": { + "doc": "doc", + "test": "tests" + }, + "repository": "", + "scripts": { + "build": "ember build", + "lint:js": "eslint ./*.js app blueprints config lib server tests", + "start": "ember serve", + "test": "ember test --test-port=0", + "test:fastboot": "qunit fastboot-tests/**/*.js" + }, + "devDependencies": { + "broccoli-asset-rev": "*", + "ember-ajax": "*", + "ember-cli": "*", + "ember-cli-babel": "*", + "ember-cli-dependency-checker": "*", + "ember-cli-eslint": "*", + "ember-cli-fastboot": "*", + "ember-cli-htmlbars": "*", + "ember-cli-htmlbars-inline-precompile": "*", + "ember-cli-inject-live-reload": "*", + "ember-cli-mirage": "*", + "ember-cli-qunit": "*", + "ember-cli-shims": "*", + "ember-cli-sri": "*", + "ember-cli-uglify": "*", + "ember-data": "*", + "ember-export-application-global": "*", + "ember-load-initializers": "*", + "ember-resolver": "*", + "ember-source": "*", + "eslint-plugin-ember": "*", + "fastboot": "*", + "jsdom": "*", + "loader.js": "*", + "qunit": "*" + }, + "engines": { + "node": ">= 8.*" + } +} diff --git a/test-apps/basic-app/public/robots.txt b/test-apps/basic-app/public/robots.txt new file mode 100644 index 000000000..f5916452e --- /dev/null +++ b/test-apps/basic-app/public/robots.txt @@ -0,0 +1,3 @@ +# http://www.robotstxt.org +User-agent: * +Disallow: diff --git a/test-apps/basic-app/testem.js b/test-apps/basic-app/testem.js new file mode 100644 index 000000000..d1755a4ea --- /dev/null +++ b/test-apps/basic-app/testem.js @@ -0,0 +1,24 @@ +module.exports = { + test_page: 'tests/index.html?hidepassed', + disable_watching: true, + launch_in_ci: [ + 'Chrome' + ], + launch_in_dev: [ + 'Chrome' + ], + browser_args: { + Chrome: { + mode: 'ci', + args: [ + // --no-sandbox is needed when running Chrome inside a container + process.env.TRAVIS ? '--no-sandbox' : null, + + '--disable-gpu', + '--headless', + '--remote-debugging-port=0', + '--window-size=1440,900' + ].filter(Boolean) + } + } +}; diff --git a/test-apps/basic-app/tests/helpers/destroy-app.js b/test-apps/basic-app/tests/helpers/destroy-app.js new file mode 100644 index 000000000..f8d24fc36 --- /dev/null +++ b/test-apps/basic-app/tests/helpers/destroy-app.js @@ -0,0 +1,9 @@ +import { run } from '@ember/runloop'; + +export default function destroyApp(application) { + run(function() { + application.destroy(); + + server.shutdown(); + }); +} diff --git a/test-apps/basic-app/tests/helpers/module-for-acceptance.js b/test-apps/basic-app/tests/helpers/module-for-acceptance.js new file mode 100644 index 000000000..90a93bac2 --- /dev/null +++ b/test-apps/basic-app/tests/helpers/module-for-acceptance.js @@ -0,0 +1,21 @@ +import { module } from 'qunit'; +import { resolve } from 'rsvp'; +import startApp from '../helpers/start-app'; +import destroyApp from '../helpers/destroy-app'; + +export default function(name, options = {}) { + module(name, { + beforeEach() { + this.application = startApp(); + + if (options.beforeEach) { + return options.beforeEach.apply(this, arguments); + } + }, + + afterEach() { + let afterEach = options.afterEach && options.afterEach.apply(this, arguments); + return resolve(afterEach).then(() => destroyApp(this.application)); + } + }); +} diff --git a/test-apps/basic-app/tests/helpers/promise-ajax.js b/test-apps/basic-app/tests/helpers/promise-ajax.js new file mode 100644 index 000000000..f84ad8631 --- /dev/null +++ b/test-apps/basic-app/tests/helpers/promise-ajax.js @@ -0,0 +1,9 @@ +import { Promise } from 'rsvp'; + +export default (options) => { + return new Promise((resolve, reject) => { + $.ajax(options) + .done((data, status, xhr) => resolve({data, status, xhr})) + .fail((xhr, status, error) => reject({xhr, status, error})); + }); +}; diff --git a/test-apps/basic-app/tests/helpers/resolver.js b/test-apps/basic-app/tests/helpers/resolver.js new file mode 100644 index 000000000..b208d38d0 --- /dev/null +++ b/test-apps/basic-app/tests/helpers/resolver.js @@ -0,0 +1,11 @@ +import Resolver from '../../resolver'; +import config from '../../config/environment'; + +const resolver = Resolver.create(); + +resolver.namespace = { + modulePrefix: config.modulePrefix, + podModulePrefix: config.podModulePrefix +}; + +export default resolver; diff --git a/test-apps/basic-app/tests/helpers/start-app.js b/test-apps/basic-app/tests/helpers/start-app.js new file mode 100644 index 000000000..99d35dcf4 --- /dev/null +++ b/test-apps/basic-app/tests/helpers/start-app.js @@ -0,0 +1,17 @@ +import Application from '../../app'; +import config from '../../config/environment'; +import { merge } from '@ember/polyfills'; +import { run } from '@ember/runloop'; + +export default function startApp(attrs) { + let attributes = merge({}, config.APP); + attributes.autoboot = true; + attributes = merge(attributes, attrs); // use defaults, but you can override; + + return run(() => { + let application = Application.create(attributes); + application.setupForTesting(); + application.injectTestHelpers(); + return application; + }); +} diff --git a/test-apps/basic-app/tests/index.html b/test-apps/basic-app/tests/index.html new file mode 100644 index 000000000..008e6d610 --- /dev/null +++ b/test-apps/basic-app/tests/index.html @@ -0,0 +1,33 @@ + + + + + + BasicApp Tests + + + + {{content-for "head"}} + {{content-for "test-head"}} + + + + + + {{content-for "head-footer"}} + {{content-for "test-head-footer"}} + + + {{content-for "body"}} + {{content-for "test-body"}} + + + + + + + + {{content-for "body-footer"}} + {{content-for "test-body-footer"}} + + diff --git a/test-apps/basic-app/tests/test-helper.js b/test-apps/basic-app/tests/test-helper.js new file mode 100644 index 000000000..0382a848d --- /dev/null +++ b/test-apps/basic-app/tests/test-helper.js @@ -0,0 +1,8 @@ +import Application from '../app'; +import config from '../config/environment'; +import { setApplication } from '@ember/test-helpers'; +import { start } from 'ember-qunit'; + +setApplication(Application.create(config.APP)); + +start(); diff --git a/test-apps/basic-app/vendor/.gitkeep b/test-apps/basic-app/vendor/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/yarn.lock b/yarn.lock index 4a6494805..656a91379 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,82 @@ # yarn lockfile v1 +"@babel/code-frame@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" + dependencies: + "@babel/highlight" "7.0.0-beta.44" + +"@babel/generator@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" + dependencies: + "@babel/types" "7.0.0-beta.44" + jsesc "^2.5.1" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-function-name@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" + dependencies: + "@babel/helper-get-function-arity" "7.0.0-beta.44" + "@babel/template" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + +"@babel/helper-get-function-arity@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" + dependencies: + "@babel/types" "7.0.0-beta.44" + +"@babel/helper-split-export-declaration@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" + dependencies: + "@babel/types" "7.0.0-beta.44" + +"@babel/highlight@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +"@babel/template@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" + dependencies: + "@babel/code-frame" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + babylon "7.0.0-beta.44" + lodash "^4.2.0" + +"@babel/traverse@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" + dependencies: + "@babel/code-frame" "7.0.0-beta.44" + "@babel/generator" "7.0.0-beta.44" + "@babel/helper-function-name" "7.0.0-beta.44" + "@babel/helper-split-export-declaration" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + babylon "7.0.0-beta.44" + debug "^3.1.0" + globals "^11.1.0" + invariant "^2.2.0" + lodash "^4.2.0" + +"@babel/types@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" + dependencies: + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^2.0.0" + "@ember/test-helpers@^0.7.17": version "0.7.17" resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-0.7.17.tgz#17ff5f1d005d8b6331585e99013d66626a8d8068" @@ -20,10 +96,14 @@ dependencies: "@glimmer/di" "^0.2.0" -abab@^1.0.3: +abab@^1.0.3, abab@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" +abab@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -48,6 +128,12 @@ acorn-globals@^3.1.0: dependencies: acorn "^4.0.4" +acorn-globals@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" + dependencies: + acorn "^5.0.0" + acorn-jsx@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" @@ -62,6 +148,10 @@ acorn@^4.0.4: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" +acorn@^5.0.0, acorn@^5.5.3: + version "5.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" + acorn@^5.4.0: version "5.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.4.1.tgz#fdc58d9d17f4a4e98d102ded826a9b9759125102" @@ -123,6 +213,12 @@ amd-name-resolver@1.0.0: dependencies: ensure-posix-path "^1.0.1" +amd-name-resolver@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.2.0.tgz#fc41b3848824b557313897d71f8d5a0184fbe679" + dependencies: + ensure-posix-path "^1.0.1" + amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" @@ -313,6 +409,10 @@ async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + async-promise-queue@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/async-promise-queue/-/async-promise-queue-1.0.4.tgz#308baafbc74aff66a0bb6e7f4a18d4fe8434440c" @@ -386,6 +486,17 @@ babel-core@^6.14.0, babel-core@^6.26.0: slash "^1.0.0" source-map "^0.5.6" +babel-eslint@^8.2.6: + version "8.2.6" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.6.tgz#6270d0c73205628067c0f7ae1693a9e797acefd9" + dependencies: + "@babel/code-frame" "7.0.0-beta.44" + "@babel/traverse" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + babylon "7.0.0-beta.44" + eslint-scope "3.7.1" + eslint-visitor-keys "^1.0.0" + babel-generator@^6.26.0: version "6.26.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" @@ -518,12 +629,24 @@ babel-plugin-debug-macros@^0.1.10, babel-plugin-debug-macros@^0.1.11: dependencies: semver "^5.3.0" +babel-plugin-debug-macros@^0.2.0-beta.6: + version "0.2.0-beta.6" + resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.2.0-beta.6.tgz#ecdf6e408d5c863ab21740d7ad7f43f027d2f912" + dependencies: + semver "^5.3.0" + babel-plugin-ember-modules-api-polyfill@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.3.0.tgz#0c01f359658cfb9c797f705af6b09f6220205ae0" dependencies: ember-rfc176-data "^0.3.0" +babel-plugin-ember-modules-api-polyfill@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.3.2.tgz#56ea34bea963498d070a2b7dc2ce18a92c434093" + dependencies: + ember-rfc176-data "^0.3.0" + babel-plugin-feature-flags@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/babel-plugin-feature-flags/-/babel-plugin-feature-flags-0.3.1.tgz#9c827cf9a4eb9a19f725ccb239e85cab02036fc1" @@ -745,7 +868,7 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-polyfill@^6.16.0: +babel-polyfill@^6.16.0, babel-polyfill@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" dependencies: @@ -788,6 +911,41 @@ babel-preset-env@^1.5.1: invariant "^2.2.2" semver "^5.3.0" +babel-preset-env@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^3.2.6" + invariant "^2.2.2" + semver "^5.3.0" + babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" @@ -848,6 +1006,10 @@ babel6-plugin-strip-heimdall@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/babel6-plugin-strip-heimdall/-/babel6-plugin-strip-heimdall-6.0.1.tgz#35f80eddec1f7fffdc009811dfbd46d9965072b6" +babylon@7.0.0-beta.44: + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" + babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" @@ -1048,6 +1210,21 @@ broccoli-babel-transpiler@^6.0.0, broccoli-babel-transpiler@^6.1.2: rsvp "^3.5.0" workerpool "^2.3.0" +broccoli-babel-transpiler@^6.4.5: + version "6.5.0" + resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.5.0.tgz#aa501a227b298a99742fdd0309b1eaad7124bba0" + dependencies: + babel-core "^6.26.0" + broccoli-funnel "^2.0.1" + broccoli-merge-trees "^2.0.0" + broccoli-persistent-filter "^1.4.3" + clone "^2.0.0" + hash-for-dep "^1.2.3" + heimdalljs-logger "^0.1.7" + json-stable-stringify "^1.0.0" + rsvp "^4.8.2" + workerpool "^2.3.0" + broccoli-brocfile-loader@^0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/broccoli-brocfile-loader/-/broccoli-brocfile-loader-0.18.0.tgz#2e86021c805c34ffc8d29a2fb721cf273e819e4b" @@ -1128,7 +1305,7 @@ broccoli-config-replace@^1.1.2: debug "^2.2.0" fs-extra "^0.24.0" -broccoli-debug@^0.6.1, broccoli-debug@^0.6.2, broccoli-debug@^0.6.3: +broccoli-debug@^0.6.1, broccoli-debug@^0.6.2, broccoli-debug@^0.6.3, broccoli-debug@^0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.4.tgz#986eb3d2005e00e3bb91f9d0a10ab137210cd150" dependencies: @@ -1258,6 +1435,10 @@ broccoli-middleware@^1.0.0: handlebars "^4.0.4" mime "^1.2.11" +broccoli-node-info@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-1.1.0.tgz#3aa2e31e07e5bdb516dd25214f7c45ba1c459412" + broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.2.0, broccoli-persistent-filter@^1.4.0, broccoli-persistent-filter@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.3.tgz#3511bc52fc53740cda51621f58a28152d9911bc1" @@ -1302,6 +1483,10 @@ broccoli-replace@^0.12.0: broccoli-persistent-filter "^1.2.0" minimatch "^3.0.0" +broccoli-slow-trees@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-2.0.0.tgz#9741afe992787add64aec7f7c8211dfcc058278d" + broccoli-slow-trees@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-3.0.1.tgz#9bf2a9e2f8eb3ed3a3f2abdde988da437ccdc9b4" @@ -1348,6 +1533,17 @@ broccoli-string-replace@^0.1.1: broccoli-persistent-filter "^1.1.5" minimatch "^3.0.3" +broccoli-test-helper@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/broccoli-test-helper/-/broccoli-test-helper-1.3.0.tgz#ba673418b3963b2cc466be66092a5928700c827f" + dependencies: + broccoli "^1.1.0" + fixturify "^0.3.2" + fs-tree-diff "^0.5.6" + mktemp "^0.4.0" + rimraf "^2.5.4" + walk-sync "^0.3.1" + broccoli-uglify-sourcemap@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/broccoli-uglify-sourcemap/-/broccoli-uglify-sourcemap-2.0.2.tgz#f4a73112f1f56b46043e2e89cba5ce7762cddeb3" @@ -1375,6 +1571,30 @@ broccoli-writer@~0.1.1: quick-temp "^0.1.0" rsvp "^3.0.6" +broccoli@^1.1.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/broccoli/-/broccoli-1.1.4.tgz#b023b028b866f447ed14341007961efd03f7251c" + dependencies: + broccoli-node-info "1.1.0" + broccoli-slow-trees "2.0.0" + broccoli-source "^1.1.0" + commander "^2.5.0" + connect "^3.3.3" + copy-dereference "^1.0.0" + findup-sync "^1.0.0" + handlebars "^4.0.4" + heimdalljs-logger "^0.1.7" + mime "^1.2.11" + rimraf "^2.4.3" + rsvp "^3.5.0" + sane "^1.4.1" + tmp "0.0.31" + underscore.string "^3.2.2" + +browser-process-hrtime@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" + browser-stdout@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" @@ -1386,12 +1606,23 @@ browserslist@^2.1.2: caniuse-lite "^1.0.30000792" electron-to-chromium "^1.3.30" +browserslist@^3.2.6: + version "3.2.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + dependencies: + caniuse-lite "^1.0.30000844" + electron-to-chromium "^1.3.47" + bser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" dependencies: node-int64 "^0.4.0" +buffer-from@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" + builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -1467,6 +1698,10 @@ caniuse-lite@^1.0.30000792: version "1.0.30000803" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000803.tgz#9939c37149d38d5f4540430490d240c03106a0f5" +caniuse-lite@^1.0.30000844: + version "1.0.30000865" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25" + capture-exit@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" @@ -1705,6 +1940,10 @@ commander@2.9.0: dependencies: graceful-readlink ">= 1.0.0" +commander@^2.5.0: + version "2.16.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" + commander@^2.6.0: version "2.14.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.0.tgz#7b25325963e6aace20d3a9285b09379b0c2208b5" @@ -1776,6 +2015,15 @@ configstore@^3.0.0: write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" +connect@^3.3.3: + version "3.6.6" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" + dependencies: + debug "2.6.9" + finalhandler "1.1.0" + parseurl "~1.3.2" + utils-merge "1.0.1" + console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" @@ -1813,7 +2061,7 @@ continuable-cache@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f" -convert-source-map@^1.5.0: +convert-source-map@^1.5.0, convert-source-map@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" @@ -1821,7 +2069,7 @@ cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" -cookie@0.3.1: +cookie@0.3.1, cookie@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" @@ -1906,6 +2154,12 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": dependencies: cssom "0.3.x" +cssstyle@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.0.0.tgz#79b16d51ec5591faec60e688891f15d2a5705129" + dependencies: + cssom "0.3.x" + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -1922,6 +2176,14 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-urls@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f" + dependencies: + abab "^1.0.4" + whatwg-mimetype "^2.0.0" + whatwg-url "^6.4.0" + debug@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" @@ -1946,7 +2208,7 @@ debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.3. dependencies: ms "2.0.0" -debug@^3.1.0: +debug@^3.0.0, debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" dependencies: @@ -2052,6 +2314,12 @@ doctrine@^2.1.0: dependencies: esutils "^2.0.2" +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + dependencies: + webidl-conversions "^4.0.2" + dot-prop@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" @@ -2076,6 +2344,10 @@ electron-to-chromium@^1.3.30: version "1.3.32" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.32.tgz#11d0684c0840e003c4be8928f8ac5f35dbc2b4e6" +electron-to-chromium@^1.3.47: + version "1.3.52" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0" + ember-ajax@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-3.0.0.tgz#8f21e9da0c1d433cf879aa855fce464d517e9ab5" @@ -2125,6 +2397,24 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-version-checker "^2.1.0" semver "^5.4.1" +ember-cli-babel@^6.7.2: + version "6.16.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.16.0.tgz#623b4a2764ece72b65f1572fc8aeb5714a450228" + dependencies: + amd-name-resolver "1.2.0" + babel-plugin-debug-macros "^0.2.0-beta.6" + babel-plugin-ember-modules-api-polyfill "^2.3.2" + babel-plugin-transform-es2015-modules-amd "^6.24.0" + babel-polyfill "^6.26.0" + babel-preset-env "^1.7.0" + broccoli-babel-transpiler "^6.4.5" + broccoli-debug "^0.6.4" + broccoli-funnel "^2.0.0" + broccoli-source "^1.1.0" + clone "^2.0.0" + ember-cli-version-checker "^2.1.2" + semver "^5.5.0" + ember-cli-broccoli-sane-watcher@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.0.4.tgz#f43f42f75b7509c212fb926cd9aea86ae19264c6" @@ -2153,6 +2443,27 @@ ember-cli-eslint@^4.2.1: rsvp "^4.6.1" walk-sync "^0.3.0" +ember-cli-fastboot@^1.1.4-beta.1: + version "1.1.4-beta.1" + resolved "https://registry.yarnpkg.com/ember-cli-fastboot/-/ember-cli-fastboot-1.1.4-beta.1.tgz#7063df36e62b92fd0f60c9a23dd03b5b57aec3fe" + dependencies: + broccoli-concat "^3.2.2" + broccoli-funnel "^2.0.0" + broccoli-merge-trees "^2.0.0" + broccoli-plugin "^1.2.1" + chalk "^2.0.1" + ember-cli-babel "^6.7.2" + ember-cli-lodash-subset "2.0.1" + ember-cli-preprocess-registry "^3.1.0" + ember-cli-version-checker "^2.1.0" + fastboot "^1.1.4-beta.1" + fastboot-express-middleware "^1.1.0" + fastboot-transform "^0.1.2" + fs-extra "^4.0.2" + json-stable-stringify "^1.0.1" + md5-hex "^2.0.0" + silent-error "^1.0.0" + ember-cli-get-component-path-option@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-get-component-path-option/-/ember-cli-get-component-path-option-1.0.0.tgz#0d7b595559e2f9050abed804f1d8eff1b08bc771" @@ -2210,14 +2521,14 @@ ember-cli-legacy-blueprints@^0.2.0: rsvp "^4.7.0" silent-error "^1.0.0" +ember-cli-lodash-subset@2.0.1, ember-cli-lodash-subset@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-2.0.1.tgz#20cb68a790fe0fde2488ddfd8efbb7df6fe766f2" + ember-cli-lodash-subset@^1.0.7: version "1.0.12" resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-1.0.12.tgz#af2e77eba5dcb0d77f3308d3a6fd7d3450f6e537" -ember-cli-lodash-subset@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-2.0.1.tgz#20cb68a790fe0fde2488ddfd8efbb7df6fe766f2" - ember-cli-node-assets@^0.1.4: version "0.1.6" resolved "https://registry.yarnpkg.com/ember-cli-node-assets/-/ember-cli-node-assets-0.1.6.tgz#6488a2949048c801ad6d9e33753c7bce32fc1146" @@ -2331,6 +2642,13 @@ ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0: resolve "^1.3.3" semver "^5.3.0" +ember-cli-version-checker@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.1.2.tgz#305ce102390c66e4e0f1432dea9dc5c7c19fed98" + dependencies: + resolve "^1.3.3" + semver "^5.3.0" + ember-cli@~2.18.2: version "2.18.2" resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-2.18.2.tgz#bb15313a15139a85248a86d203643f918ba40f57" @@ -2684,6 +3002,17 @@ escodegen@^1.6.1: optionalDependencies: source-map "~0.5.6" +escodegen@^1.9.1: + version "1.11.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + eslint-plugin-ember-suave@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-plugin-ember-suave/-/eslint-plugin-ember-suave-1.0.0.tgz#ea7d232a126562dcd8b1ee3aa2700ac3b626e514" @@ -2698,16 +3027,16 @@ eslint-plugin-ember@^5.0.0: require-folder-tree "^1.4.5" snake-case "^2.1.0" -eslint-plugin-node@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz#80df3253c4d7901045ec87fa660a284e32bdca29" +eslint-plugin-node@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-6.0.1.tgz#bf19642298064379315d7a4b2a75937376fa05e4" dependencies: ignore "^3.3.6" minimatch "^3.0.4" resolve "^1.3.3" - semver "5.3.0" + semver "^5.4.1" -eslint-scope@^3.7.1: +eslint-scope@3.7.1, eslint-scope@^3.7.1: version "3.7.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" dependencies: @@ -3041,6 +3370,34 @@ fast-sourcemap-concat@^1.0.1: source-map-url "^0.3.0" sourcemap-validator "^1.0.5" +fastboot-express-middleware@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fastboot-express-middleware/-/fastboot-express-middleware-1.2.0.tgz#3f32fb21d8d01ad7c0c7d876b278601665ea17fa" + dependencies: + chalk "^2.0.1" + fastboot "^1.2.0" + request "^2.81.0" + +fastboot-transform@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/fastboot-transform/-/fastboot-transform-0.1.3.tgz#7dea0b117594afd8772baa6c9b0919644e7f7dcd" + dependencies: + broccoli-stew "^1.5.0" + convert-source-map "^1.5.1" + +fastboot@^1.1.4-beta.1, fastboot@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-1.2.0.tgz#35c5747db1943d082f2ba619226d16cd7281e946" + dependencies: + chalk "^2.0.1" + cookie "^0.3.1" + debug "^3.0.0" + exists-sync "0.0.4" + najax "^1.0.2" + rsvp "^4.7.0" + simple-dom "^1.0.0" + source-map-support "^0.5.0" + faye-websocket@~0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" @@ -3159,6 +3516,13 @@ fireworm@^0.7.0: lodash.flatten "^3.0.2" minimatch "^3.0.2" +fixturify@^0.3.2: + version "0.3.4" + resolved "https://registry.yarnpkg.com/fixturify/-/fixturify-0.3.4.tgz#c676de404a7f8ee8e64d0b76118e62ec95ab7b25" + dependencies: + fs-extra "^0.30.0" + matcher-collection "^1.0.4" + flat-cache@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" @@ -3268,7 +3632,7 @@ fs-extra@^3.0.0: jsonfile "^3.0.0" universalify "^0.1.0" -fs-extra@^4.0.0: +fs-extra@^4.0.0, fs-extra@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" dependencies: @@ -3468,6 +3832,10 @@ globals@^11.0.1: version "11.3.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.3.0.tgz#e04fdb7b9796d8adac9c8f64c14837b2313378b0" +globals@^11.1.0: + version "11.7.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" + globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -3602,7 +3970,7 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -hash-for-dep@^1.0.2: +hash-for-dep@^1.0.2, hash-for-dep@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.2.3.tgz#5ec69fca32c23523972d52acb5bb65ffc3664cab" dependencies: @@ -3688,7 +4056,7 @@ hosted-git-info@^2.1.4, hosted-git-info@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" -html-encoding-sniffer@^1.0.1: +html-encoding-sniffer@^1.0.1, html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" dependencies: @@ -3819,6 +4187,12 @@ inquirer@^3.0.6: strip-ansi "^4.0.0" through "^2.3.6" +invariant@^2.2.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + dependencies: + loose-envify "^1.0.0" + invariant@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" @@ -4073,6 +4447,10 @@ istextorbinary@2.1.0: editions "^1.1.1" textextensions "1 || 2" +jquery-deferred@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/jquery-deferred/-/jquery-deferred-0.3.1.tgz#596eca1caaff54f61b110962b23cafea74c35355" + jquery@^3.1.0, jquery@^3.2.1: version "3.3.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" @@ -4096,6 +4474,37 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" +jsdom@^11.12.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + jsdom@^9.5.0: version "9.12.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" @@ -4124,7 +4533,7 @@ jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" -jsesc@^2.5.0: +jsesc@^2.5.0, jsesc@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" @@ -4241,6 +4650,10 @@ leek@0.0.24: lodash.assign "^3.2.0" rsvp "^3.0.21" +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -4562,6 +4975,10 @@ lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + lodash.support@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.support/-/lodash.support-2.3.0.tgz#7eaf038af4f0d6aab776b44aa6dcfc80334c9bfd" @@ -4626,6 +5043,10 @@ lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.5.1, lod version "4.17.5" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" +lodash@^4.13.1, lodash@^4.2.0: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + log-symbols@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" @@ -4710,7 +5131,7 @@ markdown-it@^8.3.0, markdown-it@^8.3.1: mdurl "^1.0.1" uc.micro "^1.0.3" -matcher-collection@^1.0.0, matcher-collection@^1.0.5: +matcher-collection@^1.0.0, matcher-collection@^1.0.4, matcher-collection@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.0.5.tgz#2ee095438372cb8884f058234138c05c644ec339" dependencies: @@ -4871,7 +5292,7 @@ mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdi dependencies: minimist "0.0.8" -mktemp@~0.4.0: +mktemp@^0.4.0, mktemp@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/mktemp/-/mktemp-0.4.0.tgz#6d0515611c8a8c84e484aa2000129b98e981ff0b" @@ -4948,6 +5369,14 @@ mz@^2.6.0: object-assign "^4.0.1" thenify-all "^1.0.0" +najax@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/najax/-/najax-1.0.3.tgz#11145f4d910446ea661d8ab7fcef53f6ad164ae5" + dependencies: + jquery-deferred "^0.3.0" + lodash.defaultsdeep "^4.6.0" + qs "^6.2.0" + nan@^2.3.0: version "2.8.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" @@ -5086,6 +5515,10 @@ number-is-nan@^1.0.0: version "1.4.3" resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c" +nwsapi@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.7.tgz#6fc54c254621f10cac5225b76e81c74120139b78" + oauth-sign@~0.8.1, oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" @@ -5244,6 +5677,10 @@ parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + parse5@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" @@ -5356,6 +5793,10 @@ pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + portfinder@^1.0.7: version "1.0.13" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" @@ -5422,14 +5863,26 @@ pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" +psl@^1.1.24: + version "1.1.28" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.28.tgz#4fb6ceb08a1e2214d4fd4de0ca22dae13740bc7b" + punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + qs@6.5.1, qs@^6.4.0, qs@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" +qs@^6.2.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" @@ -5633,6 +6086,20 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" +request-promise-core@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" + dependencies: + lodash "^4.13.1" + +request-promise-native@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" + dependencies: + request-promise-core "1.1.1" + stealthy-require "^1.1.0" + tough-cookie ">=2.3.3" + request@2.81.0: version "2.81.0" resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" @@ -5687,6 +6154,31 @@ request@^2.74.0, request@^2.79.0: tunnel-agent "^0.6.0" uuid "^3.1.0" +request@^2.81.0, request@^2.87.0: + version "2.87.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + require-folder-tree@^1.4.5: version "1.4.5" resolved "https://registry.yarnpkg.com/require-folder-tree/-/require-folder-tree-1.4.5.tgz#dfe553cbab98cc88e1c56a3f2f358f06ef85bcb0" @@ -5782,6 +6274,10 @@ rsvp@^4.6.1, rsvp@^4.7.0: version "4.8.1" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.1.tgz#168addb3963222de37ee351b70e3876bdb2ac285" +rsvp@^4.8.2: + version "4.8.3" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.3.tgz#25d4b9fdd0f95e216eb5884d9b3767d3fbfbe2cd" + rsvp@~3.0.6: version "3.0.21" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.0.21.tgz#49c588fe18ef293bcd0ab9f4e6756e6ac433359f" @@ -5818,7 +6314,7 @@ safe-json-parse@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" -sane@^1.1.1: +sane@^1.1.1, sane@^1.4.1: version "1.7.0" resolved "https://registry.yarnpkg.com/sane/-/sane-1.7.0.tgz#b3579bccb45c94cf20355cc81124990dfd346e30" dependencies: @@ -5844,18 +6340,14 @@ sane@^2.2.0: optionalDependencies: fsevents "^1.1.1" -sax@^1.2.1: +sax@^1.2.1, sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" -"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.1.1, semver@^5.3.0, semver@^5.4.1: +"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.1.1, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" -semver@5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - semver@^4.3.1: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" @@ -5955,6 +6447,10 @@ silent-error@^1.0.0, silent-error@^1.0.1, silent-error@^1.1.0: dependencies: debug "^2.2.0" +simple-dom@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/simple-dom/-/simple-dom-1.3.0.tgz#8473e0d34e340544b061410dba3faf4f1b7aa282" + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" @@ -6080,6 +6576,13 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" +source-map-support@^0.5.0: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" @@ -6094,20 +6597,20 @@ source-map@0.4.x, source-map@^0.4.2, source-map@^0.4.4: dependencies: amdefine ">=0.0.4" -source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.1, source-map@~0.5.6: +source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.1, source-map@~0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" +source-map@^0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + source-map@~0.1.x: version "0.1.43" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" dependencies: amdefine ">=0.0.4" -source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - sourcemap-validator@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/sourcemap-validator/-/sourcemap-validator-1.0.6.tgz#abd2f1ecdae6a3c46c2c96c5f256705b2147c9c0" @@ -6193,6 +6696,10 @@ statuses@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" +stealthy-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + string-template@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" @@ -6304,7 +6811,7 @@ supports-color@^5.2.0: dependencies: has-flag "^3.0.0" -symbol-tree@^3.2.1: +symbol-tree@^3.2.1, symbol-tree@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" @@ -6433,6 +6940,12 @@ tmp@0.0.28: dependencies: os-tmpdir "~1.0.1" +tmp@0.0.31: + version "0.0.31" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" + dependencies: + os-tmpdir "~1.0.1" + tmp@^0.0.29: version "0.0.29" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" @@ -6457,6 +6970,10 @@ to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -6478,12 +6995,25 @@ to-regex@^3.0.1: extend-shallow "^2.0.1" regex-not "^1.0.0" +tough-cookie@>=2.3.3, tough-cookie@^2.3.4: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + tough-cookie@^2.3.2, tough-cookie@~2.3.0, tough-cookie@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" dependencies: punycode "^1.4.1" +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + dependencies: + punycode "^2.1.0" + tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -6569,7 +7099,7 @@ ultron@1.0.x: version "1.0.2" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" -underscore.string@~3.3.4: +underscore.string@^3.2.2, underscore.string@~3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db" dependencies: @@ -6683,6 +7213,12 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + dependencies: + browser-process-hrtime "^0.1.2" + walk-sync@0.3.2, walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.2.tgz#4827280afc42d0e035367c4a4e31eeac0d136f75" @@ -6718,7 +7254,7 @@ webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" -webidl-conversions@^4.0.0: +webidl-conversions@^4.0.0, webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -6733,12 +7269,16 @@ websocket-extensions@>=0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" -whatwg-encoding@^1.0.1: +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" dependencies: iconv-lite "0.4.19" +whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" + whatwg-url@^4.3.0: version "4.8.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" @@ -6746,6 +7286,14 @@ whatwg-url@^4.3.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" +whatwg-url@^6.4.0, whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" @@ -6805,6 +7353,12 @@ ws@1.1.1: options ">=0.0.5" ultron "1.0.x" +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + dependencies: + async-limiter "~1.0.0" + wtf-8@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" @@ -6817,6 +7371,10 @@ xml-name-validator@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + xmldom@^0.1.19: version "0.1.27" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" From ed00eb23abdbd3262ae499496498067f4d084a4b Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sun, 29 Jul 2018 18:20:14 -0400 Subject: [PATCH 201/879] DEPENDENCY: updated to broccoli-string-replace (#1361) --- index.js | 2 +- package.json | 2 +- yarn.lock | 36 +++++------------------------------- 3 files changed, 7 insertions(+), 33 deletions(-) diff --git a/index.js b/index.js index 6fc622af0..e91459257 100644 --- a/index.js +++ b/index.js @@ -4,7 +4,7 @@ const mergeTrees = require('broccoli-merge-trees'); const Funnel = require('broccoli-funnel'); const map = require('broccoli-stew').map; const rm = require('broccoli-stew').rm; -const replace = require('broccoli-replace'); +const replace = require('broccoli-string-replace'); module.exports = { name: 'ember-cli-mirage', diff --git a/package.json b/package.json index d7055e970..f8ae76e64 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "dependencies": { "broccoli-funnel": "^1.0.2", "broccoli-merge-trees": "^1.1.0", - "broccoli-replace": "^0.12.0", + "broccoli-string-replace": "^0.1.2", "broccoli-stew": "^1.5.0", "chalk": "^1.1.1", "ember-cli-babel": "^6.8.2", diff --git a/yarn.lock b/yarn.lock index 656a91379..d86a60245 100644 --- a/yarn.lock +++ b/yarn.lock @@ -278,14 +278,6 @@ aot-test-generators@^0.1.0: dependencies: jsesc "^2.5.0" -applause@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/applause/-/applause-1.2.2.tgz#a8468579e81f67397bb5634c29953bedcd0f56c0" - dependencies: - cson-parser "^1.1.0" - js-yaml "^3.3.0" - lodash "^3.10.0" - aproba@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -1439,7 +1431,7 @@ broccoli-node-info@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-1.1.0.tgz#3aa2e31e07e5bdb516dd25214f7c45ba1c459412" -broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.2.0, broccoli-persistent-filter@^1.4.0, broccoli-persistent-filter@^1.4.3: +broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.4.0, broccoli-persistent-filter@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.3.tgz#3511bc52fc53740cda51621f58a28152d9911bc1" dependencies: @@ -1475,14 +1467,6 @@ broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli rimraf "^2.3.4" symlink-or-copy "^1.1.8" -broccoli-replace@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/broccoli-replace/-/broccoli-replace-0.12.0.tgz#36460a984c45c61731638c53068b0ab12ea8fdb7" - dependencies: - applause "1.2.2" - broccoli-persistent-filter "^1.2.0" - minimatch "^3.0.0" - broccoli-slow-trees@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-2.0.0.tgz#9741afe992787add64aec7f7c8211dfcc058278d" @@ -1526,9 +1510,9 @@ broccoli-stew@^1.2.0, broccoli-stew@^1.3.3, broccoli-stew@^1.5.0: symlink-or-copy "^1.1.8" walk-sync "^0.3.0" -broccoli-string-replace@^0.1.1: +broccoli-string-replace@^0.1.1, broccoli-string-replace@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/broccoli-string-replace/-/broccoli-string-replace-0.1.2.tgz#1ed92f85680af8d503023925e754e4e33676b91f" + resolved "https://registry.npmjs.org/broccoli-string-replace/-/broccoli-string-replace-0.1.2.tgz#1ed92f85680af8d503023925e754e4e33676b91f" dependencies: broccoli-persistent-filter "^1.1.5" minimatch "^3.0.3" @@ -1889,10 +1873,6 @@ code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" -coffee-script@^1.10.0: - version "1.12.7" - resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.7.tgz#c05dae0cb79591d05b3070a8433a98c9a89ccc53" - collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -2138,12 +2118,6 @@ crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" -cson-parser@^1.1.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/cson-parser/-/cson-parser-1.3.5.tgz#7ec675e039145533bf2a6a856073f1599d9c2d24" - dependencies: - coffee-script "^1.10.0" - cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": version "0.3.2" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" @@ -4463,7 +4437,7 @@ js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" -js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.3.0, js-yaml@^3.6.1, js-yaml@^3.9.1: +js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.6.1, js-yaml@^3.9.1: version "3.10.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" dependencies: @@ -5035,7 +5009,7 @@ lodash@3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.8.0.tgz#376eb98bdcd9382a9365c33c4cb8250de1325b91" -lodash@^3.10.0, lodash@^3.10.1: +lodash@^3.10.1: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" From 615df90efe4da06d4bfdd1b184ff5215a03d1fd3 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 30 Jul 2018 08:42:13 -0400 Subject: [PATCH 202/879] Serialize top-level polymorphic collections --- addon/serializer-registry.js | 6 +- addon/serializer.js | 7 +- .../polymorphic/top-level-test.js | 67 ++++++++++ .../associations/polymorphic-test.js | 119 +++++++++++++----- 4 files changed, 165 insertions(+), 34 deletions(-) create mode 100644 tests/integration/serializers/base/associations/polymorphic/top-level-test.js diff --git a/addon/serializer-registry.js b/addon/serializer-registry.js index c3a632da3..d9f7e17a2 100644 --- a/addon/serializer-registry.js +++ b/addon/serializer-registry.js @@ -1,5 +1,6 @@ import Model from 'ember-cli-mirage/orm/model'; import Collection from 'ember-cli-mirage/orm/collection'; +import PolymorphicCollection from 'ember-cli-mirage/orm/polymorphic-collection'; import Serializer from 'ember-cli-mirage/serializer'; import JsonApiSerializer from 'ember-cli-mirage/serializers/json-api-serializer'; import { pluralize, camelize } from './utils/inflector'; @@ -25,6 +26,7 @@ export default class SerializerRegistry { let serializer = this.serializerFor(response.modelName); return serializer.serialize(response, request); + } else if (Array.isArray(response) && response.filter(this._isCollection).length) { return response.reduce((json, collection) => { let serializer = this.serializerFor(collection.modelName); @@ -44,7 +46,7 @@ export default class SerializerRegistry { } serializerFor(type, { explicit = false } = {}) { - let SerializerForResponse = this._serializerMap && (this._serializerMap[camelize(type)]); + let SerializerForResponse = type && this._serializerMap && (this._serializerMap[camelize(type)]); if (explicit) { assert(!!SerializerForResponse, `You passed in ${type} as an explicit serializer type but that serializer doesn't exist. Try running \`ember g mirage-serializer ${type}\`.`); @@ -68,7 +70,7 @@ export default class SerializerRegistry { } _isCollection(object) { - return object instanceof Collection; + return object instanceof Collection || object instanceof PolymorphicCollection; } _isModelOrCollection(object) { diff --git a/addon/serializer.js b/addon/serializer.js index f53a0f86a..8ac1dcf6c 100644 --- a/addon/serializer.js +++ b/addon/serializer.js @@ -3,7 +3,7 @@ import Collection from './orm/collection'; import PolymorphicCollection from './orm/polymorphic-collection'; import extend from './utils/extend'; import { singularize, pluralize, camelize } from './utils/inflector'; - +import assert from './assert'; import _isFunction from 'lodash/isFunction'; import _isArray from 'lodash/isArray'; import _isEmpty from 'lodash/isEmpty'; @@ -72,6 +72,11 @@ class Serializer { let hashWithRoot; if (this.root) { + assert( + !(resource instanceof PolymorphicCollection), + `The base Serializer class cannot serialize a top-level PolymorphicCollection when root is true, since PolymorphicCollections have no type.` + ); + let serializer = this.serializerFor(resource.modelName); let rootKey = serializer.keyForResource(resource); hashWithRoot = { [rootKey]: hash }; diff --git a/tests/integration/serializers/base/associations/polymorphic/top-level-test.js b/tests/integration/serializers/base/associations/polymorphic/top-level-test.js new file mode 100644 index 000000000..7e244561d --- /dev/null +++ b/tests/integration/serializers/base/associations/polymorphic/top-level-test.js @@ -0,0 +1,67 @@ +import { module, test } from 'qunit'; +import { Model, hasMany, Serializer } from 'ember-cli-mirage'; +import Server from 'ember-cli-mirage/server'; + +module('Integration | Serializers | Base | Associations | Polymorphic | Top level', function(hooks) { + + hooks.beforeEach(function() { + this.server = new Server({ + models: { + user: Model.extend({ + things: hasMany({ polymorphic: true }) + }), + picture: Model.extend(), + car: Model.extend() + } + }); + this.user = this.server.create('user', { + things: [ + this.server.create('picture', { title: 'Picture 1'}), + this.server.create('car', { name: 'Car 1' }) + ] + }); + + }); + + hooks.afterEach(function() { + this.server.shutdown(); + }); + + test(`it can serialize a polymorphic collection when root is false`, function(assert) { + this.server.config({ + serializers: { + application: Serializer.extend({ + root: false, + embed: true + }) + } + }); + let json = this.server.serializerOrRegistry.serialize(this.user.things); + + assert.deepEqual(json, [ + { + "id": "1", + "title": "Picture 1" + }, + { + "id": "1", + "name": "Car 1" + } + ]); + }); + + test(`it throws if trying to serialize a polymorphic collection when root is true`, function(assert) { + this.server.config({ + serializers: { + application: Serializer.extend({ + root: true + }) + } + }); + + assert.throws(() => { + this.server.serializerOrRegistry.serialize(this.user.things); + }, /The base Serializer class cannot serialize a top-level PolymorphicCollection when root is true/); + }); + +}); diff --git a/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js b/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js index 294783c51..79bcbfaac 100644 --- a/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js @@ -1,32 +1,34 @@ -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import { Model, belongsTo, hasMany, JSONAPISerializer } from 'ember-cli-mirage'; import { module, test } from 'qunit'; +import Server from 'ember-cli-mirage/server'; +import { Model, belongsTo, hasMany, JSONAPISerializer } from 'ember-cli-mirage'; module('Integration | Serializers | JSON API Serializer | Associations | Polymorphic', function() { + test('it works for belongs to polymorphic relationships', function(assert) { - let schema = new Schema(new Db(), { - photo: Model.extend(), - video: Model.extend(), - comment: Model.extend({ - commentable: belongsTo({ polymorphic: true }) - }) + let server = new Server({ + models: { + photo: Model.extend(), + video: Model.extend(), + comment: Model.extend({ + commentable: belongsTo({ polymorphic: true }) + }) + }, + serializers: { + application: JSONAPISerializer, + comment: JSONAPISerializer.extend({ + include: ['commentable'] + }) + } }); - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - comment: JSONAPISerializer.extend({ - include: ['commentable'] - }) - }); + let schema = server.schema; let photo = schema.photos.create({ title: 'Foo' }); schema.comments.create({ text: 'Pretty foo!', commentable: photo }); let video = schema.videos.create({ title: 'Bar' }); schema.comments.create({ text: 'Love the bar!', commentable: video }); - let result = registry.serialize(schema.comments.all()); + let result = server.serializerOrRegistry.serialize(schema.comments.all()); assert.deepEqual(result, { data: [ { @@ -71,24 +73,28 @@ module('Integration | Serializers | JSON API Serializer | Associations | Polymor } ] }); + + server.shutdown(); }); test('it works for has many polymorphic relationships', function(assert) { - let schema = new Schema(new Db(), { - user: Model.extend({ - things: hasMany({ polymorphic: true }) - }), - car: Model.extend(), - watch: Model.extend() - }); - - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - user: JSONAPISerializer.extend({ - include: ['things'] - }) + let server = new Server({ + models: { + user: Model.extend({ + things: hasMany({ polymorphic: true }) + }), + car: Model.extend(), + watch: Model.extend() + }, + serializers: { + application: JSONAPISerializer, + user: JSONAPISerializer.extend({ + include: ['things'] + }) + } }); + let schema = server.schema; let car = schema.cars.create({ make: 'Infiniti' }); let watch = schema.watches.create({ make: 'Citizen' }); let user = schema.users.create({ @@ -96,7 +102,7 @@ module('Integration | Serializers | JSON API Serializer | Associations | Polymor things: [ car, watch ] }); - let json = registry.serialize(user); + let json = server.serializerOrRegistry.serialize(user); assert.deepEqual(json, { data: { @@ -131,5 +137,56 @@ module('Integration | Serializers | JSON API Serializer | Associations | Polymor } ] }); + + server.shutdown(); + }); + + test('it works for a top-level polymorphic collection', function(assert) { + let server = new Server({ + models: { + user: Model.extend({ + things: hasMany({ polymorphic: true }) + }), + car: Model.extend(), + watch: Model.extend() + }, + serializers: { + application: JSONAPISerializer, + user: JSONAPISerializer.extend({ + include: ['things'] + }) + } + }); + + let schema = server.schema; + let car = schema.cars.create({ make: 'Infiniti' }); + let watch = schema.watches.create({ make: 'Citizen' }); + let user = schema.users.create({ + name: 'Sam', + things: [ car, watch ] + }); + + let json = server.serializerOrRegistry.serialize(user.things); + + assert.deepEqual(json, { + data: [ + { + attributes: { + make: "Infiniti" + }, + id: "1", + type: "cars" + }, + { + attributes: { + make: "Citizen" + }, + id: "1", + type: "watches" + } + ] + }); + + server.shutdown(); }); }); From e6af6a937a37a80f852bc5faa26f265d0bdb7212 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 6 Aug 2018 23:02:40 -0400 Subject: [PATCH 203/879] Travis can publish --- .travis.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.travis.yml b/.travis.yml index 5b0d426a7..359db4959 100644 --- a/.travis.yml +++ b/.travis.yml @@ -71,3 +71,12 @@ jobs: allow_failures: - env: EMBER_TRY_SCENARIO=ember-beta - env: EMBER_TRY_SCENARIO=ember-canary + +deploy: + provider: npm + email: sam.selikoff@gmail.com + api_key: + secure: O6cP0nTiCbA+MuD6hRKdyyd6DWTFR/dc9klB10zXTnrwajjzLmenvvshPUv+F6lHCpb2SfrWW6cpFjZ61BPwKaaalF9u8encNkGlDYGtO77sWJu6LuJFeWPZnAC9rdAw4hPjz+gqTL+leeDMHzjB32VRqy2cpwFzet3e+W2eUuk= + on: + tags: true + repo: samselikoff/ember-cli-mirage From 829b0ebadeb37790c2f894d14e5bfc70a3b7c8c3 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 7 Aug 2018 08:52:15 -0400 Subject: [PATCH 204/879] Add clearer test around normalizeIds --- addon/serializers/rest-serializer.js | 1 - .../active-model-serializer-sanity-test.js} | 4 +- .../shorthands/rest-serializer-sanity-test.js | 152 ++++++++++++++++++ 3 files changed, 154 insertions(+), 3 deletions(-) rename tests/integration/server/{shorthand-sanity-test.js => shorthands/active-model-serializer-sanity-test.js} (94%) create mode 100644 tests/integration/server/shorthands/rest-serializer-sanity-test.js diff --git a/addon/serializers/rest-serializer.js b/addon/serializers/rest-serializer.js index 2dcbda9ad..1d6e0ea37 100644 --- a/addon/serializers/rest-serializer.js +++ b/addon/serializers/rest-serializer.js @@ -31,5 +31,4 @@ export default ActiveModelSerializer.extend({ getCoalescedIds(request) { return request.queryParams && request.queryParams.ids; } - }); diff --git a/tests/integration/server/shorthand-sanity-test.js b/tests/integration/server/shorthands/active-model-serializer-sanity-test.js similarity index 94% rename from tests/integration/server/shorthand-sanity-test.js rename to tests/integration/server/shorthands/active-model-serializer-sanity-test.js index be2a7ff44..b0c3e53c9 100644 --- a/tests/integration/server/shorthand-sanity-test.js +++ b/tests/integration/server/shorthands/active-model-serializer-sanity-test.js @@ -1,9 +1,9 @@ import {module, test} from 'qunit'; import { Model, ActiveModelSerializer } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; -import promiseAjax from '../../helpers/promise-ajax'; +import promiseAjax from '../../../helpers/promise-ajax'; -module('Integration | Server | Shorthand sanity check', function(hooks) { +module('Integration | Server | Shorthands | Active Model Serializer Sanity check', function(hooks) { hooks.beforeEach(function() { this.server = new Server({ environment: 'test', diff --git a/tests/integration/server/shorthands/rest-serializer-sanity-test.js b/tests/integration/server/shorthands/rest-serializer-sanity-test.js new file mode 100644 index 000000000..7030010ca --- /dev/null +++ b/tests/integration/server/shorthands/rest-serializer-sanity-test.js @@ -0,0 +1,152 @@ +import { module, test } from 'qunit'; +import { Model, hasMany, belongsTo, RestSerializer } from 'ember-cli-mirage'; +import Server from 'ember-cli-mirage/server'; +import promiseAjax from '../../../helpers/promise-ajax'; + +module('Integration | Server | Shorthands | REST Serializer Sanity check', function(hooks) { + hooks.beforeEach(function() { + this.server = new Server({ + environment: 'test', + models: { + contact: Model.extend({ + addresses: hasMany() + }), + address: Model.extend({ + contact: belongsTo() + }) + }, + serializers: { + application: RestSerializer.extend({ + normalizeIds: true + }) + } + }); + this.server.timing = 0; + this.server.logging = false; + }); + + hooks.afterEach(function() { + this.server.shutdown(); + }); + + test('a get shorthand works', async function(assert) { + assert.expect(2); + + this.server.db.loadData({ + contacts: [ + { id: 1, name: 'Link' } + ] + }); + + this.server.get('/contacts'); + + let { xhr, data } = await promiseAjax({ + method: 'GET', + url: '/contacts' + }); + + assert.equal(xhr.status, 200); + assert.deepEqual(data, { contacts: [{ id: '1', name: 'Link', addresses: [] }] }); + }); + + test('a post shorthand works', async function(assert) { + let { server } = this; + assert.expect(3); + + this.server.db.loadData({ + contacts: [ + { id: 1, name: 'Link' } + ] + }); + + server.post('/addresses'); + + let { xhr } = await promiseAjax({ + method: 'POST', + url: '/addresses', + data: JSON.stringify({ + address: { + street: '5th ave', + contact: 1 + } + }) + }); + + assert.equal(xhr.status, 201); + assert.equal(server.db.addresses.length, 1); + assert.equal(server.db.addresses[0].contactId, 1); + }); + + test('a put shorthand works', async function(assert) { + let { server } = this; + assert.expect(2); + + this.server.db.loadData({ + contacts: [ + { id: 1, name: 'Link' } + ] + }); + + server.put('/contacts/:id'); + + let { xhr } = await promiseAjax({ + method: 'PUT', + url: '/contacts/1', + data: JSON.stringify({ + contact: { + name: 'Zelda' + } + }) + }); + + assert.equal(xhr.status, 200); + assert.equal(server.db.contacts[0].name, 'Zelda'); + }); + + test('a patch shorthand works', async function(assert) { + let { server } = this; + assert.expect(2); + + this.server.db.loadData({ + contacts: [ + { id: 1, name: 'Link' } + ] + }); + + server.patch('/contacts/:id'); + + let { xhr } = await promiseAjax({ + method: 'PATCH', + url: '/contacts/1', + data: JSON.stringify({ + contact: { + name: 'Zelda' + } + }) + }); + + assert.equal(xhr.status, 200); + assert.equal(server.db.contacts[0].name, 'Zelda'); + }); + + test('a delete shorthand works', async function(assert) { + let { server } = this; + assert.expect(2); + + this.server.db.loadData({ + contacts: [ + { id: 1, name: 'Link' } + ] + }); + + server.del('/contacts/:id'); + + let { xhr } = await promiseAjax({ + method: 'DELETE', + url: '/contacts/1' + }); + + assert.equal(xhr.status, 204); + assert.equal(server.db.contacts.length, 0); + }); +}); From aaf418fdf5d3e8775fd8826de32fce338a00ae0f Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 8 Aug 2018 14:42:35 -0400 Subject: [PATCH 205/879] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f8ae76e64..4cea97c2b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "0.4.7", + "version": "0.4.8", "description": "A client-side HTTP server to develop, test and demo your Ember app", "keywords": [ "ember-addon", From c00fb527106c38c587258a4669290716dc515857 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 8 Aug 2018 15:08:49 -0400 Subject: [PATCH 206/879] Publish after tests --- .travis.yml | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index 359db4959..fa7d980be 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,9 +29,6 @@ script: notifications: email: false -stages: - - locked dependencies - jobs: fail_fast: true @@ -68,15 +65,16 @@ jobs: - env: EMBER_TRY_SCENARIO=ember-default script: yarn test:browser + - stage: npm release + deploy: + provider: npm + email: sam.selikoff@gmail.com + api_key: + secure: O6cP0nTiCbA+MuD6hRKdyyd6DWTFR/dc9klB10zXTnrwajjzLmenvvshPUv+F6lHCpb2SfrWW6cpFjZ61BPwKaaalF9u8encNkGlDYGtO77sWJu6LuJFeWPZnAC9rdAw4hPjz+gqTL+leeDMHzjB32VRqy2cpwFzet3e+W2eUuk= + on: + tags: true + repo: samselikoff/ember-cli-mirage + allow_failures: - env: EMBER_TRY_SCENARIO=ember-beta - env: EMBER_TRY_SCENARIO=ember-canary - -deploy: - provider: npm - email: sam.selikoff@gmail.com - api_key: - secure: O6cP0nTiCbA+MuD6hRKdyyd6DWTFR/dc9klB10zXTnrwajjzLmenvvshPUv+F6lHCpb2SfrWW6cpFjZ61BPwKaaalF9u8encNkGlDYGtO77sWJu6LuJFeWPZnAC9rdAw4hPjz+gqTL+leeDMHzjB32VRqy2cpwFzet3e+W2eUuk= - on: - tags: true - repo: samselikoff/ember-cli-mirage From 6b58622769a2bc340c2d883d9902fca9f2b631c1 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 9 Aug 2018 13:33:38 -0400 Subject: [PATCH 207/879] Actually run versioned tests... --- .travis.yml | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/.travis.yml b/.travis.yml index fa7d980be..ad8750842 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,12 +20,6 @@ env: install: - yarn install --no-lockfile --non-interactive -script: - - yarn lint:js - # Usually, it's ok to finish the test scenario without reverting - # to the addon's original dependency state, skipping "cleanup". - - node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO --skip-cleanup - notifications: email: false @@ -49,21 +43,21 @@ jobs: - stage: versioned tests env: EMBER_TRY_SCENARIO=ember-lts-2.4 - script: yarn test:browser + script: node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO --skip-cleanup - env: EMBER_TRY_SCENARIO=ember-lts-2.8 - script: yarn test:browser + script: node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO --skip-cleanup - env: EMBER_TRY_SCENARIO=ember-lts-2.12 - script: yarn test:browser + script: node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO --skip-cleanup - env: EMBER_TRY_SCENARIO=ember-lts-2.16 - script: yarn test:browser + script: node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO --skip-cleanup - env: EMBER_TRY_SCENARIO=ember-release - script: yarn test:browser + script: node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO --skip-cleanup - env: EMBER_TRY_SCENARIO=ember-beta - script: yarn test:browser + script: node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO --skip-cleanup - env: EMBER_TRY_SCENARIO=ember-canary - script: yarn test:browser + script: node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO --skip-cleanup - env: EMBER_TRY_SCENARIO=ember-default - script: yarn test:browser + script: node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO --skip-cleanup - stage: npm release deploy: From 2be5bf6c40567437c9c93c2fa61641c5d54f4c30 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 9 Aug 2018 14:01:48 -0400 Subject: [PATCH 208/879] NPM release can skip tests --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index ad8750842..71af81158 100644 --- a/.travis.yml +++ b/.travis.yml @@ -60,6 +60,7 @@ jobs: script: node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO --skip-cleanup - stage: npm release + script: skip deploy: provider: npm email: sam.selikoff@gmail.com From e670a63298fa695f84faa8201a43fe5e8784ecd1 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 9 Aug 2018 14:31:46 -0400 Subject: [PATCH 209/879] NPM release can also skip installing --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 71af81158..187963471 100644 --- a/.travis.yml +++ b/.travis.yml @@ -60,6 +60,7 @@ jobs: script: node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO --skip-cleanup - stage: npm release + install: skip script: skip deploy: provider: npm From a302dab9ad626b72df8413ffa6f71b7f4bfb3b31 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 8 Aug 2018 16:20:50 -0400 Subject: [PATCH 210/879] Only add Content-Type to responses with data - Data defaults to empty string - Closes https://github.com/samselikoff/ember-cli-mirage/issues/1295 --- addon/response.js | 7 ++++--- addon/route-handlers/shorthands/delete.js | 2 +- addon/server.js | 4 +--- .../shorthands/active-model-serializer-sanity-test.js | 3 ++- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/addon/response.js b/addon/response.js index 056efa050..63c59bf6c 100644 --- a/addon/response.js +++ b/addon/response.js @@ -1,6 +1,6 @@ export default class Response { - constructor(code, headers = {}, data = {}) { + constructor(code, headers = {}, data = '') { this.code = code; this.headers = headers; this.data = data; @@ -8,11 +8,12 @@ export default class Response { toRackResponse() { let { headers } = this; - if (!headers.hasOwnProperty('Content-Type')) { + + if (this.data && !headers.hasOwnProperty('Content-Type')) { headers['Content-Type'] = 'application/json'; } - return [this.code, this.headers, this.data]; + return [ this.code, this.headers, this.data ]; } } diff --git a/addon/route-handlers/shorthands/delete.js b/addon/route-handlers/shorthands/delete.js index 7eabdfaf8..b38eb8475 100644 --- a/addon/route-handlers/shorthands/delete.js +++ b/addon/route-handlers/shorthands/delete.js @@ -19,7 +19,7 @@ export default class DeleteShorthandRouteHandler extends BaseShorthandRouteHandl ); let id = this._getIdForRequest(request); - return modelClass.find(id).destroy(); + modelClass.find(id).destroy(); } /* diff --git a/addon/server.js b/addon/server.js index b929ec538..5bef2d0af 100644 --- a/addon/server.js +++ b/addon/server.js @@ -510,10 +510,8 @@ export default class Server { _serialize(body) { if (typeof body === 'string') { return body; - } else if (body) { - return JSON.stringify(body); } else { - return '{"error": "not found"}'; + return JSON.stringify(body); } } diff --git a/tests/integration/server/shorthands/active-model-serializer-sanity-test.js b/tests/integration/server/shorthands/active-model-serializer-sanity-test.js index b0c3e53c9..6b2bec8ea 100644 --- a/tests/integration/server/shorthands/active-model-serializer-sanity-test.js +++ b/tests/integration/server/shorthands/active-model-serializer-sanity-test.js @@ -116,7 +116,7 @@ module('Integration | Server | Shorthands | Active Model Serializer Sanity check test('a delete shorthand works', async function(assert) { let { server } = this; - assert.expect(2); + assert.expect(3); this.server.db.loadData({ contacts: [ @@ -131,6 +131,7 @@ module('Integration | Server | Shorthands | Active Model Serializer Sanity check url: '/contacts/1' }); + assert.equal(xhr.responseText, ""); assert.equal(xhr.status, 204); assert.equal(server.db.contacts.length, 0); }); From f8be509cc303602e59814c3886e25cd8b7c6443e Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 10 Aug 2018 14:50:54 -0400 Subject: [PATCH 211/879] [fixes #1367] Has manys can take empty arrays --- addon/orm/model.js | 2 +- tests/integration/orm/assertions-test.js | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/addon/orm/model.js b/addon/orm/model.js index 295aca474..c216e6fae 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -506,7 +506,7 @@ class Model { if (association.isHasMany) { let isCollection = value instanceof Collection || value instanceof PolymorphicCollection; - let isArrayOfModels = Array.isArray(value) && value.length && value.every(item => item instanceof Model); + let isArrayOfModels = Array.isArray(value) && value.every(item => item instanceof Model); assert(isCollection || isArrayOfModels || isNull, `You're trying to create a ${this.modelName} model and you passed in "${value}" under the ${key} key, but that key is a HasMany relationship. You must pass in a Collection, PolymorphicCollection, array of Models, or null.`); diff --git a/tests/integration/orm/assertions-test.js b/tests/integration/orm/assertions-test.js index 2a02c0b42..676409b72 100644 --- a/tests/integration/orm/assertions-test.js +++ b/tests/integration/orm/assertions-test.js @@ -30,6 +30,14 @@ module('Integration | ORM | assertions', function(hooks) { }, /You're trying to create a user model and you passed in "1" under the posts key, but that key is a HasMany relationship./); }); + test(`it doesn't error when passing in an empty array`, function(assert) { + this.server.schema.users.create({ + name: 'Sam', + posts: [] + }); + assert.ok(true); + }); + test('it errors when passing in the wrong type for a HasMany association foreign key', function(assert) { assert.throws(() => { this.server.schema.users.create({ From 2511566a44c3f8f03ac89495335c2085e29e281b Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 10 Aug 2018 16:15:39 -0400 Subject: [PATCH 212/879] [fixes #1333] Fix included graph builder logic --- addon/serializers/json-api-serializer.js | 14 +++-- .../associations/polymorphic-test.js | 61 +++++++++++++++++++ 2 files changed, 69 insertions(+), 6 deletions(-) diff --git a/addon/serializers/json-api-serializer.js b/addon/serializers/json-api-serializer.js index 556015a63..4fd545e01 100644 --- a/addon/serializers/json-api-serializer.js +++ b/addon/serializers/json-api-serializer.js @@ -257,14 +257,14 @@ const JSONAPISerializer = Serializer.extend({ }, _addPrimaryModelToRequestedIncludesGraph(graph, model) { - let graphKey = this._graphKeyForModel(model); - if (this.hasQueryParamIncludes()) { + let graphKey = this._graphKeyForModel(model); let queryParamIncludes = this.getQueryParamIncludes(); + queryParamIncludes.split(',') - // includesPath is post.comments - .forEach(includesPath => { + .forEach(includesPath => { // includesPath is post.comments, for example graph.data[graphKey].relationships = graph.data[graphKey].relationships || {}; + let relationshipKeys = includesPath.split('.'); let relationshipKey = relationshipKeys[0]; let graphRelationshipKey = dasherize(relationshipKey); @@ -294,12 +294,14 @@ const JSONAPISerializer = Serializer.extend({ }, _addResourceToRequestedIncludesGraph(graph, resource, relationshipNames) { - let collectionName = dasherize(pluralize(resource.modelName)); graph.included = graph.included || {}; - graph.included[collectionName] = graph.included[collectionName] || {}; let models = this.isCollection(resource) ? resource.models : [ resource ]; + models.forEach(model => { + let collectionName = dasherize(pluralize(model.modelName)); + graph.included[collectionName] = graph.included[collectionName] || {}; + this._addModelToRequestedIncludesGraph(graph, model, relationshipNames); }); }, diff --git a/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js b/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js index 79bcbfaac..9ee3a2104 100644 --- a/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js @@ -141,6 +141,67 @@ module('Integration | Serializers | JSON API Serializer | Associations | Polymor server.shutdown(); }); + test('it works for has many polymorphic relationships included via query params', function(assert) { + let server = new Server({ + models: { + user: Model.extend({ + things: hasMany({ polymorphic: true }) + }), + car: Model.extend(), + watch: Model.extend() + }, + serializers: { + application: JSONAPISerializer + } + }); + + let schema = server.schema; + let car = schema.cars.create({ make: 'Infiniti' }); + let watch = schema.watches.create({ make: 'Citizen' }); + let user = schema.users.create({ + name: 'Sam', + things: [ car, watch ] + }); + + let json = server.serializerOrRegistry.serialize(user, { queryParams: { include: 'things' } }); + + assert.deepEqual(json, { + data: { + "attributes": { + "name": "Sam" + }, + "id": "1", + "relationships": { + "things": { + "data": [ + { id: '1', type: 'cars' }, + { id: '1', type: 'watches' } + ] + } + }, + "type": "users" + }, + "included": [ + { + "attributes": { + "make": "Infiniti" + }, + "id": "1", + "type": "cars" + }, + { + "attributes": { + "make": "Citizen" + }, + "id": "1", + "type": "watches" + } + ] + }); + + server.shutdown(); + }); + test('it works for a top-level polymorphic collection', function(assert) { let server = new Server({ models: { From cc42a230dcc601f9998e64b114b42c3147d09417 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 10 Aug 2018 18:00:41 -0400 Subject: [PATCH 213/879] v0.4.9 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4cea97c2b..ad1190429 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "0.4.8", + "version": "0.4.9", "description": "A client-side HTTP server to develop, test and demo your Ember app", "keywords": [ "ember-addon", From 9b7c295f6c52a79863243d2a8adb7b5f4cf09898 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sun, 12 Aug 2018 08:32:06 -0400 Subject: [PATCH 214/879] Assert create/createList takes singular model name - fixes #1357 --- addon/server.js | 28 ++++++++++++++++--- ...test.js => create-and-create-list-test.js} | 26 ++++++++++++++++- 2 files changed, 49 insertions(+), 5 deletions(-) rename tests/integration/server/{factory-creation-test.js => create-and-create-list-test.js} (69%) diff --git a/addon/server.js b/addon/server.js index 5bef2d0af..5b2421b97 100644 --- a/addon/server.js +++ b/addon/server.js @@ -1,8 +1,7 @@ /* eslint no-console: 0 */ import { Promise } from 'rsvp'; - -import { pluralize, camelize } from './utils/inflector'; +import { singularize, pluralize, camelize } from './utils/inflector'; import { toCollectionName, toInternalCollectionName } from 'ember-cli-mirage/utils/normalize-name'; import { getModels } from './ember-data'; import { hasEmberData } from './utils/ember-data'; @@ -397,6 +396,11 @@ export default class Server { } create(type, ...options) { + assert( + this._validateCreateType(type), + `You called server.create('${type}') but no model or factory was found. Make sure you're using the singularized version of your model.` + ); + // When there is a Model defined, we should return an instance // of it instead of returning the bare attributes. let traits = options.filter((arg) => arg && typeof arg === 'string'); @@ -406,7 +410,7 @@ export default class Server { let attrs = this.build(type, ...traits, overrides); let modelOrRecord; - if (this.schema && this.schema[toCollectionName(type)]) { + if (this.schema && this.schema.modelFor(camelize(type))) { let modelClass = this.schema[toCollectionName(type)]; modelOrRecord = modelClass.create(attrs); @@ -421,7 +425,7 @@ export default class Server { collection = this.db[collectionName]; } - assert(collection, `You called server.create(${type}) but no model or factory was found. Try \`ember g mirage-model ${type}\`.`); + assert(collection, `You called server.create('${type}') but no model or factory was found. Make sure you're using the singularized version of your model.`); modelOrRecord = collection.insert(attrs); } @@ -436,6 +440,10 @@ export default class Server { } createList(type, amount, ...traitsAndOverrides) { + assert( + this._validateCreateType(type), + `You called server.createList('${type}') but no model or factory was found. Make sure you're using the singularized version of your model.` + ); assert(_isInteger(amount), `second argument has to be an integer, you passed: ${typeof amount}`); let list = []; @@ -646,6 +654,18 @@ export default class Server { }); } + /** + * + * @private + */ + _validateCreateType(type) { + let modelExists = (this.schema && this.schema.modelFor(camelize(type))); + let dbCollectionExists = this.db[toInternalCollectionName(type)]; + let isSingular = type === singularize(type); + + return isSingular && (modelExists || dbCollectionExists); + } + /** * * @private diff --git a/tests/integration/server/factory-creation-test.js b/tests/integration/server/create-and-create-list-test.js similarity index 69% rename from tests/integration/server/factory-creation-test.js rename to tests/integration/server/create-and-create-list-test.js index 3df02b0b8..7a3f1bdc2 100644 --- a/tests/integration/server/factory-creation-test.js +++ b/tests/integration/server/create-and-create-list-test.js @@ -2,7 +2,7 @@ import { module, test } from 'qunit'; import { Model, Factory, hasMany, belongsTo } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; -module('Integration | Server | Factory creation', function(hooks) { +module('Integration | Server | create and createList', function(hooks) { hooks.beforeEach(function() { this.Contact = Model.extend(); this.AmazingContact = Model.extend(); @@ -34,12 +34,36 @@ module('Integration | Server | Factory creation', function(hooks) { this.server.shutdown(); }); + test('create throws when passing in an undefined model', function(assert) { + assert.throws(() => { + this.server.create('foo'); + }, /You called server.create\('foo'\) but no model or factory was found\. Make sure you're using the singularized version of your model\./); + }); + + test('create throws when passing in a pluralized version of a model', function(assert) { + assert.throws(() => { + this.server.create('contacts'); + }, /You called server.create\('contacts'\) but no model or factory was found\. Make sure you're using the singularized version of your model\./); + }); + test('create returns a Model if one is defined', function(assert) { let contact = this.server.create('contact'); assert.ok(contact instanceof this.Contact, 'expected a Contact'); }); + test('createList throws when passing in an undefined model', function(assert) { + assert.throws(() => { + this.server.createList('foo', 1); + }, /You called server.createList\('foo'\) but no model or factory was found\. Make sure you're using the singularized version of your model\./); + }); + + test('createList throws when passing in a pluralized version of a model', function(assert) { + assert.throws(() => { + this.server.createList('contacts', 1); + }, /You called server.createList\('contacts'\) but no model or factory was found\. Make sure you're using the singularized version of your model\./); + }); + test('createList returns Models if one is defined', function(assert) { let contacts = this.server.createList('contact', 1); From 0424ba09038ffc693b981564cb91a8203e99bfb6 Mon Sep 17 00:00:00 2001 From: Greg Larrenaga Date: Tue, 14 Aug 2018 11:30:09 -0700 Subject: [PATCH 215/879] Adds assert that ensures associations are defined when being included in json:api post requests --- addon/route-handlers/base.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addon/route-handlers/base.js b/addon/route-handlers/base.js index 8b3980fd7..56849d6cb 100644 --- a/addon/route-handlers/base.js +++ b/addon/route-handlers/base.js @@ -63,6 +63,11 @@ export default class BaseRouteHandler { let association = modelClass.associationFor(camelize(relationshipName)); let valueForRelationship; + assert( + association, + `You're passing the relationship '${relationshipName}' to the '${modelName}' model via a ${request.method} to '${request.url}', but you did not define the '${relationshipName}' association on the '${modelName}' model. http://www.ember-cli-mirage.com/docs/v0.4.x/models/#associations` + ); + if (association.isPolymorphic) { valueForRelationship = relationship.data; From d5d037029652332948a94bd98816f20a67e38028 Mon Sep 17 00:00:00 2001 From: Greg Larrenaga Date: Tue, 14 Aug 2018 13:16:57 -0700 Subject: [PATCH 216/879] Adds a test to ensure helpful assertions are thrown when not defining associations --- .../route-handlers/assertions-test.js | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 tests/integration/route-handlers/assertions-test.js diff --git a/tests/integration/route-handlers/assertions-test.js b/tests/integration/route-handlers/assertions-test.js new file mode 100644 index 000000000..086761269 --- /dev/null +++ b/tests/integration/route-handlers/assertions-test.js @@ -0,0 +1,64 @@ +import { module, test } from 'qunit'; + +import { Model, JSONAPISerializer } from 'ember-cli-mirage'; +import Server from 'ember-cli-mirage/server'; +import FunctionRouteHandler from 'ember-cli-mirage/route-handlers/function'; + +module('Integration | Route handlers | Assertions', function(hooks) { + hooks.beforeEach(function() { + this.server = new Server({ + environment: 'development', + models: { + user: Model.extend({ + }), + comment: Model.extend({ + }) + }, + serializers: { + application: JSONAPISerializer + } + }); + this.server.timing = 0; + this.server.logging = false; + + this.server.post('/users'); + }); + + hooks.afterEach(function() { + this.server.shutdown(); + }); + + test('a helpful assert is thrown if a relationship passed in a request is not a defined association on the posted model', async function(assert) { + assert.expect(1); + + let request = { + requestHeaders: {}, + method: 'POST', + url: '/users', + requestBody: JSON.stringify({ + data: { + type: 'user', + attributes: { + name: 'Jacob Dylan' + }, + relationships: { + 'comments': { + data: { + type: 'comment', + name: 'Bob Dylan' + } + } + } + } + }) + }; + + this.functionHandler = new FunctionRouteHandler(this.server.schema, this.server.serializerOrRegistry); + this.functionHandler.path = '/users'; + this.functionHandler.request = request; + + assert.throws(function() { + this.functionHandler.normalizedRequestAttrs(); + }, /You're passing the relationship 'comments' to the 'user' model via a POST to '\/users', but you did not define the 'comments' association on the 'user' model./); + }); +}); From 0b50bb12a09a1596ce5877ea503a8a64b4d18bed Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 9 Oct 2017 22:51:35 -0400 Subject: [PATCH 217/879] Starting new docs site --- addon/db-collection.js | 46 +- addon/db.js | 21 +- addon/identity-manager.js | 3 +- addon/orm/collection.js | 213 +- addon/server.js | 53 +- config/addon-docs.js | 72 + config/deploy.js | 28 + package.json | 9 +- tests/dummy/app/adapters/application.js | 5 - tests/dummy/app/components/.gitkeep | 0 tests/dummy/app/controllers/application.js | 2 +- tests/dummy/app/index.html | 2 +- .../docs/examples/1-belongs-to/controller.js | 44 + .../docs/examples/1-belongs-to/template.md | 15 + .../docs/examples/2-has-many/controller.js | 44 + .../pods/docs/examples/2-has-many/template.md | 15 + .../app/pods/docs/examples/index/template.md | 5 + tests/dummy/app/router.js | 46 +- tests/dummy/app/serializers/application.js | 3 - tests/dummy/app/styles/app.css | 3 - tests/dummy/app/templates/application.hbs | 4 +- tests/dummy/app/templates/docs.hbs | 28 + .../templates/docs/getting-started/index.md | 20 + .../docs/getting-started/installation.md | 11 + .../docs/getting-started/quickstart.md | 306 ++ .../docs/getting-started/upgrading.md | 204 + .../writing-your-server/acceptance-testing.md | 160 + .../writing-your-server/defining-routes.md | 367 ++ .../seeding-your-database.md | 221 + tests/dummy/app/templates/index.hbs | 4 + tests/dummy/app/templates/not-found.hbs | 4 + tests/dummy/mirage/config.js | 75 +- .../Ember-CLI-Mirage-Logo-Horiz-Color.svg | 58 + .../Ember-CLI-Mirage-Branding-Preview.png | Bin 0 -> 65405 bytes .../ai/Ember-CLI-Mirage-Logo-Horiz-Black.ai | 2683 +++++++++++++ .../ai/Ember-CLI-Mirage-Logo-Horiz-Color.ai | 2757 +++++++++++++ .../ai/Ember-CLI-Mirage-Logo-Stacked-Black.ai | 2830 +++++++++++++ .../ai/Ember-CLI-Mirage-Logo-Stacked-Color.ai | 2802 +++++++++++++ .../eps/Ember-CLI-Mirage-Logo-Horiz-Black.eps | Bin 0 -> 1139150 bytes .../eps/Ember-CLI-Mirage-Logo-Horiz-Color.eps | Bin 0 -> 1142098 bytes .../Ember-CLI-Mirage-Logo-Stacked-Black.eps | Bin 0 -> 1149498 bytes .../Ember-CLI-Mirage-Logo-Stacked-Color.eps | Bin 0 -> 1151850 bytes .../png/Ember-CLI-Mirage-Logo-Horiz-Black.png | Bin 0 -> 52468 bytes .../png/Ember-CLI-Mirage-Logo-Horiz-Color.png | Bin 0 -> 55095 bytes .../Ember-CLI-Mirage-Logo-Stacked-Black.png | Bin 0 -> 54006 bytes .../Ember-CLI-Mirage-Logo-Stacked-Color.png | Bin 0 -> 55058 bytes .../svg/Ember-CLI-Mirage-Logo-Horiz-Black.svg | 49 + .../svg/Ember-CLI-Mirage-Logo-Horiz-Color.svg | 58 + .../Ember-CLI-Mirage-Logo-Stacked-Black.svg | 51 + .../Ember-CLI-Mirage-Logo-Stacked-Color.svg | 55 + tests/dummy/public/assets/favicon.sketch | Bin 0 -> 118245 bytes tests/dummy/public/favicon.png | Bin 0 -> 22080 bytes yarn.lock | 3544 ++++++++++++++++- 53 files changed, 16650 insertions(+), 270 deletions(-) create mode 100644 config/addon-docs.js create mode 100644 config/deploy.js delete mode 100644 tests/dummy/app/adapters/application.js delete mode 100644 tests/dummy/app/components/.gitkeep create mode 100644 tests/dummy/app/pods/docs/examples/1-belongs-to/controller.js create mode 100644 tests/dummy/app/pods/docs/examples/1-belongs-to/template.md create mode 100644 tests/dummy/app/pods/docs/examples/2-has-many/controller.js create mode 100644 tests/dummy/app/pods/docs/examples/2-has-many/template.md create mode 100644 tests/dummy/app/pods/docs/examples/index/template.md delete mode 100644 tests/dummy/app/serializers/application.js create mode 100644 tests/dummy/app/templates/docs.hbs create mode 100644 tests/dummy/app/templates/docs/getting-started/index.md create mode 100644 tests/dummy/app/templates/docs/getting-started/installation.md create mode 100644 tests/dummy/app/templates/docs/getting-started/quickstart.md create mode 100644 tests/dummy/app/templates/docs/getting-started/upgrading.md create mode 100644 tests/dummy/app/templates/docs/writing-your-server/acceptance-testing.md create mode 100644 tests/dummy/app/templates/docs/writing-your-server/defining-routes.md create mode 100644 tests/dummy/app/templates/docs/writing-your-server/seeding-your-database.md create mode 100644 tests/dummy/app/templates/index.hbs create mode 100644 tests/dummy/app/templates/not-found.hbs create mode 100644 tests/dummy/public/assets/Ember-CLI-Mirage-Logo-Horiz-Color.svg create mode 100644 tests/dummy/public/assets/branding/Ember-CLI-Mirage-Branding-Preview.png create mode 100644 tests/dummy/public/assets/branding/ai/Ember-CLI-Mirage-Logo-Horiz-Black.ai create mode 100644 tests/dummy/public/assets/branding/ai/Ember-CLI-Mirage-Logo-Horiz-Color.ai create mode 100644 tests/dummy/public/assets/branding/ai/Ember-CLI-Mirage-Logo-Stacked-Black.ai create mode 100644 tests/dummy/public/assets/branding/ai/Ember-CLI-Mirage-Logo-Stacked-Color.ai create mode 100644 tests/dummy/public/assets/branding/eps/Ember-CLI-Mirage-Logo-Horiz-Black.eps create mode 100644 tests/dummy/public/assets/branding/eps/Ember-CLI-Mirage-Logo-Horiz-Color.eps create mode 100644 tests/dummy/public/assets/branding/eps/Ember-CLI-Mirage-Logo-Stacked-Black.eps create mode 100644 tests/dummy/public/assets/branding/eps/Ember-CLI-Mirage-Logo-Stacked-Color.eps create mode 100644 tests/dummy/public/assets/branding/png/Ember-CLI-Mirage-Logo-Horiz-Black.png create mode 100644 tests/dummy/public/assets/branding/png/Ember-CLI-Mirage-Logo-Horiz-Color.png create mode 100644 tests/dummy/public/assets/branding/png/Ember-CLI-Mirage-Logo-Stacked-Black.png create mode 100644 tests/dummy/public/assets/branding/png/Ember-CLI-Mirage-Logo-Stacked-Color.png create mode 100644 tests/dummy/public/assets/branding/svg/Ember-CLI-Mirage-Logo-Horiz-Black.svg create mode 100644 tests/dummy/public/assets/branding/svg/Ember-CLI-Mirage-Logo-Horiz-Color.svg create mode 100644 tests/dummy/public/assets/branding/svg/Ember-CLI-Mirage-Logo-Stacked-Black.svg create mode 100644 tests/dummy/public/assets/branding/svg/Ember-CLI-Mirage-Logo-Stacked-Color.svg create mode 100644 tests/dummy/public/assets/favicon.sketch create mode 100644 tests/dummy/public/favicon.png diff --git a/addon/db-collection.js b/addon/db-collection.js index 214865d0f..691d477be 100644 --- a/addon/db-collection.js +++ b/addon/db-collection.js @@ -12,10 +12,22 @@ function duplicate(data) { } /** - * A collection of db records i.e. a database table. - * @class DbCollection - * @constructor - * @public + The collection attached to the database object. + + For example if you had the following data file named `mirage/fixtures/contacts.js` + + ``` + export default [ + {id: 1, name: 'Zelda'}, + {id: 2, name: 'Link'} + ]; + ``` + + then `db.contacts` would return this array. + + @class DbCollection + @constructor + @public */ class DbCollection { @@ -39,11 +51,27 @@ class DbCollection { } /** - * Inserts `data` into the collection. `data` can be a single object - * or an array of objects. Returns the inserted record. - * @method insert - * @param data - * @public + Inserts `data` into the collection. `data` can be a single object + or an array of objects. Returns the inserted record. + + ```js + // Insert a single record + let link = db.users.insert({name: 'Link', age: 173}); + + link; // {id: 1, name: 'Link', age: 137} + + // Insert an array + let users = db.users.insert([ + {name: 'Zelda', age: 142}, + {name: 'Epona', age: 58}, + ]); + + users; // [{id: 2, name: 'Zelda', age: 142}, {id: 3, name: 'Epona', age: 58}] + ``` + + @method insert + @param data + @public */ insert(data) { if (!Array.isArray(data)) { diff --git a/addon/db.js b/addon/db.js index 139efddf3..e7f40494f 100644 --- a/addon/db.js +++ b/addon/db.js @@ -4,10 +4,13 @@ import { singularize } from './utils/inflector'; import _cloneDeep from 'lodash/cloneDeep'; /** - * The db, an identity map. - * @class Db - * @constructor - * @public + Your Mirage server has a database which you can interact with in your route handlers. You’ll typically use models to interact with your database data, but you can always reach into the db directly in the event you want more control. + + Access the db from your route handlers via `schema.db`. + + @class Db + @constructor + @public */ class Db { @@ -45,10 +48,12 @@ class Db { } /** - * @method createCollection - * @param name - * @param initialData - * @public + Add an empty collection named name to your database. Typically you won’t need to do this yourself, since collections are automatically created for any models you have defined. + + @method createCollection + @param name + @param initialData (optional) + @public */ createCollection(name, initialData) { if (!this[name]) { diff --git a/addon/identity-manager.js b/addon/identity-manager.js index 74e4e8e5c..4fb3c6278 100644 --- a/addon/identity-manager.js +++ b/addon/identity-manager.js @@ -4,7 +4,8 @@ function isNumber(n) { /** * IdentityManager for a DbCollection - * @class + * + * @class IdentityManager * @constructor * @public */ diff --git a/addon/orm/collection.js b/addon/orm/collection.js index ec0e60d9e..d4f1f98ea 100644 --- a/addon/orm/collection.js +++ b/addon/orm/collection.js @@ -2,12 +2,19 @@ import assert from '../assert'; import _invokeMap from 'lodash/invokeMap'; /** - * An array of models, returned from one of the schema query - * methods (all, find, where). Knows how to update and destroy its models. - * @class Collection - * @constructor - * @public - */ + Collections represent arrays of models. They are returned by a hasMany association, or by one of the ModelClass query methods: + + ```js + let posts = user.blogPosts; + let posts = schema.blogPosts.all(); + let posts = schema.blogPosts.find([1, 2, 4]); + let posts = schema.blogPosts.where({ published: true }); + ``` + + @class Collection + @constructor + @public +*/ export default class Collection { constructor(modelName, models = []) { assert( @@ -20,23 +27,66 @@ export default class Collection { } /** - * Number of models in the collection. - * - * @property length - * @type Number - * @public + The dasherized model name of models in this collection. + + ``` + let posts = author.blogPosts.all(); + + posts.modelName; // "blog-post" + ``` + @property modelName + @public + */ + // get modelName() { + // return this.modelName; + // } + + /** + The underlying plain JavaScript array of models in this Collection. Often + used in assertions during testing. + + ```js + let newPost = user.posts.models[0].title; + + assert.equal(newPost, "My first post"); + ``` + + @property models + @public + */ + // get models() { + // return this.models; + // } + + /** + The number of models in the collection. + + ```js + user.posts.length; // 2 + ``` + + @property length + @type Number + @public */ get length() { return this.models.length; } /** - * Updates each model in the collection (persisting immediately to the db). - * @method update - * @param key - * @param val - * @return this - * @public + Updates each model in the collection, and immediately persists all changes to the db. + + ```js + let posts = author.blogPosts.all(); + + posts.update('published', true); // the db was updated for all posts + ``` + + @method update + @param key + @param val + @return this + @public */ update(...args) { _invokeMap(this.models, 'update', ...args); @@ -45,10 +95,17 @@ export default class Collection { } /** - * Destroys the db record for all models in the collection. - * @method destroy - * @return this - * @public + Destroys the db record for all models in the collection. + + ```js + let posts = author.blogPosts.all(); + + posts.destroy(); // all posts removed from db + ``` + + @method destroy + @return this + @public */ destroy() { _invokeMap(this.models, 'destroy'); @@ -57,10 +114,19 @@ export default class Collection { } /** - * Saves all models in the collection. - * @method save - * @return this - * @public + Saves all models in the collection. + + ```js + let posts = author.blogPosts.all(); + + posts.models[0].published = true; + + posts.save(); // all posts saved to db + ``` + + @method save + @return this + @public */ save() { _invokeMap(this.models, 'save'); @@ -69,10 +135,11 @@ export default class Collection { } /** - * Reloads each model in the collection. - * @method reload - * @return this - * @public + Reloads each model in the collection. + + @method reload + @return this + @public */ reload() { _invokeMap(this.models, 'reload'); @@ -81,11 +148,16 @@ export default class Collection { } /** - * Adds a model to this collection - * - * @method add - * @return this - * @public + Adds a model to this collection. + + ```js + user.posts.add(newPost); + ``` + + @method add + @param model + @return this + @public */ add(model) { this.models.push(model); @@ -94,11 +166,11 @@ export default class Collection { } /** - * Removes a model to this collection - * - * @method remove - * @return this - * @public + Removes a model to this collection + + @method remove + @return this + @public */ remove(model) { let [ match ] = this.models.filter(m => m.toString() === model.toString()); @@ -111,21 +183,21 @@ export default class Collection { } /** - * Checks if the collection includes the model - * - * @method includes - * @return boolean - * @public + Checks if the collection includes the model + + @method includes + @return boolean + @public */ includes(model) { return this.models.filter(m => m.toString() === model.toString()).length > 0; } /** - * @method filter - * @param f - * @return {Collection} - * @public + @method filter + @param f + @return {Collection} + @public */ filter(f) { let filteredModels = this.models.filter(f); @@ -134,10 +206,20 @@ export default class Collection { } /** - * @method sort - * @param f - * @return {Collection} - * @public + Returns a new Collection with its models sorted according to the provided [compare function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Parameters). + + ```js + let posts = author.blogPosts.all(); + + let postsByTitleAsc = posts.sort((a, b) => { + return b.title < a.title; + }); + ``` + + @method sort + @param f + @return {Collection} + @public */ sort(f) { let sortedModels = this.models.concat().sort(f); @@ -146,11 +228,11 @@ export default class Collection { } /** - * @method slice - * @param {Integer} begin - * @param {Integer} end - * @return {Collection} - * @public + @method slice + @param {Integer} begin + @param {Integer} end + @return {Collection} + @public */ slice(...args) { let slicedModels = this.models.slice(...args); @@ -159,10 +241,10 @@ export default class Collection { } /** - * @method mergeCollection - * @param collection - * @return this - * @public + @method mergeCollection + @param collection + @return this + @public */ mergeCollection(collection) { this.models = this.models.concat(collection.models); @@ -171,10 +253,11 @@ export default class Collection { } /** - * Simple string representation of the collection and id. - * @method toString - * @return {String} - * @public + Simple string representation of the collection and id. + + @method toString + @return {String} + @public */ toString() { return `collection:${this.modelName}(${this.models.map((m) => m.id).join(',')})`; diff --git a/addon/server.js b/addon/server.js index 5b2421b97..1d9e99ade 100644 --- a/addon/server.js +++ b/addon/server.js @@ -138,11 +138,13 @@ function extractRouteArguments(args) { } /** - * - * - * @class Server - * @public - */ + The Mirage server. + + Note that `this` within your config function in `mirage/config.js` refers to the server instance, which is the same instance that `server` refers to in your tests. + + @class Server + @public +*/ export default class Server { /** @@ -155,6 +157,45 @@ export default class Server { this.config(options); } + /** + Set the base namespace used for all routes defined with `get`, `post`, `put` or `del`. + + For example, + + ```js + // app/mirage/config.js + export default function() { + + this.namespace = '/api'; + + // this route will handle the URL '/api/contacts' + this.get('/contacts', 'contacts'); + }; + ``` + + Note that only routes defined after `this.namespace` are affected. This is useful if you have a few one-off routes that you don't want under your namespace: + + ```js + // app/mirage/config.js + export default function() { + + // this route handles /auth + this.get('/auth', function() { ...}); + + this.namespace = '/api'; + // this route will handle the URL '/api/contacts' + this.get('/contacts', 'contacts'); + }; + ``` + + If your Ember app is loaded from the filesystem vs. a server (e.g. via Cordova or Electron vs. `ember s` or `https://yourhost.com/`), you will need to explicitly define a namespace. Likely values are `/` (if requests are made with relative paths) or `https://yourhost.com/api/...` (if requests are made to a defined server). + + For a sample implementation leveraging a configured API host & namespace, check out [this issue comment](https://github.com/samselikoff/ember-cli-mirage/issues/497#issuecomment-183458721) + + @property namespace + @type String + @public + */ config(config = {}) { let didOverrideConfig = (config.environment && (this.environment && (this.environment !== config.environment))); assert(!didOverrideConfig, @@ -197,7 +238,7 @@ export default class Server { let didOverridePretenderConfig = (config.trackRequests !== undefined) && this.pretender; assert(!didOverridePretenderConfig, 'You cannot modify Pretender\'s request tracking once the server is created'); - this.pretender = this.pretender || createPretender(this); + this.pretender = this.pretender || config.pretender || createPretender(this); if (config.baseConfig) { this.loadConfig(config.baseConfig); diff --git a/config/addon-docs.js b/config/addon-docs.js new file mode 100644 index 000000000..6feb2fd90 --- /dev/null +++ b/config/addon-docs.js @@ -0,0 +1,72 @@ +/* eslint-env node */ +'use strict'; + +const AddonDocsConfig = require('ember-cli-addon-docs/lib/config'); + +module.exports = class extends AddonDocsConfig { + /* + Return a boolean indicating whether or not the current deploy should + actually run. The `info` parameter contains details about the most recent + git commit. Note that you can also access any configured environment + variables via `process.ENV`. + + info.branch => the current branch or `null` if not on a branch + info.sha => the current sha + info.abbreviatedSha => the first 10 chars of the current sha + info.tag => the tag for the current sha or `null` if none exists + info.committer => the committer for the current sha + info.committerDate => the commit date for the current sha + info.author => the author for the current sha + info.authorDate => the authored date for the current sha + info.commitMessage => the commit message for the current sha + + Note that CI providers typically check out a specific commit hash rather + than a named branch, so `info.branch` may not be available in CI builds. + */ + shouldDeploy(info) { + /* + For example, you might configure your CI builds to execute `ember deploy` + at the end of each successful run, but you may only want to actually + deploy builds on the `master` branch with the default ember-try scenario. + To accomplish that on Travis, you could write: + + return process.env.TRAVIS_BRANCH === 'master' + && process.env.EMBER_TRY_SCENARIO == 'ember-default'; + */ + return super.shouldDeploy(info); + } + + /* + Return a string indicating a subdirectory in the gh-pages branch you want + to deploy to, or nothing to deploy to the root. This hook receives the same + info object as `shouldDeploy` above. + */ + deployDirectory(info) { + /* + For example, to deploy a permalink-able copy of your docs site any time + you tag a release, you could write: + + return info.tag ? `tags/${info.tag}` : 'master'; + */ + return super.deployDirectory(info); + } + + /* + By default, the folder returned by `deployDirectory()` above will be + emptied out before a new revision of the docs application is written there. + + To retain certain files across deploys, return an array of file paths or + globs, relative to the deploy directory, indicating files/directories that + should not be removed before deploying. + */ + preservedPaths(info) { + /* + For example, if you had static JSON in your gh-pages branch powering + something like a blog UI that you want to manage separately from your + app deploys, you might write: + + return ['blog-posts/*.json', ...super.preservedPaths(info)]; + */ + return super.preservedPaths(info); + } +}; diff --git a/config/deploy.js b/config/deploy.js new file mode 100644 index 000000000..41cc6aa94 --- /dev/null +++ b/config/deploy.js @@ -0,0 +1,28 @@ +/* jshint node: true */ + +module.exports = function(deployTarget) { + var ENV = { + build: {} + // include other plugin configuration that applies to all deploy targets here + }; + + if (deployTarget === 'development') { + ENV.build.environment = 'development'; + // configure other plugins for development deploy target here + } + + if (deployTarget === 'staging') { + ENV.build.environment = 'production'; + // configure other plugins for staging deploy target here + } + + if (deployTarget === 'production') { + ENV.build.environment = 'production'; + // configure other plugins for production deploy target here + } + + // Note: if you need to build some configuration asynchronously, you can return + // a promise that resolves with the ENV object instead of returning the + // ENV object synchronously. + return ENV; +}; diff --git a/package.json b/package.json index ad1190429..99e7e89ba 100644 --- a/package.json +++ b/package.json @@ -36,8 +36,8 @@ "dependencies": { "broccoli-funnel": "^1.0.2", "broccoli-merge-trees": "^1.1.0", - "broccoli-string-replace": "^0.1.2", "broccoli-stew": "^1.5.0", + "broccoli-string-replace": "^0.1.2", "chalk": "^1.1.1", "ember-cli-babel": "^6.8.2", "ember-cli-node-assets": "^0.1.4", @@ -58,10 +58,17 @@ "chai": "^4.1.0", "ember-ajax": "^3.0.0", "ember-cli": "~2.18.2", + "ember-cli-addon-docs": "ember-learn/ember-cli-addon-docs#a61d13b9e95c7a303c9f888772d7909441e8ed6b", + "ember-cli-addon-docs-esdoc": "^0.2.1", "ember-cli-app-version": "^2.0.0", "ember-cli-dependency-checker": "^2.0.0", + "ember-cli-deploy": "^1.0.1", + "ember-cli-deploy-build": "^1.1.0", + "ember-cli-deploy-git": "^1.3.0", + "ember-cli-deploy-git-ci": "^1.0.1", "ember-cli-eslint": "^4.2.1", "ember-cli-fastboot": "^1.1.4-beta.1", + "ember-cli-favicon": "^1.0.0-beta.4", "ember-cli-htmlbars": "^2.0.1", "ember-cli-htmlbars-inline-precompile": "^1.0.0", "ember-cli-inject-live-reload": "^1.4.1", diff --git a/tests/dummy/app/adapters/application.js b/tests/dummy/app/adapters/application.js deleted file mode 100644 index e230b3c54..000000000 --- a/tests/dummy/app/adapters/application.js +++ /dev/null @@ -1,5 +0,0 @@ -import ActiveModelAdapter from 'active-model-adapter'; - -export default ActiveModelAdapter.extend({ - namespace: 'api' -}); diff --git a/tests/dummy/app/components/.gitkeep b/tests/dummy/app/components/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/tests/dummy/app/controllers/application.js b/tests/dummy/app/controllers/application.js index 539345441..003c62f62 100644 --- a/tests/dummy/app/controllers/application.js +++ b/tests/dummy/app/controllers/application.js @@ -1,3 +1,3 @@ -import Controller from '@ember/controller'; +import Controller from 'ember-cli-addon-docs/controllers/application'; export default Controller.extend(); diff --git a/tests/dummy/app/index.html b/tests/dummy/app/index.html index 61400b20f..00c5a7d61 100644 --- a/tests/dummy/app/index.html +++ b/tests/dummy/app/index.html @@ -14,7 +14,7 @@ {{content-for "head-footer"}} - + {{content-for "body"}} diff --git a/tests/dummy/app/pods/docs/examples/1-belongs-to/controller.js b/tests/dummy/app/pods/docs/examples/1-belongs-to/controller.js new file mode 100644 index 000000000..47f22b687 --- /dev/null +++ b/tests/dummy/app/pods/docs/examples/1-belongs-to/controller.js @@ -0,0 +1,44 @@ +import Controller from '@ember/controller'; +import Server from 'ember-cli-mirage/server'; +import { Model, belongsTo } from 'ember-cli-mirage'; +import { computed } from '@ember/object'; + +export default Controller.extend({ + + init() { + this._super(...arguments); + + let server = new Server({ + pretender: true, + models: { + // BEGIN-SNIPPET 1-belongs-to-schema + author: Model.extend(), + + book: Model.extend({ + author: belongsTo() + }) + // END-SNIPPET + } + }); + + // BEGIN-SNIPPET 1-belongs-to + let author = server.create('author', { + name: 'Neal Stephenson' + }); + + server.create('book', { + author, + title: 'Cryptonomicon' + }); + // END-SNIPPET + + this.set('server', server); + }, + + dbDump: computed('server', function() { + let json = this.get('server').db.dump(); + + return JSON.stringify(json, null, 2); + }) + +}); diff --git a/tests/dummy/app/pods/docs/examples/1-belongs-to/template.md b/tests/dummy/app/pods/docs/examples/1-belongs-to/template.md new file mode 100644 index 000000000..0e447cb80 --- /dev/null +++ b/tests/dummy/app/pods/docs/examples/1-belongs-to/template.md @@ -0,0 +1,15 @@ +# Belongs to (no inverse) + +## Schema + +{{docs-snippet name='1-belongs-to-schema'}} + +## Setup + +{{docs-snippet name='1-belongs-to'}} + +## Database + +
+{{{dbDump}}}
+
diff --git a/tests/dummy/app/pods/docs/examples/2-has-many/controller.js b/tests/dummy/app/pods/docs/examples/2-has-many/controller.js new file mode 100644 index 000000000..bd7207c7f --- /dev/null +++ b/tests/dummy/app/pods/docs/examples/2-has-many/controller.js @@ -0,0 +1,44 @@ +import Controller from '@ember/controller'; +import Server from 'ember-cli-mirage/server'; +import { Model, hasMany } from 'ember-cli-mirage'; +import { computed } from '@ember/object'; + +export default Controller.extend({ + + init() { + this._super(...arguments); + + let server = new Server({ + pretender: true, + models: { + // BEGIN-SNIPPET 2-has-many-schema + author: Model.extend({ + books: hasMany() + }), + + book: Model.extend() + // END-SNIPPET + } + }); + + // BEGIN-SNIPPET 2-has-many + let book = server.create('book', { + title: 'Cryptonomicon' + }); + + server.create('author', { + name: 'Neal Stephenson', + books: [ book ] + }); + // END-SNIPPET + + this.set('server', server); + }, + + dbDump: computed('server', function() { + let json = this.get('server').db.dump(); + + return JSON.stringify(json, null, 2); + }) + +}); diff --git a/tests/dummy/app/pods/docs/examples/2-has-many/template.md b/tests/dummy/app/pods/docs/examples/2-has-many/template.md new file mode 100644 index 000000000..21eb1c65c --- /dev/null +++ b/tests/dummy/app/pods/docs/examples/2-has-many/template.md @@ -0,0 +1,15 @@ +# Has many (no inverse) + +## Schema + +{{docs-snippet name='2-has-many-schema'}} + +## Setup + +{{docs-snippet name='2-has-many'}} + +## Database + +
+{{{dbDump}}}
+
diff --git a/tests/dummy/app/pods/docs/examples/index/template.md b/tests/dummy/app/pods/docs/examples/index/template.md new file mode 100644 index 000000000..0065595c2 --- /dev/null +++ b/tests/dummy/app/pods/docs/examples/index/template.md @@ -0,0 +1,5 @@ +# Examples + +Here are some examples of different data scenarios you can set up using Mirage. + +If you are trying to set up a similar scenario in your own app, use `server.db.dump()` to inspect the database after you have created some data, and ensure the foreign keys match what is expected, using the examples as a reference. diff --git a/tests/dummy/app/router.js b/tests/dummy/app/router.js index 0c8551f27..01b4a5258 100644 --- a/tests/dummy/app/router.js +++ b/tests/dummy/app/router.js @@ -1,22 +1,48 @@ -import EmberRouter from '@ember/routing/router'; +import AddonDocsRouter, { docsRoute } from 'ember-cli-addon-docs/router'; import config from './config/environment'; -const Router = EmberRouter.extend({ +const Router = AddonDocsRouter.extend({ location: config.locationType, rootURL: config.rootURL }); Router.map(function() { - this.route('contacts', { path: '/' }); - this.route('contact', { path: '/:contact_id' }); - this.route('edit', { path: '/:contact_id/edit' }); + docsRoute(this, function() { + this.route('getting-started', { path: '/' }, function() { + this.route('overview'); + this.route('installation'); + this.route('quickstart'); + this.route('upgrading'); + }); - this.route('friends'); - this.route('friend', { path: '/friends/:friend_id' }); - this.route('close-friends'); - this.route('pets'); + this.route('writing-your-server', function() { + this.route('defining-routes'); + this.route('seeding-your-database'); + this.route('acceptance-testing'); + }); - this.route('word-smith', { path: '/word-smiths/:word_smith_id' }); + this.route('examples', function() { + this.route('1-belongs-to'); + this.route('2-has-many'); + }); + + this.route('api', function() { + this.route('class', { path: '/:class_id' }); + }); + }); + + // this.route('contacts', { path: '/' }); + // this.route('contact', { path: '/:contact_id' }); + // this.route('edit', { path: '/:contact_id/edit' }); + // + // this.route('friends'); + // this.route('friend', { path: '/friends/:friend_id' }); + // this.route('close-friends'); + // this.route('pets'); + // + // this.route('word-smith', { path: '/word-smiths/:word_smith_id' }); + + this.route('not-found', { path: '/*path' }); }); export default Router; diff --git a/tests/dummy/app/serializers/application.js b/tests/dummy/app/serializers/application.js deleted file mode 100644 index e78d1a9d4..000000000 --- a/tests/dummy/app/serializers/application.js +++ /dev/null @@ -1,3 +0,0 @@ -import { ActiveModelSerializer } from 'active-model-adapter'; - -export default ActiveModelSerializer; diff --git a/tests/dummy/app/styles/app.css b/tests/dummy/app/styles/app.css index 9adb5ad01..e69de29bb 100644 --- a/tests/dummy/app/styles/app.css +++ b/tests/dummy/app/styles/app.css @@ -1,3 +0,0 @@ -html, body { - margin: 20px; -} diff --git a/tests/dummy/app/templates/application.hbs b/tests/dummy/app/templates/application.hbs index f8bc38e7b..5633c6360 100644 --- a/tests/dummy/app/templates/application.hbs +++ b/tests/dummy/app/templates/application.hbs @@ -1,3 +1,5 @@ -

Welcome to Ember

+{{docs-header}} {{outlet}} + +{{docs-keyboard-shortcuts}} diff --git a/tests/dummy/app/templates/docs.hbs b/tests/dummy/app/templates/docs.hbs new file mode 100644 index 000000000..1cdfcfde7 --- /dev/null +++ b/tests/dummy/app/templates/docs.hbs @@ -0,0 +1,28 @@ +{{#docs-viewer as |viewer|}} + + {{#viewer.nav as |nav|}} + {{nav.section 'Getting started'}} + {{nav.item 'Overview' 'docs.getting-started'}} + {{nav.item 'Installation' 'docs.getting-started.installation'}} + {{nav.item 'Quickstart' 'docs.getting-started.quickstart'}} + {{nav.item 'Upgrading' 'docs.getting-started.upgrading'}} + + {{nav.section 'Writing your server'}} + {{nav.item 'Defining routes' 'docs.writing-your-server.defining-routes'}} + {{nav.item 'Seeding your database' 'docs.writing-your-server.seeding-your-database'}} + {{nav.item 'Acceptance testing' 'docs.writing-your-server.acceptance-testing'}} + + {{nav.section 'Examples'}} + {{nav.item '1: Belongs to (no inverse)' 'docs.examples.1-belongs-to'}} + {{nav.item '2: Has many (no inverse)' 'docs.examples.2-has-many'}} + {{/viewer.nav}} + + {{#viewer.main}} +
+
+ {{outlet}} +
+
+ {{/viewer.main}} + +{{/docs-viewer}} diff --git a/tests/dummy/app/templates/docs/getting-started/index.md b/tests/dummy/app/templates/docs/getting-started/index.md new file mode 100644 index 000000000..6b72cd11a --- /dev/null +++ b/tests/dummy/app/templates/docs/getting-started/index.md @@ -0,0 +1,20 @@ +# Overview + +Nearly all Ember apps interact with an API. When you reach the point during development where you need to work with dynamic server data, you have a few options: + + 1. Proxy your app's HTTP requests to a local or hosted version of your actual backend, if it exists + 2. Use a library like [Pretender](https://github.com/trek/pretender) or [jQuery mockjax](https://github.com/jakerella/jquery-mockjax) to write a custom script that intercepts your requests in the client + 3. Use Ember CLI's HTTP mocks + +Option 1 can work if you already have the API, but often that isn't the case. And even if it is, development and testing often requires server state that differs from the live API. Option 2 is flexible, but requires you to start from scratch in each project, leaving it up to you to enforce conventions across your apps. Option 3 has a bit more structure, but requires a node server to be running, and doesn't allow you to use your fake server in a CI environment. + +Mirage was built to solve these problems. It's a fake server that runs in the client, and can be used in both development and testing. It brings along enough conventions to quickly get you up and running. + +Mirage borrows concepts from typical backend systems like + + - **routes** + - a **database** and **models**, for storing data and defining relationships + - **factories** and **fixtures**, for stubbing data + - **serializers**, for formatting responses + +Once you define your server, developing and testing your Ember app is a breeze. Read on to learn more! diff --git a/tests/dummy/app/templates/docs/getting-started/installation.md b/tests/dummy/app/templates/docs/getting-started/installation.md new file mode 100644 index 000000000..4da240570 --- /dev/null +++ b/tests/dummy/app/templates/docs/getting-started/installation.md @@ -0,0 +1,11 @@ +# Installation + +To install Mirage, run + +``` +ember install ember-cli-mirage +``` + +Ember should install the addon and add a `/mirage` directory to the root of your project. + +Check out the [upgrade guide](../upgrading) if you're coming from Mirage 0.2.x. diff --git a/tests/dummy/app/templates/docs/getting-started/quickstart.md b/tests/dummy/app/templates/docs/getting-started/quickstart.md new file mode 100644 index 000000000..ce5e65515 --- /dev/null +++ b/tests/dummy/app/templates/docs/getting-started/quickstart.md @@ -0,0 +1,306 @@ +# Quickstart + +Mirage is all about simulating your API server. You define *route handlers* to respond to your Ember app's AJAX requests. + +Here's a simple example of a handler: + +```js +// mirage/config.js +export default function() { + this.namespace = 'api'; + + this.get('/authors', () => { + return { + authors: [ + {id: 1, name: 'Zelda'}, + {id: 2, name: 'Link'}, + {id: 3, name: 'Epona'}, + ] + }; + }); + +} +``` + +Now whenever your Ember app makes a GET request to `/api/authors`, Mirage will respond with this data. + +## Dynamic data + +This works, and is a common way to simulate HTTP responses - but hard-coded responses like this have a few problems: + + - *They're inflexible*. What if you want to change this route's response data in your tests? + - *They contain formatting logic*. Logic that formats the shape of your JSON payload (e.g., including the root `authors` key) is now duplicated across all your route handlers. + - *They're too basic.* Inevitably, when your fake server needs to deal with more complex things like relationships, these simple ad hoc responses start to break down. + +Mirage provides primitives that let you write a more flexible server implementation. Let's see how they work by replacing our basic stub data above. + +First, create an `author` model by running the following in your terminal: + +```bash +$ ember g mirage-model author +``` + +This generates the following file: + +```js +// mirage/models/author.js +import { Model } from 'ember-cli-mirage'; + +export default Model.extend({ +}); +``` + +The model will create an `authors` table in Mirage's *in-memory database*. The database makes our route handlers dynamic—we can change the returned data without rewriting the handler. In this way, we can share the same route definitions in both development and testing, while still having control over their response data. + +Let's update our route handler to be dynamic: + +```js +// mirage/config.js +this.namespace = 'api'; + +this.get('/authors', (schema, request) => { + return schema.authors.all(); +}); +``` + +Now this route will respond with all the authors in Mirage's database at the time of the request. If we want to change the data this route responds with, we simply need to change the data in the database. + +## Creating data + + + +To actually seed our database with fake data, we'll use *factories*. Factories are objects that dynamically generate data - think of them as blueprints for your models. + +Let's create a factory for our author with + +```sh +$ ember g mirage-factory author +``` + +Mirage also includes the Faker.js library. Let's use this in the Factory and add some properties to it: + +```js +// mirage/factories/author.js +import { Factory, faker } from 'ember-cli-mirage'; + +export default Factory.extend({ + + name(i) { + return `Person ${i}`; + }, + + age: 28, + + admin: false, + + avatar() { + return faker.internet.avatar(); + } + +}); +``` + +This factory creates objects like + +```javascript +[{ + name: 'Person 1', + age: 28, + admin: false, + avatar: 'https://s3.amazonaws.com/uifaces/faces/twitter/bergmartin/128.jpg' +}, +{ + name: 'Person 2', + age: 28, + admin: false, + avatar: 'https://s3.amazonaws.com/uifaces/faces/twitter/nemanjaivanovic/128.jpg' +}] +``` + +and so on, which will automatically be inserted into the `authors` database table. The database will assign each record an `id`, and now we can interact with this data in our route handlers. + +To use our new factory, we can call the `server.create` and `server.createList` methods in development: + +```js +// mirage/scenarios/default.js +export default function(server) { + + server.createList('author', 10); + +}; +``` + +and in acceptance tests: + +```js +// tests/acceptance/authors-test.js +test("I can view the authors", function() { + let authors = server.createList('author', 3); + + visit('/authors'); + + andThen(() => { + equal(find('li').length, 3); + equal(find('li:first').text(), authors[0].name); + }); +}); +``` + +You now have a simple way to set up your fake server's initial data, both during development and on a per-test basis. + +## Associations and serializers + +Dealing with associations is always tricky, and faking endpoints that deal with associations is no exception. Fortunately, Mirage ships with an ORM to help keep your routes clean. + +Let's say your author has many blog-posts. You can declare this relationship in your model: + +```js +// mirage/models/author.js +import { Model, hasMany } from 'ember-cli-mirage'; + +export default Model.extend({ + blogPosts: hasMany() +}); + +// mirage/models/blog-post.js +import { Model, belongsTo } from 'ember-cli-mirage'; + +export default Model.extend({ + author: belongsTo() +}); +``` + +Now Mirage knows about the relationship between these two models, which can be useful when writing route handlers: + +```js +this.get('/authors/:id/blog-posts', (schema, request) => { + let author = schema.authors.find(request.params.id); + + return author.blogPosts; +}); +``` + +and when creating graphs of related data: + +```js +test('I can see the posts on the homepage', function(assert) { + let author = server.create('author'); + server.createList('post', 10, { author }); + + visit('/'); + + andThen(() => { + assert.expect(find('li').length, 10); + }); +}); +``` + +Mirage's serializer layer is also aware of your relationships, which helps when faking endpoints that sideload or embed related data. Models and Collections that are returned from a route handler pass through the serializer layer, where you can customize which attributes and associations to include, as well as override other formatting options: + +```js +// mirage/serializers/application.js +import { Serializer } from 'ember-cli-mirage'; + +export default Serializer.extend({ + keyForAttribute(attr) { + return dasherize(attr); + }, + + keyForRelationship(attr) { + return dasherize(attr); + }, +}); + +// mirage/serializers/author.js +import { Serializer } from 'ember-cli-mirage'; + +export default Serializer.extend({ + include: ['blogPosts'] +}); + +// mirage/config.js +export default function() { + this.get('/authors/:id', (schema, request) => { + return schema.authors.find(request.params.id); + }); +} +``` + +With the above config, a GET to `/authors/1` would return something like + +``` +/* +{ + author: { + id: 1, + 'first-name': 'Zelda' + }, + 'blog-posts': [ + {id: 1, 'author-id': 1, title: 'Lorem ipsum'}, + ... + ] +} +*/ +``` + +Mirage ships with two named serializers, JSONAPISerializer and ActiveModelSerializer, to save you the trouble of writing this custom code yourself. See the [serializer guide](../serializers) to learn more. + +## Shorthands + + + +Mirage has *shorthands* to reduce the code needed for conventional API routes. For example, the route handler + +```js +this.get('/authors', (schema, request) => { + return schema.authors.all(); +}); +``` + +can be written as + +```js +this.get('/authors'); +``` + +There are also shorthands for `put` (or `patch`), `post` and `del` methods. Here's a full set of resourceful routes for an `author` resource: + +```js +this.get('/authors'); +this.get('/authors/:id'); +this.post('/authors'); +this.put('/authors/:id'); // or this.patch +this.del('/authors/:id'); +``` + +Shorthands make writing your server definition concise, so you should use them whenever possible. You can always fall back to a custom function when you need more control. + +## Passthrough + +Mirage is a great tool to use even if you're working on an existing app, or if you don't want to fake your entire API. By default, Mirage throws an error if your Ember app makes a request that doesn't have a corresponding route handler defined. To avoid this, tell Mirage to let unhandled requests pass through: + +```js +// mirage/config.js +this.passthrough(); +``` + +Now you can develop as you normally would, for example against an existing API. + +When it comes time to build a new feature, you don't have to wait for the API to be updated. Just define the new route that you need + +```js +// mirage/config.js +this.get('/comments'); + +this.passthrough(); +``` + +and you can fully develop and test the feature. In this way you can build up your fake server piece by piece - adding some solid acceptance tests along the way. + +--- + +That should be enough to get you started! Keep reading to learn more. diff --git a/tests/dummy/app/templates/docs/getting-started/upgrading.md b/tests/dummy/app/templates/docs/getting-started/upgrading.md new file mode 100644 index 000000000..953eef0ab --- /dev/null +++ b/tests/dummy/app/templates/docs/getting-started/upgrading.md @@ -0,0 +1,204 @@ +# Upgrading + +## Updating your version of Mirage + +To install a new version of Mirage, run + +```sh +npm install ember-cli-mirage@X.X.X --save-dev +ember g ember-cli-mirage +``` + +The `ember g ember-cli-mirage` command ensures all of Mirage's Bower dependencies are added to your project. It runs during `ember install`, and it's always a good idea to run it when upgrading. + +Use `ember-cli-mirage@beta` to get the latest beta. + +## Changelog + +You can view Mirage's full Changelog here: + +[https://github.com/samselikoff/ember-cli-mirage/blob/master/CHANGELOG.md](https://github.com/samselikoff/ember-cli-mirage/blob/master/CHANGELOG.md) + +## 0.2.x > 0.3 Upgrade guide + +The main change from 0.2.x to 0.3.x is that relationships are now one-way. This better matches the semantics of both Ember Data and common HTTP transfer protocols like JSON:API. + +In 0.2, the following model definitions + +```js +// mirage/models/author.js +import { Model } from 'ember-cli-mirage'; + +export default Model.extend({ + +}); + +// mirage/models/post.js +import { Model, belongsTo } from 'ember-cli-mirage'; + +export default Model.extend({ + + author: belongsTo() + +}); +``` + +would have generated a "schema" with a one-to-many relationship between authors and posts: an author has many posts, and a post belongs to an author. Now, this just generates a one-way relationship from `post` to `author`. To have a two-way sync'd relationship, known as an inverse, you'd need to define both sides of the relationship: + +```js +// mirage/models/author.js +import { Model, hasMany } from 'ember-cli-mirage'; + +export default Model.extend({ + + posts: hasMany() + +}); + +// mirage/models/post.js +import { Model, belongsTo } from 'ember-cli-mirage'; + +export default Model.extend({ + + author: belongsTo() + +}); +``` + +Practically speaking, to upgrade you'll need to go through your code and update relationships that implicitly had inverses (from 0.2.x's hasMany and belongsTo behavior) and update them to define both sides. + +This could also affect your fixture files, if you are using those to seed your database. Instead of just having an authorId on the post above, for example, you'd also need the author to have a `postIds: []` array. (In general Factories are better for seeding your database, as they save you from having to manage ids at all.) + +Conceptually this change should be straightforward, as its making existing implicit relationships explicit, but if you find yourself having trouble with the upgrade it's probably because of something I haven't thought of. Please reach out to the community on the #ec-mirage channel on Slack and ask for help! + +For more information on the motivation behind change, please read the [0-3 beta series release blog post](http://www.ember-cli-mirage.com/blog/2017/01/09/0-3-0-beta-series/). + +## 0.1.x > 0.2 Upgrade guide + +If you're upgrading your Mirage server from v0.1.x to v0.2.x, here's what you need to know: + + - **The default Mirage directory has changed.** The default Mirage directory has moved from `/app/mirage` to `/mirage`. When you install 0.2.0, the default blueprint will add the `/mirage` directory to your project. You can delete it and move your current Mirage files to the new location with something like + + ```sh + rm -rf mirage + mv app/mirage mirage + ``` + + from the root of your project. Mirage's directory is also [customizable](../configuration/#directory) (Although you should move it from the `/app` directory or else it will not be removed from the build in production mode). + + - **All multiword filenames are dasherized.** In Mirage 0.1.x, database collection names were taken from filenames. The idea was, if your API returned snake_case collection keys (e.g. `blog_posts: []`), just name your file `fixtures/blog_posts.js`. This approach turned out to be insufficiently flexib-- what am I saying, it was just a bad idea :P. + + In Mirage 0.2.x, we follow Ember CLI's conventions of dasherized filenames. So, you'll just need to go through and change + + ```sh + /mirage/factories/blog_post.js + /mirage/fixtures/blog_post.js + # etc. + ``` + + to + + ```sh + /mirage/factories/blog-post.js + /mirage/fixtures/blog-post.js + ``` + + You will then use the [new Serializer layer](../serializers) to do things like format keys in your json payloads. + + - **All JavaScript properties are camelCased.** Similar to the previous change, factory properties and database collection names followed the format of your API in Mirage 0.1.x. If you were faking an ActiveModelSerializer backend, multiword keys used snake_case throughout your Mirage code. So, your database table might be `db.blog_posts`, and your factory keys might be `first_name() {..}`. Looks pretty cool right? + + Wrong. We're JavaScript developers here, people. It's time to start using camelCase. (Also, the idea of tying these keys to your serialization format was bad, as it left us without any conventions. We need to stick to a single format, so the ORM knows how to find foreign keys.) + + You'll need to update your route handlers, which may look like this: + + ```js + let posts = db.blog_posts.filter(p => p.author_id === 1); + ``` + + to + + ```js + let posts = db.blogPosts.filter(p => p.authorId === 1); + ``` + + Note that everything is camelCased, including foreign keys. + + Similarly, factories that look like + + ```js + export default Factory.extend({ + first_name() { + return faker.name.firstName(); + }, + + last_name() { + return faker.name.firstName(); + }, + }); + ``` + + should be changed to + + ```js + export default Factory.extend({ + firstName() { + return faker.name.firstName(); + }, + + lastName() { + return faker.name.firstName(); + }, + }); + ``` + + This goes for all attrs that `server.create` takes (and returns), etc. For many this will be the most painful part of the upgrade. Please find it in your heart to forgive me. + + - **Mirage now has its own Model layer (an ORM).** In Mirage 0.1.x, you had to define either a factory or a fixture file (or both) in order for a database collection to be created, which let you take advantage of the db in your route handlers. In 0.2, we've introduced Mirage Models, which serve as the new canonical source of truth about your database. + + To create a model, use + + ``` + ember g mirage-model blog-post + ``` + + This will create a file like + + ```js + import { Model } from 'ember-cli-mirage'; + + export default Model.extend({ + + }); + ``` + + Having that file sets up the `db.blogPosts` collection, allows you to use the JSON:API serializer, and more. You can still define factories and fixtures - but only if you need them. Models, factories and fixtures all work together, but now you won't be making blank factory or fixture files just to set up your database. The models themselves serve as the source of truth. + + We needed to add models for [association support](../models/#associations) (which currently exists) and factory relationships (the first feature to come after the 0.2 release). Read through the [models guide](../models) and [serializers guide](../serializers) to see how having models can simplify your Mirage server. + + We also have a plan to make a separate addon that could ascertain your model definitions and their relationships from your Ember Data models. Adding the ORM paves the way for this important future addition. + + Currently, Mirage will still work if a factory/fixture file is defined for a particular db collection without a corresponding model. Eventually, we may require all setups to have model definitions for each collection. But for now, to make for an easier upgrade path, you can start generating models and opt-in to the ORM layer in piecemeal. + +- **The ORM object `schema` is now injected into route handlers.** In Mirage 0.1.x, the `db` was the first parameter injected into route handlers: + + ```js + this.get('/posts', function(db, request) { + // work with db + }); + ``` + + Now, the `schema` object is, so you can take advantage of the Model layer. Fortunately, the `db` hangs directly off of the `schema`, so you can leave all your old route handler code intact (with the exception of making the change to camelCase), and just use destructuring to change the function signature to + + ```js + this.get('/posts', function({ db }, request) { + // work with db + }); + ``` + + and then start opting-in to the ORM (and using `schema`) one route handler at a time. + +- **Specify a Serializer.** If you're using shorthands, you'll need to pick a serializer in `/mirage/serializers/application.js`. See the [serializers guide](../serializers) for details. + +--- + +You can always view the [full changelog](https://github.com/samselikoff/ember-cli-mirage/blob/master/CHANGELOG.md) to see everything that's changed. If you think this guide missed a critical part of the upgrade path, please [open an issue](https://github.com/samselikoff/ember-cli-mirage/issues/new) or [help improve it](https://github.com/samselikoff/ember-cli-mirage/edit/gh-pages/docs/v0.3.x/upgrading.md)! diff --git a/tests/dummy/app/templates/docs/writing-your-server/acceptance-testing.md b/tests/dummy/app/templates/docs/writing-your-server/acceptance-testing.md new file mode 100644 index 000000000..d1a8a3311 --- /dev/null +++ b/tests/dummy/app/templates/docs/writing-your-server/acceptance-testing.md @@ -0,0 +1,160 @@ +# Acceptance testing + +Acceptance testing your Ember app typically involves verifying some user behavior. For example, you may want to test that the user can view the photos on your app's index route. + +Many of these tests rely on a given server state. In other words, you want to test that the user can view ten photos, *given that ten photo resources exist on the server* at the time the user boots up the app. + +Once you've defined your routes, use the `server` variable to define the initial server state directly in your tests: + +```js +test('I can view the photos', assert => { + server.createList('photo', 10); + + visit('/'); + + andThen(function() { + assert.equal( find('img').length, 10 ); + }); +}); +``` + +`server.createList` uses the `photo` factory to generate 10 database records. This way, Mirage's database is populated when the Ember app boots and makes an AJAX request to fetch the photos data. + +Mirage's server will be reset after each test, so each test starts out with a clean database state. + +## Keeping your tests focused + +The purpose of factories is to put code that's relevant to a test as close to that test as possible. In the example above, we wanted to verify that the user would see ten photos, given those photos existed on the server. So, the `server.createList('photo', 10)` call was directly in the test. + +Say we wanted to test that when the user visits a details route for a photo titled "Sunset over Hyrule," they would see that title in an `

` tag. One way to accomplish this would be to update the photo factory itself: + +```js +// mirage/factories/photo.js +import Mirage from 'ember-cli-mirage'; + +export default Mirage.Factory.extend({ + title: 'Sunset over Hyrule' +}); +``` + +The problem with this approach is that the desired change is very specific to this test. Suppose another test wanted to verify photos with different titles were displayed. Changing the factory to suit that case would break this test. + +For this reason, `create` and `createList` allow you to override specific attributes that your factory has defined. This lets us keep relevant code near our tests, without making them brittle. + +To override attributes, simply pass in an object as the last argument to `create` or `createList` with the attributes you want to override. Here's what this may look like for the photos example. + +First, let's make our factory more generic: + +```js +// mirage/factories/photo.js +import Mirage from 'ember-cli-mirage'; + +export default Mirage.Factory.extend({ + title(i) { + // Photo 1, Photo 2 etc. + return `Photo ${i}`; + } +}); +``` + +Now, we can write our tests, overriding the factory-generated attributes where appropriate: + +```js +test("I can view the photos", assert => { + server.createList('photo', 10); + + visit('/'); + + andThen(() => { + assert.equal( find('img').length, 10 ); + }); +}); + +test("I see the photo's title on a detail route", assert => { + let photo = server.create('photo', {title: 'Sunset over Hyrule'}); + + visit('/' + photo.id); + + andThen(() => { + assert.equal( find('h1:contains(Sunset over Hyrule)').length, 1 ); + }); +}); +``` + +We override `title` in the second test since it's relevant there, but we stick with the factory-generated defaults for the first test. + +## Asserting a server call was made in a test + +Often you'll write tests against your application's UI, which will verify that the proper data from Mirage was returned. However, because Mirage gives you a full client-side server, you can gain more confidence from your tests by asserting against Mirage's server state, in addition to testing your Ember app's UI. + +There are two general approaches to this. First, you can assert directly against Mirage's database: + +```js +test("I can change the lesson's title", assert => { + server.create('lesson', {title: 'My First Lesson'}) + + visit('/'); + click('.Edit') + fillIn('input', 'Updated lesson'); + click('.Save'); + + andThen(() => { + // Assert against our app's UI + assert.equal( find('h1:contains(Updated lesson)').length, 1 ); + + // Also check that the data was "persisted" to our backend + assert.equal( server.db.lessons[0].title, 'Updated lesson'); + }); +}); +``` + +The next strategy is to temporarily override the server route that's relevant to your test, and assert against the actual request that your Ember app sent: + +```js +test("I can change the lesson's title", function(assert) { + assert.expect(1); + let done = assert.async(); + + server.create('lesson', {title: 'My First Lesson'}) + + server.put('/lessons/:id', (schema, request) => { + let params = JSON.parse(request.requestBody); + + // Here, we're asserting the params Mirage received are in the format you expect + assert.deepEqual(params, {...}); + done(); + }); + + visit('/'); + click('.Edit') + fillIn('input', 'Updated lesson'); + click('.Save'); +}); +``` + +Note that here, we're overwriting any route handler you may defined for PUT to `/lessons/:id` in your `config.js` file, but only for this test. After this test, your Mirage server will be reset, and all the routes from `config.js` will be used. + +## Testing errors + +To test how your Ember app responds to a server error, overwrite a route handler within a test: + +```js +test('the user sees an error if the save attempt fails', function(assert) { + server.post('/questions', {errors: ['There was an error']}, 500); + + visit('/'); + click('.new'); + fillIn('input', 'New question'); + click('.save'); + + andThen(() => { + assert.equals(find('p:contains(There was an error)').length, 1); + }); +}); +``` + +This route handler definition is only in effect for the duration of this test, so as soon as it's over any handler you have defined for POST to `/questions` in your `config.js` file will be used again. + +--- + +You should now know enough to fake your production API and test your app using Mirage! diff --git a/tests/dummy/app/templates/docs/writing-your-server/defining-routes.md b/tests/dummy/app/templates/docs/writing-your-server/defining-routes.md new file mode 100644 index 000000000..b2e7d368b --- /dev/null +++ b/tests/dummy/app/templates/docs/writing-your-server/defining-routes.md @@ -0,0 +1,367 @@ +# Defining routes + +To define routes for your server, use the `get`, `post`, `put` (or `patch`) and `del` methods. Here's an example: + +```js +// mirage/config.js +this.get('/authors', () => { + return ['Link', 'Zelda', 'Epona']; +}); +``` + +Now when your Ember app makes a GET request to `/authors`, it will receive this data. + +Each verb method has the same signature. The first argument is the path (URL) and the second is the actual function handler that returns the response: + +

this.verb( path, handler )

+ +Here are some more examples: + +```js +this.get('/users/current', () => { + return { + name: 'Zelda', + email: 'z@hyrule.org' + }; +}); + +this.get('/events', () => { + let events = []; + for (let i = 1; i < 1000; i++) { + events.push({id: i, value: Math.random()}); + }; + + return events; +}); +``` + + +## Working with Models + +In the examples above, we wrote the response data directly in the route. Instead of doing this, Mirage provides a simple in-memory database you can use to make your routes more versatile. + +In previous versions of Mirage, you interacted with the database directly in your route handlers. Models were introduced as a wrapper around the database to provide better means for dealing with associations and formatting responses, which we'll get to shortly. For now, it's enough to know that models are the primary way you interact with Mirage's database. + +So, let's first define an `author` model. We can do this from the command line: + +```sh +ember g mirage-model author +``` + +This gives us the file + +```js +// mirage/models/author.js +import { Model } from 'ember-cli-mirage'; + +export default Model; +``` + +which sets up our database (at run-time) with an `authors` table. Now we can rewrite our route handler to use the model. + +A `schema` object is injected into each route handler as the first parameter, which is how we access our models. Let's use it to make this route dynamic: + +```js +// mirage/config.js +this.get('/authors', (schema) => { + return schema.authors.all(); +}); +``` + + + +Now, Mirage will respond to this route with all the `author` models in its database. + +You can also create, update and delete models from your route handlers. A `request` object is injected as the second parameter, which contains any data that was sent along with the request. + +Let's say your Ember app creates an author by sending a POST request with the following payload: + +``` +{ + author: { + name: 'Link', + age: 123 + } +} +``` + +We can use this data to create a new `author` model: + +```js +this.post('/authors', (schema, request) => { + const attrs = JSON.parse(request.requestBody).author; + + return schema.authors.create(attrs); +}); +``` + +This handler creates a new author, inserts it into the database (which assigns it an `id`), and responds with that record. + + + +As long as all your Mirage routes read from and write to the database, user interactions will persist during a single session. This lets users interact with your app as if it were wired up to a real server. + + +## Dynamic paths and query params + +The request object that's injected into your route handlers contains any dynamic route segments and query params. + +To define a route that has a dynamic segment, use colon syntax (`:segment`) in your path. The dynamic piece will be available via `request.params.[segment]`: + +```js +this.get('/authors/:id', (schema, request) => { + var id = request.params.id; + + return schema.authors.find(id); +}) +``` + +Query params from the request can also be accessed via `request.queryParams.[param]`. + +Mirage uses Pretender.js to intercept HTTP requests, so check out [its docs](https://github.com/trek/pretender) to see the full API for the request object. + + +## Using shorthands + +APIs have become more standardized, so Mirage has the concept of *shorthands* to deal with common scenarios. These shorthands can replace many of your custom route handlers, dramatically simplifying your server definition. + +For example, the route handler we wrote above to handle a GET request to `/authors` + +```js +this.get('/authors', (schema, request) => { + return schema.authors.all(); +}); +``` + +is pretty standard: it responds with a named collection. The shorthand form of this is + +```js +this.get('/authors'); +``` + +which infers the collection name from the last part of the URL. Returning a single author by id is just as easy: + +```js +this.get('/authors/:id'); +``` + +Similarly, we wrote a route handler by hand to deal with creating an author + +```js +this.post('/authors', (schema, request) => { + const attrs = JSON.parse(request.requestBody).author; + + return schema.authors.create(attrs); +}); +``` + +which is also pretty standard: it creates a new model using the attributes from the request payload. The equivalent shorthand is + +```js +this.post('/authors'); +``` + +View the [full reference](../shorthands) to see all available shorthands. + + +## Formatting your response with Serializers + +When you return a model or a collection from a route handler, Mirage *serializes* it into a JSON payload, and then responds to your Ember app with that payload. It uses an object called a Serializer to do this, which you can customize. Having a single object that's responsible for this formatting logic helps keep your route handlers simple. In particular, a bit of customization in the serializer layer often lets you use shorthands when you otherwise wouldn't be able to. + +Mirage ships with three named serializers, JsonApiSerializer (used to implement [JSON:API](http://jsonapi.org/)), ActiveModelSerializer (used to simulate Rails servers using ActiveModel::Serializers) and RestSerializer (use to match Ember Data’s RestSerializer expected response format). You should use these if your app's backend will be built to conform to either standard. + +Additionally, there's a basic Serializer class that you can use and customize. By default, it takes all the attributes of your model, and returns them under a root key of the model type. Suppose you had the following author in your database: + +``` +{ + id: 1, + firstName: 'Keyser', + lastName: 'Soze' + age: 145 +} +``` + +and you had this route + +```js +this.get('/authors/:id'); +``` + +The response would look like this: + +``` +GET /authors/1 + +{ + author: { + id: 1, + firstName: 'Keyser', + lastName: 'Soze', + age: 145 + } +} +``` + +Remember, your Mirage server should mimic your backend server. Let's say your backend server returns dasherized object keys instead of camel cased. You can customize the response by extending the base Serializer and overwriting `keyForAttribute`: + +```js +// mirage/serializers/application.js +import { Serializer } from 'ember-cli-mirage'; +import Ember from 'ember'; + +const { dasherize } = Ember.String; + +export default Serializer.extend({ + + keyForAttribute(key) { + return dasherize(key); + } + +}); +``` + +Now, without having to edit your route handler, the response would look like this: + +``` +GET /authors/1 + +{ + author: { + id: 1, + 'first-name': 'Keyser', + 'last-name': 'Soze', + age: 145 + } +} +``` + +Just like in Ember, the `serializers/application.js` file will apply to all your responses. You can also create per-model serializers, for example to include only some attributes: + +```js +// mirage/serializers/author.js +import ApplicationSerializer from './application'; + +export default ApplicationSerializer.extend({ + + attributes: ['firstName'] + +}); +``` + +View the [full Serializer API](../serializers) to learn more about customizing your responses. + + +## Associations + +You can define associations between your models, which makes dealing with related data easier. For example, let's say an author has many posts, and when you delete an author your server also deletes all the related posts. + +We can define the relationship on our author model: + +```js +// mirage/models/author.js +import { Model, hasMany } from 'ember-cli-mirage'; + +export default Model.extend({ + posts: hasMany() +}); +``` + +`hasMany` tells Mirage to manage a `postIds: []` array on our author model. Now, our route handler for deleting an author looks like this: + +```js +this.del('/authors/:id', (schema, request) => { + let author = schema.authors.find(request.params.id); + + author.posts.delete(); + author.delete(); +}); +``` + +A response with DELETE's default status code of 200 would then be returned. + +Associations are also useful in combination with serializers. With the relationship defined above on our `author` model, we can use a shorthand and a custom serializer to sideload an author's related posts: + +```js +// mirage/config.js +this.get('/authors/:id'); + +// mirage/serializers/author.js +import { Serializer } from 'ember-cli-mirage'; + +export default Serializer.extend({ + include: ['posts'] +}); +``` + +Now a request for an author responds with the following: + +``` +GET /authors/1 + +{ + author: { + id: 1, + name: 'Link' + }, + posts: [ + {id: 1, authorId: 1, title: "The Beauty of Hyrule"}, + {id: 2, authorId: 1, title: "Really, I'm an Elf!"}, + {id: 3, authorId: 1, title: "Ganondorf is my Father"} + ] +} +``` + + + +Mirage's database uses camelCase for all model attributes, including foreign keys (e.g. `authorId` in the example above), but you can customize the format that gets sent in the response by overwriting your serializer's `keyForRelatedCollection`. See [the serializer guide](../serializers) for more details. + + +## Dynamic status codes and HTTP headers + +By default, Mirage sets the HTTP code of a response based on the verb being used: + + - `get`, `put` and `del` are 200 + - `post` is 201 + + +Additionally, a header for `Content-Type` is set to `application/json`. + +You can customize both the response code and headers by returning a `Response` in your route handler: + +```js +// app/mirage/config.js +import { Response } from 'ember-cli-mirage'; + +export default function() { + this.post('/authors', function(schema, request) { + let attrs = JSON.parse(request.requestBody).author; + + if (attrs.name) { + return schema.authors.create(attrs); + } else { + return new Response(400, {some: 'header'}, {errors: ['name cannot be blank']}); + } + }); +} +``` + + +## Fully qualified URLs + +Route handlers for paths without a domain (e.g. `this.get('/authors')`) work for requests that target the current domain. To simulate other-origin requests, specify the fully qualified URL for your route handler: + +```js +this.get('https://api.github.com/users/samselikoff/events', () => { + return []; +}); +``` + +--- + +That's the essentials of defining your routes. Next, you'll learn how to seed your database with some starting data, both in development and within tests. diff --git a/tests/dummy/app/templates/docs/writing-your-server/seeding-your-database.md b/tests/dummy/app/templates/docs/writing-your-server/seeding-your-database.md new file mode 100644 index 000000000..23da0062a --- /dev/null +++ b/tests/dummy/app/templates/docs/writing-your-server/seeding-your-database.md @@ -0,0 +1,221 @@ +# Seeding your database + +Once you've defined your server's routes, you'll probably want to seed your database with some initial data. You can use factories or fixtures, or both. + +In general Mirage recommends that you use factories, for a few reasons: + + - they're versatile and give you more control over data creation + - they make your tests more intention-revealing + - they're easier to maintain and change + +First, we'll look at using factories. + +## Defining factories + +If you've never used factories before, think of them as a way to make database records for your models. You define factories by creating files under the `/mirage/factories` directory. The name of the factory, which you reference in your tests, is determined by the filename. + +Factories have attributes which can be strings, numbers, booleans or functions. Let's define a factory for our `author` model: + +```sh +ember g mirage-factory author +``` + +This creates a factory file for us. Let's add some attributes: + +```js +// mirage/factories/author.js +import { Factory } from 'ember-cli-mirage'; + +export default Factory.extend({ + name(i) { + return `Author ${i}`; + }, + age: 20, + admin: false +}); +``` + +Functions take one parameter, the sequence number of the object being created. This lets you create records with dynamic attributes. + +Each time this factory is used to create an object, it will have an autogenerated `id` assigned to it, since it will be inserted into the database. So, the objects created from the example factory above will look like + + {id: 0, name: "Author 0", age: 20, admin: false} + {id: 1, name: "Author 1", age: 20, admin: false} + {id: 2, name: "Author 2", age: 20, admin: false} + +and so on. + + + +Mirage also includes the Faker.js library, which pairs nicely with your factories to make your data more realistic: + +```js +// mirage/factories/author.js +import { Factory, faker } from 'ember-cli-mirage'; + +export default Factory.extend({ + firstName() { + return faker.name.firstName(); + }, + lastName() { + return faker.name.lastName(); + }, + age() { + // list method added by Mirage + return faker.list.random(18, 20, 28, 32, 45, 60)(); + }, +}); +``` + +Once you've defined your factories, you can use them to seed your database via the `server.create` and `server.createList` methods. + +## Using factories in development + +To seed your database in development, use the `mirage/scenarios/default.js` file that was created for you when you installed Mirage. A simple scenario may look like this: + +```js +// mirage/scenarios/default.js +export default function(server) { + server.createList('blog-post', 10); + + let author = server.create('author', {name: 'Zelda'}); + server.createList('blog-post', 20, { author }); +} +``` + +Note that this scenario will be ignored during testing. This is so you can change your development data without affecting your tests. + +## Using factories in testing + +During acceptance testing, Mirage's initializer is run when your Ember app starts up, and you'll have access to a `server` variable within each test. Each test will start with a clean database, so you can use `create` and `createList` to define your data on a per-test basis: + +```js +test('I can view the authors', function() { + server.createList('author', 3); + + visit('/contacts'); + + andThen(function() { + equal( find('p').length, 3 ); + }); +}); +``` + +## Using scenarios in testing + +If you want to run the same scenario in your tests that runs in development, you can import a scenario and run your server through it: + +```js +import defaultScenario from '../../mirage/scenarios/default'; + +test('I can view the authors', function() { + defaultScenario(server); + + visit('/contacts'); + + andThen(function() { + equal( find('p').length, 3 ); + }); +}); +``` + +Learn more about acceptance testing in the [next section](../acceptance-testing). + +## Overriding factory attributes + +`create` and `createList` use the attributes you've defined on your factory to create the model; however, it's often convenient to override these attributes at the time of creation. + +To override attributes, pass in an object as the last argument to `create` or `createList` with the attributes you want to override. For instance, if we had the following factory definition + +```js +// mirage/factories/author.js +import { Factory } from 'ember-cli-mirage'; + +export default Factory.extend({ + age: 20, + admin: false +}); +``` + +then by default authors created from this factory would have an `admin` attribute of `false` and an `age` of 20: + +```js +let author = server.create('author'); +author.admin // false +author.age // 20 +``` + +If we wanted to make an admin, we could do the following: + +```js +let author = server.create('author', { admin: true }); +author.admin // true +author.age // 20 +``` + +We can also override multiple attributes: + +```js +let author = server.create('author', { admin: true, age: 30 }); +author.admin // true +author.age // 30 +``` + +## Relationships with factories + +You can also create related data with factories. Assuming you have the relationships defined on your models, you can pass in related data as an override: + +```js +let author = server.create('author'); +server.createList('post', 10, { author }); +``` + +Now that the foreign keys are set up, your models, shorthand routes and serializers should work as expected. + + +--- + + +## Fixtures + +You can also choose to use fixtures instead of (or in addition to) factories. If you've never used fixtures before, think of a fixture file as a database table. To add data to your `authors` table, for instance, create the file `/mirage/fixtures/authors.js`: + +```js +// /mirage/fixtures/authors.js +export default [ + {id: 1, firstName: 'Link'}, + {id: 2, firstName: 'Zelda'}, + {id: 3, firstName: 'Epona'} +]; +``` + +Fixture filenames are always plural, and export arrays of POJOs. During development, this data will be added to Mirage's database and will be available in route handlers via `db.authors`. + +Use the `server.loadFixtures()` API to load some or all of your fixture files in development (by calling it from `scenario/default.js`) or from within a test. [See the guide](../configuration/#loadFixtures) for more info. + +## Relationships with fixtures + +To create related data, you'll need to manage the foreign keys yourself. Let's look at an example. + +Suppose an `author` has many `blogPosts`, and each `blogPost` belongs to an `author`. Your fixture data may look like this: + +```js +// /mirage/fixtures/authors.js +export default [ + { id: 1, firstName: 'Link', blogPostIds: [ 1, 2 ] }, + { id: 2, firstName: 'Zelda', blogPostIds: [ 3 ] } +]; + +// /mirage/fixtures/blog-posts.js +export default [ + { id: 1, title: 'Lorem', authorId: 1 }, + { id: 2, title: 'Ipsum', authorId: 1 }, + { id: 3, title: 'Dolor', authorId: 2 } +]; +``` + +--- + +You should now know how to seed your database with data, both during development and testing! Let's wrap up with a look at how to use your shiny new client-side server to write some acceptance tests for your Ember app. diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs new file mode 100644 index 000000000..fb1bd92f9 --- /dev/null +++ b/tests/dummy/app/templates/index.hbs @@ -0,0 +1,4 @@ +{{docs-hero + logo='ember-cli' + strongHeading='Mirage' + byline='A client-side server to help you build, test and demo your app'}} diff --git a/tests/dummy/app/templates/not-found.hbs b/tests/dummy/app/templates/not-found.hbs new file mode 100644 index 000000000..3ee9dbcf9 --- /dev/null +++ b/tests/dummy/app/templates/not-found.hbs @@ -0,0 +1,4 @@ +
+

Not found

+

This page doesn't exist. {{#link-to 'index'}}Head home?{{/link-to}}

+
diff --git a/tests/dummy/mirage/config.js b/tests/dummy/mirage/config.js index 474c1f81f..81b0f015f 100644 --- a/tests/dummy/mirage/config.js +++ b/tests/dummy/mirage/config.js @@ -3,43 +3,44 @@ import { isBlank } from '@ember/utils'; import Mirage from 'ember-cli-mirage'; export default function() { - this.namespace = '/api'; - - // Contacts - this.get('/contacts'); - // this.get('/contacts', ['contacts', 'addresses']); - this.get('/contacts/:id'); - this.post('/contacts'); - this.put('/contacts/:id'); - this.del('/contacts/:id'); - - // Friends - this.get('/friends', { coalesce: true }); - - // Pets - this.get('/pets', function({ db }) { - return { pets: db.pets.filter((pet) => pet.alive) }; - }); - - this.post('/pets', function({ db }, req) { - let { pet } = JSON.parse(req.requestBody); - if (isBlank(pet.name)) { - let body = { errors: { name: ["can't be blank"] } }; - return new Mirage.Response(422, { some: 'header' }, body); - } else { - return { pet: db.pets.insert(pet) }; - } - }); - - this.put('/pets/:id', function({ db }, req) { - let { pet } = JSON.parse(req.requestBody); - db.pets.update(pet.id, pet); - return pet; - }); - - this.delete('/pets/:id', function() { }, 200); - - this.get('/word-smiths/:id'); + this.passthrough(); + // this.namespace = '/api'; + // + // // Contacts + // this.get('/contacts'); + // // this.get('/contacts', ['contacts', 'addresses']); + // this.get('/contacts/:id'); + // this.post('/contacts'); + // this.put('/contacts/:id'); + // this.del('/contacts/:id'); + // + // // Friends + // this.get('/friends', { coalesce: true }); + // + // // Pets + // this.get('/pets', function({ db }) { + // return { pets: db.pets.filter((pet) => pet.alive) }; + // }); + // + // this.post('/pets', function({ db }, req) { + // let { pet } = JSON.parse(req.requestBody); + // if (isBlank(pet.name)) { + // let body = { errors: { name: ["can't be blank"] } }; + // return new Mirage.Response(422, { some: 'header' }, body); + // } else { + // return { pet: db.pets.insert(pet) }; + // } + // }); + // + // this.put('/pets/:id', function({ db }, req) { + // let { pet } = JSON.parse(req.requestBody); + // db.pets.update(pet.id, pet); + // return pet; + // }); + // + // this.delete('/pets/:id', function() { }, 200); + // + // this.get('/word-smiths/:id'); } diff --git a/tests/dummy/public/assets/Ember-CLI-Mirage-Logo-Horiz-Color.svg b/tests/dummy/public/assets/Ember-CLI-Mirage-Logo-Horiz-Color.svg new file mode 100644 index 000000000..3c3ac1503 --- /dev/null +++ b/tests/dummy/public/assets/Ember-CLI-Mirage-Logo-Horiz-Color.svg @@ -0,0 +1,58 @@ + + + + + + + + diff --git a/tests/dummy/public/assets/branding/Ember-CLI-Mirage-Branding-Preview.png b/tests/dummy/public/assets/branding/Ember-CLI-Mirage-Branding-Preview.png new file mode 100644 index 0000000000000000000000000000000000000000..536635201d5ca66e92df82796135cdfcf0a1c374 GIT binary patch literal 65405 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%0D=hnt;lZyj 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/OCGs[5 0 R 35 0 R 60 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Ember-CLI-Mirage-Logo-Horiz-Black + + + 2017-04-12T20:08:31-05:00 + 2017-04-12T20:08:31-05:00 + 2017-04-12T20:05:39-05:00 + Adobe Illustrator CC 2017 (Macintosh) + + + + 256 + 80 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAUAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FWD/AJua1590ryvczeUtKi1CQwT/AFudpeMtuoX+8ihoPVahYgBuo6HFWJ/842az59vPJthbatpk SeXreGRNM1ZpqTyqklFT0KNVV+IByV2A69cUl7Jih2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KsW/MX8wdL8kaGuoXcUl5d3Mi22m6bB/fXM7/ZRdjQeJp95IBVYZ/ij/AJyO FoNWPlXR2s6eodHE8v6Q9Olac/U9LnTtxr/k1xSzb8vvPuledtAGq2Mb200UjW+oWE20tvcIBzif YV61B7jwNQFDJsVfO35X/lgn5ieUYfNvmHzPrw1TUJ7j1VtbxI4gI5WQBVeKSnToDTwGKWWf9C1+ W/8AqaPMv/SfF/1QxQ7/AKFr8t/9TR5l/wCk+L/qhirv+ha/Lf8A1NHmX/pPi/6oYqhPyts7zy3+ bHmjyKmqXmqaDb2FveQJqUonkWSQR86GirRvVNaKK7VxS9g07TrDTbGCwsIEtbK2QR29vEoVEReg AGKERirsVdirx3/nJvzb5k8s+U9Ku9B1CXT7ma/EUssJALJ6MjcTUHuBikMJ0Tyn/wA5Paxo1hq9 p5rjFpqNtFd24kuSr+nOgkTkBCaHi2++KvR7JPzD8rfk35ln816n9b8x21tfT2l9C/qGMfV6QEMV j3SQV6YoSL/nG383L7zVY3fl/wAwXZuddsa3FvcSU5z2zGjVpSrROafIjwOKS9K/MTzrYeS/KN/r 93xZrdONpATT1rh9oohTfdutOi1PbFDzb/nGTzz5p82WfmObzBfvfPbzwG350AjEqyFlUACi/CNs Ul5v5X1v88PPHnLW9F0DzY1odPeeWl3IyRiJZ/TCqY4pTUch2xVNLrz5+dn5W+ctLsPOOox63peo srMoIkR4ywST0pWjilR461oRT2OKsp/5yk87+bPK/wDhn/D+pzad9c+vfWfRIHP0vq/CtQfs82+/ FQlMHkP/AJymmhjmTzZDwkUOtbpq0YVH+6MVZR56v/zD8ofkCZ9T1Zj5utZUW51KB+ZIlvTxAYqt f3LKv2cVYD5V0r/nJTzN5QtfNWj+a1mtroStBZPOUuCYJXiIIeH0t2jNKyYqzn8gvzj17zTfX/lX zUgGv6ajSrc8BE0iROIpUljACiRHYfZAqO226r2skAEk0A3JOKHzJ5k/OL8zPzD82T+WvyxVrbTo C3+mxcVlljQ8TPJNJtDGT9kCjfMmmKUT/gf/AJyp0O4try28wjVCzoskP1o3CIGYA+pHdIilR+1w qadMVR3/ADkN5587eW/Mnlez0zV5bQXNuDfC2ASOWQSqrNxbmQD2FcVD6ExQ8H/5yk87+bPK/wDh n/D+pzad9c+vfWfRIHP0vq/CtQfs82+/FIRP5f2XmP8ANDzHpP5k61dwQ6BpF1djQtASPk6/D6Qk llqPjDqr9912oDir2/FDxX8zfy/vfKaa/wDmP5S8w3Wj6gHXUL7TCymwuGWiurR0HJnJJHLl8R2p XZS9Y8s6s2s+XNK1d4vQbUrO3u2hP7BniWQr/seVMUPDPy/8na55v/5xss9F0XURpt9LdTyCRmdI 5FS5cmKRowzBW67A7jFLKfM35RedNT/KHSPJ1t5hH6Y06RHubyV5ViuEUyUhZ0DScIxIvCoP2RUe Cr0bylpN9o/lnS9Kv7xtQvbK2jhuL16kyOigFqnc/Tv44oTbFXkXlr/1pbzd/wBsa1/Vb4peu4od irsVdirwf/nL/wD5QjRv+2mP+oeTFIYx5W8jf85J3PljSLnSPM0VvpM1lbyafAbllMdu8SmFCPRa nFCBSuKvT/NFt5j0v/nH/V7bzRci91yPTLmO9uUbmHeRmCHkQlaKy9sUPm3y1pGveUvLOgfmtozN J9W1GW1v4eiqooqhqVPCZS8bHtt3OKXoHmTX5Pz1/MrRvLukGWPyjp0a3l85HFqMqtO7Dsw5CBOt GqehxVMf+cNpWMPm2E04I1g48auLgH/iAxUvPfy60v8AMfUfzD8yReQ9Ri03UUa4a6lmKgNB9ZA4 jlHLvzoemKo/zjZ+fPJ3n7y95j/NRP8AEdqsga29KcGP9wysQqhUAKFw/AqFc9T1xVln/OYVxDc2 /ku4hbnDMl/JG47qwtSD9xxUIi1/L/8A5yja1haHzVCsLIpjX602ykCg/uPDFWYfn/DqEH5DSw6l IJtRiTT0vJQah5lljEjVoK1ap6Yq8n/L3/nJWPyZ5AsfLUOgm8vLET8Lp7gRxs01xJMCUEbNRfUp TlvTtitMr/5xm8peYtQ8y6v+ZWsKIotVFwttQAevNcziWeVVB+FEZCor1r7YqXunnWK8m8m69FZA m8k067S2C1J9VoHCUpv9qmKHhP8Azh3c6YLTzLbAoNUaS2lZT9trcB1BHiFcmvhUeIxSX0fih8w/ 85X/APKbeVP+MJ/6iBikPp7FD5r/AOcyv+mQ/wC3j/2K4pD1zyx+U+leV/NV1rWh6lfWlhemWS58 viQNYGaWn7xYytVpTbevYHj8OKEb598kaj5phs0svMup+XTas7O2mSmL1eYApJxKseNNvip12xVh 8f8Azj5BeSxL5n83675i06J1lOmXl05gdl6cwWc/8DQ++KvWYooookiiRY4o1CxxqAqqqigAA2AA xV4t+SOhX2ufkNp+nWWr3WiTyXFwwv7LiJQFunJUFhsG70IP0VGKU4/5U15s/wDLla//AMjB/wA1 Yod/yprzZ/5crX/+Rg/5qxVPPJ35ea9oGr/Xr3zlquuQGNozY3rK0RLUo2/IgrTalPu2xVjPlr/1 pbzd/wBsa1/Vb4pZt+Yvnuw8k+WpNYuYXu53kS20+wi2kuLmWvCJTRqdCSaHYdCdsUMGN9/zkyLP 9OfU9C4cfV/w3+++scKV4epXj6tP+LKV+7FKd+VPz4/L7WtNs5b/AFKDRNVnJiudKvZAkkMytxZG Zgq0r9ljTbwNRih6IrKyhlIKkVBG4IOKvKf+cifIPmfzr5Y02w8vW63NzbXvryo8iRAR+k6VrIVB 3YYpDAtM0L/nLrS9NtNMsbmGGysYY7a1i/3FNwihQIi8mRmNFUCpNcVZvB5f/N3Wvyd8yaN5v4Xn mm+eSLT0VrSNTblIeALQCOIUcSHff8MVRP5V/lhe2X5R3HkzzdarG169yLiFHSSiSkFHVkLDkpHI eBGKE7/Kv8pNC/LuxvIbCaS8ur+RXuLyZVV+CCiRgLsFUlj8z8sVYX/zjf8Aln508jzeYB5is47a LUVtDbsk0cpLQGbkP3bNTaXviksG0X8rf+cgPKvmrV9Z8sWlvA+oSTKZJJrSTlC83qD4ZGNOgxVH Xn5Mfnd+YWtWUv5halBa6bZEgKjQsyoxBcQxW6+nzen2nP30AxVlP/ORP5VeavN9v5Yt/K1mk8Ok pdxzI8scXBZBbiID1GWu0R6YqEhisP8AnMOKJIo7yEIihUFNJNABQdY8VZV5m8o/mn5n/I6XQ9cV LzzlPOjyrztolMcd0HX4ouEO0QxVNPJP5V+r+Sll5G832qpcKlyJVRkkaGSS6mlilideS81WQEfc e4xQwr8rfy9/O78v/NsWjwtFeeSZ7n1L64WSAx8KU9RIpGWeNyAAwUEfOlcUvoTFD5288/8AOPPm zS/NL+avyxvhZzSO0psPV9CSJ3NXWFz+7aNq7o5AHTcdFKETy/8A85da1PBbajqP6NgjkSQXBmsI VBRgw5/UQ0jrtupBBxVO/wA//wArPzA84avoF9oVtDcyWFqUupfVjhUTcw3wrK1affioS36p/wA5 j/8ALbD92k/9U8VVvze/LD81fO3lbyWstvHe6/p0N5+m3MtvCBLMYeFOJSM1ER+wMVfQuKHYq7FU BLr2kRa5BoUlyq6tcwSXUFrRuTQxMqO9acdi42rX7jirzCX8lvMMH5Lx+Q9N1xYdSjnadr0CSGGV WmaQxPx5uFow8dxild5k/KLzlqf5RaP5Ot/MVNX0+RHur2VpVjuEUyUhZlBk4xiReFR+yKjwVeje UtJvtH8s6XpV/eNqF7ZW0cNxevUmR0UAtU7n6d/HFCbYq8i8tf8ArS3m7/tjWv6rfFKY/nho2tXF p5a17SbCXVpPLesW+oXOmW6mSWWFT8RjQVLOpApTxr2xQ9Fvb+xsLZ7q+uIrW1jp6k87rHGtTQVZ iAKk0xV5d5zh/wCcfYtA1y7vv0HJJfJLNcS2728l5JO4LAxFCZfULbjj3+nFKd/kSusL+U3l1dXD i6EDemJK8/q/qv8AV617ejw4+1MUM9xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KvEtb/IPVL781bbX4/MOrJpTwzSz3q3lL23m5nhbW8pHJIWWQ0AU0AIruMUvUvNfluDXv L8mlT6nfaZCeDPfWE4t7gCMg/wB6VYUanxbYoYI/5CaQkfqv5281LGBUudUQLQ+/o4qv/wChftN/ 6nPzX/3E0/6o4qnnk78qrTyvq/6Sh8x69qbGNoja6lei4tyGoeXARp8Qpsa4qxny1/60t5u/7Y1r +q3xS9dxQkXnVvJn6Amj84PZrorkeqt8yrGzKeSgciKtUbcd8VeMRecP+cX7K/V9L8vjUpYnULJb afLMgYnY8Z+Naf6vyxS+go2V41dQQrAFQwKkAjupAI+RxQ88/Pvzb5g8qfl7Pq2g3X1PUFuYIln9 OOWiux5DjKrpvTwxVB/kD+ak/nryxJFqsyyeYtMfhfMFRPVjckxTBECqK7q1B1Hvir1HFXgX/OQ/ 54615X1W08ueU7xbbU4gLjVLoRxTFA4/dQcZVkUEg822rTj4nFL1fStcvrv8tLPXTKTfXGjR3xnK qCZXtRLz4AcPtGtKUxQ8a/5xz/Nn8wPOHne+0zzFqv16yh0yW5ji+r20NJVuIEDcoY42+zIwpWmK S7/nIz82fzA8n+d7HTPLuq/UbKbTIrmSL6vbTVla4nQtymjkb7MailaYqGJSfmN/zlRb2a6jLHqD WIUSmX9FW5j9MjlyJS32WnfFWf8A5Lf85HTeZ9Xh8t+aYIoNTufhsL+AFIpnAr6ciEng7AfCQaE7 UBpVWntHmPzBpfl3Q73W9Ul9KwsIzLO43JA2CqNqszEKo7k4ofK2pfn/APnH5z1x7TyZBJZwVLQW Nhbrcz+mDTlNI6SeO5AVcUqY/O78+PJGrRR+ao5ZopPi+palbJEJEBoxiljSNvpBIHhir6f8iedN K85+WLPX9NqsNyCJYGNXhmQ0kib3U9+4oe+KGFfnL+eumeQAumWUK6j5jnj9RLZmIhgRtlecrvv2 QUJHcbVVeH2n5q/85H+aXe80Q301qCQBp9gjQJ/k8/Sf/hnJxSn/AJD/ADg/Pe386aZ5Z1yye+m1 CZY/qmpWv1OZYuskiyIkZ4otWLMrbDFXsH5+ebfMHlX8vZtX0G6+p6gtzBGs/pxy/A7EMOMqyLv8 sUPAtC/NT/nJnX7R7zRLi81G1jkMLz22m2ciCRVDFCVt+oVwfpxSmX+Mf+ct/wDln1P/ALhVr/2T 4q+kPOHn7yj5PtEufMOox2Syhvq8Rq8svCnL040DO1OQqaUFd8UMGT88Nf1gc/KHkHV9XtmB9O9u uNhA/ujsJVYfTXFVU+ePz5Ar/wAq1h/7i9n/AM1Yqtb86/Mel/F5o/L3WdNgH27iz4ahEg8WdREo GKoXzV5h/L/84/KcnlnRPNUWn6hPLFIkE6tFK7RmvpNDIYjID1+Amhoe2KVfzD+Rlzqv5UaP5FTX pEm0iRZfrzxlkmoZP3bRhwQi+r8HxGnEYoeh+UtCby/5Z0vRGunvW062jtjdSCjSGNQOVKtQeAqa DviqbYq8i8tf+tLebv8AtjWv6rfFKY+dfzhMGrf4T8jWf+I/N8lVeOM1tLOmxe5lBC/Ceq8hT9og 0BUIby9+R0N5err/AOZF6fNXmF9xBLX9H24P7EUFFVh/rLx/ye+KvULWztLOBbe0gjt7dBRIYlCI o9lUADFVXFXjn/OVsrp+VqqpoJNRt1f5BZG/WoxSHzf+WnmzV/IHmfSfMxif9F3nOK4UfZntg/Cd R/loQGAPenY4q+yvOv5haL5a8jT+bPVS5tTCsmnBTtcyTCsCoR2etSey1PbFD4V11td1Jm8z6pyk Os3Vz/pTf7smi9N5go8F9dKdu3bFk+2fKcqS/kfpTJ0HlyFDXxSyCn8RixeAf84if+TJ1L/tjT/9 RVtiku/5y7/8mTpv/bGg/wCoq5xUPqTy7LFF5W0uWV1jjSxgZ3YgKAIlqST0xQ+NNen03Ufz99by nwa2m1y2Ni8A/dtKJY+bpTbiZQzAjam+KXvH/OWV7cW/5YW8MTcUvNUt4Jx/MgimmA/4OJTioW/8 4oaPY2v5cz6lHGBe6heyi4mp8RSABI0r/KtWI9ycVLIf+ciNDs9V/KfWXmjVp9PWO8tJD1R45FDF TQ/ajZl+nFDA/wDnDu8nfQPMdmzfuIbqCaNfB5Y2Vz9IiXFJeSeTtPX8z/zrT9KuXtdVvZ7y7FSC beINKIQeoBRBGPAYq+27S0tLO1itbSFLe1gUJDBEoREUbBVVaAAYoQWqa55c02aEarqFnZTkFrf6 1NFE9PssU9Qg+xpirzL/AJyflim/KKWaF1kiku7R45EIZWViSGUjYgjFQ8j/ACQ/Pfy7+X/lS70b UtPvLue4v5LxZLb0uAR4YYwp5uprWI4pes+Uv+cm/KfmbzJp+g2mlX8NzqEohillEPBSQTVuMhPb wxWnqd95f0HUL62v7/Tra7vbKv1O5nhSSSLl19N2BK9O2KEfirsVdirFfN35XeQ/Nqsdb0eCa4Yf 72xj0bkHsfWj4uaeDEjFWEnyR+bnkYmTyVrf+JtFTf8Aw/rbVnVQfswXPwjp0BKL7HFKpaf85KeS 7fnaearO+8t61AeNzp9zBJLRvFHjWrL4EquK0qS/85J+RZz6WgWeqeYLwj4Laws3Lcj0B58D9wOK KYnafl1+aXnfzpqvmm9aTyLpeswxWl1bRyiW/ktolUcFKhfT5+n8Rbif8kjFL2TyX5D8r+TNKGm6 DZrbxmhnnb4p5mH7UsnVj+A7AYoZBirsVdirxL/nLiV0/LSwVTQSavAr/IW9w361GKQxTyz+XQ87 f840WUFtHz1rTZry70sgfEzrO/OEf8ZVFP8AW4ntirx7TdS86edYvLn5fRTNPb2tw6adA1fgMxqz SHqVhUMRX7K1pir03/nJzyxpvlfy35A0HTlpa2EWoRqxADO3+il5Gp+07ksfc4qHtPkSRJPyI0xk NQNCKk+627KevuMUPCf+cRP/ACZOpf8AbGn/AOoq2xSXf85d/wDkydN/7Y0H/UVc4qGO+bfye/NP SPKEfmDUpxf6Ksccrxw3MkxiikAKs0bhaKKivGtPlirM/wDnFHS/IdzrdxeXkrP5vtAx0+1m4iIQ stHlh7tIKkNXoDsOpCpZz/zl3/5LbTf+2zB/1C3OKh4x+Xn5bfnF5g8tpqPlXUZLbSWlkRYkv5LY eopo59NSB9OKo/zb+VH56aV5b1DUdc1SWbSLaIveRNqMkwaOo2MZNG+WKs8/5w5/45vmj/jNaf8A EZcVLytZL78ofzqM00DNb6ZdyFEFB61hcBlDJ0WphfbsGFO2Kvsry15r8veZtNj1HQ7+K+tZADWN gWQn9mRPtI3swrih80/85f3FvJ5p0KKOVHlis5BKisCyVl25AdK++KQzL86//WcNG/4w6V/yZXFU g/5xt/LDyH5q8jX2o+YNJjv7yLU5beOZ3lUiJbeBwtEdR9qRjipex6P+TH5Y6NqdvqmmaFFbX9o/ qW86yTkow2qA0hH3jFDNcVdirsVdirsVdiqQ+bvIvlTzdYGy8wadFeIBSKUjjNEfGOVaOn0Gh74q 84HlX82/y3Tl5SvP8YeV4vs+X9QbjewRD9m3mGzUA6fdGcUsm8ofnb5I8xXP6NmmfRNeQ8JtH1Rf q0yydOCl6K59geXsMUM/xV2KuxVQXULBr17BbmJr6NBLJah1Mqxk0DlK8gpPemKsB/PD8ttZ/MDy zZaPpl3b2jW96t3K1zz4kJFJGAOCua/vcVTT8pPJN/5K8jWfl6/niubm2kmd5YOXpkSys4pzCnYN 4YqjdI/LjyRo/mC48w6bpENtrF16hmu0LkkzNykopYovI/ygYqw/89vyj1f8xLfRo9Mu7W0k0152 ke657rMIxRSiv/vvfFWUeVfJ99o/5a2vlSeaKS8gsJLNp05ekXdWAYVAanxeGKvPfyQ/IjzF+X/m u71nUtQs7uC4sJLNY7b1eYd5oZAx5ogpSI4pd+d/5EeYvzA812ms6bqFnaQW9hHZtHc+rzLpNNIW HBHFKSjFXr9hpccWhW2lXipcRpapa3CMOUcgEYjcEMN1bwOKHzn5v/5xP1yLW3vvJOpwQ2TP6kNt dySxTW9T9lJUWTmq9iaGnidyptn/AJ7/ACg8y+Z/yn8u+URqFsur6VJbS3l3M0rxSNDbywvxbgXa rS1BZRirJfyd8h6j5H8lxaDqFxDc3KTzTGW35cKSEED4wp/DFCbfmD5buvM3kvV9BtJUhudQgMMU steCkkGrcQTTbwxVhv5E/lNrX5d2msQ6peW122oyQPEbb1KKIg4PLmqdeeKp9+Zf5TeV/wAwLBIt URrfULcEWepwUE0dd+Jrs6V/ZP0UxV4Hff8AOJX5gWlyW0jWdPniBokrvPbS0PcqscoH/B4ptNfK /wDziBf/AFlJPNOtwrbKavbaaHdnHh60yx8P+RbYrb1380vy1uPNH5dxeUtFmisxbtbC3a5LlFit hxCkqHYniMUPDv8AoUHzv/1edM++4/6pYpt3/QoPnf8A6vOmffcf9UsVt9YYodirsVdirsVdirsV dirHfN35e+TfN1v6PmDS4bxlFI7ihSdP9SZOLge1aYqwRfyk/MPyzQeQvO06WSbR6PrSC6gVf5Ul 4sUX2WP6cVVk1z/nJG0PpXHlvRNSoKevbXTQAnxIlkr/AMLiqlJZf85HeYl9C6u9H8o2b/DLNaB7 q8Cnrx5GSOvydT74qyn8vvys0DyYbi7gln1HXL8f7kdZvHMk81TyI8FXlvTr4k4qzPFXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX//Z + + + + uuid:c3e88660-02ef-0945-ae6f-c6951e7bc3be + xmp.did:3d58b951-e27c-4e2b-bf80-af2ab47a27db + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + xmp.iid:61f0ef3b-ecb7-4f78-a77f-08f867147dc3 + xmp.did:61f0ef3b-ecb7-4f78-a77f-08f867147dc3 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:48fef565-7731-4c49-bee9-dfbb0bfe5fa3 + 2017-02-28T19:39:58-06:00 + Adobe Illustrator CC 2015 (Macintosh) + / + + + saved + xmp.iid:3d58b951-e27c-4e2b-bf80-af2ab47a27db + 2017-04-12T20:05:38-05:00 + Adobe Illustrator CC 2017 (Macintosh) + / + + + + Document + Print + False + False + 1 + + 550.000000 + 175.000000 + Points + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + + + + Mirage RGB + 1 + + + + R=39 G=50 B=73 + RGB + PROCESS + 39 + 50 + 73 + + + R=110 G=116 B=125 + RGB + PROCESS + 110 + 116 + 125 + + + R=54 G=181 B=192 + RGB + PROCESS + 54 + 181 + 192 + + + R=112 G=201 B=203 + RGB + PROCESS + 112 + 201 + 203 + + + R=255 G=147 B=67 + RGB + PROCESS + 255 + 147 + 67 + + + R=254 G=201 B=78 + RGB + PROCESS + 254 + 201 + 78 + + + R=214 G=237 B=162 + RGB + PROCESS + 214 + 237 + 162 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 64 + 64 + 65 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 112 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 129 + 132 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 146 + 148 + 151 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 166 + 168 + 171 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 187 + 189 + 191 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 208 + 210 + 211 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 241 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 236 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 241 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 221 + 21 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 34 + 64 + 153 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 151 + + + + + + + Adobe PDF library 15.00 + 21.0.2 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 66 0 R/TrimBox[0.0 0.0 550.0 175.0]/Type/Page>> endobj 62 0 obj <>stream +H‰lWIŽd» Ü×)Þòµ(jܺ xexá…P0Ü‹ú¾ûþ€#HM™Yh :”8“úñŸ×¿ÿ ×_þúóúøó#\Ró•s¸üñ¿üëúïÇŸÿ ×çï+Ü¢•c´¿ùº~âóßðù?¿?þ¼ä +ø'Wê᮹õ+…;äØ®Ï?>ø…%Þ-__1Þ9¤W2ÊÝd8~iº¥O¾s~%“Þ1V wLýx´»·âµÆ7:àç¯Gìwïý’;¦wÊ°S«\«´ëîð¡ý.9Mòóã‘úU×÷\¡ZºÊ]pѤ¤Þ¡)¹ëp&d{PÚ¥’ììÜd’Ÿ¦ˆÖ²¾Cªw°Ë]4‹¸$×KáqØ +vxR"Øa%4†bBc! ÖÃN^7µå"°’Ê•;Ëþ^Ú-5]PB6µM@¼C ¥.ûîI#N~šUe}ŠC+Äà\°E8Û¼‹8»¼-¸)#F@ØZ½%Ô ¬Îüc ADŠ½ÒyŠÞoè7¨O¦H½µ-ä!"wèmI/Ú§Ä@i(‘J ¥j¹;ÒAÙL¥°Ro +½wKÞqÏ°E5¢©~ƒŒ‹ ܪÄBë+¼îý–ïÒW:L½§ô³]ô%Ä 9¦%ÒÒ‰ !SFºIªwÑHGE%ƒµ/šg”z©ùÚ\ŠL'¡Œo§:°.„ ]ãU-^‚zQæš  +ª) + ýéˆÑA7É\-b´Xª/¤ß¡ˆ;·ß -ˆh¾ì’È61ò[X³ÚŽTî&ys øhT}•3J zŠ§k8!èý° +­T³#°F­{Z]‚Hô|"hKÃì"OW¡Ý<ßÚû1´~Í©ÄΙ£´ûXÀ$…#PÁ©_Ój§ +T+“þšô<À¢ 5¾C +ª¨²OŒ3ýËÆNC£ÀBvwã+ªk",M²7›Oìæ¾ïP8Èh߈ø‘}Í}ÍÓ2J½ØðÒ¤¦˜MYx!÷Ir¬æÛ.ôÏnD´q_Ãð™$gã@…Z¾ ³QJ_‡’ê]óûЭpü–k*_‘ßjù ó2¬¨ˆ ­4^‡ì8Ã7 B„nÃyƒ¤%hÞ²€Ú€"*.³!ì$M)vÙ:»¿ÍÑ^âvüKhض‘Œ˜”=Þ=Zž@õ½m12 ›‰Lo§ Ý ²¯ úkѪ6vÁ_¨Þ¤ÇiNÏ«êCáEœ^Q^ÐÿeÏWô§ŒÍm$ÃAaC,jiLMßgXTsQîiEõØ+’a¹%”O]ߺ¶ÚÌŽ¨PÔcm‡'°]± +ãÁlîí;ä(/8,ô~" ®mé¨j,eB±½mÒ‡×àZÀ~É´ÃÀhŒ<Ò ÿ ²§æìì ŒY¢˜{dgZ.§>…`l1e7?|@ +Æán# cðɶÑ÷ŽÐ‘¥œRïÓKSš»LãJü´›wXïèðþ°äl]œ’ÚÌÌ%³›iÒ>›ˆeŒò•Rº[˜>?O§bÈLê–,׃¶aíÂùÚȸuèæŸHÑ=“¶„ؼføòDl/`ïBvplËÚ˜¶Ar¨òwoåþ!3©÷ÚNh;Ne:“Ê1ñj9>3*8>¶ç@e¶Ù Ï­FÞ‡æ¶?TX÷n¿ £l.¶3´Žö_=H¯t-nDB:xã ÕÖ)ôMV – Ú w/D¬oØ…3ì{õ€í%_1Ÿ>iœO- +h~*xÒŸò™Ó?1edí":éy2㠨ϖ„šûb¤Öú‚0þÜvÆe\Ò1¯<4†`Á‚§7ýþqKýòª–vt†Èܪýè Ù}€ûQÄŠúŽì>0¥Þ‘£ ðúnæmø÷Žvœ}!ÂóÍ·UÄÆb©k,woe$lÁ +iÙVM·‡–„øÛC FkžZPw\Q9lZðìå;,xóÅ^kK}€sÕ m;`¤"Áœï$²×I²ãQ×WìÙ­¡ÃúúŒêÁe\ [8).¬%“ÓˆsëŽPëÈêÊ¡ëkYkÖ1‰p£EîVxZGÍæ»~ˈ!Ù^¶öA>cÈB±¢ßP`®º¨R ’8’à e©Â¶]|@‰ßÂsÌâîF@A‘Á¬dÑàs…&ÐÀ4E[ãùܨÃIÁÈTÛþ7„ú¤iŠ0Dl‹ nbRÖpÓÂO_:ú⮆zh[*1]ö©“ô{m·#€ùü2hø p·ƒ (=Òü:úWR&M/”ã{x’ûìÁ-§ÑPÛº`r§²4ÒP~Ù—¦ÉÛ iš¬h½QãSôI÷å8xËî !5½[¾‘|œY±ñbq~Û¸T˜ˆ„Å Ž ©‡ñ¤Bšóz,r |Ц87€‚ôÐÇ÷†ì¤¶”ÆÅØ}§Àå\˜æDeè„_ª­Û|B4fÊÝ÷íîH±c {¿²Ìò”è¦"KzH(TEt×™ÒŽÜWN§«ø€/FÖMpå°F RVo#d}¤UÚã ƒ)…¾E³#ß6ön*äT¾'¥,€ÅÊ•ßÞ¥„ÄË5aâñÓi[ä«ÃÛ”¹>*!¨Àã@[7ÄÅ™õG™À— + þ|T3yÔ·vW‹;€œäzk·£j(ÁÁÒm¼(…@~B`mÅóD¸Ûë&Vó~1!7g‰Á× S˜m\«.ÀdÔ³ƒ'¾ßºà-§mmégæÁ(„(µ¬'~ žVå ¼…‚v±^Ç)íõ¦¶nZÚLž©oœOÅ${œ6á‚(&4gšMç `8ܼyòë)ùý¦üªÍŒõÔwåö ³æàzÆ3=³€í½M¯SòëM+N {Uƒ÷ ;V… Q°™‚4¿$ÞÃw3~vÚŽ€±rrDoSh±l㌴I ½S4Dá.ºÊ%Ķ„A›D°6µ8ØÖÎ&½ïÈÒ®Dì–’pAý4ƒÚN¸“ÓtG™À@`~¨×> ½\‘ö®Ãb*o<‹Æª§XÐS!Çp¢º5hs”»rsÄ—âë™ZÌp¦—€o3fJ,Ž‘1ÓÏ9eƒ¢ÙàÃÚåͲŒ;)WlG8ĹA"9:;† ;õ¢“}·S‚9ISçe0®([ ¢ úDx)f\Áºdp{ÇDFïÏý ›Ø ãA°Çäx%¾2烞—jyâ¨ØNŒŽƒÆ"—D u"nHp‰!Çqò‡œ PIw„˜|®Íi”Ó +ð6èæ± ;vOÀ9‚Ó'¸8÷]ÂÎ4›¹h—€Óvo'¨ßæ[EÑ-"ƒùP°ªLWl•i„Ûc¯Lk\f—ÂëTëIÖcHN>ÉçkÊ ÚH#êbÚ.¾sº@h]~&c"æã³<íJÑy)f“8ÿGOÊJúfAŒ|ÞŽÂV_…5NøÖ¶3ì/€]@“‡?[ÓË +½E\PŠw´=#^1*ñž½½óàà3ýÙBlcp/EÇÏæÁº-›A 9]hØÆØÚ« :ÞÔ'Â|Ã#löö|p½Ðι t® šœÑLؾµ`D°²Ñà Wœfå#ßã² } 4îs~)‚g¾‹]ÁqeG·0!ïE?ÈKctÁ +`9Úg<‚"À…x«")ppbœuûÓ‰79FŒâ ëÓA ¾õ@@Á ~Pr…cD¤èPäeÒ’A‰Œ#f\Cí`Š‘nxÈ oÏ*èÑ,‚‰"þf´gø>0Î:÷7Ñ.£ô!O°]`˜Øí=´h´ÅØ^Ü=¤©›s»C´û1<ïâpy<®%CÚO /ûŽ—ô(âÄ(, =5莞ËŽž·6¼ŠvØ’i˜môEfg‘»«Áa¾ØRÁ°á´ +'rÝ©N !˜mœàLÙƒ»AŸ‘2VAÃÂ|=gG€_Ùßöª©‡ÀÝnh#ÊÑS0é­®Å0…Š(Ó‰/ÅW×ã¤Çº‘¡Ý}o.”Áˆ¨<ˆúô¹(Ô€h׳Q¤uþa”•Ñq‡KˆC÷Úgi¸P™÷Swˆv‰°¢NÈÊ¥áå[×A¨¶9– YÕ‘ C[ZVãÅhm›_ï|¶ +­üJºüJNZ% ËjÝQ~¥y"”‚·[¾ŒOâÙó…”Þ*_1þf3–¢·|Õ‰ÈFiwlùb¿zFåk´ÀZy‡è-_u"¬, /?*_åX2dUFjY­Xn~)Úu"²±üJºügY% ËjÝQ~¥yBF¦‚·[äÐM®Ù#_ÁA+V¡|0ËýI+”¢·PÖ‰ÝR¤nØj„Øø™UǬ‚Üêaý—ÉKü傇-ÂßùÔ °. Io‚“>H~¹¨ *÷<¡@K^TéO† Héeßn¿´s¬™[8d€P N1@‰{>stream +8;X^Go<`K@!)p.T(k=$9iqt"o^6F[%GYUO`)H0es6gqZBao\ +o;FP/LtaS,O0,8 endstream endobj 67 0 obj [/Indexed/DeviceRGB 255 68 0 R] endobj 68 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 60 0 obj <> endobj 69 0 obj [/View/Design] endobj 70 0 obj <>>> endobj 65 0 obj <> endobj 64 0 obj [/ICCBased 71 0 R] endobj 71 0 obj <>stream +H‰œ–yTSwÇoÉž•°Ãc [€°5la‘QIBHØADED„ª•2ÖmtFOE.®c­Ö}êÒõ0êè8´׎8GNg¦Óïï÷9÷wïïÝß½÷ó '¥ªµÕ0 Ö ÏJŒÅb¤  + 2y­.-;!à’ÆK°ZÜ ü‹ž^i½"LÊÀ0ðÿ‰-×é @8(”µrœ;q®ª7èLöœy¥•&†Qëñq¶4±jž½ç|æ9ÚÄ +V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚óÈtÕ;\ú” Ó¥$ÕºF½ZUnÀÜå˜(4TŒ%)ë«”ƒ0C&¯”阤Z£“i˜¿óœ8¦Úbx‘ƒE¡ÁÁBÑ;…ú¯›¿P¦ÞÎӓ̹žAü om?çW= +€x¯Íú·¶Ò-Œ¯Àòæ[›Ëû0ñ¾¾øÎ}ø¦y)7ta¾¾õõõ>j¥ÜÇTÐ7úŸ¿@ï¼ÏÇtÜ›ò`qÊ2™±Ê€™ê&¯®ª6ê±ZL®Ä„?â_øóyxg)Ë”z¥ÈçL­UáíÖ*ÔuµSkÿSeØO4?׸¸c¯¯Ø°.òò· åÒR´ ßÞô-•’2ð5ßáÞüÜÏ ú÷Sá>Ó£V­š‹“då`r£¾n~ÏôY &à+`œ;ÂA4ˆÉ 䀰ÈA9Ð=¨- t°lÃ`;»Á~pŒƒÁ ðGp| ®[`Lƒ‡`<¯ "A ˆ YA+äùCb(Š‡R¡,¨*T2B-Ð +¨ꇆ¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r 9‹\A&‘GÈ ”ˆrQ ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½Ä­ÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@ æP+¨íÔ!ê~êêmêæD ¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒÓ¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…åÆ’°d¬VÖë(ëk–Íe‹Øél »—½‡}Ž}ŸCâ¸qâ9 +N'çÎ)Î].ÂuæJ¸rî +î÷ wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö +n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=GTB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßY Õ.©=bàá?SŒîÆ•Æ©ºÈº‘ºçõyõ‡Ø Ú† žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹­³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝ­èþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_p߶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMśΠnßLÝlÜ<9”úO¤[þ˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ +¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäüå„æ æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ ÷„óû endstream endobj 63 0 obj <> endobj 72 0 obj <> endobj 73 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 17.0 %%AI8_CreatorVersion: 21.0.2 %%For: (Lindsey Wilson) () %%Title: (Ember-CLI-Mirage-Logo-Horiz-Black.ai) %%CreationDate: 4/12/17 8:08 PM %%Canvassize: 16383 %%BoundingBox: 40 -2056 544 -1903 %%HiResBoundingBox: 40.9218139648438 -2055.67138678544 543.650695800781 -1903.16748046875 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 13.0 %AI12_BuildNumber: 242 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 27.119094045298 -2069.11139443028 577.119094045298 -1894.11139443028 %AI3_TemplateBox: 306.5 -396.5 306.5 -396.5 %AI3_TileBox: -75.880905954702 -2269.61139443028 658.119094045298 -1693.61139443028 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 2 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI17_Begin_Content_if_version_gt:17 1 %AI9_OpenToView: -2601.92589258926 -485.070807080707 0.3333 2549 1289 18 1 0 5 43 0 0 0 0 1 0 1 1 0 1 %AI17_Alternate_Content %AI9_OpenToView: -2601.92589258926 -485.070807080707 0.3333 2549 1289 18 1 0 5 43 0 0 0 0 1 0 1 1 0 1 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 7 %%PageOrigin:0 -792 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 74 0 obj <>stream +%%BoundingBox: 40 -2056 544 -1903 %%HiResBoundingBox: 40.9218139648438 -2055.67138678544 543.650695800781 -1903.16748046875 %AI7_Thumbnail: 128 40 8 %%BeginData: 6784 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD23FFA877FD7DFFA852F87DA8FD7BFF52F827F8A8FD7CFF7DF8CA %FD18FFA8FD51FFA8275227522752275227522752275227527DFFFFA8FD12 %FFFD07A8FFA8A8FD08FFA8FFFFFD06A8FD04FFFD07A8FFFFFD05A8FD0BFF %A8A87DA8FFFFCAA8A8FD06FFA8A8FD04FF7D7752A8FD08FF2052527D527D %527D527D527D527D527D52207DFD13FF52FD06F87DFF7DF8A8FD06FFF827 %FFFF27FD05F827FFFFFFF827FD05F8FFA827F8F8F82027A8FD07FFA827FD %04F827A8A8F827FD06FFF827FFFFFF27275252F852FD06FFA827A8FD0FFF %277DFD13FF7DF852527D5276A8FF52F827FD05FF52F827FFFF52F8527D7D %27F827FFFF27F852527D527DFFFFF8277D7D2721F8A8FD05FFA8F8F8277D %7D5227FFA82727FD06FF27F8FFFF5227A8FFFFA8F87DFD06FFF8A8FD0EFF %A8277DFD13FF52F87DFD06FF52F8F87DFFFFFFA820F84BFFFF27F87DFFFF %A8F827FFFFF827A8FD05FFA827F8FFFFFF27F852FD05FF20F852FD06FFA8 %F827A8FD05FF2127FFA827A8FD04FFA8F87DA8FD04FF27A8FF277DFFA827 %A8FD08FF277DFD13FF7DF87DFD04A8FFFF5227F827A8FFFF52F82727FFFF %52F87DA8FF772752FFFF27F8FD04A8FFFFFFF827FFFFFF7DF87DFD04FF7D %2727FD07FFA82727FD06FF27F8A82727FD05FFA87D2727A8FFFFFF27FF7D %F8F8FF52F827FD08FF277DFD13FF52FD05F827FFFF52F852F852FFA8F852 %2027FFFF2727FD04F827FFFFFF2727FD04F87DFFA827F8FFFFA827F876FD %04FF7DF852FD07FFA8F827FD06FF27272752FD09FF277DFFFFFF27A8FF7D %A8FFFF7DFD09FF277DFD13FF7DF852527D527DFFFF52217D52F8A82727A8 %27F8FFFF52F852527D272752FFFF27F852527D52A8FFFF27272752272727 %FD05FF7DF827FD07FFA82727FD06FF27F8F8FD0AFF4B52FFFFFF27A8FD0F %FF277DFD13FF52F87DFD06FF52F8A87DF8F8F852FFF827A8FF27F87DFFFF %FF27F8A8FFF827A8FD05FFA827F827F8F820A8FD05FFA8F827A8FD06FFA8 %F827FD06FFF8275227A8FFFFFF7D527D775227FD04FF27A8FFFD0B7DA8FF %FF27A8FD13FF7DF87DFD06FF5227A8FF52F827FFFF2727FFFF52F8A8FFFF %A827F8A8FF2727A8FD06FF2727FFFF272752FD06FF52F827A8FFFFA87DFF %A82727FD06FF2720A85252FFFFFF5227272752A8FD04FF27A8A852275227 %5227522752272752FFFF277DFD05FF7D52277DFD0AFF52F8F827F827F87D %FF52F8A8FFA827A8FFFFF827A8FF27F8202727F8F852FFFFF827F827F827 %F8FFA827F8FFFFA8F8F827A8FD04FFA827F8F82027F8F8A8A8F827F827F8 %2752FFF827FD0FFFA827A8FD0FFF277DFD04FF27277D7DF852FD09FF7D27 %52274B27277DFF5227A8FD06FF5227FFFF7D274B274B277DA8FFFF522752 %274B2752A8FF2752FFFFFFA82727A8FD06FF7D2727274B52FFA84C275227 %4B277DFF5227FD10FFF8A8FD0EFFA8277DFFFFFF7D27A8FFFFFFF8272777 %A8FD07FFA8FFFFFFA8FFFFFFA8FD07FFA8FFFFFFA8FFFFFFA8FD07FFA8FF %FFFFA8FFFFFFA8FD05FFA8FD09FFA8FD07FFA8FFFFFFA8FD13FF27A8FF27 %7DFFA827A8FD08FF277DFFFFFF527DFD04FFA8527D277DFD5FFF27FF7DF8 %F8FF52F827FD08FF277DFFFFFF277DFD07FFA8F8FD5FFFA8FFFF7DA8FFFF %7DFD09FF277DFFFFFF7D27FD07FFA827A8FD5BFFA852FD12FF277DFFFFFF %A87DA8FFA87D7D7D522752FD5BFFA8272752FFFFFFFD0A524BA1FFFF27A8 %FD08FF525227527DFD2FFFA8FFA8FD0BFFA8FFA8FD1CFF7D27F87DA8FFA8 %7D527D527D527D527D52527DFFFF277DFD13FFA82727FD09FF52277DFFFF %A820F87DFFFF7DF8272727F82752A8FD06FFA852F827F82727A8FD07FFA8 %4B27F827F82752A8FFFF7D272727F8272727F827FD0DFFA87DFD12FF277D %FD0AFFA8A87DFD06FFA8F8217DFD07FFA827F87DFFFFA827F87DFFFF7DF8 %F827F8F8F827F87DFD04FFA827F821F827F827F87DFD05FF7DF827F8F8F8 %27F8F852FFFFA8F827F820F827F821F8FD14FFA8FFFFA8A8FD07FFA8277D %FD07FFA852F8272727A8FD05FF7D27F827A8FD06FF52F8F852FFFFA8F8F8 %52FFFF7DF82752A87D52F827F8A8FFFFFF52F82727A17D7DF8F8F8A8FFFF %FF7DF8F8F8527D7D7652F8A8FFFF7D27F852FD067DFD12FFA8F852FF7DF8 %7DFD08FF277DFD06FF522752A8FD09FFA8F827F87DFD05FFA8F827F87DFF %FFA827F87DFFFF7D20F8FD04FF7DF82152FFFFA8F82727FD04FF7DF82752 %FFFFA8F82720A8FD09FFA8F8277DFD0EFFFD05A8FD05FF7DF827FF7DF852 %FD08FF277DFD04FF7DF852A8FD0BFF7DF8F827F8A8FD04FF2027F8F852FF %FFA8F8F87DFFFF7DF8277DFFFFFFA827F852FFFF7DF8F8A8FD05FF27F852 %FFFF52F8F87DFD0AFFA127F87DFD09FFA87D4BFD0827527DA8FFFFA8FFFF %FFA8FD09FF277DFFFFFF52F87DFD0DFFA8F827F82752FFFFFF52F82027F8 %7DFFFFA827F87DFFFF7D21F8A8FFFFFFA8F82752FFFF7DF827A8FD05FF52 %2027FFFF52F827FD0BFFA8F827277D527D527DA8FFFF272727527DA8A8FF %A8FFA87D5252F82752FD0EFF277DFF7D2727FD0FFF7DF8F852F8F87DFFA8 %27F87D27F852FFFFA8F8F852FFFF7DF827A1FFFFFF27F8F87DFFFF52F8F8 %A8FD05FF52F827FFFFF8F827FD07FF7D7DA8FF7D27FD07F8A8FFA87DA8FD %0DFF7D5227527DFD0BFF277D522752FD10FFA8F827A852F852FF52F852FF %27F87DFFFFA827F87DFFFF7D27275252522727F852FFFFFF7DF827527D52 %7D527D272727FFFF27F852FD06FFA827F8A8FFA82027275227522752A8FD %13FFCA5227277DFD08FFA827F827A8FD11FF76F8F8FFA827F852F8217DFF %F8F852FFFFA8F8F852FFFF7DF827F8F8F827F852A8FFFFFF52FD08F827F8 %27FFFF27F8F8A8FD05FFA8F8207DFF7D27F87DFD1CFF7D27277DFFA8FFA8 %7D522727A8FD13FF7DF827A8FF5227F82727FFFF27F87DFFFFA827F87DFF %FF7DF8F8525252F82752FD04FF7DF82727FD0552272727FFFFA8F82727FD %05FFA827F8A8FFA8F8207DFD1EFF5227F827212727527DFD15FF52F8F8A8 %FFFFF8F8F8A8FFFFF8F827FFFFA8F8F852FFFF7DF827A8FFA827F82052FF %FFFF52F8F8A8FD05FF52F84BFFFFA84BF8F827A8A8FFA87DF8F87DFF7D27 %F87DFFFFA8FFA8FD1BFF7DF827A1FD18FF7DF827A8FFFF7D277DFFFFFF27 %F852FFFFA827F87DFFFF7DF8F8A8FFFFA827F82727A8FF7DF827A8FD05FF %522727FFFFFFA827F827F82727272027F8A8FFA8F8FD0827FD1CFF522727 %A8FD16FF52F8F8A8FD08FF27F827FFFFA8F8F852FFFF7DF8F87DFFFFFF7D %27F8F827FF52F8F8A8FD05FF52F827FD04FFA852FD05F827277DA8FF7DF8 %F827F8F8F820F8F8FD1DFFA852F852A8FD14FFA87DA8A8FD08FFA87DA8FF %FFA8A27DFFFFFFA87D7DFD05FFA87D52A8FFFF7DA2A8FD05FFA87D7DFD07 %FF7D7D527D7DFD05FF7DA87DA87DA87DA87DFD1FFFA827F827A8FD0DFFA8 %A8FD6EFFA85227277DFD09FFA852F8A8FD71FF5227F827527D7DA87D7D27 %2727A8FD74FFA87D5227272752527DA8FD7CFFA8FD52FFFF %%EndData endstream endobj 75 0 obj <>stream +G®¤-D2ŒFΪ„&'²¬õ’°§’u„‰BVˆÐ–Ì +t[‚$±a"³LœÆR7`yz]ØX^Wú©)0e£ÁÇÓ±ÚS ²V³…Dn ,²¦òÞq{ÊJR…¸ü“ªÓæ¬$è +¢äD”2't܇X̃rO£DËÜxâ"Ê 1§$H)Ë¢ê«[™ÓÖH×™¯®Ni é>âÅ’ämT Á‘Їl:1Ã@×é$er‡T›ÆÔY?u4ðÃòÜ›0ˆ$zjs(Mù©ð !!\†0¬k–'dáE Ð!=¢„&HØ–$«x ¤Sñô&+vc…¦0ÙVh‰´˜a!Æ[’)«+º/Ö˜uØ–J³V±0îHÜ3Ð} bŸL"‹(²4Ó¬à’)±½YÁïT˜‹ðIbž6¢¨TšeP I°„ŒSó±£ìgÐ|§,ƒ,"Ír®¢«â$ RL =<`ë2eÅÊxGÐÙƒ“ SfÍŸ}‡y^±á+V~Ùhñ ùÑÐ.<"M³Ær›Ð ì!Ñ)d^²˜ þqìÇÄ"vªæ>IäíÅy;»y”M,fª(Šå˜DÌ/‚‰›¶ hÍ!c˜ˆ– Æ1„5)/L¢ˆô˜‹U¨eaˆ×ÙÌ…•+ÂÔÂó¡Ñ`Š OWy §aùv‰ÊhÙÍKt +œ‚” ¤u Xi¦ëâv# +™”H ôzIÚ´lÐŽjXÒ)ߥ˜Žé&š Ë^üu!@r±1™@J¬Z0²$›*ó#R'´1û?Öa¢³Û4‰ÇFuN@¤l„‚‡áUÃÜ?p ¢ ±¡Jï±P-©ÍÂ8Mç0³qG^±3f ½'M Š¿‰ÙËŒšò=Ž¹O1”.scdH.é‰Å¬1z”6¹Xî–r™f;Á<±ÍûÓoBž +š¯WhG„E9®Hš±³_"Öé°<ùÓ<}Q˜À·éËè`¬aÄkZš¤éSÎ…a‹l.¡V½4; A%„¢ØÅÅBŠ“Te¯b¢œˆ»¡@Éaäf‰4eÙß!¹ ‹Fi™ö($¡ŠçƒÇbRA'¦lmØnó~’ll˜aˆÈ˜™Ã” 3ìZæ/ØѱvÝB–Ÿ¨^3õaÄþ…eF‚Æ"iǶbuLó<`Ö1$ÑÃF~bb +-ÎÔ©pltRb…}HØÀ,N¼ 'Æ€¾¤¿u³Þ”)¢‘Cš²ëe9$‰DÌ8RÀ¼^4 lFr@’5]Ä÷X1N•IbÍVÀ BÜA(f -tdœ‹œZDRIêÙH±¡'Žü¦˜Öd“}7Ñ2d ‹z% +jZlV©çé.ó°à/!joˆYŒw—0%yùvŠ¥¦8Rô3ûœ”rVoG*Y­JÚ«šK]@8`!Èš'fÍðPiÊ»äyvF*ŠÃ)ˆÄÄ.‹±GCŒŠR×# s\-ò‘©À…#h9Bv +q»#Š D Ž( Æg(TÀ1^€8˜GlÄy@Ðo„Àp%ÓB¨d£Jùª +®­‘Ê|Tf¬2«­‘.YÉjæ²Ûlx"‚ Àf Q-1 Œó]F +Œ @AÀs÷ÐBèíH)QTÉ#UsM¢¥HU#yi)çi$AE³©xê!vIB‰ Z¶õS$,ë² ¯§øI^ÎB¬D'd±±@šŒgùÚ˜Õ-Âà ‘Ñ +‚ÕPö±WO;§ªˆ}$^rÞI,ËNòÖ$cˆ bœл*T9=R¡ÝÅîô]˜¹·#ÕL^%×WÎò‹SO$BÖio%a1Í}þQ¡,<²¦ªÐi5IÇò ”È+§ú*é@––šýc$ïòŠh8, a4+ku*ˆV:æX òˆµu¥˜ÊX»%+iÆÅ®©Èbºò-¬·!GÕY™K¨‹Þ«"ÖáY`ŒESV’ÀŽWV|IŽûh®J`g“'Æ‘ä–¼¡qtCºIÞ‚BeBeBNÃÜÔ0­™ïŒx0"sËpLƒÆ'2˸hG]È÷Ò¤,ÂnåÀ "L©Äç2¿†¾‰å¶0ÖF9ýlQ#?+`%ó®s€_8ˆƒcÞ#•[ÂáT軚)F†9‚u¤9eÅfBÀnOÌòD$Î •t°pªƒ”æŽ.Ÿ 6a°œ¤eC@úÁRf#¹¶VH4‘¼`Ù‰ô .Ä<œ³’LÐlÿò=!',àÅ¢a¬Á$É–g/”(Ç`Â2ïÙq÷/‚¸æÔa*C6xÕ.\£>õùZ+Ù?v]Í Km±öAð‹hPòfØc¡Ü£\>FÉ=•<:±u9×^NÆWöÓ]–kñ4ôh5ãê’æå¼l9w[Éð¶8ô œû¤!Í–$ 2Žš:¦á˜ƒËm&Ljd¦Ê£G·µPŸ³J$Š ,SòbWz/OóÛ‘nUåJŒ.5 Ý**åoG8$0É™#f›Ž3ÊaÂóqvgQÄ›4O&Á\*Lx;Òµ|¡ZâPª&hÉ:K–žÄ—ŽãüU!ÌÛ%ûÞ:•TâH®‘•+S$|6&ˆ3/˜AOG&å@-)!'hxBC¶» G;æqúØ¥Q+• œý/×7Tk JIûéî‰ýböÿ-‚—‡u¸ ÁHÛ¥áªkf“4K ÁØpáËTò&¨Ò„™¹`2¼ +þÈ&Æ­9óH/NDgÄárù)äüŽ’Y´‘‹âÅ\ÏŠ°ïŠx¡r‚^œíÊ‚pr‹~5P£ó¶\mJ0º7-V” +¬ä’S…ŒÁ)c@˜C¹jÆiaÓ‰ë98Ám\Q"FÅ!ʬdƒÇîfu…u±URIª$SXÁ™+CÊ3S½Ê·°€Žæ˜6¬.mÍ¡¶ì8ê +—_ÈL(™T–pþ\‰wÏÊÊpÖA5݇b¾0D¹W%’J³òâJ¥8ƒ9ÞzõWY•SñÎ@ÙÖ•ad±l¢m‘ס fÓtpšg”Õ&áó€‹o,BªsÖ)…(¥J‹­¸<$0° %€-Å)$¸¼2ã#ä,õÎÖÕ“ÀØ7²4 W®šðÄÈ4ï$j­:£­‘.ó^]›ò¶8 “Yd° ¥ÅFNR» +j® `ˆ•‚;Dx6ánu”KoÞŽt)ЩñTJa˜ªoØ9Ùšø¬1 +?©²ž§S„Q©r9€è•è×Є[R³E¼ˆÓVļ’Û1"Åš5;'€œV%F îTÖ…+äZ¤éé.„_™MV)×ÿB±- +'<ŠÅ.¶bÔTŠ›Z#]J *ERåBª§eݬbOeÙlö_­•Â-1õ÷FÆ4'Å9àYg_©Ô;Ò¥œ¿Rð_.;jTk“ªåK]ŠœvF* Ì4‘§€*…TÔéRSÕ¥îª\5ݵ†«\Ôòv¤kíK¥>¦\D#³R* ªu+1JœiC0 O K˜!±X()‚—€ÍZÌ„Ÿäܶ9ÃaRË™:¥Â³¾Â#æÀ+#â%s.Af„/å ]ñTJ\Ã4堸昋ám´~l ä¡P¢T‚àœ±à…ÌðbÅ’eœG‚¸ÒØé @ÃYŠòp”qLÎ]¡`RØ;viÁlñø>ñÞ¹|,CJK\¥‚ +­´Fº­• Û*N¢ÎJUPÕB©R5•ˆ¤¬È Ãë‚c-—p f6'A5jyé Pá¨bb× +nãB/›Ì‡4–£3a"¢ Q{NÓpü.v–£Îh\Hoz$I…z 'Ÿ<¢eÄQu—›—Òœ•'µÅ…} ­Ä—kW~°Ä{w±Hq$jâ!žÈ…HJõÊoG*ÍÅrçR9ôte’N£bë+¬ K ôH +äª{¤fI(Ò.¥]åê¯JyX¥„¬EÒÁ•D*v ÖWAqnF…\×-)ءƉ먅#B¨TÑ]Yªz*—Eu©œÒRýÂ., /™ Ÿ‘UâôLe¢XÉ¢±ÕÅ7#ª1ƒ22Ë’$ÔSËcÃ’F(ÌÒ09äLÞR@¼‚,NÌÊ5IïD©&/'æªUת¼´ª°²?ÒÃ(L8òÍ¿IÚð5ü;ÖIR­ oT ǻԖ—*}qW©¸R/\©)n¡øT"ë¡‹8—xÀÕ4–ª1qS¥b³RÓY*„ä¸b±d¥œ²BÓ ‰2ÙWø¢D¸'â—ùÂ:%Óਓ•R?ÜS¬¬” v«)ìVyX­N,Õ‡µFºT‘U+ÍÊÕh\ÄæÒjÄ7Ò¡XhÄ·”k‘ªõJåqs„’¬K1³ÊédË%Ù¶KÙ {Íåâ˜jM¥ÌFJ›8D†©”ĨÀ%«%¦R©‘໪…Õb‹R²\j$J)õni÷bJC*•Äa×ôb1 é"Õ˜;˜Šœ{ŠÙ!¯ÆfI5çòxÕ¬]5³WÍÿU’„•4b1u$/ãyÖ.\Ëcälç‰+i¹¥œJ)çZŠé¾‡‰¹p¤Ë×°³ú½ìåì¯W)ƒÐ%ÇP 6óM"­c,Ò)¼ãÄ:3¸'å[J¡Ôr¬µÏc‚/…üº‹A*æ®”cå±Û¦Ê*H˜÷ŽÙjtÆUI"8åO)„x^uKnqÏne?kk¤(ÙéL)\*QÈF-‚ H¥ÌgÏŠ±8íÅðA9¼Pr±!¶+ÛTKÛX‹®'´PÑ9-;¯e +&RÑÅ*y`%C¿Å–?È]ÜHÛðÆÆ¥)ËFvk¤j†—Íô¢ÊBaã_yc`·­ƒåÍ…å͇…݉¼{†"Ù6–„q—Þ‹|K¥?c¹cÑ>BïÅ ß›T5&_Ñw˜qšü‡7u§©Éb$ÃDGaš"àØëSRxÒ‘÷TW„Ì,±‰Ûˆ °žŸ‹R52Xˆz”îöܾç$‚F0ÂéÁ)1‡§¦~”¯‚šòå#„‡ß>œè¡‚"²µŠÂž‰< îH½&þ™‰œáŽ&øåÑ|"$?Ú+Íz¢ýñ©³EÌ7 bLW²õ ÙóãBƒœP„ϱ2­É ×ð%ú“(âf–LzHÔÏ3`“™ %Ò©;Ù†ôEj{G"=Ö–,Ê$ LwUÁû\M t +¾èãÑäñ…ÆßÖ•‘ú^€LLd<”7±.¾q±ÇSŠÿƒBÜ¢Á%ûµ£È¸fÈÅùsGò¿þµ’ÐD ¨øƒ£uñ©¹sTçGÜÄoöWçer!'ÞñР ï¾aôGÞ4ú£C}'f£?6åÙ›™•Â”L"‰ØdÉ´ðsùϽ¶2ôÂÏNÀé Ë“øJËM‚8%WL;æ&·øã½æÇGøcÈå_X¤2‰ÓÕy]”ŒÁ›Qž¬ 1ñNª©±&Ž,$Œ¢S•pº)2VY¥R¸•Üç‡.ˆé7’*i¬Ñ¬Nd%L” ót”ÿÄû“E~ÓplKgY½½¦åðþ[y!Î=í†xú~ÔÏ=ý0äé¾~Ñ?÷ôÃ&àÜÓC(øÉãÃs®ý©¦äF‡«[''íãÛ߽::>¹ëNÄ<÷4h\™::Ú/^sˆ#¿çÞìmËù£ý{é«ÇG­öë×µvë„|ôýw;éAßN:Ÿ÷@’¦>5÷n4ÊÀg#óÓ†î0È$¼ öÙT®‘­°Qñ)$hâ9eÒî—°ï|–èÑê "òÔ; ÷ŸjI’€«ÝÓP)ƒ–„ã»}µèûH¢OײÏɾҌý„¢ïg{WúŽçÿ”*7ÐRˆÍæ ¹ZbÕëgX>â4µÛÝnK/äBRÙE´ é…½ð N1ˆÔÞ‰SÏ-¥ê˜SCãÃŽ|ü v †Q¡AŤã¬îñäšÖkZÿXŽIÔw$¿¤ŸG{ýdðs«Ž Ê­Šè猪G+Šæƒ_§q¡D¡Ö¿«ŠFÿÈ8Ę"Z ®ãüi{g|ÞØWa =×õ~Øëâ4Býº{_úŽ×ýdsY1AÞÔoƆn‹’“Ê;H*jK#5¨ÌâZHYúN¶Sjé2V· —ÊLyCe.¦i+ùÇ9Y,[ŠÂÔ¥ò?[ôüä·ïùy´üû¼wÑÝË—`‡G6´.ÏÏýî„m”FùtAî>3)ÜnxÇ‹¯/¬üœ “ÜïÝ/þ\~x~hÕ‘ç5÷ãtyI +8óssÙÂÏ<¤Îù•~*`šÿ­Û"~,=4)$=Ê£y×ÚNÿØÂçò^W³åðf9d((‚±3ˆÚòËâ»ö+à@‹yÐhæoìê@²ÀqCÅv ƒÇk{ÏŸ¾/bŒ,Ë)îÍžì°FïÐÆ· S +Y³äØv7É©Ž Ÿ•v`c— [Є ±IMé¢å€á^H Ç‘l¸ç¤€F™/—ðá°G²C4\5tŸÇ^zËÍ4Bt;u§Ø‹)‚-}¡;uÕ§p_é„ÅÇ› ;X‚RL„ØiqÛ?Þ®«¹7úb 684׎™â€ó*:Ž¥ËêÑý‡  ¯NœûѼã‰O” EFÅ厼 Vº›ñ¬%FöèÊ6X€PC‹D8©Œ[~˜DKãïÀð¬~#&·oµ\*Ã}ˆQ×@Êža”¢HL›Žä$A×:?ìðœë`€SUCTlJ¥%¸qXÀ½TMìûM+Ùûáv8‡Ø©˜HŸt'PclFu}"Ù”ª±5Ú¸aM*9¦Pk×6 ›â 5ÙÅ]î°£”óta¨}cþXöŽÓ£Ýæ(äy,Q2h]yþ¿g°p'eù(g.ãG"b‚“´ oÑFã~L +÷&â†IaгCÅû\¹Ø-ˆà.p²sš†$‡a 4Ä„Ü ‡…EC?Þ놮98ÙX)Šîñ'ç;`ÖX Ù–’º’Ø [ÇFtiÌmlà؈ +3ðMF¹E,ö:ëÈqQJû:‹sØèÉ)<ÂlA<ƒw¡Õ#W4cÿ4l8c«±ÁAÉA¤¹å¼•Zigb´ã¢Øº~Äü JpÞt#`q¢¢•å`E¡ïTÈ’Töð5&¨’†ßJl³”“†Ñ¤È8O0ÔrŠ Q S’Ó¸I +ˆÂ`‡¾Âqt·èPïzï’Ë`…Iii@Žá +S,[¦ž3L¢Š±{AZvñyz$$Ñ`E¶3Cxb§pm’¢ÛS1o‡Vh€`øpäØr÷G…PÜï%åM¾L+XrH¸“GÀç»°‹À€Ìp®O,÷$åSisH^ C¤Õ…_ ¸¬ +¶bîáIzJÄ,wdàž…©RB !”wvRBŠ$¿9}žJ‡ù'â!Š÷*Žâ$®ñ!ºÞ[æg©aoq·métÁIð‘F Î!’줱³4rV8l9®ø±Ü…YÎWá0ƒ#EÞ× &”öŠ1v=/„òð,›H;F±XCÅW²-âDC á™Xjþ±å‰ÀäN¿Š»µEJH_ù&¾J6ךñEÛÀ¸ì®Ð|„˜4ãáâpb`£>D‹èaìúËj×Íbë¬t>ÁˆmÔب¥ç  +²8r­™Q›fSsú³jœÎƒYJ’~>¨q"Ó[¾ø´† Л›Ÿ0(>Ú‰=žÉˆ«ÝÄ[A˜J×Þ>Ê™ ît=?)ïÎbƒ"V±¼FŠIc9®2t*`tĽ<Ù‘å9 ™OØ8Á`ç9{@JZW@ðF–EN.ÊÉ%è#‡0(ÉV‰Û*‰isM”C”ÿpMŸNsÆ„ Ù¸ÒÏ™›&µØÿ“ÃNÀ&DB‹z'—T(¡ZI¨‘W‘wf*'vÁ)ìçÀ5NÁéÜϯDw Ft;PØÒ"P‡r¸vÆÌ=|Zñ‘ •JûQ9XgepÛYé¾(“ÎûÙ5Ÿójë¡Ì8ÅF6–ê–Ï;ebÔÊí‘æV +|Êoÿ +¤‡mŒÎAØ(aåœQ”sg`Öɤ Mvp(ŽÇÀæR%‡Þ±R'ùÉGªsCº ‡&lçG#Òñl”Ë­ ºhÄÜ.û[kiãB”cZÑÚ ¥uÁ„á_ѶšëŸa¯ÇÒC¨×€¬Œ +•3]«ií¶ß¢«kÈÍôÜñaèB7Δˆ0ˆÂ¨ÓYZh‘¼Dl+’]_LŒ\êÎäÓ¾Ù"­°ÉÌ‘"=Qº©»sD˜™Ý¹_‘•“EBxY‡d§Ü±e™Íp6£{ç ‚£ÜwÏHWŸ8Ž\ß{l‡ãíÚ2E|lÇÀ]±~)÷°*QH‘ûòé $CÃepèê‡÷j,œb÷8æM‰¦éêÓD¦×5š‘ÇŇ"”²B–¦ÕÕîôB^è$ãZZ…¼[Lvò9W|x¹åí]ìEÎøHÜÅ0Rl*)îÀê‚ø†ž‚«ˆà†&4µkRÊwÄèò‹y綑fª%ª‘8‘t,…lÅ5“Ss¥Á;º¡Ó387à“p4 ùH_Ž:[N'®cZéIû` X¤¸ÿ%’à,ïÂåî|1K?T=ÖÅ&ôë“$ÌpÜ,UH›*û£L•kõÇ-””kžHJΩâ6&Òî;6b‘‹aUœÆ‰3+Y9ƒØH×8ƒG¹ûÈøˆ™b ñPÌ_Þ$«¸Éˆ´ƒ¶" bïŒ"¼Ä[1øñZúБ" \÷Ë<µañ%ìf¦þœ?Åm‚\I6÷E¯“:U2O“,ç£ÅJÌ7‹Æ-âòYDxI¸| ¬0pnuF!"zÌs˜& ”!|wŽûÒ(»a3Q)X¼©ëQA\J:À€üS¡Ìš$Ò2.•(Þ¨Áyàe)¡¦  ›?C-­ÂÝšÀYeä,…nPb½G|Úƒ4+??µ“û²…Üý ,®qÆ'Ì›p wùáÆÙLX±ŽØl +¦¸’5÷5aÅNb%59ë•ÞÅλ•CÏ“0•Ï†2¡ÀL`\¿ +ÙÎ&«œIdØ?ù´òÒ«…˜E˜2Ø„ÍôcñJôñÁøäLŽ5EÜô6N/tb -bYë`¡ø`ÝÄ€Îö|꬙´Ð¢?ÀË$F‚" ¥˜•-½®í-Ÿ‡yNÉŽÒ$d —hâH'bqòëYfjw_(>ȃÏTà“ñø€ nªËé^ÈåÜ%­å4deSGŸØîÀ!WJó,ŠV¤;&Fˆ+.·F'bLÅÆÁ ¤s}èií%â"5ˆW +5¢K^䂤68ªÁº½À\bðs+”ˆ ¦‹äq}nÝ&ýÌ°P!÷F“sTEÿÇÒÿmF¡‚IÍK›vîLÌ ˆS¦¤Ç8T›òfOtûŽ;Ê8‘FÓp2䬧çؾ±$˜B>ú)uÇÖB@…ZzŸ²í®Ý‰-…n/`D;ãÙÇ_ÝÁTÖ`Snu-ÔÂqŠýi½àU8²±?‘/”ã~Új*„(½Vpîg¬³»fGŠi>⶜-jbo ð1El6D¼°|þ•ø)*².~Ãn*š:ÛHÀæa0<³8,q¬ôàwG­rÀ°ǧà õŒ³è5Mï^CÒ¶Q!9С‹Œº„%,у ÌGÒ¶)/A é êÚÌHh^"‚œeŒU¥^9ùØ|*agáe3‹ö÷m%:/B€»•KxÞš¥QÙuq"SŸÈ  w«Áí9B/óiž¢%ÆÍG¢°#Íãâ½Hwë­Y4Ãâ}Â'ð)î+ÊÜ<Ž·óq”>‰;ßv¦PËQ!Ìe‰á¾_–ùˆC)1´ZŽJˆÄJ³¶„,5¶&¹mœèCÎs°Jãà6[8¼wp䔥5‚܈Î Íò6Îó)¿>\ß’#0tÀ¶PÌ—Có!îÜF9ˆ_zÚ Ôû°¼ɦa©JTáfi7/ìIv60–¾a.&·ßŒY¡¼wçá3’×™¼78ÿž¸ûäÎIû¸¯8~o±yŸåTnmãÛjô'iq÷xï ±´uüòuãñùo÷Nvéèúþ^«ýøB5mèvfõÚ")¦"‡;åþ\”?ùÿGJ_;ºþh1©Mžj)¤†‚Ô˜"ç–tñ!ç#rïHÆàÔ˜Ôr?)2œ‰¯I\ ‡®òƒ>ÿhð}rÌ«üäOòýFFÙôà^]£rŠ}‚›’µðU\´ÎWnˆv)$¿0@dÔ[‹‘õFŠ†„¶nóY2‹#r—ù$G2ÑUŠô$6æÅï^S¹Ê9«<@ÿþâ¨ø‚Ü×l€p£h8$)ˆs¸»9Ú! Ø'2d²Ïi(d•‘e#‡'$!<²„Gª¥Z÷j7@Þ{%ôï/ŽŠ/È}í Ûm“¡£gµtÚÉç£×ÆiÄÍÙ0w†IºÕFþ(R÷äˆ(¶°ß9¼Ð ] ž{qL|Aîk6<ôà!ýh Ç…¹ +òê8DjÉ>º£1È.°ìÆÆc$ýæzw и†* qT¡*~í Fc‰Þ‰ÈLÀGóЂCƒ!ÛF£çl7H€¾ù*B“AÓwкª‹„ÉJ¥Å¯ÙÉS(ðCÊ?æÆÉäÐd + Š +"é¾O–0Ê ÐÐŒ«  ÉàïÄäM†ïfàfäY8žê0HnLqá[6¸ ´f w£åSŠ×¡:Fž9{T~þNŽðhµ{§\dÓ$*ümÜ­ÄXwƒ7•Øfè‘cK7A’*ʆh8=    H%;=(íLK(Y¶‘wŠ ˆrSÀ… ~ ì£ _jÐyªb¹Nú¯Ê”ò£ä×Âƺt·]çWH= (€;ð+e²[c®=а…;~EAìA‰Ì£ö'«ˆíú<—Æ/‚„3`”XGOüv·òa‰€q`”!~Ê9º@ ÓD¨ ƒðè¥lË—ñJòóÙ“ÄùÒ±œØ#qwZt<ì…ìŒË~bÚ,Û>¦Ôßš#ë_Ž r…L†›3űi¹SGÚ½AÎtHzÎù\or·r·Äüuè›­åL¤ƒH¯v™ñHÉØäˆqÈ€Çú%µL•¦épd ×ç‰Às¢œf”ê1¹E$1 rêÀ$õ̘‚—œÀ ø (£|£Ë×ñÅxŸ#.œå&.ôB¿ÒÆ°Äùi€Â +$ˆ³IÊ€î¬f~˜Ÿ^«SÿNãVF'1¤"7™,R…Qܪ2™&P$ÔÉ&)uóËM7eÊ#÷4çscµ¸7@>Ÿˆ•æŠíèW¾%ܧÇÑ%gV3§BŤ”¿Îº•áÇ„ÈùŒ’ªÈ9"‘“JTbY—©Ìƒ8|ënu@Ëqm÷°Pä ´V”—ϼi6\Xæ"æ%§ÝÊ1( MQ:Dih:<šÂe8àIËK£LnsZZPQ~Fî:–¥¼2±Zh¼|+(Qß‹‰¥ip"“°ŽNárg¡÷2]„ø? †E¶Öm&(Ÿ}›¾tŠafñid ƒOÃ3 #÷ÕÊu*VQß=E«È8íkYÙƒ<-Ä`keûÈõ•f:–;â$¼. +ê v¤* Ý8ô6³ Eâ ©ƒaÃ+Î21¦ ŠádZáf©–àW„NúŠ +æ¡$ÙPpˆ²{œ3d¼â´±i&/3˜ö›PfPठº§2„Ï)ó ÀÀØ›?lŒ"Å,î£ÈËYÔÌd@;kZ0N!{`TqÉ‘Ê€åà œPî­AÉà”iÞP;ëÍÄú ¯;ÜBgÀ@REñyKÅ~­X1bÃL1H& +À0Q~ܳx'v@ž¸ÒÈ“*Gà ·&0JŠÏçBi‡J:†Y,°Èzªc’B¼(ƒ TrÉc^ª£”ÙÄÑïÒqEA@®Œëh’lÊ;ê&Ê´Rè”æÔ’×pxiê•rÎ>Å!Iyid/IN­b¢œqN^')á+Þ,~NíKù’y`PT°"Œ¸Êy[Ãp“ø +úEëe13GÄB»8åÆ• ç–ÆÈž…ü‚…ã°Ê«pÛ/ˆü:–íšÛðÊ€ØK^²Ìò@‘Yl¾äÅ«Râ¨#9Ù0õzXÄdä¶`”@9ýÚº †×›Š”WO"üÒY8Aö&Æ–‘HX78‰'‹zÁÈ=¨Uš:ìå4—2ÇeŸÈg© ÈËzl›vÃëЄæÓ‰ /ÄùtvAÖk˜(7)`6y\7Uœb‰|”–µtí,˜˜M…EåC3P¦8¢*™(-¤È ìMâÄ“Dv¡÷rË@OŸµ9ÓSÇ'Â>6Á",¸p9rʃrsÒfsçÖ™àìù…ÈÆæ—ˤ%Jq}‘šr¸ç©‰÷-³xBX¬ ìȱ’bËL‘45Ù0Z«¹BnlUŒ6 dCÛX¶dÓ/hM”¢K:oX‹ó,-Ê!ù ïò‘“ÈÊ–·°—ªÌLk3 ÁÙøjÂÌ,È}µöM™¾zª±³[‘GMšË(âûX`.¡hüi]i–P4|˜¸€²„"ŽÈ‚/ ÏìHÁ- ±OÙðn· ä52oª*^ø±yJBù~^‚âÈ"®ö†6û*&Í’ŠyP–WÌÍîT =ž¼=NrÑ'ŠtÉE>YFÛñ“; ´3E K.â±` 2˃ƒü€dÉEï‹Ð'1kÌZ9’Õò l]Ò´t]ä&×ç ^©,·ˆÓ{µ,–Ï-”Êà|nšÝ·“[Di,¯ð¹Eïuär‹¦)çÅa L' Èqi–\Äñ!nÊ}ÖЧü<ˆoµRñ^¼NÎåWHî¹ +GÐô"RÎaê&@hYi%OóéÅ ”äÒ‹9 O/òÓâRBx'Oe’Ë.º=Húì¢Kí2Èe ­„F2¤ÅËägeùÑ„3yéœáÊ@|r6(L)Fè×”mU€²ä¢7áL’%sBÒYJˆ÷(d;ÖÛþ€¹Ü¢q{0EgË®‚e„%¥ëÄ ÇÓÒÌ/Ü´e¹Eã—9Ér‹pÂLHV Yn1ô¹EÓ4ÙìZŸ½Wˆg7É ¤Ô]xÓ»>¤:Ò o€²Ü¢q® df9ï!aP–¦æCŒ¤£Ë„2àNn‘wÚ8ËZçcygÎø®3±š‹zY—A/àj‰¡c7w.¹h]ý=|r1ê$3`ê“‹Ö¥QMš%­³™uÓl¼‚Äw&¾u1S€\Ö0'òÙE>0áóœ” n®ûet‚Mœ`…{®1þi¡w#‹ +5Ò7)x±å´£Ó|ºJ¤0¤V.]¥dÆÓ\ºJ¶2êÞEu¤€rV«Û˜æÒU‡áxü2k¼4â[ÑÀÏnÓ®ž¤p³×‹Þ~Ö|ܹ‰_f´â°~±”»Ó«o?ç Y`,sáC<*öò^ù7Æ¡ÓIåĸYjØTqqMí|VrwŠÛíuvÏ™î}LÕ÷J(¥2ÀdC/‘­{³XUYŽP¿T>6Œ³6C˜.€œ‡d+ú|@©“±_,ÞÖÍ ,´­ÝÊèBàÚ™~I&×^Û'…„U  NÆŠ·¾çïÅœ -¼ ”­ê2Ž§¤•¿.KYÉCF˧¬2P>eÕúHÒ +@MãÓÙeÆ;Q7åEm'e¥:λ„<]ÈÍo-.~èj}ش鸬:Ù,PÔoÈ‘{H—³BºÒÈ$ûÄPØ1 :9+œ¬¹ë”¯–È _éePŸ¼Oé%zç:ìw)=w Ë[Ãì­Þ’é Nêÿ…È¡ Ýq<ªîÎÄ[^ùI‘F3¥é‹c¯4óÀÌÉÄ©I>¨êup–µB¸Þ:VÉJF"OŸ>k•å(*v(O„h>q²y…Ž¹1P‘Þ㌎3®š”Gç XÊÈ~ÑüÍ&Ç*YÚŠÛ=yÛ8s=§À]”’ñòi+ɧ­2˜·ï¤Ø-'šðFÇcys”»@äÊðžÌÂú!ŪsKên•1 +­KÂØtôZ¨c âY•$.èÃåÝ%]a¤WN¥dsžæÒVP>o“³ ¢òú©“¶R\v[P‰¾ÃENuºˆ_N½·JÝœ±NZ(%á uù›]+°¢ú—F%3!fK¶`Nðf΢Ñkï;çŠIŠfL'oE6tŠU +Bƒ~>Bõ?a4FÂG´&ÄïèÊD>L,GÖ“¯Be¹MʪŠ­ ѹ¢Ð’•ËÔU¾“k'VdÂ,ã‚-Òh.‹»ä¾šðcE}ôcE¾yTå Wo‡qÎpE• XÀ,ÜÀ#êdHcîPNü–r×e W9Ø Œ9¸aPÊ\6î‰rº8œ­tsÈÑe~EV !­ù⛆œ]æ!{vææB‚˜gú(':ÀLˆHå@^ÒpqPäQ(Û€ãœÜrÍHâœt“ºʼdÝyìÙ'¦%+Ö‚@Ø”€! i ™8•#€‚ØOåÆœvàX@™ +É yEãÞp5Ò¸S4ÉXóºMZI˜é@ÒÙîºLS†Ü߃ª–£‡ÐõÉQ ÂZ—¨ I êxR/6²O’ ðd@Ÿ»É=,ˆd~r/åZW¦ñƒ ¸²MPp,¥QANýežAœ».ó4‚°ts‚ñ#å‡âú›t†º:Çb9P¡*9úÂíìaên¯˜òEà²m-·6~Uac£t‰£]È£ÀÒG4,u´Ëäé}Ti›TrxĤ”#LÑâ¶:†cÈB¡».Ûú#n%h:³±: Û)Vê_p,†‚U+ÎrÉúUÒ7o%KÞ±`K*°ygRòNj„” ç‰rÄÞÈ0)°~èôtõCi€žgýЩxFÖ× t@Ù¤äAÉ&ÍÜûo…¥]°5·d>Ò”[Ø°cO1(c¨M D¸3Ac4F,ÐIZõÊ$ä"ô‹Ů( {*—ÑÐNøw°Õ‘ŠKsÒåæ®ÌxÖOX‰Ä?-ôÂ?Ìy9ŠPXÙ …Îú»¶­E‚’Gx4Z•† ÷àÊ=¡ÿL]yY)É ^‰Ù8ðXHvÇG¾sô”es’f‚Ü?ÌOpîuÈͯ² %9¡½’'§öy’9…,t˜—eí–o’PÑûÉ•Šci ¿xŒ±´VIi.‚€xŽþQÖ°ƒKR'6•`B3¼ŽáÞÕå3w²XMØÙ€v6à«Î®ûÜ×ð4;ô=ШëѶZ×£m¥®GÛJ]¶]êz´-×õh[©ëѶK]OñºÀ­X×£m—ºm+u=ÚVêz´íR×£m¹®GÛr]œ¿´S'#u=ºÓ4À×ëh[©ëѶK]¶•ºmËu=ìçæö"p]¶•ºm+u=Úv©ë)\¹É-×õpa‰-Õõh[©ëѶR×£m—ºm+u=ÚVêz´íR×£m¥®GÛJ]¶]êz +×I]¶•ºm»Ôõh[©ëѶR×£M—ºmÊu=Ú”ëz´éR×£M¥®G›J]ùÀPZ¼Ì×õhS©ëÑù®®®G›J]6•ºmºÔõd7!$¦-S©ëѦZ×£M¥®G›J]e„%¥ë¤®' „vb˜ÚTëz´©ÔõhS®ëѦK]6•ºm*u=º¸‘^êz´©ÔõÀZŽ³}\¹£M—ºm*u=ÚTêz´éR×£M¥®G‡•ºv©ë)\'Y`m*u=\}]6•ºm*u=Út©ëѶ\×£m¥®GÛ.u=ÚVêz´­ÔõhÛ¥®GÛJ]¶•ºm»Ôõh[©ëѶR×£í»ëzؤҦKÀÀG;>9ór1`PÞÇצ0`·.*C*ƒÿŸ½ï^lãFþ^@ï@J¢DRÛ‹:«zïV3ËJ¢Å&'οgÿfÀ.vY$û’8¹srÑ‘ ê`:€M’uuhƇF„”a‡( +9 DaÈajÌ¡!˜Ã 2fãKSŽiaRÑ Ã €“ÔYÄa‚¹pH{#¡dQ$; DY=\F¸#; „?+ä0ˆÚB~Fš9à0.³Ã #”^‡yå¢,Œ8 ˆ*Ã,pvi…¢¨Ê Ã ZÈ9à0 aÚ^Ôa@Ë; h±a‡A(raÄa X8 B[!Ò– ‡´±Âa Š$‡A'¸ÃYրà R‘)ÑBÛµ#s•ÄpD–AƒÐj™# “ hÀa@0; h'Âaš„¡õ—uDŠ9 BÈ#LæH¡ÍuÞ¨Ã@Vï4½ˆÃÀe#@Â'¹hÀa Á.è,ê0íƒ4·¨Ã@ÚU-ÀƒƒJ0߀Po£…Qæ; q·ª«ð4l2ý)²$èEª¢R8J …W0·MGuW…EéfÉQ)dè&‡>¼$’¤×w!¨A´5ˆV#E¨‘MôŸç@øÎiþÔ«”²£´î“¥Z¡Bî?0Ó̶Ñ}÷ªGoé»LΣU]¸0l5é:{2ËŠØ™ /-éŠb¨»ü@ñã'¦­‹ieÒÔywÜ}`rE“¸âÐ8(òÝR¡aú-Y¬Xá>àV-–îa Rž#ÕõTVœåEn¢ »pdÅéÂ}`òHBª.¹Äa™ªûî–}”ù§`&_@à=À½ÒÌH5Ó]Õ}÷ÉïÚà¢|÷²–Â{àûwtß{`²OTä{L~Iœ2ã‰}aÇ¢ªî{ ÈµXo÷Àä/”±Ð±Å±°€¸ð +Xâº.yüƒ"¹ DC01d1ùŠóð–àѺo{[üa;Â;ü"MrH…Ây`ùOA…÷ÀbOB1:»ï<°Ð[JpðÁUß+`ñ ýª:Åvm}ÉÉà2j•¼L`‘ï<ÀC\FO¾÷ÀäñYú(¾§¶Â~”¼&7Ž(y† Iñ:Ü÷˜üm>ùÞ“+RXÈÝxñ‚ÝSð݈ЎùˆÏnÉHõ„ ôÝfš§ÑÖ÷É÷Yó½&O4…Eú@‰ï= +…÷ûâÐåΑÏK6¨yFCÍw˜iVI  É¸’ä9@¦Ë.Gùž“'¢›‚lmcÉq rúa¡"fÆ"Ð`Ò®fX"6ƒ*9,AÂr=ÊÈJ½qÇÅ}c¡ub¢ ŽÂq`¥Ò0M7Û¤¢ÀqàêÂq`q ÒwXBÔwä- ƒS·pXb;tß! 1†Àq !·­T¯¤8ŒáY>ËfѸH )>Ö3ßšªûŽSäiÐ}ÇAT”: ~ËFÕB÷*y¦N=t¯Ra×¥¸üªœÎ_¨C) †òc3é›Ó,§‚ÎeÏËÃñëxºöpü:¦Ã†[¤œ«rü:uX ǯãoðåøu¾Ø žÔEÒ¥ã ÐaÇóõJ!ì,‘cKag9\b1­Kãì>ˆaÇ®æ‹"±~Ž„r;JRÃp_~® 8¨TÈ\ªÍâ¬1ð2XŠ!qwavr\rZˆ+kg#(‘m]QÄ°ãH +ag) +›†ÃÎREKÿWûäHtâ,'tµR1-©ž5ŸK²àj¥Ê±CºZ© +ÉW+Ù«UÆ©r@1¿H¾ZŠ«•ÌpT5éj%{ j¡«•ª`·ÁÕJ%`s¾_ƒ®ªZÈär, +í¾ËIQ¾YÉB¾©á@vB Hì4—ï¿é{ˆ}Å@dÇó¶ËÁçXŠbUPg(®TäûÑ9 ¤z6ßÆ 7ÌU ‡²ó5™`vì¬O•cÙ‰k—¡XvŽÐ¼d¨°X3j$t™© –ùˆ¿\E•CÙqNŽe'ÒYž%”½U I(å¨'  AÛ!²ešzá-‘}²`>çMù‡¡{•ªÉ72¸WŠ¯’l‹0u›>RKÞa©H÷*ý"ù^eP(4<ké^¥ÊehH#UmÍ ‘žMêa’»ÀòV󦊡G¹,^86Ü?6ñ*´¹€ nVª*O?&ÄOW&eü”¥Šv]ºYÉ7 ýBÿf¥j*ag2/,M–ÉZ x$ìp›Û¿©X¾…-‘£žp<;öÆUjŒU.˃眡WO¬hÌ®Už>´ü¨23x±R fÿœDã'¹Bh<Þ“„6¨t ‘ÎI(C¢Œ†¨Šs´ñÝkA‰tNâç$~gÁ9‰?hp8!MNbhüNµD–¥"iqž¢iq¢’±*T$“¨gôò9 K—(MY§th¡…IE²š +mÂï,P9T¡ÓHš‰juÅ×`ØÃôš£q ¿eWÅC$-Ê'%ìô’4}Éa©rü 2i§KŽmnŠàËTDÖˆôÇ6€ºäÙöGg;(’<ÛA¡#žÅ²€q!ÍÖ èV ˜çÅEz¦$|!}š' +ã>Td'¶+\@¡B;d×6‹«)Q¿&¬D™ü5̇&áS¦Õ +ßvP$ù¶ƒBŸø“+ísÛÜZòm;®ÐÐù–iüWÚXåÍõ‹MœÀ „PÁI‰A^hÐë€h¡ÍýšÁ¸<‡©<;.«àÉnåŲÄ!Eè‚BŸ± _´ŽèÍ7äü£ÔÕ´èÆúk¶Ÿ$ !”Fɾp‡½¸‰úf±ß¡kþ Š*|³þA :Ę¾¤ò³g ™ä""r!‡\ÐY^LyFø›èþ–ªÌ1¬‡ŽIü•ËøàëÁ1‰T(s²póI0§b+ðŸéše‰Ã„œ:>§ÝÀ"ß=fëÂ]À;XZg[w=¸€e¦MI»Dê%þ,K¢ñÓÔȻ٠÷@Ñ_œ=à­ ŒCÇ"_S?3ìÍö§Þ¸d<Ž©ÐMÍÝ8ÌÉì—ú ju~)+£xá,"©¸G¼Ia‰§}#†=XlyC +1’#*{u¹y´N€E!›$sº#ÿós¾PBŠ3i™ô§x”º/³2RB’G FÀ4Ä¥??L]îÈlÛT +>´ÔY | JrE”¹Vy‘0-±D¡ %ÂÀPc®’X +a4öt$“ÉúSýH¶Œ>(Š©€›_$/ß/ nÓ0´!¹$âr0?=É%½oíŒFCûÇU?^T‘9LdóÛq\r ˆ{WÌ”«êü_´näF +yRö`FèݲœÐ¼uþׇ&’ð2= #–ªÂ[ÆUÈ¢Úý$x ¯Î¾2ºd7RüêÒ']ô©K‡R{560TÏåV0kFÂ6ß1Ö#wœÚ2ÐE±R?Ѓ¸cã¿ÕñWÊéØ î½Ç˜)%Ug_ùJésPÝÿ$*Ñ'îʵ7bãð•þ]T¤1Óòþ~ó÷߆zEÆÄ?ÄP|ô£5¤%Ë¡?‡cMýýoL„чï9l­°>¸÷öñšPIJÁNɱ‚Œ¼>º`u‘†4†Ñ%<2<"¥²€Ò„0v` *¶C +Çz„&b½¥…B˜Že›ìÚ¹=X*‹÷aMŒ¡c ÑÏQ<ÑÍ?ƒn~‚nü‹JˆJTG @ (H#:ý‘dÒЗ¢„:œ°ô°ÁfÛJKL³ ¼ÁŽ£;‚Ä2Ðp3 +"¡…ÝêzÉ"Iã#°`(= h[›>‚òô¸! ‡ÐøPLd:âe "‚¨#hpÈ¢¢ ‡QûP¸ýóçeý3)ëï·Ð~ÑñŸFÇ?h)ŽÜQø4(MG +Ó‹‰ÄãR¦ÓË×*8~©ó-¶ Efli§Ù‹%3;ª~\êõ¼NSžæù·¶7[„Šªkã“ᚊ¢`5æ¯*x Ïq1lu̶i©K§^©~Pêuj¿CËPçîY½VñÎ*¥z­ù¼Õ©U÷¼olh–mµêTÛ<®ýîսΓWé}k”[õB³T®{¯¢¶:8ïÂïíV§'ÍXêЯC½lõkU¯Ëj­Àn,9»¾šH@Uå±Ð¬²1é»ñ˜€4yIòfÔêÄ`ê o¯AÁ׿±ûPýðµ¨Øó%§¯¿Á—]øðŠè¤)v{¯Äª@~ק¨wó7’Ž…ghÌÓ¬°QŽŸ\ÃäQ•ÌWÈ/ÓÓá°h•CuŠ?(2×àχØù$”èìÖht´ÜÄL$O­™ ×rXJ^² ҚDŽ–÷IÁìq) ½ÊJØ m…Ý[·•©è-Ia*?:†¶, û3²éñµJµ4‡Òx§Ù!²E/i¨>ÃPEXæêò*­óÑD¤7¼ÄÇžÏX<ñK3bЙ9g˜À,5~]&IÇÒË O.-̘¦aŠa…æ“­àDìÅ\Ã:¶Ê^½â{`K¡€RCç&,¼s‰¶MÆïÆÐEÛÂ0JN ŸØÓɨí2/7¡QºdÜL:v0Õh/õ´b±{9 ‹ãìš)n&…T3©© @¡Ò'àqÙË)*Ñ\DŠzïP*\ A‰pBØ9áªSZk¼F ‡AúèHÜÁœexÿÀ†5Ò‹(1)ö•CˆÔÐx®_†9ké`_å/?,±‚¸¬š²††9B-—Ö c€T|ˆ‡œ6>‡¢vø&ŸÙx^o²vˆ÷xG¶E×tþȘîØ +? +@eDrßLá•-ÛAïà)¨aò<^0ʦMÉiƒvW"jˆL%|9ÀB/ç ßsðŠì¹!Þ=ËÅÁéU¼í°·i†HRfcÆ#›z O猨ǒ2#ÂÙør‹\Ê]˜-༟3€. ö9å&0ì/•ÀÌ,‘¥?à“]üÁ¦ôÚ.ì5=p¶Lž© +[Ã|,µÅ*€2–ÆÃâ ÔñŠ‡Êã·Y.‹x†9âé¡16qM7f:i6†ƒaLs¦Ã£ªÁøH˦HNß1\ |w5Ät ŸÜ¢|5‘]P^mƒÁ ϶UÆ@¹Òð;]‘`ìšàõÄvKcE&b½ÍÚ(®N¥îÁEŠÅÑÝWLôL3Óø+S Ñ$1Ð=f\¤a°©áÅ㔉LöÊä"M‹åé61 ô€‹Â'ÐÂf×OM¼EaBŸ6¨}8ˆ©±ÈÐcd¦ÊnÅPö¦ÄTð!öÊ.ua–GE†™AÈö……,04–ñÉÂÇû4/§ˆ,ë‹£ qÑU6èÞЀOÛû[fè:¡íRzl ™£šéì'ÂÕÄG6¶ˆhñ—_X âírË`Á©»ÛnQèJê˜=³±ðÚ^Ÿ9 ePV$¼ÈeQ@\HL›"ý+.‹â†•MzHJSèò®ECu +)G, µI¡Â#ÑèˆÝødžã ˜Icá&2užÔ[ãyºP’éLÌ[.‹å(,06EEí $’Š:)·t%žM6êöÄÊaI IýWP=CZÂ.´´Š3lM›ð'ÈÔgÈÆÀ76M ø¬C^—ø”Jôfcbê‘ŒTƒ,—CÙê" D°XdÔÚIûF$ÅøK0Yߦ¨'°ï?#Š!ü"‚ÂÂôب?¸1@?LŸß,|;ÇÄx6kÀq0˜<š)ôöt‡‹ qe×Á‰¢µ«15ËA$sÉæä–¥ÃÃHk\°¢ÑÏ £cäèù1L‡‡KB”G.׊T&ö÷'€³káh¶à½uÓçbÃè@ U’™xËÙaºªÌ&>eEË–QÑ Ïí­ d6U<ÀP˜Žj*" °'Ã!!NÂkPV/€¹¤ YêH¯&=ñÖyb, ´Ãº½‹è=º‹ÑûH*)v(´‹!¢Rk6‹÷”›@Õ‰%ú@kèC ¡ƒH ‘IuùSdUdikŠÈ ¦²¨šÊŸ7ëØ ¤ý¤Ìp&³ˆiCY´ ÊÎ @œpDH¼O¯ù‰b\f;ä&TWpc¨CSañÇ``25UôÅëUÈ2:ûŠ`]>¦ª,òÐT\ºL¯Ût·Õåiiu—ÐGù/°Ef‰a,Øô(@ SfÙùj ’ÁWïaÓ.OºlcÞ=éV¬qprS±z ¡o1¨[G#®ª"Æ‘Þh0M Ÿ+³ôØèQrbšxš„ˆÌ¥™‚”JŽ(TkÉ%a±¨„†ÎD:½ŠªÆ×”#ŸK܆¢¡Š)9Iˆ$ÈfuyªLAZÌgÇBH*Øtrz°—ƒ?Ò±R*¦XV˜fŽz6syP¨¤êŠ˜÷‰sÔ +í§¨G+ GQF¦Ãðèèh%:L3"´De½L„ñ0,Óy®c +Ö R “£ãé‘3P@¾Â‡BãÕ%—‡œgïÁ ˆ`ŠÈüYð$–‹Æ•ÉnŒkJ%<š•æ’].=tt?Eåm¦G¨<Î+¡ â²ÃÕd$eÊLÏ(©h,T²EFá éw˜ß‰Y?,nFn#A <’®C+CâfáÌu4,¸&B2PߨŽô ºŒ]1§¤j±¨ìLéã¡â,f‰c ó¨;'Œ­”j3ÊÆIjâ’)+D]LSD.ÖYÀ{¬C&KIÂœœ6ÓÛpç œ1.Ž˜ÀBd û†žÖèì8 #•ñÃm%\FËH£v.Ž«1ßK‚á +%Ë\²›t”Šsm3rƒÞÙûz0È\–ñ_«TÈMç°2øýa4²j4¢ÈÿN><òÑÈD®kz…ÞRÕ}ÃMC+Ü‹:Ëߧa̼DŇ–;eªÌÊ3S¸B%ÝÅm‘ÈÀv¹Z€Ü€’˜ ÁÄ$$W²}J’™äðeÑèun ƒVÈ2©j +cÂÁxxnŠ!°ÍŸ"B" €‡PEƒLQõ½Ä…­Ž#9‘¤N p)RHJ•€aë<Ž Ú ¶¡q`º\• r}ÑAr@{‹¢É ï“Â…¡¶u¶y.ÏkaÈHrv9œÇ£éOQ¡ð±=†£sËäÙt-qHçPzd‹â¾kÌ÷ÆÎZ‚iJ³Wiˆ3ªÂj±<£E0×,XÕ™`DœMÝ¥G´*Qsü»ôfŒ9ÿ˜´péµ°Î)¿ýR˜Ók1G1ž-‘.O†šèLbáwÑ"Y¢‹(ž*׳|väPŽáœb/e11.iœPÂc`¥YžTÞ +µ T§ƒ& VÃ`ns|ÒQ†Šþ܃ǘ’ñlÔ*=äS‰ó“/K!‰€üYþ +Zµ„‡QÝÂ9}Ø ·c±=Éÿ᢯۵„ÿ³ëâÙ†™Ü\TE<,@#K5˜rÈ!~POÞphP¾c$>pK„˜"¨SÌË€vØ´ ñÌ#Π¾@™¸€ÓS(á9ê®<Ëž†/ía`K$§Ä׬*•ƒÛ¤òé=•ù| vËN{ih‡…óöÏèP‘ŠQC`” Õeú âv̞ˢбÓäç: Ïa @¶Ø¹2”™x^Šj‡Ch 1ï°N¾JJ£0W5cј] @¢8 +›/M—¦€jå–ÂÓe£¨PUæMµyp8P†lô!aj>>9š':xy@BߎÓÉ +ÚG¬ª£qÈÁ·™è›Ò —±Uµ0ÝåÀ£uzU¨£8ì5Gt» ÎòϹ=®ü)·ÇMüúxØjwjÍL:•bÅt§\þaâ°¿8ì—ãzþ•¿À +&’™j«ìŲ~÷%vPj–ž½Nì¨Sõ:s㋱s¥z½öÜ)µ_j^ó–¶3cí^:vŠ°4Xw.–šH†¨ã[„+ë±6u Ž¾–êïÖg}G«Rcêë¥Þ;]SKð±_yRG´D?jÂN¿„Fɽ”:•uQªÇR±¢5¼ÎøFùÚWÀ¿R£.ÂÕZmQ…cØ°¾¼f­;óJ¥¹Xšá UCþdL«²ñ%N$a®ðW‰QZAŒ™‹t}•%fÅ2;Ù°ºG-÷keà¹3¨i>"ΪÅRóïZÉ°íe°M•÷ +µØRì¢Ù,5¼jÌZŠ‰%-ÑS©¥=ÙQcÁ£Õÿ¤ÐÚb긅}ÿ<9E&Ǫ@혙&î‰Ãëš8F†Me:­A²t5âÿÆ.àÏÜ™Q«ö1~äÂ5M^l†‹9ѱßø¦‚¦-mè0`ðÏ(F±­‰¤Ìoñ+2`üÆmSÄŒé¿Ä»ÑCë>7¦h €Åðô„¦ÀAö§0uÖD”†]úŸOjÉ þZqP•LYh· ¼ø‹Æ v— ìí_µÞQ’&¡Äð%¢4 íýY|75¸ì`{g½ou¯;±´×lýÖ¤/ c&3ÍȈ¥C dг–2 ~õįK9®µkuà!Xz­cXéÓ%y•E°–.kÝèoØá`g½Råõ;zÈ–ºµŠ4V³Ú¯õ>Òte"¶t\êô†ôrÖë´^½ÏB£êGÞz”uu`«wêUZ VñGVÃ1Æ¢k⹕f9°Û`É8(A Ë0ÁèT]ÛU1œ3žmZ¶Š‚Ê4"¼ Ê"ß³PùøYÁ«´"J>6C#%øÇŽ]g†?ˆÔ0Š¤ÿ RÁ‘Xëº +Ëñžb+±‰XRš:ªÞ+1ZiL掑í`tÄa{ôôÔõzs4ÿíù$YÍt©úï#¨ïqdN†ú‹íbÇ +Ohª@íóZïG66¹ÓìÖÐtÃ*‹æÐm×KßØ×¹{/ =uäæ¨içû·Ç{+CDLrøîE`Ÿ­{`–~|ëÆâ=u,puø«\ e*/3X_ÐÈùÿ¥ˆˆ¸ð'Á·k/º^á«×<ªV =pˆBG£_.GaDQªÙ2 mRè^ Vª5Ll‡Í4底ø›ÅçÑÙ¬d?Gð¾‡ý—âÈÍ«ÊœPÑþüþ÷‚ÅÐþD°ü$>ùA@|L,~÷*}œý@m‡©1Õ6ÿTÀÿa­å¨ßûµ£â¶­ãƒw—EÅ1]CÃ;2®kÐETk5Ë„Ï®£¸xŠŠR_WmË°_⨺ôÁPÙ˜ +z¬9T-RXØ0ؾK/RþÑz‘`T¿´¢¿ZfZ¿Ô¢_H"!‰0Ų/ÃñÅ“lµ[ÐÿOÇó¯Ð"þ FMý¥GCý_jô«ÑYï«ÛÞzêý«é¿Û úa<ý~—ä›c—ð·x?ÿ½<ÃD¦¯ãÑͧÒ5%ECÁqñž^dÃkv2‹efW±ÿÇßb¥îëx›‹ÕÞ©×ûtm¦ÕI—Úà /q@˜YcA­ò 4±ä)@£ßý:[7ñ|w<,XE¬7Òú õõ1@Ø­§noŽ± ºôó¥ÙkãwCThÔkÿz9jÜä09ü¹âôM²æ;­vìì¥TmýöK´þÛDë?‰¾@ÿªË¸sƒÇqg¬ÈêäÎajø˜˜â̸\oV9sfÌø«×é…NÛ¥Z L_°UK×á¬òçæÿ^Nìf·Rï„ÝïzÇgûÙz¿ÎK«ó袠ÌkÐ-&[Ä ‡f¿‘kµk쮾/=:­^©ç=¢uý†e` j«QûÃÖ ï=w¿„ã;ÂQì$áÿuÌ¡Ðmó—xüÅ ‰Ç_ñ?(ÿaÒQÿKœ¿D#Ê5Lu㨶kŽŠáÕQ’Òd‚£«¥0ܵ­1CÒuþª#µ_ŒñcüËy >W2Ì_ìåï¿ÚæpÍâæMù*1À®£ÿb(¿Ê¿š¡üº+ûŠÒPtL˜Š EÇ Oÿž«Öt¹WûKñ矰û +ß +zúŸ¡þâÿ•Ç˜ÅV½Vzö·Î~fþ›3>‘ú,–ËÖÙ(ÇJQb·ä»FŽ‹B/¥™˜ÕmB]ÅŒ?–iÝÇÚ!}ÿEY \³Ó»E¯¤ zš‰‘t°«5;F9MS³ƒ`2†‚˜\0)AùÅ ÿLfHÏO™®»þÅ1ÄὟg¶ªµÙª3[õ_fëÿ“>ÖYª¶ú_:ë¿œEÿ“êj½Cu^Éð÷j·¥ßêßú^÷£;‹Ù ,WµTC5M£ú­š¶i(“–åºÏ]Í2]v$ÎŒ.—ãup0oVòÐ<¢Ä/ŸÆŸ*!(Rb,×ê4½N7¦ÅÚé»Ö¡JXh +Ö¹|¤Óï<ïŒ=ÿ×K»ÓŸû¬cTT¼!ÿ#1 ÿ;l¢_žÜ¿ëÝBi©_ïÝKÌî¬Öh×}f7bþM”Ãpà8tO‚EŠ-4«AœØwƒÍƒ± +Áã¸Ì‚EÙšjX4Š‹²0#§Iy,ƒ%r´lÅÀ\šé¸LŽc®ÓVÑO§[ªXFòVNtp?Gð¾þc"Z>q\ÜäÕK­ç±ß~îC5@M45–<¨uJÏ Ù¶²(ÏŽŸ'0»– +ð1lÌȨ öƒi€\ǵmMÇ°°E‰U˜œ‰igtšLM·̦©ÙéGª\ Ja²ÐhØXÍŸ,ªQÍïtMwc[k¦Ë®Ù:™éZ®áÀNäXŒ/fâB™ _]ºV±-Ø3ÍT sÃϨŠnÚ ”¹°ë˜×§)Cú Aˆ'}Çl¦lR*àíüµ`ZVi+-G1MWÅì¨<š–­c¦_Ð"m2…žØ0WEýÐaê¤*‡#£HúŠ|̉±ü:2Ùp3Œ $c@™£¦Ãra&Ù5Ëæ«È:PGEL¥TP°ÂVaV¦Žwè1Û.F4Öu þߥ£TJF¿ÁÕêÁœT¼•"faø«µ> 8 ’ +€Ó@4!xšЧ dŠÙ)ÐlÚ‰ÂØ m«FÄ.oµ€10.Uǵ«–&Hv«SúÖõ©õçò’Ü0søïþÛ[ƒJ@Ötö€‡Ò«3Ìȶ”¥©5„VÚÄUš Pu€ˆWÑ0[¯F¼„½U3eªÐG”„ xp^®?-39Ù +Ž¬Z„‡¦©CW¶¡!òP XzŠT¬#A#NMéðɬ€ÁF7B³ ’ÓÀ z˜s~pZŽ˜–騶©¨˜ZÝfE,Hµ€ë:ªiœãÚª†)‡¡Ð&œûÕÔ4`ðû´C¦s³ ãâàœlN@´¦jÃæè*&‚¶š†¦²”Œ™¦0µ¦jƒuA蘜NÁTå°ë.Ê •ðÊ”¡BUÌ…QI$2ãà¬,1+`Ö¶MY a&m ŠjàLŽØ7ô»ÜÆLx¬¼b“<3C¸Îp1¿œ‚J†ñpR¦˜”nY˜¶]Ñ>«u@þçFg1r0iÀPÕxDJk•­h˜º"ƒkØ4 1 èY,²ËbžO³##PtÍUt&“]ã É€KÁ†Ðc#JÒ*ýC¯BÒ‰JÂè=8 ]ñÙ"úR€Ù+˜˜‹1ø´¡(£Ó&ÜŹÈ‘lÕB• Ù¤ nbÎ@|N'‚âƒÓÐÄ4€)’ZŠ¸a²  Ìñƒ±íM\,1,@`H›…;€¯nD"`IXRc„b˜Ù f l†r‡b`"WE ¡$èDW- ݪ +SÜ3¬ä½=1…ÈÈvjÏ/½@h(LS¨ê°5ÉFО\³Òƒ¤”­Ù@k F`æ6îƒ ¥3}’¢»‰€ +W(‚*–Dp)˜%ž’ÜÐß½5^0>°7@QP½?1Ã'ˆ6 0èÜ5iª:þ†ä®™ EQ@ŽÙ0yнˆ[BKþjN101"P’a.*.ì¡ Ø„„¤;1ÕA f!ˆHçzº)¶£nB$00,2“,»DK gиšäL×2]ø¨àX07ÐÈ× ±AçR€[ƒägdn ƒ°"'¨Ò|"aÀ€:ª´—aˆƒTã"]Ãnh¤tê&fîvÀ´R9ï…™ƒ³A¤cæÛA¨“èŸ +Nà¤7Gg_4¹º‹Û²a¢ Œ°ß ÌP"ê¶Ê°WAý8¢Bù*)›i(Ú/fç•Ù­6R XCæuœõíSa†~O”}° es?Xe¨ûsàjC(èfº 9g0±i?’ÒEUØO,ùvóÿ`¬N«âu»0ÁJ¯Ô|®ƒù›¼ôð 6¶Õ©5ð+:Hµf©çUcG¨„…çðcì ÔyíÆî’¿Õz/17E¹ÿîæµr¹Õ„[^§ìuJsÑÔ{lôÑ«à€Ï·*ý†×ìåK½¦:ß)ËaÈ9„߯ö[Uoè+±äïz~N•z½N­Üï‰K™hëKBÿR­ÊK­^íxMVGDO¿âŸžŸ-19Óì>~-uº+R0o¹ê×R½/êbywD=º¢„飃 +F¨É0{T¿„xRÇï0hž­ž¶C3P.ŽPbZì9èUÆ©!uUPÌü]~¯ÛòPLÚ«4ƒw»õýïöê×TCÊß1»×ùêÅÎÆ +ÕZ¯$³)¼§ûÝ +^Ÿ+5¿–ºoNÞxÕZ¿;õ@eíóWLQåˆÆó/CñÕo  |œ&Ò‹ITÀÌpA^÷Å×› ›¥Ñ$¥;hqÔïµA™ßF „ÅÀäöKÍç>>b:nµ…>,Aï¬xËÕkíØy+&”¡áÒäª) ~Y*üÞnuz(`3]Xt×ç‹£¨Éã¸^jzôÊöIÚߊt3Dz{ y‡{p½Yë¾ÀF~€‰HÚôN³êý^¬uº½ïdY4(Mž±TiXÛ5¡]µÞëê2£ýð,ü&ñѵŸy•V³* k»ß³x°¤ä•ÛêǶŒY¿ƒ;öáø O@ +@’ògý2 r±ÕìuO‘Ð|Œ¥å¶ßi ³€ëƒtßû#›À(º»vÀCcvˆ¤¾²›¢`k’tÔ4+Hß•^mùXè3µïH™c&é¡]þÕ#Rü.òW7”vìÈ÷À A.µ}~°Þ®Øh0·ˆz¥z”6Ùi<(µÏ.‡VoVêýªº$²¼nÔ29%°!zµÊG&ÄíÞ7ÜþnTõlrž¿Â3_ÙTÆ-b«…— …ê^è¸ã „¶Õ0 3dôüX>ÅzocU7ÔÝ^ÆGéIÎÅeh¢íŠÝ) +7í5ã;ÛÃfÿN3>”óCi?8E“«>kÐö–ïJ—\xãG¾Ñm+}E•häˆúði¾ÓÊü¡V6o¥|W+5ìï}¯‘ |õ»R~hQÖPÔx§‘1ŒÄßk$÷ûZ9Q| ¹a@Ë÷Û€€èZd½èÄ?b‹ `„Õùc”z±–Øul«Z³Úú­;”÷Ëõ@åÿ=²4éç$2—±ëƒãášv«ý-–-U^Ñ9Ý´e°ÎE×cL8úÈS«^õ84’5,•zø áÊ1ÙÍÉ«€ùöFïJ˜Jîì,ÒW¨Êð}ŠÎšËæ3fëGH<©6y¾baSa`ÎÔ2ÝA[¶mkªùþ0ÃÖ*Õ /Û¯&›\£aË &4´$ .IaU"€ŒF] ;c™ÀÝÔÕXáøŒÛKü]Qv”¶È*“˜ãz⩬'ÊuiäÑUG˜Ñ’ýLŒ³™å³¡f+P®cµ&©±èô÷WLýŽYpØ™‹ Π7ƒn\ÿ`j`¥GÜ5{&{²a7´Úû°`Ç#p£hìÚÙ€Ÿž¿ôåf©&L÷–!9Ö€˜Ý¸ó’q ¢Õ{<¬ Yj#!FŒ;×j~e‡7Ç-Ð*¾ùëavþ°˜GµØi5™ku^Ñ]À wæáù1 Ù©‚6S{ª ÕóûèèT:žþhñãeaŠ˜XÓŒwp´òsõ†ïÓXÆļ}™J§U.õöKß($å÷Ãç¼ÕþÈ"#D]åwí,ž©7{üóc,‡W&“&ÊW?€’CoŒ ‚ñGáã¥+A),^¿o7˜SücúÂ(l•m¢lêC8ãÆ 0v$ƒü( +}pXÚ~°·šUÿ0hÄòØ(þUµ±½$ÇZªý¾ +M»ýNÅ`ÙR§û>(#·wÆUekª5_? ÁÖ^ye<Üæ”yþœ"ÊX¬÷âŪLÛu…Yýۋ׌u™5^jÊapcHq±R‹YŒ\À¿Û–&+·G‡;ûÖêÇÚ`êÄ·ò~m_ŒU…ãï4ŸZï×ÊÚˆ@ˆ1  + er¥6;7¯yQ‡Â†=æ@JkJ clßáFH6YN­Ä’P“©p9ßœhÅ.gÒ©7m³5aÖfÎr;;Ž™÷‡ñGcãhævaõjmv¥t½¸«Ï¥²›­ÆËòs3¾[Œ/&gsµRº;m]l¬©åÍ‹­õccyÿnö`³Ó¯ØÅ‚và$TØR”nþKþyQ™Þ\yHÏo®.¶»›Ý=mi"±¹²ïˆJ»½ìóöÉþæªáåjkë•|:=û<0Ô~õƳóÅIJýi«—ÿrŸ5>¥3Ö~7³sÖ{YX·¦úż1}•ýRŸ½šH䟔ÝòÐΦm÷ɾ<¹½ËœçÒ—£•ë-ßo®¾ï7—»éÆB~1Ñ/&·ªO Vñ3ì^þéþÊÎÖ7ë×ËOÙ—^îÅþ¤†Àñy&_Q÷ß6W7f¯X?0ånîáù¡ŸfÞò;Õx6å|™Îœ¥¦šl×¥j"á~I.T +ó$™{1WV3 }f!{¸øya37{QÌyýùõËÝ©—•J¥ôŠŸj …§ý6²ª,•ìNmúóría·š­'6fS…»~fÿlæ ç?·¹²û¢O$¬•ËûÍL³2ÛXX;XY²wk5Û^ê>é™NeG]x]Vý+ùÝî%€Ížõì+]©.×rK%Ø_õ`-™Zô²uû¸ÁVp³ŸØÌí¬N]]³ û²skM­Û¹ÖÃÂêeõvY+OÝS·ëÍ,hÝšŸÂ-¹µ®¬“&Âi=û:g¥8j^V÷õ~ê ¿TZ)Æ>up x ^¨ÊDB)Oîôya½¸Ê?­^öXõÜbá3ëL»Ñvu¯•…õõ¢–ßx^ãý\­­®T¿>ÐNú†þŽ²&*ewý ÜP“k§XÉ3¨ÌŒgój†õÉúRÉœç¿,䟖öÞ +¥ÒìtÖ*_œ¬nç×3ç/•^æxºr9×tØýŒ}3mªŸ +ן7ú>ˆÖ†Ðôá5èÌ©§;ÛbÃnZù§³B•à Ý–æÖ§V®Øaω£ºp™5®w‹›ÎË…±|pµA;䘵Ž›7¿¸m¹QP†.Ã]À‰m,v5‘XYXë'‹ùºšUvÍeø³¥ÔX?ëV¹µ¹rޛ̜ïöúƒ Œì¤w±ñ×8–{K×2Q8õO]¯˜œiÏå^¬ÓO…²²:Ÿ÷:EÅ;^[ñ'ÂÀác+󸫶­¦>‘R÷Òù/v‰Ñ>ÛPçì­±—9zÈsO»Ž¢î•«Å\µqCÌsÈleëÖÚUзÕÛ_û”Ý>ŸZ‹Ìa"³ðŽò[¯ †:YE£+OËW­ÁÙFëUàÓbo«=YvÝ…ã0‘•në)WëÖ,ä–©Ûcmnjg;XÕŠ·<ÓJ>Cô:XXÛý´+}¾>¦Ã¯‰ýù­Þcµ‘9û¼›_ª­%‹¬ƒ§Ùm+s~ÐzÞ¼<ß) ÎÉõDbuA)Üùàh[‡ZqÆZ¾†=ï»…ÊëÛŒ€¤^bŒyævvØãÚlæ´Þž—딶ýÍöéË|:³wsÖœHH,\üþ¸ynÏåößÎÕȘŸÉ?efB2à´X|œ‹¿Ð2€ç6= )³ù•ï>þþ’4Rëy¢[­Ââye  xr„}=½°¾féôkælq³™«ÕNª¸´8V9Ïïím§Š«sŽ~ŵ<Ï7YõóƒÍD¶¾«¤q¯nú´Ú¼±yé)¶ù©y¡ì%øSÍ*{j5Ã>íÞ¬¹ðézÊJ›r™úœn´á5K¼á^ò9'~Osî1µ­ÅTÆþ$ÛE¨·q +Ÿ¾äY¬Œ£¨í‚<=¬$÷C£4òÑ.¤Éû-v_«y>6%œôB£ÐTh™Ô#~Ëž±2Þ­ŠFÁÖQñ)º¿J°ÁQ¨Çäí†Ôz·w´ +•.6àÏmF%«ü°) ¸z"€ÁóÓì¡èå!ã¯%´Qc¶ö;6"² ´#´ø–L”W¿]p +ƒÕ ¾2|!ÌÁ‘Cs µø{^ËG¶„VÀ>‰Uñ_å¯0Ê(Äx->Å÷åU¨2ˆ³8ÊH`1x$8¤5cå¡@%ÜÖÜ. +L²LÖ†çwžÜ––{»ûƒAi_|p°Q»Ê`‡=²9$†‘ +‡;6C‘”­…v~ÿP _ä×ë„É°8ÞÆßø  #ÃçÜ¡!á4Q¥4=g‰O´ \[)Ðô^«} ü‹Îåž›ifNŸž÷@­ÜkGFæür¯YÜTÕ׉ÄVbëÔ3iIºIÿ$±Z|ìÏo®(Çñ…Âåõ¶e©iI´‚¨•$×›HaÀÔÁ ’i¦º`°ìe­YPýænGZSöʧýbFÞ%; ¼ 2&NkW± ©Å'#¿·ñfÈ£d½Ìióì"sÖÛiö—’á_ëÅM7ÑFÅé\`|±vnÏß2G¹ì1ê0\»j„(jaá•Jʆ½R¹8ÍØw»§ùÝÎüçadÌíûÌÞÕ èÉ|f‰×­î‘×áªß¾•±}—öm‡ôxÛa¼å€Ú…°°3Û¾¸÷öòO'ݳ¥Úñ- dá-Çôm]›¼o 4…&²1`(.YØ×™£bþËÕc®öÅZZyj$žA¿W&ëŸmû´ÚÂÉ¥ýˆ«±gõû +ÀdÞÙ“eaÍûþ€õüsjnƒ p¢¯Eíh6÷²p“[ª­¯-ó½ +Ã)d‹¼Ú§‹! FÞƒãm? ªO¡ó`ŸáíÓ+ìKîå.¾¼°¾õø(0ë> ;˜Þ˾,€jüÐì2zZ²¯ÚZ<øÁw(ËÕF]$UÚŸoX|CÆþ³GF)ÆǤÛNŸ,l\–ÞÄçöæÊÞÍ$˜/ñpßG™³­êØ—µŽ¶ywihÖ’}ÍC”{¢€m¼tû´Éî 0Uå¡]œw mµ¼¹r1›–œdšYŸ\yêÉœ_”n`€åºR¼ÛÔa6Û)Ÿ;G ·^l=ÂÕ¯y.¨WîìƒÔ«ËÅñô«hVf&_6¼³w©WšRï3`rqRÌ›Ÿ´…õ›ûùÁ?`åKÝîKÔ›Ý|!x¾¬[»ý|ú´šÚ\>üòꋨsk²ØÌq× _ªý֪嗮W6Ú'ušÚ7¦°LËïLÃÛ—õýstÓ…G¥yŸ:Ï?M$ +‹­ƒ~ÆÜÌÜ*Çõ¹ˆºÄ=“ωW`¨î¤Ý]:¼Ìœïo"º©Áɯ&7;)·Ÿ9>]º_®=8O°ãWó°/’zÃÄÑÚ`Ìþ<((wÅÇ•—¥è Úú[6ù9¾ù¶Qñ‚p¯ú§Ü~N«Û—‹¼ ¶ô±óé·T1Ùrç"?©åý-è—¯8åÃT¶ÞPž_^?YëËG7›+mW\¯‡û5mç¤5?²UY®VËoƒU>¥òŠûi¶˜ó¬×Ìy¾¤fëΔ£h‹oµÍ壓:m˜Äa°ˆÎ'Ö*×·@4ùƒÌéùæÛ nLusµµƒîær1Q²6¬ë­ÜaîrÃ×-._ìÕZå6¿S9=ÎWZo`ã¦â <”“brwcßݾ+ö¸Ì71 ˆ¶g­ìMgžòÏS÷†½ÜNç@ªÍ]‘Ö‡=y-DºÛÕ¹éÄ#b÷j¡¼ô©Ö¼ÙÌœó™é³âãÔ̬oá®ðð¥W!ä <·z…rv>9‘X>XÐo3çç3ñ²lìøÝîs/G‹}Æ„Å×»²=UÌeîAEÜܹ>–_<7}Ÿ!›­ûš)œgl÷ôÙ5>g°È¬2² + +‚šJs©æ⹯ž­é`%m¼n®®·¯@VÖ›ÊÌ.¼ìëlo7kÜL^l¯Ý³Z)WóB½$Ów8ÊëÎ!˜…–LwÖf ¥á.ú:a¹¦>&Â'7èbYuâ‡Å¹›ã^fïF­Jƒ®íVóÕ†»(ŸYÀÌ’Àå^Ÿþ˘pëó‹)QªzÁîÂaëKþÉÝ­çË󵄻ÿ¹³ZÌÔ›“äà ì>å-æ–îò{{«KLUÓNÎRÅ‚ú”,.gN'ņ^%óŸ/YkÅÌzÖJ´ÍüN©žà?õã9€Íý)òÒt~og2Ü2L@«‹ýã›â¦Ò{„=o–‹ñùELØ lãj@9úg à GêVŸOÎ1ãÒ>·ÄÙÕf"|úÆ°RLî42îËÝáT1|pVL´ `.WÞó¦žýd´ÈÕ ø(Xt†—±Ï¦røo{s5•ž: +VšÙBgñT*èƒ46õš1’Ù‹B²[¾GF¢F¥t?Ñá¦nFŽr¶ŸÕæžÎ‡v¡ÎîVÑdÞË´^ŽæeËi¥Ú ‹o,âûÎ÷[:À½Òò¥³­»­ÄÖ½øòÚ—*÷ö‹÷°û›Ó¤ŠÐ%êÉÖæA>}ô²*aíºµØ*ÎÏ-Z  0%6ëtظ⹕K~gí^È+•]Zqeq20àpLÛíêS1¹·åÊ›L¸zr7…?Ô3gåö³5kò9Û˜t¾HšÒævûMPe _h”+}µd¯œgÎúÚ @1;ùF­ b+Û€Ö­â烄;Z8Z^=ˆT÷§†o·Ð)·µT)”[Û©wêÏ\ÝJŸw&³…I@ “´ÃkØéštnéL¢»•¢@yz„MÜž•{çPHdbŸ_:³×Å™~ÛËý,X:`iK69Ui$à éB=ûåËñf~§zÒËï&“E<ÝaçF™z©AªQ¡7³#ïöAT^÷‡i°\íLUï3'ó !+ UfÇ»ýž²s»µ¡¾PP*çˇå~ñóƒÖ@ÓýÃôO2*­yY‰ý#38$”×[×ÉüÓL{ÊêíõÖŠõôRh”ÚÃâ3ìFwÞ^~X8Ãó …è¾èsM£”1fg[®zµ·”q¶º=¼6 +ÝNéz³;w=™ßÛ½Ë{«“Á†‘ÎÿÙýÔöq·d-—f>ÚÛº`\mo{÷©âæ¬w>Œ³ˆP‡†Á1ˆæÍÔ‹ã-nm}rÎï +åóÌUþÙœ©E¸—ϸÏò¥4ãS|K +´ :‚̽ܮ¾3Ç›íåƒn¿v ZÖ›êžæ+¹Òk~¾¶T±Wõ‚Wøô´SðÝ“Tå (þ¬ˆ²©”qRéIô…lÛ"ˆ²Ï?o/óý Kž€Æ1›Ê›™ŸçsÙוÕWP"=>ƒ;ëŸWƒ‹ŒòNO&³æ\q øXu9ÿ,qKþûù‡2‡ÝEæ´µÿÙZ›{•Mf„qvvu¿°xŸ{ßÒs–€²÷®[›ßÍ—¯½S ¶õí­›Çögâ‘>ùŒ€¼¿9ÜO¸ 9]ÌïÆŸy¬r[µ.ßž2$Š‰}{9Ò·_p¬8óé¹™jÝ/ëh¨ÿš³ú¬ƒÞáó­~ºýÙû4ç»Wf •þäƒs´­Ÿ»úâîJñqñr9²¿ŸóB+"¶Ãý|Î=¿gñÔÛ MÙï mmeZoÝ%¼Ýq”¿¯ÝLɧÕXÞ-]ë™Ñ' ÿg·Åí†ot5Îï.L™òÈõÞt¡R^¬â-‚+mƒ—6&gpãQ_[ yºïíÍ•‡T?sž³Áꬂ…½”*eZ¯LŽõ¢'3+›+÷Y»¹s®æïŸï5°÷Ïê›K¢3àÇU ¿Ú*,8¤ŠŠ3[ûíà:R:>ã^ZÖníÙ:OÝ|Ò +ñTvé¥Y-M»ÏW˜ë6rʪ¹Züvèea¾ò–W¦SMïf<7¯‚MИuÿ¢¼…žÓ„ªÿߺxÓ¨j±ÝV9vDw0»±<ÅÔ ½{ˆÍÔ,ñûŒ˜Q~“'w$Û n·²Ûyé/­r‹U‹¾”{¼ºŽw¬#!oÚ¥¦ˆO÷γ´a×kÍ×z·—®¡óVø›¸æk ӧłˆrÊH€¼´~Û®U‡¼X-}õúõ^­]÷Ä#ºÁ÷¢ª,ê¸ö»W‡þŸ¼Q3;š2®â,ö!Ý}­µËõRóuô%L¬FW©Kuê`×ê•ž=–½î#°…ü$µ5׎‡ï¾<\Tg|M|Oè¿!~oM¥ðÖ Çiˆ‘x-WƒwŸ?þø“Ça3íöêi~­¼ÍžË¹w\i·;i)UĘJ-)ȘíjÃ*b½—pø‘½Éµ’°þZ QþËw€H:ãíƒ0¹¦kŒš +½‰OwÆßÿ–ÁÕó¤;d®>„©Ø-ó£/©M»Ú€ŸëßÕˆÍËŸ¾êŒ‡HÝŽ1ŠªtƒHŒ—¤¹ü-Î8²)ó¤ãFeôÕ-×zÒ˜ð•:ì=éìa<âq—ð®É˜;vlº'þ1öÄ}KI +aºö÷vºÕîF«Gj”#¯Ôñ²›®«zÞ<djú©^k¿´:ðñ´QõZ iï?À“›ò›ô¡Öð£“#ÂJCª¼HŸ¥cW^9–kQzÓ»äÙÕÑñÝ\ì«ö‹lÀ>Ê›8|(š«Òø6æ T±Õ{'@` šÞs)ˆÛ<Œ ;äq±ä:OÍ^ºZowžZÍÞZi?7^Ó^ÃëaX¸—=é¡øP`@n¥ÒÁ놾Ž£áø€)@üQcv+íºxc1 ©±N›Çf=3¤ΖÇÐ7M­Œofpj§õ€™@¿øŒP"ÏwP”nºÔlŠàçÃÕªßýľYˆ°=0ˆx`Óƒ$T1„$ï,’@æPÐÈžŸúÍʘ!FòS´´Ó_‡É(K-¿÷HŠq§gÑáØ:"zÌðÇ— OKuOôõn½ñ|œ‹£žRc8¿¯Œy°0B)ÀcxOÕþhê ¦ÄžØŽ¯ ‚a4ß‚ +]çü7 s>–üÑûYÀH¨¼Ž{ë=w:Ñ7]CŸ¬BÍçšC‘‰ÑÆxʘÆÇé„\¯ÖGT­‹áî>Hc0ŠúB˨6ö£Øθ¡*Š¢ôΫÉ03¯$²¡ñumÙ]ûN}á1 ™ô ô€£`’¨Ü &äx™óqœ¡kñíGIðn¿Ü?Ðf¯Õ¯ÔUâ”gQPµûRwÜ;z¬äõÞ' Ôå˜ú%·l®Ì¿?°åwÞÖ‡;ïw=ñ>|¨Ù %Ã[W ¨¨é3„)‰’ÏiÜ;Îx<^è»Ç»ÙÇøÍúºž_:ÚvWŠ¥Dg-{öt0µ¯¯Æã+%>clŸn.möÜZñàîçè¦ÿBι?þø#ŸûœÇçg'ãñäîäDÂ1÷ GÿÀ(qm³s²£Â‡é~=ÏØ÷Ïuø8?“ÎVvÓÛ¢ù̼àïææåýÛ|˜¥¯…Ï•]üºB_³º³²_XåóO•eüZ¡¯çDoÇä$ö½šqŽ¿<Á§¹5üz>‘ØšMgáóYí—Bù\™,®æû™´¾¿1¯g—RÇ™ó·n¢XÈÎkëä}¡<½|K—ò{}ý@FÀÔѳ À_ÈLÅ_´üŽ~ å§o—•Ï—êéÌ´§;›^ÒÆú‚؉þ¥-ÆÍ»xâ›7ÿú‰J¿Nw4S“ç…G*„ÖP¼ ËœÝ{€âך¨;¹Œ»sô¿ìœ³µ [²'gŽ~w˜V·²7ŸN3§Õ™laiÊÀù$ÓÏo ùõ×µÂLëz~+{g}ξ.W7ßnjY •‚^Ï°_iùÕ™W¼ôÜ/®wŽ,k¯‚v·— +û*^z² +ûÅCKŸîWþøcéuw/¾°Þëؼ»ÌŸZ=W{ »q·žÆ“m»ð驘¥Ä¥½§Ãnܪ‘Ù¬ìt· +ee±ŸÙ»™z‚ü²M¹'·øZwo†lÖõlÝL”C/eÝ{$É“]y¿•9ëÇ_²íi+£vRøh·,Κîô|öà`=º¥l/ÿ þ#>5§¦âS`Å'«Û_âñü•8ÛÉÅã»=œç$ß«¹ùûÉøÜáõ[|~Ù'§}…œb“÷ømª˜l9ÊÖUª¾°Ù{vð§âv|&>9s¿ŸZÌƧµ…rÕ›Žëý +nάîÆ­Å©‡¸­>vâÎæw‹Æv|ù"þ_©T`‡âk3Wv|}}÷(¾q¹ößlª ñìò|>ž»zŒf:ÓñâñÛf|;Ѿ‹ïµ§â{©~&¾_J<Æ7æâÇ3ÖNü¤œ©ÅÏvŒø…r}¿ì™Œ_· ñOk/0ÊÝõ…8©ßÅ?Ÿ›‹ñòåéY¼zÝžŽ?U×÷ã/`ÈÇ_g”íxcùæ-Þ:JoÅß*WoñÞ¢¶=ß)õ'§ÚكəìÔÌdòåúbr!·¡L¦º‰Ï“ÊAieRW‰IóËòî¤s8›œ\YnÞM®Ï–V'7;7o“¹—Ó³ÉâÞ1¹s¿SŸÜ¿Û>š<ª“§õ“æäEïò|òF~î2õÉÉdzøãd¹#?­ìh“µ è 1Õ¾Ÿl;;0Joöšš<ëLOÍ/SsµòÕTêÌÚžRõgʜѦœF©;µúyåijóô˧©üáîÑÔö™RœÚ¿z]›:¾;1¦Î¿¬¥¦n¦æf§îÝöäTé¸Ô™òžÏS_´½/‰©æiîeª;“yžž<Úxšž]Ì=O/ÜO,ôgïêa©™°z™…ÄêáÌz"«<%¶^N^{ks‰3;½™¸™ì]'ê¯o‰ê—š•øòøù8Ñ~ª4fâÕ’13ûZ=™IÏ4Ú3†=¹2³|¬ÞÎlÖ2ɉÄÌ–u¹7spýÚœ9ŸY\›ùt²Už))5cæÙ3ogšù«ôL?5w5;Ó½Jͦ¼¥ëYãò>=»r²r7›Ýk³;GgÕÙã»õÙ«Z²=ûÐ9˜}²nfû;³½×Í à³ëkñdúɽNZ®µœ\ûâô’…âÊuò¸bò¼y6“¼»+U’ÕÝö~²žU¬d/»797›õ*sK¹…ã9{}nã¡›žÛzËwçŽÓ¯Õ¹ëÝÜÕÜçV|o®¶~£Ì½Õs>‘[˜OÏÜNÍ[÷ù·ùmãu~[ŸöæOfZ¥ù›–÷0öÍÝükíþv¾×z¼]˜›{¾_ÐœÖãÂÊödy!ÿYyZ8\Ì×®®; ¥ÉnbáË“^èMžÚ‰ÅäãTvQ+î.®¦Z·‹…n±¶xTéN-ÞÜë‹•Ïza±Q~½JM6Ï_S©ÄúBÊ^NeR™Ã·«Ô^ý©•º4ïôÔ绫ƒÔkúô%Õþ¤¤²·ik¦\Oo¾´a”ôÞeò*}¹¿:.í]l§ë»ÍúÒ䮾º”:=-/9Õ)s)×ß~X:ZîéKŸ.v–Í¥·ã‡²’LfVýbêUÙ0KEe·w<¥\>篔ò‰n*MWMì$÷'ªz8·¤®Í½¨;%å@½hÙšZVs-µ¹}|©%ÞjM[›]ÐÖ[…º¶—{¸Ñ®çÓ[˜[¶ö¶?5«ÏåÏšºeÌ}Ösæç ýØÎîê÷îô¦þeÿÙ1&¯Ž”‰„±ÔË-k«öŒ±{³0i\ÏO÷ ïfºktõ鮹ð:ß3Ý+{ÒÜÊåæÅÒÑœYI=+æÛâ¼mÍÏg7,Gý¼m³KgÖùéÿoï;·’iº¯€{IƒQŬ(&DÅð˜ç;g~œkŸ½«Suwu ÌYkηÞç(l+ìÚ9Tv•‡Ì‡ò«w–Ôܤ¨zö©ú¬q·w©¶Ë»ú4øΩÃ'Ô-û‡ÚZ³ù£íU¶%íª¼z ½ímþÓ7]èïéÛKíý¸öº¦ß÷ßµµå•Ü[çxe¥>Ÿ™µÑXéô_VÞÎÖ«‰ÔêâÞÇ÷ªTiÔW«Õôpõ¬zÛZ}ºØM¯ŽzÜÅ—Y×6+ÿÞÖŽ^wÖzÚMví÷ùê~½°Ñ©¬—sOÙõƒÞëãz·½¸·þ³+‹ååÆÞ ¼^}¸-ìåvÊÝ«}8ýòÏÛÏÒF¡Pyß( n7ZG½úrucðÓÓ7K‡Òæ–*¦7O3©äæÓçûÏVòîö}Kì]¿mÕž:/[/Ï[ÿÒ½×íôÚû¿mýøïs{ï‡lßm7¶ùDªR<ȉ•-¡U®œŽF»•ç‡F»ºxù÷TU†ÕÝÃb±z{ñºUý¹ß?­•–Êoµm-—­ß$·jo¹ÏN=}ñoX_-½êõƒþûyýáp4l$W²ë ¹ Ý5v²0Kã6õ¸ßøÍgMNß«4«Gƒ÷æåk­ÜüÌ}¼ì,Ÿí•w¶²Ù;çוzc°›ývËý…üîéÙëíîk»_ÞË^÷Ö¯îÚ{àè /ßF­Œ6è´Ö»Âv"Õ:MoåZ¯íëûY>ÙÞ/¿mWöÏÎß„ý۫Ƀ¼úòz°¥Ô®.ä…ƒƒÏµ›êaq¿¾zX½ã„Ãëù¿åÃßÚ{úHxí-ílÜüuGw£ãäíóß±Vÿž?>Ô3©Dêø9¯dO2¥#îdCü§ž´µÒÆÉçÁùîi©¿t~Ú(<œÞfÎ’ó7ù3ílcíìh%sxö2z~8Ï=¶η¯÷VίN7Ïg«ïmùnoï¿–÷ÛÏKµÙíS)‘ºØzy>¿¸ÒRóƒçríRiÞþ»<ÌgV/_Þ÷;ùûEµS½=èÜ^ ÚU²÷ö|µòÚÚ¸:[^ù¾ú¬e[×üó0w½'¾Ü]?Ý=”o²ëÉ›Jêíêææá§|›¼-.%R·«+·çǧ­Ûï³õNê) w‡É«ç»75wÞ-žŸ×º;^í>^¾æï³ÒÎß}å‹¿¿»=öwnz›í‹ÞÕæÑiïoçèøaõäèè¡ýÔ>zäNµƒQ;‘z<ò×ß{;½'eùåßÓñ#7xúl_gûÒ.'÷Ö¯¶û•Õ“g±ùûø|xqù÷üþ¼)¾ˆ‚¸órxºÔ}—3ù*­¾•>Û¯ïƒÁ›t“]};>_¹~û:hõùO9zÜùwz“ÿü÷ó²³þ®/}<½·«[êûðßOïc­v¬}tþøþçüågùssíôóóN¨ï~¥3zú«–æo¾KÜú÷²Z}ï6Å‹ïׇòÚÀ.üvï¾óÉÝDêW»/Ë¿;½ùAR,ö›ÅÛö ›SÃlêYwÕYøüUªØ‚~;ȸ´·1è=aæf®÷õd^€ö|ñG-¼Nok`üy!ÉwË’k&ãòßq§2þ*z®‰ß*“‹W@QuÐûÿ¾fûk|Õ,äëýo¼w­ûÓ½z/sö û/ÔÓ«þ´þj"µµ£wk_OöËHpzø!Ïw·û/o_ˆë»¹ùŠþ„ŠÈ—å{5¿Ñ~(q¥ü~!¿ñ:ñ'AZ;^í/ŽíŸÈ«âÆÙh»ú¬7Þ› 'ë½ê3×)Ûß +ùõå5™›ëÉB)}Æ|¾ü¾ŽÏ•ž\~}ƒ¯îŸÁ1ù[9M.ï_V“n_àJë ™^NV²ÇÒPîÃâªïÒÆá}YÜÖD øÏ+rÍ éev¾åšÝ~%‘€ÆzØZþ9ØÝÜÓ‡e­¹vQ¬_IíÚà披^Õ;gõõ­õG>·¥~q¥Ãþ9¶p ÜîÑI…kÞË%á>Ù<ä—Ó¯mz!Òò þ´ v³E0V}/ëÍÅž “·éª.ÏW= ÅÒPk Í;øµñs§já³5 V‡íÁ͇¶Ç•¤Säª/kX­‘º73øCþ —rè`yp[ÉmÅ–ö—/7’KÚȤÒ÷ÉéWФw€±Ûîë©3­kÒõ{ù7÷Ã1'½S®Ž‚&m.|<”®œI±DÛ™v-y=\hwŽØ“¯§Ë+•ë]Ö¤ùÕGi-`RÆÜ↴ÏÞ«Ô¹äê\nŸ9é|ýIYTO²¬I¹úÙEՙ΅žVYHnmMzÏ5®ÎÙ“6 +›é‡â%kR8—›=Åœö(öœª¸:úx"“I>ÔܧÚÜ +»8iÖ¦Åki}¿’‡I¥ïDÊGJwkõÀIåÃùQФ½ÁÝRªÍš4‘‚¿­?*_iE$Óz'nÝŠA“6¥ïëÎ7{ÒµùÌ0­. Ȥ¤ €žvðwϧ²™ë[Ö¤ùµÕ“ * ¿W*kR”0Rçš«ï­1<_ÿÔSÒAõ˜5)Wÿ~Û œtiÿ°ß “‚ûãÝ«Ôésã…+ö©\p©÷Rû&U<“Ó®…ÞN!ãL +®N+ÿ¾Ÿž{­Ý¼×]“^•¹ÖŽ.â¤9ßN›ï¿ª´½!±&åZŸÏ}2)JK×´dRm¿v÷4éwøqxÊžt/}µW,~<“Â,dÚÓ}Qeí•LÚjH{RÀ¤×w¶sš ˜ôotÚj\ƒûÃÜk›½NzÖ?(½MºÃµïÒeϤ0‹1mKO·3Ƀ 椅öRà¤[™Õ… I߸«åuüì½ìôÿ%s椷óû“¾¯|¤w=“â,Æ´7ÜÝÝ–Äžô0?ÿ“ñÎœô^¼ÌN:߹˕ˆFfìu-™ êGï8iÞÇ4‡Âf~^[{„IW~½2éÿj›“¾ë92©©÷É´¿]õs@&mŸiºœ=ʯ|j8鲟SÏJ©Ã·ý˜tsèÝiíà‡®4¦mä=¢0Å-v ¦nG+»nñpÌÕjçuœ´è„©dºŸQ;0iýL +ZÌ…ë¥Â…1é¿WðL:¶{fˆqã¼Õ¢'F_I¡2zÄI9ßNÛâ ¸?—ÕµL»›ô"x0¨å-­zôéù6)è;ÏÁߊ;ç[Ÿ˗׿?ÿDïÒ ð[®¶ö´l}{úå—0­Íæµõ}Û'à['gÝoŸîƒ¿ÝO~¼Ø§Ïú^Z,{ø÷þ/øÛÓ¶®;ßú0ƾֶƒÿúìäû0ðÛÁhY°”Z£ÃÉísõ×úþÆËh\û¥òüíÅâÑbÈ·ÊMÆÁãûæk5øÛ+ù:üíí{æÐùÖ±»Œtü×w/wýÀoA¹—ˬoMŒñR»Ð þëõâóyð·Ûº${P¿C0Æþ®¬~»²ôóÝ ü6¹”¯ÈÖ·ÝcÉÅýò»õýƒWö%®úéþöÇ㡘9±Ð%ÓK*ÿd×~@>í™Â§w²mþt¿»a{Íõ³ê;_Ù.í^Tú»§Õüé™VH.ýÁO£ÍÒ(]©_ÞÔŸï XH;ZŒr€JoëY8ÆùHô—ìÌ éõ£‚a{¡ŸCí´¼ ¦aìÝO"ZÑÏéÐöXi_ûJƒ|ù‡jÉëy5)Hô>pRâçLª,$RèéÜ:Óº&íÜN +¦í<)ú9.JvO‹žÎ‹5iマt-™¥'•NiôÉ5éÓÒÒ‚3)xhÿÛÓŠ®IåW´þ?Ø“JÙÛàIçë½¢ËsOK¬ÿ€IÁëÿ>`ÒN7pRØË|cQ Ü+±þ&ÓlŠ^Ф'Τ†ÕçBðÁ^;xR´)ܤ´ˆß.Û?Ls)·^òž~¤XábŒÈÝçV¶ÂáLiIŒ-G^`I2þƹJì8a™²Þ¸¬é nÑ"z^åå‰Áÿ3þ©rÛ]?Æ$Ñ1~vâp UÎæ·¿‡Æà§*Æ jdf`‚éÏà×¥±ùÿrÖ†lN@­çhéÇ9ݤcO ô¸]9•rþ)ÿdžÎL‹™ŒBÇ”ºùk¹âzdÉÛ¥×~5…ÿ,ØØɱ"s°ƒë*ß[L7m +N´—\®¥Ì–÷¿Y‹r-©> ]Ò¿|Î/ã?צÍoÆ\Ì•RHßÈÔö‘nþÓ»¬:^µg _p‡ââê^ËÙ!{øOÔù¥çY燧ï:AäÏ Ú§aì×±ÎÏŒ°Nëÿë·ÇAV01À^úÃ÷‹¨Ábû7_»6XxO¤Æ¥¬Õb Îñà˜óÝÁl8‡{®-JžYÑS»)çÜ¢§æˆ‹÷íýyå ö‚]ÄÓ?*.F™w5ô¦w¨¿ö®¦û—Ù¾¿l㎙ \yWnÿ¶÷Ø‚›É•F<Ž±µÂ®ŒØÚÆÊñ~ÈÖ Ê.râ––å›ÇÂvÕØ[2OŸAìµ›jÁ³!ZòÇÞºs4Ûlè¢ó%üçÄÔ/~"¿«qÏü|g|ÄxÐâhi#váÖÓÛ“lÖ÷KÖÖ {°í+}7@å›C%RÁƒyø®7ßÈ»ù®îUùA\—ˆTÂ_8ß•ÞV–É?¦ $™Y˜” íÎGhÊ8P*úí£ºOÚçB¾ßäú£ó’oeb–I°½ù}!p“¥×ïüºcƒ9 9ÃRtI#Ê +s‰ÃNf +jð¹íu¶A`‹£K‹½k£pÅã| 0,þ`†ýj=5¼rÚ¬­vͼsQýù ]¹i¯&֒Р Ô•‡'¶ˆPäü ºH›Ÿ×SžŸ;ce «]˜1´ ƒ‡x¯ÓV +_Wb¬Á¸YbŒŸÆ„YbLœc¦Z6 mÙ︾4¹§t¯î•$âXÇÂöåSr° Ú 96ÚHÆ6°Ù\ùÒt{âÓpåhcqLG™äc™4¶}9JMƒ\Í’g5l{,;\¿×=é*œî¥Áɱârðкˆ\ +c!ŒëY˶„¥xlˉBqª™ã‹ð {ó£CE5Iè:© miRzžQfdŽ¸‘©€Å¯+Ôjo‡/£¸´hØ0Ì°`çßN sÍv­-ñ ör;ü Ôñ,8xIÀö÷c +°"Ô2KØ0·£ÌÒlö'n´Ïös™ +é€ò×Hì¥Ú[~‡$õ&Ü] EvÈ=§/Ljgøä@û#'¬hy“#KŠA ‰˜ÈŠÅâlbwåÅ6øÝ¡‡ÅÅEýç/ÚI‹ˆ.‘Éç®›Å'ˆ%ˆ‹+™ÅÀÕ$Rã8»Þ,;à ɲ$ÿç®Û‚ŸlkRÆÙš‹+ƒ¬…xÕrhxÃÞ‹‡ÜùÝ?·K9цô_ÑcÁ²£t¡qŸ]’Ü÷I¤"ó¼’¹Š ×  Ø ‰Ø°D+Òà6¥K~Súg1FÓ‘˜ÒâÆy~!‚_¢‰êg/$'©]Å•ãtŒ¸-Ëöomez~ùÙ#:0.³52,%ÅÇÙUï9zÏÆØDòª¼ HG8ᘒî4Ú$Т$R1mËîù]%/ıe1Yå®ß86> åºDl¾C!œŸ"¨¸%öHá²/®¶Ã¡V†qø%F¼[M-“/O'LRxN ³Û«f{|(ÇJÓz|#—_|m]M‘ˆ¯ {ó“²£_./faßé1táøZ Ç ³ïãj1g +ûžÅÒ…¡µp1ÆqÛ÷Aº0(ËC³áE m® Ý9¾ûl¡ /ã–#êBÇRêB´!]‡Ã¸Ä@]Ó•I¤WF#ÓaÈ ˆE&}¶(ÞN¤bp7 öƒ!ƒy›Ž*À`ïÁQôqÄö¥‡Á=˹ìbÙ¼v•3æ„ÌP ]Q™GüJXTˆÉmjzÕÒÃУ–È,ÃÙ„{Ñ¥d"M«ÏS»y$à  Ÿ¹Œ˜R ±tfXm ƒM–½a®kƒßkÍ&Bò0ŒO¶Ng ¨Bij,Å*¾%ƒ˜XOÀ…Ä`]ÁNWx–H¤&’½ Æ5Ù¢¥²= W·œú|ý¬V¯êíÓDj³4ÚnÕwëÝizèÂ;è<·7LÜCÞAgdx§ï¡ ï #ý•3è¡ ï sw NÞCÞA—Hͦ‡.¼ƒÎ×-8a]xHË™ôÐ…wÐù»'ë¡ ï sULÑCÞAçÎ$š?MÐC™¯œ¾‡ÎSì××V |nký'Úí¥íºà¬N¡áY’[‹E.ÊZR%¼ŸhÁ%ÞÕŸ€*‚òÑÒp6Å°ŒHo4ž|ÛªWۻΊÂÅÂÓix™O9qì,s+zi¬&^Þé—;Ç7 =EÕaû‹î 뜋»?#¦TõE®Æ@ºgI¬â>wf$6Ò#"W¡ü2NÓ\ÙÌ$W_µ-Œ½ãm’7êwWóˆVFwmÜ¢èN!77—ˆÃÖ:1Z‰"¶–HU Ôì‘øOÄlv‹ŠLjôb³ÛÔ¡ªÎòO¨Í1Á ‡p7„EÉÕà‚›>»+gZ°.#¢WòÉc‰‡ºÇéeDHâ¹½dIq[L‘M¦Âo˜‘+pæX€¬Â€83wM¢¢÷¶L~׳1'`W—^‰Mw Ž×Æ0»O7²Ï}uÁ„¢•ôñéý/Hº™­iîJGO üÍ…¸¤…À%9Gç9¿À>>w3ìj†ˆóÃfhÏ{lþ|j„÷Ķ僅߂0«> ¿aœu¡N™ÆB;fÆÅXH*d|Œy$Úx›ô~Gå_RÓëêžÙ¾¼ÏpdóÕ¨Lµd³;†f"ª[Î3#/6Ú`Þ%BqtÉ“"¤óöåï¢;+:±³× wö¬lBXµéÍa»úAø«BN:°-,¢Á†œ™ã ¢“aHŸ¸Û¤as6¸Eó~4:b¹p!YO—\´z ÊI¼4+#ù<ÓŽdä:ÿí+2´ÇÊmGwúDÙ%G´E´Ç¹¥ŽÏ€´oŸËÔ‚õùxöØí(åeÊ‹ãwbp¼;ÿˆ§Q>= žœÎ±Dj¼ðÎdq‰ÔX‹/"c/Éé55VD&dIÞ;U¦ÀS¬ˆL€—äŽÈˆ‹ú{É‘Ù+"cß8ÍìùšŸ6lñ¹Ky´çÐgÀï-Å‹]ÄhÏY\áÓnÍñ+?w§ŽÈ`3ð0Þ}J»Fd<©Ø†6mD†tç¹#2AwÜE!F«9'‘ +*vÙ oÏ«9÷²r4òö¡nœ§"ªiâË`Ë-Lß“¸·’ª¹ +òZ~ö¦¾7ÌÖÈ+Ç™éÛЂJöHD1&…®'c•.øé“®Æ3] ÖWç+šeZ‘}uãÖ®û½$DL¬’ÈZ Ä‹’c–­gyÔÓèûúâåÊâöÃEÜ×7£~8#—ä툛u?Üø46I?«B;ÙfÛ7M…jü~¸°ŽÔÙõáÇ7‹Nðð~8·´ lÚ~8ûV˜­“õÃÔÀϸÎï‰G–ôMÐÝY+­SñÝW¿"GT~ïj—‡‘pò«Iwö=½Øtt³å1E­NÆ¥aý/ø•$VÉ­ï.5·ËÈ]W£®ý÷ëë w¬ŽÒuz“?úEìà1j®‚[{Ü&pdÍÕ,^’cY¿T.iF/É•ïÈM…«Æ/‘ ¯‡ÁwÑr.£®/üÝ·™="XÙyènŠ6%ã™»©#Š±ž¹KÄ*C™ö™;»ÎüæCwS{Vßž7n01¬ÁÆì³7ÎÕͯ^“›™Û ,gkÙZ…1éÜ–÷DµÖpæýq¯ágµÑys|>P§6¢+m/°ìp¬"2bóc›á/lEõõºi£l¼•– ßuNΆ®Q°·zãDõÅ})oº~"祼`6œþ…;¦„‰ù‚uüî&¸Õ»ŸNb\Ž%Ç.f×X{AÌ¿LÞX{îUÇ}ëùæwšû©¨ÎÇ kaV4kÌš+cœ±#˜¾Ø¸1Îôµ0Jè½pãõ·ãsyÁ‰h³´Æ¨T‰ÙÆÔøÙ>‹Žk%R1ØvuøÐzœ&&·[Éļ6=FSwà=—‰/ž#ƒE»í‰˜Ž{w+L·tcL™_ 'Ù.ŒáW®Ë±š˜ÌYB5ýEú”—”¶/;o«÷¢ã‰ Có¥¼Ùõ¸vX®Žg1nëöå{xÑ,•±1Ï%¸ÇÕ[µ1ÑÕTæ=W0Ø(†eÆé°:\'~)/îs¡·7à‹t3yîÑêHE«c°cymkȬ!1íHlTJæöVyÒ¤‡m}§ÉåîÓY2w¶¥àOGfoß^WæJ—睊xÖ¿ßéÅYÑ%§s +»×’™àÇß´£GãÓýÌ]zñû‡Vt®wØ2‹'ï´'înM» {qî®8)WßVY“&RÆCw_âj7¨ ï.dÒFRž´Ñt¨È•· oáWù» jM é‡ÓŽ7O¨IíÖ4Àér\ý8jÓ_s›¹Ÿ &¼àÎ?@ï çÒbÞÞ¿ÛfPá²z/µ‚&í±&%õÁÜ +k¯féËîBà¤É›å<½ËdRªƒÛ½×%Ï©"kÈôä'«óï)\"5ÔúqFœ?\OÆ€üußSTüÄ dŸÙi±.üõrÆ£:Ãܧƶó¼hà±V–>=ù _ìtŠWÌ~Æ, +îþ¡¯Vc¾b÷•¯Èc¬D—‘å nm«´*ÐÒ%÷/E˜Æ$žŽ˜hÌJÈP<¥#ßnˆÝ•6^iUHX>ª+m zZ]ß_ÜÚlq (ÙŒ±?W,ª8>ÒÙKrU|xnléܬø…U§e ®svm¬GXu–¿|o¦(ó bÌeoÿË1ØÚXÁ­ð·Ÿîj³É[ݵó1|Öˆ­…Þe3>ÖYþ™&®e½‘Z»©ÆIîF¾¨ÇŽ,SÒ2^àD—кu% fVW6âPv•#÷InûJÿ]quOÉ43[KÂôæ/ÿfä#×gsË"‰ócË]pÕÜx€:ë*|úu¹A;wº-ï/ xj°n]ðÄùãv·iÁ¯ôƺ#‚*>öF+'o$óß?6EûQ ñFߣèÄðBºG»AJ-†5î^”KÞG´†6.F÷ïÇnåüŠè¡2cã±Z9ubƒ·ƒ»‘w¿lÊç¹oó˜¯3Œý®ßøª“¼ëÇjGŒ®…÷]¿(JžÍ»~áŠ.‘Z‹û®_Œ®´¼ëgõo±_õóÆù'}×o|›ä]?V;â,zÞÝïú…ýß´OÙZïñÍâ]¿ðÆw;c5å»~áenì[hÆ×/ÜSó×ZOö®›£­Wý¢û^ã½ëŽJ'“8Ý»~á× Ÿ›2Ù»~ãt¥ÍªïÁûª_ m9æ»~Óð~üwýBÛ$óTGêTã„ßâ1Æ{|3xǪ?å»~Î(¬´•í%Mù®_ø«~ïOÿ®_x¬ ‘šÍ»~AÄn¼êÚ14Æ»~áùf¦›à]¿qª&×® ö¿ê7ù{|ã<®ößlH‚L8åí ö»~!ñ/G¿„›ö1ÞõïFIßõ w¨m 3å»~vÿ³Á„ö^ㆤYïú…›9¤Þrïú…¿ê7›÷ø¢ºpã¾Ç7]4Ëyoºwý¬QØ]¸cÕ\1Þõ‹× ÏŒOð®_x3¼ñ^ÒôïúhnóU¿ 96î»~á¯úQ™÷©Þõ wÛÙç2þ»~á¯úM·tc,^%ä”ïú±zž‚{'}×¹$ÛûŽºm>î»~~Ã~Õ/°WtÌwýK‰‚D*°ºŽFeä»~á ±{lâwýX½hNø84¢8Æ»~Ñݵ³x×/<¹@ßÛ3Í»~62_õ ª·÷]¿0Š ¢£¡¾ú¯ ®Àg/Á]ÝãÚ”´ô„v9Fh÷:,´RxoÄ-Ý‹uO•p…Žaݧ>\l&›]ClfY-Ä;úv0êñE±÷­©’Kµ‹í‹$|vúc‚tû•Á`]Ø.Ÿßv2ÉÔ—*%Ó+\=™û>=N ++§ûùÕ•í|y}€õüç{¯i®vð#ru½¶ÉÕoo›\cùï„k©Û×\ëúê‘ÛÏ ‹ÜéjZæN»ÛÜù¿‡'®þzåÚ-þ—kÿì.rUîöð}»/¹îNዻϤ¸ûµ»,öWÒƒáÖ­2~/í þVF×Ã…Ÿíç¢ØÒþÌÎΗ’NîŸo§5ÓK÷ÚWgåůA©¾$H݃ôýéŠ6¶ûXÈŸÕÒåãµ¾’·©t³S+¨­¥p$ù:¶½’ƒ·ÛRêðmÿ„˜û ¶§»K³oz2ÿ!»ž€l É+‚ùµµÂ +h1²:`ÃKÜý~æ8|§ùÕG þ–Û(sõ³‹:×Xø> µ‹'ÒIjw¤JÙ³üz©@^£œ7zkµ¥Áðæ{?[ðì—8ìS^ÿIQ‘U’0£­-Ýå¿°0‘»­ÿáÛ˜—Æó™Ëû—ÉL¡7-¶»øÏ*>©y”,”–îme|kóÒÔqqŽ´_²ªÓû£MœÖÖçwk¸µwqq—¯.§þê™æÎx Ÿ7õnözxº#£Å±ˆîû…‚á9•å›!þZ2%±ÜLÛ?áë åúßFƒðYfÎèû½Œ¿.›¿VŠEüµhÿa)_k_6q57âFûg»òÖ+ñ\©,eê5a¼—u–‰VŸ>êm®¶’ü*Oí`¹•´¿(Ð_Ü©}û g¾[Ð4/[Ö|‡¼ƒb)¥>¸Rc=ç|Êç*üª Þ¨,S_ô+ëÖ;ElŽÌînòˆ¬,HÐðÅ O~7ΓðëÑf.‘²‡è•ŸÖ ¾sÀ>ýmB6(5¤ Øçp ‡%¼Zn™ÔI¯çdØœ¸¨Žà×k±´ú.Âßžåóå…µ²—…W^•úáö‡¶ QbÙÑìJ36äücD¬@W]íIMRÝq|ƒßÌÀO=ÞúéIpà@PœÀþFÿ$Ó§×#Úõ\¶¼ª¶ óûõûý”NTµ¸ÔªÜn#/ÃYÝ*&/^r ”áඕG; +'´VèlvL¹™=¸Ê€ LƒÜü[!—4“ËÙ3†Ü\¤ìä%CnG¶ÞÉ¡L³•!,g‰°Ó¤÷‹œðœŽ$DVE]wd‘&JK,ïÿëç‰Lnf6ççô/6Î4áŸÎwÇN éÍä-9x™ËÄm+{m§ôv9*qˆ·å•<Ñ9 Çj»ì˜ˆÔƒ=ÏéãWç0‹ +Ò¤¬fí½5Y ¼ž§>ëÍï€J,WMgÐD|ßþ˜ÿª;R•ìe,<µÝ¬Ü¿o=Ñr¼±’EÚØÇ£S²4ÞÀbã<£Á©½ÂßÊo¼Hˆ±ƒ¢ñksq³TÝ]ûæ`”CÎcYZf7ÎrðOþ+Úþ£,F_8ÅyÍÄÛÚNˆj±v'ƒé{2ÂW­]·7 m" ”µô¨íQö&ù,9Ê íŽÜ¯0æM®Q”š[ŸÜSê« +ÖãwŽ6 ‰E¹V0|{by +½#:Ö…q?Aj{±j ð¸äy·‡Ø.QCðõËo;ÅÛ&Ûçñ}ïÒ[ù¼FL`$´2¡së³ö¯õYg€ÞëáW^\\[»'KHÎÁ¼¹k㦠°íŒg³W?O¸R½›Ä/. cÊÓ„!ÂȆÀ#/E»nè+¾à‹d¡ä‹lfãúÃeßËYã Dõðݼ®Aøã«ÌÁÃ}®tØŸ7¬¾ŽûvŽ¬ƒ±Ëäw©fÜ—0Øî\<Ù—ŒÜ«H c5´ïÃÿØ(¸#(°nÕÀ·Ãm$\ÑH€õÐHx×~ŒSý»ß)¤Ö’÷ +¤’ƒråI‚²=›ŽÂ‘°±òþE€´è¦O³0šÔ~º›ð~ $W,õÿ%:HJÃë¥t€”L*òiog÷l$4o‹óÿÎ-$ t€viÖÂâ +Ï"$BcaC€œÎYCLB‹h c9tQkXÉ,ÇÀô^ÙCTŠ…é¶q¾R²¸r²Ó@#>—¦É:ôE>æ•Tž9DLTš× X$å¼îÞFoíÀB¼þà5zˆŸ +¹•‰”w…Åž 1œo4·óöe3¹ëøKÁ5¶³&\ýïÀ¥¤ƒê½ç"ý)įšŽÆZRq::¿Û䦥±ôkfZã¾²ã‹^z€V~Ù€¢17&è!|Û¸SÇC¥ŸÆ–_ÖKÓœßhÍ{ÙÕĘ ¡Cœgòã¯Öb|㮸<Õi€Y`)‘D*6Q5~V&%lë¥o´k§ÚF³Pçu!©T‰ÜFSiñÓ¬finœyP.ñöMiT<_£Öðp—ŠÐD#‡aâá%ŸŸn ?ØÃ;Õi<.ª…é¤%ÿXX/F7¡zèQ©ØyBÜØÙ mnÒ¿Ÿo¹Nÿñêz›20³‹Åúׂ´Jÿª¬¬Ñ¿nl®Ó¿6ëeú×ãÖÍ/Böêd“þþñr‹þõãn›81\Iæ3ÄÒµ¢FNþQªnä»—Õ¿^£U¹ÝÕ̸‡¼Y â07àÝ> ”Bnëf+oÆÀqo\§?C…kw+k¦'zØÿ2c3—ï¡Û|Z&Ñ#Šz;|-Þ«áØŠçó†—oŽà'̯Áz¤,ùló~]É›ÑiÕ¿Þû$N˜v¼.T˜/‰”æÌ8aNî)“Y±Âœ+9Ê·§vPÞtš·t<ª\/R_`<*‘"3¢ñóbÏÇSˆSCÀ9ú³ó̃ þ>õÅ‹ôdQ$JHΨ!YDa‡\yÀ›Aüõ˜¤šXÇfrÅôœ–÷¿ãC¦8.‘ˆ ;FdŽñ5yãoŽÏÉ°"‰™Ófw`¬É9ç¬@Ç76Wq–Uqãlt²ýQ|Ém=>·ª{;ÉS' @ æí¦î€”»dù`-ñþ[ëöˆÛòèh±ß¸½Ò^¶NÿßjWOG˜–;ãmR¹nÿî6̓ï܉vPU¢#ðBuCµí‚@¡z\AyQ²R0öÃ-:ϼ)» YÃoüI´’Œj«Ÿ˜Kº2ƃYºäà¯ìlÃgÿDQ›p/ܽY«¹é/ªï‹VÄôŸlíåJ1ÜZ.»¨W +§©Ú²ž½Û\åÚ‹y:$”ù4ªŒ 9ÿ˜il³æ¡,ßIÅ¥ì!"õþé\`$å–Иù³@Cî¿Hø™ä¬Ç^Íqý¾Ý©TóZ¶^¯í·5+Lû)sý‡…È›÷¯HlíÿÇ-ÿ_Ž[~ÿO9¡jš<§ªºŒMl@Ä5Œb¢™`>€É<…×| תMl@Ä5ÀИ€ˆk>$RÓqÍʜ׀¯a±RDÂv'_³[Ǭ -`ÚPÓ+Kß‚T»Øþmƒ´ÌUóº,­Yróg¾Øß?ìè¾Xߨë‹'Oà‘-4Ë¿‹Ÿ-Çs3Ô¦]_²ûiÊ,X¯Áؽù]â+å-ö/vqŒÈ²JUìêÓriIrBðÏúGZžJdl ²ÿš>¹Ç#šW ÚË Q׌DãóùÊ5³Ê<²ÿéãW(aK ášgHÕ‚!P‰˜Á8žiY¸Ü2¼ ä#‘2ì›ÂâΫ-³„: ÖhÍ…já:ÈfÞ±nLg³Q/õ*†³Ùh•8ùaEÆg +O¥õ긘ÆÍþÆ)x*ôÜUµKt­!!C_K‰U±@^ +H_Wì"b£”®ô/oçà¸þ¼\r%>å&ÆÀ­Äç ïÏœnœRìÜ,é ‡”Ï»¹š¡=g¤xèï•°ëIñrµµÃ+GLŠ¼È®!šKM'+81nš'g„v àÓupðËÍ<þT´?+ÙŸÁ¹,Ÿb F4²A°\¦xåqXy»|¬¬aFêòÖº¤ó·ü-¹Å}ܬ+èKÞï‹™¿edos +®⃅‚žN]f+WOwŠ®Wî¥_Oþv¬ì-ÎBnÿ›<ºg”åR“šOWÜ:(€YÂPÌO—ÂÞü#(ÀTÌDù[«:V!óÑ »“¦Æ1iÑx†Î\)Á»ÁxB+~=ž‹wˆ‡á”ÛxýóäÒMŒÅ?£oMB šv]GT>ê°E\Tõ‡¬’ð+émä©!6*¿ß®!¾“Ñk`¢Ò*º/ æ­!:ŸÎ\s¿óHOÕ¹±é·C¼û‘Á¸aZ;ýššÆú£éÊnÉ©i¬ý55u¾§½0ÀÀ5ìÅ…‰«°m¼NŠJ‡ÆÞÿ¦;N7˜]©xC<üN³Âì3‘ÿ4:¯LŽwHÊ(¿ +ÝÆû”„Ýùú#í‰Ólcàå g¼´Š¿ùéÖpµ°­‘…á3D2Ý~=¥‡xxˆ­lìYÅCÿ7 +kx¥HÊ--ãbâá}8­´|øŠ.N ÕC¿^gÚÉatùð—¤}\˜wýº´`•F73†= .ªnI²ÚÌuNÂðëerù÷§•\Þ¿<4Œ@ø*ì„~lÉt9Ö;]f¹$ä ךês¨w»ŽÇwômÅ@NÀ})^·ž|Ÿ'áýE£Ü’áK÷{ÝŒùÓ¿~ÎÌV'{@>¸¥‚±Zã{X¨éŽŸ¯Œ,w|‡sÜ^ºŒß“pvàÊ +$Rt¯F¹R R›ÛWçÖ;%Ú¹è ìI¤fØ%Ø#B +=fÕ%Ø#âÌ2«žVH"5Ã.‘À‘Dj†]"="‰Yv‰öˆ¸ÚG¦í ìI̲K$°G$‘ŠÝ%‚¶ü4mʬ--m†NŒpàÑ·‰ÅËwC¬‘kÔ¤z›?Z²%ÕÐ.EãMX“Ñd)kD +íb ¾¹ø…^sÙ +Â_´1`Û$³›‰^jZ$7â`Á^óÖ,Ü Ðäì0üu·)ß@)õ‡÷vŽ$g+©ªÐÃÌY,Ÿ“2Ó½’“ÎtI´gEó¼¹ÅNgæìQE]]$YE¬yQdIçx]áT ÿˆxYÑA•dN×È€ÈÏ]öœy°¶ÿ†_vá‡ðÑæxnnîú–›{ÂuŸ$x^* +² Á€² JÒ\×e¹ÈÉ2¯ÊªCÏ}²Ä¢.sŠ&ʺ¨Ês™§æbŸšˆ…mM)ʺ h2P}ÀÁj²kö©iRQÔD‘ãñ­Ft¯†µ+7ûÔ<@ìSóNÆ8ï’Y ¾­³€<(d­Æsѧ^Aáµ¢Ê œ¨ð¢ ñ"‚IÀeš& ²¨sŠˆÄ!¦5M4AYañp/‘jœˆ‹$ B‘SxU!Éõ¢¢IÂRØ< H-ŠœÆs²d쌱Q<ó¨)MÖ¥9Ö®< äÜEQ8Ù<Ö8RQâÀŠR¾ÎZ Ä·+;ŒÕxq}V„ça…ªÊ4¯Hø¡EŸl ÏÎ@[‚®‹†…X”¢¢ °^gãY„óÂÕ©¨MA»1Æô"ª”·$;ëÔ ~êñyñÌXÏŒ]ùðÌÂŽo?Ž}«‰<+r¤ úQaÇáT¶Š÷ÁÀFxE×Þ ^Sá $Cýû‰Ëþò‘)œ¿e0­gj„klÖW´¢¢ˆ¦™¬¯(`r)`I¡yÀ3÷áa³¾o?:½«‰<rv šô Æ@Ù:øg,}v R¥þÖOÞ©Þ³cÀx±ÅX…çŒ}øÏŽ ï8 tú()êTØ|'p_”TÑàÎÆ öª–-=â¥7‘cŠ&ÛzÄK·>úÇñq‘5,÷®Øܨë€y„’¤âä,nÔU@+BÛ©ðs£„;qü¬æ]MôY±Ù‘u¤, }dè? +9³ŽÔÇŒq¼ÌÅX Äw¤ &õ"‘Á¤Þ£`0©ÿHLê‡Á>‹<+r¤ºTÔQ1'¦® + øáCÊÁ‘êrQ·]—Þ2™H×¼|2‰¢ +ÂIáŒq4pÎ9Uç9Óð†M(/Kàó[>Œ"ê¦è1ð¬khg ’è˜Þ*ˆMæð´ÈæDÃ)º³d°ÎPà4 jQÓT^’aæjTp€2DEåMê%‹À|Àƒ0˜ $ËI¢M=°qØŽFû +ªÒ_áu^âŒ]ùAôœ4ÅyL0¤",„ãyc=p:E`f ñ†SªÚyUÔÂÚÀäEàQøÄY°ä1!ð\QVÀÍ%{ëÞq€Ûwª¦(‚5Ž"€ì³ÀIÒT>–ìÕ(`TšS„*€ì‰/i€6k*‚é$e°Î Š( ªuæ M$Õð;qW1Ìã:+Ì(Š¹œ +Ø~¥Ï +€tðÒ, nQ’e ‘âVQ¦Y ºÎ»pŒ«EÛT†©Œ)Iº¨éÎYår´9oX®çå 9T‘- R½ˆ4 ѤAp*Å° <Ž’C;ò•¦i&%3AÄ"§Jo튤¢C$‘1Ž5ÀÂà8+–Ä`íÊR!,›pøÜÔJœ^ïˆRt¢ žÉ8Í?L¼)š˜ ‚kØ: H¹Ãñ–0`®Fr¯†µ+É»u~$ïÖgª ê\àHê ïiKš-☠¾Sg!‡r¢Æ™Ò”µEŒ¦eÑGËÀ¨I8'\ä‡CÅ¢I¼ÈiÖj`– $˜Êø 9¹d&Zl Àç¸Å@7EÓœÞ2 hæ#ìªNaÇëáˆwÛ÷ X‡a)UÓ¨#õN´­âÿqŽ +õ.™âÞz%ÁRA\Iª|h±€—d‡·Ðû©­¦"»ÆáIqg7È#Ùº†¹ÑÙºo5z5 ÷®pë~ ?i°€€Ê6+‰æ­ÄŽdF“ܧÅ8uÉK,ú‘¼¤¡Ivò‚9™Êû©Ù³dˆ4|@ÀÿåwÔz+H–u#g,š“‡¦“±E DÕE#@oñš0&•d¦="Xš, Ä"5iÈ|'ÏÄËàWÙNjh-ïª-DxÌ( §¥bDšž@ ð9Á¨cÓ- T’QxDƉ%ñF¢ÂÑLƒ ¥“Ä£®©bWE +hßXõ.:ià A˜šCuvà¬Ê ø KnNã‹ ²+&¦™Ê†îÍÀ¦ÛEZ–8µSAFtPe DY‚@P?[8€ˆÞ©Ã‚æqwŠÀTضF7d÷8X)®Ðþ,±ƒ—*I,²@èê/’Ñ¢3Þ†El¤ã´µG#‘Ù©ÊÚSí~ \ -Þ l=J›•s”ü Ö(èbK‰¢ó£%èÔ[al £XÖí©48$×TàUqÀ6H¤ÝNÌ{ ú‰/’¬êªÅÃ`Ý+†Ž £jÓÔbaîXT— [€0ȶôKl ¸Rw¬'öt±€,W–$SÖ!H]¼éFax| bÙ)· @ +W‹ Ž¬3J-D2™ïLâÀøŽä9Æ8¨ÁÊé‹Œ¡> g‹*PŽ•ÝfÎ" ì`‹&ÍTws"h% + ÕalÝ..!4 Rì",Ü–¢‚3Ë"u6.1°èd–$6f?èbËé`c4,ÉÊþJ@*æI]@rŠl;€¸;°ƒt•Óè2vÌÕ¨X’kp&¢ŒdÀ5¥ôÒVÑÃ¥›ª|ÓE0Ò‡ÏFã³(cBüSŸ±IBéËa)¶ +f’ÈÚX‡¦cµ@‡-=@ +z—°^´u·HÄrR°i Ée˜aUùëû^°sÁrðAÖù!À:àó ¦.‚áÚj:Ú±$pL"&ÓÁUö¶7!‚­"bÅ/XøV¶ša¥ÑÖ¢‘›µ4*~GÜ]Xd`©ð¸®3àN| ªK€› ä,Ø5ëŒã‹A³»X;EÔí\+ n©m—~²¢Zkü xÊ8ä¢û Ü@€\°ÿuÁªª6I{Ȉ+klðô©à`ˆ„¶‚Sxƒ«‘ATé`óXZFÀÕ€–4–3‡´ë6È} &v<@­8($âÜ +Ú2݉T×y§:05¾§8<@"£Å(¢c Ë’„´`\>È@»ˆ „}ÊF‡¡gX È_à2U75º Ú“|€'ÆØ•„Fž­·â q}žÐç2ٹˋà°ÈÓ5 ,¾3M×T£¾Pgµ˜@>óF ï.`ä3oXÓÅò™7ˆ£`œˆ¶4ˆäå*VÛXÞ¡X@>õÂ:–X@ ;ˆÒâ|d‰ê"|n…7u8m°¬±éÆùÈ„ VÇPvÆ·%+±a–nr=¾øÃ%+~ ã6ô§BÌÖ)$¾î´6I¤øViî0¢‚n–í(JÖ ¨p†*ñC€KŠ•T ­0y´®:4” ƒÓnJI T³æEž[‡Á¶(;H©²]‹ ä'LZ€Qj*–bbùȼÑ"…d‘ „]ë°7c•L«dlÑjª4°Ó(ÞpK"“*º•ÁÀRj/ÆI€Æ-Ñ'¡õ¤Gç‘JdU¶¬J \@p²E3Zlˆ#­èT¶Jx"éE§[Å8k²ÔÛ°33èŤôH¦²î*ÁEßÁOUdìþ“ F ÛQmPE›èL,kEŠçÖ[›] l +4 +PÍàžfÒ Xˆ–e£±üëõÀ°6MJE;¾yn݆i]E³{8¬-R=j€mð£xM‘è6:(¥ìrbÓ R4Ø·N +ƒD*â_‹ô½cå’ ®qÀ’A¬šŠP4·Î« +g]ÁvUà#:I8š„‘(ꮲ«åƒ)}{ò‰p¬#³O5 +¿2Ö:©DÖ9É–² àñ,1"L•! U‘‚f4ƒ“³$D¦ ;é¦)ªØ%™x–~ò®P1a{@ð,Aï€È2c£ÌqÐsW;Àðz%»—#„÷¤Y@"ZlNØW£ƒë¨™ÑSE3'r³ŒŒÆÙ¹k‘iŸÊ<š xS° !OÁÉhz:V^| ŸÒe-<“1L +Èuö¾U°·‘Ë¿tUŒébù¦¯Ku»L™€iX/ØÛŸ$ž>gi+³#9F<è̺9@gŒ„FŒ]ceœf‡O@$ ét0a$_^R,aÓI9ÁÂŒH9N³‹-À(W• Å š!]::Ï]‚d$T;Fê°°Qäì"ȱ©ƒui‡Ó!*:©Öº1 ‰0ÚPz¹,B.cœ¯‹Å>Ø#ºå>ù&ÄX¬ˆíATT‚µ*kU¾éb1¦s‡ñž2žê27kt@„rŽƒ4K6À£q +g<@âÔ'Y+ت¼B1*á­Šwæ÷ £x»–¸¿øR”ïoY)Œ– ‡L]¼g@¨†Œ$ß‹fæÞ¹·Å`DäàG»³Ä?6ðÓ‡FRV´ÏЈ}©ðÕ`‚€9 ɦQ!áTøªcØÔbù‰ãŽöEæD±ˆÄð " ŽmèR‘IUIÖœZ ˆÍ8@2º™¸D)ÝjÅôïã%N»;ˆ€‹ÓºÑ`,U³ª¡­‚E¶Ã¸¢ +*èJ°í]´=‹t[(¸€à®ÒŽ;I\sT ÌQTÁ Óõ>"ä'ËsÂ5áÕ f9—ÄØþ'ˆ$zÎj14Bå`ØY´j\ƒþ›Õ©‘è ¨§N×¢E›±¼L°ª‰uBAÈ +Àºƒ'?oÙ> †@Ì pD–‰nÊ:⊠&­¶ªxY´¯`üdùøJ±5“•iåb‘œ|d60ð!Aó)¶ÂˆäçuRšÇÛh±<(`FãØn–’8°_>ÕY,á½RÀÌVã©â‘øÔôEþA|‡á_Iô¡VìÐ…ÿ@8 ¯®Ð­²ŠO6xñvÙ•Fd¿ øFTME&°7ïÝóX{*Za‘5ãཋa¸7Ua5 +oÅ–Øô È3':†‚J•m!«E»Å@:^±*¨T”ÔÏ‚@µÊ%L˜Ëº*Ø|RL÷~JªV@1˜é«ú@Ð׊ >¬>ÿ8 + Xx³CÇÜÃçLWeͺ¿§òqèx¥AxEŠ +.ºHÝõÂM’LÓF46¤;µ|~ˆG‚:™NázÇÐt¼³ÄÍÖýn@¡v€#‚àÎyƒÎãY’4ƒ©*$¨£Âî­Â„Žs †-°‚oÒìfGIQ•æÁ‡ß± h[1C*L¡~œ‚ÅNQˆWj`;­}\Æ–1£jÅѽ_³ÎŽ$àЂÝ9å_ˆÇhÄÝ(@¯šÑõ ûðô°¹–i¶bx\hªoPù9Ý\åÁi[U Þaj;/˜Sœu•ql äadâèóLm÷•ð';Å~2ð6dÎñ0Ñ=ÇB¬’·2"18ð^$U·J*[Ìébæ.ÚÔh„ @Péªæöcù j°öá htÆbèt3Œa×ÜÇò O> çDîœýz¹­¿µm¼XPûz"÷ù +‰Tê¨÷Ò?ôÞ>úƒÄË°÷¿ús½¯¯ïQoÔÿoæ^ýáè{П¾~ÿ??±ÀS©Úa=ñö‡Y{ endstream endobj 76 0 obj <>stream +%AI12_CompressedDataxœì½íŽd¹u-øçb~.¦Ó‡ß¤f0@Dd¦¯’-H²Ç†qÑ(w—åºî®ª«åÑ}úYkmò|DDVe¹4î¶\ATVf‡‡çÜŸkoþÅÿö«ß|qüúÍ?½ü"Ü͇é/þâüöå‹woÞþì o?ÿæ›ï¿{÷–_ýä×?=¸r7£ÑñçõËÞðï^¾ýîÕ›×?;xw7ßyT>òêŸüâÕ믿{ùÇÃÿóê›ïÞ¼þéá'?EÕo_½ûæ%*¾ý§—o¿8ÿâç_üòÕÛ¿{ùÅ/ÞüîÍÿýÍÛWÿë‹Ó7/¾ú×»¯~:ƒÞï_¼Ãeñ/ÿKWõgs=üê—¬ñú/¾ûîÕÿB­Ë¡|wzóýë¯_½þÝéÍÿ‹KæÃ~Nùb<|áÚÌÿýÕ¯_~wÑì®yW]h9Öª.Jw¹¸Ps©¼8Åp—Óœ[ªó\ª³Þî\.±Î1×’Ðóý›¯¾ÿöåëw¿zûæ«—ß}w~óÍ›·ßýìpþã‹×‡_â9_¿{qø‡—ß|óæßzÌ o2}ùøê›—xiß¾xwpï÷øsç¿<}ÿꛯÿú{¾)¼ÜèùuøR]þíwè Ýòw~]¾üù·øæ7/ß½Ãᆜ£_ÿÕi; |©ò“üõËß½Ò”âÅþŸönß¾ùý·/Þþ+®õåÎáÑZœcòM¯"7|…—c˜}=¤rÙÄÕ·M¬Óß¾üö÷ß`æôŠÃœïÒá ¼aü·ý£·Å;P»/Jº«unsj)–Ùãþ÷Ï›ûçT/ïŸ[Ø6±>×Ùxù‡W/ÿíg‡¿~óú¥½òãÛw¿±Uã<ÛO«ùõ÷ß¼|û·¯_½ã«àWÍÞù/ß|ýò´_®üæ…^µŠ[Zƒß¾xû»—ï°ÎÞ|óý;í:î€9ýÅ‹?¾äÂPo®|y”¼Æ}^¿Ãp¿|õÏ_þÁvÕ—¿{÷3,xgãø›ß¿|ýÛ7§GùÂçÙaѦjÿòá‹XÓÝ\æÚÿ•Ã|ð9øÛÁùŠUCL‡ú¸mÌÎ~öÁ¿y÷òíkÌÛÐèÝ^ýe§)/¿ÞŽ i¼ÿx{«üWX÷óö^ßÏ°ÕKó¶þêí«¯×íPü¡ÚÍЦ‚¬!?7ßžûMÓ§d—ª‹þ9ßØ›ÃJy‡§Óí¿<ÿr³Uç»_þ‚ç>¿ù–Ëõ;1.lßoÞüÎê–ßUƒË¿ÿ½½[:XÙ¿zûê5ûœþZ5õË_}ó=ªþêí›ïÿó×ÿüfú‰Qtæ—«;¨ò§"Ö//Þ¾û·7oÿþüë—/V¢ZüûŸ¾·ËßüëËw_ýËe§ýÛ·÷ò«wd /¿>üÍ?ýOüÁ>Hè¿}ûâ+<*þ^Ú|¸;LÃÛñä¸RŽÿ?|õýËÆ°×ËíÛ‡×xùÍ›ßoºµvîïWß¼xýâíò²ÆÜü5/0‘k‡løòÝß?£GlŠßãu¨ýT|°Á¦ê7zñî_À¿^‚Á/}ÛŸë¨ù$ö݇û;¿øæ›W¿{ûâ÷ÿòê«Ãéí÷ßýËá·oÞ|³ô}£~¹Ï¶NU¼ò+ö+nÉ··î¶¯ZnÔ¿þ‘ÝãWºàõß¼¶9¹¾Sopy'ð/»æGz¯åš[÷Aå–{üæßþÓ›o^}÷í:õ›o~Úøê«o^þæß½{ùšÑ_ðÃׯ@ôžØäïmó›{šü‹WÿôÞmɇügÈïX¡¿ùþÕ»—ëN|óíï)7~ó//~ÿRO0Zþfé0‰‡o8Ò_¼‡U¹|8½ÞÔÿÕÛ_¿„–ð·¯_¿øÄÿwý«ƒûétëKðôx8}=ýãôNç‚’QJ<‡³Wq(óy>=žTîQø9öÒP*J9e”tŠ*á䧓C™Oóñåáx<£ØUü4”ŠRT2JB‰*Å£¸ã|œÛc{h÷í~jgÞPך¼Ðj+-«@ìþ/<®›qÅMª¾ÍÕÇú€Qk©¹Æê«+徜J+¥¤‹+s~ÀÓŸÐSÉ9‡ A-=¤ûtš0®šrŠ)$ãðe'Gh6ÑÅ9<„s8…-*‡ÑÍùGÿ€—wôÍWŸ}òÁ;?»¼Ì£«“+=9ïÜü8?àíbÀ’ýÒŒÞfy—bb”þ¹Ýoè +ÿÆÏ ¡ÿõ{Ô¿Q’ýœðKFIºïØtçc/öÛiùyZ~ž—Ÿ÷ý§~›ôåY_Þ/Õ÷úù€ŸódÆ£ÄÓ®œßSîßSF™Ö_{y|º¤ù=ÅY™Æ/»â·Es‚¥QrÅ"9b©œó=Í#dvW| XF©d,¨ŠeuÄâ:c‰=”Ç:W‡%°ð–_©µ6,ÅS=×û ëò +„e¬ÓˆÕZEá#–ù«þ¡=b:ÖtÀ¾HØ%{¦aÿœ°›î±¯15îä±å"¶_ž°+6É{ôŒ½úpzÄ9ì䀷›°¿‹í^7kòÚ ‰IÚÄ¥wÑ´YO½£{mv6‹(°Ã )c§ÙèGåå>?ŸÎüÜ£< Æ“ÍlÑÆÏ\±w˜b_bš[Có~½ –öžët>Ú[¬˜‘ptíÑzcGîn6nbÍÈÑ +r₲®l:1¡ëcý#†’j€ÒŸÝœjô‰êÈúh%†cæ)9—X_㜋45Pœ´>¾(z”åK|ÓúãÙwõà¡äåCš­Þ‡ž1(X_þ c8}7éºJësI¡©§@oóŒ—"†b#ÂîöØ Õàq•+(^}Ä7üw1¹ë=³§1+¬Ïý|_{Öæ²÷ $͹\©g¨.m-¦¢{Ö|%’‚¹àõÍŒ¾3š¶8¶ñ¥ÆàB¡af“¸{÷î½rw䌛ñ#”ÞRu ›à ·Õu ½®Î1ÕótûjʉK•}3“¨ãÖ®¶À«üöfšÏ°¡kü&oZ¤ÜÖÍë ú‘Œïæt¿ˆ’C"|®8ß”ç˜èZ/µ—íïVʦd”õ¯•µfI@(Sÿ"º`_¨„Mñ½ìÿº.³sü79}æG7)k)øëaó÷C/V$Ìœ»´3¤¢ãÔ…£­ ´-uWʦä]"Gž®¤!¢­%ôâ7"žŸÝ¦Œ~Ÿ6ÎL‡Òosçc§¥¬ჟ"i²-D“@™…OðÐeã“DóZŠddJɾøI39çG2pŠÌ'JïØ·ƒ‚©AÆÌS„~D«§R‘N”ðuÊÓ ¡øÄ bu„å$®™8GÁâÔí>]$n§È…n¯—ôØ…oŠßg( Bø„§)û…4î)‘ãç ©œrùƒ¿÷y¨_H>áFÁ–”œ=?N2Ã# +döÉIà¨t¤ø®õ>Ö¶-WßeùǾ–Î’éO}©ÔnÛÍc®§>Á]0³§ùÂû +¸ïüððpÉéøÐ0ROÀÈgÈDŽÎ”(.5Oo7B¬r‹h"9h(qÆý(½í$m­t-ÍS9ëj2*bIª—§8#•ë,-Ë”¨UjÔ±õ–k‡º”­œ¹‡}4_Rœ©:›òœÅµ¨@S…6%ú,¾ö ÌÒ¥M›¦>MšÆ¡Òõê6Évt’-éÞl©Ø¦d{™ž¢LQ¹+ÛUæ¦cW¹©¥Ií +ôD^Ò5è´hÐuÑ M>ý¹«ãNƵЕriÐRŸ¡@OÒ O‹-ýY´éÏ~ÑŸÓ¢?×E4WŠ-s7õ5–U›—…Ù–¥w^ÖÖã²~ü²@l9›ù©O³Mé}Ÿ=›/Œï—Íb¹dr1HtÅtťﱑÀ·ÅÃ…X\þ(Ë­<2Ìx0ˆI²B8âýžñØË,ùÚ§©ÐÏ·ÉL6Ê\Ùdòû¬2ÓsÌ2¶ÊÈv"»É¤I· ·É¶‰¶I>õéÕÔöYµµÙ´™´Y´ŒSŸ¼ªy³9³ùZì`^bôaã‚#}3ƒfC§rlwáˆì.ÝúxÛ~´5Êb¬ï1ûýˆÆdë©@ÑksÄK›çÀ¾SÂø°‘$H¨§†)ªSV³óÁ “2K&Ü?e¯yÛMg;±Ì²PrD»is7­~?’ñ|šÕ/Þ´úÅŸ¢ÿÅê×5('Zi2˦af±“Ü~¤‰2Ù±.Š½Ô…¥+!q“¬,A6,AoÒ¥J–€IÓ„L‰™“,V&m>Hú%sšÔÔ[ϲ{Q79ör‹?‹ÍßK!„ˆ2‰ßÏ2ŸÉâTô<4mɺF K(’ªäQŽ’ ¬œ­Lå~)[…óq_ê|Y.|SËÜ^òI×ÝÉñ¡œ–0þa-LZ+Œ±öűµ›Ò vÞ8•Ï‹¿ØŒ.fš5“í¤a8­&ßš•†Ö3ÛOcVK3­:­ 5Uë"êqÒ&³ž7Î}—gMº2ïã•Ä3/¦æþ™dU¢])ögqIJÎý÷¼35ZÙ³a±åé én|7$¼+ž{Fd`^ìN~ù¹JBn‘†Ã"éß´Ì{Áöÿ´,†´,‰´Yicû.Sÿc5…Rº•´mMÝý>jF+ýœ6MZ3´ [ýö»íz¼þK¦þõ‹ýåûrë»ñí©—ï`_N›r];œ†›H{‘×”žŠýœ¥êhv´?ÊNLKñI¶âÚ­ÅQ¢ªÕ­ÍxZ¤S3K*•éøQv†{ómgzÇ 4ȬÉ4P@Ý›:h ÿ 2.» òç¾k€õcˆŸ÷Xj…“lϦ®hŸô)é#ÓM<Ü«ƒã±›Ù¨žÑš‚‘Mòwe1ª‹ßì×"ù²-EY™BߎÕe‹sÒN`·t÷¼)§‹r¼,¦ä<.Êí¹Ïë±+³U·É}†£l/^óìäZxÔlù>Ëjsœ4íM]4ùY&žúŠ–µβÕZP¦ê²*/Aš¤QIÃø<öEó`š¯ÌUZZ@GAA°Œ&™µÊ‚/3„YZ?òßlÐfqÖQg òÌ°g(Ó©ßæ´~Ž;@Z[`iµƒÓÖ’w…»4Ù*ñF O•1£;£ÅýbãvÏU¡3=f{Ìø0bЀ±Øb‡…vØm[¾ËÕ,2>«‘x5/åÕÔ¼š WÃôV†X ÙiSË÷Ô×Ö([ƒùÞ”¾5²Ï÷»²ì´,Êýç|£œž(Çm™ö.+üƒek)Ù˜Í@øæÁö¸€¶¢¬ƒåئ yo ÜšiÙ›÷FBƒXÉ8l†Â‡+lUÚ ÛÆ:µ± /έA¸L´!»Â’irÌò¯™7Õ¤ñ¼Hãòø¹ËãC"w<~v|’LNW^Ä“½Hä‹<$'Ãt’AœE„1™^C‰Þº§.osßË=A™Â/ât‘Ø|Ò1æ’„=ö¹,b'¼Gñ@Oy7^Â Ï ß>/’ëøyñó,pä©Ë¶’n§ùþ¢<,Éûþó^—m/?/"ÂyùiC9MËèNK³°y^FÞ c+Hm3ñ+Sî)O ‘ŸôùOÒ¡ž}g€‹Ï1ÁaAΫ#»û±ËðdOÝ•ý(WöYÎ춸³£œÙ®»³Í™Ý6îln5'‡öƒ¶!Äþé–C[Ëph·KÛÚ}¹˜q@ãiÁEJh»%¶wpíª}%¸íå¶I‚ۥض +m«ÈfâZÖ6rÚ*¡I6›6•ÇQ¹ïRױϜÍ]î`• Ô.0„ beâtš‘}ºX—w–Û­øs-ݦkè="еøs%úLÇ­"ÏVÔÙŠ8¡f#»øen‘Š‰S¼eu‹;zxž÷ÞæÇOpï4Ï`Ú»‰‡‹ø)§ðqã>]”ãUÁõÓ Ù¨µ´.¯&|ì+Ï3 <ÜQk—º€ùrOZß\çXí\õz;žþ\¾¶´øs“^,_qÓK7TôQ“Á÷úwÆ«;KHÕ?Ì`ÿ7‘‘ëßø¿±-‹ +z–ùã±[hÌ*²bµ$ÁÛ©¬ûna /;Š=?ÈLÄ”ó´¸Z/~ö7ܬdü³oXŒ`µ3ÝÅË:Ýr³ÞâO;YÂν2¬¹«ðÃt(¹·Ò¶SºcŠ¦šn9”µ%Éd¸±?üQþ8éÉùÜ|f igùºjØØ?ö~ ½ÕbXÑóÁÐñÊË`õVøa/n1m­ØÆ°‡Dšƒ®ÛµÌ™ØĶH»$^%yq$'ƒË£øÒÃ{·EßUYó$V•´yVçZ¢+ï({j+²°¦ÎÉ‚–™›$÷ÍR[„Òºço°±wV€:[#}¤ø—àù†Å3Œ_[tµ¾uFña‡Úùùt‹¡¿Ï-Fó{«=?åÛ7’#Í!epòâcž[”i#h³/!T†éÏwx‡äß6@•ÇKìtYýø–¾†ºs?…ÕGàÛYÚ úÀAè-4ç*wmªmž +jpËiæ4Y/©â[—0µs4ÀtrkÁ¢ëQ[¨=ñÓrÆÝüï2#–wñÃÅÞ–<¶Ò JKGQI¡’ ›%Ý`Ž¤ÂÑçÚ—çk¯L¯‘Á u߶SÂAìüozœÝµ^ Báæíü¨†õi®®|ÓÕ• p;W—ù'±']¿½ör4T1äÁŒ£LúmaCÔsç¿ÐƒåŠÔ|{œQgºØ;5ÑÛ$V»pÙÜ"âwØáBê,`ZªìI¯AWšTOÃÏ>Hüõ z6 òU¦žµÏyÎÞK4etÒÓ‚œÍ‹Rk*î°ôK î¨+ŽÃW–²FçMÙ:iÚ¶LçÓE¹ü\Q…nl½U@à¦{÷dñÏ,»xçé}ÁÐÏ(y)FpÓ4~ùS•?Óoë¸öÓ/JãV·½Ž¹_»ºG|Zäyã$/ýg¾ÛB)öÿ–¶Ó¼‚0ÊâoO¿•¥¾,¯7ãÌæòç¯#‰€=’[²Ûÿã“ÿï¾™ú;Ù*Ö{îªx»åV 63ýÛéBo²Ó]Ýêúû0]\´ßx—ß<]ú#?·ù³ÊôDÅ{ÓÜ>°Ã?ùÿ“w¸b0:o`™ŠÍƒŒwNĸö8G6}ŽlúÙô9²ésdÓçȦϑMŸ#›>G6=ÿóŸ¤ÃÏ‘MŸ#›>G6]D6í³ìå6žiä:ÁK§ž8ï<õä•çMvºOúLŸÞÅîsϯªEÐ^ƒ¦Ê.hê~䣩<Œ•§Žß{X°{ëyIˆ½:õÀ¨¶„B-ÇE©7oÃ.<þµåßiùwž æ¿GŠ& +JÜó"Ž¾ÿsXÆã7߆íßnêkz¬åsüä™=­ñXu5¬~†õ4;̈ɺ—…„j5ö C‹‡0O t´ð™4±OiQY”!VsÞVÁ!vÜgG~N=4ë~hmanc´Vâ´1Ö=.i1M”(tò#œ¥¼ïv5gÅsB½nEQÅeµŒ,ñRèú¸ÒF½à5áxÁ®½×{Þ|Éb:YÄ—ì¤öB«,£÷x’—aíiû4Y+ +g$J¶ VDÇkÂTš@p]~ +¼2©áHixxýù˜ŒÐ`ÛÍt”,—µ8´ëòïÂP=‰3{:@í©à´ûtš¶¦ ˆÑô$ÆhE­!i{hÑ€m£ÑÎSÇðК*>.à · €dÏeÂx³Æ©Ë+={jÏš:,¯§5ömMµÞ®0·POE¿=ðРó¢ß>2þmZľ~Ï•û¦M†ö¢ßŸKX]Hw-ýÀQu} ?pP]Mw˜hÿcªC±7\=8Tc¾Ú–yÚ1¶SA‡ÊÙè°Ó00L tkòƒÍPKh›ÛâÙvó¡³[Ü&#Èoê.Óå{ƒê~TÃú4/k»éem?ÕFí^ÖÅ`yîÁ%ÛÒ5”Å`·O-?ôz×óºëÿ©[ÇÍ}z²÷‘ò}”´äÈ]QÛøÉb?Q¦ñK§¼­ÿf¦¯c7ןe;õôñkùóø·âçC¼zÏd·u9GfÍÐ.ü3çMYCãV¡b{<Îz¸Nž–yêrœÏuÖçGr³î#ŸÐÝâËQk þ伸4ÊâÊÐŒuÎuÒ+ú¯ï,‹*ïYg1‚]MàV¦á:qªÓrpH´ƒCt,ãY“1¥Y'†!51£Ðˆy Ç·CB’Ž±Ã_Œ‹¯Ç2ÞãÁ«Î' +Ë™Œ§Å  “wºÛª»¯kY?y)œ8`c”컶kíò?,HÊûîZ?-xJCTšDUû]òEàìˆg›7ÝÀV>l°•§]&€-ª2/pJ +^œÛÎ1\•=àÙíÊfa®![ÓÆã±ñz,@´ç¸>vÎé†ïãÚݱº5ühm ”–Û–¨»Ã%NËáËá¾[Ç×£%ÖXÛa%hÓq=R"nŽ“X’¶òýA7Ž +0{ùtû´€~Fij ¸8]0Æf åÑa3Š¥Ì +SĶÁÙIfž82=Cïò]bÙòí·çÊÊa¼;oä/w {q›Fù‡„¤°^HH_¡@x£ˆábkJ‰R b:Ëþíç’ ·µ +Sû‡ûÎÑÓU”{½øFâÝ ÔÖ8†OâÿþæÙÂÞí‚ê»çÍœk{ϽEάn{?Ì‹Ó~œheÆqªU÷Ù?l¬‡ëiă\Û WŒêƒ öýPâi‡B]±§+Öt (½Žîq  HóÒ7OÒuýԥ䥤Mµ™±&ìÊ€ ¸ay¾8îñF‘œ5í&êåR8{ºœ.ËtýÕÇc96Á<³ì^œCZîï¥:3FŠÇ­òÝûÏ1flGÑ‚‡Ù‘—?B>Rœ(bÅ~9ßÙNxN:ãÙ„‰±Åq,]?è¹õL¡ÂÐúÅ´Üi=‡LòÅCO:v1ÃÌ #ÞHçÎuSÂ0$ ܱ”¢º%!HqËeë¡+㨕ÓîäE;nå1Ž@D™ú!f´¯­¸S?”îxá7Ûž_xë´Âdq«×a„·mJ>qcþdO×8j7t¬f“ƒòqIÒA±v˜cGªÕñÐ\½UˆFÙ³¤h;òd|,‚¨îÛ‘!ëÜð-?-hÉ~ÄË4ì® .Ò„Â=òØÍ®Þ(ûãˆi³3¯ÒL¦'Ž½Z›/”¥¡2ù«¨­öi!/e§ý<õYe°mý³AÕ€É?:ÿ±—›Ìn8ç›X[³Éïþ£,óó¸[Ý–hùÓÚ´øùÇyå«·îGŠ¯^ÿØ£“¶Xܪ×~ìKé´"rï;*wÅåÎ=^Ê÷D¡;Pº©+C ‘ª0iZÙBwWøîyM °9·nMâ·=ÇëwZ´¿+aW®gÒ¢aNµi-ÏÿÔË2]õ1E4e“jÃŽ{ßcO9¶œè4-›|ê4ŽuZY|êfgo³Ûf§»U9V¥cQ;–Ãì¶ÇÙm´Ûi7õLˆkrŽ;Û®+&ã€øqÄ]è*Õ6aGî*˜¸øÔ‘>ãôøq‚ü8ïÜÏÂeU·Çn´Çi9p~[üÍr­¢^ì×é2~ïãŠô·1C×@—9+±\Ièq+NWbàj¦ÊO‹„7%BÉÓ·v»ò!áðZìƹi±Ò êÅÁ¥o•iùµ=«|ð3½·ößA¦O"(e BÀö’–ÞutÓЩŸŸ„]£nnùAZ°®«ò¼ßwŸ;Eá¬Ì8t²?*õM<çqÜ™ßü?×l%íGátÁÇÀ{ÌxJtÓ§d½E欎²kP5°ÔŠqeüZÿ!a¾H +ñÂ\Ì:g«”Ü\˜#¾ÉU®Ü=c<¥ùP²7 ·•‡oh~‘«Ïœ>ÜA‹©ÅêÚø!G¡÷€n©¥LWÉ\t]Mè7† +m°OM‚FXñWÅ;Îæz‹Çï3O¯V~ÂßDY ¯Æ˜/Úpb¼¿:(ìÇ3¤O²õ„tËÖƒoÑñâëYbr.õÀ5Zgë Y¾1¢a§Ç;ÿ}WÍ«N‹‹óùÜOôÈ£C·Ÿ‹ã„—oï;|ë~ ÚGHÊ>Wõõ±Å+Ä{×µ¯÷ûž#`uñ8Eu£Øga“| ³`1g1dvÔüž +â]¶\Šu&$Óž°Æ R–è±<®oN Ö›­—åQgBÏËÀÏywú\\½Í%ßÍ ô›#ðþojg^žéU@uðΊÓÙè$x¬› .[Pi»8‡‘îÔ-åIÝûS7©k¨HÐæ±ÀQ|Ò¾yÜ_Üyk—úþ˜Ø[±í2–NÃi »ÆÂÞ:&úCERî8ôˆ(7R˜o‰~ú èãµÖ6½ïÞçD•®éàüULé>¢Ô±•©‡n‘ëk,é@çoãH—ÒþâÝ&x4bêq£±ÇŒŽxQ‹Uœ¨fçܼvóãæhß5T‘ŸSñ´0Ï"§©Åo¶çÅens¬_Feîc2Ã@˜…å¥mÿßGc®‘˜Û(Ì2¯˜y„^N»øÊmx@Ûîå—ã·}Øåq £<.¶q§l|*®qÕHøöt᱈ÆÏ8¢G,ãÖ+2Žã.ËÜJ.4r±T~¡ÛYØ „6½/ûsb·Gx_Fîã{Œ×´¤UÙƾïlæm$àåÉÌ FÓâuºL±²K°r‘]eø½çþÒ׬*§iñ[×Mi÷H=/ºî¸‹®ÛÇÖí#ë–l··¢êö1uûxº%’nF×è¦]üÜ>nnDÌíÃäv¡qÁpøL›À·}hÛ.>í6&p'P?Uÿƒ!÷šà4€O“ núqñíGI'C"-’Áº×s'Ö~OeÅ|ŒeÏ÷0»ééxþû1®q—²ã.kÜù>ê|‰9·±MKÄù>Þü Þò§£\BppP’抉n€ԉÔEoI7rÐãñšï¦“rql‚Ù6ú•Çšž \?Ô>rù›”ËÓ*±æùÙ¥¶¨È,YŸ‘´CÊ×R³ ãt_Æ6Û0Ùž¾ËE]*2ûè&â Î[ë/EÞ†™ÇmÒèÅdZË´„¢˜ñë–7ñIµtq!Žc@®‚ø§m¿¿{áLbWíÖôTÆ|ýšb>TóKÇyÛ&©šF–*êéÖ(‡'p5ø6‡ Ù…bî=7¨áMYÈ*pçM p&µ+»Pº²™ø§¤ VïÀÑ·æ©rÝ^E4tÀ¦I4QÌËBeÜ­4YÈ)IÑWL–%c»6ë.wâ°hqò['Ëëý³¿Ãak­úÁÆ0lvôz !d©%êf0Z +Þf¶±†Œ›Ï%ç +Á©ÏÂÞ8ÆY¸“Êj˜¸P);›Ý7ŠþjÁ~-U$™÷ƒŠ@gPÀrœkä<@ŸÆŠ-¢oÝ €Þ±f±Íü'mÃ'¹HÌG÷ÐîsKù±Œç“¸ÿM—DúœãïsŽ¿Ï9þ>çøûœãïsŽ¿Ï9þ>çøûœãïsŽ¿Ï9þ>çøûœãïsŽ¿çþ“tø9ÇßçŸsü}Îñ÷9ÇßçŸsü}Îñ÷9ÇßçŸsüý‰€u)ß•èò‹îƒøœåïs–¿$Ë_º‰MnùÕPÏ)W š+§Ê´ K¸UÂ’—..%]¸­†Ãj9ÿwë 2ÝâÜ‘/÷ýòÐ<†€1nìGÊæ#·MK‰m‰‡žEÂ_e‘(‹S÷ØÓG¬‰#”4bZrF ð´Èƒ&ÙŒX–$ §mrlqC rhêîØKðÐ6Aî)F6" KËÏ.å9eZ\œÛ² P_ÏÝ\3—8çÏ“¼÷aêYrÄ1[þœ‹h–Õ˹.ŽuYŒõÐüiê‹b,…û±(*H¢ "ˆ×åPÄÛuN‘©'1ÿ~ìL©§Y‚eYBbÄ“G\“"›¦®lƒ›öN­'ž|- ›ÏçÞ³ëÖ2õ_®ÄMYO].WK¥öÿGB#ÌùÔSQ'÷êææχÊ~è©)×9Ž AKÌù“' rèŽÝ}^0 boÞ|îöá¨y’g®2ÅL»T1nœ¶&²9½7Ô%)ÍiXr‹”m¤Ú´O2¢9õ›ùÌ»YªÞÃesçÑá‡óZu}k«AåU² ¸ ž”Vl¦¼‡g—§?oÓtÃåtÛ§´æö(;+âp£v[âôñæÄÝ!Õm±$v+âtã êyã§ßæö;.±T—îúåwºòØ×®‡ M¬Ç¸-ºØmmlÑǦ‘w¯=ïfú˜Íçã³Ë³fzºéX|þì^Íí´ÜÝÌnæöY3[o@þi3‹¹ž‰ÅˆKôâв‡ž½Æ0jn§>µÛ@Æë¹—s«ùܹß_ü“eã`ž>èg¾µ .ç}Cwå (»m¼ÎóÓs¼3žNáO/ÿÔÜ€MŸÙi·i-ç°›\ZNžÚ±çmdêta@¹O½iA¹È“ +ÄZ)ý…q…¼ï!t ±MˆVÖQÄCUÉ8fÈò³&ò郳ÚP¨6Ú=O½ùÜu¬Ç®9û®9l Cs9A;ÊFuö“KZô¬‘Ôq`s6)1/²VËJ·­¬-·”·ÿ{¯¿=Ç~5ãÏÑÞ?¨­_ªêÓ{õô÷héO©èÓˆaaÛÏûíY_æ|ºÜâ7füÖ|ß°«ÙlOWÛ;œõeƒ TÀËô^Mý¶míI´Ã^§Ï.έA¸˜"ýíèî]”ªºð\•„ÂzQî=H)¡<]ü‘Úñu‚ÍxåŽ[×뜟Ðé4#útz¦!?°N¿Œá“túzK¥¯ÔèÓEÌñí»!ïÜ‚|m¾nˆAO%üð»ºë–ÄŽí³=ÝjW¦'.y.¾íêE\>²â-=»\wx}ÿûû;ü˜‡¾@þÉÊç?âÂÍá¡kv¾Ì6ç©©i—*läÐ8á5¡ÙiÚe:õÓºf:=.šðÞâ‘¥·~ÍiM0]ÅísÌÈbí[y=F$ô8¤~tÈ´ž²;*Ä°þ»ƒAÖATö§~ŒóË´œÒ±ÿ?zpÓSЖ1ml^þª„%>QúcNã—‹òüôþÇLÏ<Åà©ò§>Kë¿T‡—û6Ëá®L„nÖn% Spóeæ¾? hn[²)ÐÂÿÂ$kô04>tXŽ%n +í楰XOÝŠä:à|˜”Íœ¼@î¹Òª&ý¼d:Ò´žÆtÔyKýT—å<— Y»Ÿâ2-IÚÙ-ã(ɺ1Nhá+DZœ–؇ÍQ+ýD•éÆ1*±‡sœ”Ô1¢8[×=Ž‹:´ž»;-1ƒ«/#,%nÊæ4¢û]¸ˆo½9{+Êöü^‹ÍUèîíò ·ýÞs+¥ðâ‹Kýñ£Ëôé]üX;\³DŒÏÃU¹õÖÏ7Ë’®ÚdîߦѽU>t‚˜Bݧ[G(îÊeÖš”i6ÿ)å"•ÜŸ°<§Ãø1eú¸æŸ;üQw¸ÍüºÍír;ó첺ô”.Ùg¯2½.Y]ÊbÒ =­»=9n³»\®7ƭżµ?|ètql¦l3nšÉk{uìrØþ$°ËSÀŽÓÕQ°·N{Þ`²¬M—튻QæÛeP¶é ’wëèØÛå~_¦Ë/>²\<6}Ä‘µÏ*ÆŽ}Ë]Û°cö«SÞÕViÁ {“;ó¨ôª‰1¶ÚˆgmÀ¢çû½g'm/³s3=•:öaÛÚ‡¼] +§g…»­&àÕlæþáâi#Fqº +Q\®/CSw4¯QŠnÚ„*>ö´2&Éž— ÅSG‚·%xÑK?I8/¡ŒrxOXÊ +ØÙBê·'ðî3Íî¼S¸¿*·ÏD|:?ÐiwÍ2mÿ¸(íßS¦‹/nêñS¦OïâÇÚáêÙ˜{q*ý¥å#Ïbr)欨4.ÁÀÓÚ˜òSvøÊDâ(9…ZžJ‰»Ç2 ê…#BŒ|ÃòCâôÝ$?¾q!rèk9ÚéFÍh—*²»#ŒçâG¿»îv‹ýõ½&Ÿ~¾ ¾•×_¶X®/å"ƒëåןæÔ7½awÄÆ'x ´§;p¸}ç.õÅ¿tô.Ž}CLU2’Î3=õË8èì¡ç:/i,ñO^Ò7Ænª×óÈ ó'N¹ñ0ŽÙ¼,ŸѱÃë¡UOYeX¥g&·xôíÁ¾=c×8ÎwÍí‘{æ®a"çô.©=†yÈRÓßÊàžYüu¹ðØ6’ +f˜Î¿ÞªÃ$ȇ~Lâ<ÓTÑÀÂcCÜ…Ms]¡žŸÌÕMZšÛd‰þAGaQîJËsŽ î=è,¹0š*£÷A_¥«ðñr•ú‰3®Žñû¼çûˆ¾øò¯ß¼þÕÛW¯ß½zý»/¾ØЮmÅô׿gM°š_½x÷îåÛ×¢Ö¿Ù´ñÍÁ»Ê³F1¾(;þÁÕöBŸ(L‚§„š¬ÅÌ ñä!ÍÖ¹ZŽJVpÔÏ¿ÿ7ûã%þû^¿ºžÆàïÿ¨?ÿoüú?ñå¿õ~yøÇÿ1¾¶+ÿ®sy«Ã·hõÁ~q«ÕÕƒýâÖŸ×êæ_ãß_ß¾»õÕ»Wo^¿xûÇÃÏÄ•þòôæÍ7‡ŸÞßú—_¿z÷æí—§_ý+fïËß¾úæå—¿~ùÕ»Ÿþw\ðàßåkÔ¯ÿÍ~ÿ-Ñ€¥Ù8ÂXs¶£‰ð9ÍŒ¥*}ûÌôíÕÛQ’JPjcò<Àä…Ë\åá*¿»_ò4p¹×Ãß¿Àâ\˜îÒ +zÊ¥Z¾ øUSÄJÈ(¬œkòn©d¸! ¸Gʬˆx±ªHnÖSd¾Roí¯šHŒ¤Ã9—}êHK‡èæ#œOwG@×ÁS¡lÅ»6_q$3Z„pתäA‘²– [åÔÐ(Þ͘k6gÁ°Ù 65H`±jáÀqØb†vb-æXÕEU-ð\Ö=‘ì«8{‹fˆ{^£ƒ<Ë‹pYðÖ"Wv«èjµƒã/ÖH-2H­nàf¯ºhŠ3Ö:Få ðÌêø‚˜ú€iRã5xS|¿nÆ›âˆp§9Ýy˜˜€ìyR±Ã¢§†… Á#aÚÏš +fdHhEàä0@Ž$™…èýŒB‹²É] ìP<™lðìX–BŒÄ³`*¸–g¯€±@‚«< S›1±A¬Ü~®ñ¼ÔPšúáMðZ–Nã9 ø‹'„b¥1wHâÙËL~„«ÉfÅ&…¨/³èC¶FÞW5⃠Aîß×u1´l}Ÿ +ýàX®5(ÜhИÀctϘk¶Šq¶nx8*Za!νŸ”²ú)ÎF™ž’Kk1ð1Þ‚Ý(æÞ}º£»Í‰QQxË)?ä¹AyH®Æ +ÇB ¦ZÁÊkøÿ.̼-Ôo¬½ñ½zMQ›°aMÇÀA÷k0±b¦@+ˆ¼ÂݨWpzzo¶@Wž“;s~­ûëFå÷"UqÄ:®bcs•º±ÜS»+)qR0œ>§få¢ÂÆßî%»¾ +­¥Æ»DîptBˆ>sjÑ€Ý6¢ ™‹Êã ±¨³”±fòl/yfz›h­ ™¶*¼L-ß.×W?sŽˆÞÐÌ¢¡tÅYeDLÍÖB‡IPÌ]î8çhSJ¶6»“m@“zÁ²â5=¢à]j¨Pg£{z'hŠËaî„ï¥`s“úКƒVý6ª¢<„Ãwxܨ4¼Ñ 7‡½Å7ê‹)ºÑ+²8×1–bŸš«V™»KT>ú8y<¯Îcá°E#ƒ6PðŠ=UP¹~¬×-l•aNЬaðòâ~HÞg¼4žÊÈ@*ÞÈæRqkñŽ:t_¨ÍFqåšBÂŒ­¡µa™A9p/e®ì%GËj4À® Üq#Eã8<é\¬Ác¯‡˜mÝ`0Áxkœ¥eHš7øƒž­\Re” ]ë{{^ 5Ó«A ïÏ%ðDj´(´:T¶`Â7µðÜ3h‹wý]¢¹Z¹Ö¢ZiŸ ÈDS?ÞH¨Ç[ÌÖ‚XL¥,«¨Pbƒì½ Ú©Ž¿æqî}çBì +lù¹Eã` ŸŽ +ßiy`ép‡¢8!896Ypö‰K5cp×”ÀœT×-t§š*ÊU¡Ô[ý`[a©‚/ãýÏÌä +Å$‰(³‰(Ps°ƒ$¢Ì³Ä›•%™Q°Iٮ⓱Bi( +ñ$ð'(v÷ÏïÙqåðæ@3o̤ôì¦`ž %ºSW­4ý@û¯$3áý®»¥¬¾ìš§Tæ 0Úæ!AE¾#¢”çþ$×pƒÒ›QcýPVäU—Ê .Fû1˜ŸZèL<—8qh¥Ñ±W¾Z@ :WdS- b?ÆDY©ß)k¥±ÕœH¡ÑŠý²^ï”A‘ïDëH¶ž +gÄÌj¡‰›ƒì2Ù˜• ðäÞnÔœHv-„ÄL^ §(m=ÐìIȨx'ܽ"U£8‰ò5[„>qeÌ¢Š¢ï$£ßë +H‘Y ­»‹JÌåL©ã;f£”@¸h™F^¹îHñ]¡—Hv€^°öióè3@yMÛ}f.Þ15a¾£ÓŠV°Föþ¦W¦î"^ÆS©sÙaÄvÓH^IA“NåJw—©üG<«L,ÔD˜”ƒ¥œ¤ÞPI¥•rY‹‘mP{T8¦¤é9mô… ¢0#&n¡:Óâ£FmäÏ +VÁJBÇY Ó®cIJ¢%ï¹õ ‹ +š¿ù÷Ð6ù¥6GϺ…‰¤»Ulݳ‚çmZ$T]1“Ðäà:í”ј;›)RoIL(ÊO¹–‹™†¼–E”˜mõð$3$˜ 8‚ †x ÈâÒôB(Kè“(ÐP&îiP~× f¥£@¶^ªF2“<&©x`Ò-PRUðÈ$ý«*óU€e{ržZ{w¹sÄ@Ë‘:!¶=Ó½0ëÖëT©#Ue [NtƒZ˜ 4FÃõqgê7`B`ExNzðèàœ|îÉØm $Ð<衱^ð.@1þ ,‹…:rzöâ›*H²ò •YÇé¨]öd]*Ø¢ûEÌ,7…* ¦³ܯ¨‚玪‚:+è?Ðkëš®*g7´ˆÖ˜oŒÁÏEõRïXÁ(Šƒ”¶uêd\…ìÚ˜À7Í&Ûðѱ£øžð ¸e¢¾‚±]U”YŠÄx_»:ˆnÁlPñyæ5^ DßB &ẠÓiô Jb̃ f~ÝB7p ËÎ+_ùÀu?3V,­·Ð @i•í»€æPH½T%A,ñ$P”ðœŽÖ«ælQ’Ôðr\ bîˆr¡V +†n]ìâîL—+„YrÐsδ½!ò<˜Œðì4#—ëz€@" ¹#“4ÇÝÄ *&‹x€j§£y¯* +A¾.kaW‰‰h”\ĨHS”màŽjÿoÒZ +ʼ|¯Þ %¨wx:úx½hf6ç@q3ÓJ F²^oT$Z}ýèî²ï˜ÆD£s;€ˆÏ¤‰\S©éùA FŘyÚ 8óT7W}f·Ý +Ÿäj Ôpi½Æ)¦C'Ni¬TVjŸÒfŒeB…9€A¨B›…º¤YT§ÐÌwŠ¹Õ¡‚/ÝÉãA뽃RËÊ99]å“yñþAëY^¦ +‰™†t8¤u‡7ä¹–xRsmÚ|.“ñã—Êyfè,ç¹ð`âv°‘ûÆ «êÖg*êMc2[j £¤HãúuEN7uYI9†ÏêH_¨êÎ>‘Y€¦ˆCq´ð Ì”B~Ý+Ô§lÉ --Ñ”0.òYFIúµ<Í÷´I’æ]U€½ÑŒÓ{»¨,´Õ’ùb MµMjæ¡t} {¬ƒU NŠ±dM{‡ aÔÑŒÚâhFÁ­C›®¿¥ôH[‚)¸•$…ZPól“\]1Pðg±V0d¬‡2ÙE[*ìAÑ774SÆq½*P}M¤,:¢Øx-èP +ÍdèL/u¥û’¶¿NŽ(´a³¡Ì?ªŽº+2•wÙyhë¯34úíÜ\»€jìè s ‹h2éF§BØ“sq¬˜©² Bªµ]QUâ)2TÒW%÷:‘dᮿ¸@¿ù +älª©Ü±mŠñŽÛ T:.â¨0Yeò$§cŸÍU­/DGóG8ÐYF@ÂuíÂ!.ƾ’†¾.•@‡ÂètøC¥æ)!’£+ÜÅŸ‡MJC­Äº‹ƒG_`•uU¢sz+J ú*?ÿl‹¸¢ï$`DðùDД”^uRÈu˜F·¦ +%`ÄþS#c6ýʸ¹3Í"óþNÀ“Õ”¥YÐ+åÒ›¯·*È}º¬Ä$Éú[$5ä#D‰k)HL¤1ã]Ü­5˧åñ­m¯ƒP$·á‘äc’ðAäTÃ&‰êDûƒñ~è@L׫hz¦ÉÔ,Òjr}ÒêL“eí&ˆD6G@“0$›¥â«aº¥YsL¯üRI‹„ôáqµ¹ÔëëŠ-ù½ªÌÇ‘ó*hØôÉ@ëÐ¥ãh8ƒ®…¹£HN½€Fâ0T*úÍL ²‹¶Êh¤XQ¨ž@ŠÂ┧‘F°ÜL᮹©Ò‚H•ÒµÇ„ Véþ§¡Ô%iÆ™<ƒ²çøþRg#=¤À™sÓ¯¡°Qðœ í¢5½a”!©‰Ò-IqÕaŠÔ˜ZwL³Ž´´)X³:jþª ^Ë +Hð¹“$«ˆVA{„*ºš•@b¥gƈ *G%Iò™€Ó¨BSÇ +—¤&c9V8ÊÓÖ4³á±ÑÇWtU¤µŠYv‚¶ñPAÇ"¿œ„F;)Y¦y|Œ-È£RùrüâÑ…nruÃUœ8[s·Ž‚ ƒ"*óÖ¦åPßÑ¿ÉicÂÆmªÈÔBi|âÆ¡ñ‰Ú>ýç©õX)ņ§ÛsIÒ‹u'ºÃ + “0u'·ºóxÁ\Üyà1 ƒÏÔ„!ö¢ÏHîK‘ψŘž˜C · +{†Ñaî¶ú/͈ñ¹Û[x> í-:m¥Õ†žÑØHC „&ìêb*íå÷Ðt¶‰ÙôöuŽcàS¦©3ˆ èh oW¤ +­iÝ¡šl>$z¶âi&¤Q‰˜ š¼SFZFíVó¬éNØG37*©F£äK(Ìlè‘&K^+t9´hFWÑX5ÝŒ­[ âÄNVðl¾h’˜ÔH>ìL-Ts¶ôq(”éÕB˜Œˆ÷˜«Zð”™ã"}3¼Q“ÿD=¶åNIpî¬èúpœ.—üˆŠ(Ž‰7$&¯àòáú° ú=<¥À ÔÈ3Dˆ§uæÒƒ +ñr˜Å/"ÒÄ.â579¹ï¡8ЇiA”jxŸÌ8‹¬m¦×ï©ta‰­j•AW¡—h¢5—C„ jAË[à‰i¸ŸÍyˆxÙÑF@?Y¦ëm Ø +’Z9 +4ihí r}Ý©8õãy¢ [h-slT°+@Þ”C—òå.S ¤’5> +ÕZ¾é`îm'M ¸šk¯˜ ^"Oœð¨W6Ï 3YóE-_4ñ0p@ÊŠx|'‹ãøÛ ^³ K›Ì…ÈÍfNûÜŸ¢E„Òç0Wý¾½ÎÍTK1¥žŠ›iC ù¢bFŽÇ™½ÇÕ3÷,δ‘Ñ.Q™’ÑU ›¢Ä@Ìñ;.Þêg–+K3•8Ÿ0ä$d:½D¯ÕU Ê +¸5F‹Ç©mñ}+ÂŽí›h´…^(Á°BЀ”s ûNfÁÙln5Ðé›5CŠ9C-w'[U¢PÖ™M£÷4&ÚS²ˆâ®¦Uz®­qR|0 6ˆšSÒ¦Ú[¤³ HíË}Œ™ã²@Ù–£!D’¸˜H7[PÍ©DÒS<ÂwJÿO¶4: Y%qaI0ÇuÕÈ–@\ P°uÍ,ÑwÃ9‹˜{*‰j—×Ú3;-µœ°|o;úB>Y.Å ¢¢ÒGo½•òÄe…MkìÓ:öÙU+jÏ2ó ¦ØGUú¨@ò {ΔÁš±SŠŒÅ‹(‡a)º-¾êŽ™@K¦¯4Ýè‡/ˆÈ¼YÜ/éµÊ¿ªW ±”þUÙ2ÁÏ@²Ò¡c˜ºd×¢ÜÈTbÉhùŠôbZÈ‹ÙÇRº® c¤ï%§¡ ^·ò$¼:«Ù ¡8ar (/Dò&Cã&Õœ”° !uÏ‹G­ªqÊ`PÙZA°e+'ÇZ€ªÈ“xX2ŒûáëU æÆ@‹DÊÇ DŽ€BpÜÉxX"ñ·VL[ÆVô´ªŸ¤So® (KîÐ< ÊîD‹c¡^ ”ið¢v§f®·J» +y_tš&ð¾@ÔVˆl~x1ŽÆVº½«ÏÄAª©`]µÈŽIЉÍÏtÕ +º÷(‘ZTkD5é@":št±‘t:ʯTi)ZÑ$æ(ƒ\¶øª‹2žgÁQ¢w´Œ^õƒU›i‹i\/dá¥ÜÑj†!@¡æºÅ+Yæ·Ö8Ó™0|‹núPW‰»D:™ìuG{Ýn¸¢åLMjEŽ +Ñ\$vŒ§RÚµØ@àáB}Ú©…ךç$sElªEJ¶ Yq¹‘‘Ýaw/²èdbˆ§P?$.lሠ+%b†˜r4`©0µ +§Ò S3¼vá;Æ‹oÆnDw ïCÕÔ’)gÛèåƒzI)!JÄeÓ +6'ÊY×-\+ÍEîb»Ñe+ú‚jâiÁ âƒÉè„°Ò(K2ÍPø+šÈÛ=gômf"=/ز‹"2•1 +1¸ìÅa?6"Y#ŸØÀƒôE:ˆ å(¤"Äq KÏÐi]ìˆl’ÊQRX f2{Z#Št>ƒªq*È2‰:ÌBÔ’’ð[&èÂø鄹å~²‰QôˆA]k$~—iµ¡Õ¥‘`á>NrxàƒuÝc&3§bAA’qÙÂüæQ$ŒàŒæD,/Z-.y~&äÃDHèM¢•ä»nÑ:²Í33ØðÐ_¶"À·P‡æ“u§,\"Q·ØÁÞ`ÛA CžQõLðøL­…[ðÌXIx8—Lí•‚UA6+Tc«{/v<·¡æ™^_kaº5WC2ü³ WÍÝê©VZ•mÞfLûYxPõøð¥Ö¡EV^„Ù1BΦ‡È2< +D+ëú½Z:; bÑ>LùlxìÙë¥Ñ¯lÐ{êF4~Õk¥HôošãÍX’ÿr£’¶¥pµ1ØËØS_¤b‰|# & ˆb-ÈhC»naï*šÌ× +h÷|³ŸÜ,4^㛩’fž¨,‹G!)I‚Q56±´ste|NcAeª¦ëV¿èÃ!¶”yL{h€\Q^ÑžA Ozÿ„놢Ì-MÙKäTPïHK¯[Pþ'µ-Z¬f›]«J¸S¡ñ3Êï}G«¦Ž˜’ÛHP<5»Hn0“&¾ëCÕ"bœf¿"dîU?µ‡¾UJ€¶Zw°³™—-.ù³‰²—­@Ì„ß̲½š”ePµ«"`’j!^ž†ò)Ì}&já…6Q6˜‡ô`\Q]®ôF§4-3ô{2ÂöO†II23Df2P]]3ÍãÉåMÄŠÓ¯²DIFñz)ûÌSKP4áî³Ýˆ¯-  pƒ’ÖCS‡ú8+ŽæºÛZ>}Î9=•}'ìB£«Ñ‘*ó5ýÍäšÛ¢¡™éG¥!œEW_›9>š±ô "¦»¾–_B±òµƒdj·ñ$‚j.[PI]ºª¤P@=á´’5‰h*9^1¢Ìˆ‰"‘” Ûuƒ,¡,ŒÂ¡‰ƒ&-Ö*½-Ø@ÔªÑ[NVœÙ¸ŸÄ¾ pÌûÛé2²Žxk¼mƒeD'ø«0À‚4FnÇÄMMÐlÇ_wßa"L¢nÑK–Á< N³ÅUSšæÔB`íÔ˜aÏö‘àštµÐf¤3.-¯Ð5¨Ò}ä”Ö8)Bû)° ‡fô™´‎fÜP¤IÖTl-s×ãÝ Õ(ï‰íñ4vñu­>c(\|r¯¨•HU¦¤§N„b£áºf«gDŠ4Ï"¯ ™ò cýJ¿cùÕ"”õ>BZZn­,Ò8nl‚^Ðk:®#D…nmzôXA<•D@l2Æ4<ýr|‹Ü²X)^¡ d¸²ô3O°Â9¤HA`¦Œ÷š #BDöHak“á¡ÞËÃŒ:_ϨfÐ +z=>brf¯=‰h&nWä`®d€ Û®µcÅ£)@D¡* [wŠJ‚0ÓÆGa­¨ÏèÚ40¥G}K)«"ë j:òÌ/K;’´‰ÊxQfÞæ.Ê‹»OpÕLr#}¡êM±CÄÌ‘¨‚*+”Aá,»g¡e”Qn±ÎC8S+!íQ)ð3ýÅ.—IˆNîxkA~ɘ5Õ ‹CÖ§^Oè.»Ÿ‡:™)\Xd¼@hM LV¢`NfÚZ„Lw¤ ¹ƒ`ž0Np„6÷ FkçáéŠÅ¡Ô3–*ŽT/ÆÙæ$4[3w¬^Toz6^o’s>…Ï€ˆFì.TmæÞ_P61ˆE¤5ÖS<2A$ô2 !KÄhe¥4Å拓ÔàòG9Y¹_ ½Ïk‡‰Ó¼àH4CÓ©7€ÿÐí®WM¤?#…ßJð;×å·P´Æ¤Ø2 Q!&t‹ÐO¨ wh%[‘Ó±U¦yŽ­À [eó‚׎;r”i¬Mgl‚SG›Ñ3Y,o”㬹ᛦ7_X:Z[©•¢•Â@©Wg7b& ñe.4 ê 0Ý¥7 2EyW¨'¢…0ã´dæÁ&£­Iî-'¹ž€,‘vO¢“„”MˆaP ¾Ã ú#é¬,§Ù—@€ÙÄ:ÝPo ´ŽeP Ê=êåU² Þ)2ÈWvÏLû Z¢wÂZç<bšé‹ÏŠzÁ3áN ìI³îewbæwò4öMHŠ—äŠ!BèNÞ‰ÓÆ;UzG±±@»3Z$®¤¤•—éL‚ê­ìž¨†Þ€rÒ·²@9e`Íݶ䔲(tªM‰Î0:1Á4›{Ꞥí\à͉Ip¼6Œ/ÅêÄü5³NóÒèÝõ¼×ÏŒG"Ç,ÔÔœŽÞL`oà HCg¡¹ñå‹f+…oQ¯Ò³˜Ñ[B}Óg’¬EPHM5Oý“ÕŒÀµ»è1±ÔÀaùf2IǬ},M%Á7j tqk¥¨líĘ'¾u¶ ¾‹Ë4 +3›§ ‚:M§áÌØ).ñ­ÓÝÊ-¿ÎÍf‹I§ýv¦±‡Ûf7P0}g4Ûºf>)’Šæ “ £H‡{Ѽ‰å@þÀDfÚŒn +檅0›Íš6·¢ iân%íP¡ ´ã8F8 %&ÈuÑ 0Š.©YžÐÆu™IŒ•ROõÂÐM´ðÁH|òàÔ ?ù‚ñù`Âþ§‡¿üÍ»·¯^ÿîð“ÓéøÕWßûë7ï^°í.gƒ…ìÚÎI^a‚tžH¥Â`׎¡I°rR1@ªwZïÿŽ)‹ØËÂþóS4X2ÅÍï’Ñ,ÂÑSÊj ªßð|±Çz¾`Õa•h™*7‘q9iÔ´ZQ0¨€ŠZX±Â©~õB®¥Æ2ô¦Püž>ë„~Dö.1 ª¦<3f“¬2ù¬ ¦?]Ò¨t{ZýéJcP‚Á,ŸXWç?á¦i¦{Ø(|“?ƒð7(°t}šT¾í­¤%6âSiÊB+“‘1ql2ñÕ”½i¸ Òv“xn6 XCs“¹ž¡¨‹ÐÜkݤB*YÍËl:U¬B°Ø•R¶ðäÏTœF¬$‡B +àˆ—"~ƒ¡Û‹))w\æJR‡ŠJ:{6´(ü´ÄÐO»|Tô™s©Ç2i‰p ä•„Y¸±I¸«ð9ÁÓ'À2BT'Ì¿s¦íËÞÁqV‰…Ƹyš° $™=ã(%ãєؖH8ôØŠA{ÖŠ–.‚˳¢û’PllZÔBÑ܉ï¶:µ ß`‹Jl[ÐsÃ~ÎkÌõµ¢.ÎVPm%s6&äá€m˜”%Šb úT™ö`'¬»Zp&“%^±‰€Þ õ—Hµ( F‘u(mÚŒk³fÀ »¡sÝ@N!hÖ›“UŒ +m¡‹ÇçnðófÓŸ‘Í* 1€Wa¹ÌKQ·ÈA›fd¿Ó¢V T”>…E ,»Ce6uP9"ÁhÁ#ˆë†Æ¹ºc†IlŠúQè,mΣ0ÅËB׉¿2U'ù+!N‹ë&dÄ"öÌI$.í!49SÁá:W¨á¥˜¡œ4:DÃeªÕDÏDß•>Úú°âÒà÷ôŽÑSÊFyN¦AñÈ jj´3ëݘû?µÞ‚éKxrGL†ë‹$Ô=«*ª‚aS†/QH­0.µªt2–D‡ú];åK£PC·[pÁP;`^éo\n0 ‰µ—Þ&é’¤kÔ%ƒ.fj³j€û¨ñϱߖۖ·-ý¹1L4ÒŒà-<}¥ƒ£:€C&NSì.!²?/OLy‹Ü5hS!úßëR¢˜h$dq7CÞ•SšÆÝJcÚ#@ÁC`ä3Ë(ÑðGXžS² {ý£[ÅÈÔ$[Ž¼% …ô–$Æ·q…*ú›˜RY©ãÈðá”`I¸ óÍTt£ 뮩E€Ä>ÞË<‚ƒì)J7o½åÜŒ4B´ßä©È’sˆr,r\QâŸM‚Œ4ª(íÓ@}GÙZ³Ð3 d°´´óF¹-s…@ù\B÷:fIlrõ™)Ý<ëõ¨Ù)! dÞºâK+Mig-­‘£EIâ_ÂX –铸 +¡ –´¥PÝ`Ôo±øò•G-¼$#šj2#y¼Ó+¬rd1c”n#ªGh3ß5/º»ëCp î‘A,Z\Œic‚ŽÎUçÈ|˜!Ï! Ý!ËÜB­²_æ²$ì•È¾pSÎ_ŒTÂœ¨_PX¶`® N·À•¯™ CÆ„H>ª‚´g 2àÌÉÄꪞçÃ2ÍŸR Üá`ƒ$þsßMÕœH=’²DxGc$3u9¥ƒ*’µQÁL<ŽQžÔË”ïJ8¾Y) ›Ævè£*#ïiXP¥*¬°ìR‘ÐÜÑ$È +êËJyâú—^Ÿ—a¥ÐqÊrÓA—¾)ßÙÌD¬h6º™æ-‹1î![ð\šdfú‹H¬ ÊP×cEcÞ7È{”‘„%FF¶z±fÒà¢Pÿ +é¯핹 ‚!?¡Ež(A@ý¥Ñ[™o€ÄØòDÁlI–ä» #`Ž•J­Á3£âœ™ùÈë*Å£b¦\ΊÊb…$D¬eJuÂxåµ»"ˆ å ìUIk+ L·³A] g¯ +K„À3xš*¬Äì,)F³ÆJ_¡˜*sF£é±U»eˆt(Ò»ñB®mT»iûðæža æ ©´’Ó¢I¥Ÿé#hé­X£pˆ©´Àl_„Ó£-‹ÍPª +?U"@ö§eÖM k§F`T d]Æ8â ¨'4d‘L̹âÉΘãì,šàŽVƒ–)·6*¼å³¯G8g½*]¿  L¸GHÝeØÝXkj zr‰‚ºM{)Þä]—Ó +ÄZ*ŽùL3Va o†€*nkd©á@n•¨’©y¶¯”êNv +pµ¢AÙò¦ÒÕ}\ÐÑTýŠô,纽 ‰õ:âç*áwD]E†r…ï-ã„r¢Q _¶†é (TÁwIl;o"¯%Õà•:å>Tš»9•3ÃŒXÃï:Š¶q¡Ã0§‹­Œ¯É,OL@;™B$ç܃´›dN·5h E6XyH)Þ0f 4É¥«‚I x'UX4ž”¹ ™¤ ÂIÉDÊHOÿ:¡¨8‡Ð“7'ÂFi€f +F(`‰qLKHªÂuøØ™6 ?°H¦^Á*¬ …RìÊl ð¦kDtÇ€>g³+7eMÜ’šbñhP÷YáEMvMlÞzªC&3Œª8=²’É")ˆäd9#Ä‚wq0d Ñ4ƒêÁ˜ª‚ÉŸ¬—ªx#¦7Ø[#š0X¡L“T—~µH`VÐËŠ (èf1½£;B…¥¬Ú‡|@Êöüž *‚rÌ0]è“v7†í+AÚ`ðYð[N4YóèõM› áÚ$[³%8¤í )]|T‚Ç°õAЧîL££% PNPö å‚ôÞYªRQT$…C0ÐÝx Yíx_Ù8XwŒ- äŽcHÒàˆú‹¸H¢ß™Òƒï9AéýòrÞÇûP%a3}•Q©h’&<”4I¨Xai…ŠïfÈþÒË«q¤ÑY¬„LéUI;*+èk +ÞjªPÆ«ðQœÌzǘäMo\aè¦IÆ»3°)dKlAO7à +áË=3£„dN4Q5`R +­Vw©£ÛhÄÎLŠÚ‰`@ñPæòT,YLb2 • 1!ðA nŸW*;2ƒÉ€2'e+Á—ÌòKc$U2¨dR¸y–Q3§ž°Ìò–¨|£T[•öSN¸ ´™Á}•$@¦X^áµL˜Ǫ̀À:ø÷b~ê‡Q™è©gbn¥9tlVU8ÑôÀxË -…ƽ,%ÐH‰Wªå¾ïz sÔ¸…b,/ÕÌ4ôØ1rŠ¶t‚i!œ%lÄž‚µÌTtšÞCrË(÷Kf÷ ¼3Ã…x° + ·db`LŶ=3Žš¢XP€òÁ¬I8 Š|®]¯£~ļ#à6yS}QBÈB˜…3‰b((áÊBH¨ÇD­<[Ø$‘Ebm©ŒÌV°T™¯Õ´Y‰PÀÅËžiײ?B©¢%0Æ.E¢ƒ™ÏF •Á%™uªöÑ›­ªë­Bï&[ƒ8< ²€¶=~—-  ÇTŠ•#®7"Ÿ¦ëŸ0.¶bø)[ Âc‡GÐË¥§LÈ4- ™Mâd ²5–!…FJ‚AHFè!=9Sx#ÄŒÉT‚aJˆŽQ ÑH´P¾{¶Eº*™±·lt´Æ‚äU†2ž»¨Ê<ÍU™(ßRÅ2®‡©b•9,w¸)#f*ï$Ä’À‚x—Š j–§ÄPÒB’ckzekm$4íA6bèŸZ$š r­Ô#Siv)4g’N3ÐV.ªK ¼¯Ðß²ô+‰•ÎìesÇ^08ÚF'deUIµ«©i°A˦ ˆ×›÷µ÷/ãcfDK\ô É4•œ¶XfX¥ƒ´ÁˆEuÉ… $Èþ} ¾¤ÚR¥ÏÍnd»Õœ«rV) ŽÔ» +¤akd*|Ó©Kâ…•£f7N‰ßËr3¯×­à„Œ~$@ƒcQ-´+KóJ|!Ó¼Ò”{H³³L%(‹ê:$º˜2¤Á‰¤  ÊÈS/ÊÜx4É¿p èb*†œ(›TRöšF}"3ĹXvo0)FØò=¯)V”2wy­,­pkUÿlub „W #Èt;(ÝF4Dz«=G;ýŒ /Q´J—TIK–®’’‚12ßZèkE gj\Ý ÃHÖBÞ;¼ê3Cˆ˜Óy™—  1c(A’©ºî…SÂKf[åûsŸU(‹ Þå-u‘¢à苉25’t|SÎåZ$o)j¹üªã­~„m]&ÈD-Ì[åxÌER evD æ߶ÔŠØbDä°Õly?%ï*Bâ!–)!k\8rObáPÌÑX„ÍT$‘5 1Œ ŒýrMwD–ðáÄZ¿,‘žaªTÅ|‘oEùÝÍ•E#+‰Ekƒù‚¥Ï™/é¹!E›¼hqMÄ–3'2מö©’(1ߊ²oXšL¯±b£j'VÔl¹eˆc¦…Sªœ{FœR +‹–TÇãg&EÂ-íN§"¨8ÒÈÏ¡c6 +§Ê¿ÎÔqtRF pڤ̎T¦ˆle$THæ›* +ø“ˆh”㟕†× +‘†`åB³"]S²×`ÿË¿4∩ +h¹1ו–Ûl»±ð™I9jêâÂ4?æ³”§ ýV/ü+a\ƒÒÌšèóï-ªTÂK²ì!«sÅ{J„œ+eyª”ÒÈ»É~ÏHÊ*A^Nº:÷„] s@ŒZŒúiÉ‚ 5EF¢r°±·˜-úU‘)dà¾Üîßh=±~q¹‘XHaÖ³¹öhËÜ£-%¿HôÛ EbTœZ˜ðU-ôš‰”Ñ«)#Ÿµ A} —ƒ2>€¬¸¬¹¥â–)jÒI&cz"áP3åc.:‰UXtŒóÑX ÐáQ‰ ¥c¯BȘœž€hYÕÏÖ¶Y±Ø|h2VföUòîl½€KúLŸUbAoji¡ÏN\ƒÇ0ŒXË`øîÂyÈF£hÇܱAÙô¨ÌÄB©:*5g£µŽ#jLÔÒ縦3R—Â@¬-)äŠßŽæàf¢P0@/Zt|—¬“ÒTŠá1,‚’`r´é‘Æ—j°‘8òrð0RœšA+O§¨2ƒ­9WÈ”I˜æº˜¹+:Ï(h?¥0l1Ú¦‰Q¾8 +…:+)¹-µtù¶°F¶¢F˜ç +•r{±‚”“Z“”•+&ÎLá­B„™™ÔÊÒ›!š } +vOIÖp¨_*„€¹ËBà”nŽ†E]“'kÑG$a²Ï£u৊`Kw )Ü2ÙÐ>LK@c@x`‚>ËüEˆ²pIL²ŒEV»’·"„HÂÉ[c %&U®HRPˆwžÙU˜bFH6,ˆ£ ‹9×ÎìŒd s7è&Ê^9(3h‚qÔÂÜ×E&ÒJ2 JM˜ƒ!)Ë’ ñ¬RNhì%`5óĪ6 MÞÁæž—†’‘ ^ x§ŽEØ’L“ÄÝåfýH«£»B*³ )„6‡y$’SŽoóÈEÄd¸B"Îï¤ +r‡Ç™;dJjšÌ³âÖ™ùR’£0òR Ï&†UŽ97ž£È±ÏF:•‡­¢‘q2FÖQø¥ÕG¦E¶v|©Z1宺)ÖŠTŒ­ÿÅd¡Þz`¢q™%f%åë9·³¥â±«ïؗØÓ +$„’¶¡§Ü>uœ)C°¾´éD;:•8š—D kåi>wD¦,<\60“(fž•òTÑ”CO•®Šæ*y¤ò§DÂ(ÄòOÑÑ“g!Þ맧¢Ã /ÎT ˆoÊY„ ½EˆaGq² ™Ïíéìd¼l¤ ‘4Og-¨«BÌ’GöJKõ]æ§ÎÕ…2ÛQ½<¨ )i&9¨ÎbÓF“Y‘…ŒÖ9æÖ C#f%¤jÖ Ú ¬ôfðá9 Ü…X}<ºËìŠÒ¯ºbqæé^´f£RCe¡§|Mœ„§aZ÷Ð̧î¬;eÒA…¬œ¬hÝ&Ê̵2oeCø¸GýÈÒY<Å#*r%‰”û7Iƈ +ò#wȦÁPnÑmŠ¹lIz•ó‚VWeæîIôñ«èpÓC©“lŠiFÕ]J:ŽK2”p“ÍÎ\HJòиy*)`ˆMO¦xê…Á T¸xŽá–ÔJÕ™bÑ*ÙMÌŠÓÉJÄIÍ=Ó5]Ó´k¡"Ë_Á¬ó#µµüÖñ¬:v£Ž»(¼*u°rô+OdÓß‹”¹PèbL©²ÿD# ‘E7‘û•NÄY˜—Ôƒ#9UX*Ô³$V¸QZiëE2^QšsÌÍ%7¶¸üž©zBÇ«:×Y +8…2&o'ˆPΥȧĥ1{ËÛ¿W_D0wx–¦à_v ³ *|<dŠÍ¼@0›ÔYbZü‘œu Q&š¥xËŒ¯ìܬ Ð‰ŠÂ3Gµê”À´˜ŸYU±@ÔX)ËJ"ºÏn¥Š‰‡_ê°…(î® +k—lv2T0){Ùõóѽ†ýÄÈmz…-.§tËV ŽI¤ìK©äêûÙ<æÖÛE%ÕÚ"Q‚aÎd1BÉxÒœ’WU6ÓWÃs¶­bœe@àF[¿ËR7AHx74Ø¿r£^UlÆU%á_J¢Ìã{"ó¯37K‘o›¶1® ’p®ÊB‹×vá*ƒîCIšIåö6ÊДŒžxÇʈZZŒ +—•BÿšÅy°’„•‘¨‚nVÐIN/‘âfåá÷‰˜KÚ¹Æâdóê¬ôÎ,䥰cB.¹ù½²;7»˜‡ž}»Â+ù çOð./Á”c60Í3ã9”,Bx©0#‹…ú-)cKÃO4u:ÂÎdÀSÒäª Æ™ùÊŒÑSUt´yZƒ–KÏɆO.ÈPG´b<Šú‘K’‡š)Âp’ÅIóÊ|/C~¯„n•'¬ì‰ÜnÌÑ>bCù˜NBŽ¾Ì„5cJ~´r<ÏÚ-»œRQ93áQê“:¶•‰€T’B fTÎn¢UA¿+hèg6YSºže‘ J¡1–ztg}fµÌÿkg·+Íç+È=ìC' +ÿYu˜|ä$ñ‘0ÐL±5p&äîÃçYdíOÝ[ h4´›ìªê*¹¸Öû£xO¡l¨é7YXÛG¹M5èkÚ°áÞzVÊ1ÀÂø@ÉïöƒmÈ"úµ]%‡"í@`£„ÿÙ$ Ž#¬°QSßNRŒWÁç@’eËÁh=U‘k·õZ%¬s56=T|fÕ]b®ð#ó¢€có>ߺM1ÆT-7…­©î»(£Ä?‚ƒÀ¨Ù·ÃnA•FB}hǤ/Öç0ÕýüR5d ±SºbÃËmÛ‡M€3.Îη£Ä}Éee}—5Ç©÷+ƒîÛï8¾Eèš )PXgW¥ÉxÞC´¤T’‚@oeGgþŽ:»¶†ôȽlÀAÝ€ÄU@Ÿ©Eºb3hó`˜(ËgE?kGø56$á +àB§ bÍ¿öÝ3j5@Í£!À¨q¶ýU*ãœ`<”íw¬'qT:!7^¡ŒÏ ŒEaS°;í”t k@‰dúV'óo="œ½£2‚óÞ‹0µI¬åùÎ §ŽÜ 4àdy±€Í-ŸMi,ªkútN¼:xÍHgß=_«tWãk;ŽÞëÝ#W¾z4àÍôÊ|Uå0z°û„ûŸ¨‚xÉmT‹8Ìf€w”r"ýJ¨<ªZvqʱÐ5º’3v›ÈX'NDžëÄ'“\bÖ ÷^¤>mê?‘˜O²+²¡“+0R¤P v™E +Ó—Æ %x…È-‚H£.I¤€àŽà’§@bt1¨C²ló1ù™;_…Û0–û·¢=Íè”y›—÷^}×Ç×xz¡IH½À:¸T ²t?ö¢íâ9àµC’JôÒ㧢 žxÏWó/Ž³ÑWƒ:ǵ#Ù@͆(')}ƒ™íÐßz¡\©Ã'•h×ñ“/gtèÆ]Å l(¡Fé ¤^ƒ]eÄÀ´3æ9S A"Æñmæ +‹ «îPô0±¿z´­Òv‹ ÅŸò²CÜUŠ¾Û¢‘!U®› µXp£æ¦›õèÕõòQT”˜®¶¡1F]¯×}i æfªQKÉÁÎ ®=`!_ìÂC¡CYwn–.šJ“Þz…h×ýiº8½õ¨ackµã>éÚ×^p¨ÿìÈ÷­ïæð"}¼z¤-ý8 š„ŽB·/ŸÇÄvÜÜÖãlB _¿M½Ô¬¢sÊá²ÆÝ_4Pyj”Ö ùˆò¼õÒPbÖ=)Í}F^,†âUÓ ºí,ã²Ý „ÁòÑX»ƒoÜUxƒ>ê"#ê¯q­ë†zæë` –™Œ”Pt蕱·&(Tëoî ÔG‡5o¼_è:êÝÇÒ©É)(ÃX‚= #R2붎¶ó.¹Ð‰°¿°F¬0”ˆ÷Ì3ÍW3ÅÝÂДÀ[QGØ׳µ®¹&¼kâð(d%R^Y/õÝ>üLý7ÔCIb7*€W±&"£ʯô0ÎÃ#Zå×õdæØÇÏ*œŽ§š-ìኯñää×ܸº° N;‰/ñqFƒZàkT…ÜsÚþç+Z:²þ2Y¯ãªVX1/JšˆÚkåHQ”''WñÛÑﹿ£1l…‹øÈEÅ丯ûÌ¿5Š¦'!I8®C o°4?Vc<<ýµç&}[ +hªÜŠ¡{0‹€°‡¸ÿŽöc>²›)Hû«W!†ž§.µ’Aâò)ÊË€ +„Þ€åï­CV·¾K‰cÌO_Ô´½Ô3"ïÞšïr»¹#Ù\åA– +e°‡Æ÷bQ» ­n˜`°4ŠT 쯔P†Ç ºJLdjõPÌ°í@YÖ†åê÷W´äšÔ{E'úʸ8@q¡Ôˆ«›þ’ï=úÛ´C–}¦·^…yº¸$˯¡¾…2…âÕ‹ßÄðdûv+…^÷hï=â¦!ßÔe©ãþò8) +\ˆO¹Ç$Á *IôÒA¾¼f@Döˆ~íÄ A%™^Ãî*<Ö2Uʼnàù ”ÂŽ,w2âNã½ÇyIÑêä%­hÞ¾ûbY1pI,Šž€Ÿ-_ö`{$$‚ü¡Û¶ ڳ׳Šò$P*td`}!XƒncWå”#.bâd …æ¿õˆ›— ArHÀûqŽÆÈŒvb©–"–Ê*¤ïÚ|SV9›ü‚ÑsQ×9¡ÔŒÝÐ?&þž¤!‘_QÁ†‚² ¦\5z„ƒÁ¢¬ºWŠj§ÏãêþrfÞqcyÎ^J§yý„«€yÁù+°57·øÞ& +8OM¼ÊCYÎAû DáƒèT;C{C¯uä¹´¹wl —Eùâk°Ö*Ôw‡²;ì O½ÂNeEý­—üacÆ‚&TVS ‘µDø«¡´ÝÒ¾wB?P™r!ë¨dgSU&~VÔsÍß0#L䂉҆P‚µÔG¥«Ä”N£+¬Ø/ã¡Âñœðµ"ÿ‚Ѓ&[µÛáAa§ÇŠ^¯çø!Ô‘x£†½ªé½†LÊ>QD¥s8ìo³µ*9á¤Äé[sÈ,=¥¿*qÀ¢ÀYœ>ùקCí’õ{EÌš£þеM'¯éœ ï‹—ˆ¥ǫ̃‚"ék/uÅzèŠ]×0Æ 4DÑr}Ѩ_ó°8®/î¥Ò pÉTݽ¦†<-jõ3t¿€%ǽb+ÂUˆévfîd*RdsóÎñdùµÚ­YzβYQ Å®ëJ!ËyÔÕ¤Ñj\Ör^zütJ[ºMõ¦•ôûq(þÉn½È9v¨hµÌ°½wørm|í¤&s3¾Ûù5Ã7Ôn€GŠ % d›µ0ÉÍ› +HîØÿ·]¢Ø…w%· [ EvE”$FØB ó6%.­¢tõVjbt²ì +pÑ·%ݱQº¾s?%ÜOÙI¢O-’qQ ȼ Þzüu'‡œ¶_ᜑ(ÑšÜCBõfCƒÞ ´t,u\YqÑDLràZC%æR´SN³ŸNWmï¨Z¾ 到O|KÏ~HK-;¢`(»>˜E¤ÿIC‡Á–Ú]<…˜pMˆ¤(¾øPëÆ™ó SØ&LÄ)ÕÑFÜÀ•IÝoÇ!ƒ5)M{8] »>˼̷Ìñ­6µrÌ´üTÞ(FrTëî(\-‡ë 9üy2³¼´Ðž†”‹KÂCîÁΘÐÚö§ä;z[¥Ô%ëÍT‹¸®lËd|íçCñªá+Ûnh©ãŠ$ã$j²‡Cþ‹éq¯sã½l2y•ÌM.unñdz5]YµÎ`…ø*jëWáe-,û(–€ø/àbÙjïñ2p9g ÷Z¤pnI{¢ ’¯ÄKµ§ûr‘Á«¢&0RïœÙ¸ûl[Ö‡Æ$¡ò +»ÂÕp‘ÇÐiÂB/`ÅPÀ•øF;A¢ÁŸI­ºçæÊÊ%ä’èȘ >Š(ÖˆyêüWT«bÖO}çÊý»ÊkG”+Êã=¡@íá,*N£¡h{|«I4=ÐÐ"NBÃô,G¤Ã&Üvð¦Es*¯¤/–C¸`Ìp7V÷ÄÓ“þ™ˆAzv¡‚çn a_7a½ +C£=ìS -ŸI +ðÖjTG”Ü/ ÷wr9oß’ÖÛ“º3½ëJáÃeRu:c€&û3*Óºóq$³gpùñÐ ¾e|…z¦þœYáMp+SÀ>å÷€äzrû/×ØN’ç–h/ÍÄdËfÒCgÝiÿ>Vƒ¨Rù¡.¦ùٙ紶Å&ô÷ßÇ£õy–S$ºÚ1ÔÞ§.¥ä>ÚAØMbÌõ¢KßÝ”Ì'ŠT·9O!$j\wÆP QŸz½—ë]òÀG›ô]J0$gø }•I¡în”› ¢×).‡ è +•Æs!ΉëÌàĸúII•Ó]Ûôñ +Þ:J¤Íºª¦W艽5ÄÈ| "Þ¾ÎÈÛ +®Ób;äÌ.š +¬úýÞÛÿœà¥ñD^Vk«D1‚ÿãªx*™’læÞMßN1P¥mO£‘¾ùf~+°"åÂrB50ÀòòïÙË‘)°mµ‡U¶™WÓþÂÑrS¬{û"­úÚãfÓ>?±=kÚX“^]›p/BB„–#…&a&+®"²º³,òö%Z‹ý…· ‚ÜbEV7—$«ø’/G ¼íÔçû +­²“#ÖßBgC¡úsÊû·Èx”[î LuÓúÑÜ‚þ¡á0"…@š]M|œÎŸk¨OÒåÀŠt|mjuöÒ@-Gø]Ïâ*ý,ye“P»‰¢óyÌ’‘)4À­ +·F£r QÄh¸~VˆjýüŽÅ픋Ñx´©ÑjkuQ…1 ­,naîZ'¶YOÃóÞ…+.®Ùùó[k†Véc"4QexˆîDNØ{r6†7âÓϲïê–Ã'~ô˨W§h¸\éúÔ—¬°¼/id£B¡¸Ÿ*_ysY:Mἦ‘ ÈÓ¾^œé5•q<'¯±6yó2L&à- ¨’f£©XÃëç3~Jªì€†ÅCŒ­i5‰X}C€Ý?˜ +¶\®¾þÚ 3¨NCDg!TENøƒèùV¾BÁ˜j£¼èëÉ@^ܨL&<„Ê’>–Q†à®?Ç„o§æX äáƳ±$õ"}íɹƒ¼²%£WÄAÛjá•.2òðú’VÔÕˆ5„V™DÔ;‡·À[ q¸k»N9¡»·¿•6õ¤¯µU¸"h‹ªGG€: uŠdql4·®F ÜMãúÍ#¬à›?,AÀ`I‰—=äšDËQ7o H~C½×Æ ãVÄLßÀmæï…êoYîðD\„†§'l”´°Ö£õqë›%té®B*+Ø3ÑÀŽˆlQðÁà·Æõ^†-˜SRaëö׈’ÅS˜”}†ðë‘Hk[×p™à ÜÈI§jRÃneʆ37B©U’w]­Z©µ?U[h”cVôa¯½P¯fïEu†`”•GÙ‚kF…ØK©)ƒ—'£­rÞ’&75ö5»«¸åþÀ©U@lmåÆxÜ J±ˆB­‡vQÕC°9\>+õC½ @G9Â̧‘ßKÄ"ë†bs÷ÍͽçÖë²îŒšÊk1g…;:vh2¿°Cÿ¶1,Èp€a¹B+ ßëdϤ²noI[Ûí €mWTð·à/¿'ØFNá¯ò +ÿ•K˜=öï©‚þÇ׌¿ù·ÿóüúÉòÇ¿ÿ?ÿü¿?þæ?üíûÃ_þò§þ§ÿöÿüø_þðÿôã·Ÿÿüÿ~üùýøŸþøùÏÿüóÿýsœôëoü÷?ýùOøËŸþøã:Å/.î~®à7èÿ•ÃÉX«³¨Ž‹Æ`òÈw¯ÉOîÑdÁB‰½%)‡°â*h‡¬éᇵú¬¸x +2iëÞä9)=; å[•8½¾ä\®%%ÄS+ "÷¨-°P4 +@Z³áD´î4Ò`Ò«B1À¤Þ6°9±!¯å 8ÈÖ.l4@¿ˆËl¡eÚcjX¬˜KœfW8M­¦¡ gû(P„V`q£Ñ섬äeê2ëðáñ5 š¹:amf‚Sý}ˆ k«òavÛc…é!ô–W`GDn.ŽAzt£å$½÷ñ·dÖÿÇ +KPåáœÄ—€ F!œ0U’ô˜Dóµ2WŒèÑšÇ@’"NÐ[(T€¤ü¬ ‚`ˆÊ‚Å!ÛÍÊ^MÙ­á‹/ûJmñ +-6 ¡®¯;¯^H}BƒçóA)¹æm^0ÑZá׬Z°+†é*dôï£è¤T œ+È1ÚÛ¶lOô5ƒŠš Ð%6ª£Ø­ÄÀÓòú cÀÁ.«tÍîؘÂñËS~&Ýv†NˆÒ ¡ßè„"ø!h~—(=CÞäó1ãèè«`¥§œ¯FãêýÝ2TžÃ;ß"D¢(U¿¶•ÌÜ>`Ì-mû‰SʵÆÍØåYR(7íDZæÓÈ[aË"·Ò… Ýú6ïÿuš?(n; jw'WUò5@E¤“ìµ:?”„§2'@áµÁ¬hH<êÛ·îXóמEçE QnÞð4dÂÝá¾&®.‹‘¢{¶îºf.ëãè(š 0ñŠ¯‡UæºãWèSÆ<Ñ+¨ÊÐÇp„6ˆ3Ó²{ÎS5{Ì[*HF•Jàf»G!Ü£GÅ»'GÜåyÔ@§G‡øÑ‘*i_(eÆ™º©%!îR#ºvgÛ02¸ +±Ñ7ZÀ¸% ¼÷¸Üp0~IÐí3½öº;(Û£HÆœw—^ÍŠ˜ëÆt&–{]Â&›ƒ›4ŒXóמÉа¬ãÍ[ÿv5Á™ZaŽFõ^7X2Iz¾öøj¿uý•­ »H°£è¢^à¡i»ˆÑ••7`CøME‡¡ôÒ7ß’ÈYí”À· ”>°íu»ÒBPsÃG¹˜ÿ«waƒÁËm&ŒFSù¼èúôxFmWÍà‰Ññ_3ŸgrMsÚë+H^Ð!×I̵¢ÞW3å²6B,Àét6<Ílãúéšÿa*t +—Cy¤=™€˜«{ØaU*=äÒk˜L¼5¬9•]™yoɹ®Á„XF=|m7›.E”cM(ò@à¨æ§!®.<”X— +FÜÏ·j‹é§± @ ,êäoŸ'w6q¬_65±xqsðÐ@qƒªèÊ¡,?ÚŽÏ’WCÏVY{r÷à|`è±Ç—`JôPjõXüh$'̯¡¿¹“ðEŸnãRáìB æoêÑ4 ™CCš¾bYÄreÉn E©e?ý,PæA:(ê< ¥ÆâO)Šï =4b”½4棿 } .»À˜WÔ/Øxka³¦ŒÙiˆ×²Ý«²8÷ûó[À<Ì&`ª‚yP=Ö·U*6­ê­Q"c_‡ÓÇx-~u…^9ädÊZV#œl V&ßöADÖÉNå +y(´ðúA§¦Vù<Òܪó‚Þ;Ü0&&gM•°õ³BðQXÃÿ4îµùô¬^I€r‡¬.oa‡wGÉ™F7¯ÝÑù~&íBÌDÒ’´,6|L)wñ¦PK\uÌÐIìòjô^n?i>FÕu§ ×•½ÄØ`7*¤„µÌ;ªÊ¬GzE_^ˆ´`4Ñ (Ô†¬F9‰•òè[Åtjˆ0Oý«C¹u@ýÅBÁE2áZyZ,&_®c'z„ø® +fX«¬2°¾{ß>Ïy›¸dö‹…E¨ â¡„:t!â@Ø(¬ý`ãù×à¿—ëS™Æp/Z$ŽÎÊ”©¯´ítçZË0 ZÙ¸©©&¸‹]yWmô ƒâ æ°×-…|pè"å`€@º ð,ùqÌ¥Ðudk]º›8¯êtc< b° £7¦8FptÁ¹R¦ªß\A½Ý¥¨^Ãr䬦ÍõknàõaË®õ¦~gû„d| +)5-xDž>5óôšŠŽP_³= ¸Õ€™)íóháû´= ƒKwKÕj1ëõ}ô@¹‡Ð©rXéóÙÇ¢ÞpèEls ]./­×g(x¿5{…/müAiRo¸d¾é‘ZD¡Ù¼z<¯aÄ}Bf^zx#?ʸú:×/Žƒô.R–Y à€Þ(Ú0WÌËV²ÖmÝб†:èÃvꥠ 0S +Œ]å¦ì”V²Ò×£âÉò×ø¬MÌZ°tê=¢æÃ3Ï* …ÇúÛq`Žû;Ö—ªok«ðÖp`tg4ü¢Q­|µÐmÑ5m­Ü~hNœ*Š2×€êÆ¥© :œ³2¦dS}5F¼ä‚OCܺÀ³}vnjÅêR, òìï øô +ú[ãÆ–TUv97ïæåÔ냀RÏZú)ÒÓ¿±‹a Ì$ýÝ·îHT&ï¡é[ÃÀ”ð¹e/¨¯‹©J¥±ßÍë¡X{¶dòý=ðuËÓp†llàÑ„[óó-lx<Ì,Jx¬äýS"Èr, _æfHN÷1wA³X£Q8¯`dnµâ§0‘Ó¿ô +Úpbãã¾mk on¬Z¸a.¸}~„ãÝØþy‰•ÎªTÄë”×à$m - Š» †vû†ªõɺ¾Æçˆx!0y™T>7ê­ÜðC—zmœèEl"!ìÄ“¡Ëqëà`Uˆ;4h¯8ÖgÊÿÑ„†Æ~È)ø6eXA"pS{?¡ÊÜÄú®›ZRlx=Úv¦>Ü]³@¢¹vî‘)¶VñÃZl*”«¿¼íw +ä­³À$ÈÆú +<Ì{C#ÌŸvÀù‹Æ¦3Ik¥5` vùĸh©MbEi¨Œ|¶<Ãbt£Cÿþ{`3 ÙðaÐF}Ç÷ˆ».®½8Á.9S….ûø¹À3!2H±Ãb’F¤…)…WîãÚé‡J“+X L§ë»´„ù(ŠŠä£Ûž/á-È LÌ3û^qo ¿˜v_‘~Ñú %ϵDÀµDjWG£šÃÜkøžxÔ½ªiž T· º8¼«ÓÖ­($ÀÈ Óe¬ÄfDzÛHŽà‹ÝÙtÅ&LqL$±- ¬«*8w¨ØêçuƒXcÊáý­OÓÚ€†gëz™.¢ê‘"|d*¸#yá´ME’غ–˜Bm»w©w,ðOªóÑÐNCÛ w(ŠÞ§ç*5D’ÈíRs-ÏÕoy³WCi¡ß,ñ§•±Û™²ãpëÅaȯû‡—;râvÀ¯á{šã¸Ž¾ÁÊZ¯ Pk<êûÒ›8qùk&¾¢š·iŒ+´a4»TËãë†äÙÕ › wö‚ô0J3êt{§˜S@>cŸˆ3Çn¬~»Š`Z f2àèó^«}í¡åªQ6„ù#Ž€+ ŽTÎqA·W¥J¢ûLh(ÄÀ™ðFjœ ¸7gB„<¤a⸷FïºÞcs$s +Žäø|ÒF ë~jïSB’ 0ÁPt€y#µ®úÙÀ/Uœ‚F9"Ö§Q^úz¹‹±¥7TØÖÅ!Ç7£PÅçuÝGº+DyÎg,/†ò)·ø'¬‘¢õVË”'÷Rmp¯ ×/B\óƒ HæÛ‚Ð "–&,$¹ËE®ù‡” 5!ßÌ—ñ†²÷7T‚¾8ε•RxœU7ͼîPIƒ +ðÖCòWÝîv[‘æ‹^9üL Ÿ]Ö‡¶8Aˆ£è-ÕL +ÖH·8ç#žê™åÛÎ5Ù Q Âz¡\3RÊ5IhA ¦H}‰3¡d·?¦‡za%"i;„[™ÕûçD®åEkŸ—Cž Kž=.7Ó—”z`(_ +o3;l(:„‡ÕÍ~ AjŸÃÆBqJçrCÆRñ¡ˆ{ŸšJáåj;K{i£ø4Äx‰Ožo±zRE¯k‚bpšß>ÇÚöc}^³—Ny[˜ Vwd\ÓÜׄRC™¡ÀdœOE>¡$Êí¢ +Ee÷µÇO»äoöSÅç/:Yþ’UO _0yZ:ûÞ–UÍa"ôÀÇß…¢,iº{Ã…©ôN‹ÙäÆKdÅzo¡­º…¶Î–ð­ÂÔé‚·š¢€-äç¯p… ª5.5%ÔWVÀž: +ZŽßµ~)ßE/U9eMƒ$Ž7UekV \°^`•ÙŽœôXHP B/}žÉÕ C+5*ˆSyØñ8°Ìè! Ÿ@æíÑÃíV„•¦®ØõÍÙ,w°QÖP†pªÏÉŠ¾«¦ùV ”ÜR»S³ ñ×¾èAL2Dh­é%2õk/l ”.éÚí8aªæ|…8,fÛõ„Ö°‹âkŸv£\a5Ò._g˜8¶p†!TfT !ö PúÞ#Ôâ{›B9e åJQGÁÞ‚›®Á U[óQÊ\*æà×ÏDÎrQUêõ80mÁý¦¯ˆ ‹wä +IÅ“Gš–‘®¨ûv·¸ÝÇíŒ^ NÃ&+oÔ¶ë7F‚TÉéA*Ë%"‡­t¶GqÌs&à Q—= %;l©ótèåŒ{²í³‡Hèçsî+}q ­!¤ÄX¤)$zè 랥I`d9ÆWçÞÄ™.Hv§†Ï"ú ðE àN‚Nt¬6P`vÇ]ÞëµCÞwåέo-±·N +|õ¦À—¸®9vhžPãÚzja#67­hZ2[‘ãÕJ}ë[€­$TñlR@äå(=ØDkÀïâµO +ÈwÉNa8X—³›% + ‚…w @·"'Aõ’ïe³'>­ÎxZ»©gÁ°èûv÷_ET·¼Oq‚ÐFËþjÚÌ]ÊdÞÉ·T\f¶þ;;f·•Ðél˜¸Ý÷{(–Ïà½w®|=DòH'3ÛçsjJ”à¾èqo8Û +ÅZ;eù×^À{ÕÏ]/óðLŒØpG&4´]E’ŠºüMÛevWÑ#?(‰*o‘ì®ÑÆp¨7‡éקY}Õ…óÖA•ž(÷FØTƒL ð³l€DF©<'RàT2¯sn|=A(õQ.…˜¾"l«G¨'•]âé€&ãéÜ5Ž¡º[_ +œãôHÛœµ•F¢–X¸CÀ_Z¡l¬ÀîšjÀø¢é¶ú`{^“<å"™§ã/' bµ“Wßvu"añ¯=â3½õºP…ûê8pu’ÖàCº3zôâjd9®ÃE™£‰‡êæe3® ª€1Ûï÷^·¯Ç=SK »2Îï²í²ÉRþ$`¦“DpEáµ2‹¾÷ –Â`›×^ЈSóÒƒ}ÚÑÇ»ÞU±X·dßP¿ÔÍb‡fœ\ߊû¦º•7饘šÒä¾îÊùÚãumŽ,ék/ÌÚU;âÃf˜k¬R,1S”YÑ¡?0IgŠpÄŒ vDI™¼$É\eý+SåC~ +Ôͼ&Wôè@ÒJf'9Ó-l)¼æa¨n› †F¹OÍØ ð¤PRI늞â<ܲõka ³áAÀeJhþ~é”}&/TÓ6?«0Hýê,ë5©x™£˜Ák²fÛ@/O˜k0Þ}ý8Rú32 ‰]à‹àßU×v5”Âï®tt"ß{°æöq×^gè|(4¨_ +¾$O‹¬× –ÃZL 0à¾U\¾môŠìts€6<賕VI•* Tf^´_Å»@Œ ÃwžÄ·ïnu+ûëV†œý±y×¼ñÖy—úé¤÷Á8–',ºT*9L=!£ái +FØIðrUiÂh(œ%Ž¡U)zçãAá¦]§@WÃÚ` žcÞ-DàÃ@!¢Mh) Ç"ªÅQÞ6ÓmmÝUþQA +™EœÐ®úY"N[ÖÊj8ð±hµõå¤0ÍÊš°–w5Þ²d CÊj$4ìñH$¶pŽ¥Wks÷ +"鶸LŒQè¥Ý ‰BíššÝú ëÊÊå‹·^[°¶ý¼©,Õ¼©hÚÊøÝ^Ó|±ªXOµ·Ê©U7 jâpOw¹32^®‹Õ¹–D I\™Ö>‚‚¼›MKéP@‚çzâz™¡N푉s°‰uH—êãÖuêN°/ò–ÕÄî‚%cXO„a$S}Ÿ'‡H;Eñ+odQUúÀÏ¡ C‡ÀäPST^Ù6S‚#†'¹Ô¥ÿÑÍ°ÔÄ,ãáßæ×Õª,ÊPØ@Y†¹ w‚߰›N8f¯´ƒ°²F׌¯›þIhú’ݱÇT›’ ‚ă‚#<ÔºÛÑ ãðÇzBÕ ’hÙÌ.Â?ðé¨3KšžÖ±ñf +&ƒ˜,RȽµR PFêáÀ©f·’ÒŸ,{¯µŽ1@ÔPíµ6³. ´‚° ;kÀYÖß‘²ƒ±†O£[RÖH9~ÁmM¸€?DÞš²Dc®¸“ö’kԔ˲Â=­ÎWÑÞà”3.ÚCLë¨èHtõÅ€'ò¤ÌÛ¨ð3o¯—¸Î+ž€Â(b{Ÿ›Þµ/DÎx:¸ÜÁõ—@BÝ#¸mÈ´Ö{Žu jº¢×$õŽ_»unl~Á!·Qe¦åPœ¤GG³¹PU+©œgR‡”ºÂSF€jöz´ÝV>Ö»ýg¢¾K&}P#°Ndò®¹{°æŒZ€)ÉVŽgUÌ1×[•` skb&_1ÉEr…2àmàGcì_„m0¸†kÄòÏœQ6ŸQ¦Çš\¨ +>%p +H‘$¿ÍÍ~'ºbü"ZÚÜ­my0ÇüÊ[ÌdDŠ»2 }w+¸<áCË£šê÷¾Ö攤|ÃÔµg+Ê™xlœ‰¬Öü[eoƒÚy²‹+¸Ì|áVÁ”>~óŽjÚ)$¸U:A1)ƒ ÔÅrF®×< ˜fô¥ÏE uH^“ânõ»òo)GJ¤œÙ™’§eyœ7x*kýèSë—C‘ûK"qT·ÖL'©YI i·—Ymöˆ"!Šš¹¸Žã¬•£oD¡Æô˜5\”ÂFœÆß¹Fz=+@á k +mr*RÌã\̈ÃþàÒÒfÓ¥¾rÓéÁ%l£9=þKûФ©åbœr7j¼7ëš:.EüP ç$gÃú Øl×½KZ§Åƒ ÂPp +NTÝ7TÖÐĦR9«æ M°Òˆ¬dUV ÐÍ÷”k¦1 FZÄ4I:Ø[YI•·½žÀ¿bâJä£4ïÈ;µDrfÇF®¥FO„Ff§àÙc‹ñ/†i'îû=Œª7O `Áõ ×1kØ:üã0ö‚X²‹s¨o`{"ùÒ‘½?qÜx9^¨¶läí“.¨k.éöåMô÷±ûs)rªE}?1¥ÀQ>h¯øÖÄ;aìb +¯!(«ÀÜòfHEçÀ +£;ƒ–KheÀ€Ål\‘¤À[“Ì…1€9`ÛM4ñÚ±UªQ-^Ó +òb>øºƒX‰b¹õ¢Ó;´b²à-®åiê®ÁñܬÁÆ›Üm?_•KYÿd•8Åÿ“Œì/²ŽàžçíÍ&{zŠîS™éöÜ7*eä}‰ < +©lOè +òðYŽÙ’(ª/T!çšÈä{ø\#Ú[³àôä¯ ¬o¿ã&.õæµÊÔé3q`Iªû‘;ùÇÝ !]25Å tÖ Ü^˜D.G¹œu?“ ÇASÓ€<’=¢ØIö0ÏYB­ž…{yp#e¯IÙeÔ^HÐ+3øíA€ÝÜ1„î¦Jøh‚!‚á¥Pymxó*,ÝÃE¿èù$î Ú¸`†B³xCÙ…Õ‡5|Ôõ5‚Ž G¥+ÌRfw%hA? d‹ëaÙõ äéfûCóa…3 +͵ØÖ¯nN¦*"V]NCœ¶v²UUzX0Þ­îHVÀÁ€×°z ¯‚^¤´ÀŒƒÂ•Fmõà_ö·Ê¤”=œ`é!WºEq¦o\ôs"v8tbÓM¯j•WŒ×›ŽR{¥v,iˆu·GiÑãÖ ¹­‡ãæ]ÖvèîñzBÏïÚyëyk¶å;T×3@ßnF$¿Br}\O™†WÙÄ^kàó![à„T7ˆÌ,«Ö7 ¨q›»,$JQ&*êÄ$Á~´7x)¹;+ +LˆÊ’§ÛF_¢=,0„˜Í:éö,ˆÇKl°Áš€ÑœTdHp•À„ +ÉQߢ®ÎΣ†WÓR† +NŸ$•ÙÐø:±U+s Ôãóƒ«u ðÏ€T[×;‹ä›¼¬Àz'O®ÆŠÀE‰ÓZ)TY­¯rkÌVÍôv¢˜Õ!1{ÍRõ"‚ïüï[KÇèÕ5 ¸üõëÂV˜™ÚÞ‹rˈj(KÐ^€•ƒ8ÏÏᓡŠ™cç¨j»Dæ!Å€È ¬}õ©í“ò¤8iÛ¿ŠÄêúU=VJœæ¨ó÷õ;yH K>¨¥˜j¸ªE«j\UµAqèÊOZSî.O5–#•`œC¥@•ö}"?D¬á ¤$ ²¢T6õ·EjZÔÇÕã»ãÊ|Y?8< ¨‡¨¨žÚc„Jé^#ô2ÁˆÂ¨™Ž¬€’ k<µŒî¬æ 5¥S§Dæ4H=dðµÕTZm“{ØÈ5WöV#†qFes*ž³3J®Nóê:í"øö[oXä(B†dËLT±­ ‡4uñ(CDµoÐoc/¶ë2Vñ§êzìðúÄŽ^ ô +@P霨¶5l\¹Þkc.=€x¡Î2™ñ S¦`W0aÄÍ¥Dd4ø¹ìf‘.ydBÖ*t_n¶7’lì-× + L7!¶^ô5G” \võ0ׯ† <'Âë÷×3Ž]p­}ˆd/ÊÑÛ ¶²"’í&À”vrg¨RîÏ\÷áYäPáb‡cà.Ž”ã[%Ä‘à±_öP·ôfs‰/áݲzä¹ãKnL¼‹£Æ%$'Ñ¢Hõ’|]#Ù´6â—®ÏùŠßó›Íï¹` l ºî–誒6lZ¿l½l<Á;$B%1ÙÊj{óˆg‘ú… ɽ' ×ðD¶~ŠoÛˆ= °ô‘¹Bx”ªGQ€'Ý‚ûGÃ+ƒ"¦‚íSΑF¤âilJ޶ϋ0ÀÅCBÎÓÌ”(MÓ@Ìn¶»•«KX¹º$&W·¥T˜+ÁÊ¡ì Ä]!d׆—²ìˆ™£á$´–ÀFë¼!J(üš/b  Y¸r¨ ´ác—„¥u9QeŽúP\‹©úFÅïÈím$`.?ÇÆÐÏ«ËlSl8¤4ZNn·G4’¢AÌEË!~Þ6€Þ†70%bĨۨ–"8êlÐÙ¬ :y²»¥¨#•ø¸1ùhå‡ÀÂ’-@u\"»¨À ¡!#<Õ*Þ±†`V£ß>95€%ƒl½å=! /úHûì5vüå¯ ZCˆ1g>ØjDéIÀ±i(Ï"¸!éÒcÝYÌÐ-@ö‚‰mŽq$*H˜v1\HêyS¬çˆ^F0®R¸'o˜Ü›@\AäH±ö’‰HrdÝö¯2ã~k ™×n))LÕO¶’¶·ðÞW|õÁbC u+j]$Ÿ®À_Hi«­º +Œ•ugÏfm+8£Y¯3SxÔÐ÷`í1Y¢ö#˜è#k´K©’xnG{xá”ûœÊá+_’2[!ÖJ1—FŒ}?î ‚LHÈ2a»LjënG¤ˆp@ÔTÄêiä'݆Îsˆ”X9J4 "î”Í/äãU¶]›ÓçsžG³/$r¯)Æ7ZÙy†¢ú£òxE:¸’ä‹lÁíÂ+~ç.Cõ^ÇñM*ºÜ®vJèÏÛÑŒøTnØTNS“œ˜®Ì¢Ì\ªYnêg¸ÃE8F,<•isÍ÷/,0Î d:®³T^"\t³o²iRä„ybãï° ^Á}k}*„P†I‚J>’ó¤*ƆT£¨à›._ùÇÍ‚°Ä¾ê\‚´l6Çdª:Š6Ò2Rûá3z=$Si8ëÈP‡YførP\´Õ!bM—¯€wï¹öYÎ4ï˜#}(úÙÞõÞ%Ùj·ÙÌa9Ô ×¼Íȶf$I@Ÿ4ºò®º—ŒS(¢(?Qâçp“úv*ô3¶M4­“³({›Ea.°H„EáÒ$+Š rsÏáÒ¥ÏfFwˆÆxûÝØ쯆«(G!ÓÏ/â$¹gHO—“GCD-×­–†ˆ™áI׬RdôÃú9±Åh0õ‘$l‘=# +äeYo–œš¬†)_Í•åØ©aÉn09•IIÏýJ»XÓtÍŦñÒû¦–)Õ‘ZFuo!üd^ź $Ïa#Œ€Û%Teº>õ|[ k%@À>tûiˆ¼Á…Ú»Ò%› ­V#Ÿ6’9¥Au¾5ÁAà÷<ªñØÀêáa¥’x½iNˆWzVWÞºD%°©ªÿ<ù@-š-»(ÕyG„©ísT-çÖT¬‹šŠh¶‚á|½^Uö©äöˆ†) +… 7 ôõ +Á¯;7BÑ© ¤Da^Œ„E鑤ÅÌ Zd.”(é Râ#5Ù·ôXHˆ'[›<üÖ©Ñ Yª!ìŠû{²º8¯¡«‹óF]m´9ü€·´êÆ„;Üöí $QrøXŸï­Kž?9*ìk$f(Î]-NYDRGfÆá +"ˆIœº˜ìÍ(žKº7ëÖ|g*A´ÍÍ :‘Õó9Ð>¬HŒ¸õ~—L[®³;e¡•³¶Dd ݱ(è8©„åȉ½v6)A2•YZñ$HàSêÓ=;€‡ªˆ‹ÓýÍ,Äü›O[<7ä+Ìò<;v äÃ-B*0+DÁ+þ²—®ôªû0cw˜§ƒ?1vAß$®Ýƒ}°HíóD,μÒXšÐëÒn® EuÊÜ‹t¡5«ÎªÁî}ÐÖ-^CzŒ¸V>NDaˆýg§&˜?ŸÕ R—~á)¬’fŸÚêP•Ê½¶Í=é$tÌ#¤Ùä4ö`¡¼Ì“ÒÌÕh:¨À:ëÜB +ÿtûø0žgcתÕa B©t¸8I÷†eØKÚ@y0Û+PÎ{½ÛãÔ ¹äf¢)h³ØPï%Mp™0LÆJ縆«1áa˜5Ù]±ÂÛ—'d²¨ñZãÛ:ã脱-p‡”PÏñM7®Wø™&Ð|Nýd +sSꮩRIZQ³swP%›•Ë] ŠqB_tl}&,jàúàŒ—£ª+9b³ÐÖ^ 9(>k–fØ+š«Ó›·\£a Ú!‚Ôá}…©ú%D e©dÜ…ŽÓ"¨Á1¶K-ÜK¢1±©K½+î;cC»ºå_›C¸ª2?¹#Kd9á  ,–­+¨Ðp{Ls .B2ä–š‰ÑoýJ eÉêÜ©`ð}_Òøé±-=c^ï$ûCO@9_[lzâ©øó*Î8ØYIYù-÷#H%[÷¥‡kXº>Æ$4>:J­åâÑ&IAMmŒ&`ÂÙ ¦]y×ÛðÀeœmÞà«©r ¿Â¹Kÿ”•W]ŒÖJ}ÒÑôR€ÌÁðçk§¢Ë€mš8k2jhY°,µFU–ñÔCš‘”[Ï»¹z<ôšºiƒ«eF;ÑÇþăCÆB$ë9I`.E°¥¤ è€Zƶ2Ž_t#{scûZÑä¥2{dµIñCc}—B“e$â}NfŠˆZ^ÇÓ]gQv\ûÛõümŠIhØN¹A›¯PC¡p„ +ÒZÐǤÒCŽ¢jãLÒ†b–j)F9î±äB‘B­‡Qu‚Wˆâä\Oöeœ)8W]ù µ²Ž7eÔÖ[Ý4B¼Ñ‡¨Á ¿1%ÐLÕèØ\Ç qlâd 5ái•M˜°ë’CM!‚E_ðͽ${>ÅîÊûö\Šs1È„|GøV¦ÔʽC,ÚÇÜ;ªI5¢Å—‚­Š&$(༦ð&Ž3m¹R7·^‹+^¥ÏâΠS vºÎ f`Åšï!®8Ì) Ü]30U8,ÏHŒ+iÉV‚Ô3@Ô!eöVSEzˆ“&ŠbÅ‘ ¿õLLíSÈPgíÆtrv+NÖÓMöáà %ܵà¹ï š/Ø¢7‡;A’z¼dñÖå£Ú H¤¡AœÎˆîȯ(“·Z¹Í±?,Áù–dÞy´ªAp ÁD¸~ů¢*¡º"¢oÜÝŒÓ#¤|oIëtϲ˜Ã/Ë3)§1C3®(鶡}«¡¢wJ3‹ NÎÀšæs´€+WD£AõêTÜH +ÄF}¬²:G‡ O³QèÑa_¶µùÌ`dl›l€[sGà¨!I“´MBŒh‘½ÐîÌè6Á¼^Økoï>Ñ@©;×!…!üWÍG*‰âOöR¿÷¼jÀ‰I¦SC†¡NB€:WÚܪ› ¾ò1b©›SùÆ,%`ªM²ÕQã’b DzÐ] t +ß‚ïƒbêÚL[^†˜ÅQb"Œ?…U›‡L”,GÇí¥5%ƒ1Æ"Vcou÷À¬ÈA$‚¿ÓÑ¢\*Þp$èk‚a‡àFG‰†3Qà •ì>?d45qó úz¥@0ð:Š”)ªø -ËéÕ,Waäu‡Èfè`­ß×¢CEï‚÷µïUUvÝ°*=P,žxk¤ï°³*VhXaO +ÚŠ^؃•d¬¼lAç€ö+âSd„ÑÉRE)ÕPZf¼ÒL_QQ\Á¤Jo`^Ší4’Öì„)÷Ý#¡¡SW ,dòg@­€¸¶Ô«·1…ó¤ì¢ãµ…ùÈyZm]oMs^é›ß†®i·ÌúâxóœIˆVb²½Ã9gÅtT²>ªejpÌ€ƒG° Xú+ˆ5¶ dààÌÁ¶  ‡¡Ýk~ÛC)ÀÉ+ÚDµL¤¼À¶–Ñ ÷†ÏIioö°‚·z˜e”07M•¢Ò€Ÿ>±±ÒV|YÞVQŽ9Øj”n¥0“ÇžF¢xÍ:`ÜA–(iþf2‘~XwøjÖšB¿€œÝHÌ@pÕm>RWÌ„~ Á|mbÔƒ¸Bª-^,Tá™EÔæ¸Ä–íÁ4¶D(q=[ú±Ü¢óþ][sÕØ øž%œÊTÂG÷4À{5 ì”z~orP‰Õm‘FDk™ éôû34¨“´Ù3¬'W÷™ö¨i=ä£!MÿÝ™„´ö0ÕK¯­ëI°´41®³f9¸–Eé@|Ôs¤@€EåG$®‡ÅGǽdŠtòN’jå¶VÝlZ q†$¾x'A;r}œÜ¸3[àËö‚ñÂ<‹sÍ +\œ4%ìP›(H`M@o» ìÛØg ¾|–mRŽ›ø}Ž hâÇn=ËÆØ„æ„ã= +8] 1¾¬–¶u‚ƒì‘Ø®ûþ jÁûsWùî£ 2¡þÂ3ÅÒž·Ž*úOÀÂ[Šz,û‘ãË ó—õ“BÏ”‘Ž« +ù£)–¸T D9ô7uŸuu¢cRËÛ¬cýŹ-X«/~Õw•–èlâUK8Õpö/@ F^Rì©Œ\¤ž ´Qq‘^kØdF„´©(!s±ÙÁÎ2P0[Ï +&'¶¸ka_;Ç]aÁªÆDä„°¿Mâ‹5Sýû½‰“ÿRÐu¥R6*8‡6¥3#-ðŠÝ¬€žèΓ_@"Øè0½fì[ N†ŠJ¼KYÜÉ¥p„ËL54?ˆÔjŒO¤RéÄn»ºÕöŠ)_›M¦¥h2·Ìîn¶áä•¿mÀ¥iu ÈJ`Eèf‘ FÆLšGþ×@(¿'Òåßýªã¿ò@¿apÿdÿùÊkPvG¹UrDÅ €Œ¯õ:‘ê à½÷f¯Ûìêk/ùNdœG;\3h®|~¹/-;Ê'ç–¯g­ +fy9^3e24ÅækfÑ %ck8ˆ ±‹‚‘w¤T)EA!n.Ã؃‚™ª(ê…XÞÃ*òs#ù§rç¹È]£›Ë¬BªÕL'P3­‘'‰ªyŽÃ‰¥] x‰ÙpŸhÛv#.òŠÓð 6Ñœ\“š¯Ìß\a 1 +&2£ø£ž=îس0á{–åYæ[E+¨®S39ò÷ðv[$0„î鲌€˜‡»®°ÎJYè´vÈÿ@¦Š¡Œ’ÊeÞO羬²"ÎùýìªÿìmÞÔ6qɺãc|ïü\Iêû2”¢¡#äòÑ ¾ÃFbTx ×>HB>'+­Â¯’úœ¦i÷ü9#Ýá1¿~t1þø¬èú$VÊ©Qî^\òÚ.gBö4‰BÔipÊê‘7Ô¤û|ÉùÄ*€Š§ Láíó5ò`|k˱ˆ´<µº .v‹€–߯Ò(±4 ]VÖø<®+éÈHQƼÖù²¥e*yئ¨3ÒL®™fèï0D7²Õ®lB8‰ÊœNp.”ÈlÀ ]?ɦÀ´° +ÔiXó‡ èŒF²'p¤‘Óyim{n•½øùŠ¿UÊïÌòÍìJˆ'®-}óhG ¯‘KlȰƺ­¾ áh)²7Ì(2ºÑAZû<}çrÿÚHJš]C- Ö§¥'ÜŽ…ñmåE3”k\Ñ°uàš\†ç£†»I£ux¼…R5ò8o ¿¯Ü Ÿ©ZEE©Cä_Ó祾•˜Ÿ²-­„oÃ*¿X84ŠìÛîʾT™ÛÉTðW¿Tew*äHÏþihÖ]…DÛ¦™l„4µ§{›·vžYÂr‘¶Q¨ƒ§ð?jfžÄ ¤À¥À;Ñ@h>us;crZ±»À;2 }A.2ºä"SAŠ• ,¥Cï‚ ló4Ķ=è{ç3#i·ñ“…a%3G§Âñ%‘´J‹u‹ôëV:âêô2{sQŠ^8ƒÓ‹]­Ç±â¸zˆHfᜠ+ÞÞÚß^€ÿÅ°ã_éÚ$;ë­f Ie]‹, ³NOoM¥HÇ’$X -?«ÊáÕ©cÒQ-’t„xî¹¾ E5*(¸¶Ð¤L‘×™h1öj(Hü"ÈmüÅá,0®‚1›ïÐo>‡«¡6¸6mäjoSâH £€VTÕBS͸uÿ±Â²îp| +)ƒ£˜‚ä³êÜí7Óp?D˜ñsrSE=Àsn—2´[pÌ¿Ç‘Ç$ß +†“+A“£:·°sŨ†$ +« +û^Sö=ävÕ š}p1¾@ Òñcë[\4‹y6 z5tVè +¥Áœ{MÙýÒn•.”rIP¬ÏS‰£aïP¶æùûÒ¿CÙÎí`³fÃ&âu"h²on@ÌÜLÆÕ%¨þ×Ü·ßql‹¸5‘ÑàœE]a%KÛyï›jM(cÚ«ñF6iwTеd§y—¹¡uC hV¦h(˜óRtG ]>kõx£ÑKƳ`ƒ+ *‡ÕüÚw,§Õ€qGqãÊV‹úKÙ_Õt`<’íM½†ÉZƒG¦ãÆΓe‡Â‹2˜) ‘WJV‹•£ÆªQ®ËÚ +‚ë»Þ²«9 âx; P)²Èõà9N¡Ýnz$®Ð˜g˜%÷)‰ýÓÖÀ­W"S¯yðt­I¿©Ê¿=KÓÑeÅo—LxW“& ‚÷NY“)WGÞÛ3aïûœ)rJ±ö`ùºTY¸9D\¼–{ͨ9°áÕ^Mô€ÔAöª+´ëÁ|—÷?í¬”ï´‚”â|;ΆU­¡IÛk±7<“×ÏcoÇ5WŠÂ×oý(üTEP£˜šû¼6€ÛiÔÖ ùê¼õÒ¥ 0Ž0qøÝ>ÊpbÕ3À‰çßìGóç¾êuä×b ‡ LƒèÃN.¢¼*õŒ²mˆ]¾«"¦-òÙâC¿[3gÂÜ EÚÌ.hCùB†P[ â,¸ëÞ²‰T(pˆJwä_ +9þ;<â]s¡FøvÀ‘ˆd9ÚSÏ4%Íw 1“ƒ]:®Áž^ æšuò.yßÎ)ün×®ùnŸ¢{&÷±‘?13˜G„Eí+ú¾¢ 0zÜ,¤©lÖÚÕˆãgIÇg±XÃ’¦È”sòknÈ\˜§¦o8´ÍhP´»öü0›7QVlÍ,å 5u›¡#Ü¢/“I"v:¢צSRäHQs‡Ï…>Ço‡D¿çæô½" 2%cûJ07€<H‚Æ‡Ë sž · —…àx·Ò¤¸m³âÖ×lß6ƒÛb×@#åV»T½4XˆíÐ#ý<¶¥ ½$à·íÉl/V;zéˆèþZʺÿ"¹NÔË™h.[òòƒ‡â1æ§yi݆ç¬~9Â[‹\6ˆÍKàNÔ¨ÀPa•^${&q¦Ý†Ví¨Œ" |Xh“ÄÖñÂD(»ˆ­Ñó y›k«B!×a{„‚ÄzåëᎨÀO­à„Ñ° TmZkr‘la5ìä~o/àa„ M؈ èOª±6(3+2¹Æ»ª¦I5ݲ+µÀ}zð-Aƒ cÝKa92§‡z@Ì®¨Œ©C1r@¿ž3A¢WÙ×㬅%LF{¬…žL­±xb²šÛô7ü¥!*‡€tÏ“.fªsÛYÓµ uq·kÐÊ Dv¸—gX”׫œ“<È·åÄ#ðãy(3à“öÒda»ÞK@bÔ4S㞃–º>5+°aô o}G=¥m.=:é×ó òHîW5è †–Äk¬¨ Î|Ù:óóx÷äpçÀI/bˆ#±T‚‡`¦»‚¼*V¥øaB“YqG{>÷_lž/•IíFM‹©—ÄOS0ÜíØ=ÆîqÏŽ#ìñÚ¨W²ÈcásÁ'S(é0bˆÏ¡ïàé;¿^îîÞ%Ê»Ç!K†ï*[›Î´W»¢—%L¾áó2­gªcœ‡:Æ2^;4ø†õø˜½÷I[K_¹;^ßÓUÒ1“Šh.5qOɪ #š7yj ¬y–ÜÝ{¸w- x¬ ed^s» ·•Öw4ÕRDSYaó¨Å¯¹8(&e¯;KúYb1Ê6zÜæI6|Häên(èàŸU£‡y—Õc=ƶ¥°û–ÂNŸÇÕ«eõÂÍô® ½ÎN“‚mVÙ6Ê*rƒk¼(—•"âæmĉÂMã_°ÏÓ‚Ýð¬+©­¥¡x&b[L +d‚">.â&×RÖãMhØ~è B²{ôñÄ ¢F@ZÀzë%+8âFîÓPåRUµ%œ©×¯z´À¶uÒä'Øyë¤3`F¤ðDÀõ b>-˜Â@o.äÿšò;ªí¬I9×Gu«Ç´N£¶(HE¢èZúQ€™Ýíá6\ø{°ÔÐ㨠ÉJgÖ/÷õœ ´7WxWç½9¼ å“}¦M×//q&³¶¨3Á¸gRö3¹vµTª‡¿yÅFÛ {(ž~cÎëd^5÷Ìù“qQ}‘VÓÊÌzÐöÞ{lˆÒs +öÿ´÷O¿ì¥RX¥0¤ŽŠ53ÔãåùJ¤}õûkizG/÷±¡gÔw§i±Éds¬dVÖUºŸF€Fú!)·4s§TÑ››W¶æ0eu®=¬ñ&¼œ¥³Âw#ê6úÞo57Ńxõ¯Iï~:µ-ÅÜçÐðùý0÷u8t »{lSM¡K¸ñÖãËò­×ZLGy!—r÷‡&È{MÚ2ÂGVͺRAó&ûM¡ìù;ÓϦŸ]žÔvšœØ7²ZáÎ…JÁÕ\Š&$V.ÀˆE2Fê’(Ôz’‰„Ä8æ}¨‘H½Ìm/Ê$º}EÈ ot·Ý9"§î·¯ëÔ„7sWó@‘?æbDþ$Ÿ€ìÒ†Õ¾—òÿÖü"ÿ/aËÑ•ÊÜxÜtsÆt&e÷î1£ÇZÜv¹{”Óƒ8Žãœi[¯^ÝÔtÄ$qÍ‘VKASÜ^ˆÐრ½+C2ñC˜èñ ‹ÛÖxÆ‚ …ü°d‘z0e†Fõ‡.‘s€Ý›æ)Hc§–A¸1*@†áB9iÁ#ÚI ñì‰ôÁÁ®ðŠR€ñ,ú†"ZËIGŸ÷°¹îBÖ¼JV°lf^©åÒ±…›×\xÏ”_7鮉z€ÇÁ2ŽøïãÇšS©9~æÈgÎË á–rú*ªÌƈùª‡ƒ(Žkí}EGu_všöóq9.á`•Vø\å>@T)ú@L¹ÚàWgp*ª Ò{³Û2Z Û•íûÛwb0[ð•Õrf­ºSBiw˜µ'Äkì"ñ=óÀø‹Æ$P2;=HÔRÈöZêmb9h:!¨ZåãÕ˜2 âI1ˆÃ¤z¶ Êl$ê‚€Û™Ão]Mp(’êÒC[Á}• ©sjŽUfMŸL\ø‹¶ ì\Žr_¡ºI#(qô\ Ðt>ô„ÛElèÀEÐt¾´C¬)$s9u"B¶­Î˃(ƒdGÆDf7´¾ ®ðdVôêc_WŒì5õ…fhéÏßµüuw ý0¨µRÈ…°Höp«Qýø+6´­Ç—šœR¡àÂYˆDm°î‡7A gáGˆÃF64w²‡›J—æpl %ŽC)âü¤ÐD罟#xî˜xõu#xgõ Ñn¾ÎÐèÉkR¤€rmGŠ<Ñûü¸¿SÂyû–Ô/Ì`de1í:ã£4"&‡ˆIyƒwÆ*†úý|îQ•ÉÙÏCRïù +ÿ½6—Ð >ž-_{¨órDà_ÑÐ Õˆ+ÁÖ X©KXàä§^Ü´éÆë†væIMe{„„œ¿³êó4§øsb(ÄÏà25.díøáà(j>é»›â'!>Ó)Š¬;Õ†CmÄïÐÆm¶Ä!Ž6Va>"OãßHÜSˆ%Ž¸7ØÍÊÐÅAÙæ\ˆóbá}Yñغúi¹:רܗ4ÉJ[ +ÃP]׊… #¸×†¸7¯‘ÄÛ×ñÌÑÙIG[ŠŒÜšQàL¾÷ðæ?'xi„UÉ{—ÕÙ¢sReleË'Œc?¿Î®šŽØ +¤VÔx…ßË¿Á1wݳÀ¾äH•cp÷J$?¯Pb/G$¤oðΊ!š-‚ËÉf¶[£>ê ¬*XW§r‘^}íqsæù‰óÑÓÆ©8W×Ûa‹Ð®#òГ4Î3æ¼vÊBªkÐÈb„¯o:S%2Û>ÍÌ~ ‘µÑºoÒ Ð­é껆 Ù©¶o­öEpÞνÊYvÏ]ŽÒ ÁT0â@z©Ï¸´ÊT`Lf¾¤ÜVù€ÃÇ9Hs1oúÖ€HØ+xmƒÀžNV„q3[(Šõ{ÕcckŒ>~·§!¦ÉIÃŒÕÏo‘ö$g„ú™²’!ˆ×ÏïXáNíøG´±jëÍ’ ìñ;ÍE5ƒ›zÛÓð¼vae» oÃùÖš¡Õó ê +š]ŒŒËÒ”æõ–œ`© Â1ý,ûªn•{ž¢_ +˜¢Ár›EóÖòrÍç(¦Êó.U°•,SZÀœÜ UgÐAƒbµYL¢H=ˆ6{DÜûpÈW +èbš†GÕäv€ü ùíó¿%Õ#¨±ñ¨¦ô£šFì뱀ܗí®ò¹K l’ëiˆG¸áKym[¡<>ß‚·£óÜÂÌI¤R])”ðí¨E + ˜²‡E"b†|­ý©Øº(¯¸œn¢Þ¤JQ³çª`ëÖUÉÆ^äïÿM¨_JÝ­H®/Í BPÅU±¤‚Sbã“K ï‘êÍOÃÁD¶“Õ¹>¿E‚jý’;›ÝÏߊùPmšr*\ándúgÇ ’š†®EÌU˜™A;TTGç¸N^"ô‘1ÇBBEƒü(j²ŒNØõ»Ccc û¡¶UX³—µÝÁ~}Î<œJ ]ðŽEVà·±/¿'ÒFöà¯2ÿ•K¸3öïIþÇ׌¿ù·ÿóüúÉòÇ¿ÿ?ÿü¿?þæ?üíûÃ_þò§þ§ÿöÿüø_þðÿôã·Ÿÿüÿ~üùýøŸþøùÏÿüóÿýsœôëoü÷?ýùOøËŸþøã:Å/.î~®à7ˆŽÿ•CÆàÕ%ñ„²æëÂǃj}c#cìƉ«6“$ÂO«°õ¾?Àd +ƒALñÓM ÏÈÅf6iÃÍ +ÆMIaEæïñÇÈ ¹ä.£NÈÚ¬ëÎn(ÃR¢¢êÙ],÷Éo<!LTYýÜ5ûñ*ÈçjpéNk¢4€¢šëÄu÷ip¡¾¨T|n]ôlú¸ÂWdäÄ»Çä†m«T­‘6ÔÆ•#EöL,ßj»!”±Q‡ÀuɃ¯Ïœ³jP%PŒ ©¢bÓ¹QH‘ BÀ€¤:É¡Õ#²@NŸÊB槞ƒ_6Ìàˆl4OKšý¨§þFo°ì¬ôó™(6ä×æÖ—J+Ó-ÑÆùÛKÃfÎç3LáÈ͈íË×çßk Ý°ðóúé7¦bú=O}h¾)®‚¡âfã³æMB‹.ú(Éw¸Rcä*Êû™™Ó0Ó0zÍVE>úgÁ×—yÝW.à3¦‚Êù§(?<÷`yûýþ¾Êûƒ¦\o(—DNtjG÷ù·c ®T»žÏn +5î²ço³µ›“q>“ý„b$T41€7UòSSÍâæ'_lõW†Ù=o8ÆÖ¹%7Ù_L6kÝyL<É]¥›­T£¶àK‰ïešÏ$ð†ÔÂÑ0µ­„Áòìá@G¤.:¢™ãSú›ø&JUEªBc CU²¢ºÉPÏÇ¢œÆFòj¬ àñ‹¥až„^ÌzÙíI+¯Ï +ʇټӈ4æ­2Z¼VYF( @PVêô4ˆ³ù¸‰£ hz﬛ëHW·‹ié‚?†iÉ@¦Æ“Ü—3í‰^ ‚ ¦ÇVHø‚ÝøV]И¨ttìNÖƒ¼,¦n˜Œ½ÉEBâˆsg×d"±“ÈÀÈÜ›Ø4™§Raõc'ʜÕéy.¹W{ Ex0=¦üT‡oì%u<ü°NÕͪ!1Öµ›A|¬žFŒÔ¢ðš.ŸÀEiRr4k5ŽúK–Ç‘þ3E¨ÂÊ™"Í­‰›¨˜VÑæL:);Ä;ÈϘ¾;%j.Ï?aNù'åRäÒzb ôPõi\wÙFjÒìlµ|KJº ‚¤™‘ú>úÀ«‘ÓòXÐÊIŸÏIH$KHc0]ŒùåèJ34Pîc² ß× !gkûÚ}IÉ y0Å5Ÿ)$3a(|òq2à:lÄ닾7vnd¯×r‡ðv€B)¤B5r›˜Flé„2T%X¯ûƒ]‰v™ÀR9;ú·Šðn@GÄ@lý"eIÃSGš0¾Zà^WÀ•A”@^{ÄþHiXòz+^P>õ¥)ÅÓCË´£º /õ½á€jÎ`øE£,lp LðG–]Ù00ÜB,RˆÉæ? ^&JÃîöû³FÙµµÆ®°úº¢u}Ñ@:Ÿ=æ[ãvÁöá(Á0Éá/ÆáXùPSXo5 Óùü<üÁ®¢s‚v}~éR‰'ª»q§*ÄÆ ‹&œò§[¹´.‡ëñ¦Ò˜˜æGÒlàuY kn*N¨MÖ§•]K£ƒgßèmÚÖDJ'<=hÔá¢JËFpãeñÄ kxñ ’_~ã1ââ'5ä1;«ÄšD@²¹”ÅçÖ8æª1>€)á«ÑãÕ(óù<«™`Ö #?¹ÝÈÅq»§?©‡rô{CÅ¡d_Ü[ã.<»/MÎ/±já„×àq!ûiˆŸH Ãã„|—ÏoÝ:‚Åî¹5|kH“;öÚˆ2¥ò¬Œ ŠÞFµ±q˜ÂÜ•öï>?#—¨öéËàh:çúorïŸã•ûì¶_䕇1ö³•$ü±vØZaY¬æý4ÄÏÃDžF´zÉužoi¤ÀÅ 8k.,#í²¢ö—ÎúC JUzEBÅÒ~Ü4 ¶“˜ôðÇÓ"kü…vÓZ«°fXI<:=²Èõ* ÊCa¸¨OÓ@YŒ·~~cLn±ß™P& +ÙðIîxíÿÖ“-û£Vw­k#ÃOÜÖŠžW *Ïß±5~nU‚‹=îgçà v‚”GR&e¾5ì{¨¯L«;FÂyÀb²­2zä¢Êcð:¶èÓx‘\±+1FÞäzî€ðÐÐñ´mxð ¦4‹5ÞС+ u')æ#¥ü¤ØÚy45VCBƒOµÑ÷ã瀋&±›bc‡CÑšgÝÃÕ§@~—dÜØ6À+·ÞøaP}ÕÃøî§tþ¢±iGD^ÛX‚„†&×SúÖ5WúÊj¸úgÃ3>F3À€§U³;‚4b@ý€w„/G˜0ñ¾s౎%ÿVÙm½*·-h±ob^Fûžy¹aˆG¸ÚÆKÂv^ Äá;¤º1Õ»ƒ„´þ²è…ÞÚÙÊ=°àÐoÓØo-Í\sÝfj@`U‹¸òZIˆ‡îðtHŸ¿ï'³û30¢ {‹‰ƒÕšáï%cu¯<Üdnð[än9VyóRÌg'`_f ›xƜDž©Àz—Ã¥#ò(á®7µëvXkÓ bLÉRýKÈkÙ:+tZó[¹fVÎ4£lkäÛ©¿b=Hz~‚Há ¬w¸@®È)؃m =(¯Æ‰nËz×H›e@¯NšˆFR^NS‰cö—ãpNÞtĆÀo R°QÛ‘×k¤uèÖµ&È=µ*°‚UáØV…ɪ¥3Û­'#k{¡5a•ÚᆈoýÜ1CVKVC°I°´{U£}3=Üܯ Яäàln§éÖ±$±ŸÅL@my.…jÇù×^U±5lP \‚)ˆžb¾æå5kp@/’í%ûe…¤å¢ñù°]šÉ•;•`íÞÔRàý×;ÇPŠ¨Ÿ à@ånrT^O#Ù÷v¹¨%ÅEºB8}RŠ¤j ÛòªOƒEhƸփ^7ýùVh)ür¯{@ûo  ®‹.5- óŽäµ`})TPuU? +(9¿Z¹Å o”w ,õÚS‘ï‹%‰×‰œy_ÇÇΫ“†7réáÅ&ŸÄ[Ùu;Amu‡/zåÐÿŸÞÏnKÉÉ%¹Ÿ$(–È>"Sµn.ž½1é EG±³rUÑŸ!iÅTEùCÚVøtL–dzDÙ ’“—%Ul +¤8Jä<|$ÀÆ>S o ¥Ï™\W/é¸^ü2Jö¢…Ð}WŠmb¢à½ óö/a‹N‡¡GEÒKp»ÚÅçDî¼Á¥ñƒ|éF¦ã穱æVÓ»kN,R›Ó¸£< ñ^–öç[øp‰¬/*}qÀ[C<Ù¶ŸìóF¾ö"¾†)6¹?rY3.ëÞ¼8õLLË«D›;6ÂæµÃO»dkÆ‹çè·ÃPÚc%¤´§ !p{ÙUzw˜dó[Šäö÷î”Ú¢2ˆþÐ%F4ž•¼Ù-Ô©Cb©÷·ÏC¾¦nùš½Ázë„Šmßµ¾EE"ë”÷ö~4]«ÏÔ¤†˜…<3qÂq*†áë`^‘•\ÁºYãòUKËjó2¬]óz@U8NßvŽdŒuƒìfÓû–vAk*}ž)Ö<ò•€ €]N….(ÊmãHpô!-ˆ°ÙѶ!%oHJêàÛcËH“§ÚãøƒtÝ)«\©™²è;Ýo¦lŒp.$`û›‚zVû¢Ç`Ç!¥äcäøÞknseu'>P-%bùiµ&È@ ÉJͼ7ü´CŸ25'F ô~ïµv.1çsUÐHeíû>ÒÁ?=©2Q¶ÊÄ¥ýኛŠ…ö ¶¡ÞÑ÷+bÜÏ[ôékgFh ÊáÑõ/'튼«~Õo–¶ýH,_ûþµ¸Çû‡Nmv;U‚yz…ùíšÅrÌ­•öÕ#¬QqãÂc QœÅ9²è#1iãxF‰fõHõÜnפqÅšÄXŸ=õÖÈs_ð`§83JA%G 2Ñj#œ8à $bd–Ö‘=Ä"æ†Ä‰;äéÏžcœ)CæÍ`6Å÷è$í_û×vÕcËéüÏäÿÚK5bŒRsÑÀòŽÌÁ„Ove¦k+3 ž÷¼Þ>wH!´‘ç[" ,Ùà¢Ð¹#unæ>€°9 {3‡ú²ˆÅ¾ÍFH° ˆ¦E2¸‘yé‚+ zÀKævöÖ;šg´Ö# ”±€šJÄü—NÞPö àñ¯ÑÞÜ_¥¨"¿5jN#P£…^xˆŸ ÷F­¨íéûiϧòãÚ•©òö`ã%¹'p|“T#¥S†Û…o¬ sà'·5r"q¨‡»&ŸýH[b¸—ý‰î$…+Šv™¿³l4úP¸‹âMSÖ †ó¸ Y !ˆ¹¦[Êâ’æk@HÕòY }0Ã%ÐvþDD E$Œ¼E{q\‹fg2ül¨ZºoxÃþ,Évš’š(##©‰‚,ò©_|ì.—Ü*ÐÉ×Æ©—µgÙ“¬Êv{æ½-}uœvXå(›¿5þ]œj­Ó1qÞMBôEt¬¼bÙ <ª !õ» ©˜7¤}ä'`ãUC@ô`·þ#¶íMùDcYä¾ÙÛæÙ¿ÖFa©4Güß5“;N»¢ZKÞ8™Ö#o‰¼a¾2¾èñºŠDêëµb**òJ_°4ã’ºåR´Ñà=Z[Ê2â‹°42£!«¶ucÊÖX[4|WÁ¹ò~®gåP”ª±A ¼H×Î@Ê!á„þM.yp1zj†2¬?€1PHPð‚¹@)“IZãõŠ´tÙµÖ±ö$ÁÚ¿‹,ë· ×ƒºÍv¯Ô`/ fï ZÊúZ‡a³Ao\GÃ>46l[ùzëyÕÛä5Ïdk©¯GÑbŠ'‘ŒŒ-ÃƨtÔÀÞ{PÃìãˆê¼4Î`q«'E¨Æ&;w´(µ+ˆÿ“ìo%£nÔ7KÿÛ†%À)Qã’üPÛþTC6ö˜+ê«8yAYã-úU ÃA:È'ygUHsøžÏCÁ‘aIÌÐUœÕªñ°¼¡œmWoêÆãÈÛßa¶È«V‘â2Ô®%ÿƒ„—÷*—Èu{…OÆsJ{> ¿º+›"…Zõ–¶]CÈÊ|e&€5G¹EÐ-6ÔòJŒrɬ†ig90½)j„ ;ùûÌ6¬^% Å3æ£Ü.äî×ë Ü=F·B$Îu:5¾ÁXzÚc¸ s³„R¡Ÿç©wÈæ¯qš&)@Ëd‘âz-@<¹Z çÌúFYý\°"ãwˆí\{ƒ¶AÀ¼ºE͆7êªkî0xÁN1êvk^k[l¸W»#•OÌÉ–ƒÝ +pXžª9Øèxñ±á@0 ¯hwܱK¬Dèþ¯ýue)vm,r´/rÏ%¡B«N^x½“C'G ´¶oA¢´»–h$d¦Ò^ì,>(VXÆèI_ö0k ¬kh¡Ã%6Å·nýˆ(å>šµYbSåŒn/Ã~€¨E Þòî4L hΕh¸[”OOn;"p}m[œ=d½ÉkÏ8Žé +Œ5ãµÇT’ŒIãÿ³ö6»²,ÉyåèÎPÒ äÿî1쾺ѓG¢È4U„Ä&Ðo/_ËÜsß“¹‹\HÖÙa‘áánnöýäÀ +zJ«„ÙÒÚ^ç*‹6ÂL½µ“@ë+³qƒ3œ¹iç2­3±7ñ6œo¿MÉYq$ÞÏP|o/A°!ÔÔô#-¶Ã…³¼?,!`À–oß]ºé!^L[]üO +Î_­w*.§ XÙ=œ iS4Ršh\:iU„†¸ Ú±E¼)Ê.L(£)pŒ2Ú¥£©,øt¯®óøy…©íÖ¹â`QH7]Æa´-ý,3 –7Üšæe86–8êÄŽçnt/[ CTç&‚Š ½f#2Õ™&qã\@‰9ªâ¯^¢bÿ|hš7ŸT?0âÚéYÔöx¯ÉY´òõwß ^0K=<#9B£RÆ‚a?N ˜$˦&Mxv>úzÒT™'ØL…=o31IAyÚoZ/œuär)˜G h~r°ržÊ<ûÀ(YèvÄ\‚$) ˆ¨í(WÒÞ¬¦w{  ­i¼LIéŸ>^Åë8½*²!weÿ×Ïל쳊öã?NÖFùƒf–7#òÚoØ/¿ãXmðÔØk>{Kª4ŒƒcZ +ÐÍÕƒ –”ü$…ç[8(˜T[QiÊOУ«žŠšÅº †¨hdIEãqÏš~Jr2J3,©«´.|Eèk€µÎ¼µ˜r EhŠûhļ ìÅ0:È´+2#élêÃçp±D¦àiox'hÍMvÙ3q(ûÕÈŸRäOÑÕð—aGƒ”¨(£‚è,gºØŽ÷Ó2ïž3œ׎§À4^ŒšŒp2+"`¼ô`s€ò®~ÄmsˆÛ&x€C’¡ØGì÷"„ ™â½KµH6Ô9©·;ÁéAZj[þ`³‹" {m[·ÿ”SÏÂÕžÒ%þ5€4Qðƒ;9ÃÓg?ÔªPÄÙæ¹ÁÊDŸ.G±7âTr)eÀ0>±±o 9ªë;¹AóèPE„ç´@«·¶€z ± +db?ýاèV±ßÐþZ&i”‚ßš˜‰ºL>{Êd­k´_C¾ÌšÙDª°Ÿ„¨:Î$=ðJQ¶§ïZý.ŒS#ÎB_-Ì…i០+Ð å“Á,ÏcËyª5ÏŽ»Gv |#.Yçq¶nÉéz¿DwbEmN°H;Òíò±Šça|sœòÇÛùE/ø˜ë+ÞÍ/…³F¡,_š +¡•M5ª ¬÷¼²Ó}†W©¶¢€ÎYS2cYÕÒµm¿X¦®×ý¨Šñ½!ùs»HT’mÄax2´=#·d‰¬P—îtö³Ð‘=½ù`vípŠÒdûÕi%PxWn}èƒVæåĸCß”ºç"‰º²‡ÑÀ!|Ó*À‚xÉFP¡ÂiL|Â×8¥àýUgô* ù2‘Á8066BêôKÞo9ŒõÉ{=Ýü¯÷¥ŸqJÄýx;ºZ/TÜrÿÆÂ.O¢bó_;Èü“D[€IS[(P‚ ʺP6â­@ïæ73÷ÒäËAÌ'JДIÀî¸\‡£Ë/„lÅ@t‰û?âªÈ'@à+)=°ÁÁ¾ð³q +¸P”Ýyâ~MZþjªrV=ðm1‡E¬¾ö(rà£Ð¶_êËñ°ãÒ4¬%í +„ÙKÐ`¥žŠc”ÒÙkAÿ¢?_‚Þ0äÝ_=iø›ø“U”Nr°{`-&ó%§¯]´'ƒݜéÐ33“«Eº¿F‡fü©=¦m¬(ȯ³*Õ}.¦þÛÿåoò›‚_®\`®sŠ¶®Øñï—„¸†GþIÊ-úMuOY´þ»üP#ñêH-DFíV°ïÕÂI“N1B¢q¦-lQ ûK¥‘ôõÂvIBÒ¤^ ¶ÌïZ yu…ሃ•fâEÂG‹Öeù_@Áª)ìBík<]* +&®7¥ÐþlEöiôè ¿¼\Â//à +< z_ͦ؋K¤u„“ÁFš…ÆꑯØõõ€Ñ›fq±É5"VyÐúØöI!,ëÂ3‰¦nYL»ˆ$$mZ{Õ²˜)*Þ^o? ÖÉ!œ±D©ŠC>@Q»x Ñ×M…ÇÑëÊG: —8+£)ºH7"-â6˜›ÇÃ))ŽÜßÀ´z0Â` ;ËHkp…N” ‰¤Š!w$¦ñS÷öõ9JbÕ){ª[‡?óm”Y%¶-ùêÐÌûçïÂ/£ir©cg„vµH$µ¯óSLØQãÀ#–eo{ŸsþGȨÇ(÷¡YIqàñ€c…Ø :Dš¸°ö@ÊØåy¨ÇwI<&;Ei*µþÞƒ2‹‰¾þ¡ü$ìLâv®v®±·´ã\‰uK”ùÞcD f›I7©q%ÚI¤s î5¦ZbZ”2DK×ð×Ü>sûÓü4Šuˆ¨ÕÃÏ40qCn“ç©y®ûB׿´x`c2¥=eŒrO_ç•k>¬YéXµ<µ[à´…Éé +&3Ü“ÈålÑ€D•É7]¶; +âšò o=Øvˆ¤¢ÚƒÕªD”t +ç{ +3óF"ÕÔ +RB¥(¸76Ó<à™Áþ¯…†Ûs»1ô3V{¤S:ÿ²¿Ø¿×Ï}g¾0†Øá6•­TË`#•(H„4‘èäý¥s°‹AÕvFÇ/+EÙnBK!¾F¬ ó•u*Ðè0$1¾Mù"= Nsíßá!ØÚÞk¤ü‚Å.–>rÃF!v{¾ÄßïôOò‹:9Šieî0x¢x˜Š¦<çA%ËŠÙV–q:½Ü9dŬ£I}ÿ4àˆŠÊu#±‰+é¤Mĉ`¤ƒVÝ÷áŸUªGvÄõ¹/â¦×‹æM¹ƒÆÑ>!Ú¹ `L€@âNG\.4iùpâñ0Q ®¾‚MÜ¡îÔÑò}™ê竾…Ž„KºKþXe«Y®h{dÏ*R" JË8ˆ_ê/y +¯Š{~RU‚EWW‡JFNt¨mÇJd?| + ˜Ç ­g¨÷…ɈŸôžß«›8¬e³UèÐàË +ïL¤a¶Ôk' Žíq¦ºóù¸Èð.ªˆÈù"õ‚J§uà-ˆHÓé%•hQÓXRfÈxÌPÖÖüj‰6ãÀÂüêPŠÞ”@ÆeTB+Å•luÃ8²×Hn̘ñÔh¢i˜K)„Òh'#éyú|=p* +‘?óK1%¥T89>¼M,Û-š­ãLŒ3È]‘Ð4¢i1ú’ÉÈt“8Ý$¼ï#XÆë9o+^;Íœ,ËÓ‘îk¬M× )ŒÆfvzN·E„óTCãì§vJ4ÌÔ“«×¥ùשIé]‘÷ºœ5á$BFF- +ËkuÀ¹HÐþL§Ñ „À^ÛÑ< yÒP˜á¼A‹Òå·½.ëÈž‰YñåόßÉÁî”v1Ló0l"ÅZA»ChxO ðI4Nñ·–’ÃL'[¿àp¨¤jeç2Iºø‰9£٬ٳy‹µ$¾ 3B÷ncPÄÝn3]FÚÑßBæ)GðoÊá!«Ö÷E³urzÎ/Ë´Vy[†3V‡iú¸p ›{¹>O$™Íd7GÉXÊ.+ +‡Ô©GN:Ét‹ù‘ ³…ùÃÁ¦}é9ÈgßßdP!wã(Q’Huš>í‡ä‹ͱ“F?H6­Æد¯ô¨#m4€SMé¹Ñ­½RM{&ÐûŒ-¼éR˜^±åÿ"³/ ?5z°DŠ¼é)Äp¦6y)ټŠ+ h—¯å(:ÜD9Û¥f"ä>£%S:í3à#"‡S3ölDua¾ÚãJ9­ªqÞ P—ªè˜Fï Â¦.°¸Ž¥#Á¢;ü "ü²}MáG” +žè@H‹+QpBÖU…Š(ô!÷«Cï,àè{_‚'ú `õØyÜ:Û·¯ÆÝm9œ$ì7¸•:§_Š·¨ce"lŸpÆy Lû¹uîXsÃ+80"tp«;iI¿®)¨ƥǕ +z’©X+(+EtvÙçéEè"LÅs´XdX Wú²FvÐØÑeuË!‡ Ó @Lr©§G-B9‹®ÒK8c<3`‘Y[ÇœæøP-ò®!kÄ’h_¥† )B§˜%›Cå‹4í7óוÄKе’dXdjþjáZüšüaËd@Ò‘Êí¶·è¶?±Bí¥šÎ…6y`dë q =âw]†K›êm« K™pŠF씇%uZQqË|„ž)";’•ÐÙÐ!Ó`­@uco"@øìHS¨{¹ÇVÙÓ1ó–5X³J¿ [H“Gía¯/ërþÑa†LÝÛè ›k>SNôþ•P2T ڽجP¿‰7k§€Ù^B?΋þ}µ½  z)TËÎ5ƒS$_Ö p6‡Í^JÞjÐb‹î0éPÝCŸ®D¨ø|ÆMmúq7i”V ­â˜?P\9ˆ ïy\Ý"ä~à5ü« ØßQ}EãtTÑ(¨7Èw5þ®[Ð0<¨7¸ñ5C:Í×<AN”°…1ÌÞë´Ç +ÉëÀ¼ÚaÕêÏ·±ÿ¬Žx/(…d“;x§ æ:å;½ªuÅí]jDBÞ^7 6 ƒ¥â/‰†5ØJ÷„{b¹ò»é‘¼Séy•f‹%8Äy„ŽE.TQ.Ø÷ +…âĦQеÈàOsiÛé£þ–DHŸòµžƒQŸzpŒÉŒcè"ÿÍ¿ ü´rmx$¨‚§R!dÔ/ªG;HÍúçÕ)¤¼õÅ€Zï`¿'È~À^g®ª:@Y7Ú QûYtÕF@*˜ùV#¨P'`CËfʘaél 3[ÔóË! mAÍ¿VÆ*¦…ˆœ/H"}ì«%ãÅ.ìjgT@ú2ŸõõC§0†Þ¯Ý‰}`¢ŸHä³D*^Š¦úPØÎʘðáý«-ÃC°R%Çv ù:¯t +G~Ȩ:WG1ÇjZQâ]tœ¶V{¶~âÑGU턪xàú¨î)Œ\¬ÒR5US– P…Rh/¬W%¢¥Pî ­6yÝVý´•öW²%ïJ6ðÊA;øH,å\Ö|Ú5³Fó-¯h-R‚xlj(WùK೸­hÎkÍGës‹¾Ã{óý÷lìÿû¿hpóWžè7œcâ?Ùÿ|gâ"À ^ÖÕ<¼“"ü§ë €5oëŽZVߣDP‹¤L´ñNA\-Ä}`D!ò| +o—€¬îp’Œ’g$ÓÓýÚBXƒ,¥š0óTí3Iˆ±PGսا­¯­0þKKá­½&7ÑŒº÷z Ù^3´˜ zMˆ1˜ +]¹§ÛâòRæàˆïÁuOº§–Ç^#C{jͧ±BžÝ¿?·ºBGüÐB ™þÅÎM/cÖx±t;ŸÙY=`ÍocÚ-±SžÉ¹g´™Pk,è{ë@CõÈÓK‰i04ÃÞÃô˳QËàùÑ{¶S©X4ÜÇEÛ«žìµy"̇=&\ê ˆþ4WF ”˾doX‚¤–ŒáʆÊzr@'Ä8$f:tLâA©€(èÏß* tº¢N¢âÄ\&¦j|°üû}o ÎÝô~ZH0iXúÎÃ+tFħ€û(?1nôZÏÏ¢š8f5ä&ãë`±Na bÜÇÐEþ8'äú|̱xÍX¿WP¥Ië§(ÙÆR¶ó-X çïñÕèïl4׆ïýL–)Ö$p¦ÚÀö°àáx@3ûÊòr Bß>FyZ`d ¹ä¯´ú9`¦¾ìwNuóƇƒÖQöÁ§Ä¥ÔÊ*v)^`Újkš/9N+ÖÂ8Ë•O*$Ž"v¯§lcâÓ 2ôù÷ôåúq°»à"*³>„±‚ê:VãÀÕeÁû¼þT€ÊbLZ³²ÈtÁ•›?=ý÷ƒ` )*˜vúN{=F‘rE§Š® +û¦×@Ìé({@äŒ$³÷:Plo?X˜ û7OÈÆñöÿ‹ŸÁ ‚ +Î8 +Ö·ç"ZƒbÐ:2a5ôó9[ô +ßyÀ¥,:Ný˜Ê&ÀÿŽ03Iï{D¤§ý44 ½Ûy‹’ñ,#m-q°êŒàõ?€o(|fYj»=Ç…7Ìá¿Ä åÕGS?iè•àÚ‰ð%mWŒn +ÕîÑ€4ÓµGf ¦*59ŸW­¨ŸZe0ªRÒ=¥M2óï4Òདྷ(ÀyÀ‚²˜¢ hD_z°6+ã|[î +TÎùR×_1I{šâ_–¬FÂ7ÛSéáÔËmÓ –Ù)\«>jÖËrЦn…áþ^eô¯õ‡ÆëO“~ĆP€xääNÕnUJ7iﻥ žâ ݦï‰æŠÒ¿öÓÏÞÓ=hlÅÒE ù:T[±ÑŽË•šÏ¸•ÚýfZ?}‹øÓ©ŸJ¦D³\ÅÇ÷(Y‰)lMzüw`†$è Dï.ÛýÄC@;,:Ãv)Née•0;-­l þðj~>f×yæ‘1ïRHlìá˜Ôi9dTäãS‘n=l©íXk› +wàÛZªhv™îE•ÆëBÑ5ÈQ‹èçÒóˆÄÀÐYî/ãx ³ m8QŒK6A£y_ ½Ì…Ûw ¦~Ø£eú-4ÏÐQ6HyzKÜrUþö-oãù.¢†Ù­§þÜ÷ú= +À7{îÓ<÷÷¬Ji£!:¢!ú\EµH{¶ÊÿSÕ±œA¢[ ÒÇihoº­ïlø‡}õ€>~kô€ë\E¤(]Š¨Ñæý;ąк¥ 0§ð*mE(Ofåð¦úUÄ@¿ò +)_Ñâ4ïäÌ>~´ßFôK3ó=Wä"?µÀSt¨Œh—dzçîWb31â-DÀ½ºurQ«¿P( ]/Ú ä2Vò@lìÀºÃ7Ø+êó3f%vË‘Øå%öoªŸ.ú‹òJBe‡Ú-©)®I9ºôù²®üþýÞáNË‚¨ÞL²ÆQ+?ôïó'ÍEÏŠý’…#Ú×’5™æ+ h×:äó¨eŸ'!ÚBÄö|P¡^@ÕU‹dcÇŽi=ßD4*Í®õú–|”ŽÜ¯rGqŸBps@_g’îN5Ï$œÔßœ7ç™:¸T{Æ~U F~hª«œ‹÷²0z –׃@È +í@…/©ù¬æ‡Ä.õqFÊÊÓׂ&kuгuZíøÈS +Õ`ï³ÓRö9˜Èó×kP#ž.¼X÷W<éØŠ¯D¦B5‚fƒSSÖ†QðꮂñO|ÐÔÆp"€<ÞæÚôx¥½Ô†Áû«ýGz{µ#>ÿuö»þ¹5S€ÁóA>=à˜S–$ÊOŸüluë7ŸÂôìöY«Xñ +÷j¼¬öû å<à‰{Ì‚¾rˆ;¨ºO´£Ò v®I_W>Ü\Pjë£Åí{%$Etàf†‚tuðå›ãäÊö¥Ù ]Íý|ÐTÆ´m•^¼ŽÛhSƒ@Ù2umÀoöÌ¿XZ0ÙÛ endstream endobj 77 0 obj <>stream +û~À{BZûÝÁÐ7y΢ÙR,ša&ÛmºâŸ=\Qt\egîA ?µD š)ºw\;UD Ïä: ʦ×YÈ–ãäÜ\¢?ÕüN~­×,IO| ŒÙÛ‘¯^vÂ=öâæ¹qr´”¼ÆfCl‘™I‰ 5ºŽ9”sàl¬û±ù8ØëÑ0†•e|gå“Â×H ½ð¼rŒ×1æ4 +l6­Ùô»»îmß®p¹ -Ih˜ì»ºv1¬ù¾ÎET6E+êz+ȱÊòü[½r¡EnÝ2f·î³îéBtyÊî£òÁ=Ng‰ÃÎ;¹æ ËaAîŽÑ½Û¡¯Ê 1ù¢v›¼ÿèæØépm†¬ji­±¿­¿:í:W¡Åsxn÷ Ê(=”QÖ²œX„)½‹Òâs'4ô;M[ÑÿãJâNq[ê”éÏ»h®6â`n{3²½yJD”ªglÓæ:çAqô@qÔÂD‚áO:E!ÀÿûQ ;_àíÀŸn5h>»=ïߣàë³µDYÎôejÈôñÝ´ý·åž$‹¶Œåˆ€î¨"ú ¨dF kJ„ç—¶”Kiç,0eôTÑÓ#Ôq:jðݼ¼"¬t²ÃÙ‹j³Š_ÁH + $3Ê¡­®Mvw±·LÇGŠ³™ !¼<°^ÔX€óÇ9{ßØ­¯½jçç›EMHÛ‹E=•†È,Q"¬ddÒåYIÞÚ^|òÕªá¤cP¾Al< óœF„:©óD̈PhĈy"¬]´Pñ1bÜ+÷º¥´¬Ô©$uŠöŠu‹·›Qíºþìüz‚Z6Ê(4DÐÃ~|áç‘„Å’T-2‰6ïd¥=G¶¿wª!Oƒ·K˜ )¨‚òr¹:ªWÜ‹éý ¾¦àû »ª•žT«™ð­»‘Ã…‚u³9D–¨ýìÇ”®O‹&&ÓBÒR*@ªÒ]({X›bЂ=;î= MyÏ<²s‚2³¾.°ØÁêÒÚC:—J ¤ +}¡l7°•VcFÓU‰ \^ˆ'hÛÎ[ŠÂwL/äŠFÀ¼e‘¡®òØ~¡3§"·…á=‡RwòÜöz7¾/*™îrú”â²jEÑq»²+•ßÞ8‰¼°X$r1½Pnõ%…kšu³àJ¨ÓP! /£GºEe +”(þS³ +ò7…Œ°=Z´@ëp’HôÉ,Ý*ê±}”¸¿ÔhÑ•èàb“»¯0\íšÎ¬®È+‡.; ¯y;“§¬«ê#\b +ˆ>« {p÷p!¢Á' »SÜý“0~¹;XMdÀ†ƒ-ÜI&q‚^ýxˆFOLꔹ˜!L/±‘Š§ÊË_MŽ}0ì‚öÿæÁŸj²®ÃÚ‘æ'ØïF›‡GÄu.éÞƒ]ïÒ)ׄ³HÝgÙÙÑËYØëêq‚Ñnö€ˆ¥{ËÂmwoSP›ÇDÔÊÔc]ÆÊ6»+…À=°F¦¥IªþŒøø”HƒÓ^¦4Éð©šÏ©k$+ÝYÑ÷ø{àëa ïSºâ3òW˜³K6•{låühg®·6ùvp='cãb žó$™¬ ïóÐ(bOý‘RäkVC;Ù§WŠ¢$¯O…'‚¤CN™§Yýö÷ëöz¨¿>6CÝ!k<.¥ñ:-㢥عât}4 +ûºš†Á'Ü»TôGõƒlõÂC.Ë£VìfŸà(\°rYÞÑûGƱq|Aà +=¢ã¿éV9þŸ0cÄHì~gÈQÑÌæÛO«Z¢›½wÊ0óµZ|­Ú,z6Qú¨!¿ò²áFoQ2BÆh¼`@»°IÂhBj¿Lžz¨¼)Àüàgö»b¤uà zrTÄ–W%{hë„»4sæ{Yì#âÚ¨_ˆBf§3952+ì0ðC.I©øn™jNŸ³ßãÌÃÞðu¶~ X'aç¹ ÁG§Ì½(+ÀÓWô î¿k§R–xOæD?džÁ˜¶÷R(ïÐR„UÆÑZ$³Tjœˆüô+Oݼ¸Âw‹>ŒgÉË—Ìqþ]§¶&1•ÄŸ%Gg¡ŸL¹ÖPvègñc)!A‰ q FÙstÑØ–~{>œŽ©4¤“•ŸúüûëÜmŒýtðŠwуJR}ö€C¢Ð»#Ê9B”s¼þþz³´ZKP+Ûׇà\(8°ïMIbóD¨ä0ƒES ¡Üœ›*!ÊïLš2mWªÞC¤QœÅ¥oÏç”PáT¯kVÈA6¬ØÝ°µÃd]Ñòi¿ºðUH—÷‹5ìâV\§ŒzOWÎé26uÈù±àµ3ZÜlÿ-R¾ùûŒŸciE’ãÁ=½¼ÌÔ­Õ+×kuц »û[P»â-›¼Z+¢Qα³,¬ç=K Q$ª‘P2â7€¡ôµ¢Óèv2M?‚^EîÒ×uÙ‘#ï^1½9äª#qIbÒCHîãÄg3…v[ ãhïëK·÷fù÷yûÝëô÷ð§iâ‡òá#¤â-„jÕÏí°Hø~°†p–,I>ÈœïåEês(g¿°ü¯0õñ¦¡ÚÕÉ Xm*Çf[ß-&æ)™kºí!ü‚[sÐŽèÂÚ1,Q€¤y2|Ìö;ý 0wªƒ×ŽhŠK…„œÆ3~“òùÍ¡ õq€îõKâúýà +¾rol¦`a€®†8€ H믱ñY±|ÃwC +ápŒ]¨C­Á2aÂa"$×Íý{¼É1Ææié:ă8“ÿ͹Ön:“<ÕVB‰Ò–…7Ð çßÜåkLyþ¦á¬~ùàH¡½ï'ùe>Î+~ +É «é•2‚COîí$#`}Û5ÿÀ~xâtô;íúù÷ƒû xæ¬.™Jô!ˆ&À—ÍŒ Ää²GiIÙ(p- U˜;%®aºh=|”2²SBëMúóé‘!fHã ,¾bÕ>mvéCd´|)Û·^¡}@o|îÞñ¡ÿú÷i”º9¢b¤›.‹~^ÿVdi=úärîÎë “2JÔàÒÐ4Õ*™) ­\:,0•Æ@¡¹Þîûfà  + âjå˜ÑÑ Û#½‘XRt^ÞKFí÷ýñß³ /—è/ò‰þÊ“%l‘ú¯)Bþ—¿§šúãßþ»ÿõÿþËË?þÃÿþç?ÿ¿?þíÿöŸÿÏ¿ûçþ‡ÿñßÿøŸÿçÿËßý·ÿþÇ_þüOÿÿÿüÿüñ?þýûçÿô?þüÿýS\ôûOü_ÿðOÿðwÿüÿÇ}‰Ÿ¾Üóú¿A{ú?ø¿;cÛÏ­XéaùÁÔ\áðÐeBù!sfLÁ¥€}{ýð·(ÈìdGžràvʹ‡8'~ý k >·xŽ‡âÂw\«ÆZ1ŠÖ‘è‚ý(d•@cp$ß#2P y©ïã"ÿˆ"‚"“ÎTÇŠBü€æk€ïˆèJ ãg´ßÀbÆ{Þ£dO¿ôD' „Gâoe—¸s˜@–=@Öa­wTc‘~Í:y¯óý:Õ¤OΞ%q[Š¥²Õ¢%Ah—Wði¸¨[âb #@ÚÂ×¢&hsDù>§”ADyÎéA"ÇŸš$ó0Ô&+hñ¡ý1ôH‰O¿#œ×šf(S|(SeD@y$bÌ¡•àcçB~߆ÓYÀ àì˜ì¸YÞ[V´\kÐÞéÄ£xÚ@®bð±W&EŠÊ:ý·=k<4mœEÀ¶¤h®%Ådzµ4íhö¼B"µŸLV¬î+IUÔˆÕe¥f¼³ÏšÑšúË:°ô +«ÆŒš¾;' +²ÂlˆÔ"žYèâ$/‚¨p Ûýì!±˜˜ÁKÞ;´ZzôÊ÷+1Óµw˜…(&݈ÂX6_;ççÀBŠ£OÁ±Ái©FÄÜOJÖé½ì¢æ#JP!ÛWv rñúð4@º €ONÀ Pï7€"³#`©q6{;£Ú™,[:PU;g¯èöPÉôY7´%}ªöéØAïË u +€¿²ªHf»Vºµ7ß½·l,!¯ÏPΡ¹…~:•žáÎ@téùŒ(ü~þ@â¼ÈßDµ0N%åÁS1Póñe„/sÞï5Õ‹ +µÀçòv ~Åòͧ½a´í7¸ºjl…D♇Èo +PxB† Ê'”taT¥{‡ˆâ6ƒDð—(!Y®Xó¦  IEm…çP^~—ýþ„Äiˆ«ìˆºâ‡(ÙI/`˜%:òÕŒ/ÜhUé®–ã8’n’³¦Ç{Å𜩛Bâyùi·AÎ}ÙÉ‘P§>_§6IµJµVM¥ 7‚U½s«ÉÜË~ÑÃ)yärUÊ?£ Ô>• +ž89äü;PNi ò ¨VÕUh Ÿý1ZÞbŒ•0°ÝaÒBù8‹©#ë µ&µiÓ¶ˆ kjFD°;<¹F'bí¥¡7ëmýúíWŸt‹L ñ&™éšÊšSáa¯À‹vw£¤Á œ{uA§’·g(‡ ‰uRµ;ag1òØþ?Û VñXGÐ}ï^ı¬sãWTDDÓDy2&±@¤|Ö©ãí´ØáH%-£T‰ÝQ+«·ŒÃ\çJ¡•ˆ #HÄ~¹ŒØïâXÂj¼+šùîï’®7çžœ×áÈU!Î+(Mj]Jʤu&S¬"¬’ÍfÐzùÔð»@{–º;3Ohi1ƒïáràçMÃ8ptóBÊ£3ï µ œpfS°ÆUY`öÃÂâ5(\­lfUëÝ‚²ËöU÷*½”¶ÏÑ,/{Чà9KfŽL>F³¾Ù°\V^bÂ*º¨gô:½ò_“|”o–BãŸ\õ÷y‰Qú Õ€,f#ŽˆùÁsXàÖhŒ{°……kºjâé÷­Ì‘`ãï¸"«_Jq£èÚIî‘€a ’|î¿õŠür^©†f­¹ÅêASúVJ9ÿx¢Z…ˆÕñÊ1Šp„;rÎÃè$ Wüì9‚0´(ô Pÿ”cÃW‚šuû,Ì<3P=òì ¥Q9 »sÔtØK”ìŒq‚%öPŽo(áÃü +/Áy•›ö,üwO …ýcÈ åaolÏ p,eWX&âóèÊC½òÛ E},ˆ½Ex¬i0Z ¸_ÎoÎ#C¨$¶9ä¹U¤\xBTãñÖ› +®%»tvviZS¹Éð£{6jp;2ÚDÑ !À—ùaç| ñ.¦dCÊÌ?„·¢ŸJ@îeõ&k”à$ZêÁaTíOŽý8Û–qM¹SHö‘"áN@…QËOKÏáLfY•Ì‰çBÝùâÙër¶ϦÉjM [P´€-¬1ÊP@V¯³ÃFq“5‡fo IŽÛólXå)\»€¡ä)Ž~!« X'jûòIWØ<ª´÷£aðáðD$NÂyæïQìMÁS‚Ø\–ƒy4¹®Ãã ÝŽ©J›-–¾R]ÑÿŒˆßTÿñg_%IÉúæ<\š)‚cö«˜a*2ê# £ªtKïǺâ0Þç'$òTm¤‰«Q8cê#G¯§lOj@~Î{ZS¨ ™„"’¬hžîñ^Ì ŠûRâJÛ{`å*Þ=l¦›v^úì÷"´³Ø·ïÁ–)MQE4ʈEC~á ðD "xnMU]j‹šT|Ñ=r1(ÝSÚ8™Óÿ ßˆPÿ¸Ö¹j"‘›GW†Äöax†]²€bPtš|D5x¸yß+}D=!^FKxž€ ·F¦f‘*••ZGJÍ*ÈNÛF§­|FD5…ô¡Û7çOe±§ iÉ _ˆebè^Pû Ð EWȸ§ÅúM²â&áŸXêW•”œýP÷­Ds ˆt£¡ÛÂt³"…ßÈÛò©ÖíbévSA2Ýq°-y=R§%ìo4G~)ÕFôP¨Ò VÃ>Ž{,š ‘Ãý+ÛËÊ^‚¹¿ ú×zw{-¡mæ)ëUñ4¢ß,è%š!9jlìCivú[‡Vµ{’9ŠéDQ¼ØQHœ„æš+sÃ.ŒJyò^*Ö²MZN#î]4˜† •2ŠJý¢Áëo.{#|&1{%*õQá6\v†·7‚Dììh¿#ûÃÅQ0ÎTW–îöDhQΰ£Ã†ÌATÕøx‘¯­½Çòã#ÚC£¾Y_1"ÕjêÛ¶çHζ=$ü©Îz +X¤ÖŒ“ߊÔø¬ò®³kâ-¦¦üŒXf9:€:<ýfBtw#]‡ƒ·Ê@²åG©šo ŸÔ©ÓQbágh pb‰M&FûŠ øTÙÇ'ÔõàÃ¥‰+ý®¼Ïž&÷j¯m4’~vÄu:!(³+ÝAKÔ¦ë+¤{ôt÷ÀXœ²—}âBaœ&eÉ1b[¢c ÎP“n çJãæYî±Á<‚¥ôü8p„ºS|ÍÌ©ÁË\a28|ÇùD†¨ ^™Wù´«ë–øÈJµ£Õ¢¯s+X¤tAäDX«)2i•Ù6\ÒÒ ¬ŒƒC¥®Ûd?]A•B¸?N«,R5³|¨ˆªsòÁª2>„b„¥ ÛrµPY!Ÿº.û°êÝIÐR¹.+¢Ô,í^OƒC9ö­xb¥eŠ2€=8sÕ[$Í-ÔzFÔ~ÐT&@'ƒW) ¡wª„J_éGÇÍWc'AÂ=Þ#¼Ž»#$Ìö·Äõyž¤Ã$~µ£‰eaÂC‘€Ú[S0…_6 ç3Vù®+ÞöÏñâ<û$@QÐÔµ!CªR )0MÛÙ"îwŸ‚³F¡ŠÎà'‘àž¾’ıôlÁóm>NÂ/žýÒ«`ÞÆÚV©“–ùM¸¦E—~ÿž>¿×ÏQX ™Nï— «^áT„yLb€&”Ó`;€¿®rÁÌ}?îeýh;ï‰Ç*ÔûI€í5@5ó ÔC_ã#½"4¥±ÏkïõE›aú6¥ %ÓÚ‡¨ ÕµI¯Gˆ6Ø€¥È/]Ÿw¨ 6_Z)ðΞ­L^ÆVŸ½P‹ôœ =­ +šKßE£ýz_ìg*XŠ>ã8À¯`Ú•N +³%&æHBö{7ü•Ø5-ŠYLÇoǽv ®“ÐÕëÇ)h +±B¢ŠYF|ÑæÊq”w¿‰˜Ñ;o4ï#ùˆª$d~)‰yâË>C‹V?J;¥i7{Úî¨AîÇ®•íë{Ä}5£6X‡pïA”k÷)×&$—ù*ý›?³§Úï{ªVo‰ó= + {_† b|88øvNEÕUœ\¨dåÏ÷/8×®¥p€%®·ˆ¸c]º8îª)×Çy*Å´Îä­ ÃÉÄúÉĸcõ‰=+p”±Bh'’CW?}ˆUIãè§ÇfQèZü8Mè0¿d{|fjyfÜšC+æ;z +ªiŠ¼™GšQø¹8)ÇÜOuų àÃq¬¡VLAžà·Ä–0(Œ¸þ©] fIMæŽ:;ùBÌk{%yGɧåÀ­Ë"F¼YUo¤¦*¬Ž$ðÿ="±eû‡Lf¿Ußžç9oSfF«a¼½T»ž:|F¬|8­ +ÖWöúÕŽ@TmZ/’UÑÿ]ì]Á¢PÞ +na×íOÚ +9_}üÑ;@5|¬Ïs¹ër»™ò±'ŠŒ¥cžŠ–3;¢©ð§ã|õ\ þýÈ:ÞïfîõuÞX +;¦.‡)ªoe’_Äy1ñàÊj™­å!”R¸»~7oBX#‚Š âNý˜ž’¤[|Éÿ‘hÅþP[':vN)*HA/å©Øú|ÚYU¨›vóÍ3?¢rÅôB'v`´ÈD‡PéaÃÐ- ÖýS0"˯¯¼S4pAÔúõ©ªôÉj0_Ë 5< +ä ÷î°0Ïñ¼t«,³Dȶ?ª6ç"1 ¥a;µÌCqŠe]MR๷ð·µÖ>eÛÓÚŒ/I¯Öññ§ÛR£§9!èÍç3Šò:ýè½ÁÚëˈIžUu¥Ä?"¾Y?ƒ€öQÀ ½ÀpoøÒÒsßi5Žà{!жª!ð¿ g6Û¸¢ïa£[*Â%×-G«'@B¢£€l€o£{{ÈŸRkSK†ZB¦û¯ª-Fã´g°™ùÑ€¥.¸Øµš!˵TtíTiè\ìYeÿUKH*85{ÅHLà­>ÛëÀ¿XDJ1‡³(šÚ÷Sš3¡6²ï¬{O‰ì‰0}¢G ¼ +[³,tÌÕ­qEŒƒÊ»zPqçp/‹ +eD°ý­wRü^oD‹ ¯F$=/ÜuÞ+±u'jg ¬Æ%ÌO«üç©žèàú"³ߵ¦¿7*wÝ’ÜåÙ½W>å–öö¼Õœ^#8¢öA¤§‹ú D ‹q¸›€±4ÇH—G gŠ+jH°.L´ÚªÇ\t„ÏÀC®ú·Ò¥EXÕ³v<6–$âÚÛMz^étÙ(³À„+Ȧ,l¤Í¿ª÷‹‚&«ZϪÞñw2"ªúPð#vkµÜ”p– îoA²âË3ƒz:ùžß:Âe¸ø¥\,áhð;a+lF: ±jñxX'Y‹qrÅ›áw×'ò÷¸´˜¾t±[R7úÙF£ÜÈód÷3Xí:ÓW—EêAFUÛ{pÐvgê~ûé“1Áò‰ +Á2Ÿ“T3¢*“”¯®ú‰•b(¯.[KƒÕBDAµŠ@†¬cù{À + —‘ôõq<œ‚À¬0zɉås1¢ÍQP…eÔ9ë>ElÂÔÇ¡S;¿ÄßSÛiýaV·5â…vö_h84 ×Ø> +L ‘qVd5 Œº7M±B!®ÝÑŒܤ€r6DÙBÜQêß'ûq÷6x£ß웩Á¼Ÿ`†i÷€pì=Åe?ç +µpG¶FàU¤Ä—«GÑóÃ|¦ÒOÇ—ªVé•kGÈÙf]©GñèÛ‰¨Â©>ª4²Ñ¦þìž(ƒBioŒ zÝûÁ¶òGë) 1;"Óœö+€ð(ô(ÏkIÐNŒ b(£aŠüÄ…pæB ò‰“áW£ðµtë‹ÈBXÉíÖë˜(.fƇ_¢ʾÓUøÖÎÅb÷j™hþêž ü亶y‘µ÷ D%°èJæx¢À¸ãAÔ¿ïP^*v·‰†GŽÎÌû(É'1ŒŸŸ–EH›°iÀC+œûwþÉnãóÊÜcsFu¨¸0PÖ§ÈdZäSúÛµ%E'FCÙ‘­fJÈ¿GÄC£¾ºW¤ý¿Y› Ïó$>Vµõç +$ „0º¦Ÿæ Ý–(·¯ÑñSÔXáâSŤìÓŒHð—&€¢†i»÷3ðgSSCžfL¡™ZüüºëûfÅI}äY"@dÐÈÈ")ÕîáæCªµÎqNÐ×x]%ÒP,ÍSÇz£ÑêD°^3U#ðPâÛ!JDPúÛ,ò;„ÚþªÁÖו,Ü1©bæÇ)@¡…„1ÉböˆÞ”QÜò#cšÙ ÓhC±w®Ÿ1-¼§m§! @4 ¾ +Í›é=Ý>"-†@¾ïïGÔŠ”Õ¢OïçûÎó}wþuÙù^œ2ízb;{$ƒ}0£þŒøÓÂÙv™ðüéÃœX ¾ Ïž)þ©¡=ˆ#["P&JÈx#ä±>à p©;L‰7¢¦%Ú†óÔÃ{‹zxû.bÐìAýhRügò}ƒpŒ¦èÿÀÙ³›¢ëvf_l‚„„?f +íÎÐ2\ÅøŒBS·@f#×ÚêÅè*"Ä"ÐjDdž©’QÕ§3èêוbµDÈ«FÔC*Yj¸Á »°«4ˆ a–ý»'¯Ä®šïÂ͈ŠÃé:ìÛÐŒUC‹¥"“cgWÙMÍŒ‚þB³4‘aZàHäv•ß#Š$A Î{*¼?é#ªåPÀŠÄf9ãÒÈöû~?vÞT*äwT¹Í:Y»î„öùÍyŠ½$–?uÿ*+A–u®œßDìôâT6¿9–ƒ‹ß-t™ >91ˈ´?XoÞæ$+“~ʲ¼ß>^ +Œ•!ÂûY ©ç\Òæk|IŠh{¦eC*­‡C`Ó•)îu‹{]o—.ÜÔjµ±o&h‚ˆÆÕ×Tj ƒ£§q6Âá…Ll¤T#H]‰Æ|/3ö麵z˜Éäy˜kˆ íœzœ:õL&ó‰(Î'§‰.§h&Ýú]”tÞA)¼J…T‘ͨ@$öö)^èMl]÷ªÖ¾‰@ªÔ»B÷¨FepÑî\DI·{(À´8àúPÚÜïUÌ(zD4è‘[â="F]sŠÙï#¢>õ›óÀ\ ‹¼Ç‚¸¢ðiû·¬ÛÚ}™D %Þ\jfg·L@xÞž¯ø†¾Ôƒ½‡§eÒò|uN8âS²¨[±CÖWP¯€lùÒ§&ŧyä™f!˜ûG¡—Q)SïvN7–ÉÂ@ FWœ:ÕãøÅ}ô©9} +|²åÏAõ9Âf ìa­Ò&~ÌgÀØwÙÙÔ•YùŒ*’¿‹™Gó¦@öC[Ù¯o æ`bž +õ^~Šü ýä""¿0uÔ¾àX1`Ö9(w†b‰û#M½Ã‰ ¼#Ð’0 ꌃ¢ w±gZ¯ MG4{¿g šØŒ,¼>©[(‘Í­#š T)PAÞ£ý{Řq‘7‚REž!Ù‘§(g‰Ç)%M©xϨ€44~ô4wyW…úïŸ5ÐÑþ&‚Ri}aO>˜Ci£ +ù†°÷¤‰`Ï´²GÙÏtÖðƈXšG~FĽ +HHF{5ùö<ãþfQšï'¢*«f^$zg› Óçºøê—;ØÜMÉ´þõ7çëÀÍØQëëN+8ÏÀöZ:*²¢ö^œ—O:9y¿°ÈU}Qƒ´—Lè_%¨Ÿ¢gV¾;gà˜dZ$¼sZi•‰•€½#záñŒ‰jõ7w’)]Ûoγ{tÂÏu¢Ö„hW*ï sdµïQh£ÈlXÊ‘6KÚ49œ²šÄ™P AzÅŽaÏ‹8Ó#Ã(rÙÐ’IÓ¢Mg[iäQÀ,Tô' xHÚ¤*Ô¨ÑçMº¬¦ l¸C¯ð@ÇN?Žn% SÈIMŸ*¦¤"¦A$ Ñïó£R[: +¶úï™ùoOW]ö…`\§žH? ö#Ý\0+²y=K(Ãì‚ 7àtQ+ÿ{´QZ4ô8Nôñéã™F>Mºb6¯$Bœ|ä3‚•W˺}úüÿ Òµ`%fÉ‘}2]`,z|5 ÈKÛ)–F³êi t}W&jÎ<輤‚Ýç¯îÔµûã6¤d^\þ6âïbeýrß%£ÿÄ:W|–· +:#S’]ø΀ñN?\¦ +B 1ËùœaTD‘ßç¡ÂOO„ª ŸP£=^<) +4Û€„AMtGÔ»}xæA¹ÙAäH.öe üWr°nî/Øn<ˆ»ûZäÃ0G‹±Š’³ž²ØwŽ‹ô€e^«6ÏŒrbÛ{ǽöwO#4™ŠþÔ]+êD2xöó\ ½ÎØצ¯+ÕÇž’'*¸…ðrã<8ãQUúštÚÆrú´à4íŸBÉç\)Ä[övhÊlçµØƒÉrrÇ9ð2(Ýr)ÆŸmÑeÁÆdE­.혊Ùk†øŠýù“°ë&}1xG{Q{GpO? ¥Œ¨×Ž8 +¤Ö¶&‘QµHkNžv#¶¬aQ„¼i}¯5ÚŒ¿Š$Û_•8¹ ZåÆ)e2NêM÷¥Æ£ŒÙ{0;¹µè"†ý8U>î·GV¶ lzPT¥Ëý‹ùÒÈ´~µ‘¥€sGÀ_ËÊ~愈`u-«!Z\·ô¤˜ ÜKømìΦå»ÚŽ`”„Ä(ê4²„?àTHñL´>[Ø4ÜýJÍ»e§]û•v9×ÝkfìÓΕ`Ë2…¼ë'vä‰b‰GaOißV+ •/(µ( Ôt)Wß4óÒ~‹mO`©¦¡µ˜e9ÛÈ–ŶcPèȶÒ$óæm;ýŠ:¶÷ò3 Ó>juXz§aÍ°Z’ؾ/Ô¨ýa+6Á(ÈÖ¤cÔòva[M“è&Š 1xÄ©‘D¼®5¤×>#€ò˜Â¢¤«$d¿|+.ƒl¶Í¡ûJƒ¹K_’ý+‚ÇÛ³÷³5.ÄfŠ©™*uM.D•éßâT»‰Z“Œ„õºÐãÌÕ.;÷%æõ¤A-Pd Gä5 `û‹v²ÖPæÉ›=ì'oSU TÒ”» mõíÜîW‹wTqU³ö‹ 84uä]:¯¶ ïß+®ÀÇ~‡š WE†öwM‹ÕIfŠõŒz8«ª?sVØ™Q¯ÄCãJ,š?ÐÁPp}ßØ* ¯³05Ô”‘mÙçÀK +øD²Ýò…C·P;njpsKgHfV0÷’'®Þ0É‘1Й’J½PC¿bØ|æ]Ô”i”ï©//µ0pܤ?GĘ6„à“áF03ωÞ>O½»lõ%CZµÑa•u‚(u8}?ÂÁP×'®…µ3vxCÈPŽ ùSw|¿bï°„HN† æ:_m†æÏð<:_Ê> +EýDŠ[O›‘ÊÄB„Í¿Aÿ_r´=‡íV¢Òy‹h2ò~Ô:0|“ž…ç—œˆBo1#’Tîo¹ÒqÜãæ`F †ðä\q2p-@ÌרÂ(œç@PgÓÓ=§pþh „ZšVÐÈ®YèZn)ï•b5Ü·ŠI>ýȆ:Â6«>„¶Ò Å„ä1˜Œ¸#¤jÈÞ“¾ž·& +¥x_>'Ú ævôOè’A¸›^øò ²9ú¨ÒGÞxöÜxpÒÎØBäÈsÍÌÀ±ßî*À JUF0\Øo'ÅgÆ Œ”˜Á„hጭ1ó[c8ÂF(˜'U§ù@ +x]^\®;ÏËÊ}îêb"Ñ©¢½Ã¶`=3]íu¢¶‹´›BYɦŠMGácQñ£Zz™_T ¥·VKBŠJ ÒP¸X «2Š#é ÈU§ð r΢ڲè|8N+=pñH£­! 3ï³ ¸ÆUÐ2¥W:’ÐFÙÛ¡WÑý"e·UœÂó˜|¹-Üš.G½Z€Áׇ4ˆûøˆW‘"ü£=OQÓˆ ,ë´eGç;EJÜ¢H´wébv"ÒÍ/Q®$ÒNT•yÔIkí9<ÏV@ij殺ΌüqÿÔÑ^tü´¬xrhEÑæ4÷A€¾K o÷xŸ3@‘J¾Q:Wšå£K+kÙcbæ®,]:>T3IûGœŒ…Hæ†RZÀål'}Tµ#tw.‹€ŸDùo)áDB‰™—Ý_¸äýõhìE£ìÐC]NÖ98Çñáaìeu>>³Cÿ~K&M†@â.B¸ •Ïr4¬ã2ö­ŠP‹ÑÏhÆÁòçÅôŒþ¹|§rÁËU[94blOÑM°+N"{çÑ29«‚éâð›9Í﹩aoO†ËtÚÌÏ)Ê£,4vÆb…»YG,¡ 8ô ÃJ B…uè©~<ƒm¿,±Ÿ}8 +<Š1ñXÀPÒ )ê6ÓK˜Êé¥5¹£ðiÃn i%¢‚Ÿ€1 ‰Ï]-ˆ ä¼|x×T䘋§¶EDì!Éʧ˜¤\=‘ùˆ>"*‰ÒݯíÁ—âJ$ÕD0ã»ð*îoœBžó±¨j„1óã¥DKgV©8:Y½²WìkŒŽ¨89áʼni»ïü¤iÑ>ÐW6Ò 0©í£å£šNµáA5ã4n™Û^*/CÉUédüàÏ+êC Ú9©gè+D‰ÙÁ¦=à>¯}‘ÉfüKôHͯå(•ÖŒOR¡â¡×”Nõ`+ÌôD9‰EÝí¥„Èk2Š*qDñ6uN³Â®4{zéðJø™¾ +!¡T°AˆÊB;¢ärY9D¾ž` )C›¶½ª±q!Ŷ¼´_ Ö€Ð9 ˆÎAEÍöÌ.Z¤Jˆ¼“ ˆdÚhfÞÃ+€ä ¯$úÄÅþ8•2(潟 }lÒDð÷ù‹µ×F;Ú%T–OcÞH ~€@[êg c/î9ÌÓ}0íjVæ»b3\Jtø–:Ÿ÷•UÀ%Á+!¨ÂÉ‚Ð[û£v6»®è´ŽY‹™ïéê¡ÊCW1аWˆÃŽ(GŸ+Z{Ë–Gì;¦ +Ô[[/9pâ’$¬*1’ï6¨“n„H³¹dT,*ýØi¿t9 F>Þæq;§yéé‚N(N´Â¹Mxäaíêá/c“dÿþJGYá)þÀ4Åu0•ZiP‘Aï4z¯Œk„ú˜"”#ïUi) \M!–P‰½§ÕœEÎ2y0{ô}eu‡„2Ëàúƒ½yi‘À¨cµ¥ç•xi…ƒ,ˆ³® îÆãæ¥7±®AÈ9ù7 ñä§8f#Ì´V¹¢&IŸ”y³Fi" Æžœ”ª¬šµ —©¡ +ÍwŒ÷˜òG‹¯àþ €×¸ìš=jíL<=ç[S²Íä÷öŽéq‡¤`“—¥N—ºÑ&J´¨ô¹q"££§¿úH¼>qäR˜)òìº#ÇRìW€íP†žé˜æÒ’ad±àMHâå»ÓÚ%¯XŽ?2.gD¹jÙ`a[˜‰½Oå€ê +É› +ã„+¥q@Ó™ež/0K; +éÓ>B út‚ÿþ õÊ&‚7­­Ð#ˆâ~À ŠÊNLŽû–M“¨’£3×àÕ;Š{ì*¥–(ùõA(äÝõh}€Z¡â>XÙù²e" é àå›òµõ o›ãdMO`c=$Håñ¨¦º?¡ŠEo ÷çl]áQ4º£{Ž*/” ë¸/‘ò÷]4{Áù‚õ¼Ø}™f{ +e)ÀÛVü¹~lºê‘ßF`6V–G+ÈŒ‘8hvÁ{JV¶©7‘ßU&¾¨1µë” ªuØXçñLÔþ‡ }¬]<ÈŽŒ„ á|Ôt;ÄW$=‡>=!sÑÅæ¡ y‚ÛY""ä)öLÔO‹Œ(IOz„øWÌX {§@áðˆ£'B)4üíS¡bÕð/J˜wÅ…R|Ùu÷î¨Ã‹’gPšé  CuDv´bfpBá·ªb^¬ú„5Šc²,Ü’Ž«¡-7[=zŽ4?™sl¥• S }÷#¹7µ¿Ü÷O´½9äà·JxRP {IPŽè²Ò.x`’ì’—Ž¬†’0ï™$GQ%¤+<`µóéX—Àâ4óì[×»…"sB”¼…4¡f;ÊÍÈ>2¡PŠD„k©ÚÍrŠh¼þ*eô“°t¤7_Ò²äVêxh„¨;˜KVÖvöGûó ûÛ*ôžæ~Bøzø…¿bÜQжÏyFD ÀTžUñ)'BÂÊþšâ†‰ VEDz¾®¤e<2Ë#d›Ñ0J‘áv`X@>Ô%¢*ZI«?¾Ë!‹åä ñeY‘_¢lO›l +@LsÅi„–C»®\…g€3£¦ªñŒ>ÑÒ¦¤„‚´çdŸóŒ¦ª ›¦®´/2N$j,¤{H´^^jï*|„0µúºiò6ºÜ5!2›á›$aw'€…Yb$ ˆ*nòŽRÊÓà ½„þè%°lòCtgœ¯óšåQAµŠM]^€WãÆfU¼7$\f€ºîæ‹/ôF™Þ3Œ@hh1jE9KµÇÜ»àØ‘ÎpoöLWµÎ®:Yò¬z#ìÐý¼Ûe=(çaùmYy]2å]-p{®ãØ(TøoÃB=Êy›ÒñàF¦=*{Ò‚NW‹7mþ¸ù8büÌó‹Ü¢>˜ÀSôŠXýÔzу»bî_'Õ(²ŽEm€s8 Š‰p;‹¸Ho'Â?«¬0ØÑŸ+üýšâw°Ù€·ÆA’ƒs#êûEÇÛÍsåéaróÖ€îi$g¤%$¥X–‚λBMSö›y¥. QJ_¢KC"Œû.j#D ÛSòNË–Ñ?Þ+òuHIñÂLxÂõ°'&à’‰J¡ÑŸõã1 +ŠQ‰…3xƒ +³ÄW¡üµ#*ºFPŸ&"côy2VðßSú’ëÎ’µ!X®;Pý‘cÑP€Áئ†HÝ(ªƒŒo*ÂìgUf)D+p¥H?@ôÃv¡—T¸ Á‹~#:fa$ò`¯Äî:XAC.!š…»´=—=äv +ó"œAµż•n™?ëpÕ‚2Z÷æB2Iö”ë|kª„úo²>5 Œg Ñ(ž_ô¤—æRée´£aÂ=â­Ýã9uÒ!aPlpÏOHŽà ÑQÚ÷ž~Aª0VÍû{]1…¸'8HÍí<º»ºóÈê‡åÀ09°{ÁE•¾ ¸#Ú Ç¯ÐÚ÷ÑŒàËkÜÜãÅÞ +/ ››©ü“…Æ %Jùª *t¢°Ë:sl:j¢¯•b³ª )Ñ2ôlñ\÷²¹Tƒ1¢ˆ´~YsUÉ™ïή,â2ëVaæÁ>î ÒÒ:ÄðqˆádO“Y§¡U“‘……r ¡1úÄük ¯ +ÐùlÌÊó`b}mŽPé@ÿªØYƒÁL¦Õ+Kb˜+Š_eí‚ð÷E‰ +Ëé´x.tÔxˆT6§˜Sˆäß¿~¦sgXb1åЧžÓt·¼C¤¿(ºG–LÊ® ˜³RÕ`ŸLˆY’÷YIO?UiÌxèí””yKÔJºÔO+0 +¢ËòƲ&‚Q±+·PXÒêI"¦— Tõ:NÖÝÑ3—O«ê©@ÂGyeS˜tX‚v1h=0 +×`L+½4Ï::$”7öÁêk¯"Íô×rKPÁYÏ^Ä™&u™Ž9 \™æ,N¨ŠbÔË âí¯ÓÐf‹š«ƒD9]®í¼)ÁwD„²ˆAƒ#â|%ó‹êd}…?áˆI‘"!Gd¤‡ šb(\¶ìÔ×ጪ&±›ë½+ÖÖ^¶…ÈÊ‚}¥ßÍ&D…_&#]aA¦,Œ2 Å¢ê™ê7s÷À‘e3ˆ)ùHFð*˜Òñ*W"„ÝqÝ[ zéƒU{:Œ%}O±ª4@û:Ÿ +É>ÍžšŸí󊣜±ƒÙ¯ö×W€òÁãÍ—Ð` ÛƒqõÍZ×váÉ%–ÆkéM%%%\Õ&{ð‰wƲ¦þ¦g#Ié!{#‰7»@e³S3ìŠÀ +X§LÚK#4@ ®zqE`·ˆ+v›çû»BpGßõbOT`Í–‡þ DY +¯¤Â9×C¶°Ù:z4šÑÃ(¡u.rìw¬E5ÇŠÙ_ý@íäÌtTŒÚ/,CmêŠfK8(‡a¼âiŠÄ6Wz‚Š04–™€fÉ]Dº_ +I ž%–JUn +C^RIPx+(¥Ç90ÞäVQ=`§*é~!-·Èq+¨ûyAæ—°ì)™/(Ú ­™È*SBÕ¨Q"]OKª*|ˆÄL×S"á›CçëJþ¦}%´wuú¦Z;o“÷TuÍ¢L¶d•ÐÔƒ¶ÐVåQ>KRSâÎ'(ö_΀ ÇþèÊ5׌i¿ôÂÌ­„pž†Yˆn)ÅYŠÞ¬2¦¨tAâ‰\*«_ȞȼâQ™”¥¨„Ö·Ë8%0Ù²ì¾B‹ƒž "½ÝÚb²Y§°R¢LU6½Ê ­ÃÁ íT4˜„†Ç‡ëZÎ%òNmAgJËj­Æëw¤%«¤`aû¬Wc9ðd/ˆãçÍÛ-žìeyIûÏÇû0ë}ej JQÃ/+ö§¦¨'–›×«ˆ_B_ÆT^áe™Åy„$¾ûÈ¡ÚhXA:ÛìY›Dœo0öDP™%"]J„4RÑ¢GThòËÙ9¹S|O^6`3”‚Xñ6 îòš.ÙŽS)až75%鉪W“Œi§†ê‚¸>‡ƒF6Ù[ ÝjJܹËÚÇ>CrFFÚ}O:E ¯&, à,«°ùú’Ø]åÒv¼ v&å”÷‡Dxær‡ª ý2,UÑUäíKS´?(ÖA(Ép hRÚѧ0‡×îð43¢˜áˆÚiÄßü›`À•8<Xïä±!’¦'³#DÑé!3ŽôË÷G‡‚ýþ€;tâ[þN³X-9àw$q*¬ä½Y1gX¡B¯¾Ÿm»&žf¤tÆêèÚY’0*ñNe{õó +$È +nEGÖyŸW–Ý”µÅ1Xà#¥t»„øäx‰É¯°dó¨zr£µ¬¼ä¾å5H²±ÛMx2 SJ “4Ü–¾ÏÙ¾ Omß 7Ieg·0Ùj“jTGë$}í߶ß>©5ÖV£ß®-è¯{@Ú8Ñ ÍoïËÑ7õ%)áŽÀX´ð@ï+%{_¼rñõ„=‚]̬Œ šÃ }¿¤'Ù õÔÞMš¬¹,!×òYæ ,DG¶Ü8%/­Ÿ!5]ƒ‡Ý÷LWD›\DxùÍëØseç­ž]:Ë> +ÒÇLöLÞÈK5­zÔý@C;|RŽßÞ¾Îá € ·rô<^vÞDDeœFOs”R©}œ'G{ ò <ñßDèýžxÀÿÜëÿêý†}ü'ûŸïìà%÷•G ç© Vðû©¤”ÃQrŸ3ÔÀ±ç3HêžÓóPBɪpíG_™RÀxÎŽ¼íÙÉu}³²{ŒÙâiÌÀÜ Px[ÇÜ`vT]æ›FFô=­yy@ò˃.%Æ|‰‰éØ$„âÉR§çQ`l¢3F#(ÏÁàåÉž£Æ9¢kœ™‡ÚëJ¶vTÏ‘&Ö°„0Ô4ÀTzâcTŸpÉ\©Ì5B=¶IŠVBû8 sp0ºkp>n#ŒÀ^˜I…X÷ÞÙÛTß½5û»eŽD{2$–7H¤È³Ž#LJèr`t^ר…„œWø,)¯DEÝÙ»Q**“@ÿ4§g¡gÏ-ès¥ÞõTÞSÍ^6bz³uªEõs‡(°JíföÂæ(Ùb§©Áµí.}®F×õ LBPq9B„rÉü;9\;QìƒØEÈ ßûeh¦Ð-eÆÜ@„*;b &¢ëw2™ðÆë!¼aÄ⧠¬‹þ>¢ó/YaÏ ŽfR7hñ]SΣٱov» +ïƒUiÐíMæª œæj2õqTöZð{…p³‰•õ_¹î-˜d^i/¿ÃÏÏ7§±Jž YØ ¨*Ÿ{gp&ê½Ì[•Vþƶ€ül5û4¸„¹"›:Š£Ã«*!vxÚ @e¯NÞ2sÂý¢ë +¨´ƒFÅòÊ×~N(VòQƒýój&uœ8ˆ ;œï†»Uâãl/:¶A#,M´D‹ qÎØ´u k+"jÜ!|ý«}¨ÅÌó5:2x; +„ú>ψVúŽE>xÿl„¥Ü.Ì . ‚ ÝŽ^§¼Ké¶c ¦ÇW9²A½ˆÓœŠdGÈôX‚iþ<ÀpwƤ`}%P>£ÊQ—õÅFyË‘MÞ)ºÄKŒê82P­‚ò®>+)àÌ'¢žˆÃŠé‡x÷qp`ýͦ{/5ÉÀ¸ÚtkV6ú7ßÖϨRPcNÚ÷£cêŠKgå™AŠ‚áÊòÊû4­_A€¸Ò':Kð µX ‰©47=[ž¨Ü€‰ þf9Ôê+Õ8X£&™ô~­åž²¯?Ê#³šºš5-d(vèézÍ=Qû½o‘¤bÙz8hié»çko~œÕ@áXÐR¦ŒýHHë¸êÈ—¥Ásu5V ÂiLìy³»Ö¬>Éæô‘Ð#͸†€~ÕëÌÛîyôw{¨{|FD1èúŸ犖° QuoëTÇ'3S ¯‹¥6AB®4ò¶Oä1媴¥F “Qtˆ¢dâyÄ!['•R¥>ëñã·3²5­²fž¿Žl/Š<ó…N·ó ±ºÈ×g’ŠÖôà¿çö#6/ã™TCUXäpÛÙºœÂDÿèl-³–U¶Ç‡…HIýö s˜ Q&÷ÒÔehš‚?Ûp½Ö ì†1Œùü~É’¢™ùH;“Y´¸’NÿÖžö|ð7j°é)>®D”¢¹Çí(I õÒÎ")!u,Gì!v# ìëPÕd®ëƒ =­fœ+2ÊÐ@ÏÁp-´Fø ð Úc %Ù0ŸìÚ¢Viöô—c«•vÞ$¸„bHµ\ÃHf…Äy8} aÀ‹ÊÖ;<]IšR¯K†ßþ>8/hµÊ>oVØéå\¸g#¯ên~4KuôxB2Ö˜ó¸:‘û…Uw:"”7Ù+oE44È!5Æ•¢¦% U‰øbo?, ÈÔàçãK5>ŒS#‰eJø Ý""p?ŠŸÇsLIÙ /Sª¥?7CÙ½@Y·óQ 5À ^L ŒBÄPTy‚¯8Ú0À!Ü$¢$JQj4ÎÚ¯šl×$Ëí#"öQOôMGðZ?£Ø 5%=xÐ3¸ÄRä37Kš!¶Q©=B™±±aÓŠÚÚYž¹¼É@ôÆ Òõ›9üÐœ+ÆѼ'Âu>)ÄW +MD„f¨)ƒJD¾E_<(ܮÜŒÓyšÚ¨°Ù&aÓ5@s€òD`bm‡>q! >Ï¡x|uÍlUìZ¡1_q"èåh 6jMhdË°žÑ%¯‰Ûµ’„$¤ª[ÿ½ß¢kÿZX)ËîÜQ(ÐàÊS¬¤r&²–ÆÞIõ[B®€øX³¾9.~Þ"k‚®{ +Q‡â·3BP[á'*td8K5ÍÀüà™ÞÏm™½+—üñ§Ó6 嚎„iÿî<°9Øåø.&“ÀÀH¹ù%Ù4:øˆÂ"ËNÄžër[o «ax‘÷dm(¦Ó¼H™õ!¬5xÒf=–ìÒ½R ±D:‡½(§Ì)zNF~M·o#ôfõZRG:…XUÜVÔ³ÕÌ¡F#U­~ôÑâZtò<ÌñQˆ=OØ4RQž¡—Jïž¹ÔhÒ9sÀŠÏgë W¸ˆçŽ u¬ ¦E+ì41©›qïÓß÷~èvüqȪ{ÕÆýç¼9ïQðîÄ A–<÷¾[<ßÛ;ÀoÝ`„OêùèßäϿǤvÝ´Nžüþi“7%.³Ð%ÚŠ¶È>€¤Ê |÷¥ø…S--›'¬N±™Ñ³ÁJ¢ u½«ÌšåÕN(WÔpO{/á'øj®J+$âI+ŠÐ ÛJ øòwcÁ6¦e´”HwxååÞç““6=‡„…œ|>aªAì‘‚éR…Ê”+ÐÃÿ€b§fˆu§_¡œåvï‹Æ¥îƒéŠÅlö™y”űÃÝÄ®jo·ßËÚì1ÑNâ} „½>!Ç– +ËÙ¡çËAÚØ/?#T ‡¦ÒCƒ].f)Ár!"ôë³]„8}V¥½½ H­ø8b mÝ' l两yšjE·á8 J®6Oª…6ÅSÙö +±¡#F]b“T5¬ 83úd¬“åP ZMú¿• ýž;$xL´gvêƒUQœZà^sWGÖrÄiàáãuê.ÄÖŠí .é¶y´[ìMC¡…É6Zöüd„më ¬BÊ“Žø:¡SZ]çàoÓd¿¾_Ëg„ßÿðð= +›z,”L승mÔEëCŠ01"B#L½ÕîLñv²ÊzÈ!›&Ùf1’¤Í=@-j`EXð6‹ÀO¹³¹=/#n¹F±œn.‡EªAmEÈQæç°ãëºp˜@ppȹ}‘{t¥J2~~ŽÒVd†­ˆ„ârì9öÎK¯}“ sHQn¨«-¤wàsºxwl…>o×wQô¶§Ê”ÍÙH.@“Õõ_v7]{)%Ï¡Sí›rØòAéQ‚¡í¨8?Œ¸Ä.=q_Üäi¼ð²^6Æq:W÷?—L~;ð6nÑë¥1NT8%¢ŠÎŽ¸ÈY s\GÂhƒ£™27¿#§“ íoR®¼™h·ðNçÚ¡‡æZè i’±Âu ±8< âEçEõ3"I [3סµ´B“(Ô›Mêü¢´—ȼûÔÿá#¢pW$ÍUûŒB’€G›2‰”2T`qÔ"‘ûF†‚¬AªJ–HfÇOþ#"îw³øY¼þQ3êÔK•³ÄœÎAÍäŠÝH?~ôsâQµa€€Žk¨¬2\ÝA8YºËŠ7 +¤~4ŠŽ(®g^yŸH¹©ëýa=WåFl­ã‰”x"ýh F)¤ÀØ9)¼C÷œ—2 +•xÐft‘zß#÷{c´´,B›Þ‚32&¬x=€…Ò[ón{>¢”í!#ª¢}Ħ‘2Ÿ¦<_šç/XúÈÔƒÛ¶dÅŸ(µmx‡`5e>JŽÒûí Ž¶=ªiz·—œ¯_Î$ìÆ°Ç|€ۓÎt}­ÈžïõuoìÂW J­léfFß ’-"®ïºM<6ÁU©rú~žÑ/}·UÕCS4šÈÚ¹Æ{Àÿbímv¥G²óÜ+8÷ð å3(3þäÐ.†6ÎÄö¨!´d@€[-Èm¾ûÏósWen©, »ÑªÍ•d&ŒX±ÖûóíòøÄjÒt ¥(+Ôøä28ÎCRªœ£øÏAå+G“\¶IÆ”ùa?ï&Æn-h Sâ{*kÑSTØï%5ý¨qCLP“ÍÒµ&»1é:JCC”ÊLߦözêÝ”bØu]ã&õÅè#âŸv É™ûýàÐÝòª‰Ikk³ïAe´±)ï]ÊÝ°¡‚wÜé# ¢T酪䊨9ž(J9MÆò>岞ðŽ˜;¢Ì1Am*¤qÈUßOÙ„1„(´œ7úZ2‡þèþ=†ÕnGjþ«IøëÎw¬”-˜ ×œñ:¿xι¶ìó΃¹åÁ^AÆÒp¿,ˆ? Ö.E[OžúIxnÏlôIñÌÞŠ×0‘C“ÃlþÙé8Ú´]7CýœÃŸÍà±Z½O¡Ânì!HüCœÔNתÛz˜¨PDè¶ñ‰šˆTƒ”˜ìÔ6%óÜj®ÓU#D{á({Õ×y5Ç=-bxLmŠJCæ›5ÏÈ hÑzV1ƒõ{úH"e©z +¸ÈIÑ’;eT]ò™ªæjÒAQ’·ø0ì3Z[=ÙÝ6³§ÞìH?mœ¾´J—TòxPµ—i‚zZgcŒï3»k6ÇÈÞ<-£¼R… "”…ç5ÜAs:”¢Ò®uÏÚÏ \›hå0Ú%M`QD•–Ÿ(à°b^ãñ :"–\cQÐ+~áQ~á¶î! gœ¦¿ÔÝîË5‰WYêZçÆ®¯}<2r÷•þ!/|ZÕà(€j¡:°zwWÍ„HÎc1–ôH1ý²+«ÙÆ)IVöuæ6 àK …CíLâ¹Y½€ÉJNõAôTÈqù(ƒŽuY€ì*rÃÆ>¾Zw¸Ú8,׸1@r@&«Jæf0¿˜ืôu QÖ¦´sòˆÂÍM/=‹(ÅW`DéÓlÔHÀ+"º´úSã,#”gAÝoÊÔŽ¹ˆ3ßüÈ:®BÑs*(ÄH&jÊe½!½ö\§D½ådïZUÖ€ ›k+[ÐI¾jà¶*[•×“‘6³n冷³Ÿ û‹uë&ÏìŽÑ¼¢DÐ5Œ "솅¯-öÖ ¥=-ÛóÀxµLHCb?j=Š`›…]·‘s·mfis<N-Fþø…¤ôý‹´g/3%:‰à Ðì÷#Bu0xª-’ÁI9ޣϤÑT¬kÒâíW_z¦!€Dùcyñ×O¨¶çÀ™/Ÿzf+‡ <ðc~óq†ŒÞÑ“3YYÃðõuàJ)jMª+}  fdkß„ü¸à…·{w¿ÖÙOÄtªr|FÉîøÅm.þI©qÒS¢ç|:Lèü%B8 Q¥b§9[yQÚ“µø7À ëtÀ’ý”.J“m¥j +²‰šžÐ'"$äÜ#RÒh·Ét0wŒ××u…!¯ôÝúµá9Wäâ/ïÂ0g­r„£Æ<Fp>×V}?·æþñq¼·þè PÎF>€ ÔG„Ïqä9Ž§øÞéã>ߎ±Õ^ïØ?H‚E&‰*ÞÉõ¬ýߌ†}eÄ}QþïŸQ"©dO¥~æ­@é +ƒï²L¥H¤¸h¬ôGªn Öú§:]›Õ‚~p4Ù‚¹jý›‚÷GĸbDD±ú,'ª»ŠBÅ\:¬‰#FÝ(Ê?".S’ ðéú ë²ÙÂÌõDCæ8±µõ‹žšéµý1W*|‘X꟢®\™‚<&"”ƒä4²¸zô$ÑC’DZ‘þpë×ù¯Gû”ÄÎÅhù¸Usª¯ø{¦Šk_86Cv‹*«4¥‘:¸žY";†aw1*5t‰Ü§­ÏiŸHY`ßk,ªÏñL装ü~P’“ŠÓzLLùaî‹Øçª%×d,Cßr£º¥†¶YDZü­Ø× üð¥ØÏ©û•ù¶".Å•?PŒ¼3C­™÷‘Hx‹úÚ¦¹o†W8çƒ>gvšåCe9Õ|yxÍ!˜…! eæãOå3êˆ3Ö‚óÞüëÐÅë©ðô±ý|ñu„Æåoº‡nr oZÕsk½5Çx¶Õg:zür¬Œ‘<1ç<`Ú@yÖ#¶È‘2Æ´§¿–¯ +…f†¶í—óš,kí¹²‘’O2ôDÔçQÃ%<¶í^û+yn‡šüˆÐ?§‡"%Öq¥3`º‘ä˜wΠHÏöÜÓ(äž:t×ë©Bî¤äƒ"}‹ÛI€Z܃§>#㤜۹—üºsG€kŸ¹Rà²Ê6<‚Âoç96‘þªª¿-)²‚b)¥l*ººòŒîçùÂ~Ä0JPkD5 VN¢` üÕþ>wXc&µÝf_ +:¦%Ús‰ìÈÀ’.e|F`à1åÄ«»þ‹Òѯ¢.ä.ÖyÐh¥ª?TÕe"`™fªUà´º< EÆÔŒy9¿¶H2ÿ˜k„e)7eUö8K 5rÅCYź#¨atúHås¡Miù=ª”x4t´(Ô¼b½wÅ„TfIQW”šmË3¾HoÇÜ#óÑÝY×ÔTB¾Ø2ÚiM?¦á"`£– û–RꈮÿmWø*R$öW#WÎÅ äa$¨h €lYÄ[N§˜Äz +í[ö_lµ’^+6›0õÉÛNåüª‡KÛƒúZS¡ö,@A®0 ®ŠÀË=jX Ñ¾nø­—Ýzמz‹x@MÁr°µaè½G¡|È¡žlD.s8<'´‹} ÊyŸƒ,øTd×î´êœ‹ ¬¾-Ã9 "Š1"3-ôÅf Z îÊV}®pAÚܲƧr`Àç®vN*kNý)àÞ•)Ckjõñ € Œø7‘wNœŸŒü–•ÿ¯<ÙñƒÒô/‰öþÃ߬8üÅ¿ùñßþë?±òãßþû?þñþø‹÷—ÿå¯ÿô§¿ýÇ¿ÿÝ_þ¯ßý§¿þ»¿ÿÝÏü‡ÿó»?þßý‡¿ù»?ýÇüãÿþ‡\ôûOüûû×úÛ¿ùݺį¾Üýú¿!ðŸùm:š“ÜZ‘Á4[-,аô‘Æs?Sñ•z ü¯È®¨bß? Ù¢d֧̒µóCøü›UÙ0«à¯8ýõ­b + +ᣨo)zïÀi[ÊÙâ1Õ ¸¬²ÕYÝø¿E©2ÂwE€ü5" ¼ààaa[PÏ2͈±ÓVæybÅ{t#¤ +¡©êXb²xï¹XºgaÌkJ 8,ÒÐ'9ws(˜’á+$±ÍÅø0˜AoĈ~±²²Ö–‰•æfjå´bÖ9p,³!sïóGý•?©¿]Õ_‹p¦æcëC·b"Nçchü×.eÍ]ÊUMDRL.0zTƒLtº ÈZ)†ÖÕtªD­t]Ë¿ûS‹), •Ò•"FVVäTÁk7ñtüÕÀ€’I¯ÞFkm¬d#Šð¯§:Ϋ>xd-  #¹¦ŠÎÂÖ"®êm+ÙOñ»ŽÖ ¹’úk3"åÔ¸1Ne©Ãé¼czDMˆEA¼sß¡{#G¢ÇDá⨠+q®é>&‡5J~üž90´{A\uæ£!jPÓÛh0£˜‹,|Šî–F•Ê•æ4,èØ çä!vDTM;÷7°¥€dåìþž‰ÍgqЀs(zô pRdõÔBÎrÚ× +Ê›%¥V$ ôAÏöü³kýûjE_ŸÁ³‹þÿà~KðÔ·D¬o"°ëÑØÚÒÑØçÿˆê)¬Ó{\ãNQ,†nd•HvpÄPC¯zÑ7ô˜|?àØ%ƒ“ÿøÔìaýê™5Ï!/„{)=–;¾‡¢}‹Ôv>Ö®¤RN{ôDEjûömÎÇiL jW¤¶jôò+´ Á4?#"æäT$RŽ×•¶K”ÂÇ–ÛDŠNƒ²RZ½w3ý#àžPoÖvõOÑï\f«Cp§GîHkyØnVÈ‚ÆaÍ&ܽ*.˜ÁçwÃM#xm^ŸGòEZy‚¢Žh)§UO Bà¤;gZ \±™4l«›tOþË[€×™#îzgðÞ¿ŸÅ´~Mqƒº8s4Pz6ý¤ñïß â( +h%ŠK¬ ¡QÚƒäùæüŽÈ7’L"ŒŽöDtÕö%iô3×Ëähèö"u‡º³F4„€AT÷\óÜÅÖ柼 !¨pò.Hw ` q¨ýPZSœw¶Bëëî{„,m4ÕSÙ¯î±Õ¢º¹ˆQ¶2ª÷îÇ…­|êþHù»,²kœˆh‹ÝÛÌfE¬IñÚW¢0Câé%ËTM–3d ½`Þµ[{–uȪx‡x9^š—÷ló3ÂI´ÄÚšÜé<¿;uuQá]Ê¡LºË^kÉWòIºr˜òèNúûyê‘Æ'iÏ8Âh;‰_ž¦iR'Ø5¤Np8;{óÈ 4·óNL(D†bE½žÎ@¡Ð0°«VZ +³CŒm+”û˜ù B®3ï\º—%Bg-ú¢â6÷`ËË9U2š¾u°A½HÀœ‹p-¶ w–‡C Ö¤gæͶçÍ#çG“Ü }¥;lon 6Oß‹EnÏãCòMªD) ¢]¡m pÛÝKÀì§ðAuݽл§ÔpØðµ„ÂÊÏ”ž¼¦Xµ“JéåjD•ŸBêŒßírNçmS¨3X¯·êÔð*_^s¨;PQRTgÎ+n ÐUÕ'¼m ƒÖ{»Þ‡“¶–¾ °ïÉë‰2Àf|c %&d\§ 6VÒ- ºyæÂø30pøá˜{‘³¢þ¼Ï/m¡õ]õ†v–a°-ãÐÓV‚$>ÊÙDyhŒrmgMŸÍHZê…Àx#ñT [‚Zž¶^GáhÄb¥jrÄ“Neúr¨ŸSk¿c Õ¸h §ú­ÿx¥]à•Àáê>†„}Ù½.5‚‡*TÙÝÙÝ€ö Æn'õí”Ã!\wT¿ÂþæªÕ^{Ù4 £ï4y«rQP¾Žà¢Šæø¸Ÿ'ºŠŽÌ0"¶ÍÁªµÛõæö×é©Ôóqi|Ê]½âh€€ÿ&[×m5b;žoàV‡SÐfúÍfµëYÔÜy”-ݵt“¥ +x¥ãIiï E±ßü"Jõÿr.ôìDà?†ÝèÈc¥d‡ïF²& Z# +—õ7ìcíB,ÀRWÖþ¹3“ÖÈ_+óqiz(½}o¢p6ÙuE´qæØ&¨°ôF¾¸(!­½™º®Þ‰pÝ>hÂCœ¹³+!â*ÉÔ¬€é[ü¾•ó»³F™´ªw|¨Í7¸q“$¢Ÿê#j_Pôþ@[tçFQÊx¸Ýì=¼j€”"ß(,ÕÜsšÞ98ëv’_Þ©Vâð~AV¸º=s¶Èx׎º¶ù\àÜÌ´<{2µ’$é{ª_Q‹SàG†`+‰µiÝÐÎc¤<©•¢gÚ‚½ª•D…¨®Qi.â-Ïng†yb7«ºÖ¶­ÌK–]Àœ]ÚáR´…=¾.³kåñ +`â'Üø”fŹ>B=ùÐâÒc¾ÆTDàÚŸyŸÌè©løæ’šQÄ"ÝÁôxóôìí¿‰]çëIüú rO˜'´ ©ÛZzCï_„M€2ùÒ­†’d‰û€Š*úø-ÂëôK¶áM:Zûæ<öƒ/`Nfp"Ý)ÃV>’Œ$È­Qí;hÑým/ºLÝ(•è|n…F9¤F¯*ĪCžö4bó!¸ú‡f§ç +]Þ#Òhe§_T«Õ_áó<èÄøô×k1fœrÖ=b»ÝôBýŒx›?Ãë×QŠ-é" ÂꎳfÕøÒQuÊ.¤oëcˆ-i`ü: ›ë;6ë]T“ñã, ÿ»ty´°ÚFÔ¨šÜl·|ÐÖ­}H%Ú×y¹å µf>ê.[ñ¼çôÚ¯…‡j‡¤ØEkŸÏh;­¦Ps9Ë7ç1µ€²w"¨Æ‚g—c-9§œàÔä­ªÏVþú‡Wc+©Å,$”QK…KB7Ì/Dð~ÛK@L¾‘$fS¾ìZ²àTÁnkîƒÜÂDM3ö¹ÝÏ¢«Ö•( % ¹êáyP~`C„qw""Ðx(aBÊִ쟔ĩEà)W*:°Ý[ùNό➘â!¥^ &£eMŒG\UÍ-s6=§yÛõ¢z ÈCÚ8ðw-&tæómo‹g+éÈÔwõ¦)eu¥¢X½!h”ÔψçÕLyéà:¾9#mïB¦Á6Î7f_U¥‚á°ñÔ9ߣŽí„\z±|×öðRtVqD1ÄË•<>³ÇúCÊ\o¹eW„Uà3‘xžG§jÕÆiŒõŽŽñS5=?·¹úƒY>žÔ¢ÊXº·–jêÂt«xôäS,Ò e‚6 º^eŸ#íZZ÷ëJ²n­<’‚ÀlNAÅÒø:Žá( Æ ×ãV;êBGÌæáT{Ê +Ò>…¿Ì#ùÀÄØ©ñLÖfv}üÐ(ò›VM1i™`Bî¢Gø²«Þù‘l£HE%¡4øÍyðÖLê}¡ôjZw7¸J¤ t_kí•Â¾EõhP<¸Ï¤Â”V¨m¹“1Åã—@ç—Lëµ­³sÞ£HÅïMÖvâ&š(qù³ËóŒXÄãØ-a‘xµß)ªÝdÆCÝÖö:¯‹Ÿ¢üˆ®••· +¿.ŸæõõÂÓ¯7SÚJíGáOçQ ¾NÅ–ñ’€#?· Ø•‡NÅnEá÷:¥ÖGtËÐmÓ\`%ÚÃSŒ÷ðh&ÖÊp;WúŒ*±¹4œÙ€Ñ %Y~A#ÙèØl¥ˆýÂsà5lÏ1à_|ÊÖ{‡µS Ì×r;=Õ§# ~Û •BSªàǧº&3¤Ì$ÏC¿]¤XkÁWIYexê8½;·H†4•ÞöLåEžÍŽè;âÞÖÀçˆ`Ãù\Iá”9û8×4÷Ú?µ;çñI®ˆÚ·‹Îfî¶iyˆ"½gm`F"ôpì[£2WâòÌ=þû4*Dâ²&­H‹Â§DÜ-BýøÉð÷Æ$V®¸‰ÛŽ&ûÌ;ûL+þª‡K¤Q5JŽwʧSÁhH†â…UsÜl°uåƒÄUÎs]ðè¿(݇ûu¥Ì·6xÝ,Júkjê 8µ2ӧЧ ˜:WÐk“2Ⱥ¿×#Ë*'Ž +œ¸s$JmÕunÎ6Çç0pìîS%|/ …õÒa ªlÑî$îéuÙQ´-ò0³ì 1;,q88Aʯ!qUïàŒÒûš[AÈtÅ xœÜcVņŒmÙO¦E‡pÍJ|uf¦,Š’-MȬÈÇ Ïk9 ƒ:õŸW(  îMöüŒÂÉÎÊš¨À©0‚èdL*Qu¦ËÏýºY’®BÈpÿ…MX9„o£’ºÇðLߣU Œ•¹½}}Öb2`‰·5YPãÌÈ‚@SW)~`­i¦¿Y%ä'áå-”ù c¢Í¶v•t18®BG+TEÏDŒt]‡ü ETc‹áT®# +uýŒºéòD!UATÌ*ý6Û{67¤´ví–,ÍU>Á8äTÖß#ԲΠÓ6§=6yHèJ4A:ÒWÝG„n nÜ×PIc¤õ¹Æ +VˆâÈ;êšäÍIŸß +ó¾vDóÜ‘êÀÄ\/ßš(IYe£K›]#äÄ, ]- l!@ÉùhÇVú“ûµ¼bRsWMX£J–¡3Úz¸w.‰ éu‡såW£æ…+S©‚#îß›¼žç ˜'®_-5ÿŽÆŒhá÷×Þµªê1q`ÐÕ¶¹ ˆJsfw¼zþ‚%ÏóÁ±R ]‘Àk¨d¨¸Á +9¼HA~ c¾dqeY~§¸??7‰f½|×CTzŽÁY{oÒ/Z"<º.eþv}K+¤ô: FR)_kÎ~‘ß"òÌNU×nr]Äq?Ï㣪)7‹úJíÁ(ë7¿ @ž Å§þÑøŒÂ šŠ‹+xÒûÆ°Ùò¨MGûJƒÏ<ÍÌ …2üüºëW Þ¤c} §&>!êP"£îÐpM厫ç[³ò°náE_Í×eÌbVí§|W°•ìú >ØT$“;"ÆW.çPßb YƒˆñðD‰²`G]ÊGŽ^“Ux/w,Á²éÒìs§O“¢ï&ÔÚ‚ºÞ¾GäѼ§mç™#ûxøUh¥­¯‚²Ìü pô òz}ß‚Øš°ByûÛÎýmùÃq쎡ꠘpo©ÁÞí3â÷›axÍ߉† Õ ²âŒðD]N3]Z!ÐÍ·ŽÅ‡*p%ËócSqAMQ^4 뮂«Bw÷»µsÛÖÎÝöGŸQØÿŒ™Bž«ÄƒP”×@¿{™Ê–ùr>™ 1 „ýyÈ#L¤t£Èk”’û¨Cè^@«®“5PëŠ)†z–#Ðô¡¤Žm +ù¾®ä:‰µ¤Zmp³H"«óëíy b؃“ /ù!;'¯t+z†Q\”ci|qÌë7…a{#„qEVÌdž µ»™#5ü•™¡íFj[f#UyQ¯°3˺7uÿ¢Ï(ü™Ut:¹œlµi¡$¨òʬ•ÏÈתͦºÙ{Äïw²¤ysR¿9ÏÚÃýI óêJGìú"xáÞŽ•oÑ€Œ¡hWeÁÇ ÈÆøæEö±¿ÜÀø1˜ß^3 |ðv|í³ #K‡™oDôœ}Ö ãW—!ˆÂWÛ÷ºç^?ÖâDÁ\&J +?Q ™)"(Î!§S)FtÇ;W2§¹aë]F˜²j¾ú<W»¹W;ÞŠ¾Ë…¥)bèyÐÿ)w«Ë)Yôy³žjÄt\RéœAš´n9GßèhîM®¤7ðq©oŠæ,™,Ð9S[ Þƒ¦—ß´ñb‘ò= ^û®@ÍÙúUAêòm¡§ Úk½x囈÷E9…ê÷(„%å2PÊͤÐÍþlœá¸ƒ[·§ß©šdŸ ÓE‰:þE•O×ò,¨wÄ« 9õ + •nd©ÀqAnÂÊ‚s8c²&„SÝC•qܘÝõ€DL › +v¨ºA7=iÿ¯ ÝCÅo¨ñS-.eUÖ’%õ¿ïvì\H’,z£hÝâT‹\5Xäªv™lBþÍ`>1ñúü{º43UŒƒÝãwQh ج½1‚kQ‹;:/¸ÿ}D€n¡BᑃøêÑ›S&\IºËØ"È7“/x`,"ôz‹ön½.÷¡}eÖž§Œ lÖ{€ùÔ$„í9&!½¶(¨D„rbÃzÿøm”߃”îÿIz—…þKºyÛ^¤…pit#bŽó܉@ïv” ¢bö¸ò6÷$ðâM/¬Ÿa”‹·Rt”T¨9‡ePJ{OS†éÅ´”^r‹¿ÙÆú_h²’z·¦‡Ô'miX¹56 Í·¢on9yÏ•‡âı1“FmÍZ糕´øõ>‚Œ÷!Í$7©<6©Š˜¯v?Œó9Ôøßv¥nc¯  ¢ITðLT¨ƒ³hSÔ‡^±D(ÈÃW9ã¾8h ¯¿£N“ À€à½›£¤@ì0°l2Ùyšý¬“l±õö`š +Ê()ƒ‰§Ýü§õÐâ]3¦Ûë×ÍüÀ¬YYÕ„Uãu2ðVŠ¡ÕÍk;„AŽôÃÆvá3\(TWb&­€ƒ.“>[%0BÇê2‚B1m'!O¢‡CK®ƒúžíŸçU ".·ÁÈ-FI4­o¹Û&"zðmW0ò‡ìžÁŽ™sˆé»Â‰ØõºÐQÃí7&ÓøQê†2[!:¨°3pZ~âàþxàæ +‡9F`t!LÒw{0ÙHö_·Ô C«E¦þzÒô&¤1Ny™Wfà' +ѲA‡LjšûL^׶T“×µ ì•ºmïž5s jôÈhWözB¶ãJ<4®D¾’5\]0…*Žº¬-Šê#`kð€­gÿ™[ˆ=ž:ÓõÁB×] ¦ \9ðfós†ó€ü®ÂïcÙÔØï–=Ýž§ÀgSÄáåÖ „> +.¶°<‰ŠÈUy3yûÿÉÓ´°Ÿï#ø­ðú9&@^Uœ×07çËh„_\7]~ÚEsîÌ•ü­ëÝ‹¿\3‘5‡ÊUöû0ãsæ<Á• ¸2‚űl tÆ'‚G ‹Ÿ¦Þ:€<Á¾@O3“Ћ[­ÐW‡æ!/nЬ£Tscÿkk¼©|¨u¾ÖýLIoê×þV…¸¢ïz÷µ@òµZkCðˆ¡€°^³XQÔÐM×µmZ2¯>YQyùÞ˜÷ôä=:oÔkW¡h¦îÌÈ¥ÔÜÉ­ï/¬Â&ÿÊŽä_ÎÒž¼ï[u'ä;׺û«î´YíBR…ò®}ÍMœ§ +6ãÚ™á(úü‚n}WXäõŸ›T´žÊš*îµÐ󀨅kÚ7QŒ¡ð~ÑúÆvÒ ÀÏAj`z˜ŸM +LÝCD˜†¢<)L¿ qÀ@>6p^*G0´ž+eù &Òxw-'Ï}¥׆™ïúk—;š+]Î* +>Œ»?xÆ4Ûìç +¦:Ts=\¥ˆ"ª5ŠZ£ºIó8Lþ[rüz©¢Ç+…¥¯dü8÷ÔÑ[zäëÞÚUwx!ÒÅDsŸ#È˹:¿ŠŠy9â=>·ðÀZ/vnäæsóÿ ªÁfáå'©¾¡') Bý›<«©<~‘L +Dà·‡ †•ÓJL¡P®%&_Ck]6«‚ìÔ¼ý¢z¸ÈʲeÀ·Ý6å+žWÛSµÌ•eÏ.×Ñb@WExÈ–X†k‰ÄrS¹ ¥`Qx=,_µ„újûñÛïÇÏÆwRÑíf£^Ü‚Ã_P›ÒÑvÔ)•¸ºä¿u½xg`)z}8!|æ< WÄTH“0¸Br³ØM²P ¿¯”ÒQáѪ@?—(rƒœ‡Cw,„àÒª–{ Vö«»åíËÉÇ0ñh£%11PKÌÛ„>Õ‰+w°Ût’™y5l£`ÿ­#&*¢§‚ð gÿÜœýGÉklÀÖ°ê>&¢Q9ä•­k¬E{ Ã+YÑ7m,Šùê‘|õ:#ßGT±VÔé· Š’üoAƒ.(¼Ä’Âu^D‹,4ì%ƒsˆ²Mrñæ¸ëׅزuq›ù: +|bÓG.TÇ[ªÄ[ª–ü“‰Žú!ÛlÁFT4Ö“¸Êƒ–)D÷0`Î B[{ÀØX´o)Ú“…‚†£s‰¾m\¶M+忸DõÇ1¸G*›}MwÃWЪûšØŽscô,3kÖÙó²³- á}otÈx„ýy„jlï~QËíY©íJ†…Êma<™óm¯Dïwó(–QÖS&“ ‰^hÖ€Ps˜Õs˜÷s%rop÷‡bz`GJ wq{»Ï:·¥V™±ÔšAXC`ÌÊÌï½oeC•n<:tEžà ¤‰Ù$¡$V"vo9´é¾#lÁcÒcw’Ÿ”º‡œnÔêê}}µ?ï[wùD©RyišÝAűïݵ5•Ù1ä8^SÔš§]äƒ<£, +«²Ú—l„™ÓØ !ârï´¿¾h‰¹á\µïŸE@¥³=sÔúñ*„2 PD]S'u!=Alw!¸66‰G¨=E¾=Å“•±_Á€¡6ÀÌPH›8þõ^5TnFu»ÓíX7©ê½ÑT”7iñðFœŸôóJú[¿7¦u´ƒ€X<ÛF¨z/x+Sa¥A'Â#¦@sL_W²:¼1Ø“ÞF`øܘöpÏG|»f°¹()ˆ¼êÔÚÑLš43+–„våíŸi6÷Ô…èš¼Ô[¿%]öè˜m©#fÙÛžxä;æGùš¤y6Z$—\××RaÐ.ÐWÄÍcëSûÞØMµ&ùaocÅ›}°ÐZFÀÚÑZmµ;Eƒ©$ƒt…‰*è¡Ö”Ažý ãDf+ñ(åb«wî}äzÛOy‰”ˆªÐ<êU©{Žò˜J.È(Ðß…&>^Æ^3¢VÌ ên>jWB^×ö·ÎøK¥œ§êÂ#ðß©§£%úÿØÒV%*žuk X®e°½ô„aÀð1ªÙš°k©õx^<ª‹ñƒZ}pÉäÈ-À&µ÷W^±–Ï¡èˆÕ3 Ñ‹1I~ð/g4Î= b¦¸]rM‰`Ð%|`8šü †"ÏëÛQ‡}GœÅM÷Sm +Ét”±‹nˆøÈ~R5ë[La*š(÷¨Î×9©£$*äƒó”-¢†‰ä'z) +‰”M§¦wF7D.Úã +ª—]Ú@¤¬>2!XêŠw®W‚I„(¿ðŠbò3â¶ãXËô<Ç–'?!lýtÛ Û¹Å0."úñÌ*¥é7‹f¹î4 +fz7Ih,Á§aƒE½bY!:ž´8Щ ?¶áÕ…KæÍhÇRí„͇ ö 1o7 þ¡¢Èr«`~ÙÆFæÕÁZ)ªò0‹×ùÀŒ¼šËöçd´ ƒÔgŒƒM‘Tž`wD`Qä~¶mH–¸jÊOt!ûë:¶ù;‚sG •ðkŸFDL/Û%éØ„¾®­#…Þ•E²"•3¸5,ËëB¿þ€œ1©d¬å²j¿Ù‰ŸÒ9µ H¤Ñ.Ó ­çà}Yûyò$„^PÈy„C£©Ã +ZS§Ý´ixŒ+IÊo” ¨1*äN‡IH<QB/_< ´Ñ#yäØ¡ï$éÕ'î®Êb¬s—•{o&éº*X…õ4Ðútæòõ-­¦²q _„å?íÑ膴Íê@ù»g=GðÈmKâe Á•ðz}ŠáC ßZûûV­µ}lïì¼ÐEbO¼2[•¢Ä£SþdG´†«ZakE¯ÛA/ÿ +½\9HR±¾M)æƱoûúË-ÄÊì[ADIrx”Áê.L L3€È‘é6Ù¡ŒíZWõŠÃGÀ1€qÜòuÑ;ÒÛD3¸e…ÛcO¿ýB$Y5©µN}/û¥àäL³ø(°(0KµiÌKîh˜¡ ˜!¡ŸtVP!¸^çÏZIáþÊ涨•ŒP`ËÚ½¹!ÌR¨6JAúg‚g¢¨ž)¥ûá ]÷ƒ-†;"!b*@úÄý¸Ýº¬äH19öŠ3¡í±#LÕÑé,)Jm.šyÏ…bûmÔÖ6Ëò£÷äÜʧ™ã¬‰èïs¿ÈØ䔹­Ÿp~@êÅ›¹Òh”™wE鎃n 3Æ_—·uÙíùèœÔï-ÆÄ6C`rãDB]7äÑ=ZÏå¼ ‰ä;Œ¶¦°ø¬NdW QÚ=3¨a¢ó@[”¬B’RGín·oÉ*«ÚZÌHs¢\³l«ÌŒ}²çP +¼ÂÚÁBme¦ÕÝu¦Ë/ÀÊÜúçÖFʃk;ÅŒ{Sô2ÚQ‘Û˜/ë‡+iÆú’;¦ÌǺcgˆÿÛ°¿õö â+[ÊõÚ—ÈxÝ[æ X«Î¹õ;ašv]#FD{µõ…¯¤_ßkžõkßëô±n™Eåv:£qÞâ*5’xÿ™Ë7u .wëá[¬¹·k¿¬É\Dñ)ÐØkÑ:VÙJ¼†[g:dóŒ]ç窥DÑ*ŠÚ¡ýjT:5ï²ÃLz»/wD©äU?­ÌÕOÁð)7±Æ舺ï ÊYJè’{lG²©íBçÕUÜÑc èY²íÌç·‘«h–\FDºbYMDd&Öô3ÆõºÒjõ;«|sç©Á°Ï'À¦£ËÞöO«û§ÕX/W×ð›ÛBF_òÙ×v}%ߊf7ˆ¼è™…Bm÷#€~V ˆÚ÷†ì@×8)p”+¤‰Ž¾Ïùèc÷T˜Ù½8k¬GÇ¡:Y,õ/A·ŸfŒñ–Zûhv+¬t¡l ÌhÚ‰ý_#®½´$ÝQU>šÙ1UÜ +×›pHÜ$¡#Gî°UîœGüÞþxrÕº.Yg’KSëwÎs«Æ^LYÖ·Ê þÛ¥Øç_%Òs+"ÎihÐ*¼9vÎuAŽˆ\ò”†æëB6£Éd‹‰ýØ}°¤Ã³(xÝq„ºs¨; uµwyéÚ¯HÐÓ>G?âú×…tíº6[ú2ÜK»j¼ßÇÓ!…˜AÓSÃ-QT´ƒ¢:›lR˜”y¯5'ïUD½²ßzí4ÓxðQÈh#Ì…høP›MLÄžŽ;¥ÍÇ®‡r 3 +‚À|¤wUaöÖ4#(ÙàଶM"{£ü|oáûW2æ¤ZeW¶i‚€Ø@©²I£ UØìòMUûgÂ`¿éb×â~ê«Ø" ”mã½Õ€jâ·“6aRêºSêvm^é^i{Øëûdn¡Æ½˜ž'eHzçF~nÄ&­™`ìÜ)Áç3ôÍ-Y?X_þhí‹t9w®é:xmì|u™*aoÑpâÅw@%CzÕ¤¨ÞŒ>vlöm-%'HÕ½«®s^©Í©¿ƒ‡ò™â™{Z€ýaïÔŒ·õ;¯óH5Ò~åO JBÈ*µŠÃ Åb~¸|âŒ/à[¹bˆêwXÁðcvt+Y¡³;š’>Áƒœ!}Bb®ëûµÚ. ,Û¶Qe/èa Kù­â«n‘›îØðgÇ@Ì/üm ߊšz¢Î-/mÄ|"(6£ÆsÕ! …ºßµ#(OqÜ_W"÷bªÁH“¨K×úCÿ©”oÁ±ýÜ&JsWÛú»¾H‘Š>•/ËŠüº…z +CÃÞ? ×+ç/Žªž[§[Ù'›ÛB<×uØ]GôÝ)¾Ëf6º|ØÙ܃éÜž*¸TÛÛ¡F[üÒªãÞ¸vè| ¨Ä䋆­ª5AmDLVH5‚· ;à'÷!Júí‰Rx1*¼ ^D¶v÷æý³±ìt&HüÈ.p"Ó +`Ý$`<¯3žjG¬^-ùT \ +œd‹*{mQgüfè“w¾5i“fÁÏìt—™×^¸ÉÌXÓèÕƒEVâ­Ñ[:éÜØÇØù õf}¹ ' :æ‡;…„¸1²#õ±Ê(!ÇfzhŠzòwA¯èž¢ùÊOó©!ýÕ”‹¡éa¯4Å.K›¯ø¢ÈŽË™+8á‚ >JÀÌW†0ÍcóþŒ#Å$ÿîÍ4±²^lJ×!Ó†GÃZQ©ÔœßÁA©÷2öÎÓÛÞ)ä2^AºÍÚƒN·ïxÄ­°#VþI¡í1ÍCÛ£mH@ßd=‹º@DŸó³¹v‚¡ÎÞ¶xà  ‹"­×”zƒÆÊèZìÁ–áŸiJòç5DÝuœ6 C>ØSB»’× ±…Ì®pò-m“«µ†Õt™ØøÎõû‘†L± eÞÂ.VyM﯌“(åe(«)^9·íäúíëáž'Z{C9»ø´Ù(¾ƒT[J¡¯º +  lHÀ‹éGï12ûÍÍ‹ðª°:‘z‡„gf­kEð +&e¨¢N.ô,Ð6a·am;fXÏŠ>Öx³þ7J2¼(i"÷©eAhZÎp¥Ž#ò³÷çeÊ4F'ïˆý²(½ +UîE€±bé-Þø&¯²‘&À˜)ªGñŠú\êWˆ +¤út=\Ó­xwOE_£I¯úçÐéÐå¸!jµ‚N!)ú#é²V­Íô>­Ëh‡¶oÊØ´f˜¯Ñ;‡¢-,ÓK¦Å…!ÕÓÇS.•ûˆÃP+ˆÅöæ,è+š³óÑãdWä¼4G”â‹ õN—íÈD +, +ߪRÖA fPøfÚ ù‰ýpîÇë€:SÞ•›4;Ž±0yPí$aGº1š‡WKDŸgA×0"üêg•à`„„‘Ɏ̧O¶©p¡KhM­‚¾$¸F‡ýû³‹˜àù\å~]& Û•«mŽ÷¹9Þ-yõŸaÖ­ü+$IFäÞB‚•¶ßûB=:;•¡<ÓTn‹æ¿íÌcï©«Þ“·ƒ0©•D/“|*«g˜Ë%Üf§Æ}¡­¨[[äER€)ÀÎcß™¡ÞYO¨û9Ïp±ˆ‰Ü _¥š€ÍpõÐÛk°3ÈÀ®‹Ì”ï´ê<,+¤*œ›2~€Ý¨:rYp€ÁtVMΟõϤ—µØtRظìwð¬ÚÂN@2›,K +VžŠt`7;áæUN&T9™ ½žL*F¨[h)ZhCw†­æóJ°_³$îPþ¶ü…[T£y¦Øª„M?”+üZÓ™7p§›K…ür~¾ÖxéH G»pE݉7Dòéá"kËC*˜âQ"›-–à,ó_Km‰³àl{br·5ùQɈQ-çuºâ@è>YëŸÓ…f±~~ 4ZÒôvõØDfÕMÑãÊ…§ú¢'%û™[¬Hîów½{Ùfýçnf‰ÞàüãÐÔ‰ÐSRúÚɹ«nƒ7»…LÁ{cŸ†‰`<ÛÌ•>¿G:ûI6á÷R“¥LDM–yVõn|Hz}Ž™¯†$÷&MÐâºS\t_ÜÖæ§í·‚ܤ ²ÛtA¥I³Õ_;ò ¢H¤Ž8‹‡RD—D¨#‹0ÍÅ^úä=лùÒ ›þÈ”Ù&ºÒ&ÀsÞ©ƒ Μǭ$ÝvPË€¨Á!À G`lR²ùùe·a4Ì!ªú<¤Ø€ª9£'å'NY kª8u¯d¹—ð?pó'°Å9»›K¡I¡É}½Ñ_l >POûéGêÞ<¸D6=ª“¼R h4•‘¶¨Ñ+—Þx4{ sHÁùúTÅ©­²°MÔØ™¨qó›À¾ý³tDȬ•Í´æJwèC.6]¼C&í=ä +Þ`ÍiS•n&4ª&meDÑ“)l­fÔUóz¢AòEZp(*º½¸z²Ü¶~>r®›sPŽ½%;· +jH óåÚªÁú^>l!ô€¥šb¾› ;sH |Ózy]IÔçºR,9ïT×VnRLlcû^Ð$ΪÆñ "H‘v`ÖÞã-4•­ß?Ì0Èîø)çÆ– #¥ðØ‚š8©ˆ…oNe2ò)ñÁÈgþŽ8¼+œíySoùÒ%ÂÞG^¼(Gu/¤éöÄW¶GàúŠÇ(±Vµ!פ݂þÌ.—,‘+䤩ŒþVWÉ–mÅ¢Œò½ô”ôT¹è‡mÈÌÂJ(x³LfTšbÁг”ØChì{éSl“`¿è¾çàD¸#¤çÓë:Žˆh´-þ§[QÅó87,‚HPßÿ}ïa¥V$ïm|Ý›¡-^üéD¬IdbhøÑ3[üÔÝ÷|dܼ½ƒ™q©øA—¦S©â§c˜4Poéܳ©]d…‘´Âaäw­â¢Ç q*þÜB¨ëû ߥ'7NC#Ž¨T™Øn+NÖ÷jo±þK,Eîq£’åÞ ÷~ͶɣÁ¾µ\לl¹h]ã<4û\‰Q…êî„âHþ–ó”ôÂ`jùõ›¼?'Þïÿýg­îÿ•'ú ùü·øßïìÜ¥í­FÞ9HØHmA\¬É~m]·›!¼=ç%j†Ÿß¢då9)_q+#‘˜›9=ÃEÔÙ§}önÚ]•Àï1‹È@'å| +$ôž™Á”H…¯sÓ±-B‘ìו¤já%†±¢šåN‡æ2ªFÚÌtzž&’šfÿQ•rFìw¤&ymWÎqäif¡þº’ <úܲšL`{“/ tXó@X€d Îc¨!-&¼5I"´¹)1@ÍÆn{4hT7î!Þ*´Mƒð‚nwÓ[üíáànº»`–07çõ¨ißÙ3Šâð ôP8ÐãŠ=’úHÔñ톽[L¡ÑS—rBfCvsŸs%*¿ "{%˜ Õe‚ªpyF([" +¯ ’N +<áÛé,vëŸ+,T^zõw’ƒ˜†é'œnÍs@[“™ ’W"Æ!ú 9wýS˜ãÎ×ùQÍ ÊÝÁ1÷÷_£\Ê9¨ñÞi]ÄEÁ;©ô|1’sëmL쟵—Ö<ÓµA-EëÔÖÙ7“4ÝQZXÀŠª¤gí’ƒ»ÒZ»È<Ý.!^Ÿ& %¹9ý÷ ÞOc½Îð*3&ùà è'Ÿð¬Á‘`½º‘KAÔöÄÿ¯D¬£jÔEÓã¶ïiæuÕÌÙ ˆþ:oÉR2æçSºÞ*C:èá0ÌÖcBa’OÚ#ºc¡+°gWú<†’ Xq´ 4| +€†GUóéA!ülÞˆkð§ìÍÌw€=ðð€Bðõý©èñš‹ÎÒÈ· /¢9¾~Çm£œvƒ‰¨ò“ð#.ÚÚGk<É… 5p¡§c× ”goôÅïsã«A…œ…8OªŽX:W³Eîmëßà\ΑT¥7ö훨º¥à™ Ö~¥ ‡#y7 >GªÓÀ?á` ܶõ˜Úœˆ¶#6Ó¥W‡>ŽuxW”F×Wß@åØSC+¬ù3âÛ¡úUÁ¿j³v4È@ íUåÈ  T»öÁ—€¢Ó”¶øy¿߃u«IB3w®é½ð¢5w|êÍ-ýok½Þ×¹F!@yû[êjKDœÚ8iQW¬üTÿž¤ÁXß>5Çó&izT<ïY©]A¿>‹—§£DÄÆ@Î e¾X[`"Ĺp ré¤êmõi×a¡[ׯÖ7Nþœé+ÃxäežZõ°¨ëK" 2FS@¹7‘Yô‘rT(øÝZ§š–'…}¦®D1…ª”Û68$Ô¢•¸ÔGfEov¹üô]7„„­¨jç&ËbXåå9©(^û#œð/f`ÿbÞ¹Y0ÿ:î¼økîôJümƒ´bYÃ6¡fi}ÓEÙkd§rÞ“¢a€írV(~ÉÎå-m öÌ×ì#(.ऒ¬š·æa$‡W²˜)¹Ä¡EûË£Ès9 ä&Eq=\ÌßÑ…Vã²oæµú&BÛ¡÷³^=àš%eÛ¨#WÙ !µm£,Ì•šwJ¸NÏDè@Tñ¬zàMw¤Øä)á2BúB;yhïp‘ ^nGé1 +¨ A˜é×Xƒ“›ÜÁ3ZS§‰ û2X˜žZúÚËYŒ»žh8¾\#ב£á"'‚ðÚnŠ†x*Å—ì+¥ðÎø¡n‡$ZQ/…[o²GjM/4†MQx½ê®óLíÎêcfv©+´YLC4‡úSµ.¸¤jE7Y-w¢æ–ʦ&ˆnwÝh¬æ8Iˆ¬a¬rÙpºº¡ÜÈòæoïÐ5&B2Ò̦Ýúéôu¸Ôè7ºý?~û…ùùÏø’J0QÊßpNt"߲ׄ'ƒ(xKó\ß±mì)1A=òÕÔ¼.y*°>6©ƒ$~Ü­Òé,|GTucJ=ð…ñ)æõá-¥t‰e:=±( 6öëR¼¢6¸ÝÚº?zì8¯‡V@;à¯Æ)w »yL੃i>Y‘ñ¡Sw_Èz/-ªÚC]]Ó…ŒµˆTšêCô×ÇiRœyÆÎo B•ž!%ËÈf¬M5š .n3´Æ¤ä¥vYSK8è7Ô¨‘Årë¢|·2ç‰ckÓáؾ̕"ÌÃKO•—Þ8"Ê«¨[wÅMáöÈã¨6Ó|lƒ¸ÃZ‰²Ãž§+ÂCŸ6Æf8uÚ(¹Z6í¢xƹ_nW#³Ý˜„4#²BB‡|MmGµ­Ð@¢ïÖ~“ +•[­zNeckZ@1Àª^kª…W»{e×ægQ›³…p:Â6‡šðáïJ¸*¬Wßo¨ËÓØùˆÚt=ŠnBÉpòSCNzZ“Rr|$jûJwôàpÈÀ©lñscᨪƒŒ}¼¨ë.âÏeÖ“Ýa|Â4K¯k7×­Û5×(ßCëÓø#bO«ëÐ3¼GA£Ô¨äÞËä:Ÿmø…@-/튵|þ=y;^îÏY¿ù4ÐKW‚g/û†öÀ>»¥œ 0÷¥õ÷Åž:À&½H•£ñQÖtPɑnjī$žò(!ÔGpžãe\C>C:жŒ<ë-ï æ‚) +d†‚Ý£–ÔÌX~"i-‘¾Üì"ö•Øž¡ª_Ø\nøo0V˜í`Ãbvnè›ÿ\¾³×šQ#àz+Çk_ÌV +÷¬D{êQáÆv:§ª©`òmÉŽ‚Žàííä%¢ÕYÔf‘þ8•Y–À[¥[sšmÝ ‹ ´˜áVRá×¼)Va€m ÷•ÓËÝ`ŒçôãŠ.{áVÓ¸½c53ì(ÍÝ6[{I—?PtƒX{ë|ë“~èÏ·F»1Rb]ˆ‚d5ö A*¯5Þƒ@jœyÅþF2ôçܱÃQÌge#Õ6a;Ì+§ÅMç¤{Y,–©Ûx¤ZÐu¾¶m‹­³ B,vŸáÄÌþªãÚ¤}#O ¿«íÔ [àË<–ýpTF›+„ìm-lUzEœ…¹’ +s%Ñ»õ”Ж1J-zö„Wèý6géä)LM'ºg‘Uÿ#½¾²)ÐWzÕv+Š~gíëJ;‰ªûûdÚ¢ã}o*5>éH¤•º/Ñow{tË2âïé寴w<ç¯?}:’" mq| [ùðX'X¼f:›®g¼²ŸHY% ôSš;jÖÍ&¢ºxˆ]†1Eý¥³7•Ê œÙ¶®Ùƒ,qÍéü{z‰}«â`´y}}F>'aÜDóBsc·Y· +ÛyÆXKלº]sîù器ÅÙí™ +Ú*„Ød£¥×¬ž?Bjl$[xãRX„c¾øõ?¼?Nƒ%=•N똩ÿXË"÷…1ÙŽ8wÄýØ =sÅÛAÐ’¨Ñ_ñ*ÔuF±E.;XŒŽµ§EQ¹qE¨íž'âØO¹Fñ›¡‹Ç¨B×Á–^‰:Ç:/x~m8Áø|”‘.TUMs¼J¿ +ÒdÆäÜB;&ËÑÕD}/Ï$ø™6Û=»ˆgdM]tÖí›ßEÑÇ–—ÓHuä;³;ÃÞ‹Tþ81âïÛ}u”Zwä1M†'ßÿΆB»Š +ˆŽ2Î8ö{{„ ]ÉTü3õt>Ínpâÿ«Ûn›¶îÝŒŠc rŸÊ •p’WÄÚ®ÌD°%#B "WÇò9ô·õJA¡ŸH»~õõuvÙ<[•;|_tÂ1>Eÿ§ÙQû&"÷®‹„ƒ®–nçy$<áÓÖ>vÆ¥ýÄZºZT<GY/ÕЬªÄä£ ç=¾ì\Ü3µmFIªIâÖQ9jû@¥¿6ØCðÔ‘º * |ÆøcÄøãx-4GLê:BÀg(yB„Š²„99´7úÆFf+C.z瘖wA¹¹R\ÃNæÄGp±Gáá|ŸEomÍ)æaÍ`çx‡H£×¸ÓÂ(èPWõ¾DxQwÄU_‰Šp-@J@¬>¢ÔnHzÉ:UêV¬¬‰°šj|D”€RQxPøŸQ=îZS7éäbùgŠDxÆ"ÖË/Aœ_r»d¢r*¼º²³—ÊæȼÎA àªíȈeD˜üVÕíú³!°±å4XjˆxÄ1£0é£@yÉlsKì…—^žñä¯À«r%뺨1¦Þ¾ë>”kGXY‰Ayò Ù™ì8 ˜QÎèt^ÿ­ G)Ù!P–Ñm] Ï4*ËõMÄA"§5ŸÝÏG” # e—á+<Èëçw®<µ‹´ü΋ÇáË}dw­²8AVax‘Ïè©Û‰^Œ…Ç‘Mw|VÒøº}Loö%±ëç= kcøo\h0iA2¹Û›6É4_Ï@ÕïX³Ýù øýÓÅ;-íƒ,œßœæ¾v.ÄŽ‘í,5&¶³Ì’Ÿß®‘ïQ,(1K £b»ûÐK%pÔ 1iuÛ‰/ÐmR/ã5Æ@Ñü¼›i1 eÎRHç–:|¥†óp鑃Kß5#^?›ÖJ½Æú²²ÔvŒG£ÜSt¯[û…Ù=µ7Þ}˜¬Ï(ÍÀ-ë–ä/‰Dÿ´+IÎÞogÊ*(=ÜAл÷AÔKdô®o ¤4ÆÙ I-îM7Ù{%£ÚŽÚ?/|æÕô7<žª&®÷Ž˜;BËcÓšÆ>;‚\®±?}ªoda=ÔxJT :ËÙÐÎ<ì9ý¥Ý’ÔüÞ6ö¢h‰Ð\Ëñåß$„³ 9³Ý5ïÇz±x#NF°†Š +ë”gƒ±} ²8$bqä(××sþG÷›.å³)Òòo@©ÊÛcN‹<þ!çlW­×Ø©j矻¿yúì[÷Í*ŠÛ*¸i¤‹ýlŒKœ‰[ÍŠ‡BHňhE°ÙÙç ·ý4¹¡ Á®+3ùœ×™ù@SìŒ%RÃí)F¾‰P݉ĀV­çg0W”¸+Y”Õê©äž5nÇÕÏ6â YuÒ@ ôÖྠO[z¸É•-èÌ$ÃÛîóÊÒ:ÔµŽI'Ú$˜tÊO]ö +NÍçÿ´>n9éþ.b}zÇè®ÎW«æˆ›ƒQ +Òí4²©eSࢼÞh{D§+¸GÖíF¿©*î¸S()ÀBäwªˆï|Z¹+ ÕF¥$‘‚£3Ó¶ÿ5S¡Ò¤WjÑÜ.›i¢DVF™yÀ¦ë{gG+é$–3êÜF¡MLÖ R¼•9¯@FX”%‚U<Ó/{²¶å "#­ãíËÛ€ï€Ô 4s¾#ã‚ê÷•³o…o´¢«ºrª~oDTl€®ÏG ¿†”'òÑ"¼Fç!¬*mÛ_¼õ’&¬€ßf<ÍQd1ž‘}êü÷bb­(õU †™eΣ;P.Ša—A/£$ð#XØÃLÀØ)^–ÃŽSïn¾ +0’¡Ñs!+)ö¨J®4%­Þîxs%ŠÜ\‰M¬zlHZ¡Ç6öw±Â…ÍYs¥àl•¯*¯§#GfÝâS™f<¦À5õv5ÜÛ²æ™c{·Q +Ђˆp›¯nÝÔqc\½Ú·çÛj½ÞÄ~ܪ®tôZØêóÞ%Jò6e®ÇówÏ +úQ™“Cõ|}]"I:\›ó ì m7µîß#0T)Öá¸Oá=jœ©Gá=MúÍ8…Zܧ•f,[߃_˴ЃvÖ%ooxÜå5>eÈðíU¼ùø¸œQŸ3urd´ò‹WªRýâù‹!4çQhl½Ì., ææq² ¦ä®ÉÖFšr'A +¥¬yüâ6çOªˆ“¥ê’\Ž§Û&˜$ï+Å'ÝCªìÍýÑ}=©‹cð­ÓÍcqt9¢Ùmvnä&¥U[ñDT=g4¢YP$µœ;ÆëëºÊTæAÿç¦4+&smr•2B“ªk0DžºâŒŒ‹÷¹»ï\ïc@ú|Ý®¡Ù2ˆ?¦)ÄÜçÑ¿‰ð9Ž<ÇQ¥˜÷(Q÷LÒ{Ñ-רGf{r -žÇK>ãšìL fB^Ö¼xæ}ò'‘IƒªêwaÐJ%í ̧îaj¦…©gÔŸÆe­µD>ÔÜt–v´è+‚ªbI_(Ðj? ßãŠÅe빜(¶DÍhj‚F±Ò-£Èì’‰že½X6Ý|ð +v[¯#,Žã‘T[¿è!ñ•ø[¢±>§¢ÊðJ·¬f®yºx´‚v㊽(zC +Œ+?Ú-¥¬þuþk×oé!d‹ÑòñH­!`!4¯ |¦Šk_$$¬¹ì ­m\Pbë¯Ãö"êÃÕu(ÊÀ q^©dw3– ÿ>h!~qtÍóF¿”ÝDénh17¶ÅJ°墕 òºÁ4ëi˜RúgDV‘sk7E°à›ó íCÝmª¥ˆåÙ—ü8@Q’Œd ÷5n5„·¨ mý‡,ih½—8ÿAgvnƒutÖŠÉá=â5…Hã½pt;¿9„Vú¦ROKˆt‚ +Q‘šv r·Gõn¯g¶/€>ÔÌAª¼rò7RMÌRZž·Deb%7ÔYr^³”©îˆ cÒŸòššzº0e÷ʈ҇Ó"ï•ól·²P FÈâ[ËÂQò]tB("|Wµó1¬ö?a÷¾í´µxC¯qý‚@]f¾Y„ÖÏ +j aíù¬#i²QwÙMó3MsƬmЩ´¡ùo‹IDGªéÚ äû®ÏˆŒ©-êˆuH™ý›óÀK‰ÿŸ“ym[±¿+`7E?êf¦vPs³Jñè)ño<­:¡~:Æ.µ-ÞÀÜ¡ˆt¤šÐÚêO7v£–ö’Y + T\;ZÈuÓKǶ3a¾Ž(}+C£ëÞ}ß3–T aÂè?ÀKP*˜Ûp +od"^ƒu-ñ^—öÍyæ–Dòemã{‰°Åû3 <´VöÕÏ£ø:"¯ŒI è˜¹å¦ OϹùT¬Š` +5±äÝCžövê:h͵Ï–úNK} úŒ“¼öœŒ =g}‰BÌØxy¶€òÎ;Ñ”® *…`†pí—‘ZX.W4¤PN%Ÿ$Àeæf:YSÀoàúÔZØv(³¿Oyž¸tëÓV°“ï«ä6ª3øÎ$©/¬îî5­‰‡øm¥ö¨âC/鯃Æ6¯­kÝ‹¶ò|ã ãRÐ;b ìq}Fäv—ÔÁÏïÎÓ6ù¢Žö-)b ¥o²éDv<þûáÂ÷}Ô.zêÔ? Ù ¢(mEý¯ö÷¹3û›ÇvZ}W*9à ¬õ\¼Óäuô:ÝË2>#0㘲ßoJ¿¨ý*êBχ‰•uŸ3ö?Ù“â<ÀìªVAšæb‘ËŒ{N9¿vE¡¢Ã¿„ ¡„ئ§òÂR…/X€(t κ#”±Ÿ}~®­ÉLߣÖT¥åBg‹¡2d‰^Ý^¢vH„ºjŸÕòpÒûA~_·cÁˆcÁ|TC·Öú9EÓZ‚-£—¦ úÙ6esâè+J#:ýè^hìªN¿ê·2.^s¿iÆ ÎîúM×)Ä gš¦@èšî&P'è5†hÖÈÉ7ùE˜£¡„\5ô…Œ „q` Ê¥­w¤ ’îÒŽÖF`º<µueAV*ïå3âA4È1( _ßœ‡R·|ibõÇ©¹µ¯ÈÚþ… å¼ÏAÖx—ç3D¤™]#‰ + j‹kÍ +î&:†cè‡?L;„–L*}?oðœZ_¨"ìœXYòõn‰ííx‰¡ûQ7±©zõ߆Ýý9A~rïÿYþý¿òdŽõã—”zÿáoÖ?œ?þâßüøoÿõŸ¿Xùñoÿýÿø?üÅ¿ûËÿò×úÓßþãßÿî/ÿ×ïþÓ_ÿÝßÿîç?þÃÿùÝÿÇïþÃßüÝŸþã?þñÿï.z¿ÎüôÿÿÌÿÃPcZhN]k‘ŪÙ8aÍeƒ~ü¤’=~¤¬¬¥ð«ÐÅœG ìþk¶Ð žk‰°eˉ_ÿÆ;ɇւ7«ç¸És¾Ó˜€kj,£„Æâþ„6ÜrÞÄçA¥Ø”ïo¶ó²â¼Œè™è x;·d¯{—˜PEÔÔÞÔüNõ—ö$ z‡í÷Æ´°ÙcNÈ2Ý"¨)Þ÷z­zÛkfä@¿s@™ýºyS~¢ïŽI2,.`]pýIyëÚpee¥<í9¸Í›½ìÌÙ#FÜ ç] ¯Þ<QêŠuõ~ ã¡ãɻ ©iN4/âµ{b4-zº…L*KñJ¤¨µEfRHïaÚ‚“JfÂJÞ½zA·è>©²áeEm ¦òCÁ¿Z÷^ã²Ás«›D¢~(½²2–gs3YJ7\<õqU|êtA7›¦–¤=ípaL„·@QëáýàC7sº8/ÎiSÝÏO3šDsÊÂ5_®?üxö0)²ÞQ.™?ðU=U]êšÿáèƆ7ÿš™7CtÿIÁ…–æß×Ú&Ü_j‰æ>õgLì)³;<Ì(~(À~ öˆRðêÖÑàãó@pO¼ÐßÄíS‹oì{H  úR«lf°¦e+wöüD +u+e[!¸à~ªm1Tß,Mg¸Ž˜¤-ä|èœïñ™û©m¥Ö âï¼=¸ù)„ödü ðóüPŽNB'-D Þ¸Oûº,³á,@Ÿâ[)…÷ü}$ý/,[O j£5ƒXT¡þ¤Rµ±VÜ¡hñ£@‰j÷Çß}‡/ããØ!„Ù +>e]îêñý8‚2,?ÊñÌD&½ôbv%?m‰ÕöèêðñʲKíמ“„ìÓ^/:;„+Y"+‹»¾ô½µZs}À‡²ág2ñœ[Ru2ÜØ®eƒÐhUë°<‚g@-šÎ’å'°c ã®Å2ï%êd mEEÑÎwСáÚEØúSXDÌï¨BUZÒrƒ(yþ³ ’«ß<õÚ‰SÜZ‚Ž¯%(~†0³áy_öÂ*Œ…k=H>µÍ^êÎ{» 6W´ïÈ' +‹{ —Ÿ¢£µÞÆÍN¢è°Òz¼U\N T¨]#íùºöX]BlžkÎzÉk=F…Õ1–GÐ ØŠ£ç3– YÈÏ@éûæXc¾”|;±SHZ D'Žj+‚>¢·Š4b•OÜ¢† ±®-ÛR j^¦ok-©3é°¢.F4+-åJ£K©$‚N-@Ôˆ úMDíw"Ö–Sd–ÒعXîâ +E|ž=Zäxtù2€„g6ï¹ñtªƒ…sK7P¬¥×¶–T7¨Ì—ÓVCr`¿mlN¢<'žKÑä›mônô+ÖÛ'ŒBíÙ®kb§†xê°'ˆ¶—þF¾°îÏ´¥ò`/ + += p@¡Ÿl¨o_ˣDZpYÇá³eUg?SŽ|]„b 1ÃA¶d_Ø0££CDE!fÀ€  Ø¦.4è uGê2¹NÅƾårD–]Q| n²î0%¼°#'¬3ÇzÆ¿ñüü¼1M-ñÓ•„HÔ½”•¤Ù‚ +Ïv"ì}PŒ½=ªð€(<ム•ÆÆ£G¶îe3b4‚xoÀÉ t:öâKM ·†ú&ë‡ UÁ×z6»çY}Á¤Üz­aF¿É^÷J7ȯDg†+]»ÑTôœÛN1ÐhšUçx$::ZP {Š´šïÀ‘\yMæLq¥¡uŒo"\ÅÀ[ª±òvðDÂ_-‡+ò!x±]ýÒY-pZk^ö±X¢ LC…ƒ'ý“¡n²HÀß]”Xä×s<Ñ«g ðwö3ü}lÜ<*Ä"žƒnSb"Yõm&úÖ;Ãßa¡ùÕX\xÃ]`´ )Z®ŒÓFÜP5b¾8ÈóšcO1ÐSS©§…;YgÆvÕ¿çB6ºþ˜ØXñ,­Ò‰–ÈøÅr‹Ép+ö鞃u#€©™P +³¨Ba— ø‹˜Á£cQ©­|ð§¡_>ççA ¶­°ÁÑu¿Þ”¯ø?7èõ·¡ø÷!6K=:ìXÏ£¥Y]ü—t¹:ñ¢ØgQ:=þ±ÊÄ÷Ó."oûCÑõ>±qº~D":V[ÕÊ65÷]Ù>ñïë9ó5T³VªtRËúQ,ÒXÑ.ÏÖò’­©,趼·N‡ 8ùE3€J‡Ã©_ÔÜ-I¬ÌÖTý: 3Íò–‰ÃÓ½ÞQFív6½Av ŒÒ&8º&_Scñoø*ž?©Âòq½ ^¿ÈèÛkt|ý)Kým! oDñ×A¸;´ÖËÏæÂ%’»>¼kmh?n²ÐY¨†wO4³½°•ƒ;SŸÞb †õ–ÜxÔožZ2wŒôrë°èØDÛ"{'ªªv´¿!åûµKÂO£ V[y¥à,©X§þŽ”1eÓª‘+ÊM7>DÛ ùÖ7¸RôJU¼ÙgÖõ6®Æš*0^<@¾OÀºyÒ‡=fIa]ª¡5M{+ù¡àÑÓ²¦šQb£´ì0;XH¬˜‘k¶ž›L˜w¿ƒFÌcR›€ ÕF¶·¹²D!Á~CÂ97™PWµ®4nó<]›“ñ¬Sç.ß…´ùCõ/–Öu$$ïK¡èk×ÊíGÑ*qM¹¸îÂG8XC-­Ó]½üöjýdÂú¦±®Ý^“DÍùЙyMÁë¦HØEdøòÕ¬÷ÖàǺ"w›Œ­Ñð[oÌ8³ÜJ’Å’èòG¨mËDQ€2BNÛrù ÖF†­ç‹kf@Щ‹£Rš@”i¶œ‰p ‚ü_2¿™ 1XòxCŠr&‰§H\³úÓÅÁ¯I¯Dö]C4{É•pÿa`tÊ ¼ÿFƒ1“7Ç@YzE`°¯´îÄ%çsý€~¦qœiPøl`‡/V;¶I34_0‹:qL!¼‹vJ¬B­¡ZÛ|®£d(…îõ’§il&ºÞg´gÒU½gì-õ»~_2­# »ž(ü7áÄd Ãö°J¨SO͵A‚æѦ­04±þ‘Jvþ~gÝ"sóÏEëcÚ À0\_gyÓ_g?bº=Å&QôÑ”W[Cȯ”Û׈†Áîj2r}ô—ò;­”á.ÙÁc¾Æê~«säõ2E[d:ÅbãtŽ$„N¡Ùb~a]m¾į¢ôrÈœr`íLϸPÆj‹BÚY@óyUØË뛧‰‹Šƒ­·ÙŸç™$}QÜÍÒXÉ éÙÚ‹™Ï]Slß0ɉ;&1QÇ'PÞªè=¶àlqÑ/sóÒQӌ݄ÜF«M’É+ªÆUyÄψ”èKYL_©ðQ?£x¢Gž9U³iroœZ:¿‰x‡”>£ë×QÊ«Äšu*{†ZSkU³áð¡)ëR]b¹41=ØhÑûð¡+„%À:öó,+½?@à R×µÛ窣¶É÷ø ¤Õ2|‰½{øŒ›áû„Ù¶FiÁX¶wõuÄ»šJI2K¸š–ñðŒ¶“mþmð +¿9Í¥^=P¦Æâáªw+©VQ³ºãÊœ<0j‰¤çÏ›±õb"ê8#õØ@‹‘³‡*×x44îÅÖ]ä¥GËID?¶Ä(K4lž ­%‹}G<AÞЧž¦AÀ8“¦»•ÙV*Qs¡õpŽ5xöOJÕ"í’+uÜDa³[3¡CÌQÙ _U°—[ÿ»üѶ)•¹ÞÖŒ:î‘o{Ç3耼 óÑÙ¶}©€ºAîKÝþ¯ˆz㻈#¾‹6®ýº~½! +>“G¦Ý$&ÖÎø‘ÝßzzŸ÷ûñܪ‹m0»]^ÂúqlaFéo³­“»kÈñ¥1Ó éé‰ýH>¢ÚcµÖ}æÛÞÖw¼hæ[chkâ¡ÎT"¬ÞüM>ž7Ôæǧ‡Šƒ/ˆi —nÊ7fçSe|¤¨’ªÛ{Ô±]UPE.–Î=æØÓOÅ?Ð>»ThDÂ;ÐC°¤Ÿ¹O …  ÓàoÎC2r¨vÂùØÙØ™P¬‘½"x‰ãI"pD<³¯5fÅÙ! ÙŠÑóIá‹=•-Í£î'¥×ä½Cúõx}j<2öâbw~QÑß‚‘™ò/á øÇb”¶Ž³‡ô¸E«ŽÜî«h2{Ï eÉɧDñ¿™‹e2bû$Hæš+ J±‹|…Èy8nZT@Àµ’Ø¿H:ѹkæ?Ò¿ûøÈ;CŸ).ôŠ˜Ñ©Ãmì_G$yhI6úgT¾ÜÀ8÷LFêÒ|p­qÖnÜCÑÀV2V¡FÈ€s¢ªÎÀú¥9sìüŒÞ£3ú¹ñ¶õþ'5=µ»]e"”•ÇiùV;i—ȈÞÅiùöº€ó?QÃùuû 4v?2bóÊãÉ3Ç+“0Ó"›'ÀYUª eeëóMðê k¹Ã;WúŒ*ñ¬bô² æ„ÄÓ²ùƒ„²4 1ùìn½öß_ã÷á®;{ +×e?±:ùRn¨‡%Ófyîtûs_hxùÓS&\SÙJÈ“EÞŠƒªÅ°ùvèY,¡}JkBÓ +Œ©0­9̼šê!È/ X€øŽëߧm’÷ˆß?ýh©Ô²m•|œ§áë³Rf:¢¾%× +1Íþ]ÄwëßG’<” êº2œÍˆ>7ÓsŸÛCk'¦ã®ÃY]_vàÚ¥“÷m1º[Þ;Zã)s¯m€‹ÈÚØß²kX£Öiè}B­8̱™èÈU’ÜÒ?±NkõŽqÓ)Lf×`-»FC=} í^²pgÅ6"¶EÙ×[™º_O {ÿú,Ó‰Bºm·PãÜa…ÉNZO”»wˆ¿ùÞù7Õ /Ÿ[ùjϼ]Ëç@P˜*¦€ÏéZä&jœØ{ñ.ð)ÍÄ=ž]C½Êðít®8‡ œ§ë\ûŒ4ƒ,? ‡W– A5EdA/þ½é§Ådnïuïž+6qðY#ão?ŒH†ÃãBªë¢C­,tòY™ËWµùÊëAŠ¥ë 3€YªTþýÔ$Hã/œJ7jÃSkÈë‘?<ÝÍ%§ta£þõÃ?ùs·ïµsOfÛ•Ë)ª.¹°uu´:°ev/J1nÝ\¶j…Á6¦oÙæy­Iµi%ŠVkMCø1ÐC‘‚wL›â›˜‘$¡„„ì‹Ë×+¨giT›õô:8)<á©x ²øC²°Øž3ÕtLh´*(GÐN­ô•Þ\ÉR@¥Q‡î-"Ç»£ïiñ4=Ø=?O-” Qrš`zäA­ 76xhU!» ‘Z“Íù¤Ä¸Ô®Y…({;DE–kŠmµ«ëÐqùT~p—$!Ù°ly‘׋sÈD;c$´"‰{]iÐ4ƒ%oI¾Oñ㧶x˜•]þ»«'¡¾­JPáäî$Ÿ×5o@&:猢@ð­nÀK¿²œ–2éÁQÊ©ìí nБŽ‰!„7jUý„}%;&GùY5w0Š Ä¢Ñ=UA²ÅÙ¹U·Íµêžß‘ú¶¿ ­÷Jcjo±Š½ªAÐun²|Í@6äÎ…@üq!Ë2w(~GÊ>¿ôñ•g/Ĭ‰h ÔôËÇßy››ùö¨[¶ +ÙnþâHw…ØVF7wQðupÜ1©høh•?#Î4oŒ÷äÿŒÂN¼ÝLJuqêfÅ[¤z½"¤\سJ”B•Õ‹È³…ô‰«Æ­ùö7çqˆðž1­¶˜ e`'ùû €·ÛâÕüf?£hÁQ,ob Ö÷­ÉiñX³a3G)[˜Æ‹„æ +ÅÐY³P·ž_Ïä¢ÿp…ã ¼{Õ4a%nÔjÀ‡ í@÷OSöpQ“ÍñÎè@w÷Ü׳ÆƆÒe°¢˜jóm\xhà“U§Tì„pÐÈ ¥[Î÷­‚Lê™BRѺÉñ0¨ˆ²ÌE[ŽDUJâÒ¹ü´Ž(¥–(¤-²†Ý󬌔׷HB„ùcîV?#òlÞ3žóÀb‘" øÕ¢ç¹E¼íbøá(èÛ±ûõ¦¿G]=¦œÂˆÇþÂ3_øÞ’’·‘¦ N ­1YQï¿ß&»›2õž¤ ‹0H½”ëºþ¨òB´pÃÔé;w@@(AÌPŒ¹‚¯Á.Èe1,ò»,$Ë°o¸3~¨4Ù¶Òä6 ù¢Á „¥§ÜŽ;)šH::#ݬùažq'Ÿ4úÁ[ýyàà}Zy·ÊF©R GžPÑNŒ%hýùŠÀ°OÄ‚']ª(ÑD`¡cD”r‚_WÊêJ{㎤ð=5æfN¾=ÏOM„ÐÆ£+»"Ü~x%6¥eåÃqÉeé47÷ëÂÊE:¿îÔ9b/Ó#K7-epቴ}d+½êo"êF4ªúü¤(P¾ês™]N½ÒB´ÝU\þˆüÛzÓd¼–¢òãçßï,«R#`+AYü#êÆDTÙ°¾ÖØÊ®¹øu@çõ§%¿ÿTodÖâ%õ À¼³Êûúƒ fò'?Ä·€×”Ñ!©zŸ'A#áŠw›”Ø¢ r1m¹öÍë¹y.AÔô¢!ÙÄ‘ýad…ÊYb‹®˜ Qö/Á%7Î!ouE`†EDϽ&Š©xòAr–P%Þ_ød/?×ד.ah(04­`áßÉD 茭èA+“SôeZöœ?¡BKº{—f{~–µ Óë Æ÷8¸§k31Éç>"À){[ùýY7Þ£§Ñy þFê|§R„qÒ}="©WDRǺ›·òëó€#JœÓüGîÖCZwÓkäS›;é³Ì<£ú )« +”;Ëv؈èú…ÛkýÅ„NÚ·Ëßx‚ëo¢V£€¯‹ è¹CèØwvûâ̈·ƒX”ô¨êˆ­QÞ|å@³dïËÏ]])#ɾ#ªÁôqð¯r©µ@gÊ´ËWh­Wê„K +ʳž*h˜h›´³û×ÁqD˜KµëÇuþ¡@ȲÁfàfûüh}h²i@€MÃÇùÍyú@ Í‹CL6u ´.ÖÏ…døñ¾|¤úø…²hi4Í‹yJ7i[µPBÞ¡CÖ£°ä°©‹G†f Ú’(ì,¢OHR4µdp`¥(ºÆXٞŸÛz'lûÝ(žPq…á㎛yŠ¤ Ÿf¿) ö)Ø(£S¦ìûé)¦Ä Xø©cT„_{WùNÿ}÷ ÉÉ©ÓÄ•5{abCë wAÊèkËZòÚIkC€÷¦aåAÚˆ£×ºÜ9?#R?²H-Žâã<šó0°PwÇ8¶yîºq—†ÛïxÓɤÕü0z?‚zT‚¢Žr©òÚ±Ë6*¸¸ ½㎈ª³þúª´9¶ë2~ƒ-bö¦Ê–˜A¸TOØ›Í#za¬5yĨ ЪúMøÖô’´ùIq”søKra‰;Ãx×Uº§CgïxÀv”°Ž"ìVŠs•í‡;õmaJr85ÎðÚ +ª“#/^%W×VâWÝRXW<™,Ab2͆!¯5.ÔÝtÍf±#Ó=kt®[Þ +é‡Ugî”]° ­ +ûÍccáŒrë2ŽÿŸµ·[ÕeÉÒó®@÷°elgdü桽1FÐÆÆ'¶Žš¦Ô¥r»Áwïxž7ò[Ukή¢ (lõ^9ff~™‘#Æx"pó´Ì^{saÇmOa7z2SÙFñ2ØF!E›É4bTªèÏñs£uý¼< ¢ê}¤¯Ð„f1ež IEÕ 3˜á_èHSm`/õ†ü%Òû  +qÎOíä‘ʼ@gM39ÞnõžÛ1éÊ—¡*Ò„!c²ó'¹,g9«Nüí˜oÚD˜Šžàx²tHvF|c¼x»&ØpÌuEÞž + V íä>}ZeÏLÞµ0¢ t´Õ¸—šø‚ÞÐA¥†Âňe‡X ‚;ù±ŸëÁK‚…Õ„lÀkÇtéãG!ªR•õGQ¢¬x›@!_Xdá³]Þ°…ÊÀÿœ·¼ÙŽQ HàÈ–«Ç²GJîϪæwMm"¦JÂÏ8ˆO¡Wt×5¢\éMb„Tâ ¤ržl[ëKŒ€Ö|3}Úe¿”øƒŒôm„‡#+7u„QdÌAsz·‘Ja°q‘é¢S/4 g:|4Š|±}‘úZ%àí\E,"«•¸ðŸþé"W¶Uÿ¦FóæšØE>|Z«â´T¬°‘)éB ª‹Q4Ö½dÿë|ó(Àö/в˜ÇðìîÚ-îÔ•7Ð ýt:ûQž¹Êë-¬¢ ­•~Ü`?}øÊx߇öoWWa©×¸BZÛÏx¦”/ѪŸ~XðxîŽL¡§G,ÉŪŸ è§Jfv©Ö½Âøeñ¾j®Ä.N(@QvtE(ü’À0_°dÎMc¤‡ÁÊ +_Ÿ+=^ì¦Ï!Ó7•” R-UXâQƒ¹æ'ÑB¼´x|’/Èp§ÑïCË¢áó¢lé–#4ñµÀÇÞ6„,ÚÞ"·çHÛ©þÆ.Y9TÒù44[ÔB^õ‘ÕŠÂ7žʽPß©(X4¯D/š+ɮȿ!Ú5ð¼Ž)1K,úÛ° gû Ž +Ó[àX¯kdu1³`$ Ì®¦n8ë„â W`ëô|ͽNJâÏ…Wb9³éCÏZÍ?ÕfX’¡Äc¾PÙéªv-m•Ñ¸—²·½XšO–ð.ŒÓªQºÌ_-Ødˆ»R±£3Ã0"¢eäc¯:Ei¤Z÷þÖ#슈^FÙ÷½|Ò½ý0¶p‰…±Õ °v¼¯~­—Ò%†VË)lF*o9BsÍ¡rN¾z]’ÊàMþünº[RNŒg£è:±çb‘^`òQ>Š ìg}€f"TÐWèçØ:«ÁÖÉZ›ÊDìæ§ù[Q²d$×L’£r4œo€](O¾þÉob¤™ M¿“ø¸>šÝ)]hVR˜>Vv> {Óºo%8 +LÏ=ÉþUžÆâx ø@šíë$~ O]-÷–­OHŒ{¶iÇ°BÆÁÞ`,„·³Siå²CQ&dž€2\5$ÅRFyñçZVåÉEŸå,“ÛŠ\ü•,“Lò +‡xGÙ 6Še”Ÿ„wÑ3ÿ4æK¨9Uã_½˜ ˆØ(ÔB sA[¶7ɇ¹PÍ;ÔÛÛÆRÔÓâ2­hÙò†Áàeã£1úM +x.DóŽÜu!7UÍ¬›Üº¦»@d eR“z ë°u·-­Ú¢x±.Åÿ¿üüþ7ü6(÷š½6îj”²Ìüç¨2+`ªG¢B¹Ó‘XüXÍ›ÎÆÞ‘È)ÆEg³*ŸŠ1D{ÉyVt8¨åö­›üí_)pb”,Cp”T¤PËã¿ãÂê–QrrW»ôéÆ&WûßôiÀƒÝ×Qú×?vgSõè´¬ k"JI¦(åcQ³jÎBbòì{¤Y“^Icºî/ÃÿÙ Rþ‚: +”’ÿ~¬.•×‡vÒ&ã€ì{N« Þ²ÿ9Û­@]‰æÙ>x¡ËM°N¨Úl”Øl`bO`aéæÀ£4Û¬ø2,/ôÔIp|NX6Ck³È«ío‰5'¢ÈB!MšŽ¿W‘™‚ô} +z­¦p»gÈH?äYÏÈ(°²Ì;{ÒB·PaöóˆMdOÿed·ç©t/¬¯Uãdæ´€žÞÂ+]‡;îTæ5`L÷>¨]µX5:5â +7Ÿ·;V =Nºô>õˆSÀ"LÀ˜­ÇåÕÁ‚à0ƒ§ÁìX +tÞlé˜ +*ÛïOBœ«‹J©.ü hðˆc&È\ÎÂÏ/„Æe„b§ØÐç§BÅ(Û“Ïž6Zv˜Ë¨o‡÷ú z›W·/…ûÓÇ…ÆzõÏéÜ×kóŒÛÑi#ŽßŽ×j‰YŨý™óíi}ëjýc‘HØ¥AÄ +I¿)((¦tÒý +ŠôCÿ©G‹æ>µð}égœyymèw.Ú^z0%Šq\iIЛ؟Τo_½¥€( £+C ›ut4o«5íE,Þr‡× ’ûLpTO6K`özˆˆ¶f¤n®3²a ËÀþ>.ÁøŠ‰Á¦Æ  Œà|Ný èøÎ[Ä¡w¦ËÅÙËBOœ/îšoyNü7ÌDÊ4³x ´#Y¦¢²FM‡.±^œ%šŽèâQúØû{èþŒÁÕ½·u½ý[&ÜH ?%…2ë½lɘéYÔè5̕ ܿ|O覧’×(Eìyõ,ÍZÆá^O‘÷ &¼c¢>›Jå!Ìá‡d)¬å+©Þìñà 5ç9 ¶%Ü­Cßwê¹ÏAïa^Ϻwš2Þ„Ú£ȬKco¸î×ùŽ˜‚LÅ©Ùvå ¡í>?øú-›_CL-³n0I¬nãs•‚ÊòR_Ô8»&´·ü‹EC°ýÖÌ.ùú—üUöeÝ ©´ƒý;º¼ÿ}\3Dˆ( êÃ\ð< Ò+"´¯p»¤"ªCœƒù#Ñ°Þ‚\Ù‰±zñ€£¸¥Èîe÷=ì*ÞâÕNþ½@‹ÞtõŠûPÃì?! CŠQì¯P[f?ðS¡eE…Æ-¶Â6=öàf6© ï/lF¹qUª ¬q2ÿ÷^œÇ1?â,×+ P( C߬´²ýž²¤§“I‡{‡kÿô‰z‰R&Sª)˜ÁExe‡ Öï”ôFG4VžÂÝìÖ¤¤C!µ];3„½ Úd—x¹PëÈƳ r´x‰É•öD胬y4ÛGwæ> +)….çM°ù¬ÊAŠš`A±·ƒÝßÞO)¢Eì£`Ý•¦~<ˆu#’^sW¨ š/aD÷*/¨µD d0Óƒ?ezh눳ä³íñ^éP`kDÆ%¤íw'z¾àätëè."¨ÆËo¨ëÓjD¸àÊ_Å< ++5¸B·ïÙÚéÿ§dʪÓù8¹ˆ:û“¥?æÓ†‹E@_ëuùZ,+ ›¡%uQ+C[8o@°ùQŠhÃQW£28šj¯/êð©Ø¥†:/yÈÂüwJuuéÒRXùÌi>ò™ƒ™8]žà±­+ Y¨÷´óÑéd™…µ¸àfl™þ!e¾z„Õ–N¨J)ÞàÖ5i53ÀQ1O!¿Òý»cAoª½×à +jè9òÂèAÀƒë1™Š~õ)f5*0u?/NðpÙëTJõ'Ygfκ…Nß r¨·0Žå ]¢¨ƒélpO³9¶²R2òBgm?j‹‡I\ûKÉž±Iüåk>:3¡÷<(K%xÐÉ žwêàûç-áÜîç[öó +ÎÏ°@µÖu¶”#B¼lš¢}ºÀM,‹!þµáÅn¹<ñpô/§f Z{ßSj¸C0îý{a‹ÒÞ¿?Òv·åÓݘrŸŸŠTÂQ@¸‡ê7ò]”Ú¶»Æ9Ï{€ªM2 //vÿ©õ˜Dè«Õжøyº;jÜÖÒßóR¯?§y„¢aù1Øæmo-wp £éÌIÄÈ=²r|.4P=€^LÁ„¥J¢ø‹’D`‡Ô°©óŽ%v¶Fì…_„ÙiNaƒÜME-çBd‚<˜¡Ä«Ç¼Þh5ƒ‚)qC©Á90?ûÊäðJÈPõ‚ºY¢,î ÷»6En ð’NÞó t÷ö±š‰Ëº„·Q÷u#$‘"dRÈß÷dŒ\`Íù9¯Ú7êŠT­GP›Ù`ØrUFk¿ÑyiªèéRN5–›³õgƒ¥ê>ˆ*E%U;Qc{øTñ¯²AÇrÕ¯IvHË=”ÛŠþEZÙ÷À’¦o§UØ´F˹„3•©`O­øK²rÁ•-ý ‹ºbPÆ«p­pSŠv‰½Cœ” Ô#&*W¾d“>@iºÆ«¶Ðz3b{Š\€ÔñzíVå÷ÿ÷À2XÀvfçiÍ:¢vÌì7f0ã;ÔÞ’¬Lû‰ÎH= Q®†ñ`*0ŠœÑò¹>j åH»¾9"þÈLás‘Ü n«)Ço@ +P˜¾²[Œ<û–u–ìÄ룼®Ó‚jd‘¹-(ö£·JFØ˃jj5"üg}Ñðu¹~×4#”·g.î™}B5'èk ’{ä;OûJ±6€Ã97{t×Ý•ýS:"ÇPÏ”qt0¿gP6rö÷ÔŒÖ%Q¦{L*0ȉˆz$¤Ù#yÔãêîvûﺽ +1€ØIº™H5ióá’ÔrÝ®Ïñþ…%’ªl0®jNñ.ÁElµÐ£=ÀXö)?Rˆèú•ˆy½Mqp0âNù—üFÂÎWÊ}L«Ÿ—0H’6øˆ +êܱå`×¹—1Ru?Rõ«½g1}Op0ƒ’¾’鉎_ñÖ,}!îpwš+/ӈƨë­NjÌã•ÔŒ‰Bþ”âXÑQ_™ö°Zúè "FB +Ý·#û<ªÖƒ‰UGX=^¯(³õ¡/ªùž4xñ.ðOVYgtD¹l¿}Õ5Àô–æ˨%õg¼1§k$7!ë".$ˆN½Þ{ýSÏ38 ?#¦ä3Õ× +uùü¢;dH$+¤u®~Œ—if‚÷¨/”T£ðS8†êrKJWmCON±æ›íçR!æöüC~’yÇ•™»E¬aY>žÕû;aÄ~wVÉžûx]go”+ +9ítÜÒ52½afØÇawRhƒÝÉÈ~¡»Ò»¡* +"R‚Ä…TðŽø©{@ ˆ û±°¬sošÛ¶x"E baìù"mkÔŸ,ðÊŸ\>"‚øñ庠cBVj¬5âˆÄœÄ¸‚Àìç·s ‹À…P˨¯¿Òsi÷bÖÛÁ¬Úê›lj»eÓh#c1ãnt§‘©‹†Ff-U“¸A÷ÉÁ¢|{Pã«bOû´[å`L(q9r’auÖ‘ÓI/¼?ÀyXsÅݪ9¦ª|¡ìŠZÈ1ÛQén=°”ûEäã@]-ÊîûZy¾e2"°†wº•7ä–Š¤ @s·®xüt‰¤Ç>eFçüבÍÛÂ¥Ù‚gµé]aK`ô©ø¯i?›_æ¸ÓÚ*…é˜bÑ>‚nò!ë•cLtÛ‹Æßý›ÐHT Åžm÷z2G‚®Ûîq="z{¡EXßÓЈ¸ÙÀÍt&V';ØÛ¼#Ú¼_ •C¨©4¼´ftÄ£‚I®ÚÏ×äu‘[¶ˆ> pfšž=GÉ™eÏå¸h*?K®5O½€‚õÝl R&¹Í2•Ã¥Š­¶-_ÌÕP4)7µf•à 'i²9¯ŒªçQ+Êvíl飻Ûb„¼Ú“í8(Ãß±E©%›ä†…L”F-bÖ½”¬'zzîøöÑrñ{õ +Õ|xôÞÄò@Ò W¨û©Q3õ° ÛèQœhSΙ>Šûkrtê³nOg˪ _úB×e_hT׊pÕ´Ë9Ë66‚ýgç+õgT¥®L´‚jÖ(ç5/h`ç3ÂUÁR¤€Š€~tqªü?q €sWY•^»y=}%qU££áæPäP+LÁ$žàP‹öîáÅx6„GPØ×I»X#׊æ²MCvædõ³¦§­âRÛK(}6Äh vŸœ}²¨8QÜÛƒE5T»}ë]^ØJ¡š³·Rÿ*òèo oúwÿª7è_y¢¿`Ιÿÿ÷O¦¨J0g*Ÿ¤puVdìÚËñ,‚9Ãܳ£…ì/Q>,Á甯Qi?\ßyŠ©édnïÝÆérÉ1Ä„Ñ}ÅÄ…Uý³Fìֽºeð7%ªV£ôÙ,–îÉPèt=€ë\úÄå^•L´«QwÔrÉL§ç©MHÍ„¢%LcDQ±»³öÒigÖýúöR ³Iû\È&X[Iñ’ÕP×6™ª%ÈÊ×÷z¢Žz5÷FÄÈfu¸¿!@¯LÞÁ:æKhå=G§”‹F“Fw3Í>.Ð¡Ê 90·¢$¹0V˜/§ôÎN¼—m§»»Å_¢&‚ 7¾ZtHa¸+Aª|båÎÖLäë\ˆåŸgF%â¬ã˜ÊtªÑwx¶½àkð‡y‹¿ù˜3Ϥg9³È{üÓi̬ÏJ”œ3ÝuÝFG˜o’( †ð‘ˆŽ4üÌlà3/QS®‹]É…ñ„ôLZãsÐÔ Eø\ ¿d‡?/·6€‡¦O€“rAË­dµl1š‡è>ÕD>[^PéßÝfVÐ;Ī ÀýœeÀ¥»î#чŗµÅwœMøŸDxf:ŽÂäN%Ç7Q·EÏé§ÙçyiöÅÀ=€eÿ&Âgˆ1ÐçJ_¢®•E»‘ößÑÒÛKج¡þš –&úê6?Ù9t½žÏüPÔŒR5ëþªDt?s}>Q7¶¤µ_”E¤¦}<)©¯aE«!®×e“$ŒÖ€DxMwþ\Y„ÕÃÝ€ +8QFÆf«Ùœíˆ‰šLZÁ@4>®Ÿ¿ÀÚÞ¦÷¹^ÜK/À¶ÂÍl“½*€G}Ár- áåo뎩3Êó÷Á(Q„Túô”«uï@/ >¿Oí +Oí «¾‰ºŠîB%|hgN?€õD‚DG + Ö6ŠHUó’z"ê‰è¯ÿ«VÇ_ŽÙ'x,uhXbžn# ©xºþñíüíµê Ð/Åãðc£‹Ý½T­GáI†$Ú |6ÝÏ›æçQ°HÆF±œVz–§KÐاÎ “™Bèk)dí™n0 +3‚"©Böõ°H³"õ:Ëèh.“Vc®²„_Ý©ÆPÎ}¿˜®®çÍš€Êÿ´¸7Á¼~«¬öà7ÔDˆdf Ã‚ó:¤œñ¾TóŽ}9KÀóËõ$ äKò”ß…C¬–`éÖɉîÿ5€ë†îþ5"µ CzÅ[º|{¶x–¥´ßÊ\’Â÷Þ?®o]|÷{¢³é¶‡„å~eöˆê²gi+$!BM„(ÊÇÀè6eº­£‘2©ŒkîKZþ³©×ŸM8ÿJùC`eÛk¹]K¡ˆ(ètÌM÷^Ð@§àsÅÚ‡{ T¾¸w\‚æÀ@¥'õ–btÑ:{‹ˆö¶ã`˜t[ð¡iÆ9aògW”ê¸qA9ã{ÊyÚ“ˆäëÔ‹hos%UZa`^¹’‚åÞ»G,ó iöjÛ-ÅTÌÊqv!™Óiu+¸Žy­Ð>›Ì|#4o@xôí¤±\ªx–§¤kÜ!5#ãi)na¨0f`ñå ³0½#ó§ó'ê¶M;¹£Ž¢üüiKgõœÒdU4º ”º3ÎáZõÌiW»bèq­q ͦhߒ݃ƴÛÍévüå_¼Ûæ5ï’º¼mЦPDÄÿ\n9O¿ãÄqÜ_(à'"”aœrñØ_9Ž^¹@K³œƒrÆšjgþ7úl¸uƒ#æ +5 ž31ÁëìÑU^1åã°¶?í+Ã[ÿRÇ«ûk²šÞã¶$á6÷yôéËøýoù5‚ʦ›üŸ›hŸí)¾ž]—n8ð{HáëIy/AMgÉÛKA§€Q ÀHùDð¤ªäB›÷ F -€öÌS4]A à>¤%P‰íËô<‘¨œnNó¬ä— »ápó®sŽ m¯`½s:´‚¼¨Ñ.Ó7Ð2h‹Ñ:¥è + ^ˆjŠ.°¡q^Š©ÒÙp4 ókDöEý4@ëÝu þ5Šô¤É…Çd‘šµ®{"»bxèê÷XÙ§hóÃ>½zýiÒ"Oœ(Œ}ˆÚ'£º‡t‰µ‹3C;‚ÄD¸¼_àÂf®Œ…dg„<”Ü#¢| +¸ýT)NS*Fî#šE‹´:ÜP-ܼžœ§Ý +‚ ýšˆÎÍÞ¹da"hRül|¥Ý„´"LÅWÑãqž43¼Ô®áƒÞOncWné¸Ìl:aÉXÔ³¾Gƒ™ôã«w¥Ë΢!ìX¬=t§ ¢N%}ÏÅ›-óÏ"¸-BÜ|[ïÁÃuBjA vF¢“ +J¿*Ç¡³ßžÈg¼Í“ýQÚÓø%⧧¡¼ƒæ$ë›(uÄRÞÉýïà eÚâ…ýÉŽ>Õ6âG™gHå™mRO=ýð,÷†QÓœ+¶@—Èó Cš«ÐJ¦Ýò–µ•ÿj +W'joom-ÉŠNÿ‹Fph•šE€Çu`_vÁjŒ)F!¼þ, #¦Kv­!öDßõþz° Ö›àUÓ·¹(?ß0o£GÇ·ýª;~’R@†÷5õ0 5[¾6ÛŸd¼}FQzHÐ÷+×µWýbg|_¨Ia‡â›·¿Çë:à &`h¸|Ô×OÅ«Ò#‘ým§éQ–Ø+A3™qbËû–%¸®"˜ +ˆé‘ZBéóø…€¤²º· ¥P‹]SŽkçŠá;W°¿t;mç^e\€50>æ0Œ†(ÂS1aÚ£Æî°¬c:“7Â6‡÷kTÑûs ×f”dÓ;•s8}¬°¡T5{†ævß!n˜A÷u6S%×)Ê춓°&ZxÀšTH"ŠUº'þÖÑ G I:Í/†'øEOÁãp‹5ŒhEA¶‚ï¡Äy.Ôô£ '&Ž€f\r§Ü;›V•OXƒ¡¿ý-7FíHpTÌ~- „hÜ~˱þ +:ì‡1ÖˆûÝ%Ý9ºQ]‹Ý¥;±ê©š‹Î¹ótÛœÅÖa@àB½ß×UV@Øx÷ßè‡&¥:³%ûÈGYýŒ<$~ ÂÓ!ëåǨL) ìÓ³iOüº«&I¤— ᦠ°ë¥ð/°œ®à°£ž°«Ò=Î +¥ã³“ÓJI΃êC¬Xò•W&±'A YåP&z%%(pMõ,{ ±îhÚ¯ö9дŸ”•uo)¹7ÅC4 ³^q@ËÉÈÂ*lQñ¾˜>n©—ù€mNP´ûÞGË%Ë?PÈSsò ``jÔáöÖ¿ãntSäš–œöCžBTÖûŸöÉÓžŸ°YKÎ À~;À ÷>ð ¡9yÀg~<›Èø)>ˆŽµ Û +£åžJVrú¼ËÁÙüÉnécˆôëÁqE¤›Ÿ ÄkO” o–Ç&ŸÉù'²§*0ŸÚòÞ³ÂÔG`¿…·2öô1lۈͼœœAI@l+E0'ˆ!ÏéÇæQ’+í›|knXS½Ï&ùO£Ô9ŸÑ9ߣ‰žK´Å+b5¬ ôû-“fýzà¼ÝédñëAU%j9æx]°ÃL"×sø9ûghƒ b¾'Ä’áSÝ`µv±ê;Ò¯0B÷sÜ_Ó|0󯢓xÎgcÓIÅër‡%äÜö§§"Ùc¹ÂóàZsôî2žÎõz_ä> ˆ¨š¯2ÿ! K ^t‹K®ÒÅ_Ÿ†?9à[¾ð- Ü)=ÓÈÆ3†Yéµ÷‡$wÕõGî7IœªÛσT>yÆ×þ„ªj%™0ÖY²hYîob´ñ/ü‰à×oþJ“ÊŒt=£¹gFøûïJ9pk(Žwæs ©’’@ø¹GÙ:þ¡ëìÜñY!—Gÿ£¿/Þ±{#)7Ñ]ßü9e-%M)íܦ/Ê>ë×ã&Ó%š÷˜R~JcOÈv;¦EŸ>R2sç–wîWoäèR¥U 4x7ÑàM©Îê¯|&l¿;Á³ç,¬íʺØQƒ + ¦Ô9ü»W•©D„ j,Où]ü76»Àp„@ŒŒDÄÎ{ÄÎßÝÐ@ªä¯„XÍý«–›*'õ„œûxSrÄ9›ŽÁG$°&µí`ŸÝ-¸Kå±Éº¼—y˜ýœöJ¸—Äu†îsàÔ÷cý÷å wóˆ ðu÷®d±™øy ÂWPû9“àç`C‘ñÔ܃C[@]MWµ°$4TõNç‹v2â ) +Ô.þJ HÏØ s¥d/UU +ú¡åzÄÛŠâQ|+û‰qÀì'zÖˆGQóó‰ù+ÆÙV¢>y–%~¶Iõ˜«íÀˆþÑ$R4U›ŠÅ7Ä ¹¿p²¶3…y’ÁÏA…Ðz„Ш‹Ú-a~ýU…¿kåõ<ÿ;Nqœ| ¦¯ßÍÜ_¢n[5ÌHÆaGÆ|GÑ +ƒ-7.ÙrKWýPJàc‚Üçá?b‚MÇÿ÷Sœ=%ÓÆ°hNÃv•¶DEñAÌ8bîPû´’JIîÈ€Â[dcé‰à‰ì@¯c6JÂÏD…¬={O|Á}©_üËÙ!gK¿VoåùæÏ÷ÔÖæá¦PÓPYeA½þ€[ÁåÜ»u¶ÆáA2ÕSbo¯å‚QõD•7Ê:Á‚/uÎ#äæ:œˆy"´B¯M„ŽÑ>"°ñÍ•ŽÇ3ZLÒ2¯Ð2A”À˜êt4â¤h¾y'²Û¸™‰`{ÆüGŠü^G kjUE· ï™Í³¼~ër½÷>ž ‹Êú‹HÙ!¡†sãѸ„ú¢úuœõ¶é{t–”8¥ÉjÚm*|Ês{Äܨ'kNk‚º†àÿç°€2Þ¯¡så¨ñQÖ§­FTBÑó’ŠÒQ”eñ<,”û<—MËç`PPp¿cƒÖ×ý¹ÀRKbçtª}h +Ê~7ˆù.BýVKšJ^€5Ž ¼>òØX$ÞŠ&³ ÎË5?…'ykŠ1ýÔ˜âºæì²øÐÛЃ}žÃÞ^õ ïºw™Š—ÁóA(X»ýÈšâ)2±¯ÔZµH»Ũ¯û‰ÒÛB—i¾åf£æ‰ËpêkaÃÏ 6®ÓH¸µq ,kFi¸¶1ùP¢épú™ ˜ëµúÑú—Þ*jæFùÙ}ÅZÍ}Ø6:\0 ²vﯴ ‚Еð±—`3ìí†Bö2c[}‰¸LJ‹¬Ñ¢Pј×éž»¥H}Ÿ2tgI¬êùKqZxºŸdsÔ(*ìï¨(œçM0^n‹ØþµÕ®q3¢ˆˆ&º |Âœƒ!Æ9DŒCUcÏïÈùçJ=.I…€ÿÕPyáT[èå”׋b_#òà[õËŸïÙÈB<•÷)m¦ÄUIèÑ|‰ðÍö¼ÙþŠ¹~‰ÌîL¢0îsn´åFÇÑHÓ—ˆƒÔ0˜|çƒ(ýH³ øx¯QÁ<š@ÚzâIyÑÂ. }$° TCñ¤e ´’Z¥h¡zÕ£P¦×G¢â¯˯}ÅŠ€Bä—mõ +¢ÄÝ-ƒ wéxµ•(;Æ{è>…C¶Öø5¤ÝÌôBÃ>>’Mû½NÉý_‘Ȭ%>MñÐQG˜†D„‰`sr¼²Z€ò¥Iw­£­(6âýóü®¦#¼aõXhÙ*Õ9‰Nøš´…¾@…™RV®Uìz¥‡ŸÀzg Ø@nt*²¨O$ù[ú8.HeO½ì|\M‹¾Ì¢ù7Ùô°»ÚØS¾I¶CUËp³:s—®V<“Þ:hd¢¡¨ü‘¡ÿ? ÜaîþÍy!gɱ…Jc¿¿9@m¼dírÍ—©ýKÔ-Uš——´ÍýaÍèñAɲñæy4úúkÀg–Ћø‚Ðß¾9Í^£|³²¶yìqCí˜DF1jÒz{>w™‘®™jEo?Q(å ¨ à-‰PÝ誎c0º®¢Q!ÍŽ‚Ä;EÛ}GY5 J7.‹–+ç ñ A1åP…Š2ÖFÅ—y{± Þ­"¿B÷¹R‘kó½Ç$„®ý dÄÅöð þäƒÕŸŽú³ޕa%m6Šö`A©¢È'̈¯<±©0·ØïMŽ±lÝ#kÑø‘1uá¾üùjûîh`PÅÀíÉ­ÕÞSÉWVÒÿ-Xä>Œ7ú¥ûVÏ&ˆ/R +áª@öÞÐ× M,qX‡5¼…½ùl3ÏÑjHG8ª¦oq×=Ö‚ßæÆ$‰±ÓæŸBô8°±bf¨W,?æˆmEQj¦1ôý=ÅŽ9NÀLÀ;RU?éÂ×}•oNSŽb â^æ".‚]á/åeÐ!}²^ ñ—¨+ê¢8 ™_^G§aY4â}"Ÿ÷¦JÏŒŸôäQÝúkì=èÕ_d‰¯`´°íˆ²s“x‡÷ü¹þÕMkÀ#S(z9þ€E#,QÁë…¾ÅO»•˜É,|ã5¢hÒ=â3ÿÜ¿eð¯—^_Éß²n.%š÷ðyÑòH!¦@[»¸îëUãF`Ž6|‹œºÒ׎s¨S«|A#`(Xy¡^÷ß~‰êGOº÷±|†ÎJñB]_ à-ÂBÑWAIÕˆ…Çþ5"¥‡•L²¸bG¿F tVFýQ)øÁʯDážbîJŠ%*5Ï…|å|1óÀrñJÔ½…1Éßûyâò9Ý’Ùó»µû&ÌT}F€­‰!ºôÏ+.2j÷ªT+âà‚RßTü˜x + `ô»’8ÕÒf%,Âb%Ñæ•4~nàEïî0ãXá7Z-¬¯_âxV‡¸Žw·/î—EÔs~‰Bä¤ ­¶•Õ34»p&¯iÊ r¥çäì{¼2¼u¼õ<ª…×QáɶعqeYYˆoÐTŸ¿¥/v?@MICág%¼~VFS ÷ÛRGñ[Ž1œÀ}ã‹ÔIí~2`rp®XG£Ë!uù„w È5aï„|ï:ÂK`FH›ë³_M©=2”‚úõÀc¤VðË1jÏfz,ª Ý$òp;+çªe6<qžís•3Šð +¶µèhBfßXÆ£ƒ¹_=üIÕí÷ nàñH_÷kU2ÓþøW¡9KüLÜ•ûWžìÂ*¶ÿ1ÁÖÿã?Ò ùñoÿ»ÿçÿñ¯_¬üøïÿÇú§ÿûÇ¿ýþýÿöÿüÏÿøßþËßÿûÿçïÿ—øOÿåïÿ§ÿúÿýý?ý_ÿ?ýÇÿôÏÿóû§ÿ÷¿æ¢ßÿÅÿþÿõÿáŸÿñ?þý¾ÄŸÜÜ󹃿@þ_ùÿÿ†¤ÆÆÍ5ò¤±jãR)¥þ`ƒ¡wæÌø=HOeÆïø0’Ôa•¾Xt^9ñç¿øžø#„9t$&Í[ß2•Ëî°7ž÷ùÑØñ¨w_nlZÛ‰ºT‹ÏçKT­‰èÔÛ›b·°oÈkFô}Ls_v€N—X"6gÍnF£8ðÐh³¼–&&[‡ÇÉuÏ è°r$²ª&EsÚÐf <´–¸¹8LaÉð;>Kå-‚Øþ0@¥  »îfÄÞ€SeùšVMDG/Ç›èù'”uý±âÝ‘YÔùˆ Ty”ˆýÅ¥3='b§DPËÐ\Bgb'õðvÚ• 7píö€ÀzÔ +S}ü—"8¤÷"Gˆy\LwÐzûû×!&šÙ»[n8#NU\©‹šghUHèÕôv¿K¶Ã~YÔ fŠƒõÛö} 3ª+‹9ŒT `ƒ)«Vã>ÁžÖ"WºNžzÅaå¾Ë‹ k^´#%q*:®OæoÐŒƒly_é¹…àPÒB`53ìDätâ{©Q¢x;“ÇíiÆù÷½3÷¯¥x œ„!Ý0à ïÿœîQꜙ¨†f¾3W6•%÷¹·’Ô°C%à`1^:%äB¯6÷ +G¡Dçžæ»“Âmuî÷_£K‹Ž5_‰¢¤Ò$`â̾æü»gíÍï‹Èçoګ݈‰/X€å$vßG Îëݯo½«Ú¯AO±š½1ÞXU»ÖÀ Þÿ ħÞo w4Õóº~9ûß)H»¿ù+ªÃ–?û…ÇÇÅš·oïÖ i\Çj-ðà© íA÷/Ä<Ÿ²Q"Çf¼"êáÕ‡^¨2¼—žg©zy+W`Dû{E#&LR“R\ÿ\H†(úÎ {‚hs™ÆÓ4ºß:N—ì<‚r\öã¿2õñPˆXÈ"9ñ¿‚ö2B{¡å×ðÅkÈ¡-JSv€J¡Œ< “Ò~t´´PÍi’¾D‡×6s¼Ï5|np²æÙOÖ;|šJ(½-D«Qºw©¢Áü/ÿ~°ßkÃÌp:CDµ&±¨FåN…•±ßîG«ªŽK”²Ïˆ0a@Ošû$soòå Ó‹¿Ùß'6}ŽÞTíKÔ3Ô/õPôà†á·ñdä†û¨ø(xÐÝ(~ lBs_Ïõ/)¢Ð‰W3TEûæ<àÞ¬ñ܈_SëèÙ¦T ëkÄ:‚ßäAŸJñ×(¼º8Wû<ŠÅ÷•}P÷k¤rñ`è]©%Ýl>n7ùÞ ‰¬ºNµwþ£ˆâQñÏÏ8 Ó±Ÿ"J5ì¦1…ý2RªH‰‰ïQ(`Õózö¾ô=61“{þ`[éV`õ´Í.Q‘n·Ýd†“Øõºê%Ù¸auNFÊî‘:©»g \îà‰¢d´:Ì^Ï“¹2}eSR¯lnÄÕ2šâ©Nx*p· –ߺð cìO¾Ð%:ïfLŸˆºp¨&Š~'Qݺàõ¸ô¥ÑfÉç¸=ðI”€†^çß¡_ºõ<Ÿó£š*ñ`»wA2Î]€õ0‚es™îÝF(¨Qßm¹69ž‘Îj媠ø…lëûK ÒR Õ+ :®¬­&’l–øˆ)&?#«Â¤£…frYÉOþ|&ônBv¦ø ÕÕ× ¥Ùé˜5ê1HkI™:-Ö{6˜BJ*ò©é ‡fþƒØÑÉKY™'ÑÙh2Gî5^'8«:ŽIôßNNJTa+:ØÌ­Ü´þFêy,Ö²†÷0‚Õš+Áoëî½÷÷1xÄ5õ#YÇ—hÍÃv!*é•~>Þsäüdž‘+÷Ƀˆ +gË{lDíœO2CÕ¯ðê­§ÞЕE½¸ ¹Í´ûEµuž.àhƒŸFõujÖ“„$ÜP˜Åquƒ¦…Óý8ÆÑMpªÅÒŸº²É»¹À\^¹Í¾_‘ŽFËUÏ”{‚“ endstream endobj 78 0 obj <>stream +Õ@†¤ÛϘi@ t=ù”’ȃ _YÎ'€fB¢ë†XöÑ¿F4Ð/oùõ VÇ~'˜ºÜ<€ýD(H짌çGS[’WCíig„÷J?ŽÙteûá•ð]»‘Õ|@||wžKwúç»QîÞ#VüØ¢ÚN¦# 5¬¦Ñ÷æn»Ÿ. X­9gsž}„ûÖwAa•`Aé,95G·†dJ“®PúÎW²Û9bg(—3§§¹)ÎPŠ•»D@5É ™"YUÏOJÖ„Øøýþ$´Yü{’RÌ„)…R {œË*ìDF¤º ·ËÌõ¬w¼íGu¾vs’_"r%ô'êwNrfqm1ÄMªt§Ù):¸oŽÛâ…(Þ» jôŸ”ª#ú%ª MÉׄÙ~ôWz¬[¹ƒî@:õŒšŠâÍcÙ㶶ù5âýFSD&£ ²„ÛHFéS}Ç—äë?»½Â7…§1Þ2ç¯Q§ü*ÐhÅ™Äaˆ[Èhh¤j‘ÅBLè ŸQ§e®_#òĺ*khß¾9O¥ †¾c×æédeýde<±úd÷:ö:ˆ“$ó:Mp„åàÎ9[ºçgŸÜ§ŽFÇŽÓyõñ°Ÿ®îÒw@ŒN9…5ÖÜÏzóÈ^%ª<È&€ r!¤±Ýó FÄ5m¡NÈþèá«ÿÈ9–Ð¥Œ˜ýý%è +0a>\!3ûRÊEß Â8(â d%Hóíä¿3ˆÞšŠxº.`"_"²¦-;@$6ûÛúö<Ïù¢ö•AÖ!ØG]D3N¶ßD¬Ã–¸½>¹ìŸF¡¥:ˆæ5M‰‘i[tµ‡íì«Àƒ¥å7áòº¯ŽŒÁm„9…Ö7‘0u‚”pìÕ«§é¼ªÑH…«–é9ÐHÆ‘ÉVÒ@Çúœ7«Ã­¹Ý½SëJÅ{^²I®¬Š"vŠï Pï͇€”Äí–ê ½ùš¨ÓkrwÂM–¼~ ®;ê"ÑùÁ>Êò­°Tï Ì°ñM2‹Õ¾*]¯Á¯Q€ËÀƒ™œÉj °úÁvì…ÐÛí ÖýC|.ŸŸá»³5†ï|ùç¯ì`±™À?’‚0ÖtòÍ5WEïàð@A1çEùÇBë…¢mÀl]$ßÇß2qVY +œFmáÓ¿\ƒLt„SlÝÿ— á™{¤ÇNê×€?¼-5!svõQ~ ¢¼N7zo÷~tdFQ—ÿ¢£ú%â»òKõMy.@46=’Ž}éM´}ñc°™q‹AYÅ&‚r‚°þ:n8`qNKá†Æ»O¸•>gSÞÅ5‰çÂIÚš'6‹”䇆t?š¡¶©Qè¾-âKgü·s!:À6‚¨ÏhE8Ù+UDkp¶Ï±œte +gM¤(úù+-$ÀÕ}ÒE™ýÑsœß,hXa›†…” ©‡=YÃÖ2%[º§ì<4Ž«‰ bF„UçÌé‰oDK„X#l:Ü×ñ”!IO‚$øA÷vê¤âÊàE’ s¿Gš,¬‰(ÝÒ\£²ODÐ0Hÿµĺ¹:›”LfÎÓlg+¸Ìy :øD敇)ÓÜpX8€,°oð:h„l<Ÿ³ñ4—€2Ç>èÂr¬¡BíYSíÂ*ˈØ]Ïë´Ù0öÒ»‚€ë±w÷v$èÛöDßm¼m‰á FWíY¼ÐD ÀÝSµ#œ$(þ[Ç«n6„Þц&Ê¢š‰kà†R#Q“U:¼Úg4u‚·å ?(€a—È-ÏÁÞpÞ’áZpÚGöI3EsKmŸWÊ>(¢ö8|¿^Ö¨èA|ÕÍNTm·óœñ’„ÍÒê;¼.µÔ(QW*d|¾ˆ·ª ‹û"@Há¡Àyh†R®ø\û7Ç»<Š…ôåý  Ò +·²MÛ»Û§;‚‚ç,Xm¨AA |Aß®!žGÖêôCÁ4 +‰ õ±vâ³NÿóïàH®Tõ¨l:òAÄ“è +@Ò‰q! Hÿº>Y¢ö9@*§'*v’쩤eqG5ß=½Uöè}ÒÔ ù "à«'¢§û +rÀì6l4°k\Iêâù\©Û’åí·rî§øçnq°J×éÍZh2  <Ýy‹É^Tö®C=lÌÛ5Õ'`‡DV…j´ëxI§GMLËmAul‚÷Ã!Ãd¯])Màü¹4>×i¨ý½ëíAÖ>XE'«H"(¥±¬õ+ؘ!Yß;`ZÛwPÞͦQo©UļÞgìT=xr¥Y<Ï=…ãÞ›¼7j`û€ÄA¬ez߀Y"èbfƒýi*)Õ$à>[6±û4;9s°žèhú›÷¾äºÞ¡sâýEa|?ý.ÈÉ$_­\I.ûÛBgOšVÇÌ°»_þ=Åù+ Æ_ÿf¨åÄgÉ~ϲŒçóφwšÇ\ø<ÇúÛ¹¥0g™U´õÀ¢P $a7…KóH ûÁ’Ãî[¾‰øÃÁÂÙ‚™(py|9Ø(áØÈ\¡×¹ƒJ 1G¶GæÐù˜˜ÚrñAÿ~°Kb¬4Þâéž–t¨§ÏSUOi|öo"Ú°™"#/ +âKZ.ý¨î!€ +DQ_, ý Ü÷ÅVؤ„¼VžÇy×]vè §«Æ§Q—{‚Šœt%£íú6:Ìñ"IÙèNC΂hÖ3±9£-XÉý畲Xv u‰zH&÷&V¥çá´D sìOD¹/„ðJ"ÜSs/.TDh0°ÇåkéBú!DxÞå"ÛÏ›ƒá>Ò¶¼ÏZf fÅtØ=m1ÿñ„ ÕÔOƒ÷O¢èƒðÓ¹ätôô¬2±%†—Sø$½£þ ·ãKÄNÒt/6 {/T(k}9âΟ¢«‰eZ*Ò@[‡\±/¨¼·:áOŽ@†‹´©°-ÕÉÙ^â¸7í§|({v'ýküÝ׈Ϥmh¦7þå<È>ÈÖQ÷¡æ>å-«ê7³Ôt©@û)ë<î–ÇÝß®{ƒì- Óãöµp rwGÕZØqvÕ1ŠÝ1Ï…ÌnP¤Œ„÷.É뎠Qô¹P¦íÓ„£ÈK‘¨«œf¾!™«À9àžpÝ´œó òt¿·BÄóAZõw}¢½)h X +#Š j?º~2ܽI¯WÈ+ÉiRæCù5‚ñœ§Cçݨ}‰Bæ‹F:¦WmZ«Ù @¦áA•Áâæ"» úYl€õ2±_2ìZ&™½›/B†= tÓ‡­ +’%0|@l¦nÈÈ!æ×æsH%|H´ƒÐÛî0XÂ>Ž{¶\Á|ï9I¸þ +E´tG¹ ‘5–g0Šô•y˜Kü9S!Ƹ{=[ÖŒVÀG”Ê’£†À)slw L.@Â?ÝíkD€PÍŒ6Ä&õkTUWŒÛÍN;˜^.=õþ.…6Á¸Óܹҗ¨G_]µ¶ˆÁ`‰ï` wPŠÑP§«L×à±ßCú™ˆòÁ×íñ@²†ÞÇXç`ÀÖE ÿ<ƒ½ÎÃŒ +&¸S‡ÈC;eC“(¯=ó`£x£%tµ5êHõ +"„6÷èqp[–eïÜKÍn²ŒœÃ’Å^¸®·–j5hT½“Á.kIïA/L&üÕÝåc5‹œèU<ßFÌß^Ï’oFꥊþ†¸÷\ó¿Ç1;ö»Ý_PNÄÒRúkDžUK¦øÌ<ÀoÎ3ùOMñþÀX­9¢·Cå=»©Ù¯(z?”xêXÐæпFýݹ8ÔQÉ.a‡"ì]§, R{CÎýÌôàöÜ °çkͬád»§ñn ¾Dá[F®‚n™irD²>ìjT[Uò+Rµè…kAG- Ôï"Þ­Œ<ê¤v¿9Ï:4ÒIÖ/'‹ÉU¦¯_–ç$·¿F!¼#ɨš$±YܦÕáÄU‹`翳¤’’­ÃU¡:á>å¥-Ô M(ÛaƤ J½ì‚Œ"ÕdØÉ&fò0\šwº¾—îëSœ émÚÐðÏÕ¼¸ö«&ÝS)û(¤OrÔ(Ñ@¨(n4ì¶ÀÃÝ+…TZÜUöxù;‹ŸÈ)h ØAÜE²Üb’–€Šž” ôôiM´ßÄÞýé?§ÒRÒÐb…ïâ׿=&—¤]&0„ž*º¸_#€¾Ð“CÖ¡½½­/Q¤ Œ–4¹ûNº3tÝ ·&k°SäDh…&ÑØû矧¬“úNª÷êG1-ˆg{=šÔŽ;ì²ylcñ!Áº È c'ïà/àÿ^  Üÿ¯ x)éÂ=§ŸðwBj”MCžÙþÎùvÿó‰!„Æj‘oÒôH[¸ž›BržªòdîbDÅÝÚ—òh¶Å¼¥(:uÖ>Óã3â…ÄŽg/¤6%ŠtѤ¡Iéå;öl90÷ÅAû£0)Ø5BNCx -ݪ{í ƃK ý3ƒœÕ°%£¹\îà”©êÛcbßJ§Gù”™Ëܤ:°íç¹:ÀÙÙþÑ…¨ÅÕEE%½Ð§‘ó`ÌEDµü2ôúñ@§m̨þààsŸRü+¹úÞ¡À?RWé½›žô¨:®A@È¡ôUàÏ«¸Ò,4MÓê +Ñinü~2lñØ÷ì¿?)ÜÉüÅÖK«Ø=ˆ(¾ßr¶vfh»yg®0®;5˜#¬k(À¸Uš¤èüÓpÄøœb ±RaQ œç:¨£ýùWaexÉ7Û°å (Y •¸Qtà‘tvŸ~¯¤‰ÁÜÔóÜí†*žìPæ7'ø°ç¬¾#Àl.ì2ß<Î(NÃAjÔiµ0Û`^^Õs"¦~¡íC„Ø=’Ý€š‚0öov%7›³=ÊxšWÜT—FˆW€–jv¾Tk íOªÕ‚›n°ûSô¢D\”w×N¿\êôPÊþ¶?ì6mtý;Ø˲R!DddOŽÎ Ž]ô°ºÊÑP1ê|}eF0ˆ7R#v–o\‘æ(|£!ëê r£¤™-9Šm†ÑÀ¡ÓMíwi8L)²qƒçwB+f{‹Ó@5乫7Aû³–nè(sŒŽ@IÏ ÔïÄèåÅ=¬,Œl3(…Ee´HmÚ¯>Dl&€j²…fü|ÓWnrï‡ôHâB£×yëÅüÁŒˆæ¥?Édú ƒq/¼¦àüY©Ù®Ô·6÷O¿s'xŠÁ8Aÿ$:U¥Tµ­ŒJTZ Ô¹} ›J…M0õ#¸Ç„1ãó'í6`AÞ¾ùÃ~û­ŸìÊ¡LÇ; Võ|¥·ßéJ½`Hâgý£‡É{ÄŸ—oô.ù“¡ñþ@ù¼¶Šs¬“ÏB yð+Ïœ;¯,j”,€[uZô"ÆÞ@\šY·†§)µÏª±Çxü9ð.Ä M£ÀhSÈÐýqþ„¦[°o*ŠÇL&p»õqt‡w:.Àºgj¯-,‰H–Þ]M·åÄÚRÑìúQñ•õ¢â²:/ðLt›º&¨à•áJÔ€wÐKó0ü‹ç¹B”VËdCy)êËiáÉ¢¯rÿ8µ +ï¾ñ'Ͳ!h¨ä:þÎ}ŠùúHÜO²ǘóO;3ú¾f ž íæ °®Û»·FJXxX#aû¡ÂuŠsB€éòá)ƒµH­|B +•æÁºñÿBì\²Î/q4ål™“Vî¼e¾)àÍ.0Ãô͹è ô„­÷ó”hØlÞ[´‘Ê›Øì¹ÓÈz¥®Ù”ÂrˆÌ8‡“Xݯœw’¢v’"cR¥jÒv“V±´’VÙ:á, +& u…]ûç¸7%üV +àóÉ_åµ$k1cÁ*åðìAm3 + ¥`žNl§02µ7wc4Zø]T´áw= ÇvØ$ƒãË‚V¬˜î¤@†L Ð}*Ìß(õ• ©‹˜šO°‘ˆ&¢ðBm28i²S¬__;m£\*<Þe’Ÿ–$À9KБ"–aØ *R[rU³;Ç$‡®­×Nf DÏÊIEè0Ÿ¤0€®›a(W„ÑhóùÜq$Õ¦’|MÞÿ#•°?„]§ýûûèð‘öµlÙèœwŸ³’ndb«TZN8ƒë —jɇ$qb o¯ +r»ç+O+àÙvänÞi‚(qÔ-›VE‰X£çGóáJæ‚°j½dWЫ#"L»æ/’&M. §¾Þ#Â#&Ùh+U»™ßÇ‘·òìl@¹>» +4¬ÛÚAüáì‚»%㽿2üš¤=‰´% z61²uûˆØ÷Iÿì—ñûßðciô8|÷(¶s¿—r ôKw²éwXõÆ"–*6&D1&²?²´%²Æ]döö`†=Ô;ô„Šb8~¤·ÕÞô«dj”¥¤'®vM‰nè0Ìœ8 çaY!ì)W¹ÂRI[±àÏC@ÈhÖÎLÌ–Õ +ÁQœJ1,¶T (Vs +„ÁÖòš·xŸŒŒpûÇáö¿JhàÛE_í4 +Ù{64Ñ”BMò¶ÚlãAч-'‘¨ÚÕöLo‹o­Û¡À›'y+õÅ÷‘í/rÍD1…$ŠRVðÀï]4d™ÊšºØóãÔÕzx +dW°q5ÈÊüy!Œã.ž¹r›D•Ží¹Ë$ÁŸûÜʇü!.é‰x\ Û«<…wo?HoiAg÷… @ºm’~Sø›]–§±·¹OÓ`H·<ÁT›Üz}ZX÷8ÏÎÇðK´*?E¬Η4Ùûô‹§¦ –ÃÇî'Êúÿ~²SÓ·ï~ek¥hŽßUá@ÍÎp}ûRa¶sžlTlŸÒVlb!&7VBêÙ;)»¢Oçª ‚¨œ¥6-œmÖƒ0RŽžÊ®’Ü ýýù"¥É¼£ûìd¸™€I_H>6 WϦ°€t‡<Ïöšg“:)þ»Ï‰°Wâ@¨<'6ÔË?MÈìJw°m·â!—fÚþ¹@ÈÌãUØ“{£Ï ¸SéÀù×é=ÿ%pp¯YŒEwÇÅšM»­ ñДºÓRêlçº|¿\wžF*0á1¾-·ýó…½#>bìßÂ{b4¤%¶P¨ŽIjB¶Å¦ay,ñ \®mï}£è÷¸ý°dâÕË-ºÖ5ø‘¤L‹«"¯˜Ç†},ƒ—EçV~žV šÏékǤ]dÇ ³Dbh¶[|]ñÓ£GƜ؊-°‹Í{³³€w…ûUBL?œuí}pQ€ã òc¤%çyÅŒh• ämßMÞ+IqK¥~h9èJö± `hçM<¯85ôfÛ<2$¶¬Xë¤zS‘Έ4¥—€yˆškÍ’Ÿ +Tã^,öµG#‘\vµΆXîÝ‘0Úa!wavvPeÊÏ ÈL²*ÒÇ’2ÛÏù|༷,þW£¬7é´sƒë»Ïv’v¿ÔGM‡™PÂÚÄÕµb(J¯@~5ùÈ«¹f i„°D| Òyº¿YÄÑ1‡q uC`zíUõßßnWÄ®®#vU#ùIþ˜AÀ:ŒB:¸J,»Ï¸{D¸Y"`伇;AÓ½íæÇÌcîA!‚/™æ¥ßõ#:P”$%>¹ù[îk:(z¥IÈ Ù<¥ùEMö¤R¨7tÚ­Ù–„肃òW¤`ê*ÀèïjW˜‰4 +8Š$¥(ZÒuŸÇSW%†W Ž¨Æý4 +*‰¢ÉK”ÌÅOTµl(ƒ@*_‡­¬`4G¨ÿ¨"ÕÜ´KÎx|@ u£CÊÍ~P2×H³å9‚ÈÊb-vvîh|ì1{‡íxŸª?Ý+%ÖV=:Ü®‚?`ƒÍÃÝWef]E“?‹[«*¯rˆ¦Mš +ÐBؘBvŠRáݦ„Ažò[°Pá¼cÂîA¶|aªrúø<ö6"¶ŽZ:e”AuIð¯(È爨‘ +©G¯B4Oý\Ià»vQc¾âÆ/W€%=j(êæþ´ûü´êë^\hÜ‚„-¹Ð•›}ÞÍ;Ù@oÑÄìΠlQ¡†áA¡O‘wŽ+ÂLL_Òè~u¹H=ó•í.Vœ5ü~ŽB®8¼U‹Uý0µî»>ÝŸvò­Ðå\2R5×›0kJ¹×Ðö‘¢i²ªÕ‚Ó(É^’d­e¨Å¶XCoP{hI‡o÷¾4jfRs%ô©ÎÜã(¦LžÙßµ(t™wç6ªË“«µÍ“âï¼J‘GôYÐÕ õÍKÝÎûÑpŒu´Ý'[A_êT“Õ®“Õª­vŸ¾HÅœº{šì6#Ê“ˆÈDáúœÊê]Ñ>ŽSË£‚²“‚ç®Ã粯3®#kY_F2°èvt¤¾µ-<~ ŸNŽ†D £{–£XBÁëMc¡Ý«N†á£ªü©yWÑZËf¦9 +–,2í¡fÇë8#3Üã\ [—iÕ««„ ´‚_ˆÄÃbŽ7X‡¯MâУ´¥&~ )¹¢µÅrreÇÿû¿‰Ëì-*äÓ+îZrPuu‰÷¢€ä+µ:#©õ}RëCÅ5dÔëÝøMµÛ¨Ð´GµP›Á®=¸NÕ1»!FÈ Z‡É¬|Ãt©V†N%!—ê˜ÔPJæÌiÚÓ—¬P‹賚òT¨xý‚¬á,=Tc¡LVNÕ"‘Â}{ɾä\5uá¨Æ¹îB ƒ_fꙶá_’ïce®§*’ iáëÔZ¨Y)|0s¢`Ú_=x +,#”Æ +iù~ }‰ñéÀŒ.,x0IÓ]ߤˆ¦è¤"Ãw <’”-öQÇJCiw$‰®TKòS÷«¨‡´Õw#½wÔ¿‹bù#ŠJq"F"ÚõFÀé âs%9+û·‹`%¤¥óUûy%ò/É#êÍ( 8vÔnˆàãªQ¹Ž°7;©~ +=a‹0Á&`äfñG{¯3ªE¦X‚–]9K‘4_ v-»£7 ÚÔxÔa·hiVe=èHÓ/þýl—âÃAŒ n•ÉOÙ}<$ÀÅ•Dð ™e :j7žnOm*YH“|˜K·´ÝÊF…¥¡×äãi ÀøtÚbhQMèÏq؃|"ÝAçç¼æx UÍ_âåµeL)]MáòÇì¬TŒ?ÙSPçôö0…»q}°fÍj;ãú‰pÜ»øz1J/¡¶U‘È¿âÁÙh/·âÈ`Öoœ,|%,ÐÀ_×­õY$åKXn™XéxðëlæOE:–»VÍaª·Zžâ1ŸXaÔŠp–lª¤Ô¤äÙU:¼±pò¬qžäžžY5H°¨Ðíêí{OÒäNÔIkÀñ*:"gC‘Ä:µ—lÍuæªv—ІE]ËY÷[´5Éœ×"¡'S0E~¾ƒ\)ÌQòG©â¤aô˜ ¯øm¡Š‚za«"1ÀÈùEOP`Sª%³1uôõk¦ȨRbI .Pv2{^JŽš}€tlÁc-•Î…Ø9çt¶ó}²™`.Yý&Z~Ø¡GjÀzGæßL£bO5Ç.jÆñLعKϧ}K1èûΙ3æÁÁ/ÔfTâšy/å~z(±YÛ#Ò³zô”u§²&ánçÍbÂ8¢P´Œ™P…â/{nÙ{ÿþüQ Øãm'HŸ ¹¨ì ýí®C!‰›B= ·:±Ž)‡Fžd,&DDyôQD96½ö9ÊÑód€8¿® ˆ´)‘ëZɳŽ…@1•Ì­ñ±ÑAg¨çãÊ⽬"èÄÇ^ÂŒ–Ux®tTzÉ©ÙžŠì! +ÌdÁK»ÏR¡ ôc‚&+]ÇM¿£K…v#pV¬À SÍ™*™sÔùüSÕRñ§J8gZUéæ¡Pŧ~ÿ¿Ÿù] “A×bpYãà«)¡ÒG .ÂtTZTXlZGÄ'NòÝYC¥s>¢Õ›^&Ÿ¬JˊЮPع±‹ò¼Ò +TŸ]G’xä¡‹§^`´VꯑÀYêïý\Ü/ØÜÌS^uEØ Ô-tÓAéKduê7¶œ¨r`m¢P.oi²w£réؽd^«Q#9{Þ9|…à wNn³ äª×KïÞHQ])@7k®iÊîŠ~þ3z©0¦Ê h ò2`w0ÄÑy8w”4ý’CþÓ1›D)ÄÍc}Ø".ά¿ÄPô3å³ãòªFTËÚ…KœXN5.[N€n¯°¥pFËh{l²ý¢H[om®¡C*Îôu%Í@m«)$8„_Ñù—;ÇÑœ„¥}ÐÝÔWT{J̺¾§Yw5ÁX÷n¡dŸê`WÏHXs›Y†Áî»C‚6&J’Ø‹¼¿xýh¥s´NçˆÔºŽ”Æ'§ÉƲ#؃²¡@ÚRfšÊò¹E>‡,è{S@uÆzD…F;2'Š1¾”:L#‚ LŠV—æŒÌâhjY­Ð´€èNYýE ¨Å¨{ú…e-\‹edA‘ÄVÀ5Ñu´1`wÛŠ©çÙÆØû+k‰(îk;š¬?Ùª*Sq%Ë®h¼[ëz¤ »`½9P * ^é #aÈ䦹w)÷´ÇNé=8úáŠVñ4a_1+ÜQÿtƒÜÛ­*Ÿ<¸ÁÊvJ®M-It©<Ï 6Y ëlÐj4U©tâaBS¾ +Æ|®äO¢¯yý)6ROÚþ£ßÇDËNóuì/p=Ö Œu7ÆóûparìH HçJô Ý~TÁ74ÉÂE““–W•ËÎàó#ÙŸŸý d|"çS•Ëj/ét¿ôÒ‡ 9•0]á؆E—c +i‘¥ÒB/)VÖ“zÉÄlîóVfdd£¶°P˜Ä†æÛu1‚jcèK¥»`þ| :jìÛã†t=Rí÷Ðã^ð¼èµ†Z_‘lUý½ ‡aï¿×€LÊ—pG-Û%fFlñ=¿íþW÷$©© +ö˜žÇ åžïî{ÅÒùfGLå"Z}ï`g·íD¸%™X•Ï•„É¡RϨ#¨Rj€ç)…H;ÿý ú X‰·f‹ÿ#vOñ¬$uv ™Të¬fŒ +”1íÔ0ˆîã£p´¡WÓ/z•«äÁ½Ä$æ—{J‰SªÉÆ lFIÐeA¯Av1}¡! +{êsºvL"v*:PÕ¨œ­Ñ5$‹Í(Hày7¬YÑWd·°W6Øü¢¬„P“u½¢h…ßåQ¦HÐZÏ2$ÿ”‘µ‡Áßý›páîœkþÂ’“_Ôb£˜–¿VeL¢I„9©|?ÂáÉZ¯¶½äÆù!úÑ +Ž~¡?v>›¬Má‘}ß¾µ„{§3¼ëy+˜PµdŒ~G¬wå €R6€ê §} +‚T7×?Vø¤”n™¢\…ùçAP{è(k5}+6©À©Nw¼WJ%d”Ö'÷â㑉^vpøM±Æ§á$›=Õ/Ôˆ`†<öiÉöÇ Êß~¥ÖGV3"Nò`÷nËî °NÚ{L”½§‚;y Œ-­8TḎ +ÇÔ ‰‰U[!ôPBü?œ-­´D›šôÍÖ8̉XKx9¶$€ÝØ\VÖÃà÷k'³æ0P³ âíÙÌ´x›ì/¿ (`+ûèþI[+ú\Mý¾®ù*… ÓV†Ö*®p*’cLpha¼*!,bû÷§ +èà𭨧Mì?èßcÕÓï`LöÔ×EþQÑy”ÿ@N;*Ç€/†Ê¿ºõ£ç±s¡ÍèmÔúåô`¡Û"õ<}6Ùž_ ó ¦÷·þ»ÅÎþ¯>Ñ_0¥ÏÿŠÿûÎ^’ßýÈ×`È[…‘¡ÕV Ý +ŽŸÔ(_‰‘Áçì<Ž)Å ÷/+?$BãlˆàÛ¿ô+Í´J`ú ð/Ž.ýÊŠ,PŒ®35˜=v‹‹;Ê~;Ç9íyIT#?áU­5ßÊaÅçLÔ­} €­ww0Ïc£:o"èÕxŽšs¨5G¡¼Œ|î‡ÎÃŽ*vM)•;¥"ný¹/H‹e}Ôç\Š2Å Œ¾°#¨%‚¼œˆë]‚Ëñ~Q2š®ºÝsÿi 0eö'3 \Y2¤0îÉøÔ©‹äé±ÃMN7²…MÄEôgü±T ’QG1C*\ª}5°BNBu N• +g¡ß‰*m]\Ür%JÁˆÁ±ÚêhL„>öb,0{¡@NZmêfG«ð +ᶻòM]„8‡8¢¢òÉüûÉŒ*#|]ùá{½éÇu=*=Sf´Tíãщ׬¥ÎzgF)Á aäù)û¬òÖ‰Ÿ§†ÉŠUƒ`šîî;÷" ²¹§ããü®Ät÷&¤/¹A-f–Û‹={4>\§(]v€S.KÐÝ"Ç ˆOˆ ùDýá•ŽxÈBй<ßœÆj(Y8Ì’NâóUï"óõ×€ ?äHÃ×ð½Ì¯AÝ•Ÿ¦0¸¦}––~M¿_ÏEXû•+•Ëê>º÷瀧# ¶¨ÓbfRxÿJ¤TÚ IE»µYQ¾å§Ïc]ÙS¯øŸ÷“ã ÝNzg:D‘f£håÏÙ]ÀëaÖ àÃþݜٴuÕ§¼1jFï42cØM ­Ìs½€=Þ«m÷Ž>lbî¥ßÅóÐó$Ÿ'Âÿ‡¬ÚO”9ÓaÜ9ù©Åªs̳ôû5âPV—åmß—¨ë€…J˜ä/éVÏwZÖAhˆÆQÒ'N˜*÷ÿòï™Ù^Ÿíý>¥Õ}ùkдpCcnžÐ1žoÓÅv ˜îG9ðk›ëÀŸt@UÑf¦3f‡u‚ë=V¡qB; +HCGÞpoÌïct%Â~”W”òª#.,ƒYŠRGäÀ ˆ¹¤’v±÷›—‚?ñ¤~s§çP±–/-$–‰N dÅ.]=ÂÒŠ[V¿Ù” )g–¸IdÍ¥©t@뻲ÂÒ>3Ïg,ÇŽ©^whh/ñÿ³ön«¶,Ùyîìw˜—ò¾(gDÆ!óÒ.ŒÈØøÆöU!JeX*!—~ûß÷Gö±fïCZ[PkŽl=ÏÑ¢µÿ@aG¬÷ö ÿz'RR-²Õ›ÛJ °‡`,x u[C²ÁÒ¡öè±KÈ$âœ1}ˆ’}±ý—¸Ë½Ü …H]ù9š \@ ;ÂUˆrÝ6xù…öçŒ}EÛ8æCÿ¶±)ÊЭÌØiÎËzN`3¢ ôsîM˜¸ŠŠJüµ”èϹNb©³Šôiñžð­ik½Íà§Ô Ç°íQ¡9ÚÛ4÷Œin›[ÆÅötåqœ¾â”´Šø§}_i¾lOC͈/“ÙvìzñéTWñ4Œ±²Ї£'Ó“ëÛz%‚å‘íÜt5û@÷u ’5 WK6xoWåµ#ÍŽ)«?¨tçoÓs¤{*Ž½»aÌùED ©©ÜºnZn¨!ÊîÂzT„lú&”Å%@W‰‡5ËZÍ5aqªI­§A}0»?ź±ô) zùÀ‹IlC1”@šß4Ôò"›-;[èiÌ1©áUG&Qß3åÃ}ƒNý³ˆ*ŠÒHŸ¼Œ‚ašßT©¡ô•>uËËãÛ-ÀÖ´/ª]t0VÄù຋%ðuâ9Ÿ Z@-kdÉðfW^íLk>𸀲—d¿}<þBÃuß³;-ia FÆÁ·ë+ …ž…n²ŽfÓÙl®wc|1v6bþµËg‰š;ê~¸G.™#uשÂPÓšBÎ@<Ûí5w¸»)ãþ³´ui°ëÅŸdHû'r@­+ô€‰ Ä Yga ±îÒ’§Ê[`Àû²eÄBìf­xDz+(ÛuÅj"<¢ˆþ™û›B™¡šË‡X‰Å!qä=ÂÓÿp/|Ò#³3æ [Á¸‡A­µó‰‰¯ÓÚ£õð¾´tøÜŠ;4d“[ä”[ø µfZ"bN¿O+íºž¶wùÒõ1/C3§íÝÐ-7hε½ùzQM7ˆ¢Gá¡ÁGÄUÓ˜Z/Û/-ô~Òadn‡‘çQèÕÁ«7ã6TCÖŒ-|ݤ‰7q÷ñÞž+"gk÷7At¶eðÜTÍYñÎ3k³ …æ¹Éÿ¼×bª:ÇfUݽŸ¿`¬çV7, +³šˆ"íg>[ZŠsÞ ¨¤.;ãk<‘só4 Vļˆt¹Òº½YÅêY8c3QÎ<ƒâ…‚Ç"t=G +wç†C—ˆ¼Í ˜¼”ù@Õ×hôXY‰w‹_Ð`8wASè¨\DRµ;À”+ZR$F‘ŸpÌw¼â?Eä¡´¸œA?‹äRH“¨[´ßè®tu“zÛ`ZwÈüww »Bi»()ç¦TôÐ U EŽ*Ž}g(àkT+nE*N +:>(µxÛŒcct†ªÒç<âƒ*žÐÚ˜ízí?¢Z¨Ro—êë,¸7v¥>‰+ÆXÑ0¤¢»:*­y"5O¤oÁBhï^€-Pϱ¥íÂÔ±®ܦ­TÓ>vN' JΤ/¥µo"jݸÂëÀlS×?¢®¼²´ßÎ](*Þh¼ó 7Áçû­­d=”c.¹ñ;J•Úõg æˆÁ ¹á•û’Ö,·@´£m°ÑÔônOi_¿ÝC°k´ãúÃIMõ†šqÄ^ µÖiÊj6›s+'!Ÿ¿ºxšnö†€ä7ûý¡ñ®o¯d‹ÌÂ6Hæ|;7¾¡º­l½ÝMªû¨ñÌ…™*îóž÷0ƆNNIÛdc+C£üÂv¾Åv~ÖXÓª¬Í¼RÆ=^X2î¥F® ÑvùwÅôÑekMkr::ÊJ­è\?u™¶ îÑõ‚Ò-1‹ÞïPýbôñO»~ä¸ý¾V«Å”iãi »æYtZ¡fùG“Eôc0(S=Ö> šý ¢ŒC†‰ó)• LÞwÄLDoÏf"DÈA&MD¹_VMÇ:Ô®#úØlè+Ħ#¿ÞÎÕˆQÏü¥ñú¥¥#´..ó‹$½ý-’Plfª3ó\,¡ê) ZþÅŒ’›(òÌ'8±½³Q(¥ƒ‘È”G+Mªg1„Š¯îÒûÓ1•]ßôz*ÍwÇRõzw¨ƒœ»±7€«Œ°TS6EðµûÐCh¶q‹š¤×+jè#Wê`ÅðÙOøï{Œ˜-Ö?ýûÕ{X¿p[l¡,‚ïû&@›³ ºü•ó×!åeUàóŠ¸DPæ©ÝÖ;îŸC6Uœ&+ AÖ=àÇ +Ë NGH´vZ»Zö]Ÿy͇ê”#–Ÿè“]"‘¢»œ6‚ÁA8Ú¥1ؾ‹Xg"q{%‡÷Ó1Ê#áwFc•š3«ç&ÆE¬©æªœWðkUÒä'#ÉDÂ]H)ðB©"eö›ºsè ñ ¦Å¾ôã‚slÿ28WÀvÌ5 ϶©'ò3QزBÓ²GÔd³¯tWT·UMÔÑ­‹«÷ƒhÔÎ ÝQ®Ô‚jL“¦…Gò"¬}ˆ\IÕèÂÜÎœ õu2é™$õ%+9@äAn‘àòS^;" eAè”R7úê©\Çv]„¨ŒRÖ)}Èýâô…aÚµ•þÈ çlÎH;eMæÔMX“k:xtW”,ð¡tl6JSÃôlV€W?´Ïr»-¨ãÞs›2Ò¨$b+¶C¹µÉtñåt…ˆC îiÊc%••2SÓ¦íªUy ØÓ†çIAk’%ä4ƒ´]å_ždf&´Þµ;Š3¨‚y¶²Ü\ã]èñcI_#ú±i ý’\W£ôfëÕ¬ýØ LW$ëx…Ïý•g‡#ªHC%w×#õ,²òóçðgÔOpB !=?A°H“ö2S—“^£ÐFý&וbÕ Ö£ÄùUϹFµH&LM§šæ›Ò)…š®l1IäòÜ0²áeWJÆWÅg~ósý;›kÅh2 ’å/6ôT K¿xwfø4S;ÅãÎlrÞ†qÖ¼‘µu…·7š [qüë&ÿÇ}¯]î±­B˜|o{-#&#Sgöö`XÙh²Âßx¼uWktCš •ä]5@M‹¨6݉‡­sÛÌ ‰¼Q>Ëët[Öiu™’ä[ÚÜì&ñÂTŽàÁô 7fĆÓû†|1ïIÙÇÏq©Ù2øSŽ??F&ÔŒÐ.ûŒð)ö<Åæò$äžq¢¹îÝçÙSEeÒ¢J˜¤'Šzn¸Ä`®Õå³_Œ)Z .PøŒòŠLS2Ë@dÒÖ‹£0Ùïš7Ô@7¬nÖ:¡F׆s_«B¥·»´›öMû#¢ö˜Ýè<Š³F‘¬ßH^DpS¿WJÚM­{Kðžÿ*SŽ—ùx` 6UG …c>Bk}½û½½¶=æʀ׈° TÐB ö‰íN oÿNIîÜË®v É¯dûÚÿõ(ž’®1²¨Âq=ŠHSñ€w!ß¡ƒƒZ¶ˆCŠ“g´U»>¿^ß…êÌ…gçЪ</Í…\$Ý5.U¬·ùMÄ,úg¿ï!6MqÌi„%Eu¹NOÁqMÓöºÖ—NÓç= 3ȹËÂUúg”2?Ô‘ù±ÙÕ[üfHs«Ö/<Á[Ì›Ä6ÝüC ªaGÈp³l+u°%˜Ÿ¯D./uyðÄûÖ +zt"vt†FüàHð2 )Þl:¶7O¦…dÔÌÆ%© JøÈâÃý"…AZ´ì×̤O-}‰`éKÄK‹ j7ÜŽ1”n´ÆÑ¢FaMUDhýå8Ò÷èJÖíê,¦z}M…\ÔDŸKú»œ ñÐMF›"­nû±Âr@ç€9ïîW¿Ù±Ô;0^Ü’©[²fõ2wW|¤+. +Ñf'ëÄ^…{W“Šjý<6¬C㨂îù‘ÅBdõ9ïû›ýÀ½•´:¨jÛµŽ`(¬°D w*‚!¦¬žš‘‹œ|J\§&ÄPg0·sHÇÚ=Nìß|]æµA QÍK5‘ac(ä&ûqx<]Û—žý„Ä_ùPUahfi „éÉ6§¢¢G¸Ž¶Éý‡°§ê펈P}]¯À Ê—å—‚ ×7ûi[$i-éŠ2ö¢z/+“–Ø7¹õÄq?•(ÐýCûaI¤m*¨ÔJMÏXùB+ŠpI ú;¤ÚPÕp‹ñøС¯UQ£Ø·£„! Üu7œÈNÎN¥RñÐtðGŽ£¹L÷Ò“B+C¥¢¼Ž£ŸNX¶.×ù9$W~NG2¦CÞõýSxAf›"Ä-óç¸|‹/EOi„õ«1D£wxb$´LóL¹µë<…/œáŒw¹èçÔÒh”è¶_”‹~Šj¨[¬ÝE[.«âAÎ2C3Ъ\P™…¯™Y›ó¥Éx…éÇH J„ ”q²`…-îüRB¹¤eq«¾³J*Ÿ³ljÉïQkÜŠ1Ú7Exö+¦{W¼GíÁQ=èJXX3f7ëvÎíiз§ÁcA߶(½½SFÝ%’Ì9±GE¥"á‡âÚCÖÚ÷kÔQóGCÓ n‚rþŠã®otŽ¨Ã$püUݸ[€vʇƒ Eºµ¬½X +j# Ê«Üüºu:È‚o4»¤»!¡l5æÑÁ¤£ªÒnˆÏbG&Úê~míXÔÁŠÜ¬ú^mõÊšÚ‹ØðñÅȧÚì?*Â#šÀ·+¢5g±¾_ ”ˆ²5oBßh{\é̹ ÏC[l4±XÙ_¤Þk6¢ÝF´ú”ÙHñ/ùY=BM×>ZÙ]˜{﫾®?©¼}­¼­¬u.K kUyš?jäÅ®D@X,ÐG"„h”°š=õ€WN2BÉJý³Znö™‘²n!"÷§"V…¸…ßVÚWädÅZÈÚïiSUš+Èæ*¶Ï +Ö<h(ºR'D~eˆ]IÏàTAå7¢Kw"îÚÂKh+ì|»‚Ê¡â¼rì5º¶-ÞxY'\Oc]Š¢†Š7SPT@¢: ñõ,(wDù/DVî€ÜEvu%QsÓ(*Ÿ¶\ôIHTÖ,p7äïŠ PÜ b¢lë—§V D„šÑé9]¯ý;£Q¦ K}-*©Uôœ'.:D¬¥^ †EËÔÏ*gÀ¸%ÈIÆÞý猄®@Z B<ü¼*µÌ§mݶÀúphþQðþĬa-æFçówöZ,ðC´¬ + ¾~£‡Âš€ºˆÆ”ŽŸ^iúø>_-/èô²wÿäzýp=.ÏÚ ‚î¬õŽè.^ò¬Hú€ªAŸ<wÐÎÍû¯îdë¢WbqÆž¶¸cp7kpŠÛ!è^uù×—ôººËtËìeäµ"3•EËÏéFuêWD¶S +FÅ3òëÖô}D4L´+2ÜGèD\ÆkßÊb›6!Gw7¤¥D¬ß¦ª õ¤P'¢C@눘µoô¾s¤.ŒÇÜÝ·™®Šw˜6•;md©Ù„MÂ,ÃÚñg„ ª}Ýêóy&QW”¿&=’ÎÍ«ÂèoÄÔs€@¯XØšQðH,WÓpì&áS„á=Â#¡Â‡3Åú|xÖßìG ÖÔŦ1t:µfoøT~ñÝ{üÂtÝ‹Ëì3©Äž˜h +üàûäÍ÷uX¤ÇÀòÊ X¨f´Ì2¡n +X£maí¨¥qëÊ’ê£éIªdñŸ¼ ›”2XJÛ˜Ö¯›^FÔÖTä£upzGÖ> ù|@)–­FæÆK³òÐÆ8ÓÈ Aˆ]4*µ¯ñmêúH„|aZˆÅXßDOlÄÄFÈIßBE˜¢ƒòÊs|}uâS +ýƒ¸o½Ed}R*®ï²S‘þf?穦’ÖŠö@,ÚrÇ‘ã ¢¬ÏyÐÚ¦ËÉÛ4e¨ABŸQºŒRA{@Ö’·xEjgìQ Jå§S(•oqekñYdv‚Á6ëê¨P´-"ׯÊ?Y¿¬á€FÙ™Ž*T®°.™€·ØëÀÇ­˜öæ8Èw"BCõ›ÌÙN»ÐztוçÍû駈.¨÷67˾£t×@ÃÎÕR¾=<…% ·ý·•¯Ìk}Ÿqý=MíÏ4 ô"[sõùÍv3³i ‰šòž÷>¢‚Ž×HŠqµüˆ0ðµÒž+St&´î[Ù§Óéò‰Ômo¹ž˜³2;WM‹ß÷‚™=ý¹õ^]Þ.Ó-ΣÃÏü È¢/{ßV•VôkÓV´<@¦¸„î¶r`rt›ZøŸiÛÚÊó~Æ«€fWêÖŸå 8³±Ûí«s îàÿ»¥Pm*5Io¯ÃX/l‡=b£bŒØ*ÝU÷íäÆÙÀŒ³ëÇ·RÚfÄ)§è ãé@Û¶lϨû…,&¹)sƵq(!q¡+ÂLtƒ¸ÅÈ-"ý²ÆÔoîí„É„ó¤jQ÷ˆ¼ñ­ØÕí #“ÄEWRª½´ü¨ö¦° +¢£äŒ‹P‹÷ˆŒVg¨ÀçJÑÅ!|ì‡â‰ÅluˆîŠïó vü&ÙZæSò ±ÙßDAÍ£÷·úÊ›Tº¾àMφåÑöànztwÖR+‹üM +¸°õ"l³~»÷En—ån~¾_Pš+¹øšœ¤PÔô¿{QT’Bî ñåÚrLR|÷q€sïFFfÁõ4ô˜äÖe dM¥¯R®»Ó LCŽºÜˆÖ Ÿ•Óº ÔÛ?ý>âŸ^ƒÇ&ÊÒEEª¾ì—óñÉ𵎄]ëßaW•# ›œtk‘Cº …Æ‚= ×\ò´à&r‡Ä™ ¤4w«ÚPk5©Áåqè Îö~?Žp4¨.bÑ̲ßÖ÷ševèqȧã×öÏ8|-CòrÀŒ¹FlÞ:#¥õ(ò¶œ€ vqú©š©|jã@+[:óñÑŒÖè +•ÅzGï› +}ìIn¢§.!?~= z z,j²ÞÂSÛQh;]‡É5=$[BH+ÄB}âÂ%Ή¯‘\tÄ¡P¼tÑÎñ¢p¹n …B’§Ý~Ö —‡/%bxOBº¢âyº–)½ç¼§2¢œ•Žíˆ‰þ©hŠ*ÒÊ#–ñÙÅWI‚VÅ)Ø {ÌDï'¹b9­™jS×øPí™3¸e{Šê¯û£‘w1DÀHâvœF[ï+Y7€ÄSí· +PÌ +ΩIßA#åÕÏå1SisÔõò®†$ãx06ÇÑΖ­˜‡*ιmmcöoÀ·¼ÀóÒºkÔ½20Á´ùñÉèPMþñ\£¢„vºØM ËF2%#~†–?¯×O1Ú7ß±oƶ&~Ë:S£\uD\v¼ÎÆU$à¶:†Å‚þÙGDÕ·~ëW2—oö³VNp£õ¿Á4 +$¯åEù.‚¶p‘d©Âß>Ò{”˜-æCÓŽV îácܺ°+-¯v±}v~F<ïÛ°B¹e3sÞOÅŠ`ù}ÛŒÑßzX’%ÄÊð‚lò§“yü‰k†"UØè±ÁC”l˜ñ‰8Ô¬¼ÕÑPh•†ÿúÕdœ¦÷ÅAMZŒ¢*Ñ®ZýÈÆga<#Ήc§»ÑfMtßA¢Ç¨±f¤,I˾¢dN%RN9P‘½–d­[•¢ëx”±^Æôž/ªŠSàâè‹_Ïû¦ÉtÑ`õüŒÈS +üû›Ÿ7 %ôã%Iz¬¡1e9¿ ˜ú±Bå]‰Ê³ÿ¨7≠­e0§+#tò¤H?à8µÃÙJö¯ú‘{ÖŘÑ]j}ë8¿íçND˃3gÜœJªÖßD€K?x:‡Ê>Ò[”b»ú'óäµ½>$¡£‹ß¨¡€ƒ°ÊTž1Òê}A–¤~F<ßhJ„o–Ÿ÷ƒ›‚ÞEx` çóÏ.±dëb@5žZç{ÔŒõ’é¨1syõŽ:kn¡E÷†G‚°¿Úç°Ôõ‘[v©¥äU‹ÊÏý¦JŒ¯¸ÚvjÖwjv'Ou«¯úƒZ~ùmW‰J:¦7aÄ÷^ø³VW4>ÝËÇíS3B•VaiÍàÞ‡E5[Ïœ3õ% +aEGè̃|6öÅÂ6ňÔw7Vóp™ÝGï[Šv+HðßíøÕîv.ô©0¨œ=€ °‹ÈÄvS\aPôÓÈbJhÚ¡óøŒHòQä šJ ûØEID7’žBÐÕbé³|q)I<£_¯„öç(TO±fØÏ̤wˆ]VÔF– Ð¹”éÅöXf¡þÛŸaŒëMG;ċõq÷§¬5vú:#"ðîÖnòd°ç£áFóWm{ÏÞžê[G!»EéÛâ[Öˆ +ÒìÇ~^:‚Iƒ +/+â¥û&Á• „Ó+ªö@¤8ŽÐ‘ÚbŽ:ödº’ÉÆÙó=LÚiˈ¦å~»>¢Ö,¹%¶ÖXÌž6ãh=c@ð‘V +h¶®Ç©çÂÞðzißóHïñõ+ZŽ®4®šR0^F¬¬»`Æ,Â%ѧE‹u驱®´b“JL>ØC„´Ü®XÖ{6\{âgÃò?›¦ÕNÝ…V´Úš¶9žãšiqË|ßþû§™‘NË÷=i¡0¾$T»f¹ïá#âÛ‰ñ=*Ê&—’]<‰µŸK2àŠ(‡Â»¥m»]jU|+%6ˆ+7¢!ÔcùxÒK<é6î>Ó1Ÿn‰º‰Üªó–xG6¶öslå´ +Á–ýÈÖR§êb¿¡¦6ˆé”}M ¨d¬Ñ¬ÞV&Uñ·58àÔzÞYTIª}âµ×µ ±ÿ׆²˜tfèf@;¿¶Uhçh ¼eV ƒô&:-fŠ¤˜u„ t)š—ZXÍÔåÆûÙ¨2LñŸŸ[-CŒÉŠsFòDŒ'¢íˆ{°"bŒ×K¡©Ø®hæ&u½­)ºù$᣷휺n„Qºe¹32-w\ï­J™#­$v=Š‚új/=©õỸý¥N]´çGª„¿Ÿö¶CTMY¤LÏ`¶ˆÑD™í(s¬í”HG"ºš¬´sœ†³ÑŠÀg*ÇŠz¤`óGP.*=›âÏGî ÖSµUv~Á{È/ÔF«[ŸbÜ–à«8a·ƒÓ_³Ö´ÊÖ‰´öÒ•+¹1 ,¦ÚýD„ƒw®ÒçFÏQ§¤ÅÇÏu§Çã¸]ís½QÛ.*x·?·JF&—mD̈ˆKhäuS`¶DïXgPžU¦Q'-~W£D–ç,¢>=<6ŽÔÈ íÊs£ü…PtókÜ:ÕÙ†SÕváu(òò{t½êžŸÅ+üŸA]ðµÆ—|#Š¿_›gcô`­Ò±¨föàG°Ìã, ¦Fº—t¼+ÍÑV?þžÒüVÂ|ÛÆÜ*éügrûóç3½ÁžÒ³ “K±¸ô\ mû)ê–Ã4#c‡¡ åŠXSȤBW]ηˆ<¯¡ÊÚua…û±Ÿûúrxî'Ð5 + *"Ϙý~0ÁkúGà3Š~§#Rlôï%°(Æ£™ÏûI¹­D:&Òçvw¾~yׯR™ß´¹ìÏhXö‚$#Õ!N³»n„¾5‹)"dRïëéôÞ;QÕ¶mZ·24øUÑ›&â²uÉŽÖvcÄvƒ 0€â_Õí-äôõµË S”( wÔ§$)‘CQ`½úëïÞ2”ÖT²ÊTÜ.ô)öVó=M?ê²Ô>#òpÞÒ¶Ïý@ÓOv"ÅÙ=%_lK‚©~ð%hû%ØØ® ‡ l/¦<º«žîܧ Wi”ˆS\ÈöRþ:0àÞ‚sPé-â÷g÷E—˜o‚„D¢ nVŠ Êæ‡QO1Å4fyPJ[ÄâÃýÄ’•úºé8à ¦H/z‡uÄ• Až©¡\î©\î¼7úá3Š^íúu)i"Ôâ ¨  Ǭf*ëå+*å¨%BߪãyÊ=l¤$hÓ(Ö*(•ŸäÙW\QQ;%|áFz\‰œ¾"¢h1î-‹Ã@ÿ:’Ó$®ÑêU §N)1º¥oœO_·È“Gõ ML„Ëé¸Ã…ÓJ€ˆ—¨l½C²]_j*ê…É\³m1Ò¶¢¿fÉþ óL|²qžißDÜ]†&*:û¾»?E¡Š¡A4†˜ÖˆY§åJ APøëŒj-cˆj¿ß¹’ +ä§ëúÍ~&ÉSPP¿ˆB*¹VÔÕÉî=ðö‚$ü´-º–5º–Bµ`œ7-8Ö nAèoÐ7ÎõyN N¬^ú1N¼G¼FH+°¨O%ßÞ÷ƒDÌÅôÅð×£u~èÝW§ð³Þ·x¸÷¹owËí~,ʼnj°8yÔå=C„•š ;"(ÐA³R1+œ'€Çºdbs¬5Ðp’°]_Gʈ½[oŠ§ÁgXQGÙgŒì?“Í­"§œIÖ;%ºHK÷ âô€Å>i <«ë™ ðø јB×”þ,ï<  èÎnL=ð:qhÏ~ðBç®´`‚sœ· åx{‹/€±9ö"{{;Õ«RH^Y +X/=í€,6¶î'äÑK¹¿·½ôPŽö®ë"î€(z‡èÒ`éGºC) ó,•ñ•–wʽ#MÜš5­@oÄ ÚØöéšÂ X“]ôå•SzR#æÃ[j1afºš’%9½1Šd'®¡[¬š%)>Ô–+A>*I ’óÐgâ-"觹¡eUðæ7û©§+†`Aq®Èq;å­ÿŒàû~;uÜGúˆºc¡¸û ±õ¯sYùéh|‘Ľ“(yM*ê#¨ŒÊM{ãÁ¦j7pÁWë{£xcú2møsklv)[±\†ˆÜ´]`}Q^kàÙjEñfÔÛÖæ ?†õŠŒŠ§B–›MÍä—Ê‚5§‚ŽOB‹”*ƒxŠ¨`J‘x¼ÛæÖ"„zÑg ˜âÓzòF +¸£1Ìt%¿@Å까M š*ÜSæg¾MûHjuϾíˆfZûŒÈfÒÊÊüv?+ç ¼ÖùÈ´x~€ªh~®vÊÜ Ï™Œì.ÏC]yö±kp+*x·{븽GýÕ>;‹í`ÈÌÄ@˜‰¡t·nTÕv)Ó1Ù¥»æ±í3¢‹×bÜZÓx(€QeFÔ‘Ü›õ:o–ÒÖJW¼IØV1슾Ìÿ÷"·¬Ð +Õ|¦gùf?oÅ"Uëé3º©!ï:ø{ÄÇÔœŠõ{ÔÇBkXã„­\”‚ÍíŒ XÍA$°?~Œ½`€LàX2¤%›—PÓ…Ó¤ÈGDŽ Z _há2àQOTyéñj²Æ„ÁœçúüD*³m¤ 3H$ rªc¼6`À°óà(·&Ótäù4Û¥¼ +ís­T  ½€‹H€óˆPEäiún¿t°Á6¾ªªR€NÊ(?Öû½åýÏéÒÌÔ1pßµ[{£zF,&ì·Ç7¸>tÅëשíáÿ3êˆà\”¶.WÇãˆFJœ´Az uŒÈo3+ò‡£oy[K4“Y«ž²»wñ¾>ÆG×Eú}+V­å';këöãW18PÒÿ'õ].ú/Içç6ð +„QŸƒYƒs¼Ê¥,Æýøv²œžnÈùd—f²m3‰»/#¤%Tdjöa”ögyTð”ÞB;ùŒ­hÝË ÑH„FÅe—_#nbiÚf˜—µt=ï,X«2‡+ypm½Z3ªôéÛG^?>´ø`™J[MRÅËí¡Aó/)Ù-F¥YÈþbÿT]‰j¢Ÿ‰’=¨ŠtöƒI,èòx&^ òÊU Šœ>¦uúLd{ÿC]¾j[o wÖÊxB¦£Ÿ¼QÛÜ‹¢Þ‰¡UàÉ,´9…j(pS§ÌËJ Ji¾©Ã@m'cÖFTƒht—ÎÞ¶“y‘JZüØäÒš‡f¥‘Nwˆ±oZ¥hª¯øÊŠJš6T0ÇS9(ÿ.vlí'𘕊`ŸBX¢`Kÿ².‚ œ•!‰¥D© +›<«ª~¹AP†$:G•qåºýlÕ's3êصt£|Rƒ÷²Ð´áZ¸µ1ýù¡çˆ0ÕåÔ¡ß:'}&1Vld]ôu;Æ'îÚ>qGßJ&SØE”žà*›Gå<÷Ú•htµäÝík,EÔOÊ\æÄ’ûØB(6®Èc›„Ž(Eáü'+pNlÍüà1¨PY‚T3é +(Ý +šða×¢¡Q+`?¸Š^j˃›BR³[Øg$¼a¿X¨)hþͨÂý»(ŽZ„ƒyÕ<• CC)p’Œ±ò’S+Ô0Ö¿ëÃw½7*=À»6¡Oìë–dº`@ho÷„Ý7ŠÚ9Î*ÂPH׺*Ù®Ž[ZÕ­~naeR} +ÓÕŠ²5[O¸ +&C +ÑâÁC‡A +>‚ÆJ/®+þI%?’FDÔ±Nig[kz+ +Ȭtð“úQ˜²_¹:bMÅæ #”ĽìMÐz™_ÇaÙF5¢li£I¯_­T‰­T;s*?¯_ÒoNã%O¿ +oq0aÈNk·´¸Ô]ºdUÛ’ý y|»ö +Àˆ»³ÛãÔïxŒ‹{GÀ >|·sí,ŠÞe‹fœ29¬@"›t³,¾ubéìšàå9Òº›x„sRZ\öD)"EêýÉú³Îí¦!œ¨™ð%¤7Àò”{¯\åÙ+ {zªWvaJ~H˜M2VÏÛ[c5ôÔ|G¨ ® fÀžp—¢$í”æϯè}«æ.rÄ(¬¹AvV{ 3(•:m/°¹eë4ï½Ys6ÒJ•ešÂÏÞ¡X¬aô_«ÚX ãGfTæ9œ§´}TGmû²È&ˆúg¬¢®`Môaà¤f,„׺ài×Ä®"gDWq :ŒÐ)&j÷?ç-üØsgøôè·Õ•ÃÖ3ÐAcÝ_Õ±AUÌâ4y&À¾˜$¶òµ_i€•T¦Ç±Y¨% !Ðx¼¢*¿œ|Gšk±!œ‘ÎAe“묃áÞAõQ´ƒÔ.zg½G²# +m§2ëc¤Ö¾>Æ>ÍIÓ4 «ÓÖêý3ç–â¼Ï²¡“—ÊëëçxÞDÐl‹ \ºßÑylç±}fÒíT„ó¶™é4̺” +!—JÉ¥j—õ@€/Ò²“ïO;·a\\æ x)´åÅØò +ô@Õy#ñŸô8`9‘Tª2·²oÉj»Çó~au«ìüGp¬7 8½³7ö:råC>#ÙñZæ_èÖvµ +VN£:ðŽ#6 x—!¯Ùm5£(ÖœPœ(’ îþ®¹ËÚ°fÉ8LYÕÓ-€~žBdqžzšZÒxex%’žäy H%OðwùUÛôŠñ»Ž-{ZµlÙ/öO8Z=þ5ܘ|‹äÊ$(è1#h»2ù5ƒ(@"a÷Háô½æz~5µùs.k*Æ&$ºëŽ] ñ]êZ‚_ka–æ&R…¦â< q©ŽGˆœu'yÒš—\x;ï°—X®k< fª› PR3ƒCûǹiH-à¬ßï#­(>*)‰jkMŽ†g-[Z¨ÑOQ[äÚ$kåo#dä Cqõk+]£ú(‡8øªã¹›ÌÛkŸñŠšgŽdrÍ%ZÛã\”*o,ª3€ÒiluŒKÍö÷qN­fñnQ–@B¥©6O½îtm”¦¨W¼+„É—-Ú±v§0u8g}sÎH"r`UõdðùöFµû‹å¡°þ±^“¦QÓ©„fÊHªi mæé.+ëÕJú .rX˜EI- +˜ú¬¸B¢¿Ï­4‚Òfô É9êòMrýë8S£_È›ŒÏ‡l”NÝ»ivÌ’<ßÛGÏÒe&"I–¤¡}Ò—®Žœûv\ª5P§Ê² *)ßøy§®DñjX¹o[]DýÃN«à¤‡Ÿ&Âþú™F{ø—#$S„ÌISг"=G·Y|Õúò¶FÕlhÓ +ªñH}˜xÀi£Qòh³ÃäO‚‹%m7pf—RkÝ$ê)¥öϾkñݾŸ ¡ûB×wáÑ*¡ Ê +.Ô2€€Æ"&rl{8Ú¢c£a@B÷ º0r¾<˜uG{r}jâ]Hßšþ[nxºxÅÍ3øyú(¬Ñ߇…åú«7±à¼±#•žÏbè +[x}Q*C®µ{3¥'ß + Ùïàôå*‚EÊGWe^ùn•°ºëˆÕ#AÏ=C + ^.XŒÌt;Ù UÞ˼âFûTÔàõ.®äÿ\Ý$ù¬¹l·då’•–Z³ÛÔ0¾Û5…$‹š¹G©EÁYô]0ú&@õ.àm*Y0b-õ’h×2WÊW 1§K[¯Øp×ñX€ +ÏbªeÁ/´ ¼}×Î\S* ãa#ñâì#5RQÒ£ëí(nÉíF¥÷¹y÷Ãâ”,_#Ì×Ñì,)N™œQß:¶ÙFÝ®ßFͼšú“bÓã(äòë¦×c ãëó1cšSæv‚-Ÿƒ½ÿ+M‰“bó.-Ù\¹@VeMO¼®íû¨W»·–ƒÛ ›©ãÙxãÄÞž•Ü#†´žÌ¸â.™ŸGGÖË)œêŒ¯T£HÂΑo5iO”Vo“M4Ò‡½g{Í6 ô8åKσn_bÄyYD!lvE ]Å,Žƒ¼ÍEz=3øYê¤nY+¾V~Öñojé©®÷ØMWÄÒU9Pøvȸ”wƒ3sþXwkØõ½bZhójŒG²ïÊ¢r}ó%º^cë>4SÛJžkxçc‹³µ:>õè"ûÇ|rÿ©qÄ)ökå«Ñ\9RV^'£Aû ;®òlâÿg.O.ǺŸ{h©’¤5Ú¡÷ÚôÄRÅ(fšêi†WÐß^聾“SX¶µ~z>':new“VN0™Ÿ0*›ƒ@¹‰¥)oóÓ¾Ôk½g3£ƒ E Ô) +“úRØ„ñjîKÚZôœ"K÷(XBsl‚çµR/úpÅô܈a¾Á`mžÈWœˆÂçRŠ1bͬpnÝ a:çëHBÙWT³è¶aÞ㌇wHˆ ¨ªµ-1C´søD¸ð!ÃÇgn3ô|9ÐýZ¯¯Qü»¯bÄÖ+x¼b™_°V=ÓÅ­nk$k Kt– CѪqÏG’»¥Èìòm¦=çÞU¥‡Öë̇-5LµÕn‚8²rär_¡CÙ˜‘¸;|"ÌOþuì†*ªú½XJA) AÍAžò5Y¬•;ûÑÞàP'½Ð{‘ï‚_§†ÖµëšÊkÏ+{ìy†ºaÜvijq?Þ_J6E틺 ÔNLª©š]%à"LRPŠzÊŒ@hG¯( ®‰²Â*Pý®ì5¤`Pò9ŸðϺwié>åÓ›éªf÷×hgs ¶–ðÇ&ûžžïa'äVðn?ÔmØq]cDZq4¤Õ|%{‰ôE®= ¬ío]wN“xJˆi+H!X9[TµAÄ&CUêur]†ëè>Ây?Ût盨ì•öœZm¯Dªî·W‚á-„ßYÿÚôkÆH¾'Æ:`@¬žp ·[À+sDÍ)Y ªÿtÙ®ó€úÅtT ²k7GÙkÆ;¼jÆÐí»“6!»¨¾Ød@C×·sÕ5‡áYŽŒ,€fºž§â÷”!üÜ€Mº3ÁØé÷ËÂÑséã‹Q8§xp>Ń›œû‹§!éÚ(ß*8>Åïó€À+®ìLIÊýVȸGÈ3CQžï¶˜"›6µgxI¡jJ¼mp²Øß,(°x?=o—MÖÔ"å ·ºÁJhÃúŒÞàz (é[Eˆ\;5-<æf«£c¢½îˆãñ…/Úº‡ÿ´k~2uÐÑè «f$ôàwÏ€Ž,1ònw µÙžQŽŸ{I„Õ-j3¸l„Òž×·QÌzÂÃЇ[fÚˆùDà•LÄëHQ(ú];B×XƇöu$’.FÍ4/ $êt`˜FçF[Q¶ØVQè¦sÑs*›ÒºŠÑDŒœ,¦IÏqè?SêWh츲›"•=WMtš<4PeT‰ Påñkéà eE)DCö®¡³ +‹$8^ñx /ÃãÁBû½aíPúFLµ12.X‘^eù§Ó3LA+`·©]Ñ1}‘‘ü81V:ljDâ(2Ê¥÷¦ÿ× AŒPM.Õ»ê‡ÍÆF»Š1LɯâòØ’ ”y^ïS<ZàÈ"‘`aÊMê|vo`=§Ç³êÓê Åš;8ä}ãJÁÇ‹O«È_±ñ‰ófy}¹'¥üæQá#a~jŒôH},3ÂM¼­§"Ÿü]ØëA g®,ï®øÖ]WÐ^y± ›¥)nYâ<õrð ðéäÍÜpYþ‘Š*‹d[ô×Ï¥áòd¯}ZÙY³j¢•@&[iC I XïN×™êÅ'´cœ¯m# ‰Çí¹Õië±ãA¸sÝ$\£7ñWÔØ;'J3 Ô\‹ì— RØüËH±ÑÜÓ”¨×í¥„ +ö®²Q¿46–îF’åºÑ%Døg >ø3œü‘„õÃù¬ÔNQm lH_75ºpcjÅÙ-W(KbÎéx'´uѦ苳@jQHÖ+úÉ8‰Re†²ÚP$1”ÂX@ð¤üÞšôa€ëØfǘ՞ϺG}EÐVHêºDé?G:¢¹‚0ˆ¢¿€j ¼2â zåT„€Û¶LòPE_œç|ªòO¸±[P¿!ó…#8ÀI +#¦t“k×½ér*é64Zdš"]SF2zyGlHnÇ +J¢´5ïIÆ5Á)èx”°À¦DÆ RíÈ[>¬ßÂb)õâmÊi$ðuÔó×ù),Оj÷•ËR›3_5E›¨qnÊ÷°,ƒÓ#9Tj`»(ÅêENqÕ2ƒÜ¡³„½âÂ+~ 0iübÆo-RY†Ü$ì9`]j,<:iGàjEaÓ¦|š(Õ3”íÍDÎ*2ªí&>f2 JgÖ¨¥+!ab?{“àI«Î|†UÚµ"*³Çƒm¯êý¦ç¢‰ø\GCËY}P¾–iýe(pmuárû•µ²Ÿ-Vá#ZC—ð°Âò%d}Ép04˜Ù¾Ýÿ룽ð(Š&/çæ{ð½ÕŠ<èÉU#(W4,R$MÆÇöÞjv¸Ö.Ê£Èy´ˆîT^g•Nu·®dXè1ïuuÕ‰òöEŒùÍP˜ÇI%§‚Ç"(wÄA +\]’à>ÒVÚ­çVé#‰)¢¿w®HÙ¸jòÓµZËn”Uë~™Xo®/ŒQ“þBÇ“›Kb¿e#ä’Ä‹ u–¼“*u +ô! !Ôãë<F+ud8-̧½ùC;_ó Š_kù8ãÚIuƒB°ú!€(q€h6i–Í àªpì¼›]Tyï·Xô¦#É+£’~@Ùy0ôi݆M•1D-è•hÏä?%5ó÷õ¨Îˆa¸N¥\«i,Vµl.õó¾¦vƼjTØ#E±HX‚~a'Ü3ê;¬#¨o¨xŒÚ-¤ö‚EÍaM }åa<c‰Ñ 6:¼ë±\‹†mC““ì×1‹ aþŒgY¤2®|‹uõ²k º”’ üuOYsç¸ÓíÀt†òÃ̆¤ë„ú¦ò£¶‰“/+ : TDÂi*_*SúX«‘ ©ÖÓ©}vX|7öj +ê³ØÔþA"·¤+°NplE•Eü‹U=êeZÞК£Ù§Bu•h‰Wë'hsñÒjud뻊K‘q˜AŽ›‰œÙr.GLïÒÓ<‘úâ,·%âPt ê}º4‚ ”ûÂÞà @Ýê„KëÓ®ûúÐÏ”'¬ƒ Fv“eGp ùF@¢Wu,Poº1RÛ&W4Xf\ X{¸2L¬^Ißê›ÒAÖPe=Óc¢e¥9#’8šrÔ,à"rvñɾ_´ )éÇ©7¼Q¾i¬m«p«?¹.µ%à¤8lçåÜ÷®+ׯ“o" +Ô¡uíÉïä4£ÔÎ" +¨Wm+µZ÷ 5œ'X6LÇAtÛ f˜Ú›œ ˜¨€RûC¹‚98¨ÒÕ¼Ø>cBM÷Û!ìX#M½#h’j Ôe=nzaDtæ*Iu© Ü÷#íº‰…·78Š¨ðAºId½”¦Jî'|I²»+ñ»ÉÁˆuI‚oÖ›¯#‰= |ܱðæ[åmbjÍwÜå¡Wu%K61ïÒÏXz nÁ€°Áü}“5Ö½DA9¤êK]ØQÿŽ>©œAŸ&טtÏMñ¿Ðj>`Î}±àp2´\BcTeÈ;Pi‰ˆ·‹¾Â_BÕß"ó®Û£–Àæ¶êsÝ©“¬‡´rÕçDÁPŒn Ä=ø/٠͇ëT~à¸ÕâÉ»ÊFŸ¨ÛÏÌç7rm ÖðÜGšc‹­¯SRþûª­©dÔØsGŸ¬eÓåkѵے‡%”¨' ™Þ_2µ#5Tåî·Uc¾ÕÃ]_H^}vå x÷‹¶›ta®nˆch{DeÂS;"L…ƒåV™Hmð¯REM(åÅZëâ¿úÂr³2Gcîr2$}Ñ|ñ&ŸÿØb&—L¡¸<„ývPYðÂ~@ÇàckÔrÔÇ­ uWä¦S…)Gr…(—2}<­8´¬˜xŒùB…Ø+f”ǵõÚ‘ÚMD³ÇƒÅpHö·5– Íh\¸õ™=ö: ÉëÑ…GØCËÀõ½¶NÇ`En²V’•.I"ÍI91åR#ÜšUÛ ’éúgT˜¨=³DÀÄüB²uš¬D»LTóSqly®Öd¶®ë-„`-u@Y»*[¯~rCè§ßuö»¦‚¢Çˆ‡Q…0v„‚!\æØðÿ±²R+:ø5춰#*è•0o$®±—BQÏ u«›•rJÅV4´ÌGkvÆ–d çµµÛéÖ[Ž#[-ò{k?-Õ’F¶¼S §=lt…$!¦I¥ãQú`æ#)\gÑjÙ"ò´³Ê ³0¶ß'àc©b/í/{Á{iAu«àA æör¶o<¾6zËÀ`FD ê+RÕvä£3½7c=ççwE­gª<kl£hZU5!¢éô׫àÀu† š2R—¼¶Óû8²•â(”‡`/˳2Ât¤÷"ìxj™¤¸X ì‹ „¥(1Œ%šj«Ñˆ×±†rq"ŽgÞmÛ±‘æEóåHòÍm¤‘ƒc¸é.¦ùÐc(Ûà€JÒ\ßBuŽ¶jó©(·Àâá¾…)À4ê¬í˜¨”JÂ]á<ïOë)9T©M­C* 0|”@(ÔM´''Ix¹,q»\ÏXs tÂ\{ |êA×)rûö?‹ÇGˆg¯©‹Ÿ{ç£ýûv «~ksž zôŒÞurW¦Îc3øúÔUeeÁHfÎð<›kg=ž×0@pšeçùx]uÙ9•_d¼Áôø%ξÖï´ -– ¤Íȶ¦·rîÅÌÄŠåð% uíœS%]eÚ¾8­®Ïs†’Ôœ6¼†ÝXó„ÒxÁ +DO®Gôù0¹ƒ~˜'‹Âæ#h£X à ^?@) >Ì)L¨ Ñ£$ËŠôî +‘dCΊŒ<´ÑËׯÐLU¿Æ«6·<ÓðK_+S"{EwßòÔ·‡IývÌ…Wbýä–bß>#RŒ +ÿc£‹A«T“É~äYÿ¦û~æ¢T¦Gß’‰Ë8DG{äVˆ²^yÑ|M”¾ñ|ìíœÛ¥OEæ*7‡Äi*5<Š†²¿–ý‹Iç¦Áüëô¢¬¸ÓU(‘~ Ü +6왜|ŽVª”l]&ÈB¥‰›Ú‚;ÿó‘R™65Ç.Ö5£5k©}¯EÊZ$Õ‡ÊáU/æg%N-Ø©ÀÜ2B‹pTaɈðriºw è”9’häàKŽ¤Å´ãA´^-›%WѨ#|žÐRÛ–Ê"]eö¶U¼#ÿ\O]Ÿ‰@sEÌVqù[56Ð,-Æ.—eJïUñ÷ssîFiñšrÚ‘²ÞLÎø„“˜Üc×KÅ4ÂÌ»_n«–ÒW’td&nº¤­ÕyD•\sŽk9Ë»}›,e]ýDöÕ‚«ÒF·^¬x©‡¿X.¼ÉTÚÓ(š¡D!„e€H]hbBUïÇÞ Íšb„¬¤ÑûH„˜LÚ]Wæ@%=tÚÉz€%±°Dirm8ê>Ày©³3N@Œ›ç@ÒM +˽}¶ E×P˜ì l>*ã®Ø­Î(0©P©¨ñkŸËoÿŒŸ¨ålׇƒý(ø›(E +9êù8…ø“C“Úø! fDõ[ õ®K¢ +¤C:ƒCâQTQWÌ#ÒºÁ2­|·Î/¤VãDE—¤’h2X2½ºÕŒG} s–éù`®èÕÖýSÄ…8Àñj¦¶[Ïï˜a»8„Ó'§P8*2º{7…(õ‚ø;Õ¶¼~Ö>"Reª»#Ê';¿ÙÍ@ÊœÑ}ÆÖ¯™ÛT"ÚV‘ÏèÑðiÞ­dQ©}ð DQH8è6 á²¢¤Œyo]ljcëÔá ?@Ý1e: ˆ6ÁÈ:´âø…ÅÙ{2$ü£D¤èÌŠ:Žì'ë+IÆûH°UVć$¡ûÖxl-è¢f‡k¢úõÕK# +S{(ổÎIðPt 9% g¥m Þ6$M1í™EéÚw1%‰žZ¾æTÊ®·Í½I™`´ÀÖ¡F‰ò6ǽspJÄ4O'ýËúmIMS²já~!Þ£fH{ªX%U$¡N‡¨¦SL¡=+Å*b¯Çù4^À®Ôψßネj4’æ +ü~ìgC2Q@» Œ¼öRSdÄÎ`÷Ç'îûŒâ“°Õ0ŠÎWc7©¸ùXÛ m”~=×\H‰ql}aÜ¥Õ1žÉxÐã." ­À¦(9£.rvd7û™Üj7ÕÖª‘”GcTE”'s§¹«c¶5E%øƤ¨ý:8¦[á>j¨àݨ±æ¤ɢߊhz1ò¢ ‰ÃP©\u³È‘ò^éKDr¼å,ÓÁ°äƒÉ«RN4¿ÒA\·ÎZ~ >÷þÖëí=bÓO/kÇ©ÞgÔ±±@k,ªûÞwëäääØWÛHóˆS%åýïy‘·váþ@~ÿ5Ø‹WÂh/‡fLû ï\äÞqëG š23¥jÓø(ï´P§€Ýè¼Jå)[!çH®a­>†d ¯ãÃvv>°úó°!Á–`3¸ç`3¢Þýþ:Ð= ¿¶3'p1z'–—ai+±b3êÜBÐJSD¹S#\ï”еœtQß=VUY­Ü3í¡g +!&·º¨*ªRdcYMEG÷6öÚê(I–Âi ®2]Ö´Ûf“qͶvÔàaƒÆZ i…g‰€µF„V¦Gݺó+yí-=\2n"¾l@]‘h_Ûº÷«bƒ=¥–Æ +h+ú ¯g_ódΈ2½ÌÑtéŠà' éšàÒj.˜åó¬ªÜæ¿Þ?I~¿žý9IP•”÷Y_iµS¨…áVå=†Ž_VZ v4Tü̶j‹l‰é”RZÇÐhk²Ø€FG-v5]׊¯"cßpžØŽ«éfh1{ÐèlDqôt²«ØžîÇÂôŠQ‡é1 +AûE¿‰ºÍjˆPgç¡¢)×wÞ(Ò5Šn£$¤\ànÔµöíWÐ8§'‰8 õî†1çÇL0ðè{l« T@Z*{OÍ}$PËl"cÕ©\[¾ÀƼ•ÆQjÇZMl +˘ žú É@ÏAql+¿;Âò³ÁMM|·èRó9l#3ÀÆãÌä(¦›Üîm•ÂìÚ®‚[=åТZHÎS¡#/"­è–I¶´'‚º‚4è+Íjû+â|pFÁð$ªîóaÔ"ªcScÄšé‰`hÍäEŽÉtêÛk¢ y§Í|uaöj:.WÒC&´KØ>H4lðQè5ùŒ-߉ƒ¦÷ˆ±S°GVݨ¹£c6 Ã+B€Ô™Lc… +@¶kV;ËüA®8W–¿§›Ø¶<À›ëë7Ô\ãí ªžÃ°Ýèñ™X[¡\õÐaÐûòPÄd;¶9R¤ ’v]3|4•D¿±YÝ}dÕŽë¤ mX¶³°.Možý‡ÑàÇnêLW¥Ñ=f„n)8ùÊs6bìˆû1E{ô¼Þ7Nf,é ÷‘nê7rxÅ—N·h¬K(xŒ}÷‡Ö ÐõÖzÚ\âÇÊ—NÉ8´u¥ã“é²ûèM‘ú7m¨|`÷VM<Ž_ºÝý£#ÈÜŽ ÊÊôí­qJw4³ªÖñ-|(»¿Ýµ{x^«©¡ð¾o‚ªz9|¦»õæ;]ž¡ÛVX´Jæ%#æÂÍï&„©u§Ï_ðϽARþï¬'bZA}H_Æx7WS`XèÆÔlÐØ’®‚|šáC"Xù¾Úí6jOä§QúB8쪕P“WÄZ¯ÌDÈËYûa¹GDÞe~à¥Ì!AÐ|¢4¸9{ nzŽÂ@ Äf£ïÄa½Ô"¹UÀlú¼?#<Ô(°€#Ûøn?ÚmÃ$Q»ïa çÓbþ."øht•’ÊÐô¸èßßWÎWçtõà$ñì²Îš (`FEºmhÆ°|ûŒx¾ÐêÁ=㾿Ù^PïûŒÈ½k#a¨ ~æs?ž'¼ÚÚúN¸Ú‘„ /©óØp”•8+cr_±úXY«Ç=Y3ÝÛ™òþA¥£so¨p[áÍI «VÔÜö=öõ5Ïq¬[QB<ºkºFé+ûi^A™"a{s%§`NÎ.ÚÈb †æú#JÔ¢tŒ‚¾O\éù,ZS +m2&P,2ƒسª*Ðó!4œÎ,\ïÑŽùÊR„kQ¢ø¥~CrK ÈC±n…ÀVÞtwÓŒ÷ˆ²Ûúzá>…ûÏ(½œ8«&Ä…L8&†pªOÑM§»¼®ä¶$Xb(t1]/¥Í¾õ%ÏmGS]XRdqãèFP 7äDP $âQZMf(¯D'‹4 L«¦¸Žaezî#%{½»râ(ÞMµ%òPê~(׎° ¢}Æž,¹.7©Uõñ7æãuÀRý`iäj—¢ –ChJÏä0¨x~Fà¡Hex 4ð,}>£®;™céT[‰MÛÔ2¾sæAƒÿþÞÇ×1˜Æ¸Ùwª³ë¯¬ +Ú±Õ;Ñ‹QDµfÍ=€ž‘VžSäFT2½ÙSn×o÷ \õb¸P, +Ìícv¢d’‰¥6B੸NsVóÙ;6äÔD>~ÿ´ñ†ÅýqeèßwÃw–® ¬dgt;¥‡Ïˆo'È(úž(ï!Ê‹TT½û‹b +ã&tµm0of,²M'¶B4Ê/\â[\âùjáÄ<‚cÙß»ïØX­»ÊP&)cêÙÚN§]dIYê;ÊuÔ¤û‚<ÓŸòÌÜ~ô®|o³ŠÎ¸EûW—œw"ÑGÄ?í2’c÷ÇÏ×ä@Me­Þ¢\3Ͻî98©¢$oú4ÆÑú‘aÜxñ H=ÖGG²+ƒêÜAs¢YÑŽ§b†`ÿ½#f"„C1wD}"@ûQî—ÉÒq„óÔ-ïHx>6áù +{ézMÏC 'þÎÊ—P¿s"¶„bòð ÛöªXغ›- Tq %8XÄ:UÑ¢ª¬B ô™š ­÷›D­®e2€.”<úß´)Ÿ‚&šAŸi˜Ï"Ã"½ï’5:dMEû{Ч‘¬ÇÙ&ÕS–“¿(áÇbFÔJ pœC¼ÔŠÀ„„ˆµ&Ÿ{?w¼Ò«`€ápÁ†þ‹ý:,hŠØµ¸“”ßFèPv1\¹5lœï¶}PÈ¢HÆ7ÿ-ìBÏ× *ç=®™T`.¹d©¸äNq¤(R‹É.³Ñá[^yÁs2#g|ƒÝ§tnèk˜Ó‚Ý1ݸÕh%]2#üÇ ½A¢œwhPûàQKúˆ´°-ZQH­#Ô8"ttÑTD ¥KD-<rLÏv½}àÚdk‹<˜Ð6Ì›S3νðš3¿¶Z\þ¾²ÿÈ +‚Ýâóæ§Å%£VbD!M(~ /wdŒ=dL”ËjŒÐúÆÔ¬@–0mfsï9Ñàý—:Ê@GGäžÜ÷úâaÕ#*+EhèêÑTª@¼ ÐË& öH¤•oØ¿+BH¤Qý.Ù±uÊ(ùuk(¶§JŽ#wõž1,ôHÀ¡8’ËW54€Ñ8r»…­"5 Ç Äv–c|YŠÉŽAwH{½#+ƒÎ †2ðèy4$–‹ÀH]M#fæöÖ¾©JÕˆ¸¹ÏWãöc/pZ™Ýh»žûAk:TÐ;ÃTç…ƒgçF‘ëþüݽ‚zTå¤@M¯ß K$ùàŒ8jÈÞ5ŠöÔ>"øHoñ‡û¢L2ÚDÌGOÛ»J†_‘7jšªÅã°Ì½adÃc2ÿÚ×…³¿®úÍÏyf¤ç¢¼D ‰á浡§…L×øÅÛ3♺!ÂüÙ †¹é›¬}[ª|)÷±PIW¡îøÅMΟâ$²žb÷ÂŽ§ÅÄ«2BíÖŸúŽyH…¶±÷ö@YÙhÆÂß„£DDª¿’JA‡Û䫯©Jà'#˜^‰PͯÞÑïw¨<Ëët_*cXÿ3¥Ðb“܈µ’ëœ3$S†q€JBí½Ù|zß›ûž™}ü|5ê!¬ÛÕA;¨EyÍ¢[³ö÷ŸbÏSܘ—Ï ¨!ŽÍð>Ï."í*zX¤>ô°îy†Ä.nýk¼°4WÝPVB‰Þ£„S(N…w:0¥’†k"5ŠÔœc`a}£±Ž³ˆtm¡°\.® §b.qQïojݵÇ^Q¡®œ(›"7æFdÞ"'Œ¢¯K\Ö¡æ/3‰ ¬³ÜW8È8YFN­ EÉk{Ë +É3î»Ø¢àBÀ,î¡ ¾ 1[6L‡r lÎ-: +p•9¼}í?S$ÔÆ¡dÌíÏ5œ*(ÔöœÈ{":âJd¹…ÔD5•ž4¦?ÇõõÛO¬ÚH«J ¼4N5•´nn“>1ߨPªÁñ1‹¾¿ù ß7Âh¢\ç˜Ã`‘¹$bu\ÌçÈV ŒèR¼PZF'éË{D¦ãª™‚oöƒªµBT}q]ÉäÏ "MD®Z¿Ào1oÚÙtö‰Ñy¯ .;ÇŠ¸˜ß®~έ€ÑGÄkü ŠúÓÔ*é}?kʳ¶Lï^n ]±„Wð]@ÍÈ.r¯»6׋T‡¡¡øÕ˪®®ÂcÔÄ@ò6¹_x: *KpKØ¯É Keè…¸ ä±ö×þíº”Ý#ˆú AÏ!š‘ÜS¯V]u›ÔÀ'k‹BÕˆªÞ(‡ÕýýÈ˽„£ÑøÉöS…1]‘Öã +C†Óò±a–} Æ‹`’ M’æ RM`ûžSMÃOÆjú€ÔC? òHV›ïúŒÈ+µÕ!*–Ù¾ÙO/qÊX#Ú!÷G…A!„‘ëÓó±Ñ ?¥{œÕOyd:£ÐŽÃ†L¬¹ïÖà66W6Ä †xæå-µ4BGI`,µs†¾ëm*Ï~BÚf`<¢î­ ­;ú‘xr YGÛ~=T(Ìm75f"€Î<€¾ ½ø¨ËùÍ~æB²Åundï%®v廀‡Ézb¥ø ¬Þ‚ ß …釃áÜ"Sð¥çÜ*ꈇâÉ%×sk&LK>þÃUû,FáGÏÊ=<)}ì(È]R=‰ï ;|úIB¢éáhLõ†µ*©I!”­×ôEˆùy—ݱ“ÊÏa´Jš››ÙDj¯É€wu©l(M‹š>ÞÜʬ¯õ$øãó@ÿ™%%´ù G¯ºoiToíqŽoèŒ(õP&yaG +â½2h­Ž-÷.BüXž¶eÐ)ZÖ_‡„_äŸqùúŒÈ ëÉúbÍý¹ŸsÓ )äl–*‚¯+'móKWBi>-ž;7E°Šß +Q—àÄ‹„:QõÚQ+Gÿ«}>wrXÿ¨Ý£Öž0A¼~º/®wèçÊ.§€É,ÛW觨†|Ó›T¢K¹¬CპQÔg ëæ}^’ZžqÝ*¹ç°ÊëVVãøÂ9¥„_¹†4ìøv°©µ9Þ‡ok’Ò÷(„UL¨+‡ +MèÕm!*™‚jÛ0èàšØ³D;ë6)èÛ¤`»ÆƒÁ²ã(ªåBþ@súîL£uÅîtåãÔÅ?ÿÎÞ„ÏÕo6Jc3.è=Ñþÿš„§­•}æ +Å”=u¡ÖÍÔµÆ~µžÌžìäô3Ù '»ï§È'_ +Å»°èX 'buó–¨è¯2Ç¿sÐZ X÷`öRn¶fa]¶†Pf»$ßÅw‘õZA¯KÒóK$¼H&‡{qLôIðð/3b­ Œ@U,ÔÍGÇ?²Û[­ Ú´×m_$¥l°n‰Bžpk²¨A:ÅSµÏÁ‘*¶YiM %ˆ©²H>ŠTÈoͽïL8°hìÎ|éêRšìCN(ýh–3_]vð÷ˆý³Sÿ˜Ôœ‡¾ÒJH¸ëe_¹T)ãWQÁ¨ï÷¾?5”t£HÇʾð€Âr¨c¢³^bj‚ ­K¢ßˆÐ%FÛYÏ¿÷]wgúuoT aú—`ÈLÌšel0œ¥nìŠP~Ò!³‰›òu€7UYßÊ8¼#}FDÅ^¹C Ð8¦Å´lÎœHQ`C +§ºÆ•…Ê>L°É¡Z¦Î`…u¸ëSë /’ň†köø•Oà·Ï÷‚$F¯£At:•¬ºÕu»Nß¿ÛQíP{e^Ñu¨Û8ó:1wþá~|½YEÉè¬NÙ 5Òtª8R1-ª×£ËM}¹¬ +:ìh~Š¸o÷£6Ú]ëŽh;xaWjh·GJÇ#éÜw©Í¹T!5XÅ¡‹‹ž" ™5Z뚃H$ÜÈ–b.ÒôÝsE@~Zȱº÷o"œÂ ±ò¹q ðo¼ÿ&Í£"›þcô¢š˜MæãÁ4¹Ò÷ƉŽ6o ¿J9ŒmÐïi€õ×åNz6tŽfÝó«¢x#]öµ`ÆnŸÒÁLVÝp«÷…Í{›ÐÓ<9Ĩ + +%{o¬³)¢á(»¾1åŠñõÓOµD†«P_•¸àãØ}ÞÉ<Ó·³èm;â>àXOLgxšÆv GÖ¯?£IQ§åóklYܯA³Þ¢±þÃâ õcô´f|ÿ¨Ì3ÙÖûß½,œ%çüØË*Ä]z ˆœãùµ5É}o^«jÂq D€¡³„^ú±žðz톕+ee$ײ2{PM=g”ãÙr®±›ŸÌsÿäT±1|g_^,,jKß"6ú³»=Ï{›²µõ(ÖÐVÒђ愵÷Žªy&Ïyš~`x¸ÓÂÒÄ-1m«WCÍWÙ»(†t®'Ýè42#Ê·ž©ÌS›]Ô¹†f/bwÜ(¬BNÜëF¾“x씇œzâoh”Æ’F9–}×5p7%çG"˜x8ÒЋ²&/&¢‹4­˜ðïþX9ŤO_TðžJX 9RžËåÛ Tv(pÚNíM‹rZÎ@vj3ßAåøz¸”še€Yx¹š6õÏàòÒîºgžÇ¶n¦0vˆ/,÷dz˷ nibpîã€X¢:‰ +uzÊÅ|Iá¾ÛìIJyTâ~ž(­2ÛY›þŸö•@ "¯|Œ‡eB0J–éO[+étÍ•2wþ|g¾šXÇøw 2 FcÝù—MkE_»GÛ—()¨ôè•~ÎqM#è SF·ÓÄTÒs Ýr!¦ë}G!|ÎŸÕ s<Äý ®¶3O|Ð5cÇLBPC a8Ÿ« qç„ψÈAÏ×søy#„p„$‘ˆ“œxÀFÖèaêí 40µÄuE…î:KWRà›Ç  éÒ¬Çëêúc?ˆÑà*ÎQíZ‘EÆ&KÙÜÔ’#7ÕJ¤õ;jBwVå²ë4¿X¹ÐytÑÒðÁEµ=»&ÈÉ,£aê„<ûý‘j +«è+ÖÃà-Šgz䩳líºa 7Äñ—ýñ3Ðôy»~Š9U[iZ_àW‡ÕµFÑ»•¹Þ—Æßëí^«Fn;‹¬¯hß}FxES³Zh¯}UæOz®]¥vSÓ|AÇH{3êö¯ß{”è f†Dl]©XÓ³ì¾eZƒÔfÑB €”ñ¥ŽîZÿ xÞ·Á²Þ·ZÚõÍn.5ì±ÕΉïVií@äªÅ8”a¹Ã~ï’@’q<Τ=#Q‡ñ±¡E§æì‡O|EÀ 7"Ž¾kîcAR’‘ "4¢»iD1Ø<^¢BAÐîØÈr‡N÷‚HˆI& ‚mñsðy·Â}EÉ£JÄ^r ðâ|Lì Œ)ˆW±F@äÓÕ5xq¾ë›ôšé#û„ô—ï½ç{¯ó3 ïPK”?À:~ųFk™g=½3è²h‹?Ãù]ÀÔ“ñF˧<Ϩ7xRÁ‡òÈè›ì„:‰˜ú{ë³²2îψÜ2@¼n(Üõ›ýР€:¥ûM͉6gÔÜ©¤~DÜÍ úÀDöèó¥§Î©ÂŠg|[ãAt⎢>eõ鯯‹EÀÛùÉgÀó©ZºúøuGø‚2ÆáÿŽÿùgAU}f¯§òö5c¹¢d2ú¬7oߌYYŸê‚s»°'-@moÆš›`yÞ#rŸ(Ò…Ý£””÷ýÜ~T Uñ?³³¾³3d^´QÞàŠÇU_äÿ÷çÇ ,”YŒö˜Ak®Ó”BÚ`ÌMDàHDu‘ zƒ2軽Žtur1lº¶ dÆV'5&Τ¾D\пvéjpOc(FíÚ‡¬ÜÏ¥ V,gK8¸ð,Êl¿ê|MÝ£áËôEöù„0vêy,Çä}C² Ñ/§j°±«üøyÏwÓЕ“;FÇâž05?#.)ɼì°Ÿ¼õç(µ¨¡³Z-J¥– |"O¥ïU+BÁÛK¿dÈ+QÅ ‡¢K?Ÿ¤ÿØéÚ™ë ™[èŸ!ˆÂíJc¹]ƒf"æ RÜ=’ 7™1-ÙóaŽoEuÞ ¨í©3­lm€pÚŠ8ÔÊ^V[Šv,ÏCán¬ÓWÜÊ+â¥E¢Þ]ôØÁòøµ‚.¶¡ÝƒHqê8…‚há èªÊíßU9m[PÀ<ïߣÎKG;@¿ð›ª œiªjö›báS¤-—ŠÏß_oïè!·‰PÛ5†gm¡óöí9¹¶Pˆ¾ðÃ¥ÍJ–¤ëÂS(\)'w„҅;`)j#óâY6AêˆÏ…ÙôÈ x*Rl)"ßDJ{æû€§p}üþéç@Y¥˜«º·½¬»¾—ÏáT¬ õ)r€‚ú&âÛIð=JÍh»|ë]ZâGÑÙ a¬¢¥LÛ›@»Ö´Všægø*tü±µyÓý¤»µ›´ÆSç^ë§ä¶%à€ÑDL‰i²Ýôa½ø½•pZ«k%¨€¬Jÿ™+ô+·™õ'ŠX/iµbDeQçµÁVæ12‚S~J þÊC u½Ö®9ïæbèÖÁ~õ7ó0ÿKù,+]hÜ_Ï߆^ | ¶vgØΆ±7´g¤/œgƳ7 +øPšWVëfg?b‚v³krb+f]-Ž¸c(5çîùbÝË\·nÄ…¾ +øxtØÂüCóâßBËäøí>±b¾w¸’ªÃÒ`J¶tg]òÞ¯JèùíËÜbÜÔ×[N›@%B ey¬±‰î àÚ"¢¢‡T{KLÿ{ïÚlÍqžçýþ‡ý%U”«ðrúÜ“o¢8L([E+¶T) + +‰¨(˜²þ}žë~ºg­Õ=›/Hƒ>Tb–)¾{zÍš5ÓÓýîjN¬kŠ>¨w eD½ÑñtR5dCaWô·ÃHÛȯŽÓ©óŠŠ}ÏÃb×ñÀ¤U,{LEÝy#‘¨ÑßD”Ò¢uÙå‘wŠ’*©S{Íwó{'Q/Í| œË·Ä,’í]Ô37ºL”Åžþ^ÜR +eÝ8a?ó ´é§ÚñYxjŽB±š4–Ot[Aáá'Äàp~=‘¡òj*&#ÇÌ\WSÝÏ‹+¤½|X‚œ5È¥S "V +T 4*s¬Øˆž^()K7.ðŠTñuœ¬þNVó» [˜å#ʘ§r%jäõI@R1H[W9Q=êþM‚w cÎ뛘‚ŒRáů'èãU¦yºþ­Í“‡Z—qˆÀâTá— o»?Ýò'Ä~»¥øÖ+MHÚpЃ:ž\¬@bÉ$\®Üú‚¢¦œÝ’‡ý{äËQpoÄãc”üt(b: +„ÈO@+”ÄZè6¢Ój´I !ªbªµ”KauP_z¦ZŒJ(7`@8¸ô>e “åìßêorüƒ³t‘T€(…ÉåW4|Ì*Ù×PôD#MV£Å¥oX¯ŽÃ)¦²í¨ÎØ#ºà«£ß Æx¯ƒ¢PŽ—ª JR|O¦ uÀŒ”B: Lr½À=%ÞHÛ]-%ÀBt’œ<–³¨¦#‡îõª…ºHH—îüï£rvZ è/$Î) ‹U![?jå4÷Ä"õ-± FÏmáÏ^(+ð©zØÍy4?º–}aÒ»•3²Å¶ŠÜŒ€Ù›ÜÆyÒj÷Q¸jq9q5¶ó¸¢Îq:Ë-ˆ%ʪ»$ü Eªë‘kÉ쮆ðx&N„…ŽIpЮŽƒµUçqpj4!lÑ)isÈÌ4yëø¦èr–.¦#£Ø(Çòq=’s@,šHˆB¢tü5|’R›f±»°‡1€<ª­´"aƒõë‹TîRƒ®9oÖ“iÊ´_"¯sv±6X¡™óœP +)ˆ«¨m;*4ØFøÓY"žý<8m‹I¬t] Ê ]»oFhä1&HgEªE$Ýü¦+n~ÅçЬûS‘°ˆ‹–@ ºdRî[|9PLêXàzª•; pö`6 鉋7¯yUÀæA¢6‚-¦ î½Á¡8lDw(~x Qc‘Ž¥jÊ¢áY÷¡L¡lçhµoƒ€Øg‘ͤöŽõAšà<ppÛVFpb›‹ÚAð]ª½u>ñП¶ÞéÒŒ"àÇ ;å +2câÏÉGèu  YºÀIØF`,¬®Âh¯'ŒøùM¾¹Òëj 5KU¤ìíW`Õ´ܡв¼Ê,^ú&RRHµRbaD׎/µÆ@ô£xÞîTÕî¬ç'aÀˆÀ,3GEqÀ q`ƒ†É,®ùfñvÑ™‰?ëÕ}eóeÈwd÷“Ö_QHdÊ‹Æ/ ’¨Â®s÷$ ¹ørY±É¯§ª +¼:…¸Ë®±&ý5¼ŠÙçù²Ïî¼þä¢pÑEáØìå„Ž®#¶ +àÎnÔ!]6bX²»º¸– © ‘ˆrsĺû;Ëx+WäªE]Ä×¥û—ýþMƒ]Ù#Ô +€­0ó4‚b%ºìØt3¢£e#ŠÏâà­8ÎaQªFÈ-«4]ߤõ¸.>Id³ †qÁ±l³ÂA›~“F2ÂÞ;?EcjQ nˆÑA1™Ó4·ÿ¶O±òØÄ¡ôFŒZuœ/ívdƒÑhÜG0Eý¶`÷9ò¥}”´+KvíJ +ä_ÔŠß?ûQíCD5‚©¨è£¬×”B/´í)tA#]M×LÎ^0 …@?òKš®ÿÏ ú1*Et¬,…q¹!XŠh˜–H† ½ A“0FÑYØjì,,ó¿Ñ“‹Bì ±‰JD<ÚÛ%†‡ƒ¶ƒ…εàŒB`Kƒ2R¹P댱ÉØÊáÀ×ÁS¶± ã•®‚ȃy ¦ÍêPÔ¯Q4ä@˜@©J=Æ™È,Z⌇ÆÐÐM‚[?Ñ“bZ"N“p qº¦gÂM”oSùTUºc\àž¢_Ô÷ +u€äÛö£cèjFMÌŸÉ'…lp¶QÕ0\8\”½ÒØz>€tš°»ñ·,!X]#Ÿq¯Â•´Û?+G–H$„å >&TzÚj$XØ-žÿbóÛ +}Ð 3òOÏy?øKÿ*Û¦}ݤéÇ‚Àݲú®Ñ¼­bo@Ny@§¼jÙ°¼¯Ž8ÿ:ˆ66ûguë¶7PtÀ…7™B6ò‚“$^Ì­!ùC¨*…[ÜÓ`;OîŽ1¡‡qMuC…Áš(+m#¶MÄËë(l’œÆ{=y¼’–$×6fYNä©Ñ™ÎÌzuÜ5EÀ´ãÀѧ[²¤$). Æ8z?ÇBwcÑ›s®Jó«yf™hç ÛjÙã7lv;¢M×m*~nbäø¹Hdæ<¬öDðoFC’ J:-]é¨Q@}=(»X*Åv³‡‡¶N@¦Î&H{É-Ø—Õ¶ ð‚øáɸí—A Šõ,rFæ1PÑWÚ‡·nG©£ÞŒ°D‚Ž&ùIɳ[±:\NH"°lãtµ¤)šiªvî€}#¦:: ÚoÓù(CÃPõ5¹Ôý)ç®é§œ€}IÀ uká`’Ë5œzIŒ¡³Ì%| Ì5Q_¢xîDG1Ÿ)†Á…Ú™Á6 ´«Ò?%U°—™7õ7c”0Ö,x“sz[6éâ5nðaœGT<Š¥â¶Õo4" 3‡Ô&Õ¯3#øBéw„˜PX„S`s§Ú‹rªM{ 8ÚH²+ÚfâdV¯‰„Ôᥢ;Ÿ¨0b#,™ŠcDÓyn ý‹¶bnµ&T¾iF0‚Xâ. IJ`[Þ˜(óu"{S£Ç)IÚˆÿضMºT¤ÀâRÞ…“v^Ͼ½jèWµÈÔOýäDë)+ì¨ÕÓÚÉuï +‚&¢6®^Ôt<‰£œÈ4ØØmWÌÒaÅø¦È0¥WËIÀ-¼™)îJ”ü«kãn‚æqŸv_XªˆËÔ•‰óè¤cû#Àö Ébî5á§f—r5²hªì(§é¯´#ê F#‚ $õX³CÄ#°©2UíìA#Àý0âÁ©/@<Ú¾@8W³_XËâí,F‰ù[™Ü‚ÃBj85"Qg„|n3 oä|äçpÝc ø “>£ùú¦Óg˜„u'´„KV«…P½b‘%IÁ½:ÆoêüÉ j1ˆìŽ÷!ˆÔSXSV´ù´³ ÏèHxZÙÏ vñ>‹?òßdmiãE!Ϊ~?Näÿl3ÄÝFÃÕ|úø!¢&à÷¬>1»çvÅ/m¶s:Ž ôã!ºlŸŽ–dû¤‚›´Œ"ÛŸB"e:BÍ‚<¹M#ui¾ÁŸØeáVr¥iØmz‘$‹ÚçÑQ.´(ºÐÇÅO–×h{ûx6#»[Ízñ,ï±# 1ËZ(ß°Bwÿ!?<ô!—(A"¦×ñ€¯o2Ú*êÒÞÝx̘;K-Åɪ^õíT»|w'ƒ,É%4]Û”ÌGà RÙÒŸ°W[ÁÔ¥Bv NÈBAÌrãnB J•¾ &‘"¤JFwY*OÌ@ûã€1 €£?“%ÆqPÁŒO:ºžú ˜f©¯vJ—Õ½¿E~#›´çt(§lk×"1Ø #Lï\̺©\‰ ±«»âk +„¬Ô_„â®à‰,³èÉ´Åè7bûNˆ‰h,ðüsÚCA£D”Í~ùÄæ’Ýм×.QU0N~@ªù­mXõmÎy6Zo~° bK.sJó?¿†SwÙð¦ÒÜà€Tµà¼T"`¿ˆäëA8Ô-›" t?ÇÕK–T°Û +Vè¿D„Ã6F¥÷õLŽc§SOIKrιâeŸDåL +«IÑ”âARÝ‚öýˆ À,VL tÃÕ7@€ˆš?Õé5‰ñ‹Ò,à@š§;úÐkᥥ M§•ßxÊ‒ÂI¬×´…>ôy¶Ã¿ÿœyOŽ®‘©y¢}–F‘€Þ}m;$™©\>I_VŠ'¬²^Skì›N'vývì–PŒ„S£°åžYËü[Ê…ˆÝ/8BcwOjÑíR8K¶ØWBYµl¤ú餋ñjÓEaQÐ\ú]qS²EqÌ :C7J)—ƒ™^`i + p÷ X¢3{ @´"2ŠêYŒc*š&”®yôͺ­Kw¸<ýïQNî)@ ^çš·0?ü]r„¢b=×G§‚½X ÃÉÍgåp˜ô{HÊ°7_ òÆâL;‹µ£« :;æ#]í¦*쳞 ›>DÉàY4-“N‚;“‹W&—V­O,D{öh©±çKc¶i-uï)°`p=¦æýªç^ÈO8#F7«r+‹wê`eÞàct!’ôYÉ„˜rð±gò’Û°YæUWtĺŸ†â“8™ŠuÑCì lUC"OÒƒ(÷ë%ùLI÷‘b(ºÈß|6BÚLëË–\€q®>LH€ú°JvQL‘7d§'xÎ)ß!IâwIÊPô²|Rðf³äâ1Ï9ÊD3iäF9L¬íÂ(ò%씩=0BTR¶â@ìÞÙÀü .bqq{ô8)Ÿ(»À²ž;x¾ + + »>³4FÓ`hÙ«ñwÈá'²yû}êR +³†&OîØáÞ_ÀEl@ûáÜYb"¾D²&3Wv¥4ìlš-Íå + +bã„…uHjó6~úÖÌ€g +%i9Ÿ¾°³¸’~î°+;O'Ó‰.hëH +%V èÉë/ÈžáŽloÖà!%•×"ÊC™5¼IÉ.“âØ­,e~ðe¡ÕÃU‹¼cŒÓ&iK‰CÞAÌ©§Œ€•úP™(Ò¿‰>”[–¶ô@›rÊN ¨vttr‰ +ŽõW9+£¿3ÛæxÙHX¦ ¡íö²À€Evb u±¤9Òô¢²ìº\*¡-oŠðià7»™¤e¹H×Úz1Ê©ûØ\óc³;ýH¨ürU1‚FXIùïú\htIŸê÷ŒDªóüJ/s çØtÃ|æx³c¥ì_,À%\äìÚ`j%?Cšï³ÀÕ芠¢ËJls™(È+% ¯‘p­}ïÅ"1bÈÿ¨¶#Äál=» +ÓÀ +â%DþAÒ9Ç^{¸±¹¢U¥ý,`_u L·`(”H,¾@Ñø º4 +_Àìñ)LÂÂA” Û¬M‚‰ôo ¦6x‹MlG ©g4/‰Hˆ±Âo‹ŠªònÛF¼rq`\•e|›¦ç¥àò›ŠJ>í$ĺEˆ.”E$^ƒ^4ìl2ȇcºè¹Sh&9b„eý™-7”¢6ëI ¢Õ-œBͺn¡¥pǹ9Ø£FÀÔ2Bn^| X䟉t…(ž%‡fæ: 4¥Ø‰Ÿ£n,cÆ%,…ðBCO‰œÜ Ì»k»à mšñ*,§LK¾ºnCW=zº[w +¨ïœ×¹Ÿ¶úÎ/ðÅÖf"ÑþªÓþ¤ºÍ§h¿Ø;™Ž6ˆr9Ký!z¬šŽÿ!ê!L±HÙÚõ¯bñ å’îqª–Ù%*UK’܆¬|•‚v¿Öˆ¢»-ÿ »ÛíâU§!RX ôtÍzÅ¢È%žþƒ$ÀSUÌpß ?KÂ[ôbâÕ‹*Ç) 7†AA[I„î:&Ùé@îrr{“FµuÐ9S³DžžÉ™ƒlg¾bFzÙ| €áôšÓµJ1Å‚Ö„T!§BC3HÃt¾L`½WÌÉÇ.ÅÚ‘ö‰PÄÇSPÏ,™ñ+–*ÈFV@žÍÕÔܤ“N_@¤¦YµeU¯Ú(`GÀ‰ÒYNÉitÉ=6õîeM-öx@K³]Uv€-N‡”Åéÿ€a*0‰“¿ÜTº0²S¿QÀqµã³ªDWŒ…Ž|Á¤ÏGH+:Vÿ¦¤-¸~ñoûz%D¨ + +Ð, ëꃺÅ5KWVÔDâØÊ´Îà6ui6j„.¶tù2Âã^UöojÐ-¥R­{j† |‘]º^‡06ÌÑìZ RЧÃ"ø²N‡ æ6b&“ÃF-ÇQD€,ÙŠ«[à",ôÑÙ\ •h0B—MltGT^a\ã@)§†pŸsÁ‹ã•,¦À"YµM(ƒúfÝPzàFQ†ì +€í$<Ãë! hi FANO•‰ˆØÕž`š‡ª!ˆ[Iý…(Ä…(­T£ä &kß‹ŸÅ“I€E±_CÏgxKº³ù€i¦Ë_‚æ€pŽª‘*)®Ov@ÏÇÄ]C§ˆž³2ª"ÓšëOU4ÜsÜÀ¹ÊEÆqXž,ºI›¶‚xÊ¥ª*œª$A˜ JÐü<§ƒ¦°uó{—•‡ŸòMÓ\²‘ñÉe~Sê’X +ÿ&‹^¢ðýX…h;:}U²FHa°å}“´ª0AóÇAçÈ®Xfù$8v)“_¢c ÌEõ(UH/­«¦„Ü‘½Ð¸6Ÿ.ØT¤Ôæf„D Šn© LùÐè¤aÑ]îàP™‰†$ +)̴䪧-T+wT©cN’NÍÅ4C¥ë›Çb-ɧª.G(é[Pïœ0€´¨°Ñ€fOsŠ|]ƒ8È7ÂpfEÀÚ>Ò üD VF³áÚÁC$/ÃäkΑD¬Œ¬nÕú–›¤ œèÙ1¦·W€©=!¼‘Êâ)ánËà5¦‹¢*DݤˆÛ}NÆuëÂÒÁ)Ìn‘¤"IC’z>d´¹EY%l¥P$Bg=]í踒‘¡ŠŸ¦ÓÛøSoiïl@¥¬uÀH²ÖﱜC©Öv³’vU¸—Œû<ïN¢ÂÌŸ»ñwP@‚ƒÁËž±*@ó¶\‚c§;rД–ÛMWB ­­g·=Ò2c# Äj„qs£Yu®Á’ +×N#W‚àÆFÇ“¥ï“¡.'ÿ;ö²|‚ÐBÈâ$ø%‚œf@¸´~A aX-Ö‡×Dã 5!45(WÒEöÁâ”%ÇñvhÚ”Š” àNà,p6ˆ_#nÁAÖQ&„…]§–[1ˆc‹ú%wo®ü”±ZMY7™ l.øÇÐÓN6;QTJ´'s×LñZ*€^äèIÛOÓÖH©DÍE_Ul 6³òCbs1ÃlwûåOœP"]Z(åR–ft×(AƒX ]O¯Ê?(ñš–.jÝ{bƒ¹LºØŽËq``¨&Ur ©A âsòˆ"±Ó±¤¢ÿ„Ú úOz’iô· G®…<‹gM“üUÈ¥Œä{ÒчH.¢‡Ý_ØüøÞP`Â’P¥ÝË“gʪø]ÇXYZaýãÍî ½ÚÁ/KS({ÁÅ匡Œ‹Žª–i; F +•ôê"¼·B0HI0là<”æ±×AáCl »g\½z}M6´âBœÊõÀ[ÊAâó”l,ê+|tÿ2u õ†ŽC½¡F^ õµ©ªÆ2p¾î˜<`¡3Ò_Q€j’ê•ŽoŽ d (C%Ç^5$ù’ìNÂ9Ú´+§Ô&=øš«„ ³´éeÌ8S‡Ï.ö”d +šÄïȈ@$œµ–¨ˆ1%"k `© .›¤:"ƒû`dž’-£wµÝÈ ÷iÙÙÈfãnÀnœB¨ð*Ä¥ûG´Y¼…P4Çr]='Íæúö.üèÇÄ8ý«wMEÿÀ}Ä­ÓÿôŸ;ãL1h_„Aƒó •5ë1Ó²Wý7cFÔ³×A¢Ç†?UJ6UÐînª×u< ‚¢:Ó8™ƒâº¹cT1Ñ¢Tìy{ð4x[’r½áŠˆNy?ŸÒõV³©Àµ‹Ž°úúD}v²ÐPRÌ]‘4Š}ŸQ¨Nê<) Tc+iw F²"T%Ö:…XµpÖŠ+&¢'A!\\Öà½ÐQ2ãÝ7C*lrœ#bSñÖîC¢‚«ŸTùªÿ¤ê¹ª„Y5@ÆLdŽ]µbÕ#”\qÞ®\Ú^Yri[Ò!×ØX¶¸¯pòãSx»•ÇP½$öSªÈ΢â@P‹¨¿ ŽÙ‰’GBáxaµî€|-.¿½ûS܇éƒ~{4ÖH… šw>ä“$WÝ'ÕÛ$«ÙI1èjòÑ),N`+¾›Qý’Þó0^‡f‘®È|1ºÂŸš&ƒÈ”!‹÷®Ò‹/¾0Bš0é»g0¤2½Ò×8a=PŠ÷/ð_b3VJÄŒH°3aä»y½£9ŠRl¿ß,³ûbå±úƾ¤nñC…;á»5uì}Qc§†xϱÏÐ@d‰Yæ(Cœ­±kp²ŽÐˆ3qú‹×êͨ¨Â'äNÛuÚxhno’ "¶›l¿ÜDfß´*Ú´éøJÒ0–ã¢j[ª¤ì貘ý‰%<±:ɪÉø 6±#YÓŸ>\{ÐGinÐC&JýS…=6gù¨›æÉLcF·„Ân³Œ0°>p¤HT#È"¡„R4œÜb—JÎlvpÀfraâùMªíÙ¨3ŽË(h}ª‚‚E:ÒÍ’xƒîúa!ŸÎ¢Tlõ¼v Í^dË=ܬÊJ ®ùTåƤڷ»+ ½9€ÃMÍÇK°Žª§4uœ`T‘ Å P4§ògXÓØ*ÚûBô”«¼n‘ƈ‰zCrîÇ"Ι'MÞ 'a +駴söýøÝ„ÜFô®xqés‹7}X L$7~ÊéT ^š¢—ûl:ðÙ˜çd‰öÓ•~µHO„ÀÍz¸˜ÖÄ"D[ò:J}`4Êò-FŽyL+EG‰ ȈÊÅ7¤yÍa³sÀk1Tsç Sä‹«óúžg‰6mx²«Êšõq\z|„°ƒŒ±ŒÒõéã@’¶ój¤m‡ ¤š]Û‰šT§ØÒþâòOâ雲[Ø[–@Ó³«Öû>Â+AƒüÊJnÏC‚§¢Òå”ôQUÝ›Æ0ä€]<_E°`üLÀ’§âž "ѦӛHîÀV©‰êí[ĽŒV]-˜ˆ)Ñ,ðú½Ñæèsq~ÇYÙùle8XGxRTFó3E Ím£Èq²ñ£vNyýÚõamÝþŽ…5mU¨Ê–Yô,Î 38SUr^Ô%Ïì&/Zò'f„vwG¢F¸‚dÉ¥<$»Çˆül s¸©K§N,ÁI;`z}øy<²gÂÆ­ó@A°°F@K¤BAWKÆF +¦E}/o6¡±ewŠzåÔ,C6Ø Ú½Ëig pÉÞö’LˆX‹2°.ÈÜhg]”&;»(õmáè’•O¹Á# G½c’ÕPÕˆÏÀqgIVBµç›3ž$'Ò RŠÂ(ùõ"'˜ A žÚ“½{bo¦zˈ/GOC:ø±Ä~3J’mž êß8tÆmgAš·{„€¥¦@%×w/ò¤âug[¶`KrT<#=[ØDDz"­ ±¦£db¡­‚áÞw#PnH#¼–ðYÖYG4 +2úð.1sUï’h`į·u·¬QUèZ8 E£dJ£óÈe#’ô¨Q}ÊË–±×«“>ŠP+¨¨Á½ˆÚ3˜xDŽÍ]ÑUžÁÖ.Ëq±Žn_óÅ]÷}bî9e½}Ä ßuÕk§·Ð>êèVÉqó ¥i˜hMbdyÀc¤náž\Rg/,ô}àkÕ0-öˆ„sÜN˜A§BQªªÙGÕs?r¯ +³S +ëf )Ú&ÍMÙ$î€Mõ¨–ý}Sÿ³UŒ \!Q$‘2ˆÐ艺pW¡< ›öMÂÞFÆà<æã‡I~QK u3A(±¢W’±®¬í£zMd?çå{/ÿ‹>eMíÃs]AªA®¹êJ¥Òr›½Àg³& ß ÃX+³£A +èJ…t5Þª/4M `¢¤S`S™óTŠ`‘EãN +7î"œ*~L6k²ÚUúñ,Ÿ¥âM3À¬€ctAG :ÜÕ1VøSÏbL'FÈØ p„@~Å_V}Qän¼ì˜l¢‰° ©$BÌ˜Ë Õ¿I¥´Êî‘œ,­öW€ŒQçà†(ͪˆ%´iJÐ)qžÃ`—Ó£iÓýVèRB¹Pò­Ž .’´àíãAÒ™å)Êay»xp®ø9"#ÿÖµ… mq\íÌÜî‚ j'GžF¾Ùü9i޲Р3&€›ÒáRŒü ì6eèÍû$ðŽúI@‘á@s¦èŸ@äqžN®ÂxsZ`©O4¸0ß…÷®¨P1Pß/ ÑÚEobów îN`áä~~±ô~,Ü:ƒ”ö¦JÆáú)v¯¨Å9ÝÆ›ÖyPˆi²tØØO"Ñ©=ŽÔéŒÇ,\…š¬ûª²•wDõ‚Sü?ÄZU‡²®äq@¯^½îoÒÒqP\A÷Í!^¼,úT¢6vVJ;\œË9à­p[ÍG€„—ÌCÄHÊ,ñ•º¼à¬€@}N’'‰ÎuŠfFáI… 2#¨>ÛQBº$y-PL@!F ’ñOuÊDi¿F€ÏêBä@£¢SpàR‚\Cˆ‚ Aµˆ²O]T¹@zËÆQ£`B ežÞYHqèøPv²žÂg@›—\Ñ厴¬ÇPìÎh ù ´p¨ÃfðÃÇŸØu¢Ï9ÅÆtJ‘O Ärº‹ÎäÙ‹áÀ.AŠ® éiè ­î„ÚæTÉ’µ&ѽÑ£7Lìé>»ù¼’äy’çè6ô)4ŽÕ0FHAžÄR€]þ>mkZ¦_É¡99 ô +º@Q;ƒ˜-±ÕAÓa;hÕO‘`²Ô¾©Jà •Æ<ÇÁT*k„3Qè/èïÂ`ñ8Ò+ÄØEþB@=9²À +צV›ˆòá˜ø”átz¥é×®voMþÖPøêÕ9ÅÂ%à¶ÑNr!§ŒO׆—zÊtÌàI(=ïì÷,@H/ÈìÚDkôqàtè¦PÃŽæ:(QüT\¿ˆàÖ|É(cËlfïå±Ç×ú¨á§›O¡‚?2¹I³ÒP%½þNž +¬ô¨#‹žGªº`ýáÞëûó¦v©m­hž;sÜ̹ÕÖK¨#Ü|œÊ–¤+pŸ) ÔØZ†{;N0í`TbÕ±ÓYw6&»N½ ÊXvÞIÍ€Rºìâéµ"‡†f(]a¾Ô0¶º' ÈÍAW?;ǾšßW-›¯ÉQ€Á$xné +9‚¯?ɵ „³Ë¥¼éD/ºmd90ǤSHÂ%Ï‹KžÏlHmŠàŸJŠÊ!Æ4}ŠFŸ‹ñ(òÌx„òwÅù»;vdðÙ~²Fm»¸°î@È$E– Œ$]± àMVÏÒ}ÊùèòȽËðÜRU0TBÆ]ÅðÇ|aðÉ[n”?E¦AàŽ"ˆ'[ûaA! j]ˆ‰‚VEÍ_¦C£ñÅ»tWV)ôjtWyà@Ér2‰XdèÀIp$À²_¾ÏÓIr…ƒÑlŠ:M÷ØBbNt¨&ÊTTúüi$•´ÍF9´@Ç—K@ˆ€K±V–t¶¶]6òâÆŽ‘4t{‡í§{ìD#i¡4ªn‰}zSâ/~ωþ9=Gê ”íì EY0“‰Ë¸åhŒÅ„¾—¡¦ÛÓÄJùÌ×±ëõ°¥¢ÍÖÝ;Ü$ö­ +GMq¡‡_ÀzàËÙx€üCsJ¬vÛÏy…8¦I½9ñ†ˆò6ânÙÞGU° +QõŒZˆCÎ\\§ÌUÀ”,‚p¸e‹ÜE ÷dÀµ¹[dä×3ÿ<†ñ(§ +…ˆ9Ñè:I•Ý%[òzàw#=ö„Þ{7—g4>M®§.3¨àÓâ'Qn[!øf©º¤ÔD‡ÌÌ-ê¡Ó!¹O¡…9ˆäTEÓ>N#Ä ½Œ6F4Qòü¢6FÄi`dF„ó²`×3RNw—(ñÒªó-èÆ1 Éê°OKÅF¬èTLª`KýƒËy‘7]ÆZ<9ȦöoáîšÕÄ_D„ïà8MŠ2j€Gïµ"¿u¶>uBaÑ÷áyˆæ ¬ “2Å–G\‚Q›ëxcº‰8­ *þ×ÉÁ¢èôT‘t=j½Õõõiª1 +ž¿ÎCIPTÙè<§[}Fu,Ï?9]”åé 9Á¥T)²b"s=[¢…=º!«Èôô”ôìo|Áô qˆY¬Ân6b8ª#OÅ‘–1FÓ{ÆúVdÒ._±µXüx²Øñnö4æ¶Ý!/ƒãBèˆ(ª‹ê¦ˆÅN¥µRÒÑÈw# #3ߺͯÚë=3 +Üu¥5`ÆisWº™¸¹:& ³‘ì´cE`g°$뎂ê£&U탕ýBOÀÃ4ÇêÞ‡j#› ¢ 6nèŽÂ¿W¨J€÷€×KÄ' ó†](â ƒdš½ÝQÀÀnN #¶Zê=­ÙͱŠYň ŒÓa9%… * +¤Å£JWiñ b.‘ »ŒÐüãªtIu»UpQ*ªy…9“LòäÀÊl„ËMÁò:¦hnqª( ã.µŸcxw•j×ÍHü ¬ž¸@¬¸bD½S¼el•TÜ¥ýFóåè1ÉjÃó·]£—9ªh{MAÅ®”EÄ5ºÕ±Þt„!O‘D“ã *bAðȸfí Ø(<¾G»]5ÑçPµ§·ÉHÀ¾ Eÿ!ˆÊ0"øé‹lèìÅŽ8&à¯Aà8‰—œv ïtU 4­rsYd½È‡Î;DÐâ"0ÖqF³¼Rp­#ûm±)3¼žò2L4†ÒxÀÚ3õQqÝ0ÜR&Y÷øß‚œ†ÆB"¬Ê×gP:€™ºl+ƒn“,‘ômD +¹qmSq…¿‚`¡°ò§îÝ4p!È“‚w •,·4¢G¥‘d5¢úˆËùçZÍK¤¹§$çÚ0KÄÌ CÜÅ|[û€W7Ùk=‘ô¿j+ɼûʺDO"ˆ“ÌÈõ@ˆ‰¯<0pÜrÁõ£œÕÏCV´ °AÖA!ÇEw#Mt:šÑ>B²9àÙ1kâíø›BDšjyˆv:4hô)Ìtrnô¼Â/à‚^àÓµ©$El#,F ×õj§©hÛ6ýX%¾@\šXÉ´'õX@u¸+ ;¤<ĆÔlð’z xÎû¿ï#RÛ>^§ÅSlo¢e/k!¯Fd¡çZü¹Îþý6( ôy¨KF9®3ûuÖ!&'Pü!d€^Ý5ˆÅ… eè²°qƺrˆÜ Žõùà‹ìŒ"ÌVœ´J2–å cd@YúÀ€F^žì²WFÔ$Dþ¡‰Ì¡î5Ê}D,nCêúBck5 +F€BO5†%#¥—t”õ1RpbßC(… r*ÆoÈ5ÙÞž¦§ìð½"ÐèÁõ÷ÜŒþtÙF´àç‰%¸øTÚk\¬¹ˆ°´ÓòãüÚD«ØÂâ=,ž·:6Âl‰N뀔ô +UŽ >Fð2âÒb‰ïD…åõðët®ÓªÄÓd·—…”£¤ƒzšã—B œsœ—÷5‰»¾ §žìùa¸«ÂÆ/…|ñW0¹ûÆ/¯üÝɥСkII›OÁ¦J­$·¨ÈRÞ;l3;FãZ"£xX¦ºð)5”ඃþ-c;ãIáô±+øéuNâüº(A¤±h¬Ãå£s>=õáiÂC‹ œïl ¯ªò´cxá°5žÎw¦B&PìB-¨R°*̈nOžªœGáQáõb’¦8å_ ÐCL‡Û}àΊJ]„s&n1„}˜¡­ŽÍ؃¿@Hmi’H¼9M:-€†Ið~Ø l´JnFLÒ* Ç„ ¯£ Ti‹˜#Ú¦H©X_onÇwª0"þ­ý¢ÓïTÅ„µ¶M$I¤“, •}×sv˜$HnGÉ»:Ëpˆ +°Ië³úùQ‰ÕjRâJ8ËâL¸¾ÈMdhé×á‰(©eCÀqt)i(JW±hÐ4.;Ý[<ÔîYÎÌ/ $Î^ÉÃõ›]ƒ[v”Íù»^‘ Àõ®5Ï©bõnŠ´ˆ¶™žæ7­£˜]HŽ6ÃJÉ¢K[2 e턶V¢ÈGæ²ð‚C÷(v8GÛ(@a®œAqP—õ6ïv`Mþ>ƒý&Kݧ™Iºo‡ã˜.ûeQú/ÇõœnðÙHÅ’Ú|žPUù’Ræà¡V‡6 +Eú;M”$›k¹>Õ‡8˜aÐÛ‡‚t!º îž‘Á´+—^bÔþ+|$áš÷—\v~QòR©¨plîEøíà,/‹¼0ç#NÁ>¶í :ç6 +/EÉ'$N—ÝN§ÊG,:¦ÙM¿1 @òѺͶÚP´.CÑzšÄCvs¡.ôtÄE­u’KîîuÔ%¥‹ª°¿Ôé$Ü%¹gégV©_Œº<À²÷¹àZTEÈvþâ_XŠ+g¬‹…$8¡LGG,t£ì–ô¡¶$Xh–®1­ H®§ Öá‚嘞çá2¼ˆ RÇWQì: ¯0! Ðü‰\‹6͆*:–ñvÑ/‘ +“þF×Bi!ëæ˜K{B¢1tJmŸ9¼¦Äáâe…x‘2 + Ú“Cµö]Î öóö]öíx²—ØòL¨ÕÿøŠ–ÌÛOÿìí¯ÿÃû_Þ~öéwßýÃÛOþ‹¿üâûï¿þí·ŸÿâŸ>ÿ‹/¾ùöóϾûÇùü»¿ûüÏ¿úæûýÛïþÓ?ú—ÞâW_ÿã×_|ÿõWŸÛW¼\ÜùÑ+8Þ~ö«¯¿x9!_ùÝo?ÿ_¾ùÍçùõo¿üúÛï?ÿ?¾þ?o~ûÙ/¾ýþf4ÿç‹¿ý‡¯ýÂùÝ—ÏP Þ©ŽÈ{ïÿêûüøæ«ïÿÞ?XÞû²¿üí׿ûæë¶ïú‡z÷¾<ý »¦o¾þ§§+zwô/¿þ»ï?·Ûÿ¿þö»o¿ÿØà¿úî×±–ýÞ_÷¿}ýͯÿþûøó~õÝ?ÿÓíãüóŸüO?ÿEúüÏ¿ýj|Òÿýé׿þæÛñ—ÿùí§ÿç·ß~ñ›¯¿zy‹ö“›¿y•¼UÂ*\a¨‡VA“% ã4œ0 ¬Xþié‡æúÏõßýÏ?YˆèN>¯/Æÿnÿóÿ¶?þ³¥íoñöýÇãí+ÿü¯{/W²~¡Ðx½,í¢Û¨ù«~y÷E¿÷àíù¿ýÁoôx¨Ÿ~ñåÿc‹‰Oƒ_}ýå÷ïsøÿ-ÿ­2·Ed¶ã¡/Yß°ÌüÞló¹¹tì +Šð*%‘™NüOܦzÄø¸ÔÆ‚•ÑÁ‰R¢·ÔÂud… +»Ü6P Ü‹œDDw=´¦¦Q’ ÞånKS¡Ó¨<¢#|1†QÃ#¼€§vu–¿§ú5z¾‚¥ÎK›¤H,­Ëº¯M’ø@gÅ>8¤ªw$»0ÕجÉ2¨}tI[Œóvo»R=¤~ 8†°Ex™ E®¼2õ…ÊIƒll\ œq‰zû÷:MFNK#×o‚UF–†ÎèÛ»wíoÆŽE{]0*Pý¨5òC,ºÂZY·uc¡‚h¾¢÷•¢gÍL ¸EÎɉ +@DI"¸0@Š’§ñ) ŒRDGÓ”rÇùA÷%—žlíW·-6*ì¬À–‹Ø"Z¥º^K¯í*ä¬kê¸'íÀkJ¤^8g’ƒM_TÇd¬»,ç«K¢g ±¹¬v­u˜Ò7kÌAÚœòV–X e}Iò> 1ÈÌÔß9…‡´Iöôö4Á5*šƒ„sN;b4…Ó“¸¾ ç(®ÂŸpÁû5¹7/ÉbBÞX<£æz•w`ÓÃQÊ¢½ +VS]¹¾AÏŠ\$Ï,„ÅØ< æõ‚=ÙWÊY˜¢ªë›e nÏN¥ÕIèQb„Ã~,=mæ +5gwA°Üä} öɲ‚O‰®—”\/)ñ‡BIç@:dr‹O¥ºØ“D‰,'~,n«®áJà‘Fc ÜŽ¼¨%RÝ5—NnÈ@eÇMúK…¸Èf8‹ +Æ”PÛò£/ÎgOoXí y.Õ„£ìx³0ú@ÿø.Zª…W»39¦ZqH4J%J}€œUv?μó+q̳÷\«¬ß™b×Q`*VWDV›}`–IeËÊ ohkMUÅŽÀÇfPB+Â&ú§¬5ŸÕX!eàŸy–·OhV Ü„¡©ÞèôÛº#©Ê’ö>3÷(€iÙ,ÿôÇûmŸ45Ã(ç‹Ê`ßV)œYnHéÁ¦ø§3Ï?Þ>ýô>ÄþÙó¿ß~öo¾ûÞ¢éï~û•M%O×~ïÜPvö_XbÿŸmðÛO?ûù/þõ˜€õwßýö7~hÄæÆõÝß~ýùÏq’Zÿ»ïÿÅb÷Ç×/|ð¬_ó;þó{þ·&ó¸’³ÔWÙ+-u¼b‚eÇð„µ„JÃ!¹»·½¯Eà9Ûæ)•‘2`¼UjÔ Èà4¯g×­¶¾m,Š4¶WÔˆ]j Ud¸ +Qê^uÀEû[eã ,INCT9]޾ޡθzãÁ†¥M(ÔíS¸áðSëp1I€xN™ Ë·Ž²5Z,GÐøb×鄵ÓETu+Ž!\à*$YR§ÓÞärh½mz.‚°´qTýðÀõ;Œ™#m/ÛÑ“ç&HßÜ4¸Ôæ­Ó*š©¢aÚ'mÛê4:#Œ?‚å-àÖ‘8À!®ÀPÞvûÏ¢“á›ÓÇ6]á&’Ùú –*-?»|wrÄ#¤ÏžO´oVCÍ"ëÄzÄÅBìÀ/EÒäqQ¤ «SªŽìOB«.]vËxllš#Áæ /üi~] ˆŠ"Ä0¿¸Ò2–å6¸<€íAèg—âbÿ<éÃT°È£˜^ÁªÇKxÛwÒ-#¾³lÐ)°8À±…´ÙW™Û*,kòxÏ¡r¢wðm¡Ižpœ®9‰ü@¨Óžíi¦ìL®$ºdå²AªøéP5'ÌQÕS¹RÓK°ðþƒŒp¥çQ¥ 8² %Ý¡þQ³% S>Œðêi¨ˆè£ârEWûH'ñª]¬äÞìm –F<˜¿—ëÏz¸qÔµ¥õûöõ™î74#~’t·³Í›ý¥_Ú´~ºõ g¿U¢)Þ8Î^ÌN ËY N˜4­§ëÐ=lJ”x5OW†µ_w 9„M j.Û +aMl‘|t&]uùzÀrDÚòí Y*§N  ×™Åæ·'ÃK‚“^F¢YÕóñÿƒ*š8Ëq‘ã–DãS+žðsÈèdé7~@µHظo`'GwæÚ+¤•…sä$ÑÍäŸ2U¥•Í4¯§#•YÖ›thP¢kŸ(ç±ËóŠ'¯¥vzQ½àáVê°àÙŠpb•ÍÐxU¬„aó³5·ìDã€h üÂg÷‘@œ„–uT+Ïï—8 4Ù0kÔà|Õ|Hâ2^u:JË/ÜÜ6IÑG}CŠŸKaµÑþi“)™ƒ‚9PhÕô\h¹êÕ++º$%yh‰¾7µ³¢w›Œ™³£+2ö@¦¿M¾±´®ªâØw€î¢)èébiOq±@šD|Ÿï?ä½>€&€Ú‚G¥xŒðõ!8æeèÑV D0žò¡­–gz̈‚ž6€ñ ©þEÅvqVÍÃgY3@…`’WLVÑï¼ý<Ø‚­¢aP£aQ“z¤‘/~¸¶ú¾ìŸÈèÑ ~{‹¤¼øÙØ—è§@Ä þ õð÷ù³Qw–v¹%ØÌ >§ƒ¯£þسl„«ÀúÉûêfÓºy;èW[ÄØÍtŽ[p÷w¦ÓMÉþ<¼)‡„¯ápYñó,Š Šî§_ÿü|IÛÁùC +µøE…¸K~­ú奃L{Àî¼Þ®ñ^p·¹>nr‹ .PRÃÓà é§È úéùØ£:‘~x<êBæ®D +ׄà+µØWÈÊòyîèd2 +ÃÔ¯…®.Øñþ —†Â>’˜yzéJŽÎ.¯XDKÐÊ_U]O±ª"ì×ËM9.ð¸-ƒ\ö¼$é?Y´`kC}Z= +k?"Ú@íÅ,ëM)§‹ùÌ«2z¬Rºò,ÑkÄ2Îkm£^/È%êIxÍÕï—G‹€ÖÈñ?­¡"2Ç‚[™W•$ «Wæ +]¨S"zc“EÜü§UîçPCˆ š[)¬ Npª?7¾™-”’ª…âóo3nç-•™väþésß0%î8ѱ«<ç\€”Ýì>á®öø„«(Û|/YH¡À¢S ú×w’˜"×láBH®ˆ¦‡fõd€63U*̯]H¢¯ðœ`ñãÔü+~:¯´ŒÛÞ1å¶Û~B°™‰œZ'Ú8Ä/*÷y ÷FÒ:E +WòXdÈS¯,Óæ¦Û`­ó97µhÉ}åLJµ23Z>%y ´õÁ Ž˜·IaL•¢Ð}þ\F ?³n:˜ F»­8"Œ4B1^Ô¶<ÀMH/¹½mNã +ºF=€Þ…Ëfàu Éa¯ P—{T Üžê tŽ(©»N7Š4L\M¶E|T5X½íáL*{z®€ˆW×l;Ö³l"ú¶äB¨&Ú4ë,¾ÛY¦¯Ý®——â ýR©ÙñÐW¿J:t@½a-¦YºŠ@lUâjÇ)rø£pT¦Õp +g›Ë,7q2œ 8z°WŠž£B  :Ïe­íS³& BáÒ,ÂBx–ϸoìfϵ6î»Î,Ì©Ÿª)iK(Ò­¦WÔáÝà¡Ó«^kƒ~uÍ­ž+¯žû‹ÂC5ò¤.Ÿ`Få#f1¹uwQ#ÐvöØí:(òYl˜‰OC€Î¾II3J²NZchªg•¤ YQì!]R¢ºp‹„^]ô­$kŸÇÂ.w Î·Û÷·¨ª‰OÛç±CñØ!œûï†Ó™ÏUͬۂ» ·å¬ÃƳqÛb#èrñkqLµÓÓ¡‘*R£ÚÇJ²¢<·t¨5üN—ÙÁb¿ù…€à@l@›…¹¸‹ªBþ1¤8š§á”©µÙ°UÅD éDN–:zQëÇ£8#oû7G¢4ó’HÆú ðòMÃË÷˜êGÛˆ>É|ßÜÐX?X¼Üd˜ ío•-OƒF M’?û‹{ÿ¼>Q¾è€òÇeÇ|33øI ÏÍ&ç13Ö–hàðÃÙ‡£û=½LÎ $"d˜Ùws[2rÈf##wÜöjÈ­Ìv [ß®˜%?°UfyûK*zžÝŠÙÜ_öä“q¥T>—šp6`4t!|çZ‚F@³½à8>fùË +$‚©ÌAC8“eñ¢ý'åH(a‰Lp]ûèQ C‚Ì’îAÚîô+·ÅVª‚`Ýåqáu¥¦‹n‰b¯ö-ùtyYæE䢿«Uù¶í4d$R\ faß` jùJ^v%»é`cžÄMzë~FÏ«uD}Ñ~W–§ÂÒ¶ƒÂªà‚UÑ]:wÙ|¥8ÞÜ£ÅÞ±¸ïÝ@ËñLê.lðg¶ð²õ3JÚøö Ðõß–˜³–žògдKÒæ¨[ƒn²€&#š ²k€µ”ªÂÌ5JÐbr‡Z3ž,q/cñN³-“<Ü5£[OaÓæ1|¦›†½×lA?‡”ÀŒûôu²aÚ^Ƀèç@QmrÜ,*bÙä|[¼Iá¶Ì0s‰Rµöéü¬ðŠð—W†±Ðt*©b,{|ÌO¤ÉO<®t| ¯A&œº¡Äø”£×È\ʼé[`¯J šŒ ßû¸Ck^ cä(‚!Â|çÛ–RùLghà€Éëž‘l#¾1ÿKB³Ÿg¤@À]™7¸ U„§§Œí%qöæœÖü5ÛG¬¹‹!›ŽÎáZT×T0HéÓ“ÞÏMŠ !PÖ'P({lPO¯4g›Ý&£¼’þ²w(ëN/Ù¯`•í$‡/×ä™åI<4-Ú >×Ü[ŠÛe(n£÷½eíŒRM¬S9Ô’ô³Ð‹iO$ !œ­dN“N3j]« `¦,Üõñ”èÔZ¬)Š‡ ,¹³Ÿí­Ô›’™µ@¤ô†TF:"ªl +gÖú +ë± + kEŸx‡l«'YÑZÐa+#ò1%¶Öz˜|ž4¼ÔPÁ…Ë­ªTf-?IkYÐPÜ;{«^‰4”]\ë¥ÞÅÁ$Qj*U-å2F-+öE a|ÁRm“}n‘îy‹ªm…:Ú Uš[UŒ½”ùl °œŸ]åsm0 ¡“,|r}»ª‰Xyj'¬°¾îj2³”ü3º‘¢n%ÌÃýq¶¢§$Ý¡TYÊ$U¬µd*=ž£Hm§=Wº^*®î`C¸‹Êå—Z-œ2×Ô²›¡úÇZéB4¹ä{ 3öZêÄœ­m(n‡ß׳O—÷ézVk…Z—RüR$¡âuô¥¾ Õâ=&'²ñm+C°Uk-¨+ŒŒB¢ÙýT[=l¦‘e!ZKùÂeí³?4ª/k#@–²Ä öJó‡,MqB5µ[îÛÞ} ic^gµ§¶Æ`¢ ÀÖ—WÉ–¶*äkÌܨyدY;&Üvy¬} ¿5Ãl}Ni®Ûk—FäFLeuqÓâ-EJNômD#ö¬@G üœêû¨õ¯m)ì¼icÚ»÷çÞÍÂt½(tÙ Œ_´4ÃÖÓì¶õBöw?hµÝ˜µù·ßܵwøÎCRÃq>Ù­1¹MŠÙ̼S³ñ¹ÌÇÑ]çñÖQ½{¶~ìöJ­Üí­ÜÁï¼Ý¯mä¹6lmçmYÙºÖ·ËÓÖôÞ–¹­_¾-•£É~·Înùm¹ÞzúÛŠ¿AnwŽ Q°n@;al];‚ánçÛëºC'ÖÍw^<ïÝ;\cÝú7¤Ç>l@‘Û0dÙláÌD¦Ìhƒ±ÜÆOf‹Ã6ü̈à6ÐÍmü·av¶8r¢|fä¹A‚¶Àõ³;@ÑŒ{7Ò6ÿN—µ ˜¶ð{➶È}CKÝ%ÔjË#6”Ö–‹l ¯ÛœfÈm¹Ñ/Ûò«}Ä]ž¶ZÒ½‰†ÛÅBw›o¾‚ﶤuÃìý7yóͨ%íÞÀ†[ƾ oóþ 渟eEHn5ˆiyWËptæ¬l έt²a@oK0„t+ålèÓ­tWŸŠHÒu«Am Ù­Œµalo«`Dw«¦màÞ­"·ƒ„ï*{Æx­nàäYPÜ ÍwåÈ =‹™„z«‚NàõmuEkoµØ ïÞʸ(ü®¼!Êg)y… oEè ÀþTÂÞPï[|ÌoEô o[Œßàú[ICúÏnÀƸm&ì_›3akllĆÛÉÆ‹Øú+;·bmÍì»O%ÖEêÏr€ä½­¥U¤_Mt̯Nzé–nQ•1Äܤ×é¦kUÉ)›-tPŽ­¯Ý/ _>zA$§×¼5Ð= ºv=ä +÷¸Š +êü°[ÃÞÎS éòze¤¼·! y´Ê²NKfm-úCJî(cÁ„=ãsëPÖîÁzÇ‹QµÏ©Èæ§QÏeï—6Öà bÕ—­VÛbÜå-*QÏ ÚýSkwÿæµG¼ý€µÕüåímX[Öûí\[ßB¯ÅûæëÓ\Ûíûœ¸kÛoSkíþo³s¶Éý 7ØÞ RØ_«ßðq +×í,µ'âU.¼ƒÇ8ùÈÅ·’ +¨½z2º ÈB‚‘bç&‹lÁÛy +¨Èþq Z¶‡aIôêʾ4Y×.#ô»Q¯:Ñ ‡!|ܧËIB—@ŠKˆ0\+:ÆOsõ1Õ;»ÜŠu±}º™½V’™ùæz×>G×ß½g»wÄB°â±D+¢½¼sëÏé×?`cüΨÈךùˆ×¤…ðhB }‘mTV]œØ8‹„¿Õ¥€MÜÔ«ÈöõIÔMÛ$ù¿ûé*ÔœÜámfÜ}ï6b¹þ/gñèe”ÇåÕyhapÒn²Û‰ä„(Rè@缼ݯÑn9 ’G‰kÍZ"„ÔÕ»9Ïz/÷kùØ3ùòõÆüòbÑIÂR`»'Á±eràÊ‘ðbµ…æPÈ·N0Ú#E¦OT³Ë;Ö}"Ÿm„$éë(¹¹`Õƒ;®!ÛKŸ¾If€žY|…íìŸ^ÞÏý +ÖW{ÿ%wKÄ~G¶ólwu]®žŸÃú–­óe°’Ç˵LÀâıXU}ðBO7/v>qû.=>µL«Ç÷¬óm\Ý—·¯>kĬ}¦pC¼í•ÇkÂ@÷÷l~j½E×÷¼sïæK@1$‚du”òºÉÄ>ªèží:¨¢A#QÄ5U+h’€'‹œ…’H»2*œÙ•ý´)V ÍfÂyTWŸ—BNÐi<ƃÐ"eÙw“1Óhb ³@¥Bbn)˜)»„ðNœxTÇ@Yqc”E´¸Aâš’”ñcXŽ¢»L֞ꘕ(ZŽ®§"En‘bŸ»øþÃQ{É\¢½ƒ(ÔÉ I“µ=’ÈJiŒTFõa`½P]©ÙÓzÿ‚àùÃW{‚J­6l1R¥5Äcw%eœ=1üLˆ:•s´Ò±í„k¤WzO·N@B–Á+8H{(uöG˜Î7.ä@ÑÜ.ݪZ °ÛF†äf>ËHÈŽLí£‰¤n'r½DbûypjÓ-Y/ah4Ýÿ‚^½2[nbww‚Êž¬/,…–0þv7e Ö‚ò)ëÝSaTºÆO–‡jo‡KÓ¯óKh¶}Ñ–d6ÝÏ+¾yX¾ éF®ó³ô!pUìEò²Nqà7’V)ÙÛýwoJiÃ$M–SáÓòƪ®T ©t’»õ­½~êÝ;/„ E{åéJq–µÉ Œœvùå±ìQO„F)h¡^mñÞ§¶/ Þ ÑwŒMŒ²q½„h5aÕ†¼Èþs 9„¥„Ûo˜G$ZëSö;—·lϽ7ã×­·} + yDžÕ¢én*Œ²ÒÃ÷h¼móçZòf¡]EB¦Ó§úë$>€b±S±Ä)l}0éBÀÈÏ»¼Kòï²½†GðªOËÔ€ŸÞb<²ØÇzïçõww— ½xY-N‰ÆÞÄÑhÀMTâºT=>´¬r¯YÉÛ‹ÛÛõ·m ö¼-s™¾‡ûæ°>‚}ƒYã¾QÝÍ‚}Ã[gÓ¾i®3rß|oòm_ß-X_±ýGß½ª{X²¾éïG4ïÅA,-R`9†òä§ÿ“{¹¡žþl ?PPˆ¢FÎÔ·ÙýÃë?Gû¡[N[3iêàkš[©Qº¦Î“ÊÍ¿zGõ©›—}§{³ßè߯lS¤7ˆa>XƒwU>eЋ‘˜¶I*!´%EžÉPà¿aj$ܺ÷¨é±suªÂ6×m ‘V^=„ÂMà¬8æÞ ¨µ•)âjÁ¿)8lÜ }1êÿy‡èÄ„W`GA±à˜};”#Ye¥I†¬ *s(1bl­!?|‗ÚÈÁdááH¢õª¨-½3âãªc}oduü:Rið5öqù,`tzÈP²䯭k`BPØ“<8Õl¤Ù´è§àÿ^QH´µíCÛ0â´æ+’c±NÖì2°Bƒ<dœÔ†cÁ{žŸ‚Š êvgD4ÍžEÃ,ÕnkeÌRÀTÑÍ~±r.‡æñMH¤õSª’MŠìWEXMa ¸Ñ‡$ƒ,uN|§¸à z-xÅ }½4¿&Ž'È+­)åÅa|*uŒÊÜÚeÌxÙIv±ÛÔ¸%v³D"Ïk'§+)ÍшeôOKóðÀ$» +*ùÅj?ï Ñ„s-lvÊ â>úv|ö“ ²f÷Í~Îñv¢_MÃÇ"¥O®¥Ð¬Ä77ßéªÈ9?ý¿øö TÌEñ†:‘:ü¤A¡NÜAèU¬JZ(Áö2“ñ/o<Ñ*¥µé5„Õ^>šØ‚?ÁÝ !Z›+öÓKùã¾Ïn²½ð¸¡ž„çÐV[?ì–1¶f+=áHø£û"àU YløôOûû mFàÿqþ¾ÿ"yµÍ‘ÿôÕî¦öRTû€Ø"ØM‹ülõ‰Rv/A`"û'7ý„hŒ%¾¯¡úIáÌñÆf[ð;íY\[Ù^eÛ7²+,B€#üR´9šT‹¥& ¥ B y‚6´(¯•ŒÉ6 endstream endobj 79 0 obj <>stream +•ƒ•g'ÄQi¢«åOk=’Uº\3àuðDÇ[%)Ë“ã"YždTx ¼]ÿdx5¨ÏØðrP…¢ƒ’# C›$Ó^‡ñMç#î–$­òËClPO^ÙöˆÚÞ CµšíJŒXõ´»G›^Ü› Çße¡•°{·›XÞ™F0‘8Û³äàµMGTa X´BzNdb ðÒÀ§å¹l|󡮶݉ax“XÖúÅ–JÀ •h^X@HÏfAx›|½íF(%AÃøéâê—{Iz’Õ´¼G—²<ˆ€% ׊é9b¡íy’ÔØË­Àé¥é׉€gˆŸ&“œÝ̧àèŒøΫ„µMK™´¥IAGïSû ÅO˜ïÊ}Ñ~nÙ;Ñaýú†íçY_ÒýZÖwýþ7­+Å~oÖÕf»½ëZuû”¶5o{ØÛº¹Í—mý½›wû:¾Îß›`yÖ}c6\þ [‘`òäB1IG«8ÛógïN\›Ý£oP2繋kSJÝô´Ñ_§Raa¯¼ˆFßéi3J­ýÌôía×Ó&ôÕÇ°ÖÄ\õ´ísZ²c7é2ßèi“CШ&‡‘㦧½üŒ“€Vy×ÓÖ¥@cOB{‡{=m»47LNÔvÄŒ‡:Ò*£foí^=›Ÿ‰ï¹““zË¢ŸmqŒCpWÙìŒçœl:–p/Ÿå‘™ZhIF¶ËgS¢o¯?JËi—϶PûƒÌ´žT³£]r$@ÓB\­ªÙœ×bàƒóï¢Ø–„ +Z†3Xô{Ùlî)³ùî´ËfóM~ éaWÍŽè„èN‘eq/ïä³c VÖÔvõl‰Ø+5Æ­4ߨgüÕûAÞÇe†`¾ç2ÚHð[ãPÑÆNŽ²÷jgøs9쥡"Ó†øsDK˜-{Ÿ4@¤vyÇÓñRцxB’¥d¤g—«H\dë¾)SFb€öm¶žâ)l÷Ô6Â{˜Ú˜©Ö¥BRÑŽ@Á{§8T´mÊG²}¬ê‡ý68¨(­áZosî’Ѷ)–‘@øôÇüqMlM*ìu:Ú¶@ùŽÿßHô~$!íÿúN;0c|ÿ#Ñ¢þpÚ~ƒºŠÓ³­–;8Vb/bêÐÒn¹#fLxuÚ‘¢À9'h¼¾[î@wѶÇæÒøÃj¹ËJøÒ‘š­ýÉrG¤lCÁä•xã¹Ã…˲6c|¶{Ï(—iÎ5䬻çλ÷ozî°„ú‹;éÞyîP+õÒu•iÏHŽSð–§Çk5Ýñ¼ø„VP!ß™îDqrArÙ–Šëèfº…<ÆšJQy1Ý8å7ÅR²GÐ;ÓùŨžÈO…¸šîˆU¨ªÚvjÝÝrà…ñ1|é²n¹3ÝÑ,•ÃM‹D_wçébŸr¹Åàe¸îð|3;á]á’o÷'×0! +»Ùp9Q¸WÈTöl®Â Þzìé[í¡¢™-;Ðl„°coº.wqرËRÛËΊËê­Ã÷ã¸qØ!€Ë°ÖJ­rwØá=Ì*Ûþ•ÇCÛvøuP6g*ÏØ¿Ry†Q´;ë|ôõ˜ ïÓÛRÖ¢ÛV Œ|s¶ TªÂ@ò# +8[†{I¡Ýî% f}éÀ8-©ÑyÜ™½p,Ï&ç´wbD´9Ô͈Täî;1I7Þ{¶ýØÒÞ‰Q0‚š`¾kV.ë,JRÇg¨½tb´ ëWö|·¬ίöh!Œ-{²Bб¨ÓžÄ}&̶ƒLºöaœ–m<З> .Ö²•ÅÍ3æp߇Dßd?IféÃhúCÄ)¸>žaïÃðEJ*,]ˆºc{ÆÙÑÜ[&Ѭš}RA9ØŒg¿ú0¼ÞþrB<÷}6¦eè}@ïÚû0ðwü°W:‰0°õa>þjüÑ}˜Öþ!]o£io›v¯%«IðÈNsß„yù$óàí{66n6­ÿ¨/cÛ‡jÅÃ9‹®?¤óGþ´›þËŸè§ý š/ÿ}4üÿ$½—wÜlä}t²ƒÀòç½›‚š$T9-Û²+_Faç02Ø—÷K4S‘¹µ-õÈh½(l²†>ONâ8T‘,ŽÃͲ]ºláÄ9öÿí\Ç«‰Íö©©JðèkŠ0Ç.UQÖ¬CŸ°išÎò¢EÊé<ú·Ð š©_J@ Ý0kÃ}˜Ø(Äa_"*„óõ¬“ʦŸÌk¸ShÚ’‡võPaU|GéŠ"i‡ù÷$ݪЮR€©,^z¯¬×þ7œ —@,+Ûk©ÁÁõ|Q•ÕVBeXR.¯--Z‹I½Æ–EÒ~¸Ùðü- ^2Ëųâ-IÀ.T5°!“kã%QAŒdõÃÍZ½GˆvGO~wj¼ +zt1vêt)ùº+} îJßf62Ñô¡L(K̉Ù;tÉK]˜}OžKC}ØcÒâ1iê÷ÒÅÛ†:•Ù,=k³ ‹†ÕÔJúTì¢à^/ +Ë\½Ibáó8u™‰!äÛÉ€D··È«HÔi¾3Ã|Eái_œlTf—ÚCÆÊ°NmybǤDˆøêdÃ"A·¡¹1ֱוS£çÊaÙNá{EI¯dc‰xQˇ×ä‘8¾.}–~%®ÌpÍEù#Ýa­¥~e~Qò×~aKÄI¿â°(}êÿ³È*Ÿ³çwðjNÇ"ºCpè *8Ï>l¸ÅÚ§ˆêÖ6£”=¦!ºØ¡™Z“æÄå}À+R‡Këbø%ðÍå`Ï´`UN²Ã`Û…s²Ý.u/^ÜxЪ ë ŠBE9‹ù3Íx-Ù:Ÿ!˜sõ1çì^?ükøJÊí++Š¯Ó"·b{›‘èWd[)þp0ÑÙôw¸ZRsÇÖXéÓX4jySyrIQR}ÀÏ·ˆû–᫲¥ÊÓ‰%heP|Hº½ø·5´àÀzsƒ)”g\Ϥ¹ž‰M¥Ë%f;ðì-³ôËVG§º°D."'¹[µ×aÕ^ÏawCoÇˈHЩ™ãíe5 3°I‰ÑÏ¿þùåšÖƒ×/±çŒ\l +¾BŒŸÎ‚„jrt@_ï×xëª%-=ünut¤'«ä°~7¢ÀÐ ¢Òó“DíGçB°‚BÝ|úÀOt€ª%—<¦ *6¨ Øñ2Åìd-q2â«ÇÄdTL4¦ŸÙ–yï‚N×K‚Jµ7è(ùz©³E06â=¿‰°¸ÁÍ·V»æy½ÝTß “qU<9)!·k-õ™.À\ô%QÐ|¶úâíau¾`¥‡}[r}qc_Waº’Ùm<K|;´Ý¼:ù=ºlÑèuû¿Ý?Ú¾äÅc­|@Ësî^MzKçµË)8í/;â)‰ªkó 3JnCc~l·°S©?ÛÚH7ûÅ5†,MÅi×Xº\c +Ñ,l·Í/ž1'â¢ëzäàLÈGˆ¡ëj¯áˆ=eÛÔVÉ2û1L¨âïÉ×úzb” /Fsû°§P jÅ3®"8gá·ÕfE|Dbë—°m=xÅxD;¬n¶?‚ÁX¦‘Kû þåJkYƒ·žkAvaò9\n+M—x4ÏÛKÍÁ–ðÈ“œŠ–oºÜx3™í¥êÑ9Ëõ*‘ +K™fÖR,²#.}®»Ì!§aÛ¸ÏG5G¿¡çWÿb»V¹Y²¡Ç¹”XÕ+m€ØÊ;V*T©™™›Ä×–ÓÃ8óyòý¿¾1jUŠùÆ&2»e)·bµ[’³‰ÞnéÑ&œ;rª;ÕÝ™~mš½3OÛT~—ÜîÖbcË §Ôð–MÞZllÉè:Ië&ˆ<òÛ[9å™ _Ìž)ï¢Í#­¾×|9øC)ÚsôMRzäó÷‚Ôžúïn³D°)ar‹~ö(8l¢Û³0±êu_UŒ;¹ï«ä1DÂ×ÒȪ.¾ÕUnEÊ·²Ì&v> 9›Nú¬úÜ©¬Ñ&Ì> I›¦ûV~ºÕ†ßŠW›Æü,wMUú­6v«i?+j›$þVƒ[Uõ×Þ4ÿVü[þ÷²áb °VoM¶zåæI°•:§ÁV ½õ@ØÊ«›—Â^¶]ýöw¾û¨õo制¢o*¶:övš­8¾]É6âöm£¶;³Öí÷»»–ýßyJK×àzÈK›aŸk‹â~šmŽu²®­‘mº¯•Û—fmËloÞÚÐÙ_Þµtÿî/ݤkåX»OûZ³ô®î—¬µóµ-}[Ól[5·žÛÝ’»uì¶{kömkýlÞokcqÛqf'rìP{Ûòn_Û»žë¶¸÷K×uë¶>oÃWkvݳ·fî¶Ýo½àÛ`ak%o¡ÆÖ…žÁÉÖ»¾ i¶Î÷mMóB­öÛ°kkÓoAÛÖáŸQÞ† ¸µ³ØPWŒ¹bní,6(Ãè®(ˆ-FÞ@wö†ÀØÂó ¼±‡ø+öã>UX¡#{Ê1À&{’2Üæ8óàš!­¸—=ÉZa3÷ÉÚ +ºÙ“¾®óCFÜåû¨5]`F{ +¼‚”îSéã´Ÿg…Gíiý³º-¬(­«¨°âºözÄ + »¯k¬¨²½>²ÒöËŠk{.Ð ÜVÖÙPs{ih`ín JBo«G­Ð¾­µ#ïê`Àp-§mÈÄYÛðŒwE» 9+}~r« ®èËÛÊâ +ÝÜê’ès+in˜Ñ»‚è8UÔ‰LÝÊ­žõ©F»`·ºî†ŸÝJÂüö¶ ¼¡w·zôüì .|[÷Þ?¾VÍ'>y«³o¨æÛ2ýŠÞªü;°zmìí»þYJƒT’YߥRºô)ôc Œù±ùÆ7]•ì-%Þ÷G¢ôfáyãàÔoœ,¢ºŠâغ˜÷ÆL¤ÅˆÎØÚú·mxóRXI¨Ÿiï +)l„s¶ÆkOYJÄQ²bàÓnÚQ3àS¯jéa‰#¤¶ûu¿’ÛåÉbl}³¨ºÖy5Ø"iQ`™dš§WÇŠkðÚ´Û¿gí÷]—ygPqý¶µ·¸ßš;_Ší{;s6k÷sÆwÍÓmª¬­×m¶Í^í6YŸ»ëTŸMàý%Y»ÆgCpÙ«1 •jhÕ;¼ã!?Åö˜=[R_nŒ)`¢{0ÈéyU‹ç1DíDAR÷ªó”Dë>²|J·óä 3F Zäï´+àGíô.µHŸ§èþáE|¿€UÀÿ!wFû ÙγÝÔÕ”àÝgòx€¢¿ ç¼[£ŠÇÁÅ'b¯F¹ÃÄö÷[Š÷?íîë”z­ø›ïÝFÜx9ì£VOö¹5?®¾ûJì×xçOAÄÛºÄÇDý»óŒ[¸_Â;7þË—çüªœ¯Ž˜ »^ÛêRÒñȾ™v’XáÛ &Jë7®¤¹í¼1™¨nAð¢³u ^=%æé7—˜yQ÷&3㧬¯¿®"ëZçù:'ž<#¶ƒÓËa›Óýa;ðìñ{>åÏüqú1ž<®¿ Æ›)æû»öd q3Áç§Öûp}Ï;7hÎGª 5¾úAP ñêmìþ˜AZ«Méw«åFÓ”¾j«=‚˽6<Ùv OÁ!\yÊ*-Oôí¹ªm󱞻<=Ùl Á-Ê¢<êBLö‰Ø°ŠäK¯ˆÔE‰·pÕÙ÷ôîôô.õw| ö¼êþóM, ¯½Õ2ÀSwÜ +ÊSùÞz€ëÑùVç¢x×ݳïÎíÆýQ%ut-S*iݹ(0 +ü“œÉ¡Í„Aq¾jûîÕ»û7ìÓ÷΂Qê +‚ ¨ùÆ‚; RaÍv)á¼»Ê`¸ªd‹Õ¼jÿM »%ˆéXÜÜ|”³ßMÿæíö‚—ÐmAÃ/¿c Á(UõÔãÍCN€¹Þ"›÷}ž 1@9›”éwµÜÌÕ”\xÀÒêC Â6ß#á4×g«¤ nß»‡Ò¼Ã­¬ãþÚÙe«îdÏ 1á›Wwý¡·+çmúu±Õt³H˾ -ûü´ÁŸWÇM£üðBš8ûO­ß·*ÆoW}'<¿ÿøUÀ~¿«þþ îRˆý®šüs*¬jþë4ºóØ~ìj-°ÍæÕ`{)žÍ ¶wj:!loãê¡°¿Ôw^ Ûâ0­¶ueš?lËÒ“cĶ¨]Z×Ãëk¶åôö*·eyûµcE¿nϺ¼ÜÔmٞɶmuÛÒngǶ5nslÛ^·Ù9wçÛɽmîÛK²Û‹¶ýØÛv X¶÷þÝXg ŒX^þ[D4½X¨„wÊÿ¿AÄfñ§êfÚ·†ºm·è¢-a5·’Õ¯PHKu +S§–& x+gö,É®ŽÊnä#¿£Ø$! FÑÞ‡Úo»ƒÒ¹°«=K&ˆþ¿}ôÈåU+Z’œE«ªƒ7BÝêàÔ:¥©=èuFISàé]k>£ª•­0Í{8¯êØ$;ðÒk#ϽǚOòÜ$XR˲¥›öÚÝÇÓ¸í©5‰Êm] «&‹h0ßþŒ4öº$g›Ç= Ÿ mØ&E1WQì}r¯ÂÚû»q'н½bûiÖ—t¿”õ]¿ÿIcØîȶ¶¬7u[™nŸÍ\ضG»­‰ÛìØÖÖÛY¶­ÑÛlÝW÷uÆ¿·9ÌšÖŸP–{w)àöP%.AÚÚ÷ÞH.¾l£,¶XäÆ©%¨ÓÕFXº‰ëÁæ'¹ã¨VÏà N“¤f΢Œ°fìýÆ%  C§)cÛ6ö¶»K’ÂfΑpL3¹Õ%©BÎ7æH, ‹pÈ ws¤zú/HOêaã·¹$Ç&åF½ßÞË—¤Ò¼‘—€²õ;—¤Â¡sDy¢¼ç’Tæ7ô'ëKÑ1Û…=݆<âî’TÁ VT©cäÆë›6—$âpK¦NnMƒZ¹Ù$!qf“ؾ dFº±IB›lPª¶LÇÎÍ( $ád %-…Ý1‰¤ƒr‡eH”_n¬“@ÑS6¶»¯¾´¾ióNâ<Å–΃üîî$`½»¹ÃåÆ;i}{>ûÉ™w’Ô’ãájÉv +ŸU~u’köHí‡ýŽÝègû̽ÓÏ“!áç$.ïp0–¥Õ* ÿqß÷‰}Ðʾ§üÞ³N’p ü hºq†ú¡?¸‹-ìðom9º·NúÑ~ Ð$¶µ‡ZbþCÔû~úIò]Ëò™Ÿý;˾ýõÛO?ýôç_~ùŸ~ó«ï¾ÿ‚±¾Äÿ0íí÷&ÓÿÈ:ÿõŶ‹…㔘º-[X%Q䈱7¾cZV!)ð°Õ"Ú"sà±J¡¹tA;ÖG¹&tRO ˆÛq ˜˜¨ƒÝ³P¢ØzäË—…Éú‚èJlÑrew¥‰¬o†„gßÌo#ÄKg9cm<íº»[3D G¥€ œ„²˜%8,=¢‹ô%B-›˜lZ˜•,,REÜvS‰~ü{ÆBÞÀÙ¶vVÜ­€Å5†@èí£wqJo—àÚ¹£ØevWT8Aö ?L÷ÕÏ€)úŠ6h«À†’ݹ‡&»F õÏæ bˆÍ»Ä>òXÌm"a‘Œ69 ȦJhv0lI—e+X€‘òeçáRšä Pý‚-iá‚Ù¬mDwÇòI$g0y¨qpU‘®|Üv¯èV ªíµQöPðˆP­£_‚ÌÑ'@¡|{â‹B˜¦m:¸ðógsjIU&üó§G°@©-N€t£&¦‚0ÚRŸ53Ák“¿Ùî¸ +²,ü:'özlûF™Ñ>n³M«ù à[g +éÆóåWÙ:À„ü6$7è­p7Ø{Ô-@H²”ÁœC¶ÂüØ~žÀè [ˆ|E3BŒ¬"iß'Îé`c(6ñ^ h…è¡(Ç-v+ÅÈZ5p]áÓ>}5§ch«Ns(ÇÁ¤]‚º Ji[`n¶¬&¡Ú)8€ÉQJ”úSåÙB­m%›v*a¿’S}̘Û9¯ ŒÖL{¡ŠÂyÎ,p4@!MË]Cñ’‡±£ÚI˜iÁÁ>EâÄj‹ˆ‰{¹´ñ¡j·csU0?ìG=I–AG#©f>Zwè-ÚÜÎ6Ù¶4µºÜgwfs`æ‘î?a¿[µ«`ßÞDqFñs„N´ ¨¾§¨1sIðÌF7ùÃ`©âì°ëÄÐÑ鿘4Ù·’Öo·u‰®¬RS)è 6‰[ÂvbFê(9Ú °b©ž$fmٺƊÝqƒ}åÙB\•u½HDÙé·»è¯á@šR3ÁùÒÁ °÷'Wýf¨F~2g oÄ]6L6¥x§‚Lþxñ§ÛÙ¶ù7]œ%)h^c‰·Ùsúà\ƒ˜Ñ–Gƒœ}¸»|"} 7´øwí-S×:05aQœ»§\¾df:š?Ëž¦£l¢MäKÅ;(|¶ígÆ1ÒH››ˆÖ™¿OËä¼ØéTòlþjc)Ô€šûÜYµËà +‰ÎÆò¬½K‰=:¢nÚñlŠØì œª¯"½’9¤gÝÜ¡ZiNgÒÂ]v\¥YÅ&Ä5êSYÜD•ë°‘û©Ñ99;ØW’`²Mm[ˆÿ±è¶÷µó 1£Êª¨1Žv “X~P¹c`_ ŸÐåVTÔŠúæ›DêU­úv­Oœ0Œ:ÍÆ…&óS8Š·ø(”-b’¯&p©¶µ›=prÇâ¦mí Ë!P´íaà8Áª4C»q4é/åŠÖšMYB„bw50¢0Ç %Ú›ˆÜ› +& Õ[oºià¤dËL×.t«ûÛô8svZ*Z&û(m65ÊÊ<@…BRÎÞf‡H<$±j†ŒQwhÍ©ßÏ£m;•iÖz逽 ×Êlʈ×YUê}eÕqÛŠÒ—OHÄ3uÐ9ô«™ÎÁu/2©l_ÚPÌìîsmObO ä{^PUõñùñhú¬NŠ«0Û ÏLW² ˆÞ…Ûeƒ%gGx–“ŸÜÑ&è*\éüL´²»» VXÉ‚Nï×!"8pØ>²Ûè‡Ån3§)ËŠQ¤K”[¦Gòi*Œ›úœ06Þ*%¬Ò"µË¼šú%Ì~ö@—Íù¡®Ø‹æ<ô&º-ûêÐ$ûO±;.ce„Ê]†âƒ¤»ŒŠn°ÞÅ^ª°*ÝC¦@‹ÐJû¥ö  %Ý•»uy/“«âe^Ý€MO¿–Y¹U⚀½É…Æ!ëU}(•Ql#›ƒª­(«=ÛIÆÂøí3\«ÆöÐŽnö0I˜=2ÖÍ1#i{°‘ëb&²×›éPÏÎç[d©£¬ºy Q?¾—ƒ’.\M’Bò¥ÑîF¿ªÝ3}©éG'¡ù êAö±9Ù®˜`%Âô4«Ç!”‚.SûXj(M +à¦F­K™£ùr`‡Í)”ÈC°WÕ>C„Ðe™.`õl¹£¸cëxIFšY¤0u¨dЩi¥áU{ £ù:ýùø¯î<° +™wx¾„Ì\½9’6ø…x%=D¼Òì¨Sñy–U-M©ì+‚"|ÓM ÍyÅÅ0Ý2De žÏEQ´ŒXªh0="Rí¸ÿ*X½.B€H5ÓüfàaW›©¡ñ„;®êݣг£÷#ÞµÎØû0iJ™ 1Ë°ò×–i¦K®u®or[ÞüÛ“LVdAI] QZAø”pÇnHñ®uj ä%eŸ‚‹\âôÂB¬¤M# PÌv™ÖäIXn¢!4Ùµ†x³?hþÍ¢µ=oº¶w»«Q¢çS)’6›³Á€ª;°z7»šÞháÏçþLèEGÓ‹LoΫ— q5š ÚµžN³Æ”š#¤ØÕöŒ_^œ¡NGj”¤‹ü9Ê㤸itŽÚˆL¬àíÅV«p™·EÙS +Ý`Mœ6°rFÚDGÔKªÖ½(&2$c½±“ã®jU*Ð.)Mí*€¤LR¼Y +T”m5ˆÆËVd¼'ÊuÕDÄ(ÉE_ä•é¥ ÚŒo<0CÌO?¨ŸÝjEûçt[•jÄÁ&Ív0MŠ-*æ{š9Æìqµ!ïô{ÃV³½wÙ„ê~[ͳ÷œúd«XM ¾‘Ä@Ýïؘ,7ÍM(˜d:£éCè“lwPP¢ùDÉËŸ“`÷ÖÏÉ"„<G)ÑŠk8ŽŠ^0Õh ²:¤ÃÙA ”½­EIb­%FΪ +O|±LÛtÖmÖŒÖ-±9µ.‚ og5Ž}ÇP4ùÆæFv£YÝ!Ï.b½ÑXÿ­¾¸ +|„Ø9¶V4ú9¥`.zÆÍiˆŽƒúôQÓпñ:8`x/8©n|¤jèt¸ý©ÍÑOt@ݺQ 2.$  ®ùpÂÑL NL;§è¿Å;v~`¼kõ'‰ÒR]CBXŠ#ø¤H|O¸“g7mÚ¨èÓ瑈1U’ûZ)¡ïáZŽpl¥Æ” +!Š( +6ÑÜJ›'tïAzÁ nÉG¸t3ÉÇM<ẼAªÈŠÌ½¡Éi`h™&b·_!„RÙVA[Œ‚»Itv7‰®¶¦“4gÈž¤~†”'ÝçéZ¿­Ìp>ê]ÝÞç‚Ñ6@BÑ·À €Q{2 <”£ÃC ͺ! A.N^}§ä ´]*#>ÅÓ èqS¥LN7}b…¹‡6b›aò©Ð_³7Ê:êèØJ÷¼I‰]§[›”îšHòÏ>Åê þ=×åu¥zNK—ܲVÈ_g‹$`çÓä‘MÍý‡ ü´#Om ‡¯@œ* QJûL/¾Â36.,¡@°ÛTØw›õ‘‡WÀ‰7£õ&µCg%CB +æÄcwò}tÿK,¹”¨—›$öœœýˆ7N8€¨Ã\–±ÙÜØLIw×qG²‹ +„@‰ßrÞéu˜ö¤¹%ŽéºEöòÝvJîÃýI³;]S‡©5ݬ:^@¬‚§q…~vÛ«¶Bq•)[DÒcàf‘¬»…‘`ÍT¤±YÖMG¤«ã8¼Œ-lÜ +¿:`Š7¹øBÖ}_ÕòÆ>¸Tb÷Ý” +oOO%dEù#(‡ûm=€Wu0 ¢mα€Ä:wi™žsü^!Ô‚šp½LAbæ9piŽ‚MOÄO¥ÐÆq©²a>v•^•ÊÛ†°6_¥'/è}#4+Äì ›°ÁÙ÷b³EÃøü„-«Ü®ha[}û«éÌ;HÿJù6Yú‹|ÂtÜVÍQ†A¶¯JǺâDÅ€ÕåU™±è}–VÏð¬4Ïgs­Éi¤QðNVPr¨¤4wŽ¨RÐÂUí{‡Fš¦H ʼRœpñò챫=`žš(XU`õfø‘Àš‘¡Õá&ê·#¦b#aw_À0d[M!³«db97ú ¡­&³ ï¯øìeQ¹ Æf1‘Ìa"Žœ¢•Ý¨©kZp«!È™´ -œÉ$Wv5&mä¶ñ©ñX®ÒŠQŠ¿N´Ú(7JݦÕq:é69ÝÔX­ázÐbAq6%mcS›,RÈãP€kTíÓI¨÷ ì°ØVóž]IÆÁ›T*¹¸ •Æ˜ ÄA“ ãM‹»Q…kÆ15{¨ÐzqY*PŸMˆ£öqŒ)¸>7=”ŒÉ´ÕôGVJ3o‚ž™ÇN| ^XÕÅÌ +›£7îønx>ï¼ÂøœáP²´ÔÓåa +îzó‡®ÒŸËû@Þ»¡•À‹‚ë/Áéw¬¾³í~ÁÔªÇ"×ö¬ú;a(uZ+Aðã«pâ±µU™6wH3\pp +î}<€ÓJ<§µ| !‰Ê¹h´˜>Ë-6V’¤¸{Óy[$Hg‚ØШý‚,Üab +Ò¢+/†j*x|Í9%ãMkȧRØîŸQ±6ߨpÛ6ÔGlw¨³ˆ§h­Ô'1T||p¢ßŽÁjO‚p 5,;JaVIªi‚°µ8[Q*y‚ÈE@S؇¢7"T ýª˜‚Ž +ÕP[]ªª‚Î •YA݆¯­Ú…bAý‡b³Õ‚5k[C$Ô¾ƒf–Í[(Tݽ±¤BÍ^°ÃBÝ_°åBýàÖ& uˆÁ¶œ%ŒÁ, Á¼ýfWIÌäP‘ÌíßêC—ÊÎ`¶Ï¢Ðiè‡BÒ­Ÿ +Rƒ¿ŠZƒÏjc·¾O(­]]¨P¼°xÇΛ‹w­^á,4åZ¥¼õKß:ç6JÁ;ÿzs×➇ÚïàÙ/äÛø@¨COYkÙC¬"ÖÄoB^OÂ%¡?„\BAÿ6tB(ö¬a¤§5a… + k0+4G„pXh²ØFÓB³FˆÊ…†Ù‹#»aè; Æл²†(C Ì6ÒZiBÄ4táÌPëìÝÙÅg×ÆŸÛBk,8tmCÊ¡I)D¦×>§ÜíRÛ yh» +Áöа5ãô¡ßkæíb!YZÎBÂ!4®mñ9#ï:æBÊ$tÞmS/¡/dnbà’󉽄»ÔQŸÅv£gÌ–”ÆŠ=ÍX‹ß’ÅÂþÒÂ…Yt¬b2¬ã}bÝ‚A#ó~Í©™ùõ Îo’Ã!-w’!!·aŸCËå6»gÂü +Û€ô£¦˜"”ÑI„_^ÓŒz3™·àéQ¯°d+}ŠÀ{¨‡…è'&=ûåÔZfWÓ"ú¤LeÞܧ°m¨Úܘq=yƒ2ì 4·ÉÚšŒÌ8T +Vm³¿ñ9k9~Ëš‰#YÚßm'dMŒÇy]ìê¡ ë³&ê×^Sýq›ìJÂn[+† Õ aß¿-~Çf-ˆ'o­¾ø|70Y):l¡fá™ØëŠûB=Ä8uRºöl0ö…IÍLxû8q/q¢˜Fe¤õ‘mêºÁUmôA‡ÿó ûj¶ãEe9yϯ®SœÛâ+‡‚¦¶e·k_o†qÂV«Š G|ü•œ·á(„†ÛæëÖ;|·®ƒ ωt]S½0Ÿè×åù›¯F]¿ù8uÙÅm.Œã†!;áæ.S@õÞµl©`Â,)îÍ]?UXí ~.^`¼G³(ƒxÞþ°|øw3õî®®7;±¶Nk‹O¸»î€¯…;šž/3ïKý-ëGÚ¤ÛvD#ñLO,²å6CÍS|ñ9ë$ÆoùÜb|÷~ñrÝ$Ò,EõànP¶î“I8†¹‰œC}Õë^#ÍÒÈ\ŸÄÅÛ{Ö6³B.þ@A w™DÿT=ÌyàÆócâêÓyª À>+P1ãg6~Á8ÜqoDBÿüUœºEmg}=U˶£Ï€(ØÛ?´Ûh¶d@$ÆîŽ[?ݦÍÏ—ýõúæõã{¿Û~PŸ0÷ÍH®æ­õ—°÷Íî‘K…}md€Z&@ä(àæ”öt‚½;‰á)aRÃw|0íóØiÁÎd·ô£mÌ“†×ï±”dÇïRŒâÄ 5AÝ䬊™ð"â ‡¢Ù¯ÎÄ?Ó¹pEZ¨§*å DÒ¶h…¼%é1IbÉ„W;.‹|zt+Et…1ÿüT4ÒEj8wV§=]uZ>µì…gj :2qƪ¨Âq(žfþS¾t‡`î1‡zC£|O³æ€“ÝinÏè)Ía¬ƒ¥o§ÄðG‹¦CuÍxÞÒ°ä9ÈlÇP¢ +px9%Ùò)†:s½œ¼ÃI‹±Zœ…‚ld"0ü®ªÅ'®ÐT‡{\¾ùtשIWš$a"4s—§¥‰ò&JNŽ¬Ø aOÜÝX’JÉÍ‹Êl`?¼&Û( p—º™MR•W%¡Dj#Kôky +«¨IX_"¬|=h€D€ÈHéuìô$3ÝBb3kTÀÿO¤i?ûÜÕTØ“‰ÞqñÛÿÚ¬;Ÿp‚ºÙØ–Tƒn¶O˵pv^™»° Û5À«šjZ&ÖL½OWþ¹zãÑæ8‡ñ0=V@õ<‡ dGPØc;¡ïZá3¼ÝV! •"=£, ÈëRøœ¶‘'à)ídÝQ7E³^îñÙç„o!Jr¡éÆ äxålã#Íô “Ї²N„,š(–!‰æÔâ¹Y€{–Q$¯°stl/q#!¨|€L=bØO¢ãÆG% QÇ8æ I#ÑqG Ema'IóçA&#ǃ$X&s^+ÂÁR–í´ívÛÄ–ÐùîHöË;çATKV…ªˆÎ§g”ãO»‡útÒA«èK…è$]”'Çâ‡Ò}jìý¸ë«†}'Ä6ÏYaü”Užn¤ñ~äëÌM=°ø¨F–õ‹šhÝQ¡ívPTŒëNŒÊuÙÌQEo=þ áÇ +¦ÁzãPwG:Z*«Døkç³VÒ韛ã€^áËöJ7OæIʉ”Š¨ LGü ÇÁïʤ\-qmÄ&M;+N*—å Ü…ó%ˆ<çÌÒ&ÚJG)îäQÅgwÉCs…4ÕZšs-:òL§c^(Ç· wrTnX¼Wuç{ûõqÀy‹Hˆ—zñ*”.ûn`gp¾É³ß(i¸NÚ¼ãHMìÃß ¿õ³>aj%R üx†gØŽ(9â»é¹ŠŠ£¥ÕSÈz&•:a+Å/&#ù¼|5:N̈ÿãÜÂä„s Y³zÕÂœÌgÁ=®®8M~™¤ðñd +½¼§¨Žð½„n˜? –ª:›½ÙO8† ”äUHtSsb©·w:{RCÏ}Œ&WRìã¡à%ê´_‡ °ùc+5‰õT®ÔK¨{hé’ª)”¸H®PE\ФàBôx**¼pÅ,ÅÑi»I ¢ ÖÒ¬„Èêaj]»A¢®¤*³sTE‚Úâ >¬Zf¨÷@Y5²…ô­€ÄH嵕,òí5E6utÚn¸Tq¤ù1=òLúE‘“gç3=â(I±q›’<jâŽäEOtò7}žÇÙ?lYDLÆ€ÙlZEž‰ÀQá4?LÉg.q¼á‘·uFàRJ¶¶Ÿ¶'ðnº‹ÒÒ‡µ(»ºcnþgße7ÓwII¤iÈ×í ±”L‘I¿¶MíðMšŽgòž4¦°CØ+ ÿ/9)êŒÜ·Íw*ßzåJ]íäýSŒìk˜1?A“°ì SY) +“'åk_‚ýEë£MñîüåûúŸ—¥‡ ¨*öQ#Õ©˜É_ +VO"Pnewª¶Ìb£ß„h =ÉŸô¤f"º¶2H­HH"h“ÌQÄcMÐ;*mฺ_Šw¤iº¾rQÏd6IÕäŠÞ´ÁðÓ‹ú@ÌF¾X¢…ùxÊdßÙÈŽ+—Ô{ŽÊ¡ˆ´¹oã?8*#!–o5™Z£":VÁµóÂ/:¨¨˜ð<†tàü”ÕÊó¯ŽÄ$]äK¿½·óÚ::7¼‡(=îû,Oœ‡Âþ@ÉPyóó×€6àb^_˜ÄWÈ£èûè{áøÙÓs3lºVIÙ¶£êr3s¦< ¾S ùY?X´¡P³@ú¹[GT“€ƒh÷ëm)‰ì{¿ƒ(*¦f£e|ž²Ù‰üŒ6 s5¬ÇÝÜãĤX;kß<çtÐèCç,¬õ[àØæv²Dÿ[“W¾*$ŸÚ{?#¸C…¼¤’SA¤eRÍ &óAC¯qiÌòAÐô¡Ã +ãP.AÝwML¿Iά6»ƒZ¼ºÙlTh*žÕ¨ÙL¯›íÝ^í3qbŸOÁxÜæ½ïÓrøß‚ê¡üášL$á=?_e|óz¼÷#X¥Dœ‰UÒÄÙ\%ÖvU‚ä ‹„fØQøÆmeøº[7z`Ùñª‘™Dú=òù8±*Œ ŽWòbNá}ûÀôCC!ö+“}°_Ù”7è½#eí"Ì7Bµ}â©qø^fÐìxBÞU +={õi¾íŠx<:¶/ ·øº¨ø‡¯‹ÕÐ>¤ÞW\ì³Èp×D­ñWº®Öʾ¨TMˆ™‰Þ9ÀÄJê¼¢Ð÷V—¨æ0ƒýq½ÀinŸ × :•Åèd|è²w¿9í®Þ}”l·Á]^(šW\¢¶E/¬ŸZZ*Ä}f–¶¸Ïˆ}ʈL„öÉsÅôÐ)e›<Æfœï5릟"‹C$ÒUUO¡ñÚòÁ>œì1к°È*ͼ>VuV)Ñaþ­4>Ý™3Ö&ÀlN±ßQól±WÈÔš€†„M+ÒÁ®-´wËŽC$îL!š˜¶Á‡Jy÷àò¤ O`ǨñVè“ZrošZeó’0ç³>…P–JI…yRNUUp)‹5Üй]æÚy›6íEèPÈL 䆃}‘:(F̈Ÿ‹‹Á‡Íaù"Oí÷ÀØsQ^T .~e˜™Ç`Ë0C[ mº W·›aqÒfA ++gš|OÙ#|@ï¨x¶i¦Ááǽïkó«šÐHœ—ßMØ£JÖÆŒòã‡neƒæô¢:qKØóÓ ï¤*S{JñÆë_{~ +}I¼,{mEvUÝ)7•¦9m´Õ}{?òMiÜ]6ÚÊl˜*ºmœõò²">†\=Ll¤ãÚ(«³¨E ‹%Ãñµ¡{òI`d²™öZK5¦$¨´'m´ÖU„cF:Mw}£µÌ8¥ ë‰òÌ(-ÙÁ¢¿ÁgÛh­‹¤ê,M°u£¶ìc«†„-wõÔÏ9’¼£~ž;µ…kͦű'‚Ú" ‹°Sh¢¿} ¶î‘–¼ošå®Úº/O×ÜH˜/ƒÚRñ5Õ7ÌFy¯¶” §Ô…¹=(ê-j³MùEu¥ÚbZ8¨-¦ƒ`«®*Ä×à'A(–Ëý¨+¢k„pmËßv>RTWŸ?:?Zw½†l;>!¤Eu}æzOö‘ ­ð‹y=ù#­õîwYø”´»ÁG#Û Påõ«¾6m@ápvRëé"ý 4ÖÖF[ý^†õϪ¨~÷ÆùïYO™é_Zlô§˜¨ÖJŠ^W©) oó@9ñì™×áˆzÚ5:ûÛ`ˆ¤Y“6®¬Ê• +"±šåtG'ƒK‚Ö¬]‡ï…˜ èäc$Î(œ5;‹íBƒ[]šø5ñÆÉŸWe0ÈÍÐÿܪ瑉£ƒÚö®zT|q{ªÝAB+94‘Ý¡ÖÉ'" t™˜œ¯L’€³—)×4$(C;ËjAuðÈó$£UÈUŸÒùüL•MTøQ'4WYPæ*b'ÅrÐáÓÄžbØ.Ý@†=Ó‡‘ kJ•uÂH—ÃÑqi®;]>fú)93Þáΰ­‚ýpJÝu½Øæ­òâB&Ÿyñ¥>D;mkÔÕÃnkÔLqÍÀÒ¢?hÛù¡Et­ÁT‰Øz³©Âë!ý¢wœpJTIÇÑO#Ø%xk?¡» +4x°`¦FüĹ/§»a¥W5Ê–¼ráMÅ .….*J–¢¤¿ö†ëaüa¦Ë +x5dïâ½ÐçÆ‚OSéDÿùyÎ]{܇͈¦ÈÖ9SU‘gz’¹9M”|ÜI¯¹¦Ú,hS±"®BP›=pIßd5ÓB“ÈËgÚO”<ûúIí7ZݪŽ ÊžÙl›Ô†AÕd°Ògá‰fÛS_{æ§ÙΊl>©èÝ°H}MNâzšD¬Ùø)Ñ ”}³N]Õ5˜øì·ôá+«ôu2—ŠoÀ*¹ ×ý¢×5zŸlÃÓ_ª`…ýOS&t€Þ»ë¥Ð輎À¯•C; *@\ò.Ér#lHáÍ +Kå)íUCãýT£;±›r#‚ÒI6¦J•Úê6ÞŸ ö¹ýñ Í~ªLÚsÒT¸Ð:w.jzVáÇí°â&@OQ¦YLÞ* •‚ÊήžÕ“ç4¢fä£])ÁèÂnU…2~RœnÝŽï =â>KĶn‚Ú%hçþ&<-œk{ŽkÊ^ë`èú<"Ñþ) hÙ§ÜbßÊIÈ ·{¬â U•Ú¨sšž‹©Øz€éO‚,MUwPŸpÐ’õÁ‰øm|Ùºç2L é.Sÿ…žc“yµ© ª¨³ÀÄkÁ΀Óõå³3< UE˜ Í –½)tÂæfpçLwB¼ ÿ‰ÄªÉs•â gâséÂs6±%wG·íX5ÇÛÅH¼=Íö¥ØÌ«w]ŠÅ ûr…·êárQÁŸj× ž¸Å`QÜQìƒï,kM„Í8åPb K Ýyb‚¹P'0tTÛX–½{P†£O«Þ Ö± +mÝHðÙ¿<0œ…wï±ä¼œ`k/8¸;þ|Äi…ïÔ½ÃI‰ó˜• ²’Ù’/ž‰4ëƒzeÁ=‰Á0‰^4¡Ùœ…š–—ž^Œ· ë©zÙÂô,žü$7•ûÒ‡Oºß)’ønÄgµ¾  ½–Á“R’X#zž(d4.98¶>x;ÅeeÈð¢*T6; +DÓój&eƒcg&™3ÞÉÚ U3‹VÐ6š•“¾Y¥Sfª4˜Y€à((’!"BL˜®è4F¢†"ƒŽÔed†þ¼ +&ˆLa•A'XïL-åé=´$ŸÅ©òÙCñÍ›ã d‹­éÞ3À°3¥–nÖ؜πîEXÓÙê¨?FßDÜ#]{Ï€wʨr‹Å3Ð* ¾8¹Sò¶u ç¡qR#¬ÓèÀD›hZ-ôß5ºz/-Ì…^1½ºX–âi^ÝȔ쌘©Lþ-G/‚[Š®L8‚wuî½Æ¦VˆbûGøÒîP"}Ò ÀN™ØâðK-pa÷\{o^¨F°¸Pÿ˜zôrá=[tšò¢7`ó¤>Cfø °õ25Ü9“AmÍÝÂoRcë¯ikÖö¦— ôÀ+YóÖ|-0€œr†¹Ï[#‡ +2¤ •5o­vÅÊ\u*j7ykiØ3µÏ[3& ÿ(THÂ|yk§m‚(í,ô ƼuÁ·9$ÀÒóKÞZÏáèð€ÔB›)ñqƒ¿I`o%Ýÿ‡öçLù˜ÁþÚSØZØY#ú½$`¿ ÿª”™\µ)÷6m³ú5›T/êŠ þ_ý& À™cà2è\ý(ýõH`#ÑÌ ï?âU'ÒÎî/ +•Ç.ýÓŒêÄ>Py0h´gÿÿ…ùþcÓÒ¡ûDcŽ½‰JDÈ>vo¶²zñÍÖ ‚½ÅØ}V†ò¦§Ó!v?p2Ô‰8¹wCì^Ϲ<ããGäû]ð^ßB³¡}KWÈh Þ'Úl²óMûÐ}úˆ–±†]n˜nö ¢á¾‰Ó‡éü0PŸÀf³sFoµû@=ue‚袾b ÞËÆ$°`ÊÊ +ÔSø¦ðTÇ—€Â!PÏÃ¥”{xéŽz}$ñª% «ºFìS=Œb„=uQâ9îÙp>!ûTºCâѲž‰¯!{ ª:Ì\„<»gÈ~óó%dŸÄ#&ÂéóÕ²ß^…=sEç˶Q!{ûæO7¥Ñž[ Ù›ƒe楄:â¶Ý'Ö@Ÿû‚Ûc÷„ ú%ŠÐ$/dá'l Ñ^B÷&D„KgÆvrŒÜ'ôRh_[cä>auâïv!<¦}ä>ámÒ…Ù³4LŒÜSæ©ägÇ7QwÄ¿þ)†WÌB°y„ó~›OÈ lW¸ çe‘s×ÞÙÁ–:_ÌËs{º:‘Ë`¢‡ò›P[ Äìa¾Ú'JV§J[ĆÙÊUrÍöý€$®jI þ¨A›ueŸ€Í¶#˜·P©Í!mMϵ{eœ:é`cÛ#íSlc˜Mvó2»üxÚïŸCn2R[ì‚—%±$˜ð¥˜ò ˜¬Í‰ªÌŠnA;œqN©%}¹møÞ”¶£Ž ß.ñ»M’º—ù3/¶+fuÆ–¨ŽoLïÙÅ 1Žt©ÓäCp0Çã‡ã|uè~lO¨ñ†“jw”7§Ûž´â‘Dï Baw«ª‘’í5Bõ·Œ¢+3LÀŠ»€n6 icùTpd€²bŠ‚‹^[Dë9D轄K¨F:,×D0gér&s€Yf'&$ÇŹLóqW£¥¹Ñ0,B¦2jªTlŸ@>%ÐLi‡3T *,XÛ ¶"·8…5³| +í\ÐïÒǘÁ¥B]Tп!zpƒº¹N¦¦Ø9êy¯Âù;*ìñxÛL©æâôW²èÑþfø»úLRøhYag;–œâ“î„EŒ?U £<†¶jf‰S…CcúÜ|M»Ñ‡î/Ûx¸ i„‹ø>‡d¥í"}‘‹ÈÎìS¨ÜÎ# A ;ÊK”Ô(èi—à€å|Ž79J«âÞ¿o´‹æÖ*cSz¨d LOÆý#ÿ¯;\¥CÊrÁ&Tòöã%alƒ8h˜qìÌt̨GÛBŽ`ó +˜ƒ.Ër8õ tß’¾¹"á–¡=ÙlXXðA.SÅ R´´åšôéÙÃ’’äS\2¸n6œ”îéªÍzž½ô"¨œ-{xà ì즩>…ø?X`À'ó” ö¡AÕ¬„ +¿‹˜ð’ØJÞŠ$ô¤–PÂÖ¿œÉF›8“9·m€•ë´´¦Ã ‘­ï½½µš^i2©·˜ušÉå_B'‚»`ÔI”¤Ë»MIÌÌ‚­`UDؼ<"‡çXV‡Ãñ˜ 4Õ¥ýs<`3ê8rñ} OÅo'3VÛÖ Ë%š½ÍCààbôFL«2ÛÔ†& {&n÷}ºÜ–« &˜ Þ"œªÆf8¼ùïlënVàðÍF @!^Þ¤;lOš¢àj(zÒ)‚ì>¼êà€G„U ¸^gÉoúÅò©ø&Š6ïšÀÎCðQ6õ@·_šTÈ]˜Ts´“,´!:¡œ™mb”Ç7í%³«žãq”NÀ¿êC“öaë!8û÷)‰ñ õHvÙV(g,úøã:*Iž}ìÒSã”c%ˆ=³NLc¢_#« ×¹o~Þ„8¥(2 L›7‡;¶î +㦔31Ì}™|‚»ŠÁìf<4‡•«À^‘¾$éÞófõí#)a'R¾å›§åÑ}@¤š6›°Žè)Õj‡ ¤)d¾ƒl²íhYh¼ i°9X$QQ¤¥ ­gæc›ÕíÁîði’‡Œü H,jIVÉBã^M¦D¢ø$ngjäHQÀ)JDQñSÞ¬BÒëÉÊ¡›AØÈZ³SÜž]5‰KP$pÈ EaOò €LÚÖ)“Ù+ “—À¢D‹®ÊÇö„ ÖnÁˆ]WP_|#¸ræ²QQ¿W‚|S’D˜[…WA‡fx4¨ƒˆ¤^ÐÀR¨æ©Ët«Ï³ U)´{ß» _³Œ‹Â©ÁŶÈ&¦mØTíëŽh¢P$HC!mØEð«¥CèG-¢öSüðh-1hZ´B;[«‹çÜt gŠÖè*]­7!¬+4ØHòßÑð#xho€Ò±*Šöj5–ìô·ÔWAjÎ2œnÛKgv%Ø­Dâ’â¶Ãä,æ¯o¶:‚†­ +S%šÑù(*؆0Æ>Vøoõ¦à>$…Ó0Ý‹¨¼!Lcߘú>ÂsŒ°ô½ËÀ™rR8„';}u=À”LÀÓ)^¿¸/¬]s ‹ßy?T ¨¬2©,§nœ'd˜2¡po`À¿+þa綅»¦×G‰Šƒç sWpÁ-8#&÷Þï¬À•pÚ2‘¾´q_m‰eœØ©+TX|ÉW:Ü\r`9Ê Ú¾¯àÖ Ùú2ÊU’Â3›¨€0iJó‘ +Äø 9×ÇDóŸñPWNÕ3›ˆ:> +gÔs@¯dwaûPßõäÓ K`…®wm;DP­ûð ßSE-$Ñ€ƒâBŠÂc…§Â{^*°jR›Rí-6ü¦â³U Ðk¨ Å E¶â—@’ï"fäßšDU²ÓNíxF5£v¨Al ±;äˆ'„Þö1À2Üq“‰ +ÝÇX"™³JÕ¸RE1I²‡ê+,OÔø›p&bYß™ ×b4”òu-%É5•OÍÐÇ’„*Y\pû¸,%Ë„ÜBXWÅÜ}ð†tòkh¤ú,û +û3:È6šŠ¨J‰j̓˜ê¦­nŒr»QtºQdÛw-Ç0jzBìôx6V|WˆÍ£Î ‘æ]d¿i$‹Ø`c†€ç«&ŒãŸ(J_’ díðßoÂI0šnsñ1k΃¼Ô˜@µTë!m‚}ãí ×QÅѻ싺/Húe©èMG¦²\¨6Üd‚Ê.‰Ð@$*1£äsG]Ý¡²Tú°í.Š¥«P†kêéæ5ƒFâÄ/ªÁØc*5cLÛ1v†*I€ÍÚ[¤ôTáOa™f˜C‚[¨Û©j¨§q +ڈƹ´ýÅÙxɤGÐgEÖÕ-¦7FuTú¢ ð‡xLà\œ¼Íf¦ž”„¹Ú†Z]TâUr¾jzo^l”«M•MŠ0êi ™›Ç½EºLc¨f®¿uÃW\U@+¸áD “j~Y#Z–‰ûýù[}/5¿¶]Mx"í4ª®_³½IÒg…íláóØ9´Ïé.aŠ4uFc.—[ÄÜU’f€cŸ"‚õ‹õ1ÊoÂhg‡Y»7|Js0vÚ2ˆqHæ(¨Oºx›‘!G–™1¯G­B +k&XØx°­Àp÷—zʲLýVã6ŇZýÃJS…z3êr“XØì”5xړƱ^7^G€7õŠÐäñ÷.Ô€t¢ )žúþ5$Aö94År’N>—¯¦Øý£}¿™4œIŽr8Ô´Ûà~ï.Ó ÂŒ¸¯#Ì N¹ô^À˜•.û¦õ„Ø‚ê¦=ƒ‚^SkGi×ò^Þ‰Dœ¦ÀóÔè…J‹„bN"›7Ê^Ós]ÛÆÆ^>½PöRxJH£c>¯j  Ç!ˆÉîL>Z„bÙZÙÄ”™Ï Þé f‘aqr§áÍKi‰Q“Ê X˜é¾ :Ï<b-ÄàÀãy|É÷ºzš¬^.›göoпvN +ίm„ãPÞ¢Çã bM–¶zšðÞ™8UP÷N‚©-çÉÑþÀ¶ºÛk÷Ý;óSâILÕBgX0ðQ$YHu +´|µ pU/ùù*Â.#ä²Zb¦ÈÍ8&¢`ã—%¶Zs6$?»‡|×U((’Ùi½Ø”´ ª— 8íÓËÂÞ›¥´NÚ>¥ò°©$vµn©JòVJÊ4oW+ùt”Éh`³WÓ\M…‰ü­É”>ë`V ¿ßã‘«O î‰ãávað-€ì€«ÅäÖ+TWðP®Ãéc‚s/ÕѶûÊ ºKp’(@fࣺ§­|,û uÂrï†ÅO+ø— +ºà·êÑß w¸g¹ø›ç¬*\ŠôF¢íî ž›³4p¾ö>,ºŽhNyÎmð§ã«[N>C»üܹ¥‚{Ogâ%Ù N}ñê•(_#('À‚pƒº ¨[ª‚“}€­ +sj!™y 1µ!uÇš'eC$Ü"¢ ½.=Þæ»P Õ”Ú‚æ‚ÑHõÂ5Ü¡6 ³›1BcØG¢¶ƒL@~¸µkôˆò8¥ |ÄÞÅÐ2O³ÈjS [µZ%æuò¸s?¼ ñ}ÀßI1ŠÆ‹t®ÌÔ=‰‚q¶JžNHÔ‡f·ô#qÃ%ÈåªÍe§ÕìŠÇg}Jä.),.jrÖp$:C’7wt_1¬éا—cŸ^#Ÿ£bb);Hé%„X‘VªÃWìÝc¤–;è!Ÿ®Ò»@o)&Â)^°-pS~‚Åe4wQQˆ—ƒÎòª-*S¶¯9‘Š À?-C} €‹ËDîåûð9RLM &j!çn ÂsÌ\‹VÊÖ¼Gé] _¥DVÈæ#©×|€fûÖš\’Ô3ú.¯ÀchpDˆ™ûàjVÜ`R¦)æ1Ôlåtâ§NŠ%¦íø‰é¬¶®—SÑ÷Uu]y­ÈLÉè̓LsæoL," ýxÆï2?Ú´ôTÚÛRzÍaPÒTèÞ›¡5ç„H^.¤«„a ^y;, æ‡´K§f€¸Ûüì5}†VòýBêEp$K +N­a—z±Ìêi1“ÇT´¦ cÈPÜkFÑþŒú;ÕGºfY™[[‹öܲÉN"F¼1>SÕ;­÷X‰î©D%"RfÍ‹BýC³5Ô?ÝǺÞa§ðTÕµù‘Joó«aÀ!×û´– qbB§áÖ|¶û¼òsóH@ÇÇÏ?l¿nþ1 nÍ“Ç Zóíûù ÍoaFª!.ñZ1°ß*kåAØqkñBÜ´kÄ~ó¯Åñ­õÏù ÕÛãªBÖÿ–ñ +TÞ +PßDU¨‘ ân­´ÙJÍP°3…n¨õ b:Ô mÅýZz´*P»ôÎ,}Úª­P95•^(º +ú2omõn( ú;’ Ô£½5!B9[°@BI\°bBiÝÖš•yÁ˜ +E}Á 5[Ãn--œFa(JŒöäZÜìÒovE’Á¼ 5–ÁLþ­¾Su™ÁÈÁP•¡;{?˜·!©F×c­qݺ0¡V6¸B¡Ì6¸S±Žwç–Å»Vï. 1ÔoÍP¿¼:¬±úówìœçÍ]‹>˹ƒÿ>‹À÷îÿZCÝÿP~B¡Œ}Òåðkh$Ô¨J¬ÇßeB5ˆí„†€ +ý»¨RìK@1†v†½ +ÍÛàWlªXƒh±1c ÄÅ7a¼Ø²FcÉI -*ÛˆäÒèâš¡U&ÄFCËÍÛÐjèØ ‘ÙÐõ3c¹³WhŽFk9v+­±èØõ´‹iÇž©56Ú®BX=´omÃó¡ ,D÷c'Ùš!ˆi»LC|Κ±ˆÍqkÖ#6Ùí²'±YoÍÂĆ¿5“w¡:ømT©ž[2Kµ°à.X£[ÌNÉÓZÛø¯Þ·9.v456ê_Se BàzLˆR$Óm•$²t—¬ƒÏU4d&6Ì^k1éÇÜ“Kt»ó¼câ»{vÍ:N-ûÉÈȸ˜¼¬0¬V3~„¢¾æ@eáœ$‹0*@i%æR«h¶eN¨øÈö¬ùXX`„ÙoÓD”n—ÕOY“ÃñKÖsÑš¨þn;3kÂû™×5]®¾˜°,kÚ=.íš¹vÆ.ñ7ÖZ@7çZƒ÷ø®–!ž•µ&"ž·µ¬âó ¿ŒÉ[†ß´ Úº+¶ðqÁdµn‰†Ò’«p†|»šGiVPGŒËêT"ÐÌ,ï6/l@™°Mè;Óò +~½Ãù!ȆŸIn…Ç€õˆ) +í=F…½OœË…¯Â ¶Tý$wv¿µÃSnO4fÄú¦I±0°Îz‡/ç˜ðó8‘·×-¸˜™Ï­Çë"þÍW£ºŸ¶øƒX +%m#C˜iV¹™Ï^o¾U±ž3)¬9"]åðæÆ•¯×?ˆÐìÉÇ~7bwû_©º¯€zdA:-ï‹7¼ÿêïFèêýMµ84™…&4ÚLÈŒø=að3Ïæ~ý~$MÂÁO&+Êz›Ïa+®”^üõ:oá >7ýß½_­ƒíePŽD‘Äæ°áØ€I)Ë¡ìëºG²ê“è²ÿ×]†—”=?O(Ð÷›Ã_&ª¦~=<ºa$ÅTâqAVJÅ ÷P²« +OYŽnüõôÇí„È:-á)qb)öÙõYߺCibP<­˜r9Vr¼«ñHPƒ«bš§ âHÌ +bŽ5÷×?Т_°ZÊ»ã·ùÕ²)7/\ïX?ü»Ø ·¢ ƒ"=ã¸aïŽP"DŒ÷Öêµ¾ŽÀl¢4]SÏO3Ø»ógxý„Ï®Á<‚ÀšèÊD?áÙé9S¡DhF™½×_ñJ“i ÂB¥ÎŒn` (V߸ŒGÅ?µÒPÓÔLšë«x í hÛ¼OÉh"°] ‹)¦·‚òÔu+ÔjeÑvG2Õ÷&­h›‰´@ƒRÕF§¤Nµv8x‹Y©Šê ?@¢Oê€è±¡ŠŸË?Eq>?ÅžëhÍ´%Ðf¦í•%x‰MdñP_*fèÍë +a‚†þÖã&`Ñ™s Fš²™b•”h>F%¶¤$¿Ûûv´¸ +>µ=Wå½EhâMĶÊóC>%išÚ$EñÑg ²I°‚‡g<&“<æÏÉS–¥×Ó‹ÍlÚ«fAè`Jâ†aÏ=ªEiU7;ù«ª¨¬(µU`¸¾¯g,‚Ï$}ýÁgC»Š9,gQD6ëði SÈí"1[_' >&XëÔ?˜ïæ=¤ ›û,ëºÉmäC=Úféû„è»ÿhµÛKÏÿÐYÆØÜÕAd•“6sËŽ©žà8ùîP©C +B{SÏ´9\­{‘;ïö9—a°»S]Áy»TtÁöF6ˆü–Va”Žâ%בmÇȺ£>!¿û)áCàŽ„/XDÕýÚŒÓGŠÜ\2bIq:0h‡(°«/tR’œe„êô¦uivŽV\âBjŒM õwIÄÏ–†³zov(Yä-™’Ps·½8hb#™ü~×äÅQ¦6ëÞœÜ<ÑY©m™Ÿxî”䣅$SSr½Ä³koRøÊܽN©[”Ÿa§-¹4ˆ’ìü\4ÖPê…¨VU¯—¼nÊ°c °ÕÅ0šÊù½ä ?Âsý‚ ƒ·™"<ÌCúa.ƒòخɪƒÂÒ®ZlnŠUn·TФakm¼îî Ô·‡$á°»"Øu¤ÛsŒœU~|ÖNúŒ­…†äñâÿ÷³¿ýjŠz•?·¤/A…U–†‚nó ç—ÿx½Jg#ùPàÓ„¿¹]á_sïÏ> ¾Þàtþëxíÿ»ë|7Ñ;äÎ8ÑpHú}‹Ô°õRgÀÖH[‡Ô¹bë Î®€:Wpý Ng€Ö_q:²þ[œÎ¨?q:??™éoq:~Àé\ôLgÒßbv ý€Ù9ôTg@ÔßBu:¤~Àç úi3@êo:¤þæ9ï!õ`g€ÔßvHýØ õ`g€ÔßvlýعbëÀÎcÿ`ç +­¿vdýØõ·€Y?vNdý‰ÓùùÃñÍ›côŽ4“e¢ûØ, Ú>öŒ»`ýÜ{´¬VÆ]êYlcÒxz–V#ã.Ð'žUÁ;®=ãnÓIFÝ3ù»•qÁ£y£q´owÓ,‚°ã »ôº/”»‰²g3ßlOÑýV#å.ýÝšÝÀ´K±P\Xî'M3(wìÑ(œËŒd\)wÍÈtJ#WÊ]¾Íe¸y>ÇÀƒ™”»À*ø¦Í4¦ç ù.Ÿ€8waxQRž&€hàÜ·öiÝp‹£_µÊ]ØG¥©z"ï;^´Rî¦î&žm+;iiC¹›ØÌ´‰œõȽ»ÞáoZIx±(']ìɄׄ—ˆÕLÓu96ÞR½w¡"y§x l¼xôTV :„×ÂËKk5%çµ²¿7ļë‰üæ«Ÿ’˜÷ï*åÛ¾­¾çåµùŽ–Œ•IÖìÈwD²í +oV¤ˆdÍö6oá„5—rº…•×¦° +ÎkÒÖfê1#míîe'ï¥Öû-Õ⟴=‹i¢²#åE¿åämý‹‡æ”¼ÕvîaóÓ Ž3;þ4uK%ÓÏ~º‘=|¼M}yÐÿêPð]:>޶ŊÿOCÂùîvš/2J®š/2J®š/0Jn5_`” šo2J…7%·j.PJ5(%§š‹L’;5÷PJ®jn¥” Z.PJnµ\ ” ê.’Ku8%wÚ.rJ®Ú.rJ.Ú.RJî´]¤”\µ]¤”\uYä–Üi»H2¹j»H2¹j»È6¹Óv‘mrÕv‘wrÕwŸ?ˆ?‘›òàMÄ#ê»È;ù9ÚÉòòž-ÑìóWÚÉNäÀyÚ]ߙǴ“ö©À¾<ÌŒÂåÀ̸y×ÒIjJ!o< +<ÄÏ<ê±N~Žtòƒ9é$6›iŸWuWÉ´GÎÉ=®‡q’F»íUÙQÙ}€KøSQÖ|´%þ‡ÑuJ¿ìˆÒ„Pi¾m[äº!J«Ç§Òi¬Ä˜ó†(ͤŸ`ãÌÝ?…"µeJ«æ€R`ßì•O;Û i¡—ï-Aš aHš¡löܤ1¢Ã6’.†È@¦êVµ£›ô:'•úÊFË¿†—#¤ñáB 8@Üð£‘ZÑ@®Œm÷?šDræ{“·q~´:(SRåîÞð£U¸6é×4¯J=l[~´šÆ›ˆö•sÿŸRuÅ]K»’¦¤aË&õ}Ú‰m%Ò£•Q>HÕÙ1wÃ;ž4z´œ2…âÜ^ö·EþÔÏ'L³¥ÆŒ7³‡ž½LòÄÖ»ü¨pf½ ÛIÀºêÀíô‡š`ìW§­Ë„0Ù 1{¾å8¯Š~q~4˜ˆî³óÇ2ÛN‘yT}öa.Œp¾è §·ÃD—‰Pʉ.ñ3R9Ñû­&ØìSec6“Ô‡—;¼¤ÊOäI{VUW`¨î°cÝžž&-lV mÖÄé,*‚ "Ñl£»‰4Þ‡·,Ðá ˜—ùO³Ô¨z +™v+ôÊ8n¯jõt4Æ3nbÄc”Ï Õh  úè©»¦ RIû‚B¹ÿxþèì8€ó¥²ÍzHB Ýu€$èa&X\C[gÁi¸ß$î;¨4,E>É€})ŽZÜþ¶…X_ 1žZœÄÄþó¥7n—÷]Õ§Ë,ù&Ý~ê/¯óGbó‡BOí~úq¼¤)Â>Úfq…Ð>„î’ª¬×­`Ÿpj³à*Þì(3ôO²Ð}umv&† y~3l¨÷Þlj~¢þiBPÔ¿nT–»Ù.·F´~ +–“\.¡ÉnFä}åÓB{?$õ!F&©ßdà­s +÷qQï@Í'fGXš¬ßHwÅ,uKKa@Ñwš¥ 3hݨ=Çt½ªa—UÌSZ{ÍøºK{Ýe‡WJÐAM¥„ –ÍMBϱ×sjo«ò”û¢Ï#Ѳ2Oöz®ÂÏÃÙ ïg|ûùAT„iR&LeVÛ% R/,mœa{D üfwM¹¶dùë¶þœæ˜©1 ++îW•æ„vðÙ«ðº.‹»geíäe|”a4zàó)$ ²í¦L»… ¸ÈL묡³¾šÂ‘Ú(ªÓ?èÞmتº s!Øi"2£ä¤ÆA7A…ó‰2˜ß&=ѳYàþ)‚ZF1ÑOÜŽÓsFÍz£QÕ’ê/P ©l“ôÍRvIžµ£麘ZÜì?ˆÑ­-ÚêªnÅPEFRh-=òIŒv^zÌ J¹™â—ù3þ[³½xYðMÀË>³ Ií*úØqH 1Ž¤]¼#Z{ý= ƒRÜ_ÔÇvákŸ¢5êXZS…¥=Y +2À™’ñ:hõ†Ý«hQ2xLÙ9JA°ÐÚtJLÐEgµSùU³ƒ§È2f©pª:«x®ùÖ.€ +õô¾9ºÏM¦g*LýM§/!æUæmÏN*_¿&¾}UÛ–÷V‚Goe¯Lïµ( +ÞžŠœš…™N”pŒéj^÷ЀéWíµ=Gz¾ªùLhãµ ŠÀ$’žSÆÁ ŽE”6Ÿ;:?Úãzåð3–S)ƒ#8þµ{[ÔïQ-z&åc0)ç—àÂàØæ:ÎTÿ©¾£³A·ªò;µ_né¨qoq,æ´•²³žÜÛ¾¶ãÛ<ŠŸëú%µ\­ËéxÆœ­s-€ó×;VêŸlpgËð˜Qbkþ¢”Ö¿úº8dMù£—óÌ+úåß¼ü«Ÿýì¿ûî~ø³_ý毸×= /ŽîöÐÏÙt¬Ô])ÒÓ„pËʧ1•H¡WÏ‚¥dJ•üA'ËÙ†AEѧ Kõ~3cÞ+&A¼fZÛ„[È’’·I‡¥ÔO™Z˜D2ü™ °³÷ÔÉÀ1‘fª3 \Ç»Vr2“‘Ç9p*;å´‡«:;&,-À#ƒ~‹+¢Né›TDdÃø”ÛQ!|ߪô ´×Ô&@.¦™)£Ç; °^е]+»wÐÌ$%2¤~«týé‘QÚ*L£¦LF* ¤#úð¦ˆñ)’29Äñüì¥È„åÁº{³f]TÕü‡$Šàä•Ì¦j„+[óöoáAc3ŸÔÖL>¨z¹ n0@˜8b¥¾‰fS +æ h(1ѺÌÃË™QÌtªÂñµ©>á|©L‡~Áj†wÞ4mè'i”j>'t)؇=0s +¹©.Ô}Àz@ݯª}fªiöL*Òr¦{ªóÙ–IÕ£(îrä§LÁÔ!ß‘…IQlYZ×í+ß2åÇ£=¤ UaØÐ|˜rúPz½›b×l\ÛdPŽ ÖÊÀÇQYÈyfj—ƒøª™˜JÀ:§¿8°’(˜á·Í«ª³D’qøî!”àwÅbCC8ßÝ( LÄHó a9 †âŽ ¹K™4;Ú‚%A¤[Ï?€ó¹d"±–BƒãðX³©fj3!`e]±»P÷Tìš¼ÏMM·)†Ç¤ fÊ\ +Ët&S}PB¸%wÒpW¾­#H*‰W¨zncPä(b4¢”à4~e¨Šr)5iL¨o'Ÿu'ç2e9;ô][F…OªzÌtb³Ä;T&gˆ"\6YGÐdUèðj¶äÚroN¸ÃAPˆnªq¼'ÜÔÏøåË9éZ´[VI©õ†~c›Jqr îb&¸[Ëë^°­Â^`’†‚¤±98ov  ™Þõ'Jp‰¬nþ±C ’ж½þüc›jœPê­NUðŠÒ¬†C~™ÐëÞ>Êwª°ð8c+ c Ü’óÙQ¾ï̯8EdB•žJ“ `èˆã–BPO„†PxR¦÷Af©:ˆAÐmØ2ò…òò#n'ss©…- Ð>æ*rvn¹³;ׂz;맽Çôb÷3â»?SWèˆï“ +Ô®Ÿ¯3ˆ‹—ÖùT¸æÌTx[g%”$V“Cp‡&Ï4f¢¥Äº!L3³é/Ç~QúªQ?.HšÛ¹T25˜ÅI„LR'» è;P2ö5ÉkUŠä–È‘S—%G‹ƒï(ñʲàÕê¿jª°o(Š¥’#ŸÞmȉö%§“÷ßGäCŠÎÖ1zl[Ò×”Ù.¯êŸLv5!sàÅ݇¼ Ñ.fó‘Ãç±;ã‰üjÉî{Ô:d1çuêp¯Gl}T­˜b÷®Ð'aïÞ’ß‹hC)³1¯‡Ì6uî€@‹}G}áUõôU`6x[€ÙÌ"|Æ+ÿv{‡¼ÏNbÏ»¯Qؼ&ÃP Öìtt'ú-û
d‹ÃÞª”W–‘+¹‰m™ºƒ—¹î¤"æ›køÀ|»”FáxVÂ¥¾¢a÷ØêˆvÛKã@${i¨Tn3ÉáÀt|VÇBdßáfv„ã¥R rƧƒR b'wU”«© +òÇmñ¾Ý¦"^–¡P“ÎT>ÖT’ðfô¡¸Èl‡"­Ô¼Íš1 +¿Ô0qp¼Ç#>(9CÞ–Ôßakq€Æf%‡ÞÐeTÄ#=éè:©:Ë^jÕADXP¹ö m_“â¸ä>euÐu +=.‡Ò,éf¼á](,æW°ðâ˜R-MãêÄèÝ›©ˆ YÅ”¡  Û%8åò ¾´jí}s™™v‹u·Œ;€Ô}…j̱§›( !.økÍÝN`{;Ã%¿†˜5ñ“UŠ=ãF7Ø}´È m‚jÊŠÝçHÀy +ëÊ0¬êé4šTuœÀ.i$&(ẖò‰Ž +¾“® šêc­i¬áŽ«z—J [TŸ³p×:^VOý@µZwá´i`›öôþõÛíL¸Þj» Ž ›)P±„çÐZB’ýÛöEÚ|K¸c;¦pW˜Ì/€º;ï–`^ç·ªç1ë°‚#ùÑ: aÕi¨ƺ޺”,“@RÏ­BŠ_øÒvÖ#Û}Û­žOGòÑ7ûÕ\*¿ƒ˜rM›=oªA¦¼y'l{t8‘d%ºÜµÝ¬ÕëQ–³kV’ÏdòðGTï² €áéçfšå³ndÐq +Tÿî%mdÙ  5r«$„Z²ÝQ†*10F‚¾ÆzF žÐßDçÏZ»}„®È¹&Wn÷ºƒ±°© ¥ «æþRl<«Òº dÈ}¯êàUôª)õ•Ï¢cI` Sq£¡ÕY}–¨ß²Üð_moN.½´ó;k„ð÷Ä|~gÈàfRb¾µƒºP¶6f”º®;Z`6og½ööÛ=0îWã/M§Ø¬Û”uc@š ,U9TECT« À§îJƒ¶ ´@!Ò±l¢C|‹Y Ž1 ÄÒÕªîgÝä×¹5æÁ"%g +ùM&Ø\;övŒ€á.ga\ÝŠÓ +­Š¬à …;¶ÎT¸+øb| ^Í,ÌV±Ø;Ñg[o0{ßep%m:dŸ;¡ö?sÃÆ¥ 7ÏòOrg¢ývç¤ÏLa™MÏ!\Í­“ž‹0ÄÁ G"ožSàGò ‘g0Òt ¡ÄxC®T°ÐgN:(oâ yj“°r›ØýéÚt…@êýA ›$bMA\›PLöþ,–¾8šÅÍ:Z*Q4¸bP(Qê‰)Cȯ§[£‡ 3D£Lfe‡÷Þ³®A°FÀÌ6)"FYƒgé|}‹ ,·18÷vë¹»ÙnÄâÖXýwÎûPáYÆG¬‘ÆFˆ•tЈM’?‡rÑ„@Þ­ó%jFuò1DR…B“û»ø«m³K¥Kж¿ d ÷JÇŸû1 ¦Î—°„˜»H× IӹظmÇ>…ÝŸè÷©õ+Æ˯&—sk~âáyÔßÄÈ{ϧ®ì™€¦}´æ`È>g­ÐÛìšL@-'%9”®Y í ã“SÉÑzRÁ‹J`^«mÔ} _ í/X]1W³ªó'WçŽobuGÛÃMÐ’lÛ¦y‘1X‹ @kÛt}åâ”^èOb}´ +| ˳dÐxA²le6À­'Ù B˜µG¯ ™ú´F'¶˜ækkO3Ïù|Áye½|…"Ú´í£¡žèQS¬¸LÖ+{uTBÛy&ª/șއ°™&+θÿô&êÌ*/Ïàb!€BŠTžï2‘a9;ßrŽäšâú5º’€Ä0iM(lN×M0Ü”s~Ö GÂ̺^W…OÂ&:è]í¯c%ïâúŒòñ æXzÚÊ1P@<=ilšûDýæHÿûRþþ»qjqw1Ø!€‰èÙ‹Wup@Óõæñ·ÍV¾š—¸zÃx}N±™?O4 dg;ÏMˆó¼Ñ¬Hq•6iš›:¥`‘S@FE ”àq vsX=ÉFC£kwòaÙ cñR\Çl£)U„TU®~PæÿÈ"±‡@·dVË݆E=ÄèønS¼Á› øiPq]†L¬t|ý¬¦»q $HE0A!øxSòbAåƵ€3§˜æ[ Ô&ö­ižý)ÜiÐÍ0˜áƒÚÔ°|0Ρ9ªîŽð—°SËð7ð¦:¢˜™3cKC9Èõ(1¡“Wš©˜~ÿT}¢nÁŸ²ÿ*}ªHÖǤ1‰7;jXÛÜjÑ@^CÃNÍ>6WØÇ Gaht…M\V›×iTÌ€BBÔÎÓxÐVÜýx×:Ê­¦°?A© ­YŸJ©˜ƒ€çsfH–ìQ|ΚŠßîØŽ)ÜæfͪÅù]³sïVgÉí…¥]’‚ÏžXSŠû-µ¦&ãÎ\Ó›qw¯iÒý)YÓ­ñ°­ Ûx`×Äïþ¼/ùã(6Öt”8K&{+·Ö|ø*ýBJ=ÈÍšßJÝâB;TL1?k +Þª„µ!*”QÃTQ(Øj²PJa(Ç:4Tul5ð, + z;Ô“¬?”¥lÍ…PÞŒP"ì”PjóƸ …:Á" +Å>Á˜Zk†¶¦X(= +†\(_ +&`(ƒ +¦ä7»rªh’®eYÁ´ýí¨£yWÞ äµDlšÔ¡¾lkˆ‡:µ`ƇZ·è +¬%s{—b­¸ žÉ¨Õ‹®ÌüÃÖš ŽÔZR±µ2qïÔ­ŽÑ9\k$¿àŽ­ïZýÜ¥ê3ºÊkñèÞå^‹PãsÖBÖèþ‡‚Ø]a­«1ˆµ67Æ1Öß}†`‚tö þÌ<CJ|“…Y´ÌÚuÞ£¬âyPôQUé¢ïùƒFM+(¼øfJ}æ¯À£BΈ,C»Ò,e!/vá›$W¦~»Yãamô(úý%¾,û"^sÓÊ¥m>{½Ã·ï:êðœ8s÷Ø] KÒA÷Ùx]75p²Ñ ³mz¢™È‰Ù6úáÝM™(j·†²Ú­b~Á%þÓÍ]?•1û?¿…KGì(‘ó}søÃò½ßÐÓû»@¬¨`yCÑ. wŠuÇ u±ðŸœ(3rMEÔÍlŠAç„"i~BB.¡V†4ûæ9cîâ'|0ãß½[HZ¨ÚÝž {¦éù—¿Ë™ßì@PçT¸´Ûxà† +¾cý#Øu¾[·<ˆX%}°»^å§ìyü8ŽÏ·¼9»Ï‡k¯#\DÇó²îëe+PôK€é‡ío>i³ø+¢mob(½œ»;nýt»Á7?÷Å}áøçñuß½9u`'ò#Ù|©LGÎºé„ ¬ºh³K6‡OuË€ +ð¯ŠK8á)aæÂw|0·sªèy£üA\¿6{o_à€0TPÓ,ª!ðS¡¢¢2 iñÀ´|{Ò_àÎ\Ó§=DópÃc¢î_F"7 ˆêt òŒqûú-sR¡è^Ň°³ÙDÂ¥Ù!¢ÒMª¥?2»*—\˜—èéÁ»CDP + Ëq뀎Ðé­<¨¾ÜDãóà )ƒ‡Éý Š™‚Ðv:ˆõ §Ì;ó/@RsêÑZÈDÛŽCµ˜ØÃ)Í–L +òÔ > ˆ’`Q n,J¥Xšš$FK¥”ÍáMu`Wº JR†Þ¨‰¾¸Ëy<°Á7ƒ'îqmô¯òÓ.§`n¶ç­ÂÉf§ÀÇköh¡cGwO8RÈánÍò”ä1Én&ŸJkâw$ÕÛ {ðƒñPDWã’ª`|2Êåa'óÞ²ª7Ã4Êqe"GBöoWXõ&¶pê ‹Yºj™Cä´ë~€‹œ NÖ½ßTa¼Ù‘…\o·ŸÚ$¦±gßïêŒåÍçÙѯåƒÃQœ3Å—PóDSƒØª¶@G–;´œÅupÛ Qvò®€yÁ`~¦j&ìÜ4Uýá"wäs-qã³Pá3ÏY?&˜W÷ßq@XúÖüîóµN‹Ìj—íá´_˜Q’zçn=vžF\W!5‡»>çtäÒƒPí!¢ðö’’j¸€Äêüúeˆ$fh„!lAÄ*léž”ýn“p0pTHæá¨<é¤xÀ”·:·…9§¾„“ š/¥áá\÷6Ì 3è(ôs½ÈjÄUÁŸÚ¯^‚€)­.Bì19´IòR˜,ž(“âÇä` +â.>g™áS‚äÝŽ(Èí9!SÒ‡\Å~%‚ÂY4謰%‚êÛBÃþ jxÝØS‡oEÐüóT›!È0ÄíÁ6LŸ·ƒ>2£PÿˆïÑà-Ü%g!btŠ¤uWhâL_ü ÑàÑ áîâ|—zÉ +izZr¢^Üc3$c0]àâTw Ar5EÚ¢ݱj<Ú}5RÄj ñ.ž H;çÏP ’RpÒ͇HjQö³Å;KˆÀÁj¢͉p¤j'§šdHâϪ#sj{q|Œ"XC;±Ãäù‰È&šúx’#Âf ýè >Š“>׋‚›SM ¥à>Ú¦ú =§¼\au @­.‹*ÏÌç¤$<î7’->œ¹¤_b1g#ûaäÖ= ¶41såíD­ ÃxÉÌ0{Øm‚% ±.hþÙÙ<úãðxªWÊ"g¡dÅî°[úk@õÀ`‚âÐÇHTí +ç£ à¼ÜöÈWš1”!ª’ћʘ3qQ[6aU_¡¨[%2_Ä0s¨IIƒãðĤ‚änÁO ÆèÁ=ÎAbꬨ“{ôH•D•ÍH™°Kí°°Ké{óó¿8ÈË…Sò–•r; xywÀ¼ÝW +æ7R6o¢¶™¹š6Ï¡bv¦¾ cÂN²Š iÒ.ÖõB°oGÉ$&Ê÷UxIÔh|á—g³h”U>³x>“•¦Û\º­‰‚èé‹ØQXRvÆÔª<îHRMhm´«6‰érèô®§ ,x·Æq{±{½}šék–þÏ"HY99lªâþ&ê³= ÓÏŸo's¬bÇéÚx']‡„“š*\>w¾ys\TYHí‘œhAIsb”¢Ñq1árÚžGêc÷J;9î›ö["¡jîæš1ÈyàâÁàÔW˜i N/múJ$³¨¨ô@2ȃó”É$uù{gø!FŠLubhq¢Q[BFyü uÂé‰Ñ®Xï™N1c¤c<"5¥J½¨;;A…:*…wHBæ™Ýâ8¼ªƒ¡<„Â#:`5¯‰jra3ž¼Eþ–ê¨N<`›íÉ1ª¤­tš™J·/ —Ú©Lé2–Òl½>x¤‰|/×gŸC#{)èõ[—ïV¢IZ´OŽ£–œ–]Qºß¾²f3ÄNéùÔ6È¡ +¬ÞðKSm'¢ålN ‘z‰¬Œ¢Yø¹ W£—Ô Dä½Ôð@€ÝW{Yí®®Dqú';S «&Ôç,¼ ÛXTH(+¥ê¯B¶cq½Ã`ÛV)Û1*³ ª“•î|$äDµe5²bãR©eÊ"'‡­õéÀ‰ùWåœSªøfÊßÝ‘ÜAŠ°íuØ}oz,»ø><¥÷ùóôÍWÿ Œ€Muƒð&MKÑCeGa@5y–•€ÿÈ«î§ù‚Ÿ(¼4·Ãd=æ§PÌí°ÓLW&!`½…Ö &nÿêE^™2“ øø/z—¹D4#÷,‹Í´ê×ປòÄá"ÅöŽPÌ.IM%Nh²ç@Ôæ/%ÅžVh»mdb¨·Ý +K®í›Ÿýt#ƒ°Ôµ=h"–AÏþ>À/çHúýSVàО¦Kn4…33ìÂë8IÞ²®«NQczðàQsÄÎs¥‘d§Óþv~`áicˆ–êù›²0éù}V-«6 ’:vBvrÍ“ºVLg9ˆ<„P"be›ä.‚¡ªè d<á„×{rÔþ®=í¡BWØsTo©óîðü¼íj\þJs’LSöÉZÎÇc_øàÄ'ùmúœÕcä©ÈŒØ]ä5œñé"µ³ î˜}u©b˜ÍBRè±±ìLQØ÷æçeÌ7!üç}”ŒRUXœTùƒÏ-#úUàP¿6£¦@I‘ºÔÕ3æ ìâá±Juñ~ÞIt+1D OÛ,_=FaUÐåuÁkvü>ª(÷û¥œ^f?=ÄÞöÒèV™e;Tþö.V$î©êØÓ&z;£ªËsN÷LnS£÷¿å¬ËcôHñÅ1yE½2‘iôÖ*;UæŸÑ&•–]ÑQC%`¨umÌÔïdï©ù«Oäp]ãsp¼jLñLâûm/§žÓ(S¬›ívÖâoT‡§g»½ß­}æ~û©v•¸Ñ{ß—QHQÞGyñë_OÙóëõXƯÇ{?€!Âøƒ\ säÓv-¦x KbØ Q°n6UÏaoF¿îïÏêŠém}•K/ÿæg¿úÕ6û'úW¿ùÍ÷¿þåÏÿäïþgßÿÝ÷õ›ïÿíûNÛ¾ò\|ð¼v¸ªûÀû׿øͯ~m +ü‡Ÿÿé÷¿þÎtòÏÿ·ï‡¯/ÿæOLGÇ»ù¯¿úLïó«¿û§Ÿû«ï¾à7|öo~ÁçüüÏÿéï¾wCòž?üª?þ‡ßüê?üÝ_}÷‹_þÍÏÿâF(2ÌÉ››ÿ—_ÿêý>ÀºR½ƒú9>|ÇŸÿÂÆñþâ¯ó·þÃöÑþô×ßÿößÿ£ù?ÿýç¾…é´¹ùÅ÷ÿ:3ßýí÷ÿé7?ÿÅ/þ?ÿúW¿üÍçnþó_ýÝrï@0<‚aúÝCýwßÿâoþö7_8Ö?ûÕ?þýõJý»í®ü·_ýOü'åçÿö—=~Ê?7þùçÿþW¿üÓ_ÿâ—¿±ýµ_þÙ÷cƒ|ó‡¯þýßñ—Ëÿò³_ÿÃßÿí|ÎcUö?úêxùcû÷üǯ–ÿ¯ÿ•Fdø?þ“ýÃÿjÿãÿµKÿøR_þ÷—ÿëÿ>^þš_ýÙW_››oj‹87ÿõÃW_ƒ …×Þçµoß_Kp„ØÄ|ûæ·»kã·¿|ý¢ÿã«CÐ4¦Ã½D$ j!X€oJŸño¸R®n²Ëôh¢é[j^*\iTS8ú5ÎŒµú¢ôɃVÞ™³X³>µ"té?ÃÄǯÖr¾øŬÔàMl‚ÒÚ÷“ æA$§_®ø>~/½ ã7±žjöùýÞþÍWÿI?/Ð<éúIexŸUFm·3=c!pÎïîwô8.‡‡|;žÞ?i†ÆlœþôF 7ùeÑ6ûEšü"¬·/þ«ãÉdæÆ ÅjÛÆw€01?ÏÔÚí_mnh—dâãò–ò‹f 'Ãœö²ýÞ9MôoÞcò;¹žÆå\ʸ|]c 'eÏŠ´s\<²1¥Ê¥Ž@XîラÜvʼxÍ‹‚b¿xÖùµ°øՔ뼕Æìq‘¤Ä¸Øçï—¼íýƒ+g–Ù|ð1ö:ZU}þ®ïzun¨­ÏqýprÎãEg.“ê G…ÿ<å<|vhX¸Ç½4÷Ç +´P»()´í—颷Î5¾À÷Ù~×7Ï;O¬N2ù‡q¹°Eu9Ý×üà‹ðÖ8ed +ƳëqÍ{±œá¹¯Ëq#Íô%Ø”Ÿ{a¦yfô2Ÿ¯2ö;¹¢9³ŒMf䙢|ä!Ìé™SdþÄ5‡ñl åÃ^¿ø|^wÀ‹7×´‹hÍ%Û1½¢ãuði;ïùi„o^÷ÐuŒ¯EÛØÛ*¤ÔWpïö ¾yäÞÁ4×u>ò‡´Ã‹FzÜçùȉs4‹©øÿU|\-iu†êOÎÉ×ïT?Éömã3òñæ@֔ǚ +Žg^n]4E\´Œi¦ew^ìiì«ôRŸ¡Ûµƒß[ygîUíc‡›§7‘D/¡I€{ûa¯_¼¼p~qMmj¡¿wßwz³™ÇÅ:8éGyÎY›sO Á³‰îñÕÝ¡¤æ¶ïç1åôQž«Ë3†ÔÉÉ˶Úãr©uLõ1…Žò=iLj;Ëëååóá /Îûå¼ü0.“BóË ¿Ø«Ï_%ºZÇEq0–Ç’ùf<àŠ%Øæ½·¼ûÛ³~±Ðy4%b:Òó€;_ó hNOM=MIiS»ÂÜåÍ´i~— –Æظç=¾‚®‚ñößñiÜ;÷]9Ï9ŒRú܌瘱ðߟÃn¾ißb¥µ~ÀwÏœ]é˜×‘½à,óˤ7çÜÝ`ª_s&(ø2¯•)©UŠâÊ°´yÂë¾}];%*õBBñ?|tÿ¸›ZR]†Îõõòû‡¼Ê¼ó>Çjƒ©òȼ{\1{ +€2w÷³ÖÅu¿_ì÷#¦gZd¦ ~ÀØ*徦ì×üZòž¼ëmîø܇ʨ±Yeo?ÿõˆÞ÷³a[/ϸŽgE(Ý×rYÏWסÎóuœÏ—J³ºÙ0„nz3¹™®ÝíÌ/C|>Ö”9§ãËšë[¿ã*ùN¬¹NCƒòÚ±ÄmÎn¹?³ENª¦Æ»¦ò;ɽõöû_âýL²¸¦B¤tX¥y,p±³6Çpy*¹sØ|øšÓ_âò=­¾{yÈ|ËPÕ'éôí|óL¹©‹ù`œãgë>FôÑÜåâYÆ^PíƸØë9/–×)33m W{^|¬ðûõD¼ÿ‚Ï~Zz|ôØB¹œmŠ»ýîÍв÷ù²9´OùDz=—ñöçÜÔyÖÚ~÷Ð(µðt##Ês,¯ácRDæNjƶrÇæl÷#ìâqçy'Ý? î’4îeBü9Ô¡‡Î\>s¬ЦÈz{±SÁï{ŸÇÊççmø›çã3ààÀ„]Ò|hju|ÕyÖúü^TÅMø!ÝèQ9Gøˆ¯qñvØÉé~X¸ýi< ƒ48·T=\’GˆK¯~½ +§e ¾—Ï>fö9U¨õôØEª²_¶k;0ÓÜ"Š%ü0.ל†Ð(ìßλïö¨¥ñB[_‘ú.'¤„c˜©j'|Örìs[Ês-ÛTa©\ÏÅ(¤ÌyÄcnùõ³ÞâÛGÄ¥=.ziˆ3wcÜöáMTJ·ÎÅà*%Ç.©¯6Sa™‚#Vffé{š.l¿H{Ç4;Îü $=VÃýêP+;öt~< ò@slùzý‚ë|b.÷4Pæ©DŠœó©{¥öi’?jÜz?ò¢¥éö|$åŸ=®9Øénrížè÷sã}¿Na¿ŸÇ>q‹w—Óqôç«p¤ÝÅÚ^ŸÛó#ŸëíÏ÷q?ëu>öÉ}¾>àQ·i ÞõÖ-™ƒ}^Ô¯öf^æSS¨¼9"7gz*{§ÔÏÏÌökž†tçÏ|Á¸VÏ×Ï åõ3ó÷z/uGób+›UÙ,쇢#?#(÷”ÁÇ9ʼnööö̾‰ã »â2㦽ºS©"}bA©Ïk¹—碄K_0½Ž4t¯~Ö5e3‚/Û÷¿~X3I _½ŸðóŠWÖùäé©_¯†”’,m\¬óŒû#ð:Š€òüñ í‰ .SûÖ›:Cyšaýºg$“ˆÉ·ãr馡ÀŸË÷9ã¹|´2’73 …-öxÞ­÷Ǿz÷oœkzGKWpp0úùhñWá$·òÛýC¦RÓabð3Ãå2s 'e­ßŽËÀ›K_Ê·û‡Œ§ƒ¬Ò%Ãñ˜1{Štýé„X@Ÿüv\n­ËÇí:‹žàbsƒ->wLV¿g0Wñ®©£¹ìáEüüzu¡]}s „‹y~ÜL·ÅçŽRÿRŸðN›ª‘ŸD¥íI-;Pµ‹’ýq­?a¼V†B¬ØhùQˆ}ÌûèÄãžm®íÙ_¶ß5>˜J{oLÆÌ,æ‡yyÄ.µúÅvOixÑ’:.žÓ0¿f芫#€õXç­uØmögFáËý*b¯ç÷Þè£[ësëŒ[_Žº½ÀëÈFJ”Ó_æf£*Á#ˆK¤Õ·ãòáæ baH{Ä})§”ËïøÜñÂ̹Sê“‘²Ëý¿÷ž¿’$IžØwýiEO—x2µ î)#2Rk-ŸÖïU½Wº«Õt÷èÙ³Ç%¸ã‡#@Hüiîáæ™%zH‚[ÛÓméáánnö3龌9-T,-‡ßGï“}>¶ý~Õœf çé§ÃŠ÷±ûmÖh@º:XƒH#å<Ü'Z +:4ùå >?4IØT¢c¡Øˤ³ñã§3XŸ; YÖÎ\šÎ†@è¶"md‹]ƒ‚'Z•óå&˜‡ãJ—ª%#êë°üt¸hæF‘ÕÁˆEhIÃÕðO’ÎogÀSg«HÔ¨"á +¼/bfº±á™à¡À¿¹êT`KÏò]Lü**Ä­øÇèÓOàßƹY›Q!·ð³ì“ "å(‹hùD[1‘0‡¡OôQ+÷ØûFŸì *.Ÿå£>êþÏM@ÌLUd‰¹S}óŸ“5ƒ»¶™µ6”*‹_wâÖ Î'*œÓY¾¥î ]Ψ}nèˆfÕNR‡Ée¨ÝG,D)æãýܽωʕÝMˆŸ¥k¨º‰ôË1Q!,"nƒâøý3Llê8];1Xë>Ì6±ÑwÌ妰yË×ÏÎ@¬‚Î<ö–Í|}ï‘l«ú‰ˆU%S®ƒÐ‚èáº@øž8‘⳶0ŸÌÀ“´ò¬~½CÒô3š¦JчÞ*Cÿ"Ž›¤I§–"ÌQ*Û昽~=/U&Šð.•8/Eì&sqJÎQZ(ìÎDÔT5¹›Ô@¡Á/ÀgÝÏ_øtë©™21†UªÉ©kq¤ë¸<ºi¬ðo¯@vŸ• „lTÕúÛÖ²žbV2y…_‘ôÙ/ŒÊ. áb!âïYI,¨ï›>Œ¨úö•ßË« Ua°‡¾/-1Aô½h<oá M¡ëÿG.°dL„“É>£1¢ÏìŒhø6/#òpœÈ;àGf8Y‘ø©ZŒèGkÍÏîà4Œ!:/!ŽX3kßÃÇà®M86yšž%@àUCš‹<êfÒ¿ýBJ|^eí¼©°ì>}›Ï;Œ½ãè€õ5$¨R¼»da²Ô&LÚ‚li¾uÀýã|F6s©©BS¡žë#Lžíè}þ]Œ¿±L‘R©[>"gDÅFí©`ÊËþöQ–¦úNõ¶ Û +j@ÍöY†5M<ËkM}"QaBèúÞüÛÈ„^¦ÔÞ@4üèoò'&¦ 3ˆm s zÒÆ2-Ün‚Kx˜ÁcúÑþÏYM:I®·X£5ËÚ~–«1W8žãQMB/Þ1‘ñè3‹IØx¬*zÃäúKLñÛ(áQ`D‚ÉŒl?¨e_é¾³¿ acÁx¯úYrì÷Ÿ4ltoX2yŽ k¢ÁË®0ãMáaá/ÃÝáZ_fŠqy«gW÷ãÊŒk Šè~f›ƒàZÖÖÜP+ó?ó¡ ß1¾m ª°a‰ïX´Øå®È㜇Э‰Ã ‡eÅÆo³t §`hŽ°Re9ªŠ©*ç¥òB>+¨†x×€>‘•ùúDáDÕø}„DÎ@D¥ÙËX‰¤OdÝc¥ªª ŠÈwèëOð«_¥ñä/¹ñ¦âãjF« úÞ8Ÿhòv,üË$'˜˜ÈøsŒâ9%¾b±ÄŒxÿBÿ§&ñ± °ý JÖOÁOe³·ÅJƒyF_b­ŽÆŠ8tzÊ/ÕåÏ +ùléÒ!Á„<¬ìYÇ‹+ ÿYžf(¶Ê·jÙ>–`+¢+T`)MXÁBɾƒžŸOß¹jÉD,ö2õÑ@ztb]~m|ÖYìY 9ƒš–ÌcJØ4×GšBɘ‚3Ø‘ÀǬ/‹uyÆã©1—š?€’BYÀúVˆ'E-Ÿ”àw *H¤2ìÆzÙ(¸8úDÿîL¾ †ÒLš²ü÷³4D°¿ì‡0E^Wñ†ó§(zŠ>ç÷ðɶÄá¦p 1—ÅJNæÜð ÏmE~gþŸ½xι%|zìJe`nN‡ÐÁ0£}ü¢CGVKó5q^˜»E0“…i£c™5L¿«Z:„Tñ(iÄÉŠ1…ÅÁ.Oµ­µCI)ÕµïÈ^Ð-\ØÏ;´„òàÃú2š¯«&ö…ÝÞŽD)Í9jĈ**Õp[WĨ¬cl(kW¿þK8šiJ0û½‚jJ¡:® pTsÝů‹dË2ñtI—œ)„¦Âᆱ"bW !SºÞAçã™—ŒA^òÜqŸlo`g~ŸŸO¶0ˆÍÞ'¼ó¬°0™˜ÞWýcc¢öâD[ˆDÖ>BäÄ1N<©«¸ã¦PŒ¨!4ÑLe`?Af*S¾MkÃ÷Ç1€O´„@dßeá*Zxñs|Å£¨¥ß;îyݼ/øT¼ýËc£m$ÛèT´ENûçe +O뽦"‘(–&ÇÕä‡qPƈ,\FÅ"pøåAŒJy„¿70²Ïq”Zd7TiÊ3UÅAM¿öƒÛre ô +p•*ØK—©µÂÜö‰˜ãG×z–ÝZ%Ÿß‚€-‰ÄTqPËÀ¯â©j8€.jnèz Y«<á¬-› òÑ‹5&üf Õ…ÙÒð´HŒ„=n*èÄãÏúNvVÁ)²¡üöž°{Xw4Árš%o¢Uh{ÕT0¹‰0ßÕäöë9ä‹^v‹„pþSÖ=ƒ‹DC“L5ÐÈb÷ŒýmÃRx“4Eº f²™È^9SðØÊú÷kN4(¾_“ýöìA w(k‚c£”Ò¨¯+ &$­ ãܧiÂLáÝ ù{‘ºšÙ³†4=…¢3lv³à·µ¥e°)>kª†|VG´ÇoO궅çP`û… þg±³ÞdS$/P mس–š kJpp\Í÷8ñSçÿÞJ™TÊÓϾcíj´Ô-C®Œ…Q!Æ°³XhI‘‡y¢*ªe‚ ÆD E¢…ˆ‰]Z%B¾Tø‘9,Z¹¾@õ¯2Á¸‰Ž!_v}µÓóæd†xVÕ 7,ßeÇêÕ…Gßö¹Øÿ½Žª†ÅIý¨%#ÃÎOŽÛâÙu@]PÌ0$ˆ ~ÂŒO\KdÖ’QNV“'”'úD‹b YûSUEIOeʱ¡cñpbTiÞBÊQ÷á#2æÀ`0A^coF¦öGðÝÐü hAôÃù†&­B~¸&Ç}%ërX@¼*6?´ÂVÑFÕŠi»+VC„%M[ƒ´(Ö…o5J°%#MÄÞ¶Š6¬%ýN(ÏT–Q€(ÙŽ.Ö“hŸ°—†úÈOãÑa±Zßd­Dh‡iñal£åÁ3¹ +fþ1²È<¢ppjêz¹ÖnæQA— »ñÕF¹Ž lT öÄÆAÑ +|/ÛØ»¦byëe öæ>vŸ¨›¶5d’¢Nýä*ÿä +=®3û3º-بr t “*YC32ñ2Q\Ä<¡þæ2âZcÛözžéëlÝÏÚˆ› Á´ü¨g;+jîXÔP +Á47βæs<‹E +d‚ám5”0JڕꚊƬ® ?¯ËŸ ·Â”’ ³Óù]Ж°²mYÉúÝJ;ýµ˜”j˜r½-?çÀ'ªR9±æ…Ò-¢˜ùÇoD“Ø8~J~àW±Ö™ôüQ¬üEÍß…*KùgŒ(«*ø“Ò/c¯ËX5œ€ðËpþÖp€O²€Å³–,HFç’)‹ ,it¦ìlcm [6€¬“4áØ1`ÇdOt°‚-Yo'ëÉ9¿™Pd oër3Ëà +¢LzåE$è +Cçcz }ië¤A]¤1<ÏÉB1,—†=+ëÀmñóuz!6I` Æ-,¡D]»â «Ñ±¦ˆh ²jhÉXÅ`¬7·¹­ìjgþ,‘Ý—ÖÕð~DôØîÒ˹îµ"*y™—T–b,Ž=(@’훲ø{ÝÆ:]QñYÖnZ|ÈÜðÝ2É&½×,4‡œL3Ÿ¶„«ìŠ I¶5üøõIsý[ØðÊò¡ s^›¨ ÙÅÒÙŽ@Ë–…Ú,£IVí£ÛÏT0ƒŠ­—LqcdÃ’FSS‘ÁÒõ›ªL%ã7äPADË,L™[ÄøË41¼AÅyd‹«c€G“éÌ–¬2 ÙâÁœhš²÷”,“37OÒ:sÏ4¥œ± Òò=ü%…¦)6L–È—[Òø‡|"î¬é»z’<î·N¤æßÃp ±.H÷-»1H“ô¸~Ìó…¯â(Ð%NCøÈnW é"ðgËð­@„çâ÷¨LÞ2[<‹‘à æºó“UÆ:úÉÍ¢ºW1RºN]·Öño´§m¿a  ØGU×|‹Ú¨¥dL•%#÷0ýeChQÓ±µ’jÊà/†™nDÁ0ð\ ‘oqo¤L”–ù˜“ÍNâF‹çOãdM ²^£T¶±0A²½má ´±([ñIvC”P'¶tŒZ*†Æø“Àg·2)(ˆ¸¢o òÚ«#3y4©¾ÙÙ6Í0ñ]–-ÓŽÖ-}l?MÐVß(ßRDœ×âiÑŽÏÒ7ʲ¹%ë‰ly´mlVÃrwtËbD¯/v –,ÃHËܨ þ³¨çlÖKPæ8a«7" .–ã$%ö€`IRҌӤwÎâw¶"œ•ìzYíŠÚ—]¦bã“Š,ùåÙ["\½ÙRy¡Ì³,™ÙËô ºže¡V5„ÐbªPZLu²d»s£žÐ²¥ƒÑ\—†Øe X€a­³>˜þÇ€¿sw-ã|“Í"åãÑ"(Ñ i5SR=uÄM]ä²Ñ­~LÙÜ€2§.f†î£ö,U¤ÖömJÄ™áœéÿ˜bv¥¼üPá×3¡Ë€]Lj*fs_†ïYôɲG…_¹Ç‰¶Dº +o¦ë?icE-x庛î[ œjËãÉ×J%Xçñ~FÔý†þàÅ°ú†÷ÉÏáĵaáwgóŸ”Íf4‘z dSv:°D—a Ú¾âô²æ[*,§BvS ΀JÏ“ýmñ,‘‡Ö¯yþÅrOö¬Ä ~ÆÖ@ÃXåÇÅ'ªòˆ0'SƒÈ>‚¾¾²*—†?íÏAõc*þ³<4ÌÛ¦¯í(ŠS¹fµñpú™ƒüaUôvÇÃV“AIÓúD?Co#å€O—¨2ÏSWDÍ+Ö9ø–_ÝÖ1ŸEø9YS1MÕ "žµùša¡O[̶Ÿ8âÿ^– +pkÒ'²KÓÄ»x! J—O:&8ñµ–Hµ¤bÁ¢ÄÓ‚l”Ó,φ#7Ît"˜ÏÓ° ÉŠ‚i0M¥-Ȧ.³*y}!'®K ¸k@ð²!Sç„»“ #ÿ~Å-ì·ÈžåíÏüÈ$(hÄD‰%›®&^¦o¤TðþÌœ&<“Ì÷øGâdåÚJ[’§fQ<¤ºŠI‰Ü%€h²\Áf~߶ +Tæõ°f*DÅÌ$C ¦Á‘F¦ñcA>Q|˜ê+;”U"†É+|LK<+v¼àÜ”ç׆£°3™çÖ¡dÅgLHP[V챫·ð÷¢d——gPq½»éUÃyaÕ%¥Ø‚Šg‚©RƒÈµÕÑ©O ºyš6†¸Â¢‚?ˆð†RÛÏð‡Q.Êœc°¡…üaÛ iRk#AÓ¨µ‘GJE[o¦± ,úãzÇ]Vyšœ¾£&vïdŒ/|>L·«XvBÔ5b*ƒŸ'ßÄn +•“E“œš² ›ú‘(!›—‚9Ê@¶@`±S[€tQ™HÙ}x˜(®c šó5m‰¦pš¦ó?1LtµðEÉo*£s²†È×D¶ðµ°|u¬YÛ”—øa]šŸÅŒ9¦®ø¾L*{.p±ƒ9k„—ãZ‰.Ó̦P‘h‹œ+Be£"&y1s‘*بˆ+ +}m?Q W Ó]™ýDp]}¶"¬@Gf¸Yèf6œ‰™‹–FÐüReö>/lL~¾ÚÛ'+2³–G Ĩ +fáp`v¡LJ•éFÜZD½Šåülþ2ÇÔ6n¬ÈÔáçó)Ùýq&c7=öTÊ4Ä©”ôŸd¶÷¹üYø£ + ’Óbʲ¨ D;*þ]&ø ÂA©‰»¶ ƒ!¾YžâÒD6$6v–æIõÀ!öF¯^•ÖdÓDýe‰êbã0,AZ¤‰Kj$u£§!±%>QýF·þ³"Ú!„¡ÿ FQóœDÿ÷¢“¡¿¹âþbùždÝo†ïËbú?ó5šMÖKÊ"S˜Ä®\@ù[Nx>’,”Çú/"}òÂQÁ^&úÛØr™r‘æ%¯è¬"ú„üÜs‚¬ûÀˆ*v§¬Ûµeþ=1$˜SåÉ¢)oŸ Z\Fhš@• ¿³ÑoRÒÂ]lôÅn2\Ë^[ð¢Ž]kQxbC–ˆ©V‰Ž)¼>‚’¬jëEÇ+BˆìeÌÓÇUôbIHJ¨Ÿ'G4¼‹†×+k×”jâ‰Â*0æ0“Ù̘´DMCôë çš.A-¦C3§Þˆ4 ©ëÓd`Ù»1QVQË.÷Ö±M†#ŠÖ”|¤ÇOÝÚXËOT‰±KOØy³2}•¨Wýû |¢"™㱄 S1ÈHÙ~_9€/‰I¼¡‚ŸüÇV@•ÍLo% ûHÀ#“0‰‚fÖˆg×å"Õ‡yMMyÄÖ‡Éøu_8¡ZLrãg„ ‹–HT/£wŒJ°¾C¬ÅˆÊlÉf¥mȳµ3«Ë5Ù‹Þ¦˜t±qœmi›áõ>ËøØÖaˆM°§,ïåì£3[Æ97J¨™?ÛB‰Š!EF”€¯Ô±eø—ó†pÉ3?Šì#@°7ÍóÝPv‰6@¶¼/†}€¨´Ye¾Š+ [°HÔ¼P£ +ØÒß1ŽKvÁ0°HÔFÐÄ‚²dkDÙ Rhè©DCò!·XqU–¡û˜÷ AÁÅݬ>u%çrñkUçJÐ*–Eg°\6B Hü¨‰ kE£î”EÍÞ¸IJ4Nút^ë–ùÂY©ßΑ-óULð°4;\벸IJE7rƒH$ÊëëYÃp¬N7Zî¶lÊ!zÕ²W-‘原Îk½Âš¼Ò’#}\aá8æé/¸’¢¾žklQ— |ëú‡y.Œ,³ó ¼8ÃÚˆfbÈ:•òÃ_ëx +–õñ2™.¥šHühúø]–Ls·ýp 6BÆê![úÄX-ŠÈ%·%S³+,L1lYœÁ…,¦`_G?Âðµ}ñ>™Áº»‘Ù¶ò’*X²-#RLà·u¬7À–#¦oÒxâ÷¢¿iL¤¾+2ÑÅ’Ä_¿fìíJüÃŒ šØ'ÅàQ[·*75õ£1Úë’Õ5[5eçLL®å®XÝ„mú KðÁ +K•U™¢~7ÉÄ +|V‚#g‡ÉÓ|Xû¦j²ªæÃyyëVŸŒær×'˲MVªk:Á²m}‡i­'†î("ÛÙ XåÀg¾LŠDÙ¾ž‹;Ü' ¾³.Û±“°/o1Ðþü ¨ tìT‡}éïY˜ŒlGTF_»r‰t³òMYþŠU{¬ÞCÁf¦ô§³×Ql8oˆg:»”ëy¬ã³ÇÉb%ѱâ^UÙoécDqUõoUð‰¢¤Ÿ¹sQUê6qÀ*äöç߶^8¬Ü­„pátéÀÄä]ÞmĽ²fT"èÀZwE‘-ˆeG`îêÔq€fàIíN)Ö½r ˆÚÜSBåžò¦†ÄF£ìÓAÚ²c:1°žç‹bÇt]CgÕFYƺAZò¬&Á\{°Ö5 k÷$ùDKÇf¶p&°:ÓÒÖeD“Ýà„çÝËCGÃY}ôëfðŒŸfȨŒ¬Ö0$8”mGÄ]¼ÂÔÂLr^ÄýÌ Ñ‰‹e+NSû¥ïºÑêu-!/½dªâ­:t__ä«Ï Ñck¾1£Ë$ƒ{$ËëÚàßptq19KV´Ö“¯Sß]"ì®­/¬æ®õϽ »[ØÜ73ÄÛ8Yt«Tý6’e´’ˆòËB“ù¨_ÃRWE”Hõû{ŸÝúºBÐlI“ÍV´p7öƒWdÏÕïŒÕþü8¸!Ûj~Íͽ càRóˤ|"zx7=ôh §E“I¿<€(«Ýð´:¶þ“/èN$º3Ÿ}ðoA·AŽ+¥×ïÞÜôOß¾½|ýàK—×·#“‡‡ÓûË‹NÝòŽebáÿçï×7Õ«; +ÿ¿ù·ðMø—; ½ßQ•ÎÎêPÙ¹`Ï¿HÚ°€¬×HæXP¹ü²ÁîòKK×äö‡d[ó¯ÈioñYâz€xçð ~c +àWU€}Ø£¾‹µKÒ,P> †ý;USÑY–„¢1 +Ë¿4MÌtʯíe~XqÓ"̈ÌZ ®ÿ[¶dͺ˜QÇŠ>€}ààÌ]°ª›°w;ÌÇ +bìtØl¹FãÁÚÊû·ûÚ„õZ%Æ&¹ýÅh½Êþÿ0KõÏêy,‹²©™0ibê*ëÅÉ.xd³Ótöׄu;á½¹d²Åê•t–ÛoN˜}ÿ?}üpç½Ø^ϳ³ýʽXyNíùùæ¤{ÿÏøô“çnI˜¤Å*d$ãñv’ú!×ÙþÅìùGžÄ¡¢퇃²{Û$âûÑ@Üôá³–­Þ‡£®‰Ì`“,g»uó³>\€ó$„Ø/¶Ÿ Òøß´±R„™½€‚7‡”qýæ ÒzŽ’¸þšáÖß½ñæÍ5"ì4ÝüäYÍ°ÔF]?xÿ&YÎt=êúƒ>þôó_”¢\Ú]|a}¸|òþë ~lQÞ¨ºáàÃXÒµ8Žî“ viÐs!¸{–Ve&…Šü£€n¶yÖ.ü7õ£ÀC¶¯3_k]ü22;›v-îX¨†u_|(îÌE¹ÍºšÖ‡C°@ õ®_÷5 +–Œ³²xKyõéÛâÍõgz_ødŽ!Ö‹ò‰àú¯¹…§_lÊ/†þ`¢jÏßAÍÏ^àd›E2‘EM|6ûΈ¦ouq¢Á¶è\°€i(¦¿Ü8}.ƵX&? ð HäYüY""Ϭ4ðe&óQ}n¶¿$mlnò]¬Èô>ú.8bêãƒïb ‰™z}+au} ýúßżþHæ9×|™ÍŠ;5úá—}:ßÿÇ2âÿ3ôÒ´Ï€/uÇ}ùÿ +ñn [ªsª„Ùõ`×nþEû£¿`åV‚ºæ³Ä!Û˜£ÊæmWoŸ_füåß?<}Ÿþ¬̵öEº|ùõíùå°VÚ™w¿X1„`ð’üßøé—¯?ÜaÁ^U±ØooþïŸfƒ¿Àÿh³Sm>Qc‡ÿü‹`Ï­|úö4³ÃaêóÆ£»“8m%s«<³« Û›éÎ4]˜™ÕÒ<3ËK­0Š[ úÝËló„ÔR…A,ӎѦRhîØp'éL;S™æ[‡ÞðªÐ¿¤­s»yfÔN²Ûx¦HçIš0Ëfi”m·¹Áí\£¤; ÛRÿ4×>T‹£|ûÊ>¯ÎÞXõµ8·[š·LfûQ«¡•æVíˆÔ¼Éó´7ßQJñlOqÆ0ùˆQSrƒBû¬6{™ï_YÃh¦¥8ÃT±kVÇ!R5*ÓòìEuõMãô7ùñ Å›Çò½h¦]™<´N¾¯¬Þ–g¯ßåúwZí ’i[Õ•îÍ’¹^Ь7Eëj¾m—ÇfyP]x—æÌ"´¥Ýx®¯—01ÛÑÚáÍUwÑZ¼¯L^+¥U˜vöõjШÅ3m·w™oDíZÔ¬fkGùÖ™å-cV;¬US™N®vÐY¾7*¹­„ÔÊv,³Z ÚMÒn"Ó·k'VýÔ¨éåƒ=­6›ÉL_ÉÔüˆTa¨$íéÎ ÔËÛ‰BÔj%i6b'‘ßK“Ùž^šÃj«•e²8I§©Â4í.To +çE+-ÍÚI”v౨݊ÚÍ°QÝKãvC/RÙvÔª…µJÜh$௴*0’šõ毛ÓÀW»Ñl0]Ú矆iH«$‹J+R?WÝC¥°ÈÕ¯ Í«^MÒN:70J àt>Fj§nÿY*ßµ2€33ÕC§}Yl^¤²Ý'R*q«ý4šyÔwc€ÒÛ–w`Wõüp;–…i¤³½ý´ÔMä÷µr±sÓ>ú©¾ø¦Ð½ñn8S; ZaA­²«”Bz D"ÓÓŠøRÐzñÂ8å®ÔÒ1©_—gßHd{Õñ‹\ï6 ×vÓÞ^ºb¸s­8f•í(ù1È™4[“úN4Õª­L9»‰B*ÓÓ‹Ó°^ßMºûérX«y´öÓn<Ó#µãÝ +êÞ aŽRÙ>(D`›0iÁß*Î̪ƒT‘ÎTCZ ;FÚÀ »¥çGJ¶ÿ4’ *å@Òy´“dËD_Ìî‘Ò¢6¸öºgÀÒ{i/¨Õj9b6Tw™iß—'¯œþuÔfro?YØM䞆Œ­5‹ãÁêm¾s•.-ƒì»r1»òÙ®€¢Ìu*Δâ$ß<ËTfq QKó¤yá îËÃ[Z[*¹n©}>ºøm*?Š‘f"Ó5+ R;¡€*p¸ŠÝëúâeÊn¥D?ÌÖO)ˆåþÀöôáŸÿú¿_~÷ׄÛOºfã8Óf{Ù\~Ý9úÆ®ÀWÀ‹“®ê,ió¦0x]¼ÊwŸg;×pv2Þ´Ø» +Ó(ëé)Åi¡sëÞÐöU}úòêÍ¿}"uÃ[xãíãÚ§?µO,ojûßýÓÿäίw +¨ZÅ])¥e¶qVlÓêC)z¶Ûôfpˆ¢¤bˆ—ž§µ8y1 +|N7 X«8¨µ˜ÝOe'Në"Û<|œÈí¥Êq:δŸ/ +½ç´qž.NQÀÖR…Ýxf?•ÙoE¼¥’DÍfĨƒf ¦˜ÕÝ·—*m'œ Z *U`­éD¬Ænº°Ï|¹›ÞŽçérD5ÚvMå`ªÉ:O“¹=­Ó¦Í·oìê±î.`ÙáDZ†ÅZM3[ÑÌ^ÂÙK¸1£­g' P%M»Û1úUP΀ÚÒAÀ±ÜN²˜°G:aµš(]ßÒæ°ŠU>Ô €±{ÛQò8 ÇMøÕ`Wqž¦œ§É’í­¦g?ï§Af3€l€¡8‹\û®±ü¶¹øÀU¦ÔïLoëófõ@÷ +€öòÄíœæl±ÚùÆA¦¶ŒÑ6Œ`ò¯´¬-^Ž[Mwp »lPrçîðYcõfzõÓþŸ¿M¹CÒ<Îön²½[0hë¬0¸3ªG€ß@Åì6è§ è‹ÔÎr€ðÇ/œÞíÑÍæw +Ó~”to•mœäÛç8í‹ÚäaxôM±{‘È÷ÍòÂ,ƒ;¯ÌÞ¶ŽÈ÷¯+Óûoþð_ꇯ¶Ò.@ NSû;HTàdñLþ}_)¥i›Öió ä¼ ÒÆYÞ؈ýtq?U©5€ VùÄfkù>Û<‚]>Iå@¼Oâ ž@S—l@ÝÅE‚¶“…§Q{/™ ©n̪Î$` |@½U®vš }Q Peg7Y +j5`0)û©Ò~º” m!£¶›Ìo…¬¸Õ +¤Ê[ÑÂNÂÌ@k§ðØ& W@ì«ÅI”´aΦ·[Ø ~®;Û[†ôzPñ‚ …R%˜ÌlèÚO¹¡´ZòIØ´)#³Â¢føÇtæ žœÞM*×x¯¹3½k»Pòƒâ¯Â$µü0•io% põÒÌ.Ï@8ï¥ +Ì$!YœÀ^d›×­ÃŸúpúwÄ›å+Óƒ«_.¾õgUìÚA¾sZßvßå{?Š­“|ó0^mò²<~S¿-ö_8£Wze-SšwÞ†ì q£´ìÿ8¹þýüþŸ¦÷¤ý306Ç—¿ñf¯"¹aÒ™êåUyúª¾úŒµlû +¦”k€f’ˆ>Ó[”'/ꋯ§W@ÍÍTïHáÍHõ€Ô o +Ý+Ý[‚ö„…¥õ#€ýª3©L_NoÿTš½tÆÏZGïRÅѾVU)°X"{º±›€hõ,>°¼vEêNkãgª;ÙI@7iž$Íî.¬$µZŠ~꥛3@ø0•Ýz/ì¤Ja»¯€ÿŒÛýï+Õ}Õä³ÏŒð{m:³bã¬5{“©E¬NtŸÝÕŠ3­0Ôš²[òw“Pš Ž~á­ªä†!µÑêQÔ"˜Æ`$ŽÃ왞]=‚ËœPh_ +C¡1»i¸³BûÖ0™éí§œZN’Þ~²\r @Ý~ÒI˜$]f[±(ßV†?{I¥%xQ:;á NËrÕ£=Õ{¥OCÖv8³š Ž³õ#P»;i-™inEŒØŠ‚8gÁö@~g›gÙÖ™Zš€Š×rýbíptò­;º­Wè^µC¥4´\ì¬ì +L»Å|ÓWja ‡7ÐÈ[%ó“ ÕM&¤vT>ËuÏfYsGVuYè^Ðæ1mŸ)•Uª4+O_ΟýÙ›½óʨŸè•ƒ|ïÚ¿Ìî³[0·áù(mw‡Ä3lûÒ½ÎtŸ«µ3½vx;`ÔRù!mk¥ Ë€uA¦óS·ÿBsÆ£’m`Á9cÅ›+å%ؼ`±º½»Æüm4ÓŽF"×Mäzðön;åí*eÐPÙÊAux›€c!°0¾Q^€ÑNWÂi/EÚ°;[a+¬• w•ï>d›·¤|dævŠ³cžÆ2#öW!#b€0Ð -{iìYà0 €1`Í3µC0FÂf;b6Áp •# &™ëåË‹$i~PwâY`¹täê0•œÐKÓ~¾v3*_î¦vãÙ@$ í‰é-0€Â-´. í«iÌ F¢R˜€ÆV0¬–á ”¶"öã @n7á$ì^Š˜œLœlg+–Ý#é€p k7Á:îÏ_ܾü7OãÙØUvbY=7.Zn.S™›Lʉšµ§ý¶B»aÄ¿pL`†É\L­ æ‚¥â´ÐÿmÐò~µŸzÔõâfú¥Ü»…ÇD/‚1Ø~T·c$˜.$¹] Ü®£Ê¥áU„ÊÊÁŸ­ ±†V˜åê—`j5 pá¯úWûê“ zh7€µ¦wÈvbÙæN +Ô(“'­ ÖHH8éI»é¶Žê“«Õán±˜K`»S^L«š…Q©}ìaäûÀ´ ::¨”˜"c¯è ŽÞéîèIÄÝÇAÉŽ8¦88Ê,tóõ9üËle"¿Ÿ(ÀÈû)o_)N;yñç}ÝÝ´ö“¹§aÚ“éS£“Êë³nïl'lhvÙÊ7†÷$lï§=ÃZ§`¶3Lb¦±R„ ¸p¾éŽ³õˆôÝDà"pˆVèÁ‚Þ4 +£Úð z³<!ŸÎ´’´g6b7”â,_§} +Ì´+F4æ¡YšÍ¢»¥0Hç»ÃåÃÃÏÿ©8¸‚™Ÿíƒ!Shœ¹ƒ»æá×VƒÉÐæVëpÇôLoÒœ¿fK‚!\œXõ£åÅ÷úïÿÏÉåw[ñœíÖe.ô]¥dU.œÁËB÷®²ú&Y>L’A±y +}0F®ï”Ø©4¼ ÛÕ§QRÈ,Ö­Å3uµ4RJcÕÎ^ÿå¿û?b™ú£ ¦d[ÕñµVTo+^àžÒ±7¼´º&•i%ìZ:ÛÝ|Ëô]³Ò½|óÇÿËužÄ²©l Ût¦ŸÎ@ý…õZuxõüÛ^ýøå¾ö8 îÅI +æÇ6QK0•¦ +Àu€£BF,µÝNHÙíbã´Ü»´«³Å ròq„@ƒXÍli–)ÍŠõ#x@Ë÷êƒKОO8í©aÅIYM0Ùhõ >}ÀŽù~2HåCéR Y;¬EÐhÅúÜi€,b_±ŸͽD¾(j7ƒZe_q…uÛ™ºÍsÕÿ$ò4¨FÔ’^\™¥%Hixf'J£J)¦kØÚŽÒØå¼]Jå'p$…ííè_O˰ij}‰;qÆÀ{ —SE%×V²\uÕš½Êö®ÔÒ4™í&ÙÂVá‹Òù0©®ò3Rcí0]zÃÛÊüÁð¦FijW—š ÊnV\šµå®^ÛSª 9Áœm Js_suwLª Xç\ï*éŒõò¥W¢jYËö£Û  +{ÑL°¤bf]x;B:š3Ó¤f{öR{ÑlÚjÅÍèÇm€Žñì~dl%‡4N“F9_‘fcf;š…?“ øƒÜKÃ"ÕÇAm'–ÙŽ1Ã9 +‚”vsµ“Z &]§rô$˜Ü‰dØÛ­ŒOÂd/YÜežUø¢J’ô-wX%j4ƒi/ÖêE-Ðõ`7`Š‚®i_djqص“k€²:‘%ò3¥tX~Ó9ýmeõ^)ŽÌÒDG”Ô‡Fr Ћg‡ µ÷RŽ–cç b×He–­.3³êü]iü2íN·Ó®^Y•ÈC8×ùñ×ÞÁÏ…Ékø«x¦¯83Õƒ¯Lí­ºG?úÏ”â< +F´Z‚%…¹m…mæâÎŽíê™]=Ms|,·Á=¥80k‹”3P™ìZ¤s†1“Æt€M/b•Á0$õ³l÷Vu )kkh–™+¾¬0Ó]‘Æ…VœëÅ)œЧ¥°Ÿô’Üî"mÀ“°2ziÎB´ª»Ãö4·ËnG2{©R„tÓÅ…áÅ3ãXf¬—iå(n×@ÀZ³ÌmÍ]Äi×pfNç&P?–QìVÚ¨†“ŨZ!ÞQ*7Ne1«¹ÃÆ¡&jqnUKݧyHâZ=˜tþq;ùwÃÈ(ÐÎ(»-²LÓÞnÒ­‘rm°MJ% Ô"z½6¼ÎÖVpú4Ò‰ +ð 0án,Ö@#/ZÃ׃֓ µÏ4ÿqOHÑkAµ [°Ÿ,2ŸC~_ÖAp)/¢Ö gÒÊ gA‘!L¼ÃRï6¨7oÎïS….s¼Ã×îèmsõc®w['½6¹'0% ¤nÉöæùæi¾}m—äï¥\ê.Z³—Aψ‚Ž3x>¸üCeþ.åLÁú+ïIó"¨U#fÝ[|W¿I{KØ,͇¥Ù[`E½8ȶ5_»Šg{­’ÌöÁB¤µcPO°‰€÷’Ùa”ô#`»Y îšé,Øø'VyÂV+Å:`.»Êy27Ù­½D.’ör••æô@¾EŒJ¦uJšL_ n8wïÜáC”IÎJ’E{jq¶!X¦µ¶“tT0]uïIHÃ?`ÔöAÀ¦K°tqæÏ‚® ªµGû00Xål@†‡ôVÈhgWåÑ[·oyËLåPÉ÷žÆl°O÷µ²îŒµBŸ”gÅöUL¯¤­*u'Ûaóɾ¶+PåQ€©¬Â6f6l$iwy@öŒÂ,i÷´ÌØéïžFÿþqd/–ÆøÕ®ö[é`<Á$¶Ÿ.'3ƒíDñ« Q ³Tv˜ÊNÕü¼2ØyëµÎR¤óUÀx´¯£FõºBûz~®e† £À Íø8d‡•r©ÿŽÞn²æ'd`³ý4Ë « Law@n'3ýí¤ðLØå ¬Fªô4’ )åLõÔÜ x¸lxKÓ[%À0OžÄ3Ûi ÞÊäÞª,"F-™íÅ)ÓPQ0 .-ç¹ÖéN’$hMu‡V}¥×X¨(S?vºWÙîM²ÀB*é\/lUvÓ…½t V2;°êgjí$™Ÿžýttÿ‡€UÛWËÌóíšgºhª½Ç¿¨3{€ +Vª{˜mœëÎTwažGñìÀtfÏÞýËÍû¿Æhk;^ÜN‚%^3ò=ÍÁžë&ô²]šìiîWQs+U°Ê¥Á3«…ÞmÌnXt¶§¢v/ÒÎI2¿›&m°ú·âù€V†9ƒŸ-dÊGZ~1Ú€ÃÓ¤HæÀ4 ¤ÊFq–b6f+l´v”ZÔêwgo³åÑ~’¤3Í}Õ iÅݸµÑá8+¤™s†Nmù8 ð+¥P +ÐTÕv„lÇrÀÙúIœ‰P+i¶íÂÂvW .¬Â"¢Vþq;õhW߉1dþÕ®L”‚L€”bü³œ =Z¿Hd†A½Ï ÂfkO©m§ÊûjØ´ƒ×½µ–|(Ó½xLË'#ÏÆŒ:sú¥Kaµ¢° ‡òvô{EÏvÕl6h+Qû–e;«]Ø…i«n©LDÍN‚n…é^Âa:,b _ L›Øž™î“(}vD²°.†L¨ÀŽ°ª:s«v¼¯ƒ±`§h=i×´bÛ>ă}ZßÛõÕWq%ló$[?ù¶Zpœ£V'Nz çRµŠ=!³™ÊOiã¢Ð½éüèÎ_íhMkÙæØÚO"ä«°ù8FCFì_0´CzCÉOánNˆ´hM)Œ*Ó‡ùÍÏÃóoÁ\U€%hpˆ–;ºKÝ©ÐÂ(_[mÁ"(^Œv#&‹ ÿä›'…Æ­­|gÔ~ÚÕœi*×Î3êix€€¹’ +VÌmŸÖç/v’ÅÈLµÀo'ám Ø fš¥ÜÝxáËåW;é½X.nµ5ø:o‘´QÍË”çÛ ú8¨ìÅ)c½VJÅ‹ÒNÃ*à.ãË­x ™bL«™Ùa¦z†d(íÑÒ,WqíÌŒSxÅÓ0Û>–T˃6þ«­èã]XÔÊuŒ\7Iûq0$é°Ð:šÈ?Žåöõz,Ã\1<Üs•ï\&²CP%`Vøÿû§PµI³×+ÛÑ\ åR°ËÅGANŸZ*¹>˜ºpj4&sCÕ`dEhƒ¡‘Ò,N;lÙ Y¼Ý1á–, qït~^ìÕmPýFÍ\aÕw’°ô˃ëúâ•7¾OæÇ«Æ8˜ŸÃÓìhÕ|õ´6za”ûfu'å6g¯í +œë2öóŒÀc¤¥Æ`Θî(JÛ`6êå€îJqj É€Q uøÏ]©"ˆÇíT~;žÙô¨Õiõ˜ÖNÀ¨} «.€L8éÂÀ(/ÝÑm±w¥—võ¤ÜWm;FÒ´MÀ8©Lh·Ç2C€Ä!¥˜¢}0Þie Ë¢f¤rl;sf’8¡*@Aì'Š{‰b ]£Æxw~?½úõWn[ŽbV{;–=µ—ªî+µŽmnEs;‘ìV8³Í’ÎÓpæIˆ’¥¸QÏVWÀ±¹“,›ÎyÐwc€‘ÃRW÷ÓÎÓ( ¦‹x€úã½4 8°åWcz£=}m8ÝØ +~ù4†éŲ{ñâ^ÜãPÊ®ÀFûr+²±Á4²zVÍ@¶Óú)@5ã"¹=•åV¸í°É„Ùj€¹7f)µ +ÒÏÈzåÑžÆRË€½­&Ëï²»ví Ó:1Ë € éü@+-iëŒ6O’pf›G…ÁU®wЪðT HÝÁR«ììï20N3L@ò¹>üm®ufz,|™©,œöQ±{’oiÞÊ®¬ìò"ß׺5ËÇ —àà„À@SÝaøvÂIЎ¬sÀÒ) +‡hÇ*¬–ÀKdFÙúE±yfHu&Ø™è Æ80†«az³bç,ß½ø*š“˜dÚn4·: 2Š‘QÚa©&«Ó@‚¹ƒö《Œà†Àª¢85j¶Ÿ-/bš³Ï%¬`à­Hðp‚ôAÎ8ËüÝ£à—[±U™RîÂè ¸.¹Ò¬\ÐÀlù`­0d¥×XÄ*Jà“Y<1–{?n±üUKü£zð'h6AJüÝÓį¶”§Àðj5F'™ç:—ÕùËÒèÎ\•gÏÍÚÝ8Ét.^ž>ÔVïGß)ÞA²8IÇñL,fµ9Óxn —áävã ßÌØqFe‘kŸ™Õ@Å°¿¹(¬+Z]8ÓÒð–ÔOiýÄ,-?:‹ËßO¾/vÏSÌ€,RœI¦y l1RYÑæa„OÚ…³VyÚ™Ïçz×Ùî•:Îlí+ðª |HýPóæQÀ9ÎÌ=4Þëµ%°zˆ@îm§=àF°ò²Ýû Ñ| +‡7UHdÚ¹îE&\9Ø× Ó…‰U=ʶNC€“³]Å`ÝDÍz’v´â¬Ð¾oO²œ«ŽB[¹:œ”CÍYê¥U˜tâù!˜Ÿ1Ú¨üPYŽvà.Ã[¤aÂv/–_ÛMäôâ(Åظ“ÈCV]¾s¨5b¶õÊN‚²·ã9`-£0UscGÆ9¦2Ì&0!p -çJa +–8Ⱥ@²7ª;QZ5f¶£l‰jöl—8#·}HçCŠC+óÊä0O(…ƒyŸgQ§a¾±Û*8'Óƒ4+Çšw‡OÎ÷·£™½ÈUûQÐ +¨åËžíZå¥7º¯NïkÓûlû"ë`ÖÂZy/íEh¬ZÒ:Ïu/ûçïË‹{°†ÊÓç™Î… ,1¸j~=¸ù]õð›Lû\sÇj¶U›='ÍSfÆ,ß=/ö.Hó°4†•ŸºçÕå‹lç ØÞUž¿ìž|Û:|Sš<7ëÇFù <|ÀžÖAþÞfÛ§…îÙàôÛLû$Qjå»u•í?/ ï3Ý­rú.ß9¯/_ª¥qeñ¦vð­Ý:O»3Ò<³€Qk‡ùÞEʦa<ßÓ¼ <–£»Êüuiòx•TŽL&²¦±L_q ©F=dÕÁ”Z*VF)nWKƒ“t¾c—ÇÙæ¡];;Nt±ÿï\ŪLvÓEÊòm¶A—µƒ—Ùþ•7{¨¯^å…þ m.áyÿò»Þõ¯‹£ëBï¬Ô;YÝÿ®Ð¿ÔJSPùÎÌЃ48ËõÏsíÓþñ»ÙÝOÀi)g +ÜX¿¾j¾i}M:7´u“iœn_sú©Â0Û:«Ìž—§ÏœÑmª4eŸÓ¿&Í#»qb3?|î-¿®¬ÞÕÞ—¦/œÎÙêþŸ*Ë·álÏ®×–_×VïK³×îäÁ¬­Tw”Èuá8$ó ;´:ï¿^þÐ>z×=~29–Â.dÛçð±&ÁâÐÝIÄj2D§W“ù!`6jqd•ÙÆimöªÐ¿¢­#`ÔÊôm¤ +½Lû,×9ƒƒãŒŸÁBuN¾i¼)ϟ냽–È 3uxþÒ?‡¦ +x²:{X<û}ûô}ntS?xÛ8„Ïy[ÝuNß7V÷À]™Æ¼wòrtõ]cõ"•ê¥9óW`,»½sÍu°Pª`&Ûû·¹îÈx{i|ÇÊC*3àÏTq¨{‹Òðnzýóøúg»u¢N7Xè­§ Ն׽«ï†7?¼úÓíÏÿ±Ï;¥í³z¶AeZgÕñ³ùÕÏݳg t¢pf]ËõìÚБ]QpÜX¾ìž~ÝX½, Îâ´ š"Û¹iŸf)jÞäyuù~`Ñí±QómY^åGwÎ侺|5¸ü~|û£;:s‡'ƒûêꡲzhÃ>Þ4^;ÀK½óLçD-MìÆ*Óf¬¶|Õ?ùîüí¿?ÿúßuOÞyÓçÙÞe¶sZžÜT¦w³ïkÇ?ŽnÿRš>hî ×€C×)W]ƒ:®¬Þ’޵ݹê\ü\ž{ÏsB®óŸ>[^¹ŸÚT×øÌŒ]¨ßFK«S[÷ò3j;íäb58–³Å…s©ÞùâòÝÖ¨ÈdØ*B•œÏÌ^KMx‹ëÞʆ7¿À&:¡Âl¬:'·±ã6ÂFÈ™äÒ=»XÁ½©DmÙ—žR;Âx¸Ãæ—ÉTßy=©Éa =jt\’Ñ%°Ñ M[¸µlž»d"˜&Q•Ê3þâŸU)·Wzîm˜•Ãç‰5 +³wÃ+?{ +Íõ’ÕÅ›·Ÿ½öôLt47³W^¹‘ž½ý›Ÿ¿RX¸JF'6ön_~ä*Qл0:bFª®åfÏu¶î‰wv*S;wž|-X_ˆ7Ö¥Êr°¾ÑZ»±rñ‰É½§¹ôR©µ^ëE½Y‡Ø÷b2Ú +Ë©©ó­;“gŸˆOìu—ÎÕfv>«Æ$»ÎPÝnÙ™Öæí橽Ù9hA,™™¸Ã_° E˜1+©v&¼é…ÄÄi½ P0ìÃ"΀^9à w¤žjnž¿ç¹üÔ)›ˆO„[{by5¿p:ÍZé$Ÿ†N×á~>Þò½êÒAsýzffkV6›®mîÝxåâ¾T+=q*Õ=ë5 ñܼ/¿@Ç;žÄkɬ´Ö"Xõ–@(*óWOOœž\<×]¹€ùÒðÏ¥Ê"Ô|~öüÂþû÷='åg'æv/Þ~ÊXBOÆ ,]‹åÓ±î¥x÷<iN.žYݽî.?.UñÈ$™˜å3 ¥¥{Ùôœ—ÈH“/.Aýb°‡NÏÁ¼‰ùÙÓ7žšÜ¼¢°{A?MT*PÛ*ë®È°:á+/Ÿº÷àÞçh©fçsBy‰/­•ÍìÜÀ!%ˆ¹ Üœ× ¬+PfâÝHm=9}^jža³KfW,ßÚqK99âDù¨¿0«¯§ZkÉæbajhЀ;ÅL¸²®n‰Åp1g¸­,,ïÝßÚ¼®wJ¡ê2XŸŸOLó×6ÈÄ”;T_Û½gçÚc®Pñ„ÎILrÒmr¹éään ¼Øèí¾øÆÏ3ݧm.ôÎ>Z\»Y_»1½û@qé&!Ö7NßÚ¾ø8¸ð|h¨º(-‡kké™sÑÎi\ª,ºÑ\8kñ$¥Å`cÓ™å2³ÑÆvsãvªw…‰OUúWŽ¥Ž* 5“š<ä xŸ:FiecÎPÅÄç,Â0*!BUÈ-ËQ¯óym2TMw·ò½=¾0oæ‹&2-,¾þŒ+˜¦‹óâ]*5ƒ‹"P40I“'(.{â]-îÃýiw¸FA×DZt¤ÈϹ¤Jmr»ÞÛµ{3‰æZaî\nf?;}¦0}*Ý\ö„*×ï{êõw>h¯]·yd árÞì‚PÚòשø”ÙÝ»ôÐcϽÊv¬L"ÚÚ µö¢ýtïZvþ‚¦*½sRiqÄH™<¥:(ùRfòÌþ¯‚w³±z¤<¯°ñfO¨ÆÂe+Bå•éÍ›åË>“¨-Š=×»ãW¢c“ÒšT\Ñâ"'•ùXÛàÁŠ€‡:£S˜ÔB<O¸¡¶{F †|™Nvr§½qC¬­=©“z÷ ŽÐ;h2X² þÊF¬³]Z8˜8}›JvO"Òº9ð¾‰*Ë×CõPe9ÞØ ¢ ¥Ã'³q®pÓ@†dˆËLC€çæfΤ'·ˆPÉàò²Ñ²›–j«±În¨¹ã·Mîˆ7ZY€,™š4íL\o÷ÑR%ÞÙ77è$8Èø‹{Óîh ¸•0±¤wÇmœÖ.,ïÜ"cíÃãV=´{sÀ9à&£sÇÀâùx=V]”Ù˜py¡¾z+Þ½È$óS‘‰]<\V–×® );™Z;÷€Õ€!ù«›Tj€¿¶u»²x ææÌdlûà¡Êôöx?éØ,ÂAüÇVŽpNÁ~àåo„ÚW\–j›©6föhq ãR\¤<¤ÃVñæmB2………ŒVÅ•½SyèPŽIÔ˜Dðbj¹Y6Ör éDa¦¹r‰ÏM#¾,âËáb™ ·Á“šƒj„e‚â æ¢ÍÍhs#ÒÞ¶Êj—DJ%!3©vpb²Þ;}gòôCáæ)§TÓ B™Š™;!³ÉôÊÄØXƒN´\±&›žÔR!«'–: «iãR¾ÌL¢³—šÜ W—ÜRÁÊ„Æ,ôÆ)31'UÖ!-%šjïD;±î:;G%:*»Ç(†Ë«ttÊÈda,MH)ÑX‰·6dv^e÷z¢](u.Ú„‚I¨@B·yÒÎ@Ù¬*>RY¯,^r‹€+™ö—šQØÖŸ_ܹÁGËÃ&7›™«ÛÉ©ƒBï*Ÿ¶ðE=s ¹•›b¢¥ÃD©0_™½hl ¹Dà|_¼“Žà¢­æê­ôÔŸì‘Rƒ 5>G*ããÃ:‡… sÉ.ëd:§Ê —í|a›‹]¹÷&PV¡‚•Máþ"îîOw÷+s—fFJ¶* _^‰2j„6:Euÿ«@ŸÁ4b•…i̇0®BX%&ô¯zÅæ˱qRíüÚ ­ÆpÛÇdæ:na€<=P.C°ÉÉÅK\~Ræ`µ.Qç +©°€;Ôvƒ’Áa%bq†@¨¡ö¸Ì€™Ð»Âr‹Çâ9ø¸ +øÓmw¤‡êl¦êÁF›B¬1³z©:¿ga‚F2àÏLå»»…™óÒª;:áªzwæ3˜ëÁb¡Þ| ´+’›ÚïnÞÛ^»i÷%bÙæÜÎÝÂŒ ñö¿:t-l†OÎø2Ë0¹Õkc’‡wÜ@Ø=1È ¥Å+™‰Ó¯&·,Îø“‰…‹ÙîÔ—ƒ¨PŽxÕ‘ ´P¹ÇÍn+tò0rwbZK§ÁžÜá†ÚÍ—Ó~ßx}ÇÁÁ“´óiç¨Þ©³ûœÞÜ ÌtlDÓW‰h;XZ‰ÖÖ½€ßî°ÁŠ×6²“gµxÀD…]¡`îM#LX‰Ð¹då3&a¢VOŽMLG«¹É}ŒÏ)m#ð„ë ++­A9èz&Öª$#];›Õ!‚•ŠÀ’û§§rîp'ÙÞ­Ì_-Î] VVe6ÏSšÝ2³ScçÁ!ÎøssþDÛí˒€Òa¡t¢ãMw¾¼…Œ[¨ʤ4¶T[XÝ@eç ªÆµv³C Ä2jèìþ5î`b/ÿ½úäƠ¢CX6ï0çI΋¹U1·Ôß,B‰ò¼\±% J¥Áý6OÜ!d©0±pV¬LÉ0ÒÄHt¼æŽVì"¬H©µ²¾h› +÷½Lï–`ΕˆÇ@@Aœí¾ LÚôúåPeÞ­Z¼i=6ºE§?-•çˆ(†ô¥ÀkÂÅžKÊ«Þ“z§Ï¹ÃsK|bR‰²„T ”× 3gS[RqÆ,¨L®9;»{7æK–Û,ž‚Cj“áŽSèŸþ•#>@V1¿Œ …ÉáôÆ"U€úÒ¥|o?ÑZ§#Uo´²¶{}n÷Ö€Ž0qÌ_ÀóÄ'16«E|XDB4¹D8@æuëH á¶ÅòV¨vÊ@ÅFŒH>¡ž˜ºåQ6egR(ÐÚ¼ƒ£†Q¥Ù`÷ LŒ V1_èB‰xq¡ý)uÌDúóÓBiNMZØ8„& ê¥ÄB¼¶n¡Âƒ*tH °‘v>p™ò*ëöoQc&W(˜Ÿ;¡DOŒ‰6¢u›‰NÈ-ŒÜDBXФà~hÏdw?7s>ÝÙó‹V6§@P96&*3j ¼VZºšêî{3PÌ'T˜–¬|ÂÆÇìÞ4¨ É15ëä2ˆ;hgbǶãc&¹Ö®6¹¬„$Ó»äèˆwy3+Û×ý¡âÉQ³Õ‚îC¹¬Ý“ëóE‡4̧”žAéâIJ+ôl€‹×ãåôÔŠT›”ªÝTg¶¹vfbû\~a›ˆ&<ñ&4i٨ȰWÙ(‹Óçô%˜p‰WœÁŒ+œ ä[[—ª¯î‹¥Ž™ [}q.QNt˜â„ …ß÷†3mO¤4¬¶Ù(ÉB…Æ­´¿}šLÍè©0Å•(Sñ‚Uˆ*]^3¤étoAlθ ‘’œÁª&ÍJÕÈLN@ 0»d{ó…Meç$2Z°°".ÆÜ‘*Ä=‰rqj©¶¼M&K— ÕéhÇ茎é#CÚc#z…‰3ÓÞ$@N\c÷ž ÅEw¼‹*:¾l D>UÆü‘qÔ-w°6_"R_3S‰ q|X§·Pv—d'Ç°ÐcfJùœµ““À8 „ÐÛ¾ÜZ;GÅ‹Çõ¶Qí +ŠMÝ‘ccÆãæa5¦sFgpXãøêŽó–]RÓ›î±Ñ Ü—ém_i¯ìI宑– ˜ +÷8#eDÌÊì´• H¥9ËŸ’VÛ•I¶Îg.QáÚ0Ô†FÙ¨7Õ†hàr„¿àóÐ×áúB¸±ÀÆJBºåÏÎò‹\|rHaÿ×#²ožÔÚ¨¨'XUè‰ÃŠã#F¹žvz ±ÒR0·€0™!•c@fÕ;¼voê›c†»ÆôGå›'/æ7„Ô‚NË ´;Ptz£‘\­3¿9³º·qþÆå;OÜóä O¼òÆ›?þù‡Ÿüá/ÿç§_üýû?ûpÿæé‰uLÈõoQ׸lÎ`8ÑHd©R7Ûœ/wç'—·×Î^¾úÀçïâô½,Üܺz{ÿ¾'.Þ|ì¥×Þ~î·»+»Ó«ç"å)Ì7:ýn)O†Jˆ'Lùcñr»>½8¹´±²wþÌû®=üÄíg_Þ¹çÑõ+œ¿ÿéG_üîË?xçwÞõGïÞyö»Õ³„?¡Ãy…ÙivpÞPÑŸ¨8}’?™+vçÛ+§k‹›Ù‰™ÊÜJ}i§·sñ¾ÇžûÅû}ôÛ?|ç?=uõN±»*$êJ¥4² oÆb¢+-˜­÷D +Ý•T{!Tžòí`ejfûêîÝ_¾óäóßýáÁ'ÏÞû­swžv‡‹ +§¶zäz „Ó›wCf÷eÍ.‘•ÄL5V¬§›³õÙSK{7n=úü}?ûÖ;¿zïãß¿òßo]¾]íž$à¢ÊÊÊL$ÂD0.©¶ydFÊD…d7Þ\õgÛB¶±²ý{徧¿}þ¾‡/?ð̹›ìÝýà•‡žyåíwyî•‹·\>Ý›TZ(…Ée#¤Tæb._AL¶X)ç×Óõù™Í µÉ™•Ý‹nœ¹zß ¯}ÿw_þý÷úûúÛŸ~~ÿ“߉ä&ŽÉl'ä#å¢SÁìò˜ŽQÙµVŠà’ÔÚý:”·’B…¤dmnýÜö¥û–ÏÝùÝ~õá'~üÛÿüÇ~úù—¯}ÿ'?óòôæÅhcMIzDðI%Ö“ÂÉB¥½°±¿uöêÞå›·yêÕ·~òê~ñôk?xäùWÞxûç¿üèóßøñÛÿþ‹¿ÿÇ?_úÁ/ï<óúÒþ=c‘b/7±©LÓÁt8]ìÌÌž>wîÖíûæ¹g^zõ­w~þáoÿøÃ÷>zåßùö»}ùç¿ÿßÿÏÿû'(òÏ¿üÑ/sõág³Ý5.VÁ´à¬OJ¤‹ÉÅUxÍ­ïì_½ç¡§_xþµ7ÿÎw~ñ»Ï½þýŸ¾÷áo>úä‹/¾øßÿ×øÛ/yö•í‹÷…r..g'“|¤*-ë¢ÁÆx„x®<1¿~úÂÝ·o>òôÍo=÷cϽôÖOòÞÇ?ûõGþÛßþü÷ÿúõ§_|úû?~çwz›×q>Ï›>ëI´=Ñj®Þ›˜ßXÚ9wõ¾ï{üß}á»/¼þöOßÿä½O~ÿË~÷›Ï>ÿÓ_þú_ÿë¿¡[ò«Ïž{åÇR~zÔàTÙA9Ç n5Â[¨()æÃÙæÌê©Ë÷?rå¡Ç¾õ×~ú›OÞýø·oüäÝ—ø·¿ýüãßÿá—|üÇ?ýåþç>ýÝçϼòæö…›L¡ürƒmLg×",Ä’DqªÖ]YÞºppóá›?õÒ›?úùo>ùÑ/Þý_üöùÛþ×Ç¿ûü£O?ýÿüÏ_|ø鵞ÈuVÂå%2XSô÷g³ÉQŒ”p:È ‰òL¾9WhõæwÎ]¹ó追ôú»|òÉç_~÷ßþ«~û_ÿû¿¿üÛ?ž}íû7~âܵ;l¨Šq;ÎWëÓ3ó[;ûç/]ºzãú‡xó­7ÿð‡?|ù—¿|ôégïýú½_}éÜå+“ +Ál‹7 Ž€ÆÊ¢.w{9¯˜Î–V·/ß}çÆGo=øØ“ÿöâO~ùþñþ«oýè‡?þÙ—ù8œ^ýÞ‹¯½¹{åþÖÂ^º¹èö¥„H9Rh3Õ@¢Ðš\ê-®.®,_¹té{ß{ë{?øáü·Ÿ~öÅ_ÿËñîŸ~öÛßýýÿñÙ_¼ù“Ÿ^½s§µ°ÉÇ«N!ExcnO ™«¶¦—ÖwVO]Ý’+6Ó…j,™©N@ŒšoLMÌ-Í\=wë΋WÏïž;Ë&(/cÅZ+¡G¨15:¦FdZÔŠÒ‚/’ˆç‹¥F¥Ñœ_Y›[]éLw¶v׮߼pÏ}×÷/_Ù¿vkýÜ¥Òä +ž´'Öqúój“Skvšì¤Õîrº=«›gVN…bñ|:±¼4»·¿{ýž»ïäöøƒ÷>øíû}üÉg?õâóÛç÷+““L BÒVˆ®(£ÇX‚ ¬lœßÜ¿‘ªM&Šµf³5Û›:ujãé§}ûÇoøñ§Ÿýþwoÿäíï¾þêË/½øÔÞ¾÷ÚòêF®6Å‚£™]f§_r'ÕkQ-¦28H’EÃKó ÷^¿öêË/¿ú曯¾úÂ/ùΟÿüÇç¾ýoÎZ]ž+TkÑ|Ùˆ¹Ç´6›Û/ƒƒ×;x«“G Ê'Å2…úÌ̹3§|ø§Ÿyò{o¼úëÞÿü‹Ïÿò×?¿÷«?ùä£û{©BÖ€¸ v/Àð˜–84 <1j:9n1£œ fýb²Ñ™êÎέ>sæÂÁÅËW¯^»þŸûáÛ?zùÕW^xþ¹gžþÖ+/ç¾›76×7É¢ÅåUXj endstream endobj 80 0 obj <>stream +eÂ}( +¦;¬˜2#n¿›_Ú¼týöSϼðð£ßºtåÆ£>ñ“Ÿþâ?úÁ}7/=~ÿ==øÀîÙ½ùÅ…RµL7³Ûl¸þÕåÐðeµ…’kPƒÙŽå×._¹úW_VzìÉ'|øÁçŸ{÷ô³ß¾|ùîÞür"W²»8ˆ3J+;®ÁÇUf ×[f;I‹é@ªž¯Ï4¦W¬«F0Ý¥´ºä&ÖÑìdzüÐññQ¹Å`cͯÎJY1±s6;p,ë ¥=b\gB4f«Ö‚¢.!9‡’£Ü •Ðã¾a=zdL5®±™PFk" åâÀÞvŠ§XÞj³Š„â™T­ÝYÜÞ›XXöE¢F9ªE5ÖQ=¦°0 +=ª#Æ ÁE™`¥&܃Q‚×ôð>¯àEÃR,Í•ÊÝYN”ÁP©RM§R,å1Z]:”5áJGØXËÊľ6 ’IZÈ»Ø$LJséB"–ü‚èzs‹år6™ —ëU1šƒAÚ逊Pߨ +VX†dÆ“cº1ãˆÖ¥Aà=c$ŸId»ÁH.M\¾¶¾±™JDª¥R&›k5êíz)ÏiÍö#'Ç  +lGTG5ð—qmÿN|„PÞ/&¤H*Ë´Og´:I^ å<Þh4Q¨Ô¦jõI7EI¡Ë­vF¦#Ž)íý­¬¼Ó—'ý9„gqë,.ôEÊÐÔNO2U[k,\.Oí¹¹°Î ç9>ŠÑ¬Ï„r=UDùT{ ¶‡UŽÿãC+o&$¥É «ŒáŸ/ ÅÁp(š¥(ÝfÇnš‹3Bš äùpUÑ¿yå¢ Â_úÆQå]²cP­Åm%#.ÍugwnÉÄ[”‰c\@Âä š]!•Í3¤D v^x *î:©<6n”Û ˆu‡™@ÙÉgTÔâõ÷$ÑaÃZDã´˜¤F;7bÂI¥yÜèPX)šì¬ÊLÈ „™Ž"¾4!æÝBZeÆÔf Ê`§¬náKjü¨Ñir…O(l_ÕëjQoÿ†Âg!Åq£sL«­ôˆ‘ìãz»Ùás{3“*j÷$ Oy#xxX~|P«±x2bÄ66CG§,Tr@ª,”ÚBỄ£:¹Â4&ÓõŸ‰³B§üŒ¶á~…‰ÖâC 0#–ccðA´ —ÔfzDa“é]£zjÔÀ(Qÿ¸Ù£Ã‹+ζæVÏŠáÌȘ +‡LÖém7 +ï0¤YLŽàÀ˜ùÿ<4||ÔhvøA»Æ´N¥Õ£BxT¾'ÚÔÙ½'e&*P äæhˆçþœÕÎiL.¨4WÂx@oe Òf®„B®ô—ŒîÜæQ¢ü°“uK *:)äW¥âJrbŸŠL * JFRMýÆÑñÁþŽZ¬–&Ϧš§Íîø‘Aýà¨!’ì0ÿ]CúA6®H¡ÈÌ +ñI¹Ô˜ÚDª «EcÿR·þ&“t¸}lÄ|tLwl\s\¦鵨ÏLFí\Ê›ž´º£b¬ÌNa| +eSzGÀ@„,t¢¿e(.)ï×ß5¨ê—·:“À<)‹+ËÍEËkGFÇFu2#ae®`“«(—Ò"NÒåY›8>nn:9f²áâˆÌvø¸òðáè8:¨Ä5V/êêq@n…×=2¨ƒbP¡^™•3º"t¤ËÄ{J+ª˜é˜ÂÌŽ+Çõ'ÆÌf»?YXB\ÒÀøª„py¹M™9™‰5Ó)w¨CêjT0~)ñæ)ozÞäŽCÙŒ›Øãc&Ò“,¶wõ¨p× •É±Q œM2B~2(G¾yT!W!ÍÉSfgh@å°¸£:"h¥“n©)æVp¾4¬pŒÀ¤¡üÉqó‰½ÖBÛȨ£¹iÍlc\þðIƒr.låÂÇæaë«]@ Î`•‹O¤ÚÛþÜ4ÂF1_å2d¨áµ,ž¬“d6ÿq¹}@Ž@‹õïñ¶X‰°ÉÖa"ÁgbåȘy@nQ#¬‘ »"-3—1Ój”£ÅÎÂÌ_€†²y ¸`Àû[L@UËŒn™˜_Û¯Îl),.-Â@y£LÆF§Þá¯Ã:¨°G*@áÒ©P½Ÿ§þŠ'Ù#C]³3"¥ºt¨|\aî[°™4à~Àùœ•JhP‚û…Y+Òà2+¬¯ (Qaõ±±Ž +åîÒjl¬Å)Œk1¹ÞM}]K€ê"T²¿¶™…y6à!"•™Gô.;A…ZÜ Ê¥Ç¾ÚfDŠðM®ŠŽêú7Ý8<9„ŒýðØ¡ãr8RRj;ø’ñëè!9i£#0GcFrÜÂŒÝ*ÄkpÆôDTïV¦ÏÄk :Âo£ã(¶¹¢ˆ;fsÇU6ü«ã#::Ñ5¢s÷7ØÁ#¾ìJ}ùþHmGaóÉÍÆ%A FôŒÁÅ}%Jªx¤¢Û—wz fgPf ´vqX…­:>l³…?å¨1(Â?”™=—Ñcz§ÜHAY~ã¸êĨU‹ +:»ð/w ŸÑ™ìÐΠÚ}RCŸP¹¾9b¾kÔîÖ[>¨,^8¢¶I«·ìŒÍp…5±²N%'1o¶\_^>÷€– ›ÜÃ&ZíœqÌ[#£s#4AcåNÈÀP8„N tÂÒß㥿å5îË™\>+6{z*jóåp©h¢£6.ãŠtøìî/]A(] áGé¨[ȹĜÁ%ª>•³¸‚ýý[´‡Fô _`ÖàÎNoÖFöO_ƒ§€Diìƒ*DŽúµ®„•+;|e§PtŠe!ò‘2Pú Ò¦¶qFgÈìŽAuqÁòÌÊÊÄŽ›V°R É9Ô“7Qñ1=:…¥íëB²udX;¬°jÌ´Þîsxó>¯¶°0H§X4¹ƒGÆ ÇåÖa-¼j"cî`M‡‹ˆ'Q_8O+ýMiŽ©Á= „dq†i©âO(ŒÌИقù&v×°ñ«—ùаY‡…˜`Ãm9ø”SÈ)lž(Œ.¹…1“q‡·©n–.! t“m®F+ë:»HMÀœ«q••ðÊÍG‡õ@,BfΛ™Ó¹¢#FϨ͇Š•`}';½ …q“ÇÆæ`Î&!38&רª¿÷ ´ÕáaËÑ݈Æ!3zÀ@Áu/7CJ|HãékÍ_rñ©=*;Ñžô7¬®äW÷w‹‡†M°2=q× ùˆU÷¿Xô*ŸÝ_D“m2\:… :*jô¤èÔ´Õ—7RQ2PžZ¾²téq­;hp\R…‹MycSþTÏîQ9PW¨ÚÞ!¼ùožÔ©:´%jg¢Õ !VYíÉDZZ\t|u‰5¨è¨¸6$hXÛ¿^aõ¢ž,mÛ©˜ƒŽQŒõô7rIPWãz7H±ÙÑb‚Ѷ²I”Ϩ1aDïÖ`'À:BÅP&A†ëñ©s:&y\…*­œñê>ø…•Y=6*Ž1°éòµí¡Qó šPÛ|6:Gø*n©Ž ÐE+ Ƕqi£3¨²ñFB²ëŠ%¹‘ÄÉàÞÁƒŸøúqå‰q‹ÚƃLš2‹ÌàÆØtÅ%Á`|é)i4`)QoÎ$ªqéĸmDEh‘€ÅÇùŠÓ×PZÅ!ÛŒKPÞ(“V #jì؈©Ó™Õg%3LtBÌÌ©íUú{±Ú„aÑ¿7q¡Ä'º0 §'F +‘!µiX‹Žê:zÌx’2K!½,nÚ½%R,G+k‡tR‰›\ ÌßpG{¾üV¼s‘MÏ©qQñl¨¢µ73C§Ñ"„‚S*Ûd¢°qð›jLÔãŒËj¬‚\ÏŒé] Ãb¢ãôf ¶‡5„Õk$pøË.©­®‰Å%½S’›Ýj`!Às]Ì’Xß±%»¿xyRiÑØÕ(O†ê˜PâÓBªg ‚‡†õÇÆÍ#:ç ™mLOa|ÁÎçQ®`$ˆ¯ˆKu»¿¬wàw@Œî˜3Pq‹E.T©´Wõ70nÔXHL•M>!·Ñã\ÚÁÄG5öa¥q@x¹dÇʧ©há ˆ'Äê6:ÑßÉ +• DL‡I{Pnö<&'XFQJOƒïëP~ †7nE ûæH‰ÐˆÚA +y……ý—C#G‡ôr=e#ï”Ü€¼Ñ-¦ɇÕ6•Õõ”Ñ;Õ<‰™Xë k³©.¬:#MW¬ÍezD¨ tQ)/^¹ñLaöÌÑ1£ÒBéú× ò°ŽT¨AÃ:B¡ÇÍ®°ÌÌöŸÐa¥OÜ“êŠÅE!?o¡$€÷D{ÝæMÛ… ¬ÐñN°¸”nmWzû3;÷ÙØ°ÚN±¡ªœqôwl€Î\A6Þás³cVÏq9Ê'zÉîùÔÔ9.;oõd5®¨Þ\¨0OHe‹'iã’˜ðµâŽÔì¾,«ñéf²¹ÄgºFœO7V‹‹W£û¨¿†‰uL¬š=ÅÆÚ™ëO2ÝA Ž 5#Y0»óþÔ¢TÜñ¥aØQ ·T–éà8#:àÜéÊìÁÊùÇ#õ-ÞÄÂ~eêôsp‰`e1ÜÞ‰tv sW›ë+§A¸¬¤„û³ +ÀÌc¢bf&3fæ¢GõN€½ãÀ3ˆO…ø•ý-:Ãz2a—|yƒÎ.騤÷¹¥‚CÈÛئBΪI¥%*\×ÛyЕ‰8iã`ò5Ôï€K2C VZFÂä’Àå™ø$—êÙø‚Õ“s…:ÑÆn °IöȈIOD žÁpoÁèTŽ lÖé/‚b@-)û»~yÀÝÌTÂÂnŽêœÿrhxXn=9nl;®%äfÖîÉ tÒÎf­®È¸<šÕ`Àº¶þÈ baÁ_X¨Lž9{÷³L¤Žp©`uƒÏÌ;ƒl{·ÐÝ“*k#VÏ€Âf£b¨ ¡N>Ð/'•ÃíK =“;Ç NDFêl¢ë+.’± J,T:›»·ž—#\Èù K‘Úz ¸®o„jëžÔŒ󹄬'Z‚Чq;¼E_f¡¾v+5µßßW‡›ÉÒî6’LGHŽ@Ý_Úl,ßâãmO¼(ÎÈÀ •Õà™X³¶|q÷žgW/=ž9k²R´ØÛ¼æ +Wk  >_®çÏÍabSÌ/&7]bFaå¥òïYéŒÓ_…\ ïïVÇDK ‰úÚ°¿kP7nb€\ÁŠÝ—ë?"ÙÔ)ø\Ʋ±zvæLiñ|jr;ÒÜà2³¨EéУÏý`óàŽŽðžT¡lb6ÔÞ—»®`{XëVÌקÖîþÆI£Ê&àÁ–PۊϤ殰…e¢…ŸykzíÒ •gâÝh{oêôé‰ór wìœ A •ÛNj‰1 zû—KA:ƒ˜ 4V§h¥"Z©X'ÔÜIL«nÜnl?õshÈœkmÓ¡Ö˜êoq ñÄêµó¥ôÔ¤uˆÀJ3 ¼Š{„7Àcã6Qçêß:j–F…ÃÀ?2›uˆ× +±‚J°à˜¼Òc†,¬±›p~Hã³°°è·„òi>5©-Ãß!†;bu“Ë.¤Úg@ÓúÛájpÆ;})—[Y™™Õ³ÃRHÀ?Àü ˜›dÃ% æQ¡Ì¸•±°Épe5?{1¿xÅÎÄò­µhmYëm\ŠÏöèÄ$ê+…Ê«Éö.›˜JÁøœ?;ÇÇ»ààt¢ƒø+<Œ(±‘C£F@zìœ[òVØÔŒ™Œ`|*XžÇ¥‚ób‰ +×’õ¥ùÝ[kª/]´ñ‰luîìõ'üé  ¬`ycnï±½û_ϯÞ&"Sz22¨%P*!åFú× :‡)³x þS‘ŽÜ³ŒéÝ<t§Á%#BuP°@4¤šªÏÏŸºA+&2¨uxLž¤Ñ“†Ò +—f÷ôg&‡ „ÆáOLœuëcýI-Ê“lslÑ€KŸµñ›7ïŽNºã]¡8›ïݸû™ÌÔ™#r l…ŽuÁ¦™IB†:!ÇGú½œÃ¹ä¿žPŽ)g¸ËeVÝá.žÖBŽs[©°åt¸rëÆæõ§&¶oæ.ÑÉž Wô·‚9}÷‹Ü< ¦Ñá–Cɉ¹y"Ü5¨WYÈp¶ëäGO*ÿõ®á…Ãê«°ù5oaMȯ˜ -*’bMŠGÔãè‰qû 9&7±ÀWr]™ŸXö3Q£ýÇC˜74‚GÚ +Ô‹ 9"T5± $‚-{ ‰z‹fBÂÈÍPB~!ÂPº¯þvUý Çh€ÞDaAÌLÜ5¬>®°Ê­¼C(Eꛉà3Ûç¬Íï+0NÈöê+7K ×£ÍÝbï ?{‰5N¨0:T·{’:;×gigØÌœV°¼îð瀫ì&g°p×âÉçŒTûwGÚø4¶'ÖFÙ8ÎÅR­ÕÌÔnjòt¨ºÐX¸Pš9KJ6ÚH´¶“­ÍÌÄ–;>¡$"#fhÆn³óJì¸ Á¼22á¶\Á–ÃW9©ÂfÆêŽ@Iƒãñé^¶wàôgg×/\ô%w 4f¤ ¸è”ZÑúvïôõkϦgÎCéŽ[H>Ù¢âê3ÑGdö![Á‰´IÑ?9Ö:üj»ñ9ü5_naúô½ç|uõú \ayÈÈÚùŒÞVÙý£&Ê@„-Îá+ã¾2TÑ¡¼-“èÙØü¸Ù!¨ÿ¨#WЬ\@S|qj;×YÒ“lª‡øë®AF'ÒÓ—u®Äˆž¡cý3Š£ÿÿî +6߀Š8:fÕÚ}‘â‚ÆÆ~óÈð×Èaø‚;6e÷Wµxð˜Ü)G&25 CSŒëi¹‰“›9ˆQ"$ïß° ”g0”ž0:`FpÞÂ*•œw†'¼ÅU„Ï(Í}\v5³iè¨Iø‰Ì@Ê ”ÊìØ¢4±J# \úÍ!ý¡!$V6Xëï¸>b8©D‡!^AÄ›u+d¨äURõ5ã˜'^ž=W^<ˆµ7ÈHÅÊ„õî ÆÑߌ‹fܯÐ;!¹»‚SbñT¬¹_œ½[ßßüä%Æ„ë`š£F·ÜÊh‰ˆ3Ø¢¢¨¯Q"Û^K×W,N¿Éî fš«×g÷^8÷àî=ߎ·vœ¾âéÝ{î}ÒZܯuG¡âË.¥;ûÕ¹«FWò›Ã¦# !î8› Ã+CÐÝ#*`²„n¨1w¨N…Ê*±‘àÓ¡âlaé’•Ë*­Þhi-Õ<+eª½ýZÿàܸ‰büÙ ÷¿@FÛÇåÀúypÂæÉCßê›p?´€Ä¨Á èèM÷üùùÜÔé¥ó¶V¯!B‰ 5VÏÜcvJJO…šþLVÌ-a¾ú€ +Ñ:2¨Fø>ÌYUˆ –â;À6ˆ'epø„DcÜè5¸ ´¦÷kï<˜_¼;>¹oödï2›°àâÞ#Oüð˜iPçV ° +1 È`i+XÞ9:f9rR)Óa–þùÓ°1ÒPáf6OEg€NáGU6Ê*ûÛM舅Í8•Úâ¥ÅKO(áˆØ¸Î.@¡:%w¸îŽv˜ô<]61I³3ÍÏ"LX‹zA¸ŒS(õA:P›Ùãc†»N*k ivèúþÓ´Úâµ:ür=îàÓîPÕ›òå{‘æŸ@ù¬)Z2“^ ñVÄù$ü%Uù褕&uKÜ? +V‚p›´QIè=€1i„IœY¡Ù!†€x‚i\r3ñù@¶GËF‡×‚{™P– C§t’SÛ…ÙýHy1’›í.„ŠÓf:ÌÅ;RelNÏŠ¥5wtFç€Ðt —Öã µÎ>< J& Ü!LÖÔϾC£ê¯Ÿ”«m,ny“sáÊvmíw°Bùs“«W™ä$(À¸‘TusB%ùh;Z[=®ÂOÊ1ÜSpx #z×]£†C£†1#‰ñ&ÒÖã¢ÆFñÑŠ• ËM”HÏÎ+q¤8Ó:aGie`Ó­-„IªÌì¨Æ ñÿȈaTã°‘Áq=Ñ¿‚:b¢Bª’‘&ê+ØýÅt{ =§#éÆJ¢µ?10)æW <.”<ñ_~uÔAØá–j\bŽl,bmÌè½kØ2ª!²•ùZw½¿MœQ ^‡XJ+‘æiPõ#£T¦›P ÇñT¨ÊÅ[„/ùB¦éŸ]QÙ|>ƒù²6&æ‰wü¥5_a5Õ½ W©hS‰y }§›ÛÀ± uýMÍ>™ŠcHe‡Š¶ÿÆWÏeèoVÏÚ\q#&Ùð  ½]†€—š:=á‰ùƒ§R³®Ä|+$;Ó›ÍÞ9—X’[i™™ú*KFLð†ÊFŒ—0JHº½),& G">nòWb`Lczçˆ;6jèoµm ý3´UßÿúLãðbžXª¹Xém¶V.t¶îîn\뺧¬î±âÏ.¤»{¹™³Ý{„ìô~¶±4±riTçÖX9=ê…Y×âZc§#ÐMÑrÏÁ'¡ÒTÐnV({‹K‰ÞA{í^_¢39æµ·ÃE;ÃzÂU˜ø\¸¼²qéÉ•ƒ§ˆ`ûðˆÕä|z¬á+‰€æò¹Ä6îºýE€óa5>5jpA˜ÒQƒZFnäéPÃáKÑ£PJJBnrë]Pðn¡:ª¸¿Ä%:¡ò"—ôæzÁú&“™# Ùc¶ûøP>Û^b#ÕDâÞå@iV*/pù4Ð0’q^*N/žo-ÞmpÔ¨Ü춒1ÜWDؤÓ׿ÖÚÉ'ÃÙI3áïŸTGÄS²óàž™Q# 8ª#F4èqpÞAÖß ßî·²1‡?ë ’Õ…Ÿ~ãÙïýª4{Æ!d¼™)>3“™8«®”Z[ÍéÓ”˜¦Å,(¹ü%2Ø°R™1={tÄzx¨ÿ ”–LïT8Ž jåÖ%äú¬åÛÛùóCB‰zuΚàR)PX’Š«d°ÁªÐZ•æU6Nn"M ÞD^ÌCéN4;ybÄxrÜjN b:»oHéס<Æ$ØpMef ˜ßIÁ—ã“]wÿšº,æ-:ØD¾¹ZšØ‚nÆ62dÂE¥‘Ô#@_=Êyc5ÄÕPÎ䔾œ+\§bmx“ÃL”7÷n®Û½•`q'TÚfCM11ÁÇÚf:y\fwq©hv +÷ð°nLÏèqÂ?Q_¸¯ºt!VOÈíŸb9¥Ñõ¯Çå_1 hH¹Åo%Ó\|ÂH†´„On¡îPÁ넆p)_aB.V¼ùe.=‡pY±gt]Apîh5¸Û=3¹yßêÅ'·¯=?sê”K`ž„•Žë°ôÑI•ýè°þä¸Ya¢‡4„•Žé\ÃZ—ÊD‚+péÖòòÙÛŹÓ*‚ÇÁ KÑúi!¿Ø¿Î6Ú„OïohÀÄM0B»×–çɣƫ[éÖi§ÔÖ’F»€²Œ/ZiPZaØÄÃkÔÈ^Â4‚xÊ®A•Me¥¸h­µt¾»v9Z[l-ìõN]w‡ò(åm:Ro/]ÈNœ2¸B”!ýñ‰…³Rº iH‡zUˆ_ƒ Ž0J'ôˆWkaOỄýíøL0]㦓r‹Ã“ò‚¤§§…Tç“ËWÒÍ )aÁr¤}&5uŠÕšóçãåEÈì6*îKM ‰)§÷+AÐ'ÆM_;,Sè\P2vhPqbÜÖ?oz3Gõ.¹êŸÒ»ŽÉLZL@èpB¤´ÄËPK'å¨Í¢„ì¨Ú~|Ø 6Ój àaÁ'å¶!¹e\¿ Žé0ð‘ã +pÂé‰LÐÉÇP&ÆÇZ§®<1³y°ÍìŠÞ"xº”_B©¨ cQ·Üè׳¸#<¸'ï`sžÈ„ÙUc„'ä æpþ娂؜ÂÈ Èlƒ +dHƒÉûRÉ5 «Q-âDÍeãRF:j"#(ŸƒÖ VV¨`¶·}­¾x1^]ÉOlW/æ{û¾ÜœK³]w '7¹ v~ÜàïQÚ,ÑÁ&i© <–¬­kàHefµ…B˜x 4?}êÞ¥ƒoe'vv/=¼{ã&Ñ1Q1+²P \(s‰^´y.3{IMclCJ–{B¬1®FÝ|B‰xP>MklrÊ›_LuÏ%›‰•×~ð^oû:dFHCb¾Ç§§ ¥RÑ)‹'©´±êÌ]Ðâcê“cj™ë?ÝÆ Aûsß7:ƒŸ£ã­Ds9×ÝŠ•fö¯Ü9uí:ZµqinYÈ,$§›«÷•f/¦ö©pSŒµæ·®âþ˜%µ„¤ïï'–!ƒ-Bl¨Pÿ¨‘2CÇÄA£gÈè9,CÔÈY|r–O\zaýj¾³æ äØD;—x{¯<­·sgíúóñövª¾´´w‹MNÓá(£lÒÔ{¡Ó€CÐkCTióh1Ñ%4)i¾Á!Áœ[½&=¤Âš2õx LYnˆK_Ax õ&lLæJK„R­>P꞊z±â¤™’|” •ýg pJ« 3²j‹!B©â|®±~xP¯¶z»GÖç“0â+Ú¼y“;ZìlVºÛ “²Øp‘–œ¾þ3¼È`ÉÊ$¬ÎP<×M{£dD…¨-¬Á(ÕfDŽ©Q>˜ÄkŠÿ£÷þ’äºò;ÿ‰ÕHäÝ6ÕåÓûÌÈ°63L†ÉHッ¬ÊòÞtu™îªö¦Ú¡Ñ ×° CCP3ä€$ègDr4’f$j¤•´ç¬vÏþº/qNœêDšˆ÷~ï÷“ñÞ}v ¡ÔBocnïdvÿ)—Yð 6<:µtüé­';cV¸;? „ +!5P±jlê’b®0sÀÇêã„ÓÈ$4iÅì^Î …X!é „­>aR&¡¿ÑuÑ9f#`r0Hòt)Þ::ywÜI¸(ÍϧñHËöåòŠVìwg·¾õy®³ p8ÝÚÉN +ÙY6>í« A +ráö“ÏQ¥ô¯Ï º0 qÈÙ@ØQF/UfÖÔ"/Ÿ˜ƒ¥L0Ù Ó™ÞF´±èá¢BfJ¯oJ-h4ÞóóYZ«âb‰v’µeBŽ‹é*ÀƒO² ’ —GÝÜ°‚Ø !×­xÄIŇÌK£îQkÆ42Ò‚‚Y,˜ê¯Ü(t6(­ÊÌÄZ»¹þQ{íÞòÁÓÒâU>;]Ÿ½üÖ¿!£-3¦Àb“ŠÀX2Ñéowåîº/ÕØì™òm[`ã·A'œA•FBÅ fì¢õÄØàîó`›ì*0Ø©î>©–‰P¢ÒÙÒòsÉ|{£4½ƒI9t‘1`sÌÎ’5ûÂV¯dqÐ.X w~ÂÔž”2ÃVä¼'´VvöšZÛ¤£-+± 2È>^uTÆès(ÞtqÇ4aÇŒLÚñ ž±úB£& @ôíÊ5&Å,ÎòÉVuåfwó¤·ù`vçÑÜîÃrkÁ‡Kv¿QQ‡Ÿ7{{6yÈ„hT@éM|‘V7ÃvOÈË“Ìå€|™ìØÅI/D§ùø, !žôŸ¾è6:˜ ;ë!“”ÚÄ„<©:1 +>_ÌÏT®öwOú»‹+7í” +$·<Œ(7—òri€¸ ÂrP(÷6 ~î»gÆ&̨Õ'œÜ„#`p,àÓ3ÕþÎ o(f@%>¿@Åšbn&9³nnûÃEBHmìôÖoXü‚Uü\ŽOö«ý+íÅëRº^.tŸ½ø,ݹü§ Í~ƒ³ š˜J7w™è”âg6î²±æK£Î ÔŒªö@`"1ÓK”g§—ë‹W̘€ÉÙPªÅŪ¸’‹×—÷¯Ýzß'æ•â¢VÛðsVTq‚ꃪ&D‘¦æ´Â‚âN¹ põη­FM¾ð9#qn°9wjÜ6æÄ\„Â&zBq5RßÖë;6LÓ’“çŸ-_} +4­WøÜ4—é1±6Ðm"š})³í}8˜¿ð­o78(€ §†].<u¥³yåîÛþÁcR@k`jÃHjS-¯w¶ŸpñF£¿»wûE¶³mðð&q°:Ø£ +øÈÁý>‹‡…Ïà¡ÇÁÙ©³“Ș+hÆ"l¼¯n†“ÍÊÔVwûþâñ ǯÏ\~ÄÄÛ¿“±êjvê²—ŠrÁM'A-váꨕ³“vzÒJ8}ÁX¶ÏÊå8?ê2»h£7ÙI“Gsp~6=½qTÿÿã”ñü$|r@mrñžüåyǤ›²¢¼ã½l„ˆ”€u¯­ßK÷¯¡zUÊ|¶mZ"¿÷í\ ùp~$¾T‡ìƒþ½mq³£fôåÁöUö‹f؆ŠV<<ázè€V$ce§Jù™òòÍH}#Z]Mw.%뤒þÙ>XÀ’Cùœ›Œ;1ø!]Håë‹;ǯ2‘ÚËÌnBàRT3¬X1ÝEérvÚLœw‚LŸô v\È¢h<ך]Û/ôÖl¯UWëf÷žÏl?ªÌú{¡t7«?ûÞ__yöù„_ràZ²µÛ\9‰U÷bÕËL´kôó€FÃñ.dFìÔ©1äô82lãŒæa²áÌÌ¥›ÏOÞuâÒˆ“š„Åär²±žníÅÚWœÁ¬—åÒ<Ðj¥–ÛSq3,Zp¶we°Ÿ=`ÇU“vºA…%@º‡Ô\׊„ î .—ôúFvê`jãNmáxpãRˆ^õ_}“m,Ø8X@BT(;p}Ò† ¥½¤vÁìŸð0˜XcK%}ЖçI¤¸0³°÷Ö_v–¯6×ow.?M/ÜJÍ^on>žÞº×ߺ­­ÆËó_~ý‡;Ï>q""-ÈpÍâ` +Ôñ.Ý85ì%¤‚ÑÇžqœ²|çÔÄ™!'I+D:„\‰æI¹èrx¤‰*u<Ò¦3“^ gåü Ȉ€VŠÔ×róÇõõ»µ“âÊ=¥¹KÆ»r²·±ÿtîÒCHÈø…Bd0«d ×çÐðÔ`{wúʘ{|p§¿`ô9fX²“ƒÎ3raV*LÇks3—îÏ재¿ÖZ»©76ürÅAFáoƒµ#¤s0ß ËéöåÂÌQ8·ñÙqmuÇÏر À›\ 7˜øB8·B(åa'5æ$=T@ͨ HEjJ¾«Ìƒÿ2z¢ÕXm9ÓÝIµ6¤ì¬Z^RK‹¤Z Ǫ˻·Û+6Lø©, ZÙèMXª v5ÃN(¸º{/Z˜s0 „YÝŽ'Á¶–›¾|óyij`Ä¥Ø̬X^Í÷·o½ôìGõõÇn&«Ì­îÝG‚qc‘âj®»¼ø0Ö eŠ³‡‹Ço&º»Jq ç¸Ñ:À™åÃWO^|Õ\<öP &2s9£‡39ñÁ ‡1ï+Þ “x065bÃþÕ©±WFÝÃFdÒFYýŠ?T´ƒÃŒ\ŸH0ÞÝíí?_ºñA~ᦇŠ&½Í“í[ïÕg÷/Ý~»¶r-\ž-,ÇûG|y=”ší­ÜÙ¾þ¢ºp¨KLGëji%ëÛ‰!#üòą̊ËC¨.“Q€ävP<æç¢|º—›¾RY¼\ˆ\LzÛÀÂzU*Ì×Wî¬]{1³÷šTZ¤cU%"œÖZ<"•Œƒ‘pâó`(`."±ü4­Yý‚É4º›³X`ÅËbª«,‚:rjÈæ DàJ‰T +±ÚR}å†\^vêüâþݧrjÎP³Ý+©Î½¼ÁÅúc.zÈ »`qïèi¶¾vn°É¬à¦S”Þ‘‹«Éîa´q ¦õ+7_Û9~Þâ—‰T–ïnÝùÞÒùâšQܘøö÷~Ô_;ss¯Œù&Ü!::#dWüÁÂÙ ŸÕÌ·7õÚúj¦@ÃÂ%>=LNã|rïö×ÄÇZ6DÂ?Å÷ôòJoãö¥»úG0_‚Ø4)×'ÝÌéû¿93~ê‚ ¸AðQ>Têð_ž·X<Œ’ì[©¡ ÔM;¦¶u 0“v¡a˜‹“z=ÖØL¶÷ ¡LËù\w7ß?¨,®ïŸÜxí™î—µ÷臽˯ƒzqûù«÷©H#ž››¿ô8”l¸(#$BeuÀ¹v ó²^)çJÜ$Ð\.jõõXw·¾r«¼tÄīݵãüÜ¡R_—ëlzUkƒYÍÑ:¨\l¦g +È®PÒÆfÁˆÕ_ž€5'›AÔŸ›÷Ó°R‚Õº—/¡R +å!.m‚€ÙfýtÔKk.:¬•Wš›òsד]µô­$&êÓ»÷CÙi1ׯo>T;x' U±N-_u`¡qg@),3ÑÌ°‘ºQ .ÚGi!½œÒ_ž·Ÿóš|A”OF+kt¤i†¤ )Dë”·ûnüÞÝwöï¼h­ÜÐr}Z-™Üuj°Á?n'|L,^YŽ—Â©î¨ ;uÑ6j#ìHØ6O@ƒæ¡5!%‹=FI›p0J¥¾zszÿÕòÂU)¿àåòƒ¸è½çï7f/y€À~.cEÔq'`OÎìe=x8Y™§leœtr> +8êZ@k"m?_£•^\¹ûåR2^ž»žºª•—¤TÐŽZ “—ʵ.¬97ásN*0—ö4;"¿<䘴¢åæòëüäâ„ïô}ÔpJk‰ÉÙp¼PRufƒSæA{®*™rcÁD})ÓÛÍMï¦;›ra†Õ+©Æjwç^gã8×Ûâ)fgˆHÓË¥x½ZšÚ¦”Ò`*Khàçý$ zÄ [},øåâc6Њ—ŽíÚòÍåëïMí<,ÎîMÍoÿäëßÞ›4¿êGÛ{áâª^ßnoœ¬ßx§±z;ÓÞÚ¾œ˜º6sðÎÌáÛåÕ;¹ææ÷¿úýkßÿÚŒ©cn~Äó†lt2í…óKéÚÊÁÍW§wîdgKKײ³ûre¡8P_<^¹úÚå€j˜j¬íÞûàèé'óOó³GB¶ˆƒ¹¸Ü4@⨃°cªÓ€*âR…Ñ0ŸEÂ#$cBÑŠ„Fìðf¸òíÅ +—ݨ +øªô÷©HIN×ÓÕY­8ÏÄg ¾ìcs~:é€ùóßî" BÂæçÁ[&]ì`ãé£âNDOú(T%ˆø¦µ:pe,°Ñ˸a D8‰ )§ùD³8³×X¾Ak r°¦ãÛw~“›qàe“l¬å@e£`ep‡&ô¸ ·x"Åë•ë¹é=>3ëfScŠ•òb¬é&4ŒÏx1?aÕšŸ‰}œg°ô1ãV/æ¢ëô9Û©ó–æBD* \xþ—^1ìĈùË –Ó£® lÔ˜°bX(î ÈR‘òsáÂ2ÎÊ`‡êK¹Þ¥hs;˜œ +HY1VÓJ}TÐ`N µÎ)ÅåHm °žÁ˦•€T8? ap +€‚½¤npR ÆÎ;ƒrà!UBÎ ¹Ùds³>8½¼·{óIsq/ÓÙš;xÖÙz²rôvçA¢¶ÌEŠ|¬žªÌ­_yÈ&Úbv¶¼p­»q@¤ºJµI½É´¯Þ}kçöV\ &ûT´+æ–föÞèí½­,7¦Ö?ûê{'oSm½ºìvia÷þ»oüð—þÍ¿{õã¯7¯¼úÁþúî›? +óB~žMÍj•­ÚÒ½•k¶·žù…J•À১ >~ÒtÓºƒŠÑ©¹üì->Ó÷PZ¡½LYZkÓSh˜I\®f»{‹WÞD¥$«å¸h‘+™îaaîv0³â$3ÀùÓ±¡5†“.BµÕì »9‹4l#ý\:V]Ç„œ |¡leñvjê2k"uLÎ[‘A;Λ}¤— +£|“rx8GGʨ¥ökýf´<„—m°8iØ@5‘Ê6ˆ—žRKf4l‚CP0I'z‘ê%\iÀÁ4ÎÆp.æ¥tF-\ìƒè©¡BP*°‘¿xfØ ¢ÔChNLpá@£ ˆð`f “Èøç°=7 ]°Hr"ƒs¸x0^ÕWDD”lB²É%¦%c57'çûHP Éyi•‰¶¸ô,`Càs.+ÅzáäÔ(`'åD+ÄM:©scÎÓ­"œp å\˜ Š"f³í­9@¾û­eTŒññJ}ñHÎuõBWÉv>å%UZ©°j•5|LT+Î&+%ïçsNT:R³¼^Ô =>Ù0ø8½²Ìg¦ƒ‰neö0×^WãÅj½wóäy}a›ÕòµÙKÛwÞ<|òÞµg?¸úôÃÇï,=l-nß{º~ô´Ö?ظþvyùnu夻qR›?Ò««ZG«×_û´¶tüÊ$4dAý¡T@kÈÕKéÞU8” „b÷ž~È*E£O°Z(Û×ÛÝ­'³‡/J+÷Ù¸|çþó3Ým7›$" ¯Pò‰µ|ïháê»É©'¡ìß|-Ý\q2«Ç\!;óqùLûXtF­T:[Í•[ PãÍuL)Ù:*‘j¬µá—òF/Ũ9à'1! ®…—¼l‚‰ÖKóמý(?³Ò<ïs8n4Ž0ºX`Qlàë¨ÅC‰pª N'ѹÂ$g}ÁœL]âL©-“WÈÀ'ZR¶‡IE!nú°Ð]p0ë +è£60‡g'üç ð°à6â>5ì¬ã0À§Ç!ªÐ±v0ÓgS]:Ú$µºÁ+²bÜǨcÌ!ÎÍ«• ¹¼Ž«å€˜TR5&Z6CL(ÖŠ·÷ôúN¢uáspv|Ôäçå‚)ø¹1ûÙQûE# XØO§}de’™æº‡‰àB*¯G›kt¢É90&ñæ%ˆ‹L: ˆPRŠ«JysÐó +WAᢠ¿2kC˜K²zMB!AÖOº¨a3ì§4³‡špâN<ìÅE6¤F¢ùh¦IðQ.œÌÖfŠÓ˙֌šoÓz‘M5äR?Ùœ¯-íªö6·î¼¨­Þ#ÉÊy˜Öœçðâ‘Xinóf´ºX5¨·•TŸwHµî «¡ƒÂâÖ¡›Pa¡J/$š—ºÛú—7×n éi2¨ßº÷ìëßý‡þ¥{>!/W6´ö•ÂúÓË8·û ÕXàõÌã·?ž»t2á ^0áTlF©íäfŽW¯}¨æåXýÖ£vï0âbÇ}¼$¦TlÜùpíþÇ¡ÜBººx÷íÅk+&oÐäç '[{3{Ï.?ø¤<“‹Oï\{3RX85âzeÄ5b%x æ²za¡±t#À§÷½÷ùÏÑPÆ'VéÔ<ïséÅ™ý·–o~?ÞØs"Ê•»ïž¼+¦Ú`ÌÏý ³LÞ›ˆaRýì$>d@V6oî_{Õìå¾óÊäwÎLüň—†\&xž;Þ/ßÙÀÄ<©Õ!8×lf„p)Y\ +F +68hCx/câ¹´’ŸÚílÜáÒ='&èùÙPªgBˬÆ]ì°•0¸„V)>nó« „ 6hÜŽ9騋MšKüR.:aðÒŒRó3©™ýé½W›[÷³ó7ÅÂÚ˜“°C £mÀÊâ ýeñ„Ð`F+,@ÁŒSåd’bM°4â`Ì°h†B€Dh!*»Õ˪…yò”E¨¨Åò b8VU3mˆ‘Çl>¥ |‚Š‹³—§·ï4–ŽB±ºœjòɶ{` uJJ£´îFx$ ùIyÂ8o€ÌßÞ°ûCnLp""@0*Mž ŽcÁ´»²ŸÕÁØ-%V-6ÓµE(4¸›Yì_I´6¥L+N„h0åå((ˆnæ¢ød@ÌùÙ˜ —¬>Æê& 6&&»¸Ú˜ððRv^..qÑf¹¿ß\»k®{r"S[ܾ©e§½]Éõ¥ì4krH™—í~ôõŠ\0ÀFOÈM%Cñ)³@+5„2|$Uì»kàbeM(­%zGÉî’ŸÊ11/ÌL/ôÖo߬ L55ø–rãtTS)wëäÝ»O?0z¹S#ž!+3î×<|I.­ËùÅ`8õæ÷¾¼õä½1zzÈ1n§ùW«»¹åû BŒv £U9Qsc £óÉð~ù©íDmÉËè$éÌí&*sF_ÐKD¸äçR0µyߨÁasBš³:]V·ábzë=èàÝñóy˜’ݵù­Ûbf* •„Ì ŸYtR“‡ñb 59p³“ô` +Dè› +E[€Ë°@dŒrt(•+Ï7毚QÉAÈNB¶xƒ6bpÌ”ÉMÛÂC“þa#êDÃà .îg# 0âbÂŽr|¼¯¯‰Ù6ÚÍu.‹©i*æëˉòœÉÍ´Á‚× ¾ˆ‹ÈÄ*8¤I‹›¢!µ4jN’3 (,dd/·úÃÀ 3g’ó1É`¬-èuˆŠCeò²þÁì)àyP?!x0Þƒ‹)Ï`öñC¦oãÇŒž 2iÃÁ!Á>¨XpSqƒ+ å{R®kˆRH9‹㔘æ•L 1ÚQ‚‹jé†Í‹[܈ \ ÓáÁ§Àé€q08(àx-Ð`*p#à‡—¡X¥T‡Ÿ·A€«6I¥ì££>f°""uŒ‹³á´å'­ð…Q‡xu,|æ¢ý܈kÂäƒNòJ¤”È÷A„»±£1o0ç¦ãN\ñ‘!€I›!-wzÔ=XŸÎMVWî–ŽÍnÖvÂŒfœ0lA%ãbŠ×øX fu†2b "D³›ñ“:8_q.\3Cn?ëðnF2A¯Æ("E>U‡Å´—mpˆâsK—×÷ïÑr +¤ªœ™M7÷Åô¢‡P^ÒlGÀIÙ½¬ ì>Æq^B†˜®¢lÚ…BBr}ýèèáû6\4úh&Ú|!'0½(xðVxÔ¿7i#,^Î +‹FopÒE›}ÊÆÁÁûhŃó±Òl¤4/eú|²Çé4”u "¯•CzÄ• WÄä”’[ór5Z&7<á4Ú¼§à\ä¥ó¦Ómc¶€—LúÙ¼‹ˆY¡0`1)5…ÓÀ¨8°P]‹_²ã0Æ@í0qÌeqàvÀÎFïù 70$NBçÅÂn482é +J95ÞqÁ¢ÃË9ü‚—ÐÀ!Y<$ðŸB¼DwMx¬ž ‘<¯féPÒ ‡ þ›3“§†l¯ ;.–ÁúÇ,0TºQnØèyé‚ ¦)¥&Õ¢”Ò˜1:± “î—Ιí>'´@4J‡S¥)5ÓbÕ¼ åM.dÔì28ˆµ@q£!-ÑL¶7Ï™üC“Ρ1ëÅq«×O`R- +Ñ "D ’à"…êL,Ý8Á0%jA-HÜŽ…‡Œ°Ñ°zh2”dÃ9š°úvÄìÂí z˜13æò‹‚’M§bÅŽŸ•$Èe£›otA,È—/Ø.NølÞÁ©¹hs2V4‚ðEZm£mV+Ù}'ij»9 ¸¸€\–Xi!mÛiÒû)fÔÁÌ:/0 °‹/íò3F'2ÊS0Æz1ÎæñML.Æ-X0 ³‰Á}j :ÒhÇ_:=>nð¡¡‹¶³çLç‡lcF¼PéPø-ž[ݹá§Ô1l¶“@U,nÆæ¦ýXØéåF&=B¤&Å:_È‹Ëf7}qÂûÝÓ†f÷…Àñ¼|v܇ñ«lؤ1BçF 8݇ÓQ/"Y”ÒI©òʘã/ÏMþ›WÆN ™Av0R&yAÒÖ._ j¹QjtÓNL„˜8Ê{¨ø(0!ucëÆãïýí$Äý«—†Î ­."ÀFX1&DR$+­ï^ë­]5ù¨ ®I1aÃ'ì¸QF$ƒáp$£çûD(‘ª‡¤*J‹nC †ÅìiuÃ6'a!Q/C8q¿Ñl&„‰ÚrÂL8}V7B†R”Ô°xƒ›=7á§lLàûÍ Õ/Ú øL0N‡ÓZyÑŽIV/cqS @€ÿKñ NÎŽZý¯ŒÚƬ Ðpp b÷±c8%šÒ4œ›Áê3{ž‡¢5½¼ðí/-¤ŸŽ¤ëËR² ȸ¬@¦<˜è§uJ,xq »«F’u« ’N‚á¼HBX‹Ó7iqÊÑäúÞ‘¦†.ZG_Ÿ5œ»` +ƒ’*(÷ ¨LNÖ …­Øbu ™Î˜L6—Àó©„žIÇ9PóËm0.C“ „Y.Œ9†Ç=.gqPç.Z^:=úÒË£ A3·9!HjJŽdY)BÚá¡A<¯5<á~ù•‰WÎGÆìF ŒÑº âÆ']C£ö1#d²¼˜êÆt£ƒ>{ÑòÊùI2”ðáÒ¹aËð„gÒŠûrHÊøQÉh x­rÃöa£ÏæâIM˜=A¡J1h2®›5?CÛüHH' 5)šô3A‹Ûíö¸…°š,4ÄDåå!óùQ»Å Ô**IzœGæ2ñ©…!žwBÃfŸÅËB„€sB8¢èI]Oh³³S7î>ÈÕû&ìçÇ­çGMÎ%Š<ò—›ç9]Wj4[m&õhZ0•V7×çÖ¶WêKSñRœ—ƒ´ 81Èð`·_ƒd:Í ¡0Ï\HŽ ¤ÌˆY½ÀöŒMºÀWÄ2ÅT½CIQ-Uƒ(ÉS.?mr gGlß9k0z8O va܆Î`ñ2!-[î4gæè dÔäu!<+ÜÉ"Áˆ‡’¥)FÉPá ŒMØ›'àEƒ>Œ!¥Â.ˆñb"Ê¥PZ%© E`ш$Ha’aƒ¡ ŠøPÔ‡ãÞJ%1ÕoaPEÌá¥ìNÜ ±^D°¹‹“rú8•œÒbµØ¬F«ÕÌq\1éc˽Âávçòfïá£[K+}9,ùð ÝKÚ‡`ááq÷¿~iøô“Á‚ 1\†!„øPˆeƒN7lBLÑh÷ú}8AÂ( ´”µ¸‰³Ã¦—NŸzeòˆ}hÐãÈ5:‰ž:ï|éœíÌEǸ 1Z1£Ùcux•XÚ Ü^œ évðü(LDp&:nöž¾09fôú|´Óá·š(bƒ¾\‚i×ôÞt)[Ò£I¡\Œì,Õ÷–šù¼šËDäˆÎŠ€ÙéSgGGÇ͇‡#)‰ÆhØá¡~3™-hA‰bE6¨ÈPT.›¦ÚÉûwwo-Þº¾šÊ'/Œ™/ŒÛÈð!hH¤}õ\¸ßNTó‚.AÕ ¿<•:¹¹Ÿ¿8þýß¾óÍ/?{ç½ûs³9E#,ÑÑÁæ¹°Bᨮ j£–¨U’ažÖ#*N1«Ãj³‡86_ÈTÚ•™…ù;OßNÖZÈ7aóóô*@©M“:7ê8}ú¬òjŠ’Íf≈Ëcw¸ÃHÐÁB>siÿ Ôl…Tµ¿2¯&v5¹‚×a.ÂG«É{½î]ÓS©œã +á•~~k­×(' +q~©“º}¼òèöÖ‹§WžÜ»t|¸Ñ锵ˆêqyíÈlC TšŒ`, ÁtNët5'•³R·¦m÷c·6‹ÏoÎøìÒGO/ýé×_þö?|vog}eºTʱ çò v;ÜOj©x@hú½ )˜II™nÔ™V²]M-Ì4ŽÖ/ïôo\]~zïáÝë»[»¥BI¨4M8ö¡‹ÙAŒ W.ÚG 𙳓gÎN Z¬V¯Ýbg4*óåbZâŽD3©X:T]SnqêÜHX“ÕïqØhØÁ£ÆœâÝì*w/ÕŽ·ê·ö»ï=;üøï¿ùÛϯýÓ7¯ÿïÿñ»¿ùôäé­ÅËëµXL÷ø(§›‚UCù;S•7¦"í42•'Ê bº®÷[ñ¹vì`­úö£í?üîßþú7?~ÿ½‡÷o®¯®L‰7Lv¿ bÏŽZ^:sÁf˜(·Æz£!ŸDš$ÊZM‡º ¤Æú”öìþæk÷Onm}ïÍãŸ~õÁãG739­3=Õ˜Û鬟PJÁi5…>…Š +ºÙ–ïíÖom•¶ÚüÃÚ/¿zúÍWÏ_Ü]üà~ÿïúü_þýþÃÇ?ûþ•?ÿúùÏ>½¶=ç.‡Õ>ipúü`@ Ìk‘I[7MÜXMýÕ»ûßüèÉgï^}ëN÷“WçÿöûWþô³ç?ÿäÚÏ>¼üçß¾þ?½ýîê­íÂÊt.ª‰±X,(ÆBáT @*¬§ñÏ晣Åäk×fì–O.¿|ÿêï¾~ñçü›?üê£ß~uò?ÿôþÿ÷ÿãŸ~ýñÉ^í³×·~õÕã7O6#2?iôœu89ìVÝäwXÄ„Ç;éÀþ|jo1·ÞUwg£÷:_|ôà½'—Þ{ví郛š±ùHÄ’’Í8¶\¦®ÏËïÝhÿÕ[_¼µÿ‹OîýÇŸ¿øþü‹?üò0úë‡þý÷?~ëx¹—È\€dE9J`h÷æet: _jÑG³òãíôçÏVñÙ½¯Þ¿òéë›_tå?}ýìþ»ïÿ×ß¿ÿûßûû¯nþöË[çÒ‘ I‘À„,.ð!1%ñ½ùhM}ó0óÎqé‹×þî‡Gÿãïüã7¯ÿä{¿ÿòÚ?ÿâÉ?þôägìüüí_ºÿãw¶¯¬år)ÝòÈ…A¸ß*Î7b³eñÊ|ä{'ÓûáåÏ^[ü䵕?þìß|õð¯^\þë··þ¯øäÿý?¿ùçß¾óǯnÿ÷?¼ó£÷[Èkº02j´y<Œ'ÉV:X–]%Ѻߡï¬Ån­E”Þ´ðÕ»;Ÿ>_þÅg·þÛ?|ñ÷?yö§¯_ÿ—?~ú³Þߘ/·ºSz®å@øˆª§µP5X.âàíïßlýêã«÷å­½½õù››?ûäæýý¿þâÎW/¶¾ùäè¿üæíßví³ûµ÷¯ç7[¡¤BjdÔrúÔˆÓh”¶fÔ»Óà®Îë'{åwæ~ñÃûÿü›ÿñç¯ýÃO_ý‡¯Ÿ~óñÑ7ßÛý›7æ_÷¦Ã•(®aØç 0‡Õ\µRï7ÓÍ$ÕM {ú[í/ßÚùéG‡?ùÞå_yã~þÚ¿ÿÅë¿ùâÖo>Úù÷?¾ñ_~ùø?¾ùÙ«½7’÷wJÙ¸dwÀ#L„á„|JÉixEG·»áËÊɆþü°ðÙó•?üÍÉo¾¸þ«Oÿ×úòýç¿ùüõÏß¾rïú:ŠNo Ø‹Á"´»¬!3Yb·#>Ü)útí«û_på_~ûÁÿûßõ_¿ö·ïï½{oyi:§A=0Êɔ]¤ÉXÐ7• ^êe®¯îo¥üÆúßÿèÁŸ~öÁ‡×>¼×ûÑë+?ÿèÊ'Ï7o]ªnô‹…\!(§H>  °Ø ¢¨‰t$åКŽotôí©èálô­ãúOÞÛûõ'_½{øùë[ïß_yºß~²S¹¶œ™k„óI`=‹ '¸¬¨V8W„¨@$x´— ÝÚ(}údñ§ïíüîË›÷ã‡úÉkÿüë÷ùé_}ïÏß<ý—_½þ»ì|ñ°t²îd9Øk7Ú|¼\ˆ&Z,§ò$ÆŠ¢oJsM‡žìž]©~ÿÑÒûwüù÷ïýñ§þé×oþË?þÅï|ülýÅý…éV"$†Jñáát¶ÎÑ´ÄçkÑzéƼUêÖrêéaçd·qc5ÿîîo>»õ‹Oî|ötý{wûÏ;—{‰©,/Q3*'34â€!œðÚ%ÌVQ±…š¾ÞË­¶Ró…{;å×®tŸ_›{íxn«©l7›Mmªr8: +Ç)àùÁ(ÎÆX!Å#éx"©ð ‘š-E·§²—:‘g‡O_]øí§ÿüËg?ûèè'³ß¿Û}²½;§œ¬fgsA±#>?œ`¤å%´I ìöbˆÛ.bάˆÌ‚[ úΊþx'ûáÝÞŸ~úäÿù¯þù7oþþ«Ç?x²·Û/Ö³1`zÍï„H—ùì!‰ŠtV¥ê‰àlIÙégöæ³·7+=XýøÙîó›³Çkå&'Âg´˜Æ v³‡VíteEŽ·hZb0,•7ç§ö·æjqüRW~°ÛüðµëÇ[S ðÞ•v´’’T‘y(V؆¨>:ói,”ÒUQT/D` ™OÈ\Feú}g¦p°T¿¼P^ëfZ¹x3¯Æ5UdP 5bt¦â^$d±8í‹ßåâ‰@-Zhå/Mǯ/Åß¿;óÕ‹K?x´ô“ŽòÞÑžo~ñdù÷æ_\mìϨíöºì8Å[}!(ñâŠÁNx=x*+ÅutTTßZ]º<¥ÍE¿xmý¿þÝ÷ÿóï?üæ³;_¾}åñQÿ`µÔ«G‰§Å$¯7 *Q²¢(Z*fJ‘•‰¬Æ$ø@&Ì6ÓZ=.uâôn/ym½³ÝË•2-Õ`!( +ìä°?;âšÌÅüâr’O“ÄdTÏD£9]ò¤Æ1žÎ¨œˆ{xØ£°\.ׄîö3Nà ül$Ó9 ÓhEœ.”&ƒÉXnª»2Uïå•ÐL.|e¡°^žÎl´“óyq¡ õ2á©ŒšËè°aÒa÷ñ(—wÀá³Ãö¿<=6—MÅ丌«¬ +„B4Ë ~’³ã܈Í?dðÚüæb]T†T›F/;bEG,ƒžü0pívÃ,#ƲM_@´!ƒåÉ›v`;¦¡Ð©‘Aûk*¤‚VX…ù’RLÞ  ùDWLö†¨ÑÉø¨!æH­fÃ"¯`…eB,ƒ‘™p2Ãæ€Éêå 6Ú (u'¿hcŒV’bu*Èó…`fN,-Ç›ÁtßNÆ&=œ/ f›[(›_Œu¥Ì¢ZXã³ËÝ©Iäôdò  ýëScç'|„ÒË›JyõŒnþÌÃâb'lÌwÏÚÎN@.*AE¦ÄÌ«÷Œ<îæÏÐq+†PšÓÏ¿2gâü°cÒŠ»1™•ò$·OšÜ^?çA÷³ nnÌÁLxB\7!êw^žà2óžP ŧ—Ž²SÛ6‰97›Äå<©–ƒÑV®wy !ÎJ1‰–“M‚÷Úq\k§š—W®½£VW^±`X ÄæBù-<ÒórY ,N –¥+Ø·wÇì¸æ$“„Úeâ}\©“ +Ò¬Á'˜Ù†)P0OGÛBf: V]T4oëå\ÌQrÙ/ä°HK®]Ê¡Ükcb6?sŒ…«˜'äÁvZT¬‡+N.ëfY`[¦ö;ëwœtô‚5xCþPÞŠª.&é ål˜TJùÖv@k z‰Ëu'Wð„ª˜Ü3@Š˜ü∃s`V(ó¸Òõ±£“6»hJ*!bÑŠ©àøÃ¥p|bÍ'Vm Èæs ×l°„†2fÿ É¶‹Šù…‚›Ë{ijÌGëFuÑ™}AÁÄ2Ê#<œ$ÄåP±Äè1'kE5G åfòö@ + VÙœ5Àç'ý´:¸e9î"¾ WÈ»…¢'T ô.—ÝTÔAh µG<Â$,Û™ —[%b}.»Ì¥–^™@‡-$ÌabÞ‡xÜÇÌ~ˆ³›Œ[üá!æaS\lŠ‹NYõ¢ŸðˆXE•6«Tl>îü¸÷»ç­Ãh ÙÍ:pÝè­ˆlö…ܸ2fðYËÆ:t|šˆõðhÏÃå^õûå,•ÃéÞòå'ñæª;Ù¸\ßTdÇ {¤1˜l“æÓÝI$4ä¦'ü²_¨ÆÛWâÓ×ÕÆ®gÐ6VDÃ*Þ§s¾l§Ó`üGÙy:Þ5Âa$´6_ØfÓ+¨¡Ø½ÄF[à|/ÚI'›òò%ŸPÇ"=X,³zYV-Ó‘&*­°D/ u„ìR¸°Î/;8Bn´),ÜßeÂ"c|ÎB›QO/øØÌylDüR ×;XdÊ/U&!a°jlÊA§ƒtqY&9Ë 2>ãWZFT'´Ž˜]v€°äíx$ ø|&6åuÓm¨FG»F4b!{!Ȧ˜_ö‹µ11bÁÇAw@÷^:;ùÝs¦—'¨m&6ˆåq+9édp¤IÞ‚ifDOtÛ WDdØ 4êa‹d´/×våæe"RgÕ¼”ïûå¡ÕAˆbr•ˆ4ÅÂ2Ÿé{…4—l÷žµ. ÚF•×É䜛Ë|ÏÔ×Úëw.:I,\Òë—¢í£äÌõH{õìl–O÷k+w#Õ ƒW3ó­µ»¥…k¹þqwû •ì;™¤ïÛ]k!Œ 4­ºx¿¸ð Ö»-”·ÝTÊIF€n£Zõ¬•œp!®@ëst|Ï­ÊåU;!jY(¬±™e">›èånºúÄg’íƒ@†Š… x¤Í$z\zÓg&áÁb·P´]›?ò± ƒ—qÅD;Ju—ˆÎ Ñi_1øÂÑÒ:Ÿvqv2eFtaRˡ®÷ÍX\NO/î>0ÁòY~ÁÎáB„–·š—ÞD¥êÆ•W_|òµ^Z¦TüáJ0½¨7õÖ!—šóò…1?o§£L¢ë ¥!¡ˆiLï{„ðìôÕtwèv0Ù:ÐÛ°T Ħ™Ì,©Uš ‡Ó;èxT1ð^&ÚNNäWO˜ì"Ÿh5ú;ßú2ÙÝ04¸¡Õ÷ÒÓ7òs·ôúº“Ò.  ¦=\ÚJªn!c è¨Ö(ÌÝn¬?‰µ÷0­‰ËÕT÷–«N6MĦ£Ã`vt…ÜR0=sÆè÷ B¦%åºL¢c!S®`™Œ æÛ÷6îMoÝ?ÒÖÅ¢b-Û½Q]}Âæw|R e¯>ø$Z^1ùeTªÔ–o_yüñ•W?mì<&3¶@œÑ^ÿ‚‹u.Ø[ EÅÂÕýÌìÎæk±ÖL•¦w#Ź!aÄTHnñ¥ÝÚê«ùþq±D(u›Õ*ë&X5Á +¡µñDíõ‹ÔvK³Ç€_hµ)—· } +4 ­áeó˜PèmÜÚºó.G'™àÓ‹|fžNô ©æ d«Éîxþ¬‰šôHLbŠÏ/(•õhóÒp¼VJMÏgFôY +«–ZÅ"]T7¾âæJç-´oï?ç”ò¿ziì‚ÁìY0½’îßê¼ jͤ;´uííPbÊKFDñɵ1P›BÙÕäÔÍÙý÷:Û¯2jeiãF¦³Ž…óŒ^ãÓ3‰æfº{9=} UVðp!VYß.(¢”@jƒ" ++H65iì@|ÎÍ¥@±S«{ñÞíÔüm­{€(e)Öêm=ó36Jc“3Je³±|gåðÙòµw sÇBªWìlç¦vh½©”VÒÓW•ÊV¬±ÕX¹={ðš\ìåZµù›tbÄ­‡Ï9™8ø"¿XçÒ‹h¸JiåbS«"2`Ô<[ŸJ÷¯Wטd“}¡´V[»ÓÜyUm_ñÉÍI,bBU:ÚЛã~2 —}RQ;àÀ¤ÒmÏyÞŒy˜$©ÕqµˆèM$6G¥–B¹e17oÃe;&FË‹T¤Š)>ÓKô¯È•¥´¬U7´âŠÐ€†² ¡ÁUîsóbi“L-ç©ï°ÉÞ„7˜lnff®R‰61 +P<_¨ eæf¶îÃBÎÇ¥K׶ï}oúðyqùN¬sÈÅ»¨·îìßÿØË2&¤f2ÓGé™ãÔÌabúª-Ø9~Þ˜=pá*Ä%½ÃòòIqáN²w=;‡›mÊYP9˜žå² tzÖ¯ Tà(ÎIªƒÌ‚øòYƒï¼>kÄìD‘ê¥Éj­Iûò xBS>¾âbs¾`qÒxJ›ÞzÎô~ÑNFA$X±pÝ.&‹å`z^«l€\ÆBéNG-L;2­V£Õ­öÚIwëQjjKMáÃlÿꄇµSmj•tïf¤¹§Õw¤â2©T#å%!lr:\Ûk›H±¤—6ª«Øô´ƒÖ“ËZyµ4³·´ÿ¨¾z'”ž¦äRsf¿ÔßCżV˜_>|>ðFkóQmýA¬s™VÓ{÷—/?¶ªÓüR9 ·@ „+ÛtjÊZ®¿}ç…é£(W™ô"—_‹M]½ú¢¾z"¦fçv•–nøÕR¨´L¤!uŠJ-K¥Ýxç*ª6q1³}ãÍòìñ`µ#÷e¯T…•š/˜‹–7RíéÕ«å¹+±† ¶¥n›@JR1 ´¥Å›Ù¤u¹0«Õ7¤ÒR¬uIÈ/'ÌZQºlÁ5D.…+ëZs_k]IõïFšt¬ +ÐÆñ³ù=àý*À\ 6Ø-®Äš—Ã…å`¢¬?˜ª/7¥ Pû6mó©éhyaa÷ñÔê-“_¢µFy~Ÿ+¬ ¼ë\i¬ì=Òs=«/8XñÚÚŠT×ødÏÀjwܯ]tá’Srý«½Ã·Š›¥Æ®Rß–«[ˆÚ¶ód¸Zîí£|Áêg]¸lö+>¦ "V­°öÊ8dñK¸T³áú9SÀàS0©…J-6¹ à}Ún&éÄÍpØÌ È{9 ¡y‚ +ÀZnžKtápцŠ8ŸVŠÏÌ(åeB­‚Àí/®ñ©W&¼À„ƒÐJvö«X×LOÎ¥sí]R)!Ádfz¿¼|ŒsýQcãÕTÿ©ÙI-7sà倥Ñ(½ŠÈ@sja^+/¡rÑCiB¬&%+ÑòŒ”ŸÙ ‡ËD8­åg¸Xó¢G„x‹•T,¤LÆÛ¡ì¢[–ró|¦kÃ%Z.¬½5µ÷<˜_òK*P½NJ…öü!P7›Žu¯FZGby[i“ÉeEcnNM´/?Ð+‹/OxÝLfÀéÝP~)”ž §§³µ•'o|rãñG“hÄLÄ|BI/—O¦®¼ŸY<¸º¸uëéû?ŽUWÆaůõ|ê ¤N'þöÞëG²3Ë{ÔÂh¶»IVUÚðöF\ï½·á½7é]eU–¯"Yd‘M² 9ÓÝ3³³;³ƒÙÁ.„ Aúô¢ÿG:·Z»ZéI”äÇ`VFdÄÏœó37n|çêwG_ýSóè}Uªû£Kwxùqwß!ˆUÊËѦèôå_]þ—õÙãÛ_¹ý 1ZËõÊÚËq!0 (Ïþñ×fûØ€Ûà‚‹Ëo7·?†³Œ3Üiwõ<_²ÎX=‹¿ª},߇V„zU¨ÕÏÀc¦ªJž²9©ôŸ«ÁòçÏ)£7:{üæ·À&;5Ïúl°ª|U›>‹Æ7fc“à Z êÓRd0¢h1²dHhƒæâóþÑ÷Jí°½xÖ‚$šEÊ+2õ$æ”؆Ò8 ¦¯H}‚Yi@Þ•…Œ<̼X;T:¸=EÔevÔú¢À{RmQ_¿ +æϼÑ-è±ÎůÙƦ(þì‰9º*!å€]:¢àžÙ¹ðÇ·`Õq¹6<ùbpö>Z<3ú—Bóµû„3Žæ/€åq£O™}¥±Ñ›Æô¦½ºuG—YÖåíž?:%ŒHöºFk^¦}ô%¬®X2RmIÃm%³Îæåæùopµ)z½và `¿>xükO³ˆyÕ¬=ù gM¶sb²b‚ZŸÿÐX¾ë‡ë“ {öWÿð?¼xÿ‡G)r+/å!í¬k“—ÉsàMÑî›ýKpI0«˜T7;Gœ7š§¸»ä£Mmñy0}Ìžá?ë®´ÅÚéL{ÂE€ÛËç¡÷Ï÷P…sg€$l¸ˆ–Ïw‚k]ÂèòÞ¨yðFŠSÎð:\½îœþjzûû«¯ÿÍàò[ÜèŠáÔ_æH›„ÚiIXSÆ[µªÕýÞR_æ¹7†y®^àk ©ÀYƒ|eü9üêíOjcªXihýkˆpÁµ—/Þþ±¢´kA+¸3Èúhv㎯*q齦ÖX£J#Ošb8ó{Ç“£—vçpÑv=K„9²~Õ:«EfsÕ\Ý®Ÿ~·xúC´¼Ê›éí³<ífߟ<]ÜüöèÍ¿Vz·%¡›¬ZáàÜ_—¤Ú>ª&+j­3öÒì?µ&ÏsŒ[£éÅ× H½‹*m°º­Åëþá‡æê=XŠÒ÷g/¥ú`¤,Fðü +ãvÆ×7_þÍäò+Úh|탙º­j½Š‚j<=ý²3بµ6öø¶}øåâö§hõyQìd1ÛoÏ.¾„,æì™Ô8³Æ0?}G ¹qzóíâøÕÇœ]\ï€Ïš?ýíúù_RæЯD¬6`Ô~w.ÊQ¦÷´æ‘Õ:h OØøÛd¦Ö:V_"\-WUS¾J¹¢ÑâÃ5ë¯kB[c|e´AÀ|!Åõ•.?€3z—EÖ¯°~¼»Ò°zçê^ïôû HÇ«ï¤Æ&Q’šf3ûbû·%àYoÍž‚ eÝ@ßàì+wúÔ][ã«pñDëŸcFì¿9¼.ÐDk©qª¶Ï¹`ƒ£’Ü‚ ¾ŠæO+Z‡ÞWz”9F´ÇŒxÇx³w1òë²X‡ŽÏÞ·7ŸƒÌ0;çáä)ÄsYlÈÁL«-ãíø”ŽÒÉÓàÊÛ½õ[«žÂµªj§@‡œ³ÐÚW¸=Ë’ŽêóÝïÁ)oeh +Fëdqýãìú'µûd«¤eHóWiÌ(Ò^r ¥êÂj†“[ @2˜Ô'—¬ÕÆ”°"× s¬6ýÑc³w `^‚æü¦}ðVSnrõã4SÃåè"­y‚IMÙÎ߃p…‚"ÍQ¼ßåœ=ùfqô\´ZJ8ŽÆçÍ‹éͷ÷YÒ·l(˜Éžl¥ùTÅäüE0{>8ýÚêœV¸0…h¸Ú §·fçìa’ØÍ1ãA‡áfö®[‡ßZÓÏ­1˜‚QU +·Ç»CÒìÅ(¬0kZR~b°,3v4}-^™³WBí ¢÷ +b3C˜´ÞªÊ°[÷ô›ÁÅwVÿ1,´3¸¢…Œû›Wó¯P­YQU½ ü~ùåß>ûþŸ¦·?iÛ2€ WoP½PŒH]À.wp}ýî³Ë/Ýáù<fÓ"A áÃ8~ûð«áÍ_€hínýÔí1öˆ0†T|°2Z—0X®½’È:1:P`i:§eµ“aLivW/­æáV}”®¤1 xU`ö´¢÷aY¥uO@¡%1]jœh½ksôD]^N8y°=Ï¢ÉY™³+R˜çk¤9õF/ÌÞ ,k7!×\ {´[Vòt€S¡vÚX¼ë~Ý\¾Ú.ˆ”Ò¾†ØÎàFžr l,©´.hE¹Ó<¦.N¿è,n!*óE­<å§PCòg~ÿ<]•ö +ÌŸö¦â!÷ËR+EÇ…~ÂÑu4z\æÂéõw 6£õ«ÍÄ;sºÉ²ÈÈ‘×^CÌ—±âüÑÓÄ°H‚ÝÙ<~ߟpzMŠ¦e¹ÃÞè©Ðúp?Ï¥¥1yÜ?z½¨YÌJ”Õí¬¡ënœþu•¯å1M¿í5&Äf¶jÈÑ<æZ‘Z„Þì‚Tz‚d„Ö9W»¹Ö5‘δ,„A¸Ú.Q£x¥÷Ÿ¸óϵîeQôÒ„ŒƒŠn.$oÄ;µ¾Î> /¿ç¢MŽÛ;®ÍžvÞ¿üñôõOÁü– ½ÓÏg·¿¶&Oö0 ˆ>œ¼Rê .äæÑëN/¿­ˆ X«YÛ|h}r‹ pcT•›¬ÙƒwD—ëjýØŸ<Ÿ]ÿzxòAo#R=QU9wÎÂÍŸr‚7OúP¥›#ÝŠXƒØ.Ю3¸éÿª{þ¡ùC°ú²jNÁÚ¸½ãñù{pE@ 7O¸p£µ/àåqu9¥Þ¾üæoi{œ$°áŒ·¤ì‰7~îÏÞÏ$**¡öæ™àþÚè\ƒOß«¨Ò «ÇÛ¦±Þ¸"Ö«|—Ûr°¤¬øÓ$n!¬»¾~_›^8Oo7Öï¼ñS½u'QóaŠÜ-ð²7ÙÉÒ´Ñ §O†ß½øé\¿ú£Õ»ØÍÑ(¥Ž^;½SˆL€Ê<å‚H@É(í"Çò8“ƒ?̲´ðWFo+n—VÙëHþˆ&'‰ÈŸîU±UÎ £veoœ'ÕTU$Ôvž‚mÈá Bg¿ ±j“ÑꩳŸa’™µ€Cµ"eÅ{eÔOìÁ-ˆ@«%¾ÆKÈNH.XÉõã`ò"\¼Õzç9ÆßÊó_#´.c(g¤wÎœÑX[“F»€q%Œ#$O‰fà+;ñg4=þMÅ%ª2)»f8°jc­>“jsp£óo¯¾ý·Ýëo™æ!ª÷õúZð!Z÷O><ûößÝ|ø÷ƒ«¿Èâv•qΑÚ:&ÍÄžT?jgÍõWîàS;%R7ë+£y$úÓ¸òˆÚKTÌí õ£ÎñgxÃÓîÑkw|ÈM@6L¨­‹Úú½?;ÓÖ£Ññ«¿~Çì! :ÚµÍôê›ÎÁ+ÚìzÃîñÀÚz÷F‚Uö—jý ³|>;ÿŠ1»œ=Œ¦ÏA|ã½}Žë# ¶ý²!d„Ë8!…oj÷óÎR«ƒÈÓ¡?|¬D«,fVÅ&eÏôÞM°xÓ\NÛÀRRïŒÏ¿£ªv){ž¡k0¢ãC„pfw/G+Þ(쟥7¼&íQ +7Rˆ¨yC»¾ÎÇ_š Íö™¬9{ŠJ­2ßØ+É{EA¯ðîK yÜFèÐ{[ñþœÂ: f(gÉøkè`|ŸÁ÷¥IS–`FÇ>?j㛥IŸ2§EÆ-P:m´ºoO¿øûþåBý09ѤŸ1[¬Û×Z‡Öè18)¡~˜1j”â¢Í˜m¹¾RkF`ÕáµØ»#e´(½Q‚˜Ó§OžÿxøòÆèe‰k0Z‡w†1Då¦7|b´/AÃxÓ×rã¼Ä7J¤eDsÞj'ÊL™sÅ`…pMÚYÃkÈeÒè N¿³¾¥­~™x)× ä¾®~ ÂÖ] F­Õs¥qg=¥}>¸úþàÕãO$O¿‚xœþü¦µ|šg#!~ù—W_üËųŸüÙm…óÃÎáéóß´O Œ“%í,aClë#Ñš0J+SáÝÖfxü²•2'€E6âÜe|¡Eû¤ Â…Ýå«ÞÑ—róT¨Æ([°Ž¼ Zâ5ÐëMëÏ!¤ñ8ÙE6€I8^o +f“3é­u +î©*ÔywV ¼G9®È„_OU4\jIþŠµçD¼§t´…ÊtÕ.(pa•¯Ã›Â,AšøƒKoø¸Ä7ÿÅv„V™ƒ€ÔR˜[àE¡ꢳzi·ŽËð*ÒÃå.ŠNê¤Jò~1® 9¯ðõ$|’"÷ËB‘ÔÁ*ÍÓÚüõÅ»¿;û„Ð_›ý› i4©µ¥Ì…Æ ßº;àõ> ÎŒë q¶Ñ˜éÍ% 'øö>ê8Óáú-¸DðH½N;cpp“ËïÃé³,¥%ª,¦FJóHkZ À_öÇÝÍëþÕwbç ·ÇˆØ$¬Q)„ rú§öøt ÜxÉ,®³Ö@o_Ðö4®9hœÑKgòV¬ÓF?Qf?KUÞÃMw ¤ÏZc½q(ú3»½±škÀ„yò†q§býØ›¼ª¯ÞË­+˜Û ¡gPñôùÍåsHVïÄ"wi{MŸ2V×:ÅËÁù‡áñëÎú¥P[¤h »uÔšÞèµe‹´›#\1î,Y5¶²ÜNQ´ëîúy‰qRñ6V¾®§ßÍ®”¢£dE§õîùËŸfg_•…:eM€7íÞµ=x¬µNâ«Ùl…ÓLjÒ|Tsl„ pÏ? ¤:§ÔÌ`´¾ùFïœä¸Ú£’Š›ã²ÔA”=¼ÍáV"ÇXѲ={ñœª’äV–EÄ6€?„ÖnQ¬ +‘Ý;¯­Þ@ô²îŒÐ9ÊOà >û¬³ÊgMôÁoùZ%·ÚÏTôDQ–ÌImp‘(0¿Ü)?LP´: Ô^™õÎO `‹zy6½£º3¨ÏoûÇoû'ïg_:£+P‰”1kköpk­ß-žþaxù›ÆÑP, pµÆ8ݪZSš'Öè•Ðz¢÷_w¾}°:ç9Ú$ÔºÍ £«MШÒқͳߟ}ñÀ)ɪR$ Áí“òáJ<ÆYmõe÷ô;Æ[¡bm¸¾õû'E¡–ç¢sø8˜¿gìiUe¡L[’;(PZ…wP ð'Ü¥à­Y{ŒŠuÑ_ BþD˜ ½º*VAÞàDôGÛZ´FÁàqmöÒÞTÅV…q ÞS¼¾êuQÞ¬^s|¯£Ùs!:Dñ£œ˜. d|IU=QÓH­¯ÕôÖ&µ÷Šò§û8oõ;‹'”ÖØÉóŸ¥Ø41µ3{õmóäƒÑ8( rÔ^÷߀[üù¶[T„šs¡uc÷nó˜ù0©Þduñí£$õómž@Zssð¸ÂGŘR§Œ®Z_…E¯ƒËa)ÞJ«ævÎÂéSµ±¦Œ<Á€‚ bP\'櫶"Ì®­î•Ô<‡ôç\°!ÍR|z°)7Ž¬ÁS0Ô½`ÅpÉ»StÅ×”—@ Rë:½3%ZÛÖÑ&< ¼¢õÒ´[„yp&˜9Lb¦läÆã®mÚ8GûÐ'u\i‚ºHW¤¨^ÓçRx$EÈÜ,éÑÆ "µ“„KØ3Ú?P[—ààJb3E;EBˆ³z¼„Þ¡ƒ Bÿñm’0f™ nÂrWå6®÷„hC{+ ôÎúM0y&×ׄT;FÛ#ðe:Ü«èÚ×ê‡ÀΘÒÛÉsq¯0½ÀF¬·ÖÚ“¸›§}HFBiŠv?ðñnÕÌ|[V`ˆ )RU³*wÀqäh7Q‘ c¬6Ïëë¯@3o+Ëä*êÁÙ—áY•uó¸Yd_]ÿõßÿw²ÓM£F³ ùð•cÌ£R¶*˜­àŽ²˜Q¢ƒtÕ™"Š1ú¤TÏ"BÓ(cÂ\pˆjÓý¢˜,òÙŠ(YÐäŸ$ÈdÅ0»ñYîø™Ô¸Ø«:¿Ü%A³ñæبfPÝiŸh­ Æ^™ØvA61zKô&nïŒ5:ñæ'¢_$cŸ‚K55\šíSop©5¤`*…CDôãòy•1† iÄpN[ÊhñÞH ró“{„Úõٿš<þÍìö÷Öè¶ÈùðXÄŠP‹M™Ø*+€¦xG¯á¥Z_ÛSP `ä1kŒh,Õð…Ò} œU‚²§ÜÇ‹ú@‹BÌ$«&·ÕÆ)m ·RXªÀ +î0K8¬½@•a +÷3d€©}!Ü”¥(1¡vBû.<ÊpÑ'yîÓ<“Â5ÎV9Ÿ|£¹‘£v¯¸Ú1¢÷“„Š SZA€cU±a´/üékoøtùøwÞðBB¶zF}‘¬ˆûˆTÛ´=wú7“óï¥úy‘­ï—ä"åäk¿ ¾Éùk¤{û~rvrl7Æ1­ ~°,51c^©ŸÙ½Â?*ÁaQPÂJýÐì^&q¤‘¨êýsF0sUô@ÕE!YRJ¸nyƒÖà´?¿L•ùý¢ŸÐS;rí8Cx»Eù—;¥2m»±F=ÙÍr”ÚÁ•.$)¥÷!º%‰ÏvÊ”TããjzQ³ó„W œKP[9 × Lò„Vf]Ç@»„Ü„¨†ŽA\Qj3Þ§×é«Ñ\ô¦ ÌÖÓ¿V'ñ)ÆŒJµch8‚ÐÚ ˆJ\Hª åÃÙ³Æêe8{"F‹x6£“#-ˆíéÐÆD,x¹~áAh0ÒVžöP¥]?øÊž¼5Go´^\л ¢I£ $Ž‹ wðÜèÞJщT;a½e¼al†ªPŽâOò¤£ÖNŒö ãÀ‘EõÎã8®Ì®Õ8ÑR‘{”·)É#Âœ›+«}Y$lZ WïXg’‰ö /®\o´Áf–8o¯,HþÜùxN‚ Óz™Øqe¯¦1W@L }pZäê;e#…:„62[b°Üi„Û ™©‰ :i\ßCtÂœ„³Wîð1¡´ž¼ÿ›Íío kVU„=Í }ÌÊѤg04ÕÖãÆ›XVi¨(l+Ãó֤†B˜P£õ±Õ8±êGŒ1€Pß)pKÛëÛl/Ëì—µª:„‚)à©àQš¬_ŸnåĽ‚ –Ç,mf4£õÁ/vÑO÷ „Š´—(©Û~èHtj¸Bùh+K'ÊRQA•1æ°*4ó„_¦½¨w4Ú¼¿_¶XïDB‘¯çÙ°$¶²\ô°$í”Ä,nòÎÌé]Há“kyÐU΢2©D@^áü=|NYSÆ“z?…[Ÿ¥©í‚P  Lë+bÖ†v¦¤9d1Ü2Œ·S’R¨‚€“ÂL8 îd¤\;‡B[#«­µO)k\UZƒeàŒöÊR0x{$ús¶*RJ¼§ß¿ I‘BT ­÷€( pUÖ³ÆÀ‰ðWÆ€kƒY æïôÞSK³}f!>ÝmvÁ¿g³"7íþÞ}LZ#pâ9ÆTâòL@c0Ú9Ü€<ÊQµº½“Dí ƒîöŽI£šFm1:Ñ»OÕÖ•Ñ®œï! 0]†´w*2㬄`c ®ÛGñÉPžeÖ³k³wßÿÃêê}EjTõé- gVUãkŒÖi‘ò)µáôÏ 0.‰NE¨1UZ7fÿ9H#AëÎ6ï*Œ ›0'¼ SwÆ/Fç¿’ÃÅ£d•àC” Ó¨~âm¯¤<ÊIe¡§uòïæÄ + Ý…Y%•&V–pÁËhö*…h9̆Ê·”ð‚¹L ·’¨.s„ ~±[M"zEhˆÞB —œ5*‘ÁvFÚ/™Œ5+ uÆ; ¬9Ü0kšf•øt´5‚%P?g/´æ%¦ Ë\„ÉuÚ(Ѧ>cõŸT¤~‘kç˜&"tU+ Êø©Nè}ð¿ø€Ep|P× » êìá Dh–á]*bº­°.&Eœ?VÛÇåoò´ *Õi½Ãíúø¢{ð +˜½ª1ä`N«­ +ç€(­ ˆ¡…´V« +AUFžC¨TX/U–X½c56’3&Õ6‚M€Ñ+  «{ yò´ÍZ=È ­yÄĵÌf œ{¨66e±~\Œü £ÿXˆNhgQ |°‡ŒÐÕÎ’ Ž!Qµ-Õ’¤ó犀Vûœµ'ÀSûed<8ýîáûÞÑ×¹Ud=opIQæ;|ó¯žýæ¿F/$™fp{'ÇïâËìI}X›¾h,_sî4h£Ã/äð ÈÔöQ;AEE TÊÑêñ÷ßüÍÿœW%¶KB‹0¦Vï)ï­8>V먡r»"¶xÔÔ1äB‹Ïipî<>,¤vš €Y¤Ú¥\;O>èêé¦]$… WÚìƒÎ5^à"Âèyã>„ãwòt­Ì†„\'¤à å=Ö*­M|õo瀔u§„Ü`¤P0´ÑB¤ø³üÄî^ \T¢ÑqF7GÈ;™r +¤)G‡Íõ;Êæ('‰¨ŒÚŒNUs¨†ËM):°GÏ´ÞuEn$ã"ËèÒëÖ ¢ö@çHÍc€JµyØ•c\>\¸ã§fïš0gtàFyoÞ­@héª$úKòš²'¸ÑãÂÕ.îür+¶èŒ²U%YdÁÃûò‡ÓF œ2(·0_€Ë®ˆÔ¦ 7þ0nþä×ë¿w⨛ÎÎ>HAl¥Æ1,4®I¥Oi½a@²ðÎH +– â’ˆ*® ¤ô1µW`‚Ow‘í,³•çw-šEíŒ_€ÖÇÎà—ZÔTk§„.µQ¤ÜtE}°_~˜¨BØàRB2Λ½\¼üëÎù÷õõçjó"Uu?Ù#&Z“T‰t_ôÖicþZ },7¿ø•Ñ8mVà[lû¦{ñýíÿôÅOÿôøÝï³´W#¦öpµÏy‹_ͬFb°æünôÓ¸½_µS@¦B›4G)'Ú­¨íâG§_äâSÄq + Jz·Àú }1©aÕ7åK å“z/E˜ pe@ ÚZ‚B ù:!·1Ê Û”nLjË·Ñê ,1¤[…ó +”Y`âO+JlPdk˜fáHô×À¿sôn&•*F%>ÄõXH³û$˜}#J–Ä4…żY+MèÜÑþJˆŽXo‘cœDEàü©Ü×ïHg^QÙêð'Lk¢jˆ¬,6ÄÚqmýu}ý5ÀÅV–J”eTj"|\¾t"u™àUz`uí?ÛG6©©²P‰?[Æ‘Z åäh^Îø“WFœRV|tI¬IÁÌëŸgI ³Ö:kkÐZ%&J–µí<“AU`ÿn~º].Ñ®èÍ8{–g»ˆ¾‹¨»EýA†eRbCÐ!”1æ¼5mÍ`]öJân>†G:Sö2 Ò?–9£Ô‘d)Ÿ–RmÌæôAžß.yÄÙ#³¹6›«ÝIƒÅ(Ç×äIW;c‚CÚ]ÁB/C4–…äH·>î8Ú¤[å¬fŽ|°`Ñ!‰Àeãj¤r"“ˆ•msñnõò_7Ï@•¤È¨Ô !ôt;ˆ¯õ}ÎÕ6U°0 ~  5 7&µ1¥ƒÉC!8“7z禪t÷+ !HHðhòÒ<ãƒÃ¢½Ï:K0,œ5Ø.‰`ü£é­?{ƒ¨Ã,‚E|†OÔÚ +aíªTƒÅäüÛõí_°Á<ÃziÚâ¼ ç¯2”WÐúFïÖ½kgy&|”%“ˆˆð€L|/ׄ´¥Ü fL@ì‰ö0…ȸԳ?8~ã/^î¦,@?õã²Ö ÄºìŒ.‡«æÁ­Ã÷­Í{Dî€Ð]”DâpÚαÉ2<'‚‡©Š¼¡÷ vU¨}–Àvò0ï.Ãù‹,<*ð;` I»ÄXéø’e¯$?H±E:Àbj€\/’>.uh+¾ò!þ urtÐÏì=†‘>Ìr˜Òõ†·Îè…T;*ÒèÛ­³”ÜÊW´Ïö°,îzƒëõ³ïÃù㪔t„¨ÕšAÃóáa¸xÛ=ú®$vªÊ¨TúiÊÛE”ݲŒIÍÚøvpò«ÑÕOÁê}wwŠà#仕¤VEòÑ)D©Ö¹Ó’ Òg§¤BXV¥ŽƒTƒ¥LTu`Ÿ=DNÿ ¯>~× +d*¡vÔhmw.€P +l|·?|&‡ª""°¯uN0gŠ»3cðdðø÷ÖèeäGQØ/r%Ê’œ¹Ñ¼$Í n`,°¸’¿Ù:?U…YÕ¡WVïRŒÖÐLT徬)£ŸçjE±Íº«úú}´üœªJÜ1©µDlµ¢Å-_;æ¯:'_wNÅø€\È·wÎ^cÖ¢, hkB3R M¼d…/s°úõõ—óg-¶.b¶›¬5a¬eµŒÞ‘P?#Œ%ªÄgHJ\´W’`,yÜ$äšÎ@°Iµcù¬5cIªblåØ,f"l-ƒ÷˜@¼¿dÌ(í)ò—Û%NOò™°ÀF\°öFOêóW¼;MUø©Y͵Ý:ýdð{›‘#0¹r°w§È“úð_©ŸÆe—u‘m¥QOòÁe§1ëA’Ì“.„GIìýeˆ`¯¨ËÁD)õcøTl^ÓÖ4‘™¤RUD gO ”›§Á?¼ ¡ŽÔ0þü`$QV*\ T`]wÊÊÈaBŒ PðZ|x-\¼Ñ뇔>$änU¬ÙíÃþæe‘°Q3´W[¸=K3Ñ^ÕÌ2Qž‰h}"§"¸X¬‚Ö¤¾Bø^–Šà-¶JBEí ú°,·rBˆZc{üª{õGgùnŒ ¡Ò \Íhž×ï…Æ5ªO³l=_»Ò@„0.1oÏ€OaAË1öò¼R3ÀæúÀÄ_¾˜!öúU}yêީª€cO„ÚiU )­•Âµ$* ñåÆ>¢%+FµÓU£ÊÇ Zƒ³Ûƒ³/¥æ!BTí’®fGŒV´3Ë10x|éWíPí\±î"ϸ`Þ¼‘8§ br—Ý“_ë½[è-*µ³˜ÆùsTkçX¿À‡jçdvýýðì³yÀjM\ˆ@Þ×Vo0s •£k`s8ÿ ±zkvOÒ¨–­e¦Á ÙŠÛó SƒdÙ- ¤ÖÖë«çÓÎ’°V|pÜ?þÀW{¨ØJ”U +d0¨&©}Œo’Æ’´ÖBpAòÉ>–@dÚzß«˜uàÍ_˜³·þìÈ’iæAŠúóEƒ<ß(¶çJýžTûž²  °*X¿ÄXí O VtP¦ü,o€ðu\$Êú^AÉ!MÆÆßÝPšyÊ}˜¡fowNƒŠPËá¶×9Gäö®§¹ ­»‰3ÒX­K{¤Öa ŒA +ó¶‹z„‰/¼Ñ{—­ Ê“´Ç´³¨Íã­ÈõÑmžkî£Vž ñ†QUnAÙàŒ¯]³þ!§Ìù¤ +XÚ3ÚWã«ßÙã[&Xåi¯¢ÂB”%°äF +·@®Xƒ—Ñâ½Ü:*Æ[C( Oª ¯ÌAŽ v!Kûb=þR¦6?M²,ä`@€­Ç5 +õ WÃŒ¡Ü:ìñ£‚ŒðÍ îf0¯*µªr^Žc³[ÑF[e%IÝ8Ö:Á*µ•èž¸’3°š‡´3a¼yw·Jà¼l€åÒØG½u88}·|úƒÙ¿H`¨ˆáÈÞÂë_ÆŸc +M­qju¯ãkÔkG;%áç[¹ ªSæ²&Ç×Ùèܽ ×q.RïçHçAšÊ& ˆº,aoçø‡i7ޛǗ Ò?¸þxIƒ¸º@K*, „R;”ƒ%¼5er\˜ã;»x¸[õ0mÌÞ8½ó"í)G/~uøòoÜáSX¦­¼¸èÇÕÅà@c¯bÐöììý¿oý†p ÕwócNƒá3ÈÙÿêé_î`±Û{ò×ÃëßÈÑôæ2û)ÔLa.HÌ(ûâòëÿFïaÍÍìꇲÜFõ~E惡2È6.8 Œ~\š qs->4¾×»7ˆÐ TaÑ-’T¸]õJBOŽ®Üá;1:Û)))ÌŠ¿9ymôŸ•µÞ>aíW5RngIûQŽÙÊ1e6ÔÛíÑKÆ[%qãaŽ+Ð>Üåø,PÞÒ¿_ÿ¡uú=ß8KQ0¡ôˆ±•÷ã‹Õ£’ÐRš—›××8øa#ºÃ'Öà™–„Ú.ªï¢cŽµÚa‘‰Á³,´pm`÷[ý§E±Ÿ‡á?â€ÞE¤FQ¨øXTéJ'¶BˆZd#!Þø"Þüî&\<bÉTäa¤Æ¹;}möo²¤¿w b5“e)‡k\ßÉÐÛYájrp †p»EbÃl‚˜ßÉ Œ½ê]þFé\qî†Ô'ñœøÓúð¸H©¿Ü¯Tõ)žƒ×õ¯¸`£þ,I˜õƒÕ“H£³‡¨?O»ƒA-«q]ïøa­¾NmæaA*IÒ˜7–_Ž.WâŸl£)D‡p­1„ýƒÀœ[#,˜½+Bí¦pÇ›¼Ø¼ú»Öá·Jûz¯êÿïÿLÚøÿïüÕîr×Úý@îZ»È]k÷¹kí~ w­Ý䮵ûܵv?»Öîr×Úý@îZ»È]k÷¹kí~ w­Ý䮵ûܵv?»Öîr×Úý@îZ»È]k÷¹kí~ w­Ý䮵ûܵv?»Öîr×Úý@îZ»È]k÷¹kí~ w­Ý䮵ûܵv?»Öîr×Úý@îZ»È]k÷¹kí~ w­Ý䮵ûܵv?»Öîr×Úý@îZ»È]k÷¹kí~ w­Ý䮵ûܵv?»Öîr×Úý@îZ»È]kãÿõŸIó¶þ™´ÿr_=™+“«ÉÏÚÆÏöEÁýhryµ¸ø™÷³ýQQ¼¸RfW§'“‹§[NŸvp´ þôëÇÁýŸs™JÇ=ÕVTf‹H—¶ÚÞÏz[ù³ùq ñ/ÿYˆJ¡‚ãelk°…”Ê0,,>Âúÿíkâ?ÿÇ×ýlj­ +ô´Œìtuëã1~¶¿ÿ±Ÿq P[X…DÊ?k›ÿEEldI;ϸ˜Òµ.·*B³ÈµPmLXSTé"\íO¥¿EoA[cÂè¸0C92.¦ˆõªØ(R¥6Y{ GK.Xö ·¦U}L»YÊÝ+2{y2‡*¨T£0á†t—Us˜£$nJÁ„qe¾Æ:K9:ÒZ—˜1.ómÜž#r7OiÌD¤6¦ c(7ŽŠr{«$Åu›…:t>UÕKLÈ9S½uÆK̤)»$DÞCµz‚ЪjSij½'æä [?-Éí ë§)GmœØãgjïJi›ý[&Ø z?E9˜Ö«È­<ãï£Ú~I,F™up¥Ž*ͽ²ï…­é¦I/Ë¥«Ê-RïWåvYìصqQ’zIÒÝ­hûU=K9¢¿`íq×Ó¨FëCÖžbr7ƒ9ID+P.£÷Ýî%¼c‰ñIµŸ(«2L³s¤—'½àú3&UuXQú;ˆ–D­<”ØZ™­ê•'ýŠÐÎî"ÃŒåé0KºYÂaŒgMK\-O…{Uó³ ó ÃìÅý¢X¦]”0˜CÌL"r‘´vrô§It§$¤0^ž!¼ŠÐA¸F“VU»9ÊÝÉ1ÔØ/«;y¡@¨Ü¯]\Ræ”6GÍÉ£uFå"[£­™X;`ÜI +ÕS%x `ºÆ%©“ÄÝdÕÀ•®®EwV¦<%\áz7ËxIÜ(²!iN)k†‰uÉí'q¿,âqqÔ#Ê9¨êSÔ˜U•^\Ð[¨¥«J™ùpm ‹Ƈuf8X¦ÆáÍïÂéM‘ ŠlÀù{ôVm?EµQŽ2qÙL;KXiÜHãqᎲ؄?åÙzž©íW´b\‹/C˜qm"­]ࢲÔæüµÙV›½]”ü m2îLé\¹ówjï jÏQcLhƒÕů;GïsB-‰|p.Þ[ÃW¨9GÍi«ÁLæ)¯Äpðåb¸¸ &éÀBlåØ<׆•Ú0Ûeµ›ç¾YàšE±S–›É„P}œ&ã²iÜNãV²W$Ëâf… ´“Æô$¢f«fþ„hHeºæ·/¬æ)ÄÕvšÞ/JÛYöA’L j¢HêƬ,J\‡1VœµLT´<é™°*u Š ¿Eè18,°Á'iü‰*D&¥ gÁ[óí}–"%5‹Å;š²_ÙÎeÒÁä>®*lô(CC7Š´¿[öf Cø;%#9¥¡‰Ù‹"¦)‹Û0 9®D‡jý\o^©õKRYÓ—þqrñåŸ=ʲÞ2®²8¹Å­q5>&Q%Üýªïš¼?çœI•¾1;ýÀ³nl•Thš½[­û¤*ÖÎM”¤õ‘æˆØ.ð׬ê!84:—Œ5)–àŒ­þ%_[Võ6ª`}I{.×ú‡_HѺĸܖj'BãÕ'yºHSTbƒ,imؽ²1à†ˆÛBåa™o¡R¼‡zU.ÀÔFŽõŠbCnœ56ßµ­_åEU|0g£%­ªæDn]×æïœþãÎò•Õ;OÇ¥u!XvÑÞª¬ ªÆ‰[§ôa\Cµ(햕ݲZâ"!©Šö Eî¥2WƒHÞÃÌ]ÂÉòí¢8Dä1_¿()­²óÌú›$f픔ϲ|5ae3˜ž#m€)ø™§Ü,jîç…,·›r˜-XJëoeY*xüaŠÚÊ0²t +³Êb›qsE Ñ?ÜMw1©×”ck¦^•‡ˆ4`½Ñ¹A¤Ö')l+Ï ãT¥6@@t;ˆ‡»Ÿì¡ŸìU%¡H8U±_ºY"Èá&X}XA«­"¿UT÷*6Â7a°° EyT`C„õ‹´÷0M¦¥ÌD¤:€'T…©ô%ÈÐÙkXâÿz+GÙC­y –Ü:9¶^äû?ýq©YjÙ¸¶X$Zãá怰aY¨qÝ’yQhíTÔýª r¦R¸Œ«g˜}DiW´~Il£J¿À„骦×7áü¹X[©-P½G»3.\ÃÏ*0¯ÐtÚç\0Û. {ˆRbꌽ¨HݲÉXO FŠ°2@˜¶ši"$´)ë°v¿ÈÕªR ‹4z”=&Ìx}¹}ÅÕJJ[iž*CÊ Á sæàéàä‡pñ‘[ ÜL Œ õAŽÝEÞ];ÃWFçI\ÌÅ…Ri€ñt`Q·KR".væ(á0R`½,W/ˆ½²4"Œ•ÒzJ WÃ>eüƒ½Š¾]”wŠjUl#ñ&ñvžvKlp¦ω±•¦Óˆ–BÔý‚°ã +”_á›ÉŠ±w‹JÑF>ÙÇv‹b–ò }”ÀíýŠ™¨˜É*p"L°טêBØ$ þZZ˜>THЈ!ˆ‡nWØZ‰¤¨ý’²—>ÛÇóDÓ ЗÁ}BêèáJö¦Ò;Ey1öÊJ +5Ëb—rŽ•Æ¹¬ÒxŒ{»yn;Ç®÷Yw¢Õ¼Á5ëÏA~ðö˜µârpzãL©_*õ+>8jçµ€FImox•ÀuPãU©ë^6VŸ·¿jIS0›õŹužb¢¼Ð¬(=¥ynôž‚Y£%t‰±Çq±GÂèCåŽÒ85:›Ë/@§™VY–@EÈ-Bëášó–¹ ì KCýe¡¡6Ïšï¥Ö™P?´‡×¾¶‹he¡ áNd§"§p Ô©â +Ò¨µ•ãI±©×Ëbc«À7!bPˆÐÆyÔÛ†™„½@€~Ž*Rÿ(Ì@áW!¨pûA–Û*HI܆·€»Y<ÈõÝR\J”ÏV–âÖZ¼9µ[—”>Man¸÷¾…pMP­Ü‘¿ç€4sÕ/¼E +ÑJL”()ÄHWÁƒI¬'ãçø¸6„‡i‡Hàœ9¡Æ*4ƒ[U±Å9 ˜Ã<åï„DYÉþn^‚¨Q·› ó„hö0Ãù&n;yÀR Þ¨HG ê:d´áNY~&$°GI*ƒY@Ç´1ÚÝ* +0iyÊz˜ªþùÃl).Õ„\ÀeÀÏmMi{Z–@ñðú 6~*ÖÖÀzœ·ªêƒ’ZæÝ®B·íø\Aó¼ÌÕ!y)Fr/Ï6ö1¯À5}¨F‡Œ7ÝCD¬aZ—óæ¤5"iIí¤–Ò=8ûöA–þóíÒV†®0uÔ²Õ-PzÜ™‚Fõ©ÊŸ?Ll'«k`~qýI1ϸ`µöœ>À)gMEgÎ:“ § ãÌËj{á ¬Jct{¤¶ÎY È%ËE çó\TUújã\kžRæhÕvÊB‘‹B”¢lpàà@Ù£×$¬»Èó¡R?–›gqÑaNõÞswþ];ŽKÈ’ñÙ†‚XÛ' ÊY +k¶~MCä(½ å¥pÐR¬îUA`‹q4°K XÈæNQ,³5Î]:måÒ«ÝÇ|í²£ vI€ø7XgÊø«é<Ès½€~}0W¨Ô.óuX P¼0ðÏÀÅï•`Ánç0³Â°â°:ITƒ)MV µk%¶‘#BÀ´i:Þ„ÁÍ?•§Û*ˆ<`ç!¨fØÿ‘éj)ðJ”;,¹ \œ(Ë`üw |ž0Ó¨º“£h¹ÆÛ#`ê½²¶[RfxZSK"ò/¶³%ÒÁ„F¬}Õ܆À(I©ŠJ(Þ?Jbæ§i|·,aR 0'® Jy’äV–Û/«ÿb'÷ î•D0¼e&LÅGI’b¯(—c´©IÞ€÷QŽý4‰ÿ|‰ñ7¡Fýíø\ŸM(õD™{,=ØÏ?L”Ó•TzàidËœl÷ãB¯( «ë=¡¶W +”Iõýª +üÃOct~a¬ ªuÓU™u‡e©ž%HDÞGuiVÿã.®¡4“¤ž¬ÆUd“UáCµq$EÎk½³ªÑ¯(]Üœä¹fŠòó€xƒgöøyQh`Jt8;ÜYd¹Z’ò€%Õæ¥Ö»ÂÔ.è4Ò_$kÑ·J2X6X­~B ”?k’¸µ•—öÊ*¢á©Ñ±Ý½Æô^Õ½Á%Œ·n‘wQ RêõÙ›hýuÕš‚½R‡E>H¡ ‘ Àyˆ1«`òüÿ_lîåÒýŸ¤–hlºùÔ~ï°™8 …ðÜ|>TXÃCªÍÕ;lب²¢Š¬ÿëY€ªDÓÓõ•‹H¨|ØÊŒ»DÈ€N*ÍĦÓÝ ¡ÊŽ•î»&:1¥Çãç‹Dt2PÜd3 ’ÚšÛºÊ$;_sÙxp¼ãŠx¨íâ +@PÑòºÓÀƒ‘€tÎœ 5H¥ JêƵLgÏÁ«_6Â-¤ê2éöÑd÷ªÒR¾»7êf¾:lÞ?êp1 è «´A° M„Áà¾QÛ€Þ;jÁM·r1 ÝJ¢XZmèpY~xÒƒ“ìxÒ/Ö!jAš; +†ð«#ŽÛ†mÆ\ #@\ n`k]LΈ†ô¨Ê…‡11ÿ8¥4bÃFÞyØÌ [Yði¥éSÃjXïuxÃ&ÿÁq/¨g_O!3¦‰ÉiJ© Ž;íÖIF's`Ü3laœT”!¶{o}Yn?[ip˜àÁç»( ³@é‡ØE@ˆW`aA7xLP'ÁÕ»Ø$¼Å0!ô¬Î#Y ’/,xF=œ“ÅÌ»è$d·âQ V3SS;wÑæ(Ä|4A—*T´#ç—ÜRŸsú_/Ⱥ—SÓ6ÞÿÎC·XÈÔÖO\y6^_;dð{(ðºýC臭´›«‘Ñ<Üá²+&6oòF ¹‚>ïÀç‚KïD«íqp ,äbÁë +Ÿh£cVZ³‘j27wúòÓzŸ¸oÔnE¼Ö´êˆ9dÀo)Õµÿe³ 5f_Àè,hø0øÛ¾ÞÉ\¸>ü>½?t@šQ‚­Å± Q¿q‡À«îê‰ÆÖW†íûGlC¯Æmk$ š±àÓŒGÁ×sJÔë½€³'HHeV©{ø䠕ŞܯCF@AÜ2J'}t’ ð;¦ˆÑ:¨çA0NC¶q+ivËÙ>'&º`Œ¡Í‡M؈³Ð#&r"¤EP4BL‘r¸¨?Sçà¨kȈÌ&<ò¨¶RûÆ2AÉUàê< ;8jÓÙh‘uÑ`ixÎà2a¥G!ºŽ»&3>0| Û´‹CKî÷ A;µBG#@‰ƒ†>€‡@—Í„Õ´¢!?Ÿ $gQ¥a£&4lê/,3²` +€ÊËg±PÅ+@XË[p•QÛ\jÊÉ$œtÂÃgìˆ]’Ö]Bæ°C²òÀœçAmA4‡í”ƒÒ¼|ÖÙ¯4L¤æ`Sˆ| NhT´*­‰¥ <>eaÓcn »`?ŒÛé!;í`Ó`ÔLÎ+7ÍT–‰Í2jÌÕ˜“1úz7ë6îu.HA€#úÀ„ë¶1ë¡ — Æ©M‹™91Ñ ¦;#Äå¡kœtöa KA›ˆXqó=‚$ñgÄF˜nm¡zyHFE!>'—Ö;úŽ  +ÞvPçœð ê½PŸ”'¢ P˜ð n~Ìäà;4憅€¾ÖyÂz$âfKLlÑJ%ظ©‚;aØÁ ¯ââ+|fxŠnò…G-ä¡1ÐeÌìà&l¬U¤X{ÔµMð¶^i¬ëDÀ¶Î²“qè&ªì2M wÀàê7òXG:lŽåôФÄäd1(b£o`…Ø$gãCÞ³@Cyùý£öA½o@ßÎ@¤HØ/”Ælܨ‰"¹Â1@ iPçëº;ñÀ¸wÈDîY…q&oÄMeÁ«L8åQ 3bh)nÐzHÇòDQК`Í'ä ^ð®!¿œƒ\mÄbF,i¥ó|b%TÞã²ËV"æ¢@^0 6ò–P ¨ +ª=d&í(„œÎ#x¹$Êg|R…O-ÒÚŒ…J X(—urYàCèkL[br;x|þËà‹XɤYGG\“ ¶ñȤ•HM@ˆ¶Ñ°¤0¶Cãžþ!nTóð_¶Ü:@“½•Á+u i3µõ¹+mñÇ õ®~3ZP06ŠÎÍB0ôŠ4ܶQic§Ò–êbû‡ò`FÂ\TÖ+ÕìDÊA$ _@OuV|ØîÅtÐå ‚Ÿ„•qЩþ­ì×ÔXè|CfZç [ˆ´“)|šÞ§9è< tÖ +¬8Ä^ˆÛv*m@ÂN2I†Z:°úzŸÕ°8ùq1aã¼LÁì×̾¨Þ-öCEØð¸H¹¹<n‘reÄ„ì⨉üçÓ?ìß7bŽuÞ7â±;tkËÒ‚(‡M”²†™Ü7êl2båF¬‚Î! +j²Ð}voìxÂÃz? dÜŠœ¨sûGÝFÝCì¶Q×?ÙÁ’騅 ›ˆþ1,³wq#fFgdbÌ΂΂Aö2yZi[ü* aRrªgÆÃýïðB©IÅäì–_é@é¡Ó…xÏ C²ëÒ&…Ée,Øô°90ùCf +¡ÒäÌ(˜g;PAˆŒv£õc\jÑL& ýjÏ+×Fí¼Î%2é5\›·0(–Jê\(:ˆ(,Úûûk ªŒØ9„ˆE'("ø=ªNx#:Ènn ;Ù‚BÆ/¹Ù,­†Äí²ãª&Bï ý: ãç²vR~Ó99_ ì•ûz=꼜ÃJšè3'gêï*6" Ù’éˆM4‘6ˆ®æÀ˜‚ÿˆS‚µÐ°t†þñ´rÔ&ìv€!•ƒ±sÆœAŸÔ`c T¤çf2>.oÅ”ƒzäÓa;ë 5;ñ²I"ØÐ;8‹›G¨øÀ¸ëÀ°}X#Lÿ< +ˆZ- [½K³aBÂCý£  ŠOš<ŠÝ§œþáàÄ?î× é}Œ¯¶ÿÓ!Ë <^œØ°…5ù¢Fâ¶Q¯ OšQÕŒ&lXŠ‹‚í,b™@Åì Ý6âÜ7l N8D+q`)»OŽ‚@ʸÌ3neéÈ4´Þañ`6l° úȃ˜ö¿\QL¾È€‰{ª< +«a¦êÐ1+ëãËd´3ê„'³N&ãb²Fæü€Á7`!!ðrñž›K뜂 U H_¡& Êæ|lÁŽ¥tÎ øp‹74bòC41³N"iîgÌÀ¸30h&Ü‘precÃ&¯Å'Û¨1;qØà>¤s@;[½²ŸTI!³Ä>†ßJ™ÁMùÁP è¼z?@K†>…ºM® O{¨,Ð…OëlÜ?˜÷v êûÎü¶ÃŽQ#=Ú'Zo‡Ÿ¬Ñ« bÍèSG’Áw†¬Â€™¶ñP&ÜÙ‚¤312ø ZqŽP½Sìô³Ðã6ÎÚ?Ã0¾s4lCÃP CFò#,Ë€V? öq@nf_¨fЈG†Œd_£!»Àò mÌ=}áÈ>È&|ÀBŒ¹ú† +r˜U™r Åa„MÁN(`؆omÄC>´žGÌÞf@&¼!T.¡bøÜ€vžp‡ ^xÞêåÝ„\1æ’ÍX‘jx¸¥”¶¨Ôì ¬©€ÊÈÚtÞÛÆ]ûõȘ“‡ü A{Ì!Y±4àøsÄ€[³â1.1•jí¨ÕUˆ«V€b÷CŽ#TƒE<† ÙC°VF„u®þ¾0à“K¸T@„ìÿw0jØBÙÉ„Ù¯ò!F x!.SÁŠQÁ²˜š4FàL›ÆoÐH€ÛtJP‹~43S‡ øW­_´ éýwгcÒ&4ag|ljÀˆìµ>츕ÖY8m31nßåüÊ!È ƒ?êí‚ U}|‚䘅A褟OÞRç~8…88Þ/_ÿ¤=jü«‡&ö¶DÝþÓ6!IDÅÕƒFl¿Þ?ìõ¾þ¡˜[Û= ,T7¢*H Ä +0ÿÿxPRkr 70á1S#f¨2±oÔÝg#T«?QºL£É¯‚©†¥C¤¾¡“$Ô_voŸ²Àxƒ»ë“›‰"»utÚ/Ç£CN~¤ß)¸ÁW¸ÅAIŸ6Åô,£õL˜¦s Æ!~꜔  ª_bÓN6=ìâÍ”œœópÐ×,4ûHÿÈ<#;®AœqQ± $±ÑÁæÀº[‰8È.É'?æá×Ã`ÌÐã€0øÁ=ÚE„/"B B ÔqÜFÉ„F°àQ'›¡bmBi؉Œ‡/ËÝ6bÐ{-HÐ áX@è €ÖûT°ÄcVÂŒD ¼#\–ÅŠ'½\ÑC¦ú‘ÄÉA‡‚©6CFbÄÂAk@§z‰Ææm`nû°ŒéÝÁ=:5d懭‚Þ ˆ•Møuè¡qßà:b"ŽûŒ!#&ÚàQ> ˆËmêŸMGîqÖƒGc KÍ[ȃȨ…1øÀ¨ï²€‹ƒ,XÕ;¤`bÎI†ÿéÐèWêÆaxztÈ@ Hhç+ æ +2ÚWéuˆ£ý tÔæ·#b¬Ðø>ÈÖ?·jäVv8¤ó÷WâžÖß²ñÀ~N4jtpû†ìýSËÞn¹~—'ìr¾@ÉŦÁ6X°¨Î +"—Lгr6üJmÄÎÃ$˜ÄA%áÑß²ñýÞ‡Wùà}äq¯¤'ïÀÿúÓß¾ôqi2X Â%,P±3Y—õ°iL.Zñ¤ENëzùÄ4rp‡à™#ÙÖ1DȘ¼¢Å´Ñý®± :â¤Ó¨\ÛÆÞÎdF]Fê‘'ï7¡’ÀÞ6ðöt‘ËV:þÕ1çþ1d+s1'“µ’i;•³3ðw° ¼ZíˆV;ê´]lx g š2zû|ÀH‘µ¿Áš/mF ‰Th«q qÌè‹¡bk+€ÕûÄÞ§> Xã VÃÅ$‰P ×n›À òÓO wÈèé½1 Ù?ÕDçêíÀ`ÔþQÏþ7Ù­w Æ U!QèAÙ´ÞNüFw<ð! +~Øè;ImDïû‡}£_9¤Ô!¶¾(‡¡ú.:?á_g³»ýapw`³ÁäCZé;+‡Ðß±šð”ûû‰zò¾ÁÝ?xéÖ¤xŒºd`‰8hüê!ëA¼×#Ñ['h¥Àa=TÂî,xº~Þ ÀtL~ͪó©:Ö¡¢ 6Ùu 9Tò…êðw61%d¥Âš•É™ˆ¸…Ð >G?µ‘ ƒ?ê`¡sÃà7—9ÎÉ¥ýÁŠ‹Ï+†úúC X „O“¡2­¶½bK.: þÕÒõ=µ´N„«æ~‹YɸO®‚I†,æ岈œò±PÐûÊ-d0ïWšh¸as†­`ðx ¯˜·3© ð9d’ŠMɹe‡¨ÝÚPÞ°0€FHyh¸7ê”Bóšq£/è×P0—¶KÀ<îæ h <> Cº™p‰&$d'’x°s7õϹ +Y‘€_„NÉÛÉŒƒÎŽ{CL…ø©G"`õ?#¶þ9Ðì€.'“¶À€=ŠÞ/6úDÌ܇qÈè×ÆÜah:,ÔתsÁŒ:¸Ac#{Ààh9ñ„ͯy¡e¨äˆÑß— — tõ·–ˆ”O@®1'?8áUÕ»‚ý%œ@ìhØKƨ`qÄ‚YI„KqñIÀ­J¡1ó0eC×IŤ,d«Qð9>*èâŠv&g€)c‘ ßxÕ³oÔ=bcõý³gÃn6ÃÄz|¢'$zh°f„up ãvvÈÂèR­7Põ‡ë‘ê2›îAb]_¨æHDr~)Ú:ÂçW|ÁªÒlh@Hv½rXÂÅ‚ÓHbá*¡Ô¼ržÖ`åSx¸Êg¦ÑPàŸÅ¦fÂ¥Õ@~žŽw]bÑÉæXuŒ="ÿ¡¦h°Œ‡+Ñòª/X2âªÍy 4ÒÅÕž/ܲsyÐ;,T336ZãÒóBnÕ¨Z¨¤W®¸¨BSjfJµªSìLž†…ËT¬Ã¥æèø4`ÕË\}ÊJè}+•¦qŠcnâ¡•ÔF]‚ÉÕ# +pxR|ÞÓ+œtôZHnÎË¥Ï-D &ðòyN›¤ÕxB7—õJEÂc¼a‚Òº„Ú²1ÉÃ"@¼ð¶q§wŠE<Ú¤ã“n©àâx53ã+ƒ5$£m¯T†a8Ø´WÁ%‘ Á%Z¼² Ò„WF ×ø<Ä^›•wÐi+‘÷(:ø\O^b#>¡È*-q&üÐz9ƒ' +iòl¬)妸d›ÖªÉÉ-6уDo@UXòJ5''/©5Qk9¸´‹øÃUÀÏ ……YÀt@ÔÌ>H´ÁÃÓÑ’ yX •ó¡9:šˆLa¡&üÅÍÅ[äÖ ùž~êBn4˜ä”˜Å¢5)¥”fb5);mÆTêæÒ–)¥j'££H(<Ä€=iûà àøtZëô/á’€O3¡:˜4­vÍ­¹ã T€j »!¡Ø9"9©­6•ÆšÚÚÎÍžhï\ôŸVF‚%_÷€| +¯M¦;áÊ:›Ñ™ð‚Ïí~Å#dÀyD ‚¢”™ ——¤ì ­” 5€í-ýSÔrL¼Ëg¦ü€‡þî¶æd!¾eµÅ:d¼Çgf£õu­½EÅ*”Z’r=>;Åe§¤"Ô±%æHÀ’Rõ…J6:¾`ß’ ™ÙHi­ºp¾ºt.\Zd]T©£¡2oq‰N¨².·bíÓtbÊNEý4]XŽŽ5AŽ¹ì‚WizBPm‡ORQЩÌšÍ,‰i<Öã“¡ìLuñ•èŽxe(¨ŸžÇ£íþj+ý“–å"p£ Ox8ab5>Ù f#õ )¿àSjN:¥¥‡ L%Ý\_²lü•ÉA¤bßF’‰[dÕ§ú@~9Zß×ÖÕxÀr¡ÁtƒÏxƒE*Þ¡â“‘Ú&  ŠEÆš:h'À[öO™ºæ3À´¡Òr¢s´µy—ÚÚÁc ¹cžÕZ;™ù3Ù…3‘Æ:›èÈéNyþheñTª»ëâ3h „«-¤FÆ;l¼ƒ‹j~ÞA%ldœŒ6‰h Sšr~1Ý;kïˆééT{CÊt ~PÕ£uÂ¥åHs;ÒÚñ+fBãã“6V±á.VÓSl²©m—.4wo„ê[ÑÊroëN6Þ5ú“T|ŽIα (âzvöv1¿bgÒC8ÓMªT¤,-òÙ9¹¸’=ël²S¹Öºlyÿ¢ˆƒÎ`¡Ÿ]Õ÷ÝÓt¼§–WÜBGÈE„+;éÞ™ÞÞý+§Ÿì®_ìm_sÓt¼m¬GšB~Vm¬U–.¶vnˆ…y·”uñIŸœáS].5œ<š™:.æ§öîÎÌw‡‹n9Ç%Úrv*ÚÜâKërm›ÌÌRÉüj£”q7¯b‰OÖfÎƦOkS§ƒ¥ÕÊüé`aš‰×BÕU>»ÀeæÅÜb¬¾ž›;ml<€èôþ€CQj\ÌÍÇZG’Ý“HœC–Õj6*„H J­…+«ñÉ=­³—í¨.œC¤<¼¡¶o™xOÊ.<íc©ÞépeÛ¨Ž¹Dà@Py97®­ñÙY&ÙåÒÓÀ3„ÖrŠ¸ 8Éff•Ú&¬pvö4©;IÅËj4Æ+”¤ô|qálzæX²{4;.Öܜݽî‘úmïil]é¹kúè]íÕÛ¥t‡‰5Ôú:(ýëo—'§K‹—²Ó'µöNué4¾ÉBCE`Q1;—hï•–n/.ÍM[:}oqî8,²ƒKøC%@] ²žš=m톊ËÙ™ÓV.aä`ºócÒÈ&Ú;ÍÝ»›;×OÞ{åéïp‰)&1_^½mìyåš/ؤ“3¾pÓÎf'ÐGÌ}B9;,Î+µ­Xkˆ×)äµÕG^zGÌ/Ž8Y1Ñ©ÌŸ“²«|n-Ú9)—6@Ùçv®»¤Â„G¦úÎj19y"Õ;SX¸î]=qïÆ¥§ˆX+R^­­ÞÑÚºÜܼ£¸pº±u­sôfcñüõ'¾­µ·½R&œŸNvŽÀDòsg*+;× ³Ç»ë·Ïžº—PJ•ùcÝkZ÷8›[(,]è{01wQHµ”ò¯:Xˆµ¹ÜB°¶¨®%{GSÓ'¤üT~v;ÚÞ`““BfÚ.‰Ù©@~VÎÍU—¯Æ{n1‰GKáÒ<-Sjxh¦®nfz§³Ó§äl;˜í0ZSÊÏ©ÍÍHm=ÕÙ-ÎY:yOwë2°%©Bá +³§ê+ò3'SÝãjsÖzÍùÛ›kwب(@ ‘™>•œ<mn××.On\;qõ™âìI+›æ³óba`½ÀåÖäò±ìì%Z©» ŒH 8µº$䦕ڊ”Ÿ —2“{L|T º­,¦»»±ú§ÕQ)jX˜?ǧzÑêJ¬±ADÑêjbr'P^ò†›Bn6;½«5VÉHIël‰™IµºPZ8‹,Îfz;çï{Q­­Â:Ô—Ï·woä—.Ä'(•R›mí-x(^_±“²¯åº0—óÍÍ‹¥ÕKÍ»!¬I™%È°Ã6B„Tܨ¬ÝUZºitŽEê›ÁÂ\ª±–›\7cA#¦@˜¢@hr`rÃåURë0‘R¡»-/Ùé4“ž ÖwÄR_yC¥E*뽂‡Oxy…Zdç6al陳Éé3 —Ì,N 0™h¯ÄšëJuX¥=»÷Ø‹oÃúØèh(7ÕX»õµk¼`mµ8¹uóÁ¯Ýõü÷9[[9×Þ½§¼vú·¾q­±y]ÌÎ;÷àÕ'^“ +½7O©Ð+‰É#µµ‹s'îËÏê,zøÙ7’½]À@~êh¢³“ì›9rÏîÏ,ž{>\ÞnÍí®ž'"UZëk±˜]P;¥¥KS'^<ÿL~þÜÂöÅîÊ)\)AÕÅ.ÕãÓSjueæøƒÓ§T׃à´–/§c RmŠ9ø¢+DÊ›…ù3n¬`ZHCW€¯¸ô”镦_ºïÅúÒi$XÈ/^NÏœÓÚ{õÍ«Ð)Lnœ¡_.*ùeètSò3j}urûòôÑ•• ¸Öõ«åîñs÷|磥™òüéÒÂy:5Í×6¢õM9?*Ìr3&¿ì†Z$'cm ŠÎÆ»—Ÿ.ÏŸYܺ¸°{-ÃË-À|}íÒæ…G.<ðb¢¾6¿~öο°/ásÀ]kí3¹…+ù…KÌôâÖí{goD²M/c“LfQ,¬)•ÍÖöýÁòºƒIˆ™i¥¹ øgµ6ع¼ë¦Õ×ÎÜóÜâñk2ü‰H¥x÷¤Ú9ÊgæÁ«³ÑöÎéû/ßÿ¢œè’JMmo+­]µs¼º~ ìÈœ5Wx·ù…L÷hqùRbúö`uÛÇçê3§„DÍŒs„’5Ös½£¥™#Åé­ÆÒIpûc†Ó*éαôä ­¹ *Æ¥;ÙÎæι‡fŽßps‰ÔäH€Rß(,]Œu‰…%!Õ;rö¾Sw=ŧšÃ.ŽOŠ‹Bv:\[..ž··¦VϾü­ŸVNqjuzëòêù'›GnöŽÜ³|ö‘æöMVë;sïÉ;Ÿu¿šš<oí¤»GÊ+³sg˜Dgûô=Ó›çÑP!ÞÚJN UÖ•µìÔÉéc–V¯òKþ™c¥A N ¡v|J Aˆ›‰76´ÒT¾½î’\¢%AÂMvéxG)­”oç ö2¿t„ÒÌq©¢ÔGPUG$puR­í˜‰ˆƒŠF +³bj²¼p¢¾zNilø”&"–²í37^à“õxc¹¹qG~î¬TZa´ozE$T‰7wBù'ebe!Ý• k23r¦¯¯ó‰Nwñdoõ,©¦4Ö/ÖV.T—oo,Ÿ.Oï„R<÷æ;̹fÄ"^1‡‡k‘ê¦Ú:m•òK>!{îÊcO½øTuÎ(dgΦfÎeç.”WïªnÜæà¥ÎêÅDkkÂ+$ÄD˜|»²xû…G^íæz™ö†S|¡ +¸4\_‘jï.¿9·s•V*…îf¼¹Šón!‡[rn1Þ:’hî:-œh+¹Y‚Š€†rÙ%*1ƒ‡*¡ô” Mx(<˜ŠV檋§fÝ£uw½¡Ò¨[s±nN…F“mµºëËÍlm^ž?ó T\ÀC…L?êÖ@ûæO=ÒÙ¹‘êKuvòSǤ씕Žš°0Ÿžöˆi¯˜ +W– ¹µ•ÛË‹'ØTËÃG‚Ù¶Z[Nt÷rsgSÓ§èô,"d"Ù.ÐdÈÔÁÌ4ȻɨœèäçN¦§ÉEP wX8)Ï Ù)B…àÖ¢´–[H±°“TwNÝ+æfýn&IFjàsPð9ŠKÈÄ+ù^nrË„ÒíÍÞÞ½ù…;Å­úÒåÌüY&ÝËvvŽ\{ —t·®ìè_ô¡våòNjáz¨¼1Ȉ˜Jµ6 CA¥JKçkk—gwïÙ¾‘îWë[\¤¼qêfqz×à€–ƒ<%dW¥Âj¢{R*,`ÁôÚÑË©ê""d)VuM.¬°Éi9¿’èS²3Õ „Ê[&ÍÌ;Mˆ5³íBw äÜ,PÊAF¡ï ;€!Œ56#¥¥Xq1’ž‚µªÎžLöŽ³éȪH j%ãh˜X·³qKu­¤Š)u.5Uœ;[˜; ÒìHÙñÊÒ‘‹øù8 )6y\*-ƒáïžx°³uY«­ûÄÜÉËu–Oû4)çÖð0ÄO͈Íx˜ì^T€¨£ÍD÷8è|!'“ Â¥p¦=î¢,þ©cj2„Œ6ÉÄ;nÎM…äT-Pè +Ó`o ±©)µ¶ÌÍðj¹ÐX™Þ½¢Ô–ñhÖ­-¦g¹ä\ ´h„28“õìôñìô±ÌìI,Þ¶ó 1ÑR+‹v:¬{«g^<óXzú4—èºØ B + Å6a&7KrÁÜ”\˜ásÓÁò¢SJùC¹êÒy¨&.E++…¹s¥Å³éÉm!ÑðRTwp&$0jó;€hiöTfêTnṺ.ældˆ7Óí=9»ä T¡F(d1Q˜ÚÍÏ3‘ŠŒ„² u£ajQ;бP™‹·…ä¤W2£­jm ìJeöD¸´b!Õ`¬¾uê%ÛÖ!B°²¦Mž,.]n¬^—ó˨ÒtK9^­ížº©f\”–hltÖî(LPk›@‰àó£ù¹úÜèˆpvfzïÞòÒe¥¸*&¦ÄÔ4®Ôa¦qpeJ^ç¢Q1..rs•¹ÓíÍ«¤Ò0‚åç®ÝÿB Þ¶ª?XbbM&¾w£¼p¡³~Õâ $Š3Í;ñhÝJì¸ìå4{+0ê¡“^*nCSë—@Á!ŒÛð •Rûg=c+mZ›µs_v:ȸœ=lòØ#ç ÞƒWØ`qqëJ¸¾h¢ƒN^sñ)R³p ˜ÔYq”KQö•u)³àæÓf4„ +)ZÉcRsâêc½½ ZkÎNû£ùp¡]˜Û 4çM%)ÊåÕMmzÅNz¥—œô¢ù¥A½Ã„p`-@슳§¨ha%2œ³ 4¨1ZNÈÔ5*´›KÛÝ“b±åà£bª'gç¼\Öè•Ƈ'ÜDÔ*Ë‘"˜œ¼ƒŒ€=S›[B~ˆwÉNE9ÈÚÅEH + V]=yuæÈE)ßrczLÀåæ½Bæ°Á;lôé씋V½\Rç o]q "m>1)¯³óL´²zòÚìî¹D{Á+'Æ<” q™6®UM¤ìÄ­u˸RHÛI‘*Å™óÍ•+Rº«l`2ÌFJ³ hµÆƼV‡¾N÷6ÓS›Á\K-ÏĪkñúV8¿8n!¿2`Ú?êĤl(9iq³‡F,C^³[æ"\k;YÛÄ•q=bò»é)í7x܃f Õµú1µ´IÊe“GâM.’ÍÔºsÇWöλtÏÕ‡Ÿ¹ïÙ¯?óÚ·ÞúáO?üäwúëß?ýâ¯ßýɇn>Sž?J©µþ%êã’éÂT¡:Uj-T§7Ú ‹;'œ¿zý‘g.=ôÌ™ûŸØ¹|óÄõ/<ðÌ7Ÿzå·_üÖÛ »g—÷.fÚKT$ïåbB¢.¦Zx(-ÅrùöloykqûØî¹K·ßóÀ]?óà×^=uß“G¯=ré¡çŸ|ù›¯~ïo½óþë?x÷á¯}snï<+¸Åâã|t8’jÆ +.šˆkÍ…ÙÝ3Ý­ãÕù•ÎúnoûÔê©;xêÅŸ½ÿÑG¿þÝ7¾÷ãÓ×n.ì©…ž‘¬Þ U|L\+ÌæZ›>.>ᤙP¦±°[šÝLµ—Ôúl²³´ròúÙ»¿úð³/}óû—~öüýÿrñáç…tÓ‚…íþÙ̓…à"u2{´êã5%×Ò*“¹f¯<½Ö[;½}îž{Ÿ|駿öw~ñÞÇ¿}íû?=qõÁÞêélc™ Á.ÚüA"â .Ú±É+!lR-.ä§÷bÕYµ:µ{áÆ#ÿúÚÏÿÛ¥¿úÈ o>qîîG¯=öÂko¿ûÄ‹¯Ýyï£;—î##E+*Yãb¢ÎÍóцVœ &j±|¯ÜÛX9~Gwqe÷ìÇî¸çöë|ýïþæË¿þöýâùàÓÏzö™Úüa6l¦½l6œ]JVw .iÂF:ý.ârÑIÆ\„⸔J»ëG/ž¼òÀÎÅ›ï}âþ§_Ú:}­±|®8sœQJCFü¶A'#hÍÉ¥åÍÇNßqñòõÇžzöõ7¿ûþŸ}ò›ßýâÃO>üø×ÿù·ÿüôó/ßøîáÕåãwf§ŽØ©„W£‰V0’K¤‹Îìæ± 'Î_?wõæƒO<÷úw~ôú~öüß{â¥×¾õöOþÑç/ë‡oÿûÏþúå{?ø…7·/Üf,Ó\­ÍÉt–åd9]nέ¬¹xñÞzú…_xåõï¼óÓýûï¿÷Ñkÿþó·ßýèË?þõÿú¿ÿŸ?È?ÿò?ÿÕõÇ¿V]8Îõ€0Q&MÊÍ©Å­=x¬=uáú}=ÿõ—ÞøÖÓßøæã/óÅ7¿ûã÷>üÕGŸ|ñÅÿûÿü÷‡¿þ≯½vòÎRµy>\#Å¢’™KµvÜ´æÁ!5_kÏo=sÇÝÞ|âù›ÿòÒÝO½øÊw~ü£÷>þÉ/?úã_þòÇ¿þ×/?ýâÓßþþßzgõø]`¥LNÓJ5T˜ e'k½ÕùcÛ§.^àÑžþ×'¿þͯ¿ùößÿä½O~ûó~ó«Ï>ÿßþü_ÿë¿¡[ô‹Ï^|퇉ú²ÞÃÙH`NƒG°ã +*eE­ž®N¯ì¾úÐ×{ê_¾ñÆõÉ»ÿú[?z÷Õï¿óá¯?ÿø·¿ûùÿþúŸÿùŸOóù ¯½uòŽ›ñÊ.ÅÌÌà"xbI¡¹Ô]ØÝ9qÇå›ß|ü¹WÞúÁOõÉ~öþ›ïüì׿ÿÓ_þó¿>þÍç}úéüçþìÃOïzä™ÚÜnº½-&»–þýÙÈq3A‰ FN*ÉF¡½RŸ^o̬nœºxíá'ÿõ•7ßýà“O>ÿò›ÿþÓ_|ôëÿúßÿýå_þöµ7¾{óñg.Þõp05I…$£Lö–W6Ž8uáÒ•+×ï¹ñðc¼õ·~÷»ß}ù§?}ôégïýò½—_åâÕk‹›»Éj7œŸöÐq‡?Hð*#D­\ilï¼z÷Ã÷<üä½>õ쿾ü£Ÿ¿ÿß½ÿúw~ðýþäË?ýLçë¯ûå7Þ:{í¡™Ísåé-!ZR3íLc6Y™Œ3‹Û«[{[»;×®\ùö·¿óíï}ÿû?|çÃO?ûâσr¼ûÁ§Ÿýú7ýÛ|öÅoýèÇ×~xfó¸’ŸäÔÉ ¡x±69³¼}ôìå½Óç÷ŽŸ¾zãž×Þ|ë—|øÁ§¿}çýßúáßÿèƒß|þù'Ÿ}úÙgøñG¯¼ùÝó×,öÖPVCÙx ÑŽ––01C‰ñ¨V¨Ô:›;;=üØ›0Žýü¥o¾õÓ÷~õåŸþò—¿ýý—øå—_üâƒ^~õÕ_}}óÌU)ÕDø$• 5¹n$×îÌ­O/®ï:÷ØÓÏ}íåW_|íÍûæ·úÞ/ÿú÷ÿõ›/ÿüîÿðÇ?ü×_~úù¯¼õöƒ?Wém;)ÕàâŒÖŠÈ."Ql¯æjÓ›GN>øÔsϽòú o|ç'ïøåŸÿòå_þã'ïð᧟~ùÇ?~þû/ÞýåûòÑ»ïýâ᧟9wõÞxy’ §Íip’V %«±tsaíÈûŸxã­ÿÉ{¼ý“Ÿ}öùç_þéÏÿæw¿üä7þË_à}ÞùéòîÏÞ}ÿýGž~þÈ¥{çŽ_gÔÚ°™°ùBv¯àÁD³÷SÁæôêñs—o<øøKo|çå7ßúÆ7¿õ“Ÿÿâoÿû¯¿øÃOÞûÕ/Þûå}ôÂ+¯ž½ãÚòæÉp¦›ëì…”L­9]nL投ÉyˆQSKóëÛk—¯_¼÷á{î¼~éìÅÛsÕ‚ øÎégݸd°;nr~BV£™B¾ÞlMu¦¦7v¬ïíÎ-Ï8{äÆÍ;î{àÆ…«×.ÜuïÑ‹WZ‹+ÁDž‹–C¹9.V·#œÓÇ!¤è'yNí¿se÷t*—¯— ;Ûkç.œ½qßÝ=ñà÷¿ÿ½÷>øõû}üÉg?÷òK'/]è,.â)^öCt%n*Èâ»Ç.¿pO©»Xhv§§gÖV—NŸ>öüóO¾ý÷?üøÓÏ~û›·ôö7ß|ýÕW^~î™G¼ÿ®½cµîRÍÇû¸˜Ú!×àz'eóТ¨ä²éíÍûoÜõú«¯¾þÖ[¯¿þõŸÿü?þñ÷/þÛ¿ÞqñôÞÎzc²›­·½”`pb˜ƒ‡‡VÜ´âç‚•¢‰\¥Ñ[YÙ¼xû™Gäùžýö·^ÿåïþÅçúóßûÅŸ}öÉ —Ï•UÎ{Șaƒ“=8bÖ#£FÔG„U­ÓŠSsK këGÎÜ~û—ï¼zýú]7¾ñò‹ßû¯¾þÚ×_zñ…çÿåµW¿ñÀÍ{Ž=ž.4Q>bñsvLB˜(!§’å¹ VòáB,‘ÛØ>~åƃϽðõÇŸü—+×îyòÉg~ôãŸ}ïß{à敧ºï©G9{þÜÆÖfkr6Yž®ÎŸ ¦{·N‡¦A—í¨dv—ÎÕ¶¶Ž\½vý¯¿^é©gŸ}ôñG_zñÅw~òÞó_û·«Wï^ÝØ)ÔZ$†8cõÆhó9Æíç|¤(kåx©Wï­L-ïú¥ §\$oõóf„…:ú8ÕäfõfÔƒ}tÄå—üT'à >6M•CZÞ…àŸß‰ÀÅ0­–ÌDxÌA˜=,ÂÆÝLTç& 6£Cˆ€a=¸Ä©yðÞ¤¤HAÅa,ˤ2©|¥ÔÛ:yn~s'šÉziQïÄÇ~½›²  "ë]¬Ñòál Y#¤8„(IÄ’!%Qc©l:‘Ëgk­öÂZXKÄ“©Vg²\*¥×Ï»ˆ ¨„œ æfüÜWGl&¯(«u>X +éZ¹QÈ1U‹©«ë[ívµXL·{“Z¶ƒ$å8&å[¾|õ®£ÇŽ— +™ÉV«R­ÍLõf{­l¾æô‘£ˆ: 60bsÀ?ŒÎþ•ø8—"%E+$2¥x®ÊÊQ—×ωŠ–ª…"Ùl¡Ñé.u{‹‚$%R¹`8é'&{ØJöoÅàW¸h]ŒÕp ”Ep¡9‹GˬVÔ²ÍGÙ}8()ù…(-:iEïå>=lÁ¾:bлÁë:‰Hÿ‚6ŠŠšÑËÜŒÝ/OØq³‡4ºI"ˆÉ¸”%C¥H‘ ÒéÌCcNÂÅŒ—‰cÁŠœ]B¥âˆ…°¡’ÇL¾1½ËlA &—Áìr!LP-3R ¥dŒ‰Y ÎÉŒÃL ‡ ðA2Â$ì>y‚™Ü¼Þ-é=+3úB.JEùxº:³¾w^KW& 62H'§aTXï0î1¡1øþù nHïõÑ1à.ƒ“³úC6\ñòCÙi5!R¼¯­ËÏc5?v ¼ÃÃv¦÷p6vhÄoå‘ʾp‹€\ky…” Y Eç`@d…Ä””]Të{‰ænqþ‚”™³â(!fJÓ.,¸oÐ8Ö¿£EHÖ&[‹çKÓg|B~`Ì=¦÷dŠs*v`Ü=f£Œn XUT[ñÊšš_4Û™‘1‚‡ìˆ¤·Ó4èÄUoÿT·þM&åôìá ß ÁuØè2¹FLn'õ‰Y2\Š”ýBVËÍ&«K”R"‚%7÷°)T.ôoÊ$¬xä¶!ã1[BvÆOÇ©@ +•P>•«­gÛGôÞÃz—ÉËú>9Íj“D¸äÄÃŒ/·×°`aÈè6yƬ>ŒV6äü"—èÀbÆrM9^¶¢@Nïæ­XÌI¥hµ›hœtÓ‰a3jCx-Ûuâ!½‹³a€:¥2‘*iÞº¤‚*óÐQÔVÌ‚P>HN¢ôa£Ç††­+&:~)o#¨\1 ¡+é¦"uÛùÀ°uÂè.2Ø0”Žù…´›ŒXÉì ìq™p+vq–€Ÿ~1ï¤4½ƒu’Hýý;éYè±þ…SÁì”ZžsÑ‘!#2j@0F›0a‡†¬‡Æ=ƒFbÌÊ8ü%µàµ³ãVb`Ì`°“?ìå3rf!_µú\LÈ©ŽOÎY|A£•s|>2Vllã|bdt5‡ëfL5ùÂ&$è“KBjŽ÷ì„Š°1)ùéÓ‘ò"ä6F$8d@ÄP±9{ÖM¨†mˆÁ¤,Ô:üěﴘmøôâi—±Ñ¨u±I¿\ÓZm—QZ: =‹F(£Fßð„ۉʘ˜¥û§›v…ä,®GD˜§ýáôa‹OçâoÝ´Á%'ÃùùÒìÉXmf©hWÄÔ”šACU+•0a±!39bÆ¡Åú×øëP?›F¸´‹ÒX¥ÊiƒoÄŒÚñ WLó™_¸2á“íDPË6ç6o§bÍh(,äaTÓ¿Å Úä>vãÈ…É•”wâ€7¨`r™Ž´ØX~¥¥t(Ñà Œ;Çm„‹ìç):Ö WÅÔ‚Ë$J rª=dñõ%Ø'z˜ÂÄ¥æ— +"Š3±BcÍ/çÆ̈Éõµq+®YüÑ`nÎF„Œ;XåT£“2»ihêQ(º“ÖÅ¥bÿؾ ¬³‡IÙpuÐä›pó.¡ ¥fâµ"\6͈ܺÐà>…IY½«Ñ ªábþ¶C†ƒCf˜©˜˜¥•–]ò¸™‚4AÉ„#ƒW4¢½W°á—s³Y7ì,ßžïnºØ&ç ¹ŒñY\ÈaBÞ†EáUC.‡:‘Ÿp ýì0™hu··óP¦{Ê‚EÍ>‰ + &Üe¢-)Ñ %šB´ÎE>.iòHNRÓÙض!gÌ€ÂO3l,Ç›ðB“/D…K.ÖàæÌ^ `¹oÈ6¬÷; ÕEªÿt@7<áBÈ0¸1»0ê‡müþ ß=궺s¹³uÇ€÷ŠþH›Ë­„G´ÎQ©¸HEªíÞÎÎÅGœbJ‡:D¶Ói—§"]1»>*À xØ‚Æå!Ðþ=^ú·¼f¢5„úƒi_¨à–²X´Æ$šˆœÅÂ>3§T·™XÛË'º6FÈYA­ñZÍÃkv:jÃÂ(Ÿéß¿Åyp ôb êÌEª˜Ø?| šmpc6ÜLÄœ|ÁnÓÑ6§69­°š’iƒK³bv,ìåR>!è +'Û+»—‰@î°³ø=TÜ/'׈P‘ò7KpêöÉjqf@çÔYüŸì&£t¤N+u;„ArZ’ÏÙ¯sRàW1'$».FÃC…Þæ%6Ùéß”æ°ÔÓÃ&P.-':‘ü¼Å7øP*ŠrtÞ[ßAÏE¥É©Hv†VJœZ³`¡a^ÞŒ|bžŽ42“Ç[›Wðt_ :½—íu‘±q; k®³30*?3ûunp,je=RYwñÙ oHE ­“ìª._`Ô† aÁ¬9(˜<œáõ¶þ½¡­éÐÁ ׄƒ6yC   ‚.\1{Äq+3îà€úf6®ðJé+ƒ¦á>™(blÊÏo]ß­Ô!P“›=0lž°öþÆbÄŠGÉX,ŠVœÓ­!X(JuIYo¨$—–ýѺWÊŠñöÒεí+O;…¤‡‹ó‰N8·É-ÅJ«\znÀF|jrö©ïuŽÛiÑ¿¾2ši®\ÎNSs­Ó÷¨üJ)R[‰wv“GRS'R3g˜Ô "eb™Îý½Ô\= -éÀ6<ì 4"\WŠëŒ:iòJv"2Þ¿¯l  >±äJþ@MJÎJ™3*Ü°[WôØi ᳟!‚e6ZO77¥íÈÌ8¾uŠ5︤¼™P-˜¤söχ·ø#D¨ÌÎ’RŽ–sR¼â Býñ À•Ñ-û„Œ“R½BÚ,JÅN©nNç †A:-8.åˆ@AL÷òK]â°úÃN<⢣ð,hò‡0)‹9é þÕçA½oÌÎÚ±(&×ØhGHôZ£éÂÓX¸ìå’6Lñ² ¼®Ö2{EFLž»ü(«n²Q;¦€ƒ™ôqñajòT°]ƒò L´¼km1™)(%©!à„S]/“6b6Ö‰ÇQ>Ï(.:õÿ’ôÞOŽ£wšç?qc$•¯´dÒ“ ƒ7„% @ï½g&Ó»J[™•YÞ»®êîê.µwòf$µÆh¤‘f´’vV3{³w³º‹»Ý¸ˆ3q¿Þ˾FG6›M/¾ßçù<0ïk‡µi tPÞ˜X˜±¡³Nââ¬üЬÂ\IL/h¥5ÓND•ñ\¬HtÆAŸMÆ4*Ús#°L8ÃESÓNÿŒ3Õ%ãCÃy/—œƒ%,ZõKY;¥ …%f|ûßJqþFqñŽR]Ç¥Œ–Ÿç‡V÷Qª‡ç‚ÂE'Žp©|k—PJçg¼è§S!¥’lnGò ‰òâÎÍW°ZÄbÅT/7:Í/^7ºû±æ."—a1Uïnþð§ÿ¸uûm+"z •’Ët´-nõC\ipZ3ÝÚs‘ú¤ò‡rD¬Ç¦WÕêÕìü=©¸î¤4ˆ¥DË Ô> N{_(AGkŒÞDÂE>5Ì56n<ú¨¹vÏÙ§"–¹Ü +i ¹ôr8»ÈĆDÀ'„Qq"RvÁQ+$š¡Ða-7Ï(%PÛ3.À±fHï¤Û{Z}btk€¡๡xŒ’Ö=Fx¬ðrҎϺp'&s‰.mDrËѪ—6ÎÎ@ç³æ²1C<"B®ár‹Ô|\Uë”ÞÅcM(Ÿ +àc3L¼ÅjõH¢ÕîBDdbÎç +Š 1¡|hòe+ra¢"ERÌš\øŒFÙ8ÞH~–‹|z•kh¸$&ºˆÏd…é^:ã!tnXªÙö3À2êzqør&›ÁæÍÁ(hçñ˜u’\´j JvvöÂ4d…x„Ë|GÇj@ɽT\I÷­pnÚ:ãDˆä;©1I•Â¹•ÌàºJ…a´™T?”FJ«t¢è¢ÕÜzôü‹ÚÚõ fŸ=È{Æ÷ Êà8ò‰gôf<´ ¢¡¤% Wè€4œ FZ}+ZÝò:€÷ÜpQŠx´D-!;oÔ·‹ƒ£Öê­•ã·)éÄy)ÑŽæWÈñŒÍq 3Þ!eçåÊš_²brn5?ºSXº)oÀá²+”¶©Tµ ZoÃy$’'€¯-6ÕÁÕ2—éÈÅ~¾¿-—F>J.övë[Ó ·°X‡Ðº„Ö1ÂõÞÞõ§ŸÇK£)ED;>®`«±Â–^?V‹`³Ó€RX½ià8³À¹Ë­µû;w>Ju¯‚Í[ؼÕZ:™vd$g´¶’ÃãÔüimýqÿ=£u„ æt*VöòÌÂ~>Kæ€ (Ú1ö.žAU³§èLB\×{ró@(o{ø¼‡RY½FF«ˆT@¥­°‰ŽÞØæ“]—¶8üü,ˆ“H ¾ $5T™°cÀ’ PÛƒ6íéÀåÅìb¤°ŠÈ58\ %æÓ½Óxm$Ùó³~ˆNzv@)5P9…Je&VÔ’}<ëW¸[€Ïá@Ø“}“‡ù³³33Vxr.²íœ›¶$<\B…<.•áPjÎÑ?Î-Ýn¼Ý;ú&ð P?g§•Á‘˜½üxŠKO`—Å¥û ­ƒl€W©pÎ…Fæ¼à±9Dó„ÆŽzKcÑs€,H€Ð<¨ƒXÁ缄aö¯ @vá~Jžv‘æ º—Õ1¹(–S+ào +“½c­})o†×¦§ÃuQ~BfÔ‚ —­°d È&HšqqNTü˜&-å¥dÃE„˜8‹A)ŸlíV×îU·áb¦:ØKw®¸Y ‰äòª[ÄÔF¢¹›žJ¹@)„\‰•×åì8¸›Gc-•$€(I©³&@ôâåõhe[­íH…•—"ä‚ÑÜ ôš“Pi­Á';ùîöÆ鋽»ßìnßCä\¹½~óé'±â ,£y°~ãᆲî¾M§– .5å¦1>§W6gÇ÷ Ri †AüçSóÖ tÞ4C¬—2ݹ(ÝËeèD(X¼ 4¤]ènl\{Î-?g¸É°?œ÷…‹ ´’Í͵¯c¥Å/í"c¹…ÛÀF£kτ̹1ÙÈÏ—û‡À½”ŽÊeD.!J•M/²ÙQ´¾V]½yðì‹ÒÒõóVØŠ1F? æA†ºl¥fǽ\¡"ù¿¸l7ùx&9Š”vÙäˆK.̸AŽca>éÄ"*¶xõùáÓÏŽ^ÔÖùU¿dOsòìûñÊ@MˆJÉD%AÉi• =39‚\²>Oiã§#¹;œbR–Šd +ƒÝÒÒiañ$ÑÞìmÞm¬Üäô–”îåGùÁaiá*›]°Ó©ÙhQIöŒòÆ„¸dA ¥Æ¥Xc2¤ÚštP¶€³)PÒÀqÉÅÕòê=`¸XymÿîÓ~ÄÆfï¥4F¤»G«'ïì?ùVqå(ݹ 'ç|vÞ©f¿pÞ‚O{Xˆ2€¹IÝ6>9Pt“± 'nCU2ÖQ+›Ë'oÞyý“ݧߋԮLû$\.A¡¤™ü¼—N™­6)µ ªèì¬|­˜[E¤ê\ BÐx©£ÁmoД\_:ªÌïG‹‹Rauƒ‘.½P\~è åf!QÈŒÏ(šþÿÙuÂA_0Ãn\MÕ7]ˆôó3_;7k# ×ØÌk»)㢕±¢q?W˜°`g/Úæ ÁêX£¼tÂ:~`߈7¶PÆH|L˜Ø¥¶Ëç7˜ä‚RßEå’=0ÆEÀ®©zÔ$xÇâå,^ÞƒØb÷KvŸ¸ôÓÐÙi/H¬’Ñϸ>ë´c3 ^Ѫ”£Å%J¦Uèî0N„³ÍµÛÍ­û™á—jÁbb 9žŒ×ê*fƒÜCÆ’V¿–éߪ¯=ƒÆ“?yɈÉ.0M“µÂ¢›N1Æ€O/`jD‰òp¯ØÝ 21?NÖVú»O×n½·yûõéËdÇŒZ?9}óþ›ŸÑ¢›Š¹Ù4m©åíâü­öúc_(ÿÿy !l–Ï,pI+ »g€mÅ@è5Æ&º< Ðx3ÈgAl¤åb¢¾VÛ~GÊvXI7ö +ý›zy³½z«3¾¸2ççÅXùî«ïqéá%+éÀâÄ8. á*è;€ú~*Ú€„ÉËtTŠ«±êFeédûÎëÁî4Ú½Ýë/ŒnGd>Ñ•VÀj•mBíN8¨Y7‰r†•Ç0o†hT«mgŽÛ á‚—T£¹Þœ/dò†@i-ßøpxüººõ,»x+.Ÿ™ø cëÆûÁpöœÙ?åam8 +@‘FãªÑ<¾`žŸ´[»â@TR.j3áì|¬±§Öv £»Z}—O÷íD¤ïbÿp,кñ$„Õ„BN;pP±€í¿þÕº ãÉê%$”õ:BQ½Þ[=õ Ið +K'w?Ù¸ÿYaí~(·~HŠæç—û«·CZà + –ÿU"Ö}DTI4}„lõ|4Ï*Xü€éìœ_¹d'€1™!fÖE\4yÇSm{9ßø m›”Ç—Ï\¤B„3…þVkõp°swþê³ÑÁ“Õk/›ëw´öž—OfkËã§RÊŽð”ZÅ»X¤Òç}t³ìqÃ24^:-í%Ž€à‚Ãf7MŠy +D6>R R¿0äÈxSH´òí­ëo1Z ìØ—Ç+ÎÔÕÜ2ïabqÎË+ÉV¶¾nrQg§<&çÄ4:ÚGÊ€4$£Qì™ÜÔŒs|a%VÞ,ŽnTVnŽ^FË› ÷˽í…&ë‚#¦€QšsSnDÄ…è¦ts•”ó Ò Ýà0o*õíÜêýáÞ›jn~qãúOõ/‘ôü F#-1»žlî<øtçþg´1<7 ûÉ8-W@/køJ"@s©!m($Gl¬à|ÆI„>eò²Ó Lyø)·hõÉB¢GªE³—!ÚêÁŽ‚’°úY( +ž!4(©x›Š5"¹ùDs+R^T*«F÷P,­Óɯ•z‡£½7¹DgÖË[Š›HàB$V',C´`úSNrÊE› Ö «®@8€«r¢ZnK©v® âÞÃxcMonFª›X¼çã²²^_Þº3ØzæeŒ 'f °0—¡Ô:*åu|¯5#ç“åÅŸTÇ¢h¸ËÀ=K&ŸvÐä¡g]$èqà¼Sb<>ƒ¥ +3ñZ¾½ùúóŸë¯ÿccí:-)¥%¹´RZ8É´wƒ«ýå^+ +Z™‹7B±gô`¾d†¤ ³ð¹éñ:PZˆ²‘çg|ç¦ÜSVxÖr}\4:ÕáQoãδ—¶cŠ‡I8é8¥7âµm½¾Ë¬jƒÝLcÃD¬~ÎÔ›N€æ‰â|º¼xyÖ79'ð®NÛI óL&Äœ”ì8¢—ˆ! )¨9?bÇ÷Ô• ¥NJ¹j·±pðG¸„ŸÒì>BÃ}!,¢d:(Ÿ0A^,âgtR­„’]>3ßã'#×<¼ñà:®´Œúq¢q$%úZnAÎ Bþ’E +éò@Üs33$zÈ,[èn¾ÕÞ~IkíËVœ– R¼b÷…þâ’õk³Þ g Æ`®É.ø¸„›V­AþÌ„¼.Û4RPkë ôQZK©^‰×ÑHY?ݵÑ6ÝNÜ]_<|k÷Þ§GO¾»rí],’#Â9XÈzˆ8è£I~ašœ Øü´‹†… @âiOhÆrø9àJ^*Bi¹âàÊ•›o××O´Ls¬m§»'ÑêÖø>ÛtüúxB1ë[ˆ+°¼p0j¶}µ88aôþŒ›óáQL*r€ÒFgü2x™|ÀK0Œ@<­¾Ð”qÀ|$Ýlßí=Lw¶›7V¯=eULJGrC!Õnß-/\ó†.LäbÙ…Í›zqÒSh̅Ždrª¸ƒÒ¤%05žŽÏ†kbÎ?i ’á‚$½¸-Œ(9·xåQ±àåtÂh¦†× KwÁN ‰NãN¶¹2;ÂgÕÂR4·Ä(_ D_žóÿå9‹Í`ñg§l—çñy{Lœi‚BV/?>;….Zün"Š +9À ©Æ¶h4A-MZ1„IðѲɉ_šñ:‚Ó/ðRñI+2m ιÀ4³‡>rɆœ`ÂiZ49ƒ‰93¸öè“•ÃçÛ¡ ­Ô§ëÕmŒOû ccs>¸^Mà¡ÂURª„S 6mrt8¡U@8vÁ +‚°9›Oœ° S6tÚEXÇR)^2ygœ7‰4)ø„´ŸKar´žÑÚáòêÑ“îÖ½l{§ºpÔÞºW]½¥VÖñHÞ(ØxÅêyqyÎÞ1kG‚¤FJyAoËwö]`O-gGÅl¼±±|íÍíû—ŽO¼wúü 17ïç3°Pò9*ÚŒäVÓýÛ¥µ§ba™²…îA¢½+¤û ¶xƳÝÊLôy?“þú”û“î 6< 7qðŽX¶ŒWDq1¯×6‚¼áÆ$­0ܱg h­çÀb&œÐ¦|ái_øœ›p’ gÉù5)»LGŠ›û«ó{L¼"åÆÓ¹d‡7šOVßÙ{úÝìð¨ÐÝÞ¾ñBÊ/ ÉobRÞ?^Š= +E€C ×¦]˜ » -íóúø^R7ƒ1‡R,N;ˆs&?€LˆÊSv7¤ô¯ ¼ƒ)9DL±rÓIFït7î7FײµÕL}1À뤜Ž$š¶ñ(;µø$gPEéD¡¾Qéퟛ‚œAÂÖ1Ÿ$QµŽ(U?›®Ï¶FG@'AÈ’’uÁh0êx /ÎhÀbfÙÊ(W_5¹ÐYê JAJFé Š³6ÌìÄd£ÏvlEpzu´·zò|åô•T\†«:µ°yç?ÿm274»@wŸe”&í’jË>^ÔƒdÕru麜î̹pPN³VÔê¦ Xò¡QÉÁ¡˜Q!?iEÿT×´Ïìa}¨âð +^4 +‡’ÑLÿöóOæ|ŒŸ30¹@':RiYklµåù•Ãü¸<Üq¸Ð¿ZZ¼¡”VÄÌ"¦¶,c„`­úè­“ñú_\˜:7i!qʆ›=! 줬7—vn¼é5 _ˆZÆ£Åp®«U‹£½Tw#(¥”âB²sÀÄÛaF3#L.ñF‹Vërj˜ko1ZF-´@̱!QõК) Í@*­ã¦>.3åΘ&¿è¤ 6ÑGÃ%*œ_Þ¾_îqF=R\J÷ËË·;O·®¿ªoÜ’K‹•küè7lªï¤â¸Z¥¢5–Bjñ«U¹‡ ÝÀËwÆk¦|5-°ý«A-¾0ˆHmÒIM»pà ÆÆWŸÇËd·`ççOY½ÁD²ÍáAD~)WìÕ¯RѲ ûÙ¨ŠZaÓ É:‘˜Žº¼¼‚ 7aÁ€Ú³Ñ⌛˜pÒŒÑ/­ÜÕÛû|ªïf.B!gZ¾ä³l€>G2£ñ,îô¸, dÄ +ÑÞq#“ƒ¡ýêÉ5?cÕ+ɹ~kûÁüþóÑþ+W_®¿hô×: +a*Ê¥¼˜ì Ž×l +²Y/ШP2’ì%Áõ9'#A\³º(?¦ùr@Ô´Fù‚œY©'Ȩ—¬Øùé€Ý+X 1Èæ8½G)9ÑòQ*ˆ<þP p¾ZYj®ßZ>~¾|üfmûÄé@rkwˆx3 åa©à糨T$$`ÕÆhφI_¿`¶8I7µù$‹7dó‡\àÛ‹­å«÷áHÚFFåÊ:—î©å¥ÜÒI¬wˆÅjŒ’ß;y>Ú½ïÂ/Ǥ²œ[n-ßlÜ‹–i—«óï~ôÃÂðÚŸŸ·M;1"¹HCÉ.zÇBjÁ‰ÊK{OÄtïŒÉ7é"¤…R ©L¤GÙÆÊâÖÎÆM'¥PZ)’ïKé/g:[§oî<ü Q+ñÚ†ÑÞƒÃe7÷÷!ua€JÓ+ëFuÝŽJçÍ~Çäð«…VS$vÙÎ\¯c.›ó˜}”Ÿ‰‹Ù‘R»’è&;W=”aä†Ï_ÿpëÖk`Ð|²)—¥âHH€n{Õ‰H¬Z+ Nñpeò+n·y9ÎÍøýtus¸óɇØøäX4dt)½ëe½§7v‡‡oI™nwùøäÑG¥á¡-(;@Çáúx*:°ãë}® ŒÏäç@‚ƒ¸KVÂì;©„˜Yδöc¹^sá`þðÙÆ÷Öï|séÚK!3°a +Î¥[WJ ×`.ÁjÕŸ^ì§u“›5»X+Ä[ÝŒ §KË¢ÖøÚyË„Éïôóvˆv@¬#¨˜½&÷ž÷ÿÎÙ'¬àäÞ“2#7™øÆ„×àܤì¦dXL0‰:@÷öîÓÂò]29OÆri9ÕO‰ xï«{Öb•mÐøVŸ‚Æó÷Ú¼¼+ šœäÙñòUд÷ª›ŽY°ˆ)ȇŒ›nø%=ZYjl=HtöR­+…áQ¶»ËÆË€Ÿ¡ñ,eR.ØÀ‰ñ‰t%_él\½ó¶hŸtüAGkÀ}œxÜM%ý\R+-"áì…9èt+ endstream endobj 81 0 obj <>stream +¢@´"?¨^ ý™reç´:Úñ²ÑºÒÝ}cåäõÒáËæÚêòI¤0KwÞýÖßÜ|÷Ç,ê¥\ÿ¸·ý<Ý:I·® ©y;&ƒ4Ë´i¥8 qçÌÄù9bÆ#ÙQ#(”bÅ¥£¯o<ÿÄGGg}œWZÓêk@«½\rü¸=—q⪋ˆ•F7ÇËùA!ˆÖƒB!À$ݨ +X0éA&ª—çÝDÌÓZ=ÙÙ+-\_Ø{Ü^¿3¾p©dnÜ{û»_þ¦ÔÝœ…<\%"URixé¤5ÀIE +0kL:1KP Ô*+yõ…¤—ƒ!½43?¼™lìIée³ŸŸrâ~\=¹ýªÔÙ¹<^dV ðy.9ÔjWró7RÝ#œOÞ|ðÎÕ;o€ï¢ ‰4·ž<þÖæý/äÚŽ‹ˆ(õÃoýlyçŽ9 ]4#–@„O-)¥m,\½dAÜH¸2ØO¶w'¤ U¼T4*V— +áÜ"-çN½w÷ÍoË龇ˆÒãSñ£dc{´÷èèÉçÕåÛ¸\GÅ«u¬áü,ô—æÎMz ‚¯BàÔ±oL¸\A!ž͹¹) +|¢’ã%G +.üd —2l²“îîç'¨ÒàµJyþ¸²|½¹~c÷ôùýw¾[œß“ +óWnpòòG£kß~ñèõÏ»Wžq‰n¦¼ºvôf$ןõsvTe”*)&Aε@Œ—µd³È?’³X  ´V3:»éùãÎöÃÆæm!Óšß¹SY½ïìj=±°Bêíñ]Í©p.±8r„4$ç‹ Á¨­«¹aÁ ŸX$ô¶\^ † x¼ŽëX®“Ñ© RÁØ1>ó†ŸíÞÞËîþËÊê½ÜðXo}««ÙÎâñ³HiQ-/wö_Ä»WC™aÈh‚ĺ°uËKEæ|¡xuKH ‰pQLt "nóógD’@Jߘ€.™a&å\ª¹Ã'zN4jñ°Jªã%å9³häOž||úø£þö}£¼ÌëuG ä'"À§Æ+ÐÙ°9ˆA„t¦¹•©¯Çòó&unÚcò0Ø ÅÁ ya¢¹ÚHˆç/[¼B¼Ù¹ò`ñôíÆú­he–*ã“RêéëϺ+×ÌA ° &Ý„>çÙSrÂbŽåškü8[Ù­> áQ·CF/”`rUM5ï¿üèæ“H)d3ÕG……[Fc3šŸéÀK§LnÆsåþèšËÄrŠÒÄ¥2 B;;嵺ÉFo뛟ÿÝ´9?™\!“àŒ¾š[‰em-í1jÞ9žž«E&T8ÛÙ,ŽŽË‹Ç…á¾V]“Í|÷Êüէý;åÑOµ´Ä$z°”—“­úÂ!¯oe‰ŒycA*ág¸Áߤ”1{HV`>ÎÚ[¶î}ºpõEmådaíðï~ùûÏ>äÆ“_-§'±Ú•dçp°÷|÷þÇÝ+ŠƒýÛo}'”™·‘ñpi-5¸–]¸»týã¥6®<.÷ö¿óåÞùÎ/”nȳþ°Žxø\(5ŠU6 ííëÞ^¼ú¸´r£¾y·´rª5×kk×;w¶o½síÏæ»;ÇO?¿ýêûk×_UVn+¥eBßÛIk=ªš¼ DénʪHG›B²‹Ë%"Ö´£¥ÔÜDdB›Ññ¯V¬¥h„¯æò)—¨k…N¡µbÔÖ„Ì*7±Œñ9/.O|µŠ4( &ƒÿÅêÇ xX„Ëø ¼‰pIàJ¨˜õÍ@e“.Ü PÌ…2>&Ìj9Û«-t·îóF3ȃ?ÓñÕw˜# ø@àsbºï%5{Ä4ΈX½üœ‡vÁ‚ƒˆfº»Ýí{åŹ¸óf/'F+jº` J.CiŒ/Šz2vD +Ž= f´–/LûÏ_öœ›pÍ:(?¡I…2€ùÏ\tØ fÖI|cÒuÞäŸtQ&(dqST$ iA6­¬Æª[´¨%u6Ë££Tï0œ[EKjºmÔ—IÅÀ%…7ÊL¬¯m%Ú ëÙ` Ô0k†¢Õ +:cÇÁ.€ ³I›561ç‰ØAÕ­¢”Wr½ýÎÚÅ­“ãoõ6NŠÃƒÕëïÞÚ¾ýáòÕ7²í-)Q“Ó|su÷æ 1;PK+õ»ó{A$Z[‘ü€MÖÅÁ­'\}ôž›Öùe.5¯–7—NÞ¼—jnuvøå¯Ož¿Î’­M€ÛõõÓãgŸ¼÷£üâoÿÓÛßûåþÍ·?ÿîß-&Ú¤R)`¤ S/Ì@•ÃGi \x‰˜ÉEßèP6þuÆI^¶¢“.ƆF}¡ÄxÅ)ÎtÒm/“ÐÓÕxi@*Y%ד² %…ÓC½¼ªU–‰°R >Q†y]Hõ¥Â +Ȇ€s©Mb¹Èþ>ÎG(nT²ú¸Ëfßùi7>É-\÷1ñÓïz;³>Äj³?1iDª×¢ z³9<èm?…šéíRñ:J’Ñj(ÑJ÷÷°hÅs‚^ã¢g@p› œ›ñŸã°áççPçÓƒpqYÌÏó©ktl°*ªDÐÍ^ÊŠJ!V^Ó›{Zc—Ö!5Ï·…TÉ +‘t?38Iv®fû×¹ì{Ñ&&kU5Q·yéËfè’ š¶ã c|a³¤+övƒB‚Vò‘L'ÕÛá³J+ƒ1ÉôŽP)aõ@ ¥¯]‰7öÇs^Ñ:0)ÕÅ”YÇ¥œ˜l«@(´èz«Ÿ›qâg8ƒœÅGûèL«bDO¤*©b‘SR,Wj/Õ·Šý%½2à“51ßÕê˹ÞZ{ó„¡ÖhÿàñGí+ÀHŠZç !ya:‘®¯î?HµÖAV 'ñü²œ²zÇËÄÝA‚+7ŒŽ+ÍHa=Û;š?|¹|íÍÞÎ#¥°È†“Ÿ¾ûËßÿ—壧ˆRÑš{Æàfu÷Õµ?Z=~#ß]—“Å7?üÞêÑsK0<é ¹ôR¼}µ¼tçÊÝ/âÕ5-ÝyøòóãgŸÏúÅ9D¶ƒÆŒ6†»Ï÷±óì{‘òz¡µñäßeÚÛ8ìÀ$sý“¥“w¯½ñýÆÚ)³xõîû‰êú¹YÿÅYÿ¬›õÑi\*%«ëÝÍû!¹pzçå§?þ2RDÔŸ_ã2ËRacéôƒ­ßÉtO|Düæ“o<ÿDÍÀ˜_¶c ³p$À¤©hç’•ž²ÛûNï¾í„¥¯]´~í‚åÏÏÚÎLù8`žuö« ÷(µÂmB)ƒœë 3"¤<YA:NT=xØCÈ°2C­¾]Y8î=– +#¥$++‘üÈAŽ³šó‹3nÆæ^çäŒ'ÈØÜ0ŠØ<èDùø”_Ì9Çøåý|ÖóB¼ªU–òK§‹'o÷ž•Ö¨Õ³PAÐk€²´’þ¬‡s#d¸hT×ÑpÑKéZn6ɉŠ<:뜸êD# ‰ðJ8»õêhyN)\ÊG‚¤K·ôâ4³A¸8!g¹D­¶rmñðqwóv$ÝÑò=97Œ±0ÉE $Ÿ 2Šb¬fñ†&l¨ó«K PŠP„ÂY‚ÕÑæ†>C… :i˜˜/€[ñt«ÖÝ(´7ÐÈøjfmùf¶¿-öC±|HI…c)YKC´„i'EI¹ZÆÄ´ŸŽºÁ`1­ææi½k ÊÑÒšVÛ”R½Æòioç~º· ‡´l±½qøÀ(-¡d¼¼--Jé.£•€”h Âf<¯WbÒ†Ûƒ‘—‹d–¢Åu>Þ&Ä” 'òµùÚüø€ÚÜQê;ÙÑíÜüõxe(?*¤a\Xܼ>Ú½¸    šŸ†e•òœ‹œn-?|þÉ“WŸÛaéÜlpÊ-ÌaFP®kõ]­²ŽåßÿÖO¾õ©ÙAžŸòÎA<€½u\Þz*ÄQ¯kÙv€ŠÑ@„¤œëö«,fÛ›°d¥Äpõ8Û\µ#aebuLÊãbʇ,.Ädóz|hˆ—Ü>¿;€R:Ù?âÇ3x1¹‚sZw~gíà‘Z\u¥¸$7|\Ñ0F …S/íô±A*Ž2IJÌGR}Ë@`AÙ´ ”ùH¾ÜXë®Ýr’Q/£ù͇-f¼Íœ–(/Ìy„§¬ØŒô‘1ä )ƒ‰ P Òj"%9ÓÉtvÔÒº˜š/¯©ùE/©V:[Ùƪ# ‚<èÁˆNÚ„Ÿ)…ÔØ$«+ )©ˆ^7¹IJ¶q +‹¸P æ2n,HX“Iráô@IvP.€Ê‹Øøî)À<$Æ(AJÒ*Êj€œˆ<åø*àP²Ù´¸«‡?D„Æë<’j5ÀelþQEËó.T@¹8«•Èp†S r¼ +'ìÉH)£ÐõÀ´+@ø) 4>Vfä<Ø06/ˆ×…Žoå4ÞñÂ'ÆIN÷b²¹jŸ7>…ã'"Q6II1V@HÙêÆ'MÞ `u*vaº<ë·8”ѬOÔ³•ePácb·™†ÃåŸñÑq„`!!WëEŒòyS`ü\Xf±¼x£µý¤¾~Ç„‚21.pÁG` #œF«y9Ó–Óm\L +rJPÓ(£:Æ&Áþ‚ŽóÓªÙ‰0ÑdÅ +aÃ)NBYUÎwpµÑšHJfuóÚîéS^˃VÕŠ+…Þ©ZØ2ºfv +‚E?©@ˆàE%˜ÑP!ËÄZ¤X𣑈’Ûݽ}ûÅgZµ#¼—R=HÄ —/ÙâÆMvðžÕø`É«v8lõóND"Å Øx„i9]_IÔ×¢Åe97’’C2Ròªl4"ɨ+?Ws ñò,µAi9üÒŒÅg÷Àœ§¥Ä™ ÇùiÙ‚Ù&VüLÚÆ@‹æˆp€Š—JÕuaQˆ6a„pyÚìwyidg;–¯/螨Wü¤ìð&§ßæePxA<@FŒl/7Ø¿ìÀ¦¬¾)³{zÎ c ÅH‘x–àU%U$””-È2R¢ÚZJºà¦l;lT@‡¨Ø”·ûBî ÏFrb¬ì'#7f‡§Ÿ†€³“òcª/j éÚcÂáxô²= ‚ÿÑŠ  ÏNz¦-ˆïÚ…i»Ù'¸É!×x½N D£!œ¤¤»+Ç!­ ¸Öˆf‡éúz$5ðQ«—Ƹ8.èã;ë`ÀE/Ìû1Áî#f,‹ÃÄx(rB À¸r±)€JpÂ"0AïÍ!ä–œÛââ`?g‡»‡˜4¹~4Èõ‚V$Ää¬=7嘳‹û[WÃtlΉ:<$äçX1éCE/"Ø<ä¤ òãÁÇÁP}ö#‚s8%”ä "›ÃDpJÕB…s¸˜_§v¡cí}æüÜœ ›³£SÓžK—S³4¯D„t>’ÜbdÊW®ÞÇ8ÝìÀ TÅ<£b>Xšµ•D;šz‘LkÎ?m¿~Þ6ë  $¶çì¥9„’)1ióPV71kG/ÏzAqP‰æS0uûB$—d£Í‹fï7.[ÿò¢ùÜ”t‡ÍᬬDkwÃFÙä!íÞG©¨Á#• —1àˆè{÷ßüÖß[QéÏÎL]˜²»ýLHLˆjZIäY1º{|w´sËp“¿ÕËX<´¢F%• Çb‰b²²ÌDŠ(«™q«’¼@)’øHBYw÷ø”Š¨ÉÊÇìN'b”DÊC°–añ!îÁFò\´ë‚[@¼lñ]†Æ7ðg0Á€@hÅTˆ¡€ïCá +Ò|¬`46 *ê†W€þ+'g%­drcM³„‡"š]Ø’x*oI°o6wÐì„žGRídcý«3-,Æ' +­hnÈ8¬@¦‚”ŠñIN­Â´†]O·¹ŽÛIgX&$˜£„èò!V—OKåvOnqnjÚ= òõ%ÛåI7P’Õ݃¢røDs{q—Û?cvLÌ:¿"Ëùl²XÈHÀó0.SV`a®I³wf.èG$——»<í:sÞtæ¬Éæb˜p‘2_ˆb”¨ž×%1Z%í ò kÍXg/Z.NØgÍÝ…S|ÒJsVÿ” 2ÛQ‚)=@%í^þÒ´ëâ„•d:zyÆ5c ZÝ4Ò"Ñ"FFíîÐÔ,ìö²ãî˜fìˆ'Ä“³8ƒÑ É d.¯õÚ˜À{0"¢grÕv4•Ã„°+JLÏU»j¶yvÊ9a‚\> V©h4;!±åbfa}]Éæ|èŒqÁ"Ê(´¤Äñd.™Ì++ ÷Ÿ¼Qî,OZ ‰9÷„ÉAÐËqª* ¢èõdYJ&ã!Ž´;çÜI #œ/èû»«;‡ÛÍ…L=#ka^Q|”dx¼Ú¯ ÎKJ$& ŠÑ« j T/À³Õ~"]¬å;C.š2òm”‹úqÎñ/yiÖóµK6{P +†Ò“sA0t6,DŒRcØ[ZåÃ2P“ö²½S"‰ §eë B¼ÈÅŠd8mñž`&Ã%°‚Jr1?*À”JJy’×Y.Ì1T*U¢1VÑ0I $‰Ð4Ülf–ûT‘òÂ䣨Š' ¸|œ‘P2ê ².·Ë㶻ÝNI’jùÄ|-½5ªÞ8^Û½xùps{Y‹E: Áð>‚ŠÍÌþâÌÌùI‡ÍE ±ÙüA?EŒQäHDþîBÌñdˆ†1„fXœBœ‰–\æÒŒãÌù™s­“³ÐÔxŽ#¿ÉJž›ð¹ì¹0ísv7ewÝ^8ž.ÐP¦¥Hòæ'q&A ©9'|~Òj¶ÃÂû¼˜Ûi' H #å¬0h'G‹õR=™Ê)ZâêfçÎéÆúf¯RÑËÅ„–HŠ*Èìü¹K&ÓœÓë J,å)w%dt¹—+Up”U1×>×¥RIYìÏïï={rüàöÆÃ{Wò•Ü¤Ù99yƒ4'A#­ð¨Ê#rlymU”dmå­…üó»àõãîüáï?þÍ?þðãOŸ­®”ã9”OÏÅã K%㵪ÞmgÛÍ\Læ“ æ›Ûëö@I¬T‹ÍAsi}íñ«sí¾ E,xÊ àèUˆÓ{ˆ¿lòž? Ca#/•Š™l„¼þñ02|¸Z)^¯÷ú]_Þ^ÓsY%‚‘“¸”S-”•a8¢Cà•4’ù|9S3q1£âÛË•ƒQ·‘­fäÍaþÑí—>zuó­§Gwnì ‡ #¡ý0äE%5 É%â(·ðB’o•£Rt¾m.§î×^?XûâÝ£o¿:ú×ßþäw¿þÑ»O¯în/ÖëeQüAò¹£1Ö Øx”&g£áJ:šÓø^U_êç­üúR÷öõÝkW—ïßÚzõìäÅ“{ÇÇõj]Oè<Ïx½ÐÔ¬ËéefmèÅiÈdÃ/\²^¸d™1¹ÜnrAC¦4¹Q+DeAbÉb>](äôxÒг„9wÙÖáÆ‚^{eÒ^ŽÃûóñ'Gí;‡§óŸ¾{ã{ßÿø­ÝOŸŽþåçÏþýw_üõ÷_¼÷Öõ­µa2™DIÖjw9ms„Ïžà^ïe|KüÚŠ~}·z´]¯›‡Ý‡×zoÝ[zõpñÓçkÿò‹÷þËï¿ýãO®ßÛ+¦c¸Ýé0Ûý8&hÂ,54t¯#äçGåÏÞØ|ÿÑâëƒÏ^¬þÓOžþûï¿ýO?~ð»ßý÷ß|óÿúo¿ÿÛ<õpãÚn;NÎ``¥ôH%+.µ´½…Ä @,T˜F–Yì$—û™ÕAúúNëׇüý_ÿö?üü³O_<{°{e{HôœÝæ€0*^2¹Î\˜ôØ,Q.`ˆp*‚DYG”s· +‘ù¦ZcwÁx÷Ùþ;/NŸ?<øÖûw~ñåço¾|P,ÃÅ…îêÕáîs.^õ¹‘ÐZœÜhO;êùÅõö?~ùê7_¾þèÉÆçÏ–ÿù¯ÿ×ÿñ¯þôÇïýê;7ÿôÛ׿úÁÝÕŒò{ÝÕæC00 (»4Ö3_`î_Éÿô“Óßüì­~rëƒÇóß{íï¿só_õú¾÷W_\ûÓï¾ùo¿xôÉãÖÃÃêöb9e¨ét:¬¦#±|(ÄÆÅ`#­T„Û¹wî.½qÜx~­ö“Ïnýþ—ýéßþöÿôíß}ùü¿ÿëgÿïÿùoÿúÛï=?iÿð›ÿôå›ï?ßOh²Õœ0ùì^š E¼;90ŸM$Üa|nX®åO6Ê»óúñJêÙõá_}ûOß:úôÝ»¯Þx`è ÂQ‘%ˆœêe¨­woMûôþà§\ÿ«Nýý§ÿÓ?|ôÿé×üÇÏÁüëß¼øÓ¾ó½îlJ M +±¢ª¥Š ÓpE# øQŸ¿½¢½yXøñ»W~ýç_~vóßÜÿå·oþÏ¿|÷¿ÿ§ïü/øì?úÏ_>øÝO¾ygµ³ ÄæòûODÔ|TeÙ—;úû7Šß©ÿÕ;ëÿñG·ÿÛ?þ·ß|óï¾uý?¹û_ýÖ¿ýâù¯>¿ú_üö§?ÿøðæN¹œOº@ù)4ˆ/÷kkÝôJC½¹–øÖóÅ¿ÿâÚßÙøþ;Ûÿò«÷þ×/~úѵ¿ùðàÿøÏßÿþ÷ßü×ß}ü/_>úßþøñÏ>»±ÑO °crÖd÷ƒAJfÙ~!ÜÐüuÕ}:äï¤î¤^^¯örýËO®þàõÖ¯øðÿ#齞$;Ï3Ï?bbF"  »«»Ë§÷yLï}“Þ{[™åMWUÛjï€Ðp@¤(r$R¢D#‘#)BÒÊ‹#iv$ÍÆîjF£Ù‹¹ÙØû}‘Ñt§9ç|ïû<¿ç˜ïûÿô³ÿôÇ_üãŸ~û_ÿá'ö»Ý>êMçÛùæ4Aê97_ó´A;í0ðñï¿;ýë=ÿûŸ¿÷ûß½û{ß¹óg?~÷¿ÿÝþæg¯ÿà{wÿòÇ/þÛ/¾ûw?}û§ ¿ÿNëÎT«8"Ç +kë‘Ko­%ƒA›‹M +èÅXy~”ÿøQï{¯ÿâw?úç_|ïÿüóoþÓŸ|ýŸþôù£ù[þèW¾÷²óh7Û/0ŽJÂIÁe³nsÐíOj“Š0/“fâ¿oëç¿vñ'?|úÇ¿õðo~þêŸþü›ÿå/¾ý‹Ÿ½÷‹^ü—?|õßþê³ÿü‡ïþôë;ßyRùè¢Û(Yñ HLJ9I1ZU§é1ý­Ž³­ + I1¬Ò0Ý>ÇH%Ç(lY§všÚ{·»?ùüäO~ãâoþîßÿá¯üãóŸÿæûõ“WýÛþå/¿ñ¯ýí¿ý‹ŸýJ÷ã{µYC!Ðx0†év»PžÊŠ«sd+KwLlÛK½ØÕ>ÔþâÙà·?½ñ?þ÷üËßýÆ?üɧÿ÷ß|ç_ÿáGñ»¯ôÅ­ï}t¼;-kf–ŒÉÖ#E•9Fr^Do„÷N«ßx:ûøÁøÕyë×_ÍñÓ÷þâǯú[¿õÁþOgwÊÛ Ýp–‘pÊ’Y^K8âq‹Žõ]úx˜¿µÓ<ŸVŸµ?¼è}óÙü[o~óåá݉soœ½3ñ¶ÛÐë@tÃÀüœZ`ä¢lT5W+•+Ž^6…ƒnáÞvãþ,÷ÅÓñO¾~üòäŸÿê‹?ûá‹ßùøà·?˜~«ðÁ¡óñyã ©êdœÄ2pÔÜe=„H£4™Ž›t²a’‡mõîX|}–ÿì¢ñ›ìüãŸ|þÿþËøç_|çïþà³ßùüуýΨQè ãzçS‰8žŠk,Y0ņ+ŒÊêA׹د?:j¼§ÿÃOÎôŃo½{ðòfoòÄbÁHh##¢SÞªõÏìÒT-‰¦[ûÎÑö㻇Ãsnò`ò›ß|çåÝí'ÇmøìÙV¡_µ\S4uƒàœh&#]L,3zÖª^y`š.‡cK—m½l+uWÚïç/öÚOnŒ÷nÎëÓfiR+ JžkJ š ¦X_B$„Jj‘H2‰dR)况êñ´u·ôÎÒ÷?ØûƒïÝÿOoüñ^þño¼øýoÝùÙ秿óáÑ÷žï¹–˜FSqFУ˜†s9”qqE˜j®Ø-å=>Ñw±›#ëá¶÷â°ð³oÞúïÿÛÿõï~ó/úúçß}öÙ‹ý'çÝQÁ°tѬèù1.äpÁNâ‚ Zz7§ e“mxRYçêYyRóF%kVìTÞ¾5»·Óì9|ÍR]U•Xǹ@œ_ 2Kkز2SÎd*Éã˜g™•B¾^(4ónAç=™-êbÝULÑ Ä‘•fs =‘’À9WŸBÏBÀ FÉdŠyµRlnÏ϶G;-GÛkfŸ·[êÃÝúí­ÊQËgõäl‡`­åÕÀêz(CÂÛ<Ã(˜†]p¬VÅÙ–.Û7&¹{{û‡ãý~uTÉÊ^Ísbñô¥eŸ?±x¶ýZ{c%²¦1 ñaµsRªNx–5$¢f %•(ÊØé¨úñó{Ÿ¼z|ÿt·×qu…¡I' 9— Ý8íl¦%!¿U™>©Œ*»¼Ïï?þÿ/IÑše•‹ÅvµÖÏ{5ÓãQ*…¨k›èÒJr5HG /ˆZ´ž¤\V-GÂH:Æ“ÄZÛã@æQDJИÉ{(!‚ñd2 I ´”Gèl†/òÎP-͈ú•¥` Æ¢d–`mÍéÖg ç¡ÒÚn*Ïêù\¾£«2BÅ)}3ˆ_^Ž%)'#”7Âô¿ûêêWÞ\_ÙDŒªë®a0ŒÁPBd%KÑY4­ˆÊfTŽ5”¬¡–|-DˆÞ$?~ •æJaÞ˜_¨¥^œ’PÁ•¼A®{n·Ž0ÑIS²¤å:“ƒÕzy#±ÈìP*ïI…Êhcr…Õjí{ŒÛ_Cô¤¸x(#-”B˜™&³ÚôG°Ë«aèD”Í3F'#×㤣ìn2_N¸½žדÊfJIsÉíi…¡ì´²¥­à ¼ÙL2nš/Pf‡µº¼ÝQŠ9?`õ"k5\1LXQ2ÎØ)®drDIR.º‚Ug´’`·­ÊÌ(ŽT§™!EšW3Ïëåå@ÌÄÅÛ¥~ž+ëqæÊFê͵øFJN uÞQy-J­Esò|Âu:MÈ’YlL0ÎŒ‘‹Ç“I¹– sqÚ âÚ[k‹é¯”ÅYm¯}NèÝ î„P5FšzynVvVƒT0)aBŽ5›¼7ŒÑ¹jD ›5{pd|Ii5ÌaR#ß»-æœ3Jò¥•˜Œò‚œ´D~Bo«õC³{ZßQkûq¾èGŒs“»”\…ŸV‹s«~â¶oêÓ•´ñ–Ÿ¼äÃCØâ¡¡_zkãšc±Ù»ãônÉÅ`Z¿¼œˆ¤d_LúêRlɇ§„²Û6ë7åüN·7ÓúÕµ¥IÁKfô+Ëp|×Vþ(“¦mÙjñJqm3î¥ÑŒ‚‹ëY´²‘|ˆaò!ÒýÊ›>¥~„h5R+íÞxÑؾ—‹¸ÙLËÆnñnO-L›;ý¤Ä•ŒV•ÊÓ¤\ÏƹãmU'ÏÞþ÷îàìJ„W<ÔZw™Üª4"„é[<–îÐ_^‹3^’¯°î\*í3Έwà6˜&ííàjK,lõ]Τ„‚VÚÊ÷γ)ؽŒÑ¤sS{xßèÝÖšÇRq‹6­½—tv!tÖ^,§%gD¶ŸTiµ!¶l?žÝz ×#TÕ2Z+J¹)©‚jÍíªN·5½ÇyãÅ\âö(©´m@Û;܉3¹PÆ\K° :Š«œÙbœ9&·ƒI1œ«Kš(íÂög»g0F˜9ÄÌA Šœ´ ½ ½#,J«‡3‹I¶SB1c´ÓJk1—4&惈°ÂØcr´Ù#´©ÃÁ©àJ“2»R~¶‘”£”—àªi©çʸ¶xÊf)@\ógDwqÉr3Å15Zi£ƒhm!?eì^Z($XZ{ 1ü„—êJóœ-î+S¥zãŠZð„Ú¤ÍVˆÈ&˜R„(†3yç4_Šd²Ë!‘«Jq[)lGHw%Âø7”³%;ý¦\ÛD¿z-º @Ãi9Á䃨%í0¦¥g#YƒÂ•‹3±´Ëw˜Â¢4¯¬g2ö˜°zÙÚÎéÃÏK“ó “MÊ¥8Œouºc1{n¼¸Ù¦±«×æ~R[N‹¾Œ1¥­g¥ÝwÜñd1m¬IeûBi_("z/.ÖàøKÐG#±4ÙnrÞ–Þ¾'×Î({1YœÍÃÐÎ8Æ:!\§²]¹¢Ü>–íºÓGÓG·?é}èMîWæO{à–gÓ[ïélB,Bi å£lï^iþ¼8{žíÝL‹gNYwDš}Dm@}Rù)í »Ovî}NÛ½Ë!"@9zãFnü4Û{‚›“W C×ðE\©†q%œQ–“ÒFZf¬›Gåz”)(å]½~ÝçÆÅ:aOá`: 6Õý(WcFg~_.LaWâ|R®¢z3Ftn‡0; bQT–Ýž˜›PF'JX zœ737²í³lëÆfBaí1çmÓÙ üVˆÎmàöÕˆ¦òzí“ë×BDœËe¬.“ŸÑ¹íŒÕ÷ãÆb!ÔâvB¬Ã¦”†T9$ì1_ÚË8Ó •g½™Ù8YM@Yêq¦Íß/·ð:£<±0"ÖZ„_ÌÜ‹ ›fë4c7bìZ„ÙLªÐw {o,ù¿z5ô¦ Ñ%ÎÝ’Š»¤ÙÛŒòþ¤ÄÐ&­í…™\ŒÍC»qκ0¸—ïßAHÉEÂjËÕ¸”§¬íy(Bwh5ö+[wÅÂh×ho˜/à˨Öp•¨ÒK-.ÛÓª»2 ‡—ÍÏäêayûåäÎÃ÷£B8$_žo?²9àU@ä_Ø·‡ìÉC67’Ý–ÕÚÏØ]ÖA‰Òö€ÍMÌö©^ßGšRÙÚòÅôþÇ‹i£z·øÊaZiB¿×G7·n½^Iòt¶›Ý/l½¨ì½“ÛzÄwârC¯íÏ>È nPˬMo~Ð=~»¹ÿr~ïs¡²Ÿ”*Ø—«Öâ:Œ š68ù¨süIqç}£w/-T“|t›òKQÞ—Rq¥-æÅÒ±Þ<·{çqÖdݞѾ)×OÙÒAyçEëøýŬ>¥½ÊÖ.…áÒÙ6“Û’Ê;JíˆÎïù‰ÅÃnZakxô“ËT‡º’ +3gð€-ì‘…]Dï°l¡{K/m¯¦”8_ “ù”X—ª§Zû.“ßÓ%»¶{òà“a/…˜ëq„‹ íÝÜÿe n?ûú÷~ü§ùîÉÕ¨¸‰Û´·UاuóÓÊÁ»båÀ[Nç¨ÓzBYò“ ±áJP?ÞàV;õ%´0j€Å„qu9œíZŠŠ«ˆA8S±v掟|u9y͇ÄH+L:ጣrq¶ÀÝ0S’ʇVç¦/­¬/fß²“|1%ÕŒö­”PAÄ2¦5IgÊvKÓg³3fèÎÀéŠãÛPTÙö‘Pq^ŸñúåùC­¾O;ýL¶¯ÖNò“§ùéS¥zˆêíŒ RyŽj5ÜèÐÞŒÎï#Æxc÷ym~º­Vv@Ǹüa ¹â®T?à½þäøéîÅ'bi \ >+¶*ÛOZçK½<ï_üʯý¼2¿ä¼LvìÕv_µßËn%oZC”Z”wÓF=Èå)oÜ>||ëóâÖ#Ú›0ö :J؃¤\c‹»…ÙSµqÊäæFó†ZÛ»D7ʨO­æ\*Ï"|5¥öøÜâ~ûÛîÞýè*´mJ¦Ìacþjpþ¹ÜºÀ¬©5žòãBï,”±)«?<}ÿÙg?zöõŸŒ/>ãË{1®$yãO¾ý3¥8»“b\U(gë¯gw¾Yœ>ÁÕjw÷A®s¸œ`ƒ´‹ÛS½û`xþõÖþËÎþ Ö!rÃëß +nˆpXoÊ•öHwê—>輄ü"º»wÍo3¹ ëQ¹EíÛïÝ}ýë I¾¬×Nôú‘XÞÁ­!ª¶|…2•ùøû¥àG,©¼­·Žþ­ÂäþoTpk{ƒë q)@á0jÕs:7gÁÝô~Zé^‹ˆviëÁËo)Nïß¾±q=±úgL¶]ì߀ß%.´6˜ +´‰\=È/p½™Vª`vîàQiçýêÑûÞü éô¬âtçî'fk/&xreÏéߟ¾>{úÅéÛ¿Þ>|iTw:³{Íí 1?qºgµÝçNÿnq|w|öþÁ“oÚæôöðè]±¼ u‹èͤT‚ʘ#¥vBe‚×ëì?¢ÝA„Í-²FõˆÅÎo×ößÜújR®ìݛÛ¯'_w·žaöÄOçB”+ÆùÉíÍ Ïå{˜Õ'Ýl˜Õ½É¶€9¯…iDªðÞˆq;d~B…ê ­yj6bŒ§ÍBïDÈ H£ª×wÊûÏìþ™Ó=õ·½ÎYœõ@µÆ±¶å¹Ú<2»wøê)Cnt!Wv|¨Z™Ü©ï=Ê{ry ÓÚVýpïîG„ÑÄ”êøÆÛ÷>ü­Ý§ßꜾ.Ξ*¥9ê“»¯ô£a'ø¢QÝ«ï¾¨í½¬î=-ï>qå‹—ßýÖÑ“_Þùtxë“âì¡èÖn?úèôág1Ö Ó^Æêqù)Ô@¶O¬ãFÏkîß{ý=£¾ hwÎ¥Ú‰ÒºYÜ~~ðü{£óÍêÁáŧݯ2nWëž²ÕÜݪ§V÷Aiöœr'ŒY¿÷ê;½ƒ—‹§ùbôPk@8CLmz·«ã{»çÏ{‡ÏsH.–¥Þ +AK +EPÚîÉ» ÙóvûÀݶº7ŠÓûFëH àÇB•žF´»Ùþ-oòØ›>«î›<‹;`@·_~qôدpµX`·sVœ<̶OÕò 6£VG'/''/­:¨ý_ØÒ«»…ÞññƒÏ¶Ïß e,Ñ÷_ o}¤´Ï¼çgŒ3>{ôi¾¹ÅÔůӻ¹ÁM½²#—öw¾™ñV*—íÆi§¹ÿ|çé¯uî|f8£{öà.éî¬Æu>;èí<¦ôv4#§;œq0© ÀFšƒ(á]ÙÄ#‹±†1&5Ä0‡¶¦”5•+§NÁô!h§¥J‚+…‰lF­/&G•ë!j]€°Ößþzuÿm*7Œó^sï ªÒxB~@Ú 9c·}äõnPv<£8´*ýBoÏj@wÙ›­y­=¥8Y‰3¤Ñ†Dy'ÂÛ|iKkœÍS«y¤×ç1ÆíöÍ¿¶ýè[jë†Ñºá‚ªäG¼ÕÞ:z + +–kÅùóÜô…Ù»çl½ä+§PEiÅ-o<ü$ß?yÓ‡¦¥ú"§h­Zí [Ûm Ï>ÿÕ¿úì‡~*f‹˜1”j§Ó·Ÿ}¿~ò1ÄÕ“»ï}ãûXœmNÆÛÁÜ=ÜÝ-ï¼3ºÿwt¥l½º­V¶¿œÝ·°š–j´5°Aî}´{ç}»¹7Ü¢–æ¤Õ£ía„-nâ&8 giü@Ìx•ç³ÝÞ~<8ze6o J“P…î‰UÛÆ”W=¶†÷íÑ=£s<4BØQ"k·!c®F_ZÆõS:4ºÎm\o¥…buvk|ómp“¥ëÃtÌèÚýûÙƱUÛÁfB@XÃn째òz\*º6Rf’+»í;¥Ñ3&;̵=h" ¤µj¯Ä• æ0ÎÔhœ¥ø*3ãö¡ïB„AŽ<™2ùyBn„Ù|Z̳v۟ѨlÛî­c­z<–Ÿ¿ÀœA€0ôæXÝñfZ¸Ô'¬.螘Ÿëµ#ˆê :[™Ü-o]Xíc¡´M¸ý˜\J*5«u\>!”Òb‰qœ3pû¹î‘ZÝÞÀÔŒ\Ô«Ó¤`ÑZAðer£{ °„ÙÅô&`$ëmQÎЇ‰Œ]7»G•ÙƒÞÉëÆÁ«ML £’d·š»¹•ZÌAýòônu~·2»ŒDª Þ›‚V_‹PÐFý`vóC µ² þy=Ê(Å9*Wãt„²äÒ$ßÞ«ï¼ëÔ·ÃtN,Èå1¿1"CZïi¥ÝîþÓÉ·£L.Ê–”æ-gëm­sW(îˆå}Dë@`Ÿ¾[ì@ü3Dmåãó_ií=+n{íHŸ~û'íù£¨P×;7íñbZõÜôÙøè ØAÜ`rÛzóVnüÈîž+¥™ìn¾üè LoÅ„BBme¬‘XØ¥œ-Dí&ùŠUÞêî?Dµz\lÆøš[œ¶"f~p:8y™`]R«óÙ¾V†½xÑß{ŠÉ$À<+fû£ƒ—¸T¿²I®DD µÚì¹Ó¹ Ñ/Á×ÂÖG_ü΋.­¦.ûˆ]A”^¶~êÔOÀ7I¹$–¶!%ÁQS¶˜áZ‹p§ µ“±Ùö£qn4!ðB‡qg¼!™í§”zR®ãVt»sò_š]‹1¸Ú%Á̶Õ9AÕz‚+$…BF«ºý›”Õ™R*»f÷D)H‰%½~ØÞ{tós¦x$ ++QÉ,ÏôÚnÊ^±+ÖÙ¨ÜK‡RýdU£¤Õ˜?D?Jñ…“ƒ¨ëµÏKÇn÷"a„)éÍSÊ€Œ„H ÞAÕ|mwÿÞ'õíûˆù‚Ø[A˜:ŠrÅ@UkLïå[Ç œ7kG¹á½öÑ»V÷N€ÌoÄe=7nÎïAãr“rÆÖ µƒêÖC³º—¤éþãöøìË™œÕŸ‡œÕ:|»wò~Z¬úãÊ([ÚL¨aÜÚLkq¾È¹#Éë;• ¶xšLä¼™Õ½Ƴ›QvÕŸ‰¦URð2fÓ»I©ŽH5½¶#ä`îR‹õ•æåùsˆcBq;€éL_LçÎ8Rqö¿6¯8}VtÜyJ9ƒå(˜T+)–âb‰Ìr9>«5¬æ!-¦VAúÊ[÷ÕÆ¡TÝ•j;fû€+ÍâBâ¿XÙõ#ÐD=Ê™²¹n âB5H{Сåá™Õ:Œpy|Ÿ)¦Å*82¨}\XÌ/ç­ƒ!Ò† «m]äw3Äü̬B=‡H‡6š\¶³˜ŽÉ3î˜)lAHŒ²nJôR¼«åÇJa´‘ ×b$ÄÌ«A&Æ–¡h•Ú&U6;œž ö€paz3;i­nÅ9#ÊèøÒgÖÍÚ¶Tj%Øìi„¯ûHå¹bï–Tš­&¸(i¤Ø¼1q¥Íåvrs#¥@Ÿ·_CR¾¼Ž€‰®Þ¤½ûª¹û.[8¸äÖS®w×âBÑüi5Éx@’34ëGˆ¤Q·ëÛ˜”‹3f„¶“buÇzuO,nƒ˜GÃmíçú7a4ioŠÛã54› ‹ÀEœ;‰S.­Öª³ Wø °PJ¬.æûJ+[Ú£Rò³fÕfùÁÆþãüðÖFJ‡´nHˆuJ®_^ˬFD\oÍ“òô”ŸFps5Ì%Ø‚Ù8ó[o­$¯n¢aTƒ †—XÜõ†¥Æ©¡ ¥ B-fÔJJ,.TÈèÆ¥F-Cù‘F'„ÊVãÀjŸƒ™Í3"ÛðE?é®'E„÷¢´îV˜>*ÏŸJ¥=h¥¼MXmÒ¨•g•­û1ΰN”wÁß·ï}züì;£w¹Ê~(c@5»7c|¤8L@»Ôòîîí›Û÷Ôʬµ³F· €C2f¾?7¼_Ù …” ¥Þ¡Z¡r5)T ¨2FWð¶agA¸®IL©“VŸ¡ÉOCl~UâŒ[èžJîðòzìÒZd-ÎB²å¸Üˆð%V”q¬Âm%ÎS΄+îŠÕ€º(|<©ø öô­úV—#”éËdSbC«Þ‹û0¬Ë zM «WCŒ1âBƒÈNöíÒðÛ9»â'ÓL®<<‡Ú^O¾´êÇ pIÆ›#z7­6|q¶=½›o… +”*ò|i}5&PzS/ÍÖ¢Ô5?ú¿æN/v¹¢¼Ud±ÐYݵª{!Ülì>Ú´z7¥Ò.º˜™S] ‘(mi¹Ô|ÕPi1ó^=\hiÒ!ç{nm‚óYÊj„èéˆ1…Í”!³PÛ~DUÊûÅÙ“Âìaiû¹Ñ½mÔâ¸6{(—w’PÃî7\n_¬.ÇØnuzúèSD®­$ˆá¨ÖIËu­v¢7oƒÏ,GØ$[Ü-BïzOÈïBN¿a/­¡¿˜6 ÓjÒŽfì£NZªB>]IHaLíí^d;~\ã½±Ó»­Õyo½ßZM]õgh­¾´ BÞlTæOo¼û£ÞÙ‡Rq~u‰¥ùêè\)N¡2A*}i ’arËaz1!RßL›ààom`P´ð¯(ŸcÔÂ(´–§ô*œ•0ýµkÑ_¾Zs([ µš/Å®FÉ$›ó¥¡DÚìÓV?Fä¯û)ŒuQÎ^ ¢××Ñ?Ià¡\ --æÊ°'rù `5˜ÉfŒt'´ nti{lÔo˜í[\q¶‰ê—}™p&›ä +¨\N+U>¿¥T÷Él/%äüq<Ç“”ÆXMÈ•ùÅ5šª{/#Bu9J§hU4ËR¶ÆÙM*Û‚Q=Þyü«…ÝǨ;Œñ%ÞîÑ ž¤AX½Òäáñãïî?ü^y罄EU%?b½qJ,CíQö„Èn¹½ûjù(Îæƒ)^´»‚;"õÆb嶸7°GùñC¥²Ÿ1…ѹZÛ Ó.([œ+³Þ<ۻЛgr¼UŸ½þ—+ˆÕ'òsÄÙAcçQ¾†ˆ-?,Œï‚kó…} +FYï°v?ß9iÎî£b—+VãàÓ¨íó¹Y‚¯‚µ]1PB‚ÙÙ„D@X@øð£ri/£t8{ àCL½²ÇXݸ%Ý´Üä‹ûFû¦Û»ƒÈeÐÒŸ¯Íî“V7ÆÒrkÉÂQ* ×6F«š¥‰àt´ÊnJ®®&„Õ0ÉiÙîùÍ™bn‹2z¸ÜˆQ^(ã\ Ò×o÷3jk9ÄÅ™Bœ¯ êbݱ8[XLüH*^ǪîBiý›Å\ÔBñÂ\µIu5Ê/ù1·¹ÛÞy”d +o® ð†õ(xV5Íäý ñšŸxc9æKÈaÄLòÅË‹ù9ñ0¦Ì¤•ª÷Ñ!ø€>Cî[K‰„ÑøPƒø¼âjû›k-¥§ÅFUýi¼BÿÖôî7JÛ¯{¸ºx8QD=L-qÞPªîA’"ì 00*dÓŒ’$eTÌÑv—qz€FÙÊ.Y܆ %äFiÞ‰ÆÂÓ{““WÃÓ…êiwP.ŸQ*ҌѮV9rÛÀ0ZãœvfÁŒLI‚ÕÊH¹åÂUÒè†q«Rez9%”¥”ï!R)”±2z‡ÎBÉ=ÈX¸³FÕëž0N߇iLnVÞyÖ?ûpqErúˆ0ÚqJ­}¯sèÃ,Â{ƒãÓ÷wîþJûø]½yÁu3?œž¼ôÚ‡~TÙHÉIj›wF¤TGo=’Q½Ae|Ýšë ÌÂÕÎâF‹Ü6 `7 ³âèíN‰ì0)T׌cF–8›À´†Ó»%X4»À ¨e?žá]BtqÁqœ7…ô%ìŒÚô§µK›x5Ã{5Â%(Ò»˜ÜJ.æ”6Á¶bt~-*‚øqsÊ5cÃÂQ‚6ÑËÛZe/˜qÿÝ•€V‡‚äVãª?ãè"ß=•½q>•Òt! DGåWƒôõÀbXèØñHÆ^AŒ¯®¦®‡ˆ@Š‡ȸÓlë|~ûë[w„>Kûë) ¤‰Ív(£E8“Œ7§óõ–g¯ë á²à4y·ª•²ÆË™Üõ˜¢8ÓJï¤0¡¥xQjàêÛÏÌÆñFš[ŽbqÖbÜç’œâOëµÂ༴ó”Ìo%äZ˜tSB5côb” ¤”¦rí6 ÒdÉIe>7GäÆbÍA¹ªTO•ú-2;C„Òr{c5Îè¤9ØH¨þ”ŽI5Þ’zSÎ $·:Θ½ xƒª Òkõ3»{A{;plדüzŒœž¼r;'˜,_ò“ù0]@äºÕ8D¥b‚Ë;íÓòìae|žïÙžŸr€%doä5öùlg9Lu3©$¸*ª6W¢Âå |)@JN¯Ð; ¢Êêb+0{ùÓæî+Ê­Dx„/ÌNßmnÝvZªƒoÊÅ]¹¼Çy“ÅÝaZÌÌÆ^˜q/ÈMÌŠ u +tOï§)g²¢Qíí?âó“M<{)È&ÄZˆÊ‡™²\9ÚLHË›¨durÍPÏ«QáÍ•Ôå ,Læ@ü¡´®È(aÉÅY¶{ªS›I®¼™Ö—Ÿ%Lén& \ªóå­sÎ@†¢saD_ðËšëÙò|Ù~e)ôÖraËi¶Âô0®/‡!}˜¼±Pu¥l·ŽJã[¥ÉíòÖ=¥º”˜Êt¶`/¯w»}øAeû¥3zÄœ`³¨Rˆ²YÆHÕ3Â;àKçùþ£Êè¡”Ÿm"b’µ)«•r Ö–ˆ1ç ǯ·î~±Œ t±¡‚8¨z–wf”9¢¬tîFJC„r„Ê­$Õ¤ÜDô>ëmC‚ ’îjRX + PB¸TáMòyÄ`æ¶_©­$Å·6Ðõ„Ã¥s ¾HXDë‚¡ç{7ú1m÷’Tâ"W!—­#æµïGt΂;Ç™â’_lUœ÷c¦õ¸ÜÞJBõ!:4c’qI¹´Î,f«&àÈç£ šb5*Fé<$ŽMD]ŽÐI¡Æº3»w˜Áj—7ÐÍÛߺçT¶¢˜êKˆT‹V‚0áµæO#8ßêî~üÒJa-&¬Å%hÆŒ9Ñ ôŨ(!zB­nÄ… b¬EÀ$€(T(¥({#Løã\Z¨cF7†1®q=@®2’’òÀä_]N­D±°¸#K­SÎüZTùÊÕ0[F¬ ÙázŒWrΛ£r'€.btÊ{¤VW‹[˜_L~BêÔ"§$¨,kvÄÜT+osNŸ2”Y “úbù¼‹ +@Òl!R>-x­JšmÚÄéb’-’fO,íÔ÷^6^KÕ£®Ã`#DvÊH/Ä”Aš3zU¶Y»'ç§@ äãR-Ì•ˆT•La<+$7ð/oê…šY‰ŠáLŽu¦ˆT¹¼_õc„ZÙH*˜ÜŽ1•Õ„¾ž2âl‰0!ª$Fd'ˆ>ÀÍÑ:n}Õ‡͇®&8\ªDq=Iè‚;Èa ;xvæK+Iˆ+Îx A cQÒrs½q®U;{ïh•}( Z* +v{%B^S!2‡È-¥´_Ÿ=£ìY³¯é@ZÙLJ×Cð.®÷@÷Ü6¾?­,mb d<Îå †(7.Tá{K.î'ÅÚ¥ |-% +$ÌØC±°½’PH¾l—f(e@nFYà· V‚L0ÁKZÙ+OK­íÕPæz€XœÐcótv¼žÔ®è¯,Cˆ¬.uruO³ùS€&Mó%¨®K+É7–Bi*›Y¬¦g­Åe_Ró'_Lû‹f¬j,ù(\¬zg1ÆÙHŠð¿WüÐyDlÀŸK~Æ,Œð}-7yc9}y“Kðe _’ a*à1Øn’v¡ªaà®Ò¬»˜§W)±V‹Ô€¢×WJ»Œ3YœrAà• ¢²Á#’\ˆ(ˆ›)Xnh6î©Ù< ­öb6!¿™’ ¶ý)*±Mh{å‘ä`O=¢Å˜œÝ¿/×o‰Õ›\q±:C’/E§„˜x‚tÔò‰P8¢¬ •`Zg1aìz:’V½îK)lv"äöQµß *Êç÷u%$gС‹im¤«I±%æw¤Üv )#¤ÙßÆ”* ¢“Úbåz!7„˜ĵk!‚Ò[Ê—ç$¡Øâ\q}‘ƒðì/m®ÅéHÐHòUÓn/…„Õ˜’䪢7'Î5@£„ ̦܄<_Kð×Â|R¬›Í3µ²—d¼ƒ‹OGo'¥f”)'å†p®Ç¥MDƒö\O€Š¬·…ª‹I,£ˆV vy=“‘êÌ„ŠY„¯IÎD²G¨P†R_òã_.mÏ_Y_Û@¯‡¸([-„P€ƒ$¦Kkh¹w +~zy“¼æ§ÁÂ|q °M´š_þ嫱¯]O†1+€hËAöÊzþô#©´Y³ËX—7åµfÊP±%\_R!šUUgð×C¦Û‡™AÒÛÀ­·‚ÔRÜHˆ¥©ç”ÙŽÓYêJoÄècy™­›rå$-5P©–âK« éµô?áG (Œ8Wð£Ò$H¢ ¢4RbSjðZGµ¥ µã¡B¤Lœ9ªj 0’Îö!¡ RU*ír¹iZªEdº „’ѵåO +¹Jê-(¶hÆL3‹Ù8õÒ(šb5ÌÂ"|Œ2 ©JªàR <þËÚਭÛ|ñÊRÌÍ ,,Nw‹ÈïëI1B»riŸ/쥤*$ñMT¿Ä}¨‘j´7ôÑf:»‰·çWbò’”W‹ã”P]‹É¤5á ‡¬·#äÁ+[ר8ÝzJ^ŠÐ¨Ò%ŒPÞÍ'C€ 9»6/ôÏÀÙ£|ƒ6ZëEp ””Š(g"\6JQ +¹¥Á´Õ…ñyÉPJ-Åæp6® A/HWy|ˆŒIEè Ρ‹µÌš@Ψ\aAˆ´!“ €¿!”ök‚(]ðZ‡xÂè®V:¸1†fŒ±9Ê”{)(åf˜\Ÿº"ã!é†Åуí0M+ï@S„p ¨`9ʭŨ™òô¢uüíŽ\ÑnßJôg¬ D]Oi nKá +œÝYû2W.‡À®E¸%&‚)&uºƒxåª)¹ÃåçI¡´¶äà¹àƒ+!&£õeäê1ºLê”/,m¤¯ûˆ@J{s% "™1©K•ãáÍÏŽ_þ¶Q=}sõÇ%B^ÚÌ€_ó/n³Oñ•lã†Ó9ÇÕÆr˜«ïÒf?€f¯Çäå´ €RFݽg>ù]¤*2$¼¤ÐŠ‡­ÆñåjÙ‹^FšC/øñÅ9 \­CƇÁ‚Ö^Kà,Tv›ÎÎÖ’:põfJ¦.¢ÌØ+"–€óÆý¸•ŠZm?cÂ÷ç}H6„™IÚNRÈW,£aj…ñ‹»óû ¤˜ÚHÒJ™„à ‚¦×nôÚ\˜‡q+˜VH¹Š …Í$½´Úˆþ”H[C·w;-U6ÓÊJ˜EÙ!ä}1v3Æ%h—²úrõ˜+îFhge±È²\êÇ””TŽ°EàʃT²î´kU3f[­ŠÅݤ؄¦ƒ4šÑÝüIn-J‘zG¯Ÿ§åzB(âf÷jBùÊõx0)“Ju#ʬ0Èãð» üfã†àARr3­ÚRv„4P°6¦‚ª‹‹q­ƒ½¯•EÕ5š[)c)g `+)¦”抛Iš%£T)£·f€âBPHL)Îý¨ñµ«á+èe_æj˜[Ž‰€vT÷ÃækJy?Ayë1‘ÍN“<¤T'V×"ì›×Co-G¡lTJ:Nkž¶O?ÎÏžÙ½;¬;_ª_½– £ Ðzk%L©à/¼7uZç¬5Lòpyè¸Öü‰àL€ÍüËíæÏŽžçî»ßÙ»ýzÑ"ÄØb‚-áZ;˜±™Y«O=\o'„ÒZB¾•WÁL‰\J¬‚¤@¬#j„;Lú|qŠxQ‡„“æË)¾àÇt@ß8åHö ß9…"\Oë)¾¸šL9-´©81ÌØIÚŶ1^B¨g;·¬îMbh·®ùÓ¢]\­bFËÆ #Rïÿ¾µ‰\õ#)Ɖ‘V0c&ø*DH±p`4ï­ɥµt|á›öb¥ >Ÿ«ˆÞ%¬¦µ7Qe9BàzƒvÇîàŽÙ»RZ”͆ŠsnŒuÀÈB¤CfÇÙÞ»÷äâòFz9DÇ(7œY,_ܦ +¨1Š1Eˆº öo\-û1_œ] ‘ŵÅJR¨†)XŽ¶Z!ÒÀ•²^?ŠübáËFZÊCŽ’YÊhj¥ÙFJ`æ¼™íkQk%Ä]ñ¡ë1Üߟ¿v%DTRkârÓ‡9WÃüÕ0{5@€¡¿¹Ž™18$-Ôp­‡HM—kAòªo!;—Ö‘µÅbÊÚ:Pú—Ëœ¥Ù*cM6ÒzÆèPÙ8;„Ó7}™+!BWq¹*º=Ñí^õÁa´À4aX¯™¥ ã +¸ÑÊ=ÞÝ-¿–ãr;¼3¦ÔBf×Ât€ÈAmQ¯$ä«^ë)•ÒÛJù@®d¼Y„¯¯AÄ-î ð¥t<»…CDíÂ@€/C5†zd-!}9㨋€·ÒŒæfôA‚A‡&‚”` €Ê¨Ìä‚lÝöíîéçîìyŒ)×0#F9)(ÞƒÍ6÷úžàÙA" ÐoR@ ê§rq&§+„±E9û|~?Ê®G!RÐàVýT-gŒ¡h/aJ .•¯IþVãHoÞ ³• Ô„ˆJ€øTØl7ŒÉQ*Kíúìqïè=Ìh­cÚ"áZ×»ëi- +À•„â‘T=#³[>Ô¼´‘Z “áŒ"³¸ƒw¡mÓê .ÔöH¹²¦”a¿<¾©·o¤ÔAˆ€í䃨ŠIå ¦úˆ3œ"£vÌÖ Ì¸äÏ,A0LÉATZ[ÜÒÃ\ Òo®bĈ/ È\¤ô•G¤Å‹kˆ1e±AýÄâìé[xœ)h•#¥zƒÊŽˆ|{Ù^iÚóE¸7®Å7ªVÞí?3[{Q,iqé ‘³Ç`ÍÀðsh¶oFOƒd>ÊTã •Li-­] 3WCtœr³µ£òäIuç]£{±’P—#h?b‚»)/ÂW2Öª”ËoCè$ƒöY +²P–Q*O[3@5Êå(îs-L¯ý/½úòYP*ÀÔ$›g­žœŸƒ¡ø1r·^9¦MhU'€–¸ü$®4jS(”÷^KÕÓ Àq=€Ó¥´w;%ÖqsûƒKéÀ6àüÕ(U¶J*n“V¶$Ζ£t‰2zi¡äó2‡©]»wauîdÌQ”)B:Nq©×¤\ßje²}£u–Ÿ<ÈOŸ ú$:E-î˜Íó¸ÔQeDª§!1Ð&ÚJ$Âaôûvï^ëøcÒ›ƒ,ÜŠt1©ŽJÅ´ä Åao%…NŒYœ! âÖµ ûâKˆI:KšM6*;ÈǤ&&ÔW#ÂåMl#.†±ìz¼Ï€ÆËÈèTli¿¹šúÊ• Î/NòPÓY¸ÑÓªvë,£6V#Š“ÜžìM¿z-âñv ‡®Æé"à"hïR “âk ÿŒ=],»¬ô˜·Ó(m){-.½¹’ò¥T( Yû[O×Ì¥ÕtÑ0ÞKr¹0“O›#gô¤¾ûJ«J Z‰2Z…ÑðMÌë à’úˆr¶À V’TBœtõÂÔªl[õ#8¶ËQ¾y-¡y] +à«i)Ì–èÜ®R;¦ó[hâ°¿8Ø`¼‡¾0 ‚¬ö¢l þ{)̬ĸn,ž_(ls¥}¡´+ Èò þpœapµ“ÑûÍq¥†Ëહ DÂô–Õ¾QÝyÚ9ÿ,ãL¯FxÀ‰Õ0II„ó|)i5Ƃװޜ÷v(cpÕ‡^÷c‹Óƒ)¢"—ý¸šÆ8[¤¸ÞZÜç@çÒJ↙"¤-Ìgô.Â!‡ËE¾05;ÇÃWÍÃwÄÚqˆ.o¢Ù´œÓ3n‚¯æd±²§;‰ð¥5`›Œà:ku…Åýº“¨X IMÎÝ"Í>ø)"—rƒ‹ó$I^«I-%¶ œ†p;ˆhW7Óa\Qòc!7¥­UØL™ë (N‡±`”‡‹¥pH‡sÆ„5Œ Õê,@Óh€‚¯ø’Òb¹<+Aå×9w +Áv5ÁCÛº#Fký›76á@1v_¨’î."56¡2WÒ«Q —þ´êK„>$´A’­²æâúÈÈrˆ‰àY 굄bÊ`.aÔŒ£F ²·8 ¾f¶oòö0ÍW’t!JfåÜ°48 $%PÔuD ^Bn®¡Öµ¨¸Z>ÔBø2@N„Pã +ê¥øn8SÜH[ð—ƒD„ÍÇøJˆö6 3&ÕäÚYaçC¥s7!T¡¡@ÒýxVpgvû‚pvc|c³×÷®8aÂ\,1/7ÁOá0Ë¡r ú²ÒJ\€˜ŸäËryñð5àzJÉõÎìÎ>n”£|>Ê‚ŽÙi”4Óœ·šàVb4±¸=@¸æV"ÂzL^‹ +ÑÌâòAŒsp9WÞºG¹CÂ[%]]O*¤ÕE”æ&j€ƒ/nýÊÙü¦¶}¨ +±1œÑ­J›e\)ì¥ÕNaò‚/ÁÖƨÜFœÃõVŒËmbº?c²ùIs÷Yeë‘èö1ÎMà}¶{3.Ö¡¡6‘,Ä\ï;Ý[ba²ã6¢Bµ¡8¡[rkÍB³\ ).ÇÛ]?®#J')u3Ƹ4~b’`‹1Ò[±iÀ` &*¿x|,㦄NJêÆŠä«×ãËa«@ï×"b„-k­bó–Þ¼ Xòæúæ*öá+)”}'<,·{eŸbK ž—6P0pUˆ~›PcÙ-ž…X!F(­oÄ“„3v‚-/‡øk~f# â¢BeñìãúÒê[ëÈ,è-¡¶ÒB9Bd7ÿöÞãG’4Ë»¬1¢ºR„t-ÍÌMºimnf®µÖîáZfˆ‘ZTVUVuUuuWËí™ÞÁî fgwÑ$ ‰%K€øÇϲw÷2—=``_{Egx¸›ï}ïý„™E|”“kbjcƒ2ÃB!èýZw°ÆŒ5µêÇ ö£ÉA%XÝ™[OšÆ»ñÆl§Œ(OÆ°î´<ñþ¹Ù¿Œ 5?aÇùbÂûƒ%\­Ã ùÂX>åóÛpTÈ3:`iÛjœ N¾u—\agó¾” *`É­eƒ\±»KÓ×j}'éýi ô ú*Ó …MLŠ²y¹âýR©×îéÕ(=˜à+Þ¥F©ʤÕSë¤=XM¨˜X‹PٙÕ:®Öàí”5Èt.SF ÕBÐÔÕ]£y~P+Ïå<àIVq»vm›u‡\n ²k8/ dy„±ü„fÖ·»ûÏg2£i€ŠˆÑ®š›æ:ÇÞuL©fT÷íÖ©wzyg‘>]‹E3éC×ÄÄ +_:ÌôŸ·¼¸³cÜûátŒÎ@‘€¨‹ÒÎzL\ sà¸Á°ˆ¹‰w» [ÈwO?ÞÒ û‰,ÐÄ +¢ÃÒ@ iåmµ0ƒNÛý˜PŒ‰ÍMª¸‰çHcR?uÛ‡I6›L»fspôÅöã_g{°Lkqy ÐO¨È…€†/e±ÎøàõßÕ¾¡Ý)hõ͸ÂeF…Þôìõ“ðgdJnµÏÕ;ýF--`žÀ8‡t¦"2!2 R´Ê^¿ý{³yÎågaÐÕb%Ê—RÓ¤9ÞAźQY°v3B*AXq"‹ -9·SßzÁ¦~Ú²jËñÉTmf'e¶ÂBHd›PXÐVÇÛZ(R™Qiú®ºøÊl=À¤*H _ÝU]Ê¥i0]\ÇsˆÔVK'ÙÞs¹t°h!Òö~)rxmu®P£í§m?n0j#Ê8«1n-Æ¡|Ñlœ9ýÇ\n¤¬•˜`óðX‰Ñt!›9ƒGƒÓ_Ô÷¿«¡4$P¡µv³Ö¢²ß»Y½„Hu­v¼¼þ}uñ.—h§—íÛÝ+©¸HåMÂÜ$,.30ÊÛIÎOTªSF×iŸÙ‹¤ÜñÎÈqÀlaJ5)•b,¡µh­éY!LOò%ÉûÃÞ€o˜.ž±”¦Ô*m÷•êavté<ˆ2ùõ˜¼™#D&ˆ*1ÊHPæF„] +˜PV ¹¸÷·™ 62Õmó1‰sæíão´æ‰]2æÐËI~Téí&ÓúgþnŽ¸â¡Õ½®n}!–õ½ ©,æç«éÃôOÌfÊ‹» –uo_oQY§ƒ6³’P¥ËX“êìUÿø[D¨ÞY'B˜ åDÙ(ûû6@º1¾LÛ½Zo…(77|´|òûúö{­qêÃóÿÏ?‘1øÿ{ÿ_Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚüÿDFníŸÈø/ý~}o¢ O†Ÿ4¬Oür†èÃ÷¥áñÉôè“Ü'þ~R>:Ñã“ÅþÞðèb- O! _K–¦ÃµÐŸ^¹/ZË-æ‹=x²<îLÃk1x) ÿ}‚¬¡kÈÇÿ5.>‰StŠJ Š“(‚Ð ¾FQÀ†¢H~H®íz/¢R‰Ea$†¢Nÿãíx/Â?>ÇÀqÁàEôÇw¡) +¥qÿÓ‹þÑÇýg½è}ÜÖ'õOö>)~¬…Âk:D%O?9üOÁ¡^póg,v¦é?ýS™BFþC2á]ó“¤6=[Œ§%SYkä>i{oöòù§/kÿ)(/dœLPäZw CÐ5!½÷oýç½Ã›Ñ|×üz-³D©Æ×¼÷"Ÿøýçè@zL1úI#ó_¤äj”qâ\–Ôê”ѤÔzJª%…:a h{Dh-L(ÿißo97eímuB1’v#Œ·“&Wp¹šL»i½Æ;]µ4 +SÆSö7lvMg}IÎgb„F(eÖí‹ÅW\2ÙžéÅåRÊ(…!çvQ±Ì»3µ´cÔIk€Š Ê™`j+ÎÂdS¤Ù£­žZÝIª5Dñ6m–*0ùn"\QpGfý€/ÌÈL7œv©”s„Q Ю״ú¾Ñ>Ï Ÿò•}DmDø|8íêÕ=gp¥·O´úa¦sÉ–˜Ù ¥]Òh§ÔzœËû ÃÈ ÆBy—Ò*„Vó¡2|&ÕCL6Ìä¢\!¥5ab¸ZgÌ®6P¹é4èÕ#Di™ìfÊðãf4íÊù)ï ”& ÖìñΈT[Ò bF"åÌN¶u ŸˆpyFïP}5ÂEH'ÆäâL.–.P怴†¸ÞKi Ìv<]@ø2Ê—i½ ‡Š3ù”ÔˆÐY¦BÆâl1Êd£´ËY}Á!B9ž.úð̽w?Âm$eRFÙ,!–HÈ!™ bj’±7bìÝ ±H!Ò‚·Gè\JjbB5Áƒ)VÐ[±tv#ÆEËêq)‘.j'%µ(­—ÎŒØL¿6<·ê‹0¡&ù2kåò‚ËC„Bà#ò˜é J3Heƒ¸Ei-µ¸%gÇh:§ç”ÙŠr¹ e%ù"“¥í1)W”l'€É~T¦¼QwÒî7G„5Ƶ¶·›·Tã*Åâ–Õ=“«{\Ö±`™ªÛ¾-Ž$…B’/ù¥Ó¦7.£ãKoÏL'JÛaÊ +SÞ®¨\ƒÅùJœ+ûSÆFÒÛˆ/Bg¼‰ŒFB(¡JCÈoe:Wåñ“þáÛ¤’°.;Öš'ÙÉs½}N8ÂÐFw~ôusçuL*IK,l§¯íÞ"3!2£„P†LÆÓ9„+ÀÁ?î#x{`2.,ÄZŒßˆ‹ÞÆ°J²ê­¸XMˆµ„PKÊMT­?nD˜ƒ0ãí¦œ0eqo;²(•I‰Åë†I3ˆéQ<ƒaÊ–ó#»¶uµfýIe=Êß2LC)mÚ£ršœ5ìY eÄ™l’+âJj )@øuÚÊ…í_¸¦~À¡2ÓFWr§¢=I°¹{!&€èQÒûsæwü©õƒ2.©v(½›âK«¦‘dó›IÉ©ß@¬0éB•&¤éL“B1„)QÒZ‡$Ä„-ê•C³v¢WŽ³oW÷¿û›áÑ«?[ò¹™·Åâð’²AÂúØD…(õãº÷‡±‰ ´€˜ŸîK´Xï¿ ãe­!!Õ2íK£uŽËLÈåãæHLn$ÄjL¨áæP*l[ÍcÎ&[rvçX,Ïp³A˜]X_Æ™¨•ÎöK¥´…Jm(å=©zH˜Ã8[¤‚!|!ÊØk Þ‡*Pcn˜ÜLðuBí¡bP¼? $tL(z5Æç’rU­T—_6v¿(m=‰ËyB«Š… _š±¥9žªõÓòä¹Û9kΞØíð·¯NA*lv±¹9ªuqkŠy‡­¤Íž·jRÙDµMTG%o‡Pʸb|IÊPÉ>2³I»Q±‘”{˜:+GˆVß@eÈ3Ÿ_I{ÑîEÅ ‘•fŒq¦àk<\Úˆ +›q `!F:’=Lµ(Eϯ„Òkn5ʆH•\vAgæŒ5•ó{Rv¡²¤Òð6”ãË ®‚«=Léò¹¥Õ|€)õ;!r-Î ãàJ  ¦Ä£²w|Ä@¤$íâr‘ZQº£r¤ÚçÍ>`«×7’âZR÷¥L¬A°° IµŸà‹ŸO²¹•0Â4”+1z^€KMFë(СãkXâ?_‹¥žQÛ…‹îIÍ_IŠUJä̦ÔR9êm,V’íAoùÀØ•*´·iÉ$)Õ7Rº7¼Ý‡Ü‘Rœy[gd:˜ÖHDnZ'ÁøaV–ÅÉC¹<׫s¡4%Ì6› Å-øŠóJ5·q(Æë¨äÃ4„«pÎ4¥´P š± ¬mG€þHÃOdÂt‘6F|vÁXÀÚ¤PÆ•:cµÓ΀ÎxA_mœ•Dkhµ}­ºvRaLºÝL÷¢»÷¡8}Ž©õ• Ĉz?Æobš˜Ýr{O¬æ¹·9X¦ïí’ÊŒWa~L_G”€·Óu1–Îcb"Ö‹ +•„ÜF•>m͵ú(˜·ö>—_øRæzRÝHê¸ÜÀ¼¿ïÄÙ,ÂWg’^N¬µ0ÆŒ¦ûÒzLH¤ó)±LYëqy3©1`䎟ÜLÊÑtž6ûÊñ§2T&ˆ'Bz oƒ©”MvৈT'Í1 :@ºWx´À(ìíB=Ä('Å—¶p?”ö#š/.ÝóSqºi„†è‹PyZišÅ¹šAIo$U?fùP-DdP¹•vwµê¡T˜‡)÷6ãÂzŒ»ÀWB !VŠí>;K*-¿¡ÀgJïQr¹%<ŸëˆXåíQZ¯GI"S›´=‘Š»ZiÁ˜-„Ë)ÃfçÐ;iµ&ægA&d¢óˆX²s.·Å¸3«v0;þª<º Ю6ÕʾÛ蟸ÃÇbiË,-Ÿ¿ù+¹1_Çu ZDn#J‹ÍŒDgÌO¥¤ XnÂÛ™³¦óðˆ/yºU¬Þ á>ÂÉÅAk‰ jF¨B‚­J΄µ»wcÜFB‹2•´»#÷…ü“'ÅT ( +X_BX¦7|×q©N«mZm!éb˜°C¸ÌâOJ2Ü·‘PVc’5ýˆ¥£³!2³žV¢éOד«QΗÔB) Ñ,”«·U5 ’,{?Îm` +LŠ–w·(£Ÿ’›vèhPËü0iά„Ó1i#&Gp7ÅVC(H =ÉäV#ÌgþÔ½`hËÛñöxL€Ø£³AT&J +¨[Æž@©Z7%€Æί†é»¾T”€w×é~BºW(µ]]o&3‹ ÛA` R“s—™Ö…ݼq•V +ÙÚÂjìF'¥6íZUÎŽ@sºýËéò™NÚlEŽ@‚ò7ÇPnÿ±Ù<!%m¹8‡U&”ä†\Úδk³'ßþusïYB.ÑvŸÍo±ùXÆ Å%nô@¿E(8E*,@}Ñ戅ïmõèm½l,_™B˜)¦Ô6›ðî8 àNÌê^©w.æ&1¾@hMBó¶ñÔë'Nÿ!_˜ëµÝó—¿µº‡+I$ÝäN@±¢B%DÓø÷&¢$×Û¶Å΀6RW; l`!6“âfB &ÈRël:­Þîîqê$Á¼W½­K€©µª[lƘâj\¸¦6â\•#¤…KUÄ€ÖaÔ6gcL0*FªÌ®Ç?fB¤l&”ͤ£]€Çn®Çù•%_B[ k1 4cáeãKéÞ½b5L»0gBmƒ×€2ƒ·§¤*¥¶)˨~@¡„ó.ˆ®Í„HªÀ’÷‚$@ÐjPŽì}…9„‰ Ô!5€ž¤üV‚˃¼ÇäzJÜ6¾@T¨U˜$Æ—iw%.@¦”úÇ̳ Á³„’bÖ‚µçN÷IaòR*,iµÎëµÎìQyrôGÊìðÙ¡QY产|~òCt¼íígV´Ê±V9 ûRù0¥·ÐÒJ#×; P&¨q\iåú«óÝ7µÝWLaf³2}ªÖC\).ÕRZ[«Zí 0k¬;ƒ)qÎÀÛé‘ÎôjS«î[ͳÚì%ò0WGÕ*B­ÓF‡¶ ·„Ü,¥¶€=!±ŒÕÙJU½vP[¼VêReÛé&Äò&f R ÊœÈFJ Q6¨Æè{ÛGöZLdäšYÙFåêZBnÂä m âDn2 Obf‚ý\J)ê£0…CQQÎý¨°–P‚”ßF©BŒ®l"Þ>B |Ö¢Èx?°Ö„T3#§~œ6G!2î£r˜XÇ„¨Öå€È_ @š±ê>"„W + V³Â8Ð"Xc0‰• ÷š&UB¸ÎÚ}œTAÔ¢µÀó‚c•óËLã$œvCt&Æåb\°v« uÑ€¡X½c”1hà ËÇǵ&˜î`R&ÕíÂê¬É ¦ár›Ïí±ö‚Öz¸Ððy]Ì‚Œ¹Iß QŸð¡¥š€-I ü,TX( ÈyÚì‚ nˆ°Á8Ðz„Iry^kÆiû3ºe¡ä’,àj)Á‚NÈ'™ov#¸þézb=Êú’€x ´«„ÚÁ„+8SÁEh84³·g¬PƇRD5ø¥•u7@€[I1*Ÿ`ŠN&'?"­DØu°q À-–²Áû‹ƒ÷÷£ì_¬#k6ÅUDPËv+‘6½É$¤0aÞ¥þb%°ÄÖÀü¼Í'å8—«åÇdpú§‚=’Ý ï#i¯e8w‚êMLLð¡”8«Å9}½~Èçg °\¢B ô|\(áZG¯µýt¦ï'Œ TJŠÅ¤T +¥pàà@9ýk6;‹E­²«Ö¼*bstfd¶f'/Ùò®·,ãmHÈe?m¥Ý™T=å+§,TŽÖŽ¤s!Ê´”ËÛ>¶ìm’v‰ YÛHÊ(_²3@§µ8ÇdzëL,ïAw `—$¨‹wG\~`ÜûqªÐºrE( T¬ÀZ€â…Àï‹÷!°ˆ`·cd&Å aÅau"‚„) ¦ µË_ÑEÀ´ûaÖÞ´¡2Ú›n-!Cñ€‡¢Z‰ð ñ#Ó•Cà•Ò9Ïa© à⪂ñßLˆq:&ôXšUË¢Ó¦ö¡Æ&¢¯DDZWbêOÖ£ã’R5 ÖϬCa J(¥ÓZWÌïÉÌÝ0µ‰*¤RÌñ6Mç¨àGõ¿ÜˆÝ>DËrÅ@R^ Òо¤ŠzhSVr3ÞÕ7H}êÃ<ü¤2˜TN[uï\ŸCk•*Ü"÷ýñ•NéŒÖ–7+Š +ªÓñvy%]MOïIe*%Ò©Tü¸üá‡I ¦ÿàì!a´Â¸Êg{¨R‰2.4Ȧú DšÝ¹â²3L¨jµí cBƒ¸·…l×1±¨Ww”ÒRpFû·:)­Ee†q¡Jçã€xÝ+gð0)UI­ ºœåN£B9˜ÎKêµc£}Bê-ÐiL~ íMÌ\CT°l°Fe„(Þé){-®øP QŒÎé¥]§uJšíaæºÇla°Ž 똺IpDªTÆOK[oq{öJ¯n'ÅBˆá!BÀR¦¤º.Ïê¯ÆÒATD¹Üý0¹‹ã ñåè=kIÇXø(J¹Q +xÍÚLè›Iµ JiS*< Q«QJ1„÷<÷”eŒˆ„ mEYl/,¢çAÈ!2|MñùpJ#øœ]ž„iÖ"Bº¬1‘Ùî@®…iR,'¨Œ?)#éR”ÊÅ™<ÊÁ@_&§äb ¥æÙD$¨_R€Š’.èÿõ8ëG„8³ÁßÝÙLÝÿ¸é10#`”äNÎ_ý!Îçïl¢›1T"ÈûMD*ôáØÃBû¨ÐÙ½ïOcÉY$ŸK¦¡Z2QÊNñÅÒà áK_Ƹb”„åp6’|2mIN”çZT fœú»šÓzÓû*Uj³G¤Ñ¸J¯'ÄuXÚ!n¶w‚GvÆó‹Ÿ®¢¼•6Ÿó¶[oCi ÙQ±¹?=ÿšÉ×5HXàq¹©–÷›;²£kDñT“RÛ‹ðùã‚ð#­¾XÜvú´ÖI¦´uôøgj}ùi€ (^ðqPŠBvAè=¨âð*ÂW@ƒwÊ\ÊΤü˜”*­å³”Qút31&¥ +@(e¶š‹õ·Lv¬8ƒîÎ3?©þd3qןJ‰e˜ ð‹–_aA›¤D0ƒî?º¡ýI!þÑCµ#"T”¦”f!T•(± &Ô9k +V Ü4ÈQ„?ñ¥>ÛDïà.`7µ„Ú‰±Ùk¯%€F=< a¸-@Hèô8eËNϪÎÖPéãi±"Ø%ðnÞ®× 5‚„PVÜ”ÎÒ 18Ú(‘y‘-öNSrù^ˆîƒv@Ø +'ÐT ç@GBŽ·ðXÊ¿àÈ› uÑ@§ ößn¦äÍ¢Í8w?H{z|Šg|ŪïËùÑZÇ(ä31\½¤6“*.Wg¶þ¸S®g&èFÐù„\a­6@úzL¹‚ yH,ð&.”ÍÒ6¨zB«È'ÓNœÉ@φ¨ "–ÀùJîŠÇO鸌Ù%”:x–”\E„b’Ï•Z{{׿‹s?Ø|¶FFÈŒäâÒîž‘s¼½…î¡jÕnìC±ÅoÃCÒêµ&W¯¿ÿWÕéåJ”£dкÞ)ôuD!õ‰T<rK½}׺qº(Ú ô Ð\>T:h'¥´RÆý0 (Dh uÍhÚB•2¢TP©Tï½ûîï"iëŽCXǨÌ1±äCÕ•¨ðñLiE-y;Í×$ÒNŒ2“lnô­Çw¶ž›¿úm„ËÞ‹° 6Æ6™.$Ù"Ð_0e¥ÙÎÅ·µÙãO7±»>t#J'`nж1œ`‚/C}&„"è:ÐQ<Nm=BC%$(WÌ µü”2êkˆ Œ 8y7Äø€AH›Uêi¥.Z=xÆç­âØó>§ 4ˆH ÒËÆ«¶ÂÚ|3Îû| ©øâ"øDp‹Àh¢Õì`‘iˆºï'6bD¦l?¦o"ò`Š’j²=¬þó{¡û~4„*)±M(-@ixÍZ˜ #Š¬k\ 3 t`îcm+ ¾ +-y'H­Æ€UŒ/"àÄÙ@âZÔ+à à儈p.Âf9£íÔÙü Ujq6÷k@DI>EEm>;¢M0kݤPRK ½±‡«5\©QF “ìêZqJ˜­õ”¹€œ`çm4719%Wh£ yæò³¸TIi0c¯C©‹¹¸È.­ÁC¡º—ÔšàÎõÌ8¦l`JJk‚PO©Úž'ä¶Z>TK» ®¸K;Ò€¼Svˆ÷ç‚ô¥”{aâ³²&P˜geßjYµ¹Û\ú’ k@×à÷BØfR„Tˆîœ±F¤Ñ‹0Ypâ`|¨ÿx •6ÀõÍê‘=¸ZOyŠ  +»"ÖÂÔZ„†…HgºbqF™½0íFI#pH¯H0€°Ð×!*a +¤6P˧ˆ\_‹ñALª‚ +â0m7Lç cd´Î`Ñãéœ?)­€—ùDJ£Ææ3å……µ°ãpX:ðlµ¢³˜T…nBÙüÄF˜M’N”ð6F^ée7〱zš4ÊÄq7RÀ6¦WÃ,<@&áÞ… +à^Š6îú±µHz5âç0)“ãÌAÕýqYÒ{÷PñµPÚûtÒÃx/HoÄÅuïÌ*D¤Çé)·A«„qÛŸT}1(­|˜®wlûÀŠ׸“´Ù‰Ò ]³œÝXãË1¾Ž(]£vž>ÓÛ±L(5€Ž0mA ƒŒü¨òQ¶¬½‘0ÌN'D™´^gV:32§Jå )×V“rJoãzðúš¯œ©k¡z?Š¦ ˆTGUˆºè#d<”ÚÎõž…mDl„ÁD£ +¤æ¶¤¼SÜl…2F”1L~ !Âf ÔK|ª‹vAOBfRJûD‹ÊkÞšrëv5”ÞH(!:—›¸Ú‹¦+‘t%¥t½¥LàÈHq°½`·1¹er¸T—²[!ú‘4B9IÜÆÅ0ªÓj/ÁUéb„´×¼‚‘"P¡ŠŠ Rï*¹-ÉùâB³üqé/Wãv7xLJF;ßñá@v+/Y&™üz\Ž€×HHwüx¢û3”²ÌÒœ5ÛÐ}í¢‚|M¸á B‚0rÓ)Ýõ“÷üäF”ÿÌOüå’,”2ý¨K°½s|¢ ¦¸D_B ¡.Õ˜< DF˜V»J~‘äJ0FmØÝ„óN¼Ã3s¹|b·sù%,=tºYÝ¥aJ ®B© ÞòîœÒ: ò72#7úÄ3P•Š;ÅéK½qšjàþÄÒ.mOü˜",µy)TŽ“j  “biO©Ÿ@)¦Ä"ëö1ïúÚ,Êæ}˜g à³ô‹z/ΖÂt!Þ¸³“,xü©µl1kÑ;e§ã\-B91.”T9½IyÀ·®§!m{|íÇ?çÜR.í…=äÔãÞÕÀ<*ÖÁ‚3õ¡æZ\BÁº¦Ô{ Œ¿77`“ +¤.êÏ)WúQóÎ& ®„ `x åp7™iå¹°Kª­´ÞEøüýþtÓRR +´VÝY$¥'Iƒ‘««AâÞ&¶Õ»¬”€m„°Alę܆wö4 õ8•ÇÒ(§?»þó»¡H +ã'ëØ_¬$×" ñ¼+˜ Ä6“Z<]\‰ŸùiT¨'ØR‚­¡|C/‚ììAŪÎ(Ag?óáw61(ÔpÊB˜BŠo`é` +`Æ»*ˆhJaZo=.‚ý„F†2ÛL‚Y~4€L½¥™|<]XK ÀÀ*û! å~ˆ ZÚJÅ¥‡k¸Ú"Ôv ŒyR¸M¯&%0¼zu—Ô›!ÜŒ³ù(ã1TÌ#¢‚Äe´Ž˜sÎp-NÇ•K¤ÕN™Þ¥¢´Õ—r36·¼K*I.$õõ¤°‘AbÅÙ"iPsOW†£'½Ý—>ÒÜD5ïÌ[ìQJ5ån|Œ([ßó£Tî²™qJª¥d˜g/Ê ©¾}úõÖƒÆYŠ«qpâ&ÎçA`ØÅ­—‹¥4J©n`ògab%!ZG)n® +ùE„ÊÐ*”h}%Ê€ +Sù$_¥ •÷Î ÉIÚ׿å}˜sÏj´ÖÃøFwA‡'é¬/Î5ó%4\¬'<éqg 1Ãd!W?aµòfœN¦íMT`âz”\ ¥ Ú椒d¶îú0~D $@Mq ¨VCôj„ƒ’`­AÔƒP2N¸”Фä6À)4C¨þ—«‰;멵ˆ§Ì?[OùcŠß%‚ÁW-FçkK—ü©L4] Îb®&´MÔ€2vPs  -p +éF4 Öòž÷GÙny'ý’JÕïm5ü®§ØÊæ`VbøGHËj²-¬Ã´QÀ-‘.ԬŘ• ³“<ŽGL€ä3ÁÚ$À{¦s÷ÂÌðqa5)OP±ŠJ Òìo¦À,P ÆŠS&&æA°m~¼þÔ¬ìRVû³(¦³¬=`­.àt Ãd6JççÚ Å<`E€°|ÉL„ÜV~ðXn®a MMÖ×¾¢? w#L7Àÿ‚Ѥ2_ƒ\Â}IÔ"”õÚ^cëº4¾»Š@I09Ð!>:ÇÈ5Š/2B™7Û+D0¹á]†úáíé1fûO'£6“2&Õ\*lÔý Ô v +2&»C«±¿c€™h„ßZLöÚÄ3°ž5KÈëQáÓ5ä'kÉ%] ¢S›q*ÆÔ´ÖX1wýÈF”ñ + ¥%„¨!PÚ 1ˆ‚îÂ?]‰úâ<<ÁL‚-¥É@Re”:gÔ?²³gNá#î½åónª‰ðÀ† À²¾»Ž@‰’\çrq¦#É”g|?Æßp›)+’öNÅ|¼Ü3ã³Ó[*[âÿÏjã„Mé«aΗ} XeñŽ?݇Š%„+€Õ…®ÑçJ ªÁd…˜Œ§F”z”Ézi§=Èá êη¸@øxv: oŠ¸± +Ô›$è +ÒZ‹ àôµâÜjª•Ý8_ ‘&˜q°Ÿ!\Ž2&¬°*o Íò>®57 c-!Ûõ#J‡¾Ö Ù}Þ™1x`FL¨€!är˜qÁ6¦´HwD¬í‚‘ôáF·àÛu àq5Á¯FÓk 1‹1úŒ9SëDe™ÐI¡ˆk-¹¼ó3LlQÆPî3¶¡“ŒKƒ9T"¤ÐÑt $qLÌ;£· -ˆP§õ>%5à4N *ÇhÏ€¯Æ¤“E¼ ¬ ÐÒ š¨mD°c±t™µ&¢=[¨î»}°`Æ¡0TÈ¡ÖÅìˆÏM> ó`ù¡ÓÖÃl”ÌÆèr„.'%ïV“éF0@0ù®Ÿºë#È>A€«bŠÐ5([`µf“6£\ŒÌ‚^ ± ‡ctЗ*¾HúÏîø?]‰¬…Ô#å¬>¡tÃèºøj#¹¨;Ù òÁ­xÊ*ezW¬Â4„ì]OŒ°à÷£¤wÿ*àÒÇ òðð6 ÄŸÝýd¹¦øñ­(L¨@J®a\Ê +/äùM‰s.;5Jy)gZ}‡0;TfÎNáy­¶g¶O3½KDíÄÅjR¬DÓypžk“jQ®˜Ò ssQÀ7‡ëMÎFT1¬/—š1FSÊ•Ò‚¶†Œ5 ”&èg!;iNŸ•Wbnœð¼X°‘ªi{ "¼­·»ðIÊÐûàÊ“R jžËÏÙÜ Ž#œMžàC[]Lm„AçHu¹¼gw¤Ì”zàãÀ½Õ¤ +Õ.Ííúqû>4oBˆ¥].7aaÂzgË6&…*iôXgÌæŠÁÝ„ +Îd1±.¸[{Ü»ç*‹0gA§t1©•RÚA:åK`?#L¤>Ôõî1€f‡êÂÕf&Lå#i xs=Æ¥ÄrÂ+ãlŒ«È4Ÿj .J_‹y²W£”.ÔP®BCËÈu_Œó(ƒ°¡¡º¼KKbjàÄë|q1ŠkaX5B¸a/E&ÀÎæh©,»}_’ £7ôê6ÀÇJ¡1»rÔ»êTâ3mðV~Ð9é<¬ ¡÷1µ…ùÂj8½\¥îøIªE¼»gs¤ÖRË»Fm׬í²î$y Ì ¦m$Õ“WK;c.7-ŒhÍ]pCZm'PÅ™Ý=+n=7ºçiwŒÉ”uÌúm% ”FÏÅü„¶»J2ßrc£µÏfGP~ðYZã 7¸pºÇJu‡°ú¸ÖÑJÛ ì ð§kʺC!7*/Òî &”0­C93¶°#”vÓ¹-LïßñÙ±Õ:@•ŠÞ<6;”3NÊuÚ‘P¨f—ÏOr))•¢|S«ð2>7”ËK½q¤T÷¡Vi½GxU‹¤ ˆÜ¤òáV€´À"RÅO˜q®aò€á^PFŽI›=\©_G˜L˜Ôi½ xžË8ÔmtõʶRÚMHêm:Ó‹KU?“ 0pÀš\ÙK[¨Z_Ô@Ãa«¸ÙÅ­¾Pœ+Õm2Ó# ÞJJ-'„"•!‡RqAg†0”ÖL +%P‰1ÆV’¶Qp´Í@¯]°½„ւ̧”&"Ö‚T>ŸK9ðT¬¥Í¾–ßw/ÌAëAÉE©,08¸EÖìjåy¦³§×Je\ß~¬ÕvÁÑGÙe èÌ×Áãt3¥‰UÙJéÍ_àrc¨Ÿµ¤Q@8@j‰4¸ %JJqä³”Vaí.eöÁÇAG‹…=>;‡gH½ºž™7äSÞMÍÎ[˜©õ=«}È'BaÀØ-©4.L/óóGby.äGJ~ÐÞ}.¦˜R€â³#˜¡\4q…1ç ýÓúò TZBªA5}¨+»{œéÑÙ-ÆÙJg¸\À¤BB(±ÎH¯ïhµm©¼H(5/œÂœ¶{T¦ °É—vÔÖ™Þ>µ:”Ú¾”µwßè­“ ›§¬¾Ù:3Û”ú‘\Ý#Ì6*—c\Ú!Îf£‘럖¦ÝÞi®ÿ09—`Xw Á‚˜Ç‘’«!Òö]ʈó%Ѐ6¨X&µ&›šõC¡0cœª^ÛfìNBȧÝ—AãH•mHTvpžékT¦³–2c\)mÁë§Re¾&„"¼Ò¨ï5·_¸Ã\yËêœdºΉX^f‡2í]¨®t¦‘”g—™ö~‚/¥”†wXo‚Y–ócL*úSàP ° PöbaÁåf€ðéJeéýzˆ^‡úLˆ¥”ÚTJËÚüº2¿¦œ@ t78t¦G™ .—•Ò(NŸä&W¹Ñ9< ]¬ÛƒJ-ÚíËÕ¥\Ý.LAuÁbIåyˆ²0´¥wËÀµ^;¤ÍÔ–/¶ý¢´u-”gvæ|XÙºnÞ>ù¼0»ÒjK»¹¿¾mì<%Œë „ÒW˜HÕ¥V]òn¿Ô=NÉ5TªJŹXÜâós»{ÚÜ}Y^\[ÍýÆâa¦µå€Ukje™<(ÌŸ¶®iw”+FuÕ*>T ´ŠÕÜÓêËÂäaÿìÃüéÙéãâèÁîãoµêNŒ«ËÕ#µ~¤Õ`¯Ú‡_XÝsLmn$%ÀLR*É…‘;85ÚGvÿ¼}øyyùjÛiïu¶®håÞ/RJ‹ÏníÙé³ÚÎ;¥º[ž“f e¶"r£ëæîç»Ï~wþî_î\}½û䫳¯T·Š³«Âü¡Ù=,Í.Gg_o]ÿhõŽÉL›0êi»e4vôÆ~}ûEkï•Ý;Þ{öËÖÁ+2×'íŽ^[Øí½âü±1¸²'O¤Ö¡\ß…oQ9$Ux/Kuï]åà}yÿ]eï;¸¿s{ûju’_í½uluNËÓ«ÎÑÛâì”]„s0­ +M$—æÀàV縼õ¼¾ó†q@9´µÊ•³L¦&—&¹ÑEuûYeù¬½ûz|ò%“éÂÄÒðV­îfÚ§PµÅËÆî»ÜèIÚ 0XÞîç&—FûP­ïèÍ}À±²E8}¡ ¸­µó“Gáöá;©0Å¥<­URl m2ÍãþÉûæÁËú΋öñ—åù£Ã§ß€S¯ «;Ïg¿ß}þ‹ý¿X\|‘i.Õò¬4½bœÈ?ïry}púM{ÿMeq=>ûç²l¶(jµj‹gƒ³/úgï;û/ÏÞý¦ô +’œÒk\vU献‡o‹[O³ýíƒwˆ^CùŒÛ\n7’8§][\ÏŸþr~ýÃé›ß|ÿwÿN¯í©µãáÅÏ‹³g´=I»s¥~ÎÍ1­f³”ÕŽ¥ B»½íöó“Çå­g¼¸Ù©M.þð_ÿ{«{êÃ5«¶™i_Ëâò=xÌ~týs"Ó S¶ì)«ÓúöëÆî罓Íݯóð›¿Ë[…áÅäâ§[¿›?úiÿäÝìñË¿ž~õóñ¿TOèL+×ݯ/ŸC Ý£ÏGç_Ï®Þ;|µsõÅáÛ߈ùÁèøåòé•WZç¤wöaùò÷µ£¯ÍÆV~¸§TÇ)­"–zçÄœ¼…ä»ýÃÖîõW¿ýciry˜>øjñôÇîÙ‡êöóüè\*mƒ¾mo=;{ýWÕé9&ÙfuÒÙX¾š?úzpñÍüú—`Ö2­3𰛨&"Ó8ºüÅàì»ÂüEaù²0}äöŽ³ËÎöU‚wc|Ì” DÓ‘sš^H•¥Zôv®‹Ã3LiªÍ#wzm <æÍNC¬¡MʨÑFEƒµhlÂÜšïëûŸ]:­#HŽÓÛ®-ÎËó«üø ÊâðÙßüñ‡ü J1ÛÙ›]þÓË ðÜÉEûñ¯ÿoñ¯ÿ7ÆnOο\<ýÕðò{èßéÃf~nµ_~ùûŸý‹ÿ>ÓÛõ‘†\‚Ž8¯m?Ÿ\~}ôú·Ý£·Ë³·ý¯þÇúîS¨îÞ‹Úòº¾ûòàù¯ž~û÷§_þëÜðÉÖÁ‹‹¯ÄÂX©x\lµOJ³ëÁÙ7{¯ÿúô«¿ïyòäëó·B~«æôOôÆ®ÑÜ+Ï^ý~ÿÝ?/Œ¯\P •­´ÓUÊ3©4‡Œ¥Œ>¦÷ +ÃG½ãÏI¤`ÓlÂ"ž^éÍ=³µ;ØõÍoÿ8={Ǹ½îéw̓/+‹gÓG?ƒNQ;Arv?ß}N¨å|÷ 4½Ø~òÝþ‹Gç„Ê率;¯¾üÕ#æºÅÁÁðøÝàä+¥±¯ŒO§ìîQ¶wìtâœMÂZԷ˳'ˇß>ýîï†ÇŸŸ>þúäéOåâÞ^[>†šŸ^~óèÃ>ü³?Ö¦—ÇWï¿ýý¿…²-AZ0  ®+‹Ï;'ßwO¾qZû§¿xöþÇB{Neµ¶­¶N­Þe~ôhëÉïÜáUJ­Y­ýüü Ô¿VY€ì±‡W·Êôòó_ýÃé«’Rð“É ª;oJËFë´ºV\\¿ûÝw¿û£]Û‘ò“ÒâI~ëiiùj|õÈ!ÀÜ6ϧר.œîIkçEÿÁ7µý/Üñ“´Ñ™¼5k“„ ‹ùvyvÕÙ}18xÞß<;{j?@©zeÔ\¾ln¿®ÌŸ‹éÍe{ùèúË¿:xõ#©×Û×@ùéÃÞÙ×å—VïÌlì>ÿÛ·¿ø[£1ß$t­ºçôOÍö~nò ú¾ºx¼wñþ¿ýŸÿÏÑÉ[½4ÞüÝÅWÿrþü×»ÏõàýæO~­Uv_~þ›7ßþ°è øÐÆö‹êÖusçùðüëöÑçjmùäݯö}Åf{Õ­Çõ½—ÙÑentÙÞ{³ÿò÷ƒ‹œîÙÒ»sl°–@ €ÀKËt~ÁdÁÄTg+ƒ½îâŠ2ëzm+·¾£T—ùÁùàô Pž /»g_QrnGo,™üÔÇ–BbM(m—&× ±’‹…Þ¡ÕØž¼ž^|™Ÿ=LççŒ5hÏž|þã¿1êÓêìÁüáO»Gï3ƒsµ2ÓªsÊé3ÙQu~ížàjQ-ÍæNº¦u`·v«Ó+£¶Ü9}³{ñ^*ŒzûÏgW_OÎ?Œ|1{ðn¸m,ügÿð?ýûÿûðù1¾@[!7)Œ•¶^ç/2ݳ´Ùþòû¿ùÛ?þ»Æøˆszíƒ÷ƒ/ÛG†¿?ü•Ö€'Ë‹¯k[ôe²àk»€äOF§_|øÃÿÜívv[‹‡I>ŸÎŽ@Õ°¹1èŠÆâéƒW¿>ºþ™’õvUçŒÛ%ͮ۲;§Õ­çµùS\­äj‹|ç2°"À¡zûL®ÙQ¶¹‡IÙ0% n£8:Ÿ¾=|ù«ÊÎS:;ð“f€ÐH½`Õ¥ñ£òòeçèÍÖ£ïŽ?ÿ}¦"d{-ÏêN€ûŽßþayýcc÷ecyÝÝ{™iï!J1ÎçŒæ>e5i«‘=€2Îœ1<}­5¶(£à¶¥ÉƒÚγÎÑûÆþ[¥yȘ­B{`¼xj·µ/9]R*Úµe÷èMsÿ¥Ýy |Ç纅á±ÙÞK`ܶäÊiÖc|—J×ocuWb©Ö¥Ât :Çf(>ßÝíl?ŽóNsñh÷Ùoº'ß:ýÇÓ³ïZÇïÕæn{yýü‡`sƒÐÇßìð~飴c¯'?φ›±­‡à¡`¥g_M.¿;|ú›ƒ'?6—¯JÓÇzaøðí¯ûûO£œrPü”Ù¾Èô.j;o2½Þm^¾ø®1>e̶\‚¬^Ú½s­¾owÏkË—ùöÁòâCLåG‘ƹݔZ1Ëóöâaoç ëtH ¨‘’ŠÐwà@–g +ƒ³rÿ´Ð܃\ßÔw_iÍðªŒ3F¤*8µ¼³|øƒÞØA¤ŸŸê½þÑûÞÑ;x ?—]=ÿúœQ…)•·_e@ðï¼þýòñw•ÉUÚê¼ùîo–ÞÄDaížÝ;* O”┵ºl¦':ƒëníÛUJ#§6;~ôUey—-Æ©Ùݳ½”*°"=˜$ιÅöa¦éqiÖ çˆ¥´*à!€³TAÒ¼øYcùÐho³…!i7i³¢—‡µÅ•VåXÅpMs~aÔ¦¨Rð“:ŸŸ˜ Ã'Oò½SDtµÚ²ºx1;ÿjpüº6?×ë3Tq&û——ï){+ žÍΔڡÕ<ÒKÞéß„PÉZ™^Ë¥^’QôB§µ÷ DÈî“ï§z/ìÖv¡½|þþÇ«÷¿ñeuåò¼l÷TvǸPLÁ"jƨ@€¨\Pê»BuO©V¯;ï¨L'LkVuòIÌv’Эb^t’3íÎ*‚¤))+8«¾-§ .¡ –æÐàR£ŒUž>(m=²§¬ÛÓ” ™Ê¬»ó‚Í4¨Ä@l Íú^Xfñ,×9ñ~“£QŸ^m"‚í8í½öÞ ˜c÷¬“`,0 @ŠZ†öìŸ|˜œ3æÜIòÿ%é=¼Ü¶ÎµßâËI±êôaï$@¢ € A‚ ÁÞ{–áô>#f4ÒH£^,K–-Ë5®q‰»§ùĉ;vâžÄqœzrr¾ïžs׺ëÞMݵ¸f( n¼ïû̗ǽ…þ/J5R`<ÃÙYŒË ÞŒÂêÔ9@Ά|Éf²»š^ 7¦Âõ^¦;ßÚ89¹µW\Ú¢@SÞd‹n6ÖFØؘ…Ô#¬Д'Zá“5Zι¢ùP±}ìâƒÍõÓR¥ û¢Ž@Ò—ª¦ºKžò¤¯÷Gso¬2f@6lg#*ŒßÙa2³6JbR¹Ë¦ªl²äã:—d.•ÍÎ-I­Y«O¶±aZ®ÛÀ 9ØC +£¢µb—îl(D±¸/ÌÄKv^"¥„;VÀĤ7U-O¯4V·˜tÅè +0‘&ïÚè¸ÊÆ5·h!FÊÍøÓÀä$¸Ø3±¼ìNö°PÍÊ%.[YIÈT‰`L…¹5N ¤bÍ ˜M©1³ÅÎâ®0ÎD¬D@kç”0k 4`íô  VJœÛºØÞØc“å ¢@87pA‰I›;vXiTÁcÂìm´Už½ÀFc 6ããþL S,PÁ’K*‚¼Ž6—¢K|¢"fÛÁü|¨¸ìKNjñoTß5lBظW®k-Ô!íÀ¸Mcáh)QY‘ K¨'7ªw©§÷gîRZ÷)-‡4vÄ[”ŠGÅÌÎeÕVÎ*Óþx¬Ðè.nήï=síâ­Ço<ñü㯼ùÖÏ~ùñgüë?þõùWÿøÑ»Ÿ¾çñìäB,ô—¨]-GS©üD¦ÒË·«½Å©Õ­S/?ðø™ûß¹÷áÕó÷»|ß雟»çÑ—^{ûÙ7ßî­˜Yß‹U§ ÒFÝá"© Þ(L$«æÌòÔÊѵÝ3'¯Ý¼òÐã÷=óòöGŽ\zàÌýO=òÂë/ÿø7ßùðÕŸ¾ë™×»ë§¨`ÊL +Z˜†>¤LÕè@8˜.”{‹µÆòf~r¶¶°Ö\ÙžÛ>wóÑgõá'Ÿüî/þøÇ/ß*÷ÖÅTS±:o´ 0’RDe ¦Cã&'é•zk™ÎR¤:-;rmzvëò‰»ºxë‰ç^ÿÉù[Oœº÷»{·žrGËZÄgpx5°´¿èÌÈÃ.IHT¤\=Qnf[óÍùã+»×®?òÜÍÇžùá;¿þàÓ?¼ò“_»x_sîx¼4ƒ{ÓÀ.ê¼bPOŒð¥ ˆWmc!JÓ½dk=˜ïˆù‰µÓWøÞ+7Ÿúþ™›]|àé½{Þ½ûö¥Ÿ~åí÷~ö•s×o¯ž¹ûÓ:;«…\bÂU_bÒ(Ié6.“ÍlsqvólcjvíĹ£g¯¼|óù×~ôû¯ÿñ‡?ÿã«?ÿý£Ï¿¼ÿ‰c…ÉÃjdPã´Qq_|Zί*Íì¸79XÊ—F¹´ š1ÁÁ„Q6N7Žìm]¸¹ºwÏÞõ‡ï}ì¹åã—J3»éö&)dTè·™H·T®OÏ,;züìÞùË>úÄ«oüèþøì÷üõÇŸ}üéïþóŸÿùù—_¿ö£Ÿ?ôôË3›çâ"lAÅ@¸ÂûáhºTë,=}ìÔåÝ‹÷Ü÷ð“¯þðç¯þôWO½ö㇟{åÍ·ùÞ'_¾ðæÏÞþ÷_ýã?þõÒß»õô+§o3+Ï&7bµNÎF³åîìüÎÞÞõûîìégŸ~éÕ¾óË÷§Ÿ|ðÉ+ÿþÞÛïòõ_þñÿ?ÿïŸAùõOßûí凞É÷6|‰&(˜v’„SÙòÄÔò:x,Ù>}ùƃO=ÿÜko>öâë½ðú³oüè|üÛO>ûꫯþÏÿõßÿŸyeëÜÍHaÒå+àLZˆu#•U‹S²"¯˜,T'윽û¾{~êžï>w÷£Ï¾ôÃ_üüƒOßýÍ'ùûßÿòÿúÍç_}þ‡?½øæ;s›W€9$…"/·œBÞ›êxãõBsnrñèÊöÞå›·o>ö½Gžýù7ÞþŇŸ}ðÙÞûä÷¿ýâË?ÿõoÿõ¿ÿdëÏýų¯ü,\œQX]#zTN¥Õm@;g¤b4ßš]?~ñþ‡/=øèw_|í¿ýìýO÷æÏßù'ï|ü»/?ýÃßûèÓ?ýù¯ÿó?ÿóùï¿|ú•·¶ÎÞÊM lPcE”fÜ„òKRåéFomõØÙó÷sáÂåkWo=øÀ[?|ëüã×ýë'ŸñÁo>xáÕ—ö.^šZZ“ó _²eu†Œs‰¤ÛïóKÙ\ie}ëâÝ·®ÝzäúíGŸøÞ ?ïßýêÃWøÓŸüìݯÿúàë<ÿê^xí­—îo/íf[Ëî@FŒUc¥Žœ«‡R¥öÔÊÜòúòÚê¥ ~ðƒþàÇ?ùÉÏÞùøó/¾úÛ?Áéxÿ£Ï¿øÝïÿñÏÿø⫯Þúù/.ߺÕ^Ú’uZÌPþ„ÛJê확#'ί?µ¾yüâÕk¯¼ñÖo>úø£Ïÿ𷟾õ³_|øÉG¿ÿòËϾøü‹/>ýøÓO^zãG§.Ý—nÎÛ)ÉN…<áj 301‚ ¤T®P[Z]½ÿÖƒo€ãøù{ϽþÖ/?øí×ýûßÿù¯ß|úñ×_õë>záå—Ÿ}ùÕ¥‹l¤ ¹dP¬ÜRÉ—høÕZw¡5µ°¾½ûàcO>óÂËϾòÆ÷_ÿÁ/?øÍ?þõ¿ÿõßÞÿèÓŸýâgþúëÏ¿üꥷ޾ï¡'sÍ!*Í´ÊHé ÎŒùA‰HWç…ÖÒÆÖ}>ùäK¯>ýÚßýðã¯ÿö÷¯ÿþï~øÑÇŸþõ_þò埾zÿ7~úÙ'ïðë[=¾{ñz(['}Q „+M+å¼r>-÷æ7®Þûðkoýû»|ôö»¿úâË/¿þëß>ýýóÙïÿö÷¿ƒ÷yç—¿x÷ý_½ÿá‡<öÔÆ™ëÝÍˤXÔ`zØk°¹­£1¢‚/·æ6wÏ_½ï¡ç^ûá o¼õâëo¾ûÞ¯ÿù¯ýî«?¿ûÁoýÁo>ú䓧_zùÄÙK3K[¾X#Q[÷ +±B¹•-Õé\}`ÔâÄôäÂÊüùË{×o];wù̉½“‰|Šõ{$mrP”U0¥U›0ƉX*Y,W&j­Åµ…õµîL÷؉«÷œ½qóêé‹—N_¹~dïBej–'é@Ö›èÒÁ¢¢M0 áŒwÑnïúæ¹Ùµã‘D²˜M­®Ìïž>qõÆÝ÷?|ßO~òã>ú݇Ÿ|úÙŸ>ùÂs[gNצ¦<¡Ê:ºb ÁSžÐÚÑ3›§¯eS©r£ÕjÏÏM?~ô©§yûgoüéç_üá÷oÿüí×ßxõå—^xòñÛ÷Ý{euýh¡1ÍEƒ]04`¾aàTa"ôV'ÉxteqéÞ«W^}ùåWßzëÕWŸï½wþò—?=ûýïÝ;¾¾ºPª7âŪp+M₇Õ)Xœ‚ƒ0Š „¹RsvviïäÎí‡xêé'~ðæ«¿ùèÃ/¿úò¯ûË¿þÙOQÊ¥ôDwº7¿°±sòäÙóç.^¾|åê‹/<û“·úò«¯<ÿܳO?õÝW^~ñæ=×6lFSe»Ë¯uЄ…ÈÆEäl——20ꆋ+›®Þ÷äÓÏ?ôÈw/\ºöÈ#ÿü¿úñO|óž ÝãÑÛœ8µ»¸¼T©wäl+?¹ÅG›w¦C;.ì¬ÆˆYa:š(,/o\¼tùÅW_^éÑ'ž¸ýÐíçž}öw?xê™ï_¼x÷ÜâjªPÁ]>€3:¯2’*=l„H‹ƒ†q†“²¡L³Øœ˜Ys°¼%̸Kçpi +œG˜Õrÿ€J¡±[vúÍÖAøP܇àÀÇòHÖ+%Íj„&;†¹<(ãsŠ æ1b+Q! ³`•z•0 ¢¬(K‹Ià½qV`yÁ EFb‘d.Óèt—·v'—V±¸ÍÉ(LèˆÑ¡°Z»G q +3¥²R”/î‘ ‚H/ÁŠþ ì~1‰GÉd¼P©öæ}R8$G*µz6“áY¯Íá2cJ…XFRáX&”ÈS\ÀlsÐŒ E +^<ž*ÕÓæ”›eÑGm¦ëð~+‡@ŠL°€²@YÜf»ËÅÊX$5íMgK«Ó»n_Ôlµ>!Ip|B)QD‰ÅLg—‘;czçÿúΨÑ!ÀTX¹ÁY&Ho Ë‘dHŽFây–õâN:Ýœ/é³¾PQˆÖµýÅ ¼/>A+ß9¤Û7¤TZA 5ÙÝ&æôeâ…Þüöu êx‹y’„/ŒDË°+¢G¼£:ÔŠ Ô»D»oXwXeÑ VÔ‹¹£žP•rN6nwGú=IÌĘ 5:E6 "Î&m„8¬ƒU6§ÖÁZQÂy=L©­ÌÅÑ@–’Šn1«‡ LeÅY‡;@Ò&§ °Ñ+:¨E¾5¤9¨°¯kÂüý5TÀÎH*­´7n@5V\eÁagÀíÏLFÙ8îMY õÇœ^éÀ˜f`Äd´{Q&f#CŸãâÓv6=¤ÅôvÖ`gFÔðˆÂ¬ÑBJµY©1›!’³$´Bµ?f"GA…·V‚â 2l€¹q-¢¶¸Vaõè°  +öš Ñî +Eóí…õSR47®Ô“€é€tÒBøàFCj;䔇”ð¿íPØ`gÔ.¥‰Ö9¼zTÇ"ßo™qÿ°bCåPax,8pŸr­T­µŽRÁCzðVV6 û*àÊ`ÅæŽh¯ÆŒ$Ywx‚O‰Åõpy-=yšMŽèP;ÆÄ2-3Âçj¤ßÑÂËIõÊÔ©Lkv'ŽXFÖXºk%‚ûF-#zBeVdÄJ(7/&§4rhÄ¡^Ä* N£7¡¢­?Õ­ßd’‹vÇ”æÃ*ã€Ú<¤¶˜°ÌÄq_ÆŸr¸ãR¢#ç§ !ƒñ‹3d¥"v.ÕoJ†u¨ÿÛª}#ú~H‡3DxR„7cwE……xuã ÂvXaVÛ(‡'å’[”TÇ|ê#™P¶:ð©•mPmÑÁF”ä¹ä®Á &Ê\(«³»AÈ),.4§Ø—¶,Îð Æ®‡\R¼aB½ +39¢G@Ô ‘ôç)ùÎ’ +”2«3œ_0bZÈcwÅN +˜/ÇD&Ü‘¶Ý›×a5ÐàC¤Xÿ˜ÝAE!:j&$JÈÓRí ÒØ (oc¢®XöåÆa΀ñR¼Ü]:IËC ¡¯•­d¿ÅˆjµÍm„©ÅÓõÙcZ»Ë„z@xcžÂeþ +l‚:Ù¨7\wpÔ4ªÇÌxŸ§œÁš7=ÇDz0 gz\¤: …û 3V2‘!R(8Ø”  d0Ušwp‰Q#9¤v€ókÀB:TÒ:|¢«Ç|ûFMF„·Ó¢ÊDh,NÔÃछ(PuQ6Ýï€ ó`œ­dDŠ‡Ôð¸Åev§ØH;T˜Å|Yå6#Lÿ ¹"W˜û‹nœÞÊ$¿}@¹@¾)î8…Š ªÌܨ†4Ap1p<Ž”6Fe÷(ln=ê·Ò ·8åÚÌÉdcÉL.‰qYÄGÝ ÄÔ#ðWãf# 2Ñ5nv÷ì±@~­¹z¬±­E˜%|iP Æ-«3N*l¸æ —Ý"í/Á´¬¶²&\ÓƒÀÖŒYG”öCà§Õ˜ •Áªa/áËŒ›)¥…ÖØX–ßÐ*&L4ãâ7ö Ž›!ÜÜΈÁ=läõ®»Æá} +¨ÛÜêùÚòÙƒ|ÔÆ8üU:1ë+mHµ#lzŠðç«ÍÕÕ½LLd rAœÁµÒIÂß`â ãvÔ£Ã7¨‚âC¹Æ¥ìý/ý–×d ¹> +{S6Ž +d¸ qqÄ—sźB~… Vm.„®‘ +b\Ü-\RÁê’ Î€ñÙ]òP¿‹iÿ¸”/ Ö@iaú—¯¦€­4â#zTƒM®”ÃWuª´X¦¥*DIB¬ +\úˆ1 >Ý ]>¹:»vó$« ­ÃJ„,¨ÉÌ[„ؤÒBa´¸²uUL·Ž™Æ´#ÌYð€Ó_t +EƒIKeÈ-TZ4Ž1ü*Ä$ÜrÃLJ¨7Õ\:Cɵ~SšÃ žV*l§£\¸æONjmžQ%l'¨'±oÌvçïƒÍDÄ#Oøãm§¡Å‚ñ °¹4vÌ$þR¬¾YYº€z@öyò­õx툎(0æc•ƒ +ŽhàCcàXÄÜ‚?·`vÅÇm^À¤šÜÜÎÏœ&Å’ +ò"|Œ9êI©­´r)ôýÞƒ ­ŒÙ›ÇNµÍ ˆ 4VfTGŽiPúÚ‹\B曇ԃýb"0Á ‡+}g}·´ 'Bm¡ö jÆ ˜¡cѯCx°,Š”î0ÑÊ(B4³q›7Ãef¢3¡êô꥕ ™Ü²•¹Â5_bÚŸ˜fæèh÷ Þ‰¹"õÎ6å/Þ5l58ÍX}¥'Ò.Ϟ׊‰Úòñk ¨BÆ_˜ ÕÖÂõÈıH{‡Œ´!6ŒÕî}ð¹òÜ ’FÄ£G}FBÂ|E!½@Šuµ5`þÑ~_Ù IÁLÆêÎ8<Vî°±¶ÆÎ (-€° ;+z N rÅ!W ã³T -/‘B¤§'Ö6‘’óÎk"T3³I &j” 1S>¼ÖáǼy>ÞÁÙ„“K°¡œóö¹Â ®T7(Å°;f"D›;êàÓ˜3⸅3ƒ@:µ(Ê&0OŠ‰6“Ó{fOz@é>ê7;à#´¯vx6‰2 ÓCZô[C¦ý +xÄ@¨@Ín’"H²ƒß1Šø²6ZÖ#‚ +ãÀëJ!y÷ümJH}{@7¨²È10“0TÛÕV7Á§@ÖØ]ap0ìt°²LÆ&À©Äü8áHÃF†Uȸž2¡!»+I +5:0¡sH£F7L†AxcžÌ˜7‡Ç¡þ¢3GÀÁä<ñI)7LਨÒïÅŠˆczª¿6“H±"¤zà0ho‚c£hÌ„)AÕu†,Dõ¦­LTåà1±ñI)q™iº?ýo6ÛÝÍNñp>!¥»Þtv‡mdÀL*;wØ€#L,]['ü¹ƒcV Q1—¿­®øÒ“‘üÔÚ©û,ÌÆZ©Þ‰ôÔI¹y$X]G„¼Ã+7—^|íçË{÷i•BžkbvE.oâþ +#Uãµ £3<¬#!WŠN¸ãsâ±d÷Ÿ]0’…øHͪ=ìµÒ6W„Kt¸Šx³l¬“ª,î^z¬:N ö)ð™&5ë”;L|Æ›\ÎD‹øÀ+ „d!C„/otˆ‹Giq:,¥º´?b{ÌH9\2` œÁª+܈×7¤òŠ…k`7€p"€æºB0JRsÛ.Vð`ØËa>nÄ ˜ÀDš„Xñ¥fÄÌœ•’÷Y«àq3=¨F””"B(áBó•lL + ”ÉpV-®x ¨6w‚ÕÜRÙ©Õ:ëÂ7¤²í@L(›5yPƒ·¾¬Ó“Tñ1u‡@áõ¥»!ËÆ»¨PB½9O¤‰p©~'+,l¥f"lÄe PZ½ $£ÎÎ݆܌ Jpx* +Ò¹¿1GÆFEÆ NF,jíü7öµh,,¤ßQÁ¨äV2äOpRæÀ¨fÌ€èÞÜWR…ŽVò¦fí“\¢Ãgz„\§c-W¢ãËÍQ‘pµêò¥kO—æORÚtvÖÜŸ7(€óÈF&ybÌLi-$슪a¾¿C‡ƒC½Io¦'•—Å⢠óžêAüY\Ì‘rKvåòJ¶½U›;=»}ᣜå#u1=ëìwl:cuÉ|²+æ•ï€RséÞ™Ìôž/¿èð殸–œþB¤´H…«voñ¥ ?°¯5w¬òL¢!d[éÖŠëÙH!;±^^¾Ÿ<„Ô$¤†ö–'6N^}*”ëIBlؘì.3Ëáòv ;\Š;\U[h 8ãfàsgjóç×Î<k‡7¹tº6½3j œ¾”\[Žv¶cÝ¥…Ë­#ɵP¸L˜ æ­,0f^ˆMÀžœ€‹VXh`ö€ŸAz4¨ë·èŒZ˜žªG¹üŠ™M›É€;\rŠE„Ï |Æ)Ü‘F¸²ÂF›\µE±ã'|# 5Ô?¤Ã€$Á¨uv­‚\a òžä”/3‡%‡·àŠtã'B¥ @²Ç! ñ ä€ô—l4°Ê1”ÏÓÁ2(A b€XÒõ»~yºÁl +…=ÚR˜éoìÓ8†UvÀ¶*¥yÜ›C¹4Îç®˜Ê 4šS `×EúG^’JKÁÒRmêä©»ŸñÄš¨/#× +¹EZžÈwN”z»áÚƸÃ;¤E6 *(¡´P‰Ð'½ÓÈÈ¥9Èß(kò©^ ¼Ì$&Y©Tënž¸þœõ’b!XZ‰5Ž„ÊËÑæÑHãˆ73k$.1ï7GôÀ;ýå@n©¹q=3}ºß×LÂLD‡ÆlÌ‘0Sag¨¬lN¬^’o²*Ï[™Ð Þa¥%O¢ÕX=wâÆ3ëËÏžÂÅ|8^žÛ¼âŠÖLp}Â\°°@H-©¸\šÚtI9­CWñÉ9—£ƒuÀš~·:O¼²”jnŒ™È}#fä~À%×ð@¡¿@²éãàsµÏ'šùÙ“•å3™©­Xë¨/7‰yŒ‹<òì7Ïß2Sþa=Ƨæ#Óá‰.¹3fr¯Xl,OoÜýa›I¹-6Ž%çÏg.ñ¥U-áB¥ÛOÿpfãÂ0TˆàIöâÝé‡2“g4vß! 瞈CdØD)íæïO—t0Ag¥´ä`cZÙD7ÒÚNMïÕÞ7±õ Ð ?ûGáB{‹‹´•V¶ßâà‰Ã •ìôy@ëu0ü*éMQŸÊÊ?¦B$³«¿tÔ +¼4&þGÀ„dFý€lÊJÈJ3ÐJ/ X؈C¤0jt*í<8éVw²Bf&ÖX¿*ŒNlKõM_~)Ó9 jZ¿®‘„dŒ¸ qðjXPXø1#c@ÃÀÿÏ +&ŧùhÅHxõ˜GåðØùt´¶^œ?W\¾„{ÅöF¼±jrKˆ/#äç¸Ô¨DªëéÎ >5 \ +!‚ù!Ù +Î¥ºh°f$£(J|l¿Â, +½P~A,¬Jk|ffb„‘«‹d¸d ”Ta£tseñÄõ³6WÎ!B*__8uõñ`v¸,¹zta÷ÑÝûß(®ßGŦ-LlÄDal*\XïÏAÍN H¤ÚîøÏƺ;PiWZÜVRîÎH†­L‚Š4A UA ©gš‹‹Ç¯1r bd“Ó yÓ6o„V´º4¿{;˜›³RFg05¹d”–›Ê~'dÆ„ rº›omY´’aTÈ#BñÝñ)w²'–ç‹s§ŽÞýtnúäA d…Kôh¹{Ò€¡5äx?— ¤/ýÍAÂÆÒÑž/·îŽö˜èä˜ pœÛÁF ˜ÏL§Ž]Û¼úääÖõÒÂ.=§%BÚ~+˜»_Õ´.Ú¶QrRaQ‹ŠûF,z;Í÷h_êаî›ûƆ´NG Æ7ü¥ ±¸Ó)&1RÂI‡ C*lP…j Ä¥< +‹“À{+!VÑßB$üàFÈXG‹ù ±@EꟂ¸4%·ñP ó—a*L0ÄÒ~¡¢€0®ývUý†c0½©Ò’”›Ü7fÐ:4Á)VbÍÍTïd¸¶ä•r[{·‹§µ„OÌÏ5×î©,]·N”çÎç/P‘‰A=ÁEš¸7mÆ}}/MGa¾D‡Úrõˆ3X<Š°‡hØ`wm x +›&¥þêHDȃíMt0>Iú™öznúDfj'R_šX:[™=Å„k||"ÕÞJ·7s“ÇÜÉI‡A‚xüÑ 9¿8¤#Ô(á/1±I·ÜvÉmg 6¬'µ°ÇᎊL‘ËÏæ|&˜Ÿ?röê#/¹C¥µ’nÇ›[s;·Ž\y&;{„®ÊÎé6›ìê±€âªñQ³ÛBÊ@‰Lΰ¶q kr‡ ¸ 8ƒ@aifçÞ3·_]¿ú¼¯´:jãq!gqEõxP±V*j§ST Jª Šö[ÁÛzRs_TÁ^Aý­Ž\²[®[]ÀM åé­B÷ˆ˜â3sh°i÷•@‰`â“Ù™‹fWjÜâáý+ŠŠÿ¿»ÒS‡”ˆ•—Œ×Á±o×€JîÄ4¬›Hù°†Ö !ˆÉ ©±ý‡µ* §|Ø0ÊJE4ýûr¨²ŒÒr$;i£C@ŒÀWð—ÖÙô"ô—×Q!§ƒûvxW˜Ï‚Ü1 žQ[µ•ÕÃ^€-:ˆ×Ù8àKïµìµbååF¿ãú¸uX‡¼¢dÔŸ§å©øµLsÀ8áMVç÷ªËç£L¬æðD-nÙèìw'c¥2Lµ»Kž–ÊÇ­Óåù»-ýæÏ ¼$<Ñ&M…Í­qxLTŒ–Ûl| ”Jä;ÙæšB¸7Zšm­_?ýÐÒÞí7¾ŸloÓòΉ{Ïßû!fMdÐ䎣b-_ÉvO×.Û\é»Æ ƒ †¸“lb’‰®Œ€ìדÀlÐ bÌi²À…†ªv6 °‘²‘ò|iå‚××9üñÊF¦u*œ_ªÏnôçTë æÏÞÿ<ï hœz,DôypñAÞ«‘AÀH(¬4°Žþì\°¸X˜ÞY9s»½~+žÈÄúÉ0Ö!iss ÀJ…"ÐÒ“ã&'ÊÈTè›y¥CŠRi%9¹ ¼ êÍX15¡²¹V­™ÝG;Û·‹Ëw'§NÃÞü¾Q"äå݇íÞä%4bvk1pÀEÊ•cruûÒ~pX§6öþõhÌÊŒÛ8á0_dã³À‚OTè3Æèúí&ÌTÄÎ眡ZcùÂò…ÇuàñI3.‚@¥Cw´éŽw=ÙE.¿ +yÒ0-Ç‹ó¨'j¼NÀ ¾-–€ët`€ù¥uß°îИiÿ¨iH‹ƒ¬ïïhã v¿ØBgPc!BÖ©ûóÓâ\¬uŒKNbBÞ R¼3~;ðV"…4x® ñ)#&é s‡­dP¤õ|aÓ ÌxˆðdQOjPíÉ0O Á£F—¡ÊϱrÕæôÛI¿'’g¢ Sºéé­ÒüéXu9V˜ï­ž”g`.êKvõ#°ÍÙy©²áŽÏššd—Xrú2c&JØÐD÷Í*bL +ÀêÉC}¾ìW¾=¬1 <mûÓ ÑÚVcã†[®±ÁÂÔúeOz +T•1ÜYܲi!Þ‰7Öôä°† ½%§¿4nqíSX÷+¬JC9O¬c!%# +ñšƒ‰j Vœ.èH”â\û8€ƒ6Û>†zÒz˜Wi€ÿÇ­ +£ad•…êÏ`„Îe<ñ.®3±(áÁr¶sŒõœ‹e'ÖRí£à«'£%‚ZL ÅŠ79(®+¬„îp×Zà“Àl,SRCióï³+ŒT¾¶Øèé·‰Ó¢ZÔï”jbe-ÖÚUý Âî WålkDÂa`ñBl¤îK¶©@ð…ÚØ¿º¢GN!Gòˆ'áMvƒ•@i=Ó;+•×ÙxKGx}g[[ÀÇ‚Z×oBÔ@(ÎQ="xûïÜÙ—a¨ß¬žG\IFHY —'æN@\^fzgñìã‹çŸÌÌŸw¥¦Áñbº;³ÙšÛsIƒSÃì"ÛÑ©ÚAc%X1íög°@À=RIäÐ@˜”zÜHVXû­¶­Œ­…¶îú·ÏŒN?áMdZ˵¹ÍöÚÙî±»{G¯Ì¿Q]8#Õ7¬l4Yšé_8åc:„%yW¨‰ùª®p×F%€a6cÀ$›MÁÒß:-nuFô0gtx•&ÊéI“Ù؈+1;ýà³`†”3Tå"µt}yíäMZ*íërÇ™r 5Æ&0OVeeýÑZ²¼ 0’ûGÌ +3cÀ$J¬‚ŒÀ}yà4x¹’oo(L䘡c%˜_Êöv ³§zGoˆù%ûù‰•Éµ +³ÛèðY0?%•‰4!œ‹lŠWçœBDš¤›ÃK…ªþòJjî|gãÞ@ª;µxòµ·ë‹wÇ,^ÔWó$¢Õµ£žX;ÿ$%wŒ; gˆ + €4Ü) ¹.©ÃE{î`˜ó1 ,Ð)…Õ= +`ÊÌŽ˜<›ÀE&œ¬ÒJˆV€xС $4Ûâïjç²d¨N+¾T7R]öå§ü…9¹¹éÉ-PÑ 2TÊMlö6îe"q+«†ý&"‚s@¬‡Q s@ôG Î#¥°¸MŽ€öÂx@ˆó>VOÕî] UæÃÕ%_q Mؘ¤.Ï,Ÿi/ßm¥å!¦Ý&AÊ(Ÿ¦ý¹Ö´Žæ§`*Ø¿¨Ž‰¨·‚ @=s +¾ ÂL ÇòŽè‰~'|<èàÎ`ž•Òõ¥ÛO½ùÌ~]™?ésþÜ´›ÍMî$êk•ö±ÖÌ+e9)Ï„*®`…‘'lNiá;ŒöïÐÐR[Ü#ZçÁ1ÛÓˆÆ1®\òÈbgkbñ̨•Òa~31P!2\ •VÂåuFn°*µ×•E=âÓ@ ª7æ‘l7žŸ· «0ð lÂŒFuNPç͘@xR|´¡‡=V"ˆR„tÏÝŸS—'üe'Ÿ*¶Ö+“Ç€Ãda")élŒõëkÁ|þDu‡†+æƒè°3PpE›l¢ÞrúåTus÷:°ë¸¿&—·#•->Ò’R“B¢sé5îòeâùi`qŒ™•Ù™¤‚“Í¥›õ•”TÔà”áCÍõÍÍ·Ç­CFFc:˜¬/9ic"&* ±³û†ôà1¨EP_&PZÐGJ5qÕ—]@}y©¿2º©¥|îx=ìnïäÔæÍõsOl]ynöø˜/ExS.i&B †õø¡1Ë° +ÖBܨ‘rp `‰GÍ®1“K1@•¬¤”RÙöêê©ûÊ ;zJ 8–Vâͱ¸ÜŸgoOï74ð$!p„¸’ç-š¬˶wèpkÌÄØpãs„Pvp ÒŠc +ì%FP<56׈Ñ;X_¼Ñ^9ÓÛ¸o,·—vçŽ_uGŠ÷¥:\¬ÙY9›ŸWœ;(,ྴœï¹C ä²â‚ÊêÚ1®CìNÉɧ¹pø±tãˆ|S5l°³¨'ª,οwåüwó“Û'.u#X]ºs´ÐÛ¸»µ~™Ì”ßï'·Õ%o´.çÚ´/¦2av2Œp)½ƒ7ÓÀ.ª,#`Æ%˜Žó~`Ø8ªvhÌíÏsrõ–`&%D*Ý¥“bªéð„}Ùnuåb÷Ø €„ÑÎ.ii`o4Ý[ß»mq‡ ¨b€ Zœa+V\V$Àø²ÍÞ±ÞêÅýÃÆ}vWŒKôÈ`œJ j‰ÒÜäêÀËfPÄ<);CØD<á2ÂÅFuîê{T•…T™)=äÓ¢ ˆ¼ñŒéM‹{¢« DZ¬4ÕZ¨rÚ_XL6‚J…ƒò±|¾ï`!^ $ÀèR™Ü&<ä ÖP.1¨²ƒ0£^=Äšú÷(Ã0P±1-2¤„QWç¢ß9¤úöÁño?0¤Ö"‡—2àÒÕ911¡2`n!¥C½˜¥äŸžö—3½½tëhwríµ0·u0# !©8'd§¥²ñi»7­Cx‚‰tΚÈÐá1ý°Ò 6¡Êþî60\°@ I û6Z&„—l§Z«…Þ±Deöô¥[ǯ<ÌÅëˆ/,¬Š¹¥ÔÄNkýfeþbiú4mI‰öâ±Ëd0¡Á¶ôû‰å¹MIz,¨°±0`pB±yGmÞjlÈàœ%¤çùä åË.¹\ìnСŸê·sIvv«‹Wæ¶om\}.ÙÙÊ4WVv¯óé.Ú`BUŒOCý­ØÓ(—väÚ¨Ó!^!¹Äž€ou†•`Ì~§';ª'( `2-dˆ²¨!¾c˜?…xb`¬LT”7š‹ç+½ãÉÒ\¢<³a§÷EªÚþ(>CTÛxƒ=€R‘Ly±0qäÀˆÅ`g,¸WÝ÷'Q4PFüEÈ/w7k½-P'dñÑ2'Wè@/F®8<)Iz©òœÂˆŽëQƒ·“JƒÝ3®Å”L‹¡dCk! &\ìmÌí\›=q?Ÿ]°{‹f*6¹tæûo¾Mu”&¸;ŒMÒþ*-6š®¿©‡ÓȧO +ñ†Êˆƒp× iqð6Ôçñ§®  ñ\zXƒþˆ®Q›Ò춡~½•³¢¢Ã­½k«l4ÄȘ¡" >7#UVäÒLwvóú#/ç;GgZÇrS»þܬ'1…jê¾…pû¥â¥›/;Cåo90¬8¢Å•f(ìN.Z®N¯í^w…K |!<.f½©¦TœÊö6bÍE;óg'££t¨î4šèaBŽ•kT ,Ä:©ú2-%™À-" ÑLI +˜³0¨'KK ±1‰+·O+ ”Ý‘êÍ‘ÞôÌÊùbgƒ‘˾ìt¼µŸÙk¯]]>yyñ´›jÌä¥wܱ– á")–€±äbSwvåîº/Ý<Úß3åN[`ÝŽ j›a2„¯4l G8ÐGcý»Ïým²kÀ`§»'Üá +íKV;G£ùùT¡½Qž:FŠy-ê…Ü®@À¦ÒÂ’5 A“C4ZYè ©1PíÝbvÌD (ZnåfφëGØXËDGŒ„2BHÔl®°Mcê³/Ñëwq§ú¤¶P Œh,”ÚL‚gLˆO¡'t wV®AdÐȹƒ9!Õª­\è¹Ö;rÏì±sÛ×+­„-XebVL0Øû{6ÙÝI+¨Q®¨/:$—UÜb÷ÙqIc$!ÌÊ—ÞBŽj(›³€zìt`@ƒ…uVNmñØÝ)&‰ +¡Ò¢\ßpxó&gÈÔÇÖ2ˆ´paA..èPþ BÁyŒvîl´Ó#ÁA=ØßÇœ? 2+m$D‡<Éž¿´ilFÇ̤,§:×n¿¸|ú6h6ZòS|¶ÇÅÛ n›‰€áÝR®}÷†ïøv­•˜p` ‚¨8pÔÕΑSWÅúÇD—Ü$ÃM“+I‡'•õÎæM>ÑlÎlï\z,×ÙÔÚ=È8<ÜߣŠŠ îþý>£§µ³*@pf@C(!¯Œx3‰Ú‘`j¢:y´»y÷♇Î<8}ü—hk1?îMÅk«¹Éã&â–Š0›Z Qa…É­4º5Vc¢mˆ7ž›ñH•oT) Äê,”ÞâÖÛýJ+y2SW€úÿ¯º! |²+<Á'z&gä®!«fLNÁD +O„Ž”u¯¯_ÍÌœuF»ÎPEÈÍÄ&ú-‘ß»3h>XX‰ov‡G,ýþ½Z+k„= +ƒsû*˨7;&*¨Æ| +;ë’KîxâÃbaº²|!Ò؈ÕV3­dsÝÊÿlé/`É;…<ìŽ;Ñ¿îO‹ÇÎÜÇEêû‡ 0¿Pb ¨™È(ÄD¥ÜâMRÙ@¦k¿…’òƒèµ?‘oÍ®(öÖÌ„ ×V›ë÷ÌîÜžÞ¼Qß-Îìø2Ý`¼ñÀ3ozàe5&Z)9ÕÚžX¹¯íÄkǹXW‡ €Fƒ‰:åÏŽ[˜Jâ Š3ó:T¶s¹`vzëÂíÝkÛ(qÜÆhp¿Ù#¥Jª¹žiíÄÛ§lÞœ’¤ò<¨ÕV&Ú_nÏ$ xÀHs½Sýíü,. ¶s˜ŽšÐPX ÁÒí´ÎwMDP {)©mlä&ONn\®/œé߸ô'vÏÝ÷ÜïäšKã÷ _Ñé¯X©¨ÆôenyØ€©í(‚±ÂÅr´ß–çf¤´0½°óÈS¯v–OO¬_ê¿?³p1={nâȽSG¯Î½«¯&*ó¯þô7—xÁFX±èÖ?Îoz‚P7Œ9h±¨C<‡Æ­GŒß> >4b i¢®H‡–ª‘â¼[*aþ<™p†T¤Í$§5ÌI…i.¹i¬åçÏ4Ö¯Ô7®•V®†&¶Ý‰®”êmœ¸në:êÏbþb¤?«dŠÎ9ƒ“ýíÝõÎÃJXÕ¿S@ ë0¥ÕeÀE‹»ßyF*ΊũD}nzëîéík«gnµÖ.D›˜Tµºcøk°¯±õç›9•Lûxqz/˜_@…œ +bÍ@w0aÜBªoòYg°É%‚ù:T³1J›ÛÎDÔ(¬`@&RfâÕyð“‹ÖP6¯/g»ÇÒ­ 17®,…Ë‹îp5¯-o_j¯œ4“"À·Hu©ßÊ&:‹ÕþN£܆zW·¯ÆŠ³J+$ÌDD-T +<@`Ëù©ãn—',Bù´';¨¬fÎl^|rï×ë÷Â\&_[ݹ›ð&@ŒEJ«ù™K•Åëñ‰3žx8 æÛܽ7Q];¤ÆF€Âš]:ÖÖâR¼½¹bùúRµ· ^igâ¸XrJU¹8„#ÙÞ¤»ÀFr=w°4¤§ThŸÊ=9—Üâc“zDP˜)—TŠOô5å’ˆ'‰ùÓfÒÏ…JñʼKÌ–fwÏ<œìn‡Jód°`£B(8³¼{ßµÇÞ˜XáŽ6âÍ#©ö꯰R!ßÝ.Ìœ¬.쮟¸vþÖsÙîŸé®î=²sã¥Þñ^\ºýfsõn&ÒLäçæ·îõ¥Zã£C´¿èôDçª-´ ¤hµ œ¿/¥…Ý &PRIn¬Ç»Û•‹•¥=.Që®)Ìí†ëRcÓ™u†ëýYͱP.O¶§wI/eödÁjÇÌBEË6O–×…ü¼Ý›ÁCe<Üpe§XA}”ÏèQ`¶=s°2ÄåÊÊÄÆæ‘…¹s©Îv¸ +ê[9lLmßíËMò3#×CÍc®DÇ%W±N.Ÿ¶’>•Í*.s±áÍz" ÒB,ÂȾh8¥»†,J‡ñ:…T¬ºÆF& ¨¨6»ý±†Õ)¨,˜¦Éï\ùî‰ËµVÎËù6\ÖÃ.ˆðêï@§ÅTáâ‰êr¢¼LwfòÀ¨Ya¦-DØ6»+ÍÎÊ-¦J=.”T[¹Pµ±zaêÄ}•…ÓbaÁÁúøØÕÛO6g+í ÀÒŸ5a• °'opxìT0Ugûl¥ÓØx„Žºî’'\‘6&±êùºò˜“OÛ݉ÊÜ¥Ìäi¹²$¦»€¬TLa¢õ&ßÚY3¨F À)þ*Îg—l!¤ý#VÉY™X~𩪑ƒ#…Ñe£#ŒÜ +¤fƒ‰6Áˆµé :6ôÛsÕœ‘I˜ô&KÙÞv~j;Ó9"§=Ñjº¹Ú=vµ³q&ßÛÅ3›¦#>-DkåÉM&TîOeñõý<æTÂŽpâ¿;ù„Òì´â`#Þd»¾|aùÜ“Ç®—fw&ç7ôÓ÷vï~”é7¿š‰µw‚¥Õhc³½qmýüw›«—²í#{7Ÿu%ºZgÈ››µ''ÏNŸüîôÕËù‰#Ͼñþ­gj ÃJX‡¼J‡Ï̦\±^°°”©¯œ¼pßԱ˹ÙÝòÒÙÜì ©ºPš?ÙX<³rúÖñ{žj˜n®m_}jïþæOÞ_˜Ýóçfˆ@n'%MhÑ€ÂJ[È°‰”AU¤Ä*mâBŽVu¨DúK&Â7nA7£BwNV°»bzÔ à«:s‚‰”¥L#S›•Kó\b*ˆ'±)+. ÝÙE„„ÀŸh Oã³a6BO"L¨ꉃøfåpeÃF\çà`WЈÒ6Úë–2Br¢4½Ó\>ÏÊU; ²¿¦ãÎŒ;Ls6¼ž”'Þ²:% 0ÑÂ>•U™)£ƒÓb¢¹Þ\9—ŸÚ²³°'­´2±ˆOÀ´L +Y»+Ž±YO¸Žq ÂÛûKˆqer‡F¡ƒƒæCÆq= »ÓOð àù÷Ök-ô¸¸kØxP I…Å¥6‘¤/awIvwH,Ì‹Ë”GŠ;ÔXÊ÷¶b›ÞÔ¤KÌâu¹<ãôË8ïgå<̇JË‘úQÀzZb˜ V]bqHƒŽépð;ÜQ­16¤²"r`w‡i©àÏϦ&Ž4æw§–w¶/ÜœXÜÉvŽÎ| sôæÊÞ£3ÇîIÖ—ùHIˆ7ÒÕ¹õS×=Év 7[Y8Ûݸ  R[ö¥Ûîh)’mŸ¾òÿ‘ôžÝ‘\Yzî¸KÒLm|zÞû “‘Þ{ƒL ‘ð( ¼eU±XU4E²hšžmhºÉi¶fº§½QwFÒŒÔÙ»ÖÕÕº_ïÉÖZñDe "ÎÙûÝϋȳÏןËOZRn̦†Zy{õÒ[+—ÞJ5wºËûŸõÓKß–òKNkàv}óò…ï¿õŸü×ÿæÕO~tîÚ«}û¯^xû;juC­lù5»yØÞ¾¿{ëã¥ÃÇqµNÉù:üÂÈ+‹åœ›æò땵»JqcíêÒ¥–8»+–éTÀ$i´JÃK[×ÞÆõœ`—ÅT 3šÅáÕêúóRq7ÌùséÊî¹c<«å"” j«Nüis}:ÀÄÅBºµO¨eªÂr©¹õ|~ù"›îÓÉaTüؤ MT¼0± \Éz™L”¹dW‹ 4à¿öï¤@ÉD#€j‹A:ª‰Þ +˜zÖª{ñ„•)ÇeW’­ó¤ÙE¥)¤I1 ±o5\aÊM \ZH¶qµ\*ÀH_\{f: +¢4FÙaÂæ"„%f}áÉ7Ã<Â$ÁÿN{ñ“‹ÈiåBô0œì˜#f¤L'ÝÙ QI+]5KK¸šUs=1» \’”Xåu£2Æ$‹Vm.Y†8‹OõÅÂð†€s0±¤§W¹åYàýÃlSýˆ¸fOÎ…Ÿ>ã&"Œ&¹! PD0­TZ:\Î÷òKÙþ®¥•L³³uÃ(êÐ, 0%1g6«¥¤»0Ÿ²kkÙî.mVâJ9Ì€Jg³VIqjNuEÉu]°è4w”âHÊ›kWËKûV¦Öê¬ÜyøFgóH°+íµóG÷Þ¾úèƒ[¿}ýµ¯¼òÞö—ú[G7￶ãµöøÊÁsï4v^hí>·Kå=xp“K/Iűr©cw\&h˜·æBD˜Ö1µ(oXÍ£±OZ ZË™ù6Ÿjx^N÷3K—œÎq¶SÊ>ðArÖWŒª–¬»Bäɹà‰Ùà7 +¼pœ+ÀLçsÅÞ~ŒO’j^ÎtR½=.»De0&™ÞyDL.†1 ˜Z7kgÍƹIÏ+ÒEDLuãj Èl3Q1'8m …QY¿a§½hœµ½1v!L†ÉDj‚l%S•T±G))1‘+µWk£bÕª,qNMÈwú8×Ûho_f¨µrîðÞ»í³wÀH +Fåì0&† 2™®¯Ÿ»“jm¯*9Kf~¬dŒÕ Q¦?†q’ºux5JY¨Ú” ›ÙÞùáÑË㋯ôöžW #FrîÞü£ßü»ñùû°Z1šöÒµêþk_úÎú…óÝMÅ)¾òÎ'ëç.ĤÓ’M¯šíãòêͳ·>6«Fºs÷å.<øh&"ÌÊ$¦Þì?<¸÷ñÞƒOäòf¡µõÂ;ßË´w=䉋À çú—V/=¾øâ§;bft|ëíduó©™È³3‘?&Ó¨Xrª›ÝíÛ´R¸|óå¾û\.ÂZ‹Ëo°™±XØZ½üõ;ßÊt/…1óÚ ï]}ø¾–_c~Ò™åä(•&ôΉErÊ…íž»sùÖ«^Hüógÿü™…ù¤ë‰©ˆ̳D€ý*ƒB«0vSËÀç†èÉfF˜˜&+FêR²@¥¦@|šÏ ŒúneùÂààžXX ªSY“ó+|²Ìj>"Lû)W„Ç8‹U2åòC-»È|s©ˆóN–øå#\Öq¼Y5*«ùÕË£K¯ö”6îhÕ½¹0Dxުʒ6pú3Ö“q©hW7©",#7·äEªÏ„x/ªy8N-ƒÊºRžUK›òAr ×é–U\Bxc.ì‰)Y6Y«­]ÝënßÓ#ßSrKÑ :¬^À9'Š)­Çc!DŸr!Þ?½ÂÆå(¡†1 ˆ-e1ÆBhÓ`.CH…(™ˆÒF\pÀpËL·jÝ­B{ ‘'o3kãkÙþ9½Ø§yZMI‰”b¤@A\ˆòg¼!æh­ÒR÷ü?ÊPBZË I«»SôÒ†QÛS½Æøroïvº·ÑF¶ØÞ:ºc—Fí˜å±^‰é.e”€”EI#W©I_¯äiêŽÉQ6'gVõâ&g¶1!Å+É|mXîhÍ=µ¾—]¹‘^1+ë@ù> ¡ühûÊÊþmÀ]ÕìäÏ°ŒZž÷áó šêå»ßáµÜøÔLlÊÏÏÇí˜R7êûFeKJäßþÆ—w}0çÁŸž +Í9ÿVëByçˆw 8Ëȶ£„Dæ%×ìWY>ʶ·!ÞaÄä`ýB¶¹î†¥ªS‰z\Ì£B*Ñ >xÖ +„šýáˆ?ÇÄ´Ó?ÏM:xâJeîpoãðy­¸LÛuµ¸ª·ÂlÑãã”FK)Oˆô†™a"”Cy9Õ¾ „Iój™“óåÆFwãº×C”¦ $-¨É=³F²¼< €žZŒO»ñ0ž@€¿3q! xCRËqQÉt2=­´)¤†åÁE-? +áZ¥³“m¬{¢ðƒT ’Ž NF¨­µÀ--ú¢¢š’­ú¬¤èš¸0Ù‡›ñÇ€„ù ™”a>'¥—T§ƒ°ITHˆO¾=˜SjŒPb¤†0`/¬LyþdpeÎ[ða‹\£'û<âZ5Êf\Ú®¬èå¡áÖdŒ.eX­ ˜EZJºƒ8%¦ìB7‘¾(!€/0¸D™RòàqÀ8¸B, ^2ù* ð“ij‚‰³V(®à«Î1fæR0?Y‰0!f„DÆ•E?zz6¬N$ž9<9YðÀF“Œb&ëÙÊDø„Ø]XOCR9Êe¤ 3rœæsµžl—ŸžNÖ…eFåÑÕÖî õ͛ިÅT„J„Q>Šòa ›³©å•L[I·QÁᕯ¥JóFù8ã€ç!µ9/ ¡… †— 8J°"ÂhJ¾ƒj… iPYT3ëÛ÷/ßçŒK%Z¸Pˆ ²¬æö÷oÜxéé¹a.DhXèÅÁ¡,øÑY7xo1@ù ÑjnHZŒp^XÄ… ¸y˜3c¤’®¯%ëzq¬äVDg€Ë¥¦)vCvZ ®"¤©å–Íò$¶Ahy"âôBØ€XÑ$Åä§@ÐqÇ=ö©SÞé(Œ(î ó…)áï!X¨-Ÿã´‚/BÅÙdŒ´c¤‰06ÈÁ3óáÓ3¾y7 cêÔ|xj!æÉ1,¡&+ŠUâä\M3øgÏ,>5xv:tf² 6>çC)É60Š‹Óîا½¸T`͆&ßgÍúœs‡‰Ó‹Ñ'NÎyƒp—|‡s‰|}Ù*ö«ÁO›õF\! +aA-0£¸lg{¹¥s'=ñ©ÅðÔœÿ̼ŠS%Êfã45UÄÔ”+ÆPb²ÚZMºà?Â`˜²mÉ®'$SnÔ¦ý1Ž‘sB¢ÁåÜļ2*`ŒŸó‘¸¦š¥Bm9]Ä)I2s —ÝQœAOžœY€ÐäÑž9ãž ó~<‰)5ÎêJ©%Á®aVTÓݵ ´QPm4ôì ]ß”SKL_ ‘qÖDykòÍ:$p1q‘8ïcÓ O8ç‚1Ú¥A€pe R.€HðB(¼Õšƒ)-%·Ãš`†ëRîvzÖïP €¯ç"&83ä©)ϼ;¶4:·s|"ó^ÄÀƒ–œ0"„`ÞÀOÏ#¨ˆq& + Ï˜…Q%ˆ1xÁå‰Ä`”àA´R²“÷Ô>0tŒ;H>ñôü¼+>ïF¦ÎNœôœš +̹AòŠmqrp‹)Ÿ=¾g­9ê 2@U|Q>åâD" ‰3‹15ÙÖÓƒ,C¤árg ¯=íšñAX÷óä‰y˜PÁqˆE?6ãFN΄@pF‘äR¦ûÃ4Î:ŒÞ|v.ô'ÿìÙ¹§¦¼ ;x=‡2ŠªÛ{oIvy6€»£\˜Ð>ƒÊ•›™À![‡·_ùÆß,"â¿xbê™)·?BÑBRÐÒj2Ïúþ…[+{×=0{z!²¢äB„) ç5FJ$’E§2¦ä"ÂX1j’ª8§E§xNNÆEa !dÍi ,xð¸Ûë¥hJM¦³Å°?Š1ržÕ»>HuE…“ aðÈÁÉø3qÞÓׂüN0¾É% +vc+Hè~ˆ÷EYP À¿²JV4J³þø³³9?(4"J'ƒ°0çƒÁ˜©¼m;àÙ\þØœz.§ÚNcóOiaâ\²ÐÙÑsK@1€Li2#´8ç°Z"-0ìVº•ÌuüH:Ũ&B˜„`‚/ /úÂF*·éF e§Îøg€¿>á:yÚg,PîAPyÂBIøC¨Ï™žóœšñxUQòY§XȈ æ7–À¸L-‚æ;=šžE`ÑbOžñ=ñôìOκ|% >Ó¥êVÞH–½B:ã@<Öš^ˆ>ù쳧Ü3sA·%8'‚ˆó‹‘©Ùàœñiˆ°¢„ãq'Îøž=µÈÈY˜ÔONû¦b‹~2N²^ŒãºÛOOÍ@þ3ÉŽéà´Dx² ÞF±8…³<žË˜µ^;Îs8&[™\µ­§rq^òE£ÑXTMX¹jWË6Ÿœòžš úÂ@­RºîÐà!D¦\Ì,onª™Â|™öÂ>H@(•ÕDÒtrŽ“µ×Ö–o¿ðb¹3>½<5ï?5ëÁHžaYMSxAE¢Š":ŽI³¸Û;ïxpŒHLÏGÿÕÓOŸö¸|З+‹Fi²ªÈ² Há(êBÌr8MBq˜¤çiÖ–õ’/J˜ö<ñôôSÏ.žž NMzEfñ§N…Ÿ8xæLhÞƒ¹ý„Ûó‡ 3]ˆ"t"EÙ †óã(•$ùÔ¼zúô✂a.Šû½n j\ÎòKmgeT/ÕTNmÔ’ÇÛ›—·6·{•ŠU.&¤#hÀ³sO˜÷†B1‘auŽàP_RAƽ\©jK:+h‚dG›–X*©£®ýðöÁƒ.ܹ±u÷¹³ùJîôœ÷ô|0#<ñ¼ ó¤Ê!wʉñR¶UQi•åüÃ;ûàøî»7û7ïýì矿÷Áƒõµ²i3´À"\j²y.jRL"嘵ªÕmgÛÍ\BᜤE²¼Ëò‚²(TªÅæRsusãÞkïäÚ}/ ©9@¯hÖêÁ|þälèé§OÄÈ6ÍR©˜É&#±`(2FŠ“ª•âùËWê½¾lYãÝ +— "¸'ŠQŠƒŠI%ÕB‚¢4IƒÃ±|¾l&´Œ)d4tw\9Ü[é6²ÕŒ²=È?s÷åçß}íÚ£ûço^= vÒŠE `ñ07€&c„€"(G£‡k•õFI¶í£qúî¹Úw6>~|þ›¯ÿÃ/¿üõO¿óøþñþî¨^/ ¼‰aÁ;2ÎØcÆ@hÆ¡¬.UÒzÎàzUkµŸ[jå7W»7®ì_<ß¾¾óÚƒK/½ðÜ…Ã õjÝJZG…BÁ©Ÿ7D͸gÏg]è3'Ÿ9±0=ëóû¡ /ÈSxÊPµ‚®ð"ƒóéB!g™Žme£0õÔÉ°< +phHÁÝe:74_8ß¾yع{yøÁã«Ÿ¼wû½GûÜ_ùý÷üã¯?þן¾ôÖ£+;ÇqœYtû¼®y,ìvx¨—F{™ðj½¸f]Ù¯žß­€ãÚQ÷îÅÞ£çV_»;úàáÆïøÖ¿ûÍ7¿ûþ•çŠéêözæÜ””0R€brÐá/¬(Ï—?|qûíçGoÜYúð¥õ_|yÿóÍ_|÷ί¿{ëöæÿúï¿ùëϾvwëâ~;vb0Ž2@°R–\É +«-ã`9¹TÀ–+T#K:θŸY_J_Ùk½óòÑï~ó¯ù«ïøÁKîìŸÝ]=ïvy‚ñ"œ˜õ=ñÌé€kAg£¶¥dXg<:ëoäaÓ©±¿l?~pîõ—.?¼{ø·oþð«^yùN±lFËÝõãÁþCÖ¬†ý™†M©™ø¹%ãþ…ÎÝÃúá’òÒ•öÏ¿zíg_½ñî [=ÿÝßøçûÅ÷É¿uí¿|ãÇŸÝ:ZË(t$ä.ºÂp B@>ƒ Ôí³ù¿|ÿòϾ÷èó÷¯ýÞðÓW7þæ[×þðã7~òé­|ñ¿~ó~øüû÷Zwª»£rÊÖÒé´¤¥åDž¦Sˆ5’ñµ +c+÷ú­Õ/4^¬}ùáõßüèÝ?þÃ_ÿîßüõWÿÇ>üÿþŸøÃ/?yx©ýù›‡¿øê•·žKÊ¢;vj6ì‘8-‡‚þXлÌ/¡óƒ}y#i«¼?´.¬¥\|ñÍ?xtþƒÇ·^{ñŽm%0CÃr*ÝË; ö¹ ãƒÛKùõ+_|ýòO?½ÿïòîÿûÇŸþîçøÃ_½ôÇß~듯ßÜY)% ‘fÍHQ.‘PÅÀGô|Ÿ»±f¼rTøîã³?ýüþW^ûìÍs?úæµÿð£Çÿãß|ë?ÿöÃß~ÿþß}uç×_Þ}åæz!)1, Äå‹DOÈZ^WV²ÌË{ÖÛW‹ïݬñúæß~çÆÿÝ{ÿð³7ð+¿ýòÖ?ýôÑ?üðá?:þÉLJ¿üìò÷ß;º¶W.çÈ£ÄÐq¿¶ÑM¯5´kÉo<ýÍÇ?}ëÓ×wÿã·~õÕKùîÅ¿zçðÿþûOÿ÷ûÙ?ýú½ßõüýÝ{ßûðêV?‰@žÓ3³î@,#†é¤†©kþËîÞ^úî^êå+õ_ÞüêýãÏÞØùéçwÿËßñw?xü‡½ùÏ¿ÿìÇßyp°Ñè—r?„)IË)Ør+EïÔHpú‡wú¿øäúß~y÷{ï~÷ís?þôÎþíG¿üâÞWïþìÓÿéWïüöó[Ÿ?hø\å\_ΙM±3³¾§Ÿš »Ý襠ã®x}Ãyx©ñî½õŸ~çÁ?ýêÝÿ“×ÿþ‡¯þý^ûÙ'7~ö ýÖÆ»7k—F‰fŠ4%…c4¯£t"a•[ÍθWèåØa»4àÞ»»ôå×øÍ«?øÆÅ_~yûïòú¿ý雿úâyüo¿û?ýü•ß}ÿÎ篮¼}%÷à¸^ÊèÁ㓼¨VòfÙ&›~4LÜÞ18o\­~þÆîïþú᯾xîŸÝüŸÿáËÿùÿú»o|÷k÷ŸÛÇ1* Ñ à½x"ÉE6¶Z¢. ´—ŽŸ½¶÷Õ»—ôѵþõGÿû¿þâ~ôúß|xéýû;Û£²©Ò8†ÇP^Ðr²žSUG㘴/¥ó+Åçöª ßkÿï¾÷â~üÑǯì}|å{oîþä›×>}ãÜÝó­ƒq­Z®JFžQrÀ"/6©(V¶L¦D¼íçh9uu-õõ›|pé—_<üêý«ß}óðû¯]^ztܼµS\ï&*9€”/BRbI³š4ÉgL5¥RY_)ËwêŸ=ÚúáÇ¿ùòÎß~ÿ¥?üàõúå‡?ÿìö/¾ué?{íŸñæo¾}üÅKõ‡G…AID¡ ;+F5•í ¢¥ÐX%AÔ4xÙŽÜÉ.U_k}ëåíÿòo>úão?øý_þÇ_¾ýÏ¿ÿä§ß¹÷ÉãýwlŽúYYK`¬ “‰B©#rœ)‘íT'… ÓÐA‹½»“íêàá…îí³•÷oõùÝŸ~zïó×ö¿ñÂøñÕÁÅ•ìrIÑY„"yWÉLÍ„P„¤  Nš±ÙvöWÊgûù+ÕûÇׯ ߸µþúÍõÞyÔMœëÙËUë€èX’dóÓRŠÒ‚š¥d!“Í™JVc×ê©£åÒùAòñÕîg¯nþú³+ÿôóÇ?þæo?\ûÖ ÃGû©Ö͇gKkeIÁ‚GJö!Ê^ô¡QˆÀ¢A—4l½*v¹{»Î+Ç¥_XùÃý¯?þå?ýêíß~õÊ·]º0®uJi½^D #L$D"A™ÂRW²ØNVZ«›Çãâ¥Òóçšß|ñì'/¼qgíæ^£䉂Ý>Ïœ+èqfv©ÐÜ52}ŽÓy‚¨¤ŒsË—×ÛòüÐxñBïãן»y¸|e³ +ÎÝ]J5óº¥qš¢¢´é'˜sYR)rÞζ4Í¢X¦ˆ¬¡d ±hñã¦s¼Z½²Ý¹¸ÙØûåL¯ielKãqjÌ¡BÊf LöùÂAŸ/‰(Ý.ä7û•ó£ÌsÛ™_XýêÝóß~yûÝüÁ7¾÷ƹ/í|ûþÆ»×»—W-‹B‘ É*~XFè$Dš® ÅÈ|2]Ï86jZð^G¿¸lßXO}ñúþþÛoýÇß~ü³Ïï}ùεWnŒ¯œ­¯tRª®pZNqº›DX#Œ°,§×Šõ¤Ìf5ªdóY….&„^ÁîdôA†»°’»µ?8Z)7L¦ K–$ñ‹ ´+ÈL»É3ðÔðL)"Ža‘0ƒÀ¶®åRN1•*;VJalJ+\Ñ52¦ 1SËåpèÑ8l’Å>ÈY`0Ý~,Á9FÊ¥ËËÃÝåÎJÅ”Wˉk›ÕÍŠtqTH¤x[š¼Ë+¦sU82xº¬X6§)&Cñ4ÅBp L¢”7BÍú°i¦R‰Ò–QÝFÅ,§0FGPVRR1˜i"F«µÖëm6+FÂÖ ä ’(ù"ØÓÓ‹s!2H¥ãJ“ÖB¢†RúÔ´kzÖÇÀÇlUMiª‘2õJÎ\ngŽ×«Û½äÑjéüzwÜÌwr‰VÖ.Øf }zja14YÛ~Ê?qÆ7å%` ñz¾¶•É÷ŠRy´`° M ðN'ÿðúÑ‹·/Ÿß5KI‹!*$C„$Ìù(Ï:K¹þ•\çR*7bØÄp¸yþò 0Â..„qBÖõl:]ÍšŽ]`i%èÇ#1if:q&<í&ü¨í†tWT ã%e}ÞX4ÃèŒ žó"€Ìý1>‚‚Ä´1ƆPÞå†ÃÀ2¾KðNŒHÄ™4c¶¥ÌГþü„Û  ,R†lÖX½…&Œ0 Òª¥zÄL(NÒ©)’‰Bd•\™w#ÏL¸g³s^â_~múÏŸœ=3‹Å%E±T-Ã$ ¡Åë¢BAQIT\¢)UL¨RÆåBf<(g÷œî endstream endobj 82 0 obj <>stream +93SÃÒðXÊ4‚8±o·’õ³FeæÌ(.ðr²Ö[›@ÏÌ…f‚,–hóÙU>µ‚«UXÈQr¡¶|DZÍ™˜æ&‹2¢lÆkQ,'´EüÌ´d"D9¤Z‹ Å fpÇhäŸnφ¹Ù°8£tŠ·rª-˜•D¦Eˆ)ðF+‡I+ʤp­Féuƨ‰éžà´(%Méåö¢ºKxãF„N…ɤ+&†qá,V/’r†5ªzn ¦;’YŽcÁˆ¢æ0JvÊX !TgŒžX<ær³Aòٹȓ3Á¹ˆa‹ŒÕsCÂŒŸñMzò£L˜ëhx-]êÁ´À&Ë“1¡"’AÂv#òS3“ö×!\§õª]=‹*u7bz )€iJv¨åV¦Ý¸;ÌÃl’ÒÊŒÝI¤úQƒÒ`dÂü´—†ù’Ó8RCÚ섙̙ïö3¬à°r +X~T©JÅu­¾“îž“ +ã “^Œ‰0m•z‡¸—–ÒC½¸eU÷”ÒΙ¨úÔ"öôâ'‹†þÕSs§`Êìjsfc_H¯¸£Ê3S!_DXð_;8±€DØ,›\ÖŠ{‚³âFŒù¨rÒ…Ïû ŒµÃqåÙ)`pNM‡ýd”0½Âˆé™ùà¢' +ÅÅ6yŸåŠŠs!~!&ûHǃYþä‚X܈ÉLÎŒ¶o”–BBÑÊQ!GÆjH©~yåâ"&¹1.çùl?,äÀ¹A:CÚKùÞÅÝ[ïY­Ýg}„ µéôº\9$“+Xò¡ÚÂdYºIüéíX´ÃLŽ²†|fLšÆCZrÁª3„‰H.µ¤G´ÕŠ°)9³ä4vI­Ì¸Z&’}£}^mÈåM>½Dh¥ÊêM"Ñò¡ +eL¶ÓbÓ4Ñ ‹¥¨T¶,_ìß s©Ó>ÜÉq¹âÇ­Ÿƒär€°$³^éÑvwÒKÜè„ÅjLnÆŠ 1ƒdÒ×fBÔ\ˆð#­UHs Uw˜óF8V¯cZÍOXàþõ]0G°Ö†µV9f JäZÕq¹èOšlGØt\­FÅÊtL;á"`ÎqÇØ3Ä K2Ih T®` +œ"–q­Î;ƒ¹°àÇíò• EäÉ*›.ôÔbœ³&¯,ç#Œ– µUk1¹Ê:}ÒhDÙTˆ²AjÏÄÔEÔòE±|–JÅÒŽ˜ß~vŸö1¨T&´ŠM„ÈŒM{ãç(“ñÅS"&äÅô²˜ZöaÖ¹Ó­…›K‚Ù Àâ©yèk§üÓ.h 7*„HÇ i~ÌðÂr”4ç\q k p…ô€ËŒ¨ô +™Z‰‰åggãq£‹êDaeçâ£L﬛L„…LÌo~dǤ{²;ù²Mi¤†‹˜<åâF\me–®eFÏYÝ ±IÛX O4Ù̘ͮǔF+€ñçA•6¸ÌÐ&\ˆFÛKJõH(ìâƤYrÀ f7@™DÁu!;4{NëÐnìi¥u£¸6:÷·šp¢nõ/Õvîw^lìÞ·{çsë¬Ñ²²ƒþþ]7‘qiZlv#Ñ8Ê ¯§×½;YsJYLkƤˆOÜéf«5º²rôˆ0ÏxPn*¥íd÷j¢qÑz:çYä1ïEDo\œ +ósQÅ×#” E?™³#¥¸æ¬m¹"jôÁ`š@mòc?òÂjmx^HõÁóž 2a!)uXíÉT«óC‚`5¸dWk~T¢GÛµ´¨î&*Ûó!‘2º´½L$zàZ"9‡'}œw”Â&,OyÐ ŒëuÒÉå¸Þ\DÔÉF¨éåW + 0"–øÜ:jt™ÌjÜì»q‡²Zik:ÂR ’,à÷óéå¨#„Àm.5tÇô3éÜ‹¨@6µÊN\kϨ9–@ÞÝ{âÄâ×Nzž\Àµ”[¾R9û/m)Ù~w|üÒ×¿Ì Ü´OtíÎ¥Âèveý®ÓÙ³ö`è¤BL,ø+ªÝ´ƒÛÝêúóÝýGé¥K„Ý#V~x5Za¡@¥G©ÁU©´C&‡jy[*¬>ã†æc¸Zìëå!Ÿø˜|Dj0ÉÉ÷íWîœip­]Þn}$TŽa½ƒÉ¥ë/~šjìzâ®7Û;Ï_{å“k¯~Ö=~…É®è ow_|ó 1=8àtžÍl&Z—‹k÷ç^O÷¯ R¾>º¬­O…(7a!F_©_hŸ}µ2¾Yß ÌNL(ÙÍ}jyP“²ûtf³†@ý’í õµ›À¿pVÏhQÎ2™ìQv*„Z]9¸{xï} a&«¶”â—]Aô6$UCL×Z¹áðóv1¦óÙe¥²i6÷S½ós€xý¬UX­­Ý˜ q'\8f-–H)PÝ”fT¬ŸòqFféÂÍ7D³ñ/ž˜;íŠ<“ +»…ñÝñ•w@­YŒÊ‡·Þ‘³Ë.Twc&l T*@¥Am’KgsËwÖ.08z•·šÛ·‹ƒ}"Qá¶RXÍöΆ £+zs—LTÓÍmp0¡˜Y© Š (¬ M„üZ²{Œ(娘ÅÎj]ʬ<ŸßxÞ^Á̆žî¯¾¨UV¬-äVÍæ¹îνݫwn½_]¿©æWjƒ£òò1çôÌúnatÝl¦»‡ÝÝç×®¼nÔVÊýƒöÆ.;qSÊa>.×:ba O´X»Q_"¬–JN¼F~ƒŠí,Æϵö_1)äÆj}¯½w¯wüªµt 6z‹DÒƒ[\ªëôæã í4`½‰Ypcz}J-æ<å%b|Ž±;¤UÃœ–^góÛryG+oH#Hh©Æ›laj^)®dÇ׌æ®Yß±[vm7HÙ@åÒ¦<™å¡TÞÐêç˜ü ‡dçXÈ­,@R®w®¸zÍ® +ÙUP €âÁrU/®¯>@Õ2,æ»Û·ŽîctõÚνôઘC½uxïòƒO\¨bÒj~µ8ºQX½™_½š]ÐÙã›ot×®DH ³Ù•«‡µÍ{¹•çJÑDïL@Då²7¤ÂšXÚä +kqs28 "¢8éf¸2 Q'\ð)/zÂM©¦wh³'ØýňðäT0!È)XiF„2,Õaà§ìÑá£DqìŽkA&"ÁO$uGø<ª5¤Â†Ý<¹LÈ…ÁøتŽÂ´ÁY­Tëpiïáððåüò%1¿L%ÊÀ–Æ×bBµ™TÏnVî${—ìα^ÛaÌV²± "DÈíc­}Žé£ÕúAëì‹BaâœÜà¢Ý8[_½´}ùåÎÙ{raÄõÞêåúø®UìêÆÎÕ76®¼Õ?÷r{ÿÅôà"g.=عøJ€²¼„×´Ó1hqùMDmØåñѽwÕâ +E£v–/l‰•½ôòõµëïvÎ>ÔòkëÇ/×·oÇ­º\ß¡ò[ˆµÌæwôú…Ìà:nõH­xtûíÆÚÍÉjG&SÞBÍ6,•Sƒ|÷htözcýZLkc“m©—< %Ù4PÚúÖ‰lrŽQ]³;z};Ý?¯Vv‰ø±Ú Jw|¤õDsßî]¶û×òã’½+\z ƒ›7.ök¸šl°[ÛM÷.&ª;Rv6.å;[7{[7õ"Pû%&µ¤äG©Æææ…W–ÏÞõÄuÎî6Öo´÷ˆÕÝÉ‚wg@šÝÝK/;å?,MV¼ö“­=%·"dVQk8·Ï„$:Qfy|}åê×kç^Ñ»ÌΑÑ:Ĭ•é Â$Z•Ë¸RõÇ…ixã&ÌW°aZËÚÏÎ#¾¸NêíéœôÐ.Ø$ô>®÷…Ü0§ è£ås!:ãEq©8i ‰>ÊŽIE˜µò†˜¢‰Z×H¥PJ)®šÊjG쯥2ËÏ.@ÂAhå—³ƒëtz• +s€ÉÅByécÖ1)W]nìÜãßÛ¹{ðj~| O¶ƒŒ]^½‰ilÖiaÐœ®UÝ°Û¸Q‹±¶šnë¹fª±ªWÖ@v£‰•(Ø•U1Ý;$1µ +Nñ3¦1˜Ì’\ÚRË;zyC)¤ÎÕ½__¾ô†TÙV+ÛP§ÃèÕ¥«@¢B!=¼žìßÐGæÒM&·¢h.*ZÙ¥­‹/:Í­' (_œøôî¹²-Ö…Q©½ûè­Oo¿òÍE<é¥Ò°Úæ ;µ‡Ë×>,n=vuëðîk~?ÝÚG͸½[«ˆ5Ê®<×9ÿ¶Õ9ö㆒_–rËêî›°å „Þ2€:={Þ(¯¶ÇW¤ÌÓ„ÑöQéyD•g¦{KvYpd‡q­Z]¾ÜÚ¸­•·!±ŒJ¥T}K/,ÃbÎoêíóFçH­íêC ?š0ª›ÀcNûÉ…¨€(52³®Ö/ªµD©DÙt~°ßÝ»ªÉ µ+°Z7šç¥M½0æÌÖ|ˆQªQGèìlPQtÊËÎE´0µªç2kd¢¬nÚ ‰PË•]q&(ºa“4ûji7Âä0“VäÕ‘#%Ú¤3 %/åD9‡2ª‹qOTÆ®ZÙ”ó€Çœá Øl¹PU)¯qù•ET‹ŠÀ.5Q½ts†JaXõ‘Èõ³KÇzu“Í,£V3 dÂbA¯lƒ*b3Q.Cš-Úl™¥q²¾!å—ç`).¤•|?Ìê„œbíð2ÉÎXT«ÃJ`$e/áf{æH£¨Õ7rƒ ­{¥µÛó°è…xÞ¨”G'¾ŸôˆÀÔf¶˜æG€‘0©ÄØ} Õ§|8ȵ¸6Ø»GÊ@ý?<í'ÅôÒÓA‡ëB¦çTW‹íÍõswÌâ²—Hré5!»Å9+ÀæËUrfT_ímßò“I?•ËûæÒ-¹vȦW¸ì8&×€aìÜI7¶€ý÷’©˜TqZÇݳ/UV¯e;vu ¸ˆ—ßü¬:¼äg‹JmÏèNÚª'û´òV„N·‡Gþåo.<ø(¶QÉä²RÞOv/õ³bf X­µ½ç7/=†•J€M…¤J\ïp©n.Ťz˜ÉéÙ¥úø"$ƒ\9ÀàÉŸ­0µì´vZ[7C”…ÉE&Ñ”³à)n4W¯ÂBi. `žâÍÎÚM„/>;ñq€Ö +ƒëfíX¿STSK{ûø…§§#Ï, ."‰âŽYÜu2\f¸$0ªAÜàœ"WP«’jq½•¨žSKgÕò&0¼Àƒy'í6–hFÄbX("zèvmë.“œ +ˆTJkU½¶IÅ +³©¸œ·š{¸^2%æFZý¬Ó¿RÚ¸·ráõìòå›Â´’\XžˆÌ +3€ja¾ÉU4QІ’n’FmÑBln1ã ÀTÀY|…” +øå+ûw(³¨˜´{tf"•òÉÚNgÿ¾LB|-*•AÖëå±TXñM¶Þ³h³ Í…‡ie%Ý-vv§}ÊKŸô2s15Ìå ¿”Ó:gÕ­úFcýjuýº^Û˜T(¹Ì$—b2‚—QŠëÕñ­ÎÞ#2½áFSgü¼–(…‘OœPg|Ô"l@BˬóÅ­yHòczix "¨G& “ÀêÚÕ³™öE«~ ,¡Ì(åÜhñ`:ø¼’œÂh|ôbqù|ŒMù¶7?fjÃO§}8ªB©äT66ÒvK(l$ÛGÕ;zýœ sæ‚‚’ì–‡G ‹¡Œ›]`Ö€1T kù¥‹Z~5L˜ýñåjw÷Oœ¥ãŸUY¿ÕØz>Ê€ú¹c*Lg!*3’¼ˆ>•ƒLš¶:¼Ý4s=x²šŒ£í^?ò"‰y?5½÷G%ŒµãZVêa¾ã Ja…M€9Ä'û+ ³ÃëÀŽ±ée¬ø`eÒÎ4ùôàÿÜ^º­Ðqå*n¶¦ü HUÂ\&Èe°d'$dÝ ÎÊ%½¼€–ò@ú²Kç¥Ò:Ÿñ…­ºFgA6 ì?—-Æ@5p³O%ˆÚ +²y7aƒ Ͷwõʺvb î“é(—¨}tŒçÒÃÊÚ f€+,'[çfpÎ@+®ƒxö`&¡–éDmÒŽtH«K¦–€IôSV„³#Œ%;]1Õ™ 3 ØÌ“n2@eAЊ… ˜Ï¡T¢Ýßm­^Â+EX«Eå +¨V´ÙÁÕÚB”§µ¢VXæSm9n»ïcŠ 1àÊ“éÆ>ŸL‡h?¦F(g1¦!b•N®„„ò\DD}ÜNù™Ù("WX»WÝ.îP©µgÜôlDF”úLuÅäŨ&m@¼ÙÖŠ4Iµh—a>$5a„¹eu•ü*—^bîCU«2N6÷Àlv1º3P"D¤ÑV/ˆ[„TÈŽ¸‚ E¸ü¤ßWT\Z»Tíla¼Mj½0pZÛ¥ñe§½?Q€[Õ劸P|f&>í㥪–·²ý ¼Ó÷!Ú´—Q)­´Á9KO Ÿœ‡¼ n\zd·/ó¥s|˜‚¼WQ)—r.=Q!µäKn* ÂSkHÐKkzõ,(¦jyM4}Lz³fÃ\Œ±ý„ª[ª);¼ÊgVÁD‹ÙeT¯bj!ÓÚÍ-Ж2ýŒêûòÑË›×Þ.mÜ¡scO\&T«ï˜4b/žÚ%eG£ƒûåå#)7¨LÀ¬äBtH€CâZüþdû|n|@ &¤2u)Ý„|˜Í Š«uÖ^ „딃Å"¦7I05NßC9³$­T}‡·ÚÏÌžžñÍ)`ÀýT6(”|LL+DšzªíLÁÍqù-u~pzX\¶§¹©—<ˆàõ…x"•äü6—ƒi +q ×$P„üI¹Sƒl MôÍêA¦}Áªí>»ˆEÉd¶}Äölˆ]ˆJ‹° +ª$icJ=*•‚TµèT7¼¨î‰ƒ(²¢Êt€Å•²’ÌøñS‹ÐÿéÿÌðÇ‘$ÔZ”Ïz&Ä{a©1:N”V™±»fã@.¬3öüøL€{j:rr1NÈÅs±ëh¥µÜðêöO»÷ùôðä|,eò³bº"HåBT $C&§¼Ä¤!Xœj ‚?5ƒ ÿ +1IRJÅH‘\ɃÂ猗ø‹Sþ?{Æ3ë¥!*EÈ……5íÇÂTr! +BÔ$´&¡7¨sz‡) ¢i7tz:³HÀ<¨¡´+ÊOze=!» Àª;žˆ«5 eµN]µ¸­U÷éô`RžYˆ{ã‰0‚„lTÌ3Î’˜c‰F„M.w ã2©—¯t&ïh^ȯÞô±ù)?!$NËò‰m”ñD8ˆüàòÊå·R£ËÕ0Æh@<1Õ™ÞÅÍËïŒ/¾›]¹;ü$:ÊîF¸,ˆ=Ü衉%«q^Ên)Ça8£ÎZL)Mv¡ÒS>n>¦ FÇé^sã¸ZJuÎJ…‘—°€²é,ec¥ ìL’ÑóÝÝçA} +¹˜ÞDaLo¡‰Viå’ÓÜq)Ùi§º‡ j3©1fY©QFÓ©m•ç!.…9½´àS-Œ™ä ÄäAi;í!A±Zm8T„.*dVãb6º€bš’[%õú\ócVT(3é±ZݳçbBhi„q +ƒó˜^P©¨P™%À¹!DÂ¥NÍÇH9¯ez¬Y“s£ˆŸ±Ó^Œ–s‚ÑX˜,šÓ¸ä®6¡ÀmOÜ<å&N¹PÆhƥʔ‡’© “ƒ¤É¾cA*5iüî +‹vMÏ@hý_“^øDñ¼´Ò]aiÚÏœX„­ò¨ºr)L¦ž<ÌúAÍÊGIg1ÄZDŸ˜ +,„oL 3ég&ý9/,˜‰Š5HiDÆè3ð}3UkÀ>ä»@|nÓ…ñ|\Ÿ‰(Q®ä‚¤Å(cíTs¿øZfù6j´§'‹¹©@œ KÚnóùUà¤P£bQR cÄ% £Nš €FÀ0R¹–^FŠMv¢ŒéGÕIM/­ö¶n·wî³ù7bB´s>L –œ[c“Ë€aäÒY¸ã¦;³z%Î'§<‘0µîE¬—çs#Ë6ƒŠ§±ã3ž¸WjD„Ü…DûK0·ë[¤Ù\€e29È®\kîÞŸ¼‘ì_BÕ*ð8™ÊØ®­/À:ªuíÖ…îÎó+‡/U7ï(å ¢hN»¿uÓ®®/Bâ\D˜ ¶³ƒñEˆ´g}qÉnåºÇ [£\¨ Ö©6ù¢Er  ÑRµÝt爰úh¢fó3!Ìc\,q” X.™s ¤C“d7]° +"dj‰3ÊYkš¥5Úî÷äG¸T^ŒÊOÏ#.HóÆiÂm\©ÃB%<é)­² œ?jÁ"¢Ípà¢`”@š(Ùe9·êŽ[ÿòY-’žJ‹qÓ…š€.œúŽ`w=ଈ"R^@t¸3í&N»&ûÀ‚î‹gbêצ#§=¨+ÂHZýDåìðàÕ¥CB¹Ìx6Âi¢5\­ f/n x½‹ÙÁíÉ~CˆÀšeƪÕŠèÝ©xòt@Í~®±܇•#Œ ÀÁ—¯i¥Í¹(=凃”NZÚî„iˆ?¡R­³™•«˜³ +^ÌŠ°ù¸ÚàÈ 1Ó +›àÆ€^r.ÄÀ|–IcBi²ç ó;bñÿgï½~dIÓô¾{A}!,w{úœSUYémxï}DFFzïË{s¼í>í¦§wfwvf—»Kì +K"E„IÒ•þýIÒgHŠ$$@T Î×Ùuª²Ò|æ}Ÿ÷÷DDå÷ƒ=|¦F«"­?)³ŒÙµûW5±MÈ]=>Ç×v÷¸5»Š'ÐÆì›ÝcàÖ>²G·ÃoGç?»Ó—˜ÛªVyûþë¿™œ}­£È†+ž3îBmŽÞiñR æãÓëg¿ÙÜ~7¿øh /g –hMo¦GoÂáY‘±Iµ]—1ØjíãejF–´ãñÅââkJKÊéÇXu­þÅÑó¿8~õ7Îà¦Ä†j¸xöñoŸþ)m”øu³µ|ÕZ¿¦wéՌۜÝô^3Þd´ëú@ˆè^÷RqF†7lö¶oþ,œßÕáå‹ÍÚ™3Þºµy_ãb]‹g³ãoÏe.Ú)É™šÎØ3ˆ?B+GÚœ5h-Ÿ Ï¿Gôêíc)XוnQ|®ôä¼.õŒø0\¿íœ}çÁC¹3FíVÙ°HºNóp¸~^$´¯²ônQQýµâ/i½ËÝ"[´lè=ðFªêÉztò~uûÃêîÇõÓ_%Û— D%Z»Ã €=nÓ‹OßýýæÅ_o~b'ˆþPKœ?ô&wñö[kú6\}7¿ü³ÍÍoâù³ºÚ”ü‘38‘¢™èOÀ¼7 ÆWWþîéOÿ5¥Äy¤Yí*©Ù?÷ׯÅäxxþ«Åý_hsÞn.ÞwWw¤5lƒ†6ä=8è“ùåÏ“«?SâÌ9­ƒßNœÑSx´šÖ¥ÍëÎz‡ïßþ ;àÌìα`½h{‚\ÐZ‡vú•‹gÆš«×ëÛ_]}û÷rrž¥ý€^’Ù ¥Áhwáuûð‡«ÿìüÃßkÝÓ2oƒ$ggïggï»ßÁҧ׮üÿ(ÇG š}BO÷O^)'GXÈ!=røºwò³Ö:â¬~‘¶h5vÚkB X3áèOßjŸY ½uÀÛ#ˆŒÝ=e¬~%5^‹ª’RPg}gw·ûUÕŽ·½õëáñÇÖæ gOY­-™¯³ò; ÞŒ­x99x38x58þÚ\óÑÁ^ݮЖœ^R5*R4MVÁè&œ>œYžtD3^ÍOß*Á8Û0Ÿ”õŠ2ІO[ç>¹ûM4¾$xw0»X]·øeVÈ‘^QêòÍkú¦µ|ßš»EÁïž?ÿó½’òå>ƒÈñIsýš5ÈbÁ)ÑÂEãSp`wæ¢Û§ÒÒ¶çOûGïüñ…Íñ€d ‚]3öªשÁ| Ï¥æÂ\D‹—ÎäÒßhÆL¨ôðàÄßÄëw0Ôˆ^F»f¶ºÛ—æð²¨tŠ|$‹dùÔœõ6o¦7¿Ñú—Jç” –µMb’C¡¹) M»w原kís)Ø€ëj¯À‚OF¢7]TX‡2 êÃpüÌéß8ƒ+dnMî¨Ñšuf%©-µŽÕî¥?}GÙ“²eI!dÄK¯ÎÕÞ•Þ¿Fÿ“ƒ÷%©¹[ÓªbË͹31\Zƒ+µsŽ‚>¿ø¾wøÁ]HÎvLmmá˪j?φ„Ú Fר΂·Ì6Œ´WBHè½sÌ^—ÄvCí"%ob·VÆL?­ÚÂÌϬÞ9 ’¢Ì59wÇQWÛEÖ•¢òltñ§`BëdjZõ/Ÿþj¼yÊéí†Ø$µŽ` D«[…PT#<9õÿòq“E…*BŒd4û÷¼›ÁïÔ8«9½²ÚÛšQj¯ÂEÀ$@”­dgTc,B”èPï]½k>8*v‰4k¬íÄs0ù£¢\b£æ"½"«}ðÁ?ÏsÉW9Ìf6¢áu•“Ù]0}®µÎH-µ]È&-œÚÃöò©ÍÓ?±»¤œúÑúý³æì¾³~Œ/Þ‘Óß0v7Ý>õµh¤±û'j`‚µ +KµùÆ[¼FÍ¢°@­#ãÓE}`QÄL‰k2æÌß«ñ&SÊ„nµ75)Ñ[§¼·)‹ÝªÜü•Õ¿¢%HÌÞ©Ý+£S5Æã†V#ÞpFW²ºÑä +ã/^Ã[&\•¤Ä%xSHtŒ³ÇÑìy÷è»ÎæÝÙë¿îlÞ $ÜxNK¬]`Úž©­“dõæðÙïœÑ3R(—T’ºhüÄè^¨@÷Ù >¡$Ùº^#ȸÌàig"D[0¼7zÚZ¾‘š{^ÖCˆ‚„½Ñusñ¢$&@#;\VÏ4a`×9D„0pR¢'¸£­Õ>FºÃK85ÞÆ«WÁì^‰8o +D–A(àŒò´CH‘ÙÚÚÝgö/ý4Îîê9(IQf| P —(”\U¼1âÔDüVk®áÚ0«½“Ãå;„esö f!=ÜÝ\À¿W¥&ëNZ«7áâµoáÄëZw2ZOŽ`´ëb„<ª+únŸ—øV–€2„íå­-Q@+|ËÜ…‹wþôe4G­<É3Ô •®*·²¬«%çVï*Z¿šÝ¤C@ž´Þi üÝ¿:ù3댹p+wΤä˜óÓk¢é=©tœ¬žÙ˜n‰® øèÈ›¾i®¾YÁâøêGVë"a+s©SÕFÉÁ7Ûg¿uû§{%N2û¼Ñ¯ð!ü&â-Oy{u‡¶–Áü5”?W·Y5zY•½ +VMjÃGóƒãoËLPZ¸ñæÔëß ˜i¥Ü*ñ¡Ý;aŒÞ/r\‰ YklwN½þ™o)¹·_u +TS‹)k¤u.¥ø7!>ªh=„Jz8:>°zg(ýFë4˜¼‚ m w¤Ækop5:ù>^½eiÌêÚ„±E.®ABµ.댤pÿ Á‡áõA×à.D]kó¥±&4Þ…µ+\º(«·g`tüÙíøìûÎá×`Þ©á܈f£ƒç‹ËoQÙ¹p Åp{'ª?ePjÇKŠôÕ`ÈY=ÎAE>A¨°z§L;z8ÇWNr û3À¬aô( \½ó4Ô–/‘ÁäFK÷2;9k­?¾¢íü¸ü7Ñêµ5¸S“sÔBéÂB purfôn‘Œ¼?sF—%9ùã=Ïžé­CÔ©mãáô×?/o~ͺSRïtÖ/‘´Ñ¹ "Dˆ™õýÏ'þ‰;¹ƒåèôP"ajj»*w nYÒSƒE0:«|ò•éæPÍ#¸Ô…<d “Õ{²7ÏÕTÐì!låÖY0.E ÐZ¶¡#¹ðÄí™K5¹’‚CÞ]ÛÝ+-\dkJ¡a‘rg§$A$ˆÉöC¼ùpýý?ÿðWÿkoûq§¤BLˆ­lÝD9Îéeör¸}3>ûÎh™`{ý“Û¿$µao•é€RnÎ_ÿîÏþéÿÖ€«²g”5•¢£xùÎì\ p|Ú­cÈ»3Öžš hê¹@é1 £}ÅBjWä*‹3|áŸU¤.¸º.wÀTà"§…òª6Wà|Ð8a ¤hÙ9xcöñúó†:¤õ¾äŽ$gùâÍŽÞÞxÓ«ôêßù©Þ>’ܱæô­h¬FSÆIÏÝtÞ¶Ïc@)‰ÝÚÑ¢.¹Ù*]ã-BnºƒëÉÅJ¼©+I‰ñ5fEóï×ù@t'Îವý,_±î¸”n²Ü—z"ÇkÖ_‚sœÉ-¤ÒŸÜ@»êZÛ쟶Þ5—¯¤æ1’nÔì\Á»RPá»{Ö=üNiŠÑÒèŸçÄä«‚@I-;ÙÖ8¯Dêðãx_(ÿè›h +§ rëžÃe³vOCió6Z;=wòö//¾ù»$º£ã§¿qz©=tÆ·XhÑßÈÞJ –u)B²˜ÉÖéâJŒŠ£HÞJð—„Ö{œcökZ¦a映È7I@»Ö%0ÃáA²~#:Ó*ßô‡÷R—:&•v…õw +ôn‘C؈Î!ŠŒë<ýøóg¿]üÒŸš²‡N︳zV“cs0}f/ÀZ”6(ÑÁ~C«ò>ª?!6ïÓ”Ú¶;ÇF븡sL˜cüi¡ ïTU ¥÷Á!Jt`t.Ôøë’§ì\#•½ªZI7SîTA韶9Sü­7¸«)]³wæ ¯PÙaNwæ>±îÖhm›“‹æä<×À4P4±¬9ÊËR,ŒÞ‰Ù»'O¡E¨×`¹`ö2ß:íÕV—´fˆmuIlåØ·ªÜvº§ÉúmëàksúŒ +°tzm@CîŒáS­w­¶Ï±¨ËˆFÚ#G*büéG'*j«;ÅjÖ%èCŒEGÁe‹þ¨L"2¥”l'§?žüï&Ï~Ï{k¼©÷xg,#Â)ºÝK¯õýÚ^q°0 _)¡†z ÎLðæ‚»±zOñ›pþ†ó!#Á‡Ûëfïš0í+=9ƒa1âõ>eÃøŽÞw¿güMMëâZŸÍ[xÎè-ÎÚ½ÓÃg~ñþŸè½“ªÞ©¨±Ñ94ºçU¥CB‚U´|o¿µ‡OZ¯&—›1™ô +^c‚´UÚWBtس[›2ãŠÎf}û}÷ô¹}E[ègHim=^Sz›PagB·>¹üizýóôêgÆtÁE%& §ýº^¢ñ˜¾Õ;fÌ~™u÷«j°Øœ5|R² •ÂlŸõO¾©é½=ÂÌÂÊ-J‹+é%=^žrwÊ:©ö„´ë¤Ü¹§W>¤çù¤®Ž ~ÍåkŒt·fÞ¢³yŸl¿q†7¤š€o3„V`,Å6ØàI^¨‰íÎúÕŇßõO^sJRzê1Ý¢4ƒáÍþuÿô‡ÅÍ_Pöœó¶¤Ò[U”NŽñr´+8“áÁûõÝo·/ÿ¶wþsIlgIø—Pû¨n”3eÃ9¸G”ó0@2¤O–ò–œ3wÏ€jXÊ"¢úä·ò½úô·P*`ªäÏýÁEkþ…ÐÇðÝÝÍ·T“ pÌï„äHlGë·ë×o?Ö€¤U J‰ä$š¼›‡Fÿ +cÁâ:Ý3`8¿ÌaVCô*^¾°è‰à¯9wåô.”hÕ0†¤=ÓÛ磋Ÿg¿4û7œ·„;–ƒ©Ý=ˆg—ƒÓ÷æð²wòíüî×óûßjÝ+H.2¥½|Ù?þNˆOig­Æ‡ +œ‘‡4é”X“6°ú—£‹_|ø{ú"V+{¢Ç‡Z¼Tâi´¼±FO¥èŒ÷Ò#$”1ÈSÆÒ›’;´ûÇ6gx È×ãc=:,³Q¦®×„&£«j_‰‰’avÏ´æ1H{§,µOaz‡Ôú„>0zíÛÑÉ·fû¨Ìš„Ä“‹ÖôþQ^€øÃÞ–9îVp—ÀEho–4åðúïîÓm—“ RŸVøŽÓ¹†Ë®ñNInÈm„e/QþªR/Oz{e…S;z8•‚ãÍ•þÍøæ·‡¯þ¦³ù`%'H%§w²¸ù%ê&³)@•ìÞ8㧨%)F$ö¤»¸l^ ßcn‹\¯\;(^{¤QVbÆ_¹³WÉÁwþŽFÀx ”`|S‡” Èí Î?À÷YÆ+ñiôÒ¿_X¼Vo¢Õ#9‚—‡øcž± +FûÌì^›ÉÑBUÕÔXïž N¿Ù¾ü‹³ïþ¹9¾Ï±!p¢ÌØN¼PƒiCŽË¼ZãOŸ‡Ó—Nï*×Ð +„ž”Xµµ&Œ4Í?µÀõ“ô:w¦$§°oîðšñ–p[zïÖìž«áBfFk.îûgÎÞýÍñ»¿n| Ýu]*8ç\ð&bxhõïÒ='wl¸ªh€m›5ºþà&Oíþ%ê©ÚZÍ®¾I“H]ÜÊRGnžÀœÒƈR;¹ºÂI2¿f÷îø)ë,êr¿*"8ÇÞ«|n…cƒñ­5¸¢-©³$4ÍüXá¦!Åév?Æ0Fä~&÷0¶e1DÚNŽÞ{“?zRÇDy£ËhóΞ¼Rã£:"³¤”¹h´Ž¥ÝPzV÷Úê\IþÖï§ç #EÚc!¨ZWÚ[£¸0Z_Ðz<¼CFF]ëŸ~Ž®•p#¹ ζf׫«¤CQ«j‡´§b븢 ò\³¦ Ú@ ×€Öj )]Èá9c.kÊo‘¡,ÖŸóá†v§u«ÏÇ­ƒo/ÿÛäì'1Ú"¡ é„1Œ&ÏF§?[ãW|xTÓG•ôÚ•1cõÓ-æ[Ǩ§˜F°œÖ:@>Â+•„6_ +×­uúÇ× ÀªœÌ.¾½1zk.œs>tì­5¼çì¾LËbPâ]+½< *0A‰ª|«ÂEœ™ž>àƒ±Ñš­ŸþÊ™\y%®V¥Äœ«Éq]ë¡‚§—~ ¯ýùK½}ÚÐÚ°ŒÙ±:[·¿6’`OiŸ-îþ2\¾GoygV£{³ºÞ%̾?¿;~õ»ÍÓ?kN.õ`"Zàýðü{¡yˆ„ª«CØ£{9>ÿ¡¹¸«ðA‹hm„àD¶Š­“ª6D²ä(Kfáèœ0ºjr&Åçfïvuû;ˆ‰è/y{Z¤} jræ韙9:“ã «w yTŠŒ«6· ÷<Ûdýuçä›æñÝã%;m§¬¢|À|IѺaŽ)ðpëÄ=CØËþ +â¹WÓPhPUaýꈱáSO*VjVº5!ýÐƉþºH‡y«Iˆ‰mÒ¿Ýð& ¥½[U!³Ð[«}¢DkÖÖÅVgþŒqgY1¬½RúgÝ>:–£Óhú°'s ‘­ËBgŸ «&½ð&\¾`ƒÈSn¨Ééð$ý(òpû¾aL +|ÜÐûDú΢‡zï©9|¥w¯ñ:´Ñ•}hé2š½Tš[dMÝéƒgÍíý‹t.9\Õåd§¢Ô¥&‚PW“Zûus·¢Áqð˜“ôrAµ×]¿útIƒ]àÛ(»”¥AyÃk·w†·VâmÝè×ÍyNì縎œôŽ¿O–ÏHµM*I8¿?xþÛëÿ´½y‡eÊ4ì ÔÏÙ½KˆFžÔÖñÓŸÿíôé_IÉ)X=×p´æQoó9ûßü¢òUV`íÅòí?l^ý•;¸D?Qq0JsUæ›e¡ T"HÙO/~ý?†ó·Z÷¬®6G5}HXSÆ?ÂämNƒÑ¥Ï«‚SŠómÎXØ›éÅ/ÕÞiAŠ¢ÉÕñËßÓîŒWl¸¨Ce`›Ñ»”¢Uº+´Ñ›GƒÓߌ/.Þ0ÖÄê=;9ˆÆWöà´¤ô÷¹e-ÝÁËöæG{ð4Kye!Nÿ(òð»hõ–).pìÎjrk¯®eê­÷ÃÙëÖö£Ö9/‰ÑnÝ Ô.n{u³¦ô”ÎYëà›ƒW?½ÿ9~ZV0Žä-‹L”©Ù…ôbõeM½É‹«ïþÅøò7U} µ6íÍÛxýÁê_SÖ0LJ9>ÒšÁðšÔRñ¤­©¬[Ë×ñêi¯Òã0æ'Œ3&­!aŽaxo!yóÔ +1>©¬ôƒ/ÒÀEƇ‹×KíCÖKñÖ?k}×\½©ÉÝýº#ì*ß,ÑN] 1ÌVÕýšÁC·wi÷¯àþr¤ØhŽ¯óÙº¥µÎ—/þÊ›¿4ÚWrx˜ÎI÷h´¹%ÿ«Ë…GZÿY´þn|ñ[£w…Q?)IÍÑåùÛßËÑ<Ïø_å™ý[вŸîëžFW¨é`Ì.áPÎZŽNÆg¿Ú¾økÊ?ÚçËLˆpã„ýNQ- +I]J1fï¥ä/ÊbÒ9üæêÛ1½þsoö*ÏuÿÿBÚÁÿßøÿª}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´vð¿ÿÒ:™ÿBÚ](øw'ÞáËÃ/fÑ»ÉoñóàðÅËÓç_t¾(lIûùKïòøååýÝáówwQÃeÈÁéáM¦ü‡Gfð L÷ùåùåîÞœV2uÝ'S”Ä ƒIŸžE³"-q4÷ÿð ÿìínþßôéæ‹‹/¦_Ü}ÑÿBΔ+™Ùô‹ñôæMJçÍyþêÅEïð%¦äîw:§˜“ÿäîòøîîðöô$óéÞ îÎ0ŒPÁ,Ùøö&ýæô‹Wÿé¬Q™ß\á®7šÊ´3Ë5•9I?H{/ñiù?Ì+¢ð‡Ÿ“ÿøgîÓ¿Éxüþó§Çßý_ožý‡^Ði/>…GpysªüáÛOƒûw±‚©@oÂ/Hïôõåñé t2³ÎKÜÙø/øŠŸ>Í5Ïÿa%øÌ:ÃP4Æ$¤O¿øõ„´?ÿþIÿþ_)â´ø©»\&}"õE¡ð©‡it+ I1kþW¬=®É­†Ö¼©ÌEwÊZÒ˜òÁñÞ‚1†ØÔÜñ­£_U’ªœnÂØ#ΓJ¢ø½µvgFïTn‹ñ¨íËšÒΓZ¾!×yw†j²5û—ZÿJnŸqÍMÔĦÓ;Ô’5mõäÌÜÓBt@›3±u¸‹†Ú«MÆ™ áFŠ6îø†tgÊIw¤¶Fè|™ )­o$Gáô©Þ;šëŠÒ¢¬avø`T”ΟxÓû`ù¶yø½>º§ÜYUïV”Äßµ>øË—ÞôYsõ^ë]1᪬$B°dÝiCëø @Ù„Ñz"z#Þ›äiïÅXӲܮȚÖc½9:ƹS9\qç­ùüœr–%¹cƒÖ”Äîžê­ƒŠVø@ 7zëHpU!)1¡´µpÕ^¼À;RZWöWEÚß«jU¡U—; ¹SWzbx D‡œ¿a½U– J|ÜPz”>¤õ¡ä¯ñR ¹ËZ³ªÔÎ3.f¬¡ökr»&%Z´5â#Ê6”~žk>©j;U-KÚÒ¦Õ6oÌ¡Ð,1.)ÇÙºú¸Äg)«,DxzUê°Öœ1Æ„Ú/±!V÷u¥­kU>*Ð~¶aJwW¬µ½Ò,Sx‹.caº(g^Û%.½…Û¿°ÛÇ´Òñúçb¸¨i’‘z_n)ñ±`œöªÈØÚÓm_o”ä’ øè˜ó–éVåÖ°Ây´Ù7ûÑúµ=¾ÓºXÇMÕÀ2¯ßüuÿè iôH½gt¯ZÛüÙ;>ØÖõA5Ý´U“âŠUÄtKÚžàW }ÔІ6È’é.ƒU©™îºÌc@;3£{Ñ\}»}ökÒéVÕ¦Ö>öæ/Û'?úË·|네`}þü/ç7?×­aIˆÌÞuÿôçxó-ß<á›G„1ÄL6”¥õðâŸ6Â1Ò >å ‘©ëÙ†™îzëÌ0Û´¿h˜cœƄ´ç´;)}Ú‰*rº9nElUĸĥ{­ÕÄ&kö 5©a‰ñk\³Ž_1‰V‡ÝÙóxr¸Ú¯¨ÒÙ¯é;%¹Èø D‘³”¢cÚ^SÆ\‹Îø¬È ¹Mj}Ι#HßJá¡Ý»&ôÞ£Šø‹"‡ÈT‚µ•œšñ ¡vž”å"åׄô³ÚØýªLˉà®DÍꃽªŠnj7GZÆÅ T¥n–Š*B‚(%¬‰Ð:%~™qjB´I¨”Ú÷GÏÂÉKôB·ñøþãoþõáó_ýÑ^MûG¾ãƒ}J¢^Mj8?ýÔo¾‰0»'FrÈ™ÉßÿÆìÅ(CY¼5i.ß‹·œ=bŒv‘r>íütÂØ3Â× Z½ëhþB‹ 9¶’ƒxõžqáŒ×X_¹uâŽnV×?9ƒ Êè‰îÌÞYãg|xØP‡P*L¥÷jrœ!ô<í Æ nŒ='ô)ïnhsÊ;é§Ã—xŸ1z‚?®ëÒ»ã§ã«¿˜ÝþvpñmÃîòÞØìèƒ3upÎ5Ýé«áÉÉêõüìÛxù¬’nÔ³zÐ.µsN{k.:eÒ—)á&Ý–tr´—£}ÚJ·?)³ÁNYΓm Éy¡™“’š9#í 㘣ç”7ÍÒ6æYï^•„8KyOjf‰obe«BX—[)|m(íß,4¬lÍÈ5,ÈB]hYñ¡¬25A…ûwËJ¦ªíÕÔ²ÓöLk_JÍs9:µ»wVûª*¶g–î–§ mĹÆYë«hþ†q¦ÊB¦¡CQq8g‰ƒ ÛU(žØ~”çå¹"e‘RÂÙ+ÊZÔ¤^]ìîV·Ð +ÕŸfI3Cúy¶Å˜  Jº[Bï3z—T;»¹Ìx´6ý5ÀYsÙ[9ÈÐãï°Äÿ(SWZ›`r‹k@÷¬y]‘æ¸ÀúPþʧy`œ a ké®i;>Ø\ýq@5¤­‘”îÈrBZÓ,ë¸ ÝZ)9rúgé¾ ÍãÍØ`EÙ3Þ[Z¿Âáèªòµ=<÷ÇçÆà”—jûØè_à+‡ÊkM’Ù3£w¼O[yÆ£´‘Ö:em!GE>*KqåO +|³"õ¥àHo_ʪöŠ4†œ3EÁ’£¥Ò:šéöîì¥1º¡¼™7¹÷Æ×Jr`õŽ…dÝ\¿[ßý¾ú#ãN‹b³Èu§®çÏl_$›o£ùÛtç³æ6ÝV…ŒÑãïSN1ÝÆ»_WºŒ9ÆHQõjƈ°—´³•¢soú$PO÷ù¾×º—y6Ü'Ý,ésöŒI?þ¾ÕPÛ”>‚ÎéœD™ŠZa‚2ãk¿nJ—5'%6ÚoØ9Ò+1!däQAÈ‘vMéJá¶(¶ +l³È6Kj"&aC¤»g-6%©…ßRÖT¡êô4ð¤ È8쪔 êb‹Õ‡”ÚÛ)+ÊË7¬'±! 0HXH_UìJÎ<쟻#„t–t L”§½2ߤ텒ÜzãgVï¼"¦º—kûum§Èí–eÞõ—/õöé, +鸴ªè@ŸE…B©u®p?aN)s¬ÇGŠ?­ ¢ãÎ¥øÄêßzƒK9\PZÇIŽ‡'?ú°*Åu¥Ãûótû7ð€¿Br™óhþ”°»¤UWñâk5:”!˽3`2¹û³ßÿ§ï_·{u£Ã7·JÁö4^¼noÞŠQº5R¬&uhk!ÇFÿ¹Ñ¦wnÔö9rGq'f÷¬$wQ¬ËR—2'Fû\ë\ÈÉY4yzöâwã÷E)âܹ;ºO¶_'‡ß&‡ÍÁE8¸úñOÿ¥=;ßç|”ZÊ^RÎBm™­c9X¥”ÂXn>ÝvtP‘º¸UÈK—B¶šãGe.Oa8XËœåé°*öulµNÔxý¸®e ¯&”äÆìßݹyLšD ˆK“'Œýš’#ô"çsÖTr—’» ”~…Ë\„ÊR ­ªÐDíËÎ^Ý*Ða +Zu©]šû¤±[S¾Ü'÷jZžôÊ,ÊhášîÃ-ÉÚ; -Ë8è‚VO.Ä`ËÚsL;2´ŒÉ¯1tf·¢dëV¶nW¹„UÇeä“rg¯*U`Ÿ””­të#¼`5ÝÀ’ìIíí£‘Æq+Ç'Á[³»»W‘çÙgõ÷)k‡°vŽè.'GßåHhfÌm`PÖ\K®š‹wñüàJqzíÉe4»çƒëÎ)@»7¶ÛG`Îdû¾,$zs¥„‹ªœàxŒH¶Ãù3€tMˆíþ9VY€(Ù3{pÝ\¾˜œ}ûõ¯ÿûùÝ„=â­Ú½P»—° rëÈè_qÁü!ªŠ jŠÕ»}Iá‘ÂO÷»Ü\ü4»ú¹$÷*rŸu—jó@OŽ$BrŽï›·f礮÷xoÎ{é¥þôekûµÞ;÷'·oúgÑúÙ.i8dSrb‡¢"’¡5¥‡ïs”CÊIº'M|ç¡6ÖœsW,DŽ4s„Q¤C`ƒàm ›­Å›tëú†‰8!4Èû8Ý—•ÚÛˆ ns^—û{ c§"fZ‘¶«BÄYc0à­dw©…‡u¹ª‹ Êö~Ã)0! ’’#œéÔ¥òXäÂý†¾[jB+Ox»#S·À rxˆÂ&ÏúéöÃæ¸"%è3ï.á5fx:kEwQd£å B„ƒþWùЕ#ì"é¢J>)  ½*T¯œ~E*|ñÃ[3”'«{Ah]à=cOYs;§ô~‘r«è$£%ÙmÈAÖ™~Ú¦½%ŒÔB$Í1ÖBÏ[ëo{'?Y½+ÉêþduöÍðäÊŸ¬Äp¥·ƒÑegýJïž?Ì֧݅ã§Þè…7ziöî­á3Ö_BÐgÖÙ¼,Š!hœsíÇñù/g·:¹ý•Ü;‚Ù~ïNŸ•µAÚ°ÞÒ›<‹–ï`ÖÔä ]ÒZé6–RÒÇ»so|Í_OÎ~W´)ín(P„;•‚•!/ŒÎë.P=1±r´öÓÖØŸ<\þìLŸZ£ëÖæasL@[„œH–uËb Zƒmº76gê¦lOÂÑ5m3„ÚÄØ ¨4øÎ>fw2!!Ÿ¬³?ŸCP‰­š‘!œ’ØÂ[àǚثK£•n’òÉÔ4`<àkÍ[S³yÔš¾P£²Ð.¢ö‰Æœ2ÆÔJˆ-@þ~Ã@Ѭ¢_¼E™ (mP¤£2U8”EXc˜ÄQ)}LW 6HpL;"ÁHN$?¥ÐªsöÔHN1‡ ¥›#¬"í5¤n®á * c€º\Æ6¤Ôl·ª¡ø·lZêàHuqÔ1j_ 6YÚÝ©È;Ea¯¤T…åX6(»Ò¤5”x·ÌýñnJ·Âš Dú¹Uã#µuD;c”xFë™ázxðÎ^ ês.\Sδl¶—¢n·Òc“g´1Bò*@#wÙÐÇ¡Cc)Üøƒk­s”ç=Æ +ÁÂèœÈñVNŽ(I8Soòtvýkwz{ÅE¬¿Ò»çöè©Þ¿UÛ—°Ûx|EN]ˆšÒV“Skø\éÜÐჷó\Hè¹¹eœ1Ì2XBJê»wÏX£2ç«ñ–ƒƒ³F”;£¼å¡B©þ*\Ö‘†e Ë×ç¼9Lw‰ôK¤KH Vg·$”³—zçN/%oó|šÅ*0f§ª<.‹_¹20«I¨ shK–´àg ° ̹®aFJ|RæcÉßè¤ÖÕ½yCŠ¿ÊÓ™šŠ#Uèê€PÁ ]RîéáºÊù_îû55OBñ@ÚcÞ]PpÖ©‘œU¥j(˜9Ý×£â#ÔáK´‡·€(í–ÅÇE ·_·êb—û©NÐÉV²v«ê>,F¸a`Åî¸7»¿|úç;5õ÷©LUeµ‘ ZŽ„¦!¬ +î”Ù?Þ-î—8ÈÌo1ÝYÓnhmX­cÃéCNøÈNNôä°ª¤)£%'´?Ë1&¡·xg E ­µõ§ÏôîÅ¥f Àó cÀy+ü,˜Ü+Ím²´Eš}Ò”•¸¨µýÎA¶Ofßݺ“§i©©y.¿nŸü¤oÓÍqåôha R¤$gÖø•>z¥"r¼eUé”ÅÔÒ^ç9¶î»¤ÁBN²¤MëC£}uÊ44¹yà/^›Ã;d »d!þ#=9ÒºçE9Ùiˆ^¨²sÅ;3Úa-@¼ø¸ø<…E„Ý® MVë!±âXHD‰0¥%©=¤ôq]êCÓv*j +ÞR«*6ÿ°ñ^†°<°óªÝªž%ÌO•nX†WR:©Ãrg¨ÅEÚ…ñÏfCjVx?[WTwh¶¶¨Ôy:ÈQþnÕh1ڰĸ¿Ø¯Qr"Xã +¬=×ÜG`PN™õ%omvoJBóqEÌÑŽàL¡9鎧Jg§$gjFöÿ$[ß©ðyʆ᥵~‘´÷J’"Oºtª6C§sáÝ«ëKâ—y&ÕO±ÉXC%Zí§ÇúZ’7*ÒÆN‰Ú)4v‹t…õeoiA7ä¨Fnk•naËC]Ô÷¬až¶%œQóQß1üŠ¡{øF‹ù`Qá\½½¡QMN YÆ-ð! -^}ÐÚgŒ1ö&×%9Ä„—¸tÜç3fßß8ƒ+#9–O¹hÅz ±yØ0&e¥Û€â­?´¾&­±àÍÁEpvbrZ3†%¥ƒ*éO^Ë—‚¿§ÉÝÓ¢ç˜0C¹°lXŽ`tÐùë­mIŒ3 'Oû0Du©ãn[‹WB¸¬óagýBíì3Æ>ãæø/BY£Ññ÷ƒ‹_sñì•?¾&Í^™x˜,%kM[pyÑv¯®”h“Ö:;a‹U×øP9BïEYJ©« êQMLj"êZ”#ü ¬‰Î¬Äº¸a¢öj:B±Ì‚'©{jËÁ ¡$E55íÅ"¦N GÙøÊêÝ +ëñz'žT¤kQ’TÖP˜„v•k!3I0‡„Ø,6¥ jb§!wi½_€¼€&³v¿Èz`že!þó¤ª ø¿¡(£!¢·&üÝ£»óiGgTFh”•œ¼ýÕ¿jèÝG9:WWA‰Àûå¢æ¹ö°·|Þ[ÝîˆR´HÐ;¤UD´4kbÌêýÁÁkJ0úÑú5ËÑÊ’:©DVkòÌÔÌ"6Ä·e»äÏÓ¯ÖhröÌ—•}ÂÜÇBH-!X·7$àîAæVûÌꞣ’ +Æhqõ ¾ÌÕ1FÒABÅp1¿üåôæ×rûØi¬o~(î/rÄãËšCôõÅë^¢`!MXf0yT ÷ªR4Ÿ|1¢2Qž38+Ë , ·Ý*H¬ÉS-:…Õ‚›Ž‘g¿ÊÑOŠ<ê„ Õ XË»«ºÚ®ªq†@Mõ¤Ìxp[PHdzCŒíÖ&ŸehëÓa±>ì¼[º¥7áV™€7†Nr„ðàôžÆÔè夅,}‹v󊵇OÊ"jÒRG'0pÅ=šá›],e]ÏÕ ¼rŽps”N;¸ÿuŽµsU‰•Z¹†¶S’P=Ózʵ }MïíîQ¦Ä1¢'èÍ:ç>)‰9Òåì±Ñ:„m—>mœZcÊa‚Áù¼=R£%$}¿n!ŒÑÅÄ¢nrÆ0\ƒêyo +‘'•VCn"gËb“2p¾Vrˆà)ˆ>g¢b®yg +ÏÂÚcÊè“zg°¸»ûîïÍþy6_íÁÈÍ#»¯_ ÍTsÒ“[ë ïòî8žÝ#ØFº›£m'~þÛÿi|ú~·¦‰6X7=„¾O9‚bõŸ+ù¶á­RߌOPг` ­‹÷¥ƒœÁeI v*Tˆ÷ÀºaM‰hgH9#ÚLWÏó7ÿ¶ªD + ¥¶‚Ñ9cò´»[3>)¹ƒt]ÔBiÕÅT;ûàÛ´ÞÅ~çôůþYUk?©ª„Ú…±%•©öQþJl ÎnÞýõäìã—9æqžÎÖ$}CÚÖM8AB"> £®G¹&œÚ~UB$bb6½î©L3”Š |\–ó¨ B¬:SÅ™šÑ`ônÔ?EõÜ8eéeB Ë&«hr0FšçzžÐ‹¤“o˜ð‰p‹¨hf4³â´(iYÜ)ðÙºUĸÀø9Ê~TbEkbÇÇÐêô¤¼S Ë´ÃšKÞY@¥ñ˜LE®PNÖµ$ìUdBv>ŶCèc¤ä£’¸WGýu½OÁ‰«=Hb¦–pu™0)-¡Ô¶,[Ógj÷Œv& µÓH'6ÀˆH½‹ ’‚¥Þ>’B˜µ5i ÜÁ¥?»ãÜ çLÄ`ÁØ(vS¯ʇ‹}6ÌR”vÕE3Çج=’‚9æYëž5¬ëÍ*r¼P7Gvÿ²}ð>:øÚß‘Þ¼(@î’ÔŒ3N–qXoPgÝ•ŸöÒ>s·€«"çÖ•VU0o%6.óp `žužTø¯ŠÔn…§ÑÏÑ}´xMΓùUž´P\ÔYÃ=)39ÒÄT˜É¹ Á¦*·áÄaò´Ùøt +U +àŒ¶áøy|ðaŸM‰ …—Í”ùLEÌT%,„Ò\›ý31ÜT¤¤&Eâ ì@,òº,vªrOðÜá+Êžfêz‰qPª°@%ÝN*R—Ž‚Å[轡t +¤µ[D]Ö Ö¯Ð£v›Ã˵ˆxY©YLm]„Ø.KmÆ#›hµû(Kd+*)´j|ºëóб¦æÐX¿Š$­É ÎÓH +l£²WQq&qé‰tDBIÁã“©*{ÕÔ8W ¤rG Š´_hØ–¿yRD62e%}w¡Ãø¤$eæ~zd#òRO°—`• +H7_Ghu+j=Üqœ‡E­IN”pU“À®m-^ÁB«ëú°®O)gLÞ¶ð—o(sÈ;HGEŠÃÀÈO Э©Tí,a1*ÌΪ,†’?Uƒ…Ò< +f¯œÑSÒžì‘6ë/9 =D^ë£×îê;cü¿ª)=ÊšÒ.FÝÏó6€Gt—Í·Fïš2g˜hÚÁ”¢o»%1=Ä­ŽÄàH ÉOˆ0ØOÜ¥Ì>Î «O§Ú5'µ1İʧÉHª›nYð` ¥èHí\Òö¼žž)†Ûð^z(#‚ ãí¥ÔóûÀÎ "ÖmRû«<÷(Ç P+lDÉ=VŸ1ÊCÊø¸(–(ÏéÝ#õö&ì'a–#a–QÓtÛl¹ÛPz{ x €U.`6g§¬)O ­þUÃ=Î]ðî²cNOjÊiÁðúã[ÁŸ—¹°¡vkrZ¡*0” Ä•½•Ù<ÖZ‡™†T—CÚÑ’ ÓSEJ´µ:gjç¢a¤§TH­[ü}ÒÈ’&«¡ö…èˆÊèðèÛÍíOy!ÌÑ^zäAíñ낦’짵§wy”`ºIÛkµyÌZÖF?75µÏ[ÓëWyñæ÷U¹µW3÷pâ!§wqÿ‚Õ:uÖq–±¿ªð»„!x+§ ]5º—U±)¹ÑénMUÄ.©@ÚˆœFz\È&¥®·¦ç}†ÇW½•âm}Væp8)µó Ö,Oxœ9%RÙ*q­ V„^gúRõ†¹†D*qŽ¶‹Œ¹_vË,Ò™’bÍXáâqžÉø)§H€¦4Õ^YÚ«j 5:¨¥*4øD4梽„\ƼLû²G<Úg3Ք̿Úg u§ +ˆSeðÕ«K]9:©+ƒÛ¬)ýßÊRááåèa€êàv.Q¶à0"ÓlMµ|’ç +5µÊEéA?Ò)Ñ>•^áàí5Pß}VíÐj ´[7à1-{fÛØG·iâF(=HM¦.ï–älÝJk41ä amxO¥ó¤"?‚h{¤YäS ‚¬ÒÖL·9fA$ä¨!†ŒÙ°å>ˆ‡? G·b´üª&W¤¶¨Ñú_ZHçŠÐ®I]è<%‚Ù…Vù˜Ð'róÄè\t>Ú³ghªñ¼ö“²ôU‰\•‹\ÿ £]d›”>AîÊ\žtAk”1ô'w³‹ïÇï`W)„„܇0|tG¶'¢Þ—¡.w1 ”[•;e>=/ŒøÑ㣹‘ÃåFåH›±&„ÖEäÃFí”ì” +3f'‡Ñì>Ó0ëÐLº ðËÔíÈv<}.úÈkÉžOŒð`FZŒ1‚áíaEN`Yot§Ì1Ê.Œdž Š\„÷„ yÜ#ô½š’=2‘låð¦ëX¢m@&4úœ·°‡—f÷Œ1bp•û*ÏìU%RN$˜S¨ +‚Pl‡«ÊH\¤LBîÁ¼ËþÓBSÉߊÖ,µ$œ T @äêf¶næI©3Þ™ÝNξù +p›†å°*${Uu*K9*¬JˆØx·¢eÊênIÉTÔ|ÃÚ))OŠr¾áÔ¸H –ˆX w#½šÎzœg÷«`$€1¦:È‘ÖNE.f¾¦ÔgIP¼ã,äÖ‘4³ñÆèŸiÝ“<à†%aí)néÙ(:HsÏRð:qIj–AòZ¿ÕZG¼›ž¾Tü¹•lÌÎÞ:bÜ¥è/Eo®Ç[ÊhÃ-ú£)XÁ¦ñÎ,Ëúû,˜¹·¼øI )"µv†vÒ¬¡Ã²Ø圹o€m{Æ]øÖ“º½[·Aò"^ÄžB½i°½3—ãCÊÿ¢È=.²ð&”>äÝç.)kÎØKèX‘qq?ð•wtòãèä—Zë’÷¶Ð%$N¶ëRjÀ÷êV]nSé ÖXš‘D¤U‰v`ÇêÊPNÌøäÿ$é=¼Ü¸îtÁ?âíÛÛ¢˜š9‡*ª +UTB¡P…œsêœs³›l’MRL¢HJ¢rÅQ+Y¶ä ±œ-ÙʶeYŽã™yogöœ=»?hÏÁéÓÑ…¾ßP÷^@¬Vï{Ÿú€`!Œ0p 3A¹œ›/|mÄ ‘@œvtÄ9fáÆm¡Q[Hëé/5¶°£`0ì'¬ß°€}ulR•=U£wŠN"6jðs[8ðÀw;ÁÛD`c“Guü¯Ÿø‡;G Ûõ}QæaöÍÞäˆ|ÝÄáAƒÅŃ»› &ÒJßY©þ«t¹?qÔ yÌÒ_¿ +¼ôU§xœ0û%þÇ¡ñ¼Sw¯÷Úƒ_-Њ‚ÃZ1Åàâ–¼á~Þ @w&\²‹+ú¢o¨†KD¤a¦V&ãàŠð<¡´(ušI-èðÄÖ¢ò˜C€ÄÑOmeÌ4P¹üð›™‚g"c.6gö%ÀÃüº8¬’ÝópY¯TµÑY;1{càŸ®+nH™E”ÏkúY,\¤ó„þ<˜dÈb6Rµû“ƒ@>Z jR¹Ö£æ]BÙÉ—t qæÀq<NðèøO µü‰Y#¨~uCxï°4BÊsòÍ&ÿ!(^ 2î`]|Á &Ç p£ [|)g ;>ÙÉCº1Óv΀F¶}Ÿè¯¹âtö€‹†JIo0£usVBvú“V* 9*[n® ÏXÈðQ-jÿjA¾µ?AE*ÑqŠ%<Ò¢Õ®;X@ÄŒÝ÷Hy±¸ ”—ÑPr^!£67±hð*@Pn.-Äd`ƒœK̻ج˜žŽÔVihôEÛ€+r’IÍظŠ=Pq0&<¢‘œiJݪj¼J¿;bÙæOY™$Ц[jàñR¦³^¥íárjs—ŒO 9+¦â3”:ëô°pËL©z,4îâ¡&ÜÀœÝåÓÓRq‰MMóéYàäQ·³àdóÐY0“8ŒXxØâï;:£oÂ-÷¶Ñ£! s2Y*ÒEÄ’= ’JÝîOhÁÁæ\\ +Ç#×a ¸Ì“˜$¢ #“8b¤Æ]’ƒ†×=r~j ¼ÒiÅê[lv֪Љ)& Ý™BC5.;˨M@—ƒ‰ +™N¨´À¨m[2z£ýO€É„eLÈ<ÁFH(>ˆ {T¬ºøð¼»W®õ·‡À§•ŒxÌ+Õ”òš\^³r@5PÝÐ ä˜1a!¯TJ Re5Ñ=Y]»"ö_–µ³³/5dJ99Ÿ\–ÖøÜ"ªƒèŒØÀgÒ—`¥âàŽ¬4PAš‰wøì £v¼ÁܘÝJáäJÀöÚþµnøâ-à¡w[6ßâ¨Tr‡jžpÓï‹‹ru å0)Ã$š>µEª-& óXñ§zÀ’wp½7leTÛ·dT¼+fòSçò3gùÌ4®4œBÑÉe‰p…Tj\n‘J¯„ª§¼JË€] ,ç •AŽIuÊ&”­\‰+¬á:Ê@¯‰ø”Gi#¡&¬sj'?}S6?L¨ž/6‰«ýÑfsýEËþ4pãÂXI³WÄC_¤HuÅâ“œr“*¥2 +A‹XȾd›üÕ„K´3é¾ô(_‘UŸêÉÙ`q•/,ò¹9xÀp9ÙTÑ·±i,\ÃÂu±° è‚Éò„ÊÃVÚ€‚·ì/™º&•0-—™Uj[•å»¥Ê*ùÓÐæ®\Y‹OžV§N‹¥EB©ùcµìäVnz/ÚX7ûâÎ@‘*.±à ׈pÍͦ¥ä¤Sôž°'XFƒ·Pö'§cÍíPuŽµ£Õ%&Þsª*¸\ã3³byU¬¬ÙØœ•}ẞôˆ™éX‹ˆÔÄÂRzæ ¼~+®s³Í•»ˆpcÜÁÂ=<Ò#˜ÄEµ{†NÎðØ1­8Óâ‘01Çf¦}jÏŸžS»§CµMÀv@m%*‹6°åý D¢ÑwsŸ:Ë7”Æ)o¸)eç,” +ÎJ©@|n-Ö<ÝܸoîÔãÅóÍÕ t¢í W‚¥E±¼D%»Ri!7s¾²vNMZÕì‹8üq_´AFÛ‘úV¼µãOM¶6î‰wv,|ÚâOJÕ¯¶‚å_fÑ_XõÄ»X¤ ÿÔc‡¿b ·NÉýPû”Ü:Åfæs“§ØT¸ü¼O"ã“tb:T\Lôö‚¥e€ݨ+` ÂPD˜T§“¡Êf¤±k€sP ¹ Ç8;£`RÏ͇ërmCmžÌOµ3I¸*Uoñp“Q§Ju;Ú<ÅçVü ™•÷'&ù‚Oíâ‘kÏ rÅH#2`ˆw…Â2Œ°Ú=å‹&`#d£“c£2Ll2=µëlG[êäÙPy¹»~ÜÊôË0ÜØ,­\nnÞÝÞº»:†‰ÕðPI*.Ú°ýÛå‘vfú‚ÚÞ•«kù™(ü çäÒÀ¢´ÚSª™™3é™ýD{{æÔ­toÙH*..¨ ä£Ý½`eKϪS:RÑ»6VEØä Ñã +¨Ju­¼~Oyíêôî­ËO¾M*-\™ÌÎ_ –6lþ‚ƒ-{#_6ꈓ³Òê¸#RèWëlzR(¬„*@¼&*¡æzñ]:9=`"h¥–›<˨ó¾ÄB°¶ëÏ,²÷Ö®™™ÔˆÕõÕt¤~2Ú<š:ˆ5·æOÞZºðªˆÙùÂüÅÊÊ¥òòÅôÔ©ÒÊÕÚÖÍÒô¹k}G®®Ú˜8ŸlGj›Ð‘dïtnî|iíZª»ÓX<ÓÝ»… +™ÜävmýªÜØ!S©™ƒÚöm¥wžŠV„lËÎ  UÉÄ[Xä"Í­hû$“l%»«Áê©Sñ¶ƒÏÐj+ìú½üì•PiÃBG`†ÏL¢Á,&‡6¡Ë|~9Þ<¥¶÷üj•Uk¸\f’=©¼,£µõtgsf÷Fcå°¥GÌÃÄ¥º{Źƒdg7ÚØ‘Ê^¹Yž;ï‘k¸˜I5Ö‚Ùƒ7†ÇzlqÎô•—ËL;ý£6ÊêSl>™€¹P'6¡m±Î~¤}ä2ïÁàRu¥:*/ +ùY`•jwã‘ÞñÑ{ƒ\¢UZ¸Å…«<¶0Ÿ®¯Ü¼ýüÝÏ~ÏîW sg«ë7² —¡~‹KWKË×hurûìí+½Æ¤š&AEÌ)õÍÂÂùÞÉ{“½½ÚÌÞƒO¿i®’­-¥¶inw6o¬ßõÔôÙgùìj¥³Õ˜?‡Šy¯Ü×bZ’Jk™™ ­“NŸ{*9yvjõ|cn20kômúb-)?×Ù¹Ý>õ°˜_dÁ-ÈG é •· ¶vÛÛ·3óWÉ™ZåXæˆ'•j¡jç ÄuÂ¥%9ÓJV­T„T* $ÜHî ™¹Ìôpž`/“3çA(]l‚ŒÖìBqÀ) £ +"եšXPLuéh=;u²8V(-9„²Î¨¥ÕÓןóEŠáÒlyéb²·Ïdæp¹D„ËÖ@ÚÎåÂå5.9eƒx(KÅ TM¼ã7ÃÅEŸRkLï6ç÷=b.ÕÞ,-ž/ÌägÏ”fOeÛk\´výþgÞ|÷ƒîæÕq·h£_óËRåd°¼Å$g”zöò#O¼ðv4ßsRjg?Ú9«ö²ówç—nQx2S›?¯TVFlþ1; Qi“¯æ¦Ï<ô:h7›hÆ«KZ·ààràjœ||E´º>»s³·vÅ+äRåpyÞÎ&-Tá+þÄt¸²©”×M¸Ì+U!ѵRQ˜ÐPRÁ”Âå¸XËàáF¬ÂFƒ¹^~z¯»}Cn¬Û¸Ì 5h&,¤…@GªR~9TÛNôv+Ë—&OßfÒS—Š÷£n´orï¡ÚÚõhs;Z[K¶¶µ¥ó'ܼ/Ö¶Ò1ås³ÐÜÂÜ™ìôI"Z±úDV­J…Y¥±‘èíGÛ{ÞX×NÅEµ´Y25o{I‹'èWjÉÞn¬½íOƒ‚œ½sóI1;I©-T‚àVÁ䊅ŠŒ»y“GZÛ»E'ºwŽ»,xÄ#Àç8Áçrf*/$›‰úÊ„;«.77n%§î +¤WŠ3—â“ûx¬©ÖÖ6¯>ãä3Ã_íìèoúþìZtê—]±ûít4ZY‚ 3•™9WX¸Ô]¿ÕY½«íHÅRÌ.íÝL·×Ç\°£Àr§(užIÍ+]&5åfc [—¢ùi;¥bŒê‚?5GDÚþäœRÛÔNmþ@†Pù•Is±I#.S¡²Z]J5V„…Š=A¨;È`C¥e13JO‹±ŒU¾»iî±dU{ ¯ó„!Ñà¡Fmé*mè<’[(’ÑVº·Ÿê‚G¦{Rv87³yþ!—/ M +Õw˜Ì,þÆÉÛµ•KraÑA'v/=R›ÝïÒˆ?±€ð?åq„Õ < 4ؼ"怨ƒå5¥±ãUc΄+ŸáãÕ!3¦u±è–j)œ,d´:®XH Æù£…@ªHµÁÞ@,"¢-©°À&:>)›*͵×/ …Y$˜G‚\®Ò±.é2‹€F˜&g¤´¨¶wÔöv¼»ëW >…V*RnÚàååtsþôƒÓ§‰µO‘JÃL(Ð$eNH(þø„{ÂB ›hùS_¢Íf§MLÔÅ%ò3ç`6Ý|&˜›KõÎf¦÷cõUJ)¹Ñ1§ÈHNØ'ô®!Ít÷â­½ÄÔE~‘IõôÎ.Ǫ~uÆÈÃ9!›ÐJªµžìlOx½GäÔ)€º—ÝRÉ.Õ ¡»¹,®R‘ºâµ­ÚÊu©°v%×=Égæ´‰ WönjuØN±¹¹¾›ž¹Tš¿æOÎ:…²…Iø¤ÂúÞM9Õ1c²RZª-\LµNJ…e DðùÁd¯Ø; Á«öÆ­ìÌ%!=O+-:ÚF„"ô4 ®LH›½N:Ƨ§‰^®wªº|Å#”ÆÁró‰«÷=Wõ¨äb3x¨Œ‡À÷.e§j‹W´Ž€’îÔ–ïB‚E0 ~)ú·ƒVoĆ…õÎ@kñ(8„q=Âê0©¿ê [¨zåÖ ùÇMFO˜ŠtN8ôè¸3μÊç6=½r™/NOxY“O6û¢z,LE»p Ö!N2 +D Øãs‹LfÊâ‹iœœ“Šz…¤› ‡²]*Þ£M67ìÁªm)ÑšÛ¸\_:ë Dlt8”›)Ní—æ.„+”:éUê*ã)ÌÃd¡b1\Ù†)ÌLíÜ×Ý¼é ¦ùöâÞ=áÒÜ"öoz#N6'¤ç‚¹5h€Æ%ºi£W·.¤²r57yâÕôîÃå¹K¡torù®üÔ4X€¨Pƒˆ¯L‡;h 7a§Æ”‹‰á"´œJÍšüY'*ÖòB¹ &"ô›lî!8pi…vŽZH³'HŠ…Á ûÑcŸ%Ôn¤²®6¶D°ßTÌJF“íüô9¶31_´6³H ¦CüùtrÎ@ÊΤ\\MͪõíÂô&tnΆ‡¹XSëòQª>˜WIǧ:¨ÇDo¤‰„[ÞHW®žŒ6NY™Äˆ ÃY°O(—ÐBµ¢Êf< êO™Üâà¨uTç°z8$ #u,Xw¡CD\*C=BJ³Ó¡â¬TYög¦lB“¹”ll9™Ø 2€ÙÈR‘VT¦ºÁ'¦ú[` ˜Ýë„KÔ–ÚÚ‚¶Ùý)3 ±ÓÌ@)xÊ3=uP˜»ííËÅ[Тa@Ž; NØ ƒÛ¿@^«¬^ËLp©9óq=f"$—r ˜¥Ã )='gH>‡PO qLë>6fט<»ÏE(j@ƒŽqŸ˜[ß½Š–OŒ:\¾(TÊç=\¡狈  O%;‡ú3—µzu.¨Ù0Ÿl&{kÙ™u¥1­Ô§2½…öæ™ÉÝóÅå]" +˜â’mÜl¼ãfâÃ\ïfœd ¦± +›¬‘‘œ/–;'¯<ÒÜ8+=s“|ªšê-Ê“(¼^Œåº\¼2lp»ÅÉDÇ]~2~÷4™³01<—Ë=&Ue’%—¤ê|¢CˆøSÙìü²Üž³ò£‘º ÍÅ5NØI° véîŒÙ ÆÃ+´Zr²2.'¨x•’\ªZžYm¬íÒéŠÑ¤£M¿Ú³‘ê¸ÍxÈttÄ¢µÓrnVLƒÉI="Ø3©¼B%§ÐpÍêO‚.[YÈT±P|¥4^ÖLÅ››&5b$Ž ›-NÆãS<¸ùTvr “ +ý-êFŸ›ŒÄR­T¾•©LåÛKÕ©¥éµÝÍsW®=ôÔ…ž:}ßck—nž¼vûàþ§îºùÄ+o¼ó·ߙZߟÝ8¯Î`bÒF†(¥HG+cB‰dµÛœ]™^Ý^?{áÌûï~ô©ÛÏ¿ºwïã[WºðÀ³¿ü­W¿÷î·ß}ÿõüâÁç¿ÕÛ8G„Rf\Ð:H‡—£åPªF•PºPžZꮟn¬ìä'çj‹ëÍÕ½ù½»îâ…Ÿ½ÿÑG¿ùý7¿÷ãS×,OmH©¦ÎÎèl¬Ñ)8ð°œê&*Ë2ýâ·¾éÁ§ÏÝ÷Oç|–Š•µnÞàâ4XR,RÙƒy‡O9WO”›ÙöBsáÔêÙ·ñþ'ŸûÝ_¾÷ñï^ûþOO^¹Ýœ?¥–f=\ì¢ÞÅNØi$Çø´ÁÍMØ;‘ÒSÉöF(ß•ò­õƒëýók÷?û/îôÊCÏ¿ùØÙ{¾úÈs¯½ó‹Ç^xí®[¯]¸×#¦uNFk÷¹é0­TùĤ/X’ÓV)„’Ílsinçbczn}ÿ®í‹7Î\»ÿ¥7¾ûÛ/ÿö»?þí‹?þõƒO?àéoÆ “G'ÜÇ5^¡òêL$¿6ffFô“‹!ø4âO›üø7ÿþ÷ÿôó/ßøî}îÕÙ»ÔÖ¦S,ˆT*¬˜PbéR­»¼}pòܵ³WnÞ~ì™×ßþÑë?øÙ³o|ï±_ûö;?ýùGŸ¿üí¾ó¯?ûÛ¿ýÇ+ßûùƒÏ½¹zp/˜±xy¾0¹¯Íú#ÙX¶Ü›[8}þü­Û<ùÜ Ï½òúÛïþôÃßüáûï}ôÚ¿þü_|ôåŸþöÿ?ÿïäŸùƒŸÿúÚ£Ïç§6ùDÓ‰³A%•-·¦W6౸µwpíÞGž}éÅ7¾ýä7¿õèËßzáÍïþø½ýÑ'_|ñÅÿþ¿þëÃß|ñØó¯íÞu´0éã :-Ä{ÑÊšÅ+[ÝNJª“K[§/ÞsûæcÏÞü§ïyâ…WÞþñÞûø'¿úèOýëŸþöŸ¿úô‹O÷‡o~ûÝù»ÁâB‘´½BžKu9µ^hÎO.m¯î¿vÿÃ÷?ùÏ¿ô­—Þ|çÇïòÞ'¿ûùG¿ýõgŸÿñÏùÏÿõ_P­?úåg/¼öC¥8;jõ ê=ÀœcVÊ€NF¥åb,ßžÛ8uåÇ®>òÄ?}óÿú“_|ü›oÿè¯~ÿÝóùÇ¿ûýÏ?øøüóÿ÷úÛÏŸ{í­Ý‹7ù„4V÷˜ÙcBXˆ%©òLcj}íäÅK7½ùè3¯¼õƒŸþú“üìý7ßýÙoþðç¿þû~üÛÏ?úôÓû÷ÿÙ‡ŸÞýÐS…Þz¬ºJGÚþùlž! ŠÑ +î‘Rª:Wl/–:óK{ç¯>øø?¿òæ/>øä“Ï¿üÖ¿þô—ýæ?ÿ÷}ù׿?ÿÆwo>úÔù»d£uŒ/yp¡Þœ[Ú>¹wpáòåk7®?øÈCo½ýÖïÿû/ÿüç>ýì½_½÷ò믜¿ruzy=’oðɶÕ6ºXÔ'á”È‹r6WZÝؽrσ7|üÖÃO<ýÏ/ÿèçïÿðgï¿þö¾ÿß|ùçƒî¼ôúw^~ã­ý«t–ÏfÛ+T0#Å«ñR7’«‡S¥ÎôêüÊÆÊúÚÕË—¿ó·¿ó½ïÿ‡ï~øég_üåï0¿øàÓÏ~óÛ¿ýýß>ûâ‹·~ôãk>ØYÞ’uRÊb‚âÂéB½3»ºµiãÔ¹SW®ßxíÍ·~õÁ‡|ú»wßÿø­þøý>øíçŸòÙ§Ÿ}öñ‡ôÊ›ß=wõvº¹à$d'(Õ`fÆMÇ1:”S¹BmymíyÚñ£Ÿ¿ø­·~úÞ¯¿üó_ÿú÷ÿøÕÇ~ùå¿üàƒ—_}õ…W__>}…‰–í¾%—øDCLTk½ÅöôâÆÞÙGž|æù—_}áµ7ÿå[ßùé{¿úÛü¯ß~ù—_|ðñüÃ?~ù姟ñÊ[ïÜ~ô™\sÕ„IcfrÜHèì~3*E¤«ó‰B{ys÷öÏ<óÊëϽñöOÞÿðË¿üõË¿þÛOÞÿàÃO?ýòOúü_üâWïüÉG¿xï—>ùÔÙ+·ÂÙ:ÎÇ4vϘ eäɇbå©…Íë÷=öÆ[ÿú“÷>xç'?ûìóÏ¿üó_>þíïõÉoÿò׿ÂuÞýéò‹Ÿýâý÷zòÙÍ ·z;×p©p\ƒêœÁFYݴƈ¸0¶Üžß9{éúíG_|ãí—ß|ë›ßúöO~þË¿ÿÇüæ‹?þä½_ÿò½_}ðÑGϽòêþÅ«³Ë»|¼‘¨mpB¼PngKõD:WŸ„µÔš™\\]¸tíü­oÜuíÂþù3‰|Š.œ4¹ ÂŒÐ12aB]¨_ +ÆSÉb¹ÒªµÚK뛋ë½ÙÞÉýÍë7/Þ{ÿõƒ+Wî¾µuþrezŽU’d0Ë%zd¨h°“&i÷Ð.¤¸»æÖOEÉb6µ¶ºpö`ÿú½÷<ðØíïÿ{ï}ð›÷?úø“Ï>~æåw/Ô¦§á8κ º¢ Æðúö…ƒ™ÆtªÜh·; ó3§Nm?ûìãïüð?þô³ßýö½ó­7_õ•—ŸyêáÛ÷ݽ¶±]hÌ° hŸƒ Pþ„r 2jÂôV/M 5¶º´|ßõ»_õÕ×ßzëõ×_úùÏßýÓŸþð¿üóÅó§6ÖKõ†Z¬Ú0jÌävS!xX½‚Å+¸H%˜ ’È•šssËçÏœ~øчž}îéï|ûõ_}ðþç_|þç¿üé½_þðé§?¸t6SÊ[ŸÕ#‚3‡tÇGí'Æ”—ä|HN·z3S ‹›§Ïœ¹xé®+×®Ý}ý›/¿ðýw~ðê믽ôâ Ï=ûO¯½úÍûoÞØÙÚ‰¥ÊNŸ¨u‘7cǃ¨?ÉöX9ã@¨’XZݹ|ýö3ϽôèãÿtùêÇêG?þÙ÷~ð½ûo^~ò{Ÿxø¡ýsg—V–+õn$ÛÎOî²±æWË¡½ Ë'£1¢VKVV6¯\½öÍ×߯ôÄÓO?üèÃ/¾ð»?yïÙçÿåÊ•{æ—ÖR…ŠÇÇCœÑ¹Øq#>®wí¸ÅE:<´_Ά3Íbs®5»îbX‚™=>˧±0Rš°à‡ŽjœV7ëðŠfãÂxÄû=àcÙ`4ËÉI³1:\&'ŠúÍ{¥Œå¨ÆJ؉°[ÐÃcúq£ÛŽLvŠ0¤”ïía†\n7AàÑx4™Ë4º½•Ý³“ËkÁ¸jóÒ£&dÐèµ`Zg@k÷š‰q+Aðj R@™°ç0FCNŠR(ªÆ”DR-TªS ¼¬„#ÑJ­žÍdX†³¹|f”µã곉Ž+øÇý„öKE›æ…X![J%RJH’CÒüâJµšO§cÕf]V ÐH?ìfV48ªG‡µÎ¡ Û‰1óÀ˜mÄä3"pÍ-äRù©H¼T³—®Ü½µ½“IÅë•J._è´šÝfEMLÏác†µîÃú#ƒFøeÜÔ߉aFÌrJ‰g‰<ášm.’ähU5Uª5fÍiŠa”h‚å#.O`ÂLÕyúG1¸2X¤C„e¡ÌNŸ‰ãU(j’Kg›­å+Õ™³3[-/D£ ?´#„Æ‚Š©˜éž¥#Ýa½÷ÿøúÑ%8Eg§`–1œ #‘h2‰EÕ<Ãp·÷R~>²|¸(ÄêÚþæ–W[D¨òõ#º;&ŽYBMNÊEǽ|F-L-ìÝÒ Ä[4Äø ;qø¢z77¤C¬Á€p‡µwœÐ· jÜV„C©X \%…œ—QT´&‰6!F¯dÂ"y˜¤ “Nèã6¯ÖÅXÖîaõbÂJ8ü*Ìr‘’²zfp`à ¬ÆE‰`ÚäFm¤Ý;®uÿã€æ𨼮 ûjˆ “–Çmä˜7¸ü#DcõŒ[<os“Fõp)+&0bÜËÉwkŽ šŒN¡ã6<ìfs~uÆɤ´¨ÞÉœôà„cpÔ¬ÑÚÇ&Ìc³ÙŽ³RgBNÌïÆCZ;;l‡€aFœGÇàüv\18ü#Z÷„Å7jaF­wpfLrú±|gqãœËŒéqÈt ¤ìÆøQ¸Âq`Âi÷FÆÿç¡ác£6‡7Ü5f"u.NÐ@>§¶ÍñÄ„ —Ã…E?ÄóPÁåávŸÑJÔÚºs@—²2Y_A!W†*6*ªqs:T6â ²”ÒbÔi©¸¡”×Ó“L|rP‡8Q:ži›Ýì׌öO´àür½2}.Ó>í ’‡-ƒ£ÖxºgÅBw YõظV¢¥J8· %§5|`ÐhG8ƒ5xNÖ„H¶þR·þ!“þX÷èˆãȘùè¸ñØ„y`ÂbBƒZõð1;í¢T9Ñäg0!ƒ²‹7l%¢Nªd(®èñkÇÆïÔ÷!dÀ]Þ0Ha\Æé‹& +‹juóð¨íè¨yÂF¸)_¤MÈu”Ϙ§ÃÙê‚›M·Ÿ°êF„ æ–üÉiR©Á`†e8«sR¹Q‹Oç™°¨Wj(¥]‹W9®qêí>Ym˜nÔŒêÝ€:#&ábžË_m©À€Ê¬Þ æFLk8}ñ@¤î ÄŽŽ[õNž’´Rs1I½Gqúscvn@ç±`â˜ûÚ1ÍÇu#ã6à¢1½Ûé ¹¨˜Å#jíŒÆøú€åØ¢sòF4¬w+ðÓE'M˜GG[T´ãäò:L™p‡Ži<J¬¿ÇØé"bv2fÆdBÈ“ríð˜c@ã4 ¬ŽùâŸqø (+«åÞò,T€‚rsV\²âý#&Õ6Êè –6ês'µNŸ ¼Ñ@ÎíÏzÅ +jÂ?½LŒSJ¼ÃC¦!=jöôó”7TãÒóttÊAÆ•Ì”?Z=¦uô%ØA[ñãBÁŤŒhÁC©Ò‚ËŸ2â.˜_Ö!²Öd==Êß1d2ºY')›0Å E}&ÝDë"Lº¶ƒ…q¶âQ="™pŒX|f*ÅD;áÂÊgǾ:fÄ€Êð¿v_Ôͨ£æþ¦/W@èä×î;tL=¥•®W¨‘иÙ?¤Á M`þ8´ÂјwFm”­dÂB¨o¤6{&ÙX6!·?‰ú³nŸŠP 7•Ô»ƒðWÇFÌFT¢oÄLõØÁãÁüzsíxcOëj Ƨ F,«WŃF©qJ™ +I±ä #VÆ䑇õlý±aëà˜óüÔ ÀÆþpþpÂÁa|fÄLŒYHX~ý˜þø¨Ë„Jfô?ï>>b¶{xp;ƒê„Ñ\ïûƈãŽQ7¨ÛüÚ¥ÚÊÅÃÏv‰U21Ç—6åÚ“žÆÄ|µ¹¶vþ!¶SÃv¿Á³’ILlÐêâˆSN0ºøã (<âO¡þ”³ÆKÿÈk™t¨åò¥¿Úß-¶ÃDLXˆ;ŽkF ¨¡cQÔ!AO¨ENwéXå &™ÕÆeü™YW°hcT:\Y»ºzùI±’aŸRã3bb&”™'c½Ãz/ê‹Ö»{„XüÆ ÓÁkFûû+ÑNyî’Zß–µ•S7T.!#æµu¥¾mŒvNãÑŽ‰‡âµûy±<¿%itôoÄd”/ +éE\ªOØ*õÏ• 9锃ÎX©Œ+P`"]&ÞÑ8ýÇÆ,°ì_íè1xe»Oµûâ(›%‚ÅXy2PžxÇ„ËÞ¯–Xcáš™IjPI뀂†MýõðZ—ˆryVíz˜„ן`Â9#Êõò)€«q Tì â&L²Q1›F…œ“F,ä°;Ò©E&Rt¬™œ9o¤éQ‹7!¢Ù„·ÐºÙ çf’™Ð"ÿ8`:4ê4wÐí/Á¥4q J£ìb¡17Ÿµ‘½[°Š¼®\ÑØhœŽœ½ô0!¤¾vLw|Üip Ç`&døø„sÂJal +ªÆéS 1ÁìL¨²‚Ç[0•¨X°ƒŽ6l¸r|Ü=¢'LHØéKâB ¶t.yÈH9pà2ÃZdÄ€±÷7¹‚.:P'åܘÀ!ƒ¢Jÿ,V·4¬'ú{“Q—*Bj +šAr ZŠìÃ&t X׶`!„K[éظ‹E¥¢MêpÙŸ™!ûËÿæ²½³Ùé bqÑÃ&ätKw”bÃfLwúin…ªn!ï +ÄËÍåo¾ñ£•ó·5î€ âBžjRv5RÞñˆZ®ªµM£W9¡Ãí¾jQê|°x2Ù»‹Í.pÙ‚ l´f¶w†¬¤Í%¤©TÝ\–‰wS•¥³WŸ¬.Ü5á€ìS`3³tjÎéÒê,—\g¢uóðJ&[ð0Æç.Ic ŒY|ÀÃrªGŠ9Àö°‘pù" ` ¼¡ªOi¨õM¹¼j!ƒ‚Pšë W`”äæžSªxB°—'tž£Ç€ +t´‰I>5+eæ­Däаåè¸cÄLŸpY "L(y„"Ê—lt + –q¥é U-¾0¼ÀF%Èp’Ë|´VënX0~`Üft 1!L +8ù¸Æ}dÄ‚óYo 9jô ë\âåÓ=—eÔ"”.ˆ6ÝþTÿ$+T± 3¦=#8fåì$HFYÉ΂î€!7£Â4oÜ…@9÷¿˜#c#¢#/-µNö92dÑX7‚|G„JÀäV<,ª-¿œ¹sH3lpëݬ¹¯¤ ƒ¬Ä¥æ3þD—ÍLa‘:oû]>7ODÛà.jÕ•«7ž+-œ92fÓ9sÝ óÈD[t¤5l&´Üá‹M8Øþ7t¸ü—ä2SryE*.9Ì{ª»å³)‡Gjþd/R^Ívvkós{÷»Ù˜ÁðѺ”žóöOlÏX}6Ù + c.î˜Róé© ™™ó|~ÉÅå>U‹É^±--JÕÉ¥Ý|Á¾Ö¨xÃÌÓ‰†m§Û«Bnʆ ÙÖFyåš:y€†˜ÜÄäƨƒ+·6Ï\6œ›4â˜Ô°Ñ%U eV”ò^0 ÍVÁ¥PJuÂB‚⌘ÁçÎÖ.­_x2Þ< Í›\>¨Íœ2`^>©­Äº{ñÞ~iñZ{ëÑHí4—‹VðPÞÊ€1ãìLÂÈ9pÑ£ÌÞ1ð3HP„tý#:c:åQZBuÛŸ_53i3¤”’W*ºÙ Âf¼RŠ6”Ê*kZ<p‹ÞÎŒ@œtó0øFHjˆ8 CA’¨uN­°ûPù@ršÏÌ»…’‹+ø¢=µµ.mB’=©o ¹%2ÒÊw÷KSg•Ú戋кÝL *P()¡úpÒ{©`&Rš·SQè/(o²©©`y…NL2r©ÖÛÙ¿õ¢áp©*­Æ[áòJ¬¹mlq™9#ôIyNmAè3zÁ{År0·Üܼ•™9èkÆtTç Ûè#f&o¸ªì´Ön É.—ì„Ë V:|\ï²’r Ñn¬Ýµïó—ŸÌÏóHyE-ÏïÜí‹Õ™p}ÁÂ|¨°ˆÉm¹¸RšÞñÉ9­KPª'Ùä¼ËŸ#CuÈšþiuµ²œjn›ð;Íãöø_¤æ úß‘l漯cÙD3?w¦²r!3½ooó¹TÊ£þèã/|oçÒƒfB<¡GÙÔB´{ ´ö}‘î°‰¯Xl¬ÌlÞóõ6½[Â#©q2¹p)³x•-­i‰¨?\zø¹·g7/‚¡r ä”Ú=;súÑÌä“?rˆŽhÜ'LĘS@Åþr)HgtVÂEÊ.&¡•Iô¢í½ÔÌùúöíÖî# A€ŸCCŽBg×íŒY™þ—O\¢G¨dg.AZ‡¬søÁ¯â\ʈðãVüظ[6ûú[G­à¥QéNð?n&›Ñ±‚IY±È˜´’s@6zì¸0dôŽ9Y˜t+¥ BVÈÌÆkð;¤ÂXkO®ïðùåL÷ pZÿ8\#nÇ2˜1z‹p£vØHüx~ L‚M³±Šãôh`Üp²éXm£¸pWqåª'(v6ÕÆš‰’Ý|FÈÏûSÓh°­n¤»ûlj\ +&BùE!9 +îOõP͈Ç0 %6~hÔ‚^8¿(Vƒ¥u63ç ã˜‰T—p¥dÀ‚„\abtsuiÿÖæÅGš«w¹…T¾¾xîúS¡ì$¸¬Hu{ñìgx³¸q›ˆÏXèø ‰@™”RXé¯AÌ^$rÂÉAügâ=“=<æ³PV<îΈ+V:AD›À`á*pH=Ó\Z:uƒŽÔìtÄäåì\ÚÆeZ±êòÂÙ‡C¹éa+aô†R“çAFÉHs¬2mB…Hº—oï€,Zqòn!ç‹”:M%§¤òBqþÜö=ÏåfÎÖ` +þÄi;iÈPÇ5øH¿– 8Ÿþ‡ãºQCƦøÜ›¢c“Ã&Èq”‹‰PÞŒ‡¦OÞعþÌäî­Òâez^‹…iûGÁœ¾çåpa ¬¦úc ÈÉ…%-"Ý1hÑ;éX~ŠäSGNèþáŽá­×¬±ÅM±´)×dÊ„Ê´Ü° òáÃÀ8z|Üs\ƒiì,ø+=UYœÜï=fgFû_!abÜïjQ“ +D´ngSvšˆt<á6*–„‚ÑQ·/¬ƒüBÄ # þ<úÇUõóƒéM•–åÜäÆcZ—Æ%x¥J¼¹“š:£Ô–99·{þáÆÒã¥ü|sýfeùºÚÞ/Ï_*.\&¢­ãzÌmz¸´ÙÃ÷½4s°%2܉T·¼¡âa a½ÇNFÀ6€Ýµy +“ÆåþîH·ƒÍ%º(›ÄùD¦³‘›ÙÏLŸŽÖ—[Ë+sçh¥Æª­Tg7ÝÙÉMž¤’“:">†ˆ±V$¿4 ÃŽM ˜X¢ã“T¤ã‹t¼ÁÚ =®u\T Š¦HÈÎççïó] Cù…­‹×… +WÆlŒ—I¥£6wçO?¸u÷óÙ¹ Ýq'-¤;L²§Gƒcvÿá Ï™²àP"“WÑö?Èš¼¡ƒG‹½¡F°°<{ú¾ ¿¾qý%¾´6dc=BÎâ‹é=¡Q;c%bN2E«x° +(:4b…ËRón¶8îà õ¿êÈ¡"u«Ü”PžÙ-ô¶¤ì4›™GBM'_Š ÕÉìì³/5b øýOGÿÿÓÜÁ=qdÌeòãåe£›ýÆáá¯Ý9¢JTbƪ›ðÈQ ©AÂv:30:ª·ø5v^ãà!FY‰¨¦¿a?®¬ d$š´‘a#è‚XÚ`ÒKdlR,o BNçèÛEð®6 µ˜„g&¬ô„•Ñ;8ˆ-:;«³ùÁ—~cÈrhÈ +‰•4ú'®XOèÐaˆWDód¤FG+b¢–inBǸduá|uåR¢»MÇk®@ÌBEŒÞþédŒ\và!­…„äî‹ÌÈåS‰öAyáKÿðg —D ÖѵQWÀDÄÉH‡Q'Ñ`¢D¾»™m®;ÉÝÃÅJsíë .ŸxÿÞIvöÈ`ùôþ}—î{“²&T\*Ìœ^½ðpgãnDª¢­3÷:HEç˜h;”›‚• «X°9 ÇGL^„Ž¡oæÇ\zD’K«ÉÉ=ð6—±zƒRª5nóZ}­Ù³Ot÷.®Ü“œ>ppù;†v,²rö1'—¼sÌ>h¦´(ÌB\d¤r2RÝ;2æ<|B7aÆœýÏ[ìÃVzÄæ„;Ø"£Î;…wÕ»Í(;¨ë7a&¢N6ç ×+—W.?¥ƒ±I³G ’á +kRj/]òç×ì´ƒŒ¨Å$3¡œ2Ÿ#¥¸>H{lÌzÇ Ý‘aÓ¡!Ó€ÖUßÿö@›ßà]` ½!÷ +Y*Zó3Áâ|¼}ÒŸœD…¼I­8hÑIC¼•q! /c”º NQYg§QJ±â¡Q„ÇØ´›IC-˜=a,E©ã.(vˆ!@ž ÁCFŸÆ!`B1œŸg"U›Wtâb š§cP)½ôÌniá ^]‰¦Ö.E˳ŒOö”Ú¶9» W6)uÎì…ÐñI%/Ÿ6ã Mdß< J§ Ü!¼½Ÿ/‚‡F _;¡1¸Y6ÖÓ‹±Úncó^*RcB…ékô40À¸6|µ¹aÒ‚ÚUÇôø †s%¯X±øîµµŽÙhLÈâ] .ÝŒ Ö\tLcgtàô<‚—€ŠsSvt.l¶s ¤õvÔHBü?: ³&Ùã†Uh¸uZÊKÆч¦Ü4)å(€lBœÕóR¿aȒцoæZ[1Ftì°.wœ©éÙE!ÚŤ´WÐÍLmuÒE=;ê™ôðNÌ Ã ¸RNCŽÕK3;“njÜ9|°)­ËK—{/„Kë ÷KÝ͹­›“Î+¦^švSnDÂÅ$ȦTc™Ts Ò ÝàmhµÍìòÙõl~íÂ÷ú%Õ‡B¨Ò”2«‰ÆÖÞÍw¶n¼KÇfMÀ~2J«e  4|- ¹tÖ˜.Ræ|ÜI êÔ¤—0åFÝ’Õ§Šñ.©¦¼4€èIv„„ÕÏA,x@hP,PÑ©+Ù~¼±¡”æµòr¬³/WéD—ŠV‹ÝýÁ΋|¼=á,ÍMÄq1ˆÕ «  Ú"(ú£NrÔEOBœÖ]P×Õx¥4»)'[ÙÀ½[ÑúŠÙXW*ëX´ëã3ªY[ܸ:³qßËÄN;1k€ƒù4¥×P9Çèñ֌šK”ætdxS £¡:®‚êYœô‰ “zÂE‚•wÔA WÂÇ#°œ&#%&Z͵֟¾÷Ãþæïë+ÈpQ+.¨Å¥âÜQºµUŸ9Û[<Œ‚h”øhÔùXŠS|b>66|BBËq£6òø¸ïب{Ô +OØ×G¥X»2{Ð]»:æ¥í˜æaâN:J™õhuÓ¬mó±6«êÌvº¾æ@«Ÿ÷õ¦ãà`/ôS¥ùS¾‘i8|‚öàú˜:ïÁTBÊʉ¶# y‰HA/«¹7SW"´)g+½íúÜYà*Šðq?eØ}<„†€õ…0EK·Q.zzòbŠŸ1I½Ì&:Bz|ŸÔbÙÆþŇÀ®ãZ3V;Œ×äxÏÈΩéÙ€˜;iÁY%Ÿ*-‹{lÜ3I2CGæ:ëZ›/ÐF딧ռ-Û}ì_´~cÂ{ÚÅ[ƒ˜/(™9wÓº5(\Ð@ÊøÁâJ^¨ w‹W09¥dgÅdgvóZi»0‰dæÖ/™…Y@CLs õ’ LÌB¨æÊ#–Àèp9>?è®ÓÓþk å5 é…Åp~@©Ùù3· ½=/o±FröB~áh”o÷Ö®f€Ù!£çÂÙFûZ úÔ´ÿ¯Yl€ÅK<;j;5 ïÛcð™“kõ +ûCûœÅï&¨˜>!Yß”b K#V aâB¸4éÄOŽ{ÑéñRÑ+2f N»ÀŒ)êÈI +ìJÑRŒQÓ˜”VÓ3çn¿½´ÿض›¦µ¨éfeR~BƸȴU/È%á¡BR.‡’s.5é$èP\‹U€Ãù‹V ÌÙ|Òi 2jCÇ\„u(•ÒÉIï¸FņрäB”¼OLùù$¦–AêÅš[B¬´|p·³q=Óڪ̴6®W–/ëåU\ÉÅJ.Z¶úY/®N{YP;&ìH4H9'š àÇrí]h©%à +¨”‰Ö×Ͻ¸yã­ÒÜáù›¯žð¾”íû…4,æƒB– +7”ìrªw¥¸rOÊ/r&ßÙ‹·¶ÅT`‹g¸Ú­êÀLÑìû™Ô7GÝßqŸ°áµƒW¤’e¸#ª„K9³ºbnL6ò³ëw¾þñÆ¥"õ¯ƒ–;÷{Ûw³ì¡5)5[™;L7ÖC‰V¬8Ã(Éi7¤LDÌ:`yÂû8 IvX÷àF€I‚ë~lÄ5f­šÑJbl U|V×ûëÂÙ,™J¡ßؼÕ?û@ÂÄìE:Þ³B‰Ü`ûÊSˆ‹Œ8Q›Ÿ"M/aN9Y/¢óJ¡38;8sëÙ×3'­ 0‚lRL¨H\JPÔÒÕå¹37/{€ˆIÙ D„¤ŸÐ%³†ˆÉ1;‚³C: QÓÚá—Æm(1,{ÐÉq‡p)aõ² Ò’ÕùÞ&@•ËZy-ÓÙJ…ùظ1t°~ÙJ€‹vsn5)àAC¿à>£4„nqaã6äôTe£¸˜øæ‰éoŸøëcÇNÛFlˆñjœR®±Nw§§fíhS t¬-ç´ÊF~p%×ÛëÏm}ÿ'ÿ°|p0# !£²¬¥ +©…`(gGd‚÷W¯¹©ès㎑)§ÅN w·A€‘#eZÍ€ºïcb„Z33ÙÞ™òàlº¾tùöËçî¾&¦ZˆRˆ”Ï„‹ëÙîQoûQ}åVuá²è陵³w¨HÚŠñnÚ„†ë‰ùØ mtXdÒ'ƒƨ/4æ ³`§$à,5·"gi¥°¾{§Òßa¢e9;\Î%3{±±vwùðå{ßÍÌä;››ʹE1Ñæ£ LÎù‡[±çP±ìȵ1fGBnÂ`Ã=Áœ€ï%Í)Ðç°FJ…1qlÒL&D¥AQv€jH™_›ð6¦e) úÊM'³ÝY»QœËT—Óµù€`’jJ‰7lÃ=P;¶ødgPGéx¾¶Vîî…œAÂC–¡?I z Ñ*~.Uëï7@'dɉš«3úp/>V‡¥,ÌÄ3åA¶¶<éB'¨3()JgPš°aSNLU¢™¶ ¢Þ¬ v–,,Vƒ¡Š‡Nέ_ýø‡¿Jdg§Ü pw˜a´îzÓ>ÜÔƒäôReá‚šjO»pNVÔê¦ Xö¡Š¤ea6âF4BÌXÑ¿Ñ5æ›òp>TsxE/†ÙD8Ý»òàíiãçc˜š§ãm¹¸hÔ7cÕÅþÒþÃ×?-ÍîÎ÷Îç/jÅ%)=éMËÐBpšQ¹ýèS2Zû«£ÇF,Gmø”‡ÂNŠ‰ZcaëâCÖ¬ùBô.„²£2_ì$;kA9©æí=&Ú +M0µ(Äš´^S“³ÙÖc¤õ|`Ž »ˆ°‡6&ò8Ä£R1Ún:îãÓ£^ñ™ÉÀ¤_rR1.ÞCCE*”[ܼQ™Ýác5¥°ê–¯ÌlÝÛ¸ð¸¶vY-η—νþ½¯¸dÏIEq½B…«ÀXŠÉù¯wåžt ^®³7Ü3åëeí_¯jñ…>O(Õ'5æÂA}16|ú<Ü&» v®ž3댒iÌî%òËÙòÌNmþ,.ÙП‹ƒ¨`õ€Í)H$ëD"n8ìò +~< @ï´jÏ… ãnâ´“fb½âÒ5³µ+${n&î" jºécÍ Æè³’ Wq§‡dh #Vˆ¶x(ðŠQ&€ôë™k~*ÂéE.RT³½ææÍþîƒÁîóKg_X>|Xï­"tÂt”Oz1ÕîÙä2^ QlBItà‡bµi'• nX]”Ó€|9 jÌ +£B^M/ê 2úI+v|,`÷ŠH +rYÞìRZY7}”ÇÏF€Ï×Ë ÕË‹‡_¬nÞ„xHn}å*mä,çýB• „ ÊA¥>رaò7OLYœ¤ Û|²ÅËÚü¬ |{¡¹xö¬¤ldX-¯ò©®^ZÈ.EºûX¤Êh¹£ƒí.Ló’QL.©ÙÅæ⥙µëáü" x¹Òòæ'ùÙsyÜ6æÄlˆì"cZf.ß=“sNT]ع+¥ºÏLúF\¤“4!6 H 0‘^dêKóÛk—œ”FE%דSM:ZJ·7Öο¸uë]D/G«k±Ö*¹É¨TÒt1ify5VYµ£òñ)? +®cböëV“$rÊÎœîc.›öLù(?•2­z&ÞÞO´Ïz¨X,;ûàé'—Ÿ‚-$ji^. ÄÔ Ðm¡;™Ó«Å™óx¨<òµo·yy€ ÇÆý~:ucv÷ÒÝ7°áͱ0ëPfÇÍf³kÖ·g÷ÉéNgñðèö›ÅÙ}[Pu€ŒÃÍáUtá†Ïû\A>[P˜ñ'­Ä”?ä¤âRz1ÝÜd»¹½þþýµ«¯®^}eáÜ bzƆix(›jž)΃ù8gTBÔb?mNº¹)g…«›ñ!¡TqQ2êß8n9=éwú;D; ÎÔ¦¼2&åçwî‚êÿ³Ÿ¶À'³fWNÜdü[§½Öï&U7¥ÂRœ‰×€uomßË/^#}2ZW‹‹ÉîpIdà÷¾ ´)o‚Ä÷pæ(4\¿×æ\iÒI>;ܾ +sâRwÓ ¦L6VåRu¿l†Ë õ›ñöN²y&?{élsÑðÏÐpK‰TK. ìÄðFº–+·×Î^}IŒ·žqüA‡« ú8ñ¨›Jøù„QœGB™Ó>éVDƒè@~½@ûÓ¥ÞÒÖùÊ`ËC¨±æ™ÎöóKGOö_h¬\¬,)ù~$Õ~òÁß^zò© {éX¶wØÝ|j¥šçÄdߎ©€F#é­& þØq|š÷Èv4‹‘ÂÂÁͧ¼í£Ã>ÞŠk.Iõlg;ß;JÍ\ò…Š>Ú0j+@«½|b8ÝžO;qÝEDŠƒKÃíü ¢Í ˜0 7ªƒ + J0€ô 6K}7±B´QK´wŠsævî´V¯\jé‹×_úî_;눇*„R!µº—NXƒ +0œ”’‡¹Øˆ³EJ¯€¾ÂõÄpYžGñêêÂêÑëï}>»q¹»}{öÜãüê­ÜÒõîî‹ó{÷÷î&[gÒõ•Ï¿üý'ù]W¸HËk8êxGŠÔn‡™pÅŽH'&¼ÇG]ß8f91ê é¦Ól|–1ñÊ +gT1­DÇ»d´MÇgøÌ‚–¨HÑ(/€Œ`cµx{«´rµ½}·µó ºy/Ú=äÒ}#;Ø9ÿxùà!ª0­Ž*Ù¢Ëddn¸½»ƒ|n*0=|R@ر)/ëÄÃ7\yƨ,…+óéÖòÂÁý…Ãg®¾ÜÛº™èì`FÃË%ñ¯ïÁB„fõ Ç›‘z=?s®²p%RZEÕâ´_ð€ºƒ©e¼)ÈHGL¯FJ›L´>îã§|\¨™ôÒ€ùx+Z^L5VÀÅDÌTk£Ð?›ëí„‹Kf}ݬ­qf#’jnÞžÙ¼à¡ÂßâõáR6‰.n wuâ>4tæð^²²4åA s ˆÎ‚v¬4îæÓÚÜ.À"TÎI…%½~¦¼xuÿÖ»Wžü ½ýb@Ì—ËgŽî¡4ˆ±xõLiñv}íaª{UJõ‚0eÿâ‹éÆÖ 6 +*¬‡…˜ä°°VÖS3G~6Yj­7ûàA>…‡«¤ÑˆUV@áÈÌê¹>0„ñ​TO;è“ÓèÊ¥"ëÉÉ9¢NzhÖ¨¦ºÃšŽŠDÊ`ZÎCib´šª¯°áBuéâÚÕ×2ýÃhu…Š”}tg6.¾ôàÍ/ºkWƒ|FŒÏárÉ”>z8Âa +~n<8b¥C©¹ õǦž› ŒÛ «‡wcQL©B GðˆhÔÁ·L÷矮ßx¯¼z3È'³Áîƒý[ï´—ÎÜ~£µy-R_ª¬]M/^QëÛJni°ygÿú›ÍÕ+€ÚäÌ|²½cÖ6ÙÔ"ÄfFíø³£®“þ cúéˆ-Pˆ pq\/Q‘ŠZZ—æWÎÞÝ¿ó†VîÇÛ«ÅÅóÃå‰ê[™Þ¥êÒXcÛM…!jøX„ŸèŠ™&1/dV£ä³.\Ÿô1A! 퀰„B€–³|æ’É!P<…ÉI5?(Í_j¬].Ä?­ç+ƒ}`aƒ¢®¬´7ïl]{sáèåpmMH5ý¼NȱÞÚ.Zðr:©¢jt.gP6ž*Ï«É–Ó=0ܜŅG]¸¡ç©Æ¨#ÇF=A6‡‰Ö¸h%ÕZooÞ0ê^Æ\Y;÷ñû²Y +²f±)7{)Qß‘S‹S~aÔ‰ûqýèÊãb{ëÔp“Y- äøĬQ=“í_Lvp!qéæËg¯>Þ……‰46îîÝù`ýÆûjuËED”þÆ?Xܺ:Ÿ›B,EH.hÅM,T9iAÜH¨<³›hm8Hªy©(4*RSóK¡ì<­fn¿zíÅo«©ž‡ÓÃ[ñƒD}s°sûàî{•Å+¸ZC¥ï¤KË+/*ÙÞ„Ÿ·£:£UH)8×1>\5pþJÖà€&ÐF5ÖÞNõÛ›·êëWÄt³¿uµ¼|1ÚÞ6Ú;R~‰4[ÃQÍÉ6¨\Raà` ¿’õH@0zó¬G­[ð˜O*fK-­Cy¦$ÚÀ)}ë4tr +v !RÍ&¼ëDç%Û^R†0{€$t÷­ówÞìmÞˆ•³æ°~Buj¸ ›†DL¥éÚj$ןôPÇÆ<“""À¶Ù(è´ C˜p¶:£¹S¯m´ÏÜœ?ÿR}õr¸¼ +ËåáÍ9yï黥sSA ° &Ü„9íì);a)HG²aÈVv«OFxà¨[l¬ËÆg0µ¢'7^xóÒÝ7I9äÒõåÛù¹Ë±úz8×t॓“nÆó¥ÞÈšSÄ8Ekàraca<;굺Ézwã•÷~ZeQ†~ã•NÜHàoRNOyH@+°efZ77®¿3wöauéhneÿÇ_þöâý7øáâW‹É™£HõL¢½?³ó`ûÆ[3· 3»W}‡M÷md4T\IÎœËÌ][¸ðÖÂÅ7êg»ßùâw/çK'eNÔ h +V÷ü{ æ:[‡÷Þ»òø£• ËKW´â"¡ÇvÒF׆ê“^¢L7ªH‡b¢ƒ«E"Ò°£¥UÝ„2¡À›Ñѯ/V¤`“4૱xž×Œ|;ß\ŠUWÄôªÖ©„ Y/®žþziL±ú¥áÆáÓ>Â/"|T%TJøbmàÊF\¸lÄ…2>&Äy5Ó­.u6n±FP'9œÓñõˆ;Ì}x¥¬”êyIØÆÛŠÕ+L{h,:ˆpº³ÝÙ¼^š?R K)7åå¥pYOuLŒR A6… ÉlabÚŽÈÁáÔbÂI»aõĘÿø)ϱӮ å'ô ©rxþgžsØ fÂI|kÄu|Ò?â¢&!Öâ¦(%d  ——#• Z2âÀµ×Kƒƒdw?”cÃE=ÕŠÕI-†Ëš+1‘R´ºoíÖ³Á2ˆa>Ò`ÕÓVtÜŽƒ& +†¹„Íǃ;=íD ÊA3£¬•–²ÝÝöÊÅù£Ã›ºkG…Ù½å Of÷m^ycñìó™Ö†¯ª©v®±¼}é¡”™Ñ‹KõÕký; âÍ %7Ã%ªñÂÌ廯Ÿ½ýª›6CÙE>Ù×Kë G¯Ž^M66:sÛŸ|ñ󣯅r3‰æ:°ÛµÕó‡÷ß~õ{¿xÿGÿøÒ‡_î^zé½ïþíÝ×¾§UV´òŠ”[Š5öZë÷6¯½?³÷ÓjŒ’«ÎÏÏÛÕ +‡BÂ˧„Üryé–ZX ò±ÊÌ£…X'”Ÿc“m`&i£Yì­]z g¥XIN6 £Qè_¬,ß6}\8!5`b]{Päõ¬Ÿ‰ÚêD"_oÎ÷p˜œO5·)­äÀ5D)6ÖnçæÎñ©oSFÙM W¡hÕ‰p0!Õ .Ñ‘’¯“Z”دí›Éú +F:R÷àºb= š„ëT—ž7kN2âÀ4”2ƒxó€ŽvðPž–R´œ‚ù„hÖm~iÔN¡BJŠ·H­ +(ØH¦Ÿ€( 21e¸ð‘IDx82Ð'¢\üsÜIž²¢#.Ɔ†}l|¸cŽœ¥Û©ö¦—‰›©J´8Cj-Û•3s€’B©Y³´l”‰Éj1!^‚SLöäü`Càs¹N "Ù¹IÀþ>ÞGhnT¶úøSS¾ãcn>°1;çîÜúa¡¿²L¼k5Do•WV/¿»àc¢ço¾œïnMøD€ÕS~bRˆ\.Ì\]4Ù½îæ-¨éî6­Al‚ WØx3ÕÛÁÂe;Ì‹f øIJ˃kÑaXʈÉvmåÚ…'?(/œiJÏs8í.a÷KÀ¢x@:Û¤V¤•L$7š“™½$f—PÉK¦®qæÍžÖ2¨™^¸8 ÂU!–€0,ô˜ýlbÒÃâæð¤;mÃÇ]ô8·‰À±qÿp‡ ?>:Ȩš ¥\_Hv¹XÛë’žFDsÊKùØ0¡å#¥³±cÔ·i³ÎêÙh®%&ëNTTR½ôÌQ¢}6Ó;G¨%hDO:0Õ¨èñšÍKŸš‚NNBcv°0&ä.CŠÙBw;(Æi-§¤ÛÉî–™¡Œè“t÷•ãVÔ€ÐjÑê™h}w¸æm‚""';˜V2ë!¢¸œ•-…QYoõóãNãcÎ oñÑ>:Óº¤˜ñd9Yè2jRŽd‹­…êüF¡·`–g„DUÊuŒÚb¶»ÒZ?0ÔìîÝy³uæ&èIÉ(ãBÌGÈ^˜Ž§jË»7“ÍUÀª¡ÄL4·¨¦g9³íe¢î !„´µ½‹Æĵ†’_Ítúû/,ž{±»u[ËÏs¡Ä­{O¾üíX<¸‡he£±›¹TÙ~|îá÷–ŸÏuVÕDáÅ7>\>x` †F4ŸZˆ¶Î–®ž¹ö~´²b¤Ú·^xïðþ{~iQí 1ÃõÙí;wÞߺÿ¡RZÍ7×î¾ñƒtkÓ‡˜ 9Û;Z8zrîùê+7åôüÙk¯Å+«Ç&üÏMø'ÜœNár1QYí¬ß`Õüù«/¼óéÏH¥€èM!·Â§åüÚÂù×7n~'Ý9òÑKwߺøàm=7úü”™å€•“¢Âí“VzÔFlîÞ<í%',ã9ë7NXþòYÛ3£~<Ï*„G€÷+ÏîPz™‹µ­8×Ë73"䀬 Å+<ä!TXL‰éY£¶Yž;œÝ¹#ç>JK”—”ÜÀA§YMû¥q7có‹„`òjÚdln˜`›†(ŸôKYçpŠ_Î/dl° F+Fy!·p~þè¥îÞýâÊM½²5åc TͪXY:HÂû‚ +*Ä*«h¨à¥L#; NɉJ<<á¸îD@"‚V•Ý Kfe¤<¯ >é‚• ©GRM³0ƒŠÆ”Aø(¡føxµºtn~ÿNgýŠ’j¹®š ma‚çI! T‚ cœañ²§m¨óëG¦(ÍGè@ØP†àL”5Á"¤©P>@G¬I p»M5«µ|k U†O3«‹—2½Ýp¡ÇFr¬– E’ª‘ÑÇœ%gY½„I)?v#¢;À1RJÏöi³c ªáâŠQ]—“ÝúâùîÖTwfL¡µ¶3Vœ‡ÙD´´.ÎË©c”hÂ4f¸®W|ĆۃJ€Ï*é…paUˆ¶))ªñ\µ_ío7è-­¶•\Éö/DËË@ùQ1ãâüú…Áö ເ”€©æ‡·a9­4í"§A5 —n=xûîã÷ì°|l"8꧱XP­µm£¼Šä^ûàó[Þ™rÇG½ÓÌ¿Ù<,mÜb‡(J0L+@…h bBÍö€÷+ÏígZë°˜àäøìòa¦±lGB<ÌDj˜œÃ¥¤f-.dÒæõøPVÝ>¿;€r*Ñ;†+xÏbjçNkeï¶^˜cc5­° Ö||Á1FgCI‡—vú¸ E™%å”dp”K‰ZIPr¥úJg岓 {ÃÇ.8dñ0ÃsæxinÚõbãvÒGFPÀr“â 0Òz"e5ÝN··ô⪔ì—fÏé¹y/©—Û™ú²# ôàD'lHÜÏY½ NÉê +ÈZR1k“.à$eÛÂjÀ|ÚE€‡Î¤„ˆÙPjFK´Q> •–°áè)àyHŒÑ‚”¤u”3€gp"ê¨ãkÀ¡Ô){Ðâ"¬üÁ÷y$õJ€OÛül¬<—ú.TDù(gÉPš×ój´À†âvˆdäd,ßñÀ´+@ø)À†)1j4ôƒÍËÇëB‡C¹€¯xa‘—¢$oz1Õƒ®Úå¢uDH"âpF$Ê%(9-Eò©ZÝøȤ7¼:91šð[J°4§FãµLyDøбÛˆLÁ¡R@Hûè(Â)+f«]%V:>Î KÏ—æ/67ïÖV¯:R€ÐP&âÃÅ.ú`ØBoÐzNM·ÔT —¢šõÊè΀ˆq Ð^q~ZŸr¢Lò™BqbÆpŠ—QNWsm\ÏC´áÁYK/¯ŸÛ>O0r UÂR¾{^ϯÓ sNˆ‚`ÉOj"zQf TÌ0‘&)åý¨¢hÙíí+W¾ë¡u;"x)݃(>`zIp¨7>iGß³z,»q݇¬~Á‰È¤”'Ñ ­¦jKñÚJ¸°¨frb–TŠ^BWcu%Ñq姣zv.ZÚ‚å-‡_·ø옗£´æ´ãø˜gÊÃÂ\“Ê~&åF#€Å¹9"”FÅKÅ꺰0DÇ€1ÂáêØ”ßå¥!ÀÎvø´% ‰IŽƒ©H€ MXý¡pÉLÏúqÝ Ë^Lƒ™8%WþSKקÜPQZìf’B &·Ÿpzxß\Õîôx¼ ©Àl áã\öPÀèNØ1‡Ÿ?vÚ9n}¨j‡X\/BõE»‡ö"RunWÐó.?ƒññ  ÒQ”‹›öL¸¦íBh£Ó¾QKÐT‚DD‹—U³((Ù0ø×'¬ÇF=Ï{džÓ`±)΄¢¤3â$Cy>Z“ëñÑÚ”›°û¨kà™SSNñ‘!*B$W›3 =É,ûIÕá'&~›—AyP ¢R‰eºÙ™ÝSlÔêrM»aŒ¡Y‰fA×’BKÚ‚#Ç+Í…T¾þðnÊ´B±2 qˆŠŒÚq»uNÉJ‘’ŸT,nÌN? +§œ”Óµh1_KUg1&ŠfA.Ûø •@@>;â³ xØ´cö)Ÿè&ã„ZÌN(9#ÅjÂËZª³tÈEÀűF=œ™MÕV•äŒ‡[½4ÆGqÑŽ¬ƒ]ô‚í>bÜâ±8|AL€‚¬+À‚Æ•Ôi%"Á K pˆfh¡6Õìm{€gðóvˆ±{ˆ‘I·ÓÏ€D\/BJL8Ðc£Ži{pf~wã옎L;Q‡‡„ü<'%|¨äED›‡™„ü¸LQÐ@ŸýàÁ…ÏMy¿uÊú×ÏMu‚ìÃYœSµplëܵP¬4é!íÁG騘ƕrOOá˜;{7^üàﬨüÏŒžµ»ý +Å%=¥ÅsœÞ>¼6غì@ø‹ßêe,ÚÑ£“¢Î…"‘x!Q^d”Ê™Af˜ª¤ PŠdDAIA(çàRŠž¨£å8=ápxüšªæ2‰B>-ƒš_Ÿý2j%Ì52åŸúÙååO¹ž9>ù̳“6Ä +”˜öøXŠÑÂfΈ¥p„´7(€x^kÜxö9Ës§íSÝ…SBÂÊÓVÿè$4eG Sf€JؽÂÉ1×s§­œ’Aèð©q׸%huÓk(áF†ínvtv{¹avŒCãvÄâÉ[œA‚áI†äE2›ŽV»-L<¡˜él¥Nf11ä +Á€1³•Žži<;ê<= ¹|@­’áp‚¹R!=·ºª¥óÓ>t܉¸` e4ZÖ"ñh"›HdbKKs7î>_j/ŽX ÓÓîÓ“‚9ž×uU”$¯? ªr"eyÒîœv{$ŒÅB¹¼¹»½¼µ¿Ù^ŸK×Òª4ÍGÉ@†‡»ýÚ0邬)UÔdňœ!êE½ÀöLYýà'R…j®=ˇ“±\ åÃ~œ÷c‚ÃKžœð|ã¤Í”ƒljd:ºÎæ‚E%V¬Ïv–… +dÒû U +ƒÜ)¡x72µ91Zà#2”²xO…ÉB‰œ¨“|ÄŠ0¥“rŽLŽñ •Œ‡µp„¥" „$š†ÌÜbâ*R^˜‡|t•`BóD—÷!2J†}AÎåvyÜv·Û)Ër5ïWSƒÊÅýÙs»ƒ‡/ÜZß\4"a„A0jAEƧõÌøñ‡ÍE ±ÙüA?EŒ®hª¢HRÈÀÝ@ˆydiCh†ÃI‘åcJ¸è +0'ÇÏ?öœud®q䟴’ÇNûž9å91ævv7ewÝ^8šÊP6Ó²’€¼Àó“8§Åä´>>b²Ã"ø¼˜Ûi' H!¥Œ8ÓJ ækÅZ"™ÕêÕøÙõöÕók«ëÝrÙ,âF½ö/_½ò¿ÿÇoôñƒÇ·ÖÎm·R©Dá}VÒTÊi¡iìÌÅgòÄ\™©g˜ùvb±—^žI]Øj¾ñÂþïû7¿úõß}çáý›Ûg6ç€DOÛmó ÒÉI×3'F<6K˜Ä$8© aÎæÝͼÒoÄ@jlÏÅžÜß}ùáù·ö>xíêO¾xïÅnJ±Ùù¹ÎòÙÙí|´âs;‰Šh5JîÎ÷Û·öj{3êà ­_|ñø«/ž¾ywí½û‹ÿð“§ÿþÏŸýù÷þô;—þü«§?ýøÚþRZeý^7dµù tJÁ.ƒóôóÌ3¹ï¿}þ«<úäí˯ßéôÒÊß}çÒúôg]ûéûçþü›Wþô“ÛoßiÞÚ¯lΗ’1=•J…ô”ɱ,•‚õ8¶T¯¬e_¾¶ðüaýÁ¹êçï^þí—oþùO?úý/¿ý›/üÏ?¾ûÿý?úã¯>|pÔú䕽_~ñâkvã†jµOOúì^šd/äBÌg“wŸžÍ³çWrGk¥í¾y¸”¼aö³o?ÿΣƒwž\{üü͘÷ \•8‚Èjl7MmÔùë+Æ;7f¾ÿú…Ï^?ÿóîýÇŸ½ùÿþùç¿ÿÅ{ þø·ÿü»ï|øúÕA1nÈ,'éF’¡È — r>ô„+KÆ‹ûùOŸœùù'÷¾x÷Òǯì~ùíKÿéË'ÿó¿óo¿{÷w?¼÷_ÜüÍç·^¼ºœ‡8ž&ÄæòûŸPô\Xd¸¶Ì×.ÞºZûìåÕ¿ÿÞ•ÿñû·þôÕ+?þàÂï>¿ö¯?ô§Ÿ<øé{göþÞ¯>>ÿ÷ö/m•J¹„ ä‘ŸBƒøb¯ºÒI-ÕõK+ñÌÿÝûç>yyí£—7ÿðÓWýÅÃï¿yîoßØû¿ÿé£ÿóß¿ú×ß¼õ‡/nÿ·ß¿õƒw/®õâ(왘´{‚Á ¥r\/ªþšî>?+ÜÙJÝÚJ¾p¡öî «_¼}öã§?ÿäÖý§ÏþáÇOþøå+ÿþ‡ú½û;+õ^.Qêy 5n&ò1¥™d7ª4øø»7{¿üðòß~ëoì}úÚîO?ºùo¿{ïWŸÝùâͽ¯>ºò_~ýÆï>¹öÉýÖ»×Ë»=%X†Ÿ˜t?6á³Û ÖÓMÂg;òå•Äƒ£ú›w–þ½ûÿúë7ÿãÏ^þ§Ÿ¼ôO_>þêÃ+_}pø£WWÞ¼Z=š4’t4„ãHÃ8‰˜¥f£½ØÍw³|?CÍ +oÝšùüõ³?ùöÅpîWŸßø§Ÿ½üÏ?åןÝúõ·Ïþóoü—_¼øûÞüä¥Ák²÷ÏÖŠé0äg€%&ĸ(kå\´£ r¿¹±}°“xz±òÉÓÍßÿèÁ¯?»þ˯þ¯ÿôùÿúÏ?úô•O߸tïú6I0>˜ö©¸¨Çˆ…"s8«?<[ÿøñÖožÿò½Kÿþ›÷þÏû埾|ùïÞ=zûÞÆú|)ª±$AqQÒ³J8«i ]àR!d®:®oUîïåøêö?üàù?þô½÷_ÜzÿÞà¯lþìÛ—>zº{ë ¹³X­”*!#Ç©Y€H€Å†ÅÌäãñ¤L¶ôÎlb.yq)ùúÕöß9úÕg¾xû⧯ì½{óñù™Gg×6 +ËH9 ¬ãòÓŒ\ÔÍK‹é¨–Ô˜ŒJJÊ­ÚÇÖ~òÎÙß~~óïøð?~ù_õî/>¾ñËïýù«ÇÿþËW~ûݳŸ=¬=ØÏÏe†ìD5*ÉLO’M•%ʪª#s1ÿ•yåÑQåÉ¥æw^Xÿ¯ÿøÞŸ÷Î~ò¿üêµÿÇ?ÿÞŸl¿yu¾—QôÁG:’/¶eAˆ†è•V²$ú)x§ÉßÚÈ=¾8ûà°sãLùíý_rëçÝùäñöwŸ\œ=7ÈÌÕ02´ˆ’p2£^¥ +Sž†I­¶ÛƒÒ™^îÂJåÞÙúË—úO¯-¿|uy¯ÝïDv»±¹ +ÈuàèxšæçgCIZJIZNÅóéL6ªft~©–ÜŸ+ÌÆŸ\ì|üÒêo>¾ð¯¿xòÓo_ùïÜí?ÚNÞ]Ž>8S\*…T" N(Þƒ™˜Õ…`Š@:å+êÄr%´×îl&^<[|ÿîà?yô¿ÿüýýõk¿ûâÅï>::\¬¶‹)`z¨êC9¿BýÂI](š|;ZªEÏ.ŽVŠ·wß~þ̇OŸÞ\ººUïyb»Ë1eƒœA!š™É76tOÂ"E•“ÆîÊÜù½åVš>èÏvßùúÕ½¹ «ðÙÍ™d#6uAW5œº±ˆ‡0!C«yJÉÅ2M]7YQ*c¨C.˜âb#qv¡ra½}nµ¾Õ/ôJén>ÝLÇL]$)Ô„ÝÏX¼ΧaBq¹|Ë…ùý*öò¹Õ^ù`>}}=ýîÝ…/Þ<øî ë?~ïêß¹òƒ§»Ÿ=Úø7/wÎ/˜a!û!šW݈‚²q˜ŽÚ Ò¹xª–NÄ8oÃD¶Úáss±+ËÉÏ^Þþ·¿ÿÎþÝû_}rçó7.½xeñ™ڠÔª gÕDåã(oøPžÂÕB-®ð)ÆÄŒÊ"R7k§Ã³iáp½¶=»?(Õ£\>2C!‘áQ”µAܸ>9ŒZ3%)Œ ü>Eba=›L’ÉRÂLª\LbRªP0eªx0*É¥Rz}À`R¼Ð9 Óî&|~RàBÙTi®¿9×”£ÊB)riµ²Z›/ìÌdWÊúj%<(Dæ +fA]“ã6«BTR.{ñÈÉqè[ǧÆ'Oa˜„"–ÍPZFºia±:?Ÿxreðêõå»{½í^Åd¥•HA-,çúWp> ðœä9A“CÏË¡V.s)# ¥M)¬°Š"Hª†q2DËlÔ{0•Ñrˆ›€(,3b,4|–WHe+ˆßkˆl X&««QŽYFðxò§Ÿ™tãÂÇ$#Å5£²ŽË!œ'¸0Šó!5D8&’d4›KÝîj½>0"1€^ ÕHÑå'Ž[§¼4Ĥ0µÁ†ëR¤Š3áÑqÛø¤#ÀÛbš–Ô5# —³Ñ¹Vúìre½ß_(,w¹v6ÒÌÄò±¨ +µX½Ã¹í§È3c®Q'…ˆ ‹—sÕµt®Ë1Œ&âyƒO‡ð”„l´s.ï?ãüÁÆâ|½jª2MA”À¥¸—2!*:ùÄL¶w!Û>Jfç9>Òﯜ¿‹ ¼Õâ#)%ΤR•\¾‘ˆåyV…ܤ?š˜†OŽùÆí”Ùá°- úH“ e\Î`À C>|†L9QàÌÝAуČ\ ÆE›òùr.?O‰‰ Á¸m…Ò}[0ô“v›‡‰ÎJ´Ê‡›(EPDZ¥Xó;¡ˆšˆ'ªj(ŠÃ4†‡PR¶£'F=>2Šñ™)'õ—ßÿƳ“cÓÁ RUSÓ“B#0.0bXV8 ãÁƒ…XF“#Z(m³¡\ˆuC%Ý—“ýbÿl(]‡HæM1ÖŒ×ÎåDˆHITâÕîÒ¸>1å€x"Ò3 br@jDÊ2J¾:·O›‰ ê†“2|Úè"‚QºÕ…œw‚L„™­U1©Qi¸PþzÁíIŸ0铧ýr€MŠf]I¶¤h9’nRr¼ÓK>Ú pIR¯2ágTåTWJ45Å„K^6åÄÃn"âÄ ?›ôÑq[Pö‘*˜|¸@+iÞ¨„³³ZªŠ–0B 8YÖœšµy¬Ô‹‡9£+Îø„ì$D?7åvšòK~¾À™];,M¸É ×pM~œ‹¸pIÔSÅ.Âêb8=™ò^*Q1;ª›.í%Ãl¸«œÁÕš:à‡ÐÕL_ÏÆí¤Ý'"|œÑK\¬å¡â6Xsã£×AÏX|⸓EÄb¢¾#%ûl´íãÒcÑîæx)Á+I€ü¸Z –õÚFª³Ê/B\Ê”Ö,v÷H)~:”ê‡ kfeK-nŒ´cVâ¸u ÃICulê´a¢½¾­oK©= žõºü’Å#~ó¤ç¤õó>>§¶¤ÄÀŽÓõ”œvSóaês£p,§Ç½V7  )\æäÔÄ4du`LÃçY¶€<å-AÅE'„ùg-ra%¨ä %=¿~¥8·ï•R¨^ +HYÚ(sf=”ì•ç¬DȎʘ’3=Ÿ”Ÿ…Ø4›ÉuÏm^{Ëln>ç¢lxŒM-+å=:>€å¢ ×-ÃiéQêë§cóqYÆì‹éE:Ú梠K‹6Ds†‡Š¢¡²œÑ +ó¬ÙôóI%=“¨oÒz‰7ê˜V¢â=£u Õw”Òª˜š¡ôbyá*iºp•1†Ûiñ©Y<ÒðÉÅ@¨(Û2w~vûŽOHŽ¸H¬`JÙMš~1 +%e†¢µroŸu†k‰mŸ\ *MÊØÐ(Dǘ>áe¦¼” ±z™Žö©b÷ N¿À‡k„^uS&8ÿHm\#Do!zÓ‚œ0pµr̓‡I¥àĆ‹lûù¦Ury<¨Ÿ´Qˆ°ù1êDB:Néu\)*èœ,*—H½&&f§|’›ŒyÙ\@,ClU†³lNÚðÓVL0‡,§ýœ ÁZ9 UƒJ…Oôh£à“^&R{"¨Yq ré “Z”‹rný9 9îâðP‰ÒË<â¥Ó.<åÄ@œ\Ú…EFTPÊÉ©999ç"Ì1m ê¨Þ$£3R´áAäÓÓð7O»Çm8Ð@g@òÒ ;¬» É(::eÀ¬À•R³BzžI èä (—ž›Ä0£ƒ‡ë‘ü`ãÜ£t÷ŒŽø¤4®on²c¸œ{¼3lSœWó}+¡Œ f`Z3=s)=Ýì‡ËÆêd¤Á§ùÌrP­CBô¿ò¨¸"¤ûvq* º±°ŸIÀRÁM'å̼ZXò ¦‡5!¡€=ЙQ 6¹E7›t"Zµ %{ ½cç“r°ZC´6àzˆ˜–$³.Ä»¤Vuãa zllV+®G*›‘òú´WfŒ›£"]ð[*>…§\‚“L¨ùUD*œvàÇÂ5:1KÅç°pÊjÃPSs^!4Ð/Åì2nt¸ôíÙɛՋkã^–*D§A²€ïSsAPG¨„‡Œ ɾ=žpqÕ{Q Ȧ^ÞÀôÖ”‡™pÑÓ¾È; {Ïœ´~ó”ãY á Ò¬9#¦æ ½>íæ¬>‘Ö@š”]TÌIÇ=L¤í lî'[@üR +W¤Üd¸LÅ:B³..fgö„d{U¨XËj—•¢Íºå$–ÙH]ÉÍÛˆè^&1+å–3sW»»OŠË·Ý|øD¦?³zÙÎÄ-ÀNÉ Tå’‹FëÐèžcâmÉ,‡Ë‹˜Qcbm¢”Ñdâ]½²¡a-/gg/<é<.Ußæ²Ë¹ò½ÐÞšÙ¾3æã¨H-Ñ>HÎ\É.\ÏÑ©$Õübkón¼¹cƒÃza¥·u·¶z­´xµ¿ÿˆÏ.úÄ,òõ®µèÿÏÞ{ýHrfùbï‚ø ¬®v‡C²«ËeVzŸÞ{›&Ò{ŸYÞ›®jßlßä 9äÌË™Y;»‹Õ +ºÒî… Ð›^ô¢ÿG:Ñ«{ ¸T¸¨o’=ÝUiâ|ß9?ñ ¦˜6¿úíøòÇÆÑwöôyAî Rp›õæ«)Š¤>RjçJóÒ<,MæG¨LíÑ#­w-4ÏZG_ /¿ówõiž´÷ÞŠUHŒ +WñÕ=µu¤w/¸ÚIŒöov3ë{‹‹¯­Ç-È+µ¾_ž¿ê'Lý³fq¢XŸ<¶š‡ATÏISC•žÚ¹6GÏøÚiŠk–ºÇW/LÒ¥Õ$¿‘Ó¸X€Ðé³/ÿȺó'ïÿðÿò¿Ö&Wk%B–8o¯~úËᣟÚgß*í³é–ÇBy}5Æä•VZlBþxó—f÷:š7S¸ “"ÍصšQ‚˜M—w•îMeûí§›ÈzË2nŠ)§(/ËVsB3NVR|Sm»ãGÑ‚òwß*!RU»öè1*·1¥E˜¦¼+Ö›»ïÇ7¿¡œ¾ÝÙ¦kl?¤*Ž.äúRôf¼7k¼2{§\yFgF÷ª¶ó®¶ûNïœãÖ(LY9¥®¶p³KÚcÎÛçj§˜½€ ïè¼Ü6ÚG€cbmvbãXíIÞlçòÝñ‹•æ°¼V­ïµßþ ö¯¬Öîöé‹?ÿ»ÿ©}ð$!zTqÛ[¾î3<ÿUmù‘½:£‹éÝŒT)ؽ„Xc½íÑùwÛßØ{Íy;|iÞ9xG—æˆÖÇõýwFÿš¯؃F÷d%G0ÖîíºƒµµŸ–:¨1•ªþõöGO~süì·kP¶¨Æ:‹þÁ7ó‡¿×†/wɘý?þK}z“¤J¬;[\÷þwÿüþÿnûÅï¤ÖIVlªÞöó?êý¬š;ró²8Ó;û~ÿé_6vß’Fgrü²:>ßÌ ®B–v­ÉËÅÃ? O¿Ÿ~%”—˜Ö÷f“t%I—oWlž0•@¿êâåäìkð/Je§4}.ÔùêŽàmãÚ³GGO~õìûxD¤–Õ½²zJëˆt¸1ÊKmÖ™·ÞÂÏW“r sÕÖ¡5¼,Ï×w¾ ƒâÍÈ•îÉøì«P^Y³$¬Zç!W=€Ý¬YAŸ¬§•Rsïå×­—§ÿæ³ðFœyftoº§¿:}û÷À5±‚ùìo¶ã´›`ÊDi?+Ô³B¸Éì?l~{öæ¿Þþµ2{ðä›Þþc®8Tk «{ÒÚyÚ=xÕ=~ëÎnøâ¨1{Ÿ Ê”'PÚ@‚@¬P&Z笺ý‚´½dW™¿n}×¹øÎ;xË”§nc÷èÙÎð$+{Zû¤<{º}ýýÍ»¿ºþÅ?ŽÎ¿¶;GãýçƒÃJm§<¹é(Ïž5¶Ÿmß|wöö/Kã£Áî“ÅÅ·Jëò³ˆÚ„¢œ¥Þ½b‹sÙ›ŽO_s•yZ¨ú^£sÁb×»§¿œ?þ rRkŸÚ“G‹Gßï¼øCeï=QÚ‰qÕ$[QêÛµ'JkSÂ1•}80wòH¨ïæ\Oq˜Ú–¼%_3µ¦q.w˜ƒkgp‘åK9ΩO¯äꜱ;Vï¨uú¾4»)O®½ùo|“<ÀC³iú«|` .œÉS©s Ê¡º|¡µ¢¸ÑÞyÚ;ù ·N´Ö  aŽÜÞùɳßÒö€Ð;Û~ñü7ÿíñ»¿_ßا7ÀP_=ûþÍoÿ9N—òRÃîœôŽ¿êž|Ý9y×:þ[/¾þëí³·(_!õVëèÝôú‡ñå÷í£_ö/~ ‹;¬N›ƒ4[2ºgzÿRéžQer€@Q¬%¤,[ƒÊ"­éjœXOÑ« .'´w)–w4o7†jŸofABMÖ Õ„1Žৼãg¿/öN”““ê ® +ªU;´35ºÞì Ô2gv÷O_TFLjXR*óúüÙÞ£žýÔ9|­w…âŒaÿôCÓr²'Õw¼Ù‹îÑ·Õ×Þò…;¾–ÊóêôdˆÖ>..^8‹§”3©MžÌþ¨uóJ­½ÿÊ›>œœ¼~ðæ§åÃïÍî±\šìœ¼™œ¾f¡7º¸~÷×oÿv÷éO‹Ç?6ö_)•î“׿½~õ»¬PIqåNÅÚ.ä@qö\é\’öÔœ>ÿþìÞÅÒø¡Ú½Ò‡‡Î>üÃòáNçìüÅO“ßP•‰9¹:WdåPî\»“—Íýle‡wzÏ¿ùãôìkÿnG©‰ÙSÜÓåa êÓ'íçÇ?LÏßc΂ñÛRï%¡$å íäê[6•Zitæ-Ÿ¸“Ý/íá5(1?•déuš÷˜Ò¤8{ìí¼ñvßwN]Ýy«4Ž€€ž|ýW¯AûÍ@\ù vÇ7WÅѵÑÚKåÕ×;W_»=@û=©¾guŽëÓËË—¿;|ø«$å*Þöôü«Åãßê£ÿ†÷Ú>_Þ¾yýSmp”! ÿŽ×ÝgÕù#«}¤5OèÊA„òyC,Nr\ypúáèÝߟþÎÝ~Y^>/ÍŸ1•£`Î’ŠóéÑÖe( åK)ªL¨#lŒ3ÏÐÞý™¦\Þ]dùÚZRŒeÎÝeÝ]­} æHŒvAmçÅfŠ.RFÏß@×Ó‚‡=ÌÚàBoÐÅq–ux« RÊꔧ×BeŽÙ?~(4ïGqáZíý7­ýbã `tàÉõî`ï¥Tž0F»wüfzý=ÌÿÎ㟶Ÿü¡sú ¶ºÈIÞàä-®ƒ¤ñäÚœ)ælWFÞô[c²g7n{VŸž¸Ã3¨nº8Š]ox¢7v9ž±Gð’ŒTNK%©¹gö¯ìÁµ;¸°zYÞUJ£G_ýÝáë¿6†ìრ+ Jm)¹£½‹w€­Û8øPÝýÊ™>/ï}-µ¯!‹Â½ÒÚ»zõcmvõy/¨=ߧo¿4‡ÌîY±{Ü_Üüþoÿå›ßýÛ[M Â^¨Ýëñõ‡ïÿ©wõØÕ«g¿ú‹ú_ó›]¦¼#¢rBVŽ[G¿\~ùÇÊòE†-YC£}øqwß6ˆÕ‚ÚåÜy ÐéùoŸ~Wœ,NßÍÆr¥EZhDH˜”gsû¥RÝ–áÑ: œÑèðÍüâgð״ѯO®Üî!¡wÅÎ¥»ø²´|n‡¦éR†.–F—à1ƒ>ZÐHkÌ7ÏíÉ+{ü„´†¹ÑÙ¼ýèÀ&«i!JX„=);,ö/Ýî©RžGò2&Ø¥þ)*¶B9²h=%‡Q[•ÑÓæò=_\TG—]‰Ì8^ +äôQæË»vÿ•: ˜ùÊ ê.I»`äaæ™â‚¯äµ~J¨”šPÅ(“-ŽJÓ{xiv.@Õ¾"Êó8m[ƒ3¥s£‚viF»À=¥v`u/Àªç¹b{çYkï…;º”›‡te–ÕšˆÞu‡€åór³ 4ùò\,ÏËýÓêäÂè† ƒÒVg‘]άËÞ¼Luù–v&„5)x{ly%¾Ôs&íý—Ó«ïûgßD=…«ji88~åûVÖß#‚±g­Ýgƒgíýç ‘£/y»€ÕëiªÀîí?ú (£} ü?ÜÈðzã×Á—f]­¹Sô—çO¿-÷S\Uiœi­+¥v6,CÁššÍãÉ黿ÈðÕŒÐÔË{¿0ÇÏäÆ‘Ò:ÅÌ1öýëoÓ+°ÿ)¾ŽÃÚüÅöÃ?ž¼o-Ÿx£3p?ýÍ¿¼ÎÈ=kü¨´ío«^Ý}é ®P±±8xþOÿóÿþò·ÿ v‚´ùê¡5x\Ý~]š<Ô›ûZe~öè»Ë×EXì\ÏCÊ]*õc¶¼‡Dj»­½Éé+Üìå”AVêF ÿ´cjóëùÕ×y¡Â˜=©83[ÅW³“w„Ö# æ¥8[ž}Mª½û&V@­u÷?”ÇOÀú奞]ßûí_ý÷^üú^]‰Òq®éÓbïºÜ»Þd´¦Ò<—³šcKJmIšCº²›7Æ”;/ŽžÚý‡öà /øqXwÞ[0Ū÷­Gº3ÀíñÕ¯¤æþz–' áŒÜñnôòb‘ë”٩̱î`Jo;“‡µÝ·ý‹ï^þeëðM^®3NßìFP=ËT ´ÓQû¸9¢‹“¬X²3¾4Ž’N^nGÉRŒ*‚¦g ò·†ðæG¿ÊPż·#6!Ãi£S_/ÿ&ÍWqµIK¨zwpjtÒ~뽊XžfùrUg`5¶{Ëk­¶XO‰k))ŒÙˆÒÑ~…!ºJeR™\LÏßÎ?¸ã Ÿ¡ÌTÝ‹b&@ª4­ÞùèôËG¿ç ºȨNkßê'ØâFV¤…Qµ±Ò¾ÆW¶ùú˜ÄŒPA•*fm[¯/Ãyn+Ë€Í\KðY¡I«w/µM ÅÅîÍüä%aõg\0‡ÀVbyÉÚãhAžÓ=Të ³ ‡½›–zQ \yµ1}¬6÷ƒy1ÃبP‹a©ÄêQ^„Qõùä{pÊ+! HäŠì팎¿+ÔÏVb5Ik²•“ã˜+ïºPË §w!HÚ½RïP«9ÞIs%Dé +•m«s¢4ÌÓ´]žVg`59o—,moáÅ<×]$Vvrl…3ºý \á… …P¥ãï÷UÐ÷Î^–WŒêñN×íî×æú§oj‹ÇaÔ·lH+=Vë­lQÁ´BZ#{pÕÚ}©ÖvÓ¤L‰y¡îô/”ÚÞd-‚§pJãØ[¼QûOÕ.˜‚N†µi£AmTiø(dOrj?!´ ý{œÄ5·æŽ™Úƒº8KKS ! +&yÎv«ï¾n¼S›'°ÐzëvGŒÝmÎoÚ{_fÅJZ(g¤ +ðûáóŸ.ßÿ±ñ­Ø>MR6˜Pgò(+5ŠSl°Ëh?ùÍàð¹ÑÞú¬']H$Ð!”3ƒ÷¯.¾lŸþ +D £Õ›Ós£±Äµ"·!©({"{‡,×z‚!ôãÎxXšÚnR¨…p=ÇWê“kµ²X eïm¥·rðŒÐÊiý´Ô„eÅù²[ß…ÈIlyGl++ux9¢GÁöÌ.ÝÞ^’ÔÒ¬¥Š¨Ò7;”Æ),ëf^Z3€´ÎZ’bvNîÓÅÝòèIsñ²2¾¹c +|µµx¹ÊËÑ‚#l`IÞ;À¬IÁèGsÂh÷Ymt‘¢Ý$YäE V0+³ÖÀjîoeØõþ¯û?ü›IÖ b~£§sìvN’¤Ó?~jÓ>R›Ç¸¿3§H28çšÕ)ä|7qÕßùÇêœû˜À8ñ‚LkµùÉ‹Jw‡”Š¬ÛOr5Òž™sÖžaR{#Jn¥ør魯|¸‘Â9u3)ÜÓºFëTog¨b4'JþÝ^]„©„32ç}N±úiÖC¤:`”Ð< "ÄÚ¾P?!½cÌY¢z?I;Ay¡š(˜¸Ô¢¬‰Ô<3†OÅúaœ1·.*º2bÍ¥÷„Ò¸Ñ=oí½j¾'Ýy¤¶·[œ×—·¯¿Ù}ø­=¼ÀíQc÷éàâ+µw¶žèÞ _µpÀUæ@ˆfc·ø&Í”aÔæaqþªºüäéÌòr'ÃU¥Ÿ˜¥ „+ ¥m«w58þª½óJªl§ØÒfF !kÈ \iôdùz5ÒLr;†zë´±ÿ¶¾ÿªyøÁž<Ï(}°6Fc»»ÿJk!ÕÒ™‹Õx¹ß]Ž/U:»×¯´nÑÁ†ã渠õÌî•5x<³™¡)WöhkF[S¹v >}=-ÜÛ Éß60»i¦”¡Jy®ÊÙã‚ÚÈ«)˜¿(öb¤)yÛåé³{.yðã@Vù"ˆ®Å(Îì­†1L®9ý³öÁ»ßþóôæ7jã`-‚e RgùPoìBfTF : ˆ4” _ÝLqþ†t¶|¾»§ÊÝB­‚ÒãF¬ a²WŸ=Þ}öÍÃoèÒ"èßœ¨`¼…+a4Eo¡vNÀIÑ¥ÐÀ¸\,ð:Âh¸RåJ¾<i†Qh3C0RruYÊÚö9½²sõÍâú7rç:A–q±Féí4ãd¹ŠÙ>“«‡ aÌþC®¼Ÿ Ê T•Ý!¥V7“x’4{’"+˜ÒQÛÇP˨ܤõfmz©Í$åRÖ˜+Bʽ,.^‚°„uìŽ7¹â˳(aòÕýÖÑûÙÍoüo$w_Óöÿº}øuyù + 脼PÄõzF(ò•µsC{gRóamöº½|¥Öö#˜‚%Ö"r5/T@KdyO,Ïç—ßï=ûà”@†£2m4I)g"´Nòú 8y^ß}‡›“,SlO/¬æNœ.FI7Š³<8èamö¢2]P‡0çIôÛ-íG ãV’*¥¹ªÝ»œ}“;ÀVs€ª]X¯$SZÀµãßPYdcJó¤µý|~ókTŸ¬&…@Võ¢W— Œ¶ÅFïñüú§Éå¯qkÌ2 $«ã‹êø<Ç8&,½íÊc}ðUû jîÇ¿Jqº™`×b4ÔHÎ?sxb_àZ?C;›I:‰©¬ÑŠÄ4¥gYÀ‡6Æ´9%´n–)È0Ö(E—àWˆÒ«*ø*Èlí0Vç~cÔŽÝ:)®µöi†ñÒ¸P&o6³ž¥TZmTº§n÷Ø\Ñî"+wïE˜­$ú—T•64`*6ÅÒRòörlu=Îý|#O©ÍÚè¬ –W£ÔgAb«àâÅ=mò¦²óJ.ÏbYέN›‹Gàÿt5·ç7+« iïTk\DsÊ›9ÁìMÞÜ þô~ +ž€ªC¥u’¦\¨â_*Èu¡4–Ë#Áí2f-Ï9 +­¢QÛsúçByZkð½ +¶•bJ€êà:q0_Å ¢ÔYw*×ØÊ>”?i€ ©$üÓƒ®¼T[ç`¨!{Á02Θ2úVçˆ*Î6 æfVFźÞØãݱÝ>õ–¯pgV0G)±±…q˜½—SÚœÂØs®|€Dlƒ6Ž`öFôI)ÏW@]l¥Ù ¨^”Êû¬³dÝ9Tn51¹•f«Ä@´fÍï\‚©y5ŽA +‘j€‘j˜='œ¿Þ½ Êa<”W`¹3\5/5hwŽ™ ôÚô‘Ý»äJS„-‚ôø²欧¥f‰¥°sŽo¬FIÿ¨rRŒp s*VOy#ŠYPŒ_a´æVŠòw«¦aæ«´=CEÌ(®Ž#‚›i‘»Be¿4ý4C 7WÂx$-Ìöž—Û{ˆæ•8næh7O;ðØŠ0RNŽø‹Ëéõ­¬¼•S¡)g7Ëù$Í²á ­xsÚè„sr³·22È$Q¸ÜDÙR8EÇrbAîöŒ´Y±¿gq*œfXµšüÓM4–•ºE–ѽdËëýgk(h6JéÊÅE(+éÕÑ;Àµq÷mT.yŒÙ3{„\ó7?a¬8êû”<[œ±RÝ5[‡byÆÚ}Öi§ËoŸ—p¹ ’†q†˜Z+ÈevgÄUvr\Œ3UšG½“¯ß«‹8iÁ`ÓtÑ7eŒ—ä[MþŽ^íC¡4Õj» ÀÈçÔnJla`©Úøú pVHë“/ê- +9È()ª*”w1µ½Ìcm´ÃˆNh£,ßæ­jç„&íÌ“l”]ÜÁ¬9é,C¤ûi”üyæERmgH ¡-¹2‘#ÔÈâvJjWŽ÷‚Ç2LY®Xý‡fû||òK³} +)Á© ¹4 +¤™›dª˜6Ô›§½ý÷li?N”6\¼ Gu# ¾BZS ¤{õ~¬ ¯Fˆp^ωUðƒI¶’“; áùÒžÖ8E”î½¼-) +J˜/-”úa ¯ƒ4b¤V©¹óL$#€gÅÍ8Hð‰¼¤š-¯µÛ“ÔFœöOè 5®¸B̵8÷³ÕDÓ _£î¬…É‚PËóu(Ò‚Ô„ìº@>[MØ"åwÓs·rZ1cˆÍÊ@Êãöj”%•N}z“åËaDÞAuÔ0¥®Æx§¾ýæ×ÿdVw>Û,¬DļÔeEÄ$a€<ÚE¸ +d5äUA¨øûôêMÁ2f$âÍôæ1_ÞñO¹à:à,[LàZ S€#± +Š(A:¨Zná .Ë“kgpƸ#6¹AUÈíªcrD,x®´€ô@DˆÔ‹bf–¯–f_j½ÇJç‘Øð»3 RT4*×ÄóLÙh]Éõ ÖÝa‹;„9ö7Œ Ò·zQTŠ;rõ7fð΀¢RíÄÏ+¥®– ZÒ\£`Î\Q†JíH­Æ cœÉÁBï€d¬búëåêlf‚4ד4k õç$!Ùrb#äû 2 ñrÎVŽËó úˆÔ8“¥Õ¤ÌêˆØQ¼Æ¯ƒ4Êk ™Sl%/ƒ¨må¥õ”„(=gpc´OÞ;{ñãüâˆ:Èð-DëGéòFN`&”g(`¨Þnø›Xf0 ¨(l%DQj/M8B9ºˆI]µ¼£––¸Ü‚T_‘[ÛK÷C¹õ0¾‘3BŽL X°ïmá­é5ðéJ„Yq@aÑœ +²Mq˜Ôú³µìÏ7áÆ1s3!ÜQðg s}$8“,宄±Í$»™@•áJ;CW¢ˆ•ÄL·±ìÌo@Ào$UÂÜ‘§JQÂI0^˜t¿H°« &œW(} 7Xg”ãŠQ Е g9”w¼œá#­}UPû¸ÚE¥f0¯~¶U¸£c˜ ‰‘ë1\õ…cƒµÁô>ª´ ½ n®&Ø`V‚ I“Êó9à¨CC‘\qS;jóX¬îÔn†÷¡Ê(À­'Ù"SZ‡±†lÊ)ðþnœVóT4E0%@€˜Ô¢DÀU©mRí'Âoq¥® fÕ>‘ç–JuÌ‚º[©ƒ!Jš«hÍS©~‚ªpâܺ— £¸Ê]0Ú‘¼ u)#8èöZ «­Æ$£±Ê Э¬Æ¸;Rý\ðŽäpåp=Å:Ó…Pm5Íáú„¶çr븺ôO†€òL¦V>stream +õ“ÚH¬æÄv’ts\ S[¼;/ ©Í³4ÛŒ“Õ^IÑõ͌ŭ4[B¤&ø_|À"xP× » ë´öPCŠ®$áSÒÌVÆoš&Œë’VW¨n—ÇÌÞh›,[¤)WK݃úì˜=#µ18{ˆ ^šÔA”2jÄL,fh;Ã#!UÒ„L²„TSËsVï¢B•Á&¶Àè%hÐÕ Ð&ím(ƬPeK³ªÿ›{q@µºOh=à©$2œ~}ñ¢±|™æ¼8aš­#(Š$i‚*Ø̈[9r¦µûbxù+®²Ì‹Òè1¨Äå†1#„šn«qëbi¼õÑWúÍ¡”>¸à…õ´¸£Ò„òµµ0êìaFì ÚX¬ rÔÚj”€â‚’'ÀÃçò;ý²N”›ãvÀe§jãÛ¸á7<ûjúà{ÝϺþ`ïkûö-oÃBç…6Ê7 b#‚ÈP,”Þaí1¨¸@Š—„Dâ›9¡Ãퟯ¥î‡ñ•(µ–7³JD;nÅ`†¥®Þ:ͳ^(«Å]D—ZŽŒ­´ðùFò‹Í ¤Mžm@ŠBÅ™ƒëÑõµý÷¥éS¡rÌŸ®#)ÜZ_ + Ô~‘¼Ýòð¡à.© ,7¨°èPDà²óB¤r2ñ•meôdrýûÊþ‡,ß‚7‰v–-£’‡mû×ú^‘Åy, ¨_DC èc«9¾–ãÚ´½Ç–O¥Úi†¯o¤AB PànïÚh]Rö"F‚hoú ©¶î'0þnÿÂH5XÊÍŒ쳞â¶þ¯>ÞëH2j‚;Õj@(1¢ ¾Ûj_r”j9ŽƒlŠµœÞϹuÖ:ù^í\‡A~Äé8™(¨¬>”+‡¨Ò#9Ä‹ËZcm óƒ˜U ŽJm2îŽ$'´2\“µ§¹%‹q¦J“Òô…;~J9Ë ßwŒŠcuÕêÌ]PÅ™=¼©í¼¬í¾Å­9@.TŠÑ8rsê(ɶ0µWgÄC™˜4•$aõg¥éóáåŒw à³S!Ô®6 +ª'7–ti‘ÇYÞ?C’ Ýõ ±Dó +Âg‚-nƒÈ'Ô!÷‚iy%B„sJŠ(†rÀ}6&PeqeJûó ú³û RòOòÄq'F¸¤=5;g¥á eôƒi*†Šjeªy»Ÿ®çüÁÞAäp׹ػ§P© øÏ—vý¶Ëú4Nx[Y“5ಷrêç4Š ¦ôBìõ8/XÈ`&!yˆXMñµ‚³,/ßöŽ¿1Û—´>„Rbía}ùxs XÒZ²å=à‚¢B&䘊UßuÛ‡nïæv3cÀ;oåM ¯{q2XPSB“«ëÝK®¶Ž&ñ’@ ãm˜:xCÙ˜f„.ü}5Ųbœ´ýûê‡bóTnž’z¼<€?Ì3¬iŒ)kޜԻ¤¬Z c*a ÝуÎÑ»ñÃßQåݵ´r"˜bXµŽ‰^UƒY¸Fð$çkQ|#Fø§Q¬¦µb¤ ˜Æ—÷äúпΫôØ7®¸Hñ p[„½MYLªcr•ÔR}×_ŽÏ¿œÿRé^&¹V/dÐ9“_ÉK=ÚÙñ;{VvÒRs ±Í¤IKp'²½îNFé¥@ ©±²Ç83àSLkVçüó$ˆ b¢ÊÌi’,%0s-RH‘º^Û–«»\y/ÍÖ#¨ÊCr–yVyá·ÂaÊby›v9¹ÇË«qÀ4Ä-µ£ˆê·û!‹*d~ïR¬ì‚± æ%(ÛJÿ‚7‡òY&Š/Íäö9S9ÆÔ~23Pfd¤ÖŒhÁ¦­mΡ#8þ÷G#›I>MAuÖmåõ$ßrIáN·³àDÿ42ðš3z$•©põ SÔª‹æü:Ž¨€¨!ÌŒ3^^láîzF ãnw1©"'M9_MQi’¢á‚ ±’ ÓB-+µ“œ¡¬ÚÕº7õ£ßèãgy¹#‹re¿4zA—³R?L”¶ükWÊ)Úñ[ÌkàS˜FÐr¸Ö…z¯ÈÉ`ó©¥µü›¯A†P½:½)OI»•‘jpìŒ.îf§ zÁ¼Èr´y€¼‘i9”Õ¶2r†ò¿>ÈŠeR«¶öž³•¬Ð$\ !:ãN0}Ám`pÿÒ¯âB¨Æ(Š`S”I›Îi‘zÄ^Á×w¾’p´Y¶Ή¤5ÌŠÕaÅ(G¨í Žß·÷^+•!Vò´ ò¾8y”SzPP¬6‡´fåÉc¥¾³•Ã9‰— 9¡ZóÚ0„¡XÖ4*V¥Ò$FZ˜>FÔ eo7·ß˜ä…F–ñ6“Bd0¨&¶æß>FUPyŒªSÚ^@’|º‘ÛLq˜Òõ¾žVÒBË>P­Á%ŸoáŸ1 0_ˆÜŠRåèamÈ—ö!íQ¡ ày/ŒÑ«‚õ‹@Ž÷@ðø`…ÙÉ‚Îù›¤¨R^hm&¥õF C*¸ÜöïÝà+Ñ‚ñE˜¼¥aAn¥éb$¯™µýW]ÍK[¤ðoë®då*dïÄ*Öpȹ̙÷ãR(ã_x#5Ób”'ªu1}Tú[‘K‹(YÙȪQ‰ù¸΃#$ì=ªxLX xŸ$i¡`iC®u~©u/p{Ŭõ´ ‘dÁ’ËÁ¼ +rEm]»£œ·Œû[Cð O2 ¯”V„´×Rt³˜’SUN¨ü<€Ü Pƒi¢äÕH—Bd1'·9o/§vïŸU åPÎÌ°^†«ÀËórWi^¤ÅÎJ’BQ—·ÅÚ øA¾8a,ÀƒÕ[jeé=Ünæ•8/  dy•7²¼ä-Z»OÆç”æÁfNAtΙÍCÿ{Lº"–wÕú±zq¹š ÿt%ÊJ¥U¡J„»¯t;S¿*5#¨þùV!‚($ êˆv?B}±…ƒãÃB™CÿrA̶ZÇ/i`6²ÐÄ –Rˆ/.8{ ]P;Ò‰Pµµ¼³–1sâÐ<Òûq̈t©¶Û=x»¸þÑhŸÃ2­D™@?²ÄØ3õ´Œiƒ½ÿàí}è#ÐêkQWúvûjö¿ø³­Ÿ­æÒL½qöCûøkÎÁqãÀ<”f0«sH…œ Pöìðå?Jµ3Üo®¦Ja¢£½”ÐÍIC¨$剥¦ÖB96+ž52d1—Þô)f6Y®ÌG’\5+5ÓR}‹,)ƒl#í"7ý®Ð¤“WúîèUyö^ªŸ¦è2H 4a3zW.Ïw(8÷3f‚npî‘Ñ~¸{« >˜Sý›"{åæeRll êFFD¹jÕîEð•ž$©z¢u®qsÈË_DÈfÁã^„ +ì‚9ÖººÇ¿övßSå½`&EøÆfJ^ 3þÅên‚öøÊáüáʳW!ÂE´¶Ñ>S[—´³HÐŵ¬´–•q¥+qÜÏ$íåÅ–Ö8Q›çq¦éŸ‡¡>â€TO±å8]ŒQe° Y¾Žð5ß +¥„8áÒþÆþæðÏÍ”.±dôÒ\Q;lyßè?Tš§aÔºaÖbL(«’l$/ÆòÒj»&Sd‘³gŒ3÷·'!7”òÄüj„ƵIãðk¾vDsTêùsbõKííxAøÙF:#õqg_n=,Oß’ö¢þ,€(¥Ùäì*×ÖSŸn¢ki™r¶A- ~_oÿa±4Nmæ‹›`[¨<,Ÿw™ ËŸÞÏS¤S^íBÚ¾‰mæôQDT˜½#D¨óºÙ{0¿ùƒ·xÃW×3ÖÿñŸÈèþÿ}ÿ_»@nÛ¸ 䶻@nÛ¸ 䶻@nÛ¸ 䶻@nÛ¸ 䶻@nÛ¸ 䶻@nÛ¸ 䶻@nÛ¸ 䶻@nÛ¸ 䶻@nÛ¸ 䶻@nÛ¸ 䶻@nÛ¸ 䶻@nÛ¸ 䶻@nÛ¸ 䶻@nÛ¸ 䶻@nÛ¸ 䶻@nÛ¸ 䶻@nÛ¸ 䶻@nÛ¸ 䶻@nÛ¸ 䶻@nÛ¸ 䶻@nÛ¸ 䶻@nÛ¸ 䶻@nÛ¸ 䶻@nÛ¸ 䶻@nÛ¸ 䶻@nÛèþoÿ‰ så?‘ñŸol;C¾wÔû¤*²Á(ÙüÛí>1?ÙèÄ™ƒ#~68šíîôÎW +ð£D,•Y‰»£Þr%ø¯Ï\'­X³Él~Xô–£­•<ƒÿ>I¬$WÿW=ÿ$šG2H,¤r)$“I ¹•|ÍÄr $¦4ŸN®lÿ?> IDzÙD:›Nd©ôÊÒR~–AQÉgr¹ <)ûñU(šÌ£‰|þÿåIÿ·[þÇÓò“é'Þ';Ÿ8Ÿ +Á­•ªQ1£OöÿCpI?¸ó'Ζ£Â¿þ•ÁŒü_“ ¯‚ >‰ó£“Ù`äJìJÕü¤±òq6ýwˆ~ü ’ý‘ ™•ÖJ*‘\I&rþ˧ÿQ/ðùï_ôïÿYIÃ1&ó7³òñ>ÙØøx„þòVri4•ü¤ªügi¦Fµ(näx//Öòœ—¦+qÒËŠ]DígùzŠ,þk×oÆaj‘›1Ò ôê÷ÑH1¥ SŽô‚P!´çŽI{„jƒ¼ÚÏH]̘… Æz_¢‘,Ÿe‹˜Þ¡œîÌQcœQÚQÆ äÖîáz+I }̹KÑ;ÌÉÝ$UÍkÃWböVNI±ÕœÔFä6W^ƹêJ‚õ[6Ó%8ø`FJà©÷%o°Ç9¥µUд£Ì¬XÚDÄŒPá½]±q¦ô¥ÝW ÖVAÊ;Z÷RhñÞ¾Ò¼ÀíyJj zNl¤9/Š[Yq#ÁÄP9Ièy¾”å+ëI>+E{AÔØBÍ0n§ùX†óP©™áªI¦¦ÕN…òA‚mPc--nd¤pAg¬¡u·òÒVVĤ6¡õs\=”Ó)1V0p©iÔḅ +Íͤp/„‡rZ5£¨)Øy©›“{¡æ›«)1U£;A“DZðVQÔJÓÕb¬§8˜±(æ„Q#Œè¸Ü!Õ~‚,F ÎzFù,„ÂWãÌFœIbF–rs0‡9%â⨺Á~È®&è`N†—‡3M×Rd9†9´«ê‘‚±ÁCYy#)¬FéXÁÎrÍ4]Ïóí‚ÒÇ”N¥w&{³­,'Š˜:`Š3Üè³R0a¥h˜®n‚­òF #çù:çLc,˜¼3ÉKõ0nòrœpP¥_P9¦ÄÍͳ‘dò~_ÔeAŸe¤~Vdø†ßË›.neø$åPÎTn0åÜ‚ul‡HX¦òâô—Nÿ4NÚqÂ&­¹Öy,Tϳb'B¸!¿c¦FÔ­¼¼•÷{v$™ +ü*J”¢xq#-®Æý6|!DñÛ‰Õé&Ù*iM•æeqpÓÙg­¦àÆ€¯Ã'Bã,« ³r[“ƒ¯j˺ÈÉ”½pF/ÔöMVf•~Œ,ÂLF f·áÍ?vŠ!ý˜¨ ±!V£”ß–­Âl'…z”*ǨJŒ¬Ä™Z’«>6ÊJÝ-Ôﻕ׶òj ã7# ç•4åÄ0}+'RB8£DàW))‰­êZÙ…¼º¿…mÄÙûaâ󺙢El‘I¦• k¸ëŒýÆJ3ÅWÓb3ÁT³|3†;[Q*ÍáSœå 鎲R3¤3…?3À¼tE¯î“öà~’^Oñ ¼„k£4[OÒPŒ¥Í¬DÔÐ_NÜÈ*[ˆƒˆ}˜¡2°v3N3¬„…Ê‚ÖEÿ|®zD–– ¾ÊWvùò¢ wi{Ó[Jë¼µóÁ=IqÞf^ÙÌŠ êçb-ÅSÆToßȵ3¿5˜Òñ{¤bãe8€”p?Ánú}®HÁJQeˆX/L–bL#ÉvyÂ{— "~#ì]Üš­§¥ûqn5.d˜jÊß^‹bF‚(ÎÄý9‘W¶°­”L 1ú~„Œ¬4U ¤åûQf-ÎRÀȧ¹µ8.XˆÔÙÌkie3­2À‰0 í˜ß^ªi@4øm‚örÒP ÝOâ«)’–Чy±“fj0íPÑ –aò·r*àÌÿ'KïÁäÆ}¥ý~ˆ ¶Dr"f9§FºÑHœs`09gr˜Å$Q$E‰J–¬¸J^ÉZ+ËrÒZŽ²d+Û–e9®×û¾w÷Vݺ÷4ß[…š1À?œó<¿§»1­ñŒé‰1=©µK64¡¶±&$4¬En™°žò€m)÷‚Ô*wx4칃SœÈ„Å¡n±¥âd +6 ;<¬qRÙtø­è¨™8b$Ž(KVwÇM ™Q`Ðv 3‘ñJ]!»&fÖ®!ïá³ZD‚Wpùó5¨©´Ígæ¤uN‘Œ¶`— Jdš”§…ÜB²¹³yê¡Ì̾‘”Ýb ·Ñp"¨bÑ®+¿i]x +é}¹ùª_¹ W§Ø>HwOL! µÑ9T(û¤šAªó‰¹¸Š‡êz_ÄÁdŒrO6µ(mú"-6Ù_=¸Ï_˜2‘€@vè&©ÄŠ +• + óDàûq3eB$å¦-btÞjCdìtÀ6bÜ„±I ØàdŠ ›ìŠrowubô‚¼'”—€S3EP7žÑ#ÑavDã3x'-¤Öé· À“G蜗¯è‘h”ÞT5PV + $eÜH›(½[yœ´ó£ßФSç ¨ŒÌÑÀ _”ÊÆ*÷çÅ·cvÐ9ÈPfðë6"ᢳ“6ÿ„™ž2R0~­Cè7’“&\òð”$hX *¯¬|…1hÔƒHƒ=á¶Ñ¼·’)k›1û¢“fjiõÉF4dÀ mTêæ}̃cFL‰„ ’xö[ÂN¤~@Dºn:åc“ùæV¬¾öçäò.>ï V¸x'TXò…ë€x ì•;Áñ‰Y&¾ÀÄñÈ€ˆÍÙØš‡J‡Š‹“.hÜNeC¥íDëXº2Ù?ŽDª6ã=:5§öÊ"icrLrΟ[ƒ°†JM’7PVîóè‚ô9è “ø3ËÉæ¹Æ›²ÐE3Prsy·Š°…š6: î ‹ø‹€ý"Á&g“Tj–ˆOŠKF<6nå,DÊ’ȘV»D „+)7vˆ#z!“||ÚB&FŒx“•Ì‚ +¹¹²Á…•„Zy£øY¶Qy×M0·CQ¹Gt؈‘šrà-àŸ:WD•»ùŒè¼€ñ?°×"… Õ@jÁÃWÕÎà$xŸ+dÅSV, ÔjtòG ˜¦þ&ýÂ[¨­œÙ+OZüj«_c[„h !1>¥<'ìâŠÐà°ìP ˜Tw³ +…j]¢LaRÖÐà ‰I cp‡Ç Tè@ݸ%4¸C fCZ/˜ï¤•Ç˜´”‚72¡2ˆ@z¹â˜…>¢AŽL:‡§ì@܆çk ª *Dç ¢RƒˆÍ{B= _µñ5àm•7údD(Y©„e`]R“/IFV"®¶³¨X²C‚#âf:mf²y!±’á®^Ôx$µ[Ð{Czo°wÃFzÔÌ€C¡lž“;zhCµ¶^ßÎd tO™Ø)mtK°;CSÎ)+c's¾Ð *vÜLÑŽ¥UJ£€1G´žCj×-“vµ2BZç_È€¶Œ™ȳP   0`Í=|ÂÈ”CR;Dn¶è„AzÃ>&cp‹·¨,#:J΄‚®ÊF8!lB">¾ µ³_5ŽêP• H;á ³ `¸X IM­; +̬Ü1K€ãC©Cœ²0ð JCjסI€Ü¨žÐ»ÂF$ªè¤t20a&†´è(D â6 Ö%B:Ž¤Ù³Gtè?šG´¨ÍǖŬÑÃ+ƒ1Dmû§¡ÉÑ);È„ßIåÖ“¤Á„¨5a%!郜bb•”ê>©¢õ(-ã•ê6=nž€ƒ’½þ¬7PbSs¾pÌE‡ÉÀóL¶3y61Ç%¡4áàÆ,„ šYí @"€\(íRаÁ†2ñ>œUª ¹…*ŸÛ ÖÐX_¹{,¢m0’± ·ß#5‰Ä’/¾„Bå09­'¤v@-ÉØ´Ê€M*·Hƒ¸ä…™3‘_ 6AF ^D(³Ùe<6Ýa¸D@ýû}RÕnM"ÒÕ êÝkå Ò<{Ä ? )^e†M„¸­w +6oúvv$bÊÁÁ’NÙ µcf_B¦Ñ  +x»Z—ðîL7b$¡x ÎCQ i}cFü¦ÓÅÔ•iÁŽL™L†&-‹09tñë,È+÷xu€ºò +ï1•…0züN*>agÁßaú§†ßxÅŠƒËjì´/X´Pq"AƒŒYé &æ7¼Á¦K0Éé)„‡Ÿ²+7²³V<Ê&z”ÜŤ2—›µûó6&ë*,©ö„  x…@yÓD$œL¸’Kjè°Ø”'.É&¸Ü¢“ͧ!áƤ[·ò#f"lŸÐò÷JS.qÄ@©,,"½;ÄÊý@vÉÉçô>TX@#åQ+6j¥Ç¼ˆ™ˆÇk{rû”]¬B¼bÓ&<¢vxàP°•6"€”ç/ ë=SÜâ Ñ8‡`³ô^h|P9£xÏ?föèQ üHç’t.ð5ÿ¸‘7Ö¦]TzÊFÃjXçƒRTÛ9‚ÃJz +"\ aÊíסÄ^ØD% È™Iøjó…56Æá ‰±ºÆÍÃ^h’"k`LΠÖ€"ѸxÌè&L¤Ù#ë\!¶ø¢  /@“mdtÒÆóŒ› ¨•‰Ò9%àÿQ:aÆ .-ùîÖqÛ‘›·<g"¤úêñ‡ ¾ð­ã–q= +”x?n¦Á +Uv?ÄÃHn>’ï™0NéN¯ßé ™< ŠP-‚Î%Ú|Q¹¼löÉV_Ìêꜰ1“Ïäñ"爟4ó×ÿOs7›Q¾ñdsËÉ¥©=£F|6Âpr…`q€‡ ÔZk·[|ÒŒ†m `ÊÍÖsPZX°Í «‘`eÔLO9üíd†Ž 2½ Áê®™R¨‰JÎh}a5"ø9ý%<:(m1ÙEAnÏo_¡SݯL:&-/ä8(E,Øq°E¨heCë‹H@º2'‚M"Ü'ubñlwßÆÉ_×ÃMD$ÔÅg3c©Þ)$X£åBoÂIuÜxhÂfÃc0ð&ÜÂ6±á¥[',ÃZ÷„ 3ÜÌÅPíf*Š¡ä¦ÊòÂcH $&X±”×߀¨ip€ð«*Û-ã–Óð.p7ÀZ×£A-*ŽÁF=Q[H[ Ðé—HŠþDsÄBÜ<,…¸ÙM¹çµ‘ÖZ9£¤*”‡Ýñc xô„™RŒLy‹`´¸d#c‡Õ.ð>h3p¦œŽr`!Ÿ? ß ÁVê}ãz ^yÜH›à´òàÔ¸׺mîÀ¸Á{dÊ î©ø©=hôÅý©®ŽLÙ­.Æéôvúð”kÜDÛɨ@lwß¼O®Í&p#p¾ƒŒ£þHú¨\„ +±baXXðM;ãåi z“‘7yD€žU»3.Cò%¤ +Ï„‹µãà˜•‚Ìb#f,jò…äìÌÌî]x´51@Á„*튅e§ hŽrgá@aÄA;脘@±0åv‡N1[ß8qçÓ‰ÆúÎë"u•Cè£fÊÉÖ‰è,ê²¹US0¸£¸XCÆð†á}Ò(¹3åâŽhÜ BX—×yü*f¦âBNåçO_~Rëñß:a5£.Þ²â²ÊBé°›GJã´¬Üg¼Æè è]¼ ß*~'²¡ÆÂñû´Þàa-jDÃlMžˆ ‚ýMÙxNnöÖîH6·¿2n=¤²ŒéÜF´­‡$hôÅ >X¸8jÒ.@RÕº¡Œ. *L¸áâR#ftòQƒ8E”Jy¨î/¬¾°?Ú÷<à4f™2F§‘ áòþdÀÚ|ÜàS}“&JeÀ!'BZGÃýiB̃)3U»ŽL8ÆôÌHã'¬ì¸™¼uÊæ"’¤X­þÇÃê#µ…²á9••†çŒh™š€è:åÖ F80t³¶)£/-yë”kXþK[}Q3$q4’8¢S +x |Ùˆ›½’ z¹\ 5‡†›*i@Cea9˜‘Ɇ¢rs9_°êæ!¬L˜LË6=c§“v*éâ²VÌ.ÅD>;jãÇÌ('Äyp[0Íq+i#ãn.ëì 7 DÜƤ5ˆ8 +¥ŽÇÉh'X^÷—7±ÄŒ‰ÉL:Aî$%Œ[©1+ec2ê6:ï[F2GÇæh¹p5i§õž€ÖÉÁºMÙDµÒŸPe£k·Lš‡4 Œ3>ðgçýÉ–”éªL˜ ÊA×Ø«­ã&–—Zˆ¿êäŠZ$IâÊ‚nžBusŒJ|b^,oŒÚ₆‚—Q;F4®­6Â#ðhÓÅ5nIçä&M ž¡I'@Øèkµ+¤E"N¦LÇ–ÌdjDR`U°ASv¶¤q‡\•Ë®‚À¦<¡ 14 ¾ì3ÚX…±¢a!Ö™°À^ˆxY·0©Ä:?Ô¶Ú´ è& ¾uÌ8¦AM΀ΡÜyÐQ‡Ž@cY-4©1Ø’±Ñ3¬Aá˜dWN|ÄA÷LÐPnîЄuDëÖ*ÁYBŠ„¼|yÒÂNH‚-ž„ +4Œ¨=Ê»;O¹Ç ø¨rdfÄÜ'™VÑØÅ ­ÒCi…5NðzHÇ¢ +¢(xT÷ðyØ5èóA«õ¾˜Þ—2S.¹¬ì³¹3sPIÛ5 y“Â:T×3VÂN^íâÝl +岡ʥ—¨ø¬‰L›H›³³9ÐCèk_|™Îïb‰yø/'b&RfU9H w°È´Ok D[(XRÛДK9ÄÆ]\ÕÅUL7ÁdofpÚŒG|ÆHD-ŠveLÞˆ¡Ö¡4£ ° « C·¿Š†:2£WÎCÚ’Œr(f)ÌAæÜBÝŠ§mxúüTmÆÆõ@/†!¨.·< +c£ÒÊ)Z 9¢ì©wT‹«=cFJí™ðŒ.êNYH€Lhµ3Y2ÖÁÃM+žuqeP¹[TÖa­Û„Hn§ *P„®ð°Ö#Ošq#ðŽ°YX3–r³%‘V"‰…¨ƒ×ãcz\eb¡5 Œ‡Òýdsë€[¥,cZ§4¬õO¹q3¯uCÅŠCòŒhP•82å9<‰¨ ”ÎîG¹T, ·A¹šŽ8¤²j‘Œa©¹qqDƒL˜p•Î ~hÌYjUk¤ä¼ýÓÐÄWŽ¨§`xZtL‡éhg•™¸‚Œö•!õˆÚÑ`B9ŽZ¼1ÐvÄ_T¿Uí³(×V©nf‡!µgJY ˆ{qå„”…õ³£Q½½u̪\Zåí•ë»\!Ÿ÷Ê&Ø`òE­T T±l€ž‹X´é ×UV`1 $62ål”…Sz~˯#N¹5¼7ÿë T´rúÒÃf©ˆ‡Ê¾@ÕJç\lÎÅd|bÉŒ!-²ñž›ËCLsPé1;jfŽäÚŸ5¸ý&opÄB)]cáÕ®°Ê b° ÀÞJg'ÃzrHOÉ»àEȨ·ØžÊ bÅL%¾:i?4iƒlböÅtÖNçÌDÆJæ@Ç&­4üðœ7^?¯ó:¦º3 ÍBêÝJÖz$hVN°¦¥4‘ m5e¡ Žé=1Ô_ÇÅ:Ä +PuEØé…0…AÃj8è¬úBõ[4>ˆüP„ i£Tç êÝ1­;f"”KMÔNIk#M¸©œ`d7_œ„T…D¡k,he2Z+1®óêA`à!5 +<¬wG@íD\¥õüí_ÒŽ¨‹bÊ!Ø}UÐ8€ë ÓV§7t˜ iE!+¯œ±Ò¸aÊÊùD- +y_çT®_]º9©0<&"¨Ä?ÑuÈ| +ÞÂi‘èÍ ´Ò@˜P.2iõ¡,¡ðÔJÞ Àt Þ¸7ØàÒ³T¬KF›Lªçàó.¡ì 6àçLr†Ï- Åu37à ×yÂ8”ÔF$uިΠé@ß<ä8;›ñJU—*†ýõÁ°š—!‚Jî¸ýÄ_vPàg,XÏ4öåòª•,-2 XH†,æfsˆX˜ñ1‘ÐûÊMDjÞn¡¡¦<Î7àq >nÁJ§5À9DŠŒÍˆùŸ…RŸ¼yBtoØDC5BÊCCý »xš×ˆé=’7TGaÀl~Ü*€6š°„“+¢Ê$p2)†t£qø HЊ§0© s7(×\ÍHÀë‡N)X‰¬ÊM¹ƒ:Ÿ ñS‹Dõ¡~Tåhv¨.;1Á€]a­,žÕ{mx̨”qPïO:CÐt¾`¨UíH&lìˆ^9‘=¬óBiÙ±¤ÅwCË)•Þ«X†C„"„êRN-ái3–„$Z§2à:;7¢qƒ«j’FY"ÞÂŽ†ÜDŒ”J*“oÒL lšMLCܼ ³SÖ)gdŸƒl5œã Ã:Ø’•Îë`ʾȰÆ3¦]uÝ:áTY­rõlÈÉdéXŸKöùd•êzX?eeÆL´ CªujÞP#R[a2}HCL²ç ÖPѦXXŽ¶r…UT³’q àS=·X•p0@)_¨†‡ën±@ÅaåÓX¨Æeh° +åïŤgCåµ@aJôþ’É3ò4€=âý)Áž¢R U£•5TÖc²•É»M4ÒÃä¾'Ô¶²ð;_°æÏÎZ¨8›Yàók®@ÍD¦ÜbÕ …Ê|ẑ”M„¬ó…­tžæ UÈX—MÏS‰Ôª›-:ÉJj=3™¥RÙý“N?ÄC3ŸpðoT‹„AÕIqxM7_´S)ðk-"hœ¬›Í€ž›ðLjÀÍØø4%· lÎ- Db M"ð‚I2ÞÃ嶅NBˆkpÃË&ì|Áî/aÑ•˜v +E·Ñ1#11XC"Úq †É˜0(QH:‡ßä-&Ü"½Æ ö:˜,¬¼Ê˜ñä”+¬†÷uàW,xÒטpBÜaZJNç +‚ƒCZDùk ù6Õ¡âµÔô6“ìC¢×¡²Ë_v u; § Èu¼mc3Z_ĪAýŒ˜˜LLÍè”Aé\-›|AGÅ‚‹/AŽƒŽÆ#3¾` ~âd£&¹yA¾KÙ ŸŸE#M:5ãÏÍù¢u,RFÄ,!×"õpk µ°p• +—sý£X¤a¥’ P¾`FHÆA ªÞHÍ+U"¥¥Tw*ÍH$¡¹ôêJ,,Åew°Ú¡l'#V"bÄd4PeS=&9MÄ:F*©L'Òr‹E—PÙôÉ=:»Ìæ–üù*9 ‚Õ\ÿ$›]œBÃ.‰Ï.ó¹*5O&f|ÎBÆôÞ´ƒÁD¸t¨´$76¥âR¨´š¬õÉ° ¨TƒÉLBâ°‘ µSTˆÎÆ|2°¨9™ *TøÔi""*›œFļ {¤ª7X…Æ!âÓ°PÁòª_`Ò=›±ñz¯ìñÃóD¼_XžÉ¥f2ÓǤʊ7Ööç…Lguƒ•!ׇêòépy6Ö\r£O¶Qiå0›°L†kV":aƒ„ÂAL€²Ç#o¨ :ïNÅ»ÊÇCØÔ§—mt†’»ÉÖn¼µë +TAj »!¡«¬¬ìdŒ’[áæºÜÞÉÏèì^‰(O« RÙÁ§\`@EO ÊŧÓÍÝPuMƒéhÜÀ™~«7ìâ³@G.?HAIÈΆ*ËBn–ŠVuˆN› ö&åµ<èqÙ/Ôƒrv;ng ¾eq¹é‹u‰DŸËÎEñÎ6«’rYÈ÷¹Ü ››J°m±8O@-…kž`ÙB%\BÎ#)HÆgç"åõÚâùÚò¹Py‰NöÐp V˜D›MvƒÕ ¾´뜦’3V2ê é" rT¬vÌæÝá–+Ø Öw™Ä4Ÿ*ì™ì"‘`±>æfkKçÈdOåaãÀõ¸Ìí(«-U•‹–Åh£ i\¬ƒŠÐ±:—jŠs‘ƦPXô„ëv:¥­… L¦œ¬bÙv&|eðF¡¤`$‘¼)VŠÔ ++ÑÆN¨¾ª®Â– •ŠÐA6.ë–Jd¢K&¦#õ-¨.Ø,"ÖR»üVØR¹däšM΂ÒË+Éî±öÖ]r{‹5ÅŒy.ÞÞÍ.œÉ-ž‰47˜dWÌt+ ǪK§Ò½=—EeLn{#u"Ñe]ŸT’ 62i!D´…GÛ¾pK,,eú±Î®?3Hw6…lOçWMÒñn¨¼iíDÚ»n©jÄã\bÚÂÄUÌÁÄý™&ÕÔ7KËZ{׃íhu¥¿}“èé½)21O§æ™$lâFnî6aÕJgÆLh¦“ÉHU*/q¹y±´š›;ë…Úäfòí 7`¹ò¢ˆÊú‚m.·lì'{§©D_®¬:ù:Ÿ‰Uw3ý3ýýûWO?ÞÛ¸Øß¹äϨD;Ú܈´6ùÂœÜ\¯._lï^÷œBÎÁ¥*ÌÏ4×ï†Gcý*žT_+Moßxðw=û=DÌÕWÏuöî©¬ß ýÛؼÚܺæÏ-œ{ðÊc¯žÊÉ‘2tÄjrúh}ýâü‰û +ó§ºË§zúµTj 0s,ÙÝMõfÞ³wÇSKçž UvÚ³ÇzkçñHŠ+^ìÏ-ÊÍÝòò¥™-ª°pnqçboõ.îJ‹lºÏefäÚêìñ§¿©mH@ ñ¶'P bMBnÁŠÙ¸’•-F*[Å…3NP0Ãg`WA¯ØÌ Ÿí—Ç/Ý÷|cù4" K—3³çâýÆÖè:¿ dèKá +tºƒŽ… ³rcmzçòàØõêê,ÞóJµJïø¹{¾‰‡ +Ñòleátyñ<•0 ãõÍhcK,Ì‹ ü¬Á+:a/RÓ±æEwóŽ½ËOVÎ,m_\Ü»ŒVàדÝm¨ùÆú¥­ _xàùdc}aãì~ÊXÂéÏCXºŽwÎäï,,^ +dK۷퟽ɵÜ\ŒNNÓÙ%q=\ÝjïÜ/U6ltÒŸ„[;PÿL¼Ø#V6`Ýâõ3÷<³tüª‰ˆ€~"B9Ñ;)wqÙ`u&ÚÙ=}ÿåûŸ“="\—;;áöžÜ=^Û¸ +8d1çÀÍÃ6Lâ@a1Û;VZ¹”Ü&Õv<\¾1{ŠOÖ‹‡s±æF¾¬<{´4Øn.ŸÚŸtÑl¼šéd¦OÄ[{àbl¦›ënížûÚìñëN6™žÞ 76‹Ëc½q™O÷ž½ïÔ]OpéÖ¸ƒe3ÒŸ„ê+¥¥³‰ÎöÌÚÙßüiuñ+×Û—×Î?Þ:z£ôž•³·vn0ñþÁ™{OÞñ$¸ð¼izúX¢½›é­¬^ÌÍŸ¡“ÝÓ÷ ¶Î£Áb¢½š9V×CÕõÜÌÉÁÁƒåµ«ÂrW¹r¬Ó k²³b¶ŸhlpÉnoédí,©G›ë«j+·5WNW»Át÷úϼñÎsG¯ê}·?…ê‘Ú–Ü>m +Ë>wîÎGžxþ;éÚ¼7PÌÍžMÏžËÍ_¨¬ÝUÛ¼‡IÃËݵ‹Éö¶Æ-ê $Äd”|§ºtÛ…‡_ï–òýlgÓä {‚U 4T®HwöVŽß˜ß½B…«ÅÞV¢µ†H'_ÀBm1¿”hM¶öìt<”ì„ós.> ;Êæ–Éä,¬33V"¨q‘˜”ŽVçkK§æî‰÷öÜÁò„“Ÿt0NV†Fð§:rm+Ö=ÈÏŸlo]^8ó PZĂŬuëà} §îî^O÷ÒÝÝÂÌ›1SQƒ/Äe.ÆíO‡ª+Pà¹õÕÛ*K'˜tÛÅE¤\G®¯${ûùù³éÁ)*3‡ðÙH®²Y2µ”‚“ˆŠÉnaþdfp –ÀAN€ßùB…HeÏÍà2·6o;ù”Þ²òî©{ýù¹!½×I§ˆH8Î T|,>\è秷 ¾@¦³Õß¿·°xG ´ÝX¾œ]8Kgú¹îîÑ«Ï ¡²úæ';”}È=±²›^¼¬ljñ§ÓíMÈP°SååóõõËs{÷Îî\ÏtËm6RÙzña/—€!Ŧ åþÞ‰»Û—ãõ ?òò#Ý•“z%¦Äü:‚ø×c’ ± ƒJà c‘*u´µ›ì§’='h§“d¨Êv¦¤ÉÀ" ŸÜ…LJѦéDWãddPL×Å^ 8¼XĤgäúº”ŸåäJ±¹:Ø»3\_Á¢5,Z§ãfŽMÍÊP°MPœ©æFnp<78ÈÎô%:V.éO¶åê’• +ÅKýµ3-y$38Í&{& C‚P†BBñ„Æ >ƒ“Áy)?#g¹ü@ª,Ù…´7˜¯-Ÿ‡Ýô…ÊÑêjqþ\yélfz‡O6½´§l¬ LX¼SvJ´3ae¿:n· >57jð¨,¸ y{à¡*#•–¶ï 5– ”dçâ.m!|zŽ ô§Ôf eÓ ÔP{¡ê†…€Ytr#Dù4.ø„D¬2Çggèt_ª®zH¹œŸYÝ¿szóH¹ý‰Xu¹±x¶¹z)ÑÞçs TrÚÉg`=Sõ5Ø,<ÒH´`GêËß?wô-ækƒSw'š«,¢œ:¤R¨T —V£Õ]€ÑñJ6*¢w1D0¤½}µºpâÕÒɯ·V/ÇJó [wÔoãuˆZXÄJÅý‰YZó'š*3…ŠE±8©,RÑê/ B”m¨Ôîmí_xØB„ŽLZôvÂCÉB¼#¥gDLc¥©@þåï¾×_:˜4¡L’òð +ÁÒf¼¾¯ï(,ÂŒ‡!yqy•ƒ…¥²Ñ1_°@ÉÕ@²¹°u>Þ]6~$ =>×%â°#E¤Ý+EssBFñ2'Ÿ„57cA“=q&¢UX´•cWÒÝM.7F*N1ãæãl¬’ìl0 P´ ^“i­qɆ…ŠL8Y_¸Î‡×wÂÅ%3.1Én¢s¬¹z¾¼p"ÙZeSM ¨Ö×ÏÞMF‹CFlRÉ9fž••Ã¿F, +Èoì’rÑ„Pl$ŸÙéïÜÙX»Pœ=&f§#¹îѳ×7ÎÞ«r0.Œõð‚…%RªÙ±¨ 6‘‰#\&h!#Tª%f¨Ô\¼s"Ý;íò7ãOTŸð`ÞÝŠ‡q©LʸX´û"“Z—ÖìqA,÷§¦ÉhèÂŒEh¹ý)U‡øc¹½%–—P©¡É†G„x³Ð;† +™I >eبð©™(¸Lg?”_T>c%.jlŒ›1,˜äfr3Ç`lˆX4¢#⇰àI¡cО¥Å õÕK•ù³ñƶWª›ðTŽ/3 ŒÕ'Â7×Ú;×Ê‹‚ÅU(æq igdo¸è ç‰HÅŸèÉ¥Õxy U1>Eòc&ߘ1Ú +Ây™¤ÁÉ«Œ¸ÆFs‘êÞÉë±tkBëñriè>­Oä‚ò n>;ªsë=j+é d7›RÛ¨›Ÿ8‘—D*kRnŽV×N^Û;—ì,ºÅ䤋´ÐA6ÛÁâ5!z‰d{Â2®BI[ ª¥Ùó­Õ;…LO µáq))ÏA4 ä:krñôu¦¿•™Ù’òm¹2«­'Û¡ÂÒ”‰øÊ°áЄÝ'ä‚©i““R™Æ4n£Sd#Í|{'UßÂÕ) ¥2xT„ˆ”é\‡uÎ#ê 6â¹¼EˆƒKä-6’ËÖ{ó›ÇW÷Ï\ºçÊCOÝ÷ô7ŸzåÍ·~øÓ?ùÝŸþú÷O¿øëwòá…OUŽ‘r]ùˆºó±©Lq¦X›)·kƒÍÎâæÒîÉ£ç¯\{ø©K_{êÌýí^¾qâÚƒxêŽO¼ôÚÛÏ¿ùöâÞÙ•ý‹ÙÎ2)¸ÙŸløÓm,˜bùBg®¿²½´s°wîÒm÷ô×ç÷Ï3±¢ƒ›<¬‡ +EÒ­X±ËF“±R½µ¸9·w¦·}¼¶°ÚÝØëïœZ;uÇO<ÿ³÷?úè׿ûÖ÷~|úÚC­Å}¹Ø7#‚Ù-Ùа‡NÄ‹sùö–‡MhìÌ6÷Ês[éβܘKu—WO^;{÷£Wzú…׿ù¡§Ïßÿ/z–Ï´L¾Õ4:9@6Òà!³Gk.ηãÕé|«_¬÷×OçÞÇ_xàÉo|ç_¼÷ño_ùþOO\y°¿v:×\!‚%ÀE‹W2 ~,%C%«/hp “’K‹…Á~¬6'×fö.\ø__yàÙ»ôÀ£W~îâÇÎÝýõ«<÷ÊÛï>öü+wÜûõÝK÷‘’Lçó'üÉN(¿ÀE›ñÒ¬”¬Ç +ýJsõøí½¥Õ½³wÜ~Ïm×øækßýÍ—ýíþúÅþòÁ§Ÿíéoeë £߸‘r3¹Pn9UÛÕ9…°{&TÂÄ’ˆ9ð°×ŸÄ„t²ÔÛ8vñäì^¼qñÞÇîò…íÓW›+çJ³ÇépyLÝ2b§ùxkzyeëÄÁéÛ/^¾öÈO¿úÆwßÿà³O~ó»_|øɇÿú?ÿöŸŸ~þåkßýѣϽ¼rüŽÜÌQ+™tbr4Ù–"ùd¦ÔìÎm\8qþÚ¹+7|ì™W¿ó£Wð³g_ûÞc/¼òæÛ?ýùGŸ¿øæßþ÷Ÿýõ?þþÒ÷~þÐsoì\¸`,ÛZ«/ÍvWÄT%Siͯ®Ÿ¹xñÞ¿öäsÏ?÷Ò«ßyç§þú÷ßï£Wþýço¿ûÑ—üëÿýÿü¿€"ÿüËüüW×ýFmñh(ßÁDi)š,VZ3KÛûðØ8vêµûyö›/¼öæ“ßzýÑ_þïþø½õÑ'_|ñÅÿþ¿þûÃ_ñØ7^9yÇéúªþR8;Ÿnï:©¸ËÊ…zgaóØ™Ûï~ðÆcÏÞø—î~âù—¾óã½÷ñO~ùÑÿò—?þõ¿~ùéŸþö÷ßzóµãwÒᆔPáZ°8ÌM×ûk ›;§.^{àë<ù¯óõo¾ñößÿä½O~ûó~ó«Ï>ÿßþü_ÿë¿¡[ô‹Ïžå‡ÉÆŠÖÅMZPN‹·baTÈùãLm°ºúÊ×»úÈÿò­×~ü«OÞýø×oþèÝ—¿ÿ·¿þüãßþîç|üû?üéþç>ýÍçϽòÖÉÛo$ª3˜3º|:aÇ$ˆ%ÅÖroqo÷Äí—oôø¿¾ôÆ»|òÉç_¾þï?ýÅG¿þ¯ÿýß_þåoßxí»7}êâ]Iéi2Ô$èðteuóàÄ© —î¼óÚ=×zäá·¾óÖï~÷»/ÿô§>ýì½_¾÷â«/]¼ruik/Uë… +•°y%œ“i>ŠÄ+ÕæÎþÉ+w?tÏCßûõ'žþ×ôó÷ø³÷_ýξÿß|ù§ÿ€é|óÕo¿øÚ[g¯~mvë\e°ÍGËr¶“mÎ¥ªÓ‰bsvigm{{o÷êw~ûÛßùö÷¾ÿý¾ó᧟}ñç¿Áv¼ûÁ§Ÿýú7ýÛ|öÅoýèÇ×zhvëx¸0ÍÊe&’烉R}zveçØÙËû§Ïï?}åú=¯¼ñÖ/?øðƒOûÎû¿õÿÿÑ¿ùüóO>ûô³Ï>þðã^zã»ç¯>XꯣLed'Z^öù³¤?«õîÖîî×zä Ç~þÂëoýô½_}ù§¿üåoÿåÇ~ùå¿øàƒ_~ùù—_Ý:sEH·.bÅÇ›¡|/’ïtç7Kû§Î=òä3ßxñåç_yãß^ÿöOßûå_ÿþ¿~óåŸßýàãþø‡øòËO?ÿ⥷Þ~ðÑgªý;)ë¬ÞƘÑG@"Jµ|}°uôäƒO<óÌK¯>÷Úw~òþ‡_þù/_þå?~òþ~úé—üãç¿ÿâÝ_¾ÿñ'½ûÞ/zò©sWîMT¦éPƈ:;.Ä«ÁT-–i-®½~ÿc¯½õï?yò³Ï>ÿüË?ýùãßüî—ŸüæÏù ¼Î;?ýñOÞýÙ»ï¿ÿð“Ͻtïüñk´\7âOÐêæ]>¿Ñ†yI©5X;~îòõ}áµï¼øÆ[ßzýÍŸüüûûßýÅ~òÞ¯~ñÞ/?øè£ç^zùìíWW¶N†²½|w?ÎÖ[ƒJs:_ªN/@ŒÚœY^ØØY¿|íâ½ÝsǵKg/Þ–¯…HÀK³v/ãÄ×Y1ƒ÷â¢Í V{¦;3ØÜ;º±¿7¿2âìÑë7n¿ïë®\½p×½Ç.ÞÙ^Z•’6Z æçÙXÊ°v‹~/Á±|pÿø«{§ÓùB£RÜÝY?wáìõûîþÚc~ÿûß{ïƒ_¿ÿÑÇŸ|öñ3/¾pòÒ…îÒR ‘/DW<à$%&Ø;¸tüÂ=åÞR±Õ f××–OŸ>xöÙÇßþáÛ~üég¿ýÍÛ?zûõ7^}ù¥ŸyêëÞ×îþA½·,£y8³â¡ +äLk'-.Êïçs™Í­û¯ßõêË/¿úÖ[¯¾úÍŸÿü?þñ÷ÏÿÛ¿Þ~ñôþîFsº—ktÜ$¯³û|| .*ì¤Â^6Œ3B4™¯6û««[o;óõG~ö¹§¿ýæ«¿üàýÏ¿øüOþã{¿øáÓO?~áò¹r³æÂ8ÖÙ™#*ó¸™Ð£<$Çk±xif~yq}ãè™Ûn»ýòW®]»ëú·^|þûoÿàåW_ùæ Ï?÷쿼òò·¸qÏñcÇ3ÅÊEL^Öê:Š‹éTe^Š—=Kæ7wŽßyýÁgžûæ£ÿËWïyüñ§~ôãŸ}ïß{àÆO~í¾'¾þðÙóç6··ÚÓs©Ê ¶pRÊôo^M/[QÁhÃ]6“¯oo½rõÚ·^} X鉧Ÿþú£_áùçßùÉ{Ï~ãß®\¹{ms·Xo\âŒÙ+ém´Þâ±!´ÓËz¿¯$ÊýFufeÏ+HVŒtœÙËöÑÃÊ'}dL¯5¢.Ÿä¡"¯à%CòÀ±R4] Æ ³y¼vǹæQrÙˆ‡&m¸ÑÅ LÂIGÕN|XgÑÛ|°#Œ X¹ìMaA +{}>†¡ÓÙt¡ZîÍÍoŸ<·°µÍæÜ”_kÇ&m^­“4¡"jŒÞÅ0¡\ UÇ…BIAŽÄRÁp4"ÇÒ¹L2_ÈÕÛÅõP<™H¥ÛÝéJ¹, A·—sàB˸˜•ò³Þ@þ«*‹Áíå'•BáL½Ò,æ‹É˜ÉkÛN­TÊtúÓñ\Iˆ ŸwáQ­W›Ð)ƒ{BçPéÜ;gÃà5óþpµX[Leë…\åò•»Ž/³ÓívµVŸéÏõÛ¹BÝî!†'tÔ&ß°Ê22iƒoôvå“ø“"åp¼˜Ì–ù#Fn/ëÇÓõ`$—+6»½å^‰„d:/…R^"`p0£fBùS Þ0møcuLgá(Ç ©h¶MÍKåÞÑ™­+ås|(ãp9áp:¥(‚1F'UÄÈòÜ9jNm¡þñÖ)›7ìa’f„‡]&é`4šJ¥ ‰T&« Bð4Å‹¡B@®„pfÚ¤|xA +åf˜XûÖóa•a\ç µ£¼×Ÿ¥Bå\}qýÔ½F,ñÈP@aS.mñ§Ì˜‹[±à‘IÓá ó¨Þ=iô¹° Îg‰®RBåÓÊß$qj;f£d;™´b2!ܤ:fB$µž…Ñ £:x#¡“V¨1ù NNëþ?’Þ»¹4K÷ü;¦»åéá=‰ôÞ! @Â{oHÐ{R$å)¯’ª$•ºlWM›šî®î;=6æÎܽfgwï¸kÿÙ¯²Úƒ¢H óÍsÎóü2ß÷¼®¸ 34¥ÓI![hMÏŸÙ…æŠ;ÈÓtò6Në.x‡¥ð¼7‰0μýó«Ë·\ ”É@írGø– +D~ª´¥Ì/"g{Ùö¡xžic”F„pœ®\æÚ|Þ*.7P½OWfú 1ïÃSÒX³ ²bnU.m§;ç¹ÞYmó¹\Ü\ IR*Ö×¢¸öÓžÅYG‹”búÛÏêk—¨X¹¾[tÅ‹µ8¹²[ Ҟش”îg›éʶ/ÄÎ/†"BdWˆ 'µ‘N̦ºÍšL*…õ›+è wô¦'|Ë÷Æ"¤…J%J¯›mL,Ùåu§µCuR«Ç˜lœË'•ê¬e(› æOny®,g!b1&K«U:UO +ùrû°4¸¸îJÜtE½ S«‚³ÆÙ#R¯G•²Á®UoysÞøb šÕ ^Kòúb‚!Hš^LOE¥¸¥Vö˜AH9%?D•²Õ<æÖbl΢T¦Ö=%„Üü +èjŽÐ;><íEu/¢¡J]ÌopÙIˆL#\ ¥²öÈl!bÂƃh·Üˆ”ªõÖÇÈô•¹ "q¹Êj55ÝŸ,úˆŸÝðû‚ÄÚö#”ÏÏ™¤XŠr¦ÔÄÜšÝ>cþ²ŸYA#:·‹$\*1³é¦cÑY§õε%$LêŒ^ÀôÂM?º>víòÎH¯lÖ×dÚ»„V¢­6©7¥üª˜Ÿ&S­óâ™[>jÞG@ŠÍÖø/'1®€ð…(msF‹·‡×Ýè¼/"´„TŠSTo® JˆÔìRoãø éÍCBá©8›Ž³³ÕÞ„F¹£‹ç£½ûþ¤!ToRmâJƒ1û\fÿdäB*×…À»¾Y +’QjÆSLf˜ªíKù-”/æê[J~pËÎ$•âla³¬ÑÆäj˜´6Sí`Jy)ÌÎ{1¸¾!2 l?fiå ©_YŠ„q-ɧ=Úc ©à¢G8¨º„\›uÀF5ç8›é^t%&DŪœŸfÛ{¤Þpl3"mø_DÈãrÉ-ºaRmBªüäšûê-œ©”[gŒ~˜Èx¢Ê’š •"À‘;!y’ª+! 3Ηc\)Æ8ÃÝ'•ñq”ËàJ…T¸P"Ä2.V‚¸uk%F!…•¨8k°Ã­ÖÙäö·ÅñC?nùP™ÖkP Vbjœ)±V_Î S¹žhux³‹òŽ7.G({9¼µ_t'oÀWÕXÉöà½hŠÖë+QÎã} Âò§·‚s.,B¦£TúÏ®,Ï­DJ·³ÂÊ\PøÙ +zÅ…ƒºíß~=;çMzã"­U!k’BÆjìdú'lq.%i¶pÂùq‚ÍÍyð• !²I¡ÂCÞZ `öRXDÙ„7©Ö—ýÄJˆ¾¹‚Ìa&5ÕÒ¦Ý<¸¢Uf½Xñôr›­M&m6Ý7ª[p|ª,¥‹K!d9Bº¡ê2Ù!Rµ¸Tð`™î Z%ÀÚJ}‡ŸMÿÛklçCE€¸ ¹B¶£dO&Ó}*Ó{¹ VÂTˆ4¤ü„N÷õênº¾眫˱›t%ÊÏyqwL†RD]Êèz7!U «Çæ&Tf²ð;Pb™ÏE»§ç‡Ãõó­Ï{ᤠ+ÄDÈU¨És>üÆJŒÕŒZq…©åFˆY(¼zm3riƒ0ºDª©æ'¸Ru²"sq®¥saÊñ¡–;žBxŒ^®± º†ûð‡îÁ“îD )Ggó ¸Žr~UrV—£œ?Æ¢BÁ‹j³:0…HURõ-»w’î%å˜÷êúÜlPé&ë •Ê†Ó;mL ÷Ÿï=ü× +!JÖò£tm™ulÎB‰ ŽVÙ0Ún,uËGÕýÚÖËúÎ ½u„¥Za¡ä§mÆlç»G\nLÕp½F›`_‡bqLY-©<6kµµS£¹•`Æêyïämió9™Óö„¶Ç.4Õ[½xòþÇlsk1ÌÒéqBê¢b'S?ÉõZ 8ì¸17ðÆxPœ•(øÜÝáÁë³—?'÷áð6Ÿw.—B4£WáIaýaqãq÷ðíÚ_:ÃK(\˜”c3­¸ Æ,…ÈeTmºQ\´+ƃٻ~†°‚D&0kÑYˆIU*·j î*­Ó¨\‹²–˜ë2é®Õ ­Î¤Ûb~œëŸÊ…IŒ2 ¶yp×aðÃ@j„9 A’Pê@ÒŸà!*¯V¶õú>nt±T[Èo”Vg»@²×WW„x9`Ín‚«\$´ŸéA ‚Š±˜uýJº¡r•‚Â^XsEù?»º¼ìÃÿ£ZœzÝÝ5šG¼³ÚZÜÝzš^¬`©y?ŽËe0¨PBy£‰0 § #Zu§»ˆy8_P"©8Ѫ[VïD*oÊvw¸qïñò)6ÝÎtO‹ã;ÙÞIar7?¾“ªï…iKH·R¥É@_˜̘=«y<¹ø¢¾ó|Ö7Ê¢R>@YË i>LG¹“dú÷VoaTÖS•i¶w—²sA,ÎÛjym|û“Ç_þñüÍ­½gTº•+õöï½ +£[\ŸÕÞÏ´i{Íîœt·ï vÓ¹Á}­²)M>3.ðͺթ¥þqur±a¯,F=ˆ +~@p†”ÕžíH¶ó>×OkZyÒÚ{Ò?yYß~P\»«7Èt‹Tò¿þ›ÿrïõ/¢œ¹$µêA~ýynõ±à¬/GDðŠñÉÎÅç?]Hñ4ëLÓãû•ƒ×õÃÏ´îm?—W²ÝïÿðŸv/Þ,‚¡Â µ²UZºsùËúæK_R¿r®æ!nøð…çN¤9›.t˜ˆsocr U.oä×Vw^Œî~³úà¯@ƒ ~®.¡íé%?uÇåY‹KÀ̤Œ~cç5Ð: pUÀ¯²©j˜Ð=q ü˜·£Âléh¼4™¾þÇ‹£´%L °B®ÆiÇ­L¡ÀÂa +a¥0ãNjpÑãbŽ4F}·8¾ ßVÚ£{z븾þjÚ¬n˜Ehƒ·êaÊðaš5\1m9,…ˆøðüP09­¦úa:$U¦&µZaxÞ9ø¤sò¥–;Ó‹ÒøvD´q½n´ö•ê6iõóƒóÚúc­º .…6Ú™Ö¡QÙWªDff 4%­xÕ•‹ —m¦Û§V÷L«ï¡R‘6êÎàˆÍuC´ÅÙ}¹0®MNqñê¯&§ŸàFµ5:|öþ·™Æ&¸,gp÷ðéož~û¯óo¸âNL*.F8R®æÚÇ+³y#D”±A"½Éà¿\Üð%µëî¤;&ÆYÜ]˜ÍÅ¥2—Ÿ@Ë †Œê“££G$gˆHN„I!©Z"Õ€Ð* Žž~Ÿin/ǹ0“©n¾å‰{Ö YŠ†SÛh­ÝYŒ³9ÂháF7;bi[¬l¥{ýgw?ÿCsçÉu ²¢”·xg UkÀPs>ve–ËmV¯ýÅ\À•ù–Þ< [Ras9'br!DêQ6³}ÿý÷¿ß|ðE÷ðRÛ÷ÓÙ[þY+˜ËÏÿ.Û>«cóJac rvûÈO¤¯,Æ‚I©ÐÚâõê…À_\Yž÷3˜5Ô:f÷"Ý9Cùj„´%{#íëó¡y9ç¡æ|´ÑÀ_ù²²³yÞÛÈ®ÙöiÚlƒa‹ë~Ò¤Óm.?B´*¢Ô8gJe×H³‡r9ZÊãB6ü€H¥ ¯Y»ªYÃ1Loµ{l77¯,‡nù1f0é~qr¯ºõ$7;uw˜Lç:á …ðØ°» (žF;!×X{¶:7`°SåuR«°z¹>=oî<®o_æGǫǯú{ϤÜP+­V§jÓ{ÍÍûbe3ÀWPHÕ,¬:­£ù}ËKÐfW*nŠÎTp¦Œ5\²~TÅÄ"„4(˜"£±ßÚÿÌœ‚”iÜyõþ×ÿ(fûî„gm>7-Mì_þâλ?6ö^Bèz’’Q›Ê• i¹店ZŠŠ1Ö%Š09ÿìæ@#ÂdæC”Ÿ°˜ÌØjï^~õòû>ÿ·z÷öRB£ŒfL(©Œ ‘ã\!ÉW9kÀZˆ¢«+qx[µºkššmu$8¢3Š ঌÞ΃öÆtc[«ï™IRïB‰J›ÝO£Bu%¦*åÙE×ÿß]·æƒÜ 7¡¬bï8Œk?»¾ü“k+>£+–w¨Ì(Â:7}¼È"R}ÞK^½é÷Ä¢ûP0*Îå}³ûN¶BðN¾±™à³ Fp +f÷\®ñ…M³wNÍ:³‹à]Q­¹1 ?ñÆ%o\¢)À–¢ +øÒŸ-Å®.ÅX5g<븾_Ë€WœC˜-ÞJù¾YÖ'ãtª28x18y]^¿+‡˜Zˆ‰N˜™u'“íÊfü1È]pvìÞ£òÚóÞÁç±Yóg(/eµ0Ñt%D¦F¸"ïLåÒ&iõ%ZëÉY’Ï TªÐÝ[;ðü—Ç/¾üåßW¦y«wùø«×_ýH§6KDzhµNÏG‡oBígËÈu¨!bE.oJàÊžÍn{YÍ´^}û·Riý– ’Yzƃ›xªyVa3`$\q¬£ÙØÏtŽÚ;—§/¿Ÿž¿#Ò}5¿zþäK”ÏpCίešûP`íö)mMæƒìJ„!$'D33ïÆ‚DÚîžV6‚·!Rõ8c¥««ž„àŠ Z»O³þðûÎÉç•íçhªue Ehçä鯒©Ê57²ý$\…2¸H§ß<¼áN^_x£trv¿YŽK+ "Õ:riÜ)|¢+ˆGIm10k7åòI­Éd‡ã“7'o~€3Ò*Q* Êgûba"–6ÔÆ‘Òº¨5”wJB-DÈ ¢7ùt\ÐAÕn¹ãW7–#W—"ó~ +²~¶{`B %M l!“ñÅXÆhˆù‘ÙÚ±:ûŵûJe“4Z&¤R•Ì¤xk³F ~MÎŒÒv˜´ˆDŠ¹8›q”:­Õp¹¹¥²´Ú Ô꜃d â ¼|¨Alk_v ÆL²¦šoIÈ”Ú΃îÁóâà¤Ø>غý:ßÛE•‚^ÙÈ ïÐ`›vÿB,íE€&GHw½¾á<À†~fˆ4)Uîµ…Ìøºê +ýdÁÂ5­05k‡…áƒñÅ—¢3”3ííó·jm*€'!…>.î äšQZ/ÏoÙͦºŒÙ]‰ W\ñ«®¸;!ÑFS-®ÇX;ŒËFiˆI"ÀéQF€MC)nNì0 lczŸPkATs…yÀÿë+qW˜Á%Çãf3ØЕºZÚàr#©¸FZ]*Ók¬ß§¡ž+ÅÆêYuz~Wë~:ã' 6ÝOUö¬Î¹+ ̈¹±^=Ô*`6N8{ìN˜W–“®0×·îÌÚÄù ?a2ö0Ý?+®]BU¿îJ¦r§±6‘p,^VÎôÊ”³šÀÞðìîJ·£I[-\-§*™þ…Õ=¯o½²{çri-@§€¾kÀÇB­›5!D-o …Y +R±àíúq_†ùY³z * :‡³N:×[ÝŒ(¼úÎåÑ«ß½þ}ýàµPÝÒÒµÝ{kû/»ïÃ/*$â\‚N›ùA‚6|qZN×D³À‚€{ä*ļ A˜Ü1~%LßtÅg­¶ãRbv‡vijÇgaƤSåúÚÉpÿÞôìÕÆýÏ·î¾Ûôåàð¥=ºˆË…JwwvãT+p™µZBvBê!·‘àÊ`˜£$˜äh3b³­ÓJq&D•0–rG8F­±€lr^°êQÆ„ÏB0 U&;PòÃÚèäìÉ׼݅éòlÇ™žUÝ•³«¤ÚðÄe³0¬ô]aöêbÔ•B¤Í¥”Þ§¡9ýÖôÂa—C³+™Öqcëi{ïÙÖÝ/Ó­cÈýÖêéæÙWT czŒ4a”<6‚«”R„l* ö£‘„tÃR\v`öN«û¯×/¾²ªÛGOþýÿüÿè¥åXŠÐ‡jå°08»ûæwg¯Ï9ë×V0„ÉrFr¤ác‰€ä²{])l‰™˜óå tÊ—¦¢òbDõ% %¿ÊX wœˆvA< "Æx 4©4ØìˆÍôõêF~p¢·¶Íö¾3¹§6¹Â*›í6Wïm]|%åÇ+qÙ‹š:O)u Öf€ úQD1Ä,†9WLŒ`VM¡”eä;­õS­8ªŽ÷>Íörƒc½sLfWRÅÈõvO^NO>óÎ|ˆô¡"&•Y«Gh5ޚ͵æZ¡µr™ÙMu2M¤ú”êÙt%8AW”[ 3ã ¼‹AzÖ ŸÊ`Z™É´øl·6:þþÇÿðÇÿñÿèDB zsyx˜ç¥ÖöÜJbÁƒ¡àär”²– Ôù(iÐjU+Œƒ¨§38‚Õ6j[âlN]‹6{ŒVí¬÷7l—òkRŒHõ‘ºYbvÞ‹“:Âç«-&ryÞaL§:¸÷ô °ë”9tzóýZ~Í®nåuT©ÝòR‚^/µvÀâ^[Žºcj”©p™ÍÉñ×£Ó/9{4ç£8£®eÛ„ð·|?Y‰Ï‡%_2ƒI ½²™òÎò%å+óAxÍùqB¯[ÝC€>ÖšÛzãÐ[öleôÄÏébiT»»õdûÞ×çŸüîÁ»?í=úŽÔ«tªŠ)•(…¤ôšÓÚ³m"Ä)Ã@;Vx’±­¦äàÇjã;a8S/JÊ„ZÉöv}uúú¯[›¿ùåãP«ˆ\Æ”zR®²é^Ý/­½h¼Wë»´V©OîæGçJi °%:ëvkÉœ’Û@øÒO#?[ˆÜðS¨1 à'jË;ÛU¥ÔZ®{””©Ùõõão¿øõߟ<û238þø´½uñùÚù[>׎r¦ZZïl>,ŽS…‘ÓœòzÑ!“lWªAL[‰ò`=15€YQÊFù"\÷k á%/æ‹r¼ÙRœ)‘ê¢RÕÈ÷7ŽŸ¤«LÍéÁé§÷¿$,¬?åòk>4U¨m¿ø>&fB„‘@cL.NçÜ!!Ž[’Þ˜lÝߺýéÕ…ð•[>Œ¤PTÊ[lf—D­ÜÝß¼ýx9 +EL­&å".ÚRs=\).pJ˜yTOŒõD¹ ¢.û (baL‹â©[ËÁ.SjÁ ÒŠÝíµS@•çfû¨2¹ •Š‚òqòzæ`Í <1Be™ÌPÊsž$¤@”H92{F™CiË&—ýø¼%„,¥~zÃó“ë+ymåÚ¼Á‡°”dÔájƒýtyÕ"E£ R¤Ñàœ±VÛ1;'õ­µµ»›gÿþ¿üŸûÞ3 Ù}£±”*—v’©Z×h)¿qø*Âfo.Ü!o„pÏv·ÁÁH(™6gT@÷¼Cm¥2­®ÝnoÝ/÷÷žö‹Gï~¥”F¸ÞÈ´o§›ÇÕÕ˵ó¯ûŸvwžË…5»<=ºÿ–Í”}¤ár±Y?±¦äL9{5Hf\ §íÅDj)‘ºæ%çC p–Q;Ð*»œÞ8¾ó¶³qÁgÛZuÖÎ¥²þtpônÿá/.Þÿ©²þ >9=}ú…VÛU +c); µ2ÛŠ½F( °CkKa2€§"´-¤×äÜ&~œÉ¹aÌ1“QKAúš “cË ÊAPC6÷Ñ„I³Š«E«WàsãÉÑëþÖ£Jw¿ÜÛFåc”ôüÀ?ÛE`ioB %-‚Ë×{GíÕ;×c¡¤£RÞ™?)V7;ˆXêmÜn=€: ¥zŠÓç­Ù^’ÓÇÔ*Æç+í­joß&V‚D(©%Y„2”TWü¤;DN'[ûc,-å:[û—ö«5“©N”+n¿üûÿð¿ªëî+¼9àÓÆf›z0¢Õêì<1JcO˜‚pZñ¾ô¡«f2ܤ•Ú‚øsˆ®¥„;*&3WâD +éòÚ‹¿õ$xDrH£ÎåÇZs×îŸ:Ýݽ{_üúŸZëw‡ëk÷›ÛOÍæžZÞ&­¡wf!DÓî|öõ?1ÙÞ_ÜX¼¶àH\ôSQ +½ÁÎÙÓ/„\Ênµ¨t#UØíÆÖEqr”ÔŠfc³0¾ËgG) Ñòi4egÈY=£¸^ðvÙªsüx:L§£œíBµå˜D¨ ÞG¸|B*/Æ•+.Ô…¨!ÖókDªÉ¦j»§¯;ë’ÓÓ;¥µ‡­ÝÓ³÷'O¾í=7šÛã½G¿þÇÿ*×Bl–²:lº ÆR)nÜ•{è ^mrw¶gÊǶÀA½‰.Õi½»b—Âè#ÄØìéól›ì!ìÚÆc1×çõÊ`ýn_«¶§½íûlºå'Rˆ˜‡¨¬À¦;¦É†ðLK‡ã2B¥ôæ½$T{1ÝXŽÐó!ŽwÖš{¯r£;rq-Âçô a”‡ !—”+`l >ëå­YwnHÞeÄã¼Q~ÁuWè >®\CØŒh5ÅLÓ¨® OßlÜù°uçç{÷¿ÜøEíçÒ1Ò"¤bœ4BÉÙžMI±‡%ôÂj>ÈéyBT,©')ÛfÒ„òŒ±K>ŒëFy¨'É[·|äõ%4W¼15)V¥Ü*k¶ü0ÁZ€<ˆŸoµw‡Ïw~Ø}øU÷ôMLÊAÉí¼¤³T«aZ‘+„Ö 5ƒNëÂOj?½áö†˜žö'4o\ð#BÞ½1ܽÿÓK~&m´¥ÒªÕÚ©î\fVï‘™.oÖ..?l¿“fœÉ’Z˨îwŸM>I×w9àåÎÆw?üC}ýÑŸ_÷/…H?®…ǬlÖW*ÅÍaì\¼SK«W\‰…0br1¡¤Ld5¶*ý½í“§ã£g!Ödí¦^[ÓJC.Û*OŽuöéïq«í9£ ,ÕŠ0Ù¨“ ÒDZ®}èt„vÝp ë7Z-ñÌ\€Ÿ›íc®]óDÝ á³jeËìÞÎïÆ÷£¬ãT×?|ÿ'Ï¿– £µ­5¶”Òêv”¶B¸&ZÝæô1•j/|ôíþ¸˜pmA¸8êÁúgï~CÎnŽ¥gÂæ&¡ÂçVsýóõ{_kåÉd÷áåg?4×ïù“F2ŽÊÍö¨âò¸8{ÞNJ |þ¤ì‚‹I·|´I…ؼZÞ-ïdª«ƒÍ»÷>?zùË×µóèK¥<õ“&•ª–†·››0)/ÚT®‚#\ÎÝaÑ“}>§JÍ]ÕîÿäºwÞ…„9ã‚11˜4ÝqTëÛï@ýÿ‡ky >YÈ­jå­“ÿÙ|܇Jƈ°¦æù|¬ûèü}}÷SØ`²}£¹[\µD¿÷q.ÐA¦} +‰s‹±Yÿ^\£ª+Ä\m_[ +QQÆŠp/©»’²àtÅRÑréöNÿäM~|QÞ®¯?¨LÎÅl üsl¶€¥Å-T,‚˜ÝH7kíñÑý—ß(ùÑÕ…Êçà.Ýõ QÙ[@¤‚ÝÜÆS•ždº7cœÈÑ µ¿ÜZÛ;{ÜÙ:‹Ò†3¼=9ÿùÞå÷;÷¾<íì^êõLiüÝÿã³ïþÉK¦ãœS]{¸zú¡4¼, )ÅifÊ#Îl¬Ä¤knúº‡^ŽjÂI*ÍLcçÁ›ïŸ~øm‚K¯$$eFÅ"k÷«“óúÚeiú,‘j&8Ûî@­ŽK…Ùr{©¢¬0in=›mçb\.©ÔQ¾!,PX`€ô$ŸÎµ6"tƦ8»W_47Ÿl^¼¾œ=¸4ËO?ùæOÿú_›“㕘B¥:´ÞaÌ~œ+ø’:NV¯c¢³"½I…µ:0VTºW˜µåù:ß=Ü9¼üõÿ¼~ò|õü³õGßÖ?­í}²zç«í»ïwï¾+Žn—ûÿüoÿ÷Ûïþ.A[rº#fFa̤$Ðñ‰šéCݸ¶ŒñéNWo¬Ä¯/†rÍ{c1 áÊB~·ùÎhwI³ÅåW™ì˜ËO¥ÊŽSÙLÓnï@FN/?>k¼Ÿ¿]|螾Ϯ>Ëvuëâñ·û¾ Ìivò³Y%g\aŸÉlζw27ݨgö¤€[Ò1qÖyÆîì¥;ÛåÑþ΃Ïw~¸ýòkgo +“ ÒÄÅ"õñlŒ6}‰Ù|3Æêק:;/2­CÂhz9 +ºC+1Ö ¼©5˜ÌD)fZ§|¶¿œÜ 1)åj\qPʲíÝÒà¾*…!!çJ£“ÆÆýÚÚEº¹—ëçzGbn) O~6=}eÓ€oùÁñ¬•Ma•Jf;†¨‘ºýð}±³çŽ+ aºãªð‚ÀvZÛÞ|ßÛ¼XDh5µ±gõo·w_Þûô÷/¾û—ñùW¨Ro öo_~N§ÊcùîíÖîgý£/J«/ÕÒ8 ©ß{úUypvÃK.‚ÂF…_œ kç¸4½D„bkt<غ¿™”JTºËاsÂQ™>´j`óÍ-1Ór·<ÄŒÊÕ¦à¬iÅÍ n¸¢œ`wK«3M'” +®VH³eM%Û-õ„t£»÷ôèå¯*³Ý6ÓNpYB.Îœ<ýæÃÿºzô2)U”ü&¥µI-˜àf3ÜØÍåä‚K•6W¢ìŸ]sßt¡ËÚ•"d–Ô»1È*£Ø}x7 ÁòÆíÇß¿þ±}ø&)«“‹­;î}ú»ñÞãŸýftú*Óßë½,ï¾0úçzmoëôí½O~¾jÓ*ÛÅñE®w*”vcBe1@]] ßp!I>‡pPˆGÅ}m÷Oâ|îàèñ»oÿ åZI!×ÜxV[Vè_h¥]7"/†(„²._|ÛŸÍÍ6™5Q¹&ÖíîíêÆÓâä%ž½ùÅý—?„“i ‘ÁÉ»»oÿxüúF÷,LgQÖúÍÿe÷ì¥Õnºq/ªËųyJ¦:·¼xOµ§w +£ó… &Ì8›@c3=£¾—ªnsFõò³_¾úêߥµ(æf·â· +ýÓ­‹Ï¼û±³û‚2z„Zí±U®¯Äþò†çÚBÜ ¼®€Rg~6'•luË‘½èfŒ-̶EMJ©#L†ÒÊba\šÜ©N/ ³/ÛíÖÆÃöî“ÁáÓóÇ^ÿâO ­¾qûů/¿üÇ­GzñÙ÷ÿarûs)?)·ö|¥W×V)@X¼ÙaÔp®7Æ'(Ã. zàüõª¡&pvן—6ŽO?í¿PÊó—íý§Ùñ¹=¾Pë{Ln4›Õ\ƒr©­ `#z5ª6€`¬áý¨Ñ÷RNBmй‘Ñ:H¦êT¶GåƘÑcÒ}BoZ=H€ÙVI¹ˆÉ"gœþéêÅ—“;_¶÷?©®?Ì  ¾õ¬ÊxûáçzsÛjíŽï|‘ÜÊë‚3bÝwúÇéÚÐAœ+º"|“Zk kæ¼8œb(­Ž NŒ¶¯.Æ}¦¿zòW?þç%/~}1æ + >/9kVu/SžÒRz¸sÁ[µÐ¬=×Éo¢lª2>nl=lm?¬¯ß±;;jaP›ÜÞ¸ÿ~ýâek늧ÕÜáó«˜V3 +ÃÞæ=)Û›MeÑg~žJä•ÁUøžÑÊî(´‚ÉùTe::ysòÉï6ïÑÝ»Ü<¸÷Ÿÿí¿?ýü7Ò¬ùÕnqz™éÞ.ŒïM/>œ¿þëÉíÏÓ;/¾þ¡¼ág²©æAqú¨²ùjçÉ_ï<ýMÿöÛÖê¿ù×ÿýóo!6çF$åÆô¨\Š[™öq}túäÍ7Û÷ß6÷žöŽ_5÷ÛƒÃîÁ“ñÑËÓç¿xôóA k“³‡ï|ñíß<ù¶½÷ÂlîÒÖln'g¯ú Ëçcl.Â:P¹ô@)L(£IgÂfÍn„ÖWbx3.ûñbeú¨P )€¯Áîc)ß³ëãúpÏé(åÂèãj‹”«qʘÿ¸‹4„D”4àO|ˆ:Û8 *âR9AÛðC\*€*j â[vÆàÊÂTSP!&øŸíºQYíî\NN^ËÎ )ÃAÎÖt|œqGQ%À«VÕÒZœ±(`šäGu_\öD¹0¦étyr>9ý¤µ}i4öPµæŽKjºm•VQÞaFR(‘rCÍH¥Àµälé½â"˜qc ¹>½6^ ²m%“ÖÊàù¯Ü úcüJˆþÙBøº Y³®˜à°¬^N +vR̦Ûû™Î §Úy°CããÖÖƒâê½TuSH7­ÒÈéí2¦Ci¦ì´øL+Û=Éîëù1 bXÊ „tgÞG,(8 `L,øÄؼ'D rs¼Ý6[{ÕÕ;ョÛ'—ß|½ztÙX¿»ÿä»õ»_Ÿ¾øÍîýŸWF'Z¾k”ƵÁþù³/ÔÊÔjîõ_m\¼…ÈOôÚT,tóéów¿¾ÿÙ/#\.UÝ•ŠVëxçò—[—¿,N&›çÿð¯ÿëå‡_¥jÓÂðìvïðñÃÏûËüoøOÿ×7ûowž}óãŸþã»_ý£Ù90ÛjmÏÜ¿?}õ‡éÝïH³Çëµ ~}Û>,…Ê…¸T’kûí½OÆnRr:ÓÞlÊÎ$Uߊc0“œ=ln\=û“®ªNK+i{ÐØxÚÙÿ,Õ8Mˆ pþri‹wVIE²ª†ðÌÇÍYÒËQ‘Ôê¥á9k¶‚”‰ëÍÁÑgµÍGRiMÈY»¡g]hbœÂELÊ0F…M·¸LKÎ÷³ÒÀ€ý:Sì@aä2ý(eùbBÔ$Ý\z)× 1™ ¥©ª\ÙÊpÙ •ªsj‰ÓJ˜TPr}?¢.XB.©ùcvRÁF†IëÆ2 +Qšäk\ÄéŒ+ÌBžÍ L(„˜‡.‡˜9±æýD:!äg;æhåTy\ŸÆù|®ÔÉ6§ŒY1««Ze()UZϵöíö.Ê ¦#ç[˜œSŠkZ}Ø|­5Ó¥­LuÓ쟴!4_Bšs'®/E"T†Õ[kƒˆÐV³9½»äûø‹ÊÚ c•Œò`|ôÂnm:Ùæ:mÔ01'gjnh”&¸Rtº{•É©m“F+!‚Ò9R®iº…ΖQøq­081Û©ÊÆ`ïikzž+w‡ã­7¾ÞSöhïÁ½·¿zúõï^}÷§çßþáÉW}ü⋵£{/ß{þâÛÑî“‹O~Ó?y7<ý°qñatð¢0¼” ™âð“_üýèøåM±fH½&8{ø ¾õœÒ«‚^zÿíÔl7€›aÞÑ›»…ɽ»_ï=ý¡wú9ؘ‹Go?ÿþo÷PµÊç'˜ÙíQ{ëÅáóßV7Ÿ$øìã7¿¨¯ž­$Àj7¢Çø®µÓ'`Ñ•Ü`°~wõôSÔòê9›íÅ„“îùaií‚L·˜¤äZà'Y³×"Æ¥1µ¢ǽƒWO¾û—öÎcHóTyÌ¡'2k@T°(Q8‡É9c69½’©Mát*ëÏ”êžjÅY`ê>g)·ÄL@£²–nn±é.Dˆ•ÀB/!Tª‰WTâsxËKÎû©å0· ං^[Ffë8üÔud²rišj쪵 ¹¸*:c?f©VWrî8›Ò´YÏ´rƒ »Îåú‚UÍÖFJ±"½´Vž^Æ÷+kh£†³ˆq® iØ+ßóǹ9wì–+¶ €…I¹Ž‹F©6VÏ“Jž3kzy\\=“+SÖnÁ˜”WZÞ— ¡Ðf/Û½íß™õ¼âr "ZqBšM(³Q:KiUµ0² PØ]Èz"-‡(RrBIÉ›à\ã,UÏå‹íbc•7ŠZ¦Úít·Ok;¹öT.tÕÚÄîíVWFÇ—Cí;wßþ0ºýFRµÛ”ì$h-ŽqùRoÿΛâðX5U˜fk»Fy]Ìã|6’¤å”yt÷)Êç(s ×+«6î}¹ûè«Õ³ÏÌú¶˜*|úþ»ûïÿïîƒ÷¸Ù¶ÎôYçüÛG_üãþß×&‡F¡ñÕoþvÿÁo2µä¤ÒNvt¿µóòö«?d;viüé—?>üüÇDõàF3Ý_?ÿpñögŸÿ­Þ:¬Þýæ_Ê£Ó – +’ruírçò»G?ÿ»þÁ­¼}ÿÕ¯òÃk+ÈÍd%"&¸¥5 ÃÉñkÁ¨?~ùåïþéaôn åÚTÞÕêG;}òæoÊ“Ë}ö~ø­U›Â˜ÏHȬ ¦£|‰Moù¸E?}zçÍãWß„0í'7}?¹áýó«þ+‹HÏs£2àýÚë¬Õm¶€sãÂl3#Z«d%¹t*߉R©(m`JI)¯Û½ÓöæÃõ‹·Z}+Áš…öž^Û +2³eVD]Žð~D¡åœd”£IÞÁhA÷G OŒMÈED­†fKüjˆ\ñc²’íØíÚÎãíËoVï~ÞF(J®+Ë9@ú+Q)œÔ™TÃé©FœÍÙÕu8¤¡©ôJ\ QVˆÐDd³ÊÁÔ\çR^2›´T cz’±2¥a®1%ÛÅq)K)ßíî=Ú¾÷vrüB/íÚªQ¢3[XÒuF. ´A iR´½qaÞO„>>ˆ‘:Êš Ú‚" ¤*´˜#;˜Lár™MÕQ.ƒ +6©àv+[v'GõÑ¡ÏžfvwŸUÖî¤kB¦&˜ÅT¦hØED/ª,…XV« +V‹TK—ŽàJyµdU7¸ÜÄ›4ÒÍ»{¬Wû»WÏ^—VÏ1Á®4FG÷Þ8ÍmL(d[»éæ¶VšðvJÊÙ1Òäg}½ò ~*ÔQ©ª—wÒC9;¢Õ¢bäkÝîÆü‚583{g•­Õ'Ùö>T~B)a”²}üdëü5ø.°‚*˜jivV4[ž0ã5M·>ýðÛwßþÀ´k+Éňâ!¤Ñ³{çvû(•©ýêÿüé׿s™ë‹qOLóŸ>l|ˆ±¬œ³+#”MCÑÀ•‚Q]ï×Þ¼WcJAÔòëû+ƒýžŠRi>Ó#µ¥£˜à ã.<š Y‹$JÒZ©°ö@žuð^'6%Ù“³ƒ»ŸYMÁ陣q”Á¤Bò–*ã\(!&Ù,ÁXµ¦×€ËX±¤˜-Y¯µú“ƒç!&çío‡±”7ÊÏŽY²ó­MO”^ô‘Ë&Ádà ­Lªy `CΪÄÍ(Ëã3«y¨7Zë¬Úvœ±Úã“J?ˆªÀƒQÊŒq?žGø¦` á|aT3‹z®ç +ƒ“Ôü3 +ÓÄIå™'¬ÌœI Wª©ÒÔ,Œ )†*ˆ©älöx†äÍ$k$9‹mð !ÜX ~Öp’Þ0í‹rðA´0Û瑱:¨Tö#‚ÓÞJ·6„BHYÑn2©²dÕlCHå1†×ŠN}Ÿ0J#,p-gZ¼QƒÓqðÇ%p¼ab6• Üü$Ž)’še¤\œ4¢pÕ1ÛÇå"®ÌVDbÕÊj¦Ž3†/B-¸âIðêlæÆRlnñq‚8ÑÈæ{•ö.Dø̱ûéSÂR-T.'¸,.ꤠT»«ºÓºîBgëÂÊÛ­í§ÃÓw½Ã—!TEi“à3 JA)%AƒaKá’ÍY5£<2J#J-(FQ±Jo…P… p¾qg¹CJªñ$⬨¤0’b%-£6¦¬zŒ³£”®™åýãGçßËv RÕnìÕW[õ£$Ÿ‹cb(FÃIÅ0aÌ®Ä ãmB©ð™!£ÖB×Íêùù‹_ü>ÊY\Ž³V×`zxÞå +à÷|Q>ŒiÊ +`)"‡pQËpð¸œMrF©·—碌FuK+¬3z3N[†Ó× Cˆ+„ËZÕÍlë ÓFZAD[ö&QLÒ²œ–¿2¼¾uGL¬’jáK",–®mÒ©:•8›‡ª&Ó1Îc …1FKn$çbÀÎlÞ‹‚!Iðà8ŒÍ LjŇ¤Ò­\y¡¬8¦ÅIã8¤pRÿi–ûî U”ÓÝrŒì`ŒAèP§ÀûÖºP4G“ŒŽ .壔ቲ`tWd‘®Í‡–½X‚01!׋6I%åâ¸Úݼ#[õ0“R>É9I.Kˆäà’'±°öpœ6=‰Eo2’Ô“tÆÌ·\SÖ«(•ü˾k‹Ñ›Ëñ¥Ù2XÒ¦øT0e´å@òÊBˆIÕ¥l?¦¶&e{îH° >ôÊœ;ÃL*LÈŒœ©õ6s55×F#ˆÐ®âó„ZEÝ©¬V§wæ‚ä¢/±èŽ,y"ɳ¼¦g+´l™ÅmýI‘×òáN©>o0L•QÊi‰ÇØÌb€ +$„HRõªši!ŒîB¸(`Rq‡X„´Ìl³ÞÝ,u×I>•ÊV!—¨ +ˆ*äÕ…è’b³S»±p'”“§®œ›¤ŠSÕéÅpI3K“½‡‚Ý@'Øýte½Ô;Ô‹Ó(öÅ9RÊRJn6³©€]Œc2B*½ìzƒ‰$)Ç’B ÀÀ¸J™>§×!B˜ +¡äÆPshchTO¤ì8 +ž‘1>¥\‘ÂC"×+vƒV +AâÚbÐHN·ïœÜ‹qOˆF™"‰j!A¨q\ñG™W ¡4ZÎÂP@}Fp §$ŠU1V‹&q¯?ˆ$qŠU ZØT•R+³çÔa:1ã®\÷xü¤'@,.EoÍç£î$¯F 9Y/ƒoqÊ­Û÷_“RΤB1ªJU¢¨L²™¦­ø’f~”.­Çqãì*/y±Ÿ^÷¯Ù®Ãñ\½åÁYƒU þ(ë‹Ð+bn%Á‰'1:IŒTÓƒ›îøÏæ|yÓ}m1Ù¡¤«”h˜içìÑ«”ÓrE™*'X‹PÊ”ÞNJe=wq÷õWüŸ|„ögWo,"/¨yÕ*™ùš¨¦Ï¾Ú:{Ä¥/â‹óÞ(çq8o1Š%¦2™|£ÐÞåõ!æ’ü,UÙB –áY/Å1‚RÑM°ºUèœ8…x7óÅ(-zQÚ›À#(-ê5)= c¦Uç¼ 8åØl™Tœ@+iÅh(&¼' E8ÉÉ™ºÓ?Š±é¦„Q þW2*šÝtEÈ›®¨;B£QB>†«î0G’-Ö§çæ$Ý! ê¹^ú‡ï´ˆ¤œ¯Oþ?’ÞüËó¼óý#î™IìH"Ù${oì; +…Ú÷U(T¡°ï{ ô‚ÞØÝìfwsß$’¢Dj³6Ë–-Ù–cI±œÈ3±cÇŽ×dl'¹3ÉŒ'3wfî9wîœûë}à9§Ï!‰¥ð¾Ïóý~¾Ôûê…P )˜V©(©Åy›Óêe°›ÙNºÐó…1tšM ¸„à2Š‹ÞPÌá ™Âá{QŒ›žñÍA¾žrž¿è…!XìŠÊChÒļ¾ðì‚ûÂœÛí'Tµ˜·Ë¥œžßZq™v€…y/.g£á˜ä rçg¼Ïœ™æÙy§—¦å2)äü!†¤ºY4ÒQ/CI£<Ô°ÖìRäÙsKç.¸æ./Fòv•áéùÀ‚ u„4#¤í +òS3Þs¬’QúùYïìRÔá£âŒ¡èå8¡»|Ìôâ ²“î˜ Ìºbþˆ'·ä‰â4GÐ'…\ªÑïÆÞÇ3W¨wõL!.ÈÞH$$’f¡¾¬åÛÏN{.̼!P«Œ®Û |‰­–s«;;‰\i1„Îzb^DDé%%’é”]°í¼µ¹¹úà¥Wª½ñÅ¥À…Eß…y7N ,Çiš*ˆb0QUɶS G¸<‹>¿› ¢–%Kæ•Ã­Ë'û½K«¹fN5d>‘‘Èðd·_g:—JR’b¤qÖ´ +T/`Ï‚# o‘-7Š½!§g¬båô0Æ…ã¼;HLÍù¿0åtE¥(“½¸…¡szA±*­ac‹—UPy7ÆUQ‡Þ©àr:Êùæª*sÉ2!g—ü¸?Ê „#VÐ.F„Ô©Hð&ËÉMfÒzBO²‚(+2Ç"FQH»_HT‘ "\ DEPÁþˆà q¡˜„z(Êz}^¿Ïåóy$IjÓ£Fvo­~ûdxýÊÚ«¯=º´?6’zŒ’Þ‡“ÉÙÅÈ=3{æ¢Ûé%ACœÎp4L’8­) UQDQE01Ç …ÄcÍb„Àp–¢W¼zjÖýÌ™ÙçÎ9.Φ'k…çÄsBÏœ÷Ÿ .ºq—ty¢¾ ’Ê–"(A(I±A`~£Ó”Yô g.:\H,Ƈ‚qŸÇEàMŽUóÂJ×^[oVšv¦h5Ò§—z÷oîî\ê×jfµœ6Ò¶¨Af矛šŸ_ôƒQ‰åtžä1oZEÇýB¥nÉ:'j¢œ2hžI™R¥’X_¶ž>8zòÒµ‡÷v½pP¬..x..‚Q +äIDE <ªñ±^59^Éwj [G;euoµøôá!ß}ÿþ¯ÿêk?ý›O¿öÁ“­ÍjÊb‘CùÌdó\,E³ÉŒjÔÍån¾Û.$UÞN›'8}AŸ? Hb­^n¯´7v¶¿ùÕBwàEcK~dzàôŠáÌ~L(žŸž93G+•ªTʹ|: Óa¤y¹^+_½y«Ù(¦9Þß6 ùJ¸#8­Ú˜”V3”U$ÂP ¶e‹ÕTR˥Ĝ†íkÇ—×–[ùzN½4,¾xÿµßóÎ/_½ûh8lYi3FAÔãÇQÂMÆIC1žÁJ6ß©ê­Š>êZ'ãì£+wnóí«½yõw?ÿÞ/ògo¿|z¸¿ÞlVEA +Gñ@䎊³ɦ¢Pšq$¯Ëµ¬^0ø~ÝÜV:Åå{·¯ŸŽÜÝ{óÉW_záÚñµf½i¦Mž§ƒÁÀôœ×¤çœè¹™À¼;;å8;µ4;ïõù€7 ÐDÆP[’® +K”‹ÙR©`¦lËÌGbôsç— aݾx4èç± J¸ª)äÊ(õÒÕîýãÞ£›£Þ¾ý¯=øÚ‡¼¼öÛï?ù§_~óß|üê—߸µ·=´m%X‡Ëëq.â!—- ý,ÖÏ…6jØõMóÖaýê~ Ž;'Ë®÷ßxaãÍGë<Ýþí¿üþê£ï~ýÖ GålsyÜ ®0FÉ8%"Q„ZzÔ®­©O¯V?|åÒ{/®¿ópåÃW·~ö½—ÿéWýì»ùÝçÿé§ïþÏÿö«¿üäé›v¯v³Y;ãB+c*µ¼¸Ñ1ŽVÓ+%|µF·òôzÏr[+Ù[—;_}íä7¿ú7?ÿÅ÷?üàÕ'öWA¢]Nw îGÅ©yï3g/úK:±D$£ÄtÖ­s¾NIµ-hÃUëí'WÞzõæÓGÇßzïþ?ÿÆë¯=,W­áúêòÖéðð)—ª‡|n…‰¥´‘"®¬/_ë=:n¯¨¯ÞêþÍçoþôówÞi÷OÆ÷Ãwþå>ûýo¾óãoßùýÏßùñ'ÏŸlæT&ôÎP,‚’ˆ×`ý£ýà øç_¿ùÓ¿xãÓ¯ßýÊãÑÇ_Úþ«oßùÝßùëŸÿñ7¯ÿþ—ïþã_üúãΣ“úþz5ciÙlVÖ²J²È0lJŒ¶ÒñÍšpo·ðÖó¯\k=½ÞøÞ‡wõ£÷ÿù›Ÿ}ôËÏŸþ÷ß}øÿý?ÿø»Ÿçéî§ïÿìó×ß{z%m¨WôÂ|ȤF |Ñ€;rŠ¸OƇ%æævñÆnõpd^ÛÌ<¹5üì£W>xãêo?ÿæ+-3í±QTdq¼`ú9r¯Å½°m|ð`åÏ¿r볯ÜüÉÇ/ÿû¿~ÿÿýýO~ó7߀øÝ¿}õ÷¿þöw¾ro­’6$†5#C“„L!5ƒX/aWü½Mãõ“Òwß>øɧ/þáOÞ½ò£îü‡½ýßÿÝ·ÿó¯?üõ÷_þ»Ïþò{^¿¿UJË,Ç„8½á0ð„¢uu-ϾvÙ|ïvùk÷›Ÿ½µó·vï¿ýækÿøÓwð­[¿þÞóÿü“7þñ‡OüÓ¿þæñÏ?¹ùý¯Ü¹\­m/ôQ˜D£ØxÐØ^În¶´;Ûéo=]ÿ«o^ÿô­ÝßÚÿí¿ü‹Ï_ýó÷¯ÿÛ¯ÿßÿñÿú¿~úÏ¿üÚo?ñ¿þækñáíÝAEÜçæ]þh4Jª,;(É-#ÜÔ|7‡üãËÙG—3¯Ýj~øÚÎç_?ý佟|úè¿üýg÷ƒ·÷£wÿå·ŸüøÏžm·£U»:âjÚ´K–ÒÉ0{ +žþáÃÁϾs÷o¿÷è/¾züÝ÷®üøã‡ÿù×ßøùg?ÿø§ßûO¿øê¯?}þÓ'Ý_¨](…ÏÐÜܼ÷Ìss!—Ë`üý rº,ÝݶŸÞh½ÿxë'öäŸñþ¿ÿë·þþ‡_úû½ùÓïÜûé·®ý嗷߿߸±žlg¨”Œa±(#è“LšÕN»7î—ún”Ço ù¯=ZùÞWNøÑí|ëúÏ¿÷àïÿú­øÉ»¿øìÑ/>:ý‡ï?øOóúo¾ÿðÓ/­½w«ðä´YÉé0 HŒ iAJÔŠ©ªEµmâd”|°—zzd¿s»þé;û¿ù˧¿øì…Ÿ}rÿü‡ïýÿø—ß}÷è»_½óò ‡N‡& ÙK Ó|¤eáúÚP{õ´õÉ›—?ÿæ¾qç_~ùÿõ_ö?zë¯>¼ñõ—÷.­WS †À‰(&ˆZAÑ ‰„­ñlVŽ­–å«kå.ן—¾ÿåÿû‹W~÷ão|óõËß|yí/ÞÝÿëî|üΕGW;GãF½Z—"« "A›8Š™/¥Ó‰èÚÔÑÐ>YÍÜÞÌ|å~ïÜøùgO?ÿúíï¾{üá“ý7o®¼qÚ~~¯¼µœ¬=ho˜¢¥Šf¶JÈ¥™W‰µªòè¨ùÉ»?üàôWß{ø·ßõw?xëŸþáß|òàgß¾ñûŸ¾ù/?{÷Wzú٫ͧ'¥aE€ËSz&?%SeðZ’lh±U+|o]yãFýí;o¿vé¿ü»oüþ×üö‡¯ýÓÏßû—ß~ç'öø;o¾ÿdg}W´$Î¥bT²TéI<Ÿ’©ín¦—ÁGYä¨Ã=Ú+¾y{øôÚòƒƒÚ׌~ñ食|üøÓ7¿õÒøíÛÃëkùÕŠªs(M (‘’™ž b(E#ô·Mr§k®UÅ[Ûõ—O[oݽóüÖ[÷·Žû©“å䕾µZ‡^¢ã(Šægä %fÅDQ’Ó¥\¾Ró·ÙÌœ¬V®Óoß^þäK;¿üäÖ?ÿÍÛ?þèÞŸ>ÝüöK£73/m¥žT6«²ŠðXŽœ ´åðb„Ä# U4|«./ó÷í×O+ß|iíw?|ãþþÏÿùïýúó×ÿô×Æ^% ÐëAÕʆƒ4Ph<£ñ“ëååÍfêt\¾±]yñJû£W¾óöµwnÞ¿Üêƒ<Ñ1—×½à x¢|*¿Rjï¹ÏëIÖ2Æ•íÕ›Ç[Ýuud¼r­ÿÍ·^¸¼zk§ÏÝ_É´‹º©ñššÀ˜”/žôãfŒÏSj‰TŠV¾£i&ƒÆšÌjÞʦ0nÛ§õ[—z×wZ—GåA5×/å:9ËÔ‚„@»ÂôRǸ‚+^o(àõÆÃa•fº¥âΠvu=÷¥܇/m|þþÕ?}íÒ¾qÿÜû‹w®|öÆÞŸ¾¼ýþÝ囦ÎGp€âT_LA™4B¥œ‰RÅt¶™³-6Ø6c—{úõUëÞVæ³·ÿóß~û?þú›?ýôñ÷¾zçõ{ã[͵^&¡«¼VPíe”K£œB9Ž×åfZáò]±„¼Ê”“b¿dõrú0Ç_[+<8Z)l×´º¾VN®–Ͳ&xçgŽ` ¦R-ˆ%§frfavÞñ‡š¶¡fÊ9)ÖÏñãª|sÝ~ûÞÚ—_Øzéxp8¨› M¡”’,«å­âèÆe žð`Çò INpœ$ˉZµRÌ9KΙ¢®0ŠÂ‹j"ÎJJšóǧˆ?®Ò‰bL°æ¤‘hÁ’'ß啳…z,4¦Q,_ÐÔK Íûƒ1ˆôGhO˜ž÷â³n=ëœwÇqx˜•Hd´„‘IéµBjµ›;ݪ_ê§O6*W·–Çíb¯ìä­’•ò"g¦—Áɽíܱgf¼Ó2&Ào»¹bŸ¥é„€• .'cY1¶×+>½{òʃ›W÷Æë­†©J‰GQÓAÒ ©ÅˆÀÙ+…Á­BïF¦°ÎrÉÑhçêÍ—b(çX +¤¢ëùl¶^,µm«Ä1jÀG„£òÜ"25šu‘>Ìr!º3¢†“–ó^O4D!lÎ[ð @澨Æ 1-œµLpº¡d@ÖæHÁŽ’É8›eS]97rFå/L¹œ~Á“m(©§wP*CY¨´z¥ö’ª¶ªœÂ*ŽÉ(¡.ºÐ³Óþ‘Šsùù¯¿8û…gçg£Ñ¸¬ªfBËÄbT ÁxZÐ%•F"•é¸ÌÐ )™sN':çÆx«o/_Sr#)3ªŒNå\+@g +V'Ý<0jÛ1>!DAI7ú›³~äìBp.ÀáÉ®ß2kD¢ ´Rj¬žPf{.ª†øÉM.çŽi<'5‡7vvÖˆÐ6•hÄÅrOù ËjÔÜžñó!i1,E˜Œ`¶”LWLÕ’¹)eà¬V Qf„ÍZƒÖ›¬Ñ²}ÑîÐj–Ö«A&ëÁtžôÄ0“ QigT + ”79½L)9Ψë…a"Û“SÕ8Γ¬$i6«æ§~‡ b:kô¥òAˆ/̨s ágç a1Ì•Y³ïBÄ91ç¬É±iב& +Z¶Ò1šŸÜžŒ‹¥ ™– Už››,$tF¯[õLmºÐ”‘ý¸¦æGZamÖE¸BBŒKÓZ•µº~2íD>Ì µŒÌRH˜õ01¡b·ŽÄ̈IõBlnÆ/¸|,'Úœ’È©u¹¼¥5÷²ËWäÒ8ÀfQ)Ƙ•þ1!á­åìH/ïšõËjeo&’xΟYBݱÉMCôÜÂ…¥ZÖZWR­C1»æŠ¨g§ƒÞ°¸ä¾8åŸZBÃ\žK¯jåË¢½æBňzÞI,úHœ³BqõÜ4œ¥ ³A‡Š†¨×X);·p¸#H\Šâ“ﳜi!(,E/e»qó Ï.Iåí¨R•Üú¥{•Õ“ ˜EµjD,PF5[rfP]»îÀe*Å•¢„Ä<7Àä(k¥Ø¿¾ÿü×ÌÎþ9/éÄ,&»¥ÔŽ©ô"U¼˜¶4¹-=EþáÛ±e…ØmŽ„ܘJõØ iÅKxpÃO¦P¹ÆgVåuÆ섹Œ’[±[û”VåŒVñ™‹^‰(q¥æ#Ì°P@”ªŸ4åT³68a¬åÉZâF/$Õ£J‡4Öœh*@¥Ýqm.H/I*3ZJbbÝâ=ažÓ›¸Öð‘&œ²¹sÓº1­ã‡"Ç L­B¯ù1PÊžød‘í0—'ê©6Õ¦œdŒ·]QnÆzb²ŸJ“Z Sj¸ +ƒS@¥*¡5{¸}„dŠ¡`ò¨2¹Ëfʉ]pÄysò•åb˜uÅd$Q‹$Q¥ÎÙÊhE¸L¶ µç¢ f„²T= ³c©²'/["f½,&WI­æÆ’A*çŲž¸ âasÞxrÚMFÅ¢”]•2«^ÜœñRKQ Õ:DjELµý1éÂ"òÅ ¾Y'艈AÊv!š7<1%B¥œq5(\1;äsëtvʬE¥ê¹ùxÜXÆôV²´¶wý\ÿÀE%Cb.ó[\ƒî˜,çž^žüئ²®–F\™ŽðKq#žèäVîäÖ_0—¯E'ËÆjD²ÍåÆ\~+ª¶| Æ_€>ªló¹‘ K:Q±VÔú‰XÚ'ŒÉdÚ† SË~:åFU"Ùó£Të²Ý9¶Z—µÊ–QÞ\¿ò„0Û±dÓÜhì½Ü;z¥µÿ²Õ¿ZÝ挎™¹ÈdÏBiqùídë$7º›ÞM¶.¹É=§´ÙõvT®@}ö€Lu:ë·ÖNÞ ÖY7æ$RjåRzùv²u Õú~¦à®a³¨Tô ’'.M‡„…ˆê‹ëaÚFIJÊHùuµ¼âM?cø2f `0S 6űÉxb‰Æ誘Àç °!±ˆ¨ÍX¢G¦×0­"æCDÑlñé>‘hø0D±†‰Ê¥d}?Y»´”hc™±VÉdÞËM¦Pã¼—÷¶ZÚ‰‰å n,À¤ãz“²‡dz5®·hb²jv5È—@ᆥŠPØÂŒe6·O \„M[C­²;„²TTš^_È®FÁGHÛOX|fäŠês^v²r/šÙÔj{q­»à§ç¼ÔbH†¾Ý{fÊñÅóîg—p7™cÌ!»Žk­Eë TÚ¤æ%-•öÓ6´“ÀDg:'vû2BXÌbz],®›Ðk¤µÌBš]½2.¬ó™Þ"ªV7 ^Àæ¥âd +>©jL²¥×x†—¶‡bq+¿z¿åíÊÖ‹>.bçG+;w]tz p‚ÈDÅ›ÝkFÿ:î‰fM¯ãF“¶zP¢¤Ñ¡Ó}­¾§–ÇH¢$VÆ·Þ\}:Y6ªuȶ"Rú½Ü»¼røx&ĒɦݻšY¹WØx!½rƒÊ®ÄŠZw÷_JwŽœˆ®•·—_jî<_ß¼ÁÆ!¡û +c€¦uvŸ4v^É®½˜hD¸bˆMƒnVgÊÇ.…eTªóöŸÛQ«Fë @k´ÙJÔ/‹å=:·™_»WÛyq²ªOn£°r‹ICa˜d²N¥W„üšTÚ&í 6¹ÙMɬt·ïÅļQ¡®„Ì0Õ¹Fg6ðÌzTm;cÉLóPͭΆ¥[ôàv˜/ Å=¥~LÙc™3Jë»×^qcÆ”›ºA¸ÐÖqÿê{„Þ9ºó¥÷?þ‘ÝÜ=ïãQƒ´V2ãj—_+l>ä ›TO5.:Í¥)äó^&õcu®)¥½¥ âA`1TžöÄA»¦|ül4¥|iß\¾õÅéÐ…¥¨×=xÊ·üD:@眨é¡rB~Ko\^ŠHó“Õ·Œ› ¥Dý0Ì¢|>¦TñԀɬçwû/ǵJ¢8§Ë.AQ%ëÛ\¦ÇXmÊjçGוò˜Lµãɶ\Úµû·íÁm©¸…¨õ…¸à3B~„(%4Ñ ­!i£‰. xeýnit +º-Ö@Ç{Ó»Lv](o²V»¿s{ýô>·.Ï2+…Õ[µƒ§BeWÍ–ǧ¯~å{…Ñ‘‹±âÉe«w£´þ ¶õÈî†8k\ŠJ%kFecÖr}ëÅåÃ7²+7H«Oâè6ftBb‰Î®g†·åÊ•%ª—äÒÆY²%å^ ù¡—-†å›žüÞ~íèåõã'ç¡mÃ"¡u+£ƒ7ÄÚiLïáJåî+gZûî¸AèíîÞ‹w^ÿÎ/}²|ú:›ßð39ÁZ~åÝϤìð¢_ð3E.·“ìÜ,o>^y+;¸…ÊÅæúµtck:H»H5jóZ÷àKµñýÆøêEÅŠÕ>tc¦KÑÖ€ÉmàæÔ/ݽÖܼù…7ûF넶W©tŸ¶–±F&êkGŽä1ÄæÕÒ®ZÞæók¨ÞEäz-Z§0ºÿ>åæQ]ȯªµTû0Ó¿ºÄëãÌÒFcóÞ|Ÿr(ÌZñ€Lhp7µ‘š¼¼‘[¹vÿ)ÕúWÏ,\tÆÏäÒ~iüh|ë«à5ŽˆrüüW•üªÓ]x*f ýtÆOgÁ›”ÊAaõáæ͆'_Ìö¥£åá!™¬ vW-mäûWJ£ë¥õ[z{ŸJÖ³íKð>0¡xª ­ &Æ +m"7Ó˧¨ZHE0;³s#·öbqûEkt Oµôì`íø­¶áç,±°‘j_YÞ{¼ûí½ç¿^ߺŸ(®5†'ÕÕSÞû¥õ»©öqvùxyÿÅÍ[oµê਻ýϯCÝFÕjHÈÁŵžTÚ%’Îj5Æ7H³ã¥Ó“¬Qܦ@±íÕÒø…ÎákP“baœh^î^~Ü?ý’¹r'fôdÚM˜|fÙî-ÆYÆnÅô6náÄôæe:³ÌyÁCF…kõ(³Û}<»Å/)Õ=­ºí§Œ©eZ»\ºƒ'Šjy-?¾c´÷SÍ=«sd5ö´z¨Tv”É,äê¶Ö¼Â÷€Ò½S±°¶„È…þ•òÆ].¿!æ7À @ñbJ]/om?ÁÕ˜T\¾ôüÉËßZ¿ýNcïqvx[Ê Pï?¾ùä;N̲ÙDq£¼~¯´q¿¸q;¿~×ÏäO￳¼y+L™¨”ϯÝní=mì<.¬½PÙ~Š%û3~ Sª^ÂK›Re‡/mÆS“ÁG¢8ïbý„ …ª­)gì‚›r‘º€ë=&Õ­#,>;í&„žŠ©í°XÉ G ò”µ~üF²yð^kóþänG6M´½ƒ¥º1¹ši—OÖîDµ.>Ù–zÅ -ÉeAi›»'²ÉÛF}ÓêéÍKÙÁÕDmH àÇìB•îy) 7šÉö¡Õ¿i îÇ/¥û·øìÐÑý··oûµ®&ì6ö³ýëÉúžœÁÆåbo÷~÷¾^µ_a3+jq=ÓÚÙ¹öúêÁ#w\ç­åÖÖ½î᩾?¹áÝR©åý¯ÙÕ5_LžÜñ:8Nw.«…51·™£Å¸5”™d3@¦ªã»k·¿Ò¸òº¾|-Õ;1:Ǹ¹6PÙd§µv“P뾸¦ O<êl¸ÖñaÖ¹EÔ×)½ë§ìónÆK‘ú€ÐbaÂ)˜>íˆP29–ŒËåÉòˆä¥­¨\æ ¬U·¥üK6ü„F©%@)µ¼‘jíÑf Øß8 s«ç–€p(­Âðf~x—ÉŽ"ri˜\*UW®±©&.Êë7[{aüû‡¯-}©8~žHw¬Uݸ…H€4gwp4gÙ¬o[­K„шrV"ÛÕ íLkC¯mBwcÉ,Yµ )ÛŸ Px¢Oñ±)/k°¹¥²›¨îéÕmµ<òS:oÔ/ßûÊêwäÚ¥Dí’ ªb÷X½¾²} "–²£»éÁ=­u’Z¹Ïö Š"’™_Ù½þŠÝÞ}v ‰åIN_¾¦Ô.)¥Ídi½ÒÝãË?xý#‘öÐÙX¢+”ö{OWï|XÞ} +qu÷øÑ›~?ÛÙ_ÄRqk-fn æz~í…ÞÕ÷ÌÞ©0Ôâª\XýÃê¾€ÕˆP"õŽêtòdýÊ‹Fu£;¾%çF¸Þ"®—Î.¢8 gnùŸ^æàÈâZ½¾z³³ý@«^B¤*&W2Í]½´“JLqGï^5z'‰ÆeðP/fø°¤Qߌ9룖""ª6¨ÜV¢y=Ñ8BÕZ„ˇ‡Ë—Ÿ7™òÒK15–hí«ÉÊŽ^ó©Îb‹Ò £23ùù€UtÁÃ-„µ“7ëWr½;T²›®ïXÐD˜éŒ(NĘ H®XŠJ •ý0[`¦Ì6ôÓ!ÈÃÈãÉ.e‚bÅCÛÞ¦º#®ɺÑÚOÔv”â6ð˜=ºKuœXB­nòÅ5¦E$ˆKmLo‚îñöH-mCT’ÉBÿ8¿rª×w¸Ü*f¶ýb.$•ôÚ%pù —‹ð9*ÕaRTeœnnËÅÕ…˜³jqâtRÉpV²Lºw‹i͘ZŒ¤­"Õ]Šñ”QÖšÛ…áµÖîãÊæƒÅ˜äAÁ¨UׯOr+1Y#O´óƒãâè¸0<FÂå +k @«/x è‚Dysxùe ¹°þÿxÑGIÙ"fg¤—ÐÅ\ß®o”»;[W¦Ê«2Íg7Åü.o¯AÌÈQ[Jn½9¾Ý¿ô¼JûèœT=L­<¯4Ž¹ìŸG•öáÞÃlk⿇ÊDåšÝ9]>xµ¶q'ß;²ê›"^{÷“úè†+«ËÆòdYõôàšVÝ 3ÙîèäÃ?ÿÕµ'ßÅv¡ *½ªVÓË7Œæ”Šfgóò‹;7ÞŽ©5?— ʵ¸Þã3ëDj%*7ClAϯ4Ç×¥à«~¶´›\¶ÂU»³×Ù½¤M\)³É¶’‡Oq¯½q;&VBó4Ÿl÷6ï£BùÜ">ãåÖJû©ÆD¿ [NdVž¼ý§—N_:3>»„9ÉBTj%Ë{©ò.ø&.æøÜ*¤$ÕaðvUj˜9ʸÞIÖ¯$*‰ê^Èã0ï”ÕÅ“í°T‰eToƒn7v±¹á?…ÊUP’˜V×»ˆ\2™—‰+E³}™Ðë SRa]k؃[•íÇk×ÞÊ¯Þ r\«(¥ÕÅ°äÇÍ ìÔ D©cɦŸ1Ôl›2K¨ä +K¨áˆ'© Y¾"j ^|íð!jSVŸÉ­C…cr1ÝØë¾ì¥Òˆ‡¢Åä*t½^Ë¥5ïdë=“IµüTj)ÌãZUÍ.—{{¢Ý½àaÎ{Ø…h"ÄE_Úˆ1:o6Íævkëv}ë®ÞØž8”ReÓ+KQ¤ ÌçÔòV}ü|ïòTvÛ…ef|‚–ª¥u‘¼è§g¼´#f bƒÏm åÝEDöázet ü(ÌfüT¢®U?Èu¯›ÍSˆ„^*§V÷£2âÆux¼‘íÒúøä•òêÕ(—ù‚Ø[B˜Úö1Y/@Uª NìÚh#cuÄÒvº{Rß~¨7¯8q{! ªéåê身DjÂÃDi³¸r]+n„ÈÔ`|³¾¼ÿ‡•œå kCΪm=ßÚ}1—@ý\ÑDŒÉ#tn1({P}1¢Ø,cö«*ôc“»ÉxÆêÍš\ôѳŽ¸/"ãœ×Z1µÊQ¡¤–Ö¸4Ì11Ù_i”Ý…8ÆeW1ÕS'˹S)!;üߧ—Ü):®Ý&Ri˜T-Äç|O÷‚bÞ>«TôêmL.‚ôåW®Ê•-¡¸.”Ö´ú&“¸,ľ°îˆBµˆÔ€NÑD'À]¤šïîëµ-/cGÁ÷©l„/‚#ƒÚ¸ÉŠñ|vTÛ¼çÆ 8±ÒÊiºs0ƒ·‡Zy êÙ§ÈD•I6&ËñQ6e.S™‰>Ú óV˜5{YÊô‚䜇˜yÞEùé<­TÚŽ ŒNvûk \1µÓ¥nŤzD¢±­¬•V…LWÉÁi¼ly) +©¬ js.À9£Š#"‡( èBHuµò6"™(åÕ˜Pš—4B|‰6—ÕâŸ]1÷b ³6N·/Ãl’Ö5–çdÌ1f?@˜¤\*O\á‰ÀBa¾8Yï+"­lÞ¨÷vqÁ¢´’^ÚK•ñM»{¸V!-‚b|™Ëgçâ³^Uë‰ên~pM°^T›õ0A:£U¶y{å¹™ÐùEă(pÂpðÙu«{S¨\J +Š>"ÉÙ¸\óÙ‰ +%š¡â¢óP~x¢áFD½²©×ÀLÕ},Ùö²Yn·ø(kùHÜ-3¸‘Ýr0ÑR~Óëx¢”ëìV®úÓK§|¬ þ¾zòÚÎ÷*Û™ÂØO@Õš—ýl¤ØCd@»äüúúÑËÕÕ¹0¬MÀ¬âDu($à¸Ö†×Ow¯ÆZp1“kmÉÙ"C\Š*žhrÖ*|X® .<&•q½MÁÔØ7mÏ#R€23Í=Áìž÷Ÿ™óÎhà>:+^6ÓŠP)=ÓB› °DªÏd×ùâ.@ž’– ö´wôòŠ½„¶O†ùŠR¼ÄgÇ0­ÓAzM ‹çÝÔR4à*Xrªåº×ÌÆþ9¡ÒùîÔö|[ŠÈŽX\’²FQµ‘+Kº>8¶ëÛLwÇ¡Š¬¥ˆ:ë絪æ†s>â‚ùßë?G&9ç&¬Ùèd£­¸®7ܨVY¿ ´©·. ¹ud²2§<ãÆRWÒ-¨y7¢ Âd嵸5Ñ\sF8L´;§f©²IB¯¸IM´•â‘hGÙÂÅ%tÎC¥Ê¹ÞÁE½¦Ýô¹ JWΥܺ/ž\ +0ìän¯R7|©×&ž¢V¼„b3 ]ÐJ`Op@G0öÎl ÖzTë…¥ŠÓ@‚‚tÚQ6W›lnS®]a2«N\™ ‘A h³N(ŸT¦¸\Úʯ\/¬ÞAõÎbbo)YÝÊô—÷ &jÛH¢ž\©nßÊ› ½VÞ§  …ivÀ•ì ²zÓ‹§`„Üj²s=Ý» +¸…jí Wô‘fŒÏÂ;ú19D´±¬–w«ë÷ +ý묹ì!Œiʵj”28ŸßéðS™Å°ìÅ“PÛŽ¨,åÇÙá­Ìðznõn¢yâã+mäìrix]̯… †Í>ªu˜ôž>Ù]Ž2Ìâ`ïÆkQ±4’ †#J#"–•Ò®Z=Ÿ™öÒ!:Ç™+˜ÚÆÔg¯CN¿à¥ÏÌ!1v²lZL)yqÃ7‚dšL4"BòéLPðÄäÖúi²²æ@ÖZNµŽ”ÒkàŸgüüs³áóŽ8©”§¢QÎÖ*›…ÑíK¿ÓÚYÈŽÎ/Fý¶Ø;²¨LÊ¥ˆ†ÉPéi9YG*/F4pðçbP´ð¿›¦äL”’HÅ&Ô" ÎŒ‡ü“ ¾?>ëž÷0!•ÒR˜žõá!:½M‘Z›ÔÛ~̾è b´‰0Ƭ ¹8Ì8ȘÊ8#Âd­ £/æ·V]ñd<рAMÒXN”/iõC&;\DÔ³KqO<b2ˆ˜HEÖ^‘Šc<Ù +siGuСPzr¥=ùŽæ¥âÆ}/Wœö‘aRæµ¼,1F•HÖ A‡7×n~9³~1»~6Ç-ÄO`z+׿¾só«ãëïç×-E"Kv¶–Ã|j0úXrÅl]•óÛÚv…YÞhrfW+“Gèì´—_Œª˜Ñ³—¯K…q£ØÝÌò1¸6›0Ëjƒ6Úvc·:¼ŠðT,è•]€ÏDi̦‡A¶ÖvÑMA qZc¦áÛŠ¹¸Ô`Œe`€¥¨¦6(½¹à}¸«lvœ¨_6[W¢b´4ÌÚ¥áU\oúéLD¬ÍG“ð‰\ˆ +‚ò™ ‹QJ)j¹>—j(…õ°Xœ r³œQ +¢ÑZšÜ4§ñé"ÑBÅŠŸ°ÜñÔyÁ‰±F;.צÝL€ÊØ"Oö ЙÉÂïÎd5ôâ:”Öÿ1Yë˜(ž‡q#º3$ÏúØ)G̬®××n„¨Ì³3<`ÞžUŒP¶#È_p`ÏLû—‚¢'ª…ØìÙÉúœ¨'&ÌD¤¢¶Ñ!ø€>Cî› óX¢ñ¡¸ âó€)ãú\Xð'";"l”³2íÃÁñ›¹Õ˜ÑÜœÈG)á­˜œc¬®PÜ€$…}``„KF()„‹Ÿ&&•jA`¤ ëxv‚—îEØ”KL<½²Ñß}ÐÝ{™+î¹ÐÂØq©àÅ5?i*…M.½ + £TÈÔÐO¹Â§×âBzÚ¸QO4=¨å‹Baz9Ìå0)g·¶£BÎ×ãjƒLBÉ]Kv¯X¼Ӊ¢ÕÜ¥Rí¥˜B¥‡ùµ;íý—'ßHn`‰:dœ\ml5¶–b:¦-[kË{/®¿Zßy¨V·½¨ªÙÝÁî}«¾å@¤…°¸¡¶ÙTÊeÍ{ã²Õ),ŸB·Fø2¨3¦£rcòC‹ô*  Õ2ýlï„4X²âŠsAæ1.K€MÄ”JªuJ:8iö”3–€ +™v qÖÄxåR©Ê&c =ù0#.WåÌ"êD4Oܘõ2AÂ"ÔfL¬…&kJk`[~ÒžóñàT[€rð¦0JÐ&j~U)l¸âæ¿>çÐr£PÌl@vÄSN,ta7÷DkÙ Ï ++A2ã¢#ìYyÑ9Ùz>¸7nÌD_œ _tcÎ0 12ÉÚÁèèK+ÇBOùÜx>,€4ÑÉ‘¨a©~Ü‘6d½ëùáƒÉ~C¨È¥ª¬ÙÕ +ëËÓñôE¿$¥…Ö!¤¦„Y#*• Á•Wïh•…3í‹h2{ŒÕ 1ˆ?©–2ƒÜÚmÜ^ Š%n†¹b<Ñòt”ˆ¥81HC%‚lLȳéQT¬Lö‹RqO*âÉa”ËM»cÏÌz=q×: AÙVcB‰Muqµ*¦;‚Ùðĵ¸Z¼Aä +n,+å}£yJZk0¶ó!vÞv˜Ý˜,›sඇÌDŲ^ÙB„l±Sõ½üðzaùÀníaÉ–ƒHKˆVϪŒÙdcÚƒ;£òbH +2ED®Îø¸³ è”R­Lk×…H³“e¬TLkUF·«ë½7ãe£lf¸÷°ºrÕ¡ ¾)f×Åücõ'¿Fð|º§U6<”yƉ/ÆôW&@÷Ôv„0P*É'Š­ñ Öî/¢É3.:È—Ü„í¡òba{1(L/"‚ÞHW/A=Ïú¸ggÂgb< â¥uÞ‰û0]Ì“ÍËP½1¹bò‹u:ð™‹IÍÅPÊl~SiP¡È´'ªÎ{Ùi'Iðåd~4í@¾0å~n:¥ó:뎩Tö@,Ê.ÅÀU—òFm;·|˜ëåWN¤âPb„Ë“É€=V먾õRaõ~ªwˆ8!H')㣓”ÙŠû˜µÉæìöBïº`£|ˆ6½âÒAÚ–ðS“êtv¯¿ ž2㣜a“sà¤q­Iç7‚R5Ù<É n#JÓ' ­m5×wbÉ%T_B’~ +tÍnŸš¡cÕc2Ú¢ºã†—L'ÊÛÕÍ^ˆDWªa¡óåÆMèD,ã“*33>`ŒÏmä—O:û/…¥æ”›žñ3@/RºçB h«D²+—;{¯5w^BÔú¬’L7¶Ó­®)0õ“ß®JÕ£°Pª9çˆMöOI¶¦]Äy=˜\9ÜHÔN±âôi7æŽ +„œwDo\ò ?&70¥K~Ü‘ÁÕº3à¿B< Wf>2¡ %ßÇÕâ¹ù(.ùduO,Œ}¸åEäP\¡”­düq²fi¬—Öõê.¦wý\éÌ">çÆ“ŸTÓ. 4-Ìä£ÇZ+"}ÁIþÉÅ`\ÈÙõÍ“šZŠ?3›‹èHrElÞ4û×¹TÛá'õt+×½ iñ¦çÔtHõó5Ì‹Ùí¥ÿÜt€VÊÍÑÍ33‘?:ç„…ŸßðÆuèâeD¸ m4¸TÖK¸bIÍ5YJ+)Û+Ze‹Nµ"œ ò@°yn€ªCêD |%›!>Cè-.³F˜ChT†bº&—M2Õò[¨¡z!0âZ#.WÔâZ<ÙžŽ(Ó~.Ìd¤ì +¥7…±Õ»ŽhíˆR÷0Ù¹¨ì„qʾ0àñD‡L¹b +ÀÆ‹ÑÄE/ð‰¤L ‹9/áBAÕ“ljHh=Bï@ç.„•(—÷陫QµM[«à\¸9⦜Q(!TÈ‚ð†X;šèÄ´.œ¿TÚž ñÏ- óA¦ÛG¦ƒlÓ;Q¥ †n·.'Ê;¤Ñ +IˆcQ±¹l>ª]𲎨Ê]pç•ZB'g`1=¦´˜ôÆLP^ŠªÐŒ!ÊÄÅÜœ'>Y­ƒ‘Oc‰&"hŠYï#mH‹QyÚK†¸mÖU`¢œ]@½t{å$UXñÅä¥ ïD”¦1 Ž9G$Š²µæúÓ7?"¥ÌœŸ› ÐŒqmà''&¸ä'|ou0¹¸à\ÑÄœLˆB¸\˜0<˜#ÀD¸r,ÑF]?S¹èÄgœñ/N60ù§Ã3^ŽÏL~‘%—vˆÔè‚OúÂù00[œ/qÉ•Ò}Æ!bÉLbtÂZ¸R–³+1Ξ,~‚«Îð$§‰$­5øô@ɯ2©6‘¨ZÁƒ«“íó¼4Âip­ìgÅ•"®ÕI³ ³!:‹k->·VÞ¸_Ý~,·¨ +€IôbÉI(Ã-7•iš¬èUX¥–h€ È„’‡ÉG!R.Q™ ð,LXAÿð£>`Q¨™éÔ *ÎÎf1L.,„¤˜X÷S…Ù :Nè¦uÜDH Kö£jÕzó¨þÅ%ôO–Ù ƒ +ª†0•3;9tf M.{ØÜLˆâ +PHè˜Oqé‘Z9P +[”ÂJ‚²œQŸñâ=„OGÅš”—‡wcèŒ]¤3"-†„‹nxU[Q@÷ô*¾#"M-Æ‚Èx€ICtf€+ÃSÆŠ˜‡øÒ¼,% +$L]>³:”p6oä†e€/úhà?3íÄf\”+È +JÞÊrµÕYwü¢›\Уm2¹<RÎ;É/L¹ÜQQž0jÿü¡í •&°9¨®33¡g¦Ü"Ÿì¦§ÏÄ¥âIK~ìÏ×Hbj‰@ùb¦µï§R !þzÎÝaGù +ü9å ´ÌòÍ—>TÒýg¦#g™ ›2Y +1î˜ x ¶"M¨j81¨«mNÖé•r´^Õ + oµ¥Ü:•êO.¹ °ŸHºÑåÁ#BLˆÈ…jaX®«UwRÍ=­º‰ëõÉ"lœ½ ¶a)Êb!›FÊ#ÄÀ'µ–¢ŠŸJí«bù/^f²“ÝBl(:ÌeÀăxJÎïr™mBïÉ~LiLŒx#¥–—Âìsé1"·á•AEY{cRW|FHuZ¼d6¢t\d1Ä×x{MH¯:Cbך££˜TdŠªÝ2Ù¹žKw!fºPå‚#Ôšô‡k’Pl&;?ÉA¨>/©ÍÈ HP ±ES'jL¹¹Y¿bŠ¼5 €FA˜ÙC˜AxÀž ²7‡?Q—ê´ÖôÇõ³ Ñi71í¡Ê¾àÃÌ¥êŽ*z¶WììÀ_t 1e Á7–bš ·Pý91å‚|\ªJÙ¡Õdr) +êJ.øÉ0¥ƒyiµËba7"T¡fs³AᙹÈ9æˆ& 0LÆÀm¢R%ÌbR ŽyD™r³~*ÄI*HH£"&×#ÉdJT( +¹u&=ˆ%e B—P@2ºà&!..qµÅæ‹kj²§šECSÌzhø€Q6 F‚T%P¡žÿ‹ðyHm0ª‰Ú›Ý‚²äÓC “ËÝ|òû|ˆ÷’¦˜³™°P„$¾ˆ¨g\è’s%Ú‹Aúh1’\D€Ûí¿8åe`åìr˜Ë‚ÎùE\ï³™-ÚZãlðÊÚêN7§¼$"5±D‡Ë¯§{“‹!@žî˜"&«GwÞn®z‰”-†•FHªúèÉo8kàŒ¨:%å†Ó^p²%zD÷sÊó¹]@#ŒÉT;G^D…†1)óˆ!•.‡·H­~fÆŠk~T›ó³7¡Þ.¸¨3‹„Ë2ö(ÿùEÜÎÀ¨†) k!$C +æìU½º?ëa"þ¸Ei=(fw$¸5ãgñD̓&þø¼oÆÃz±®Ô)­ +EW8qnž¸èâ¡ê Di‡„¡2‡$ T&—£…–h€õ£b1WLÁêÒˆ +yJïµËBnÓKäœhz1=XfÚ',€„"ª—0Blò/>h¼>Ð5pTXØkð`¦ÞÅ‹Ïù&€zcr€ÐQµD§—SËJyØÆOQÖF¹´QeÚûàì>6ŠA&jQÚò¢@).d£ Œe’>,á#À‘kP*Þ˜2ë&b¬-¤:„T +Ói€ÉCÐsaÀÕY`ž¥¨²ÐŒÙC&{™Uœ±@§:nÜ€<ŽOþ—ÛÀô~Tj‚G8"*ÄCFpµÔ@ËÐŒ~:Mí™°ô¯Î8A…ô0&–Á§.ºqÀxHú™îi¶wÍKZΘ¢ä× )ܨT0ícæÔL~pZÛyDš½ “5ê‡@‰Ž¸¾•çà +ˆÛ”“Š2ÆhÌý!WN6‡â+À.x™)GÜK„)ûüBèâ¡)†ÅcB\hmj)ÍOœqSq¥•:!¦ì'ó¸ÚAØÌÔBäâæ +Ï΄@$# &Å¡°Ó½üúÎýo'Š{ÏÎ Ž€àŠS‹q°ã ŽÉÏìÃl!Y¹”j reÚûǤÖv"É‹~q:¢;  ”^sãÎWþl RžvaVˆ«Ù­¸ÒãøÃnI?™öâV\šZ†^p “k¨\†Œ“­=N€³ÉU29œ ©ÀÕ‹a˜ +¸ˆÐ:`¯Q>œ4î@õ—UJ㸯o/E“î˜"¡ƒ|ùãJL.PVgòë_{ B“+!2…Æ¥¢œå!&ßݨ¥M13ò º+"ábå2‹!rjÞ½àÇažÔ»fë("#ÒŒ‡Fè4ÆÙK~zÑÏI“ÐÛbq‡É®{ÉÔÌd“e¸Ô“ÂBÞKgss¤’6{ ]‹ˆ×êri‹Ï®‡ø*4¤Ñ¸Òìæ1s>Wjù "–ƒ\ÕšçƒÒ.\!—Š >jƃ<ï ʯU.q$e 7M/ e{ñÖFyòe\mó^ëÒciRu•êÊu"1‰‡Dj&:HÂT.ÂdC4K\*‰PÜŒ‡ŠsC!Q¹u ‰?9ï9·€œ]ŠŸ÷0Ó~Þ ÐŽ¨a¶$åÇAš÷ótrb!¥¦œyÎK?{ÑýÜ´Ê&Hd¡D¡ã”ê^}ï©=¼c´®ÐæhÖ'ñBȃL@ë¹™ˆ+,ƒ¿°Ö U; õnˆ-€ËCÇÕF·¸TØÌ·béqftgûî{ÇßÛ8z¼U¼ÄèlΡJÝ7€™i½'Z¨Zr¹¹ xÑ'΂™bé0_I:™Ê^:íüCÒw¢“KÄ“:ÄR6f3Ž˜ +è R‚ѱ{P„ó5ÌfgC< QðÿgïM—ãJ–4±~ÈôcÔ=}ïÍZXÅ Éq"ÎB 6 ˆîE‚‰"²–;wëíZ¦§[c=#“d#3i~Ëô(z$É?÷ˆ“gI3ÙUD&êä]˜ðÝ<¯&Bä¿JæŸê©{dËM¯m«ÉÕñÅ'+[˜ôݾ|~uáùÑÁäúÔjkùñ7—Ò2˜gï}3¹¾K¶VpmíK5ûÉ赋ö&iÿf|ëß~¢‚±¥ÉåÖøíÖèõÏôÜgúægW&H¡ÿêâY&Áõ;d‡\6¾¼;¶Ð¢uù<˜ülbç7Ç.à0åå‹d¥ó1gWo>Y;¼tuåÆêÎÔúפÙÉ9ýÕèO®Ì‡ÓOÇo?½µ¹{kóÅg£4k¤4iY? f> fíìÃñÕí«»s›¯H‘¾&[nöþÉÜÆÁÔÒ³±Éõ zúÊÄ}¢m²¨¿ŒoÎÒ/¦KS+íÅ'ßÝ~öïnÜû&œÛº@.†BmÀhºBÃøú«k«/Ç–^ÐB^&jTÄ#âî8º9Fºuú­æå„äÃ-:1yÙñ͇d*_!ÊL`Ùn¶ÿæÅïÿ¯ÍoþÙÎ<¡‡\¹¾j§6R"€¹{4ìUÔúþ»ñõ¯ ¹0dý&‹äP“ôŽ¦îG3¢é¯&V_Mm|;÷à[3óð\H&DJ ¾¶õû¥'¿½±ú²9NFûãë‹;ä°Œ/<ù$˜$Çíù+­?é›_]ºv‡\Ô >_}wsý…¾~ÛL­O®¶·¾ù»?ü/×W·/^_¾0¶0¾¼5¾òââÕå+$fÏ?úaáé&×_^»ó›Ké—zRßX#!ƒ +ÞñMbÛ«K_Gó[dìMÞþ꼞Ž§6ÈÙrð§•öïÒ¥¯Õs.¸¶t}áIp}©9FîÌÜô›{wïåŸï}ýg=ý€ ]²‹¾Ô §O._ÿRÑ5w&V[úÆóáô'ÇÎ5'ˆ°ÍÄú_}}::AšâÆÒÎíß]º¾ú›æOÉ1Lo×. ¤gæó`úWç¯_[ €6È\¿’®ÄSÆPù€¢]¼ Æçä¹ríNóúÚøêîòÓïînÿáÆÒóóáf:»°¹{ûÞÑ_~‘ð'÷ö<9ÓO£éGd.’ìýôÊtîÉÿ™»G8vyq÷Êõ{ìòÔòKò²/D ¿ú2M—ˆ<‚ÉG¤þ.&«Ÿ_™ùÍù«flùúܽdö¾žypõÎþÆþ?n½ùÏË_ývbq›Xijuûáþß’Þ$yŽDiÉ•ý©W¤ ¾Lˆ¢ÉÍ•‡Gk_½^Ûúæö ³DO¾/“òúÍ•ñóWôÍÇÓ÷ß,>ûíôƒWäÑD„ï8©2ãWiêè ä¥]só}ÿTÏ|ig¯Œ¯bÿÂÃ׳¿üíøâsòåIøÓ<Ó*Œ/íÜXÙ#ß||ñÙømÒª÷/-\_Ù^kÿîéÉÜùãÿycãè³pŽÌ‰ózrjááØì½Ñtá¼½Iºææ½ã¹{'S«_6zí\ó:ƒé"¹c·Ÿ4ÇWI¦Íl¼š\#s}uÓ÷¯.¶É}›^©g‘·u}õàÆÊ‹±¹‡có÷Ço?š{xtgç·;ßÿçÖ÷ÿrëÙoÕô“Ë×֯Γó"šÙŒç¶&îâdÏÍÃpîñ…kdlO†ã+7×^Ì£^÷ÐÜÚÒd -´f7_MÞÙ#}:vûñý¯‡8I²Bÿ=Ÿ,§·¶É9Uãwƒ±åÏ._Õã‹‹æïMo¼ +§^Nï\Œ‰87fÖh•_â(œÉÙƒ‰µ—ÑüÓ+×6>½B2mšŒŸ‰¹¯F“÷3¾¾@”¿õÛÙÍ#rlÏÇsĶ›Ï˜YÞþþê2MÔÌݽù¯¾ŸÜ|3¶ðü2Qæ—WÏ›y2Ço?o^]½º:±òrbùëäæÓ›w?"1ò…š Ç×Éê Yw!^T3OH¹èkw¢k«–|‡Y„‘I¯ÝiÿiîîË«s_%ÓÍäúíû/ýû+ÉIÔ‹cËW&ïÅ·[®­}nn]º¶6zmmlî 9áÄR+h7{¡o<ºtu^Ñ&›ìÜWjúÞå‰;váÙígxxò¿/îü]<ÿ”ŠDzs|}~ó›»í?Ol¼±sÏ/]¿{µ+z⎘¿Ý"}JÓH¶ÜµÛψÉWú2š'7?™{rû 6_“x1]¼¿û‡»;ߎ¯>1sÌM’cßM¬™É;Wgïg¿´Ó(˜?§g¿ ç/ÚÛ̼¹ôÝ¿}ÿÉ«¿ŸÚ|I¡½ù˜$ ÉÕ‹ÉâäÚ‹±ÅÖåk«¤ÁQúµþò惓ëKíÑkKä6êËËO§ï<_|HÆÞÕ¥‡‡ÿóÜ£h´vêþ¥hv|eÛÎÞ¿|}¥yãÎ͇­7ÿôÕ«ÿéÖæÞõÙÍxbÌûõŠnmC]['7g|eoãÅ_ßzxxÁÎ^2óêÚ]"NâÖøööÅkëÄ,Ÿéìý¹»/šã+c‹;É‹«þ‰„I|ó‘¼÷…ºy•Ì`²š¦`ûØÍt~']ØX}IDò—ç¢/ôôØ­§d½Þ +o>YÞþÝ­Ö_¯´þ†Ì’_]¸ö«óc¤>ÈùJ柌ÞØȾ½=s÷"ûôæcž¿¹t iUrý.­¿"ƒÂjlU]]¹¡i€¾q7¾ùä 5÷ysæRB²ymþ+ìݘÙ½ºôë‹c$fIÞN,m_N¬_Žo/?øFOßÿ4ž»0¾ú%¶uoÚùV:ßž¿÷šŒ½töÁ5¢„ù'ç£åO®Ì]ŒH ðfîÑëpö!Yžéígc‹íõm´"Ÿ{úÃèøæ9»0zýN ÖÌô=áõÕW7Öß\_yIÏQã+éM’¥æïŸ<;ù—ÛÏ~¸¶úbtlåóð&-„š"—|þ|¼@æÊ“߯µÿ<}oÿ +ZCÌ}bȾºõäòøêgzâÒØÊä]lªŠnnþÛ/“ß\ºN<’¸~©Æ‰»Ç×£ù¯¦ï½Šžý¦9­ol^Œ—.FËfꞙޤÛãùg·ÿÎ>m¨™óÄÔ³Þ’?8³þbr…äÉÒÔâ“…Í—c‹[×–·¿ˆ—y^·IÔY~1?ggæî½|rô7;ßÿó­ÇÇ_D³dE\N§—ÛË_#9±9»q´ðð jÔ×÷? &þMãòE;wõÖSâšË7î^_ûæÖÓ¿¾³‹¸Ò¹Ç—ÓÅ_]¸z9¹EDBFÝ¥äö'—oüúÂ5ò¸Éa¹±¼rÁ±Õ•'o¸¤aòœ]"5ñëà&- ‘ÐÌúËéÕzõÕ…§—Çï\¾ñà³øÎgf9šÝ^mýiñÑ7WÆ–®\]œ{pôìø_þþÿXúê{Z¦Æèdƒ¤ßøÝÉÕ=Ÿ‡óc·[¯þüß{õŸ’Å6ÙêŸN]»õ|õ«ßÏþ÷ÿã…¿ø4 +'>úî¿~õæ?M¯íÑ8IãÐ<\½õø¼½u>Z"S!š'Qöw¯ÿáÿ™{ðݵ• dW߸{éúzsâž¾ù,šÛ&ÞQ7îÍÞÝp1šú’VÜ.™ñ‡“Ëû÷vÿvlµ}.™ŸßüºuòÏjú¾{Î=¼0¾NJ™Ì¶ñÕ½dþ1N…¿ßz¾Öþ÷{ÿ4÷ð[=±A&Px}urñÙüÆדkí/¯ÞùÄ,¦×N–¾ú›ÉµWŸ3ç£lŠÜúãüãߪÙGç’…sf6¾)½ý›Ë×—¯©ëwæýô÷×–_|Ïÿúòxsl…þû›Ë7.]]½º¼sûÙïž½ùßîýÓWç¯ÒN%3¾ÐóK“çP¬¾LÜ›Ù|ýõÿÛÆÞ¿¿x}-¹ýÕÒWß-<ùíÄ—ÁÄúgvî3;íÖ³Ùõ—W®Axª‰{ñì“ÛÞ.<þþÊäcÄan°˜{¨§6®L¬7olË`g&3à +é›W®¯M ñš?П_è›äÅ_#cii+œÞHžNm|³ôü·{)]ùäòägÍÉ‹öÖ—jêr<ÛŒç>½8öÉ¥q=¾>½º7yçkòþ>»2N´qkã%óŸ^ž¸vûÅ£×ÿiæÁÉøÒ×éÜædåùݯ®\½ùçB3÷üÚoæŸüqc÷ÇW¿&¬ÿêËäÖݽßýs:ÿàs}óß|‘~Î߸s@ÖòMœëŒðìݯI§“m@̯›SÁÔ“t~{cçþ—`|ã/?±çõ‘S¼ðŒÈþW_Œ}-^¾¾ž,Ðì$7ž—·~÷õþÛ½—ÿaæþ›ÏÍÊÿwF>ÏN{?Õ§FdÐ>5"ƒö©´OÈ }jDíS#2hŸ‘AûÔˆ Ú§FdÐ>5"ƒö©´OÈ }jDíS#2hŸ‘AûÔˆ Ú§FdÐ>5"ƒö©´OÈ }jDíS#2hŸ‘AûÔˆ Ú§FdÐ>5"ƒö©´OÈ }jDíS#2hŸ‘AûÔˆ Ú§FdÐ>5"ƒö©´OÈ }jDíS#2hŸ‘AûÔˆ Ú§FdÐ>5"ƒö©´OÈ }jDíS#2hŸ‘AûÔˆ Ú§FdÐ>5"ƒö©´Ï³ÿ÷Œ|–gäóß;wóp{fëdkäþüȹÉ[ö)ý½¶õú¤}<²V+Ë©,Ö›}â…v¯Ê­=âæßóÁƒW?2øî‚>'9Ûw{Ä®3âY€f£½Ã÷h^ûáÚNg{‡½ârôª}¼urtÜ3B>:VëGoŽ[í¹ã­W»{­Þ«µ:Eæ™>:xuôzï¤Þù9ÆÁ¦L¯C¸2ÓÞiŒÕ.à`àQ»€ƒŒÓ¹€¦v!.`ÏÎ~íÖàÇ©gñ3làÎñ½{ùhïuíÖ>`íÖ>`íþ\Ä2ªÏŠØ&îš3èöÓÐøSí·íýõÝ­í£oŽ„àð¸H=Û¢¯O¶gÚo÷¶0 >|‡üM}¡Ÿï¿y¨>çAlŽcœ5 anëÍë×{[‡Sï]¶A4°vv^·OÞ?öá#¹žeÄvïvÆöi½#Ò»™±}vF?‚mX¸…ùgøø¾góáõ«vëÍþÖñôÑáë“­ÃÞ¿zã)$úÅòæw¯ŽÛ€eçÆŽ%†°òæ=C>ù½Ïõ¯­£ý£ã«ßî¾× Ï›}ßï÷ŸsWt {.ôzýæxg«ÕvEÒ½bU¸é—&ìEÎŽÚ èY + xÀC}à2Ø!QÝ.?ôŒË§hŠ¬íž,öžùyb•íu§>ë茪ÔòÂë¤Êi$Uú¤Àaq—> 2(2aïdukï}®Áð …žµàË÷"rÈàÒFä=Îo5 ¼?è"zëxïd÷ }Ò{zx˜DuÏ¡”—½¯ÓËÓX¦Þ {G$<5;§®Hx¯ +?ºÿ<Å°¬çRûøE3yöM¢3¼$?ß8꣟(wáú¨lì Ü™¬;Rg°îhúèhê¸Ýþ¡çL½£Ú-(ªÙó~ïã­í½7½O‰¿üãû }‘nFÊiPpψ Kj{o«÷Ôî0EÎpÕÛÒÑñ«Ý£ý£=›ƒã¶œAéÖû&™—ngnÛÜÙ•nµL ™ö¼¿ýƒ,zÆdXDÀèÙ©à=k,?¬å»Ï{¶`݃ޱºÛÁ»p<Ýn½ã°Hìž+së^%ìü›ÖhÍ4Ì]ÖzδLïn¶÷×ÛûíV?nOõÆï9 ó¡HVoüø|õžJá±3zÇdX”T6àÀWˆõ¼8¯ûÛsZ›_Îœ:šÙ{ýj«Õ>hž,m½>ô¼¿öyƒ,ÉzÆdX$ÙÁ=ªçLì0Ø£AÃÿ§Qùª +_{Åš¿õîeøËXÏ‹è›ÆþÓ¥Ht Å^Ϯ젋½Þw¬cÏ—ž—iXdzúöìîþÝß;loõ\±LÆjké¨÷ªÓÜ ƒË;ÇG½LñÅ_[¿G¯æBÐ8i«÷г\} +!çÞ£{[­Ö›ƒ7ïÏQçÐÊßòÑq;n³Ò3zÛÛ{'{oû@.»áã'Ô÷¿Ýú¾gR$É~²uÜ—&ë7š~rÔ»]t +ˆônYäп~™ß+ï:…z¤äî81spô>©1\}lTïZîÌ6²Sêy?Ç‘ø.ëðB Ë>3|¸ä÷”::xuôšTêÊ›÷Ñ°]ßIœAßEý>ÆÎŒ[_êiHDôg®á– g®Y[Ïq¶—ïIfåÁ¥ŒÈ{Ö0ˆû`ÐõÖñÞÉîAû¤wå3L»g©ð²÷uzyËÔ;"ï©NÌ#ž"bËýUéð¤?>H Ë’Ö»Ïxþ¹¿þ¥ƒgªóÏ?†Þ/ ÿ|vÏD©óÏuþ¹Î?×ùçŸ@k ­ƒ±¾4Hs®sÎuιÎ9×9çFs ˜òp„N†;ç¼½·³ó¦÷“ ]0ô‰Î°°OŸY¿õ¾ZvîùøVkÏ¢üÍñ9^ýáV¼i EyßònPiÐñàôÑ!9|‡½sW徎â÷íýý£o{ÅsïÅî ý>ÚB»âžÑ,ßV‡àê\‚«Cp2Ö3‚ëGV{N´ÈØ‹ãvûpŒ,€öØÞáöÞ‹£±·{Gû퓱ãööØÑñÖáûu€®; ׺ŸÐ¨«O7ãJ%=Gì·~Ø;xsòž.ó"Ñ_ÿÑ ,ê§ö>ýÑWœ.wÇ©EföØYY„~;åÚ™ñŸªBè™V^¿j·Èú<îÛǬÞx +"·_,o~÷Š¬ùÀ²sãGÇÒá neécëÕ©†¬ÈÒ®ƒ9u0§æÔÁœ:˜Ss>0¤Ðs\d‡c:u0§æÔÁœ:˜óc2ò¬TUÔ‘©:2õ¯ʺ  ohê ‡3Îävï³Ù—ã¨pXª(‡¸=ÇþÞÉêÖÞû³Ã'ÎLgŽÞ› + xgŽ~‹u^LŸí®½3Ѐwåè‘ïÊq¦’9*´în5¨:ôÌt·ú ºÖ£uw«º»Õ‡»<¿D:L…}jßaYκ«Õ™ìjµ¾»µ}ôm}¤ÒÆ¿¦¥Õðˆ§ž[—Õ›ýÃé©7û÷j#|ly³³óº}‚±··ûZŸa!½ž<Ý~¬Í×?|7Јô|p0_:ÐnX¤À +óÑ/ÊGøpÑ1,‹úΠ,Ιk×NÜÙsâF•=×+ö®¨OCO÷ƒIïšú4µ +ƒž1Ùm÷SU–]þñq2½ãôíÞvu‹îêŽQ'üQwôþe„?¢:ü1\>hþ8L3ùì‡?’³þè‘:üñÑ¥@þ8ƒ¢½œ™u©Ãþ€w²ÕGµVí µ ×êÏWà A³çæ7Ï·^·gÛß¼i¶z7ÒJw}tÖOöNZï ån\}wo¿-ý…{>:†½ã°x=½÷ ;|s°Ò:ÙzÛÇbåoùè˜íoÑ»÷—özßõ#7÷ˆÓǦÁÓ,5­p†û/õ®%vŽz7øâSÐ uû¥ºýRUÛRû¥ ÙóñG'G½k‚£S@¥ñ 4’ªÛ) U;¥º›ÒÏIºûæøù›}âø¡ 5ÖÍR†`×`A—! Àî´: ûc†Ô¹³QƒÖ;^œÁ +´>pš +´ŽúžÊu +ãèl¤0‚fPGþ†;òBl{Öbÿ= + [èÿ¤G/é_ø?%S¶ökpÀ$^íö5ŽÚ ¬½ÀS÷˜j/p0¼Àž]ƒÚ r/°ç¾µX;×,cØœÀVÿU»µX»µØ÷8ÎŒ8ªÎŠ#Ø&î +Ú3è +öÓи‚÷ŽŽ¶_oõ®=j?p¨ýÀ¾v5ø–¦ž‡º¿Æ`x{gz»ïYè°qV$ÃÙïR·Ký1Dê~!Ö/äcW÷s¼ù  ³¾ùµ³OŽ‡CõùþVëåXC@G¯¶Z{'ß_í#añúäûýÞ§îêSã©Y 9|,õš{NŸ%Æ:ûV¿¦ùQð>•½/}1ؘC|¾a¿·¸Èëa‘s}ž>¹ÞÚêÃ`(Üóñ÷²öl½9ÞÙjµûíxÓÙò™•N¾>ÙzßI|y¯¶|ßGGñÛÝ>6Áï#MC¿ö ÒrX–o¦à:ýÌt Saϲg뇽ƒ7}$¼²ë?:RQϧÚûôG_ƒÜ§fjÍì±pXì'¥ú3u ˜yµèzøl¿ž%º?™¸o‘^½ñ +œûÅòæw¯ŽÛ€eçÆŽåœ=,¶om ‰X[O=XOµñTOµñ´Ó^w +kx­§3¬rëò¡‰§ÖQõ êOV·öÞçB Ÿ`èY?¾|Or;‡ .Ü`æË÷\™GD"ýæo^Loïì´û8‚b˜Äuï Ôû:½žÝ;>sñ°A⃲Î'[Ï{Ÿ‡a êFÏùÆ}³¿Ø_ážÓköæ°µ6|BåÌ[3n_¹ÍÕävúä¦~)Âmê” UØBûÇ[‡¯wz?íbp¨(H€û,Úp¸· ›œFØäCœ‰aqó†8rÂÕx“ûû?»lwèÄæ°Ðê–þcø#¬ÎMÞRÁÓ›‡ÛÙQVY@ž.®Ò#¸Ê¨€§Ú/öó?Œ,¿âgùiýûƒçGû#ççÚÇÏI4_ “ô¿ûßâK{äÍH§¦åþ÷ôÇ}ùš@ß6Lc©ñèIÐØÆåk#£Z7ÓD™†›Aª’ÆÁ¾%QšA3È(}Q&1ÊîëëÜyØÏÊHÐ th¢$Œ­lššFÐŒãXÇ©¶ô¯ mHH…)mhÂ8084S­l”D:66H„tI•FAœÜæ.´qkdTÙfLOkŒFMÇ1!7ªƒ&½-iŒÆÍH[zبVMm-W©Ô6ðUQÅQÛ4iЕ6£8¡/¦I ’4­ @‚$NÒÆ4½1j*m£a3lBÏTa3 L HÆxŽj«4aZËwѼ© +ÃCR¦iB ^ŸÄa£ŠÉôÈNgYTSÅQa킦1XE£ “°¡âflñgœÚ´±9BŒkšÔ„_¦ð„Š-A‚¦Š Ñᥴ(Ó#4ÂÈ­€žk  Us‡ù¡÷𿺉)ä[hÂ@„o€Ѧ©µ‰ðž ²´f•á'Ð " #Û0hý›6µÖI`‰|TŠÅ¶ £€;QÊDŽFŠ4«è±4(›$:´:m`nBÕ¹LHâf`TÀ¯Á"*šDYáú( h ô·C>NÃÔXâPãIzÎ4݃‰Á0ˆ° ²HÃøÓ]Š¨I‚Ħ<|BM5’¦JS›ÂÎcžVj˜Zç¸i#C¯$@ÙO ƒ0Æ–0³)ßTBaÑMäÇd6Þ=J+šíƒb”¦ švú¢±Ò`¢wB(-¥_á—TiÌh“¾Ih’‰0/hZÅD¬e¶ù¶8‡(ÖØ_N´1@¸\7k f‰èÜh•Ê5!Í$½)éZËVÆjLš4ZCb;Ä:dâ ‡€%‰” +CšlzY¨U("% Þ&æB½€æ W)³%- Q,†“`ÕB8hLEœX‘ÚÒºÒ=Ì¡‰ay8ôT 6ˆ‘£+cE¦ÄÑÏ&$z± b^ü‰€x$Ü*H9rQ$""zñ È…––èC_ÓBÄL_* hÝu˜Ø×0¹¤Fu8I7GB ÔÐq »Že3VŒþÔ,YMÍ-ñ] +±K¸&&HøñZ¦…ÖÜX0±J@äL“ À\殢ÇjÍCb‡y +ˆ§4IüÿA(ó«mD’*”'Ó Ñ>Í0½TAüÒBòÐhV,!ª f 4KRãHðŠ $]–Ä$F,Þè‚܃S`Ib‡Æ0Š*5 _À,cDS¬¢€™ˆäÑE{) endstream endobj 5 0 obj <> endobj 35 0 obj <> endobj 44 0 obj [/View/Design] endobj 45 0 obj <>>> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 61 0 obj [60 0 R] endobj 84 0 obj <> endobj xref 0 85 0000000004 65535 f +0000000016 00000 n +0000000173 00000 n +0000030631 00000 n +0000000006 00000 f +0000635481 00000 n +0000000008 00000 f +0000030682 00000 n +0000000009 00000 f +0000000010 00000 f +0000000011 00000 f +0000000012 00000 f +0000000013 00000 f +0000000014 00000 f +0000000015 00000 f +0000000016 00000 f +0000000017 00000 f +0000000020 00000 f +0000635738 00000 n +0000635769 00000 n +0000000021 00000 f +0000000022 00000 f +0000000023 00000 f +0000000024 00000 f +0000000025 00000 f +0000000026 00000 f +0000000027 00000 f +0000000028 00000 f +0000000029 00000 f +0000000030 00000 f +0000000031 00000 f +0000000032 00000 f +0000000033 00000 f +0000000034 00000 f +0000000000 00000 f +0000635551 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000635622 00000 n +0000635653 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000035972 00000 n +0000635854 00000 n +0000031043 00000 n +0000038971 00000 n +0000036288 00000 n +0000036175 00000 n +0000034956 00000 n +0000035411 00000 n +0000035459 00000 n +0000036059 00000 n +0000036090 00000 n +0000036323 00000 n +0000039045 00000 n +0000039397 00000 n +0000040878 00000 n +0000047900 00000 n +0000110777 00000 n +0000176365 00000 n +0000241953 00000 n +0000307541 00000 n +0000373129 00000 n +0000438717 00000 n +0000504305 00000 n +0000569893 00000 n +0000635879 00000 n +trailer <<2F7299D099E643789F82D4E71CE3A018>]>> startxref 636118 %%EOF \ No newline at end of file diff --git a/tests/dummy/public/assets/branding/ai/Ember-CLI-Mirage-Logo-Horiz-Color.ai b/tests/dummy/public/assets/branding/ai/Ember-CLI-Mirage-Logo-Horiz-Color.ai new file mode 100644 index 000000000..87c002887 --- /dev/null +++ b/tests/dummy/public/assets/branding/ai/Ember-CLI-Mirage-Logo-Horiz-Color.ai @@ -0,0 +1,2757 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[5 0 R 35 0 R 60 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Ember-CLI-Mirage-Logo-Horiz-Color + + + 2017-04-12T20:08:04-05:00 + 2017-04-12T20:08:04-05:00 + 2017-04-12T20:05:52-05:00 + Adobe Illustrator CC 2017 (Macintosh) + + + + 256 + 80 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAUAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FUm803et22myPpdss7cH9Vy1GjAH2lT9o9e+WYhEndxtVPJGPoFpX+Xt3rc2kwR3Vsq2EaMLa6LU dgGoBw32G4rtlmcRvbm4/Z88hgAR6ehZbmO7F2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2Kpbr+u22jWQnlVpZZGEdvbp9uRz0AyeOBkWjUZxjjZ+ASj9JfmAIvrR0y0MX2vqg dvX4+FeXGv0fRlnDj5WXG8TU1fDGu7qnGha3baxYi5hUxurGOeB/tRyDqpyucDE05WDOMkbCY5Bu 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 + + + + uuid:588cc91e-e173-b34d-9c0d-df9db88de746 + xmp.did:b6d881e9-8136-4708-82c2-a5818995bc6f + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + xmp.iid:3d58b951-e27c-4e2b-bf80-af2ab47a27db + xmp.did:3d58b951-e27c-4e2b-bf80-af2ab47a27db + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:48fef565-7731-4c49-bee9-dfbb0bfe5fa3 + 2017-02-28T19:39:58-06:00 + Adobe Illustrator CC 2015 (Macintosh) + / + + + saved + xmp.iid:b6d881e9-8136-4708-82c2-a5818995bc6f + 2017-04-12T20:05:50-05:00 + Adobe Illustrator CC 2017 (Macintosh) + / + + + + Document + Print + False + False + 1 + + 550.000000 + 175.000000 + Points + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + + + + Mirage RGB + 1 + + + + R=39 G=50 B=73 + RGB + PROCESS + 39 + 50 + 73 + + + R=110 G=116 B=125 + RGB + PROCESS + 110 + 116 + 125 + + + R=54 G=181 B=192 + RGB + PROCESS + 54 + 181 + 192 + + + R=112 G=201 B=203 + RGB + PROCESS + 112 + 201 + 203 + + + R=255 G=147 B=67 + RGB + PROCESS + 255 + 147 + 67 + + + R=254 G=201 B=78 + RGB + PROCESS + 254 + 201 + 78 + + + R=214 G=237 B=162 + RGB + PROCESS + 214 + 237 + 162 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 64 + 64 + 65 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 112 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 129 + 132 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 146 + 148 + 151 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 166 + 168 + 171 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 187 + 189 + 191 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 208 + 210 + 211 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 241 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 236 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 241 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 221 + 21 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 34 + 64 + 153 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 151 + + + + + + + Adobe PDF library 15.00 + 21.0.2 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 66 0 R/TrimBox[0.0 0.0 550.0 175.0]/Type/Page>> endobj 62 0 obj <>stream +H‰l—ÉŽ#M…÷~Š|gÇà¹Ü„8ÿAûpÚD»xæì>gÏjÇÓ¥úNZw–P/Ç?Ãÿ¿n÷Nk3.9)(?øÄu> »¯ÇkVâiM8îõL1÷4 ìäãv/¯åõ½ú³†|8اEIZq:=ï°î˜wqF©âÈZ'Éid{·¿‡zo[,d®‡G_[Úqw\iÎÜ-þÌ aöÄ“÷XN Žc=Q”0Ã$¹ã™r^ß‹o²]>C®‹Ü– © —½ 6gÝ’ÀÇAr:Ù3¯ù]œ $œÏ¶¹¸…ŒØav£{ŒZجâ‰Ñ–´°Nq›ˆ#ƒNm¤à,°d¬þÁ¢¦£uO¹I#ÈzOúç}‚l%‹Á »„v¾C‰®˜qgÆr[ÏJš<7²k`*ö‰àµ¡{çüN_nmë>!w>r±)1“gZ¿³ËZ‚²³kê½¼Z¦ …€I&œ|35û3˜8€»M…«øOÁž4’}ìDÈÑub0 N5' *ûA7™™`Làk]dJÔËÂÒõšH=Mríˆ3U®åhLg•Ž£lmB°µ—º¶Ù±Ô}‚·¥£-HÓj±ìEÑNo=/«™ë7Èn†6#-„+Béa5L/xŒ0«ÙM_|<eÑD[À/…«Wj>JcЂ¨<™bZL8_bmîÄ^ø‘WÁNºIH$Ž½œ eŒ¡/ᆣ†JZcUœºítb"Ý]pd§ŸÎy +¡ÁÄr8ÇŸØ9MðG¿ÚœãÐÜ*8Éd}J×[ ÍËí®„/µD>qýÅíŽðf›¯RñpiU$€>œãË%õÎì^÷*ê×íß·¿ßL³[ô‹ùÛfn4.©ÇÑØù”û»¯gtU^Š†vUkqo“&ÀE¤Tȉ>ì¿CSZU|ƒ ÆR3`Œ(K/4YƒrR'!3ÑLKÏ÷ $©‹|Ü‚B£î1PùÁ«UÄÖNBÆ ^u £Ú Zžš Ë'ÕzH:›L£ 3sTÿ%±š|]4<‘¡¤}îH8ÔN5KYÊPݘú$dˆƒo® ], ”’C…ñ µfXͪ(+±A!„Î^srÙI³MÆ7«†'Z #žrêh†xø¼\9È®b`è®#xJáx‹Ôãæ+{B3‰2 -vméé ¤GTR¸ÚvÒÌCõâYíÔY´õ^I¹Sɵµ@j\çL]2ߵₚç.¬çšHœÒGòM{} Êø|X ÙY£f^2Ë«;å…p“ŠWùÖþíÕ¾[O\'ô x•Ð,¢žÍ_!¨¾7Dã»i‘Õ Ö­OäÒ ´ÕšŒ‡è±jl +Ir=uG&3ã§ý­15ÜÜ·!¸O°|+Ô‹ƒÖõ|l±½Ct#’²ùr"`Gºpàyâ‹Œybj19L-_íèZE!ì6)§fÙ@à®Êâ¨:Q[äbɧ¬¿ƒ†…Þ5]NÐSµ -z©¹ªW3mq(o2Ê”±´'¦’©/s›ŽmÙº¦5l8±Í2Ö°ËvÅ »»5õö‰ðÆ!|ÈoZð´P—œZjÁ-áj)c¼œ ÏÍ‹^¾ZÈðæâßd¬x,-Ɖ©å hx‰øÅŒ0Ö«éh›ÓvÕ ·åÌu"¿qÈï2VH»aÊ3– -Ùa÷›7w¿Ÿ µÅ²9,Wìzx;±òŸµY Ú²lûâýÄ›–ovôáóq1UuíúxÐôoJfy^Ý×xè‘@wŸøžº»ùád¢è9ªox-öòCòüs±£Ø>¤²ˆWè5ƒ$Æ•·ý› +€¶7+BÄèM’ÃkH-¤¨œÞºõ|ªâMyd/gË dÂc©é÷˜n?†Íå·›@ÐùMxÂŒ„{`ŸU ¤UÏ~6îÀº"vV-‡-é.üaéÐETT%¸ù dú”!•:Kµ©vhyVŒÖûÂi¹Ö¨f†1æ,†z´æˆ‚·–¯ˆÇjü‘*XîõüQy«­ÑŽ?£ZôŠÍ9@öf‡Î\(˜‚+Ü4‹uÀ(Ï.àg·ã\.iÂw#­©èb4úÍÄuÞIÝp¹¾”üñJ"x³ÉÀI]I¢–²ýqS²¸dè-±·äÏM4ËFWðe¹xñ_ßþñäßÿ Ò|[ endstream endobj 66 0 obj <>stream +8;X]Q_2ZAe#h6OcN89#B8RAchQ]#!-R!'5R2C,k\A60![`jQ_=OVQe=Co?ta"s*>% +dHJb$GDcXP86o:n90R+?B1Sme.%&1-g$*\%Xm?Ak&5)@fu6G@%IFFG(\k +.qR2./$MUeaC4h,JJ>=Wln,:"k&Q(,rPG?$A95%BS;nX_=9'jQAR(M$W=$l>:9t/X +J(#WY.Ua[Qh\@S-Kr*'ok/O5ZP770;epl`g%-YHZT endstream endobj 67 0 obj [/Indexed/DeviceRGB 255 68 0 R] endobj 68 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 60 0 obj <> endobj 69 0 obj [/View/Design] endobj 70 0 obj <>>> endobj 65 0 obj <> endobj 64 0 obj [/ICCBased 71 0 R] endobj 71 0 obj <>stream +H‰œ–yTSwÇoÉž•°Ãc [€°5la‘QIBHØADED„ª•2ÖmtFOE.®c­Ö}êÒõ0êè8´׎8GNg¦Óïï÷9÷wïïÝß½÷ó '¥ªµÕ0 Ö ÏJŒÅb¤  + 2y­.-;!à’ÆK°ZÜ ü‹ž^i½"LÊÀ0ðÿ‰-×é @8(”µrœ;q®ª7èLöœy¥•&†Qëñq¶4±jž½ç|æ9ÚÄ +V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚óÈtÕ;\ú” Ó¥$ÕºF½ZUnÀÜå˜(4TŒ%)ë«”ƒ0C&¯”阤Z£“i˜¿óœ8¦Úbx‘ƒE¡ÁÁBÑ;…ú¯›¿P¦ÞÎӓ̹žAü om?çW= +€x¯Íú·¶Ò-Œ¯Àòæ[›Ëû0ñ¾¾øÎ}ø¦y)7ta¾¾õõõ>j¥ÜÇTÐ7úŸ¿@ï¼ÏÇtÜ›ò`qÊ2™±Ê€™ê&¯®ª6ê±ZL®Ä„?â_øóyxg)Ë”z¥ÈçL­UáíÖ*ÔuµSkÿSeØO4?׸¸c¯¯Ø°.òò· åÒR´ ßÞô-•’2ð5ßáÞüÜÏ ú÷Sá>Ó£V­š‹“då`r£¾n~ÏôY &à+`œ;ÂA4ˆÉ 䀰ÈA9Ð=¨- t°lÃ`;»Á~pŒƒÁ ðGp| ®[`Lƒ‡`<¯ "A ˆ YA+äùCb(Š‡R¡,¨*T2B-Ð +¨ꇆ¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r 9‹\A&‘GÈ ”ˆrQ ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½Ä­ÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@ æP+¨íÔ!ê~êêmêæD ¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒÓ¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…åÆ’°d¬VÖë(ëk–Íe‹Øél »—½‡}Ž}ŸCâ¸qâ9 +N'çÎ)Î].ÂuæJ¸rî +î÷ wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö +n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=GTB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßY Õ.©=bàá?SŒîÆ•Æ©ºÈº‘ºçõyõ‡Ø Ú† žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹­³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝ­èþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_p߶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMśΠnßLÝlÜ<9”úO¤[þ˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ +¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäüå„æ æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ ÷„óû endstream endobj 63 0 obj <> endobj 72 0 obj <> endobj 73 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 17.0 %%AI8_CreatorVersion: 21.0.2 %%For: (Lindsey Wilson) () %%Title: (Ember-CLI-Mirage-Logo-Horiz-Color.ai) %%CreationDate: 4/12/17 8:08 PM %%Canvassize: 16383 %%BoundingBox: -246 -1520 257 -1366 %%HiResBoundingBox: -245.90283203125 -1519.4833985042 256.826026563773 -1366.9794921875 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 13.0 %AI12_BuildNumber: 242 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: -259.395080245988 -1533.53794810259 290.604919754012 -1358.53794810259 %AI3_TemplateBox: 306.5 -396.5 306.5 -396.5 %AI3_TileBox: -362.395080245988 -1734.03794810259 371.604919754012 -1158.03794810259 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 2 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI17_Begin_Content_if_version_gt:17 1 %AI9_OpenToView: -3343 223 0.3333 2549 1289 18 1 0 5 43 0 0 0 0 1 0 1 1 0 1 %AI17_Alternate_Content %AI9_OpenToView: -3343 223 0.3333 2549 1289 18 1 0 5 43 0 0 0 0 1 0 1 1 0 1 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 7 %%PageOrigin:0 -792 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 74 0 obj <>stream +%%BoundingBox: -246 -1520 257 -1366 %%HiResBoundingBox: -245.90283203125 -1519.4833985042 256.826026563773 -1366.9794921875 %AI7_Thumbnail: 128 40 8 %%BeginData: 6858 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD23FFAF85FD7DFFA98435AFAFFD7BFF845A6059AFFD7CFFA935FD %19FFAFFD51FFCFC2C9C2C9C2C9C2C9C2C9C2C9C2C9C2C8C9FFFFAFFD12FF %AFAFA8FFAFAFFFFFAFAFFD08FFAFFFFFFFA8FFAFAFAFFD05FFAFAFA8FFAF %FFFFFFAFAFA8FFAFFD0BFFA9AFA8AFFD04FFAFFD07FFAFFD04FFA88484AF %FD08FF9FC9A1C9C9C9A1C9C9C9A1C9C9C9A1C9C3C2CAFD13FF8460355A35 %6035A9FFA935AFFD06FF5960FFFF605A3560355A5AFFFFFF5960355A3560 %35FFA860355A35605AAFFD07FFAF596035363560AFAF3560FD06FF5960FF %FFFF606084843585FD07FFC2FD10FFC2CAFD13FF8435FD048485AFFF8460 %60FD05FF846060FFFF84358484AF606060FFFF603585848484AFFFFF5960 %84AF60605AFD06FFAF36605AAF84845AFFAF605AFD06FF6035FFFF8460A8 %FFFFFF3584FD06FF9FFD0FFFCAC2C9FD13FF843584FD06FF84356084FFFF %FFA85A3584FFFF5A5AA8FFFFFF3560FFFF5960A8FD05FFA86035FFFFFF5A %3684FD05FF595A84FD06FFAF3560AFFD05FF595AFFFF60A8FD04FFAF36AF %FD05FFC8CFFFC2C9FFCFC2CFFD08FFC2CAFD13FF85358BAFAFA8FFFFFF84 %605A60FFFFFF84356060FFFF8536AFFFFF846084FFFF605AAFAFAFA8FFFF %FF5A60FFFFFFAF3585FD04FFA86060FD07FFAF6060FD06FF605AA8605AFD %06FF855A60A9FFFFFF9FFFCAC19FFFC9BBA0FD08FFC2C9FD13FF845A3560 %353659FFFF8435843584FFAF35845960FFFF6060355A35605AFFFFFF5A60 %3560353684FFA96059FFFFFF595A84FD04FFA83584FD07FFAF3560FD06FF %59606084FD09FF60A9FFFFFFC2CAFFC9CFFFFFC9FD09FFC2CFFD13FF8535 %84848584A9FFFF8460A8845AAF5A60AF6059FFFF8435848484606084FFFF %605A84848584FFFFFF5A605A845A605AFD05FF846060FD07FFA86060FD06 %FF605A35FD0AFF8484FFFFFF9FCFFD0FFFC2A7FD13FF843684FD06FF8435 %AFA860355A84FF5960A8FF603684FFFFFF5960A8FF3560AFFD05FFA86035 %60356059FD06FFAF355AA8FD06FFAF3560FD06FF5960845AAFFFFFFFAF84 %AF84845AFD04FFC2CAFFC9CAC9CFC9CAC9CFC9CAC9FFFFFFC2CFFD13FFAF %35AFFD06FF8460A9FF84605AFFFF605AFFFF8435AFFFFFAF605AFFFF605A %FD07FF5A60FFFF606084FD06FF843584A9FFFFFFA8FFA86060FD06FF605A %FF8484FFFFFF60845A6060FD05FFA0FFCAC9C2C2A0C9C2C2A0C9C2C2A7FF %FFC2A7FD05FF84845AAFFD0AFF84603560356035A8FF8435AFFFFF60AFFF %FF5960A8FF605A59845A5A3584FFFF35605960356059FFA86059FFFFAF35 %5A59FD05FFAF60356059603560AFAF35605960356084FF5960FD10FFC2CF %FD0FFFC2CAFD04FF606084A95984FD09FFAF5A8460845A60A8FF8484AFFD %06FF8460FFFF8560845A8460A9FFFFFF845A8460845A84FFFF5A84FFFFFF %AF6060A8FD06FFA95A605A8484FFAF845A8460845A85FF845AFD10FF9FCF %FD0EFFCAC2C9FFFFFF8460A8FFFFFF35605A84AFFD07FFAFFFFFFFAFFFFF %FFAFFD07FFAFFFFFFFAFFFFFFFAFFD07FFAFFFFFFFAFFFFFFFAFFD05FFAF %FD09FFA8FD07FFAFFFFFFFAFFD13FFC8CFFFC2C9FFCFC2CFFD08FFC2CAFF %FFFF8484FD04FFAF84AF5A85FD5FFF9FFFCAC19FFFC9BBA0FD08FFC2C9FF %FFFF6084FD07FFAF35FD62FFCACFFFFFC9FD09FFC2CFFFFFFFAF5AFD07FF %AF60AFFD5BFFAF84FD12FFC2A7FFFFFFA9AFAFFFA8AF84A8846084FD5BFF %AF5A6084FFFFFFC9C9C2C9C3C9C2C9C3C9C2CFFFFFC2CFFD08FF84846084 %84FD2FFFA8FFA8FD0BFFAFFFA8FD1CFFA8603585FFFFCAC9C3C9A1C9C9C9 %A1FD04C9FFFFC2A7FD13FFA82828FD09FF52277DFFFFA827277DFFFF7D00 %282728272E52A8FD06FFA8532728272728A8FD07FFA852280528272852A9 %FFFF84282728272827282728FD0DFFAF85FD12FFC2CAFD0AFFCACFC9FD06 %FFA805277DFD07FFA82700A8FFFFA828007DFFFF7D270528052700270584 %FD04FFA82E002700280527007EFD05FF7D002705270027000552FFFFA805 %2805270027052700FD14FFCAFFFFFFCFFD07FFCAC2C9FD07FFCAC99FC2A0 %C2CAFD05FF84270028A8FD06FF52000553FFFFA800057DFFFF7D002753A8 %7D53002700A8FFFFFF5200272EA87E7D052700A8FFFFFF7D002700537D84 %7D5205A8FFFF842700537D7E7DA87D7EFD12FFCFC1C9FFCAC1CAFD08FFC2 %CAFD06FFC2C2C2CFFD09FFA82728057DFD05FFA80528007EFFFFA828007E %FFFF7D2727FD04FF7E272753FFFFAF272852FD04FF84052759FFFFA92728 %27A8FD09FFA827277DFD0EFFCAFFCACFCAFD05FFCAC1A0FFC9C1A1FD08FF %C2C9FD04FFCA99C9CAFD0BFF7D27052805A8FD04FF272727057DFFFFA800 %277DFFFF7D00277EFFFFFFA8280052FFFF7D2700A8FD05FF280052FFFF52 %27007DFD0AFFA827007EFD0AFFCAC2C8FD07C2C9C9FD07FFCFFD09FFC2CF %FFFFFFC9C1CAFD0DFFA80528272752FFFFFF53272728007DFFFFA828007E %FFFF7D2727A8FD04FF272752FFFF7E0028A8FD05FF522728FFFF52002EFD %0BFFA827272E7D537D537DA8FFFFA0C2A0C9A7FFCFFFCAFFCACAA1C29FC2 %A1FD0EFFC2A7FFCAC2A0FD0FFF7D27275900277DFFA827007D272752FFFF %A8050559FFFF7D0027A8FFFFFF2827007DFFFF590505A8FD05FF530052FF %FF272728FD07FF7D7EA8FF7E270527F8050000F8A8FFCFC9CAFD0DFFC9C9 %C2C9CAFD0BFFC2CAC9C2C9FD10FFA80528A87D0052FF530052FF52007DFF %FFA828007EFFFF7D272752525327280052FFFFFF7E0528527D597D537D28 %2728FFFF2E0552FD06FFA82700A8FFA8272828532E522852A8FD14FFC3C2 %A0CAFD08FFCFC299C2CAFD11FF7D2727FFA828055205277EFF272753FFFF %A805057DFFFF7D0028000000280552A8FFFFFF7D272705F8050000F82705 %52FFFF522700A8FD05FFA800277DFF7E28007DFD1CFFC99FC2C9FFCAFFCA %CAC2C2C2CAFD13FF7D0028A8FF5327272752FFFF28007DFFFFA828007DFF %FF7D2727597D52002859FD04FF7D002852535253525327282EFFFFA80027 %28FD05FFA82800A8FFA805277DFD1EFFA1C299C29FC2A0C9A7FD15FF7D05 %05A9FFFF052700A8FFFF27052EFFFFA800057DFFFF7D0027A8FFA8280027 %53FFFFFF7D0500A8FD05FF520052FFFFA852002728A8A9FFA87D00277DFF %8427007DFFFFA8FFA8FD1BFFCAC1C8CAFD18FF7E0028A8FFFFA8277DFFFF %FF520059FFFFA828007EFFFF7D2727A8FFFFA828052828A8FF7E0028A8FD %05FF52272EFFFFFFA82E0028272E282E272800A8FFA82728272E272E2728 %27FD1CFFA0C2C2CFFD16FF520000AFFD08FF280028FFFFA8000059FFFF7D %F8057EFFFFFF7D28000052FF7D0000A8FD05FF52F82EFD04FFA853052700 %050027277DA8FF84050027002700270027FD1DFFCAC9C1C9CAFD14FFA97D %A8AFFD08FFA87DA8FFFFA9A87DFFFFFFA8A87DFD05FFA87E53A8FFFF7DA8 %A8FD05FFA8847EFD07FF7D7D597D7DFD05FF7DA87DA87DA87DA87DFD1FFF %CFA0C2A0CFFD0DFFCAA8FD6EFFCAC9C2C8C9FD09FFCFC9C1FD72FFC9C29F %C2C3C9C9CFC9C9A0C2C2FD76FFC9C9C2C2C2C8C2C9CAFD7CFFCAFD52FFFF %%EndData endstream endobj 75 0 obj <>stream +Ì£‘³*¡É‰,k=‚$¬Á©€¤D¡@¢"´%³Ý–€ Bl˜È,§1„Ô Xž^6–ו†~*DJ#L™Áhð±ÁôE¬öƒ¬Õl!„‹l…郼wÜž2…’T!.¿Ç¤êã4†¹+ º‚(9¥ŒÅ ·Æ!Vó ÜÓÃ(Ñ27ž¸ˆrCÌ) Rʲ¨:ÁêVæ´5Òuæ««SZCºx1‚¤yCp$4Á!›NÌ0Ðu:I™Ü!Õ¦1uÖOMg|cÇ°Åô›§‚æ+ÁÚÀaQŽ+’fìì—ˆu:,Oþ4O_&ðíDú2:kñš–&iú”„saØ"›K¨•p/ÍhP ¡(vq1â$UÙ똅('ân(Pr¹YgâMYöwHnÃâ‡QGZ¦= +I¨â9äౘTЉ)[¶Û¼Ÿ†d A#f"²fæ0%à D»–ù v4B,†]·eOšÕ^ý È@× €ÅE(. û¢!k;šZ–.l]¤ò¦V ‚I‰Ö<øª8œ£S±(­ +xÀ6ÕÞÄÀ˜0ÄCëÞ ŽÁ+“@ÌSì¹F‰#ñÃD¤ëB}Ê3ñà4ˆšŒw ’8ž§åH8pÀiMœ2÷iØ p²UwÜ*øWf¨4‹-æ'ŽÖ ¼aSÑë°]ôo̶ {óxÙÄ4Eü&Åòƒmü&VÚÐÊѵ±…¿Oã'ª×L=A±a™‘ €±È@Ú±­XÓ<˜uÌIô°‘Ÿ˜Ø…B‹3u*ÜÛ„Ç”Xa60‹/è‰1 /éoĬ7eŠhä¦ìzYI"‚3Ž0¯Í›‘dMñ=VŒDe’X³Õ°AƒwŠYC ç"§‘T’z6Rl艣¿)¦5ÙdßM´ è¢^‰€‚š[€UªÇyºË<ì#øKˆ‡šÅbÖ#äÝ%L FD¾b©)ŽýÌþ$'Ï ¬Q(7XÄ£ô$BA1‚Šéo2)-~Žë† áDh-v>&„¡›ôLÐR³,ƒp#¦Qð ÉcQÁa ™Ó±™8 ,غ#H¢ˆÎ´˜{ø›u_ ËÓP…)¦ Eó@”…¸¦×_Á}F œÔwL‹y¡1‘lã ‘™béAc† ¥ä8¾æßiØ4lœcyHâAM¦6È_âdŽW‚ hü®Üä°'Ï•BÜÜ`ز† äÙÁ‰'N,‹*¨Xˆ7˜’ƒŽÐªÖ<‡]Å©øO•à?BË¥A—B1ËÐBÞ!T| 2oœ›PÞǬ̀ƒdUªHØXiåÌÏÎß…Bº6šw’ñ’€…,€6fu‹ðpB¤A´‚`5”=@ìÕ@ÇÀ©*b‰W†œwKÁ²“€¼‡5Éb‚'ô® +UNThw±;}fîíH5“WÉõ•ó¼ðâÔɆuÂ[IBLsE„”p¨ ¬©„*tZMÒ±<(%òÊ©¾J:¥¥fÿÉ{„¼"š C˜ÍÊZŠ¢•Ž9Vƒ|bm])¦2ÖÅn ÄJšq±k*²˜®| «Ç­AÈQuVæê¢÷ªˆuxcQÆ”•$°ã•_’cÆ>š«ØÙä‰qä9–‰‹°%ohÝn’w P™P™Ó075L«Dæ;#ŒÈÜ2AÓ ñ‰Ì2.ÚQAò½4)‹°[90ƒÈ@S*ñ¹Lįa ob¹-ŒµQN?[DÔÈÏ +$XÉ<…kÄ`ÇŽâà˜7äHEå–p8ú®fŠ‘aŽ`iNY±™°Û³<‰óC%Ý#,œê ¥¹£ËÄgˆM,'iÙP ~°”ÙˆG®…­M$/Xv"ý† 1'Á¬$4Û¿|OÈ 8E±hëD0‰G²åÙ %Ê1˜ð€Ì{vÜý‹ ®9u˜Ê ^µ ×h„O}¾ÖJö]@WsÃÒ@D¬½Aü"”¼öX(÷(—QrO%Nl]ε—“ñÕ„ýt—åZ< =Z͸º¤y9/[ÎÝV2¼-=§Ä>iH³%I ¨Ì€£¦Ži8æà²@D› “™©„òhÀÑm-Ôçl§‰bË”¼Ø•ÞËÓüv¤[•E¹£KMC·Ê‡JyÄÛÉÀ‡Lr戙À¦ãŒr˜ð¼Dœ]ÀÃYqà&ÍÄ“‰D0— +ÞŽt-_¨–8”ª Z²Î’¥'ñ¥ã8U3Ævɾ·N%Õ†8’«FdåÊ Ÿ "äÌ fÐÓ‘I¹PKJÈ žÐí.ÈÆ…yœ>viÔJågÿËõ ÕˆRÒ~º{b¿˜ý‹àeÀa.H0’Çvé_¸êšÙ$ÍÒB06\ø2•¼ ª4aæE.‡ ¯‚?²‰qkÎ<Ò‹ÁÆq¸\~ +9¿£dmä¢x1׳âì»"^¨œ g»² œÜ¢_ Ô(Ǽ-W›L‡®ÀM‹¥+¹äT!c…GpÊæP®šqZØ4ÅCâzNpW”ˆQqˆ2+Ùà±»™ÁC]a]l•T’*ÉVpæÊòÌTg¯2Ç-, £9¦ ë¤K[s(€-;ŽºÂå2J¦•%œ?Wâݳ²2œuPM·Æ¡˜/ QîU‰dÒ¬|E¸R)Î`Ž·^ýUVåT¼3P¶ueY,›h[äuè‚Ù4œæeµIø<àâ‹*äœuJ! +B©Òb+. ìB `Kq + .¯Làø9K½³uõ$0ö, è•«&<12Í»‰Z«Îhk¤Ë¼Wצ¼€-ÎãÂdlB©€A±‘“Ô®‚škb¥àÑžM¸BåÒ›·#] +tªE<•R¦êÄvN¶&>k …ÂOª¬çéaTª\ z%:Ç54aÀÖ‡”Ä,d/â´1¯äv`ŒHq†fÍÎ §UÉ„C§;•u¡Å +¹izº áWf“•CÊõ¿El‹Â b±‹­5•â¦ÖH—¨J‘T¹ªÅiY7+ØSY6›ýWk¥pKL=ä½Q‡1ÍIqx`ÖYÀW*õߎt)ç¯ü—ËŽZ#ÕÚ¤jùR—"§‘Ê3Mä) J!•µFºÔTu©»*WgMw­á*µ¼éZûR©)ÑȬ” +ƒªÅCÝJŒgÚL'HÀDÃfH,JŠàe`3†3á'9·-FÁp˜Ôrf†ƒN©ð¬¯ðˆ9ðÊ…ÀˆxÉœKáKyBF<•×0M9(®9¦ÀÄbx›­9@(”(• xg,xa3¼X±¤Aç‘ ®€4v:(Åp–¢<¥CS„sW(˜öŽ]Z0[<¾O<†w.ËÒW© B+­‘®Ekå¶J“¨³RTµPªTM%¢)ë²ÆÂððªàXË%\Eƒ™ÍIPZ^zT8ª˜ØµB„Û¸ÐË&ó!M§åèL˜ˆhCÔžÓ4¿‹å¨3Ïõ”£œrI¥$ðY¤—S+>dÇ e+i"…)ûÓ4ãâ3ƒf`Ó†œŠFî„eð5ôë»ì¬ä@H–Ã<pfKx™ãž2\sGz%>ÀƒYAżØ’›˜ðB^Ä2 +_tÄîxÈåg>á-Ó\„œ¸SÛìªsÚœµli½D—´²èeÂÊT2gÜáÐ WªÊß®†²šœ5’DÒô o \`'Z®XƒW)Ò+òÉø}ZÏŠ®†:8ðä^T\i§à$íàĶtÌe„ÕÖ–…kÊZ›èA”vìjÈÚå=G<ãŠü8¬v"ú90Øy¡¤”*ä b®L2¢*Þtâ,a%ÆjB[_5¡¸PR$åª@7ù²ÁJUa©NDM©J®RGWªµkq­uE ®¼)mrÎÖ{»òçX*ö¸ˆjšÕ;åT Gþ4JŠP˜À6ȦØ7×zH5jâJlÈpâíw° Øôô©¶…G¬Ô…€b %«-“Æéx{Ýêþ*q¥Ê²·#åÚ³JmZ¹*‹/à\î$;é"B!€Äd"GŽ‰ha™Å€#y'.Ðl9Æ ÃÃäæ X½Â51×èD"Pk˜ ´.ðƒÅÍþ•ì“6*su*b°RëJ”gE÷â +Z¤ Y¬^¬{L¸bâÉ‚“é%J˜ñl¤b‚U0mt›ò|§ù^‰p7ú/¸ô9òc6K#ÆÎÉ”wJš¦Ô_!Ÿ +†.꾩òê|ßQ"ûQ žjlêdÌÖ„E¾°rÁ>‰$4efÙŸ'eÅZB.K¶Îj…9‹|‡qÉÀ(+²2.G:‡ã‘¡ bBè¸[µq©¹\­\®gnÚO}Ì{òiÕPPÆf³J*u¼­‘n•¾åJà|­ðt¥š¸<—oOƒãPÙÓ.qæÃú©“lÄ­Sº­NyýÊë[¦Ô JÙ¢âh ï+â@…­mJUJš[#å¢çrMt±fº…B¾„Ù7æÚv) ¸ê( ¥ìÞnÁ¬Ä©J.B"aQ©4æÊÀb-r¹V¹TÍÌôÁ~sâ4#L~ü ÚsŽKƒâCCÏ$ÂßÒ €Ù'µlÏ¡ˆ“h\íÁtyáNcco¹Ä“ Fq[EFç"© kÀ—Ò›ÉAR¡ÃÉ'hqTÝåæ¥4gåImqah+ñåÄÚ•ßl ñÞ],R‰Ú†¸Fˆ'r!’R½òÛ‘JAs±Ü¹T=]™¤Ó¨Æ‡Øãú +ëÂ(=’‚¹ê©ÙCŠ´KiW¹ú«RV)!k‘tp%‘ŠȆõUPœ›Q!×uKE +v¨qbÁ:jáLj*U4AW–ªžÊeQ]*§´T¿° Ë‹pæÂgd•8=S™(V²hluñ͈j̠̲̆€d õÔ²ÁÅ°¤ +³4L9“·¯ ‹³rCÒ;QªÉˉ¹êFUĵ*/­*¬ìô0 +Ž|cóo’6| ÀŽu’TkÂ[#ÕÂñ.µå¥J_ÜUª®Ô WjŠ[(>•Èzè"ÎÆ%žp5¥jLÜT©Ø¬Ôt– +!¹0®X,Y)§¬Ð4h¢Lö¾(‘î‰8dÆe¾°N À48ê¤D¥Ô÷«+å‚Ýj +»UV«Kõa­‘.UdÕJ³r5±¹´š1ÀM ôC(ñ-åZ¤j½R¹†FÜ¡$ëRÌì„r:ÙrI¶íRöÂ^s¹8¦Z@S)³‘Ò&‘¡EG*%1*pÉj‰©Tj$ø®j!EµØ¢”,—‰RJ½[Ú½˜äJ%qØ5½XLBºH5æ¦"çžbGvÈ«±YRÍǹ<^5kWÍìUó•$a%XLÉËxžµ ×ò9ÛÄyâJšDn)§Rʹ–b:†ï!Db.œéò5ìl‡~/{9;ÀëUÊ tÉ1ƒÍ|“ÈGë‹t +ï8±Î .ÇIù–R(µk-Åó˜àK!¿.AÁbŠ¹+åXy충r€ +R æ½c¶qU’…N9ÄS +!žWÝ’[ܳ[ÙÏÚ)JöGºSJ—JT²Q‹àR)óÙs€blN{1|P/”\lˆíÊ6ÕÒ6Ö¢ë -TtNËÎkÙ‚‰Tt±JXÉÐo±år7Ò6|±qiʲ‘Ý©šáe3½h£²PØøWÞØmë`ysayóaaw"ïžaãB¶åaÜ¥÷"ßRéÏXnàX´PÆ{qÃ÷&UÉWôfœ&?•ˆÐ(+ÝÈÏHÈeI˜XŽ¤ +%)ŽÿÃÐ/$GïDÈGá½q'@by3fÑúÆPT)°Âž“„¨”S#Ø“r3(PóNÄ»¹ åÄ/¶t1#Z‰'`Ÿ‹„i-6½rxè*o#Î@¡=¤ß\»Ä'ÚåE ¤iâ;·fÕ4t û²‹ñDþ j™—¹V]sf!UdçrXb +ÈãØ29¨ÎµP^ß0(6`H6D”À7Fî•5‹#Y=ªq2;b9t3ƒ§P´ +(bÞO¥\•J,,S€aÎÁfp#’]Ý”]· “¯hƒ'B€“d±|#H¸Ø¹ÊG˜öM°æ‘ewf—ù,Vß)b„Õ*NurËÚI®I›%õÆ‹ëà†&Žå”ß>W€Å©¸Ù½þ²ì‹]^»È-œ$x:D^ÛûWÂ:‹Ù5 @±íBgç!’¦èÜå¯ 3î.¿Kޯ射¦Ù%æ̺˜«Êí]ì\¦Ý¦<_i×$£²^šù³«²ç/vy§ØŽ©37FÎ=½2y|R8¯åÜÓ1ú_vMç, 9£Ë¹·ö÷ßìn´·+Ç[‡/ÚÝŽÈÈ{+ï>2CÅ33PƒrhÈÀ+áad@óvYü /Eàô(÷EJöx'žƒŒ–o­>_ª¤èoï|ñ?¯ìÜ'²kÅ*èöš©ç4ç7q~ÉvãÅñÖö^ûð¤aôž˜s$³äÿê3dþ£ø¬E‚P'¬SÜ+r„í’4•Äq¢ÜnÜ?¨<‹DoÜß³,bÒ°S­.Cà 2zÉ D µÏáMÀÅij²É0ÑQ˜¦8öú”žtäß=UÅ!3K,Aâ6"¬çç¢T ¢¥»=·ï9$I† Œ0EzpJÌá©©_ å« ¦|Gùˆ0!GÇá·'z¨ ˆ,G­¢°g"O„û#Ro‰f"gG¸£ ~y4ŸÉöJó£žèG|êcÄlóM‚XÓ•ìGýBöü¸Ð '”0ás¬Lk2È5|‰¾‡Ä$Š¸™%Ó…õó Ød&HÉtDêN¶!}‘ÚÞ‚Hµ%‹2IÓ]Uð>W(‚/úx4y|¡ñ·ue¤¾ åM¬‹o\,Åñ”âÿ ·hpÉ~í(2®Ç¤rqþÜ‘ü¯…?F­$4*þàh]|jîÕù7±Ã›ýÕy™\ȉw<4(dCÄ»oý‘7þèG߉ÙèÍGyö¦Gf¥0%“F"ö™Dò#-ü\þóG¯­ ½ð³p:èò$¾Òr“ NÉ•ÓN ¹É-þøc¯ùñþrù–0©Lâtu^%£ÄAðf”'ëBL¼“jj¬‰# £èßT%œnŠŒUV©n%÷ù¡ bú¤Jk4ë‡Y ÓåÂ<å?qãþd‘ß4›ÆÒYVo¯i9¼ÿV^ˆsO»!Þ¾õsO? yº¯_ôÏ=ý° 8÷ô +~òðèðÇœkª)¹ÑáêÖÉIûøðæw¯ŽŽOîº1Ï= W¦ŽŽö‹×âÈï¹7{Ûrþhÿ^úêñQ«ýúuc­Ý:!}ÿÝNzз“Îç=‡¤©E§Oͽ2ðÙÈü´¡; 2 ïCƒ}6•kd+lT| + äÀšxN™´û%$ì;™©^3Z¾hñuyYaģ݆\D¼rÉô_}¸dsnéšE¾!‡[+WðpméÅáv½¤47•kª3Óí’Ê‹òcí2Ô"ºÕy?½,¾ÓGìÓE„Lgütˆ”šAÇ•¤ WJ‚¦x +¡Ò ÎSŒ.Þs¿'Êv³¥¶%„8]ecÞ|ö¡/‹ìcÀ$Á;]LF& +¤ËPîüÓ`æã.¡!LRŒFÇ6ýà§§Ø Ç»¥hÌül‘hBì,ƒŸ%zt„:ˆˆ|õÃý§Z’$àj÷4TÊ %aÇø®E_-ú>’èÓµìs²¯4c?¡èûÙÞ•¾ãù?¥„Ê ´b³9C®–XµÄú$–8Mív·ÛÒ ¹TGvmBza/|‚S âµwâÔsK)…:æÔÐø°#?ƒˆaThP1é8«{<¹¦õšÖ?–cõÉ/éçÑÞD?üܪ#¤r«"ú»*èÑŠ¢ùà×iBhQ¨õ甆Ñ?21¦ˆƒë8äÞŸ76ÂUØBÏu½öº8P¿îÞ—¾ãu?Ù\VLwõ›±!F§Û¢$¤òN#’ŠÚÒH *³¸RG–¾“픚@º „Õ-è¥2SÞP™‹iÚJ¾ÀqN Ç–¢0u©ƒüÅß=?ùÀí{~-ÿþ#ï]tA÷ò%Øá‘ ­Ëós¿;a¥Q>]»€OÇL +·Þñâë +?ç(Â$÷{7ä‹?—žZudÅyÍý8]^’ÎüÜ\v ð3©sc~@¥Ÿ +˜æ불…KM +IòhÞµ¶Ó?¶ð¹ü€—ÄÕìÀF9¼YY# +Š`ì ¢¶ü2‡8Ç®ý +8Ðb4Úù»€:,pÜP±ÈàñÚÞóçG‡ï‹#ËrŠ{³'»¬Ñ;´ñmÔBÖ,ù0&…ÝMrªcÂgå„ØØ%è4á@lR“Fºh9`¸RÃq$î9) QæË%|8ì‘ì W Ýç±—Þr3ÝNÝ)öbŠ`K_èN]@õ)ÜWD:aññ&è– S !vDÜö·ëjnǾè…… ͵cæ£8༊Žcé2…ºDt?Á!èëE†ç~4ïxâS'¥ÃB`Ñ£Qq¹#o‚•îfùÃíO;à­M|”+ÈÌHø˜¼@ÉÉÜ4E³×sÂuD@£'«¥‡¸p¦àžèé’ƨ6¢¹–“‚Ý&`DâÚÆãˆ8>ã7ÂSˆÀ¸– 3(IlAåc6Ð0áÚj9qD£Ù¹t‚HjhÞ©ršˆÛ.h>”†ÏoÅ,ÜIFY>Ê™ËøÑ€‡˜à$-Ã[´Ñ¸“½‰¸aR$ôìPñ>W.¶G b¸ œìœ¦¡ÇÉa( 1!7ÃácaÑÐ÷º¡kN6FŠâ„{üÉù˜5–h¶¥¤®$vG‚ÅÖ±]s[ 86âÇÂÊ |“Qn‹½Î:r\†Ò¾Îâ6zrÊ0[Ïà]hõÈÍØ?Íû`,ÎØjlpPrin9ïF¥VÚ™í¸(¶®_1?ƒœw ÝX\¨heyX‘ðÀDè;²$•=üD ª¤áw†ÒCÛ,å¤a4)2Î µœbCTƒäã”ä´n’¢0Ø¡¯pÄ-:Ô»Þ»ä2X!F’FZcG¸ÂË–©€ç “¨bì^–]|ž I4X‘­ÇLãžØ)œ@›¤èvÆTÌÛ¡ >9¶ÜýQa'÷{Iy“/Ó +V€îäðù.¬Ä"0‚Å 3œ«ÇË=‰C9ÇTÚ’WÂiuá.«‚­X†{x’ž1˸gaª”PC¥Æ”"ÉoNŸ§Òa>ä‰xH„"À½Š£8‰k|ˆ®÷–ùYjØ[Üm[:]ðA|¤Q‚sˆ¤3/i,Ål œ[E +~,wa–óU8ÌàH‘÷5ƒ ¥=„âEŒ]Ï ¡<<Ë&ÒŽQ,ÖPqÇÕF…ì@‹8ÑPÇBx&–šlyâ#0¹Ó¯ânm‘ÒW¾‰¯’ƒÍµf|ÑÆ60®Ä»+4!&Íx¸øœبƒÑ"z»þ²ÚuA³Ø:+D0b56jéù‚…‚,Ž\kfÔ¦Ù”Å\„þ¬§ó @–Ò€¤ŸO jœÈ4À–/>­!äD´Æææ'LJ„vbg2âj7ñD¦Òµ„·…r&ƒ;AcÏOÊ»³Ø ˆU,¯bÒXŽ« Ý +Øq/OväGyÎBæ6N°ØyÎ’Ö¼‘åFÑ“‹rrI úÈ! JEr€Uâ¶JbÚ\åå?\Ó§Óœ1!H6®ôsæ¦I-öÿäp „° ‘Ð"‡ÞÉ%ÊA@¨VjäUä™Ê‰]°F +û9pSpz÷ó+шݶt…Ä¡®†1sŸÖÁG|dGB¥Ò~T–ÁYÜvVº/ʤó~vÍç¼Çz(3N±‘¥ºåóN™µr{¤¹•Ÿ2ÆÛ¿éa£söJGX9g¥Ãܘu2éB“Šã1°¹TÉ¡w¬ÔI~ò‘êÜ.Aá„IÛùÑH„t<¥Ær+….1· äþÖZÚø€å˜V´6Hi]0aøW´­æúgØë±ôP'ê5 +£BåLD×jZ»í·èêr3=w|:…Á͇3%" ¢0êt–Z$/ÛŠd×#ׇº³ù´¯D¶H+l2s¤HO”nêîffwîWdåd‘^Ä!™DÆ)wlYf3œÍ(ÄÞyƒà(÷Ý3ÒÕ'Ž#×÷Ûáx»¶LÇñpW,†_Ê=¬JTRä~„|ú ÁÐpºúá½ §Ø=ŽyS¢iººÄ4‘éufäÄqñ¡H¥¬¥iµFµ;½†:ɸ–V!|Î^ny{—{c‘3¾w1Œ›JŠ;pº ¾¡§à*"¸¡ Míš”ò1ºübÞ¹­G¤™j‰j¤N$Kc![qÍäÔ\iðŽîGèô ÎÍø$ÍB>’Æ—£Î–Ӊ똄VzÒ>Ø)$øË»p¹;_ÌÒUφu± ýú$ 37Kä¦Êþ(SåZýq %eÅš'’’sª¸‰´ûŽXä¢EX§qâÌJVÎà6Ò5ÎàQî>2>b¦XB<ó—7É*n2"í ­¨Ø;£/ñV ~¼–>t$E…×ý2Om AX| »™©?çOq› W’Í}EÑ«Á¤N‡ÌÓd'Ëùh±óÍ¢q‹8‚|^.ßk' œ[cQÈ„ˆóæ€IeŸÅãÄ~‡4JànØLT +oêzT—’0 ?ÆÇ@(³&‰´ŒK%Š7jpGxYJ(OÅ3r°·ùøÌpg)×ÎL*!aÓ©;AÔbooêõ9« + £¹–ÌøH0`S!GnE…F©£ß¨éÚ¯JO³Tú΃çùÌ#Vý|hÚ¼9Z´+Ò®iF Ãm¿’È D¢e®ð ‚$t/’.ì©´*`§Rwæt«¨dnù¯C9sÊñ‹µ®:?áöS„pàÎatç’ÜÄf $bÀçrJWpœÖg¤;_$Š8Iäx"Ù1-j¸wb[ÔöŒpKcÞ&áš)ˆÅÂÃæÏPK«p·&p€EV9Ë@¡”XïŸö ÍJÀAàOíä¾l!w?‹kœñ óÆ&܆{Á(îBÄ]~¸q6V¬#6›‚„).@§dÍ}MX±“X‰E GÎz¥w±ónåÐó$LE峡Œ@(0ׯB6…³É*göB>íG„¼ôêG!f¦ 6¡F3ýX¼Ò}|0>9“cM7½“Ä ˜0C‹XÖ:X(>X7q' ³=Ÿ†:k&-´èð2‰„‘ HBifeK¯k{ËçáEžS²£4 ÃGÄ%š8Ò‰Xœüz–™ÚÝŠOòà3ød<> ˆ›êrº²E9wIk9 YÙÔÑ'öD ;pÈ•Ò<‹â‡鎉¢ÅŠKŭщS±q0(é\zÚC;G‰ƒ¸H â•Bè’¹ © Žj°®@o 0—üÜcÀ +%"¨é"yÜ_Ÿ[·I?3,TȽÑäUÑÿ±ôÿE›Q¨`RóÒ¦;sâ”éé1Õ¦¼ÙݾãŽ2N¤Ñ4œ 9kÅé9¶o,$ ¦~JݱµP¡–Þ§l»k·pbK¡Û X ÑÎxöñWw0•õØ”[] õ†pœbZ/xŽlìOä å¸ß†v§š +!J¯œûkçìƮّbš8†-g‹šØ|L› /,Ÿ%~ŠŠ¬‹ß°›Š°¦Î6°@§ùc Ï,K+=øÝQ«°0ìñé0HE=cã,zMÓ»„×´mTHtè"£.a Kô`Dó‘´mŠÅKGPCzƒº63š—ˆ gYcD©WN>6ŸJØYx™ÃÌ¢ý}›E‰Î‹ànåž÷fiÔDv]œÈÔ'rB'èÝjp{GŽÐ Â|š'‡èC‰qó‘(ìHó¸8d/ÒÝzkÍ°8FŸð |ŠûŠ²Ç7ãíâPJŒ­–£"1‚Ò¬-!KÍ„­In'úó¬Ò8¸Í–/ÁÜ9ei 7¢óFB³¼‡ƒó|ʯ×·ä °-³ÆåÐ|ÈƇ;·Qβá…Þƒ¶„FCõ>,oE²iXª•G¸YÚÍ {’ Œ¥o˜‹ÉÃíwcV(ïÝÁyøŒäu&ï ο'î>¹sÒ>î+Žß[lÞg9•Û_Ûø¶šýIš@Ü=Þ;h,m¿|Ýx|þÛ½“ÝF:º¾¿×j?¾PMºY½¶€‚Fʇ©ÈáN¹?åOþ¿Å‘Ò×ÎE‡®?ZLêF“g‡Z +©¡ 5¦È¹%C|ÈyƈÜ;’185&µÜOŠ gâkè¡«ü Ï?Z#ü_Ÿó*?¹À“|ÿ‡‘Q6=¸WרœbŸ Ã¦d-|­ó•[¢] +É/ Æ0åÖbd½‘¢†!¡­Û|F–LDã"LjÜe>É‘Lt•"=‰yñ;‡×Tn€rÎ*п¿8*¾ ÷5 Ü(I +âîîGŽvÃö‰ ™ìs +YedÙÈá Iˆ,á‘ji‡Ö}€Ú ÷^Éýû‹£â r_;ävÛdèÇèY-öCòùèµqqs6Ì¡A’nµ‘?Š„Ô=9"Š-ìw/tÃcWC†çß^_ûš =xH`cZÃqa®‚ü€:‘šE²®Áh ² ,»±ñ˜‰C¿¹^ç]4n€¡Êèß_U¨Š_;¤ÑX¢w"2ðÑ<´àÆÐ`ȶÑè9Û  o¾ŠPÇdÐãô´n€ªÃ"a‡Er£Riñk6@2 +üò¹q29ô™ƒ¢‚Hºï“%Œò44ãjh2ø;1y“ỸyΆ§: ’S\ø– .$OH£°üNDÿ€‹]pŒ@,Üp²­”œd¼{4±Œ¦Ã ^È`ó_²H#gø d@î”"‹­;É=áò K"ÛƒLp9øÝId *›–Œê³×«¸ð- ÍÍ=J43ª&Ó›Ì@º$f»ñ”ls>µïGF’ÊHtF?*›“ÎtZøæÇ"-#šr•Ð¼1Aê1€eF–n‚ô¹ñ^~BtvýrÓ)rÞò9|0DŧôØâ0ƒbRÁW¨ûî‚Ü×ÔõÆâb™Ÿ_=S“ÒÿÀ¾ÎuøX +Tñp‹áó³Ë=Tyà:t(î.@üÈÈ~rœLº[å\r¨ÀÈß©€Ï„­ÈÝhùÔ€âu¨Ž‘gE•…¿“cÏ¥ñËÁ á %ÖÑ¿Ý­|X"`eˆŸrŽ.È4*È |#z)Ûòe¼’ü|ö$q¾t¬'öHÜO{!;㲟˜6ˇÃv@†)õ·fÀÈúW £ƒ\!“á¦Ã qÅ_nlZîÔ‘vo3’žs>כܭÜ-1úfky…Gé Ò«]fhÊ(ßèòu|@1žÆçˆ g¹‰ }'†Ð¯´ñlq~ ° âl’2 ;«™æ§×êÔ¿Ó¸•ÑIG ©ÈM&‹TaT#·ªL¦É‰u²IJÝürÓM™òÈ=ÍùÜX-îÄ Ï'b¥¹¢À@;ú•o ÷éqtÉ™Õ ä©P1)寳neøð!!r>£¤€*ò_ŽHä¤RÅ•X–Áe*ó ߺ[Ðr\Û=,9(­å¥Æ3oš –¹ˆyÉÆi·r JCS”QšÏ„¦pxÒòÒ(“Ûœ–d”Ÿ„‘»Že)¯LìŸ/ß +JÔ÷âGb)D‡È$¬£S¸ÄYè½ÌG!þO‚!B‘­u› Êg_Á¦/b˜YE|YÁÂàÓpãÌÂÈ}õ‡rŠUÔ÷@OÑ*2N;ÆZVö O 1ØšDÙ¾r}%€™ŽåŽ¸ ¯‹„úH§©ÊB7ýÍ,h‘8Hê`ØðŠs LL…iè†b8™V¸Yª%ø¡“¾¢‚y(I6bà†ìÅç ¯8-AlšÉË ¦½Ææ”8)ˆî© ásÊ<H00öæc€Hq#‹û(òr53ÐãÎZ€ŒSÈUA\rä2`98'”{kP28eš7”ÃÎäzs±þÈ«Å$·Ð0T@|Þ@±_+VL€Ø0S ’‰0L”_÷,žÁɆ'®´ò¤ÊÑð­ Œ’âó¹PZÆ¡’Ža ,²^€êØ$Oœåqï#ëm7Cœ ‘Wj·RΦ[Á…eq¼–_<.åÍ@wÇ¥•&%S¿ï4ƒ{«SŽnll½úä‚ €¤½æ ¤L&Ûç^Ñðb¨Äó0®<’AS•Ê8tänå3Ί×iUz–t–8Ã1- sÌ‚@ä@³ƒ¨7}­“?ù‘½£…¹3¸ §Ys««,²nÍLf†;æ +r†‡ÍH@”¯épœ’à ³œ=ГžDâÄK•*Ñ°·Ur´n¤ž9ÏF*ùŠÌd$ Ud'Ó¡ÚÎÍ›do ƒ#*qµq»<˜ù½™ÅÚŒ–w9<$}‹Ü„ËÎœLB«È¨,»Œÿç™Éb…åsŠ+ÏL¦)§Ä”Öž/Ê`ÃGU€\ò˜—ê(e6qAô»t\QE+ã:š$›òŽºÉƒ2­”:å…‡9µä5^šz¥œ³OqHR^cÙK’S«˜(‡AG'gœ“×ÉFJøŠ7‹ßŸSûÒ_¾dÔ¬#®rÞÖ0Ü$¾‚~ÑzYÌÌÑ0!–ÍÔƒ<­Gùë<ïèü•ž›ü+ä”úâHLSNÕÍØ8§1‡W¤rüßFþNÿ0?—†Ð.N¹q%è¹¥1²g!¿€`á8ì€ò*ÜÃö‹0"¿Ž€e»&Â6|£2 ö’W€,³]õ¦ÊMJ˜M×M§X"¥¥p-]; &fSaQùÀ ”)Ž¨J&J )ò{“8ñ$‘]è½Ü2ÇÓç_íOÙðpÄN`JH„r}Y€â¤0%yPÞçÈ€™$’M&¼>“²NŒx¿VÎéHŠ ›ÃÀ/èêÆ +å=õí <™˜ +ãr…Ê Ä…×ŠOÎôÔñ‰°M° .\Žœò Üœt€ÙÜù‡u&8{g~!²±ùå2iID„R\_¤¦îyjâ}Ë,ž+;r¬¤Ø2S$MMD6ŒÖ*E®[£ ÙÐ6–-Ùô Z¥(À’ÎÖâè»|ä$²²å-ìåƒ*3SÆÚÌBp¶¾š03 r_­=ES¦ïžjì,ÂVäQ“æ2Š8Ä>˜K(ZWš% &. ,¡ˆ#²àËè3;Rp HìS6¼Û-yÌ›ªŠ×~lÞƒ’P¾†— 8²H†«½¡Í¾ŠI³¤b”ås@c³;•@B'oϤ“\ô‰"]r‘O@–Ñvüä(íLQè’‹xE,¨Ìòà ? YrÑû"ôÉEÌZ ³dN†dµ<([—4-]¹Éõ¹Eã‚—@*Ë-âô^-‹ås‹¥28Ÿ[„fwãíäQEË+|nÑ{¹Ü¢iÊyqXÓI$r`\š%q|ˆ›rŸ5ô)?â[­T¼¯“3Eù’ûC®Ât'½ˆ”s˜º DVZÉÓ|z1%¹ôbèÓ‹ü4†¸”ÞÉS™ä²‹n€>»èR» rYC+¡‘ äãiñ29ÄY@Y~4áL@:g8†2Ÿ\„ +SŠ‡ú5e[ ,¹èM8“dÉE㜀t–â=JÙŽõǶ?`.·hÜLQàYÁ²«àAáGIé:qÂñ´4óË#7mYnÑøeN²Ü"œp#†H–[Ì}nÑ4M6»ÖgïÄâÙMr)u×ÞôîO©Žtcà,·h܆k™YÎ{H”¥©ùcé(Ç2¡ ¸“[äÝð£&Îr†ÖùXäY†3þ…ëLìŸæ¢^ÖeÐ ¸ZbèØÍK.ZWO Ÿ\Ì:ÉÅ ˜úä¢uiT“fÉEëlGfÝ4¯D§ ñ‰o]Ì —5ÌI‡|v‘ÏÌ_gø_PêäCì‹·u3( mk·rº¸v¦_’…ɵ×öI!ad¨“±â­ïù{±'H /e«º ¤ã)iå¯ËRV²ÇÑò)« ”OYu€>RƇ´EÓøtv™ñNÔMyQÛIY©Ž„ó.!OWróÆÛC‹‹ºZ6m:n'«N6 T'õräÒ嬮42É>1v ƒNÎ +'«Fî:å«åD2ÈWz”Ág ïSz‰Þ¹û]JOãÝÂòÖ0{«·d:ƒ“ú?F!r(Hwª»3ñ–W~R¤ÑLiúâØ+Í<03A²qFj’ªzœe­®·ŽU²’‘ÈÓ§ÏZåA9ŠÊ€Ê!Z Oœl^¡cn T¤÷8£ãŒ+¤&¥ÀQÆy–2²_4³É±J–¶âvEÞ6Î\Ï)p¥d¼|ÚÊCòi« æí;)vˉ&¼ÑñXÞå.y†2¼'³°~H±êÜ’º[eŒ…ÅG„Bë’06½–ªÀØ‚xGV%‰ :ÀpywIWiÅ•S)Ùœ§¹´U”ÏÛdÀ,¨¨¼~꤭—ÝT¢ïp‘S.â—S¯Æ­RA7g¬“JIxC]þf× +¬¨þ¥QEÉLˆÙ’-˜¼™³htÄÚûιb’¢ÓÉ[‘ b•‚Р‡PýC‘ð­ ñ;º2‘Ë‘õdã«PYn‡²ªb+Ct®(´då2u•ïäÚ‰™0 Á¸`‹4šËâ.¹¯&<ÅXQß=ÅX‘oF9ÃÕ[Åaœ3\Q%–0 7ðÆH€:Ò˜ûF”?¤¥ÜuYÂUv(cn”2—{¢Å…œ.g+Ýrt™_‘ÕBHk¾¸À¦!g—yÈž¹¹ 晾Ê ‡0"R¹—4\ÆyÊ6à8'·\3’8'ݤîÁƒ2/Yw`{ö‰iÉŠµ 6%`CÚÃH&ÎCå  öS¹1§8–P¦B2H^Ñx 7\tç$îF2Ö¼n“V’f:t¶».Ó”!·Ç÷ O^eñÀ¬ì÷¸æoN¸–«ð +©qâ¡äòhÌ0«g‘FYŒ—¯zÉ@…ú è“— ûЀdÉK©µà)ïd/Ž§–Æq\~ý¸ DòÖw¥µ— Nj‹¤çQʭг–ÞtÅÑVÞì­CëJxÃ(gºb;²q×9cÓº¾; +\ð@)›¹[yctéºÄÑpçim᷆Іt½ÉN‚^ŒCäp€ŽÇÕ‡ô8£]˜ì‡Êó‡xDV\Å“[KÖ»£oo»"üÅn};ññ˜ÄxµÖóÆk¤sáDôÄgݶï‰â­aR"eŒN…’ÇØ›p´*qB96Çjn2ÒíÜÜá–ì©txÊ3¸EQµ{^}JE +F™õšå' ŒÜ¬Kî3'¡h}.2¢ì;ÏU>DUXC§Çò\E@[Y~i¡PÇVöþW€_ÈÉwz¯ŠMA `(N¥v´…mÊ¡Œ’MzGñäA™‚Ê"³®š §îÐIQy ‹ÛI½Žú´®Ä*§d­«D+hèŒ{òÚºm"…›%!’3@wÖkèÎbKAUΨ@Ë9¯ ³°;Køm™Å.a:¥s‹zªåè!t=ErTƒð€Ö%êBgR'ˆ:žÔ‹,ÀÓä<Ðçnr "™ŸÜK¹ÖÕ‡iüà®lœËEiTS™gç®Ë< ,Ýœ Â_|EÆHù¡¸þ&!‡®Î1‡XT¨J΀¾p;{X§ºÛ+¦|¸l[Ë­ßDUXÁØ(]âhò(°tÆMKí2yzUÚ&•€ñ@)åSô‡¸­Žá˜²Ð@è®Ë¶þˆ[ šÎl¬ÈvŠ•:ÀÄK ¡`ÕŠ³\²~•4ÂÍ[É’w,ØÒ‚ +lÞ™”¼“¡eÈy¢Ü±72L +¬:=]`ýP çY?t*ž‘õ5(P6)y`FP²I37Å~ã[a)BlÍ-™4å6ìØS ʪD¨îLÐ͇ t’…V½2ɹ½ðb±+ +ÃãžÊe4´þlu¤âÒœt@¹¹ë3žuÆV"ñO ½ðsA^Ž"V6C¡³þ®mk‘ $ÅQ V¥aÈ=¸rDè?SW^VJ2ƒ‡db6<’Ýñ‘ï=åAÙœä™ ÷óœ{ggrcóë…lCINho…äÉ)‡}ž$BŽAD! ]æeYA»eÁ›$Tô~r¥âXGè/£‡C,­URš‹ ž£”u'ìàÀ’”ĉM%˜Ð̯c¸wuùÌ,Vv6à‡ øª³ë>÷5<ÍN}têz´­Öõh[©ëѶR×£m—ºmËu=ÚVêz´íR×S¼.ðc+ÖõhÛ¥®GÛJ]¶•ºm»Ôõh[®ëѶ\×ç/íÔÉH]î4 ðõ:ÚVêz´íR×£m¥®GÛr]û¹¹½\×£m¥®GÛJ]¶]êz +×EnrËu=\XbKu=ÚVêz´­ÔõhÛ¥®GÛJ]¶•ºm»Ôõh[©ëѶR×£m—ºžÂuR×£m¥®GÛ.u=ÚVêz´­ÔõhÓ¥®G›r]6åºmºÔõhS©ëѦR×ãA>0”/óu=ÚTêzt¾k€«ëѦR×£M¥®G›.u=YÀM‰iËTêz´©ÖõhS©ëѦR×ãAáGIé:©ëÉ¡¦6Õºm*u=Ú”ëz´éR×£M¥®G›J].n¤—ºm*u=°–ãlWîhÓ¥®G›J]6•ºmºÔõhS©ëÑa¥®G‡]êz +×IX›J]OW_×£M¥®G›J]6]êz´-×õh[©ëѶK]¶•ºm+u=Úv©ëѶR×£m¥®GÛ.u=ÚVêz´­Ôõhûîº6©´é0ðÀÑŽOμ\ ¤€÷ñµ© Ø­‹ÊJÀ@ûF…‡•úÿgï»Û¸‘‡¿Ð;’(Q…Ôö¢ÎªÞ»Õ̲’h±‰Å‰óÇïÙ¿™°‹]ɾ$Nîœ\t$ˆ:˜`Æâ0ÀˆÀ2ì0E!‡( 9 B™Ã 4sD¦Âl|iÊ -L*tp’:‹8 B0io„à ´ƒÌa Šd‡(«‡Ëwd‡ðg…ÑB[ÈψÃ@3Âer`aÄa€Ò+â0 ¯\Ôa€…‡QeØa€ERâÂ"­°Ã@UÂ@tD ™24lØa@Ó‹: ha‡-6ì0E.Œ8 $ ‡Ah+„Ã@Ú2á06V8 D‘ä0áw ËpD*2å/Zh»vd`®’˜ƒÈ2ÈaZ-s„` 8 Æa‡íDØa L“à ´³þ¢ƒB1‡Ay„É)´¹ÎuHà +ã¦qø¢,pHø$ 8 $ØE¡}æuH»ªxÐaA æêm´pÀa Ê|‡ .ð6Cu5ž†M¦?E–½HUT +Gi‚ Á ð +æ²)à¨îª°(ÝÂ,9*Å€ ÝäЇ—D’ôú.5ˆV£Ñj¤5²‰þóß9ÍŸzÕƒRöa”öÀ}`²T+TÈýfšÙ6ºï>@õÈá-}÷Éy´ª ÷†­&}@gOfY;äE¢%]Q Õc—¨3~üÄ´u1 ¡Lš:L®ècòWE¾û@*4L¿%‹+ÜܪŒÀ} ,AÊs¤Ú¢žÊŠ‚³Ü È @r÷®€¬8]¸LIHÕ%÷8,Suß}À²²"ÿÌä ¼¸Wš©Æbº«ºï>0ù]\”ï>ÀBÖRx|ÿŽî{L–≊|ïÉ/‰Sf<±/ìXTÕ}ï¹ë-ð˜ü…2:¶8^K<@×%ïP$×c!‚h&†,&_q¾óÀ0ù>k¾÷À䉦°H(ñ½R¡ð`_ºÜy€#òyÉ5Ïh¨ùÎ3Í*©4W’<ÈtÙå(ßs`ò„@”cS­Í`,9DN?,TÄÌXLúÁÕ KÄfP%Ç%HX®GY©7î8°¸o,´NL4ÁñC8¬´Cº¦)ãf›T8üB]8,î#AÚãŽK¨‘:㎼¥apêŽKl‡î;$Æ8$䶕êᕇ1<ËgÙ,‰!ÅÇzæ[Sußq`Š< ºï8ˆŠÒAÇÁoÙ¨Zè^%ÏÔ©‡îU* ⺷‘_•Óù 5p(…ÔP~l&#}sš%ð”Cйìyy8~O׎_ÇtØPc‹”sUŽ_Ç¢«áøuü ¾¿Î;Á“ú Hºtú!ìx¾^)„%rlÉ!ì,‡K,æ£uiœÝ1ìØÕ|Q$ÖÏ‘PaGIjîËÏ• +™ëO•ã Yœ5^K1$î.ÌNn‚KN qe-ðl%²­+ +ƒv\I!ì,EaÓcØYªhé¿`àjŸ‰Nœå„®V*¦%Õó¯æsI\­T9vHW+U#ùj%{µ£Ê¡ÂØã!U(æÉW+ƒBqµ’Žª&]­dïT-tµRì6¸Z©lÎ÷kÐÕ@U y€\ŽE¡Ýw9)Ê7+YÈ75ÈN)æòý7}±¯ÈìxÞv9øKQ¬Êê Å•Š|?:‡TÏæÛôÆ‚¹ªáPv¾&ÌŽõ©r,;qí2ËΚ— kF„.3µÁ2_ñ÷ƒ«¨r(;Î)±ì„ÃA:˳‚²·*á" ¥üÂõ„á/!¨`û!D¶LS ¼å#²OÌç¢)ÿà0t¯R5ùF÷*RñïU’m¦nÓGjÉû/,é^¥_$ß« +…†'`-Ý«T¹ i¤ª­¹!’³I=LRxXÞjÞT1ô(—ŠdžáÇf ÞB…6pÁÍJUåéÇ„àéêÃ⤌Ÿ²TñÁ®K7+ƒ"ùf¡_è߬TM%,ðL¦â…£É2YË„nsû—#Ë·°%’bÔŽgÇÞ¸J1@ Êey𼂃3ô +C㉭‚Ù²êÁÂÓ‡–Uf/VjÂ쟓hü$WBÇ{’Еn#Ò9 eH”ÑUqŽ6¾{-(‘ÎIüÂàœÄï,8'ñ '¤É‰C ß©–ÈRã±tC$-ÎSB4-NTB2Vå‘Š¤sÕâŒ^>'aé¥)ë”-´0©HV‚B¡Mø*‡*tI3Q ¡®ø {˜Rs!ä·³ìªxˆ¤¥Bù¤„^’¦/9,UŽ¿¡B&ítɱÍMB|™ŠèÁ‘~àØæP—<Û¾ã(ðlE’g;(tijX0.¤ÙÝ*¢ó¼Ø¡HÏ”„/¤Oóä±ae܇ŠìÄv… (T¨q‡LàÚfq5%êׄ•(“¿†ùðÂä/|Ê´ZáÛŠ$ßvPèŸcr¥=pn;‚[K¾mÇ:ß2áJ«±¼¹~‘ )#‚€*8)Ñ"h z-´¹_3—ç0•gÇAx<Ù­¼X–X ’ H]Pèó#ä‹6½ù†œT‚ºšÝX Áö³€d!„Ò(Ù×î°7‘Bß,ö;bÍTQ…oÖ?(A'‚XÓ—T~ö,!“\äCD.ä : Àë)oƒÀ³]ÀßR•9†õÐ1‰¿r|½18&‘ +eNnþ1 FàTlþ3]Ó¡,q˜SÇçT Xä»Çl]˜£ xKëlë.°°Ì´)i—H½ÄŸÅbI4~šy7ä"ú‹³¼5qèø±Cäkêgƃý±ÙþÔ—Œ§Ó1º©¹‡9™ýRßD­Î/ee/œE$wãˆ7),ñ´oÄ°‡çŠdèbEa)õHæø–ž»³RÅõïAªËR«Xþ½Eæ:VЈ±ƒƒL°³ÈÄ~sLž¢Œ¯šË H»úeB£$g™_꿼TÍh{G7£Ã°×˜ +Ù2jð ’ø9&ÛÓ4q©ó~Óúü‹ª¼$ Q(Lô€•¯ˆ‚ßÑU5ºO¶ËÀ ï'{Ýì— 0ÑÅ‹-oH!FrDe¯.7Ò °(d“dNwä~ÎJHCq&Íà “þR—àÅbVFJHòÈʆ¸ôÇà‡©Ë}™m›JÁg‚–:+c/$PI®€2×*/¦!–(¤DjÌ5PK!Œ¦ÀžŽä`2YªÉ–ÑE1pó‹äåû…Ám†6$—D\æ§'¹ä/B£÷í¡Ñè`hÿ¸êÇ‹*2‡‰l¾`;ŽKqƒrU?ð‹ÒÜH!OÊ̽[–š·ÎãúÐD^@¦'aÄRUx˘§(mr¨ÉE2PýBvŒõÆwWõ=Ô.ÇŒ`'u¡ÿ;Žžl¾ã/x²NùŠ…ŒSº¸œ,·å÷-´ÕÅ)±ŒÝ¨î30YA𦤔‹Ê›ƒ˜,E¤£2LU‹ ”—_Þ“CMÚ>v7?„PºˆýF(öÃÊkzÞ[Ñy©Æ]äbb ÝCÈ„)\¡Èv1%½†eÀË"\‰¦ã“ä"®WD㡳‡0Ãæ: ·/ó[„—ÊÊTSÜ*2.R9[KŸCÂ}la9((Ž¸"ìE¿L’A©/a°C&¦9Ä=›‰¥ûÄÈ6¬I:K¡h¸VT„êì +F¸9;`Áa ?#$…+¢8½x9’÷È.U`8ö ³û„ú»¼J +ÛÅ¡uñÖv6Ÿ‹ YöDYãKÃc$A° +¶£Áv,6Ób)+˜«ÉFËR¼D­¨ ¡H÷÷]÷L\ch6Epeò‚*(ÚW´èFšB©Ì 3Ì\1F2D¸+G4ßõ÷éÄzì·˜;˜àY½MC$üæi\Ï&¨ŠüëE”ð›ÿ"ç ‡ƒàg¬ÕD¦ŠKPa+ ?¡8è<¬ìC:ÅÒ$Bs¦šAxÑñG ?rt‘wÌT3tž3¬HÜuž¦Aœh9¦þÄ+ѧ +YBÛ ŸáÕÙWF—ìFŠ_]ú¤‹>uéRj¯ÆÆê9°b Ü +fÍHØæ;ÆzäŽS[ƺ#Vêzwlü·:þJ9;Á½÷3¥¤êì+_)}ªûŸD%úÄ]Ù¡öFl`¾Ò¿‹Š4fZþ¯ ÃßoþþÛP¯È˜ø‡Š>b´†´dy#”`#àgâp¬©¿ÿ‰0úð=‡-°Â÷^Â>^*€X6Ø)9V‘×G¬.#ÒÆ0º„‡C†Ç +!4öçŽÈèã.Ä + ab%…÷—oŠê"v:¬‰1tŒ!0ú9Šç/ºùgÐÍOÐQéQéêè£Á=¢iD§2’LzúR”P‡ö€6Ø,`Ci‰iv„7Øq”`GøàBc&CA$ô¡°BýB/Bä#i| ¥‡mk`ÓGPÞ€7¤áŠ‰LG Œ!CDu YT´á0j +·Ÿbþü¢¬&eýýÚ/:þÓèø-Å‘;0 +Ÿ¥éHaz1‘x\ÊtzùZÇ/u¾Å–¡ÈŒ-í4{±dfGÕK½ž×iÊÓ<ÿÖöæb‹PQum)˜=.e¡WY »¡­°{ë²2½%)LåGÇЖ…aÿaF6=¾V©–æPï4;D¶è% 5Ãg`ªË\B^¥u>šˆô†—øØó‹'~ÉaF :3§ñ ˜¥Æ¯ Á$éXcyáÉ¥…Ó4lC1¬Ð|²œˆ£˜kXÇVÙ«W|ìàa)PjèÜ„…w.À¶ÉÂøàݺ`[Fɉá{:µ]fâå&4J—Œ›I‡ÀÀN¦í¥žV,v/Gcaqƒ]3Åͤj&Õâ/µ(RÚáïÄ<.{9E%š+€HQïJ…‹!(N;‡"ÜAuJkפñ0H‰;˜³ ïØ°Fz‘%&žr(‘ÏõË0g-ì«üåÀ€%V—US¶ÃÐ0G¨åÒút,ŠoñÓÆçPÔßá30ÏëMÖñïhÀ¶èšÎÓ}[áGᨌHnà›)¼²eÛ è<5LžÇ æ@Ù´)9#m°ÃîJcBD ±Â预Ïa#‡"ÀXè弡ñ»`^‚=7Ä»‡`¹88½Š·ö6ÍIÊlÌxdS/áéáœõXRfD8_®b‘K¹«1³œWãsÆÐbA#À~ §Ü†Ýक़™%²”â|²‹?Ø”^Û…½¦ΖÉ3Uak˜¥³¶XPÆÒxX„:^qòPyü6ËeÏ0G<=4Æ&®éÆL'ÍÆp0ŒinÂtxT5iÙÉIà;†«ï®†˜ná“[”¯&² Ê«m0¸áÙ¶ÊØ(W~§+Œ=P¼>‚Øni¬ÈD¬·YÅÕ©@£Ô=¸(P±X#ºûŠ‰žifej!Ú$ƺnj‹4 65¼xœ2‘iÃ^™Â^Ù¥.Ìò¨È03hÙ¾°†Æ2>Yøxfâå4Ñe=¢qq$.ºÊÝðiÛàaÿaË ]'´³]J!stB3½óD¸šøÈƱ-þò T¼]nì185bwÛ- +]I³g6^Û á3'¤ ÊŠÄ‚¹,êˆ+‰iS¤…çŠ3Åû\(aÙ™L‘©]WYhä}:ïa^ìÔTˆù±—²:EÇ#ú´ø-+ £ö*DŸ~Üf` +ì©?†s@På–Á;€´§À(Y4RŒö‚y¿°_zІÌ¨30Á@Ç+°€h*»ŠÀxíxÓŠl‘ŠšwŽËÛì⣉Wl$†C÷Ë°H§XÑ.{ÿgâÝ! + ­€Cq^M ¼»Hˆ@q(5¦Â0áF#D!G >‰ ¥ | Åúa±¨ må3£”kxë(Õ°Ùã"ld³ç”9‘Ô”«0;–ÎÎ%Na˜,;6qYÈ#à88)¼ÍfXŒð°€æCg +ò\DÀÉ"Lnzc7xðèQ-Ë~K²Ït/6)tñÛ´ˆ©Ê(Ô‰PD Ò)d —¦øl¦ÈŒ +Ô ø®;¤éì° Jm€ÄP 3yžn‹êÎΨ iéÚTX¼¨@‘ÁŸ´aˆ‡0>h3:P²T€ÐœÄF +=6iTŒ·£@ˆè"¯¯z4ƒžÄ¢"a1þckü‰˜}Ϧ,g„ +&K4`cZ"S›e‰³1 L€¶Í¶Á@ Ót5ð>õBû¬±Ê6…­e), 42èú5"^8ƒŽ.RÐuKi$Ãb¡—I©£yd¥c¿¥¼3ĤqsQµ1'e4~R·:уc‡Gá " u%´AŽÈ²‹’ÔÖ‰,‘P]öº K(!)pèy3KMá°®lƒemeÄMQdˆ7»±à»Ø¿ È9†¡”ñH¥‚³äàåD›¦à9ÛAFí:„mT +¿­p6¥[ìÑ“­9˜0ôi0ýO7˜²dawêÕbq+-D ƒ2y9¶ÑY¤”Á +…Öt¸¢¡3É{™Ò°b Ûäm(Ü“ÅŸYê<‰¶‰I‡´`5‚‰"c%ˆê +Ž££³@Z*èV!Vf‘@Á] ‹C¨0ŠZ"æ@C‘j„Á¯#>*À£#;÷'q \ò©SèVd«qSe¦ÊBÃÇeQ¼Ñ°²IIi +]Þµ(`¨N!åèQƒ…¡6)Txd ±ŸÌs|ƒÁ3i,ÜD¦Î“akqŽºCÁ£ýõhå±á(ʈÂt­D‡iF„–€¨,°—‰p †e:ÏuLÁ:€DŠart`<=r +ÈWøPhü¡ºäòóì=L™? ~€äÀrѸ"P#à±£2ÙqM©„çC³ÒüA²Ë¥‡Îƒî§è¡¼Íô•Çy%4A\v¸šŒ¤L9é#…J¶Èè!<¡ ýó;1ë‡Å ÒÈm$ˆGÒuheHÜ,œ¹Ž†×DHjøÕñƒž¡S—±+æ”T-•)}¹“ÈuMï±ÐÛAªºo¸ih¥‘{Qgùû4ì‘™—¨øÐR`§L•¹Cyf +ãC¨¤û±¸-Ø.W P4˜˜„äJ¶¯SI2“¾,½Î tÐ +Y&UMaL8ÏM1¤¶³ùóBDHðªh)j ^¢—˜B£°Õq$'’Ô .EêI©0lÇqAÄ64L—‚Ë 2A®/:@®hoQ4ô}R¸0¶Î6Ïå™b- IÎ.‡óx4ý)*žC 6 ÇPctn™<›®%éJlQÜwùÞØYK0M@iö* qFUX-–gÔ¡ F຀«:Œh‚³©»ôˆV% +bŽ—ÞŒ1ç“.½Ö9åñ·_ +sZb-æ(Ƴ%²ÃááI€ÂPI,ü.Z@$KtÅSåz–ÏŽÊQ"œSì¥,&Æ%Jx ¬4Ë“Ê[¡¶êcÐdÁjÌÍaŽO:ÊPÑ‚[bðSr#žZ¥‡|*q~òe)$? Ã_!P«–ð0 ª£[˜"‡£ävÌ ¶'ù?\ôu»–ð`v]<;£Ó0“›‹ªˆG‚hd©S9äѪâÉ ÊwŒÄn‰ðQSuŠyÐÛƒ6!!#žy`ÄÔ(³pr +Åâà#$LÍÇ'GóD/HèâÛq:YáAûˆÕ¢SÕ`49ø6}Sšá2¶Š'ÌÓãé F•hX{$ŒB€Å ÇŒMç>¢>Xʘ‚4£ßÆFŶþe¡õÀöP¥SqtÞéz4T ‹9\Ò&eX&A…ŒU1ÐE_Ùá6ž^’3Ea—( +9 Y4 *ì/…‘”x8i0¶~Ú;s×è\Ä`G0UqTŽò€x¼®ÛèDAç‘‹gé.E=@]F‹‰½µñøÐ"ÃS! Bë@ŠNš½±fꄃÜÕÀ«däë¥ÓcR`¾¶Ãô2•Þ[£ãÄF?’ˆ‡Ž™Ã5¾S@ ¹GnNÍB¼Ä}KXLŠ£Ÿ¯ÉØ,SÍ5uäÂø h€:-ÚӶè¿ãU\4b=²$Kr—i26W€·-Pcƒet !àyý ža ÕטîC÷´¤Öt(õ1•î,2Tø…Ü +èH³Hˆú<«zn•dƒŸ:Ä—Ñ¿‹èˆWзJ¨ÆÓ ’Ç„@ˆ§}°Uq\ 1Z…ÝF¿ é†xJÁL]ƒ§éÀÓmò¯‰ß5–>4ñƈA´Š–$³áù°CÇêd;Z òÔ´%ªÖÙL,ôÖÃÞè&ƒæ€)€.@âݨÜÉF ›U4 zÖyB.ÔT˜»Ž¹µÁŽ6)Ÿ60¹O[cÊ¥0…ÅD—LíJ  @>n /ä‘™ËÎø˜pÁ³i€?2[õ|ø³©‰EÐ:*MZ%†X6<Ž¿ÑèV°˜4ûu&°çQQÚKô¢¹$©¼´ÞAòº“‹Aa; Œ‚yÒÅ ŒáàW ¯£Al #£¬Ó=òp¢ý‰ç ŠXŒ© ”† Áq³™î€Žr‹7ÏÑyPá@ÓuvˆGN7Ód¨ƒêËÖªá5‡y>õDµéª–PœnüŽ¯Îå¿Šª—b°ý¤“g¼Ö… +=‚Xó˜é”^ЦïÈ>ÂC`’FoØÄðŽ©Ô_ƒÊ€N«&Ëõ"DGÇí§09A.Gh +;¤¨áwä;ðCÎH‹>ôáWº #bêÓ•ZTDabt’Žãb 8øNÑõ‰c˜\…Þ%Ô£ÀýîQÏeˆ€#H;la“{Rc5ª‡ºÃ6L7ph—ü*è3QÉÕ¯Ù”U(é©#æŠ%£€aº%,ÒõÐ4E©¦šL‡D£wA5™àÆ‹ + ×b^_—ñD•ŽKctö‡¯7lÎJx±Ñ½ª"áýkß=Š6žo€<¤ˆä]Ä6.xOᥠ +Ê ÕanA/^¡ægp7Ž¦1GxÅbñüòé!ž à™­Å±šÜ–&¹Ÿ|-“n‹£èQ…cßeyKmØNT*u*Ÿ©5&ÐÍ…ÎFò¾81—ä0²,  —Å— ˜&ð8Ú5ä²xòŒQ:U }&Ú=_9,Ú– °Æ„Æo1A‰|¿;Œ‰Øȉ#Pæ8 !i’L&/)3p—%€¹ªtäcÅ¢Cà°þU^v›U˜%´ö>Éf*ã5…y›(%Ê|›{féF %Åäö™ È•‹Í ;ÐíÀO‰å2å• <iP‘8¼æIUŠO—±\i::ïLæžÆãKÑ J‚Ú´¢åXøœ¡7¾•àæ´«´íV¿Yu_Jm/ÖhU=éZôzg¥6Æiǧ†b »x´N¯*u‡½áˆnÔYþ9·Ç•?åö¸‰_[ÍãN­ÙƒI§R¬˜î”Ë?L¶ñ‡ýr\ïÃߣòXÁD2Sm•½X¶Óï¾ÄJÍҳ׉uª^gnüo1öc®T¯×ž;¥öK­ÂkžÃÒ–bf¬ÝKÇN–ëÎÅRÉpu|‹pe=Ö¦. ÁÑ×RýÝú¬ïhUêbLýb½Ô{§kêb >ö+/CêˆÖ€èGMØé—Ð(¹—R§Ò¢.JõX*Vô †×ß(_û +8âWªâoÔE¸ÚA«-ªp ֗׬5bg^©±4K3¤ +aÈŸŒiU6¾Á‰$Ìþ*1J+ˆ1sñ®³O ²Ä¬Xfç1Û6P÷¨å~­ ã1w5ÍGÄAõ±Xjþ]+¶=° ¶©ò~B¡[Š]4›¥†WYK1ñ/°¤%z*µ£';j,xÔ¡úŸZ[L·°ïŸ'Ç£ÈäX¨S#ÓÄ=qx€bBÇÈp¢É¡L§5(CÖ€®FüßØü™;3 +áqÕ>Æ\¸¦©Ã‹Íp1':ößTд¥  þùïÅ(¶5‘”ù-~EŒÿømŠ˜1ý÷ƒx7zhÝçÆ40 °žžÐ8Èþôa¦NÚˆÒð¯KÿóIí/Ô_+ªÒ€) ívѸÁ½ý«Ö;JÒ$”¾D”f¡½?‹ï¦—ýlï¬÷­îu'–öš­ßšôtÌd¦Ù±t„ zÖRôϯžøu)ǵÖb­<ëC¯5c¬+cº$¯²öÀÒe­[ý ;ìá¬Wª¼~GÙR·V‘&ÐjVûµÞGš®LÄ–ŽKÞ^ÎzÖ«÷ñYhôCý¨ÃB²®lõN½J ôÁ*þȪq8ÆXtM<·Ò,v,%ˆa&ªk»*†sƳMËVQ°@™F—AYä{*ß!+x•VDÉÇfh¤ÿرëÌð‘F‘ôD*ø k]Wa9ÞSl%6KJSGÕ{%F+ÉÀüÏÑ"²ŒŽ8lžžº^oŽæ?¢=Ÿ$«™.Õ@ÿ]b¤õ=ŽÌÉP±}@ìXá M¨}^ëýÈÆ&wšÝšn¸Ã@e1кízéû:7bï%¡§ŽÜ5í|ÿöøooeˆˆIß½ì³uÌÒoÝX¼§Î‚¥®•‹¡Låeë z1ÿ¿þ$XøvíE×+|õšGÕ*¡@èhôËå(Œ(Š@u"[¤M +Ý ÄJµæ‰í°™¦Ü@·³ø<:›•€ìÏá§ãÞ÷°ÿRù¯ÙaU™*ÚŸ¿Ãÿ^°ÚŸ–ŸÄ'?ˆï¢€‰¥Âï^¥s ¨í0õ/¦Úæÿ‚ +ø?¬µõ{?¢¶`Töu|ð8¦khxGÆu ºj­f™ðÙuOQQêëªm¶bâëB<0U—>*ûsAaƒ@5‡ªE* ÛÛwéEÊ?Z/Œê—VôWËLë—Zô I$$¦Xöe8¾¸s’­` ºâÿéøbþZġ¨©¿ôèa¨ÿKþa5:ë}õ`Û[O½•"ýw{A?Œ§ßï’üqaìþïç¿—g˜È4ðu<ºùTº¦¤h`(8.Þ‹lxÍîOf±Ìì*öÿøã[ì Ô}os±Ú;õzŸ®Í´:éR{¸á%¨3k,¨U~&–<hô»?Cçb‹ã¦"žïŽ‡«ˆõFZŸ¡¾>[À¡õÔíÍ16A—~¾4{münˆ +z­ñ_/GMƒ›#‡?Wœþ¯IÖ|§ÕŽ½”ª­ß~‰Ö›hý'Ñ÷è?Puwað8îŒY½‘Ü9L Sœ—ëÍ*gÎŒõ:½Ð b»Të`é ¶j©ó:œUþÜüïßË©ƒÝìVêТû]ïøl?[ïwBÀyiuþÀ]”y º…'ä]»T™“@\évØwKÜz%`ÞÛXá÷v øsÖ{ju¼Ø¥×éÖðêÅ?Àù³X{u·_<ýßËÓÿG-¡w|ˆÙDø~س[møÑý‹,¡óN©Ù¦Ò/^üj#¥‹ÔÑÇd‹xáÐì7r­vÝÕ÷¥G§Õ+õ¼G´Ž ßС Tm5jxÃä½çŽçExOu`¢×Üœ QÛµæq«Öì…úh´¾zÛǽ.g̬´[)Õ¡¸XÂòƒ¿\Ê¿(Jä·c¯SñüaØ|è§ýZsø4o¦téO)ÒýöÐî{b'øåÝQÆå/„ø…ÿ_‰ö1_Éß{5Í6þÍç—p|G8ªs˜U‚Ä#ü¿Ž¹ º `þ¿¸á/ñø !þÅã?L:ê‰Sà—hD¹†©nÕvMÃQ1<°:JRšLPbtµ†»¶5fHºÎ_u¤ö‹1þbŒ9oÁçJ†ù‹½üýWÛ®ycØCÔ¼)_%Øuô_ åCùW3”_weC1BŠŽ S‘¡èäéßsÕš.÷j)þüv_á[A/Pÿ“#Ôÿà@ü¿ò³Øª×JÏÞãÖÙ¯ÃÌóaæÏ'RŸÅrÙã/åX)Jì–|×ÈqQè¥4³º M¨«˜ñÇ2­ûXû/¤ï ( ”ëbvzW£è•”AO312‚vµfÇ(ç é`jvL†ÃP“ †"%(¿˜áŸÉ é¹â)Ó5c׿â/†ø/¼±÷óÌVõ¯6[Õaf«þËlýŸbÒÇÀ:KÕV¿óKgý—³è²cBýA­w¨Î+¹þ^íö¯ô[ý[ßë~tg1›åª–j¨&°iT¿UÓ6-ÃÅÝ°tÒÒ¡\70๫Y¦Ë.ƒDÙÑår¼ÎFàÍJZ‚G”øåÓøS%EJŒåZ¦×éÆ´Xû/}×:T MáÏ:—tú§ó±§óÿziwúsŸuŒŠŠ7á$fá‡MôË“ûr½[(-õë½{‰ÙÕíºÏìFlÀ¿‰r‡îI H±…f5ˆûn°Ùc0¶@a#x—Y°([S ƒF±`Qfä40)e°DŽ–­˜‹@3—ÉqÌcÚ*úétKËHÞʉîçÞ×LDË'Ž+ƒ’¼z©õ<öÛÏ}¨¨ "€f¢Æ’µNé$ÛVåÙñóf×R>†Ô~0 븶­éÖ (±Š“31íŒN³ƒ©é6€Ù45[#ýH•‚kaB)L «ù“E5J£ù®énlkÍTbÙ5[ç 3]Ë5ØI€‹ñeÀL\(sá«ËB×*¶{¦™ +t®cøUÑM”2vóúà4e¨Q?!Ñâ¤ï˜Í”MJ¼Ý‚¿L À*m¥å(¦éª˜Ý•GÓ²uÌô Z¤­Q¦PØf⪨:LTåpdI_‘ƒ91–_G ›‡ià4§áj<ºº+ìf›˜‹Ž@Lºné: 9¥0Õ, Ê ÇQÌù®8"Q{í°‹%‘MÐÐ`š‚ÓÐ] =%]µ1!žI«pLhØ|W)ËŽc†‚±”dL(³q4ÀtX.Ì$»fÙ|µYꨈ©”ŠêVØ*ÌÊÔñ=fÛňƺ®Áÿ»t”J‰"Ãè7¸Z=˜“Š·RÄ, µ¶Ãg¡'ARpˆ&OÓú´L1[ šM;Q»¡mÕˆØå­0Æ…£ê¸vÕÒÉnuJߺ>µþ\^’[fÿÝÀ{k`P ²ÈšÒðPzu†™À–²4 †ÐJ›˜ Jsª1ã*fëÕˆ—°·j¦Lúˆ’0ÎËõ§¥c&'[Á‘U‹ðÐ4uèÊ64D*KO1€Šu$hÄ  )>Y˜Ð!ØèFhTbX"AsÎNËÓ2Õ6S«›À¬ˆ©p]G5Mƒs\[Õ0å0Ú„3`¿ššlvŸ–bÈôcŽ`va\œ“íÏ ˆÖTmØ]ÅDPØVÓÐTÖ€’1Ó¦ÖTM`°.È“Ó)˜ªvÝE9¡^™2T¨Š¢0*‰Dfœ•%fÌÚ¶) 4ÌÄ ­TQ `÷@‚[À˜‰#O‚5€€Wl’gf×.†â—SPÉ0þNÊ“Ò- Ó¶+ºãÂGbµH"Àà<Àè,†C&ªHi  ² SWdp ›†!¦¡=ë€E6pYÌó©`adŠ®¹ŠÎd² b$p)ØzlDIZ¥èRH:QI½§¡+>[D_ +0{s1ÆaŸ6ctÚ„»8W9’­Z¨r!›”ÁMìÀˆÏéDP|pš˜0e@RKÑ7L”9~0¶½É€‹%†h Éa³pðÕH, KêaŒPÌ3»Á¬ÍPîP Läª(!ƒd•èª£;PUaê;À`†•¼·'¦ÙNíù¥ …iJU¶Æ ÙÚ“‹`ÖAz”²5h ÔÌÜÆÝb°¡t¦¯QRt7"Pá +EPÅ’.³ÄS’ú»·æà Æö( +ª7â'føÑæ»&MUÇßÜ5“ ¡( +È1&ºqËAhéÂ_à}03Ð)&¦ACJ2 ÂEÅ…=t›t‡ ¦:(Á,éCO÷1ÅvÔM胆Eãb’e—hÉá WÓ¼€éZ¦K æ9à:!6è\ +pk`€üŒÌ­aVC„àUšO$ PG• à2 qj\¤kØ ”NÝÄÌݘV*ç½0s`6ˆtÌ|;õaÝâSÁ €ôæèì‹&WwQb@6L4qö›¡Ã €*ƒ@BÝVö*¨GT(_%e3 EûÅì¼2»ÕFŠkȼŽ³¾}*ÌÐïÉ‚²¤l u\mýãÁ,B—Á"çl&6MâGRº¨ +û‰%¿ÃnþŒÕiU¼n&Xé•šÏu0“—žÁƶ:µ~Ei£Ö,õ¼j쨕°ð~Œ”:¯ÝØ]ò·Zï%æ¦(÷ßÝ¢V.·šðaË딽Ni.šz>zðùV¥ßðš½|©WÂT‡â;e9 9‡ðûõÁþa«ê ýq%–ü½QoÂÏ©R¯×©•û=‘"p)ÓmýoéâOè_ªUy©Õ«¯ÉêˆèiâWüÓó³%&gšÝǯ¥NwE +æ-WýZª÷E],‡gn¬ŸI7ôí_ +f«é}0õVåÕ«~2¢æâÏ]W¹Ö¬ÂDÕ¬ ãÌëÒ"Þ_Ÿ\ûOÚþÿêXH|hý5ÌúÄwWÿM„¾üõäŽU2Fãò*ýn¯Õø¹œì¯ÃÃån ÏPæ‰}ÿrº8Ã,ÿ˜©ü7Pi÷é·°4þÉdÐEeò_¾Ë)Í0Ó®‚IÐ0rü€#wúC»ü³Yp +ì~7m€Ýê:`¤iï­êÛGVõíg¯J5µ´ ¦¦6¸…QeÞYÕ‹‡îš,MÔü¹ë3-mkäñwá³þÞú~«U)”ó»Ëãòî‰[£–Snõ@eØ÷žzGX–YÙ`›€z@|ñ¬ÕïT¼,ºþù¯6Þ”!¿Êë•:Ï^tt/twòÙúÁ6?Yí=>ÜÒŒb«Ó(â9ò’ŸjuolåÐbåÚÿzS^yÔš=¯S/U>fÇ˵. +¼»0z«Ð.Aw•‰Üpýøâžè~ØÇö,¨û_T³u€w×s­:>yyaáú?™#MéŸp£Æw-²YâO–·ï3Þ¿Íü ¥Ÿ=›V»WkÔþ  uÿ”9Eý³§Ððz¥j©WúOçáþ‡ó˜ªò³’ÐœT™3.fdëžWEø2è9ÊetKÔn—ªœçŠ€6•V½á…¥z­)jP½ßm·ø\tEèwÕv-íÏ8³Ëô{­Øi© ¼ž?`”úÌì¨jL¬*Vë¶ê¥ž+ã_ž¸4TÙµKm¯ëÖý:¡t°F©Ó+·Jj¬0§ã½6[•×V¿{î´úí0;Å®dÑ ujUXZ‚üóV[‚}ø·S´+¥_}›u«Þ*—ê§^»_ïúK`ÌuZíLÇ+±çƒj]d{mK3Ó–b¸ªk›†¢Æ\ `ê6^õÄÛ"lPzŠˆ™<í×½Žl0‰yêØžp4# ª’^4kÀK«ÁÑ‚ÿDô8sÊAé*ò”´X +æ4jR§^ý¼uÊ&Dº¢„飃 +F¨É0{T¿„xRÇï0hž¯ž¶C34g¤†ÓbÏA¯2N ©«‚næïò{Ý–‡bêÐ^¥¼Û­ï2x·W¿¦ÒÿŽØ½ÎW/vü3V¨Öz%™MáU8ÝïVðú\©ùµÔ xsòöÀ«ÖúØ©ZkŸ¿cŠªG4ž +ì¯~[ˆHàã4‘^LÒ¡f† :ðº/¾êLØ,&éÝA‹£~¯ úìø6J ,&·_j>÷ñÓq«-Tb zgÅ«X®^kÇÎ[1¡ —Ö WýkaðËRá÷v«ÓC›é¢»>_E•HÇõRÓ£w†´?HÒÞøV„ü£›9– ÜYÈ;܃+íÍZ÷6òLDÒ§wšUï÷b­Óí}'Ë¢AiòŒ¥JÃÚ® }èªõ^>ØP•í‡gá÷00‰®ýÌ«´šUiXÐοcñ`LÉ+·Õm3€wìÃ3𞀂&$åÏúe@äb«Ùëž"¡ù=JËm ¾Óf×éÆ÷G67€Qtw퀆Æì'H}ewEÁÜ $é¨iV¾+-¼Üò;°Ðg jß20ÆLÒCÓü«G¤ø]$ä¯n(íØ‘ï‚\jûü`?&^±3Ða4nõJõ('l²Ó6xPjŸž^­Þ¬ÔûUtIdyݨe4rJ`Côj•Lˆ7(4Ú½o¸ýݨê?Øä<…Ǿ²¨Œ[ÄV ¯A Õ½ÑqÇA m«afÈ2è²|õÞƪn¨;º¿ŒÏÒ=’œ1ŠÌÐD†[»SnÚkÆw¶3†Íþf|(ç;‡Ò~pŠ&W}>Ö  í+,ß=”.yñÆ2|£ÛVúŠ*ÑÈõáÓ|§•ùC­lÞJù®VjØåû^#øêw ¤üТ¬¡¨ñN#c‰¿×H ï÷µr¢ø4rÀ–ï·Ñ=´Èz/ЉÊAÀ«óÇ(õb,µëØ:Wµfµõ[w(ï—ëÊÿ{diÒÏ!Hd4.3b×ÇÃ5íVû[,[ª¼¢º9hË`‹®Ç˜p ô‘§V½êqh$kX*ŸõðAÕc²›“W!óí Όޕ0•ÜÙY¤¯P•áû!5 –ÍgÌrÖxRmò|ŦÂÀœ¨eºƒ¶lÛÖTóýa†­Uª^¶_M6¹FÖLhhI@]’«D»v +Æ2;7º;¨3ª±Âñ·—øË¢ì(m‘U&;0ÇõÄSYO”ëÒÈ£«Ž0£%û™:g3ËÇCÍV \ÇjMRcÑéï ®˜ú³à°3œA7nݸþÙÔÀJ¸köLödÂnhµ÷aÁFxÒxú68geälÎ}²2j]çÃ\μ—z éµ0¾ÿŠÖxÌMÞJá¾bRÜžˆ{e)¸j°TiÕñít€C¸qäz8ßã|ñq{VÇTÇPùÖoMvë¯æ3 ÿàsX«ÀF$‘ËMÓzg s`À¡c€aµ5¬ ŒŒžäA yƒGöÎqç|àRÑص#²?=é7ÊÍRM˜ï-Cr¬1»qç%ãD«÷:x\²ÔFBŒw®ÕüÊoŽ[ U|ó×Ãìüa1j±Ój2ÿÖê¼¢»€îxÌ#óØFßüü`ü×íáËÎn[£Ô@^߇cND ¡V“Lºtp1~xð¥)n•dkæ¸;h5[E‘4Δ[_Ç/Oõ·p(1þÓp»ùR?æÒCUèæ ŽìÒ8á˜8„FÔ±€ ³¢è*FîcžÃ*h3µ§šP=¿ŽN¥ãéï€?^¦ˆùa€E1ÍxG+/0Woø>eLÌÛ—©tZåRo¿ô‚R~?|Î[í,2BÑU~×Îâ™z³ÇO0?Ærxe2i¢|õ(9ôÀ">^º”Ââõûvƒ9Å?¦/ŒÂVéÐ&ʦ>t€3nÜcG2ȢЇ¥í{«YõƒF,âßVÛ«Ar¬U¡ÚïëA Ð´ÛïT Ö˜-uºïƒ2r{g\U¶¦Zóõlí•WÆÃmN™ç/À)b ŒÅz/^¬Ê´ÝXW˜Õ¿½xÍX—Y㥦7†+u±˜EÉ…üëmi²r{Ôy¸³o­~¬ ¦N pËC=ãЬ»g ï[ ´ƒÁü¦MXk¬×Â.*^¬F†V)V/}ët° ä¦A¼íö+/8½&($µçfÐ ­ (Ò‡Ùµž‚ákÝX¿ùŠ;ÓVŽ*Z;ä|~ù>,qùå¿¿­ ÜQœÎAæ#ï×öeÀXU8þNó©õ~M¡¬}€„“°¡ÀP&Wj³sóšu(ŒaØc¤ô±¦Ô0Æö=j„d“åÔJ, 5™ +—óÍÉñ‡Vì~&ZqÓ6[fmæ,·³ã˜yq46ŽfnV¯ÖfWJ׋»úÌQ*»ÙÙj¼,?7ã»Åøbr6W+¥»ÓÖÅvÁšZÞ¼ØZ?06–÷ïf6;ýŠ],hNB5Œ)Eéæ¿äŸ•éÍ•‡ôüæêb»»ÙÝÓ–&›+ûñŽ¨´ÛË>oŸìo®ÞY®¶¶^ɧӳÏCíWo`<;_L,ÛŸ¶zù/÷YãSj1Óhíw3;g½—…ukª_ÌÓWÙ/õÙ«‰DþIÙ-ílÚvŸìË“Û»Ìy.}9zP¹Þòýæêkñ~s¹›n,äýbr«ú4‘ `?ÃîåŸî¯ìl}³~½ü”}éå^ìOjŸgòuÿmsucöŠõSîæžZðiæ-¿S݉gSΗéÌYjªÉæp]ªö'î—äB¥P1O’¹ãqe5“Ðg²‡‹Ÿ6s³Ŝן_¿ÜzY©TJ¯ø©¶PxÚa#«ÊRÉîÔ¦?/×v«Ùzbc6ÕY¸ëgöÏfÞpþs›+»/úDÂZ¹¼ßÌ4+³…µƒ•%»q·V³í¥î“žéTvÔ…×eÕï±’ßí^ØìYϾҕêr-·T‚ýUÖ’©E/[·l7û‰ÍÜÎêÔUaÑ5»°/;·ÖÔºk=,¬^Vo—µòÔ=u»ÞLÀ‚Ö­ù)Ü’[ëÊ:i"œÖ³¯sVŠ£æeu_Qï§òK¥Õ™b|áSG±ð‡ê…ªL$”òäŽAŸÖ‹«üÓêUaUÏ->³Î´mP÷ZYX_/,jùç5ÞÏÕÚêJõËáí¤?aèï(kòQ RvןÀ}05¹vŠ•<ƒÊÌx6ÿH i°aXŸ¬/•ÌyþËBþiiï­P*ÍNg­òÅÉêvþq=sþRéeŽ§+™sM‡ÝÏØ÷7SЦú©pýy£ïƒˆamM^ƒÎœzº³-6즕:+T žÐmina}jåŠíö<‘(<ª —Yãz·¸Ùé¼\ËW´CŽYëX°yó‹ Ù–ûexá2ÜœØÆbW‰•…µ~²˜¯«Ye×\†?[Jõ³n•[›+ç½ÉÌùn¯?ÊÈNJp݉cÙ9ð±·t-…SÿÔõŠÉ™ö\îÅ:ýT(+«óy¯ÓYT¼ãµ" >0ö·2»*aÛjês)u/ßùb—í³ uÎÞ{™£‡ìA1÷´ë(ê^¹ZÌU7Ä<‡ìÁV¶n­]}[½ýµOÙíó©µÈ&0 ï(¿õšð`¨“Uä0ºò´|Õœm´^>-ö¶Ú“e×]X1#YÙ鶞rµnÍBn™º=Öæ¦v¶ƒU­xË3  äÓ9D¯ƒ…µÝO»bÐç;àc:üšØŸßê=V™³Ï»ù¥ÚZ²È:xšÝ¶2ç­çÍËóR±àœ\O$V”ÂŽva±u¨g¬åkØó¾[¨¼¾Íˆˆ@ê%Ƙgng÷=®ÍfNëíy¹ÞIiØ߬aŸ¾Ì§3{7g͉„ÄÂÅï›çöÌQnÿí\ ‰Œù™üSfö!$N‹Åǹø -xnÓ’2Ë‘_ùîãï¯!I#µž!ºÕ*,žWÖŠ'W@Ø×Ó ëk–N¿fÎ7›¹Zí¤ŠK‹c•óüÞÞvª¸Z0çèW\Ëó|“U??ØLdë»J÷ê6 OÛ٨͛—žb›ŸšÊ^²Q€?Õ¬²§V3ìÓîÍš Ÿ®×¡¬´)—©ÏYà–A^³Äî%Ÿs¢áø4çSÑZ @eìO²]„z§ðéKžUÁÊ8ŠÚ.ÈÓÃJr?4J#íBš¼ßb÷µšç³aSÂÉA/4 +M…–I=â×¹ì+ãѪhlŸòà û«…zLÞnH­w{G«PébþÜfdP²Ê›Š«'É?],l)^¹˜×æªFd©ª‹ÉœË×ÃêÌë(º²‹÷óSÅB³ÿYK¸ ‡ïþêâôÒ­cWöw³'Ç›°–›Æ!7ðû7‰ÌÉáÙe1?W?ÈÞšQì×~ùXÙß+·9êsÐ>½Â¾ä^îâË ë[³îÓ°ƒé½ìëÁ¨öÇOÍ.£§å!ûª­Åƒ|G€²\mÔ@Rõ¡ý)ðv€Å7dì?{d”b|lAºíôÉÂÆeéM pno®ìÝL‚ùø÷}”9Ûª~}Yëh›q—ö€v`-Ù×H½ºìQO¿ŠfefòeÃ;{—z¥‰ õ>&çŽë+żùI[X¿¹ŸìñV¾Ôí¾D½ÙýÇ‚'ì˺µÛϧO«©ÍåÃ/¯¾ˆ:·&‹Íw ò¥Úo­Z~ézeSÀsÖ[zñ>#<»|r[ù5ÎA¯ÖLóZ¶q´R,¤xÙ£¾þ @}Ú-,Ì[O’Ä +ðQÉšžzs6—¯Þj+OÛåçÍåë¢ÜãØÌvwË ’Ø«‹7Ö6õ-Én^SI‚Þ«Àþ}ZÉ{í£}R'¬©}c +Ë´üÞùÁd0¼}Yß?A·1]xTš÷ù§óüÓD¢°Ø:ègÌÍÌm¡r\Ÿ‹¨KÜ3ùœx†êNÚÝ¥ÃËÌùþ&’¡›œüjr³“rû™ãÓ¥ûåÚƒó;~5û"©7L­-Æìσ‚rwQ|\yYŠª­¿5`“Ÿã›o/ø÷ªŸqÊíç´º}¹ÈË`‹A;Ÿ~K“-w.ò“ZÞßÑ‚.|ùŠS>Leë å ðåõ“µ¾|t³¹ÒvÕÁ¥ñz¸/PÓvNZó#+Q•åjµü6XåS*¯¸Ÿf‹9ÏzÍœçKj¶îL9Š¶øVÛ\>:©Ó†If‹è|b­r} D“?Èœžo¾ âÆT7W[;èn.%kúÞÊæ.7|íÐâòÅ^­Unó;•Óã¬q¥õ6þa*ÂC9)&w7öÝí»b+Á|Ó€h{ÖÊÞtæ)ÿ+>NÍœÁúî +_zòAÂs«W(g瓉åƒý6s~>!ËÆŽßí>÷Rq´ØgLX|½ ÛSÅ\æTÄÍkàcùÅsÓ÷²Ùº¯™ÂyÆvOŸ]ãs¶‹Ì*#«  (¡©4—j.žûêÙšVÒÆëæêzû +de½©Ì éÂ˾Îöv³ÆÍäÅöÚ1û¡•r5/ÔK2}‡£¼î‚ùQhÉtgm¶P–kêS`"|rƒ.–U'~Xœ»9îeönÔª4èÚÞa5_m¸‹ò™Ì, \þèõ9à¿Œ ·>¿˜¥ú§Œá.¶¾äŸÜÝz¾<_K¸ûŸ;«ÅL½9IîоÀîãQÞòané.¿··ºÄT5íä,U,¨OÉârætRlèU8ÿù’µV̬g­DÛÌï”ê‰þS?žØÜŸ"/Mç÷v&sÀ-ôºØ?¾)n*½GØóf¹Ÿ_TÁ„½À6®”£2Üp¤nõùä3.ísûAœ]m&§o+ÅäN#ã¾ÜNóÇgÅDÛærå=oêÙOF@‹\ ‚O‚Egxûl*—ÿ¶7WS鹡£`¥™-tßA¥‚>HcS¯#™½($»å{d$jXJwñínêfä(gûYmîé|hêìnMæ½Lëåh^¶œÆQ*¡½°øÆ"¾ï|¿¥SÜ+-_:ÛºÛJlÝ;€/¯}©ro¿x»¿9MªQ¢žlmäÓG/«Ö®[‹­âüÜ¢j‘Sb³N‡+ž[¹äGpÖî…¼RÙ±¡W'~Çd±Ý®>“{[®¼É„«'wSøC=sVn?1kQ³&Ÿ³I狤)mn·ßUò…F¹ÒWKöÊÉÑq次 +³“ßiÔº ¶² ˜aÝ*~>H¸£5€£åÕS€ØAujøv Âq[K•B¹µz§ÞùÌÕ}¡ôyg2ÛX˜‘´À1IûØ8¼†®Içö‘Î$ºX) +”§GØÄíù7P¹w…D&öù¥3{]œé·½¬ÑÏ‚¥–¶d“S•FÒš.Ô³_¾oæwª'½ün2YÄcÐvn”©—¤z3;q1òn´ñAåu˜ËÕØÎTñn1s2ÿ²ÒPev¼Ûï);·[«zàk¥r¾|øPî??h Ä1Ý?Lÿ$£Òš—•Ø?Ò9ƒCBy½ápÌ?Í´§¬Þ^o­øXO/…F©=,>Ãntçí凅3<Zˆî‹>×ÔA!0Jcv¶åªW{Kg«ÛÃk Ðí”®7»sדù½Ýû·¼·ú0léüŸ ÑOm`wKÖrùh棭±­ ÆÕövñ±wŸ*nÎzçáÃ8‹…qaƒhÞL½80ÞâÖÖ'çü®P>Ï\åŸÍ™Z„{ùŒKð,_J3>Å·¤@{1‘ #ÈÜËíê[1s¼Ù^>èö[a× e½©îi¾’+½æçkK{U/x…OO;ß=IU΀âÏŠ(›J'•žD_ȱ-‚Øñ'ûüóöR1ßÏбä h³©|±™9ùy>—}]YMq%Òã30¸³þy5¸¸Á¸!ïôd2kΗ€U—óÏ·ä¿ŸOq(sØ]dN[ûŸ­õ·¹WÙdFggW÷ ‹÷Y°÷-­8g X {ïj±õ·ùÝ|ùÚ;j[ßÞºyl&é“ÏÈû›Ãý„kÀÀSÅ)«s²½ªÏ°è½·,MIxGµ“dñiÕº8®.¥^,jìæ“ÓÅünüI‘WÀ*·Uëòí)C"¡˜Ø·—#}û•ÇŠ3Ÿž›ù§Öý¹Ž†ú¯9«Ï:è>ßê§Û™½OsN°ûx`¶PéO>8GÛú¹«/î®/—#kñû9/´"b;ÜÏçÜóKqO½Ð”ýÚÖV¦õÖ]ÂÛGùûÚÍ”|Z0€åÝÒåA°þ}úïAqv+QÜnøfHWÓéüî”)\ïM*åÅ*Þ"¸Ò6xicr7þõµÕ§ûÞÞ\yHõ3ç9û¬Î*XØK©R¦•ñŠÁäX/z2³²¹r‘µ›;çjþþù^{ÿ¬¾¹$:~q\ú«­Â‚Cªh¡8³µß®#¥ã3î¥eíÖž­óÔÍ'­Oe—^šÕÒ´û|Õ¹nc §¬š«Åog^æ+oye:Õ$ñnÆsó*ØIP÷/Ê[è9M¨úÿ­‹7ªÛm•cGt³ËSXÍл·ØLͿψiå7yrGR°àv+»—þÒ*·XµèkA¹‡Á«ëxÇ:ò¦]jŠøtïòp[ˆÀOR«QsíxøîËÃEuÆ×Ä÷„þâ÷ÖT +o@zœ†‰×r%ˆ”kºÆ¨©Ð›øtgüýo\í1O +°C–ãêC˜ŠÝrð7?úÚ´« ø¹þ]ؼüé«ÎxˆÔýç£È¡J7ø‡ÄxØHŠšËßâŒ#›2Ï‹1nTF_Ýr­×(¹_©ÃNГΆ$w ŸášŒ¹cǦ{âƒaOÜÑ·Ô‘¤¦«ao§[ínô±z¤F9òJ}/»éºZ¡çÍc@Ö©¦ŸêµöK«óOU¯Õ©Àöþ<¹)¿Iºa ?:é0"¬4¤ +É‹ôY:vå•c¹%8½Kž]ßÍžjï°È주‰Ã‡¡¹*ocžðH[½—q¶ é=—‚ÐÍÃ(ºCn0K®óÔ쥫õvç©Õì¡•ösã5í51¼Þ†…{Ù“ŠÔéV*M¼nèë8®H€Ä5f·Ò®‹7Ãë´ylæÑ3Cúály }ÓÔÊøf§&qúQ˜©ô‹Ï%ò|ÅAÙè¦Kͦˆ>\¡Z!ñÝOŒà›¥Ûƒˆ6Ý1HBCHòÎ" 4lúìù©ß¬ŒÙb$_1KK;ýUp¸‘Œ’±Ôò{¤wzŽ­#¢Ç |Éð´T÷D_ïÖÏǹ8êÉ!5†óûʘ[Pƒ!”¢<†÷Tí¦ž`Jì‰íøš Fó-¨ÐåqÎÃ0çcɽ‘Œ„Ê븷^Ðs§}Ó5ôÉ*Ô|¨9™mŒ§Œ€i|œ.@Èõj½qTAÕºîîƒd1£¨/´Œjcø1ŠíŒÛªÒa¡(J: 3ÓñJ"_×–ý×µèÔÃP‘I¿@ø€0 +&ùÊa2LŠ—é1ÇÙºVß~”ïöËÝñãmöZÍñJ]e NùpU»/%0pǽ£ÇJ^ï}Ò@]Ž©ßQrûÀæÊüûÛQ~çm}¸ó~×ïÇšÝÑP2¼uÕ‚êš8C˜’(ùœÆ½ãŒÇã…¾{¼›}Œß¬¯ëù¥£mw¥XJtÖ²gOSûúÊa<Þ¹Râ3ÆöéæòÑfÏ­îþpŽnú/äœûã?âñ¹Ïùx|~v2OîNN$s¿pôGðŒ×6;';*|˜îà×óŒ}ÿ\‡‰ø3éle7½-šÏÌ þnn^Þ¿ÍÁ‡ÙYúZø\ÙÙů+ô5«;+øõˆU>ÿTYƯúšqNô6|HNbß«çøË|š[ï牭Ùtf>Ïc¥ÉÓ­Äë¡Ÿ±u!Wëž/áWš¨™OŸ¦ºð!¥Ò¯Åœ×yïø5Uø¼þ–Ä%øãšYí¥Ü¡¯´ff™à÷bîé~íë“Õ~)”Ï•Éâj¾ŸIëûózv)uœ9ë&Š…ì¼°NÞÊÓË·ti ¿××dL=Ûü…ÌTüEËïèZ~úvYù|©žþñÇL{º³9à%m¬/ˆý˜Hà_Úbܼ‹'¾yó¯ŸX¡ôët@35‰p^x¤Bh Å»°ÌÙ½(~­‰º“˸;GðËÎi0[›°%{r¶áèw‡iu+{óé4sZݘÉ–¦ œO2ýüö°_]+Ì´®ç·²wÖçìëruqóí¦–•P)èõð û•–_yÅëAÏýâjqçȲö*øhw{y¡p°¯â¥'{¡°_<´ôé~å?–^w÷â 뽎-üÈ»Ëü©Õsµ7‘°wëi<Ù¶ ŸžŠY:A\Ú{Z0ìÆ­z™ÍÁÊNwû¨PVû™½›©'ØÉ/ Ù”{r‹¯ugñfÈf]ÏÖÍD9ôRÖ½Gò˜<Ù…‘÷[™³~üe![О¶2j'…vËâ¬éNÏgÖ£[ÊöòÂá?âSsj*>Y|²ºý%Ï_€³\<¾±ÛÃyNò½š›¿ŸŒÏ^¿Åç—ÝyÂqÚW¨Á)6yߦŠÉ–£üa]¥ê ›Ý¹gJ!nÇgâ“3÷Ëñ©Åüa|Z[(Ç6îÌÚ‘ ¸?»¬lÅ“õÛø\ᬟß[IÇN&³ñÅˇËxê®ð%ž.§æâKϵµ¸Ò8>‰«]Û‹ëS½é¸Þ¿°âæÌênÜZœzˆÛêc'îlèq·hlÇ—/âñ•Jv(¾6seÇ××wâ—kÏñͦºÏ.Ïçã¹Û©Çxa¦3/¿mÆ·í»øÎQ{*¾—êgâû¥Äcüpca.~ì“;÷;õÉý»í£É£ê1yZ?iN^ô.Ï'oèç.SŸœ|<‹?N–0òÓÊŽ6Y»€SíûÉö±³£ôf/¬©É³ÎôÔŒ±ñ25W+_M¥Î¬í)U¿q¦Ì}aÊi”ºS«ŸWž¦6O¿|šÊîMmŸ)Å©ý«×µ©ã»cêüËZjêfjnvêÞmON•ŽK)ïù¬1õEÛû2‘˜jžæ^¦º3™çéÉ£§éÙÅÜóôÂÃÖË´²²÷eÚŒ_4¦Ý»Ç·éõ½v|:—Wg§·õLjú`áÊœ>]ì®M_¥—·¦ï–.§KËS·ÓO{/Ó¯Ÿ»ýévo+ˆ¯ô×&‰™ëÃýÄBö.¡–š «—YH¬ά'²ÊÓYbëåä%q°·6—8³Ó›‰›ÉÞuâ¡þú–¨~©Y‰/Ÿí§Jc&^-3³¯Õ“™ôL£=cØ“+3ËÇêíÌf-“œHÌlY—{3ׯ͙ó™Åµ™O'[å™’R3fž=óv¦™¿JÏôSsW³3Ý«ÔlÊ[ºž5.ïÓ³+'+w³Ù½–1»stV=¾[ߘ½ª%Û³ý—ƒÙ'ëfa¶±¿ó8Û{ÝÜþ7»¾O¦ŸÜë¤åZËɵ/N/Y(®\'€+&Ï›g3É»»R%YÝmï'ëYÅJö²{“s³Y¯2·”[8ž³÷÷×ç6ºé¹­·|wî8ýZ»ÞÍ]Í}nÅ÷æjëç0ÊÜ[Ý1çù·…ùôÌíÔ¼uŸ›ßØ6^ç·õioþd¦Uš¿iyó`ßÜÍ¿Öîoç{­ÇÛ…¹¹çûÍi=.¬lO–òŸ•§…ÃÅ|}áêຳPšì&¾8é…Þä©=‘XL>NeµâÎáâjªu»Xèk‹G•îÔâÍý±¾Xù¬å׫Ôdóü5•J¬/¤ìåT&•9|»JíÕŸZ©KóNO}¾»:H½¦O_RýçOJz!{{¶fÊõôæKFIï]&¯Ò—û«ÓéÒÞÅvº¾Û¬/Mîê«K©ÓÓò’S2—rý퇥£åž¾ôéb÷a Ñ\z;~(+ÉdfUÑ/¦^• ³TTv{ÇSÊåsþJ)Ÿè¦Ò„qÕÄNr"¡ª‡sKêÚÙÜ‹ºSRÔ‹–­©e5×R›ÛÇ—Zâ­–Ñ´µÙm½U¨k{¹‡íz>½¥¹ekoûS³ú\þ¬©[ÆÜg=g~¾Ðíì®~ïNoê_öŸcòêH™HK½Ü‚±¶jÏ»7 “ÆõütÏðn¦»FWŸîš ¯ó=Ó½²'Í­\.a^,Í™•Ô³b¾-ÎÛÖü|vÃrÔÏÛV1»tfŸž=ZåÿßÞw/5Ó3{^ïÆ Û“Á€3`2L2É9ÙfÏ9ûǹöíÖ$ÍŒ&8œÚÚª­¯¾çÅ–¬ÐjuRÿ¤Ì‡ò«w—Ôܵ¤¨zö©ú¬y»{¡vÊ»ú4øΩÃ'Ô-{çÚZ«õ£íV+’vY^Ý×^w7ßô…ƒMAú»‡ze©ó£Õ_Öô»þ"ìwmmy%÷Ú=ZYiÌ'Afm4Wºý—Ÿ•×ÓõZ"µº¸ûñ½*U›ÕZ-=\=­Ý´WŸÎwÒ«£{î|Ë,Èk›Õ·×µÃ—Çíµ{í:»öûïòn½°Ñ­®—sOÙõýû—Çõ^gqwýgGËËÍÝAy½öpSÞßÍm—{—{°úåŸ×Ÿ¥B¡ú¾QÞÜlü´7î˵ÁϽ¾Y:h–6·T1½y’I%7Ÿ>߶’·7ï[âýÕëVý©û¼uþ|þoë-}ÿRI¯½¿Uô£¿ÏÊî7¨ÜVš •ŸÁc>‘ª÷sbuKh—«'£ÑNõßC³S[¼ø{ª©ûÃÚÎA±X»9ÙªýÜíÔKKå×zEËeëg×É­úkî³ÛHŸ¿ «¥½±ß?k<Œ†ÍäJv½)´ÛævvziÞ¤÷š¿ùì Åé»ÕVípðÞºx©—[Ÿ¹çíåÓÝòöV6û¶}võXÝ~Ó›ƒìŸ°¿Sî/äwNN_nv^:ýònæàj¸»~yÛÙïDyù:jg´A·½Þ*‰Tû$½•k¿t®Þö²|²³W~­T÷NÏ^…½·Êjr?¯>¿ìo)õ«ýsyaÿsíºvPÜk¬Ôn9áàjþoùà·þž>^î·7®ÿ{£ÛÑQòæßß‘Öøž?:Ð3©Dêè_^ÉgJ‡Üñ†ø¦w´ÒÆñçþÙÎI©¿tvÒ,?œÜdN“ó×ùSítcíôp%spú<ú÷p–{ì,œU®vWÎ.O6Χ«ïùvïì½”÷:ÿ–êoçÙʉ”Ho=ÿ;;¿ÔRóçƒåú…Òºy»8ÈgV/žß÷»ù»Eµ[»9{èÞ\ ÚeòþõßåÊK{ãòtyåûò³žm_ñÿ†¹«]ñùöêéö¡|]L^WS¯—××?å›äMq)‘ºYÝ_y¸9;:iß|Ÿ~¨·Ò½²p{¼üwûªæÎzų³zo;ë½Ç‹—ü]VÚþ»«~ñïw·W£ÇûÅí‡ëûÍÎùýåæáÉýßöáÑÃêñááCç©sø0È=?jû£N"õx2䯿w·ïŸ”åç·§£GnðôÙ¹Êö¥Nî®_VúÕÕãbë÷ñßÁùÅß¿÷›â³(ˆÛÏ'K½gp9“/âÑ×êËaé³óòñ>¼J×ÙÕ×£³•«×¯ý6XŸoÊáãöÛÉuþóíçy{ý]_úxzïÔ¶Ô÷áÛÏýÇZýHûèþñýÏù‹ÏòçæÚÉçç­ÐØùJgôôW=Í_=–¸õïeµ8úÞi‰çß/åµ;Xø9<éÝý|ç“;‰Ô¯vW–Ï·ïçI±Ølo:ƒ^Nm³©º+ÏÂç¯RÉôÛAÆ¥½ÍÁýžÜÌÝ=™`†=dü¨×ém Œ‘’|·,¹z2.ÿ·+ãWÑ}MüV¦˜œ¿‰jƒûÿðß×lã«f!Å{ßxïZïç~ôâ½ÌÙ[gئžþXõë¯&R[Ûz¯þõd¿Œ«‡_ò|¯Ò~ýBXe róý 3‘/Ëwj~£óPâJù½B~ãe$â_‚´v´"ÚGö_¤`UÜ8Ujÿôæ{káxý¾öë–íR!¿~¬¼$³bk=Y(¥Á˜Ï—ß×Àñ¹Ô“Ë/¯Pt÷“¿•“äòÞE-Yàö®´ÞÍîåd5{$ …á ®ö.mÜ•ÅŠ&jàÀ^’k^–Ù)åZ½~5‘€ÆzØZþÙßÙÜÕ‡e­µv^l|_Júàú’«]6º§õ­õG>·¥~q¥ƒþB¸nçð¸Êµîä’p—lðËé—=iùÿªÀÏ®·Åjïe½µøæÀ0y“® éò|ÍS¥XjMac¡u ›à0wk=ÛÃÁ`uØ\h»\I:1H@®ú²šÕš© qó(“ò_8”‡Êƒ›jn³(¶µ¿|¹™\rÈF:•¾O¾‚:½ŠÝô^Nœn]®ßÉ¿¹ŽÙé­ryÔikáã¡tétŠ)ÚN·kÉ«áB§{Èîôh=]^©^í°:ͯ>JkÊà0æ7¤=ö\¥î×àr{ÌNçOÊ¢zœÝguÊ5NÏkN§°.t·ÊBêðdk+¨Ó;®¹pyÆî´YØLo?/Xº\¿Ý+f·‡é´gUÅÕÑÇéXò¡î^ÕîàFØÙÇN³þ5-^Ië{ÕVº]kv*Ì‚:½Ü.¥:¬N)ømãQùJ+"éÖÛépëF ê´%}_u¿Ù®Íg†iui@:%0ºÛÁߟÊf6®nXæ×Vƒfª,,üþ]ª¬NQÂHÝ+®±»vÈ$ð|ãSOIûµ#V§\ãûu'°Ó¥½ƒ~“t +îw®R·Ï5.Ù«ºÎ¥ÞKèTýñt:L7{y»…ŒÓ)¸rØ­üû~rl̵~ýÞpuzYæÚÛºˆæ|3m½ÿªReCbuʵ?ÿõI§(-]Ý’Nµ½úíCP§·ÜÁÇÁ »ÓÝôån±ø=ðt +½nOöD•5WÒi»)íJ^IÜéöI6 Ó¿ÑI»yîs®nôØéi¿ôÔé6×¹M—=B/F·m=ÝÉ$÷7˜ž:KžoeV‚:}å.—×Aò³çº¿ÝK>æ2ÌNoæ÷;}_ùHïx:Å^Œn¯7¸ÛÛ-‰ÝéA~þ'âÙéx‘ ìt¾{›+̘ëZ294ß±Ó¼oÓ›ùymí:]ùõʤ?þ«cvú®çH§¦Þ'ÝþöÔÏé´}¦å"pö0¿ò=ªc§ËþzZJ¼îC§›CïLëû?ìJ£ÛÑFÞ# +SÜbÏØ4ÂÍheÇ-Ž¸zý¬ý‚0•L÷3j:mü‘NA‹9¢p½T87:Ýàw žNçOwN ñ nœµÛt§Âè+)TGØ)ç›iG¼÷碶–ƒnw’^õ¼¥U?=¥IAßþ\*>nœRŸ˗׿? ¢wiXÊÕמ–­Ò“/¿„io¶®¬òŽOÀ·O{!¥OwÁ¥{Ég{õYåÒb1¸ôàïý-¸ô¤£ëN©bÜÉK½üëÓãïƒÀÒÁhY°”Z³ËÉ3õ×*¿ön4®ó\ý .=_<\ )U®3Åå­—Zpé¥|•.½yÏ8¥~ŠÝf¤‹à_ß>ßöKA¹—ˬR“b¼Ô)Üÿz½øï,¸´¢KRpé~Yü¡ð»²Xº²ôóÝ ,M.嫲UÚø(–\Ü+¿[å^Ù—¸Ú§»ôÇ㡘9¶Ð%ÓK*ÿd×~@>í}™Âçþ¸bþu·³a{­õÓÚ;_­”vÎk ý“ÚFþäT+$—þà¯æáfi”®6.®OŽ÷ ,¤-F9À ¥×õ‡,,ã|$úƱKö æ…ôúaÁ°½ÐÏ¡fZ^ÓÐöÎ'­èçti{¬´§}¥Á ¾øC5‚ìõoÕ)Hô>°Sâçtª,$RèéÜ8ݺ:í^v +¦íÜ)ú9.Nvw‹žÎ³Õióƒît-™¥;•NiòÊÕéÓÒÒ‚Ó)xhÿÛÝŠ®Nå´þ?ØJÙ›àNç÷E—=æî–Xÿ‚?Öÿ]@§Ý^`§0—ùæ¢8Wbýt +¦Ø÷A;VŸ‹Àû»àNѦp³Ò"–.ÛLs)·^ò®~@M±ÊÅh‘»Ë­l…×3¥%1¶yA$Éø?r•&ÔqÂ2e½yQÒÜ6’Eô¼ÊËuƒÿÿT ¹ªí®á!Ñ~wìì& ªœÍW¾‡ûÆà¯Æ ê¤g`‚îÏáãRŠØü9«Ã6; Æs¸ôcU9Ù¤cO ô¸9•rþ)ÿdžNM‹™´BÇ” : tóרäŠë‘!WJ/ýZ +ÿY°©“cEæ`W5þ~1ݲ (8Ñr¹ž2ÿYÞûf Ê5¤Æ0tH üò¿Œÿ\™6¿s1Gv@}#Sß 'ºùÏýEÍñª=óý‚3WwÛÎ ÙóâÖ/=ÏZ?\}× +âþ<§}ÆüÐxkýÌ k¹þ[¿3±‚™æÒ¾ŸG5‹Ù¿ùúÍ°É¢{"5.g­cìÝ)Š¹)ßÌfçpÿªE‹“' –GôÔ¯Ë9·è©;¢ÇÚûöüÇ\îòÀE@{À.âê— £ÌO»:zÓÛÔ¯½£éý¥A¶ï-Û´cž]y[nþ*»lÁÍÜ•F<Ž1µÂh¯ )ßäú£³’odb–É°÷ó{Bà$K/ßùuÇs(²$†¥èZ’f”æ=†Ì>Pý©Éç*o ¶A`‹£K‹½k£pÅc}IeüíK-A/ û)Ôzjzå´ŸX9ZíšçbÌAõçƒtå¦=šXCBƒ.PWÛ Byõ 7è"m~ªú»žšpýÜ'V±:…™1CÇ0xˆ÷:}c¥ðq%ÆjŒ›%ÅøÙQL˜%ÅÄé(fªe“Ñ–ýŽës‹{Jß×ý’DëX¨\<1%Ë  ’c£dl›½+Ÿ[nO|š]9ÚXÓQ&ç±L«\ŒRÓPG³ä Û §׿ïÅtŽçÒ‹Øɱârðкˆ +c ×3–m CñØ– „Ú©æ_„ox??j2TT‹„®c° +Ú–&§çiFf‹™Ú¶øU•íÍðy— †Öê¼m:×l×ÚÚ Â\n†¿:žå)PØþ~L¶B„Zf €æf”YšÍüÄÎéž±.SHþ©‘½\`Ëo“C½ çGgC‘rÿÒ¿cÄ3|ràý‘V´<‹É‰%Å`†DLbÅÚâlf€ î:Ûàw†ž-..ê?ÑNZDt‰DH>wÜ[|‚X‚¸¸’Y M"5ŽS±ã ɲ¾,Kòî¸-øɦ&eœ©¹veP€ƒ5¯Z oØsñ°;¿óçv)'šþ+z,Xv”.4î³CwcÄ}©Âü[É\ƈ„ÇkІê„DlX¢Àip›Ò%¿)ý³‹£éÈLiqã,¿±_¢™êg7äL*R º"Š+Géq[–%ìŸÚÊôûåg—èÀ¸|ÎÖÈ0”gVa|¾ëè=›bMÈ«ò‚@"á„eJºÑ&@%‘ŠA˜h[vקè‚8y!Ž-‹‡Uîü#ã»Ð]—ˆ½ïPç'ä*n‰)\öÅÕvØÔÊ0Î~‰oÅÆÖGSËä‹“ )<«†§z9rÎqض€{Á ûV¡ Ç×bØN˜}W‹A;SØ÷t+–. Í…‹ÑŽÛ¾Ò…A§<ô6<¡ Ãu¡ûŒï.[`h˸éHºÐ±”zƒmHçaÅ°.0P×r$Ò#£‰élÈ ˆE:}¶(½HÅØÝÐØKŒ ¼·é¨4öEGl_x6¸‡bc9—½A,›×ÎRcÆœp3CB×cdæ¿b²F›š^µô0ô¨%ÒËÃp6á^t)™HÓêóä®E.ÉÃ0$èß\FL)Yº3̶…Æ&;½aŽkƒßmÏ&Bò0ŒO¶V{ ÈBĵ,ÅJ¾%˜˜OÀ…Ä`]Á>®ð )#H>Läö26®¹-p!Ú*Û³p¡åÔWÿÔÚe£s’Hm–F•v}p»Þ›CŽ óÜÞ01†.AgœðN¡ GÐ|å 0tá:7Zpr ]8‚.‘š †.AçC Nˆ¡ Gдœ †.AçG N†¡ Gй²¦ÀÐ…#èÜ'‰æ_`è"Ï+§ÇÐy’ýúÚÊÏm­ÿD»½´]ŒÀêšž!¹µXä ¬!UÃñD .ñ®þd”—†³I†eDz£éàÛÖ¼ÚÞ½tV.NÂó̼t +8Gd™[ÑûS‹`4ñ@x'_î3¾iø)*˘_4f$ 9w~FL©æ‹\AtÏXÉ}î“‘ØDˆ\…î—q@sAf3“]}Ù¶Ðö¶$3nÔï¶î­ tmܤèn!÷l.6†©uc@‰"¦–H• v‹8øOÄ»EEŒcDzì6u¨ª»üjóÇ'LðC¸ÂâäZpÂM ŸÆ‚•3-X—q߈òÉc‰‡†ÇéeDHâ¹½dHq!¦‰Héƒðf$Å +œ9Ö+$1 NàÌ}ˆ&QÑ{[&¿kƒÙ˜0« ¯Ä¦Ñ‚ãáÀfWàêFâøÜWL(Z ŽOÀ¿ ëfb@ÓÜ™Žžø1À…8¤…À!9KçY¿@Ÿ;‚v5CÄúa3ó{>5Ã11†m9Fcá· 4ÅÊOÆÆÂoAg\¨SfF±PÄ̸ 9 +Ÿb‰6Þ$=ßQù—äôºÐ3•‹Ûñ Gö¾•)H61älö€&¢Ðržçb£ æ]"t‡<ù'B:W.~ݧ¢;{­pgÏ:M ¡¶¼g˜Á®~Pþ,‚•„…ElÈ +™g|A|2 Á‰»MöC€[ôÞ&G,.ä”ǃ’‹VoAgÏ-Ø•‘û<ÓŽdœu¾m+2cå¶#ƒ‘>Qv†ÃÉð£xœ[êø Hûö¹L=XŸgÝŒRÞíAÙccíøí;Þ}þH§Q>= äX"5^xg2d\"5Ö Æ‹ÈØCrEzÍA‘ ’÷N•)è+"à%¹#2â¢þ^rGdvÆŠÈØ7N31_óÓ†->w(Ïbx½üîR¼ØE xÎâ +ŸžpjŽ_ù¹3uDahÌÀÃx÷)íL‘ñ R†6mD† óÜ™ ;î¢#ÎI¤‚’]vÂá9csp.+‡#/uã,‘MÇX[nazLânÜL*ç*ÈkùÙúÞ0[#¯e¦‡¡¥ì‘ˆbL]9JÆJ]ðó'9Œk;8 WçKšeZ‘¸ºqs×ý^&„$2i£Æâä˜iëÆ9êIô}}ñÎÊââá"îë›Î8Kò"âf‡ŸÇ&Áñ2TÉ6[<Ü4ªññpaˆÔÙááÐã›<ç––AM‹‡³oÕˆ Õ˜ ?c<œßL雬u¬SõÝW<)^lŠœHm‰à³YåDž9nô4{¿ó×~Ëé1”ŸÐœð´‚/My­i'•ˆßÎ{ËÁvbåEÞEJÀu®Mè¹MküŒçîÂwîMÈÊ"ˆ· ÇÉi¼qáG³HM&Ma/³Ú†Vjò¸Ö8Ò{B7Ú…ã-¾<ý6ÄV<›pïÕhg d’ Û™öª ÒJt&žio4tìtEH\:͸!^íSÚsçp "õúw&ˆT~>â•øˆT~Þë7NHå祸Nh"õ~¾tn.œÏ‘z>#DêùŒ©ç3A¤ž³®¦<¾ø5÷‚y®v%,0’Œ|hÏ6d\X¬³p7Ûv¶P8c.­-6+(ÜwAO…³ß¯d66+(‰[F{ïSBá˜~åÌ¡p¬¨Âì¡p†®t›†ÑP¸x†¡s‰0[=ÞðhGÜϺ 8%6á…j¬uÆfôð¢×ðÙØ0Õ¢ë,)†$Æãþˆ;¯ ¦ÐèÝP¥7žrÀ!QáΈ'ÕÙ½øf“Í0^û†ÏÉÂ×Q/¹Ü¹­' [âm²°£×ñ9ó*þÕM.¿¼â?›Éücq'¹\;®â?ø¤¦¾h/ç’gÀæ_½Á<±ú,pÏO è]ëB(IóŠÎÆ­Í/…=W,„ ìòkÂóQ@§ÊÂÂÙÏÇUØí2a7œo¼…!ìþíŸvºÄïôƒ:}r#ì¼h¬Ê Õ©ì¶ðÒw„¢Vþ]ü´gêEØIÙn`§@àõ`„×йý€NÉ{|ÇŸÂmî,a7”‚;m.ßuœNýïñõ3êKÐ{|Å°NÛéÀNa¿ ÏÊÉÀ¹&7o +§®UíëV÷ä/s!²Õ˧ÏÀzdï[5oÿ>¿"[T~oë‘õä“ïì{ztt½å1E­#œŒÿJÃÆ_ð+I¬”[ß]jn –qFtU‹ºö߯¯ƒÞ±:L7è1Nþ豃Çȹ +†ö¸MàÈœ«Y¼$Dz~©³¤½$Wf¼#7i®?E2<ßE˺\Œ¼¾ðwßföˆ\`ò´mdž ®F¾¨âŸ+?k k þJžs䉉#•2î~Y|G…‘Ñl§™Vß ÑtÞbÜyê8ŒMÇò,Ïbvh:VÀËõçLÐt¬3ãæÉ)Ñt¬oŽâôh:–.è®›ÉÑtñ£ÖÓ éMñÓÝÂBÓ±°tá9Š“ éXç4FÔz–h:–ßìÖ•³@ÓQIJÅ(ëìu:4 K„™MçxÕôýc³FÓ±V×ñ÷g…¦caé|§ S£éXX:"afŠ¦c­Ù/3EÓEXJ3BÓ±š +<áMÇj*úMáqÑt3£X¤M8Å&CÓPlÆh:–.6Æ*6šŽ%3GÓ±°t‰ÈgÇEÓcFf‰¦ca¿(ïuFhºˆ[gg„¦c­mÁÎ MÓ¯œMrò>C4k—‡ÞA`”âä±VȲ“Ý•ÂÍð¡èv·Ç¼º)ÐK‚¶¿’cœ@àSÝ œ°.&x¯Žeð„Y“½W`]D¾W—NéÀ!QgIqèmX0YÀÿ~åÍð%vœ"bH¶(`ÝiÅ—î!ÅÙÌ2%lPQ@Ä, ƒŠ½£†Ô–®cJZdº=¢õ‘×#BPUÔye¼0ØtÏÜ™ èn“œùÌ]Ä;#Aä󙻀ײÜÝMzt¶ðäùÉãÞ w¡ÈÇÉ·¡«ÄVÏ¢(;`í91s\ûer`íy¸W÷­çëßi…k¡V4kÌœ+£±#˜¾Ø¸ÑÎôÀZh%ô^¸ñðíø\^ðA´™ZcdªÄ„1õþmßEǵ©ÛfuøÐz“[‹­db^›ÄÔx×eâ‹çHcÑn{"¦ãÞÄ +SÆ-ÝSfãWÂJv +cø•‚ëb,“ÙKè ¦¿HŸò’ÒBå¢[ðb\½Odš/åÍãÚe!\Ïb\Œkåâ=³ÓÚºðëåŒGu†¹OÇ mçyÑÀc­.}z΃|±Ó)^1û3e(ýC_­Æ|Å,î+_‘/ÆX]Æ)O0´i¬Ôª@K—Ü7¾‘`7’t:d& 13!C锎|»!6*m¼ÔªX> +•6?­.‡Ï/nnBÜR6cÌÏ…±‚AÇ':{H®ŒÏmã›Õ~aåiÙ‚ëŒëVÝå/ß›)$Ê<ƒswÙ‹™ [+¸þöÓm}6çÖºv>†Ï1µÐ»lbÆǺË?Óĵ¬7Rë×µ8‡»‘/ê±#Ë”´Œ‡œèZ·®ÂÌêÊFlÊÎÒbÄaâ>Ém¿@é¿+®áI™fžVÇ’0÷ó3ò‘³¹e‘Äùrœ57^  Áº +Ÿ~].FÐÎ}Ü–÷'<5Y·.xâüqÑmZð+½±îˆ ’½ÑÊÉdþûǦ€oô=ŠN /8ÚØ Rj1¬q÷ \ò> + +\ŒÆïdžr~E`¨ÌØx,(gP'3xÜͼûeã© Šv5ø}±q놿ß=Å¢° @ÆufÉ~™ëV &b¿¨g¿< +p¼xò¤(@»¿  ûöqQ€q1€‰Ô4(À¸ÀÄT(À¸ô$yb`\  ×Gb,ž¾…£ÍÑøgãQ>ï+ÿ3ò¹99µ5ñ£|.ÏâìQ>fnæòE½ó>›GùÈ íµ‘Û5ù£|Q¸™>ÊÇÄŒÌüQ¾™¼_ù(Ÿç¾ñ°A…ØÎÆh"ú]¿ðWýf€äšÙÝPÑïúÅ¿jšwýœ©Íàn¨Àwý£B^;yÒwýÂ_õ›èn(Æ»~áá² |å¸ïú…¿ê‡“c¥,†¾êǼ¥y‚wý¦ErÍ"[ÑDr͈ôªßxïW¿ë7FÜrŠwýÜkóu†±ßõ?Cu’wýXpÄè\¸qßõ‹âäÙ¼ë®èGkqßõ‹J›Á»~~‹ýªŸ7Î?é»~ãóØ$ïú±àˆ³À¼»ßõ o%ú=¾iŸ²µÞã›Å»~áÀwûÄjÊwýÂÓÜØ·ÐŒÿ®_¸§æϵžì]?öŽ¶^õ‹Æ½Æ{×/œ”ÎIâtïú…'\'|nÊdïúƒJ›îÁûª_ m9æ»~Óìýøïú…Â$ó"uªvÂoñã=¾¼cÕŸò]?§Ö±•í%Mù®_ø«~ÆÞŸþ]¿ðXA"5›wý‚˜ÝxÕ/14Æ»~áçÍL96Á»~ãdLþ®AíÕoò÷øÆy\3ì=¾)¶!Õ +nÂ)oo°ßõ ‰9ú%Ü´ñ®ßx7êLú®_¸CmK˜)ßõ³ñ[L€ í½Æ I³Þõ 7sH¾å Þõ Õo6ïñE¡pã¾Ç7]4Ëyoºwý¬VØ(ܱr®ïúÅÃ3cã¼ë†7ÞKšþ]¿Ím¾ê$ÇÆ}×/üU?êä}ªwýÂÝvöºŒÿ®_ø«~SÄ-Ý‹— 9å»~,ÌS0&qÒwý˜C²½ï¨Ûæã¾ëç7 éWý±¢c¾ëÇXXJ$RÙu4)#ßõ Äz챉ßõcaÑœðqhDqŒwý¢Ñµ³x×/üp¾·gšwýìýÉ|Õ/(ßrÜwýÂ8‚ŠŽ†>úê¿‚¸ +ß=£ºkg|PÒÒÚå¡Ý«°ÐnHâ½·tž,á*úK}¸¶=šlv±!˜Md²_ìðÛ¡¨ÇEì[K+$—þêç•ó$|wòcVéõ«ƒÁºP)ŸÝt3ÉÔ—*%Ó+\#™û>9J ++'{ùÕ•J¾¼>À|þ³Ý—4Wßÿ¹†^ßä77-®¹üw̵ÕÊ×¾º|äörÃ"w²š–¹“ÞF…;{{xâ:鯮Óæ¹ÎÏÎ"w¾ñPãnÞw¹›Qñ‚ëm¾¸»ÜqŠ»[»Í"¾r¿ ·n”Áð{i{ð·2º.üTþŶög";Ÿ¿ËJ:¹wVI jæ>Ý?\è\ž–¿¥Æ’ õöÓw'+ÚüéÎc!Ú8L—ÖúJÞ&RéVÿº^PÛKo°$ùÂÞ +ÉÁëM)uðºwLÌ}ƶ§Ñ¥Ù×=™ÿŽ\O@¶‡äÁüÚZa´‹X„0á%în/s>Óüꣿå6Ê\ãô¼Á5¾Cíü‰ ImDª”=ͯ— +ä5Êy“X¯¿•ÃëïUünÁc°»ÄÙ>åõŸY%§f´µ­»ü%r7?|óÂx>syïü"™)ÜÏ#ÄvÿYÅ'5“…ÒÒ-’­Œom^ãCš:ΑöKVvz´©‘ÕÚúün·vÏÏoóµåÔ_#ÓÚÞôóºÑË^ížîÊhq,¢„‡ûn¡`xNeùzˆK¦$–[iû/|¡ÜøûÀh>«Óʸ_ÐØËøqÙüX-ñcÑþa)_ï\´p4×âFç§R}½/ñ\©,eua¼›u†‰VŸ>ºß\m'X”§f°ÜÎ?ÚºàVíÛN7 iž·¬þx‡,ÄRJ}p¥æzÎù–ÏUùU³z³ºLÜ/V×­‚í"‚#s@»ë<+ ôí +ŽyòQÜ8KÂÇÃÍ\"e7Ñ#*¾mzç`ûô+„mPjÈ1lŸƒT9(áÕrË$O>ž‘fsâ¢þ9‚Wbiïä]„ßžæóå…µ2—…¹§ÔW ¬Çïm@‹r­`øöÄò2zWt¬ ã~‚Te±f5ð¸äy·›¨”¨&øÆE“·âŠ¹íÏóø¾wéµ|V'&02Z™ð¹õ]ç×ú®;@ïõà+/.®­Ý†%,çPÞœµqÓØvƳ٫ŸÇ\©ÑKbÁ…aLùoš0D™Øcä¥h×­÷ÄÊ„¾HJ +²™«—}/g5Õƒwóºáw¬:0ö¸ÒAÞ°úºîÛ9²Å.’ߥºq_ ҽ"t²/¹†­"5Ñоÿc“à–ÀºUß·‰pIÆCá]û1VõïnS¤HZKÞY$J È•' Êö4n: +'ÂÆÊû!ò¢›?ÍÄtªSûén²÷c¼bA¸ÿ/éðAR^-Åàäd’‘GX»’ݵ‰Ðº)οYD(ùíÒ¬EÅžÅH„Çš9³š˜„ÑÆsäÐQDa%³£Ó{e7Q-¦›ÆÙJÉÚ•“­ñ¹¸'Rv˜3ã„9¹§LfÅ +s®ä(ßžšAyÓ hÞÐñ¨r£H`<*‘"=¢ñól÷ÇS„SCÀû9ú»³ÌƒUü}ªàYz² ŠÄãC É9$‹(ìpWîófP`ã?Ñmƒ@ëÈ #À†\1=§å½oc9a‡á¦8*‘ˆ 2;FdŽð5yã7Gg¤Y‘ÄLˆi«70Æ€ìŒ;ç´@Ç76W±—Uqãtt\ù(>ç¶ÿµk»ÛÉ' @ æí¦îÄ€”;‘¤‚û`-n‹¬öþÚëv‹yt¸ØoÞ\jÏ['‹¯õ˧C<–;åmV¹nþn7Í…ïÞŠvPU¢#ðBmCµíçB@¡vTEy^²Ž +Ρí‡tžÏy+RvNN ¿ñ/ÑþK2¨¯~âYÒ¥ÑôÒ{$ iŸ6\rö_· wÂí«5šK‘.¨½/ZÓ7ٚ˥b¸µ\vQƒ])|œ¤êËzövs•ë,æéPæÓÈ0&äücc›9eù¦èt*.e¨7ðO÷#)7„ÇÌ¿ºæÞ³„ßIÎxìÑ5î:Ýj-¯eú^G³Â´Ÿ2×XQˆ,±÷þ%‰­ýÿ¸åÿËqËïÿ.'TM“çTU—çJÇýÁÁàõùõkn9±š(mmóüÙ×ÓwcÐïŸöÿsTû~üûìæVæJ['ÕímM®õ¿Ÿúsh+ß©TðÆ`3L.ÅÏ !Qû§7ß[ Çë÷µ\·ì®§N1º&3†ÌSxëïUrYhœ$3­á2~ìñBŠûÅdƒoVŸ*Ü¿^o(|ksm'(aß;D*x(Y±µŽAýcŒç¯%S}~Gv‚Ö~RÞlêœÞ:Ô§¯!$CYIUÿj—þEmáé¯^½i_(ûÕ§ùÍÒhmg³4|Zmè ï‡õóMñvõ²ýUn~t.®·ZJò!áQ·ÉðùwrØŒ·–¨ÚûrNÿ ëƒì¤eKŽ’m‰§QÖ¶47­\L[ñ¢È6À^d5gXÆ× cl£+Ø:rµhý°Q²÷8GŸ—¦_z¶bÏÒÖÑ«±u&9|¥ +"Íèe +"®ùÆìD\óPlb"®ù`$ͬÅóLæ) ˆ¸æ¹Vmb"®ù†ÆD\ó!‘šÆ€ˆk>Pæ̸Dx‹uD$Tºùº ³Nhé¦ 5½²ô-HõóÊo¤e®–×eiÍ’›?P°·~Øá¬o4ôÅã'ðÈZåßÅ϶ã¹jÓÎ/Ùù4eŒ×ØØ÷ó;ÄWÊ[U:¿ÈØE¤1ËJU±³KLˤ%9‚Ö<ÒòD"mcý×\xð¹È=ÞѼyÐX‰ºf4þ;[¹bf9‚Gví_},B [b׃ãúórÉuð)·0~d|òþ“Óªíëå"` áòY/W·OhÏG¼ ô殺ã9âåêkuÖ1Iò"Mü¹šh-µœSi¤‰qÓX$Xáé£ËlõòéÖ"BÑõêÃôë9¿ëô{!·ÿMÝ3Òr©Nͧ+n@/aD(æ§;ÂÞü#$À£˜‰Îo-(t¬Dæ£6Œ“æÆ1yÑx†ÎIÁ;ÁxB+~>®‹·‰‡á”Óxù󜥛‹¿‡×Þœ„<íºŽ¨|Ø ØqIyزRÀ¯¤§‘[¤šØ¨þ~»šøNFIJ+é¾|8˜·šè~:Mp­½î#ÝU÷Úæß.µðîGJã>†iyìäkjë¦K»i~$§æ±Î×Ô<ÖýžFôBV0%.æñ2)){ÿ›n5º½àíšHÅkâáwš1fŸIÌø«Ñ}aîx‡¥Œô«Ði¼OÉØݯ?OœfïÞ`í cïâo~º1\.,Dkdaxí4‘Lw^Nè&bë[#{FñÐÿ¢DÄ^(–rK˸”xxN+-¾¢“ÓBõÐïwƒ3íä0¾|øKÒæ]—¬ÔèVÆ°'ÁEÕ- CF›¹ÊI~½H.ÿþ´“Ë{†¿¡ÂNèÇ–L—c½+Ñi–KBÞp­)œC£×s<¾Ão+rò¾èsÙðºðäû< ï/@pCJ†/Ý¿ïeÌ¿Þú9óô€@AœÓràƒS*£5Êa ¦;~¶2²ÜñmÎq{é4~Ï€3ש@"Ec5ÊÕu´Y¹<Û° +¶K´s€ Ĉ$R3D‰bDH¢Ç¬P"§—Ya:X‘Dj†(‘@ŒH"5C”H F$1K”H FÄ™%ˆIÌ%ˆI¤b£DÐ]uå–Ÿ¤M™µ¥¥ÍЉ<ü6©xñnˆ5rúíÐT¯ó‡K¶¤ZÂ¥h¼ kn4YÊ‘B;ƒo-¾¡Ðk-;aEøE¶-‚œÝL¤ðRÓ"¹Öðš·V)à^€g‡á—¨»%HúJyÌ?¼³ÏHrf°šz =Ì3‹å3’fº[rŽ3]­ÍYÑ<ïY‹bgæìsÜ,É1DŽßJ(½ˆÌb½AÇV¡ÁÇ,NÛÎY‹“üïrV3{õ¯'ú 3‘JÁ7'ýÑßV{•þóëWûþ¿úƒ?güƒÿñsÊœªÏ ²LþÏÍÉømû!‘i}^ÿ÷÷×èþc®ýýü=W˜«~|²sí/ha«žHõJ[ƒQíõqôúýu?ø¯¹üêb¯}¶]›[™£èa½BÏl`u.Cæzðk¨šÅ#Ö?Wª|`ÉIã|®þŸ?߃Ñï\çuøúðÑŸ;ýž«žœDקëyz nn þñ8î~"÷‡_ôþÿÔàÿ ®¨©¼$¨’ªHœÂéêWT^×tUD^Wu ¾‘N“]æ4ž5¿QU%]–UPðW2j(E`^ ö2l5q®šPô"§)"ŒD…í!+ŒJmV%ÿ‚ÉÌ]Ñ X–QÉ¿ª*LCi +$D.`i@j6@]—yF]+ÂÏ5X<^VE‘ìjY)B§œ®è(‹™U­’e‘$ +<¬«’ +ÛÄTS9qN—Š°ÝEÃ#D„©ãB¨¼C›ƒ¥Q ÖASxØ­©"£%TD CŠÀ}(x^QÕ\S ŒH¨AWÀ¹ R%•Y¬º%"!wˆ +ò ÈM%.Çúk<+£X!¬À“ Y殃ÌÎ "Hå²¢°k„ï«*ìOT'PKFµ¦ +À¸ªjèÔ +(QP@ÚPv×EÃ<)Êéà(F +Èô2YØâš¿”\$”ZäO…˜¿Þß«EÜ*Ò#£‚âüþ1Áª `Qh]øG Ñ#ðÏ€*®2i ¹¦¨ 6Ïø}AV‹¨A¶ZƒxÆ¢hÌÏW.‚½,¢GBzƒ úkÀ€@5é&…¼Ý‹°-@‰ðFÿþѻʡ}”ü +¨4‰U^P`›ƒ}ŠovJˆWP¬’ ¿(Zƒb°Ã$ _bl_+Š¸%T{€ eEÅüˆŽ(IAWœR0óô¦  ^–½tP +.”b72Æ–›ù£H¹ ‚Ša,PÜÎøUÕá/"ôà`yœö°Ð墵PAPÐY°fÌŽ£Õ7·&A¢€å! +¾hT¤ŠQÅ^çw¨Ž@˜(º=\D4s``Ðôæú@󌠓Á 5W,7P T)‚³ Ø<Ÿq5ðd4{äØتìbf”'³@¹ˆ/‡™$ÔÀ÷h:Xà8ËÎf‹®Á£$VŸclTӭŃ© šÓ¹X´÷IAÇž³íHϺ‚‘YÎäs|°)ÁŒ ç§:¼ƒ6†‡p*µ“Å^Êûj`2éo#eÍá@x'¼b—<ùŠñ&j{;¿ÖE‡šÔ,`cZµ(;ä„Äs¼Eà%býâÏQ²ÁÞV%JòA¹à¬ +hÓ„÷CE‹«E—†‘L0\-€¾öˆ6ê6«úË}ÂÑ[˜B»ÄîÁ7—ú ×oU—ö¶ÑàèÀê+r*O1#„ŽÔûdÕ?ehf‚ñâÈËsäz€¼¢8kç.‡©“îÍÄhí‡YÀl –Ø]£ŠÝÀž{Ú–€"Þ²Ý&EЬ¶L†ràs0Il•Öñ&©à©s¥ãˆ_ "ò%-¦EØ̪ê-„øż³Ð…5è‚saÞ½WÀ!ƒfE‹÷Aea„š(ØzýCkþR´ ¦[²§À¨rW„%2)‡£uJ]`€Âì^D-ÊÓz,uÉ– +8¨‚Ç|´t¢ 6Ù°‚L÷gTƒ›¦£(ÉŽ*w—“N@$ð”1à®AÙdè…£’¯ÉÝÌRqv¨¿X£NxÁ[ ÉœþþyÅÓ¿g +îrs’šäè_2M5H?U hV“÷­·Tt~À*÷󌯇î‘ÍèŒap+§†o2îÆ„UMpŒf+Ž*³Ê)i…Duä²QŽç){b G6[ulu‹dMœ=(S„Ô (ì­`Κ¤¸gb«0äI„»`¡Ù}b9çâN¦i‹ýh¹ ü&Ù6–JàÛ9 +Êé4*`Ô6)AðÛ#4;pŒr0#j„‚æ²÷ ‚%NÝ5° ÷€`K7#ÀŠxÀíØ¢ŽšÙ±íH„Cu‰+©š`î;Ò ú£œÎ»„ª¨(¶6Å`@ò45Áf“e‚ÊE§lLƒZ¼"R*ëPÛÆ$¨*S ÉÊ)ŠD©Zj£B1è Ž’­ÞáÐÆv9A$¨g7‚œnwáÊZò)k4Ve^uÍÂÝï5ÐúäìMç¯à²9H'¾Ð+ï°;c^©æ‰_z¢b¢DKx +`ÛˆÔñv‚©î&\"Þ_ìÓþ*n-ãWIù&áW…^JøU¡×„ótÂ0AzQÄ7"YÖ§m„ný€IW„,S1‚åàà–7Dˆ!ŠgÖª,Lnüu0¶^JžFÀÆ¡‚‹ä©cv…&”ÂQÒTrR³!Õ‚DÐ]Ò¼"g^ Œü@QSÝŽ@ÚuàW¤·8-Q#’ *ËxpC!,©ž*’`)Qèv‚ñ+¾©4ƒÒ‘+Æô9œÿUÇ@·Åsd¤V8âÓWŠV°hûÏ<æ„PöŸÌ]âÙåP¸+<,Ç ª³Y`^”§äU0(àêÅW$ø(ÎH=Ã> Ÿ‹»éÅM _ 4%1%ŠÖ†îB²쑧ÓœFupT8•’<`:/“ÍDÑ£Áƒ:±ðý˜ì×]䯻Ð3Sp÷hA饒±U)¯ÄOg”sº+ˆækvŽ»Ïzû+øxÆWÅËwþaxY×7?ÿ{¨ákÙ}îBzãúAVŠ”wÊXx&ã„!Ýlã*CÙåg:ÏÏÝBÃÝw°¸A Åá×jE’5i¨ÁO£»HáíH|-ºƒz‘ÃÓÅٮؗ{ÑÍ™ùšPe*hw +EE­=KVe'`€Å´üòüÓG]¬èê’`Y2FÍjÂ5qº{7ÍB(] ­1^K„|²ªÀ`u'¬¡ëEËU1ÌåœnY#´|7O¹×Wéó>$yˆnBq©0Êyož$4î ß?)b’wÜ¿eÐ5»Õ•¯ÔØ´fñWÑ![Oi8Õ‘?ÀéEÝiÄb7º WÒ I¢ãoDŠ‡¯‚.Þ*nb Gå¨9)LF| u4ç<Óßž@º›p3«†—¡Øu\qï0ÔÈ™x7†Ÿž6ü´tmJ¹{_3—C“0(äÄZü\¡á)5pk¹+açãO_#>äG¸ŒrLßp@cè¶÷iŒFusë 4ƒP±S Òh¢ô°G5ÁlC#ñ1¼cPÝAqÿ$`#Y¼eª*´Äh@Âx¯âD•}=Ñ\Ö,ü¸)á„—’¡KñÃÜqÿ§b“‡Tào ±sF¬ +ÝyÌ&ÕLødÖdR¦Õ ÎŒ>7ÒÕcÕ½ (`L*ª ÊªrÃج"«ª@?cÖÒ1¸¬È¢Dæ ¬—TŒ$'A—5’Š¯–„[Y,NÒ t +&òi¼¢³-n-0‚ ‡ªò²Üc¬ZžjÇZÇèL.&‹àÉ¥€8CY†}!IŒUýLàÒ1"ýÊ&Y$Š¤ªFr¬¼€yáø°<¡ +Ü *’nTÂÜOE€%'W—xf%Œ2*˜g +ß(V¬ÙÛT⨯ò˜%³™IJ +,$‰h+Š:»’ˆGú˜þ/€ÂÒ%6Ë¢ ÕdĪz_ bLJØ,°{Œn<È‹1)—\DŸì]Øé‚&ø[’DИñÍ8 “Þ_ 6XÒ ¡eŽWÙ³‹^à Y4hb Ï%QÐ ÖEˆ#"†8'²«,8j[Ì \LnTp!Ñh2c„ŠŽ©äBþ@Œ ŒÕ&>#"M!n«mõM”QÉOW0ê7&fÓT6ñÁGEè“(èQo%Ðà0eÄï ¬ˆùC2O„æî3«à9=Ç !@( ”È_ Ó xŒÉÊö4Ô1Ïth8ÙØ2b‘—ñ¸ L pÓPƒ‚š’1“ñŽsæ9‡ø7„alWŠE {v»‘ÏaŽ‚3àb~Žµ¢8`É!âô³Š‡3MÐä4Ùî"øŽ‚)½yÝ*nhÒ(|‘äŒê˜ò/*<£R›U OñÔádÉsFÂw¶–®˜Éç¾J Å ÁP– 1*aª¹Ž5`=ð¼Á\0³ñŒÑà0¿;˜%g. ‹À<@˜uÐMW1鸖Ÿ#V«€–W,mÊ¡©h ¸]šÁcʺZË_£Ê^.Wö’‚ÚSa’BÌ%õuæ«„N’’Q v+«sæ˜ Z ÈJ]ÅEÀÇÉD)ÁËa✢‚ÂÀPœ¡?}¶«’OÈaª¡.«H2LŒ-ñýuü";Cæ0°«*ñ+ùÌ/,ƒä‘ð[%n%¿ñó.âY;8N29Š]Ékz1»‹SÉgxÅX¹ U,Œ«Žwô. †Ó1¥•v'pÞOf%XoQ@ nB•Ð/±‚]¶GDP(bB4mŽÇ\DLÔ‡µE +ù¡¯@ð%E¨ŸÑgÕñN`TA˜!f´ O„ö±&±ÚÓvŠF€h”y©ˆI ¿‚`X`¢Žhm°êÑ!Õ/‚,B (búÄR4mf%ß~àó¼\G„oÜJŒ !aÆ6ˆ )€ëÈ®$ƒÑ‹® +Q‰-o%@DY‘Á6MÍ€¹ßàZ©ÄfÖ¢IˆÁÕ¡<£¯êsÝ{AC1®€Ò†qaØÖ¸5ATê°Z˜¿¢¨@L¸±ê¼€®¯€ö>ø¸2|« ”‡ÅçesIa Pœk¼Ñ&ßÀFBОÉʈȱ¡hd:: Éà?w œŽV”+ÀNnbÔAFç8ø„€YM ¨±©+¨>Iƒ!id]ùHÖ ”QÂ*#0ÓtUÙ<Ÿ÷T[ ,0 +Þ4Ï0A0`õ‚¶cTa¬&«"ÏT S¨ý£AQ+!jæ0°²2H*¼÷¼,Q…¹µ¼•Ø[Ë3õv"N(‰ÚĸØé2º‡¹è9yU" ùȨ"’+4êSEØJ°ùš–!Ø5ºÂy&"ÊÖ©¢­† êyQå‘€-UŒSâ½ÄjÓÅÀ´™Æë² òAÅ,JE¡*(s˜—†£0ûƘr .*¬¹\ª  +f™®"ÞV—MŠ]SÅ—6 ®!ý§oãùi_J`jÊGÖ +a±àÀqf 3ÝDDr¢e[M0]ŠD `x± +.§w›ƒ™å¼Žî b‚1*€e‘¢­È\Ú×ÏÉ -l ÆÐ’Õ!ñ¬v[-/X^Aø&³†ksNh/ ’Hb¥<†îÍ{Y|¶2«’?B†… üq!@ï3*1‚?æåÂO@©£H[Éo*Ƙ݄SÀs|oM-r¬È†…æ9ƒ×ÞÎÖ_‰A7w±*ù»‹šmL¼ªsý¹ BÆ,”¡s|Ä Ì< 8ÅxœØ%7žŠªÐÆ + sÀú¡¢]ozï!£†3IºÄ¨uNP7Su5SH‚Uù :x¹¢Ù^!?«ú ºÕ? 43Iô„ØáNöOÍ[çÑX ¼†‚où["‡ß°îÑ; VÿÌXµ¼4òˆAëÈUÃ. ÊÎ9›•Q}ÛGߟ¤‘îöi¤Œf–“i-áÅ.œâ°œBñÉDÓ‹è; PÆ®Rá5'aCFgÝ}ô¨¹ œ`åi !b?*oÕrPœHRÄ‘ ×G Á*VDTÍû \Ls;Yw_ 2A³XGA IE‘iÜÈ(€¡ šH\#ókÑ$vÛÞZFQD½ˆ‰’]G# ›‰E +Œä.%y ZÑ…¾ñþ™ÆN|ÓPÏ: <iJ“wñÅæìÒ(8Š˜Ø”NÉO“†¨àÕ‚ƒ !—ËPÈ–žÚä¼FÁ-蔉8²VÛP(¹x]e0>þKnÄpa¡;:ÅG$¿L‹dZ*â5-.p–ƒýí`nT ¡ _-ëv.o w7ðF ¹‚ ®4à@ÅëíÌf¦˜Ç@cæ"·˜£%Öñ$‰#ÉÕÆMµ&É)ÄpD<Þ£§[ Fö¾¯’¨éÔñ~›]ï]4–ïÍTEÞAöcÎG#©A½ò:…bóÖ ú!²Tš¸§ +ŽB¹'P{Ý×𹓊AÐý½îÊ]p—"Dß\´¶¯HâRx2SóVAЩ`Ö¡W…Z¼Ã‘±jHV‘R3Àè.+žÂÙe:ýShGÔh7ÓFÂ_y×ø{;£Š@ÁögŠ‚Ÿ*‚;÷Tª t†âÍqÀ"Q0íø:°+ç'„§MEAËŠ“=¶îºòEæÂiÞZ7;ÝE4xUA° mjUlk´¨mC™­ƒHròéÀx³ºÓM7ØÔKjÑ–æàh¼)‰tj>ÎÍÕv ÝJ [–!A\Yà,Sâ3 &’P×°ÌmW[¦R:涧Î#ÛIò·äwm|#bÕqÏ-ÀI1° ‚‚°q#Bð¤d˜›»ÛKò·Ä¢¶wDÑëf¬/Z +çÞ`xG‹ÉmŸUð+^×lÇ úDáåÙ©€µIÿHñ^'ÁâFœ¾ŒwÇpàcp¿Äjã?²h}¥1‡ÃªCÍŠH{Fó7EÁ¸ dŽ=üŠ2ÒX³rU!³bPÇۃȾᄯUà†õ.(«Š—‚ >ô.ƒ¡ý ÊؾvüÌ7VÏ‚²ªx)Èg!X³ò-(‹:žvXDö'b­Œe0ª'àñPË9ñs³?ãggV(ÇÏÏŒ–üÌ꣊?”êå å06˜/”ÃØ©¾PsËûZbÑÚ;¢èU ”¿ ýʪåÕf ø´"ƒ ýÊ ¯%Æü|#bÕñëWV-¯6cÈ«YsóëW•|-1¨íQ亙âØ–y:ˆòÉ Ä»ë°cñî:¬XºŒ‰xŽyç¯ ét쀼äXû¬QHªg¾¹¸k°còî:ì°¼·'ÜÝ5TF±o¶þ:’ùGá¥zÔúbjHèS»b¼wTÿz"¯ +‰Têðþ¹:¸ýèÏÃûÿÕŸ»ÿúBPGÿJæžýáè{П¾|ÿ~?±ª§RõƒFâÿ*ìp endstream endobj 76 0 obj <>stream +%AI12_CompressedDataxœì½í’$¹u%øþ±?dF®m§ßwmÍ""35\#%IÍjL6ÖVê.Q5ꮢUWSËyú=ç\À?""«²T=Ó-N¬²2p8ÜÜÏs/þêûÍï¾8~ýæŸ^~îæÃôWu~ûòÅ»7oqз‡_~óÍ÷ß½{˯~öÛŸ\¹›ÑèøËúeoøŸ_¾ýî՛׿8xw7ßyT>òêŸýêÕ믿{ùçÃÿûê›ïÞ¼þùág?GÕï_½ûæ%*¾ý§—o¿8ÿê—_üúÕÛxùůÞüáÍÿéÍÛWÿý‹ó›oÞ¼½{ñêçc0èýþÅ;\ÿÚù¿våP1×Ão~Íú¯ÿôâ»ï^ýwÔºjÀw§7ß¿þúÕë?œÞü¿8|ác>|á’Ÿ>ürF›ÿôê·/¿»l˜îÚìkðsp>ñ"×îb ¡Õ4Gëó]õyö9åPJ°ÎîZi±yWKB¿÷o¾úþÛ—¯ßýæ훯^~÷å»_Î~ñúðk<çëw/ÿåå7ß¼ù·Ãé›_ýë„7™¾||õÍK¼´o_¼;¸À÷{ü¥ó_ž¾õÍ×û=ß^nôü:|©.ÿþ;ô…nù;¿._þò[|ó»—ïÞáypCÎÑoÿæ´¾TùÙ?þöå^iJñbÿëÏ{·oßüñÛoÿõ;¾‰ÔîBKsñNZ­|!Ü¥€'­nFõÁ·ù.ϱ¹VRœç»HuÛĺýýËoÿø æN¯8Ìùï54þ·ý£·Å[°©Ù_ „x7oŠ»€ÃæˬòòO¯^þÛ/ûæõK{ëÇ·ï~g 'Æy¶ŸVóÛï¿yùöï_¿z‡·¡×ÞìµÿúÍ×/¿AûåúÇo^èm«¸õ§5øý‹·xù íÍ7ß¿Ó©ã˜Ö_½øóK® õæÊ—'ÌÊkÜçõ; ÷ËWÿüåŸlc}ù‡w¿Àšw6Ž¿ûãË׿óŸõ(_„ÃÁûp˜ï>X¡±œ¯øQ5t@ƒy3>g?û-ß¼{ùö5¦gÜöÀ=^ýe'/¿ÞÞ'é>¼Ëx‹ö7XÆ÷ö^Å/æÃ¥y[ÞóöÕ×ëê.þPí‡Þö^+?Î5?7ßžûMÓ§d,‡ýýŒoìý`Ößá)ÆÔù/Ï¿Þì¼ùî׿Ãà¹Ïo¾åÒûŽ4‰“‹ÝøÍ›?XÝò»jpù÷´—bË«ô7o_½fŸÓߪ¦~ù›o¾GÕß¼}óýùúŸßL?3 :ûò`uUþ\´÷åáÅÛwÿöæí¿âÏ_~ýòÅJc@Zÿøó÷vù»}ùì´ûïïö?¿üê)ü˯÷Oÿ °Ò­Ãïß¾ø +Š¿—6îÓðv<9®ÔŸãÿ_}ÿòŸ1ìõrûöáõŸ^~óæ›n­Ý‡ûûÍ7/^¿x»¼¬17BÍ LäÚ!¾|÷Ïè›âxêc?l°©zÆ^¼û°£—à×Kßöç:j>‰}÷áþÎ/¾ùæÕÞ¾ø㿼úêpzûýwÿrøý›7ß,}ߨ_î³­S¯|ÆŠýŠ[òí­»í«–õ¯b÷ø.xýw¯mN®ïÔ\Þ ¼È®ù‰Þk¹æÖ}Pùå¿ûó·ÿôæ›Wß}»Nýæ›ß€6¾úê›—¿ûówï^>‡fôüðõ+½'6ù{Ûüîß^€&ÿêÕ?½w[ò!ÿâ8Vèï¾õîåºß|ûG +Á‡ßýË‹?¾ÔŒ–¿[:LâáŽôÅïaU.N¯7õóöÅׯÀ!ôÿýë×/¾ñÿCÿêà~>Ýú<=N_Oÿ8ý_Ó¹ d”„ÏáìUÊ|žO§•{~Ž½4”ŠRN%¢J8ùéäPæÓ||Dy8ÞÏ(v? ¥¢•Œ’P¢J@ñ(î8çöØÚ}»ŸÚ…7Ôµ&/´ +­ «¤–¦ÿ‚ëf\qF“ª¯Csõ±>`”ÇZj®±úêÊC¹/§ÒJ)©ÄâÊœðô'ôTrÎŒóœÒ}:MWM9Å’‹ñxŒ5æ˜bˆ.Îá!œÃ)4(E9@~‡RóèðòŽ¾yè1>ùàŸÝ^æÑÕÉh<ÑyçæÇùo†^fh?s˜=dW>ˆ‰Qúçv¿¡+ü?ƒþ…þ[ÔïQÿFIösÂ/%é^¼cÓ½Øo§åçiùy^~Þ÷ŸúmÒ—g}y¿Tßëç~>ÌxO»r~O¹OyeZíåñé’æ÷ge¿ìŠßÍ –Fɋ䈥rÎ÷X4eÆòñ%`¥’± *–Õ‹ëŒ%öPë\–\ÀÂKX~¥ÖÚ°Oõ\ï'¬ËÇ6C»òX§«µ4ŠÂG,ó3VýC{Ät8¬é€}‘°K +öLÃþ9a7Ýc_=bjÜÉcËEl¿ù¹Gy@y䢸w(þ> p6Ó=^ß=^Ñ}½çþÆÓà.¼„Ÿ‡éþñþñkûæÁ?`—i¦ÓÞùÞëCŃÄÃ_}yzKòuÄk8ŒGÛF¶U6{jîÄ‚m|Œ'›Ù¢Ÿ¹bï0žÄ4·:‡æýz,í<×é|´·X1#áèÚ£õÆŽÜÝlÜ.Äš‘£ &äÄe]ÙtbB×ÇúG %Õ >»9ÕH}|¾@­ÄcÌü"%è䬯qÎEš(NZŸ_=Êò%¾iýñì»zðPòò!͇Vï‚CϬ/Ô1œ¾›t]¥õ¹¤ÐÔS ·yÆŽ£Q"Ûˆ°»@„=6hµx\å +ŠWñ ÿ]LîzÏìï0’°>÷ÿäûÚ³6—½%iÎåJÕ8û@pik1ݳÎà+‘̯ofôѴŹ°/5 +Í3›ÄÝ»wï»#gܼˆŸÐ ô–ªKØ<N𸭮íuuŽ©Î˜‡¤Û7PSN\¨웙D·vµ^å·7Ó|†Í]ã7yÓ"嶎h^_ÐOd]$n§È…n¯—ôØ…oŠßg( Bø„§)û…4î)‘ãç ©œrùƒ¿÷y¨_H>áFÁ–”œ=?N2Ã# +döÉIà¨t¤ø®õ>Ö¶-WßeùǾ–Î’éO}©Ø²¨} HËäÉ~ÌÞWÀ}燇‡{HNLJ†éÈzF>C&z€pt† Dq©AxÊx»b•[DÉAC‰›0îGém'ik¥kižÊYW˨QKR½<Å©\giY¦DE¨R£&ˆ­G°\;Ô¥låÌåQ«æŒÓ°f¸Z@´úB1ÍŠK„‹#ba8,‹- éW¶"’t,,¼%.‚û¾ÆäÏiǤßkÒ}®ªü˜ã |^¦·H‹¨Óú9Ôf³jS'8ždc™Á±Õ+7lît³1_}‡º(ïýLï¯þøÏç—¯9_Ô*Íb·+~S®ìuÎÄ2ÙRJÖR6¥îJÛ”ã®tËÔ9oÊý®l?Ûò¸ct£LúÏoJØ• eySò®”Q&ü¨»Ò6å¸+§]9oÊýZ&ÎÇö9ì£ù’âLÕÙ”ç,®Eš*´)Ñgñµ d–.mÚ4õijÔ4•®W·I¶£“lI÷¦`KÅ6%ÛËôeŠÊ]Ù®27»ÊM-Mj÷P 'ò’®A§Eƒ®‹múóyèÏ]w2®…®”Kƒ–ú z’}Z4héÏÒ Mö‹þœý¹.úóР¹Rl™»©¯é°¬Ú¼,̶,½ó²¶—õã—bË¡ØÌO}šmJïûìÙ|a|¸lË¥Kr1HtÅtťﱑÀ·ÅÃ…X\þ(Ë­<2Ìx0ˆI²B8âýžñØË,ùÚ§©ÐÏ·ÉL6Ê\Ùdòû¬2ÓsÌ2¶ÊÈv"»É¤I· ·É¶‰¶I>õéÕÔöYµµÙ´™´Y´ŒSŸ¼ªy³9³ùZì`^bôaã‚#}3ƒfC§rlwáˆì.ÝúxÛ~´5Êb¬ï1ûý„Ædë©@ÑksÄK›çÀ¾SÂø°‘$H¨§†)ªSV³óÁ “2K&Ü?e¯yÛMg;±Ì²PrD»is7­~?‘ñ|šÕ/Þ´úÅŸ£ÿÅê×5('Zi2˦af±“Ü~¤‰2Ù±.Š½Ô…¥+!q“¬,A6,AoÒ¥J–€IÓ„L‰™“,V&m>Hú%sšÔÔ[ϲ{Q79ör‹?‹ÍßK!„ˆ2‰ßÏ2ŸÉâTô<4mɺF K(’ªäQŽ’ ¬œ­Lå~)[…óq_ê|Y.|SËÜ^òI×ÝÉñ¡œ–0þa-LZ¥›ºŠn4,¤ÃnJƒØyãT>/þb3º<šiÖL¶“†á´š|ÿiVZkÌdl?MŒY-Í´ê´.ÔT­?Š¨ÇIÿ™ÌzÞH8÷]ž5évȼWϼ˜šûg’U‰v¥ØKXœÅË:÷ßóRÌÔheφŖ§'¤»ñÝð®xþíy±;ùåç* ¹E‹¤Ó"0ïqÛÿÓ²Ò²$ÒfY¤í»LýÕ<>JéVÒ¶Y4u÷û¨­ôsÚ4iÌÐ.lõÛï¶ëñú/™ú×/ö—ïË­ïÆ·§^6¾ƒ}9mÊuíp:nB"í=D^Sz*ös–ª ÙÑJü(;1-Å'ÙŠk·G‰ªT·6ãi‘NÍl,©T¦ãGÙîÍ·=œé4Ð@N8 ³&Ó@uoê -ü'ȸì6ÈŸû®Ô!~Þg`}¨>N²=›r¸¢}Ò§ ¤L;4ñpc¬ŽÇnf£zFk +F6Éßq”Ũ.~³^‹ä˶ee +};W–-ÎAJ;ÝÒÝó¦œ.Êñ²˜’ó¸(·ç>¯Ç®ÌVÝ&÷Ž²½xͳ“káQ³=æû,«ÍqÒ´7=vÑäg™xnè+Z +×:ËVkA™vªËª¼i’F% ãóØ̓i¾2Wi]hÁ2šdÖ* ¾ÌfiAüȳA›uÄYG=.È3Þ¡L§~›Óú9îim¥ÕN[KÞZìÒdÿ©Ä%îŒ÷‹sØ=W…vÌô˜í1ãÈAÆb‹Úa·liø.W³Èø¬FâÕx¼X”WSój‚^ Ó[b5d§MY,ßS_[£l æ{SúÖÈ>ß?îÊf°Ó²(÷Ÿórz¢·eÚÿ¹¬ð–­¥dc"4áG˜ÛãÚŠ²–c›6&ä½pk"¤=do"Ü b%ã° +®°Uic0lëÔÆ&¼87¶á2ц8ì +gHt¤=Èe0Ë¿fÞT“Æó"WÈãç.‰ÜA@ðøÙòI29]yMO>ô"‘/òx4ž Ó!HqzÄgz %zK螺¼Í]|/÷e +¿ˆÓEbóiHǘKöØ粈œDðÅ?=åÝxx ƒÇ‡9¯ŽìîÇ.Ó=uWö£\Ùg9³ÛâÎŽrf»îÎ6gvÛ¸³¹ÕœÚÚ†û§[mi,áÝv.msh?öåvZ`Æy§)¡í–ØvÞÁµW¨ö•à¶—Û& n—bÛ*´­"›‰k]XÛÈi«„&ÙlÚT;Då¾K]Ç>s6w¹ƒU‚fPs¸À6ˆ•‰ÓivþEöéb]ÞYn·âϵtCš®e ÷ˆ@×âÏ•è3u·Š<[Qg+âl„šìâ—¹uF*&Nñ–Õ-îèáyÞ{›w>Á½WÐ<ƒiï&.⧜ÂÇKøtQŽW×O7dd£ÖÒ¸¼š8ð±¯@>Ï,ðpCD­]êæË=i}scµsÕëíxúsùÚÒâÏMz±|ÅM/ÝPÑGMÿÝë߯î,!Uÿ0ƒýßDF®ãKünĶ,*èYæÇna 1«ÈŠqÔ’xo§²î»…¼ì(öü 3YSÎÓâj¼øQ\Øßp³’ñÏb¼a1‚ÕÎt/ëtËÍz‹O<íd ;÷Ê°ä®ÂÓ¡xäÞzHÛNéŽ)šjºåPÖ–$“áþ ÄþðG=úã¤'çsó™%l¤åër¨acÿØûöV‹aE[ÌCÇ|x(/ƒÕ[Yà‡½¸Å´µbÃiºn×2gbÚ"í’xQ”`äÅ‘œ .âKìÝ}WeqÌ“XUÒXPxäYk=ˆþ­X¼£ì©U<¬Èš:' Zfn’Ü7KmyJë>œ{¼ÁÆpÜY:èlô‘â\‚{äÏ0~AnÑÕúÖŇjäçÓ-†þ>·Íï!X¬öü”WlßHNŒ4‡”ÁÉ‹ynQ¦}Œ Í¾„PgO˜9Þ!ù7ƃ P£@åñ;]Vÿ¾¥¯¡îÜOaõøv‡E–6ˆþqz ͹Ê]›j›g…¤\Årš9MdàKªøÖ%Lí 0\…ÄZ°èz”ÁjEü4„ÜÝ5ˆT‡ï2#–wñãÅÞ–<¶Ò JKGQI¡’ ›%Ý`Ž¤ÂÑçÚ—çk¯D*'fÔàÀÚvJ8ˆÿM³û¢Ö‹aA(ܼŸÔ°>ÍÕ•oºº2îaçêò"ÿ$ö¤ë÷ ×^Ž†*†<˜q”I¿-lˆºqîüz°R‘šo3êL{G &z›Äj.›;Bd Cü"\H§n•XaKf•0›Ä°HÔÅ"q/¹ü2Œl Ú M´Gôh0¿Á±ÕŽÎ8J¾Ùâ×üEôWÙY& ?ûŲGÓìñ4+šf‹c{¸FmºMTØ™¹‡b^Ã0»ÝkºÂ_ž/Êýòð4ôrz…¹Cb~ l!š~Úÿùvóér9]õiå/´Ãmè­ëÞ\ËÝLF¥”~ìRú*¡½u‡öã$É2t_öêþßÀ!‡ÛºÞBÊ,¶  ' +èn˜|Né¼u“ØÙ\΢ æcÎÝŸL¡‹t„ú™“I,)™DMÌ*f Ú‡LK•= à5èJ“êiøÙ‰¿~AÏ&A¾ÊÔÁ³ö9/ÐÙ{i€¦ŒCzZ³yQjMÅ–~iÁuÅqø +ÂRÖ(â¼)['MÛ–é|º(—Ÿ+ªÐ­· +Ütïž,þ™eï<½/ú%/ÅnšÆ/?Tù íð¶Žk?ý¢4nuÛë˜û5°«{ħÅAž7NòÒæ‹€±-”bÿoi;Í+£,þötñ[YêËò÷z³1Îl.þ:’Ø#¹)»ý?>ùÿ¿“­b½ஊ·[n5 +a0Ó¿.ôö÷!;ÝÕ­®¿ÓÅEÛñWpùÍÓ¥?òs›?«LOT¼7­Á àó;üÁGø¼ÃƒAÐyËTld¼{p"Æå1*ÏA.½—ÿ±‚Î*ïü(Sð±ÇáѺ;/!x•zÞŽoKüÝZL ݲš?–¼TãôLÓÇÞø±š?V‡F·€LÝbf5n³vïF¾2™ÁèI“Ñ´³m#9Ë‘ŠÞ{—`Ò}çï&,HƘê©pÏ^:šN~Éû™äHeýøM醷Iÿm Æ^î~¸*×¼{ ¼?O›?Nï)×øíÛeû´2 ß×(ðO+‘ö°¦NŽŠ9‰ <,ºGøN +ÎK`n”×h^ÈA†§bXn§ ô UêØ©5jfXJoÙIwVÒic&ÝJ7vÒa)k¸w6Ýw“yÒD:¦N=’\êa¥!‹3m¸ÓÖðKótÞš§§…Úuáãqg§¾ï˜Ûsã‹õ°Z›Ýºš:)ŸØ˲÷7Ù{¶Y}¶¼q§û]gº”¨o%,º 2Ú7Åã“¥=³Ôm™ö~t)—eºþêÓÊ_d‡+Ø£1¯ð˜ "ó¼Ad®˜Ì¸ò†š$ž˜¶‘CܱSó:¯€»-Øn8™å`žv)ÜââY^üÊ8Ýp(o]ÊWåé†Gyàáüµ_¹c ?`e`i¨Ó’n䟶”º){eÞ”N¦ñË=®ÊSìÕ­eÚþaèÞ_¶ÁÏ·ÊtñÅç–鉊ç!Ün”éßéÿBnfç^œÊ&[WKàšÐ[³÷\˜î00N—Kˆ RŒj³|¡ÑG"ÏÑeüÓTIy×ÆÉ\6×ÚÞcóãáôÝdɹóÁ…C\Žû/G«»R.Bª.¿þ4wO½éî©Ÿ#›>G6}ŽlúÙô9²ésdÓçȦϑMŸ#›>G6}ŽlúÙô9²ésdÓó?ÿA:üÙô9²ésdÓEdÓ>ËáÀ^nã™F®Ã¼tê‰óÎSO^yÞd§û¤Ïôé]ì>÷áñJ¡Zí5hªì‚¦î7@>šÊ³ÁøPyêø½‡»·ž‘„Ø«SŒjK(Ôr\„zó0<àÂã_[þ–çIbþ{¤`¢¡Ä=/âøçû?‡e<~ó]`Øþí¦¾¦ÇZ>wÀßIžÙÓU7ñXÃêgXO³ÃŒ˜¬{QH¨Vcß0ôQ°xóBG ŸIûô—•Eb5ç ÑabÇ}väçÔC³îG€Ö&æ6Fk NcÝã’ÓD‰B'ï0ÂYÚÁûnWs&Q<'ÔëVUܘQVËÈ/5Œª(mÔ ^óŽìzÐÛx½ç]À—,¦“E|ÉNj/´Ê2z×è yÖž¶O“µ¢pöG¢d»`Et,q±&L¥ ÷Øå§ Ì+“Ž”†7Áןɽ¶ÝLGùÁr‰Q»C».ÿ. Õ“8³§Ôž +N»O—¡iK`Ú€MObŒV„Ñ’¶‡ XÑ6íÍËÚnzYÛϵQ»—u1Xž{pɶt e1ØíS˽Þõ¼îúêÖqs…žì}¤|%-¹rWÔ6~GE²ØO”iüÒ)oë¿™éëØÍõg™ÁN=}üšDþ<þ탇øù¯Þ3Ù-G]ΑYó´ ÿÌySÖиU¨Ø³®“§å@žºçsõù‘ܬûÇ'tw 8ÅrÔÚ‚?9/.²¸24csôŠ‡þë;Ë¢Ê{ÖYŒ`W¸•i¸Nœê´íàËx–À@ÆdLiÖ‰!dHMÌ(ôbÈñí¤ãAìðãâ뱌÷xðªó‰Âr&ãi1(èäî¶êîëZÖO^Ê'ØØ%û®­» ìZ»|ç ’ò¾»ÖO žÒ•&QÕ~—|ø;âÙæÄM7°•låi— `‹ªÌ œ’‚çv‡s Wexv»²Y˜kÈÖ´ñxl¼ í9®ócºáû¸vw¬n ZF¥å¶ƒ%êîp‰Ór¸ÄÃr¸„ïÖñõh‰5ÖvXÉÚãt\”ˆ›ã$Ö£$†­|PÀ£Ì^>Ý>- Ÿñìã.NŒ±CytØŒb)³ƒÂ±íCpv’™g ŽLÏл|—X¶|Fgûí¹²rïŽÁ9ÂËè^ܦQþ1!)¬ÒW(Þ(b¸ØšR¢¨˜Î²û¹$Èm­€ÂÔ~Àá¾sôtå^/¾‘xwµõ#Žá“ø¿¿y¶°w» úîy3çÚÞso‘3«ÛÞ3äâ´'Z™…qœjÕ}öëázñ ×v£ú ˆ}?”xÚ¡PWìéŠ5ÝJ/£{èÒ¼tÁÀÓt]?u)y)iS@m¦E¬ »2`nXž/N§{¼Q$gMûƒ‰z¹Ξ.§Ë2]õ1ÅXŽM0Ï,»W`ç–û{©ÎŒ‘âq«|·Ç~À3EŒYÛQ´àaväåÐ'ŠX±_Îw¶ž“Îx6aâAlqK×zîG=S¨0´~1-wZÏ!“|ñÐÓŽ]Ì0sˆ7Ò¹sÝ”0 ÷Dl ¥¨nI’FÜrFÙzèÊ8jå´;yÑN GyŒ#Q¦~ˆík«îÔ¥;^øͶçÞ:­0YÜêuám›Ò‡Oܘ?ÙÓ5ŽÚ «Ùä |\’tP¬æÃØ‘jug<4WoÕ¢Q¶Ã,)ÚŽu¤Ï8=~œ ?NÁ;÷³ðFY•Áí1íqZœß³\«¨—ûuºŒßû¸býmÌÐu Ðe@ÎJ,WzÜJÓ•¸š©òÓ"áM‰P²Å´À­Ý®|H8¼–»qnZ¬t€úAqp)Ç[eZ~mÏ*üLï­ýwЄé“JÙ‚°½¤¥wÝ4têç'aר›ÛA~lëª<ï÷ÝçNQ8+3ìJ}Ïywæ7ÿÆÏ5[ÉÆEûÑp(]ð1ðóÞ†Ýô)ÙCo‘9«£ìT ìGµbÜA¿VàÌA˜¯Ò‚B¼0³ÎÙ*%7æˆor•ëwÏOi>”ìÍ‚°ó!DåáÛZÆ_äê3'‚wÐb*G±º6~ÌQè= [jE)ÓU2]Wú¡BìS“ VüUñŽ³¹žÀâñûÌÓ«•Ÿpç7QVë1æ‹6œï¯ +ûé é“l=!ݲõà[t¼øz–˜œK=pÖÙ:H–oŒhØéñÃÎßUóªÓâÃâ|>÷“Á=rãèÐíçâ8áåÛûߺ¨ö’²ÏU}}lñ +ñÞumÄë}‡À¾çX]WosÉw3ýæ¼ÿ‰7µ3¯NÏ‹Œô* :xgÅéìFt<ÖM† +—-¨´]œÃHwê–òŠ¤îý©›ÔµÔ$hóØ?â(>iß<î/î¼µË}Lì­ˆØvK§á´‰†]caoý¡ƒ¢ )wœFzÄ”)Ì·ÇD?}PôñZk›Þw ïs¢J×tpþ*¦tQj‰ØÊÔC·Èõ5–t ó·q¤K iñn< +1õ¸ÑØcFG¼¨ÅŠ*NT³sîN^;Èùqs´ïªÈÏ©‡xZ˜g‘ÓÔâ7Ûóâ2·9Ö/£2÷1™a ÌÂòÒ¶ÿï£1×HÌmf™×Ììò¸†Q—FÛ8„ÓÇF6>׸‹j$|{ºpŽXDãˆgÑŒ#–qëÇq—å@n%¹Ø?*¿Ðí,ìB›Þ—ƒý9±Û#¼/#÷q=ÆkZÒªlcßw6ó6ðòdf£iñ:]¦XÙ%X¹È®2üÞsékV•Ó´ø­ë&ˆ´{¤ž]wÜE×ícëö‘uK¶Û[Quû˜º}<ÝI· £ëtÓ.~n77"æöar»Ð¸‹`8|¦MàÛ>´mŸv¸¨ŸªÿÑ€{MðGÀ§É7ý¸øö£$ƒ“!‘ÉÀ`Ýë9;¹ÀxÌ ¹’Á*ld‚K®ã–‘lñæ㌎UVÙäðX¤–Î6í¸ bÝ7bY¶‡Žt˜ÿû1ñþ‚·­)`ó¼MÖºÍçÚȨV àÔcðN ç¿_üyý~(N³ã3÷eú8>³Ï‰µÅSY±cÙó½GÌ®Cz:žÿ~ŒëCÜ¥ì¸Ëw¾:_bÎmlÓq¾7‚·üp”ËCJÒ\1ÑM ‘º(ã-éF:p"^óÝtR.ŽM0{ÃF¿áØÂ@Ó”ëÇÀ§Q.“ryZ%Ö·d‘ŸÊx>‰ûßtI¤Ï9þ>çøûœãïsŽ¿Ï9þ>çøûœãïsŽ¿Ï9þ>çøûœãïsŽ¿Ï9þ>çø{þç?H‡Ÿsü}Îñ÷9ÇßçŸsü}Îñ÷9ÇßçŸsü}Îñ÷9Ç߬Kù®D—\tßÄç,Ÿ³üý(YþÒMthr»È¯î„zN¹Ñ\9­P¦MX­–¼tq)éÂm5VËù¿[•éçŽ|¹ïè—‡ä1Œ¹pc?R6ï¹mZ²HlóH<ô,þ*‹DYœºÇž>bM¡¤Ó’3b„§E4ÉfIJ$I8m“ƒ`‹ZCSwÇ^‚‡¶9rO1²YXZ~v)Ï)ÓââÜ–m€úzîæš‘ð¸$À9o|žä½SÏ’#†lŒÙòç\D³¬^Îuq¬Ëb¬‡æOS_c)Üå@QAÕXA¼n,‡"Ø®sŠL=©ˆù÷cdJ=Ⱥ,‹Èº‚ƒ$ž<âšÙ4uµ`Ü´pj=qàðäkYØ|>ÿóž]·–©ÿv%nÊzêr¹Z*µÿ?aΧžŠò¸8¹W77>tPöCOM¹Îq\ÈÀZbΟý,z«:O͹^iÎÇ®:ÝЛ·JóVmž–%ã®´æ²,•¶ÓšOËBYí't3O?–É¥Ö\ä3k²!Ÿ.08« …j³¡Ýó´Ñ›Ï]Çzìš³ïšóÈ24ç‘d±£lTg?i±¤EÏI6ça“ó2 kµ¬tÛÊs´ìgiÖ[…zÚÝp¥O¿G›~J•ž]úñB—ö=Ôy w6]ºý½W¥7«i! ]—ö=Ê#îfÛˆÂ:×ô<ЕÐç:ˆ$Ã[•®M·e¦úL;ÍôˆHKüÃ:ËçÝ,»1ËÃB’wÉ;ÏÃJÒF +Ï°¸P·Y<Ç,ÿXŠè_t‡Ö²ýÆ«™vjv%¢þ¶ž½jÚ#Ü¢ö}!sÒšŽ GóÈÁÿüƒø¥z6ÝÐÏ>¤{Ç÷áx¦+ÙýYz÷Óü´Ic²jg7³˜ì„ø'Õ³iÁÊ?­{ï4´­ö½æwÙf.=¢Wx÷ˆ~ ÷=ýys¿³»ÜÖÉ?¨_)ã}¾§÷hã+Ðåx¥¬=©®M}í–6¾ÓÙz`ø-¥m™ïéFlÄå|_jäÃÚrKyÛø¿÷úÛs|àW3þíýƒÚú¥ª>½WO–þ”Š>݈Xð¶ý¼ßžõeΧË-~cÆoÍ÷ »šÍötµ½óÇY_6J¼LïÕÔoÛÖžD;ìuúìâÜ$ˆ‹)Òß1Œ!àÞE© +¡ ÏUIH!¬åÞƒ”BÊÓÅ©_'ØŒWîظu½Îù þ'3¢I§gÒø#ëôË>I§¯·TúJ>]Äßþ¸òÎ-È×æÛé†ôT¿«»nùAìØ>‹ÑÓ­vezâ’çâÛ®^Äå#û'ÞÒ³Ëu‡×÷ÿ¨±¿¿Ãyè „àV>wøno ]ðóe¶9OM•H»Ta#‡æÀ ¯ ÍNÓ.Ó©ï˜Ö5ÓéqÑ„÷,¸õ“hNk€é*æhŸà¸`Fk‡ÜÊë1"¡Ç!õ£C¦õÜÝQ!†õß ²¢²?õcœX¦å”Žmüÿq—àÔƒ›>˜€¶ŒicóòW%Ü(ñ‰Òs¿\”ç§÷¿8ž`zæ)O•ú,­ÿ¥:¼Ü·Ywe"t³v+a˜‚›/{4÷ýi@sÛ’M€þ&Y£‡¡ñ¡Ãr,ÉpShß0/…ÅrxêV$×çälæärÏ•V5éç% Óé¦õ4¦£Î[ꧺ,ç¹ÉÚý—i9HÒÎnGIŽÐqB _Ñ8Žå´ÄnÝ:BqW.³Ö| L›°ùO)©ä~ÀòœãÇ”éãšîð'Ýá6óë6·Ëí̳ÈêÒSº\dŸ½Êôºdu)‹I3ôL´îöä¸Íîri¸Þ·óÖþð¡ÓÅi°e˜²Í¸i&¯q ìÕQ°ËY`û“À.O;NWGÁÞ:ìyg€É²6]¶+îF™o—AÙ¦'HÞ­£co—û}™.¿øÈruðØôGÖ>«üw8ö-wmÃŽMدNyWOX¥{4<8ìMîÌ£Ò«&ÆØj#žµ‹6žïôži<ž´½ÌbÌÍôTê؇ lkòv®œž€W#°™û‡‹§Åé*Dq P|¸ +P¼ QLÝѼF)ºiªøØÓʘ${^‚O Þ–àE `,ý$ἄ2Êá=>a)+`g ©ßžÀ»Ï4»ófLáþªÜ>ñéü@§qÜ5Ë´ý㢴O™.¾¸©ÇL™>½‹Ÿj‡«gcîÅ©|ô—vL”<‹É¥˜³¢Ò¸OkcÊOÙá+mˆ£äjy*%îKÈ4¨Ž90ò _È9ˆÓw“üøƆȡ¯åh§5£ý]N¨ÈîŽ0žCˆwýîºÛ-ö×ôš|>øù.øVn\Ùb¹¾”‹ ®—_šS#Üôj„ÝŸà5ОîÀáö»ÔcÿÒÑ»8ö 1UÊH:Ï<ôÔ/ã ³‡žc輤²Ä?yIß»©^Ì#'Ìœrãa³yY> £c‡×C«ž:²Ê°JÏL nñèÛƒ}zÆ®qœïšÛ#÷Ì]ÃD4Îé]R{ 󥦿•3À=³øërá±m:% Ì0 ¼=T‡Iý˜Äy¦© ¢…dž¸ ›æ6ºB=?™«›´4·Éý£ŽÂ¢Ü•–9,æÜ{ÐYra.4UFJWáãå:+õg.\ã÷?ñžï#RøâË¿}óú7o_½~÷êõ¾øbC»¶Óßþ‘5Áj~óâÝ»—o_oˆZÿfCÐÆ7ï*ÏÅø¢ìøWØ}¢0 žj²30Ä“‡4[ çRh9*YÁQ?ÿáßì—øï{ýêzƒø³þüðë×ÿÖsøõáÿë|øÚ®ü-þ»Ìå­ߢÕtøÕ­VWö«[w|^«›w|}|ûîþÕWï^½yýâ퟿WúëÓ›7ß~vüeë_>|ýêÝ›·_ž^|õ¯˜½/ÿê›—_þöåWï~~ø?pÁÿ‰—¯Q¿þïöûßi‰,ÍÆÆš³Hì€Ïi.`,UéÛg¦o¯ÞŽ’T‚úèP“ç9&/\æ*WùÝý’§Ë½þáFçÂt÷VÐS.íÐò]À¯š"VBFaå\“wK%+ÀõaÀ=RfEÄ‹UEr³®À˜"+Ðàð•zkwxÕDB`ä Îù»ÔèpPGZ:D×0éà|º#8ºž +½`+Þµ9øÚˆ#™Ñ"„»V& ˆ”Ý x°\Ø*§†FñnÆ\³8 †Í±©A‹U ŽÃ3´k1Ǫ.r¨jç²î1ˆd_ÅÙ{\4CÜóäY^„Ë‚·¹²[EW«oÜ|± @j‘Ajuï0³xÕ-@Sœ±Ö1š(g€gVÇÄÔL»¬Á›âûu3ÞG„;ÍéÎCÀÄdÏ“Š=5,L Ó~ÖT0#CB+ÿ#ï„rt éÌ,t@ïw` j\ÌMèý`Ï€âÉdƒgDzÄb$žSÁµ<{ÝŒ\å˜ÚŒ¹ˆ r`åös祆ҴðÐo‚ך°tÏiÀ_ã¥ñT–@Rñæ@6—Š[‹wÔ¡ûBm6Š#ð(wÐfl­ Ë zÈ{)s­`/9êôXV£vMèäŽ)ÇáIçb {=Älëó€ ÆÛðXÛà,-CÒ¬¸ÁŸô¬hå’*£l| hèZ߃Üój¨™^ y.'R£E¡Õ¡²¾©…çžA‹X¼ëï­È%ÐʵÕJû­@&šúñFB=Þb¶Äêd*eY @…dïm(ÐNuü5sï;bW`+ÈÏ-ùtä`XùNËK‡;mÄ ÁɱÈ‚³O\ª{€»¦椺n¡;ÕÌPQ&¨ +¥ÞêÛ +K|ïf¶ W(&ID™MDšƒ$eî,˜• Þ¬, ÌŒ‚MÊvŸŒJ{DQˆ'?)@±»–àxÏŽ+‡7šyc&¥`7óLX(Ѹj¥éÚ¯x%™ ïŸxp Ø-e ðe×<¥2Ñ6 (ò¥<÷'¹†”6ØŒêë‡:°"¯ºTfp1ÚÁüÔBgâѸĉC (Ž-¸òÕâhйB ›jÑû1&ÊJýNY+­æD +Vì—­ðºx§ Šœx'ZG²µðT8#6`VMÜd—ÉnĬdh€'÷v£æD²k$” Ö`ºðb8E©hë`OBFÅ;áî©‚ÅIŒ¯Ù"è° ôÁˆ+cUäëWHTÂ|bµàF‘»²J’¡„FI&`  ›z7'[ßÍÆ¢ó„e&O£PÖðº½ÇÜìK +»?ÉAÃ]!UJA¨¤ ‚•rÄs©·>*ŒG‘@HfE$ÄBš¶K!n9Ò:P©õ´?²¦°3bÈ NÝxhùlPg¾H¶Ð’㱉ÕFÀ™`ú.Pµl7r”Ôp#%ýFä¼Lg’3)F‰{Æ2Á>Ã40ýÞU°Ò´$\eŠ´œùí‘sßSyÄd0bN¥;x}\m¡’™êXÉ£ X ‘ÓÀ«¸Q™¯±"«‚Â3þα3o~ç8%hœù^P ºjgÂ+M%Ù¾‹µÅ›U2…ú)s³«§ÆFù +dD+¨pHwx#T|b2¹ï¯Û/ê<Øz$Au&Òö«fšŽýL)ÞñêæX¾¯Š¦ÉÇ’zÄÇ㛢T¢ÌN‚5õJ¸À¯+ð ë"»¨„à˜)ìp5FN®';dlâJ^}BB¦þ€ç— +S×ÁŠHcb>Ìå*ú/#ö}'ý^W@ŽÌiÝ]Tb.g2ÈHß1¥êÄEË4Š¨ ðÊ­pGŠoì +½D²ô‚µO›GŸÊkÚ~è3sñŽ© óV´‚5²/ð7½2uñ0žJƒÌ#´›FòJ +št*W²¸»Lå?âYeb¡&ÂŒ ,å$õ†J*­¨ŒCÈZŒlƒÚ£Â1}$•HÏi£/…1q=Й5j#¯xV° +V:ÎJȘv#–- |Ï­oXTÐüÍ¿‡¶Éï(}°18zÖ-ôH¬ Ý­bëž BYBŸt@¦€2qOƒòC¸¬X¨0+5²õR5’™ä1IÍÀ“n’ª‚@&é7XU™¯,Û“óÔÚ»Ë#ZŽÔ ±í™î…Y·¦X§ +H©*[¨Ør¢ÔúÀl 1ê®;S¿+ÂsÒã€Gçäs'H¨Àn!æAõ‚wºˆñÏ``Y,Ô‘Ó³ßTA’•†بȪ86HGí²'ëRÁ¥Øï(`f¹)T5à~E¾¢«"­U¬È²´w€ +:ù}à$4ÚIAÈ2ÍãclA•Ê—È€ä.t“¨®âÄÙ*˜»u|°Q™·6%(‡úŽvþM~H6nSE¦Jã7OÔöé?OݨÇJ)6<ÝžK’øX¬;ÑV`˜¬h„ ¨;¹EÐÇ æâÎ|¦& ±}Fr_ŠxF,ÆèôÄb¸UØ3ŒÛ8Èp°5ÐiFŒÏÝÞÂóIho Ôi+­6ôôˆÆFb 4aWSi/¿‡~ ³M̦·¯s+ŸŠØ0MA\@G}³¸"Uh Lƒèè>Õd ô!Ñ“°O3!JÄLhÔä2Ò2j·šgMwÂ>š¹QI5%_BafC4YBðZ¡Ë¡E3ºŠ>ÀªéflØ'v²‚ïdóE#ĤFòagh¡š³E ˆC¡L¯ÂdD¼Ç\Õ‚§œÈé›ášüï ê±-wJ2€sgEׇãt¹äGTDqL¼!0y—¯ ЇX˜Ð‡èá)Ýq Fž!B<­3—Tàˆ—Ã,öx‘&v¯¹ÉyÈ}—Å>L j¤TÃûdÆYd5h3½&xO¥ KlU˨ º:½D{­¸"lP ZžØOLÃýlÎC´ÀËŽ6úÉ2]oéÄVÔÊQ ICkëëNÅ©ÏeØBk™c£‚]éòöˆ º”/w™‰ •¤¨ñQ¨ÖòMso;i‰À­Ð´X{ÅLðØxâ4€G½²yf˜Éš/:hù¢‰‡9€RVÄã;YÇßfðšåXÚd.Dn6sºØŸàþ-"”>‡¹ê÷íun¦ZŠ)õTä0ØLÉ32p<Îì=®ž¹git¦ŒvAˆÊ”Œ®ZØ<%bŽØqñV?³\Yš©Äù„„!'!Óé%z­®ZPVÀ­1ZªÒG’Ùs¦”ÖŒRd,†XD9 KÑÝhñUwüËZ2}¥éF?|AD&àÍâ~I¯UþU½jˆ¥ô¯Ê– ~’••ÃÔ%»åF¦KFË÷P¤ÓB^Ì>–Òu#Ýèx/9 ñº•'á…ÐYÍnÅ “kà@y!’77©ऄ„ ©{^<*hUµˆSƒÊÖ +‚-[99¶ÐTEÄÃ’aÄØ_¯Z07Z$R>¶%rìÊ€ãNÆÉ¿µbÚ2¶¢§Uý$zËpAYr‡æap Pv'ê\ õµ LƒÕhl´;5s½UÚUÈû¢Ó4÷¢î´BdóËq4¶Òí]}¦ RMëªEvL‚NlhÌx¦«VÐ ¸G‰Ô¢Z#ªIÑѤ‹¤ÓQ~¥JKÑŠ&1Gä²ÅW]”ñ< Ž½£eôª¬ÚL[Lãz! /åŽV3 "=0×-æ[¼®ËÑÐC‰”–*R€|¨Ø*BÀ²á;H dÎÓ›E/3É”ƒJB|Ùb¡DÚbJ-”×ýÐðYÉ‚0¼µÆé˜Î„á[tÛЇʸJÜ%ÒÉd¯;ÚëvÃ-gjR+êtlTˆæ"±c<•ЮÅêÓN-¼Ö\“®ÚŒÔb¦Ã¥EâºUºœÒ'Eh?v`áÐŒ>“ÖCБÌŠ4)КŠÍ£eîz¼´å=±=žÆ.¾®Õg ’‹OʔôÔ‰Pl4\×lõŒH‘æYä5Á#S~a¬_é÷a,¿Z„²Þ'PHB+BË­•E:ÐgÃMÐ :pMÇu„¨Ð­M+ˆ§ÒƒˆMƘ†§RŽo‘[+Å+T” 7PÂ~æá V8‡)Ì”1ð¾SdÄ"CÈ!ƒÈ>)lm2<Ô{y˜ÑAçë™Õ ZA¯ÁGLÎLãµ'ÍÄíŠÌ• dÛÀµv¬x4ˆ(TÅ"caëNQIfÚø(  õ¹]›f ô¨o)¥`UdDMGžùeiG’6Q/ÊÌÛÜEyq÷ ®šIn¤/TC½)vˆ’Y UPå`ƒ2è œe÷,´Œ2Ê-Öygj%¤=*~¦_¢Øå2 ÀÉo-È/³¦zaq(ÀúÔë Ýe÷óðR'3… ‹Œ‚M£)Éj@ÌÉL[‹é΂„à wÌÂÆ ŽÐæÄhí<<½Q±8ô‘zÆR@Å‘êÅ8Ûœ„fk殑õ¡Ñ‹êMÏÆëMrΧÐáш݅ªÍÃÜû Êæ1±ˆ´ÆzŠ¢‘gcC&ˆ„>P$d‰­Ì ”¦øUú£üOÞá('+÷ ¤÷áyí0qš‰Fch:õðºÝõª‰ôg c¤ð[ ~çú£üŠÖ˜[4*Ä„nú 5á­d+r:¶Ê4ϱØ`a«l^ðÚqGŽ25 éŒ Rpjà¨b3šb&‹årœu#7|Óôæ KGk+µR´R(UàêìFÌ„!¾ÌŃD}¢¦»ôD¦(ï +õD´fœ–Ì<Ød´5ɽå$×%ÒîIt’°€² 1 ŠÁwT$•å4û0û‘˜C§ ê­öÀ± ªÁC¹G½¼êQ6´Â;åBÙàêÁî™i?A C”âNXëœGBL3}ñYQ/x&܉=iÖ½ìNÌüNžÆ¾ Iñ’\ñâ DÝÉ;qÚx§Jï(6hwF‹Ä•”´ò2IP½•ýÀµÂÐPNúV(§ ¬¹Û–¼€R…Nµ)ÑFG &˜fsOÝ“´‚‹¼91 Ž×†ñà¥X˜¿fÖIb^½» ~‚÷ú™ñH䘅ššÀÒ› ì ¼iè,´ 7¾|Ñl¥ð-êUz3z R(Уobúl@C’µ +©©Fੲš¸v=&–z0,ßL&É☵¥I $øF „N n­5­óÄ·ÎÄwq™Fabfó´AP§é´#œy3Å%¾uº[¹…"ã×¹9Âl1é´ßÎ4öaÛì +æ ïŒf[×Ì'ERÑü€atép/š7±È˜ÈL›ÁMÁ\µf³YÓæV$MÜ­¤*”vœÇ¡¡Ä¹£.:FÑe"µ1ËÚ¸.3‰±Rª¢à©^º‰^ ø‰oC¼‘ºág_0>LØÿüð׿{÷öÕë?~v:¿úêûoûæÝ ¶Ýål°=CÛ9É+Lγ©TìÚ14‰VN*HõNë½ãß1e{YØ>bŠK¦¢˜ísë¨ÄzÕabÕ–̬`x¼*œH3 #™¯€àÉ*í: túU +ärç©Â€c3i+J/pB ðo®&[sd›ñX´ÎTÕÛÖ‰–å Ó,B*FÊí 60 6ˆasPÂu›P5›K +½ÌÊ#5‡.Þ*ªŒ3ބɧù]2šE8zJYmAõž/öøBϬ:¬-SåÆ#2.'š6B« +PQ +VX8Õï¢^ȵÔX†¾Â +ßÓÇaÐÈÞ%4PÕÁ”gÆl’uB&Ÿ5Áô§K•nO«?]i J0˜åëêü.ašf +±‡Â7ù3ƒK×g¡IåÛÞJZb#>•¦,´R0Ç&0XIÙ›†Û m7‰çfŠµÑ84×9™ëZºÍp±ÖM*¤’Õ<±LpÀV SÅú!‹ýP)e OþLÅ™aaÄJr(¤Žx)â7º½˜’rÇu`®$ux¡¨¤³gC‹€bÑÉOK }ñô°ËGEŸ9— +y,“–×@^I˜…›„» +Ÿ<½qÒ,#DuÂü;gÚ¾ìg•Xx`Œ›§ úA’Ù£1ŽR2M‰m‰„C?­´g­hé"¸<+º/ ÅÆà¡E-Íøn«S ò ¶¨Äv±=7láç¼ÆÜQßQ+êâlÕV2gcB؆I‰Q¢(ªïA•ivº«g2Yâ›èP‰$áQ‹’`4‰Q‡BѦ͸&0kÜ°:÷Ø äÂf½9YÅ(¡Ðºøp|î?O`6ýÙ¬ÒÓx–ËL°u‹ü´iF†ð;-jå‘@EéSX”À²;TfS •#Œ<"¸nh\‘û¡;f˜Ä¦¨…Î2Ñæ,< +óP¼,”qø+Su’¿â´¸nB–A,2lËœDòáÒB“3®s…úîPŠÊI£C4ŒP¦ZMôLô]飭+. ~Oï=¥l”çd¼ ¦F;³ÞÙ ±ÿSë-˜¾„'wÄd¸¾HRAݳª¢*øqq6eØñ…Ô +ãR«J!c`IDAq¨ßµS¾4 +5t[° µÓYæ•þÆå³hP{ém’.IºF]2èb¦6«¸ÿûm¹myÛÒŸ‹ÃD#ÍÞÂÓW:8ª308dâ4Åî"ûóòô0Á”·È]ƒ6¢ÿ½.%Š‰fAbAw3ä]9¥i\ÐÝ©40¦=Ró±¼á „uaá9%Ë°×?ºUŒLM²åÈ[RHoIb|W¨¢¿‰)•å‘:Ž N –„ 2ÐLE7Ê°îšZHìã½Ì#x0È^‘¢¤qóFÑ[ÎÍH#4AûMžŠ,9‡(Ç"Ç%þÙ$ÈH£ŠÒ> Ô'!p”¡5 =Ã@K{@;o”ÛØ27Q”Ï%t_ c–Ä&WŸ™ÒÁ³^š²@æ­+¾´`ДvÖÒ9ZP”$Žð%ŒÅ`™>‰«Ú`I[ +Õ Fý‹/oQytÑÂK2¢©&3’gÀ;½Â*Gf3Fé6¢z„6ó]ó¢»›±>—à¹Ä¢ÅŘ6&(Ðéè\uŽÌ‡"ðüaÂвÌÍ!ă o—‹Ì1ûQbd}\uJùÂXÞ0ˬLÛݲƒg[2¸¨Ð`ÀJåSÐ ûe.KÂþXQ‰ á W05ÑèLðÅH%̉ú…e æ +êt{\ùš 2d,Lˆäã¡*H{¶ ÎœL¬®êy>,ÓüJ@à$ÁhôŸûnª–àDê‘”%Â;#™©Ë)T‘¬ +fâqŒò¤^¦|WÂñÍJIØ,0¶CUy¯HÂ*åPa…e—Š €æŽ¶ AVP_nTÊ׿ôú¼tG +…ŽS–›> +¸¬ðMùÎîd&bE³ÑÍ4oYŒqÙ +„çÒ$3Ó_DbU†º+ó¾AÞ£Œt ,12²Õ‹5“…úWHÝh¯Ì-X ùá-òD ‚ì/žØÊ|$Æ–— +fK²$ŸØ]s¬Tj žAçÌÌG^W)3årVTÎ+$!b-SªÆ+¯ÝA\(e¯JZ³X¡``º êb8{UX"žÁÓT±`%fgI1šE00îTú +ÅT™3èLψ­ÚØ-C C‘Þˆrm‹ ÚMÛ‡7÷ ÓH0oH¥•œM*ýLÁ@ëLoÅ…CL¥fû"œmYÌhF€RUøq¨²·8­(³nbX;5£j ë2Æg @=Ù !‹dbÎOvÆ`gÑìw´,°L¹µQá-Ÿ…|=Â9èUéúe`Â=Bºè.ÃîÆzXSkГKDÔmÚKñ&ïz¸œV Ö’PqÌgšé´ +kx“0Tq[#K rû¨äyŒ;’ã—™mêAYqª4g¶èJ°+YO'h®'{à?H}è.h%F‹ñã:Ëò›¹Yé|O„h+Î ‰Kø8=Ùð < +1pta’ëšH‚›PówÊ™-Ÿ…cªË̆պ‚ËJæôc%‘jK%¨Ix†„ÃlŠÂäzg…Ô0Ì e{E„„š'¹ðA•LÍð}¥ Pw²S€« Ê–7•æ¨îã‚Ž¦êW¤g9×íM¬×?W ¿#ê*2”C(|o'”bø²5ÜHwA‰  +¾KbÛyy-©n¯üÓ)÷¡ÒÜÍ©œifÄBþx×Q´ †9]leôxMfyb’ÚÉ"9ç”@ -Ø$s¸ ¬Ac(²ÁÊCJñ†™0¥I.ÍXLjÀk<©Â¢ñ¤ÌMÈ mNJ&R&@šxú×EÅ9„ž¼‰80J4S0BKŒcZBR®ÃÇÎ4°YøEÂ0õ +Vae(”bWf7=X#¢;.ô9›]¹)£h"à–Ôû°ˆGƒºÏ +/j²kbóÖÐS2™aXVEA7‹éÝ)B(,eÅÐ>äR¶ç÷U”c†é"@G˜´»1l_ ҃ςßr¢Éº˜G¨oÚL×&Ùš-Á!mMé⣄8†í¨‚>ug-a€‚p‚²g(¤÷ÎRµŠ¢")‚îÆÉjÇûÊæÀÁºcl$w4øƒC’GlÔ_ÄEýΔ|Ï Jï——ó>؇* {œé«ŒJE“4ñ¨à¡ ¤éLBÅ +K+T|7#@ö—^^#îèÈb%dJ¯JÚQYA\SðVS…26X…ªàdÖ;Æ$ozã +Co4M2ÞM![b zºiW_î™%$s¢‰ª“RhµºKÝF#vfRÔ&HÓŠ‡2—§ bÉb"˜“­Lˆ ™ˆ€qû¼RÙá L¤9!([ ¾d–_㈸ ©¢)@%“ÂͳŒš9õ„e–o´Då ¤¢Øª´ŸrÂM Í î«$2Åò +¯e”f@ÖÐÁ¸ó‹P?ŒÊÔ@O8s+Í¡c³:¨ +ĉ¦Æ[i)4îe)FJ¼R-ð}×c˜£Æ(cáx©f¦¡ÇŽ‘S´¥ H á,a#öð¬e¦¢kÔô’[F¹_2ó¸å˜.ăUHð¸%c*Ž°í™qÔÅ‚”fHÂÉ`Päsízõ#æ·È›ê‹BÂ,œHCA WÂ@B­8&jåÙÂ&‰(kKed¶‚¥Ê¬x­¦ÍJ”€(^öL»–ýJ-1v)Ì|6© .ɬSµ‡ˆÞlU]oz7ÙÄy4àùÛh´íñ»la=¶ R¬ q½ù4]ÿ„q±ÃOÙJ–;<‚ŽX.=µ`z@¶¤ilaÈl'km¬± )4R Bz0z@@éÉ™Â!fL¦ SBtŒZˆF¢…òݳ…,ÒUÉŒ½e££5$¯2”ñÜEUæi¦¨ÊDù–*–q=L«Ìa¹ÃM1Sy'!–Ä»TQ³<%†’’[Ó+›Xk# ¡i²CÿÔÊ ÑD‘k¥™J³K¡9“tš¶riT]jà}…þ–¥_I¨tf/›;ö‚ÁÑ6:!+«ÂHª]MMƒ Z6A¼Þ¼¯½3#Zâ¢_H¦©ä´Å2Ã*å¤ F„(ªK.X–3˜y¸n'dô#Ì0 ˜‹j¡]¹XšW⠙敦ÜCše2(AYTЉ ™ÐuÀ”!N´ MUFžªxQæÆ£ÑHþ…k@SA0äDÙ¤’²×4ê™!ÎŲ{ƒI1–ïyM±¢„”¹Ëƒlei…[« +üg‹(¨%¼ZA¦ÛAé6¢9–]í9Úéghy‰¢Uº¤JZ²t•”܈‘ùÖB_+J8SãêF²òÞáUŸBÄlœÎ˼MˆC ’LÕu/œ^2Û*ߟëø¬BYLð.o©3ȈG_L”©‘„ ã3˜r®(×"yKQ+È}äWoõ#l è2A&jaÞ*Çc.’Z(³#Z0ÿ¶µ VÄ#"‡­fËûé,y·P±L Yã‘{ ‡bŽÆ"l¦"‰¬al`ì—kº#²„'æ8Ðúíd‰ô S¥ú+擈|+Êïn®,YI4(Z3¤ÐÈ,}îÈ|IÏ )ÚÌàE‹k"¶œ9‘¹ö´O•D‰ùV”u8xÃÒdzU;±¢fË-C3-¼˜RåÜ3â”zTX´¤:Ž?3)niw²8­!èDÅ‘†@~³Q8Uþu¦Ž£›2…Óþ Í`v4 2Ed+#¡B2ßTQÀŸD„D£ÿ¬4¼Vˆ4+šéš’½û_þ¥GLU@˹®´ÜfÛ…ÏLÊQSG¦ù1Ÿ¥Ç5‘²¸B`mI!Wüv47C•€‚zÑ¢ã»d”. R a”“£M4¾TƒÄ‘Ÿk„€‘º˜àÔ ªXy:E•l͹B¦L²À4×ÅÌ]ÁÐ!xFAû)…a‹Ñ6MìŒòÅQ((ÔYIÑÈm©¥ƒÌ·…5²…4Â8W¨”Û‹¤œ¬Ðš¤¬\™0qf +h"Ì̤V–Þ ÑLèS°{J²¦€CýR!Ì]Ƨts4œ(êš 8Y‹>" ¨}Ö­?UäóXºMá–ɆöaZÂôYæ/B”…Kb’e,²Ú•¼!DNþØ3h(1©rE’‚B¼óÌ®Â3B²Ñ`AqXÌA¨¸vfg$k˜»A7Q†ôÊA™AŒ£æ¾.Â00‘V’ý€T +h IY–ĉg•rBc/«™'Vµmò–6÷¼4”ŒdðbÀ;u,–dš$î.7ëGZÝmR™eH!t°9Ì{$‘œr|›G."&Ñp~'íP;<ÎÜ!SÂPÓdž·ÎÌ—z•€‘—Zx61¬r̹ñEŽ}6Ò©b3@ã ",¡ËûI’µˆ®H§´þ”Éd†˜™Ôx ^-í3j9–é`¬C(Þ¨9Ï$o _Ú‘1'„‡cd¶vVd8•ÛaøŽ*ÈY_M¡'õLÉê +*ü G\”©gl“Ë=DÔ;Ëš*81zÕ”?c·Jßë–îå.¤=X‘Ìh¢Ó‹„*êGJ(™÷ÕÎd1BÂ'ïwê#( ê° +_s̱¿ÞI8F´ j£Ü)–þS@a PÑÆœÂvýÜóƒVkOKH#ZÊ-éå,ŽfR~²BS/UâƒU+„˜ð†‡lÛ‘GŒ*ã_U\l’ÝÈ^Q¿&™§ÜÈ3A÷!‘¼‹áC B`·Å×{; (ë\ŒÎtÊ +3Î_›q… d³:ZÎ2š+ßgY‚èÖI:Ÿ­7ñ‰Œ“1²ŽÂ/­>2½(²µãKÕŠ)wÕM±V¤blE ø¯& ýðÖË,1+)_Ϲ-]Í~žĞfX!!”|´}=åö©ãL‚õ¥M'ÚÑ©ÄÑ¼ì¸ bàùY‡TŠ1yæb,sH)·i1G-5“0b/rÒa2%öĨ\ñ3aÂÄÖ9À<Í´¤BJä™yŠX•¤¦TÓ&:T;óƒ +CCx*^¥‘ÁtCJu©ˆ¿ªÊ§ÛºÒÃœõ`ÅÛü! +©¤\]¨†B ”H|O‹¨€µHØ,=VEŽªëáZc@´§³“𲑂8Vï¢ðªÔÁÊѯ<‘M/vPæB¡cˆ1¥Êþ0DZÜDîW:ga^RŒäTa©PwÌ’XàFi¥­ÉxEiÎ17—ÜØ: àò{¦fè ¯ê\g)àÊ ˜¼ B9—"Ÿ—Äì-Slÿ^}ÁLÜAâYš‚Ù5Ì‚ªðñh)Jl4?ðÁlR?f‰iñGpÖ1D™h–â-3¾²s³‚B'* +ÏÕªSÓb|bdUÅQc¥,+‰è>»•R(&~©Ã¢¸»*¬]²ÙÉPÁ¤hìmd×KÌ D÷ö#·é¶¸œÒ-;X:&‘²/¥’«ïgó˜[o•Tk‹D †A:“Å%ãIsJ\uTÙL_ ÏÙ¶Šq–mý.KÝ!áAÜtÒ`ÿÊzU±]W•„)‰2ï‰Ì¿ÎÜ,E¾mÚƸ2H¹* -\Û=†« º%i&U”ÛÛ(CS2zâ+#ji1*\V +ýkçÁJBV +D¢ +ºaXA'9½DŠ7š•c„ß'b.iç‹“uΫ³BÐ;³—>ÂŽ ¹äæ÷ÊîÜìbþzöAî +¯äƒžº'’>Á[¸¼wV\TPŽÙÀ4ÏŒçTdP²á¥ÂŒ,ê·4¦Œ- ?ÑÔé;“OI“«‚gæ+36FOUÑÑæ]h :|X.='>¹ CÑŠñ(êG.Ifh¦OÀI'Í#(ó½ ù½bHZ¸}\Tž<²²'r»1Gûlˆ åo`: 9ú2ÖŒ)ùÑÊñߺM1ÆT-7…­©î»(£Ä?‚ƒÀ¨Ù·ÃnA•FB}hǤ/Öç0ÕýüR5d ±SºbÃËmÛ‡M€3.Îη£Ä}Éee}—5Ç©÷+ƒîÛï8¾Eèš )PXgW¥ÉxÞC´¤T’‚@oeGgþŽ:»¶†ôȽlÀAÝ€ÄU@Ÿ©Eºb3hó`˜(ËgE?kGø56$á +àB§ bÍ¿öÝ3j5@Í£!À¨q¶ýU*ãœ`<”íw¬'qT:!7^¡ŒÏ ŒEaS°;í”t k@‰dúV'óo="œ½£2‚óÞ‹0µI¬åùÎ §ŽÜ 4àdy±€Í-ŸMi,ªkútN¼:xÍHgß=_«tWãk;ŽÞëÝ#W¾z4àÍôÊ|Uå0z°û„ûŸ¨‚xÉmT‹8Ìf€w”r"ýJ¨<ªZvqʱÐ5º’3v›ÈX'NDžëÄ'“\bÖ ÷^¤>mê?‘˜O²+²¡“+0R¤P v™E +Ó—Æ %x…È-‚H£.I¤€àŽà’§@bt1¨C²ló1ù™;_…Û0–û·¢=Íè”y›—÷^}×Ç×xz¡IH½À:¸T ²t?ö¢íâ9àµC’JôÒ㧢 žxÏWó/Ž³ÑWƒ:ǵ#Ù@͆(')}ƒ™íÐßz¡\©Ã'•h×ñ“/gtèÆ]Å l(¡Fé ¤^ƒ]eÄÀ´3æ9S A"Æñmæ +‹ «îPô0±¿z´­Òv‹ ÅŸò²CÜUŠ¾Û¢‘!U®› µXp£æ¦›õèÕõòQT”˜®¶¡1F]¯×}i æfªQKÉÁÎ ®=`!_ìÂC¡CYwn–.šJ“Þz…h×ýiº8½õ¨ackµã>éÚ×^p¨ÿìÈ÷­ïæð"}¼z¤-ý8 š„ŽB·/ŸÇÄvÜÜÖãlB _¿M½Ô¬¢sÊá²ÆÝ_4Pyj”Ö ùˆò¼õÒPbÖ=)Í}F^,†âUÓ ºí,ã²Ý „ÁòÑX»ƒoÜUxƒ>ê"#ê¯q­ë†zæë` –™Œ”Pt蕱·&(Tëoî ÔG‡5o¼_è:êÝÇÒ©É)(ÃX‚= #R2붎¶ó.¹Ð‰°¿°F¬0”ˆ÷Ì3ÍW3ÅÝÂДÀ[QGØ׳µ®¹&¼kâð(d%R^Y/õÝ>üLý7ÔCIb7*€W±&"£ʯô0ÎÃ#Zå×õdæØÇÏ*œŽ§š-ìኯñää×ܸº° N;‰/ñqFƒZàkT…ÜsÚþç+Z:²þ2Y¯ãªVX1/JšˆÚkåHQ”''WñÛÑﹿ£1l…‹øÈEÅ丯ûÌ¿5Š¦'!I8®C o°4?Vc<<ýµç&}[ +hªÜŠ¡{0‹€°‡¸ÿŽöc>²›)Hû«W!†ž§.µ’Aâò)ÊË€ +„Þ€åï­CV·¾K‰cÌO_Ô´½Ô3"ïÞšïr»¹#Ù\åA– +e°‡Æ÷bQ» ­n˜`°4ŠT 쯔P†Ç ºJLdjõPÌ°í@YÖ†åê÷W´äšÔ{E'úʸ8@q¡Ôˆ«›þ’ï=úÛ´C–}¦·^…yº¸$˯¡¾…2…âÕ‹ßÄðdûv+…^÷hï=â¦!ßÔe©ãþò8) +\ˆO¹Ç$Á *IôÒA¾¼f@Döˆ~íÄ A%™^Ãî*<Ö2Uʼnàù ”ÂŽ,w2âNã½ÇyIÑêä%­hÞ¾ûbY1pI,Šž€Ÿ-_ö`{$$‚ü¡Û¶ ڳ׳Šò$P*td`}!XƒncWå”#.bâd …æ¿õˆ›— ArHÀûqŽÆÈŒvb©–"–Ê*¤ïÚ|SV9›ü‚ÑsQ×9¡ÔŒÝÐ?&þž¤!‘_QÁ†‚² ¦\5z„ƒÁ¢¬ºWŠj§ÏãêþrfÞqcyÎ^J§yý„«€yÁù+°57·øÞ& +8OM¼ÊCYÎAû DáƒèT;C{C¯uä¹´¹wl —Eùâk°Ö*Ôw‡²;ì O½ÂNeEý­—üacÆ‚&TVS ‘µDø«¡´ÝÒ¾wB?P™r!ë¨dgSU&~VÔsÍß0#L䂉҆P‚µÔG¥«Ä”N£+¬Ø/ã¡Âñœðµ"ÿ‚Ѓ&[µÛáAa§ÇŠ^¯çø!Ô‘x£†½ªé½†LÊ>QD¥s8ìo³µ*9á¤Äé[sÈ,=¥¿*qÀ¢ÀYœ>ùקCí’õ{EÌš£þеM'¯éœ ï‹—ˆ¥ǫ̃‚"ék/uÅzèŠ]×0Æ 4DÑr}Ѩ_ó°8®/î¥Ò pÉTݽ¦†<-jõ3t¿€%ǽb+ÂUˆévfîd*RdsóÎñdùµÚ­YzβYQ Å®ëJ!ËyÔÕ¤Ñj\Ör^zütJ[ºMõ¦•ôûq(þÉn½È9v¨hµÌ°½wørm|í¤&s3¾Ûù5Ã7Ôn€GŠ % d›µ0ÉÍ› +HîØÿ·]¢Ø…w%· [ EvE”$FØB ó6%.­¢tõVjbt²ì +pÑ·%ݱQº¾s?%ÜOÙI¢O-’qQ ȼ Þzüu'‡œ¶_ᜑ(ÑšÜCBõfCƒÞ ´t,u\YqÑDLràZC%æR´SN³ŸNWmï¨Z¾ 到O|KÏ~HK-;¢`(»>˜E¤ÿIC‡Á–Ú]<…˜pMˆ¤(¾øPëÆ™ó SØ&LÄ)ÕÑFÜÀ•IÝoÇ!ƒ5)M{8] »>˼̷Ìñ­6µrÌ´üTÞ(FrTëî(\-‡ë 9üy2³¼´Ðž†”‹KÂCîÁΘÐÚö§ä;z[¥Ô%ëÍT‹¸®lËd|íçCñªá+Ûnh©ãŠ$ã$j²‡Cþ‹éq¯sã½l2y•ÌM.unñdz5]YµÎ`…ø*jëWáe-,û(–€ø/àbÙjïñ2p9g ÷Z¤pnI{¢ ’¯ÄKµ§ûr‘Á«¢&0RïœÙ¸ûl[Ö‡Æ$¡ò +»ÂÕp‘ÇÐiÂB/`ÅPÀ•øF;A¢ÁŸI­ºçæÊÊ%ä’èȘ >Š(ÖˆyêüWT«bÖO}çÊý»ÊkG”+Êã=¡@íá,*N£¡h{|«I4=ÐÐ"NBÃô,G¤Ã&Üvð¦Es*¯¤/–C¸`Ìp7V÷ÄÓ“þ™ˆAzv¡‚çn a_7a½ +C£=ìS -ŸI +ðÖjTG”Ü/ ÷wr9oß’ÖÛ“º3½ëJáÃeRu:c€&û3*Óºóq$³gpùñÐ ¾e|…z¦þœYáMp+SÀ>å÷€äzrû/×ØN’ç–h/ÍÄdËfÒCgÝiÿ>Vƒ¨Rù¡.¦ùٙ紶Å&ô÷ßÇ£õy–S$ºÚ1ÔÞ§.¥ä>ÚAØMbÌõ¢KßÝ”Ì'ŠT·9O!$j\wÆP QŸz½—ë]òÀG›ô]J0$gø }•I¡în”› ¢×).‡ è +•Æs!ΉëÌàĸúII•Ó]Ûôñ +Þ:J¤Íºª¦W艽5ÄÈ| "Þ¾ÎÈÛ +®Ób;äÌ.š +¬úýÞÛÿœà¥ñD^Vk«D1‚ÿãªx*™’læÞMßN1P¥mO£‘¾ùf~+°"åÂrB50ÀòòïÙË‘)°mµ‡U¶™WÓþÂÑrS¬{û"­úÚãfÓ>?±=kÚX“^]›p/BB„–#…&a&+®"²º³,òö%Z‹ý…· ‚ÜbEV7—$«ø’/G ¼íÔçû +­²“#ÖßBgC¡úsÊû·Èx”[î LuÓúÑÜ‚þ¡á0"…@š]M|œÎŸk¨OÒåÀŠt|mjuöÒ@-Gø]Ïâ*ý,ye“P»‰¢óyÌ’‘)4À­ +·F£r QÄh¸~VˆjýüŽÅ픋Ñx´©ÑjkuQ…1 ­,naîZ'¶YOÃóÞ…+.®Ùùó[k†Véc"4QexˆîDNØ{r6†7âÓϲïê–Ã'~ô˨W§h¸\éúÔ—¬°¼/id£B¡¸Ÿ*_ysY:Mἦ‘ ÈÓ¾^œé5•q<'¯±6yó2L&à- ¨’f£©XÃëç3~Jªì€†ÅCŒ­i5‰X}C€Ý?˜ +¶\®¾þÚ 3¨NCDg!TENøƒèùV¾BÁ˜j£¼èëÉ@^ܨL&<„Ê’>–Q†à®?Ç„o§æX äáƳ±$õ"}íɹƒ¼²%£WÄAÛjá•.2òðú’VÔÕˆ5„V™DÔ;‡·À[ q¸k»N9¡»·¿•6õ¤¯µU¸"h‹ªGG€: uŠdql4·®F ÜMãúÍ#¬à›?,AÀ`I‰—=äšDËQ7o H~C½×Æ ãVÄLßÀmæï…êoYîðD\„†§'l”´°Ö£õqë›%té®B*+Ø3ÑÀŽˆlQðÁà·Æõ^†-˜SRaëö׈’ÅS˜”}†ðë‘Hk[×p™à ÜÈI§jRÃneʆ37B©U’w]­Z©µ?U[h”cVôa¯½P¯fïEu†`”•GÙ‚kF…ØK©)ƒ—'£­rÞ’&75ö5»«¸åþÀ©U@lmåÆxÜ J±ˆB­‡vQÕC°9\>+õC½ @G9Â̧‘ßKÄ"ë†bs÷ÍͽçÖë²îŒšÊk1g…;:vh2¿°Cÿ¶1,Èp€a¹B+ ßëdϤ²noI[Ûí €mWTð·à/¿'ØFNá¯ò +ÿ•K˜=öï©‚þÇ׌¿ù·ÿóüúÉòÇ¿ÿ?ÿü¿?þæ?üíûÃ_þò§þ§ÿöÿüø_þðÿôã·Ÿÿüÿ~üùýøŸþøùÏÿüóÿýsœôëoü÷?ýùOøËŸþøã:Å/.î~®à7èÿ•ÃÉX«³¨Ž‹Æ`òÈw¯ÉOîÑdÁB‰½%)‡°â*h‡¬éᇵú¬¸x +2iëÞä9)=; å[•8½¾ä\®%%ÄS+ "÷¨-°P4 +@Z³áD´î4Ò`Ò«B1À¤Þ6°9±!¯å 8ÈÖ.l4@¿ˆËl¡eÚcjX¬˜KœfW8M­¦¡ gû(P„V`q£Ñ섬äeê2ëðáñ5 š¹:amf‚Sý}ˆ k«òavÛc…é!ô–W`GDn.ŽAzt£å$½÷ñ·dÖÿÇ +KPåáœÄ—€ F!œ0U’ô˜Dóµ2WŒèÑšÇ@’"NÐ[(T€¤ü¬ ‚`ˆÊ‚Å!ÛÍÊ^MÙ­á‹/ûJmñ +-6 ¡®¯;¯^H}BƒçóA)¹æm^0ÑZá׬Z°+†é*dôï£è¤T œ+È1ÚÛ¶lOô5ƒŠš Ð%6ª£Ø­ÄÀÓòú cÀÁ.«tÍîؘÂñËS~&Ýv†NˆÒ ¡ßè„"ø!h~—(=CÞäó1ãèè«`¥§œ¯FãêýÝ2TžÃ;ß"D¢(U¿¶•ÌÜ>`Ì-mû‰SʵÆÍØåYR(7íDZæÓÈ[aË"·Ò… Ýú6ïÿuš?(n; jw'WUò5@E¤“ìµ:?”„§2'@áµÁ¬hH<êÛ·îXóמEçE QnÞð4dÂÝá¾&®.‹‘¢{¶îºf.ëãè(š 0ñŠ¯‡UæºãWèSÆ<Ñ+¨ÊÐÇp„6ˆ3Ó²{ÎS5{Ì[*HF•Jàf»G!Ü£GÅ»'GÜåyÔ@§G‡øÑ‘*i_(eÆ™º©%!îR#ºvgÛ02¸ +±Ñ7ZÀ¸% ¼÷¸Üp0~IÐí3½öº;(Û£HÆœw—^ÍŠ˜ëÆt&–{]Â&›ƒ›4ŒXóמÉа¬ãÍ[ÿv5Á™ZaŽFõ^7X2Iz¾öøj¿uý•­ »H°£è¢^à¡i»ˆÑ••7`CøME‡¡ôÒ7ß’ÈYí”À· ”>°íu»ÒBPsÃG¹˜ÿ«waƒÁËm&ŒFSù¼èúôxFmWÍà‰Ññ_3ŸgrMsÚë+H^Ð!×I̵¢ÞW3å²6B,Àét6<Ílãúéšÿa*t +—Cy¤=™€˜«{ØaU*=äÒk˜L¼5¬9•]™yoɹ®Á„XF=|m7›.E”cM(ò@à¨æ§!®.<”X— +FÜÏ·j‹é§± @ ,êäoŸ'w6q¬_65±xqsðÐ@qƒªèÊ¡,?ÚŽÏ’WCÏVY{r÷à|`è±Ç—`JôPjõXüh$'̯¡¿¹“ðEŸnãRáìB æoêÑ4 ™CCš¾bYÄreÉn E©e?ý,PæA:(ê< ¥ÆâO)Šï =4b”½4棿 } .»À˜WÔ/Øxka³¦ŒÙiˆ×²Ý«²8÷ûó[À<Ì&`ª‚yP=Ö·U*6­ê­Q"c_‡ÓÇx-~u…^9ädÊZV#œl V&ßöADÖÉNå +y(´ðúA§¦Vù<Òܪó‚Þ;Ü0&&gM•°õ³BðQXÃÿ4îµùô¬^I€r‡¬.oa‡wGÉ™F7¯ÝÑù~&íBÌDÒ’´,6|L)wñ¦PK\uÌÐIìòjô^n?i>FÕu§ ×•½ÄØ`7*¤„µÌ;ªÊ¬GzE_^ˆ´`4Ñ (Ô†¬F9‰•òè[Åtjˆ0Oý«C¹u@ýÅBÁE2áZyZ,&_®c'z„ø® +fX«¬2°¾{ß>Ïy›¸dö‹…E¨ â¡„:t!â@Ø(¬ý`ãù×à¿—ëS™Æp/Z$ŽÎÊ”©¯´ítçZË0 ZÙ¸©©&¸‹]yWmô ƒâ æ°×-…|pè"å`€@º ð,ùqÌ¥Ðudk]º›8¯êtc< b° £7¦8FptÁ¹R¦ªß\A½Ý¥¨^Ãr䬦ÍõknàõaË®õ¦~gû„d| +)5-xDž>5óôšŠŽP_³= ¸Õ€™)íóháû´= ƒKwKÕj1ëõ}ô@¹‡Ð©rXéóÙÇ¢ÞpèEls ]./­×g(x¿5{…/müAiRo¸d¾é‘ZD¡Ù¼z<¯aÄ}Bf^zx#?ʸú:×/Žƒô.R–Y à€Þ(Ú0WÌËV²ÖmÝб†:èÃvꥠ 0S +Œ]å¦ì”V²Ò×£âÉò×ø¬MÌZ°tê=¢æÃ3Ï* …ÇúÛq`Žû;Ö—ªok«ðÖp`tg4ü¢Q­|µÐmÑ5m­Ü~hNœ*Š2×€êÆ¥© :œ³2¦dS}5F¼ä‚OCܺÀ³}vnjÅêR, òìï øô +ú[ãÆ–TUv97ïæåÔ냀RÏZú)ÒÓ¿±‹a Ì$ýÝ·îHT&ï¡é[ÃÀ”ð¹e/¨¯‹©J¥±ßÍë¡X{¶dòý=ðuËÓp†llàÑ„[óó-lx<Ì,Jx¬äýS"Èr, _æfHN÷1wA³X£Q8¯`dnµâ§0‘Ó¿ô +Úpbãã¾mk on¬Z¸a.¸}~„ãÝØþy‰•ÎªTÄë”×à$m - Š» †vû†ªõɺ¾Æçˆx!0y™T>7ê­ÜðC—zmœèEl"!ìÄ“¡Ëqëà`Uˆ;4h¯8ÖgÊÿÑ„†Æ~È)ø6eXA"pS{?¡ÊÜÄú®›ZRlx=Úv¦>Ü]³@¢¹vî‘)¶VñÃZl*”«¿¼íw +ä­³À$ÈÆú +<Ì{C#ÌŸvÀù‹Æ¦3Ik¥5` vùĸh©MbEi¨Œ|¶<Ãbt£Cÿþ{`3 ÙðaÐF}Ç÷ˆ».®½8Á.9S….ûø¹À3!2H±Ãb’F¤…)…WîãÚé‡J“+X L§ë»´„ù(ŠŠä£Ûž/á-È LÌ3û^qo ¿˜v_‘~Ñú %ϵDÀµDjWG£šÃÜkøžxÔ½ªiž T· º8¼«ÓÖ­($ÀÈ Óe¬ÄfDzÛHŽà‹ÝÙtÅ&LqL$±- ¬«*8w¨ØêçuƒXcÊáý­OÓÚ€†gëz™.¢ê‘"|d*¸#yá´ME’غ–˜Bm»w©w,ðOªóÑÐNCÛ w(ŠÞ§ç*5D’ÈíRs-ÏÕoy³WCi¡ß,ñ§•±Û™²ãpëÅaȯû‡—;râvÀ¯á{šã¸Ž¾ÁÊZ¯ Pk<êûÒ›8qùk&¾¢š·iŒ+´a4»TËãë†äÙÕ › wö‚ô0J3êt{§˜S@>cŸˆ3Çn¬~»Š`Z f2àèó^«}í¡åªQ6„ù#Ž€+ ŽTÎqA·W¥J¢ûLh(ÄÀ™ðFjœ ¸7gB„<¤a⸷FïºÞcs$s +Žäø|ÒF ë~jïSB’ 0ÁPt€y#µ®úÙÀ/Uœ‚F9"Ö§Q^úz¹‹±¥7TØÖÅ!Ç7£PÅçuÝGº+DyÎg,/†ò)·ø'¬‘¢õVË”'÷Rmp¯ ×/B\óƒ HæÛ‚Ð "–&,$¹ËE®ù‡” 5!ßÌ—ñ†²÷7T‚¾8ε•RxœU7ͼîPIƒ +ðÖCòWÝîv[‘æ‹^9üL Ÿ]Ö‡¶8Aˆ£è-ÕL +ÖH·8ç#žê™åÛÎ5Ù Q Âz¡\3RÊ5IhA ¦H}‰3¡d·?¦‡za%"i;„[™ÕûçD®åEkŸ—Cž Kž=.7Ó—”z`(_ +o3;l(:„‡ÕÍ~ AjŸÃÆBqJçrCÆRñ¡ˆ{ŸšJáåj;K{i£ø4Äx‰Ožo±zRE¯k‚bpšß>ÇÚöc}^³—Ny[˜ Vwd\ÓÜׄRC™¡ÀdœOE>¡$Êí¢ +Ee÷µÇO»äoöSÅç/:Yþ’UO _0yZ:ûÞ–UÍa"ôÀÇß…¢,iº{Ã…©ôN‹ÙäÆKdÅzo¡­º…¶Î–ð­ÂÔé‚·š¢€-äç¯p… ª5.5%ÔWVÀž: +ZŽßµ~)ßE/U9eMƒ$Ž7UekV \°^`•ÙŽœôXHP B/}žÉÕ C+5*ˆSyØñ8°Ìè! Ÿ@æíÑÃíV„•¦®ØõÍÙ,w°QÖP†pªÏÉŠ¾«¦ùV ”ÜR»S³ ñ×¾èAL2Dh­é%2õk/l ”.éÚí8aªæ|…8,fÛõ„Ö°‹âkŸv£\a5Ò._g˜8¶p†!TfT !ö PúÞ#Ôâ{›B9e åJQGÁÞ‚›®Á U[óQÊ\*æà×ÏDÎrQUêõ80mÁý¦¯ˆ ‹wä +IÅ“Gš–‘®¨ûv·¸ÝÇíŒ^ NÃ&+oÔ¶ë7F‚TÉéA*Ë%"‡­t¶GqÌs&à Q—= %;l©ótèåŒ{²í³‡Hèçsî+}q ­!¤ÄX¤)$zè 랥I`d9ÆWçÞÄ™.Hv§†Ï"ú ðE àN‚Nt¬6P`vÇ]ÞëµCÞwåέo-±·N +|õ¦À—¸®9vhžPãÚzja#67­hZ2[‘ãÕJ}ë[€­$TñlR@äå(=ØDkÀïâµO +ÈwÉNa8X—³›% + ‚…w @·"'Aõ’ïe³'>­ÎxZ»©gÁ°èûv÷_ET·¼Oq‚ÐFËþjÚÌ]ÊdÞÉ·T\f¶þ;;f·•Ðél˜¸Ý÷{(–Ïà½w®|=DòH'3ÛçsjJ”à¾èqo8Û +ÅZ;eù×^À{ÕÏ]/óðLŒØpG&4´]E’ŠºüMÛevWÑ#?(‰*o‘ì®ÑÆp¨7‡éקY}Õ…óÖA•ž(÷FØTƒL ð³l€DF©<'RàT2¯sn|=A(õQ.…˜¾"l«G¨'•]âé€&ãéÜ5Ž¡º[_ +œãôHÛœµ•F¢–X¸CÀ_Z¡l¬ÀîšjÀø¢é¶ú`{^“<å"™§ã/' bµ“Wßvu"añ¯=â3½õºP…ûê8pu’ÖàCº3zôâjd9®ÃE™£‰‡êæe3® ª€1Ûï÷^·¯Ç=SK »2Îï²í²ÉRþ$`¦“DpEáµ2‹¾÷ –Â`›×^ЈSóÒƒ}ÚÑÇ»ÞU±X·dßP¿ÔÍb‡fœ\ߊû¦º•7饘šÒä¾îÊùÚãumŽ,ék/ÌÚU;âÃf˜k¬R,1S”YÑ¡?0IgŠpÄŒ vDI™¼$É\eý+SåC~ +Ôͼ&Wôè@ÒJf'9Ó-l)¼æa¨n› †F¹OÍØ ð¤PRI늞â<ܲõka ³áAÀeJhþ~é”}&/TÓ6?«0Hýê,ë5©x™£˜Ák²fÛ@/O˜k0Þ}ý8Rú32 ‰]à‹àßU×v5”Âï®tt"ß{°æöq×^gè|(4¨_ +¾$O‹¬× –ÃZL 0à¾U\¾môŠìts€6<賕VI•* Tf^´_Å»@Œ ÃwžÄ·ïnu+ûëV†œý±y×¼ñÖy—úé¤÷Á8–',ºT*9L=!£ái +FØIðrUiÂh(œ%Ž¡U)zçãAá¦]§@WÃÚ` žcÞ-DàÃ@!¢Mh) Ç"ªÅQÞ6ÓmmÝUþQA +™EœÐ®úY"N[ÖÊj8ð±hµõå¤0ÍÊš°–w5Þ²d CÊj$4ìñH$¶pŽ¥Wks÷ +"鶸LŒQè¥Ý ‰BíššÝú ëÊÊå‹·^[°¶ý¼©,Õ¼©hÚÊøÝ^Ó|±ªXOµ·Ê©U7 jâpOw¹32^®‹Õ¹–D I\™Ö>‚‚¼›MKéP@‚çzâz™¡N푉s°‰uH—êãÖuêN°/ò–ÕÄî‚%cXO„a$S}Ÿ'‡H;Eñ+odQUúÀÏ¡ C‡ÀäPST^Ù6S‚#†'¹Ô¥ÿÑÍ°ÔÄ,ãáßæ×Õª,ÊPØ@Y†¹ w‚߰›N8f¯´ƒ°²F׌¯›þIhú’ݱÇT›’ ‚ă‚#<ÔºÛÑ ãðÇzBÕ ’hÙÌ.Â?ðé¨3KšžÖ±ñf +&ƒ˜,RȽµR PFêáÀ©f·’ÒŸ,{¯µŽ1@ÔPíµ6³. ´‚° ;kÀYÖß‘²ƒ±†O£[RÖH9~ÁmM¸€?DÞš²Dc®¸“ö’kԔ˲Â=­ÎWÑÞà”3.ÚCLë¨èHtõÅ€'ò¤ÌÛ¨ð3o¯—¸Î+ž€Â(b{Ÿ›Þµ/DÎx:¸ÜÁõ—@BÝ#¸mÈ´Ö{Žu jº¢×$õŽ_»unl~Á!·Qe¦åPœ¤GG³¹PU+©œgR‡”ºÂSF€jöz´ÝV>Ö»ýg¢¾K&}P#°Ndò®¹{°æŒZ€)ÉVŽgUÌ1×[•` skb&_1ÉEr…2àmàGcì_„m0¸†kÄòÏœQ6ŸQ¦Çš\¨ +>%p +H‘$¿ÍÍ~'ºbü"ZÚÜ­my0ÇüÊ[ÌdDŠ»2 }w+¸<áCË£šê÷¾Ö攤|ÃÔµg+Ê™xlœ‰¬Öü[eoƒÚy²‹+¸Ì|áVÁ”>~óŽjÚ)$¸U:A1)ƒ ÔÅrF®×< ˜fô¥ÏE uH^“ânõ»òo)GJ¤œÙ™’§eyœ7x*kýèSë—C‘ûK"qT·ÖL'©YI i·—Ymöˆ"!Šš¹¸Žã¬•£oD¡Æô˜5\”ÂFœÆß¹Fz=+@á k +mr*RÌã\̈ÃþàÒÒfÓ¥¾rÓéÁ%l£9=þKûФ©åbœr7j¼7ëš:.EüP ç$gÃú Øl×½KZ§Åƒ ÂPp +NTÝ7TÖÐĦR9«æ M°Òˆ¬dUV ÐÍ÷”k¦1 FZÄ4I:Ø[YI•·½žÀ¿bâJä£4ïÈ;µDrfÇF®¥FO„Ff§àÙc‹ñ/†i'îû=Œª7O `Áõ ×1kØ:üã0ö‚X²‹s¨o`{"ùÒ‘½?qÜx9^¨¶läí“.¨k.éöåMô÷±ûs)rªE}?1¥ÀQ>h¯øÖÄ;aìb +¯!(«ÀÜòfHEçÀ +£;ƒ–KheÀ€Ål\‘¤À[“Ì…1€9`ÛM4ñÚ±UªQ-^Ó +òb>øºƒX‰b¹õ¢Ó;´b²à-®åiê®ÁñܬÁÆ›Üm?_•KYÿd•8Åÿ“Œì/²ŽàžçíÍ&{zŠîS™éöÜ7*eä}‰ < +©lOè +òðYŽÙ’(ª/T!çšÈä{ø\#Ú[³àôä¯ ¬o¿ã&.õæµÊÔé3q`Iªû‘;ùÇÝ !]25Å tÖ Ü^˜D.G¹œu?“ ÇASÓ€<’=¢ØIö0ÏYB­ž…{yp#e¯IÙeÔ^HÐ+3øíA€ÝÜ1„î¦Jøh‚!‚á¥Pymxó*,ÝÃE¿èù$î Ú¸`†B³xCÙ…Õ‡5|Ôõ5‚Ž G¥+ÌRfw%hA? d‹ëaÙõ äéfûCóa…3 +͵ØÖ¯nN¦*"V]NCœ¶v²UUzX0Þ­îHVÀÁ€×°z ¯‚^¤´ÀŒƒÂ•Fmõà_ö·Ê¤”=œ`é!WºEq¦o\ôs"v8tbÓM¯j•WŒ×›ŽR{¥v,iˆu·GiÑãÖ ¹­‡ãæ]ÖvèîñzBÏïÚyëyk¶å;T×3@ßnF$¿Br}\O™†WÙÄ^kàó![à„T7ˆÌ,«Ö7 ¨q›»,$JQ&*êÄ$Á~´7x)¹;+ +LˆÊ’§ÛF_¢=,0„˜Í:éö,ˆÇKl°Áš€ÑœTdHp•À„ +ÉQߢ®ÎΣ†WÓR† +NŸ$•ÙÐø:±U+s Ôãóƒ«u ðÏ€T[×;‹ä›¼¬Àz'O®ÆŠÀE‰ÓZ)TY­¯rkÌVÍôv¢˜Õ!1{ÍRõ"‚ïüï[KÇèÕ5 ¸üõëÂV˜™ÚÞ‹rˈj(KÐ^€•ƒ8ÏÏᓡŠ™cç¨j»Dæ!Å€È ¬}õ©í“ò¤8iÛ¿ŠÄêúU=VJœæ¨ó÷õ;yH K>¨¥˜j¸ªE«j\UµAqèÊOZSî.O5–#•`œC¥@•ö}"?D¬á ¤$ ²¢T6õ·EjZÔÇÕã»ãÊ|Y?8< ¨‡¨¨žÚc„Jé^#ô2ÁˆÂ¨™Ž¬€’ k<µŒî¬æ 5¥S§Dæ4H=dðµÕTZm“{ØÈ5WöV#†qFes*ž³3J®Nóê:í"øö[oXä(B†dËLT±­ ‡4uñ(CDµoÐoc/¶ë2Vñ§êzìðúÄŽ^ ô +@P霨¶5l\¹Þkc.=€x¡Î2™ñ S¦`W0aÄÍ¥Dd4ø¹ìf‘.ydBÖ*t_n¶7’lì-× + L7!¶^ô5G” \võ0ׯ† <'Âë÷×3Ž]p­}ˆd/ÊÑÛ ¶²"’í&À”vrg¨RîÏ\÷áYäPáb‡cà.Ž”ã[%Ä‘à±_öP·ôfs‰/áݲzä¹ãKnL¼‹£Æ%$'Ñ¢Hõ’|]#Ù´6â—®ÏùŠßó›Íï¹` l ºî–誒6lZ¿l½l<Á;$B%1ÙÊj{óˆg‘ú… ɽ' ×ðD¶~ŠoÛˆ= °ô‘¹Bx”ªGQ€'Ý‚ûGÃ+ƒ"¦‚íSΑF¤âilJ޶ϋ0ÀÅCBÎÓÌ”(MÓ@Ìn¶»•«KX¹º$&W·¥T˜+ÁÊ¡ì Ä]!d׆—²ìˆ™£á$´–ÀFë¼!J(üš/b  Y¸r¨ ´ác—„¥u9QeŽúP\‹©úFÅïÈím$`.?ÇÆÐÏ«ËlSl8¤4ZNn·G4’¢AÌEË!~Þ6€Þ†70%bĨۨ–"8êlÐÙ¬ :y²»¥¨#•ø¸1ùhå‡ÀÂ’-@u\"»¨À ¡!#<Õ*Þ±†`V£ß>95€%ƒl½å=! /úHûì5vüå¯ ZCˆ1g>ØjDéIÀ±i(Ï"¸!éÒcÝYÌÐ-@ö‚‰mŽq$*H˜v1\HêyS¬çˆ^F0®R¸'o˜Ü›@\AäH±ö’‰HrdÝö¯2ã~k ™×n))LÕO¶’¶·ðÞW|õÁbC u+j]$Ÿ®À_Hi«­º +Œ•ugÏfm+8£Y¯3SxÔÐ÷`í1Y¢ö#˜è#k´K©’xnG{xá”ûœÊá+_’2[!ÖJ1—FŒ}?î ‚LHÈ2a»LjënG¤ˆp@ÔTÄêiä'݆Îsˆ”X9J4 "î”Í/äãU¶]›ÓçsžG³/$r¯)Æ7ZÙy†¢ú£òxE:¸’ä‹lÁíÂ+~ç.Cõ^ÇñM*ºÜ®vJèÏÛÑŒøTnØTNS“œ˜®Ì¢Ì\ªYnêg¸ÃE8F,<•isÍ÷/,0Î d:®³T^"\t³o²iRä„ybãï° ^Á}k}*„P†I‚J>’ó¤*ƆT£¨à›._ùÇÍ‚°Ä¾ê\‚´l6Çdª:Š6Ò2Rûá3z=$Si8ëÈP‡YførP\´Õ!bM—¯€wï¹öYÎ4ï˜#}(úÙÞõÞ%Ùj·ÙÌa9Ô ×¼Íȶf$I@Ÿ4ºò®º—ŒS(¢(?Qâçp“úv*ô3¶M4­“³({›Ea.°H„EáÒ$+Š rsÏáÒ¥ÏfFwˆÆxûÝØ쯆«(G!ÓÏ/â$¹gHO—“GCD-×­–†ˆ™áI׬RdôÃú9±Åh0õ‘$l‘=# +äeYo–œš¬†)_Í•åØ©aÉn09•IIÏýJ»XÓtÍŦñÒû¦–)Õ‘ZFuo!üd^ź $Ïa#Œ€Û%Teº>õ|[ k%@À>tûiˆ¼Á…Ú»Ò%› ­V#Ÿ6’9¥Au¾5ÁAà÷<ªñØÀêáa¥’x½iNˆWzVWÞºD%°©ªÿ<ù@-š-»(ÕyG„©ísT-çÖT¬‹šŠh¶‚á|½^Uö©äöˆ†) +… 7 ôõ +Á¯;7BÑ© ¤Da^Œ„E鑤ÅÌ Zd.”(é Râ#5Ù·ôXHˆ'[›<üÖ©Ñ Yª!ìŠû{²º8¯¡«‹óF]m´9ü€·´êÆ„;Üöí $QrøXŸï­Kž?9*ìk$f(Î]-NYDRGfÆá +"ˆIœº˜ìÍ(žKº7ëÖ|g*A´ÍÍ :‘Õó9Ð>¬HŒ¸õ~—L[®³;e¡•³¶Dd ݱ(è8©„åȉ½v6)A2•YZñ$HàSêÓ=;€‡ªˆ‹ÓýÍ,Äü›O[<7ä+Ìò<;v äÃ-B*0+DÁ+þ²—®ôªû0cw˜§ƒ?1vAß$®Ýƒ}°HíóD,μÒXšÐëÒn® EuÊÜ‹t¡5«ÎªÁî}ÐÖ-^CzŒ¸V>NDaˆýg§&˜?ŸÕ R—~á)¬’fŸÚêP•Ê½¶Í=é$tÌ#¤Ùä4ö`¡¼Ì“ÒÌÕh:¨À:ëÜB +ÿtûø0žgcתÕa B©t¸8I÷†eØKÚ@y0Û+PÎ{½ÛãÔ ¹äf¢)h³ØPï%Mp™0LÆJ縆«1áa˜5Ù]±ÂÛ—'d²¨ñZãÛ:ã脱-p‡”PÏñM7®Wø™&Ð|Nýd +sSꮩRIZQ³swP%›•Ë] ŠqB_tl}&,jàúàŒ—£ª+9b³ÐÖ^ 9(>k–fØ+š«Ó›·\£a Ú!‚Ôá}…©ú%D e©dÜ…ŽÓ"¨Á1¶K-ÜK¢1±©K½+î;cC»ºå_›C¸ª2?¹#Kd9á  ,–­+¨Ðp{Ls .B2ä–š‰ÑoýJ eÉêÜ©`ð}_Òøé±-=c^ï$ûCO@9_[lzâ©øó*Î8ØYIYù-÷#H%[÷¥‡kXº>Æ$4>:J­åâÑ&IAMmŒ&`ÂÙ ¦]y×ÛðÀeœmÞà«©r ¿Â¹Kÿ”•W]ŒÖJ}ÒÑôR€ÌÁðçk§¢Ë€mš8k2jhY°,µFU–ñÔCš‘”[Ï»¹z<ôšºiƒ«eF;ÑÇþăCÆB$ë9I`.E°¥¤ è€Zƶ2Ž_t#{scûZÑä¥2{dµIñCc}—B“e$â}NfŠˆZ^ÇÓ]gQv\ûÛõümŠIhØN¹A›¯PC¡p„ +ÒZÐǤÒCŽ¢jãLÒ†b–j)F9î±äB‘B­‡Qu‚Wˆâä\Oöeœ)8W]ù µ²Ž7eÔÖ[Ý4B¼Ñ‡¨Á ¿1%ÐLÕèØ\Ç qlâd 5ái•M˜°ë’CM!‚E_ðͽ${>ÅîÊûö\Šs1È„|GøV¦ÔʽC,ÚÇÜ;ªI5¢Å—‚­Š&$(༦ð&Ž3m¹R7·^‹+^¥ÏâΠS vºÎ f`Åšï!®8Ì) Ü]30U8,ÏHŒ+iÉV‚Ô3@Ô!eöVSEzˆ“&ŠbÅ‘ ¿õLLíSÈPgíÆtrv+NÖÓMöáà %ܵà¹ï š/Ø¢7‡;A’z¼dñÖå£Ú H¤¡AœÎˆîȯ(“·Z¹Í±?,Áù–dÞy´ªAp ÁD¸~ů¢*¡º"¢oÜÝŒÓ#¤|oIëtϲ˜Ã/Ë3)§1C3®(鶡}«¡¢wJ3‹ NÎÀšæs´€+WD£AõêTÜH +ÄF}¬²:G‡ O³QèÑa_¶µùÌ`dl›l€[sGà¨!I“´MBŒh‘½ÐîÌè6Á¼^Økoï>Ñ@©;×!…!üWÍG*‰âOöR¿÷¼jÀ‰I¦SC†¡NB€:WÚܪ› ¾ò1b©›SùÆ,%`ªM²ÕQã’b DzÐ] t +ß‚ïƒbêÚL[^†˜ÅQb"Œ?…U›‡L”,GÇí¥5%ƒ1Æ"Vcou÷À¬ÈA$‚¿ÓÑ¢\*Þp$èk‚a‡àFG‰†3Qà •ì>?d45qó úz¥@0ð:Š”)ªø -ËéÕ,Waäu‡Èfè`­ß×¢CEï‚÷µïUUvÝ°*=P,žxk¤ï°³*VhXaO +ÚŠ^؃•d¬¼lAç€ö+âSd„ÑÉRE)ÕPZf¼ÒL_QQ\Á¤Jo`^Ší4’Öì„)÷Ý#¡¡SW ,dòg@­€¸¶Ô«·1…ó¤ì¢ãµ…ùÈyZm]oMs^é›ß†®i·ÌúâxóœIˆVb²½Ã9gÅtT²>ªejpÌ€ƒG° Xú+ˆ5¶ dààÌÁ¶  ‡¡Ýk~ÛC)ÀÉ+ÚDµL¤¼À¶–Ñ ÷†ÏIioö°‚·z˜e”07M•¢Ò€Ÿ>±±ÒV|YÞVQŽ9Øj”n¥0“ÇžF¢xÍ:`ÜA–(iþf2‘~XwøjÖšB¿€œÝHÌ@pÕm>RWÌ„~ Á|mbÔƒ¸Bª-^,Tá™EÔæ¸Ä–íÁ4¶D(q=[ú±Ü¢óþ][sÕØ øž%œÊTÂG÷4À{5 ì”z~orP‰Õm‘FDk™ éôû34¨“´Ù3¬'W÷™ö¨i=ä£!MÿÝ™„´ö0ÕK¯­ëI°´41®³f9¸–Eé@|Ôs¤@€EåG$®‡ÅGǽdŠtòN’jå¶VÝlZ q†$¾x'A;r}œÜ¸3[àËö‚ñÂ<‹sÍ +\œ4%ìP›(H`M@o» ìÛØg ¾|–mRŽ›ø}Ž hâÇn=ËÆØ„æ„ã= +8] 1¾¬–¶u‚ƒì‘Ø®ûþ jÁûsWùî£ 2¡þÂ3ÅÒž·Ž*úOÀÂ[Šz,û‘ãË ó—õ“BÏ”‘Ž« +ù£)–¸T D9ô7uŸuu¢cRËÛ¬cýŹ-X«/~Õw•–èlâUK8Õpö/@ F^Rì©Œ\¤ž ´Qq‘^kØdF„´©(!s±ÙÁÎ2P0[Ï +&'¶¸ka_;Ç]aÁªÆDä„°¿Mâ‹5Sýû½‰“ÿRÐu¥R6*8‡6¥3#-ðŠÝ¬€žèΓ_@"Øè0½fì[ N†ŠJ¼KYÜÉ¥p„ËL54?ˆÔjŒO¤RéÄn»ºÕöŠ)_›M¦¥h2·Ìîn¶áä•¿mÀ¥iu ÈJ`Eèf‘ FÆLšGþ×@(¿'Òåßýªã¿ò@¿apÿdÿùÊkPvG¹UrDÅ €Œ¯õ:‘ê à½÷f¯Ûìêk/ùNdœG;\3h®|~¹/-;Ê'ç–¯g­ +fy9^3e24ÅækfÑ %ck8ˆ ±‹‚‘w¤T)EA!n.Ã؃‚™ª(ê…XÞÃ*òs#ù§rç¹È]£›Ë¬BªÕL'P3­‘'‰ªyŽÃ‰¥] x‰ÙpŸhÛv#.òŠÓð 6Ñœ\“š¯Ìß\a 1 +&2£ø£ž=îس0á{–åYæ[E+¨®S39ò÷ðv[$0„î鲌€˜‡»®°ÎJYè´vÈÿ@¦Š¡Œ’ÊeÞO羬²"ÎùýìªÿìmÞÔ6qɺãc|ïü\Iêû2”¢¡#äòÑ ¾ÃFbTx ×>HB>'+­Â¯’úœ¦i÷ü9#Ýá1¿~t1þø¬èú$VÊ©Qî^\òÚ.gBö4‰BÔipÊê‘7Ô¤û|ÉùÄ*€Š§ Láíó5ò`|k˱ˆ´<µº .v‹€–߯Ò(±4 ]VÖø<®+éÈHQƼÖù²¥e*yئ¨3ÒL®™fèï0D7²Õ®lB8‰ÊœNp.”ÈlÀ ]?ɦÀ´° +ÔiXó‡ èŒF²'p¤‘Óyim{n•½øùŠ¿UÊïÌòÍìJˆ'®-}óhG ¯‘KlȰƺ­¾ áh)²7Ì(2ºÑAZû<}çrÿÚHJš]C- Ö§¥'ÜŽ…ñmåE3”k\Ñ°uàš\†ç£†»I£ux¼…R5ò8o ¿¯Ü Ÿ©ZEE©Cä_Ó祾•˜Ÿ²-­„oÃ*¿X84ŠìÛîʾT™ÛÉTðW¿Tew*äHÏþihÖ]…DÛ¦™l„4µ§{›·vžYÂr‘¶Q¨ƒ§ð?jfžÄ ¤À¥À;Ñ@h>us;crZ±»À;2 }A.2ºä"SAŠ• ,¥Cï‚ ló4Ķ=è{ç3#i·ñ“…a%3G§Âñ%‘´J‹u‹ôëV:âêô2{sQŠ^8ƒÓ‹]­Ç±â¸zˆHfᜠ+ÞÞÚß^€ÿÅ°ã_éÚ$;ë­f Ie]‹, ³NOoM¥HÇ’$X -?«ÊáÕ©cÒQ-’t„xî¹¾ E5*(¸¶Ð¤L‘×™h1öj(Hü"ÈmüÅá,0®‚1›ïÐo>‡«¡6¸6mäjoSâH £€VTÕBS͸uÿ±Â²îp| +)ƒ£˜‚ä³êÜí7Óp?D˜ñsrSE=Àsn—2´[pÌ¿Ç‘Ç$ß +†“+A“£:·°sŨ†$ +« +û^Sö=ävÕ š}p1¾@ Òñcë[\4‹y6 z5tVè +¥Áœ{MÙýÒn•.”rIP¬ÏS‰£aïP¶æùûÒ¿CÙÎí`³fÃ&âu"h²on@ÌÜLÆÕ%¨þ×Ü·ßql‹¸5‘ÑàœE]a%KÛyï›jM(cÚ«ñF6iwTеd§y—¹¡uC hV¦h(˜óRtG ]>kõx£ÑKƳ`ƒ+ *‡ÕüÚw,§Õ€qGqãÊV‹úKÙ_Õt`<’íM½†ÉZƒG¦ãÆΓe‡Â‹2˜) ‘WJV‹•£ÆªQ®ËÚ +‚ë»Þ²«9 âx; P)²Èõà9N¡Ýnz$®Ð˜g˜%÷)‰ýÓÖÀ­W"S¯yðt­I¿©Ê¿=KÓÑeÅo—LxW“& ‚÷NY“)WGÞÛ3aïûœ)rJ±ö`ùºTY¸9D\¼–{ͨ9°áÕ^Mô€ÔAöª+´ëÁ|—÷?í¬”ï´‚”â|;ΆU­¡IÛk±7<“×ÏcoÇ5WŠÂ×oý(üTEP£˜šû¼6€ÛiÔÖ ùê¼õÒ¥ 0Ž0qøÝ>ÊpbÕ3À‰çßìGóç¾êuä×b ‡ LƒèÃN.¢¼*õŒ²mˆ]¾«"¦-òÙâC¿[3gÂÜ EÚÌ.hCùB†P[ â,¸ëÞ²‰T(pˆJwä_ +9þ;<â]s¡FøvÀ‘ˆd9ÚSÏ4%Íw 1“ƒ]:®Áž^ æšuò.yßÎ)ün×®ùnŸ¢{&÷±‘?13˜G„Eí+ú¾¢ 0zÜ,¤©lÖÚÕˆãgIÇg±XÃ’¦È”sòknÈ\˜§¦o8´ÍhP´»öü0›7QVlÍ,å 5u›¡#Ü¢/“I"v:¢צSRäHQs‡Ï…>Ço‡D¿çæô½" 2%cûJ07€<H‚Æ‡Ë sž · —…àx·Ò¤¸m³âÖ×lß6ƒÛb×@#åV»T½4XˆíÐ#ý<¶¥ ½$à·íÉl/V;zéˆèþZʺÿ"¹NÔË™h.[òòƒ‡â1æ§yi݆ç¬~9Â[‹\6ˆÍKàNÔ¨ÀPa•^${&q¦Ý†Ví¨Œ" |Xh“ÄÖñÂD(»ˆ­Ñó y›k«B!×a{„‚ÄzåëᎨÀO­à„Ñ° TmZkr‘la5ìä~o/àa„ M؈ èOª±6(3+2¹Æ»ª¦I5ݲ+µÀ}zð-Aƒ cÝKa92§‡z@Ì®¨Œ©C1r@¿ž3A¢WÙ×㬅%LF{¬…žL­±xb²šÛô7ü¥!*‡€tÏ“.fªsÛYÓµ uq·kÐÊ Dv¸—gX”׫œ“<È·åÄ#ðãy(3à“öÒda»ÞK@bÔ4S㞃–º>5+°aô o}G=¥m.=:é×ó òHîW5è †–Äk¬¨ Î|Ù:óóx÷äpçÀI/bˆ#±T‚‡`¦»‚¼*V¥øaB“YqG{>÷_lž/•IíFM‹©—ÄOS0ÜíØ=ÆîqÏŽ#ìñÚ¨W²ÈcásÁ'S(é0bˆÏ¡ïàé;¿^îîÞ%Ê»Ç!K†ï*[›Î´W»¢—%L¾áó2­gªcœ‡:Æ2^;4ø†õø˜½÷I[K_¹;^ßÓUÒ1“Šh.5qOɪ #š7yj ¬y–ÜÝ{¸w- x¬ ed^s» ·•Öw4ÕRDSYaó¨Å¯¹8(&e¯;KúYb1Ê6zÜæI6|Häên(èàŸU£‡y—Õc=ƶ¥°û–ÂNŸÇÕ«eõÂÍô® ½ÎN“‚mVÙ6Ê*rƒk¼(—•"âæmĉÂMã_°ÏÓ‚Ýð¬+©­¥¡x&b[L +d‚">.â&×RÖãMhØ~è B²{ôñÄ ¢F@ZÀzë%+8âFîÓPåRUµ%œ©×¯z´À¶uÒä'Øyë¤3`F¤ðDÀõ b>-˜Â@o.äÿšò;ªí¬I9×Gu«Ç´N£¶(HE¢èZúQ€™Ýíá6\ø{°ÔÐ㨠ÉJgÖ/÷õœ ´7WxWç½9¼ å“}¦M×//q&³¶¨3Á¸gRö3¹vµTª‡¿yÅFÛ {(ž~cÎëd^5÷Ìù“qQ}‘VÓÊÌzÐöÞ{lˆÒs +öÿ´÷O¿ì¥RX¥0¤ŽŠ53ÔãåùJ¤}õûkizG/÷±¡gÔw§i±Éds¬dVÖUºŸF€Fú!)·4s§TÑ››W¶æ0eu®=¬ñ&¼œ¥³Âw#ê6úÞo57Ńxõ¯Iï~:µ-ÅÜçÐðùý0÷u8t »{lSM¡K¸ñÖãËò­×ZLGy!—r÷‡&È{MÚ2ÂGVͺRAó&ûM¡ìù;ÓϦŸ]žÔvšœØ7²ZáÎ…JÁÕ\Š&$V.ÀˆE2Fê’(Ôz’‰„Ä8æ}¨‘H½Ìm/Ê$º}EÈ ot·Ý9"§î·¯ëÔ„7sWó@‘?æbDþ$Ÿ€ìÒ†Õ¾—òÿÖü"ÿ/aËÑ•ÊÜxÜtsÆt&e÷î1£ÇZÜv¹{”Óƒ8Žãœi[¯^ÝÔtÄ$qÍ‘VKASÜ^ˆÐრ½+C2ñC˜èñ ‹ÛÖxÆ‚ …ü°d‘z0e†Fõ‡.‘s€Ý›æ)Hc§–A¸1*@†áB9iÁ#ÚI ñì‰ôÁÁ®ðŠR€ñ,ú†"ZËIGŸ÷°¹îBÖ¼JV°lf^©åÒ±…›×\xÏ”_7鮉z€ÇÁ2ŽøïãÇšS©9~æÈgÎË á–rú*ªÌƈùª‡ƒ(Žkí}EGu_všöóq9.á`•Vø\å>@T)ú@L¹ÚàWgp*ª Ò{³Û2Z Û•íûÛwb0[ð•Õrf­ºSBiw˜µ'Äkì"ñ=óÀø‹Æ$P2;=HÔRÈöZêmb9h:!¨ZåãÕ˜2 âI1ˆÃ¤z¶ Êl$ê‚€Û™Ão]Mp(’êÒC[Á}• ©sjŽUfMŸL\ø‹¶ ì\Žr_¡ºI#(qô\ Ðt>ô„ÛElèÀEÐt¾´C¬)$s9u"B¶­Î˃(ƒdGÆDf7´¾ ®ðdVôêc_WŒì5õ…fhéÏßµüuw ý0¨µRÈ…°Höp«Qýø+6´­Ç—šœR¡àÂYˆDm°î‡7A gáGˆÃF64w²‡›J—æpl %ŽC)âü¤ÐD罟#xî˜xõu#xgõ Ñn¾ÎÐèÉkR¤€rmGŠ<Ñûü¸¿SÂyû–Ô/Ì`de1í:ã£4"&‡ˆIyƒwÆ*†úý|îQ•ÉÙÏCRïù +ÿ½6—Ð >ž-_{¨órDà_ÑÐ Õˆ+ÁÖ X©KXàä§^Ü´éÆë†væIMe{„„œ¿³êó4§øsb(ÄÏà25.díøáà(j>é»›â'!>Ó)Š¬;Õ†CmÄïÐÆm¶Ä!Ž6Va>"OãßHÜSˆ%Ž¸7ØÍÊÐÅAÙæ\ˆóbá}Yñغúi¹:רܗ4ÉJ[ +ÃP]׊… #¸×†¸7¯‘ÄÛ×ñÌÑÙIG[ŠŒÜšQàL¾÷ðæ?'xi„UÉ{—ÕÙ¢sReleË'Œc?¿Î®šŽØ +¤VÔx…ßË¿Á1wݳÀ¾äH•cp÷J$?¯Pb/G$¤oðΊ!š-‚ËÉf¶[£>ê ¬*XW§r‘^}íqsæù‰óÑÓÆ©8W×Ûa‹Ð®#òГ4Î3æ¼vÊBªkÐÈb„¯o:S%2Û>ÍÌ~ ‘µÑºoÒ Ð­é껆 Ù©¶o­öEpÞνÊYvÏ]ŽÒ ÁT0â@z©Ï¸´ÊT`Lf¾¤ÜVù€ÃÇ9Hs1oúÖ€HØ+xmƒÀžNV„q3[(Šõ{ÕcckŒ>~·§!¦ÉIÃŒÕÏo‘ö$g„ú™²’!ˆ×ÏïXáNíøG´±jëÍ’ ìñ;ÍE5ƒ›zÛÓð¼vae» oÃùÖš¡Õó ê +š]ŒŒËÒ”æõ–œ`© Â1ý,ûªn•{ž¢_ +˜¢Ár›EóÖòrÍç(¦Êó.U°•,SZÀœÜ UgÐAƒbµYL¢H=ˆ6{DÜûpÈW +èbš†GÕäv€ü ùíó¿%Õ#¨±ñ¨¦ô£šFì뱀ܗí®ò¹K l’ëiˆG¸áKym[¡<>ß‚·£óÜÂÌI¤R])”ðí¨E + ˜²‡E"b†|­ý©Øº(¯¸œn¢Þ¤JQ³çª`ëÖUÉÆ^äïÿM¨_JÝ­H®/Í BPÅU±¤‚Sbã“K ï‘êÍOÃÁD¶“Õ¹>¿E‚jý’;›ÝÏߊùPmšr*\ándúgÇ ’š†®EÌU˜™A;TTGç¸N^"ô‘1ÇBBEƒü(j²ŒNØõ»Ccc û¡¶UX³—µÝÁ~}Î<œJ ]ðŽEVà·±/¿'ÒFöà¯2ÿ•K¸3öïIþÇ׌¿ù·ÿóüúÉòÇ¿ÿ?ÿü¿?þæ?üíûÃ_þò§þ§ÿöÿüø_þðÿôã·Ÿÿüÿ~üùýøŸþøùÏÿüóÿýsœôëoü÷?ýùOøËŸþøã:Å/.î~®à7ˆŽÿ•CÆàÕ%ñ„²æëÂǃj}c#cìƉ«6“$ÂO«°õ¾?Àd +ƒALñÓM ÏÈÅf6iÃÍ +ÆMIaEæïñÇÈ ¹ä.£NÈÚ¬ëÎn(ÃR¢¢êÙ],÷Éo<!LTYýÜ5ûñ*ÈçjpéNk¢4€¢šëÄu÷ip¡¾¨T|n]ôlú¸ÂWdäÄ»Çä†m«T­‘6ÔÆ•#EöL,ßj»!”±Q‡ÀuɃ¯Ïœ³jP%PŒ ©¢bÓ¹QH‘ BÀ€¤:É¡Õ#²@NŸÊB槞ƒ_6Ìàˆl4OKšý¨§þFo°ì¬ôó™(6ä×æÖ—J+Ó-ÑÆùÛKÃfÎç3LáÈ͈íË×çßk Ý°ðóúé7¦bú=O}h¾)®‚¡âfã³æMB‹.ú(Éw¸Rcä*Êû™™Ó0Ó0zÍVE>úgÁ×—yÝW.à3¦‚Êù§(?<÷`yûýþ¾Êûƒ¦\o(—DNtjG÷ù·c ®T»žÏn +5î²ço³µ›“q>“ý„b$T41€7UòSSÍâæ'_lõW†Ù=o8ÆÖ¹%7Ù_L6kÝyL<É]¥›­T£¶àK‰ïešÏ$ð†ÔÂÑ0µ­„Áòìá@G¤.:¢™ãSú›ø&JUEªBc CU²¢ºÉPÏÇ¢œÆFòj¬ àñ‹¥až„^ÌzÙíI+¯Ï +ʇټӈ4æ­2Z¼VYF( @PVêô4ˆ³ù¸‰£ hz﬛ëHW·‹ié‚?†iÉ@¦Æ“Ü—3í‰^ ‚ ¦ÇVHø‚ÝøV]И¨ttìNÖƒ¼,¦n˜Œ½ÉEBâˆsg×d"±“ÈÀÈÜ›Ø4™§Raõc'ʜÕéy.¹W{ Ex0=¦üT‡oì%u<ü°NÕͪ!1Öµ›A|¬žFŒÔ¢ðš.ŸÀEiRr4k5ŽúK–Ç‘þ3E¨ÂÊ™"Í­‰›¨˜VÑæL:);Ä;ÈϘ¾;%j.Ï?aNù'åRäÒzb ôPõi\wÙFjÒìlµ|KJº ‚¤™‘ú>úÀ«‘ÓòXÐÊIŸÏIH$KHc0]ŒùåèJ34Pîc² ß× !gkûÚ}IÉ y0Å5Ÿ)$3a(|òq2à:lÄ닾7vnd¯×r‡ðv€B)¤B5r›˜Flé„2T%X¯ûƒ]‰v™ÀR9;ú·Šðn@GÄ@lý"eIÃSGš0¾Zà^WÀ•A”@^{ÄþHiXòz+^P>õ¥)ÅÓCË´£º /õ½á€jÎ`øE£,lp LðG–]Ù00ÜB,RˆÉæ? ^&JÃîöû³FÙµµÆ®°úº¢u}Ñ@:Ÿ=æ[ãvÁöá(Á0Éá/ÆáXùPSXo5 Óùü<üÁ®¢s‚v}~éR‰'ª»q§*ÄÆ ‹&œò§[¹´.‡ëñ¦Ò˜˜æGÒlàuY kn*N¨MÖ§•]K£ƒgßèmÚÖDJ'<=hÔá¢JËFpãeñÄ kxñ ’_~ã1ââ'5ä1;«ÄšD@²¹”ÅçÖ8æª1>€)á«ÑãÕ(óù<«™`Ö #?¹ÝÈÅq»§?©‡rô{CÅ¡d_Ü[ã.<»/MÎ/±já„×àq!ûiˆŸH Ãã„|—ÏoÝ:‚Åî¹5|kH“;öÚˆ2¥ò¬Œ ŠÞFµ±q˜ÂÜ•öï>?#—¨öéËàh:çúorïŸã•ûì¶_䕇1ö³•$ü±vØZaY¬æý4ÄÏÃDžF´zÉužoi¤ÀÅ 8k.,#í²¢ö—ÎúC JUzEBÅÒ~Ü4 ¶“˜ôðÇÓ"kü…vÓZ«°fXI<:=²Èõ* ÊCa¸¨OÓ@YŒ·~~cLn±ß™P& +ÙðIîxíÿÖ“-û£Vw­k#ÃOÜÖŠžW *Ïß±5~nU‚‹=îgçà v‚”GR&e¾5ì{¨¯L«;FÂyÀb²­2zä¢Êcð:¶èÓx‘\±+1FÞäzî€ðÐÐñ´mxð ¦4‹5ÞС+ u')æ#¥ü¤ØÚy45VCBƒOµÑ÷ã瀋&±›bc‡CÑšgÝÃÕ§@~—dÜØ6À+·ÞøaP}ÕÃøî§tþ¢±iGD^ÛX‚„†&×SúÖ5WúÊj¸úgÃ3>F3À€§U³;‚4b@ý€w„/G˜0ñ¾s౎%ÿVÙm½*·-h±ob^Fûžy¹aˆG¸ÚÆKÂv^ Äá;¤º1Õ»ƒ„´þ²è…ÞÚÙÊ=°àÐoÓØo-Í\sÝfj@`U‹¸òZIˆ‡îðtHŸ¿ï'³û30¢ {‹‰ƒÕšáï%cu¯<Üdnð[än9VyóRÌg'`_f ›xƜDž©Àz—Ã¥#ò(á®7µëvXkÓ bLÉRýKÈkÙ:+tZó[¹fVÎ4£lkäÛ©¿b=Hz~‚Há ¬w¸@®È)؃m =(¯Æ‰nËz×H›e@¯NšˆFR^NS‰cö—ãpNÞtĆÀo R°QÛ‘×k¤uèÖµ&È=µ*°‚UáØV…ɪ¥3Û­'#k{¡5a•ÚᆈoýÜ1CVKVC°I°´{U£}3=Üܯ Яäàln§éÖ±$±ŸÅL@my.…jÇù×^U±5lP \‚)ˆžb¾æå5kp@/’í%ûe…¤å¢ñù°]šÉ•;•`íÞÔRàý×;ÇPŠ¨Ÿ à@ånrT^O#Ù÷v¹¨%ÅEºB8}RŠ¤j ÛòªOƒEhƸփ^7ýùVh)ür¯{@ûo  ®‹.5- óŽäµ`})TPuU? +(9¿Z¹Å o”w ,õÚS‘ï‹%‰×‰œy_ÇÇΫ“†7réáÅ&ŸÄ[Ùu;Amu‡/zåÐÿŸÞÏnKÉÉ%¹Ÿ$(–È>"Sµn.ž½1é EG±³rUÑŸ!iÅTEùCÚVøtL–dzDÙ ’“—%Ul +¤8Jä<|$ÀÆ>S o ¥Ï™\W/é¸^ü2Jö¢…Ð}WŠmb¢à½ óö/a‹N‡¡GEÒKp»ÚÅçDî¼Á¥ñƒ|éF¦ã穱æVÓ»kN,R›Ó¸£< ñ^–öç[øp‰¬/*}qÀ[C<Ù¶ŸìóF¾ö"¾†)6¹?rY3.ëÞ¼8õLLË«D›;6ÂæµÃO»dkÆ‹çè·ÃPÚc%¤´§ !p{ÙUzw˜dó[Šäö÷î”Ú¢2ˆþÐ%F4ž•¼Ù-Ô©Cb©÷·ÏC¾¦nùš½Ázë„Šmßµ¾EE"ë”÷ö~4]«ÏÔ¤†˜…<3qÂq*†áë`^‘•\ÁºYãòUKËjó2¬]óz@U8NßvŽdŒuƒìfÓû–vAk*}ž)Ö<ò•€ €]N….(ÊmãHpô!-ˆ°ÙѶ!%oHJêàÛcËH“§ÚãøƒtÝ)«\©™²è;Ýo¦lŒp.$`û›‚zVû¢Ç`Ç!¥äcäøÞknseu'>P-%bùiµ&È@ ÉJͼ7ü´CŸ25'F ô~ïµv.1çsUÐHeíû>ÒÁ?=©2Q¶ÊÄ¥ýኛŠ…ö ¶¡ÞÑ÷+bÜÏ[ôékgFh ÊáÑõ/'튼«~Õo–¶ýH,_ûþµ¸Çû‡Nmv;U‚yz…ùíšÅrÌ­•öÕ#¬QqãÂc QœÅ9²è#1iãxF‰fõHõÜnפqÅšÄXŸ=õÖÈs_ð`§83JA%G 2Ñj#œ8à $bd–Ö‘=Ä"æ†Ä‰;äéÏžcœ)CæÍ`6Å÷è$í_û×vÕcËéüÏäÿÚK5bŒRsÑÀòŽÌÁ„Ove¦k+3 ž÷¼Þ>wH!´‘ç[" ,Ùà¢Ð¹#unæ>€°9 {3‡ú²ˆÅ¾ÍFH° ˆ¦E2¸‘yé‚+ zÀKævöÖ;šg´Ö# ”±€šJÄü—NÞPö àñ¯ÑÞÜ_¥¨"¿5jN#P£…^xˆŸ ÷F­¨íéûiϧòãÚ•©òö`ã%¹'p|“T#¥S†Û…o¬ sà'·5r"q¨‡»&ŸýH[b¸—ý‰î$…+Šv™¿³l4úP¸‹âMSÖ †ó¸ Y !ˆ¹¦[Êâ’æk@HÕòY }0Ã%ÐvþDD E$Œ¼E{q\‹fg2ül¨ZºoxÃþ,Évš’š(##©‰‚,ò©_|ì.—Ü*ÐÉ×Æ©—µgÙ“¬Êv{æ½-}uœvXå(›¿5þ]œj­Ó1qÞMBôEt¬¼bÙ <ª !õ» ©˜7¤}ä'`ãUC@ô`·þ#¶íMùDcYä¾ÙÛæÙ¿ÖFa©4Güß5“;N»¢ZKÞ8™Ö#o‰¼a¾2¾èñºŠDêëµb**òJ_°4ã’ºåR´Ñà=Z[Ê2â‹°42£!«¶ucÊÖX[4|WÁ¹ò~®gåP”ª±A ¼H×Î@Ê!á„þM.yp1zj†2¬?€1PHPð‚¹@)“IZãõŠ´tÙµÖ±ö$ÁÚ¿‹,ë· ×ƒºÍv¯Ô`/ fï ZÊúZ‡a³Ao\GÃ>46l[ùzëyÕÛä5Ïdk©¯GÑbŠ'‘ŒŒ-ÃƨtÔÀÞ{PÃìãˆê¼4Î`q«'E¨Æ&;w´(µ+ˆÿ“ìo%£nÔ7KÿÛ†%À)Qã’üPÛþTC6ö˜+ê«8yAYã-úU ÃA:È'ygUHsøžÏCÁ‘aIÌÐUœÕªñ°¼¡œmWoêÆãÈÛßa¶È«V‘â2Ô®%ÿƒ„—÷*—Èu{…OÆsJ{> ¿º+›"…Zõ–¶]CÈÊ|e&€5G¹EÐ-6ÔòJŒrɬ†ig90½)j„ ;ùûÌ6¬^% Å3æ£Ü.äî×ë Ü=F·B$Îu:5¾ÁXzÚc¸ s³„R¡Ÿç©wÈæ¯qš&)@Ëd‘âz-@<¹Z çÌúFYý\°"ãwˆí\{ƒ¶AÀ¼ºE͆7êªkî0xÁN1êvk^k[l¸W»#•OÌÉ–ƒÝ +pXžª9Øèxñ±á@0 ¯hwܱK¬Dèþ¯ýue)vm,r´/rÏ%¡B«N^x½“C'G ´¶oA¢´»–h$d¦Ò^ì,>(VXÆèI_ö0k ¬kh¡Ã%6Å·nýˆ(å>šµYbSåŒn/Ã~€¨E Þòî4L hΕh¸[”OOn;"p}m[œ=d½ÉkÏ8Žé +Œ5ãµÇT’ŒI#ÏVPSºþ?ko³+Ë’œW>Þá % JþïÃî A@¡=iqT Šl@@SEHlýöòµÌ=÷=™»xQÀed–™îæfßO ³¤µ½ÎUm„ ˜zk'ÖWf?âg68sÓÎeZgboâm8ß~›’³âH½Ÿ¡øÞ.^‚aC¨©éGZl‡ g$x~XBÀ€-ß¾»tÓC¼˜¶ºøŸœ¿ZïT\N°²{88Ò¦h26¤4ѸuÒª q´c‹xS8†]˜PFSàe´KFSYðé^]%æñó +S9Ú­sÅÀ¢nº.ŒÂh[úYþf ,o¸5ÍËpl,qÔ‰ÏÝè^¶@‡¨Î;L"zÍFdª3Mâƹ€sTÅ_½DÅþyîØ?£$ ±CSΚˆòQíÓc Žâ`ßiËš'‚AÐT]‰o«ó3R6ã.‡™º¿#Œ½ÕôNÄ ¾W¬E—2¨B4YªÜ«ãê æò'Ù@^] ІxrĦŸ×ÓnAYÐ%R@Á¾‡ ÎJ_‡§_‚×o/ôŠ˜tê)‚n1—ô# +dhµ¾kPŠY±(5Ow‹z´g\Õçå•XUã!fÈ=j®Æ [Ô¦ýiÌos¼D¯Ú?\r 4¼ ÛZíêçÑÐ –R ,aҎÄÕg¹iú{j`=PšØÏÑá­UüqÿšPÁVAÅBMˆeCº–dß{€p¶YøР‡·i9]p…Í÷îiä0/Ñxß>eEŒ¨þ²uî.HQîîhq‚ø{”×[cÀ…LL\¼ë|ü ÑÓØ?Æ"eD“Þ’.N^ò P-z‹3ØùA[¥Ý +ƒNT¼¼¸žûÞó2xd’&êìÀªù‰%]tè Gž°‚9„˜#JU”39ÎŒOÊÐ/È`f0+€ÁQÕ¬ô¾ÿ\A”WaÕà!‚|ø:Ñ4o ?©~>` Ň5-Ò+²¨íñ^“!³håëï¾ÿ@½`–zxFr„F¥ŒÃ~œ0I–MM8šðì|ôõ¤©2O°™ +{Þfb’‚ò´ß$´^8ëÈåR0@>Ðüä`?ä<•yöQ²Ð퉹IRQÛ/P®¤½YMïö*@[Óx˜’Ò?}¼ Š×q6zU$„+dCîËþ¯7ž-®9Ùg5íÇœ¬òÍ-oFäµß°_~DZ Úੱ×|ö–Ti&*ÿÇ´ ›«,)ùI +Ï·pP0©¶¢Ò”Ÿ GW=5‹u QÑÈ’Š(Æãž5ý”äd”fXR'Vi]øŠÐ×kyk1å@ŠÐ÷шyAØ‹atiW,dFÒØÔ‡Ïáb‰LÁÓ +ÞðN.К›ì²g,â ;Pö«‘?¥ÈŸ¢«á/Ã0Ž> )ÿPQFÑYÎt±ï/¦eÞ=g8ÿ®Ni¼5ádVDÀxéÁæå]ýˆÛæ·L0ð‡$'Bÿ°5ŽØ?îE2Å{—:j+l¨sRow‚Ó ‚´Ô¶üÁf5D@÷Ú¶n=þ)§ž…«=¥Kü!ji¢àwr†§1Î~¨U¡ˆ³Ìsƒ•‰>]Ž4boÄ©2äRÊ€a|bcßrT×wrƒyÖ¨©K‰d€Y§jàövâšf ã“‚L:þçWŽ„Ú9”5êïƒUÖJµæ»ÇÝgR|æ;СŠÏ#hVomõ@cÈÄ~ú±OÑ­b¿¡ýµLÒ(¿51u™|ö”ÉZ×h¿†|™5³‰Ta?QuœIzà•£lOßµú]§F,œ…¾Z8˜ ÓÂ)> Ê'ƒ!YžÇ–óT'jžwì@øF +\²6ÎãlÝ’Óõ~‰îÄŠÚœ`‘v¤ÛåcÏÃøæ8å'Ž·ó‹<^ð1×W¼›_ +gBY¾4B+›jTXïye§;ú ¯RmE³¦dƲª¥kÛ*~±L]¯ûQã{Còçv‘¨$ÛˆÃ:2ñdh{FnÉY¡.Ýéìg¡#{zòÁìÚá¥Éö«ÓJ ð®Ü,úÐ%­Ìˉq‡¾))tÏEue£?€Bø¦U€ñ’ B…Ó˜4ø„¯ pJÁûª8ÎèU@óe"ƒq`ll„Ô=è—4¼ßrë!’÷zº5ø_ïK?㔈ûñvt ´^¨¸åþŒ…\žDÅæ/¾vù'‰¶“¦¶>P4 ”u¡lxŒz{÷›¤€(Ÿ'öôãgñ‰íW¹H불3\6Æ+¦wV²åõ„Hp°y°þÛŠ¼ÿ=HÖ–mY^] l‡èl NF‘ûÊ¿WUˆ¯*¨‰…Ë‘Q8~*UyÑ:X<¾xAã-u¸ƒ4tt û¾]oÏ•>ûrª ¬åðêÐJ­Ge ª/°mªxCÚ];Ì—d'kYŸl«ð°59oÁBÉþrk_²O˜PXgm¯óÚ­ã(hѤcÖk»ã yq”¼Å(DÑb®Yœ"5úT¸^V53$èŠCÃeþ¥ÀK³1¶$K•áúE"n[ªÉ _=cZ”–ýà†£³Ö3¾xà¯l‚š +ó¶å÷Ï¢Ä4Ñëe\Òza&’7¿÷ ½¸¤ 9 r›ÕÔØÿxÎ>ˆ,›åû7Ö&r,yG(,ëUâ¾)_o NH0k¼Í~fIdj¯£N­Ñ|Ä[ÞÌofî¥É—ƒ˜O” )“€Ýq¹G—_ÙŠè÷ÄUO€ÀWRza+‚ƒ}á!fãq¡(»óÄýš´üÕTå¬4zàÛb‹X}í'PäÀG¡m¿Ô—)âaÇ¥iYK:Ú³— ÁJ=Ç(¥³×‚þE.¾½aÈ»¿zÒð7ð;&«(.ä`÷ÀZLæKN_»hO„y¢Ôð©ÍâsúGKbçÝž"Ý<”vi×ýXɃÞãUJt4ýÊ]ês?æ9ü X¬h¿P³ôhIc]y*‰ÏâùÎgÒ +f³ƒ‘ŽZ ^¯8/¬ó‘»½o%Dƒ¸÷*jÃnÂÍÚ +½”YvEXCçºr39ÊÆ.}º9Ó¡gf&W‹tÌø R{LÛ4&XQ_gUªû\Lý·ÿËßä7-¿\¹ +À\çm]± âß/ q ü“”[ô'šêž²hýwù¡FâÕ‘ZˆŒÚ'¬`ß«…“&b„DãL[2Ø¢&(ö—:J#éë„í’>„¤I½l™ßµòê +Ã+ÍÅ‹„¬Ëò ¾€‚USØ…Û-ÖxºTL\oJ  ýÙŠìÓèÑ~y¹„_^Ày@õ¾šM±—Hë'ƒ4 Õ#_#°9Þ%-@ë3ê£7Íâb“kD +¬ò õ±ì“BXÖ…fMݲ˜vIHÚ´öªe1ST¼½Þ~¬“;B8c‰R;‡|€¢vñ@£¯› +£×•t.qVFS:t‘nDZ<Äm07;‡SR¹¿5hô`„Áv– Öà +(ICîHLã§îíës”Ä«SöT·æÛ( ²Jl[òÕ¡™!öÏß…!^FÓþäRÇÎíj‘Hj_秘°£ÆG, <ÊÞö>çüP3"Pî!B³ ’âÀãÇ +±tˆ4q/4`ì•°ËóPï’xL*vŠÒT,j+ü½e}ýCùIØ™Ä9ì\í\coiǹë6–(ò½ÇˆÌ6“nRãJ´“HçÜkLÿ´Ä´(3dˆ–®á5®¹}>æö§ùiëQ«‡Ÿi`â†Ü&ÏSó\÷…®iñÀÆdJ{Êå:ž¾Î+×|X³Ò± kyj·Ài “ÓLf¸'‘ËÙ¢‰*“o»:lw Ä5åAÞz°íIEµ«U‰(éÎ÷ fæŒDª©¤„JQpo"l>¦yÀ3ƒý_ ·ç vc +èg¬öH§tþe±¯ŸûÎ|a ±Ãm*[©–ÁF"<*Qi"ÑÉûKç&`7‚ªíŒŽ_VŠ²Ý„–B|'ŒXæ+ëT ÑaHb|›òE<zœæÚ¿ÃC°µ<¼×Hù‹],}ä†Bìö}‰¿ßéŸä#urÒÊÜa&ðDñ"0My΃J–³­,ãtz9¸sÈŠYGÿ’úþiÀ•ëFbWÒI›ˆ?ÀH!­ºï3Â?«Tìˆës_ÄM¯Í›r£}B´sA Á˜ÄŽ:¸\hÒòáÄ+âa¢ \}›¸CÝ©¢åû2ÕÏW}  —t—ü±ÊV³\ÑöÈž'T ¤D@”–1pÿ¾Ô_ò@W^)÷ü¤ªŠ®®•Œœè +PÛŽ•È~ø0Z5ÎPï -’?é=¿W7qXËf«4СÁ—2&Þ™(HÃl©×N=ÚãLuçóp‘;á]T‘óEê•Në6À[‘¦Ó5J*Ñ¢¦±¤Ìñ˜¡¬­ùÕmÆ…ùÕ¡ ¼)ŒË¨„VŠ+Ùê†qáŒó@™ösëܱæ†Wp`DèàVwÒ’~\SP ŒK+: ô$S=°4VP WŠè$ì²ÏÓ‹Ð;D˜Šçh' ±È°®ôe*ì ±£Ëê–C-¦€˜äROZ„r]¥—pÆxfÀ"³< ·Ž9Íñ¡Zþ:*ä#,\CÖˆ%ѾJ R„N1K6‡Ê3hÚo:æ¯+‰— k%É°0ÈÔüÔµø5ùÖɀ¤#•ÛmoÑmb…ÚK5ÿ +mòÀÈÖAâ@zÄïº —6ÕÛ.V–29àØ)Kê´¢&â–ù=SDv$+¡³? C¦/ÀZêÆÞD8€=ðØ‘¦P÷r¬²§cæ-k°f•~A?¶&ÚÃ^_Öåü£1" =˜º·Ñ6×|¦.œèý+7 d¨´{±Y¡~oÖN7,²¼„~œý9új{AAôR¨–k§H¾¬àl›5¼ ”¼Õ2 Å.0Ý=`Ò¡º‡>]‰°ï, +ʼn1L£ k‘ &ÀŸæÒ¶ÓGý-‰>?äk=£>õ(à“ÇÐEþ›øiåÚðHPO¥B6È( +¨_Tvšõ=ΫSHy;ꋵÞÁ~O)ü€½Î\Uu€²n´¢ö3²èª<€T0ó­FP¡ +(NÀ†–Í”1ÃÒÙf*¶¨ç—CÚ‚š­ŒUL 9_Dú2ØWKÆ‹]"Ø!ÕΨ€†ue>ëë1†Na ½_»y¬°k¸¥l(8+$6©f}û>ÀD?‘Èg‰T¼Mõ¡°•1áÃûW[†‡`¥ JŽ;í@óu^é:ŽüQu®Žb +ŽÕ´¢Ä»è8m­þölýÄ£ªÚ UñÀõQÝS¹X1¤¥jª¦,  +¥Ð^X¯JDK¡Ü9Z3lò4º¬úh+í¯dKÞ•là•ƒvð‘Xʹ¬ù´kfæ[^ÑZ¤ñØÔP®ò—Àgq[Ñœ×šÖ ç}‡÷æûïÙØÿ÷Ñàæ¯<Ño8ÇIJÿùÎÄE€5¼¬«yx &EøOÖkÞÖµ,¬¾G‰ I™hã‚þ ¸Z,ˆûÀˆCäùÞ.YÝá$%ÏH¦§ûµ…°YJ5aæ©Úg’c¡Žª{±O[_[aü—–Â[{Mn¢uïõ@³5.¼fh1ôšc0ºrO·Åå¥ÌÁß‚ëžtO-Ž½F†öÔš9N7b…<»n=t…Žø¡'„>2ý‹›^Ƭñbév>³³ {ÀšßÆ´[b§<“sÏh-2¡ÖXÐ÷ֆꑆ'—Ó`h†½‡é—g+¢–Áó£÷l§R±h¸ Ž‹¶W'/¥Â!*Å¿kXáJõ(]ݨêmödÎZàûçù +{÷C«„g¸ð´ðﺮ×|µ¢ÔJ*û cÁŸ%‹³wË|Æ|Gÿˆ6u›ùu ö̇0Ó4PýÕ§R:»v”-i¶çS›£Å¼díú„V–U¬W颉êÒlPY‰õPGØ R’nàCšŒ{Å,Q^( *†+æ¸Ô¦uåýWó¿Òï0]òsŠ…{Š`Kš0„‹¯ZQ?µÊ`T¥¤{J›dæ Þi¤Á{%Q€ó€e1EAЈ¾ô`mVÆù¶Ü¨œó¥®¿b’ö4ž,Y„o¶§Òé—Û¦,³S2¸V}Ô¬—å MÝ +Âý½Êè_ë3ÖŸ&ýˆ ?  +21ðÈɪݪ”nÒÞwKA=ĺMßÍ¥짟½§{ÐØŠ¥‹2@óu¨¶b£—+5!Ÿq+µûÍ´~úñ§S?•L‰f¹ŠïQ²S8ØšôøïÀ IЈÞ]¶û=ˆ‡€vXt†íRœÒ5>Ê*a& +vZZÙ@ý7àÕü|:Í®óÌ#cÞ ¤ØØÃ1+¨ÒrȨÈǧ"Ý{ØRÛ±Ö6î2À;·/´TÑì2Ý‹:+×…¢#j£Ñ# +Υ牡³Ü_"ÆñfÚp¢—l‚Fó¾@z™ ·3îLý°GËô[hž¡£mòô–¸åªüí[ÞÆó]D ³7ZOý¹ïõ{€oö ܧyî= *îY•ÒFCtDCô¹Šþj‘öl•ÿ# ¦ªc9ƒD·@¥ÓÐÞt[ßÙðû +ê}üÖè×¹ŠHQºQ£Íûwˆ ¡uK`'Ná98TÚŠPžÌ&ÊáMõ«ˆ~å,R¾¢ Äi6ÞÉ™}üh¿è—fæz®ÈE~ j§èPÑ.gÏ=ܯÄfb†E[ˆ€!{uëä¢$2V¡Pº^´Èe¬äØØy°MI¬«’(þrÖ-ó‡7H…-Ìà¬õ‰ü TáÚ\%¨½Óº~ž£úhq®R׎ÞçY{”è£Qñ¼ "8o¸÷öƒ›ÀÂ%PM¥>"ÕÞz(õ œÁ™Æ¸PV¢n|µ¡+Ð2¬€QŸ U/œ¢È`õ¨A®Šb;’ƒ=„5C¦Õíȸ6½ˆõ(îw‘A­ËÕN¨ÉÉ^ôYaé oÐÀvJe#0j‡= yˆ¿#ýžÛŠv©»ï†à•¨“-W°ÃmÈ„û‡ÙR>­«A‡Â³Že–ã¬ú¡ovî±A™Ï9ÈŠÆA„AÜ“Î( ªˆÊéL©UØ¡nPâóB!4o)q{˜ÿ9‹Š@tŠÛä]×~E>¢ÐîýÉòó+mèF¸Èb ïfÀœÁ€È—T;‚f½_Ù³&j‹¨bK Y÷DƒK¥“UΞb ½ ³,™O‹o„.Ú +{ßè¨éÁ»¿Žœ¢~yÎu¼N: C´…ˆ1.ìù  B½ª«ÉÆŽÓz¾‰hTš];ëõ-ù&(¹_åŽâ>…à怾Î$Ý'œjžI8©¿8nÎ3þtp©öýªüÐTW9ïeaô@,¯ ‘Ú +_RóYÍ9ˆ)\ê㌔ÿ”¦¯MÖ4ê gë´Úñ‘§ª#ÀÞg§¥ìs0‘9æ¯;×( + :F<]x±î¯xÒ±5^‰L…j̧¦¬ -¢àÕ]ãŸø ©àDy88¼ÍµéñJ z© ‚÷WúŽôöþjG|þë íwýsk¦‚#æƒ|0zÀ1§,I”Ÿ>øÙêÖo>…)èÙì³V±âîÕxYì÷%ÊyÀ÷˜}åw:QuŸhG¥1(ì\“¾¯|¸¸ ÔÖG‹Û÷(JHŠèÀÍ /éêàË7ÇÉ•íK³A»šûù ©Œi!Ú*½$x·Ñ¦€²eêÚ€ßì™±´`²!¶÷ý€ endstream endobj 77 0 obj <>stream +÷„´ö»ƒ¡oòœE³¥X4ÃL¶ÛtÅ?1z¸¢è¸ÊÎ܃~j3ˆ4Stî¸vªˆžÉ-t@”ÿL¯³-Ç%ȹ¹D)~ªù ýZ¯Y’žø@³·#_½ì„{24$ìÅÍsã:äh)y͆Ø"3“j4ts(çÀÙX÷cÿòq°×£a + ÊøÎÊ'…¯-@{áyå¯cÌiØlZ³éwwÝÛ¾]árZ’Ð0Ù7vuíbXó}‹8¨l8ŠVÔõVc•åø¶zåB‹,ܺeÌnÝgÝÓ…èò”ÝGå‚{œÎÄa‡w(r0Ì–ÂÜ£{·C_•AbòEí6yÿÑͱÓáÚ YÕÒZc[uÚu®B‹çðÜîA•Qz(£¬e9±Sz¥ÅçNhèwš¶¢ÿÇ•Äâ¶Ô)ÓžwÑ\mÄÁÜ<ö"fd{ó”ˆ(UÏئÍt΃âè⨅‰<ßtŠB€ÿ÷£@v,¾ÀÛ?Ýj<Ð|v'zÞ¿GÁ+Öfj‰²œé'>ÊÔé=â»iû3 +n' Ê=ImËÝQ=DôPȌ֔Ï!.m)–ÒÎY`þÊè©£§G¨=âtÔà» xyEXéd‡³Õf¿‚‘Hf”C[\ &šìîbo™Žg3Bxy`½¨±çÿrö¾±[_{ÕÎÏ7Šš¶‹z* ‘Y¢4$DXÉÈ"¤Ê ²’¼µ½øä«…UÃIÇ |ƒØx4æ9tR牘¡ÐˆóDX»h¡âcĸW:îu;JiY©SIêíëo)6;¢ÚuýÙùõµl”Phˆ¡‡ýøÂ=Î#ÿ‹%¨ZdmÞÉJ{ŽlïTCžo—0RPååruT¯¸Óû|MÁ÷vU+=?¨V3á[w#‡ ë0(fsˆ,QûÙ)]ŸML¦…¤¥T(€T¥»Pö<°6Å ;{vÜ{š6òž*xdçef}]`±ƒÕ¥µ‡t.•@>þHú.BÙn`+­ÆŒ¦«¸½Oж·…ï˜^È)€yË"C]å±ýBgNEn Ã{2¥îä¹íõ n|_T2Üä:õ)ÅeÕ(Š¢ãveW*¾½q,y?"`±Häb:z¡ÜêJ$ +×4ëfÁ/”P§5 "B@^Ft‹:Ëþ(;Pü§fäo +a!{´hÖá$‘è‡YºUÔc;û(q?~©Ñ¢+ÑÁÅ&w_a¸:Ú5X]9W]v +^óvþ&OYW ÔG¸Ä:}VöàîáBDƒO@w§¸û'aürw°šÈ€ [¸“ Mâ½úñž˜Ô)s1C˜^b"ÿO•—¿šû`Øíÿ̓=>Õ$*d]‡µ#ÍO°ß6ˆë\Ò½»Þ¥S® g‘þºÏ²³£—³°×Õã£ÝìK÷–…ÛîÞ¦ 06‰¨•©ÇºŒ•mvW +{ `LK“Tý%ññ)9*'¦½Li&’áS5ŸS×HVº³¢ïñ÷ÀÖÃÞ;§ uÅg å¯0g–l* 0öØÊù3ÑÎ\omòíàzOÆÆÅ6<æI2X*Þç¡QÄžú#¥È׬†v²O¯EI^Ÿ +OH‡œ2O³úíï× ìõP}l†ºCÖx\JãtZÆEK±s Ä=èúhöuÿ4 ƒO¸w©èêÙê…‡.\–%F­ØÍ>ÁQ¸`#þä²¼£÷Œcãø‚ÀzDÇÓ­rü?aƈ‘Øý&Σ¢™Í·ŸVµD7{ï”yŠ:b|³î‹ö€Gy7c×>#â¶Ìâããè“‚¯£ð‹5ªâ],Ä’ç3ÂÇqÏû~P|`çkµøZ#´Yôl¢ôQC~åeÃÞ¢dþ„ŒÑx À€va“„Ñ„Ô>~ ˜<õPyS€?ùÁÏìwÅHëÀ @ô䨈--®Jö +*ÐÖ wiæÌ÷²ØGĵQ¿…ÌNgsj*dVØaà‡\’RñÝ2Õ:>g¿Ç™‡½áëlý°NÂÎs:‚N!™{QV€§¯è + +Ü×N¥,ñžÌ‰~È<ƒ17lï¥P +Þ¡¥,«Œ£µHf¨Ô8ùéWž ºyq…!î |Ï’ –/.™ãü»NmMb*‰?JŽÎB?™r­¡ìÐÏâÇ.R*B‚â@Œ²ç裱-ýö| + +8)SiH'+?õù÷'Ö¹Ûûéà¤úì;‡ D¡wG”s„(çxýýõfiµ– V¶¯Á¹Pp`ß›’Äæ‰PÉa‹¦@."B¹97UB”ß™4eÚ®T/¼‡:.„I¢8‹KßžÏ)¡Â©^׬ƒlX±»ak‡Ⱥ>8¢åÓ~uá«.ïjØÅ­¸Nõž®œÓelê*ócÁkg´¸Ùþ!Z¤|ó÷?!ÆÒŠ$ǃ{zy™©[«W®×ê¢ Av÷· vÄ#,ÜljÏf0 +í¶ÆÑÞ×—nïÍ0òïóö»×éï3àOÓÄåÃ;FHÅ[ÕªŸÚa;ðý` á,Y0’|9ßË‹ ÕçPÎaù5^aêãMCµ«“°ÚTŽÍ¶¾!!ZLÌS2×tÛ Bø·æ Ñ…µcX¢Ió:5dø˜íwú`îT/:¯Ñ:— + 9Œgü&åó›CêãÝë—ÄõûÁ2|å"ÞØLÁ*Â]1 qÖ_bã³bù†ï†Â=à$»Pÿ†ZƒeÄÃDH®›û÷x“cŒÍÓÒtˆq&ÿ›s­'Üt&yª­„¥%- o ο¹ËטòüMÃY-üòÁ‘B{ßOòË|œWü’VÓ+e‡žÜÛIFÀú¶kþ€ý8ðÄèèwÚõóï÷;ð,ÌY]2•è/BM/›AˆÉ3dÿŽÒ’²QàZ@ª0)vJ\ÃtÑzø(dd§þ„Ö›ôçÓ#CÌÆX|Å:«}ÚìÒ‡ÈhùR¶n½Bû€Þ.øܽãCþõïÓ(u3rþDÅH7]ýþ¼þ­ÈÒzôÉåÜ×A&e”¨Á¥¡iªU2S.Z¹tX`*Bs½Ý÷͆"þ@ÄÕÊ1££A·G +z#±¤è¼¼—ŒÚïûã¿g^.Ñ_äý•'KØ"õ_S„ü/O5õÇ¿ýw?þëÿý—/–ü‡ÿýÏþüÛÿí?ÿŸ÷Ïÿüÿã¿ÿñ?ÿÏ?þ—¿ûoÿý¿üùŸþÿ?þùÿùãüûÿöÏÿéüùÿû§¸è÷Ÿø¿þáŸþáïþùþþû?}¹çõ ~ƒöôðwƶŸ[±Òà òƒ©¹Âá¡Ê„òCæ̘‚Kû:öúáoQØ/$ÈŽ<åÀí”sqNüúÖ|2nñÅ…ï¸Vµb­#ÑûQÈ*ÆàH¾Gd &òSßÇE&þEE&!©Ž…øÍ×ßÑ•ÆÏh¿ÅŒ÷¼GÉž~è ˆNÄßÊ.qç0,{€¬ÃZï¨Æ"ýšuò^:æûuªIŸœ=Kâ¶Ke«EJ‚Ð.¯àÓpQ·ÄÅF€´ÿ„¯E3L"Ðæˆò}N(ƒˆòœÓƒDŽ?5Iæ5`¨MVÐâCûcè‘ž~G8¯5ÍP¦øP¦Êˆ€òHÄ:™C+ÁÆÎ…*ü¾ §³€AÀÙ=0Ùq³¼·¬h¹Ö ½Ó‰Gñ´\Åàc¯LŠ•uúo{ÖxhÚ8‹€lHÑ\KŠÉ +ôjiÚÑìy…Dj?˜¬XÝW=’ª¨«ËJÍxgŸ5¢5õ—u`éVŒ/4}wNVd…Ù©E<³ÐÅI^Qá¶;ûØCb01(‚—¼whµôè•ïWb¦'"jï0 QLº…±l¾vÎ3Î…GŸ‚bƒÓ.Rˆ¹Ÿ”¬Ó{Ø#D)ÌG” B¶¯ì@äâõái€tŸœ€A¡ÞoEfGÀR1âlövFµ3Y¶t ªvÎ^Ñí ’é³$n8hKúTíÓ±ƒÞ—Aë/~eU‘Ìv­tko¾…{oÙXB^Ÿ¡œCs ýt44*+<%ÂèÒóQøýü6Äy‘¿‰jaœJÊ‚§b æ;âË_æ¼ßkªjÏåí@ü:‹å›O!{ÃhÛopuÔØ +‰†E3‘ß ð„ ;;A”O(é¨J÷Åmˆà/QB$²\±çLA@’Š Û +Ï¡¼ü.)úý ‰?Ò6"WÙuÄQ²“(^À0%Jt$ä«_¸ÑªÒ]-Çq$Ý$gM÷Šá9S7…ÄóòÓnƒœû²“#' N}¾":Om’j8”j­šJn«zç(V“?¸—ý&¢‡SòÉ媔F!A†/.(}*<û b´¼Ä+a`»¤…òqS+FÖ>jyŒžá¾|7tïÁ•h÷æ’ðªîü¸²Ãóê +¾HŒ",‹zADìåâø°VÚÄ-ÖÁ•,JP£Dî¨)$ÇLµ*ÍãÊ§Ú 4 +ö! «6œ÷¢§–—h­¡ å$|LjÓ¦mA×ÔŒˆ`wxîæ ÜЎʨޔ€Íµ2ó8L˘EKT«ŸÍˆ±ºø±·Šñ]öÊÒÖ¬‡‰P!JÚ@PªÅ*¦kQb8>hJìñ®(ÇbŽå>î˜íq®diÖª&û{„WZ")ÙÓaÿæè™âM$2Ó5•5§†CÃ^íîFIƒA8÷ê‚N%oÏPë¤jw:ÂÎbä±ý8¶¬â±Ž ûÞ½ˆ?6bYçÆ/®¨ˆˆ ¦‰ò "*dL"&bHù¬SÇÛi±Ã‘(JZF©»£VVo‡¹Î•2B+AGˆýr±ßű„%ÔxW4óÝß%]oÎ=-8¯Ã‘«4BœWPšÔº””IëL4¦XEX%!šÍ õò©áwö,uwfžÐÒbßÃåÀÏ›†qàèæ…”Gg>Þ7jA8á̦`«²À솅ÅkP¸ZÙֻ̪e—ÿì«îUz)mŸ£Y^ö4 OÁs–Ì?˜|Œf}³a= ¹¬½Ä„ TtQÏèuzå¿&ù(ß,…Æ+>¹êïó£ôAªYÌF;ó1‚ç°À­Ñ÷:` 5Öt/ÔÄÓï[™#ÁÆßqEV¿”âFе'2’Ü#Ã$ùÜëùå¼R ÍZs‹/Ôƒ¦ô¬”rþñDµ +«ã•'báw䜇ÑI®øÙsa iQèA¡þ)dž¯5ëöY8˜yf zäÙAJ£r@v æ¨é2°—(ÙãKì¡ßP‡ù^‚ó*7íYøïž +ûÇAËÃÞØž àXÊ®°LÄæÑ•‡zå3¶ŠúX{‹ðYÓ`´p¿œßœG†PIl'rÈs!ªH¸ð„¨Æã­7\KvéììÒ´¦r“áG=ölÔ8àvd´‰¢B€/óÃÎù@ã]LɆ”+˜o!D?•€ÜËê!MÖ(ÁI´ÔƒÃ¨*ÚŸ!ûq¶-;âšr§ì#D€ +£–Ÿ–žÃ™Ì²*™Ï…ºóų×ål'žM“Õš¶ h[Xc”¡€¬^g‡â&kÍÞ’·çÙ°0ÊS¸vBÉSüB”6[,}¥º8¢=þ¿©þâϾJ’’õÍy¸4S ÆìW1ÿÂTdÔG@FUé–ÞuÅa¼ÏOHä© ÚH#W£pÆÔGŽ^OÙžÔ€üœ÷´(¦P'@3 E$YÑ<Ý㽘÷¥Ä9”&¶÷À:ÊU¼{8ØL +6í¼.ôÙïEhg±o߃/,Sš¢Šh”‹†üÂà‰ +DðÜšªºÔ&5©ø¢{äbPº§´q2)¦ÿA¿¡þq­sÕ(D"…7® ‰íÃð »dÅ è4øˆ(kð qó¾WúˆzB¼Œ–ð<nLÍ"U*+µŽ”šU¶!9ŒN[ùŒˆj +Ý)èC·oΞÊbOAÓ’A¾ËÄн  ö  Š®qO‹õ›(dÅ!LÂ?±Ô¯+)9û¡î[‰æ: èFC¶…éfE +¿‘·åS­ÚÅÒí§‚dºã`Zòz¤NKØßhŽü>Rªè¡P¥=¬†}:öX4"‡ûW,¶—•½sAô¯-ôîöZBÛÍSÖ«âiD¿YÐK4CrÔØ؇Òìô·­j÷$sÓ‰¢x±£8 Í5Wæ†]•8òä½T¬e›´8œ4FÜ»h0 *e•4úEƒ×ß\öFø>LböKTê%¢Âm¸ì oo‰ØÙÑ~Gö‡‹£`œ©®,Ýí‰Ð¢œ`G‡ ™ƒ¨ªññ"_[{åÇG´‡0F/|²¾bDªÕÔ·#mΑœm{HøS!œõþ°H­+&¿3©ñYå]g×Ä[LMù±<ÌrtuxúÍ„èîFº o•dËR5ß(>©S§£ÄÂÏÐàÄ›LŒö𠨲O$¨ëÁ‡KWú]yŸ=MîÕ^Ûh"$ýìˆëtBPfWºƒ–¨M×W(H÷èéî±8e/ûÄ…Â48MÊ’;bĶD1Æœÿ &ÝΕÆͳÜcƒyKéùqàu§øš;™Sƒ—¹ÂdpøŽó‰ Q!¼2¯òiW×-ñ%•jG«E_çV°Hé‚<ȉ°:VSdÒ*³m¸¤¥AX‡J]·É~º$‚*…pœVY¤jfùP)Uçå1‚Ue|&ÄK¶%äj¡ ²B>u]öaÕ»“ ¥r]V8D©YÚ½ž‡r"ì[ñÄJËe{pæ8ª·HxÈ´í_×Iù¬×0XŸ3>½Ÿ‘Ÿ†+àŠÕã $0¦þþÛ€×NÅ#ë‰ôRv"é°i®Y ë7R®Øæ@‚Üi…Øo3/Ñ´ÅÞþ›ÕçëIü|š'Z¨õŒ¨ý ©L€N¯R@CïT • +¾ÒŽ7š¯ÆN‚„{¼GxwGH˜ío ˆëógŒB+ÁO";Á=}%‰cþ$è)Ø‚7æÛ|œ„_<û¥ VÁ¼µ­R'-ó›pM‹.ýþ=}~ ®Ÿ£°2Þ/?V½Â=¨ó™ÄM(%¦Áv \å‚™û~ÜË û=ÐvÞU¨÷“Ûk€j( +*æA©‡"¾ÆGzEhJcŸ×Þë#Š6ÃômJAK¦9´ÿQªk“^4m°K‘_º>#îPl¾´Ràÿ<>Z;y Üåí(°0Ø[ìñµTÿÜÙ Æ@Ä›ü[?ÖTÞ‹u©=Ï™‚ø¿lTc°)æ]6—›‚{Ûr²™ƒÙ’a«-°£Dž$¯”וlyÒ­Û(ÛN«3Í" +Ü/ŒZšª†5 Dv„æäD˜Ž"!SÏoŠ¤É>ÞýM¸‚1ö÷€²€ó %Á=ŸXùèôb OÞL‡#ø‰ä¾{žÁ¶oÕy×MH~ˆë°]©ß|˜¼Œ­>{¡é9zZ4—¾‹8Fûõ¾4ØÏ T°}Æq€_Á´+fKLÌ‘„ì÷nø+±kZ³˜ŽßŽ{ì\'¡«×SÐb…D³Œø¢Í•ã(ï~1£wÞhÞGòUI4ÈüRóÄ—}$†<­~”vJ7Ònö´ÝQƒ.Ü=\+Û×÷ˆûjFm°àÞƒ(×î):S®MH.óUú7fOµß÷T­Þç{ö¾ Äøpqð휊ª«8¹PÈÊŸï_:p®]KáK\oqǺtq ÝUS®óTŠiÉ[†“‰õ“‰qÇê{Và(c…ÐN:$‡®~ú«’ÆÑOÍ>¢Ðµøq4šÐa~ÉöøÌÔò̸5‡VÌwôTÓx-243¢ðsqRŽ¹ŸêŠgAÁ‡ãXC¬˜‚<Áo‰3,#`PqýS»Ì’šÌuv ò…˜×öJòŽ’OË[—EŒx³ªÞ$HMU*XIàÿ{D,bËö™Ì~«¾=Ïsަ̌VÃx{©v=u8øŒXùpZ:­¯ìõ-ª¨Ú´^$«¢ÿ»Ø»‚E¡¼,Ü®۟´Vr¾úø£w€jøXŸçr×åv37äcOKÇ<-; f =vDSáOÇùê¸@üû‘u¼ßÍÜëë¼±$vL]STßÊ$¿ˆóbâÁ•Õ2[3ÊC(¥pwýnÞ„±FÄú1=%I·$0ø’9ÿ#ÑŠý# ¶NtìœRT‘‚^ÊS±õù&µ³ªP7íæ›g~Då0Šé„NìÀh‰¡ÒÆ¡["¬û§`D–_^x§h à‚¨õëSUé +’Õ`¾–jxÈî ÜaažãyéVYf-ˆmTmÎEb@JÃvj+˜‡â˺š¤Às1n5àok­} ˶§µ_’.^­ã3âO·¥FOsBЛÏgåuúÑ{ƒµ×—“Š}/ªêJ‰D|³6~í£€A{áÞð¥¥ç¾ÓjÁ÷B mUCàAÏl¶qEßÃF·T„K®=ZŽVO€„DGÙßF÷ö?¥Ö¦– µ„L÷_U[ŒÆiÏ`3ó£!K]p±k5C–k¨ èÚ©ÒйسÊþ ª–TpjöŠ‘˜À[}¶×±ˆ”bgQ4µï§4gBmdßY÷ž0ÙaúD!:x¶fYè.˜«[3â ‹•wõ âÎá^ʈ`û[ï¤ø½Þˆ^Hz^¸ë¼WbëNÔÎXK˜Ÿ6Vù'ÎS<ÑÁõE„#f¿kMoTîº%¹=ʳz¯4|Ê-ííyª9½FpDíƒHOõˆ;!ãp7ÿbiŽ‘.ÎWÔ`]˜hµU¹èŸ‡\ôo¥K‹°ªgíxl,H ĵ·›ô¼Òé²Qf W MYØH›UïMVµžU½ãïdDTõ¡àGìÖj¹)á,AÝß‚dÅ—gõtò=¿u„Ëpñ%J¹4XÂÑàwÂVØŒt@cÕâñ°N²ã:åŠ7Ãï®Oäïqh1}éb·¤nô³F¹‘çÉîg°Ú5t:§¯.‹ÔƒŒª¶÷à íÎÔýöÓ'c‚å‚e>&©fDU')_]õ+ÅP^]¶6–«…ˆ‚j1€ YÇò÷€> +.#é#êãx8Yaô’Ëç4bD›£  +˨+rÖ}ŠØ„©C§v„‰¿§¶ÓúìnjÄ íì¿Ðph®±-|˜"ã¬Èj@uošb…B\» ¢¸Iål +ˆ²…¸£Õy¢hÁ‚¢“AlÀ«H‰/W7Ž¢ç‡ùL¥ŸŽ/U­Ò+ ÖŽ³Í»R4âÑ·Q…S}" +Tid£MýÙ NC€8 +h|š7Ò{º+|D8Z |ßߨ)«EŸÞÏ÷çûîüë"²ó½8eÚôÄvöHû`Fýñ§„³í2áùÓ‡ÿ8°(@|ž=RüRCzG¶D& L”ñ(FÈc}ÀàRw˜oDMK:´ 穇÷õðö]Ä  ÙƒúÑ<¤øÏ(:äûáM!Ðÿ³g7EÖíÌ¾Ø +* !ÌÚ¡e(¹Šñ…¦nÌF®ÝUmµÕ‹ÑUDˆE ÕˆÈ€ð¼=_!ð }%¨{Oˤå ø>êœpħdQ·b‡¬¯ ^=Ùò¥OMŠOóÈ3ÍB0÷B/8¢R¦Þíœn,“…Œ®8uª=Æñ‹ûèSsúød'ÊŸƒês„ÍØÃZ)¤Mü˜Ï€°ï²³©+³òU$)2æM쇶²_ßÌ'ÀÄ<ê½ü 9øAûÉED~aê¨}Á±bÀ¬sPî -Ä÷#Fšz‡%xG %a@Ô=DAîbÏ´^šŽ +hö~Ï45°Yx}R·P"›[G4¨R ‚"¼Gû÷*Š1ã"o¥Šžie²Ÿé¬)à±4üŒˆ{*ŒöjòíyÆ!ýÍ¢$4ßODUVͼH<ôÎ.6(¦ÏuñÕ/w°¸›’iý3êoÎ×›±£Ö!×VpžíµtTdEí½8/3ž&trò~a‘«ú&¢i/™Ð ¾JP?E!ά|wÎÀ1ɵHxç´Ò*+{GôÂ;âÕêo"îþ "%Sº¶ßœgöè„Ÿë"D­ Ñ ®T>"ÞæÈjߣÐF‘Ù°”#!9l–´ir8e5‰2  ‚ôŠÞp¦G†Qä²5 %“¦E›Î¶"ÒÈ£(þ€Y¨è!N@ð(´IU¨Q ¢Ï›tYMAØp‡^áŽ~ÝJ@#¦“š>;TLHE8LƒH@£ÞçG¥¶u(l!õß3óßž®6ºì Á¸N=‘~ìGº¹`V:d/òz —P†Ù n4†A;é¢Vþþ÷h£´(hèqœèãÓÇ3|štÅl^;I„8ùÈg+¯–uûô‡yÿ¤kÁþþJÌ’#ûdºÀXô6øj@‘—¶ R,8fÕÓèú®LÔœyÐyI)ºÏ_Ý©k÷ÇmH+ ȼ¸ümÄßÅÊúÿä¾KFÿ‰u®ø,otF¦$»ð9ã~¸L„b–ó9èˆ"¿)ÎC…ŸžU"$>¡F;z¼xRh¶ 7‚šèŽ¨wûð̃r!³ƒÈ-\ìÿÊ@; ø5®ä`ÝÜ_°Ýxw÷µÈ‡aŽ.c%g=e±ïé˼0VmžåĶ÷Ž{íïžFh2ý5"¨»VÔ!‰(d:ðìç¹z±¯M_Wª=4$OTp áåÆypÆ!¢:ªô5è´9 äôiÁiÚ?…’ϹSˆ·ìíДÙÎk±’åäŽ(ràdPºåRŒ=>ۢ˂ɊZ]&Ú1³× ñûó' `×Mú2 cðŽö ¢öŽáž~þ@9JP¯qH#¬mM"£jÖœ<íFl1X%Â&,¢yÓú^j´ÿI¶¿"*q4r&@µÊRÊdœÔ›îKG³÷`vrkÑE ûqª:|Üo¬8(lØô ¨J–ûó¥‘iýj#Kç Ž,€)¾–•' ýÌ ÁêZ4V1B´¹né'H1¸ –ðÛØMËwµ'À ( ‰'PÔi"d9À©:‘â™ +h}¶°3h¸û•šwËN»ö+ír®»×Ìاœ+:Á6–e +y×OìÈÅžҾ3¬V*_PjQ@¨éR ®¾iæ¥ýÛþž8ÀRMCk1Ër¶‘-+ŠmÆ  Бm¥3HæÍÛvú)tl1îåg¦}Ôê° +ôNÚaµ$±}ÿ^¨Qû?Â"Vl‚Q­IÇ&¨åí¶š&ÑM25@bðˆS1"‰x]jH¯}F5ä0…E5HWI$È~ùV\Ùl›C÷•/"r—¾$ûW·gïgk\ˆÍR3Uêš\ˆ*Ó ¾Å)¨v´& ëu¡Ç˜«]vîKÌëIƒZ ÈŽÈk(Àöíd­¡Ì“7{ØOÞ¦$ªA©¤)wAÛê‡[¹Ý¯ï¨ã(ªfí;phê"È»t^mA/Þ¿W ]€;ý5®Š íïš%ª“$Ìëõ +pVU欰2£^‰‡Æ•X4 ƒ¡àú¾±U^gaj¨)#۲ϗð‰d»å ‡n¡vÜÔáæ–Î̬`ï;%O\+¼a’#+b 3%•z¡2†~Å°ùÌ»¨)Ó(ßS_^jaà¸IŽ.ˆ1mÁ'Ã`fž ¼}žzwÙê'J†´j£Ã *ëQêpú~„ƒ¡®=N\%" +k!fìð<†¡ò§îø~ÅÞa ‘œ Ìu¾Ú ÍŸáyu¾”=:}Šú‰·ž7#•‰…›;‚ÿ¾äh{Û­D¥óÑdäý¨)t`(ø&<5 +Ï/9„ÞbF$©Üßr¥ã¸ÇÍÀŒ@ áɹâdàZ€x¨XtÖl3ömDÙM,634¥Qr6Ä;KÁF@$a†b~°N‘µ“E*Öé“1¹®’SQüò,Š%PX±Uù׳·›þfòÁ~ðj6]ÉH^ἜA¡ ßX‡u’±#óN"ö…þÃ=bðÑO•Ðþ@'\iÁžºœ/8“Z¢0ÐJí£ÄA +dÈ|˜¯Q)„!òÖ½–…ÒPK$HõÇo¿¿üŽ¯$•)ð/T¦0pwgþ°¤²£¢ô'ŠŠ?QÇ¢¤úáÐó&èžg 1éy ï4dŒíA„3¥iƒê´Kß~NI‰Œ`$BF"|]Ò¡n¼®´7pFQv Ší§Ã¸õ¸ÒùžäÀš¿dgTÃñÏm4é÷Ê_<ëDÚò`D†1N-¡)i瀂~SJ™M–硯é^¯ÒÄ?é‰Nœ6d~·ÅL`ų@ò ›€³•4Ž/jÐ$ïÓ. ›ƒF7&;¬U¢Ruèg€"•|£t®41,(2ÊG—VÖ²ÇÄÌ]Yºt|¨f’ö8 ‘Ì !¤´€ËÙNú0¨jGèî\?‰òßR‰„3/»¿pÉûëÑØ‹FÙ  ‡ºœ¬spŽã1ÃÃØËê|:}f‡þý–Lš Ä]„p*ŸåhXÇeì[ £Ÿ9"ÐŒ%‚å?΋é)üsùNå‚—«¶rþhÄØž¢›`WœDöΣerVÓÅá7sšßsSÃÞž —é"´™ŸS”GYhìŒÅ +w³ŽXB+p膕„ +ëÐSýx?Ú~Yb?ûpxcâ±€¡¤RÔm8¦—0•ÓKkrGáÓ†ÝÒJD?c@ž»Z– Èyùð®©È1Om‹ˆØC’'”O…0I¹z"ó}DT¥ º_Ûƒ/Å•Hª‰`$ÆwáUÜß8…<çcQÕ!bæÇK!‰–άRqt²ze#®Ø×Qqr:‹ÓvßùIÓ¢} ¯l¤A`RÛGËG5jÃjÆiÜ"2·7¼T^†’«ÒÉøÁžWÔ‡:´sRÏÐW,ˆ³ƒM{À}^ú"“Íø—è‘š_;Ê= Q*7 +¬!ž¤BÅC¯)êÁV6˜é‰8r‹:º<2"ÚKÿ‘×dUâˆâm&êœf…]iöôÒá•ð…3}"BB©`ƒ”…vDÉå²rˆ|=ÁR† 6m{UcãBŠmyi¿¬¡s@ƒŠš=ì˜]´4H•)x!&AÉ´Ñ̼‡WÉ^Hõ‰‹‡}p*-dPÌ{?úؤ‰àïók¯v´K +¨„,ŸÆþ¼‘ü¶ÔÏ@;Ç^Üs˜§û`ÚÕ¬ÌwÅf&¸”èð-u>ï#*«€K‚WBP…“¡·öGílv]Ñi³3ßÓÕC•‡®b /`¯‡QŽ>W´ö–-ØwL¨5(0¶·^ràÄ%IXUb$ßmP&1ÜfsɨXTú±/Ò~èr@Œ|†=ÍãvN%òÒÓPœxžpù)äGŒó*™tß]uÅÄ H•ª$|h…s›ðÉÃÚÕÃ_Æ&Ɇý•Ž²ÂSü/€iŠë`*µÒ "ƒÞiô^×,õ1E(GÞ«ÒR2¸šB,¡{O«%8‹œdò`öèûÊê e–Áõ)zóÒ ";Q'Æj5JÏ%*ñÒ +Y(=f]AÜÇÍKob]ƒ?ròo„â=2ÈOpÌF˜i­r/DM’>)ófÒD,@Œ=9)UY5kA.S Bšïï1å_Áý¯qÙ5{ÔÚ™xzη¦d›ÉïíÓã/HÁ&/K.u£M”hPésãDFG%.Nõ‘x+| ãÈ#¤0Sä ØuGŽ¥دۡ =Ó1Í/¤%ÃÈbÁ šÄ;Êw§µK^!°d\ΈrÕ²Á¶0?zŸÊÕ’7Æ WJã0€¦3Ë<_`–vÒ§}„@ôéÿýê•MoZ[¡G5Äý€ ”˜÷-›&Q%Gg®Áªw÷ØUJ-Qòë9‚P È»ëÑú:…!µBÅ}°²ó…e#ÊD@ÓAÁÊ7åkëÞ6ÇÉšžÀÆzHÊãQMuB‹Þ68$îÏٺ£htG÷U^(Öq_"åï»hö‚óëy±û2ÍöÊR€·­øsý ØtÕ#¿À6l¬,8Vþ#qÐì‚÷<”¬ lSo"¿«L|5Pcj×)AUë°°Î♨ýúX»x5 Âù¨évˆ!5>®Hz}z"B梋Í5BAó·³DDÈS왨ŸQ’žôñ¯˜±:/@öNÂ!àGO„Rhø9Ú§BŪá_”0ïŠ ¥ø²ëîÝQ‡%Ï 4ÓA†êˆì.hÅÌà„ÂoUżXõ jÇdY¸%WC;[n¶zô= i~2çØJ+¦úîGroj¹ïŸh7zsÈÁ%n)”ð¤ + @ö’ Ñe¥]6ðÀ$?Ø%/):X; %aÞ3IŽ ¢J„…IVxÀjçÓ±.ÅiæÙ;·®w=$ +Eæ„(y iBÍv”›-" +}dB¡9ˆ,×Rµ›åÑxýUÊè'aéHo¾.¤eyB:›éQ!—êסbK öG>ë¡ ÕÑÞˆÒŒpáV­øŸ8è_]‡÷r:26º8Ó5{óàÚ@:Ò ž5„îŽL;¨=(æ2i›è¤J ¶»g=¡Òàêæ.Sz@TUë4EîàƳ‘˜µópßa:Ȉ* K¯-m ÿRÆmåç\ [fÕKÐýTÑðjÂí£XuXŠG4ؤ+wjõ6Akã“NÀ¶ÁNlÔ#ÖôÖUpÝ;6˪ÑwÝ2öøÔÉÔ­Qm¨+†Uv{ @ŒÑŠ€üžO{=„P¯ Ýá¡…PÔ N3¬¾qð¡عÇ(P0òY7¢T–­Äļ¼ïL¶N0¢˜°wÎð#9?é!ƒ“% QÚrà‘e{õåÅw7ÐÛaáí[‡~ó4ž™;„"{Ž‚ ™f#ÆáDý]A¼¨£±ÁeHÎÌ—wŒ.\EÓ!EiÒîÙìcª´ÏH{_9$AîjÁ#E©ÓG N»A*÷h›37ÀÑÑ1é_NPJà×0W;*{;;§bÊÒh}È­ÔñÐQw0—¬¬íìöçö·Uè;<Íý„ðõð Å +¸£ mŸóŒˆ@#"¨<«âSN„„•ý5Å A­Šˆô|]IËxd–GÈ6£-`”"ÃíÀ°€|¨JDU´’V|—C)ÊÉ0â˲"¿.DÙž6Ù€˜æŠÓ-‡v]¹ +ÏgþFMUã}¢¥MI iÎÉ>çMU6M]i_dœHÔXH1ö&h½¼"ÔÞTøa.j5ô'tÓämt¹-jBd6Ã7 "HÂîN ³:ÄIUÜ䥔¦-†z ýÑK`Ù$ä‡èÎ8_ç5Ë£‚j›º¼¯Æ ŒÍªxoH¸,Ìy h’¥’=‘AÎã\ÀŽ@syíŠÍ8‰È Ãr™¡É·‰*° –ü g·½Üƒ2®Ÿ>Vh9ÀìU®ŸF6mÌ,uÜé|6t3ÜÍ_:é25 +¼gÐÐbÔŠr–j=.8 ¸wÁ±#;áÞì™®4j?:\u²äYõFØ/< %úy·ËzPÎÃòÛ²òºdÊ»Zàö\Ç7°Q¨ð߆…z”ó6¥ãÁ$L{Tö¤®*oÛüqóqÄø™ç ¹E}0§è±ú©õ¢w/ÄÜ¿NªQd‹Úç p +9àvq‘ÞN„VYa°£?5Vøû4Åî`³o7‚$çFÔ÷‹Ž·%šçÊÓÃäæ­ÝÓHÎHKHJ±,w…š2¦ì7ó$J]¢”¾D—†D÷]ÔFˆ@·§ä–-#¢¼W<äë’â…™ð„ë `OLÀ%•B£?ëÇc£ g ñ>f‰¯BùkG$Tt >MD,Æ èód¬à¿§ô%×)$kC°\w ú#Ç¢¡ƒ±M ºQT ÞT„ÙϪÌRˆVàJ‘~€è‡íB!/©pAƒýFtÌÂHä À^‰Ýu°ƒ†\B4 wi{.{ÈíæE8 ‚j;Šy+Ý2Öá†+e´îÍ…fUR¢eèÙâ¹îes©cD;)hý²æª’3ß]YÄeÖ­Ẫ}ÜA¥¥uˆáãÃÉž&³N1B«&#" å"Bcô‰ù×^ óÙ˜38”çÁ ÄúÚ¡Ò"€þU±³ƒ™L«W: –Ä0W¿ÊÚáÓiñ\è¨ñ.©lN1§É¿ýLçΰÄbÊ¡;O=§é"ny!‡HQt,™”]?0g¥ªÁ>™<„³$ï³’ž~ª*þÒ ™'ðÐÛ))󖨔þt©Ÿ,V`&D-–åeM£bWn¡(°¤Õ’DL.A©.êuœ¬»£g.;žVÕS„òʦ0é°íbÐz`4®Á˜V*zižutxÌÞ´!b•H½²–ñT¾iIµÃ¯U}iš‡xfWC[?‹KeÅYR—ÈæÔlœAnªè뫆¸|H(oìƒÕ×^ÿDšé¯å–( ‚³ž½ˆ3Mê2s@¸2ÍYœ8PŨ—Ä+Ú_§ & Í5W ˆrº\)ÚyS‚ïˆe)ƒ!FÄùJæÕÉú +“"EBŽÈHA5ÅP¸lÙ©¯5ÂUMb7×{W¬­½l ‘•#ûJ¿›Mˆ +¿LFºÂ‚LYe@ŠEÕ3Õoæî#Ë82fS*ò‘ŒàU0¥ãU®D»ãº·@õÒ «.>ötKúžbUi€ öt>’}š=5 >ÛçG9c ³_í¯¯åƒÇ›/¡Á¶ãê›=´®í ’K,-ÖÒ›J;JJ¸ªMöàïŒe!L-üMÏF’ÒCöFovÊ*f7¦fØ;°N™"´—Fh€,6,\õâŠÀnWì6Ï÷w…àŽ¾ëÅž¨À(š-ýA‰²^I…s(®‡l%`³uô0h4£‡QBë\2äØïX‹jŽ³¿ú+Úə騵_X†ÚÔÍ–p"P!Â:xÅÓ‰m®ôah,3Í’»ˆt¿’„=K,•ªÜ&† +¼¤’  +ðVPJs`¼È­¢z.ÀNUÒýBZ*n‘ãVP÷ó‚Ì/!aÙS2_P´Z42%U¦„ªQ£D"ºž–TU ø‰™®§DÂ7‡ÎוüMûJhïêô9LµvÞ&ï©êšE™lÉ*¡©m ­Ë¢|–¤¦Ä;OPì¿œŽýÑ•k®Ó~é…™[ á< %²ÝRŠ³½YeLQé‚ĹTV¿=‘yÅ+¢2)K!Q ­o—qJ`²eÙ}…=Dz»µ/Äd³Na¥D™ªlz=”Z‡ƒAÛ¨h0 ×µœJäœÚ‚Δ–ÕZ×ïHKVIÀÂöY¯Ærà!É^ÇÏš·[<ÙËò’ö#ž÷aÖûÊÔ@•¢†_VìOMPO,7¯W¿„"¾Œ©¼ÂË2‹óI|÷‘CµÑ°‚t¶Ù²6‰8ß`쉠2KDº6”i¤¢"D¨Ðä—³;rr§øž¼lÀf(±âl*8@Ýå5]²§RÂ<njJÒU¯&ÓN Õq}*l²·ºÕ”¸s—)´5|† 䌌´1úžtŠ@^3LXÀ5X.Vaóõ!%±»Ê¥íxAìL Ê?(ï‰ðÌåT#úeXª¢«ÈÛ—¦h ~P¬ƒP’á@Ѥ8´#¢Na¯ÝáifD1õӈ¿ù7Á€+qLOfGˆ¢Ó Bfé—ïûývèÄ3¶üf°ZrÀïHâTXÉ{³bΰB…^}?Ú<vM<Í*HéŒÕѵ³$aTâÊöêçH%ÜŠŽ¬ó>¯,» &(k‹c°ÀGJév ñÉñ“_a5ÈæQõäFkYyÉ}Ëkdc·›ðd¦”&i¸-} ž³}žÚ¾n’ÊÎna²Õ&Õ¨ŽÖ(:IúÚ¿l¿}Rk¬­F¿…][Ð_÷€´q¢šßÞ—£nêKR±háÞWJö¾x!äâëy„H­P!lŸ(üoÏnV:¢ýL–Ëü¾„þzEBŽ½:ÀÑV¶Èöí‰×} +{»˜Y4‡/„ú~IO²ꩽ›>4YsYB$®å?²Ì1XˆŽl¸qJ^Z?Cjº»ï/˜®:ˆ6¹,ˆðò›×±çÊÎ[=»t–}60¤˜ì™¼‘—jZõ¨û†vø¤¿½}ÃAAnåèy,¼ì(¼‰ˆÊ8žæ(¥2Rû8OŽöäAy⿉Ðû=ñ€ÿþ/¸×ÿÕ'ú úøOö?ßÙÁKî+ÎS4 +¬à1öSI)‡/¢ä>g¨cÏgÔ=§ç¡„’T<àÚ¾2¥€ñœxÛ³“ëúfe÷³Å#Ò˜¹A1 ð¶Ž¹Á쨺Ì7,$Œè1zZóò8€4ä—!]JŒù0Ó±HÅ“¥NÏ£ÀØDgŒF"Pž‚Á=Ê“= "à’¹R™k„zl“­„öqæà`t×à|ÜG½0“ +±î½³¶©¾{köwË)ˆödH,nH‘gG4˜”ÐäÀè¼®#P 9¯ðYR^‰Šº²w£*T$T&þiNÏBÏž-ZÐçJ½ë©¼§š¼ lÄôfëT ŠêçQ`•ÚÍì…ÍQ²ÄNSƒkÛ]ú&\®ëA˜„ âr„åþ’ùwr¸v¢Ø±‹¾÷ËÐL= [ÊŒ¹%TvÄLD×ïd2á×Bxˆ ÄOAXý}"Dç)^²ÂžAͤnÐ⻦œG³cßìvÞ«Ò Û›ÌUA$8Í56Ôdêã¨4ìµþà ö +á +„g+%ê¿rÝ[0É>"¼Ò*^~!‡ŸŸoNc%”4<# ²"°PU>öÎàLÔ…{™· *#¬ümùÙjöip/sE6/tG‡WUBìþð´€Ê^:½eæ„û)D×PiŠå•5®ýœP¬ä£û1æÕLê:9q)@v:9Þ „ w«ÄÇÙ^tlƒFXšh ˆ✱ië@×VDÔ¸C8øúVûP‹™çktdðvõ}ž­ô8<"Š|&ðþÙK¹]˜A\º½Ny—ÒmÇL¯r0dƒz§9ÉŽé±Óüy€áîŒIÁúJ |F•£.ê‹ ò–#›¼S$t‰—Õqd Zå]}VRÀ™OD=‡ÓñîãàÀú›M÷þ^j’qµéÖ¬lôo"¾­ŸQ¤ Æ:´ïGÇÔ?–ÎÊ3,‚Õå•÷iZ¿‚q¥Ot–àA!j±@Sinz¶ÙµD­Ò:ìé/ÇV+í¼Ip Åj¹†‘Ì +‰ópú@€•­wxº’ 4¥^— ¿ý}p^Ðj•}Þþ¬°Ó˹p?ÎF^ÕÜüh–êèñ„d¬+0çqu"÷ «4îtD(o²WÞ4"ŠhhBjŒ+EMKªñÅÞ~X©Á=ÎÇ—j|§FË”ðAºEDà~?瘒²^¦TKn†²{yÊ4Dx%–Zí™PYû¥ùåw|Q%¤(Ž[ô¨ ¢“m’ù†ù$2 9ˆ,™ 6E25ýÈÀ€'J5JªðÏU‘}§~’WëÅ:ÑWl_H ]kÁùˆ…¥°ºDˆÍP'R•ˆ|‹¾xP¸]‡9§9ò4µQa³M¦k€æ:å‰ÀÄ,"(Ú} âB@|žCñøêšÙª*صBc¾âDÐËÑlÔšÐÈ -–a=£J^·k% IHU·:ÿ{¿E×þµ°R–Ý 4¸£P À•§XIåLd-½“ê·„\ñ±f}s\ü¼EÖ]÷">¢Åog„ ¶ÂO0TèÈp–jšùÁ3½Ÿ<Ú2{W.)ø-âO§mÊ5 ÓþÝy`s°Êñ]L&=<€#€‘róK²it.ð…E–ˆ=×å·ÞVÃð"î1ÈÚPL§y‘2ëCXkð¤Íz,Ù¥{¥b‰t{!PN™SôœŒü*šn ÞFèÍ굤Žt +±ª¸­¨g«˜CFªZý*è£Åµèäy˜ã=¢{ž°i¤¢®Ž¬åˆÓÀÃÇë*Ô] +ˆ­Û]Òmóh·Ø›†:C “m´ìÿ,øÉÛÖX=„”'ñ tB§´ºÎÁߦ;È~}¿xäø3dd"öBªÝ>éhóáPWò\‰s¬ÚêëBäiîV‹Daïw$[S¿`tñæÖæ;B¸¾Þ=Ð{û×M.õ¥RžPÛ±!¡ÂÆ-Tð º|ûj +ðìDn›:ÊGåN÷0ÄV=â€{Ñ/BÏ¨Þ 2`èSÒÎO®N®Å YìC•ômÄB Ø;SÜ.WÆ¿†cÖŽB²%¢Ô¶‡'²B@áløÐO?mêKlÊ7ÂŒ))yd„ý‹ü‚ôu%4¡ˆjçû0kÕÚs˜×]‘¦œ‹Gpœk9ùÛsd£ø{ôù«€€¸eý—š£ÏbF†æ …<ÏFÔŽ0YŠ]`ÐÂPDÞ¿Š\däq*g5OÔsGQ¯‚`Ѳì³te.’%”×2s õHÍ>þìc]úkÝï±ójn–4V$4„„Æ]¸G¼@MxÊ1áyæ— cª%P‘Ot‰¯ w† >ÙwJGjÉBz Æ]X¬àÙ…í=>}–Ï¿ÿ‡aá{6ôX(™ØsÛ¨‹<Ö‡a bD„F˜z«Ý™âí d•õC6M²Íb$I›{,€ZÔÀ22Š°àmŸrgs{^FÜrb9Ý\‹TƒÚŠ ‘£ÌÏaÇ×3tá0ààsû&"÷èJ•d>ü*<ü¥­È [ ÅåØsì—^û&æ¢ÜPW[HïÀçtñ>"îØ +} Þ®ï¢èmO•(›³‘\€ -þ&«ê¿ìnºöRJžC§Ú7å:±åƒÒ£CÛQq~qˆ]zâ4¾¸)ÈÓxáeÿ¼lŒãt®î„9.™üvàmÜ¢×Kcœ¨pJDq?³0渎„"Ð#"F3en~GN'AÚߤ\y3Ñná4œÎµC͵Ð@Ò$c…ëbqx@Å‹<΋<êgD<’¶f ®Cki„&Q$$¨=69šÔùEi/‘y÷©ÿÃGD à®Hš« +ö…$6e)e¨Àâ¨E4"÷ YƒT•,‘Ì<ŽŸüGDÜ32îfñ³*xýyží¾‡¹Ä,ÏO&)û°ýÌB8s^ÆÏAhPÑäÚsôÎkymò1bé›é­SÍÅEÎÊ´Úz{Ñrò|¸ï'ìÊ%²´o΃R™\;Þƒë…úf@ ÛwîŸrX߬’¿ÊªOð;i‡ÅŒRd“ÚÉ”ßyÄéî +š+õ « àYSô»ì=·åþMDܼð$p+@j>ÏsE?¡I·›oµùkñ3/<‰â ÍiFîêôå~©†¿%ÿž0ÑZÓ®†nòÞ[+ÔËžNC[2JÞL-DzXˆÜM3QÚÞ=(û=qó}Á=ÎÓüP¸l2ö10æŸø!$ñ3%8ÎÒm3â•hÌ!‡Œì¾Ï¢E 5ΩËu*ËD¦Ð r‡–:Å7á±Ç‘rS×9úÃz®ÊØZÇ)ñDúÑŒRH±sR x‡î58/e *ñ Íè6"õ¾7Fî öÆhiY„6½gdLXñ>"z ¤·æÝö|D)#ÚCFTDûˆM#=d>My*¾4Ï_°ô‘©·mÉŠ?QjÛðÁjÊ|>”¤=öÛ(!*(l{TÓôn/9_¿œIØaù„·'éúZ‘=ßëëÞØ…¯@”ZØÒÍŒ6¾$[D\ß#þt›xm‚«Råôý<£_ún«ª‡¦h4‘µ%r÷€o—Ç· V“ªãðÿbímv¥G²óÜ+8÷ð å3(3þäÐ.†6ÎÄö¨!´d@€[-Èm¾ûÏósWen©, »ÑªÍ•d&ŒX±Öû3@JQV¨ñÉepœ‡¤T9GñŸƒÊ7VŽ&¹l“Œ)óÃ~ÞMŒÝZÐ4@¦ÄöTÖ¢;¦¨°ß/JjúQ㆘4 &›0¤kMvcÒu”††:)•™¾MíôÔ»)Å°ëºÆLêŠÑGÄ?í’3÷ûÁ¡»å…U“ÖÖf߃0ËhcSÞ»”»aCï¸ÓG@E©<ÞI3ÉQsêƒè©ãòQê²ÙUä†ÿ||µîpµqX®qc€ä€LV•ÌÍ`~1Àqoé ê*¢0¬Miçä„››^zQŠ¯ÀˆÒ§Ù¨‘(€WDtiõ§ÆYF(Ï‚ºß”©s#f¾ ø‘u\…¢ç:TPˆ‘MÔ”ËzCzí¹N‰zËÉÞµª¬6×þ&V¶& “|ÕÀmU¶*¯'#mfÝÞI \/8f?ö= êÖMžÙ£yE‰ -jADØ - +_[ì­AK{Z¶çñj™†Ä~Ôz!À6 +»n#çnÛÌÒæxþœZþŒü ð Iéû#(iÏ^fJtÁA;¡ÿ†YïG„ê`ðT[$ƒ“r¼G!ŸI1¢©XפÅÛ¯¾ôLC‰òÆ6ò⯟PmÏ3^>õÌVxàÇüæã ½£'g²²†áëëÀ•RÔšTVú@3Ì%ÈÖ¾ ùqÁ 3n÷î~­³3žˆéTåøŒ’Ýñ‹Û\ü“R㤧:DÏùt˜ÐùK„p@¢>JÅNs¶ò¢´'kño€Öé€%û)]”&ÛJÕ6d5=¡ODHȹG¤¤Ñn“é`ë +B^é»õkÃs®ÈÅ_Þ…aÎZåG5ŒyŒà|®­<ú~ oÍ;üããx7n%ü ÐA¡(*œ|¨ŸãÈsO=ð# +.¼ÓÆ}¾c«½Þ±‹LU¼’;êY7ú¿/ ûʈû¢üß?£DRÉžJýÌ[€Òß…e™J1HqÑXé.TÝ@¬õ=Nuº6«ýàh0²;sÕ:ú7ïˆqňˆbõYNTw…Š!¸tX94FŒºQ”D\¦$àÓõÖe³…™ë‰†Ìq ²À¾×XTŸã=™ÐG ùý $'§õ˜˜òÃܱÏ=TK®ÉX†¾1äFuK l?²ˆ´ø[±¯Aøá#J±ŸS÷ *ómE\Š+ yg†Z3ï#‘ðõ!µMsß, ®p>Î}Îì4Ë;‡Ê:sªùòñšC0 CÊ.ÌÇyÖº§ä׳…S'pAw3£•Û½kn÷zhûèFͤ¶+Q£ÓD@²ÉyK´'HÛ‡*?ÅÞ *žü£¼æ¦’îËL‹Œ í;-î^9Mh‰•¢\(t¾b—ØÖë…*uæ—Øî–ø#±s_h2áYv#î`pP= À€wÛ,Å_`¬z Ð;¹Ÿ¢¡Q:#¦6ó +xwhÍ3ZGnG•19’Btdì® óp« cûŒÈ¶!`;8¤(<s(·ÚVtfïnèÚ&C_ÚP µÀCSG17¹+$ÎX‰ñPu~ <Êg,ò&püŠ†´ö¨€è±@B QP,ÉœkBcúç R §{=®£E Tz[h]¬÷¹ý©(ïµÆÓ+TÿC æíO…Ų-ÔóÑY¨{#Vµ=ùæ<}Ë%ï36¾÷\KÍý›ˆò0]‘ž|žÊgÔ5f¬ç½ùס‹×SáécûùâëËßt9ÜäÞ´ªçÖzkŽñl«Ïtôøå(X%"ybÎyÀ´ò¬Gl‘#eŒh O+,_AW +Í mÛ/ç5YÖ<:1Úse#%Ÿd艨ϣ†KxlÛ½öW2 òÜ5ù¡NEJ¬)âJg8À*t#É1îœA‘ží¹§QÈ=uèþ.¯×S…ÜIÉEú5¶“+´¸-N}FÆI9·s/ùtçŽ9Ö>#r¥Àe•mx…ßÎsl>"ýUU[RdÅRJÙ TtuåÝÏó…üˆa” Öˆj:@¬(*œDÁø«ý}î°ÆLj»Í¾tL%J>´ç Ù‘%]ÊøŒÀÀcʉWwý¥£_E]È]¬ó ÑJU¨ªËDÀ2ÍT«ÀiuyŠŒ©)ór~m‘dþ1×ÊRnʪìq–j䊇²ŠuGPÃèô‘ÊçB›Òò{T)ñhèhQ¨yÅzïŠ ©Ì’¢®&(5Û–g|‘ÞŽ¹ F æ£-º5²®©©„<|±e´Óš~L%ÂEÀF-1@0ö-¥Ô]ÿÛ®ðU¤H*ì¯F®œ‹ÈÃ<HPÑز† ·œN1‰!õÚ·ì¿Øj%½Vl:6aê“·Êù!U—¶õµ¦BíY€‚\a"<\—{Ô°6@£}Ýð[/»õ®…=õñ€š‚å`kÃÐ{BøC=Ùˆ\ +æ +px Nhû8”ó>Yð©È®ÝiÕ9X}[†s@DcDfZèŠÍ´Ü•­ú\á‚´¹eOåÀ€Ï]ìœ"TÖœúSÀ½+S†ÖÔêãAño"ïþœ8?ùÿ,+ÿ_y²ã¥é_íý‡¿Yÿpþø‹óã¿ý×þbåÇ¿ý÷üãÿüñÿî/ÿË_ÿéOûÿ»¿ü_¿ûOýwÿ»Ÿÿøÿçwü¿ûówúÿøÇÿý¹è÷Ÿøÿþöþö¯ÿô·ó»u‰_}¹ûõ ~C<à?óÿÚ t4'¹µ"ƒ%h¶ZX aé#ç~¦â+ ôø_‘-\Qž@³EɬO™%kç!†ðù7ª²aVÁ_qúë[ÅÂG+PßRôÞÓ¶”³ÅcªpYe«³ºñ‹Re„=îŠùkD xÁÁö ždšc§­Ì+"òÄŠ÷è0FHBSÕ±ÄdñÞs;° uÿÎ. ˜×”@pX¤¡OrîæP0%ÃW Hb›)Šña0ƒÞˆý6bee¬-+ÍÍÔÊ9hŬsàXfCæÞçú+R»ª¿áLÍÇÖ‡nÅDœÎÇÐø¯]Êš»”ªšˆÞ=¥˜\`ô¨5˜ètµR ­«èT‰Zéº*–÷§<SX@*¥+EŒ¬¬È ¨‚×nâéø«% ’^½ÖÚXÉFá_OuœW}ðÈ.þ,Z@AGr%2L…­E\ÕÛV²Ÿâw­r%õ× fDÊ©qcœÊ4R‡ÓyÇôˆ* š,‹‚xç¾C1<öFŽ(D‰ÂÅ!Q(â\;Ò}Mk”üø=s`h÷‚¸êÌGCÔ ¦·Ñ`F1#X&øÝ-*•+ÍiXб ÎÉC숨švîo`KÉÊ;Øý=›Ïâ çPô(èAà¤Èê©„œå´¯”6KJ­H +胞íù;g-ÖúöÕŠ ¾>ƒgýÿ!À1ü–à©o‰XßD`×£±µ¥£±ÏÿÕSX§÷¸Æ¢4X ÝÈ*‘ìà:ˆ¡†^õ0¢)nè1ù~À °K'ÿñ©;ÙÃúÕ3k.žC$^÷Rz,w|Eû©;í|¬]=H¥œ2ö艊ÔöíۜӘÔ ¯Hm;Õè äWhA‚iþ~FDÌÉ©H¤¯+5l—(…-5¶‰d¥´zîfúGÀ=  Þ*¬í꟢߹ÌV‡àN +Ü‘Ö.ò°Ý¬,ÚM¸%zU\0ƒÏï"†›6FðÚ¼>ä=Š´ò'DÑRN ªž„ÀIwδ:¸b3iØV7éžü—·¯3GÜ)ôÎà½?‹iýšâuqæh ôl +ú…Iãß#¾ÄQÐJ—X%@B£´É'>òÍù3o$™Dí‰èª7þìKÒèg®—ÉÑÐíE:êugh$ƒ¨î¹æ¹‹­Í?yBPá å]"î<À0âPû¡´¦8ï(l…Ö×;Ü÷YÚhª§²_Ýc«Eus£leT;îÝ %Z)øÔý‘òwYd×08Ñ»·™ÍŠX“ⵯDa†(ÄÓK–3¨š,g,ÈzÁ¼k·ö",ë(Uññr¼4/îÙæg„“h‰µ5¹Óy~wêê¢Â»†C™t—!¼Ö’¯(ä“tå0åÑô÷;1 +òÔ#OÒžq…Ðv¿< LÓ¤N°kHàpþv +ö$æ‘hnç˜Pˆ ÅŠz;<œB¡a`3V­´f‡ÛV(÷30ó„\gÞ¹t/K„ÎZ4ôEÅmîÁ–—s*ªd4}ë`ƒz‘€9áZlAï +,‡@¬IÏþÌ›mÏ›GÎ&'¸?ûJwØÞÜlž¾+Š.ÜžÇ‡ä šT‰R@D»BÛ@ර—€ÙOáƒêº{¡wO ©%à°ák …9”Ÿ)=-xM±j'•ÒËÕˆ*?)„Ô¿ÛåœÎ3Ú¦4Pg°þ^oÕ©áU<¾¼æPw ¢¤¨ÎœWÜ@ «ª!OxÛ­÷v½;#'m-9xÞÚ»dÉ|4´Þÿ³…Kàê¹lXú¦=Õ [8³‚XÉÝØzW%P_§Ç– fâD)Œ¿Ría‰XWõã4—":[ä42Ê÷Øà÷ch?MË+õ—ä/A°C +°>ïp[QÂ÷ÛŽ¤bu¿Ä¿ýŽü¼ß)‰,Mµ2qG¨N±T†ˆHýaGa+,áQ³£=M# §aÔ¯Ó †iÄVÖ£õcÀ.þnÊ7èÑí¤†ƒh±òéÎ}#JñÒÜ9û¶»ŸÛî¾Aª½".¹ã§;__ÇIÎíÆ(ókÑÙ’…‚Xe§ŽLÎÀLþ;#µ¼‹÷ˆ‚‹ +˜§ß#²A)A-¶S%Áoιlhxù}ÍòнÁO«ÍȲaÿrëSL~20Öd\?iñŠÒo” ¢Nz‚àYqÚÚk@Ô!@²†êî"•oÿÎBÇßdžCq0eu¨´¥$ÊTë”ëdzY‡Ž‘zªX¤µAâtÉq]6ü¬€ô 슖§tÕ*¾wEö¡é Aaÿ_€ð°Vú" ÿv¾»…äu#õK×sôÁ4ÐðŽ°2×lƒAÏ+¤ì•qÿm4^éÒ#Г „»ŸÏLam½À?ÚWúˆª-ß™?õÓÂa U׎‰Æ/&~0O]ùªô<´ÊgD~S¼ZY¡+ºoŸçÁ؞ɖΓ§)IºÖ9;Šs ÞžGñqlüSU®d„78U™§a?GZ;[x¡éãzVçäœ6D‰é œ7—³}ïñ–³èÎW·Øþ¹ZI\…»×Uq{[<¾ö\Ūa‡ïm»¯n£ÄSý/ÏåÆéEð T6ˆ¸¯\©I5ZkŒ%•褜¸ñîLªÕ=0Á¢«ÏÂS˜j¨©þOíxêÍŠXî²@‚¡Oä7’Ù1"€zôälŸQwDÏý –j•„Ù›eëïÀ¶®ZÑbrý{Š™µZ( ,踿9Ïy¨ýqë:¨®ÎEþ-||`ß“×e€Í ø& +Æ-@J(LȸN@m¬¤[t5òÌ…ñ3f`àðÃ1÷"gEýyŸ_ÚBë»ê í,Ã` ZÆ #¦%¬I| ”³‰òÐåÚΚ>›‘´Ô ñF⩶µª¹!æ4½spÖí$¿:¼S­Äáý‚¬pu{æl‘-ð®umó¹À¹™?hyödj%5H†S÷U¿¢§À ÁVkÓº¡ÇHÿxR+EÏ´=3zU+‰" +Q]£Ò\Ä[žÝÎ óÄnVu­m[™—,»&€=8º´Ã ¤h +{|]f;×ÊâÀ0ÄN¸ñ)ÍŠ5r}„zò;$ Å; +¤Ç|©ˆÀµ?ó>™ÑSÙðÍ%5£† Eº ‚éñæéÙÛ.ºÎדøõAäž0OhR3¶ ´ô†Þ¿›dò¥[ %É÷Uôñ[„×é—lÛt´öÍyì#_ÀœÌà:Eº5R†­|$I[£ÚwТûÛ^t™ºQ*Ñ øÜ2 +rH^U6ˆU‡<íiÄæCpô ÌN=Î:º¼G¤ÑÊN¿¨V«¿ÂçyЉñé¯×bÌ8å¬{Äv»é…úñ6†×¯£[ÒE„Õfͪñ¥9¢8(ê”]:+HßÖÇ[ÒÀøu@6×wlÖ»¨&ãÇY@ÿwéòhaµ¨Q5¹Ùnù 7¬[ûJ´¯ó%rËjÍ|*Ô]4¶âyÏéµ_ ÕI±‹Ö>#žÑvZM¡ær–oÎ3bjeïDPÏ.ÇZrN9Á#¨É[UŸ­üô¯ÆVR5ŠYH:(£– +—"„n˜_ˆàý¶ –€˜|#I̦|صdÁ©‚ÝÖܹ…‰šfìs!»ŸEW­+QJrÕÃó üÀ†ãîDD ñ

GÚµ´îוdÝZy$Ùœ‚Š¥ñuÃQŒ®Ç­ vÔ…Ž˜Íéö 0”¤} +'˜Gò6:€‰±S㙬Í: ìúø¡Q.&ä7­šbÒ2Á6„Ü5DðeW½ó3"ÙF‘ŠJ:Cið›óà­™Ô38úBéÔ*´în.þq•Hè¾ÖÚ+…}‹êÑ xpŸI…)­PÛr'5bŠÇ/€Î/™þÖk[g æ¼G‘Šß›¬íÄM4Qâò+f—籈DZ9ZÂ" ðj¿ST»ÉŒ‡º­íu^>Eù]++o~]>Íëë…§_o¦44´•ÚŸΣ@|Š-+â%G~n5@±+ŠÝŠÂïuJ­è–;¡Û¦¹ÀJ´‡§"ïàÑ(L¬•àv®ôUbs90h8³£7@J²ü‚F²Ñ±ÙJû…çÀkØžc:Á¿ø”­+ök§@˜¯åvz «OG@ý(¶A+…¦TÁO…uMfHÿ˜Iž‡~»H±Ö‚¯’²ÊxœÆFUåI™¹æÝáÔYƒ‚¶’Ä—\)Âm)÷-à÷O3MP—Ñ¿9ÍÚ%Ûš¶ÈAáë¨éx±iQ é#â»5ñ#E¶=ôÊÜSTó×Òx‡V"±Ý ø¢ŽYÅ$ #îÐFÛH·Ñ{w̧™À+QdWµ[öëUÔ1ÕQƒI$¾ˆº8 +¡¶jj‚8PÙ×ÄJø=Û±ºK4§„{»JÙƒ9”¯HŸd‘}ŸûuàŸ,!µÌÝÌiíë{2~H<—ÛÎ:³×:é)œÙàšõN½êEŒ@§ §}ðÔqzw>n‘ i&*½í™Ê‹<›ÑwĽ­€ÏÁ†ó¹’Â)-röq®i<îµjwÎã“\µoÍÜmÓòEzÏÚÀŒDèáØ·Fe®Äå™{ý÷iTˆÄeMZ‘…O‰¸[„úñ“áï' H¬\q;¶Mö™wö™VüU—H£j”ï”O§‚Ñ Å «æ¸!Ø`ëÊ+‰«œçºàÑQº÷ëJ%˜omðþºY”ô×ÔÔpje¦O¡N0u® ×&eu¯G–UN8qçH”Úª+êÜœ9&lŽÏ#`àØܧJø^& +ë¥=ÂTÙ¢ÝIÜÓë(²£h[äa$fÙAcvXâpp‚”_CâªÞÁ¥÷5·‚"éŠ7>ð8¹Ç¬Š Û²ŸL‹ášÿ”øê*ÌL7X%[šY‘ž×r uê?#®P<@Ü›ìù…“ œ•5QSaÐɘT¢êL—Ÿ;ûu³$]…áþ ›°rßF%uᙾ4F«@+s!z9úú¬ÅdÀok²  ,Æ™‘:*¦®.RüÀZÓL ~³J>ÈOÂË[(%òAÆD›mí*ébp\…ŽV¨Šž‰éºùAŠ¨Æ<é\GêúuÓå‰Bª‚¨˜Uúm¶÷lnHiíÚ-Yš«|‚qÈ'¨<¬¿G¨e¦mN{lò2†+P•h‚t¤¯ºÝܸ¯¡’ÆHësV¬Å‘wÔ5É› 2’>¿æ}%ìˆæ¹"Õ‰¹^¾5%P’²ÊF—67ºFȉYºZ@1ØB€’ó+ÐŽ­ô'÷kyŤ殚°F•,Cg´õpï\Ò#êçʯFÍ W §RGÜ¿7y=Ï0O\¿Zjþ/ÑÂﯽkUÕcþâÀ «ms•æÌ>8îxõ4üKžç-‚c¥º" €×PÉPq?‚ry?‚üÆ|?ÈâʲüNqþ~nÍzù®‡¨ôƒ³.÷Þ¤_´&Dxt]Êüíú–VH-èu@Œ¤R¾Öœý"¿E䙪®Ý予ã~žÇGTSnõ•Ú ‚QÖo~€Î3G ‡ vñð«ÐJ[_e™ùàèåõú¾±?4a…ò0ö·ûÛò:†ãØCÕA1àÞRƒ½ÛgÄï7.6Ãðš¿  %ªAdÄá5ˆºœfº´B ›o‹TàJ–çǦₚ¢¼hÖ]W9„îîwj維»í>£°ÿ3…‚Ôå$x ~É9÷à°pºõ¡¯èC‹í87 ` Ϋ×ö‘½ÆÖÿdr¸”ý{?ÏÝ(í(ÜãXÉ6Š$ùµ2Ž˜uK'A¦>ûdÜ¥Àä­Íõ!Œ¶ÌM@¸ïÀûFy“õõs©ŸZ¦LÉK¸‰k@'5é”·2w5ŠO×Pb.L±@ÉhŸIGŒšl}«V»!£³^‹Ç1ý¾?‚wšOÆK\ŸgÑ÷ºÄ÷ºê,Sr]2&Rg°ÞkO;ÎùàªÞ£jlï]ih%œ¤2YòžÈ.)ò5MzÑ¡,WØÃ%¢¼tMÍ~íE6ïA{u×Ü‹kŽu)[¹\j“RRýöP˜]l–®×u4. hø5{8j2JKµJ™XXl('³‘yKóÉ´æÉÜ-ç°DQÐßßõSë?˜âöͨU 2„ìŒö”ù€Ež1,‰qÆÚžábøMÄÊ0žÄîã ãkÆ YXéºXœ°3ÁâDÃ\ÜlŒ8HÎûgD.0“¶;7ï›ó¬× \ðÚãc»ç÷B¥½Å²ÎæuNs±´¼/H»6¾ RŸ?£þjŸ4W.éô÷4~× 8b¯L[?›ÓÁ%¼O–öû»ˆà¾O½< á÷¨qDÕ!.ЕˆÍJîèk\Ÿ*¶,Øšàw_h|«sKJS¨ûàJ¢±Î‡JnÙ¼Ñj!}ÚB;N´×zñÊ7ï‹r +ÕïQKÊe ”›I¡›ýÙ8Ãp·nO¿S5É>A§‹uü-Š*Ÿ®åYPïˆW04r(ê= *ÝÈR€ã‚Ü„•+çpÆdM§º‡*ã¸1 ºë‰˜<6ì2Puƒn+zÒþ_º‡ŠßPã§Z\ʪ¬%Kêß=ìع$YôFѺũ¹j°ÈU7ì2Ù„ü)šÁ|bâõù÷tifª»Çï¢Ð°Y{c×¢7vt^pÿûˆÝB#„Â#ñÔ£7§L¸þ’t—°E*o&_ðÀXDèõ/ìÝz]î3B?úʬ=Oج öó©IÛsLBzmQP‰åĆõþñÛ(¿(Ýÿ“ô. ý—tó¶½{tZã’¥WšQ²žŽlÌD ŽàìY­/yA:‘=ø½D lÓ>Cȉ[×—ë’.Ìéô뎉žîYèâÁª}O¯ZÊÊëlÉϧ[~AÌ|N»ùOë¡Å»fL ¶×¯›ø7X³²ª «Æëdà­C« š×þv‚é‡í&þÂg¸ +P¨®ÄLZ]&}¶J`„(Ž!Õe…bÚNBž.D+1‡—\õ=Û?Ï« D\nƒ‘[Œ’0hZßr%¶MDôàÛ®`äÙ=;‚3çÓw…#°ëu¡;¢†Û!oL¦ñ£Ô e¶BtPagà´ü Ä;ÁýñÀÍsŒÀèB˜¤ïö`²‘ì¿n7¨A†VŠLýõ¤éMHcœò2¯ÌÀO,¢dƒ™Ô4÷5˜¼®m©&¯kAÙ+uÛÞ=kæAÕè'Ñ®ìõ„lÇ•xh\‰|%7j¸º` +Uu'X[ÕGÀÖà#[Ïþ2·{G—%ru~ó(rÄ{|náµ(^ìÜÞ9WÉÍçæÿTƒÿÌÂËOR}CO*R@…ú7yVSyü"™ˆÀo +§+"”˜C¡\ JL¾†ÖºlVÙ©…yûEõ:$"p‘•eË€o»mÊW<¯¶§j™+Ëž\®£Å€®Šð-± ׉å¦rAKÁ¢ð0zX¾j õÔöã·ßŸÿŒï¤8¢Û1ÌF½¸‡¿ 6¥£?ì¨S*)puÉë:zñ*ÎÀRôúpBøÌy@¯ˆ© &&ap…äf7°›>d¡þ~_)¥£Â£ T~.Qä9;†î(XÁ¥U-÷@¬ìWwËÛ—’aâ=ÐFKbc 4–˜· }ªWî`·é$3ójØ +FÁþ[GLTDOáÎþ¹9û’×Ø€­a Ô}LD£rÈ)*[×X‹ö†W²¢;oÚÿXóÕ#ùêu<:F¾¨b­¨ÓoA%=øß‚]6Px‰%…꼈YhØKæe›äâÍqׯ ±eëâ6óuøÄ.¦\¨·T‰·T-ù%&õC¶Ù‚¨h¬'q•/5,SˆîaÀœ„¶ö€±ÿ°hßR´'  Gç}Û¸l›VÊq‰êc2pT6ûšî†¯ U÷5±çÆèYfÖ¬³çeg[@ÃûÞèñûóÕØÞý¢–Û³RÛ• •ÛÂx2çÛ^‰ Þî çQ,£¬§L&A ½$Ь¡æ0«#æ0ïçJäÞà"î3ÅôÀ(Ž”@îâö6vŸunK­2c©5ƒ°:‡À˜•™ß{ßÊ<†*Ýx.tèŠ<ÁH³IBI¬DìÞrhÓ#|G؂ǤÇî$?)u9ݨÕÕûújÞ·:î,ò‰R ¤òÒ4?.ºƒŠcß»kk+³cÈq¼¦¨4O»ÈyFYVeµ/Ù3§±BÄåÞi}ÑsÃ!¹jß?‹$€Jg{æ¨õãUe ˆº¦NêBz‚ØîBpmlP=zŠ|#zŠ'+c¿‚C?l<€™¡6-püë½8j¨ÜŒêéç•ô·~oLëh±,x¶ Põ^ðV¦ÂJƒ"N„7FL显®duxc°'½Àð¹1íážøvÌ`sQ4RyÕ©µ£™4i"fV, íÊ!Û?Ólî© Ð!5y©·~KºìÑ1ÛRG̲·=ñÈ;vÌò5Iól´H.¹þ®¯9¤Â ] ¯2ˆ/š=ÆÖ§ö½±›jMòÃÞÆŠ7û`¡µŒ€´£µÚjvŠSIé +UÐ;B­)ƒ<<ûALjÌVãQÊÅ*VïÜûÈõ¶Ÿò)U¡y2Ô«R÷å1•\Q ¿ M|¼½fD­˜ÔÝ|Ô®„¼®íoñ—J9OÕ…Gà3¾SOGKôÿ±¥­JT<ëÖ°\Ë`{éÀácT³5a)ÖRëñ¼x Tãµúà’É‘[€Mjﯼb-ŸCÑ«g@ ¢c’üà_Îhþœ{Ä +Lq»äšÁ K:øÀp4ù Ež3Ö0¶£> úŽ8‹›ï§*Ú’é(c'Ýñ‘ý¤jÖ·˜ÂT84QîQ¯sRGITÈç)[D ÉOôR)›NMîŒnˆ\´ÇT/»´HY}dB°Ô=ï\¯“Q~áÅägÄmDZ–éyŽ-O~B>Øúé¶3@ ¶s‹a\ +Dôã™UJÓoÍrÝiÌôn’ÐX‚-NÊzŲBt<;i5:p S~lë —Ì=šÑŽ¤Ú ›AìbÞnüCE‘åVÁü²Ì«ƒ-´RTåa¯óy5—íÏÉh©Ï›"©<ÁîˆÀ*¢"ÈýlÛ„-p!#Ô”ŸèBö×ulów8çŽ*á×>ˆ˜^¶KÒ± #|][G +½+‹dE*fpkX–×…~ý9!bRÉX/ÊeÕ~³?¥+:rjH£] ¦ZÏÁû²öóäI¼ ó‡FS‡´¦N»iÓðW’”ß(Pc.2TÈ“x¢„^¾8x@h£GòȱCßHÒ«OÜ]•ÅX;ç.+÷ÞLÒu T± +?"êi õéÌåë[ZMeã¾ËÚ£Ñ i›ÕòwÏzŽà‘Û–ÄË@‚+áõ$úÇ@¾µö÷­ZkûØÞØy¡‹Äžxe¶*E‰G§üÉŽh WµÂÖŠ2^·ƒ^þz¹r¤b}›RÌ#Œcß"öõ—[ˆ• Ø·<‚ˆ’äð(ƒÕ]˜@™f‘#=Ò!m²CÛµ®ê‡€c㸠äë¢w¤·‰fpË" +·Çž~û…H²jRk9œú^öKÁÉ™fñQ`Q`–jÓ˜—ÜÑ0C0CB?é*¬ Bp½ÎŸµ’Âý•ÍmQ+¡À–µz&rC˜¥ Pm”‚ôÏÏDQrìgBÛcG˜ª£ÓYR”Ú\4óž ÅöÛ¨­m–åGïɹ/”O3ÇY Ñßç~‘±É)s[?áü€&Ô‹7s¥Ñ(3ïŠÒ3Ü@gŒ¿.)në²ÛóÑ9©ß[<Œ‰m†ÀäƉ„ºnÉ£{´žËy@Éw:mMañYÈ®¢´{fPÃDç¶(Y…$¥ŽÚÝnß’U4Vµµ˜7æD¹fÙV™û&4d9Ρx…µƒ…ÛÊL«»;êL—_€•¹õϬ”×8vŠ÷¦èe´£"·1_ÖWÒŒõ%wL™uÇÎÿ·a!ëíÄW¶”ëµ/‘ñº·Ì°VsëwÂ4íºFŒˆö kë ^I¿¾% Ö<1ê×¾×écÝ2‹Êí:uFã¼!ÅUj$ñþ3—oê@]îÖ÷Xs)n×~Y“¹ˆâS ±/Ö¢u¬²•6x ·ÎtÈæ»ÎÏUK‰¢UµCûÕ¨t>jÞe+†™ôv_îˆRɪ~Z™ªŸ‚á5Rnb Ðuß”³”Ð%÷ØŽ"dSÛ…Î%ªª¸¢ÇгdÛ™Ïo#"W1Ð,¹ŒˆtŲšˆÈL¬égŒëu¥ÔêwVùæÎSƒaŸN€MG—½íŸV÷O«!°^:¯®á7·…Œ2¾ä³¯íúJ¾3ÍnyÑ3 …ÚîGý¬µï Ù®qRà(WH}ŸóÑÇî©0³{qÖX&Ž;Cu²X†j_‚n?Íã-µöÑìVXé$B٘Ѵû¿F\{iI»£ª|4³bª¸®7á¸IBGŽÜa«Ü9ø¼ üñ$äªu] ³Î$—¦ÖïœçV½˜²¬o•Aý :¶K;±Ï¾J¤çVDœÓРUxsìœë‚0¹ä) Í×…lF“Éû±û `I‡gQðºãuç:QwêjïòÒµ_‘ §}Ž:~8Äõ¯ éÚum¶2ôe¸—vÕx¿§B +1ƒ§'¦†[¢¨hEu6Ù¤0)ó^kNÞ«ˆze¿õÚi¦ñà£ÑF˜ Ñð¡"6›˜ˆ=!wJ›]åfùHïªÂì ¬iFP6²ÁÁYm›DöFù%øÞÂ÷¯dÌIµÊ8®lÓ±Re“FAª°Ù囪öÏ„Á~ÓÅ®ÅýÔW±E(ÛÆ{3ªÕÄo'm¤Ôu§ÔíÚ¼Ò+¼Òö°;×÷ÉÜB z1=O(ÊôÎü܈MZ3ÁعR"‚:Îg6>è›[²~°¾üÑÚérî\ÓuðÚØùê2UÂÞ¢áÄ‹ï€J†ôªIQ/¼}ìØìÛZJNª{W]ç¼R›Så3Å3÷´ûÃÞ©oëw^ç‘j¤ý2ÊŸ@•„4" |*_–ùu! +õ††½@®WÎ#^U=·N·²O6·…x®!ê°»Žè»S|—;Ìl&tù°³¹Ó¹=Up©:¶·C¶ø¥UǽqíÐù@Q‰É [Uk‚Ú ˆ(˜¬jovÀOîC”ôÛ¥ðbTx¼ˆlíîÍûgcÙéLø‘]àD¦ÀºI$Àx^gçgsíC½mñÀA4EZ¯)õ•ÑµØƒ-1Â?Ó”äÏk‰ºë8m†|°§4„ +v%¯Ab ™]3àä[Ú&W!k «é2±ñëö# ™b1ʼ…]¬ òšÞ_'QÊËPVS¼rnÛÉõÛ×Ã;=O´ö†rvñi³Q|©¶”B_t@Ù€ÓÞcdö››áUa4t4." ô ÏÌZ׊àLÊPE7œ\èY mÂnÃÚvÌ°ž}¬ñgýo”dxQÒDîS˂дœáJGägï‡%NË”iŒNÞû4dQz9ªÜ‹cÅÒ[¼ñL^e#M†…1STâõ+*¸Ô¯Hõéz¸¦[ñî:žŠ¾F“^)ôÏ¡Ó¡ËqCÔjBRôGÒe­Z›é}Z—Ñmß*”±iÍ0_£wE1Z$X¦—L6Š Cª§§\ +÷3†¡V?Ší;ÍYÐW4gç£ÇÉ®È!xiŽ(Äê.Û‘‰„X¿U¥þ¬ƒ@Ì ðÍ´%òûáÜ×u¦¼…+7ivcaò ÚIÂŽtc4¯*–ˆ>Ï‚®aDøÕÏ*ÁÁ #“™OŸlSá,C—Ð0šZ3}Ipû÷g1Áó¹ÊýºL¶+WÛïss¼[0òê?à ­[ ùWH’ŒÈ½/„+l¿÷…ztv*Cy¦©ÜÍÛ™ÇÞSW½'oaR+‰^.&ù&TVÏ0—K¸ÍNûB[Q·¶È‹¤;R€Ç¾3C½²žP÷sžáb3¸!¾J5›áê¡·×ag\™);ÞiÕyXVH?T87eü»Qu2:ä²à"ƒé¬šœ?ëŸI.k±é¤°qÙï*à;Yµ…€d6Y–¬<=éÀnvÂÍ)ªœL¨r2Az=™TŒ6P·Ð8R´Ð†î ZÍç•`¿8fIÜ¡ümù ·¨$FóL±U ›~(Wøµ¦3oàN36—. +ùå +ü|­ñÒ‘ŽvኺoˆäÓÃEÖ–‡T0Å£D6[,ÁYæ¿–ÚgÁÙö6Ä 4änk†s£’£:ZÎëtÅÐ}²Ö?§ Íbýüh´¤é ì걉̪›¢Ç• Oõ%DOJö72·X(Üçïz÷²8ÌúÏÝ̽ÁùÇ¡©+¡§¤ôµ“sWÝov ™‚÷Æ> Áx¶™+}:~Žtö“lÂï¥&K™ˆš,ó¬êÝøôú3#^ I6îMš Åu§¸è¾¸­ÍOÛo¹+Hd·é‚J“f«¿väD Hq¥ˆ.‰PGa$š‹½ô+È{ wó¥866ý‘)³Mt¥M$€ç¼S?@1œ9[Iºí –QƒC8€ŽÀؤdóóË&nÃh˜CTõyH±UsFOÊOœ²@ÖTqê^Ér/áà*æOa‹sv7—B“B“û{£¿Ø"|0 žöÓÔ½yp‰lzT'y¥Ðh*#mQ£W.½ñh:÷&@ç‚óõ/¨ŠS[ea›¨±3Qãæ56€5|û%féˆY+›iÍ•îÐ †\lºx‡:MÚzȼÁšÓ¦*5ÜLhTMÚʈ¢'SØZͨ«:æõ Eƒä‹´àPTt{qõd¹ lý|ä\7ç {KvnÔ@æ˵Uƒõ¼|ØBèK5Å|7-væø¦õòº’¨Ïu¥XrÞ©.®­Ü¤˜ØÆö½: Iœ!UãD "í4:Á¬ÿ¼Ç[h+%[¿˜aÝñSÎ-AGJá±5qR ßœÊdäS⃑Ïx~XÒ7ôºšÔ4%L¶z…¾„ž¿…5î8äÁ@é2G˜¥ãb·5¾ç¡ ÷(¼Mg ´=À/Y ·ÏÖ•üÀ`«Ç‚+þ”§%eûyûð"Ï ÂZ ؉eÒ¾’ +(c„·äù_¡6ÙĆIù{s–Ðäyc€ëIyêËݦxíòrG#ñ9¿ÅS%í·Ù™¶”EHG4íÝBÂâ:,zìÉfEàÿmÄþe%"¤Ý•®=BþdC´Miœ‰Æ#*¢úaá ¾Õ÷÷ä]!C ؈+ù¬EìûKZwd^°NÔn½È"zd»€Š— á»d‘FQ—½ù¦L îÜCb~Wk\( +ÂÄðè Ö Y@jPYجòM´uoñÎmç0µÑµ& «JÌ2H@¬?*÷[èòòSh¿'‹ Ê|³¡-(??ïEP×\¢Ð´3ŠÁLÔzzõÿ„ÛfAŽ–Üå¡Ó4¦¾½".‘»ë®¶_1sçí  à ¤ÉÀúx¯Í;:Üì« +¾´5~vë J¦@Z¦dˆh¹ûG?6νRúrþ§ +€aI!²†Tý¨d_c}üpx!W8Ûó¦Þò¥K„½¼xQŽ,ê6^HÓ퉯lÀõQb­jC®I»ý™].Y"WÈIRý­®’-ÛŠEå{é%(é©rÑÛ™3„•Pðf™Ì¨4Å‚¡f)±‡Ð +Ø÷Ò§Ø& À~Ñ}ÏÀ‰pG*Hϧ×uÑh[üO·¢ŠæqnX ¾ÿûÞÃJ5¬HÞÛøº7'B[¼øÓ‰ X“. +ÈÄÐð£g¶ù©»ïù ɸy{3ã>Rñƒ.M§RÅOÇ0i ÞÒ#¸gS»È +#i…ÃÈïZÅEâTü¹…P=Ö÷;…¾KOnœ†FQ©2±ÝVœ¬ïÕÞb!ý—XŠ6Ü!ãF%˼î-üšm“Gƒ}k¹®9ÙrѺÆyhö¹&£ +ÔÝ Åü-ç)é…Á +Ôòë7xN¼ßÿûÏZÝÿ+Oôòùoñ¿ßÙ¹KÛ[/Œ¼s°‘Ú‚¸X“ýÚºn7Cx{ÎKÔ >¿EÉÊsR¾âVF"17-rzþ†‹¨²OûìÝ´»*ßc$‘$NÊùHè=3ƒ)‘ +_ç¦c[…"Ù#®+IÔÂK cE5+ÊÍeT´;™éôçJT~AEöJ0:ª ÊUáòŒP¶D:^$x†C;¶ÓYì<Ö>WX¨¼ôêï$1 ÓO8)ݛ瀶&3$¯DŒCôrîú§0ǯó£šA”»ƒcîï¿F¹”sPã½Óºˆ‹‚7vRèù*b$çÖÛ˜Ø>k/­=x¦kƒZ6ŠÖ©­³o&iº£´°.€UIÏÚ%w¥µ6v‘yº]B:½>#LJrsúïA.¼ŸÆz'œ-àUfLòÀÐO>àYƒ#Ázu#—>‚¨í‰ ÿ_‰XGÕ¨‹¦Ç=lßÓÌ몙³A,ýu ß +’?¤dÌϧt½T†tÐÃa˜­Ç„Â$Ÿ´GtÇBW`Ï®ôy %A°âhhø ªæÓƒBøÙ,¼ Öà!N#Ø›™ï{&"àá…àëûSÑã5¥‘o^Ds|ýŽÛF9ìQå'à/F\þ´µÖx’ AkàBOÇ®3@)ÏÞè‹ßçÆWƒ +9) +qžT±t®f‹ÜÛÖ¿9À¹œ#©JoìÛ7QuKÁ3¬ýJ*Gòn|ŽT§ÂÁ¸m+ê1 ´9mGl¦K¯}ëð®(®¯0 ¾Ê±§†V YógÄ·Cõ#ª‚Õþfíh€@Ú«Ê‘7* @A¨víƒ/E§)m;<ðó~4¾ëV“„fî\Ó{áEkîøÔš[úß×z½¯s ŒB€òö1¶ÔÕ–ˆ8)´qÒþ¢®Xù©þ=Hƒ9°¾},jŽçMÒô¨xÞ³R»‚~;} /?NG‰ˆœ,Ê|±¶ÀDˆsá@äÒIÕÛêÓ®7ÂB·®_­oœü!9ÓW†ñÈË<µêaQ×—D@eŒ¦€r!n"³è="å¨Pð?º´N5-O +ûL\‰þc +U(·mpH¨E+q©ÌŠÞìrùé»n [QÕÎ;L–!Å°ÊË!sRQ½öG8á_ÌÀþżs³`þuÜyñ ÖÜé+”øÛi5IJ†mBÍÒú¦‹²×ÈNå¼'EÃÛå¬Pü’Ë®²BjÛFY˜+5 î”$pž‰Ð¨âYõÀ›îH±ÉSÂe„ô…vòÐÞ9à"A½ÜŽÒcP‚05Ò¯±'7¹ƒg´¦Nöe°0=µôµ—;²w=Ñp|¹"F®#GÃENáµÝ; ñTŠ/ÙWJáñCÝI´¢^ +·Þd*(Ôš^h ›¢ðz Ô]ç™ÚÕÇÌìR5V"h³˜<† h„õ)¦j]$pIÕŠn²ZîDÍ-•MMÝîº/ÐXÍq’YÂX=ä²átuC¹‘åÌßÞ¡k6L„d¤ ˜M»õÓéëp© Ðotûüö óóŸñ%•`¢”-¾;=àœèD® ¿eOQð–æ¹¾cÛØ!Rb‚zä«©y]òT`}l R Iü>¸[¥ÓYøŽ¨êÆ”zà ãSÌëÃ[ JéËtzbQ@mì4Ö¥xEm>p+ºµuôØq^­€*vÀ_=R8îvó˜À9RÓ|²"ãC5¦î¾õ^ZTµ‡ºº¦ k©4ÕÝ-‡è¯Ó !¥8òŒ#œß@…*=CJ–‘ÍX›j4\ÜfhIÉKí²¦–pÐo¨Q#‹åÖEù*neÎÇÖ¦'Â%þ°}™+E˜‡—ž*/¼qD”WQ·îŠ!šÂí‘ÇQm¦ù*Øq‡µ)d‡=OW„‡>mŒÍpê´QrµlÚEñ s¿Ü®Ff%º70 iFd…„*ùšÚŽj[= Dß­ý&*·Z=ôœÊÆÖ´€b€U½ÖT ¯v÷Ê®Í΢6g/ +át„m5áÃß•pUX¯¾9.0Þ2*P—§±óµézÝ„’á䧆œx¦¦þeP=EÅ,Þ黀Z©Ÿ¿ß}EhÖ¬Ù•gú<ÏFb°Ò¯|ÒÅ ´±œ-ˆGyöõ°+´/ð‘ÛVÃu`†í­×M_˜3ˆÆ¯™˜§)‘ªÂko¦_¬ˆÓ¾ ÛÆçB3ò†ðâÏ;Q×ÙÄÀtVE#ÒS[O‡¡ý©ÂɾuFä®NÀ4g4ÕÝãF¶¯‚}ô´&¥äøHÔ<ö•îèÁá†SÙâçÆÂQUúxQ×]Ä=žË­'»Ã40,ø„i–^×n ®[·k®Q¾‡Ö§ñGÄ&žVסg6x‚F' ¨Q7Ƚ–Éu>Ûð €Z^Ú5kùü{òv¼.ÜŸ³~ói –®Ï^ö í}vK9`îKëï3Š=u€Mz‘*G㣬頒#‰WI<åQB¨ á<Ç˸†|†t m6yÖ[ÞÌSÈ »?F2,©™±üDÒZ"}¹ÙEì+±=CU¿°¹Üðß`¬0ÛÁ†Å:íÜÐ7ÿ¹|g-®!54£F4ÀõVŽ×¾˜­îY‰öÔ£Â-ìtNUSÁäÛ’ÁÛÛÉKD«³&¨Í"ýq>*³,·J·æ4ÛºA(hÿ0í¤Â¯y)R¬ÂÛ@ï+§—5ºÁÏéÇ]ö­¦q{ÇjfØQš»m¶ö’./~ è±öÖùÖ&#üПovc¤Äº9Éjì‚T^k>¼Ô +8óŠ7üdèϹ=b‡£˜ÏÊFªmÂv˜WN‹›†OI÷²X0,S·ñHµ ë|mÿÚÿZgA„Xì>É™1üUǵ7(H)úFž~WÛ©¶À—y,ûᨌ6W:ÙÛZتôŠ8# +s%æJ¢y궧!By‡iˆ”\{ÄýõB®Ú¤¯™TqïîTµöý×h]¿â’\í°ÏÐkÖeÖsÞ(NgÊ?·»Ä•ŽV¤î)¸ŸI”/CöârÛsmÙöŽDm «Õ‚* „§Åy®èâË )¶ñ‹9,`¼mÀmƒ›Šø~q/p¥f 58W$4¸lñ݆9QT«}:7vë)¡-c”Zôì ¯ÐûmÎÒÉS˜šNtÏ"«þGz}eS ¯ôªíVýÎÚו wU÷÷É´EÇûÞTj|Ò‘H+u/^¢ßîöè–)dÄßÓË_iïxÎ_ +út$5DÚâø¶òá±N°xÍt6]Ïxe?²J:@é!§5wÔ¬›MDuñ8» cŠúKgo*•8³m]³YâšÓù÷ôûVÅÁhóúúŒ|N6¸9ˆæ…æÆn³n¶óŒ±–®9u»æÜóË3Q‹/²Û31´1T±ÉFK¯Y=„ÔØH¶ðÆ¥8°Æ|ðëx ~œÿJz*Ö1Sþ±–Eî c²qîˆû±A{抷ƒ¡%5P£¿âU¨ë8Œb‹\v°kO‹*¢rãŠP Ú=Oı#žrâ7CQ…®ƒ-½%8tu^ðüÚ6p‚5*ðø(#]¨ªšæx•~¤ ÈŒ ȹ„vM–£«‰ú^žIð3m:¶{vÏÈšºè¬Û7¿‹¢-/§‘ êÈwfw† ¼©üqbÄß·ûê„)µîÈcš66 O¾ÿ …veœqì÷öº’©øgêé|0$šÝ.à8ÄÿW·Ý6m;Ý»Çä>•*á$¯ˆµ]™‰`KF„@E:®Žåsèoë•‚B?‘výêëë,xò€fv4µo`¨Ö±êa‚B½Qu*ÅЃç1_Øèï_Eä3dëôÓž¨yí(Ùàwø=`€#ñEÙ3’{ÏŸ5À\±2Ê×g8©¶ù-šRz–Òâ®qíe eíÛÇÊÉ”›À_ºÝŸ^Ê ÌW ‘ÊUœ§·íIžvÜã4Ïo~Hò¿Žxè»0©ÐÂÉ•Þ¢ª-B~Òz TtÛ,]8«›»¤ƒTº”Hø‘Þ4/´„{‹xÞÐø¹!nvßßœgÞ²­Rw²b(Y °á&ªÄ­æªå«°z‡½‰ð½3J¤ÅæÚH\OÙ|ì²y¶6*wù¾è„c|ŠþO³£öMDî] ]-Ý>ÎóHx§­}ìŒKû‰µtµ¨xŽ²^ª¡YU‰ÉGAÎ{|Ù¹¸gjÛŒ’T“Ä­£rÔö +Jm°‡à©#uT@1øŒñLjñÇñZhŽ˜Ôu„€ÏPò„e srhoôÌV†\ôÎ/0-ï‚rs¥¸†Ì‰àbÂ1Âù>‹*Þ0ÚšSÌÚ1ÀÎñ‘F¯p)¦…QС®ê}‰ð2¢îˆ«¾áZ€”€X}D©Ýô’;uªÔ­ XYa5Õøˆ(¥¢8ð ð?£z6ܵ¦nÒÉ ÄòωðŒE¬—_‚$8¿ävÉD!äTxueg/•Í‘yƒÀUÛ‘ˈ(0ù­ªÛõgC`cËi°Ôñˆ *bGa<Ò)Fò “Ùæ*–Ø /½2<ãÉ_WåJÖuQcL½}×7|(׎°$²ƒòä²3Ùq@0£œÑé¼>þ[ŽR²C ,£Ûº.žiT–뛈1‚$DNk>»Ÿ(…AG„AË.ÃWx6×Ïï\yjiù×ûÈîZeq‚¬Âð"ŸÑ'R·½ #›îø¬¤ñ t#ú˜ÞìKb×Ï{ÖÆðÞ¸þÐ`Ò‚dr·=6m’i¾žªß±g»óðû§‹wZÚY8¿9Í}=ì\ˆ#ÛYjLlg™%?#¾]#ߣXPb–2@GÅv÷¡—Jà¨bÓ8ê¶_ Û¤6^ÆkŒ¢ùy73Òb@Êœ¥Î-uøJ çáÒ#%—¾kF¼~ +6­•þz ô1de©íF¹§è^·ö ³{jo¼û0Y!ŸQš[Ö-É_‰>"þiW’œ½?>ÞΔUPz¸ƒ w/–Èè]ß@HiŒ³’ZÜ›n³?öJFµµ^øÌ+ªéox¢¹]6Ó„E‰¬Œ2;ó€M×÷>ÏŽVÒI,gÔ¹B›˜¬A¤x+1r^€*Œ°(K«y¦_ödmËDFZÇÛ—9¶ß© +hæ|G*ÆÕï+gß +ßhEW#tåTýÞˆ¨Ø]Ÿ~ )Oä£ExÎ BXUÚ¶'¾xê%MX¿)Ìxš=¢Èb<9"ûÔùïÅÄZQê«@ 3ËœGw \3Â.ƒ^FIàG +°°‡™€±S¼,‡§ÞÝ|`$+B¢çBVRìQ•\iJZ½ÝñæJ¹¹›XõØ´Bmìïb… /š³æJÁÙ*_U^OGŽÌºÅ§2;ÌxLkêí:j2þ¸·eÍ2Æön£ á4 7_ݺ©ãƸzµo?ηÕz!½‰ý¸U]/èèµ°Õç½K”ämÊ\çïžô£2'†êùú ºD’t:¸6çØÚnjÝ¿G`¨R¬ÃqžÂ{Ô8SÂ{šô› p +µ¸O+ÍX¶¾¿–i¡í¬KÞÞ:ð¸Ëk|ÊáÛ«xóñq8£>gêäÈhå®T¥ûÅóCh†O£ÐØz™]X@2ÌÍãdLÉ]“­4åN‚JYóøÅmΟT'KÕ%¹O·)L0IÞWŠOº‡TÙ›û£/úzRÿÆà[§›Ç.âèrD³Û,ìÜÈMJ«¶â‰¨z<ÎhD³ Hj8wŒ××u•©Ì ‚þÏMiVLæÚä*e„&U×`ˆ<tÅ+ïrwß¹ÞÇ€ôùº]C³eLSˆ¹Ï£ásyŽ£ZCÀBTK˳/ùq€¢$ÉîkÜ(bWÀnŠ~ÔÍLí *æf•âÑSâßxZuBýtŒ \j[¼¹CéH,4¡µÕŸnìF-í%!²¨¸v´ë¦—ŽmgÂ,|QúV†F×½û¾g,©@„Ñ€— T0·áÞÈD¼ëZþâ½.í›óÌ-‰äËÚ6Æ÷a‹#ög@yh­ì«ŸGñtD^“@Ñ1sËMAŸžsó©XÁjbɺ‡<íì†UuКk#0ž-õ–ú@ô%&yíÝu/9;AzÎú…˜±ñòlå3v¢)]AU +Á áÚ/#µ°\®hH¡œ>J>>I€ËÌÍt²¦€ßÀõ©µ ±íPf žògì²'Åy€ÙU­‚4ÍÅ"—÷œr~íŠBE‡ B ±MOå…¥ +_°:Q<èœuG(c>ûü\[“™¾G­©JË…ÎCeȽº½DíuÕ>«åá¤÷ƒü¾nÇ‚Ç‚ù¨†n ¬õsŠ¦;µ[F/MA5<õ³mÊæÄÑW”GtúѽÐ$†YU~Õoe\¼æ~ "ÒŒœÝõ›®SˆÎ4M8Ð5ÝM NÐk Ѭ‘“oò‹0GC ¹j&&è ãÀ@”K[ï,HA%Ý¥­ÀtyjëÊ‚¬TÞËgăh +cP¾¾9¥nùÒ$ÄêSsk_´‡} ÊyŸƒ¬ñ.ÏgˆH3»F +@ÕךÜ:Mt ÇÐ#˜v-™Tú~Þà9µ¾PEØ9±²äëÝÛÛñC÷£>nbSõê¿ »ûs‚üäÞÿ³üûåÉëÇ/)õþÃ߬8üÅ¿ùñßþë?±òãßþû?þñþø‹÷—ÿå¯ÿô§¿ýÇ¿ÿÝ_þ¯ßý§¿þ»¿ÿÝÏü‡ÿó»?þßý‡¿ù»?ýÇüãÿþ‡_]ô~ù7èÿÿ™ÿ‡¡Æ´ÐœºÖ"‹T³qšËýøI%{üHYYKáW¡‹8ØýÖl¡<×aË–¿þw’­oVÏq“ç|§90×ÔXF Åý m¸?ä ½‰ÏƒJ±)ßßmçeÅyÑ3ÑðvnÉ^÷.1¡Š¨©¼¨ùê/íIôÛïia³Ç.œ%dºEPS¼ïôZõ¶×ÌÈ~ç€2ûuó¦üDß“dX\Àºàú“òÖµ 2àÊÊJyÚ4rp›7{Ù™³GŒ¸A(λ@^½y$¢Ôë +êý@ÇCÇ“w…)RÓþœh^Äk÷ÄhZôt %˜T–â•HQk‹Ì¤Þ´'•Ì„•¼{ ô‚nÑ}ReÃËŠÚL凂µî½ÆeƒçV7‰E "üPzee,Ïæf²”n¸xê/âªøÔ)è‚n6M-I{Úá™o¢ÖÃûÁ‡nætq^œÓ¦ºŸŸ&f4‰æ”…k¾\øñìa"Rd½£\2~à«zªºÔ5ÿÃÑ oþ53o†èþ“‚ÿ +-Í +¾¯µM¸¿ÔÍ}0êϘþ:ØSfwx˜Qü$P€ýì¥àÕ­£Á1Æçàžx¡¿9ˆÛ§ßØ÷@õ¥VÙÍ`M5ÊVîìù‰êVʶBp;ÀýTÛb¨¾YšÎp1I[ÈùÐ9:ßã3÷SÛJ­Äßy{póSíÉ8ø;àçù¡„NZˆ(¼qŸöuYfÃY€>Å·R +ïùûHú_X¶žÔ>Fk±¨BýI "¤jc1¬¸CÑ"âGÕî¿û^<ÆDZC³|ʺÜÕãû!qeX~”㙉MzéÅìJ~Ú«í9ÐÕáã•e—Ú¯=' Ù§¼^tvW²8D&Vw1|é{kµæ ú€eÃÏdâ9·¤ê(d¸?°];Ê¡1ЪÖay8Ï(€Z4%ËO`'Æ>@Æ\‹eÞ1JÔÿÈ@ÛŠŠ¢ï Bõ‹°õ§°ˆ˜ßQ…ª´¤åQòþü;g$W¿9xêµ ¦¸µ_KPü a2f-Âó¾ì… T ×z|j=š½Ô÷vAl®hß/O÷.?EGk½›DÑa¥õx«¸œ<¨P»FÚ)òuí±º„Ø<לô’×zŒ +«c, °=FÏg +,A²#žÒ÷ͱÆ|-(ùvb§´@ˆNÕV}D#n5hÄ*Ÿ¸E Ac][¶¥@Ô¼LßÖZRgÒ1`E]Œh"VZÊ•F—RIZ"€¨Aõ›ˆÚïD¬-§È,¥±s%8°ÜÅŠø<{´Èñèòe ÎmÞsãéT9 ç–n XK¯m-©nP™!/§­†äÀ~ÛØœDyN<—¢É7Û:èÝèW¬·O…Ú²]×ÄN ñÔa%Nm/ü|aÝŸiKåÁ^:{>„à€B? ØPß¾–Gc᲎Ãg˪Î~¦*ùºÅ@b*†+‚lɾ°aFG‡ˆŠBÌ€@±M]hÐ@ëŽÔerŠ;,Œ}!Ëåˆ,»#¢"&ø@ÜdÝaJxa?FNXgŽõŒãøùycšZâ§+ ‘¨{)+I³ž?ì(D.Øû 6 0z{TáQxÇ7*GlÝËfÄh.ñÞ€“:ètìÅ—(šo õMÖª‚¯õlvϳ>"ú‚I¹#ô0ZÃŒ“½î•n ^‰Î Wºv£©è9·b ÿÐ4«ÎñHtt´ ¡@öi5ß#¹òšÍ ˜âJCëßD¸Š·Tcåíà‰„¿ZWäCðb;»†{¥³Zà´Ö¼íc±D˜† +Oú'CÝ">d‘€¿»(±È¯çx¢WÏ@àïìgøûظx +T><ˆE<1ܦÄD²êÚL8ô­w†¿ÃB󫱸ð†=ºÀhR´\§¸¡:kÄ*|qç5Çžb §¦RO w²ÎŒíªÏ…ltý1±±8âY[¥-‘ñ‹ä“áVìÓ=ëFS3¡fQ…Â0.ð1ƒGÇ¢R[ù<àOC¿|Îσl[aƒ£ë~½:(_ð=~nÐëoCñ7îCl–ztرžGK2²º,ø/éruâE±Ï¢tzüc•‰ï§]DþÞö‡¢ë}bãtýˆDt¬¶ª•mj}âß×s0æk¨f­T餖õ£X¤±¢]ž­)ä%[SYÐmyoApò‹f•‡S¿¨¹[’X™­©úu@f,šå-‡§{¼£ŒÚílzƒ.ì@)¥MptM¾¦ÆâßðU<R…åã {A½~‘;з Öèøú;R–úÛBވ⯃pwh¬—žÍ…K$;w}x×ÚÐ~Üd¡%²P ïžhf{a+w¦>½Ä ë-¹ñ0¨ßï÷ã¹UÛ`v»¼„õãØ*ÂŒÒßf['w×5âKÿ6b¦AÒ+Òû‘|D!µ)Æj ¬ûÌ·½­ï4x!ÑÌ·ÆÐÖÄC© EX½ø›|S\è1£S‡ÛÙ¿ŽHòÐ’<·‡&ÖNLÇ]‡³º¾ìÀµK'7î3Úbt·¼w´ÆSæ^Û‘µ±¿e×°F­ÓÐû„Zq™c3Ñ‘«$¹¥b!œÖêã*¦S˜Ì®-ÀZv†zúÚ'¼dàΊmDl‹²;¯¶2u¿:1žöþõ)X¦…tÛn¡Æ¹Ã +“´ž(wï:ó½óoª?@_> ¶òÕžy»–Ïþ 0ULŸÓµÈMÔ8±÷â]àSš‰{ <»†z•àÛé\qÄCA9O×¹öiY~¯,‚j*ŠÈ‚^ü{Ó!N‹ÉÜÞëÞ=W8lâà³F(Æß~‘ ‡Ç…T×E‡4&ZYèä³2—¯jó”׃K×Af>³T©üû©IÆ_8•nÔ†§Ö×#xº›JNéÂFýë‡>òçnß'jçžÌ¶+–ST]raëê4hu`Ëì^”bܺ¹lÔ +ƒmLß²Íó /Z“jÓJ­Öš†ðc ‡,."ï˜6Å7'0$ 0#IB Ù'—¯WPÏÒ¨6ëéupRxÂSñ@dñ‡da±=gªé˜:Ñh)TPŽ *Zé+½¹(’¥€J£Ý[DŽwGßÓâiz°{8~ž0Z(¢ä4ÁôȃZn&lðЪ0Bv"µ&›óI‰q©]³ +QövˆŠ,×ÛjWסãò©üà.IB²aÙ, +ò"¯ç‰vÆHhE ÷ºÒ iKß’|ŸâÇOmñ0+»üwWOC}[• ÂÉÝI*>¯kÞ€LtÎE0à;Z/Ü€ –~e9-eÒƒ£”SÙÛAÝ #9C#nÔ2ªú ûJvLŽò³jî`ˆD£{«‚8d5Š ²s«n›kÕ)΃C¸¥JôÏkù$|~FœiÞïÉÿ… œx»5ŽëâÔÍŠ·H!ôzEH¹°f•:)…*«ÿ‘g éW[óíoÎãá=cZm1!ÊÀ:Nò÷o·Å«ù!Í~FÑ‚£XÞĬï[“Óâ±fÃfŽR¶01:Œ ÍŠ¡³f¡n=¿žÉEÿá +ÇAy÷ªiÂJܨՀÚì%à¢&'šãÑî#f3Œ ¥!Ê`E1ÕæÛ¸ðÐÀ'ªN©Ø á ‘AJ·œï[™Ô3…2"¤¢uß/I“ãaPe™‹¶ ˆª”Ä¥sùi3QJ-QH;Zd »çY)¯o‘„óÇÜ­~FäÙ¼g<çÅ"Eð«EÏs‹x!ÚÅð#ÂQзc÷ëMºzL9…ý…g¾ð½%)$o# LA6( Zc²¢Þ~¿!Lv)06eêÿ< Ha.z5 (×uýQ<ä…hà†©ÒwP‚˜¡s_‚]ËbXäwYH–aßpgü Pi²m¥ÉmòDƒKO¹1vR4‘iôƒ·>úóÀ/Àû´òn•;ŒR¥Ž<¡¢KÐúóa!ŸˆOºTQ¢;‰ÀBLj(-6ä¿®”Õ•öÆIá{jÌÍœ|{žžš¡G VvE¸ýðJlJ!Ëʇ'â’ËÒinî×…•‹t~Ý©sÄ^¦F–n +ZÊàÂ70hûÈVzÕßDÔ+Œ&hTõùIQ |Õç2ºœz¥…h»«¸üù·õ¦Éx-EåÇÏ¿ßYV¥FÀV‚²øGÔ‰¨²a}+¬±•]sñë€ÎëOK~ÿ©ÞȬ ÄKê€y7f•÷õÌäN2~ˆo¯)£CRõ6>O‚FÂï6)(1°E 4ä"bÚrí›×só]‚¨éDC<²?ˆ"ûÃ6È +•³Ä]1@¢ì_2‚KoœCÞêŠÀ ‹ˆ2ž{MSñÜm'åƒä,¡J¼¿ðÉ^~®¯+&]ÂÐP`hZÁ¿“‰Ð[уV&§èÊ´ì9C+ „–t÷.Íöü5,k#¦×ŒïqpO×fb’Ï}D€Sö¶0òû³n¼G)N ¢ó@ýÔùN¥ã¤ûzDR¯ˆ¤Žu7o;ä×çG”8§ùyð‚bwŪyj:e¨6À‡†Í£îÍ%þ)ÁþÏ ‹¾5¨e™¬OMàòcAä& å]hÁ9;Éö˜»0¥k ½sÔl.ÆŒ8ÁšÙ˜É¬ÿ»›Â#£÷cƒNu‰(ˆÒ±$,ëg~ýý <¶®¬óÜ÷ë ˆxˆˆ â))èì›rô²ÌÉ[ýÃlç „ü©B²Ðó‚¿ G¶ú3Öd8·F®ü6×þ½¨5Ó~„"'ÏÙ¦ƒHIãBþ)Æåô@ôë™}ŽÜ­‡´î¦×ȧ6wÒg™yGõRV(w–í°Ñõ ·×ú‹´n—¿ñ×ßD­F_Ðs‡Ð±ïþìöÅ!™o±(éQÕ[£¼ùÊfÉÞ—/ž»ºRF’}GT ‚éãà_åRkΔi—¯Ð +Z¯Õ —”g=Tþ:Ð1Ñ6ig÷¯ƒãˆ0—j×ë +4üCeƒÍÀÍöùÑ ûÐ(dÓ€*›†1Žó›óô+€š‡˜lêh]¬Ÿ Éð3â}ùHõñ= +dÑÒhšó”n:Ò¶j¡„¼C‡¬Ga;ÉaS Í´$PØYDŸ¤hjÉàÀJQt±²=„?·õNØö»Q<¡â +ÃÇ%6óIA >Í~SìS°QF§LÙ9öÓSL'ˆ &°ðSǨ„ ¿ö®òþûîA’“S%¦‰+köÂĆÖî‚”Ñ׆µäµ8’Ö†ïMÃʃ´G¯u¹s~F¤~d+ZÅÇy4?æa`¡îŽqlóÜuã. ·ß#ð¦“I«ùaô~õ¨EåRåµ+b –mTpqzÆUgýõUisl×eü[Äì-L•-1ƒp©ž°7›GôÂX j8ò +ˆQA Uõ›ð­è%ió“â(çð—äÂ-v†ñ ®«tO‡ÎÞ'ð€?ì(a'DØ­ç*ÛwêÛ”äpjœáµT'G^¼&J®®­ ůº¥ +°®x2Y ‚Ä& d+š C^k\:¨»éšÍbG¦{Öè\·¼Ò«ÎÜ)»`AZö›ÇÆÂåÖe¸¹{f¯µ‡ùÿY{»U]–,=ï +tëPÖÁvFÆoÚcml|bë¨iJmXj!·|÷Žçy#¿Uµæì* +ŠÂVï•cfæ—1bŒ÷çÂŽÛž Ânôd,¦²âe°BŠ6 ’iĨTÑŸã;çFëúy%xDÕûH^¡ ÍbÊDL•„ŸqŸB¯è*®;6jE¹Ò›Ä©Ä=Hå<Ù¶Ö—­ùfú´Ë~)ñé ÚGVnê£È˜ƒæôn#•Â`ã"ÓE§(^hÎtøh3øbû6"õ1´JÀÛ¸ŠXDV+qá?ý3ÒE®l5ªþMæÍ5±5Š| ø´VÅi©Xa#SÒ…@T£h¬{Éþ×ùæQ€í%^ e1áÙݵ[Ü;©+o Aúétö£Wz2¼Ø…MŸC¦o*)A¤Zª°Ä£sÍO¢…xiñø$_áN!¢ß‡–EÃçEÙÒ,G hâk€-Ž½2lY´½E:oÿΑ¶Sý]²r¨¤ óih¶¨…¼ +ê#«…o< ”{¡:¾SQ°h^‰^4W’#\‘C´kàySb–0 Xô·aÎö&¦·À±^×>ÈêbfÁH@˜]MÝpÖ ÅA®ÀÖéùš{ÅŸ ¯ÄrfÓ‡žµš'~ªÍ°8 $C‰Ç6|¡²ÓUíZÚ*£…q/eo{±4Ÿ,á]§U£t-˜¿Z°Éw¥b!Fg†aDDÿÊÈÇ^uŠÒHµîý­GؽŒ²ï{?ø*6¤{ûalá c«`íx_ýZ/¥K:: ­–SØŒU6Þr„æšCåœ|+ôº$•ÁšüùÝt·¤œÏFÑubÏÅ*"½Àä£|ØÎúÍ0D¨ 9®ÐϱuVƒ­“µ6•‰ØÍOó!·:¢dÉH®™$Gåh8ß»Pž|ý ’ßÄH35š~'ñq}45ºSºÐ¬¤0}¬ì8þ|ö¦ußJp˜ž{’ý«<Ä) ð ðþ:4Û×Iü*žºZî--x^6sä&Ïá‚??“+ƒ)\=m®ÄŽªò,%ÇAáx”ºýö …+¬µD<—Øt€Zw"L7 ÷[¡:ìÎ +tf¢ +¿AÏ-õs¥g-mÛa9Ïs6>÷Z]“¾–ó.J˜Ô5GO^.®ºÑ‘±2¥qF£uÔ + fàS ¼]g€s5#Å §PQ`=Ý}ZŸ÷lÓŽa…Œƒ½ÁXog§6ÒÊe‡¢LŽ e¸jHŠ¥Œòâϵ¬Ê“‹>!ÊY&·¹ø+Y&™äñŽ²lË(? 3î¢gþ+hÌ—PsªÆ¿8z1±'P"¨…悶lo’s¡šw.¨··¥¨§ÅeZÑ²å ƒÁËÆGcô›ð\ˆæ¹ë:BnªšÝ{I=X'6¹tMwÈˤ&õ.Ö `ën[ZµEñc]Šÿù;ùýoømPî5{mÜÔ(e™ùÏ98PeVÀTD…r§…# °ø+°š7½;"‘SŒ‹ÎfU>cˆö’ó¬èpPËí[7ùÛ¿RàÄ(Y†à(©H¡–ÇÇ… Ô ,£ää®vèÓ ŒM8®ö¿éÓ€»¯£ô¯ìΦêÑiYA×D”’LQÊÇ¢fÕœ…ÄäÙ÷Hÿ²&!¼’ÆtÝ_†ÿ5²¤üu(%ÿýX]*¯í¤MÆÙ÷œV¼e?þs¶[ºͳ}ðB—›`PµÙ(±ÙÀÄžÀÂÒÍGi¶XñeX^è©“àøœ°l†Öf‘WÛßkN>D‘…Bš4¯""3éûôZMávÏ‘~ȳž‘' Q.`e™wö¤…n¡Âìç›ÈžþËÈnÏSé^X_«ÆÉÌi=½…=Vº- vÜ©*ÌkÀ˜î}P»j±jtjÄn>ow¬@zœt†i}:ë%§€E˜€1[-Ê«ƒÁaOƒÙ°è¼ÙÒ1 T¶ßŸ„8W•R]øAÑàÇL¹œ…Ÿ_ËÅN±! ÏO…ŠQ¶'Ÿ=m´ì0—Pßïõô6¯n_ +÷§ õêyìÔO5DçÙƒòðö S¿1‚ûBÒo”D€©zÔÃnŸ éó;[l¤Ü.2]°]»J¥"ÚùI4v½«xúñSYU Îí=?Ž¥#½T£¹gCOJÞ ãDˆ4¶U8 émÀ…i*ykÔôÄYQî.h’¾=.*—ýÓM?R¼ªÅÎMWvºÑ]åUüŸGý´öÞ‰Ó–+†•ÂÞàñ±ßfÌ*Ë€GªÚíìÈ-t<‘ +|žÓ¹¯×æ·£ÓF¿¯Õ³6ŠQû3çÛÓ +úÖÕúÇ"‘°Kƒˆ’~SPP8Lé¤ûé †þSÍ}2 káûÒÏ8%òòÚÐï\´½ô`Jã¸Ò’  7±?Hß¾z/JQFW2†6ëèhÞVkÚ‹X¼å¯$9ö™à¨žl–À*ìõm!ÌHÝ\+fdÃþ–ý}\‚ñƒMAÁùœúÐñ· ‰CïL—‹³—„<ž8_Ü!5ßòœøo˜‰”ifñ@iG²LEeš]b½8K4ÑÅ£ô±÷÷Ðýƒ«{oÿêzû·L¸‘@J +eÖ{Ù’1Ó³¨7 +Ð5j˜*…A¹ùžÐMO/$¯QŠØóêYšµŒÃ½ž"ïAMxÇD}6•ÊC˜ÃÉ(RXË!WR½Ùã‡jÎs@mK¸[‡¾ïÔsŸƒÞÃ>¼žt;ï4e¼ µG-Y—8ÆÞpݯó1™ŠS³íÊBÛ}~ðõ[6¿†˜ZfÝ`$’XÝÆç*#•!䥾¨qvMhoù‹†`û­™]òõ/ù«ìË>ºR)hûv* +tyÿû¸fˆQ<@Õ‡¸ày@¥WDh_á vI+DT‡8óG¢a½¹²cõâ5F9pK‘ÝËî{6ØU¼Å«ü{½éê÷¡†ÙB†¢Ø_¡¶Ì*~à¦BËŠ +;*Zl…mzì'ÀÍ mRÞ_ØŒr7âªTXãdþï½8 /9#b~ÄY®W P†¾Yie9ú€¯vú/”‡¯à`qLš«J œ²‹®­¬M™=yö÷ÑWµ¶Çý¥|ÇΊ˜-©ÂYØçþ÷¸´©,)Fj1°L}©ŸÃ gU65F${5£ÐD½DC*r¨žïA‚š 5Á[°chµˆÂü©ˆ¨¾ e‹ýå>8SRsâfN×^ŸÐ£Wo¢B0{´ßÙ)—ÑÚsªW5‡-3]™êb3#ézÖœú¸°ë î_ÏÁ.r–q9†•¥€m)¨£„‚zŒcÐ誽´uvè`Z±¸ÎÄJÌ'8î¶ïx&àŽùyÅìΚ%é¾Ð¬¼R¨°æŽY%å)vO+%N>ùuug>EyîÓ¼¢˜® +­b ŠòøÖéå¬ïÕMq¡ÂšˆÔ…²öT¡6Þi#Ž«†ÚÂr`FÊÝÜ©‹|ÈéÖÑ]DP—ßPקՈpÁ•¿Š"x*Vjp1„n?Þ³µÓÿOÉ”U§ó'pru:ö'Ķ ‹€¾Öëòµ0XV@7CKê¢V(†¶pÞ€`ó£ц+¢®F;dp4Õ^_Ô+à1R±K u,^ò…ùï”êêÒ¥¥°ò™Ó|ä33qº(<Ác[W²Pïiç£ÓÉ2 kqÁ7ÌþØ2üCÊ|õª-;P5”R¼Á­kÒjf€£bžB~¥ûwÇ‚*ÞT{)®‡ÔÐsä…у€'×c2ý&êSÌjT`ê~^4œ.àá²×© ”êO²ÎÌœu ¾AåPoa˺DQÓ/Øàžfsle¥dä…>Î,Ú~Ô“¸ö—4’=c“øË×|tfBï+xP–Jð “<ïÔÁ÷Ï[¹ÝÏ·ì真=`j­ël)G„xÙ4Eût›X BükÃ)ŠÝryâ- +àè_NÍ@´ö¾¦Ôp‡`<Üû÷Â¥½/¤í +n;ʧº1?ä>?©„£,€pÕn ä»(=´mwsž÷U+šd@"^^ìþSë1‰ÐW«¡mñót%vÔ8¸­¥¿ç¥^NóEÃòc&±ÍÛÞZîà@„GÓ™“ˆ‘{dåø\h z½˜‚+ J•Dñ%‰À ©aSç Jìl1ŒØ +¿³ÓœÂ¹›ŠZÎ…È"x0C‰Wy¼Ñj-Sâ†R/‚sa~ö•Éá•¡ê7t³DYÜîwm&ŠÜ@á%¼çAéîíc5—u o£îëo÷‡§[ý¤‘4³ÁNê!#t¶àEó–ÙÆî5Ê:¶­/å§È¤°½+n؆³kü¸xz^h$0WICTè‚wËÔ>)6¹¨dLJµkÏMòíߪ» +휑<°«©‘ÈõMÕÌ=wìUq¤fc¦Î£9Ôh7~°›¬\j<ý\ÍWŠšÑë-½XLMª¤þŸ'¡”8rð;Üáš['@Ÿ%•(`8DÝÎÄõì2L5#x#Š:ð5!ø «æJÕÕ”~Ï•°>´÷JÁ1kL=e åb(Õ! ÇþÕIßÀÛóô&£4´#¦ÏØÕ¨T¸ŸE}9œ{nbDÛvö =3Òá¹ÒÂ(aéÖ鎠ÉèfD?íQË3ÚðwĻܻ¬ëpJ¦-t?爟­’ÀPöD¸D»žb÷¸¬“¢ì¾{ï!«Â´÷A'C(æ"ÀŒ<#ƒ8‰¨ÂläT×ˉÙÍ +ªS!hëi +ë(_±ŽÝ›k1Oý @®à`^1nËhȶ£øòÀC² ˜ +e ®hVÝ=§qI+Põ­‰<,iÀPôÒÁlìã(äˆGWöæÚ{»Wžì +ÜÅ1’ú:}õ£# +‘ñiCœAøÉú‚ª=Mjµ©” Ý»»ó¾RT­@;ÊÑ)5C0sÚkU›ç<ºæþ[y³èy]° ü#œ®’Ìò=º1®«8iy답œ}׸bFlÕµâ5"¬ú(P…Êt.V7-,ï·lRWjl+‘- = u¡û×s±g*£5…'3a> +ä E¤©«Îv\ét‘ØV`®¯ðÇ:xß~£»gEÌ*íÒÕ¦h.²Ló1#ƒIÑì…[FSÖ©ŒÓL¡î ¥Ï•„`Ýx-Ï80 S®=¥0ýØ6ɉ~D—ÉФjÙÞt¥ÛŠ\ni[ýý ¸`¤Jæ#FýnI§Žlx{d t!B2|踥kdzÃÌ°Ãî¤Ð»“‘ýBw¥wCUD¤‰ ©àñS÷€@:öcaYçÞ4·mñDŠÄÂØóEÚÖ¨?Yà•?¹|DñãËuAÇ„¬ÔXkĉ9‰qÙÏoç@/€= +¡–Q_¥ç(ÒîŬ·ƒYµÕ7ÙÔv˦ÑFÆbÆÝèN#S ÌZ6ª&pƒî“ƒEøö ÆWÅžöi·ÊÁ˜0Pârä$Ãê¬#;¦“^x€ó:°æŠyÎø\@ Êåñ’ZzI]‡ùÖ`,×ü»6±´ÿk‰äñE÷ Íhû¡³¸ÄG$}¹ØÕýn¨ RÝBÑF|ºUsLUùBÙ´Ýc¶£ÒÝz`)÷‹ÈǺZ”Ý÷µò|1ÊdD` ït+oÉ-=H€æn]ñøéI}Ê Îù¯#›-:¶…!J³ÏjÓ/ºÂ–ÀèSñ=^Ó~6¿Ì…q§µU. +Ó1Å¢}ÝäCÖ!*ǘè8¶¿û7¡‘¨@‹=Û8îõdŽ]·ÝãzDôöB‹°¾§¡q³›éL¬0Nv°·yG´y¿@*‡PS hxiÍèˆG“\µŸ¯É'ê"·l}àÌ4={Ž’3Ëþž?ÊqÑT~–\kžzë»Ù¤Lr›e*‡K[m[¾˜«  hRnjÍ*ÁNÒds^UΣV”íÚÙÒGw·Å2y!µ'ÛqP†¿ b‹RK6É ™(ZĬ{)YOôôÜñí£ äâ÷êªùð轉å¤A;®P1öS£fêa¶Ñ%¢8Ѧœ3}÷×äèÔgݞΖU¾ô…®Ë¾Ð¨$®á2ªi-–s–ml úÎÎWêϨJ]™hÕ¬QÎ-j^ÐÀÎg„«‚¥HýèâTùâ篲*½vózúJ +âªFG! Â!Ì¡È;¡V˜‚I<Á¡íÝËñ:(l °¯“v±F®Íe›†ìÌÉêgMO[1Ä¥¶1–PúlˆÑ@ì$>9ûd +>Pq8¢¸·‹j¨vûÖ»¼°•B5go¥þUäÑßÞôïþUoпòDÁœ3ÿ+þï;ŸLQ+”`ÎT>Iáê¬Èص—ãYs†¹gG- +Ù_¢|X‚Ï))_£Ò~¸¾óSÓÉ.ÜÞ»Óä’cˆ £ûŠ‰1 +«ûg†Y­{uËà'nJT­"Fé³Y,Ý“¡Ðéz×;-¸> ô‰Ë½*™hV£î¨å’™NÏS›š EK˜Æˆ¢bwgí)¤Óάûõí¥f“ö¹M°·’â%«¡®m2UK3”¯ï#ô(DõjÍêpC€^˜8¼5‚uÌ—ÐÊ{ŽN)"&îfš}\ 7B•r`4nEIra¬0_Né"0x/ÛNw v‹¿DM*n|µèÂp V‚TùÄÊ­™È×¹Ë?ÏŒ"JÄYÇ1•éT ¢îðl{Á×àÿòó1gžIÏrf5öø§Ó˜YŸ•( >8gºëºŽ0ß$Q á#iø™ÙÀg^¢¦\»’ ã 5è™´Æç¡©Šð¹@~É„^nl?LŸ9&å‚–[ÉjÙb„5Ñ}ª‰|¶¼8 Ò9¾!ºÍ¬ w ˆU€û9Ë €KwÝG¢‹/k‹ï8›ð?‰ðÍt…ÉJŽo¢n‹žÓO³ÏóÒì‹{ËþM„Ï=b Ï•¾D]+‹v#í¿£¥·—*°YCý5A,MôÕm~²sèz=Ÿù .¨/¤jÖýU‰è~æú|¢nlIk¿(‹HMû*þ4yRR_ÊVC\¯Ë&I­‰ðšîü¹²«‡»Vp¢ŒŒÍV³9Û4™´‚h|\?µ=¼Mïs½¸—^€m…›Ù&ß2M{U2$85Žú‚åZ.@ÂËÞÖSg”çïƒQ¢©ôé)7VëÞ€^|~=žÚžÚAV}uÝ…JøÐÎœ~뉉Ž¬)l‘ªæ%õDÔÑ_ÿW­Ž¿³OðXêаÄ<ÝF"Rñtý5âÛ!ù% +ÚkÕ _ŠÇáÇF »{©Z“ I´ølºŸ7ÍÏ£`‘Œb8­ô,N— ±O &3…Ð×:RÈÚ3Ý,`ìëaÿfEêu–ÑÑ\&­Æ\e ¿ºS¡œû~1]\Ï›5•ÿ)hqo‚yýVYíÁo¨‰;ÈÌ@‡çuH9ã |©æûr +–€ç—ëI@È—ä)¿ 9†Xÿ(,ÁÒ­“Ýÿ;$j× ÝýkDjA‡ôŠ·tùöÛS|=».!Ýpà÷Âד ò^‚šÎ:’·—,‚N,£€‘ò‰àIUÉ…6ÿîŒZí'˜§hº‚À} HK Û—éy"Q9ÝœæYÉ/vÃ3àæ]çÚ^;ÁzæthyQ£]þ¦;n eУuJÑ @½Õ:]`Cã¼*S¥³áh@ç׈ì‹úi€Ö»ëükéI“ É"57j0\÷DvÅ2ðÐÕ î±²OÑæ‡}zõúÓ¤Ež8QûµOGuékg†v‰‰py¿À…Í\): ÉÎy(¹GDùpû©Rœ¦TŒÜG4*Šiu¸¡Z¸y=9O»Aú5š?¼s%ÈÂDФøÙøJ» iE˜Š¯¢ÇãÀ*Ðpù2>¨¯ŸŠW¥G#ûÛNÓ£,±W‚f2ãÄ—÷ ,Kp]E0Ó#µ…Òçñ Ieuo K¡»¦.×Î/Âw®`évÚÎ ¼Ê +¸1j`6| +"Ì7` Q„§b´GÝaYÇt&o„mïר¢÷ç@¯Í(ɦw*çpúXaC©jö Íí¾CÜ(1ƒîël¦J®S”Ùm &aM´ð€5©D*ªtOü¬£ Ž’tš_ Oð‹ž‚ÇákÑŠ2‚lß$B‰ó\¨éGAOLÌ8¸äN¹w6­*Ÿ°C!;ú[nŒÚ‘à¨#˜ýZѸý–cýtØc¬÷»yÒ:½dØ{xöcÍ»ËBJMšÕyÎAW3x¯ûü®®3"}Jºs:t£º3ºKwþbÕS5sçé0¶9‹­Ã€À…z7¾;®«¬€°ñî¾ÑMJufK÷²úyHü@„§CÖË+ŽQ#˜RاgÓžøuWM’H/AÂM`×Ká_`9]ÁaG=a;V ¤{œJÇg'¦•’œÕ+†X±ä+¯LbO‚@²Ê9 LõJJPàšêY5ö@b ÜÑ´/^í7r h?)+ëÞRroŠ‡hf'¼â€–“‘… T Ù¢â}1}Ü +R/óÛœ h÷¼ÿŽ–K– §æäAÁÀ Õ¨Ãí­ÇÝè¦È5-9í‡<…¨¬÷?í“!§=?`³–œ€ýv€î}à-@Csò>†Ïüx6‘ñS|/k<¶F?Ê=•¬ä†uy—ƒ³ù“ÜÒÇé׃ãŠH7?ˆ×ž(Þ,90ŽL>“óOdOU`>µå½g…‡)À~ oeìéc ض›y189ƒ’€.8ØVŠ`NC žÓ+ŽÍ¢$WÚ7øÖÜ.°¦zŸMòŸF©s>£s¾G=—h‹WÄjXAé!÷Z&ÍúõÀy»ÓÉâ׃ªJÔ rÌñº`% ‡™D®çðsöÏ<ÐAÅ|Oˆ%çºÁjíbÕw¤_a„î縿¦ø`æ_E'ñœÏÆ +¦“Š×å:KȹíOO#D²Çr…çÁ´æèÝ1d<ëõ¾È} Q5_ dþ5B(–@½è—\¥‹¿> rÀ·|á[¸S z¦‘g ³Òkï=I:îªëÜn +’8U·Ÿ©|òŒ¯ý UÕJ2a¬³dѲÜß8Ä hã_øÀ¯ßü•&•ézFsÏŒð÷ß•ràÖP;îÌçR%7$!€ðs²uüC×Ù¹ã³B.þ-F_¼c÷FRn¢+º¾ùsÊZJ›RÚ¹M_”}Ö¯ÇM¦K4ï1¥ü”ÆžívL‹>}¤dæÎ-ïܯÞÈÑ¥J«hðn0¢Á›RÕ_øLØ6~w0‚gÏYXÛ•…u'°£L©søw¯*!R‰ÔXžò»øolvà=‰ˆ÷ˆ¿»¡TÉ_ ±(šÿúW-7UNê 9÷ñ¦äˆs 6ƒþH`MjÛ=2À>»[p—Êc“uy/ó&0û9í•p/‰ë ;ÜçÀ1¨ïÇúïËA:ïæAáëî]Éb3ñó@ „¯ ös&ÁÏÁ†(" â;¨ ¸‡¶€º š®ja7<Hh¨êÎ7ìdÄA R¨]ü•@ž°ÿ<@çJÉ^ªªVôCËõ ‰·%Ä£øVöã€Ù:Nô¬¢æçóWŒ³­D}ò,Kül“44ê1WÛ/€ý£I¤hª6‹oˆ@rà d%lg +ó$ƒŸƒ +¡õ¡Qµ[Âüú« +×Êëyþwx ’ƒj30Ô ™ËÌlß„‹8 ¶ô«…0Ï’’ò{f™õ¾ìȧ•BmO×qGwk݈ïv¿ +¤S½_üáí; Ý6û´¯QÐüÂ'Ä$E‘|œâ8ù8L_#¾›¹¿Dݶj˜‘:ŒÃŽŒùŽ¢[n\²å–®>ú¡”ÀǹÏÃÄ›Žÿï§8{J¦5Œ9`Ñœ†í*m‰Šâƒ˜qÄÜ¡öi%•’>Ü‘…·ÈÆÒ#1*ÀÙ^Çl”„Ÿ‰ +Y{öžø&"‚ûR¾ø—³CΖ~­ÞÊó͟𤋮ÍÃM¡¦¡² (Ê‚zý·‚˹wëlÃdª§ÄÞ^Ë£ê‰*o”u‚_êœGÈÍ%t8óDh…^*š+%¢}D`ã›+g´>˜ ¤e^¡e‚(7€1Õéh<ÄIÑ|óNd·p3ÁöŒùù½ŽÖÔª4ŠnAÞ!3›gyýÖåzï}<•ô‘²CB çÆ£q õ1Dôë8êmÓ÷è,)qJ“Õ´ÛTø”çöˆ¹QOÖ<œÖu ÁÿÏ!ae¼_C;æÊQã0¢¬O[¨…¢ç7$¥£(ËâyX(÷y.›–ÏÁ  à~Ç­¯ûs¥–ÄÎéTûДýo„ó]„ú9¬–4•¼kx}ä±±H¼+Lfœ—k~ +OòÖcú©1ÅuÍÙeñ¡·¡9ú<‡½½êÞuï2/ƒçƒP6°vû‘5ÅSdb_©µjv?ŠQ_#ö¥·….Ó|ËÍFÍ%–áÔ×*‡Ÿl\§‘pkãXÖŒÒpmcò¡DÓá,4ô30×kõ£õ/½U&ÔÌò³ûŠµšû°mt¸`díÞ_i? +àc/ÁfØÛ …ìeƶ4<úq™(”Y£E¡¢1¯Ó=wK‘ú>e$"èÎ’XÕó—â´ðt?Éæ¨QTØßQQ8Ï›`¼Ü±ýk«];âfDM*tø„9CŒsˆ‡4ª*Æžß‘óÏ•zx¢àŽ—è«úú—[&é!ÌZ’¬¹0ЖÙs¾qÈ’–qT²¾K÷MpøÎl>¤^½ã>ïêoTOT#"št©›Œ;Ç*A 5%‰Ö@B_ ÞTïÄúóü¼’;eÚjRè¸v-P`_ Þù)jÊìÚ@Ftèøñ%Aý)(S>¯Gt>jÚ•½UPæ¹=¿6¶ÐE*PÑ[„"¾--[PÏ×SSDñÑL² ŽÜQ…óª~9$<«/TXÏkn+.¥|‰Àƒ´ +ß»'¡`ù÷`‘ëYÀiàiŸ¿AêD 3ÚÙë’G0ô¾D0þIàªdµ—ëùkXª X’ÓRò´§FS¦¨‘TŽ† +¬jÉ·JG5m&¨#÷y³g¤ÈÂy¾9c#E‚^KŽT»ü«o~±‘ýŒ¤?B‰¯(‹¬^ª-XJ B·sÅIÔ]l3ûåEÃñÐî{?߈&´ÌAó z©$¦Ú¶úâÔwæ[!,dÛ¡h½È;þÍ\fÇÃÎAÚ´ûtó’à~ë àM€7£!#rƒàüŸT)G\Áû¼ö¼­f½u +ÓÃøL +æMN³|]’< +#þ«¡ò©·ÐË)¯Å +¾FäÁ¶ê—?ß³‘…x*ïSÚL‰«’&Уùá›íy³ýsý˜Ý™DaÜçÜhËŽ£‘¦(.¨a0ùÎPú‘fAðñ_£‚y4´õÄ“ò¢…]Aú* H`¨†â HË:0 h%µJÑBõªG¡L¯! DÅ_ –_#úŠ…È.Û(êD‰»ZîÒñ(j+QvŒ÷Ð} +‡l­ñk,Hº™)è…†}|$›öz’û1¾"‘Y%J|šâ¡£Ž0 ˆÁæäxeµåK“îZG[P2lÄûçù]MGxÃê±Ð²/Tªs*ð5i5 +} +3¥¬\"ªØõJ;?õΰÜèTdQŸHò·ôq\ÊžzÙø¸š}™Eóo²-èawµ±§|“l‡ª–áfuæ.]­x&½uÐÈDCQù5"Cÿ9~¸ÃÜý›ó 0BÏ’c# +•Æ~s€ÚyÉÚåš/Sû—¨/Zª4//i›ûÚ#Ðヒeã5Ìóhô1 :#ô×€Ï,¡ñ¡¿}sš½FùfdmóØã†Ú7,0ˆŒbÔ¤õö|î2:#ÿ\ 2Õ0ŠÞ~¢(PÊ>PÀ[  ºÑU!Ç`t]E£>"*Bš‰w>"Š¶ûŽ²j@”n\-WÎâ‚b">Ê¡ +e¬Š/ó:÷bA¼[E~…îs¥"×æ{I]ûAþȉ‹íáAýÉ«?õ…g½+ÃJÚlí À‚RE‘O˜_ybSan±ß›cÙºG Ö¢ñ5"cêÂ}ùóÕ"öÝÑÀ ŠÛ“[«½/¦’¯­¤ÿ[°È}oôK÷­žM_¤4ÂT?€ì½¡¯3@šXâ°<kx {óÙfž£ÕŽpTLßâ$®{¬¿ÌIc§Í?…*èq`cÅÌP¯X~ÌÛŠ¢Ô(Lcèû{Šsœ€™€w¤ª~,Ò…¯û*ßœ¦ÅĽÌD\»:Ã_"ÊË Cúd½â/QWÔEq2¿¼Ž NòhÄûD>'îM•ž?éÉ£ºõ×Ø{Ы¿È ^ÁhaÛeç &ñïùsý«›Ö€G¦Pô&rü5#ŠþFX¢‚;Ö }‹Ÿv+1“YøÆkDѤ{Ägþ¹Ëà_)( .½¾’¿eÝ\J4ïáó¢å‘BL¶vqÝ׫ÆÀ mø9u¥¯çP§Vù.‚FÀP°òB½î¾ýÕžtïcù œ•â…º¾@Á[„…¢¯‚’ª +ýkDJ+™dqÅŽ~謌ú£R ðƒ•_‰Â=Å*Ü•KTjž ùÊùbæå╨{% +c’¿;÷óÄåsº%³çwk÷7L˜©úŒ<[ BtéŸV\dÔ"îUÿ¨VÄÁ¥¾©ø1ñ@Á èw%qª¥ÌJX„ÅJ¢Í%*iüÜÁ7ŠÞÝaƱÂ+n´ZX_¾Äñ¬qïn_Ü/‹¨çü…È9HZm+#ªgh(vàL^Ó”äJÏÉÙ÷xeyëyëyT ¯£Â’m±sãʲ²ß ©>K_ì~€š’†ÂÏJx)ü¬Œ¦@ï·¥Žâ·c8ûÆ©“ÚýdÀäà\±ŽF—Cê.ò?ï@‘jÂÞ ùÞu„—ÀŒ6×g¿*šR{d(õëÇH­à—cÔžÍôXTºIäávVÎTËlx>â$<Ûç +/f64áVlkÑÐ.„;# °ŒG s¿ {ø“ªÛïAÜÀâ*¾4"îתd +¦ýñ¯Bsþ–ø™¸ÿ*÷¯<Ù…Ulÿc‚­ÿǤAóãßþw?þÏÿã_¿XùñßÿÿôOÿ÷û?üûÿíþùŸÿñ¿ý—¿ÿ÷ÿÏßÿ/ÿðŸþËßÿþOÿõÿûûú¿þþúÿéŸÿçÿöOÿïÍE¿ÿ‹ÿýÿë?þÃ?ÿãüû}‰?¹¹çs4ü¿òÿÿ I›käHcÕ>Æ¥RJýÁCï.Ì™ð{žÊŒß!ð`$©Ã*}±è¼râÏñ=ñGsèHLš·¾e*7–Ýao<ïó£±ãQï¾Ü4þص¶ t©ŸÏ—("¨ZÑ©·7 Änaß׌è;!6û˜æ¾ì.±DlΚ݌Fqà¡Ñfy/,ML*¶“ëžÐaå4HdUMŠæ´¡Íxh-qsp*˜Â’áw|–Ê[±üa€JAvÝ͈½;§ÊòÝq5­šˆ0"Ž^Ž7ÑóO(ë"úcÅ»#³<¨ó;¨ò(û7ŠKgzNÄN7ˆ 8–  ¹„Î*ÄNêáí´+nà(Úíõ¨¦úø.EpHïEŽ6ó¸>˜î, õ4ö÷¯CL4³w¶Ü:pFœª¸R5ÏЪЫéí~!—l‡ý²¨Ìë ¶íûfTWs©ÀSV¬Æ}‚=­E®t<õŠÃ +Ê}—A×¼hGJâTt\ŸÌß Ùò¾Òs Á¡¤…Àjf؉ÈéÄ÷R?¢Dñv&ÛÓŒóï{gî_Jñ@8 C»`ÀA0 Þÿ9?Ü=¢Ô& +83Q Í|#:f®l*Kîso%©a‡JÀÀb¼tJÈ…^mî ŽBˆÎ=Í7v'…ÛêÜï¿F—k¾EI¥HÀÄ™}ÍùwÏÚ›ß!‘Ïß´W»_°#ÊIì ¾@ œ×»_ßzWµ_ƒžb5{ÿb¼±ªv­¼þA)ˆO½ßîhªçuýr ÷¿SvóWT;‡-ö ‹5oßÞ­AÓ¸ŽÕ[àÁSÚƒî_ˆ5x>e£ DŽÌxEÔë7"½Pex/=3ÎSõòV®Àˆö÷ŠFL"˜¤&¥¸þ¹ QôöÑæ&2§it¿uœ. Øyä¸ìÇeê㡱Erâ/íe„öB˯á‹×B[”¦ì•B%y&¥ýèhi¡šÓ$}‰xÜ,Mr}«úßD1ìÍ5U)U˜¡úÒ…Y²·á?:{ ´'n‰‘ã¡g€ú—ˆ 3õ³÷¨$ì›ó˜_1º†½’} MÿŠÏïFï{lB¼ÄÁ¢ð@²²¿st›7{ë÷¶1I4â^—£°WfA»x¹v¶\hä Sæu Txj±×®~ž ð7-/ȰɘÎÐá] €š²aoOâÖ[[NáEö¹•>Ú£ª:ˆ^v\y˜hsg–ìÜ/Æ@W–ñ^¨Qr±SÆAÌUL«€jäWPt í³³&V§¦î6¿þËàsL6¡þ^ ôÌ'"`x*{WŒéZµá¿‡GùyåBÑÛ" F–ŠÄž~À8÷v£ÛE¦¡/Ž8õs¼Ku4/D7TÏëmØY”û×KòkË&ÈUD ‡«ÒØyÚ²HÇ£ÿÏâÈ7ü—¾ßϵ³"—¡}è·‡„ª â…=Ø +cŸ¨v±“ ~ì‚|§ñ‹R^]žÇÁyJ9ÔPÚAPCA»JJFh»Ã}¢9hNRPv/ü„½)’ ‹å  ˆ€™É©È’ò°)í©2<¬¾¯Ë=Ü‚!-™¡ž~“Ö>Ô´÷¤Ç̟ݨ¬Ÿ1õ5j¥ ±°Ò—ûͨh÷¸@”2ÑNýSwÝ»«+#©û—€ü´¡?ö’úõ,4½hfÓ;/Þ‡¸úiˆ› عÚK¬úrìVWÍGÌhÇc ¶ÏÅ®aLÑ 1 zÍ•¤€-j9§Äê•òZˆîýžè±35 ënêJ¼}+®mæxŸkøÜàdͳ ž¬wø4-”Pz[ˆ2V£tïREƒù_þý`ÿ¾×†;˜#àt +*†ˆjMbQÊ ++c¿Ý(VU—68(eŸ/`€ž 4÷!IæÞ†e˦!³?¾ 8Nlú½©Ú—¨g¨_ê? èÁ ÃoãÉÈ ÷QñQð: »Qü@؄澞ë_"RD¡¯f¨ŠöÍyÀ½Y㹿¦ÖÑ#²M©,Ö׈u¿Éƒ>•â¯Qx tq>4®öy‹ï+û î×HåâÁлRKºÙ|Ünò+†=Yujïü-F7ģ⟟q@§c?D”jØMc ûe¤T‘ߣPÀªçõì}ézlb&÷üÁ¶Ò­Àêi›]¢,"Ýn)ºÉ '±ëuÕK²qÃ꜌”Ý'"uþRwϸÜÁ!EÉiu˜½ž'+reúʦ¤^Ù܈«e4ÅS4ðTþànA-¿uáAÇØŸ|¡KtÞ͘*>uáPMýN¢ºu‡AëqéK£Í’Îq{à“( ½Î¿C¿tëy>çG5UâÀvï‚dœ»ëaËæ2Ý»PPÿ¢¾Ûrlr<"ÕÊUAñ ÙÖ÷—@¤¥ªÿV>@u\Y[M$Ù,ñSL~FV…IG Íä²’ŸüùLèÝ„ìLñ7 @««¯AJ³Ó1kÔcÖ’2u:Z¬÷ l0…”TäSÓ Ìü7°£“!—²2O¢³ÑdŽÜk¼NpVu“è¿œ”¨ÂVt°™[¹iý ŒÕóX¬e îa«5W‚ßÖÝ{ïïcðˆkêG²Ž/Ñš‡íBTÒ+ý,.|¼çÈùÉ<"Wî“Ζ÷Ø*ˆÚ9Ÿd†ª_áÕ[O½¡+‹zqr›5h÷‹jë<]ÀÑþ.?ê+*êÔ¬/&%I¸¡0‹ãêM §ûqŒ£yÜÔU÷ŸÓqK†¦rùÎ2 kxû1‚5eüštJ,K{¡¤•XáÝa0³ïú×Kwf7¸':¶³è¿egïªîu À;².Ífž¬°÷#Øw«A|šàT‹¥?/te1’ws¹¼r›}¿"ÿ—«ž;(÷:?1&« endstream endobj 78 0 obj <>stream + H·Ÿ0Ó€@èzò)%‘¾.²œ+NÍ„D× ±:ì£h _ÞòëA¬ŽýN0u¹yû‰PØOϦ¶$¯†ÚÓÎ;î•~³éÊö%Â+á»v#«ù€øøî<—îô Îw£Ü½G¬ø±Eµ2LGjXM£ïÍÝv?\°ZsÎæ<û$÷#¬ï‚Â*Á‚ÒYr:jŽn É”&]¡.ôyŒ¦ñþI­ýXÖ%õK„?©²ÁÇB%³}s ¯yûK ×½®ìDN8+0Àû›ptPðå„ÞÁõ'1zsè=©6i…ÅDç\*=Zz@V”I-5àÅÐßæo¼ÐéïýìöêÓîËi /5vŠ5º»4¤'\¥þï"@7A?¾¤8œ'÷%ŠþàTC +ô¸y^¿“.²(Ê7¤{xy1.A¿D¼ƒ­ƒ­aˆóÍy@Áà ŒõÎbäñÊ…lâ^W£!µ#°®¼m0‰¨Ù{oªÛçJÏ™‡5ôb”èŠù;ÉyüÀ)†¸%<;b¿åe„]JäàXqù +n}®d·sÄÎ Q6.gNOsSœ¡+w‰€j&’!2E²ªžŸ”¬ ±ñûýIh³2ø÷$¥˜ S +¥@ö8—U6؉ŒHun#—™ëYïxÛê|íæ$¿DäJèOÔïþœäÌâÚbˆ›TéN³St pß·Å Q¼wAþÕé>) Ty~Š`ŒÌÏÉDê^Ý®¸@˘j–Œÿ_#¼þ鮘ÈÇ×oN†ÕRÓŒ‘Öâý:Jü_#"×ÀˆŒ}F.ôKT š’¯ ³7üè¯ôX·rÝ€tê5śDzÇmmókÄû¦>ˆLFÿd ·‘ŒÒ¦úŽ/É×v{…o +Oc¼eÎ_£ NùU /Њ3‰Ã·ÑÐHÕ"!‹…˜ÐA8>¢NË\¿Fä‰uU(Öо}sžJA }Ç®ÍÓÉÊúÉÊxbõÉîuìu'IæušàËÁs¶tÏÏ>¹OÿŽ1¦óêã;3`?]Ü¥ï€r + j¬¹Ÿõ摽JTyMäB0Hc»çA@ŒˆkÚB;œýÑÃWÿ‘s,# K1ûûKÐ`Â|¸Bfö¥”‹¾„qPÄ;AÈ:JæÚÉ9f½5ñ u]ÀD¾DdM[v€Hlö·õíyžóEí+ƒ¬C°ºˆfœl ¾‰X‡-/p{}rÙ?B7Ju:Íkš#Ó¶èjÚÙWJËoÂåu_ƒÛ r +­Ý7lo"`ê)áØ«WOÓyU;¢‘ +W-Ós ‘Œ#“­¤,Žõ9oV‡[#r»{§וŠ÷¼d“\YEì;Þ& Þ›(‰Û-Õ6zó5Q§×äî„›,yý@]wÔE¢óƒ}”åZa©Þ2˜aã›d«}#Tº^=‚_£—€39“Õ`õƒí<Ø ; ·Û#¬û‡ ù\>>Ãwgk ßùòÏ_ÙÁb3$a¬éä›k®ŠÞÁ-à‚b΋ò…Ö EÛ€ÙºH¾¾e:⬲8 ŒÚ§¹˜è§Øºÿ/Â3÷HÔ¯x[jBæìê£üDynôÞïýèÈŒ¢ .;þEGõKÄw ä—(ê›ò\)0€h:lgãi.eŽ}Ð…åXC…Ú³¦Ú…U–±ºž×i³a4ì¥w×cïîíHзí9ˆ¾Û>xÛÃŒ®Ú³.x¡‰€»§j/F8IPü·ŽVÝl ¼£ M”E4× +À ¥F¢&«t"x7´ÏhêoË@PÃ.=[ž)‚ ¼áÿ¼%à ´à´ì“fŠæ–Úþ>¯”}PDípø~½¬Q Ð7‚ øª š¨Únç9ã% ›¥Õwx]j©Q¢®TÈø|oU÷E€ÂCóþÐ ¥\ ð¹öoŽwy éËû…þ¤ne›¶w·OwÏY°ÚQƒ‚@ù‚¾]C<¬Õé‡"‚iêcíÄgþæß+À‘\©êQÙt†eƒˆ'Ñ€¤ãBþu}²Dís€TNOTì&$ÙSI#Ê6âŽj¾{z«ì Ðû¤©AòDÀWODO÷ä€ØmØi`׸’(Ô +Äó¹R·%ËÛoåÜOñÏÝâ`•6®Ó›µÐþd:xºó“½¨ì]‡zØ ˜·kªOÀ‰"0¬ +Õh×ñ’O,š˜–Û(‚êØï‡C†É^»Rš4Àùsi,|®ÓPû{ÖÛƒ¬}°"ŠNV‘DPJ'bY'êW°1;B²¾wÀ´¶ï ¼›M£*ÞR;ªˆy½ÏØ©zðäJ³xž{ +ǽ%6yoÔÀö‰ (‚XË!õ¾³DÐÅÌûÓTRª!HÀ}¶lb÷ivræ`=ÐÑô7ï}Éu½CçÄû‹Âø~ú]“I¾Z¹’\ö·…Ξ4­Ž5˜!aw¿ü{ŠóW@Œ¿þÍPˉϒýŸeÏçŸ! ï4¹ðyŽõ=¶sKaÎ 2«h1êE¡HÂþn +—æ‘@(öƒyØÖ)­Ýï¯yaä"{=ZìGûî<ј󕢘>@$ÌÚk6š}ßD ÃÅ¥èãççÐø“¨ªÛìåçÓè#ÉýÒréñÕ5³’+5ÿ…&>ƒ› ¨ú±Vàϧ¾QHD‡†Î<ëiÄ©oß  ó K_º`­‘wg:o·w¼y 6:óÎÝ°†é Ì»ø¿Æ~ðPaΖðtw«ü&(Ë©üYŸ YÀeR…Í×SÀÁ?ëCå°…—RZæ1œ‡<f+Ã4)¶Îõk@¦…_Ò¶¯§ANü!•}ŸÛ7ËI½!ü5ÂAÐÎ x^_¢Ø(š³4@ú¹áynø´Qú¡…hŸ~O;}$‡Ý·|ñ‡ƒ…³3Qà óør°Q±‘¹ B¯s•þbŽlÌ¡ò0/01´åâƒþý`—ÄXi¼ÄÓ=-éPOŸ§4ªžÒøìßD´;`3EF^Ä—(´\úPÝC>ˆ¢¾XúA¸ï‹­°!H y­8<ó®»ìÐAOWO£.÷;!9éJFÛõm2>t˜ãE’²Ñ ‡œѬgbsF[°’ûÏ+e±ì@êõLîM*¬JÏÃi‰4æØŸˆr_á•D¸§æ^\¨ˆÐ``Ë×Ò…ôCˆð¼ËE¶Ÿ7Ã}¤=lyŸµÌÌŠ).è°{Úbþ5â % ª©ŸïŸDÑá§rÉéèèY!dbJ /§ðIzGýnÇ—ˆ?œ¤é^lö^¨PÖúrÄ),>EWË´T¤¶¹b_"PyotŸ€( iSa[ª+’³#¼8Å?poÚOùPöìNú×ø»¯ŸIÚ +ÐLoüËy}­£îCÍ}Ê[VÕof©éRö7RÖyÜ-»¿]÷Ù[>@§Çìká@äµ°ãìªc#ºcž ™Ý H ï]’×A£ès¡LÛ§ G‘— +"QW97Ì|C2ÿV/rÀ=%àºi?8çäé~o…ˆçƒ´êïú0D{SÐ@°FÔ~týd¸{“^¯.W’Ó¤̇òkã9O†Î»Qû…ÌtL¯(Ú´V³€:MÃ*ƒÅÍEvô³Øë3db¿dصL2{7_„ ÿzè¦[$9J`ø€ØLÝ1C̯ÍçJøÞ si¡·',Ü`°„}÷l¹‚ùÞs’pýŠ6héŽr @"k,Ï`$é+ó0—øs¦BŒq÷z¶¬­€(•!$G%„ SæØî˜\€$„ºÛ׈¡š3mˆ=Lêרª ¯·›v0½\zê3ü] +m‚q§¸s¥/Q¾º kmƒÁßÿ<À@ï „£¡NW™®Ác¿‡ô3僯Ûãd ½±ÎÁ€­Šþyz‡Lp§‘‡vÊ †&Q8^{æ9*ÀF94:ðFKèj;jÔ‘êD: mîÑãà¶,ËÞ¹—þšÝd9‡%‹½p]o-ÕjШz'‚] Ö’Þƒ^8˜Lø«0ºËÇj9Ñ«x¾˜¿½ž%ߌÔKý qï¹æ-~cv*ìw»¿ œˆ¥¥ô׈<«–Lñ™y€ßœgòŸ4šâý±ZsDo‡ +Ê!zvS³_Qô~(ñÔ± 3Ì¡ú»s;p4¨£’]:Ã,EØ»NY¤ö†œ/ú™éÁí¹`ÏךYÃÉv/NãÝ@}‰Â·Œ\Ý2Ó$äˆd}ØÕ¨¶ªäW"¤jÑ ×‚ŽZ +¨ßE¼[5yÔI)ì~sžuh¤“¬=^*N“ªL_#¾,ÏInBxG’.P5Ib³¸M«Ã‰«ÁÎgI%%[‡«CuÂ}ÊK[¨A›P¶Ã>ŒI”{Ù!-DªÉ°“MÌä-`¸4ït}/Ýצ8ÒÛ´¡àŸ«yqíWMº§R(öQHŸä2¨Q¢PQÜhØ m‡»W +©þ´¸«ì9ðòw?‘Sаƒ¸‹d¹Å$-=)AèéÓšh¿‰½ûÓN¥¥¤¡Å +ßů{L.I5ºL` =Ut=p¿F}¡'‡¬C{{[_¢H -ir÷tgèº(nMÖ`§ÈˆÐ +M¢=°÷Ï?OY'õTïÕbZÏ4öz4©wØeóØÆâC‚u;ÆNÞÁ_Àÿ½@A¹ÿ_ðRÒÿ„{N?àï„Ô(›†><;³ýóíþç%BÕ"ߤ鑶p=7…ä¤ øWrõ½B~¤®Ò{7=éQu\ ‚€Cé«ÀŸ…Wq¤Yhš,¦Õ¢ÓÜøýdØâ±ïÙR ¸“ù‹­—V±{Q|¿ålíÌÐvóÎ\a\w*j0GX×P€q«4I#.Ðù§áˆñ9+Ä@b¥>¢8ÏuPGûó¯ÂÊð’o¶aËA +P²*q£èÀ#éì +>ý^Iƒ¹©ç¹Û Uþ<Ù% ÌnNð…aÏ3X}G€Ù\Øe¾yœQœ†ƒÔ¨'Òj;a¶Á¼¼ 5ªçDLÿüBÛ‡±{$»5aìÞìJ8n6g{”ñ4¯¸©.¯!,Õì|©ÖÚŸ&0T«7Ý`÷§èE‰¸$(ï®~¹Ôé¡”ýmØmÚèúw +>°—e¥BˆÈÈž»èau•!¢¡bÔùúÊŒ`o¤Fì,߸"Í'PøFCÖÕäFI3[rÛ" £/€C§›>2ÚïÒp˜R(dãÏï„VÌö§N `djoîÆh´ð»¨hÃïzŽí°)HÇ;–­X1Ý9H ™@¡ûT&˜¿Qê+AS15ž`#MDá…ÚdpÒd§X¿¾vÚF¹Tx¼Ë$?-I$€s– #/D,ðT.¤¶ä:«fwŽI][¯Ì@‰ž•“ŠÐa>Ia]7Ã0P®£Ñæó¹ãHªM%ùš¼ÿG*= a»Nû÷÷Ñá#íkÙ²Ñ9ï>g%ÝÈÄV;©´œp×.Õ’IâÄÞ6^ävÏWžVÀ³íÈܼÓQâ ¨[6­Š°FÏæÕÌaÕzÈ® WGD˜4vÍ_$=Lš\@O}½G„GL²ÑVªw3¿#oåÙÙ€r}vhX·´ƒøÃÙwKÆ{;~eø 4I<.ziKô6l8bdëö±ï“þÙ/ã÷¿áÇ(ÒèqøîQlç~/å@è—îdÓï°ê1D,UlLˆbLddiKd»ÈìíÁ {©wè =ÅpüHoª½éWÉÔ(KIO\íšÝ Ða˜9p@ÎòBØS"®r„¥’·bÁ'ž‡€;ÿЬœ™˜7,«‚£8•bXl©@Q ¬ +惭9ä5oñ>áöÃí•ÐÀ·‹¾Úi²÷lh¢)…šämµÙ:ǃ¢[N2"Qµ«í™ ß ßZ·C7OòVê‹ï#Û_äþš‰b +I¥>¬àß»hÈ2”5 t±çÇ©'ªõðÈ®aãj!•ùóBÇ]÷¹”ùC\Òñ¸@·Wy +ïÞ~ÞÒ‚Î*î €tÛ:%ý¦ð7»,OcosŸ¦Ány‚© +6¹;õú´°îq +ž7œá—hU~ŠX œ/%h²÷éOM,‡ÝO”õÿýd§&¦oßýÊ×JÑ +¿«Â>šáúö¥Âlç<بØ>¥­ØÄBLn¬„Ô³'vRvEŸÎUQ9KlZ8)Ú¬a¤=•! \%¹úûó DJ“y)F÷ÙÉ"p3“¾ |l ®žMaéyží5Ï&uRüwŸa¯9Ä+€PyNl¨—~šÙ!•î`;ÛnÅC.Í´ýs ™Ç)ª°'÷FŸp§Òó;ÿ®!Ó{þKàà^³‹îŽ‹5›v[A"â¡+(u§¥ÔÙÎuù~¹î§®J ¯QûiTE“—(™%ŠŸ¨jÙPT¾ÁhŽP;x¬6"…3Sã0¢½#ó†ô\h”wÜæΕH®‰¸£x9£ÎÌñ'¿èºuéVEc©-ÑïS€INMg?a¨ž·½¡ ©±×p’z¸æhÓï9}©QEÒÓ&ÑíÂýÆrlj +3ÊvjªÍMöQ·¿æ°Êø¹°ÊZ4 Tü„°¼TeÑhDŽAE­GWDµÛ¯VÜÇÛ{¶s·£î6ÕòØšEFIÍŠGs—AfIW¸¡¥¤®¸Þ;£=Ÿ+M±G¢“¡Ï|ËFô$Bõ +¥Fö†‰w\gxGLéÆ.#8i€Â¯?%x¤M>! ©LÄS>ókdöß_ÛáH X~ ¼bÝ5D¥¯^Ÿ9ì'N{ÊÍCk¬kÊ*'µ\×Mª‚úªi n7Åç*§…§J‹P¸±Íùr÷ÚhGÏÕ~|×1ƒqSg4Š—š•5àq7u?½d—ÌÀnýºî’3:VXWêW8ÕâetR kYÿ¶ýYÓgÊ¢ŽXêèš3l‘àeØBßúÀ|…9,dW"‘ßÀ¿¬ißAð1ºUë°S +¥i8¯£2ÆÎëEYÒì‡[Œ_£’H{pÖ“$B²ŸüÅ]ï§7lmΧ€‚?õAœ²’¸d¹mrVQ0#ª`b7Õt„^ŽÛ(]m:‰Aeˆ£`!• Ô4;ËC9*TQòB¾=ê÷p®ùLF:°åR›°}‹¶€YJ¥¯º +È4H$ôì>çÏj Ô¢dUÁƒ’ÏÈNnîCcÏ€CD¾‘‚Ó©öD¥x/¶#ñR–5çBzAÕãeÖõ5Šò¸…»ÑïCÒWÛIùŠD¸;ÆΠ¥% Y2”j3쿆œ£‘Öì3Û»ÞXˆ1‡ªÈNÐãF¶—mÔuxýH–šë „ƒ6·\k¤påÓ fw?qyàó`1–½…„ .ñÙüZkÆÃÞÉ€« HHtèäñQïÏÉ|þQEª¹i—œñø€êF‡”›ý d®‘fËs‘•ÅZìì +ÝÑø ÙcöÛñ>UºWJ¬­zt¸]À›‡»¯Ê̺"Š&·VU^åMÿš4 …°1…ì¥Â»M ƒ}‘Š9u÷<4ÙmF”'‘‰Âõ9”Õ»¢}§–Ge'Ï]‡Ïe_g\GÖ,²¾Œd`ÑíèH,|k[xü,>0> ‰F÷,G±„‚×›ÆB»Wœ ÃÝQGU5øS󮢵–ÍLs ,YdÚCÍ2Ž×qFf¸5ǹ@·.-ÒªþFRëû¤Ö‡4ŠjȨ׻ñ›j·Q¡iŽj¡6ƒ1\zp0«cvC4Œ´“Yù†éR­ JB„/Õ1©¡”̙Ӵ§/'Y¡ Ðg5å©PñúYÃYz¨ÆB™¬œª D"…ûö’}ɹjêÂQsÝ…@¾ÌÔ3mÃ!¾$ßÇÊ\O)T$ÒÂשµP³Rø`æDÁ´¿zðXF.(/ŒÒòýúãÓ]Xð`’¦»¾I7LÑIE†ïx$)[죎•†ÒîH]©–ä§îWQ)i«! +îFzï¨7~ÅòG•âDŒD´ë€ÓAÄçJrVöoÁJHKç«öóJä_’FÔ›Qpì¨5Ü ÀÇU£raovRýzÂa‚MÀÈÍâö^gTÿŠL±-»r–"i¾ìZvG+n´©ñ¨5ÂnÑÒ¬$Ê +{Б¦_üûÙ.Ň ‚ AÜ*“Ÿ²û8xH€‹+‰à2Ë:;AuÔ n<Ýž&ÚT²&ù0—ni»•!8Œ +KC¯ÉÇÓ(€ñé´ÅТšÐŸã(°'ùDºƒÎÏyÍñ4ªš¿ +ÄËk˘RºšÂåÙY#¨$5~²§ <Îéí`$þ +wãú`ÍšÕvÆõ!á¸wñõb”^Bm«"‘Ń³Ñ^nÅ‘Á¬ß8YøJX ¿®[ë³HÊ—°Ü2=°Òñà×ÙÌ!žŠt,w­š?ÂToµ<Åc>±Â¨á,ÙUI©H7ȳ«txcá äYã<É=%:=³j`Q¡ÛÕÛ+öž¤Èy„ÆLٕ毆ÅÂÑ_q£Ú/ƒ Lý,ªº¤¤êžaúA™’é÷êI–%ùqÒq™~Lô L]‹^˜àSõ¨2»Ü1 +Ps¿"Ú'ò¸ßÇ‚©‡âš 4»à,ª¾²æ6ÿÊÍ,Þ·ýåõùÏê+ öó§Ä:ì$;Ø‹v‚ ÂÛ‚ï^[È8Úª¨4ØCW©þv}uÞº€M‚îAõXäÉ~òzivµ°Æ>™'QÊÓ¥%ò4U=V ·çA7‘ÀEÓ Ô”d6€¾ð;¢êKÐz"æ%‚Œÿ½ÒÁþgÑW¡ìeä4ñD $Ïf”{1Ž +FKåi²3¦ßó_!ÅMV_©ù{îì1ÓY.=ûÓW{ôÓe¾µv=ì.&»© ªÎg&"áD¦ šê ;“}œ2¨“Ö€ãUtDÎ,†"#ˆ=tj/ÙšëÌUí.!¡ ‹º–³î·h!j’9¯EBO¦`Šü|¹R˜£äRÅIÃè1A_ñÛ&Bõ *ÂVEb4€‘ó‹ž À¦2TKfcêèë×L!6Q!¥ Ä +’\ ìdö¼”4ûéØ‚ÇZ*3œ ±9r"Îélçûd3Á\²ú!:L´ü0° BÔ€õŽ" Ì¿™FÅžjŽ] Ԍ㙰s—žOû–bÐ÷3g̃ƒ_¨Í¨Ä34ó^ÊýôPb³¶?4F¤gÿô"è)ëNeMÂÝΛńqD¡h 3¡ +Å_öܲ÷þýù£°ÇÛN>rQÙAûÛ]‡$>B7;…z@oubS<ÉX4Lˆˆò裈r"lzís”£çÉq~]:iS"×µ’g 7€b(*™[ãc£ƒÎPÏÇ•Å{YEЉ½„-«ð\é¨ô’?4R+²=ÙC˜É‚—$v1ž¥BAèÇMVºŽ›~G— +íFá¬X5€A¦š52U2ç¨ó)ø§ª¥âO•pδªÒÍC¡ŠOüþ~?9ò»&‚®Åà²ÆÁWRB¥\ +„騵¨°<Ø´ŽˆOœä»³†Jç|D«7½L>Y•–¡] 2°scå+x%¤¨>»Ž$ñ0ÈC!O½Àh­Ô_#³Ôßû¹¸3^°¹™§¼êŠ°¨[è:¦ƒÒ—ÈêÔol!8QåÀÚD¡\ÞÒdïFåÒ±{É8¼V£Frö¼sø +‡îœÜfÈ &T52®—$4Þ½‘¢ºR2€nÖ\Ó”Ýý>ügôRaL•Ð@äeÀî`ˆ£ópî(iú%‡ü¦c6‰Rˆ›Çú°E\œY‰9 èfÊgÇåU¨*–7´ –8±œj\¶œÝ^aK጖ÑöØdûE‘¶ÞÚ\C‡T œéê"JšÚVSHpþ¿¢ó/w +Ž£8 Kû »©¯¨:>ö”˜u}O³îj‚±îÝBÉ>ÔÁ®ž‘°æ6³ ƒÝw‡mL” $±yðúÑ:KçhΩu)1ON“eG<°e B´¥Ì4•ås‹|>YÐö¦€êõˆ +vdNc|)#t˜FA˜­.Í™ÅÑÔ²:Z¡iѲú‹@Q‹Qö2ô %ÊZ¸ËÈ‚"‰­€%j¢ëhcÀî¶Sϳ±#öWÖQÜ×v4Y² TU¦âJ–]Ñx·ÖõH @wÁzs¡ :T@½ÒFÂÉMsïRîiþÒ zpôíâi¾bV¸£þé$¹·[U>y8&.pƒ•'ì*”]›Z’èRxžlþ²ÖÙ ÕhªRyì< u‘Õ¨„°QSâdOU«+|èÄĦ|Œù\ÉŸD_ó(úSl¤ž´ýG¿‰–æ',êØ_àz¬AënŒç÷3àÂäØ‘ΕèAºý¨‚ nh’…5Š&',¯*—;ÁçG²>?#ú%ÈøDΧ*—Õ^Òé~é=¤r*aºÂ± ‹.ÇÒ"K¥…^R¬þ¬'õ’‰ÙÜç­ÌÈÈ Fm`= 0‰ Í·ëb>ÕÆÐ+—:JwÁüùþtÔض‡Gÿ éz¤Úï¡Ç½àyÑk µ¾"Ù"ªú{0ÃÞ¯™"”/áŽZ¶KÌŒØâ{~Ûý#®îIR5Rì1=Ê=ßÝ÷Š7¤óÍŽ˜ÊE´úÞÁÎnÛ‰pK2±4*Ÿ+ “C¤žQGP¤ÔÏ)R +‘vþûAô°oÍÿGìžâYIêì2©Ö3XÍ(cÚ©`ÝÇGáhC¯¦_ +ô*WɃ{‰IÌ/5ö”=¦T“'Œ/@ØŒ’ Ë‚^ƒìbúBCö,Õçtí˜DìT u ªQ9[£kH›QÀónX³¢¯Èna¯$l°ùEY ¡&ë:zEÑ +¿Ë£L‘  µže&Hþ)#kƒ¿û7áÂÝ9Ö<ü;„%'¿¨ÅF1-­Ê +˜D“9rR ø~„Óµ^l{É?òCô£-&üB=~ì|6Y)šÂ#û¾}k3(÷N5fx×óV0¡jÉ#üŽXïÊ¥lÕ;"Nû©8n®¬ðI)Ý2!E¹> +ó+΃ öÐQÖjúVlRSœîx¯”JÈ(­OîÅÇ#½ìàð›bÿNÃI6{ª_¨À yìӒ씿ý4J­¬$fDœ$äÁîÝ–Ý`´9ö˜(zOwò@[Zq¨ÂqŽ#$¨«¶B&è¡„ø8[Zi‰65é›­q˜7°–ðrlI»±¹­¬‡Áï×Nf#Ìa fÄÛ³™iñ6Ù_~PÀVöÑý“¶Vô¹šú}]óU +¦­ -&¬=T\ÿàT. $ǘàÐÂxUBXÅöïOÐÁá[QO› +Ü]gÙпǪ§ßÁ˜ì©¯‹ü£¢ó(ÿœv TŽ_ •?tëGÏcçB›ÑÛ¨=ôËéÁB¶Eêyú:m²=¿<æÿLïo +üwÿŠý_}¢¿`JŸÿÿ÷?¼$¿û‘¯Á· +#"C«­º?'¨Q,¾þ#ƒÏÙy'4RŠî_V~H6„ÆÙÁ·éWši•Àôà_](ú•Y ]gj09zìw”ývŽsÚó’:¨F~8Â;ªZk¾•Ã4ŠÏ™¨[û"[ïî `ž!ÆFuÞDЫñ5çPkŽ:Byù܇UìšR*wJEÜú r_Ëú¨Ï¸eŠA:!}aGP=Jy9×»—ãý8¢dþ"4]u»çþÓ`ÊìOf¸²dHaÜ“ñ©S ÉÓc‡›œnd 9šˆ‹èÏøc©@$£Žb†T¸Tûj`…œ„ê$œ*ÎB¿UÚº¸¸åJ”‚ƒcµÕј: }ìÅX4`ö:Bœ´ÚÔÍŽVáÂmwå› &ºq0pDEåÿ’ù÷“!UFøºòÃ÷zÓëz,Tz¦"Ìh.¨ÚÇ£¯YKõÎŒR‚ÂÈòSöYå­!>O “«Á4ÝÝwîE@e;sOÇÇù]‰éîMH_rƒZÌ,·;zöh|¸NQº +ì§\– »EŽAŸAò‰ú5Â+ñ… sy¾9ÕP²p˜%œÄç«ÞEæë¯~6È‘†¯á{™_ƒº+?MapMû,-ýš~¿ž‹° ö+W*–Õ}tïÏO FlQ§Å̤ðþ•;H©´’Švk³¢|ËOŸÇº²§^ñ?ï'ÇAºôÎtˆ"-ÌFÑÊŸ³»€×ìAÀ-"†ý»9³iëªO'"xcÔŒÞidÆ°›Z™ç6z{¼W%Úî!}Ø=ÄÜK¿‹ç) yˆ°š ò»ÅH*õmíu†(Ýá=‘´[ÀÉs€d*<Í©HîOf@Øì¿hš"»éý%¿F¡u;q{\³[N"Œy Ž‡302†å*FŸZ­ä€ ŽŒ¨'â„:,³ç›ƒºt´†òØø½7¶ûôßÿf¬~zÀÊ*| Òb¿x§ c¢«ÄMøªwMŠ÷"ÕñH8:b÷Û9„B®ßѶXA‘Ø‘Á€¾²= Lá¦c\WSµø…„ð:£¤“®ˆ¾­¨6ÅWç<¬ÚDô+ÚZ4Û8 î§kA÷¤ôû~Lz,ÝžwωñÕ*bˆYUІ°Û‰x”·’×ëíÁ²hðÈ9Û“vÿuÔ4°ÔÕäñ*ég=J@䣒Ô#߸†È¹“L¶ 2~ É`e%ÖÊÏ׈CÛÿúçl-`uúar¦8NõÇíçu ¡8(éHä1íUkÑ^ú?»ƒ5áÏŠZE¼‚ˆ¾¬“Ii„A…¢Ü_ÊÇþlZ¥Í<ã^„õxf m†ÚdÁŸ­É­fÚh?S6Ù»4±UÇÂèNRȹIÕåØíT=-’Ò7Û +ŠØ´¸Ìí æºË k(±¢&¬A*æ.Có”á¶É1!ý‘a­A É|d *‡+Nô°“6B[r¥ë…¿ör@8ÈkØÈôC R)ŠÂ5¼f€‹¸©âÀ Um‡´ÂDàt´#f;ëh˜M÷a6é³ì6ƒaõéŽsºrù#6CºÚïÛÜßK0Zq Ÿ”s3¢æiKøçãâj¡ï:¡(RMØ4¸¢uÓýÔ†{Ø88§½"O½äøíûi‚;Ÿß²Å³€Õ>¬ wãÀñG)ÝR¢®šê¯«/§ÉÊô¼æi#j´5D&Ù£m‰ØÚw¬\r¡u4ÊŸÚbLùØW‰›b!s0Y ù¼ÿ\‰"!ÉJ-³‡o¹ÇðS +ÜãW'ÿ8•²–ªؤ§UíFž©êñþ¨húAPqy~üåOæ÷¿ág*!EÜ[Ó:Q:‘¼’ëù@³9Õ…ÛÚ•Q Òˆbo‹ïò³¹AJÝ­TƒVª6CAU^^©»¦]/àéî– _“'ù¢¢'CjX «—3ŽS oD½©D¶Rºë’äö%"›¨'=Óbë×(ŨÔõàEÏT£‚)R;"º9ݨ”Œ"DÓ-pQÉ}ñ"D!v1ø”{öÌq÷‚¦ÑâŒæ\1Žþ=.óÃç2"Â>|ù3úDJ¡ÑþØDÍÍz•ƒy*½Èë\9[.tEʉ`Ê"bzeIà1³Ù?3 +ÊG-¢WÌäÎÌDÓL¬ûÕ'B¥w}…»HŠeY·ƒÔÛ› 5‹êk/Ù × o$–Ò »~.¬e~e-:4Áq5ð¯C]qÝö·‚LmîkÇ6ðK(ú¦2…ÅSŠø5j†è§&&Ì.m#H¡o)©)ðgÂõXG7)}Öšù5â§m ›½× ¶âËyrsðKKî% +g#lmŒ@$ÃÑ_èe¿µô/Q0ÀíDì×6X}{XZÏ” ¥lϲÇ×mf¤æ:i±—)´¨~ðŸ2»ª‰ !´÷&@ꎈg¯É°ÒuÛíÈÎê¼4ñT“í…—Á1¤[A¿Íü\)‚\Ô¨ç!w£ÆºÏ•âÙHIyF5•æ=?6È9”Þ7Z¡}Á=ï‡yÓ]t|æ;I>O„ÿYµŸ(s¦Ã¸sòS‹Uç˜gÿè!÷kÄ¡¬.+ÊÛ¾/Q× •0É_Ò­žï$´¬ƒÐ£¤Oœ0Uîÿåß3³½>Ûû}J«ûò× #,há†ÆÜ<¡c<ߦ‹í0Ýrà×(6×?逪¢ÍLgÌë×{¬Bã„v$†Ž¼áÞ˜ßÇè,J„ý(®(äUG<\X³¥ŽÈÿ:sI%íbî7/âIýæNÏ¡b!,_Z8H,@ÈŠ]ºz„¥·¬~³)RÎ,q“ÈšKSé€Öve…¤}fž)ÎX2ŽS½îÐÐ^‚ÂŽXïã&þõùÿY{·U[–ì<÷ ö;ÌKy_”3"ãyiÆdl|cûª¥2,•Ë¿ýŽïû#ûX³÷!­-( Š5G¶žçŒhÑÚH¤¤Zd«7¶•@aÁXð궆dƒ¥CíÑc—IÄ9cú%ûb!û/q—{¹ +‘ºòs4<¸€6v„«åºmðò í;ÎûŠ¶q̇þm/4bS† [™±Óœ—õœÀfDAéçÜ› 0q•øk)ÑŸsÄRf5éÓ>â=à[Ó&Öz›ÁO©Ž `9&Ú£>B/r´·iîÓÜ6·Œ‹íéÊã8}Å)iñO):û¾Ò|Ùž†š_&³íØõâÓ©®âi;ce7 GO¦'Ö·õJË##Ú¹%èjö îë@$k.®–lðÞ®ÊkGšSVPéÏ;ߦçH÷T{wØó‹ˆRS¹uÝ´ÜPC>”Ý…õ¨Ùõ3L(‹K€®k–µškÂâT“ZOƒú`vŠucéS@ôò“؆$b(4¿i¨åE6[8v¶ÐÓ˜c:RëŽL¢¾gʇûúgU¥‘>yÃ4 ¾©6RCé+}ê–)–Ç·[€%¬i;^T»è`¬ˆóÁuKàëÄs>´€ZÖÈ’áÍ®¼Ú™Ö|àq3e/É~ûxý…†ë¾gwZ0ÒÂŒŒƒo×W += Ýdͦ³Ù\ïÆø&bìlÄük—Ï5wÔýp\39Fê®S…¡¦5…œx¶ÛkîpwSÆýghëÒ`׋?ÉöOä€ZWèA‰²ÎÂ:cÝ¥%O•·À€÷eˈ…ØÍZñŽeWP¶ëŠ5ÔDxDý3$ö!6…2C5—±‹CâÈ{„§ÿá^ø¥GfgÌA·‚qƒZk# .æ1!9^§µGëá}#héð¸whÈ&·È)·ð!@jÍ´DÄœ~žVÚu=m/"îò¥ëc^†fNÛ»¡[nÐœk{óõ¢:›nE†CCƒˆ«¦1µ^¶_Zèý¤ÃÈÜ#ϣЫƒWoÆm¨2†¬[øºIoâîã½ÐQ¹ˆ¤jw€)W´¤HŒ"?á:˜ïxÄŠÈCiq9ƒ~É¥&Q·h¿2Ð]éê&õ¶Á´î ùï"î@w…Ò<.vQR*ÎM©è¡AªŠU;úÎPÀ#Ö¨VÜŠTœx´ÏˆÜ4ÊM1¶S€ÏýéÐp">åÛqž‹aø›€ºÑÓÇxê)ï!¶ yYqºr²º²ƒõ-–7wEgM†ÅnÊŠì­ бó=âù>5ŒClA)ý´ñ[t.ë™Ù"®˜'ríßE°~ +ŽiÝìöUY½Cô¢\hsÔKÀƒe¶œ•â‰°Ê,¸êÑ„ÄL-9‘¡fk=¯—2gÝr”綕£­®P}t|Pjñ¶ÇÆè U¥Ï xÄU<¡µ1ÛõÚDµP¥Þ.-Ô×YpoìJ}WŒ±¢aHEwtTZóDjžHß:ƒ)„Ð>Þ½[.4 ž)bKÛ…©c]?¸M[©¦}ìœN +0”œI_JkßDÔºq…×Ù¦®D]yei¿»QT¼Ñ4.x3æAn‚Ï÷[[Éz(Ç\rãw”*µëÏ@Í3‚AsÃ+÷%­Yn€h-FÛ`7¢©éÝžÒ¾~»‡`ׄhÇõ‡“šê 5㈽@j­Ó”Õl6çVN$B>#~ÿtñ4Ýì Éoö3úCã]ß^É"™„mÌÿøvn|BuZÙz»›T÷Qã™ 3UÜç<ïaŒ œ’¶ÉÆV†Fù…í|‹íü¬±¦UY›y¥>Œ{¼°dÜK\¢ìóï‹é£ËÖšÖätt”•Zѹ~ê2mÜ£ë¥Zc½ß¡ úÅè#âŸvýÈqû}#¬V‹)ÓÆÓvͳ2è´BÍ,ò&‹ éÇ`P¦z¬} :4ûD‡ çS*˜¼ïˆ™ˆÞžÍDˆ5‚Lšˆr¿¬šŽ#t¨!]G6ô±ÙÐWˆMG~½«£žù;KãõKKFh]\æIzû[ %¡Ø,ÌTgæ+¸XBÕS´ü‹-%75Pä™Op„c{g£PJ"‘(V8šTÏb_Ý¥÷§c*»¾éõTšïŽ¥êõîP9wcoWa©¦lŠ>à/j÷¡‡Ðl=â5I¯WÔÐG®*ÔÀŠá²Ÿðß)ö1[¬ú/ö«÷°~á¶Ø2BYß÷M€6gtù+ç¯C8Ê˪4Àçq‰ ÌS»­wÜ?‡lª8MV‚¬{À >4–Žhí´$vµì»>óšÕ)G,?Ñ'»D"Ew9m‚‚p´Kc°}±ÎDâöJï§;c”GÂ?îŒÆ*5g4VÏMŒ‹X;RÍU9¯à×<ª¤ÈOF’‰„»Rà…REÊì7uçÐâL‹'|èÇçØþ=d p®€í˜k@:žmSOäg¢°e…¦ :e5Ž¨Éf1^鮨n«š¨£[1*Wï+ѨAº!¢\©Õ˜&M äEXû!¹’ªÑ1„¹8 @êë4dÒ3HêJVr€È‚Ü"Á姼vD@%"Ê‚Ð)¥nôÕS;¸ŽíºQ¥¬SúûÅé ôk+ý‘Î5Øœ‘ vʚ̩›0°&3"Ötðè>®(%XàCéØl”¦†éÙ ­¯~hŸåv%ZPǽç6e¤QIÄVl‡rk“éâ9Êé: ‡ÜÓ”ÇJ*+d¦¦MÚU«ò°§ Γ‚Ö$KÈii»Ê1¾<É$ÌLh½kwgP#óle1¸¹Æ»ÐâÿÆ’¾FôcÓú%¹®FéÍÖ«Yû±˜®HÖñ +Ÿû!+ÏGT;†Jî®Gê!YdåçÏ)àϨŸà„Bz~‚`‘&íe¦.'¼F# úM®+Ū¬G‰ó=ªžsj‘L˜šN5Í7),¤S +5]Ùb’Èå¹adÃË®”Œ¯Š)Îüæçúw6׊Ñd:$Ë_lè©@!–:~ñîÌði¦vŠÇÙä:¼? ã¬y#kë +7no4¶â<ø×M.þ)Ž#ú^»Üc[)„0ùÞöZFLF¦4ÎìíÁ°²Ñd…¿ñ–ôw9â¡šŒ6EZÝöc…å€ÎsÞ)ܯ~³b©w`¼¸% R·dÍêeî®øHW\¢ÍNÖ‰½ +÷®&ÕúylX‡ÆQ=Üó3"‹…È<ê+rÞ÷7û%z+iuPÕ¶kÁPXa%ˆ6îTCLY<5# 8ù”¸gÙԒߣָc†5oŠðìWL÷®xÚ (‚£zЕ°°fÌnÖíœÛÓ oOƒÇ‚¾mQ,z{§ŒºK$™sb:‹JEÂŵ‡¬´ïר5¢æ †¦ÜåüÇ]ßè/P‡Ià:ù«Üqq»q·í$”Š(tkY{±ÔF:;”W¹ùuëtßhvIwCBÙ"jÌ£ƒIx–t£©X¡”ö[/»õ­…0õñ ˜‚Ý€†Çªæ= +ªˆÎÚ•Ô˜i;‡BØ{’„A_­wC5^™ð™«/ †òÎñjé‘T‚‘Ñ«Æ*e½)œÑ¹ýínÅžé\Ôù~»±r:”S»‹RgÂÇuÇz¢71÷ã=Ö×lÙâDò/Ãìþœ >øÿ, ÿ_¹³ãÄ®_ëý¿Yÿ1~üÅ¿ùñßÿÛ?°òãßþû?þñýø‹÷—ÿå¯ÿô§?üãßÿî/ÿ÷ïþÓ_ÿíßÿî·ü‡ÿû»?þÏßý‡¿ùÛ?ýÇüãÿù‡ôû_ü×?üÃþúOø›ß­Cütr÷ë ~E,à?ó¿PØõI•V‚vàÔ‹.ɽÆtd-\ˬ,\™{®¾Ñ£v øªFh—µ)›d­:„ >ÿR‘*‹eå_•¤¿¾U(XSoäïOØ`®UÀg5–Z °¿ÛQb)­Ö{|FU¥ÝŸÅŽL´Õ<üÚÚ±¨#‚¹Xõ½Ú +ê•54µ±á-â‹‘Oµ!ØT„G4oWDkÎb}¿(ekÞ:„¾Ñö¸Ò™s/*2ž‡¶Ø&:ib±²¿H½× lD»hõ)³‘â_ò³z"„š®}´²»0÷ÞÿV}]RyûZy[Yë,6\–Ö,ªò4~ÔÈ‹]‰€°"X DÑ(a5{:믜d6„’•úgµÜ,ì+2#+dÝB4DîOE¬ +q ‡?­´¯ÈÉŠµµßÓ¦ª4WÍUlŸ.¬y +(ÐP8t¥NˆüþÊ»’žÁÿ¨‚ÊoD—îDܵ…—ÐVØùv•CÅyåØktm[¼ñ²N¸žÆºE o:§& .¨€DuâëYP îˆò_ˆ¬Ü¹‹ìêJ¢æ¦QT>m¹è“¨­Y(>ànÈß ¸A>ÄDÙÖ/O­ˆ5£Ósº^ûw4F£L-@–úZTR«è9O\tˆXK½ ‹–©ŸU΀)pJ:‘“Œ½û+Î-]´„x.øyU½Òôñ}¾Z<^Ðéeïþ=Èõúáz]žµ%4ÜY/êÑ]¼äY‘ô Tƒ:>7xî ›÷_ÝÉÖE¯ÄâŒ=!l#pÇànÖà·Cнêò¯/é1tu#– è–ÙËÉkEf*‹–ŸÓêÔ¯ˆl§Œ>Šgä×­éûˆh˜hWd¸þ:Љ¸Œ×¾•Å6mCŽînHK‰X¿M%TêI¡þND‡€Ö1kßè}çH]Ž¹-ºo3] ï0m*wÚ0ÈR³ ›„Y†´ãÏA8T!úºÕçóL>¢®(Mz$›W…Ñ߈©)æ^±°5£à‘X®¦áØM§Ã{„GB…gŠõùð¬¿Ù¬?¨‹3LcètjÍÞð©ü&â»÷ø#„éº!3—7ØgR;ˆ=118ÐøÁ÷È›ïë°H;€=ä•A°PÍh™eBÝ°FÛÂÚQKãÖ•$ÕGÓ“TÈâ?y6)e<°”·;70 ¬_7½Œ¨­©È FëàôŽ¬}(òù€R,[Ì—få= q¦‘Aƒ»h"Tj_ãÛÔõ‘ù´‹°¾ ˆžØˆ‰“¾…:‹0y¢ênç‡Ë½Ö£ (‹0.pšEŒÌ먎]1Ô]·=•[…òs~F8ˆ–x[“=ñÝ~*ÊØÀÀ›%Èèsña’±ÉXÎñu^ñܬ,>~¿S#ªPUkû˜·£Ö;ÚÜ … +"N}÷T2¸wò4’<ýËIØ“šGSà,CÐÎZÑ£ ™Òछ4/z^!Ìà Æ‹j¡`0kĸµÊ?κ5¹XÆ ÏË·DyàFu#ÆxSÞ TîaelˆÛHG·¥ýQ…Ñá³g8»v H¼›ó8¬ç±2]νûGö¯ +'ÚeÃÄOèØÁxoÏÀñÂÕ‡ÚB»Ü:¼Ñ©5!”·óŸ(@§ ƒª¹{ê ° +´3TœXã" ?Ëé7yÖ0Þ×7&-MúÎ, ­9Ô!ù[B™øqæñèXÒ÷,ÈOÚ‚8~ƒ,Òê"Þ-òyjÊ‚¼s¾¢áš»êÏ,4YÄÛ&¨0~«â~ýæñ„tã€7@®¤lö† Íh5äçRÊ®„ŽÀ^w/-î(E£c27ÙU”‚Ë×0%ê4o¢6R`ÀÿÀýP_$"X\"|éè!ž9…&ëqçL6ؽ²TÞOd†ÉU¨ó”¤/A¬_RÖý¦ü ›Isù‘5ÂØxPÖþµOä·û‹:Ñ-dbZŸt¡ä0Ý­úàÊÈPú»…™0.æ7õHpÕZ¿®×¸R½TþŽúõœõàéDIkDÕ£©&㋱̆ßbÖ‰þöúy³°·¢¢·B‡B-ýRF x<ñD4ÅÛÖé_+¢[fcÿºL²ÌßõŽª{"ÉíZXøÑõˆÌq](ŸéªŒL|Då•æøúê*Ä;¦úqßz‹Èú¤T\ße§"ýÍ~ÎSM%­í+€X´åŽ#ÇADYŸó µM—“·iÊPƒ„>1¢t¥‚ö€(¬%oñŠ,ÔÎØ£@•(Ê+N§P*ßâÊÖâ³È&:6ìƒmÖÕQ¡:i[D®…_”"²~Yò3U¨\'`]2n±×[1íÍqïD„†ê7+˜³v¡+ôè®+Ï/šÿöÓO]P-î+ln–}-Fé:¯=€†5œ«¥|{x +K0nûo+!_™×ú>ãú{šÚŸièE¶æêó›íffÓ5å=ï}D¯‘ãjùaàk¥=-V¦èLhÝ·²O§=Òå© ÚÞr=1gev®š¿ï3{úsë½*º¼]¦[œG‡ŸùE_öþ¾­*­è-Ö¦­hy€Lq ÝmåÀäè6µð?Ó¶µ•çýŒW!ͮԭ?Ê7pfÜYc·Û!VçÜ7ÀÿwK;¡ÚTj’Þ^‡±^Ø{ÄFűUº«îÚɳ €#f×o¥´ÍˆSNÑA)"ÆÓ¶5lÙž'P÷ YLsSæŒkã QBâB'V„™èq‹‘[Dúe©ßÜÛ “ çIÕ>¢îyã[±«ÛF&‰‹®¤0T{iùQí…MaDGÉ5¡ï­ÎPÏ•¢‹CøØÅ‹=Ø êÝßçíøM²µÌ§äAc³¾‰‚šGïo=ô•7ÿ¨t}Á›ž Ë£íÁÝôèVù›p!aëEØ„gývïŠÜ.ËÝü|¿ 4Wr9ð59I¡¨é÷¢¨$…<Üâ˵嘤øîãçÞ0ŒÌ‚ëiè1É­Ë@ÉšJ_¥\w§A™†u¹5­>+§uA ©·ú}Ä?½M”¥‹ŠT}Ù-.çã“ák »Ö¿Ã®*G@/69éÖ0"‡tA +{®¹äiÁMä8‰37HiîVµ¡ÖjRƒËãÐœíý~"áhP]Ä¢™e¿­ï5Ë<ìÐãOǯíŸq +(øZ†äå&€sؼuFJëQäm98ìâõS4S;øÔÆV¶tæ㣭Ñ*‹õŽÞ7VúØ“ÜD N]B~üzô,@ôXÔ(d½…§¶£Ðvº“kzH¶„ ˜3œS“¾ƒFÊ«Ÿ;5Êc¦Òæ¨ë†e] IÆñ`lŽ¢- Z1UœsÛÚÆì1Þ€oy $æ¥u;ר{e`‚ióã!’Ñ¡šü1â¹FE ít±›–dJyÔH™€‹T"Xw¡ûJ×.µ£­š~gÕBR°­9ÍîhÛdáfºê9p­¹™f±ˆÒè‹wl-õ#ŸSùµ°ÌÜ5tµãåÅV"Ô§ádæ ò!ºÎ׃øy#ÂN‡DI\³ƒ¼ºä¥kcZø +Ž·PBNŽ_œSñÆo©]ò +Wz)úüf?­¨bÄb·Þ3XΡº$Ûšì2Éí-¸ó©èÂVÿ¨u>’`ý+e½ÛÖrdiî…aE@­èDSEb¬'A©)˼B;¿‰Hƒ•upžŠa¿ï Ÿ?’g3®8ÈÊk¾áa|Fü -^¯Ÿb´o¾cߌmMü–u¦F¹êˆ¸ íx«HÀmu ‹ý³ˆ,ªoýÖ®d.ßìg­œà(&FëƒiH^Ë‹ò]má"ÉR…¿}¤÷(1[Ì † :§­ÜÃǸuaWZ^ ìbûìüŒxÞ·a!…rËfæþ¼Ÿ‹Áò?ú¶7£¾õ°$Kˆ•áÙäO&óø× E,4ª°Ñcƒ‡(Ù0ãq¨Yy«£¡Ð* ÿõ«É8Mï‹7‚š´=DU:£] ´ú9ÏÂ8xFœ%ÇNw£'Ìšè +¾ƒDQ b#ÌHY’–}EÉœJ¤œr "{,ÉZ· *E×ñ(?b½Œé=_T9§ÀÅÑÿ¾ž÷M“é¢Áêù‘§ø÷7?oJèÇ9J’ôXCcÊr~0õc…Ê»•gÿQoÄZË` NWFèä#H'~Àqj‡³•ì_õ3"÷¬‹1£»ÔúÖq~Ûψ–gθ9•T¬¿‰—~ðt3”}¤·(ÅvõOæÉk{}HBG¿QCa•©<b¤Õû‚,IýŒx¾Ñ” Þ-?ï71½‹ðÀÎçŸ]bÉÖÅ€j<µÎ÷¨ë%5ÒQcæò"êu:×ÜB‹î a;´Ïa©ë="·ìRKÈ«•Ÿû!M9”_qµíÔ¬ïÔìNžê +V_õµüòÛ®•tLoˆï½ðg­Üc¯h"|º—Û§f„*­$ÂÒš;$À½‹j¶ž9g†kKŠŽÐ™ ùlìÝ1‹…mŠ©în¬æá2»Þ·íVà¿Û)ð ªÝí\èSaP9)z*`‘‰!í¦¸Â* è§‘ŔдC#æñ‘ä£ÈA5•8ö±4Š’ˆn$=… «ÅÒgù.âR’ yF¿^ íÏQ¨þžbÍ°Ÿ™Iﻬ*¨!Œ,A¡s)Ó‹í±ÌBý·?Ã×›$ŽvÆ™ëãîOYkìôuFD8(à5Ü)¬ÝäÉ`ÎG'Âæ¯Úöž½=Õ·Ž2Bv;‹Ò·Å;¶"¬¤Ùý(¼t“^VÄK÷M"‚+§W:U;ìHq¡#µÅuìÉt%“³ç{˜´Ó–MËýv}D­YsKl­±˜=mÆ)4ÐzÆ€à#­Ðl] ŽSÏ…½áõÒ¾ç‘ÞãëW´]i\5¥`¼ŒXYvÁŒY„K¢9N‹ëÒSc]i'*Ä&•˜|°‡i9¸])°¬÷l¸öÄφå~6M«º ­hµ5ms<Ç5Óâ–ù¾ý÷O3 "—ï;9zÓ Ba|1H¨vÍrß%ÂGÄ·ã{T”M.%»xk?—dÀQ…wKÛv»ÔªøVJlWnDC¨Çòñ¤—xÒmÜ}¦c>Ý„u¹Uç-ñŽllíçØÊi‚-û9­¥OÕÅ~CMmÓ)ûšPÉX£Y½­LªâokpÀ¨õ¼³¨’TûÄk¯kbÿ¯ ÿd1éÌÐÍ€v~m«ÐÎ'Ðxˬ@-éM(tZÌI1ëèR4/µ°š©Ë÷³Qe˜ +â??·Z†“çŒä‰ODÛ÷6 `5Dį)–BS±]ÑÌ? Mêz[StóIÂGoÛ9'tÝÿ&¢tËrgdZî¸6Þ[•2GZIízõÕ^*zR볘û)Jºh;#ÎT ?y€Äʱc£VFœ&ýú‚4 +•=«I + +ƒ:êØuÔ©L´/H^E¼mìÖì[SO1P\õ;ï¹îxÚCæ—%”M\Oº?Ÿ „ÛúFŠ~ =~~ +ÚÊ?£D‹'Ó$h¢R9^û·Ü°‚NŽŽ9Uf3ææD”jwŒ]ð2ÅFÄñ!Ób—O¯mNŸ†G‘ u;ÃhÐ[³š¥€»weýZ~½+Ÿ©qÄU«.æÊ@ñeR›œ@rdÐ+ȼÒ4(÷Ó9U¼å‡oãW™Ö­—0ä›Ù˜±%=|OnÙw=–ywtÊàïQ"­g„îî[X'í$…©Î` ´iá5 ŒDŠ¢4K1šh]ÂIä:÷{<ÓüƒÈxÀFr$Wš}ÁI:8"yNQuÝ‘ÌRë;둇=7„s}ìl‡¨*š²H™žÁl£‰2ÛQæXÛ)‘ŽDt5Yiæ8 g£ÏTŽ#õHÁæ9Ž> \:Tz6şܬ§$j«ìü‚÷_¨V·> ĸ-ÁWqÂn§¿f­+h•­ií¥+Wrc:XLµû‰ï\¥Ïž£NI#Š1ŽŸëNÇq»Úç{£¶]Tðnn5”ŒL.Ûˆ˜—ÐÈë *¦Àl‰ޱΠ<«L£NZü:¯F‰,/ÎYD}z$xl©+Ú•çFù + èæ׸uª3² §ª5ìÂëPäå÷èzÕ16÷õåðÜO kTDž1ûý&a‚3Öô*ÀgýNG ¤Øèß?J`Q"ŒG3ž÷“rÿZ‰t +L2¤Ïíî|ýò®_+¤2¿isÙŸÑ°í"„IFª;B0œfwÝ%|kSDȤÞ×Óé½w£ªmÛ´nehð«¢7MÄe ê’­íƈí`Å¿ªÛ[Èéëk—>¦(Qî¨OI4R"‡¢Àzõ×ß½e(­©d5”©¸]èSì­æ{š~Ôd©}Fäá¼¥mŸû¦žìDŠ³{*J¾Ø–SýàKÐöK°±]A,AÙ^LytW=ݹO®Ò(§¸í¥üu`À½ç (Ò[Äï7 +Îî‹.1ß ‰:EAݬA•Í£žb(ŠiÌò ”¶ˆÅ‡û)ˆ%+õuÓqÀAM‘^ôë.ˆ+‚"~¿s%ÈO×!õ›ý L’§  ~…T0r­¨«“Ý{*àíIøi[t-kt-…jÁ8oZp¬Ü‚Ðß oœëóœ@œX½ôcœxx&V`QŸJ¾½ï‰˜‹é‹á¯Gëüл¯2,Nág½3nñpïsßî–ÛýXŠÕ`qò¨Ë#z†+ 4vDP %‚f¥bV8!NuÉÄæXk¡ à$a»¾Ž”{·ÞOƒÏ°¢Ž²ÏÙ&›[EN9“$¬wJ u3–>îÄé‹}ÒxV×37@àñ¢1…®)ýYÞx0ÐݘzàtâОýà…Î]iÁç8oAÊñö9^csìEö÷vªW¥¼² + °^zÚYllÝOÈ£—ro{é¡í]×;DÜQôÑ¥ÀÒ8t‡RæY*ã+,ï”{Gš$0¸5kZÞˆA´±íÓ5…°&»è!Ë+§ô¤(Ḟ·ÔbÂÌt5%K2rzcÉN\C·X5KR|¨-W‚|T’$ç¡ÏÄ[DÐOsC˪àÍoöSOW 7À‚(â\‘ãvÊ[ÿÁ÷%üvê ¸ôuÇBq ö…Abê_ç²ò-Ò Ðø"‰{'QòšTÔGP•›öƃM;Õnà‚¯Ö÷FñÆôeÚðçÖØìR¶b¹ / +¹i»>Àú:4¢¼ÖÀ³ÕŠ âÍ ¨·­ÍA~ ëO…,6›šÉ+".#”kNŸ„#(U ñQÁ”"ñx·Í­Eõ¢Ï@1ħõ>ä@pGc˜1èJ~ŠÕs›4U¸7¦0ÌÏ|›ö!Ôêž}ÛÌ´ö‘̤‡'•ùí~VÎ @x­ó‘iñüUÑü\)ì”=¸ž3Ù]ž‡ºòìc×àVTðn÷Öq{ú«}>vÛÁ™‰>0CènݨªíR¦c²?Jw7ÌcÛgD¯Å¸µ&¦ñP?¢ÊŒ¨#¹':7ëuÞ,¤­•®x“°­bØ}'˜ÿïEnY¡ª?øLÏòÍ~(ÞŠEªÖÓgtSCÞuð÷ˆ©9ë÷¨5Ž…Ö°Æ [¹(›Ú !°šƒH`ü{Á™À±dH)J6;/¡¦ §I‘#(ŽˆA´@¿ÐÂeÀ¢ž2¨òÒãÕd ƒ9Ïõù‰TfÛH?@#fHäTÇxmÀ€açÁQnM¦éÈói¶KyÚçZ'¨@{‘ç¡Š*ÈÓôÝ~é` +‚m|#TU¥”Q~¬÷zËûŸÓ¥™©cà5¾ 9j·öFôŒXLØ…oo"p}èŠ×¯SÛÃÿgÔÁ¹(m]®ŽÇ”93hƒôê‘ßfVäGßò¶—h&³V=ewïâ}}Œ®‹ôûV¬ Z+ÊOvÖÖíǯbþp ¤ÿOê»\ô_’ÎÏmàAV£&Šq ²çx;þ” "JYŒûñ;ìd9=ÝóÉ.ÍdÛfw ^FHK¨È*ÔìÃ:(íÏò¨6à)'¼…vò[3:Ѻ—A£‘„ $ŠË./ ¾ GÜÄÒ´Í0/kézÞY°VeW +òàÚzµfTèÓ·¼~|hñÁ2•¶š¤Š—ÛCƒæ^R²[ŒJ³ýÅþ©ºÕD?%{Péì“X"ÐåñL¼@ä•«„39}Lëô™Èöþ‡º(|Õ¶:!?Þñ„LG?y£¶¹E½9B5ªÀ“Yhs +ÕPà¦N™—•*@” Ò|S‡ÚNƬ¨Ñè.œ½m'ó"•´ø±É¥5Í:K#îcß +´JÑT_ñ••84m¨` Ž§rPþ]ìØÚNà1+ À?7„°DÁ–þe]$8+CK‰R6y4VUýrƒ*þ  ItŽ*ãÊ tûتOæfÔ±7jéFù¤ïe¡i=µpk;búóCÏ%aªË©C¿#tNúLb¬ØȺèëvŒOܵ}⎾•L¦°‹(=Á T6Êxîµ3*ÑèjÉ»Ú×>XŠ¨3(ž”¹4Ì3ˆ%÷±…Pl\0Ç6 QŠÂù)NVàœØ<šùÁcx®àŽüÿJŒZS +ï³ù±¡øMEWG‰#ûÕ2Ÿ`Ò¬…`gU^/æ¨ß_á#´iPë©iZ£Ø5ãüzOÞaʪ¬jØ_#f^«&ñ^<ôÌÅèÊОÀº÷¬¨¹8 ®Ñ¨©)Âd 4”ÀB¤Ç0»1‚’±Õä«lŠ†£DÂw£tÔtÞ®Îð +*úFȇ^ëÁ¶•‡Èzús#òB×.æê°×tÉ»œR–=lŒ€©Ü›]ynv%/Kz*÷£özljÃà©‚SÔ’E½ÄýEhÑÌÐrÙòW“-ß k³‘û¡ ]¹Åû‚^ãˈ>!#R˜l©Ççt¿›®Á·Þ€LE§’wh®!¡‚øÄõ\Ùù-I 6º$5ÇYRÖ ¯éjùZ%¬Ñ7©O›q_NªÙnHúÄljúäÊ·o,Ôµ˜Í5Q{R¿oež@u0üÿ”yÚävñ©{i¥L½AâÛ&†(¹a/úû$>‹³øóµß$£õÏS,s×…[ÞÖ-}u³$XP>^Œ³m|'­.œÔÀn “݉×åÌwnÁèÊ‘ˆ&Hå¦ ¢Ve˜žÍùu L}}M3¾|i8â—½ñX±lr»&·œ•'RºÃ +ŠÜ¸¶e”8Î&ò¼¯3àÜ TS9"Ĉjl'r)·¢$h/ÒD¬blEÞ6Ò»é³dív¦I¾î¬jµ¾['ä)Ô£wÂ,ÍU5À[,D¤9’'Õ{£>@{éhŸ¬¤æs‹´µÛ£E^Q£º°³Ñ¡x­„ìuê' ;»#0ÙÃÿbŒœK2vÄt<™œF/ç àßÍ©]qç \³¯Ú‹îžÖ)'pœ[&TÅ̃ö“:#Ç€ÞŸè-±Ü.]ŸZßPLKå\ë]–šG‰š{G3åW?ßþ¿FjO@Þï&®¸ø†Ê 6õÔ¿ÛQ¸}P¡²©f6ÒP º84àîEC£VÀ~p½Ô–7 7…¤f·°ÏHxÃþ~±PS2*Ðü›Q…ûwQµóªy*††Rà$+bå%§W¨axÆâ]‘å›}¬ׇïzoT z€%vmBŸØ×-Ét À€$ÐÞî#»o µsœU„ ®u/T²]¶.´ª[ýÜÂʤú¦«e k¶žpL†¢Åƒ‡9‚|%”^\Wü“0J~$ˆ*¨c5œÒÎ$¶ÖôVY9èà'õ£0e¿suÄšŠÌF(‰{Ù›" õ2¿ŽÃ² j DÙÒF#’^!¿:[©[©væT~^¿¤ßœÆK"ž~Þâ`Âyî +ÿn(Ú çi×.ÛŸ)Û›ƒ^q¦^{ià@?·'Øv¸¤ø÷êRõ{6ÛñºÎÚÖݧhÔ@õ¬2kÒIº}œÖn+hq©»tɪ¶%ûAòøví€wg%¶Ç©Þñ÷Ž€A}ønçÚY½ËÍ8erXD6éfY|ëÄÒØ5Á;Ês¤u7ð礴¸ì‰RDŠ†5Uû“õgÛM+B8P3áKHo€å)÷^¹Ê³=Vöô*T¯ì”ü40›d ¬ž··Æjè©9øŽP\Ì€=á.EIÚ (ÍŸ_=ÐûVÍ]äˆQXsƒì¬ö@gP+u>Ú^`sËÖiÞ{³æl¤•*Ë4…ÿž½B±XÃè¿V3´±Æ̨Ì+s8Oÿhû¨<*ŽÚöe‘LõÏXE+\ÁšèÃÀH#Ì>X¯u+ÀÓ®‰]EΈ®â@u¡SL,ÔîÎ[†y±çÎðéÑo«+†­g 3‚"ƺ7¾ªcƒª˜ÅiòL€}1Ilåk¿Ò+©Lc³PKB ñxEU~9ù$Ž4×bC8# ‚Ê&×Yý :‚4ê£h©5\ôÏ.zdGÚNe×ÇH­}}Œ}š“¦i@V§­9Ôûg:Î-Å!xŸeC'/•××Ïñ¼‰ Ù=:;¸t¿£óØÎcṳ̂۩çm3Ói˜u)B.• ’KÕ.ë_¤e'ߟvn-¸¸ÌðRhË‹±åè<ªóFâ?éqÀr"©Teneß’ÕvçýÂêVÙùàXo2pz foìuäÊ1†|F²ãµÌ¿Ð­íj¬œF tàGl@ñ.C^³?ÚjFQ¬9¡8Q$Üý]s—µaÍ’q˜²ª§[ý<…Èâ<õ4µ¤ðÊð,J$=ÉóJžàïò« +¶èãw[ ö´jÙ²_ìŸp´zük¸1ùÉ•IPÐcFÐveòkQ€D î‘Âé{Íõüjjóç\ÖTŒMHt×»@ã»Ôµ¿ÖÂ,ÍM¤ +MÄy@âR9ëNò¤5/¹6ðvÞa/±]×x@ÌT7 ¤f‡ösÓZÀY¿ßGZ+P}TRÔÖš ÏZ¶´P£Ÿ¢¶ÈµIÖÊÞFÈÈA‡<âê×VºF9ôQqðUÇs=6™·×>ã5ÏÉäšK´¶Ç¹(UÞX$Tf!¤ÓØê—š(ìïãœZÍâÝ>¢,„JSmžzÝ"èÚ(MQ¯xW“/[´cíNaêpÎúæœ=DäÀª"êÉàó!ìjö7ËCaýc½&M1¢¦1R Í”‘T9ÒÚÌÓ]VÖ«•ô@\ä.°0‹4’Z0õY p…DŸ[;i¥Íè’sÔå›äú×q¦F¿ 6ŸÙ(1œ(ºwÓì˜%y¾·ž¥ËLD’,I%Bû2¤/]9÷í¸Tk N•eTR¾ñóN]‰âÕ°r߶ +ºˆú!†VÁI >M„/üõ2öð/GH¦™“¦ gEzŽ6n³øªõåmªÙЦTã‘ú0ñ€ÓF£äÑf‡ÉžKÚnàÌ.¥2ÖºIÔRJíŸ|=Öâ»}?B÷…®ï£UBA•\¨#dELäØöp´EÇFÃ"€„îta +ä|y0ëŽöäúÔÄ»¾5ý·ÜðtñŠ›gðóôQX£¿ ËõWobÁyc#F*=ŸÅжðú¢T†\k÷fJO¾²ßÀéËU‹”3Ž®Ê¼òÝ<*au×'«F‚ž{†@¼\°™èv²ª¼—yÅö© ©Áë]\Éÿ)¸ºIòY/rÙnÉÊ%+-µf·©a|·k + +I5sR‹‚³è»`ôM<€ê]ÀÛT²>`ÄZê%ѯd®”¯bN–¶^±á*®ã±žÅTË‚_hxú® œ?¸¦T@ÆÃFâÅÙGj¤¢¤G3ÖÛQÜ’ÛŒJïsóî‡Å)Y¾F˜¯£ÙYRœ29£¾ul³º]¿šy5õ'ŦÇQÈå×M¯=ÆÆ×9æcÆ4§Ìí[(>{ÿWš'Åæ]Z²¹„s7€¬Êšžx \Û÷Q=®vo-1·6SdzñƉ½=+¹G i=™qÅ;\2?Ž¬—S8Õ_©F‘ +„= +œ#ßjÒ"ž(­Þ&›h¤{ÏöšmèqÊ—ž)ݾĈó²ˆBØ슺ŠYy›‹ôzfð³Ô…HݲV|­ü¬ã9ÞÔÒS#\ï±# š®ˆ¥«r  ðíq)ï3fæ6*ü±îÖ°ë{Å´ÐæÕdß•EåúæKt½ÆÖ}"h¦¶•<×ðÎÇgku|êÑEöùä:ÿS㈠Rì×ÊW£¹r¤¬¼NFƒ4öv\åÙÄÿÏ\ž\Žu? öÐ.:R%1Hk´Cïµé%:ˆ¥ŠPÌ5ÕÓ ¯ ¿½ÞK '§°lkýô|NtÜÊî&­œ`2?aT:7rKSÞæ§}©×zÎfFAŠ¨S 'õ¥° ã ÔÜ—´µè9E–îQ°„æØÏ%j¥^ôáŠé¹Ã|ƒÁ<Ú<‘¯8…ϤcÄšYáܺÂtÎב„²¯¨fÑl'¼Ç=îPU5j[b†hçð‰páC†ÏÜf2èùr ûµ^_£(øw_ň­WðxÅ29 +¾`­z¦‹#ZÝÖHÖ&–è,A‡¢Uãž$wK‘ÙåÛL{>Î;¼=ªJ­×™=[j˜j«ÝqdåÈå¾B‡²'0#qwøD˜=žüëØ U„Uõ{±”‚R@ƒšƒ <åk²X+wö£½Á¡Nþz) ÷"ß¿N ­k×5”מWöØó(" u+Â<¸íÒÔâ~¼¿”lŠÚu¨˜T#R5»JÀ!D˜¤ õ”4ÐŽ^Q@\e'„U "ú]ÙkHÁ äs. +>áŸuïÒÒ5|Êÿ¦7Ó)TÍî¯ÑÎæ@m-áMö==ßÃNÈ­àÝ ~¨Û°ãºÆˆ´:âhH«#øJöéŠ\{þ@Y;Úߺîœ&ñ”ÓV&B°r¶¨2jƒˆM†ªÔ=êäº 3ÖÑ}„ó~<¶?èÎ7QÙ+í9µÚ^‰TÝo¯3Â[¿³þµé׌‘|OŒuÀ€X=á@o·€W戚S²@Uÿé²]çõ‹é,¨@d×nŽ²×ŒwxÕŒ¡Ûw'mBvQ}±É:†®o=æªkóY%6Ít=OÅï)Cø¹›tg‚±Óï—…£çÒÇ3£pNñà|Š79÷OCÒ;µQ¾Up|Šßæ1 €W\Ù™’”û­qg†¢*<ßm1E6mjÎð’BÕ”xÛàd °¿YP`ñ~z6Þ.›¬©EÊAnuƒ•Ð>†õ½ÁõPÒ·Š¹vj*ZxÌÍVGÇD{ÝÇã _´uÿi×üdê £ÑAVÍHèÁï,2žYbäÝîj³<£?÷’(«[ÔfpÙ¥=%®o£˜õ„‡¡;·Ì´ó‰À+™ˆ×‘$¢Pô»v„®±ŒíëH$]Œ4ši^@%HÔéÀ0ζ¢l±­$¢ÐMç¢çT6¤u£‰9YL“žãЦ$Ô¯ÐØqe7E:3*{®šè*4xh Ê¨ Ê;â×҇ʊR(ˆ†ì]CgIp¼âñ@^†Çƒ…ö{ÃÚ¡ô˜jcd\°"½ÊòO=4¦g˜‚VÀnS»¢cú"#ùqb¬t <Ž‰Ä Pd”KïMÿ¯Aƒ¡š\,6ªw)Ô›&vc˜’_Äå±%A)ó¼Þ§x(´À9E"Á$” šÔùìÞÀzNfÕ§ÕŠ5wpÈúÆ•‚ŸV‘¾bãçÍòúrN$JùÍ£ÂGÂü Ôé‘úXf0„›x[OE>ù»°×ƒÎ]YÞ]ñ‡-»>® ½òb6KSܲÄyêåààÓÉ›+¸á²ü#-Tɶ诟-J;ÂåÉ^û´²³fÔD3*L¶Ò† +’@°Þ*®3Õ‹O(¢KˆðÏ|ðg8ù3" ë‡óY©¢ÚؾnjtáÆÔŠ³[®P–ÄœÓñ6Nhë¢MÐ-g +Ô&£¬Wô“q¥Ê eµ¡Hb(5„±€ +àIù½5éÃױ͎1«=Ÿu*úŠ ­Ôu‰ ÓŽtDsÿ=`E9Ô@xeÄôÊ©·m™ä¡Š¾89Îù0TåŸpc!¶( 0~Cæ +Gp2€“FLé&×®{Ò5*äTÒmh´È,<4Eº¦ŒdôòŽØÜŽ”DikÞ-’Œk‚SÐñ(`'€M‰Œ¤Ú‘·|X¿…ÿÄRêÅÛ”ÓHà5ê©ç®ó9RX =Õ(î+—¥66g¾j"Š6QãÜ”ïaY¦Gr¨ÔÀvQŠÕ‹œâªe¹;Cg {Å…W + ü`ÒøÅŒßZ¤2² ¹IØsÀºÔXxtÒŽÀÕŠÂ:¦Mù4Qªg )Û›‰œUdTÛM| Ìd@”&άQJWBÂÄ~:÷&Á“Vù «´jETfÛ^ÕûMÏEñ¹†—³:û |-ÓúËPàÚêÂåö+ke?[¬ÂG´†.áa…åKÈú’á`h0³}»ÿþ×;G{á9P&M^ÎÍ÷á{«yГ«FP®4 iX¤HšŒí½Ôìp­]”G‘óhÝ©¼Î*œên]É°ÐcÞëêªåí‹ó›¡0“JNEPîˆ3‚¸º$Á}¤­´[Ï­4ÒGSDï\‘²qÕä§kµ–Ý(«Öý2±Þ\_&£&ý…Ž'7—Ä~ËFÈ%ˆê-y'UêèCB6¨Ç×y:ŒVêÈpZ˜O!zó‡v¾æA¿ÖòqƵ“ê…6`ôCQâÑlÒ,?8šÀTáØy7»¨òÞo±èMG’WF%ý€²ó`èÓº !š$*cˆZÐ+Ñž'ÈJjæïëQÃpJ¹VÓ,X¬jÙ\êç}MíŒxÕ¨°GŠb‘!°,,ýÂN¸gÔwXGPßPñµ[Hí‹<šÃšúÊÃx&Æ£Al>tx×5b¹ Û†& &Ù¯cÂüϲHe\ùëêe×t)%1@2øë(ž²æÎq§Ûé 凙 I1Ö õMåGm'_Vt(¨ˆ„ÓT¾T¦<ô±V#@R­§Sûì°*ønìÕ0Ôg±©ýƒDnIW`àØŠ*Šø«zÔË´¼¡5G³O1„ë*Ñ3®Ö!OÐæâ¥Õê ÉÖw—"ã0ƒ79³å\Ž˜Þ¥§9x"õÅYn)J$Ä¡èÔûti (÷…½Á#€ºÕ —Ö&¦]÷õ¡Ÿ)OX?@2Œì&+ÊŽàòŒ€D¯êX Þtc¤:·M®h°Ì.¸°öpe*˜X½’¾Õ7¥ƒ¬¡Ëz¦=ÆDËJsF$q4å¨YÀE äì:ã“}¿hRÒSox£,|ÓX9ÚVáVr]jKÀIqØÎ˹ï]W®_'ßD¨CëÛ“ßÉhF©EP5®ÚVjµî@j 8O°l(˜Ž+‚è¶+@Ì0µ79A0Q¥ö‡(rspP¥«y±'|*Æ„šî·CرFšzGÐ$Õ¨ËzÜô ˆ"èÌU’êR¸ïGÚu + nopQáƒt“Èz)%L•ÜOø +’dwWâw“ƒ)ê’߬7_Gz@ø¸cá9Ì·ÊÛÄÔšï¸3ÊC¯êJ*–,lbÞ5¤Ÿ±ô@Ý‚aƒùû&k¬{‰2‚ rHÕ— º°£ÿ}R9#‚>>L®1éž›â¡Õ|Àœûb Àádh¹„ƨËw Òo}…!¾„ª¿E6æ%\·G-€ÍmÕçºS'YiåªÎÿˆ‚¡Ýˆ{ð_²šשüÀq«Å“+v•>Q·Ÿ™ÏoäÚ0 ¬á¸4Ç[_§:¥ü÷ T[Sɨ±çŽ.>Y˦Ë×8¢k·%K(QO2½¿djGj¨ÊÝo«Æx¢ŠëˆgºkÉC Ñ‘ˆCs¨6-¹ãªž3Ð8+Òy!A< +ÿsGëLt+Q[z$üy¶œ'}ó Lv¹aáÑô,d3_Ã¥VƒDSœÔ%O½ŽÓëbµÕ¼6‚·’ ÔuM…¹q÷h=¦ÿvÅœ‚Çß0dE$dO€dAªÁhqÅJçò2I=È÷¹}&|«†»¾¼úìÊAðîm7é Ã\ÜÇÐö4ˆÊ„§vD˜ +Ë­2‘ Ú,à_¥Š›PÊ‹µÖÅõÿ„åfeŽÆÜå6dHú¢ù +âM>ÿ±ÅL.™Bqyûí ²à„ý€ŽÁÇÖ¨å¨[ê®ÈM§ +SŽä +=P.eúxZq hY1ñó…> +±WÌ(këµ#µ›.ˆf‹á,ìok,šÑ"¸pë3{ìu:’×£ °‡–ëÿzlŽÁŠÜd­$+]’Dš“r$bÊ¥F¸5«¶$ÓõϨ0Q{f‰€‡ ù…d/<8ê4X‰v™¨0æ§âØò>\­Él]×[ÁZꀲvU6¶^ýä†ÐO¿ë8ìwME£ +aìC¸Ì±!àÿc/d¥VtðkØmaGTÐ+aÞH.\c/…¢žêV7+唊¬0h2h™ÖìŒ-É$Îkk·Ó­·5F¶Zä÷Ö~Zª%'Œmy§"@N{Ø,è +IBL“JÇ£ôÁÌGR¸Î¢Õ²Eäig•fal¿NÀÇRÅ^Ú_(ö‚÷Ò‚êVÁƒÌíålß÷ÎF+úöí@WýÖæ<ô:é¼ëä®LÇfðõ©«ÊÊ‚7Ì(œáy6×Îz<ÿ®;`€à4ËÎóñºê.²s*;¿ÈxƒéñKœ}­ßi[,H›‘mMoåÜ‹™‰ËáK@ëÚ9§JºÊ´}q +Z'\Ÿæ %©9mx »±æ ¥ñ ‚(ˆž\'Žèó3`rý0O…9ÌGÐF°@À¼~€R|˜S˜P¢GI–éÝ"Ɇœ=0yh£—¯_¡™ª~Wmnyþ¦á—¾V¦DöŠîxêJß™Ûhf®m]˜õAÑ@ǹòë5núk]ø`ç÷)‡Ÿ&\:óÃo­ G"‚ F…hb HàÖw~´"ƒR¥GîE±¹°®-¦Tkšr7r~ˆ¸¼´±.ƒuòkÓvëŽ!ýa†Ðj›‰˜è0Xî'UG1mcû-\gûnCÛÈùJóý=ÊÎ7ä~péfoHfNOçtöÀœ®¨Nú‹:O^ãÚçŽØøŸVãFô¾ÍîÁm ×äbjOkDŸ½nÿîEýˆ‚ŽnëQÀQœŠŸ*ÿUJ¢áÜZ7,]©9>¥!u“nèn ZJË’Æõ7*Ôßæö°¾…ÞïµñF!´™ªÛ¨ ÐÖ:µ»Ž74…9ªœüîl° ‰º*4‹»Ï‡ÄFú˜0àªÂîM^•Ìõ´Ô*öíØ È¶Á¢Ü +–ŸõÌ‚‘ §Âr¼`×~Ó§½oð¸·^`GIÛêVÌ!ßX}¾å©o“úì,˜ ¯ÄúÉ-ž}F¤*þÇFƒV©&“ýȳþM÷ýÌ;E©L +¾%—q8ˆŽöÈ­e½ò¢ùš(}ãùØÛ9·KŸŠÌUn‰ÓTjx e-ÿú“ÎMƒù×èE9Xq§«P"ý¸lØ39ø­T)Ù»L…J7µ-w0þç#¥2mjŽ]¬kFkÖRú^‹”µHª=”ë^ÌÏJœZ°R¹e„á¨Â’áåÒtïÐ)s$ÑÈÁ—IŠiǃh½Z6+J®¢QG ù +<¡¥¶-•EºÊìm«xGþ¹žº>:犘­>âò·jl YZŒ].;ʔޫâï=ææÜÒâ4å´#e½™œñ '1¹Ç®—Ši„™w¿ÜV-¥¯$éÈLÜtI[+ªóˆ*¹æ'Ör–wû6Y˺ +ú‰ì«5W¥n½XñR±(\x“©´3¦Q4C‰BË‘ºÐÄ„ªÞ½š5ÅYI+¢÷‘1™´»0®ÌJzè´“õ#Jba‰ÒäÚpÔ}€óRggœ. 7Ï1€:¤›–{úlŠ®¡0Ù;0Ø|TÆ]±[;Q`R RQ!â×>—ßþ?Q &ÊÙ®ûQð7QŠrÔóq +ñ'!†&µñC@͈ê·@%ê]—DH‡t‡Ä&¢¨¢®˜G¤uƒeZùn_H¬Æ‰Š. H%Ñd°dzu?ªúæ,=ÒóÁ\Ñ«­û§ˆ q€ãÕLm¶žß1Ãv/ +p§ON¡p:Udt÷n +Qêñw"ªmyý:$¬}D¤ÊTwG”Ov~³›”9£9úŒ=¬_3·© D´­"ŸÑ£áÓ¼[É¢RûàAˆ¢pÐm@ÂeE)6HóÞþºŽÇÖ©'Â~€»cÊu@m$‚‘uhÅñ ‹³#ödHøG‰HÑ™uÙOÖW’Œ÷‘`«¬ˆ)IB÷­ñØZÐEÍ ×Dõë«)–F¦öPè™!’à¡èrJ@ÏJÛ¼lHšbÚ?2‹Òµï(bJ=µ,|Í©”]o›{%’2Áh5€­CåmŽ{çà”ˆižNú—õÛ’š¦d1ÔÂýB¼GÍöT±†oOÜ#>öÅ'a«a¯ÆnRqó±¶Ú(ýz®¹ãØú¸K«c<“ñ Ç]DAZMQrF]äìÈnö3¹Õnª­U#)ƨŠ(OæN#rW'Æl#jŠJðIQûu$pL·Â|ÔPÁ»QcÍI9’E¿Ñô4 bäE‡¡R¹êf‘#å½Ò—þˆ::åxËY¦ƒaÉ“W¥œh~¥ƒ¸nµü|îý­×Û{ĦŸ^ÖŽS½Ï¨ccÖXT÷½ïÖÉÉȱ)® +¶‘æ§JÊûßó"o/ìÂý€üþk°¯„Ñ^6Í>6˜öA޹ȽãÖ(4ef,JÕ¦ñQÞi¡N»Ñy•ÊS¶ BΑ&\ÃZ} É@^LJíì"|`õçaC‚-ÁfpÏÁfD½ûýu yž²Y¹ÓÀÙ|z~mgNàbôN*,/78ÂÒ$:W bÅfÔ¹… •¦ˆr§F¸Þ)¡+j8é¢"¾{¬ª²Z¹g:ÚCÏBLnu PUT¥"ÈƲšŠŽ(îmì%´ÕQ’,…Ó\eº¬i·Í&ãšmí¨ÁÃµÒ +Ïk­LºuçWòÚ[z¸dÜD|Ùº"Ѿ¶uîWÅ{J-3Ð4Vô0^ϾæÉœ7e"z™¢ èÒÁO:@Ó5Á¥Õ\0ËçYU9¸7̽’ü~='ús.’ *)ï³¾Òj§P 8­Ê{ ¿¬´@ìh¨ø;™mÕÙ?*Ò(¥´Ž¡ÑÖd± ŽZìjº®_Eƾá<±WÓÍÐ:cö ÑÙˆâèédW±<Ý…é1¢Óc‚ö‹~u›Õ¡ÎÎC7DS®ï*¼Q¤kÝFI>H¹À ܨkíÛ¯08 q>NOq@1êÝ cÎ/Ž™`àÑ÷ØV¨,€´TöžšûH> –ÙDƪS¹¶|;€y+£4Ô:µšØ–0<õ’žƒâØV~w„ågƒ›šøþn/Ð¥æ rØFf$€Ç™ÉQL7¹Ý#Ú*…Ùµ]·z&Ê¡#Dµœ§BG^DZÑ-“liOuiÐWšÕö+VÄùàþŒ‚áITÝçèETǦƈ5ÓÁКɋ“éÔ·×D@óN›ùêÂìÔt\®¤‡Lh—°}hØà£Ðkò[¾= Lïc'$¦`¬ºQsG Æl*@†W„ ©35˜Æ +€lÖ¬v–ùƒ\q®,O7±my€7××o¨¹ÆÛAT/<‡a»Ð#â3±¶B¸ê¡Ã ÷塈Évls¤H$íºføh*‰(~b³ºûȪ×I7Ú°lfa]šÞ<û£ÁÝÔ™®J£{ÌÝRqò•çlÄØ÷cŠöèy½oœÌXÒî#ÝÔ;näðŠ/ +nÑX—2Pðûî­A ë­õ´¹Ä•/“34phëJ!Æ'ÓeÿöÑ›"ôo(Ú*P?ø Àî­šx¿t»û)FG¹A”•éÛ[ã”îhfU­ã[øP.(v»k÷ð¼VSCà}ßUõrøL)vëÍwº8²fº·3å ü‚8JGçÞPá(¶Â›“8V­¨ ¸í?zì?êkž9âX·¢„.xt×tÒWöÓ¼‚2EÂ*öæJO5Àœœ]´‘Å@ ÍõG”¨Eé}Ÿ¸Ò3òY´¦ÚdL Xd=°gUU çCh8Y¸:Þ%¢ó•¥×¢D)ð#Jý†ä–@‡bÝ +­¼éî¦ïe·õõÂ} +÷ŸQz9qVM‰ +™pL áT3ž¢›Nwy]ÉmI°ÄPèbº^J›}ëKžÛ +Ž¦º°¤þÈâ ÆÑ @nȉ HÄ£(´šÌP^ˆNi ˜VMqÃÊôÜGJözwåÄQ&¼›jÿJ,ä¡ÔýP®aADûŒ=Yrÿ\n4R«êãoÌÇë.€¥úÁÒÈÕ.E,‡Ð*,”žÉaPñüŒÀC‘Êð@iàYú|F]v2ÇÒ9¨¶›¶©e|ç̃ÿý½¯/b0q³ï Ug×_Y´c«w¢£ˆjÍš{=#­<§È¨dz³§Ü®ßîA¸êÅp9 X˜ÛÇìDÉ$Km„ÀSqæ¬æ³wlÈ©‰|üþiã ‹ûã,Êпï†ï>,]:YÉÎè wJŸßNQô=QÞC”©¨z÷ÅÇ%LèjÛ`ÞÍ Yd›Nl…h”_¸Ä·¸ÄóÕ‰xÇþ²¿wß±±Zw•¡LRÆÔ³µ2,N»È’²Ôw”ë¨I÷y¦?噹ýè]ùÞfq‹ö¯.9ïD¢ˆÚe$ÇɚÊZ½E¹fž{Ýs qREIÞôhŒ£õ#øñâAz¬ŽdWÕ¹ƒ(æD³¢OÅ Áþ{GÌD‡2bîˆúD€ö'¢Ü/“¥ãç©[Þ‘ð|lÂóöÒ"ô6šž‡Nü•/¡~çD m ÅäáA·íU±&°u7[¨â@Kp°ˆuª¢E TY…è35AZï+"6‰Z]#:Êd](xô¿iS> "M4ƒ>Ó 0ŸE†Ezß%ktÈš:Šö÷ O#Y³Mª§,'QÂÿÄ <Œ¨5”@á8‡x© kM>÷~îx¥WÁÃá‚ ýûuX>бjq+&(?¾Ð¡ìb>¸rjØ8ßmû E‘ŒyŠ¸£Æ´s-ÒÇ)¯ rÕþj*Á >C—Òsmɲ©™$wu#û±ßsjXa±Ò…ÅzËO]°`áclíÏjš_£fö±n© mÔ8_]š#ŽF‘©Ö]{†-|nþ[Ø…ž¯TÎ z\3©À\rÉRqÉâHQ¤“%\f£Ã· ¼ò‚ç eFÎø»NéÜ&<Ð×0§»cºq«Ñ +JºdF*øAzƒD 8ïРöÁ£–ôiaZ´¢ZG¨qDèè ¢©ˆJ9–ˆZx8䘞ízûÀµÉÖy0¡m˜7)¦fœz7à5g~mµ¸ ü}eÿ‘»ÅçÍO‹KþF­ÄˆBš<Qü^6îÈ{È<˜ (—Õ¡õ©X,aÚÌ8æÞs¢Áû.u”€0Ž ŽÈ=¹ïõÅêGTVŠÐÐÔ ¢©TxA¡—Mì‘",H+ß°W„H£ú](²cë”Qòë0ÖPlO•Gîê=cXè‘€Cq$—¯jh£qäv [Ej@Žˆí-Çø²“ƒ<îözGVA dàÑóhH,‘ºšFÌÌí!3¬}S•ªqsŸ¯ÆíÇ^à´2»Ñv=÷ƒÖt¨  w†©Î ÏÎ"×ýù»{õ¨ÊIš:^¿A–HòÁqÔ½kì©}Dð-Þ â+ö# +D™d´‰˜Žž¶5v• ¿>"oÔ4U‹Ça™{ÃȆÇdþµ¯ g]õ›Ÿó"ÌHÏEy‰ÃÍkCO1 +™®ñ‹·g†E3uC„ù³A sÓ7Yû¶T øRîc¡’®BÝñ‹›œ?ÅId=Åî…O‹‰We„Ú­?õó +mcïí²²ÑŒ…¿ G-ˆˆT%•‚·ÉW ^S•<ÀOF0½¡š_½£ßïPy–×é:¿TƱþgJ Å&¹k%'Ö8gH¦ ã• „Ú{³ùô¾!7÷=3ûøùkÔCX·«ƒvP Šò&šE·fíï>Åž§¸1/ŸAPC)š à}ž]D,ÚUô°H}èaÝó ‰] Üú×xai®º¡.¬„(½G §Pœ +-ît`J%- ÖEj©9ÇÀÂúFcgéÚBa¹\\NÅ\.â¢ÞßÔº?"j½¢B\9Q,6EnÌȼEN4* +E_—4¸¬CÍ5^f„Y5f¹¯pq²ŒœZŠ’×*ö–7:’!fÜw±EÁ „€YÜ BA}b¶l˜åØœ[tà*sxûÚ¦H¨%ŒC7Ș۟k8UP¨í9=÷DtÄ•<Èr ©‰j*=iLŽëë3¶ŸX!µ;‘V•xiœj*iÝÜ&}b¾Q¡Tƒã=b}óA¿o„ÑD¹Î1‡À"sIÄ긘ϑ­@Ñ'þ¤x¡´ŒNÒ—÷ˆL!#ÆU%2ßìUj…¨úâ»’ÉŸ(Dšˆ\µ~ ÞbÞ´³éì£!ò^A]vŽq1¿]ýœ[£ˆ×øAõ§©UÒû~Ö”gm™Þ½Üºb ¯à»€š‘]ä^wm®©CCñ«—U]]…Ǩ‰ämr¿ðt@T–à–°_“–ÊÐ q@È!bí¯ýÛu)»5Fõ‚4ž!B4#¹§^­ºê6¨OÖ„"ª7U½Q«ûû‘—{ G£3ð“í§ +cº"­Ç6V† §åcÃ,ûŒÁ$Aš$!Ì ¥šÜ%)À"ö=§š†%žŒÕô©‡~䑬6ßõ‘Wj«9BT,³}³Ÿ^â”±F´C%î +ƒB#קç7b£~J ö8«ŸóÈtF¡5‡5( ™Xs;Þ­Áml®lˆA ñÌË[ji„Ž’ÀXj æ } ÖÛTžý„´ÍÀxDÝ[ :[wô#ñä@?²Ž¶9üz¨P˜ÛnjÌDy}A{ñQ—ó›ýÌ-„d‹ëÜÈÞK\í<Êw“õÄJñAY½A¿ +ÓùE¦àKϹ TÔÅ“K®çÖL˜–|ü‡«öYŒÂž”5zx SúØQ‘»6¤zßAwøô“„DÓÃ9Иê kUR“B([¯é3Š5òó..»c'•ŸÃh•477³‰Ô^“!:ïê +RÙPš<,=4}¼¹•Y_ëÿHðÇçþ3KJhóA^ußÒ¨ÞÚãßÐQêÿ LòÂŽþÄ{eÐZ[î]„ø±2ºUrÏa•Ö!¬¬Æ;ð…sJ ¿r iØñí`Sks¼ß&Ö$¥ïQ«˜P;Wš4ЫÛBT2:Ô¶aÐÁ5±g‰vÖmRзIÁvƒdÇQTË…üyÊ„t)-£\%¢SÌ[‰ù¡ªáè¯#FK-ïV|å]êŠßìíú@çx:LüTߊûÓŶ¸óíh(žœàqå^q;Áõü?@G‰ƒ´Èt]ÝÐx~жFÚúf½踇i4U#”¾~ ªZÏpÌGÄa +p£[ þf?T·¥Hëe² ùÚ€è`°WýœLãÙÈIQ÷¡n³SD£SŠ¤–~]âàÊÂÛ“Î¥7V€Ã¾@;yIå½ßn¤œâ^My–€ŽY¬ wO…¤á!†TÐý¸ˆu~ü:Æîωè“kÿÏòíÿ•;;0«ï¿¤Ðû³þcüø‹óã¿ÿ·þ`åÇ¿ý÷üãÿúñÿî/ÿË_ÿéOøÇ¿ÿÝ_þïßý§¿þÛ¿ÿÝoÿøÿ÷wüŸ¿ûó·úÿøÇÿó9è÷¿ø¯ø‡?üõŸþð7¿[‡øéäî×üŠ,Àæá®1~PjC¹üJ%§6Wxþ±†G½‚uÕCw€ÂÕ7òOJ櫈ã7íõöà ÖÌÊŽ_ÿÂK†­™QY׃âýõ­ÁÄŒTxÕÈ,fó¶ÿ.ûÜ8Qä¥MK¡©æü¡¸‘"ÇooEÈw‰AU$O'Ó(/¯yV†ktZñý…pÚcr²ô9wÆ_¿ Ä9‹ñµÍÇlhw6°p`˜7m·S²@ä*¹¬?)€}­ ±”[/ÖÄ6?½‚rŽ4‡uCkþB®1»» šRMG=JÉ1ië¤ ¢¼‹OA šöîÄ9 á”Oœž†gÛÃ>‘ý†ã$_Ü×õý!~[Üҵŋ*Ø9,¨—9…F DDµ@»¾ø´_£]±<=©c”€ÅÅGa#øJ˜v7’¼F‹uºèCÁ¦ûw)ù¡c¦‘ £dº!Œ†ÞË‹´6ªpªœÞŒXCH;ÿMbMèàMû?Âßshs±ý¢"œr`®ãv½Uê1ÙCÃÍ’›²ÿ™!z¿¤ùv7 + ^mc…16øiÃ¥&ÿ¥‚fnÈkµZþ˜s®2©½ACĹ¡ê…JíýsCðP|ÑßlÔÔs Ø‹Ö$ð,ó̃ª•6Ô—É(Ńº¥´ÓaB¸ëòW‡)è̇µžáI) L'Yª}õ¯Ý{ƒ}©Tt ýh ’:Ð1ìJñcf”7±Ý +ÝåM\:¹ŒµPT¬‰+®FŠm lƱ©_ZyýwZ ”—û)T=Û.e¤ÛÐ6úA»Š%gW5èHˆŸÿ(@ü°®|ßàW ®ñèŸñÍÖù'òóëß¾G0ˆåG9öX4ázdú™„!혿cé|å›-2Ù÷ $–ç´5XJ]"”n„äp¦¸^lªÛö€haƆŒ<çÖ[œ³Æ+|ÙHŧñªO+[uŠ"7ÇŠ€dø•^ +nMc—¨üòrÇHQ±Ùõ÷«o±ÅÂjûŽ8?Ü»µqM``|€æôÝ™F1êŠÝéÊÇ©‹þ½ Ÿ«ßl”Æf\Ð{¢ýÿ5 N[+ûÌŠ ({êB­›©küj=™=ÙÉég²NvßO‘O¾ŠwaѱNÄ0êæ-QÑ_+dŽç ´°îÁì3¤Ül'̺l 9 2ÌvI¾‹ï"뵂^—¤ç3–Hx‘L1öâ˜è’àá_fÄZ«X¨›Ž~d··Z´i¯Û¾H"JÙ`Ý…(<áÖdQƒtŠ§jŸƒ#Ul³8ÒšJS!e‘|¨ßš{ß ˜p`9ÐØùÒÕ¥4Ù‡œPúÑ,g¾ºìàïûg§þ1©9}¥•p×˾r©RƯ¢‚Qßï}j(éF‘Ž• |%à…åPÇDg½Ä,ÔA[—D¿¡ÿJŒ"¶³žï»îÎôëÞ¨ @Âô/ À&™˜5Ë +Ø`8KÝØ+ 5ü¤Cf 7åë0oª8²¾•qxGúŒˆŠ½r‡ qL‹iÙœ9‘¢À(†@WNu+ •} ™`“CµLÁ +ëp1Ö=¦Ö^$‹ Öìñ+ŸÀoŸïI8Œ^Gƒèt*Yu«ëv¾…·£Ú¡öʼ¢ëP·qæubîüÃýøz³Š’ÑY²j¤èTq¤bZ2 )T#®G—›(:úrYtØÑüqßîGm´0ºÖÑvð®ÔÐn”Ž!GÒ¹ïR›s©Bj°ŠC=E2k´Ö5‘H¸‘-Å\¤1è»çŠ€ü´‘cuïßD8…5@båsã@áß:yÿM›GE6ýÇ éD5%1›Ìǃi 2r¥ïmÞ~•rÛ ßÓë¯ ÊôlèŠ{ͺçWEñFºìkÁŒÝ>¥ƒ™¬ºáVï ›÷6¡§yrˆQJöÞXgSDÃQv}c Êã맟j‰ W? ¾*qÁDZû¼“y¦ogÑÛvÄ}À±ž˜Îñ4펬_F“¢NËç×ز¸_ƒ f½Ecý‡ÅêÇèiÍøþP™g²­÷¿{Y8KÎù± –U8ˆ»ô9Çòkj’ûÞ¼þVÕ„ãˆCg ½ôc=áõÚ ;*WÊÊ:I®eeö šz +Î(dzå\c7?™çþÉ©:bcøξ¼XXÔ–¾Elôgw=zž÷6ekëQ¬y‚TçŒ ’Öi mêšv@ÄEÛëޛƠ¼ïQßšËÁñö€Û³f~iQ:I5–¬"Ï:~ñ÷{»éÁßyÅkã=¢•z«©ssŽuM'ºaxD¯_M Ç¿Ùà'ˆé)´˜÷7º'˜ºݼp€¥¾6\Û÷–é{l”ñ×FÈ<ô +N-»~ÜšéÔí¾Ûtçí<™›Ü³D)j=2ŠíMüÆo³;Œ§×àƒ\Ü”îë7Oè&¡Õˆl볬‘à¯Ó(ÐNßà +b7š')ð3 ¯!º§çC:À¹¤ ýyHk^¹©2&¾µ­|EkLäp&QkjXéW«ÙÎ'í: à»HønôaË<ÁÁL {ÓN´›¦½—\ç1ÇíñY'¢È]ºQšB(Ô®7©è!b¨®Y§$Âþ°+EÀÔçéd½hùÚ탭coÚQ¨ÚÝprìL=nkúÓ\·û¹€H"`1JšNzÙÔ€ZN…dùC0ªÖ4)­gÍð@וQ¼#L§} ­¤£%Í kïUóLžÿò4ý$Àðq§…¥‰[bÚ:V¯†š¯²wQ é\OºÑidF”o=S™§6»¨s -Ì8^Äî¸P$X…œ¹!Ö8|'ñØ)9õÄßÐ(%r,' +ú®k ànJÎD0ñp¤¡eM^LDiZ-0áßý±r$ŠIŸ¾%¨à=•°@?r¤:=—Ë·¨ìPà´Ú›;ä´œþìÔg¾ƒÊñõp;)5˲ð"r5mêŸÁå#¤ÝuÏWâ(Î Ÿ‘ƒž¯çðóFáI"'9ñ€¬ÑÃÔÛh8` k‰ëŠ +Ýu>–®¤À7Ž*Ò¥Y×ÕõÇ~%8¢Á?Tœ£Úµ"‹ŒM–²#¸¨%Gnª•HëwÔ„î¬Êe×i~±r¡ó袥჊j{vM“YFÃÔ yöû3"ÕVÑW +¬‡Á[ÏôÈSgÙÚuÃ@nˆã .û3âg éóvýsª¶Ò´¾À¯"«k¢w+s½).¿×Û½VÜv Y_ѾûŒðŠ¦f´Ð^û&ª ÌŸô\9ºJ;ì +¦§ù.‚Ž‘öfÔí_+¾÷(ÑÌ ‰ØºR±¦gÙ}!Ë6´©Í¢…)âKݵþð¼oƒ/d½oµ´ë›Ý\jØc ªœß­ÒÚÈU‹q(Ãr‡ýÞ$ .€$ãxœI{F"¢'âcC ŠNÍÙŸøŠ€nD}×ÜÇ‚¤$#DhDwÓˆb°+:y¼D…‚ 0ܱ‘åî‘$“L@Û ãç8àón9„ûŠ’G•ˆ½ä@àÅù ˜ØS¯b€È ¦«kðâ|×7é5ÓGö é/ß{Ï÷^çg@Þ; –(€uü.ŠgÖ2ÏzzgÐeц󻀩'ã–Oy*ŸQoð¤‚å‘Ñ7Ù +t1õ÷Ög-deÜŸ¹e €xÝP:¹ë7û¡AuJ÷›šmÎ(¨¹SIýˆ¸›ô)ˆìÑç-J!NS…Ïø¶ÆƒèÄE}Ê (êÓ__‹€·ó“Ï€çSµtõñëŽðeŒÃÿ ÿóÏ.‚ª:ûÌ^Oåí=jÆrEÉdôY9nÞ¾³²>ÕævaOZ€ÚÞŒ!47Áò¼Gä>Q¤% +»G))ïû¹)ü¨6ªâfg}ggȼh£¼Á«.¾ÈþïÎ1ŽAY(³í1ƒÖ\§)…´À˜›6,ˆÀ?ˆê"AôeÐw{éêäbØtmAÉŒÿ¬NjLœI}‰¸" íÒÕàžÆP:ŒÚµY-.¸ŸKA¬X:ΗppáY”Ø~Õùšº5F×é‹ìó `ìÔóXŽÉû†d¢_NÕ`cWùñóžï¦¡+'wŒŽÄ!<-`j~F\R’yÙ%`?yëÏQj!PCgµ:Z”þJ-øDžJß ª-W„‚·—~ÉW¢ ŠAE—~>Iÿ±Óµ52×2·Ð?C…Û•Æ"r»ÍDÌ;¤¸z$n2cZ²çÃ7 +6ÞŠê¼PÛSgZÙ Úá´q¨•½"¬¶íXž‡ÂÝX§¯¸!”=VÄK ŠD½»:鱃åñk](lC»‘âÔq +ÑÂAÐU)”Û¿ ªrÚ¶ €ÿxÞ¿G—Žv€~á7U8Ó,TÕì6ŧH[.Ÿ¿¿ÞÞÑCn¡¶7j ÏÚBçíÛsrm   |á‡K!š•,I×…§P¸RNî„ ¥ w&ÀRÔFæųl‚ÔŸ ³é‘ðT¤ØR>D¾‰”öÌ)öOáúøýÓϲJ1;Vuo{Yw |/ŸÃ©XêS<äõMÄ·“à{”šÑvùÖ»´Ä£³ÂXEK™¶=6v­i­4ÍÏðUèøckó¦úIwk7=h§Î½ÖN!ÈmKÀ!£7ˆ˜Ód»3 +èÃz1ð{+á´V×J +PY•þ32WèWn3ê1N°^Ò0jÅ6"ˆÊ¢ Ïkƒ­Ìcd§(ü”@ý•‡@êz­\sÞÍÅЭƒýëoæaþ—òYVºÐ¸¿ž¿ ½@ùl ìΰ cohÏH_8ÏŒgo*ð¡4¯¬ÖÍÎ~Ä#$<ìf×äÄV̺ZqÇPjÎÝ!óź—¹n݈ }ðñè°…ù‡ æÅ¿…–ÉñÛ}bÅ|ïp%U †¥Á”léκä½_”Ð)òÛ—¹Å¸©¯·>œ26J„,6ÊòXcÝÀµEDE©ö–˜:Ø0Ú`ÝÿÇÞ»6[sœçy¿€ÿaIå*¼œ>÷ä(ÊVÑŠ-UÊ…‚ˆB"* +¦¬ŸçºŸîYkuÏæ Ò •˜eŠïž^³fÍôt?‡ûÐ}Pïʈz ¢ãé¤jȆ®èo‡·_§Sçû*ž‡Å*®ãI«Xö<"˜ŠºóF"Q£¿ ˆ(+¤Eë²Ë#ï%UR§öš#îæ÷N¢^šù8–o‰)X$Û-º¨gnt™(‹=ý½¸¥ʺqÂ~æAhÓN'´ã³ðÔ…b5h,Ÿè¶‚ÂÃ!OˆÁáüz"CåÕT$LFŽ™¹®¦ºŸWH{ù°9kK§@&D¬¨hTæX±=:&.¼PR–n\à©â5ê8Yý¬æwA·0ËG” 0O äJÔÈ들b¶ ¯r¢zÔý›ï:@Æœ×71¥Â‹_OÐÇ«Ló0tý[›'µ.ã-€)2Ä©Â!.Þ$v'~º3äOˆývK!ñ'¬Wš.´á u<¹XÄ’I¸\¹õEM9»%)û÷È—£à:߈ÇÇ(ùéPÄ:u‘Ÿ€V(‰´ÐmD§Õh“BTÅTk)—Âê ¾ôLµ•PnÀ€ppé}Ê@'ËÙ¿ Ôßäøg#è"©Q +“˯hø™T²¯' è‰Fš¬F‹Kß°^‡SLe=ÚQ±GtÀWG¿Œñ(^E¡ +).U=@”¤øžL ê,€)…t˜äz{J¼‘¶ºZJ€…*è$9y,gQMGÝëU %t.Ý øßGåì´@Ð_HœS@«B>¶~ÔÊiîˆEê[bŒžÛ:Ÿ+¼PVàSõ°›óh~t-û¤'v+gd‹m¹³7¹ó¤Õî£0pÕârâjlçqEãt–[K”7Tw;HøŠT×#×’Ù] áñL: “à ] &k«ÎãàÔh&0BØ¢SÒæ‘™hòÖñMÑå,]MGF)°QŽåãz$ç€X4‘#„Déøkø$¥6Íbw `cy +„U[hEÂëשܥ]sÞ¬'Ó”#h¿D^çìbl°B3ç9¡R8WQÛvTh°ð§³D<ûypÚ“2Y麔ºw-ÞŒÐ<ÈcLÎ6ŠT‹Hº#.øMWÜüŠÏ¡Y!†w§"a-%€@tɤܷør ˜Ô±ÀõT+ÿvà.ìÁlÒo^óª€Í‚Dm[LAÝ{‚CqØ ‰îPü<ð4¢Æ"KÕ”Eòî$B™$BÙÎÑjß7°Ï"›Iíë‚4Áy(àතŒàÄ6µ‚4à»T{ë|â ?m½Ó¥=EÀvËd6ÆÄŸ“Ðë@³t“°ÀXX#\…Ñ^Oñó›|s¥×!Ô@j–:ªHÙÛ¯Àª5h#¸C¡ey•Y¼ôM¤¤j¥Äˆ®5^jèGñ¼Ý©ªÝYÏO€YfŽŠâ€AâÀ “Y\òÍâí +¢3Ö«1ú2ÊæËï +Èî'­¿¢È”_4$Q…\çîIr?ðå²b“_OUxu +q—]cMúkx³1ÎòeŸÝyýÉEᢋ±ÙË ] F8lÀݨCºlÄ°dwuq-R"åæ4ˆ)t÷w8–ñ&V®ÈU‹ºˆ¯K÷/ûý›» ²G¨A:5 +Za"æiÅJtÙ±éfDG;ËFŸÅÁ[qœÃ¢T[V 2hº¾Iëq]( }’ÈfA ã‚1bØ„g…ƒþ6ý 5& 0d„½w~ŠÆÔ¢8>@8Üÿ¢ƒb2§inÿmŸb屉Cé Œ"µê8_ÚíȣѸ`ŠúmÁîsäKû(iW–ìÚ•2È¿¨!¾ö)¢Ú‡ˆjSQÑGYÿ®)…,^hÛ1<â^…+i·VŽ,‘HËA|L¨ô&´ ÔH °°[<ÿÄæ·ú f䟞ó~ð—þU¶MûºIÓ/€»eô]£y[Å6Þ€œò<€NyÕ²ay_qþumlöÏêÖmo è€ o2…lä'I4¼˜[!Cò‡PU +·¸¦ÁvžÜcBã:›ê† +ƒ5QVÚFl›ˆ—!×QØ$ 8÷zòx%+,I®m(̲œÈ- S£3#˜õê¸k Š(€iÇ €£=N·dIIR:]<Œqô~Ž…î4Æ¢7ç\•æWóÌ2Ñ>ζղÇ1 +nØì,vD›® ÚTüÜ4ÄÈ#ðs‘È +ÌyXí‰*àߌ†$”tZºÒQ£0€ú:zPv±TŠí4fm$€L5œMö’[°/«màñÓqÛ/ƒ@ëYäŒÌc ¢¯´1oÝŽRG½a‰Mò“’g·bu¸œD` ØÆéjIS4/ÒTíÜûFLut@µß¦óQ††¡$êkr©ûSÎ]ÓO9û*’€êÖÂÁ$—k8õ’Cg™Kø˜k¢¾Dñ܉Žb>S ƒ µ3ƒmhW¥Jª`/3oêoÆ(a<*¬Yð&çô¶*lÒÅkÜàÃ8¨xKÅm+ªßhDf©Mª_gFð…Òï1¡°§À:æN5´åT›öp´dW´ ÌÅɬ2^ ¨Ã1J/x”F©ÿMZ RöRiá0HK—½–l@ €.Á¬>UO%‘¢jo¿0Ȧ¤iDMðª;ÓyªõôEéTôLq¨j©éR õó¨ÃÆSdZéRôS;f|ih=øï€,a¿ƒ}eœcïSd¦gK"Ä› ýqõ«m ÌÃh¤$ä–%ADèÉzŸeìdRæo^“×@sð”ˆðéÛ†@ýå+҆׀/ áÚáÚ÷§ˆpÁÄøZYtJë„™ÀSG(^¹A@SøŠŸŠe쥊 x.ÔzÕý< Â<Ÿ.{ëM_ž„ÔŠ)ªY›Ä~—‹c¡=U4ŠˆP‡ªb£ÒmFÏHs[ýè@ÛuÔ÷g¬£Q€J3®ìßîŽ>h|Dw>QaÄFX2Lj¦ó2Ü@ú mÅÝjM&¨|ÓŒ`±Ä]ˆeÁ¶¼1Qæ7êDö¦F;ŽS’´ÿ°m›t©HÄ¥¼ 'í¼ž}9zÕЯj‘©ŸúɉÖS(VØQ«§‡5 ’ëÞ%@WMDm\½¨éxG9‘i°±Û®˜¥ÃŠñM‘aJ®–“€[6"x3SÜ ”(ùW×<ÆÝÍã>í¾°Tÿ–©+çÐÿHÇ,÷G€í’Å$2ÜkÂOÍ.åjdÑTÙQ6NÓ_#hGÔAŒFHê±f‡ˆ!F`S#(dªÚÙƒF€ûaÄ ‚S_€x´}p®f¿°–ÅÛYŒó·2¹‡…ÔpjD¢ÎùÜgÞ ÈùÈÏáºÇ@ðA&7|FóõM§Ï0 /êNh —¬2V ¡zÅ"K’‚{uŒßÔù“Ô(bÙïC©§°¦¬hóigAŸÑyÆú¼x$¬³UÿÞ ¶R+'GiLŠ‹°Xö‚>d¡êþ}±È¯ TäæµeQÿÆ°ÈcÞ¢+›&r!ŒRÓ>˹§¡R®³ ›ÁTØùq +#­ì­=îÛ4ËezûÉú6ÊÅû ˾y²ôï…P9ÆŽþ¡7ï +A]Ëeu3­Ž@N½6Ê~#u.JZjƒ þ Œ½HäË~`ÎRÝêU† ®¸Ì¨Cu¼›Ï¤Qà"pV ³ÌiÙ_Q®ÓˆÄ㊸4i Hò‘â‹ôCímÖ# Ds€´¥Iá—C?ÏÏS§4À@Öä¸ÊÇìô‡`\L}𴲟Aí(:â}ä¿ÉÚÒÆ‹BœUý~œÈÿÙfˆº8†«#øôñCDM,ÀïY}bvÏíŠ_ÚlçtèÆC,tÙ>-ÉöI7iE¶?…DÊt„šyr›(FêÒ|ƒ?±Ë­äJÒ°Ûô"IµÏ££,\hQt¡‹Ÿ,¯Ñööñ8lFv·šôâY0þ ßcGb$–µP¾a…îþ;B~xèxšª»%QQð^R9¢“spC ßD¡FJJ–7ǵ[~ÁÀ0íLŽæ#’°^‹“Ç+‚RgƒCx}ÑÙ‡vŽšbT÷Ƈ«þ,­S?+BÒœÕ2ÈÓGÀž>U¾(v9ŸJÉ8ºîZrpOÍ!Þ0F¬¹Ìa2dZP†f{ +÷¿¦\‡cõÞ¦8#M«ÞËE|!‹S$ñcçAýs„Äârû«.¥‹ýEôc;‘žˆËöö¡_»3g<’<œH *!®€ÆÕ(”Ç‚EΠè0çé$yÈŽ¶v2‚“ÎcPÿvâ™á1$ž-?F•àRk\©κ®ž(9?-ÿ!lPUšoR@³…ìŒ32†ÐÍÌ+RÝs¥Ì ¢Æî8•n-Æ8E—§®yAÍ™-ð£¯Èg?â[‰¦È™<Ë>A0³¾Qüé:§ÝmKd=VÅÈ­±º[Áñ)È{ˆ`4W/†‚§Þfš°’2*9v?n&¯¹³÷Me¤bËdõ5U~§û³¡6#‚R“°e@Ÿø$ú‹¤6=z‹ž.MGÊí.Ež‰ÄÜCâ¡;¼†üÁ•Gr#Í×È +©_4ºËùX>bÂÃcB‰N +j ªƒÔ¿ì ECÒ¯Spw¬§€¦ð‚ÿØe0Èßs&8‹ì(–°¦£®e+WÍ8‚;q°©#Iغ9pÊÖÞä[à8KH èjtýUæÅA$ªÅ¥A½8ßzuŠ¨*e²Î€i2Údh-ˆ#¥!!òrRÁ“R:õF‹>ÔnëÄC;æŽðêF¦zÂg§k¨ÚÝ0r´%(4Uн¹`ñZ!‚±ó8“r~ö&OŒj±4 &wB4G cæúÝ~´¡4:x‰È@ +1Â"Œ¢;§Lá,¹à:ÒC )xòåvÀ`¥çÎhL¡Í¨¤øQcû¶(!À½g=¯’:ƒó?Fdº ’Žt [Æý¤Á¥ÒµD§¤Ò”8PÒv£ƒõTÀ¸$¥zPtuì›DGÛHC¹{Äjc0 $íöx:zHö!¨¿¾H÷ e7šRÆȪAƈ]‹Fœ1jD?‰F@{ùä4lmØXa…•ÙH9”s¶¿“á ªC_›æ‰"˜tKxNÍN•N”Ýz®t¬ôQ©|1hóI¾ªZ)¤s§ê4;Krh„ÞâŽ0‹ªƒkPœ¯8 v÷ÚlÓŠEçøÄz˜µhÀzâd6M ­þl7HzNЇɪ3pÝ9I‹Š?Zé Ì zmEàk½UŒUe6Sß)$ë$цsJ‹$p°t/]’¦ ¨Iuì|“à_wÿjw«W×âBQ"YåÖ´”;À] `s†‡ð‹d6··þ^ ^`™*£$íœÐE”±´Š'·UÜñT§'KY®ÈÃøg…‹+j‘gÈÙl‘$ÉsYRËïte1o«asõ2<5ÆNþM# ?Œ‘‚QX³Èß„tû%Ÿ^í)€Iè‡~™Œ'0Ó˜ªù}B.Q‚DL¯ã_ßd2(´UÔ¥½»ñþ˜1w–ZŠ“U½êÛ©vùîNY’Khº¶)™À¥6$²¥?a¯5¶‚©K„ìœ=„‚8˜åÆÝ„@”*}+@L"EH•Œî²Tž˜€öÇ)bF&KŒã .‚Ÿt:u=õ=0ÍR_!í”.«{‹üG6iÏéP8NÙÖ®Eb°AF8˜Þ¹˜uS¹AbWwÅ×Y¨¿.Ä]ÁYfÑ“i‹ÑoÄöÑXà%øç´‡‚F‰.(›ýò‰Í%»¡y¯]¢ª`œü€Tó[Ú°êÛœól´Þü`AÄ–\æ”æ~ §î:²áM¤¹Á©j#Ày©DÀ~É׃p¨[6Eè~.Ž«—,©`·4¬Ð‰‡mŒJïë™ÇN§ž’–äœ!s!ÅË>‰Ê 6˜V“4¢)Ѥ>º'ìûA9€Y¬˜èxðb€ä ©DJ¼"f$Œ~º$àTº(ëð$Ä«"sÙ]êñ +UZ§_èc€,°\wE!ǯG¯ˆÉB¥•ùèàg÷wØIƒT(TWëÛ¡ð›s ˆ>ˆüy–ì©e„ E=oÃԌّ¼¬nHtÍÑеÿk¿™–¶¦Ÿ ÌrlV“Ë‘+%ô(2½Dž«RÏÌ/Ôƒ„ïoŽÆ@oÿµÔª¼€fq‰6ê?ö¢ò…]ÈN>-3?lO@Y>ãT@µÏÀ¿ü @QÒr*ðä)"F.# z½ÐÍ´d%öýA~Á§ä£ê<‹–z¡é³Ø¬©DîWY)ks ‰9É +øˆ‰„ÒŽÃüyÎãtÄ-5îSœqœŒÉé,:P‹'ÐÚ¹©!C Z>™¼IÀ~‚^ÊšxÍuºî\Ø,? +µö¼íü“?y&ÈéñšKÖäðz…jïpÈÞm*‘s»d]p’Fr…zIA¾ýÄtßö¡ô¡ÛÉŽÃí„…š“ô8\“µ ôks¦¥ ÓÀðÅiy.©¬¬Ï;5%šë" e#KÛio~69¬Ù" d ð@œÁ«$¸šóNBo*%;û¶Kˆ‡W·éׂԖäÍ©å™bÝ ŸœXtÍ:dIÀé@ƒ<†è²¶qèc¸ÎXC‰óáüDÑ Q1+ûH’æ1•áüHRD‚µØ“¬I?­’Pž‘¤¸UàÄàá˜,«íñub€î¼øLKDzº4¨m0=åü"Ç–€¦ef°ÒäÁ= +˜Ô‡‘±ÈçP¼$…dÐ<”hx-ºDëì?Yº›ÏJFH2' Uê¯üöâr.4¡´†Œ¨ö¼üAp÷$ÀM@´!È}†ªo€+4!ªÓjã¥YÀ4Owô¡×ÂKKšN+¿ñ”Å$…“X¯i }èól‡ÿ9óž]#SóDû,)Œ„#½ûÚvH2S¹|’¾¬OXe½¦ÖØ7NìúíØ-¡ §FaË9< ²–ù·$8” º_p„ÆîžÔ¢ Ú¥p–$l±¯„²jÙHõÓIãÕ¦‹Â¢ ¹ô»â¦d‹â˜t†n”R.3½&ÀÒ8àî°$Dgö€h'D d;Ô³ÇT4M(]óè1šu[—îpyúߣþœÜS€@þ¼Î%þ4o+`8,~ø7ºäEÅz®N{?$.°@"†“›ÏþÊá21é÷*”ao ¿äÅ™vkGWtvÌGºÚMTØg=6}ˆ’Á³hZ&w&¯L.¬ZŸXˆöìÑRcÏ—ÆlÓZêÞS`ÁàzLÍû?TϽŸpFŒnVå.VïÔÁ ʼ?ÀÇèB$é³’ 1åà'bÏä%?¶y’:_, âz¢sJÇ×¢âa¤ò$´y¨·Ðreè”Ú¡ýÀÒ„çHžÈŠ—Q鬇ÇìþרP§!ãOX¤~ýdÕDÚ<åâÄ:/’ä¨+}R>Qve=v,ð|@v}fiŒ¦Áв'Vâï‘à NdóöûÔ)¤f Mž<ܱý¿€Š:Ù€öù³ÄD|‰eMf®ìJiØÙ4[šËÄÆ êÔæmüô­ +˜ÏJÒr6>}agq%ýÜaWvž N¦]ÐÖ‘J¬@Г×_=ÃÙÞ¬Á3BJ*¯#D”‡2kx’’]&ű[YÊüáË2B«‡«yǧMÒ–‡¼=‚˜SO+õ¡2Q¤}(=¶,m#è6å”Qíè2èäë¯rVFg¶Íñ²‘°LABÛíe!‹ìÄ@êbIs¤éEeÙu¹TB[Þ àÓÀov3IËr‘®#,´+ôb”S÷±¹æÇfwú‘P9øå «b°’òÞõ!¹Ðè’>ÕîˆTçù•^æ@ϱé†ùÌñfÆJÙ¿X€K¸ÈÙ µÁÔJ~†4ßg«ÑAE—•Øæ2Q&WK@^#á ZûÞ+ŠEbÄÿ%2PmGˆÃÙzv/¦Ä3Jˆüƒ¤rŽ½öp!csE«JûYÀ¾ê@˜nÁ4P(‘X|¢ñti¾€Ù â R˜„#„ƒ(A¶Y›éß$@Mmð›ØŽRÏh^‘+b…ß!TåÝ(¶x%äâÀ¸*Ëø 7MÏKÀå7•|*>ÚIˆu‹]"(‹H¼½hØÙd +Ç>tÑs§ÐLrÄËú!2[o(EmÖ“D«[8…<šuÝBKáŽss°G€©e„ܼø°È?):/é +Qœ_à;‹­ÍD¢ýU§ýIu›OÑ~±w2m=är–:#úCôX5ÿCÔ9B˜b‘²µ ê_ÅâA(Ê%Ýã*T-³K0Tª–,$¹ Yù*%í.~-¬Ew[þv·ÛÅ«NC¤°èéšõŠE‘K<ýI€§ª˜á¾~–„·èÅÄ«UŽS@o ƒ‚¶’ÝuL²ÓÜåäö&-Œjë s¦f;!ˆ<=“3ÙÎ|ÅŒô²ù(Ãé5§k3”bŠ­5©B.N…†f* <†é|!˜Àz%®˜“)\Šµ="í¡,ˆ§ žY2ãW,U¬€<›«¨¹I';¾€HM³j˪^µQÀŽ8€¥³œ’Ó4è’zlêÝËšZìñ€–((f-ºªì[œ)‹ÓÿÃT`'¹©*tad§~;£€ã0*j9>ÆfU‰®& ù‚IŸVt¬þMI[&pýâß40öõJˆP YÖÕuŠk–®¬¨ˆÄ±•iÁm0ê4ÒlÔ]léòd„ǽª6ìßÔ [0J¥[÷Ô ø"»t½al˜£Ùµ¤ O‡EðeœAÌmÄL&†ZŽ£ˆY²W·ÀE(X裳¹@*Ñ`„.›Ø莨¼¸ÆRN á>ç‚Ç+YL5€E² j›Põͺ¡ôÀ¢ ØÛIx†×BÑÒ@‚œž2*°«=Á4->UC·’ú Q‰ QZ©FÉLÖ¾)?‹'“Šb¿†ž Îð–tgóÓL—¿ÍáU#UR*\Ÿ쀞‰»†N=?feTE¦5ןªh¸ç*¸s•‹Œã° ]°©H©Í͉ÝR˜.ò¡Ð/HÃ0¢»ÜÁ¡2 IR˜5hÉUO[¨Vî¨RÇ.*œ$š‹i,†J×7 ŽÅZ,’OU]Ž"PÒ· Þ9a*iQ;`£Ížæùºq>o„áÌŠ0€µ} ¥Aø‰¬Œf5µƒ‡ H^†Éל#‰X#X$ܪõ-7IA8ѳcLo¯S{Bx# ”ÅSÂ)Ü4–ÁkLEU6ˆºI·ûœŒëÖ…¥ƒS˜Ý"IE’†$õ|*Èh r‹²K>ØJ¡H„$ÎzºÚÑq%#C?M§·ñ§ÞÒ4Þ?Ø€JY뀑d­ßc98‡R­íf%ìªp/÷yÞ0D…+˜?w;âï €;ƒ—=cU8€æm¹ÇNwä ;),5¶›>®„Z[Ïn{¤eÆF@ˆÕÿâæF³!ê\ƒ%®/œF®ÁŽ!'Kß'C]Nþwìeù48  …ÅIðK9Í€piý‚@ +°Z¬¯‰ÆAjBh k2P®¤‹ìƒÅ)KŽ âíд+() +Áœ ÀYàl¿FÜ‚ƒ¬£L »N-·b!ÆõKîÞ\ù+(cµš:!²n2Ø\ð¡§-œlv¢¨”hOæ®™âµ0:U½È5Г¶Ÿ¦­‘R‰š‹$¾ªÙ4lfä‡Äæb†ÙîöËŸ8¡Dº´PÊ¥,Íè®Q‚±ºž^%”)~Qâ5-]Ôº;÷Äs™t°—;ãÀ(ÀPM « å"@S%‚@Å+æäEb§cIEÿ µôŸô$Óèo'Ž\ yÏš&ù9ª ""JÉ%ö¤£‘\D»¿0°ù3ð=¼¡À„%¡J»—'Ï<”U)𻎱²,´Âú%Æ›ÝA$*z´ƒ1^–¦Pö‚‹'ÊCU-ÓvŒ0*é+ÔEx7n…<`’`Ø Áy(Íc¯ƒÂ‡ØvϸzõúšlhÅ…8•ë·”9‚Äç)Ù X,ÔWøþèþeêê ‡zC¼êkSU5dà|Ý1yÀBÿf¤¿¢Õ$Õ+5ßA.8x^¸ñØC}ÈP†JŽ½jHò%Ù„s´iWN©Mzð5W fiÓ!˘q8¦Ÿ]ì)É4‰ß‘H8k#,QcJDÖÀR\"6IuD÷ÁŽ! %[Fïj»‘îÓ²³‘ÍÆ9Ü€Ý8'„¥ë­fSka!ôõ‰úìd¡7, ¤˜ º"iû>£PÔyR¨ÆVÒî@*dE¨J¬u +±já¬WLDO‚B¸¸¬Á{  =¢dÆ»o†TØä8GĦâ­Ý‡8DW?©òUÿIÕsU ³j€Œ™0È».jŪG(¹(â¼]¹´½²äÒ¶¤C®±3°lq_á äǧðv+¡zIì§T‘EÅ ;P³%„Â!ðÂjÝùZ\~{÷!¦¸<Óýö8h¬‘ +4ï|È'I®*2ºOª·IV³“bÐÔä£SXœÀV|7£ú%½ça¼Í"]‘øb>t…?5M‘)Cï]¤_|1`„4`Òw9Î`H!ez!¤¯/pÂz ï_à¿Äf¬”ˆ‘`gÂÈwózGs¥Ø~)¾Yf÷ÅÊcõŒ}IÝ⇠+w4ÂwkêØû¢ÆN ñ0žcŸ¡È³8ÌQ†8[c×ád¡/gâô¯Õ›QQ…Oȶë´ñÐÜÞ$ADl7#Ø~¸‰Ìþ<¾iU´iÓñ•¤a,ÆEÕ¶TIÙÑe/0û%Kxb!t’U“ð@! lbG²¦?}*¸ö ÒÜ ‡L”ú1¦ +{lÎòQ7Í“™ÆŒn9…Ýfa`}àH‘*¨FE0B+¥i8¹Å.#”œÙìá€ÍäÂÄó›TÛ³Qg—QÐúT‹t¤)š%ñÝõÃB>‡E#¨Øê xí@š=¼È–{¸Y••@]ó©4ÊIµowWzs ‡›š—`UOiê9 À¨":‹! hNäÏ°¦±U´÷…è)WyÝ0"õ‡äÜEœ3Oš¼AN&ÂÒO#hçìûñ» ¹:é]ñâÒço6ú°˜Hnü”Ó©&$ ¼4E/÷Ùtà³1ÏÉí§*ýj'.ž=šõp1-¬‰Eˆ¶äu,”ûÀ h”å[Œ:ó˜VŠŽ•)ŠoHóš)2 gç€×b¨æΦÈWçõ=Î.mÚ8ðdW•5ëã¸ôøa1c¥ëÓÇ$m#æÕHÛ H'4º¶5©N±¥ýÅ)äŸ8ÅÓ7e·°·,¦5‚®–Œ4L‹ú^ÞlBcÊîõ Ê©Y ‡$l°A´{—ÒÎà’½í%™±e`]¹ÑÎ:»(MvvQêÛÂÑ9$+ŸrƒG :zÇ$«¡ªŸ€ãÎ’¬„j5Î;6gN0@ƒ@=µ'{÷ÄÞLõ4–_Žž†tðc‰ýf”$Ú<=@Ô¿pèŒÛ΂4o÷<KMJ®9î"^0äIÅ êζlÁ–ä¨xFz¶°‰ˆô E*ZAc5L98FÉþÄB[ ý!îF ÜFx,ᳬ²Žh dô3à]bæªÞ%ÑÀˆ#^oênY£ªÐµp@‹FÉ”FçËF$éQ3¢ú”–-c¯W'}¡VPQƒ{µg0ñˆ›»¢«<ƒ­]–ãbݾ拻î9úÄÜsÊzûˆA¾ëª×No¡}Ô1Ð;¬’ãæJÓ0ÑšÄÈò€ÇHÝÂ=¹¤Î^Xèû>ÀתaZì ç¸0ƒ*N…¢TU³ªç~ä,^ g§ÖÍ(@R´Mš›²IÜ›êQ-ûû¦þg«A¸B¢H"e¡Ñuá®Bx@6후½Œ.ŒÁyÌÇ“08ü¢–@ëf‚PbE¯$c]YÛGõšÈ~ÎË÷^þ}ÊšÚ‡)æº +‚T ‚\sÕ•J¥å6'zÏfM¾†±6VfGƒЕ +éj¼U_hš@ÀDI§À¦2ç©Á$"‹ÆnÜE8Uü˜lÖdµ«ôã1"X>!KÅ›f€YÇ2è‚ +Ž@t¸«c¬ð§žÅ˜NŒ±àüŠ¿¬ú¢ ÉÝxÙ1 ØD`RI…˜1—ª“Ji•Ý#9YZí¯ £ÎÁ QšU5#JhÓ” Râ<†Á.§GÓ¦!û­Ð¥„r¡ä[A\$hÁÛǃ¤3=ÊS”Ãòvðà\ñsD8Fþ­k Úâ¸Ú˜¹ÝÔNŽ<2|³ùsÒ¼e¡fL7¥Ã¥=øAØmÊЛ öIàõ’€"ÃæLÑ?Èã<\„ñæ´ÀRŸhpa¾ ï]Q¡b ¾1^@%¢µ‹ÞÄæïÜÀÂÉýübéýX¸u)íM•ŒÃõSì^P‹)rº7­ó Ó=dé°±ŸDþ¢S{8©ÓY¸ +5Y16öUd+ïˆê§øˆµÜ}«d]É〠_½zÝߤ ¤ã ¸‚î›C¼xYô©20þDm쬔v¸8 –sÀ[ᶚ ;/™‡ˆ‘”!*Xâ+uxÁYúœ$Oœê͌“ + dFP}¶£„tIòZ ˜€BŒ@$ãŸê”‰Ò~ŸÕ…ÈFE§àÀ¥¹†Aƒje žº¨,rô–£FÁ„@Ë<½³âÐñ¡ìd;=…Ï0€6/¸¢Ëi=X¡ØÑòhá8P‡Ìà‡?±ë8DŸrŠé”";ž +(ˆåtɳÃ3\‚]%ÒÓÐAZ9 +ܵͩ’$kM¢{3¢Go˜ØÓ}vóy$Éó6$ÏÑmèSh«aŒ‚< ˆ¤»ü}<ÚÖ´L¿“Csr@èt,¢v1[b«ƒ¦Ãvþ ѪŸ"Ád©}S•À*yŽƒ©TÖg¢Ð_Ðß…Àâq¤Wˆ±‹ü…€zrd €®M­6åÃ1%ð)Ãéô:KÓ¯]íÞšü­¡ðÕ«sŠ…KÀm£äBNŸ® /ô”é˜À“Pz$Þ;ÙïY€^8ÙµˆÖèãÀéÐM¡$†ÍuP¢ø©¸(~Á­ù’QÆ–ØÌÞÊ b¯ôQÃO7ŸBd +r“f¥¡Jzý<XéQG=Tu+Àúý×÷ç!MíRÛZÑ S¨±µ ÷vœ`ÚÁ$¨Ä>ªc§³îlLvz”±ì¼“š¥tÙ!Å ÒkE ÍPºÂ<|©altO›ƒ®~vŽ}5¾¯Z6_“£ƒIðÜÒr_’k)f—KyÓ‰^tÛÈãQä™ñåï"ŠówwìÈà³ýdÚvq=`Ý9€IŠ, IºbÀ›¬ž¥û”óÑä‘{—Ḥ«`:¨„Œ»ŠáøÂà“·Ü(>"8ŠLƒÀEO¶öÂBÔº­Šš¿L‡Fã‹ vé®4¬Rè9Ôè®òÀ’åd±ÈГà0H$€e¾|Ÿ§“ä +)>¢Ùušî±…ÄœèP7L”©¨ôù+ÒH*i›rhŽ/7–€0—(64b­,é&lm»läÅ"i èö-ÚO÷8؈FÒBiTÝûô¦Ä_(üž7ýsz(ŽÔA)ÛÙA‹²`&—qÊ+*Ћ  }/C'L·§‰•ò™¯1b×ëaKE š­»w¸I +ì[Žšâ B¿€õÀ—³ñù‡ æ”Xí2 +¶Ÿó +qL“(zsþ2â ;åmÄݲ½ª`¢8ê#´‡œ¹ ¹N™«€)YápË%¸-Š@îyð • ×ðä š†3è)ê*»ð€»ú)ʇžZ“ÇXFQ+Šr¨#p|È€ks·Èɯgþy ãQ,N +s¢Ñu’*»K¶äõÀïFzì ½#ön>.Ïh|.š\O]fPÁ§ÅO¢Ü¶BðÍRuI©‰™™[ÔC§1BrŸB +sÉ©Š¦}œFˆzmŒh>¢äùEmŒ ˆÓÀÈŒçeÁ ¯g¤>œî.Qâ¥Uç[Ðc@’ÕaŸ–ŠXѨ˜TÁ–ú)$—ó"oºŒµxrMíßÂÝ!5«;‰¿ˆßÁqš=dÔÞkE"~ël}ê„¢ïÃóÍAY&/dŠ-+Ž¸(£6×ñÆtqZT4ü¯“ƒEÑé©"ézÔz«ëëÓTc<‡’ ¨(²%ÐyN·úŒêXžrº0(#ÊÓ(r‚K©RdÅEæz¶D {t3BV%éé)é Øßø‚é5 ,â³X…ÝlÄpTGžŠ#-cŒ¦÷Œõ­È¤]4¾bk±øñd±ãÝìiÌm»C.^Ç:…ÐQTÕM‹Jk)*¤¤£‘ïF@Gf¾u9š_µ;×{f¸ë8JkÀŒÓ ç80®t12qsuLf#ÙiÇŠÀ(Î`#HÖÕGLªÚ *û…ž€‡iŽÕ!¼ÕF6DlÜÐ…¯P•ï¯—ˆOæ »PÄÉ4{»£€?Üœ8@GlµÔ{Z³› b²ŠA§ÃrJ +AUH‹G3 +”®ÒâAÄ\"v¡ùÇUé’êv«á¢TTó +s&™äÉ•Ù—›‚åuLÑÜâTQ@Ç]j?Çð4î*Õ +®›‘øX=;p0 Xqňz§xËØ*©¸KûæË Ðc’Ô,†ço»F/sTÑ(öš‚Š\)‹ˆkt«c½éCž"‰&ÇTÄ‚à‘q%ÌÚ°Qx|vºj¢Ï¡jOo“/€}AŠþC•aDðÓÙÐÙŠqLÀ_ƒÀÿp.9í$ÞéªhZåæ²È2z‘;wˆ ÅE`¬ãŒfy¥ áZGö7ÚbSfx= ä;d˜h ¥ñ€µ)fê/¢âºa¸¥L²îñ¿;9 …DX•¯Ï t"3uÙVÝ4:'Y"éÛˆ +Á BaåOÝ»iàB'3î*Y*niDK#ÉjDõ—ó)εš%–:Hr;OIεa–ˆ™†¸‹%ø ·ö¯n²×$z#éÕV’y÷•u‰žD'™‘ë_y`à¸å‚ëG9«=ž‡¬h`ƒ¬ƒ.BŽ%ŠîFšèt4£}„dsÀ³ bÖÄÛñ7…0ˆ4Õ:òíthÐèS˜'è"äÜè;x…_À½À§kSIŠØFXŒ®ëÕNSѶmú±J|¸4±’iOê±€êp VvHyˆ ©Ùà%õ@ðœ÷~ßG¤¶}¼N‹§ØÞD;Ë^ÖB^ŒÈ>BϵøsýûmP@éóP—Œ r\göë¬CMN øCȽºk0‹ ÊÐeaãŒuå¹A ëóÁ!ÙE˜­8i•d,Ë5ÆÈ€²ô¼<Ùe¯ +Œ¨HˆüC™CÝk”ûˆX܆Ôõ…ÆÖ(jŒ">:…žj K +FJ+.é(ë!!b¤àÄ &¾!†P +äT.Œßk²½=MOÙá{E Ñƒëï¹ýé²#ŒhÁÏKp!>ð©:´×¸ Xsai§åÇùµ‰V±…Å{&Xˆ +Ë)>êá×é\§#T‰§Én/ )G5H#„õ4Ç/…8ç8/ïkw}$N=ÙóÃpW…_ +ù>â¯`r÷-Œ_^/ø»’K¡ B×’’6Ÿ‚"L•ZInQ‘¥¼wØfvŒÆµDFñ°LuáSj(ÁmýZÆvÆ“ÂècWðÓëœÄùuQ‚HcÑX‡ËGç|zêÃÓ„‡A!:8ß!Ø^UåiÇðÂak<œïL…L Ø…ZP¤` T˜/ Üž>&Hœ½’‡ë7»·ì(›ów½"#@€ë]kžSÅ8êÝi%m3=ÍoZG1»4 +"m†•’E—¶dÊÚ m­&D‘ ;Ìeá‡îQìp4Ž¶Q€Â\9ƒâ2  .ëmÞ)ìÀšü}ûM–6º/þ„3N3“tßÇ1]>*ö1Ê¢ô_Žë9Ý೑Š%µù"<¡ªò%¥ÍÁC­(mŠôw$š(I6×r}ªq0à·éBt)8Ü=#ƒiW.½Ä¨ýWøHÂ5!î/¸ìü¢ä¥RQáØÜ‹ðÛÁY^yaÎ3Fœ>‚}lÛAuÎm^2Š’!NHœ.»N•XtL³›~c€>ä9¢u›m5´¡h]†¢õ4‰=†ìæB]èé.ˆ‹6:[ë$—ÜÝë¨KJUa ~©ÓI¸KrÏÒϬR¿-ty€eïsÁµ¨Š"í&üÅ¿°WÎY IpB™ŽŽX4èFÙ-éCmI°Ð,]cZA\O @­þÂ+Ë1=ÏÃex¤Ž¯¢Øu@„_aB@ ù¹mš U"t",ãí¢_"&ý5Œ®…ÒBÖÍ1—ö„Dcè”Ú>sxM‰ÃÅ;Ë& +ð"e@W´'‡jí»8œì#æí»ìÛ?ðd.±å™P«ÿñ-™·ŸþÙÛ_ÿ‡÷¿,¼ýìÓï¾û‡·ŸþüùÅ÷ßýÛo?ÿÅ?}þ_|óíçŸ}÷ÿòùw÷ùŸõÍ÷ÿú·ßý§ô/½ÿį¾þǯ¿øþë¯>·¯x¹¸ó£Wp¼ýìW_ñrB¾ò»ß~þ¿|ó›Ïÿòëß~ùõ·ßþ|ý/~Þüö³_|ûýÍhþÏû_û…ÿò»/Ÿ¡@9¼S‘÷Þ7þÕ7öùÿðÍWßÿ½°¼÷eùÛ¯÷Í×ÿlßõÿôî}yúvMß|ýOOWôîè_~ýwßn·ÿýíwß~ÿ±ÁõÝ?®c-ú½¿îûú›_ÿý÷?ðçýê»þ§ÛÇùç?ùŸ~þ‹ôùŸûÕø¤ÿûÓ¯ýÍ·ã/ÿóÛOÿÏo¿ýâ7_õ6þòÿì'7ó*x?ª„U¸ÂP).¬‚&K@Çi8a@X±üÓÒÍõŸë¿ÿúŸ²Ñ|^_ŒÿÝþçÿmügKÛßþâíÿúÇÛWþù_)ö^®dýB¡ñ>zYÚE·QóWýòî‹~ïÁÛóûƒßèñP?ýâËÿÇŸ¿úúËïßçðÿ[þ[en‹ÈlÇC_²¾a™ù½Ùæ 6rséØ*5à T4J"3øŸ¸Mõˆñp©+£ƒ¥Do©…ëÈ +v¹m @¸9‰ˆîz:>hLM=¢$¼ËÝ–¦B§QyDGøb £†Gy5Níê,Oõjô|K—6I‘XZ—t^›$ñΊ7|pHUïHvaª!°Y“ePûè’¶çíÞv¥zHýp -`‹ð2Š\yeê •“Ùظ@8ãõöïuš4Œœ +–F®ß«Œ, Ñ·wïÚߌ‹öº4`T úQkä‡Xt…µ²n/êÆBÑ|Eï+EÏš-˜@q‹œ“€ˆ’ +Dp)`€%'NãS¥ˆ:¦)5äŽóƒîK .=ØÚ¯n1ZlTØX-±E´Ju½–^ÛUÈY×ÔqOÚ×”H½p0Î$›6¾¨ŽÉX7vYÎW—DÏ @ bsYíZë0¥nÖ˜ƒ´9å­,±@Ëú’ä}@9b™©¿s +i“ìéíi‚;jT4!çœv Äh +§'q}ÎQ\…?á‚÷kro^’'Ä„¼±xFÍõ*ïÀ¦‡£*”E{¬.¦ºr}ƒž¹HžX‹±y@Íë {²¯”1² +0EU×7ËÜžJ«“УćýXzÚÌjÎî‚`¹Éûì“dž]/)¹^Râ…’Î + uÈäŸJu±'&‰*YNüXÜV]Ô0À#ƸyQK¤º!j.<ÜÊŽ›ô— +q‘ÍpŒ)¡¶åG_œÏžÞ°:Úò\ª GÙñfaôþ+ð],´Tÿ$ +¯vgrLµâh”J”ú 8«ì~œyçWâ˜gï¹VY¿3Å>®£ÀT¬®ˆ¬6+úÀ, ’Ê–•y’B“¯JÑâ„ÇÀ°•§QÙÊA¡žUrùxµÈÕv…—xijC%Cñ" ]W†®9¾“ê1óëB{Tuª€Âg ¤´w²m% ªC¾S(=x½­¸%€zÕ‰rg¥Ëº-‹"/Ü~i~-!ª»MC2‹’’EïÔµ‚FøRÏ›væñM^ø²PUɊ˭˵®›dº³Øtp!¶›±ED Ä4Ñ$@£±P ·e¦y%@»6£Wâå‹P—½‰d&µªO@1yËÄ^cµLH)ßrUoŠÖDî’`G>hlc€gÄ¥îÿÔ»z@¶U%ÉçÑQ0¿Ä«öräÁþÑtR–¥üE”«VöþKxÔb‰£ÒÔaÔŒåM•“@WŠ¯¾ºšk¬NMâºà­¦[•¤0ŸíÌaüùgJZÎ6"êäyЋ+=9A‡ÈO š¡”­øƒ]hãÝ}{÷…ä >ý[ÅIW(úëß~ñÕ7–d¼¥ògoŸ`Œ%#‹1e²Aƒ÷ͽ¨P+¦üDŽ8È'Âl,Ð(ì²¹ñöé¯í;>‰I;*zE¢ŸPØnè@׊ñfØjàÚŸàûÙ\üDÅiJ“8Ûϳ©@¥:”øü@ÀÞt›ÃðvzûkšO”gdùØH©’~‚ K€ý…ùþC¾-²ñ|@ÞÐÖšªŠÍ „V„MôOYk> ª±BÊÀ?ó,oŸÐ¬¸ CS½Ñ?è·uGR7”%í}fîQ Ò6²Yþé÷Û>ij†QÎ •Á¾­R8³ÜÒƒMñOgž¼}úé}ˆý³ç¿ýìß|÷½EÓßýö+›Jž®ýÞ¹¡ìì/¾°Äþ?Ûà·Ÿ~öó_üë1ÿêï¾ûíoüЈÍ-Œÿ껿ýúóŸÿâ$µþwßÿ‹Åî¯_"øàY¿æwüæ÷üoMæq?%…g©¯0²-VZêxÅ ËŽá k!”†Crwn{_‹Às¶ÍS*#e"Àx«Ô¨A7Ài^Ï®[m} ÚXi&l¯¨»ÔªÈp¢Ô½ê€‹ö·ÊÆAX’œ†¨r»¼}½Cqõƃ K›>P¨Û§p!Âá§Öáb’ñœ2– nek´XŽ$ ñÄ:¯Ó k§‹¨êVC¸ÀUH²¤N§½ÉåÐ6zÛô\ahã¨úáë?v3G:Ú^¶£'ÏM¾ ¸ip©Í[§U4SEô=N.Ú¶Õit FË[À­#q€C\)€# ¼íöŸE'Ã7§mºÂM$$³õ@,U:Z~vùîäˆGHž=!žh߬†šEÖ‰õ0ˆ‹…Ø_Š¤É-â¢&H5V§>TÙŸ„V<*\ºì6–ñ4Ø8$Ø4G‚ ÌA_ø+ÒüºEˆa~q¥e.,;ÊmpyÛƒÐÏ.ÅÅþyÒ‡©`‘G1½‚UŽ—ð¶ï¤[F|gÙ S`q€&b +i³ 9®2·UXÖäñ8ž%BåDïàÛB“<á8]s +ù€P§=ÛÓLÙ™\ItÉÊeƒTñÓ¡jN,˜£ª§r¥¦—`áýáJÏ£J/pdA&*JºCý£fK¦|:á'ÔÓ PÿÑGÅ劮ö!‘NâU»XɽÙÛ@,x0/ןõpã¨kKë÷íë3ÝohFü$éng›7ûJ¿´iýtëAÏ~«DS¼qœ½þ˜–³œ0iZO× {Ø”(ñjž® k¿î@s›Ô\¶4Â0šØ"ùèLºêòõ€åˆ´åÛ².TxÊœA4ÉÚÜ’Ç8cògL,[ɨOó*c1F1=É“€2€df«@K®òÈÀ›8myQÎc—ç-N^Kí(ô¢zÁíÔ1`Á³áÄ*›+ ñªX ÃægknÙ‰ÆÑ +ø…Ïî#8 -ë¨Vžß/p,h²aÖ¨ÁùªùÄe¼êt”–_¸0¸m’¢ú†?—Âj£ýÓ&S:%2s, Ðªé¹Ðr;Ô«WVtHJòÐ}ojgEï63gGWdìL~;š|c?h]Uűï ÜE/RÐÓÅÒžâb4‰ø>ßÈ#z}MµJñáëC:(²B€E§@õ¯ï$1E®Ù,Â…6\9MÍ$êÉmfªT˜5<^»D_á9ÁâÇ©ùW$üt^i·½cÊm·ý„`39µN´qˆ_Tîó@î¤uŠ®ä±È§^Y¦ÍM·!ÀZçsnjÑ’ûÊ#Žkef´|Jòhëƒ)0o“˜*E¡ûü¹Œ~fÝt0Œv[qD>i:„b¼¨my€›^r{ÛœÆt).Œz½ —ÍÀë@’Ã^A ./ö,¨@¹<Õ@éQR/v œn)h˜¸š +l‹ø¨j°zÛà ˜T öô\¯¯Ùv4¬gÙDômÉ…PM´%hÖY|·³L_»]//Åú¥R³ã¡¯~•tè€zÃZL³tØ ªÄÕŽSäðGá¨L«á +Î6—Ynâd8p2ô`¯=G…þ t6žËZÛ§f1L„Â¥Y„…ð,ŸqßØÍžkmÜ/vY˜S?USÒ–>P¤[M¯¨7»ÁC§W½Öýêš[=W^=÷…‡j åI]>ÁŒÊGÌbrëî¢F íì±ÛuPä³Ø0Ÿ†2 |'’’f”d´ÆÐT)Î*IA²¢ØCº¤Duá ½ºè[IÖ>…]î@o·ïoQU ž¶Ïc‡â±C8ö#Þ §3Ÿ«š;Y·wnËY†gã¶ÅFÐåâ×â˜j§§C#U¤FµŽ•dEy0néPjø.³;ƒÅ~ó) +ÁØ€6 sq)U…ýcHq4OÃ)Sk²a«Š#ˆÒ‰œ,uô¢ÖGqFÞöoŽD5h + æ%‘Œõà囆—ï1Õ¶;!} 3’ù¾¹¡±~°x¹É0:Úß(*[ž*š$ö÷þy}¢|ÑåËŽùffð“ž›MÎcf¬3,ÑÀᇳG÷{z™œAHDÈ0³ïæ¶däÍFFî¸íÕ$$Z™í"¶¾]1K~`«Ìòö—Tô<»³¸¿ìÉ &%âJ©|.4ál"ÀhèBøε€f{Á)$p|Ìò—HS™ƒ†8p&ËâEûOÊ‘P™àºöÑ£<,†™%Ý/‚´ÝéWn‹­TÁºËãÂëJMÝ=Ä^í[òèò²Ì‹ÈEW«òmÛ!hÈH¤¸@Ì:¾Á@Ô<ò•¼ìJvÓ?ÀÆ<‰›ô ×ýŒž5"Vë&ˆú¢ý®,O…¥m…UÁ;«¢»tî²ùJq¼¹G‹½cqß»–ã™Ô]ØàÏláeëg”´ñí ë¿-1f-=å=Πi/–¤Í)P·)ÜdMF4d×k)U…™k(” Åä2µf<#Xâ(^Æâf[&y¸kF·žÂ¦ÍcøL7 {®Ù‚~)÷é-êdô½’ÑÏ¢Úä¸YTIJÉù¶x“Âm™aæ¥jíÓùYáá/® c¡éTRÅXöø˜ŸH-’Ÿx\éø^ƒL8uC‰ñ)G¯‘¹<”yÓ·À^•@4A¾÷q‡Ö¼@ÆÈQC„ùη-¥ò™ÎÐÀ“×=#ÙF|9bþ—„f?ÏH€»$2op@ª4OOÛKâ†mÍ9%¬ùk2¶Xs9C65õ¨®©`Ò¦;'½Ÿ›B ¬O PöØ Ÿ^iÎ6»MFy%üeïPÖ^²_Á*Û!I^®É3Ë“xhZ´|®¹··ËPÜFï{ËÚ!¤ +šX§r¨%ég¡ÓžHB8[Éœ&3œfÔ:»VÀLY¸'êã)Ñ©µXRXrg>Û[©7%…3k$Hé ©ŒtDTÙάõÖc@׊ <>ñÙVO²¢µ ÃVFäcJl­õ 1ùj»1kóo¿¹kïð‡¤†ã|²[cr›³™y;§fãs™£;ºÎã­£z÷2lýØí•Z;¹Û[¹5‚ßy»_ÛÈsmØÚÎÛ²²u­o—§­é½-s[¿|[*G“ýnÝóÛr½õô·ƒÜî¢`Ý€v,ÂغvÃÝη Öt‡N¬›ï¼xÞ»w¸ÆºõoH-|Ø€"·aȆ3Ù™‰L™Ðc¹Ÿ6̇mø™Ám ›ÛøoÃìlqäDùÌÈsƒmëgw€¢÷n0¤-lþ.kA1má÷Ä=m‘û†–ºK6¨Õ–Gl(­-Ù@^·9͆Ûr£ ^¶åWûˆ»‘6¤ëVƒÚ@²[kÃØÞVÁ6ˆîVMÛÀ½[En ßUö6ŒñZÜÀɳ ¸AšïÊ‘ z37õVÀëÛ"êŠÖÞj±Þ½•q7Pø]5xC”ÏRò +AߊЀý©„½¡Þ·ø˜ßŠèÞþ¶¿Áõ·’þ†ôŸÝ€pÛLØ?¾6%6fÂÖØ؈ · ’±õWvnÅÚšÙ9w-žJ¬‹ÔŸåÉ{[K«H¿šè˜_ôÒ-Ý&¢*=bˆ¹I¯ÓMת’S6[è )Z_»_¾| ô‚HN¯yk 5zt#ìzÈîq9Ôùa·†½§Òåõ,ÊHyo Bòh•e–ÌÚZô‡”ÜQÆ‚ {ÆçÖ¡¬ÝƒõŽ'¢:kŸS‘Í9$N£ žËÞ/m*¬ÁAĪ/=Z­¶Å¸Ë=:ZT¢ž´û§ÖþîþÍkxûk«ùËÛÛ°¶¬÷Û¹¶¾…_‹÷Íק¹¶Û÷9q׶ߦÖÚýßfçl“ûn°½¤°¿V+¾áã*®ÛYjOÄ«]xq0ó‘‹o% 6P{õdt…#ÅÎMÙ‚·óP‘ýã&@´lÃ’ 0èÕ•}# +h²®]Fèw£^u¢ACø¸;O—“„.—a¸V0*tŒŸæêc0ªwv1¸ëbût2{­$3óÍõ®#|Ž®¿{;Ïv`Åc‰VD{yçÖ?žÓ¯2ÀÆøQ#¯5ó¯I áÑ„ú"Û¨¬º8±q «K›¸©W‘í듨›¶Iò÷ÓU¨9¹ÃÛ̸ûÞmÄrý_ÎâÑË( ŽË«ó8ÐÂà +¤Ýd·É Q¤ÐÎyx»_£Ýr0$ךµD©%ªwsžõ^î×ò±gòåë3ŒùåÅ¢)’„¥ÀvO‚cËäÀ•#áÅj Í¡o`´GŠLŸ¨f—w&*¬ûD>Û3HÒ×QrsÁª3v\C¶—>}“Ì=³ø +ÛÙ?½¼Ÿû¬¯öþKî–ˆýŽlçÙîêº\=?‡õ-[çÊ`%—k9˜€Å‰c±ªúà…žn^* í|âö]z|j™VïYçÛ¸º/o_}Ö8ˆYûLÿà†xÛ+!Ö„îïÙüÔz‹®ïyçÞÍ—€bHÉ&ê(åu“‰}T9Ð=ÛuPEƒF¢ˆkªVÐ$=O98 %‘veT8³+ûiS¬šÍ„ó¨®>/…œ Óx>Œ<0 Eʲ1î&c¦ÑÄfJ;…Ä>ÜR0Sv á8ñ¨Ž²2âÆ(‹hqƒÄ5%)ãÇ°Ew™0¬=Õ+6*0+Q´]OEŠÜ"Å>wñý‡£ö’¹D{Q¨“’&k{$‘•2Ò©ŒêÃÀz¡ºR³§õþÁ1ò‡ .¯ö;•ZmØb¤JkˆÇîJÊ8{bø™u*çh¥cÛ ×$H¯þôžn€*„,ƒWpöPêì%Ž„1o\È¢¹]ºUµ`· ÉÍ|–‘ 2™ÚGIÝNäz‰ÄöóàÔ¦[²^ÂÐhºÿ½ze¶ÜÄîî•=Y_X +-aüínʬåRÖ»§Â¨"tž ,ÕÞ—¦_ç—Ðlû¢-ÉlºŸW|ò°|AÓ\çgéCàªØ‹äeâÀo$­R²·ûïÞ”Ò†I2š,§Â§å+T]©Ré $wë[{ýÔ»w^ŠöÊÓ•â,k’A9íòËcÙ)¢žRÐB½8Úâ½Om_¼¢ï›eãz 7Ðjª1 y‘ýçrK$ÿ¶ß20H µÖ§ìwþ.oÙž{oƯ%&Zoû@òˆ<«E ÒÝT2e¥‡ïÑxÛæϵäÍB»Š„L§Oõ×I|Åb§b‰SØú2`Ò…€‘Ÿwy—ä!Þe{ àUŸ–©?½Åxd+,°%ŽõÞÏëï>î.A{ñ²Zœ½‰£Ñ€›¨Äu©z|hYå_³.’··-¶ëoÛìy[æ2ÿ|÷Ía}û³>Æ}£º›û†·Î¦}Ó\gä¾ùÞ&äÛ&¾¾[°¾bû¾{U÷°d}ÓßhÞ‹ƒXZ¤Àr åÉOÿþ'÷rC=ýÙ~  E/Œœ©o³%ú‡×?~ŽöC·œ¶f$ÒÔÁ×4¶ +R£tM'•›õŽ:ëÿR7/7úN÷f¿Ñ¿_Ù¦Ho!Ã|°ïª|Ê$ #1m“TþBhJŠ<“¡ÀÃÔH¸#tïQÓcçêT…m®Û"­¼z…›À%Xq̼APk;*RÅÕ‚SpØ +¸AûbÔÿóщ ¯ÀŽ‚bÁ1û +v(G²ÊJ“ YATæPbÄØZ;7B~øÄ/µƒÉÂÑDëUQ[6zgÄ/ÆU!ÇúÞÈêøu¤ÒàkìãòYÀèô¡dÈ_[×À„ °'ypªÙH³i+ÐOÁÿ½¢hkÚ‡¶aÄiÍW$9Æb ¬Ùe`„yÈ8© Æ‚÷öEÀ«²Ø:ðéŸö÷58ÚŒÀÿãü}ÿEòj›#ÿè«ÝMí¤¨ö±E°›ùÙê¥ì^‚ÀDöOnú ÑK|_Cõ“™ãͶàwÚ³(¸¶²½Ê¶odWX„Gø¥hs4-¨KL*J„@òmhQ^ *7 “m*+ endstream endobj 79 0 obj <>stream +ÎNˆ£ÒDWËžÖz$«t¹fÀëà‰Ž·JR–'ÇE²<É<¨ðx»4þÉðjPŸ±áå  +E%G@‡6I¦½ã šÎGÜ-IZå—‡Ø  ž¼²íµ½A‡j5yʘ*¹ G?{g*ª—š³âfúÚyz(‹’HEgÑ’iÑ–¨·ôò0x9‚eÔ¶¢FrÌYË°ÛCv’e +{óñß[<&û¥ÜàXaB½ó;Ž‘mÙ·íqÀTÈ€ÿL°Ä¶Ûg{°%›‡ðÓ-¿Þ|Ú3”±êiw6½¸7AÞ97¿ËB+a÷n7±¼3`"p(¶gÉÁk›Ž(¨Â°h…õœÈÄ(à¥'€OËsÙøæC]m»Ãð&±¬õ‹-•€@*Ѽ°þ€0žÍ‚ð6ùzÛPJ‚†ñÒÅÔ/÷’ô$«/hy.eyK®+ÒsÄBÛó$©±—[-€ÓKÓ¯Ï?M&9»™OÁÑ ñW k›– 2iK“‚ŽÞ§öA?ŠŸ 0ß•û6¢ýܲw¢'Âúõ Ûϳ¾¤ûµ¬ïúýoZWŠýÞ¬«Ív{×µêö)mkÞö°·us›/Ûú{7ïöu|¿7;Àò¬ûÆl¸üA¶"?À$äÉ… b’ŽVq¶ç'ÎÞ¸61ºGß dÎsצ”ºéi£¿N¥ÂÂ^ x¾ÓÓf”Zû™éÛî§Mè«a¬‰¹êiÛç´dÇnÒe¾ÑÓ&‡ QM!#ÇMO…{ù'­ò®§­KÆž„ö÷zÚvin˜œ$¨Ýw=íˆu¤UF;"ÌÞÚ½z6?ßs&'õ–E?Ûâ‡à®²Ù8Ï9Ùt,á^>;Ê#3µÐ’Œl—ϦþDß^”–Ó.Ÿm¡ö™i=©fG»åH€¦…¸ZU³9¯ÅÀç%$ÞE±- ´ g°è÷²ÙÜ=Rf;òÝi—Íæ›ü<@ÓîšÑ Ñ"Ëâ^ÞÉgÇ2¬¬©íêÙ±WjŒ[i¾QÏþø«÷ƒ2¼Ë ÿÀ|Ïe´‘à·Æ¡¢eïÕÎ ñçrØKCE¦ ñ爖:%0[ö>i€Hí> òŽ§ã¥¢ ñ„$KÉHÏ.ÿV‘¸ÈÖ|S¦ŒÄ?ìÛl=ÅSØî©m„'ö0µ1S ¬J…¤¢)€‚÷Nq¨hÛ"”dûYÕûmpPQZõÞæÜ%£mS,#ðéùãšØšTØë>t´mòÿ¿‘èýHBÚÿõv`ÆøþG¢Eýá´ýu7¦g%Z-wp>¬Ä^ÄÔ¡¥ÝrG̘ðê´#7DsNÐx}·Üî¢mÍ¥ñ‡Õr–•ð¥"5[û“åŽH1؆‚É+ñÆs‡ —emÆ2øl÷ž;Q.ÓœjÈYwÏwïßôÜa õwÒ½óÜ¡Vê¥5ê**Ó.ž;‘§à-OŽ×jºâ xñ ­ B¾3݉âä‚ä²-×ÑÍt' +7yŒ5•¢òbºpÊoŠ¥dŽ w¦;ò‹Q=‘Ÿ +!p5Ý«*PUµí<Ôº»åÀ ã bøÒeÝrgº£Y*‡›‰¾îÎÓÅ?år‹ÁËpÝáùfv»Â%ßîO®aBv³àr¢p¯;©ìÙ4,\…¼õØ!2Ò·ÚC;E3[,v ÙaÇÞt]îâ°c—¥¶+–—Õ[‡îÇqã°C—a­•,Zåî°Ã{˜U:¶ý+‡¶9ìðë lÎ:Tž±¥ò £hwÖùèë1 .Þ§·¥8¬E·­øæl¨ T…äGp¶ ÷’B»ÝKÌúÒ!+pZR£ó¸3{á2Xž-MÎiïĈhs¨›©ÈÝwb0’n¼÷lû±¥½£`5Á|׬\:1ÖY”¤ŽÏP{éÄhÖ¯ìù oY1œ_íÑB[ö> d… bQ§=‰û>L˜1l>™tíÃ8-6Úx /}\¬e+‹›gÌá¾#ˆ¾É~’ÍÒ‡Ñô‡ˆSp}<ÃއዔTXºuÇö>Œ³£¹/¶L¢Y5û0¤‚r/°Ï~õax½ýå„xïû0lL=ÊÐû€Þµ÷aàï ùa¯ta`ëÃ|üÕø£û0?¬ýCº0Þ48FÓ Þ6 ì^KV“à‘æ¾ óòIæÁÛ'ö #ll,ÜlZÿQ_ƶÕ$Š‡s\Hæüi7ý—?ÑOû4_þûhøÿIz/ï¸ÙÈûèdåÏ{75I¨rZ¶eW¾ŒÂÎad±/ï—h¦"1rk[ê‘ÑzQØd '|ž*œÄq¨"Y‡›e»t;Ù‰sìÿÛ¹ŽW›íSS#”àÑ× `Ž3\ª¢¬Y‡>aÓ4åE‹”Óyôo¡4S¿”€@»aÖ†û0±QˆÃ¾DTçëY'•M;?™×p§<д%íê¡ÂªøŽÒEÒóïIºU¡]¥#RY¼ô^Y¯-ü+n8.X +V¶×Rƒƒëù¢*«­„Ê°¤ \^[Z´“z-‹¤ýp³áù[@¼d–‹gÅ[’€]¨j`C&×ÆK¢‚Éꇛ ´z펞0üîÔxôèbìÔéRòuWúÜ•¾?Ìldþ.¢éC'˜P–˜³wè’—º0ûž<—†ú°Ç¤ÅcÒÔ屢· u*³YzÖf «©•ô?¨ØEÁ½^–¹z!’ÄÂçqê2Cx°‚¾³­;SÉYaNA]ÀMÙî„ ©ÂI>‘‚ƒ‰=u¤©©Ò·²óÚä½j®m ¢€,qð'½j~œæ¥E=>´¬Y9to™ë!‹½xÖÐÞzb ã]j¬™WuþY…} íÐô¢å­ PZ²ˆ>ÌT‡tÌ;5¥Âç¿ŸuÅçߦ¹R僛k’)[Î¥ñÝá;<¼g±sn?aNãÃÀ‡S­e m:×Tq9‰glû +ÚOBìÒ• wˆGmG:}È·“‰no‘W‘¨Ó|g†ù$ŠÂÓ¾8Ù¨Ì.µ‡Œ•aÚòÄŽI‰*ñÕɆ'D‚n;Bsc¬!c¯+§FϕòÂ÷0Š’^ÉÆñ¢–¯É#q0|!\û,ýJ\™á:›‹òGºÃZKýÊü¢ä¯ý–ˆ“~ÅaQúÔÿg‘U>gÏïàÕœŽ$Dt‡àÐTpž}Øp‹µOÕ=¬mF){LBt±C3µ&͉Ëû€ V¤9–ÖÅðKà›ËÁžiÁªœd‡Á· çd»]ê^¼¸1ð U5Ö „Šrógš=ðZ²u>;C0çêcÎÙ½~ø×ð•"”ÛWV_§EnÅöxŽ@Oöٶ·5s¶µò0»ÈÖÅ(ýyM{ Åýt%¹Z{Ÿ=5ÔÑkÔ#}·iÄArˆ¼ É!¡Å4îP£«ÁakÝùjdC0›òwŒiÀ$fâ̈i"[6”ñ‘.Qö}6#Ñ+®4ȶ*Rüá`¢³éïpµ¤:çŽ'¬±Ò§±hÔò¦òä’¢¤ú€Ÿo+ö-ÃWeK•§KÐÊ øt{ño jhÁôæS(ϸžIs=›J—KÌvàÙ[f;è—­ŽNua‰\DNrÿ·j¯Ãª½žÃî†ÞŽ—‘ S3ÇÛË +jf`“£ŸýóË5­¯_b1ιØ|…? Õäè€(¾Þ¯ñÖUK.ZzøÝêèHOVÉa=ünD¡D *¤ç'‰ÚÎ…`…ºùôŸèUK.yLTlP° âeŠÙÉZâdÄW‰É¨3˜hL?1²3,óÞ®—•j nÐQòõR!:f‹al Ä{~aq‚›o­vÍóz»©¾A&y^ +zò<× ` è“c°»ñp®à”0×óu}âªxrRBn×Z†k3]€¹è)J¢ ùlõÅÛÃê:}Á,&Jû0¶äúâ4ƾ®:Ât%³Ûx>–øvh»yu:ó{tÙ¢Ñëö»;µ}É‹ÇZù€–çܽšô–Îk—SpÚ_vÄSU×æf”Ü †ÆüØna§R¶µ‘nö‹k YšŠÓ®±t¹Æ(¢YØn›_ëÖ‹^š¯l»ÈÚX/U¶±JÞ{Œu‚›Kïnã1Öé{÷Ž±¨orusõŸws‡¸SÅ››É”Ò››Íª½·oUw~sÛÇ>¸iÎ=óVzpn°›rá¶%oê‡ûÖþ$ž¸›äâJlª[ r«þ¸Å1›ŠäMÊ+pºÓªÜ­Mór‹Ô6ÝÌ-лÕßÜâÄ›ó,!æ¦z3âFQôfÔ¢L:â›K}«ŒºEá›ÀêÀ¯Ò¬û€;…×}Ôª;óMdvËRnÅj·$g½ÝÒ£M8wäTwª»3ýÚ4{gž¶©ü.¹Ý­ÅÆ–N©á-›¼µØØ’Ñ)t<’ÖMyä··rÊ3¾4˜=SÞE›GZ}¯ù=ÖÅý4Û:ëd][#Ût_+·/ÍÚ–ÙÞ¼µ¡³¿¼k?èþÝ_ºI×ʱvŸöµfé]Ý/Ykçk[ú¶¦Ù¶jn=·»%wëØm öÖìÛÖúÙ"¼ß*ÖÆâ¶ãÌNäØ¡ö¶åݾ¶w=×mqï—®;êÖm}Þ†¯ÖìºgoÍÜm»ßzÁ·ÁÂÖJÞB­ =ƒ“­w}Òlï-"Úšæ#„Zí·a×֦߂¶­Ã?£¼ pkg±¡ +®sÅ"ÜÚYlP†=Ð]Q[Œ¼(î"ì ±…çxcñWìÇ}ª°BGö”c€Mö$e¸ÍqæÁ5CZq/{’µÂft³'}+\燌¸Ë;÷QkþºÀŒöx)ݧÒ+Æi?Ï +ÚÓú fu[XQZWQaÅuíõˆv_×XQe{}d¤í%–×ö\ ¸­¬³¡æöÒÐÀÚÝ”6„ÞVZ¡}[!kGÞÕÁ6€áZNÛ‰³þ¶áïŠvrVú6üäV\Ñ—·•Åº¹Õ%7ÐçVÒÜ0£wÑ p:«¨™º•[7<ëSvÁnuÝ ?»•„7øímAyCïnõè ø;+Ø\ø¶î½|­šO|òVgßPÍ·eú ½Uùw`õÚ ØÚwý²”©$³¾K¥téSèÇócóoº+=ØZJ¼ïDéÍÂóÆÁ©ß8YDuÅ%°u1ï™H‹ °ÿ´õoÛ:ð楰’Pÿ>ÓÞR Ùçlמ²6”ˆ£7vש>›ÀûK²v?Άà²Wc +*Õ"ЪwxÇC~Ší1{¶¤¾ÜSÀD ö`ÓóªÏcˆÚ‰‚¤6îUç)‰$Ö}dù” oçÉAfŒ´ÈßiWÀÚé#\j‘>OÑýËøþ~«€ÿþCîŒö²g»©«)Á»ÏäñEÎy·Fƒ‹OÄ^r‡‰íï·þïÚÝ×)õZñ7ß»¸ñrØG­žìs)j~\}÷•Ø¯ñΟ‚ˆ·u‰ˆúwç·p¿„wnü—/ÏøU9_)0v½¶Õ¥¤ã‘}3í$±Â;¶L”Öo\+HsÛyc2QÝ‚àEgë¼zJÌÓo.1ó¢îMfÆOY^?~]EÖ;µÎóuN´®‡××lËéíUnËòökÇŠ~Ýžux¹©Û6²=“m+Ú붥ÝÎŽmkÜæض½n³sîη“{ÛÜ·—d ¶mû±·/ì°lïý»±Î±¼ü·6ˆhz±P î”ÿƒˆ?Ì âO/ÔÍ´o uÛnÑE[Âjn%«_¡–ê:¦N-MðVÎìY$’]•ÝÈG~G±;HBŒ¢½µß(v¥saW{–Lýûè‘Ë«V´$9‹V To„ºÕÁ©uJSzÐ댒¦ÀÓ7ºÖ|FU+[aš÷p^Õ±Iv$à¥×þFž{5Ÿä¹I°¤–eK7íµ»§qÛSk•Û. »@VMÑ`¾ýiìuIÎ6{@?AÛ°MŠxÞÜ4ʺÉ7ÃLcÿåžS•R¦G½Ü<1©˜e-Â7;£_Ìtȶæ§wô¹€#º5v›j7úÜêžÜ†!"6§-b`è +8^M)o>´hï_¼êï?àN'y¿«Þòv/WÉæýIÜI?ïOtQÞ§Â*B½Ï¨;1ë}b®¢Øûä^…µ÷wãN {{ÅöÓ¬/é~)ë»~ÿ“ƱݑmmYoê¶2Ý>›¹°mv[·Ù±­­·³l[£·Ùº¯îëŒos˜5­?¡,÷îþRÀí¡J\‚´µï½‘\|ÙFYl±È7RKP§«°t׃Í NrÇQ­žÁœ&IÍœE'`ÍØûK@‡NSƶmìmw—$…Íœ#à˜fr«KR…œoÌ‘*XáîæHõô_žÔÃÆosIŽMÊz¿½—7.I¥y#/eëw.I…)BçˆòDyÏ%©Ìo*èOÖ—$¢c¶ {º yÄÝ%©‚¬¨RÇÈ×7m.IÄá–LÜšµr³IBâÌ&±}ÈŒtc“„67Ø Tm9˜Ž›Q0H*ÂÉJZ +»cIåË(¿ÜX'¢§llw_}i}ÓæÄyŠ- œùÝÝ;IÀz)vs‡ËwÒúö|ö“ÿ2ï$©%ÇÃÕ’ì>«üë$×ì Úû»ÑÏö™{§Ÿ'B 6Â;ÎI\Þá`,K«U@þã¾ïû4  ”}Où9¼g$á>øÐtã õC p[ØáßÚrtoô£ý@ !HlkµÄü‡¨÷ýô“ä»–å3?ûw–;}ûë·Ÿ~úéÏ¿üò?ýæWß}ÿc}‰ÿaÚÛïM¦ÿ‘uþþë‹m Ç)1u[¶±J¢È9bo}Ç´¬ BRàa«E´EæÀc•Bsé‚þv0¬)ŽrM褞A·ã@11Q»g¡D±õÈ—/ “õÑ•8Ø¢åËîJYß Ï¾™ÞFˆ—ÎrÆÚxÚuw·fˆŽ J+8 ; d1;KpXzD'é J„Z61Ù´0+YX¤Š¸í¦ýø÷:…¼ €³mí¬¸ Z‹k ÑÛGïâ”Þ.Áµs1F±Ëì2®¨p‚ì!~˜î7ªŸSômÐ>V %»r?M(6v@ëŸÍÄ›w+ˆ}䱘ÛDÂ"-6 lrM”2Ðì`Ø’.ÊV°#9äËÎÃ¥4 È ú[Ò³YÛˆ:îŽå“HÎ`òPã àª"]ù¸í^Ñ­0TÛk£ì¡à¡$Z)G¿™ ¢7N€BùöÄ…0MÛtpáçÏæÔ$’ªLøçO`R["œéFMLa´¥(>kf‚Ö&³ÝqþdY:ùux’(x!ÍÒ‚1dñLeÂÂþªk“ ž#¥4*8g…pHe;¶–í]º ;N¨Ù鑆"TàÒ‘PÃ=}þ_öÞu×—ìºî{‚~‡ý%€e k]«ê£Øpb%GÅBJ«-1p“EQÐÛ{þÆ\«öÞk®ÍsÜiZ´#J¼tíúWÕºÍûU» e‰S£n"à^¶Ï¼‡F‘šiöQ¹.£†òI +Ömæï¬:é$†jYt#%Ê/.Ê{IZ›N¸5[4x|å5Q‹BG:õRY´c(fèSGtQ^OýÐTûšö°Sj3E„Õü`2çö%]{òÄ‚¢lˆ:âÏ×ÌøµSh§ý2ƒ|[”OætÑ'R qZ¹F%·ýgÁ'özlûF™Ñ>n³M«ù à[g +éÆóåWÙ:À„ü6$7è­p7Ø{Ô-@H²”ÁœC¶ÂüØ~žÀè [ˆ|E3BŒ¬"iß'Îé`c(6ñ^ h…è¡(Ç-v+ÅÈZ5p]áÓ>}5§ch«Ns(ÇÁ¤]‚º Ji[`n¶¬&¡Ú)8€ÉQJ”úSåÙB­m%›v*a¿’S}̘Û9¯ ŒÖL{¡ŠÂyÎ,p4@!MË]Cñ’‡±£ÚI˜iÁÁ>EâÄj‹ˆ‰{¹´ñ¡j·csU0?ìG=I–AG#©f>Zwè-ÚÜÎ6Ù¶4µºÜgwfs`æ‘î?a¿[µ«`ßÞDqFñs„N´ ¨¾§¨1sIðÌF7ùÃ`©âì°ëÄÐÑ鿘4Ù·’Öo·u‰®¬RS)è 6‰[ÂvbFê(9Ú °b©ž$fmٺƊÝqƒ}åÙB\•u½HDÙé·»è¯á@šR3ÁùÒÁ °÷'Wýf¨F~2g oÄ]6L6¥x§‚Lþxñ§ÛÙ¶ù7]œ%)h^c‰·Ùsúà\ƒ˜Ñ–Gƒœ}¸»|"} 7´øwí-S×:05aQœ»§\¾df:š?Ëž¦£l¢MäKÅ;(|¶ígÆ1ÒH››ˆÖ™¿OËä¼ØéTòlþjc)Ô€šûÜYµËà +‰ÎÆò¬½K‰=:¢nÚñlŠØì œª¯"½’9¤gÝÜ¡ZiNgÒÂ]v\¥YÅ&Ä5êSYÜD•ë°‘û©Ñ99;ØW’`²Mm[ˆÿ±è¶÷µó 1£Êª¨1Žv “X~P¹c`_ ŸÐåVTÔŠúæ›DêU­úv­Oœ0Œ:ÍÆ…&óS8Š·ø(”-b’¯&p©¶µ›=prÇâ¦mí Ë!P´íaà8Áª4C»q4é/åŠÖšMYB„bw50¢0Ç %Ú›ˆÜ› +& Õ[oºià¤dËL×.t«ûÛô8svZ*Z&û(m65ÊÊ<@…BRÎÞf‡H<$±j†ŒQwhÍ©ßÏ£m;•iÖz逽 ×Êlʈ×YUê}eÕqÛŠÒ—OHÄ3uÐ9ô«™ÎÁu/2©l_ÚPÌìîsmObO ä{^PUõñùñhú¬NŠ«0Û ÏLW² ˆÞ…Ûeƒ%gGx–“ŸÜÑ&è*\éüL´²»» VXÉ‚Nï×!"8pØ>²Ûè‡Ån3§)ËŠQ¤K”[¦Gòi*Œ›úœ06Þ*%¬Ò"µË¼šú%Ì~ö@—Íù¡®Ø‹æ<ô&º-ûêÐ$ûO±;.ce„Ê]†âƒ¤»ŒŠn°ÞÅ^ª°*ÝC¦@‹ÐJû¥ö  %Ý•»uy/“«âe^Ý€MO¿–Y¹U⚀½É…Æ!ëU}(•Ql#›ƒª­(«=ÛIÆÂøí3\«ÆöÐŽnö0I˜=2ÖÍ1#i{°‘ëb&²×›éPÏÎç[d©£¬ºy Q?¾—ƒ’.\M’Bò¥ÑîF¿ªÝ3}©éG'¡ù êAö±9Ù®˜`%Âô4«Ç!”‚.SûXj(M +à¦F­K™£ùr`‡Í)”ÈC°WÕ>C„Ðe™.`õl¹£¸cëxIFšY¤0u¨dЩi¥áU{ £ù:ýùø¯î<° +™wx¾„Ì\½9’6ø…x%=D¼Òì¨Sñy–U-M©ì+‚"|ÓM ÍyÅÅ0Ý2De žÏEQ´ŒXªh0="Rí¸ÿ*X½.B€H5ÓüfàaW›©¡ñ„;®êݣг£÷#ÞµÎØû0iJ™ 1Ë°ò×–i¦K®u®or[ÞüÛ“LVdAI] QZAø”pÇnHñ®uj ä%eŸ‚‹\âôÂB¬¤M# PÌv™ÖäIXn¢!4Ùµ†x³?hþÍ¢µ=oº¶w»«Q¢çS)’6›³Á€ª;°z7»šÞháÏçþLèEGÓ‹LoΫ— q5š ÚµžN³Æ”š#¤ØÕöŒ_^œ¡NGj”¤‹ü9Ê㤸itŽÚˆL¬àíÅV«p™·EÙS +Ý`Mœ6°rFÚDGÔKªÖ½(&2$c½±“ã®jU*Ð.)Mí*€¤LR¼Y +T”m5ˆÆËVd¼'ÊuÕDÄ(ÉE_ä•é¥ ÚŒo<0CÌO?¨ŸÝjEûçt[•jÄÁ&Ív0MŠ-*æ{š9Æìqµ!ïô{ÃV³½wÙ„ê~[ͳ÷œúd«XM ¾‘Ä@Ýïؘ,7ÍM(˜d:£éCè“lwPP¢ùDÉËŸ“`÷ÖÏÉ"„<G)ÑŠk8ŽŠ^0Õh ²:¤ÃÙA ”½­EIb­%FΪ +O|±LÛtÖmÖŒÖ-±9µ.‚ og5Ž}ÇP4ùÆæFv£YÝ!Ï.b½ÑXÿ­¾¸ +|„Ø9¶V4ú9¥`.zÆÍiˆŽƒúôQÓпñ:8`x/8©n|¤jèt¸ý©ÍÑOt@ݺQ 2.$  ®ùpÂÑL NL;§è¿Å;v~`¼kõ'‰ÒR]CBXŠ#ø¤H|O¸“g7mÚ¨èÓ瑈1U’ûZ)¡ïáZŽpl¥Æ” +!Š( +6ÑÜJ›'tïAzÁ nÉG¸t3ÉÇM<ẼAªÈŠÌ½¡Éi`h™&b·_!„RÙVA[Œ‚»Itv7‰®¶¦“4gÈž¤~†”'ÝçéZ¿­Ìp>ê]ÝÞç‚Ñ6@BÑ·À €Q{2 <”£ÃC ͺ! A.N^}§ä ´]*#>ÅÓ èqS¥LN7}b…¹‡6b›aò©Ð_³7Ê:êèØJ÷¼I‰]§[›”îšHòÏ>Åê þ=×åu¥zNK—ܲVÈ_g‹$`çÓä‘MÍý‡ ü´#Om ‡¯@œ* QJûL/¾Â36.,¡@°ÛTØw›õ‘‡WÀ‰7£õ&µCg%CB +æÄcwò}tÿK,¹”¨—›$öœœýˆ7N8€¨Ã\–±ÙÜØLIw×qG²‹ +„@‰ßrÞéu˜ö¤¹%ŽéºEöòÝvJîÃýI³;]S‡©5ݬ:^@¬‚§q…~vÛ«¶Bq•)[DÒcàf‘¬»…‘`ÍT¤±YÖMG¤«ã8¼Œ-lÜ +¿:`Š7¹øBÖ}_ÕòÆ>¸Tb÷Ý” +oOO%dEù#(‡ûm=€Wu0 ¢mα€Ä:wi™žsü^!Ô‚šp½LAbæ9piŽ‚MOÄO¥ÐÆq©²a>v•^•ÊÛ†°6_¥'/è}#4+Äì ›°ÁÙ÷b³EÃøü„-«Ü®ha[}û«éÌ;HÿJù6Yú‹|ÂtÜVÍQ†A¶¯JǺâDÅ€ÕåU™±è}–VÏð¬4Ïgs­Éi¤QðNVPr¨¤4wŽ¨RÐÂUí{‡Fš¦H ʼRœpñò챫=`žš(XU`õfø‘Àš‘¡Õá&ê·#¦b#aw_À0d[M!³«db97ú ¡­&³ ï¯øìeQ¹ Æf1‘Ìa"Žœ¢•Ý¨©kZp«!È™´ -œÉ$Wv5&mä¶ñ©ñX®ÒŠQŠ¿N´Ú(7JݦÕq:é69ÝÔX­ázÐbAq6%mcS›,RÈãP€kTíÓI¨÷ ì°ØVóž]IÆÁ›T*¹¸ •Æ˜ ÄA“ ãM‹»Q…kÆ15{¨ÐzqY*PŸMˆ£öqŒ)¸>7=”ŒÉ´ÕôGVJ3o‚ž™ÇN| ^XÕÅÌ +›£7îønx>ï¼ÂøœáP²´ÔÓåa +îzó‡®ÒŸËû@Þ»¡•À‹‚ë/Áéw¬¾³í~ÁÔªÇ"×ö¬ú;a(uZ+Aðã«pâ±µU™6wH3\pp +î}<€ÓJ<§µ| !‰Ê¹h´˜>Ë-6V’¤¸{Óy[$Hg‚ØШý‚,Üab +Ò¢+/†j*x|Í9%ãMkȧRØîŸQ±6ߨpÛ6ÔGlw¨³ˆ§h­Ô'1T||p¢ßŽÁjO‚p 5,;JaVIªi‚°µ8[Q*y‚ÈE@S؇¢7"T ýª˜‚Ž +ÕP[]ªª‚Î •YA݆¯­Ú…bAý‡b³Õ‚5k[C$Ô¾ƒf–Í[(Tݽ±¤BÍ^°ÃBÝ_°åBýàÖ& uˆÁ¶œ%ŒÁ, Á¼ýfWIÌäP‘ÌíßêC—ÊÎ`¶Ï¢Ðiè‡BÒ­Ÿ +Rƒ¿ŠZƒÏjc·¾O(­]]¨P¼°xÇΛ‹w­^á,4åZ¥¼õKß:ç6JÁ;ÿzs×➇ÚïàÙ/äÛø@¨COYkÙC¬"ÖÄoB^OÂ%¡?„\BAÿ6tB(ö¬a¤§5a… + k0+4G„pXh²ØFÓB³FˆÊ…†Ù‹#»aè; Æл²†(C Ì6ÒZiBÄ4táÌPëìÝÙÅg×ÆŸÛBk,8tmCÊ¡I)D¦×>§ÜíRÛ yh» +Áöа5ãô¡ßkæíb!YZÎBÂ!4®mñ9#ï:æBÊ$tÞmS/¡/dnbà’󉽄»ÔQŸÅv£gÌ–”ÆŠ=ÍX‹ß’ÅÂþÒÂ…Yt¬b2¬ã}bÝ‚A#ó~Í©™ùõ Îo’Ã!-w’!!·aŸCËå6»gÂü +Û€ô£¦˜"”ÑI„_^ÓŒz3™·àéQ¯°d+}ŠÀ{¨‡…è'&=ûåÔZfWÓ"ú¤LeÞܧ°m¨Úܘq=yƒ2ì 4·ÉÚšŒÌ8T +Vm³¿ñ9k9~Ëš‰#YÚßm'dMŒÇy]ìê¡ ë³&ê×^Sýq›ìJÂn[+† Õ aß¿-~Çf-ˆ'o­¾ø|70Y):l¡fá™ØëŠûB=Ä8uRºöl0ö…IÍLxû8q/q¢˜Fe¤õ‘mêºÁUmôA‡ÿó ûj¶ãEe9yϯ®SœÛâ+‡‚¦¶e·k_o†qÂV«Š G|ü•œ·á(„†ÛæëÖ;|·®ƒ ωt]S½0Ÿè×åù›¯F]¿ù8uÙÅm.Œã†!;áæ.S@õÞµl©`Â,)îÍ]?UXí ~.^`¼G³(ƒxÞþ°|øw3õî®®7;±¶Nk‹O¸»î€¯…;šž/3ïKý-ëGÚ¤ÛvD#ñLO,²å6CÍS|ñ9ë$ÆoùÜb|÷~ñrÝ$Ò,EõànP¶î“I8†¹‰œC}Õë^#ÍÒÈ\ŸÄÅÛ{Ö6³B.þ@A w™DÿT=ÌyàÆócâêÓyª À>+P1ãg6~Á8ÜqoDBÿüUœºEmg}=U˶£Ï€(ØÛ?´Ûh¶d@$ÆîŽ[?ݦÍÏ—ýõúæõã{¿Û~PŸ0÷ÍH®æ­õ—°÷Íî‘K…}md€Z&@ä(àæ”öt‚½;‰á)aRÃw|0íóØiÁÎd·ô£mÌ“†×ï±”dÇïRŒâÄ 5AÝ䬊™ð"â ‡¢Ù¯ÎÄ?Ó¹pEZ¨§*å DÒ¶h…¼%é1IbÉ„W;.‹|zt+Et…1ÿüT4ÒEj8wV§=]uZ>µì…gj :2qƪ¨Âq(žfþS¾t‡`î1‡zC£|O³æ€“ÝinÏè)Ía¬ƒ¥o§ÄðG‹¦CuÍxÞÒ°ä9ÈlÇP¢ +px9%Ùò)†:s½œ¼ÃI‹±Zœ…‚ld"0ü®ªÅ'®ÐT‡{\¾ùtשIWš$a"4s—§¥‰ò&JNŽ¬Ø aOÜÝX’JÉÍ‹Êl`?¼&Û( p—º™MR•W%¡Dj#Kôky +«¨IX_"¬|=h€D€ÈHéuìô$3ÝBb3kTÀÿO¤i?ûÜÕTØ“‰ÞqñÛÿÚ¬;Ÿp‚ºÙØ–Tƒn¶O˵pv^™»° Û5À«šjZ&ÖL½OWþ¹zãÑæ8‡ñ0=V@õ<‡ dGPØc;¡ïZá3¼ÝV! •"=£, ÈëRøœ¶‘'à)ídÝQ7E³^îñÙç„o!Jr¡éÆ äxålã#Íô “Ї²N„,š(–!‰æÔâ¹Y€{–Q$¯°stl/q#!¨|€L=bØO¢ãÆG% QÇ8æ I#ÑqG Ema'IóçA&#ǃ$X&s^+ÂÁR–í´ívÛÄ–ÐùîHöË;çATKV…ªˆÎ§g”ãO»‡útÒA«èK…è$]”'Çâ‡Ò}jìý¸ë«†}'Ä6ÏYaü”Užn¤ñ~äëÌM=°ø¨F–õ‹šhÝQ¡ívPTŒëNŒÊuÙÌQEo=þ áÇ +¦ÁzãPwG:Z*«Døkç³VÒ韛ã€^áËöJ7OæIʉ”Š¨ LGü ÇÁïʤ\-qmÄ&M;+N*—å Ü…ó%ˆ<çÌÒ&ÚJG)îäQÅgwÉCs…4ÕZšs-:òL§c^(Ç· wrTnX¼Wuç{ûõqÀy‹Hˆ—zñ*”.ûn`gp¾É³ß(i¸NÚ¼ãHMìÃß ¿õ³>aj%R üx†gØŽ(9â»é¹ŠŠ£¥ÕSÈz&•:a+Å/&#ù¼|5:N̈ÿãÜÂä„s Y³zÕÂœÌgÁ=®®8M~™¤ðñd +½¼§¨Žð½„n˜? –ª:›½ÙO8† ”äUHtSsb©·w:{RCÏ}Œ&WRìã¡à%ê´_‡ °ùc+5‰õT®ÔK¨{hé’ª)”¸H®PE\ФàBôx**¼pÅ,ÅÑi»I ¢ ÖÒ¬„Èêaj]»A¢®¤*³sTE‚Úâ >¬Zf¨÷@Y5²…ô­€ÄH嵕,òí5E6utÚn¸Tq¤ù1=òLúE‘“gç3=â(I±q›’<jâŽäEOtò7}žÇÙ?lYDLÆ€ÙlZEž‰ÀQá4?LÉg.q¼á‘·uFàRJ¶¶Ÿ¶'ðnº‹ÒÒ‡µ(»ºcnþgße7ÓwII¤iÈ×í ±”L‘I¿¶MíðMšŽgòž4¦°CØ+ ÿ/9)êŒÜ·Íw*ßzåJ]íäýSŒìk˜1?A“°ì SY) +“'åk_‚ýEë£MñîüåûúŸ—¥‡ ¨*öQ#Õ©˜É_ +VO"Pnewª¶Ìb£ß„h =ÉŸô¤f"º¶2H­HH"h“ÌQÄcMÐ;*mฺ_Šw¤iº¾rQÏd6IÕäŠÞ´ÁðÓ‹ú@ÌF¾X¢…ùxÊdßÙÈŽ+—Ô{ŽÊ¡ˆ´¹oã?8*#!–o5™Z£":VÁµóÂ/:¨¨˜ð<†tàü”ÕÊó¯ŽÄ$]äK¿½·óÚ::7¼‡(=îû,Oœ‡Âþ@ÉPyóó×€6àb^_˜ÄWÈ£èûè{áøÙÓs3lºVIÙ¶£êr3s¦< ¾S ùY?X´¡P³@ú¹[GT“€ƒh÷ëm)‰ì{¿ƒ(*¦f£e|ž²Ù‰üŒ6 s5¬ÇÝÜãĤX;kß<çtÐèCç,¬õ[àØæv²Dÿ[“W¾*$ŸÚ{?#¸C…¼¤’SA¤eRÍ &óAC¯qiÌòAÐô¡Ã +ãP.AÝwML¿Iά6»ƒZ¼ºÙlTh*žÕ¨ÙL¯›íÝ^í3qbŸOÁxÜæ½ïÓrøß‚ê¡üášL$á=?_e|óz¼÷#X¥Dœ‰UÒÄÙ\%ÖvU‚ä ‹„fØQøÆmeøº[7z`Ùñª‘™Dú=òù8±*Œ ŽWòbNá}ûÀôCC!ö+“}°_Ù”7è½#eí"Ì7Bµ}â©qø^fÐìxBÞU +={õi¾íŠx<:¶/ ·øº¨ø‡¯‹ÕÐ>¤ÞW\ì³Èp×D­ñWº®Öʾ¨TMˆ™‰Þ9ÀÄJê¼¢Ð÷V—¨æ0ƒýq½ÀinŸ × :•Åèd|è²w¿9í®Þ}”l·Á]^(šW\¢¶E/¬ŸZZ*Ä}f–¶¸Ïˆ}ʈL„öÉsÅôÐ)e›<Æfœï5릟"‹C$ÒUUO¡ñÚòÁ>œì1к°È*ͼ>VuV)Ñaþ­4>Ý™3Ö&ÀlN±ßQól±WÈÔš€†„M+ÒÁ®-´wËŽC$îL!š˜¶Á‡Jy÷àò¤ O`ǨñVè“ZrošZeó’0ç³>…P–JI…yRNUUp)‹5Üй]æÚy›6íEèPÈL 䆃}‘:(F̈Ÿ‹‹Á‡Íaù"Oí÷ÀØsQ^T .~e˜™Ç`Ë0C[ mº W·›aqÒfA ++gš|OÙ#|@ï¨x¶i¦Ááǽïkó«šÐHœ—ßMØ£JÖÆŒòã‡neƒæô¢:qKØóÓ ï¤*S{JñÆë_{~ +}I¼,{mEvUÝ)7•¦9m´Õ}{?òMiÜ]6ÚÊl˜*ºmœõò²">†\=Ll¤ãÚ(«³¨E ‹%Ãñµ¡{òI`d²™öZK5¦$¨´'m´ÖU„cF:Mw}£µÌ8¥ ë‰òÌ(-ÙÁ¢¿ÁgÛh­‹¤ê,M°u£¶ìc«†„-wõÔÏ9’¼£~ž;µ…kͦű'‚Ú" ‹°Sh¢¿} ¶î‘–¼ošå®Úº/O×ÜH˜/ƒÚRñ5Õ7ÌFy¯¶” §Ô…¹=(ê-j³MùEu¥ÚbZ8¨-¦ƒ`«®*Ä×à'A(–Ëý¨+¢k„pmËßv>RTWŸ?:?Zw½†l;>!¤Eu}æzOö‘ ­ð‹y=ù#­õîwYø”´»ÁG#Û Påõ«¾6m@ápvRëé"ý 4ÖÖF[ý^†õϪ¨~÷ÆùïYO™é_Zlô§˜¨ÖJŠ^W©) oó@9ñì™×áˆzÚ5:ûÛ`ˆ¤Y“6®¬Ê• +"±šåtG'ƒK‚Ö¬]‡ï…˜ èäc$Î(œ5;‹íBƒ[]šø5ñÆÉŸWe0ÈÍÐÿܪ瑉£ƒÚö®zT|q{ªÝAB+94‘Ý¡ÖÉ'" t™˜œ¯L’€³—)×4$(C;ËjAuðÈó$£UÈUŸÒùüL•MTøQ'4WYPæ*b'ÅrÐáÓÄžbØ.Ý@†=Ó‡‘ kJ•uÂH—ÃÑqi®;]>fú)93Þáΰ­‚ýpJÝu½Øæ­òâB&Ÿyñ¥>D;mkÔÕÃnkÔLqÍÀÒ¢?hÛù¡Et­ÁT‰Øz³©Âë!ý¢wœpJTIÇÑO#Ø%xk?¡» +4x°`¦FüĹ/§»a¥W5Ê–¼ráMÅ .….*J–¢¤¿ö†ëaüa¦Ë +x5dïâ½ÐçÆ‚OSéDÿùyÎ]{܇͈¦ÈÖ9SU‘gz’¹9M”|ÜI¯¹¦Ú,hS±"®BP›=pIßd5ÓB“ÈËgÚO”<ûúIí7ZݪŽ ÊžÙl›Ô†AÕd°Ògá‰fÛS_{æ§ÙΊl>©èÝ°H}MNâzšD¬Ùø)Ñ ”}³N]Õ5˜øì·ôá+«ôu2—ŠoÀ*¹ ×ý¢×5zŸlÃÓ_ª`…ýOS&t€Þ»ë¥Ð輎À¯•C; *@\ò.Ér#lHáÍ +Kå)íUCãýT£;±›r#‚ÒI6¦J•Úê6ÞŸ ö¹ýñ Í~ªLÚsÒT¸Ð:w.jzVáÇí°â&@OQ¦YLÞ* •‚ÊήžÕ“ç4¢fä£])ÁèÂnU…2~RœnÝŽï =â>KĶn‚Ú%hçþ&<-œk{ŽkÊ^ë`èú<"Ñþ) hÙ§ÜbßÊIÈ ·{¬â U•Ú¨sšž‹©Øz€éO‚,MUwPŸpÐ’õÁ‰øm|Ùºç2L é.Sÿ…žc“yµ© ª¨³ÀÄkÁ΀Óõå³3< UE˜ Í –½)tÂæfpçLwB¼ ÿ‰ÄªÉs•â gâséÂs6±%wG·íX5ÇÛÅH¼=Íö¥ØÌ«w]ŠÅ ûr…·êárQÁŸj× ž¸Å`QÜQìƒï,kM„Í8åPb K Ýyb‚¹P'0tTÛX–½{P†£O«Þ Ö± +mÝHðÙ¿<0œ…wï±ä¼œ`k/8¸;þ|Äi…ïÔ½ÃI‰ó˜• ²’Ù’/ž‰4ëƒzeÁ=‰Á0‰^4¡Ùœ…š–—ž^Œ· ë©zÙÂô,žü$7•ûÒ‡Oºß)’ønÄgµ¾  ½–Á“R’X#zž(d4.98¶>x;ÅeeÈð¢*T6; +DÓój&eƒcg&™3ÞÉÚ U3‹VÐ6š•“¾Y¥Sfª4˜Y€à((’!"BL˜®è4F¢†"ƒŽÔed†þ¼ +&ˆLa•A'XïL-åé=´$ŸÅ©òÙCñÍ›ã d‹­éÞ3À°3¥–nÖ؜πîEXÓÙê¨?FßDÜ#]{Ï€wʨr‹Å3Ð* ¾8¹Sò¶u ç¡qR#¬ÓèÀD›hZ-ôß5ºz/-Ì…^1½ºX–âi^ÝȔ쌘©Lþ-G/‚[Š®L8‚wuî½Æ¦VˆbûGøÒîP"}Ò ÀN™ØâðK-pa÷\{o^¨F°¸Pÿ˜zôrá=[tšò¢7`ó¤>Cfø °õ25Ü9“AmÍÝÂoRcë¯ikÖö¦— ôÀ+YóÖ|-0€œr†¹Ï[#‡ +2¤ •5o­vÅÊ\u*j7ykiØ3µÏ[3& ÿ(THÂ|yk§m‚(í,ô ƼuÁ·9$ÀÒóKÞZÏáèð€ÔB›)ñqƒ¿I`o%Ýÿ‡öçLù˜ÁþÚSØZØY#ú½$`¿ ÿª”™\µ)÷6m³ú5›T/êŠ þ_ý& À™cà2è\ý(ýõH`#ÑÌ ï?âU'ÒÎî/ +•Ç.ýÓŒêÄ>Py0h´gÿÿ…ùþcÓÒ¡ûDcŽ½‰JDÈ>vo¶²zñÍÖ ‚½ÅØ}V†ò¦§Ó!v?p2Ô‰8¹wCì^Ϲ<ããGäû]ð^ßB³¡}KWÈh Þ'Úl²óMûÐ}úˆ–±†]n˜nö ¢á¾‰Ó‡éü0PŸÀf³sFoµû@=ue‚袾b ÞËÆ$°`ÊÊ +ÔSø¦ðTÇ—€Â!PÏÃ¥”{xéŽz}$ñª% «ºFìS=Œb„=uQâ9îÙp>!ûTºCâѲž‰¯!{ ª:Ì\„<»gÈ~óó%dŸÄ#&ÂéóÕ²ß^…=sEç˶Q!{ûæO7¥Ñž[ Ù›ƒe楄:â¶Ý'Ö@Ÿû‚Ûc÷„ ú%ŠÐ$/dá'l Ñ^B÷&D„KgÆvrŒÜ'ôRh_[cä>auâïv!<¦}ä>ámÒ…Ù³4LŒÜSæ©ägÇ7QwÄ¿þ)†WÌB°y„ó~›OÈ lW¸ çe‘s×ÞÙÁ–:_ÌËs{º:‘Ë`¢‡ò›P[ Äìa¾Ú'JV§J[ĆÙÊUrÍöý€$®jI þ¨A›ueŸ€Í¶#˜·P©Í!mMϵ{eœ:é`cÛ#íSlc˜Mvó2»üxÚïŸCn2R[ì‚—%±$˜ð¥˜ò ˜¬Í‰ªÌŠnA;œqN©%}¹møÞ”¶£Ž ß.ñ»M’º—ù3/¶+fuÆ–¨ŽoLïÙÅ 1Žt©ÓäCp0Çã‡ã|uè~lO¨ñ†“jw”7§Ûž´â‘Dï Baw«ª‘’í5Bõ·Œ¢+3LÀŠ»€n6 icùTpd€²bŠ‚‹^[Dë9D轄K¨F:,×D0gér&s€Yf'&$ÇŹLóqW£¥¹Ñ0,B¦2jªTlŸ@>%ÐLi‡3T *,XÛ ¶"·8…5³| +í\ÐïÒǘÁ¥B]Tп!zpƒº¹N¦¦Ø9êy¯Âù;*ìñxÛL©æâôW²èÑþfø»úLRøhYag;–œâ“î„EŒ?U £<†¶jf‰S…CcúÜ|M»Ñ‡î/Ûx¸ i„‹ø>‡d¥í"}‘‹ÈÎìS¨ÜÎ# A ;ÊK”Ô(èi—à€å|Ž79J«âÞ¿o´‹æÖ*cSz¨d LOÆý#ÿ¯;\¥CÊrÁ&Tòöã%alƒ8h˜qìÌt̨GÛBŽ`ó +˜ƒ.Ër8õ tß’¾¹"á–¡=ÙlXXðA.SÅ R´´åšôéÙÃ’’äS\2¸n6œ”îéªÍzž½ô"¨œ-{xà ì즩>…ø?X`À'ó” ö¡AÕ¬„ +¿‹˜ð’ØJÞŠ$ô¤–PÂÖ¿œÉF›8“9·m€•ë´´¦Ã ‘­ï½½µš^i2©·˜ušÉå_B'‚»`ÔI”¤Ë»MIÌÌ‚­`UDؼ<"‡çXV‡Ãñ˜ 4Õ¥ýs<`3ê8rñ} OÅo'3VÛÖ Ë%š½ÍCààbôFL«2ÛÔ†& {&n÷}ºÜ–« &˜ Þ"œªÆf8¼ùïlënVàðÍF @!^Þ¤;lOš¢àj(zÒ)‚ì>¼êà€G„U ¸^gÉoúÅò©ø&Š6ïšÀÎCðQ6õ@·_šTÈ]˜Ts´“,´!:¡œ™mb”Ç7í%³«žãq”NÀ¿êC“öaë!8û÷)‰ñ õHvÙV(g,úøã:*Iž}ìÒSã”c%ˆ=³NLc¢_#« ×¹o~Þ„8¥(2 L›7‡;¶î +㦔31Ì}™|‚»ŠÁìf<4‡•«À^‘¾$éÞófõí#)a'R¾å›§åÑ}@¤š6›°Žè)Õj‡ ¤)d¾ƒl²íhYh¼ i°9X$QQ¤¥ ­gæc›ÕíÁîði’‡Œü H,jIVÉBã^M¦D¢ø$ngjäHQÀ)JDQñSÞ¬BÒëÉÊ¡›AØÈZ³SÜž]5‰KP$pÈ EaOò €LÚÖ)“Ù+ “—À¢D‹®ÊÇö„ ÖnÁˆ]WP_|#¸ræ²QQ¿W‚|S’D˜[…WA‡fx4¨ƒˆ¤^ÐÀR¨æ©Ët«Ï³ U)´{ß» _³Œ‹Â©ÁŶÈ&¦mØTíëŽh¢P$HC!mØEð«¥CèG-¢öSüðh-1hZ´B;[«‹çÜt gŠÖè*]­7!¬+4ØHòßÑð#xho€Ò±*Šöj5–ìô·ÔWAjÎ2œnÛKgv%Ø­Dâ’â¶Ãä,æ¯o¶:‚†­ +S%šÑù(*؆0Æ>Vøoõ¦à>$…Ó0Ý‹¨¼!Lcߘú>ÂsŒ°ô½ËÀ™rR8„';}u=À”LÀÓ)^¿¸/¬]s ‹ßy?T ¨¬2©,§nœ'd˜2¡po`À¿+þa綅»¦×G‰Šƒç sWpÁ-8#&÷Þï¬À•pÚ2‘¾´q_m‰eœØ©+TX|ÉW:Ü\r`9Ê Ú¾¯àÖ Ùú2ÊU’Â3›¨€0iJó‘ +Äø 9×ÇDóŸñPWNÕ3›ˆ:> +gÔs@¯dwaûPßõäÓ K`…®wm;DP­ûð ßSE-$Ñ€ƒâBŠÂc…§Â{^*°jR›Rí-6ü¦â³U Ðk¨ Å E¶â—@’ï"fäßšDU²ÓNíxF5£v¨Al ±;äˆ'„Þö1À2Üq“‰ +ÝÇX"™³JÕ¸RE1I²‡ê+,OÔø›p&bYß™ ×b4”òu-%É5•OÍÐÇ’„*Y\pû¸,%Ë„ÜBXWÅÜ}ð†tòkh¤ú,û +û3:È6šŠ¨J‰j̓˜ê¦­nŒr»QtºQdÛw-Ç0jzBìôx6V|WˆÍ£Î ‘æ]d¿i$‹Ø`c†€ç«&ŒãŸ(J_’ díðßoÂI0šnsñ1k΃¼Ô˜@µTë!m‚}ãí ×QÅѻ싺/Húe©èMG¦²\¨6Üd‚Ê.‰Ð@$*1£äsG]Ý¡²Tú°í.Š¥«P†kêéæ5ƒFâÄ/ªÁØc*5cLÛ1v†*I€ÍÚ[¤ôTáOa™f˜C‚[¨Û©j¨§q +ڈƹ´ýÅÙxɤGÐgEÖÕ-¦7FuTú¢ ð‡xLà\œ¼Íf¦ž”„¹Ú†Z]TâUr¾jzo^l”«M•MŠ0êi ™›Ç½EºLc¨f®¿uÃW\U@+¸áD “j~Y#Z–‰ûýù[}/5¿¶]Mx"í4ª®_³½IÒg…íláóØ9´Ïé.aŠ4uFc.—[ÄÜU’f€cŸ"‚õ‹õ1ÊoÂhg‡Y»7|Js0vÚ2ˆqHæ(¨Oºx›‘!G–™1¯G­B +k&XØx°­Àp÷—zʲLýVã6ŇZýÃJS…z3êr“XØì”5xړƱ^7^G€7õŠÐäñ÷.Ô€t¢ )žúþ5$Aö94År’N>—¯¦Øý£}¿™4œIŽr8Ô´Ûà~ï.Ó ÂŒ¸¯#Ì N¹ô^À˜•.û¦õ„Ø‚ê¦=ƒ‚^SkGi×ò^Þ‰Dœ¦ÀóÔè…J‹„bN"›7Ê^Ós]ÛÆÆ^>½PöRxJH£c>¯j  Ç!ˆÉîL>Z„bÙZÙÄ”™Ï Þé f‘aqr§áÍKi‰Q“Ê X˜é¾ :Ï<b-ÄàÀãy|É÷ºzš¬^.›göoпvN +ίm„ãPÞ¢Çã bM–¶zšðÞ™8UP÷N‚©-çÉÑþÀ¶ºÛk÷Ý;óSâILÕBgX0ðQ$YHu +´|µ pU/ùù*Â.#ä²Zb¦ÈÍ8&¢`ã—%¶Zs6$?»‡|×U((’Ùi½Ø”´ ª— 8íÓËÂÞ›¥´NÚ>¥ò°©$vµn©JòVJÊ4oW+ùt”Éh`³WÓ\M…‰ü­É”>ë`V ¿ßã‘«O î‰ãávað-€ì€«ÅäÖ+TWðP®Ãéc‚s/ÕѶûÊ ºKp’(@fࣺ§­|,û uÂrï†ÅO+ø— +ºà·êÑß w¸g¹ø›ç¬*\ŠôF¢íî ž›³4p¾ö>,ºŽhNyÎmð§ã«[N>C»üܹ¥‚{Ogâ%Ù N}ñê•(_#('À‚pƒº ¨[ª‚“}€­ +sj!™y 1µ!uÇš'eC$Ü"¢ ½.=Þæ»P Õ”Ú‚æ‚ÑHõÂ5Ü¡6 ³›1BcØG¢¶ƒL@~¸µkôˆò8¥ |ÄÞÅÐ2O³ÈjS [µZ%æuò¸s?¼ ñ}ÀßI1ŠÆ‹t®ÌÔ=‰‚q¶JžNHÔ‡f·ô#qÃ%ÈåªÍe§ÕìŠÇg}Jä.),.jrÖp$:C’7wt_1¬éا—cŸ^#Ÿ£bb);Hé%„X‘VªÃWìÝc¤–;è!Ÿ®Ò»@o)&Â)^°-pS~‚Åe4wQQˆ—ƒÎòª-*S¶¯9‘Š À?-C} €‹ËDîåûð9RLM &j!çn ÂsÌ\‹VÊÖ¼Gé] _¥DVÈæ#©×|€fûÖš\’Ô3ú.¯ÀchpDˆ™ûàjVÜ`R¦)æ1Ôlåtâ§NŠ%¦íø‰é¬¶®—SÑ÷Uu]y­ÈLÉè̓LsæoL," ýxÆï2?Ú´ôTÚÛRzÍaPÒTèÞ›¡5ç„H^.¤«„a ^y;, æ‡´K§f€¸Ûüì5}†VòýBêEp$K +N­a—z±Ìêi1“ÇT´¦ cÈPÜkFÑþŒú;ÕGºfY™[[‹öܲÉN"F¼1>SÕ;­÷X‰î©D%"RfÍ‹BýC³5Ô?ÝǺÞa§ðTÕµù‘Joó«aÀ!×û´– qbB§áÖ|¶û¼òsóH@ÇÇÏ?l¿nþ1 nÍ“Ç Zóíûù ÍoaFª!.ñZ1°ß*kåAØqkñBÜ´kÄ~ó¯Åñ­õÏù ÕÛãªBÖÿ–ñ +TÞ +PßDU¨‘ ân­´ÙJÍP°3…n¨õ b:Ô mÅýZz´*P»ôÎ,}Úª­P95•^(º +ú2omõn( ú;’ Ô£½5!B9[°@BI\°bBiÝÖš•yÁ˜ +E}Á 5[Ãn--œFa(JŒöäZÜìÒovE’Á¼ 5–ÁLþ­¾Su™ÁÈÁP•¡;{?˜·!©F×c­qݺ0¡V6¸B¡Ì6¸S±Žwç–Å»Vï. 1ÔoÍP¿¼:¬±úówìœçÍ]‹>˹ƒÿ>‹À÷îÿZCÝÿP~B¡Œ}Òåðkh$Ô¨J¬ÇßeB5ˆí„†€ +ý»¨RìK@1†v†½ +ÍÛàWlªXƒh±1c ÄÅ7a¼Ø²FcÉI -*ÛˆäÒèâš¡U&ÄFCËÍÛÐjèØ ‘ÙÐõ3c¹³WhŽFk9v+­±èØõ´‹iÇž©56Ú®BX=´omÃó¡ ,D÷c'Ùš!ˆi»LC|Κ±ˆÍqkÖ#6Ùí²'±YoÍÂĆ¿5“w¡:ømT©ž[2Kµ°à.X£[ÌNÉÓZÛø¯Þ·9.v456ê_Se BàzLˆR$Óm•$²t—¬ƒÏU4d&6Ì^k1éÇÜ“Kt»ó¼câ»{vÍ:N-ûÉÈȸ˜¼¬0¬V3~„¢¾æ@eáœ$‹0*@i%æR«h¶eN¨øÈö¬ùXX`„ÙoÓD”n—ÕOY“ÃñKÖsÑš¨þn;3kÂû™×5]®¾˜°,kÚ=.íš¹vÆ.ñ7ÖZ@7çZƒ÷ø®–!ž•µ&"ž·µ¬âó ¿ŒÉ[†ß´ Úº+¶ðqÁdµn‰†Ò’«p†|»šGiVPGŒËêT"ÐÌ,ï6/l@™°Mè;Óò +~½Ãù!ȆŸIn…Ç€õˆ) +í=F…½OœË…¯Â ¶Tý$wv¿µÃSnO4fÄú¦I±0°Îz‡/ç˜ðó8‘·×-¸˜™Ï­Çë"þÍW£ºŸ¶øƒX +%m#C˜iV¹™Ï^o¾U±ž3)¬9"]åðæÆ•¯×?ˆÐìÉÇ~7bwû_©º¯€zdA:-ï‹7¼ÿêïFèêýMµ84™…&4ÚLÈŒø=að3Ïæ~ý~$MÂÁO&+Êz›Ïa+®”^üõ:oá >7ýß½_­ƒíePŽD‘Äæ°áØ€I)Ë¡ìëºG²ê“è²ÿ×]†—”=?O(Ð÷›Ã_&ª¦~=<ºa$ÅTâqAVJÅ ÷P²« +OYŽnüõôÇí„È:-á)qb)öÙõYߺCibP<­˜r9Vr¼«ñHPƒ«bš§ âHÌ +bŽ5÷×?Т_°ZÊ»ã·ùÕ²)7/\ïX?ü»Ø ·¢ ƒ"=ã¸aïŽP"DŒ÷Öêµ¾ŽÀl¢4]SÏO3Ø»ógxý„Ï®Á<‚ÀšèÊD?áÙé9S¡DhF™½×_ñJ“i ÂB¥ÎŒn` (V߸ŒGÅ?µÒPÓÔLšë«x í hÛ¼OÉh"°] ‹)¦·‚òÔu+ÔjeÑvG2Õ÷&­h›‰´@ƒRÕF§¤Nµv8x‹Y©Šê ?@¢Oê€è±¡ŠŸË?Eq>?ÅžëhÍ´%Ðf¦í•%x‰MdñP_*fèÍë +a‚†þÖã&`Ñ™s Fš²™b•”h>F%¶¤$¿Ûûv´¸ +>µ=Wå½EhâMĶÊóC>%išÚ$EñÑg ²I°‚‡g<&“<æÏÉS–¥×Ó‹ÍlÚ«fAè`Jâ†aÏ=ªEiU7;ù«ª¨¬(µU`¸¾¯g,‚Ï$}ýÁgC»Š9,gQD6ëði SÈí"1[_' >&XëÔ?˜ïæ=¤ ›û,ëºÉmäC=Úféû„è»ÿhµÛKÏÿÐYÆØÜÕAd•“6sËŽ©žà8ùîP©C +B{SÏ´9\­{‘;ïö9—a°»S]Áy»TtÁöF6ˆü–Va”Žâ%בmÇȺ£>!¿û)áCàŽ„/XDÕýÚŒÓGŠÜ\2bIq:0h‡(°«/tR’œe„êô¦uivŽV\âBjŒM õwIÄÏ–†³zov(Yä-™’Ps·½8hb#™ü~×äÅQ¦6ëÞœÜ<ÑY©m™Ÿxî”䣅$SSr½Ä³koRøÊܽN©[”Ÿa§-¹4ˆ’ìü\4ÖPê…¨VU¯—¼nÊ°c °ÕÅ0šÊù½ä ?Âsý‚ ƒ·™"<ÌCúa.ƒòخɪƒÂÒ®ZlnŠUn·TФakm¼îî Ô·‡$á°»"Øu¤ÛsŒœU~|ÖNúŒ­…†äñâÿ÷³¿ýjŠz•?·¤/A…U–†‚nó ç—ÿx½Jg#ùPàÓ„¿¹]á_sïÏ> ¾Þàtþëxíÿ»ë|7Ñ;äÎ8ÑpHú}‹Ô°õRgÀÖH[‡Ô¹bë Î®€:Wpý Ng€Ö_q:²þ[œÎ¨?q:??™éoq:~Àé\ôLgÒßbv ý€Ù9ôTg@ÔßBu:¤~Àç úi3@êo:¤þæ9ï!õ`g€ÔßvHýØ õ`g€ÔßvlýعbëÀÎcÿ`ç +­¿vdýØõ·€Y?vNdý‰ÓùùÃñÍ›côŽ4“e¢ûØ, Ú>öŒ»`ýÜ{´¬VÆ]êYlcÒxz–V#ã.Ð'žUÁ;®=ãnÓIFÝ3ù»•qÁ£y£q´owÓ,‚°ã »ôº/”»‰²g3ßlOÑýV#å.ýÝšÝÀ´K±P\Xî'M3(wìÑ(œËŒd\)wÍÈtJ#WÊ]¾Íe¸y>ÇÀƒ™”»À*ø¦Í4¦ç ù.Ÿ€8waxQRž&€hàÜ·öiÝp‹£_µÊ]ØG¥©z"ï;^´Rî¦î&žm+;iiC¹›ØÌ´‰œõȽ»ÞáoZIx±(']ìɄׄ—ˆÕLÓu96ÞR½w¡"y§x l¼xôTV :„×ÂËKk5%çµ²¿7ļë‰üæ«Ÿ’˜÷ï*åÛ¾­¾çåµùŽ–Œ•IÖìÈwD²í +oV¤ˆdÍö6oá„5—rº…•×¦° +ÎkÒÖfê1#míîe'ï¥Öû-Õ⟴=‹i¢²#åE¿åämý‹‡æ”¼ÕvîaóÓ Ž3;þ4uK%ÓÏ~º‘=|¼M}yÐÿêPð]:>޶ŊÿOCÂùîvš/2J®š/2J®š/0Jn5_`” šo2J…7%·j.PJ5(%§š‹L’;5÷PJ®jn¥” Z.PJnµ\ ” ê.’Ku8%wÚ.rJ®Ú.rJ.Ú.RJî´]¤”\µ]¤”\uYä–Üi»H2¹j»H2¹j»È6¹Óv‘mrÕv‘wrÕwŸ?ˆ?‘›òàMÄ#ê»È;ù9ÚÉòòž-ÑìóWÚÉNäÀyÚ]ߙǴ“ö©À¾<ÌŒÂåÀ̸y×ÒIjJ!o< +<ÄÏ<ê±N~Žtòƒ9é$6›iŸWuWÉ´GÎÉ=®‡q’F»íUÙQÙ}€KøSQÖ|´%þ‡ÑuJ¿ìˆÒ„Pi¾m[äº!J«Ç§Òi¬Ä˜ó†(ͤŸ`ãÌÝ?…"µeJ«æ€R`ßì•O;Û i¡—ï-Aš aHš¡löܤ1¢Ã6’.†È@¦êVµ£›ô:'•úÊFË¿†—#¤ñáB 8@Üð£‘ZÑ@®Œm÷?šDræ{“·q~´:(SRåîÞð£U¸6é×4¯J=l[~´šÆ›ˆö•sÿŸRuÅ]K»’¦¤aË&õ}Ú‰m%Ò£•Q>HÕÙ1wÃ;ž4z´œ2…âÜ^ö·EþÔÏ'L³¥ÆŒ7³‡ž½LòÄÖ»ü¨pf½ ÛIÀºêÀíô‡š`ìW§­Ë„0Ù 1{¾å8¯Š~q~4˜ˆî³óÇ2ÛN‘yT}öa.Œp¾è §·ÃD—‰Pʉ.ñ3R9Ñû­&ØìSec6“Ô‡—;¼¤ÊOäI{VUW`¨î°cÝžž&-lV mÖÄé,*‚ "Ñl£»‰4Þ‡·,Ðá ˜—ùO³Ô¨z +™v+ôÊ8n¯jõt4Æ3nbÄc”Ï Õh  úè©»¦ RIû‚B¹ÿxþèì8€ó¥²ÍzHB Ýu€$èa&X\C[gÁi¸ß$î;¨4,E>É€})ŽZÜþ¶…X_ 1žZœÄÄþó¥7n—÷]Õ§Ë,ù&Ý~ê/¯óGbó‡BOí~úq¼¤)Â>Úfq…Ð>„î’ª¬×­`Ÿpj³à*Þì(3ôO²Ð}umv&† y~3l¨÷Þlj~¢þiBPÔ¿nT–»Ù.·F´~ +–“\.¡ÉnFä}åÓB{?$õ!F&©ßdà­s +÷qQï@Í'fGXš¬ßHwÅ,uKKa@Ñwš¥ 3hݨ=Çt½ªa—UÌSZ{ÍøºK{Ýe‡WJÐAM¥„ –ÍMBϱ×sjo«ò”û¢Ï#Ѳ2Oöz®ÂÏÃÙ ïg|ûùAT„iR&LeVÛ% R/,mœa{D üfwM¹¶dùë¶þœæ˜©1 ++îW•æ„vðÙ«ðº.‹»geíäe|”a4zàó)$ ²í¦L»… ¸ÈL묡³¾šÂ‘Ú(ªÓ?èÞmتº s!Øi"2£ä¤ÆA7A…ó‰2˜ß&=ѳYàþ)‚ZF1ÑOÜŽÓsFÍz£QÕ’ê/P ©l“ôÍRvIžµ£麘ZÜì?ˆÑ­-ÚêªnÅPEFRh-=òIŒv^zÌ J¹™â—ù3þ[³½xYðMÀË>³ Ií*úØqH 1Ž¤]¼#Z{ý= ƒRÜ_ÔÇvákŸ¢5êXZS…¥=Y +2À™’ñ:hõ†Ý«hQ2xLÙ9JA°ÐÚtJLÐEgµSùU³ƒ§È2f©pª:«x®ùÖ.€ +õô¾9ºÏM¦g*LýM§/!æUæmÏN*_¿&¾}UÛ–÷V‚Goe¯Lïµ( +ÞžŠœš…™N”pŒéj^÷ЀéWíµ=Gz¾ªùLhãµ ŠÀ$’žSÆÁ ŽE”6Ÿ;:?Úãzåð3–S)ƒ#8þµ{[ÔïQ-z&åc0)ç—àÂàØæ:ÎTÿ©¾£³A·ªò;µ_né¨qoq,æ´•²³žÜÛ¾¶ãÛ<ŠŸëú%µ\­ËéxÆœ­s-€ó×;VêŸlpgËð˜Qbkþ¢”Ö¿úº8dMù£—óÌ+úåß¼ü«Ÿýì¿ûî~ø³_ý毸×= /ŽîöÐÏÙt¬Ô])ÒÓ„pËʧ1•H¡WÏ‚¥dJ•üA'ËÙ†AEѧ Kõ~3cÞ+&A¼fZÛ„[È’’·I‡¥ÔO™Z˜D2ü™ °³÷ÔÉÀ1‘fª3 \Ç»Vr2“‘Ç9p*;å´‡«:;&,-À#ƒ~‹+¢Né›TDdÃø”ÛQ!|ߪô ´×Ô&@.¦™)£Ç; °^е]+»wÐÌ$%2¤~«týé‘QÚ*L£¦LF* ¤#úð¦ˆñ)’29Äñüì¥È„åÁº{³f]TÕü‡$Šàä•Ì¦j„+[óöoáAc3ŸÔÖL>¨z¹ n0@˜8b¥¾‰fS +æ h(1ѺÌÃË™QÌtªÂñµ©>á|©L‡~Áj†wÞ4mè'i”j>'t)؇=0s +¹©.Ô}Àz@ݯª}fªiöL*Òr¦{ªóÙ–IÕ£(îrä§LÁÔ!ß‘…IQlYZ×í+ß2åÇ£=¤ UaØÐ|˜rúPz½›b×l\ÛdPŽ ÖÊÀÇQYÈyfj—ƒøª™˜JÀ:§¿8°’(˜á·Í«ª³D’qøî!”àwÅbCC8ßÝ( LÄHó a9 †âŽ ¹K™4;Ú‚%A¤[Ï?€ó¹d"±–BƒãðX³©fj3!`e]±»P÷Tìš¼ÏMM·)†Ç¤ fÊ\ +Ët&S}PB¸%wÒpW¾­#H*‰W¨zncPä(b4¢”à4~e¨Šr)5iL¨o'Ÿu'ç2e9;ô][F…OªzÌtb³Ä;T&gˆ"\6YGÐdUèðj¶äÚroN¸ÃAPˆnªq¼'ÜÔÏøåË9éZ´[VI©õ†~c›Jqr îb&¸[Ëë^°­Â^`’†‚¤±98ov  ™Þõ'Jp‰¬nþ±C ’ж½þüc›jœPê­NUðŠÒ¬†C~™ÐëÞ>Êwª°ð8c+ c Ü’óÙQ¾ï̯8EdB•žJ“ `èˆã–BPO„†PxR¦÷Af©:ˆAÐmØ2ò…òò#n'ss©…- Ð>æ*rvn¹³;ׂz;맽Çôb÷3â»?SWèˆï“ +Ô®Ÿ¯3ˆ‹—ÖùT¸æÌTx[g%”$V“Cp‡&Ï4f¢¥Äº!L3³é/Ç~QúªQ?.HšÛ¹T25˜ÅI„LR'» è;P2ö5ÉkUŠä–È‘S—%G‹ƒï(ñʲàÕê¿jª°o(Š¥’#ŸÞmȉö%§“÷ßGäCŠÎÖ1zl[Ò×”Ù.¯êŸLv5!sàÅ݇¼ Ñ.fó‘Ãç±;ã‰üjÉî{Ô:d1çuêp¯Gl}T­˜b÷®Ð'aïÞ’ß‹hC)³1¯‡Ì6uî€@‹}G}áUõôU`6x[€ÙÌ"|Æ+ÿv{‡¼ÏNbÏ»¯Qؼ&ÃP Öìtt'ú-û
d‹ÃÞª”W–‘+¹‰m™ºƒ—¹î¤"æ›køÀ|»”FáxVÂ¥¾¢a÷ØêˆvÛKã@${i¨Tn3ÉáÀt|VÇBdßáfv„ã¥R rƧƒR b'wU”«© +òÇmñ¾Ý¦"^–¡P“ÎT>ÖT’ðfô¡¸Èl‡"­Ô¼Íš1 +¿Ô0qp¼Ç#>(9CÞ–Ôßakq€Æf%‡ÞÐeTÄ#=éè:©:Ë^jÕADXP¹ö m_“â¸ä>euÐu +=.‡Ò,éf¼á](,æW°ðâ˜R-MãêÄèÝ›©ˆ YÅ”¡  Û%8åò ¾´jí}s™™v‹u·Œ;€Ô}…j̱§›( !.økÍÝN`{;Ã%¿†˜5ñ“UŠ=ãF7Ø}´È m‚jÊŠÝçHÀy +ëÊ0¬êé4šTuœÀ.i$&(ẖò‰Ž +¾“® šêc­i¬áŽ«z—J [TŸ³p×:^VOý@µZwá´i`›öôþõÛíL¸Þj» Ž ›)P±„çÐZB’ýÛöEÚ|K¸c;¦pW˜Ì/€º;ï–`^ç·ªç1ë°‚#ùÑ: aÕi¨ƺ޺”,“@RÏ­BŠ_øÒvÖ#Û}Û­žOGòÑ7ûÕ\*¿ƒ˜rM›=oªA¦¼y'l{t8‘d%ºÜµÝ¬ÕëQ–³kV’ÏdòðGTï² €áéçfšå³ndÐq +Tÿî%mdÙ  5r«$„Z²ÝQ†*10F‚¾ÆzF žÐßDçÏZ»}„®È¹&Wn÷ºƒ±°© ¥ «æþRl<«Òº dÈ}¯êàUôª)õ•Ï¢cI` Sq£¡ÕY}–¨ß²Üð_moN.½´ó;k„ð÷Ä|~gÈàfRb¾µƒºP¶6f”º®;Z`6og½ööÛ=0îWã/M§Ø¬Û”uc@š ,U9TECT« À§îJƒ¶ ´@!Ò±l¢C|‹Y Ž1 ÄÒÕªîgÝä×¹5æÁ"%g +ùM&Ø\;övŒ€á.ga\ÝŠÓ +­Š¬à …;¶ÎT¸+øb| ^Í,ÌV±Ø;Ñg[o0{ßep%m:dŸ;¡ö?sÃÆ¥ 7ÏòOrg¢ývç¤ÏLa™MÏ!\Í­“ž‹0ÄÁ G"ožSàGò ‘g0Òt ¡ÄxC®T°ÐgN:(oâ yj“°r›ØýéÚt…@êýA ›$bMA\›PLöþ,–¾8šÅÍ:Z*Q4¸bP(Qê‰)Cȯ§[£‡ 3D£Lfe‡÷Þ³®A°FÀÌ6)"FYƒgé|}‹ ,·18÷vë¹»ÙnÄâÖXýwÎûPáYÆG¬‘ÆFˆ•tЈM’?‡rÑ„@Þ­ó%jFuò1DR…B“û»ø«m³K¥Kж¿ d ÷JÇŸû1 ¦Î—°„˜»H× IӹظmÇ>…ÝŸè÷©õ+Æ˯&—sk~âáyÔßÄÈ{ϧ®ì™€¦}´æ`È>g­ÐÛìšL@-'%9”®Y í ã“SÉÑzRÁ‹J`^«mÔ} _ í/X]1W³ªó'WçŽobuGÛÃMÐ’lÛ¦y‘1X‹ @kÛt}åâ”^èOb}´ +| ˳dÐxA²le6À­'Ù B˜µG¯ ™ú´F'¶˜ækkO3Ïù|Áye½|…"Ú´í£¡žèQS¬¸LÖ+{uTBÛy&ª/șއ°™&+θÿô&êÌ*/Ïàb!€BŠTžï2‘a9;ßrŽäšâú5º’€Ä0iM(lN×M0Ü”s~Ö GÂ̺^W…OÂ&:è]í¯c%ïâúŒòñ æXzÚÊ1P@<=ilšûDýæHÿûRþþ»qjqw1Ø!€‰èÙ‹Wup@Óõæñ·ÍV¾š—¸zÃx}N±™?O4 dg;ÏMˆó¼Ñ¬Hq•6iš›:¥`‘S@FE ”àq vsX=ÉFC£kwòaÙ cñR\Çl£)U„TU®~PæÿÈ"±‡@·dVË݆E=ÄèønS¼Á› øiPq]†L¬t|ý¬¦»q $HE0A!øxSòbAåƵ€3§˜æ[ Ô&ö­ižý)ÜiÐÍ0˜áƒÚÔ°|0Ρ9ªîŽð—°SËð7ð¦:¢˜™3cKC9Èõ(1¡“Wš©˜~ÿT}¢nÁŸ²ÿ*}ªHÖǤ1‰7;jXÛÜjÑ@^CÃNÍ>6WØÇ Gaht…M\V›×iTÌ€BBÔÎÓxÐVÜýx×:Ê­¦°?A© ­YŸJ©˜ƒ€çsfH–ìQ|ΚŠßîØŽ)ÜæfͪÅù]³sïVgÉí…¥]’‚ÏžXSŠû-µ¦&ãÎ\Ó›qw¯iÒý)YÓ­ñ°­ Ûx`×Äïþ¼/ùã(6Öt”8K&{+·Ö|ø*ýBJ=ÈÍšßJÝâB;TL1?k +Þª„µ!*”QÃTQ(Øj²PJa(Ç:4Tul5ð, + z;Ô“¬?”¥lÍ…PÞŒP"ì”PjóƸ …:Á" +Å>Á˜Zk†¶¦X(= +†\(_ +&`(ƒ +¦ä7»rªh’®eYÁ´ýí¨£yWÞ äµDlšÔ¡¾lkˆ‡:µ`ƇZ·è +¬%s{—b­¸ žÉ¨Õ‹®ÌüÃÖš ŽÔZR±µ2qïÔ­ŽÑ9\k$¿àŽ­ïZýÜ¥ê3ºÊkñèÞå^‹PãsÖBÖèþ‡‚Ø]a­«1ˆµ67Æ1Öß}†`‚tö þÌ<CJ|“…Y´ÌÚuÞ£¬âyPôQUé¢ïùƒFM+(¼øfJ}æ¯À£BΈ,C»Ò,e!/vá›$W¦~»Yãamô(úý%¾,û"^sÓÊ¥m>{½Ã·ï:êðœ8s÷Ø] KÒA÷Ùx]75p²Ñ ³mz¢™È‰Ù6úáÝM™(j·†²Ú­b~Á%þÓÍ]?•1û?¿…KGì(‘ó}søÃò½ßÐÓû»@¬¨`yCÑ. wŠuÇ u±ðŸœ(3rMEÔÍlŠAç„"i~BB.¡V†4ûæ9cîâ'|0ãß½[HZ¨ÚÝž {¦éù—¿Ë™ßì@PçT¸´Ûxà† +¾cý#Øu¾[·<ˆX%}°»^å§ìyü8ŽÏ·¼9»Ï‡k¯#\DÇó²îëe+PôK€é‡ío>i³ø+¢mob(½œ»;nýt»Á7?÷Å}áøçñuß½9u`'ò#Ù|©LGÎºé„ ¬ºh³K6‡OuË€ +ð¯ŠK8á)aæÂw|0·sªèy£üA\¿6{o_à€0TPÓ,ª!ðS¡¢¢2 iñÀ´|{Ò_àÎ\Ó§=DópÃc¢î_F"7 ˆêt òŒqûú-sR¡è^Ň°³ÙDÂ¥Ù!¢ÒMª¥?2»*—\˜—èéÁ»CDP + Ëq뀎Ðé­<¨¾ÜDãóà )ƒ‡Éý Š™‚Ðv:ˆõ §Ì;ó/@RsêÑZÈDÛŽCµ˜ØÃ)Í–L +òÔ > ˆ’`Q n,J¥Xšš$FK¥”ÍáMu`Wº JR†Þ¨‰¾¸Ëy<°Á7ƒ'îqmô¯òÓ.§`n¶ç­ÂÉf§ÀÇköh¡cGwO8RÈánÍò”ä1Én&ŸJkâw$ÕÛ {ðƒñPDWã’ª`|2Êåa'óÞ²ª7Ã4Êqe"GBöoWXõ&¶pê ‹Yºj™Cä´ë~€‹œ NÖ½ßTa¼Ù‘…\o·ŸÚ$¦±gßïêŒåÍçÙѯåƒÃQœ3Å—PóDSƒØª¶@G–;´œÅupÛ Qvò®€yÁ`~¦j&ìÜ4Uýá"wäs-qã³Pá3ÏY?&˜W÷ßq@XúÖüîóµN‹Ìj—íá´_˜Q’zçn=vžF\W!5‡»>çtäÒƒPí!¢ðö’’j¸€Äêüúeˆ$fh„!lAÄ*léž”ýn“p0pTHæá¨<é¤xÀ”·:·…9§¾„“ š/¥áá\÷6Ì 3è(ôs½ÈjÄUÁŸÚ¯^‚€)­.Bì19´IòR˜,ž(“âÇä` +â.>g™áS‚äÝŽ(Èí9!SÒ‡\Å~%‚ÂY4謰%‚êÛBÃþ jxÝØS‡oEÐüóT›!È0ÄíÁ6LŸ·ƒ>2£PÿˆïÑà-Ü%g!btŠ¤uWhâL_ü ÑàÑ áîâ|—zÉ +izZr¢^Üc3$c0]àâTw Ar5EÚ¢ݱj<Ú}5RÄj ñ.ž H;çÏP ’RpÒ͇HjQö³Å;KˆÀÁj¢͉p¤j'§šdHâϪ#sj{q|Œ"XC;±Ãäù‰È&šúx’#Âf ýè >Š“>׋‚›SM ¥à>Ú¦ú =§¼\au @­.‹*ÏÌç¤$<î7’->œ¹¤_b1g#ûaäÖ= ¶41såíD­ ÃxÉÌ0{Øm‚% ±.hþÙÙ<úãðxªWÊ"g¡dÅî°[úk@õÀ`‚âÐÇHTí +ç£ à¼ÜöÈWš1”!ª’ћʘ3qQ[6aU_¡¨[%2_Ä0s¨IIƒãðĤ‚änÁO ÆèÁ=ÎAbꬨ“{ôH•D•ÍH™°Kí°°Ké{óó¿8ÈË…Sò–•r; xywÀ¼ÝW +æ7R6o¢¶™¹š6Ï¡bv¦¾ cÂN²Š iÒ.ÖõB°oGÉ$&Ê÷UxIÔh|á—g³h”U>³x>“•¦Û\º­‰‚èé‹ØQXRvÆÔª<îHRMhm´«6‰érèô®§ ,x·Æq{±{½}šék–þÏ"HY99lªâþ&ê³= ÓÏŸo's¬bÇéÚx']‡„“š*\>w¾ys\TYHí‘œhAIsb”¢Ñq1árÚžGêc÷J;9î›ö["¡jîæš1ÈyàâÁàÔW˜i N/múJ$³¨¨ô@2ȃó”É$uù{gø!FŠLubhq¢Q[BFyü uÂé‰Ñ®Xï™N1c¤c<"5¥J½¨;;A…:*…wHBæ™Ýâ8¼ªƒ¡<„Â#:`5¯‰jra3ž¼Eþ–ê¨N<`›íÉ1ª¤­tš™J·/ —Ú©Lé2–Òl½>x¤‰|/×gŸC#{)èõ[—ïV¢IZ´OŽ£–œ–]Qºß¾²f3ÄNéùÔ6È¡ +¬ÞðKSm'¢ålN ‘z‰¬Œ¢Yø¹ W£—Ô Dä½Ôð@€ÝW{Yí®®Dqú';S «&Ôç,¼ ÛXTH(+¥ê¯B¶cq½Ã`ÛV)Û1*³ ª“•î|$äDµe5²bãR©eÊ"'‡­õéÀ‰ùWåœSªøfÊßÝ‘ÜAŠ°íuØ}oz,»ø><¥÷ùóôÍWÿ Œ€Muƒð&MKÑCeGa@5y–•€ÿÈ«î§ù‚Ÿ(¼4·Ãd=æ§PÌí°ÓLW&!`½…Ö &nÿêE^™2“ øø/z—¹D4#÷,‹Í´ê×ປòÄá"ÅöŽPÌ.IM%Nh²ç@Ôæ/%ÅžVh»mdb¨·Ý +K®í›Ÿýt#ƒ°Ôµ=h"–AÏþ>À/çHúýSVàО¦Kn4…33ìÂë8IÞ²®«NQczðàQsÄÎs¥‘d§Óþv~`áicˆ–êù›²0éù}V-«6 ’:vBvrÍ“ºVLg9ˆ<„P"be›ä.‚¡ªè d<á„×{rÔþ®=í¡BWØsTo©óîðü¼íj\þJs’LSöÉZÎÇc_øàÄ'ùmúœÕcä©ÈŒØ]ä5œñé"µ³ î˜}u©b˜ÍBRè±±ìLQØ÷æçeÌ7!üç}”ŒRUXœTùƒÏ-#úUàP¿6£¦@I‘ºÔÕ3æ ìâá±Juñ~ÞIt+1D OÛ,_=FaUÐåuÁkvü>ª(÷û¥œ^f?=ÄÞöÒèV™e;Tþö.V$î©êØÓ&z;£ªËsN÷LnS£÷¿å¬ËcôHñÅ1yE½2‘iôÖ*;UæŸÑ&•–]ÑQC%`¨umÌÔïdï©ù«Oäp]ãsp¼jLñLâûm/§žÓ(S¬›ívÖâoT‡§g»½ß­}æ~û©v•¸Ñ{ß—QHQÞGyñë_OÙóëõXƯÇ{?€!Âøƒ\ säÓv-¦x KbØ Q°n6UÏaoF¿îïÏêŠém}•K/ÿæg¿úÕ6û'úW¿ùÍ÷¿þåÏÿäïþgßÿÝ÷õ›ïÿíûNÛ¾ò\|ð¼v¸ªûÀû׿øͯ~m +ü‡Ÿÿé÷¿þÎtòÏÿ·ï‡¯/ÿæOLGÇ»ù¯¿úLïó«¿û§Ÿû«ï¾à7|öo~ÁçüüÏÿéï¾wCòž?üª?þ‡ßüê?üÝ_}÷‹_þÍÏÿâF(2ÌÉ››ÿ—_ÿêý>ÀºR½ƒú9>|ÇŸÿÂÆñþâ¯ó·þÃöÑþô×ßÿößÿ£ù?ÿýç¾…é´¹ùÅ÷ÿ:3ßýí÷ÿé7?ÿÅ/þ?ÿúW¿üÍçnþó_ýÝrï@0<‚aúÝCýwßÿâoþö7_8Ö?ûÕ?þýõJý»í®ü·_ýOü'åçÿö—=~Ê?7þùçÿþW¿üÓ_ÿâ—¿±ýµ_þÙ÷cƒ|ó‡¯þýßñ—Ëÿò³_ÿÃßÿí|ÎcUö?úêxùcû÷üǯ–ÿ¯ÿ•Fdø?þ“ýÃÿjÿãÿµKÿøR_þ÷—ÿëÿ>^þš_ýÙW_››oj‹87ÿõÃW_ƒ …×Þçµoß_Kp„ØÄ|ûæ·»kã·¿|ý¢ÿã«CÐ4¦Ã½D$ j!X€oJŸño¸R®n²Ëôh¢é[j^*\iTS8ú5ÎŒµú¢ôɃVÞ™³X³>µ"té?ÃÄǯÖr¾øŬÔàMl‚ÒÚ÷“ æA$§_®ø>~/½ ã7±žjöùýÞþÍWÿI?/Ð<éúIexŸUFm·3=c!pÎïîwô8.‡‡|;žÞ?i†ÆlœþôF 7ùeÑ6ûEšü"¬·/þ«ãÉdæÆ ÅjÛÆw€01?ÏÔÚí_mnh—dâãò–ò‹f 'Ãœö²ýÞ9MôoÞcò;¹žÆå\ʸ|]c 'eÏŠ´s\<²1¥Ê¥Ž@XîラÜvʼxÍ‹‚b¿xÖùµ°øՔ뼕Æìq‘¤Ä¸Øçï—¼íýƒ+g–Ù|ð1ö:ZU}þ®ïzun¨­ÏqýprÎãEg.“ê G…ÿ<å<|vhX¸Ç½4÷Ç +´P»()´í—颷Î5¾À÷Ù~×7Ï;O¬N2ù‡q¹°Eu9Ý×üà‹ðÖ8ed +ƳëqÍ{±œá¹¯Ëq#Íô%Ø”Ÿ{a¦yfô2Ÿ¯2ö;¹¢9³ŒMf䙢|ä!Ìé™SdþÄ5‡ñl åÃ^¿ø|^wÀ‹7×´‹hÍ%Û1½¢ãuði;ïùi„o^÷ÐuŒ¯EÛØÛ*¤ÔWpïö ¾yäÞÁ4×u>ò‡´Ã‹FzÜçùȉs4‹©øÿU|\-iu†êOÎÉ×ïT?Éömã3òñæ@֔ǚ +Žg^n]4E\´Œi¦ew^ìiì«ôRŸ¡Ûµƒß[ygîUíc‡›§7‘D/¡I€{ûa¯_¼¼p~qMmj¡¿wßwz³™ÇÅ:8éGyÎY›sO Á³‰îñÕÝ¡¤æ¶ïç1åôQž«Ë3†ÔÉÉ˶Úãr©uLõ1…Žò=iLj;Ëëååóá /Îûå¼ü0.“BóË ¿Ø«Ï_%ºZÇEq0–Ç’ùf<àŠ%Øæ½·¼ûÛ³~±Ðy4%b:Òó€;_ó hNOM=MIiS»ÂÜåÍ´i~— –Æظç=¾‚®‚ñößñiÜ;÷]9Ï9ŒRú܌瘱ðߟÃn¾ißb¥µ~ÀwÏœ]é˜×‘½à,óˤ7çÜÝ`ª_s&(ø2¯•)©UŠâÊ°´yÂë¾}];%*õBBñ?|tÿ¸›ZR]†Îõõòû‡¼Ê¼ó>Çjƒ©òȼ{\1{ +€2w÷³ÖÅu¿_ì÷#¦gZd¦ ~ÀØ*徦ì×üZòž¼ëmîø܇ʨ±Yeo?ÿõˆÞ÷³a[/ϸŽgE(Ý×rYÏWסÎóuœÏ—J³ºÙ0„nz3¹™®ÝíÌ/C|>Ö”9§ãËšë[¿ã*ùN¬¹NCƒòÚ±ÄmÎn¹?³ENª¦Æ»¦ò;ɽõöû_âýL²¸¦B¤tX¥y,p±³6Çpy*¹sØ|øšÓ_âò=­¾{yÈ|ËPÕ'éôí|óL¹©‹ù`œãgë>FôÑÜåâYÆ^PíƸØë9/–×)33m W{^|¬ðûõD¼ÿ‚Ï~Zz|ôØB¹œmŠ»ýîÍв÷ù²9´OùDz=—ñöçÜÔyÖÚ~÷Ð(µðt##Ês,¯ácRDæNjƶrÇæl÷#ìâqçy'Ý? î’4îeBü9Ô¡‡Î\>s¬ЦÈz{±SÁï{ŸÇÊççmø›çã3ààÀ„]Ò|hju|ÕyÖúü^TÅMø!ÝèQ9Gøˆ¯qñvØÉé~X¸ýi< ƒ48·T=\’GˆK¯~½ +§e ¾—Ï>fö9U¨õôØEª²_¶k;0ÓÜ"Š%ü0.ל†Ð(ìßλïö¨¥ñB[_‘ú.'¤„c˜©j'|Örìs[Ês-ÛTa©\ÏÅ(¤ÌyÄcnùõ³ÞâÛGÄ¥=.ziˆ3wcÜöáMTJ·ÎÅà*%Ç.©¯6Sa™‚#Vffé{š.l¿H{Ç4;Îü $=VÃýêP+;öt~< ò@slùzý‚ë|b.÷4Pæ©DŠœó©{¥öi’?jÜz?ò¢¥éö|$åŸ=®9Øénrížè÷sã}¿Na¿ŸÇ>q‹w—Óqôç«p¤ÝÅÚ^ŸÛó#ŸëíÏ÷q?ëu>öÉ}¾>àQ·i ÞõÖ-™ƒ}^Ô¯öf^æSS¨¼9"7gz*{§ÔÏÏÌökž†tçÏ|Á¸VÏ×Ï åõ3ó÷z/uGób+›UÙ,쇢#?#(÷”ÁÇ9ʼnööö̾‰ã »â2㦽ºS©"}bA©Ïk¹—碄K_0½Ž4t¯~Ö5e3‚/Û÷¿~X3I _½ŸðóŠWÖùäé©_¯†”’,m\¬óŒû#ð:Š€òüñ í‰ .SûÖ›:Cyšaýºg$“ˆÉ·ãr馡ÀŸË÷9ã¹|´2’73 …-öxÞ­÷Ǿz÷oœkzGKWpp0úùhñWá$·òÛýC¦RÓabð3Ãå2s 'e­ßŽËÀ›K_Ê·û‡Œ§ƒ¬Ò%Ãñ˜1{Štýé„X@Ÿüv\n­ËÇí:‹žàbsƒ->wLV¿g0Wñ®©£¹ìáEüüzu¡]}s „‹y~ÜL·ÅçŽRÿRŸðN›ª‘ŸD¥íI-;Pµ‹’ýq­?a¼V†B¬ØhùQˆ}ÌûèÄãžm®íÙ_¶ß5>˜J{oLÆÌ,æ‡yyÄ.µúÅvOixÑ’:.žÓ0¿f芫#€õXç­uØmögFáËý*b¯ç÷Þè£[ësëŒ[_Žº½ÀëÈFJ”Ó_æf£*Á#ˆK¤Õ·ãòáæ baH{Ä})§”ËïøÜñÂ̹Sê“‘²ËÝ#`-Ò”åüâÞóW’$ÉûN ?­èéO¦–¡Ã=eDFj­åÓú½ª÷Jwµšî½3{bö¸äwüpH‚I€"Í=Ü<³DIàak{º­"=<ÜÍÍ~&ßGï“}>¶ý~Õœf çé§ÃŠ÷±ûmÖh@º:XƒH#å<Ü'Z +:4ùå >?4IØT¢c¡Øˤ³ñã§3XŸ; YÖÎ\šÎ†@è¶"md‹]ƒ‚'Z•óå&˜‡ãJ—ª%#êë°üt¸hæF‘ÕÁˆEhIÃÕðO’ÎogÀSg«HÔ¨"á +¼/bfº±á™à¡À¿¹êT`KÏò]Lü**Ä­øÇèÓOàßƹY›Q!·ð³ì“ "å(‹hùD[1‘0‡¡OôQ+÷ØûFŸì *.Ÿå£>êþÏM@ÌLUd‰¹S}óŸ“5ƒ»¶™µ6”*‹_wâÖ Î'*œÓY¾¥î ]Ψ}nèˆfÕNR‡Ée¨ÝG,D)æãýܽωʕÝMˆŸ¥k¨º‰ôË1Q!,"nƒâøý3Llê8];1Xë>Ì6±ÑwÌ妰yË×ÏÎ@¬‚Î<ö–Í|}ï‘l«ú‰ˆU%S®ƒÐ‚èáº@øž8‘⳶0ŸÌÀ“´ò¬~½CÒô3š¦JчÞ*Cÿ"Ž›¤I§–"ÌQ*Û昽~=/U&Šð.•8/Eì&sqJÎQZ(ìÎDÔT5¹›Ô@¡Á/ÀgÝÏ_øtë©™21†UªÉ©kq¤ë¸<ºi¬ðo¯@vŸ• „lTÕúÛÖ²žbV2y…_‘ôÙ/ŒÊ. áb!âïYI,¨ï›>Œ¨úö•ßË« Ua°‡¾/-1Aô½h<oá M¡ëÿG.°dL„“É>£1¢ÏìŒhø6/#òpœÈ;àGf8Y‘ø©ZŒèGkÍÏîà4Œ!:/!ŽX3kßÃÇà®M86yšž%@àUCš‹<êfÒ¿ýBJ|^eí¼©°ì>}›Ï;Œ½ãè€õ5$¨R¼»da²Ô&LÚ‚li¾uÀýã|F6s©©BS¡žë#Lžíè}þ]Œ¿±L‘R©[>"gDÅFí©`ÊËþöQ–¦úNõ¶ Û +j@ÍöY†5M<ËkM}"QaBèúÞüÛÈ„^¦ÔÞ@4üèoò'&¦ 3ˆm s zÒÆ2-Ün‚Kx˜ÁcúÑþÏYM:I®·X£5ËÚ~–«1W8žãQMB/Þ1‘ñè3‹IØx¬*zÃäúKLñÛ(áQ`D‚ÉŒl?¨e_é¾³¿ acÁx¯úYrì÷Ÿ4ltoX2yŽ k¢ÁË®0ãMáaá/ÃÝáZ_fŠqy«gW÷ãÊŒk Šè~f›ƒàZÖÖÜP+ó?ó¡ ß1¾m ª°a‰ïX´Øå®È㜇Э‰Ã ‡eÅÆo³t §`hŽ°Re9ªŠ©*ç¥òB>+¨†x×€>‘•ùúDáDÕø}„DÎ@D¥ÙËX‰¤OdÝc¥ªª ŠÈwèëOð«_¥ñä/¹ñ¦âãjF« úÞ8Ÿhòv,üË$'˜˜ÈøsŒâ9%¾b±ÄŒxÿBÿ§&ñ± °ý JÖOÁOe³·ÅJƒyF_b­ŽÆŠ8tzÊ/ÕåÏ +ùléÒ!Á„<¬ìYÇ‹+ ÿYžf(¶Ê·jÙ>–`+¢+T`)MXÁBɾƒžŸOß¹jÉD,ö2õÑ@ztb]~m|ÖYìY 9ƒš–ÌcJØ4×GšBɘ‚3Ø‘ÀǬ/‹uyÆã©1—š?€’BYÀúVˆ'E-Ÿ”àw *H¤2ìÆzÙ(¸8úDÿîL¾ †ÒLš²ü÷³4D°¿ì‡0E^Wñ†ó§(zŠ>ç÷ðɶÄá¦p 1—ÅJNæÜð ÏmE~gþŸ½xι%|zìJe`nN‡ÐÁ0£}ü¢CGVKó5q^˜»E0“…i£c™5L¿«Z:„Tñ(iÄÉŠ1…ÅÁ.Oµ­µCI)ÕµïÈ^Ð-\ØÏ;´„òàÃú2š¯«&ö…ÝÞŽD)Í9jĈ**Õp[WĨ¬cl(kW¿þK8šiJ0û½‚jJ¡:® pTsÝů‹dË2ñtI—œ)„¦Âᆱ"bW !SºÞAçã™—ŒA^òÜqŸlo`g~ŸŸO¶0ˆÍÞ'¼ó¬°0™˜ÞWýcc¢öâD[ˆDÖ>BäÄ1N<©«¸ã¦PŒ¨!4ÑLe`?Af*S¾MkÃ÷Ç1€O´„@dßeá*Zxñs|Å£¨¥ß;îyݼ/øT¼ýËc£m$ÛèT´ENûçe +O뽦"‘(–&ÇÕä‡qPƈ,\FÅ"pøåAŒJy„¿70²Ïq”Zd7TiÊ3UÅAM¿öƒÛre ô +p•*ØK—©µÂÜö‰˜ãG×z–ÝZ%Ÿß‚€-‰ÄTqPËÀ¯â©j8€.jnèz Y«<á¬-› òÑ‹5&üf Õ…ÙÒð´HŒ„=n*èÄãÏúNvVÁ)²¡üöž°{Xw4Árš%o¢Uh{ÕT0¹‰0ßÕäöë9ä‹^v‹„pþSÖ=ƒ‹DC“L5ÐÈb÷ŒýmÃRx“4Eº f²™È^9SðØÊú÷kN4(¾_“ýöìA w(k‚c£”Ò¨¯+ &$­ ãܧiÂLáÝ ù{‘ºšÙ³†4=…¢3lv³à·µ¥e°)>kª†|VG´ÇoO궅çP`û… þg±³ÞdS$/P mس–š kJpp\Í÷8ñSçÿÞJ™TÊÓϾcíj´Ô-C®Œ…Q!Æ°³XhI‘‡y¢*ªe‚ ÆD E¢…ˆ‰]Z%B¾Tø‘9,Z¹¾@õ¯2Á¸‰Ž!_v}µÓóæd†xVÕ 7,ßeÇêÕ…Gßö¹Øÿ½Žª†ÅIý¨%#ÃÎOŽÛâÙu@]PÌ0$ˆ ~ÂŒO\KdÖ’QNV“'”'úD‹b YûSUEIOeʱ¡cñpbTiÞBÊQ÷á#2æÀ`0A^coF¦öGðÝÐü hAôÃù†&­B~¸&Ç}%ërX@¼*6?´ÂVÑFÕŠi»+VC„%M[ƒ´(Ö…o5J°%#MÄÞ¶Š6¬%ýN(ÏT–Q€(ÙŽ.Ö“hŸ°—†úÈOãÑa±Zßd­Dh‡iñal£åÁ3¹ +fþ1²È<¢ppjêz¹ÖnæQA— »ñÕF¹Ž lT öÄÆAÑ +|/ÛØ»¦byëe öæ>vŸ¨›¶5d’¢Nýä*ÿä +=®3û3º-بr t “*YC32ñ2Q\Ä<¡þæ2âZcÛözžéëlÝÏÚˆ› Á´ü¨g;+jîXÔP +Á47βæs<‹E +d‚ám5”0JڕꚊƬ® ?¯ËŸ ·Â”’ ³Óù]Ж°²mYÉúÝJ;ýµ˜”j˜r½-?çÀ'ªR9±æ…Ò-¢˜ùÇoD“Ø8~J~àW±Ö™ôüQ¬üEÍß…*KùgŒ(«*ø“Ò/c¯ËX5œ€ðËpþÖp€O²€Å³–,HFç’)‹ ,it¦ìlcm [6€¬“4áØ1`ÇdOt°‚-Yo'ëÉ9¿™Pd oër3Ëà +¢LzåE$è +Cçcz }ië¤A]¤1<ÏÉB1,—†=+ëÀmñóuz!6I` Æ-,¡D]»â «Ñ±¦ˆh ²jhÉXÅ`¬7·¹­ìjgþ,‘Ý—ÖÕð~DôØîÒ˹îµ"*y™—T–b,Ž=(@’훲ø{ÝÆ:]QñYÖnZ|ÈÜðÝ2É&½×,4‡œL3Ÿ¶„«ìŠ I¶5üøõIsý[ØðÊò¡ s^›¨ ÙÅÒÙŽ@Ë–…Ú,£IVí£ÛÏT0ƒŠ­—LqcdÃ’FSS‘ÁÒõ›ªL%ã7äPADË,L™[ÄøË41¼AÅyd‹«c€G“éÌ–¬2 ÙâÁœhš²÷”,“37OÒ:sÏ4¥œ± Òò=ü%…¦)6L–È—[Òø‡|"î¬é»z’<î·N¤æßÃp ±.H÷-»1H“ô¸~Ìó…¯â(Ð%NCøÈnW é"ðgËð­@„çâ÷¨LÞ2[<‹‘à æºó“UÆ:úÉÍ¢ºW1RºN]·Öño´§m¿a  ØGU×|‹Ú¨¥dL•%#÷0ýeChQÓ±µ’jÊà/†™nDÁ0ð\ ‘oqo¤L”–ù˜“ÍNâF‹çOãdM ²^£T¶±0A²½má ´±([ñIvC”P'¶tŒZ*†Æø“Àg·2)(ˆ¸¢o òÚ«#3y4©¾ÙÙ6Í0ñ]–-ÓŽÖ-}l?MÐVß(ßRDœ×âiÑŽÏÒ7ʲ¹%ë‰ly´mlVÃrwtËbD¯/v –,ÃHËܨ þ³¨çlÖKPæ8a«7" .–ã$%ö€`IRҌӤwÎâw¶"œ•ìzYíŠÚ—]¦bã“Š,ùåÙ["\½ÙRy¡Ì³,™ÙËô ºže¡V5„ÐbªPZLu²d»s£žÐ²¥ƒÑ\—†Øe X€a­³>˜þÇ€¿sw-ã|“Í"åãÑ"(Ñ i5SR=uÄM]ä²Ñ­~LÙÜ€2§.f†î£ö,U¤ÖömJÄ™áœéÿ˜bv¥¼üPá×3¡Ë€]Lj*fs_†ïYôɲG…_¹Ç‰¶Dº +o¦ë?icE-x庛î[ œjËãÉ×J%Xçñ~FÔý†þàÅ°ú†÷ÉÏáĵaáwgóŸ”Íf4‘z dSv:°D—a Ú¾âô²æ[*,§BvS ΀JÏ“ýmñ,‘‡Ö¯yþÅrOö¬Ä ~ÆÖ@ÃXåÇÅ'ªòˆ0'SƒÈ>‚¾¾²*—†?íÏAõc*þ³<4ÌÛ¦¯í(ŠS¹fµñpú™ƒüaUôvÇÃV“AIÓúD?Co#å€O—¨2ÏSWDÍ+Ö9ø–_ÝÖ1ŸEø9YS1MÕ "žµùša¡O[̶Ÿ8âÿ^– +pkÒ'²KÓÄ»x! J—O:&8ñµ–Hµ¤bÁ¢ÄÓ‚l”Ó,φ#7Ît"˜ÏÓ° ÉŠ‚i0M¥-Ȧ.³*y}!'®K ¸k@ð²!Sç„»“ #ÿ~Å-ì·ÈžåíÏüÈ$(hÄD‰%›®&^¦o¤TðþÌœ&<“Ì÷øGâdåÚJ[’§fQ<¤ºŠI‰Ü%€h²\Áf~߶ +Tæõ°f*DÅÌ$C ¦Á‘F¦ñcA>Q|˜ê+;”U"†É+|LK<+v¼àÜ”ç׆£°3™çÖ¡dÅgLHP[V챫·ð÷¢d——gPq½»éUÃyaÕ%¥Ø‚Šg‚©RƒÈµÕÑ©O ºyš6†¸Â¢‚?ˆð†RÛÏð‡Q.Êœc°¡…üaÛ iRk#AÓ¨µ‘GJE[o¦± ,úãzÇ]Vyšœ¾£&vïdŒ/|>L·«XvBÔ5b*ƒŸ'ßÄn +•“E“œš² ›ú‘(!›—‚9Ê@¶@`±S[€tQ™HÙ}x˜(®c šó5m‰¦pš¦ó?1LtµðEÉo*£s²†È×D¶ðµ°|u¬YÛ”—øa]šŸÅŒ9¦®ø¾L*{.p±ƒ9k„—ãZ‰.Ó̦P‘h‹œ+Be£"&y1s‘*بˆ+ +}m?Q W Ó]™ýDp]}¶"¬@Gf¸Yèf6œ‰™‹–FÐüReö>/lL~¾ÚÛ'+2³–G Ĩ +fáp`v¡LJ•éFÜZD½Šåülþ2ÇÔ6n¬ÈÔáçó)Ùýq&c7=öTÊ4Ä©”ôŸd¶÷¹üYø£ + ’Óbʲ¨ D;*þ]&ø ÂA©‰»¶ ƒ!¾YžâÒD6$6v–æIõÀ!öF¯^•ÖdÓDýe‰êbã0,AZ¤‰Kj$u£§!±%>QýF·þ³"Ú!„¡ÿ FQóœDÿ÷¢“¡¿¹âþbùždÝo†ïËbú?ó5šMÖKÊ"S˜Ä®\@ù[Nx>’,”Çú/"}òÂQÁ^&úÛØr™r‘æ%¯è¬"ú„üÜs‚¬ûÀˆ*v§¬Ûµeþ=1$˜SåÉ¢)oŸ Z\Fhš@• ¿³ÑoRÒÂ]lôÅn2\Ë^[ð¢Ž]kQxbC–ˆ©V‰Ž)¼>‚’¬jëEÇ+BˆìeÌÓÇUôbIHJ¨Ÿ'G4¼‹†×+k×”jâ‰Â*0æ0“Ù̘´DMCôë çš.A-¦C3§Þˆ4 ©ëÓd`Ù»1QVQË.÷Ö±M†#ŠÖ”|¤ÇOÝÚXËOT‰±KOØy³2}•¨Wýû |¢"™㱄 S1ÈHÙ~_9€/‰I¼¡‚ŸüÇV@•ÍLo% ûHÀ#“0‰‚fÖˆg×å"Õ‡yMMyÄÖ‡Éøu_8¡ZLrãg„ ‹–HT/£wŒJ°¾C¬ÅˆÊlÉf¥mȳµ3«Ë5Ù‹Þ¦˜t±qœmi›áõ>ËøØÖaˆM°§,ïåì£3[Æ97J¨™?ÛB‰Š!EF”€¯Ô±eø—ó†pÉ3?Šì#@°7ÍóÝPv‰6@¶¼/†}€¨´Ye¾Š+ [°HÔ¼P£ +ØÒß1ŽKvÁ0°HÔFÐÄ‚²dkDÙ Rhè©DCò!·XqU–¡û˜÷ AÁÅݬ>u%çrñkUçJÐ*–Eg°\6B Hü¨‰ kE£î”EÍÞ¸IJ4Nút^ë–ùÂY©ßΑ-óULð°4;\벸IJE7rƒH$ÊëëYÃp¬N7Zî¶lÊ!zÕ²W-‘原Îk½Âš¼Ò’#}\aá8æé/¸’¢¾žklQ— |ëú‡y.Œ,³ó ¼8ÃÚˆfbÈ:•òÃ_ëx +–õñ2™.¥šHühúø]–Ls·ýp 6BÆê![úÄX-ŠÈ%·%S³+,L1lYœÁ…,¦`_G?Âðµ}ñ>™Áº»‘Ù¶ò’*X²-#RLà·u¬7À–#¦oÒxâ÷¢¿iL¤¾+2ÑÅ’Ä_¿fìíJüÃŒ šØ'ÅàQ[·*75õ£1Úë’Õ5[5eçLL®å®XÝ„mú KðÁ +K•U™¢~7ÉÄ +|V‚#g‡ÉÓ|Xû¦j²ªæÃyyëVŸŒær×'˲MVªk:Á²m}‡i­'†î("ÛÙ XåÀg¾LŠDÙ¾ž‹;Ü' ¾³.Û±“°/o1Ðþü ¨ tìT‡}éïY˜ŒlGTF_»r‰t³òMYþŠU{¬ÞCÁf¦ô§³×Ql8oˆg:»”ëy¬ã³ÇÉb%ѱâ^UÙoécDqUõoUð‰¢¤Ÿ¹sQUê6qÀ*äöç߶^8¬Ü­„pátéÀÄä]ÞmĽ²fT"èÀZwE‘-ˆeG`îêÔq€fàIíN)Ö½r ˆÚÜSBåžò¦†ÄF£ìÓAÚ²c:1°žç‹bÇt]CgÕFYƺAZò¬&Á\{°Ö5 k÷$ùDKÇf¶p&°:ÓÒÖeD“Ýà„çÝËCGÃY}ôëfðŒŸfȨŒ¬Ö0$8”mGÄ]¼ÂÔÂLr^ÄýÌ Ñ‰‹e+NSû¥ïºÑêu-!/½dªâ­:t__ä«Ï Ñck¾1£Ë$ƒ{$ËëÚàßptq19KV´Ö“¯Sß]"ì®­/¬æ®õϽ »[ØÜ73ÄÛ8Yt«Tý6’e´’ˆòËB“ù¨_ÃRWE”Hõû{ŸÝúºBÐlI“ÍV´p7öƒWdÏÕïŒÕþü8¸!Ûj~Íͽ càRóˤ|"zx7=ôh §E“I¿<€(«Ýð´:¶þ“/èN$º3Ÿ}ðoA·AŽ+¥×ïÞÜôOß¾½|ýàK—×·#“‡‡ÓûË‹NÝòŽebáÿçï×7Õ«; +ÿ¿ù·ðMø—; ½ßQ•ÎÎêPÙ¹`Ï¿HÚ°€¬×HæXP¹ü²ÁîòKK×äö‡d[ó¯ÈioñYâz€xçð ~c +àWU€}Ø£¾‹µKÒ,P> †ý;USÑY–„¢1 +Ë¿4MÌtʯíe~XqÓ"̈ÌZ ®ÿ[¶dͺ˜QÇŠ>€}ààÌ]°ª›°w;ÌÇ +bìtØl¹FãÁÚÊû·ûÚ„õZ%Æ&¹ýÅh½Êþÿ0KõÏêy,‹²©™0ibê*ëÅÉ.xd³Ótöׄu;á½¹d²Åê•t–ÛoN˜}ÿ?}üpç½Ø^ϳ³ýʽXyNíùùæ¤{ÿÏøô“çnI˜¤Å*d$ãñv’ú!×ÙþÅìùGžÄ¡¢퇃²{Û$âûÑ@Üôá³–­Þ‡£®‰Ì`“,g»uó³>\€ó$„Ø/¶Ÿ Òøß´±R„™½€‚7‡”qýæ ÒzŽ’¸þšáÖß½ñæÍ5"ì4ÝüäYÍ°ÔF]?xÿ&YÎt=êúƒ>þôó_”¢\Ú]|a}¸|òþë ~lQÞ¨ºáàÃXÒµ8Žî“ viÐs!¸{–Ve&…Šü£€n¶yÖ.ü7õ£ÀC¶¯3_k]ü22;›v-îX¨†u_|(îÌE¹ÍºšÖ‡C°@ õ®_÷5 +–Œ³²xKyõéÛâÍõgz_ødŽ!Ö‹ò‰àú¯¹…§_lÊ/†þ`¢jÏßAÍÏ^àd›E2‘EM|6ûΈ¦ouq¢Á¶è\°€i(¦¿Ü8}.ƵX&? ð HäYüY""Ϭ4ðe&óQ}n¶¿$mlnò]¬Èô>ú.8bêãƒïb ‰™z}+au} ýúßżþHæ9×|™ÍŠ;5úá—}:ßÿÇ2âÿ3ôÒ´Ï€/uÇ}ùÿ +ñn [ªsª„Ùõ`×nþEû£¿`åV‚ºæ³Ä!Û˜£ÊæmWoŸ_füåß?<}Ÿþ¬̵öEº|ùõíùå°VÚ™w¿X1„`ð’üßøé—¯?ÜaÁ^U±ØooþïŸfƒ¿Àÿh³Sm>Qc‡ÿü‹`Ï­|úö4³ÃaêóÆ£»“8m%s«<³« Û›éÎ4]˜™ÕÒ<3ËK­0Š[ úÝËló„ÔR…A,ӎѦRhîØp'éL;S™æ[‡ÞðªÐ¿¤­s»yfÔN²Ûx¦HçIš0Ëfi”m·¹Áí\£¤; ÛRÿ4×>T‹£|ûÊ>¯ÎÞXõµ8·[š·LfûQ«¡•æVíˆÔ¼Éó´7ßQJñlOqÆ0ùˆQSrƒBû¬6{™ï_YÃh¦¥8ÃT±kVÇ!R5*ÓòìEuõMãô7ùñ Å›Çò½h¦]™<´N¾¯¬Þ–g¯ßåúwZí ’i[Õ•îÍ’¹^Ь7Eëj¾m—ÇfyP]x—æÌ"´¥Ýx®¯—01ÛÑÚáÍUwÑZ¼¯L^+¥U˜vöõjШÅ3m·w™oDíZÔ¬fkGùÖ™å-cV;¬US™N®vÐY¾7*¹­„ÔÊv,³Z ÚMÒn"Ó·k'VýÔ¨éåƒ=­6›ÉL_ÉÔüˆTa¨$íéÎ ÔËÛ‰BÔj%i6b'‘ßK“Ùž^šÃj«•e²8I§©Â4í.To +çE+-ÍÚI”v౨݊ÚÍ°QÝKãvC/RÙvÔª…µJÜh$௴*0’šõ毛ÓÀW»Ñl0]Ú矆iH«$‹J+R?WÝC¥°ÈÕ¯ Í«^MÒN:70J àt>Fj§nÿY*ßµ2€33ÕC§}Yl^¤²Ý'R*q«ý4šyÔwc€ÒÛ–w`Wõüp;–…i¤³½ý´ÔMä÷µr±sÓ>ú©¾ø¦Ð½ñn8S; ZaA­²«”Bz D"ÓÓŠøRÐzñÂ8å®ÔÒ1©_—gßHd{Õñ‹\ï6 ×vÓÞ^ºb¸s­8f•í(ù1È™4[“úN4Õª­L9»‰B*ÓÓ‹Ó°^ßMºûérX«y´öÓn<Ó#µãÝ +êÞ aŽRÙ>(D`›0iÁß*Î̪ƒT‘ÎTCZ ;FÚÀ »¥çGJ¶ÿ4’ *å@Òy´“dËD_Ìî‘Ò¢6¸öºgÀÒ{i/¨Õj9b6Tw™iß—'¯œþuÔfro?YØM䞆Œ­5‹ãÁêm¾s•.-ƒì»r1»òÙ®€¢Ìu*Δâ$ß<ËTfq QKó¤yá îËÃ[Z[*¹n©}>ºøm*?Š‘f"Ó5+ R;¡€*p¸ŠÝëúâeÊn¥D?ÌÖO)ˆåþÀöôáŸÿú¿_~÷ׄÛOºfã8Óf{Ù\~Ý9úÆ®ÀWÀ‹“®ê,ió¦0x]¼ÊwŸg;×pv2Þ´Ø» +Ó(ëé)Åi¡sëÞÐöU}úòêÍ¿}"uÃ[xãíãÚ§?µO,ojûßýÓÿäίw +¨ZÅ])¥e¶qVlÓêC)z¶Ûôfpˆ¢¤bˆ—ž§µ8y1 +|N7 X«8¨µ˜ÝOe'Në"Û<|œÈí¥Êq:δŸ/ +½ç´qž.NQÀÖR…Ýxf?•ÙoE¼¥’DÍfĨƒf ¦˜ÕÝ·—*m'œ Z *U`­éD¬Ænº°Ï|¹›ÞŽçérD5ÚvMå`ªÉ:O“¹=­Ó¦Í·oìê±î.`ÙáDZ†ÅZM3[ÑÌ^ÂÙK¸1£­g' P%M»Û1úUP΀ÚÒAÀ±ÜN²˜°G:aµš(]ßÒæ°ŠU>Ô €±{ÛQò8 ÇMøÕ`Wqž¦œ§É’í­¦g?ï§Af3€l€¡8‹\û®±ü¶¹øÀU¦ÔïLoëófõ@÷ +€öòÄíœæl±ÚùÆA¦¶ŒÑ6Œ`ò¯´¬-^Ž[Mwp »lPrçîðYcõfzõÓþŸ¿M¹CÒ<Îön²½[0hë¬0¸3ªG€ß@Åì6è§ è‹ÔÎr€ðÇ/œÞíÑÍæw +Ó~”to•mœäÛç8í‹ÚäaxôM±{‘È÷ÍòÂ,ƒ;¯ÌÞ¶ŽÈ÷¯+Óûoþð_ꇯ¶Ò.@ NSû;HTàdñLþ}_)¥i›Öió ä¼ ÒÆYÞ؈ýtq?U©5€ VùÄfkù>Û<‚]>Iå@¼Oâ ž@S—l@ÝÅE‚¶“…§Q{/™ ©n̪Î$` |@½U®vš }Q Peg7Y +j5`0)û©Ò~º” m!£¶›Ìo…¬¸Õ +¤Ê[ÑÂNÂÌ@k§ðØ& W@ì«ÅI”´aΦ·[Ø ~®;Û[†ôzPñ‚ …R%˜ÌlèÚO¹¡´ZòIØ´)#³Â¢føÇtæ žœÞM*×x¯¹3½k»Pòƒâ¯Â$µü0•io% põÒÌ.Ï@8ï¥ +Ì$!YœÀ^d›×­ÃŸúpúwÄ›å+Óƒ«_.¾õgUìÚA¾sZßvßå{?Š­“|ó0^mò²<~S¿-ö_8£Wze-SšwÞ†ì q£´ìÿ8¹þýüþŸ¦÷¤ý306Ç—¿ñf¯"¹aÒ™êåUyúª¾úŒµlû +¦”k€f’ˆ>Ó[”'/ꋯ§W@ÍÍTïHáÍHõ€Ô o +Ý+Ý[‚ö„…¥õ#€ýª3©L_NoÿTš½tÆÏZGïRÅѾVU)°X"{º±›€hõ,>°¼vEêNkãgª;ÙI@7iž$Íî.¬$µZŠ~꥛3@ø0•Ýz/ì¤Ja»¯€ÿŒÛýï+Õ}Õä³ÏŒð{m:³bã¬5{“©E¬NtŸÝÕŠ3­0Ôš²[òw“Pš Ž~á­ªä†!µÑêQÔ"˜Æ`$ŽÃ왞]=‚ËœPh_ +C¡1»i¸³BûÖ0™éí§œZN’Þ~²\r @Ý~ÒI˜$]f[±(ßV†?{I¥%xQ:;á NËrÕ£=Õ{¥OCÖv8³š Ž³õ#P»;i-™inEŒØŠ‚8gÁö@~g›gÙÖ™Zš€Š×rýbíptò­;º­Wè^µC¥4´\ì¬ì +L»Å|ÓWja ‡7ÐÈ[%ó“ ÕM&¤vT>ËuÏfYsGVuYè^Ðæ1mŸ)•Uª4+O_ΟýÙ›½óʨŸè•ƒ|ïÚ¿Ìî³[0·áù(mw‡Ä3lûÒ½ÎtŸ«µ3½vx;`ÔRù!mk¥ Ë€uA¦óS·ÿBsÆ£’m`Á9cÅ›+å%ؼ`±º½»Æüm4ÓŽF"×Mäzðön;åí*eÐPÙÊAux›€c!°0¾Q^€ÑNWÂi/EÚ°;[a+¬• w•ï>d›·¤|dævŠ³cžÆ2#öW!#b€0Ð -{iìYà0 €1`Í3µC0FÂf;b6Áp •# &™ëåË‹$i~PwâY`¹täê0•œÐKÓ~¾v3*_î¦vãÙ@$ í‰é-0€Â-´. í«iÌ F¢R˜€ÆV0¬–á ”¶"öã @n7á$ì^Š˜œLœlg+–Ý#é€p k7Á:îÏ_ܾü7OãÙØUvbY=7.Zn.S™›Lʉšµ§ý¶B»aÄ¿pL`†É\L­ æ‚¥â´ÐÿmÐò~µŸzÔõâfú¥Ü»…ÇD/‚1Ø~T·c$˜.$¹] Ü®£Ê¥áU„ÊÊÁŸ­ ±†V˜åê—`j5 pá¯úWûê“ zh7€µ¦wÈvbÙæN +Ô(“'­ ÖHH8éI»é¶Žê“«Õán±˜K`»S^L«š…Q©}ìaäûÀ´ ::¨”˜"c¯è ŽÞéîèIÄÝÇAÉŽ8¦88Ê,tóõ9üËle"¿Ÿ(ÀÈû)o_)N;yñç}ÝÝ´ö“¹§aÚ“éS£“Êë³nïl'lhvÙÊ7†÷$lï§=ÃZ§`¶3Lb¦±R„ ¸p¾éŽ³õˆôÝDà"pˆVèÁ‚Þ4 +£Úð z³<!ŸÎ´’´g6b7”â,_§} +Ì´+F4æ¡YšÍ¢»¥0Hç»ÃåÃÃÏÿ©8¸‚™Ÿíƒ!Shœ¹ƒ»æá×VƒÉÐæVëpÇôLoÒœ¿fK‚!\œXõ£åÅ÷úïÿÏÉåw[ñœíÖe.ô]¥dU.œÁËB÷®²ú&Y>L’A±y +}0F®ï”Ø©4¼ ÛÕ§QRÈ,Ö­Å3uµ4RJcÕÎ^ÿå¿û?b™ú£ ¦d[ÕñµVTo+^àžÒ±7¼´º&•i%ìZ:ÛÝ|Ëô]³Ò½|óÇÿËužÄ²©l Ût¦ŸÎ@ý…õZuxõüÛ^ýøå¾ö8 îÅI +æÇ6QK0•¦ +Àu€£BF,µÝNHÙíbã´Ü»´«³Å ròq„@ƒXÍli–)ÍŠõ#x@Ë÷êƒKОO8í©aÅIYM0Ùhõ >}ÀŽù~2HåCéR Y;¬EÐhÅúÜi€,b_±ŸͽD¾(j7ƒZe_q…uÛ™ºÍsÕÿ$ò4¨FÔ’^\™¥%Hixf'J£J)¦kØÚŽÒØå¼]Jå'p$…ííè_O˰ij}‰;qÆÀ{ —SE%×V²\uÕš½Êö®ÔÒ4™í&ÙÂVá‹Òù0©®ò3Rcí0]zÃÛÊüÁð¦FijW—š ÊnV\šµå®^ÛSª 9Áœm Js_suwLª Xç\ï*éŒõò¥W¢jYËö£Û  +{ÑL°¤bf]x;B:š3Ó¤f{öR{ÑlÚjÅÍèÇm€Žñì~dl%‡4N“F9_‘fcf;š…?“ øƒÜKÃ"ÕÇAm'–ÙŽ1Ã9 +‚”vsµ“Z &]§rô$˜Ü‰dØÛ­ŒOÂd/YÜežUø¢J’ô-wX%j4ƒi/ÖêE-Ðõ`7`Š‚®i_djqص“k€²:‘%ò3¥tX~Ó9ýmeõ^)ŽÌÒDG”Ô‡Fr Ћg‡ µ÷RŽ–cç b×He–­.3³êü]iü2íN·Ó®^Y•ÈC8×ùñ×ÞÁÏ…Ékø«x¦¯83Õƒ¯Lí­ºG?úÏ”â< +F´Z‚%…¹m…mæâÎŽíê™]=Ms|,·Á=¥80k‹”3P™ìZ¤s†1“Æt€M/b•Á0$õ³l÷Vu )kkh–™+¾¬0Ó]‘Æ…VœëÅ)œЧ¥°Ÿô’Üî"mÀ“°2ziÎB´ª»Ãö4·ËnG2{©R„tÓÅ…áÅ3ãXf¬—iå(n×@ÀZ³ÌmÍ]Äi×pfNç&P?–QìVÚ¨†“ŨZ!ÞQ*7Ne1«¹ÃÆ¡&jqnUKݧyHâZ=˜tþq;ùwÃÈ(ÐÎ(»-²LÓÞnÒ­‘rm°MJ% Ô"z½6¼ÎÖVpú4Ò‰ +ð 0án,Ö@#/ZÃ׃֓ µÏ4ÿqOHÑkAµ [°Ÿ,2ŸC~_ÖAp)/¢Ö gÒÊ gA‘!L¼ÃRï6¨7oÎïS….s¼Ã×îèmsõc®w['½6¹'0% ¤nÉöæùæi¾}m—äï¥\ê.Z³—Aψ‚Ž3x>¸üCeþ.åLÁú+ïIó"¨U#fÝ[|W¿I{KØ,͇¥Ù[`E½8ȶ5_»Šg{­’ÌöÁB¤µcPO°‰€÷’Ùa”ô#`»Y îšé,Øø'VyÂV+Å:`.»Êy27Ù­½D.’ör••æô@¾EŒJ¦uJšL_ n8wïÜáC”IÎJ’E{jq¶!X¦µ¶“tT0]uïIHÃ?`ÔöAÀ¦K°tqæÏ‚® ªµGû00Xål@†‡ôVÈhgWåÑ[·oyËLåPÉ÷žÆl°O÷µ²îŒµBŸ”gÅöUL¯¤­*u'Ûaóɾ¶+PåQ€©¬Â6f6l$iwy@öŒÂ,i÷´ÌØéïžFÿþqd/–ÆøÕ®ö[é`<Á$¶Ÿ.'3ƒíDñ« Q ³Tv˜ÊNÕü¼2ØyëµÎR¤óUÀx´¯£FõºBûz~®e† £À Íø8d‡•r©ÿŽÞn²æ'd`³ý4Ë « Law@n'3ýí¤ðLØå ¬Fªô4’ )åLõÔÜ x¸lxKÓ[%À0OžÄ3Ûi ÞÊäÞª,"F-™íÅ)ÓPQ0 .-ç¹ÖéN’$hMu‡V}¥×X¨(S?vºWÙîM²ÀB*é\/lUvÓ…½t V2;°êgjí$™Ÿžýttÿ‡€UÛWËÌóíšgºhª½Ç¿¨3{€ +Vª{˜mœëÎTwažGñìÀtfÏÞýËÍû¿Æhk;^ÜN‚%^3ò=ÍÁžë&ô²]šìiîWQs+U°Ê¥Á3«…ÞmÌnXt¶§¢v/ÒÎI2¿›&m°ú·âù€V†9ƒŸ-dÊGZ~1Ú€ÃÓ¤HæÀ4 ¤ÊFq–b6f+l´v”ZÔêwgo³åÑ~’¤3Í}Õ iÅݸµÑá8+¤™s†Nmù8 ð+¥P +ÐTÕv„lÇrÀÙúIœ‰P+i¶íÂÂvW .¬Â"¢Vþq;õhW߉1dþÕ®L”‚L€”bü³œ =Z¿Hd†A½Ï ÂfkO©m§ÊûjØ´ƒ×½µ–|(Ó½xLË'#ÏÆŒ:sú¥Kaµ¢° ‡òvô{EÏvÕl6h+Qû–e;«]Ø…i«n©LDÍN‚n…é^Âa:,b _ L›Øž™î“(}vD²°.†L¨ÀŽ°ª:s«v¼¯ƒ±`§h=i×´bÛ>ă}ZßÛõÕWq%ló$[?ù¶Zpœ£V'Nz çRµŠ=!³™ÊOiã¢Ð½éüèÎ_íhMkÙæØÚO"ä«°ù8FCFì_0´CzCÉOánNˆ´hM)Œ*Ó‡ùÍÏÃóoÁ\U€%hpˆ–;ºKÝ©ÐÂ(_[mÁ"(^Œv#&‹ ÿä›'…Æ­­|gÔ~ÚÕœi*×Î3êix€€¹’ +VÌmŸÖç/v’ÅÈLµÀo'ám Ø fš¥ÜÝxáËåW;é½X.nµ5ø:o‘´QÍË”çÛ ú8¨ìÅ)c½VJÅ‹ÒNÃ*à.ãË­x ™bL«™Ùa¦z†d(íÑÒ,WqíÌŒSxÅÓ0Û>–T˃6þ«­èã]XÔÊuŒ\7Iûq0$é°Ð:šÈ?Žåöõz,Ã\1<Üs•ï\&²CP%`Vøÿû§PµI³×+ÛÑ\ åR°ËÅGANŸZ*¹>˜ºpj4&sCÕ`dEhƒ¡‘Ò,N;lÙ Y¼Ý1á–, qït~^ìÕmPýFÍ\aÕw’°ô˃ëúâ•7¾OæÇ«Æ8˜ŸÃÓìhÕ|õ´6za”ûfu'å6g¯í +œë2öóŒÀc¤¥Æ`Θî(JÛ`6êå€îJqj É€Q uøÏ]©"ˆÇíT~;žÙô¨Õiõ˜ÖNÀ¨} «.€L8éÂÀ(/ÝÑm±w¥—võ¤ÜWm;FÒ´MÀ8©Lh·Ç2C€Ä!¥˜¢}0Þie Ë¢f¤rl;sf’8¡*@Aì'Š{‰b ]£Æxw~?½úõWn[ŽbV{;–=µ—ªî+µŽmnEs;‘ìV8³Í’ÎÓpæIˆ’¥¸QÏVWÀ±¹“,›ÎyÐwc€‘ÃRW÷ÓÎÓ( ¦‹x€úã½4 8°åWcz£=}m8ÝØ +~ù4†éŲ{ñâ^ÜãPÊ®ÀFûr+²±Á4²zVÍ@¶Óú)@5ã"¹=•åV¸í°É„Ùj€¹7f)µ +ÒÏÈzåÑžÆRË€½­&Ëï²»ví Ó:1Ë € éü@+-iëŒ6O’pf›G…ÁU®wЪðT HÝÁR«ììï20N3L@ò¹>üm®ufz,|™©,œöQ±{’oiÞÊ®¬ìò"ß׺5ËÇ —àà„À@SÝaøvÂIЎ¬sÀÒ) +‡hÇ*¬–ÀKdFÙúE±yfHu&Ø™è Æ80†«az³bç,ß½ø*š“˜dÚn4·: 2Š‘QÚa©&«Ó@‚¹ƒö《Œà†Àª¢85j¶Ÿ-/bš³Ï%¬`à­Hðp‚ôAÎ8ËüÝ£à—[±U™RîÂè ¸.¹Ò¬\ÐÀlù`­0d¥×XÄ*Jà“Y<1–{?n±üUKü£zð'h6AJüÝÓį¶”§Àðj5F'™ç:—ÕùËÒèÎ\•gÏÍÚÝ8Ét.^ž>ÔVïGß)ÞA²8IÇñL,fµ9Óxn —áävã ßÌØqFe‘kŸ™Õ@Å°¿¹(¬+Z]8ÓÒð–ÔOiýÄ,-?:‹ËßO¾/vÏSÌ€,RœI¦y l1RYÑæa„OÚ…³VyÚ™Ïçz×Ùî•:Îlí+ðª |HýPóæQÀ9ÎÌ=4Þëµ%°zˆ@îm§=àF°ò²Ýû Ñ| +‡7UHdÚ¹îE&\9Ø× Ó…‰U=ʶNC€“³]Å`ÝDÍz’v´â¬Ð¾oO²œ«ŽB[¹:œ”CÍYê¥U˜tâù!˜Ÿ1Ú¨üPYŽvà.Ã[¤aÂv/–_ÛMäôâ(Åظ“ÈCV]¾s¨5b¶õÊN‚²·ã9`-£0UscGÆ9¦2Ì&0!p -çJa +–8Ⱥ@²7ª;QZ5f¶£l‰jöl—8#·}HçCŠC+óÊä0O(…ƒyŸgQ§a¾±Û*8'Óƒ4+Çšw‡OÎ÷·£™½ÈUûQÐ +¨åËžíZå¥7º¯NïkÓûlû"ë`ÖÂZy/íEh¬ZÒ:Ïu/ûçïË‹{°†ÊÓç™Î… ,1¸j~=¸ù]õð›Lû\sÇj¶U›='ÍSfÆ,ß=/ö.Hó°4†•ŸºçÕå‹lç ØÞUž¿ìž|Û:|Sš<7ëÇFù <|ÀžÖAþÞfÛ§…îÙàôÛLû$Qjå»u•í?/ ï3Ý­rú.ß9¯/_ª¥qeñ¦vð­Ý:O»3Ò<³€Qk‡ùÞEʦa<ßÓ¼ <–£»Êüuiòx•TŽL&²¦±L_q ©F=dÕÁ”Z*VF)nWKƒ“t¾c—ÇÙæ¡];;Nt±ÿï\ŪLvÓEÊòm¶A—µƒ—Ùþ•7{¨¯^å…þ m.áyÿò»Þõ¯‹£ëBï¬Ô;YÝÿ®Ð¿ÔJSPùÎÌЃ48ËõÏsíÓþñ»ÙÝOÀi)g +ÜX¿¾j¾i}M:7´u“iœn_sú©Â0Û:«Ìž—§ÏœÑmª4eŸÓ¿&Í#»qb3?|î-¿®¬ÞÕÞ—¦/œÎÙêþŸ*Ë·álÏ®×–_×VïK³×îäÁ¬­Tw”Èuá8$ó ;´:ï¿^þÐ>z×=~29–Â.dÛçð±&ÁâÐÝIÄj2D§W“ù!`6jqd•ÙÆimöªÐ¿¢­#`ÔÊôm¤ +½Lû,×9ƒƒãŒŸÁBuN¾i¼)ϟ냽–È 3uxþÒ?‡¦ +x²:{X<û}ûô}ntS?xÛ8„Ïy[ÝuNß7V÷À]™Æ¼wòrtõ]cõ"•ê¥9óW`,»½sÍu°Pª`&Ûû·¹îÈx{i|ÇÊC*3àÏTq¨{‹Òðnzýóøúg»u¢N7Xè­§ Ն׽«ï†7?¼úÓíÏÿ±Ï;¥í³z¶AeZgÕñ³ùÕÏݳg t¢pf]ËõìÚБ]QpÜX¾ìž~ÝX½, Îâ´ š"Û¹iŸf)jÞäyuù~`Ñí±QómY^åGwÎ侺|5¸ü~|û£;:s‡'ƒûêꡲzhÃ>Þ4^;ÀK½óLçD-MìÆ*Óf¬¶|Õ?ùîüí¿?ÿúßuOÞyÓçÙÞe¶sZžÜT¦w³ïkÇ?ŽnÿRš>hî ×€C×)W]ƒ:®¬Þ’޵ݹê\ü\žÚÜËËÙ©}h|™Õcñ$AEÉhG*¯¦¦Î$§vcÍ©S·’M˜dS²zRPuLf.ÔÞñ•V<Ééhë”Ò)©l.#l|Pc·2Q©¼\\¹»¸|erûÖ¥ÇßrJ \šH÷®ú +«F:gf‹Ž`ËÌÕDtÄâ1Ñq3VHG«lr‚Ï-úK« ¼ZwLÊõxþ2>9 %H©’™Ø£¢=WlÖWÙ¦Sóàìå«:*1b ±>YM«[¡úéDw?\_ïmÝš?ÿê/yÓ½\ïBiñ ¸p!Ù=UX¼RY¿Y˜<{õ‘ï‰å%#áâÍ`e $Þ9™9WX¾šhoÖæδwn¡|*3±QY¹"Ö6‰X71µ_Ù¸-uιC%>Ýp²BDýeg¬Ëæ˜ìl°¾jnQñF¼½ä+ÏÁª;Ò4s)2Ú`âm:ÖÉN_öVõdñ¥¸ÔêKcBtd™Ë.DꧢÍ:Zf£\,RñŽP\ðææB••dkmjûFmñÔÒîÍÂÂ%Ú;ù™ýxk;TÛŠ«±^œ8Sœ½ Â|P¢P‘æN°ºæ+.ågªóW¶.?‘lo+‰°+:A&f ì¡œ±Y:½mŸwðy„*'d§Ü±&Ÿ›¡âm.ÕTWñ@\ º +Þ—™ ×VüùY§˜·PpÃÄÄž+T÷egü…yÔWðe{Ru™IO¹¢;ÖŽ6WÄBÏîM‰•E2R²ÝTw&ŸM¶#õå³÷<'äz0ùé³å•ëñ©ý@uÏÌØ…*ðm´´:µu ?£¶Óî@.Vƒc9[\8—ê/.ß aŠLA†=¡B!DPÉùÌìµÔÔ·¸î­lxó l¢*Ìƪsr;nã!La`41€œI.ݳ‹Ü›JÔ–}é)µ#Œ‡;l~™Lõדš¶Ð£F·Á%]"kÙ„±…[»Áæi°K&ÒÉaU©<ã/ÎñÙiP•r{õ¡çÞ†ùQ9|žX£0{7¼ò³W ðØ\/Y]¼yûÙkOÿÀDGs3{å•éÙKпùù+……«dtbcïöåG^¡õ½  #f¤êZnö\gëžxg§2µsçÉׂõ¨xc]ª,ë­µ+Ÿ˜Ü{šK/•ZëµÞYÔ›uˆ}/&£]¡°œš:ßغ3yö‰øÄ^wé\mfáS°jL²ë Õ]á†imÞnžzЛcÄ’™‰;ü»P„Ó¸’jg›^HLœÖ»Ãî0,â è•3ÜpGê©ææù{žËO2±‰øäA¸µ'–Wó —¡SðØ<¡•Nòñiètîçã-!ß«.4ׯgfö±fe³éÚæÞP.îKµÒ§RݳŽP“ÏÍûò t¼ãIL0±–ÌJëa-‚Ua „¢2qåàñôÄéÉÅsÝ• ˜/ ÿ\ª,BÍçgÏ/ì?°ßsR~vbn÷âíg¡l€%ôd ÂеX>ë^ŠwÏ3‘æäâ™ÕÝëÞhÑèòãRL’‰Y>³PZº—MÏip‰Œ4ùâÔ?!–{èôÌ›˜Ÿ=}ã©ÉÍ+ +»ôÓD¥µm¡²îŠL«¾òò©{î}Ž–jv>'”—øÒŠPÙÌÎ]R‚˜»ÀÍy ºe&ÞÔÖ“Óç¥æ6»dvÅò­·”“#N”ú s±úzªµ–l.¦¶ö ¸SÌ„+áê–X\s†+ÑÊÂòÞý­Íëz§ª.ƒðùùÄÔ9mƒLL¹CõµÝ{v®=æ +OèœD Á$'ÝÑ&—›NNîÊ‹Þî‹oü<ÓÝq +ÙæâAïì£Åµ›õµÓ»—nb}ãô­í‹ƒ»oÀ‡†ªëÒr¸¶–ž9íœÆ¥ÊÒ©Í…³O"PZ 66<™Y.3ml77n§zW˜øT¥åXê¨ÀC…Š™/›<âZ¼˜jÄËswÐ)•(H¸Áš#PáS3©É3@ž€—ñ©s`”V6æ UL|~À" £"T…ܲõj0Ÿ7Ñ&CÕtw+ßÛã óf¾h"SÑÂÒéëϸ‚ù@aº8!ÞÙ¥R3¸X E“4y2â²'ÞÕâ>ÜŸv‡ktM¤EGêüœKªÔ&·ë½]»7“h®æÎåfö³Óg +Ó§ÒÍeO¨rý¾§^çƒöÚ•q›×HÆ.çÍ.¥-_qŠO™ÝѽK=öÜ[¡lÇÊ$¢­ÝPk/ÚÙO÷®eço!øaªÒ;'•GŒô˜É Qªƒ’/e&Ïì?ð*x7«GÊó +oöd€j,\¸"T^™Þ¼ÙY¾ìà3‰ÚB Ø3±q½;Žp%:6(­IÅ-.rR™µ î¬x¨3:…I-Ä“ñ„j»gÄ€!lÈ—éd'wÚ7ÄÚŠÑ“:©wê½S€F ƒe!»à¯lÄ:Û¥…ƒ‰Ó·©dñ$"ý¨›ï›Øy ²|=TßU–ã *ÚP:|2ç +7 dØH†¸Ì4”xnnæLzr‹• ./- ¹i©¶ë솚;ŽpÛäŽx£5È©ÙHÓÎÄõv-UâípsƒN‚ƒlßÙ¸¸7=áŽ6P‚[ KzwpÜÆiíÂòÎ-2Ö>„^u¯zÒó#&ÚD†B¥yÈP°R©©³¹ÙƒöÊ­ÖÒõpeSÈ/:½éù›Éæʘ••ƒ<åŽö¨DOªmS‰® Ï®„²“&w`VgéÄ lÒñ©²ÁG[•Þ¾¡ò+H³²q .ºýÅhy>Q[²01=ÒØ}Ðwý…ojÊŸœô†0WÙöv°¾I„[UMLVi@¢ÁýµÊüg¨¦´ 6>ï 5’ÝDç¼RíÓ²™©µsX]’¿ºI¥¦øk[·+‹bnÎLƶªLo÷iŽÍ"ÄOqaåçì^ñf@¨}Åe©¶éjcf—0.ÅEÊC:LaeoÞ&T SXXÈhU>¬sXÈ0—ì2±N¦sª¼pÙÎƹ¹Ø•{Ÿae*XÙî/â~àÞùtw¿2wYaf¤d«²pñå•(£Fh£ST÷¿ +ôA#PY˜ÆÜyppã*„UbBÿª'Pl¾ì'ÕίÐjìw°}LfP¡ãÈØå2›œ\¼Äå'eVëu® + ¸Cm7h V"g„jËÌQ˜ ½+,·x,îƒÛ¨€?ÝvGx¨Îfz l´)Ä3«—ªó{&h$þÌT¾»[˜9(­º£©ªw‡a>ƒ¹,êÍJ°"¹©ýîæ½íµ›v_"–mÎíÜ(ÌÈoÿ«CGÐÂføäŒ/³ [½6&©qxÇ „݃ RZ¼’™8 ñjrûÁâÌ?Ù™X¸˜ížA}9ˆZåˆWíÉ@ e22“{Üì¶RAg #w'¦µtìÉn8 Ý|9-áù×w|ca&*aõäØÄt´º‘›ÜÇøœÒæ1âO¸®°Ò”ƒ®gb] J2Òµ³Y"X©,™±z*çw’íÝÊüÕâÜ•`eUfó i1¥Ù-3;5vâŒ?7çO´Ý¾,( (:A':Þt×áË[ȸ…J LJcaKµ…ÕýTvîРj\k7;J,³¡†ÎîQã&öò÷ß«On *,:„ecðsžä¼˜[sKýÍ"”(ÉËP"0± TÜoóÄB†‘ + gÅÊ” #MŒDÇkîhÅ.Š$`Z+닶©pßËôn æ\‰x DôÄÙîËÀ¤M¯_Uæ]ѪśÖÓa£[túÓRyŽ@€bH_ +¼&\칤¼Êá=©wÚøœ8<·Ä'&•(KH•@y½0s65±%gœÁ‚ÊÁäš³³»wc¾Äa¹Íâ)8¤6î8…þé_9âdó˘P˜No,ÒX©/]Ê÷ö­u:RõF+k»×çvo èÇü5f’kíj“ËJH2½{@ŽŽhp—7³²}Ý*ž5[]!è>”ËÚ=¹þ7_DpHCÀ|Jé”N!žÔ¨Á¡´Bϸx=ÞYNO­HµI©ÚMuf›kg&¶Ï嶉8`ÂoR@³‘–Š ëq•²8}N_‚ —ØxÅ̸ÂÙ@¾µuù¡úê¾X꘹°ÕçåDg)NÈPø}o8ÓöDJÃj›’,ThÜJKñÛ§ÉÔŒž +㾈XìP‰2/X…¨Òå5óA:‘N÷ÄæŒ )ɬaÒ¬ÔÑQÌä´³K¶w0_ØDPvN"£ +âbÌÉ¡BÜ“(§–jËÛd²¤qùÈPŽvŒÎ踑>2¤=6¢W˜H13íMäÄ5v/à™P\tÇ»h b ãàËJäSeÌGÝrkó%"õ53•ÑLJuz ewIv2dÀ| + =f¦Ô˜Ï Y;9 IŒÃ@½íË­µsT¼x\oµÑn  Ø„Ñ96f<1nVc:‡`t‡5Ž¯î8`0oÙ%5½éÀ}™Þö•öÊžTîiiЀ©p3RFĬÌN[™€Tšƒ°Œð(iµ]0Q™dëlqæ® CmØh”zSmˆ!Gø .1}®/„ l¬$¤[þìl ¿ÈÅ'‡ö="ûæI­Šz‚U…ž8< 8>b”ëi§·+-s “R9dV½Ãk÷¦¾9f¸kLTn±yòb~CH-Øé´Ì@»E§7ÉÕ:ó›3«{ço\¾óÄ=O¾ðÄ+o¼ùãŸøÉþò÷~úÅß¿ÿ³÷o>‘žXÇ„\ÿuËæ †D¶‘*u³Íùrw~ry{íìå«ÿÝÜyòì½ß:wçiw¸¨°qj«G®wB8½y7dv_ÖìùXIÌTcÅzº9[Ÿ=µ´wãÖ£Ïß÷ø³o½ó«÷>þý+?üùÖåÛõÞ©haÚîI.ª¬¬ÌD"Lã’j›Gf¤LDPHvãÍU¶-d+û×ø·Wî{úÛçï{øòÏœ»ùÈÞÝ^yè™WÞ~÷‘ç^¹xëÁåó÷ؽI¥…R˜\62@Je.6áòÄd‹•rþx=]ŸŸÙ¼P›œYÙ½¸qáÆ™«÷½ðÚ÷÷åßÿ§¿ñ§¿}ðéç÷?ùHnâ˜ÌvBî0Q.:Ì.騕]k¥.‰ÐI­Ý¯Cy+)!THJÖæÖÏm_ºoùÜÍs·¹÷ñçO])Lï%[›8Ÿ:>Ž|ý¨w‹ÅêÔôÂÖÆ© ç®>ôØ“¯¾þý÷?øì“ßýáW~òáÇ¿ýÏü租ùÚ÷òð3/Oo^Œ6ÖÔ˜¤GŸTb½1)œ,TÚ û[g¯î]¾yû‘§^}ë'¯þèO¿öƒGžå·þË>ñ¿ýï¿øûüó¥üòÎ3¯/íß0)örk‘Ê4L‡ÓÅÎÌìésçnݾÿñgž{æ¥Wßzççþö?|ï£Wþý—o¿ûÑ—þûÿýÿü¿‚"ÿüËýò7W~6Û]ãbuL Îú¤DºØ˜\\…×ÜúÎþÕ{zú…ç_{ãñï|÷á¿ûÜëßÿé{þæ£O¾øâ‹ÿýý÷‡¿ýâ‘g_Ù¾x_(7áârv2ÉG:¡Ò²Þ!lŒGˆçÊóë§/Ü}ûæ#OßüÖów?öÜKoýô'ï}ü³_ôç¿ýíÏÿ¯_úŧ¿ÿãwÞx§·y àçól°éೞDÛ­æ꽉ù¥sWï{ð¾ÇÿíѾûÂëoÿôýOÞûä÷¿üèw¿ùìó?ýå¯ÿõ¿þºõ'¿úì¹W~,å§G ®A•”sÌàV#¼…Š’b>œmάžº|ÿ#Wzì[ßyí§¿ùäÝûÆOÞ}ù‡ï|øÛÏ?þý~ùÁÇüÓ_þçþçÓß}þÌ+on_¸È4Ê/7ØÆtv-ÂB,I§jÝ•å­ 7¾ùðS/½ù£Ÿÿæ“ýâý×ßùÅoÿø—¿ýç}ü»Ï?úôÓÿøÏÿüŇŸ^{à‰\g%\^"ƒ5E6ûÅH §ƒ|°(Ïä›s…Vo~çÜ•;þÛK¯¿ûÁ'Ÿ|þåwÿýç¿úè·ÿõ¿ÿûË¿ýãÙ×¾óá'Î]»Ã†ªW°ã|µ>=3¿±µ³þÒ¥«7®ßyè7ßzóø×ùËGŸ~öÞ¯ß{ñÕ—Î]¾2¹°ÌÖ¸xÓàh¬,êp·—óŠéLaiuûòÝwnÜyôÖƒ=ùo/þä—ïÿøï¿úÖ~øãŸ}ù—ÿ€ÃyáÕï½øÚ›»Wîo-쥛‹n_Jˆ”#…v0S $ +­É¥ÞâêâÊò•K—¾÷½·¾÷ƒþðÇï|øég_üõ°ï~ðég¿ýÝßÿñŸ}ñÅ›?ùéÕ;wZ ›|¼êR„7æö’¹jkzi}÷`õÔÙÕÍS—¯ßxåõ7ýÁ‡|úûwÞÿøÍÿôý>øÝçŸòÙ§Ÿ}öñ‡ôÒëß?{åv²>k!D `¤²/5e##ð‰‰L®²°¼|ÿ‡^‡qüä—Ï÷ÍŸ¿÷›/ÿò·¿ý㟿þøÃ/¿üâW|ðâË/?÷ò« §/S¡¢É±r‹.VóÆÊ•Î\srnugï¡ÇŸzöÅ—Ÿ{åõo÷{?ï×ÿçÿúÝ—}÷ƒüÓÿéË/?ýü‹—Þ|ûöÃOeêKZLÓ9Ç5„ÒDëP/HD²Ü‹åš kÛ·{ê©—^}æµ·~öþ‡_þõo_þí?~öþ~úé—þóçüâÝ_¿ÿñ'½ûÞ¯î<þÄÞå[tçÂr“}L‹RbÆÌúÃÅîìÚõ{yíÍÿÙ{¼ý³_|öùç_þå¯ÿî¿þäwýÛßà}ÞùùOöî/Þ}ÿýzíü­ÎæU\È£*³Gmtl¤\ƒX1¶Øìmî\¿ýðó¯½õâëo~ç»oüì—¿úÇ?ÿùÛ/þô³÷~ó«÷~ýÁG=óÒË»®L/ls‘Z¬²êá#¹b3]¨Æ’™êĨùÆÔÄÜÒìÁÕs·îܸxõüî¹3±l‚ò2VÜ©µz„S£cjD¦E­(-ø"‰x¾XjTÍù•µ¹Õ•ÎtgkwíúÍ ÷Üw}ÿò•ýk·ÖÏ]*MΰRÜéK{b§?¯69µf§ÉNZí.§Û³ºyqfåT(ϧËK³{û»×ï¹ûþGnÿð‡?xïƒß¾ÿÑÇŸ|öñS/>¿}~¿29É"T m…èŠ2zŒ%˜ÀÊÆùÍý©Úd¢Xk6[³½©S§6ž~úÑ·üö‡úÙï÷öOÞþî믾üÒ‹O=ñàí{¯-¯näjS,8šÙevúÕ(wR ¹Õb*ƒƒ$ùX4¼4¿pïõk¯¾üò«o¾ùê«/üò—ïüùÏ|îÛÿváÜ©Õå¹BµÍ—˜{Lk³¹ýð28x½ƒ·:y” |R,S¨ÏÌ,œ;súÁ‡xú™'¿÷Æ«¿þàýÏ¿øü/ýó{¿úñ“O>º°—*d ˆË`÷ i‰CÊ£¦“ã3Ê bÖ/&©îìÜÚé3g.\¼|õêµëßyñ¹¾ý£—_}å…çŸ{æéo½òòwî»ycs}3œ(Z\^…Õ©¶Q&܇ endstream endobj 80 0 obj <>stream +Ò¡`ºÃŠ)3âöK±ù¥ÍK×o?õÌ ?ú­KWn<úè?ùé/~ð£ÜwóÒã÷ßó؃ìžÝ›_\(UÛÁt3;±Í†ë_]í_V[(¹5˜áXnqqíò•«ßyõ5`¥Çž|òÁ‡|þ¹çÞùÙ{O?ûíË—ïîÍ/'r%»‹ƒ8£´²ã|\eÖ˜p½Õi¶“´˜¤êùúLczÅJ±jÓÙ]J«Kn"`ÍNA¦Ç•[ 6Öìðꬔã;g³Dz¾PÚ#Æu&Dc¶j-(êb’s)9Ê jP¹0=îÖ£GÆTã› e´&€PN!ìm§xŠå­6Aà¡H(žIÕÚÅí½‰…e_$jt£ZdPcÕc + £0Ñ£:bÜ@\” æP*`Â=%xýAïó +þP4,ÅâÑ\©ÜåD) •*Õt*ÅR£Õ¥CY. t„µ¬Lìk*™‘¤…¼‹Mr|8—.$b É/ˆ~¡7·X.g“Ép¹^£9¤ب˜õªÐa…eHf<9¦3Žh]Þ3Fò™D¶ŒäâÑôÁåk뛩D¤Z*e²¹V£Þ®—¢ñœÖl?rr "À°Âvd@utP×öïÄGˆåMñbBŠ¤±,AûtF«“äÅPÎãF…JmªVŸtS”Š±\Ðjgd:â˜ÒÞߊÁÊ;}yÒŸC(p·ÎârQA_¤ Míô$SµµÆÂåòÔž› ë zžãC¡ÍúL!×#PE„Oµ÷È`{Xåø?¾1¤±òfBRšÜ°Êîñù‚ÁP< ‡¢YŠòØmvÜᦹ8#¤¹@žWý›X.Ú ü¥oUÞ5 ;1f ÕZÜV2âàRÑ\wvç–ñ@¼E™8Æe$LΠÙRÙ®·›>·71¡¢vO€ñ”7âðˆ‡‡åǵ‹!#F<`c3ttÊB%¨ÊB©-ä Ì<8ª“+Lc2ÝXÿ 8+¤qÊoÁhîW˜Øa-> +3b96D›pIm¦G6™Þ5ª§F Œõ›=:L°¸álknõ¬ÎŒŒ©pÈt`Nцq£ðCš™Å䌙ÿÏCÃÇGf‡´kLëTZ=*„‡ñ@å{¢MÝ{Rf¢Å@nŽ†xîÏYíœÆäÒˆJs!ü‡TðV*mæJ(äJÉèÉm%Êkp0Y·Ô ¢“B~U*®$'ö©ÈÄ ± d$ÕÔÙØoìïhá¡ÅjiòlªyÚìŽÔŽ"ÉŽóß5¤TaãzXJ̬Ÿ”«ñA ñ¨MÔ¨Ú¡±°ZD0ö/uëo2I‡ÛÇFÌGÇtÇÆ5Çeº™^‹úÌdÔÎ¥¼éI«;*ÆÚÁìƧP6¥w DÈB'ú[†â’ñ~ýøø]ƒª~ ©q«#€1 Ì“²¸B±Ü\´¼vdÔxlT'3V&á +6 ±Šr)-Âád ]žµ±‰ããÆ2àҬAX_fžŽO:¥ +L¦?V¤i¥Å %7ªw)m~-r5©°­wH'ä•É%FkZÄ3ªÃU6¨: &àÞ,á-~uKRfpø ð`}aÆ&ÆâŠ0Áª… 7¨,œ[¬‘RÅJÅUvÉBgÆLž¥]yÇtØ×Ëï:¡7‚©l‡ßêëí^…‰’™o èË¥…Ó •M‚?­d\‹‰£Bk÷Bêï蠟p ö7±Ñ†îèÞã㦓c&.ŽÈl‡+ŽŽ£ƒJ\cõò¡®äVx )Ñ#ƒ:(ê•Y9£+BGºL¼§´ò)Ñ¡Š™Ž)Ìì¸Òq|PbÌl¶û“…%Ä% Œ€¯J——Û™™“™X3r‡:D ®Fá‡ožò¦çMî8”͸‰=>f"=Éb{W +wP™Ü•ÀÙ$#äá'ƒrä›GrÒœ ³ÂúªÑ€Vë¨Pî®!­ÆÆZœÂ¸“ëÐÔ'aѵ¨.B%û;`›Y˜gR!ÂQ™yDïÒ¹T¨ÈÍ \zì«mFÔ¨ÿ×ä +٨訮ÓÓCÈø×:.‡#%¥¶ƒ/iÿ¸Ž’c&0:ãp4f$Ç-̨ѭB¼gLODõŽ`eúL¼¶ #ü6:ŽÒi›+Š¸c6w\eóÁ¿:>¢Ó˜¡]#:wƒ<âˮԗïÔv6ŸÜLa\Ô`DÏQÜW¢¤ŠG*º}y§·`veJk‡UPتãÆÁ1ËQøSŽ€Ó"üC™Ùƒq©1¦wÊ”å7Ž«NŒZµ¨ ³ ÿr×ð‰ÉÎí ªÝ'5ô •ë›#æ»Fmàn½åƒÊâ…#jû‘´zËÎØ WX+ëTrófËõååshÉаÉ=l¢ÕŽ°ÁǼ52:7báA4Vî„ …CèJ',ý=^ú[^㾜Éå³²a³'¡§¢6_—Š&:jã2®H‡Ï.áþ²Ñ„ÒÕ~”Žº…œKÌ\¢ÚáSÙ8‹+8Ðß¿E{hDòf îìôfmdÿô5x +Hô˜Æ>¨Bä¨_ëJX¹²ÃWv +E§X6")¥*mjgt†ÌîT,Ϭ LìظiPa5`+šœC=yÓ¨SXÚ¾.$[G†µÃ +«ÆLëí>‡7ïàój ƒtŠE“;xdÌp\nÖbÀ«&2æÖt¸ˆxõ…óD°Òß”æ˜ÜÓ@Hg˜–*Þø„ÂÈ ™-˜abw ¿z™ ›uXˆ 6¼Ñ–ƒO9…œÂæ9Âè’[3wx ‘êfiáÂ@÷1Ùæj´²®³û‡ÔÌù°‡QY ÿ Ü|tXÄ"dæ¼™9+:bôŒÚ|¨X Öw²Óû¸P7yllæa2ƒSarªú{B[¶Ñh2£ LP‡ðr9¤Ä‡4N¾Öü%Ÿú×£²}1áIÃêJ~u·xhØ !Ów¨Quÿ‹E¯ñÙý@1Ù&Ã¥ã0Q˜ £¢FOŠNM[}y#%å©å+K—׺ƒgÀ%U¸Ø”76åOõœáΕu…ªí›ÿæIíÚ¡Cû÷W2¡Vqæ ZÝb•ÅS7 ¨¬|Ê›› TV¤êZ¨±jÆC-ñG*÷>ô|±· -©±1*„Ó`"Êåùä.TeFJz‡úûÊú-dÂL¦ ÉQÁ6iÉ-ôñ1=$,ÓWwô¨¢É5¹"(›&|ùpqçSОL¤¥ÅEÇW—XcŠŽŠËQAaãA‚†µýëáV/êɲѶŠ9èÈhPOƒ —u5®wƒ›Ý-&Ýa+›DùŒFôÎa v¬S T ed¸Ÿ:§c’ÇU¨ÒÊi¯ÎáƒPØX™Õc£â›P _Ð5ª µÍg£s„¯â–긭Q´²pŒa—6:ƒ*o$$;°®X’Iœ î7;fõ—£|¢—ìžOMã²óVOVãŠ*0ÑáÍ… +ó„T¶x’6.‰y_+îHÍîË’±Ÿn&›K|¦kÄùtcµ¸x5:±úk˜XÇÄÚ¨ÙSl¬¹þt ÓÔà˜P3’³;ïO-JÅ_†JqKe™Þ Ž3¢ή̬œÞöÄ[⬠œPY N‘‰5kËwïyvõÒãÙ™³v!+E‹½Ík®põ¸–êóåzþÜ&6ÅübarÓ%fV^*o±ñž•Î8ýUÈòþnuL´´¨¯ kñ»uã&xÀ¬Ø}¹þ3€ ’M‚ÏU`,«ggΔϧ&·#Í .3‹ +Y”=úÜ6îèïIÊ&fCí}©±ë +¶‡µn`Å|mqjíîoœ4ªll µ­øìAjî +[XV!:Pxð™·¦×. PÙx&Þ¶÷¦N?œš8/·pGÁΙÔÀQ¹í¤–³ð¨·¹¤3ˆ JauŠV*¡•ŠuBÍÄÔ¹êÆíÆöCàAP?‡†Ì¹Ö6j¨þ—O¬^;_JO@Z‡¬4ÓÀ«¸'¡A¸q <6nu®þ­£`iT8 ü#³™1Q‡x­+¨„ ŽéÀ+=fÈ» ç‡4Ž1 ‹npK(ŸæSÓ‘Ú2üRa¸±#V7¹ìBª}4­¿®7a¼Ó—ÒØy¹••™ùQ=;¬!ÕˆüÌ‚I°I6\Ò`ÊŒ[ › WVó³ó‹WìL,ßZ‹Ö–µnÑÆ¥ølNL¢¾R¨¼šlﲉ  ŒÏù³s|¼ N':ˆ¿¢ÁÈ94jD ÈÎ ¹%_a…M͘ÉƧ‚åy\*¨1!–¨p-Y_šß½µvá¡úÒEŸÈVçÎ^ŸžÊ +–7æöÛ»ÿõüêm"2¥'#ƒZ¥Rna¤Ý¢sˆ`‘2‹â?éÈ-ì‘1˘ÞmÀƒ@w\21"T ”ACª©úüü©d°b"ƒZ‡ÇäI=i(­pyavïAfrØ@hþÄÄ9°Qg°>Öß ™Ô¢|0ÙÉ67Á ¸„ðYŸ±yóîè¤;ÞŠ³ùÞÙ»ŸÉL9"ÇÀVèX×lš™$d¨r|¤ßË9œKþë 娑r†»\fÕî’á‰a-ä8·• +«QN‡û'·nl^jbûVaîì)°ÀqE+˜Ów¿ÈÍjêñnéñ0”œ˜›W Â]ƒz•… g»N.qô¤ò_ïP8¬¾ +›_óÖ„üŠÙ™Ð¢")Öô¨xd@=0Žž·Ÿcr |%71Еù‰5`ï15Ú<„€ys@#x¤­@½˜#BU›0ÑI"زš¨·h&$Œ Ù\%ä" ¥ ðêoWÕßpŒèMÄÌÄ]Ãêã +«ÜÊ;„R¤¾™èž‘* 1³}îÁÚü¾ã„l¯¾r³´p=ÚÜ-öò³—ˆPã„ +£Cu»'©³s}–v†ÍlÁhËëþˆ°Ênrw ž|ÎH%q±w¤O`{bm”ã\,ÕZÍLí¦&O‡ª … ¥™³¤Ta£Dk;ÙÚÌLl¹ãJ"2b†a¼áF0;? ÄŽËÌ[ #î`Ël9|•“*\af¬î”48@Ÿîe{àHvvýÂõG_rJcFÊ€‹N©­o÷NßY¿ölzæ<”ä“-*ÞQ¡¾1}DfÒ¹õxœHëý“i­Ã? ¶+ŸÃ_óå¦Oß{þÁWW¯¿À–‡Œ¬Ïè]a•Ý?j¢ DØâL¾2î+C1ÀÛ2‰žÍ›=‚ú:rÝÁªÁ4ŧ¶su!=ɦzˆ¿ná + dt"=}YçJŒè:Ö?£8úÿï®`ó ¨ˆ£cV­Ý).hlì7 ýðˆf€/¸cSvU‹Ér$`"S2ôÐ1Ÿž–›8¹™ƒe Bòþ ûÁ@iqCé £3f‡à-¬RÉygxÂ[\EøŒÒÜÇE`W3›†Þš„ŸÈ ¤Ì@©Ìˆ-J«4ÒÀ¥ßÒ2@beƒµþŽë#†“JtâD¼Yg°B†JÞX%U_ƒ0ŽyâåÙsåŃX{ƒŒT¬LXïjýÝÉ(±hÆý +½’»+8%OÅšûÅÙ»õýÍŸA^bL¸¦9jtË­Œ–ˆ8ƒ-*:úŠ%²íµt}Åâô›ìžpa¦¹z}vÿá…sîÞóíxkÇé+žÞ½÷àÞ§1!­ÅýZw*¾ìRº³_»jt%¿9l:âŽS± 2 ¹2Ý=¢Â¶!‹Aè†s‡êPh l¡â >*Ζ.Y¹¬Òê–ÖRͳRv¡ÚÛ¯õ¯Λ(ÆŸ½pÿ d´}\îP¡¬Ÿ'lž<ô ¾ ÷C;HŒœ€ŽÞtÏŸŸÏM^:ÿ`kõ"”˜PcõÌ=f§¤´ñT¨éÏô@`ÅÜ櫨ð­!ƒj„ïÃü˜U…ba)>±lƒxR‡OH4Æ®Qƒ Jkzï±ö΃ùÅ»ã“ûfOö®!³ .î=bñÄ™un +«Š –¶‚å£c–#'•2féŸo1 È# nfóTtè>qTeÓ¡ì ²¿Ý„ŽYØŒ#P©-^Z¼ô„Žˆëìª3Pr‡ëîh‡IÏÓÙe“4;ƒÑü,„µ¨Ç„Ë8…P¤µ™=>f¸ë¤òè°öÐv@a‡®ï?=ÐH«-^+`¡Ã/×ã>íU½Ù)_¾inÑñ ”Ïz¢%3éµoEœO¯QR•NjPQi"Q·dÀý£`%‡±I•„^ÐÙ“F˜Ä ™šbˆ'XðÆ%7óŸd{T°ltx-¸— eÉ0tJ'9µ]˜Ý”#¹ÙîòA¨8m¦Ã\¼#UÖ1Àæô¬XZsGgtMA—Ppp©a-1ÙPëìÃ" dÂÂdMý|á;4ªþúI¹ÚƲá–79®l×Öîq+”?7¹z•IN‚ŒIõW7w T’¶£µÕã*ü¤Ã=‡·0¢wÝ5j84j3’Ÿa"m=.jl­XÉ°ÜD)ôì¼@Š3­Sv”V6ÝÚB˜¤ÊÌŽjœÿŒF5×ý+Ø!¡Ó)&Ú!¤*i¢¾‚Ý_L··0Ðs:’n¬$Zð“R`~ÊãBÉŸñåWG „n©Æ%æØ8ÀÆ"!Öƌ޻†-£"[™¯u×ûÛÄ)âuˆ¡´ižU?2jñHå`º9•p /@…ª\¼Eø2/dšþÙ•Íçà3˜/kcbžxÇ_ZóVSÝ bq•Š6•˜Òwº¹  Z×ß„Ðì“é!¡8†Tv¨X`ûo|õ\†þfõ¬Í7b’  +R±ÑÛ5Ñax©©Óóž˜?x*5{àJLÁ±B²3½Ùìs‰%¹•–™©¯±dÄo¨lÄx¹£„¤Û›‚Àbz$âã&ïq%Æ4¦wŽh°c£†þVÛÒØ?C[uðý¯Ï4/扥š‹•ÞfkåBgëîîƵީ{ÊsçÅêš +Ç Óý§lDi£p_Ö¨£\Ù%uŒD €Y‡$ë´V^ßtZÔà©Ì´ÆêÓ&‰Cd£B._JçðÂg™i†„#P¦C•duqåÌ}N±Û÷åþgŠ¾Ä4h LzÜ@yÕxqnTƒÔêH5*B:ÂÎe4Ø`)ÛZÕâÃêþ+þìBº»—›9ÛݸGÈ.@ïgK+—Fun•Ó£^˜¥q-®µ1v:Ý-÷|*Mífõ²·¸”è´×îõ%:“óg^{û7\´3¬÷ \…‰Ï…Ë+—ž\9xŠ¶XMŽÁç À¾’h.ŸKlÓá®Û_8Vã€pàS£÷„)5¨eäFž5¾ô˜€= +õ D $ä&·Þï†j¡Óx ŠûK\¢*/rÙIo®¬o2™9"ÜÀ…Lc³»v/ª(™Ù«ÅBv:‰UmåÁfLPíÔ£z·ÖêÓ˜=f»å³í%6RMT!î]”f¥ò—_@ #ç¥âôâùÖâÝgp@ÊÍn+Ã}E„M:}ýk­|2œ4þþIuT@<%;î™5Òp€£:bDã€çTaýðí~+sø³Î@!Y]xðé7žýÞ¯J³gBÆ›™â33™‰Ó±êJ©µÕœ>M‰iZÌ’’Ë_"ƒ +•Ó³GG¬‡‡úßÐAiÉôîA…ãÈ°ñð vPnQB®0ÁZ¾½Ý˜??d ”¨Wç ©‰.•…%©¸Jk¬ +­ÕXi^eãä&ÒêM„àÁ<”îD³“'FŒ'Ç­fà*¦³û†”ÐyÊcL‚ ×TfÆ€ùm|9>Ùu÷¯©ËbÞ¢ƒM䛫¥‰-àf<`#C&\TI=âôÕ£œ7VCÜQ½åLNÉá˹Âu*Ö†÷19¼ÁDysïàºÝ[ wB¥m6Ô|¬m¦“Çev—Šf§qëÆôŒÎ'üõ…ûªK÷bõ„ÜNð)6S]ÿz\þõÀ†”[üV2ÍÅ'ŒdHKøäꮼN(l—òæ ôábÅ›_æÒs—ûwF×çŽV#€»Ý3“›÷­^|rûÚó3§@¹æIXé¸ @TÙëOŽ›&zHCXé ñÎ5¬u©L$¸’çp1‘n-/Ÿ½]œ;­"x̱°­Ÿò‹ýël£Møôþ†LÜ#´{m`yž0j¼º•nvJÍa-i´ (›Áø¢•¥†M<¼F,à%L#ˆ§ÜèTÙTVŠ‹ÖZKç»k—£µÅÖÂ^ïÔuw(²Q.Ѧ#õöÒ…ìÄ)ƒ+¤AÒŸX8+¥Û†t¨W…ø5hÀà£tBxµö¤Ì<ØߎÏÓ50n:)·8<)/HzzZHuq>1¹|%ÝÜ0,GÚgRSà èP­9>^^„Ìn£â¾Ô”˜rz¿=qbÜôµÃ2…Î 3`‡'Æmýóö¨8sTï’¨þÙ!½ë˜Ì¤Å„N'DJKL° µtRŽÚœ!JÈŽªíLJ j3­6ÑtRs×q9†Å¡c]Ü_†¥S‹zË— /ë@Ę„…ŠØ¨ˆ ó1RÑFG†”6»«Ï¨ãz|\G¨LÌ°ÓXYÍs|X¥µQv&,7¸ Ò"…ÉæD•}on>^ߥ²ƒ|,ô ÖÄÊÀ4®q­[k8ü„Ž·@ èÊDiûßQJfÌ'Ó Ã +ÛÀ˜qìtøGÇ¿~däk‡G(N*lj«‡äS0¤d¹'ÄãjÔÍ'”ˆåÓD°Æ&§¼ùÅT÷\²¹Ñ™Xyíïõ¶¯Cf„4$æ{|z +R*²x’J‹‘¡ÎÜ-86¬:9¦–i‘±þÓml´?Gðqð}£3ˆñ9:ÞJ4—sÝ­XifÿÊSס£U—öç–…ÌB¢qº¹z_iörajŸ +7ÅXk~ë*îÉQRKHúþ~b2Ø"Ć +õ)3dpL4z†ŒžÃ2t@퀜Å'gÙø4Á¥Ö¯æ;kÎ@ŽMô·s‰·÷Êó×z;wÖ®?oo§êKK{·Øä4®‘2Ê&MýG±': 8½6¤A•6]B“’& àÒ̹Õë`ÒC*ìð¨ SÇÀ”Uà†¸ô„×PoÂÆD`®´DØ)Õêó¥î©x¡+Nš)ÉÁG¹PYÑ +§´ +2#«¶ø"”*Îçë‡õj ©·{d}> #¾¢Í›7¹£ÅÎf¥» : !‹ é`Ééë?Ë –¬LÂê ÅsÝD±7ªAFTˆÚÂZpŒRmaFè˜åƒù@¼¦Ðã)ý½÷—$וßùO¬F"èn´©.ŸÞgF†Í°™a2LFzï}eU–÷¦«ËtWµ7Õn¸†%H‚š!$A?#’£‘4#Q#­¤=gµ{ö×}‰sòàT'ÒD¼¸÷{¿ŸŒ÷î+ô6æöNf÷Ÿr™O°`ãSKÇŸþø×z²3f%€»óÓ B¨R«ÆÁ¦()æ +3|¬>nA8LB“VÌîåœPˆ’Þ@Øê&uaú ]c6Ò &ã€$o@—â­£“wÇ„‹Òü|Ô¹l_.¯hÅ~wvûá[Ÿç:›‡Ó­ìô¡eãÓ~±:1°¤ n?ùUJÿúÌЩ ‡ ð˜-„eôRefíða@-ùò‰9XÊ“ ¹0émD‹.*d¦ôú¡Ô‚€Fã=?Ÿ¥µ*.–øh'Y[&丘®Ì1ø$ "ÙpyÔÍ Û)ˆÍrÝŠGœT|ÈÁ¼4êu±fL##-(˜Å‚©þÊBgƒÒJ¡ÌL¬µ›ëµ×î-<--^å³ÓõÙËoýð2Ú2c +,0©Œ%þvWî `ðR­Áž)߶6~ÛtÂôQi$T¼`Æ.Z`PAŒ î>¶É®ƒêî“j™%*- ?—Ì·7JÓ;˜”3@AQs6Çì Y³/lõJí‚%zç'ü@íI)3lEΛqBkeg¯©µM:Ú² "ƒŒàãUg@õÐ `l€>‡â½Aw|HvÈȤŸ°aà«/4jÂt@ß®\saaRÌ’á,ŸlUWnv7Oz›fwÍí>,·|¸d÷‹uøy³g°g“‡L8€FôÞÔÁi¥q3l÷„<°=SíïÜð†bTâó T¬)æf’3{áæ¶?\$„ÔÆÞIoý†Å/8PÅÏåød¿Ú¿Ò^¼.¥û8àåB÷Ù‹ÏÒËqÚpÑì7ø8 ª ‰©ts—‰N™!~fã.k¾4ê¼`AͨjD©&3½Dyvzù°¾xÅŒ ˜œ ¥Z\¬Š+¹x}yqÿñÚ­÷}b^).jµ o0gE'¨>¨jB4ij~A+,!îô˜ ×Qï|»ÑjÔä Ÿ3çû˜s§ÆmcNÌE(l¢'W#õm½¾cÃ4-Ù9yþÙòÕç @Óz…ÏMs™kݶ!¢ÙÇ‘b1ÛÞ‡ƒù ßúvƒƒ˜pjØåÂcÀQW:›Wî¾íü8&´¦6¬¡6Õòzgû o4ú»{·_d;Ûo«ƒ=ªðˆÜï³x(Pø zœ:;‰Œ¹‚f,ÂÆûñêf8Ù¬Lmu·ï/¿±püúÌåGL¼mð p0«®f§.{©)ÜtÔb®ŽZÉ1 9i§'­„ÓŒeû¬\þÎé‰ó£.³‹6Úq“4y„1çgÓÓwAõÿ?NÏO"À'Ô&ïYÑÈ_žwLº)+Ê[1ÞËFˆH X÷Úú½tÿªwQ¥ÌgûÑæ %2ð{ßΚçW@âÛHuÈ>èßkpÐ7;jF_l_e¿h†m¨hÅÃþШ‡hE2Vvqª”Ÿ)/ߌÔ7¢ÕÕtçR¢±N*9àŸíƒ,9”ϹÉ(°ƒÒ…T¾¾¸sü*©½|Áì&Tð.Aõ1ÊÓ]”.g§}ÁÄ™q'ÈôIŸ`Ç5€ü zöÇs­ÙµýBo͆ðZuµ±þ`vïùÌö£Êüa¡¿Jwñú³ïýõ•gŸOø%®%[»Í•“Xu/V½ÌD»F?h4¯áBfÄNCN#Ã6Îi&ÎÌ\ºùüðä]'.8©IX°‘QL.'ëéÖ^¬}ÅÌ:qY.Í­vPú`¹=7â g{WÛùÙv\õ0i7¡[!TXP‚¤{IÍu­HØàârI¯od§¦6îÔŽ7.…øáõWðÕ7ÙÆÒˆƒ$T@…²×'=!`8±PÚKjÌþ ƒ‰0V°TÒmyžDŠ 3 {o}ðegùjsývçòÓô­Ôìõææãé­{ý­»ÑÚj¼<ÿå׸óì'"ÒR ×,^¦@o°á2ÐSÃ^B*}ì™Çé!ËwNMœr´âñ@¤CÈ•Haž”‹~!‡Gš¨RÇ#m*13ée±pVÎÏ€Œh¥H}-7\_¿[Û8)®ÜSš»d¼+'{ûOç.=„„Œ_(D³JÖp} O ¶w7¡¯Œ¹Çw +ð Fÿ˜#`†%;9è<#f¥Ât¼67séþÌîÉêñk­µ›zcÃ/Wdþö7X;"L:óÍP±œn_.Ì…s ŸwÑ6Pwüüˆ›¼ÉeÐpƒ‰/„s+„RvRcNÒCEÔŒ:pÀ€T¤¦äû±Ê<ø/£W!ZÕ–3ÝTkCÊΪå%µ´Hª•p¬º¼{»½r`Ã$€o‘ÊÒ •Þ„¥Ê`§Q3ì„‚«»÷¢…Ù1J˜Ñíx<@`k¹éË7Ÿ—¦6A\ŠÍÌŠåÕ|ÿxûÖûGÏ~T_ìfÒ¹ÊÜêÞ}$1)®æú·Ë‹cÍc6ÖÈîm>ŽWÖÎLø‡@…µìDtPX K±öž+ÍÕ–*½mðJƒ¥"*W´Â<(‰ö®˜êCÉöÈpñ¼ ?; ¨œÍ´2ùøQ‹±æ ¦CLÂÇ&üBʆ ŒRŒ•çR¦8{¸xüf¢»«ç±pÞ‰+­œY>|õäÅWÍÅc•`"S0—3z8“Ìpó¾2ì¹0‰cS#6ì_{eÔ=lD&m”Õ¯øCE;È8ÌÈeði€ãÝÝÞþó¥änz¨h²±ÑÛ<Ù¾õ^}vÿÒí·k+×ÂåÙÂâq¼Ä—×C©ÙÞÊíë/ª G€Ú¸Ät´¾¡–V±¾=2Â/YÎŒº<„êÂÃ@!ÂMF`1‡… |nFÊMÏïÜݾó¶ïFê Ùþþ =Qy-ѺRœ½£UÖ­˜dÇ·•A8Qz“IÌú4˜G䆇JZ`qÔIxè˜'˜5¢3n Zjà3HnGÅc~.ʧ{¹é+•ÅëÀÅøÇÅt¡· ,¬‡Q¥Â|}åÎÚµ3{¯I¥E:VuQ"Âi­Å#RÉ8H !>†æP ËOóÑšÕ/˜ÜA£{°9‹V,°,¦z±Ê"¨#§†lž@¡”H¥«-ÕWnÈåe¡Î/îß}ú!§æ<5Û½’ê\ÑË\¬?梇̰ ÷Žžfëkç›Ì +n:E鹸šìF—`Z¿róµãá-~ HeùîÖï-Ýø/®YʼnoïGýµã17÷ʘo¢£3BvÅ,œðY}Á|{S¯­_0¡Hp` +4,\âÓ³Áä4Î'÷n¿qíñG|¬eC$|ðS|O/¯ô6n_ºûA¡ó%ˆM“r}ÒÍœ±ÿ›3ã§.Ø€åc@¥ÿåy‹ÅÃ(ÉÞ¸•š€@Ý´cú`ËQ·3i†¹8©×cÍd{Ê´œÏuwóýƒÊÂáúþÉ×~énpéîêÑ[{~Ø»ü:¨·Ÿÿ¸±zŸŠ4â¹¹ùKCÉÖˆ‹2B"!PVœ;a'œ0/ë•pþ¡¤ÁMMÀå¢V_uwë+·ÊKGL¼Ú];ÎÏ*õu¹¾Á¦gQµ6˜Õ­ƒÊÅfz¦€ì +%mlŒXݱñå Xs²D­ñ¹yO0 +%X­{ù*•¡PâÒ&˜mÖOG½´æ¢ÃZy¥¹ñ¨±ù(?w=ÙÙU+@ßJb¢>½{?”sýúæC¥±ˆwZëÔòUw”Â2í Á ©ÛÅà¢}”ÒëÀ)ýåyûÙ1¯ÉDùd´²FGšfHš°‘B´î@ùq»ßèÆÉïÝ}gÿ΋ÖÊ -קՒÉp!!P§;ÐüãvÂÇÄâ•åxi!œêŽÚ°Sm£6ÂŽ„mó0hZóR²Øc”Ô¹ £Tê«7§÷_-/\•ò ^.?øq€‹Þ{þ~cöò˜,áç2VDwöäÌ^Öƒ‡“•yzÀVÆI'磀£®´f Òöó1Z¹ñèÅ•»/P.å!ãå¹Ûé©«ZyIJu8ð訕0y©\ëÈšs>à¡si_@³#òËCŽI+Zn.¿þÁO.NøNÙG-'¡´–˜œ ÇÛ%Ug61e´çª¢‘)7LÔ—2½ÝÜônº³)fX½’j¬vwîu6Žs½ žbv†ˆ4½\Š×«¥©mJ) ¦²„~ÞO*¡GÌ°ÕÇ‚¿Q.>fC­xéH0Ñ®-ß\¾þÞÔÎÃâìÞÔüöO¾þÝáý·©Aó«~´½.®êõíöÆÉúw«·3íÍ£'ßÄ»T fç£íˉ©k3ï̾]^½“kn~ÿ«ß¿öý¯Í˜:ææG\Á1oÈF'Ñ^8¿”®­Ü|uzçNvö°´t-;»/WŠóõÅã•«¯]~𨆩ÆÚž~2ð4?{$dûˆ8˜Û‰ËM$Ž:;¦Z1 ¨".U½óY$\1B2&­HhÄo†+ß^¬pÙˆš  €¯JŸŠ”ät=]ÕŠóL|âË>6秓˜?ÿí.Ò $l~¼eÒÅ6°‘>*îDdð¤ÒAU‚؈oZ«WvÁ½Œ;¶@„“’ršO4‹3{å´VñÐà k:¾qç7¹'^6ÉÆZT6º¦QwhÒAÛp‹—1!R¼±ÞX¹ž›Þã3³n65æ X)/ÆšnBÃøŒ'óÓV­ù™¸ÑÇyK3nõòg.ºNŸ³:o1a.Dô ÂÅçé“ÁNŒ˜‘¿¼`9=êº`ÁFí +†…➀ì!)?.,ã¬v¨¾”ë]Š6·ƒÉ©€”c5­ÔG æZËáœR\ŽÔ¶ë¼ˆa*\ H…ó“а§(ØKê'bìü¸1(R%ä¼›M67ëó‡ÓË{»7Ÿ4÷2­¹ƒg­'+Go÷w$jË\¤ÈÇê©ÊÜú•‡l¢-fgË ×ºw@DªË¡T›Ô‹‘LûêÝ·vn¿aÅÕ`²OE»bnifïÞÞÑÊrcjý³¯~±wòf0ÕÖ«KÀn—öwï¿ûÆùáßü»W?þzóÊ«üà¯ï¾ùC¡0/äçÙÔ¬VÙª-Ý[¹öa{ë™_(¡T ~zÚàã'½A7­;¨šËÏÞâ3}¥ÚË„¥µF0=ˆÖ™Äåj¶»·xåMTJ²ZŽ‹V¹’éæn3+N2œ?ëZÓèa(1é"4P[;𷛳HÃ6ÒÏ¥cÕuLÈ™`ÁÊVo§¦.S±V RÇä¼t¡±ã¼ÙGz©0Ê'0)‡‡st¤Œ +PP`¿ÖoFËó@ñpÙ‹“ö€ T©lƒxpé)µdFÃ&8“t¢©^•Lãl çb^JgÔ²ÁÅ1ˆŽ±‘*¥iñ‹g†Ý J=„æÄd$á²R¬NNöwRND°Bܤ“:7æ<}Ñ +  ‡±PÎ…É ˆ b6ÛÞšä»ÿ0ÑZFůÔä\W/t•láS^R¥• +«VùXÃÇDµâl¢±Pò~>ç$A¥Ó(5ËëE½Ðã“ ƒÓ+Ë|f:˜èVfsíu5^¬Ö{7Ož×¶Y-_›½´}çÍÃ'ï]{öƒ«O?j#qsxvÂÞ[ðan#îSîÁ:|z2¡ +k3}6Õ¥£MR«¼"+Æ}Œ:æÀœ ÒáܼZÙËë¸ZˆI%Uc¢e3Ä„b­x{O¯ï$Z—>ggaÇGM~^.ˆ‘’ÁŸ³Ÿµ_4€…ýtÚG&P&™i®{˜.¤Bñz´¹F'Ú˜œco^‚¸È¤j€%¥¸ª”7=¯p.Úð Y ³6D¹$«×D rdý¤‹6Ã~J3{¨ 'îÄÃ^\dCj$šfšåÂÉlm¦8½œiͨù6­ÙTC.õ“ÍùÚÒ€¡josë΋ÚêM0’¬œ‡i͉p/‰•æ6oF« €Uƒz[Iõùx‡TëB±z:(,nº *¡ôB¢y©»ý¨ùqsí¶ž&ƒú­{ϾþÝè_ºçòreCk_)¬?½üð‡s»R^Ï<~ûã¹K'žàNÅf”ÚNnæxõÚ‡Ja^ŽÕo=ú`÷þ#.vÜÇAbJåÎúÉÆ×îÊ-¤«‹wßþQ¼¶bòM~r²µ7³÷ìòƒOÊó7¹øôε7#……S#®WF\#VÒ‰Ç`.«K7|zÿøÑ{Ÿÿ e|b•NÍSñ>—^œÙkùæ÷ã='¢\¹ûÎáÉ»bª ÆüœÑ2Ëä ¹‰&ÕÏNâCdeóæþµWÍ^î;¯L~çÌÄ_¼lxiÈe‚çY°Ãaàýò LÌ“Z r€sÁfF—åÁ¥`¤`ƒƒ6„÷21&Þ‘K+ù©ÝÎÆ.Ýsb‚žŸ ¥z&t°ÌjÜÅ[ ƒ‹Ah•âã6a°z‘@È`ƒÆ혓ŽºØ¤y°Ä/å¢/Í(9?“šÙŸÞ{µ¹u?;S,¬9 ;Ä0jѬ,®Ò±QO f´ÂÌ80UNvÀ!™!ÖK#Æ ‹f(H„r ²[½¬Z˜)O Y„ŠZ¼!*†cU5Ó†yÌæóQ +Â'¨H±8{yzûNcé(«Ë©&Ÿl»¶P§¤4Jën„G’Ÿ”'óÈüí- »?äÆ'"©BÙä úè8L»ñ°; ûY<€ÝRbÕbc1][„Bƒ»™Åþ•DkSÊ´áT@ˆÃQ^Ž‚‚8áf.š1ŒKÄœŸ¹pÉêc¬n’`cb²‹« /eçåâm–ûû͵±æº7 '2µÅí›ZvÚЕ\_ÊNs±!g”¹qÙîˆA_¯Èlô„ÜT2Ÿ‘2 ´RCØ(ÃGRÅn±»^ VÖ„ÒZ¢w”ì(ù9 üóÂÌôÒAoýð]À +²ÀTSƒŸaI!7nAÇA5•r·NÞ½ûô£—;5â²2ã~Í×äÒºœ_ †So~ïË[OÞ3¡§‡ãv˜µº›[¾"ÄhÇ0Z•57&Ñð1:Ÿlï—ŸÚNÔ–¼ŒNr‘ÎÜn¢2gôm°D„K~.³Q›70añ6' 9«Óeuû.¦·.уÞ?Ÿ‡)¹Ñ]›ßº-f¦ZIÈÌð™E'•1y?!‚Q“7;I¦@„Ž±©P´¸ DÆ!G‡R¹ò|cþª•„ì$d‹78a#ÇLÉ‘ÜÔ¸ <4é6¢N4 ¾àâ~6°!.&ì(ÇÇëñúš˜]`£Ý\粘šv b¾¾œ(Ï™Ü,àA,ØqÝà‹¸ˆl@¬‚Cš´¸9!RK£à$9ÀÂBHöRq«? œ03p&9“ ÆÚ‚^‡¨0T&/ëÌžžõ‚ã=¸‘2ð f?dúp0~Ìè™° “6|ìóˆŠ77¸Z¾'庈(…”³h0N‰i^É‚£%¸¨–nؼ¸Å¸0À2Î| +œƒƒŽ× ¦r7žqxŠUPJuøy¸j“TÊ>:êc+"!RǸ8NûP~Ò +_ux€WÇÂg.Úϸ&L> à$¯DJ‰|DøÀ±;ósn:îÄò˜d±Òr§G݃uañéÜôauåniáØìf݈a'̸aƉÃôQ2.¦øxÕ`Vgø(#Æ B4»?©ƒóçÂÅ13äö³áöa$ôúaŒâ RäSuXLÛqÙ‡8!>·ty}ÿ-§@ªÊ™Ùts_L/zÕá%Ívœ”Ý˺PÁîcç%dˆIá*ʦ]P($$×׎¾oÃE£v`¢ÍrÓ‹‚?a…Gð{“6Ââ嬰hô']´ÙÇ¡l¼V<8+ÍFJóR¦Ï'{œÞACY"òZ9¤WA\¹pELN)¹5/W¡erqÃN£ÍKq +ÎE^:o:}Ñ6f xɤŸÍ»ˆ˜ +“RSH0 ŒŠ‹Õµø%;®c „ÑóÇ\nìlôžŸpCâ$tÀq^,ìFƒ#“® ”Sã,:¼œÃ/x ’ÅCÿ)ÄËcV?PQ<ØMEiÍ‹†¬.ÄlóÁÀû¦ŠF³Íæp{Ð7 ù¨ˆ æÇm0º#F¿ÉE:ožð:!ÞhØÁõBx§‡1Úp‡-NmÒbÚâ"üTăk\H äàÅqç…˸ÑçC„¡qçЄÇê y°Éój–%ÝpÀà¿93yjÈöÊ°ãâ`¬ÌA` 冞—.˜Ñ`šRÊA``R-J)Y£»0é~éܘÙîs¢A D£t8UšR3-VÍ»PÞäBFÍ.ƒƒ€(P 7ÒÍd{óœÉ?4é³^·zýFp!%ТÍ BÔà! .R¨ÎÄÒ ð‡ S¢Ôò€ÄíXxÈ«‡&CI6œs¡¡ «ßhGÌ.Ü* ‡3c.¿((Ùtq*Vìø‰`PI‚\6ºYðFÄ‚€|ù‚íâ„ÏæœÚ™‹Æ1'cE#_¤ÕF0Úfµ’ÝGqB¬1»³€‹ Èe)щ•BѶ ‘&¸ŸR`F̬óÉ»èðÒ.?ct"ö “Óã§íž€ÅŒ+.ã¡4ˆ³—…ƒQë@s¾Ê'—)¥nžÁEí„ц\µš]HÀõŒœAX}Ä2=íéÍå;^<ºµ´Ò—Ã’Ú½¨}wÿë—†O_0,ЃÁåqaBˆ!…X6ètÃV Äp¯ß‡$Œ2J IY‹›8;lzéôð©W&/ŒØ‡=Ž\£“è©óΗÎÙÎ\tŒ›£3š=V‡W‰¥ÝPÀíŹnwÏÂDg¢ãfïé “cF¯ÏG;~«Ùˆ"v1èË%˜vMïM—²%=šÊÅÈÎRýxqa©™Ï«¹LDŽè¬˜>uvttÜìpx8’’hŒ†-ê7“Ù‚”(VdƒŠLÐEå²Yaº¡Üظw÷æÑâ­ë«©|ò˜ù¸ÝáÁ<1 bp†DÚWÏ…ûíD5/èTÍðËS©“›ëàñù‹ãßÿí;ßüò³wÞ»?7›S42ÀRlž +ŽêJ± 6j‰Z%æi=¢âc°:¬6{ˆcó…L¥]™Y˜¿óôíd­e|6ïÐ0@¯”Úô1©s£ŽÓ§Ïú!¯¦(Ùl&žˆ¸úü݃ë™X6šMcFŒœõz¼¤Ï^–¡:³ÛãO.åÞ°ôæíéç7Ûï?œûÕ—÷þéwýêó›¿ýüÚ?}óúÿþ¿û›OOžÞZ¼¼^‹ÅtrºI XQ5”O°3Uyc*ÒN#Sy¢œ ¦ëz¿ŸkÇÖªo?ÚþÃïþí¯óã÷ß{xÿæúêÊèq£Ád÷Û öì¨å¥3l† ‰rk¬7òI¤I¢¬Õt¨[Ñ@j¬OiÏîo¾öpÿäÖÖ÷Þ<þéW<~t3“Ó:ÓS¹Îú ¥œVS(àS¨¨ ›mùÞnýÖVi«Í?<¨ýò«§ß|õüÅÝÅî÷ÿþ§Ïÿåßñç?|ü³ï_ùó¯ŸÿìÓkÛ³q>àrX퓧ϼ™´uÓÄÕÔ_½»ÿÍž|öîÕ·ît?yuþo¿åO?{þóO®ýìÃËþíëÿøÓÛïÞ©ÞÚ.¬L碚‹Å‚b,N¤ÂzÊÿlž9ZL¾vmæÁnùärñË÷¯þîëþÇ¿ùï>úíW'ÿóOïÿÿ÷?þéןìÕ>{}ëW_=~ód3"ó“FÏùQ§Ñ£ÃnõØM~§E¬Ax¼“ìϧösë]uw6zÿ óÅGÞ{ré½gמ>¸©©›ô@,‰ I!ÐŒcËeêú¼üÞö_½uðÅ[û¿øäÞüù‹ÿçÏ¿øÃ/?#ð§¿~øçßÿã·Ž—{ÙˆÌHV”£†qo^F§Óð¥}4+?ÞNþlõŸÝûêý+Ÿ¾¾ùõGWþÓ×Ïþç¿ûþýýû¿ÿñ½¿ÿêæo¿¼õøx. ’ LˆÁâr?SßKÖÔ73ï—¾xmáï~xô?þðÎ?~óúO¾wðû/¯ýó/žüãOO~öÁÎÏ?Üúõ§û?~gûÊZ.—Ò- \äû­â|#6[¯ÌG¾w2ý·^þìµÅO^[ùãÏÞøÍWÿêÅå¿~{ëÿú‡Oþßÿó›þí;üêöÿÃ;?zÿp±¼¦ #£F›ÇãÁx’l¥ƒeÙU­ûúÎZìÖZôÑAéýG _½»óéóå_|vë¿ýÃÿ“gúúõùã§?ûáýùr«;¥çZ„¨zZ U£å"ÞþþÍÖ¯>¾úw_ÞúÑÛ[Ÿ¿¹ù³Onþ×ßðë/î|õbë›OŽþËoÞþýg×>»_{ÿz~³J*t€ FF-§O8F9`kF½; îê¼~²W~qgî?¼ÿÏ¿yñþÚ?üôÕøúé7}ó½Ý¿ycþÅqqo:\‰âJ†}ž#ÁpXÍU+õ~3ÝLRݲס߹Õþò­Ÿ~tø“ï]þõ—7þáç¯ýû_¼þ›/nýæ£ÿãÿå—ÿð㛟½Ú{ó y§”Kv,1ÂDNȧ”œ†Wtt»¾±¬œlèÏ Ÿ=_ùÃßœüæ‹ë¿úôøý§/ÿ×þ›Ï_ßøüí+÷®¯£áô€½,B»Ë2“%v;âÃò§O×¾z±ÿõWþå·ü¿ÿýWÿøõkûþÞ»÷–—¦sŠ@Ô3¬˜ IIAÐEšŒ}S™à¥^æúZáþVúÇo¬ÿýüég|øxíÃ{½½¾òó®|ò|óÖ¥êF¿XÈ‚rŠä“‘‹ *ŠšHG"Q­éøFGßžŠÎFß:®ÿä½½_qòÕ»‡Ÿ¿¾õþý•§ûí';•kË™¹F8ŸÖƒ°¸p‚ËŠj%€3qEˆ +D‚G{¹Ð­Ò§OúÞÎï¾¼ùw?~ø§Ÿ¼öÏ¿~ÿ—ŸÞøÕ÷÷þüÍÓùÕë¿ûÁÎK'ÛéN–ƒ½v£ÍÇË…h¢År*@òa¬(ú¦4×ÑtèÉ^áÙ•ê÷-ý·÷ÁŸÿÞúèŸ~ýæ¿üñã_üðÎÇÏÖ_Ü_˜n%Bb¡NgëM+A|¾­G‘nÌ»Q¥n-§žvNv7VóïÞèþæ³[¿øäÎgO׿w·ÿì°s¹—˜Êò8¡p2C# ¯]Âl[¨éë½Üj+u0_¸·S~íJ÷ùµ¹×Žç¶šÊv#¼ÙÔ¦ + ×££pœž?ŒâlŒR\0’Ž'’ +Ÿ©ÙRt{*{©yvØøôÕ…ß~zðÏ¿|ö³Ž~p2ûý»Ý'ëÑ»sÊÉjv6ä;âóÀ FZ^B›´Àn/†¸í"æÌŠÈ\!¸Õ ï¬èw²Þíýé§Oþ÷ŸÿêŸóæï¿züƒ'{»ýb=¦× ñNˆt9ìË"¨HgUªžΖ”~fo>{{³òу՟í>¿9{¼Vny"|F‹iÌ`7{h%ÑNWVäx‹¦%ÃòQys~jk®Ç/uå»Í_»~¼5u°Pï]iG+)Ii‘à€bõ‡mˆê£8ŸÆB)-QE5ùB–ù„ÌeT¦_Ñwf +KõË åµn¦•‹7Óñj\SEÅP#F1á a*îEB‹Ón±ø].žÔÒ©…VþÒtüúRüý»3_½¸ôƒGK?ùàø'ïýèùæO–poþÅÕÆþŒ*Ñn¯ËŽS¼Õ‚/®ì„׃§"±R\×HGEõ­Õ¥ËSÚÑ\ô‹×Öÿëß}ÿ?ÿþÃo>»óåÛWõVK½zTxZLòz¢"%;!Š¢¥b¦ Q ‘ÈjL‚dÂl3­ÕãR'Nïö’×Ö;Û½\Y!ÓRP ‚‚ €ÁNñ³#¾¡ ÀLQÌ .' ù4ILFõL4šÓÕ(Oj,ãéŒÊ‰¸‡‡= +ËårM@èn?ãÞÀÏF2-³0VÄéBi2˜Œå¦º+Sõ^^ ÍäÂW + ùàåéÌF;9Ÿ +R/žÊ¨‘±Œ&vry>;lÿËÓcãf·Í"=ÄäÕ`œó5ãt?ÜŸÖŸõÞ¸>ww«µÞ*¨‡ðP8ÃgæRÝ#˜Š<†F)’¸ @Q\0(äsÙTLŽkÁ¸ÊJ¡@(D³¼à'9;ÎØüC¯ÍÏBÊÇh#vÌâåF îåebÉ‚Ïå™@ X")ò +I0‚¶9|6'fsf1jA†Mˆ“ˆ†³‹ra æ´”FH ‚© õøH&,+W«³ÍæB¹Ü“Ã@/ƒ|8kq!§‡'ǸˆùùJ@*³á"LHCÆáQ“/Ó!* +rT‘òIeªß™+,5#Û3ÙKs~%UO†« -­)6»ûôÐĤc°¶ý¼É÷ÒEËó1`ˆçRÅÅxªI„ÀÀi™Šáë[®§N®n?¸±i¹?].ª<‡cˆB`6âÀT;¦Œ»Jo'[Éú^49MRánwáÒþ]DMN8Q,$I‰X¬JWt-Mx»uy‚#ãÞ³ÃFÌ +kF¯dpóNT%‚ ‹ÙãvxíNxÄà3CÀ™[=Œ ‰©!¤æ…ƒÑît$-. +ctö“1R©ã]ƒ'ø³Fƒð"a˜CJ‘’ª®ø DZ![r™ía^èE>¨À^Ü!”7Bg†lNTñS‰13ößþÎË£Ç=çUAŒú|¸Ï Ó#q<áus°'HøƒBàÂB0n0@#&˜Öšzc7ïrÑn¶»Œ—í(ã¥TF«FJ«r~ÞG+n”eB‘bsvØæ=3æ±SH¸Æ$f˜h +>6I„ÒÅ©m\­Œxx'=X”á¦â&ŸèFÂ~Lœ´øÎ ›A&z Š~6cG*[ ÿ¶áö¨“urã.Έ2j9­±J>¯b\¼€sN\u“QT,R‰”‹\¬ÉêU‚RΈ™aÉŠ„Í~Ùˆ:ñˆÁÃ9Q¢UJÊà¡8%¤dGˆÕƒJÎÐÉq¢Nò‰!ƒmÒ9`‰”›\fÕI'Gíø+c®—Gìc.ÖEeHµiô²#VtÄ2èÉ“×n7Ì2b,ÛôD2XžŒ°i±cš +´¿v R@*h…U˜/!Åä Ú‘OtÅdo؈ŒŠbŽÔj6,bð +VX&Ä2™ '3lø˜¬^Þ`£Ý€Rw’ñ‹6Æh%)V§BQ€ü0_fæÄÒr¬±L÷ídlÒÃùj¶¹…²)ðÕÁXWÊ,ª…5>»|Ñ-œšDNO@&ß`Ñп>5v~ÂG( ±¼©”×ÙXÏèæÏ 9,.vÂÆ|÷¬íìä¢TdJ̬±zÏÉãnþœ·b¥9ýü+Cp&Î;&­¸“Y)Or±‘qû¤Éíõsdp?ËàæÆÌ„'dÁu¢~çå .3ï ¥‘P|zé(;µí`c˜s³I\Γj9måz—'‘ âü¡“h9Ù$x¯=ǵvªyyåÚ;juå f€µ@l.”ßÂ#=/—µÀâÄ`Yº‚}{wÌŽkN2I¨]&ÞÇ•:©€!Í|‚‘m˜ót´-d¦jÕEECñ¶^^ÁÅ%—ýB‹´äÚ%¡¼Ê-0±6&fó3ÇX¸jyBl§EÅ:p¸âä²î`–¶ej¿³~ÇIG/XPƒ7äå­¨êb’ÞPΆ©A¥”om´Æ —¸\wrO¨ŠÉ=¤ØñˆÉ/Ž8ˆ1f…‚1+][0:i³‹¦¤"­˜ +Ž?\Z×È'Ö|bÕ‚‘a>rÍKh(cöšl»¨˜_(¸¹ü°GÝDBCnzÂ/û…j¼}%>}]mìzmcE4\¡â}*1çáËv: ÆŸy”§ã]#6@b@kó…m6½‚ʃdvB€) ¡˜  —ØDW)¯éÕ-­¼&fçäÌìôæ}T­øÂ%µµW\¾WßxP^¹§5/%»‡”\UÖú-#vÐ1ZTb>\ÞŽw¯Æ:WÃå55XsJ¨uD¬x‚YŸ¨Þ”juú ·ý“ËgL°UøìR¤q.@bÓHšAÖ1ˆK™!Îì熜̘›·ú%¡{ÙŒr‰i>3ë¤U[@µÓXnÁT€Ú¤úÖ@ÔìŠÝKl´Î÷¢t²)/_ò u,ÒƒÅ"1«—eÕ2i¢BÑ +K@ôZGÈ.… +áüÒ¸ƒ#äF@›ÂÂMð]&,2Éç,´Õùô‚Íœ7Áö@Ä/•p½ƒE¦üRe¡Æ¦t(08A—e’s°Ü ã3~¥eDuBëˆÙÅaKÞŽÇA²€ÏgbSPG0݆jt´kôH#rй€lŠùe¿X³#|Üyt拾“ß=gzy1añ€ÚfbÓˆX·’“N@šä-˜fÆ#6BéPZàBG«Ûze ‚‹ÁRMõ쌎JyLk Õš”í'Û[t´>…0­æµ€LxCYC iå*v&—C©iÃKè65—˜:nn>ËÎݶR àCôD·½pÕHD&€@£¶HFûrmWn^&"uVÍKù¾_.Z„(&W‰HS,,ó™¾WHsÉvÿàYëÒÉ mTyLι¹È÷L}­½~碓ÄÂ%½~)Ú>JÎ\´÷ðXÏÎfùt¿¶r7RÝ0x%13ßZ»[Z¸–ëw·ŸPɾ“Iú¾ÝµâAÀÈ@Óª‹÷‹ b½ÛByÛM¥œdè6ªUÏZÉ Wâ +´>GÇøܪ\^µ"¡–…›Y&ⳉÞQ~áö «O|&Ù>D@`¨X¸€GÚL¢Ç¥ç1}f,v EÛµù#›0xyWL´£Tw‰è öðƒ/-­óñ©ag'SfDwÑ&µ*lázߌÅåôôâî,Ÿ5áì,.Hhy«yéMTªn\yõÅ'_ë¥ÅsVz’1­í_ϯ=JÎÞ¤“³“¤—€::¸³“ˆƒNXq?Zu7”^žp„Ì^”32ûvµÒÃVZtzEm|wÈy~ÂcC$3¢˜ýš ؉¸RÍxœIÌIŵ 77:è¾%;ɘ‹I …u•ôÐ _(‡(­@t:ÞºR\¹ç³Bª*]¬±‚*\˜§¢õ€VÁµJ¢{9”écJŮӋzóPor©9/_óóv:Ê$ºÞPŠ˜ÖÁô¾G¨ÏN_Mww€n“= c½ Kµ@lšÉÌ’Z¥¹p8½ó€Ž·Aïe¢íäÔA~õ„É.ò‰V£¿óð­/“Ý c@ó‡Z}/=}#?wK¯¯;)í"º`ÚÃ¥­¤ê2Æ€ŽjÂÜíÆú“X{Óš¸\Mua¹êdÓDl:Ú9 f—ñHWÈ-Ó3gŒÞq*dZR®Ë$:2å +–ÉÈ`¾}oãÞôÖýs m],*Ö²ÝÕÕ'l~Ç'Õ‘PöêƒO¢å“_F¥Jmùö•Ç_yõÓÆÎc21c Ä­ñàõ/¸X炱RT|!\ÝÏÌÞél¾k@ÁTiz7RœrFL…ä_Ú­­¾šïûG„R÷°Y­²n‚U¬Z+ŸAÔ.P¿Hm·4{ ø…V›ry›Ð§ðH“Ð^6 …ÞÆ­­;ïyt’ >½ÈgæéD’jÞ`ÁA&Q±šì€çÏš¨IÄ$¦øü‚RY6/Çk¥ÔôLqöhÔAŸ5 ¸j©U,Ò%@uã+n®tÞBËñöîñsN)ÿ«—Æ.üÀžÓ+éþ­þÁÛ ÖLºC[×Þ%¦ °dDŸÜ±Qµ)”]MNݜݯ³ý*£V–6nd:ëX8Ïè5>=“hn¦»—ÓÓReb•%ð=à‚"J ¤6(‚ °‚4aS³‘ÆÄçÜ\ +;µºïÝNÍßÖºˆR–b­ÞÖ1?c£469£T6ËwVŸ-_{·0w,¤zÅÎvnj‡Ö›Ji%=}U©lÅ[•Û³¯ÉÅ^®µQ›¿I'¦AÜzøœ“‰ƒ/ò‹u.½ˆ†«”V.ö÷0µj!"ÖHÍã@±õ©tÿzuýˆI6ÙJkµµ;ÍWÕöŸÜœÄ"&T¥£ ½¹1î'zÙ'UµL*­Ñ6ðœç͘‡I’ZW‹ˆÞDbsTj)”[só6\¶cb´¼HEªˆâ3½DÿŠ\YQJËZuC+®Ø èa(»\ån07/–6ÉÔ2p‘ú›ìMxƒÉæffæ*•˜a3 @Åó… +Rfnfë>,ä|\ª±tmûÞ÷¦Ÿ—ïÄ:‡\¼ €zqëÎþý °ì cBj&3}”ž9NÍ&¦¯Ú‰ãçÙ®B\"Ñ;,/Ÿî${׳ó'p¸yÑÆÁ¡œ•ƒéY.»@§gýÊ`p@EŽâœ‘´¡:È,ˆ/Ÿ5øΛá³FÌN$©Pš¬Öšt±/Ù€'9åã+.6ç '}€§´é­'áLßèídD‚‹×íbR°X¦çµÊÈe,”îôwÔ´3 Ój5ZÝj¯t·¥¦ö¸ÔÎ0Ìö¯NxX;¥‘ѦVÙI÷nFš{Z}G*.“J5R^Â&§Ãµ±¶I€ôKzi£ºú€MO;h=Ù¹¬•WK3{Kûê«wBéiJ.5göKý=TÌk…ùåÃçóo´6ÕÖÄ:—i5½±wùòc¡š1Í/•z Ä@¸²M§ ¡¬åúÛw^™0Šrq•I/rùµØÔÕÙ«/ê«'bjvnçQié†_-…JËDjR§¨Ô²TÚw®¢j3Û7Þ,ÏV;’qPöJUX©ù‚¹hy#ÕØž^½Zž»âkÈ`[ê¶ ¤$J[Z¼9MZ— ³Z}C*-ÅZ—„ü2pbÀü¨5¥Ë\CäR¸²®5÷µÖ•Tÿn¤y@Çz m?›ßÞ¯ÌÕ`ƒÝâJ¬y9\X&:ÀÁúƒ©úâqsñXʵo“Ñ6ŸšŽ–vO­Þ2ù%Zk”çŽjë÷¹ÂÊ`Á»ÞÁ•ÆÊÞ#=׳ú‚ƒ¯­­HuOöØø ¬vÇýÚEG0.Ù1%׿Ú;|«¸ùXjì*õm¹º…¨½a;O†«åÞ>ʬ~Ö…Ëf¿âc +À°!bÕ +k¯ŒC¿„K5®Ÿ3 >“Z¨Ôb“ËNAÑ íf’Ž@Ü ‡ýÁÌ ¼—³š'˜¡¬åæ¹Dm¨ˆói`¥øÌŒR^&Ô 8 Øþâ*Ÿze L8­dg?ѹˆuÝÁôðä\:×Þ%•Lf¦÷ËËwÀø7×56^Mõ¯¡‘šÔr3^XÒ«ˆ 4§¡æµò*=”&ÄjR²-ÏHùYÝp¸L„ÓZ~†‹5/ÚqD(€·XIÅBÊd¼Ê. +¹e)7Ïgº6\¢åÂÚÑ[S{σù%!¿¤UÑë¤ThÏp³éX÷j¤u$–·•ö1™\Q4ææÔD{ñò½²øò„×ÍdœÞØ å—BéÙpz:[[yòÆ'74‰FÌDÌ'Ô˜ôrqùdêÊû™Å€«‹[·ž¾ÿãXueVüZϧÎ@êt¢w½~éÍÿŸ½÷z’ìÌîÄÞƒ‚â@w—MooæõÞ{›Þ{SYÞuuWûn 40f†93$—»ä2¸ŒÝP¬"dB¡ýzÑÿ#Û£]­ô¤E¨‚QÕ•Y™7?sÎÏܼùæÑûªT÷G—îðòãî¾C«”5–£MÐé«¿ºþâ/ë³Ç‡7¿rûb´–뇵—ãB`PžýãoÌö±·Á.—ßmn +g/g&¸Óîêy4¾d±6z~]?ú*X¾­õªP«/žÇLU•Ÿ]ˆ}«ï!ƒÓ/G_Ï¿$ºS½u +X½W‘ ‚É“ó7…㯿àÁýªâô.»—ÂäŠÙý“ÎâñäðÙÓ/~nL.¹möžØƒçfç +lXÊ_{ýëÕÍ÷'/~[UÚUµïÌÞ6Î~ë-¿4zWæà†ö–`ØÏ_þÜ[?û(]Úw6ï_ÿËùãGïZ‹'à"þöÿ§ÅÅ·Ucâ/ßÔãmÕۧ߄³ç¤Ö;¼øê?ü/ÿÛ7õßb—¸@i_ú³·íãoë«×NÿÜnnž¼ùËgßþëÏQ£‹»s>:2»×RãŒvW„>Œg«›Œ7Á̪ól|ÚJ fÍËÍóßàjSô&zíÀÀ(~}ðø{Öžf óªY;8zòΚlçÄdŵ6>ÿ±±|Ö×'A÷ì¯þáxñþ÷RäV^(ÊCÚY×&/“çÀ›¢Ý7û—à’`V1©nvŽ8o.4OqwÉG›Úâ‹`ú:˜=à ~Ö]iŠµÒ™ö„‹·—ÏÿBïŸï¡ +çÎIØp-Ÿ3î׺„Ñå½Qóà-¦œáu¸zÝ9ýÕôöwWßü›Áåw¸Ñé7¾Ì‘*6 ´Ó’°¦Œ·j+T«û½¥¾Ìs!n ó\½À×@S³ùÊøs8øÕÛŸÕÆ +T±Ò:Ñú×á‚;j/_½ýCEi3Ö‚VpgõÑìÆ_UâÒ{M­±F•Fž4Åpæ÷Ž'G/íÎá¢í"z–sdüªuV‹Ì檹º]?ý~ñôÇhy3”7ÓÛgyÚ( ;?yº¸ùíÑ›­ônKB7YµÂÁ¹?¾.Iµ}TMVÔ[gì¥ÙjMžç·*FÓ‹o@"‘zUÚ`u[‹×ýÃÍÕ{°„¥ïÏ^Jõ ÀHYŒàùÆ팯o¾ú›Éå×´ÑøÛ;:3u[Õz ÕxzúUgþ °Qkmìñmûð«ÅíÏÑê‹¢ØÉb¶ß>ž]|YÌÙ3©q f Œa0~2:ûŽrãôæ»Åñ«;9»¸ÞŸ5úÛõó¿¤Ì1 _‰XmÀ¨ýî"\”£föÅönJÀ³Þ4š=A˺#€¾ÁÙ×îô©5º¶ÆWáâ‰Ö?ÇŒØsx] !‰ÖRãTmŸsÁ3F%¹:8|ÍŸV´ ¼¯ô(sŒ hñŽñfïbþä×e±Ÿ½oo¾™avÎÃÉSˆç²Øƒ™V[ÆÛñ)¥y¬tÏÀ$VÕ&i¶H½éuŽîQ—Ó¨6s·¤ ê‚Öß²ÖPPk‡§¯6¿àbý .)ol¥5Ž¤`™§,-œ„ãK«{èõ¡Û§}’§Á•·{ë·Vÿ<…kU1 ÕN9g¡µ¯p{–%Ôç»ßSÞÊÐ@" WŒÖÉâú§ÙõÏj÷ÉVIËç¯Ò˜Q¤½åJ Ô…Õ8 '·€d0©O.Y«)aE®æXmû£ÇfïÀ¼"ÍùMûà ¬¦Ü:åêÇi¦†Ë=ÐEZó“š²;¿á +/-Dš£x¿/Ê9{òíâè¹hµ”pÏ;›Ó›ï:‡o³¤nØP0'’=ÙJó©ŠÉù‹`ö|púÕ9­pa +ÑpµNoÍÎÙÃ$±›cƃÃÍì]·¿³¦_Xc0£ªnw‡¤Ù‹Q(XaÖ´¤ üÄ`Yfìhú$Z¼2 f¯„ÚAEïÄf†0i½U•#`·îé·ƒ‹ï­þcXhgp)D 1÷7¯†g_£Z³¢6ªzøýò«¿}öÃ?MoÖ†7e>®Þ z ‘º€]îàúúÝf—_¹Ãóy,̦E.‚@‡püöá×Û¿Ñ"ÚÝþú©Û;bìa !¨ø`e´.a°\{%‘u&bt ÀÒtNËj'Ã8˜Òì®^ZÍí ú(]Ic*ðª:ÀìiEïò2J#ꞀBKbºÔ8Ñz×æè9ˆº*¼œpò`{žE“³2gW¤0Ï×Hsê^˜½XÖnB®¹@öh·¬äé3¦Bí´±x×?ü¦¹|µ])¥=8| ±Á<åØXRi]ÐþŠr§yL]œ~ÙYÜ"BTæ!ŠZyÊO¡†äÏüþyº*í˜?îÿLÅCî—¥VŠŽ ý„£ëhô¸Ì…ÓëïAmFë7Vÿš‰wæt“e‘‘#¯½†˜/3cÅ;ÿø£§1&ˆa‘2»³yü¾9>áôšMËr‡ ¼ÑS)8 õá~žK#Jcò¸ôzQ³˜•(«ÛYB×Ü8ýë*_ËcšÛkLˆÍlÕ£yÌ)þ´"µ½ Ø©ô7È­s®vs­k:<"iY‚pµ]¢úäàƨ*7Y³ïˆ +.!×Õú±?y>»þõðäƒÞñŒoôö9®€ÚöË +„.sà„>¼©ÝÌ;K­~  O‡þð±­²˜Y›”=Ó{7ÁâMsýmKI½3>ÿZŒV¨Ú¥ìy†®ÁˆJŒ™ݽ­x£°b4–Þðš´G)ÜH!¢æ íú:i.4ÛgR°æì)*µÊ|c¯$ï½~À»óDYÔ.¦7®;†©Ýxã÷"á´–ÑèBëOâ½þ¤ñ­ÌDEÂMUõÛœ]/®¾%”îƒ$OÈT³F”Ò)àæ^Aø<æq¡CBïmÅûsr뀘¡œ%ã¯A¢ƒñ|ß—&M!X‚}øü¤or|”&}Êœ·@é´Ñê¼=ýòïû—? õÃTüåD“V|Æl±n_kZ£Çऄú h`ƨQŠCˆ6c¶åúJi¬AaT‡×bÑ>¢ôFUbNŸ>>yþÓáË?£—%®ÁhÞVÄ•›Þð‰Ñ¾ ãM_Ëóß(‘–Íy«(3e΃Â5isd ¯!—I£/8ýÎú–¶úe>âý¥\ƒû¦vø KXw5µVÏ•ÆAžõ”öùàꇃWˆ?‘<ýVàqúó›Öòiž„ð¸µùæøå_^}ù/Ï~ög·Î;‡§ÏÓZ<-0N–´³„ ±­7ŽDkÂ(­L…w[›áñ{ÈVʜوs—ñ…íK‚v—¯zG_ÉÍS¡vH£4nÁ:ò6h‰×@¬7m¬¿€ÆãdoÙ"$Qàx½)˜MÎh4¦O´Ö)¸§ªPçÝYòå¸""|=UÑp©%ù+ÖžñžÒ!Ð*wÒU¸ À…YW¾o +³iâ.½áãßüÛZeRKano…¨‹Îê¥Ý:.ëH—»(:©“*ÉûŸ,ä ¼ÂדtðiŠÜ/ ER¨4Okó×ïþîìKBmöo2¤Ф֖R0'|ëBî€×û08ÿ)®7ÄÙFc¦7—€ZdtœàÛû¨ã4N‡ë·à>Á#õ:íŒÁÁM.§Ï²”–¨²˜)Í#­uDh-Ùw7¯ûWß‹3Ü#b“4F|°F¥2ÈéŸÚãgÐ1pCà%³¸ÎZ½}AÛÓ¸æ =rF/É[±vNýD™ýkõÆ¡èÏìöÆj®>äýÈÆŠõcoòª¾z/·®`n3„žAÅÓç?5—ÏY Y½_;ˆÜ¥íI4}ÊX=\ë4/ç†Ç¯;ë—Bm] %ìÖQkz£×– D,ÒnŽppmĸ³dÕØÊr;EÑj¬»ëç%ÆIÅÛXùB¸ž^|?»þIŠŽ’Ö»ç/ž}]ê”5Þ´{×öà±Ö:‰¯F@d³}N#JóQQ̱fL$À=ÿ€’êœR3ƒÑúæ[½s’ãjJ*nŽËRQöð6‡[‰cEËöìÄsªj¿í¿íŸ¼œ}匮@%RÆ@®­AØíµ~·xúûáåoG@±€NÀÕãt«jMižX£WBë‰ÞÝ9øvxôÁêœçh“PëR4'Œ6®6AK JKkl6Ï~wöå?§$«J‘4·Lʇ+uðwfµÕWÝÓïo…ŠµáúÖZž‹òL UÀAÏ;ï››o)ks^fA¿Í¥úx´,ã—ùzEn“ÛÙ“Ÿ*`¤¶èÍHk ëU› Œ=ã/Tv“UĘÙ<8þjóê÷¤³Ú)«ITõâ´J m_ªº“·›—»zö{Æ_¤P”d{yÛ^>ÅÄЃ¥¯]yëÌÞ‘ÖTÍvë§ÔÖ‰’´[ G°øÌáã`þž±§U!L”…2mIî @iÞA%ÀŸPp—‚·fí1*ÖdDuøa‚ôêf¨XyƒÑmghуǵÙK{xS[Æ%xOñúª×EyK°zÍñM4¾ŽfÏ…è5Ærbº,ñ%UõDIL#µ¾V?Ò[g˜ÔÞ+ÊŸíã¼Õï,žPZc'ÏžbÓTÄÔÎìÕwÍ“Fã €ÊQ{Ý?|nñ;ØnQI>jÎ…ÖÝ»Ícææz“ÕÅw’Ô/¶xiÍÍÁã +AcJ2ºj}i4j4½.‡¥x+­šÛ9 §OÕÆš2:ðg +v€ˆu@up ˜¯ÚŠ0»R´6ºWRóÒŸsÁ†4KñéÁ¦Ü8²OÁPCô‚aÃ%ïNýÑ_;HP^5H­ëôΔh oZG˜ð€òˆÖKÓnæÁ™`æ0‰™b°‘Œ»"´!hãìW@ŸÔq¥ ê"]‘J zMoœKá‘m s³¤GƒŠÔN.aÏhÿ@m]‚ƒ+‰Íaìi!Îêðz‡6lxýwÆ·IÂ|˜e2¸ Ë]•Û¸Þ¢ í­€Ð;ë7Áä™\_R ìmÀ—eèp¯¢h_«;cJo'ÏŽÂô±ÞZk?Nânžö! ¥)Úý4ÂÇ»U 0óm!X!‚¤HUͪÜÇ‘£ÝDE&Œ±Ú<¯¯¿ÍP`¼­,“«¨g_5†gUÖÍãf‘ñ0!Â…néEsú|uý×ÿßÉN7iÌ‚däÃSTŽI0JÙª`¶6‚;ÊbF‰ÒUdˆ(Æè“R=‹L£Œ pÁ!ªM÷‹b²Èg+¢du@“š “ÃìÆWd¹ãgRãb¯êür—ÍÆ›c£v˜Au§}¢µ.{YdbÛÙÄè-Ñ›¸½3ÖèÄ›Ÿˆ~‘Œ} +.ÕÔpi¶O½Á¥Ö8‚©ÑËçUTÆ‚¤Ã9mu(£Å{#1\ÈÍLîjO ×fÿjòø7³ÛßY£Û"çÃ`+B-6eb«¬ šâ½†—j}mwNA-€‘Ǭ1¢ h°TÃJ÷1pV Èžr/ê- +1“¬šßV§´5ÜJa©+¸Ã,á°öU†)ÜϦö…pS–z Ä„Ú ío¸ð(ÃEŸæ¹ÏòL +×8kXå|BðæDŽÚ½âjLjÞO(.LiŽUņѾ𧯽áÓåã?÷†7²Õ3ê‹dEÜG¤²Ø¦í¹Ó¿™œÿ ÕÏ‹l}¿$)'GXûeðMÎ_Ó ÝÛ— ð ”³“c³¸0Žimðƒe©‰#ÐðJýÌîÝæøQ «@ˆ‚Vê‡f÷2‰; D}PïŸ3 +„˜«ª ²¨–( +É’RÂuË´§ýùeªÌï…ø„žÚ‘kÇÂÛ-Ê¿Ü)•iÛ5êÉn–£Ô®t!I)½Ñõ(I|¾S¦¤WÓ‹Ò˜'¼áäQè¯ÊGE&ØÉKœ9ê®_¡J#K˜pw»ÙÑ¡Í)üÜ)(a÷ø»ßÿ¯}òy‚ÚÊi¸>e’'´2ë‚<Ú%ä&D5t âŠR›ñ>½N_æ¢7I`¶œþµÒ8‰O¹0`Tª•»@›À„ÖETâBR-wΞ5V/ÃÙ1ZÄ›°iAlH‡6† bÁ›ÈõCBƒ‘¶ò´‡*íúÁ×öä­9z£õâê „ÞM] q\l¸ƒçF÷VŠN¤Ú ë-ã c3T…r’'µvb´o÷Ž (ªwÇqev­Æ!ˆ–ŠÜ£¼MIæÜì\YíË"aÓb¸ºxÇ:#L´Hxqåz£}6³Äy{eAòçÎÇs’l˜ÖËÄ>ˆ+Ãxå0ɸ’`Jè#€Ó"Wß))Ô!´‘ÙºƒåH#ÜÍŒHMÜ=ÐIãú¢æ$œ½r‡ ¥õäýßlnKX³ª2 ìi^hìcVŽö =38€¡©¶Î7ÞIJJû@µ@a[ž·&6„„­­Æ‰U?bŒ„úNûXÚ^ßÎ`{Yf¿¬UÕ!ôLHÒÌ`ýøt+'îd °D¹0êà7!ÞöJÊ£œTzZç1 ÿnN¬°ÀÑ]˜URiae \°Ñ¹Œf¯Rˆ–Ãl¸¡|K ˜ËTr+‰êb0G¸àÏv«ID¯ Ñ[(á’³F%2ØÎHû%“±f%¡Îx„5‡fMÓL¡ŸŽ¶ÆB°êçì…ּĴa™‹0¹N[%ÚÔço¬þ“ŠÔ/ríÓD„n¢jeB¿"Õ ½þ°ŽêtD=|Ô€Í2¼KELWã ÖŤˆóÇjû¸±|ãMžƒ¶A¥:­w8£]_t^³Wõ †ÌiµUᥢգ1´ÖjU!¨JÀÈs• +ë¥Ê«w¬ÆFrƤÚæ@°i0z%tu4Ož¶Y«y¡5˜¸–Ù ”3cÕƦ,ÖÁ‹±€aô Ñ í¬€# +”ö€±ºÚYrÁ1$#ª¶¥úA’tþôQÐjŸ³öxj¿,‚Œ§ß=|ß;ú¦"·Š¬ç ® )Êœª QÕÒ˜138}?öró×zõÅ[P‰>ÊÒn†ôÜvŠ +­uµú2ýÑWÆÅ¡Ì)¸à…½Š¶Sà+l@*Ý, êìaU‘öRë\FÔÚNž…ä‚&Ë +ïÐΆÐ&¨<ý £ww²Ô~^(’Þƒ$ I˜ŒžYÃg‡oþÕ³ßü÷Áèåƒ$SÀ¬nïäx ã½B|™=©kÓåkÎ&mtø¥™Ú>j'¨¨(J9Z=þáÛ¿ùŸóàªÄvIhÆÔê=å½5ÇÇj5TnWÄ:†\(pñ9 ΀LJłÔN“0‹T»”kçiÂ]#=ÐT ‹¤pôJ›}Ðù Æ \D=o|ÇpüNž®•Ùë„|¡¼ÇºC¥µ‰¯þíܲ +Fƒ6ZˆvãŸØÝ „‹J”#Ú#Îèæy'S΢B4åè°¹~GYÃå$•QÛ‚ÑÉ£jÕp¹)Eöè™Ö»®Èd\dÙ]Z`ÒTÔè©y P©6»rŒË‡ wüÔì]æ ’Ü(ïmÀ»-]•DéO^Sö7z\¸ÚÅ_îc%ÂQ¶ª$‹,øqx_@þpúÂhSåFã pÙ1`€Ú”!ãÆÆÍŸüzýâwNuÓÙÙ)ˆí¡Ô8†…ÆÕ!©ô)­—# HÞIÁT\Q@Å•!”>¦ö +LðÙ.²e¶òü.¢%P³¢ñ 0ÃúØÜàR+ƒšjí”ÐÁ¥6Š”›®¨öËU\êAˆBÆy³—‹—Ý9ÿ¡¾þBm^¤ªî§{ÂÄBëa’*‘.ð‹Þ:mÌ_«Ñ!¡å!ãæ¿2' Í +|‹mßt/~¸ýñŸ¾üùŸ¿û]–ö*`ÄÔ®ö9oQâë ™Õè@ Öœ¿À~·÷«v +ÈTh“æ â$C»µ]üèô‹\|Š8ŽC¡AéRïX¤/&5¬ú¦³| A˜¡|R磻® (cA[KC(€!_'ä Fd›ÒÂImù6Z½%†t«p^2 LüiE‰ Šl SÀ,‰þø÷aŽÞ-ФÒ@Ũć¸> ivŸ³/aDÉ’¸“¦°˜7ëq¥ ½ƒÛ#Ú_ Ñë-rŒ“¨œ?•›ÇÍÍáúéÌ+ + [þ„iMTm‘•Å†X;®­¿©¯¿¸ØÊR‰²ŒJM„Ë‚îB¤.¡J¬. ýçûh¢Àæ15U*ñg‹CÂ!R ´œÍËbÀ9òÊè=Ñã—SÊê€.‰5)˜yýó,i`ÖZçbm Z«ÄDɲ¶g2¨ +ì_ÀÍ϶Ë%Ú½gÏòlcÑwu·(¡?ÈРLJl:„2Æœ·¦­¬Ë^IÜÍÇ°ó(C§ãbÊ^TúÇ2g”:R¢“,åóÁRªm€ÙÁœ>ÈóÛE£"8{d6×fsµ›‡iŒ€4aYwKÊNICµ.Ìù`­7Ï‹€¯AËií+½q,¹cZ¬¥¹(´!¶AQ'q{·¢Á-Cº’¿pOìñs¾u^Ñ'i°åøÚ€<éƒ`àjgLpH»+XàeˆÆ²Ð€IãÖÇG›4p«Ü‚ÕÌ€,:$¸l\í‚T.Bd±²m.Þ­^þëæù¨2€ƒÙ•$€Þ‚nñµ¾Ï¹Ú¦ +Ô/အôƤ6¦t0y(gRãFïÜT•î~$ M^ºƒg|pXà@´÷Yg †…³Û%Œ4½õgou˜eB°¨€Ïð‰Z[!¬]•jb°˜œ·¾ý 6˜gX/M[œ7áüU†òŠ€ZßèÝZ£Wbí,Ï„²d>‰¯à嚶”»ÁŒ ˆ=Ѧ—`öÇoüÅ ÒÝ”è§^b\Ö”X·@ƒÑåpÕ<ø²uø¾µyȺ ‹’HNÛ96Y†ç„B0Cø0U‘·3ô~A€À® +µÏØN^¦àÝe8‘eƒG~Œ!i—+_Ò£ì•ä)¶HXL@ ëEÒÇ¥mÅW>ÄŸ!¢NŽ®ú™½Ç0Ò‡YSºÞðÖ½jGEÚ}»U`ö’[ùŠöù–Å]op½~öC8\5€’âεú1P3hx>< o»Gß—ÄNUa•J?My»ˆ²[–1©YßN~5ºú9X½OâîN|„\ C`·’ÔªèC>:…(Õ:—`:@’Aúì”T˪ԑ£sj°”‰ª쳇Èé?âÕÇïzRL%ÔŽ­íÎJm€ïö‡ÏäRµQd@öµÎ æLqwf ž ÿν̂ü( +ûE®DY’37š—¤9á ŒWò— Û@秪0«:ôÊê]ŠÑz‚©ƒªÜ—‚5eôó\­(¶YwU_¿–_ðáQUé;&µ–è­öA´¸åkÁüUçä›Îé¯ ™âö®ÂÙkÌZ”¥mM(pF +¤‰—¬ðeVÿ ¾þjþì¯ÅÖ€@ÌVb“µ&ŒÕ£¬–Ñ;êg„±D•ø I‰‹öJŒ%›„\Ã6©v "Ÿµf¬1IUŒ­›ÅL„­e0à¾(ƒ÷—Œ9¥ý Eþr»ÄéñIž"؈ ÖÞèI}þŠw§© +_ 5«¹¶[§Ÿîaþ`oS rä&÷@.öîyRþ+õӸ첳.²­4êIÞ!¸ì4f=H’yÒ…ð(‰= ¿ ì•G)ªJ{¬Þ"´6¢t¨ð¨qô«ÉõOÞð™àÌ!•¤`Þ=úxs XÒ?’gÀI‚HÀĦß=†—Ñäæ6QuáÈiÜòzTäR”…¨}¹}팟É3p4Œ—úÀÔÁ dw]UÇðû¢$Q­Èñ÷º—ZÿÆèßpμ<€?Ì3¬ç.yÿ¼9çŒ9Xµ¥-ÖŸG‹£«ï—¯ÿß8Ý­è 'Rˆ(Y]ZkåI+…ªÀ5jëBo]IÁf7ÏìØøô é€5 íA Ӕƙ\ŸÇ×9ÈmÊY€}“k‡ˆÒ·ÅǼ¿¢õ.m´9»§wOÃå³åÓŸfOÿÜ?+˃S£ Ð9+LiâúDOâʞ͓ŠÞO3 ¶Å +ç«Ñʈ¯×=©š’5Óšgbx|JÛýöæE|ž„ðá–"<Òœƒ9-sõííæ(„sœÎ±Ñ>•g©›#à ÁÙP"XåøŽØÐÇBtˆ£"ÓØ)¦É ~}˜'¬¸ÜW³ ò'Ï´æ)Û®CÚ6§·Š7ÿ“Ïs0QJýÀ>›×´5ÍAd&©TÕÈÙÓåæ©@ðoC¨#5Œ??I”• +WÕX—Ʋ2rA˜c¼ƒŸF^ oôú!¥ ¹[kvû°¿yY$,@Ô íÅnÏÒL´W5³L”g"Z€È©.« 5©¯¾—¥"x‹­’PQ;¨>,Ë­œ¢ÖØ¿ê^ýÁY~‰#H(€ôW3šçõÅ{¡qêÓ,[OÇ×®4!ŒKÌÛ3àS˜FÐrŒ=†|¯”Ä °ù„>°ñ—¯AfH§½~U_ÞpÁ ªwª*àØ¡vZCJk¥p-‰ÊB|y€±hÉŠ‘AítÕ¨òñǨÖàìöàì+©y‚Uû€$€«Â£íÌrL _úU;T;W¬»È3.ØF„÷o$‡Îé‚Ø£Üe÷ä×zïz‹Jí,¦qþÕÚ9Ö/ð¡Ú9™]ÿ0<ûÖl°Z"÷µÕÌœ@BåèØÎ?h¬ÞšÝ“4ªe«F™©CpB¶âö<ÃÔ YvK©µõúªÀù´³$¬÷0ÁÕ*¶e• ªIêÄ_㛤±$­µB|º%™6G Þ÷*fExóæì­?{²äAšy¢>À|Æ Ï7J ‡í¹R?‡°'Õ>€ç£,D¬ +Ö/1V;Áƒ”)?‹Å› |W‰²¾WP²DH“1†ñw7”fžrfh€YÀ[ÁSÆ "Ôr¸íu齃ëi.HÆ_ën¢ÆŒ4FëÄ©uˆcÂ¼í¢žÁaâ oôÞeEë‚ò$í1í,jóx+r}t›çšû¨•gÃB¼¡AT•[ÐC68ãk׬Ç)s>©–öŒöÕøêÏíñ-¬ò´¿WQa!ÊXr#…[ W¬ÁËhñ^nã­!Ð'UÐWæ Ç»ˆ¥}±© +S›Ÿ%‰GYr° ÀÖã…z†«aÆPnaÖøQAFøfw3˜W•ZU¹ /DZٿ­h£­²’‚¤nkÇà•ÚJôO\ÉXÍCÚ™0Þ<»[%p^6@ Èò i죊Þ:œ¾[>ýÑì_$0 TDŽpdoáõ/ãÏ1…¦Ö8µº×ñ5êµ£’ð‹­\Õ)sY“ãëltnŽÞ†ë¸©÷s¤ó Må‚D]–°·süÃ4Ž ïÍãËéÀ\¼¤AÜG] ‰‡%–BH©ÊÁÞš²F9.Ìñ]<Ü­z˜6foœÞy‘v‹”£wNÇ¿:|ù7îð),ÓV^Üôãêbp ±W1h{vöþß·Î~C8 Ðê»y‰1§Áðäìõgé_î`±Û{ò×ÃëßÈÑôæ2û)ÔLa.HÌ(ûòò›ÿFïaÍÍìêDzÜFõ~E惡2È6.8 Œ~\š qs->4~л7ˆÐ TaÑ-’T¸]õJBOŽ®Üá;1:Û)))ÌŠ¿9ymôŸ•µÞ>aíW5RngIûQŽÙÊ1e6ÔÛíÑKÆ[%qãaŽ+Ð>Üåø,PÞÒ¿_ÿ¾uúß8KQ0¡ôˆ±•÷ã‹Õ£’ÐRš—›××8øa#ºÃ'Öà™–„Ú.ªï¢cŽµÚa‘‰Á³,´pm`÷[ý§E±Ÿ‡á?â€ÞE¤FQ¨øXTéJ'¶BˆZd#!Þø"Þüî&\<bÉTäa¤Æ¹;}möo²¤¿w b5“e)‡k\ßÉÐÛYájrp †p»EbÃl‚˜ßÉ Œ½ê]þFé\qî†Ô'ñœøÓúð¸H©¿Ü¯Tõ)žƒ×õ¯¸`£þÝFSˆá„[cû :99¶FX0{W„ÚMáŽ7y±yõw­Ãï”öõ^Õÿßÿ™´ñÿßøÿªÝ䮵ûܵv?»Öîr×Úý@îZ»È]k÷¹kí~ w­Ý䮵ûܵv?»Öîr×Úý@îZ»È]k÷¹kí~ w­Ý䮵ûܵv?»Öîr×Úý@îZ»È]k÷¹kí~ w­Ý䮵ûܵv?»Öîr×Úý@îZ»È]k÷¹kí~ w­Ý䮵ûܵv?»Öîr×Úý@îZ»È]k÷¹kí~ w­Ý䮵ûܵv?»Öîr×Úý@îZ»È]k÷¹kí~ w­Ý䮵ûܵv?»ÖÆÿë?“æmý3iÿåþ¾z2W&W“OÚÆ'û¢‰Žà~4¹¼Z\|â}²?*ŠWÊÁìêàôdrñt‹‚‡J¤ºUŒ“£­ÔŸ¹OÚò/V'ð`m69Z¤·rðTþÿ¤—ˆ+]\_®ƒÉ¼ääJ xÍÿíáTãädr¼˜o}|t ÞB4ýIiK„ÿÛ7ñ/‹O®áŸòVéãí§pÇ‚_6ðÐÍV¹´ånõ¥­yüüè“íàhAýñ׃û?ç2•Ž{ªRTf‹H—¶ÚÞ'½­üÇÙü8ø—ÿ¬?D¥PÁñ2¶5ØBJeaýÿö5ñŸÿãëþã¿ÄVzZÆ?vººõñŸìïìgÔV!‘ò'm󿨈,içSZ¸ÖÁåVEh¹ª kŠ*]„«ý±ô·è-hkLýf('CÆÅ4±^EÊ¡Ô&kähÉ ÒžáÖ´ªi÷ K¹{Ef/OæP•j´3âÃ&Üî²jób”ÄM)˜0ΠÌ×Xg)GGZë3Æe¾ÛsDîæé ™ˆÔÆô!a åÆQQno•¤¸n³P‡Î§ªz‰ 9gª·ÎØ`‰™ƒ4e—„¨À{¨VOZUm*­S­÷Äœ¼aë§%¹aý4å¨{üLí])­s³ËDï§(Óz¹•gü}TÛ/‰Ò(³®ÔQ¥¹Wὡ•"Ý4ée™ ¢t cU¹EêýªÜ.‹»s£6.JR/Iº»m¿ªg)Gô¬=NãzÕh}ÈÚSLîf0'‰hÊeô¾Û½„w,1>©öeõQ†É`vŽôò¤—£\cƤª+JÑ’¨•§‚[+³5BÀ¡ò¤_ÚÂÝCd˜±<fI7K8Œ1â¬i‰«å©p¯j~žad˜¢¸_Ë´‹òsˆ™ID.’ÖNŽþ,‰î”„fÀË3„W:×(Ða²¢Ã* j7G¹;9&ƒûeu'/¨•û¡‹+CÊœÒæ¨9yb´Ò¨\dk´5kŒ;I¡zªoá#L׸$u’¸›¬¸Ò•ÃµèÎÊ”§„+\ïf/‰E6$Í)eÍ0±.¹ý"î—E<.ŽzD9U}Š³ªÒ‹ z µtU)ó!®Ác±qÂø°ŽÃ ËÔ8¼ùópzSä‚"pþƽUÛOQm”c£L\6ÓÎV7Òx\¸£,6áOy¶žgjûm§×âËf\›Hk¸¨,µ9möŸÕf¯Fçß%?C›Œ;S:WîüÚ{‚ÚsÔÚ`uñëÎÑûœPKb†‹÷ÖðjÎQsZàj0“yÊ+1üc¹..ƒI:°[9v'Ïǵa¥6ÌvYíæùFo¸fQì”åfòc!T§É¸„l·Ó¸•¬Æɲ¸YáÃí¤1=‰¨Ùª™ƒ?!R™®ùí «y +qµ¦÷‹Òv–}$ˆš‡(’z„1+‹ƒ×aŒg--OºE&¬Jˆ"ÃoúD  lðiÿ³D"“Ò‚³à­yö>O‘‰’šÅâÍ?ݯlgÈ2é`rW6z”¡¡EÚß- +ûˆ 3!ü’‘ƈ҂ÐÄìE‘ Sˆ”ÅŒm˜„W¢Cµ~®7¯Ôú%©¬ÆéËÿ8¹øêOeYoWYœÜâÖ8‰“(Èî~U÷ÆFMHÞŸsΤÊGߘ~àƒY7¶J*4ÍÞ­Ö}Rëç&JÒÇúHsDløFŽkVõ‰KÆšHKpÆVÿ’¯-«zÕ°¾¤=—ëGýÃ/¥h]â\nKµ¡qŽê“<]¤‚)*±A–´¶ +ì^Y‚pCÄNm¡ò°Ì·P)ÞC=‰ª`j#ÇzE±!7ΛïÛÇ¿ŠÖ¯ò¢* >˜³Ñ’ŽVUs"·®kówNÿqgùÊê§ãÒ:¬»hoUVUcć­Sú0®¡Z”vËÊnY- q‘TE{"÷ŠR™«A$ïaæ.ádùvQ"ò˜¯_””ÖNY„yfýM³vJÊçY>‰š°²LÏ‘6ÀüÌSn5÷óÂN–ÛÍ 9̬ ¥õ·²,<þ0Eme˜GY:…Ye±Í¸„¹"…èŸî&ƒ»˜ÔŽkʱµS¯ÊCD°ÞÆèÜ RëÓ¶•gqªR  ºÄÃÝO÷ÐO÷ª‰’P$œªØ/ Ý,äp“G¬>¬ ÕÖN‘ß*ª{á›0XXТ<*°!ÂúEÚ{˜&SˆRf"RÀªB‡Túdèì5,ñ½•£ì¡Ö<†Ëî [/òýŠ +ÈŸþ8ˆÔ,µl\[,­ñpóÀØ°,Ô‰¸nɼ(´v*ê~U‹ 9S)\ÆÕ3Ì>¢´+Z¿$¶Q¥_`ÂtUÓë›pþ\¬­ÔÆŠ‹¨Þ£Ý®ág˜Wh:ís.˜m—…=D)1uÆ^T¤nY€d¬'P#EX ?LÛGÍ4Ú”uHX»_äjU©„E=Êf¼‰¾Ü¾âêG%¥­4O•Æ!包`†9sðtpòc¸x‡È­n&P ƈú Çî" +ï®á+£ó$®fŽâB©4Àx:°¨Û%)»s”ð )°^–«Ä^YÆJi=%‹«aŸ2þÁ^Eß.Ê;Eµ*¶‘x“x;O»%¶8SŒçÄØJÓiDK!ê~AØÎqʯðÍdÅØ΋»E%‰è#Ÿîc»E1Kù„>Jàö~ÅLTÌd8&aXˆkLu!l’„ - -LŸª¤ÇGh D‚ÀÎÄC·+l­DRÔ~IÙË Ÿïãy"‚i„„èËà>!uôp%{S颼{e%…še±K9ÇJã\Vi<ƽÝ<·c$ªS$Ê×ÃÞë.‹Rw?“Á%Àg\íQ2Þ/ð­ß`­)¥¶²‘Èš á±z·Äx’3«ÍßØZ†°r”‡ª¸HèµÉÅ{+£sV¢‡E!GÃÁ´1!–ƒ% Ó<ùöÇ·¸ý1'9ÎCÍåB°YÝÇîð nÄ Ų„Wº¤µæ .Ê2{E%Uu!\ãjÕH2÷AžÙA$è-ë¬qmT;0íÑ –aòÓ˜8ó0Míä„œ˜©:º‘*ƒR‹¤÷(Cþr¿òy’ÚŠ Á3q™Çˆ=ÂM–U`¢"W‡¸%­9„ +¦ *hlÿQšøl¯’EáUávIxPä%\î5§¯w‹€™!hÀv%¡Ã8³ûÔê<qEIÛ<0Ú§¨Ö¯Èˆv¥!ºSÐœÎè6…9¬Ù§ôn†tà(}1àŒ^êsÒYÌì2 $¶ÅèÐì]6—¯žóo:'o bDX#Ú_ÓþXÒžrᦪ A¿ep8E@}ú”…Wâ:®¿loÞ'É M†¹G›cÖ™QÎ\oœDÃ'¼7ϱªtP%®ä©¶®ìÑs6X©Íã'_þ­18XAU!›œ9(v@Tˆd@€,Àï»%©H:qåk +8ÚªÜa ±[äw \¢¬ƒlÀ”!À¦Ý½‰ ¼çyˆ“ðÞˆ«—S+CT7ßÉ‘á£<÷ ïä™DYÌ`FUh° ”>)÷}’#À¨ªÒÝÎKûˆ²[v‹RŽpU};Ï>L`YÌÞ+(ÓÜVNÍ@ê¸AØìUÔ¸H/ßHô•{à5 Ìàå¡ËÝDÅØ/Éû€B úŸA]»1Q”%?ObA2€Bpäø'ô!š?¨ÐzüuñAÞ#b«"ÁÜvJl˜(É«ÐI„ +”ó0ÏAV¤ÖÇbæîN‹-!€$߀µ ­•=xÌ¿‚ !·XµÙ_¾¨ÍŸýaZ×û¬;ÑêÞàšõç ?x{ÌZq98½q¦Ô/•úœ +µóŠÚ@£¤¶7¼Jà:¨ñªÔõF/«/ÚÇ_7¿"ƒ)˜ÍúâÜ:O1Q^hV”žÒ<7zOÁ¬ÑκÄØã¸Ø#áô¡rGiœÇÍå— ÈÓL«,K "ä¡õ ‚pÍyËŠÜö„‰%!Èþ²ÐP›g̓÷RëL¨ÚÃë_ÛE´²Ð„ð'²S‘S¸jÔFqiÔÚÊñ¤ØÔë‡e±±Uà€›± (Dhã<êmÃLƒˆ^ @?G©f ð«T¸ý Ëm¤$nÃ[ÀÝ,äˆún).%Êg+Ë€Œñk +-ޜڭKJŸ¦07܇{ßB¸&¨ÖnƒÈßÎs@š¹êÞ"…h%&J”b¤«@‹`Á$Ö“ñs|\B‚ôC$pÎœPcšÁ­ªØâœÌažòw B¢¬ä 7/ATŽ¨ÛÍ‹€„yÂ4{˜a€|ˆ·<`©oT¤#u2Úp§,?H“Ø£$•Á, cÚín˜´T£CÆ›î¡ +"Ö0­ËysÒ‘δ¤ö +RKižµ¿‘[§`¯ªÆ¸¢öY%ÖÏØð˜vÀnÃóӤђ¥\ÚYµ Ê;*ëÓŠ>½½WÕ lDš#Dj€Y­ @Zd›bpŠõTU¥­QœP/Éí’ÒÏ ŽUô7fû*M9)ÂÌ1^Žñák÷¨ o—`(ZíkÑAÒ0EÀrÀñ«JLw²¨&‹rp`u&±$¢TÅëÐÖ¡ «\{/Îbd̃ õY +ÿe¢šª‚Ghg à…`ËNQ? ‘ÖæœÒ`F’¨“B-0„:Ä “ŒÏ*˜+Tj—ù:¬(^øçàâ÷J°ˆ`·s˜YaÈGXqX€ˆ$ªÁ”&+ÚµÛÈ!`Úƒ4 oÂÎàæËÓmD°óT3ìNÿÈtµx%Ê‹–Ü.N”e0þ»>O˜iTÝÉQ´\ãí0õ^YÛ-©3<-„©%ù϶³%ÒÁ„F¬}Õ܆À(I©ŠJ(Þ?Jbægi|·,aR 0'® Jy’äV–Û/«ÿb'÷ î•D0¼e&LÅGI’b¯(—c´©IÞ€÷QŽý,‰ÿb‰ñ7¡Fýíø\ŸM(õD™{,=ØÏ?L”Ó•TzàidËœl÷ãB¯( «ë=¡¶W +”Iõýª +üÃOct~a¬ ªuÓU™u‡e©ž%HDÞGuiVÿã.®¡4“¤ž¬ÆUd“UáCµq$EÎk½³ªÑ¯(]Üœä¹fŠòó€xƒgöøyQh`Jt8;ÜYd¹Z’ò€%Õæ¥Ö»ÂÔ.è4Ò_$kÑ·J2X6X­~B ”?k’¸µ•—öÊ*¢á©Ñ±Ý½Æô^Õ½Á%Œ·n‘wQ RêõÙ›hýMÕš‚½R‡E>H¡ ¿çõV•‚àÿ›ÐQ+nòÀh Èwû†o}ï1(#p¬­Ä„)û†mÃF\"Øûa+R8â!F²s‘\ïà¨yÜèrûE7¶ø€-’Á#;°¨ZZ²bª‹ÙýQƒÊ²`ŸH +à< ĘU0yþÿ/6÷réþORK46Ý|j¿ÎwØL†Bxn>*¬ƒá¡Õæê6lÔFYQÅ ÖÿÆõ,@ U¢ééúÊE$T>leÆ]"d@'•fbÓéî…PeÇJ÷]˜ÒcŠ ‚ñs‹E":(n²™ImÍm]e’¯Œ¹Æl<8^ÈqE<Ôvq ¨hy]i`ƒÁH@ºgN†¤Ò%uãZ¦³çàÕ¯ aŽR +õ™tûh²{ + Ué@)ßÝu3_6ïu8ˆŒô…UÚ XÐ&Â`pߨm@ïµà¦[¹Ðn%Q,­6t¸,?<éÁ‰Iv<éëµ MƒCøÕÇmöc.Ð .P7°µ.&gDCzT4ƒŒöùDgg!mCB§›<2(ˆñÆ ¼uX, +q ²[ÿ‹¯ÍŒÞλð¬<œXÄ ‚FZé¾õ?"-,:¨Ø´ÚÁŠj`œÀSåÂؘ‚‚R±a#ï ƒK*Ú‘óKn©Ï9ý¯ä]Œ‹‰Ë©i› ïç¡[,djë'®<¯¯2ø=xÝþ!ôÃVÚÍÕÈè îpÙ›7y£„\AáWàsÁ¥ƒw¢Õö¸‡?8ár±àuƒO´Ñ1+­ÙH5™›;}ùi½OÜ7j·¢^kÚ uÄÆ2à·Ž”jŒÚÿ²Yг/`ô4|üm_ïd.\Ÿ?~ŸÞ: GͨÁÖâ‹XÐ(È߸CàÕFwõÎDcë+Ãöý#¶!ƒ× cƒ¶5ÍX ðiÆ£àëÀG9%Hj‡õ^@‚Ù$¤2«Ô=|rÐJbOî×!#  n¥“>:Iˆx‚SÄhÔó §!Û¸•4»eˆlŸ]0ÆÐæÃ&lÄŒYè9Ò"(!¦H9\ÔŸ©ÎspÔ5dÄaFyÔÎ [©}ã™ ä*põ?еél´ƒÈºè °4 ëìW&Rs°© D> P'4*Ú•ÖÄÒŸ²°é17Ð]°Æíôv°i0ê&ç•›f*ËÄfµæjÌÉ}½›‡uwÈ:¤¿ À}`ÂuÛ˜õЄËãÔ¦ÅÌœ˜hÓ â‚òÐ5Î:û°…€¥ ‚MD¬¸ù‚ A‡ø3b#L·¶P½<$£¢Ÿ“Kë‡}Ç o;¨s Nxõ^(„OÊцG(Lxƒ7?frðsC„B@_ë³<E7ù£òÐè2fvp6ÖŽ*R¬=jƒZÈ&x[¯4Öu"`[ç ÙÉ8t“ Uö ™‡&P‹;`põ¿y¬£6ÇrzhRbr²”±Ñ70Âl’³¿ñ¡ïY ¡¼üþQû Þ7 ïç R$ìJc6nÔD‘\áÀ Ð4¨óõ?Ý€Àx`Ü;d"÷¬ÂŒ8“7⦲àU&œò¨…1´” 7h=¤cy¢(hM°ær/x×_ÎA®6b1#–´Òy>±*ïqÙe+sÑ  Ž ¯yË(TÕ2“vÂNNç¼\å3>©Â§imÆB%,”ƒË:¹,ð!ô5¦-1¹<>ÿeðE¬dÒÆÀ¬£#. + ‡É† ÛxdÒJ¤& DÛhXRÛ¡qOÿ7ªyøŠ‡/[n ‚ÉÞÊàŒ•ˆº„´™ŒÚúÜ•¶øã@†zW¿-(Eçf!zÅ +nÛ¨´±¿S iKu±ýCy0#Ha.*ë•jv"å Ð/ §:+>l÷b:èòÁOÂÊ8èT‹ÖF ökê?¬Gt¾!3­ó†-DÚÉ >MïÓtá +:kVb/Äm;•6 a'™$C-X}½Ïê Xœü¸‰˜°q^¦`ökf_Tï–û€!"lxÜF¤Ü\ž·H¹2b vqÔDþó€éöï±G:ïq‚غµeiA”Ã&JYÃLîõ@6±r#VA絉 +Yè>»7Œ +ö <áa½2nENÔ¹ý£î£î!vۨ럇ì`ÉtaÔÆB †MDÿ˜‡Ù;€¸ˆ3£³‰N21fgAgAÈ {™<­´-~€0)9Õ3ãáþwx¡Ô¤b rv˯t ôÐéB¼ç…!Ùui“Âä2lzؘü!3…Pé@rf̳¨ DF»Ñú1.µh&þµç•k£v^ç™ô®Í[˜ ËN¥uŠN.D íýýµ†UFìœ @BD„"Èüž U'¼d77ÐlA!ã—ÜlÈÖNCböÙqU“?¡÷†Œ~…ñsY;©¿éœœ/PöÊ}½uÞ +Îá¥NMô™“3õw‘„lÉtÄ& šHDWs`ÌÁÄ) ÁZhX:CÿxŽ +Z9jö ;ÀÊÁ؇9cΠOj°±*Òs3—·bÊA½òé°ušxÙ$lèœÅÍ#T|`Üu`Ø>¬Ç¦D-€­Þ%ƒÙ0!á¡þÑPʼn'MÅîÓNÿppâ÷ë†ô>ÆWÛÿéeP¯¿ƒ NlØš|Ñ#qۨ׆'ͨjF6,ÅEÁv±L bö†nqî¶P'¢‰8°”ݧGA eÜ?æ·²tdZï°‰€ø 0¶@X}äALû_.(&_dÀD‚=€U…Õ0Óu蘕õñe2Úu“Y'“q1Y#s ~Àà°x¹xÏÍ¥uNÁ„*¤¯P­ X\„ÍRÕ(š¼FD°Qª[Ì:„þV‘O,’án™ðþ–ŠÅ¯Œ»¹Ã|ÈB€Å2¡Q·X± %“O+W¶ ½c#naØÆö< \®8pSÁ¡[3 +%§F@‚m’Ê£RÕA&Œ³`@£.29¹x±µ|A Ä€ ’¸àÄ0r´åð‡ÖCLJìÔm®CfÜÍæèè$ð*®´õÉËD“‡ X  bÁ4pÚ€Sÿ¸eñ!õ2`#vÆ es>¶`ÇR:g|¸Å1ù!š˜Y'‘4÷3f`Ü´ +îH8¹€²±a“×ⓇmÔ˜8lpÒ9 ­^ÙOª¤Ù?bÃo¥ÇÌà¦ü`¨tÞ½ Š%CŸBÝ&WЃ§=Tè§u6îŸÌû;õ}g~ÛaǨ‘í­·ÃOÖèU±fô©£Éà‹Ž»CVaÀÌÛx€¨nƒlAR€˜|-Œ8G ¨Þ)öúYèqgíŸáÀ˜@ß9¶¡a(Ð!#ù–eÀ «†aÛ8 7³/T3hD#CF²¯Ñˆ]`ùˆ6fÈž¾ð dä>`!Æ\}C9̪L¹…â°‚njˆ&`'0l÷6â!Ÿ +ZÏ#fo3 Þ*—P1ü?î@;O¸C¯65`DöZ‡ HvÜJ묌œ¶™·ïr~åaÄ„ÁõvÁ…ª>>ArÌ tÒÏ'o©s?œÂGï—¯R5þÕCû[¢nÈ雈‚$¢âêA#¶_ïvˆz_ÿP̭힪Q¤b˜ÿ<¨©5¹ƒƒ˜ð˜©3T™Ø7ê€î³ªÕ¨ ]¦ÑäWÁTCÈÒ!RßÐIê/»·OY`¼ÁÝõÉÍD‘ŽÝ::m—ãÑ!'?ÒïÜà+Üâ  ‡¤ÏF›bz–Ñz&LÓ¹ã?uNÊ€P PUŒ/ ±i'›vñƒfJNÎy8èkš}¤d „‘€× θ¨Ø„Øè`s`Ý­Dd‚䈓sŠðëa0fèqÀŒ |ƒàí"¡¡ê8n£ÀdB#Xð¨“ÍP±6¡4ìDÆ×€ån±è½$è…p +¬ ôÀë}*Xâ1+aF"Þ.ËbÅ“^®è!SýHâä CÁT€@ ‰!#1bá 5 Œ‡S½Dcó60·}XÆôîà€2óÃVAïÄʇ&üƒ:ôиop1‘Ç}ÆmpŠ(ŸÄ‚å6õϦ#÷8ëÁ#1†¥æ‡-äÁ dÔBŒ|`Ô÷YÀÅA–¬êR01ç$Ãÿthô+uã0<=:d † $´óˆ•sí+‡tƒ:DƒÑþ:jóÇ€Û± V h|ŸÎ?dëŸ[5r+;ÒùÆû«qOëoHÙx`?'5:¸}Cöþ©eo·Ü?¿Ëö9_ äbÓ`,XÔNg@‘K&èY¹€G~¥6bçáLâ ’ðèïFÙø~ïë|ð>ò¸WÒ“÷GàýŠ‹éo_ú¸4,á¨Ø™¬‡ËzØ4&­xÒ"§u½|bš‹N 9¸ÃðÌ‘lë"dL^Ñâ Úè~×ØGqÒiT.€mcog2£®À#uÈH“÷À›PI`ox{:Èe+ÿê˜sÿ˜²‰‹¹˜Œ“ÉZÉ´ÊÙø;Ø?P^­vD«õÚ.¶¼3ÍF½ý>`$HÈÚß`M—6#ÐD*´Õ¸†8fôÅP±FÈ5ˆÀê}bïS,„q«áb’D¨‚…k·M`ù„Ài‡'Pƒ;dôÆôÞ˜…ìŸj¢sõv`0jÿ¨gÿˆ„ìÖ;Pcª(t  lZo'‡ ~£;ø?lôF€¤6¢÷ýþѯÒê[_”ÃP}Ÿp¯3 ŒÙÝþ0¸;°Ù`ò!­ô•CèïXMxaÊýýD= +yßà +¼tkR +Ñ=4X3Â:¸„q;;datˆ©Ö¨úÃõHu™M÷ ±‰®/Ts$¢ 9¿máó+¾`ÕNi64 $»^¹ ,ábÁi$±p•Pj^9Ok°ò)<\å3Óh¨ðƒÏbS3áÒj ?OÇ».±èds¬: ÆŠPS4XÆÕhyÕ,qÕÎæ<éâjÏnÙ¹<誊™­qéy!·ê T-TÒ+WÜT!)53¥ZHÕ€)v&OÃÂe*ÖáRst|°êå +®>e%ô¾ˆ•JS8Å1·ñÐJj£.Áäê8¼?)>ïé +N: z­G¤ 7çåÒÀç" xù<§MÒj <¡›Ëz¥‚‰Œ"á1Þ0Ai]BmÙ˜äa ^xÛ¸SÈ;Å"mÒñI·Tpñ@¼šƒ‰™ñˆ•ŒÁ’ѶW*Ã0lÚ‚«àHÐà-^ÙiÂ+#Ðk|b¯‹ÍÀÊ;è´•HŒ{|®'/± ŸPd•„¸~h=€œÁ‡´ˆ +y6Ö”rS\²MkÕää›èA¢7 ªG,y¥š“ƒŒ“—Ôš¨µ\ZEüá*àgÐÂÂ,`: jf¤ ÚàáéhÉ‚…<¬†ÊyP„MD¦°Pþâæâ‡-rë„|O¿@u!7ƒFLrJÌÎbÑ)!r†T«‘úšÒÜ$bM\©ÐJ)Û;‚Gêv:……*0BJ6¨ø#U°).&;Û€43™4ò©iÀ•œŸ— +KÞP ´|RÉIEìdÄŒ«h Â%»lb’ŒµÍt¢?HÓ+..ªõ`a1\\NÖc*T Va²`&!q8¨¸Î-÷ƒ7a*x`s³iT* ÉY<Ò@*—˜DäœW|ÁŠ?TÆ!µIX¨PiEÊͳ©®CÊ :£_õ‰ðü:©uá§Â3ùäTzòh°¼ìµÄÜ‚”‡é,±N¨¼,e{€.Ÿ”RJ3±Æš”6cªƒNõsiË”Rµ“ÑQ$bÀžˆ´ýáð|:­uú—‡pIÀ§™PLšV;‰æŽÖÜñ*@5ÐÝÐG윑œTŒV›JcMmmçfO´w®FúO+#Á’‹/Œ{@€ +¾@…×&SpeˆM‚èLxÁgŠv¿â2àŽ<"PAQÊÌ„ËKRv†ŽV ˆ J†Àö–þ)j9&Þå3S~ÀCw[s²ß2„ÚÀb2Þã3³ÑúºÖÞ¢bJ-I¹Ÿâ²SRêØ’ s$`I©úB%÷HY_°oÉ„Ìl¤´V]8_]:.-2‰.ªÔÑP™·¸D'TYŠ[±öi:1e§¢~ š.,GÇš Ç\vÁ«4=¡F¨¶ÃÆ'©(èT fÍfÈÄ4ëáÑÉPv¦ºxŽJtG¼2TOÏãÑvµƒ•þIËr¸Ñ„‡'<œ‹Ž0±Ÿl +³‘ú†”_ð)5'ÒÒC¦’n®/ÙN6 þÊä R±o#ÉÄ-²êS} ¿­o‡këáÊ +<`¹Ð`:ÈÁg¼Á"ïPñÉHmÐÅ"cMG´à-û§L]s‰`ÚPi9Ñ9ÚÚ¼Kmíె\„1Ïj­Ìü™ì™HcMtät§<´²x*ÕÝuñ4PÂÕ–?R#ã6ÞÁ‚E5?ï 62NF›D´…)M9¿˜î‹µwÄôtª½!eº?¨j‚Ñ:áÒr¤¹iíxƒ3¡ññI«Øp«‰é)6Ù‰Ô6ŠKš»7Bõ­he¹·u'ïýI*>Ç$çØq=;{»˜_±3é! œé&U*R –ùìœ\\ÉΞ‰uŽ¶Ù©\kÝ ¶¼QÄAg°P‹Ï.‡ê{‰îi:ÞSË+n! Î#d"•tïLoïþ•ÓOv×/ö¶/‰¹i:ÞŠ6Ö#Í !?«6Ö*K[;7ļ[ʺø¤OÎð©.—šNNÍL— óS{wgfŽ»ÃE·œãm9;mnñ¥u¹¶Mff©d~µQʸ›×±Ä§Nk3gcÓ§µ©ÓÁÒjeþt°0ÍÄk¡ê*Ÿ]à2óbn1V_ÏÍŠ66@tzÀÎÆ¡‰(µ +.ææc­#ÉîI$Î!Ëj5B¤¥Ö•ÕøäžÖÙËöNTÎ!RÞPÛÀ·L¼'e‰ö±Tït¸²í TÇ\"p ¨¼œ›×Öøì,“ìréiàBk¹E\ƒœd3³JmV8;{šŒÔ¤âe5ãJRz¾¸p6=s,Ù=š?knÎî^÷Hý6Œw4¶®ôŽÜ5}ô®öêíRºÃÄj} ”Àþõ·Ë“Ó¥ÅKÙé“Z{§ºtßä¡¡"°¨˜K´÷JK·—Îæ¦-¾·8wÙÁ%ü¡ .PYOÍžŠ¶vCÅåìÌi+—°aR0Ýƃù1édíæîÝÍk‹'ï½òôw¸Ä“˜/¯^6ö¼rÍlÒÉ_¸ig³hÈ#f¾H¡œ ç•ÚV¬µÄër‰Úê#/½#æGœ¬˜èTæÏIÙU>·휔K ìs;×]RaÂ#S}gµ˜œ<‘ê),\H÷Ž®ž¸wãÒSD¬)¯ÖVïhm]nnÞQ\8ÝغÖ9z³±xþúßÖÚÛ^)ÎO';G`"ù¹3••‹ë…ÙãÝõÛgOÝK(¥Êü±Îî5­{œÍ-–.tŽ=˜˜»(¤ZJyŠŽW¬FÄÚ\n!XÛ T×’½£©éR~*?»mo°ÉI!3í —ÄìT ?+çæªËWc=·˜Ä£¥pižˆ–)µ< ´ SW73½ÓÙéSr¶Ìv­)åçÔæf¤¶žêìgŽ,¼§»uØ’ŒT¡p…ÙSõ• ù™“©îqµ¹Gk½æüí͵;lT +ÈLŸJN‰6·ëk—'7®¸úLqö¤•MóÙy±°°‡^àrkrùXvö­Ô]F¤PœZ]rÓJmEÊφK ™É=&> *]€VÓÝÝX}Óꨔ5,ÌŸãS½hu%ÖØ ¢hu51¹(/yÃM!7›ÞÕ«d¤¤u¶Ä̤Z](-œ‚Åg3½ó÷½¨ÖVaêËçÛ»7òKâ“G”Ê +©N‚¿Í¶ö–N<¯¯ØIYˆ×r]˜ËùææÅÒê¥æÎÝÖ¤ÌdØa!B*nTÖî*-]Ž4F:Ç"õÍ`a.ÕXËM®›± S LQ 4909‹áò*©u˜H©Ð݉–—ìtšIÏë;b©¯¼¡Ò¢•õ^ÁÃ'¼¼ÆB-²ó@›0¶ôÌÙäôË@f'P˜L´WbÍu¥º ¬ÒžÝ{ìÅ·a}lt4”›j¬Ý úÚ5^°¶ZœÜºùà×îzþ{ˆœ­­œkïÞS^»ý[߸Öؼ.fç{ðê¯I…Þˆ›§T舕Ää‘ÚÚŹ÷åçNu–N=üìÉÞ.` ?u4ÑÙIöŽÍ¹g÷ÎgÏ=.o·fŽvWÏ‘*­õµXÌ.¨ÒÒ¥©/ž&?naûbwå®” jâ—êñé)µº2süÁéÓFªëAp ZËÈÓ±©6aÅ|ÑÎ"åÍÂü7V0-¤¡ˆ+ÀW\zJÈôJÓÇ/Ý÷b}é4,ä/§gÎií½úæUè&·ÎÐ/•ü2tº‹‰)ùµ¾:¹}yúèÊÊ\ëúƒÕr÷ø¹{¾N„óÑÒLyþtiá<šfÆkÑú¦œŸ 湓_vC-’“±Æ6EgãÎÝËO—çÏ,n]\ؽƒŠ–áå‰Î`¾¾vióÂ#x1Q_›_?{çƒ_Ø€—p‹9 வö™Ü•üÂ¥@fzqëö½³7"Ù¦—1‰I&³(Ö”Êfkûþ`yÝÁ$ÄÌ´ÒÜü³Zl\^‡uÓêkgîynñø5 þD¤R¼{Ríå3óàÕÙh{çôý—ïQNtI¥¦¶·•Ö®Ú9^]¿vÈ +d΃š+<ÈÇÛüB¦{´¸|)1}{°ºíãsõ™SB¢fÆ9BÉÆë¹ÞÑÒÌ‘âôVcé$¸ý1Ãi•tçXzò„ÖÜãÒlgsçÜC3Ço¸¹Djr$@©o–.ƺÇÄÂ’ê9{ß©»žâSÍaÇƧÅE!;®-ÏÆÛ[S«g_þÖO+ §8µ:½uyõü“Í#7{GîY>ûHsû&«õŽ¹÷äOƒºß€MM·vÒÝ#å•‹Ù¹3L¢³}úžéÍóh¨om%§Ž…*káÊZvêäô±K«×ù¥Nÿ̱Ҡ'P;>¥„ ÄÍÄZi*ß^÷I.Ñ’ á&»t¼£”VJ‹·ƒó{™_ºBéæ¸TQê#¨ª#¸:©ÖvÌDÄAE#…Y15Y^8Q_=§46|JKÙÆö™/ðÉz¼±Üܸ#?wV*­0Zƒ7="ªÄ›;¡ü‚“‰2±²îJÐ5™9Ó‹××ùD§»x²·z–ŒT +ÓGëk+ªË·7–O—§wB©Îž{óf\3b¯˜ÃõHuSmˆ6Jù%Ÿ=w屧^üNª:ç²3gS3ç²sÊ«wU7îaSðÇRgõb¢µ5á• Hb¢L¾]Y¼ýÂ#¯ƒvs½L{Â)¾P\ ®‚¯Hµw—ߜ۹J+•Bw3Þ\E‚y·ÇÃ-9·oI4wŒN´•Ü¬GHAE@C¹ì•˜ÁC•PzÊN†&<LE+sÕÅS³ÇîѺ»ÞPiÔ-Œ¹X7§B#ˆÉ¶ZÝŒuŽåæN¶6/ÏŸyP*.à¡B¦uk }ó§éìÜHõŽ¥:;ù©cRvÊJGMX˜OO{Ä´WL…+ËÐÜÚÊíåÅlªåá#Ál[­-'º{¹¹³©éStz2‘lh²dê`fš äÝdTNtòs'ÓÓÇä"(È Ð;,œ”ç…ì¡BpkQZË-$XØIª;§îs³‡Œ~7“$#5ð9(øœ@Å%ä@â•|/7¹eÂéöfoïÞüÂâV}érfþ,“îe;;G®=‡†Kº[Wvô/úP»ry'µp=TÞ˜@dDL¥Z¡ R¥¥óµµË³»÷ÎlßHwŽ«õ-.RÞ8u³8½kðÀŽËAž²«Ra5Ñ=)°`zíèåTu²” +«º&VØä´œ_ItŽ)Ù™Îê Bå-“ææŒ&ÄšÙöF¡»rn(å £ÐwÀÆ›‘ÒR¬¸IOÁZUgO&{ÇÙô dU$Pµ’qH4L¬ÛٸƥºVRÅ”:—š*Î-̆Giö ¤ìxeéÈÅGü|†›<.•–ÁðwO<ØÙº¬ÕÖ}bîäåÇ:Ë'ý@š”skxâ§făf<Ì ö¯‚G*@ÔÑæN¢{œNt ¾“IPáR8ÓwQÔ1µ™ BF›dâ 7ç¦Brª(t…i°7‹ØÔ”Z[ æfxµ\h¬Lï^QjËx´ŠGkŒÖÓ³\r.PZ4B™œÉÆzvúxvúXfö$oÛù„˜h©•E;ÖŠ½Õ3/žy,=}šKt]l†¡ …„â ›0“›%¹`nJ.Ìð¹é`yÑ)¥ü¡\uéÁ/%¹xF.–räIHOÑÐnÑš“ýæ{§¢BER)Ã8õnÎEF¹HmÌ„žpôY";›líf»G#`¿…´‡Kå»Çª‹çL‘Ò|j +l)ã´—! ‡‹s„RAD*øCµ`a9;y¬¶xRjV,äeâ¡tÏâ—Dº>[W)fÈ`Õ…«~)%óöOÕ„ô\qölgãzsýZ²³gÂBãNÊêL>ÎA* €gbµõXaVˆVÅxcÄJ£rA.ÌEÊ t´ŽŠyT*’ ¶º›{±‘áƒc6£“ôѪ¤µƒ©)›°3t ÷êwßë-³ .<ÌÁ;¬‡ŠZmO«m÷oa%H^|nÄŠÃÂS9˜ÊÓj%hÌož×:K&JD 9ß²RƒŠ`N0š•Ò}-s Xs+ò°qàC g2ZE[>z5ÕÙ೓h¤ì–Ó^AãbåD{C€ +ˆÑhMº¹Ê'ê6:2êæ0¥&€¯m+…E+dxûhcå|iþD¢¹Â%6:P›^[;{7-2ch¨A'fÅô§öÿšñ(XV­¾C© Bs‘\fjLHoûJ}õBa樜™Œd;GÎÞX?{õˆy*ÖƒÊ/RÁª: ˆ¬†ðLÐFEèdOÑÉY­}"Õ=í‘r^VŒ—Á>¡œº•Pˆ`‰ ”¹àÄ"czÞêó!<““T´îŠGµ ý)Õ€ˆ±ú²ÚÚ”K‹h0¡ÉAD$­‘ïE¥ô˜·ƒÙ( É©(¨L{/œ[è_c§>•¬¯[q<” d§²SGalˆ\0£3"BXp¥01hÏâÂ…ÚÊ¥òÜY­¾åÖ,Dƒ²&„µc2üòZkûziáB¨°`¶QNVõ+LÉ‘‘²ïªÅ­´Æ…+¸$¹! 6d@ÌNÒŽð~6ar #fbÂÁð‘ÊîɱTsTïóó)è>"\%CµþΛw°°ž‰ò +!—ðPIï¡­~èÙx8ßËÏí”—vÝÅÄäBinmúÈíó'/Ö7O²9PÀB(?-›ÍÌ`RFçfl˜„rQ.Z¤[Á|‡KVøt5^Ÿ9qõ±ÞÞ­5ç §ýÑ|¸Ð.Ìmšó&žIWfC™–ÎŽaR•RF¿œ€Œ?{F,­¸¥4ÍhÍ9©Ð–ò ¿šµòŸ’” åòê¦6½â '½R‚KNzaÑüÒ ÞaB8° vÅÙST4°NˆÙÔ-'dj„šÚÍ¥íîÎI±ØrðQ1Õ“³s^.kôÊãÎÃn "j•åHLNÞAFÀž©Í-!¿@Ä;9ºì‘4¥Ô¦b#!˜é -dzG|RaÂÁé\nT"ù)¦:I5c…MÄŠµæÂÆìî™îÖñêüJg}··}jõÔ<õâÏÞÿè£_ÿîßûñéë7öÔBÏŠHVoÐ*>&®fs­MŸpÒL(ÓXØ-Ín¦ÚKj}6ÙYZ9yýìÝ_}øÙ—¾ùýË?{þþ¹øðóBºiÁÂvÈìæÁBp‘º™=Zõñš’ki•É\³Wž^ë­Þ>wϽO¾ôÀÓ_ûÎ;¿xïãß¾öýŸž¸ú`oõt¶±L†Š`mþ  ñ@† +íXÈä•6©òÓ{±ê¬ZÚ½pã‘}íçÿíÒ_}ä…‹7Ÿ8w÷£×{áµ·ß}âÅ×î¼÷ÑK÷‘‘¢•,‰q1ÑçæùhC+εX¾Wîm¬¿£»¸²{öÎcwÜsûõ¾þÆwóå_û‡¿~ñ‡¿|ðéç=ûLmþ° 6Ó^6Î.%«;—4a#~‰ q¹è$c.Bñ‹ \J%ŠÝõ£O^y`çâÍ‹÷>qÿÓ/m¾ÖX>Wœ9Î(¥!#~Û “´æäÒòæ‰c§ï¸xùúcO=ûú›ß}ÿƒÏ>ùÍï~ñá'~üëÿüÛ~úù—o|÷G¿ðêòñ;³SGìT«ÑD+É%ÒÅFgvóØ…篟»zóÁ'ž{ý;?zý?{þï=ñÒkßzû§?ÿèó—¿õ÷ÿýgý¿¿ò½Ÿ?ü›Ûî3–i®Öæd:Ër²œ.7çVÖÎ\¼xïƒ=ý‹/¼òúwÞù釿þý÷ßûèµÿùÛï~ôåÿúýßÿÏäŸùƒŸÿêúã_«. çz@˜(Œ& +åæÔâÖ<Öžºpý¾ÇžÿúKo|ëéo|óñ—¿ùâ›ßýñ{þê£O¾øâ‹ÿýþûÃ_ñÄ×^;yç©Ú<®‘bQÉÌ¥Z;nZó`š¯µç7Žž¹ãîo>ñüÍyéî§^|å;?þÑ{ÿä—ýñ/ùã_ÿë—Ÿ~ñéoÿo½³zü.0‡ŒR&§i¥*̆²“µÞêüƱíS¯?ðèOÿë“_ÿæ×ß|ûÇïòÞ'¿ýùG¿ùÕgŸÿáOþ¯ÿõßЭ?úÅg/¾öÃD}YïáÇl$0§Á#Øq•²¢VOW§WöN_}è‰k=õ/ßxãÇ¿úäÝý­½ûê÷ßùðןüÛßýüƒÿ‡?ýÏÿüϧ¿ùü…×Þ:yÇÍxe +—bffp‘N<±¤Ð\ê.ìãòÍÇo>þÜ+oý৿úä?{ÿÍw~öëßÿé/ÿù_ÿæó>ýô?þó?öá§w=òLmn7ÝÞ“]Kÿþl丙 Ä#'•d£Ð^©O¯7fV7N]¼öð“ÿúÊ›ï~ðÉ'ŸùÍÿé/>úõýïÿþò/ûÚß½ùø3ïz8˜š¤Â ’Q&{Ë+ÇNœºpéÊ•ë÷Üxø±GÞúÎ[¿ûÝï¾üÓŸ>úô³÷~ùÞ˯¿rñêµÅÍÝdµÎO{è¸Ã$x•"áˆV®4¶÷N^½ûá{~òÞGŸzö__þÑÏßÿáÏÞý;?øþòåŸþ¦óõ׿ýòo½öÐÌæ¹òô–-©™v¦1›¬LÆ ™ÅíÕ­½­ÝkW®|ûÛßùö÷¾ÿý¾ó᧟}ñç¿A9ÞýàÓÏ~ý›¿þí?>ûâ‹·~ôãë?<³y\ÉOrj‰ä„P¼X›œYÞ>zöòÞéó{ÇO_½qÏko¾õË>üàÓß¾óþÇoýðÇïôÁo>ÿü“Ï>ýì³?üø£WÞüîùk{k(«¡lûüó/ÿôçó»_~ò›?ÿå/ð>ïüôÇ?y÷gï¾ÿþ#O?äÒ½sǯ3jmØLØ|!»Wð`¢Ùû©`szõø¹Ë7|ü¥7¾óò›o}ã›ßúÉÏñ·¿ÿý×_üá'ïýêïýòƒ>zá•WÏÞqmyód8ÓÍuöBJ¦Öœ.7&sÅÊä<Ĩ©¥ùõíµË×/Þûð=w^¿töâí¹jAŠü çô³n\2Ø ƒ79 ?!«ÑL!_o¶¦:SÓ»GÖ÷vç–çNœ=rãæ÷=pãÂÕkîº÷èÅ+­Å•`"ÏEË¡Ü«ÛÎéãRô“<'„öŽß¹²{:•Ë×Ë…íµsÎÞ¸ïxðûßÿÞ{üúý>þ䳟{ù¥“—.tñŒ/û!º7dñÝc—Ž_¸§Ô],4»ÓÓ3k«K§O{þù'ßþáÛ~üég¿ýÍÛ?zû›o¾þê+/?÷Ì£Þ×ÎÞ±Zw)Šæã}\ÌN„Gíkp½“²yhQTrÙôöÆæý7îzýÕW_ë­×_ÿúÏþÎÿøûÿí_ï¸xzog½1ÙÍÖÛ^J081LˆÁÃC+nZñs +ÁJÑD®Òè­¬l^¼ýÌ£?òü Ï~û[¯ÿòƒ÷?ÿâó?ýùïýâ‡Ï>ûä…ËçJªç=dÌ°Áɱë‘Q#ê#ªViÅ©¹¥…µõ#gn¿ýŽËw^½~ý®ßxùÅï¿ýƒW_íë/½øÂóÿòÚ«ßxàæ=ÇOš(±ø9;&!L”SÉò\P+ùp!–Èml¿rãÁç^øúãOþË•k÷<ùä3?úñϾ÷ƒï=póÊÓÝ÷Ô£œ=nck³59›,OWçOÓ½[§CÓ ËvT2;Kçj[[G®^»þ×߯ôÔ³Ï>úø£/½øâ;?yïù¯ýÛÕ«w¯nìj-’Cœ±úƒFc´ùãös>R”µr¼Ô«÷V¦–wýRÐŽS.’·úy3ÂB}œjr3‡Œz3êÁ‚>:âòK~*Œ“aŒŒ¦Ê!-ïBp‡ÏïD ‚àb˜VKf"<æ Ìaãn&ªs›Ñ!DÀ‰°\âÔ6aE¨2Å„¢Ñd2•'Ó©lU’B$F2´ ‡óµŽ×•ô¤¥ñB0œbc­}ƒÖ#¦aƒ(Ô‰ +~1C‡KÙÚÂÚ©{Íxâ-ÈSá + „Kúø” [q©ØñÐÁ1ËQëa£wÌŒyð!¤ñ6§Th)‹ +©þ=I\”Ή;hÕI%ì¸JJy/¥ŽZ}F/mñK<ˆA›5yXŸœÅ£eV« jÙæ£ì> +”‡”üB”´¢÷rŸ¶`_1èÝàuD¤A EEÍèå nÆî—'ì¸ÙCݤŽ +‘ +Äd\Ê’¡‚‡R¤H†i‡tæ¡1§ ábÆËı`EÎ.¡RqÄBØPÉŽŠc&ߘÞe¶ “Ë`v¹&¨–)†R2ÆÄ,HPçdÆa&ÐÃø avŸ!?0æÓ{2Å9;0î³QF7¬*ª­xeMÍ/šíÌȘÁCvDÒÛit⪷ª[ÿ&“rzöð„oÐà:lt ™\#&·“ˆúÄ,.EÊ‹~!«åf“Õ%J)Á’›Ž{Ø*ú· eV+6¶q>12ºšÀÃu3¦š|aôÉ%!5ÇÆ{vBEØ„”üôéHyò#2 b¨Øœ=ë&ÔÃ6DÈ`R jþ2fÆ÷ZÌ6|zñ´KØhTȺؤ_. +‰i­¶Ë(-…ž€E#”Q£oxÂíDeLÌÒýÓM»Br– +×#"L‡Óþpú°Å§sñ·îÚà’“áü|iöd¬¶Œ³T´F„+bjJHÍ ¡ª•J˜°Ø™1ãÐbýküu¨ŸM#\ÚEi¬Rå´Î€Á7bFíxÐ+¦ùÌŒ/\™ðÉv"¨e›s›·S±æ4ò0ª‡éßbPmò +»qäÂäÊ Ê;ñÀ›T0¹LGZl¬¿ÒR:”hðÆã6ÂEöóë„Š«bjÁÇe¥9Õ²øúì=L aâŒRóKÅ™X¡±æ—sãfÄä‡úÚ‰¸×,þh07g#ÂÆ,ˆrªÑI™Ý44õ(ÝÉëâR±l_ÖÙäl¸:hòM¸y—PR3ñÚ +.nÝfÄNhð¿ŸÂ¤¬ÞÕ¿è†Õp1Û!ÃÁ!3ÌTLÌÒJËÇŒ.yÜLAš ä Œ‘Á+Ñ€Þ+Øðˆ‡Ë¹Ù¬›Nv–oÏw7]l “ó„\Æø,.ä0!oâ𪡠—ÃÈO¸„þ v˜L´ºÛÛy(Ó=eÁ¢fŸD…‹ÀÎ2Ñ–”è„M!Zç" —4y$'©éllÛÎ3f@á§6–ãMx¡É¢Â¥ kpsf¯°Ü7dÖû„ê"Õ: žp!dÜΘ]uÈÃ6~ÿ„ï€u[ݹÜÙºcÀNŽ{E¤ÍåVÂ#Zç¨T\¤"Õvogçâ#N1¥C"Ûé´‡ËS‘®˜]Ÿ@à‡?1OG™Éã­Í+xº/PÞËvŽºÈظ…5×Ù•Ÿ™}ƒ:78µ²©¬»øì„7¤Ç¢„ÖIöNU—/0jÈ„°` ÖL΂ðz[ÿÞƒÐV‡tèà„kÂA›¼!PA®˜=⸕wp@}3Wx¥ô•AÓpŸL16åç‹·®ïÖê(„ÉÍ6OØ {c1bÅ£d¬E+ΊéÖ,¥º¤¬7T’KËþhÝ+eÅx{içÚö•§BÒÃÅùD'œ[Šä–b¥U.=7`£ >59{ŠÔ÷:Çí´‹è__HÍ4W.g'©¹ÎÖé{T~¥©­Ä;»‰É#©©©™3Lj‘2±LçþÇ^j®ž…–t`vP®+ÅuF4y%;ïßW6†ŠŸXò% &%g¥ÌŒ•‡ nHXÈ­+zì´†ðY„ÏÁ2­§››ŒR‚ö dfœŒFß:ÅšŠw\RÞL¨L +Ò9ûçÃ[ü"T fgI)GË9)^q¡þ ‚øàÊ耊}BÆI©^!í ¥b§Ô 7§sPà —rD  ¦{ù¥‹®@qÈFXýa'qÑQø 4ùC˜”ÇÅÈôˆÿêˆó Þ7fgíX“kl´#$zŒ +­ÑôaŽi,\örI¦xÙ ^Wk™½"#&Ï]~”U +· Y‡¨S@ŽÁLú¸ø° 5y*X€®Aù &Z^Šµ¶˜Ì”’ˆÔp©®—I ± ëÄã(Ÿg”²úµqÇÿKÒ{?9’ÞgžÿÄi%’í»,Pð@Â¥7H d&È„÷Þ£ +å]—íª®jïÝtÏLÏ4Ç;z#’CŠ)qI®–Ò®öNÁs»qgâ~½sˆ‰ È|óû}žÏ“æ}Ù¥ƒòÆÄÂŒ ugýã‡Î`æJbzA+­œvâ ªŒçbE¢3zül2¦QцœÍ`Â.ššvúgܘ¨.‡ˆÎ{¹ä,aѪ_ÊÚ)M(,1ãÛÿVŠó7Š‹w”ê:.e´ü|8? °ºR=„<.:q„Kå[»„R:?ã…ð@? +)•ds;’_H”wn¾‚Õ"+¦ú{¹Ñi~ñºÑÝ5w¹ ‹©zwó‡?ý‡­Ûo[ÑK¨”\¦£­hqÛ¨âJƒÓšéÖž‹Ô'í”?”#b=6½ªV¯fçïIÅu'¥A„,%Zn öqÚËøB :Zcô&.ò©a®±qãÑG͵{–È>©°ÌåVHcÈ¥—ÃÙu@&6$>é$4ˆŠ‘² ŽZ!Ñ …€k¹yF)ÚžqÑpÈÖ€Œ5Cz'ÝÞÓêÛ£[,5à@Ï Å`”´îq0ÚÀc €—“v|Ö…;1™Kt‰h#’[ŽV½´qvº8˜õ0—-ˆâr —«X¤æãr¨Z§ô.kB¡8ø P›aâ-V«G­Öp""s>WP‰ ås@“/[‘ ³)’bÖäÂgì0ÊÆðFòó°\äÓó¨\CÃ%1ÑE„Üx&+L÷Ò¡»pÃPÍÞ°Ÿ–Q׋ËÀw{0Ù 6oFA;æ(øèĬ“ä¢U[Pú³³³¦!+Ä#\ä;:VJî¥âJº'h…sÓÖ'â@$ÏØIEˆI‚¬έd×…ÌP*Œ£Í¤ú¡Ì0RZ¥}@­æÖ£ç_ÔÖ®_0ûìAÞ3¾oPÇ‘Oô8£7ã¡m%-i¼B, ál¸0Òê[ÑêF×¼ç†ûˆRÄ£%Êh Ùy£¾]µVo­¿…HI'ÎK‰v4¿BŽglŽñ† );/WÖÌpø’“s«ùÑÂÒíHy—]¡´ÐH¥’¨mÐz3Î#‘<¡|m±©®–¹LG.öóým¹4òQr±·[ßzœ^¸…Å:„Ö%´Ž)®÷ö®?ý<^M¹("Úñqµ[¶ôú±Z›”ÂêM ÄÇ™õÎ]n­Ýß¹óQª{lÞÂæ­ÖÒÉ´“ #9£µ•§æOkëûûï­ \0§S±²—`öó™€X2d@Ñ&ˆ°w ð ª:И} ˜Têji³»÷¢°tk<®‡ +p ;®Îø¸ á¡u2Þ5{W^ÈÙa8;ˆ××¼\ü²ö2š˜éw®Ü;}ù­Ý•WnâѲž®¯> %Û—Ü4 >µ²«¬Z_«nÕCZÉËzóª”]……kƒ\`ÏV'¦›¹îÞŒ›:3å™ó‹€BF W+ã5€@$[º~×FHR¦[^¹ÞغSXç% ³xe8²° ÷Sò´‹4%pн¬ŽÉE¹°œê\ƒT˜ìkíÃHy³0¼4m<®‹ò2£\¸l…%K@6AÒŒ‹s¢:àÀü@0i)/%."ìÀÄ9X Jùdk·ºv¯ºõ3ÕÁ^ºsÅÍjH¤ —W…Ü"¦6ÍÝüðTÊ-J!äJ¬¼.gGÀÁ…Ü<k¹¨$DIJ5ù¢€ /¯G+ÛjmG*¬¸!Œæ¥×œ„Jk >ÙÉw·7N_ìÝýfwû"çÊíõ›O?‰e̓õÞxõeu÷m:µq©)7ñ9½²9;¾oõ°HK0 â?Ÿš·¥óæ b½”èÎEé^.C'º@ÁâM !íBwcãÚsÎhù9ÃM†ýá¼/\¥•ln®Ýx+-ÎxiË-Ü6Ê]óx&dÎÉF~¾Ü?¶è¥tT.#r Qªlz‘ÍŽ¢õµêê̓g_”–®Ÿ·ÀV„̈1ú12Ôe+5;îå +Éÿùe»ÉÇ3ÉQ¤´Ë&G\raÆ r óI'ñP±Å«ÏŸ~¶pô¢¶þ@ȯڈø%Ûx*˜“gßW6jBTBH * JN«lØÐè™)Èä’åÉ]˜´ÿù™™  «-©º§Ôö¢Õ“sc§u L;?᜘Ã.Ïá—­„Õ/¾²úEЕՅ=ÀÞf?o/%” + *5´a +­Ð‰¶_Êù…«ž"ìÀýŒ°à®ˆ§\ññyJ?‰ÈEØáÌ“²T$Sì––N ‹'‰öfoóncå&§·¤t/78ÊK WÙì‚NÍ@ƒˆJ²g”7&ìÄ% J(5.µÀƒ1 ÕÖ¤ƒ²D˜M’Ž H.®–Wïx»ÀÅÊkûwŸ~ð#6Þ0ûx/¥1ú Ý=Z=ygÿÉ·Š+w@éÎ99?à³óL5û…ó|ÚÃB”œÈMê¶ñÉ¢›ŒM8qª’±ŽZÙ\>yóÎëŸì>ý^¤veÚ'ár +%xÌäç½t2ÈähµI©MPEgg½àkÅÜ*"Uça‚ÆK… Öh{C€¦äúÒQe~?Z\” +«h¬ŒÔ€Dpé…âòCO(7 ‰Bf|FÑôÿÏ®€¨ú‚vãjª¾éB¤oœŸùÚ¹Y+¹Æf–ðXÛM­Œû¹Â„;{Ñ6 VĈ€å¥ÖñûF¼±…2F¢¸àcâÀŒÀ.(µ]>¿Á$”ú.*—ì1.v HEÐ; &Á;/gñòŽ@Ä»_²ûÀ¥ß˜†ÎN{Ab•ŒÎxÆõY亂ñŠ6P¥Ì-.ÑP2­Bw„q"œm®ÝnnÝÏ ¸T “k¸Èñìd¼VP1Ä€ä2–´úµLÿV}í4žüÈKFLviš|¬ÝtŠ1|zSë J”‡{ÅîN‰ùñp²¶Òß}ºvë½ÍÛ¯O_þ ;8fÔúÉé›÷ßüœˆÝTÌͦÑhK-oçoµ×ûBùoÌøÏ a³|fK‚\™Ý=ë lƒ,B7¨16Ñå…Æ›A> b#-õµÚö8R¶ÃJº±WèßÔË›íÕ[ñ=À•9?/ÆÊw_}K/YI'Æyp WAßÔ÷S1Ð$L^ £R\U7*K'Ûw^vŸ Ñ†˜èí^`t;"ó‰~¬´ +V«ljwÂAͺI”3œ¨<†y3ì@£Zm;»p Ø ¼¤Íõæ|!“7JkùƇÃã×Õ­gÙÅ[pùÌtÀO[7Þ†³çÌþ)kÃÀQÈŠ4Wæñsðü¤Ýâ!‚ãó-þ/7ë@…¤*Ÿ^t +~Ñä@<˜4eO7á¡A©DÆ[­[>±ƒ=’²< + +•‰7Ød—MÏ‹Å ¡|Å/挑®®¡bÒ…IA"%&ZÔÒ3 ]2{ÏLÚ/̸ÏN»'l8èúñê>ÁT`€…dÌ +Q¤\dm¥¼¤VWSý«Bv“Ë +¤t#À)AÄ[’óàc¼Þ–Ó‹.L³û9ŒÕ½T̬Ráó ó‹@æ|œó«‡;P>/§‡éÎî%5i%¨pTj³PèŒÉ{Öä5û8B.‰©!Di.„—Ó-˜KZý¼.Û©(âÒà;vX[\Eż# ™\ ˆÿçg½&‰pÆDï` ](ˆéyZos©>¦ÖðX½8¼J=RÅÞNnpÞñŠ³a2m„³+ju×äA˜dõN$·.ellÑZÇìSÎÌM.ºÜÚèŒöÇÓÄÙPªZ+ÚØIõO€ªŸ7ÃzÓ(ö'@%\ˆçíHv@«%/,®ñÙ¢’r‰Pˈ˜ gçc=µ¶[ÝÕê»|ºo' }ûG€cÖ'! ¨$rÚƒŠlÿõ¯Öe˜OV/!¡¬ÐʈêõÞê©_H‚€WX:Ù¸ûÉÆýÏ +k÷C¹%ðCR4?¿|Ø_½ÒVX°ø¯±î#¢J¢é#d«—à£yV)€ÀâôHgçüÊ%;ŒÉ 1³.â¢É;žjÛËùÆghÛ¤<¾|æ""œ)ô·Z«‡ƒ»óWŸž¬^{Ù\¿£µ÷¼|2[[Ÿ8•Rv„§Ôr(ÞÅ"Í>ï£3˜=€d–¡ñÒii/™p6»iRÌS ²ñ‰Zð +ø­€€!GÆ›B¢•ooí\‹Ñj``Ǿ<^q¦®æ–ùx‹s^^I¶²õu“‹:;å1y8'¦ÑÑ&è=zòÝ•kïb‘ÎÁBÖCÄAM:ð 3Ðä\Àæ¦]4,dO{B3îÃÏWòRJËW®Ü|»¾~â e +˜cm;Ý=‰V·Æ÷Ù¦ûà×LjY?ØB\A€å…+€Q³í«ÅÁ £÷gÜœbR‰ë°”6:ã—ÁËä“^‚aâiõ…¦ˆæ#éÎ`ûÎhïaº³5ؼ±zí)›¨bR:’ +©îpûnyáš7”pa"Ë.lÞÔ‹C†<˜â@c.,î%“˜ƒPÅ”&-©ñt|~0\sþIk  éÅåhaDɹÅ+Šý/§F35¼^Xº vJHtúw²Í-Ù>«–¢¹%FùJ úòœÿ/ÎYlž(‹—8;e»<‡ŒÏÛc +àL²zùñÙ!(tÑâwQTÈNH5¶E£ jiÒŠ!L‚–MNüҌל~€GŠOZ‘ikpÎ> ™=ð‘K6àNÓ¢ÁÈLÌÈ™ÁµGŸ¬>Øeh¥<]¯nc|ÚOH›ó±Àõ‚l +®’R%œZ°i““ Ã ŨÂù³ V€ÍÙ|â„™²¡Ó.Â:–Jñ’É;ãĨ¸Ñ0H4 ¹HÁ'¤ý\ +“+ õŒÖo”Wžt·îeÛ;Õ…£öÖ½êê-µ²ŽGòFyÄÆ+VÈ‹ËsÞðŽY;$5RÊ zðX¾³ï{j 8ƒ<*fãåkonßÿ¸¼p|úà½Óç_ˆ¹y?Ÿ…BÏQÑf$·šîß.­= Ë„”-tí]!ݱÅ3žíVv`º Ïû™ôקÜߘt_°á¹‰ƒwIJe¼"ªˆ‹y½¶ä 7&i…áæÑãü`ëæËXsó«Ë •ÑÞ³þîcF¯xhEL« Ç™æf8Ù6J&’šscAJG„œ–f= ÀÅ9H´Ãª×L +÷s“®i lõÐŒRŒ®¸œœhÌo^溰¨GŠóÍí‡óW_‚H˜Þ }k œÌvo¿†Øؤµù9`ˆ©{ Ýì y•‹»£«£+ÏNºÎ\²‚†RBfDÅšàPSËÔV®<yÙDLÌù§ü„*êuDHMÛ<4fÔ9ˆšóп8cCˆ¹`Ƀ„/Í8Ü‹I«7*-U[ìoƒ¨rK©ld»@©p [÷Çë—,À\¡97ëÆãd¬… +™ËsAÐ4ìðóîñ5J=@¨6cC&Ì4Ç…ä×/Ì}íüì_œ›=7a›´!N8ÌÉ°Iùæj4Ó›sb¬œ³£aL.ÒFGÊ/)Õ­Âèv¾0¿°óÓ_üÓêÑSAÒª«rq ¤T>½ çíˆDp‰ùõ»n*~qÆ1ivZܨy¼º @BˆUh9 |ßÇ„\²ƒ\ÿJet5ÓX¹õèkOÞÒm$RŒU®DK›¹ÞI÷­ÆÚÃÚÒ->Ù×2ƒ«©XÆŠqnZ‡Æó‰•8c@k=3ùøÈà„6å OûÂç,Ø„“9KίIÙe:RÜÜ\ßcâ)7žÎ%;¼ÑÜx²züÎÞÓïf‡G…îööR~YHv¸x“òþñRìyT(½6íÂìHØMh¡hŸ×@À÷’ºŒ9¬bqÚAœ3ùdBT˜²¸!¥áLÉ!b +Œ•›N2z§»q¿1º–­­fê‹^'åt$Ñ´×@‰Øá¨Å'9ƒ*J' +õJoÿÜä r¶Œù$‰ªuD©úÙt}þ°5:: B–”¬ FƒQÇkxqFs0“ÈVF¹úªÉ…Î:PgP +R0JgPœµaf'&Õx¶cƒ(‚Ó«£½Õ“ç+§¯¤âz0\õЩ…Í;?øùo“¹¡ÙͺÃø,£4™h—T[öñ¢$«–«K×åtgÎ…ƒršµ¢V7Á’ˆJÅ܈BùI+úï@uMûÌÖ‡*¯àE£p(Íôo?ÿdÎÇø9“ t¢#•–µÆ¶Q[ž_9|ñÁËÃ}‡ ý«¥ÅJiEÌ,bjË2FVѪÞú1¯ÿù…©s“§l¸ÙÂN +ÉzsiçÆ‹^ò…¨e Àès$3ÏâN ÉÑ@F¬mñPà719(:Яž\óS1V-±±’œë·¶Ìï?í¿±rõåêñ‹F¡£¦¢\Ê‹ÉÎàxͦ ›õ +%#É^üQŸsâP0Ä5«‹òc +/DM[a”/È™z‚ŒzÉŠŸؽ‚ƒlŽÓ{”R‘-¥‚ÈãÅç«•¥æú­åãçËÇoÖ¶@œ$·±v‡ˆ7R– +~>‹JEBvPmŒöl˜ôõ f‹“t#Q›O²xC6Ⱦ½ØZ¾zŽ¤mdT®¬séžZ^Ê-Äz‡X¬Æ(ù½“ç£Ýû.Lñ’qL*˹åÖòÍÁƽha™y¹:ÿîG?, ¯ý»ó¶i'fC$i(Ù…BïXH-8Qyiî1ù&]¤“Ô¡P +$5‰Ôâ(ÛXYܺÑÙ¸é¤J+Eò})Ý¢ãåLgkãô͇Ÿ!j%^Û0Ú{p¸ì&ã>à>¤î Pizeݨ®ÛQé¼Ù‚ã˜~µÐjÊÄ.Û™ËãuÌ¥ss³ò3q1;RjWÃd窇2ŒÜðùënÝz šO6åò¢T éÐm¡:‰Uk¥Á)®L~Åí6/b¹¿ŸN¢n÷o>ùŸ‹†Œ.¥wÝ¡,£÷ôÆîðð-)Óí.Ÿ<ú¨4<´eè8\¯QE'v|½Ïä€ñÙ‚üHpwÉJ˜ýa'•3Ë™Ö~,×k.Ì>Û¸óÞúo.]{)d6LÁùtëJiáÌ%X­àsÀ‹ý´nr³fk…x«›ñ!átiYÔ_;o™0ù~Þшu³WÂÄÂâÞàþÿÃ9û„•œÒ{Rfä&ߘðZœ›”Ý” ‹ &QèÞÞ}ZX¾K&çÉxC.-§zã)‘ï}u/ÐZ¬² ßÃêSÐxþ^›—wD““<;^¾ +švâRuÓ1 1ùQcÓ ¿¤G+K­‰Î^ªu¥0<ÊvwÙxð34~€¥LÊå›81>‘®ä+«wÞí³“Î£ƒ?èh ¸»©¤ŸKj¥E$œ½0çnEˆ6@ endstream endobj 81 0 obj <>stream +äÕ ´?Sî¯ìœVG;B6ZWº»o¬œ¼^:|Ù\»Q]>‰æcéλßúë›ïþØ‚E½´‘ë÷¶Ÿ§['éÖ5!5oÇdFc™6­g!8?GÌx$;j…R¬¸tôàõçŸøè謳⊇MQZ#×Ý-ôOÒƒ›¾pÉGkZ} hµ—KŽ·ç2N\u±Òèæx9?(ÑzP(˜¤Uà !=ÈDõò¼›ˆÙaZ«';{¥…ë {ÛëwÆ.•Ì{o÷Ëß”º›³€‡«D¤J* /´#8©HfI'f +”Zc…GëÉñ´$Ýt&”2Z3Q]cµ¦”éDŒwèÄ€Ë.Ya‘Š•´ÊèˆQOtvÊkw:»OÚ{ÏkÛOã½c63¯åF{§¯V^ JSª‰ñ]%;tr•Œ-Œ—ww͹ñ•zÒŽ™½!'…ØñÌ3Zu%Z]Ì´W—Žž-?¿rçþ΃dwÓš^6…u"«o|¿©6 +ƒkÕ¥Û±ò:*—æü¼ø&ÏB”äM©HƺBf=VÞfâgö±A.BÉKƒ È%ÚñÊrº¹þ)$[(¯§Û[Åù«ùþ^´´¢76õú«7céÖÖñ£Áöuñ-ÑÜOe“ìáÑæx¥Q'îCÃWŽŸ¦ª+f¯,ÌM$!:^ °òⵯë û ¡R^,®¨+•å;‡?»ýîÏ:»o„B¹¹zåä΀KÔ®”—56^¤{wÄô< ‹Þx3Óܹ`Á¦€ÃzB“ku3=8ñ‡Råöfst>äÒx´FjM£ºŒ#;8Vóó¥«M8èKsè8•‹¥Ñ—R D6yèVK÷ÆžŽ +YDÌbJÞC)B¼–n¬…¢ÅÚÊ;ïgçãµ5*VñÑq”O‚8³uãíç}ÙÛ¸ä²Bb—Êö äðÑã;Ìðřक§f=ÔŸ3_4fì„Õù±8©A Gð˜ 5À·$˜™?¾Þ¼ÿyeýAKåº{£ýç‡?í¬œ=ú°½}7ÖX©nÜÉ,ß–»‘üÊhûñá½Zë·Aj“²‹©Îž^ߥ—¡PvÊŽŸr]0ùƒŒî§c¶ ˆBL€Màj™ŠUåòR´¼¸võÉáã•Ê|¢³^Z>OOÔØÉöoÖVÍ]7…¨ñeePN\²'d—˜ä"Ÿ]#´n˹pÕäc‚|:.ÙAÂâ‹ ZÞâ3›‘"@Š§0)%FåÅ›Í{€â@ýÓj¡::ôhu­³ýxçîGK'ïDë|ºåçTB2ú·ÙxÑ˪D¬†Ê0¸”EC‰teQNµÝ˜â„íñâ,.<îÂ55?J77€œ›òC p˜xWÓíÍÎö}­±åeôµÓ'¯¾ôr0¤—æoæ‡7“=)½löóSNÜ«'·_•:;—Ç‹Ì*>Ï%‡ZíJnþFª{„óɛ޹zç á]X$‘æÖ“ƒÇßÚ¼ÿ…\Ûqñ¥~ø­Ÿ-ïÜ1¤‹fĈð©%¥´…«—,ˆ WûÉöt¡Š—Šƒ€FÅêra%œ[¤åÜÉ£÷î¾ùm9Ý÷Qz|*~”llö=ù¼º|—ë¨X`µŽ5 œŸ…þâÂܹI AðUˆœ:ö —+(Äs£977eAoBTr¼äh@Á…‚ŸŒáR†MvÒÝýÜàU¼V)ÏW–¯7×oìž>¿ÿÎw‹ó{RaþÊíN^þhtí›À/½þy÷Ê3.ÑÍ”W׎ތäú³~ÎŽªŒR%Å$ȹˆñá²–lÖùGr¶ 4ÖjFg7=ÜÙ~Øؼ-dZó;w*«7â]­³'VH½=¾«9ÕÎ%GŽæäåu­Ð)´VŒÚšYBå"–1>çÅ副V‘%áÁdð¿Xýâxá‹p¡7. \ Ó ¾y£¨lÒ…Ûa!Š¹PÆÇ„Y­ g{µ¥“îÖ}Þhy°‘ãg:¾ºãs¼bNL÷½¤f€˜ÆÙ«—ŸóÐ.XpÑLw·»}¯¼x"WbÞìåÄhEM÷ŒAÉÅ`(ñEQocBÆŽHÁñ£Ĭ“vÃò…iÿùËžs®Yå'Ô ©R0ÿ™‹ÄÌ:‰oLºÎ›ü“.Ê…,nŠŠd‚!-ÈÆ£•ÕXu‹µÀ¡Îfyt”ê†s ¡hIM·ú2©¸¤ðF™‰•ãµ­Dûd=,æbÍP´:aEgì8Ø‚a6ióq Æ&æ| ;²:£U”òJ®·ßY»±¸urüà­ÞÆIqx°zýÝáÁ[Û·?\¾úF¶½%%jrº“o®îÞ|!fji¥±~w~ï1(€Dk+’°ÉZ¢8¸õ䃫ÞsÓz8·Ì¥æÕòæÒÉ{£“÷RÍ­îÂî¿üõÉó÷ÃùA²µ p»¾~züì“÷~ô_üÍ|û{¿Ü¿ùöçßýë'ïÿH©®)•51¿b4Ú›O·ï~18xSêL$_ƒ_X´!²ø¤—KóùÕÊÊC¹¸äŒê`‹QJ¼Ñ B©€IZk•æO6n¾OFs¢Q–R-BkçoTW…‹Û>¶ÈŸO£g +œšó3ðV'ûjq–茇ŤBºµK)e® ‘RsãQ~á—î‡J«¸‰ñ,4-;æb¤œ¥¢e:Væ R)k ~í>H5Ö€0Ò±†W­PÈÜ$Úð 28ôœ^w’1AÃ9>;J´Žèxh1MKi˜K +zÃæ§ìʧÅD›Tj ¥Œtaê…™¨Ò cø( „ /3¹( Âã;}Ê&À¿Î8ÉËVtÒÅØШ/”¯˜#e™Nº³íezº/ H%«äzRv¤¤pz¨—WµÊ2ÖCŠÁ'Ê0¯ ©¾TXÙp!•¢éQ,·`ÙßÇùÅJVwÙì;?í!‡ǨHÙOiÀDµT¬‚ä{ú"Ûß"Õ´œiv6nkåùdu>^rfu>Þõ–œî"Bʨ­d»Û¡x“Ë>8Áé%9YKVGr®kC¤dsK..†³óÍ•åÁ®ž©µ:£Ï_wÖE£Ò^9:|üþ·>½ûîwo½úâú›oÞ~Ñß8¼óôÕîíWíåë{÷>ll=im?Ÿß{Þ^»l] òÉXªuï´7ï\´¢S.‹äCFWkF·ðH.I?}õ…¯ÙÅÅ‘Òr²{8ðÖÊêÛÏÆì]{üìõ÷Šó‡1Ç$º°RGÔvet{ýÖ'¹…ë>&~úàBogÖ'€XmöG &H•âà:@tAo6‡½í‡ P3½]*^‡BI2Z %Zéþ­ØaNÐË€')¥ŽDGa1+¤:õµ»×ßýYeé´y83p8çOa÷‹Q<`º»¤R¢#ÙX~v';¼)äVpÙKLÝâÌé}¬€È gûÑÒˆŠÖ@…Xü$@èi?.ùCI“‡‰Àá% 6aÃg\ô n³s3þñs6üüê ã|z..‹ùy>ÕcŽ VE5ƒºÙKùBQB)ÄÊkzsOkìÒz#¤æâù¶j8Q!’îg'ÉÎÕlÿ!—]`/ ÚäÀd­ª&ê6/}Ù ]2AÓvdaŒ/ l–rÅÞnPHÐJ>’é¤z;|v@ie0&™Þ*%¬>¨¡Ôãµ+ñÆþxÎ+Z&"¥º˜R2ë!⸔“m…V]oõs3Nã g³øhƒiUŒè‰T%Uì1rJŠåJí¥ÚâV±¿¤W|²&æ»Z}9×[kož€0Ôí<þ¨}åIQ«à¼á#$/L'ÒõÕý©Ö:Ȫáä ž_–3CVïx™¸;HðaeãàF€Ñq¥)¬g{Gó‡/—¯½ÙÛy¤ÙpòáÓwùûÿ²|ôQ*ZsÏܬöâG«Çoä»ër²øæ‡ß[=zn †'4—^Š·¯–—î\¹ûE¼º¦¥;_~~üìóY¿8‡ÈvИÑÆp÷ùÞã/vž}/R^/´6ž|ø³L{Û‡˜r®²tòîµ7¾ßX{ e¯Þ}?Q]?7ë¿8ëŸu³>:K¥du½»y?$Nï¼üôÇOFŠˆÚâók\fY*l,~°õà;™î‰ˆß|òñ矨ùóËv t–Ž˜4í\²ÒS6b{ÿÁéÝ·°ôµ‹Ö¯]°ü»³¶3S~˜gÂc€ý*Ã=J­°F›PÊ çzCãÅŒ)BVŽ†Uö2,¤…ÌP«oWŽ‡{¥ÂÈG)ÉÊJ$?rãǬæü⌛±ù‚×99ã 267L„"6:Q>>åsÎñ#~y?ŸµÁ¼¯j•¥üÒéâÉÛ½ƒg¥µjuÇìc Tôš ,m€¤?ëá\Á.Õu4\ôRº–‚Mr¢¢Îz'®:ÑH"¼RÎî†E½ºZžSJ—rÁ‘ ©ÆÒ-½8@ÍìA.NÈY.Q«­\[<|ÜݼIw´|OÎ c,LrÑÉ'„L„¢«Y¼¡ êüê„E”â#T ¡p–`u4¤9‚a„ÏPáB€ŽB&&Á àV<ݪu7 +í 42¾šY[¾™íïG‹ýP,RRáXJÖRÀ-aÚIQR.¤–11í§£nDpXFL«¹yZïZ‚r´´¦Õ6¥T¯±|ÚÛ¹ŸîíÂ!-[lo>0J‹p(//GK‹RºËh% eZƒ0…Ï땘´áö`$Àå"™¥hq· 1%ȉ|m¾6¿> 6w”úNvt;7=^YÊ +i7¯vïî((¨æƧaY¥<ç"瀛FËŸòäÕçvX:7œr s˜”ëZ}W«l„cù÷¿õ“‡o}jv秼sà_o—·ž +±CÅëZ¶ ¢@4!)çú€ý* ‡Ùö&,$Y)1\=Î6WíH؃G™X“ò¸˜òÀ!‹ 1Ù¼â%·Ïï`„”Nöøñ ÞCL®àœÖßY;x¤BF]).ÉÅ WtŒQCá”ÃK;}lŠ£L’ó‘Tä2XP6-(e>’/7Öºk·œdÔËh>FsÁa‹‡o3§%Ê sá)+6c'}d ùBÊ`bȆ´š…HIÎt2µ´.¦æËÃkj~ÑKª•ÎV¶±êˆ zp¢“6$ágJ!µ6Éê +HJ*¢×M.@’’mœÂ".Tƒ¹Œ‹ÆdRF„\8=P’”K rÀ"6¾{ +0‰1J’ƒ´Š²`'"O9¾ +8”l¶-.Âê¡Á¡ñ:¤Z p›?dTFÑò¼ P.Îj%2œáÔ‚/†Â ;D2RÊ(t=0í +~ +ä•9vŒƒÍËâu¡ã[¹€w¼°À‰q’Ó½˜ìAA®Úgã „O!Âø‰H”MRRFŒR¶ºñI“7XŠ]˜†.Ïú-%B4+ÇõleTø˜ØmD¦áp9Àg|ta#XHÈÕz£|Þ?–Y,/Þhm?©¯ßqÄ¡ L̇ \ðاÑj^δåt“‚œÔ4ʨ΀€±I°¿ ãü´jv¢Lô™B±BÆpŠ“PV•ó\-@´æÁ#’’Yݼ¶{ú”×ò UµâJ¡wª6‚Œî…Y'D€‚`ÑO*"xQ f4TÈ2±)üh$¢ävwoß~ñ™‡Víï¥Tñè%ÁK¶¸q“¼gõ0.Xrãª[ý¼‘H16áãAZN×WõµhqYΤ䌔¼„*H²êÊOÇÕÜB¼¼KmPZ¿4cñÙ=0'Åi)qfÂq~Úcö„`6‡‰?“v£1Å¢ù"\ â¥@u]X¢ Æ@!\ž6û]^ÙÙOXH|Lä8˜ŠÈð¬ÕŽ–õÌЫ^Xòb +Ì`“\Að§’i˜ÝPQ:²›NòLFÜ~ÂéApÀ¾ùšÝéñxA2‡ „KxpyÎCеc?wnÂ9c}¨l‡B8^„ì +víEÄÚÂ>¯\~ãAÚÒq”5@NÏù&g]sv!”©9ß”%èF‚DLITd½ÄGr<Âà_\°ž›ò\œñNƒÅÌ.œ ÇA ÒŒ=xfÒI† \¼“ïsñºÙMØ}Ô¤5pæ²Ù !>2ìBy’åë z±/ê?);ü„Éé·y”^#ÛË ö/;°)«oÊìžžsÃC1R$ž%xUI %e ²Œ”¨¶–Ò….øÆ)ÛÄ!*6eÇí¾;ȳ‘œ+ûɈÅÙ!Âé§!à€AÁì¤ü˜ªÄK…ÚBº6Ęp8ž½lˆàô£"(ȳ“ži âÇ»vaÚnö n2AÈ5^ï†SѨC')éîÊqH+€(.¤5¢Ùaº¾I 7åÝ!Ds8++QcçÚÝ°Q6yH{€÷Q**dðH%ÈeL8"úÞÁý7¿õwVTú³3S¦ìn?¢šVyVŒîßíÜr ܤÅoõ2mh„QIAeñX¢˜¬,3‘"ÊêAfܪ$¯PŠd>’†PÖÀ=>¥"j²r`Ç1»ÓÉ„%‘ò¬%@X|ˆ;@°‘<íº`Å/[|`—¡ñ üL0 Z1"€D(à;ÁP¸‚4+ ˆŠºaÁà€A€ÿÊÉYI+™ÜØE“ÇìF#á¡„ˆf¶$žÊFì›Í4;a ç‘T;ÙXÿêL ‹ñ‰Bg+šÅ2+© ¥b|’S«0­ƒa×Ó­D®ãöã@ÒV &Â(!º|ˆÕåÓR¹Ý“ÛAœ›švÏ‚|}ÉvyÒ †du`÷ ¨>чÆÜ^ÜåöϘ³‡Ç¯Èr>›,2ðüƌ˔X˜kÒì™ úÉåå.O»Îœ79k²¹&\¤„ŒÇ¢%ªçµDIŒAI{ƒ<¨ÀZ3–ÀÙ‹–‹öY3dwáŸô£ÒœÕ?e‚ÌvÔ…`JPI»—¿4íº8ae#Y„Ž^žqÍX‚V7…´H´ˆ‘Q»;45 »½ì¸;f ;â ñä,Î Áp$Cr™ËÄk½6&ðŒˆè™\µMå0!ì +Á€ÓsÕ®šmžrN˜ —¨U*M†ÀNHl¹˜YX_W2…9:ãD\°ˆ2 +-)±D<™K&³ÆÊÊÂý'o”;Ë“hbÎ=ar´ÀrœªÊ‚(zýY–’Éxˆ#íÎ9·ÇA’AÃç úþîêÎávgs!SÏÈZ˜W%¯ökÃ@§ó’‰É‚"E´Áj‚ZÕ °ÇlõƒŸHkù΋¦Œ|å¢~œóc¼ÃK^šõ|í’Í”‚¡ôä\ Í £Ôö–Vù° Ää€ý„,FAp"ÈiÙú‚/r±"N[<„'‚É0B ¬ ’\Ì +0¥’Ržäu– s •JD•hŒÄp$LI"4 7›Ù…å>ÅU¤¼0ùè*„â .çC$”Œú‚¬Ëíò¸ín·S’¤Z>1_Koª7‡×öG/^>ÜÜ^ÖbQ„C0¼ b3s??3s~ÒasQ@Cl6ÐOQ£F9Å°/€»s<¢a ¡'…gD¢%W€¹4ã8s~æÜEëä,45žãÈo²’ç&|g.{.L{ç„ÝMÙA·Ž§ 4€i)’„¼€ùIœIÐBjÎ ŸŸ´ší0‚ð>/ævÚIRÃH9+ ÚÉÑb½TO¦rJ£–¸ºÙ¹sº±¾Ù«Tôr1¡%’¢ +2;î’É4çôzƒËEyŠÇ] ]îåJU#åDU Ç5†Åu©TR»Æóû{Ïž?¸½ñðÞ•|%7ivNÎAÞ äIĈ@+<ªòH§[d[%E[Eyk!ÿüÁ.xýø£;ø»ó?üøÓg«+å¸Á†DåSãÅsñ8ÃÆRÉx­ªwÛÙv3“ùdB§9Áæöº=PD+ÕbsÐ\Z_{üêÃ\»ïB‹ž2xzâô"ä/›¼çÏ_ÂP؈ÇK¥b&›ð!¯<Œ ®VŠG§×ë½~D×—·×ô\BIG€`ä$.%äT ee„èx%d>_ŽÇÔL\̨øörå`gÔmd«ys˜tgû壃^Ý|ëéÑ{ÃaÃHèA? yQ§‡@I h2A‰8Šó!¼ä[åh£o‡Ëé‡ûµ×Ö¾x÷èÛ¯Žþå·?ùݯôîÓ«»Û‹õzY$€ü@îhŒ5(6¥‰ÁÙh¸’Žæ4¾WÕ—ú¹A+¿¾Ô½}}÷ÚÕåû·¶^=;yñäÞñÁq½Z×:Ï3^/45ërz™Yzq2Ùð —¬.YfL.·†\À)MnÔ +QYX²˜O +9=ž4ôlaÎ]¶€†u¸± ×Ãã^™´—ãðþ|üÉQûÎAçáéü§ïÞøÞÇ÷?~k÷Ó§£þù³ûÝõýï½u}km˜L&Q’µÚ]NÛá³'¸—Æ{ßR¿¶¢_ß­mWÀëæa÷áµÞ[÷–^=\üôùÚ?ÿâ½ÿòûoÿø“ë÷öŠénw:Ìv?N‡ Z„ƒ0‹@ ÝëÇ#ùùQù³76ß´øúÁ೫ÿø“§ÿöûoÿãüîÇwÿí7ßü¿þÛïÿæÏ_=ܸ¶ÛN§“A„óX X)=RÉŠK-mo!1( ¦‘e;Éå~fu¾¾ÓúðåáÿW¿ý÷?ÿìÓÏì^Ù^=g·9 ̃Š—L®3&=6K” "œŠ QÖåÜ­Bd¾i€ÖØ]0Þ}¶ÿ΋Óç¾õþ_|ùù›/ËÆpq¡»zu¸ûœ‹W}nG$„Ä´'÷ÚÓãÎÃúÁ@~q½ý_¾úÍ—¯?z²ñù³åúÅëÿå?ÿåŸþø½_}çæŸ~ûúW?¸{¸’‘C~¯²Ú|¥`—Æzæ Ìý+ùŸ~rú›Ÿ½õÃOn}ðxþûo¯ýÝwnþ˯^ÿý÷ïþê‹kúÝ7ÿõ>yÜzxXÝ^,§ 5N‡Õt$–…ظl$°•Šp{#÷ÎÝ¥7ŽϯÕ~òÙ­ßÿò£?ýëßüñ¿ý»/Ÿÿ÷ùìÿý?ÿõ_~û½ç'í~óà¿|óýçû M¶Úƒ&ŸÝK“¡ˆr!泉„;ŒÏ ¡ÓµüÉFyw^?^I=»>üËo¿ñé[GŸ¾{÷Õ =áAØ *²‘SB½ µÕàî­iŸÞüôƒëùÁ鯿ÿôüûþï?ýúÿð9ùëúÃw¾÷Á­Q)¡I!VTµC‘a®häb?êó·W´7 ?~÷ʯøôËÏnþà›û¿üöÍÿé—ïþ÷ÿøÿùŸýáçOÿéË¿ûÉÃ7ï¬a–c„Ø\~?à‰ˆšÊ£,ûrGÿFñã;õ¿|gý?üèöûãÇÿú›oþí·®ÿá'wÿë¯ßú×_<ÿÕçWÿþ‹ƒßþàôçÞÜ)—óIè#?…ñå~m­›^i¨7×ßz¾øw_\ûá;ßgûŸõÞ¿ÿòÅO?ºö×üÿéûÿÏÿþ›ÿú»ÿùËGÿÛ?þÙg76ú vLΚìž`0HÉ,Û/„š¿®ºO‡üãôÃÔËëõÏ^®ùÉÕ¼Þúõþ¯ÿé/ÿéoÿ?’ÞëI²ó<óü#&f$’º»º»|zŸÇäñÞç1é½·•YÞtUµ­öh '$AŠ"G"%J49’"$­¼8’vGÒlì®f4Ú½˜›½ß7¡ˆŒ ;Í9ç{ßçù=Ç|ßÿø§ßþ×øÉŸýîG·zÓùv¾9MzÎÍ׺è6JV<Å“RNRŒVÕizL?OÝ›g_:ßÎëiû§ß:û/ôñ/~öÎ_ÿäåÿü?þ?ÿÛýÞ·oÿÞwŸ}øÎ-Šd“(—…ì%Ñ91ÝóȽû`fþÊEï'߸ùß{ü§?xö¯ÿùÿßÿó×ÿûŸ~óùþ£_ÿðôÆnÓ18Š¤B’ÍŠfU #oŠ|QŶëêýú;7ÛÝ­ýá¯Þú_ÿ“ü³üæg7óÃßÿöÙŸÿðÙ¿uç½ûƒÛûv³­ÚU^¯@D‚,¶p·\Ëå + +5Ì3·gù{Û…§…_{9úãßxô7?ûø~ýéï}ûî÷?:ûÆã­Ï/úoŸÖÇÙVЃ¤Vi˜nŸc¤’c ¶¬S;Mí½ÛÝŸ|~ò'¿qñ·?÷ïÿðWþñ¿ùÏóý¿úÉ«¿þíGÿò—ßø׿þößþÎÅÏ~¥ûñ½Ú¬¡h<Ãt»](OeÅÕ9²•¥;&¶í¥^ìjŸ?jñlðÛŸÞø¿ÿ·üËßýÆ?üɧÿ×ß|ç_ÿáGñ»¯ôÅ­ï}t¼;-kf–ŒÉÖ#E•9Fr^Do„÷N«ßx:ûøÁøÕyë×_ÍñÓ÷þâǯú[¿õÁþOgwÊÛ Ýp–‘pÊ’Y^K8âq‹Žõ]úx˜¿µÓ<ŸVŸµ?¼è}óÙü[o~óåá݉soœ½3ñ¶ÛÐë@tÃÀüœZ`ä¢lT5W+•+Ž^6…ƒnáÞvãþ,÷ÅÓñO¾~üŸòäŸÿê‹?ûá‹ßùøà·?˜~«ðÁ¡óñyã ©êdœÄ2pÔÜe=„H£4™Ž›t²a’‡mõîX|}–ÿì¢ñ›ìüãŸ|þÿþËúç_|çïþà³ßùüуýΨQè ãzçS‰8žŠk,Y0ņ+ŒÊêA׹د?:j¼§ÿÃOÎôŃo½{ðòfoòÄbÁHh##¢SÞªõÏìÒT-‰¦[ûÎÑö㻇Ãsnò`ò›ß|çåÝí'ÇmøìÙV¡_µ\S4uƒàœh&#]L,3zÖª^y`š.‡cK—m½l+uWÚïç/öÚOnŒ÷nÎëÓfiR+ JžkJ š ¦X_B$„Jj‘H2‰dR)况êñ´u·ôÎÒ÷?ØûƒïÝÿOoüñ^þño¼øýoÝùÙ秿óáÑ÷žï¹–˜FSqFУ˜†s9”qqE˜j®Ø-å=>Ñw±›#ëá¶÷â°ð³oÞúÿÛÿíï~ó/úúçß}öÙ‹ý'çÝQÁ°tѬèù1.äpÁNâ‚ Zz7§ e“mxRYçêYyRóF%kVìTÞ¾5»·Óì9|ÍR]U•Xǹ@œ_ 2Kkز2SÎd*Éã˜g™•B¾^(4ónAç=™-êbÝULÑ Ä‘•fs =‘’À9WŸBÏBÀ FÉdŠyµRlnÏ϶G;-GÛkfŸ·[êÃÝúí­ÊQËgõäl‡`­åÕÀêz(CÂÛ<Ã(˜†]p¬VÅÙ–.Û7&¹{{û‡ãý~uTÉÊ^Ísbñô¥eŸ?±x¶ýZ{c%²¦1 ñaµsRªNx–5$¢f %•(ÊØé¨úñó{Ÿ¼z|ÿt·×qu…¡I' 9— Ý8íl¦%!¿U™>©Œ*»¼Ïï?þÿ/IÑše•‹ÅvµÖÏ{5ÓãQ*…¨k›èÒJr5HG /ˆZ´ž¤\V-GÂH:Æ“ÄZÛã@æQDJИÉ{(!‚ñd2 I ´”Gèl†/òÎP-͈ú•¥` Æ¢d–`mÍéÖg ç¡ÒÚn*Ïêù\¾£«2BÅ)}3ˆ_^Ž%)'#”7ÂôøêêWÞ\_ÙDŒªë®a0ŒÁPBd%KÑY4­ˆÊfTŽ5”¬¡–|-DˆÞ$?~ •æJaÞ˜_¨¥^œ’PÁ•¼A®{n·Ž0ÑIS²¤å:“ƒÕzy#±ÈìP*ïI…Êhcr…Õjí{ŒÛ_Cô¤¸x(#-”B˜™&³ÚôG°Ë«aèD”Í3F'#×㤣ìn2_N¸½žדÊfJIsÉíi…¡ì´²¥­à ¼ÙL2nš/Pf‡µº¼ÝQŠ9?`õ"k5\1LXQ2ÎØ)®drDIR.º‚Ug´’`·­ÊÌ(ŽT§™!EšW3Ïëåå@ÌÄÅÛ¥~ž+ëqæÊFê͵øFJN uÞQy-J­Esò|Âu:MÈ’YlL0ÎŒ‘‹Ç“I¹– sqÚ âÚ[k‹é¯”ÅYm¯}NèÝ î„P5FšzynVvVƒT0)aBŽ5›¼7ŒÑ¹jD ›5{pd|Ii5ÌaR#ß»-æœ3Jò¥•˜Œò‚œ´D~Bo«õC³{ZßQkûq¾èGŒs“»”\…ŸV‹s«~â¶oêÓ•´ñ–Ÿ¼äÃCØâ¡¡_zkãšc±Ù»ãônÉÅ`Z¿¼œˆ¤d_LúêRlɇ§„²Û6ë7åüN·7ÓúÕµ¥IÁKfô+Ëp|×Vþ(“¦mÙjñJqm3î¥ÑŒ‚‹ëY´²‘|ˆaò!ÒýÊ›>¥~„h5R+íÞxÑؾ—‹¸ÙLËÆnñnO-L›;ý¤Ä•ŒV•ÊÓ¤\ÏƹãmU'ÏÞþîàìJ„W<ÔZw™Üª4"„é[<–îÐ_^‹3^’¯°î\*í3Έwà6˜&ííàjK,lõ]Τ„‚VÚÊ÷γ)ؽŒÑ¤sS{xßèÝÖšÇRq‹6­½—tv!tÖ^,§%gD¶ŸTiµ!¶l?žÝz ×#TÕ2Z+J¹)©‚jÍíªN·5½ÇyãÅ\âö(©´m@Û;܉3¹PÆ\K° :Š«œÙbœ9&·ƒI1œ«Kš(íÂög»g0F˜9ÄÌA Šœ´ ½ ½#,J«‡3‹I¶SB1c´ÓJk1—4&惈°ÂØcr´Ù#´©ÃÁ©àJ“2»R~¶‘”£”—àªi©çʸ¶xÊf)@\ógDwqÉr3Å15Zi£ƒhm!?eì^Z($XZ{ 1ü„—êJóœ-î+S¥zãŠZð„Ú¤ÍVˆÈ&˜R„(†3yç4_Šd²Ë!‘«Jq[)lGHw%Âø7”³%;ý¦\ÛD¿z-º @Ãi9Á䃨%í0¦¥g#YƒÂ•‹3±´Ëw˜Â¢4¯¬g2ö˜°zÙÚÎéÃÏK“ó “MÊ¥8Œouºc1{n¼¸Ù¦±«×æ~R[N‹¾Œ1¥­g¥ÝwÜñd1m¬IeûBi_("z/.ÖàøKÐG#±4ÙnrÞ–Þ¾'×Î({1YœÍÃÐÎ8Æ:!\§²]¹¢Ü>–íºÓGÓG·?é}èMîWæO{à–gÓ[ïélB,Bi å£lï^iþ¼8{žíÝL‹gNYwDš}Dm@}Rù)í »Ovî}NÛ½Ë!"@9zãFnü4Û{‚›“W C×ðE\©†q%œQ–“ÒFZf¬›Gåz”)(å]½~ÝçÆÅ:aOá`: 6Õý(WcFg~_.LaWâ|R®¢z3Ftn‡0; bQT–Ýž˜›PF'JX zœ737²í³lëÆfBaí1çmÓÙ üVˆÎmàöÕˆ¦òzí“ë×BDœËe¬.“ŸÑ¹íŒÕ÷ãÆb!ÔâvB¬Ã¦”†T9$ì1_ÚË8Ó •g½™Ù8YM@Yêq¦Íß/·ð:£<±0"ÖZ„_ÌÜ‹ ›fë4c7bìZ„ÙLªÐw {o,ù¿z5ô¦ Ñ%ÎÝ’Š»¤ÙÛŒòþ¤ÄÐ&­í…™\ŒÍC»qκ0¸—ïßAHÉEÂjËÕ¸”§¬íy(Bwh5ö+[wÅÂh×ho˜/à˨Öp•¨ÒK-.ÛÓª»2 ‡—ÍÏäêayûåäÎÃ÷£B8$_žo?²9àU@ä_Ø·‡ìÉC67’Ý–ÕÚÏØ]ÖA‰Òö€ÍMÌö©^ßGšRÙÚòÅôþÇ‹i£z·øÊaZiB¿×G7·n½^Iòt¶›Ý/l½¨ì½“ÛzÄwârC¯íÏ>È nPˬMo~Ð=~»¹ÿr~ïs¡²Ÿ”*Ø—«Öâ:Œ š68ù¨süIqç}£w/-T“|t›òKQÞ—Rq¥-æÅÒ±Þ<·{çqÖdݞѾ)×OÙÒAyçEëøýŬ>¥½ÊÖ.…áÒÙ6“Û’Ê;JíˆÎïù‰ÅÃnZakxô“ËT‡º’ +3gð€-ì‘…]Dï°l¡{K/m¯¦”8_ “ù”X—ª§Zû.“ßÓ%»¶{òà“a/…˜ëq„‹ íÝÜÿe n?ûú÷~ü§ùîÉÕ¨¸‰Û´·UاuóÓÊÁ»båÀ[Nç¨ÓzBYò“ ±áJP?ÞàV;õ%´0j€Å„qu9œíZŠŠ«ˆA8S±v掟|u9y͇ÄH+L:ጣrq¶ÀÝ0S’ʇVç¦/­¬/fß²“|1%ÕŒö­”PAÄ2¦5IgÊvKÓg³3fèÎÀéŠãÛPTÙö‘Pq^ŸñúåùC­¾O;ýL¶¯ÖNò“§ùéS¥zˆêíŒ RyŽj5ÜèÐÞŒÎï#Æxc÷ym~º­Vv@Ǹüa ¹â®T?à½þäøéîÅ'bi \ >+¶*ÛOZçK½<ï_üʯý¼2¿ä¼LvìÕv_µßËn%oZC”Z”wÓF=Èå)oÜ>||ëóâÖ#Ú›0ö :J؃¤\c‹»…ÙSµqÊäæFó†ZÛ»D7ʨO­æ\*Ï"|5¥öøÜâ~ûÛîÞýè*´mJ¦Ìacþjpþ¹ÜºÀ¬©5žòãBï,”±)«?<}ÿÙg?zöõŸŒ/>ãË{1®$yãO¾ý3¥8»“b\U(gë¯gw¾Yœ>ÁÕjw÷A®s¸œ`ƒ´‹ÛS½û`xþõÖþËÎþ Ö!rÃëß +nˆpXoÊ•öHwê—>輄ü"º»wÍo3¹ ëQ¹EíÛïÝ}ýë I¾¬×Nôú‘XÞÁ­!ª¶|…2•ùøû¥àG,©¼­·Žþ­ÂäþoTpk{ƒë q)@á0jÕs:7gÁÝô~Zé^‹ˆviëÁËo)Nïß¿±q=±úgL¶]ì߀ß%.´6˜ +´‰\=È/p½™Vª`vîàQiçýêÑûÞü éô¬âtçî'fk/&xreÏéߟ¾>{úÅéÛ¿Þ>|iTw:³{Íí 1?qºgµÝçNÿnq|w|öþÁ“oÚæôöðè]±¼ u‹èͤT‚ʘ#¥vBe‚×ëì?¢ÝA„Í-²FõˆÅÎo×ößÜújR®ìݛÛ¯'_w·žaöÄOçB”+ÆùÉíÍ Ïå{˜Õ'Ýl˜Õ½É¶€9¯…iDªðÞˆq;d~B…ê ­yj6bŒ§ÍBïDÈ H£ª×wÊûÏìþ™Ó=õ·½ÎYœõ@µÆ±¶å¹Ú<2»wøê)Cnt!Wv|¨Z™Ü©ï=Ê{ry ÓÚVýpïîG„ÑÄ”êøÆÛ÷>ü­Ý§ßꜾ.Ξ*¥9ê“»¯ô£a'ø¢QÝ«ï¾¨í½¬î=-ï>qå‹—ßýÖÑ“_Þùtxë“âì¡èÖn?úèôág1Ö Ó^Æêqù)Ô@¶O¬ãFÏkîß{ý=£¾ hwÎ¥Ú‰ÒºYÜ~~ðü{£óÍêÁáŧݯ2nWëž²ÕÜݪ§V÷Aiöœr'ŒY¿÷ê;½ƒ—‹§ùbôPk@8CLmz·«ã{»çÏ{‡ÏsH.–¥Þ +AK +EPÚîÉ» ÙóvûÀݶº7ŠÓûFëH àÇB•žF´»Ùþ-oòØ›>«î›<‹;`@·_~qôدpµX`·sVœ<̶OÕò 6£VG'/''/­:¨ý_ØÒ«»…ÞññƒÏ¶Ïß e,Ñ÷_ o}¤´Ï¼çgŒ3>{ôi¾¹ÅÔůӻ¹ÁM½²#—öw¾™ñV*—íÆi§¹ÿ|çé¯uî|f8£{öà.éî¬Æu>;èí<¦ôv4#§;œq0© ÀFšƒ(á]ÙÄ#‹±†1&5Ä0‡¶¦”5•+§NÁô!h§¥J‚+…‰lF­/&G•ë!j]€°Ößþzuÿm*7Œó^sï ªÒxB~@Ú 9c·}äõnPv<£8´*ýBoÏj@wÙ›­y­=¥8Y‰3¤Ñ†Dy'ÂÛ|iKkœÍS«y¤×ç1ÆíöÍ¿¶ýè[jë†Ñºá‚ªäG¼ÕÞ:z + +–kÅùóÜô…Ù»çl½ä+§PEiÅ-o<ü$ß?yÓ‡¦¥ú"§h­Zí [Ûm Ï>ÿÕ¿úì‡~*f‹˜1”j§Ó·Ÿ}¿~ò1ÄÕ“»ï}ãûXœmNÆÛÁÜ=ÜÝ-ï¼3ºÿwt¥l½º­V¶¿œÝ·°š–j´5°Aî}´{ç}»¹7Ü¢–æ¤Õ£ía„-nâ&8 giü@Ìx•ç³ÝÞ~<8ze6o J“P…î‰UÛÆ”W=¶†÷íÑ=£s<4BØQ"k·!c®F_ZÆõS:4ºÎm\o¥…buvk|ómp“¥ëÃtÌèÚýûÙƱUÛÁfB@XÃn째òz\*º6Rf’+»í;¥Ñ3&;̵=h" ¤µj¯Ä• æ0ÎÔhœ¥ø*3ãö¡ïB„AŽ<™2ùyBn„Ù|Z̳v۟ѨlÛî­c­z<–Ÿ¿ÀœA€0ôæXÝñfZ¸Ô'¬.螘Ÿëµ#ˆê :[™Ü-o]Xíc¡´M¸ý˜\J*5«u\>!”Òb‰qœ3pû¹î‘ZÝÞÀÔŒ\Ô«Ó¤`ÑZAðer£{ °„ÙÅô&`$ëmQÎЇ‰Œ]7»G•ÙƒÞÉëÆÁ«ML £’d·š»¹•ZÌAýòônu~·2»ŒDª Þ›‚V_‹PÐFý`vóC µ² þy=Ê(Å9*Wãt„²äÒ$ßÞ«ï¼ëÔ·ÃtN,Èå1¿1"CZïi¥ÝîþÓÉ·£L.Ê–”æ-gëm­sW(îˆå}Dë@`Ÿ¾[ì@ü3Dmåãó_ií=+n{íHŸ~û'íù£¨P×;7íñbZõÜôÙøè ØAÜ`rÛzóVnüÈîž+¥™ìn¾üè LoÅ„BBme¬‘XØ¥œ-Dí&ùŠUÞêî?Dµz\lÆøš[œ¶"f~p:8y™`]R«óÙ¾V†½xÑß{ŠÉ$À<+fû£ƒ—¸T¿²I®DD µÚì¹Ó¹ Ñ/Á×ÂÖG_ü΋.­¦.ûˆ]A”^¶~êÔOÀ7I¹$–¶!%ÁQS¶˜áZ‹p§ µ“±Ùö£qn4!ðB‡qg¼!™í§”zR®ãVt»sò_š]‹1¸Ú%Á̶Õ9AÕz‚+$…BF«ºý›”Õ™R*»f÷D)H‰%½~ØÞ{tós¦x$ ++QÉ,ÏôÚnÊ^±+ÖÙ¨ÜK‡RýdU£¤Õ˜?D?Jñ…“ƒ¨ëµÏKÇn÷"a„)éÍSÊ€Œ„H ÞAÕ|mwÿÞ'õíûˆù‚Ø[A˜:ŠrÅ@UkLïå[Ç œ7kG¹á½öÑ»V÷N€ÌoÄe=7nÎïAãr“rÆÖ µƒêÖC³º—¤éþãöøìË™œÕŸ‡œÕ:|»wò~Z¬úãÊ([ÚL¨aÜÚLkq¾È¹#Éë;• ¶xšLä¼™Õ½Ƴ›QvÕŸ‰¦URð2fÓ»I©ŽH5½¶#ä`îR‹õ•æåùsˆcBq;€éL_LçÎ8Rqöo›Wœ>«:î<¥œÁrLª•Kq±DæF ¹ŸÕVó€S« }å­ûjãPªîJµ³}À•fq¡ñ_¬ìúh¢åLÙÜ 7q¡¤=èÐòðÌjF¸<¾ÏÓbÔ>.,fŒ‹óÖÁ‹iÆն.rƒ;€b~fÖ¡žC¤CM.ÛYLÇÇäw̶ $FY7%z)ÞÕòc¥0ÚHÐk1bæÕ cËP´Jí“*›NÏ{@¸0½Ž™´Ö·âœet|i‰3ëfm[* µlö4Â×}¤ò\±wK*ÍV\”4RlÞ˜¸Òær; ¹¹‘R ÏÛ¯!)_^GÀDWoÒÞ}ÕÜ}—-\rë) ×»kq!€hþ´šd<  Éšõ#DÒ¨ÛõmLÊÅ3BÛI±Æºc½º'·AÌ#„á¶ösý›0š´7ÅíñšMÐEà"ÎÄ)—VkÕÙ€+|X(%Vó}¥•­ƒGíÑ )yŒY³j³üàFcÿq~xk#¥CZ7$Ä:%×/¯eV#"®·æIyú@ÊO#¸¹ælÁl‰ù­·V’W7Ñ0ªÁÃK,îzÃÇRãŽTƒPPR¡3j%%*dtãR#È–¡üH£Be«q`µÏÁLæ‘íGø¢Ÿtד"Â{QÚw+L•çO¥Ò ´RÞ&¬6iÔJƒ³ÊÖýçFX'Ê»àïÛ÷>=~öÆÑ»\e?”1 „šÝ›1¾R¦ + ]jyw÷ö‡Íí{jeÖZ€Y#€[PHÀ!³ߟÞ¯ì¿ÐBÊ…RïP-ŽP¹š*PT£+xÛ°³ \ׂ$¦ÔI«ÏÀÐä§!6¿Ž*qÆ-tO%wxy=vi-²g!€GÙr\nDø +Ê8Va„¶ç)gÂwÅê @]>žT|{úÇV}+„ËÊôe²)±¡UoˆÅ}Ö儽¦‚ÈÕ«!Ƈq¡Ad§NûviøÀíœ]ñ“i&WžCm¯'_Zõc¸$ãͽ›V¾8ÛžÞͷ„Ê@y¾´¾(½©—fkQêšý·ùŸÓ‹].…(oY,ôcVw­ê^7»O6­ÞM©´‹.fæTWB$J[Z®5B5TZÌü£Wš@š´@ÈùÁÞ…[›à|–²!:}­zH}„¯\÷ákaÆ©ï•Fç×ÃìF\Z±W6(]µ¼¯”v£™¬/Îñ‹§½jIÒ݈ +´ÕZxŠÞˆP^’/€vA+=Á :‚ËÏØÂîí"æ(¥4B„ ”`sÁ´†òåŒÞåKjëWØÚZ’NE»mJ«f”:k€ÀÕÚayëaeûn 6Ó{kÙæaatk|újzþ®Ñ:Bvqz§yôBª\‹s`ôfýŒ±æ´;CÔŠÓÆöãéÀ(H¥íìàantp 7û ¡¥]L,Â/Æ5IÛ¬=Öë'ÍÝ•ÉCÞ‡){9Êâj ƒ—Þå„ .–Aú@bLa3¥FÈ,Ô¶Q•ò~qö¤0{XÚ~ntïEÅDµ8®ÍÊå$Ô°;ÁÍ—›ÃÇ«Ë1¶[ž>ú‘k+Ib8ªuÒr]«èÍÛà3Ë6É–w‹Ðû„Þò»Ó¯EØKk(Æ/¦MôZ„´£;Açh£“–ªOWRS{»ÙÆŽ×xoìônkµCÞ›Ã_¯ÄÄ·VSWýZ«/m ˆ7•ùÓïþ¨wö¡Tœ_ÝDbi¾::WŠS¨LJ_ZH#€d˜Ür˜^LÈ£Ô7Ó&8ø[-ü+Êçµ€0 +­å)½ +Æg%LíZô—/‡ÖÃÊh­æK±«Q2Éæ|i(Q‡6û´Õùë~ +c]”³WƒèõutÅOcx(HK‹¹2ì‰\>X f²£Ý -ƒ]ÚõfûWœm¢úe_&œÉ&¹*—ÓJ•Ïo)Õ}2ÛK 9Æñ$¥1Vre~qæƒêÞˈP]ŽÒ)ZͲ”­qv“ʶ ATgwÿja÷1êc|‰·{4ˆ'iV¯4yxüø»û¿WÞyo#!GQUÉXoœËP{”=!²[nï¾Z>Š³ù`Ší®àŽH½±Xy„-.GÄMD'ìQ~üP©ìgŒFat®Övô Êçʬ7Ïö.ô&Ä™oUÇgÇå +bõ‰ü±DvÐØy”ïŸ!bAË ã»àÚ|aŸ‚QÖ;¬ÝÏwNš³û¨XÀåŠÕ8ø4jû|n–à«`m×C ”`v6!>ü¨\ÚË(ÎøS¯ì1Vw#.FI7-7ùâ¾Ñ¾éöî r´4Åçk³û¤Õ±…´ÜZG²°GAT‡ +ÁŵM„Ѫfi"8­²›’«« a5LrZE¶{¾ÅCs¦˜Û¢Œ.7b”Ê8ׂôµÁÛýŒÚZqq¦ç+¨ºXw,ο’Š×±ª»PZÿn1×µP¼0B­@R]òK~Ìmî¶w%™Â›+(¼a= +žUM3yB¼æ'ÞXŽùr1“|ñòb~N<Œ)3i¥ƒê=@t> ÏûÖR"at >TÇ >¯¸ÚþfÆZKéi±@UšG¯Ð¿5½ûÒö+®.NFGESKœ7”ª{¤{ Œ +Ù4£$Is´Ýeœ F¶²K·!H ¹Qšw¢„±ðôÆÞääÕðôC¡zÄ”Ëg”J„4c´«U„Ü60ŒÖ8§Y0ãS’`µ2Rn9„†p•4ºaÜEĪTÙ…^N %B)å{GˆT +e¬ŒÞ¡³Pr²Ã–0î¬Qõº'ŒÓ÷a“›•wžõÏ>\\‘œ>"Œ6dœRkßëú0‹0ÇÞàÁøôý»¿Ò>~WoEpÝ̧'/½ö¡U6RòFR†Úæ)ÕQÆ[dToP_@·¦Å:¨A³pµ³¸Ñ"· (ÆÍBç¬8ºG»S";L +Õµ„㘑%ÎÁ&0­áôî@I'Íî0*dÙgx—]\pœÆçM!=E ;£6ýiíÒ&@ÍpÆ^p Ê£ô.&·’‹9¥M°­_‹Šà~ÜÜ€rÍØð£p” Môò¶VÙ fÜÿp% ¡ ¹Õ¸êÏ8ºÈwOeo‚O¥´]ÑQùÕ }=°Xzv<’±Wã««©ë!"â!2î4Û:ŸßþúÖ]¡ÅÒþzJib³ÊhÎ$ãÍéL¹n5Q©˜àòNû´<{XŸç{§D¶ç§` Ùy}>ÛY“DÝL* ®ŠªÍ•¨py_ +’Ó+ôN‚¨²º˜ÆJ'Ì^cþ´¹ûŠ²F+á ³Ów›[÷C„–êà›rqW.ïqÞdq7B˜s#³±fÜKr³âBÝÓûiÊÆ™¬hT{ûøüdÏ^ +² ±¢òa¦,WŽ6Òò&*Y\óÔójTxs%uy “9(­«2JXrq–íÞ„êÅÔf’+o¦õåÀg Sº›I—ê|ù@ëœ3¡è\Ñ×#ür€¦Äz¶<_ö£_Y +½µœFØrš-†0=ŒëËaˆEEfo,T])Û­£ÒøVir»¼uO©î%¦…2íØÃËëÝn~PÙ~錱'$Ø,ª¢l–q'RõŒðøÒy¾ÿ¨2z(åg›ˆ˜dmÊj%…\‚u%bŒÇ9ƒÁñë­»ßOY‰2”@¨%pÒŒÙeË{ ¥™íÞ+LŸ¢Z7Ff+½#½4 YnùÐlŒÝÊ÷/ÜÁ£´Ô‚c€ßZ”½mÕC;BçŒúQóàUâ•#µfJªÁx…Hz•ëäâÊÂJ”K{åñ½ÁÙ)¥»bWbЋ’QÚ:•ªõ[ƒÓO»Ç z{5FIæ:G¹Îaœ45úŽ+·”æí”Ôª¹âÇë§d{ËAꪟ€‰/Îî­ TnD s9D„‰RËþ4É(1 +ôÇ$Ô¡õ0¹#mRo‡ þ))zÖÓ +ÒÊR¯^YGH©j”÷²ÍS¹²%½ª&3£•X­ËH„TtkûVm×jžÖ0&Ô.m’k!"µ¸¥Ê^ i)®ÄÙ#ÞÛŠS¹kúkש”o¤9gÉ—yc[K[hvKî>v'§ïÑV®WÞ„´øKKñ«f9©ÇÄáíËÅ#_\|k9Îjõîüñ¥•ô/] ÃRRK,ïE2tqœ±ÓBµ;‚Óf­©å´\L¥•Uó[fãuzi!oPÊ@°å0iƒªCêD!|e»I±@Y=¡°C¹3h\…â§]ÚIåCÔP½I³“Qzu'“í/§µå˜â +Jq‹±:Feß=DÍ~Zk‡¹â¢à8(õ¸XY‰‹¤1 9ªv“\Øx1®G€Oìã]¬E¨ ªžåeŽ(k»‘Ò¡¡r+I5)7½ÏzÛà‚¤»š–”.Ax“|1˜9„íWjG+Iñ­ t=!ÂpGé\‚/ÖѺ`èùÞM£~LÛ½$•…8†ÈUÈeëˆy-Âû³‡àÎq¦¸äÃ[çý˜…i=.··’P}ˆ͘d\R.­…3‹Ùª 8ò9ÂèB ‚¦XŠQ:‰cQ—#tR¨±îÌîÝfð£Úå t3Âö·î9•­(¦úbÕâ„• Lx­ùÓηº»ㇴRX‹ kq š1cNcôÂ}1j#JˆÞ€P«q!ˆkQ0 +J)ÊÞþ8—ê˜ÑÇaŒk\+ÌF„¤¤<0ùW—S+A,,îÈRkÇ”3¿U¾r5Ì–kBv¸ã•Ü„óæ¨Ü  ‹ØÝ„ò©ÕÕâ&ä“Ÿz µÈ) *Ëš17ÕÊۜӧŒeV¤¾X>/¢B†4[ˆ”O ^F«’f›v'qº˜d‹¤ÙK;õ½—Í£×Rõ(€ëðÄ‘]„2Ò 1e¦ÅŒ^•mÖîÉù)Ðù¸T se"UåSØÏ +ÂÉ üË›ú€E¡fV¢b8“c)"U.¯ÆWý¡V6’ +&·cLe5¡¯§Œ8["ÌAˆ*‰Ù ¢ps´Ž[_õá_ó¡« —*Q\OºàrØž‡ùÒJRâŠ3HèX”t„Ü\oœk•ÃÎÞ;ZeJ‚–Š‚Ý^‰×ÃTˆÌ!rK)í×gÏ({ÀìëA:V6“Òõ¼‹ë=Ð=· „ïO+K›ØFBs9ȃ!Ê U`xÆÞ’‹ûI±v)_Ë@‰ 3öP,l¯$@#’/Û¥Ê@›Qx`#Æ-ˆ• Lð’VöÊÓRk{5”¹ 'ôØ<¯'µ«ú+KÁ"« F\ÝÀÓl>Á IÓ| ªëÒJò¥PšÊf«éYkqÙ—ÔüIÅÀþ¢+€K> +«…ÞYŒq6’"üï?tGðç’Ÿ1 ãÇ|_ËMÞXN_Þä|ÈÄ—äB˜ +x ¶›¤]¨jØ0¨«4ë.æéUJ¬Õ"µ èõ•Ò.ãL§\P8Feƒ¨ìGDðˆ$—" +âfŠ–šÍc§{j6H«½˜„MÈo¦$¨mJA„ +@,dÚBy$9ØSχh1&g÷ïËõ[bõ&W\¬Îä @Ñ)¡&ž µ|"Ž(kBe'˜ÖYL»žŽ¤F¯ûR +›¹}TíÃ7ƒŠòù½E]‰É´DèbZéjRl‰ù)·HÊivç·1¥ +È„èä¶X¹^È !fqíZˆ ô–òå9I(¶8W\_ä <ûK›kq:Á4’|ä4€ÛK!a5¦$¹ªèÍI£s Ð(!3‡)7!ä×üµ0ŸëfóL­ì%ïàâ“ÁÑÛI©eÊI¹á#œëqiÑ =× †"ëm¡êbË(¢ƒÕ‚…]^Ïd¤z3¡„âDák’3‘ì*”¡Ô—üø—KÛóWÖã×6Ðë!.ÊV` !à ‰iãÒZî‚Ÿ^Þ$¯ùi°0_\l­&—ùjìkדaÌ + Úr½²ž?ýˆE*mÖìÆ2Öå d9D-‡Y 2T¬D ×—ÔCˆfGÕÁüõ„ic€„@Æöafô6pë­ µ$7bFi*Å9e¶ãtÖ‡€ºÒ1:ÅX`^fë¦\9IK Tª¥øÒjBzc-}ÅOø +#Îü¨´ Ò€hƒ(”XÁ”¼ÖQm)H­Æx¨0$©§AŽª„ÚŒ¤³}H(ˆT•J»\nš–jQÆ„.¡€dt-Dù“BF®’z Š-š1ÓÌb6N½4Š†¦X ³°ƒ_£LBª’*¸TO„EÅ2¤68ªFë6_<„²s3 ‹ÓÝbòûzRŒÐ®\Úç {)© +I|Õ/qj¤„íÍ„}´™În¢Àíù•˜¼äeàÕâ8%Á@×b2iMøÂ!ëíyðÊÖµ0êN·ž’—"4ªt c ”ws£ÅÉ Ï¦ÉÙæíg_tw."”å«)­“TšQvq€àMi=Í:Ji¶á@K¢§­˜Ð`¼}±thDp…æàvÕ¡a×@Ì“Ú:j+µÕÙÚl_Z‰&3f 7×b<äM¨·kAæÒ&"Š\~”ÿê&ÁÀ£ pTSŒ †µ‘T! ùm«y¶æ6ã2¼b1GPÌ¡´¸µãI£Æ_¾] óÂ!µ6cvp©LWÖ©ëA•šAÂFµ~RjÁ+.5ÖPJeq:ZªF¬—Ûœ»ç*!ÜŠÓ6"•k`·nJ¥ƒU +à¹MÔ …娴ŠêÊNò%È¿ ø Eðý@×À]Purå¬!L¸!ø•¹],ÁÔ8eázÍÎM­~l£l„ÏãBÎ®Í ý3pö(_Å Âz\(%¥"ŠÁ™—F”GnA©D0m5Da|^r”RK±9€+CÐ ÀÕE`"cRú‚sGèb-³&3*WXg"mÈãäào¥=š J<ŸÖ!‚0ú«•nŒ¡clŽ²û+)åß_ +€J¹&×Á§®‡HÀxHú…áEqô B{LÓÊ;Ð!\*XŽrkqj¦<½h¿G»£W´Û·€ýkQ×SˆÛR€A¸gw־̕‹Å¡Ä¤ð…knÉŸ‰`FŠÉ_Ý@€î F¹jJîpùyR(­-ù0h.øàJˆÉh}D$¹zŒ.“úå Kéë>"ÒÞ\I‚H¦ALªÇRåxxó³ã—¿mTOß\AýqÉŸ—63`Ç×ü‹ÛìS|%Û¸átÎqµ±æªÃ»´Ù Ùë1y9m( ”QwïÙ£O~שŠÌ /)4¤âaFëq|¹ZG6Fç"¤—Q€¦ÆÐ ~|qNWëña° µ×R8 •Ý¦³³µ¤\½™Ò€©€‹(söŠˆ%à| q?n%…¢VÛϘðýy’ af’¶“”òËh˜Za¼Áâîßü>)¦6’´ƒR&!8ˆà…©Åµ½v æaÜ +¦R®âBa3I/­‡6b„?%ÒÖÐíÝNK•Í´²fQ6Gy_ŒÝŒq Ú¥¬¾\=抻ÚYY,²¬—ú1%%•#l8‡rÇ •¬;íÚDÕŒÙVk‡bq7)6¡é f´d7’[‹R¤ÞÑëçi¹žŠ¸Ù½šP¾r=LʤR݈2+ ò8ü.(¿Ù¸!x”ÜL«6‡”! ¬© êâb\ëàEïÆkeQuæÖCÊXÄCÊÃ@'ØJŠ)¥¹âfR€fÉ(UÊèÅ­„ ¸SŠ³E?j|íjøÊzÙ—¹æ–cb Õýp„ùšRÞOPÞzLd³Ó$)Õ ¤ÕµûæõÐ[ËQ(›U„…ŽÓš§íÓó³gvïëÎW£êW¯%Ãè´ÞZIS*ø ïMÖ9k “|\:®5"8`3ÆÃrû…ù³£çß¹ûîwön¿Þ@´1¶˜`K¸Öfl`fÖê“F×Û ¡´–¯GåU0S"—« )P'ëˆas/“~_œ"^Ô!á¤ùrŠ/ø1Ð7N9’=ÈwN¡×ÓzŠ/®&E@£SN mDêÅ@ 3v’ö@1B€mŒ—êÙÎ-«{†Ú-‚kþ´èGW+‚˜À²qˆÔ{à¿om"WýHŠqb¤̘ ¾ +R,Í»°G+Ari-_ø¦½Xi‚Ï'ä*¢w k„iíMTYŽ¸Þ Ý±;¸cön§”V„e³áŸâœc0²éÙq¶÷Àî=¹¸¼‘^Ñ1Ê gËw…©jŒbL¢.¨ý×cË~ÌgWCDdqm±’ªaÊ–£­Vˆ4p¥¬×Ï„â¿Xø²‘–ò£ƒd–2šZi¶‘’˜9oFf{ÀZAÔZ qW|èzŒ÷÷'į] •Ôš¸ÜôaÎÕ05Ì^ `èo®#@&AÌI 5\ë!RÆåZ¼ê[ÈÎ¥udm±˜²¶”þå2gi¶ÊX“´ž1:TvÎáôM_æJ@ˆÐU\®ŠnOt»W}p-0MÖ«Af)ÈŸn´2Fw·@‹À¯å¸ÜïŒ)µ†Ùµ0 rPÛ@Ô+ ùj„ƒ×zJ¥ô¶R>k'oáëk1B‹{|)€Ïn¡ÆQ»0àËP!ÂYKH_Î8ê"à­´£¹™}`С‰ e'Ø r*3¹ [·}»{ú¹;{cÊð%̈QN + +€÷`³Å½¾'xv…ô›T PƒzÇ©\œÉÇé +alQÎ>Ÿß2…ë@ˆ4¸U?UËÇcèÇÚK˜ÒÀ‚Kå+A‚¿Õ8Ò›7Ãle5!¢ >•6Û cr”Ê’F»>{Ü;z3Z똶†H¸VÇõîzZ €p%¡x$UÏÈì–5/m¤VÂd8cÈ,îàÅ]hÛ´:ˆ u€=R®¬†éå@Ø/oêí)u"`;ù ªbR9ˆ©~â O›]·×^xƒ‹0Ð.Z /ÊéÊ&¶‚÷˜„Ñ gÌÕ}e¹î' °£Döåø’§È¨³uc3.ù3K Sr•Ö·ô0ׂô›«X1â r×)=AåiqçÃâbLÙDlP?±¸{úÖg +ZåH©Þ ²£¢ß^ö£×ÃDšö|îkñ„ª•w{ÇÏÌÖ^TKZ\:Cäì1X30|Æší[…ÑÓ ™2Õ8H%SZKkWÃÌÕ§Ülí¨ëJ˜šdó¬Õ“ós0?æ@îÖ+Ç´ ­êP€À—ŸÄ•FBm +åƒòÞk©zºø ®ð`Z¢”–àn§Ä:n`_`p)½Øœ¿…£ÊÃVIÅmÒêÁ–ÄÙr”.QF/-”|x6@æ0µk÷.¬ÎŒ9Š2EHÇ)Î#õš”ë[í£L¶o´Îò“ùéT€äB§¨Å³y—Ú!ªŒHõ4$#ÚD[‰dB8Œ~ßîÝkLzs…[‘.&ÕQ©˜–<¡8"쭤Љ1‹3$Aܺ¤`_| 1IgI³ ÀFeÇù˜ÔÄ„újD¸¼‰mÄÅ0–]ƒ÷И`½ƒŠM í7WS_¹ÄùÅIžjú1 7zZõÀneÔÆj$ãOq’Û“½éW¯ÅAü!Þ®äÐÕ8]\í] +dR| ôŸ±§‹e—•^óÖb¥ !e¯Å¥7WR¾” +å$‹`ëIãZ€¹´šŽ"Æ{I.fòis䌞Ôw_i•cBiA+QF«0º¾ ‚y¤\RQÎxÁJR‚Jˆ“®^˜Z•m«~Çv9ªÂ7¯%40¯K|5-…ÙÛUjÇt~ MöûŒ7àÐÁ&AÕ^”­Á/…™•ÀÅó …m®´/”öq¥YÄŽ3Œ®v2z²9®Ôp\5·H˜Þ²Ú7ª;O;çŸeœéÕ8±&)©€pž/%­ÆXðÖ›óÞe ®úÐë~lqz0¥@4@ä²7@Óg‹´×[‹ûè\ZiC|£³Ã0S„´…ãŒÞEø"äp¹È¦fç¸søªyøŽX;ÑåM4›€sºqÆMðuÂœ,Vöt'¾´†l“\g­®°¸_wëa$©É¹[¤Ù?EäRnpcqž$©Ãk5©¥Ä„Óníêf:Œ+J~,䦴³¡ +›)s=Åé0Œòp±épΘ°†q¡@¥h ðCð_RZ,÷ƒg%¨üú1çN!Ø®&xh[·qÄh­÷Æ&(Æî •CÒÝE¤Æ&TæJz5*ârßV}iƒÐ‡„6H²UÖ\\?Y1< ÔZ·–PBLÌ%ŒšqÔˆAv৑Á×ÌöMÞ¦ùJ’.Dɬœ–§¤ŠºŽhÒKÈÍ5Ôº7PˇZ_ȉj|AA½ß gŠi ~ârˆ°ù_ ÑÞ&aƤš\;+ì|¨tî&„*4HºÏ +îÌn_ÎnŒol`öÚâÞ'L˜‹%æå&ø)F`9T®A?BVZ‰ ó“|Y./¾\O)¹Þ™ÝÙÇr”ÏGYб";’fšóVÜJŒ&·×ÃÜJDXÉkQ!šY\>ˆq.çÊ[÷(w@cK $ «ëI…´ºˆÒÜD pðÅ­_Ù!›ßÁÔ¶U!6†3¡Ui³Œ+€½´Ú)L^ðÅ#ØÚ•Ûˆs¸ÞŠq¹ML÷gL6?iî>«l=Ý>ƹ ¼ÏvoÆÅ:4Ô&’…˜ƒë}§{K,LÖbÜFT¡6'tkBn­£Yh–«A"Ååx»ëÇuDé$¥nÆ—ÆÏ@Ll1FzË!6  ÔDåeÜ”ÐII=ÂB‘|õz|9L#bèýZDŒ°e­uClÞÒ›·KÞ\Cß\EÀ> |%…²/ã‡åcÏ ìSl ÄóÒ +F® +Ñoj,»À³+Ä¥õøbÒ€pÆN°ååÍÏl$¡B\T¨,žÝ`\_Z}k™½%ÔVZ(GˆìfBÖò³ÿŸ½÷ø‘$ÍòÄîë@Œ¨®!]K3s“nZ››™k­µ{¸‡–"E¤•U•U]U]ÝÕr{¦w°;ƒÙÙ]4ÉHbI€Àà…þ1ä³ìݽÌeÄ×^Ñîæß{ß{?af¦66(3,‚Þ¯u×kÌXS«~ b1šT‚Õ ‘¹õ¤!a¼oÌöqÊhòdœëNËïO‘›ý˸Póvœ/&¼?hPÂÕ:Ì/ˆåS>¿ ÇA…<£–¶­ÆÉàä[gpÉæq6ïKé°¨–Ü +Q6È»û¸4}­Öw’ÞŸ†Ð@Ÿà ¯2ݘPØĤ(›—+Þ/U‘zín^òЃ)¾â]j”*¡LZ=µ~@ÚƒÕ„Š‰µ•9\©ãj ÞNYƒLç2eô×P-M]Ý5šgàµò\Ξd·k׶YwÈå&*»†€órj@–GËOhf}»»ÿ|vñ!Ó9 +¨ˆíª¹i®sì]Ç”jFußnz÷¨—w6éÓµX„0Ó™>tML¬ð¥ÃLÿYqËÛ‹1;1ƽNÇè  ˆº(í¬ÇÄ•0Ž ‹˜›x· ²…|÷ôã- ²ŸÈM¬ :, ”VÞV 3øè´Ý ŘØܤŠ›xŽ4&…ñS·}˜d³É´k6÷G_l?þu¶wË´—×ý„Š\XhøRëŒ^ÿ]ýàÚ‚Vߌ+\fTè]AÏþW? ¶A¦äVûüW½ÓoÔÒæ ŒyHg:!""³ H  ìåñÛ¿7›ç\~]-V¢|9!Õ1}@šèT¬•k7#¤„'²¸Ð’s;õ­laê§-«¶Ÿ|@ÕavRf+,””A¶ …mu¼]¡…"••¦ïª‹¯ÌÖLª‚JñÙXÕ¥\šÓÅu<‡Hmµt’í=—Kˆ"mï—"‡×Vç +5Ú~Úöã£6¢Œ³ãÖbÊÍÆ™ÓÌåæAÊZ‰ 6Õ˜MÒ¹™3x48ýE}ÿ+±zJCZk0k-*û½›ÕKˆT×jÇËëßWï"|‰vzÙ޹ݽ’ŠÛˆTÞ$ÌMÂâ2£¼ä<ðD¥:etö™Ý¹HÊï<Œø̦T“R9!VÁ2Z‹ÖšžÂô$_’¼?|áýñø6€éàâ9KÙaJ­Òv_©fGי΃(“_É› 9Bd‚¨£ŒenDØõ¨€ eµ°‹Kp›Ij#SÝ1¿“8gÞ>þFkžÙ%c½œäG•Þn2­æOáæˆ+ZÝëêÖBa Qß Ò™Êb~þ±š>Lÿ4Àl¦,±¸ jY÷öõö®•%p:h0+ QºŒ5©Î^õ¿E„êu"„™PN”=€²¿`¤ãË´ Ù;¡õVˆrsÃGË'¿¯o¿×§><ÿÿüƒÿ¿'ðÿÕ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦ÁÿñOdäÖþ‰ŒÿÒï×÷&ÚðdøIÃúÄ/gˆ>|_ŸL>É}âï'å£m1>Yìï .ÖÒð’Àðµdi:ÜY ýé•kð¢µüÑb¾Øƒ'ËãáÎ4¼ƒ—²ðß'Ⱥ†|ü_ãâ“8E§¨J 8‰"ÍàkEÐ a(Š¤á‡äÚ®÷"*•HQFb(Jàô?~ÑŽ÷"üãs ‡  ^D|š¢PGñ?½è}ÜÖ‹þÑÇm}Rÿdï“â'ÌZ(¼Ö¨CTòô“Ãÿê÷1ÆbgšþÓ?•)dä?$Þ 0?IjÓ³ÅxZ2•µF÷f/Ÿú²öŸ‚òBÆÉE®u×0]CÒ{ÿÖÞ;¼ýÇwýÇÿ§×R0K”ú8a|Í{/ò‰ßÿqŽ^¤×ȃ¡Ÿ42ÿEJ®F'ÎeI­NMJ­§¤ZR¨Æ€¶G„Ö„òŸöý–sSÖÐV'!#i7Âx;i`r—«É´›Ök¼ÓUK3¡0eœ1epsÀfÑtÖ—ä|q&Fh„RfݾX\pÅ%“á™^\.©ŒRrn˼;SK;Fý˜´¨Ø œ ¦¶âl!Lf0¥Aš=Úê©Õ¤ÚXCoÓf©“á&ÂwdÖøÂŒÌtÃi‘J 1G•màzM«ïíóÌð)_ÙGÔF„χӮ^ÝsWzûD«f:—\a‰™PÚ%vJ­Ç¹¼Ÿ0üˆœ`,”w)­Bh5*ÃgaR=ÄdÃL.ÊRZ&†«uÆìàj•›Nó^=B”vÉn¦ ?nFÓ®œŸòÎ L™aÂ`ÍïŒHµ!Ý f$ÒYÎìd[Çð‰—gôNÕW#\„tbL.ÎäbéeHkˆë½”ÖÙÀŒ aÇÓ„/£|™Ö»p¨8“OIõa*d,ΣL6J»œÕì"”ãé¢ÏÜ‹p÷#ÜFRö'e”Íb‰„’™ ¦&{#ÆÞ ˆ"-x{„Î¥¤&&Tl1˜2a½Kg7b\„°ü¨¾—é¡vRR‹Òzé̈ÍôkÃs«¾j’/³öX./¸ì0D˜!>"I®¢4ƒT6ˆ[”ÖR‹[rvŒ¦sZqN™­(— RV’/2™QÚ“rEÉv˜ìGeÊÛu'í.psDXc\k{»yKå0®¡bQ,nYÝ3¹ºÇåa{–©ºýàÛâèAR($ù‚_:ýgzã‚0ú1¾ñöÌt¢´¦¬0åíÚÊ5øQœ¯Ä¹²?el$½ø"tÆÛ˜Èh$„ª4„üV¦sU?é¾M*ù›á²c­y’<×Ûç„3!¬mtçG_7w^Ǥr´ÄÂvqúÚî=!2"3JeÈdnŽ4ÁäFB¬Æ„n¥Â¶Õ<æìa‚±%w`wŽÅò 7„Ù…õeœ‰ZÙél¿TJ[ˆP Ô†RÞ“ª‡„9Œ³e@*H¢Œ½–à}¨5à†ÉÍ_'Ô*Ö ÅûêABÇ„©Wc|.)WÕêAuùec÷‹ÒÖ“¸œ'´ªX˜ð¥[šã™¡Z?-Ož»³æì‰Ý> {ûê¤Â`››£Z·¦˜wØJÚìy¨&•MTÛDuTòv ¥Œû!Æ—TP¡ •ì#3›´I¹‡©±r„hõ T†<óùe´7í^T XÙiÆ` +¾ÆÓÙ(‘ñÇ¥¨°—b¤#ÙôÑY‹òPTðüJ(½áV£lˆ´Q¹ÁetfÎXS9¿'e—*K* oC9¾œà*¸ÚÔ.Ÿ[Z͘R¿"×â<À 0®4â +`Ú@<*{ÇGÜñáDJÒ..w©¥ 1*Gª}ÞìV°z}#)®%u_ÊÁÄ šTû ¾ˆñù$›[ 3!LC¹£wá¸Ôd´Ž:¾†%þóµXÚéµ](°8àžÔŒñ•¤Xõ§t@þðÇ<`J-!•£ÞÆb%Ùô–Ï€ Q©B{›–L’R}#¥ûqÃÛ}È)Å™·uF¦ƒi”ÑAä¡u\1ŒfeYœ<”Ës½:JSÂl³Ù±PÜ‚¯80¯Ts‡Ba¼ŽJ>LC¸ +çLSJ • + +Ñvè4üD&LicÄgŒ¬ÝI +e\©a1V;í èŒ÷ôÕƉPÙA´†VÛתÛiw ƤÛÍt/º{ŠÓç˜ZP™a@\€¨÷cü&¦‰Ù-·÷Äjž{›ƒeúÞ.©,Àx&àÇôuD x;]cé<&V!R`½¨PIÈmTéÓÖ\«_ˆy[aïsù…/e®'Õ¤ŽË Ìû ñNœÍ"|p&éåÄZ ³aÌaº?!­Ç„D:ŸkÁ”µ—7“Z3FîøÉͤMçi³ *He‚8p"$¡—ð6˜jAÙi~ŠHuÒª¤{…GLÂŽÐ.ÔCŒrR|a ÷Ci?¢ùâÒ=?§KFhX€¾•§•¦Yœ«¹”ôFRõc–ÕBD•[iwW«J…y˜òpo3.¬Ç¸û|%Äb¥Ø>á³³¤Òò{qqJ|¦ô%—[Âó ±ŽˆUÞ¥õz” r0µIÛ©¸«•ŒÙB¸œâŽË“g ¾¡íX:GèMo‡4ÐzšKÌÍ­æAB*­$¥ ï²ÖX.ÌÝÚÞçþvzù!&bBŽÈôÓY(¶»u–íS–·{´X”ΡR‹±·„â‘P<äs;lv½“Vkb~dò@Ö!:ˆ5!;çr[Œ;³j³ã¯Ê£ËmájS­ì»ý‡îð‰;|,–¶ÌÒòù›¿’óu\ªEä6¢´ØÌHtÆŒÑñTJÊ€å&¼9Ka: ð’G [ÅêîC œ\´–Øð¡f„*$تäLX»{7Æm$´(SI»;bq_Èï0™qR¬A‚¢€¥ñ%„õhz3Áp—ê´Ú¦Õ’.† ;„[À,þ¤!3À} e5&ùQÓPZ1:"3ëIa%šþt=¹å|I-”ÍB¹z[UÓ É²÷ãܦÀô hyw‹2ú)¹ i‡Žµ É“6àÌJ8½“6brwSl5„‚Ò“Ln5Â|æOÝ ¦¶¼Ýà€oLj=:Du`¢¤Pºeì ” +©uShìüj˜¾ëKE xWq‘î'¤ûq…RÛµÑõf0³š°"59w™i]ØÍ Wi¥­-¬Æ>atRjÑ®Uåì4§Û¿ ‘.Ÿé¤ÍV„qá$(s 5àö›ÍCÒQÒ–‹sXe@InÈ¥íLû¸6{òðí_7÷ž%äm÷Ùü›_€e`œ‘P\âFôQ„rS¤ÂÔmŽ8PøÞ6\‹ÞÖËÆòu)„™bJm³™ïŽÓÐîĬî•zçbnã „Ö$4oO½~âôò…¹^Û=ù[«{¸’”AáÐMî; *T2 @4]€o"J’q½m[ìà<h#5qµÂb3)n&„j‚l µÀ¦Ózàíî¡NÀ{ÕÛº˜ZëQ ºÅfŒ)®Æ…ûaj#ÎP9BZ¸TåA hFmsæ0Æ£b¨Êìz\ñc&@ÊfBÙL*1Úx àæzœ_ QÒñ%´•°°“@30æP6¾”îíÐ+Vô s&Ô6x (3x{JªRj+²üˆêJ(0ÿá‚èÚLȤ +,y/H­F…àÈÞW˜C˜È@ýRèIÊo%¸<È{L®§Èmá‹D…Z…Ib|)‘vWâô`J©ÜÉ<»‘ +3Pø8åÜ +k %H9ððm”*ÄèÊ&âí#Êg-ÊŒñkMHu13rêÇis"³à>*‡‰uL¨jMPˆüõ¸¤û¨~á#B˜p¥j…0+Œ-‚5“X z¯ÉSFÒ• ¸Z÷Th„²q¹.¸SÈa<ßLHT‹Óù͸U8¢n3.Æé ÙJ„ò `<6‥ +|P’-8€¨ÃØ"gô6Põ~˜¹ Wƒéi³Vhw-)AÒâi{%„ÿÅJñv‹ªA/P*àgŸµG¬3B•*P<ÆD³[\Èå-`=!7ÇÍ.¢”@-‹Ù6¥Ã´ï\Aí*мiFj;ÎWýd.!Ti³§—¶¹ÜÈGh˜\&–›0vŸqGˆÞN(u­vÐØ~«Ö÷Á^áÖ ¥wøü\®ðÅ]6»» ¯3.TTH4eÝ©T>JçvPs”2Ç ·}¸™àKL¦)U0Ë uH“|M.ìcR%„ë¬ÝÇÁÁIDm Z ÌÃO*ƒIå´ÕY÷Îõ9´V  Âý rß_  á”Îhm pƒ±¢¨ :o—WÐÕôôžTö¡R"m‘JÅëÀï~˜´`zðÎF+Œ«|¶‡*•(ãBƒl`ªŸ0A¤Ù+.;ĪVÛ2&$<ˆ{[Èq‹zuG)-w`´p«“ÒZTfj¡t>ˆ×½r“R•Ôš ‹ÀÙQî4*”ƒé°¤^;6Ú'¤ÞÆä§ÚÞÄÌ5DËËaTö@hòç~²×âŠÕÁÅèœ^ÚuZ§¤ÙŽf®{Ì똰Ž©›„A¤Jeü´´õ·G`¯ôêvR,„",eJª;àò¬þj,DE”ËÝ“+°X1P.ÁÞ³6tŒu¢”¥€×¬Í„¾™YÛ ”F0¥Âµå¡C¸PpÏsOYÆHÒV”uÁöÂ"zN„"Ãן§4‚ÏÙåI˜6a-"¤ëÁ™àáZ˜&År‚Êø“2’.E©\œÉ£||ô`rJ.RhžMD‚ú÷%u¨(é‚þ_³~DˆS0[üÝÍÔý›3FIîäüÕâ|þÎ&ºcA%‚¼ßDT Bn=,´ +ÝûþD0FœEò¹dPª%¥ì_, ξ„ñeŒ+FIXg#É'Ó–äô@y®EÅbÆ©ÿ°«9­7½¯R¥6{D»¡ôzB\‡… Òèf{W xdg<¿øé*ÊûQaó)@0o»õ6”–›ûÓó¯™ìpQƒ„—›jy¿¹ó!;ºFO5)µ½Ÿ1.?Òê‹Åm§ÿHkdJ[G¦Ö—Ÿˆj€â¥(d„Þ€*¯"|d0 p÷ Ì¥ìLÊÏII¡ÒZ>K¥O7ccRª„Rf«¹xQßyËdÇŠ3èî<ó“êO6wý©”X†™¿hù´IJ3èÞñ£«ÚŸâ}1T;"BEiJib@eqðX‰€Ë`B³¦`µÀMƒAø_ê³Mô^€àvYK¨›°öZhÔÓ¦Û„„NS¶ìô¬êl •>ž+‚]ïæízP#˜AeÅAyà|! ƒq£ýˆâ™÷Ùbï4%—ï…(à>h„­€pMrt!äx«ÿX¥Œñ›1Ž¼™P7 tÚ`ÿífJÞŒÐ)ÚÙŒs÷ƒ4°§Ç§x6ÁW¬ú¾œ­qŒÒH>ÃÕ{Aj3©ârUp†`Ûé;åzÖQ@a‚nOÈÖj¤¯ÇD‹P!˜‡ÄoâBÙ,mƒª'´:€|2íÄ™ ôlˆÊ b œ¯ä¡xü”Ž‹À˜]B©ƒgIÉUD(&ù\©µ·wý ±8÷ƒÍg `d„ÌH..íî™ñ0ÇÛ[Øé®*¡VíÆ>[\ð6<$­^krõúûU^®D9J­ëB_GRŸHÅ!·ÔÛçq­§‹¢=BßÁåásA¥ƒvRJ‹ eÜÓ€B„Z׌¦-T)#J•JõÎÑ»ïþ.’¶îø1„uŒÊK>T]‰ +Ï”VÔ’·Ó,pM"íÄ(3ÉæÖAßz|gë¹éñ«ßF¸ì½›`ó`l“éB’-ýS¦Qší\|[›=þt»ëC7¢tæmÁ &ø2ÔgB(‚®À3àÔÖ#4TB‚rÅÌPËO)£¾†ÈÀ˜€“wCŒ„´Y¥žVê¢Õƒ`|Þ*N=ïƒpÚ@ƒˆ” m°lŒÑ±j; Œ¡Í7ã¼/Á’Š/.‚O·Œ&Z Éîy‘†¨û~b#&@DaÊöcú&"ß ¦(©&ÛcÀê?¿ºïGC¨’Û„Ò”†×¬…™0¢øÁºÉÕ0“`@æ>Ö¶’à«Ð’w‚Ôj øWÅø"Nœ-$®E½Þ^Nˆç"l–3ÚNýÍÏP¥gsq/±D”äóPT´Ñæ³#Ú³ÖM +%µ´Ð{¸ZÕe´0È®®§„ÙZO™ˆÈ vØHs“Sr…6šg.?‹K•”Ö3ö:”ºX‘‹‹ìàÒ<ª{I­ î\ÏŒcʦ¤´&õ”Ú¡íyBn«åCµ´ â*€«±´! È[0e‡p.@_J¹&> +a…yVö­Ö‘U›»Í¥/)¹°t ~/„m&EH…èÎkD½“'öLJŠñ—PiœQ߬Ùƒ«õ”§¸ ¡à°k!b-L­EhXˆt¦+g”Ù Ón”4I‡ôJ€ }¢r¦@jµ|ŠÈõµÄ *X  ÓvÃtž0FFëp=žÎù“ÒJx™O¤ô0ªal>S^øQX ;‡¥3ÏÖYPÛ!:‹IUè&”ÍßÙHl„Ù$éD ocäUŽQv3«G I£L×x lcz5ÌÂdî]ø¨î%¡¡hã®[‹¤W#žq29ÎPÝ—%½w/_ ¥½O'0Œ÷‚ôF\\÷άBDzœ.r´J·ýIÕƒÒʇIàzpǶ¬(p;I›( Ú5ËÙ0€€Õ1¾ãëˆÒ5jçÙá3½ýË„RèÓÔ0ÈÈ eKÀÚ cÁìtB”IëuÖh¥3#£qªT’rm5)§ô6®·¡¯ùʙڹªGð£hº€HuT…¨‹>BÁC©í\ï‰PØFÄFL4ª@Jan+AÊ;ÅÍV(cDÃäÇDìG®"b‘0› ©ˆzØÕLrUÃá5c’a“‘CÚ±¹*7cÞ•bp[%BóNåADà¹Mg&˜ØH‰5èàÓ"lÆ@½ÄW ºhô$d&¥4¼K´¨¼æ­)·aWCé„¢sI±‰«½hºIWRJ—Ñ{QÊ\Û v“›Q&‡Ku)»©I#”“Ä`\ £:­ö\%‘.FH{Í+ ª¨Ø õ®’Û’ì‘/.D1Ë—þr5þgwƒw|`°ód·òñ’e’ɯÇåx„tÇO7ñ!º1C)Ë,ÍY³ ݇Ñ. *È'Єë*$ˆ#7ÒÑ]?yÏOnDùÏüÄ_n` ÉB)Ój°›qÑ;çÀW!º` +€Kô%ÔjáR-€iÀ³@d`„iµ«äI®`Ô†ÝØM9ïÄ;¼13—Ë'vû1—_ÂÒC§›Õ]¦„ê*”Úàí!ïÎ)­"#!3rÓ©øA‘ »¤ÚJë]„ÏßPàO71-%U0¡@kuÑERz’4¹º$îmb›Q½û(ÀjAiØFÄFœÉmxg€@ó¸PSy,]rú³ûá?¿Úˆ¤¡0~²ŽýÅJr-Ï»‚ Jl3©ÅÓÅÕ˜ø™ŸF…z‚-%ØÊ7ô"ÈÎT¬êŒtö3~gƒB §,„)¤ø–.F¡f¼ ‚ˆ¦ö¡õÖã"ØOhd(³Í$˜eàGÈÔÛYšÉÇÓ…Õ¸ò,¬²²‘Pî‡Ø¢¥¡T\úqx±†«-BmÇÀ˜'…{ÑôjRëWwI½ÂÍ8›2C…Á<"*H\F눙1ç ×âtŒ1Q¹DZí”é]*J[})7cs[qÁ»¤’äòAR_O +I$Vœ-’Ö5ñte8zÒÛ}é#ÍMTóÎ<°Á¥TPSîÆLj²õ=P0šAå.›§¤ZJ†yö¢l‘êÛ§_o=øaœÕ¨¸'nâ|†]ÜJq¹XJ£”ê&&V©u”â6àª_D¨ ­B‰ÖW¢ H 0•OòPÚP9q<¤]pý+QÞ‡i0gðø¬ÖIk=Œo„ptx’ÎúâX3_BÃÅzÂó˜NwÖ3LrõV+oÆédÚÞDå&®GÉ•P +Ú¡mN*Ifë®óàG”@Ô‚j5D¯F8( ÖD=%ã„K MJn\B3„깚¸³žZ‹xÊü³õ”?¦ø=Q"|Õbtž±&±tÉŸÊDÓÅ ál æjBÛD (`5·Ú§™nDÓ`-ïùp”à–wÒ/©QñîpÐVãÀïzŠÍ¡lh%&€„´¬& ÛÂ:LÕÜé@ÍZŒY 21ÉãhpÄH>¬M¼g:w/ÌÜV“b€ðø8«¨Ô Íþf +Ì•`¬8ebbÛæÇ ñàOÍÊ.eµ?‹2a:ËÚÖêþIÚ9Lf£tp¡ RÌV;ÁטÌDÈmååÆáÒÔdíxí{!ú³ q7Âpü/í@*ƒð5hÀUÐ !Ü—TA­!BY¯í5¶®Kã °«”“‚qà£sŒ\£ø"#”y³½I@Ô“ Þua¨Þ™c¶ÿt2j3)cR-Áå¡òÁFÝB Ð`—© c²;´ûkq1˜‰f@ø­Åd¨M<káY³„¼>]C~²–܈pQÒÅ :µ§2aLMkÕs×lD¯RZQBˆ¥ƒ(è.üÓ•¨/ÎÓÌ$ØRÚ耑 $UF©sFý#;{æ>â~Ð[>連l +ü'+á»ë”(Éeq.g +Q0’LIpÆ÷cüÝ·™²"iïTÌÇË=3>;±% ° þÿü~¨6N˜Ñ”¾æ| Ù—€UïøSÐ}¨XB¸X]èq®¢LVˆÉxjD©G™¬—vÚƒ,Þ îóa«:ɸ4˜S@(BÊ=I—@1ÁÀ¼3z Ò‚uZïSRó$¸ +¢b3&nÄD_R‡Ö3žkìÖf>që•e9Bº«xj#al"f„†ŠµWÂÜZˆ] ¦×¬/.ݦï_\‰âk´¡bArǽ»é¤»¾Ôz4cHµ±™”î‡RôEÓ Ôïn$AÅ—‡Z¤2ní—r±âÿô~(Ó‹°Qq#*A;û Äx´OWBk! +¬ß»€Î¢\°±† ÕÆ Ô»·Ê÷Ñ;¬„ÒA/`÷*Þ)ÔôÃÙb,¥ßÙÀ¼[Ë ¼IÛ»¿‹ÊQf'í ­ ²!É1¥Å8#ÆÄ¡gížPœqù‰3àH’’ëðð®F¡†×ûð®4ÇÒ™(y®?圡z—/ÓzSr{bnÀ;#LmSz›Òš¼ÝG„,¸E½²C°i„ÒØHéë)ÐÌ…öÖKÆlÅi+Ée×PÅëÔ Qy\i²vd{Lmù ç^L^‰É ä)8ˆ\ôFAÛ+MÆ"Jõ'ün ÞáË„ÚÂÕ6"51¹ 8ÀTxä0oeò¼2yÁ9 Bë.AãÀ ¡rŒö øjLŠ1YÄ»ÀÚ-` ‰JÐVAT;K—Yk"Ú°€ê°{Ð f +C…lj]ÌŽøÜä³0–Š0m=ÌFÉlŒ.GèrRòn5 ‘n“ïú©»>ˆìãä¸*¦]ƒ²VkF0i3ÊÅÈ,hà• z8Fq©â‹¤ÿìŽÿÓ•ÈZˆA=RÎÁêJ7L€®‹¯0’˺™ "ÜŠ§¬R¦wÅ*LCÈÞõÄ ~?Jz÷¯.} *?aJüÙýØOVûPð¨aŠoÐj€Â„ +¤äÆe¡,¡ðBžßt œ8Wá²S£q ”—rq¦Õw³Ceéìž×j{fû4Ó»DÔN\¬&ÅJ4Çá¹6©åŠ) :7|#Lðq¸ÞäÜat@ÃúrY ¬c4¥ìP)-hkÈXBi‚~²“æôYip%æÆ Ï‹‹©š¶Ç ’Á‹Ñz›±»Ÿ¤ ½®<)Õ æ¹üœÍÍà8ÂÙD@à>´ÕÅÔFtŽT—Ë{vçAÊlA©>^PÜ[MªPàòØÜ®·ïCó&„XÚår&¬w6± `cR¨’Fu†ÐÉl ÜM˜°âLë‚»±Ç½{®²ãptJ“Z)¥¤³Q¾ö3Â@êCýøPïhv¨.\m&aÂT>’Š7×c\J,'¼2ÎƸJ€ÌAÓñÙ¨Öá‚ ñ§ôµ˜w!{5ÊAiáB å*4´Œ\÷Å82ŠªË»´$6¡N°Î£¸±¦U#„öRdâìlŽ–ʲÛ÷%ù"1zC¯nC|¼¡³ !G½«N%>Óoå“Îà +zS;Q™/¬†ÓÀUꎟô¡ZÄ»{6Gj-µ¼kÔvÍÚ.ëNb bÚFR 1ypµ´3ærÓÂøÖÜ7¤ÕvÒÙ %QœÙݳâÖs£{žvǘ\AYǬïÐöP‚Ð@iÔùÜXÌOh»«T ó !76Zûlv埥5rƒ §{¬Tw«k­´ ž±ú°¦¬;r£âð"íbB Ó:”3c ;Bi7ÛÂô.ðŸ[­T©èÍc³sA9ã¤\§í …jvùü$!—’R)Êç1µ +/ãsC¹¼ÔGJuj•Ö{„YµHº€ÈM@*nH ì!"Uü„çŠ&îetᘴÙÕ:ðu„É„IÖ›€çI± C ÐFW¯l+¥-Є¤Þ¦3½¸Tõ3¹¬É•±´…ªõu0@ 4¶Š›]Üê ŹRÝ&3=Âà­¤ÔrB( Rr(tfÓHiͤP•cÜ(a%i7AÛ ôšÑÛKh-È|Ji"b-HåCð¹”oAÅZÚìkù-0q÷´”\”ʃƒ[dÍ®Vžg:{z}¡TÆõíÇZm}”-QÖ€ÎLpKiÖîRf|t´XØã³sx†Ô«ëI‘ùxC>å-ÐÔì°…™Zß³Ú‡|q"ŒÝ’JãÂô2?$–çB~¤äíÝçBaŠ)5(>;‚Ê@ƒWsî°Ð?­/Ÿ@¥%¤T£Ñ؇º²»Ç™ÞÝbœ­tf€ËL*$„ëŒôúŽVÛ–Ê‹„RóÂ)Ìi»Geº›|iGméíS«ó@©íKÙQ{÷Þ: ²yÊê›­3³ý@©ÉÕ=Âl£r9Æå â<``–1¹þiiúÐíæú“#| VuÇ,ˆIp)¹"mOÑ¥Œ8_íhƒŠeRk²™¡Y? +3ÆéA¡êµmÆî$„|ÚqÙ4ŽTÙ†Deç™Î±ÖØIe:k)3Æ•Ò¼~*UvàkB(Â+ú^sû…;|À•·¬ÎI¦ ᜈåevø ÓÞ…êJgùÁAyv™iï'øRJixg€õ&˜e9?Ƥ¢?Å›e/\n8Ÿ®T–Þ¯‡èu¨Ï„XJ©M¥´¬Í¯+ókÊÔ@wƒC÷az”ÉàrY)Íó³ËÒÖ“ÎáëÅõÏ +ÞˆŒ; Œ^ꥑQÙnÌ®s£+±¼ ¤¦AgZ—§Ì¨#Ê(ègZ¹áY¦} GQƦ`³3@û¤w‹ZG­î­=êÁ»º]Á5°o-±4ãËK©ºk´‹Ó«Êâ±\É¥A¦³k´÷ôö^¦ë¸e÷Ž$¨¥ü8 J•Ê´Ó®'ÉÌÖaap9>ùj|öenpªÖvØü”͵ê–^[fGWfÿqyñN©íar‘Ë@Óå”òèXoŸÐù9•e'×Zu[.O j­u"Õö…ò®PÜζƧ_ʵmÃÂëÍc¡¸ð²íŽ¼›–í>`c\È…)P +jybÔçNï°0}˜éž¤óÜ€NÙŠ€–ë¤îQ6®µA_Ź“é{2Rª}+êîƒâôInr•ÃÒź=蠔Ѣݾ\]ÊÕíÂäT,–Tž‡( A[z·L\ëµ@ÚìàAmùbëÑ/J[×Byf÷a·•­ëÖñçí“Ï ³+­¶´›Ëáñ‹ÑéÛÆÎSÂh±Î@(mq…‰T]jÕ%ïöKÝã”\C¥ªTœ‹Å->?·»§ÍÝ—åŵÕÜo,fZ;QXµ¦V–¹ÁƒÂüIaëšvG ±bT·Q­âCB«XÍ=­¾,LöÏ>ÌŸþ˜>.Žì>þV«îĸº\=RëGZ ñª}ø…Õ=ÇÔæFRÌ$¥’\¹ƒS£}d÷ÏÛ‡Ÿ——Ï¡¶ö^gëŠYîýQ!¥´øì–Ñ~>«í¼Sª»¥á9i¶ÁÐQf "7ºnî~¾ûìwçïþåÎÕ×»O¾±:ûJu«8»*ÌšÝÃÒìrtöõÖõVï˜Ì´ £ž¶[FcGoì×·_´ö^Ù½ã½g¿l¼"s}Òîèµ…ÝÞ+΃+{òDjÊõ]ø•óAR…÷°T÷ÞUÞ—÷ßUöÞ¹ƒ‹Ññ;··¯V'Ùñ…Ñ>Ñ[ÇVç´<½ê½-ÎAyÐE8ÓªÐDri nuŽË[Ïë;o”C[«LP9Ëdjri’]T·ŸU–ÏÚ»¯Ç'_2™.A,-oÕên¦} +åQ[¼lì¾Ëž¤q€°åíÎqnri´ÕúŽÞÜœ+[„Ó*ЀÛZë0?yn¾“ +S\ÊÓZ%ÅfAÀÐæ Ó<o¼¬ï¼hYž?:|ú=8•ñÚ°ºó|öøûÝç¿Øñ‹ÅÅ™æR-ÏJÓ+Æ€üó.—×÷§ß´÷ßT×ã³Ðøq.Ëfû€¢Vû¨¶x68û¢ö¾³ÿòìÝoúG¯ É)½ÆePuÎèªqø¶¸õ4ÛÐ>x‡è5”ϸͅàv)‰sÚµÅõüé/ç×?œ¾ùÍ÷÷ïôÚžZ;^ü¼8{FÛ“´;WêéÜÓÚa6KYíXÚ*´ÛÛnÿ8?y\ÞzÀ‹›Úäâÿõ¿·º§>\³jËÑñ—™ö…ѹ,.ß؃‡ÀìG×?'2½0eËž²:­o¿nì~Þ;ùÐÜ}qñú7¿ù[±¼U^L.~ºõø»ù£ŸöOÞÍÿ°|ñëÙéW?ÿÿKeñ„δrÝýúò9Ò=ú|tþõìúç½ÃW;W_¾ý˜ŒŽ_.ŸþPÙy¥uNzg–/_;úÚllå‡{JuœÒ*by¡wNÜÉ#g|Yß}ÑØéîuŸµú¶ÙÚOçV{ÏéÚ£ñƒŸ•gÏH«.¹Á±XÊ¥)à0À&„œ?jí¾kï¿µÛ ·½T+óL÷¨4T˜\5–OûÏÏÞüjçñw€–Ra ×;|;=ÿÐ=xÓØyUš?S*»óã/æ—?Eå"”(”Dkÿm}ûyqþdzùÝöÃ^ÿìïû‡o­i´­Þ9”=ô‚Þ¹´‡/Û‡ß(ù)f$Óˆ+ÏÌÎ~~ržéæ'­ígjuX º +¾8:mî<-O/õʔʹ€ {Ç_Ýâø¼<{(gÅñEmûڞѹ¹Ù9lï?­Ì.¤Â ²|lµ¶Kã“ÁÉ[H¾Û?lí^õÛ?–&‡éƒ¯Oìž}¨n?ÏÎ¥Ò6èÛöÖ³³×Užc’mV'ˆå«ù£¯ß̯ f-Ó:»‰Š`"2ý‡£Ë_ ξ+Ì_–/ ÓGnï¨1»ìl_%x7ÆçÁLÉ@49§¹á…TYª…Aoçº8<Ô¦ÚüaöèçVûøå—¿ÿÙ¿øï3½]iÈ%èˆóÚöóÉå×G¯Û=z»<{û×ÿê¬ï>…è-¯ë»/žÿêé·úå¿Î Ÿl¼Ø¹øJ,Œ•ŠÇÅVû¤4»œ}³÷ú¯O¿úûîñ—'O¾Þ9+ä°jNÿDoìͽÒøüàÕï÷ßýóÂøʵPÙJ;]¥<“JsÈXÊècz¯0|Ô;þœ4@ +6Í&,â9à•ÞÜ3[»ƒýWßüöÓ³wŒÛëž~×<ø²²x6}ô3èµó”!g÷óÝÐé„ZÎwJÓ‹í'ßí¿øqtþA¨ìpîx¸óêË_ý7b®[ ß N¾RûÀøäaqúÈîe{ÇNç ÎÙ$¬E}»<{@±|øíÓïþnxüùéã¯OžþT.áíµåc¨ùéå7>üáÃ?ûcmzy|õþÛßÿ[(Фճ꺲ø¼sò}÷䧵úø‹gï,´ç´QVkÛjëÔê]æG¶žüÎ^¥ÔšÕÚÏÏŸ@ýk•È{xy«L/?ÿÕ?œ¾ú!)?™Ì ºó¦´|a´ŽA«kÅÅõ»ß}÷»?Úµ)?)-žä·ž––¯ÆW?€BÌ `ó|JpêÂéž´v^ô|SÛÿÂ?IéÁ[³6Iº˜o—gW݃ƒçýýdz³7 ö”ªWFÍåËæöëÊü)°˜Þ\¶—®¿ü«ƒW?’z­±} Ÿ>ì}]ÞyiõÎÌÆîó÷¿}û‹¿5óMBת{NÿÔlïç&ú§ï«‹Ç{ïÿÛÿùÿ¼ÕKãýÇß]|õ/çϽûüWÞÿaþä×Ze÷åç¿yóí߻ހml¿¨n]7wžÏ¿n}®Ö–OÞýjÿÑWl¶WÝz\ß{™]æF—í½7û/?¸øÁéž-½;ÇkI”<±´LçLLÜAuö°2Øë.®(³®×¶2àpë;Ju™œN¿å ò²{ö5%çvôÆ’ÉO}l)$Ö„Òvir )¹XèZíáÉëéÅ—ùÙÃt~ÎXƒöìÉç?þ£>­ÎÌþ´{ô>38W+3­:§œ>“Uç×Ùî ®ÕòÐlîd kZvk·:½2jËÓ7»ï¥Â¨·ÿ|võõäüÃøÁ³ï†û×ÙÆòÇöÿÓ¿ÿ¿Ÿÿã ´Õr“ÂøQiëuqþ"Ó=K›í/¿ÿ›¿ýã¿kŒ8§×>xß8ø²}ôaxñ‹ñÃ_i xr°¼øº¶õ8LÛQ& ±¶ HþdtúŇ?üÀÝng·µx˜äóéìT ›ƒ®h,ž>xõë£ëŸ)ùQoçQu~Á¸]Òì +¹-»sZÝz^›?ÅÕJ®¶Èw)³+ª·ÏäÚe›{˜” S²à6Š££ñéÛ׿ªì<¥³?iÔKÐV}Q?*/_vŽÞl=úîøóßgú'B¶×ò¬î¸ïøí–×?6v_6–×ݽ—™ö¢ã|ÎhîSV“¶¹Ñ(àÜÉùÃÓ×Zc‹2 +n{Qš<¨í<ë½oì¿Uš‡ŒÙ*´wÀ €§v[û’Ó%¥¢][vÞ4÷_Ú}`×Àw|®[›í=±ÆmK®l‘f=Æçp©týö7Vçp%Æ‘j]*L@ç° sœav€âóÝÝÎöã8ï4vŸý¦{ò­Ó<=û®uü^m×Ïø67}üÍï—>J;öðºqòóìða˜±«ÑØz +VjpöÕäò»Ã§¿9xòcsùª4}¬†ßþº¿ÿ4Ê9 GåÀO™í‹Ló&Ó;áÝæå‹ïãSÆlË%Èê¥Ý;×êûv÷¼¶|™o,/>TÀT~iœÛM©³»jï¿jï¿l¾á« ̨Yµ­ÒèSr•þîÅç}úùß4÷ßéµB«Á”À”±àPÒ¹Í8'5Ñé¸=»w`töÝá)žipÙÎøì+XM>7(ŽÎ{G_Nß7·Ÿ˜µç4¢¬LéqÆñ£\W¡D‡o[{o;'?µÇW™Þ*eê¼¹xf·Ïhg kÄ‚7±j½½§Ýƒ—q)J…lûJP+|iÆ”–àÐùìP¯.Ìú6"ä[ËËÇ?–&A®Œ_ççI©ä–§ßþ*ß^„Ó]V¶ßôϾ›]üÜî>`ós2Ó1J“§o]ér¥6{¸¼üioïuiò t~±{4=ú:"×>Øö›áÙwùþ…UÛ³ûB~ +‘VA•å»!Ba­f®âtŽFGï~&åg1ܹοû7NuŠ%Ψå¹ZÝûpxòayõ³dÚ©õ–¾ŠSDt0Á¦õ +æ] +,RJ–«(ëì]} f\D.yw=bçJeÏé?ÙÄSRÕ¬®ÇÓ>TŒ±(OÐbn¤¹ýÓÇß禧qÅÅ +a4P¹j6MÀ@«BVoPCíåFW™Ìi4l–5J¾Ëgªåá¡ÙÚS»îèÐÃmï—:{çϾß~ø%ëÔi«ZMOÞÏο©n=3ÛÇJm›4›ÏúäK,L«[/aE&gN^ýîðù¯¥b¯3Þ¿zûËêì<.¼K‡JuGùþyqt HpÞ駔BŒÒ¤l<ÈÖãFÇŸƒ½:}óÏççß•ûGǾŸ|!'`µÀ&„¦T¬êèŒâŒK›\¦®W§0s³÷·‡@OfsOv+Np­ ðÛÝ}[ãíKù!Ì3Bê„TÔ “@œY§<”hÖ·ž¶w^@~›MJotw^ŽO¿ÂÕ*“i= yja(8MD°Á çúGb~Ä:=&Óã²·÷ ½ýrrúAÎO>K«Õls7ÉÙ)1]ïtN@UZ­ÉB‰Ë´`ÉhïôÔÄlõß/þ|~õC}ù,Îgƒ¸Œ¤ÍxZOIy`@°3åÉU¹whÇVuæCÖîÙ½£ÂðD)NY«Ëfz¢3H±îÖΣgþ€J¹û4†Ki¥”©,ÜÆ!•Ã˜ª8ÿîý¿vO_’,!¸nŽp•í?¬LžU&O¼?ˆyp^FLJX@ª”Zæ³]¥4rj³ãG_U–gqÙbœšÝÝ1ÛK©+ÒƒIâœ[lfš—‘f rŽYJ«8KÅ$íÁ‹Ÿ5–ö6[’v“6+zyX[\iU0PŽU×4çFmŠ*?©óù‰ :|ò$ß;EDW«-«‹³ó¯ǯkós½>Cg²yùþ—r±·’àÙìL©ZÍ#½äþME¬•éµ\ê%E/tZ{Ï@„ì>ù~zñ¡wðÂnmÚËçï¼zÿ¡QVW.ï€ÀËvOewŒ Å,¢VaŒ +ˆÊ¥¾+T÷”úaeñº±óŽÊt´fU‡ ŸÄl' Ý*æEw 9Ñîá|!¡"Hš’²‚Ó±êÛrq +ê +jiý.5ÊXåéƒÒÖ#{pʺ]0M)±©Ìº;/ØL3€ŠA ÄÆЬïeÏrïW`0™1õéÕ&"ÙŽÓÞkï½€¹1v/Á: Ƴ@¤¨ehÏþɇÉù7ã÷•écÎ$Å*Tïü¿$½‡—ÛÖ¹öûO|9)V>ìH4 $H$Ø{/Ã2œÞg¤ÑŒFiÔ‹eɲe¹Æ5.q·ã4Ÿ8qbÇNÜ“8ŽSONÎ÷ÝsîZwÝ»©»׬Å!Á÷}Ÿçìý ~¼VY¹œéö¦fA0ê %:„"$p– 5Äô¬”™§}9Ô-ãžÄ€PBn€\*¬¶¸‡4ظ‘tùsk[Wƒ‘ò°v¸" û0_÷úw¾(yÔHñ gg1.ƒz3 +«Sç9ò%›Éîjvz-ܘ +×{™î|kãääÖ^qi‹JLy“-¸ÙXaccR°v:@Ržh…OÖh9çŠæCÅö±‹6×OK•.ì‹:I_ªšê.yÊ“j ¼ÞÍu¼±Ê˜AØ°¨\0~g‡ÉÌZØ(ˆIå.›ª²É’CŒë\~X¹T6;·$µf­>ÙƆi¹nƒæ`)ŒjˆÖˆ]º³M¢Åâ¾0/Ùy‰”îX“ÞTµ<½ÒXÝbÒ£+ÀDš\¼k£ã*wpÔtxÜ¢…)7ãO““4â~`ÏÄò²;ÙÃB5+—ºle%!S%‚1æÖ8y$Š57`65n¤ÆÌ;‹»Â8±­S¬ЀµÓS€€pX)qnëb{cM–,ˆáÜÀ%&mîØa¥mP³S´Ñò˜ÑygŇðW]á–?;ÇÇ'É@nnëRgm7\íÙ¸ðˆ•Ð“^:VE¥¼çžP¸²`r ¤ ¸±¹tûTyömŒØ@8Œû3€N±@K.©ò:Ú\ŠN,ñ‰Š˜móó¡â²/95ªÅ¿yP}×° aã^¹®µP†´ã6…£ý¥DeE.,¡žÜ¨Þ9¤vXœ~ÜŸ¹Kiݧ´ÒØoQ*3K8—U[9w¨Lûã±B£»¸9»¾{ô̵‹·¿ñÄó¿òæ[?ûåÇŸýñ¯ÿø×ç_ýãGï~|úžÇ³“G±Ð_¢nt!´MM¤ò™J/ßZ¬ö§V·6N]¼üÀãgî|çÞ‡WÏßsìò}§o>~îžG_zíígß|»·vbf}/V&üIt‡‹L¤‚z£l0‘¬vš3ËS+G×vÏœ¼vóÊCß÷ÌËÛ79ré3÷?õÈ ¯¿üãwÞ|çÃWúþ­g^ﮟ¢‚)3)havúü‘r0U£á`ºPî-vÖvË›ùÉÙÚÂZse{nûÜÍGŸýÕ‡Ÿ|ò»?¾øã_¿|«Ü[SMÄêl¼Ñ.ÀdHJu•%˜›œ¤7Vê­e:K‘ê´XìȵéÙ­Ë'î~èâ­'ž{ý'ço=qêÞïîÝzÊ-kŸÁáÕX\ÀBÐþ¢0{ »$!Q‘rõD¹™mÍ7ç¯ì^»þÈs7{æ‡ïüúƒOÿðÊO~yìâ}͹ãñÒ îM»¨wðjˆA=1—6 ^µ…(YL÷’­õ`¾#æ'ÖN_}à{¯Ü|êûgn>tñ§÷îyx÷îÛ—|ú•·ßøÙWÎ]¿½zæîOëì¬r!Lˆ W}‰IW $¥Û|¸L6³ÍÅÙͳ©Ùµ玞½vòòÍç_ûÑï¿þÇþü¯þü÷>ÿòþ'^Œ&«‘AÓFÅ}ñi9¿ª4³ãzÜä`)_åÒ&d"ÝR¹>=³tìèñ³{ç/?ø课ñ£?úâ³ßÿñ×öñ§¿ûÏþçç_~ýÚ~þÐÓ/Ïlž‹Olˆ°á +ïO„£éR­³tôô±S—w/ÞsßÃO¾úß¿úÓ_=õÚ~î•7ßþå{Ÿ|ù›?{ûßõÿø×K?~ïÖÓo¬œ¾ÌX¬NeËSËëà±pdûôå>õüs¯½ùØ‹¯?ôÂëϾñ£_|ðño?ù쫯¾ú?ÿ×ü»¯~æ•­s7#…I—¯€3i!ÖTV-NÉŠx¼b²P\<²söîûîyø©{¾ûÜÝ>ûÒñó>}÷7ŸüåïÿË?þë7Ÿõùþôâ›ïÌm^押Ür +yoªã× Í¹ÉÅ£+Û{—oÞ¾ùØ÷yþõçßxû~öÁgxï“ßÿö‹/ÿü׿ý×ÿþo­?ÿõϾò³pqFauèqP9•V·ìlœ‘ŠÑ|kvýøÅû¾ôà£ß}ñµ_üö³÷?ýÝ›?ÿ埼óñï¾üô|ï£Oÿôç¿þÏÿüÏç¿ÿòéWÞÚ:{O(7²AQšqÊ,I•§½µÕcgÏßóÐ==ùÒ[?ýåo?ûé¯>|ã_ýîOýûþק¿ÿò“Ï?ÿÿüÏ_}üù•/t×¢ÕFnhûýÙðQ F0a’“¹”ªÎ[ ¥öÜâöÞ¥[|ï¥7Þÿè³Ï¾üúõÿå¯?ùÝýŸÿþúïÿ|æµÝóÐã{Wnñ‘:á+á¤PoÎÌ.=¶}úÌ… —¯]½õàoýð­?þñ_ÿõ¯Ÿ|þÅ¿ùà…W_Ú»xijiMÎ7|É–Õ2:xÌ%’n¿Ï/es¥•õ­‹wߺvë‘ë·}â{/üü½ö«_ýáOò³w¿þ뀯óü«?xáµ·N\º¿½´›m-»1V•:r®J•ÚS+sËëËk«—.\øÁ~øƒÿä'?{çãÏ¿øêoÿ§ãý>ÿâw¿ÿÇ?ÿ㋯¾zë翸|ëV{iSHÖi1Cùno(]¨·gVŽœ8¿~üÔúæñ‹W¯½òÆ[¿ùèã>ÿÃ;~úÖÏ~ñá'ýþË/?ûâó/¾øôãO?yéºt_º9o§$;ò„«Ì4ÂÄ&R¹Bmiuõþ[¾Žãçï=÷ú[¿üà·_ÿõïÿç¿~óéÇ_ýÕ¯?úè…—_~öåW—v.²‘2ä’A±rK%_¢áOTkÝ…ÖÔÂúöîƒ=ùÌ /?ûÊßý¿üà7ÿø×ÿþý×{ÿ£Oö‹Ÿýùë¯?ÿò«—Þzû¾‡žÌ5WL„¨4Ó*#¥ƒ83æ%"]KZK[÷=úä“/½úôk?|÷ÿþÛß¿þû¼ûáGþù×ùË—úêýß|øégŸ¼ÿÁ¯o=öøîÅë¡lôE5®4a¬”óÊù`´Ü›ß¸zïï½õïï~ðÑÛïþê‹/¿üú¯ûô÷üÍg¿ÿÛßÿÞç_þâÝ÷õþ‡>ðØSg®w7/“baPƒéa¯Áæ¶"ŒÆˆ:¾ÜšÛÜ=õ¾‡ž{í‡/¼ñÖ‹¯¿ùî{¿þç¿þõ»¯þüî¿ýõ¿ùè“Ož~éåg/Í,mùbDmÝ+Ä +åV¶TO¤sõI€Q‹Ó“ +óç/ï]¿uíÜå3'öN&ò)Öïq´ÉAYPViÀ”TmÂ'b©d±\™¨M´×6Ö׺3Ýc'6®ÞsöÆÍ«§/^:}åú‘½ •©Y>œ¤Yo¢K‹ˆ6Á4„3ÜE»½ë›çf׎GÉb6µº2¿{úÄÕwßÿð}?ùÉ?øèw~òég_|úä Ïm9]›šò„bl(ëèŠy,OyBkGÏlž¾–iL¥ÊV«=?7}üøѧžzä퟽ýñ§Ÿñ‡ß¿ýó·_ãÕ—_záÉÇoßwï•Õõ£…Æ4 vÁtЀù† €kP…‰Ð[ #$âÑ•Å¥{¯^yõå—_}ë­W_}þ½÷ÞùË_þôì÷¿wvïøúêB©Þˆ«6­4!ˆ;V§`q +ZÀ(6NäJÍÙÙ¥½“;·z੧ŸøÁ›¯þ棿üêË¿þí/üúgO<ñÈéó»™RÞŠº¬¸˜a¥‰Ú?¤T@Ã*;ŒùD)”ÒÝéÞüÂÆÎÉ“gÏŸ»xùò•«/¾ðìOÞþé˯¾òüsÏ>ýÔw_yùÅ›÷\Û<²M•í.¿ÖA"‘³]^ÊÀ¨;N,®l^¸zß“O?ÿÐ#ß½péÚ#<þó_üêÇ?ýñÍ{.ŽV›u)^‰s!„MX±€Bií£jÛ°Ò<¤´›\F¼g‚r©|OŽ’ñìù‹WŽÝ̤bõJ%—/´'šf%ž,˜`üà° À˜98¤?4b¿¨Lý•ø(býAJ…c™P"Oq³ÍA3‚)xýñxªTkL7šSn– G¼Ov൙:¬Ãû­(2ÁÊeq›í.+bUÔ´7ilL,]¬Nïº}Q³Õ"ø„H$Áñ¥4D%3]FîŒéÿë;£F‡Saäg™ ½€,G’!9‰çYÖ‹#8éts¾¤GÌúBE!Z×ö/ð¾ø¬|çnßzPi%Ôdw;˜˜Ó—‰zóÛ×5¨à-æI¾0-îˆñŽêP+.Pïþí¾aÝa•mDƒXQ/æŽzBUZÈ9Ù¸Ýé÷$1c&ÔèMDØ€Š8›´â°VÙœZkEyçõ0¥¶R0GYJ*ºÅ¬& 0”gîH›œ‚ÂFC®è ùÖæ Â¼® ó÷ÔP;#©l´ÒBܸÕXq•‡·?0eã¸7e%Ösz¥cš“ÑîE™˜ !|Ž‹OÛÙôÓÛYƒQÃ# +³F )Õf¥Æl†H^Ì’lÐNpÔBü˜‰fÜ~X >ˆƒÈ°æƵˆÚâRXX…գÂ*Øk&D»+Í·ÖOIÑܸRO¦ÒIKáS€w5©íSRÂÿ¶l@aƒAP»”&ZçðêQˆ|o¼eÆýÃjˆ •C…ày°àÀ}FÈe´RµÖ:J éÁ[YÙ,ì«`€+ƒ›;¢A¼:L3’@dÝá 6>%×Ãåµôäi669¢CíË´ÌÿCª‘~G /'Õ+S§2­Ø<8bQXc鮕îµŒè •X‘+¡Ü¼˜œÒÈ¡#„z «08vÞ„Š¶þT·~“I.Ú9<Rš«ŒjóÚbÂ0Ç}vÊáŽK‰ŽœŸ&„ Æg,ΕŠØ¹T¿e(Ö¡þo¨öèû!d ÎáIÞŒÝIâÕƒ +Ûa…Ym£ž”KnQRóeL¨dBÙê<§T¶AµuDQ>[ä’St¸3˜(s¡¬Îî!§°¸tHÐDDœb#\Ú²8ûrIñ† õ*ÌäˆQg$DÒŸ§üå;K*PʬΛ+ÆÅzžäœÎ! L˜‹Ô`.¡…y•Î90bTÂ0L—VPWxhèjõ5ˆ¨†}jˆ‡¹Œ;Ò¥BM&BT@J²uÜŸ]„ÜI6*ˆPBŒ7]`â¾A=äŽ!lŠäÓ±žÑ wÒjôhkê8LG†ôN»;n¦d—v‡[Ra*cZç84LVÁƒã“C˜¸³?Ý´á–;„¯x`2b>§/êðEká1³ëNÐ-×}ÉÉLg+X˜Aù8(`¾™pGÚvo^G„ÕHp@ƒiPbý5þcv…訙(!OKµƒJxHc7 ¼‰ºbmØ—‡9ÆKñrwé$,„B¼VR´’ý ªÕ6·¦7N×gií.êáyr—uú+T° þéd£Þp ÞÁQÓ¨3ã}žrkÞôéÁt,œéq‘ê€îK0ÌXÉ D†H¡à`SF,€’ÁTiÞÁ%FäÚί éPIëð‰®óí5ÞN‹*¡±8ARƒ“n¢@ÕEÙt¿6̃q¶’=*RÃã—Ùb#íPaóe•wÚŒ0 ü/äŠ l\aî/ºqz (“üöåþ ø¦L¸ã*F4¨2s£ÐÁÅÀñ8RÚ•Ý£°¹õ¨ßJ',TÜâ”k3'“%3D¸$ÆeWu'wRÀ_ Œ›0ÈD׸ÙÝo°CÆùµæêý±Æ¶ h`–ð¥A5·x¬Î8¨°áš7\vŠ´¿Ó²ÚÊšpiL[?0fQÚŸTc.T¨†½„/3n¦”ZccAX~g@?¨p˜0ÑŒ‹ßØ768n†pp;#÷°‘Ô»î‡÷) ns«çkËgðQãðWéĬ¯´!ÕŽ°é)Ÿ¯6WW÷01‘1È=qgÔJ' ƒ‰/ŒÛPŒß ŠåR—²÷{¼ô[^“ä +8ø(ìMYØ8(á2ÄÅ_Îë +ù2Xµ¹dºF*ˆqq·XpI«K28zÄgwÉCýþ-¦ýãP¾€Xu¦ýy„é_¾šJ´ÒˆèQ 4¹R_Õ¨Òb™–ª% ±*pé#:Ä€øltv'@tùäêìÚyÌ“8¬‚F´+r° &0ob“J …ÑâÊÖU1Ý>8fÓ:Œ0gÁNÑ) v$-•!·|PiÐ8ÆLð«“pË 3)¡ÞTsé %×úMi€zZ©°Žráš?9©µyF•° žÄ¾1Û¼ 6<á·B† ZÄ;€ÂæÒØ=0“túK±úfeéêÙçÉ·Öãµ#f<8j À˜HpT*8¢Y€cs þÜ‚Ù·yH“jrs;?sšK*È‹ð0æ¨'¥¶ÒZÈ¥Ð÷{‚´:0f?4n7:Õ6/P ‚fTÐX™Q9j¤Aék/^p ™oRö‹‰À'®ôõÝÒþ1œµ…Ú7¨7`†þE¿ àÁ°(RºÃD+` ÑÌÆmÞ —™qŠ66΄ªÓ«—V.^?*&jËǯ ra6T[ ×7"Ç"í2Ò†ØX0V»÷ÁçÊs'@Jõ ó…ô)ÖÕ6Ö€ùGû}eƒv&3«;ãðX¹ÃÆÚ;7 ´Â‚î¬è18%ȇ\1ŒÏRb´¼D +žžXÛDJÎ;S¬‰PÍÌ&5˜¨EP‚ÆLýùðZ‡óæùxgN.Á†rFÌÛoä +ƒ¸RYÜ ÃmOcBÎ@ˆãzÌH éÔ¢(›À<)&ÚLNï™=é=¦søL¨ßì €Ð"¼ÚáEØ$Ê$€LiÑo ™ö+àe@W 5w¸IŠ 5Ê|Ç(âËÚhY6*Œ¯+U46†däÝó·)!õíÝ Ên@ ÇÀLÂthPmW[ÝŸYcw…ÁÁ²ÓÁÊ2›§ó à„# T!ãzÊ„†ì®$)ÔèÀ„Î!Ý0áy2cZtÜ@‡ú‹Î“óÄ'¥Ü<0£ J¿+"Žé©þÚdL"ÅŠêའFŒ 1¦UײAÔ›¶2Q•ƒÇÄ"Ä'u¤Äe¦éþô¿Ùlw7;uÆ_\Àù„”îzÓض‘3!¨ìÜaŽ0±tmðçŽY-x DÅ\þB´ºâKOFòSk§îw²X0km¤z'ÒS'åæ‘`uòO¬Ü\zñµŸ/ïݧAÁI™£š1¢Gxs_I=: +XÉ›šM´Or‰ŸérŽµ\‰Ž/7GEZÀ]Ԫ˗®=]š?yHiÓÙYsÞ Î#™`ä‰13¥µ°+ª†ùþõ&½™žT^‹‹v6 Ì{ªsñgq1GÊ5.Ù•Ë+ÙöVmîôìöM„p–ÔÅô¬³ß±9êŒÕ%óÉ®P˜W:¼LHÍ¥{g2Ó{¾ü¢Ã›7ºâZBrú ‘Ò"®Ú½iÄ—&üÀ¾ÖܱÈ3‰†m¥[+B®g#…ìÄzyùr|ò4lR“ +Ø[žØ8yõ©P®7b$ ±acJ°»Ì,‡ËÛ,8ì8p)îpUm¡âŒ›Ï©ÍŸ_;óX¬y ÞäÒéÚôΨpúRrm9ÚÙŽuO”.·Ž<$×v@ár0a2˜·²À˜y!6{rJX.Za¡Ù~ èÑ ®ß¢3jaRxxB¨åò+f6m&îpÉ)>ƒò§XpGáÊ +mZpÔ=ÄŽœD|`ð€ÔPÿ’ ÖÙµ6 +r…Ê{’S¾Ì"”Þ‚+ÒOœ•6ɇ,T Ä3Ò_²ÑÀ*ÇP>OË ŠbI×ïúåê³)öhKa¦¿±lLãVÙÛªL”æqoåÒ8Ÿw¸b*3ÐhNa$€ ^éyI*-KKµ©“§î~Æk¢¾Œ\?*äiy"ß9Qêí†kãïAØ0¨ „ÒB$B?œôNw #—æ w|_ DL¬É§zò2“˜d¥R­»yâúsÔKŠ…`i%Ö8*/G›G##Þ̬‘¸Ä¼7ÞÐgtìô—¹¥æÆõÌôé~ \3 3³1CFÂL…¡f°²9±z]Hv¼Év¨Ø\9‡©|}áÔÕǃÙIà²äêÑ…ÝGw~›¶0±…±©pai¼?o5;% ‘j»à?ëjìüA¥]iq[I¸;#¶2 *Ò,T5¤ži..¿ÆÈ5ˆ‘MN/äMÛ¼YZÑêÒüîí`njÌJÁÔäQZn*û&Èén¾µ dÑJ†Q!9Ä_tǧÜÉžXž/Î:z÷Ó¹é“5.Ñ£åìI†Ôãý\.¾ô7u +KG{¾Üº;Úc¢“c&Àqn5`>3œ:vmóê““[×K ¸ôœ– hû­`vî~!TXVÓBF¸hÛBFAÈI…E-*î±èíL4ߣ}©CúoîÒ:_Üð—6ÄâL§L˜ÄH &2 ©°A>¨!4ü•ò€¬,Nnï­„XE{‘ð€!c-æ'Ä©C| +âÒ”ÜÆC-Ì_†©0ÁDWHø…ŠFÀ¸xôÛUõŽqÀô¦JKRnrߘa@ëÐ8§X‰57S½“áÚ’WÊmíÝn,žÖ>1?×\»§²t5Þ:Qž;_œ¿@E&õiâÞ´÷õ½4…ùjËÕ#Î`ñ (Âz¢e`€Ýµâ)llš”ú«#! ¶7ÑÁø$éKdÚë¹é™©H}ibéleö®ññ‰T{+ÝÞÌMs''uTl âñG'äüâŽP£„¿ÄÄ&ÝrÛ%·Ú°žÔ‡;B(0EBv.?w˜ð˜`~þÈÙ«¼äU”6ÖJJt¸onÍíÜ:rå™ììº*;#¤Ûl²«ÇJˆ;¨ÆGÍn )%29ÃÚþŬÉ2àZ4à 6…¥™{ÏÜ~uýêó¾Òê¨Ç…œÅÕãAÄZ©¨NQ*¨‚(Ú?noëIÍ!|Q{õ·:rÉn¹nu7%”§· +Ý#bvŠÏÌ¡Á¦ÝW%‚‰Ofg.š]©q‹‡Kô¯(*þÿî +H`HOR:Lx V^2"ü]Ǿ}`\F@(¹Óx°n"åÃZƒ† &3¤ÆöÖª,œòi`À(+ÑôìË¡Ê2JË‘ì¤1_Á_ZgÓ‹ttÒ_^G…œîÛEà]a> rÄ$xFmeÔVV{¶è ^gã€/½kÔ²Ô +ˆ•—ýŽëãÖa6ðŠ’Qž–kL¤âOÔ2Í ã„7Yß«.ŸOtŽ2±šÃµ¸e£³ßŒ•Ê0ÔZh@î.yZ*O´N—çï¶ô›?ƒò’ðD›@46·Æá1Q1Zn³ñI,P(‘ïld›kv:áÞhi¶µ~uþôCK{·OÜø~²½MÊ;'î=ïS„˜5‘A“;ŽŠµ@~%Û=]_¸ls¥ïƒ‚âN²‰I& +¸2²{\O³ X @7ˆ1w¤ÉªÚÙ$ÀFJÈFÊó¥• _^çðÇ+™Ö©p~©>wºÑŸ\PA¬'˜?{ÿóL¼3 qê±ÑçÁIÄ[y¬>DA:#¡°ÒÀ:ú³sÁâbazgåÌíöúT¬x"ë'oÀtX‡l¤ÌÍ+Vˆ@sHOŽ›œ(#P¡oæ•=*J¥•ää6ð6¨7cuÄÔ„ÊæRX] ´fvílß..ßœ: {óûFaˆ—w¶{“”Ј٭ÅÀYH)WŽÉÕíCJûÁaÚLØû×[ 1+3nã@„Ã|‘Ïw +>Q¡GÌ?¢ë·›0S;Ÿs†jå Ë×oÄ'͸•UÜѦ;Þõd¹ü*äIô/Σž¨ ó:ƒør´X®Ðæ”Ö}úCc¦ý£¦!-²¾¿{ 3Øý` A…t +Yw¤îÏOŠs±Ö1.9‰ y?0Hñ +Ìøí À[‰Òàel¸.ħŒ˜¤ƒÌ¶’AÔGði„Mƒ\0ã!“E=©Aµ$;ÀP<]X „b(?ÇÊU›Óo'ýžHž‰‚L馧·Jó§cÕåXa¾·z>Rž¹¨/٠׎À6gç¥Ê†;>kvh’]bÉéËŒ™(`CÝ7¨ˆ1)w¨'õù"°_aøö°Æ€ð|´íO/Dk[n¹Æ Së—=é)PT6Æpgqʦ…x'ÞXГÂô–œþҸŵOaݯ°*m !ä<±Ž…”Œ+Äk&ªXpz¸ #EPŠsíãvt8ØlûêIëa^a¤þ·*ŒN„‘Uª?ƒ:—ñÄ»T¸ÎÄZX „ËÙÎ1Ôs.–XKµ‚g¬žŒ–j1+Þäl ¸®°vºÃ _jO³±LI ¥Í¿oÌ®0RùÚb£w¤ß&N‹jQ¿Sª‰•µXkTõƒ +»7\•³­! ‡Å ±‘º/Ù¦9ÀjcÿêŠ 8…È#ž„7Ù V6¥õLï¬T^gã-áômm j]¿ !P[¡8Gõ8ˆXàí¿sg_†¡~³zq%mD!e1\ž˜;qQx™éų/ž23Þ•šÄ‹éîÌfknÏ%U4N ³wˆ8l#D¤j#•`Å´ÛŸÀ÷H%U@GaRZèq#qXaí·Ú¶2¶þÚºSèß>3:ý„7‘i-×æ6Ûkg»Çîî½2wüFuáŒTß°²Ñdi¦á”é– ä]¡&櫺Â]•†ÙŒ“l69Kë´¸ÕÑÃœÑáUš(§'Mdc#®@ÆìôƒÏ‚9`RÎP•‹ÔÒõ嵓7i©¶¯ËýgÊÔ šÀRJeÛ««§î+/ìè)âXZ‰7wÄâržm¼>½ßÐÀ“„Àâ~Hž·!VYñÈUKà ¡#¬˜Wð1«æ Œ‡ kQ]e/”fèÈ€v‚öÆ)L Ì“í㗟ݼlìJPþ2ÐôpqcãÁcî ÊæªgwÇ€á!½E'_ðÆ&aw\a (oÄ/ÃùÆ!  sZ›gHŒhÑQ#¡é—JÏ€Â:fÀ€Q1¡^@4 ¹_ÆÆÅ!&† zrm•ós[WšËç’õµâäV}ù\qît °€ûÒr¾ç4ËŠ *« hǸ±;%'ŸæÂUàÇÒ#FðMÕ°Á΢žd¨²8süÞ•óßÍOnŸ¸ðЉkO{R]ˆM8¸ŒM‘bÕ—š‹·öróW=™‚OfšG#õu.ÞØbîw»ôX˜ w!:þÓ]æCZª8xÆ“W÷wDõàžt¸´hgeÆK™ÎÒÖåë|ùÔ`uéÎmÐBoãîÖúe:\0S~O¼SœÜNT—¼ÑºœkÓ¾˜Ê„ÙÉ0Â¥ô~ÜL»¨²xtŽ€—`:Îûaã¨Ú¡1S´?ÏÉmÔ[‚™”©t—NŠ©¦Ãöe»Õ•‹Ýc7F;»T¤¥½Ñto}ï¶Å6 Zˆ‚hq†­DXipY‘ãË6{Çz«÷÷ h@`Ø]1.Ñ#ƒUp*¨%Js“«/›Aó¤ìl acð„ËÕ!¸«ïQURe¦ôgL‹‚"ftðfÄ;0¦7!,î‰j¬.i±ÒTk Êia1Ù< +*ÊÇòù¾ƒ…x5£Ker›ð3XC¹Ä ÊRÀŒzõkêߣ ÃD@mÄÆ´ÈF]!œ‹~çêÛÇ¿u`üÀvX‹^FÈ€CJWçÄÄ„Ê€¹…”õbB–’|zÚ_\ÎôöÒ­£Ýɵ×~üÁÜÖUÀŒ€†¤âœ”ÊƧíÞ´á &Ò]8k"C‡ÇôÃJƒÚ„*û»Û ÀHpÁ%$îÛh™ +\²j­zÇ•ÙÓ—n¿ò0¯#¾l°°*æ–R;­õ›•ù‹¥éÓl´%%Ú‹Ç.“Á„cLTØÒï'–cä6%Mè± ÂÆ€Á iÄæµy¨±!ƒp–žç“3”/»tär±»A‡ +|ªßÎ%ÙÙ­.^™Û¾µqõ¹dg+Ó\YٽΧg¸hƒ U1> õ·bO£\Ø!k£FL‡xM„ä[lx¾ÕV‚1wøžì¨ž8 €€É´ Êz †døŽ o`þ≱2QQ:Üh.ž¯ôŽ'Ks‰ò̆BÜ©jû{ øtQmã öJE2åÅÂÄ‘#ƒ±à^uߟDÑ@ñ!w¼Üݬõ¶@ÅGËœ\¡ý=¼¹âð¤t$Yè¥Ês +#:®G vÞNJ@( vϸS0A.†’ ­…$˜p±·1·smöÄý|vÁî-š©ØäÒ™ï¿ùn4ÕQšhàî06Iû«´Øtjºþ¦Nw _œ>)Ä*#Âi\ƒjL¤ÅÁÛPŸÇŸr¸‚&ÄOpéa úo ºFmJ³Û†úõVΊŠWTL´ö®=®²Ñ#cB†Š4øÜŒTY‘K3ÝÙÍ뼜ï8œiËMíús³žÄ¨©ûÂí—Š—n¾ì •¿yhäÀ°@âˆWš] °;¹h¹:½¶{Ý.ò…ò¸˜õ¦šRq*ÛÛˆ5í|ÌŸŒ6ŽÒ¡ºÐh¢‡ 9V®Q²ë¤êË´”djs´ˆh$D3%)`~Ì ž,-5LTÄÆ$F¬Ü>¬€<RvGZ¨7GzÓ3+ç‹ F.û²ÓñÖv~f¯½vuùäýåÅÓBnª1{ü‘—ÞqÇZ2„Š¤XÆ’‹MÝÙ•»è¼tóhÏ”;muw:‚ªm^„ɾҰ5â@AŒõï>÷·É®ƒîžp‡+´/YíäçS…öFyê)浨rG@T¸y›J HÖ€MÑhe!\ 7¤Æ@µw‹Ù11d h¹•›=®ac-1È!Q³¹Âv6 Œ ¨Ï¾D¯ßÅê’ÚB2¢±Pj3 ž1!>…žÐÞY¹‘Aw çæ„T«¶r¡{äZïÈ=³ÇnÌm_¯´J´`”‰Y1Á`ïïÙdw'­ F¹¢¾èD|\Vp‹ÝgÇ%‘„0?(_z 9ªq lFHÌê±Ó vpÖY9µÅcw§˜ðé/‘š ä\Aàó…éêÂé™ík3Û÷–V.X˜0(¹•ù3D¨ +óiŸØ$Êg ÈA±ÒÛÐbüw)Õ§ µ6^mui!—¼{¶6sì¼Ã×:E¡°ÀÄ'ùéÔôNpb –hzcçZoý¼ó[!ŒÏ ©™ÚÌ©öâ913C^.vxìÅLçø¿ÔŽ0-²?9™™Øæb“T˜Þ¸â‰OìS؆Nƒ3lqÅ©& +d{ÉÊìÔòncñ”ô“RΗnññÊ'Ë‹'î]»ø$(„J‹r}ÃáÍ›œ!PgXOÈ ÒÂ…¹¸ CùƒJç1Ú¹³ÑjLuô`sþ€Ê¬´‘ò${þÒj¤±m3“²œê\»ýâòéÛ@ ÙhUÈOñÙoƒºm&„wJ¹ö Ü[¾ãÛµV`Â1¢âÀQW;GN]yë_]r“ 7M®$žWÖ;›7ùD³9³½sé±\gSkô ãðp**‚¸û÷ûŒvŸÖΪÁY˜ ¡„¼2âIÌ$jG‚©‰êäÑîæÝ‹gZ8óàôñ\¢­Åü¸7¯­æ&;˜ˆ[*Âl +h1D…&·ÒèÖXX‰¶!ÞxnÆ#U¾}P=¤€ «³Pz‹[o÷+­<æÉLm\êÿ¿è†4ðÉ®ðŸè™œ‘»†¬˜19)8<:RÖ½¾~53sÖí:C!7›è·D~ïÎ\ ù`a$¾Ù±ôû÷j­¬ö( Îýýí«,£Üì ˜¨ ó)ì¬K.¹ãˆ‹…éÊò…Hc#V[Ít¶’Íuw(ü³¥¿€%ïò°;ìDÿBº?]h,;s©ï6ÀtüB‰% >=±~©süþÌÂÅô칉#÷N½:sôJ¬¾š¨Ì¿úÓß\~à`Å¢;X7:ü8t¼é V@Ý80æ Å¢ñ·1~û€úЈ €¤‰J¸"ZªFŠón©„ùóTdÂjP‘6“œÖ8Ñ×t”K"ž$æO›I?*Å+ó.1[šÝ]<óp²»*Í“Á‚ +¡làÌòî}×{cbñŒIr‘IœÏëì¼ÞFõg8(‡ÇìÃÊŸ7“ß8 <¬€Çt„Æ̘°æ+Y@ŽàANª€w$˜èn÷NÜ^:ÿTaႉ¥š½#×6/>ј=±uéÑúÊÙ`e¶¸x&1³'TÖ}éÙÞÊåÍsÕöµñÉ©Xc#\^qÅg,®äˆß?b<¤€ìt¢‚Z;@!vGð@ž …ü´˜Ÿš?veóò£þB7ÒXÈÍœè·'ª¬%[§J³—å꺉-dÿ¶2'&:Á%§é蛜'¤¦Iñ€ÂFÛٸݛÓÂb³° ZZ ðÙHn!Å“2½üÔ©êâ9àâ@üSL±· ,¬ ‹ÅùÆÊåµ³MïÜË‹l¼1‚—[‹{îPÖêÁ*ÀPà|uEâ…)!V7a~=ìÕÁýÍYŒxȈKt/^]:r`ÄlwEàС²;TŒ×—+ç¥Ê²•Ï/ž¸rÿÓ|8ow…sÝSéΩheƒÏ(!vÄ€Cx`gïþ\cm°¿É¬fÓL´#•VSÝÝXs g£§.Ü:væ€ðFL$R]¾rôò3KçŸJkF"“GŸy}fíŒæ+5ìccÓþÜ +æ-¨â-´DëëÃz§õ[É42X2³ÞÔ%¤v.=töÞï ñ–™©þ¥ø^´²ÒÛ¸´uå©âÌ.”QOÆ-540wpÜò­CªÃfàÁ[!Pêà]CF£ ¥z*3¢FnZÈhËQØsÈÄù„;Úˆ7¤Ú;¨¿ÂJ…|w»0s²º°»~âÚù[Ïe»|¦»º÷ÈΗzÇzqéö›ÍÕ»™H3‘Ÿ›ßº×—jCŒ Ðþ¢Óœ«¶Ð6\¢Õ2pþ¾”vƒš@I%¹±ïn7V.V–ö¸D­»v¦0·j¬K OfÖ®÷g5Ç@¹<ÙžÞ%A¾”Ù“¨3 5.Û£GÙö`lÌÁÊ”++7šGnæÎ¥:Ûá*¨oå@²1µ}·/7ÈÏ4Ž\5¹—\Ä:¹|ÚJúT6W¨¸ÌÅ:„7ë‰4,DH ±#û¢ à”î² (zÄëR±ê™0 ¢ÚìöÇV§ ²`:˜$¿så»'.?ÖZ9/çgØpY» Âtª¿SYh„‹'ªË‰òB0ÝU˜É£f…™¶A`Ûì®4;+#´˜*õ¸PzPmåBÕÆê…©÷UN‹…_è_àcWo?Ùœ=®´ƒKc|ÖD„U6Àž¼Áá±SÁTuží³•Ncã8êºKžpEÚ˜P Īçomw'*s—2“§åÊ’˜î:°R1…‰Ö;˜|k dÍ §ø«8ŸA\²…öX5&gebùÁ§~4ªFŽXF—Ž0r+š &Ú#Ö¦7è@ÚÐoÏUsF&aÒ›l,e{Ûù©íLçˆTœöD«éæj÷ØÕÎÆ™|oÏ@nšŽL8ø´­•'7™P¹?•Å×÷ó˜P ;nÀMˆüîäJ³Њƒx“íúò…åsOL»^šÝ™œßüÑOßÛ½ûQ¦ßüj&ÖÞ –V£ÍöƵõóßm®^ʶìÝ|Ö•èj!on>Ö>žœ<;}ò»Ó»VV/ç'Ž<ûÆû·žý© +aaò*>3›rÅzÁÂR¦¾ròÂ}SÇ.çfwËKgs³'¤êBiþdcñÌÊé[Çïy +¨aº¹¶}õ©½û_˜?yavÏŸ›!ý¹”4¡E ++m!Ã&RU‘«\´‰ 9"XÕ¡é/™߸ÞŒ +Ý9YÁ +ìŠéQ/€¯êÌ &R–2LmV.Ís‰iT¨ ž<Ʀ¬¸0tgifL¢<ýÌn„IØ <‰0Q J¨'⛕À• qƒƒ]A#JÛh¯[ÊɉÒôNsù<+Wí,8ÈþšŽ;3î0=ÌÙðzRžxËê”t0À4F û4VVe¦ŒNOˆ‰æzså\~jGÈΞ´ÒÊxÄB >Ó2)dí®8Æf=á:Æ%toï/= Æ ”É!…š Çõ$DìN?Á'€çßwX¯µÐãâ®aãA4l$—ÚD’¾„Ý%ÙÝ!±0,.S)ìPc)ßÛŠMlzS“.1ˆ×åòŒÓ/㼟•ót0*-GêGëi<ˆa&Xu‰Å! :¦ÃÁWìpGµ6ÄØʈÈݦ¥‚??›š8Ò˜ßZÞÙ¾psbq'Û9:wòÎÑ›+{λ'Y_æ#%!ÞHWçÖO]÷$ÛÜleálwã2€HmÙ—n»£¥H¶}úÊ#Ç.=dúÿHzïïHÎóÎ÷¸g½¶Ì8ƒÜ9WUWι+tuÎ9 h42À˜93Î ÃR3$Ò¢Ö–¬mK²½»ö®ì÷œ»wÏýõ¾­=§~ 1]¨ª÷}žïóù¢ú}^Ò’rc65ÔÊÛ«—¾ºré«©æNwyÿ³/réá[R~ÉimÜ®o^¾ð཯~ûgýÕß½úñÏ]{õÃoýå o}[­n¨• !¿f7ÛÛ÷wo}´tø8®Ö)9_ƒ_¹`e’¢œbÓ\~½²vW)Žc¬]]Ú¡Ôgw¥Â2ê˜$VixiëÚ[¸ž처jaF³8¼Z]^*" .½BÙ=wŒgµ\„²Amõ‰?n΢O˜¸XH·ö µìAUX.5·žÏ/_dÓ}:Ù!ŒŠ›t¡ ’Šf 6+YB/“‰2—làj”à×þTc#™hPm1H@5ÑDSÏZu/žð 2"å¸ìJ²už4»¨T …4)¦!Öá­†+"L¹ „K É6®Ö€Ké‹kÏLGA”Æ(;LÀ\„°Ä¬"<ùf`˜G˜$øßi/~r9í£\ˆ¦““sÄŒ”é¤;»!*i¥«fi W³j®'f—K’Ò«¼nTƘdѪÍ%Ëgñ©¾XXÞp&–ôôJ"·< ¼˜ cªÃìɹðÓgüÀD„Ñ!—#„Š¦•JK‡ëÀù^~)ÛßÁµ´’iv¶nå¡Sš¥¦ä!Æâ̦`µ”tæSvm-ÛÝ¥ÍJ\)‡PélÖ*)NÍ©®(¹® æŽRIÙasíjyißÊÔZ•;ßèl v¥½vþèÞ[W½ëñ·®¿öÑ•WÞݾñRëèæý×öo¼Ö_9xîíÆÎ ­Ý‡Ãƒ‡íNëlŒs©Ös¯ÚÞ¾ùì"2åÃãrž¶»Fë|aå:*çh9}ÿµ³æ†UeË¥±Ó=>Z»úN}÷À˜ƒ‹÷¼ñqqxrT² ©uXkWVnl^/·|%L™—ï¼^èíÍ„y`«ç"rJÃb¥¸t :o5›ƒÃÞî]¨™Þ>aÖƒ´ƒëU:ÙJ÷âzÅ ±¼UV+FóÀ^ºVÝíâKß^¿ðb¾»©8ÅWÞþxýüÃ…˜tÚC²éU³}\^½yöÖGfuÃHwî¾üá…ÎD„yXqƒÄÔƒý‡÷>Ú{ð±\Þ,´¶^xû»™ö®’5yv&2ãgÂdKNu³»}›V +—o¾üþw~ŒËEXkqù 63 [«—¿¶sç›™î¥0f^{áÝ«ßÓòK`ÌOºã ³<¥Ò„Þ9±HN¹°Ýsw.ßzÕ ‰öìâŸ=³ð'Oºž˜ŠxPÀ<›A4د28 ´ +c·1µ |nˆžlf„‰y`²b¤.%«T +` +ħùÌÀ¨ïV–/ •0¡:•59¿âÁ'ˬæ#´ŸrExŒ³X%ˆQ.?„Ѳ+€Ì‰0—Š9ïd‰_>Âe]Ç›U£²š_½<ºôjïðAiãŽVÝ› SA„ç­Z ,i§?`}1—Švu‘Š!Â2rpK^Dð úLˆ÷¢š‘áÔ2¨ì~H°ª åYµ„±)$Çp-‘nYÅ%„7æ0Ìš˜’e“µÚÚÅÑѽîö 9Ý1ò=%·`¡Ãêœs¢˜‚Ñzœ1Bô)âýã+Œ`\ŽjÓ€ÐRc,„6<1 æ2„Tˆ’‰(mÄ·Ìt«ÖÝ*´·yò6³6¾–íŸÓ‹}:‘§Õ””H)F +Ä…(ÆKbŽÖÊq!!u?Ìû£ %¤µÜ´º 1E/mµm1ÕkŒ/÷ön§{ûmd‹í­£;viÑŽY륑˜îRF HY”4‚q•šôõJžv¡î˜esrfU/nrfR¼’Ì׆µáø€ÖÜSë{Ù•¹á³²”áÓʶ¯¬ìßÜPPPÍNþ ˨åy>ª©^¾ûð½^ûÐ ‰OÍĦüü|ÜŽ)u£¾oT¶¤Dþ­¯q÷Ñûsüé©Ð|ðoµ.”w€q ‚³Œl;Jè@4`ÞQr}À~•å£l{âFLÖ/d›ënX + :•¨ÇÅ<*¤½àƒg]¡@¡9ÑŽø£qLL;ýóܤƒ÷ ®TPÖè÷6Ÿ×ŠË´]W‹«Jq+Ì=1>Ni´”ò„Ho˜‰&B9„—S}àË€aA˜4¯–99_nlt7®{q=DaÊðAÒB€šÜ3k$ËËó +á©Åø´ã ø 1’ 0€7$µl•L'ÓÙÓJ›BjX\Ôò£®U:;Ùƺ'*?@Õ é¸àd„*ÑZ ÜÒ¢/*ª)ÙªÏúIŠ®‰ “}ˆ±<H˜ŸIæsRzIu:›@å„øäÛS€yð8¥Æ%FjcfðÂÊ”ç‡Pæܱ¶ Á…0z²Ï#®U£lÆ¡íÊŠ^úaMÆ(áR†Õ +ŠY¤¥¤;ˆSbÊ.té‹bøƒK”)%Œƒ+Äâõ!“¯r? A<+˜8k…âJ¾êc6`.ó“‘ãbFH`\Yô£§gC1ÀêDâ™3Á“3‘Œ`4É(f²ž­ŒA„OˆÝ…ñ4$•£\&Lš0#Çi>WëÉvùéÙèd]XfT]mí¾Pß¼é +QLE¨Då£(Æ°I0kZ^É´•t^IñZ¡4o”3x^qR›ó"ѸŠQQ˜`x Š£+"Œ¦ä;¨V’F•E5³¾}qÿò}ÎȃT5Šk…Þe­°£¬Äxƒx¨ $Dp5ó!D„(á³T¢… …"ËjnÿÆ—>šæB„€å0€^Ê‚u#€÷”ý¨æ†¤Åç…E\È€›‡93F*éúZ²¾¡ÇJnEt¸\ +ašb7d§â*BšZnÙ,ïAb„–'"N/„݈MRL>qÊóô™À\€†˜\\¨D¨´I/¦ç—1©@%D$êúâz´a ¢Ê™¹ˆ/DwvC§¢H”|D$¢¸4³‘ô²•DP-‰¡¸ +Q6¸%_Œü©fsþ8PQRÞÍÂ9Âeó`°o¾æö¡h —!Ú†ÙdUæÝwÜaŸ:å^€ÂˆâÒA0_˜Žñî‚…Úò9N+ø"TœMÆH;Fšcƒ<3>=ã›wÃ0¦N͇§bþ˜Ãj²¢X%NÎEÑ0ƒúÌâSSg§Cg&Ë`ãs>”’L`£¸8íŽ=qÚ‹KÖlH`ò}Ö¬Ïù1w˜8½}âäœ7‡qɇp8—È×—­b_°*\ñD°YoÄ¢Ô3ŠËv¶—[:wÒŸZ OÍùÏÌû¡8EP¢lf1NSSELM¹b %&«­Õt¡ þ# †)Û–ì +pâA"1åFÝaÚã9'$Ê\^ðÇÝAÌ!ƒ Æø9/‰kªY*Ô–ÓµAœ’$3rÙÀ‰DùäéÀ™8Mí™3î¹0ïÇ“˜R㬮”ZìzfE5Ý]»@%`ÅÑFCÏÒõM9µÀôÅgM”·&߬ƒ@òC‰óî06½Xð„cq.£}QW6Ñ åˆ/$€ÂÁ[ 9˜ÒRr;¬Ù fˆ°î å`§gýÞøzÞ(b‚3ãAžšòÌ»cK£s;Ç÷ 21ïE<<aÁ #Bæ]üôl0‚Šg‚¡úYeQB€1ƒ\žH F D !åP!;yOíCǸƒäOÏÏ»âóndêLàÄIÏ©©Àœ$¯ˆÑ'g·Ø™òÙãÛqÖšó Þ TÅåQ.N$Â8³S“m==Á2DÞ(wfúÊÓ®„ep?Ož˜‡ …W€Xôc3nääLgI.aº?Lã¬ÃèÍgçB~rñOŸ{jÊ ²ƒ×s(£¨º½wñ–d—g¸;Ê… á3¨\‰±™Y²upxû•¯ÿõ""þ›'¦ž™rû#-$-­&óŒ ï_¸µ²wݳ§"‹!j!@.I˜Òp^c¤D"Yt*cJ."Œ£&©ŠsZ!pŠçätaüQ4ÆBÖœ‚»½^Š¦Ôd*€1 Ql! û£#çY½ëƒTWT8¹œ|?çí 0­q-ˆ‰PÁïCá‹‘\¢`7¶‚„î‡x_”ü+«dE£4ë?;˜óƒB#¢t2 s>܉™ÊÛ¶žÍåÍy! çrªí46ÿø—&Î% =·È˜V S1B‹s«U!ÒÃn¥[É\ÇA¤SŒ +a"„I&øÂð¢/l¤rû—nÄPvêŒø뮓§ý@apÆå•',„‘„?„úü‘é9Ï©'Q%ŸuŠ…Œj~c ŒËÔ"(a¾Ós¡éùX}!öäßOÏ>ñä¬ËGQR‘à30MPªnådIЋ ¤C1Ä`­é…è“Ï.<{Ê=3tûP‚s"ˆ8¿™š ιO†+J8îwâŒïÙS‹Œœ…Iýä´oz!¶è'ã´!ëÅ8®»ýôÔ ä1“ì˜N»á@ˆ'»àa‹S8Ë㹌Yëµã<ˆc²•ÉUÛz*ç%_4EÕ„•«vµlóÉ)ï©Ù / Ô*¥ë BdÊÅÌò榚)̇‘i/샄RIQM$M'ç8Y{mmùö /–;ãÓ ÁSóþS³Œä–Õ4…„P$ª(¢ã˜4‹»½óþ€Çc¶-å Ö¹ýõ½£ÝÎör¦žQ ‰SÕ0!žìö늃LçDUN(¼*ÊFc ^+èØ3·—Hkù΀ÕSv¾°ze#qÎÂOÌþì„Ëctúô| Ëñ²]j z«ëœ¤™õ@Lt;%LJÆX#[_æÍ"›(âRz!€b4„K0Á3¼†³‰ÂC„†‹yœ³Vb)"•ÔU=Áð‚$K8ã8L’P³™]÷ ¨"‚Ø`˜Œ"„©(ï ³aXDp=c|~_Àïöû½¢(ÖòÉa-½³R½z4¸xn套ïn“RbAíÈÄô|ôß>1ýôiËG q¹"±A`”&«Š, ‚Ž¢~ Ä,‡Ó$‡IŠAqžfmY/ù¢Ô‰iÏOO?õìâé™àÔ¤ÇQdvêTø‰“g΄æ=˜ÛO¸½12Ó…(BG!R”`0?ŽRI’OÍ{¡§O/ι!桸ßëƱ &Áå,¿ÔvVFõRÝIåÔF-y¼Ý¹yyks»W©XåbÒH:‚<;÷Ô‰ÙÙyo(Vçõ%dÜË•ª¶¤³‚&H¦Aq´i‰¥’:êÚo§ïž«½qgã£Çç¿ñÚùßÿâ‹_ýäÛïïïŽêõ²À‹‘Œ¹#ãŒM0f „fÊêR%­ç ®WµVû¹¥V~sµ{ãÊþÅãñíë;¯=¸ôÒ Ï]8¼P¯Ö­¤ÅqT(œšñyCÔŒ yöLpÖ…>sbñ™ Ó³>¿ +ú‚<…§ ¥Q+è +/2x1Ÿ.r–éØV6 +SO\ ëñÇc¡‡†Ü]6¡sCó…ó훇»—‡ï?¾úñ»·ß}´ÿþý•ß}ïÁ?ýê£÷ÉK_}tegcà8‚3‹nŸ×5…ÝõÒh/^­ ׬+ûÕó»p\;êÞ½Ø{ôÜêkwGï?Üøݾúïýï¼w幃b:º½ž9w%%Œ ÄÀÁ†tø +ÊÃóå^Ü~ëùÑw–>xiýç_Üÿ§_ãçß¹ó«ïÜú§Ÿ¾ù¿þû¯ÿêÓ‡¯Ýݺ¸ßN§̆£ ¬”%W²ÂjË8XN.°å +ÕÈR£Ž3îgÖ—ÒWöZo¿|ôÛ_ÿ»_üò{¼ÿÒƒ;ûgw—DÏ»]ž`<€'f}OÿÃo?þÑ7¯ýáoüèÓ[Gk…Ž„üÁEWŽƒAÈg0aº}6ÿï]þéw}öÞõ¯Ý~òêÆ_óÚïôÆ?¹õ£.þáWoþãžï^ëîQuwTNÙZ:–´´œÈÓ4c +±F2¾Váolå^¿µúâ…Æ˵/>¸þë¾ó‡ü«ßþü¿úòáÿøýÿßÿó¿ÿÅÇ/µ?{óðç_¾òÖÃsICYtÇN͆Ý!§åPÐ zâa—€ù%t~P /oä/m•÷‡Ö…µÔƒ+ƒÏ¿ñâûοÿøÖk/Þ±­dfbˆÀ`XN¥{b§Á>·a¼{é/¾våó¯]þÉ'÷ÿÃßùÿð“ßþìC0¿ÿË—þð›o~üµ›;+¥¤!ÒŒ )ŠÀ%ªø¨€žïs7ÖŒWŽ +ßy|ö'ŸÝÿòƒkŸ¾yî‡ß¸öøøüÝ7ÿå7üæ{÷ÿöË;¿úâî+7× I‰a!._$xBÖòº²’e^Þ³ÞºZ|÷fýó×7ÿæÛ7þûoßýÇŸ¾ùý¯_ùÍ·þù'þñôáñ?:üŧ—¿÷îѵ½r9ïø@E$†Žûµnz­¡]ÛH~ýáè¯?ºøÙë[Ÿ¼¾û»}õ—_¾ôï\üË·ÿï¿ÿäÿ·Ÿþó¯ÞýÝ—Ïÿ×ß¾ûÝ®nõ“ä9=3ëÄb1Ba˜~Aj‘ºæ¿<àîí¥ïî¥^¾RÿàåÍ/ß;þôŸ|v÷¿üýçûýÇ¿ÿá›ÿú»OôíþpÙ)÷C˜’´œ‚-·RôN§p§ÿó¯ÿÍw¿ûöáwÞ:÷£OîüËo>üÅç÷¾|çð§ŸÜøÏ¿|û7ŸÝúìAûƒç*çúrÎähŠ™õ=ýÔLØí6è@/wÅëÎÃKwî­ÿäÛþù—ïü‡¿þ÷?xõïøÚO?¾ñÓ¯_ø«¯n¼s³vi”h¦HSBQ8Fó:J'V¹ÕìŒ{…^Žf±KîÝ»K_|íø߸úý¯_üÅ·ÿþǯÿÃOÞüåçwùãøÞíÿü³W~û½;Ÿ½ºò֕܃ãz)£#@bŒOò¢ZÉ›e›l:øÑ0q{Ç|xà¼qµúÙ»¿ý«‡¿üü¹ŸzóþÇ/þçú«ï¼yð·¯ÝnǨ0D'€÷â‰$mØØj‰º0Ð^:n|úÚÞ—ï\þá‡×þõWþïÿúóüáëýÁ¥÷îïlʦJãCyAËÉzNUcÒ¼\”ίŸÛ«>8,|ï«ûûÝÿ£?zeï£û+ß}s÷Ç߸öÉçîžoŒkÕrU2òŒ’ x±IE±²…d2%âm‡<8GË©«k©¯Ýì|ÿýK¿øüá—ï]ýΛ‡<Ø}íòÒ£ãæ­âz7QÉô |’KšÕ¤I>cª)•Ê*øJY¾{PÿôÑÖÞ?þõwþæ{/ýþû¯ÿó/>øÙ§·þÍKøékÿúó7ý­ãÏ_ª?<* J" +ÝX1ª©l_-…Æ* ¢¦ÁËväÆH~t©úøZë›/oÿ—¿ûð¿yÿw?xùŸ~ñÖ¿þîãŸ|ûÞÇ÷ßy°9êge-±&L& +¥ŽÈq¦Dn´S6LC-öîNþµ«ƒ‡º·ÏVÞ»=üågwòɽÏ^Ûÿú ãÇWW²Ë%EgŠä\$35B’‚‚:hZÄfÛÙ_)Ÿíç¯lTï7^¿6|ãÖúë7×{æQ7q®g/WA®¢cI’ÌOK)RH j^”’…L6g*Y]«§Ž–KçÉÇW»Ÿ¾ºù«O¯üóÏÿè7¾õpí›/ í§^X7ž-­•% bp)Ù‡({чF!‹5"\Ò°õªtØåîí:¯—>zaå÷?xô¿þðÿüË·~óå+ßzté¸Ö)¥ôz%Œ0‘P‰e +Ki\Éb;Yi­n‹—6JÏŸk~ãų?¾ðƵ›{' +vû\ogÈóCãÅ ½^îæáò•Í*8ww)ÕÌë–ÆiŠŠÒ¦?ž`ÌeI¥@Èy;ÛÒ4‹F`™"²†’5ĢśÎñjõÊvçâfcoXì—3½B¦•±-Ç `¨1w„Zq(›0Ùç }¾x$¢Pt»ßìWÎ2Ïmg>xaõËwÎëåíïxóûïßøîç>´ó­ûï\ï^^µt. +E‚$«øa¡“iº‚#óÉt=ãØL¨iÁ{ýâ²}c=õùëûÿò7ßüO¿ù觟Ýûâík¯Ü_9[_é¤T]á´œât6‰°FaYN¯ëI™ÍjTÉæ³ +]L½‚ÝÉèƒ wa%wkp´Rn˜LA—,Iâ)AhW™v“'fà©à™RDÃ"am]Ë¥œb*Uv¬”ÂØ•V¸¢%jdLAc¦ –Ë=àУq> Ø .$‹}³À`ºýX8‚sŒ”K——‡»Ë•Š)¯–×6«›éâ¨x°”Û¨h›U}¥˜X.ZE÷ÍN»CAXÁÅJMœ˜þùÓsÓ³Þh ,S”#óKʈp/ÃËÒå‘óøÆÊWŸ[᰿߯Z4E"¤œ(*Åõüðʦ€=Àƒâ,颤²¬(Ij¥\ʧŒ-e,A—iYæE3bgñ)ˆ+”š‡y{&Hø ‘âmiò.¯˜ÎUáHÈàé°bÙœ¦˜ ÅÓÁ0ˆRÞ5ëæ=X˜J%J[Fu³œ^ÀAYIIÅ`¤‰ ­ÖZ¯·Ùh¬ X/ƒJ¢ä‹`OO/Î…È •Ž+MZo‰JéSÓ®éYO³U5¥©FÊÔ+9s¹9^¯n÷’G«¥óëÝq3ßÉ%ZY»`›`ôé©…ÅÐdmû)üÄß”—€y0ÄëùÚV&ßc(JåÑ‚Áf$4-À;üÃëG/Þ¾|~g‹KŠb©Z +†IB9Š×E…‚¢"“¨¸DSª˜P¥ŒË…ÌxPÎî9Ý rf(¦ endstream endobj 82 0 obj <>stream +†¥á±”iqb-Þn%ëgÊÌ™Q\àåd­·6€ž™ ÍY,Ñ泫|jW«°£äBmùˆ´š31%ÌMeDٌ֢X"Nh‹>ø™i/ÈDˆrHµŠAÌ à†ÑÈ?6Üž s³aq>"Féo5äT[0+‰L‹SàŒV“V”IáZÒëŒQÓ=ÁiQJšÒË!:íEu?–ðÆ +“IWL ã*ÂY¬^$å kTõÜ@Mw$³Ç8‚EÍa”ì”+°@B¨Î=±x6Ìåfƒä³s‘'g‚s!«熄?>ã›ôäG™$0×Ñ(*ðZºÔƒi-€M–'cB!D$ƒ„íFä§f&í¯C¸NëU»zUênÄô@RÓ”ìPË­L»qw˜‡Ù$¥•» ’.Hõ£¥5ÀÈ,„ùi/ ó%§q ¤†´Ù 3™3ÞígXÁaå°ü¨R•ŠëZ}'Ý='ÆA&½aÚ*õq!.-¥‡zq˪î)¥3Qõ©EìéÄO ýÛ§æN-À”ÙÕçÌƾ^qG•g¦B¾ˆ°à¿r"pb‰°Y6¹¬÷gÅóQå¤ Ÿ÷k‡ãʳSÀà,œš-úÉ(az…Ó3óÁEOŠ‹1lò>ËçBüBLö‘Ž³þìɱ¸“ ˜œmß(-…„4¢•£BŽ4*ŒÕRýòÊÅELr#b\ÎóÙ~XÈsƒt†´—ò½‹»·ÞµZ»ÏújÓéu¹rH&W ±äCµ…ɲt“øãÛ± i‡™e ù̘4;Œ †´ä‚U/f‘*\jI-Žh«aSrfÉiì’Z™5qµL$ûFû¼Ú8Ë›|z‰ÐJ•Õ›D¢åCʘl§Å¦h¢KQ©$lY¾<Ø¿æR§}¸ ’ãrÅ[>ÉåaIf½Ò?¢í¸Ñ ‹Õ˜Ü"Œbɤ'®Í„¨¹áG$Z«æªî0çp¬^Ç´šŸ°Àý'ê»`Ž`­ k­rÌ@•2ȵªãrÑŸ4ÙŽ°é¸ZŠ•é˜vÂEÀœãŽ±g<ˆ–d’Ш\Á089D,ãZwsaÁÛ!:å+A:‹È“U6'\è©Å8gM^YÎG7,Aj%ªÖbr•uú¤Ñˆ²©eƒÔž‰©‹¨ä‹bù,•‹¥1¿ýì>ícP©Lhš‘šöÆ ÎQ&ã‹'¦r!¦!Z 7—³€ÅSóÐWNù§](Ð@oT‘ŽÒü˜á…å(iιâ@Ö@à +é—Qé2µËÏÎÆãFÕ‰ÂÊÎÅG™ÞY7™ ™ ˜ßü +ÈŽI;÷dwòe›ÒH) 1y*Ê-ĸÚÊ,]ËŒž³ºb“¶±žh²™1›]) Wãσ<*mp™¡M¸¶—”ê‘PØÅI ² å€ Ìn€2=ˆ‚'êBvh6öœÖ¡ÝØÓJëFqmtîn5áDÝê_ªíÜï¼Øؽo÷Îç†WY£eeýý»n"âÒ ´ØìF¢q”^O®'{!v²æ”²:˜ÖŒI%Ÿ¸Ó'ÌVkteåèa4žñ .ÜTJÛÉîÕDã +¢õtÎ ²†I#bÞ‹ˆÞ¸8æ碊?®G(Š~2%fGJq-ÌYÚ +rEÔèƒÁ4ÚäÇ~:å…ÕÚð¼êƒç=dÂBRê°Ú!’+¨V"æ‡ÁjpÉ®Öü¨D¶ji;QÝMT¶çC"eti{™HôÀµfÒ¹Qlj•¸Öž P3>r>,¼º÷ĉůœô<¹€yˆ m-ñé¦5æýÌb˜'U&a{Éd€r@ºÑfLtªuä4÷€ D„4ªW…üJwp½BØ]¡ÕÖKãÜÒ!—êÌ#2a·# 0YH.¹èœ_lù +hÈù‘ K€á¥œ_Ï.ßì{\ZÞÏf‡8ÙáÒæu7•\8§bBIö£w‘Jv«¢WÆq£NÙ¢„Ñ¢’=­º£ÇZsKã+ûçNÚF5ö™ÜzT,ƒ|/vö–öï 3D¢îtΧ–näVŸK.]"Ó+A¡¤ÆíÝ’­¤kÅþÞ õÍ[åñÍáÑ#67ó9ø»Ö" +hZkëAmóÅôÊójã(ÊæÃLè6n·Nø™…ˆ„ˆUÎYç2›Jù¬Ñ8¤4Êj¨Õ=¡¸CeÖ²+7*›ÏOºúdVsKWè$ ‹HTÉäŸ] „³ºˆN»É©¥öÆ XȺ ÄŸ˜­ TjKbJÓ'Rõ}%³<ƒLÞ‹9®Èçwäê!錽DÆ(Œ¶.¼èAòtPÂ… möο…ë­ƒk¯¾óÉúÖI?7„½”?WÙ{9·v‡Ë­-"ºYÛê4O,b!.ë£3 ~ìÖ¹°³’½ +JŒ‘¦¼q ]'üÜtLEÍ>WصºW¾2>µ `º3½q;€'ƒTÆ…X^2Ãg×õÚÞBTœtß2ÂL:ÂÔê~„ÍŸ,,—1³O§F™þµÚîý¸VRóPéÒÝT‰ê›êÐv“´›ÙáE¹8&Ìf<Ñ” +[NïªÓ¿*æ×!¥:W‚\ŠÏ!¹€¨5ÂÎ8¦¶Á€—F× Ãc ÛRnèí,¡z›Nøâc7{›WGÇ/r™%PÅÀ¹|j)·|¥rö!_ÚR²ýîøø¥¯}‘¸i;žèÚK…ÑíÊú]§³fí3ÀÐI…˜Xð3VT-ºi·»Õõç»ûÒK—»G­üð*j´ÂBJRƒ«Ri‡LÕò¶TX}Æ ÍÇpµØ×ËC>;ð1ùˆÔ`’“ïÛ¯Ü>8 Ò6"àZ»4¼Ý:ûH¨Ãz“K×_ü$ÕØõÄ \o¶wž¿öÊÇ×^ý´{ü +“] ÐÞî¾øæçbzp:Àè<›ÙL´.×î νžî_A¤|}t!Y[Ÿ +QnÂBŒ¾R¿Ð>ûje|³6¾A™˜P²›ûÔò &e÷éÌ*f ú%Ûêk7ᬞÑ8¢œe2Ù£ì.$Tµºrp÷ðÞ{@ÃLV)l)Å .»‚èmHª†˜®µrÃ+àç'<ìbLç³ËJeÓlî§zççñúY«°Z[»1âN¸pÌZþ,‘R º)ͨX?åãŒÌÒ…›oˆfãß<1wÚx&v ã»ã+oƒZ³•o½-g—]¨îÆLبT€JƒÚ$—Îæ–ï¬]~pô*o5·nûD¢Â;m¥°ší+ /FWôæ.™¨¦›Ûà:`B1³RAPXAšùµd÷QÊQ1ŠÕº”Yy>¿ñ¼=¼‚™ =Ý_9|Q«¬X[È­šÍsÝ{»WïÜz¯º~SͯÔGååcÎé™õÝÂèºÙÞ¸د àj²Ánm7Ý»˜¨îHÙ ظ”ïlÝìmÝÔ‹@í—˜Ô’’¥››^Y>{××9»ÛX¿ÑÞ Vw' Þivw/½ì”Wü°4YñÚ?L¶ö”ÜŠYE­á|Ü>’èD=H˜åñõ•«_«{Eï^0;GFë³V¦ƒ +“h5V.ãJÕ"¤á›0_À†i-?j?;øâ:©·¤sÒC»`“Ðû¸Þr;Àœ‚¢Œv”Ï…èŒMÄ¥â¤<$ú(;&Y`ÖÊbvˆ&j\#•@)¥¸j6v(« °¿v–Ê,?»¡•\ήÓéaT*Ì& å¥ ŒYǤ\qt¹±sŒoÿåîÁ«ùñ-<Ù2vyõ +$¤±Y§…@sºVuÃnlãF-ÆÚjº­çš©Æª^YÙ&T¢`WVÅtïLÄÔ*8ÅϘ>Æ`2KriK-ïèå ¥8 :gT÷n|mùÒRe[­l[@Uœ£W—6®ˆ +…ôðz²Ck™K7™Üˆ¢¹¨he—¶.¾è4·ž\€¢|qâÓ»äʶ\XKF¥ö~rû•o,âI/•†Õ6_Ø©í<\¾öAqë!°«[‡w_ûà{éÖîåÃA¨ÅµÁÞ}@8Rnêøái?)¦‡ž>\2=§ºZlo®Ÿ»c—½D’K¯ Ù-ÎY6X†¨Ò3£úøjoû–ŸLú©ŒXÞ7—nɵC6½ÂeÇ1¹ û`çNº±ì¿—LŤŠÓ:îž}©²z-Û9°«kÀE¼üæ§Õá%?[Tj{FwÒV=Ù¿ •·"tº=<úà/~}áÁ‡@±ÝˆJ&—•ò~²{ɨŸ3Áj­í=¿yé1¬Tl*$Uâz‡Kps)&ÕÃLNÏ.ÕÇ!¹äʦ°Oþl…©e§µÓÚº¢,L.2‰¦œOq£¹zJsaó—hvÖn"|ñÙy쌴V\7kÀú…˜¢šZzðø[ÛÇ/<=yfu¹˜ØHwÌ⨛˜á2ËÀ%Q âçt¹‚ZýT‹ë­DõœZ:«–7á~Ì;i·±D3"ÃBÑ›@·k[w™ÌàT€D¤2PX«êµ-H*†èT˜MÅå¼ÕÜÃõ*)17Òêgþ•Òƽ• ¯g—/‡Ø¦•äÂò|D `V˜ìT ó%H®¢‰z€6”t“4j ˆbs ˆ±O¦Îà+¤TÀ/_Ù¿C™u@Ťݣ3#ᨔOÖv:û÷}dâ³ hQ© ²^/¥ÂŠo²õžE›i.D8L++én±³#8íS^ú¤—™‹©a./ù¥ ˜Ö9«nÕ7ëW«ë×õÚƤBÉe&¹´“D¸ŒR\¯Žouö‘é 7š:ãçµì@)ŒÜxât€:ã£aj\f/nÍC’ÓKà A=Š0©™V×®žÍ´/Zõc` }dF)ïàF ȈÓÁç}äF㣋ËçclÈ°½ù0S~:íÃPJý#§² ´‘¶[Ba#Ù>ªnÜÑëç\˜3”d·<<YŒeÜ쳌¡ZXË/]Ôò«aÂì/W»»ìä,…ø¬Êú­ÆÖóQ®ÔÏSa: Q™ùäEôù¨dÒ´Õáí¦™ëÁ“Õdmôú‘IÌû©éŸ?*a¬×°RóÅ_P ++lÌ!>Ù_i˜^vŒM/»`Å+“vî¤É§ÿçöÒýkE€Ž+Wq³5åEªæ2A.ƒ%;!!ëuV.éåu´°”Ò—]:/•Öùüˆ/¬hÕ5:3²i`ÿ¹Üh1’¨›}*9@ÔVÍ» dh¶½«WÖ}´uŸLG¹<¨È@íƒì¤c<—VÖnx0ÜXaé8Ù:0ƒsZqij3 µL'j“v|¤CZ]2µL¢Ÿ²"œa,Ù銩Î\ˆ˜ `Àfžt“* ‚V,lÀ|¥íþnkõ.X)ÂZ-*W@µ¢Í®Ö¢<­µÂ2ŸjËpÛ}S\ˆWžL7öùÌ`:Dû15B9‹1 «tr%$”ç"" +èóàpÊÏÌÆ@¸ÂÚ½êèvyt‡J­=ã¦g#2¢Ôg‚¬+&/F¥0iºàͶVÜ HªE£¸ óÉ ©ù#Ì(««äW¹ô2sªZ•q²¹f“°ûˆÑ!" ¸ˆ¶zAÜ"¤B~p ÀœX(Âå'ý¾¢âÒÚ¥jg ãmR+è…ÓÚ./;íý¹ˆÜ"¨†(WÄ…â33ñi‡(Uµ¼•í_à¾Ѧ½tˆJi¥ ÎYzêLøä<ä…dpÃààÒ#»}™/ã Àäý¸ŠJ鸔‹pé‰ +©õ _rSY~˜Zó@‚^ZÓ«gA1UË»h¢écÒ‹˜5æbŒí'tPÝRýKÙáU>³ +&ZÌ.£zS ™Önné|€¶|”ég,Pß—^Þ¼öViã{â*0¡Z}/À¤{ñÐ.);Ü//I¹Aef%¢ƒ@ךà÷'Ûçsã»Z0!•i¬Ké$äÃlU\­³ö2xX \§Ü,1½I‚©qúÊ™…Ä i¥ê;¼Õ~f6ðôŒo&HA¡äc2`Z!ÒÔS=@hg‚ nöèôˆËo¨óƒÓÃâ°=ÍM½¸äA®-Ä®$ç·¹ôLëTˆ¹& äOzÈ…˜dKh¢oV2í Vm÷ÙE,J&³í³ ¶gCìBTZ„UP%I{SêQ©´¤ªýC§ºáEuOD‘½U¦,®”•Ì`ÆŸZ„þOÿçèä‘3ÜžŽM6úÑò#=¿êA´Òè* M½±ÇgFФ3§tƃA„.' æ= ñ“Î?J~}¢ ˜æŠ²¨à´V­Ba¸^ò¢6åü:®6cLîô2ã%Íâj¦sö´—š òSêÙ9„®”‹™‘?žXÒÌdµW!ŒYs~–Ð+“š¢”|¸fR@»@*ò´3 R«ˆ=ŠiˆXò  •tGeˆÉÆ•:“Y“*çèÔ² “gÂDP´UÅå|\,RF ¸TXÏ.]Ì-_CôÖ|ØÞB¢¼žêìwwn÷ÏÞQ+ZM÷Ï•7nðŵSAz­¸K€†„ÕQN÷KË—}˜ fÏ,'Z“ó·­bó~‚¹4¸b•Â„A]¥¸UÝÈõ.2V׋S~ +‘*08”2PNàÁ¹ì:> 25‘|XÄöbL³ãôàJjp1³|]­ù¹°6Rº[\²+aÃVÑZtrNŸì.GV¾¿séå˜P8 ‡äZT(Ê…-¥|êÌ” +SÖZB•&ª4Xg|ú)õô 3“¶i°\ða†?n„ˆ$¡Ö¢|øÓ3!Þ KÑq¢´²ˆÈŒÝ5ra±‡àÇgÜSÓ‘“‹qB.ž˜‹ÅXG+­å†W·ï|Üؽϧ‡'çc(“ïœÓ}™@*¢"@i( 29å%& yÄâ|Tü©9-øWˆI’R*FŠ„ìàJ>08g¼ÄŸŸòÿé3žY/ Q)B.,D¨i?¦’ Q¢&¡5 ½@Ó‹8LYmL»¡Ó³Ð™EæA ¥]Q~Ò+Ãè Ù VÝñD\­ì)ƒ¨uÂèªÅm­ºO§óòÌBÜO„é$d£bžq–ÄüK4"lr1ˆ¸ƒH—I½ |¥3yGóB~õ¦ÍOù‰!qZ–Oh£Œ'*ÀAä—W.55º Yí“aŒÄSQ½‘é]ܼüöøâ;Ù•»s!ÁI¢Ó¡ìn„Ë‚ØÚX²ç¥ìFr܆3ê¬ÕÁ”Òdç*=åãæc +jtœîE17Ž«¥Tç¬Ty ([ÎRö0Ñ8VÊÀÎ$=ßÝ}Ô÷ ‹éMÔÆôšh•V.9ÍÝ—’vª{ª6“ã`–•e4ÚVypâRˆÓK[>Õ˜IBL”¶Ó„«Õæ#@u@øà¢Bf5.Öh£ `!¦)¹UR¯Ï9?fE…2“«Õ=«q.&d–F§08éõ•Š +•ÙX<‘R@„ \êÔ|Œ”óZ¦Çš597Šùé;íÅh9'…É¢9K.ájJÜöÄÍSnâ” eŒf\ªLyè ™ +29Hšì;¤R“Æï®°h×ôü„Öÿ5éõ‡OÏK{ Ý–¦ý̉EØ*ª+—ÂdêÉ3øÀ¬Ô¬|”tCÜ©Eô‰©ÀBHðÆ´0“~fÒŸñÂ"€™¨Xƒ”@t`|€>ß7áPµìC¾ Äç6]ÏÇõ™ˆåJ.HZŒ21ÖN5÷û‡¯e–o£F{z²8‘‹‘ +ÄÙ°”¡í6Ÿ_N +5z€!6%Å0&@\’0ê¤Ùh #•aée`¤Ød'ʘ~TÔôÒjoëv{ç>›ßq#&D;q1çôaɹ56¹ F.%Ì;nº#<«Wâ|rÊy Së^ÄŠqy>7¹a3¨˜q1>ã‰ëq¥F$@È]H´/°óN©y»¾EšÍX&“ƒìʵæîýÉÉþ%T­“©ŒíÚú¬£Z×n]èî<¿røRuóŽRÞð!Šæ´û[7íêú"$ÎE„¹°b›1;_„H{Ö—ìV®{ ²5ʸ`‘j“/Z$— +z-UÛMwŽ«&Úa6?âÁ<ÆÀgA™€å’Ù8B:4IvÓ« B¦‘8c¡œ…°¦YZ£í>pO~ÔˆKåŨüô<â‚4oܘöÑ!ÜÆ•:,T“žÒ([™ñs ,"Ú׸. +F ¤‰’]–s«î¸õ'ÏúhyôtPZŒ›.ÔtáÔw»ëgEä‘ò¢Ãi7qÚ5Ùäxp_Ü8S¿29íA]Ø@Òê'*g‡¯.zÈeƳH•¨áj5{q{H8Àë]ÌnOöBÖ,3V ¨VDïNÅ“§¢hös}à>¼¨aŒ˜X®¸|M+mÎEé)?¤tÒêÐv'LÛ@ü ¥jͬ\Åœ¥PðbV„ÍÇÕF×@‰™¾PØ7Üð’s!æ³LrJ“=…¼˜ß‹ûXbûÿÙ{¯YÒ4½ï^P_ËÝž>çTUVzÞ{‘‘‘ÞûòÞo»O»ééÙÙåî»Â¤H!BÒ…t¥ÿA’ôÄ’" Ð…ˆóuvª¬4Ÿyßçý=QùE«"­?)³ŒÙµûW5±MÈ]=>Ç×v÷¸5»Š'ÐÆì›ÝcàÖ>²G·ÃoGç?»Ó—˜ÛªVyûþë¿™œ}­£È†+ž3îBmŽÞiñR æãÓëg¿ÙÜ~7¿øh /g –hMo¦GoÂáY‘±Iµ]—1ØjíãejF–´ãñÅââkJKÊéÇXu­þÅÑó¿8~õ7Îà¦Ä†j¸xöñoŸþ)m”øu³µ|ÕZ¿¦wéՌۜÝô^3Þd´ëú@ˆè^÷RqF†7lö¶oþ,œßÕáå‹ÍÚ™3Þºµy_ãb]‹g³ãoÏe.Ú)É™šÎØ3ˆ?B+GÚœ5h-Ÿ Ï¿Gôêíc)XוnQ|®ôä¼.õŒø0\¿íœ}çÁC¹3FíVÙ°HºNóp¸~^$´¯²ônQQýµâ/i½ËÝ"[´lè=ðFªêÉztò~uûÃêîÇõÓ_%Û— D%Z»Ã €=nÓ‹OßýýæÅ_o~b'ˆþPKœ?ô&wñö[kú6\}7¿ü³ÍÍoâù³ºÚ”ü‘38‘¢™èOÀ¼7 ÆWWþîéOÿ5¥Äy¤Yí*©Ù?÷ׯÅäxxþ«Åý_hsÞn.ÞwWw¤5lƒ†6ä=8è“ùåÏ“«?SâÌ9­ƒßNœÑSx´šÖ¥ÍëÎz‡ïßþ ;àÌìα`½h{‚\ÐZ‡vú•‹gÆš«×ëÛ_]}û÷rrž¥ý€^’Ù ¥Áhwáuûð‡«ÿìüÃßkÝÓ2oƒ$ggïggï»ßÁҧ׮üÿ(ÇG š}BO÷O^)'GXÈ!=røºwò³Ö:â¬~‘¶h5vÚkB X3áèOßjŸY ½uÀÛ#ˆŒÝ=e¬~%5^‹ª’RPg}gw·ûUÕŽ·½õëáñÇÖæ gOY­-™¯³ò; ÞŒ­x99x38x58þÚ\óÑÁ^ݮЖœ^R5*R4MVÁè&œ>œYžtD3^ÍOß*Á8Û0Ÿ”õŠ2ІO[ç>¹ûM4¾$xw0»X]·øeVÈ‘^QêòÍkú¦µ|ßš»EÁïž?ÿó½’òå>ƒÈñIsýš5ÈbÁ)ÑÂEãSp`wæ¢Û§ÒÒ¶çOûGïüñ…Íñ€d ‚]3öªשÁ| Ï¥æÂ\D‹—ÎäÒßhÆL¨ôðàÄßÄëw0Ôˆ^F»f¶ºÛ—æð²¨tŠ|$‹dùÔœõ6o¦7¿Ñú—Jç” –µMb’C¡¹) M»w原kís)Ø€ëj¯À‚OF¢7]TX‡2 êÃpüÌéß8ƒ+dnMî¨Ñšuf%©-µŽÕî¥?}GÙ“²eI!dÄK¯ÎÕÞ•Þ¿Fÿ“ƒ÷%©¹[ÓªbË͹31\Zƒ+µsŽ‚>¿ø¾wøÁ]HÎvLmmá˪j?φ„Ú Fר΂·Ì6Œ´WBHè½sÌ^—ÄvCí"%ob·VÆL?­ÚÂÌϬÞ9 ’¢Ì59wÇQWÛEÖ•¢òltñ§`BëdjZõ/Ÿþj¼yÊéí†Ø$µŽ` D«[…PT#<9õÿòq“E…*BŒd4û÷¼›ÁïÔ8«9½²ÚÛšQj¯ÂEÀ$@”­dgTc,B”èPï]½k>8*v‰4k¬íÄs0ù£¢\b£æ"½"«}ðÁ?ÏsÉW9Ìf6¢áu•“Ù]0}®µÎH-µ]È&-œÚÃöò©ÍÓ?±»¤œúÑúý³æì¾³~Œ/Þ‘Óß0v7Ý>õµh¤±û'j`‚µ +KµùÆ[¼FÍ¢°@­#ãÓE}`QÄL‰k2æÌß«ñ&SÊ„nµ75)Ñ[§¼·)‹ÝªÜü•Õ¿¢%HÌÞ©Ý+£S5Æã†V#ÞpFW²ºÑä +ã/^Ã[&\•¤Ä%xSHtŒ³ÇÑìy÷è»ÎæÝÙë¿îlÞ $ÜxNK¬]`Úž©­“dõæðÙïœÑ3R(—T’ºhüÄè^¨@÷Ù >¡$Ùº^#ȸÌàig"D[0¼7zÚZ¾‘š{^ÖCˆ‚„½Ñusñ¢$&@#;\VÏ4a`×9D„0pR¢'¸£­Õ>FºÃK85ÞÆ«WÁì^‰8o +D–A(àŒò´CH‘ÙÚÚÝgö/ý4Îîê9(IQf| P —(”\U¼1âÔDüVk®áÚ0«½“Ãå;„esö f!=ÜÝ\À¿W¥&ëNZ«7áâµoáÄëZw2ZOŽ`´ëb„<ª+únŸ—øV–€2„íå­-Q@+|ËÜ…‹wþôe4G­<É3Ô •®*·²¬«%çVï*Z¿šÝ¤C@ž´Þi üÝ¿:ù3댹p+wΤä˜óÓk¢é=©tœ¬žÙ˜n‰® øèÈ›¾i®¾YÁâøêGVë"a+s©SÕFÉÁ7Ûg¿uû§{%N2û¼Ñ¯ð!ü&â-Oy{u‡¶–Áü5”?W·Y5zY•½ +VMjÃGóƒãoËLPZ¸ñæÔëß ˜i¥Ü*ñ¡Ý;aŒÞ/r\‰ YklwN½þ™o)¹·_u +TS‹)k¤u.¥ø7!>ªh=„Jz8:>°zg(ýFë4˜¼‚ m w¤Ækop5:ù>^½eiÌêÚ„±E.®ABµ.댤pÿ Á‡áõA×à.D]kó¥±&4Þ…µ+\º(«·g`tüÙíøìûÎá×`Þ©á܈f£ƒç‹ËoQÙ¹p Åp{'ª?ePjÇKŠôÕ`ÈY=ÎAE>A¨°z§L;z8ÇWNr û3À¬aô( \½ó4Ô–/‘ÁäFK÷2;9k­?¾¢íü¸ü7Ñêµ5¸S“sÔBéÂB purfôn‘Œ¼?sF—%9ùã=Ïžé­CÔ©mãáô×?/o~ͺSRïtÖ/‘´Ñ¹ "Dˆ™õýÏ'þ‰;¹ƒåèôP"ajj»*w nYÒSƒE0:«|ò•éæPÍ#¸Ô…<d “Õ{²7ÏÕTÐì!låÖY0.E ÐZ¶¡#¹ðÄí™K5¹’‚CÞ]ÛÝ+-\dkJ¡a‘rg§$A$ˆÉöC¼ùpýý?ÿðWÿkoûq§¤BLˆ­lÝD9Îéeör¸}3>ûÎh™`{ý“Û¿$µao•é€RnÎ_ÿîÏþéÿÖ€«²g”5•¢£xùÎì\ p|Ú­cÈ»3Öžš hê¹@é1 £}ÅBjWä*‹3|áŸU¤.¸º.wÀTà"§…òª6Wà|Ð8a ¤hÙ9xcöñúó†:¤õ¾äŽ$gùâÍŽÞÞxÓ«ôêßù©Þ>’ܱæô­h¬FSÆIÏÝtÞ¶Ïc@)‰ÝÚÑ¢.¹Ù*]ã-BnºƒëÉÅJ¼©+I‰ñ5fEóï×ù@t'Îವý,_±î¸”n²Ü—z"ÇkÖ_‚sœÉ-¤ÒŸÜ@»êZÛ쟶Þ5—¯¤æ1’nÔì\Á»RPá»{Ö=üNiŠÑÒèŸçÄä«‚@I-;ÙÖ8¯Dêðãx_(ÿè›h +§ rëžÃe³vOCió6Z;=wòö//¾ù»$º£ã§¿qz©=tÆ·XhÑßÈÞJ –u)B²˜ÉÖéâJŒŠ£HÞJð—„Ö{œcökZ¦a映È7I@»Ö%0ÃáA²~#:Ó*ßô‡÷R—:&•v…õw +ôn‘C؈Î!ŠŒë<ýøóg¿]üÒŸš²‡N︳zV“cs0}f/ÀZ”6(ÑÁ~C«ò>ª?!6ïÓ”Ú¶;ÇF븡sL˜cüi¡ ïTU ¥÷Á!Jt`t.Ôøë’§ì\#•½ªZI7SîTA韶9Sü­7¸«)]³wæ ¯PÙaNwæ>±îÖhm›“‹æä<×À4P4±¬9ÊËR,ŒÞ‰Ù»'O¡E¨×`¹`ö2ß:íÕV—´fˆmuIlåØ·ªÜvº§ÉúmëàksúŒ +°tzm@CîŒáS­w­¶Ï±¨ËˆFÚ#G*büéG'*j«;ÅjÖ%èCŒEGÁe‹þ¨L"2¥”l'§?žüï&Ï~Ï{k¼©÷xg,#Â)ºÝK¯õýÚ^q°0 _)¡†z ÎLðæ‚»±zOñ›pþ†ó!#Á‡Ûëfïš0í+=9ƒa1âõ>eÃøŽÞw¿güMMëâZŸÍ[xÎè-ÎÚ½ÓÃg~ñþŸè½“ªÞ©¨±Ñ94ºçU¥CB‚U´|o¿µ‡OZ¯&—›1™ô +^c‚´UÚWBtس[›2ãŠÎf}û}÷ô¹}E[ègHim=^Sz›PagB·>¹üizýóôêgÆtÁE%& §ýº^¢ñ˜¾Õ;fÌ~™u÷«j°Øœ5|R² •ÂlŸõO¾©é½=ÂÌÂÊ-J‹+é%=^žrwÊ:©ö„´ë¤Ü¹§W>¤çù¤®Ž ~ÍåkŒt·fÞ¢³yŸl¿q†7¤š€o3„V`,Å6ØàI^¨‰íÎúÕŇßõO^sJRzê1Ý¢4ƒáÍþuÿô‡ÅÍ_Pöœó¶¤Ò[U”NŽñr´+8“áÁûõÝo·/ÿ¶wþsIlgIø—Pû¨n”3eÃ9¸G”ó0@2¤O–ò–œ3wÏ€jXÊ"¢úä·ò½úô·P*`ªäÏýÁEkþ…ÐÇðÝÝÍ·T“ pÌï„äHlGë·ë×o?Ö€¤U J‰ä$š¼›‡Fÿ +cÁâ:Ý3`8¿ÌaVCô*^¾°è‰à¯9wåô.”hÕ0†¤=ÓÛ磋Ÿg¿4û7œ·„;–ƒ©Ý=ˆg—ƒÓ÷æð²wòíüî×óûßjÝ+H.2¥½|Ù?þNˆOig­Æ‡ +œ‘‡4é”X“6°ú—£‹_|ø{ú"V+{¢Ç‡Z¼Tâi´¼±FO¥èŒ÷Ò#$”1ÈSÆÒ›’;´ûÇ6gx È×ãc=:,³Q¦®×„&£«j_‰‰’avÏ´æ1H{§,µOaz‡Ôú„>0zíÛÑÉ·fû¨Ìš„Ä“‹ÖôþQ^€øÃÞ–9îVp—ÀEho–4åðúïîÓm—“ RŸVøŽÓ¹†Ë®ñNInÈm„e/QþªR/Oz{e…S;z8•‚ãÍ•þÍøæ·‡¯þ¦³ù`%'H%§w²¸ù%ê&³)@•ìÞ8㧨%)F$ö¤»¸l^ ßcn‹\¯\;(^{¤QVbÆ_¹³WÉÁwþŽFÀx ”`|S‡” Èí Î?À÷YÆ+ñiôÒ¿_X¼Vo¢Õ#9‚—‡øcž± +FûÌì^›ÉÑBUÕÔXïž N¿Ù¾ü‹³ïþ¹9¾Ï±!p¢ÌØN¼PƒiCŽË¼ZãOŸ‡Ó—Nï*×Ð +„ž”Xµµ&Œ4Í?µÀõ“ô:w¦$§°oîðšñ–p[zïÖìž«áBfFk.îûgÎÞýÍñ»¿n| Ýu]*8ç\ð&bxhõïÒ='wl¸ªh€m›5ºþà&Oíþ%ê©ÚZÍ®¾I“H]ÜÊRGnžÀœÒƈR;¹ºÂI2¿f÷îø)ë,êr¿*"8ÇÞ«|n…cƒñ­5¸¢-©³$4ÍüXá¦!Åév?Æ0Fä~&÷0¶e1DÚNŽÞ{“?zRÇDy£ËhóΞ¼Rã£:"³¤”¹h´Ž¥ÝPzV÷Úê\IþÖï§ç #EÚc!¨ZWÚ[£¸0Z_Ðz<¼CFF]ëŸ~Ž®•p#¹ ζf׫«¤CQ«j‡´§b븢 ò\³¦ Ú@ ×€Öj )]Èá9c.kÊo‘¡,ÖŸóá†v§u«ÏÇ­ƒo/ÿÛäì'1Ú"¡ é„1Œ&ÏF§?[ãW|xTÓG•ôÚ•1cõÓ-æ[Ǩ§˜F°œÖ:@>Â+•„6_ +×­uúÇ× ÀªœÌ.¾½1zk.œs>tì­5¼çì¾LËbPâ]+½< *0A‰ª|«ÂEœ™ž>àƒ±Ñš­ŸþÊ™\y%®V¥Äœ«Éq]ë¡‚§—~ ¯ýùK½}ÚÐÚ°ŒÙ±:[·¿6’`OiŸ-îþ2\¾GoygV£{³ºÞ%̾?¿;~õ»ÍÓ?kN.õ`"Zàýðü{¡yˆ„ª«CØ£{9>ÿ¡¹¸«ðA‹hm„àD¶Š­“ª6D²ä(Kfáèœ0ºjr&Åçfïvuû;ˆ‰è/y{Z¤} jræ韙9:“ã «w yTŠŒ«6· ÷<Ûdýuçä›æñÝã%;m§¬¢|À|IѺaŽ)ðpëÄ=CØËþ +â¹WÓPhPUaýꈱáSO*VjVº5!ýÐƉþºH‡y«Iˆ‰mÒ¿Ýð& ¥½[U!³Ð[«}¢DkÖÖÅVgþŒqgY1¬½RúgÝ>:–£Óhú°'s ‘­ËBgŸ «&½ð&\¾`ƒÈSn¨Ééð$ý(òpû¾aL +|ÜÐûDú΢‡zï©9|¥w¯ñ:´Ñ•}hé2š½Tš[dMÝéƒgÍíý‹t.9\Õåd§¢Ô¥&‚PW“Zûus·¢Áqð˜“ôrAµ×]¿útIƒ]àÛ(»”¥AyÃk·w†·VâmÝè×ÍyNì縎œôŽ¿O–ÏHµM*I8¿?xþÛëÿ´½y‡eÊ4ì ÔÏÙ½KˆFžÔÖñÓŸÿíôé_IÉ)X=×p´æQoó9ûßü¢òUV`íÅòí?l^ý•;¸D?Qq0JsUæ›e¡ T"HÙO/~ý?†ó·Z÷¬®6G5}HXSÆ?ÂämNƒÑ¥Ï«‚SŠómÎXØ›éÅ/ÕÞiAŠ¢ÉÕñËßÓîŒWl¸¨Ce`›Ñ»”¢Uº+´Ñ›GƒÓߌ/.Þ0ÖÄê=;9ˆÆWöà´¤ô÷¹e-ÝÁËöæG{ð4Kye!Nÿ(òð»hõ–).pìÎjrk¯®eê­÷ÃÙëÖö£Ö9/‰ÑnÝ Ô.n{u³¦ô”ÎYëà›ƒW?½ÿ9~ZV0Žä-‹L”©Ù…ôbõeM½É‹«ïþÅøò7U} µ6íÍÛxýÁê_SÖ0LJ9>ÒšÁðšÔRñ¤­©¬[Ë×ñêi¯Òã0æ'Œ3&­!aŽaxo!yóÔ +1>©¬ôƒ/ÒÀEƇ‹×KíCÖKñÖ?k}×\½©ÉÝýº#ì*ß,ÑN] 1ÌVÕýšÁC·wi÷¯àþr¤ØhŽ¯óÙº¥µÎ—/þÊ›¿4ÚWrx˜ÎI÷h´¹%ÿ«Ë…GZÿY´þn|ñ[£w…Q?)IÍÑåùÛßËÑ<Ïø_å™ý[вŸîëžFW¨é`Ì.áPÎZŽNÆg¿Ú¾økÊ?ÚçËLˆpã„ýNQ- +I]J1fï¥ä/ÊbÒ9üæêÛ1½þsoö*ÏuÿÿBÚÁÿßøÿª}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´vð¿ÿÒ:™ÿBÚ](øw'ÞáËÃ/fÑ»ÉoñóàðÅËÓç_t¾(lIûùKïòøååýÝáówwQÃeÈÁéáM¦ü‡Gfð L÷ùåùåîÞœV2uÝ'S”Ä ƒIŸžE³"-q4÷ÿð ÿìínþßôéæ‹‹/¦_Ü}ÑÿBΔ+™Ùô‹ñôæMJçÍyþêÅEïð%¦äîw:§˜“ÿäîòøîîðöô$óéÞ îÎ0ŒPÁ,Ùøö&ýæô‹Wÿé¬Q™ß\á®7šÊ´3Ë5•9I?H{/ñiù?Ì+¢ð‡Ÿ“ÿøgîÓ¿Éxüþó§Çßý_ožý‡^Ði/>…GpysªüáÛOƒûw±‚©@oÂ/Hïôõåñé t2³ÎKÜÙø/øŠŸ>Í5Ïÿa%øÌ:ÃP4Æ$¤O¿øõ„´?ÿþIÿþ_)â´ø©»\&}"õE¡ð©‡it+ I1kþW¬=®É­†Ö¼©ÌEwÊZÒ˜òÁñÞ‚1†ØÔÜñ­£_U’ªœnÂØ#ΓJ¢ø½µvgFïTn‹ñ¨íËšÒΓZ¾!×yw†j²5û—ZÿJnŸqÍMÔĦÓ;Ô’5mõäÌÜÓBt@›3±u¸‹†Ú«MÆ™ áFŠ6îø†tgÊIw¤¶Fè|™ )­o$Gáô©Þ;šëŠÒ¢¬avø`T”ΟxÓû`ù¶yø½>º§ÜYUïV”Äßµ>øË—ÞôYsõ^ë]1᪬$B°dÝiCëø @Ù„Ñz"z#Þ›äiïÅXӲܮȚÖc½9:ƹS9\qç­ùüœr–%¹cƒÖ”Äîžê­ƒŠVø@ 7zëHpU!)1¡´µpÕ^¼À;RZWöWEÚß«jU¡U—; ¹SWzbx D‡œ¿a½U– J|ÜPz”>¤õ¡ä¯ñR ¹ËZ³ªÔÎ3.f¬¡ökr»&%Z´5â#Ê6”~žk>©j;U-KÚÒ¦Õ6oÌ¡Ð,1.)ÇÙºú¸Äg)«,DxzUê°Öœ1Æ„Ú/±!V÷u¥­kU>*Ð~¶aJwW¬µ½Ò,Sx‹.caº(g^Û%.½…Û¿°ÛÇ´Òñúçb¸¨i’‘z_n)ñ±`œöªÈØÚÓm_o”ä’ øè˜ó–éVåÖ°Ây´Ù7ûÑúµ=¾ÓºXÇMÕÀ2¯ßüuÿè iôH½gt¯ZÛüÙ;>ØÖõA5Ý´U“âŠUÄtKÚžàW }ÔІ6È’é.ƒU©™îºÌc@;3£{Ñ\}»}ökÒéVÕ¦Ö>öæ/Û'?úË·|네`}þü/ç7?×­aIˆÌÞuÿôçxó-ß<á›G„1ÄL6”¥õðâŸ6Â1Ò >å ‘©ëÙ†™îzëÌ0Û´¿h˜cœƄ´ç´;)}Ú‰*rº9nElUĸĥ{­ÕÄ&kö 5©a‰ñk\³Ž_1‰V‡ÝÙóxr¸Ú¯¨ÒÙ¯é;%¹Èø D‘³”¢cÚ^SÆ\‹Îø¬È ¹Mj}Ι#HßJá¡Ý»&ôÞ£Šø‹"‡ÈT‚µ•œšñ ¡vž”å"åׄô³ÚØýªLˉà®DÍꃽªŠnj7GZÆÅ T¥n–Š*B‚(%¬‰Ð:%~™qjB´I¨”Ú÷GÏÂÉKôB·ñøþãoþõáó_ýÑ^MûG¾ãƒ}J¢^Mj8?ýÔo¾‰0»'FrÈ™ÉßÿÆìÅ(CY¼5i.ß‹·œ=bŒv‘r>íütÂØ3Â× Z½ëhþB‹ 9¶’ƒxõžqáŒ×X_¹uâŽnV×?9ƒ Êè‰îÌÞYãg|xØP‡P*L¥÷jrœ!ô<í Æ nŒ='ô)ïnhsÊ;é§Ã—xŸ1z‚?®ëÒ»ã§ã«¿˜ÝþvpñmÃîòÞØìèƒ3upÎ5Ýé«áÉÉêõüìÛxù¬’nÔ³zÐ.µsN{k.:eÒ—)á&Ý–tr´—£}ÚJ·?)³ÁNYΓm Éy¡™“’š9#í 㘣ç”7ÍÒ6æYï^•„8KyOjf‰obe«BX—[)|m(íß,4¬lÍÈ5,ÈB]hYñ¡¬25A…ûwËJ¦ªíÕÔ²ÓöLk_JÍs9:µ»wVûª*¶g–î–§ mĹÆYë«hþ†q¦ÊB¦¡CQq8g‰ƒ ÛU(žØ~”çå¹"e‘RÂÙ+ÊZÔ¤^]ìîV·Ð +ÕŸfI3Cúy¶Å˜  Jº[Bï3z—T;»¹Ìx´6ý5ÀYsÙ[9ÈÐãï°Äÿ(SWZ›`r‹k@÷¬y]‘æ¸ÀúPþʧy`œ a ké®i;>Ø\ýq@5¤­‘”îÈrBZÓ,ë¸ ÝZ)9rúgé¾ ÍãÍØ`EÙ3Þ[Z¿Âáèªòµ=<÷ÇçÆà”—jûØè_à+‡ÊkM’Ù3£w¼O[yÆ£´‘Ö:em!GE>*KqåO +|³"õ¥àHo_ʪöŠ4†œ3EÁ’£¥Ò:šéöîì¥1º¡¼™7¹÷Æ×Jr`õŽ…dÝ\¿[ßý¾ú#ãN‹b³Èu§®çÏl_$›o£ùÛtç³æ6ÝV…ŒÑãïSN1ÝÆ»_WºŒ9ÆHQõjƈ°—´³•¢soú$PO÷ù¾×º—y6Ü'Ý,ésöŒI?þ¾ÕPÛ”>‚ÎéœD™ŠZa‚2ãk¿nJ—5'%6ÚoØ9Ò+1!däQAÈ‘vMéJá¶(¶ +l³È6Kj"&aC¤»g-6%©…ßRÖT¡êô4ð¤ È8쪔 êb‹Õ‡”ÚÛ)+ÊË7¬'±! 0HXH_UìJÎ<쟻#„t–t L”§½2ߤ텒ÜzãgVï¼"¦º—kûum§Èí–eÞõ—/õöé, +鸴ªè@ŸE…B©u®p?aN)s¬ÇGŠ?­ ¢ãÎ¥øÄêßzƒK9\PZÇIŽ‡'?ú°*Åu¥Ãûótû7ð€¿Br™óhþ”°»¤UWñâk5:”!˽3`2¹û³ßÿ§ï_·{u£Ã7·JÁö4^¼noÞŠQº5R¬&uhk!ÇFÿ¹Ñ¦wnÔö9rGq'f÷¬$wQ¬ËR—2'Fû\ë\ÈÉY4yzöâwã÷E)âܹ;ºO¶_'‡ß&‡ÍÁE8¸úñOÿ¥=;ßç|”ZÊ^RÎBm™­c9X¥”ÂXn>ÝvtP‘º¸UÈK—B¶šãGe.Oa8XËœåé°*öulµNÔxý¸®e ¯&”äÆìßݹyLšD ˆK“'Œýš’#ô"çsÖTr—’» ”~…Ë\„ÊR ­ªÐDíËÎ^Ý*Ða +Zu©]šû¤±[S¾Ü'÷jZžôÊ,ÊhášîÃ-ÉÚ; -Ë8è‚VO.Ä`ËÚsL;2´ŒÉ¯1tf·¢dëV¶nW¹„UÇeä“rg¯*U`Ÿ””­të#¼`5ÝÀ’ìIíí£‘Æq+Ç'Á[³»»W‘çÙgõ÷)k‡°vŽè.'GßåHhfÌm`PÖ\K®š‹wñüàJqzíÉe4»çƒëÎ)@»7¶ÛG`Îdû¾,$zs¥„‹ªœàxŒH¶Ãù3€tMˆíþ9VY€(Ù3{pÝ\¾˜œ}ûõ¯ÿûùÝ„=â­Ú½P»—° rëÈè_qÁü!ªŠ jŠÕ»}Iá‘ÂO÷»Ü\ü4»ú¹$÷*rŸu—jó@OŽ$BrŽï›·f礮÷xoÎ{é¥þôekûµÞ;÷'·oúgÑúÙ.i8dSrb‡¢"’¡5¥‡ïs”CÊIº'M|ç¡6ÖœsW,DŽ4s„Q¤C`ƒàm ›­Å›tëú†‰8!4Èû8Ý—•ÚÛˆ ns^—û{ c§"fZ‘¶«BÄYc0à­dw©…‡u¹ª‹ Êö~Ã)0! ’’#œéÔ¥òXäÂý†¾[jB+Ox»#S·À rxˆÂ&ÏúéöÃæ¸"%è3ï.á5fx:kEwQd£å B„ƒþWùЕ#ì"é¢J>)  ½*T¯œ~E*|ñÃ[3”'«{Ah]à=cOYs;§ô~‘r«è$£%ÙmÈAÖ™~Ú¦½%ŒÔB$Í1ÖBÏ[ëo{'?Y½+ÉêþduöÍðäÊŸ¬Äp¥·ƒÑegýJïž?Ì֧݅ã§Þè…7ziöî­á3Ö_BÐgÖÙ¼,Š!hœsíÇñù/g·:¹ý•Ü;‚Ù~ïNŸ•µAÚ°ÞÒ›<‹–ï`ÖÔä ]ÒZé6–RÒÇ»so|Í_OÎ~W´)ín(P„;•‚•!/ŒÎë.P=1±r´öÓÖØŸ<\þìLŸZ£ëÖæasL@[„œH–uËb Zƒmº76gê¦lOÂÑ5m3„ÚÄØ ¨4øÎ>fw2!!Ÿ¬³?ŸCP‰­š‘!œ’ØÂ[àǚثK£•n’òÉÔ4`<àkÍ[S³yÔš¾P£²Ð.¢ö‰Æœ2ÆÔJˆ-@þ~Ã@Ѭ¢_¼E™ (mP¤£2U8”EXc˜ÄQ)}LW 6HpL;"ÁHN$?¥ÐªsöÔHN1‡ ¥›#¬"í5¤n®á * c€º\Æ6¤Ôl·ª¡ø·lZêàHuqÔ1j_ 6YÚÝ©È;Ea¯¤T…åX6(»Ò¤5”x·ÌýñnJ·Âš Dú¹Uã#µuD;c”xFë™ázxðÎ^ ês.\Sδl¶—¢n·Òc“g´1Bò*@#wÙÐÇ¡Cc)Üøƒk­s”ç=Æ +ÁÂèœÈñVNŽ(I8Soòtvýkwz{ÅE¬¿Ò»çöè©Þ¿UÛ—°Ûx|EN]ˆšÒV“Skø\éÜÐჷó\Hè¹¹eœ1Ì2XBJê»wÏX£2ç«ñ–ƒƒ³F”;£¼å¡B©þ*\Ö‘†e Ë×ç¼9Lw‰ôK¤KH Vg·$”³—zçN/%oó|šÅ*0f§ª<.‹_¹20«I¨ shK–´àg ° ̹®aFJ|RæcÉßè¤ÖÕ½yCŠ¿ÊÓ™šŠ#Uèê€PÁ ]RîéáºÊù_îû55OBñ@ÚcÞ]PpÖ©‘œU¥j(˜9Ý×£â#ÔáK´‡·€(í–ÅÇE ·_·êb—û©NÐÉV²v«ê>,F¸a`Åî¸7»¿|úç;5õ÷©LUeµ‘ ZŽ„¦!¬ +î”Ù?Þ-î—8ÈÌo1ÝYÓnhmX­cÃéCNøÈNNôä°ª¤)£%'´?Ë1&¡·xg E ­µõ§ÏôîÅ¥f Àó cÀy+ü,˜Ü+Ím²´Eš}Ò”•¸¨µýÎA¶Ofßݺ“§i©©y.¿nŸü¤oÓÍqåôha R¤$gÖø•>z¥"r¼eUé”ÅÔÒ^ç9¶î»¤ÁBN²¤MëC£}uÊ44¹yà/^›Ã;d »d!þ#=9ÒºçE9Ùiˆ^¨²sÅ;3Úa-@¼ø¸ø<…E„Ý® MVë!±âXHD‰0¥%©=¤ôq]êCÓv*j +ÞR«*6ÿ°ñ^†°<°óªÝªž%ÌO•nX†WR:©Ãrg¨ÅEÚ…ñÏfCjVx?[WTwh¶¶¨Ôy:ÈQþnÕh1ڰĸ¿Ø¯Qr"Xã +¬=×ÜG`PN™õ%omvoJBóqEÌÑŽàL¡9鎧Jg§$gjFöÿ$[ß©ðyʆ᥵~‘´÷J’"Oºtª6C§sáÝ«ëKâ—y&ÕO±ÉXC%Zí§ÇúZ’7*ÒÆN‰Ú)4v‹t…õeoiA7ä¨Fnk•naËC]Ô÷¬až¶%œQóQß1üŠ¡{øF‹ù`Qá\½½¡QMN YÆ-ð! -^}ÐÚgŒ1ö&×%9Ä„—¸tÜç3fßß8ƒ+#9–O¹hÅz ±yØ0&e¥Û€â­?´¾&­±àÍÁEpvbrZ3†%¥ƒ*éO^Ë—‚¿§ÉÝÓ¢ç˜0C¹°lXŽ`tÐùë­mIŒ3 'Oû0Du©ãn[‹WB¸¬óagýBíì3Æ>ãæø/BY£Ññ÷ƒ‹_sñì•?¾&Í^™x˜,%kM[pyÑv¯®”h“Ö:;a‹U×øP9BïEYJ©« êQMLj"êZ”#ü ¬‰Î¬Äº¸a¢öj:B±Ì‚'©{jËÁ ¡$E55íÅ"¦N GÙøÊêÝ +ëñz'žT¤kQ’TÖP˜„v•k!3I0‡„Ø,6¥ jb§!wi½_€¼€&³v¿Èz`že!þó¤ª ø¿¡(£!¢·&üÝ£»óiGgTFh”•œ¼ýÕ¿jèÝG9:WWA‰Àûå¢æ¹ö°·|Þ[ÝîˆR´HÐ;¤UD´4kbÌêýÁÁkJ0úÑú5ËÑÊ’:©DVkòÌÔÌ"6Ä·e»äÏÓ¯ÖhröÌ—•}ÂÜÇBH-!X·7$àîAæVûÌꞣ’ +Æhqõ ¾ÌÕ1FÒABÅp1¿üåôæ×rûØi¬o~(î/rÄãËšCôõÅë^¢`!MXf0yT ÷ªR4Ÿ|1¢2Qž38+Ë , ·Ý*H¬ÉS-:…Õ‚›Ž‘g¿ÊÑOŠ<ê„ Õ XË»«ºÚ®ªq†@Mõ¤Ìxp[PHdzCŒíÖ&ŸehëÓa±>ì¼[º¥7áV™€7†Nr„ðàôžÆÔè夅,}‹v󊵇OÊ"jÒRG'0pÅ=šá›],e]ÏÕ ¼rŽps”N;¸ÿuŽµsU‰•Z¹†¶S’P=Ózʵ }MïíîQ¦Ä1¢'èÍ:ç>)‰9Òåì±Ñ:„m—>mœZcÊa‚Áù¼=R£%$}¿n!ŒÑÅÄ¢nrÆ0\ƒêyo +‘'•VCn"gËb“2p¾Vrˆà)ˆ>g¢b®yg +ÏÂÚcÊè“zg°¸»ûîïÍþy6_íÁÈÍ#»¯_ ÍTsÒ“[ë ïòî8žÝ#ØFº›£m'~þÛÿi|ú~·¦‰6X7=„¾O9‚bõŸ+ù¶á­RߌOPг` ­‹÷¥ƒœÁeI v*Tˆ÷ÀºaM‰hgH9#ÚLWÏó7ÿ¶ªD + ¥¶‚Ñ9cò´»[3>)¹ƒt]ÔBiÕÅT;ûàÛ´ÞÅ~çôůþYUk?©ª„Ú…±%•©öQþJl ÎnÞýõäìã—9æqžÎÖ$}CÚÖM8AB"> £®G¹&œÚ~UB$bb6½î©L3”Š |\–ó¨ B¬:SÅ™šÑ`ônÔ?EõÜ8eéeB Ë&«hr0FšçzžÐ‹¤“o˜ð‰p‹¨hf4³â´(iYÜ)ðÙºUĸÀø9Ê~TbEkbÇÇÐêô¤¼S Ë´ÃšKÞY@¥ñ˜LE®PNÖµ$ìUdBv>ŶCèc¤ä£’¸WGýu½OÁ‰«=Hb¦–pu™0)-¡Ô¶,[Ógj÷Œv& µÓH'6ÀˆH½‹ ’‚¥Þ>’B˜µ5i ÜÁ¥?»ãÜ çLÄ`ÁØ(vS¯ʇ‹}6ÌR”vÕE3Çج=’‚9æYëž5¬ëÍ*r¼P7Gvÿ²}ð>:øÚß‘Þ¼(@î’ÔŒ3N–qXoPgÝ•ŸöÒ>s·€«"çÖ•VU0o%6.óp `žužTø¯ŠÔn…§ÑÏÑ}´xMΓùUž´P\ÔYÃ=)39ÒÄT˜É¹ Á¦*·áÄaò´Ùøt +U +àŒ¶áøy|ðaŸM‰ …—Í”ùLEÌT%,„Ò\›ý31ÜT¤¤&Eâ ì@,òº,vªrOðÜá+Êžfêz‰qPª°@%ÝN*R—Ž‚Å[轡t +¤µ[D]Ö Ö¯Ð£v›Ã˵ˆxY©YLm]„Ø.KmÆ#›hµû(Kd+*)´j|ºëóб¦æÐX¿Š$­É ÎÓH +l£²WQq&qé‰tDBIÁã“©*{ÕÔ8W ¤rG Š´_hØ–¿yRD62e%}w¡Ãø¤$eæ~zd#òRO°—`• +H7_Ghu+j=Üqœ‡E­IN”pU“À®m-^ÁB«ëú°®O)gLÞ¶ð—o(sÈ;HGEŠÃÀÈO Э©Tí,a1*ÌΪ,†’?Uƒ…Ò< +f¯œÑSÒžì‘6ë/9 =D^ë£×îê;cü¿ª)=ÊšÒ.FÝÏó6€Gt—Í·Fïš2g˜hÚÁ”¢o»%1=Ä­ŽÄàH ÉOˆ0ØOÜ¥Ì>Î «O§Ú5'µ1İʧÉHª›nYð` ¥èHí\Òö¼žž)†Ûð^z(#‚ ãí¥ÔóûÀÎ "ÖmRû«<÷(Ç P+lDÉ=VŸ1ÊCÊø¸(–(ÏéÝ#õö&ì'a–#a–QÓtÛl¹ÛPz{ x €U.`6g§¬)O ­þUÃ=Î]ðî²cNOjÊiÁðúã[ÁŸ—¹°¡vkrZ¡*0” Ä•½•Ù<ÖZ‡™†T—CÚÑ’ ÓSEJ´µ:gjç¢a¤§TH­[ü}ÒÈ’&«¡ö…èˆÊèðèÛÍíOy!ÌÑ^zäAíñ낦’짵§wy”`ºIÛkµyÌZÖF?75µÏ[ÓëWyñæ÷U¹µW3÷pâ!§wqÿ‚Õ:uÖq–±¿ªð»„!x+§ ]5º—U±)¹ÑénMUÄ.©@ÚˆœFz\È&¥®·¦ç}†ÇW½•âm}Væp8)µó Ö,Oxœ9%RÙ*q­ V„^gúRõ†¹†D*qŽ¶‹Œ¹_vË,Ò™’bÍXáâqžÉø)§H€¦4Õ^YÚ«j 5:¨¥*4øD4梽„\ƼLû²G<Úg3Ք̿Úg u§ +ˆSeðÕ«K]9:©+ƒÛ¬)ýßÊRááåèa€êàv.Q¶à0"ÓlMµ|’ç +5µÊEéA?Ò)Ñ>•^áàí5Pß}VíÐj ´[7à1-{fÛØG·iâF(=HM¦.ï–älÝJk41ä amxO¥ó¤"?‚h{¤YäS ‚¬ÒÖL·9fA$ä¨!†ŒÙ°å>ˆ‡? G·b´üª&W¤¶¨Ñú_ZHçŠÐ®I]è<%‚Ù…Vù˜Ð'róÄè\t>Ú³ghªñ¼ö“²ôU‰\•‹\ÿ £]d›”>AîÊ\žtAk”1ô'w³‹ïÇï`W)„„܇0|tG¶'¢Þ—¡.w1 ”[•;e>=/ŒøÑ㣹‘ÃåFåH›±&„ÖEäÃFí”ì” +3f'‡Ñì>Ó0ëÐLº ðËÔíÈv<}.úÈkÉžOŒð`FZŒ1‚áíaEN`Yot§Ì1Ê.Œdž Š\„÷„ yÜ#ô½š’=2‘låð¦ëX¢m@&4úœ·°‡—f÷Œ1bp•û*ÏìU%RN$˜S¨ +‚Pl‡«ÊH\¤LBîÁ¼ËþÓBSÉߊÖ,µ$œ T @äêf¶næI©3Þ™ÝNξù +p›†å°*${Uu*K9*¬JˆØx·¢eÊênIÉTÔ|ÃÚ))OŠr¾áÔ¸H –ˆX w#½šÎzœg÷«`$€1¦:È‘ÖNE.f¾¦ÔgIP¼ã,äÖ‘4³ñÆèŸiÝ“<à†%aí)néÙ(:HsÏRð:qIj–AòZ¿ÕZG¼›ž¾Tü¹•lÌÎÞ:bÜ¥è/Eo®Ç[ÊhÃ-ú£)XÁ¦ñÎ,Ëúû,˜¹·¼øI )"µv†vÒ¬¡Ã²Ø圹o€m{Æ]øÖ“º½[·Aò"^ÄžB½i°½3—ãCÊÿ¢È=.²ð&”>äÝç.)kÎØKèX‘qq?ð•wtòãèä—Zë’÷¶Ð%$N¶ëRjÀ÷êV]nSé ÖXš‘D¤U‰v`ÇêÊPNÌø¶ªž +{*}Øÿ“¤÷ðrãºÓÿˆ·ogl‹bjvnäªP¨*TP …B!rΩsÎÍn²I6I1‰")‰ÊaGa¬dÙ’ƒÆr¶d+Û–e9Žgæ½Ùsöìþ =§ODnø~_@Ý{a€Ãh˜ñÊåÜ|ák#nˆüBà´£#Î1 7n ÚBZO©É°…5ƒaß8aýÆ€„ì«+`ƒªìA¨½St±Qƒçø˜kܾsØ ~xÜ&›<òÀ¨ã|ýÄ?Ü9zdØ®ï‹2³oö&GÌàë&,.ÜØl0ùVúÎÊHõïXØ Ëýû‰£NÈûc–þúU९:%Àã„Ù,ñ?ÿãºCx½oÔüjV& Њ)°à ÷ófº3á’]\ÑíxC5,X"" 3•°2W„ç ¥E©ÓLjA‡'&а•Ç$Ž~jó(c® ‘€ÊåÇ€ßÌä8s±9³/®æ×Å`•ì¾˜‡Ëz¥ªÎÚéŒÙÿŒp…XqCÊ,¢|^ÓÏbAà"'ìðçÁ$C³‘ªÝŸòÑbPûʵ0ïÊN¾¤3ŽëÀàù€|ltÒ€GGÀçx"X¨åOÌ©8@}ð« +À{‡µ8 Rž“ož0ùAñjqëâ Nh0™8n`€µHØâK9ÙAðÉN¨Ò͈™ž°s4‚°èûDͧ³\4TJÒà‰½êsK?Gí"X}ÀÏ€¾¿ÆŠÐeÂcZh°Uu€ÄSGÇ]F4¤éØwɃŠÎÍ•Àµ›Y0$'Œä‘ñþìÃc.€– Qô.Ù%ƒEÆ]}É0û„€®þ­%4ªCHâÀuè˜ÉwdĪ:jfGúCD™€Ø¼ÍÂØô€Ö=¨óØÉ(®¾ZP +…™„.õï:InF…lu|ŽC€4“ižƒ.»ÅÃ#Žc£À«Ö¯Ÿ° è‰ÑþêYÞBÄñPÓ§4)¥éd ã0fjÈ@ÓâÃvR­-wñE1?KÄš†¥áà +f€D°äOÎ+›¾äœƒÍ0Yï P‘†ÍŸ–0à4"n> +›?é•a䣟÷ÅÛN.ðƒ÷"¢>3HNzà 36 Bªƒ±·ÓÀ?i˜S'›Eø\0;ï`3ãˆd Ö@É)6©éà+2 zçæòt¼£÷Êdl’JÌ[y-±ùs*•t  &i=Ò˜[0àax™›Ïb¡íyÃmÀªL™û”¥Œ:D¦0уâ¡Î#Ÿ0S®à¨]ïwÊ—„kÚ¨”ɽµ3#ÒFƀϵh:°ù’¤\÷Jð„Rµ1© Oø„´ÃLn REGŽBˆi°ÁeÃ&*i¢ÓH°ì ×-LÊìâ•xHƒˆ:OÆЬژ,4ÃHÄ´ˆ.qÜÎŽ™i­Í¯‡4aóÛ¡Ö|Iˆ½f"#oôÆt¨2d†á}­ø=ª8¨4!T ÄÝ1â‚ÒÈY9PpH‹N*I„ÊL¢EFª^9©¯Jý˜S²ÒS0‘q’ŒT åŠ‘ŒºEŸüÑР舚Æ)Ã;fõyƒ­›³²ÓŸ´RiÈqPѨØrsexÆB†jQûW ò­ý *R‰ŽS,á‘­vÝÁ"fìþ¸GÊ‹Å¡¼Œ†Êˆó +µ¹‰ˆEƒW‚rs9h!&ä\bÞÅfÅôt¤¶ +HÓx@£/Ú\ù““LjÆÆU슃ɘ0Ñà5ˆä äÈHƒPêžPUãUúÝË6ÊÊ$6ÝRÏê4˜õ*m—S›»d|jÈ)Xé4Ÿ¡ÔYo¤‡…[fJÕc¡qå0áäì¾(Ÿž–ŠKljšOÏ'º%˜'›‡Î‚™„ÄaÄÂÃßÑ}n ¼° Yˆ˜“ÉR‘."–ì•TêvBƒ6çârP8¹Åeæ˜Ä$m™Ä#5î’4¼¾è‘ðSƒᕾH+Vßb³³®P…NL1IèΪqÙYFmºLTÈtB¥FmkÜ’ÑíLÆ ,cBÞà ž0BBñALØ£bÕÅ—€àݽr­¿=„Œ>5¨dÄc^©¦”×äòš5ªê†„>` ÇìŒ y¥²PZ*«‰îÉêÚ±ÿ²¬Í˜}©!+PÊÈùäz´´ÆçÑPDgÄ>“6¸+wd¥ +ÒL¼Ãggµã æÆì~P +'W¶×ö—¨%ðpÃo¹ý»Û²‰€øG¥’;Tó„›¾x7X\”«+X(‡I&Ñô©-Rm1i˜ÇŠ?Õó–„¼ƒËè½a+£:ؾ%£â]1³Ÿ:—Ÿ9Ëg¦q¥áŠN.K„+¤Rãr‹Tz%T=åUZ,èb èD`9o¨ rLªS6¡låJ\a×± èTzMħ\ßkjód~ê¬IÂP© +|‹‡›Œ: ðPªÛÑæ)>·êäÍ4p ¨¼?1É|j4ÈXx•+æ@‘¡ëD¼+–a„Õî)X4y!•ab“é©ýXg;ÒØR'φÊËÝõË@àV¦_†áÆfiårsóîöÖÝÕù3L¬†‡JRqÑÈ€ýëß.´3ÓÔö®\]ËÏ@áO¸8'—¥ÕžRÝÈÌœIÏì'ÚÛ3§n¥{;0ÈFRqq@] ·íî+ë\zVíœÒ‘ŠÞÍ°±*Â&W@Uªkåõ{ÊkW§wo]~òmRiáÊdvþZ°´aólÙé8ø²PGœœ•VÇB¿ZgÓ“Ba%TÙâ5Q ¥0ÿЋïÒÉéA+µÜäYF÷%‚µ]f ”½·vÍ̤F¬~¬ï¬¦#õ“ÑæéÔÔA¬¹5òÖÒ…'ÐPEÌÎæ/VV.•—/¦§N•V®Ö¶n–¦Ï]{ì;ruÕÆÄùd;RÛ„Ž${§ssçKk×RÝÆâ™îÞ-TÈä&·këWåÆ‘˜JÍÔ¶o+½óT´"d[ÞpÞHÈh¨J&¦ØÂr ¿inEÛ'™d+Ù] V—ˆHŠ·|†V[dןèåg¯„J:‚3|f f1©< ´ ]æóËñæ)µ½çW«¬ZÃå2“ìIåe±°­­§;›3»7+—€-=b&.ÕÝ+Î$;»ÑÆŽTÞðÊÍòä™òÂE=ˆ$âí½H}3X^-.\ª/]=yå©twWGÄ|ê$šØC-‰v[í^ð +E3„&'åg¨D[(Ì1É.Ÿ™Š×7ðpT ªÌMÇë¡â)LÔ05yÖmós¡Ò,óóJ}-±ñe*ÑUÛëriÞ#fäÚ +¯Kù©ÌÔ >›îÆ›kçî}A*ÌÃ8gÏUׯ'gÂõM!7ç‘êàoÕÊÆÌÉÂÅ9ƒÇO… ‰ôå\yù|fþByíkL|2ìq= +!‚I/åîÎÌ\Ë[bm[,.³©^´´¨/jÜì¸[€0…Ð$ÀäLóÙy\ÃÅLª±Ìμ1<Öc‹kt¦¯¼\fzØéµQVŸbóÉÌ…: ´ m‹uö#íÓ —x'ª+Õ¹PyQÈÏ«T»¼ðŒÞä­ÒÂ=ð(.\à±…ùt}åæíçï~ö{v¿Z˜;[]¿‘]¸ õ[\ºZZ¾F«“Ûgo_yì5&Õ°ø0 *bN©oÎ÷NÞ›ìíÕfö|úHs0lm)µµHs»³ycý®§¦Ï>ËgW+­Æü9TÌ{å¾Óê”TZËÌ\h|púÜSÉɳS«çs{ˆY ¤§ÈhÓkIù¹ÎÎíö©‡Åü" nA®8Io¨ä‘Ê0bF_Ú@¦Äìrjò´ÅV0FÅ`瀯ÈX‹Š73í ÷¾Pœ9egSÉéK±ÎY¹ºQ\¾•‚'–Àºüi!9 •nÆCB²#çë«—Ú[×ssˆÜp±ùlcçì—P>Ìt²“§2Sç¼Ñ64^X +—ýÉ—š $:.¿æ"R•V(jKw­_z2;yzzåüÔúE,˜…?Wj+€ùâ…僇îA).L.îßuûy€ x €°îZ®žNL]NN]ÄÛÓ+g6ö¯‹jÙæ áJOÓ©!·\Y½Í.q…Ž·…ò*àŸ«`{üÙE7¹¸púÆ3Ó;WµøÓÎdÂ]©¶å‹O‚W'‚ÕµS÷]ºï¿Òð©º*TÖ¥ÚN~ñ*Ø!¹Ô\0"¬/\ $§â­ôì¥}†Í¯:|‰bgR +„D5TZL4·2Ít{¥4³ nЊ“r.VÛŽÕOÊåuP12VSkËkgèì\·J´¾ —R3çCm:5CE››û÷îÝý„/Z>n&‰p+ž¦Ô6_˜MO+­ùý—¿ýÓÜÔ)åÛ+—æÏ=^Þ¼Ùܼ1»ÿPyõ&!7·OßÚ½ëIP7ðð¦ÑúV¸²klfçΫ½Ó¸R[=u£½|Îɥ••Hk›Ë-ð¹µµÛÞ¾™¿HÎÔú+Ç2G´80x¨TsU;!®.-É™V²ºh¥"¤Ra áFÞpMÈÌe¦Ï€ó{™œ9Bébd´fŠNiU©.Ö4¨hÄ‚bªKGëÙ©“Åù³BiÉ!”ítF-­ž¾þœ/R —fËK“½}&3‡Ë%"\¶Òv..¯qÉ)ÄCY*Ö` jâ¼..ú”Zcz·9¿ïs©öfiñ|aî ?{¦4{*Û^㢵ë÷?óæ»t7¯Ž»E@ø‚˜_–*'ƒå-&9ã Ô³—yâ…·£ùž+R;ûÑÎYµw¿;¿tƒˆÂ“™Úüy¥²2bóÙ9HˆJ˜|57}æà¡×A»ÙD3^]Òº—Wãäóà+¢ÕõÙ›½µ+^!—j,‡Ëóv6i¡’_ñ'¦Ã•M¥¼nÂe^© +‰®•ŠÂŒ€†’ê ¦t.ÇÅZ7bÅ6ÌõòÓ{ÝírcÝÆeNX¨A3a!%(:R•òË¡Úv¢·[Y¾4yú6“žB¸T¼u  }“{ÕÖ®G›ÛÑÚZ²µÍ¨-78áæ}±¶•ŽÙè(Ÿ›€ææÎd§OÑŠÕ'²jU*Ì*Do?ÚÞóƺv*.ª  È©ÙxÛHZÇ >'3S x!ÙLÔW&ÜXu¹¹q+9uW ½Rœ¹ŸÜÇcMµ¶¶yõ'ŸþjgGÓ‡Ôðg×¢S׸ìÒˆÝo§£ÑÊd(˜©Ì̹ÂÂ¥îú­ÎêõXmG*®bviïfº½>æ +€–ƒýH¬}ŠTfB&A(sBBqðÇ'Ü $ØDËŸêøm6;mb¢..‘Ÿ9³éæ3ÁÜ\ªw63½«¯RJɈŽ9ýCFrÂ8¡w ™p€h¦»oí%¦.úó‹Lª§÷p¾p9VÝð«3¶@æÈ Ù„VR­õdg{Â#è="§NÔ͸ì–Jv© ÝÍeÉp•ŠÔuˆ¯mÕV®K…°+¹îI>3§õHl¨¸²wCP«ÃvŠÍ-ÈõÝôÌ¥Òü5rÖ)”-LÂ'Ö÷nÊ©Ž“•ÒRmábªuR*,%‚Ï&{ÅÞi¨^í´7neg. éyZiÑÑ6"¡§apeBrØìuÒ1>=Hôr½SÕå+¡4–›O\½ï¹@¸ªG%›ÁCe<¾w);uP[¼¢u”t§¶|,êЀñÛHÙп´z#6,¬wZ‹@Á!ŒëV‡IýUOÀØBÕ+·NÈG°éé•Ë|qzÂËš|²ÙÕca*Ú¥€éÈ°q’Q jÀŸ[dâ0S_LãäœTÔ+$ÝL8”íRñm²¹y`VmK‰ÖÜÆåúÒYg b£Ã¡ÜLqj¿4w!\Ù ÔI¯R·P1ÏHa& ‹áÊ6ÌHaæ`jç¾îæMO0•È·÷î —æ&±ëÐq²9!=Ì­A4.ÑH½â¸•ðp È ••«¹ÉÓ¯¦w.Ï] +¥{“Ëwå§Î ÁD-È€D4xe:ÜA¹ ;5î \L„ ¡åTjÖäÏ‚åaófDr1q˜2[ÿã©륻ûµ¥kåÅ«‘ÚÆ„›2a:5á âL¨°Ju©`ž—t^§?åOõÄì”7XtÒI'“B£“­4–7Ò{øCƒúq“ÇᕹÊF[fOhÄ€{‰W¿û^sz{Pë4#,›€+,ré%¹°!Vû‡EèP’—/1 C``©ŒxÈÍ%½R. ”&—Ïɵ™ Œ¶²A©5 3’‚Fš\lPí2±¾–Y(Æ\‡pV" |äì æ`Ðf·®DkK>µî³ÌFÉd(«T‰0¨Ì€ÖÄÊó>¥¨÷Š',¤[(Pàà «BjZ‡²„R W·Jsç2“'•ò)é½B{aaÿ,˜ºSãvr%¯Ò¥c=Rêü«A‚`Yåâ&¥´v/)&â­ 0!ÍÕËÅùƒTg˯‹jmsÿúâþ­3a¥“X¨KNclÞ„0‰„l÷ÉÐA=&z#M$ÜòFºrõd´qÊÊ$Fl΂}B¹„ªP6ã dPÊäG­£:‡ÕÃ!©cÁ"¸ "âRêRê˜g¥Ê²?3íd“šŒ¨ÈÈ¥dcËÉÄõèÌF–Š´‚ 2Õ >1ÕßcÀì¾h¤¸x\‡ \" ¶ÔÖ´ÍîOiœ†°`JÁCPžé©ƒÂÜ…lo_.®¸Ø‚ rÜuÂNÜ~øòZeõZfê€K͘ë1!¹„”[HxÄ,nHé99³@ò9„Šx‰cZ÷±1»Æä1Ø}.B™°PtĈûÄÜúîõP´|bÔáòE¡úP>ïá +ý;_DdÈHÀx*Ù9ÔŸA¸Ì¨Õ«sA͆ùd3Ù[Ëά+i¥>•é-´7ÏLîž/.ï PÀ—l3àfã7¶àz7ã$ƒd0ˆUØdŒä|±|¸Ø9yå‘æÆ\é9ø˜+˜äSÕTo9Pžœ@áõb,×åâ•aƒÛÍ(N&:îò+ñ»§éÌœ…‰áÁ¸\î1©*“,¹$UçBÄŸÊfç—åöœ•Ø…ŒÔm0h.æȨqÂN‚µ±Kw÷°`ÌN0^¡Õ’“•q9AÅ ¨”äRÕòÌjcm—NWŒ¾ múÕžTÇmþÃC¦£#­–s³bLNÒèÁžIå*9…†kVtÙÊÈB¦Š…âã(¥ñ²î`*ÞÜt0©#qlØlq2Ÿâ¡£V,¨uúÇŒ ’µÓÓ@8¬„4¿{¥³yžI–YÜ£n?.(1i£âGÇlÇÇÃÌì•lddØèýjÇA«>¥-fçYuææw¯v×Ï*Õ)›_´bzœ#ãUDÎOxü®@X©,BXF„@Úà‘ìL.Ý9Wž»ÌÄÀ ·eU1Ó…hà• +D¨ä“‹P×±ær¬µÌ&*R¶Ê/„‹+|rzHëù‡Ãß8ar3*©k-ÄÚc#6ÅOŠ¥De5RXF¹!½w`ÂeñŠ1ó1ëc–#§›+ÊÅm)³ìñg'¬~*\&E5^hô–væ6În_¸qåÁ§î}ú¥§^ûö[?ü釟üþÏûO¿øÛwòáÁͧ²“[˜TèoQ7úÜd$–j¥ò­Le*ß^ªN-M¯ínž»rí¡§.<ðÔéû[»tóäµÛ÷?u×Í'^yã¾ýÎÔúþìÆùxu“62D)E:ZA¸J$«ÝæìÊôêöúÙ gnÜ÷£OÝ~þÕ½{ߺúÐ…ž}üåo½ú½w¿ýîû¯ÿà>ÿ­ÞÆ9"”2ã‚ÖA:¼¼-‡R52¨„Ò…òÔRwýtce'?9W[\o®îÍïÝuÿ/üìý>úÍï¿ù½Ÿºö`yjCJ5uvFgcNÁ‡åT7QYvá“ç⥩õLw9Z‘ŠÝHmfn÷Úþ=^yðé¿õýK>}î¾:ÿà³T¬¬uó§±øÀBb‘‚ÌÌ;|²¨È¹z¢Ü̶š §VÏÞ¸õø‹÷?ùüÛïþò½÷Ú÷zòÊíæü)µ4ëáÒ`õ.vÂN#8Ƨ nnÂÆ؉ˆ”žJ¶7Bù®”o­\èŸ_»ÿÙ¹pÿ£WzîüÍÇÎÞóðÕGž{í_<öÂkwÝzxí½1­s2Z»ÏM‡i¥Ê'&}Á’œî°J!”lf›Ks;Ósëûwm_¼qæÚý/½ñÝß~ù·ßýño_üñ¯|úùO3^˜<:á>®ñÚ•Wg"ùµ133¢÷˜\ Á§Úä ™QÁE+UÒÅ­ó»—ï_;óü­Çî{òÅ•SWK³gÓ\ÈG¾vÄ„Sr¹>3»|rûÔÅó—®=òÄÓ¯¿ùÝ÷?øì“ßþþ—~òáÇ¿ù÷¿ÿû§ŸùÆwôès¯ÎîÜ¥¶6 ˜bA¤ RaÅ„K—jÝå탓箽róöcϼþö^ÿÁÏž}ã{½øÚ·ßùéÏ?úüåoÿðýÙßþí?^ùÞÏ|îÍÕƒ{ÁŒÅËó…ÉÍxmÖÉƲåÞÜÂéóçoÝ~àÉç^xî•×ß~÷§þæßï£×þõçïüâ£/ÿô·ÿûÿùÿ ÿüËüü××}>?µÉ'š@˜Nœ *©l¹5½²Å­½ƒk÷>òìK/¾ñí'¿ù­G_þÖ o~÷Çï}øë>ùâ‹/þ÷ÿõ_þæ‹Çžm÷®û£…I_ðÐi!Þ‹VÖ,^ÙêpR²P\Ú:}ñžÛ7{öæ?½xÏ/¼òöôÞÇ?ùÕGúë_ÿô·ÿüÕ§_|ú»?|óÛïÎïÜ æŠl¤íò\ªË©õBs~ri{uïüµû¾ÿÉ~ü¥o½ôæ;?~ÿ“÷>ùÝÏ?úí¯?ûüþËþ¯ÿ‚jýÑ/?{áµ*ÅÙQ«oPïæ³RDp2*-cùöÜÆ©+üô*ôÖcÕU:ÒÐöÏgó iPŒVpDˆ”RÕ¹b{±Ô™_Ú;õÁÇÿù•7ñÁ'Ÿ|þå·þõ§¿üè7ÿù¿ÿëË¿þýù7¾{óѧÎßý ­c|Ƀ õæìÜÒöɽƒ —/_»qýÁGzëí·~ÿûßùç?ôégïýê½—_åü•«ÓËë‘|ƒO¶­Þ°ÑÅ¢> §D^”³¹ÒêÆî•{¼ñàã·~âé~ùG?ÿ‡?{ÿõ·ðýþäË?ÿtç¥×¿óòoí_} ³|6Û^¡‚)^—º‘\=œ*u¦WçW6VÖ×®^¾üï¼ýï}ÿû?|÷ÃO?ûâ/‡éøÅŸ~ö›ßþíïÿöÙ_¼õ£_{ðÁÎòŽ¬“R†NêÙÕ­ýK§Îm윺rýÆko¾õ«>üàÓß½ûþÇoýðÇïôÁo?ÿü“Ï>ýì³?üø£WÞü·ÓÍ'!;‰p@©33n:ŽÑá œÊjËkk<øțЎýüÅo½õÓ÷~ýåŸÿú׿ÿǯ>þðË/¿øå¼üê«/¼úúòé+L´l÷E€¬(¹Ä'b¢Zë-¶§7öÎ>òä3Ï¿üê ¯½ù/ßúÎOßûÕßþãýöË¿üâƒøãþñË/?ýü‹WÞzçö£Ïäš«&L3“ãFBg÷›Q("]OÚË›»·Ÿxæ™W^î·òþ‡_þå¯_þõß~òþ~úé—úÓçøâ¿zÿãO>úÅ{¿|ðɧÎ^¹ÎÖq>¦±{ÆL(#ç¸H>+O-l^¿ï±7Þúן¼÷Á;?ùÙgŸþåŸÿòñoÿ«O~û—¿þ®óîOü“_üìï¿ÿГÏn^¸ÕÛ¹†K…ãTïà 6Êê¦5FÄ…±åöüÎÙK×o?úâo¿üæ[ßüÖ·òó_þý?þã7_üñ'ïýú—ïýêƒ>zî•W÷/^]ÞåãDmƒâ…r;[ª'Ò¹ú$Ĩ¥ÖÌäâêÂ¥kço=xã®köÏŸIäSŒpá¤ÉEXfÌ€Ž êBýR0žJË•V­Õ^Zß\ÜXïÍöNîo^¿yñÞû¯\¹zp÷­­ó—+Ós¬’$ƒY.Ñ#CEƒ49H»‡vy|$ÅmìÜ5·~*šH³©µÕ…³û×ï½çÇnÿûß{ïƒß¼ÿÑÇŸ|öñ3/¿¸{á 6=Ç™pÖÑ X0–„×·/ìÜÈ4¦SåF»ÝY˜Ÿ9ujûÙgç‡ï|øñ§Ÿýî·ïüèo½ùú«¯¼üÌSß¾ïîµíBc†EsødÈ€ò' kQ¦·ziZH¨±Õ¥åû®ßýú«¯¾þÖ[¯¿þÒÏþîŸþô‡þåŸ/ž?µ±¶Xª7ÔbÕ†Qc&·› +ÁÃê,^ÁE +(Á•D®Ôœ›[>æôÃ>ôìsOçÛ¯ÿêƒ÷?ÿâó?ÿåOïýò‡O?ýøÁ¥³™RÞŠø¬Ìð˜‰84 ;>j?1ît ¼$çCrºÕ›™ZXÜ<}æÌÅKw]¹víîëß|ù…ï¿óƒW_í¥_xîÙzíÕoÞóÆÎÖN,UvúD­‹4¸;DýÑH¶ÇÊB…”ÄÒêÎåë·Ÿyî¥Gÿ§ËWo<þøS?úñϾ÷ƒïÝóò“ÜûÄÃíŸ;»´²\©w#Ùv~r—5¿Zí]68µ:ÈX¢°²²yåêµo¾þx¥'ž~úáG~ñ…ÞýÉ{Ï>ÿ/W®Ü3¿´–*T<>âŒÎÅŽñq½ÃhÇ-.Òá¡ýr6œi›s­ÙuÃÌìñé\>€ytÒ„?tl|Tã´ºY‡W4»Æ#ÞíË£YNNšíˆÑá29QÔ@hÞ+e4(?hD5VÂN„-xpØ‚ÓÝv4`²V„!¥$xo#0¬àr» Æ£É\¦Ñí­ìž\^ ÆU›—5!ƒFרÓ:Z»ÔLŒ[ ‚W‘Ê„í8‡1’ŠpBP”BQ5¦$’j¡RZàe%‰Vjõl&Ã2œÍå3£¬—PœMt\Ä?è'l´_*úØ4/Ä +ÙR*‘RB’’æWªÕ|:«6ë²Z€Fzüa7“°¢ÁQ=:¬uMØNŒ™Æl#&Ÿk&h!—ÊOEâ…¤š½tåî­íL*^¯TrùB§Õì6+j²`rxŸƒ0¬uÐ4Â/ã¦þN|„3bFSJ<Nä Ðls‘´ G œ¨ª©R­1ÓhNS £D,qyfâ¨ÎÓ?ŠÁ%Á"* ( evú|L$¯BQ“\:ÓØl-_©Îœ¥ø˜Ùjx!MøÙ !4PDHÅL÷,éë½ÿÇׇŒ.ÁA(:;³Œá\0‰D“áH,ªæ†ó¸=¸—òóÉ€”åÃE!V×ö7/°¼Ú"B•¯ÑÝ10q|Ì +jrR.:îå3jajaï–á Þ¢$ÆçÀHØɈÃÕ»¹!bõ„;4¨½ã„îè¸mPã¶"JÅá*)伌ꤢý3IÌØ° 1z%¦ÉÃ$m˜tBç·yµ.ÆŠ°v«wVÂáW‘`–‹””Õ;0ƒeõ0.*HÓ&¯0j#í¾Øq­û4‡G-àuM¨ØßPC´6aÓ˜Ívœ•²8rb~7ÒÚÙa> 3â<:oä·ãŠÁáѺ',¾Q 3j èÐиƒ3c’ÓŽå;‹çäXndLC¦é$e7ƆŒN»720æø? µ9¼!à®1©sqzD€öò9µmöˆ'&ìL¸.,ú!ž‡ +.o´ûŒV¢ÖÞ@ˆÐz¸”•É:ø + +¹2T±QQ›Ó¡Â°‘¥”£NKÅ ¥¼žž<`Ⓝ:ĉÒñLÛìf¿~d|°¢ç—ë•és™öi•<;öÕ1#T†ÿµû¢nF5÷7Ýx¹B'¿vçØ¡cè)­t½Bň„ÆÍþ! ióÇ¡=ŽÆlô¸30j£ôˆh%Bµx#µÙ3ÉƲ™¹ýIÔŸuûT„J¸©¤Þ„¿:6b6: }#fªÀæ×›kÄ{ZwPã`0> l0b X½*¬0JSÊT°HŠ%™°2&<¬`ë [ÇœGà§6ö‡Ëð‡ã3#fbÌBjl ÀòëÇôÇG]&T2{¤ÿyÇðñ³ÝÃÛ4P'Œþãzß7FwŒºAÝæ×.ÕV.6x†l´K¬’‰9¾´)׶˜ô4&æ«Íµµó™èè°¶û Þ˜•LbbƒVGœp‚ÑÅŸAá +õ§œý3^úG^ãÁ‚Ýt±1—²0ª;XÀ•²Ý¯ºùœ/Þò«x¨jóEºF"„úUJ*øä‚Õ'¼A½›wú"ýó[L‡F,@_ ֠Τ˜wÓý¯AS€¢ÇŒžA=¢AC&_ÊÅW½Á*)•I¹j'd!^—>¨sܼŒ:¨ ‹TçÖ/¡ÄÑqû ÖeÅÂ.8¹€rE;“³()­î^—ÒÃæa­Ëèð[!óG&Ž÷ÉD C-—/ýÕþnùа&bÂBÜq\3b@ ý‹¢ zB5°(rºKÇ*Ç` 0Ę́6.ãÏ̺‚E£ÒáêÌÚÕÕËOš¨ˆ• û”Ÿ˜3¡Ì<ëÖ{Q_´ÞÝ#Äâ7N˜† ^3Úß_ˆvÊs—Ôú¶”¨­œº r ±0®­+õÍhëd´svìL<¯Ý÷È‹åù}(I£; Gx#&£|QH/âR}ÂÆPq¨®lÈI§tÆJe\é2ñŽÆé?6f„eÿjGÁ+Û}ªÝGÙ,,ÆÊ˸ò Ä;&\ö~µÄ ×ÌLRƒJZ·4lꯇ׺D”˳j×Ã$¼þÎQ®@O\[( b7a’Š¹Ø4*ä ˜4b!‡ØqN-‚0 4¢cÍäÌys }Lê\¼ ÍÞ ¼…ÖÍN¸87“DèÈô€ùÇÓ¡QÇ 0¸ƒnÖ(¥‰KPe }Œ¹ù¬ŒèÝ‚P<àuåŠÆFãtä쥇 !õµcºããNƒ[93é ÃÇ'œV +cSP5NŸ fgB•<Þ‚©DÅ‚œp´aÕããî=aBÂN_jd°¥sÉCFÊ+o4Ö"#ì舽¿éÌtѹ€:)çÀ<Uúg±º¥a=Ñß›ŒÊ¸TRSÐ ’KÐR|È`6¡cÀºÞ° !\ÚJÇÆ],*ílR‡ËþÌ Ù_þ7—íÍN_‹‹6!§{\ºë 4c¸ÓÔàqÓñtms‡‡­OÐNÄ}b!V]åÓ“Ñüôú¹\Á,ÊÆÛ›©©ýôô™Hs+TÝp yW ^n.󭜿­q¬Xò„T“²«‘òŽG¬ÐrU­m½Ê n÷¥°P‹RçƒÅ“ÉÞ]lvÑ€ËL`£5°½#0d%m¾(!•H¥êæ²L¼›ª,½úduá® dŸ›™¥SsÞH—Vg¹ä"8­›‡W0Ù‚‡1>otIK`Ìâ–S=R̶‡„ËiKà U}JC­oÊåU ©h„˜Ð\_¸£$7÷œRŪ€½<¡óŒ=T £MLªð©Y)3o%"‡†-GÇ#fòø„{ÌÂaBÉ#Q¾d£SH°Œ+MO¨jñ…á5À6*A†k”\棵ZwÂñã6£3‰ aRÀÉÇ5î##œÏzÉQ£gXçB¨0/Ÿî¹„,£ö¡„p¹@´éö§ú'Y¡Š•H˜1Åè‰hÁ1+g'A2ÊJvt ¹Æ yã.ʹÿÅ1xi©¨u²ÿóÐÈ‘!‹Æ¸éä;"T&·âaQmùåÌCšaƒ[ïfÍ}% XÈd%.5—èœñ'ºlf +‹ÔÉxÛ—èò¹y"ÚwQ«®\½ñ\iáÌ‘1›Îɘûë˜G&Ú¢#­a3¡µà_lÂÁö¿¡ÃåG¸$—™’Ë+RqÉÉ(`ÞSÝ-·˜õH9w¶¶piý“ñæIhÞäòAmæôóò©Hm%ÖÝ‹÷öK‹×Ú[Fj§¸\´‚‡òVŒggŽ@nÌ!€‹µ`öŽŸA‚z$¤ëѳÐ)ÒªÛþüª™I›ñ ¥”¼RÑÍf6ã• +T´¡TV™XÓâ€[ôvf⤛‡Á7BRCÄ +’ä€@­sjm„ݧ€Ê’Ó|fÞ-”\\Áí©­ýpi’ìá»…ˆžAp±d#Á*Ç6O†Ê@AÀ€%]ÿÔ/ÔÍÁ¤<@ì±ö¨™üŸ‡†‡5®ãNȶã&Bã`=\ñ§=lÞå‹›A£ý£F L x]w¿å%¹´*-צϜ»çù@¼‰ð™H}[È-‘‘V¾»_š:«Ô6G\Ü€Öíf`PBI¡…Ї“ÞK3‘Ò¼ŠBA‰èx“MMË+tb’‘KµÞÎþ­5‡K…Pi5ÞØ +—WbÍíhc‹Ë̱ OÊsjsBŸÑ Ø+–ƒ¹åææ­ÌÌAÿ\3î £:OpØF13¡xÃÍPe§µvKHv¹d'\^°Òáãz—•”‰vcí®ý{Ÿß¸üd~îœGÊ+jy~çn_¬~ÌD€ë æC…ELnËÅ•ÒôŽOÎi]‚R=É&ç]þªC.ÐôO« ¨•åTssØ„ß1h·Àø"5O°Ðÿ ˆd3§à}µË&šù¹3•• ™éÝx{›Ï- RõGá{;—4â =ʦ¢Ý¥µï‹t‡MxÅbcef󞯟°éÝéH“É…K™Å«liMKDýáÒÃϽ=»yy •[$§ÔîÙ™Óf&/hœüó@0pDã>a"Æœ*ö—KA:ƒ˜ ³.Rv1q­L¢mï¥fÎ×·o·v ür:»þhgÌÊô¸„xâ=B%;s Ò:D`Ã~çRF„·ÒàÇÆݲÙ×ß:j/Jw‚ÿ™p;0ÙŒˆ.ˆLÊŠEÆÌ •œ²°ÑcÇ…!£wÌɤ[)²Bf6ÞXƒß!ÆZ{r}‡Ï/gºg€ÓúÇáq;&ÁŒÑ#h\ì„Cµ°ÃFÚ€(àÀóalšUŒ§G㮀“MÇjÅ…»Š+W=D±³©6ÖL”ìæ3B~ÞŸšFƒ•hu#ÝÝgS“àR0¡Ê/ +É)Ppª‡„jF<†)±ñC£6°(ôÂùE©°,­³™9Ç„L¤º„+%$ä +k¤›«Kû·6/>Ò\½Ë-¤òõÅsן +e'ÁeEªÛ‹gŸ8ûÀ›ÅÛD|ÆBÇMʤ”ÂòHÝböÊ ‘Nâ?ïiœìá1瘅²âpwF\±Ò "Ú WCê™æÒÒ©t¤f§#&/gçÒ6. ЊU—Î>ÊM[ £7”š<2JFšcý“i*DÒ½|{dÑŠ+ˆw 9·X¤Ôi*9%•Šóç¶ïy.7sæ°Yñ'¦ÈHÛHC†:®ÁGúµ\Àùô?×Ú26Åç6¨Ø›6AŽ£\LÌ€òf<4}òÆÎõg&wo•/ûÓóZ,|LÛ? +æô=/‡ K`5-xÔëXð@N.,iéŽA‹ÞIÇòS$Ÿ:rB÷w h½®`-nŠ¥M©¸î S&T¦å†•ÆÑããžãLcgÁ_iì¨Êâä&xï1;3Úÿz  àFðxW‹Š˜T ¢u;›²ûÓD¤ã ·Q±ì ŒŽº}aä"õ—àÑ?®ªà˜Loª´,ç&ï6Óº4.Á+UâÍÔÔ¥¶ÌɹÝó7–´/åç›ë7+Ë×Õö~yþRqá2m×cþhÓå;ï¥É˜ƒ-‘áN¤ºå  ë=v2¶ì® ÈS(ؘ4.÷wGº…,l.ÑEÙ$Î'2ÜÌ~fút´¾ÜZ¾X™;G+5Vm¥:»éÎNnò$•œÔñH@Œµ"ù¥vlÁÄŸ¤"_¤ã ÖNèq­#à¢âiP0EBv>?˜èÊ/l]¼þø+T¸2fc¬¸L*µ¹;úÁ­»ŸÏÎ]èŽ;i!Ýa’==³ûOx†Ì”€™¼Š¶ÿá@Öä bò"tÄ€}3?æÒ#’\ZMNî·A¸ŒÕ”R­q›oÔêhÍž}¢»÷pqåžäôƒËß1ä°c‘•³9¹äcöA3¥Eaà"#•“‘êÞ‘1çẠ3æìÞb¶Ò#6? ÜÁuÜ)¼ã¨ÞmFÙA]ÿ¸ 3u²9o¸ÖX¹¼rù)ôˆMš=• W¨X“R{ì’?¿f¤dD-. ˜ å¼Aø)•ÀõA:08ØccÖ;NèŽ › ™´¨úþ·Úü§è[è i,¸WÈRѺ˜Ÿ çãí“þä$*äE0HjÅA‹Nâ­Œ ix£ÔuÚˆÊ:;RŠ‚” <ƦÝLjÁì c,HŸpA±C ò 2ú4Šáü<©Ú¼¢Ñ<ƒJé¥gvK ñêJ¼°0µv)Zžuøc|²§Ô¶0°ÍÙ¹²I©sf/„¦ˆO*yùÌ°‰‡lh"ûæ‘P:á äíý|<4jøÚ ÁͲ±Ž˜^ŒÕv›÷R‘*Lo\ ¤§Æm´á«Í“Ô®ÚØ8¦ÇOh0œ+yÅÒˆÅwǨõШuÌFcB.ïZpÙèfµæ¢c;£§çt¸Tœëœ‚°£s±à`³“H ­w°£Fâÿáë¨Ñë¦#㢿‚º?P{„R§ãm4Xò„ÊÙîI øÜ϶ÖSmxÆÈh±p©Â%ç‚ÅQ+a/¥4øÔ"›³±BÈ1›xÇ°sÔHäkK©­þ1qZD‹ˆ^¹&UÖãíÓÀê‡GœRdÛ€„£`ñÂL´Î';D0ùbÂØÿtEïz…Ì» .Ù U6ƒ¥ÌÔE¹¼Á¨mÆAúζwÁÇ×õ!t',P¼Cz ¼ý׿ú^†þaõ¬Û—´aŠHJ¹5¿o÷Ç àefN/]|jéÒ3™…K¾Ô ¼+¥{³;íùó>¹¢qù'ÌW‰X±a’­Ú0AcÅ)M‰,vpDrÜ.Óa LcrĈµöÚ¶Ò¶þ'´u¯Ð¿}fôŠ—È´Wjó;õ‹½“÷Lmß=êÞêâ¹¾iebÉÒlÿƒS6®s3x0ï 7Q¾êûÿ8zÏ'9®3Í÷Ÿ¸c$‘ }—¯Êr齫4UYYÞ{ß]]íÚ¢ ï-A‚ @ï%ш¤DÍHJ¢üÌHšÑîÎìjfí¸{7î×{ŠŒF±Lž“ïû¼Ï/ó³ï£ÓÀ0{0`’=nX…†[§¥¼dÜ]phÊM“RŽÈ&ÄY=ï!5ð[†,mˆñf®µ±uácTAÇëòpÇ™šž]¢]L*L{-ÑÌÔV']Ô³£žIïÄ :Ü+%à4äX½4³3é¦ÆÃ+‘Òzap±¼ti°÷B¸´r¿Ôݜۺ9éá\°aè¥i7åF$\L‚lJ5–I5"ÍÒ ÑцVÛÌ.ߘÝyQÏöç×.|ÿ§PRýq(„*M)³šhlíÝ|gëÆ»tlöØì'£´Z¹JÃ×’KgY11à"5`ÎÇ°p NMz¹1SaÔ-Y}ªï’zaÊKˆžñ`GAHXýÄ‚€ç„ÅmQ‘º’íÇJi^+/Ç:ûRq•Nt©hµØÝì¼ÈÇÛ^ÁÐÜDó€X° + +¢- ‚¢?ê$G]ô$ĹaÝp]WJ³›r²•mÜ»­¯˜u¥²ŽE»>>£šµÅ«3÷½Lì´³8˜OSz •sŒ>kͨ¹Di>@G†7Õ±0ªã*¨žÅIŸ8é¡'\$ÈqPyGÄp%|<Ëi2Rb¢Õ\kýé{?üàoþ¾¾r µâ‚Z\*Î¥[[õ™³½Å#Á(ˆF‰ÖÙHua¡8É'&àccÃ't ´,7j#ûŽºG­ð„p}TŠµ+³ݵ«c^ÚŽi&”YV7ÍÚ6k°ªÎl§ëkD±úy?Po:æñB?Uš?5ᙆÀ'i®ÙI óL%¤¬œh;’—ˆ €ô²špÃ1u%B«‘r¶ÒۮϠ¢÷S†ÝÇChX_S´t墧'!/¦ø“ÔËl¢#¤gÁ÷øI-–mì_|ì:®5cµÃxý@Ž÷Œìœšž ˆ¹“œUò©Ò°¸ÇÆ=Sä!3td®³þ¨µùm´NYqZÍËѲÝÇþÕIë7&¼§]¼5ù‚’™óñq7­[ƒÂ3§à8eCP%¯WWôQFS«œQ +«¨R2†3£;6ZáR­$°»ƒ óû¶¯¿sp÷»Kçž`J–ea1ã!¢ Fø‰qhd:`ó‹c.ÓÀyØq7ëðó *y)…2²…™3g.½T[=rÐ*Šcu3Õ9 +W6†ãlS=ðëà ¤Œœ!®! ä…ÊÀ£fZg 3GŒÙwó><ŒÉEB­Á"PÚð¸_ǤOöt#O«u XPRí™Í«ƒ[©öÆÌúÅås÷¸x“SJvVLvf7¯•æÎyÙ¸ “øHfný’Y˜4äÁ4qaQ/™ÀÄ,„jî (d©pCÉ.§zWŠ+÷¤ü"!gò½xk[Lõ¶x†«ÝªÌ;ŸI}sÔý­÷ P8xE*Y†;¢J¸”3«kA!æÆd#?»~pçáëo\z!ÒXÿú1hy°s¿·}‡1ËZ“R³•¹Ãtc=”hÅŠ3Œ’œvcAÊDĬ–'< °‹Ód‡un˜$¸îÇF\cØê¡­$ÆfÐP5ÀgÕx½¿~!œíÀ’©úÍ[ý³/$LÌ^¤ã=k ”È ¶¯<…¸ÈˆµùyP!Òô攓õ":¯:ƒ³ƒ3·žq=sÒ +#È&Åô€Š4À¥E-]]ž;s𲈘” +IDHú ]2kˆ˜³#8;ô¨Ó5í¡~i܆sÁ² w¸—V/ "-YïmT¹¬•×2= T8Cë—- ¸Øi7çÆ£d¤‰ŠéSÓA4äð îá3J3@è6nCNOP6Š‹‰ož˜þÆñ‰¿>6qì´mĆ8á¯æÁ)åËátwÚ‰qjÖŽ†0µ@ÇÚrnA«läWr½½þÜÖ÷òË÷32*ËjaPªZ†rvD&øxõš›Š>7î™rZÜèÔpw 1R¦Õ ¨û>&F¨e13“í)ΦëK—o¿|îîkbª…(…HùL¸¸žíõ¶ÕWnU. ‰ž‘žY;{‡Š¤­ï¦Mh¸žX‘ÍÐF×E&}B08aŒúBc¾Ð1 vÚIÎRs+rf‘V +ë»w*ý&Z–³Ãå\2³kw—_Þ¹÷ÝÌìA¾³¹yñ¡œ[m>ÚÀ䜸{ À\sav$ä& 6ÜÌ9ø^Òœ}k¤TsÇ&ýÀdBTe¨†”ùµ ocZ‘’ ¯Üt‚1ÛµõÁ¹Lu9]›&©¦”xÃ6ÜE±Ãa‹Ovu”Žçkkåîî±QÈä!†©y:Þ–‹‹F}3V]ì/í?|ýÓÒì.Àá|ïlqþ¢V\’Òó˜Þ´ -§•Û>%£µ¿:1zlÄ qÔ†OyX 줘¨5¶.>dÍ*/D/ááB(Û1*ó…ÁN²³”“Za.ÑÞc¢­ ÑôS‹B¬Ië559›mm0FZÏ7æØ°‹{hc2 C<*£í¦ã>>=ꟙ Lú%'ãâ=4T¤B¹ÅÍ•Ù>VS + ©ÞaiñÊÌÖ½ kk—Õâ|{éÜëßûŠKöœT×+T¸ +Œ¥˜œÿzWîY@7Ààå:{Ã=S¾^ØþõŠ _áó„RqRc.ÔGcçÏÃm²›À`çúç9³Î(™Æì^ ¿œ-ÏìÔæÏRá’ ù¹8ˆ +V/Øœ‚D@²N$â†Ã.¯àÇÃôN[0 ö\¸0î&N;i&Ö+.]3[»B²çfâ.¡¦›>Ö +`l€>+éÁpwzHˆ2b…h‹‡¯¸eÒAè@¿ž¹æ§"œ^ä"E5ÛknÞìï>ì>¿tö…åÇõÞ*B‡!LGù¤SÁážMA.ãÅ&”D7~(V›vâPP â†ÕEù1 È—¢Æ¬0*äÕô ž £Ÿ´bÇÇv¯h¤ —åÍ.¥•ÕxÓGéyülø|½¼ÐX½¼xø`ñðÅêæMˆ7äÖW®ÑF@ÎÁrÞ/dP¹@È Têƒ&óÄ”ÅIº‘°Í'[¼¬ÍϺÀ·š‹goÀJÊF†Õò*ŸêꥅìÂQ¤»EªŒ–Û9z0ؾáÂ4/Åä’š]l.^šY»Î/Ò€—+ý'o~’Ÿ=÷—ÇmcN̆È.2¦eæòÝC19çDÕ…»Rªṳ̂oÄE:Ib“€Ôé…A¦¾4¿q±½vÉIi”QTr=9Õ¤£¥t{cíü‹[·ÞEôr´ºkíÀ¡’›Œú@õ!M‘f–Wc•U;*Ÿò£à:&f¿Þh5é@"§ìÌ©á>æò±iÏ”ò3Q)3ЪgâíýDû¬‡ŠÅ²³ž~²qù)(ÐB¢¡–æåÂ@LÍÝöº‘9½Zœ9‡Ê#_ûv›—˜plÜï§SÀQ7fw/Ý}Þ ³±evÜl†1»f}{vÿ‘œîtn¿YœÝ·UÈ8ÜîQEÇnø¼ÏäAá³…i@pÒJLùCN*.¥ÓÍÝH¶Û˜Ûëïß_»úêêÕWν ¦gl˜†‡²©æ™âÜ9˜sF% dA-öÓ椛›rqVH°ºJ%£þã–Ó“~§_°C´âAmÊ+cR~~ç.¨þÿ×1ûi+|2kvåôÀMÆ¿uÚk ðnRuS*,Å™x X÷Öö½üâ52Ñ'£uµ¸˜ì—D~ïë±@+‘ò&H|gŽBÃõ{m^Á&ä³Ãí« 1'î!u7±`ÊdP`cU.U÷Ëf¸¼P߸oï$›gò³™Î6-ÿ '°”Hµà’ÀN o¤k¹r{íìÕ—ÄxëÙg€1Át¸ +ªº©„ŸOÅy$”91í™nE4ˆŽäÑ ´?]ê-m¯ ¶<„kžél?¿tôtaÿ…ÆÊÅÊâ‘’ïGRí'üí¥'ŸZ°°—Že{‡ÝÍ©æQªyNLöí˜ +h4’nÑZaâMǧ‰qlGcA±),Ü|zñÁÛ>:<áã­¸æá’”QÏv¶ó½£ÔÌ%_¨è£ £¶´ÚË'†Óíù´×]D¤8¸4ÜÎb!Ú Šù“p£:¨° H2a³Ôw[ DµD{§8wançNkõêðÁ¥–¾xý¥ï~ñU±³>‰x¨B(R«{é„5¨ÃI)y˜‹81KP¤ô +è+<\K —åy¯®.¬½þÞç³—»Û·gÏ=ίÞÊ-]ïî¾8¿woqïn²u&]_ùüËßßyò‘Ð…p…‹´\°†ó Žw¤HèƱq˜ WìˆtbÂ{|Ôõc–£>’n:ÍÆg£¯¬pFÓJt¼KFÛt|†Ï,Xa‰ŠòÈ6V‹··J+WÛÛw[;ª›÷¢ÝC.Ý7²ƒó—¢ZÓ*ñᨒ-:±LFæ†Û»;Èç¦ÓÃ'ôˆ›ò²N< qÕgŒÊR¸2Ÿn-/Ü_8|pæê˽­›‰Îf4¼\ÿú,DhVßp¼©×ó3ç* W"¥UT-Nû¨;˜:QÀ›rŒtÄôj¤´ÉDëã>~ÊÇù8€šI/ ·¢åÅTcüWL4QÁLµ6 +ý³¹ÞN¸¸dÖ×ÍÚg6"©æÆáí™Í * ð-ÞX.e“èâáÆp§Q'îCCgï%+KS^”07‘€è,8@`ÇJóçn>­Íí,BåœTXÒëgÊ‹W÷o½{åÉÚÛ/Ä|©±|æè>Jƒ‹WÏ”o×צºW¥T8 Sö/¾˜nl°`£ ÂzXˆI ke=5säg“¥Özc°ÞäSx¸JXeŽÌÌ¡žëC/¸Hõ´ƒ>9©\*²±žœœs ꤇fjª;¬é¨˜A¤ ¦å<”&F«©ú +.T—.®]}-Ó?ŒVW¨HÙGGQ!pfãâKÞü¢»v5ÈgÄø.—ìAÙᣇ#¦àçƃ#V:”š›ðPqlê¹ÉÀ¸°zx7Å”*rˆF| Átÿppþéú÷Ê«7ƒ|2ÛÙì>Ø¿õN{éüÁí7Z›×"õ¥ÊÚÕôâµ¾­ä–›wö¯¿Ù\½¨MÎÌ'Û;fm“M-BlfÔŽ?;ê:1é2¦ŸŽØ‚…˜Çõ©¨¥…pi~åìÝý;ohå~¼½Z\ëÂõIRÁPÑK(8Ði9 Àg. "ÅS˜œTóƒÒü¥ÆÚuàâ@üÓz¾2Ø6(šáÊJ{óÎÖµ7Ž^×Ö„TÓÏë„ë­]á¢/§‘*ª–AWàreã©ò¼šl¹1ÍÙÃÍY\xÔ…znj¬:rlÔdãp˜h‹VR­õöæ £¾áeÌ•µów¿/›¥ kû—r³—õ9µ8åF¸×®<.¶·N 7™ÕBŽOÌÕ3ÙþÅdç—n¾|öêóá]XHcãîÞÖo¼¯V·\D4@éo|ðƒÅ­«Sù¹)ÄP„ä‚VÜÄB•“Ä„Ê3»‰Ööˆƒt¡š—Š@£"55¿ÊÎÓjöèö«×^ü¶šêyˆ0=¼?HÔ7;·î¾WY¼‚«5TÊsFÛO@}bú؈¸AðUˆ*uä[§]® Í¦Ýü¨u¢Ã-G.æýd—Ó\¢êìfgŽP­.åRÿ°¼x¡±zqûüƒ/·Ðß‘óý3W^?zá{ƒs¯€zqûé;gîóñNº´¼rð¢’íMøy;ª3Z…”€s-ãÃU#Ѩç¯dmhmTcííTÿ°½y«¾~EL7û[WËË£ím£½#å—H³5ÕœlƒÊ%Öð+YT£7ÏzÔºù¤a¶ÔÒJ0”Ç£5ÜlÃj ×Q¥ŒÊy +̶„ IXˆù…H¬¾ÙÝy¡³ûByùzvöÐl}«é™öüá}¥8¯—Û»£³lz–5±Îm\öRÊ´V6Ää,*Hñ6DDm~ácJ¢ œÒ·NC'§`"Õl²±%Ä»N4lñpZ²í%Õi³h@òGwß:çÍÞæXiQ0kŽë'P§†;ÐÙ°iˆAÄTº±‘®­FrýIulÌ3éa "l[‚N +1„ g«1š;eñŠÑFûÌÍùó/ÕW/‡Ë«°\Þ“÷ž¾ÛY:7Ë`rÁM˜Ó>Àž²–‚t$ÛX†le·úd„ŽºÅƺl|S+z²qã…7/Ý}“”sA.]_¾Ÿ»«¯‡s}@^:9éf0_ꀬ9eAü€S´.ç6Ƴ£^«›¬w7^yïÇcäø(4éb}LœõôìR$=Cðáæ£çœÃ幚d|.@…2íõÂà°4˜ŸÝ5* R¢‘ëœéŸ½7»sµ4Ø⩘x–sj¢Y›Û磵áPeèç1P‰0áÄ݈þ&åô”‡´ ñPf¦µqsãú;sgV—ŽæVöüåo/Þƒ.~µ˜œ9ŠTÏ$Úû3;¶o¼Õ9s»0³{åÑwØtßFFCÅ•ä̹Ìܵ… o-\|£~æN©»û/~÷òw¾tRæT@ð‡¦`Å#dÙä R^Ï·6/Ü|iþìâÒÅÚúµâÒy£±Z]¹Ð^»ºyùåsÏ¿ªa®³uxï½+?Z¹ð¸¼tE+.úpl'mtm¨>ée ÊtS1 Št¸!&:¸Z$" ;jPZÕM( +¼ýúbEê6é@C¾‹çùxÍÈ·óÍ¥XuEL/ j‘J˜õâêé¯w‘!áÁTð«_nàá>í# ð"Â'@UB¥ˆo!Ö®lÄ…Ûa1ÀF\(ãcBœ‘W3ÝêÂQgã†kp’Ã9_¸ÃÑ€WÊJ©ž—4ì€i¼- X½Â´‡vÁ¢ƒ§;ÛÍë¥ù#µ°rS^^ +—õT7ÀÄ(µdS˜PÌ&¦íˆN= &œ´VOŒùŸò;íšpP~B’!§çæ9‡ b&œÄ·F\Ç'ý#.jb-nŠRÒAÖrÑpy9RÙ %#ìP{½48Hv÷CÙ96\ÔS­Xm‘Ôb¸¬ ±)E«ñÖ`=,ƒæ# 6\9mEÇí8h `˜KØ|<ˆ±ÓÓ>@Ä 9“1ÊZi)ÛÝm¯\œß8:¼ù¨»vT˜Ý[¾ðdvïÑæ•7Ï>ŸimÈñªšjçËÛ—J™½¸T_½Öß¹ ÞÜPr3\¢/Ì\¾ûúÙÛ¯ºi3”]ä“}½´¾pôêàèÕdc£3·ýÉ??zðZ(7“h®»][=xÿíW¿÷‹÷ô/}øåÞûîßÞ}í{ZeE+¯H¹¥Xc¯µ~oóÚû3{O0­Æ(¹èüü¼ Q­p( $¼|JÈ-——n©…Å «Ìl0ZQˆuBù96Ùf’6šÅþÑÚ¥×ÈpVŠ•äd“0…þÅÊòíPaÓÇ€óR&ÖµE^Ïú™¨­N$òõæ,áq‡ÉùTs›ÒJ\C”bcívnîŸê±ñ6e”ÝÄpˆVóRÍPá) ñ:©@i ýÚ¾™¬¯a¤#u®[!ÖªI¸îAUpéy³æ$#\ACY!3ˆ7èhåi)EË)˜OˆfÝæ—Fí*¤¤x‹Ôª€Rtaú‰ñˆÒ óQ€ /™tQ@„‡#}"ÊÅÁ?Çä)+:âblhØÇƇ;æÈéPºjoz™¸™ªD‹3¤–Ѳ]93()”š5KËFy‘™¬â%X0ÅdOÎ/6>‡‹áÔ ’›ìïã}„æFe«?5å;>æáÃ#”RòS("„^,Îì-ò=ÿ0ÓÛ õ”šn´×®¥~¢Òg 5s¦mHfSMu1«.e:›l´Œ©%*]Œ7‹j¢š¨ ÔldžȉƆZ˜eú¥‹¥™m3]m¶7èï&zþæËùîÖ„OX=åW &…ÈåÂÌ`ÑE³Ñ˜ÝënÞšînSÑÄ&Èp…7S½,\¶Ã¼h–€Ÿ¤´<¸†¥Œ˜l×V®]xòƒòÂyæ¡ô,0‡ÓîáÂv¿,Š´¡³MjEZÉDr3 9™ÙKbv •¼`ê:gÞì9` ƒšé…‹*\b #ÀBùñPÑÏ&&= `OZ°Ó6|ÜEp›÷çqØðãÓ¨ƒŒ +©™PaQÊõ…d—‹µm°.éiD4§¼” Z>RZ1;F}›6묞æZb²îDE%ÕKÏ%Úg3½s„ZrV@ô¤SŠ¯Ù¼ô©)èä$4fÇ cBá2¤˜-t·ƒbœÖrJºìn ™Ê(>IwP9nõ@ ­­ž‰Öw‡k^Ñ&("r²ƒiE ³"ŠËY)ÑÒPUõV??îÄ1>æ òí£#0­KŠO–“….£&åH¶ØZ¨Îoz fyFHT¥\Ǩ-f»+­õ#CÍÁîÞ7[gn‚ž”Œ2.Ä|„ì…éxª¶¼{3Ù\¬JÌDs‹jz–3Û^&êBH[Û»`L\k(ùÕL÷ ¿ÿÂâ¹»[·µü<Jܺ÷äËßþ‡Åƒ{ˆV6;±™K•íÇç~oùðù\gUM^|ãÃ僖`hÄAó©…hëliáê™kïG++Fª}ë…÷ï¿7á—¦Õ3\ŸÝ~°sçý­û*¥Õ|síî?H·6pÈɳ½£…£'çžÿ¨¾rSNÏŸ½öZ¼²zlÂÿÜ„ÂÍùè.•ÕÎú VÍŸ¿úÂ;ŸþŒT +ˆÞr+|zQί-œ}ãæwÒ#½t÷­‹ÞÖs3 ÏOÙ1YX 0)*Ü>i¥GmÄæîÍó×^rÂò7ž³~ã„å/Ÿµ=3êwàÀó¬Bxx¿ò쥗¹X‹ÐJ€s½ìp3#BÎÈ +ÒáP¼âÁCB…Å”˜ž5j›å¹ÃÙ;r~ࣴDyIÉ äpšÕ´_w36¿H&¯¦=AÆæ† V±yÐiˆò I¿”u§øåüBÆ b´b”r çç^êîÝ/®ÜÔ+[S>BEѬz€•¥c€ô'<¼+¨¡B¬²Š† +^Ê4²³à”œ¨äÀÃ^щëNT$"h%PÙÝ°dVV@ÊóZ‘à“.X ’z$Õ4 3¨hLy„j†W«Kçæ÷ïtÖ¯(©¶‘ëªÙ™ÀÐ&øpžB%Ø0Æ/{Ú†:¿~„aJ€Ò|„D€ eÎDYà !Bš +åt$À˜”°[ÑT³ÚYË·ÖPeø4³ºx)ÓÛ zl$ÇjÉP$©IP-qÌIQr–ÕK˜”òÓa7"º#¥ôlŸ6;– .®Õu9Ù­/žïnÝHu·aÖÈZkû7cÅy˜MDK‹á⼜ê0FHY€6 Lc†ëzÅGl¸=¨ø¬’^V…h‹’¢ÏUûÕþxƒÞØÒj[™Á•lÿB´¼ ”S0.ί_lß¾ XA ˜j~x–ÓJÓ.rTÓpéÖƒ·ï>~ÏËÇ&‚£nq‹ÕšQÛ6Êk¡Hîµ>¿õè)y|Ô; Àü›ÍÃÒÆ}!vˆ¢ÓÈ´Tˆ"&Ôlx¿òÜ~¦µ‹ NŽÏ.fËv$äÁÃL¤†É9\Jz`ÖâB&m^eÙíó»!§½a¸‚÷,¦–qÞèô·Vönë…96VÓ + jaÍÇAct6”txi§ RQ”IPRNIö—`A¹”¨•%Wª¯tV.;É°—1|Œá‚C3\ ࢆ-„ð­çÔtKMµp)!ªIQO¡Œî ˆ—íç§õ)'À$o '†` §xåt5×ÆõîÁÕiŒî„søùc§ã؇ªvˆ…Àõ"T_P´{h/"Uçv=ïò3Ò± E¹ÈÁ±ißÈ„kÚŽ „6:íµÝA%HD´xY5‹‚’ àƒ}ÂzlÔóܸwl8 ›ráL( +00@Êãöà3#N2”ç£õ00¹­M¹ »±ž95å„r¡)Drµ9³Ð“̲ŸT~bÒé·y”µ  •X¦›Ù=åÀF­¾Ñ)÷Ø´ÆŠ‘•h†t-Y ´¤-È1r¼Ò\Hå;àè¦L++‡¨È¨·ûXwPà”¬)ùIÅâÆìáôÓ¨€AqÊIù1]‹óÕ¹TucB¡hä²= úQ ä³#ž1 â‡M;1fŸò‰n2N¨UÁì„’3R¬!¼¬¥:K‡¬Q€\kÔÙÙTmUIÎxˆ°ÕKc|ÍáÈ:HØE/,ø1Ñî#Æ-‹ÃÄ(Ⱥ,0`\ùHVò œ° +‡h¶æjSÍnðѶx?o‡»‡™t;ý HÀõ¢Q ¤Ä„=6꘶gæw7ÎÞéÈ´uxHÈÏsR‡J^D´yÈ‘IÈË„]ôÙðÎã”S²'ˆXlÁ)D ÊâRføœÚºŽ³Cô3ǧ§mØ´óœ<å8=꙲ƒä• Ö”4ð-±téÌÙoN9p'ÄUqDO@À¨ˆ–'¬A-Þ +§f½ˆÓ†3 ŒYào·M8(QÀù<{r¡TJJØ<”ÕMLØÑS^œT¦…$L„Ý>–ä\¸ñÜ”÷[§¬ýÜÔ±Q'È1œÅ9U ǶÎ] ÅJ“Ò|”ŽŠi\)ùô$0Š¹³wãÅþΊÊñÌè‰Q»ÛÏ°R\ÒSZ<ÇIáíÃkƒ­Ë„±ø­^Æâ¡-0:)ê\(‰åEF) œd†©J +z¥HF”„rîîñ(¥è‰:ʃ†cv§“a-žôœ%@X|ˆ;@pJŽw\°f H§,>Ðdh8€?‰1@+¦C |'è +W"ùX} ¢ÂnXtxP ÀÿåÕŒl'ÝØs“ž)7(42ÎÆ!Dšr!àL¢É\,–m³¹ƒSNè¹’l%ê«_ßiá0!žoo„³3@1€LË +d*Hé˜àõ +L› ÛÍT3žm»ý8t†Ó`B†‰JH.buùŒdvûèJçGÇÜ€¯OÚN¸Âœ Ê=*‡Oò¡·w¹ýãSŽÓ‡Ç¯©j.“(äÓ2¨ùõÐ/£VPÂ\#SÞñé ‘]^þÔ˜ë™ã“Ï<;is1L¨@‰i¥-læŒxQ +@H{ƒˆàµÆ-gŸ³1Ù]8%$ü¨=é h‘ãy]WEIòúª*'Q–'íÎi·ÇA’ÁX,”Ë›»ÛË[û›íõ¹t-­!AÓ|” dx¸Û¯ ™.ÈšQEMVŒ8Á¢^Ñ lÏ”Õ~"U¨æÚ³|8˵P>ìÇy?&8¼äÉ Ï7NÚìA9ȦF¦ƒ ël.XTbÅúlwaY©@A&°ŸP¥0È"Šy#S›£>R C)‹‡ðY˜ !”ȉ:ÉGü¨S:)çHÁäøÏPÉxX G8Q +)!’@H¡i¸ÑÈÌ-ö(¨"å…yÈGP &4O@tùx"£dØä\n—Çmw»²,Wsñ~5µ1¨\ÜŸ=·;xø­õÍE#Fèó öTd|:ðWÏŒqØ\ЛÍôSÁ芦*Š$…|Ü „˜H–†1„f8œY>¦„‹®srÜñÌññcÏYG& ÑáGþI+yì´ï™SžcÞiawSvgÐí…£©|e0-+ È ›»}uó…Û{o>¾ôèÞÁÕ‹;³³õXÜ úaÈ‹:=J@“ JÂQ\`ñ|Bh–Âõb¸ßŠí/¦níVŸÞ\yÿÉÁ·üñWŸÿæçß{rïìöæ|­V’DÙ$ ?;ãb ‚ÐÄàL8TN…³†Ð­˜ ½ìL3·ºÐ¹raûÜÙÅ—7ß?zx÷úáÞa­R3㦠0^/4:árz™ úÜ4iÃOœ´ž8iŸt¹Ý0ä‚D†Lj½š«¢Ì‘…\*ŸÏšÑDÌÌæØ) HX‡ z=îUI{) +ïö£wZW÷Ú·Î÷ßyrñ÷n¼õhû{ƒ?üðþ¿üæý¿ùèá«.l¬Ì& ”ä¬v—Ó6Møì î¦ðnÚ·PÆÏ-™¶+›ep\ÚïÜ:×}t}áñ­ùw¬üá'¯þ‡ß~ûÓ·/\ß)¤"¸Ý防ûq:DЄ9ªèN[<¨Jï>¿þÚíù§7gÞ}¸üËÏïýËo¿ýËOoþæÓkÿòÕ+ÿûüöG?x|kíÜv+•JÞà€`%M¥œ‘šÆÎ\|&OÌ•™z†™o'{éå™Ô…­æ/ìÿþ·ó«_ÿðÝwÞ¿¹}fsHô´Ýæ€0*œt=sbÄc³„ù@L‚“ +æaÞÝÌ+ýF ¤Æö\ìÉýÝ—žpkïƒ×®þä‹÷^|áf¡›Ÿë,ŸÝ~ÀG+>·Ca‘¨ˆV£äîŒqï°}k¯¶7£>¼ÐúÅ¿úâé›w×Þ»¿ø?yúïÿüÙŸÿáO¿séÏ¿zúÓ¯í/¥UÖïuCV›Á@‡ ì28O?ÏÜ8“ûþÛç¿úÁ£OÞ¾üúþG/­üÝw.ýñ§OöѵŸ¾îÏ¿yåO?¹ýöæ­ýÊæ|)ÓS©THO)‘ËrQ)XcKeñÊZöåk ÏÖœ«~þîåß~ùæŸÿô£ßÿòÛ¿ùâÁÿüã»ÿßÿó§?þêÃG­O^Ùûå/¾ö`7n¨V{ðô¤Ïî¥IVñBî äÀ|6‰p‡ðéÙ<{~%w´VÚKÉûf?ûöóï<:xçɵÇÏߌ™qÂQ‰#ˆ¬ÆvÓÔF¿¾b¼scæû¯_øìõó?ÿèÞüÙ›ÿïŸþû_¼zàûðÏ¿û·¯_Ýã†Ìr’n$Š ÑpÙ çóøAO¸²d¼¸ŸÿôÉ™Ÿrï‹w/}üÊî—ß¾ôŸ¾|ò?ÿñ;ÿö»w÷Ã{ÿðÅÍß|~ëÅ«Ëùxˆã9`Bl.¿ø EÏ…ÕA†{aË|íbá­«µÏ^^ýûï]ù¿ëO_½òã.üîókÿúóGúɃŸ¾wögïïýêãó?|kÿÒV©”K¸@ù)4ˆ/öª+ÔR]¿´ÿàÁü߽×>zyó?}õ×_<üþ›çþö½ÿûŸ>ú?ÿý«ýÍ[øâöûý[?x÷âZ/ŽÂŽ‘‰I»' R*Çõò¡ºá¯éîó³Â­Ô­­ä jï¾°úÅÛg?~ºñóOný×úì~üä_¾òïøø§ß»¿³Rïõ神—Pãf"SšIv£Jƒ¿{³÷Ë/ÿýç·~ðÆÞ§¯íþô£›ÿö»÷~õÙ/ÞÜûê£+ÿå×oüî“kŸÜo½{½¼ÛS²Qeø‰I×ñc>»Ý`=Ý$|¶#_^I<8ª¿ygùçß»ÿ¯¿~ó?þìåúÉKÿôåã¯>¼òÕ‡?zuåÍ«Õ£ùH#IGC8ŽY1Œ³‘ˆYj6Ú‹Ý|7Ë÷3ÄѬðÖ­™Ï_?û“o_üñç~õùúÙËÿüóW~ýÙ­_ûì?ÿðÆùÅ‹¿ÿáÍO^¼v!{ÿl­˜C~XbBŒ‹²VÎEK1º‘ ÷û‘Ñ;‰§+Ÿ<Ýüýüú³ë¿üøêÿúOŸÿ¯ÿü£O_ÙùôK÷®o“ãƒÙ`/‘Š zŒX(2‡³úóõo}ñæù/ß»ôï¿yïÿü·_þéË—ÿîÝ£·ïm¬Ï—¢Kd%=«„³š–Ð.Bæ +¡ƒAáúVåþ^þ‡¯nÿÞÿãOß{ÿÅ­÷ï ~ðÊæϾ}飧»·š;‹ÕJ©2rœšˆXlXQÌL>OÊd+AïÌ&öç’—’¯_mÿø£_}öà‹·/~úÊÞ»÷7ŸŸyt¶qm£°Ü‰”³Àz0.?ÍÈEÝl°´˜ŽjIɨ䠤ÜÚ©}ühí'ïœýíç7ÿþ‡ÿøã—ÿõWïþâã¿üÎÑŸ¿züï¿|å·ß=ûÙÃÚƒýülQÆaÈîAT£’Ìô$ÙTY¢¡ª:2ó_™WUž\j~ç…õÿúïýùwïüá'/ü˯^û÷?|øóïÝùðÉö›÷Wç{E|¡#ùb[„hˆ^i%ÛI¢Ÿ‚wšü­Ü㋳;7Δ߾Ñÿõ'·~þÑOopwñÉÅÙsƒÌ\Q ó(C‹(©'3:áÅQš¡0åi˜Ôj+±=(éå.¬Tî­¿|©ÿôÚòËW—÷ºÑýNd·›«€\ŽŽ§ix~6”¤¥”¤åäP<ŸÎd£jFç—jÉý¹âÁlüÉÅÎÇ/­þæã ÿú‹'?ýö•ï>XúÎÝþ£íäÝåèƒ3Å¥RH% Áà„â=˜‰Y]x¦ˆ¤S¾¢N,WB{áÎfâųÅ÷ïþø“GÿûÏßÿ×_¿ö»/^üÃÅj»˜¦×‰ª>”ó{!Ô) ‘Ô…¢É·3¡¥Zôìbáh¥x{·ñíçÏ|øäðéÍ¥«[õ.'±»S6È¢™™|cÓH÷!,RT9iì®Ìß[n¥éƒ¾ñüa÷ý—¯_Ý›»°ZŸÝœI6raStUÃÙ¨‹x2´š§”\,ÓÔu“E…¡2†š1ä‚).6g*ÖÛçVë[ýB¯”îæÓÍtÌÔE’@MØýŒÅ+à|&—˹\˜ß¯2l+Ÿ[í•æÓ××ÓïÞ]øâ̓ᄚþã÷®þø+?xºûÙ£ïÞ[yórçü‚°¢yÕ((‡é¨ bà ‹§jéDŒó6Ld«>7»²œüìåíûûïüçß½ÿÕ'w>ãÒ‹W/œ© ÚI-¬ +zVMtP>Žò†åy!\-Ôâ +ŸÑ™bL̨l!"uó±v:<›ÙkÛ³ûƒR=ÊåÃ!3EYÄÛé“Ȩ0S’ÂÂïãP$Ö³ÉD!™,%̤ÊÅ$&¥ +SÖé Š£’\*u¡0Ѽ&Å =³0ínÂç'.”M•æú›síA9ª,”"—V+«åйùÂÎLv¥¬¯VƒBd®`tÑ59n³z!D%岜‡¾u|j|Òðø†I(bÙ ¥e¤›K¡óó‰'W¯^_¾»×ÛîUL–¡QZ‰ÔÂr®ç“ÏáÁIž49¤ñ¼ +iåR1—2Ò±Pڔ +«(‚¤j'C´<áÁFm°S-‡ˆ± ˆrÁ2#ÆBÃgy…T¶‚ø½†ÈŠe²ºå‘eñø(O€qú™I1î |L2R\3*븜Ây‚ £8R“A„i"IF³¹Ôí®Öë#èrP]~âø¸uÊKCL +Sl¸.Eª8·O:0¼-¦iI]3’Ñp9k¥Ï.WÖ»ñý…âÁrg±‘kg#ÍL,‹z ÀñQ‹Õ;œÛ~Ú<3æuRˆºx9W]KçºÃh"ž7øtOIÈF;÷àòþó7Îl,Î׫¦*ÓD \Š{)¢¢Ó‘OÌd{²í£dvžã#ýþêÁù»Ê[->’RÂáL*UÉå‰XžgUÈMúƒ¡‰iøä˜oÜN¹ñ˜Ûª4™PÆå ¼0äÃ'lÈ”ÎÜý8HÌÁÅ`\´Ù!Ÿ0 çòó”˜RŒKqÑV(Ý·Cß8i·y˜ˆàŒ¡D«|¸‰ÒQå@¤UŠ5¿Š¨‰x¢ª†¢8Lcx%Õi;zbÔã#£Ÿ™rRùÍño<;96 b!U55=‰ 4ã#†e•2 1Xˆe49¢…Ò6:áÀ…X7Ñ9TÒ}9Ù/öφÒuˆaÞcÍxíŒQ^A„h€”D%^í.{àSÞ ˆ'"-1³ &¤VA¤,£ä«sû´Ù˜ª>a8)#À§ˆ "¥[]ȉq'ÈD˜IÐZ“ +õ† Õé¯Üžô “>yÚ/ؤhÖ•dKŠ–#é&%'Á8½ä£Í—$õ*®qFUNu¥D“QSL¸äeSN<ì&"NÌð³I·e©¡‚ɇ ´’æJ8;«¥Ú¡h #Š“e=Á©™Q›ÇêA½x˜3ºráŒOÈNBôsSþg' )¿äç œÙµÃÒ„›œp ×äǹ8€ë@—D=Uì"¬î!†Ó“ )ï¥â³£Ê±‰áò×^2̆+±Ê\­ÙѨy]Íôõì`ÜNÚ}"ÂǽÄÅZ*nƒ57n0zôŒÅ'Ž;YD,&ê;R²ÏFÛ>.=æínŽ—¼’È«•PaY¯m¤:»¡ü"Ä¥¬AaÍbw”rà§C©~¸°fV¶ÔâÆX@;f%Ž[P2œ4ôWǦN[&ÚÑë»Ñú¶”Øê‰Q¯Ë/Y<â7OzNZP?ŸáãszaKJ ì¨1POÙÈi7Eð1¦>7 +ÇrzÜkuÓÊÂeNNMLCVGÆä 1|že ÈS^ÑT\tÂA˜ßxÖ"V‚JžPÒóëWŠsû^)…ꥀ”¥2gÖCÉ^ipÎJ„쨌)91ÓóIYðYˆMÓ±™\÷Üæµ·Ìææs.ʆÇØÔ²RÞ£ãX.ºpÝ2œ–¥¾~:Ñ1—e̾˜^¤£m. +º´hC4'ax¨(* É­0ÏšM?ŸTÒ3‰ú&­—x£Ži%*Þ3ZZ}G)­Š©J/–®R‘¦ Wc¸ŸšÅ# Ÿ\ „Š°-sçg·ïø„䈋´Á +¦”ݤé³°RòPf(Z+÷öÙXg¸–¸ÑöÉ• Ò¤Œ BtÜé^fÊK¹Ñ«—éh‘*vŸàô |¸FèU7e‚óÔ6Á5Bô¢7= È WK ×éeb µ'‚š7 ± —Î0©E¹¸!çÖŸ³ã.•(½ìÀ#^:íÂSN,Ä9À¥]XdÔA¥œœš““s.ÂsÑ– ŽêM2:#ED>= ó´{܆ t$/°Ãº›0œˆ £S6 È\)5+¤ç™Ô€N‚ré¹I 3:x¸É6Î=JwÏØéˆOJCàúæ ;†Ë¹Ç;ÃÁ6Åy5ß·Êh@°`¦5Ó3—Òó×ÍÎap¸l¬NF|z‘Ï,Õ:$äAÿ‹ Š+BºoÇ#6Tgc3je_Êo’Æp 2ˆI€ ¢u *©I™~´¾•hîÅê[zqÙ(,ÍïÞ'Í©™½£êƽöÎóõÍ{±îA¶‘7šff¶·}ËNE¼B +„ŸY‰Ô÷ÓýË©ÙË‘ú–—Î9eÌ6¡7‚¡"ˆO2Ñ£¢Íæü…Áþ#ʨŸpà62ª×ã‹‘úTïzجd —B圕˜<ꧪ û™,ÜtRÎÌ«…%Ÿ`zX +¸Ñj“[t³I'¢UûR²Ú;q>)«5DkSñ®Wˆ¹aI2ëB¼KjU7¢ÇÆfµâz¤²)¯O{eÆè°±9*Ò¿å âS¨qÊ%8É„š_E¤Âi±q,\£³T| 7¬¨6Ü55çò@AýrQÌ.ãF‡K/`ÑžL0±Y½¸6îa©Bt$ ø~15u„JxȘìÛƒá 7\¹Õ€lêå LoMy˜ =í ¼º÷ÌIë7O9žµ*Íš3bjžÐëÓnÎêi ¤IÙEÅœtÜÃ$@º±Ñ¸ÐÉæ~¢±Á/¥ðpEÊ 1A†ËT¬Ã 4[áâbvfOH¶§Q…Šµü pX)Úج[n@b™Ô•Ü¼ˆ€îe³Rn93wµ»û¤¸|ÛÍg€Idú3«—íLÜì™ JU.¹h´î9&Þ–Ìr¸¼ˆ5&Ö!JM&ÞÕ+jaÖòrvfñ“ÞÁƒá²Qõm.»K ß í­™í;c>ŽŠÔíƒäÌ•ìÂõøÌ@RQÍ/¶6ïÆ›;68¬Vz[wk«×J‹Wûûøì¢OÌ"_ïZ‹ª `  iÍÿŸ½÷z’ãÌòÅÞâƒbuµ;’h´­.ï+½÷>³L–÷¾ª½7è†! 3äc¸cÖÎîÆjºÒî …¤½éE/ú¤“XÝû "îƒ"Ôq£¿)b€î2y¾ïœŸÉÊüÎõ¯ÇW?6Ž¿w¦/0¥ƒÈUÀmΟ¯fåjRÆH­]¨Í+{ð¸4}œ]±2uFOôÞØØÕ§yÚÞÿJªBbTøâH¨îk­c£{É×NãLp³›Uß_\~Mê­aC^iõƒòü•X?eë'¸=KÅúä©Ý< +¡F^î¤Ùªö´Î5z.ÔÎÒ|³Ô=¹~õcŠ)­¦„¼ÀÅ„NŸï~ñGΛ?{÷‡ø—ÿµ6¹^˪QªÄûûõ³ŸŸü¶}þÚ>S^yüÐ)\0VãlAme¤&ä?euob+M8@1iÊÜLÓ€]«Y5„;LyOíÞVv¾úxYá9ÖK³å4íç¸j^l&¨JZhj­ oü$†á`÷­"7P­ëŒž¢JW[¤5`Ë{Rý¤¹÷n|û+Úí;`ºÆÎ3HªâèR©/%&ø³Öák«wÆ—gtqfv¯k»ok{oÎa"´WëZë°º”3æý¾v†; ˜ðþÉûîáKÀm³} 8&Õöo!5N´Þ¹ìÏv¯Þž¼üQmî‹Ákµú~ûè«áãßhýk»µ·söòÏÿîj>KJ>]Üñ—oº'ß/~Q[>E ÙÅnV®`N/)Õ8gtñýÎÓß7ößðþ®Pšwß2¥9¢wÅÆIýà­Ù¿ª‡Îà‘Ù=]IQœsz{ÞàPkdäjNåjp½ýñ³_<ÿõ”-ªsî¢øíüñïõáKÒ[²VÿýÿRŸÞ¦èçÍ7ß¿ûÝ?¿ûÿÛyù;¹uš“šš¿óãßüFã`#§å¤ŽÒ¼*οìÿpðù_6ö¾¢ÌÎääUu|±Y“|…*íÙ“W‹Çž}3>ûZ,/q½ïÏž¦˜JŠ)‹þžÔúîüËÿúàÅ´Êìѳo{OùâP«-ìîik÷óîáëîÉWÞìV(Ž³Gð9° ly¥ $Ä +e¢wΫ;/){€ »ÊüMóøûÎå÷þáWlyê5öŽŸÿèOsŠ¯·O˳Ïwn~¸}ûW7?ûÇÑÅ7Nçx|ðbpôR­í–'·Ý“÷åÙóÆÎóÛïÏ¿úËÒøx°÷lqùÚ:¼Åí¢5áƒhwit¯¹â\ñ§ã³7|ež«×è\ +€Øµ£îÙÏçO 9©·ÏœÉ“Å“v_þ¡²ÿŽ,íÆùjŠ«¨õÚî³(-Kµ)éÍØʘ7y"Ö÷As®§y\kËþR¨ŒÙÚ.Û¸P:¬Á;¸Ì ¥<ïÖ§×JuÎ:»wÜ:{WšÝ–'7þü™?¾Í‹>à¡Õ¿²‚U>4—îäs¹sÊ¡º|©·c„ÙÞý¼wú^iê­S @<Òy½‹Óç¿fœitvýìůþÛ“·=¾ù¡qðÖh‚¡¾~þ׿þçS*È §sÚ;ùº{úMçômëä}Nj½üæ¯wοB… +e´ZÇo§7¿_ýÐ>þyÿò7Lqw+g0Ö Ã•Ìî¹Ñ¿R»çt9˜`PkI9ÇÕ ²({ºš ×ÓÌj’Ï‹mÖ[Jå]Ýß‹£ú§›9ЄPS¤=CõiŽã$ø)ÿäù³$íæå:dB–¯‚êFµãNÍî¥?{µÌ[݃³—•Ñ "•Ôʼ>¾ÿä7‡ÏÛ9zctŽÄâŒaÿì} ×óŠ/×wýÙËîñwÕÝ7þò¥7¾‘ËóêôdˆÞ>).^º‹ÏE(wR›<›?þQïžÔZûàµ?}<9}óèËß.ÿ`uO”Òd÷ôËÉÙÎú£Ë›·}ùÕßî}þÛÅÓ¯ÕJ÷Ù›_ß¼þ]N¬¤yŸö¦Rmr 8{¡v®(gêÎ^üðNï„biüXë^Ã'£÷çïÿaùø7nçüâåo'¾¥+kr#v®©Ê‘Ò¹ñ&¯šï¹Ê®àö^|ûÇéù7ÁÝŽrw¦„7gÊ ÒÔ§Ï:;/N¿Ÿ^¼ÃÝ´¥ÞOAI* @ÚÉõwlªµÒèÜ_>ó&{_8ÃPb ~* ÈÒ›Œà³¥IqöÔßýÒß{×9ûeu÷+µq ô웿º|Úoâ*h°;¾mì¾.ŽnÌÖ(XÚì,¯¿Ù½þÆëÚïËõ}»sRŸ^]½úÝÑã_¤hOõw¦_/žþÚÝ7¼×„òÎí›ßÖÇYÒ îxÝ{^?±ÛÇzó”©Fi«`JÅIž/ÎÞ¿ý»ñç¿óv^•—/Jóçlå8”·åâ|zü%g²´Ž +¥4]&µ6Ögÿa”ÊОà-rBm-%%È2ïíqÞžÞ¾s +¤FÓÚ©™fŠ´Ù 6'ŒŒèãfO³6¸4Z‡Lqœã\Áî‚”²{§åéXY€ƒãAö‹Í£‡1D8¤VûàËÖÁ{©qˆ™Ýhr£;Ø%—'¬Ùî|9½ùæ÷éowžý¡sö3®ºÈËþàô+ÂIã+µ9[ÌÙ©Œ.ýé#®4Æßi,¼ö¬>=õ†çPÝLq*»þðÔhìnåÖÁK²r9#—äæ¾Õ¿v7ÞàÒîæO-ž|ýwGoþÚ>r†*€*µ¥ìö/ß`z·qø¾º÷µ;}QÞÿFnß@E0£ÒÚ¿~ýcmvýiŒÀ´^àÓw^YÃGV÷¼Ø=é/nÿ·ÿòíïþmœ«¦Åé,´îÍøæ7Gïþ©wý°«×Ïñÿô¿4æ·Q¦LûÇd唪œ´Ž¾üâ•åË,W²;GfûèÃî¾m«˜Öå½y ÐéůO>ÿ¾48]œ}e6YoÊ—±¥\`PžÍWjuGGëvG££/ç—ߺƒG„1`Ì~}ríuH£+u®¼Å¥å gü84Ô²L±4ºÊ +1L§ì±Ð¼p&¯ñ3ÊbJ£sðtçÉÏ€MV3bŒ´IgRš}Qì_yÝ3µ<\tJý3Tj…ódÑzZ‰ ."µ*£Ï›ËwBqQ]ùPDL%Y ¢´•7’dY(ï9ý[Tî€`*3¨»㑇™g‹ ¡vXÐûi±†©5±4ŠÓW•¦·ÎðÊê\‚«~M–ç Ʊçjç8θ˜viÆxÀ=µvhw/Áªøb{÷ykÿ¥7ºRšGLe–Ó›ˆÑõ†€å JS›By.•çåþYurivŽ"¤Ië »³‡(oÕ^¦º|˸Ò€Œý}®¼ˆ‘ªP깓ËöÁ«éõýóo£¤‘&4­4œ¼|+ìÁ:³ÖÞóÎáóöÁ ÐH¬Ù—ý=Àêõ UàôΞü +ŽÙ>þ‚nd£qHèPžÏpžÞÜ­N{‹«‹Ï¿+÷ŽÒ|Umœë­kµv 6,fO­æÉäìíe…jVlƒ§åýŸYãçJãXmáÖ ûÁÍwé5Øÿ´PÇÍamþrçñŸOßµ–ÏüÑ9¸ˆßþÍ¿¾É*={ü¤´l«^Ý{å®Q©±8|ñOÿóÿþê×ÿ v’r„ê‘=xZÝySš<6šze~þäû«7EÚÃœR/˜CÚ[ªõ®¼›Dn{­ýÉÙkÂêåÕANîÆÈà´ë jó›ùõ7±ÂZ=¹8³ZÅ׳ӷ¤Þ æEµ8[žCi½‡Qv+£‚Zë¼/Ÿõ+È=§¾ÿë¿úï½ü僺c|7¦ÅÞM¹w ¼ÉêMµy. f5Ï•ÔÚ’²†Le¯`Žio^}îô;ƒ+0¼àÇaÝÁg¨ÑCôåÍ·Ç׿›ë92€$¤;òÆׄÙ+HuD©ÓV§2{Ây#€)£}âN×ö¾ê_þpüê/[G_”:ëö­îQ5rl‘A;­OX#¦8ÉI%»1Jãå”vŒ*Åé"h*pÖ _ {o~üô;±<U,ø»Ró2œ1;ÕñÍòé¯2B•ÐZ´Œ9€ª÷gf÷8´Þ«HåiN(ÇP•uvc§·¼Ñk‹õ´´––#¸ƒ¨àW,‘’§V&•Éåôâíèâ½7¾ ÊÈÕýn jÓî]ŒÎ~¶|ò{¡q™dê[YÍmØÝ“$WÜȉ[1N–}¬6/´Þu”0³¬×?|ø•ë9¡ +V×=n.^W&/Áf„¦=¸áJs€‘ëÁó3„Yëžœ½ø±wô®T¾ÀövÀL]f¥F†AÕíィ ¯%®w/«‹£Ëï¼Éç ¶Éëvugpøª˜Ò\yÌC§{ÞÙívN¾¼wöåhçöÃNÎfA®Ï^ülzý=¦vý’¸CJ-BlF fšò¢˜•—Re©ù³r{— î&S%ÿÀ›¼HSÅhV Åé,f²ŠO»SÒž Z׺v÷X©‚€yÎý•[‡ïÁŽ)£igH;ØÎ](kƒ=¼ÆÞ»HÇã·\y¾™’"j3¯6Ùê² ·’À³Vß\€ %Í@_kÿ ³¡uN´î±;:—šy¥ö_mŸÄq(¢)WÞ«”3Ï+$ïC…¶·Þð"#Õpà}¡©`d@û¼ì¯6‡ç_§ØXwÿeuþ9È µvàö. ŸSl™wRqlÇ'Ô„ÊŽPß“˜+¨ê£rŪíõe¤ÀoçX°™kI!'¶ iî%©µ±¸Ø»Ÿ¾à"íéŽ1kl%•—œ3ŽašäöÜî‘V_XM8콌܋áàÊ«éS­y*HYÖAÅZw)c$U ú ‚ ¨Ïg?€S^ ã@" Wwtòíàä;±~¾’”¨EÙ“í¼’À­8f"‚êB+/ÜÞ¥ éôJ½#R«æ7×µ+VvìΩÚ80Ï0NexV=Õäý=ª´³M |t‘TÙÍsÞìv^‚p…‚BÕN°ßf쟿-¯YÍÜ®×=¨ÍõϾ¬-žFPÜ"°!£ö8½·²M‡2*eœÁukï•VÛËPn(-ĺۿTkûŸm!kQ"MXpÀðP'þâK­ÿ¹ÖSÐÉrc6h³ª…œI^ë'ŤëŒS„îõϽÑc SgpËg¹g+aDÅe?Ë{Ànõ½7­Ã·ZóÚh1ÞˆuºÍùm{ÿ‹œTɈå¬\~?zñÛ«wì_~'µÏR´&Ô<ÉÉ €â4Wì2[''Ï~58za¶†0ë'( tíÎàý«‹/Úg¿ÑÂêõæôÂl, ½ƒ(mH*Ú™(þ ÀµždI£Çz3–¦¶—kaÂÈ •úäF«,V¹Û™í¼<+¶òz?#7aY ¡ìÕwA¡måe®¼+5NÔÎ5ˆº,¼1b`{fW^o?EéÎÑETí[Gjã –u³ B­™@zg-%Äp'¯ô™â^yô¬¹xUß>Œ³˜Pm-Cn‡ J 3ã¤,)ø‡¸=ÁÌ~,/Žöž×F—iÆKÑE~ ³C9…³vó`;˭ljÝÿ Bn¦8?„~ÜΉ×9MQnÿä-¨MoúDkžÁÎœæVŠ%xϪN!çS„EhÁÎ?vç"ÀÖM` +£×æ§/+Ý]J.r^?Å×(gfu.8g†ËíµʽÓæòñFZŒäµÍ”ø0Â@êš­3£y’¥‹±¼$w{u¶É*¼7 8Åîg8‘ë€]PJ@Oð€Šjbý”òOpw‰ýãÄj³¹EÛ¹yn?—êG ÖÚFø¨èʈ³:´ÑKsPàf÷¢µÿº}ôŽòæQ lo·8¸¨/ŸîÜ|»÷ø;gxI8£ÆÞçƒË¯µÞùz^¢w{·B ÔÂ!_™!Z½þÑ—¶ « 5Šó×Õå ·(wVP:Y¾Bª øÄc"|I,íؽëÁÉ×íÝ×re'Í•6³"eIxØ@Nðàjë p 'Ô£¨™a‹ÛqÜ4Zgƒ¯ê¯›GïÉ‹¬Úkc6vº¯õÖ19\٥ܹT=„—Ýå„R¥³wóæ·¸ÞÝB °á„5ÆôžÕ½¶Ï€g63""6•Ê>cÏ{ªÔNÀ§¯gÄÛ)Û¦‘V7Ö²t©ÀWygŒið§[-MšÓ“—Åþqœ²d§<}fu/dÿ~¼•S? ¡kqš·z«Wjnÿ¼}øöÑwÿ<½ý•Ö8\‹â9Lî,=ÈL€Êf‚Hc@ÉÕÍ4lÈcô¢˜ þY„„¤…ßrU0ë¸`ðV³;@|09[iþ§ëÙ?[I…Ó!Öy«CÅP–EÄj ƒ-óîŒ÷f9¦¶çH±BH¥P’Ø[qžÔ€C¥¦{e”võÖ%ˆ@«IºH;c¨N(Ê™ð¥§÷È=•QÂ^‰ÑiºˆHuBoaFG®í3¶8E•j|¨Þ<¥±TÚ Ã]»}*x“H^ͲLÈ3gô¤2ý×[€¥¨\ë|Áz“œXÇôa/BDI† ¡Ôúz¬ŽÛÜUÊc«}‚êPA ¥YÉjë¥i,¸iÎU«ûœ3¥ô~ŽóSty=ɯ'¹4£ÍáfJÊ õ¼Ü&Ì ïX^¬¿'Ã{H­? öúãÄKK)ÂK f(+¯ÆÉÊàdtüêŸnð„p8«ƒ µxA]3Ÿlæb=»ˆÜX öç¤Ò¤b3Æ„=‰Æð|ß6ª2ÎìCgÀç[©{¥½mÔÆÔ~‚0㘌+~}ötïù_4¾eJ‹Pps¢Š 6¡ú¤Ù”ü…Ö9'Å”vAJ „Õ µÊ—&By +Ò £Ø>aG`¤”ê“ËYÆ 8½º{ýíâæWJç&I• ©Fí ëæøŠÕ>WªG a¬þc¾|¤ËITS¼!­U7SDŠ2Yg’¦*¸ÚÑÚ'P˨ÒdŒfmz‰kÍíÑö˜/Bʽ*.^°„uŽ?¹ʳi ÕƒÖñ»Ùí¯‚o$÷Þ0ÎMÒ•ÿêa„VŠ‚„”By3N—LÔEmr£û;)xjøzW %ùDÐjÏÐ¥-Üù8„n¤˜*ƒ *{ÅáãÃgØBè7jó,ŒjMbqÌ9C¦¼Kû‡| ¼ÞëÖÁ·A¿!JWʹ2ÔB½Mºº‘3Œò^{úÜGš±P¹„]pp½£wnÿ*‚I›Y2/zBe)ùKDòüy»[Ÿ?n¿ekû½›f+¨Ò¡iŽs¡‚ŒæžÞ½‚7^2RI­%Wq½ôÔ;FçÆè=e‹¸ÒÜL‘Ÿ„2iÚfÝy¤`ÆQ›ÔºryÁÚ½:×*SÀ4íÒöä aöÙÒŽÕ»-M^òþ1Ìm‘Ã9vïúÛÊøš’•›q¶–æë¸Þóú„Ö(Hµòè¦uðº½ó¸6½aŠÓ8W-¡ûK¿&Ç›i6›QÄ(HÂle••µš`µò´>½NF(ØÆÊfÜiÿðíàä[Î[ned\®Ü|7Øÿ"Å”0­¼©7NôÖ©äïW#¤yµºtû§i¡ò ÁFI/¯ô8À={†q%J(ªNgzöF®íF©âƒ¤XP»)®–Zzû2ZÐ6£„櫃GÏ¡¬òéº!ÓlÀRk-ÁfOo'O {Is€H­(fo@|6IcEJëÉ­sküXÅWÓ¸ÎÈ› žS{ÅÖáfœøÉjê³M [˜ØH‘vš²7Ó`‹1Ò½ ºÑ* /›;O›»ÏZû/ŒÎ1¨DLiñÅ){xøÓg£‹_¶¾)/_ƒbP‹„QÏŠE¡²«unÿ\n>®ÍÞ´—¯µÚAW±ÄyCD©Ä +h‰œàKåùüê‡ý眲•¨Â˜M`RÚˆ­Ó‚1(N^Ô÷ÞÖ$ÇÛÓK»¹›`Š1Ê‹ÅœzX›½¬Ìß`Úæ8sxê _z?˸›)&…kœÙŠcR†6rà˘cÆš’z7Ç–dX{”fJð+DéUc +²Z»¬ÝyÆY­ã´N‹ƒ½}–eý a"´%XMѪçhÑ•î™×=ñ׌·È)ÝQv;Å Á%U¥Í$˜†JM©´”ýýàÜ%çÍ¡r#¨…+­ WÝBLDàöLôÀÁ%ÙJQV8¤¥5x¹†;sÒ]ÀñÝË-Dý,B„ *,w–¯äãÍqk„^›>qzW|iŠpE°c¸Þ_ÆÝõŒÇm©´vÎ ÕU^Ž“iM¥êéVÁŒá6#"TX½¹¦ƒÝª˜ù*ãLÀAQ„²j–¯ãˆâæf†G”®X9(M¿Í'¬•͈³ýåö~–4c5AXyÆ+0.<¶ãNÉÃÉÉoþâßòF};§lç5(FÚÝËñ Ær\$˨þœ1;‘¼’Äí¬2 D¡4Q®I3ñ¼„)=Ò™QÎ"'õ7ìV‚ŽdXN«&ÿxÝÊ(j=¸"Ëì^qåÃõ¬ñ“54­v•â"œ“ê®äú8A¶ ª‰}Öê™}R©›Ÿ°v |J+ŠîX­îY­#©<ãœ>ç¶Ó¬´Ïˈ„ÒIúC\«aŠO[Öñ•Ý<ß@ÄëNÕæqïô›ÁåZç2AÙðXÄ S L맄@S°£WûH,MõÚ¨0òy­›–Z8Xªö#¡~ +œ•„ÒûÔ‡‹ú@‹BÎleÕ4]Ë{¸Ö^ åCq’1ÛÄ õQNh‡ +vuòb“qç)®JŒ)îâöœr—aÊû8Fý4F„ +¥µ³”0¶R™ƒÈëÇTq'-7·W^ð‚DzlY©ÚýÇVûb|ús«})Ák ¥4ÚÊ°i.ÅVq}h4Ïzï¸ÒA‚,m$ùfDm#¾BÙS¤{õ~3V£d¤ Œç¥*øÁWÉ+ÐðBi_oœ!j÷AÞV€%,”jýh«`€4båV©y@l4+‚ˆä¤Í³•’Y³Z~k¯9< +¥èœÐk|q'ŒXk þ'«É®›FÝ]‹P˜X+u(RLnBv=ØB>YMa\‘ºéyÛy=†XqĈå ¿,í%g5ÆQj§>½Í å¢Â?Æ¡:j¸Ú‡?Wã‚[ßùò—ÿdUw?ÙÄV¢RAn2‰!RŠ4Aí"|² ò ++Á>½FSô†¬ÕI ú3£y"”wƒS.„8Ç“„ÇUàDª‚"JR.*‚–[¸ƒ«òäÆœ³Þ(Ø„M©EQ r;Ž¸Ò Þ„/- = "õc¸•ª¥Ùzï©Úy"5‚î ˆ\*u ñ[6[×Jý’óv¹â.iƒ cÃX3»C ±¸«TÏsï (*×Nƒ¼RëZy¢%Ã70kžä;ˆ:TkÇZõ(è8ëNŸ‘F$n/+è\¯T`3“”µžb8{h|8' É–—áÀQ)ˆ—w·ó|AIÐGäÀi‚*­¦”PÎ@¤Žê²Îx¤QAÍœæ*ô@m» ¯§eDí¹ƒ[³}ŠþùËç—?C´AVh!z?Æ”7òZ· <ÃCUô÷ 3ØÄ2‹Û@µ@a+ašÖzÒ…Ê3E\îjå]­´$”¤újœúÐÚ^~ίGˆ””Ûp„` +(€DÌy°M´¦7À§+Qv=Î…ÅòÈ6ÕàrëÏÖr?Ý@Ò¤—À­Í¤ø0LßqÜc‘èNr´·Á7SÜfZUF¨í,S‰!v +·¼Æ²3¿¿‘ÒHkDB‚.ÅH7ÉúÊû,É­&ÙHA¥Ñ8äÜQž/Æp@W>’ãQÁòr‡Oôö5¦õ ­‹ÊÍPAûd{g⸉‘—êqB „뀵Á>ª¶I£ 0a­&¹PN† Iƒ“*yà¨Ã˜C‘|q×:ZóDªîaZ7+øƒPeàŒÖS\Qh½ÃÚCH¶,íbB°§Ý< EJ‹ .7€(pUZ›ÒºÀ‰ð[BmkƒYu†ÏäƤ¥Z=³œîVëàßÈšá+zóL®Ÿ¢Zœx”°$©á JŒv´ @E±b”Ý^ÛÊé«q@Ùlì Jt;§³Þ®\¿ýc¥\9\Os€NÀtaT_Íð„1aœ¹Ò:©.ƒ“! >stream +ý”>’*Gy©¢¼<_µ–àÍKÃ'Zó<Ã5T5JTÒL}3«EB ;Õ¹ þ°ÞÔ5è.È:½}Ôf*)ø” » €fH3Ïy”Ý«;åñ«w Ú&Ç•p¹F)ÕR÷°>»fÏÊ-@ Þ⢟¡ ¥¬ÖÀ1$—ŠYÆÉrÀÈCH• i…R)×´òœ3º¨X¥@°I-0zItu4O ×I­u!U–DÐËlÊ™ÐÛbyžbKàÇÙ@À?Rš§Œ·‹àˆ8fƒ=`Œƒ®6Æ”³Ř«\i¶…ÿæAP«zxj#Å‚Œ§__¼l,_ex?AZVëŠ"EY  +6³Òv^œií½^ý‚¯, R£4z +*1N{Ü £€ÛjBÀ¥ºToð•As(µîxa=#­Æé é Bm-‚ƒº{˜•:¨>–j‡ˆRµ¶#¡¸à…[)¶f¸1G¤^Žo±öœë«l#Æ$PëÓ-@0é\ií«Å“ß]}óß9›O·ˆx^‹ôÕ( t¼.³Gåv±ÿ¨<~L™ýÍ´ÔY<çÝY‚(näôMÌKp R–“Ówo~übàªØj’ñ¥¯5.hk +Äñ¡[G1ÇW3¬O ¦v âTpNƒ2{àña± ´·Q˜…+ñŃmÄ]E-ÐT ‹8wôŠ«MÐù Æ㔇( «{F»ðþµ^L‘.—ÎøÊÑi¶\ý[; %Í>— Îe”2®øi.øîÆîžëõÃ4å%1ƒÕ;”R"üj8É1qTå½Eeú ÓÚQÌØJ‹„Xe”Z,'FsR¯pÞLï\I“ _Þ +š,[ Kã¤j­ŒØÃUv*ÅÊ°+J˜´;2»jãQPtàFikÞ-ŽHÛYŽµÇvï1¦÷ +Jƒr'kã'ù$¢³F'’¶$øqø\@~·ÿHñÁ)ƒrs½î!¸ì ë@mB›0ƒ/ã†ç_Oý`Y×ì¿æœÀråXè‚ØF…&&5¢ˆÅB΃ŠÛJ  âRHB3/6â„óÓµôñ£×ÒÒfNM€h'ì8Ì°Ü5ZgÎçT±¸‡ÈàRË ÌÜΈŸn¤>ÛÌBÚ¸¤(Tœ5¸Ýü¦vð®4ý\¬†²æÇëHš„Ög[X5_d¯<|,z DnËCÅ ¿RÊ» Íâ´OVÏê‡ï.ßÿñùw<}öC·2`ÄÄFAlRÖ(I—@3‹ÞŒu¦”=*(Í킾‘ÕC@¦LU;)'aÜ̈ÕħŸ ‚SÄA2eLn¡r=NÚ }ó\Y+ÍkãHÂ0f£r#„¨ +B SF¸69”0¤Kïb¤@¶ ~AéÇO½ÉXb(· eÅ15NßV$I'Aó˜…%kO?‹âkqÊ9ÖKÒnATëçÎà9D´•dW·±|À›¥ Ó„\+èÜž0Þ’´FQÂØÌ0”Ýç+;•ùçîôj 3 [ ~•—*9± D–bËlq§8}Uš¾¸X‰`›)>ÇUÒtоtWš«Î2'4ÀêÚ²‘ÛŒ“±¼J1™à»Å6¢tÒœZŽ÷†)Ö¡Œ–Ý»UçrÐø²i5ðÑI¶È9«yA5Ì’À§ µ’„·•’ƈpNöÔŸ>L%q“µ”>ˆ‘åµ´¼–× ú§a”I’tA‡`J—²¦¸6€uYO²k±v„ñí ™²•þ¡Í&vo7‚Ù´3æŠs`v0§ŸÆè‡ %Ãw(½£V¦je²ƒiô€4aY×’ÂjRÊIuÊÒÎT®ì_ƒ–“ªÇry‡3»8[ÜNó ¦ +¹ Šz« ¯e$x„Q“³GFë\ï^ÓþAFîmƒÅH×ÄPUÜ'œnN`!€—!SLjd» }Øq´‚·ò>¬f|Ð`Ñ¡ˆÀeÄ:Håd&(ÛÊèÙäæ÷•ƒ÷9¡o’ WF!dÛ ®õ½¦Šó,XP¿ˆ†Ð;ÏUóB-Ï·gŸ+ŸÉµ³¬PßÈ€„@¡À½ÞÙº¢EœÑÞ$1Jk=L²`ü½þ¥=x’Û‹Êø´ÏÅâ$MêY®È:£ÞÁ—ÓË_Î0LZÛ¸FY=Êž„1+ 5•Æ¥Ö¹e‹û1Â}A·Òlšöd‚+x© +”-fÎóJÄ«·Ci¾À•Áì·vžØ£G¨9O1pœr’0I­•$Í8vFæÝIeöÜ_¼ôç/Ó| „.袭tN£äV +žã2Î M»¡ ÿ0ŒoÄHì,Süd3¿c€)hsìEHçAœ^cˆêIBÛ.éÖ“ü§!2;ù€€Ê ר]àj¸\ù|‡˜3¢x ÐOmœB¤ŸE¨¼P·Ú—FçW\&pôíJœØH3ïÇ2Ò'ëùHÁ´Z'Ó«wîð4«%_!J¥ fÐð´»pGOëË·I¶–:y€J¡¹Ykia-Åç¹J±{ÙÚýªsü3y¹U0Wà#ø8î»%9?#·io²TªéI峚!-³\÷@ªÁRnfe`Ÿõ4¿ý¯xõá^@*©ˆX½©^;B‰“eðÝvûŠw¡TË D`Sªíæ~Á(­óÖéZç&ò#Ál$¨$¦qÆP©¡jrç ,.gA¶ÎeaVe8*­qÄzS8’¼ØÊòMΙbJ3Fl•4'¥éKoü9í.³BÜ1*ù¬ÝÕª3otIgÎð¶¶ûª¶÷aÏr¡RÌƱ;xœ×F)®…k= œ‘ebmeè«?+M_ ¯~Ãú‡[±RëZÓ|¥±dJûˆ2Î Á’$å­'9ˆ%VP¾Èºl\qD>© H¥Ê(+Q2’WÓd1œîs 02h{L¨PÚŸ†ÐŸÝBc¨ é‘d@aÄYOBX·HÙG¤jZ¨aî²¼üªwò­Õ¾bŒ!”ç ëËÏ707 +€%í%WÞ.ØB4È„<[±ë{^ûÈë]ÂÜnfMxçí‚äõ A…0--6ùê‰Ñ½âkûàhò/ô2Þ©ƒ7DÍiVìÂßWÓÂVNJPNpÿBýHjž)Í3Ê胗ð‡y†U Ì1mÏÀ›SF—ÒU«\#í¡7zÔ9~;~ü;º¼·–‘AN„Ò,§ÕqÉ¡Z('׈þ¡ìsÎ|-FlÄÉàô j€5ÀõVœrÓ„ò>ë\×9ðUÌ}ã‹‹´Ð·E:;´=Áå:®T)½!×÷ÜñÕøâÛÁÅÏÕîUŠoE‰"¦€Î™ä…JAî1înÐÙ³²›‘›Ûˆm6CÙ¢7Q‚ëuw³j/ IH•}ÖŸâz³:œ'Alx„ U‡`NST)‰[kQ,MFmG©îñåý W¢n¸ÉYÈIeJ¯¶ö_p•ÂœØ$\ #ëMpc%`ðàÒ¯âB¬“æ(F˜`Ó´ÅXÞmQFÄfŽë»_ËK8ÚWä%Êæ¤j”´ã´+Öv'ïÚûoÔÊŒ”*Æy_œ<É«=(¨(^›CÙ³òä©ZßÝÎI‘¬’"JœP­}&ŠP,kI•ªri§lÜ#Ú„vvš;ïL +b#Çú›) ª‰«·ÑT£Ú”q$oä7Ó<®v@½¯gԌز†ÔÁS{ð dɧÛħ!èÌ¢´bt9 zX +¥H{Tlx>ˆ@4Àª`ý¢cÅ}<XáN +³#ù`Ó€4]*ˆ­Í”¼"dH…PÚÁ½B%†™Ÿ…q€YÀ[ÆbJ+ãݪ¤ùêjAÞ¦œ­à¶îJN ÊHñ@ì¡R€LPZ¡¼õ0!‡ó€0Á…7rã(#ÕAy¢z7FÅa°¹Ü¹ŒQ•œ#Ýx°¡—å}8BÒÙ§‹'¤½€÷IQ6*–6”êq÷øçz÷’p&1Ü^ψ°),¹*h W´Ö7zÉûËD°5„ú$ úJmE)g-ÍDp›-7UåÅÊO·j0 @–‚¯™R˜*æ•6ïïçµîƒ8Ÿ¦+á‚Î[YÎÏòxyAéªÍËŒÔYI !(êòŽT;?('¬ xbrFK«,p£GXÃÍ‚¹’ç¥Ô€,£ÊFNýEkïÙøâ½Ú<ÜÌK "¢ˆÁ[#«y|ÉT¤òžV? ®Q/.W“ÌŸ®DÃ9S;P5QºDzjç©; :p¡r3ŠŸncQD…$QAô‡Qú³m7Ú— âŽÝ:ùpI»‘3&>KŠ°4BBqÁ;cøhLëD)7J×Ö +îZÖÊKCgðÄh$p3rm¯{øÕâæG³}Ë´cWý¨ëÌ4Ö3 +®ö_þƒ¿ÿ bŒ@«¯Å8Bí;í+¨Ùÿâ϶²šÏ°õÆùoÚ'ßðÞ ŽæS›¡œÊ› ò +@Ùó£Wÿ(×Î {¼ ºš.EÈbœñÓb7/¡vR´/•f¸V ç¹-Xñœ™¥ê¬µô§ŸãÎhQ”Ê|pü>ÅWsr3#×·©"2È6Ê™!J3è +M¹µï^—gïäúYš)ƒÊkt•òœõF[˜û0k%™ï›íg¬·¿šBy-¸)²÷Xi^¥¤Æ¢md%”¯FPýA”X‰)Ò•«§z熰&[å³(Çmx<ˆÒÌÁ¬±Þ}Ô=ù¥¿÷Ž.ï‡0˜@›ie%Ân«{IÆ*GóÇ(Ï^‡IÑÛfû\k]1î"É×ròZN!Ô®T\$ˆ‹sI®…*ÃòøEçèçIªüñÃ\(-C:´.¤ý§›øfÞˆ’EDƒÙ;FÄz¨`X½GóÛ?ø‹/…êÉzÖþ?þÝÿ¿àÿ«qÈ]÷ܵqÈ]÷ܵqÈ]÷ܵqÈ]÷ܵqÈ]÷ܵqÈ]÷ܵqÈ]÷ܵqÈ]÷ܵqÈ]÷ܵqÈ]÷ܵqÈ]÷ܵqÈ]÷ܵqÈ]÷ܵqÈ]÷ܵqÈ]÷ܵqÈ]÷ܵqÈ]÷ܵqÈ]÷ܵqÈ]÷ܵqÈ]÷ܵqÈ]÷ܵqÈ]÷ܵqÈ]÷ܵqÈ]÷ܵqÈ]÷ܵqÈ]Ýÿí?‘a­ü'2þó qw(ôŽ{U•6X5×{½£ãÑáGÖG{x,Ìdz½ÝÞáÅ +?JÆÓÙ•„7ê-WBÿúÌxÒŠ}8›Ìvá‡ÅAo9Ú^‰ÂSqøï£äJj%ùáÕ‹b$‹Ä3H:ŸF²Ù$’_)Ðl<ŸD +hA ™ÔÊÎÿã“L<—Kfr™d.™Î¬,ƒ'àgYEB6ŸÏ“r^…¢©š,þ_žôû¸åÌ1-?š~ä´û‘ûºÚ^©ú;úèà?— +‚û0Òl9Âþõ¯ÜfäÿšLxL€üQBÎ#OæVªÖG•³¼CìÃßàX܈ɮ´VÒÉÔJ*™^>ýzAðËÿ¢ÿÿÈJŽ1Uøp¸Ù•ïðÑÆƇ# –[ÉgÐt꣪úŸeØrÕc„™ü‚T+ð~†©$(?'u­Ÿêiªø¯]¿Yk„k]DiÆ)7Œa4裑fKY¶œÀ L¬z‹÷Æ”3BõAAëgå.nÎ"˜¹ž Öch4'ä¸"nthwF¸sÔgÕvŒõ¶ +*çô£•¢‹¤1æ½¥äå•nŠ®ôaš¯Çpg;¯¦¹j^n#J›//|u%É-›™|(+' —2ú²¿O:ã¼ÚÚÆô$ãÅi+'•6)+VOjœ«½'di/ÉWä½byWï^‰cÁ?P›—„3OËÍfä¥F†÷c„½‘“6’lUR¤QJ9¡²žbá³ÒŒBÍmÔŠNF¨Áey•›Y¾šbkzíL,&¹Æj®e¤¬Á Ö‘zw» oç$\n“z?Ï×Ãyc+-Å1“›fý>1IبØÜL‰ÂD8¯GQ+†ZQÌ)ÈݼÒËŠíŒÐ\MK[9-†9I²˜"‹ˆØ‚·Š¡v†©†s=ÍÃŒÅp7‚šÄ ”¥õ“T1†¹ëYõ“0ñi˜XM° 6…›9ÚËÃæÕ­4Ÿ@µÕ(þÓ­Üj’ åxy±2L-M•ã¸»•‘arb=Š™«Q"œS6RâjŒ‰cNŽof˜zAhcjW;•Þ¹â϶s|‚,âÚ€-γÊÉ¡$|„f`ººI®¶U0·²JA¨óî”5)ÌÜIA®Gk« $HUû˜6ȳ%Îln¦Ù[ú¢.1c–•û9eA/o¦¸R´K»S¥uÊ–w Ö±¦`™Ê‹³Ÿ»ý³å$H‡²çzç©X½ÈI(é…ƒŽ™zѶ Êv!èÙ‘b+ð«YŠÅŒ´šÚð…5hK$U㔗⪔=U›WÅÁmçàU‚³Ã¸J˜¡vlŸ‰óœ>Ì)]DjM¿®-_F™âV^¡…;z©µosê0§öãTf2†YIÂ7ÿÐ)† +:`¢,ÄJ”\ÑA[X® +³ë1º§+qª’`k)¾²õ¡yPNîn£A÷Ø킾]ж²A3²HAÍÐn7¶óòVZŒdÕ(ü*-A"¥ð¢]=Ô*{W·ñ÷0B~º…n¦Åd×@”AŠm%©¡L(m¼™‘b¨™ Ü,WƒHP¾È=ÖYÄIçãíŸmf!31©Å#ZÆq듺™#ù`3ó72Ãh +5ò|³ ¶2¤÷ ŒÃa$p{-Ál¤y˜0b¯&•í¼Yg*y}” ÜPš‹ä•‡0 Q*‰»bé@®‹¥#Tîhå½›×Ó;|ñ'"¤5,ö. Zw+§|("'‚˜Y1Ø;§B Ðö2zYÚCèò`ï5í 6 ÊJ’É1µq)Õϳl)M™›IîCk¤aš­Æér”ªdåã,”Ú¡õâ¨Æ]­yDÇY¹š“[°¾¨>äKËæâ9çM“”Sà«\q—)ää^ /RÁ%I'‚j+qr=ÅAŽ¸¥ÙZœôs|;Eû9.Ø>}+'¦)'/–£¤•`Ë|y¿<[ÝùÊ›ÞÆX;'”igHzcÜ›dÕόæim|«5¶ƒ®:ãL»pk’ZYe”Þ¶„Éí }j‚[K k)1ÅýABéÓºžàRT2y=¯®!F„®&Øvšïҥä௦X˜gÒžoåµÕ¤ðI„ÞÊ©°²á¼Eu€)ø3†™‘œºcV#ÔZŒXˆæuFëaRs%BBRÁÏ? a+aâAåµ[%Ì¢NPeÄÚ»Œ9ÌÞȯ%Øf#rg³ odÔÍŒº•N„IhǃöRuH›-D‡ß&?/ÕÒƒÄC¤Í4‰F ȇhAÏÅ$î|Â6’ÂzŒùd£C<˜F(X€¾pÁF¸šìNx«)½šà7ÒÊzJåÔ[ÇŒ¡|À8“íB€{k1êa”øt3ûYÍÑ%·qLšãWßâ"Âð¹ 6( k?Ó~’.“ZýH€HOó5D2îŽàÍP¹ž$,·Oãd1ŒhQÌʉµ ?è± ÅE[¥¶g¼ÏL‡7oáJXvÆ€Fe÷Íû¿]¾²N”²rj3!Ùöµú©Ù>/(Aï(±b¥˜:ªM)÷rHk‰›¨Œ¯Ðöx µ¬Cˆ¤+”9!¬)jŒ•Êþøè]±¹‰(Y¾Æ—öŒÎµÑ»5z7´7•½ù³/þ‚­NfE Ú$ÛHru\íÓú•šJÉH°Ü¹ /§·Øðç^ì$T+]þ8”]OB8V ´]]OÉá‚ÇËŒ>ĵÖO£Äj\ˆ %ÌXÒîe/Qu + (`iÖãÔö'7³b–ñ¾ðõ$ænç´PVfÙH0á¼ +Ü·çD™”¼‘” µ¢ˆÊ«ÔgìO&Dˆõ„Êš®A£j$™ùiŒXMspx´¤1-H [ƒi‡Šµ “¿×g>ÛÆV£ÌÿÉÒ{0¹q_i¿bƒ-‘œˆ™AΩÑ@ç€n4R#çLΙf1IIQ¢’%+®’W²Öʲœ´–£,ÙʶeYŽëõ¾ïݽU·î=Í÷V¡¦†C ðç<ÏïénLéI­]²¡ µˆ5!¡a-rË„íð”lK¹7¼ V¹Ã£`Ïœ²°àD&,u‹ˆu('S°aÀØáaûʦsÀoEGÍÄ#qÄ@¹è\²º;nÍŒ3€¶`˜‰ŒWê +Ù51³på¡"ÁdÇŸ8¸¼Î˜Ú™¬sJ¥uµSò yŸÕ"¼‚ÈŸ¯A H¥m>3 ­sŠd´»ìQ"Ó¤<-ä’ÍÍSefö¤ìKh¸†;@‹ví\ø „Hë’ÀSˆHèËÍW½@øÊM¸:ÅöAº{b +‰h¨Î¡BÙ'Õ<ÐROÌÈÅUE§¯ìþ²ÍûÂ-2>ë‹öÑ`â6<_ƒHP]P!:O•DlÞêYøª¯o«ì¼Ñ'#BÉJ% ,ë‚š|I22°qµEÅ’7Ói3“…Ì ‰• w…ô¢Æ#©Ý‚ÞÒ{Ãð€½6Ò£f +eóœÜÑCªÝ°ðúv&¡{ÊÄN™h£[‚ÝšrNY;™ó…fP±ãfŠv,­RºŒ9¢õR»n™´«íÒ:7øB´eÌD@ž…J€h…kîá F¦’Ú!Bpp³E' Òö1ƒ[¼EeÑ¡Pr&tU6¢À aññ­ýʨqT‡ªL x@Ú `ÃÅ LjjÝðP`f厱XJ2à”…·QR»M:äFõ„Þ6"QE' “ 31¤EG!b·I°.Òq$=èÌž=¢CÿiÔ<¢EmÞ8´,f^Œ‘Ð8ø#jÛ? MŽNÙAÖ üN*·ž$ Þ D­ + I䫤T÷I­Gi¯T·°éq+nô”ìõg½›šó…›Ø`.:Lž7`²É³‰9.9ð¥ 7f!LxÔDÈjO$8à¢@i—‚† 6 x”‰÷éä¬REhÈ-TùÜf°~€ÆúÊÝcåhƒ‘ŒM¸ý©I$–|ñ%*‡Éi=!µ+jIƦUvlR¹EÄ%/DÈ䘉´øbX° ê4bð"B™Í.ã±è Ä%êßÞpk‘Ž0¨^P?è>X+•¶àqØ ^˜øaHñ*3l"Äm½S°y#аã°; S–tÊ­3ûzw4íˆUÀÛк„ÿsgº# ÅqŠjHë3â7.¦†¬ä ) ‹NƒOZhþãFÜà4vLïAé(S«,ܸ™ÒâZVolÊJuTgF$'‘Ð@´· £PfJmcÝL÷¦œÂ!kÜB9©hŽrKPOèÈ2¢Ã&,ì?éh*3 ×âNšÈá)74…ÊD[µ‰Q¡&ï°ÞwhÊõ•UÑO—`%b~T9Öp3ñI vdÊ|dÂ04iÑØX„É ˆ_gÁè@^¹Ç«Ô•Wxˆ©,„ÑãwRñ ; þÓ×8ý0<øÆ+V\Vc§}Á¢…Šë dÌJO8x€41¿á 6­X‚INO!<,ø”]¹ì”µâQ6Ñ£ä.&•¹Ü¬ÝŸ·1Y—P1`Iµ'lÅ+lÊ›&"ád2ÀEì\RC‡Å¦§wð¡Â)Z±Q+=îààEÌD<^Û“Û§ìb⛘6áµÀ‡€­´©¤<iXàoèˆÆ9›¥÷BãƒÊ½À{þ1³GJàG:—¤s¯ùÇì¸ °6í¢ÒS6°PÃ:”¢ÚÎVÒS᪠Sn¿• öÂ&*I@ÎLÂW›/¬±1_HŒÕ5nöBë”YcrµöáˆÆíÄcF—0a"ÍYç +°Å…\}šl#£“6˜gÜL@ý«L,”Î)ÿÐ 3fpÁhqÈw·ŽÛŽÜ¼å18#h!ÕW?lð…o·ŒëQ DÀûq3 V¨²û!Fró‘|ÿÈ„qJïpzýN_ÈäU„jt.Ñæ‹Êåe³O¶úbVoTç„팙|&Ÿ›éKõN!Á(zûNú«ãÆC6ƒ‘€¿0á´‰ ‡0(Ý:aÖº'L˜áf.†j7ãPQ %7ÕP–CZ 1ÁŠ¥¼þD-HÓ€£„_UÙn·žt€€p»Ö:è¼ jQqÄ6ªè‰ÚÊ@Ú…„N7¸D2Pô'š#âæa±(Ä%ÈnÊ=¯´ÖÊ9°%U¡<쾈‘À£'Ì”bdÊ[£Å%;¬v÷A;˜Ñ8€0àp” ùüiøf¶Rï×cðÊãFzÜ̧•§Æmä¸ÖmsÆ Þ#SnpOÅOíA£/îO ÈpudÊnu1NŸ ·Ó‡§\ã&ÚN&°@b»ûæ}r•hl¦€0ódõç@ÒGõ8à"Tˆ ÂoÚ±/OÕ;˜ˆ¼É0 ô¬Ú%˜q’/!U x&\¬Ç,8¨d™0cQ“/$ggfv ˆùh‚ &TÉhW,,;Es”;  +#ÚA'ÄôŠÍ€)·;tú‹ÙúƉ;ŸN4Ö‡t^ ¬«B5SN¶NDg±P—Í­˜‚ÁÅÅ:ú0†7 ï ”ìDÉ)wDãr0Àº¼Îã·P13·r*?úò“ZÿÖ « pñ–—UzH‡Ý³à5FO@ïâMhhøVñ;‘ 5Žß§õkQ#†`kòDLhìoÊÆsr³·vG²¹ý•që!•eLç6ÂØ mõ8$A£/õiÄ¢ÀuÀQ“v’Ú¨Ö •`tI¸Pa —1“à˜ “‡Ôˆ +Ä)¢TÊC¥pž`õ…ýѸç§1Ë”™0:Eˆl—÷'{ÆÐæãŸÊè›4Q*9Ò"8îOb´H™©ÚudÂ1¦Ç`F—8aeÇÍä­S6‘$Åhõ?V™°¨-” Ï9¨,¨4±â“Z.&?f$2HÍN<[A +‚D´m°é%#‘„ô‡Ë}·XŸ°rj‡ŸÎ¬cñ…Ͳ’i\ž¡R‹PŠ6<ŠJ%«r~­©CÃ*+k@#¾ö›¼g@e;¢†ìæ¹M(dü²“ÉØZ)H¬Qå[3x“ZW`LïU›h/›³aÐ7µõ*nQñë ûÍàê’òŒFQNÖ œ [ðdCH¦* ?b ,]môáI+•5Q°t:åxŽ ^9aáo·CC*° Ÿ´&í’Gh2±E2ÒwÒY[0ûÂG´.ȧãVÆFÄ­XÄͤp©©µ±&'‡‰á)Çáqë¸Chå: +ˆZPZ ¶Z‡°a@BcÊÑ0аK\a«'åôG4ÿxH=¦õ@a|uÔúOC¦-0žrHlÜÄ<Ña=~Ë„Û‚¥Œ¨lD“_šv¡bé@ÕèÞ¢²ß:n…BÕØüf$bó¥­4 +8ã¡I×”™¡"h½QñÊlÜaü‘3Uî+„ žÈ°<€»<«a¤Ž¨ÑI3ãá*D´;a‡'3v:ë szæ&ì°Î3l" 𲉾“ͨí¼ ëÅ¡4Í4 .Âäq¡æ TF n=Â[HÙéÏÙxåT‘Ç_"BM4Ô6`Ê)“7<ådGMؘ Ä2 Q§¿jáËO¼RÝ)öTN~ÜÂ(GÐ&Vm4Д4vsFÁÔŒ +,Ø"XÈ*ÔlDÒFÂ8‹:4ê RÓKÛ+´H`X‡ ‰óv_CŒ¶mÞÞƸ¨Ä˜•¼Eã2bN&OE§AW±pGëÜ4”hjH‡i\a“/¤ •cPŽ ‘&·©HçSY3d|”É{˜¢Õ—VÛ%àp“;¨2x!š©ŒŒO•Œ˜²F̼Æ ¥Q&6np›<⸅œ´â£:çÚílv‹^B&øì!•UÀo¦&@S^ªaµ{Xë…’@ýe"¡NƒCra™¹pbµ…ýçaã­£¶­Bæ·ŒÚ&ôÔ„" ”Ö +_½;Œøëz墭Üü«CšC£f(Q§7h÷† HDA‘±@íˆÞwHë·ùµåPÌÍÓ=M_°¡Ge°ˆÿÿxD Vkpð:;¬ñªŒ¤Ê»Œß:aƒî³à²Ù¨ ]ÐhðÊÕ²Ôˆ Ð•Ò!AeÙÝŠdxÝ)âf @H'o6Á¯cÑ1;7 ÖoçÀNÿˆƒ¤ÏD[þÌï|qµ“‡0ñSm'u{®êã*|l`g2ãnÄHŠ©y }Í@³«”#cxFV,qÆAÆ4ˆ±ÑÆäÝÍxl‚¤ÊÎMÚýðÏQ#ò8lô ë<#@V?•¾ ¡öqÊBdB#˜°¨É’±nZñ¬‹+ƒÊÝ¢²kÝ&DrC8U"t€‡µxÒŒ‘„w„Ͳ˜±”›-¹ˆ´Iì,t(@ĸÓã* ­a<”î'›[·Ü*eÓ:¥a­|jÌÈ›y­*VÒxGÔèДgDƒª Ä‘)ÏáIDe tv?Êå b¹ ÊÕtÄ!•mT Œ` KÍ›ˆ#d„«tõCc& 8ÈòP«Z› %çíD蟆&¾rD=ÃÓ¢c:|LG@;«Ì Àd´¯ ©GÔ.ˆÊ tÔâ¶#þ + Èø­jï˜E¹¶Ju3; ©=SÊj@Ü‹+'¤,¨Ÿêmì­cVåÒ2(o§¨\ßå +¹ø¼'Pv0À“/j¥²H Šˆeô¬XÄ¢Mo¸®²rð‹%±‘)x(g£,œÒûð[xqÊ-¨ä½ø_o ê •Ó—6CHE@ø¬Áí7yƒ#Jé ¯v…íT‹€möV:;áÖ“CzHÞ/B¦@½-ÀöT+f*ñÕIû¡Id³/æ ³v:g&2V2:6i¥áç€à¼ñúÑxý˜7Ðq0%Ð%hœIhRïVø°žÐ#A³r‚5 ,mD ‰dh«) qLþ:.Ö!V€ª+®H,„q( VÃA§ð`ժߢñAä‡"MÕ :gPïŽiÝ1¡\j¢vJZ+(yhÂuHå#»ù +ä$¤*$ +]cA#(“ÑZ‰qWï ©Qàa½;jl'â*­çnøÊvDXSÁî;¨‚Æ\gž´:½! ;Àl€|H+ +YÙxåŒ•Æ SVÎ'jQÈû:§rý*èÒÍI…á1áA%þáˆþ«Cæ#PðN‹Do^ •„ +t‘I«7e …§Vòf¦cðƽÁ—ž¥b]2ÚdR=Ÿw eO°?g’3|nI(®›é¼O˜ð¸Î†Ä¡¤6"©óFm tnHúæà!ÇÙÙŒWª:¸ÐÀ Â¥C¥%¹±)—B¥Ðd­O†]@¥L`‡L¨¢Bt6Îà“=@m,xÌÉdP¡Â§æ°H ¡PÙä4"æXØ#U½Á*4Ÿ†… +–W…ü“îÙ„üˆ×{ežß â=øjÄ¢ðL.5“™>&UV¼±¶?¿(`:‹x¬¬¬¹>T—GH‡Ë³±æº}²J+G€Ù „e2\³Ñ $b”=éxCMÐxw*ÞU>¦ >¸l£3”ÜM¶vã­]W  +RÝ ]eeuˆ`'c”Ü +7×åöN~îDg÷JDyZ‘Ê®8å*zU.>nxlLGãÎô[½aŸ:rùA +JBv6TYr³T´ªCDp +4ص7)—¨åéDËÎx¡”³Ûq;ñ-‹ËM_¬K$ú\v.Ú؈w¶ÉX•”ËB¾ÏåfØÜŒP‚}l‹Åyj)\óË*árIA2>;)¯×Ï×–Ï…ÊKt²‡†h°Â$Úl²¬nð¥íXç4•œ±’Q¯M•£b-°c6·è·\Áf°¾Ë$¦É(øTfÍd‰ä‹õ±èt07[[:G&{*·®Çe°hGYm©ª\´,–@ XHãbT„ŽÕ¹T+Pœ‹46…¢'\·sÐ)m-a2åd˶39à+ƒ7‚%#‰äM±R¤>PX‰6vBõPu°\¨T„²qY·T"]21©oAuÁf±–Úå·âÀ–Ê% ×lr”6X^Ivµ·î’Û»X¬)–`ÌsñönváLnñL¤¹Á$»b¦[Y8V]:•îí9¸,(crÛ©‰.“èú¤’\X°‘I ‘ ¢-<Úö…[ba)Ó?ˆuvý™Aº³)d{:/¸j’ŽwCå•Hk'ÒÞuKU#çÓ&®²`&îÏÌ0©n¤¾YZ¾ÐÚ»llG«+ýí;˜DOïM‘‰y:5Ï$a7rs·ù «V:3f"@3„LFªRy‰ËÍ‹¥ÕÜÜ™X÷(Ôv 7“oo¸Ë•ElTÖls¹•`c?Ù;M%úreÕÉç йøHD¨º›éŸéïß¿zúñÞÆÅþÎ%~@%ÚÑæF¤µÉæäæzuùb{÷º¿¸àr.å³\ºÇ¦©écÙ™ãbqafÿîììqg¨äól²#æf¢­m®¼!Öwˆì™êÃ?-dxÊIÃï‚°$fNÇgÏƧã3§¥òZuá´TЉz°¶ÆåÙì‚?¿kläçOE›[P tZoÀÊ$ ‰H¹îÏ/ÄÚGS½“HÈ!ÇÄë2ˆIR®‡ªk‰éýxw?×?Q[<‡x\î€ÞÒ‰¾[‚òHvÒýÓ¡êŽ'P›tøAÁåÅüB¨¾ÎåæèTÍ @gðxÛ(aqhÀi&;®oÁ +çæN‘†»™¸ À¸ù²Y(-žÍ̤zÇr çb­­¹½;AÀ]‚Ò†‰ÞÑæöý£w ŽÝÕY»MÈtéXSnl 2àŸrº<5(/]Ê NÆ;»µå Ðøo –@Eý¹ùdg¿¼|[iùl~p°|úÞÒüqXd›ôËPuêFzîT´½,­äfO›Ù¤Å'H™&&m„7Kvv[{w·v¯.¼÷Î'¿Ã&gèäBeíZ´¹ïë©E¥f=¡–•ÉiР˟Ó{`…bnZ*-„ëÛ±ö>¯Ï'ëk¿ðŽ¿°¤²3þd·ºpNÈ­qùõh÷¤XÞgŸß½æŠ—H*dµ”š>‘îŸ).^Èô­¸wóÒx¬©¬Õ×noo_nmÝ^Z<ÝܾÚ=v£¹tþÚcߎwvÜB6T¤ºGa"…ù3ÕÕ‹ÍÝkŹã½ÛæNÝ‹‡ËÕ…ƒîÞÕxï8“_,._è<˜œ¿È§ÛáÊ •¨Ù˜8ë°ùE©¾¨­§úÇÒƒBa¦0·íl2©i>;ð„ÊþÜL 0'æçk+WbÍ}§?…EË¡ò­rtd¦ªmeû§sƒSb®#åºt¼%æåÖV¤¾‘îî•f.Ÿ¼§·}Ô’ˆÔ`ãŠs§« +³'Ó½ãrkŸŠ÷[ ·µÖo·Q(Q(‰ìàTjúh´µÓX¿<½yõÄ•§Js'ÍL†Ë-ø‹«PöÐ l~]¬äæ.QᆈP‰“kË|~®¯ +…¹Py1;½O'¦ÁÅ   à£Õ¥Lo/ÖXgã TÈ‚Îqé~´¶knâÑf´¶–œÞ T–Ý¡ŸŸË öâÍ5"RŽw·ýÙi¹¶X^<‹/•æ²ýÝó÷=/××`+ç;{× ËÓGÃÕUBž¾Íµ÷—O|-ÑXµ"Ÿ¨ç{0—ó­­‹åµK­Ý»!¬ ÙeÈ°ãB„PÚ¬®ßU^¾i‹t"-©8Ÿn®ç§7Œ>Iï C˜"Áhò9K¡ÊïÒ‘r±·­,[© ™—»þ²â¼Áò’µnÞÅ%Ý\œ½È-€lÂØ2³gSƒ3`—ì<,N 8ì¬ÆZáÚ +¨Jgnÿ‘ç߆õ±PÑ`~¦¹~7<ëW¡ð¤úZizûƃ߸ëÙï!b®¾z®³wOeýNèßÆæÕæÖ5náà܃W{E(öUNŽ”¡#V“ÓGëëçOÜW˜?Õ]>õÐÓ¯¥ú{P…™cÉînª0{ôž½;žZ:÷l¨²Óž=Ö[;GjT\ñbnQnî–—/ÍœxhéüS……s‹;{«§°pv-PZdÓ}.3#×Vg?88ýõHmCZˆ·=kr VÌÆ•¬l1RÙ*.œqr€‚>›¸ +zÅfføl¿<8~é¾ç˧©XXºœ™=ïì7¶®@§ÐùM C¯X +V Ót,\˜•kÓ;—Ç®WW/`ñžWªUzÇÏÝóMX\äg ^Ñ {‘šŽ5w@(º›wì]~²²pfiûââÞíd´¿žìnCÍ7Ö/m]xøÂÏ'ë gïxðP6ÀNÂÐu¼s&¿xgañR ;XÚ¾mÿìõH®åæbtršÎ.ù‹ëáêV{ç~©²a£“þì ÜÚúgâÀ±²ëo¬Ÿ¹ç™¥ãWMDôʉÞI¹{ŒË.«3ÑÎîéû/ßÿ¼˜ìáºÜÙ ·÷äîñÚÆUÀ!3ˆ9n¶a—è +‹ÙÞ±ÒÊ¥äà6©¶ãáòÙS|²nÄX<œ‹57òýcåÙ£¥Ávsù$Ðþ¤‹fãÕL÷ 3}"ÞÚc3Ý\wk÷Ü×f_w²Éôô.X@¸±Y\¾ëø‹Ë|ºôì}§îz‚K·Æ,“˜ ”–øÜ T_)-Mt¶gÖξøæO«‹§X¹6ؾ¼vþñÖÑý£÷¬œ}¸µsƒ‰÷ÎÜ{òŽ'ÁÝ€7àMÓÓÇíÝLïheõbnþ ìg°u ííÔÌA°ºª®çfN,¯] –»Ê•cå$€‡Ë]O¸ƒ!ÄÍ&š›ñòL¡³áâSl²-@ÂMõ¨D7\^-/Ýä xYX¾Fé•òlº‹„*TVãILž–ë»F˜;zUýy,TÔ¶äö‰hë˜PXöð¹sw>òÄóßI×æ½bnölzö\nþBeí®Úæ=L~Xî®]L¶·5nQ‡!!&û ä;Õ¥Û.<ü*x·”ïg;›&_جՠ¡pEº³·rüÆüî*\-ö¶­5D*8ùj‹ù¥Dûh²µg§ã¡d'œŸsñiØðP6·L&g±`5˜™±A‹Ä¤t´:_[:5wpO¼·ç–'œü¤ƒq²24‚?Õ‘k[±îA~þd{ëò™…Ò",f•¨[ï[8õpw÷zºîîf„ÜŒ™Š|!.3pù3n:T]2Ï­¯ÞVY:Á¤Û.."å:r}%ÙÛÏÏŸMNQ™9„ÏFr=È©¥ì€œDTLv ó'3ƒ±rüÎ*D* |n—!¸µÉxÛɧô¾wOÝëÏÏ é½N:EDêÀ9(pN êàó`ñáB??½mð2­þþ½…Å;¥íÆòåìÂY:ÓÏuw^} •Õ7?Ù¡|èCÝôâµ`eSƒˆˆ?noB†‚*/Ÿ¯¯_žÛ»wvçz¦{\nl³‘Êæ©¥ÁžÎ•ƒ<ÅçÖ„âZ²wR(.ú¤Ìú±ËéÚÂçHVu],®2©XXMv¹ÙîÚ…8„Ê›æ• +6:ÎÇZ¹Îf±·ƒòN (m#¢ÐwcÍ­Hy9VZŠdf`­js'SýãLf²*¨™‰$:Öën^eÓ=3!û 6=Sš?[œ? òÜHÙ‰êòÑ‹{¹ )6}\(¯ð÷N<Øݾ¯oxüù“—鮜Ô+4%æ×±Äϸ“ŒXˆTo‹TA¨£­Ýdï8•ìéPÞ€j„m‚âL57rƒã¹ÁAvî¤/ѱrI²-W—¬T(^ê¯yhéÌ#™Ái6Ùs0I„2Š'4nðœ ÈKù±8ËåReÉ.¤½Á|mù<ì¦/TŽVW‹óçÊKg3Ó;|²é ¤u¨8ec H`Ââ²ÓP¢å¹SÙ™SùÅÛÅÚ†Pœ·A.ÑÊtöÅܲ;Pƒ=B!›ø“Å™½Âì[ˆH0·¥î ã>¹‰È]Hè¾`…MtøÔ´ g»ÇºÛ×åú6àJuîD¨¼j"d)ÖØ>uO8×Q#¼T]OŸ,-_n®] +h¸åòœ\ß;u#^œuñds³»~{qæ„\ßIÎæóg #B¹ÙÁþ½•åËáÒš?9ãO°pfš* Ô +õgB¥Å@~¾:º³u…7õ€Ü¡üÕûŸ $:\öJe:Ö¢cÀ½›•Å Ý+&O YšínÝEf<`ÅD7·*§£.*å&40³q ¸“̤¬\õŠîPñ™ +ûÕq»Hð©¹QƒGeÁõhÈØU©´´}g¨±d $;wpi ™àÓs;C§ûRu ÔCÊ äüÌêþÓ›çÐ@ÊíOĪËųÍÕK‰ö>Ÿ[ ’ÓN>뙪¯Áfá‘F¢};R_¾°xüþ¹£7ˆh1_lœº;Ñ\5`åÔ!•B¥j¸´­îŒވ/P²Q½‹!‚yÈ íí«Õ…3¯–N~½µz9Vš_غ£¶x­CÔ‚ hÄ"V*îOÌâªáõÞ+¤ØDFÎWìbì‰ÏÌPÐnѺ‰üú§¢‚%"\qj¬ƒˆ²‘ú¤ÕØ•ÈÍ¥Ú{¹Þ±à7Ÿq±éBï ¶tÞN'!Ã¥gÀ óèH d̘9TšÇÃU4PD„¢7X—Š+¹éƒúÒ2\7û‚n:ÌôM^ц‡ ëùE Jv‘jLö +YØ2·rxªÎgæKsg»›×ZWSÝ}ƒ/8e'ÍÞàamDâL¬¾+ÎñÑš?ÑT™)T,ŠÅùHe‘Š6PŠx lC¥vokÿÂÃ"tdÒ¢·Jâ)=ã b+Mò/÷½þÒÁ¤ u`’”‡WØ–6ãõýx}Gùcf< É‹Ë«Ì,,(•Žù‚J®’Í…­óñî²ô#¤Xèñ¹.‡) í^)š›2Š—9ù$¬¹ º˜è!ˆ3­Â¢­»’înr¹i4RqŠ7gc•dgƒI@€ +ø£eðšLkK6,TdÂÉúÂu8¼¾..™q‰IvcÍÕóå…ÉÖ*›jZ¨@}°¾~ön2Z2úÐ`“JÎù3ó¬¬þ5bQ@Öxc—”‹&„b#ùìÌ>@HçÎÆÚ…âì11;Éuž½¾qö^•ƒqù d¬€,,‘RÍŽEm°‰Láâ0A ¡R},1C¥æâéÞi—׸¢ø„ó&èV<ŒKe"PÆŢݙԺ´f‹b¼?5MF@f,BË-èGH©:Äk¬Èí-±¼„JM6<"Ä›…Þ1TÈLZð)+ÀF…OÍDÁe:û¡ü¢ò+‰péTccÜŒaÁ| 7“›9cCÄ¢ ?„H +ƒö,-^¨¯^ªÌŸ7¶½RÝ„' r|œa¬>¾¼ÖÞ¹V^¼,®B1[H;#{ÃE_8OD*þDO.­ÆËël¨Šñ)"3ùÆtˆÑNXÎË$ N^eÄ56š‹T÷N^¥[Z—KC÷ᡬ+g¾˜Ô”õLVVq±ŒËZeöBÏ&B…~a~·²¼—ì-%§Ëó냣·-œ¼ØØ:ÉäÁ‹ÁÂ@šÍÎú„¬ÚI[|ÊFÙh1iK….›ªr™Z¢1{âÊ#ýý ñö¼'”ñF ¡b§8¿h-px~$S fÛj«Ï'$Q!­÷ŠIÈøsgüåU§¡£Ùxk^(v„BÓ+çÌ\ÄN‰ÅJem+>Xu…Rn!ɦ¦Ý°h^aDk3 , ˜]iîÍ Œ@„’þ\•ât<Ïgë¸\;­åÞîI©mã¢þt_ÌͻٜÞ-OÙG5NâWW"%€œ‚ˆžÉ­m¾°ˆ'º.±¾ìâár‡Œeõ8o¤$_´˜íõES;œ¨@pIŸv‘Q*ê<‚•Œ²µKKÀ8\Œ¼vòÊìÑ‹B¡5æôi}"”_póÙQ{\ïQ[I%»Ù”ÚFÝüÄA€Œt¸ä RY“r t´ºvòêÜÞ¹dgÑ-&']¤…²Ù¯ÑH$Û–±pJÚJȈP-Ížo­Þ)dzj¨ ŸˆK¹Hy¢%×™X“‹7 ¯3ý­ÌÌ–”oË•ÙXm=ÑØ–¦LÄW† ‡&ì>!LM›œÌÊ4¦q"iæÛ;©ú¨NY(•Áë¤"D¤|Hç:¬sŽQ_°oÈå-B¬\"Ÿh±‘\¶Þ›ß<¾ºîàÒ=Wz꾧¿ùÔ+o¾õß~øÉïþô׿úÅ_¿û“/Üxª²pŒ”ëÊGÔmœMeŠ3ÅÚL¹½Xlv7—vO=åÚÃO]úÚSgîl÷ò×¼ðÀSwÜxâ¥×Þ~þÍ·÷ήì_Ìv–ÉHÁÍÆødßncÁŒË:sý•í¥ƒ½s—n»ç»}êÁo¼|ê¾Ç]}øÒמ}üÅ×_þÞ;o¾óþ«?x÷¡o¼>¿ž‰tØäa=T(’nÅŠ]6šŒ•ê­Å͹½3½íãµ…ÕîÆ^çÔÚ©;xâùŸ½ÿÑG¿þÝ·¾÷ãÓ×j-îËžÌnɆ†=t"^œË··þÂO~ã;ïüâ½ûÊ÷zâʃýµÓ¹æ +,.Z¼’ñc,*Y}Aƒ[@˜”\Z, öcµ9¹6³wáúÃÿúÊÏþÛ¥½òðsoýükO+[_5øÆ”›É…rË©Ú®Î!h,„Ý+0¡&–ìḊ½þ$&¤“¥ÞƱ‹'ï|`÷â‹÷>vÿ“/lŸ¾Ú\9Wš=N‡Ëczì–;ÍÇ[ÓË+['Nß~ñòµGžxúÕ7¾ûþŸ}ò›ßýâÃO>üø×ÿù·ÿüôó/_ûî}îå•ãwäfŽZɤ“£É¶É'3¥fwnëà‰ó×Î]¹ñàcϼú½úƒŸ=ûÚ÷{á•7ßþéÏ?úüÅ7øö¿ÿì¯ÿñ÷—¾÷ó‡ž{cçÂ}cÙÖZ}áh¶»"¦*™Jk~uýÌÅ‹÷>øµ'Ÿ{þ¹—^ýÎ;?ýð׿ÿþ{½òï?ûݾüã_ÿïÿçÿýùç_þà翺öè7j‹GCù>&JKÑd±ÒšYÚÞ‡ÇƱS®Ý÷ȳß|áµ7ŸüÖë¾øúóo|÷Çï}ø«>ùâ‹/þ÷ÿõßþú‹Ç¾ñÊÉ;H׸Pð—ÂÙùt{×IÅ]¾@P.Ô; ›ÇÎÜ~÷ƒ7{öÆ¿¼p÷Ï¿ôÿè½òËþø—¿üñ¯ÿõËO¿øô·¿ÿ֛﬿ à7¤Ô€ +ׂŹ`nºÞ_[Ø<Ø9uñÚ_àÉ}ü›¯ó·üþ'ï}òÛŸô›_}öùþôçÿú_ÿ Ýú£_|öü+?L6V´.nÒB€rê\¼ £BÎodjƒÕýÓW¾öØÕGžø—o½öã_}òîÇ¿~óGï¾üýw>üõçÿöw?ÿàãßÿáOÿó?ÿóéo>î•·NÞ~#QÁ„˜ÑåÓ9;&A,)¶–{‹{»'n¿|ãÑ>óÒ[?øé¯>ùÁÏÞãŸýú÷úËþ×Ç¿ùü£O?ýÿüÏŸ}øé]?UŸßËtvü©žIùûlÄ”'ýIZL…SÍbgµ1Øhήmžºxõ¡Çÿõ¥7Þýà“O>ÿòõÿé/>úõýïÿþò/ûÆkß½ñèSïzHJO“¡&A‡§û+«›'N]¸tç×î¹þÐ#¿õ·~÷»ß}ù§?}ôégïýò½_}éâ•«K[{©Z/T¸¨„Í+áœLó‘P$^©6wöO^¹û¡{züÞ¯?ñô¿¾ø£Ÿ¿ÿß½ÿêw~ðýþäË?ýL盯~ûÅ×Þ:{õk³[ç*ƒm>Z–³ls.UN›³K;kÛûÛ{»Wï¼óÛßþη¿÷ýïÿð?ýì‹?ÿ ¶ãÝ>ýì׿ùëßþã³/¾xëG?¾öÐC³[ÇÃ…iV.3‘<L”êÓ³+;ÇÎ^Þ?}~ÿøé+×ïyå·~ùÁ‡|úÛwÞÿø­þøý>øÍçŸòÙ§Ÿ}öñ‡ôÒß=õÁReâ(“$;Ñò²ÏŸ%ý‰h¼X­w·vw¿öÐ#oÀ8~ôó^ë§ïýêË?ýå/ûû/?þðË/¿øżøòËÏ¿üêÖ™+Bº…p)+>Þ å{‘|§;¿1XÚØ?uî‘'ŸùÆ‹/?ÿÊÿöú·úÞ/ÿú÷ÿõ›/ÿüîÿðÇ?ü×_~úù/½õöƒ>SíïØIYç`õ6ÆŒˆ<Qê¬å냭£'|â™g^zõ¹×¾ó“÷?üòÏùò/ÿñ“÷?øðÓO¿üã?ÿýïþòý?ùèÝ÷~ñГO»ro¢2M‡2F„ÐÙq!^ ¦j±Lkqýèõû{í­ÿÉ{¼ý“Ÿ}öùç_þéÏÿæw¿üä7þË_àuÞùéòîÏÞ}ÿý‡Ÿ|öè¥{ç_£åú¸·x‚V7ïòù6ÌKJ­ÁÚñs—¯?øè ¯}çÅ7ÞúÖëoþäç¿øÛßÿþë/þð“÷~õ‹÷~ùÁG=÷ÒËgo¿º²u2”íå»ûÁp¶ÞTšÓùRuzbÔæÌòÂÆÎúåkï}èž;®]:{ñ¶|­(D^šµ{'&謸Ίì¸åh¶Xh´Ú3Ý™ÁæÞÑý½ù•ùg^¿qû}\¿påê…»î=vñÎöÒª”,°ÑJ0?ÏÆV„µ{X„ð{ ŽåƒûÇïXÝ;ΕâîÎú¹ g¯ßw÷×{ðûßÿÞ{üúý>þ䳟yñ…“—.t—–‰¬¨x!ºâ')1ÄÞÁ¥ãî)÷–Š­Þ`0»¾¶|úôÁ³Ï>þößþðãO?ûíoÞþÑÛ¯¿ñêË/½øÌS_ðþ»v÷ê½e ÍÃyؘMX!×`Z;iqQ~8ŸËìlnÝý®W_~ùÕ·ÞzõÕoþüçïüñ¿þßþõö‹§÷w7šÓ½\£ã&yÝçãcðpQa'ö²aœ¢É|µÙ_]ݺxÛ™¯?úð³Ï=ýí7_ýåïþÅçúóßûÅŸ~úñ —Ï•›5ƹˆÀ°ÎÎQ™ÇµÈ„õà!9^‹ÅK3óË‹ëGÏÜvÛí—ï¸ríÚ]׿õâóßû/¿úÊ7_xþ¹gÿå•—¿õÀ{Ž;ž)¶P.bò²VŸ€ÐQ\L§*óR¼ìÁøX2¿¹süÎë>óÜ7}ü_î¼zÏã?õ£ÿì{?øÞ7î|òk÷=ñõ‡Ïž?·¹½ÕžžKUµ…“R¦órh +|ÙŠ +Fîò°™|}{ûè•«×¾õêkÀJO<ýô×ýú Ï?ÿÎOÞ{öÿvåÊÝk›»Åz›àBgÌ^Io£õ ¡^ÖCøÅx%Qî7ú«3+{^A²b¤ƒàÌ^Έ0°V68é#cz­uù$qx/ˆŽ•¢éJ0^p ˜Íãµ£8Î0ˆ’ËF<4iÃ.aN:ªvâÃ:‹ÞæCð€a\˜ÀÊ`oB RØëó1 Φ Õron~ûä¹…­Ýh6ç¦üZ;6iój¤ ˜Që`ô.† å©:.$:H +r$– +†£9–Îe’ùB®Þî,®‡âÉD*ÝîNWÊeIº½œ—ZÆŬ”Ÿõò_UY n¿(78© +gê•f1_LÆäxL^ÛØîtj¥R¦ÓŸŽçê0HBLø„¼ j-¸Ú„NÜ:‡JçÖØ9¯™÷‡«ÅÚb*[/ä*—¯Üuìàx¹˜n·«µúìL®ßÎêv1<¡ƒ 6ù†U–‘I|£·+ŸÄǘ„)‡ãÅd¶œÈ×1êp{Y8ž®#¹\±Ùí-÷úK¼ $Óy)”òƒƒ5ÊŸbð†Ùhëc8 ï@9NHE³hj6X*÷ŽÎl]é,ŸãC‡Ë…Óé¼(EŒ1:1¨"Fn”çÎùSsj õ·NÙ¼a“4#<ì2I£ÑT*]H¤2é\M‚„ )^ r%”h„3Ó&åà R(7ÃÄÚ·Ž˜« ã:H¨å½þ,*çê‹ë§î5bAˆ·x @†ª›òpi‹/8eÆ\DØŠLšO˜GõîI£Ï…q>HtØp•r(ŸVþ&‰ƒTÛ1%Ûɤ“ ¡à&å ³Gï¦L^Á…I!Y<ŒÁÅxÄ­0ñ/W,Òê! \„àå£L´d§ÂZ7‹p™q“ï«*ã°Ö ¬kÇ#Êj˜(êëݬÎI[½¢ÆŠ]„ÞIx¨(©BLÆ„,ºÈ°ÉRÁøÚ86i·¡AÌŸuÓ ŸTs˨PR™p *XQÿ¤Á3©uMˆÎàЄ–ä +-ÄPRôÑ1"©íô(ŒÕÁ‰´zDÉgprZ§ uÌøÿGÒ{7·‘féž_bÇt·<=¼2‘Þ;¤Hxï zOŠ¤<åUR•¤R—íªiSÓÝÕ}§ÇÆÜ™»×ììî½±wí?ûUö@`P d¾yÎyž_æûž7ãASQ:²…Öôðü™]h®¸ƒ,0H'oã´î‚wX +Ï{“ãÌ»Ñ?¿º|Ë•@™ Ô.w„`© aÀñ@ä§JkQÊ\ð"r¶—m*€ç™6FéaDǹáÚ9Áe®Íá­ârÕû$pe¦Ÿó>< å0 "+æVåÒvºsžëÕ6ŸËÅÍÅ‘$¥b}-Šk?½áYœu´H)ö¨¿ý¬¾v‰Š•ë‹±EW¼XÛˆÓ™+K±Å í‰AMKé~¶y®lûBìüb!R!Dv…˜pR‹éÄlªÛ¬É¤RX¿¹‚ÞpGoz·¼Ñyo,BZ¨T¢ôºÙØÆÄ’]^wZ;´Q'µzŒÉƹ|R©ÎZ†²¹aþä–çÊbpB!c²´Z¥Sõ¤/·Kƒ‹ë®ÄMWÔ›à0µ*8kœ="õz„ÐY)ÛàZõ–'1ç/Ð0¡YÍ#¥²Íç†0˜™rOÉ6IBÎx&Bç™ô8×}crs¾dìÒ8B¤\Qv1ˆCÔ…é4k¶8³÷qI ¥,ÎXxp}aÄüˆšŠª3Jª…›žx0©‹öXÊ 1¹¤rI¥éFRó*F›î(ý“[¾+sOj‘;ˆ'™ &b”éGd_Býé|ì–—$õ0™ â9øŠI•m»Â\„2úgôüÌ⬱p^+­¦QƼåAÜÎÚ+^üÚ­Àµ¥ø ¹`Øiä·¢„=ïÃൠ¯/F!‚¤éÅô„PTŠ[je?€„”SòCT)ûQÍ`n-ÆæÜ(JejÝSBÈͯ€®æ½ãÃÓ^T÷"ªÔÅü—„È4ÂeR*kÌÆ"V l<ˆvËH©ZoýqŒL_™ "b—«¬VSÓøÉ¢øÙ ¿/H¬m?Bùü|IŠ¥(ç`JMÌ­Ùí3Öè/û™4ÒXð s+±HRÁ¥3›n:uZï\[B¤ÎèL/Üô£ËQácÐ.ïŒôÊf}ýA¦½Kh%Új“zSʯŠùi2Õ +Ð9/ž¹å£æ}¤Ølÿrã +_ˆÒ6g´x{xÝÎû’!BKH¡8Eõæ +ª„HÍ.õ6ŽŸÐ™Þ<$žŠ³é8;k1QíMˆa”;ºx>Ú»ïO +B…ð&Õ&®4³Ïe&ðOF.¤r]¼ëK‘¥ ¥f<Åd†©Ú¾”ßBùb®¾¥ä·üèL‚Q)Îf6ËmL®†I‹`3Õ—Â켃ë"³Âöc–VÞ’ú•¥H×’|Ú¡}1’z.z„ƒªKȵYlTƒqŽ³ù ‘¾áEWbBT¬Êùi¶½Gê ÷Ç6#!Ò†ÿE„<.—\ÑÙ¢&Õ&¤ÊO®¹¯ÞòÁ™J¹uÆ臉Œ'ª,ùh  Z)Âñ¹’'©ºb0ã|9Æ•bŒ3Ü}RG¹ ®TH¥ %B,ãb%ˆ[ðW·V¢a2QX‰Š³;lÑjMn[?ôã–•i½Õ`%¦Æ™kõåÜ0•ë‰V‡7»(ïxãr„²—ƒØÁ[ËñEwò|õP•lþЋ¦h½¾åÜ1Þ—!,z+8çÂ"d:J¥ÿìÊòÜJ¡tp;‹!q!¬Ì…Ÿ­ W\8¨Ûþí×ÓW×CÔRBÂÌ_ÞÓ»öðŽ\Û¦ÍÖ`rûö‹ï"R~—%Äâ|…6ÇRép%i@McúœE'”*©T“³/³–׬ÕF Ó +hª“K¸Õfs=D)ázS(n­S63H„n˜ËJIL·»ìcq=)8ó³þ-‘«+1(_ ֠μÙÂ¥ÙíkÐ(Ñî0µ$|d&"T1}ÀX>ÝãíÂÙFq.}1€‡p=ÁçQ± Ñ¥;ƒ½³×¤Z¾éAýXœÎb2Ôä6™ê rÅãH>}úà}º6½¾YöcaT‰Qcv£Jjp¼ÝCDçº;~ˇ-Ghð«ˆTq”µ‰Turü’s†³¦47C žq.—ä JnhV6ý uÉ&i‹PËW–_èÕe4JçUgÕ,M£Î§Û~<5@‘|I•*ŒÙ-Žîõß*dŸÚZ;/ ïD©ÌRˆƒ1_±pT—Yô¡7–càXÒÍC³yJ+‰” ·H{èL¶vŸ³é®IáZÆœP«Þ8ïGWpÖ{ÒêÚròÆJt%Ìx)PÁ(aøâÒR€] +óPú¦Go£þ7¼s³bbH™UL¨}\ßm_]FàBxcÜ•9ßJˆ Í,š¢2C°(vm]*ôoÁ@Ñé¨\J¤êJ}³: ¹$e;·?;}óCDtâ|VÈ õòŽYÞÉÔ÷ùÂÆõ C +ùÑúCÎìül!²b¢äl}¥šŸöö^—FwÓåáÉ£T˜Q7Û{ÙáYnt‘_½ŸŸ^²ù)"3ÅáWõ§ÞþcHÉ0® =LÛ¤Þ1j‡lzäMÈ!Ò\šõ•Í$¥**ÕãbSÛ²³.§¾¤rËÂB>®è 16"”¡Hj ÎêzǬQ‡ôT‹Ók3§XÓÙaT®øÈ´7 -Gfóáý˜I¦ZZi’ËŒR–³Í0™š5rWž˜¥‹: ˜V#fˆN¯Äøå0=Òé'¹LªU©0©ì¼ˆªµ[A2€éÂŒ2|„×¼X +—+„T™ž÷9¹êBC\·p¥ÍYC17aÓ=Lƒs,àz#Á;AÜHp9 +¼®Ý÷%$Vrž¾þž3ª?¹˜ó$C¸r få³sÞ¤7.ÒZ²&)äà`¬ÆN¦ÂWáR’f'œ'ØÜœ_ r"›*¬1ä­Õf/…E”ÍAx“j}ÙO¬„è›+ÈlÑfaRS-mÚÍ0K! +PeÖ‹O/¹ÙÚdÒfÓ}£º‡Á§ÊRº¸B–#¤ª.“Ñ"U‹K¦‘é¢U¬­ÔwøÙô¿½ÆÆÓÆöK³sHie»¶‘ª­£b.ÁZQÚð$•›! +—Šµá9m6¯/ÇcTኂÙ. NõÚf¾µ}öì[Ìj™Fqí¢ºõ¸¶ýÄ™ÜÉ Îq£…©ÅÞäøþý;yñWã´Å-.=L7NÞ=ÊìKö 4¼3¹…‹U:³*–ö­ÎýÊÆ'Zã0ÄÚ1ÚÐòÃT{T]Šó !Ï¥»|n€§rq½Ú?zúÙƒƒO¼(°O[«ïJÕ=ÆY—J»©Ê!8?®Ão†h;Æfi½ÆÒ¾˜êŽ P‡íêo6!¶—Ã&8 ` ˜Ì@ÈK£ »wãs>T¨ š+dû0Jöäa2ݧ2}°— j%L…HCÊOèt_¯î¦ëûqιº»éAW¢üœwÇd(E´Ñ¥Œ©wR•°zlnBe1! ¿ !–ùìP´{z~8\?Ñú¼'Nª@L„\…š<çÃo¬ÄX½Á¨W˜Z`„˜…«×60£!—6£K¤šj~‚+ÕY'+2çÊQ:¦j¹ã)„Éèå» ;`È£¤á†Ãó`¤ólcŽz‚˯„)Ýñ'µ?»ºrc)æ‹É¸T¾ã2]¨äq6k–V»~mÉ·ƒ¸)©ã ÀJ©ê^yúD)¯kõ-ÚñÅ5¡¼®7÷¹ü¸‹áàä³è<¹áN’rt6oЀë(çW%gu9Êùc,*¼¨6Û¡SˆT%Uß²{'éÎQRÎy¯®ßÁÍ•n²ÎP©l8½ÓÆôÁpÿùÞïq­¢d-?J×ö˜YÇæ,Ô™¸àh• £}àÆR·|¤Qݯm½¬ï¼Ð[GXªJ~ÚfÌv¾{ÄåÉT ×k´ öu(ǔՒÊc£±V[;5š[ Öh¬ž÷NÞ–6Ÿ“™1mOh{ìBS½Õ‹'ïÌ6·Ã,'¤.*v2õ“\ï¡Õ€Ã.KsoŒÅY‰‚Ïݼ>{ùCqroóøùpçr)D3zÕžÖ7wß®Ýù¥3¼„Â…I96ÓŠË`ÌRˆ\FÕ¦5ÀE»b<˜½[àg+Hd³…˜T¥r«Æà®Ò:ʵ(k‰¹.“îàZÐêLº-æǹþ©\˜Ä(jK‘W'q? ¤F˜ó$  $ý r òje[¯ïãFKµ…üFiõq¶{${}‰qEˆgÖì&x°ÊEBkñ™” ¨KYׯ¨*W)(ì…5W”ÿ³«ËË>lÁ“¶õD8ªQ©&¡Ô(­… EO4Zq…i0àuñÙ‘wíîq¦{<Ü~òìó?ªÅ ¡×Ñ]£yÄ;«­õÇÝ­§¹áÅ +–š÷ã¸\ƒ +%”7:³p +2¢Uwºûˆ˜‡ó%’Š­ºeõN¤ò¦lw‡÷ñ'‘bÓíL÷´8¾“í&wóã;©ú^˜¶„t+Uš,ô…0ÀŒÙ³šÇ“‹/ê;Ïg-p£,*唵œæÃt”Ë1ÙI¦oõöFe=U™f{q);Äâ¼­–×Æ·?yüåÏßüÐÚ{F¥[¹RoÿÞ;¡0ºáÀõYíýLû¶×ìÎIwûž`7ý˜‘Ü×*û˜Òä3#à߬[ZêW'ËöÊbÔƒ¨àgHYíÙ@€d;àsý´¦•'­½'ý“—õíŵ»zó€L·H%ÿë¿ù/÷^ÿ"Ê™ AR«äןçV ÎúrD¯ØŸì\|þÓ…DO³Î4=¾_9x]?üLëÞösy%Ûýþÿi÷âÍ"*ÜP+[¥õ§;—¿¬o¾ô%õ çjbà†_ˆpî¤Aš³éR@g€ 8‡ñ6&ZåòF~íauçÅèî7«þ +4âçêÚž>PòSw\žµ¸<ÁLÊè7v^­Pü*›ª† Ý—Àyp;*Ì–ŽÆÁK“ékà¼8JÛQÂÄ+äjœvÜQÐÊ +,¦ÖX +3î¤=.æH£aÔw‹ãÛð=Paaõ¡=º§·ŽëëO ¦ÍÚá†Y„6x«¦ ¦yQÃÓ–ÃRˆÈÿÏ“ÓjZ¡¦SARõ`jR«†çƒO:'ŸQj¹3½(oGD×ëFk_©n“V??8¯­?Öª›àRh£i•-Pp¥ºAd†a¶@CQÒŠW] °(zÙÖaº}juÏ´ú*i£î ŽØ\7D[œÝ— ãÚäôèñ¯þjrú nT[£Ãgï›il‚ËrwŸþæé·ÿÚ9ÿ†+îĤâb„#åj®}¼2›7BD$Ò›LþËÅ _R»îNºcbœuÀÝ…Ù\\*sù T°ìjȨ>9:zôAr†ˆäD˜’ª%R ­Âàøàé÷™æörœ 3™êæ QÞ™¸g¥i8µÖÚ=Å8›#Œn4q³#–¶ÅÊVºwÐÙv÷ó?4wž\÷Ñ +Jy‹wÖPµ 5çcWf¹ÜfõÚ_Ì\ ™/léÍs±°%6—#Àq"&B¤e3Û÷?Ü{ÿûÍ_tß(µ}?½åŸµ‚¹üüï²í#°š16¯¦1¶!g·üDúÊb,˜” +­-^¯ÞXüÅ•åy?ƒYC­sav/Ò3”¯FH[²Ç1Ò¾>š÷sjÎGû ü•Q!+;›à½Ýˆìšm‘¦Í6¸¶¸î'M:Ýæò#D«"Js¦Tv4{(—£¥<.dÀ/\Tºðšµ«š5SÀôV»ÇvsóÊrè–óa“î'÷ª[OrÃã”Ý|ðâûñÑs?­§[û“³Ÿ÷ß—Ö÷ö_wÞpùÕ¹ ­ä'Tª¥ô™—æ ¨Öå³Sgp‡Ét®CRï€m»›€âi´rµg«#q£;U^'µ +«—ëÓóæÎãúöe~t¼züª¿÷LÊ µÒjuú 6½×ܼ/V6\q…QͪÓ:šз¼mv¥â¦èLgÊXÃ… ëGUL,BHƒâ€)2û­ýOÀ<À)H™ÖÁWïýb¶ïNÈqÖæsÓÒäÁþå/î¼ûccï%„®')µ©\Ù’–Q®{©¥¨cP¢“óÏn4"Lf>Dù ‹ÉŒ­öñîåW/¿ÿçó÷«wo/%4ÊhÆ„Bʸ9Î’|•³¬5€(ºº‡·U«û¸Öñ )€ ÙVG‚#:£¸nÊèí‘™$õ.”©´ÙØý4*TWbªRžÝQtýÿÝpk>ÈÝpcÊ*öŽÃ¸ö³ëË?¹¶âƒ0ºby‡ÊŒ"¬sÓÇûˆ,"Õç½äÕ›~OLñ!ºÕ£â\Þ7[°ïdû'ïä› > b§`vÏåÚ_Ø4{ç„Ñ  3»ÞÕ;“ðo\òÆå šl Z ¡€/ýÙRìêRˆUsƳŽë+ñ…¹ xÅ9„Ùâ¡”ï›åa}r0N§*ƒƒƒ“×åõ»Rqˆ©…˜è„™Yw2Ùî¡lÆãÜgÇî=*¯=ï|›5†òRV MWBôaj„+òÎT.m’VP¢µ~јœ%ù B¥ +ݽµó÷ÏyüâûÇ_þ}eú·z—¿zýÕtºa3±D¤‡Vë´±ñ|tø6!Ô~¶Œ\‡"Väò¦T®ÌCv¯Y0ÛÀbÝcb~"ƒ Í’r°‘3ùÞA÷ô ¦·˜Yê_ÔמåZÇ£ýçãÙඑÕLëÕ·+•Öoù˜ ™¥g<¸‰§:w`õ6éFÂçÁ:šýL稽syúòûéù;"ÝWó«çO¾Dù\7äüZ¦¹ÖnŸÒÖd>È®DBrB„13ón,H¤íîieó!x"U3VººêI®¸¡µûô7ë¿ïœ|^Ù~Ž¦ZW–P„vNžþ*™ª\s#‹QÑOÂU(ƒ‹tú÷ÁÃîäõ…€7J'g÷[帴’P ÂQ­#—öÀÂ'º‚x”Ô³vQ.ŸÔšLv8>ysòæ·8#­¥Ò¨|¶/&biCm)­ÛˆZCy§Ô9 ÔB„L1À z“OwÁõ„Pí–;~e!pc9ru)2ï§ ëg»&”PÒÄÀ2_ŒeŒ†˜™­«³_\»¯T6I£e‚A*õQÉLJ€·6kÔà×äÜÈ(m‡I;€H¤˜‹³H ¡ÓZ —k Q*K« B­Îy1HvÀ(ž ÁKaÁ‡´Ñɶöeg`Ì$kªù–T€LÙ¨í<è_|):C9ÓÞ>«Ö¶¡xRèãâB®¥õÒøüV]ðÑlªË˜Ý•˜pſꊻm4ÕâzŒµÃ¸l”†˜Tð!rœeØ4”âæôÀNÓÀÁ6¦÷ µD5W˜ü¿¾w…\r<1n6ƒ]©«¥ .7’Šk¤Õ¥2½Æú}ê¹Rl¬žU§wá'qµî§3~Ò`ÓýTeÏꜻâÂŒ˜ëÕC­fㄳÇî„ye9é +s­áÑxëάMœŸð&cÓý³âÚ%Tõë®d*7pkó 7ÁâeåüH¯L9« |á Ïî®q‹1š´ÕÂÕrª²‘é_XÝóúÖ+»w.—Öt +è»±ö|,ÔºYBÔòÆ€P˜¥  Þþ§÷e˜Ÿ5«×p¡’ s8ë¤s½ÕýLjRÀ«ï\½úíÑëß×^ Õø -]Ûؽ·¶ÿB°û>Lñ¢òG"Î%è´™$hçåtM4ë,¸G®âAÌ[„ÉãWÂôMW|Öj;.%fwhGŒ1{|fL:U®¯ ÷ïMÏ^mÜÿ|ëî»ýG__Ú£‹¸\¨twg7Nµb—Y«%d'¤>r ® †9J‚IŽF0#6Û:­gòAT c)w„cÔ È&ç«eLø,TÃPe²%?¬NΞ|ÍÛ]Ø™.ÏvœéYÕ]9»Jª O\6 ÃJïÐf¯.F]Q)DÚ\zAé-pšÓoM/\v94{°’i7¶ž¶÷žmÝý2Ý:†Üo­žnž½qEÅ0¦ÇHFÉa#¸J)EȦÒ`Ÿ1jiAH7,Åefï´ºÿzýâ+«º±}ôäßÿÏÿ^ÚXŽ¥}¨V ƒ³»o~wöú÷œ³~mC˜,g´!@>–H.K°×•Â–˜é9_±`á@§\qq `**/FT_ÂPò«ŒÕpÇ9€hÄC€€ð!bL€€B“JƒÍŽØL_¯nä'zkÛlï;“{jó+¬²ÙnsõÞÖÅWR~¼—½¨¡ó”Rb a¢U@ôCÌb˜sÅÄf…ÑJYF¾ÓZ?ÕŠ£êpïÓlÿ 78Ö;Çdv5!UŒ\o÷äåôäó8ï̇H*bR™µz„Vã­Ù\kÞ¨ZÛ(—™ÝT'ÓDªO žMWBtE¹•09Ê»¤gð© ¦•™L‹Ïvk£ãïüüÿþÁ&Ý4›;Fs¯¹yYõ§÷×v/e»¡Ø-)Û2}ÉYÅä¦;¦ÝXÁ®-ÍžÐAhyc⢟¹¾œ¸¶Yôa+àú¬êŒ;ëV^.ŹiFù|ˆË²¹~¶{šëKÎÀª;=/÷‚¸îC$ª7—‡€y¾±QjmÏ­$< +>A.G)k)À@’­VµÂ8ˆªq:ƒ)Xm£¶%ÎæÔµh³ÇhÕÎÚyó>8Êfq)°v !ňXß©›å1!fç]±8©#|Ž±ÚBa"—×á}Ætªƒ{O¿»N™C§÷0ß å×ìê¦Q^G•Ú-/%èõRk,îµå¨;¦F™ +—Ùœ=:ý’³Gs>Š3êZ¶HqË÷“•ø|Xò%3˜ÔÐ+› )á,_R¾2„ל'ôºÕ=ècí¡Ù¹­7 ½eÏVFOüœ.–FE°»[O¶ï}}þÉï¼ûÓÞ£ïH½J§ª˜R‰ÒYÈ£… uc9¶àAýˆ²æ0¥ –x)*,G„ "*ÅYµ«éíÛϾé^9ƒqìž–&—éÎÉlžmi >}ÖÐ@­ p„”‰ƒä¥ÚàQ+£ûé%Ÿ[[ŽH *MjMÚèa +TÚô2bÀË•ÐÀ^Â0Bñô%„Å Äd½4žž¾Üºø´4>™?Ýô^ÌwH­¤WוâdýôUkóQ\ȇIUÊT6Ÿåë@CQÒ ™0™3R©Æ3’Ô¼èâ¬Ã5ïA|I&U7¡¤7vÓõ-Ö¨nßþ¬±v7.åhgP\Rßy'¥äÇkG/+ƒ`v\®Xõtu‡7?„7çAþòš× ¼qúê¢΃ÏîÛ“&øLWLðÅåÙÝ¡˜pÓ‹Dè4¡TÁ'û§ª3€XZð‘8Ÿ—Ó-Wˆºµ¡JQÀx$Ùì‚_ò%=aøÛ¥AGnù °|ªÄ©o”Iµl”§>ûíÞ½`ÛP¡Ì™=Ðô\ç””K­‘bÆ“Aõ’b ›ê0Z;UÜDÅ’+Ds©¼étÀáüÙ €Èœ?¡Î{ñE?±¦}³R©ÞrÅ—C$•‘¢äÂõzB)!R‘4ÚzÎðLvZûÞMN>©ŒÎ:›F'ŸtöŸ[íCJ¯9­-1Ûö!Bœ2þðµºÈeL©'å*›èÕýÒÚ‹æÁ{µ¾Kk•úän~t®”Ö[¢³n·FÌ)¹ „/ýt1ò³…È ?… +~¢¶¼³QUJ­åºGIÙ‰š]_?~ðö‹_ÿýɳ/3ƒãAÛ[Ÿ¯¿åsí(gª¥õÎæÃòà8U9Í)¯=2Éæp¥Ä´•(vÑS˜¥l”/Âu¿¶^òb¾(Ç›-Å™©.*U|ãøIº:ÁÔœÞØœ~ºqÿK@ÂÂúS.¿æCS…ÚÖù‹ïcbf!Dø 1ÆäâtÎâ¸%éÉÖý­ÛŸ^]_¹åƒÀH +E¥¼Åfp)AÔÊÝýÍÛo€—£PÄÔjR.âr¡-5×ÕâR§„™GõÄXO” "겟€"Æ´(žºµŒà2¥|q"­ØÝ^;Tyn¶*“»P©(('¯gѼ aÁ#T–É ¥<çIB +D‰T‘#³g”9”¶¼arÙÏ»QBÈRJá§7Ägµ­²Ëéã;o;|¶­Ugí\*ëOGïöþââýŸ*ëê“ÓÓ§_hµ]¥0–²R«!³­Øk„Ò;¹¶&x*BÛBzMÎmàÇ™œÆ3µ±¤¯¹0™1¶ ¢5dsMø˜4«¸Z„±Šp>7ž½îo=ªt÷˽mTÎ1FIÏü³=Pô–ö&´PÒ"¸|½wÔ^½sm1JJ1*åù“aõp³ƒˆ¥ÞƽáÖ¨“YZ¡§8}Þšíá%9}L­b|¾ÒÞªöö]ab%H„’Z’µA(CIuÅOºC¤át²•±?ÆÒR®³u±ùaïñ·Zã0™êD¹âæñË¿ÿÿ[¡ºîŽðàîH¹Â›>=a¬a`¶©#Z­ÎΣ4ö„)§á‹°1LKºjV1!ÁMZ©-øˆ?‡èZJ¸£b‚0ƒq%N¤1¡.¯½øð[O‚G$‡4ê\~¬5wíþ©ÓÝÝØ»÷ůÿ©µ~p¸¾v¿¹ýÔlî©åmÒzgB4íÎg_ÿ“íýÅÅk ^€ÄE?åŽ +PØ¥Ðìœ=ýBÈu¡|áV‹J7RÕ‰ÝÙnl]'GI­h66 ã»|v”-o‘FSv†œÕ3ŠëÕÑ o—­ú0ǧÃt:ÊÙ.T[ŽI„Úàíq„Ë'¤òb\¹âB]ˆb1¿F¤šlª¶{úº³~!9=½±SZ{ØÚ}1={òäÛÞÑs£¹=Þ{ôëü¯bq-Äf)«Ã¦»`,•âöÇ]¹×nÀàÕ&wg{¦|l øØÔ›HáRÖ» !v)L>BŒÍž>϶É‚Á®m<s}^¯ Öïùµj{zÑ۾Ϧ[~"…ˆyˆ +Ájlºc +lÏD°t8.#T@oÞKBµÓå=âxg­¹÷*7º#×"|>LÛFy˜rI¹Æê³^ÞšuqçfäqPF|1Îeá'\wY€âãÊ5„͈VSÌ4êÚðôÍÆ[w~¾wÿËý‡_ô×q.#-B*ÆI#”œíÙ”+q¨QBA/¬àƒœž'DÅ’z’²}a!M(_Á»äùn”÷€z’¼uËG^_BqÅS“bUÊ­²fÛȬȃðùV{gpø|÷á‡Ý‡_uOßĤ”ÜþÁK:;@µ¦Õ¹Bh Z9èô·.ü¤öÓnoˆ‰àiBóÆ?"„áÝÃÝû¯1½ägÒFûP*­Z­êÎefõ™éòfíâòÃÖùë0iÆ™,©µŒêîp÷Ùôè“t}—^îl|÷Ã?Ô×ýùuÿRˆôãZ˜qÌÊf}õ¡RÜ ÆÎÅ;µ´zÅ•X3!&Š@jÀDVc«ÒßÛ>y:>zbMÖnêµ5­4ä²­òøäèñWgŸþ·ÚÙî‘3ºÀR­“M€ú0¹ í@¤åÚ‡Nç0@h×Ý×±°þq£ÕbÏÌø¹Ù>æÚ5OÔ`>«V¶Ìîíüø^a|?Ê:NuýÃ÷ÿpòü{h¹00ZÛZcK)M¡nGi+„k¢ÕmNS©öÂGßîK€ ×–„+£¬ßyöî7äìæXZp&ln*|n5×?_¿÷µVžLv^~öCsýž?i!ã¨Ül*.‹³ç}á¤ÂçOÊ ¸˜tËG»‘TˆÍ«åÝòðN¦º:ؼ»qïó£—¿<|ùW;¾TÊS?iR©jix»¹ù“ò¢ÝAå*h1Âå\Ñ}1ÙáxªÔÜUíþO®{ç]H‘1.ƒIÓ×Hµ¾}ñÔÿ¸˜÷Ñà“…ÜªVÞŠ0ùŸÍÇ}¨aŒk`jžÏ÷ÀºÎß×w_1… &Û7š»ÅÕYKdð{çdÚ§øQ1·›õïõÇå0ªºBÌÕÙöU±¥e¬—ñ’º+) NW,õ-—nïôOÞäÇÅáíúúƒÊä\̶À?Çf XZŒÑBÅ"؉Ùt³ÖÝù’]]¡|¾áÒ]PŸ•°D*ØÍmûd:Î9Õµ‡«§JÃËÒð‘RÜÐh¦<âÌÆJLºæ¦¯{èå¨ œ¤ÒÌ4v¼ùþé‡ß&¸ôJBòQfT,²v¿:9¯¯]–¦Ï©f‚³íÞÔê¸T˜-·—Ê!Ê +Ó™æÖ³Ùv~1!Æå’Jå Â… HOòé\k#BgühŠ³{…ñEsóÉæÅÛÑáËÙƒK³üô“oþô¯ÿµ99^‰)TªCëÆìǹ‚/©ƒádõ:&: !Ò›TX«cE¥{…Y[ž¯óÝÃÃË_ÿøÏë'ÏWÏ?[ômýðÓÚÞ'«w¾Ú¾û~÷î»âèv¹ðÏÿö¿ýîï´%§;bfÆLJŸ¨™>ÔkËŸîpõÆJüúbø'×¼7’®,ä×y{ïˆv—4[\~•ÉŽ¹üTªìø0•Í4íöd„àôòã³ÖÁËñù»ÑŇîéûìêC±¼aW·.»ÿà Âlf'?›UrÆö™Ìæl{÷ sÓzfO +¸…éŽ !*ggìÎ^º³]íï<ø|çá‡Û/±vö¦0¹ íA\,RïÁÆhÓ—˜Í7c¬~}ú¨³ó"Ó:$Œ¦‘£ ;¤±c½À›ZƒÉL”òa¦uÊgûË É“R Æ瀥ü(ÛÞ- à«Rr®4:ilܯ­]¤›{¹þq®w$æ™ÒðäágÓÓ'Q6 ø–ÏZÙV©ô`¶ÓhˆJ©Ûß;{ 1® +/l§µýèÍ÷½Í;€E„VS{Vÿv{÷å½Oÿ⻟…*õÖ`ÿöåçtª 1–ïÞní~Ö?ú¢´úR-m€Š‘ú½§_•g7¼ä"(lTˆñÅ™°vŽKÓKD(¶Fǃ­{ð›I©D¥»Œ=p: •éC«¶†0ßÜ3Ýù wËC̨\m +ΚVÜ â†+Ê v·´:ÓtB©àj…4kQÖT²ÝRÿ@H7º{O^þª²ñ0Û=`3í—%äàÌÉÓo>üð¯«G/“REÉoRZ+Ô‚ n6ÃÁÝ\N.ø¸Tis%ÊþÙ5÷Mº }Q)BfI½ƒ¡2ŠÝ‡w,o<ÜzüýñëÛ‡o’R±:¹ØºóáÞ§¿ï=~ðÙoF§¯2ý½ÎÑËòî £®×ö¶NßÞûä‡áá  6­²]_äz§Bi7&TÔÕÅð ’äs—ñ'…xTÌSV‹ÍtŒÖNºµ}pÿݽ·¿1Ûùñas÷ñ¬=Qÿ¬²ö¬»÷ÖœGØtŒ=V†p’ +«Je‡/lË•Úž$¥j˜²\ >)—’©fKn " ZÍ ø,Éc4P}{öê‡Ë_¤{GriˆH­9kG/Äl#.Zt¦Km +J«B¾ÔÞ6Š£iÑTmΦ²aʶj[¥ÁèȵÅhRÈàðÙž˜í”FÇãÓ×vÿ$Î玿ûöZ®•rÍgµõg…þ…VÚu#òbˆB(ëòÅ·ÍñÙÜl“Y•kRaÝîÞ®n<-NPráÙ›_Üùs@ø0™œ¼»ûöǯÿ`tÏÂte­ßüñ_vÏ^ºQí¦÷¢º\Ü1›§dªsË‹GðT{z§0:_2aÂŒ³Y46Ó3ê{©ê6gT/?û嫯þQZ‹Òinv+~«Ð?ݺøìÁ»;»/(£G¨uÑûPåúJì/ox®-DÁ Â[á +(uægóápRÉV·<iÑK€nÆØÂlËQÔ¤”:Âd(­,Æ¥Éêô’0û²Ýnm>=üáõ/þÔظÐê·_üúòËÜzôW Ÿ}ÿ&·?—ò“rkÿàÁWzum‘„Å›F-çzc|‚2ì Î_¯úQjgwñyiãáøôÓþñ ¥<Ü8{ÙÞšŸÛã µ¾ÇäF³YÍÅ1(—ÚØ + +6¢W£jÆÞ}/å$Ô­ƒdªNe{TnŒ=&Ý'ô6¡Õƒ˜m•”‹˜ì rÆ韮^|9¹óe{ÿ“êúÃÜê[ϪŒ·~®7·­ÖîøÎÙÉ}¡¼.8 ÖÍ“çqV÷$„lçD)®Ó©†šÇ謑qÉÑ cpJ?›ÝrcA<ÅÕâàLί†ˆ´7*šÅqœ1<12€r@ò—ïþúñÛÖN_;­]9× ¢Bë S³èü¤'ÆãJ©<8)÷3µ W”½¶uEùÛ–²0hIÙÁùtµ»¥dksÞ¸’Œo¿Ù~üMÿðyº}ˆiíÙÍ­øþûßOö¹“P`yRkDèœ'ì©…05ÉeªƒyÆV_BÃ%pÔ#ÁYòSÒèXÅÁë/xöîF«%Årÿ³úæs§œ®mĹ¢+Â1©µö²f΋#À)æ€Òê¸àÄhûêbÜaú«'õã^òâ×c®°àó’³fU÷2å)-¥‡;¼U ÍÚs ™ü&ʦ*ããÆÖÃÖöÃúú»³£µÉíûï×/^¶¶. xZÍ>¿Ši5£0ìmÞ“²½ÙT}æçI¨D^ Q\…ï­ìŽ2@+˜œOU¦£“7'ŸünóþݽË̓{ÿùßþûÓÏ#Íš_í§—™îíÂøÞôâÃùë¿žÜþ¬1½óâë¿Ê~&›j§*›¯vžüõÎÓßôo¿m­Þù›ýßñ7ÿbsnÔXARnLÊU¡¸•i×G§OÞ|³}ÿmsïiïøUsï±=8ì<½<}þ‹G?ÿÔ°69{øþÇßþÝÁ“oÛ{/Ìæ.mÍævröªŸ°\q>Ææ"¬U‘K”„2štf lÖìFh}%F€7ã²/V¦ +Å ‘øì>–ò=»>®÷œîRÞ!Œ>®¶H¹§Œù»HCHDIþć¨³¢".•´ ?Ä¥¨¡– ¾eg ®l!L02a‚Oð)Ñ®•ÕîÎåääµì ’2älMÇÇwdU¼jU-­Å;€¦I~T÷ÅeO” cJN—'ç“ÓOZÛ—FcUk¦ÛViåÖh$…)7Ô܈TÊ\KΖÐ+!.‚7–ësÑkóá• ‹ÐV’1i­ žÿÊÍ ?Ư„èŸ-„¯»…0ëŠ ÞËêå¤`'Ålº½Ÿéœpª;4>nm=(®ÞKU7…tÓ*œÞ.c:”fÊN‹Ï´²Ý“üè.°žÓ †¥Ì@Hwæ}Är€‚S +ÆÄ‚?!AŒÍ{@Ä I1ÇÛm³µW]½3>xº}rùðÍ׫G—õ»ûO¾[¿ûõé‹ßìÞÿyet¢å»Fi\ìŸ?ûB­L­æ^ÿðÕÆÅ[€üðD¯MÅB7ߘ>÷ëûŸý2ÂåRÕ]©¸aµŽw.¹uùËâàd²yþÿú¿^~øUª6- Án÷?üü·¿üÇÿö‡ÿô}ó·ÿvçÙ7?þé?¾ûÕ?š³} ÖöœÁÝÑñûÓW˜ÞýŽ4{¼^ëÁà×·ý¸áÃR¨\ˆK%¹¶ßÞûÔhì&%§3=áͦìLRõM¡83ÉÙÃæÆåѳ_1éªê´´â¶§ýÏRÓ„Øç/—¶xg5T$«ŠðhkÏ|Üœ%½I­^ž³f+H™¸Þ}VÛ|$•Ö„ü˜µÛzÖ…&Æ!\Ĥ cTØt‹Ë´ä|Ÿ1 دó7ÅþF.ÓR–/&DAMÒý(aÀ¥—r½“ R:‘ªÊ•­üð—P©:§–8­„I%×÷#êb€%ä’š1f(ld˜´n,£¥IÞI°6ÀEœÎ¸Â,áÙÌÀ„Bˆyøçrˆ™ó aÞO¤B~¶cŽVN•Ç¥ñiœÏçJlsʘ³ºªU6’R¥õ\kßnïÒ©œ`:r¾…É9¥¸¦Õ÷€ ÁçÐZ3]ÚÊT7]Àþ )A›Bó%¤9wâúR "AeX½…°6ˆm5›Ó»û@¾¿¨¬0VÉ(ÆG/ìÖF¡³‘m®ÓF srv æ†Fi‚+E§»W™œ +Ù6i´"(#åšF¡[èlÕ‰× +ƒ£±ªl öž¶¦ç¹rw8Þzóáûñá=ÕiöÜ{û«§_ÿîÕwzþíž|õ×Ç/¾X;º÷òý·ç/¾í>¹øä7ý“wÃÓF/ +ÃÛI¹)?ùÅߎ_Þô‹a†Ôk‚3±‡ê[Ï)½*è¥÷ßþAÍv¸æ½¹[˜ÜÛ¸ûõÞÓz§Ÿƒ¹xôöóïÿ¶±qU«|~‚™=ܵ·^>ÿmuóI‚Ï>~ó‹úêÙJB¬v#zŒ/áZ»1}]É ëwWO?…@-¯ž³Ù^L(0鎖Ö.Èt;€IJ®~’5ëp-b\S+JqÜ;xõä»iï<†4O•×Áz"³ÆD‹…s˜œ3f“Ó+™ÚN§²þL©îá©Vœ¦îCq–rkAÌd0*kéæ›îB„xQy,ôB¥šˆPpEE 0‡·¼ä¼ŸZsËn+èµed¶ŽÃO]÷A&+—¦©Æ®ZÛ‹«¢3öc–j•q%玳 !M›õLë 7¸°ûç\®/XÕlm¤û!BÑKkåéea|¿²öˆ6Za8‹ç +’†Ý±ò=œ›sÇn¹bK +X˜”ë¸Xa”jcõ<©ä9³¦—ÇÅÕ3¹2eíŒIyõ¡å} ªmö²ÝÛÙþYÏ+."¢'¤Ù„2¥³”VU # +…Ý…¬÷!Òrˆ"%'””¼ .Áe0ÎRõ\¾Ø.6Vy£¨eªÍÑNwû¤±¶“kOåBW­MìÞnuõ`t| 04ܺs÷í£Ûo`$U»MÉN‚Öâ—/õöï¼)US…i¶¶k”×ÅÜ8Îg#IZN™GwŸ¢|Ž2zý°²ú`ãÞ—»¾Z=û̬o‹©Â§ï¿û·ÿþÿî>x›m{páLŸuο}ôÅ?î?üymrh_ýæo÷|ð&S AN*ídG÷[;/o¿úC¶s`—ÆŸ~ùãÃÏ\ATn 1Óýõóoÿpöùßê­ÃúðèÝoþ¥<: b© © W×.w.¿{ôó¿ë¼ÑÊÛ÷_ý*ß9¼¶‚Ü\AV"b‚+QZ³Ð9œ¿Œúã—_þîŸþFoàÖP®Hå]­~´óø×'oþ¦<¹LÐÙgïþúé‡ßZµ)Œù\€„Ì +b:Ê—Øôø–[ôÓ§wÞ<~õMÓ~rÓ÷“Þ?¿ê¿²ˆ)ð<‡1*Þ¯½~ÁZmÑÑf 87.Ì63¢µ@V’K§ò(•ŠÒ¦””òºÝ;mo>\¿x«Õ·¬Yhïéµ­ 3[fåAÔåïGZÎIF9šäýŒt”ðÄØ„\DÔjh¶Ä¯†È?&+ÙŽÝÞ©í<Þ¾üfõîç̓7VçÌàc„¢äºQ°²œ¤¿•ÂII5œÎ!‘jÄÙœ]]‡C +jJ¯Ä•e…HD6[ ìLÍu å%³IKÅ0¦'+SæSB±ÝQ—²´Q‘òÝîÞ£í{o'Ç/ôÒØ®­Õ):³…)]gäJ´&EÛæýDèã#Œ©£¬™ -(BªB‹9B°ƒÉ.—ÙTå2¨`“j^`·²¥awrTúìifw÷YeíNº±&dj‚YLeŠ†]Aô¢ÊRˆeµª`µHµ„pé®DP‘WKVuƒËM¼I#Ý<°»ÇZqµ¿ûxõìuiõìJcttïÓÜÆ„B¶µ›nnk¥ o7¡”¡œ#M~Ö×+¿à§I•ªzy'Ý8”³#Z-*F¾ÖÝènœÁ/Xƒ3³wVÙzQÝx’mïCå'”F)ÛÇO¶Î_ƒï+¨‚©–f·aE³å 3PÓtëÓ¿}÷íL»¶’\Œ(ÒI=»wn·R™Ú¯þøÏŸ~ý;w¹¾÷Äd0ÿ¹áÃÖÉç!ËÊ9»2BÙ4 \)Õ5ð~íÍ{•Ñ1¦D-¿¾ÿ°2Øà©(•æ3=R«Qj1Š Þ0îòÇ£ BµH‰ $­• +käYïuÒhS’=Ù8;¸û™ÕØœžÙØ1G ©L*$o ©b0Î…b’Í|Ukzq ¸ €…KŠÙ’õZ«09xbÒqÞNðvKy£üì˜%;ßÚôDyáE¹`L†¾Ðʤš‡À6ä¬JŒÑŒò¸<>³š‡jq£µþȪmÇ«=>©ô÷ƒ¨ +<¥ÌWðãy„o +ÖÉF5³¨çz®08IÍ?£0=LؘTŽpÂÊÌ™´p¥š*M͘ò`¨‚˜JÎfOçaHÞL²F’³ÑÏÂÅàGÀa w é Ó¾(D ³}«ƒJe?"8í­tk#L(„”í&“*KVÝÈ6„T>cx­èÔ'QŒ £4ÂØr¦Å58\Ç&fS¹ÀÀOâ˜"©YFÊÅI#JWݳ}\.âÊlE$!X­¬fê8cø"Ô‚+ž¯Îfn,ÅæVo'hl¾WiïB„Ï»ŸŽ1%,ÕBår‚Ëâ¢N +Jµ»ª;­ë.t¶.¬¼ÝÚ~:<}×;|BU”6 >“ ”R4¶.ÙœU3Ê#£4¢Ô‚b«DðVUH±ç ‡p–;D ¤Oò(ΊJ +#)VÒÑ2jcʪÇ8;JéšYÞ?~tþø½l× UíÆ^}õ±U?Jò¹8&†b4œT SÆŒáJœÐ0Þ&” +Ÿ2j!tݬžŸ¿xñÅÀå8kEq=¦——áP®~ÏåØ¡¬–ò!r×µ ËÙ$g”z{ùÞAº±kT·´Â:£7ã´e8}½0„¸B¸¬UÝ̶Î0m¡D´eo"Å$-Ëiù+óÁëKQwTÀÄ*©¶¾!2ÀbéÚ&ªƒQ‰³y¨ºa2ã0ÆPc”±äFÂq.ìÀæ½(’_ŽÃØ Ê¤V|H*ÝÊ•×ÊŠcZœ41ÞC +'EðŸf¹ïŽPE9Ø-ÇÈÆè„Eq +¼o­E£q4Éè˜ààR>Jž( Fw%@éÚ|hÙ‹%#bp½h#‘TQ.Ž«ÝÍ;²U#<)å“œ“䲄è@.y +aOÇisÑ“Xô&#I=IgÌ|ÛÈ5e½ŠR€Á¿¼á»¶½¹_š-ƒ%ÝaŠOeQF[$¯,„˜T]ÊöS``jkR¶çŽÐ»àC¯Ì¹C1<Á¤Â„ÌÈ™Zo3×XSsm„1‚í +!þ8OH Y”ÑÊjuzg.H.ú‹îÈ’'‚‘<Ëkz¶BË–YlÐfÑŸy-ßî”êø&ÃT¥œ6xŒÍ,¨@Bˆ$eQ¯ª™ÂèÞˆÑ!„‹&wˆEHËÌ6ëÝÍRwäS©lr9€ªð‡¡B@^]ˆ.yñ(6;µKwB‰0yÚèʹIª8U^ —4³4Ù{(ØMpq‚ÝOWÖK½C½8Òi_œ#¥,¥äf3ë00 +ØÅ8&#¤HÐËÞ¨7˜H’r,)„Q Œ«”ész"!„© Jn 5‡6†FõDÊŽ£à)ãQzÁ !<$p½b7hµ°$®-=ätûÎÉý·—ñ„ˆ`”‰!’¨„Ç”YpÅJ£å, Ôg—pJ¢Xcµh÷úƒH§X¢…MU)µ2{N†¡1îÊuÇOzÄâRôÖ\p~1ê@òj´“õ2ø§Üº}ÿ5)åÜA*¡ª„Q%ŠÊ$›I`ÚŠ/iæGéÒz×1Ρò’ûéuÿJá:ÏÕ[œ5Xµà²¾½ æVâœ(¡qr£Ó‘„ÀH1=¸éŽÿlÎ÷—7Ý×CJºJ‰†™vνJ9-W”  r‚µ¥Léí¤TváÐsw_õÇÿÉGhveñÆb ‚ð‚šW­’™¯‰júüá«­³çA\Zð"¾8ïrÞ‡ó£Xb*“É7 +í]^ob.ÉÏR•‘-”`^‘õRŒ#(MЫ[…>!Á‰“Pˆx3_ŒÒ¢¥½ <‚Ò¢^“Ò“0fúQuΛ€SŽÍ&ð—Iʼn´’VŒ†aÂ{ÂP„“œœ©;ý£›Ž`J•@ à%£¢ÙMW„¼éŠº# 4%äc¸êãp$ÙbÍq +pnþHÒ žëÅQ¡øñN‹HÊùúø$]BÅ€2õÿ‘ôæ_nœçïqÏLbGÉ&Ù{cßQ(Ô¾/¨B¡ +…}ßh ôÆîf7»›û&‘%R›µY¶lɶKŠåDž‰;v¼&c;ÉIf<™¹3sϹsçÜ_ïÏ9uxI,…÷}žï÷ó- Þ¦d*JjqÞæ´:B™0ìf¶“.ô|a $f.!¸Œâ¢7sxCF¦pxã^ã¦g|s¯§œç/ú@aÖ»‡¢r‡Äšô1¯/<»à¾0çvûà U-æír)'ç·V`\¦`aÞ‹ ÁÙÅh8&yƒÜùï3gæŸyvÞé¥i¹L +9ˆ!é„ntEÔËPÒÁ(õ¬5»yöÜÒ¹ ®¹…€Ë‹‘¼F¥EGxz>°àBÝ!Íi»‚üÔŒ÷Ü«äc”~~Ö;»uø¨8c(z9Nè.3=‡ø‚ì¤;f³®˜?âÉ-y¢8Í4Á D!—jô»q÷ÇqÅÌê]=Sˆ ²7‰D#‰¤Y¨/kùö³Óž óoÔ*£ë6Bb«åÜêÎN"WZ ¡³ž˜Q:AI‰d:el;omn®>xé•jo|q)paÑwaÞSËqš¦ +¢ GTU²íÃ.Ï¢Ïï&ˆ¨eÉÅ’yåpëòÉ~ïÒj®™S ™O$B¤2<ÙíׇN祄’T…„¤iœ5­Õ سàÃ[dËboÈé«ØE9=Œqá8ïSsþ/L9]Q)Êd/.Faèœ^DP¬JkØßØâedÞ„qUÔ¡w*¸œŽrF¾¹*¤Ê\²LÈÙ%?î2!ÇH4‚K†Q!5B*¼Ér2G“™´žÐ“¬ ÊŠLà1‚ˆQÒnçWÇ’U$ƒQTDð„?"xC\(&¡„Š²^Ÿ×ïsù|I’Åô¨‘Ý[«ß>^¿²öêk.í¤£äÂ÷ádrv1òGÏÌž¹èvzIЧ3 “$NkJBUQ”CÌBÌñC!ñE³!0œ¥èo„žšu?sfö¹sŽ‹séÉGáyñÜ…Ð3çýgg‚‹nÜå#]ž¨/ˆ¤²¥ÊDJRì@˜ŸÀè4%d=È™‹Ž‹ñ¡`Üçqx@“cÕ¼°Òµ×Ö›•¦)$Zôé¥Þý›»;—úµšY-§´-jÙùç¦æç=Á`Tb9'yÌ›VÑq¿P©[²Î‰š(§ šgR¦T©$Ö—­§Žž¼tíá½ÝG/k…‹ ž‹‹`”yQ¨j|¬WMŽWòZÂÖÑNYÝ[->}xÇwß¿ÿë¿úÚOÿæÓ¯}ðdk³š²XFäP>3Ù<KÑl2c§us¹›ï¶ I•·Ó&Å N_Ðç(’X«—Û+ííÇo~µÐxÑØ’™^x½b8³ŠççƒgÎLÅQÄJ¥*•r.ŸGÁðdi^®×ÊWoÞjöŠiŽ÷·ÍB>€îN«6&¥ÕLeU‰0‡mÙÅb5•Ôr)1§aûãÚñåµåV¾žS/ ‹/ÞßíÅã÷ß¼óÆËWïß>[VÚŒ†‘@õøq”0@“qRÄPŒg°’Íwªz«¢ºÖÉ8ûèJã‡Ûß|ûêGo^ýÝÏ¿÷ËŸüÙÛ/Ÿî¯7›UQÂQ<¹£â¬E²©(”fÉër-« ¾_77…•NqgcùÞ­Ãë§ãw÷Þ|rãÕ—^¸v|­Yoši“çé`00=çõé9'zn&0ïÄÎN9ÎN-ÍÎ{}>$à 4‘1ÔV£¤«‚Äåb¶T*˜)Û2ó‘ýÜù%hX·/ úy,¨®j +¹2J½tµ{ÿ¸÷èæ胷oçk¾öÆá/¯ýöûOþé—ßü7¿úå7nímmÛF Öáòzœ‹xÈe H?‹õs¡v}Ó¼uX¿º_ƒãÎÉò£ëý7^ØxóÑúO·ûÃ/ÿŸ¿úè»_¿õÂQ9›Ä\÷‚+ŒQ2N‰Hac–õ„kkêÓ«Õ_¹ôÞ‹ëï<\ùðÕ­Ÿ}ïåúÕG?ûîÃ_~÷ùúé»ÿó¿ýê/?yúæ£Ýë‡Ýl֎ƸP„ÁʘJ-/ntŒ£ÕôJ _­Ñ­<½Þ³ÇƒÜÖJöÖåÎW_;ùͯþÍÏñý?xõÉÃÃýUèE—ÓˆûQqjÞûÌÙ‹~ç’ÎE,É(1u뜯SRFm ZãpÕzûÉ•·^½ùôÑñ·Þ»ÿÃÏ¿ñúkËUk¸¾º¼u:<|Ê¥ê!Ÿ[ab)m¤ˆ++ÆË×zŽ›Ç+ê«·ºóù›?ýü÷_ÚýÆ“ñßýðù‡Ï~ÿ›ïüøÛw~ÿów~üÉó'›9• }‡3‹Ã€ $â5Xÿ¨D?8(þù×oþô/Þøôëw¿òxôñ—¶ÿêÛw~÷ãwþúãçüÍë¿ÿå»ÿøÿþ¸ó褾¿^ÍXZ6›•µ¬’,2 ›£­t|³&ÜÛ-¼õüÆ+×ZO¯7¾÷áÝ_ýèýßÿã_þægýòó§ÿýwþÿÏ?þîçßyz£ûé»Ç?ûüõ÷ž^IªÃ½0r)‚Q‚_4àŽ‡œ"Åa‰¹¹]¼±[=™×63On ?ûè•Þ¸úÁÛÏ¿ùÊCËLûclY/$˜~ŽÜkq/lú/ÿÙßýàíßýèÝùí'?þ³'GÛ­ÁhÕ®‚¸š6í’¥t2Ì^ƒ‚§øpð³ïÜýÛï=ú‹¯÷½+?þøáþõ7~þÙãÏß?þéÇ÷þÓ/¾úëOŸÿôI÷ÃjWJ!Å3477ï=óÜ\Èå2?ƒœ.Kw·í§7Zï?ÞúÉŸ=ùç_¼ÿïÿú­¿ÿá—þþGoþô;÷~ú­kùåí÷ï7n¬'Û*%cX,Ê:Æ$“fµÓîû¥~åñCþkV¾÷•Ó~tûߺþóï=øû¿~ë~òî/>{ô‹NÿáûþÓß¼þ›ï?üôKkïÝ*<9mVrz LãBZµbªjQm›8%쥞ÙïÜ®úÎþoþòé/>{ágŸÜÿÿá{ÿã?þåwß=úîWï¼üÂ!Ó!„IBöÈ4iYøF…¾6Ô^=m}òæåÏß¿ù£oÜù—_~ãýןýãÞú«o|ýå½KëÕT‚!p"Š ¢VPôB"ak<›•c«eùêZù…Ëõ'Ç¥ïùðïþâ•ßýøß|ýò7_^û‹w÷ÿú£;¿såÑÕÎѸQ¯Öe£ÈªˆHÅ&ŽbæKétF"º6u4´OV3·73_¹ßûÁ7~þÙÓÏ¿~û»ïødÿÍ›+oœ¶Ÿß+o-'k@Ú¦h©¢™m†r©D&AçUb­ª<:j~òÆî?8ýÕ÷þí÷_ýÝÞúçŸø7Ÿ<øÙ·oüþ§oþËÏÞýÕŸž~öjóéIiX‘0$àòÇT£žÉDÉT¼–$ZlÕ +ß[WÞ¸QûNçÛ¯]ú/ÿî¿ÿõ¿ýákÿôó÷þå·ßùÉŸ=þÎÛ‡ï?ÙYä-‰s©•,Uzϧdj»›éeðQ9êpöŠoÞ>½¶üà öõ£_|úè'?þôÍÃo½4~ûöðúZ~µ¢êJSJ$€d¦ç‚JÑH@'ým“ÜéÚ‡kÕƒAñÖvýåÓÖ[wFï<¿õÖý­ã~êd9y¥o­Ö¡×è8Šâ€ù9C‰Y1Q”ät)—/¤Ô¼Æm63'«•«ÃôÛ·—?ùÒÎ/?¹õÏóö?º÷§O7¿ýÒèÃÌK[©§•Íª¬â<‡€#§m9¼X!ñH@#C ߪËÇËüã}ûõÓÊ7_ZûÝßøŸ¿ÿóþÅ{¿þüõ?}ãƵq£WÉôzP5„²á` Ïh|Åäzyy³™:—olW^¼Òþ蕃ï¼}퇛÷/·ú OtÌåu/8ž(ŸÊ¯”ÚûFnÀóº@’µŒqe{õæñV7G]¯\ëó­î¯ÞÚ©Ãs÷W2í¢nj¼¦&0&å‹'ý¸ãó”Z"•¢•ïhšÉ 1…&ó†š7¤²)ŒÛöéFýÖ¥ÞõÖåQyPÍõK¹NÎ25 !Pã®0½ä1.‡àŠ× +x½ñpX¥™n©¸3¨]]Ͻp)÷áKŸ¿õO_»ôƒoÜÿÁ÷þâ+Ÿ½±÷§/o¿wù憩ó$ 8ÕSP&P)g€F¢T1mæl‹ ¶ÍØåž~}Õº·•ùì­Ãÿü·ßþ¿þæO?}ü½¯ÞyýÞøÖAs­—Iè*¯T{åÒ(g„PŽãõF¹™V¸¼FW,!¯2å¤Ø/Y½œ>Ìñ×Ö +ÏOÖª­[ÒeS–šCQÆ`g]ÔÔ\lz 2S†Œãx8Ä¢1K× +»œÉTm3£²–HgU¾lJU±hJ”ªÕ>$ôH\ÄÅty= ÓåÃCa‚gåB¶º:Ú_í­ÕRÊF5yg§¾S“¯¯—V +Û5m§®¯•“«e³¬ ÞùY§#ˆ©„T bÉ©ÙÀŸœY˜÷Dü!…¦mE¨™rNŠõsü¸*ß\·ß¾·öå¶^:ê&CS(¥$Ëjy«8º‡qˆç<Á±|B’'Ér¢V­³FÎ’s¦¨+Œ¢ð¢šˆ³R€’æüñi'â«t¢¬¹éE$Z°äÉwyål¡  ©@Ë45ÅÒCóþ`Ì"ýÚ¦ç½ø¬Ñ™deר_¤<¯—pVG1NV3Ñ m"ŠF§³Ùïï´ZkFÒ‚è=¨&+Þ0~fÖ±¤t6®¶½%&­OÏ:gçÝqf%-adRz­ZíæN·ê—úé“ÊÕ­åq»Ø+$;y«d¥üÈ™é%Gproûwì™ï´‡Œ 0Ä[ÅÆn®Øgi:!`%ƒËÉXVŒíõŠOïž¼òàæÕ½ñz«aªEâQÇÄt4dj1"pöJap«Ð»‘)¬³\r4Ú¹zó¥Ê9–B©èz>›­KmÛ*qŒðá¨<·ˆLÍ„f]¤³\ˆîŒ¨!¤å¼×‘@›sÆ<(¹/*„1hL g-œ®@(õ†9R°£d2ÎfÙTWÎœQù S.§ŸFð$FJªÁé”JÅP*­^i†=¤j§í†*§0„Šc2J¨‹.ôì´?D¤â\~ÁCþë/Î~áÙù™Åh4.«ª™Ð2±C0žtI¥‘ˆ„Ee:.3tBJ&äœÓ‰Î¹1ÞêÛË×”ÜHÊŒ*£S9× +™‚ÕI7ŒÚvŒOEQPÒþæ¬9»œ px²+ä7„Ì‘¨ÇÄ­”«'”Ùž‹ª!~rSF„˹cZOÆIÍáõ@'"´M%q±ÀS~Âð¢õ‡·çCü|HZ K&#˜-%ÓSµd®CJx«UC”a3„Ö õ&k4¤l_´;´š¥õjÉz0݇'=q#ÌdBTÚ•BDåMN/SJŽ3êza˜ÈöäT5Žó$+IšÍªùi§ßáGƒ˜Î}©|â óêÜBøÙ¹ÀBX seÖì»qÎGÌy'kòclÂu$‚‰‚–­ôcŒæÇ'·'ãb)H¦¤åB•çæ&Ë_ ÑëVýS›.4åFd?®©ù‘VX›u®ãÒ´Ve­®ŸL;‘„3h­#³f=LL¨Ø­#13bR½››ñ .ˉ6§d òcj].oiͽìò¹4°YGTŠ1f¥LˆExk9;ÒË»fý²ZÙ›‰$žsàg–PwlrÓÐ=·pa)F§–µÖ•TëPÌ®¹"êÙé 7,.ù…/Nù§–Ð0—çÒ«Zù²h¯¹Pc1¢žw‹>ç¬P\=7 géÂlÐá£"¤!ê5VÊÎ-î—¢øäû,gDZ +KQÅKÙnÜü³KRy;ª”p%·~é^eõ$(fQ­ ”QcÍ–œT×®;pÙ…Jq¥(ä!±Ï 09ÊZ)ö¯ï?ÿ5³³ÎK:1‹Én)µc*½†H/¦-MnKO‘øv,@Y!¶@›#!7¦R=6CZqÆÜð“)T®ñ™•Dy1;a.£äVìÖ>¥U9£OTÉôÀè^M´Ž”êŽ]!µJmã>™ìx1•6&ÛiqÙ!–l‡¤JD®ˆ€-«7‡‡C|梗p"J\©ù3,¥ê'M9Õ¬ Nky²–¸Ñ Iõ¨Ò!5'š +Piw\› Ò A҇ʌV£R£˜Xw…xO˜çô&®5|¤ çŸlîÃÅ´nLëø¡ÈqS«Ðk~L'”²'>Yd;Ìeã‰zDªÍFµ)'ãmW”›q£ž˜ì§Ò¤Ö”®ÂàP©JhMÁ.„Da™bD¨˜<ªLî²™rbqÞœ|e¹f]1IÔ"‰FT©sö€2Z.¤-hí¹h¡,UèìXªìIÅKç–ˆY/‹ÉUR«¹±dÊy±¬'nƒ8GØœ7žœv“Q±(eW¥Ìª7g¼ÔRTCµ‘ZSmLº°ˆ|ñ‚oÖ‰z"b²]ˆæà OL‰P©gd +WÌùÜ:]£2kQ©zn>7–1½•,­í]#×?pQɘ Àü× ;&˹§—'?¶©¬«¥‘W¦#üR܈':¹•;¹õÌåkÑɲ±‘ls¹1—ߊª­_‚ñ *Û|näÂ’NTc¬µ~"–ö c²Y€¶áÈÔ²ŸN¹Q•H6Åü(ÕºlwŽ­Öe­²e”7ׯLÑc¬a¢r)YßOÖ.-%ÚXf¬U2Ù‡÷r“éÔ8ïå=„­–vbbù‚ 0é¸Þ¤ì!™^ëmš˜l„š] ò%P`ø€a©"¶0c™ÍmÄSaÓÖP«ìΡ,Õ•ƒfײ«QðÒöŸ¹¢úœ—¬Ü‹&@6µÚ^\ë.øé9/µ’¡ï@÷ž™r|ñ¼ûÙ%ÜMæsEÈ®ãZkÑÇ:B•€6©yIËC¥ý´ íƤ0љΉݾ ‚³˜^‹kÁ&ôi-³P„fW¯Œ +Ç|¦·ˆ*¤Õ ƒ°yD©8™‚Oj„“l)Åu'ž„á¥í¡XÜʯÞï_y»²õ¢Ë‡ØùÑÊÎ]^œ 2Q±ÁfÆF÷šÑ¿N§{¢YÓkã¸Ñ¤­”(itèt_«ï©å1’(I…•ñ­·WŸN–j²…­ˆT…~/÷.¯>ž ±d²i÷®fVî6^H¯Ü ²k±¢–ÆÝý—Ò#'¢kåíÁå—š;ÏWÇ÷G'op…qH(Äþ°k-ªBÁ iÝ'W²k/&Z'®bÓ Û„Õ™ò±Ka•ê¼½ÅçvÔêÑ:Ðm¶õËbyÎmæ×îÕv^œ¬ê“Û(¬ÜbÒP&™¬Sé!¿&•¶I{ÃMnvS2+Ýí{11ïDT¨+!3Lu®Ñ™ <³UÛÎX2ÓÌô¯.ñú8³´Ñؼ7䧜 +³V< Ó#ÜMmG¤æ/oäV®ÝGJµþÕ3 qÀ3¹´_?ßú*x#¢?ÿU%¿êÄtžŠC?ñÓYð&¥rPX}¸yóƒáÉ—³}éèAyxH&k‚ÝUKùþ•Òèziý–ÞÞ§’õlû¼L(žjBkƒ ‚±B›ˆÅÍôò)ªV#RÌÎìÜÈ­½XÜ~ÑÝÂS-=;X;~E«mø9K,l¤ÚW–÷ïß~{ïù¯×·î'ŠkáIuõ”·û©æ~iýnª}œ]>^ÞqóÖ[Fc­:8ên?äóëP·QµrðFq­'•v‰d‡³Zñ Òìxéô$k·)Pl{µ4~¡søÔ¤X'š—»—÷O¿d®Ü‰}™v&ŸY¶ûG‹q–±[1½›C81½y™Î¬s^ðQ¡ÀZ=ÊlàvÏnqÅKJuO«nû)#@j™Ö.—îà‰¢Z^ËïíýTsÏêYým*•e2Ë#¹º­5¯°Å= ‡tïT,¬-!r¡¥¼q—Ëoˆù 0P¼˜R×Ë[ÇO°D5&—/=òò·Öo¿ÓØ{œÞ–r#Ô»Ço>ùŽ3‚l6QÜ(¯ß+mÜ/nÜίßõ3ùÓûï,oÞ +S&*åók·[{O; k/T¶ŸbÉþŒ_”ª—0äÒ¦TÙáK›ñÔdpÀ€(λX?aCg¡jkÊ»àÁ¦\d€.àzIõEkà‹ÏNû ¡§bj;,VcrÃZÓnu^KëAÞ. ¯[­ƒæÆK7_ëyü~¢¼ h4„Ò®T»œ]½»y÷ýÞÁS­¸¹uúZóÒƒ¸ÙTš{tq5W¹âžÞ¼–Þ%Ì>¥•O¼×Ú¼?¹Û‘ÍE-Dï`©nL®fZGÅå“õƒ»­­;Q­‹O¶¥^qCKrYPÚæîÉlò¶Qß´zGzóRvp5QÛø1»P¥{^ÊÂf²}hõoZƒ;ÅñKéþ->»ttÿííÀ~m€«É»ýlÿz²¾'ç‡@°q¹ØÛ½ßß½¯—AíWØÌŠZ\Ï´vv®½¾zðÈ×yk¹µu¯{øDªïOnx·‡TjyÿÆkvuÍ“'w¼ŽÓËjaMÌm`æh1nÍe&Ù ©êøîÚí¯4®¼®/_KõNŒÎ1n®ÍT6Ùi­Ý$Ôº/.†)ÃOÅ„:®u|˜unõÆuJïú)û¼›qÆR¤> ôX؃p +¦A;"‚L΃%ãry²€<"yi+*—9kÕm)?Â’ ?¡Qj PJ-o¤Z{´Ù…Gö7èÜê¹% J«0¼™Þe²£ˆ\Z&—JÕ•klª‰Ë…òúÍÖÞcÿþákËG_*ŽŸ'ÒÝkU7n! ÅÙÜÍY6ëÛVëa4¢œ•ÈvõB;ÓÚÐk›ÐÝX²E'KVmCÊögž¨ÃS|lÊËlnE©ì&ª{zu[-ü”ÎõË÷¾²zã¹v)Q»d‚ªØ=V¯¯l߈ˆ¥ìènzpOk¤Vî³…=¨¢…ˆdæWv¯¿b·wŸ]B"By’Ó—¯)µKJi3YZ¯t÷ßøòÇ^ÿÈA¤=t6–è +¥½ÆÞÓÕ;–wŸB\Ý=~ôæ‡ßÏvö±TÜZ‹™¨¹ž_{¡wõ=³wê# µ¸*Vÿ°ºo`5"”H½c€:,iÔw cÎú¨¥ˆˆª *·•h^O4ŽPµá²ÅááòåçÁM¦¼ôRL%šFûj²²£—Æ|ª³ä¢t¨ŒÃL~> A]ðp a-ÄäÍú•\ï•ì¦ë;4f:#Š1f’+–¢RƒDe?̘)³ }çÆtò0òx²KÙ£ XñÐv„·i£îˆ+D²n´öµ¥¸ Èå"|ŽJu˜T'U§›Ûrqu!&ÇŬZ„8T2œÕ,“î€ÀbZ3¦V#ik…Hu—b:'US+Ï+c.»ÆçÇQ¥}¸÷0ÛÚ…øï¡2Q¹fwN—^­mÜÉ÷Ž¬ú&¤ˆ×Þý¤>ºáãÊjã²±·ˆÏxy µÒðnªqÑ/È–™•'oÿé¥Ó—Î̆Ï.aN²•ZÉò^ª¼ ¾‰‹9>· +) F5@¼ÝC•f‚r#®w’õ+‰ÊA¢ºò8Ì;euñd;,•CbÕÛ ÛÝGlnxÁO¡r”$¦ÕõÆ."—ƒL&ÄeâJÑl_&ô:È”TXךöàVeûñÚµ·ò«7ƒ\×*Jiu1,ùq3Ä;5BBQêX²ég 5Û¦ŒÆª¹Âj8âI`*HÖ€¯ˆZƒ_;|H§š@Å”ÕgrëPá˜\L7öz‡/{©4"ä¡h1¹ +]¯WÇriÍ;ÙzÏdR-?•Z +ó¸VU³ËåÞžhw/x˜óv!šñEä—6bŒÎ›M³¹ÝÚº]ߺ«7¶'¥TÙôÊRT)ó9µ¼U?ß»ü•Ýva™Ÿ å‡jiÝE$/úé/툈Øàs[Byw‘}¸^]D? +³?•†¨kÕrÝëfó"¡—Ê©Õ=Â而¸qïEd»´>>y¥¼z5Ê¥A¾ ö‡¦¶}LÖKP•*ƒ»¶ÚÈX±´îžÔ·êÍ+NÜ^ˆjz¹::.FÅ*‘Z†°Á0QÚ,®\׊!25߬/ïÿa%g9ÈÚ³j[Ï·v_Œð%P?W4cò[ ÊT_Œ(6˘=Áj§ +ýØän2ž±†zóă&}ô¬#î‹È8gŵVLm†„rT(©¥5. sLLöWåGw!ŽqÙUgLõÆÔÉrîTJÈÿ÷éewÊ€Žk·‰TgÚ&U ñ¹ŸÃÓ½ ˜wÏ*½º@“‹ }ù•«reK(® ¥5­¾Éä†. ñŸ/¬;¢ÐD-"5 ÓC4Ñ pEiA‡æ»ûzmËËØQð}*á‹àÈ ön²b<ŸÕ6ï¹qN¬´ršî\Ìàí¡VÞ‚zvã)2Qe’Ér|”M™ËTfB¢6üfMÅ^–2½… 9çÇ!fžwQ~:E+•¶cB£“ÝÁ~gãWL-Ç´FD©[1©‘h,EF+k¥U!ÓUrpÚ/[^ŠB*Og[‡Bn8d|x"LÛŽ¨†Ju&½« a úÊZ>RwË näG·…ÜL´”_Åô:ž(å:û…•«~ÆôÒ)k‚¿¯ž¼¶sç½ÊöC¦0vÇBµæe?›)öÐ.9¿¾~ôruõD. k0«8Q + 8$®µáõÓÝ«…ñ#€\ÌäZ[r¶‡ˆÅW€¢Š'šœµ +„ë‚ Ie\oS05öÀMÛóˆ ÌLsO0»gçýgæ¼s¸ÎÄŠ—ÍÁ´"TJÏôÐf,‘ê3Ùu¾¸ P烧‡¤%ˆ=í½¼âFE/¡-Å“a¾¢/ñÙ1Lët‡^“ÁÄây7µM¸ +–¤êG¹î5³±ÎG¨t¾{µ=ä–"²#–—¤¬QTmFäÊR€®Žíú¶ÓÝq¨"k)¢Îú9B­ª¹áœ¸à@þ÷úÏ‘ÉGι k6:ÙèG+®ëÅ 7ªUÖomê­ËBn™¬Ì)ϸq„Ô•t jÞ(ˆ0YùG-nM4לíÎÆ©Yê£l’Ð+nÒFm¥¸E$ÚQ¶pq óP©òF®wpÑC/„i7}nƒÒ•óc)·î‹'— ;¹Û«ÂÍG굉§¨/a…Ø h´ØÐŒ=¤3¨µÕza©âÆ4  vE„ÍÇÕ&›Û”kW˜ÌªWæBd(Ú¬J1.•i£.—¶ò+× «wP½³Ø[JV·2½Ã彃ƒ‡‰Ú6’¨gWªÛ÷„òæ…F¯•÷)haDš0D%;¨¬Þôâ)˜!·šì\O÷®n¡Z;È}¤ã³ðŽ~L‘m,«åÝêú½Bÿ:k.{cÚG£r-‡Zå„ Îç·@ú@üTf1,{ñ$Ô¶#*Kùqvx+3¼ž[½›hžøø +D9»\^ók!¨a³j&=‚§Ov—£ ³8Ø»ñZT,Í„$ˆáˆÒˆˆe¥´«VÀg¦½tˆÎqæ +¦¶1µÅÙëÓ/xé3sHŒ,›SJ^ÜðÅ ™&ˆP„|:<1¹µ~š¬¬9P…µ–S­#¥´ÅZ#øç?ÿÜlø¼#N*å©…h”³µÊfatûÒÃï´ö_²£ó‹Q„-ö¤ì*¤r)"¤a@2TzÚCNä‘Ê‹ ü¹…-ü/¦)9¥$R± µÆƒ3ã!ÿä‚ïϺç= BgH¥´¦g}xˆN/E DS¤Ö&õ¶³/:ˆm"Œ1ëB.Î#32&€‡2Έ0Y+Ãè‹ùm€@€UW<O4 ;¡eÐD“4–åKZýÉõìRÜO†˜ "æ#R‘µW¤âO¶Â\Ú@]4D(”^…\iO¾£y©¸qß˧}d˜”y-/$KŒQ%’5HÅá͵›_άßDÌ®ŸÍ±F‹ñĘÞÊõ¯ïÜüêøúûùµG AчȒݣ­å0Ÿ‡Ú#Œ>–\1[Wåüv€¶]a–7šœÙÃÕÊdç:;íå£*fôìåëRaOT2½¹´î!MP¶“§­Q²uªV!ΤY½¸¼ÿ"ø{@,Dõ6f¢zKv*k7ìö~”Ï(v7³| ®ÍfÆ̲ڠ¶ÝØ­¯"| zeà3Q³éa-‚µ]tSPBœÖX„D€é@øð¦bn#.5c`)ª©… Jo.xnFÄ*›'ê—ÍÖ•¨˜- ³vix×›~:kóÑ$|"¢B… |æÂb”RŠZ®Ï¥Ja=,gƒÜ¬g”‚h´–&7Íi|z…H´P±â',wvÊ3«ëõµ!*óì ˜÷g#”íòØ3Óþ¥ è‰j!6{v²>'ê‰I3©¨-@t> ÏûæÂ<–h@|(.ƒø<`JãŸ>V#|ʼnȎå¬Lûppüfnõftg'7'òQJEx+&ç«+7 IaFá’J +á"§I£I¥Z€FéÂ:ž]… Å¥{6åÃO¯lôwt÷^æŠ{.4…0v\*xqÍOšJa“K¯Ã(•25tÅS®°À鵸žv#nTÆMjFù¢PX‡^s9LÊÙ­í¨sÇõ¸Ú “Pr×’Ýk–0ït¢h5w©T{)¦Péa~íN{ÿåÉ7’ƒX¢'W[­¥˜ŽiËVçÚòÞ‹kǯÖwªÕm/ªjvw°{ߪo9i!,.„D¨m6ÕÃ…2BYóÞ¸lu +˧Э¾ jàŒé¨Ü˜üÐ"½ +(èAµLc?Û;!Í–솸â\P€yŒ‹À`1¥’j]’Nš=åŒ% B¦hœ51ÞD¹Tª²ÉXHO>̈ËUGD9³ˆ:Í7f½L°µk¡ÉšÒØ–Ÿ´ç|7ž Mt²A$jXª·F¤ Yïz~ø`²ß*r©*k6@µÂúòt<}Ñ/I©A¡uéÃ)aÖˆJ%HpåÕ;Zeg!ÂLûbZ§ÌcõBŒâOª¥Lç ·v·W‚bɃ›a®O´ü„$åbiN ÒdÉ… òlz+“=Å¢TܓʇxrårÓîØ3³^O\ŵÎBPv„Õ˜PbS]\­ŠéŽ`¶@°[{X²å RÀ¢Õ³*c6Ù˜öàΨ¼’‚L‘«3>îì:åÄ…T+ÓÚu!Òìd+ÓZ•ÑíêúBïÍxÙ(›î=¬®\ucFD(ƒoŠÙu1¿ÁXýɯ<$Ÿîi• ežqâ‹1=À• Ð=µ! ”Jò‰bk|ƒµû‹hòŒ‹ò%7a{¨¼XØ^ +Ó‹ˆ 7ÒÕKPϳ>îÙ™ðÙ…˜OƒøCiwâ>L³Ãdó2ToL®†˜übD|æbRs1”@…2›ßTd(2퉪ó^vÚI|9™M;/L¹Ÿ›ŽDé|„κcªU§=‹²K±ðÆDÕ¥¼QÛÎ-æúGù•©¸”áòd²`‡Õ:ªo½TX½Ÿê]bNÒIDÊøè$eö…â>fm²¹»}£Ð».ØÃÅ(¢ B¯…¸t6%ü”Ť:Ç+ÇÌø(g˜Ãä8i\kÒù TM6O2ƒÛˆÒôãÉBk[ÍõXr Õ—¤Ÿ‚]³Û§fçFD¨Á˜»cÀo5ÂXŒ¶€¨î¸á%Ó‰òvuóâ‘Æ•jX(Á|¹qzËøä†ÊÌŒãsùå“ÎþKa©9å¦gü Ћ”î¹Ú*‘ìÊåÃÎÞkÍ—µ>ëÇ$Óítc+€k +Lýä·+‡Rõ(,T€jÎ9b“ýS’­iqÞA&W7µSD¬ø0mÚ¹£!çÆ—üè†É LiÅÄ’7@dpµîÁ ø¯è•™L(HÉ÷qµxn>Š ÅD~#YÝ cny9W(%G+\À„¬Yë¥u½º‹é]?W:³ˆÏ¹±ðä'UÆ´ M 39Æè±ÖJ€H_p’r1rv}3¤¦–âÏÌÆæ":’\›7Íþu.ÕvøI=ÝÊu/CZü£©Ày'5Rý| ³Æbv{)À?7 •rstóÌLäÎyàa¡Æç7¼qº8@.C .U§õ®ØARsM–ÒJÊöŠVÙ¢S­gä<lÞƒ ê:_ÉfˆÏz‹Ë¬æÚ•!†˜®ÉåA“Lõ„üj¨^Œ¸ÖˆËµ¸O¶§#Ê´Ÿ 3)»BéDalõ®#Z;¢Ô=Lv.*;a¤r€/Ìx<Ñ!S#Dn†˜°ñb4qÑ |b)èbÎK¸PPõ$›ZÐ;й a%Êå½Dz&$‡ÄjTmÓÖ*$8nΆ¸)gJ² ¼!ÖŽ&:1­ ç/•¶gBüs È|‡éö‘é ›ÅôNTi‚¡Û­Ë‰òi´BDâXT,B.›j¼¬#ª2FÜ9@e§–ÐÉYXGL)-&½1”—¢*4cˆ2q17ç‰OV«Æ`äÓX¢ šbÖÇûHÇbTžö’!®D›C£u˜Á(gE/Ý^9IV|1y)È;%€éALƒcΉ¢l­¹þôÍH)3ççæ4c\øɉ .ù‰Æ[L..8W41çã“¢.&Œæ0®K´ÑD×ÏT.:ñg|Á‹‚ LþÅéðŒ—ã3“_dÉ¥"5ºà“¾p> ÌçK\²;ïg¥tŸ±FˆØp"“ØÝ„°®”åìJŒ³'‹Ÿàª3<É)A"Ik >=Pò«LªM$*„Vðàêdûx`ÁÏL;±å +²‚’·òƒ\muÖ¿èÄ&ôh›L.χ”óNò S.wT”'ŒÚ?¿€Fh;He I#lªëÌLè™)w„HÆ'»éésq)¤8BÒ’ŸûóÅu'’˜Z"P¾˜iíû©ÔBˆ‡¿žs@wØQ¾N9(-³|ó¥•tÿ™éÈÙE&ÈæL–BŒ;&ƒí†HªN ê*B›“uz¥­×p¥HÀ[m)·N¥ú“K.ˆì'’.DtDyðˆ“"r¡Z˜–ëjÕTsO«nâz}²g/†¨mGXŠr€XÈ&¤Ñ…ò1ðI­¥¨â§ÒFûªX>ä‹—™ìdw†›Šs0ñ ž’ó»\f›ÐûD²S“cç#ÞˆD©å¥°D'û\zŒÈmxePQÖÞ˜ÔŸR]€/™(Y ñ5Þ^Ò«Îŵæè(&™¢j7¤Lv®çÒ]ˆ™.T¹àƵ&ýáš$[€ÉÎOrê†ÏKjs2HTBläÔ‰SnnÖ/…˜"oðDã QPföf°ç‚ìâËZu_.l„(kóô•Îöó!¡ê£ò!±²„¥.„Ũí91äik‘'‹Xú¢*X-XØÙùx\({c”PKFÙ’ê FáòPêSô[Û³çæ‹nÆGà !  ‰‘Ä™9$ßÚ?=»ˆ_p`aK°×«Q6ÿÇçýr1ä‰éΨ2í¢ÏÍÇáOGTÇ¥:­5ýqýìBtÚML{h 2„/ø0s)¤º£Šží;ûðÝBLYHpÆ¥˜æ­TÎEL¹ð… —ªRvDhõ™\Š‚º’ ~2Lé`^Zí²XØD(…ÙÜlPxf.rÎ9¢ (Œ“q Â$ðD›¨T ó…˜T‚cQ¦\ĬŸ… +ñ@’ +R䨈É5ÀH2Ù†„ŠBnI"BÉGY ƒÐe Œ.¸ Gˆ‹‹E\­A±ùâZ„š¬Æ©æF@Ñг>`”Í‚Q† U T('Âÿ"|RŒj¢vÄf· ,ùôÂÂär7Ÿü>⽤)æÆlf#,!‰/"꺄$Â\ ‚öbƒ>ZŒ$àv{Æ/N9@X9»æ²` s~×ûlf‹¶Ö8¼²vÁC€:Ó͇Å)/‰HM,ÑáòëéÞäb§;¦ˆÉêÑ·›k§^"åc‹a¥’ª>zòÎ8#j„NI¹á´—œl‰Ñý\…²Æ|nÐc2ÕΑQ¡aç@ÌCÊï›ñ°^,…+uJk BÑNœ›'.ºxD¨º0QÚ!¡G@¨Ì! (•Éåh¡„%`ý¨XgÌÕSp£z€4¢BžÒ;Fí²Ûô9'š^DL–™ö ¡ˆê%Œ›ƒü ‚Z¯t ÜU'6Á<˜é†wñâs¾É Þ˜ tT-ÑéåTã²RÞ¶ñF”µQ.m”F™ö>8»Íƒb‰Z”¶¼¨PŠ Ù((£E™¤Køp䔊7¦Ìº‰k ©!•Ât`còô\pu˜g)*Æ„,ôcöÉ^fU gD,ЩŽ7 〿Äå60½•šàŽˆ +ñ„Ñ\-5ÐÄ24£ŸNF{&,ý«3N@!=Œ‰eð©‹n0’~¦{ší]ó’–3¦(ù5h +7ªLû˜¹5“œÖv‘f/Èdú!P¢#®/Dåù°â6夢L†1sÈ•“Í¡ø +¤ð… ^fÊ÷ÆaÊ>¿ºƒxècŠa±ÁØ£—Z›ZŠAsÁgÜT\iG¥Nˆ)ûÉ<®v63µ¹¸„9Ãʳ3!ɈIqG(ìt/¿¾sÿÛ‰âÞ³3ˆ# 8‚âÔbìø‚cò3û0[HV.¥¨\™ö0Åî1©µHò¢_œŽèN(¥×ܸsã•?[‚T…§]˜â*Bv+®´À8þ°[GÒO¦½¸—€¦–¡èäš*—!ãÃdAkÏ…à,Dr•LçB*põbX¦."´Øk”Ïç;P=Äe•Ò8®ÁëÛKѤ;¦…H#Dè _þ¸“ ”Õ™üú׃ÆäJˆL!„†q©(gyˆÉw7jiSÌŒ<¨îŠH¸XD¹Ìbˆœšw/ø1G˜'õ®Ù:Š…ň4ã¡:qö’Ÿ^ô3AÒ$ô¶XÜa²ë^253ÙdY.uĤ°÷ÒYàÂ\©¤Íh×""ǵº\Úâ³ë!¾ +Mi4®t »9BÌœÀÕ†Z>ˆˆå —Eµæù ô…‹WHĥₚqÆ Ãû‚òk•KœIÈMÓK#HÙ^<€µQDž|Wۼ׺ôXšT]¥ºrHLâ!‘Z†‰Ò…0•‹0ÙÅÍ—ŠD¢7ã¡€âÜPHT.@gHâOÎ{Î- g—âç=Ì´Ÿw´#ªF˜-Iùq°æý<„XH©)gDžóÒÏ^t?7탲 Y(Qè8¥ºWß{jï­+´9šõÉ_¼ò Ðzn&â +Ëà/¬5HÕh½b àòÐqµÑ-.Õ6sÄ­XzœÝÙ¾ûÞñÃ÷6Ž/D/1:¤s¨RwÅ `fZo㉪փ\n.(^ô‰³`¦X:ÌAR N棲—N;ÿôèäñ¤±T„ٌ͇#¦úˆ”`tìÆá|D ³ÙÙh¤ò®þÿ³÷¦Ëq%KšØ ?dú1êž¾÷f-¬â†ä‰8g!HÄF€÷"ÁD‚@ YË»õv­GÓÓ­±ž‘I²‘™4¿ez=’äŸ{Äɳ$‹™ì*"uò.Lxž%<Âw÷ð[Ø!sÈ’0¼q7™¾GC‘Ù6s/žßZßùëµ¢%&v Ç—›Wo5¯![\_½r}=š!gare—ôï¯/}ÖKg6ìäZpãN<÷”\È[¿[mýaôe0ùé…«ôæ]œ41÷ ¾ýtlåÅÄÚþõåöåk‹_„ã+ϧ76¿þÛ;»“.n‡3$ÙîÒOÑ즽¹AŠLMnL®¬ïþÃÝÝ qѸtõ 5m§6õ _Hv—žzxmußÎ<"W—¤ý_³_4¯F7Ï«‰¹Å¯’ù§zêÙrÓkÛjru|ñÉÊÖæ}7‡ƒ/Ÿ_]x@~t0¹>µÚZ~üÍ¥t æÙ{ßL®ï’­\[ûRÍ~2zí¢½IÚ¿ßú·Ÿ¨`lir¹5~»5z}ã3=÷™¾ùÙ• R迺8F–IpýÙ!WçŸ/ïŽ-´h]>&?…ØùÍű 8Lyù"Yé|ÌÙÕ›OgÖ/]]¹±º3µþ5ivrN5zã“+óáôÓñÛOomîÞÚ|ñÙ(Mã)MZÖÏ‚™OƒY;ûp|uûÆêîÜæ+’E¤¯É–›½2·q0µôllrý‚ž¾2qŸh›,ê/ãÛŸ…³ôß‹éÒÔJ{ñÉw·Ÿý»÷¾ ç¶.‹¡P0š®Á0¾þêÚê˱¥´¤—‰ÕÄñÈ…x;ŽnŽ‘n¾G«y9!ù°@‹NLD^v|ó!™ÊWˆ2X¶›í¿yñûÿkó›¶3Oè!W®¯Ú©”`î {µ¾ÿn|ýkC. Y¿É"9Ô$½£©ûÑ̃hú«‰ÕWSßÎ=øÖÌ<<’ ‘ƒ¯mý~éÉoo¬¾lŽ“Ñþøúâ9,ã O> &Éñ_{þÃJëOúæW—®Ý!u‚„ÏWßÝ\¡¯ß6Së“«í­oþÃîÿËõÕí‹×—/Œ-Œ/o¯¼¸xuù +I€ÙÇó~Xxú‡ÉõW£×îüæRú¥žÔ7ÖHÈ ‚w|“ØöêÒ×Ñü{“·¿:¯§ã© röŸüi¥ý»ték5A㜠®-]_x\_jŽ‘;37}çÅæÞßÝ{ùç{_ÿYO? C—ì¢/5Èé“Ë׿Tt͉Ֆ¾qç|8ýÉűsÍ "l3±þW_DŸŽN¦¸±´sgûw—®¯þ¦yãSr ÓÛÁµ… (é™ù<˜þÕùëWÆV#(  2ׯ¤+ñÔƒ±T> ‡h/Ý%éwëÑ[Âô×—Æ£™‡Ë_ý°øôwSëûWÆɾm4¯ÓW§ï†³õyt)^Z~òf÷·ÿtgû­™'•„Ô9)ÄÙ»¤šÉ†¿qçåö_?ÜÿÁä3ó4"Q9óøÂÕåÏôÌgj:šÚ\öÓÃ|zò_V_üùËxéÓ+äGL7Çîv ¦î…s_ÝX;"*}ðšœ2Ɉ}> nYš©Ókß©FKù…™#í󹞾 òŠ÷z¤"35¹ùàæÚîíǤPš×7Èï^ùê·ÓwˆU7®\##ðñìƒÃhñy¼ÔšòÝ“·ÿëÂÓß_"óãÊĹ+ãÁÕ…©ÅíùÍ×é­­ñ;_.´¸S+;d¶‘ÞЬÎѨ½ž\Û¥‘D7Ÿ˜éÇS«»W环_™¼}éÅÝÝ?¯íüí;ûfæyÇéì½É•g ÷÷ÖÚ?ÜXß[ÝþÃÃxpô×V¾&‘Kœ²ôèäNëÑB[M=[غJžÑ ±Éò—á 5N«¿ww÷ï·û_'ï“€¶šÜ¼¾°umáÑÕ…{óö'î¾Jæwì "$ÁøÚçÁá2ßJ¦×'ï´È`›Z? #ÿúBëúüÖùp¾qùú¥è–¾¾~1"Ý·JŒI*ãÆÊε[-²´u>ý‹O‚ñ9y®\»Ó¼¾6¾º»üô»»Û¸±ôü|x£™Î.lîÞ¾wô—ŸG$üɽ=OFÎôÓhú™‹${?½r#{FòæîŽ]^ܽrýÞ»<µü’¼ì ѯ¾LGÓ%"`ò©¿‹ÉêçWf~sþª[¾>w/™½¯g\½³¿±ÿ[oþóòW¿XÜ&VšZÝ~¸ÿ·¤7I`ž#Q@Zrejãé‚/“¢„hrsåáÑÚW¯×¶~ ¹ýÂ,Ñ“/Äˤ¼~seüüÕ}óñôý7‹Ï~;ýày4á;NêƒÌøUš:z`Byi×Ü|Fß?Õ3_ÚÙ+ã«Ø¿ððõìãoç;¾øœ|yþ4Ï´ +ãK;7VöÈ7_|6~›´êýKc ×W¶×Ú¿{zòwþøÞØ8ú,œ#s⼞œZx86{o4]8oo’®¹yïxîÞÉÔêן^;×¼Žð`ºH®ÁØí'ÍñU’i3¯&×È\ßFÃôý«‹mrߦ×_ê™Gäm]_=¸±òblîáØüýñÛæÝÙùíÎ÷ÿ¹õý¿Üzö[5ýäòµõ«ód缈f6ã¹­‰;‡8Ùsó0œ{|áÛ“áøÊ͵ó¨×=4·¶4H ­ÙÍW“wöHŸŽÝ~|ÿëß!N’¬ÐÏ'Ëé­mrNÕøÝ`lù³ËWõøâ⃃ùûGӯ©‡—Ó;c"Ι5Zå—8 +grcvã`bíe4ÿôʵO¯L›&ãgbî«ÑdÇýŒ¯/åoývvóˆÛóñ±íæóf–·ÿ‡¿ºL5swoþ«ï'7ߌ-<¿L”ùåÕófžŒÀñÛÏ›W—F¯®N¬¼œXþ:¹ùôæäHŒ|¡fÂñu²:HÖ]ˆÕÌR.úÚèÚª%ßaadÒkwÚš»ûòêÜWÉôC3¹~ûþËÇ_ÿþJ²@õâØò•É{ñíÖ…kkŸ›[—®­^[›{BFN8±Á +ÚMç^è.]]£W4‚‰ðæ;÷•š¾wyâŽ]xvûÙžüï‹;Ï?%†"‘Þ_ŸßüænûÏoìÜóK×ï^@íʆž¸ƒ#æo·HŸÒ4’-wíö3âGò•¾ŒæÉÍOæžÜ~‚Í×d^Lïïþáîηã«OÌÜs“äØwëGfòÎÕÙ{çãÙ/íôÊæÏéÙ/Ãù‹öö3on }`g7Æoßòêï§6_’Aho>&IBrõb²8¹öbl±uùÚ*ip”~­¿¼ùàäúR{ôÚ¹úÆòÄòÓé;OÆ’±wuiçááÿ<÷è­º)š_Ù¶³÷/__iÞ¸sóÁaëÍ?}õ꺵¹w}v3žX#ó~ýÅŸ¢[[ÄP—ÇÖÉÍ_ÙÛxñ×·^°³—̼ºv—ˆ“¸5¾½}ñÚ:1ËgÁD:{îî‹æøÊØâN²ðâÆêÁãƒ"aß|d'ï}¡n^%3˜¬¦©Ø>vc3ßIv'V_‘üå¹è ==vë)Y·Â›O–·w«õ×+­¿!³äW®ýêü©r¾’ù'£76²‡ooÏÜý†È>½ù˜„ço.]#ECZ•\¿ËDcë¯Èà°[UWW.Eh oÜo>ùBÍ}Þœ¹”…l^›ÿ +{7f6G¯.ýúâ‰Y’·KÛW矄ë—ãÛ˾ÑÓ÷?ç.Œ¯~‰mÝ›v¾•Î·çï½&c/}p(aþÉùhù“+s#’0(¼™{ô:œ}H–gzûÙØb{}­Èçžþ0:¾yÎ.Œ^¿ÓDCƒ53}Fx}õÕõ7×W^ÒsÔøJz“dé£ùû'ÏNþåö³®­¾[ù<¼I ¡¦È%Ÿ?/¹²ðä÷kí?OßÛ¿‚Ö3dŸ²¯n=¹<¾ú™ž¸4¶2y›ª¢››ÿöËä7—®†$®ßEªqâîÅñõhþ«é{¯¢…g¿iNë›㥋Ѳ™ºg¦7éöxþÙ­Ç?„³Ojæ<1õÆÁ샷äά¿˜\!y²4µødaóåØâÖµåí/â¥F@ž×m5d–_LçÏÙ™¹{/ŸýÍÎ÷ÿ|ëññÑ,Y—“Åéåöòã×ÈcNlÎn-<|ƒõõýOƒ‰Ó¸|ÑÎ]½õ”¸æò»××¾¹õô¯ïìâ®tîñåtñW®^Nn‘Qw)¹ýÉ忾pÂɇ¾û¯_½ùOÓk{4NÒ84Wo=>oo–ÈTˆæI”ýÝëøæ|wmeçÙÕ7î^º¾Þœ¸§o>‹æ¶‰wÔ{³w÷Æ\Œ¦¾¤·Kfüáäòþ½Ý¿[mŸKæç7¿nü³š¾oç‡s/Œ¯“R&³m|u/™ŒS¡ÇïÄ·ž¯µÿýÆÞ?Í=üVOl ^_\|6¿ñõäZûË«w>1ËÁģ鵓¥¯þfríÕ§ÁÌùh›"·þ8ÿø·jöѹd᜙M§ï_JoÿæòµÆåkêú¹ûoo?ýýµå_Æó¿¾<Þ[¡ÿþæòKWW¯.ïÜ~ö»goþ·{GÿtcãÕù«4SÉÌ£/ô|ãÒä9«¯÷f6_ýÇÿ¶±÷ï/^_KnµôÕw O~;qçe0±þ™ûÌÎ_»õlvýå•kžjâ^<ûäö£· ¿¿2ùq˜,æê©+ëÍä2Ø™‡É̸Búæ•ëkh|æôçú&yñ×ÈXZÚ +§7’…§Sß,=ÿã­Çß^JW>¹<ùYsò¢½õ¥šºÏ6ã¹O/Ž}ri\¯O¯îMÞùš¼¿Ï®ŒmÜÚxIÆü§—'®Ý~ñèõšyp2¾ôu:·…9Yy~÷«ƒ+WoþŹÐÌ=¿vç›ù'ÜØýÇñÕ¯ ë¿ú2¹uwïÅwÿœÎ?ø\ßü7_¤Ÿ…ó7îµ|çz##<{÷kÒédóëæT0õ$ßÞØùû§¯ÿ%ßøËOìy=Gä/<#²ÿÕc_D‹—¯¯' 4{'É͇çãÅå­ß}ý‡ÿvï嘹ÿæs³òÿ‘ϳÓÀOõ©´OÈ }jDíS#2hŸ‘AûÔˆ Ú§FdÐ>5"ƒö©´OÈ }jDíS#2hŸ‘AûÔˆ Ú§FdÐ>5"ƒö©´OÈ }jDíS#2hŸ‘AûÔˆ Ú§FdÐ>5"ƒö©´OÈ }jDíS#2hŸ‘AûÔˆ Ú§FdÐ>5"ƒö©´OÈ }jDíS#2hŸ‘AûÔˆ Ú§FdÐ>5"ƒö©´OÈ }jDíS#2hŸ‘AûÔˆ Ú§FdÐ>5"ƒö©´OÈ }jDíóìÿ=#ŸåÆùüwçÎÝ<ÜžÙ:Ù¹??rnò–}J¯m½>i,œ{zeòødf¯u²wt¸uü}ã*‚¦6+kí­ýÆy¹²A5VŽ÷^ìp½µµß¾Ð¸L—ŽÑÿF‚†jüŸûߌÆI7CmT’húG7b‚4­ B6Ða㙤&:Ò‰1AU/ÚÇE1ÁLš&Il¢ÈÐE–ïJS§AËE•×õtQåu»#÷FGó÷ïlä¾Ñ¼%˜·©ã7¯wW·NhJ³É|º|t¸z¼wx²wøbtTÀSmšªü#˯ð‹ +ä§õ͹ٽ}¬Á•ì+Íý•ûK‹ËGÛm|-,Ê;kœÿî`ÿ~¥aï=sÒ~µ¡u=Þ*]ÑÚÝÛß>nâwݸrëð¤óþïäûW¼®çƒsW6÷Z\§§¾(^øvkÿ\ùÝ_x¸uÀ×a<ªAÅãûžñøþðPAï˜ì¶÷^ìžôŒŽ¿| qúvoûd·g”ÜÕ£É[O'÷_ín=U½âµ·MW¾\óÑQ9zþu»u2uôæp›Æ6uô6ï`´Ã¢Œ.=yÝózî¹ÜF#&›íubžo½nÏ·¿yÓ>lõ.lJw}t:8Ú{]û€µXû€µXû€?±Œê³âöƒÉ€ûæ ú}à44~àTûm{}wkûèÛŸ#!8<.R϶èë“í™öÛ½- ¨ß!ÓG_èçûoÞ#ê‡ÏyãgÍB˜ÛzóúõÞÖáÔ{—m ì£×í“÷}øH®g±Ý»±}†FïˆônflŸ†Ñ`î_aþ>¾ïÙ|xýªÝz³¿u<}tøúdë°wƯÞx +É€~±¼ùÝ«£Ãö`Ù¹ñ£c‰!¬¼yχO~ïÃs@ýkëhÿèøê·»ïuÂófß÷û½ÇçÜÕÞ ½^¿9ÞÙjµ]‘t¯Xnú¥ ûA‘³£6z–BðPA¸ vÈcT÷ƒË=ãòÃ)š"«G{‡'‹ý„g~žXe{ÝéÄE'Á‡Ï::£*õƒ¼ð:©rI•>)pXÜ¥H§ ŠLØß;YÝÚ{Ÿk0|B¡g-øò=ˆ2¸t€yó›GD ﺈÞ:Þ;Ù=hŸôž&QÝs(åeïëôò4–©wDÂÞ OÍΩ+Þ«B‡Çî?O1,ë¹Ô>~ÑÆLž}“è /ÉÏ7Žºðè' +Ä;#a¸>*[;w&ëŽÔ¬;š>:ÚŸ:n·è9SoAÁè†v Šjö¼ßûxk{ïMïSâ/ÿø>h_¤Û£‘rÜ3"ÀÚÞÛßê=µ;L‘3\õ¶ttüj÷hÿèEÏ&Æà¸-gPºõ¾IfÀ¥Û™Û6wv¥[-ÓH¦=ïo?À K€ž10zv*xÏËkùîóž-˜Ag÷ wc¬îvð.O·ÛAïÄ8,»çÊܺ×A ;ÿ¦5†E3 s׆µž3-Ó»[‡‡íýõö~»ÕÛS½ñãÇÅ{NÂ|(’Õ?>_½§ÒcxìŒÞ1%Õ‡ 8ðb=/ÎëþöÀœÖæ—3§Žfö^¿ÚßjµÚ‡'K[¯†O'=ï¯}Þ K²ž1Iv°Eê9; öhÐðÿiT¾ªÂ×^±æo½{þòÖ³Ã"ú¦±ÿt©H±×³+;èb¯÷ëÃØó¥çe™Þ‡¾=»»÷÷Û[=W,“±ÚZ:ê½ê4wÃàrãÎñÑAïS|ñÇ×ÖïÑ«¹4NÚê=ô,WŸBÈù°çèÞV«õæàÍûsÔ9´ò·|tÜŽÛì‡ôŒÞööÞÉÞÛ>Ënøø õýo·¾ï™I²Ÿl÷¥ äúÁ¦Ÿõn×"½[9ô¯_æÁ÷J…Å»N!OÐOµïÎÞþ~?E±û§A„=3Övï}ÜäÚSòL¶÷úÛ?Ó•án×:3e3½c2,ÄhR—Í hHdXËfZg¨l¦>'²ˆåðÕÍôNÃ"²{o¸XΔ°;¥DEÐ覺p¦.œ9}$[g¦p¦wL†EKõa|áLÏ>ÒpÎœ=u4ô…3­3S8Ó;&Ã"É~…3ê—R8Ó‡Å0$¢o¨ gZuáÌ0Îô¾LÃ"ÓûзC"~âÑð”ÿô!C†d)‡¸Ya•õbÔ½#~þµøùÆqºc83-#'o=áî-Oû æõdë=þ7$Í’ÎnKž3ÝøúCÚóÔò­'ùý’å[ÏÈ×ò­–oµ|*ùvó˜µùv¦Ä[kZK·ZºÕÒ¥[m¼ÕÒ­–nµt;kÒ-Ÿ6zÚ_Êr=#ÿ“dp‡*KX3QLÿ’™¨gäk&ª™¨ÈD«{ßµ÷W÷·¾ÚßvÑA¬:Í>ö–ï a{.”¡®õQ)˜»c˜äàëWèJÓë´ SOšºKÝÆ%C®nãòSãÕ£„öÖ'ª¡ÆtÐP–þ?hÐÿÆè;ý;F?4ÎZÑùÞáv{gïð½§IçéõU{ëd¦)¹;NA̽Oj WÕ»–;³lÅ”zÞÏqä¾KàãºÇ¼PòOà .9ä=¥Ž^½&•ºòæ=d4¬D×wgÐwQ¿1†3ãÖ—zÑ0í™k¸å™kÖÖsœíå{’Y9dpé#òž5Ì#¢†Å>tA½u¼w²{Ð>é]ù “ÀîY*¼ì}^žÆ2õŽÈ{ª󈄧€È‡Ør¿DU:<éÒÂò¤õ.Ä3žî¯é Æ™êüó¡÷ È?ŸÝ3Qêüs®óÏuþù'ÐÈ@ë`¬/ Rçœëœss®sÎuιQçœ(¦<¡“áÎ9oïíì¼éýd‚A }¢3,ìÓgÖo½¯–Ý…{>¾ÕÚ³(s¼CŽW¸ohQÞ·¼Tt<8}tHßaïÜU¹ï££ø}{ÿèÛ^ñÜß{±{B¿¶Ð®¸g4Ë·Õ!¸:W‡à꜌õŒ†àú‘•Ã‡-2öâ¸Ý>#  =¶w¸½÷âhìíÞÑ~ûd츽=vt¼uø¾Dg ëNÃu€î'4êêÓƸRIÏû­öÞœ¼ç„˼Hô×t‹zÆ©½Oô§ËÝqjÑŸ™=vV¡ßN¹vfFü§E§j‡z¦•×¯Ú-²>ûö1«7ž‚Èí˛߽"kþ°ìÜøѱôC8ƒ[YúXÀ:duª!+²´ë`NÌ©ƒ9u0§æÔÁœ i t#ÁÙá˜NÌ©ƒ9u0§æü˜Œ<+UudªŽLýk†²î‚Ú:ÃáŒ3¹Ýûlöåø*–*Ê!nϱ¿w²ºµ÷¾ðìð †3Ó™£÷¦Þ™£ßbÝÓg»+Gï 4à]9zGdÀ»rœé£d΀ +­»[ ª=3Ý­>Ȇ®õhÝݪînõá.Ï/Q…S!@ŸÚwX–³îju&»Z­ïnm}[©´ñ¯ii5<â©çÖeõfÿÁpzêÍþ½Ú[Þìì¼nŸ`ìÇíí¾ÖgXH¯çO·ß#kóõß 4"=Ì—´€)°Â|ô‹ò>\t Ë¢~€³0(‹s¦ÃÚµwöœ¸QeÏõJ§½+êÓÐÓý`Ò»¦> E­Â gLvÛýT•e—|œLï8}»·ÝGÝ¢»ú£cÔ Ô½á¨ —Z‡?ŽÓL>ûá䬄?zG¤|t)P‡?Πh¯Ãgf]êðÇ€‡?àÄlõQ­U»pCíµúóÕx'hÐì¹ùÍó­×íÙãö7oÚ‡­Þ´Ò]Áãõ“½“Ö{Ay§WßÝÛïcKណaïÄ8,^Oï}Ã߬´N¶Þö±Xù[>:f;Ç[ôîý壽ÞwýÈÍ=bçßô±ið4K E+œáþK½k‰ã£ƒÞ ¾øtBÝ~©n¿TÕv§Ô~)hö|üÑÉQïšàèPéÃF<¤êvJCÕN©î¦ôóD’î¾9~þfŸ8~hCu³”!Ø5ØGÐeHBÁ°;­Ãþ˜!uîlÔ õŽÇ€W g°­œ†¦­£ÁŸ¾g£rÂ8:)Œ Ô‘ÿ£áŽüŸÛžµØÏ…BÃú?éÑKúWþOÉ”­}ÀÚ0‰W{}£ök/ðÔ=¦Ú  /°g× ö‡Ü ì¹/AíÖNàÀ5Ë6'ð£ÕÕn`íÖn`íö=Ž3㎪³âöƒÉ€»‚ö º‚}à44®à½££íÇ[½kÚj?°¯];¥©gç¡î¯1ÞÞ™Þî{:lœÉpöû…ÔíR ‘º_È€õ ùØÄýo>è¬/d†E~íì“ã!ÇÐ_}¾¿Õz9ÖÐÑ«­ÖÞÉ÷WûHX¼>ù~¿÷À©»úÔxjhK½æÞ…Óg‰±Î¾•ð¯i~T¼OeïK_ 6$fÄŸoØïÁ­.òúDgXä\Ÿ§O®·¶ú0 +÷|ü½¬=[AoŽw¶Zíþp+Þt¶|¦A¥AǃÓG‡¯O¶Þw_Þ«-ß÷ÑQüv·MðûHÓÐï£=¨´–åÛ†)¸Îc?3ÃTسìÙúaïàM ¯ìúŽTÔsÇ©ö>ýÑWÆ wÇ©™Z3{,ûI©þLÝfD^-:†>Û¯g‰îO&î[¤Wo<…ç~±¼ùÝ«£Ãö`Ù¹ñ£cùgG‹í[ˆCb ÖÖSÖSm<ÕÆSm<í´×Â^ëé «Üº€|hâé@…uTý#¨ú“Õ­½÷¹Ã'zÖ/ß“ÜÎ!ƒK7˜ùò=WæQ§€H¿ù›Ó[Ç{'»í>Ž &qÝ;õ¾N/Oc™zGä=}¸òˆ„§fëœÑšÝZ…Ö*ôôpúA&t­FOSön¾ ¸í‘W£ýŠë_¢žPu}¨ä²ŒÎð’ü|ã>²¨Ûà–°¾H½6>¯§>ï_Ýir@áh†¹·ÓÝúúý.Ã'!¶èQ=÷´RÀý§Û· Ò+Êü­w¡è/%6,rƒ7.õ@§ƒ(8Ît3‘³¼Çñ +âán)²ræ·×Žž™.£=ûƃކã,况‚ÄX—»g°ƒñ‡K¹ÁO’Í’À¾]ÄaC\Í z?w~íï¼ìyè°HÀ‘îÃÂRÃmceîï´g÷ŽÏ\„qßì/öW¸çô½9l­ ŸP9sÄÖŒAã—Ans5¹>¹©_Šp›:åBö‡ÐpàîñÖáëÞO»ê +à>‹6Üî-¨Ã&§6ùgbXܼ!Žœp5ÞäþþÏ.†Çú0¡9,´:¤e ?Ç>ä«s“·Tðôæávv”@§ËG‡«ôn 2*à©ö‹½Ãü#˯øF~ZÿþàùÑþÈù¹öñsÍF‚Æ$ýïþ·øÒy3Ò©i¹ÿ=ý±@_¾&з ÓXjJ(ýíÓ05€8ÔxE’Ɔž3M÷`b0 "l‚,Ä0þt—"êÆc’ ±)ŸPS¤©ÒT㦰󘄧•†&†Ö9nÚÈÐ+ G6ÂS Œq…%ÌlÊ7•PXtù1™ „†wÄŠfû`„$¥)ˆ¦¾h¬4˜€èÐ#JKé—@ø%U3@AĤošdâ…@Ì šV1k™m¾-$Î!Š56ä—­D .×ÍăY":7Z¥rMH3IoJcº–IJ•ñƒ“& …ÖØα™8è!`Ib¥Â&›^jŠH ˆ·‰9‚B/ 9ÃÃUÊlIËB‹á$X5†S'V$†¶´®tshbX=UƒMbäèÊÄX‘)q@ô³ $‰^,ƒ˜W " E€€ · +RŽ\ „ˆ„ÞF|r¡¥%úÐÄ×´1Ó—JZw&6Á5L.©QNcÒÍ‘(5tè®cÙŒ£?5KVEÓFsKüD—B쮉 ~¼–i¡57Œ@¬9Óä‚0—¹«è±Ú@óØažâ)MÿÊüj‘¤ +eÁ‰ÀtB´O3L/U¿´<4šKȃ*ˆYÍ’Ô8R#¼"IG—%1‰†‹7º ÷àX’ØCÇ¡1Œ¢J È0ËÑ«(`&¢Ç0©E4@Ñ^Ê‘+i ‘ endstream endobj 5 0 obj <> endobj 35 0 obj <> endobj 44 0 obj [/View/Design] endobj 45 0 obj <>>> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 61 0 obj [60 0 R] endobj 84 0 obj <> endobj xref 0 85 0000000004 65535 f +0000000016 00000 n +0000000173 00000 n +0000031372 00000 n +0000000006 00000 f +0000637627 00000 n +0000000008 00000 f +0000031423 00000 n +0000000009 00000 f +0000000010 00000 f +0000000011 00000 f +0000000012 00000 f +0000000013 00000 f +0000000014 00000 f +0000000015 00000 f +0000000016 00000 f +0000000017 00000 f +0000000020 00000 f +0000637884 00000 n +0000637915 00000 n +0000000021 00000 f +0000000022 00000 f +0000000023 00000 f +0000000024 00000 f +0000000025 00000 f +0000000026 00000 f +0000000027 00000 f +0000000028 00000 f +0000000029 00000 f +0000000030 00000 f +0000000031 00000 f +0000000032 00000 f +0000000033 00000 f +0000000034 00000 f +0000000000 00000 f +0000637697 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000637768 00000 n +0000637799 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000037025 00000 n +0000638000 00000 n +0000031786 00000 n +0000040024 00000 n +0000037341 00000 n +0000037228 00000 n +0000035939 00000 n +0000036464 00000 n +0000036512 00000 n +0000037112 00000 n +0000037143 00000 n +0000037376 00000 n +0000040098 00000 n +0000040450 00000 n +0000041882 00000 n +0000048978 00000 n +0000112923 00000 n +0000178511 00000 n +0000244099 00000 n +0000309687 00000 n +0000375275 00000 n +0000440863 00000 n +0000506451 00000 n +0000572039 00000 n +0000638025 00000 n +trailer <<99D9DA31BE634348BDBBAE81438842F9>]>> startxref 638264 %%EOF \ No newline at end of file diff --git a/tests/dummy/public/assets/branding/ai/Ember-CLI-Mirage-Logo-Stacked-Black.ai b/tests/dummy/public/assets/branding/ai/Ember-CLI-Mirage-Logo-Stacked-Black.ai new file mode 100644 index 000000000..77f59a00b --- /dev/null +++ b/tests/dummy/public/assets/branding/ai/Ember-CLI-Mirage-Logo-Stacked-Black.ai @@ -0,0 +1,2830 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[5 0 R 35 0 R 60 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Ember-CLI-Mirage-Logo-Stacked-BW + + + 2017-04-12T20:08:50-05:00 + 2017-04-12T20:08:50-05:00 + 2017-04-12T20:05:19-05:00 + Adobe Illustrator CC 2017 (Macintosh) + + + + 252 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAD8AwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXEgCp6Yq8E/Pr88PKTeTb/AMu+XNUF9q+oEW8stoW4Qwq4MxMo orc1UpRSdj4dVKP/ACT/ADx8m3Xk/SdE1vVFsddskSyZbssFlCnhE6ysOJqvEGpqD7b4q9sxQ7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUt1zzL5e0G3S41vUrbTYZDxje6l SIOw6heZHI/LFUj/AOVvflf/ANTTpn/STH/XFXf8re/K/wD6mnTP+kmP+uKu/wCVvflf/wBTTpn/ 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 X//Z + + + + uuid:4117ab5a-c2d3-5446-9385-21439d6eb9ed + xmp.did:61f0ef3b-ecb7-4f78-a77f-08f867147dc3 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + xmp.iid:3b81609e-aefd-4ee8-a794-d6d24a4d8ac6 + xmp.did:3b81609e-aefd-4ee8-a794-d6d24a4d8ac6 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:48fef565-7731-4c49-bee9-dfbb0bfe5fa3 + 2017-02-28T19:39:58-06:00 + Adobe Illustrator CC 2015 (Macintosh) + / + + + saved + xmp.iid:61f0ef3b-ecb7-4f78-a77f-08f867147dc3 + 2017-04-12T20:05:14-05:00 + Adobe Illustrator CC 2017 (Macintosh) + / + + + + Document + Print + False + False + 1 + + 300.000000 + 300.000000 + Points + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + + + + Mirage RGB + 1 + + + + R=39 G=50 B=73 + RGB + PROCESS + 39 + 50 + 73 + + + R=110 G=116 B=125 + RGB + PROCESS + 110 + 116 + 125 + + + R=54 G=181 B=192 + RGB + PROCESS + 54 + 181 + 192 + + + R=112 G=201 B=203 + RGB + PROCESS + 112 + 201 + 203 + + + R=255 G=147 B=67 + RGB + PROCESS + 255 + 147 + 67 + + + R=254 G=201 B=78 + RGB + PROCESS + 254 + 201 + 78 + + + R=214 G=237 B=162 + RGB + PROCESS + 214 + 237 + 162 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 64 + 64 + 65 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 112 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 129 + 132 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 146 + 148 + 151 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 166 + 168 + 171 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 187 + 189 + 191 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 208 + 210 + 211 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 241 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 236 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 241 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 221 + 21 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 34 + 64 + 153 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 151 + + + + + + + Adobe PDF library 15.00 + 21.0.2 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 66 0 R/TrimBox[0.0 0.0 300.0 300.0]/Type/Page>> endobj 62 0 obj <>stream +H‰l—In$ËD÷}è‹~úpzï¯àÏàÛÜYr@v÷?c8ƒ‹Z•N×⛜ÜYSB~ô³ÿ&?Ú™ªë +½ÊŽ?ÿøx„v†Zo}@™[Ãؘa$rT;îL©ž±.éóã‘ÊYZ__3Ç棜Ñù%ørzgK‡ 7ù‘êéb—Eí\·ÅÏ¡ƒoû{àÐVÐÏ$fØÎÞl9¤µ\Ž(uŒ€΂MœÛ*V~çz$úÙ®«¡/QÊE(ØŸ ªB:DŸ¶x™²€³uj{¡ÜÛÁ=¶!H­z–´¾áêF$=òµÍ¢á#Bs×â p‹Þl˜~Y®jÄêg*Q¾š¹Žª-F[‘¿{<Ó%êG¼…ýÝ»{÷çé¶|èhq·ï_*Õ€§€ÚYKJØÁ¶6½ùtÉäyÍ«|mð>áÿ 2¯½!lóf ¼åíÓIÅåòF²ÔËçSëµûÙ*QÓÙ‚áìƒú°Æ‰Ìˆ 2ei•œò™C[²ÎÈð^úB¾.Ý]f°K wCæ¹Ù÷z‚ØÇãU3Ý°">Qeºé +â{^2ö•»ì \Ûá҈ƅ´3O¯°Ç9CŠWsfieF·'EK(;ô}l¸£­¯”¦Fb¬Ø§nSGF-p#ææñB-ˆïÀUôDã’‚;]) AIVø"/÷/ùNÝ@|†A‘-ïvdj*ª|ïõ¨Ð7ítÆu²@a}§ ×±O®Ð†² ›…[›²:• ÃS^*ÿR)óð\6XUà‹jåee€ÍØŸÕ¡;{w$¹ã†°¦·ƒÓg ÚBÁ¶G8GtÂ_Uôœ¬Ï÷=¤jQþ\né眞…Fºôûc5 •#ÅÛ£ŽJ‹Jp ^¡æê¬áA¹–ø5ŵÛM(¤oÏÚÌ·ü‡õ˜Îu=YÓ£ÂO࡜ሬY¨¥Ü€èf1í¾Ãc˜ôœPÑûH5llÔmé”Õ ¢WC]¢š§Ç…<21«Tª 4›"Å2Žû&P ÔÒöHyÁ¢¨20ŽŸ’zã÷ç¡[¡$õp,ÕK9[ ãH¦ªà›áqzâ¥ÎœŸÔà¯þ9˜’º5qÂ9ó+Š•ÄWbE‘?EìHüv@3/âeÔ“Åú³WX^ +¦‹FÊAÿ¯ t(EÇhgƒÚ+-0ÖSdÇr—ðµ6fõ#6âêŒ#'°5@ofµ…44,Ád‹Vj__ò£ D÷ML(‚˜\³í 4£]/ KÖ0£ÃTZ–#!¹·zst…Ç~}ož,£@‘amL(AL)Þè˜ÀEÇÎŒGo”Àþܲ«%œTïÞV(íŒÆ¼Jýîš÷ÚoœM€Q ë·àÊE4i1œ”þÙn‘éô0\)š$XÝS»}âßæ<Íç¹Y]ÈS…“ß —áÚjú¹J‘µAâø}f w ‚î;Dî¡eÝv½#Ó +«Yê‹à²µÑ{eµ>å¾ë‚^ÉIôx“å²Ñ²2¦`;!$ÓNw]1DkÎø +bðuóÊ©ØÀš†{F蜜êB¬A7v'bc@T%¨³gN¹ëÍ5æ‚…Ä1E°ß!]~÷ŒÞ®nù¦êD6e®.J1Ê^÷þîÕ‰Üc]½>C*Ø·<°É,D]»ËMæ)åÒ˜‚…‰,ä½²Ò'óU²Ù‘Êú0@Ýa¯Ig™¨.ÍdFV'ÞòÎç…P4š·+h~Gñ‹ù6€húïwBH´tOx_éØî9[¨+¾<óArK)ç2æGˆÔr_|²¶ùqã×u_pÁH'u¦Õd-D¾D›ÂcÎS+ÓH*z=ñàK´*ÎC)ZwÓ?+‚×(Ò Ò”d€£é(ãºzºg~jªøiÔÚÏYÂ`Y9Ú4l2 œÙééBTÓzpXlš4TØtB žŒT¨ÆmÚ¨:Ôgy‡ªu-Yw}÷Šl-_CºÆŒVËaòÉY¡MX…d§ó‚ä-¡HŒš’ +BðºXÁ¨DKVY5ÍFÒñ6””iF *­˜ä¢%%ÃO':=ã°iQ²·‹;CуYH+;<ÙÑ‹µûÅ—†nuê¬ðöªñXçÉ”¢Œ ÍÁ>3D†ñ"q[ B9êD… m(£×¡­¨]T¥´6E?jª²Ùö®›¾òôVuE +1LÝÇ@ÒÞä•f!JhÚ,2ùp“6y¾râU¶ÕTœÉ3!i?‘­ïS3qCkEz9!½Ý‘žt€ív)H‚¦› ã]’){׊2$ùõpÛr³¯v,¤› ®úË}ݱ”˜ –†Å›ã/9߬ˆ +R<6 ºúÎÓ”µc2¹WÔ—êÛõE‹åË©åöö6ƒ:T­î¬ijDlySµ‘Iæ>¡¼Ü±Ýá mUý´Ñ·)­¿îëÃdK=’®T•š~°°cÜ™ïKЩÛ Mw™ÎYg¹[P. ª]Ñš¥˜‘lÅlS±Z|[“_OÉï7åe I3Æ¥­g"x6HuÛ.ÚkÈ€;+[ÄÍ=ñÔpnÖx;àù¢ ئ©ÌµfjÛÍ\¾¼?^,Ò0ÖL^x5¤'î&0 7~¯5íõ”ö~S{Ñfzz«»‚áfÒ +˜kÍŒ¨MÌKÔ©Bº1!?*å¯Eõ ?æÔÅ ÈaŽwÈìF5Þ ÙØïF[ÛÔÇrRsÈ´uÎu{;]§·.Ÿ7M`^žiÀ ²Ë!ƒQê¶(l”'ìé.Cúxà]N,ý¸ÒmÀº]4€yw¢Ë?­Iq~*ÜÒÒÞò„b_lUq +”z†3øPl¬€šÊ "î¬[ÒÒFvzY€4Ö`í×—…Pг-Iœ§æ†ÙÊ5/`¾35 +^kª^ªÒt¬‰îÿdW9’Ü0 Ì÷óÙ"EŠc—C~ÃV9òþ?u7îG*@$n41»Æ©wqÒæ‘CÆa]D·ÐíØJS,»là_r!lrå”=‰ ¾õOA·º3¶–=XÃäÈ°Ìmic¼P—eœ+h¹Ó¤ûóÈ⊆X³íV¡Ñ¢÷Ðî2×v±‹ðs-Y–¾¶ÎZ–ĵ¾v¹ÅXóŒ×{2²'‚å}ãR¢³\S6¤›“ýØ%–K€ñÈrUºø¬D© ž@ÀÁ rÁ0Yܵ<°˜½XncàbaàÅè|o1„¾׊â®#°;6‹i¢%˜QâÍÞZ]sX¯²à†TÓÅa÷èÍšW±­0²Áƒe{;ž£2cr·ýø9au”i“#–/$Pt\ÆQ’4Ì ÌæºJ8—¨,"B¨ŸÐzÈhåL‚ Mþ_ðEÆjˆœ0”½*†BåÁÆ@dÚƒf©KƒÃù:0­ì“ÙÆfÆ×—s"»Äh.…Ö'¸ñrRBl® pƒ1KêœNèR®…"™IÐ0Dè†õ¨¹/1jb£¦ DÏÉs +}Ÿ§Ð %LéfÔ¨@=ôŸ+”Ù0jÂͽƒæ®Ê«£œ0 Bddö +ºq~àe0Ø­Q… +ì!«®ÂiÚܽ¯àü•ÐÉzâw0_è ø‹oÒ‡ËN×ê M%„Žæ7ÂŽæZ‰­#Ï<V§Õ÷§ÓÕ``l!œšfø%šFS)â-¨a'ŽÆJãh±£H•]‡¦˜s;hj¥Â,˜‚U¯uwyÝ¡ÚûÊQÁwt&]JÛ9M[HÜet£¶Ók‡Q¸,bYáÛ€.“ñ:X\P ñÀ¹v#|r–Z²C¿‘"¿Ç—ü÷ûÁP¼¬%Ëdˆ ðŽ¢BiÑáFÄ73D¼ºÂKÀEŽÕ»`¹uƒ/ÙNóÇú¼æ®î‰]ê.'ØœGáŒÔ,·.„¸ý¡'} SüLëRÞ*$ ó5ú®,U†Þ¾?ïce|ÎÆKPŠÆ^°PNÇð$`öØ¡Äé’ÄrÄ- ¯Þ”$VƒåÖyäÂ~nñÐ3g4GEŠ3Ry°Ü@“’.˜¦ê¦Y“gÂ^—òæS&42×ß•5mOÑC£ ¾`£k€óˆÅ3E8CÕÔ +Â( ¨Èrá7ŒŽrÉa©‹xóF¢b²Kß™’”ãá9Á(rœå.¹”pÚ5•ÀxJâŒg ¤#5+¬1)iï«O¢ [à aô?ÆÁÅy¦ç™'YOÜDü$·ü†TçàEœü\^I`*Œ®vë¯úÃ3nu¾ZëJ±ÁHÍÉRÛBˆÛþîp¹Ã§‹OÓwemÙ{B[†d“㌯œs2pqÉâRƒ¾B†sps®GJ8M‚ë8ýFrºÚ4Ön¥;&öÝå¯?¿?~þúñÀ矰¶S endstream endobj 66 0 obj <>stream +8;XF49+ln3#Xg[HG23*K>\AY9UU1tqPa+kjp?f_rVB6CC,BI\;D@P^>Gr_'te/@#?skB;\_ +:MbbX7;$AjkN5PQrmrOfdisbt>]Q_2@Xn5DV)7;eO\]PRp#nSrS[DR(a1GtdWHtp" +P32O8g"N_ns!qD;L1bF\hZ-XYc]%~> endstream endobj 67 0 obj [/Indexed/DeviceRGB 255 68 0 R] endobj 68 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 60 0 obj <> endobj 69 0 obj [/View/Design] endobj 70 0 obj <>>> endobj 65 0 obj <> endobj 64 0 obj [/ICCBased 71 0 R] endobj 71 0 obj <>stream +H‰œ–yTSwÇoÉž•°Ãc [€°5la‘QIBHØADED„ª•2ÖmtFOE.®c­Ö}êÒõ0êè8´׎8GNg¦Óïï÷9÷wïïÝß½÷ó '¥ªµÕ0 Ö ÏJŒÅb¤  + 2y­.-;!à’ÆK°ZÜ ü‹ž^i½"LÊÀ0ðÿ‰-×é @8(”µrœ;q®ª7èLöœy¥•&†Qëñq¶4±jž½ç|æ9ÚÄ +V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚óÈtÕ;\ú” Ó¥$ÕºF½ZUnÀÜå˜(4TŒ%)ë«”ƒ0C&¯”阤Z£“i˜¿óœ8¦Úbx‘ƒE¡ÁÁBÑ;…ú¯›¿P¦ÞÎӓ̹žAü om?çW= +€x¯Íú·¶Ò-Œ¯Àòæ[›Ëû0ñ¾¾øÎ}ø¦y)7ta¾¾õõõ>j¥ÜÇTÐ7úŸ¿@ï¼ÏÇtÜ›ò`qÊ2™±Ê€™ê&¯®ª6ê±ZL®Ä„?â_øóyxg)Ë”z¥ÈçL­UáíÖ*ÔuµSkÿSeØO4?׸¸c¯¯Ø°.òò· åÒR´ ßÞô-•’2ð5ßáÞüÜÏ ú÷Sá>Ó£V­š‹“då`r£¾n~ÏôY &à+`œ;ÂA4ˆÉ 䀰ÈA9Ð=¨- t°lÃ`;»Á~pŒƒÁ ðGp| ®[`Lƒ‡`<¯ "A ˆ YA+äùCb(Š‡R¡,¨*T2B-Ð +¨ꇆ¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r 9‹\A&‘GÈ ”ˆrQ ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½Ä­ÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@ æP+¨íÔ!ê~êêmêæD ¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒÓ¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…åÆ’°d¬VÖë(ëk–Íe‹Øél »—½‡}Ž}ŸCâ¸qâ9 +N'çÎ)Î].ÂuæJ¸rî +î÷ wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö +n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=GTB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßY Õ.©=bàá?SŒîÆ•Æ©ºÈº‘ºçõyõ‡Ø Ú† žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹­³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝ­èþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_p߶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMśΠnßLÝlÜ<9”úO¤[þ˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ +¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäüå„æ æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ ÷„óû endstream endobj 63 0 obj <> endobj 72 0 obj <> endobj 73 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 17.0 %%AI8_CreatorVersion: 21.0.2 %%For: (Lindsey Wilson) () %%Title: (Ember-CLI-Mirage-Logo-Stacked-Black.ai) %%CreationDate: 4/12/17 8:08 PM %%Canvassize: 16383 %%BoundingBox: -411 -2118 -138 -1841 %%HiResBoundingBox: -410.727600097656 -2117.44189453125 -138.495178222656 -1841.39697265625 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 13.0 %AI12_BuildNumber: 242 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: -422.880605969701 -2133.7610619469 -122.880605969701 -1833.7610619469 %AI3_TemplateBox: 306.5 -396.5 306.5 -396.5 %AI3_TileBox: -560.880605969701 -2339.7610619469 15.1193940302992 -1605.7610619469 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 2 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI17_Begin_Content_if_version_gt:17 1 %AI9_OpenToView: -3343 223 0.3333 2549 1289 18 1 0 5 43 0 0 0 0 1 0 1 1 0 1 %AI17_Alternate_Content %AI9_OpenToView: -3343 223 0.3333 2549 1289 18 1 0 5 43 0 0 0 0 1 0 1 1 0 1 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 7 %%PageOrigin:0 -792 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 74 0 obj <>stream +%%BoundingBox: -411 -2118 -138 -1841 %%HiResBoundingBox: -410.727600097656 -2117.44189453125 -138.495178222656 -1841.39697265625 %AI7_Thumbnail: 128 128 8 %%BeginData: 13736 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD50FF7D52FD7EFF2727A8FD7CFF7D27F87DFD7AFF7D2727F827F8 %2752FD78FF5227F82720272752A8FD79FF7DF8F852FD7DFF52F8FD5CFFA8 %7DFD1B527DA8FFFFFF5252FD5CFF52FD1DF827A8FD4CFF7D7D527DA8FD0E %FFA8F82776A87D7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA8 %7D27F876FD4AFF7D27FD04F82727A8FD0CFF7DF852FD1BFF7DF852FD48FF %A852F8F8277D7D7D27F8F8A8FD0BFF7DF87DFD1BFFA8F852FD48FF52F827 %A8FD05FF5220F8FD0BFF7D2052FD1BFF7DF852FD47FFA8F827A8FD07FF52 %F84BFD0AFF7DF87DFD1BFFA8F852FD47FF52F87DFD09FF272752A8FD08FF %7DF852FFFFFF52277DFFFFFF7D2727A8FD0EFF7DF852FD46FF7D27F8A8FD %09FF52F8F8F852A8FD06FF7DF852FFFF52F8F8F87DFFA827F8F827FD0EFF %A8F852FD45FF2721F827FD0AFFA87D5227F852FD06FF7DF852FFFF7DF827 %F8A8FFFF2727F852FD0EFF7DF852FD44FF27F8277DA8FD0DFFA827F87DFD %05FF7DF876FFFFA852207DFFFFFFA827277DFD0EFFA8F852FD43FFA82727 %FD11FF7DF852FD05FF7DF852FD1BFF7DF852FD43FFA8F852FD11FF7DF852 %FD05FF7DF87DFD1BFFA8F852FD43FFA82727FD11FF27277DFD05FF7D2052 %FD1BFF7DF852FD44FF27F8277DA8FD05FFA87D7DA8FD047D27F827FD06FF %7DF87DFFFFA8A8A1A87DA8A1A87DA8A1A87DA8A1A87DA8A1A87DFD04FFA8 %F852FD45FF27F8F827FD05FF52FD08F827FD07FF7DF852FFFF52F827F821 %F827F821F827F821F827F821F827F8F852FFFFFF7DF852FD0CFFA8A8FD38 %FF7D7D7DFD05FF7DFD06527D7DFD08FF7DF852FFFF7D5227522752275227 %522752275227522752275227A8FFFFFFA8F852FD09FFA85227F8F8F852A8 %FD4EFF7DF852FD1BFF7DF852FD08FFA8F8F827522727F8277DFD4DFF7DF8 %76FD1BFFA8F852FD07FFA8F8F852FFFFFFA87DF8F87DFD4CFF7DF852FD1B %FF7DF852FD07FF27F852FD06FF7DF82752524B7DFD48FF7DF87DFD04FF7D %FD05FF7DA8FD0FFFA8F852FD06FFA8F827FD08FF27FD05F827A8FD46FF7D %2052FFFFA8272727FFFFFF5227F87DFD0EFF7DF852FD06FF7DF87DFD08FF %A8527DFFA852F852FD46FF7DF87DFFFF52F8F8F87DFFA827F82727FD0EFF %A8F852FD06FF7DF852FD0DFFA827F8A8FD45FF7DF852FFFF7DF820F8A8FF %FF27F8F852FD0EFF7DF852FD06FFA8F852FD0EFF52F87DFD46FF52A8FFFF %FF7D52A8FFFFFFA8527DA8FD0EFFA8F852FD06FFA827F8A8FD0DFF52F87D %FD42FFA8FD20FF7DF852FD07FF7DF852FD0CFFA8F827A8FD41FFA8F8A8FD %1FFFA8F852FD08FF7DA8FD04FFA8FD047DA87D7DF8F852FD42FF52F852FD %1FFF7DF852FD0EFF52FD07F82752FD41FF7D2727F827277DA8FFFFFF5227 %F827F827F827F827F827F827F827F827F827F87DFFFFFFA8F852FD0EFF7D %FD06527D7DFD42FF5227F827F82752FD04FF7DF8FD13277DFFFFFF7DF852 %FD5BFF52F852FD08FFA8FFA8FFA8FFA8FFCAFFA8FFA8FFA8FFCAFFA8FD04 %FFA8F852FD5BFFA8F87DFD1FFF7DF852FD1DFFA8FFA8FFA8FD3AFF7DFD20 %FFA8F852FD16FFA87D52522727F827F827F821F827A8FD58FF7DF852FD13 %FF7D522727F8F8F8FD0427522752274C27FD40FFA852277DFFFFFFA82727 %7DFD0EFFA8F852FD10FF7D52F8F8F82727527DA8A8FD07FFA8FD41FF7DF8 %27F8A8FFFF2727F852FD0EFF7DF852FD0DFFA87D27F8F82752A8A8FD4EFF %52F8F8F87DFFA827F8F827FD0EFFA8F852FD0BFFA85227F8F827A8A8FD52 %FF522752FFFFFF7D2727A8FD0EFF7DF852FD0AFF7DF8F8277DA8FD3BFFCB %A8A87D7D52FD047DA87DA8A8FD24FFA8F852FD08FF7D27F82752FD39FFA8 %7D7D2727F827FD09F820F8272752527D7DFD1FFF7DF852FD06FFA827F8F8 %52A8FD36FFA87D5227FD05F8272752527D527D527D767D52522727FD05F8 %27277D7DFD1AFFA8F852FD04FFA852F8F827A8FD36FFA85227F8F8F85252 %A8A8FD11FFA87D52522720F82727527DFD17FF7DF852FFFFFF7D27F8277D %FD35FFA85227F8F8F8527DA8FD1AFF7D7D2727F8F8F85252A8FD13FFA8F8 %52FF7D27F8F852A8FD35FF7DF8F8F8527DFD21FFA8A85227F8F8F82752A8 %FD10FFA8F82752F8F84BA8FD37FF202752A8FD27FFA85227F8F8F82776A8 %FD0CFF7D52F8F8F8527DFD3AFFA8FD2CFFA85252F8F8F8527DFFA8FFFFFF %A8A87D522727F82752A8FD6CFFA85227F8F8F8272027F827F8F8F827277D %A8FD71FFA12727F827F827277D7DA8A8FD76FFA87D27F8F82752A8FD7BFF %7D52F8F8F8527DFD7BFFA85227F8F82752A8FD7BFFA82727F82727A1A8FD %7AFFA87D27F8F82752A8A8FD7AFF7D5221F8F84B52A8FD7BFF7D27F8F8F8 %2752A8FD1CFFA85227FD5BFFA85252F8F8F82752A8A8FD16FFA85227F827 %A8FD5CFFA8A85227F8F8F827277D7DA8A8FD0DFFA8A85227F8F8F87DA8FD %62FF7D522727F8F8F8272752527D7DA87DA87D7D767D2727F8F8F8527DFD %68FF7D7D5227F827FD0BF827205252A8FD6FFFA8A87D7D527D5252527D7D %A8A8FDFCFFFDFCFFFDFCFFFDFCFFFDA3FFA8FFA8FFA8FFA8FFA8FFA8FD05 %FFA8FD0EFFCBA8FD05FFA8FFA8FFA8FFA8FD09FFA8FFA8FFA8FFA8FFA8FF %A8FD05FFA8FFA8FFA8FFA8FD15FFA8A87DA8A8FD07FFA8FFA8FD0BFFA8FF %A8F827F827F827F827F827F827A8FFFFA8F8217DFD0BFFA827F852FD04FF %2727F827F827F827F85252FD05FFA827F827F827F827F827F827F8A8FFFF %7D20F827F827F82720527DFD10FF7D2727F8F8F827F8277DFFFFFF5227F8 %27A8FD09FF7D27F827272027F827F827F827F82720FFFFFFA127F827A8FD %0AFF7DF82752FD04FF27F827F827F827F827F82727A8FD04FF27272027F8 %27F827F827F827A8FFFF7DF8272027F827F827F82727FD0DFFA852F827F8 %27F827F827F8F852FFFF7DF82727FD0AFFA8F827F8F827F827F8272127F8 %27F827A8FFFFA8F827F852FD09FFA8F827F852FD04FF2720F8FD0527FD04 %F827FFFFFFA827F827F827F8272127F82721A8FFFF7DF8F8272027F827F8 %21F8F827FD0BFFA827F827F8F8F8272727F8F8F8A8FFFF52F8F827A8FD09 %FF7D27F8FD042752FD0BFF7D272727F8A8FD08FF5227202752FD04FF27F8 %2752FD05FFFD0427A8FFFFFF2727F87DFD0BFFA8F82727A8FFFFFFA82727 %27217DFD0AFF52F827F8277DFFFFFFA8A85252FFFFFF7DF82727FD0AFFA8 %F82720F827F87DFD0BFF7DF827F8F827FD07FF7D21F827F852FD04FF2721 %F87DFD05FFA8F827F8A8FFFFA827F82076FD0BFF7DF8F827A8FD04FFA8F8 %27F852FD09FF7DF827F84BA8FD0BFF52F8F827A8FD09FF7D27F82727F827 %7DFD0BFF7D27F82721277DFD06FF27F8FD0427FD04FF4CF82152FD05FFA8 %27F827A8FFFFFF2727F87DFD0BFFA8F827F8FD06FF52F82727FD09FF2727 %F827A8FD0CFF7DF82727FD0AFFA8F82727F827F876FD07A8FD04FF7DF827 %F827F827A8FD04FF7DF827F827F827A8FFFFFF2727F852FD04FFA127F8F8 %27FFFFFFA827F8F852FFFD07A8FFFFFF7DF8F827A8FD05FF52F8F827A8FD %07FFA827F8F852FD0DFF5220F827A8FD09FF7D20F8272720FD0727F827FD %04FF7D27F8522727F87DFD04FF20272752F82727FD04FF52F82727522752 %2727F82752FD05FF272720FD0827FD04FFA8F827F8FD06FF27F82727FD08 %FFA8F827F8A8FD0DFF7DF82727FD0AFFA8F82727F827F827F821F827F8F8 %F8FD04FF7DF82027A8F827F8FFFFFF2727F8777D27F827CAFFFFFF2727F8 %27F820F8F8F827F87DFD04FFA827F827F827F821F827F827A8FFFFFF7DF8 %F827A8FFFFFFA852F827F87DFD08FF7DF8F8277DFD0DFF5227F827A8FD09 %FF7D27F8FD042720FD0727A8FFFFFF5227F852FF52F82752FF7D27F827FF %A8F82727FD04FF27F827275227522727F827F852FD04FFFD0B27FD04FF7D %F827275252522727F827F827A8FD08FFA8F827F8A8FD0DFF7DF82727FD0A %FFA8F827F8F827F87DFFFFA8FFA8FFA8FD04FF7DF82027FFA827F8277D27 %F8F852FF7DF8F827A8FFFFFF2720F852FFFFA8FFA87DF827F87DFFFFA827 %F8F852FFA8FFA8FFA8FD05FF7DF8F827F8F8F827F827F827A8FD09FFA827 %F8F852FD0DFF52F8F827A8FD09FF7D27F8FD04277DFD0BFF5227F852FFFF %5227F827212727FFFFA2F82727FD04FF27F82752FD06FF52F82727FFFFFF %2727F87DFD0BFFA8F8272727F827F827F852FD0CFF2727F827FD0DFF7DF8 %2727FD0AFFA8F82720F827F87DFD0BFF52F82727FFFFFF2727F827F87DFF %FF7DF8F827A8FFFFFF2721F87DFD06FF5227F827A8FFA827F82052FD0BFF %7DF8F8277DA87D27F827F87DFD0BFF7DF827F852FD0CFF52F8F827A8FD09 %FF7D27F82727F8277DFD0BFF5227F852FFFFFF7DF827F852FFFFFFA8F827 %27FD04FF4CF82152FD05FF7D27F82752FFFFFF2727F87DFD0BFFA8F827F8 %FFFFFFA827F827F8A8FD0AFFA827F827F8527DFD05FF527DFFFFFF7DF827 %27FD0AFFA8F82727F827F8FD04274BFD0427A8FFFF52F8F827FFFFFFA827 %F8277DFFFFFF7D20F827A8FFFFFF2727F827275227522727F827F87DFFFF %A827F82720522727274B272727A8FFFF7DF8F827A8FFFFFF7DF8F827F852 %7DFD09FF7D27F827F821FD0427F8F8F8A8FFFF5220F827274C2727274B27 %277DFF7D20F82727F827F827F827F827F827F8A8FFFF5227F852FD04FFA8 %A8A8FD04FFA8F82720FD04FF52F827F827F827F827F827F87DFD04FF2727 %F827F827F827F827F827A8FFFFA8F827F8FD05FF5220F827F827A8FD09FF %A827F8272127F827F827F8F852FFFF7DF827F827F827F827F827F87DFFA8 %F82727F827F827F827F827F827F827A8FFFF52F8F827FD0BFF7DF8F827A8 %FFFFFF2727F827F827F827F827277DFD04FFA827F827F827F827F827F827 %F8A8FFFF7DF8F827A8FD05FF5227F8F8F8A8FD0AFFA87D2727F8F8F827F8 %2752FFFFFF52F8F827F827F827F827F8F852FF7DF8F827FD0BA8A2FFFFFF %FD04A8FD0CFF7DA8A8FD04FFA87DFD08A8FD07FFFD0DA8FFFFFF7DA8A8FD %07FFA87D52A8FD0EFFA8A87D7D7DA8FD06FF7DFD0AA8FFFFFFA8A8A8FDFC %FFFDFCFFFDFCFFFDFCFFFD91FFA8FFA8FD11FFA8FFA8FD07FFA8FFA8FD07 %FFA8FFA8FFA8FFA8FFA8FD13FFA8A87D7D7DA8A8FD13FFA8A87D7D7DA8A2 %FD0BFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA87D27F827A8FD0FFFA827F827 %7DFD05FF2727F8274BFD05FF2727F827F827F827F827214B52A8FD0DFFA8 %2727FD05F827277DA8FD0EFFA22727F827F8F8F827F82752FD07FF2727F8 %27F827F827F827F827F827F827A8F827F87DFD0FFF52F827F8A8FD05FF52 %F827F852FD05FF52F8272027F8272027F827F820F87DFD0BFF7DF827F827 %2727F8272027F827A8FD0BFFA827F827F827F8272727F827F820F87DFD05 %FF52F8272027F8272027F8272027F827207DF8F827F8A8FD0DFFA8F827F8 %217DFD05FF2727F8F827FD05FF27F8F827F820F827F827F827F827F852FD %09FF52F827F827F827F8F8F827F827F8277DFD09FF52F8F827F827F827F8 %27F827F827F8F827FD05FF27F8F827F820F827F820F827F820F8277DF827 %27274BFD0DFF27272027F8A8FD05FF52F827F852FD05FF52F8FD04275227 %522727F8272027F87DFD07FF7DF8272727F827FD0452F8272027F827A8FD %07FF522721272027F827275227522727F82727FD06FF52F8FD0427522752 %275227522752277DF8F827F8F87DFD0BFF5220F827F8F87DFD05FF2727F8 %F827FD05FF27F8F82727FD05FF7D52F827F827F8A8FD06FF2027F827F852 %A8FD04FFA12021F827F87DFD06FF7DF8F827F820F87DA8FD05FF7D52F87D %FD06FF2720F82727FD0BFF7DF827F827F827FD0AFFA827F8272727F8A8FD %05FF4CF827F852FD05FF52F827F852FD07FF52F827F82752FD05FF7D2727 %27F852FD07FFA8F827F82727FD05FFA827F827F82727A8FD09FFA8FD07FF %52F827F852FD0BFF52F8F827F827F87DFD09FF52F827F827F8F87DFD05FF %2720F82127FD05FF2721F82027FD07FFA827F827F852FD05FF52F827F827 %A8FD08FF52F827F8207DFD04FF7DF827F8F827FD13FF2727F8F827FD0BFF %7DF8272027272721FD08FFA8F82720272727F87DFD05FF52F827F852FD05 %FF52F827F852FD08FF2727202727FD05FFFD042752FD09FFA827F827F87D %FD04FFFD0427F8A8FD13FF52F827F852FD0BFF5227F827F827F8F84CFD07 %FF2727F827F827F8F852FD05FF2727F82727FD05FF2727F82127FD08FF52 %F827F827FD04FFA827F827F87DFD0AFF2727F82752FFFFFFA820F827F852 %FD14FF2727F8F827FD0BFF7DF827F84C272721277DFD05FF7D20F8272727 %F827F87DFD05FF52F827F852FD05FF52F827F84BFD08FF21FD0427FD05FF %2727F8277DFD0AFF52F827F876FFFFFF7DF827F8277DFD14FF52F8272127 %27522752275227522752FF52F8F8F8527DF827F827CAFFFFFFA827F827F8 %7D52F8F8F852FD05FF2727F8F827FD05FF27F8F82727FD07FF52F8F827F8 %52FD04FFA827F827F87DFD0AFF2727F8F852FFFFFF5220F827F8A8FD14FF %27F8F827F820F827F820F827F8F827FF52F827F87DFF27F827F87DFFFFFF %52F827F852FF52F827F87DFD05FF52F827F852FD05FF52F827F852FD05FF %A85227F8272727A8FD05FF272720277DFD0AFF52F827F87DFFFFFF7DF827 %F827A8FD0BFF7D5252527DFD04FF52F8272727F8272727F8272727F852FF %2720F82152FF7D20F827F8FFFFA8F827F8207DFF27F8F82752FD05FF2727 %F8F827FD05FF27F8F827215227522727F827F827F8F852FD05FFA827F827 %F8527D7D527D7D7D527D7D7D2727F8F852FFFFFF5227F827F8A8FD0BFF52 %F8F8F852FD04FF2720F827F827F827F827F827F8F827FF52F827F876FFFF %FD042752FF2727F82752FFFF52F827F87DFD05FF4CF827F852FD05FF52F8 %27F827F827F827F827F82720F827FD06FFA8F8272727F827F8F8F827F8F8 %F827F827F827F852FFFFFFA8F827272752FD0BFF522727274BFD04FF52F8 %27F852FD0AA8FF2727F8F852FFFFA8F827F8272727F827F8FFFFFF2727F8 %F852FD05FF2720F82127FD05FF2721F827F827F827F827F827F82752FD07 %FFA827F827F827F827F827F827F827F827F827F82052FFFFFFA827F827F8 %27A8FD0AFF52F827F852FD04FF2727F8F827FD0BFF522027F87DFFFFFF52 %F827F8272727F87DFFFFFF52F827F852FD05FF52F827F852FD05FF52F827 %20272027F8272027202752FD09FF20272727F827F827F827F827F827F827 %2027F876FD04FFFD0427F87DFD0AFF5227272752FD04FF52F827F852FD0B %FF2727F8F852FFFFFFA827F827F827F827A8FFFFFF2727F8F827FD05FF27 %27F82727FD05FF2727F82727A8A8A87D27F827F82752FD07FFA827F827F8 %52FD047D527D7D7D527D2727F82752FD04FF7DF827F827F87DFD09FF52F8 %27F852FD04FF2727F8F827FD0BFF4BF827F87DFD04FF52272727F8277DFD %04FF52F827F852FD05FF52F827F852FD05FF52F827F84CFD04FF7D272027 %F8277DFD07FF2727F8277DFD0AFF52F827F87DFD05FF52F8272727F87DFD %08FF5227F82752FD04FF52F827F852FD0BFF2727F8F852FD05FFF827F8F8 %27FD05FF4BF8F82127FD05FF2727F8F827FD05FF27F8F82727FD05FF52F8 %F827F82752FD05FFA827F827F87DFD0AFF2727F8F852FD05FFA827F827F8 %27F82752A8A8CAA8A85227F827F852FD04FF27F8F82727A87DA87DA87DA8 %7DA87DA8272027F87DFD05FF7DF82727FD06FF52F827F852FD05FF52F827 %F852FD05FF52F827F852FD06FF4B27202721272752A8FFFFFF272720277D %FD0AFF52F827F87DFD06FF7D27F8272027F827F8272727F8272127202727 %FD04FF52F8272727F8272027F8272027F82720F827F8F852FD07FFA8FD07 %FF52F8F82727FD05FF2727F8F827FD05FF27F8F82727FD07FF27F8F827F8 %27F87DFFFFA827F827F87DFD0AFF2727F8F852FD07FFA827F827F827F827 %F827F827F827F8F8F87DFD04FF2720F827F827F827F827F827F827F82727 %F827F87DFD0FFF52F827F827FD05FF27F827F852FD05FF52F827F827FD08 %FF27F8F82727F87DFFFFA8F827F8F852FD0AFF27F827F852FD09FF7D2721 %F8272727F8272027F82752A8FD05FF52F827F827F827F827F827F827F827 %F8275227277DFD0FFF5252275252FD05FF5252275252FD05FF5252275252 %FD09FF7627F827F87DFFFFA8522752277DFD0AFF5252275276FD0BFF7D52 %2727F827F827277DA8FD07FF52522752275227522752275227522752 %%EndData endstream endobj 75 0 obj <>stream +ɉ,k=‚$¬Á©€¤D¡@¢"´%³Ý–€ Bl˜È,§1„Ô Xž^6–ו†~*DJ#L™Áhð±ÁôE¬öƒ¬Õl!„‹l…郼wÜž2…’T!.¿Ç¤êã4†¹+ º‚(9¥ŒÅ ·Æ!Vó ÜÓÃ(Ñ27ž¸ˆrCÌ) Rʲ¨:ÁêVæ´5Òuæ««SZCºx1‚¤yCp$4Á!›NÌ0Ðu:I™Ü!Õ¦1uÖOMg|cÇ°Åô›§‚æ+ÁÚÀaQŽ+’fìì—ˆu:,Oþ4O_&ðíDú2:kñš–&iú”„saØ"›K¨•p/ÍhP ¡(vq1â$UÙ똅('ân(Pr¹YgâMYöwHnÃâ‡QGZ¦= +I¨â9äౘTЉ)[¶Û¼Ÿ†d A#f"²fæ0%à D»–ù v4B,†]·eOšÕ^ý È@× €ÅE(. û¢!k;šZ–.l]¤ò¦V ‚I‰Ö<øª8œ£S±(­ +xÀ6ÕÞÄÀ˜0ÄCëÞ ŽÁ+“@ÌSì¹F‰#ñÃD¤ëB}Ê3ñà4ˆšŒw ’8ž§åH8pÀiMœ2÷iØ p²UwÜ*øWf¨4‹-æ'ŽÖ ¼aSÑë°]ôo̶ {óxÙÄ4Eü&Åòƒmü&VÚÐÊѵ±…¿Oã'ª×L=A±a™‘ €±È@Ú±­XÓ<˜uÌIô°‘Ÿ˜Ø…B‹3u*ÜÛ„Ç”Xa60‹/è‰1 /éoĬ7eŠhä¦ìzYI"‚3Ž0¯Í›‘dMñ=VŒDe’X³Õ°AƒwŠYC ç"§‘T’z6Rl艣¿)¦5ÙdßM´ è¢^‰€‚š[€UªÇyºË<ì#øKˆ‡šÅbÖ#äÝ%L FD¾b©)ŽýÌþ$'Ï ¬Q(7XÄ£ô$BA1‚Šéo2)-~Žë† áDh-v>&„¡›ôLÐR³,ƒp#¦Qð ÉcQÁa ™Ó±™8 ,غ#H¢ˆÎ´˜{ø›u_ ËÓP…)¦ Eó@”…¸¦×_Á}F œÔwL‹y¡1‘lã ‘™béAc† ¥ä8¾æßiØ4lœcyHâAM¦6È_âdŽW‚ hü®Üä°'Ï•BÜÜ`ز† äÙÁ‰'N,‹*¨Xˆ7˜’ƒŽÐªÖ<‡]Å©øO•à?BË¥A—B1ËÐBÞ!T| 2oœ›PÞǬ̀ƒdUªHØXiåÌÏÎß…Bº6šw’ñ’€…,€6fu‹ðpB¤A´‚`5”=@ìÕ@ÇÀ©*b‰W†œwKÁ²“€¼‡5Éb‚'ô® +UNThw±;}fîíH5“WÉõ•ó¼ðâÔɆuÂ[IBLsE„”p¨ ¬©„*tZMÒ±<(%òÊ©¾J:¥¥fÿÉ{„¼"š C˜ÍÊZŠ¢•Ž9Vƒ|bm])¦2ÖÅn ÄJšq±k*²˜®| «Ç­AÈQuVæê¢÷ªˆuxcQÆ”•$°ã•_’cÆ>š«ØÙä‰qä9–‰‹°%ohÝn’w P™P™Ó075L«Dæ;#ŒÈÜ2AÓ ñ‰Ì2.ÚQAò½4)‹°[90ƒÈ@S*ñ¹Lįa ob¹-ŒµQN?[DÔÈÏ +$XÉ<…kÄ`ÇŽâà˜7äHEå–p8ú®fŠ‘aŽ`iNY±™°Û³<‰óC%Ý#,œê ¥¹£ËÄgˆM,'iÙP ~°”ÙˆG®…­M$/Xv"ý† 1'Á¬$4Û¿|OÈ 8E±hëD0‰G²åÙ %Ê1˜ð€Ì{vÜý‹ ®9u˜Ê ^µ ×h„O}¾ÖJö]@WsÃÒ@D¬½Aü"”¼öX(÷(—QrO%Nl]ε—“ñÕ„ýt—åZ< =Z͸º¤y9/[ÎÝV2¼-=§Ä>iH³%I ¨Ì€£¦Ži8æà²@D› “™©„òhÀÑm-Ôçl§‰bË”¼Ø•ÞËÓüv¤[•E¹£KMC·Ê‡JyÄÛÉÀ‡Lr戙À¦ãŒr˜ð¼Dœ]ÀÃYqà&ÍÄ“‰D0— +ÞŽt-_¨–8”ª Z²Î’¥'ñ¥ã8U3Ævɾ·N%Õ†8’«FdåÊ Ÿ "äÌ fÐÓ‘I¹PKJÈ žÐí.ÈÆ…yœ>viÔJågÿËõ ÕˆRÒ~º{b¿˜ý‹àeÀa.H0’Çvé_¸êšÙ$ÍÒB06\ø2•¼ ª4aæE.‡ ¯‚?²‰qkÎ<Ò‹ÁÆq¸\~ +9¿£dmä¢x1׳âì»"^¨œ g»² œÜ¢_ Ô(Ǽ-W›L‡®ÀM‹¥+¹äT!c…GpÊæP®šqZØ4ÅCâzNpW”ˆQqˆ2+Ùà±»™ÁC]a]l•T’*ÉVpæÊòÌTg¯2Ç-, £9¦ ë¤K[s(€-;ŽºÂå2J¦•%œ?Wâݳ²2œuPM·Æ¡˜/ QîU‰dÒ¬|E¸R)Î`Ž·^ýUVåT¼3P¶ueY,›h[äuè‚Ù4œæeµIø<àâ‹*äœuJ! +B©Òb+. ìB `Kq + .¯Làø9K½³uõ$0ö, è•«&<12Í»‰Z«Îhk¤Ë¼Wצ¼€-ÎãÂdlB©€A±‘“Ô®‚škb¥àÑžM¸BåÒ›·#] +tªE<•R¦êÄvN¶&>k …ÂOª¬çéaTª\ z%:Ç54aÀÖ‡”Ä,d/â´1¯äv`ŒHq†fÍÎ §UÉ„C§;•u¡Å +¹izº áWf“•CÊõ¿El‹Â b±‹­5•â¦ÖH—¨J‘T¹ªÅiY7+ØSY6›ýWk¥pKL=ä½Q‡1ÍIqx`ÖYÀW*õߎt)ç¯ü—ËŽZ#ÕÚ¤jùR—"§‘Ê3Mä) J!•µFºÔTu©»*WgMw­á*µ¼éZûR©)ÑȬ” +ƒªÅCÝJŒgÚL'HÀDÃfH,JŠàe`3†3á'9·-FÁp˜Ôrf†ƒN©ð¬¯ðˆ9ðÊ…ÀˆxÉœKáKyBF<•×0M9(®9¦ÀÄbx›­9@(”(• xg,xa3¼X±¤Aç‘ ®€4v:(Åp–¢<¥CS„sW(˜öŽ]Z0[<¾O<†w.ËÒW© B+­‘®Ekå¶J“¨³RTµPªTM%¢)ë²ÆÂððªàXË%\Eƒ™ÍIPZ^zT8ª˜ØµB„Û¸ÐË&ó!M§åèL˜ˆhCÔžÓ4¿‹å¨3Ïõ”£œrI¥$ðY¤—S+>dÇ e+i"…)ûÓ4ãâ3ƒf`Ó†œŠFî„eð5ôë»ì¬ä@H–Ã<pfKx™ãž2\sGz%>ÀƒYAżØ’›˜ðB^Ä2 +_tÄîxÈåg>á-Ó\„œ¸SÛìªsÚœµli½D—´²èeÂÊT2gÜáÐ WªÊß®†²šœ5’DÒô o \`'Z®XƒW)Ò+òÉø}ZÏŠ®†:8ðä^T\i§à$íàĶtÌe„ÕÖ–…kÊZ›èA”vìjÈÚå=G<ãŠü8¬v"ú90Øy¡¤”*ä b®L2¢*Þtâ,a%ÆjB[_5¡¸PR$åª@7ù²ÁJUa©NDM©J®RGWªµkq­uE ®¼)mrÎÖ{»òçX*ö¸ˆjšÕ;åT Gþ4JŠP˜À6ȦØ7×zH5jâJlÈpâíw° Øôô©¶…G¬Ô…€b %«-“Æéx{Ýêþ*q¥Ê²·#åÚ³JmZ¹*‹/à\î$;é"B!€Äd"GŽ‰ha™Å€#y'.Ðl9Æ ÃÃäæ X½Â51×èD"Pk˜ ´.ðƒÅÍþ•ì“6*su*b°RëJ”gE÷â +Z¤ Y¬^¬{L¸bâÉ‚“é%J˜ñl¤b‚U0mt›ò|§ù^‰p7ú/¸ô9òc6K#ÆÎÉ”wJš¦Ô_!Ÿ +†.꾩òê|ßQ"ûQ žjlêdÌÖ„E¾°rÁ>‰$4efÙŸ'eÅZB.K¶Îj…9‹|‡qÉÀ(+²2.G:‡ã‘¡ bBè¸[µq©¹\­\®gnÚO}Ì{òiÕPPÆf³J*u¼­‘n•¾åJà|­ðt¥š¸<—oOƒãPÙÓ.qæÃú©“lÄ­Sº­NyýÊë[¦Ô JÙ¢âh ï+â@…­mJUJš[#å¢çrMt±fº…B¾„Ù7æÚv) ¸ê( ¥ìÞnÁ¬Ä©J.B"aQ©4æÊÀb-r¹V¹TÍÌôÁ~sâ4#L~ü ÚsŽKƒâCCÏ$ÂßÒ €Ù'µlÏ¡ˆ“h\íÁtyáNcco¹Ä“ Fq[EFç"© kÀ—Ò›ÉAR¡ÃÉ'hqTÝåæ¥4gåImqah+ñåÄÚ•ßl ñÞ],R‰Ú†¸Fˆ'r!’R½òÛ‘JAs±Ü¹T=]™¤Ó¨Æ‡Øãú +ëÂ(=’‚¹ê©ÙCŠ´KiW¹ú«RV)!k‘tp%‘ŠȆõUPœ›Q!×uKE +v¨qbÁ:jáLj*U4AW–ªžÊeQ]*§´T¿° Ë‹pæÂgd•8=S™(V²hluñ͈j̠̲̆€d õÔ²ÁÅ°¤ +³4L9“·¯ ‹³rCÒ;QªÉˉ¹êFUĵ*/­*¬ìô0 +Ž|cóo’6| ÀŽu’TkÂ[#ÕÂñ.µå¥J_ÜUª®Ô WjŠ[(>•Èzè"ÎÆ%žp5¥jLÜT©Ø¬Ôt– +!¹0®X,Y)§¬Ð4h¢Lö¾(‘î‰8dÆe¾°N À48ê¤D¥Ô÷«+å‚Ýj +»UV«Kõa­‘.UdÕJ³r5±¹´š1ÀM ôC(ñ-åZ¤j½R¹†FÜ¡$ëRÌì„r:ÙrI¶íRöÂ^s¹8¦Z@S)³‘Ò&‘¡EG*%1*pÉj‰©Tj$ø®j!EµØ¢”,—‰RJ½[Ú½˜äJ%qØ5½XLBºH5æ¦"çžbGvÈ«±YRÍǹ<^5kWÍìUó•$a%XLÉËxžµ ×ò9ÛÄyâJšDn)§Rʹ–b:†ï!Db.œéò5ìl‡~/{9;ÀëUÊ tÉ1ƒÍ|“ÈGë‹t +ï8±Î .ÇIù–R(µk-Åó˜àK!¿.AÁbŠ¹+åXy충r€ +R æ½c¶qU’…N9ÄS +!žWÝ’[ܳ[ÙÏÚ)JöGºSJ—JT²Q‹àR)óÙs€blN{1|P/”\lˆíÊ6ÕÒ6Ö¢ë -TtNËÎkÙ‚‰Tt±JXÉÐo±år7Ò6|±qiʲ‘Ý©šáe3½h£²PØøWÞØmë`ysayóaaw"ïžaãB¶åaÜ¥÷"ßRéÏXnàX´PÆ{qÃ÷&UÉWôfœ&?•ˆÐ(+ÝÈÏHÈeI˜XŽ¤ +%)ŽÿÃÐ/$GïDÈGá½q'@by3fÑúÆPT)°Âž“„¨”S#Ø“r3(PóNÄ»¹ åÄ/¶t1#Z‰'`Ÿ‹„i-6½rxè*o#Î@¡=¤ß\»Ä'ÚåE ¤iâ;·fÕ4t û²‹ñDþ j™—¹V]sf!UdçrXb +ÈãØ29¨ÎµP^ß0(6`H6D”À7Fî•5‹#Y=ªq2;b9t3ƒ§P´ +(bÞO¥\•J,,S€aÎÁfp#’]Ý”]· “¯hƒ'B€“d±|#H¸Ø¹ÊG˜öM°æ‘ewf—ù,Vß)b„Õ*NurËÚI®I›%õÆ‹ëà†&Žå”ß>W€Å©¸Ù½þ²ì‹]^»È-œ$x:D^ÛûWÂ:‹Ù5 @±íBgç!’¦èÜå¯ 3î.¿Kޯ射¦Ù%æ̺˜«Êí]ì\¦Ý¦<_i×$£²^šù³«²ç/vy§ØŽ©37FÎ=½2y|R8¯åÜÓ1ú_vMç, 9£Ë¹·ö÷ßìn´·+Ç[‡/ÚÝŽÈÈ{+ï>2CÅ33PƒrhÈÀ+áad@óvYü /Eàô(÷EJöx'žƒŒ–o­>_ª¤èoï|ñ?¯ìÜ'²kÅ*èöš©ç4ç7q~ÉvãÅñÖö^ûð¤aôž˜s$³äÿê3dþ£ø¬E‚P'¬SÜ+r„í’4•Äq¢ÜnÜ?¨<‹DoÜß³,bÒ°S­.Cà 2zÉ D µÏáMÀÅij²É0ÑQ˜¦8öú”žtäß=UÅ!3K,Aâ6"¬çç¢T ¢¥»=·ï9$I† Œ0EzpJÌá©©_ å« ¦|Gùˆ0!GÇá·'z¨ ˆ,G­¢°g"O„û#Ro‰f"gG¸£ ~y4ŸÉöJó£žèG|êcÄlóM‚XÓ•ìGýBöü¸Ð '”0ás¬Lk2È5|‰¾‡Ä$Š¸™%Ó…õó Ød&HÉtDêN¶!}‘ÚÞ‚Hµ%‹2IÓ]Uð>W(‚/úx4y|¡ñ·ue¤¾ åM¬‹o\,Åñ”âÿ ·hpÉ~í(2®Ç¤rqþÜ‘ü¯…?F­$4*þàh]|jîÕù7±Ã›ýÕy™\ȉw<4(dCÄ»oý‘7þèG߉ÙèÍGyö¦Gf¥0%“F"ö™Dò#-ü\þóG¯­ ½ð³p:èò$¾Òr“ NÉ•ÓN ¹É-þøc¯ùñþrù–0©Lâtu^%£ÄAðf”'ëBL¼“jj¬‰# £èßT%œnŠŒUV©n%÷ù¡ bú¤Jk4ë‡Y ÓåÂ<å?qãþd‘ß4›ÆÒYVo¯i9¼ÿV^ˆsO»!Þ¾õsO? yº¯_ôÏ=ý° 8÷ô +~òðèðÇœkª)¹ÑáêÖÉIûøðæw¯ŽŽOîº1Ï= W¦ŽŽö‹×âÈï¹7{Ûrþhÿ^úêñQ«ýúuc­Ý:!}ÿÝNzз“Îç=‡¤©E§Oͽ2ðÙÈü´¡; 2 ïCƒ}6•kd+lT| + äÀšxN™´û%$ì;™©^3Z¾hñuyYaģ݆\D¼rÉô_}¸dsnéšE¾!‡[+WðpméÅáv½¤47•kª3Óí’Ê‹òcí2Ô"ºÕy?½,¾ÓGìÓE„Lgütˆ”šAÇ•¤ WJ‚¦x +¡Ò ÎSŒ.Þs¿'Êv³¥¶%„8]ecÞ|ö¡/‹ìcÀ$Á;]LF& +¤ËPîüÓ`æã.¡!LRŒFÇ6ýà§§Ø Ç»¥hÌül‘hBì,ƒŸ%zt„:ˆˆ|õÃý§Z’$àj÷4TÊ %aÇø®E_-ú>’èÓµìs²¯4c?¡èûÙÞ•¾ãù?¥„Ê ´b³9C®–XµÄú$–8Mív·ÛÒ ¹TGvmBza/|‚S âµwâÔsK)…:æÔÐø°#?ƒˆaThP1é8«{<¹¦õšÖ?–cõÉ/éçÑÞD?üܪ#¤r«"ú»*èÑŠ¢ùà×iBhQ¨õ甆Ñ?21¦ˆƒë8äÞŸ76ÂUØBÏu½öº8P¿îÞ—¾ãu?Ù\VLwõ›±!F§Û¢$¤òN#’ŠÚÒH *³¸RG–¾“픚@º „Õ-è¥2SÞP™‹iÚJ¾ÀqN Ç–¢0u©ƒüÅß=?ùÀí{~-ÿþ#ï]tA÷ò%Øá‘ ­Ëós¿;a¥Q>]»€OÇL +·Þñâë +?ç(Â$÷{7ä‹?—žZudÅyÍý8]^’ÎüÜ\v ð3©sc~@¥Ÿ +˜æ불…KM +IòhÞµ¶Ó?¶ð¹ü€—ÄÕìÀF9¼YY# +Š`ì ¢¶ü2‡8Ç®ý +8Ðb4Úù»€:,pÜP±ÈàñÚÞóçG‡ï‹#ËrŠ{³'»¬Ñ;´ñmÔBÖ,ù0&…ÝMrªcÂgå„ØØ%è4á@lR“Fºh9`¸RÃq$î9) QæË%|8ì‘ì W Ýç±—Þr3ÝNÝ)öbŠ`K_èN]@õ)ÜWD:aññ&è– S !vDÜö·ëjnǾè…… ͵cæ£8༊Žcé2…ºDt?Á!èëE†ç~4ïxâS'¥ÃB`Ñ£Qq¹#o‚•îfùÃíO;à­M|”+ÈÌHø˜¼@ÉÉÜ4E³×sÂuD@£'«¥‡¸p¦àžèé’ƨ6¢¹–“‚Ý&`DâÚÆãˆ8>ã7ÂSˆÀ¸– 3(IlAåc6Ð0áÚj9qD£Ù¹t‚HjhÞ©ršˆÛ.h>”†ÏoÅ,ÜIFY>Ê™ËøÑ€‡˜à$-Ã[´Ñ¸“½‰¸aR$ôìPñ>W.¶G b¸ œìœ¦¡ÇÉa( 1!7ÃácaÑÐ÷º¡kN6FŠâ„{üÉù˜5–h¶¥¤®$vG‚ÅÖ±]s[ 86âÇÂÊ |“Qn‹½Î:r\†Ò¾Îâ6zrÊ0[Ïà]hõÈÍØ?Íû`,ÎØjlpPrin9ïF¥VÚ™í¸(¶®_1?ƒœw ÝX\¨heyX‘ðÀDè;²$•=üD ª¤áw†ÒCÛ,å¤a4)2Î µœbCTƒäã”ä´n’¢0Ø¡¯pÄ-:Ô»Þ»ä2X!F’FZcG¸ÂË–©€ç “¨bì^–]|ž I4X‘­ÇLãžØ)œ@›¤èvÆTÌÛ¡ >9¶ÜýQa'÷{Iy“/Ó +V€îäðù.¬Ä"0‚Å 3œ«ÇË=‰C9ÇTÚ’WÂiuá.«‚­X†{x’ž1˸gaª”PC¥Æ”"ÉoNŸ§Òa>ä‰xH„"À½Š£8‰k|ˆ®÷–ùYjØ[Üm[:]ðA|¤Q‚sˆ¤3/i,Ål œ[E +~,wa–óU8ÌàH‘÷5ƒ ¥=„âEŒ]Ï ¡<<Ë&ÒŽQ,ÖPqÇÕF…ì@‹8ÑPÇBx&–šlyâ#0¹Ó¯ânm‘ÒW¾‰¯’ƒÍµf|ÑÆ60®Ä»+4!&Íx¸øœبƒÑ"z»þ²ÚuA³Ø:+D0b56jéù‚…‚,Ž\kfÔ¦Ù”Å\„þ¬§ó @–Ò€¤ŸO jœÈ4À–/>­!äD´Æææ'LJ„vbg2âj7ñD¦Òµ„·…r&ƒ;AcÏOÊ»³Ø ˆU,¯bÒXŽ« Ý +Øq/OväGyÎBæ6N°ØyÎ’Ö¼‘åFÑ“‹rrI úÈ! JEr€Uâ¶JbÚ\åå?\Ó§Óœ1!H6®ôsæ¦I-öÿäp „° ‘Ð"‡ÞÉ%ÊA@¨VjäUä™Ê‰]°F +û9pSpz÷ó+шݶt…Ä¡®†1sŸÖÁG|dGB¥Ò~T–ÁYÜvVº/ʤó~vÍç¼Çz(3N±‘¥ºåóN™µr{¤¹•Ÿ2ÆÛ¿éa£söJGX9g¥Ãܘu2éB“Šã1°¹TÉ¡w¬ÔI~ò‘êÜ.Aá„IÛùÑH„t<¥Ær+….1· äþÖZÚø€å˜V´6Hi]0aøW´­æúgØë±ôP'ê5 +£BåLD×jZ»í·èêr3=w|:…Á͇3%" ¢0êt–Z$/ÛŠd×#ׇº³ù´¯D¶H+l2s¤HO”nêîffwîWdåd‘^Ä!™DÆ)wlYf3œÍ(ÄÞyƒà(÷Ý3ÒÕ'Ž#×÷Ûáx»¶LÇñpW,†_Ê=¬JTRä~„|ú ÁÐpºúá½ §Ø=ŽyS¢iººÄ4‘éufäÄqñ¡H¥¬¥iµFµ;½†:ɸ–V!|Î^ny{—{c‘3¾w1Œ›JŠ;pº ¾¡§à*"¸¡ Míš”ò1ºübÞ¹­G¤™j‰j¤N$Kc![qÍäÔ\iðŽîGèô ÎÍø$ÍB>’Æ—£Î–Ӊ똄VzÒ>Ø)$øË»p¹;_ÌÒUφu± ýú$ 37Kä¦Êþ(SåZýq %eÅš'’’sª¸‰´ûŽXä¢EX§qâÌJVÎà6Ò5ÎàQî>2>b¦XB<ó—7É*n2"í ­¨Ø;£/ñV ~¼–>t$E…×ý2Om AX| »™©?çOq› W’Í}EÑ«Á¤N‡ÌÓd'Ëùh±óÍ¢q‹8‚|^.ßk' œ[cQÈ„ˆóæ€IeŸÅãÄ~‡4JànØLT +oêzT—’0 ?ÆÇ@(³&‰´ŒK%Š7jpGxYJ(OÅ3r°·ùøÌpg)×ÎL*!aÓ©;AÔbooêõ9« + £¹–ÌøH0`S!GnE…F©£ß¨éÚ¯JO³Tú΃çùÌ#Vý|hÚ¼9Z´+Ò®iF Ãm¿’È D¢e®ð ‚$t/’.ì©´*`§Rwæt«¨dnù¯C9sÊñ‹µ®:?áöS„pàÎatç’ÜÄf $bÀçrJWpœÖg¤;_$Š8Iäx"Ù1-j¸wb[ÔöŒpKcÞ&áš)ˆÅÂÃæÏPK«p·&p€EV9Ë@¡”XïŸö ÍJÀAàOíä¾l!w?‹kœñ óÆ&܆{Á(îBÄ]~¸q6V¬#6›‚„).@§dÍ}MX±“X‰E GÎz¥w±ónåÐó$LE峡Œ@(0ׯB6…³É*göB>íG„¼ôêG!f¦ 6¡F3ýX¼Ò}|0>9“cM7½“Ä ˜0C‹XÖ:X(>X7q' ³=Ÿ†:k&-´èð2‰„‘ HBifeK¯k{ËçáEžS²£4 ÃGÄ%š8Ò‰Xœüz–™ÚÝŠOòà3ød<> ˆ›êrº²E9wIk9 YÙÔÑ'öD ;pÈ•Ò<‹â‡鎉¢ÅŠKŭщS±q0(é\zÚC;G‰ƒ¸H â•Bè’¹ © Žj°®@o 0—üÜcÀ +%"¨é"yÜ_Ÿ[·I?3,TȽÑäUÑÿ±ôÿE›Q¨`RóÒ¦;sâ”éé1Õ¦¼ÙݾãŽ2N¤Ñ4œ 9kÅé9¶o,$ ¦~JݱµP¡–Þ§l»k·pbK¡Û X ÑÎxöñWw0•õØ”[] õ†pœbZ/xŽlìOä å¸ß†v§š +!J¯œûkçìƮّbš8†-g‹šØ|L› /,Ÿ%~ŠŠ¬‹ß°›Š°¦Î6°@§ùc Ï,K+=øÝQ«°0ìñé0HE=cã,zMÓ»„×´mTHtè"£.a Kô`Dó‘´mŠÅKGPCzƒº63š—ˆ gYcD©WN>6ŸJØYx™ÃÌ¢ý}›E‰Î‹ànåž÷fiÔDv]œÈÔ'rB'èÝjp{GŽÐ Â|š'‡èC‰qó‘(ìHó¸8d/ÒÝzkÍ°8FŸð |ŠûŠ²Ç7ãíâPJŒ­–£"1‚Ò¬-!KÍ„­In'úó¬Ò8¸Í–/ÁÜ9ei 7¢óFB³¼‡ƒó|ʯ×·ä °-³ÆåÐ|ÈƇ;·Qβá…Þƒ¶„FCõ>,oE²iXª•G¸YÚÍ {’ Œ¥o˜‹ÉÃíwcV(ïÝÁyøŒäu&ï ο'î>¹sÒ>î+Žß[lÞg9•Û_Ûø¶šýIš@Ü=Þ;h,m¿|Ýx|þÛ½“ÝF:º¾¿×j?¾PMºY½¶€‚Fʇ©ÈáN¹?åOþ¿Å‘Ò×ÎE‡®?ZLêF“g‡Z +©¡ 5¦È¹%C|ÈyƈÜ;’185&µÜOŠ gâkè¡«ü Ï?Z#ü_Ÿó*?¹À“|ÿ‡‘Q6=¸WרœbŸ Ã¦d-|­ó•[¢] +É/ Æ0åÖbd½‘¢†!¡­Û|F–LDã"LjÜe>É‘Lt•"=‰yñ;‡×Tn€rÎ*п¿8*¾ ÷5 Ü(I +âîîGŽvÃö‰ ™ìs +YedÙÈá Iˆ,á‘ji‡Ö}€Ú ÷^Éýû‹£â r_;ävÛdèÇèY-öCòùèµqqs6Ì¡A’nµ‘?Š„Ô=9"Š-ìw/tÃcWC†çß^_ûš =xH`cZÃqa®‚ü€:‘šE²®Áh ² ,»±ñ˜‰C¿¹^ç]4n€¡Êèß_U¨Š_;¤ÑX¢w"2ðÑ<´àÆÐ`ȶÑè9Û  o¾ŠPÇdÐãô´n€ªÃ"a‡Er£Riñk6@2 +üò¹q29ô™ƒ¢‚Hºï“%Œò44ãjh2ø;1y“ỸyΆ§: ’S\ø– .$OH£°üNDÿ€‹]pŒ@,Üp²­”œd¼{4±Œ¦Ã ^È`ó_²H#gø d@î”"‹­;É=áò K"ÛƒLp9øÝId *›–Œê³×«¸ð- ÍÍ=J43ª&Ó›Ì@º$f»ñ”ls>µïGF’ÊHtF?*›“ÎtZøæÇ"-#šr•Ð¼1Aê1€eF–n‚ô¹ñ^~BtvýrÓ)rÞò9|0DŧôØâ0ƒbRÁW¨ûî‚Ü×ÔõÆâb™Ÿ_=S“ÒÿÀ¾ÎuøX +Tñp‹áó³Ë=Tyà:t(î.@üÈÈ~rœLº[å\r¨ÀÈß©€Ï„­ÈÝhùÔ€âu¨Ž‘gE•…¿“cÏ¥ñËÁ á %ÖÑ¿Ý­|X"`eˆŸrŽ.È4*È |#z)Ûòe¼’ü|ö$q¾t¬'öHÜO{!;㲟˜6ˇÃv@†)õ·fÀÈúW £ƒ\!“á¦Ã qÅ_nlZîÔ‘vo3’žs>כܭÜ-1úfky…Gé Ò«]fhÊ(ßèòu|@1žÆçˆ g¹‰ }'†Ð¯´ñlq~ ° âl’2 ;«™æ§×êÔ¿Ó¸•ÑIG ©ÈM&‹TaT#·ªL¦É‰u²IJÝürÓM™òÈ=ÍùÜX-îÄ Ï'b¥¹¢À@;ú•o ÷éqtÉ™Õ ä©P1)寳neøð!!r>£¤€*ò_ŽHä¤RÅ•X–Áe*ó ߺ[Ðr\Û=,9(­å¥Æ3oš –¹ˆyÉÆi·r JCS”QšÏ„¦pxÒòÒ(“Ûœ–d”Ÿ„‘»Že)¯LìŸ/ß +JÔ÷âGb)D‡È$¬£S¸ÄYè½ÌG!þO‚!B‘­u› Êg_Á¦/b˜YE|YÁÂàÓpãÌÂÈ}õ‡rŠUÔ÷@OÑ*2N;ÆZVö O 1ØšDÙ¾r}%€™ŽåŽ¸ ¯‹„úH§©ÊB7ýÍ,h‘8Hê`ØðŠs LL…iè†b8™V¸Yª%ø¡“¾¢‚y(I6bà†ìÅç ¯8-AlšÉË ¦½Ææ”8)ˆî© ásÊ<H00öæc€Hq#‹û(òr53ÐãÎZ€ŒSÈUA\rä2`98'”{kP28eš7”ÃÎäzs±þÈ«Å$·Ð0T@|Þ@±_+VL€Ø0S ’‰0L”_÷,žÁɆ'®´ò¤ÊÑð­ Œ’âó¹PZÆ¡’Ža ,²^€êØ$Oœåqï#ëm7Cœ ‘Wj·RΦ[Á…eq¼–_<.åÍ@wÇ¥•&%S¿ï4ƒ{«SŽnll½úä‚ €¤½æ ¤L&Ûç^Ñðb¨Äó0®<’AS•Ê8tänå3Ί×iUz–t–8Ã1- sÌ‚@ä@³ƒ¨7}­“?ù‘½£…¹3¸ §Ys««,²nÍLf†;æ +r†‡ÍH@”¯épœ’à ³œ=ГžDâÄK•*Ñ°·Ur´n¤ž9ÏF*ùŠÌd$ Ud'Ó¡ÚÎÍ›do ƒ#*qµq»<˜ù½™ÅÚŒ–w9<$}‹Ü„ËÎœLB«È¨,»Œÿç™Éb…åsŠ+ÏL¦)§Ä”Öž/Ê`ÃGU€\ò˜—ê(e6qAô»t\QE+ã:š$›òŽºÉƒ2­”:å…‡9µä5^šz¥œ³OqHR^cÙK’S«˜(‡AG'gœ“×ÉFJøŠ7‹ßŸSûÒ_¾dÔ¬#®rÞÖ0Ü$¾‚~ÑzYÌÌÑ0!–ÍÔƒ<­Gùë<ïèü•ž›ü+ä”úâHLSNÕÍØ8§1‡W¤rüßFþNÿ0?—†Ð.N¹q%è¹¥1²g!¿€`á8ì€ò*ÜÃö‹0"¿Ž€e»&Â6|£2 ö’W€,³]õ¦ÊMJ˜M×M§X"¥¥p-]; &fSaQùÀ ”)Ž¨J&J )ò{“8ñ$‘]è½Ü2ÇÓç_íOÙðpÄN`JH„r}Y€â¤0%yPÞçÈ€™$’M&¼>“²NŒx¿VÎéHŠ ›ÃÀ/èêÆ +å=õí <™˜ +ãr…Ê Ä…×ŠOÎôÔñ‰°M° .\Žœò Üœt€ÙÜù‡u&8{g~!²±ùå2iID„R\_¤¦îyjâ}Ë,ž+;r¬¤Ø2S$MMD6ŒÖ*E®[£ ÙÐ6–-Ùô Z¥(À’ÎÖâè»|ä$²²å-ìåƒ*3SÆÚÌBp¶¾š03 r_­=ES¦ïžjì,ÂVäQ“æ2Š8Ä>˜K(ZWš% &. ,¡ˆ#²àËè3;Rp HìS6¼Û-yÌ›ªŠ×~lÞƒ’P¾†— 8²H†«½¡Í¾ŠI³¤b”ås@c³;•@B'oϤ“\ô‰"]r‘O@–Ñvüä(íLQè’‹xE,¨Ìòà ? YrÑû"ôÉEÌZ ³dN†dµ<([—4-]¹Éõ¹Eã‚—@*Ë-âô^-‹ås‹¥28Ÿ[„fwãíäQEË+|nÑ{¹Ü¢iÊyqXÓI$r`\š%q|ˆ›rŸ5ô)?â[­T¼¯“3Eù’ûC®Ât'½ˆ”s˜º DVZÉÓ|z1%¹ôbèÓ‹ü4†¸”ÞÉS™ä²‹n€>»èR» rYC+¡‘ äãiñ29ÄY@Y~4áL@:g8†2Ÿ\„ +SŠ‡ú5e[ ,¹èM8“dÉE㜀t–â=JÙŽõǶ?`.·hÜLQàYÁ²«àAáGIé:qÂñ´4óË#7mYnÑøeN²Ü"œp#†H–[Ì}nÑ4M6»ÖgïÄâÙMr)u×ÞôîO©Žtcà,·h܆k™YÎ{H”¥©ùcé(Ç2¡ ¸“[äÝð£&Îr†ÖùXäY†3þ…ëLìŸæ¢^ÖeÐ ¸ZbèØÍK.ZWO Ÿ\Ì:ÉÅ ˜úä¢uiT“fÉEëlGfÝ4¯D§ ñ‰o]Ì —5ÌI‡|v‘ÏÌ_gø_PêäCì‹·u3( mk·rº¸v¦_’…ɵ×öI!ad¨“±â­ïù{±'H /e«º ¤ã)iå¯ËRV²ÇÑò)« ”OYu€>RƇ´EÓøtv™ñNÔMyQÛIY©Ž„ó.!OWróÆÛC‹‹ºZ6m:n'«N6 T'õräÒ嬮42É>1v ƒNÎ +'«Fî:å«åD2ÈWz”Ág ïSz‰Þ¹û]JOãÝÂòÖ0{«·d:ƒ“ú?F!r(Hwª»3ñ–W~R¤ÑLiúâØ+Í<03A²qFj’ªzœe­®·ŽU²’‘ÈÓ§ÏZåA9ŠÊ€Ê!Z Oœl^¡cn T¤÷8£ãŒ+¤&¥ÀQÆy–2²_4³É±J–¶âvEÞ6Î\Ï)p¥d¼|ÚÊCòi« æí;)vˉ&¼ÑñXÞå.y†2¼'³°~H±êÜ’º[eŒ…ÅG„Bë’06½–ªÀØ‚xGV%‰ :ÀpywIWiÅ•S)Ùœ§¹´U”ÏÛdÀ,¨¨¼~꤭—ÝT¢ïp‘S.â—S¯Æ­RA7g¬“JIxC]þf× +¬¨þ¥QEÉLˆÙ’-˜¼™³htÄÚûιb’¢ÓÉ[‘ b•‚Р‡PýC‘ð­ ñ;º2‘Ë‘õdã«PYn‡²ªb+Ct®(´då2u•ïäÚ‰™0 Á¸`‹4šËâ.¹¯&<ÅXQß=ÅX‘oF9ÃÕ[Åaœ3\Q%–0 7ðÆH€:Ò˜ûF”?¤¥ÜuYÂUv(cn”2—{¢Å…œ.g+Ýrt™_‘ÕBHk¾¸À¦!g—yÈž¹¹ 晾Ê ‡0"R¹—4\ÆyÊ6à8'·\3’8'ݤîÁƒ2/Yw`{ö‰iÉŠµ 6%`CÚÃH&ÎCå  öS¹1§8–P¦B2H^Ñx 7\tç$îF2Ö¼n“V’f:t¶».Ó”!·Ç÷ O^eñÀ¬ì÷¸æoN¸–«ð +©qâ¡äòhÌ0«g‘FYŒ—¯zÉ@…ú è“— ûЀdÉK©µà)ïd/Ž§–Æq\~ý¸ DòÖw¥µ— Nj‹¤çQʭг–ÞtÅÑVÞì­CëJxÃ(gºb;²q×9cÓº¾; +\ð@)›¹[yctéºÄÑpçim᷆Іt½ÉN‚^ŒCäp€ŽÇÕ‡ô8£]˜ì‡Êó‡xDV\Å“[KÖ»£oo»"üÅn};ññ˜ÄxµÖóÆk¤sáDôÄgݶï‰â­aR"eŒN…’ÇØ›p´*qB96Çjn2ÒíÜÜá–ì©txÊ3¸EQµ{^}JE +F™õšå' ŒÜ¬Kî3'¡h}.2¢ì;ÏU>DUXC§Çò\E@[Y~i¡PÇVöþW€_ÈÉwz¯ŠMA `(N¥v´…mÊ¡Œ’MzGñäA™‚Ê"³®š §îÐIQy ‹ÛI½Žú´®Ä*§d­«D+hèŒ{òÚºm"…›%!’3@wÖkèÎbKAUΨ@Ë9¯ ³°;Køm™Å.a:¥s‹zªåè!t=ErTƒð€Ö%êBgR'ˆ:žÔ‹,ÀÓä<Ðçnr "™ŸÜK¹ÖÕ‡iüà®lœËEiTS™gç®Ë< ,Ýœ Â_|EÆHù¡¸þ&!‡®Î1‡XT¨J΀¾p;{X§ºÛ+¦|¸l[Ë­ßDUXÁØ(]âhò(°tÆMKí2yzUÚ&•€ñ@)åSô‡¸­Žá˜²Ð@è®Ë¶þˆ[ šÎl¬ÈvŠ•:ÀÄK ¡`ÕŠ³\²~•4ÂÍ[É’w,ØÒ‚ +lÞ™”¼“¡eÈy¢Ü±72L +¬:=]`ýP çY?t*ž‘õ5(P6)y`FP²I37Å~ã[a)BlÍ-™4å6ìØS ʪD¨îLÐ͇ t’…V½2ɹ½ðb±+ +ÃãžÊe4´þlu¤âÒœt@¹¹ë3žuÆV"ñO ½ðsA^Ž"V6C¡³þ®mk‘ $ÅQ V¥aÈ=¸rDè?SW^VJ2ƒ‡db6<’Ýñ‘ï=åAÙœä™ ÷óœ{ggrcóë…lCINho…äÉ)‡}ž$BŽAD! ]æeYA»eÁ›$Tô~r¥âXGè/£‡C,­URš‹ ž£”u'ìàÀ’”ĉM%˜Ð̯c¸wuùÌ,Vv6à‡ øª³ë>÷5<ÍN}têz´­Öõh[©ëѶR×£m—ºmËu=ÚVêz´íR×S¼.ðc+ÖõhÛ¥®GÛJ]¶•ºm»Ôõh[®ëѶ\×ç/íÔÉH]î4 ðõ:ÚVêz´íR×£m¥®GÛr]û¹¹½\×£m¥®GÛJ]¶]êz +×EnrËu=\XbKu=ÚVêz´­ÔõhÛ¥®GÛJ]¶•ºm»Ôõh[©ëѶR×£m—ºžÂuR×£m¥®GÛ.u=ÚVêz´­ÔõhÓ¥®G›r]6åºmºÔõhS©ëѦR×ãA>0”/óu=ÚTêzt¾k€«ëѦR×£M¥®G›.u=YÀM‰iËTêz´©ÖõhS©ëѦR×ãAáGIé:©ëÉ¡¦6Õºm*u=Ú”ëz´éR×£M¥®G›J].n¤—ºm*u=°–ãlWîhÓ¥®G›J]6•ºmºÔõhS©ëÑa¥®G‡]êz +×IX›J]OW_×£M¥®G›J]6]êz´-×õh[©ëѶK]¶•ºm+u=Úv©ëѶR×£m¥®GÛ.u=ÚVêz´­Ôõhûîº6©´é0ðÀÑŽOμ\ ¤€÷ñµ© Ø­‹ÊJÀ@ûF…‡•Út X +0QTx`!`P¸Y…WHÀ 4ññsCö€bÿ?{ß½ØÆ<ü½€Þ”D‰*¤¶uVõÞ­f–•D‹M,Nœ?~ÏþÍ €]ì²Hö%qrçä¢#AÔÁt3RÑ Ã €“ÔYÄa‚¹pH{#¡dQ$; DY=\F¸#; „?+ä0ˆÚB~Fš9à0.³Ã #”^‡yå¢,Œ8 ˆ*Ã,pvi…¢¨Ê Ã ZÈ9à0 aÚ^Ôa@Ë; h±a‡A(raÄa X8 B[!Ò– ‡´±Âa Š$‡A'¸ÃYրà R‘)ÑBÛµ#s•ÄpD–AƒÐj™# “ hÀa@0; h'Âaš„¡õ—uDŠ9 BÈ#LæH¡ÍuÞ¨Ã@Vï4½ˆÃÀe#@Â'¹hÀa Á.è,ê0íƒ4·¨Ã@ÚU-ÀƒƒJ0߀Po£…Qæ; q·ª«ð4l2ý)²$èEª¢R8J …W0·MGuW…EéfÉQ)dè&‡>¼$’¤×w!¨A´5ˆV#E¨‘MôŸç@øÎiþÔ«”²£´î“¥Z¡Bî?0Ó̶Ñ}÷ªGoé»LΣU]¸0l5é:{2ËŠØ™ /-éŠb¨»ü@ñã'¦­‹ieÒÔywÜ}`rE“¸âÐ8(òÝR¡aú-Y¬Xá>àV-–îa Rž#ÕõTVœåEn¢ »pdÅéÂ}`òHBª.¹Äa™ªûî–}”ù§`&_@à=À½ÒÌH5Ó]Õ}÷ÉïÚà¢|÷²–Â{àûwtß{`²OTä{L~Iœ2ã‰}aÇ¢ªî{ ÈµXo÷Àä/”±Ð±Å±°€¸ð +Xâº.yüƒ"¹ DC01d1ùŠóð–àѺo{[üa;Â;ü"MrH…Ây`ùOA…÷ÀbOB1:»ï<°Ð[JpðÁUß+`ñ ýª:Åvm}ÉÉà2j•¼L`‘ï<ÀC\FO¾÷ÀäñYú(¾§¶Â~”¼&7Ž(y† Iñ:Ü÷˜üm>ùÞ“+RXÈÝxñ‚ÝSð݈ЎùˆÏnÉHõ„ ôÝfš§ÑÖ÷É÷Yó½&O4…Eú@‰ï= +…÷ûâÐåΑÏK6¨yFCÍw˜iVI  É¸’ä9@¦Ë.Gùž“'¢›‚lmcÉq rúa¡"fÆ"Ð`Ò®fX"6ƒ*9,AÂr=ÊÈJ½qÇÅ}c¡ub¢ ŽÂq`¥Ò0M7Û¤¢ÀqàêÂq`q ÒwXBÔwä- ƒS·pXb;tß! 1†Àq !·­T¯¤8ŒáY>ËfѸH )>Ö3ßšªûŽSäiÐ}ÇAT”: ~ËFÕB÷*y¦N=t¯Ra×¥¸üªœÎ_¨C) †òc3é›Ó,§‚ÎeÏËÃñëxºöpü:¦Ã†[¤œ«rü:uX ǯãoðåøu¾Ø žÔEÒ¥ã ÐaÇóõJ!ì,‘cKag9\b1­Kãì>ˆaÇ®æ‹"±~Ž„r;JRÃp_~® 8¨TÈ\ªÍâ¬1ð2XŠ!qwavr\rZˆ+kg#(‘m]QÄ°ãH +ag) +›†ÃÎREKÿWûäHtâ,'tµR1-©ž5ŸK²àj¥Ê±CºZ© +ÉW+Ù«UÆ©r@1¿H¾ZŠ«•ÌpT5éj%{ j¡«•ª`·ÁÕJ%`s¾_ƒ®ªZÈär, +í¾ËIQ¾YÉB¾©á@vB Hì4—ï¿é{ˆ}Å@dÇó¶ËÁçXŠbUPg(®TäûÑ9 ¤z6ßÆ 7ÌU ‡²ó5™`vì¬O•cÙ‰k—¡XvŽÐ¼d¨°X3j$t™© –ùˆ¿\E•CÙqNŽe'ÒYž%”½U I(å¨'  AÛ!²ešzá-‘}²`>çMù‡¡{•ªÉ72¸WŠ¯’l‹0u›>RKÞa©H÷*ý"ù^eP(4<ké^¥ÊehH#UmÍ ‘žMêa’»ÀòV󦊡G¹,^86Ü?6ñ*´¹€ nVª*O?&ÄOW&eü”¥Šv]ºYÉ7 ýBÿf¥j*ag2/,M–ÉZ x$ìp›Û¿©X¾…-‘£žp<;öÆUjŒU.˃眡WO¬hÌ®Už>´ü¨23x±R fÿœDã'¹Bh<Þ“„6¨t ‘ÎI(C¢Œ†¨Šs´ñÝkA‰tNâç$~gÁ9‰?hp8!MNbhüNµD–¥"iqž¢iq¢’±*T$“¨gôò9 K—(MY§th¡…IE²š +mÂï,P9T¡ÓHš‰juÅ×`ØÃôš£q ¿eWÅC$-Ê'%ìô’4}Éa©rü 2i§KŽmnŠàËTDÖˆôÇ6€ºäÙöGg;(’<ÛA¡#žÅ²€q!ÍÖ èV ˜çÅEz¦$|!}š' +ã>Td'¶+\@¡B;d×6‹«)Q¿&¬D™ü5̇&áS¦Õ +ßvP$ù¶ƒBŸø“+ísÛÜZòm;®ÐÐù–iüWÚXåÍõ‹MœÀ „PÁI‰A^hÐë€h¡ÍýšÁ¸<‡©<;.«àÉnåŲÄ!Eè‚BŸ± _´ŽèÍ7äü£ÔÕ´èÆúk¶Ÿ$ !”Fɾp‡½¸‰úf±ß¡kþ Š*|³þA :Ę¾¤ò³g ™ä""r!‡\ÐY^LyFø›èþ–ªÌ1¬‡ŽIü•ËøàëÁ1‰T(s²póI0§b+ðŸéše‰Ã„œ:>§ÝÀ"ß=fëÂ]À;XZg[w=¸€e¦MI»Dê%þ,K¢ñÓÔȻ٠÷@Ñ_œ=à­ ŒCÇ"_S?3ìÍö§Þ¸d<Ž©ÐMÍÝ8ÌÉì—ú ju~)+£xá,"©¸G¼Ia‰§}#†=XlyC +1’#*{u¹y´N€E!›$sº#ÿós¾PBŠ3i™ô§x”º/³2RB’G FÀ4Ä¥??L]îÈlÛT +>´ÔY | JrE”¹Vy‘0-±D¡ %ÂÀPc®’X +a4öt$“ÉúSýH¶Œ>(Š©€›_$/ß/ nÓ0´!¹$âr0?=É%½oíŒFCûÇU?^T‘9LdóÛq\r ˆ{WÌ”«êü_´näF +yRö`FèݲœÐ¼uþׇ&’ð2= #–ªÂ[ÆUÈ¢Úý$x ¯Î¾2ºd7RüêÒ']ô©K‡R{560TÏåV0kFÂ6ß1Ö#wœÚ2ÐE±R?Ѓ¸cã¿ÕñWÊéØ î½Ç˜)%Ug_ùJésPÝÿ$*Ñ'îʵ7bãð•þ]T¤1Óòþ~ó÷߆zEÆÄ?ÄP|ô£5¤%Ë¡?‡cMýýoL„чï9l­°>¸÷öñšPIJÁNɱ‚Œ¼>º`u‘†4†Ñ%<2<"¥²€Ò„0v` *¶C +Çz„&b½¥…B˜Že›ìÚ¹=X*‹÷aMŒ¡c ÑÏQ<ÑÍ?ƒn~‚nü‹JˆJTG @ (H#:ý‘dÒЗ¢„:œ°ô°ÁfÛJKL³ ¼ÁŽ£;‚Ä2Ðp3 +"¡…ÝêzÉ"Iã#°`(= h[›>‚òô¸! ‡ÐøPLd:âe "‚¨#hpÈ¢¢ ‡QûP¸ýóçeý3)ëï·Ð~ÑñŸFÇ?h)ŽÜQø4(MG +Ó‹‰ÄãR¦ÓË×*8~©ó-¶ Efli§Ù‹%3;ª~\êõ¼NSžæù·¶7[„Šªkã“ᚊ¢`5æ¯*x Ïq1lu̶i©K§^©~Pêuj¿CËPçîY½VñÎ*¥z­ù¼Õ©U÷¼olh–mµêTÛ<®ýîսΓWé}k”[õB³T®{¯¢¶:8ïÂïíV§'ÍXêЯC½lõkU¯Ëj­Àn,9»¾šH@Uå±Ð¬²1é»ñ˜€4yIòfÔêÄ`ê o¯AÁ׿±ûPýðµ¨Øó%§¯¿Á—]øðŠè¤)v{¯Äª@~ק¨wó7’Ž…ghÌÓ¬°QŽŸ\ÃäQ•ÌWÈ/ÓÓá°h•CuŠ?(2×àχØù$”èìÖht´ÜÄL$O­™ ×rXJ^² ҚDŽ–÷IÁìq) ½ÊJØ m…Ý[·•©è-Ia*?:†¶, û3²éñµJµ4‡Òx§Ù!²E/i¨>ÃPEXæêò*­óÑD¤7¼ÄÇžÏX<ñK3bЙ9g˜À,5~]&IÇÒË O.-̘¦aŠa…æ“­àDìÅ\Ã:¶Ê^½â{`K¡€RCç&,¼s‰¶MÆïÆÐEÛÂ0JN ŸØÓɨí2/7¡QºdÜL:v0Õh/õ´b±{9 ‹ãìš)n&…T3©© @¡Ò'àqÙË)*Ñ\DŠzïP*\ A‰pBØ9áªSZk¼F ‡AúèHÜÁœexÿÀ†5Ò‹(1)ö•CˆÔÐx®_†9ké`_å/?,±‚¸¬š²††9B-—Ö c€T|ˆ‡œ6>‡¢vø&ŸÙx^o²vˆ÷xG¶E×tþȘîØ +? +@eDrßLá•-ÛAïà)¨aò<^0ʦMÉiƒvW"jˆL%|9ÀB/ç ßsðŠì¹!Þ=ËÅÁéU¼í°·i†HRfcÆ#›z O猨ǒ2#ÂÙør‹\Ê]˜-༟3€. ö9å&0ì/•ÀÌ,‘¥?à“]üÁ¦ôÚ.ì5=p¶Lž© +[Ã|,µÅ*€2–ÆÃâ ÔñŠ‡Êã·Y.‹x†9âé¡16qM7f:i6†ƒaLs¦Ã£ªÁøH˦HNß1\ |w5Ät ŸÜ¢|5‘]P^mƒÁ ϶UÆ@¹Òð;]‘`ìšàõÄvKcE&b½ÍÚ(®N¥îÁEŠÅÑÝWLôL3Óø+S Ñ$1Ð=f\¤a°©áÅ㔉LöÊä"M‹åé61 ô€‹Â'ÐÂf×OM¼EaBŸ6¨}8ˆ©±ÈÐcd¦ÊnÅPö¦ÄTð!öÊ.ua–GE†™AÈö……,04–ñÉÂÇû4/§ˆ,ë‹£ qÑU6èÞЀOÛû[fè:¡íRzl ™£šéì'ÂÕÄG6¶ˆhñ—_X âírË`Á©»ÛnQèJê˜=³±ðÚ^Ÿ9 ePV$¼ÈeQ@\HL›"ý+.‹â†•MzHJSèò®ECu +)G, µI¡Â#ÑèˆÝødžã ˜Icá&2užÔ[ãyºP’éLÌ[.‹å(,06EEí $’Š:)·t%žM6êöÄÊaI IýWP=CZÂ.´´Š3lM›ð'ÈÔgÈÆÀ76M ø¬C^—ø”Jôfcbê‘ŒTƒ,—CÙê" D°XdÔÚIûF$ÅøK0Yߦ¨'°ï?#Š!ü"‚ÂÂôب?¸1@?LŸß,|;ÇÄx6kÀq0˜<š)ôöt‡‹ qe×Á‰¢µ«15ËA$sÉæä–¥ÃÃHk\°¢ÑÏ £cäèù1L‡‡KB”G.׊T&ö÷'€³káh¶à½uÓçbÃè@ U’™xËÙaºªÌ&>eEË–QÑ Ïí­ d6U<ÀP˜Žj*" °'Ã!!NÂkPV/€¹¤ YêH¯&=ñÖyb, ´Ãº½‹è=º‹ÑûH*)v(´‹!¢Rk6‹÷”›@Õ‰%ú@kèC ¡ƒH ‘IuùSdUdikŠÈ ¦²¨šÊŸ7ëØ ¤ý¤Ìp&³ˆiCY´ ÊÎ @œpDH¼O¯ù‰b\f;ä&TWpc¨CSañÇ``25UôÅëUÈ2:ûŠ`]>¦ª,òÐT\ºL¯Ût·Õåiiu—ÐGù/°Ef‰a,Øô(@ SfÙùj ’ÁWïaÓ.OºlcÞ=éV¬qprS±z ¡o1¨[G#®ª"Æ‘Þh0M Ÿ+³ôØèQrbšxš„ˆÌ¥™‚”JŽ(TkÉ%a±¨„†ÎD:½ŠªÆ×”#ŸK܆¢¡Š)9Iˆ$ÈfuyªLAZÌgÇBH*Øtrz°—ƒ?Ò±R*¦XV˜fŽz6syP¨¤êŠ˜÷‰sÔ +í§¨G+ GQF¦Ãðèèh%:L3"´De½L„ñ0,Óy®c +Ö R “£ãé‘3P@¾Â‡BãÕ%—‡œgïÁ ˆ`ŠÈüYð$–‹Æ•ÉnŒkJ%<š•æ’].=tt?Eåm¦G¨<Î+¡ â²ÃÕd$eÊLÏ(©h,T²EFá éw˜ß‰Y?,nFn#A <’®C+CâfáÌu4,¸&B2PߨŽô ºŒ]1§¤j±¨ìLéã¡â,f‰c ó¨;'Œ­”j3ÊÆIjâ’)+D]LSD.ÖYÀ{¬C&KIÂœœ6ÓÛpç œ1.Ž˜ÀBd û†žÖèì8 #•ñÃm%\FËH£v.Ž«1ßK‚á +%Ë\²›t”Šsm3rƒÞÙûz0È\–ñ_«TÈMç°2øýa4²j4¢ÈÿN><òÑÈD®kz…ÞRÕ}ÃMC+Ü‹:Ëߧa̼DŇ–;eªÌÊ3S¸B%ÝÅm‘ÈÀv¹Z€Ü€’˜ ÁÄ$$W²}J’™äðeÑèun ƒVÈ2©j +cÂÁxxnŠ!°ÍŸ"B" €‡PEƒLQõ½Ä…­Ž#9‘¤N p)RHJ•€aë<Ž Ú ¶¡q`º\• r}ÑAr@{‹¢É ï“Â…¡¶u¶y.ÏkaÈHrv9œÇ£éOQ¡ð±=†£sËäÙt-qHçPzd‹â¾kÌ÷ÆÎZ‚iJ³Wiˆ3ªÂj±<£E0×,XÕ™`DœMÝ¥G´*Qsü»ôfŒ9ÿ˜´péµ°Î)¿ýR˜Ók1G1ž-‘.O†šèLbáwÑ"Y¢‹(ž*׳|väPŽáœb/e11.iœPÂc`¥YžTÞ +µ T§ƒ& VÃ`ns|ÒQ†Šþ܃ǘ’ñlÔ*=äS‰ó“/K!‰€üYþ +Zµ„‡QÝÂ9}Ø ·c±=Éÿ᢯۵„ÿ³ëâÙ†™Ü\TE<,@#K5˜rÈ!~POÞphP¾c$>pK„˜"¨SÌË€vØ´ ñÌ#Π¾@™¸€ÓS(á9ê®<Ëž†/ía`K$§Ä׬*•ƒÛ¤òé=•ù| vËN{ih‡…óöÏèP‘ŠQC`” Õeú âv̞ˢбÓäç: Ïa @¶Ø¹2”™x^Šj‡Ch 1ï°N¾JJ£0W5cј] @¢8 +›/M—¦€jå–ÂÓe£¨PUæMµyp8P†lô!aj>>9š':xy@BߎÓÉ +ÚG¬ª£qÈÁ·™è›Ò —±Uµ0ÝåÀ£uzU¨£8ì5Gt» ÎòϹ=®ü)·ÇMüúxØjwjÍL:•bÅt§\þaâ°¿8ì—ãzþ•¿À +&’™j«ìŲ~÷%vPj–ž½Nì¨Sõ:s㋱s¥z½öÜ)µ_j^ó–¶3cí^:vŠ°4Xw.–šH†¨ã[„+ë±6u Ž¾–êïÖg}G«Rcêë¥Þ;]SKð±_yRG´D?jÂN¿„Fɽ”:•uQªÇR±¢5¼ÎøFùÚWÀ¿R£.ÂÕZmQ…cØ°¾¼f­;óJ¥¹Xšá UCþdL«²ñ%N$a®ðW‰QZAŒ™‹t}•%fÅ2;Ù°ºG-÷keà¹3¨i>"ΪÅRóïZÉ°íe°M•÷ +µØRì¢Ù,5¼jÌZŠ‰%-ÑS©¥=ÙQcÁ£Õÿ¤ÐÚb긅}ÿ<9E&Ǫ@혙&î‰Ãëš8F†Me:­A²t5âÿÆ.àÏÜ™Q«ö1~äÂ5M^l†‹9ѱßø¦‚¦-mè0`ðÏ(F±­‰¤Ìoñ+2`üÆmSÄŒé¿Ä»ÑCë>7¦h €Åðô„¦ÀAö§0uÖD”†]úŸOjÉ þZqP•LYh· ¼ø‹Æ v— ìí_µÞQ’&¡Äð%¢4 íýY|75¸ì`{g½ou¯;±´×lýÖ¤/ c&3ÍȈ¥C dг–2 ~õįK9®µkuà!Xz­cXéÓ%y•E°–.kÝèoØá`g½Råõ;zÈ–ºµŠ4V³Ú¯õ>Òte"¶t\êô†ôrÖë´^½ÏB£êGÞz”uu`«wêUZ VñGVÃ1Æ¢k⹕f9°Û`É8(A Ë0ÁèT]ÛU1œ3žmZ¶Š‚Ê4"¼ Ê"ß³PùøYÁ«´"J>6C#%øÇŽ]g†?ˆÔ0Š¤ÿ RÁ‘Xëº +Ëñžb+±‰XRš:ªÞ+1ZiL掑í`tÄa{ôôÔõzs4ÿíù$YÍt©úï#¨ïqdN†ú‹íbÇ +Ohª@íóZïG66¹ÓìÖÐtÃ*‹æÐm×KßØ×¹{/ =uäæ¨içû·Ç{+CDLrøîE`Ÿ­{`–~|ëÆâ=u,puø«\ e*/3X_ÐÈùÿ¥ˆˆ¸ð'Á·k/º^á«×<ªV =pˆBG£_.GaDQªÙ2 mRè^ Vª5Ll‡Í4底ø›ÅçÑÙ¬d?Gð¾‡ý—âÈÍ«ÊœPÑþüþ÷‚ÅÐþD°ü$>ùA@|L,~÷*}œý@m‡©1Õ6ÿTÀÿa­å¨ßûµ£â¶­ãƒw—EÅ1]CÃ;2®kÐETk5Ë„Ï®£¸xŠŠR_WmË°_⨺ôÁPÙ˜ +z¬9T-RXØ0ؾK/RþÑz‘`T¿´¢¿ZfZ¿Ô¢_H"!‰0Ų/ÃñÅ“lµ[ÐÿOÇó¯Ð"þ FMý¥GCý_jô«ÑYï«ÛÞzêý«é¿Û úa<ý~—ä›c—ð·x?ÿ½<ÃD¦¯ãÑͧÒ5%ECÁqñž^dÃkv2‹efW±ÿÇßb¥îëx›‹ÕÞ©×ûtm¦ÕI—Úà /q@˜YcA­ò 4±ä)@£ßý:[7ñ|w<,XE¬7Òú õõ1@Ø­§noŽ± ºôó¥ÙkãwCThÔkÿz9jÜä09ü¹âôM²æ;­vìì¥TmýöK´þÛDë?‰¾@ÿªË¸sƒÇqg¬ÈêäÎajø˜˜â̸\oV9sfÌø«×é…NÛ¥Z L_°UK×á¬òçæÿ^Nìf·Rï„ÝïzÇgûÙz¿ÎK«ó袠ÌkÐ-&[Ä ‡f¿‘kµk쮾/=:­^©ç=¢uý†e` j«QûÃÖ ï=w¿„ã;ÂQì$áÿuÌ¡Ðmó—xüÅ ‰Ç_ñ?(ÿaÒQÿKœ¿D#Ê5Lu㨶kŽŠáÕQ’Òd‚£«¥0ܵ­1CÒuþª#µ_ŒñcüËy >W2Ì_ìåï¿ÚæpÍâæMù*1À®£ÿb(¿Ê¿š¡üº+ûŠÒPtL˜Š EÇ Oÿž«Öt¹WûKñ矰û +ß +zúŸ¡þâÿ•Ç˜ÅV½Vzö·Î~fþ›3>‘ú,–ËÖÙ(ÇJQb·ä»FŽ‹B/¥™˜ÕmB]ÅŒ?–iÝÇÚ!}ÿEY \³Ó»E¯¤ zš‰‘t°«5;F9MS³ƒ`2†‚˜\0)AùÅ ÿLfHÏO™®»þÅ1ÄὟg¶ªµÙª3[õ_fëÿ“>ÖYª¶ú_:ë¿œEÿ“êj½Cu^Éð÷j·¥ßêßú^÷£;‹Ù ,WµTC5M£ú­š¶i(“–åºÏ]Í2]v$ÎŒ.—ãup0oVòÐ<¢Ä/ŸÆŸ*!(Rb,×ê4½N7¦ÅÚé»Ö¡JXh +Ö¹|¤Óï<ïŒ=ÿ×K»ÓŸû¬cTT¼!ÿ#1 ÿ;l¢_žÜ¿ëÝBi©_ïÝKÌî¬Öh×}f7bþM”Ãpà8tO‚EŠ-4«AœØwƒÍƒ± +Áã¸Ì‚EÙšjX4Š‹²0#§Iy,ƒ%r´lÅÀ\šé¸LŽc®ÓVÑO§[ªXFòVNtp?Gð¾þc"Z>q\ÜäÕK­ç±ß~îC5@M45–<¨uJÏ Ù¶²(ÏŽŸ'0»– +ð1lÌȨ öƒi€\ǵmMÇ°°E‰U˜œ‰igtšLM·̦©ÙéGª\ Ja²ÐhØXÍŸ,ªQÍïtMwc[k¦Ë®Ù:™éZ®áÀNäXŒ/fâB™ _]ºV±-Ø3ÍT sÃϨŠnÚ ”¹°ë˜×§)Cú Aˆ'}Çl¦lR*àíüµ`ZVi+-G1MWÅì¨<š–­c¦_Ð"m2…žØ0WEýÐaê¤*‡#£HúŠ|̉±ü:2Ùp3Œ $c@™£¦Ãra&Ù5Ëæ«È:PGEL¥TP°ÂVaV¦Žwè1Û.F4Öu þߥ£TJF¿ÁÕêÁœT¼•"faø«µ> 8 ’ +€Ó@4!xšЧ dŠÙ)ÐlÚ‰ÂØ m«FÄ.oµ€10.Uǵ«–&Hv«SúÖõ©õçò’Ü0søïþÛ[ƒJ@Ötö€‡Ò«3Ìȶ”¥©5„VÚÄUš Pu€ˆWÑ0[¯F¼„½U3eªÐG”„ xp^®?-39Ù +Ž¬Z„‡¦©CW¶¡!òP XzŠT¬#A#NMéðɬ€ÁF7B³ ’ÓÀ z˜s~pZŽ˜–騶©¨˜ZÝfE,Hµ€ë:ªiœãÚª†)‡¡Ð&œûÕÔ4`ðû´C¦s³ ãâàœlN@´¦jÃæè*&‚¶š†¦²”Œ™¦0µ¦jƒuA蘜NÁTå°ë.Ê •ðÊ”¡BUÌ…QI$2ãà¬,1+`Ö¶MY a&m ŠjàLŽØ7ô»ÜÆLx¬¼b“<3C¸Îp1¿œ‚J†ñpR¦˜”nY˜¶]Ñ>«u@þçFg1r0iÀPÕxDJk•­h˜º"ƒkØ4 1 èY,²ËbžO³##PtÍUt&“]ã É€KÁ†Ðc#JÒ*ýC¯BÒ‰JÂè=8 ]ñÙ"úR€Ù+˜˜‹1ø´¡(£Ó&ÜŹÈ‘lÕB• Ù¤ nbÎ@|N'‚âƒÓÐÄ4€)’ZŠ¸a²  Ìñƒ±íM\,1,@`H›…;€¯nD"`IXRc„b˜Ù f l†r‡b`"WE ¡$èDW- ݪ +SÜ3¬ä½=1…ÈÈvjÏ/½@h(LS¨ê°5ÉFО\³Òƒ¤”­Ù@k F`æ6îƒ ¥3}’¢»‰€ +W(‚*–Dp)˜%ž’ÜÐß½5^0>°7@QP½?1Ã'ˆ6 0èÜ5iª:þ†ä®™ EQ@ŽÙ0yнˆ[BKþjN101"P’a.*.ì¡ Ø„„¤;1ÕA f!ˆHçzº)¶£nB$00,2“,»DK gиšäL×2]ø¨àX07ÐÈ× ±AçR€[ƒägdn ƒ°"'¨Ò|"aÀ€:ª´—aˆƒTã"]Ãnh¤tê&fîvÀ´R9ï…™ƒ³A¤cæÛA¨“èŸ +Nà¤7Gg_4¹º‹Û²a¢ Œ°ß ÌP"ê¶Ê°WAý8¢Bù*)›i(Ú/fç•Ù­6R XCæuœõíSa†~O”}° es?Xe¨ûsàjC(èfº 9g0±i?’ÒEUØO,ùvóÿ`¬N«âu»0ÁJ¯Ô|®ƒù›¼ôð 6¶Õ©5ð+:Hµf©çUcG¨„…çðcì ÔyíÆî’¿Õz/17E¹ÿîæµr¹Õ„[^§ìuJsÑÔ{lôÑ«à€Ï·*ý†×ìåK½¦:ß)ËaÈ9„߯ö[Uoè+±äïz~N•z½N­Üï‰K™hëKBÿR­ÊK­^íxMVGDO¿âŸžŸ-19Óì>~-uº+R0o¹ê×R½/êbywD=²¬o?{Y°O”D^SûÝ%½xè­ùȺDÍŸ½8-­éšñ¡ÅýV«Rçw×Æ+þÜ¥ù×ÊF-§Ü꺰ï=õŽ:5°*?²²Á6ÿÕ€xâY«ß©xYt5ü)ìñ_m¸)C~•!Ö+už½è èZèîä?²õƒm~²Ê{|¸¥ÅV§QÅpä%?ÕêÞØÊ¡Åʵÿõf¼ò'¨5{^§^ª|̆—kÿ\xwaôN¡]‚î*¶áúÿðÅ=ÑÝ°íYP÷¾¨fëï­çZu|îòþÂÂõ2Gš*Ò?àFïZd#²ÄŸ,oßg¼›éJ?{6­v¯Ö¨ýA—éþ)skúgO¡áõJÕR¯ôŸÎÃýç1Uåç$¡9©2g\Ì8ÈÖ=¯Š +ðeÐs”Ëè¾EÛ.U9ÏÁl*­z' KõZ7RÔ èy!5¾Ûnñ¹èŠÐïªíZÚŸqf'–é÷Z±ÓRx=¼(õ™ÙQÕ˜XU¬ÖmÕK=/VÆÛ¾º¢„飃 +F¨É0{T¿„xRÇï0hž¨ž¶C34g¤zÓbÏA¯2N ©«‚bæïò{Ý–‡bêÐ^¥¼Û­ï/x·W¿¦RþŽØ½ÎW/vü3V¨Öz%™Má8ÝïVðú\©ùµÔ xsòöÀ«ÖúØ©*kŸ?`ŠjG4ž +Œ¯~[ˆHàã4‘^LR¡f† :ðº/¾ÞLØ,&)ÝA‹£~¯ Êìø6J ,&·_j>÷ñýÒq«-ôa zgÅ«X®^kÇÎ[1¡ —Ö Wýû`ðËRá÷v«ÓC›é¢»>_E•HÇõRÓ£†´?HÒÞøV„ü£›9– ÜYÈ;܃kìÍZ÷6òLDR§wšUï÷b­Óí}'Ë¢AiòŒ¥JÃÚ® }èªõ^>ØP•í‡gá÷00‰®ýÌ«´šUiXÛýžÅƒ%%¯ÜV?¶eÌúܱÏÀ_xxRì™”?ë—‘‹­f¯{Š„æcô(-·-øNK˜\¤«ÞÙÜFÑݵF³Cœ õ•][3¤£¦YAú®´ðVËïÀBŸ¨}?@ÊÀ3Iíò¯‘âw‘¿º¡´;`D¾fr©íóƒý˜ðvÅÎ@ „ѸEÔ+Õ£œp°ÉNØàA©}>xt9´z³RïW=Ð%‘åu£–ÑÈ) Ñ«U>2!Þ Ðh÷¾áöw£ªÿ`“óüžùÊ 2n[-¼ÿ,T÷zDÇ%´­†I˜!Ë —Çò)Ö{«º¡îèâ2¾G÷HrÆ($CEnUìNQ¸i¯ßÙÎ6ûwšñ¡œïJûÁ)š\õùX3€¶¯°|÷PºäÂ?ÊðmŒn[é+ªD#GÔ‡OóVæµ²y+å»Z©aï{dà«ß5òC‹²†¢Æ;Œa$þ^#¼ß×ʉâÓhÈ Z¾ßDßpÐ"ë½@'þ[#¬Î£Ô‹°œ®cë\ÕšÕÖoÝ¡¼_®*ÿï‘¥I?‡< ‘Ѹ̈]×´[ío±l©òŠÎéæ -ƒu.ºcÂ1ÐGžZõªÇ¡‘¬a©|Ðà WŽÉnN^…Ì·'80zWzÀTrgg‘¾BU†ïSt†Ô$X6Ÿ1KV?BâIµÉó › +s –éBزm[SÍ÷‡¶V©NxÙ~5Ùä [f0¡¡%uIŠ¨d4àJØ)ËìÞèî Î¨Æ +ÇgÜn\âOŠ²£´EV™ìÀ×Oe=Q®K#®:ÂŒ–ìgê`œÍ,Ÿ 5[r«5IE§¿7¸bêwÌ‚ÃÎ\\pݸtãúS+=â®Ù3Ù“=»¡ÕÞ‡k<áIãÑÛàœ•‘³9÷ýÉʨus9ó^"è%¤×>ÀXø +üûYã17y+ÅùŠI{"î•¥àžÁR¥UÇG{ÐiáÆ‘ëá|óÅÇ!ìYScDä[¿5Ùuÿ½šÏ,üSÏa­‘LD.7Më·Ž†ÕÖ°602z‹-ä Ù;ÇóEc׎Èüôü¥ß(7K5az¼· ɱlÄìÆ—Œ[­ÞëàieÈR 1bܹVó+;¼9nVñÍ_³ó‡ Ä<ªÅN«Èü[«óŠîN¸ã1SŒÌƒ} ðóƒ ó^·‡O:C¸=nRy}Ž91vZM2éÒÁÍñaàÁ'¦¸ W’­i˜ãvî ÕlEÒ8Sn}¿<Õß¡ÄøOÃí>äKý˜Kw U¡›ƒ8r°KãH„câQÇ.ÌŠ¢«¸yx~ Cvª ÍÔžjBõü>::•Ž§¿ZüxY˜"æ‡Å4ã­¼À\½áû4–11o_¦Òi•K½ýÒ7ŠFùýð9oµ?²ÈQDWù];‹gêÍ?ÁüËá•É¤‰òÕ äÐ#ˆ`üQøxéJP +‹×ïÛ æÿ˜¾0 +[¥C›(›úÐθqŒÉ ?ŠB–¶ì­fÕ? ±<6ŠUml¯ɱV…j¿¯BÓn¿S1Xc¶Ôé¾ÊÈíqUÙšjÍ×h`°µW^·9ež¿§ˆ2ë½x±*Óvc]aVÿöâ5c]f—šrÜR\¬ÔÅbðﶥÉÊíQçáξµú±6˜:1À-Y8ôŒC³îž1®o-4Ðb ó›6a­±^ »¨x±Z¥X½ô ïÑÁ6›ñ¶Û¯¼àôvš Ôž›A7l´& Hf×z +†¯ucýæ+FìLX9ªtjíóùäû°Äaä ”ÿþ¶‚rG6>:™¼_Û—cUaàø;ͧÖû5…²ö"bL†C™\©ÍÎÍk^Ô¡0†a9ÒÇšRÃÛ÷p¨’M–S+±$Ôd*\Î7'ÇZ±Ë™tjÅMÛlM˜µ™³ÜÎŽcæ=ÄaüÑØ8š¹]X½Z›])]/îê3G©ìfg«ñ²üÜŒïã‹ÉÙ\­”îN[ÛkjyóbkýÀØXÞ¿›=Øìô+v± 8 Õ0¦¥›ÿ’^T¦7WÒó›«‹íîfwO[šHl®ìÇ;¢Òn/û¼}²¿¹jxg¹ÚÚz%ŸNÏ> µ_½ñì|1±lÚêå¿ÜgO©ÅL£µßÍìœõ^Ö­©~1oL_e¿Ôg¯&ù'e·<´³iÛ}²/Onï2ç¹ôåèAåzË÷›«¯ÅûÍånº±_Lô‹É­êÓD‚€Uü »—º¿²³õÍúõòSö¥—{±?©!p|žÉWÔý·ÍÕÙ+ÖL¹›{x~hÁ§™·üNu'žM9_¦3g©©&›Ãu©ÚŸH¸_’ •BÅn°Üì'6s;«SW…E×ì¾ìÜZSëv®õ°°zY½]ÖÊS÷Ôíz3 Z·æ§pKn­+뤉pZϾÎY)Žš—Õ}E½Ÿ:È/•VgŠñ…OŨª2‘PÊ“;}^X/®òO«W…=V=·XøÌ:Ón´@Ýkea}½°¨å7ž×x?Wk«+Õ/‡´“þ„¡¿£¬ÉGJÙ]÷ÁÔäÚ)Vò *3ãÙü#¤Á†a}²¾T2çù/ ù§¥½·B©4;µÊ'«ÛùÇõÌùK¥—9ž®dÎ5v?cßßLA›ê§Âõç¾"†µ!4}x :sêéζذ›Vþé¬P%xB·¥¹…õ©•+¶CØóD¢ð¨.\fëÝâf§óra,\mÐ9f­cÁæÍ/.d[îC”á…Ëppb‹]M$VÖúÉb¾®f•]sþl)5ÖϺUnm®œ÷&3绽þ (#;)Á]lüu'ŽeçÀÇÞÒµLNýS×+&gÚs¹ëôS¡¬¬Îç½NgQñŽ×Vü‰0pøÀØßÊ<m«©ÏE¤Ô½t~ç‹]b´Ï6Ô9{kìeŽ²ÅÜÓ®£¨{åj1WmÜó²[Ùºµvômõö×>e·Ï§Ö"s˜HÀ,¼£üÖkƒ¡NV‘ÃèÊÓòUkp¶Ñzø´ØÛjO–]waÅ8Œ@de§ÛzÊÕº5 ¹eêöX››ÚÙVµâ-Ï4€’Oç½Öv?íŠAŸï€éðkb~«÷XmdÎ>ïæ—jkÉ"ëàivÛÊœ´ž7/ÏwJÅ‚sr=‘X]P +w>8Ú…ÅÖ¡Vœ±–¯aÏûn¡òú6# ©—cž¹Ýö¸6›9­·çåz'¥m`³†}ú2ŸÎìÝœ5' ¿?nžÛ3G¹ý·s5$2ægòO™Ù‡ 8-çâ/´ à¹MHÊ,G~廿¿†$Ôz„èV«°x^Y(ž\a_O/¬¯Y:ýš9[Ülæjµ“*.-ŽUÎó{{Û©âjÁœ£_q-ÏóMVýü`3‘­ï*iÜ«Û€>mg£6ol^zŠm~j^({ÉFþT³ÊžZÍ°O»7k.|º^‡²Ò¦\¦>g[mxÍo¸—|Ή†_àÓœ{LmDk1•±?ÉvêmœÂ§/yV+ã(j» O+ÉýÐ(|´ iò~‹Ý×jžÏ†M '½Ð(4Z&õˆ_ç²g¬ŒwF«¢Q°uD|ʃƒî¯lpê1y»!µÞí­B¥‹ øs›‘AÉ*?l +(®žH `ðü4{(zyÈøk mÔ˜­ýŽˆl­Åß-¾%€åÕoלBà`õ‚¯ _späÐh-þ^†×ò‘-¡°ObUüWù+Œ2 +1ÞC‹Oñ}yUª â,Ž2X Þ iÍXy(P 7¤5·‹“‡,“µáãù]„g#·¥åÞ®‡Åþ`PÚl”ð®2ØalŽ‰a¤ÂáŽÍd$ek¡¤ß¿ÔÃùõ:a2,Ž·ñ7>hÃÈð9÷ChH8MT) @cÏYGâ-—ÁV +4½×jŸÿ¢s¹çfš™Ó§ç=P+÷Ú‘9¿Ük7Uõu"±•ØzµÄLZ’nÒ?I¬{çó›+Êq|¡py½-DYjZR'$­ j%Éõ&d0õDð‚dš©.,{YkT¿¹Û‘Ö”½òi¿˜Ñ_§wÉ/h „‰„ÓÚUìBjñÉÈïm¼ò(ÙG/sÚ<»Èœõv……ý¥dø×zqÓM´…Qq:_l€Ûó·ÌQ.{Œ: ×®!À€ŠZXx¥’²a¯T.N3öÝîi~·3ÿyXsû~'³wuz2ŸÙEâu«{äu¸ê·oeAlߥ}Û!=Þvo9 v!lì̶/î½½üÓI÷l©v| (YxË1}[×&oÇC#M¡‰„l ŠKcöu樘ÿrõ˜«}±–Vž‰gÐoçU€ÉúgÛ>­¶pr©@?âjìYý>è +0™wößdYXó¾?`=ÿœšÛ`œèëŸAQ;šÍ½,Üä–jëkË|¯Âp +Ù"¯€öéb`‡‘÷àx›ÀƒêSè<Øg8Ï‘SšÈ(£bfáy@ÇÛu°,ý?¬ýKu_½½,¨ºPüü¸îæ·nì'0Ç š¢mÑnOâsw#…áXA ûù$ÿt±°¥xåb^›«’¥ª.&s.c\«3¯£èÊ.>ÜÏO Íþg-á6¾û«‹ÓK·Ž]ÙßÍžoÂZn‡ÜÀïß$2'‡g—Åü\Uü {kF±_ûåce¯Ülä¨ÏAûô +û’{¹‹//¬o=> +̺Oæ÷²¯  Ú?4»Œž–‡ì«¶~ðÊrµQWIÕC„ö§ÀÛß±ÿì‘QŠñ±é¶Ó' —¥71À¹½¹²w3 æãK<Ü÷Qæl«úöe­£m^Ä]ÚÚµd_óåžèàc/Ý>m²{LFy(AçÝÂc[-o®\̦%'™fÖ'WžúÇ_2ç¥`¹®ï6u˜ÍvÊçÎQÆD­[O£0Fõkž ê•;û õê²Gq<ý*š•™É— ïì]ê•&‚Ôû ˜\œ;®¯óæ'maýæ~~°ÇXùR·ûõf÷_ž°/ëÖn?Ÿ>­¦6—¿¼ú"êÜš,6sÜ5È—j¿µjù¥ë•MÏYoéÅ{øŒðìòÉmå×8½Z3QÌkÙÆÑ:H±âqhdúú'õi·°0o=I+À;D%kzêÍÙ\¾z«­%‹Ë™ÓI±¡WIàüçKÖZ1³žµm3¿Sª'øOýx`sŠ¼4ß̷ۙ Ðêbÿø¦¸©ôaÏ›åb|~QöÛ¸PŽþÈpѺÕç“s̸´Ïíqvµ™Ÿ¾q ¬“;Œûrw8UÌœm˜Ë•÷¼©g?-r5> +áe쳩\þÛÞ\M¥ç†Ž‚•f¶ÐY|• +ú M½fŒdö¢ì–ï‘‘¨Q`)ÝÅO´@¸©›‘£œígµ¹§ó¡]¨³»U4™÷2­—£yÙrG©„öÂâ‹ø¾óý–Np¯´|élën+±uï¾¼ö¥Ê½ýâ=ìþæ4©"tF‰z²µyO½¬JX»n-¶Šós‹¨AFL‰Í:6®xnå’ÁY»òJeĆV\Yœ ø“Åv»úTLîm¹ò&®žÜMáõÌY¹ýĬEÍš|Î6&/’¦´¹Ý~TÈåJ_-Ù+'GÇ™³þ…6(PÌN~§Që‚ØÊ6`†u«øù áŽÖŽ–WObÕý©áÛ-t +Çm-U +åÖvêzç3W÷…ÒçÉlcaFÐÇ$ícãðvº&ÛG:“èn`¥(Pža·çß@åÞ9™Øç—Îìuq¦ßö²F? –XÚ’MNUI8hºPÏ~ùr¼™ß©žôò»ÉdAwعQ¦^jjTèÍìÄÅÈ»}ÐÆ•×ýa,Wc;SUÄ»ÅÌÉü#HÈJC•Ùñn¿§ìÜn­F诔ÊùòáC¹_üü 5Çtÿ0ý“ŒJk^VbÿHç  åõ„Ãu2ÿ4Óž²z{½µâc=½¥ö°ø »Ñ·—Îð=í|÷$U9Š?+¢l*eœTz}![ĶbÇŸìóÏÛKÅ|?CÇ’' q̦òÅfæäçù\öue5Å”HÏÀàÎúçÕàâㆼӓɬ9W\>V]Î?KÜ’ÿ~>Å¡Ìaw‘9mí¶Ößæ^e“aœ]Ý/,ÞgÁÞ·´Fàœ%`콫ÄÖßæwóåkï¨m}{ëæ±ý™x¤O># ïo÷®O§¬ÎÉö¨>À¢÷Þ²4%áÕN’=ħUë⸺”z±XL¨I°›ONó»ñ'E^«ÜV­Ë·§ ‰„bbß^ŽôíW+Î|znæŸZ÷ ä:ê¿æ¬>ë wø|«Ÿn?dö>Í9Áîã€ÙB¥?ùàmë箾¸»R|\¼\Ž¬Åïç¼ÐŠˆíp?ŸsÏ/ÅY<õvBSö;h[[™Ö[w owåïk7SòiuÀ–wK—ÁúCfô è¿ÅÙ­Dq»á›E` ]M§ó» S¦#æC”ßäÉIÁv‚Û­ìv^úK«ÜbÕ¢¯å¯®ãëHÈ›v©)âÓ½ó,mØõÄZóµÞí¥+Aè¼þ&n§ùÃÌi± ¢œ2 /­ß¶kÕ!/VK_½ƒ~½Wk×=ñˆnð½¨j‹:®ýîÕ¡ÿ'o`ÔÌŽ¦Œ«øˇ}Hw_kír½Ô|} «ÑUêRƒ:صz¥g%®ûÈÃl!?I­F͵ãá»/Õ_ßúoˆß[S)¼5èqb$^Ë•ðàÝç?þäqØL»½zš_+o³çrcîWÚíNZJ1¦RK +2f»Ú°ŠXï%~dDor­$¬¿Öh”¿Åò ’Îx@`û L®é£¦BoâÓñ÷¿epµÇ<)ÀYr«a*vËÁßüè @jÓ®6àçúw5bóò§¯:ã!R÷ŸcŒ"‡*Ýàãe`#)d.‹3ŽlÊ<)ƸQ}u˵^£4æ|¥;AO:{xÜ%|†k2æŽ›î‰ †=qGßRG’B˜®†ý½nµ»ÑÇê‘åÈ+õA¼ì¦ëj…ž7Y§š~ª×Ú/­Î|ÔŠLŒ6ÆSFÀ4>N äzµÞ8ª j] w÷A²ƒQÔZFµ±üÅvÆíUé°P¥w^M†™éx%‘ ¯kËþëÚtê a¨È¤_ |@“ü@åNÈ0&ÅËô˜ãì]+ˆo?J‚wûåîøq€6{­æx¥®2§|8‹‚ªÝ—¸ãÞÑc%¯÷>i .ÇÔï(¹}`seþýí(¿ó¶>Üy¿ë‰÷áCÍîŒh(ÞºjAõ@Mœ!LI”|NãÞqÆãñBß=ÞÍ>ÆoÖ×õüÒѶ»R,%:kÙ³§ƒ©}}å0ï\)ñcûtsùh³çÖŠw8G7ýrÎýñÇñøÜç|<>?;'w''Ž¹_8ú#øF‰k›“>Lwðëyƾ®Ã‡Ä ü™t¶²›ÞÍgæ77/ïßæàÃì,}-|®ììâ×úšÕ• üzÄ*Ÿª,ã× +}Í8'z>$'±ïÕŒsüå >Í­á×ó‰ÄÖl:³Ÿç±ÒäéVâõP‡O‹‡Øº«uÏ—ð+MÔ̧OS]øRé×bÎë¼á× üš*|^Kâ‡üqͬöRîÐWZ‹ 3³ÌFð{1÷t¿ö‡õÉj¿ÊçÊdq5ßϤõýy=»”:Îœ¿uÅBv^X'ï åéå[º4ßëë2¦ŽžmþBf*þ¢åwô-?}»¬|¾TOÿøc¦=ÝÙð’6ÖÄ~L$ð/m1nÞÅß¼ù×O¬Púuº ™šD8/YÝþç¯ ÀÙN.ßØíá<'ù^ÍÍßOÆç¯ßâóËî<á8í+Ôà›¼ÇoSÅdËQþ°®Rõ…Íîܳƒ?¥·ã3ñÉ™ûåøÔbþ0>­-”ã HwfíÈÜŸ]V¶âÉúm|®pÖŠÏï­¤ã '“ÙøâåÃeþ:£lÇË7oñÖQz+þV¹z‹÷µíÉøN©?9ÕÎLÎd§f&“/ד ¹ e2ÕM|žTJ+“ºzИHLš_–w'ÃÙääÊrónr}¶´:¹Ù¹y›Ì½œžMöŒÉûúäþÝöÑäQõÀ˜<­Ÿ4'/z—ç“7 +ôs—©ON>žÅ'Ë ùieG›¬]@©öýdûØÙQz³ÖÔäYgzjÆØx™š«•¯¦RgÖö”ªß8S挾0å4JÝ©ÕÏ+OS›§_>Måw¦¶Ï”âÔþÕëÚÔñ݉1uþe-5u357;uï¶'§JǥΔ÷|Ö˜ú¢í}™HL5Os/SÝ™ÌóôäÑÆÓôìbîyzáaëeZYÙû2mÆ/ÓîÝãÛôú^;>Ë«³ÓÛz&5}°peNŸ.vצ¯ÒË[ÓwK—ÇÓ¥å©Û駃½—é×ÏÝþt»·•NÄWúk‰ÄÌõá~b¡?{—PKÍ„ÕË,$VgÖYåé,±õrò’8Ø[›KœÙéÍÄÍdï:ñP}KT¿Ô¬Ä—ÇÏljöS¥1¯–Œ™Ù×êÉLz¦Ñž1ìÉ•™åcõvf³–IN$f¶¬Ë½™ƒë×æÌùÌâÚ̧“­òLI©3Ïžy;ÓÌ_¥gú©¹«Ù™îUj6å-]Ï—÷éÙ•“•»Ùì^˘Ý9:«Îß­oÌ^Õ’íÙ‡þËÁì“u³0ÛØßyœí½nnÿ›]_‹'ÓOîuÒr­åäÚ§—,W®“À“çͳ™äÝ]©’¬î¶÷“õ¬b%{ٽɹ٬W™[Ê-ÏÙûûësÝôÜÖ[¾;wœ~­Î]ïæ®æ>·â{sµõseî­î˜ó‰üÛÂ|zævj޺ϿÍol¯óÛú´72Ó*Íß´¼‡y°oîæ_k÷·ó½ÖãíÂÜÜóý‚æ´V¶'Ë ùÏÊÓÂáb¾¾pupÝY(Mv _œôBoòÔžH,&§²‹Zqçpq5Õº],t‹µÅ£JwjñæþX_¬|Ö ‹òëUj²yþšJ%ÖRör*“ʾ]¥öêO­Ô¥y§§>ß]¤^Ó§/©þó'%½½=H[3åzzó¥ £¤÷.“WéËýÕétiïb;]ßmÖ—&wõÕ¥ÔéiyÉ©N™K¹þöÃÒÑrO_út±û°ˆh.½?”•d2³ªèS¯Ê†Y**»½ã)åò9¥”OtSi¸jb'¹?‘PÕù%uílîEÝ))êEËÖÔ²šk©ÍíãK-ñVËhÚÚ삶Þ*Ôµ½ÜÃv=ŸÞÒÀܲµ·ý©Y}.ÖÔ-c3?_èÇvvW¿w§7õ/ûÏŽ1yu¤L$Œ¥^nÁX[µgŒÝ›…Iãz~ºgx7Ó]£«OwÍ…×ùžé^Ù“æV.—0/–ŽæÌJêY1ßçmk~>»a9êçm«˜]:³ÎOÏ­r=Y·ÞÜ›{þΰlw®Zy¶õ°wm_®k¯öÿo﫶›é•DŸÀïð9‰cŠíf8`Lâ03:Œ¶söÌÍ<û©R“Z­Ã\œµÎÚó“ØA©¤ÇÞwAï?¢nÙÚ91Ûíc³¶¦çÕ…mãusåÍœÞY‘L©»¹k®Íÿ˜{—Eó¶;ün,ÎÍ^Ïöæç›SiYË­ù³îËÏüëáR=•Y˜Ùüø^Pj­æB½ží/Ö¯: 'Ù…Áp²(ä¦ÕÅ•ÚÛëâîËÃúâq™_ü}:¿]*-ŸÕ–ª…ÇüÒöÝËÃÒÍñÌæÒφ*WçZ›½êRýþªº½YX¯ÞœoÁéW^f—K¥Úûru»wµ¼óÓÙ]¾kÎÕ—{?wæJe§UYYÕåìÊA.“^yü|ÿYM__½¯Êw¯«Ç³çՓ瓧շìÝËZvñýmÍÜûû\Ûüzk×k­éµŸÞC1•©•· rmUêTkƒÁFíé¾u\Ÿ9ý{¬ë;ÛýúÆN¹\¿:yY­ÿÜn4*³Õ×ÆšQÈ7Ž.Ó«×ÂçY3{òÖo.T^Ìæv÷ý¨y¿3è·Òóù¥–Z2®[ëùm˜¥u•yØjýó½¶`nÖÚõÝÞ{ûô¥Qm>ž×ç7«ë«ùüÛúÑÅCmýÍlõ6òÒöFµ;]Ü88|¹Úx9îV7s;ýÍ¥óëãMðNL—¯ƒNÎèu–n¤µT¦s]-t^Ž/Þ¶òbúx«úºVÛ:<휜þ=½?­Èϲ$¯?ïÌÞ<ƒË™~‘÷¾^v+ŸÇ/ï½Þ«r™_xÝ;š¿xýÚî€õù¦í>¬¿\?ß~ž×—ÞÍÙÇ÷ãúªþÞû¹ûXlìgb÷sêô³ú¹²xðùy-57¾²93ûÕÈŠ—_aé{N/¾7ÚòÉ÷Ë}uñGv¦vnn¾‹éTæ׸­ª¿'ëwS½´\îöVÊWǽ›‚Þêç3O¦¯Î"à¯RÅôÛAÖ¥½­ÞÝ#fnþÝ}=Ú`F=dýQ¯Ó[íYD^H +ܲä›ÉºüwØ©¬¿ŠŸkä·Š°ÄääPTïÝý'x_³û5¾jñõÖ7Þ»vós7xa/sfaúÝgêé…`Z!•Y]7o_îËHpzø¡(Þ¬uŸ_¿Îw)róý 7Q¬ª·zqùø¾"TŠ[¥âòË@ÆŸ$eqo^v¿Øs"_,Èˇƒµú“ÙzoOï/ÝÕŸ„³ªû­T\Ú×^Òy¹½”.U²û`Ì«ï‹àøœ›é¹—Wøêö “¿ùƒôÜÖi=]¶$¡²t–#Ó«éZ~OéKý-X\ý]YÞ¹­Êk†l€ÿyN®y!½ÌÞ·Bû¦[Kez ±îWç~¶7V6Í~Õh/ž”›ßçÊq£wy.ÔÏ›g‡Í¥Õ¥±°ª •î¶pIÂÆî~Mhߪé6ÝÞç²/ÇôB”¹}üi þìr•`¬þ^5Û3oÌúé«l]ÊV§ê H¹Ò7ZÒòtû~m}€Ã|VwðÙé÷z ýãÞ凱)T” äª/gX£•9•Wör9øCñ —²ãa¹wU+¬”åŽñW¬¶Ò³ÚȤÊ÷þÁWؤ׀±«›—oZߤK·êoáGàNz­ï†MÚžþ¸¯œ{“b‰¶7íbú¢?}|¶ËŸto)[¯]lð&-.<(‹!“ªà0f–•-þ^•³S¡)¶¸“N5µ}?¿Í›ThžÔ½Iá\èiµéÌîÁêjؤ·Bkúüˆ?i«´’]¿/Ÿò&…s¹|»Óìiw³YæTå…ÁÇ#™Hò¾á?Õ³Þ•´±“æƒgZ¾P–¶jE˜TùNe¤t½Ø TýØ™„Mz×»žÍó&Meào›ÚWV“É´ì¤ýÕ+9lÒ¶ò}qöÍŸtq*×Ïê³=2)i §íýÝŠ™|nùâŠ7iqqa?l§Úôôï߹Λ%Œrv!47w¹žj~še»¾Ç›Th~¿n„N:»µÓm‘IÁýa÷ªœu…ÖÞô9ÿT·O„Ì{åø&Õ˜IûÙÖƒÞ³RΛ\9œVý}?Ø·öÚ¸|oú&=¯ +uSÆI ¶ßuemYáM*t>ŸºdR”–¾iɤÆVãú>lÒkaçcç€?éfö|³\þî1“Â,dÚƒ-Yçí•LÚi)›JȤŠp¸~™ôopÐi]€ûÃÝë±0x ô°»]y ›t]8¾ÎV™IakÚŽ™=Î¥·—¹“ž”ŽgC'=YÍ-L‡Mú*œÏ-äçïu{½û–~(专^ÝOm…Nú>ÿ‘Ý`&ÅY¬i/—…ëëU…?éNqê§â;é­|š têìºP!™³×Åtº×kî¾ã¤ÅÓìH+Å)cñ&ÿeeÒŸøulOúnȤ¶Þ'ÓþÞèŸ=2)hû\Û‡àünqþ{ÐÀIç‚œzXÉì¼níä+}v§í¸Òšv°\dDaF˜¹±˜FºÌoøÅÞÐh5qÒrPfÒÙnN?ƒI›dRÐbž(\ª”N¬I—ÅÍ3éÔáÆ¡%äå£N‡žT|¥¥Úà';=–/Áý9­/`Ú4‹à^¯Qt´êî'ómZ2ן¿•ÖKÞ·-V¬.}„þ5ˆÞÙ^è·BcñqÎùöà+(a:+í çû ïìÞD|ûxûþíVúãÙ=}Þ÷ÊL9üÛ¿÷·ðoŽMÓû6€1áॱþׇûß;¡ßös’£ÔZg™||¤ÿ:ß_²Œ&?×þ¿=™Ù‰øV»Ìyã|ß~©‡{®^ÿ½zÏíxß1vSNÃÿúúùºú-(÷j•÷­1Q9.Ý…ÿõRùé(üÛ5SQ¿ݮÊßw~çB¿Ÿýù¾ ý6=[¬©Î·7½ÆÒ3[Õwçû{Vö¥%¡þéÿö‡ñÀPÌì»Nè¬í%Uò‹? Ÿ¶¾lás·¿fÿt»±ìzí¥Ãú»X[«lœÔ§»õåâÁ¡QJÏþÁO­Ý•Ê [kž^6=ï ˜ÎzZŒr€§+¯K÷y8Æ©Hôå}ŸìëMI٥ݒe{¡ŸCí´:-gaìO"ZÑÏ9£í±Ê–ñ•/øôÕ’×Ó"oRèóbè¤ÄÏ ™T›NeÐÓ¹ò¦õMzv:)˜¶?rø¤èçø(Ù?-z:ÏΤ­zÒÅtžžT9˜¡Ñ»«JÔ¤³³ÓÞ¤àY ýïN+û&U_ÐúÿàOªä¯Â'jÞ•}ö˜Zbý‡L +þ Xÿ·!“žÝ„N +{™jÍh¡{%ÖȤ`€Mq6é¾7©eõù¼½y>)Ú~RšÁoçÜŸJ¶¹TXª°§)ׄ# +·…ùÕh8[ZcË“DR¬¿ F®²;^X¦j¶NkRvYXG´ÈlÀ«:× ñ1øÖ?µR¡æºë{˜$ÚÃÏö=n¤ªùâÚwÛZüTǸAƒÌÌ&˜þh~Í›ÿ¯àL`ÁöÔzvgƒ:öBOØP3ïŸêOîñж˜É(tL Àa¡+¿/®G–¼VyéÖ3øÏ´‹/2;¸¨‹w3Ù¶‹@É‹öà’«ŒýÏÜÖ7oQ¾%5û‘KšçŽÄ9üç¶ù혋½² +é˹Æf4ÒíîNëžWÍìô îPžYØìx;äïÿ‰;¿ìïüðô}'ˆüyBû4œý¡ñ:ÔùÙÞ +Ý·îñ0È +'ØK·ÿ~7X"bÿWýï©Ì°”µPNÀ9 Þ)Œù1Ó› çOµ²CÉ# ‹=ËjÁ/zžèqxßÝÿ§q6×ó!Ð]°xú»åYË( â®Þô:õ×ìjnþ² Û·æ\Üqó„+¯ÒÕßÚ&_ps¹ÒŠÇq¶Všâm-À•1[[žßÛŠØšÅCùYÂCÞBüÒòlîÇ屨]µ6gíÓç{ã²^b6DKþÄBwŽ¦s— }t>‹ÿìÛú%Hä× áIœ:1 Z<-mÅ.üzz-g“ÍÒVÅÙºÔá¶vnn„¨|{¨T&|0†ïî¦ZE?ß5Y•Æu©X•q/ýEó]åuz~ŽücË@’ñ‘…MɰЛ©øÍXJE¿´Ñ È@÷\È÷+BwpT ¬ì^Îs önjK +Ýdå廸äÙ`Æ"ŽÄ²}GÒŠ³Â|¢Ç²“¹ÂÀ[baí­É7\c1Ôbôi±wc­˜œ/†Å_ÿñÔ̱Ÿ"­§+§ƒÈ*Ðj×΋qÕ +Ó•+îj- ºP]¹³ï +€åAÎ/Ú ‹µù)ðw33âùù3V²ŽK#†cËà!ÞëøƒU¢×•j0a’'‡1i’“ÇØ­–mB› :®Ïmá1{׈öJRI¬ciíô‘+9xm˜,§Ø|®|nû=ñq¸r°<3¤£Lò±\[;dÆÁ®f–Y ߋƎн»9Jè*ì‡îå&†“-Äçà¡u»ÎBb—Y϶„¥0¶åH ¡8ÕÎñÅø†wSƒGEµIè:© miSz‘Sfd¸œ«÷€Å/jÔj¯úσ¤´hÙ0Ü°`çm=Ô¹æ»Öƒ0„½\õCu<Ï_R¨pýý„l…µÌ!6ÌÕ 7;™ýÉËLJ[Ö¹Œ…t@ùK¬Ff©6Ä–_'I½÷GWC‘ +OÙßÓ!â!>9ÐþÀ +:žÅèÈRC*!²±8Ÿ€Á}y±eq£Ï°¸7ºšTf§bƒ Éò,Oònø-øѶ¦ä¼­ù¸2,ÀÁ[«–#Ãî^r7þü.åH2eÆ‚åGé"ã>$¹› î“ÊÄ æi>wž ¯A°±á‰_¤ÁoJW‚¦ôÏ&bŒ6¦c'1¥åå£ât ¿ÄÕÏfDN*V ú"ŠËó{Ùq[ž%ÜÚüøüò³It`R:çkdXJFL²«(:ßôôž‹±‘6Ī¼0Ê„G8á˜Òþ4Ú(Т¥2 oËn]%O'±e1Yå¯ßس>‹äºTb¾C!\‘"¨¸%ö(Ѳ/©¶Ã¡æûIø%A¼[Œ-“OFLR0§†Yž!”^è8l¦Ð?J*“xœ„ÈÅ©í±Æ;SAF ê=·gdÍgV+_$U¢DïG„Å1Í›cìMü¬Í9L  +÷÷ÂÁ„ɨ¤±·n!N²9¾PT|ñPÉ9Ú”hÇßA‰Ÿq$šKcCXÈl/Z¢q³Õµ@QÅè †êü¥2ñb(‰Dƒ/vÓc[J§GãH4÷áÜ& Ñp” DãÑXì8CK4×RbÆ_¢á(ŽDsã–têeÏËãðmÿEyÐVâÐ󭔚UnóÅ Azœ ›°æªuö3ŽíTÀÆHƤÉŠM—†ä÷ãÅ,&'3Nµ-——áŽOBf>¶­‹IŒãiGI%gÈ^†Œ“È¥Ž] ¿ðˆÊðF™äì`òŠþú1V^þµ!|6´WÍ÷øPŽUÆõøj FNÿb<¾äÚ0¾š"•\ÞMÝÊ>ž~9=™„}§ÆÑ…Ãk1'ʾOªÅ`œ1ì{zGFÖÂ%Ço߇é°,͆' ´a´.ôçønó%Ž6£–È,÷ýÉ„{Ñ¥ä"m«©]‹=’û~D0È\VL)”XÎ&Xm ƒ–½á®kYÜìL&BrßOOvNg ©Bij¬$*¾%ƒ…˜XO DÄ`}ÁOW0K +¥RË^ãÚlÑÑùž…¯[NºxÒëçÍãƒTf¥2Xë4z×K7ãôÐEwÐ1·7ŒÜCÝAgexÇï¡‹î #ý•è¡‹î ów ŽÞCÝA—ÊL¦‡.ºƒ.Ð-8b]tHˉôÐEwлGë¡‹î óUŒÑCÝAçÏ$Ú?ÐC›¯¿‡Ž)Hêk§¾°ºôïöÒv]xÖY©Å,ɯÅbå,©ÝO4íïúOHAuw¶?™bXN¤7O!¾mÕöþ£s¢p‰ðt]gÆâ)$'Že~E,-‚Õ$kÂ;øòçøÆ¡§¸:,kñ=#QsI÷gÅ”êÈÕHg–Ä+îógF#=&rÉ/Ã4Í…™Í\r TÛÂØël“Ì°Q¿ë#Z9ݵI‹¢ÏJ餹¹TLضv– •(fk©ÌPÅ aÍn1‰ÿTÂf·¸ˆq‚H/6»ª:›û‰´ù“#&<áí†ð(¹^p“À§ñ—`l ÖgDÜ5ã|òDâ¡É8½œI2·—,)i‹i*¶Éô^ú2’Î<ëQ$pæO¢)TôÞ•ÉïFo2æìꔕØt·àp}`³+ôtcûøüWŒ(ZIŸÓÿ‚¤›KКæ¯tdjà‡h.Ä%M‡.É;:æüBûøų̈«bÎ#˜‘=ï‰ùó±ÝcÙ–C } BÈP¼úd,ú„aÖ…:eb‹ì˜c©á1ÆH´á6É~Õ_RÓëëžY;½ÎpäóÕ Jµdó;†Î=öŽÿ‚ã$LåÅÞEJšë|LÈܦ5|ÅóÙO á3?òª’±á05 ¡7NcûÑ$J“ÉP8ˤØð˜Wš<¬5ŽøÑöõñŸŸ q† Gñ^­q†i„ ëäÂqƽꂌ‡IfÚ[ƒ…¥]Ãn¢ˆˆKg9Wc‹W'Æ”fîíH½üHGª8s‰JòŽTqŠõÇèH§”¤NhTGêÝT7AÓM´¹p2¡ŽÔ“ u¤žL¨#õd"©'¼k )/AÿšÿÀ˜k } œ"£@7Æœk ±ë(Z%­¶l+œµ—vˆ›T+ÜwAÐ +ç¾_ÉlR­p$nï½Ù +Çõ+'Þ +Ç‹*L¾ÎÒ•~Ó0¾.™aè]"Ìí­îFx´‰cn„çÝÑ%6â…j¼sÁ&ôðv¯á5†±aje=Q.)$ÆtÌ@¡×SÝèg‘Jo8å€K¢(Â_1L ªÇ½øf—œí°^û•úÏéÒ×ÞMzîøº‘.­Ê×éÒ†ÙÀçÌkøÓYzîåíÿYIÊé¹ú~ ÿÁ'5Í÷8g™Û?Ýô¦ˆÕç4÷ôÅLæZ_‡’2%Í›ü¾³Å©Ù¨çâÊ¥ˆ»â¢ô¼2©6=}ôóqÖìvÑaןj¾EuØ=m„N:+nÜ<„Múèï°c»±Ö¨I™f·é—®'Ù°êï̧»S¶ÃNÉŸ…N +^ +ï°š¦°2)yoÿSºë;‹ì°ë+ᓶæn½IƒïñusúKØ{|å¨I;ÙÐI_úGÕtè^Ó+W¥Cß©vMgzò“}ùÚùãg(á}òúïó+vDmú÷ºqº §¾ØtçÞÓ‹MG—«Œ)ê¤prÁ+ ›á¯$ñJnw©ù-XNŽè¢wíP_‡½cµ›mÒkýÑ/bQsÞÚã7ck®&ñ’Ïú¥rIzI®ÊyGnÔ(\=y‰dt= ¾‹Vu¹8u}Ñï¾Mì¹Ðâi×OÜ2¸û¢Jp¼úd|¬-ú­äKª0yä‘‘ž ”2)¿,ľ£Â©hvÓi¶Õ7Án:v…w;è¦ãùŽg1¹n:^ÀË÷çDºéx!gÎÍ“cvÓñ +@ØÅñ»éx½tawÝŒÞM—Ž.ýKJÂÌTgJÔ¢â,€˜%9•˜ã–ÔQ.JZdú=¢¥ëaSU\¾2Yl¼gîlŒE?t7ŒIÎ}æ.æ‘0ôùÌ]ÈkYþ‡îFlzôXxôúäaž¹‹¨Oöº£MÉzænìˆb¢gîR‰ÊPÆ}æέ…³ÿ†ûÐÝØÅ–Õ·ÉÆ F †ù½ð Ø}òò‘ž ù•5¹¹y±ÍÐàa¶–¨U¢‘ÎoyTk gÞö~^›ãñº$°1]i›¡e‡C‘›Û ‡xa+®Ÿèî&Ë8ÊÖ[iùè]'StØÂuCU§ï~N° +›T5ÔîgÂj¨è6»›$oC&è|ÌÝÜ[#ÝùÂØãä£i™pœ¹Wü“˜Oò:Y‚Ê.ªœHZ&l¬ÍõÞéáo„Áö›¤tœ&f´îò£Òw.³R¢wr(G2²‘Á½Š™ž>Nï% ýµŽ™{jGëLõ³ç¸ªÿ`‰ž–Mö‚aÿ=¼Œ5ñ«Eì½Ç#w>aN„WuM"¹KF™À-dœ!xÕdþãZ#42VØ7 âZbØ0XWxµŸÿ%!ƽp—¬¿rÜîØÞ·Dœ3ô w£ZãýpÙù8:úFÁÞêIŒ×O”ô¥¼ñú‰¼—òÂÙpüî¸&á ÖÉ_¸áVsì~ÚOp9Fœ;™\cí 1s|ü2zcíI´Wô­çËßq:Kh¬…QxѬ!k®¬q†Ž`bãÖ8ã7ÖÂ(‘÷ ×ߎÏå…'¢íÒ«R%aÓM/ȆðY|\+•IÀ†°«‹Ð‡Ö“41ùµØ|.áµé š˜nz칌|ñ,ÞmO%tÜoz‰ÂÔ¡qK?Æ´Éø•p’Ç¥!üÊÁu:T“=Kä¢Æ¿HŸò’²ÒÚéY‰íqe/:É0´_Ê›\ë¯ÃÕó,†íq];}.š¥26ö¹„÷¸²U#]Meßsƒ Xf l˜3^‡ëÈ/å%}î1òö|‘n"Ï=:©“èqõ v,¯íô¹5$¶‰JéÂæ‚Hšô°­ï =wóx˜.®jøÓ®ÝÛ·y£ +•ÓwÝVÉí¾@¼+®É”Ls³Õ‰$ÌÝÔéß„|äædnY$q~l¹ ¯š.Ðä]…O¿.— hçO·ƒ-Þ­ Lœ?iw›þJo¢;"¨âc6Z9z#Yðþ±1ÚB7úE/†Ñ8XÞSj ¬qÿ¢|ò>¦0²p&¾?q+çWL•OÔÊÒ¨“€ØîVÑÿ²ñX-Šn5ü}±a;‹~¿{8ŒÅõò …±˜Ìå0›´%Úd0Ö •+tþÅ,Ü> éLêÌ~¹ 0i`¢[5†Hü¢žû>òH]€ÃÅ“Gítç‹éô¿À>l`ÒÀTfœ.À¤=€©±º“â“hä‘»“ö²>òp]€Æbhö-º Ð^MpW åc_øßy”ÏOÉ1][#?Êçó,þ×åãFá&þ(_Ü;ï“y”ÜÐ^ø]Ó‰?Ê…›è£|Üž‘‰?Ê7‘÷+cåcîZT„íl­&ön¨±ßõ‹~Õo\»*þ]¿äwC󮟷µ Ü ú®_tTˆµ“G}×/úU¿‘î†â¼ë. ë¯ö]¿èWý’Pr¢’ÅÈWý¸·4ð®ß¸\“¨V´;¹&ÔˆöªßpïW†¿ë7DÜrŒwýügžðu†¡ßõ¾Bu”wýxíˆñµpþëGÉ“y×/ZÑ¥bRkIßõKЕ6wýœþ-þ«~lœÔwý†§±QÞõãµ#N¢çÝÿ®_ô(ñïñû”­óß$Þõ‹n|w3Vc¾ë]æÆ¿…føwý¢=µ`­õhïúñ9ÚyÕ/¾ï5Ù»~Ѩô2‰ã½ë]p +¸)£½ë7LWÚ¤úØWýBmË!ßõ‡÷“¿ëÙ&Y¤:RÇ'ú!Þã›À;VÝ1ßõóFᥭ\/iÌwý¢_õ³xüwý¢c©ÌdÞõ #vëU¿ÈŽ¡!Þõ‹Î7såØïú SE0ú»~tuðU¿Ñßãæqͨ÷øÆ`CjdÂ1oopßõ‹ˆyú%Ú´Oð®ßp7êŒú®_´CíJ˜1ßõsû·¸ &´÷š4$Í{×/ÚÌ!õ–x×/úU¿É¼Ç×…›ô=¾ñ¢YÞ{|ã½ëçŒÂïªæŠó®_²fxnl|„wý¢›á­÷’Æ×/DsÛ¯ú…ɱaßõ‹~Õʼõ®_´ÛÎ?—áßõ‹~ÕoŒ¸¥cÉ*!Ç|××óÞ“8ê»~Ü%¹ÞwÜmóIßõ †ô«~¡½¢C¾ëÇ9XJ¤2¡Õu4*cßõ‹nˆe챑ßõãõ¢yáãȈâïúÅw×Nâ]¿èä}oÏ8ïú¹üÉ}Õ/¬ÞrØwý¢(‚ŠŽF>ú¼‚¸Ÿ=‡wu[ŒëV|PÒ’ í +œÐîETh7¢ðÞŠ[ú›L•pŽaÝf>|l&›[Cl fy-ÄÛýö0Êø¢ØûÖ6JéÙ¿ÆÉÚI>;ø±Anºµ^oIZ«]åÒ™/]Igç…fºð}°—–涊 ókÅêRëù6_²BcûGšfcEh^]µ…ÖÜß¾ÐÑ×.„ÎÅùƒ°Uè—…ƒ…¬*Ü,¯ Go÷ÂqöëE8ÂñÏÆŒp²|_®vÞ7…«AùT¸Y/} ·…ýŒp»xÇþÊíR¶×_½ÒzýïÙõÞßüà¢?ý³öT–;ÆŸÝÙùü½[ղ魣µŒ¤çî²ÝÝéãóÃêÌW¯Òœ•”›íìíÁ¼1u¸ñP*6w³Õ½Å®VtS™l»{Ù(éÙ78’bÛÞJéÞëU%³óºµOÌ}ÛÓÝ¥ù×3]üPö|O@vúäÁââbi´Y°áYáv+·½Óâƒ+,W…æáIShMïöúÆÉ#é$u;R•üaq©R"¯QNY=‰Æ[¥×¿ü^ÀϦƒÝâ}ªK?*²J²v´µcúü& +WÍ?|óÔz>snëä4+ÝMa‹íþ³€Ojî¦K•ÙkD[ßڼć4M\œ'ígêôî`Å §µúùÝé¯nžœ\ës™¿f®½¾èçeó&± <}¦¢Å1ƒîÛé’å9UÕË>þZ±%±Úκ?áë ÕæßFƒðYvÁêû=‡¿ÎÙ¿ÖÊeüµìþa¥Ø8>mãj.åå㟵Úë]E*U%×lH[¸àͼ·L´úÌÁÝÊB'ÝïŠÔæ:Å÷‹ýŵÞu¿ðæ»Mó¼êÌ·#zh!–RæC¨´– +Þ§b¡&.Øà­ÚõÅÝLmÉùb½ŒÍ‘ÀÝe‘• úö_ì‹äWyù( ¿î®Rwˆ¢áÓ&Áwا»FÈ cûìôd§‚WËÍ‘:Iøõˆ [gÌÏüz!W¶ÞeøÛÃb±:½8Mö2]„ ÊŸBå¬Sr'½uf¹,kç¥zånqvþù+{Ô\l(ož^°ewët9Ñ#7›T küªMfD2ž”­NÕñò©Œ±g­æJ¶{X_´;[aW§¢C,‡’wðRþãfºñðþkÈânüf˜öÝï”As€Tý ~=ªØ™wøùTï;ëyøéB´t|åþZªšëœÕýìüô¨!ì£}ß'#–ˆ¿žVì¿}¿œŸ®EêôïÁëTíõ¼?ÊÔ×iùÆâÊۭߌ½—÷OhyÍ…îuþ©ö¢5wÖ>Œiƒ#ÈŽvWšµ!ï+êà +„Êà´ìNú`“ÊàZ[âJ~ºŸ%Å>ìoð¦ØÖ8½upÜ,ä« úqij«y»•1‰ª–goúº°Ñ*ªpVWšÍ‹§Â4e8ø-@ånÍÂIy:›Pnæ·Ïs (³ 7ÿæÉ%íô\~ù#7g(;yÖ’›Ö‘-åˆP¦YÍ–sDØÁ r÷‹œgà9í*ˆ¬Šº›Cš(-±¼ûÖ-™ÜÎ[mÎOÙ_lœiÃ?gße;+eWÒWäàQdη¬ìÅõÊëé lÅ!^çæ‹Dç€klðcJ R·7™ÓǯŽ`¤IUÏ»ze³@u©H}v7µ*±Z#4Cñ}ícê«éIU²—M°ðôãvíö}õ‘–ã­ù<ÒÆ”eˆ[G9NíyþvÛRbëYAŒm—­_Û3+•úÆâ·£ì–ËÓ2»u$‘ƒ€Š_ñöe1Â)Þk&lk;!ª™Æµ +¦ïþ_µÞóÝÞ€¶‰Ô/QvÔ샱IÙ›ä³ô ×wØõ¿Âl™7…VYi¯~ +™¯:XßÚ€&åbÉòí‰å)åÌ3Ù³.¬û 2k3ug€‡YæÝjb­B !6O[¢ë¯Ùlt^Ä÷½+¯Õ£1‘Ъ„ÎÏŽÏÎzè½î|å™ÅÅ[B°„ä<ÌÛ»¶nÚÛÎz6{ás_¨4oÒøÅ©eLoš°DÙØcä¥hß­wÄÊ„/Ä2Y(ù"Ÿ[¾øðÙ÷jÞ:Yßy·¯kþDϪspgK¨ìt§,«ïÌ;GÞÃØiú»Ò°îKè­]<¹—Œ\«(-k5´ï#þ¸(¸&(pnÕÀ·Ã]$œÓH€õÐHx7~¬Sý»]‘)dÓ· +”Š‡råIŠ²=­›Ž¢‘°<ÿþE€´è§O»0šÔ}º›ð~$W,õÿ¥=:H+ý‹Ùt€”L*òi¯å7]$´¯ÊSoGÊ¥P:@»4ï`q^䡱¨!@Nœ!F¡E4†1¹Š¸5Ìçæ `{¯ü!jåÒxÛ8š¯8\9Úi _HJÓäFú"{ˆZ¦È"!*íkP’òÞF÷oãnqÛB¾ø zˆŸš»•© »ŠÒ̺H†èOµÚkE÷²™ÂEOþ¥àZk¿y®ù&zpe»~Ë\¤?&Y5@ãÑXG)Gç×+¸4–}ÉKcÂW~xÑKÐ)ÎyP4æÇ=D`×úp¨ ÒØÜóReœÓ[)–]mŒù09ÄQ®8üh-&¶®Ësc˜%žIeUëg~TÂv^úF»v¬m´KM!T’J•Øm´µŽ8Î`–öò¾£‘{ÕŠèÑVå£Ej ÷×™@4r&ÅñÖðƒ=¼cÆÃŒ^OZŠ¥¥rœq©‡´š«‘Gdñ‡åõeú×öÎ +ýëÞѪïôÎ/Ö(3?Sž§-) ô¯Úü"ýëòÊýk»Y¥Ýë,Óü"åÏ÷WèïNWé_?®×ˆ#TT1G,]'jäé”úrñæ´þw×êÔ®6Ìi;î¡®”¨8Ì%x·}+¥PX½\-Úñ‡ipÜ['ÄéÏQaÅÆõü¢í‰ît¿ìØÌé{Iºi?Αh€E½ê¿”,ïÕrlåå£)ËËwâ^ðæ×`=Jžü +¶ò ¿Îíh‰´Àj­_¯ú]'Ìz^*ÌçTÆ sæ¼0§ð˜ËÍ;aÎùåÛS;¨®xÍ+:Um–©/0•ÊÑøyvç)Ä€©‚!àíýÙQîÞŸúâYyt¿(%¤`ÕÌ °C®Üí Àò>þºG RM¬=;Œ 9o{Ns[ßÖq‡!SìUHĉ#2{øš¼õ7{GdX™ÄL­ˆiû¦g­É9ç°DÇ—Wp–yùp°¿öQ~.¬î>1—tn³Ü<ƒ?w³ ç‚ûEmÒ­týê¬æ\¦¿¨¿Ï8Ó7ÕÙ˹f¹µB~Æ®”>293½² ÏéPîÓª°6äýc§±íš‡ªzUö&•gó;ˆÔ+øçì#)W„ÆìŸ%rëYÁÏo=îjöš·ÇgµzÑÈ7›­cà Ó~ªB÷~^#²Äåýs[ûÿqËÿ—ã–ßÿSM醡þÓuSýWÙÿûèövz¯Ï¯_ÿæR ©Êêº(}=~7{Ýîa÷¿õÏî×àßü¿ÊêAm}ÝPë݇ïÇî?Òh«ÞêTðÆ";L.‡ÅÏ-!Q2[ïíéý¥»ú“pVe£ëÙŸÃ_Œ®ƒÉŒ!ó Þú{‘ž“šé\»?‡¿žYñ‚Š»™tSlÕׄ§›4ÞÚÓÄöÊâFXÁ>»T&|)y¹½„Aý}Œç/¦3]qWv€¿65üdØj*Oï$õék‰ÅPÕ2µ¿úy³{ZŸ~ükÔ®Zû§Úvíqj¥2XÜX©ôšæôûnãdE¾^8ï|U[ǧ—«m-}_Äð¨_„äÄ⻎N90ãµ#ª¶¾¼ìŸ'€±>'Í9r”°%f£¶´™V-gŸÄÑ „ pU/XV„Åê’e,€mt¬£ÖÊÎ6+. t¾4ûrã*ö<ý…“zµXg”ä+õE¬ù³Œa@$5À˜ÀHj>Œl@$5¬b¢‰b>€É<†‘Ô| תl@$5ÀÐÀHj>¤2ãIÍʜրˆ®aqRDÒÚY±á¶Ž9Z:Á´¬gçg¿%¥q²ö{ Ò²P/šª²èÈÍŸeøbkü°Ýøbi¹iÎì?‚G6Ý®þÎ|v<ÏÍR›n}ÉƧ-³`½cßMm_©è€ÿ"a—Lj,§TÅ­.±-–$'ÿ,ý0Òò@!ccý×>xð¹È=ÞÑ<ypÜs }ÑJ4>Í_p«Á#» ž>~…¶Â®EŽT-Y•ˆŒãÙ–…Ï-à B>R˾)ͬ¿¸ò0O¨Ãa­ÎTYª—.Š`¬=ëÆv6[Í’U¯b9›­NEPï7Qdl ¶ðÔ:/ž‹¹mÝìaœS¡ç¯ª¥k ZJœŠòR@ö¢æ[¥t•·¢›ƒºSjÅ—øTÛßsŸ½b0sº|@ °~9W¦ $R=º)4Ü í'Å;M§xÏ¥ &Å+4w¼1)ò"Cüù†h϶½¬4âĺižœÚ¶„O×ÁÁϵ‹øSÙý¬â~ç2w€%9ÐÈÁ +¹ò9ãðòvÅDY;"¬Ôå•?uIçoÏ"ò·ä÷a³v¾ /y¿/aþ–“½-P(¸èÉ÷ +æE:u™¯?^;H(û^}¸U~™üíPÙ[œ…Üþ7ztÏ*Ë¥&µŸ®¸òP³D!¡\/…½òGP€©˜‘ò·N+t¢Bî£n'MCÒ¢õ ½R‚1t9‚õ„Vòz<vˆûþ˜Ûxùcré6Æ’ŸÆî%[“€¦}×UwoBØ")*w»}^Iø•ô6 +3Ô˵ßoßßéø5pQéÝWw{SÎgŸÞB{ëìžêìÒ¥ß3êàý”HÖ} ãÒØÁ×Ø4ÖŒWvÓúHMcÇ_cÓØÙ÷8¢¸ïñ€½ø0qµ—QQéÑØûßx§qvή©L²!îÇY av¹ÈL~g/\Ž÷HÊ*¿ŠÜÆû˜„}öõGÚÇÙFå gX¼¶Š¿©ñÖp>=¯‘¥þ¥7D:{ür@qŸX¸™YÅ}÷71kx¡HÊ/-“bâþ½?®´¼ÿŠ/N‹ÔC÷¿,ƒsíä(º¼ÿKÓ¿>LOù~vJ£Û9ËžÕt$ Ym`øõ4=÷ûÓIÏmîXF ü vB?¶b»Kg +]f9+-ךêshÞÜxßî·9ø_ô¹jyÝVxò}Š„÷g¬FpC*–/ݽ»ÉÙ?½u vö€´‚xÙ’ðÁ-•¬ÕZßÃBmwüh~à¸ãë‚çöÒeüLBÀÛ/+ÊнÕZ‰Jm®-;_¬Whç:¤K$´G$•™`—Hh)ô˜T—Hhˆ7ˤz:x="©Ì»DB{DR™ v‰„öˆ¤&Ù%Ú#âk·K$´G$5É.‘БT&q—º«¾Úòƒ¬-³V¬:±Â»ß6Oß-±F®Q¿î[’êujwÖ•T}G¸”­7amFS•¼)t‹1ÄöÌ +½öœV„¿8Æ€m›tή¤2x©i™ÜˆƒkxÍ[»r/@[pÃð³Ôݤ|¥<ÖÞº9’‚¬eî©B;g1wDÊL7+^:Ó'Ñ:‚Ícs-š›Î,¸yÜ<©±ˆ³>µJ(½ˆÌd½YAÇv©)Ziol/×âöIþO5§ÉÌ›Æ×#ÈLe2ðÉAwð÷ƒêÍZ÷ùõ«s÷ßÝ^JügýO€ÿ‰ÿ´ºùORUòŸðOÅO;÷©ÜÁàá½ûø¯óýüý¯ôoíãîá=ÿ¯ó½ÚHen*«½Aýõaðúýu×ûïóøÑéVçh½þoþŸýÇ7øÇ7¥ûþå`©Â ü%€å1µz#þ«¬}à7Í“ÿúùî þ‘uþ;~í¿Þtÿ~ÿ«ÄÃÓp€–›”ðoþ;ý®¹›*üÁ/uøo'%”5Ó]€ÿTS5äð‰®(šlº¬ +Š¦à'²¡ ªdjš(ꆟ販Ț))Šª#¶Ê¢¬Kªb +¢© º$J¢ªš¤+ª`ä +@ÿÞ¥ù°¶ÿ†_6à‡7øè?ÿDáßÖ¿‹+áß#®{?U’¹l¨° QdSÐþ•DÃʲ) † Ãéê¿O>”a–%6§kª&©ÿF*›°WÖ/*6Œá `Äà8~˜Zª$i€!r¤@©f°5ÀÁ‘˜uó` <¤øPbY15ÎY­‘‚+2%fEœ½10µO T'ÅÅ8;÷|™u' ‡ÔÐx»2SË‚®k²¦‹†E/œ]²Püd¡xx‡e•EC%XdØ š¢é‡‚¦¨—M]ÛBOaü+âì០Å?ÁÀ|œÓ ¬› ÀŠÅ%oEì™$ ÐKI2Ͳ +Ÿ€PÒ`(éJ7Ë ¨4S–US6­˜zD ˆB{ø€¨eÅDMVuEMc”©sã¨e–¨ÃçŠf +àAÉe æ wªàj`·Š®Ê0– ñ·å‡y°@×uöA–É ¦•% >´]&°5.!îrhŽ=¯r®†XV=²!ëIŸ!P,¶ ¹,† ‰ª$+ø ݆ZÖ$ƒüÊ?ø€3’©*ªïâÁh¾qŸp ô²èãoÞŠ vEœ½ ððd°ÀS1¤È±ð“àÉ(’âH8. 8PRY‘mSP²©‰YJŠ8úfa7§( ¹<)À 8N7Uu¥œjÙµÍ%›¿Y÷KA£ ,©k¦êá /FѨø¢ŒjVS]I''€)¤ÑëÈ\! s%”'W®> Ž$‹A-BOµ½êž>áA{¼*yZÏÄøë¿Eðße&¯P@@V,Ò!|YÙ©I7¨Ì7ÀUúö&aIžæ²+™  ÀëW4Ñ«$MåõÉŠm„'î^Ì÷Œ 9Uê6ŒjÈn}Éh’Â…®\7ò ‘ÊxaþPÐT·j‚`l6É ru`³à©¸:üò”ÀÒ°ÔÅ jÈŽL>²ø ¥#(z–d;Ϥ$ ÔlGP¬h¿¥À<ð‰G ?ÐaŠCIµÊA‹/Qôº)xPÀŒmYÚôP;ÓE¹â¬ˆÀ€:ŽÇ”²5ý0¤¿ÁÀú…žÂØ#è>쀢cì|è+#ßÓó±ëæÂø1PKñ 0 +ÁUH(@‹-3ì(WÀ'%´Ó7Ù[`? ñ¨.AN^<48|»"ŒoäTPJáBô‚ÏU¯‚ÛĤ£¯Ž€èúä84ÀÀy¤'ªcI]`{ÐÝfØX@½f™usa”Â2Ñ +t:ŽâBùâa~>ÕME`@Ù•†¦ Y×EÔx†­-@Mº±‚' ó~ªW«P¨Tк¬Ý´V“®å0˜õ % PÁÊCŸLUUôlý.[¼"`=‘d×ôYV)ìͶîœ$lŸ¶x°R;t 0hnŸ”ó†Œ6ð‘ °Rè2„2@—»›•ÑpU.Ñ0©žóJ`¬/Ó¨`À8E–N  Œ;*@…¦;eM ÉÌÒä†È–aY^²2Þ°]“ƒŠW7lZù3Ò £`Ñ›H¥@@.h^  ÅRaá]™^–tj¾„Pp“63Â&L„Ô¯@ÉT@hxód0XDñNFÊbtYU-ŽN¥(@áþì?{, @‡òdå¾Ýò‰7Ò§•ˆ’t×Ú0Bæ]wÁ6ïþöHÂJ1Á¶rÊ˹Ph“jª$“哺t·Á c¥uvùDØŒ˜ËÖÝ*M9 +öè™Aüê"Ê5 ü"ɪÃçCa¢T—U)iØ”‡4˳ˆí}°²<ãÆÛܧÌAú㦠†^¨É…„mHš[šÂ-ö˜‘ìó¶Ú¼IßpjB  lìùvA úEYÊ11Í(‹…@¦ÉD“ñœôx…(^}ð«ˆeÁ^Å«"üYC”$”MÑ×À¨”Á–³½6û°A:€\µ” i„ÔË + R²‰—Àoz©n¬QVƒ +™X7îV€“‰°1WóJtLp#™À nSF¶*‹íÁŠòŠ3 ÂcNC0{¢ (£æöS£ÄUàlE„8ÁÙ,ÚêÛ³—eÚ«flc[¤R'bÔ‰èú{-H þðQ’ì FÄÖÏ zHñ¡T¦âô%âz°OÚ.€2mµà…‹pWàÄb9ŒÓYá¨ñÑCƒtaÐ’ãXšŒq7~Fä½ZD–,ûêÓ²‹$:„"Ô +6Š—ÈŒ<:Uíû,¥a@â‰Nyöö+M,-¥ØÚÞ‡3Þ¾˜D2P!¸dvßI„IÄøQÊü—Ëÿ;=ÁÐ &YDÝëM XŸ|¨ „“LÍTŚʢšdPAÁ‹3¢ÜÒÜHFR¨ ù&P4/ç›*h¿I$žœâ;Ó$PŽ;c"¨  —àY-‰ Áj Rl´€}nGdrô2òÀ =–’` HÊI)#ƒßgç8. U;Ê3×Üb> ¥0 œ;† øyŠ“·bEŠ©ÒÝ5 +Z”†µB+žD«:›ý0V^”ºs’ø#!aºuF°- þÇÐvD±îÞ1„š8˜Xëh]e :|; ë¦QE¬I¡8lªè` º·‘„Xž˜lÓ\s‘k  д +Ω•E!#‰Ø@áÕóÀVAog0¬þ?”V¦š£d°ý× Ø Û®m‘íð°A¸l$Í p×ìL¤vdßÃ<º[&êúŒ µÇò–{q ® Ì!ªC‘Ýý'Œ>àv[½É$Ue·*Ž r>ŠáO¦0!¤èƒ !F Kl´beEª]Íh†AÍ@q„­zT‡e, +üjOD%$ʦ×ÚH¶©QžÏ'fQ°JA½fX Œš–MIrf2msË+ד-8(0TM×D†ÃIg—$¸h`Ý8xnT  MÓ%_ì}2d E·µÏbK³ì°u7,¤“( †ãih˜Î ;–°U÷boA»“~?OÔ•³#a÷`CÒ씘@€ ãÁ`S,˜SNU£Ý“ÉBaÁµ{} Á °¼è“õyÌÛ[P²#–0@*ŠNF–3Û ¬¯‚Ç¥€«fwÝZÜ$ :¯·c€ÆÓ¼"`²i_©‡eÂ\v.Ñê†4ó`õ׺ékÞHˆaEv²­ŒÀôÔÜœ +ÎÓÀêiÑ’Î6õ°Pà°(n£ õ XJTÇÇ♕„ûÀE.ƒ/+Ù×/É;ïÓÊ~‚n:Õ|kT¢®•©¶·%Ƀ +ªeÞê“Añbc"šýpt.³2Ä ÀÐY>îú9Pœ•qfL˜Ñî¦CA§Î«µ©t9ú„Vj*T"’È;F`G%IӲ泙±ˆQø™ö%8PV„S§zPÑ ;±D¦sž…g©‰^8¼PÀUÛoGŒaÜH/ [½ %b8Ñ ‡@i¤—Ñ­‹™ M2UÏ@ä¬^VÁIöU›ò¡L¦3”‡Õ§mG|µ2¦²MÕóÓêäñw1pW„â­,8c2¨àŒŒ÷n,åU_ ¼‹®Ü'W‡€v0d*‘€"0xž^ƒ“Le^ŒlŠn (܆!¹™žŽ ,&¸-ÊtîÏ BVIÇ ·WfŽq€A] +€±¯tãÃP$É"1H°!Y÷œÜ–G]yAÒ¦ Qx›„àÚñ5+œ§€ÙnR³1P>‡À@#ŠàHj”¨à@ñ /;Yv¯kàAá]; )T¯Ì.e]£"ÈÔåئxE‹è]ÂA"Ó½+Zœ Y(|4‘jM’° ÅPÀ°¢4^‘hz-lxûá+Xœ£d\ºf…ü‚—ZØ9BQØÏ"(¦"‡òT¾ó<3Xx^K`Ÿ|(Ýô¥¬ #¹Ò‚ת4¼v(Á(c˜ÁuEƒ0| +e¡ø +6_@Ð[µ ¢H­œ\;ÅʼnõTûllú½4° +û\êŽ ŒØ–UÝë:ûäBqXã5Ø«Qš‹…w­àhzÈ‘¿À5¦“Š3#iÇ3YÁÅb" +Ø\•tê–3´qeÖó`à ¦É^lKÅŠHêu À©Â²7Ö?a`lL +€"ÊP`G²_‘UE@ÜtuÆ=LQ) ¤«ÜËŠÖ¬8Ö/øÔ Æ4u·rÅ^0^‡€åéŽ +sJ¿±'Š¦¬€l ¨¬-”2äz"Ýï%°#á-bŠaøø¯ ¥ †sºA(¤oÿ=jÁÍ\\q£E›¹ˆ%EV5Á½Y!8’†7`H Ý ‡'ƒb們ÐÀŽ6¾Ã’fÑ=½O.°FY’<ƒ‘D$ðâA¿9œ +C£Tü¿ÃŸ1†uüu‰ÝÐÕ½³-9TИ±@´†×¯žŠc3ØQQŒGð ˜âc"õ”*ñ_Š ¯3tÖ¬—)_äý†R)•ÉìÞ=w{w¯Ý^ê¹÷ºÿî¾¾¾wƒî|óï¹×í¾{Ýý—ïÿà'ð'x&ÓØi¦þ/•GšI endstream endobj 76 0 obj <>stream +%AI12_CompressedDataxœì½í’$¹u%øþ±?dFŽm§ßwmÍ""35\#%IÍjL6ÖVê.Q5ꮢUWSË}ú=ç\À?""«²T=Ó-N¬²2p8ÜÜÏs/þêûÍï¾8~ýæŸ^~îæÃôWu~ûòÅ»7oqз‡_~óÍ÷ß½{˯~öÛŸ\¹›ÑèøËúeoø_^¾ýî՛׿8xw7ßyT>òêŸýêÕ믿{ùçÃÿóê›ïÞ¼þùág?GÕï_½ûæ%*¾ý§—o¿8ÿê—_üúÕÛxùůÞüáÍ¿{÷â«}ùõ§oðÿÝ‹W?ÃAÿ÷/ÞáÂø×Îÿµ+‡ú‹¹~ókÖ¿xý§ß}÷êÿC­Ë¡|wzóýë¯_½þÃéÍÿû‹ÃѹÃÞ¹zøÂþ¨Ñ¡Ñ~õÛ—ß]¶œïŠ/yžçVrʺ¬ÜÅèj‹)8ŸÔÅ]lÉ•ê½WöwZn…û„¾ïß|õý·/_¿ûÍÛ7_½üî»ó›oÞ¼ýî‡óŸ_¼>üûúÝ‹Ã}ùÍ7oþí gðBÓ—¯¾y‰w÷í‹wøš¿tþËÓ÷¯¾ùúo¿ç Ã;Žž_‡/Õå߇¾Ð-ç×åË_~‹o~÷òÝ;<nÈ©úíßœ¶ÃÀ—*?ûÇß¾üÃ+Í,Þîûyïöí›?~ûâí¿~Ç·áý]­sžŸmÖK á®d7g×bnxô«&®îšX¯¿ùí¿Áüé-‡9ßá=â…á¿í½-^‚ÍFÊóåýChÛû»tç\ -Îaö­yÜ­¯n¿ÎÆË?½zùo¿8üí›×/í•ß¾û-çÙ~ZÍo¿ÿæåÛ¿ýê^…Þy³wþë7_¿üí—ë¿y¡W­âÖŸÖà÷/Þþáå;¬´7ß|ÿNÛ¤Ž;`NõâÏ/¹0Ô›+_ž0%¯qŸ×ï0Ü/_ýó—²ÍõåÞý«ÞÙ8þî/_ÿþÍÑ£|B ïÃa¾ ø|Šx1¾âGÕ@Ò æÍøœýì·<~óîåÛטœqÛÿ÷xxýõ—L¼üz{Ÿ¤ûð.ãM¬Øß` ÿÝÛWx¿˜_”æmmÿÍÛW_¯K»øCµzÛwx­ü`=ø¹ùöÜoš>X1©ºèŸó½Ìú;<Ř:ÿåù×›m7ßýúwx<÷ùÍ·\zß‘*qr±¿yó«[~W .ÿþöRl`•þæí«×ìsú[ÕÔ/óÍ÷¨ú›·o¾ÿã/_ÿó›égF¤Ak_¬î ÊŸ‹þ¾<¼xûîßÞ¼ýWüù˯_¾X ˆëþÞ.÷¯/ß}õ/—öoÿýÝþ——_g`Ë}}ø»úïøƒ}h~ÿöÅWxTü½´ùpw˜†·ãÉq¥þÿøêû—ÿŒa¯—Û·¯ÿôò›7Ütkí>Üßo¾yñúÅÛåe¹ùj^`"×Ùðå»xFØÄëPû©ø`ƒMÕ3nôâÝ¿€½Ï^ú¶?×QóIì»÷w~ñÍ7¯þðöÅÿåÕW‡ÓÛï¿û—Ãïß¼ùféûFýrŸmªxå3VìWÜ’ooÝm_µÜ¨ý»ÇotÁë¿{msr}§ÞàòNàEvÍOô^Ë5·îƒÊÿ(÷øÝŸ¿ý§7ß¼úîÛuê7ßü´ñÕWß¼üÝŸ¿{÷ò94£¿à‡¯_è=±ÉßÛæwÿö4ùW¯þé½Û’ùÏɱB÷ý«w/×øæÛ?R +>üî_^üñ¥ž`´üÝÒaßp¤/¾x«rùpz½©ÿ›·/¾~.Áÿï_¿~ñ-ˆÿúW÷óéÖ—àéñpúzúÇéÿœÎ%£$”xg¯âPæó|z<=¨Ü£ðs쥡T”rÊ(éUÂÉO'‡2Ÿæã#ÊÃñþxF±«øi(¥¨d”„UŠGqÇù8·ÇöÐîÛýÔÎ(¼¡®5y¡ÕV ¸²¤–¦ÿ ‚ëf\qF“ª¯Csõ±>`”ÇZj®±úêÊC¹/§ÒJ)©ÄâÊœðô'ôTrÎ!{¹é>&Œ«¦œ ›$ãðkÌ1ÅÄâ‡p§Ð å º9ÿèðòŽ¾ùꡬøàŸÝ^æÑÕɇžÔžùq~ÀÛÅ€ç:—9Ͳ!»òALŒÒ?·û ]áßøô/ôߢ~ú7J²Ÿ~É”ôu/Þ±éÎÇ^ì·Óòó´üb™Ÿ±êÚ#¦ÃaMì‹„]R°göÏ »éûêSãN[.bûå ;±b“±GÏØ«§GL‘ÃNx» û»Ø.áu³ö(¯ š˜¤M\zM›õÔ;º×ögg³ˆ; š2vš~TnQîóóéÌÏ=ÊÊ#ŽCñ÷…³™îñúîñŠîë=÷7žwá%üÖ?b( ºþœ¡l§}¢:2€>Z‰!ǘùEJÎ%Ö×8ç"M '­O/Šeùß´þxö]=x(yùæC«wÁ¡gŒ +Ö—?êNßMº®Òú\Rhê)ÐÛ÷ÿäûÚ³6—½%iÎåJÕ8û@pik1ݳÎà+‘̯ofôѴŹ°/5 +Í3›ÄÝ»wï»#gܼˆŸÐ ô–ªKØ<N𸭮íuuŽ©Î˜‡¤Û7PSN\¨웙D·vµ^å·7Ó|†Í]ã7yÓ"嶎h^_ÐOdl”¹²Éä÷Ye¦ç˜e>l•‘íDv“I“nn“mm“|êÓ«©í³j3j³i3i³h3§>yUófsfóµØ5À½Äèy”.ý<ôŸ÷K9ëŸ D&áMiQ»ˆ$bÐökvßÖE ÙuoÁ A–u…ÏÃæÛžÁHM]h—g_¦Æ•·÷±÷’õbª¹UŒUøµ*m,VcÏÙ®[÷]·]ÙÞ[­<ï[¤0Ú¦ª½´M9nÊiSΛroe;Ó]Ï2%Ì”3Sã8“'ý³rî徯‚ÇåíHÞ5êl;Åö w ÷ˆvˆö‰i¬ï7Æv[ôMa3_w düÞ.˜É 8·>Z#¶ž’¾nÍwèFóa.Oeaƒ‘t á^BÂÜ…ñÍøY"ùÊÖF‘hžµj¸~¸Žl2¥s]Ëͧ.9¬…$ÙÙÔ¬‡®d±vª,JÐ!÷•q¼*í¥^–Íq˜°xüvÓ*øþV²ÒÌ‹ëØÕæmÔ ø –~›,€¼€v’äñ]U$Ï%€“b¡U¤^X<ÐÏÎnHÓÒjo£a*d]²1UÇíµZk~bãÒ»r蹂!ú9Wö] µRo… áˆZš}ÂÆG úf͆Nå2Ø,îÂÙ]ºõñ¶ýhk”ÅXßcöû ÉÖS¢×戗6Ï}§„ña#IPO ST¦¬fçƒ&e–LŽhC¯yÛMg;±Ì²PrD»is7­~?‘ñ|šÕ/Þ´úÅŸ£ÿÅê×5('Zi2˦af±“Ü~¤‰2Ù±.Š½Ô…¥+!q“¬,A6,AoÒ¥J–€IÓ„L‰™“,V&m>Hú%sšÔÔ[ϲ{Q79ör‹?‹ÍßK!„ˆ2‰ßÏ2ŸÉâTô<4mɺF K(’ªäQŽ’ ¬œ­Lå~)[…óq_ê|Y.|SËÜ^òI×ÝÉñ¡œ–0þa-LZ¥›ºŠn4,¤ÃnJƒØyãT>/þb3º<šiÖL¶“†á´š|ÿiVZkÌdl?MŒY-Í´ê´.ÔT­?Š¨ÇIÿ™ÌzÞH8÷]ž5évȼWϼ˜šûg’U‰v¥ØKXœÅË:÷ßóRÌÔheφŖ§'¤»ñÝð®xþíy±;ùåç* ¹E‹¤Ó"0ïqÛÿÓ²Ò²$ÒfY¤í»LýÕ<>JéVÒ¶Y4u÷û¨­ôsÚ4iÌÐ.lõÛï¶ëñú/™ú×/ö—ïË­ïÆ·§^6¾ƒ}9mÊuíp:nB"í=D^Sz*ös–ª ÙÑJü(;1-Å'ÙŠk·G‰ªT·6ãi‘NÍl,©T¦ãGÙîÍ·=œé4Ð@N8 ³&Ó@uoê -ü'ȸì6ÈŸû®Ô!~Þg`}¨>N²=›r¸¢}Ò§ ¤L;4ñpc¬ŽÇnf£zFk +F6Éßq”Ũ.~³^‹ä˶ee +};W–-ÎAJ;ÝÒÝó¦œ.Êñ²˜’ó¸(·ç>¯Ç®ÌVÝ&÷Ž²½xͳ“káQ³=æû,«ÍqÒ´7=vÑäg™xnè+Z +×:ËVkA™vªËª¼i’F% ãóØ̓i¾2Wi]hÁ2šdÖ* ¾ÌfiAüȳA›uÄYG=.È3Þ¡L§~›Óú9îim¥ÕN[KÞZìÒdÿ©Ä%îŒ÷‹sØ=W…vÌô˜í1ãÈAÆb‹Úa·liø.W³Èø¬FâÕx¼X”WSój‚^ Ó[b5d§MY,ßS_[£l æ{SúÖÈ>ß?îÊf°Ó²(÷Ÿórz¢·eÚÿ¹¬ð–­¥dc"4áG˜ÛãÚŠ²–c›6&ä½pk"¤=do"Ü b%ã° +®°Uic0lëÔÆ&¼87¶á2ц8ì +gHt¤=Èe0Ë¿fÞT“Æó"WÈãç.‰ÜA@ðøÙòI29]yMO>ô"‘/òx4ž Ó!HqzÄgz %zK螺¼Í]|/÷e +¿ˆÓEbóiHǘKöØ粈œDðÅ?=åÝxx ƒÇ—Ý‘ÝýØex²§îÊ~”+û,gv[ÜÙQÎl×ÝÙæÌnw6·š“CûAÛbÿtË¡-e8´ÛÎ¥míǾÜN Ì8 ñ´à"%´ÝÛÎ;¸ö +Õ¾ÜörÛ$ÁíRl[…¶Ud3q­ k9m•Ð$›M€Êc‡¨Üw©ëØgÎæ.w°JÐ j±2q:ÍοÈ>]¬Ë;ËíVü¹€nˆ@Óµ ôèZü¹}¦ÎãV‘g+êlEœP³‘]ü2·ÎHÅÄ)Þ²ºÅ=<Ï{oóãÎ'¸÷ +šg0íÝÄÃEü”Sø¸q Ÿ.Êñªàú醌lÔZÚ—W>öÈç™…nˆ¨µK]À|¹'­o®s¬v®z½O._[Zü¹I/–¯¸é¥*ú¨Éà¿{ý;ãÕ%¤êf°ÿ›ÈÈõo|‰ßØ–E=ËüñØ- 4fY1ŽZàíTÖ}·0—Åžd& bÊyZ\­ƒ?Š ûnV2þYŒ7,F°Ú™îâen¹Yoñ‰§,aç^ÖÜUøa:Ü[iÛ)Ý1ESM·ÊÚ’d2Ü¿Øþ¨Gœôä|n>³„´³|]5lì{?ÐÞj1¬h‹ù`èøƒåe°z+ ü°·˜¶VlcØC"ÍA×íZæLlâ@[¤]/ŠŒ¼8’“ÁåQ|éaƒ½Û¢ïª,Žy«JZ +<«s­Ñ¿‹w”=µŠ‡YXSçdAËÌM’ûf©-Bi݇s7ØXŽ;+@­‘>RüKp|ÃâÆ/È-ºZß:£ø°Cíƒü|ºÅÐßç£ù=‹ÕžŸòŠíɉ‘æ28yñ1Ï-Ê´´Ù—êì 3Ç;$ÿÆx°j¨<^b§ËêÀ·ô5Ôû)¬>ßî°ÈÒÑÿ#Bo¡9&11Õ6Ï +H5¸Šå4sš,ÈÀ—Tñ­K˜Ú9`:9¦+(Xt=Ê` µÇ"~BîîDªCŽw™ +Ë»øñ‡bo‹K[i¥¥£¨¤PÉŠÍ’n0GRáèsm‚Ëóµ× "•Á u߶SÂAìüozœÝµ^ Báæíü¤†õi®®|ÓÕ• p;W—ù'±']¿½ör4T1äÁŒ£LúmaCÔsç¿ÐƒåŠÔ|{œQgºØ;5ÑÛ$V»pÙÜ"âwØáBê,`ZªìI¯AWšTOÃÏ>Hüõ z6 òU¦žµÏyÎÞK4etÒÓ‚œÍ‹Rk*î°ôK î¨+ŽÃW–²FçMÙ:iÚ¶LçÓE¹ü\Q…nl½U@à¦{÷dñÏ,»xçé}ÁÐÏ(y)FpÓ4~ù¡Ê_h‡·u\ûé¥q«Û^Çܯ]Ý#>-ò¼q’—þ3_Œm¡ûKÛi^Aeñ·§‹ßÊR_–¿×›qfsùóבDÀÉ-HÙíÿñÉÿwßLýlë=wU¼Ýr«P›€™þít¡·¿Ùé®nuý}˜..ÚŽo¼‚Ëož.ý‘ŸÛüYez¢â½i nŸ?Øá>Âÿà® ‚ÎX¦bó ã݃1.Qyré½ütV‘xçG™‚=ÖÝy Á«ÌÐÐ#ðp|[âï¶àøÓbéÕü±„१gš>öÆÕü±:4ºdêF3ƒ¬q›µ{7ò•ÉÈ FOšŒ¦ÍhɹXŽTôÞ»û°î;7aA2ƤPO…{öÒÑtòKŽØÏ$GÊ(ëÇoJ7¼MúoK0ör÷ÃU¹æÝ[àýyÚüqzO¹Æoß.;pا•ù¾FZù‹ì°‡5u"pTÌIìdàa Ð%8ÂwRp^s£¼FóBè2<Ãr;M a ¨RÇN­Q3ÃRzËNº³’N3éÎPº±“Ki\ý;°é¾#˜Ì“&Ò1uê‘äR+ Yœiö†€_š§óÖ<=m,Ô® ;;õ}ÇÜž;ç¸X¬‡ÕÚìÖŨÐÔIÑøÄ^–½¿ÉÞ³Íê³å;Ýï:«Ð¥D}+aÑMÈѾ)Ÿ,홥nË´ÿó£K¹,ÓõWŸVþ";\‰Ày…Ç\™ç "sÅdÆ'0Ô´ ñ À´âvˆ‚˜×yÜmÁvÃÉ,ó´KáÏòâWÞÀé†CyëR¾r(O7<Êç¯ýÊ;`ø++KC–p#Üø´¥ÔMÙ#(ó¦tê0_nì±pUžb¯n-ÓöË@÷þ² ~¾U¦‹/>µLOT<áv£LÿþKÿêp0;÷âT6ÙºZׄޚ½àÂt‡qº\BdbÄP›å+>yŽ.ãŸn¤JÊ»6Hæ²¹Öö›o §ï&KÎ.ââpÜ9ZÝ•rRuùõ§¹{êMwOýÙô9²ésdÓçȦϑMŸ#›>G6}ŽlúÙô9²ésdÓçȦϑMŸ#›žÿùÒáçȦϑMŸ#›."›öYörÏ4rŽà¥SOœwžzòÊó&;Ý'}¦Oïb÷¹çW +Õ"h¯ASe4u¿òÑTž ƇÊSÇï=,ؽõ¼ˆ$Ä^z`T[B¡–ã"„Ô›7€áÿÚòï´ü;Oóß#Å%îyÇ?ßÿ9,ãñ›ïÃöo7õ5=Öò¹þNòÌžÖx¬º‰ÇV?ÃzšfÄdÝˈBBµû†¡‚ÅC˜':ZøLšØ§¿´¨,Ê«9oˆ«à;î³#?§šu?´6‰0·1Z«qÚë—´˜&J:y‡ÎÒÞw»š3‰â9¡^·¢¨âÆŒ²ZF–x©aT}Ü@i£^ðš‡p¼`׃ÞÆë=ï¾d1,âKvR{¡U–Ñ{¼FÉË°ö´}š¬…³?%Û+¢c‰‹5a*M ¸Ç.?a^™Ôp¤4¼ ¼þ|LFè °íf:Ê–KŒÚ Úuùwa¨žÄ™= öTpÚ}º M[ÓÄhzc´"ŒÖ´=´hÀŠ¶Ñhç©ãˆŽ xhMp[@ ²ç2a¼Ù@ãÔå•ž=µgM–×Óû¶¦ZoW˜Ž[¨Ž§¢ßxhÐùÑoÿ6-bß¿çÊ}Ó&Cû Ñï/%¬.¤»–~䨺>†9¨®¦;L´ÿ)Õ¡Ø ®<3/™7Åžr¡El§‚•³Ña§a`˜èÖ:囡–Ð*6·Å³íæCg·¸M2F ßÔ]¦Ë÷Õý¤†õi^ÖvÓËÚ~®Ú½¬‹Áò܃K¶¥k(‹ÁnŸZ~èõ®çu×ÿS·Ž›û(ôdï#åû(iÉ »¢¶ñ;*’Å~¢Lã—Ny[ÿÍL_Çn®?Ë vêéã×$òçño<ÄχxõžÉn9êrŽÌš' ]øgΛ²†Æ­BÅöxœõp<-òÔå8Ÿë¬ÏäfÝG8>¡»Å)–£ÖüÉyqi”Å•¡ëœë¤W<ô_ßYUÞ³Îb»šÀ­LÃuâT§åàh‡èXƳ2&cJ³N !CjbF¡ó@Žo‡„$b‡¿_e¼ÇƒWO–3O‹AA'ït·Uw_ײ~òR8qÀÆ(ÙwmÝ e×Úå;X”÷ݵ~Z𔆨4‰ªö»ä‹ÀÿØÏ6'nº­|Ø`+O»L[Te^à”¼8·;œc¸*{À³Û•ÍÂ\C¶¦ÇcãõX€hÏq}ìœÓ ßǵ»cukø ÐÚ0(-·,Qw‡Kœ–Ã%–Ã%|·Ž¯GK¬±¶ÃJþЧãz¤DÜ'±%1låûƒn`öòéöiýŒˆgpqº`Œ ÌÊ£ÃfK™¦ˆm‚³“Ì<qdz†Þå»Ä²å3:ÛoÏ••Ãxw ÞÈ^î@÷â6ò9I `½ ¾BðFÃÅÖ”¥@Åt–ýÛÏ%Ank¦ö÷£§«(÷zñÄ»¨­q ŸÄÿýͳ…½ÛÕwÏ›9×öž{‹œYÝö~˜!§ý8ÑÊ,ŒãT«î³ØX×Óˆ!¸¶®ÕAìû¡ÄÓ…ºbOW¬éPz Ýã@æ¥ nž¤ëú©KÉKI›j3-bMØ•pÃò|q:Ýã"9kÚLÔË¥pöt9]–éú«)Ærl‚yfÙ½#8‡´ÜßKufŒ[å»=öž)bÌ:ØŽ¢³#/„|¤8QÄŠýr¾³ðœtƳ b‹ãXº~Ðs?ê™B…¡õ‹i¹Óz™ä‹‡žtìb†™F¼‘Î름aH¸'b)EuKB4â–3ÊÖCWÆQ+§ÝÉ‹vÝ8Êcˆ2õCÌh_[p§~(ÝñÂo¶=¿ðÖi…ÉâV¯ÃoÛ”>|âÆüÉž®qÔnèXÍ&åã’¤ƒbí0ÆŽT«;㡹z«6²fIÑväÉ1øXP9Ü·#CÖ¹à[~ZÐ’ýˆ—iØ]\¤ …{ ä±›];¼QöÇÓfg^¥!˜LO{µ-6_(KCeòWQ%ZíÓB^ÊNûyê³Ê`Û(úgƒª?“tþc/7™ÝpÎ7±¶f“ÞýGYæçp; ·º-Ñò§µiñóóÊWoÿÜ_½þ±G'm±¸U¯ýØ—ÒiEäÞwTîŠË{¼”ï‰Bw tSW†"UaÒ2´²…î®ðÝóš`snÝšÄo{Ž)Öï´h/~W®\ΤEÃœ6jÓZžÿ©—eºþêcŠhÊ&Õ†9ö¾Çž>rl9ÑiZ6ù8Ôië´=6²øÔÍÎÞg·=ÌN;v«r¬JÇ¢v,‡Ùm³Ûh·;Ònê™×äv¶]WLÆñ㈻ÐUªmÂŽÜU0qñ©#}Æéñãùq +Þ¹Ÿ…7ʪ n ÜhÓràü¶ø›åZE½,دÓeüÞÇ3èoc†®.rVb¹’ÐãV +œ®ÄÀÕL•Ÿ oJ„’-¦nívåCÂáµ<ØsÓb¥ÔŠƒK9Þ*Óòk{Vùàgzoí¿ƒ&LŸDPÊ„€í%-½ë覡S?? »FÝÜòƒ´` ,\Wåy¿ï>wŠÂY™qèdTê›xÎã¸3¿ù7~®ÙJ6.Ú†Cé‚÷˜/ð6”è¦OÉz‹ÌYe× j(`?ªãÊøµÿcÂ|â…¹˜uÎV)¹¹0G|“«\'¸{ÆxJó¡do„!*ßþÐ2ü"WŸ9|¸ƒS9ŠÕµñcŽBïÝR+J™®’¹èºšÐo Ú`Ÿš°â¯ŠwœÍõßgž^­ü„;¿‰²^1_´áÄxuPØOgHŸdë é–­ߢãÅ׳Ää\êk´ÎÖA²|cDÃNvþû®šWçó¹Ÿ >è‘G‡n?Ç /ßÞwøÖý@µ”}®êëc‹Wˆ÷®k#^ï;ö=GÀêâqŠêF±ÏÂ:&)øfÁbÎbÈì¨ù=Ä»l)¸ëLH§=aA¥,Ñc x\ßœ@¬ 6[ .ˣ΄ž—Ÿóîô¹¸z›K¾›Aè7GàýO¼©xuz^d¤WÕÁ;+Ng7¢“à±n2T¸lA¥íâFºS·”W$uïOݤ®  F A›ÇþGñI{øæqqç­]vèûcboEĶËxX: §M4ì {ë˜èmH¹ã4Ò#v ÜHa¾=&ú郢×ZÛô¾cxŸUº¦ƒóW1¥ûˆRKÄV¦"¸E®¯±¤¿#]bHû‹w›àQЈ©ÇÆ3:âE-VTq¢šswòÚAΛ£}×PE~N=ÄÓÂ<‹œ¦¿Ùž—¹Í±~•¹É a–—¶ý¹Fbn£0˼`æz9íâ+·áun»—\þßöa—Ç5Œò¸4ÚÆ!œ>6²ñ©¸Æ]T#áÛÓ…sÄ"G<ãˆf±Œ[¯È8Ž»,r+¹ÐÈÅþQù…nga7Úô¾ìω Üá}¸ ì1^Ó’Veø¾³™·‘€—'3ƒM‹×é2ÅÊ.ÁÊEv•á÷žûK_³ªœ¦Åo]7A¤Ý#õ¼èºã.ºn[·¬[²ÝÞŠªÛÇÔíãé–Hº]] ›vñsû¸¹1·“Û…Æ]Ãá3mßö¡m»ø´Û˜À@ýTý†Ük‚?Ò>M.¸éÇÅ·%œ ‰´Hë^ÏñØÉÆcnÈ V¹`#\r·Œd‹7gt¬²Ê&‡Ç"µt¶iÇmØëæ¸Ëš°=t¤Ãü߉÷¼mM›çm²Öm>×FFµJ§ƒwZ8ÿýâÏëðCqšŸ¹/ÓÇñ™}N¬ý(žÊŠ5(øËžï=2`vÒÓñü÷c\â.eÇ]Ö¸ó}Ôùsnc›–ˆó}¼ù¼å‡£\BppP’抉n€ԉÔEoI7rÐãñšï¦“rql‚Ù6ú•Çšž \?Ö>rù›”ËÓ*±æùÙ¥¶¨È,YŸ‘´CÊ×R³ ãt_Æ6Û0Ùž¾ËE]*2ûè&â Î[ë/EÞ†™ÇmÒèçøûœãïsŽ¿Ï9þ>çøûœãïsŽ¿Ï9þ~ `]Êw%ºüã¢ûÆ >gùûœåïGÉò—n¢C“ÛE~u'ÔsʈæÊi…2mÂn•°ä¥‹KIn«á°ZÎÿÝ:¨L·8wäË}G¿õT”ÇÅɽº¹ù󡃲zjÊuŽãBFÐsþäI‚ºc÷@ŸŒÆÂ؛…7Ÿ»}8j^£ä™«L1Ó.UŒÛ§­‰ƒlNï µAIJs–Ü"e©6í“ŒhNýf>ónV‡ª÷𿲹óÇèðÃy­º¾µÕ ò‚*Ù†G\OJ+6SÞóËÓŸ·iºárºíSZs{”q¸Q»-qúxsâîê¶X»qºqPõ¼ñÓosû—XªKwýÆò;]yìk×Æ&ÖcÜ]ì¶6¶ècÓÆÈ»×Çžˆw3}ÌæóñÙåY3=Ýt,>v¯ævÚNînf7sû¬™­· ÿ´™ÅÜNÏÄbÄ%zqhÙCÏ^c5·SŸÚm ãõÜÆ˹Õ|îÜÆï/þɲq0Oô3ßZ—󾡻r”Ý6^çùé9ÞO§‹ðǧ—jnÀ¦Ïì´Û´–ŒsØM.-'OíØó62uº0 \‡§Þ´ \äIb­”~ŽÂ¸BÞ÷‰º„Ø&D+ë(â¡‹ªd3dyž±™ðÄyû¡z¯r±Æ†Íø©Ÿʈ¤_;=vÕé†Þ¼Uš·jó´,w¥5—e©´Ö|ZÊj? ›yê(ø±L.µæ"ŸY“ ùtÁYm(T› 힧Þ|î:Öcל}לG6¡9œ ‹e£:ûI‹%-zÖHê8°9›”˜—Y«e¥ÛVž£e?K³Þ*ÔÓöè†+}ú=ÚôSªô´èÒº´ï¡Îk¸³éÒEèï½*½XM Yx躴ïQq7ÛFÖ¹¦ÿ஄>×AÔ Þªtmº-3ýÐgÚi¦GüCZâÖY>ïfÙY’¼KÞyV’à0Rx†Å…ºÍâ9fùÇRDÿ¢;ü°–í7^Í´S³+õ·õìUÓáµï ™“Öt=šGþçhäÔÀ/Õ³é†~ö!Ý;¾Ç3]ÉîÏÒ»Ÿà§M“U;»™Åd'Ä?©žM VþiÝ{§¡mµï0¿Ë6sé½ÒÀ»GôH¸çèéÏ›ûÝå¶NþA}üJïó=½G_.Ç+eíIumÚèk·´ñÎÖÃo)mË|O7b#.çûR#Ö–[ÊÛÆÿ½×ßžã¿šñçhïÔÖ/Uõé½zú{´ô§TôéFÄ‚¿°°íçýö¬/s>]nñ3~k¾oØÕl¶§«í?Îú²AP*àez¯¦~Û¶ö$Úa¯ÓgçÖ ‰@\L‘þöˆaÔ‰÷.JU]x®JB +a½(÷¤ŠPž.þHíø:Áf¼rÇÆ­ëuÎOèô?™ýH:=ÓÆY§_ÆðI:}½¥ÒWjôé"æøöÇÝwnA¾6ßN7Ä §~ø]ÝuËbÇöYŒžnµ+Ó—<ßvõ".Ù?ñ–ž]®;¼¾ÿGýý~ÌC_ °ò¹Ã¸psxcè†/³ÍyjªDÚ¥ +94NxMhvšv™N}Ç´®™N‹&¼·xd©À­ŸDsZ“LW1GûÇ3²X;äV^ =©2­ç†ìŽ +1¬ÿî`õ@•ý©ãüÃ2-§tlãÿ»,§ÜôÁ´eL›—¿*áF‰O”þ˜Óøå¢l`[û· tåô¬p·Õ¼ÍÜ?\8 Ã¯nµºz°_ݺãóZݼãküûëãÛw÷¯¾z÷êÍëoÿ|ø…¸Ò_ŸÞ¼ùæð³ã/û[ÿòáëWïÞ¼ýòôâ«Åì}ùûWß¼üò·/¿z÷óÃÿŽ þü»|úõ?Ùï§%°4GkÎvt"±>§¹€±T¥oŸ™¾½z;JR ê£CmLžç˜¼p™«<\åw÷Kž.÷zø‡Aœ ÓÝCZAO¹´CËw¿jŠX …•sMÞ-•¬×#„÷H™/VÉͺcŠ¬@ƒÃWê­ÝáU ‘ƒt8çïR£oÀAié]Ã|¤ƒóéŽàè:x*ô‚­x×æàk#ŽdF‹îZu˜4# RvƒàAÂra«œÅ»sÍFà,6Ħ ,V-8[ÌÐN¬Å«ºÈ¡ªžËºÇ ’}gïqÑ qÏktgy. ÞZäÊn]­`p¼q#ðÅZ€©E©Õ ¼ÃÌâU·MqÆZÇhB œžY_S0íBj<°oŠï×ÍxSî4§;=O*vXôÔ°0!x$LûYSÁŒ ­ü¼ÈѤ3³Ð½ß1@¨q1C69  ôƒ=Š'“ žËCˆ‘xL×òìu0Hp•T`j3æ"6È•ÛÏ5ž—JÓÂC?¼ ^kÂÒi<§ñ„P¬4æI<{™ÉТbà1٬ؤ°õe6}ÈÖÈûªF|4Èýûš£.†–­ïS¡‹Ã• …» xŒîsÍV1ÎÖ GE+,Ĺ÷“RV?ÅÙ(SÀSrião >†Ã[°ÅÜ»Owô`·91* +o9%â‡<7()ÂÕX¡àXhÁT+Xù±`  óß…™·…úµ7¾W¯)j6¬é8è~ æ VÌh‘W¸õ +®SOOàÍèÊsrgίuݨÜá^¤*ŽX'ÐUll®R7–{jw%%N +¦€³ÂçÔ¬\TØøÛ¡d×WᡵÔx—ÈŽn@±ÃgN- ÛFt!sQyq©fì“꺅îT3CE™ *”z«l+,Uðe¼ÿ™Ù‚\¡˜$e6jvD”¹³`V‚x³²$03 +6)ÛU|2V(íE!žþ¤ÅîþY‚ã=;®Þhæ™”>‚ÝÌ3a¡DwJક¦h¿â•d&¼âÁ5`·”5À—]ó”ÊFÛ<$H ÈwD”òÜŸänPÚ`3ªc¬êÀŠ¼êR™ÁÅh?óS ‰Gã'- 4:¶àÊW ˆ£Aç +lªDCìǘ(+õ;e­4¶š)4Z±_¶Âëâ2(râhÉÖÂSáŒØ€Y 4qs]&»³’¡žÜۚɮ’P‚Xƒé‹á¥¢­z€= ï„»W¤ +b'1B¾f‹ Ã‚Ð#®ŒYT‘g¬#\!Q ó‰Õ‚EîÊ*I†%™€%€nêÝœ8`l}7‹NÌ–™L¯âbDd¾Æ +lˆ¬ + +Ïø;Çμùã” qæ{A%èª5ž K¬4•dû,ÔoV}Èê¤ÌQÌ®žå+]e¬t¢Â!ÝáPñ‰Éäz¼c¼n¿T¨Hð`ë‘Õ™HÛ¯ši:ö3¥xÇó(¡?0XÂ{Å£º×éðä;uiY ¨JÌ*swÒUÚRÚ&GGNŠ äBÿ†VZ{/C€þÈ3æX)²Ç +Jþ•Ò/ïQÑ(ü¨"vŸxRþ1•´Û,,[=4ªZTѱGÁ !SìÂ(¡"b‘SÑ¡ÆBJ ÞŒŸ»¦6“…0Ä P)B$n*Á'ļ1‚ƵÑñÍ]U$¥øëDíª{´r ŽÆm¬4,PÈQá€iµ*Æ|·ð´’ +Þ8QŸ´š•X6Wá*·L¥?·—¬×ßã®~èÔû*l +z9$<èY´bö æÜö?ÁÞ±Þ6<¢)*éde䌩º+tI`Òõ¥‡¦'³ð{Ÿ¼t•èק€öXé¸Y!<²ô«©{HAºs¥ú¨›cuø¾*š&KêoŠRˆ2O@d8 Ö@Ô+á¿®Àƒ®‹ì¢‚c¦°ÃAÔ9¹ž챉+yôm ™ú^œ_*L]+N ` ‰ù0—«<è¿ŒØg`@ôdô{]I82 ¤uwQ‰¹œÉ #u|Çl”¨-Ó(¢‚Â+·Â)¾±+ôÉÐ Ö>m}(¯iû¡ÏÌÅ;¦&ÌwtZÑ +ÖȾÀßôÊÔ]Ä Àx*u2;Œ8ÐnÉ+)hÒ©\Éâî2•ÿˆg•‰…š3‚r°”“Ô*©´¢2B!k1² j +Çô‘T"=§¾TfÄÄm ô@g:@|Ô¨¼âYÁ*XIè8+!cÚU`ŒXV´$ð=·¾aQAó7ÿÚ&¿£ôÁÆàèY·Ð#±‚t·Š­{Vð¼M«€„ª+fÒš\§=2s‡b3Eê-‰ E¹â)×r1Óײˆ³­ždfC‚“ÇîÅÍ ÍBº9OxîLýL¬ÏIœ“Ï Y » „š=4Ö Þè"Æ?ƒe±PGNÏ^|SIV^d`£r «âØ µËž¬K[”b¿£H€™å¦PÔtV€ûUðÜQUPç`ýzm]ÓUå,â†Ñó±1ø¹¨^êÝã+EqÒ¶NŒ«]ø¦Ùd>:vß·LÔW0¶«Š2K‘ïkWÑ-0˜ *>ϼÆkè[h`¡Â$\d:DILƒypÁ̯[ètÒyåë ¸îgÆŠ¥õ:(­²½bÐ +©—ª$ˆ%žŠžÓÑzÕœ-J’^ŽkAÌQ.ÔÊ@ÁЭ‹]Üér…0K:cΙ¶7D>€“žfärÝBH„!wd’æx£›d@ÅdïãPít4ïUE!(À×e-ì*1’K‚xuãiŠ² ÜQí?ðMzB‹@!@™—ïÕä õïAG¯ÍÌæ(nfZiÁè@ÖëŠD«¯Ý]VâÓ8htnñ™T#‘k*5=_ ˆÁ¨3O{gžŠãæ*°Ï¬ó¶[á“€ÜBM b.­×¸1ÅtèÄ)•ÊJíSÚŒ±L¨00Uh³P·‚4‹Šà´šù.P‘#·:Rðï¥;yË(I¿–§ùž6IÒ¼« +°7šqzo•…¶Z2_Œ¡)¢¶IÍ<”®aϵñq° +ÄéQ1–¬iï#!!Œ:šQ@[Í(¸µbhÓõ·”iK0÷¢’¤P jžm’K +jö,Ö +†Œ5áC&»hK…=(úæf‚f +Á8®Wª¯‰”EG¯J¡™ 饮t_Òö×É…6l6ÔùGÕQw`E¦ò.;íoýu†fB¿›kP½at‘M&ÝèT{r.Ž3UTHµ¶+ª*@Ÿš’Ò«N +¹Ó¨ãÖTA¢ŒØŸcja̦_7w¦YdÞßix²Ú²£4 Úc¥\CzóõV¹ÏàQ—•X²€$Y‹¤‚|„(q-‰‰4æcx´‹»µfY à´\ ¾µíuê‚ä6¼1’|ŒC>(€œjØ$Qâ‘h0ÞˆéúqMÏ´#™šEZM®OZi²¬Ý‘èÏæh†d³T|5L·4‹cŽé•_*iñ¡#ƒ><®6W‚z}]±%¿W•¹ñ8r^ ›>ÈÀ`=ºt¼ gе0wÉ©ÐH†JEÿ ™©@˜AvÑ6P+ +ÕHQXœò4Ò–›)Ü•"7UZ©Rºö˜ƒÔÃ*Ýà4”z£$Í8“gPößÿI*âl¤‡8snú56 +ž´½Q´¦7Œ2$5Qº%)®:LÑSëŽiÖ‘–6ekVGÍ_ÔkY >w’dÑ*hPEwC³H¬ôÌ‘Aå¨$©Bþ/0pUhêXá’Ôd¬ Ç +GyÚºƒfÖ <6úøŠ®Š´V±"ËN@Ð6Þ*èXä÷“Ðh'!Ë4±yT*_N ’_<ºÐM n¸Šg«`îÖQdðÁBDeÞÚ” ê;ÚAø7ù!mLظM™Z(OÜ84>QÛ§ÿw{ Ï'¡½%P§­´ÚÐÓ#iˆÐ„]]L¥½üúÎ61›Þ¾Îq¬`|*bÃ4uq ôÍâŠT¡50 ¢£û T“-ЇDOÂV<Í„4*3¡Q“wÊH˨Ýjž5Ý ûhæF%Õh”| …™ =Òd Ák….‡Íè*ú«¦›±u` TœØÉ +¾“Í@“ɇi …jÎ^ …2½Z“ñsU žr"s\¤o†7jò¿ƒ¨Ç¶Ü)ÉÎ]ŽÓå’QÅ1ñ†dÀä\>¼‚@V`aB¢‡§tÄy†ñ´Î\zP#^³ØãEDšØE¼æ&ç!÷]"ú0-¨‘R ï“g‘Õ Íôšà=•.,±U-£2èê ôíQ´fàrˆ°A-hyb <1 ÷³9Ñ/;Úè'Ët½ ¤[ABR+G!€& ­tB®¯;§~»jEí ñYfÔû¨JHdÏ™R"X3vJ‘±bå0,Ew£ÅWÝñ/hÉô•¦ýð™€7‹û%½VùWõª!–Ò¿*[&øHV:Tb S—ìZ”™J,-ßC‘^L y1ûXJ×dŒt£ã½ä4ÄëVž„Bg5»!'L®å…HÞdhܤ€“$¤îyñ¨ UÕ"N *[+¶låäØB P¹#bK†c?|½jÁÜh‘HùؔȰS(Ž;K$þÖŠiËØŠžVõ“tê-ÃeÉš‡ÁBÙ¨sq,Ô Ô‚2 ^T£±ÑîÔÌõViW!ï‹NÓÞˆºÓ +‘Í/ÆÑØJ·wõ™‚8H5¬«Ù1 :±Y 1ã™®ZA7à%R‹j¨&HDG“.6’NGù•*-E+šÄeË_uQÆó,8JôŽ–Ñ«~°j3m1ë…,¼”;ZÍ0ˆ ôÀ\·˜nñº.GC%RZªHò¡b«ˆì 59Oo½Ì$P* ñe‹…^i‹)q´P^÷CÃg% Â<ðÖ§c:†oÑmC*ã*q—H'“½îh¯Û W´œ©I­¨Ó±Q!š‹ÄŽñTj@»<\¨O;µðZó¼‘dŽ¢ˆMµ HÉ4+.72²;ìîEL@ ñê‡Ä…-Q¡DÌSŽŒ#UF¢VáTšajæ‚À.|ÇxñÍØè®á}¨z˜RR#åLb;½|P/i"%D‰¸lZÁæD9뺅ëo¥¹È]l7ºlE_PM< 8A¼b0Ve R¦ +Ey»çŒ¾ÍL¤çE[vQD¦2"F!—½8ìÇF$käx¾³Hg¤Ü…T„8!a á:­‹MR9J + ÄLfOkD‘ÎgP5NY&Q‡YˆZRr~Ë]?0·ÜOvƒ 1Š1¨kÄOâ2­6´º4,ÜÇI|°®{ÌdæT,H H2.[˜ß<Š„œÑœˆåE+¢Å%ÏÏ„|8ƒ ½I´’¼q×-ZG¶yfúËVø +àÐ|²î”…K$ê;Øl;tÈó!ªž‰Ÿ ⣵p ^‚+ ç’©½R°*Èf¥ƒjl5`ïÅŽç6´Ó<Óëk-L·æjH†V@ôª¹[=ÕJk£2 ÍÛŒ b? ª~w ¾Ô:´ÈÊ‹0;FÈÙôY†Ghe}@¿W‹Bgçô@L Ú‡)Ÿ ={½4ú• zcO݈Ưz­‰þMs¼ÙK²ã_nTÒ¶A¸6`{êK˜TÌ!‘oÄdQ¬mh×-ì]E“ùZížoö“{À‚…Æk|3UÒÌ•eñH#$%I#ªÆ&–vŽ®ŒÏ©c,¨LÕtÝêW}8Ä–2i +Ê+Ú3ôIïŸpÝP”¹¥i8s‰œ +êiéu Êÿ¤¶E@‹Õl³kU w*4~bF¹ñ½ïhÕ ÀôÁCr Š§fÉ fÁÄ·qÝb¨ZDŒÓìW„̽ê§öЗ¢³J)ЖCëÖa2ó²Å%6Qö²ˆ™ð›Y¶W“£ ª öbULR-#ÄËÓAž"%€¹ÏD-¼Ò&Êó0ƒþŒ+ªË•Þ蔦e†~OFøÑþÉ0)If†ÈLJ£«k¦£r<¹¼)ÐXqúÒâC–(É(^/eŸyj Š&Ü}¶ñõ ´nPÒzhêPgÅÑü×–OŸ3DNOeß »Ðèãjt¤Ê|Ms¹æ6(dhfúQigDÑÕ×fŽfl}‚ˆé®¯¥Å—ЀDl€|í ™Úm<  šËÔFR×®*)ÐAO8­äcMF"šJŽWŒ‡(3b¢H$åÂvÝ K( £phâ IK€µJo 6µjô–…g6î'±/óŸþ~ºŒ¬#ÞZoÛ EÑ þ* ° ‘Û1qS4Ûñ×Ý÷_˜“¨[4Â’e0O ˆÓlñDÕ…¦9µX;5fس}$¸&]-´©ÅL‡K‹Ä+t ªt9¥5NŠÐ~ +ìÀ¡}&­‡8 #‡7iR 5›GËÜõx7h5Ê{b{<]|]«Ï +$ŸÜ+j%R•)é©¡Øh¸®Ùê‘"ͳÈk‚G¦üÂX¿ÒïÃX~µe½O „V„–[+‹t Ά› tàšŽëQ¡[›=VO¥›Œ1 O?¤ß"·,VŠW¨(n ,†ýÌìp)R˜)cà}§&ȈE†C‘}RØÚdx¨÷ò0£ƒÎ×3ª´‚^‚˜œ™ÆkO"š‰Û9˜+ ȶkíXñh +Q¨ŠEÆÂÖ¢’ Ì´ñQ@+êsº6 Ì@éQßRJÁªÈ:ˆšŽ<óËÒŽ$m¢2^”™·¹‹òâî\5“ÜH_¨†zSì1$³@$ª ÊÁ +eÐA8ËîYhe”[¬óÎÔJH{T +üL¿D±Ëe"€“;ÞZ_2fMõÂâP€õ©×ºËîçá¤Nf +/šFS“Õ€(˜“™¶!Ó)ÁAî ˜…'Œ¡Í=$ˆÑÚyxz£bqè#õŒ¥€Š#Õ‹q¶9 ÍÖÌ]#ëC£Õ›ž×›äœO¡Ã3 ¢» U›‡¹÷”Íc biõE#ÏƆL }  HÈ1Z™A)Mñ;ª õGøŸ¼ÃQNVîHïÃóÚaâ4/8ÆÐtê à?t»ëUéÏ@ÆHá·üÎõGù-­1)¶ hTˆ Ý"ô$jÂZÉVätl•ižc+°ÁÂVÙ¼àµãŽek@Ó¤àÔÀQÅf4ÅLËå8ëFnø¦éÍ–ŽÖVj¥h¥0PªÀÕÙ˜ C|™‹ ˆúDLwé ˆLQÞê‰h!Ì8-™y°Éhk’{ËI®' K¤Ý“è$aebƒï0¨þH:+Ëiö%`ö#1‡NA7Ô[ícTƒ‡rzyÕ£lh…wÊ… ²ÁÕƒÝ3Ó~‚†(Å°Ö9„˜fúâ³¢^ðL¸{Ò¬{Ù˜ù<}’â%¹âÅAˆº“wâ´ñN•ÞQl,Ð+)iåe:“ z+û'j…¡7 œô­,PNXs·-y¥, +jS¢3ŒŽ@L0Í枺'i;xsb¯ ãÁK±:1ͬ“ļ4zwAýïõ3ã‘È1 55'$€#¤7ØxÒÐYhAn|ù¢ÙJá[Ô«ô,fô¤P GßÄôÙ€†$kRSÀSÿd5#pí.zL,õ0`X¾™L’Å1kK“@Ið@ÜZ)j [;1æ‰o-ˆïâ2ÂÄÌæiƒ NÓiF8ó0fŠK|ët·r EƯss„ÙbÒi¿iì!¶٠ÌAßͶ®™OŠ¤¢ùÃ$è(Òá^4ob9?0‘™6#‚›‚¹j!Ìf³¦Í­(Hš¸[I;T((í8ŽBC‰ rG]tŒ¢ËDjc–'´q]fc¥TEÁS½0t-¼@ð߆˜°ÿùá¯÷îí«×8üìt:~õÕ÷ßþöÍ»l»ËÙ`!{†¶s’W˜ g'R©0صch¬œT êÖ{Ç¿cÊ"ö²°ÿ|Ä –LE1Úç:Ö-P‰õªÃĪ-˜YÁðxU8‘:gF„3_Á“+TÚuþèô«ÈåÎS…ÇfÒ V”,^à„àß\M¶æ2È6ã±h©ª·­-ËA¦Y„TŒ”Ûl4`lÃæ „ë6¡j6—2"z™•Gj]¼UTg¼ “Oó»d4‹pô”²Ú‚ê7<_ìñ…ž/XuX%Z¦ÊGd\N5m„VA * ¢V¬°pªßE½k©± }…)¿§Ã:¡‘½K h ªƒ)ÏŒÙ$ë„L>k‚éO—4*ÝžVºÒ”`0Ë'ÖÕù\Â4Íb…oògþ–®ÏB“Ê·½•´ÄF|*MYh¥`22&ŽM&a8°’²7 ·AÚnÏÍk£qh®s2×3´ušáb­›TH%«yb™à€­@§ŠõCû¡RÊžü™Š3Ã"ˆ•äPHñRÄo0t{1%åŽëÀ\IêðBQIgφÅ¢“Ÿ–úâéa—Š>s.òX&-®¼’0 7"6 w>'xzã¤XFˆê„ùwδ}Ù;8Î*±ðÀ7Oôƒ$³Gc¥d<šÛ ‡~[1hÏZÑÒEpyVt_Š-ÀC‹Z(š;ñÝV§älQ‰íb znØÂÏy¹£¾£VÔÅÙ +ª­dÎÆ„<° “£DQ T߃*Óì„uW Îd²Ä+6Ð;¡þI£%Áh"£…¢M›qM`Ö ¸a7tî±È)„Ízs²ŠQB¡-tñáøÜ ~žÀlú3²Y¥!¦ð*,—™`)êù!hÓŒ áwZÔÊ#ŠÒ§°(ew¨Ì¦*G$-xDqÝи"÷CwÌ0‰MQ? +e¢ÍYxæ xY(ã:ñW¦ê$%ÄiqÝ„,ƒXdØ–9‰äÃ¥=„&g*8\ç +õ#Ü¡3”“F‡h¡Lµšè™è»ÒG[V\üžÞ1zJÙ(ÏÉ4(yAMvf½³bÿ§Ö[0} OîˆÉp}‘¤‚ºgUEUðãâ"lÊ°ã% +©Æ¥V•.BÆÀ’ˆ‚â0P¿k§|ijè¶` .j§³Ì+ýË f!Ñ öÒÛ$]’tºdÐÅLmV p5þ9öÛrÛò¶¥?!†‰Fš¼…§¯tpTg`pÈÄiŠÝ%Döçåéa‚)o‘»m*Dÿ{]JÍ‚Ä‚,îfÈ»rJÓ¸ »Si`L{¤(xˆ`Œ|æcyÃ%þëÂÂsJ–a¯t«™šdË‘·¤Þ’Äø6®PES*Ë#u>œ, d ™Šn”aÝ5µØÇ{™Gð`½"EIã梷œ›‘Fh‚ö›<YrQŽEŽ+Jü³I‘F¥}¨OBà(Ckz† –ö€vÞ(·±en¢(ŸKè¾@Ç,‰M®>3¥;‚g½5;%dÌ[W|i%À )í¬¥5r´ (IáK‹Á2}W!´Á’¶ªŒú-_Þ¢ò袅—dDSMf$Ï€wz…UŽÌ" fŒÒmDõmæ»æEw7c}.Á=r#ˆE‹‹1mLP Óѹê™3Dàùà „¡;d™›Cˆ Þ.™cö¢ÄÈú¸ê”ò…±¼a–Y™¶»e϶dpQ¡Á€•Ê§ 5@öË\–„ý±¢Â®`j¢Ñ™à‹‘J˜õ +ËÌÔéö¸ò5dÈX˜ÉÇCUölAœ9™X]Õó|X¦ù!•€À6H‚Ñè?÷ÝT-Á‰Ô#)K„w4F2S—S:¨"YÌÄãåI½Lù®„㛕’°Y`l‡>ª2ò^‘†UÊ¡Â +Ë.ÍmA‚¬ ¾Ü¨”'®éõyéŽ8V +§,7}pYá›òÝÉLÄŠf£›iÞ²ã²Ï¥If¦¿ˆÄ +ª u=V4æ}ƒ¼Gé@Xbdd«k& . +õ¯þºÑ^™[° òÃZä‰Ù_=±•ùHŒ-/AÌ–dI>±»0æX©Ô<ƒ0*Ι™¼®R 0*fÊ嬨œ!VHBÄZ¦T'ŒW^»+‚¸PÊ^•´f±BÁÀt;ÔÅpöª°D<ƒ§©bÁJÌÎ’b4‹``Ü©ôŠ©2g4:Йž[µ±[†(@‡"½/äÚ1@µ›¶o`ÞJ+9-šTú™>‚Ö™ÞŠ5 +‡˜J ÌöE8=Ú²˜ÑŒ¥ªðãP%doqZQfÝÄ°vjFÕ@ÖeŒ#Î@€z²ACÉÄœ; žìŒ9À΢٠îh5X`™rk£Â[> ùz„s&ЫÒõ ÊÀ„{„tÑ]†Ýõ°¦Ö '—ˆ ¨Û´—âMÞõp9­@¬%¡â˜Ï4ÓiÖð&a¨â¶F–äöQÉów$Ç/3ÛÔƒ²âTh(ÎlÑ•`W²žNÐ\OöÀúÐ]ÐJŒãÇu–å7s³Òøž#ÐVœ—ðqz³!àAxbàèÂ$×)4‘4 7¡æï”31Z> +ÇT—™ «u—•ÌéÇJ"Õ–J>P“ð ‡Ù…ÉõÎ +©a˜ÊöŠ 4Oráƒ*™š‡aûJ îd§W+”-o*ÍQÝÇMÕ¯HÏr®Û šX¯#~®~GÔUd(‡PøÞ2N('Åðek¸‘î‚A|—Ķó&òZRÝ^ù§SîC¥¹›S9Ó8̈…0üñ®£h8 sºØÊèñšÌòÄ$´“)DrÎ=(@[°Iæ$pXƒÆPdƒ•‡”â 3aJ“\š±*˜Ô€×xR…EãI™›)@Ú œ”L¤L€4ñô¯ŠŠs=yq"<`”h¦`„–Ç´„¤*\‡i`³ð‹„aê¬ÂÊP(Å®Ìoz°FDw\ès6»rSFÑDÀ-©)öauŸ^Ôd×Äæ­¡§:d2Ãx ŠÓ#+™,’Ùˆ8AN–3B,8pC¶­Aó0H¡Œ©*˜üÉz©Š7bzS½0¢ ƒÊ4IuYàW‹f}°¬Š‚nÓ;ºS „PXÊŠ¡}ȤlÏï)ª"(Ç ÓE€Ž0iwcؾ¤ Ÿ¿åD“u1Qß´™®M²5[‚CÚšÒÅG%q ÛQ}êÎ4:ZÂáeÏP.Hï¥j!EER8Ý’ÕŽ÷•ÍƒuÇØIîhð9†$ ŽØ¨¿ˆ‹$ú)=øž”Þ//ç}°Uö8ÓW•Š&iâQÁCAIÓ™„Š–V¨ønF€ì/½¼GÝÑ‘ÅJÈ”^•´£²‚¸¦à­¦ +el° +UÁɬwŒIÞôƆÞhšd¼;›B¶ÄôtÓ®¾Ü33JHæDU&¥Ðju—:ºFì̤¨M¦e.OAÅ’ÅD0!&Z™2âöy¥²Ã!8˜ H!sBP¶|É,¿4ÆqARE!S€J&…›g5sê Ë,ßh‰Ê7HE±Ui?å„›@›ÜWIdŠå^Ë„)Í,€ +¬¡ƒÿp/æ¡~•©ž +p&æVšCÇfuPˆMŒ· ÒRhÜËR”x¥Z>àû®Ç0GQ(ÆÂñRÍLC#§hK'ÂYÂFìá)XËLEרé 0$·Œr¿dæqÊ13\ˆ«àpK&ÆTaÛ3ã¨)Š(Ì +„“À ÈçÚõ:êGÌ;n#7Õ%„,„Y83(†‚®,„„ZqLÔʳ…M)P$Ö–ÊÈlK•YñZM›•(fF´ÄE¿LSÉi‹e†UÊ1HŒQT—\xÐ@‚ìß—àKª-Uú Ñ|áF¶[Í ¹!g•êH½«@Š¶F¦Â7º$^¸qÀQ9jvã”ø} ±,g0ó:pÝ +NÈèG4˜a@11ÕB»r±4¯Ä2Í+M¹‡4;ËdP‚²¨ A2¡ë€)C:œhAšªŒ3„ˆÙ8—y š3†$™ªë^8%¼d¶U¾?×ñY…²˜à]ÞRg) +Ž¾˜(S# AÇg0å\Q®Eò–¢Vûȯ1ÞêGØÐe‚LÔ¼UŽÇ\$µPfG´`þmkA­ˆ-FD[Í–÷ÓYòn¡"$b™²Æ…#÷$ÅEØLEYÃØÀØ/×tGd NÌq õÛÉé¦JõWÌ'ùV”ßÝ\Y4²’hP´f0H¡‘/XúÜ‘ù’žR´™Á‹×Dl9s"síiŸ*‰ó­(ëpð†¥Éô+6ªvbEÍ–[†8fZx1¥Ê¹gÄ)õ¨°hIu1~fR$ÜÒîdqZ!BЉŠ# ü:f£pªüëLG7!e +§ýAšÁìh@eŠÈVFB…d¾©¢€?‰‰F9þYix­iV.4+Ò5%{ ö¿üK#Ž˜ª€–s]i¹Í¶ Ÿ™”£¦Ž .Lóc>KyšÐoõ¿À5)ÍŒ ‰>ÿþÙ¢J%¼$ÛȲ:W¼§Dȹ’Q–§J)݈¼›ìÇñ ¤¬ä夫sOص0ÔɨŨŸ–,RóXd$*k{‹Ù¢_™BîËíþ-€Öë—‰…f=›k¶Ì=ÚÒYò‹D¿ Z$FÅ©… _ÕB¯™A½š2òY ÔÙÇ0àq9(ãÈŠËš[*n™¢&ýd2¦'5S>梓X…EÇ8oñ +m•ÈP:&ñÚ!„ŒÉé è ဖU-ñ,`m›‹Í‡&cef_%ïÎÖ ¸¤ÏôIQ%ôV –&úìÄ5x ȵ †ï.œ‡l„1ŠvÌ ”=@ÊL,”ª£Rs6Zë¸1¢ÆD-}Žk:#eq) „ÀÚ’B®øíhn† *ô¢EÇwÉ:)]@¥Ã"( &G›i|©‰#?!×#u1Á©T±òtŠ*3Øšs…L™di®‹™»‚¡CðŒ‚öS +ãmšØå‹£PP¨³’¢‘ÛRK™o kd+ +i„ p®P)·+H9Y¡5IY¹2aâÌÑ*D˜™I­,½¢™Ð§`÷”dM‡ú¥B˜»Œ!Néæh8QÔ5p²}DP!û¬1Z~ªÈæ±tšÂ-“ íô4„&è³Ì_„( —Ä$ËXdµ+y+Bˆ$œü±5fÐPbRåŠ$…xç™]…)f„d£Á‚8 +â°˜ƒPqíÌÎHÖ0wƒn¢ 镃2ƒ&G-Ì}]„a`"­$#ú©Є9’²,‰Ï*å„Æ^V3O¬jÚä-lîyi(ÉàÅ€wêX„-É4IÜ]nÖ´:ºÛ(¤2ËBè 1`s˜÷H"9åø6\DL†+$"áüNÚ¡ wxœ¹C¦„¡¦É<+n™/õ 9*#/µðlbXå˜sã9Šûl¤SyØ*ʃ¥Læ–ŸÓi9’æÍ<lAÕFoŒ®Vj <G- 7æçžç ®V‰u¶ŽW+O¿#ïÏs Ô‚Œ“-f¢òЂv°¦ºØšas³²/Í„›Ab #¬ó€U'ó2f¬P&J¡ …±„J=¦Ìx˜:BôZ2»†’7%e8£¢ñ°þÊ ‰…KÌEéYyÖ”÷±'ðK=ÅÊÁì ‚”Òæ¢ä®GÄ‘,*Fõò˜œåN8îÔ“ÎU&)&e'¼PŠ{Z†ª^"]„k3ªrfÆ}:Åf€Æ*DXB—÷y˜Ë‘k®T(!xƒÐ•²4°ŸÈœ6–Ù§ ÈܨP’˜/3h~^a³ Zbª¸¸œ”“NgYEBØ”ÌR “Æ"…}Q¹Ql9MÈ|’$k]‘Niý)“É 13©ñ@¼ZÚfÔr,ÓÁ$X‡P¼Qs*žIÞ ¾´="c OÇÈlí¬Èp*;·ÃðU³¾šBO0ê™’ÕVTø¸(SÏØ +&—{ˆ¨w–5U(pbôª)Æn•¾×-ÝË]H{°"˜ÑD§ UÔ”4P2ï«Éb„„OÞïÔGPÔa-¾æ˜c½“p.ŒhÔF¹S,ý§€Â ¢38…íú¹ç­Öž–F´”[ÒËYͤü„?d…¦^ªÄ7«V1á9 !Ù¶#UÆ¿ª¸Ø$#º‘½¢0~'L2O¹‘g‚îB"yÇþ„Àn‹¯÷vPÖ¹!è”fœ¿6ã +Èft*´œ7d 4W¾Ï²Ñ­“t>[!oâ'cd…_Z}dzQdkÇ—ªSb­HÅØŠ@ñ_Múá­&—YbVR¾žs;[*»š1üŠ}‰=Í°BB(ùhûzÊíSÇ™2ëK›N´£S‰£yÙqAÄÀó³©còÌ!Å8XæRnÓbŽZj&aÄ^ä¤ÃdJì‰Q¹âg„‰­ r€yšiI…”È3ó±*IM©¦Mt¨væ>††ðT¼J#ƒé†”ê RU•O·u¥‡9ëÁŠ·ùCRI¹ºP … @)‘øž-Pk‘°Yz¬Š2U×õx¢Wªó2rb ò••ïŸ¢®Ü"ä\ŒûT†væ5`ÂZú¦Ùà¿vuN12ò:1ß 7Ä0±á´›SHP¶2‚3ª²µ6BÇè¯ÃÌ@[²Pc÷%DçžaN#tŠÁáa|'TJUÒ ñÆì0ô…ÞÈ‘x†œFèWì Ú;º·‹þBó¯2Á+QnÕüÔÊwßΔ˜Êg­<ÍçŽÈ”…ƒ‡ËfÅ̳Rž*šrè©ÒUÑ\%O‚T~H$ŒB,ˆŽž< ñ^?­8Nxqî¤b@|S6È"\èì-B ;Š“mÈ|Æ€hOg'#àe#yˆ¤‘x:kA•Xb–<²WZªï2?­p®.¼ÙÞˆêåAII3ÉAu›6šühÌŠ,d´Ì1·f1+!U°NÐf`¥7ƒÏYà.Äêã¹xÐ]fW”~EЋ3O÷¢5•r* =åkâ$t8 Óº‡f>ugÝ)“*dådEë6Qf®•y+ÂïÀ=êG–Îâ)Q‘+I¤Ü÷¸I2~ô@Ty¸C6 †r‹nSÌeKÒ«œ´º*3wO¢Ïˆ_E‡ó˜JdSL3ªîRÒq\’¡„›lvæBR’‡ÆÍËPIClz2ÅS/ ^ ÂÅs ·¤V’¨Î‹VÉÞhbVœHV"Nj隦] Yþ +f©­å·æàˆgÕ±}p¬ÞEàU©ƒ•£_y"›þ^ì Ì…BÇcJ•ý'`ˆ´(*¸‰Ü¯t"μ¤<É©ÂR¡î˜%±2ÀÒJ[/’ñŠÒœcn.¹±u@Àå÷LÍÐ:^Õ¹ÎRÀ)”A0y;A„r.E>%.%ˆÙ[¦Øþ½ú"‚™¸ƒÄ³4ÿ²k˜UáãÑ S”Øh~à‚Ù¤~ÌÓâ,à¬cˆ2Ñ,Å[f|eçf…NTž9ªU§¦Å$øÄ ÈªŠ¢ÆJYVÑ}v+¥PL<üR‡-DqwU(X»d³“¡‚IÑØÛÈ®—˜ˆî5ì'FnÓ+lq9¥[v°uL"e_J%WßÏæ1·Þ.*©Ö‰ ƒt&‹JÆ“æ”4¸ê¨²™¾ž³mã,7Úú]–º Bƒ¸é¤Áþ•õªb»0®* ÿReß™¹YŠ|Û´qe„sUZ ¸¶{ WtJÒLª(··Q†¦dôÄ;VFÔÒbT¸¬ú×,΃•$„¬ˆDtð‚Nrz‰o4+Ç¿OÄ\ÒÎ5'ëœWg… wf!/}„rÉ Ìï•Ý¹ÙÅü;ôìƒÜ^É=tO$}‚·py ¨ ³ižÏ©È dÂK…Y,ÔoiL[~¢©Óv&ž’&W1ÎÌWflŒžª¢£Í»Ðtø°\zN6|rA†:¢ãQÔ\’<ÌÐLž€“,NšGPæ{ò{Å ´pû¸¨yÊy>PÊïx'E›Á"ÿ?kg·+Íç+È=ìC' +ÿYu˜|ä$ñ‘0ÐL±5p&äîÃçYdíOÝ[ h4´›ìªê*¹¸Öû£_ÛQr(Ò.6JøŸM’@á8 +5õí$Åx|$Y¶ÌŒÖS¹†p;Q¯UrÁ:WcÑCÅ÷`VÝe æ +?1/ +860ïó­ÛcLÕrSؚ꾋2:@ü#8Œš};ìdQi$Ô‡vLúb}SÝÏ/…PC¶;% +6<°Ü¶­qØ8ãâì|;JÜ—\VæÑwYsœjp¿2è¾ýŽã[„®Ù¢…uvUš,€ç=ÄAKJ%)èP ñVvtæ勉kkHÜËÔ 8@\ô™Z¤+&0ƒ6f‰²|Vô³Vp„_cC®.tÊ Öükß 0£VÔ<\gÛ_¥2Î ÆSAÙ~×ÈzG@¥#rãÊø¼@ÀX6»ÓNI‡Ñй”H¦ou8ÿÖ#ÂÙ;ê #ˆ0ï½S›ÄZžï òQpêÈ HN–[ØÜòÙ4Æ¢º¦OçÉ«ƒ×ŒtöÝùµzAwõ8¾¶ãè½Þ=rå«GÞL Ì×YU£»O¸ÿ÷‰*ˆ—Üæ@µˆÃlxG)'Ò¯„Ê£ªe‡¡ ½Q£+9c·‰ŒõpâDÔéé±N|2É%f rïEêÓ¦þù€ù$»"k`j1¹#E +b—Y¤0}i Rò‡WˆÜ"ˆ4úç’D +á.y +$Fƒ:ä Ë6“Ÿ¹óU¸ `¹ßyë!ÚÓŒN™÷±yyïÕw}|g ú„Ô ¬ƒK*K÷c/Ú.~‘^;$©D/=~Ú)Úà‰÷Üq5ÿâ8}5ˆ s\‹1’ Ôühr’Ò7˜Ùýø­Ê•:|R‰v?ùrF‡nÜåP¼ðÑɆj”Jê5ØUF L;cž3µ$bßf^¡°È°ÊáEû«GÛ*m·Zü)/;Ä]¥è»-šRõè:° R‹…q7jnºY^]/EÕI‰éjcÔõz=Зb`n¦µ” ìœàÚòž!L0:”Upçf颩4é­WˆvÝŸ¦‹Ó[6¶V;î“®}í‡úÿÀŽ|ßún/ÒÇ«GÚÒªIøè(tûòyLlÇÍm=Î&ÔðõÛÔKÍ :§.kÜýE•§Féa½(Ï[/ %fMÑ“ÒÜg¤áÅa(^5 ªÛÎâ0.ûÑ B,µ;øÀ Q…7è£N 2¢þ +׺n¨g¾j¹‘ÉH‰E‡^{k‚BµÞøæÞ@}tXóÆû…®£Þáp,šœ‚2Œ%ØÓÀ0"%³nëÈa;ï’ =‘ûÛkÄ +C‰xÏ<Ó|5SÜ- M ¼u„}=[{áškÒÉ»&BV"å•õRßíSÁÏÔC=”$v£pkòÀ!2z üJã<<¢U~]OfŽ}ü¬ÂéxªÙ®ø:KN~Í« â´“øg4¨¾FUÈ=§í¾¢¥#ë/“õ +1.¡j…óÒ¡$ ‰¨m±VŽEyBqr¿ýžû 0úÃV¸ˆ|QÔQLŽKñºÁü[£X`:p’„ã:´ðKóc5ÆÃÓ_{nÒ·¥°¦Ê­j°³{ˆûïh?æ#»™‚´¿z¥r`èyÚéR›!™$.Ÿ¢¼ ¨@(á-XþÞú7ôhuë»”8ÆüôEMÛK=#òáà­ù.·›;’ÍUd©àQf{h|/µÛÐê† K£H•ÀþJ exœ «ä0ÀD¦VÅ {Ñ”emX®.qu@K®I½Wt¢Ïƒä ó-\7ÑC8j°ª‰»åkEB•6¤Y³ ƒ…ÁBƒ4†’dƒ„„"݈… `›YÁÊ}{j˜@¬^½£—3h ÌEµ&a›Ý}Å”¦ËˆïÄLôKŽÍ#þÓT¹J²WÛ×äE¯ZTÛ <ª²C?ÍÊExÉR²ÓŸdq¯œª"8Þý ¯ÛÔu–LÑôÕ& wÈB$„µÔÌ(…Yå$kò­G9ÁEøû<”&´2z݇,²@¯ê÷jnykEÜðœ`ƒ•7$€€°õý©Ó‡x¸Rµ’=_碂1  ƒ¡Óq­! l}Ù²õóXî„á¦ëA…+E å(ù–`*˜ø¾QÞY«žØåðÉ/¯ø›L÷Óà5¾ÚãœF”“IrÃWžƒw8'3 +7e4 H£Çˆd˜Âäh¼6jÂ,4Yt]ÐÏ,t­¸Û¥ ê ,œ²“ó+@n[¢l°{ +Éó]lÌàìԮ褨 õáðŽéYuU‘ñAÕKáˆ×Ð7ŠñD=îh_tJ[œ_<ž_ÙšÕi-i3d÷ sÃØÚØÍxˆA¶ë o=ΰ "o]±ÿW½(ÝMi›Êi±ì»À^\z¾B¹”Û×»}+‚õ þ"7¦gõšlÔªUò1 ™<㤲ýwhWœÎËbàš,B·‰ÊlñÞ½r¡´nv¨¬8@ töYï[’8y…9(<*¨í!²žÌL ó¾˜~ùSêŽ~Pì<’'âfB;0S»Y!^¶úšzM9Ì'(w´ÃÑÕª›×tÔ÷ñTZxx@ ù…¼q\ôñt…꣌‹J͸ºé/ùÞ£ÿ°M;t`ÙgzëEQ˜§‹K²|ðê[(S(^q°øM Ofp±o·RèuöÞ#nòñM]–:î/“¢À…ø”{Lâ ª’D/äËkFDdè×NÌ€DP’é5ì®Âc½!#PUœž²@)ìÈBq'#î4Þ{œ—­N^ÒŠæíûq°/–3—Äb è øÙòe¶GB"ØɺmÛ ={]1«(Oå BGÖ‚5è6vEAQî@9â"V`à!N@ÖPhþ[¸y9Ð$7€¼çh|Ìh'–j)b©¬Bú®Í7e•³É/=uJÍØ ðcâïIùÜi((Ë`ÊU£G8¨,šÁj¡{¥¨vú<®î/7aæÇ1–çì¥Äqš×O¸ºX‘\‘¿[ss‹ïm2 €óÔÄ«<”å´J>ˆNµ3´7ôZGžK ‘{ÇÆpYÔ˜/¾k­B-qw(»ÃÎðÔ+üøàTVDÐßzÉ6f,hBe¥1ÕY»Aô¿êêñHÛ=!í{'ô• ².€Jv6UeâgE0×ü3ÂI.˜(m%X‹@}TºJLé4j±Â +ý2Z!<Ï Q+ò/=h²U»Žvz¬èõzŽB‰7jØ«šÞkȤìET:‡Ãþ6[«’®áñ@J<¾5‡ÌrÐãPú«ì! +œÅé“op}:Ô.Y¿WÄü¨9*á]ÛtòšÎ™ð¾èq‰XZÏŒ*è!’¾öRW¬‡®Øu cÌHC]!×ú5‹ãúRá^* R—LÕÝkjÈÓ¢V?C÷ XrŒÑ+¶Ò!ìQ€˜ngæN¦"E67ï O–_«Ýª‘U¡ç,›ÕP캮²¼‘G]}Aª­Æµaý`!ç¥ÇO§´¥ÛToZI¿‡â_ìÖ‹œc‡ŠVkÀ Û{‡/×Æ×Nša27ã»}‘/P3¯¾²í†ö:®H2N¢F {8俘î÷*07Þ{À&“WÉÜôàRçO¦WÓ•Uë FPˆ¯¢ÖX°~^Ö²b ˆÿ.–­ö!—sÖðq¯E +ç–´'º ùJ¼ÔQ{º/L°*j#ðΙ‘»Ï¶e}qhL*¯°+\ y ý‘6 ,ôV \‰o´C$¬ñ™Ôª{n®ð¡ìQB.‰ŽŒ @áã¡øˆÒh˜§ÎE¥á°*fýÔw¡<Ñ¿±«¼vD¹¢<ÞÔ΢â0Š¶±Ç·šDÓ¡Ñ ]!0à$4LÏrD:lÂmoZ4÷¨òJúâ`9„ Æ wcuO<=韉¤g*xî–öuÖ«04ÑÃ>µÐò™¤o­Fu±!@Éý*p'—óö- a ±=©;Ó»®>\&U§3h²?£r11­;G2{—à[ÆW¨gêÏ™5ÞG°2ìS~ïH®'·ÿÒxÝí$yn‰öÒ IL¶l&=tÖöïc5ˆ*•êbšŸyNkK@PlBÿ}&BU†‡è.ð@䄽'gcx#Î1ý,û®n9|âG¿ŒzuŠ†Ë•®O}É +ËËñ’¦ÑH6*Šû©ò•7—¥#ñàÑÎk™€<íëÅ™^SÇsòûh“7/ÃôèarÞ‚*iV0šŠ5¼~>ã§Ä¡ÊhX<ÔÉØêV“ˆÕ×8Øýƒ©`Ëåêë¯ 2ƒê4DtBUä„/<ˆžoå+Œ©6Ê‹±NÀ‘ äE`ÁÊdÂC8 ,écÙeîúsLøvjŽBn<KR/҇Оœ;È+[2zEü´­^é"# ¯/iEPXCh•IH½sx ̱õaÁ3E˜ZÔˆþüVÛ¢k׆ˆx Ó¿6´ÍJŠÃ½6Ö”™|»‚î‰(îtoÒ§zØ ^†0úò=œÇº—>¯hÉrä„ZQ*04ýü|J«lnÉå?ü©Š¡‘Q榱:åd I½Q¡O¤Ä_ŸÐ7ä†D«œ7Ë6êþí*Ò½7`åtl/Þ¯`íPº^q4ݹϪ/‚êÙ ¤9êÓ‡+±¶ë”º{û[iSOúZ[…+‚¶¨zt¨R§H÷ØÁF£qëjÊÝ4®ß< +¾ùÃB ö”xÙC®I°|uóÖ€äç1Ô{mÌ0nEÌô ÜfþXØ¡þ™å.OÄE`xzÂF!L k=Z·¾YB—î*¤²‚= ìˆÈoà ~k\ïeÈÑ‚Ù1%¶>`(Y<ÕˆIÙg¿‰´¶u-°— ÞÀ ™tª 5ìV¦l(1s#”Z%y×Õª•ZûSµuF9fEïñÚ õjö^TgFYùq$‘-¸fTˆ½”š2xy2Új!ç-irSc_³+°Š[îœZÄÖVnŒ§áÀ ¢‹(Ôzh§U={‘ÓXÁåó·R?Ô›t”#Ì|ù½$P@ì!²Ž@a(6wߌÐÜÑ{n½.ëΨ©Œ±sV¸S c‡¦!ó ;ôo –+$°Âð½NöL*ëö–´µÝØÑvE þò{‚mäþ*¯ð_y°„Ùcÿž*èüqýÇøø›ûñ?ÿǯŸ,üûÿøóÏÿûãoþÃßþ·?üå/úçúñoÿÏÿåÿðO?~ûùÏÿïÇŸÿ×ÿéÿð—ÿüÏ?ÿß?ÇI¿þÆÿÓŸÿô‡¿üé?®Süââîç +~ƒþø_ù7œŒµ:›èX°h¬q&|÷šüäŽM,”Ø[’r+®‚vÈš~X«ÏŠ+€§ “¶î @žó—Ò±“P¾U‰ÓëKÎåZRB<µÂ€ r€Ú E£¤5NDëN# &½* DLêm›òZÞ€ƒl]àÂFô‹¸ÌZF¡=¦†ÅŠ¹Äiv…ÓÔjšp¶Eh7ÀNÈJ^¦.³Pª™«Öf&8Õ߇º¶*öh·=V˜BoyvôHäæâ¤G×1ZÞIÒ{K¦aaý¬°UîÎI| È`ô S%!II4_+sň­y $)â½…"@…HÊÁ +ê V€¨,X²Ý¬ìÕ”Ýz¾(ð"p°¯Ô¯Ðb³êúºóê…Ô'4x>”’kÞæÕ­~ÍÚ¡»b˜®BV@ÿ>Š€NJÅÀ¹r€Ca¡½}`ËöD_3¨¨¹]b£: +`1ŒÙJ <ý0,«Ï0ì²J×ìŽ)o°ü0ågÒm'lè„X úNx!Ò‰‚æw‰Ò3äM>3ŽŽ¾ +VzÊùj4®Þß-Cå9¼ó-B$ŠRõk[ÉÜèÀíãÆlÐÒ¶Ÿ8¥\kÜŒ].éÕ!…rñÐ>|8k>¼5¶,r+]Ò­oÃcÄæxŽˆšizŸ¼ˆü„—]=ŸsÔl_Rz¾sm)‡.â( äÙ²åþe~?Wàó>ü[§ùƒâ¶ v‡prU%_TD:É^«óCIx*s^<ÁŠ†Ä£¾}ëŽ5ýèYt^Äåæ OC&Üîkâê²ù(ºÇaë®kæ²>Ž^¢É¯øzXe®;~…>eÌ3@½‚  } Ghƒ83 )»çÓk/ »ƒ²=ŠdÌywÙèÕ¬ˆ¹nLhb¹×%l2±9¸IÈ5íá™ Ë:0NѼõoÇQÓœ9 æhTïuƒ%“¤wàk¯†ñ['Ð_ÙÚ°‹;*€î ꚶ‹X]ÙQy6„ßTtJ/}ó-©œÕN |Ë@é3ðÛ^·+-57|”‹ø¿z6¼ÜfÂhT0•Ï‹®O@gÔvÕ žoÀƒöÌÎò ‘=ÞÑWÒ–(ê©8J@ƒZ½†eØ+íÒ~káM0¬©‡j1”ñD+Jñy3ððDËV¶ M±”i%OrNJaÁË-álÄš®­9¯’Ž³w˜¦‚ ©u¾÷p +Íá~û%ù¶_ªŠnËN)ÌÉ +ä ¾oA Ø ê®xõ0¿Ä __ÂúEzh0Šm¾—s>CΛ²;/> È}ЖÅ4¬EwÅed‘8ÈA¯èNÜùš»›Õh6`‹Â/}­Ó¤¡®^Ùiˆ B O…ÜšÊç·˜óñ¦JηäÐ3Xãg½dœkS²¾!cOØß¾Çk­Å„´a• °õ¾cò\‹\‹1ÆMH¼lx,Ÿ)\‡2Ç +{> \rtŽ-Àzñ¨(9âó5#ðy&×T1§Ý¸¾‚ärÄüØèQ+*à}5S.k#ÁœNgÃÓÌ6®Ÿ®ù¦B§pY0”GZГéá蹺‡V¥ÒC.½†ÉÄ[ÊSÙ•™÷F‘œëLˆeÔÃ×v³éRDi0Ö„"Žj~âêÂC‰u©`Äý|«¶˜~›¢NþöyrgÇúeS‹7 7x ŠÞ¡ÚÉò£íø,y5ôl•µ'w Ά{| ¦D¥VÅFrÂüú›; _ôÙè6Þ!uÎ.4b¾Ññ¦M’94T¡é+–E,W–ìZ”ZöÓ_ÁÕi~¤ƒ¢ÎRÚh\ þ”¢øÞÐCs!FÙKã`>ªñ›Ð—ಠŒéqEý‚·6kÚÈh†x-kн*‹s¿?¿ÌÃl¦*˜åÐc}kP¥bÓªÞ%2öu8}Œ×âWWè•CN¦¬õ`9ÂùÈÖ`eòmDÔim‘ìT®€B ¯tjj•Ï“!Èý¨:/è½Ã óhbrÖT [?+Õ‰5ü@è^›o@Ïê5‘(wØ‘Áêñvxw”œitóZÐÍ‘ïgÒ.ÄL$-ÙI‹ÀbÃÇä‘Rp7po +µÄUÇ Ä.¯Fïåö“æcTýøXw +x]iÐK €ýv£BJX˼£ªÌz¤WôEà…H F ‚BmÈj”“X)¾UL÷ †Sð$Ñ¿:”ûXÔ_,\$®•§Åbòå:v¢Gˆ_àª`†µÊ*ë»÷í󜷉Kf¿xQXT€ +*J¨C"„M‘ÂÚf1ž þ{¹>Õ™i ÷¢@báè¬L™úJÛNq®µ Ó •›šªñ`‚»HЕwÕØF2(b{ÝRÈç ‡.‚Q¦¤ êÏ’Ç\ +]G6°Ö¥»‰óªN7ÆS" 2ŠpcŠcGÇœû eªúÍÔÛÍQŠè5,GΊ`Ú\¿æ^¶ìZoêw¶OHƧR£Ñ‚GäéS3O¯©èõ5ØsЀ[ ˜™Ò>¾OÛ2¸t·T­³^ßG”{*‡•>Ÿ]p !ê ‡^Ä6×ÐåBñrÐz}†‚÷[°‡QøÒÀ”&õ†K曩E@˜šÍ«ÇóÊFÜ'd楇'0ò£Œ«¯sýâ8Hï"e™•è¢ sżl%k ÐÖ ]k¨ƒ>1l§^ +ú +3E@ ÀèÑUnšÁnAi%+}]0*ž,_ÀÚĬK§~Ñ#j><ó¬Zx¬¿æ¸Ï±c}©ú¶¶ +o FwFÃ/ÕZÀW Ý]ÓÖÊÍcwí'|oÛñ ¼+2(§!¢ÿ-MšQ:„Ðq¾ðÚÚÖŠ»ä€X¾5ôÞ{q¸×Æ+P5•ô~ƒ„…“lR6)_Ÿ†óð‡›7¶x#~«‡Ú-ÞQòt;5_¶§= .mit¾¶ÅV¾=¼ªl;1_`ÏL©ÜÞ¾Õý< âúö1%mE”×a[Š ^vßs©ª÷¥XQàd +fl i`dUɺ h%<Ïñåã'æÄ©¢(s ¨n\šŠÁ Ã9+c +@6ÕéÐWcÄ«A.ø4Ä­ <Ûgç¦V¬.5ÀÒ‘0 ÏþÞ€Oß¡ ¿5nlIUe—són^N=±N1(õ¬¥o"= ñ»’ÁLÒß}ëŽDeòÞxz¾5 L Ÿ[öÒˆú°˜ªTûݼ^ŠµgK&ŸÑß_·< gÈÆM¸8?߆ÁÃÌ¢„·ÁZAÞ?%‚,ÇÒðµQan†àts4û5…ó +FæV+~ +9 ñK¯  '6>îÛö·ÆÐñæƪ…æ‚ÛçG8Þퟷ‘Xé¬JE °Ny NÒÚÒ ¸ b1ah·o¨ZŸ¬ëkLq~ÁÇN•Ú5,‘Õ¸Â?fÎ=áž™0Õ‘¹_hˆýµß VYß@H¢~úÔR"o„F”Añ¥€XêSÝóHxÌ€}ל.Ñ3$–س8 ±@eù,w¨}~ “—Iås£ÞÈ ?t©×ƉŽQÄ&ÂN 9Ú¸·V…¸CƒöŠc}¦ü@øhèa쇜‘‚oS†$7µ÷ªÌM, ïº©%ņ×c mÇÁaêÃÝ5 $ +‘kç>!™bk?¬Å¦B¹úËÛ~‡ @Þ: L‚l¬¯Àü7ä0Âüiœ¿hl:“D0±VZb—OŒ‹–Ú$öW”†ÊÈgË3,FG01ôï¿6Ó mÔw|¸«áâÚ‹ì’3%Qè²/€Ÿ ¼1"ƒ;,&iDZ˜Rxå>®~¨8¹‚µ€Àtº¾KK˜¢¨H>Š°íùÞ‚L‘ÀtÀ<³ï÷Öð‹i÷µéíÀ¡ßPò\K\K¤vu4ª9Ì-°v€ï©GÝÛ©šæÉPAuË ‹Ã»:mÝŠIŒ 2]&ÀJl¶qŒ »ä8¾Ø IWlÂÇIBÛÒÀºª‚s‡Š­~þW7ˆ5¦Þßú4­ hx¶®—é"ª)ÂGv¡‚[0’NÛT$‰­k‰)Ô¶{·‘z·Áÿ¤: í4´Ýp‡¢è}JÑx®RC$‰Ü.Õ8×ò\ý–7{5”úÍ/l€pZ » ™);·^†üºx¹Ó(ǃ†aŠ½Úž8Uóqåè–r©îõÞc °é\ƒ²#BÇhq§E5ÕÎãÁ9J݉Ѧ´Œà¦ñ}B 03Ÿ™ ¨­2–µxòU± %óÄ› + Ðß'Ÿ··4Xqê¬ ³zÆÑœwhÀ|5ôhTDÈcAHÂhPÞP2 +¢bkBO›ØJ2-›ÅpkÉzš,Ã`ˆ›$ +9Û©SÖûg8Ü\`EŽŒ .Àíp!|Cßî0ÍÈܼ4‚}G%疦њ/.ä©X£ÑI ‰ª˜ÉŠŠís:ªî™t÷àkgPÆŒ -xµAËg‚~Žâ;2CÈzÕõrYfd™eóÈt &pýî˜Zk&]Xƒ«(¾zÒÎQB +i’¥¯ W¨”r»uzI…5«Õ=f4%ží¡ 1dë¢qéè=ExtJïç<Ðëè6^Löë#nü÷¾§9Žëøᬬõڵƣ޹/½‰—¿fâ+ªy›Æ¸B+F³Kµ¼1^±nHž]½°Ùpg/H£4£N·w؈9ä3ö‰8sìÆê·«¦Õ`&Ž>ïµÚ±Ñ>€Z®eC˜?â¸òèHåt{Uª$ºÏ„†B œ o¤Æ™€{s&DÈC&~{kô®ë=6G2§àHŽÏ'm²î§ö>%$ +ŒEw˜7R몟 üRÅ)h”#b}奯—»ÛQzC…m]rLp3 +U|^×ýw¤»B”ç|Æòa(Ÿr‹Â)ZoµLyr/…Ñ÷šðwý"Ä5?È d¾-Í biÂB’»\ä +™H RòÍ|éa(ûp¯qC%è‹ã\[)…ÇYuÓÌÛá•4¨o=$Õín·i¾è•ÃÏúÙe}h‹„8ŠÞRͤ`t[s>â ©žIQ¾í\“½*¬Ê5#5¡\ó˜„ô°`ŠÔ—8z€@v ñcz¨V"’¶C¸•Y½NäZ^´ö™q9äÉÉ°äÙãr3}I©¡†2ð¥ð6³Ɇ¢@xXÝì—¤ö9lÌ!©t.7dÜ(Š¸÷ ¡©¡^®¶³´—6ŠOC<€—øäù«'Uôº&(V §ùíóx¬m?Öç5{é”w°…¹`uGÆ5Í}M(5” +LÆùTäJ¢Ü.ªPTv_{ü´Kþf?U|þ¢“å_ Yõ”𓧥³ïmYÕ&RA|ü](Ê’¦»7\˜Jï´˜Mn¼DV¬÷÷†Úª[hël ßzQQ!LÍ‘.,x«) +ØB~þ +'PÈ ZãRSB}eÜé©£ Uáø]ë—ò]ôR•SÑô0HAâxSuQ¶fÊëV™íÈI‰…ô*$ñÒç™\½0´Ró¡‚8U‘GËŒò dØþ=Ün…1A(PiêŠXßœÍre e§*øŒ¬è»JašoÅ@É= µ;8 í‹Ä$C„Öš^Ò)S¿ö–@钮ݎ¦jÎW(á€Ãb¶]ïAè`Ý»(¾öøiG0ÊV#íòÅq†‰c W`BeFb +¥ï=ÒA-¾·)”S¶P©5qì-¸é +ÜPµ5¿… LÁ¥‚``~íñLàl!U•¡^ÓÜ_aúê!Œ˜°xG®T|1y¤i銺ow‹Û}ÜÎèÕàt0l²òFm»~c$H•œ¤²X"rØJg{Ç{ˆ„®q>ç¾bзØBJìEÚ‘B¢‡>°²îXšF–cquîMœé‚dÇqjø,¢ß_´î$èDÇj#fwÜå±^;ä}WîÜúÖ{ë¤ÀWo +|‰ëšc‡æ 5®í¡§6bsÓŠ¦%³9^­Ô·±ØJBÏ&D^ŽÒƒM´öüÞ!NpPû¤€€|—áæaƒ%p9»Yr À Xøpt+rT/ù^6{âÓêŒç µ›z ‹°owÿUDõqËû'ý`´ì¯¦ÍÜe Læ|KÅefëß¹³cVpËQ Ά‰Û}¿÷ˆbùܘÞ{çÊ×ã ÐA$t2³}>§ D î‹÷†³­P¬µS–í¼WýÜõ2Ï´Áˆ wdB@ÛU¤!©¨Ëß±]fw=òƒ’¨òùÁîm ‡zs˜~}šÕW]8oDQé‰roôˆM5È”?ËHd”Ês"N ó:çÆׄRåRˆ @à+¶z„*qRÙ%žh2žÎ]㪫±õ¥Ày0 ¡˜¯=^×æÈ’¾öÂ,P¡]e±#>l†¹Æ*¥Á3E™-pú“t¦GÌbG””ÉK’ÌUÖ¿2Q>ä§@ÝÌkrEo€$­„`v’3Ý–¢ÁkN†ê¶™ah”ûÔŒ "ñO +%e‘´®è)ÎÃÝ![¿Æ0^\¦$æïw‘NÙgòB5móc° +ƒÔo¡Î²^“Š—9Š¼&k¶ ôò¹àÝ×#¥?#ÃØ~Ñ)¼þ]umWCÙ!üîJG'ò½knGpí¥q†Î‡BƒúÅ°âKò´ÈzÍ`9¬Å´î[ÅåÛF¯È¾A×8÷¨aÃ^0[i•T©Â@eæEûU¼ËÄÈ0|çÙI|ûžáV·²/±`eÈÙ›wÍow©ŸNzŒcy¢K¥’ÃÔ2ž¦`4/W•V Œ†ÂYâZ•¢w>nÚq +t5¬ ¶à9&àÝB> "Ú„–Âp,!¢Zåm3ÝÖÖ]å¤YÄ íªŸ%â´e­œ¡†Ó‹V[_NŠ³Ñ¬¬ kyWãè!K2¤ü§FBÃDb çXzµ6w¯ 2n‹ËÄ…PÚ½(Ô®©Ù­²®¬\¾xëµkØÏ›ÊRÍ›Š¦­<Œ[Ñí5Í«ŠõT{«œZuª&÷t—;#ãåºXëaIÄÄ•ií#(Ȼٴ”N$x®'®—êáÔ™8›Xç€t©~1n]§îû"oYMì.Xò0†õDF2Õ'üyrˆ´S¿òFU¥üÊ0tLE0Eå•m3%8bx’K]úïÝlKMÌ2n.ñm~]­Ê¢ … ”eh{‘p'¨ñ ë®ë¸é„cöJ»1+ktÍøºéŸ„¦/Ù{Lµ)™ H<(8ÂC­»Í0¬'D HQÍ ‰–Íì"üŸŽ:³¤éio¦`2ˆÉâA UÜ[ !Å`e¤œjy+)ýÉò¸÷ZëD Õ^k3ë"±@û(Û°³œeý){0køt0º%e”ãÜÖ„ øCä­)K4æŠ;i/¹FM¹,+ÜÓê|í N9ã¢=ÔÈ´ŽŠŽÄш@W_ x"Oʼ +?óöz‰ë¼â ( Œ ¶‡ðé°é]ûB䌧ƒË,P $Ô=‚Û†LËa½çX× ¡¦+zMRïøµ[çÆæLrUfZÅIzt4[ UPµ’Ê©q&uH©+<õg¤¨f¯×AÛmåS`°ÛÏq&ê»ôhÒw5ëD&ïš»û`ŽÁ¨%¡˜’låxVÅcq½U 2·&fò“\!W(Þ~ä1ÆþE؃k¸F,ÿÌeóez¬É…ªàSº‚4IòÛÜìw¢+Æ/¢õ¨ÍÝÚ–s̯¬±ÕÉL6@¤¸+Úw·‚ËÞ8´<º¡©nqïkmNIÁ7L]ûx¶¢œ‰ÇÆ™Èj}À¿Uö60¨Ý‘7@Ñ!»¸‚ËLÁnLéãç0ïH ¦B‚[¥“2XJ],gäzÍ“€ `F_QŠð\ÔÉP‡ä5)îVï°+ÿ¶‘r¤tAÊ™) qZ–Çyƒ§²Ö9µ~9¹¿$GukÍt’š•Äv{™Õf(¢B ¨™ ë8ÎZ9úFjLYÃE)lÄiük¤×ƒ°n²¦Ð&§"Å<ÎÅŒ8Là.M í`6]ê+7lQÂ6šÓã¿´ßMÚ˜Z.Æ)w£Æ{³®©ãRÄ•pNr6¬¿€ÍÆqÝ»¤uZÜ8˜ ×È¡à´AE¡Ñ}Ce Ml*•³jÒ+¨ÁJVeÝ|O9иfÓ`¤EL“¤ƒ °••TpÛë ü+&®D>JóŽ¼SK$gvläZjôDHÁq`dv +ž=¶ÿb˜vâ¾ßèzSñÄÐ \z-³†­Ã?îðc/ ˆð'»8‡ú¶'’o Ù+ðgÀGPã…jÀFÞ>邺æ’n_ÞD»?7‘"§ZÔ÷“Q +å¦ñŠoM¼Æ.ÖÙ`°r±ñ‚² +Ì-o†Tt>¬0º3h¹„V XÌÆI +¼5É|Pˆ ˜°ÐD¯[¥Õâ5­ /惯;ˆ•(V‘[/:½C!& ÞâZžÖ¨~àúÏÍl¼ÉÝFðóU¹”õOV‰Sü?YÀhÀþ"ëîy>ÑÞl²§§èŽ1•™nÏ}£RFÞ—ÈÀ£Êæð„® Ÿå˜-‰¢úBBp®‰L®±‡Ï5¢½5 Ž@OþÊÀúö;Žar0àRo^«L>–¤º¹“ܽÒ%SSÌ@g Âí…I@är”ËY÷³1™p45 È#Ù#Šdóœ%ÔêY¸—7Röš”]Fí…„½2ƒßØÍCènª„&"^ +•×†7¯ÂÒ=\tð‹žOÒèÞ fø 4‹7”]X}ØxPÃG]P_#èrtQºÂ,epW‚ôB¶¸–]ß@žnи?4V8£Ð\‹mýZàædª"‚`Õå4Äik'[U¥‡áÝZàŽd x «×ð*èEJ Ì8(\Yp`ÔVþep«LªAÙà –r¥[gúÆE?'b‡C'6ÝôªV™qŨq½é(µçPjÇR†Xw p”=nÍ0‘Ûz8^Ð`Þem‡îÏ¡'ôü®·®‘·6`kQ¾Cu=ôífDò+$×Çõ”ix•Mìµ¾1²NHuƒÈ̲j}À·¹ËBÁA¢e¢¢@<@ìG{ƒ—’»³¢À„¨,yºmô%ÚÃCˆÙ¬ƒ‘nÏ‚xp¼Ä¬ MÀIE†ôW |A¨õ-ê*àì?¸Z·ÿ Hµu½³HÞ¹ÉË*¬wòäêa¬\”Ø1­•B•ÕŠð*·Æl`ÕLo÷ ŠY=³×,UQ/²!øÎOð¾Õ¹dqŒ^]³€ É_¿.La…™©í½(·Œ¨†²í% X‰1h€óü>‰*¬˜9vŽj¡¶KdR ˆ¼‘ÀÚWŸÚ>)OŠ“¶ý«H¬®_Õóae¡$¡ÁiŽ:_¿“‡ÄP°äƒZŠ©†«Z4°ªÆõPU‡®ø¤55àîòT“a9R Æé1T$Qi`ß'òCÀÞ@J² +JeS[¡¦E}\=¾;®Ì—õƒÃ‚zˆŠê‰ =F¨”î5B/Œ(ŒšéÈ +( ú±ÆSËèÞÈŠaZS:uJdNƒØC_[MI Õ6¹‡\se/`5bç€aT6§â9;£äê4¯®Ó.‚o¿õ†EŽ"dH¶œÁDÛÊpH3Q2DTûPñý6öb».aª®Çn¯OìèÅ@¯•¾ÁÙˆj[ÃÆ•ë½6æ’!Јê,“:e +ÖxFÜ\JDFƒÿ—ëÁné’G&d­B÷åf{#ÉÆÞr­ÂtÐaëE_sD ÊeWsýjaÊs"ü°~=óàØ׊ЇHö¢½ b++ò8!ÙnLi(w†j!åþ¼ÁužE.vh1îâH9¾UB ûeuÛHo6—øÞ-«Gž;¾äÆÄ»H0j\Br-ŠT/É×5’Mk#~éúœ¯ø=¿Ñüž{¶À¢ëŽa‰®:)iæõËÖ;ÀƳ¼C"T“­œ¡¶7x©_˜Ü{²p ïAôaë§ø¶ØÃûG™[ ¤G©zõxÒ-¸4 °2(b*ØÙ>åiD*žÆ¦ämû¼\<Ô±!ä<Í|@‰Ò4 Äáf»kQ¹j±„%á«Kb²qu[J…¹¬Êž@ ÙBvmx)ËŽ‘ù8NBk l´Îû¢„¯ù"bÀ…+‡Ú@>vIXúQ—Uæ¨5Àµ˜z¡oTüŽÜÞFæòsl ý<°ºÌ6ņ#LJ£åäp{D#),Ä\´âçmèmqS"6<@ˆºj)‚£Î ‘Í +ª“'»[Š:0R‰€“&Q~,,ÙrTÇ%²‹ + Â2ÂS­âkf5Jñí“SX2ÈÖ[Þ²òâ ´Ï^sQaÇPþÚ 50„s惭F”ž›ò,‚’.=6ÐÅ Ýd/˜èÐæG¢‚„iÃ…¤ž7ÅzŽèeã*…{ò†9`Á½ ÄD~€k/™ˆ$GÖ=aÿ*3Îá·’yí’ÂTýd+ `{ ï}ÅW,ö1d ˜P·¢ÖEòé +ü…”¶:Ѫ«ÀXYwölÖ¶‚0šõ:“1…G }Ö“%j?‚i€>²F»”*‰—áv´‡N¹Ï©¾ò%y ³bÍÑ©siÀØ÷ãÎ È„„, ¶Ë¤¶îvDŠ‡DME¬žF~Òmè<‡ØA‰•£Dƒ"âNÙüB>^QeÛµÙ8}þ1çy4ûB"÷šb|£•g(ª?*W¤ƒ+I¾ÈÜ.¼âw.à2Tïuìߤ2 Ëíza§‰þ¼ýÈ€Oå†ÝÁAå4U1ɉéÊÌ!ÊÌ¥šå¦~†+1\„c´ÁÂS™6×|_ñÂãìÐ@¦ã +9Kå%ÂE7û&›&EN¨‘§!6þ»àÜ·Ö§ÒIe˜$¨ä#9OªblH5Š +¾éÂñ•yÜ,KÜIà«Î%èAËfslA¦ª£h#-#µÞ1©×C2•†³Ž u˜e†/ÅE‹P"Ö4p¹ñ +x÷ÞkåLóŽ9Ò‡¢o‘í]ï]’­v›Í&‘C½pÍÛL€lk6A’´Q€ñIc +ÿઠyÙÈ8…"Šò%~7©o§B?c›ÑDóØØ:9‹²·Y4æDX¾!ÝA²¢Ø 7÷.]úlft‡hŒ·ÐÍþj¸Šr2Ýøü"¾A’{†ôt9y4„0AÔòxÝjiø˜žtÝÉ*EF?¬Ÿ[PŒvSIÂÙ3¢@^–õfÉ©É +a˜òÐGÕrnÝAź¨©ˆv`+Î×ëUeŸJnh˜¢PÈp“@_¯|ñºs#š@JæÅHh`Q”IZÌ ¢EæòH‰€’>± %>R“}K…„(p²µÉÃ`M‘½ðÀ#†½ƒª·^|Ó¯Eä?Ãäj¾9¸¿ä“% ®¸±¿'k¡‹óºº8oÔÕFK‘ÃxK«nLø±Ãmßž@%‡õùÞºÈáù“£Â¾†qAb†âÐÕâÔ˜e@$udf® ‚˜Ä©ë€ÉÞŒ鹤p³nÍWp¦DÛܼ Y=ŸCíÊĈ[ÿàw‰!À´å:»S:P9kKDÖЋ‚Ž“JXŽœHÐag“$S™¥%±A‚0¥>ݳx¨Š¸8ÝßÌBÌϱùñ±ÅsC¾±Âü ϳcÇ@>Ü"¤¹A´¼â/{iáJ¯º3v‡y:xñƒc÷ôM‚áÚ=Øk€Ô>OÄâÌ+¥ ½.íæÊPT§Ì°HZ³êüÑ¡ìÞmÝâ5¤ÇˆkåóçD†Øvjr€9ðóY½@ u駞Â*ivð©­U©ÜkÛÜ“N’AÇð¨–!é ÂjÒQM)o€Ç=“zNñ"®G6‰p8Q ‚o„z¢:iY ¼A@ÍM¼æš32ž°ÓõÞüP‚¦/¶Ÿ”æ©Äò´b +6E¢7|ÖVØÚ”Á»b_Ç ù&eñ, 4†TݺàJZ>ɵ¡˜!VqéŒbSõi§Nj‡óWŽ\ØBê¤='ŠåƒMÀuÌÇ&NæбPžVلٻ.9Ôt"XôßÜK²çSLᮼoÿÇ5  8ƒLÈw„oeJ­Ü;Ä¢}Ìí°3 šT#Z,!q)تhI‚Îk +oâ8Ó‘+us뵸â5Pú,î +9Å`§ë¼àaV ©ùâŠÃœ‘ÊMñ×5S…ÃòÔÉè°‘–l%HA-1DRfo5U¤‡8i¢ V™ð[ÏÄÔ>õˆ uÖnL'g·âd]0ÝdžÐXÂ] žûªùB-zs¸$©ÇKo]>ª ‚DÊÄéŒèŽüŠ2yÛ¨•ÛLûÃì‘OaIæG«)·`,A„ëWü*ª"ª+"úÆÝÍ8]P0BÊ÷–”±N÷,‹9üB°<ãa‘r34㊒nÚ·*z§40³Øàä ¬i>G ¸rÕA4:T¯NŤ@lÔÇ*«stú4…ö`[›Ï Fƶɸ5wŽ’4IÛ$ÀˆvÙ í.ÈŒnÌë…½ööî ¤‘ºsRÂÕ|¤’‘(ðd/õ{?À«œ˜d:5dê$¨s¥Á­º ê+#–º9•/aÌRò6 Ú$[%1.)–@¤Ý•@w ð-!ø>(¦¨Í´åeˆ‰P%&ÂøSXµyÈDÉrÄqÜÎQZS2c,b5öVwÌŠD"ø;M!Ê¥â G€¾&Xv(nt”øh85ÌPÉîóCFSC7ß ¯W +S¯£H™¢ŠÏÐB°œ^ÍrF^wˆl†Öú}-:Tô.èp_ûŽQUe×]«ÒÅ≷Fú;«`…†ö¤ ­è¥á€=X9AÆÊ{Áöth¿"8EF,U”R ¥e–Á+ÈôÅ5Lªôæ% ØN#iÍN˜rß=Š0uÊB&Ô*ˆhK ¹zSè1OÊ.j0^[˜œ§Ð¸ÑõÖ4畾ùmèšvˬ/Ž7Ï™„h%&Û;œs†QLG%ë£Z¦Ç 8x›€¥¿‚Xc»@Îl zÚ °æ·=”œ¼¢MTË$AÊ lkY zoøœ”öf+x«‡YFysÓT)* ðé+ iÅ÷—åmå¨!ƒM¡FéV +C1y\ìk$Š×¬#Æd‰’æ?a&é‡u‡¯v`­)ô xÁÙ Ä ‡PÝæ#uÅLÈá·Ì×&F=ˆ+¤ÚâÅBž‰PD-`ŽKlÙLcK„׳¥[áÀ-:ïßµ5W ‚ïY©L%|tO °WÊN©ççð&•XÝ)aD´–™N±?Cƒ:I›=óÈzruŸi_šöÑC>ÒôßIH iS½ôÚºž$ìKKã:k–ƒkY”ÄG=G +XT~DâzX|tÜK¦H‡!ïD ©VnkeÐͦgHâ‹·q´#×gÀÉ;³þ±l//̳8׬ÀÅISµù€‚Öô¶»À¾}âËg9Ð&ḉßçŠ&~,àÖ³lŒMhN8Þ“¢€Ó•ÃÔËš@!3è/ü8S,íy먢ÿ,¼¥¨Ç²9¾œàñ1Y?)ôL鸪?šb‰K•@”CS÷‰ðQW':&µ¼Í:ÖÿPQœÛ‚µúâW}Yi‰Î&^µ„S±ÑY]gÿBjä%ÅžÊÈEê™@e鵆MfDH›Š2›\á,ÃÓ¹õ¬`rb‹»öµsÜe¬jLDNûÛ$¾X3Õ¿ß›8ù/]WŠ!e£‚sø`S:3Ò¡ØÍ +艮é<ù$‚NÓkƾâd`¨¨Ä»ô‘Å\ +G¸ÌT3@óƒHý¨ÆhñDÚq •N춫[m¯˜òµÙdZŠ&ãpËìîfû>A^ùÛ\šÖXˆ¼¡V„>` j¤a̤‰pè „ò{"]þݯú0þ+ô‡ñOöŸ¯¼ew”[%GÔXÌÈøZ¯©ÞÞ yoöºÍ®¾ö’¿áDvÁy´Ã5ƒöá +Éç—ûÒ²£|rnùz@Ъ`v‘—ã5SÆ!CSl¾fÍP2¶†ƒ˜»ø!yGJ•RâFaà¢1Œ=h!˜©Š¢^ˆå=¬"¿1÷7’ßx*wž‹Ü5º¹Ì*¤ZÍt…0ó×y’¨šç8œXÚÕ€—˜ ÷ɶm7’Áá"¯8 BaÍÉ8©ùÊüÍ–£`"3Š?êÙãŽ= ¾g™Qže¾U´‚ê:5“#o·ECèž.ˈy¸ë +묔…Nk€üdªÀ(©\æýtîË*+âœßÏ®úÏÞæMmó—¬;>Æ÷ÎÏ•¤¾/C):02L* ê;|i$F…·pí£$äs²Ò*ü*©ÏišvÏŸ3ÒóëGã€ÏŠ®ßAb¥,åî5Á%¯ír&dO“(D¡¡yCMºÏ—LQ‘O¬¨xÊÀÞ>_C!oÆ·¶‹HËS« ªáb·hùý*KÚeeÏ㺒ŽŒeÌkï [Z¦’‡mŠ:#Íäši†þC$p#[íÊ&„“¨|ÁéçB‰Ì¼Ðõ“l +L « @†5Øð€Îh${Gy1—Ö¶§áVÙ‹Ÿ¯ø[¥üÎ,ßÌ®„xâÚÒ7vÄðy±Ä† k¬Û껎–"{ÃŒ"£¤õ·ÏÓw.÷¯¤¤IÐ5Ô²`}ZzRÀíXßV^4C¹Æ [®Éex>j¸›‘4Z‡Ç[ U#óÖð‹QñÚØÁÍ0pñÙiªUT”:Dþ…a1}^ê[‰ù)›ÑÒJø6\ ò‹…SA£ØÁ¾í®ìK•¹LõKUv§BŽù쟆fÝUH´ `šÉ0@HP{º·y+aç˜%,i…:x +ÿ£fæI J +

3’v?YP2st*_òI«´X·Ho°n¥#®N/³7E è…38½ØÕz+Ž«‡ˆdΩ@àí­ýíø_ ;þ•®ÍA²³ÞjÆäQÖµÈ2°0[áôÔñÖTŠt,ù@‚ÅÐò³ª^:ö(Õ"IGˆçžë»ÀPT£‚‚k MÊym‰6c¯†‚Ä/‚ÜÆ_ÎãZ ³ùýæs¸jƒkÓF®ö6e : +(aEP-¤1ÕŒ[÷+,ëǧ28Š)H>«ÎÝ~p3 ÷C„?'7UÔÜ1çv)cA»Áü{yLò­`8¹49ªs ;W< ðˆÊaH¢°ª°ï5ÕhaßCn÷`PÝP Ù×ã *m?¶¾ÅE³˜aàWC‡a…®P:̹7Ñ”Ð/íVéB)—Åú<•8öîekž?°/ý;”íÜ6k60l"^'‚&ûæÄÌÍd\]‚êmÀ}ûǶˆ[ ÎYÔØV²´÷𾩶Ñ„2¦½o$`“vG]ëAvšw™JP7”&`eŠ†‚9O!EpjÑå³V7½d< 6¸’ЩrXͯ}7ÀrZ w7®lµ¨¿”ýU-@× ÆS ÙÞÔk˜¬å1Hqd:nìtŠ®‹ uˆ^àž›wºoRÄÿsEÔcNdõ€=FŒ31-«¡ä«lÎYîž mªKu-ñŽ³Áˆt)ZíÜ¡JÂÚ¯ïÒĺsu{…ª[¼¿êQÃi–rV¿Ï|ðÚ Jåý‡ø¾õÝlp‹i 5v‰ásÃ3yý<Æñv\Ãq¥ˆ!|ý¶ÑÂOUÄ5Š©¹Ïk¸Fma½ Î[/]úÈ㨇ßí£ì÷ V=óœx>üÉ~4î«^G~ )¶pÈPÁ48€>ìà"Ê«RÏ(Û†Øåëp°*bÚ"ß‘->ô»5CÐy&ÌÝP¤Íì‚6”/dµÕp!΂»î-›H…‡¨tGþ¥ã¿Ã#Þ5ª!`„oŒ‰H–£=õLSÒÌq·39Ø©àìéb®Y'ï’÷í,‘Âïvíšïö)ºgrið9ƒp„@XÔ¾¢ï+zÀ£ÇÍBšÊÖi­Q8~Vt|«5\!iŠL9'¿æ†Ì…IpÚiú†CÛŒE»kÀ³yeÅÖÌRÀPS·:Â-ú2™$b§#êpm:%EŽ5wø\èsüvHô{n.@ß+Ð S2¦±¯sȃ€$h|¸Ü9çÙp»pYŽw+MŠÛ6+n}Íöm3¸-v 4RnµKÕKƒÕ‰Ø=ÑÉc[ºÐK~ÛžÌöbµ£—Žˆî_¡¥¬û/’ëD½œIæ²ÕÙé!/?x(c~š—ÖmxÎê—# ¼µÈeƒØ¼îÄA + VéE²ggÚmhõØŽJÀ(’ À‡…æ1Il/L²‹€€Ø=ß·¹¶Ú)r¶G(H¬W¾Žá€ +üÔ +N ›@Õ¦µ&ÉVÓÈNî÷öF¸ÐdX‘€þ¤kc€2³"“ûgŒ°k jšTÓ-»R ܧÑBô1:Ö½–#ƒpz¨ÁìŠÊ˜:#ôë9 z•}=ÎZHQÂd´ÇZèéÁÔ‹!&«9°MÈ_¢rH÷<éb¦:·5] Zw»­Ü@d‡{‰p†Ey½Ê9Ƀ|ëQN<2?ž‡2>i/M¶ë½D$FM35î9h©ëCP³F’ðÖñqÔSÚæÒ£“~=ß ä~U€²`hI¼ÆŠzêÌ—­3?wOwœDð"&aˆ8K%xfº+È«ÂaUZ&4™w´çs/ñÕÉæùR™‘ÔnÔ´˜zIü43ÁÝŽÝcì÷ñì8¯z%‹<>|2…b‘~#f€øú> š¾“ñëåîî]¢L°{°dø®²µéL{µ+z©QÂä>/Óz¦:Æy¨c,óçµC#oHQÙ{Ÿ´µô•»ãáõ­1]%ý3©øÁ3Toˆˆzâ®z¼õ8ƒfª-¿nßüªe:Áó•ØOû˜;¶^˜²ë¤…2¬F3†,¡Ûãø³A;-ïØ+„~sUƒ4ŽsG¨BÞF2ÔÈ0Pú½âµ²‡h;´$1d"‡Ê`ö + Øî*ä À­lž£‡¨ùŠgAHŽÇà]»1Ïä¶V“´r©ÄY`­º6É}ÁÏøa‘Ã)‚:G;¤[°†õzï'˜á¶QQǹvQ|^»×ˆ§+<åš,·ŸX¥‚´­_õè?l l*ΙÞzAåé–šM8ßAJ ˆ¶ŠÓX„ +ÐÄšd¹ú–Æ‹ç^½ß{x&€íÐÅ€RµñÕq0s×Àˆ ì +œ€³8üª¼Ðk«wºGà»Çô[/‚Z†0Ò0½†5•ŽŠÃ°’—´ÔFTÊüG1† ›³÷ç5-ÞrÞ÷ýÅq$‘ô‚KIŽå@0²åËì@X7:|®Ì³×pVQnDGøÅ$ëC€æR÷”¬ +:¢yÓ‘§ÖÀšgÉݽ÷ˆ{×ú€ÇÚPFæõ8G± z[i}GS-E4•6ZüšáƒbRöº³¤Ÿ%£l£ÇmžTáaÇD>¡î†‚þþY5z˜wY=Öcl[ +»o)ìôy\½ZV¯!ÜLï +’Ñëì8é!Øfõ˜m£¬"7¸Æ‹rY)"nÑFœ(Ü4.ðû<-ØÏú °’ÚZŠg"¶Å¤@&(âã"nr-e=Þ„†í‡¾ ô(»GO "j¤Ü¡·^²‚#nä> U.UY[™zýªG l['M~‚·N:CqfDOŒ0QŸ0!æÓ‚) ôæBþ¯)¿£ÚΚ”s}T·zLë4j‹‚T$Š®¥5˜ÙÝnóÁõ/°K =Žº¬tfýr_Ï B{ƒp…wuÞ›ÃÛP>ÙgŠÐtýòg2k‹:Œûx&e?“k÷PKµ¡pø›WlôW°°‡âé7æ¼NæUsÏ‘?Õ÷i5­Ì¬mï½Ç†(­1§`ÿO{ÿôË^*…õP +Cê¨X3C=Qž¯DêÑW¿¿–¦wôrzF}wšÖ›ÜA6Ç +y!@fe]¥ûih¤’"qK3wJm±¹yekSVçÚÓÉoÂËY:+|70¢n£ïýVsY<ˆWïðš$áñÞá§SÛRÌ} Ÿßs_‡C²»Ç6ÕôŠ°„o=¾\ ßz­ÅD±q”§r)w`‚¼×¤- |T`Õ¬(4o²ßÊž¿3ýlaúÙåIm§É‰}#«î\ˆ \Í¥(arAbåŒX$c¤.‰B­'™HHŒcÞw‰ÔËÜö¢L" »ÑW‰ÌÀ€ÐøFxëñ×#rê~ûºNMx3w5ùc.FäOò È. mXÍá{)ÿoÍ/òÿò¶L]Ù©Ì݉ÇM§1÷aL‡aRvï3z¬Åm÷˜»G9=ˆãè1Ι¶…ñêÕMÝHGLÒ×Ìiµ4Åí…>øÒ»2$ó?„€‰²¸mg,˜RÈËAV©SfhôXè9ؽiÞ‘‚4vÚa„£d.”“<¢”ÏžHì +¯(Ï¢o(¢µœt4ñy›ë.iÍ«dËf&á…‘êQ.[¸yÍ…÷ Aùuƒîš¨x,ãèð>y¬9ešã×Ñaþp €|漜n!§¯ò ÊlŒ˜¯z¨ñ1(Á’á¸ÖÞWTpT÷ew¡i?—ãVi…ÏUîD•¢Ä”« ~u§¢Ê ½7»-£µ±]Ù¾¿}'³µ_Y-gÖª;%”!‘v‡Y{B¼VÁ.ß3¿èiL%³ÓƒDM!…l¯¨Þ&–ƒ¦‚ªU^0^­)à Žƒ8Lªgû¢ÌF¢n!¸9üÖÕ‡"©.=´ÜW š:w¡æXeÖôÉÄ…°h»ÀÎå(÷媛4‚§AÁÕMçCOh°]Ć^\MçK;4ÀšB2—3P!"$a›Ñê¼<ˆ2HvdLdvCëÛà +OfE¯>öõxõÁØÁ^S_h†–þðÌñ]Ë_w—ЃZ+…\‹”a·Õ€¿±bCÛz|©É) +.œ…HÔë~x´p~„8ldCcq'{¸©pÙaǶPâ8”"ÎOMtÞû¹1‚玉W_7‚wVŸíæë ž¼&E +(×v±! È½Ïû;%œ·oIý FVÓž¡3>J#brˆ˜”7xg¬b¨ÙÏçX™œý<$õžï  !ÐXñßksÍàã Ðòµ‡:/Gþµ -ñ‘P¸lÀð%‘º„Nžñ÷q*àÅM›n¼nøggžÔT¶GHÈùû8«>OsŠ?W!†Bü .SãB6ÐŽžŽ¢æ“¾»)~âÓ9¢ÈºSmH0ÔFüÝiÜfKâàøhcæ#ò4þÄ=…Xâˆ{ƒÝl`   ]”mÎ…8/Þ—­«Ÿ–«sÊ}I“  ´¥0 Õu­X2‚{mˆ{óI¼}ÏÝ‘dp´¥ÈÈ­Îä{oþs‚—FX•¼gqY-:'UÆV¶|Â8öóëìªÙ鈭@Z`E§Qø ±ðs×= ìKŽT9Æw¡Dòó +%örDBúﬢ)Ñ"¸œlf»5ꣾÀª‚uu*÷éÕ×7gžŸ8-1mœŠsu½½¶í:"=Icà<#`Îk§,¤º,Aø +ñ¦3U"³-àÙÌì—‰P­û&ÍÝš®¾kÈj+ðÖj_çílЫœe÷ÌÐå( ÍL#T —úŒK«LÆ$`æKÊm•8|œƒ4#ð¦o ˆ„±‚×6HìédE7³…¢X¿W=6¶Æèèw{bš‘4ÌÁXýüiOrF¨/)+ù‡‚xýüŽîÔŽÑxD«¶Þ,ÉPÁ.¿#ÐìàQT3¸©·= ÏkV¶ëò6œo­Z=ª® ÙÙÅȸ,Mi^oÉ – +"Óϲ¯êV¹ç)úe €),׸ÉQ4o-/×|Žbª<ïRûQÉ2¥ÌÉPõp4(V›Å$ŠÔƒh³GĽ‡€|¥. iqTMnÈÒ˜ß>Ÿñ[âP=‚ojJ?ªù`ľ;±È}Ùî*Ÿ»ÔÀ&¹ž†x„¾”׶Êãó-x;:Ï­!ÌœD*Õ•B ߎZ¤ðˆ){X$"fHÁÉ3ço<”tÝX¯.‰üÖ6P¾ß±¿$-ýØ5w¨×·4‘?0Íç%nU®0ì ö$Ö¿°'1Þ³a H߆z®Ÿßš[Økf¾:Ó´—ÏÛ¦ ÅÁ^Új(J? NݺÀD€tob'زuiµ¸åß#z,\¬FÅ‚Z€$ º'6kµ«NÓ†)wr¸ÿ0hv6¢÷ð,òg ÷×ñÊ;Û”½\:8&ü¥ôByH™Su¥ ží*ñÓ›{û¦ÇÂâ¥í +=Õzð¤È`S¼nwh)ëÙ W&ïzâ÷m ÔR¦êÏoÕÍ3a#¹îæ_’ФµÀõYñÀ5”fõ;ºh¼„9]„76’6û»}®Û©Ç0ÃÍã@-6°Îàä>½7¬_\ÇÙ°½4f(µ"f®`¯-/=É0otÖŸ¸fí Lxz"Å`ÓÁ™YS^23#"‰É©1XPe¢(ÅúTÓ‘þøïkck[]öÎá‘Q¶;ØßlŠiì ªE•Pr=âgsËVTüK!›z†³†ÑÉTp›ÂmÖmD(1»yH³êD¯™@éÓÚŸŠ­‹òŠË‰¡á&êMª5{® +¶n]lìEþþß„ú¥ÔÝŠàúÒ "U\K*8%6>9°ôÐðnA ¡Þü4¬AÔa;Yëó[$¨Ö/¹±Ùýü­˜Õ¦)§òÈîF¦æp "©ièZÄ\…™´CEutŽëä%Bs,$T4xÀ¢&ëÀè„mQ¿;46Ö°j[…5{YÛ<à×çìÁéÔÐïXd~ûò{"mdþ*ƒð_y°„;cÿžèüqýÇøø›ûñ?ÿǯŸ,üûÿøóÏÿûãoþÃßþ·?üå/úçúñoÿÏÿåÿðO?~ûùÏÿïÇŸÿ×ÿéÿð—ÿüÏ?ÿß?ÇI¿þÆÿÓŸÿô‡¿üé?®Süââîç +~ƒèø_ù7d ^]O(k~°^ |<¨Ö7v12ÆnœH±ê`3I¢!ü´ +[ïû|A¦À3×k†?¡UÍ—Ö°"_PX{¿bWÎТ/Šr(û¼ŒÏ*Îiç3ÄÏ1ÝòŒ\lf“6ܬ0lØ4VdþŒœKÎá2ꈬͺîìÆóÉF^ñ2ù˜{Ýïâ}ý(œŠD9T'J2ëGÑÐîhP±•Š ™4¿Ñv¶3ö©œAÆv…­A­~¤†Þü­eQômðXVC%]èfxÆÑUû£al<öÚMŠDB$BýZ6s§^5&¨-NSë!VÎÒÌ•å +ƒg´~Vçé«Îƒ²û;)¬ m•Æ϶GUãqÛë):‰ÊÏ|¨ÌºåájÀˆ}…Ø €š\$­'×A +ol'›SÚ\ç!ªw?7½>3$ºçvÃJ¼>¿<>…Å •›4E|«od‰¥NF bçë,­Ä•í͘vº=d +Ü0®›‡1V9l€!y«èXΟ1 ÇÝ!<¯v`ZPzƒL_ÿ¾¡…–ìÝë1>ÛæöggÙÒ×ïµ;°¬Ï\{ÓWÜ]ïï Vàý¢מÑÂd ImË5‚ªè/ýá{|Ü€ØÆ•-C) 88%÷ˆ×*£ä€"40‚-’˜ÄtrpA?È;’õ£ÞØNp:ä²9´Òè3‘eŒH¦H@ÃMÀ ÈëXñš? ±lФáÄççW„¸ìjÚÙ‡í6¢ +Ä":µÊܸ¡w¿ëEϘz %Ùݯ ¾ÂÀŽRoL à ô’žÌG_ Šø ,ß?&¢-ú:tàþ(qŠ´?ŠíðÂbŸØ®=#‰¡…«ÊQÖÉ/«s=¬pÁN VZ08Þ‘¡vLõ¶œYçÞZ°“Zâ + a ár–w!¡w/Ø’5&²ß»B÷j b•Ÿs‡ß‰âÍ|!o–Ufw‡®­”xÔÐ ¬š÷]4Ò[šÑÆå®üþ9G×R¾hÄŸ©ÏØíÍõ(=ëÏfñ(gÖ¨z‡wÚkT†×uîÄ:A7dEþ†´l.RÃeŒPp8 |;trâØ·M›Hél'o»‚¤lÌÊ–/EÀ™]”éðe àê”CH­üUÝ/W¼¨nÄÄ è¸eËÎÜ’¡©—è…{‡\ªFcoF˜"@w2E\r?æZ»½m3sgn83L¤‚L6µ9 ª¤éPÚ´hï"ÎË>œ3n"2®Sô Hç›ú¡£\ V4pdž·¨6e8kÝÛ\c°¬ŠKÇõmakAÀ)4eDX¬§Vë0Lê`£/š‚ñFîÊsÿ, ¯ÍB™×Íg:¯ÐDTÛ)‡®©‡d¸šÕ÷ T‡y·QÛC_"à>%•ý'ðâP ëø< H:tÄE½IãYûFMëQƒh¢†JïðÓ8Œ`VdÏ58kë-»¯¸Ôð[›öMkc²)§j±,Hv ?¨±¯ÝJ T­ãvþK/Á·óÊ°9Æni¬ñ[  «W=ã-AÝ6 \×S]Þ,:ø-‡sÃP>lH Ð€Z‡ƒ~JÃh{i¢‘Į֤‰ +Â×ñàc`€2,% +¡žÝÅ‚pŸüÆcÂD•ÕÏ]³¯‚|n —î´†!JSA(ª¹N\wŸ—ê‹ê@ÅgàÖEÏæ +|EFN¼{LnضJÕZáiCm\Q9RdÏÄò­¶Bu\—<øúÌ9K©UõȘ**6…4 * Hª‘Zý1" äô©,d~ê9øeÃìŽÈÆAó´¤ÙzúçoôËÎJ?Ÿ‰bSA~m`n}¨´2Ýmœ¿½4 `æ|>Î܌ؾ|}þ½–Ð ?±¡Ÿ~c*¦?ÑóÔ‡à›âúg!*n6>kÞ$´è¢â‘|‡+5Fީ¡±Ÿ™93 £×ÜqñgUä£|}™×}åR>c*¨œŠòÃów–·ßÙŸá﫼?hÊõ†rIäD§vtŸ;ÖàJµëùìæ¡PãÎ!Ûxþ6[»9ç3ÙO(FBe@øwS%?5Õ,~`~òÅVe˜ÝóP€cl[r“ýÅda³Ö‡ÁäÁ‘ÜUÚ¸ÙJ5j ¾”Øø^¦ùL@oH- SÛJ,ÏtDê¢#š9>¥¿‰o¨ÔYUô *4¶`1ôwP%+ª› õ|,Êil$¯Æš`!¿XVàIèŬ—mО´òø¬0¡Œp˜=Á;HcÞ*£Åk•e„Òe5 NOƒX1 ‘o›8 +‚¦÷κ¹Žtu»˜–.øc˜6‘ djl1É}9Óžè"È`zl…„/Ø`Õ‰JGÇîd=ÈËbêö€ÉØ›\$ Ž8w†qMV!;‰ ŒÌ½ÉµÌà͵»ÆÙÍ‹QÄU#°äTyÎaƒ¶†µ:[»Ï£¡äƒM£‘y!V?¶q¢Ì9\™žç’ëq…q°ÐPä€ÓcÊ@uøÆ^RWÀÃëTݬc]»tAÀÇêi”ÁøH- +¯éòé\”&%G³V㨿dyYá?S„*¬œ)ÒÜš¸±‰Ši%mÎô§“²C¼ƒüŒéë±S¢æòüæ”R.E.  'JUŸÆu—m¤&ÍÎVË·¤¤Ë0!H˜©ï£¼9-­œôù,‘„D²„4#ÑŘ_Ž®4Cå>&ëð}mr¶¶¯mÐÇAp‘”¼ð—S\Cñ™B2†Â' '®ÃF¼¾èá{saçFöz=!woÇ(”B*T#·‰iÄ–N(CU‚õ +°?Ø•h'œ ,•³£?p»¡ïtD ÄÖ/R4‡É»cäM®ç OۆϰaJ³XÓé-Š°’P÷gp’b>¢QÊOŠ­GCPc5$4øX}ß1~¸h»)66q8­yÖ=\} +äwIÆm¼rëõ×W 9Œï~ÚAç/›v@äµ%Hhhr=¥o]s¥¯¬†«6<ãcô9 xZ5»#H#ÔxGør„ ï 1~ûçXòo•ÝÖ«’qÛ‚Fû&æe´ï™—Æ#×ÞTgª_\Šà쨯ïvÛ¦L`$2AÏöù¿„,`MpôP{køÅûÚ/NIRÞNݸ-š1­šÒ>”´'ICÞPÑþzöSÔI"w¿w€2ÔŸ–Ü´^RÀ4ø_Ls4¤ÕIôSÇÂøuŒ'¶g¤bº‰fR%Ô—Õù'sl\bôùÜÜ5†Ì<Ø/ì­¿ßI KUX]+ømÀx[ñ.jn»$>Z#)>‚ݨŽ=ëøwÛï Ñk­-ʯgѤ8”û÷ téZËoEVëø7øL 6~¹nÆ»î±ëÏJ*”Ø抳åÞâЭºAºây6ÃtÚMp|—¹(rò™iê0Þ¡s+g8R› ïNÈíƒx„«m¼$lçõ·@¾CªS±‹0HHë/‹^è­í Ü ý6ýÖÒÌ5×m¦†Vµˆ+¯•„xè@‡ôùûÎp2;±?#š°·˜8X­þnQ2V÷ZÀÃM憿Eî‘c•7/Å|vBöeFÁ°‰—aÌy\Ø™Z¬w9\ê1"îzCPÛ¹ngµÖ8Í Æ”,5Ü»„¼–‘­³B§5ﱕkfåL3ʶF¾ú+Öƒ¤ç'ˆÞÀz‡ ä꜂=ØÒƒòjœè¶¬w´Yôê¤)a€h$ååä0•8f9çäMG<Ðhü*µ-y½f@Z‡n=Pk‚ÜS«+XŽmUh!ü§Z:³Ýz2²¶ZV©nh€øÖÏ3dµd5›K»Wõ0Ú7ÓÃÍýê‘ýJÎævšn=KûYÌÔ–çR(` &qœíU5[SÁæÅÁ%˜²è)æk^^³¶ô"Ù^²_ÖQH +QNA!ŸÛ¥™\©±S ÖîM­!Þ½s\¥ˆúÙTîö(Gåõ4â‘}ow;Z‚P\¤+„Ó'¥Hª²-¯ú4xQÔifŒk=èuÓŸoUöÂ/÷º´ÿÖêºèRÓ²0ïXA^{Ö—BUUWõ£€’ó«•[œðFyÊ2Q¯=ùø÷ñ¸X’xÈ™—ñÅq|ì¼:iˆq#—nPlò)@¼õ=Q·ÔVwø¢Wýÿéýìᶔœ\’ûI‚b‰ì#2UëæâÙ“Zt;Û)Wý’VLU”?¤m…OÇdI¦G”½P É1yYREÁ¦@Š£DÎÃGlì3•ðö±PúœÉepõ’ŽëõÀ/£dß(Z!Ñw¥Ø&& +Þ[2oÿ¶ètzQ$½·«]|NäÎ\ +?È—nd +9~žkn5½»æÄâ 5±9;ÊÓOàei¾…—Èú¢Òçñ¼5Ä“mûÉ>oäk/âk˜b“û£Q!—5ã²îÍ‹SÏÄı¼J´ù¸c#,`^;ü´K¶f ±hqŽ~; ¥=VBJ{ +·—íP¥w‡I9¿µ¡HnïŽ@©-*ƒè]bAãYÉ›ÝBú7$–zû<äkê–¯Ù¬·N¨Øö]ë+QT$R±NyoïGƒÐµúLMjˆYÈ3'§b¾æYɬ›5 _µ´¬6<+ÃúØ5¯T…ãômçHÆX7Èn6½oi´¦Òç™bÍ#_ ØØåTè‚¢Ü6ŽgAÒ€ø›mRò†¤¤¾=¶Œ4yª=Þ‰?IײÊ)€¾ÓýfÊÆçBæ°¿)¨gµ/z vâPJ>FŽï½æ6WFÐQwèÕR"–/‘Qk‚ „¬ÔÌ{ÃO;ô)SsbJï÷^kçs0WˆTÖ¾ï³!üÓó‘*e«L\Ú®¸©Xhß`êÝq¿¢!Æý¼EŸ¾öxf„ª]ÿâ0pҮȻêWÝñfi{ÐÄòµï_‹ûw¼èÔf·S%˜§W˜ß®Y,çÀÜZi_=Â7.<¶ʼnQœ#‹Î1“6Žg”hVTÏívMW¬IŒõÙCPoÜ9÷vŠ3£T"q"m¡6‰3Œ°@"FfiÍÙC!bnHœ±Cžþ¬á9É™9dÞ fsP|NÒþµOpm÷W=¶¬‘ÎùLþ¯½TÃ!Æ(5 ,ïÈLød×Qfº¶2“à™qÏëís‡By¾µ!’À’ . +;RçfÞá›J±7s¨/‹XìÛüg„û€ø`Z$ƒ™—.¸² 7 ¸dngo½£yöH+a0²@ ¨©DÌßqéä eßÿí½ÁýUŠ*ò[£æ45ZèU÷€hñÙpoÐ +€Úž¾ŸFð|*?®]™*ï`6^’{Ç <‰A5R:e¸]øÆš0~r[#'‡z¸kòÙ´%†{ÙŸèNR¸¢hWù;ËF£…»(Þ4e j8ÛÕ‚˜kº¥,.i¾„T-ŸÕ€ÑÇ3ÜQmçOD´PDÂÈ[´Wǵhv&Ãφª¥û†7ìÏ’l7¡9!©‰22’š(È"ŸúÅÇîrÉ­|mœzY{6œ‰1ɪl·gÞÛÒWÇi‡UŽ²ù[ãßÅ©Ö:çÝ D_DÇÊ+– Ê£ +ú R¿kÀŠyCÚG~ò6^5Dvë?bÛÞ”O4–Emžýkm–Z@sÄÿ]3ù·ã´+ªµä“i=òÈæ+㋯«H¤¾^{!F ¢"¯ôK3.©[.E Þ£µ¥,#Þ¸K#3²j[7V lµEÃwœ+ïçz–áPE©Ê‹tí ¤NèßôØÙè’£÷§ög(Ãú…/˜ ”2™¨5^¯@K—]kkO¬ý÷»È²~ r=¨Ûl÷J æñÂ`ö¾ ¥¬¯u6øÆu4è“Acö™¯·‘WM±M^óL¶–úz-¦xɈÁØ2lŒJG ì½5Ì>Ž¨ÎKã ·zR„jl2±sG‹Y»‚ø?ÉþV2êF}³ô¿mXœ5.ɵíO…0dc¹¢¾Š“”5Þ¢_2¤ƒ|’wV…4‡ïù 9–Ä ]ÅY­:ËÊÙvõv@Ñ¡n<Ž¼ýf‹¼j)Ž C áZò?Hxyÿ¡r‰üX·WøôHa<§´çú«»²‰ R¨UoiÛ5„¬,ÀWfXs”[ÝbC-¯Ä(— Áj˜v–Ó›¢F²“O±ÏlÃêURÀíBî~½ÊÝ“at+Dâ\§S㌥§=†›07K(õèúyžz‡lþ÷¡i’´L)®× Ä“«Åpάo”ÕØÏ+2~‡Øε7hÌ«[Ô¼ax£®ºæƒì£n·æµ¶Å†{U°;RùÄœl9ح׈å©:‘ƒŽúŠvÇkAð°ÄJ„îÿzQÑÙ_W–b×Æ"GAû"÷\*´êä…×»19tr4°@kû$J»k‰FBf*íÅÎâƒbU€E`ŒŽôe³ÆÀº†:¬QbãQÜqëÖˆRî£Y›%&0%PÎèö"1ì× ˆZÔàm ïNôЈæ\‰†Û±E ðøä¶#××F°ÅÙCÖ›¼öŒã˜®À˜Q3^{L%ɘ4ò `5¥«„ÙÒÚžç(‹6ÂL½µ@ë+³qƒ3œ¹iå2]{bÿÿ¬½Í®,Kr^ùz‡3”4(ù¿{ »/A…nô¤ÅQ(²M!± ôÛË×2÷Ü÷dîâE—’uvXFdFx¸››}?M¼ çÛocSrVI ÷3ßÛÅKP l55ýH‹ípá,‚/ÀK°åÛw—nzˆÓVÿ“‚óWëŠËiVvgGÚMƆ”&W NZ¡!.ƒvlo +Ç°¢ Êh +£ŒvéÁh* >Ý««Ä<~^a*G»u®xXÒM×…±CØmK?ËßLƒå ·¦yŽ%΃:±ã¹ÝËèÕÀy‡‰ bCD¯ÙˆLu¦IÜ8PbŽªø«—¨Ø?ÏûÇa”$vhÊYQ#ª}z¬ÁQì;mYóD0šª+ñmu~FÊfÜå0S÷w„±·šÞ‰˜Á÷ŠµèRæUˆ&K•{u\½Á!ª@oq;?h«´[aÐgˆcðEi$äì °÷A˜e¯…xèù‡ãëBË<. ‘¢ÃöÔ**éÇû¿ŸàEű©˜´¤ Ã!¬ãœZ\H»-ÒœHˆ‚^Á<7¡ 4ë± €¸-ùOj§•NîDá¶÷I}\ MŽJÔ#=ÞÄñofa7­û=üE…G´V Ð®ª!ÏýgÑljŠ—·×sß;b^LÒDX5?±¤‹áÈV0’0sD©Šr&ÇÀ™qàI¢@úÅYÌ f08*¢š•Þ÷Ÿƒ+ˆò*¬0Jº]c 1— IJ"jûÊ•´7«éÝ^BhkïSRú§—Añ:ÎF¯Š„p…lÈ]cÙÿõƳÅ5'û¬†¢ýø“µQþ Y£å͈¼öÛöËï8–A<5öšÏÞ’*ÍDEããà˜–tsõà‚%%?Iáù +&ÕVTšòô誧¢f±.ƒ!*YRÅxܳ¦Ÿ’œŒÒ KêÄ*­ Ÿ@ÑÀú`­3o-¦(@šâ>1o {1Œ2튅ÌH:›ú0Àà9\,Ñ)xZÁÞÉZs“]öŒEdÊ~5ò§ùSt5üeÆÑä å*ʨ :Ë™.¶ãýÅ´Ì»ç çßµãÀ)0£&#œÌÁŠ/=Ø ¼«qÛⶀ àäAè¶ÆûǽaC¦xïRGm’ uNêmàNpºA–Ú–?Ø좆è^ÛÖ­Ç?åÔ³pµ§t‰?D MüàNÎð4ÆÙµ*qöyn°2ѧˑFì8U†\J0ŒOlì[BŽêúNnP#Ï5u)‘ 0ëT ÜÞN\Óla|RIÇÿüÊ‘P;‡²Fý}°ÊZé¯Ö|÷˜¢ûLŠÏ|:Táy-Ðê­- h¬™ØO?ö)ºUì7´¿–I¥à·&f¢.“Ïž2Yëí×/³f6‘*ì'!ªŽ3I¼Rc”íé»V¿ ãÔˆ…³ÐW saZ8ŧôBùd0$ËóØržêDͳcãî‘ßH @ÖÆyœ­[rºÞ/ÑXQ›,ÒŽt»|¬âyߧüÄñv~ÑÇ >æúŠwóKá¬Q(Ë—¦‚CheSjë=¯ìtGŸáUª­( sÖ”ÌXVµtm[Å/–©ëu?ªb|oHþÜ.‚dqXGF ž mÏÈ-Y"+Ô¥;ý,tdO/B>˜]`@;œ¢4Ù~uZIÞ•›EºÄ •y91îÐ7%…î¹H¢®ìaôð@ß´ +° ^²T¨p“ŸðµN)x¿Cǽ +h¾ŒCd0Œºý’†÷[Žc=Dò^O·ÿë}égœq?ÞŽnÖ ·Ü?‚ñ£0€Ë“¨ØüÅ×2ÿ$Ñ`ÒÔÖ +€”`‚².” Qoï~“´åóľ‚~ü,>±ý*é`Ýq†ËÆxÅ´óÎJ¶¼ž 6Ö[±‘÷¿³ÉÚ²-Ë«+„í-ÁÉ(r_ù÷ª +ñU5±p9’# +ÇO¥*#/Z‹Ç/hÜ ¥·q†®Ótß·ëíï™ Ò‡ƒc_N”µ^Z©õ¨lAõ¶MoH»k‡ƒù’ìäo-ë“mÖ£&ç-˜@(¹Ñ_níKö  +ë¬íu^»uœ-štÌÚamwœ§Q.ØÿB$ì'hHTxë#’-{ºWœ +-Ôý©tp\šÔLÅ¡Ñ5/éÐ>yïÇÎîêwQe¬ñEö?÷ñøoJVü›êy+¡v>2çR¥Q”¶~Õïת®×å²Û°¡0˜Ÿ‘zbß™Tp ù+`¿IkÚ?¼Ðä,ÂaèíR0Ù¯L0ðʆ›EÄò„Ä>QÒß;õ¦ð4Z›í áàêp÷ö}Z)WTôÂ’Ý·WzäœG9ŒËkêr;k¾)z)QAQ x„òd üAðɽJ[Š .¡è‹?{Ù%Ójo|á\½‹ +´_Ôg¡ /Ž’·…(ZÌ5‹S¤ÆAŸ +—Ã˪¦qFƒ]qh¸Ì¿xi6Æ–d©2\¿HÃmK5äñ«gLK‚ÒÁ²Üp”cÖzÆ—œâ•í@PCaÞ¶üþY€˜¦1z½ŒKZ/ÌDòæ÷~b¡—´!Dn³š;âÏÙg‘e³|ÿÆÚDŽ%ï…e½JÜ7åë­ Á f·ÙÏ,‰L Áã•bÔ©5z€x+Ð{€ùÍ̽4ùró‰4e°;.×áèò ![q#]âþ¸êò øJJO lEp°/<Äl܃Â#.ewž¸_“–¿šªœ•F|[Ìak ¯ýŠø(´í—ú2E<ì¸4M#kIG»aö4X©§âã¥töZÀ¿èOÀÅ— 7 y÷WOþ¦~Çd¥Ó…ìX‹É|Éékí‰ð O”>µY|NŸâhIì¼Û¢B¤›‡²Ó.íº+y°À{¼*B‰Ž¦_¹K}îÇ<‡¿‹í—j–-i¬+O%ñY<ßùLZÁlv0Ò1C Ôëç…u>r·÷­„h÷^EmØM¸Y[¡—2Ë®k¨ñ\Wn&GÙX¢Ã¥O7gú#ôÌÌäj‘î¯Ñ!€¿Aji›Æ+ +òë¬JuŸ‹©ÿöù›ü¦…à—+W˜€ëœ¢­+vAüû%!®á‘’r‹þDSÝS­ÿ.?ÔH¼:R ‘Qû„ì{µpÒ¤SŒ(ÂcœiK[ÔDÂþRGi$}ýÁ°]Ò‡4©×‚-ó»C^]a8â`¥Y£x‘ðÑb€uY¾ÁP°j +»Pc»ÅO—Š‚‰ëMi´?[‘}=zÂ//—ðË ¸B ¨ÞW³)öâiád°‘f¡±zäk6Ç»£h}F} `ô¦™C\lrHU´>öƒ}R˺°ÂL¢©[Â." I›ÖÁ^µ,fŠŠ·×ÛOƒurGg,QªbçPÔ.hôuSáqôºò‘NÂ%ÎÊhJ‡.ÒÀH‹‡¸ æfçñãpJJ #÷7°-‚Œ0ØÂÀÎrÒ\¡S%C"©bȉiüÔ½}}Ž’X`uÊžêÖáÏ|¥AV‰mK¾:43Äþù»0ÄËhÚŸ\êØ¡]-IíëüvÔ8ðˆ¥GÙÛÞçœÿòêqFÊ=DhDRx<àX!ö‚‚&î…ì€=P£²vcyêñ]IÅNQšŠEm…¿÷ Ìb¢¯(? ;“8‡«kì-í8WbÝÆåA¾÷QƒÙfÒMj\‰véÜ{韖˜e† ÑÒ5¼Æ5·ÏÇÜþ4?b"jõð3 LÜÛäyj`žë¾Ðõ/-ØØLiO£\ÇÓ×yåškV:d-OíÖ8marº‚É ÷$r9[4 QeòÍc—C‡íN¤‚¸¦<È[¶"©¨ö`µ*%ÂùžÄ̼ƒ‘H5µ‚”P) +îM„ÍÁ4xf°ÿk¡áöÄnLýŒÕé”οì/öïãõsß™/Œ!v¸Me+Õ2ØH„G% +!M$:yéÜìâFPµÑñËJQ¶ÐRˆï„ëÂ|e +4: IŒoS¾ˆBσÓ\ûwx¶¶€‡÷)¿`±‹¥Ü°QˆÝÞ£/ñã÷;ý“|Ä¢NŽ"BZ™;Ìž(^¦¢)ÏyPɲbö£•eœN/wY1ëè_Rß? 8¢¢rÝHlâJ:iSqâ)ä U÷}Føg•êуq}éõ¢ySî q´Oˆv.$ ¸ÓQ— MZ>œxE_œ +‚B$ÀÏ<äRLI)dŽoËv‹fë8ãÄŒrW$4èAZŒ¾d22Ý$Nwg  ïû–ñzÎÛŠ×Ns'ËòôD¤{ÆkÓuH +£±…žÓmá<•Ãиûi… 3õäêÅuiþujRzWä½.§À_M8‰‘QK‚ÂòZp.ô…?$Óiô!p„×vD4dž4æ_8oТtùm¯ Ä:²gbV|ù3ãðgr0;¥]LÓ< ›H±VÐî†ÞÓ|S<Ç­¥ä0ÓÉ–Æ/8ê©Z™Ç¹L’.~bNàhA6kölÞb-‰ïŒнÛq·ÛL—‘vôwF‡yÊü›rDxȪ5À}Ñlœž³ÀË2­UÞ–áƒÄŒÕaš>.Èæ^®ÏIFf3ÙÍQ2–²ËŠBÆ!uê‘“N2Ýb~dÃláAþp°i_zòÙ÷7TÈÝ8JÔ£dR¦Oû!ù¢Esì¤Ñ’M«1öë+=êH àTSzntk¯TÓž ô>c oº¦Wlù¿Hç,ÆËÂO,‘"ïCz +1œ©M^J6o±BBäåkù#Š7QÎviă™¹ÏhÉ”Nû ¸ÀˆÇáÔŒ=Q]Ø€¯ö¸R`N«jœ÷BÔ¥*º¦Ñ;¨°© ,î#‡c©ÀHD°è?ˆ¿l_Sø¥‚':äâJœuUa§" +}ÈýjÆÐ; 8úÞW…à‰>CàX=v·Îöí«1‰UqèÒ£æšúYk¼ÐCeݸ½ŠØsÊ"úÓÜùœWƒð={Š®g™œèSÎŒ` æ¨ôQîjÊH£ÖL:×X ›Ühc`ØÀ\ã5Ðq9±Lý([Zò‡ã6Å»=¼n(k”§q'GÝ_ñ>è +`·A Ú +YüóÒb,ôgø'v ‚]hÉè‚@D°ÃÅè¢2ËïÀtþiÃ^bÐîºGŠOw['‰ûÁ n¥ÎÄé—â-êX™Û'œq(Ó~n;ÖÜð +ŒÜêNZÒ¯€k +*qéq¥B„ždª–Æ + +äJ„]öãyzz‡Sñí$VÕ¾¬Q…4vtYÝrˆÃ¡ÅÂt“\êéQ‹P΢«ôÎÏ ØCd–äÖ1§9>TË_G…|„…kȱ$ÚWiáBŠÐ)fÉæPùbMûMÇüu%ñt­$™š¿ƒZ¸¿&Â2t¤r»í-ºíO¬P{©¦ó_¡MÙ:È@Hø]—áÒ¦zÛÅêÂR&œ¢;åaIVÔDÜ2¡gŠÈŽd%tötÈôX+PÝØ›P£~;Òê^î±€Uöt̼e Ö¬Ò/èÇÒäQ{Øë˺œ4FD˜¡“C÷6úÀÂæšÏÔ…½å” U‚v/6+ÔoâÍÚé†ÅàAö—Ðó¢?G_m/(ˆ^ +Õ²sÃàÉ‚uœÍa³†„’·Z´ØÆ¢»L:T÷Ч+‘*>ŸqS›~ÜM%†ÕB«8æWÎâÂ{W÷„¹x ÿêöÃwTGÑ8U4 +ê ò]¿ë4 *ÅMn|EÍІ†Nó5B%la ³÷:í±Bò:0/„vXµzàómìÃ?«#ÞK@J!ÙÄäÞiƒ¹„NùN¯j]q{—‘·×Á ƒMÂ`©øK¢a ¶Ò=á^ X®ünz$ïTz^¥Ùb q¡c‘ U”Ëö½‚E¡81†it-rÁøÓ\Úvú¨¿%Òç‡|­ç`Ô§c2ãºÈóo?­\ ªà©TÈEõ‹êÑR³¾Çy`u +)oG}1 Ö;Øï 2…°×™«ªPÖvCÔ~F]µ‘ +f¾ÕH*TÅ Áв™2fX:Û‚ÃLÅõürHA[Póo •±Ši!"ç ’H_ûjÉx±K;¤Úа®Ìg}=ÆÐ)Œ¡÷k7–` ·” g…Ħ3Õì±Obߘè'ù,‘Šƒ—¢©>¶³2&|xÿjËð¬Ä@Éq§h¾Î+BÇ‘2ªÎÁQLÁ±šV”xק­Õßž­ŸxôQU;¡*¸>ª{ +#+†´TMÕÔƒeTa Ú ëU‰h)”;GCk†MžF7€ÕC¿m¥ý•lÉ»’ ¼rÐ>’K9—õ#ŸvͬÑ|Ë+Z‹” ›ÊUþø,n+šóZóÑzäÜ¢ïðÞ|ÿ=ûÿþ/Üü•'ú ç˜øOö?ß™¸°Fƒ€u5/Á¤ÿ©Ãz`ÍÛº£–…Õ÷(Ô")m¼SПW‹qQ`ˆ<ŸÂÛ% «;œ$£äÉôt¿¶Ö K©&Ì +EÀO ‚½ÖsÀ³¨&ŽY ¹Éø:X¬SA؃÷1t‘?À ¹~'s¬^3Öï•TéGÒú)J¶±”í| VÂù{|5zÀ;['͵á{?“ƒeŠ5 „‡©6ð=,ø@8Ð̾²¼ƒÐ·QžV˜™H.9Àk‡C­~˜©ïûSÝü…ñá u”}ð)q)µ² +¤]Š˜¶ÚZ†æKŽÓŠµ0Îrå“Š‰#€H Ýë)Û˜øtÈ }þ=}9…~¬Ç.¸ˆ…ʬáÇ£E¬ ºŽÕ8pu™Að>¯? ²“Ö¬,2]ðFåæãÀOOÿý`CŠ +¦¾Ó^Q¤EÑ©¢«Â¾é5s:Ê9#Éì½›AÅÛ–&ÈþMIJq¼ýÿâ§F0¨`£‚³O×xÑÃç¥T8D¥øw­+\©¥«;U½ÍžÌY |ÿ<_aÏã~h•ð þÂ’þ]×õ:‚¯V´ƒZIeaa !ø³dqön™ïØïèѦn3¿Äžùfšª¿úTJg׎²%Íö|js´˜—L ýCŸÐÊÒ£Šõ*]´3Q]š *+±ê;AJÒ|H“q¯˜%Ê TÅpÅ—Úô¯®¼ÿj¾ñWúà¦K~N±pOléA³†p‘§NCä+ÞÁeï¨Þf2Â7Ý*—pÕ±>7m§iñ•Òi¹¸2Õ¼¿y§>Õ¼ÕÆéÔCƒó‘<Ê—÷tÑšÇW"í%‚| Y¸e,›1¡ÔŠÕ +|X/WXHh¶?¾‡¥9Ÿ»g`ú¤ìGEW_ÁYµAe„Ñ ßÓºVbRœ¿ì ,ëEñy +îQP:YLÄiWh”UŽ{¸Àâ +ðW+Yå/ŠÐÍÀ>(Õ»[ŽÚ’“<Ÿâkk@›Bƒ(âéŠA!Vô¦£¥râÔ(\^½±šeXÆzà¥=“ŽÎÿD눒5g(¸W`ýƒsÎBðí¿0²~ù=1xÈ.ñ|oZjh)bÿ'Ÿq\˜¬¨¬ë=ìîƫבÎ}¢U®WY`ø  ´8+H T„fmûÀÐr._MyhµDe A¬ÀtyÛú2³ns”–‚lj½>DõÌ.hþtΑԂõí¹ˆÖ ´ŽLE ý|νÂw°C)‹ŽS?¦r„€ p€À¿#ÌLÒûéi? hïö@Þ¢d<ËH[K¬ú#xýà +‡Y–‡ÚnÏqá sø/1hù_DµÃÑÔOz%¸v"|IÛホBµ{G4 ¤DÍtí‘Yƒ©J DÎçU+ê§Ö@Œª”tOi“̼Á;4x¯$ +p° ,¦(Ñ—¬ÍÊ8ß–»•s¾ÔõWLÀž¦8€Ã—%«‘ðÍöTz8õrÛô‚evJ—êšõ²´©[!@¸¿Wýký¡qÆúÓ¤±áTA 9¹Sµ[•ÒMÚûn)¨ç€xC·é{¢¹¢ô¯ƒýô³÷t[±tQh¾ÕVl´ãr¥&ä3n¥v¿™ÖOß"þt꧒)Ñ,Wññ=JVb +[“ÿ˜! :Ñ»Ëv¿ñЋΰ]ŠSºÆGY% ÀDÁÎ@K+›¨ÿ¼šŸO§ÙužydÌ{{8fõ@ZùøT¤[c[j;ÖÚ¦ÂÃ]xçö…–*š]¦{QÇc¥ñºBtD rÔ"zDÁ¹ô<"10t–ûKÄ8ÃìBNã’MÐhÞH/sávÆÝ‚©öh™~ Ís tTÀ£RžÞ·\•¿}ËÛx¾‹¨aöFë©?÷½~ðÍžû4Ͻ‡AÅ=«RÚhˆŽhˆ>WÑ_-Òž­òÄTu,gè¨ôqÚ›në;þa_A= €ßýà:Wé#J—"j´yÿqa#´n)ÌãÄ)<‡J[Ê“ÙD9¼©~1Я¼‚EÊWt8ÍÆ;9³í·ýÒÌüCϹÈB-ðj #Úåñ칇ûã•ØLÌ°h 0d¯n\”DÆê/ÊB׋ö¹Œ•<;¢ !‰uB…Ã_.º eþð†ã©°…œµ>‘”*\»€ ¡µwZ×ÏsT-ŽÃUê:ÀÑû+,á ÃN©lRí°§!ñã·s¤ßs[Ñ.u÷Ý\¢u²å +v˜  Ù‚pÿ0[ʧu5èPXxÖ±ÌrœU?ôÍŽÂ=6(ó9YÑ8ˆ0ˆ{Ò%AQ9)µ +»3Ô J|b^(„æ-%nó?g±SˆNq›¼ëÚ¯ÈGÚ=°?Y^`~¥ ÝY ²áÝ ˜ƒ3ù’jGЬ÷+{ÖDmÑõ@l 4램qp©t²ÊYÂS,áà` £7a–å  ³âiñÐE[aï=P5=x÷בSÔ¢1Ï9°Ž—gÂHÏ×Hƒºswç ¦›½~ª”.I +‰2_.ô=Ëí»t=7D,…÷ÀP´µ Â2UL³Ç £¯å®ÿT`Ü: +êc7_r âƒ”ÓñÂfé?äÒ¢Úí¿ìuž÷¸„°îð öŠú<ÇŒY‰Ýr$vgy‰ý›ê§‹þ¢¼R†PÙ¡vKjŠkRŽ.}¾l§+¿ÿ†wA¸Ó² ª·“lÄqÔÊýûüI3Bѳb¿dáˆöµdM¦¹Ç +(Úµù«ù!1…K}œ‘òŸ²Àtãµ ÉšFôlV;>ò”BuØûì´”}&2ÂüuçETLj§ /ÖýOz#¶¢Æ+‘©P ‚ÙàÔ”µ¡E¼º«`üÓ4µñœ ‡·¹6=^©A/µ¡Aðþê@ÿÑÞÞ_íˆÏ¤ý®nÍ @pÄ|F8æ”%‰òÓç#[Ýúͧ0=»€}Ö*V¼Â½/ëƒý¾ÄB9xâ³ ¯âN'ªîí¨4ƒkÒ—Cã•w”ZÀúhqûE I¸™á… ]|cùæ8¹²}i6hWs?4•1-D[¥—ƒ¯ã6ÚÔ P¶L]ð›=ó/–L6Äö¾ðžÖ endstream endobj 77 0 obj <>stream +~w0ôMž³h¶‹f˜Éöc›®ø'FWWÙÙƒ{PÂOmƒfŠîÃ×NQÂ3¹…ˆòŸéu²å¸97—(ÅO5¿¤_ë5KÒcövä«—pO††„½¸yn\‡-%¯±Ù[dfRbC†®cÎå8ë~ì_>öz4ŒaeAßYùd£ðu h/<¯ãuŒ9›Mk6ýî®{Û·+\îBK&ûÆ®®] k¾¯s• GÑŠºÞ +r¬²<?ÀÖC¯\h‘…[w£ŒÙ­û¬{º]ž²û¨<@pÓ™8 ì°óE.†yÃrX»ctïvè«2HL¾¨Ý&ï?º9v:\›!«ZZkìoë¯@û£ÎUhñžÛ=¨2Je”µ,'aJøÜ ýNÓVôÿ¸’¸SÜ–:eúÀóî#š«8˜›Ç^ÄŒlož¥êÛ´9‚ÎyP=Pµ0‘‡`ø“NQðÿ~ÈŽÅx;ð§[šÏîDÏû÷(xÁúÁìC-Q–3ýÄG™2½G|7mFÁí„A¹'É¢-c9" ;ª‡ˆþê™Ñšá9$Â¥-åÃRÚ9 ŒÃ_=ÕcôôµGœŽ|·A/¯+ìpö¢Ú¬âW0’BÉŒrh냫ÁD“Ý]ì-Óñ‘âlfC/Ϭ5–àüqà_ÎÞ7vëk¯ÚùùæãCQÒöbQO¥!2K”†„È+Y„4ByAV’·¶Ÿ|µ°j8é”oO‚Æ<§¡€Nê<3"1bžk-T|Œ÷JǽnG)-+u*I¢½bÝÀâ-ÅfGT»®?;¿ –² + Q#ô°_¸Çyäa±äU‹ B¢Í;YiÏ‘íïjÈÓàí&C +ª ¼\®Žê÷bz?ƒ¯)ø>îj¥çÕj&|ënäp¡`Ålc‘%j?û1¥ëÓ¢‰É´´” +ªtÊÁžÖ¦t§`ÏÃŽ{OCÓFÞs@유̬¯ ,v°º´öÎ¥ÈÇ©BßE(Û l¥Õ˜ÑtUâW£â Ú¶ó–¢ðÓ 9…¢0oYd¨«<¶_èÌ©ÈmaxOÆ¡Á<·½žÁï‹J&€û\§>¥¸¬EQtÜ®ìJ¥À·7ŽE"ïG,‰\LG/”[=B‰DášfÝ,øê´TDÈËè‘nQgÙŸeŠÿÔ¬‚üM!#,d-Ðz œ$ýp"K· +zlg%îÇ/5Zt%:¸Øäî+ WG»¦³«+òÊ¡ËNƒÀkÞÎßä)ë*ú—X§¢ÏêÂÜ=\ˆhð‰èîwÿ$Œ_îV°á` w¤Iœ W?¢Ñ“:e.fÓKìCäŸâ©òòW“c » =@à¿y°Ç§šD…¬ë°v¤ù‰ö»ÑæáqKº÷`×»tÊ5á,Ò_÷Yvvôröºzœ`´›= béÞ²pÛÝÛÆæ1µ2õX—±²ÍîJ!p¬‘ii’ª¿#>>%GÒàÄ´—)ÍD2|ªæsêÉJwVô=þ¸ÃzÃ{礮ø ¤üæìÁÁ’M¥Æ[9F Ú™ë­M¾\OàÉظØF‚gÀjȯ¼l¸Ñ[”ÌŸ1¯ƒÐ.l’0šÚÇo“§*o +ðÇ#?ø™ý®i¸ˆž±¥ÅU Á^AÚ:á.Íœù^ûˆ¸6ê¢ÙéÌcNM…Ì +; üKR*¾[¦Z§Óçì÷8ó°7|­ÃÖIØynCGðÑ)$s`/Ê +ðô}CAûïÚ©Ô€%Þ“9Ñ™g0æ†í½JÁû#´”a•q´ÖÉì•'"?ýÊÓ€A7/®0ÄÝ¢ãY2ÁòÅ%sœש­IL%ñ'@ÉÑYè'S®5”úYüØEJ…CHPbCˆQö]`4¶¥ßžOA'…c* édå§>ÿþÄ:wc?¼â]ô ’TŸ=`ç„(ôîˆrŽå¯¿¿Þ,­ÖÔÊöõ!8 +ì{S’Ø<*9Ì`ÑÈED(7ç¦Jˆò;“¦LÛÕƒê…÷PÇ…0©CgqéÛó9%T8Õëšr +v7lí0Y×G´|Ú¯.|Òåãý"B »¸×)£ÞÓ•sºŒM]r~,xíŒ7Û?D‹”oþ>ã'ÄXZ‘äxpO//3ukõÊõZ]´!¨ÀîþTÀîx„GË毊h”³Cìã, ë9dÏRBI„j$”Œ8Á `¨½ÆD­è4ºLÓ W‘»ôuÝEväÈ»€WLo¹êH\’˜ôÐ’…û8ñÙ F¡ÝÃ8ÚûúÒí½ÆCþ}Þ~÷:ý}üišø¡|xçÀ©x ¡Zõó@;l‡¾¬!œ% F’2ç{y¤úÊÙã/,¿Æ+L}¼i¨vuòV›Ê±ÙÖ7$D‹€‰y`Jæšn»A¿àÖ´#º°v K i^§† ß³ýNÌêEÇàµ#Z§âR!a#§€ñ̀ߤ|~sèB} {ý’¸~?¸B†¯\Ä›)XE`£+€!àÒúë@l|V,ßðÝB¸œcêßPk°Ìc˜p˜ÉusÿorŒ±yZúñ Îäs®õ„›Î$Oµ•P¢´Ä£eá tÂù7wùSž¿i8«…_>8RhïûI~™óÊŸBrÀjz¥ŒàГ{;ÉXßvÍ?°ž8ýN»~þýà~çž…9«K¦ýE¢É#ðe3#1y†ìßQZR6 +\ H&ÅN‰k˜.Z%€ŒìÔŸÐz“þ|zdˆÒx‹¯XgµB›]úY-_ʶÀ­WhÐÛŸ»w|èÁ¿þ}¥nFΟ¨é¦Ë¢ßŸ×¿ÕYZ>¹œ»ó:ȤŒ5¸44MµJfÊEƒC+— L¥1Ph®·û¾ÙpC„ˆ¸Z9ft4èöHAo$–—÷’ÑBû}ü÷lÂË%ú‹|¢¿òd [¤þkŠÿå辶þø·ÿîÇý¿ÿòÅòÿð¿ÿùÏÿïû¿ýçÿóïþùŸÿáü÷?þçÿùÇÿòwÿí¿ÿñ—?ÿÓÿÿÇ?ÿ?üÿßþù?ý?ÿÿýþÿ×?üÓ?üÝ?ÿÃßÿq_â§/÷¼¾ÁoОþþïÎØös+Vz˜A~05W8<´C™P~ÈSp)`_Ç^?ü- +òû…Ù‘§¸rî!Ή_ÿÂZƒAÆ-žã¡¸ðת±VŒ¢u$º`? +Y%ÐÉ÷ˆ ÔDB^cêû¸ÈÄ?¢ˆ È¤3$Õ±¢? ùà;"ºRÃøí7°˜ñž÷(ÙÓï=ÑIá‘ø[Ù%î&euXëÕX¤_³NÞëAÇ|¿N5铳gIÜ–b©lµèAIÚå|.ê–¸XÂöŸðµhFàƒIÚA¾Ï)eQžszÈñ§&ɼ µÉ +Z|h =R"ÀÓï給ÊÊTP‰X'sh%øÀعP…ß·át0è8»‡&;n–÷–-×´w:ñ(ž6«|ì•I‘¢²NÿmÏMg°ƒ­)škI1Y^-M;š=¯Híç“«ûÊ£GR5buY©ïì³æC´¦þ²,½Âj€1ã…¦ïÎÉŠ¬0"µˆgº8É‹ *ÜÂvg¿{Hì&fEð’÷­–½òýJÌtàDDíf!ŠI7¢0‚Í×ÎyÆ9°€âãèSp@lpÀEª1÷“’uz/{„(…ùˆTÈö•ˆ\¼>< nà“0(Ôû  ÈìX*FœÍÞΨv&Ë–TÕÎÙ+º½T2}–Ä m AŸª}:vÐû2hàů¬*’Ù®•níÍ·pï-KÈë3”shn¡ŸŽ†Fe…§D¸3]z># +¿Ÿ?І8/ò7Q-ŒSI9@ðT@@ Ô|G|áËœ÷{Mõ¢B-𹼈@g±|ó)domû ®.€[!Ñ°hæ!ò›žag'ˆò %]UéÞ!¢¸Íàü%JˆD–+Vã<€)ˆHRd[á9”—ß%E¿?!ñGÚFâ*;¢®ƒø!JvÅ ¦D‰Ž„|5ã 7ZUº«å8Ž¤›ä¬éñ^1ÎbjÅÈzÂG-Ñ3üÃ×ï†î=˜ íñÞ\@Õ?Wv!cþ@]Á‰Q„eQ/ˆˆ½\ÖJ›¸Åš#¸’ÅA j”È5…䘩V¥y\9òT„FÁ>$aÕ†³ã^ÔããÔò2­#´¢œ„ImÚ´-"蚃ìÏÝœÚQÕ›°y£Vf‡i³h‰*‚bõ³1V7¿"öV1¾ËÞCYÚšõ0*„@IJµXÅtb-jB ÇM‰=>ÀåX̱<ÃDz=ŽÂ•,ÍZÕdðJK$%»c:ìßœ§©Ð³×æ‡;½6¬£{1K‘¥ä¥y¡YJ2ÓÉíÀEŒªE̤Wl¶ƒ)ÙÂìDð[…Ñ@œ3cbÊ cB‚è·3¯›O®Ñ‰Ø_{ièÍz@[`¿~ûÕ§Ý"SC¼‰Dfº¦²æÔphØ+ð¢ÝÝ(i0ç^]ЩäíÊ!CbÔ@íNGØYŒ<¶ÿÇö‚U<Ötß»ñÇF,ëÜøÅU#‘Á4AžAD…ŒIÄD,)Ÿuêx;-v8EIË(UbwÔÊê-ã0×¹RFh%"è±_.#ö»8–°„ïŠf¾û»¤ë͹§çu8r•Fˆó +J“Z—’2i‰Æ««$Ds ´A>5ü.О¥îÎÌZZÌà{¸øyÓ0ÝÁ¼òèÌÇû†@@C-'œÙ¬qUÖ˜=À°ð£x +W+›YÕz· ìòŸ}Õ½J/¥ís4ËËžô)xÎ’™ã“Ѭo6¬$—U —˜°Š.ê½N¯ü×$囥ÐxÅ'Wý}^b”>H5 ‹Áˆ#bg>Fð¸5ã^la¡Æšî…šxú}+s$Øø;®Èê—RÜèz öDF’{$`X‚$Ÿûo½"¿œWª¡Ù@knñ…zÐÁ”>‚•€RÎ?ž¨–€C!bu¼òDŒ"᎜ó0:IÂ?{Ž $- +=(Ô?åØð• fÝ> 3Ï T<;HiTÈnÁ5]ö%;cœ€`‰=”ãJøã0¿ÂKp^å¦=‹ÿÝSBaÿ2hyØÛ³KÙ–‰xÀ<ºòPo£|ÆvBQ bo^ kŒVî—ó›óÈ*‰íDy.D)žÕx¼õ¦‚kÉ.]šÖÔCn2ü¨ÇžÜŽŒ6QôBðe~Ø9h¼‹)Ùróá-„è§{Y=¤É%8‰–zpUEû“#d?ζeG\Sî’}äH¸PaÔòÓÒs8“YV%sâ¹Pw¾xöºœíiji²ZSÃ-` k̃2Õëì°QÜdÍ¡Ù[B’ãö<Fy +×. B(yŠ£€_ˆÇjÖ‰Ú¾|Ò6ªíýh|F`8<‰¤pžù{{Sð” 6—å`M®ëðxB·c*ƇÒf‹¥¯TG´Ç?#â7Õ?@üÙWIR²¾9—fŠ Á˜ý*æ_˜ŠƒŒúȨ*Ý’Ãû±®8Œ÷ù ‰<DiDâjΘúÈÑë)Û“P€ŸóžÅêh&a£ˆ$+š§{¼3ƒâ¾”€8‡ÒÄöXG¹Šw›i@Á¦×…>û½í,öí{ðE£€eJST2bÑ_ø<AAƒž[SU—ÚÄ¢&_t\ J÷”6N&Åô?è7"Ô?®u®…H¤ðæÑ•!±}ža—, æEc $nÞ÷JQOˆ—Ñžç @­‘©Y¤Je¥Ö‘R³ +²Ó6$‡Ñi+ŸQM¡;¥ }èöÍyÀSYì)hZ2Èb™º”Á>4CÑ2îi±~…¬8„Iø'–úÕc%%g?Ô}+Ñ\G¢Ýh¨Ã¶0ݬHá7ò¶|ª5@»Xº]àTLwìAKÞ@Ôi ûÍ‘ßGJµ=ª´Ç‚Õ°O§#À‹fCäpÿŠÅö²²—`î/ˆþµ…ÞÝ^Kh[ yÊzU<è7 z‰fHŽûPšþÖ¡UíždŽb:Q/v'¡¹æÊÜ° £Gž¼—Šµl“‡“ƈ{ ¦áÂB¥Œ¢’F¿hðú›ËÞ߇ƒIÌ^c‰J½DT¸ —áí ;;ÚïÈþpqŒ3Õ•¥»=Z”sìhãð!sU5>^äkkï±üøˆöÆè…¯@ÖWŒHµúvD íÀ9’³m *„³ÞŸ©uãÃäw†"5>«¼ëìšx‹©)?#–‡YŽ O¿™ÝÝH×á`ä­2lùQªæ[Å'uêt”XøÚœXb“‰Ñ¾â>Uöñ‰u=øpiâJÿ£+ﳧɽÚkM„¤ŸqNÊìJwеéú +Eé=Ý=0§ìeŸ¸P˜§IYrGŒØ–(ÆXƒóÀ¤ùҸy–{l0`)=?Ü¡î_s'sjð2W ßq>‘!*ä‚WæU>íêº%¾²RíhµèëÜ +)]9VÇjŠLZe¶ —´4+ãàP©ë6ÙO—DP¥îÓ*‹TÍ,*¢ê\ ¬zw´T®Ë +‡(5K»×ÓàPN„}k#žXi™¢ `NÀGõ ™¶ýë:)_ƒõësƧ÷3òÓp\±z|ÆÔßÁðÚ©xd=‘^CÊN26Í5 dýFÊÛHû1­ûmæ%Z‚¶ØÛ¡šã|=‰ŸBóD µžµ4• ÐÉàU +hè*¡RÁWúÑñFóÕØIp÷¯ãî ³ý­q}ž'é0‰_íhbY˜ðP$ öÖLá— ÈùŒU¾ëŠ·‡½Æs¼ƒ8Ï> P4u-dȪTC +LÓv¶ˆûÝÄÁ§à¬€Qh…¢3øId'¸§¯$qì#Ÿ„=[ðÆ|›Ó€ð‹g¿4Á*˜·±¶Uê¤e~®iѥ߿§Ï¯ÁõsVC¦ÓûåGêW¸a^ Ó  ¥Ä4Øàoc«\0sß{d¿ÚÎ{â± +õ~`{ P EAÅ<(uàPÄ×ø@¯Mi`ìóÚ{}DÑf˜¾M)hÉ4‡öß!jCumÒë‘¢ 6`)òK×gÄjƒÍ—V +¼óŸçÁGk'”»¼{‹=¾–êŸ;Û#Áˆx“ë§ÂšÊ{±.µç9SÐÿ—j V żËFørSao[ŽB6s0[r"lU¢ev”À“Dà•òº’-OºuûãÅ`Ûiu¦yCDû…QKSÕ°†ÈŽÐœœÓQ$dêùM‘4ÙÇ»¿ W0Æþ^Pp>¡$¸ç+^ ôÉÁ›ép?‘ÜwÏ3Øö­:ïº ÉÏq¶+õ›“—±Õg/Ô"=gCO«‚æÒwÇÃh¿Þ—û„ +–¢Ï8ð+˜v¥“Âl‰‰9’ýÞ %vM‹bÓñÛq/‚Ý‚ë$tõúq +šB¬¨b–_´¹råÝo"fôÁÍûH>¢*‰™_Jbžø²ÄÇ¢ÕÒNéFÚÍž¶;jÐ…û±‡keûúq_ͨ Ö¡Ü{åÚ=Egʵ Ée¾JÿæÏì©ö{㞪Õ[â|BÂÞ—a‚N ¾SQu'jYùóýKεk)`‰ë-"îX—.¤»jÊõqžJ1­3ykÃp2±~21îX}bÏ +e¬ÚI‡äÐÕObUÒ8úé±ÙGº?ŽF:Ì/ÙŸ™ZžÙ·æЊùŽž‚jš¢¯Eæ‘fF~.NÊ1÷S]ñ,(øpkèƒS'ø-q†e +#®j׃YR“¹£ÎÎ#A¾óÚ^IÞQòi9p번oVÕ›©©J«# üˆElÙþ!“ÙoÕ·çyÎÛ”™Ñjo/Õ®§Ÿ+N«B§õ•½¾Eµ#U›Ö‹dUô{W°(”·‚…[Øuû“öÂJÎWôP ëó\îºÜnæ†|ì‰"c阧¢eÄ ¤ÇŽh*üé8_=ˆ?²Ž÷»™{}7–„ÂŽ©ËaŠê[™äq^L<¸²ZfkFy¥î®ßÍ›P`#Öˆ â‚¸S?¦§$é–_2Çã$Z±ÔÖÉŽSŠJ RÐKy*¶>ßD vVê¦Ý|ǫ́F1}€Ð‰-2Ñ!TzØ0tKDƒuÿŒÈòëÀkï\µ~}ª*}AA²Ì×rC yÂý„;,Ìsü€ÝZ-7e#œ%¨û[¬øòÌ Þ€N¾ç·Î€p.¾D)—K8üNØ +›‘h¬Z<ÂIÖb\§\ñføÝõ‰ü=®-¦/]ì–Ô~¶Ñ(7ò<Ùý V»†NçôÕe‘zQÕö´Ý™ºß~údL°|¢B°ÌçÁ$ÕŒ¨Jã$å««~b¥Ê«ËÖÆÒ`µQPí£"!ëXþ°Â@Áe$}A}ܧ 0+Œž@rbùÜFŒhsTauEκO›0õqèÔŽð/ñ÷ÔvZ˜Õ­@x¡ýMÃ5¶…SBdœY (£îMS¬Pˆk7A4ã7) œMQ¶wT£:O”-XPt2ˆ€§NDf1BÐá^ù¦UpzáÌ[l^p%¨¼}³½®ÔmÇ*ø‘Ï÷É~ܽ Þ(ä7ûfj0ï'†¡EÚ= {Oq@ÙÏy§B-Üч­x)ñåêÆÃQôü0Ÿ©ôÓñ¥ªUzeÁÚr¶ÙcWê‘F<úv"ªpªOD*ƒl´©?{'Ê PÚã‚^÷¾AD°­üÑz +hÌŽÈ4§ý + < +=ÊóZ´cƒ +ÅèA˜"?q!œ„¹ˆ|"ÀdøÕ(|íÝú"²Vr»õz&Š‹™ñá—h†²ït¾µs±Ø½Z&š¿:€g?¹î…m^dí=(Q l'º’9ž(0$î8Dõï;”—ŠÝm¢á‘£3ó~ JòI ãç§Æ£eÒ&lðÀ +çþÿG²‡Ûø<‚2÷ØœQ*. ”õ)2™ù”þvm‰@Qà‰ÑPvdk‡¤òïñШ¯îiÿoÖ&èó£ÐÔ-Ùȵ»ª­¶z1ºŠq£´™gªdT5ÂéL'ºúu¥X-òªõJ–î£F0Ã.ìj bC˜e?ÄîÉ+±«æ»°E3b…âpºŽû¶4cÕÐb©È$BçØÙUvS3£ ¿Æ,Md˜x¹]å÷ˆ"Iˆóž +ïOúˆj9°"±Yθ4òý>„ß7• +ùUgnóGÄŸNÖ„Å®;¡=E~sžb/‰åOÝÊJe+ç7;½8•ÍoŽåÀàâ÷#d ]&¨ONÌ2"íÖ›·ùÉʤŸ²,ﷀׄceAÈ€ƒð~hjà9—´ù_’"ÚžiÙŠAëáØteŠ{Ýâ^×Ûe‡ 7µZmì› š ¢qõucG•ZäàèiœðAx!©ÕRW"¤1ß ÅŒ}ºnÀE­æ@2yæ"Hû§Þ§N=“€É|"Šó Äi¢‡Ë)ÚI·~—%wP +¯R!Ud³ð#*‰½=‡E +‚z[×½ªµo"*õ®PÅ=jÅŸQœDG´;QÒ­Æ^ +0-¸>”6÷{U3Š zdÀ–xˆQלböûˆ¨Oýæ<0è"ï1… ®(|Úþ-ë¶E…vßE&h‰7—šÙÙ-Óž·ç+¾¡¯õ`ïái™´|ßG€ø”,êVìõÔ« [¾ô©Iñiy¦YæþQè%GTÊÔ»Ó er 0PƒÑ§NµÇ8~q}jN_ ŸìDùsP}Ž°Y{˜A+‚´‰ó0ö]v6ueV>£Šäï"EæѼ)ýÐVöë[‚ù˜˜§B½—„"?h?¹ˆÈ/Lµ/8V ˜uÊ¡…Xâ~ÄH@Sïp¢Äï´$ ˆúã (È]ì™ÖëBÓQÍÞïÙ‚¦6# ¯OêJdsëˆæU +TP„÷hÿ^E1f\ä T‘gHö_ä)ÊYâqJ BS*Þ3*à ýÍ]ÞU¡þûg t´¿‰ TZ_ØÓŸæPÚ¨B¾!ì=i"ØÇ3­ìQö35¼1"–æ‘Ÿq¯B’Ñ^M¾=Ï8¤¿Y”„æû‰¨Êª™Ƀ‡ÞÙÅfÅô¹.¾úåöwS2­FýÍù:p3vÔ:äºÓ +Î3°½–ŽŠ¬¨½çeÆÓ„NNÞ/,rUßDÔÀ í%ºÁW ê§(Ä™•ïÎÁY8&Ù£Ö ïœVZeb%`ïˆ^xGgQäw#Åy¨ðÓ¡jC„Ä'ÔhGOŠÍ6 áFPÝõnžyP.dv¹’‹ý_@h'¿Æ•¬›û ¶âî¾ù0ÌÑÅb¬¢ä¬§,öã"=`™ƪÍ3£œØöÞq¯ýÝÓM¦¢¿FD@u׊:$…Lžý-8Mû§Pò9@c +ñ–½š2Ûy-ö C²œÜ±Eüƒ J·\@Šq Çg[tY°1YQ«ËD;æ€böš!¾bþ¤ìºI_Æd ÞÑDÔÞQ#ÜÓÏ(G)#êµ#Ži„µ­IdTíÒ‚“§Ýˆ-«Ä@Ø„E!oZßë@öã¯"ÉöWD%ŽFnÀ¨V¹ñ@J™Œ“zÓ}©ñ(cöÌNn-ºˆa?NU‡ûí‘Å€-›U©Ãr`ÿb¾42­_md)à¤Á‘0Åײò¤Ÿ9!"X]‹Æ*FˆÖ#×-ýD)æ7Á~»³iù®¶ã˜%!ñÊ:Í@„,á8U'R‘l·|áÐ-ÔŽ[€Z#ÜÜ’À’™Ìã}§ä‰k…7LrdE t¦¤R/TÆЯØ6Ÿy5eå{êËK- 7éÏÑÅ1¦ !ød¸ÌÌs"·ÏÓ@ï.[ýDÉVmtDe JNßp0Եlj€«DDa-ÄŒžÇ2”ãBþÔ߯Ø;,!’“ႹÎ×A›¡ù3Øï^ͦ+É+œ—3(táë°N2vÄ`ÞiâBľÐÁ¸G >ú©ºÀè„+M#Ø@—ógRKZ©}”8H ™ó5*…0„ +ç9ÔÙôtÆ)œ?Z¡–¦4²kº–[Ê{¥X ÷ã­b’O?²¡Ž0Ï•‰ó|5Bžl“bWqÁ@LM— 3vBÓ€¶08d'9 ÀëZ +”*‚w&¸žÂÌ«œ¹„û:Vñ»Pø%R]ZÆ4ð&n)éøß-ÉW ° +­ +½×É´pÆ×ì©%’,–enŠ…Üîù¤ft¶¥2ýA¬¿ü$|îx_õü ÄæÍU\Ë©°PàBP”Ó˜^î Eø#NÔšqôØÅ +ÄSw—_Â^³ {4мžŸÆ*߀¬›-£…–‹¨cÃeÙxoËS AðrÜ×J…©K +ôÎG޺ײPj‰©þøí×ã—ßñ•¤2þ…ÊîîÌ–TvbT”þñDQñ'ªâ8@”4ðB?z¾ÂÝó $&= á†Œ =ˆp¦´3 bP€véÛÏ))‘g¬è_Óñ%Š²Dœ< ç‘ÈFÊA¢ + ¢^¾ +[ë81!_죅2±3û’HQ´U3>4k[Íè|,Ä`sŽÝCMe€  ,õê|•骅Ƥ{š”ˆ鉂³åÐm‰¹—Ôˆ¼„ëPÂÛ‹t·ðÝ2’Ö½p_q#hvx/¬ƒD…(*}I½¯îyÈÁ‰xÀªI¢È‡¬ƒDhÂH„¯K:ÔוöÎ(ÊD±ýt·W:ß“ø±@“ã—ìÌj8þ¹-"&ý^ù‹gH[¬€È0ÆÁ©%4%íPÐoJ)³Éò<ô5ÝëUº‚ø'=щÓÆ‚Ìï6°˜ ¬xHtsp¶³³’ÆÁñE šä}Ú…asÐèÆd‡µJTª‡¨7ãi'¥Øà´H SKB€¨ø·KƒƒŠH_¯Š¨BÊSYhg“>ÉÛ³)ƒ³:3ø|î•öýÖ©FlÒÐÎË p‘:Ý”…ˆÂó†FY8 ñMÔ –(Á³Íª¡­ôB1!¹G &#÷¤¯ç­‰B)ޗω€vƒ¹ýúŸd¾|‚lŽ>ªô‘7ž=7œ´Ã3¶¹ò\33pì·» +pƒR• öÛIñ™ñ£%f0!Z8ck̼ÆÖŽ° +æIÕiþ^——ëÎóòrŸ;‡º˜Htªhï°íAÏLW{è€í"í¦PV²©bÓQøØ„@Tü¨–^fçUC)Çí‡Õ’†¢Ò‚4.VÂj„L "ÀHzrÕ)|‚œ³¨¶,:ߎÓJ\<ÒhkÃÌû,(®1@•†´Lé•Î…ä´Qö¶GèUt¿HÙm§ð<¦_n ·¦ËQ¯`ðõ! â~>âU¤ÿhÏSÔ4"GË:mÙÑùN‘·(íEº˜]`†È€tóK”+‰´ÀEeõGÒZ{N'ϳU ñ¬Àûߣª¥3#Ü?u´'m +žZQ´9Í}`ÁƃïèÛ=Þç P¤’o”Ε&†EFùèÒÊZö˜˜¹+K—ŽÕLÒþ'c!’¹!„”p9ÛI@íÝË"à'Qþ[J8‘Pbæe÷.y={Ñ({ôP—“uŽÎq¢ˆ +@¢´A÷k{ð¥¸I5ŒÄø.¼Šû§ç|,ª!DÌüx)$ÑÒ™U*ŽNV¯lÄû£#*N@GxqbÚî;?iZ´ô•4Ljûhù¨¦SmxPÍ8[Dæö†—ÊËPrU:?8ÀóŠúPÇ‚vNêzãŠQbv°i¸À+@_d²ÿ=RókG¹$JåF5#Ä“T¨xè5¥A=ØÊ3=GNbQG7‚GFD{é!òšŒ¢JQ¼ÍDÓ¬ð£+Íž^:¼¾p¦¯BDH(l"‚²ÐŽ(¹\V@‘¯'XBÊĦm¯jl\H±-/íׂ5 t(b sPQ³‡ý³‹–©"/Ä$("™6š™÷ð + ùÂ+I >qñ°¯N¥… Šyï'C›4ü}þbíµÑŽvI•0‚åÓØŸ7Rƒ ЖúhçØ‹{ótßL»š•ù®ØÌ—€¾¥Îç}DepIðJHªp² ôÖÃþ¨Í®+:­cÖbæ{ºz¨òÐÕC ôìâ°#ÊÑçŠÖÞ²åûŽ©µÆVàÖKœ¸$ «JŒä» êÁ$†¡Òl.‹ÊC?öEÚ/]ˆ‘Ï°§yÜΩD^zº ŠÏ.?…üˆq^%“®˜˜i R•„­pnÞ#yX»zøAàËØ$Ùð¯¿ÒQVxŠÿ0MqL¥VTdÐ;Þ+ãš¡>¦åÈ{UZ +CWSˆ%Tbïécµg‘ƒ³ƒLÌ}_YÝ!¡Ì2¸>Å @o^D$p'êÄX­Féã¹D%^šCá ¢Çìë#ˆ»ñ¸yéM¬kòGBþpC¼Gù©ŽÙ3­Uî…¨IÒ'eÞ¬Qšˆˆ±''¥*«f-ÃejA¨Bóã=¦üÑâ+¸?à5.»fZ;OÏùÖ”l3ù½½czÁá)Øäe©Ó¥n´‰-*}nœÈè¨ÄÅé¯>o…dy„fŠ|»îȱTû`;”¡g:¦ù…´dY,xA’xGùî´vÉ+–ãŒËQ®Z6XئCâGïS9 ºBò¦Â8áJiÐtcf™ç ÌÒŽBú´(€>`à¿ÿ@C½²‰àMk+ô¢†¸p‚"²“ã¾eÓ$ªäèÌ58BõŽâ»J©%J~=G +Äyw=ZŸ@§0$ V¨¸Vv¾°lD™h:(x@ù¦|m}ÃÛæ8YÓÀØX Ry<ª©îO¨bÑÛGÂÄý9[Wxîèž£Ê %Ã:îK¤ü}Í^p¾`=/v_¦ÙÞ£BY +𶮟›®zä·؆•åÇÊ2c$š]𞇒„mêMäw•‰¯jLí:%¨j¶Ö¹C<µÿaBk²ã£#!C85Ý1¤ÆÇIÏ¡OODÈ\t±¹F(hžàv–ˆyŠ=õÓ"#JÒ“!þ3VçÈÞ)P8<âè‰P + ?GûT¨X5ü‹æ]q¡_vݽ;êð¢ä”f:hÃPÁ‘Ý­˜œPø­ª˜«>áCâ˜, ·¤ãjhgËÍVž£$ÍOæ[iåÂTCßÃýHîMí/÷ýíFo9¸Á-…žTÈ^”#º¬´Ë˜äû£ä¥#Ek§¡$Ì{&É‘A”@‰°0©À +Xí|:Ö%°8Í<{çÖõ®‡D¡Èœ%o!M¨ÂŽr³ED²L(€"‘áZªv³œ"¯¿Jý$,éÍ×…´,OHg3=*äRý:Tl  ÁþÈg}" 4¡:0ÚQš2ܪÿý«ëð¾@NGÆF—gºfo\HG`Á³†0ÃÝ‘iµÅ\F"m=‚T)Áv÷¬'ôoC\ÝÜeJˆªj¦ÈÜÂx6³vî;LQtéµ¥-á_Êx£­üœ t Ò¬úc©ºŸê#^M¸}«Kñˆ›tåN­Þæ"hm|À Ø6Ø ƒmƒzDƒÃ€Þ:¢ +®{ÇfY"ú®{@ÆŸ:™º5ª uEðÊnb`è‚1Zßói¯‡jã´;<´ŠšÁi†Õ7>ô;÷Å +F>ëF”ʲ•˜˜—÷ÉÖ FöÎY~$ç'=dp²$€"J[<²l/°¾¼øîz;,¼}ëÐobžÆ3óaç0CdÏQ04ÓlÄ8œ¨¿+ˆu46¸ É™ÙàòŽÑ…«h:¤(MÚ=›=pLÕ‚ö¹iâk"‡$È]-x¤(uúhÁ c7Håmsæ8::&ýË)JéüæjGeogçTLY­¹•:!êæ’•µýÑþ|Âþ¶ +}‡§¹Ÿ¾~áo£Xw´ísž(pD•gU|ʉ°²¿¦¸a"¨U‘ž¯+iÌòÙf´ŒRd¸õ@‰¨ŠVÒêïrÈ"E9yF|YVä×…(ÛÓ&›ÂÓ\q¡åЮk ×@áàÌ_À¨©j<£O´´))¡ -Â9Ùç<£©êÀ¦©+í‹Œ‰ )ÆÒ­—W„Ú{€ +!ÌE­†þ„nš¼.·EMˆÌfø¦AIØÝ `aV‡X#I¢Š›¼£€²À´Å0C/¡?z ,›„üÝçë¼fyTP­bS—àÕ¸±YïÍ —… M²T²'2¨Àyœ Øh®3¯]±ç"™aø B.34ù6B$Á’?!á춗ûqPÆõÓÃÂG +-˜½ÊõÓÈÁ¦ù¥Ž;φn†»ùâK'½Q¦B÷ #ZŒZQÎRí±Ç÷.8vd§3Ü€=Ó•F­óG‡«N–<«Þû…´D?oàvYÊyX~[V^—LyW Üžëø6 +þÛ°PrÞæt<¸‘„iÊž´ ÓUÅâM`›?n>Ž?ó|Á"·¨&ð”½"V?µ^ôàî…˜û×I5 +€¬cÁAà¤NAƒb"ÜÎ".ÒÛ‰ðÏ*+ vô§Æ +¿€¦¸Àl6à­ñFäà܈ú~Ññ¶Dó\yz˜€Ü¼u  {ÉYi I)–¥ ó®PSÆ”ýfžD©KC”Ò—èÒ㾋Úèö”¼Ó²eDô÷Š‡|RR¼0žp=ì‰ ¸ä@¢RhôgýxŒ‚bTbáŒA#Þ ÂÇ,ñU(툄Š®Ô§‰ˆÅ˜}žƒŒ|ã÷”¾äº3…dm–ëTäX4`0¶©áR7Šê £Á›Š0ûY•Y +Ñ +\)Òý°](ä%.hð¢ßˆŽY‰<Ø+±»ÖcÐKˆfá.mÏe¹Â¼gAPmG1o¥[æÏ:Üp¥ ŒÖ½¹‡L†ýåz ßš*¡þ›¬O ãYB4Š‡ç=饹Tzíh˜pøE«G÷xNtHÜó’#8Ht†ö}±¯_êŒUóþ^WLaî R³@;în®Ç<²úa90L¬À^pQåŸoîˆvÃqã+´vÇ}4#øò7÷x±w†ÂKÂæf*?dçd¡1D‰R¾jƒ +(,IJΛŽšèk¥ØǬêBJ´ =[<×½l.Õ`Œh'"­_Ö\Ur滳+ €¸ÌºU˜y°;¨´´1|b8ÙÓdÖ)FhÕdDda¡\BDhŒ>1ÿAët>s‡ò<˜X_›#Tº@пj#vÖ`0“iõJ'Á’æŠâWY{£ ü}Q¢Âðb:-ž 5Þ"•Í)æ"ù÷¯ŸéÜ–XL9tç©ç4]Ä-/äé/Šî‘%“²ëGCæ¬T5Ø'“‡0b–ä}VÒSÀOU@Å_$óžz;%eÞµÀƒÒŸ.õ“Å +ŒÂ„¨ÅÀ²¼±¬‰`TìÊ-–´:@’ˆ©Ã%(ÕE½Ž“uwôÌeÇÓªz*ðQ^Ù&– ] ZŒ‚Æu#ÓJE/ͳŽÙûƒ6D¬ò©WÖcÀ2žÊ7-©vøµª/MóÏŒâjhëgq©¬8KêÙœš3ÈM}}Õ— å}°úÚëŸH3ýµÜTpÖ³q¦ A]¦cW¦9‹Sª¢õ2ƒxEûëtÁÄ´Yã¢æê`QN—+E;oJð¡,bРĈ8_Éü¢:Y_áO8bR¤HÈé!¨¦ +€-;õµF8£ªIìæzµ—m!²r„`_éw³ QáW€ÉHWX) £ H±¨zæ£úÍÜ=pdGÆ bJE>’€¼ +¦t¼Ê•aw\÷¨^úä`ÕÅÇžcIßS¬* Ä~€Î§B²O³§fÁgû¼â(g,Á`ö«ýõ |ðxó%4XÂö`\}³‡Öµ]øDr‰¥q ÅZzSIcGI WµÉ|â±,„©…¿éÙHRzÈÞHâÍ.PAÅìÆÔ {§"ð‚Ö)S„öÒ ņƒ«ÞC\Ø-âŠÝæùþ®ÜÑw½ØE³å¡?(Q–Â+©pÅõ­l¶Žfô0JhK†Üûk@ͱböWE#P;93£ö ËP›º¢ÁNÊ!DX¯xš"±Í•ž " e& Yr‘î—BÒƒ°g‰¥R•Û„ÂP—ÔCTÞ +JéqŒ÷¹UTÏØ©Jº_HKÅ-rÜ +ê~^ù%$,{Jæ ŠvB+€F¦²Ê”P5j”HD×Ó’ªŠ"1Óõ”HøæÐùº’¿i_ í]>‡©ÖÎÛä=U]³(“-Y%4õ ­´Ucy@”Ï’Ô”x§ó Šý—3à‚ñ#ú£rÍ5cÚ/½0s+!œ§¡D¢[Jq–¢7«Œ)*]øC"—Êê²'2¯x`ET&e)$*¡õí2N L¶,»¯Ðâ ç‚Ho·ö…˜lÖ)¬”(“@•M¯‡2Cëp0h{Õ &¡áñẖ³@‰üS›CЙҲZ«ñúiÉ*éXØ>ëÕ˜@<$Ù âø9@óv‹'{Y^Ò~Äóqã>Ìz_™¨RÔðËŠý©iê‰åæõ*â—PÄ—1•WxYfq!‰ï>r¨6VÎ6;BÖ&çŒ=Tf‰H×€!T4@„èšürv@Nîß“— Ø ¥`#V|€M¨»¼¦K¶ãTJ˜çÁMMIz¢êÕ$cÚ©¡º ®OÅá ‘MöC·šwî2…ö㱆Ϝ‘‘6Fß“NÈk†I˸ËÅ*l¾>¤$vW¹´/ˆ Dùåý!ž¹Üá€jC¿ KUtyûÒ-ÁŠuJ2(Úƒ‡v@ôÃ)Ìáµ;<ÍŒ(f8¢vñ7ÿ&p%N€‡Ö;ù…Dlˆ¤Å‡éÉìQtzAÈŒ#ýòýÑ¡`¿?`ÀxÆ–¿Ó¬VKøIœ ++yoVÌV¨Ð«ïçC›Á®‰§Y)±:ºv–$ŒJ¼SÙ^ý¼ ²„‚[Ñ‘uÞç•ewÁemq øH)Ý.!>9^bò+¬Ù<ªžÜh-+/¹oy ’lìvž ÔÒÂ$ ·¥oÁs¶oÂSÛ÷ÂMRÙÙ-L¶Ú¤ÕÑúE'I_û·ƒí·OjµÕè·°k úë6N@tBóÛûrôÁM}IJ¸#0-<ÐûJÉÞ/„\|=©Õ*„í“…ÿíÙÍJG´ŸÉr™ŸÃ—Ð_¯HȱA8Ú*ÀÙ¾=ñºOa`—3+ã‚æð…0CßÃ/éI6C=µwÓ‡&k.KˆÄµüG–9F Ñ‘­7NÉKëgHM×àa÷ýÓUÑ&—^~ó:ö\Ùy«g—βÏƆô±“=“7òRM«u?ÐП”ã··¯s8( È­=…—…7Q§ÑÓ¥TFjçÉу<(Oü7z¿'ðßÿ÷ú¿úD¿áAÿÉþç;;xÉ}åQÃyê‚F<Æ~*)åðE”Üç 5pìù ’ºçô<”P2‚ªƒ\ûÑW¦0ž³#o{vr]߬ìc¶xD307(ÞÖ17˜U—ù¦‘…„=FOk^†ü2Ä K‰1Fbb:ö ¡x²Ôéy›èŒÑHÊ3B0¸Gy²‡A„ç¨qŽègæ¡öº’-‡•Çs¤‰5¬! 5 0•ÞŸøÕç\2Wj sPm’¢•Ð>ÃŒîœÛã#°fR!Ö½w6Â6ÕÀwoÍþn™#Ñž ‰åÀ )ò¬ãˆ“ºƒ—Àuj!!ç>KÊ+QQ·CönT…Š„Ê$Ð?ÍéYèÙ³E ú\©w=•÷T3€„˜ÞlªAQýÜ! +¬R»™½°9Jö€Øijpm»Kß„«Ñu=“T\Ž¡Ü_2ÿN×Nû vòÂ÷~š©tK™17¡„ÊŽ@ƒ‰èúL&¼ñº@o@@qø)뢿O„è<ÅKVØ3ˆ£™Ô Z|Á”óhvì›Ý®Âû`Ut{“¹*ˆ§¹Æ†šL}•†½Ö¼Á^!\ðlb¥DýW®{ &ÙG„WZÅË/äðóóÍi¬„’†gD#$BV6ªÊgÀœɀºp/óDe„•¿±- ?[Í> îa®Èæ…N€âèðªJˆÝßžvPÙ«S§·Ìœp?…èº*í Q±¼²ÆµŸŠ•|TÀ`?ƼšI]''"ÅÈN''À{°án•ø8Û‹ŽmÐK“mÑbBœ36mèÚŠˆ€w_¿Àjj1ó|Ž ÞŽ¡¾Ï3¢•¾#‡GD‘ÏÞ?a)· 3ˆ Á‚àB·£×)ïRºíØ‚éñU†lP/â4§"Ù2=–ƒ`š?0Ü1)X_ ”ϨrÔåA}±‘AÞrd“wŠ„.ñ£:Ž T« ¼«ÏJ +8ó‰¨'â°bú!Þ}X³éÞßKM20®6Ýš•þMÄw£õ3ª€ÔX§“öý蘺âÇÒYyf€E¢`¸²¼ò>MëW ®ô‰Î<(D-VHb*ÍMÏ–'*7`"¨¿YµúÅJ5ÖÀ¨I&½_k¹§ìë²ÄȬ¦D ®CD§¦GM YŠ] zº^sOÔ~ïÛÄAä©X¶ZZúîù›g5‡F8Ö´”)c?Ò:®:òeið\]ˆp{Þì®5«O²9}g$ôH3®! _õ:3À¶{ýÝêŸQE ºþçǹ¢%,HBTÝÛ:ÕñÉÌÔÂëb©M+<†íyL¹*-D©CÇdD¢(™x1BÈÖI¥T©Ï:AüøíŒì_ÍC«¬™ç¯#Û‹€°"Ï|¡Óí¿_²¤hf>ÒÎd-®¤“Å¿u±¯=ü ‚Ú#ìczŠ+¥hîq@;JH½´³HJAHË{ˆÝÈFû:Tu#™ëºÄàBO«犌24Ðs0\ m…þBü‚öXBI6LÇ'»öã¨UZ‡=ýåØj¥7 .¡R-×0’Y!qNHð¢²õOW’¦Ôë’á·¿Î Z­²ÏÛŸvz9îÇÙÈ«º€›ÍR=žŒuæ<®Nä~a•ÆŽå @öÊ›FD ²CHq¥¨iÉBU"¾ØÛKr#5¸ÇùøRãÔˆ@b™>H·ˆÜbàçñSR6ÃË”jéÏÍPv/OY‚†¯ÄRK =*ëo¿4¿üŽ/ª„Åq‹utBt²M ßÐA#ŸD4ÇA‘%Ô¦H¦¦¹ðR©RI^à¹*²ïÔOòj½X'úŠí ¤k-8±°V—ˆ' +ÄÓó¨S¯†›´°±PÂãí|H 0¨(£1Už`ÆkŽ6 pÈF#7‰( „R”ƒó„ö«&ÛuÉrûˆˆ}Ô}Ó¼ÖÏ(vCMIô .±ù ÀÍ’fˆmTjFPfllØ´¢¶v‡'D.o2½q¨týf?4çŠq4ï‰pO +ñÅ•BÓ¡êDÊ ‘oÑ +·ë0'ã4Gž¦6*l¶IØt Ð\' <˜˜EEÛ¡A\ˆÏs(_]3[U»VhÌWœz9ZƒZ¤Å2¬g`ô@Ékâv­$! ©êÖCçï·èÚ¿Vʲ{w +4¸ò+©œ‰¬¥±wRý–+ >Ö¬oŽ‹Ÿ·Èš ëžBÄGÔ¡øíŒÔVø † +ÎRM30?x¦÷³€G[fïÊ%¿Eüé´MB¹¦#aÚ¿;Ïl6@9¾‹É¤€p`0Rn~I6Î>¢°È²±çº\ãÖÛÂj^äÀ=YŠé4/Rf}k ž´Y%»t¯ÔB,‘Îác/Ê)sŠž“‘_EÓ­ÁÛ½Y½–Ô‘N!V·õl5s¨ÑHU«_}´¸ƒ<s¼GbÏ6T”gè¥Ò»çÇd®5š‡t°âsÇÙ:Ã.â¹#C+¨iÑ +; FLêfÜ{Åô÷½ºD²ê^µqÿ9oÎ{¼;qB%ϽïÏ÷öð[A7Øá“z>ú7ùóï1©]7m„Ó…'¿ÚäM‰Ë,t‰¶¢-² ©2ß}é~FáTKËæ «SElftÆl°’(C]ï*s£fyµÊ5ÜÓÞËcø ¾š«Ò + €xÒŠ"tö¾üÝX°i-%Ò^y¹÷ùÁÄä¤MÏ!a!'ŸFXj{¤„`ºF¡2å +ôð? ˜Æ©bÝéW(g¹Ýû¢q©û`ºbq›}feqìp7±«ÚÛí÷²6{L´“€xƒ0a¯OȱC§eÂJãröGèùrP†66äËÏÕ¡©ôÐ`—‹YJ°\ˆýúl!NŸUio/CR+>ŽXÂC[÷ 9.iž¦ZÑm8h†’«Í“j¡MñT6…ý…Blh§ÁˆB—Ø$U ëÎŒ>ëd9¨V“þÄoåB¿ç í™ú EU§¸—‡‚ÃÜÇÕ‘µqxøx]…ºK±õ£b{£Kºmí{ÓPgha²–ýŸ?aÛ:ë‡ò¤#¾ƒNè”V×9øÛtٯLdÂ^HµÛ'm>êêQž+qŽU[}]ˆ<ͽÂj‘2ì½ÀàŽdkêŒ.Þ<ÐÚ|G÷Â×»zo¿âºÉe¢¾AÊj;6$T8À¸… +ž¡“A—o_MžÈmSBGù¨Üià†ØªG¼p/úE¨ñ™ÀÕ›A }JZ£ÂùÉÒÉ ¸!‹Ý`¨’¾X{gŠÛåÊø×pÌÚQH¶D”ÚöðDV(œ úé§MÝb‰MùF˜1%%Œ°‘Ÿ@¾®„&Qí|f-¢Z{óº+ÒÔƒsñŽs-'{Žl>·ì±ÿRsãYÌÈдçÙˆÚ&K± ZŠÈ{òW‘‹ìBÍÍ’‚ÆJ‚„†PÀ˜  ÷¨‘¨ O9&<Ïü²aLµ*ò ƒ.ñµáÎÔ'û.@éH-¹@H¯Áx  ‹<»°½Ç§Ïòá÷ÿ0,|Â&‚ %»bnu‘Çú" DŒˆÐSoµ;S¼$¬²rȦI@¶YŒ$isP‹XFF¼Í"ðSîlnÏˈ[®Q,§›Ëa‘jP[$r”ù9ìøz†.&œrnßDä]©’̇_…‡Ÿ£´™a+"¡¸{Ž½óÒk`ßäÂR”êj éøœ.ÞGÄ[¡ÁÛõ]½í©²es6Ò€ ¤ÅßdµCý—ÝM×^JÉsèTû¦\'¶|Pz”`h;*Î#®±KOœÆ7y/¼ìŸ—qœÎÕý€0Ç%“ß¼[ôziŒN‰èƒ¢³#îrVÆב°CÚ`DÄh¦ÌÍïÈé$Hû›”+o&Ú-<‚†Ó¹v衹º@šd¬pÝB,¨x‘Çy‘GýŒˆGÒÂÖ Äuh-­ƒÐ$Š„µÇ&A“:¿(í%2ï>õøˆ(ÜIsUÁ>£$àѦL"¥ XµˆF侑¡ kª’%’€™Çñ“ÿˆˆ{FÆÝ,~V¯?Ï“¢=Ã÷ð!—˜åùÉ$e¶ŸùAg΋Ãø9 *š\{ŽÞy-¯M>Fì }3½¢uª9°¸ÈY™C[o/ZNžï÷ý„]¹„@–öÍyP*“kÇ{Pc½Pß ¨aû.ÂýSë›UòWYõ ~'í°˜QBŠlR;™ò;8²Ó]As¥>auÆü¿ „$žc¦ÇYºÍ`F¼9ä‘Ý÷Y¡ˆ¡Æ9u¢Ne™È:AîÐR§ø&<ö˜Ç ('`•W–RU¦æçQ¯xRåÁÔ² ™•÷V4 mZ¶®ßDä@«BݾýϨ¦!'߀ŠÉcÒB¡À´PQûêAXzÿГEšOÔL†:õRå,1§sP3¹b7ÒýœxTmX  ãj« WwNÖc‡î²â©‡â‡#Šë™WÞ'Rnê:‡CXÏU¹[ëx"%žH?ƒQ +)0vNŠïн祌B%´ÝF¤Þ÷ÆȽÁÞ--‹Ð¦·àŒŒ +ÞGD`áƒôÖ¼Ûž(eD{Ȉ*‚h±i¤‡ §)OÅ—æù –>2õà¶-Yñ'Jm^ã!XM™Ï‡’£ƒ´Ç~;E£#D…mjšÞí%çë—3 »1ì1Ÿ0àö¤3]_+²ç{}Ý»ðˆRë[º™ÑÆwƒd‹ˆë{ÄŸnO£MpUªœ¾ŸgôKßmUõÐ&²¶D®ñðíòøÄjRuî ¥(+”ðÉepŒ$)UÎQøÏAåë;G“\vHÆ”ùa¿ü/ÖÞfWz$;Ͻ‚sßP>ƒ2ãAí‚aaãLlBK¸Õ‚Üà»?ñƒ–Ì¡?ºaµÛ‘š¿Ã*Eþºó+e &è5g¼Î/žs®-û¼ó`ny°W±4Ü/ ¢ÇOCÅ…µK‘€ÃÖ“§>AžÛ3}R<³·â5LäÐä0›6DºŽ6­E×ÍP?çðg3x¬V¯ÁSc¨°{RÅ'µÓ5¤ê¶&*º­G|¢&âA •ð %¦;µM ä<·Z ëtÕÑ^8Ê^õu^ÍqO‹S›°¢RÅù&@Í3rZ´žUŒÁ`ýÞ†>’HYªž.rR´äNU—|¦ªy†šô@P”ä-~# û ‡Ö–@Ov·Íì©7;ÒO[§/­Ò%<ÞTí%Dš ‚žÖÅÙXãûŒÀîšÍ1²7O‹Æ(¯Ta¨eáy wÐœ¥¨´kÝó£ösC ×&Z9ŒvIS'XQ¥å' +8¬˜×x|‚Žˆå@#×XôŠ_¸ƒC”_¸­{HBÆ$§éFÇ/u·ûrMâUV£ºÖ¹q§ëkŒÜ}¥È ŸV58 + Z¨Ž¬€ÞÝU3a#’óXŒ%ýRL¿ìÊjE¶q +A’A }¹ øHáP;ÓŸxnV/`²’ÓG}=r\>Ê #B] »ŠÜ°ñŸ¯Ö®6Ë5n ɪ’¹ÌÀ/æ8î-=AÝCÅBC†µ)íÜ€<"€psÓËCÏ"JñQú45ðŠˆ.­þÔ8ËåYP÷›2µc.bÄÌ7?²Ž«Pô\‡ + +1Ò£‰šrYoH¯=×)Qo9Ù»V•5 @ÂæÚßÄÊÖt’¯¸­ÊVåõd¤Í¬Û;iëÇì'þÇ"AݺÉ3»c4¯(´E #ˆ»¡Eák‹½5hiOËöã<0^-ÒØZ"ÄØf@a×mäÜm›YÚÏŸSËŸ‘?~!)}Å"íÙËL‰N"8h'ôß0ëýˆP žj‹dpRŽ÷(ä3)F4ëš´xûÕמi Q>ÂØF^üõªí9pæÀ˧žÙÊáü˜ß|œ¡£wôäLVÖ0|}¸RŠZ“*ÂJ_h†Y£ÙÚ7!?.xaÆíÞݯuvÆÓ1ªŸQ²;~q›‹RjœôT‡è9Ÿ:‰ÎHÔG©ØiÎV^”öd-þ 0Ã:°d?¥‹Òd[©šÂ†l¢¦'ô‰ 9÷ˆ”4Úm2ÝÌãõu]a@È+}·~mxιøË»0Ì@«ᨆ1œÏµ•Gßä­y'€|ïÆ­„?:(E…³‘ õásyŽã©~DÁ…wºÀ¸Ï·clµ×;ö’`‘I¢Š7BrG=ëFÿ÷£a_q_”ÿûg”H*ÙS©Ÿy«PºÂà»°,S)’).+ýÑ…ªˆµ¾Ç©N×fµ  Föc§`®ZGÿ¦àý1®Q¬~ ˉꮢP1—k"‡ÆˆQ7ŠòÀ€Ë”d|º~ºl¶0s=Ñ9ŽGlmý¢§fzmÌ• +_$–ú§¨+Wf£`G‰å 9,®=Iôäql¤?ÜßúuþëÑ>%1„s1Z>®AÕœj€Å+þž©âÚŽMÆÝ¢Ê*Mi¤®gV€ˆÇ‡aØ]L‡J ]"÷iësÚ'RØ÷‹ês¼G úh!¿”ä¤â´S~˜û"ö¹‡jÉ5ËÐ7†Ü¨né¡€íG@‘+ö5?|D)ösê~Ae¾­ˆKqåÏ#ïÌPkæ}$Þ¢>¤¶iî›…!ÀÎÇù ÏÙ€fyçPYgN5_Þ#^sfaHCÙ…ù8ÏZ÷”œ‚àz¶pêŽ#è.pf´r»WbÍí^m_ݨ™ƒÔv%êotšHö!9o‰öiûPå§Ø$BÅ3"ß b”×ÜTÒ}™i‘¤}§ÅÝ+§ -q R” …ÎWì!Àz½P¥ÎüÛÃÿc$vî M&œ"ËnÄ Îªøðn›¥ø«ŒUoz'÷S44J‡cÄÔ¦c^ï­yFëÈ-ã¨2&GRˆŽŒÝµanbdlŸÙ6l‡…çoÎ¥óVÛŠÎlàýÑ ]Ûdè«CŠ¡xh*à(æ&—båƒÄ+"ª¢ÎÀoG¹óŒEÞŽAÑðƒÖõ=H(! +Š¥¢ ™smBhLÿ¼Aját¯Çu´ˆªCo ­‹õñ>·?å= Öxz…ꈂ¢Á¼ý©°X¶…z>: uoĪ¶'ßœ§o¹¤à}ÆÆ÷^‚k©¹Q¦+Ò“ÏSùŒ:¢ÆŒµà¼7ÿ:tñz*<}l?_|¡qù›î!‡›\ÛVõÜZoÍ1žmõ™Ž¿+£D$O@Ì9˜6Pžõˆ-r¤Œ±mäéoE€å+èJ¡™¡mûå¼&ËšG'F{®l¤äã“Œ=õyÔp m»×þJ†AžÛ¡&?"ôÏé¡H‰5E\é X…n$9fÀ3(Ò³=÷4 +¹§ÝßEàõzª{ )ù HߢÆv`÷ Å©ÏÈ8)çvnà%?‚îÜ ÇÚgD®¸¬²  ðÛyŽÍG¤¿ªêo BŠ¬ XJ)›Š®®<£ûy¾p€1ŒÔQMˆE…“(Xµ¿ÏÖ˜Im·Ù—‚΀©DɇöD";2°¤KŸxL9ñê®ÿ¢tô«¨ ¹‹u4Z©êUu™X¦™j8­.ÏB‘15c^ί-’Ì?æÚ!BYÊMY•=ÎC@ñPV±îj>Rù\hSZ~*% - +õ#¯Xï]1!•Y@RÔÕ¥fÛòŒ/ÒÛ1·ÁÁˆÁÁ|´E·FÖ55•‡/¶ŒvZÓ©D¸ب%ƾ¥”:¢ëÛ¾ŠI…ýÕÈ•sñy˜ *Ú [Ö0á–Ó)&1¤žBû–ýB­¤×ŠMÇ&L}ò¶S9?¤êáÒö ¾ÖT¨= P+ C„‡«"ðrÖh´¯~ëe·Þµ°§Þ"PS°lmzïQ¨r¨'‘KÁ\ÏÄ íb߇rÞç >Ùµ;­:çb«oËpˆH bŒÈL ýA±YC‚ƒ»²UŸ+\6·¬ñ©ð¹+‚S„ÊšS +¸weÊКZ}<È`#þMäÝŸç'#ÿŸeåÿ+Ovü 4ýK¢½ÿð7ëÎño~ü·ÿúÏ_¬üø·ÿþüŸ?þâßýåùë?ýéoÿñï÷—ÿëwÿé¯ÿîï÷óÿáÿüîÿãwÿáoþîOÿñÿø¿ÿ!ýþÿßßþÃßþõŸþöo~·.ñ«/w¿¾ÁoˆügþB„Žæ$·Vd°ÍV 4,}¤ñÜÏT|eÞÿ+²…+ªØ÷h¶(™õ)³dí<Ä>ÿ¦@U6Ì*ø+N}«X€€Bøhê[ŠÞ;pÚ–r¶xLu.«luV7þoQªŒ°Ç] d/8xXØ”Ãs€L3bì´•yEDžXñÆ©Bhª:–˜,Þ{n¤îßÙE˜óš‹4ôIÎÝ\ +¦døŠIl3E1> fÐ1¢ßF¬¬,‚µeb¥¹™Z9­˜uËlÈÜûüQåOêoWõ×"œ©ùØúÐm£˜ˆÓùÿµKYs—²@Uѻ砓 ŒÕ î²VŠ¡uu*Q+]WÅòïþ”ÇbŠ H¥t¥ˆ‘•yUðÚM<50 $AÒ«·ÑZ+ÙÈ"üë©ŽóªÙÅŸE (è@®D†©¢³°µˆ«zÛJöSüîÁ£uB®¤þÄŒH95nŒS™Fêp:ï˜Q…A“bQïÜw(†ÇÞÈ…è1Q¸8$ªEœkGºÏ£ÉaÒ€¿g í^WùhˆÔô6Ì(æbËŸ¢»¥Q¥r¥9 :vAÃ9yˆUÓÎý l) Yy»¿gbóY4àŠ=œY=u೜öõƒ‚òÃfI©IA}г=ç¬ÅZÿÁ¾Z‘Á×gðì¢ÿ?8†ß<õ-ë›ìz4¶¶t4öù?¢z +ëô׸S”‹¡Y%’\1ÔЫF4Å =&ßxvÉàä?>u'{X¿zfÍÅsˆÄ á^JåŽï¡hß"u§µ«©”SÆ=Q‘Ú¾}›óqSƒä©m§}ü +-H0Íßψˆ99‰”ãu¥†í¥ð±¥Æ6‘¢Óã €¬”€V¯ÀÝLÿ¸§Ô[…µ]ýSô;—ÂêÜéQ;ÒšÀE¶›•² qX³ ·D¯Š fðù]ÄpÓÆ^›×瑼G‘Vžà„¨#ZÊ©AÕSƒ8éΙCWl& Ûê&Ý“ÿòàuæˆ;…Þ¼÷ïg1­_SÜ .Î ÔƒžMA¿0iü{Äwƒø#ŠZ‰â«Hh”ö ùÄÇ@¾9¿cò$“££=]õÆŸ}IZýÌõ29º½HGÝ¡î¬!`Õ=×ݹoD)¾Bš;gßv÷sÛÝ·±#HµWÄ%7cütçëë8Éù¯Ýe~-:[²³P«ìÔ‘éÀ˜Ég¤–W`ñ1PpQó âô{D6(%¨Åvª$øÍy — ­/¿¯Yº7øiµY6ì_n}ŠÉOæÆšŒë'-^QúR@ ¡AÔIO|"+NÛC{ È‚Ú"HÖPݽÓC¤òíßYèøûØp(¦¬•¶”D™j’cýxö/ëÐ1@O‹´#Hœ.9®Ë†¿‚>á#]Ñò”®ZÅ÷®¨Ó>4½ (ìÿ ÖJ_ÄäßÎw·¼n¤~ézŽ>˜ÞVæú€ `0èy…”½r #î¿Æ+½@zz’Pc÷ó)¬­øGûJQu£å»"ó§~Z8L¤ê:Ð1ÑÂøÅÄæ©+_•ž‡v@ùŒÈoŠW++tE÷íó<Û3ÙÒyò4%I×:gGqî#ÔÛó(>ŽŸaê¢Ê•,ƒð²*ó4ìçè@kg /4}\ÏꜜÓÆÀ€(1”ó¦âr¶ï=ÞrÝùêÛ?×¢C+‰«p÷º*.co‹§Òמ«X5ìð½m÷Õm”xªÿåy £Ü8½ž!‚Ê÷•+5©Fk±¤¢2”7ÞIµº&XtõYx +S 5Õÿ©O½Yk¢ÀÃ]H0ô‰ü&B2;FPžœí3êŽè1`㹟ÔR­Ò0{³lýØÖUË!ZL®`Oñ#"³V E¸÷7ç9µ?n]ÕÕ¹¢Èß¡…oì{òz¢ °ßDÁØ£H … ×)¨•tË®Fž¹0~Æ ~8æ^dନ?ïóK[h}W½¡e¬A˸tÄ´„ƒ• ‰r6Q£\ÛYÓg3’–z!0ÞH| Ö –§­×Q8±X©šñƤS™¾êçÔÚï˜AC5.šè©~ë?^ix%p¸º!a_v¯Kà¡ +Uv7Gv7 =€±ÛI};¥Àp×Õ/‡†°¿¹ªCµ×ÞC6 Èè;MÞª\”¯#¸h„¢9>î'‰®¢#3Œˆm3D°jív½¹ýuz*õ|ÜFßrW¯8 à¿ÉÖ5B[ØŽç¸Õá´™>ÄA³ÆƒYíz5weËCwm Ýd©^éxRÚ;HQì·¿ˆRý¿œ =;øÏÀ†áG÷:òX)Ù¡Å;$‘¬ †Öˆ…BÅe=Á ûX»P °Ô•µ?@î̤5rç×Ê|\Ú£JoàCß›(œMv]íEœ9¶ *,½‘/® +AHckg¯C¦®«w"\·šðgîìJˆ¸J25+`ú?†¯Dåüî¬Q&­êª@ó nÜ$‰è§zLjÚW#½?ÐÝ9$‚ÑD”2n7{¯ ¥È7 +ËG57Äœ¦wκäW‡wª•8¼_®nÏœ-²Þµ£®m>87ó-ÏžL­¤Épê^ êWÔâø‘!ØJbmZ7´óéOj¥è™¶‡`F¯j%QD!ªkTš‹x˳ۙažØͪ®µm+ó’e×°'@—v¸íAa¯ËlçZùC¼†xÀ 7>¥Y±F®PO~‡´xDô˜¯1‘¸ögÞ'3z*¾¹¤fÔ0¡HwA0=Þ<={ûo"ÀE×ùz¿>ˆÜæ -CjÆ6–ÞÐûa €L¾t«¡$Yâ> ¢Š>~‹ð:ý’mx“ƒŽÖ¾9€}Äà ˜“\§H·FÊ°•Ï€$# rkTûZtÛ‹.S7J%:Ÿ[F¡Q©Ñ«Ê±ê§=Ø|®€þ¡Ù©Ç¹BG—÷ˆ4ZÙéÕjõWø<:1>ýõZŒ§œuØn7½P?#ÞÁæÏðúu”bKºÈ‚°ºãÀ¬Y5¾4GE²KgéÛúbK¿ÈæúŽÀzÕdü8 èÿ.]-¬¶5ª&7Û-ô†ukR‰öuÞ£DnùB­™O…º‹ÆV<ï9½öká¡Ú!)vÑÚgÄ3ÚN«)Ô\ÎòÍyFL- ìª±àÙåXKÎ)'x5y«ê³•ÿƒþáÕØJªF1 IeÔRá@„Ð ó ¼ß¶Á“o$‰Ù”¯»–,8U°Ûšû ·0QÓŒ}.d÷³èªu%JBIC®zx”Øa܈4žJD˜²5-û'%qjxÊ•Š„l÷V¾Ó3£¸'¦xHéc WƒÉhY£ÃWGUsË܃MÏiÞv½¨Þò6üãÃ]‹ 9Ï’=.Ñë‘úqÄ›ÈÖõÌ8ïAo DK‚˜—®LÍIEþüJ¤cÖX ìUßç^ f4—úآο:ÇþÇá=Ï7í.k¤—þmÄL±“¼žÉ{²»â.×½Ï|ÛÛâÙJú2õ]½iJY]©(Vo%õ3ây5SD:¸ŽoÎÃGÛ»i°M€‡óÍŸÙWU©`8lÂF01vj<“µY']?4ÊÅ„ü¦USLZ&†»†è¾ìªw~F$Û(RQIg( ~s¼5“zG_(ýZ…ÖÝÍÅß#®iÝ×Z{¥°oQ=”î3©0¥j[î¤FLñø%Ðù%Óßzmë¬Áœ÷(Rñ{“µ¸‰&J\~Åìãò<#ñ86GKX$^íwŠj7™ñP·µ½ÎëbÀ§(?¢keå­Â¯Ë§y}½ðôëÍ”††¶RûQøÓyˆ¯A±eE¼$àÈÏ­h#vå¡S±[Qø½N©õÝr'tÛ4X‰öðTã=<…‰µòÜΕ>£Jl. g6`ôHBI–_ÐH6:6[)b`¿ðx Ûs`ÌC'øŸ²uÅÞaí¨óµÜNdõé¨Å6h¥Ð”*øñ©°®É é3ÉóÐo)ÖÃZðURVÓبªü1)3×ü ;œ:+`PÐ@’ø’+E¸-å¾üþi¦ +aã2ú7§Y»d[Ó9(|5/6- +4}D|·&~¡¨Â¶‡¾B™ÛaŠjþZúïÐJ$¶»_Ô1«ø±ƒ¤aÄýÚhé6zïŽù4x%Šìªv˾c½Š:¦:j0‰Ä—Q—G!ÔvCMM*ûš¸Q ¿g;Vw‰æ”ðooW){0‡òéƒ,²ïs¿ü“%¤–¹›9­}cÏAƉçrÛYg¶CàZ'=…s#"\³éW½ˆƒèä´ž:Î@ïÎÇ-’!ÍD¥·=Sy‘g³#úŽ¸·uð9"Øp>WR8¥EÎ>Î5ǽöOíÎy|’+¢öí¢³™»mZÞ#¢HïY˜‘=û֨̕¸ +‘¸¬É@+Ò¢ð)w‹P?~2ü½ñ„‰•+nbǶ£É>óÎ>ÓŠ¿êáiT’ãòéT0Ú’¡xaÕ7l]yÅ q•ó\<ú/J÷á~]©óm ÍÞ_7‹’þššzN­Ìô)4Âi¦ÎôÚ¤ ²îïõȲʉ£Â'î‰R[uE›3Ç„Íñy {€ûT ßËÄBa½´Gƒ*[´;‰{zEvm˃<ŒÄ,;hÌKNòkH\Õ;8£ô¾æVP2]ñFÂ'÷˜U±!c[ö“iÑ!\ó€_]…™é‹¢dK2+ò1ÃóZÄ NýgÄŠh‚{“=?£p²³²&*p*Œ :“JTéràsg¿n–¤«2ÜaVáÛ¨¤î1<Ó÷ƒÆhce.D/G_Ÿµ˜ XâmMÔƒÅ83² PGÅÔÕEŠXkš©ÁoVÉùIxy ¥D>Șh³­]%] Ž«ÐÑ +UÑ3#]×!?HÕ˜Çb8•ëˆB]?£nº£0¨¦âßÄ¢Ä +žô>„1l¶<*BÓѾÒà3O33h¡ ?¿îúUˆ7)äX詉Oˆƒº„HÀ¨;4\SùãêùÖl§<¬[xÑWóu³˜Dû)_Æl%»>ˆöÉ䎈ñ• Å9Tç·BCÖ b<êG„Æz‡Ъëd ÔºbŠ¡žå4}E(iAD„c›B¾¯+¹Nb-©VÜ,’Èêüz{¤ˆöàdÂK~ÈÎÉ+ÝŠžaåXŸDózàMaØÞa\‘ó±!HínæH ef(G»‘Ú–ÙHUÞßDÔ+ì̲îMÝ¿è3 +fN.'[mZ( ꟼ2kå3òµj³©nöñû,©FÞÜ…Ôoγ6Æp?Aèü£:¤Ò‘»D ¾G Þ_8„·c%À[4 c(ÚUA0Æ1²q#¾y‘}Gì/70~ æ·€×L_¼_ûã,(ÄÈÒaæ=gŸuÃãÄ8ÇÕeH¢ðÕö½î¹×µ8Q0—‰’ÂOBÂDEfŠŠ³DHÁé”@ŠÝñΕÌinØz—¦¬š¯>ÆÕnîÕŽ·¢ïraiŠzôÿAÊÝêrJ–}Þ¬§1—T:g¦­[ÎÑ7:š{“+éÍ0,d\ꛢ9K& tÎÔƒ÷ éå7­D¼X¤|¨×¾+Ps¶~ÕGº¼€Ô/¹1çÞN·>ô}h±ç†¬ÁyõÚ>#²×ØúŸL—²ïç¡£¥€{+ÙF‘$ß VƳné$ÈÀÔgŸŒ»˜¼µ¹>„Ñ–¹ ÷8bß(o²¾~n#õSË”)y 7q è¤&òVæ®FñéJÌ…)(í3éˆQ#C“­oÕj7¤ `tÖkáï8¦ß÷G@ðNsãÉxéëó,ú^—ø^WeJ®KÆ$@ê#à Ö{íiÇ9\Õ{Tâ½+m­„óƒ4@&KÞÙ%E¾¦I/:t€å +{¸D”’®©ÙÀ¯½Èæ=h/¡îšûaq­Ó±.e+—KíbRJ@ + ÿà +³‹ÍÒõºŽÆ ¿fG @Fi©V) ‹ åd"b62oÉ`>€Ö<™»å–( +úû»~jýSܾµŠ¡B†Ñž2°È3†%1ÎXÛ3\ ¿‰XÆ“Ø}d|Í8! ‹ ]׃‹v&Xœh˜‹›ÉyÿŒÈfòÂvçæ}sžõš ^{|l÷ü~B¨´·¸SÖÙ¼Îi.ö–÷i×Æ·Aª÷gÔ_íï“fâÊ%þžÆïºGì•iëÇcs:ã ø£„÷ÉÒ~Ñ<Â÷©—$ü5Ž¨:"ĺ±YÉ}ëSÅ–Büî mƒounIi +u\I4ÖùPÉ-›7Z-¤O[hÇiƒöZ/^ù&â}QN¡ú= +aI¹ ”r3)t³?Ûg¸îàÖíéwª&Ù'ètQ¢Ž¿EQåÓµ< êñê†FE½„BC¥Y*p\›°r…àά áT÷Pe7&Aw= “Ǧ‚]ªnÐM`EOÚÿëB÷PñjüT‹KY•µdÉAýﻇ;’ä#‹žÀ(Z·8Õ"W Ö¹ê†]&€ E3˜OL¼>ÿž.ÍLã`÷ø]Z6koŒàZÔÀâÆŽÎ î [h„ƒPxä >‚zôæ” ×_’îr¶HòÍä ‹½Þâ…½[¯Ë}FèG_™µç)c›5Á`>5 a{ŽIH¯- +*¡œØ°Þ?~å÷à¥û’Þe¡ÿ’nÞ¶—i!\݈؅ãÌãxÀœ9Op%®Œ`q,Û(qç‰àÑÂ⧩· O°/ÐÓÌ$ôâ–C+ôÕ¡yÈK4ë(ÕÜØÿÚoêj¯u?Ó_Ç›úõFÄņ‡¿U!®è»Â}-„|­Ö¿`‡[ßyýç&­§²¦Š;D-ô< jᚶÆM”c(¼_´¾±´(ðs‚æg“S÷PÅ#¦¡(O +ÓïAB0 œ†×Ê ­çJYþ@‚‰4ÞÝFËÉs_)€Çµaæ»ÀƒƒþÚåŽæJ×C£³Š‚ãîž1Í6û¹‚©ä\W@)"„ˆjb§–À¨nÒ<“ÿ–¿^ªèñJaé+?Î=uô–ùº·vÕ^ˆôC1ÑÜçò²D®Î¯¢bEŽxÏ-<°Å‹Û;ç*¹ùÜü@ƒjðŸYxùIªoèIE +¨Pÿ&Ïj*_$“øíá‚aåtE„Sc(”+A‰É×ÐZ—ͪ ;µ0o¿¨^‡D.²²lðm·Mù +€çÕöT-seÙóËu´ÐU²%–áZ"±ÜT.h)XFËW-¡~`€Ú~üöûñóŸñGt;†Ù¨·àð”ætô‡uJ%®.ùo]G/^ÅÙXŠ^NHŸ9Hà1•ÁÒ$ ®ÜìvÓ‡,Ãßï+¥tTx´*ÐÏ%ŠÜ çaÇÐÝ !¸´ªåˆ•ýênyû2Bò1L¼ÚhIL` ”Æó6¡OuâÊì6df^ [Á(Ø눉Šè© üÂÙ?7gÿQò°5¬º‰hÔ@9EeëkÑ^ÃðJVtçMÛã ‚b¾z$_½ŽGÇÈ÷U¬uú-ˆ¢¤ÿ[РË +/±¤0B—Ñ" {É Â¢l“\¼9îúu!¶l]Üf¾ŽŸØÅô‘ Õãñ–*ñ–ª%¿Äd¢£~È6[°õ$®òÅ †e +Ñ= ˜sƒÐÖ0öí[Šöd¡ áè\¢omÓJù/.QýqLî‘Êf_ÓÝð´ê¾&¶ãÜ=ËÌšuö¼ìl hxß2a¡Û»_Ôr{Vj»R£a¡r[Oæ|Û+Ä;Àä<Še”õ”É$¨A¢—Úƒ5 ÔfuÄæý\‰Ü\Ä}Æ¡˜Å‘È]€CÜÞÆî³Îm©Uf,µfVç³2ó{ï[™ÇP¥Ï…]‘€'øib6I@(‰•ˆÝ[mz„ï[ð˜ôØä'¥î!§µºz__íÏûVÇE>Q*T^šæÇEwPqì{wmMcev 9Ž×5€æiù OÀ(‹Âª¬ö%aæ46ÂAˆ€¸ÜÀ;í¯/Zbn8$Wíûg‘Pélϵ~¼ +¡LQ×ÔI]HOÛ]®MâªGO‘oDOñdeìW0`è‡03Ò¦Ž½G •›QÇît;ÖMªÃzo4åMZ<<¤§Ä'}ã¼’þÖïií –϶‘ªÞ ÞÊTXiPĉðƈ)ÐÓו¬o ö¤·>7¦=Üóß.€l.ŠF +"¯:µv4“æ#MÄÌŠ%¡]9dûgšÍ=u¡:d£&/õÖoI—=:f[êˆYö¶'yÇŽùQ¾&iž É%×ßõ5‡T´ ôÕCñE³ÇØúÔ¾7vÓ@­I~ØÛXñf,´–0‚v´V[-ÂNÑ`*É ]a¢ +zG¨5e‡g?è8‘ÙJc²ŸTÍúS˜ +G€&Ê}#ªóuNê(‰ +ùà0#¯æ²ý9-à õã`A$•'ØÀXETĹŸm’°e.d„šò]ÈþºŽmþ‡àÜQC%üãÚ§ÓËvI:6a„¯këH¡we‘¬H% n ËòºÐï? 'DL*ëE¹¬Úovâ§tEGNíi´ ÄtBë9x_Ö~ž< áráÐhê°‚ÖÔi7m`ãJ’òejÌE† +¹ÓaÏ@”ÐËmôH9vè;Izu㉻«²kçÜeåÞ›IºnÊ#VáGD}@À# ´>¹|}K«©lÜÂaùO{4º!m³:PþîYÏ +, +ÌRmó’;Úf(fHè']…T®×ù³VR¸¿²¹-j%#ز¶CïÁDns£ªRþ™à™(êƒgJéã~8H×ý`‹áŽHˆ˜ +~q?n·.+9RÌGŽ½âLh{ìSut:KŠR›ËfÞs¡Ø~µµÍ²üè=9÷…òiæ8+A"úûÜ/269enë'œЄzñf®ô#eæ]Qºã`†èŒñ×%Åm]v{>:'õ{‹‡1±Í˜Ü8‘ÐA×Í#ytÖs9¯H"yàN'£­),>«ÙC”vÏ j˜è<Ð%«€¤ÔQ»Ûí[²ŠÆª¶óÒœ(×,Û*3cß„†,Ç9”¯°v°Pc[™iuwG€éò °2·þ9€µ‘òàÇN1ãÞ½ŒvTä6æËúáJš±¾äŽ)ó±îØâÿ6,äo½=ƒøÊ–r½ö%2^÷–yÀªsnýN˜¦]׈Ñdm}aÄ+é×·„Áš'FýÚ÷:}¬[fQ¹]§Îhœ7¤¸J$ÞæòM¨ËÝzøk.ÅíÚ/k2×Q| +4öÅZ´ŽU¶Ò¯áÖÙúØ=fv/ÎëÑÄqg¨NË°CíKÐí§c¼¥Ö>šÝ ++D([3švbÿ׈k/-ÉcwT•f¶@L·Âõ&7IèÈ‘;l•;çÿ·?ž„\µ® dÖ™äÒÔzàóܪ±S–õ­2¨¿AÇvi'ö¹ÃW‰ôÜŠˆs´ +oŽs]†#"—TÄf±'¤ãNió±ë¡\ÂŒ‚ 0é]U˜}5ÍÊF688«m“ÈÞ(¿Â[øþ•Œ9©VÇ•mš 6PªlÒ(H6»|AÕþ™0ØoºØµ¸Ÿú*¶eÛxoF5 šøí¤M˜”ºî”º]›Wz…WÚvçú>™[¨±A/¦ç E’Þ¹‘Ÿ±Ik&;·@JD0BÇùÌÆ}sËAÖÖ—?Zû"]Îkº^;_]¦JØ[4œxñÝPÉ^5)ê…7£›ýc[KÉ RuïªëœWjsêïà¡|¦xæž`Ø;5ãmýÎë—'Ù¢ +ä^[Ôÿ„@ú$ÅoMÚ¤Yðs{Ýeæµn23Ö4zõ`‘•øFkô–N:76À1v~B½Ùc_îÂI‚ŽùáNá#anŒìH}¬2Jȱ™š¢žü]Ð+º§h¾²ÅÓ|cjd5åbhzØ+M±ËÒæ+¾è#²ãræ +N¸`ƒ0sÅß•!Ló…ÄXÀ¼?ãHqÉ¿{3M¬¬›ÒuÈ´áÑ°VT*5çwpP꽌½óô¶w +¹ŒWnc³ö ¤Óí;q+ìˆÕ’ph{LóÐöhÐ7YÏ¢.Ñçüìc®`¨³·-8è‚ÆÁ¢Hë5¥À ±2º{°%Føgš’üyM Qw§MÀö”ÆPÁ®ä5Hl!³kœ|KÛä*d­a5]&6¾s½À~¤!S,ÆB™·°‹D^Óû+ã$JyÊjŠWÎm;¹~ûzx§ç‰ÖÞPÎ.>m6Šï ÕV€Rè+€®B(ðbúÑ{ŒÌ~só"¼*l€†Ž†ÃEdÞ!á™YëZ¼‚‰@ªè†“ = ´Í@ØmXÛŽÖ³¢5^à¬ÿ’ /JšÈ}jYš–3\©ãˆüìý°Äi™2ÑÉ;b?‚†,J/‡B€{`¬Xz‹7¾ƒÉ«l¤É0 0fŠêQ¼¢~E—ú¢©>]×t+Þ]ÇSÑ×hÒ+…þ9t:t9nˆZ­ SHŠþHz£¬Uk3½Oë2Ú¡í[…26­ækôΡ(F‹Ëô’©ÃFqaHõôñ” då>bÆ0Ô +âG±}§9 úŠæì|ô8Ù9/Íe€øbB½Óe`;2‘°‹@`ã·ªÔŸuˆ¾™¶DC~b?œûñ: Î”·på&ÍŽc,LT;IØ‘nŒæáUÅÑçYÐ5Œ¿úY%8!ad²#óé“m*œE`èFSk† / ®Ñaÿþì"&x>W¹_—ÉBÂvåj›ã}nŽw F^ýg¤uë$ÿŠ B’¹÷…`%‚í÷¾PÎNe(Ïô#•Û¢ùo;óØ{êª÷äí Lj%ÑËÅ$ß„Êêær ·Ù©q_h+êÖy‘`G +°óØwf¨7BÖê~Î3\,bb7ÃW©&`3\=ôöÚ#ì 2°€ë"3eçÁ;­:Ë +é‡J禌`7ªNF‡\\`0U“ógý3éÁe-66.û]|'«¶°Ì&Ë’‚•§‡"ØÍN¸9E•“ UN&H¯'“ŠÑêãGŠÚÐa@«ù¼ìÇ,‰;”¿-á•Ähž)¶*aÓå +¿Ötæ ÜiÆæÒE!¿\Ÿ¯5^:RÃÑ.\Qwâ ‘|z¸ÈÚò +¦x”Èf‹%8Ëü×R[â,8ÛÞ†˜†ÜmÍpnT2bTGËy®8ºOÖúçt¡Y¬Ÿ–4½]=6‘YuSô¸r᩾ÄèIIÀþFæë…ûü]ï^¶‡Yÿ¹›Y¢78ÿ84uE"ô””¾vrîªÛàÍn!SðÞاa"Ï6s¥OÇ/À‘Î~’Mø½Ôd)Q“ežU½Òƒ^ŸcfÄk£!ÉFÀ½I´¸îÝ·µùiû­ w)ƒì6]PiÒlõ׎|ƒ¨©#Îâ¡Ñ%êÈ"ŒDs±—~yôn¾ôÇƦ?2e¶‰®´‰ðœwêà(†3çq+I·Ô2 jppÛ”l~~ÙÄm sˆª>)6 jÎè Aù ‚SÈš*NÝ+Yî%ü\ÅüI lqÎîæRhRhr_`oô[C„ÔÓ~ú‘ºw#.‘Mê$¯TMe¤-jôÊ¥7MçÞèRp¾þU@ñcj«,l5v&jܼÆ&°†ƒo¿Ä,2ke3­¹ÒºÁ‹MïP§ @ûC¹‚7XsÚT¥†› ªI[Qôd +[«uUgÀ¼¤h|‘ŠŠn/®ž,·­Ÿœëæ”coÉέ‚ÚÈ|¹¶j°þ€—[=`©¦˜ï¦ÃÎRß´^^Wõ¹®KÎ;Õŵ•›ÛؾW4‰3¤ªq|ƒÈcR¤F'˜õŸ÷x Mc¥Äcë÷3 ²;~ʹ±%ÈãH)<¶ &N*bá›S™Œ|J|0òÏK@úæþ BWó!š¦„éÂV¯0×Ðó·°Æ‡<(]æ³t\,£ñ¶Æ÷ñ<ä…÷¯Iଶø%káöÙº’lõXpÅŸò´¤,`?o^äà™AX‹;±LÚWraeŒð–<ÿk#Ô&›Ø0)"oΚç·xª¤ý6;Ó–²鈦½[HX\‡E=Ù¬ü¿Øß@£¬D„´»ÒµGÈŸlˆ¶)3ÑxDET?,Ä·úþž¼k d(q%ŸµHƒ=pIëŽìà ։šÀ­YBDl÷P1â²!|—,Ò(ê²· ß”iÁ{È@Ì/ ãj EA˜}!ð Àz‚! H * ›U¾‰–¢î-Ò¹í¦6¡¶Ó¤baU‰‚Y ˆõGå~ ýC^¾c +à÷dDY‚o¶"¢¢ååçç½êšKšvF1˜‰ZOï¯þŸpÛ,ÈÑ’»×DbT¡ƒº;¡8’¿å<%½0XZ~ý&ïω÷ûÿY«ûå‰~ÃC>ÿ-þ÷;;wi{ëE€‘w6R[k²_[×ífoÏy‰š¡Àç·(YyNÊWÜÊH$æ¦ENÏßpõ@ö@àiŸ½›vW%ð{ŒÄ"2ÄI9Ÿ ½gf0%RáëÜtlË£P${Äu%i€Zx‰a¬¨fE¹Ó¡¹Œª‘v'3ž§‰¤¦ÙGT¥œû©I^ÛÕs9GZÄ…Y¨¿®dƒ>·¬°&˜ÀžÁä‹Ã]Ö< ™ƒójHK  oM’mnJ P³±ÛÕ{ˆ· +mÓ ¼ƒ ›ÃÝô;Gx¸›î.˜eÌÍy=jÚwöŒ¢8ü}#ô¸b¤>u|»aïShAôÔ¥œ„ƒÙÝÜç\‰Ê/(£È^ æBGµA™ *\žÊ–H‡Â+ƒ¤“ÏphÇv:‹ÇúÁçã + •—^ýdÀ ¦aú 'Å£[cóÐÖdfB ‚䕈qˆ~CÎ]ÿæ¸óu~T3ˆrwpÌýý×(—rNj¼wZqQðÆNª=_EŒäÜzûÃgí¥µÏtmPËFÑ:µuöÍ$Mw”Ö°¢*éY»äà®´ÖÆ.2O·KH§×g„ICInNÿ=È…÷ÓXïij¼ÊŒIþøúÉg¡$Ví Ÿ áQÕ|zP?›…7"Ä<Äi{3ó`ÏD<< |}*z¼æ¢³4òm‹hŽ¯ßqÛ('€Ý`"ªü$üň˟¶öÑOr!h \èéØu(åÙ}ñûÜøjP!'E!Γª#–ÎÕl‘{Ûú78—s$Ué}û&ªn)x&ƒµ_éBÅáHžÀMƒÏ‘ê4ðO8·mE=&6'¢íˆÍtéUã¡cÞ¥ÑõÄ7P9öÔÐ +$kþŒøv¨~DUð¯Ú߬ 2H{U9òF(•Ã®}ð% è4¥m‡~Þ¯€Æ÷`Ýj’ÐÌkz/¼hÍŸº@sKÿ[àZ¯÷un QHPÞ>Æ–ºÚ'…v#NÚ_À+?Õ¿çi0Ö·EÍñ¼IšÏ{VjWÐo§ÏâäåÇé(±1sƒE™/Ö˜q.ˆ\:©zÛC}ÚõFXèÖõ«õ“?$gúÊ0y™§V=,êú‚¨ŒÑP.ÄMd½G¤ +þÇA·ƒÖ©¦åIaŸ)€+ÑßcL¡ªå¶  µh%.õ‘YÑ›].?}× !ác+ªÚy‡É2¤Vy9dN*Ê£×þ'ü‹Ø¿˜wnÌ¿Ž;/¾Áš;}…Û ­†XÖ°M¨YÚAßtQöÙ©œ÷¤h`»œŠ_²s9‚GK[ƒ}ó5ûŠ 8©$«æ­y‰Àá•,fJ.qhÀ>Àò(òÜCN¹IQ\ówt¡Õ¸ì[…y­¾@§‰Ðvc@è}à¬W¸fEIÙ6êÈÇUvBHmÛ( se ¦Á݃’î£Ó3:U<«xÓ)6yJ¸Œ¾ÐNÚ;\$¨—ÛQz €êB¦Fú5Öàä&wðŒÖÔiâ¾ ¦§–¾örGã®'Ž/WÄÈuäh¸È‰ ¼¶›b‡!žJñ%ûJ)¼3~¨Û!‰VÔ‹CáÖ›ìQ…ZÓ aS^/ºëÅT­Ëƒ.©ZÑMV˨¹¥²© ¢Û]÷«9N"ëA«‡\6œ®nè#7²<‚ùÛ;t͆IàŒt³i·~:}.uúnÿß~a~þ3¾¤L”²Åw§œÈ5á·ìÉ +ÞÒ<×wl;DJLP|55¯Kž +¬AjÁ ‰ßw«t: ßUÝÀ˜R|a|Šy}x‹A)]b™NO, +¨}€Æº¯¨ÍnE·¶î;Îë¡PÅø«±G +Ç]Ãn8Gê`šOVd|¨ÆÔݲÞK‹ªöPW×t!cí#"•¦º»¢åýõq$¤ç@žq„ó¨P¥gHÉ2²k`Sfƒ‹Û ­1)y©]ÖÔú 5jd±Üº(_Å­ÌyâØÚôD¸Ä¶/s¥óðÒSå%‚7Žˆò*êÖ]1DS¸=ò8ªÍ4_Û î°V"…ì°çéŠðЧ±N6J®–M»(¤qî—ÛÕȬD÷&!͈¬PÅ!_SÛQm«Ç4軵ߤ€BåV«ÇƒžSÙØšP °ª×šjáÕî^Ùµ9ÀYÔæìE!œŽ°Í¡&|ø»® +ëÕ7ÇÆ[Fêò4v>¢6]¢›P2œüÔÏÔÔ¿ ª§¨±˜Å;}P+õ3â÷»/¢Íš5»òLŸçÙHÌVú•ïBº˜”6Ö³ñ(Ͼv…ö>¢ rÛj¸Ì°½õz é sÑâ5ó4%RUxíÍôË‚qÚwaÛø\hFÞ^üy'ê:›˜ÎªhDzjë©ó0´?U8ٷΈÜÕ ˜æŒ†¢º{ÜÈöU°žÖ¤”ÜɚǾÒ=8Ü0"p*[üÜX8ªê ãC/êú£‹¸ÇsÙ£õdw˜†Ÿ0ÍÒëÚ ÄuëvÍ5Ê÷Ðúô#þˆØÄÓê:ôÌïQÐè„5ê¹÷Ã2¹Îg~áPËK»†b-ŸÏ@ގׅûsÖo> ôÁÒ•àÙ˾¡=°Àn)'Ì}iý}F±§°I/Råh|”5Trä1#ñ*‰§™¶èxß›JO:i¥îÅKôÛÝÝ2…Œø{zù+íÏùëOAŸŽ¤†ÈB[_ÃV><Ö ¯™Î¦ë¯ìgRVIG(=äT£æŽšu³‰¨.b—aLQéìM¥rg¶­kö K\s:ÿž^bߪ8m^_Ÿ‘ÏÉF7ѼÐÜØmÖ­Âvž1ÖÒ5§nל{~y&jñEv{¦B#†6† +!6Ùhià5«çÉÞ¸aÀ˜ï~ýoÁÓà_IO¥Ó:fêÃ?Ö²È}aL¶#Îq?6hÏ\ñvP ´¤jôW¼ +u‡Ql‘Ë£cíiQETn\ªA»ç‰8vÄS®Qüfèâ1ªÐu°¥W¢‡Îã±Î ž_ÛN°Fþe¤ UUÓ¯Òï‚´™±9÷ƒÐN£Ért5Qß Á3 ~¦M@ÇvÏî#âYSuûæwQô±åå4DùÎìÎð#÷"•?NŒøûv_0¥ÖyLÓƆáÉ÷¿³¡Ð®¢¢£Œ3ŽýÞaCW2ÿL=†D³Û‡øÿê¶Û¦m§{7£â؂ܧrC%œä±¶+3lɈ¨HÇÕ±|ým½RPè'Ò®_}}OÐÌŽ¦ö Õ:V=Œ@P¨÷1ªN¥zð<æ ýý«ˆ\`Æ€l~šÃ5¯%ü¿ `$¾({Frï!âù3¢˜+VæQùúŒ'Õ6_¢ESJϲQZÜ5®¢¬¡¬}ûX9™røK·û3 A™ù +4R¹êóô¶ý ÉÓ®€{œæùÍIþ×}&Z8¹Ò[TµEÈOZoŠ.c›¥«gus—têQ— ?Ò›†à…–poÏ?7ÄÍîû›óÌ;B¶UêNV %Ëöï"ÜD•¸Õ\µ|Vï°7¾wF‰´Ø\‰ë)›]6ÏÖFåN ßpŒOÑÿivÔ¾‰È½ëÁ"á «¥ÛÇy Oø´µqi?±–®ÀQÖK54«*1ù(Èy/;÷Lm›Q’j’¸uTŽÚ>PAé¯ önDÓ›}IìúyOÃÚ~À×LZLî¶Ç¦M2Í×3Põ;Öãlw>~ÿtñNKû ç7§¹¯‡ ±cd;K‰í,³ägÄ·kä{ JÌRè¨Øî>ôR uCÌcGÝvâ t›ÔÆËx1P4?ïfFZ H™³Ò¹¥_©á<\z¤ÄàÒw͈×OÁ¦µÒ_¯q>†¬,µãÑ(÷ÝëÖ~avOíw&+ä3J3pËú£%ùK"ÑGÄ?íJ’³÷ÇÇÛ™² +Jwôî}õŽë)q6CR‹{ÓÍcöÇ^ɨ¶£öÏ ŸyE5ý §j†‰ë½#æŽÐ2äØ´ƒ¦±ÏŽ —kìOŸêYcXO#5žU'¨Îr6´3{Ni·$5§÷½(Z"4Ærc|ù7 á,HÎlwÍû±^,Þˆ“ì¡¢Âz#åÙ`lÄC_ƒ,‰X\#9ŠÅõõœÿÑý¦KùlŠ´üPªòö˜Ó"È9ÛUë5vªÚùçîïAž>ûÖ}³„Šâ߶ +néb?cÆgâV³¢†Æ¡R1"ZlvöyÂm?MnèH°ëÊL>çuf>Ð;c ¤ÔpE{J§‘o"Tw"1 UëyÅÌÀ%îJeµz*¹g[çqõ³8CV4½5¸€/hÇÓ–îcre :3Éð¶û¼²´uí‡cÒ‰6 &òSW€=…‚Só¹Å?­[Nº¿‹X_„Þ1º«óÕª9âæ`”‚t»ljÙ¸(¯7ÚÑé +î‘u»†ÑoªŠ;îJ +°ù*Eâ;Ÿ†Vî +CµQ)I¤àèÌ´í¿CÍT¨4é•ÚG4·Ëfš°(‘•Qf`g°éúÞÇãÙÑJ:‰åŒ:·Qh“5ˆo%FÎ+P…e‰`U ÏôËž¬m9ƒÈHëxû2Çöà; uCÍœïHŸ ú}åì[á­èj„ƒ®œªß ëóï!eã‰|´¯ÑyA«JÛöÄïC½¤ +à7…O³GÙ@Œg GdŸ:ÿ½˜X+J}¨af™sã蔋bFØeÐË( üHö00vŠ—å°ãÔ»›¯ŒdE(Bô\ÈJŠ=ª’+MI«·;Þ\‰"7Wb«’Vè±ý]¬páEsÖ\)8[å«ÊëéÈ‘Y·øTf‡)pM½]GMÆ÷¶¬y@æÃØÞm”ô "œäæ«[7uÜW¯öíÇyà¶Z/¤7±·ªë½¶ú¼w‰’¼M™ëñüݳ‚~Tæ¤ÀP=_ŸA—H‚N×æ|{BÛM­û÷ UŠu8nãÃSxgêQxO“~³N¡÷i¥ËÖ7Âà×2-ô uÉÛ[wyO2|{o>>®gÔçL­üâÀ•ªTc¿xþbÍði[/³ H†¹yœì‚)¹k²µ‘¦ÜIB)k¿¸Íù“*âd©º$—ãé6… &ÉûJñI÷*{sôE_Oêâß|ëtóØE]Žhv›…¹IiÕV<UÇhIíçŽñúº®2•9AÐÿ¹)ÍŠÉ\›\¥ŒÐ¤ê ‘ç®8#ãbÅãý@îî;×ûããЀ>_·kh¶ âi +1÷yôo"|Ž#Ïq”G)æ=JÔ=ÆÄôÞ_tË5ê‘Ùžh‹çqà’ϸ&»SƒÙ„—5/^ yߣüIdÒ ªúG´RI;ó©{D˜š)EaêÙõ§±AYk-‘57¥-úŠ ªXÒ× +´ÚÏÂ÷Gĸb1DÙúA.'Šm'Q3šš Q¬tKAÄ(2»d¢gY/–M7¼‚ÝÖë‹ãx$ÕÖ/zH|%þ–h¬Ï㩇¨2¼Ò-«™kž.ž­ ]Ǹ"D/ŠžÆãÊvK)k€ÿÚõ›FzÙb´|<ÒGkXˆÍ+Ÿ©âÚW k.;Ãck”ØúëÅ°½ˆúpuEŠ20hœW*ÙÝL£eÿZˆßD]óß¼Ñoe7QºšGÌm±lA¹he‚<‚n0ÍzZD&¤”þ‘UäÜÚM,øæ«ÄHšlÔ]vÓüLÓœ1kt*mh~ÇÛbÑ‘jº6è#¹ä¾ë3"cj‹:bRfÿæ‚ŽÈ+c(:fn¹)èÓsn>«"˜BM,ùA÷§=€Ýp£ªZsmƳ¥¾ÓÒC>£Ä$¯½»î%'c'HÏÃY_¢36^ž- ¼sÆN4¥+¨J!˜!\ûe¤–Ë )”ÓGÉÇ'‰p™¹™NÖð¸>µ$¶Êì¯ÁS€'.Ýú´ìÁäû*¹êÆ ¾sIê «;‚ƒ{Mkâ!>@[©=ªøÐ Gúë ±ÀkëZ·Á⇭†<߸0è¸tçŽX{\Ÿ¹]cãe'uðó»ó´M>¤¨£½C @ŠD XCé›l:‘ÿÀ~¸ð}µ‹ž:õÁC6ˆ(J›DÑ_ÿ«ý}îÌþæ±Vß•J8k=ï4y½N÷²ŒÏÌ8¦ì÷›ÒÀ/jF¿ŠºÐ³ÀabeÝçŒýOö¤80»ªU¦¹Xä2ãžSί]Q¨èð/!C(!¶é©¼°Tá V' Š]ƒ³îe¬ÀgŸŸkk2Ó÷¨5Ui¹ÐÙb¨ Yb£W·—¨¡®Úgµ<œô~ß×íX0âX0ÕÐ-µ~NÑt§–`Ëè¥)¨†G£~¶MÙœx úŠRãˆN?ºšÄ0«ªÓ¯ú­Œ‹ÀÃܯADšñcƒ³»~Óu +q™¦)º¦» Ô z!š5ròM~æh(!WÍÄ}!caˆrië)¨¤»´£µ˜.Om]YÕÊ{ùŒxMr ÊÂ×7ç¡Ô-_š„Xýqjníëòƒö°oaC9ïs5Þåù if×ÄcA¢¨ÚâZ³‚ûA§‰ŽázÄáÓ¡%“JßÏ<§Öª;'V–|½[b{;^bè~ÔÇMlª^ýã·awNŸÜû–ÿ¯<Ùcýø%¥Þø›õç¿ø7?þÛýç/V~üÛÿÇ?þÏñïþò¿üõŸþô·ÿø÷¿ûËÿõ»ÿô×÷÷¿ûùÿð~÷Çÿñ»ÿð7÷§ÿøüßÿð«‹Þ¯3ÿýÿ?óÿ0Ô˜šS×Zd1‚j6NXsÙ ?©d)+k)ü*tñçQ»Àš-tƒçZ"lÙrâ׿ñNò¡µàÍê9nòœï4&àšË(¡±¸?¡ ÷‡¤7ñyP)6åû[ í¼¬8/#z&zÞÀÎ-ÙëÞ%&T5µƒ÷5¿Sý¥= ƒÞaû}£1-löØ…²„L·jŠ÷ãý^«Þöš9ÐïPf¿nÞ”Ÿè»c’ ‹ X\RÞº6A\YY)@ûƒFnóf/;söˆ7Åy(«7D”ºb]A½èxèxò®0CjÚŸÍÀ‹xížM‹žn¡“ÊR¼)jm‘™ÒûC˜¶à¤’™°’wo^Ð-ºOªlxYQ[ƒ©üPð¯Ö½×¸lðÜê&Q (A„J¯¬ŒåÙÜL–Ò OýE\Ÿ:]Ðͦ©%iO;\X#Óá-PÔzx?øÐÍœ.΋sÚ@÷sãÓÄL€&ÑÀœ²pÍ—ë?ž=LDŠ¬w”KæÀ|UOU—ºæ8º±áÍ¿fæÍÝRð_¡¥¹AÁ÷µ¶ ÷×Z¢¹FýÓ_{ +Àì3ŠŸ +°_‚=¢¼ºu48Æø<Ü/ô7qûÔâûR¨¾ÔÃ*[ ¬©FÙÊ=?‘Â@ÝJÙVn¸Ÿj[ Õ7KÓ®#&i 9:çAç{|æ~j[©uƒø;on~ +¡=§Ãütf^Sðº)v¾|5kç½5øƱ®ÈÝ&ck4üÖ3Î,·’d±$ºüjÛ2Q$ ŒÓ6€\>ˆõ†‘¡Agëùâštê⨔&eš-g"\‚ ÿ—Ìo&ÈD –<Þb£œIâ)׬þtqðkÒ+‘}×Í^r%ܘÝD òBï¿ä`D ÄäÍ1P–^˜ì+­;qÉù\? ŸiÜÂg>Øá‹ÕŽmÒŒ»,&ÍÌ¢NSPk¨Ö6Ÿë(J¡{½äi›‰®÷í™tUï{Ký®ß—LëÈ®' +ÿÍ_81™A°=¬êÔSsm y´i+ M¬¤’¿ßY·ÈÜüsÑÄú˜6(0 ××YÞô×Ù˜nO±I}4F'åÕÖò+åö5¢a°»šŒ\ý¥üŽC+åc¸ Fvð˜¯1†€ºßêy½LAÑ™N±Ç8#‰p†¡Sh¶˜ßDXW›¯ñëƒ(½2§Xäc;Ó3.”±€Ú¢ÐƒvÐ|^öòãú&Âi⢢Á`ëÅmöçy&I_÷E³4$V2Hz¶öbæs×Û÷LrâŽI BÔñ ”·*z-8[\ôËܼtÔ4c7!·Ñêc“dòŠªqUñ3"eúRÓW*|ÔÏ(žè‘gNÕlÄAšÜ§Ö£Îo"Þ!¥Ïèúu”ò*±fÊž¡ÖÔZÕ¬A8üEè +a 0‚Žý<ËJï8ˆÔuíö¹ê¨mò=>hiµ _bï>£Äfø>aÇE¶í…QZc0–í]}ñ®¦@R„Ì®¦e|<£íd›¿F¼ÂoNs©W”©±x¸êÝJªUԬ2'ŒZF`"éùóflýD£˜„ˆ:ÎH=6ÐbälÄ¡Êu{±5dyéÑrÑ-±ŠÄ ›çBkÉbßA£D7ôi‡§©C0ΤéÃne¶•JÔ\h½œc žý“’FµH»äJ7QØìÖL(…ÅsT6èBìåÖÿ.4†mJe®·5£Ž{äÛ^çÇñ : /è|t¶mŸAª‡à€nûR·ÿ+¢^Çø.âˆï"€k¿®AoÈ£‚Ïä‘i7‰‰µ3~$B÷·žÞçý~<·êbÌn——°~œ[E˜QúÛlëäî²F|éßFÌ4HzEzb?’(¤6ÅX­uŸù¶·õ/$šùÖÚšx¨3¤«÷“Ï€ç u§ùñé¡âàÄ bZÃ¥›òÍŸÙùT)ª¤êöulWT‘‹…¥s9öôÓEEñ´Ï.‘ðô,égDîSAC¡hÃ4ø›óŒ*p>vF6vF&kd¯^âx’ÏìãkYqvÈB¶bô|RøbOeKó¨û Eé5yïP ~=ÞcŸƒ€Œ½¸Øä_Tô·`d¦üK8þ±¥­ãì!=nѪ#·{Ä*šÌÞ3HYAròéQüoæb™ŒÁ> ’¹ƒæ +h€’Dì"_¡rŽ›p­$öï’Ntîšù„ôï>>òÎÐgŠK½"ftêpÛ#û×IZ’‡‡þÕ£/70Î=“Ѻ4\kœµ÷P4°•L†U¨2àœèƒj€3p ~iÎ;?£÷èŒ~n¼mE½ÿIMOín×D™eåqZ¾ÕBÚ%2¢wqZÅc¾½.àüOÔp~»Æ„ î>Ϙú“£¬ë5EÄiëõ<îÆúþð6Œ Ô±"^‚O݌ؼòøcòÌÆñÊ$Ì´Èæ pGV•êBYÙú|ü„:ÃZîpÄΕ>£J<놽l°)!ñ´lþ ¡, HL>»[¯ý÷×ø=G¸kÀΞƒÂuÙOl…N¾”êaÉ´Yž;ÝþÜ^þô” ×T¶òd‘·bÇ j1l¾zKhŸÒšÐ´c*L+@3¯¦zò (à¾ãú÷i›ä=â÷O?Z*µl[%çiøú¬”†ŽÆƒ¨oɵBL³ñÝú÷¤¤僺® gs¢ÏÍôÜçöÐÄÚ‰é¸ëpV×—¸véäÆ}F[Œî–÷ŽÖxÊÜkà"²6ö·ìÖ¨uzŸP+N sl&:r•$·ôO,„ÓZ½€c\Åt +“ÁµXË®ÑPO_Cû€—ìÜY±ˆm`QvçuÀV¦îW'ÆSÂÞ¿>Ët¢nÛ-Ô87@`Ø@a²“ÖÓåî]'âo¾wþMõè˧ÁV¾Ú3oÁò9П¦Š)àsº¹‰'ö^¼ |J3q„g×P¯ò|;+Ž8`((çé:×>#Í ËÃá•åBPMEYЋo:Äi1™Û{Ý»ç +‡Mc@|ÖÅøÛ#’áð¸êºèÆD@+ |VæòUm¾€òzbé:ÈÌ`–*•?5 Òø‹§ÒÃÚðÔòzäOwóAÉ)]بýðÏGþÁíûDíÜ“Ùv¥ÃrŠªK.l]€­l™Ý‹RŒ[7—íƒZa°é[¶yäEkRmZ‰¢•ÀZÓ~ ôÅE¤àÓ¦ø憄f$I(!!ûÄâòuà +êYÕf=½N +Ox*ˆ,þ,,¶çL5S'-… +Ê´SE+}¥7E²PiÔ¡{‹Èñîè{Z)1.µkV!ÊÞQ‘%ÂãšbÛAíê:t\>•Ü%IH6,›EA^äõâ2ÑÎ ­Dâ^W4Í`Iã[’ïSüø©-fe—ÿîêI`¨oc«T8¹;IÅçu͉Î9£(|Gë…pÁÒo ,§¥Lzp”r*{;¨t$ÀcbaÄZFU?a_ÉŽÉÀQ~VÍŒb1€htÏcU‡ì£FqAvnÕms­:…çÇ·E¤¾íïBë½Ò˜Ú[¬b¯jt›,ŸA3 ¹s!\ȲÌŠß‘²Å/}|åÙ 1k"ÚŸG`5ýòñwEÞæ¦G~„=ê–­B¶›¿8Ò]!¶•ÑÍ]|wL*>Z%O®Óí?Š0-¡ó°¤oFÿ[•¾ï{„ß—â7€ÅTSÙÇyp·T‰þy-Ÿ„Ïψs#Íã}#ù?£po·Æña]œºYñ)„^¯)öÁ¬R'¥Peõß"òl!}âªqk¾ýÍy"¼gL«-&äBXÇIþ>àí¶x5?¤ÙÏ(Zp˛؂õ}kòcZ<ÖlØÌQÊ&F‡ñ"¡¹B1tÖ,Ô­ç×3¹è?\á8(ï^5MX‰µðaB;ÐýÓ”½\ÔäDs¼3:ÐÝ=÷uĬq†±¡4D™¬(¦Ú|øäAÕ);!42Hé–ó}« “z¦PF„Ô@´îû%ir< *¢,sÑ–£Q•’¸t.?m†#J©% +iG‹¬a÷<+#åõ-’aþ˜»Õψ<›÷Œçã<°X¤H~µèyn/D»Ø~D8 +úvì~½éïQW)§0Ɀð̾·$…äm¤)¨ÓFDkLVÔ{Àï7„É.ƦLýŸ§éÂ" ÒE¯„庮?ꇼ­Ü0u@úÎJ3c®àëA° r™C ‹ü. É2ì*M¶­4¹ÍB>‚hpaé)·#ÆNŠ&’‡ŽÀH÷k~˜gÜÉ'~ðÖGøxŸVÞ­r‡QªTÑg#T´c Z¾"0,ä±àI—*Jt'Xè¥Å†œàו²ºÒÞ¸#)|O¹™“oÏ3ÀS!´ñhÁÊ®·^‰M)dYùðD\rY:ÍÍýº°r‘ί;uŽÀËôÀÈÒMAK\xâmÙJ¯ú›ˆz…Ѫ>?é# +”¯ú\&B—S¯´mw—?"ÿ¶Þ4¯¥¨üøyà÷;˪ÔØJPÿˆº1U6¬o…5¶²k.~ÐyýiÉï?•ÀÙµxI}0ïƬò¾þ ƒ™<ÂIÆqã-à5etHj ÞÆçIÐH¸âÝÀ&%¶h„†\DL[®}óznÞc K5=‚hˆGö1BdØA¡r–Ø¢+æH”ýKFpIãsÈ[]˜aQÆs¯‰b*ž»í¤|œ%T‰÷>ÙËÏõuŤK + M+Xøw2Q`:c+zÐÊäýA™–=çÏch„Ð’îÞ¥Ùž_£†emÄÂô:ƒñ=îéÚLLò¹pÊÞF~Ö÷(Å)At¨¿‘:ß©aœt_Hê‘Ô±îæm‡üú<àˆç4?^Pì®X OM§ õÏ&øаyÔ½¹Ä?%Øÿ¹aÑ·µì#óƒõï© \^`,ˆÜ„¡¼ -8ç`'#Ùs¦4` ´wŽšÍŘ'X33™õïwSxaô~lЩ.Q:–„eý̯¿ŸÇÖ•už{â~D<%%}S€^–9y«˜íœ?5CHz^ð7ò¨ÃVÆš çÖÈ•ÁæÚ¿µfúÃPää9ÛôqpÉ!iüCÈ?Ÿœˆ~=³Ï‘»õÖÝtãùÔæNú,3Ïã¨þBʪåβ6"º~áöZq¡“öÀíò7žàú›¨Õ(àëbzî:öÝŸÝ~£8$3âí %=ª:bk”7_9Ð,ÙûòÅsWWÊH²ïˆ*A0}ü«\j-Й2íòZAëU :áR€‚ƒò¬g€Ê_Z &Ú&íìþupæÒAíúq]†(²l°¸Ù>?d…lP`Ó0Æq~sž~PBóâ“M]­‹õs!~F¼/©>¾Gá€,ZMóbžÒMGÚV-Ô€wèõ(l'9lêâ‘¡Ù‚v€¤ +;‹è’M-X)Š®1V¶'€ðç¶Þ Û~7Š'T\aø¸£Äfž")¨Á§Ùo +ƒ} +6Êè”);Ç~zŠé1ƒÁ~ê•0á×ÞU¾Óß=HrrªÄ4qeÍ^˜ØÐzÃ]2úÚ𢖼6GÒÚÐà½iXy6âèµ.wÎψÔÃlÅR‹£ø8æÇ< ,ÔÝ1Žmž»nÜ¥áö{Þt2i5?ŒÞ • ¨£\ª¼vE¬Á²Í€ +.nBïÀ¸#¢ê¬¿¾*mŽíºŒß`‹˜½…©²%f.Õöfóˆ^«A G^1*´ª~¾õ½$m~Råþ’\X¢ÅÎ0^#Áu•îéÐÙûð‡%¬ã„»Õ€â\eûáN}@˜’N3¼¶‚êäÈ‹×DÉÕµ¤øU·TÖO&‹AØ„LcE³aÈkKgu7]³YìÈtÏë–·BúaÕ™;e,H«Â~óØX8£ÜºŒ#7wÏìµö0vÜödv£'c1•mƒmR´iL#ÎFýÞ¾sn´þÖÞnU—%KÏ»ÝÃ:”u°‘ñ›‡öÆAŸØ:jšR–ZÈíß½ãyÞÈoU­9»Š‚¢°Õ{嘙ùeFFŒãý¹~^ žQõ>R„WhB³˜2OФ¢jÐÌð/t¤©6°ŒzC~‰é}P…8ç§vòHe^ ³¦™Îo·zO„혉tåËPi‚1Ùù“\–³œU'þvÌ7í "LEOp­²g&ïZÑ:Z‚j +ÜKM |Aoè  +‚RCábIJC,PÁüØÏõà%ÁÂjB6àµcºôñ£U©Êú£( QV¼M / +¬Æ²ðŠÙ.oØBåàÎ[ÞlÇ(P¤ pdËÕcÙ#%÷gU󻦶S%ágħÐ+ºŠëŽš@Q®ô&1B*qR9O¶­õ%F@k>‡™>í²_JüAFz‚6ÂÑ•‚:Â(2æ 9½ÛH¥0ظÈtÑ)Šš†3>Å ¾Ø¾H} ­ðö®"‘ÕJ\øOÿŒt‘+[ªS£ysMl">­UqZ*VØÈ”t!ÐÕÅ(ë^²ÿu¾y`{‰hYÌcxvwí÷NêÊh~:ý(Ï\åõVцÖJ?n°Ÿ>|e¼ïCû·««°Ôë\H!­íg<ÓÊ—hÕÏ?,x¼wG¦ÐÓ#–dbÕÏôS%3»Të^aü²x_5Wb' (;º"~I`˜/X2爦1ÒÃ`eŒ¯Ï•ž /vaÓçé›JJ©–*,ñ¨Á\ó“h!^Z<>Éd¸Sˆè÷¡eÑðyQ¶tËšøZ`‹cBmo‘ÎÛ¿s¤íTc—¬*iƒÆ|š-j!¯‚úÈjEáÏå^¨ŽïT,šW¢Í•äWäßíÀx^Ç”˜% ým؆³ý„ G…é-p¬×µ²º˜Y0fWS7œuBq+°uz¾æÞcEñçÂ+±œÙô¡g­æ‰Ÿƒj3,ÉPâ± _¨ìtU»–6ÊhaÜKÙÛ^,Í'KxÆiÕ(]‹æ¯l2Ä]©XˆÑaÑ¿²‡ò±W¢4R-‚ûGëvED/£ìûÞ¾Š éÞ~[¸ÄÂØjX;ÞW¿ÖKé’ŽC«å6£@•·¡¹æP9'ß +½.Ieð‡&~7Ý-)'ƳQtØs±ŠH/0ù(Åö€³>@3 *hŽ+ôsl€Õ`ëd­Me"vóÓ|È­Ž(Y2’k&ÉQ9Î7À.”'_‚ä71ÒL„¦ßI|\Mî”.4+)L+;Ž?Ÿ„½iÝ·¦çždÿ*Oã€q +<ÈÀ| ¿Íöu¿…Š§®–{K ž—͹És¸ äOàÏäÊ G +WFO›ë±£ª|DËAÉqP8¥.d¿=H¡À +k-Ï%6 ÖÓÍÂý–D¨»³Ù¨ÇoÐsKý\éYG GÛvXÎó\€Ïý„Vפ¯å¼‹&uÍÑ“—‹+ntd¬LiœÑhµ°B‚øÔ¯C×àÜCÍHñÂ)TXOwŸÖ'$Æ=Û´cX!ã`o0ÂÛÙ©´rÙ¡(“ãC@.€’b)£¼€øs-«òä¢OÈr–ÉmE.þJ–I&y…C¼£ìÅ2ÊOÂŒ»è‚ÿ +ó%Ôœªñ/Ž^ÌDì ”j¡„¹ -Û›äÃ\¨æ êímc)êiq™V´lyÃ`ð²ñÑý&<¢yG›ªf÷^RÖ‰Mn]Ó] 2†À2©€I½†‡‹uغۖVmQ¼ÀX—âÿ_þN~ÿ~›”{Í^÷5JYfþsT™0Õ#Q¡ÜiáH,þ +¬æMgcïŽHä㢳Y•OÅ¢½ä<+:ÔrûÖMþö¯81J–€!8J*R¨åñßqaƒõË(9¹«]útcŽ«ýoú4àÁîë(ý뻳©ztZVÐ5¥$ÓF”ò±¨Y5g!1yö=Ò¿¬I¯$„1]÷—áì)AJÉ?V—ÊëC;i“q@ö=§UoÙÿœíV ®Dól¼Ðå&X'Tm6Jl60±'°°tsàQšmV|–zê$8>',›¡µYäÕö·Äš“Qd¡&MÇß«ˆÈLAú>½VS¸Ý3d¤ò¬gä H” XYæ=i¡[¨0ûyÄ&²§ÿ2²ÛóTºÖתq2sZ@Ooa•®C ƒwª +ó0¦{Ô®Z¬q…›ÏÛ+'݇aÚ@ŸƒÎz Ä)`&`ÌÖc‹òê`Ap˜ÁÓ`ö,:o¶tÌ•í÷'!ÎÕE¥T~G4xÄ1d.gáçBã2B±SlèóS¡b”íÉgO-;ÌeÔÇ·Ã{ý†½Í«Û—ÂýéãBc½z;õS Ñyö <¼}ÃÔoŒà¾ô%`ªõ°ÛçBúüÎ)·‹LlÅ®A)€ˆv~]oà*Þ€>BüTVÕ‚3B{Ïã#FéH/ÕhîÙÐÆ“’7È8"mHzpašJÞ5=qV”» š¤o‹ŠÇeÿtDÓ¯ªE±sÓD„ntW¹¤@Õÿç‘ÃA?­½7Aâ´åŠa¥°7x|ì·³Ê2à‘ªv;;r O¤ŸçôFîëµyÆíè´ÇoÇkµÄ¬bÔþÌùö´‚¾uµþ±H$ìÒ b…¤ßS:é~Ezƒ¡ÿÔ£EsŸ ÈZø¾ô3N‰¼¼6ô;m/=˜Å8®´$èMìOçÒ·¯Þ‹R@”„Ñ€Œ¡…Í::š·Õšö"o¹ÃkIŽ}&8ª'›%° +{=DD[3R7׊Ù°¿†e`—`|ÅÄ`ScÐFp>§þt|ç-HâÐ;Óåâìå!'ÎwHÍ·<'þf"ešY®"DPõá.xPéÚW8ƒ]Ò +Õ!ÎÁü‘hXoA®ìÄX½x@QÜRd÷²ûž voñj'ÿ^ EoºzÅ}(„aöŸ†!E€¨öW¨-³Šø€©Ð²¢ÂNc‡Š[a›û p3H›Ô€„÷6£Ü¸*ÕÖ8™ÿ{/È‹FÎ㈘q–ë•(”‚¡oVZYŽ~OYÒÓÉŽ¤Ã=‡ÃµúD½Ä +)“)‹ ÕÌà"<„²CPëwÊaZ£Œ#+Oánvk RÒ¡ŠÚ®ž¡ËÉÎõØÑ‚¤¢ Á‡Ö ^æ@ ]ošŒà«þ åá+8X€æª'€ì¢ƒk+«FSfOžý}@ôUm íq)ß±³"fKªpö¹ÿ=îm*KŠ‘@ ,S_êçpÃY•MÉ^Í(4Q/чŠªç{D ‚&hMðìZ-¢0*"ªoBÙb¹ΔÔ…x€Y§Óµ×'ôèÕ›¨ÌÀíwvÊe´öœêUÍaËLW¦ºØÌHº^ÁÀ°%§~.ì:Cà€û×sð…‹œeÜ_Žae)`[ +ê(¡ žã4ºjïmº˜V,®3±ÒßE󉎻í;ž ø@qo~^1;€s„fÉAº/4+¯*¬¹cVIyŠÝÓJ‰“O~ÝG]…Ä™O‘Ežûð$¯¨ÏRn/Š;ßYl-Jû +|ó©2DX_Jƒ¾—/Beãt±&¨Î;Ð|§a‹Ëû³G¼fÝQÔU•ù\±!”w¹o'^+’ –å|”TúLÄ[Fض©œ€Zßo~AP¬ ¶‰@ݽâ0âüšGëö],7ùב:Ã2ì>bŠJ`°8D_ÉÚß³b:¬"û6C®¥.qÿÜ¢ÈzU ƒVSL«kèÓÁuäâLšó¢[Ò±J[nÏO0È®|£SÑa>ŸÂÞPm²K¼\¨udãÙ9Z¼Ää„J{"t‰AÖ<ší£;s…”B—ó&Ø|Vå EM° ØÛÁîoï§Q"öQ°îJS?ĺI‡¯¹+TÍ—0¢{•ÔZ"2˜éÁŸ2=4ŠuÄYòÙöx¯t(°5"ãÒö»=ßpž³]¹þz·={ÂPÓqâ:[uýaÁäd2XÙÃ#=#lx¯ùÙ,¨­éD½¿°üßä¡PšÇ¦«B«X‚¢<$¾µAz9ë{µGS\¨°&"u¡¬ýU¨wLj㪡¶°˜‘r7wê"rºutTãå7Ôõi5"\på¯b‡…Š•€\ ¡Û÷líôÿS2eÕéü ‡\DŽýÉÒóÀiÃÅ" ¯õº|- ‚ÐÍÐ’º¨Š¡-œ7 Øü(E´áŠ¨«ÑMµ×õ +xŒTìRC‹—]à&–EƒÿÚpŠb·\žx‹8ú—S3­½ï€)5Ü!÷þ½°Eiï‹Çßi»‚ÛŽòin̹ÏOE*á( ÜCuÈù.JmÛ]ãœç=@ÕŠ&ˆ—»ÿÔzL"ôÕjh[ü¼]‰5nkéïy©×ŸÓ¨@/¦à +BƒR%Q|„EI"0ˆCjØÔyGƒ;[ #ö‡Â/Âì4§°A–s!2A„ÌPâÕc^o´šA Á”¸¡Ô‹àœG˜Ÿ}erx%d¨zÁÝ,Q÷„û]›‰"7PxI'ïyPº{ûXÍÄe]ÂÛ¨û:’H2)äï{2F.°æüœWíuEªÖ€€#¨ÆÍl0l¹*£µßhŠ<4Uôt)§šKˆÍÙú³ÁRõD•€¢’ª¨±=|ªøWÙ c ¹êWˆ$;¤åÊmEÿ"­ì{`ÉÓ·Ó*lZ£å\™ÊT°§Vü%Y9ŒàÊ–~E]1 (ãU¸V¸)E»ÄˆÞ!NÊê•+_²I 4]ãU[h=Ž±‚=E.@êx½v«òûÿ{`,`;³ó´fQ;fö3˜ñê +oIV¦ýDg¤ƒž…(WÃx0EÎhù\5r¤]ßd¦p„¹Hî·Õ”ã7 (Ìß Ù-Fž}Ë:Kö âáÕQ^×iA5²È\ÈûÑ[%#ìåA5µš‚ þ³¾hø:Œ\¿kšŒÊÛ3wˆŽÌ>¡šô5ɽa Ò§}¥ØÀᜉ=:‹ëîŠÊÆþ)‘c¨gÊ8:˜ßŠ3(9û{jFë’(Ó=&äDD½’FÒì‘<êqõNw»ý÷݃^‰‡@ì$ÝL¤Œš´ùpIj¹n×çxÿÂÉU6W5§x—à"¶ZèÑ`,û”)DtýJļÞ&ƒ88ñN§üKþ #aç+å>¦ÕÏK$I|DuîØr°ëÜË©º©úUƒÞ³˜¾'8‹AI_ÉôDǯxk–¾w¸Æ;Í•—iDbCÔõV'5æñJjÆD!Jq¬èƒ¨¯L{X-}t #!ŠîÆÛ‘}UëÁĪ#¬/aŽW”Y‹úÐÕü O¼xøÆ'«¬3:¢\¶ß¾êàzKóeÔ’ú3Þ˜Ó5’›G„õ‡ D'‡^ï½NÎþ©ˆçœÇNПSò™êk…º|~Ñ2$’Ò:W?ÆË43Á{ÔJªQø)Cu¹%¥«¶€¡'§X +óÍös© s{þ¡ ?ɼãÊÌÝ"Ö°¬GÏêý0b¿;«dÏ}¼®³ƒ7Ê…œvªß8T?>¨F¡_æþç!&× +7Á~È[щð©è€’yF³6µÅÖ´uÒOKªPàã-² c¨ãë(LB%‹ÁU%·ÂôÐ}Òx +k’÷¡R×#F¸w¡@ßð&¡4eçuž ª;ÃrL¬2rš.–o’-,:OÞôd]B0°{i‰OàÛýáéVçD?i$Íl°“zȇ-xѼe¶±{ÍŸò€ŽmëKùé#2)lïŠÛ¶á¬ÅÚ?.Þƒž ÌUĺ ÇÝ2µOŠM.*ÙñaíÚs“|û7‡ê®B`;g$ìjj$2B}S5sÏ{U©Ù˜©óh5Úì&k#—O?Wó•¢fôz‹p/@“*)€ÿçI(%ŽÜ<Åw¸æÃÖI†ÐgI% +Q·3q=» SÍÈÞ…¢|DþCÃ㪹Ruµ¥ßs¥¬í½RpÌSDYB¹JõGH±u’Á7ðö<½‰Çh 툩Á3v5*îgQ_çž›Ѷý‚FÆŒtx®´0JXº†uº#h2ºÙÑO{EÔòŒv'|Æñn#÷.ëú#œ’i ÝÏ9âg«$0”=.Ñ®§Ø=.ë¤(»€ïÞ{Ȫ0í}ÐÉŠù‡0#ψðàNb'ª0Û9ÕõrâFv³‚êTÚÀzšÂ:ÊW¬c÷æZÌSc?$+8˜WŒÛò²í(¾<ðìf‡B™À‚+šUwÏiÜEÒ +T}«DÁF"K0½t0û8J 9"À‘Á•ý°©öÞî•ç»·†DqgcŒ¤¾N_ýèˆBd|Úg~²~  jO“Zm*%h÷ÀîU+ÐŽrtJÍÇÅÌœ‡öZÕæ9®¹ÿVÞ,z^ìÿ§«†$³|Ï…nŒë*NGÞúb-gß5®˜[u­8@«> +T¡2€‹ÕM Ëû-›”À•ÛJd hOB]¨Àþõ\ì™ÊhMáÄÉL˜Ï£9hiꪳWA:]$¶˜ë+ü±Þ·ßèÆîY³J»tEµ)š‹,Ó|ÌÈ`Rô{á–Ñ”u*ã4S¨ûÅBés%!X7^Ë3LÔkO)L?¶ÍEr¢Ñe2t©Z¶7]é¶"×C…[ÚVÀF?.釒ù…Q¿„[Ò©#[ ÞÙ]ˆP£ :né™Þ03ìã°;)´Áîdd¿Ð]éÝP)ÁGâB*xGüÔ= †ĆýXXÖ¹7Ím[<‘¢±0ö|‘¶5êOxåO®Aüør]Ð1!+5ÖqDbNb\A`öóÛ9Å `ÂG¨eÔ×_é9Š´{1ëí`VmõM6µÝ²i´ƒ‘±˜q7ºÓÈÔEC#³–ªÉÜ ûä`Ѿ=¨ñU±§}Ú­r0& ”¸9É°:ëÈŽé¤Þà¼N¬¹bž3>Gƒry¼¤–^R×a¾5Ë5ÿ®M,íÿZ"y|Ñ=h3Ú>Dè,nñIc_.vu¿[*h…T·P´ŸƒnÕSU¾PvE-d÷ÃŘí¨t·XÊý"òq ®e÷}­<_Œ2XÃ;ÝÊ‚GrKEÒ ¹[W<~ºÄ@ÒcŸ2H£sþëÈf‹ŽmaˆÒlÁ³Úô‹®°%0úT|×´ŸÍ/saÜim•‹ÂtL±hA7ùuˆÊ1&:ŽíEãïþMh$*ÐbÏ6Ž{=™#A×m÷¸½½Ð"¬ïihDÜlàf:+Œ“ìmÞmÞ/€Ê¡ÔT^Z3ºâQÁ$Wíçkò‰ºÈ-[DŸ83MÏž£ä̲¿çr\4•Ÿ%ך§^@Áún¶)“Üf™ÊáRÅVÛ–/æê(š”›Z³Jð…“4ÙœWFUó¨ƒe»v¶ôÑÝm± B^HíÉv”áo‚Ø¢Ô’MrÃB&J£1ë^JÖ==w|ûh¹ø½z…j>b4;‰OÎ>Ù‚TŽ(îíÁ¢ªÝ¾õ./l¥PÍÙ[©yô·„7ý»Õô¯<Ñ_0çÌÿŠÿûÎ'SÔ +%˜3•OR¸:+2víåxÁœaîÙQ‹Bö—(–àsŠFÊר´Ÿ®ï<ÅÔt² ·÷nãô¹äbÂè¾bbŒÂªÀþY£aVë^Ý2ø‰›U«ˆQúlK÷d(tºÀõN ®}âr¯J&ZÕ¨;j¹d¦ÓóÔ&¤fBѦ1¢¨ØÝY{ +é´3ë~}{©…Ù¤}.d“¬Ç­¤xÉj¨k›LÕä åëû= +QG½š{#bd³:Üß W&o`ó%´òž£SÊ€E£ˆI£»™fèPå†ÛFQ’\+Ì—Szg§ Þ˶Ó]ƒÝâ/Q“ +Á…_-:¤0Ü‚• U>±rgk¦òu.ÄòÏ3£ˆqÖqLe:U‚h€;<Û^ð5øÿ¼Åß|Ì™gÒ³œYd=þé4fÖg%J‚Ιîºn£#Ì7I”CøHDG~f6ð™—¨)×Å®äÂxB z&­ñ¹@hê…"|._2áß—[ÀÃÓ'@ŽI¹ åV²Z¶aÍCtŸj"Ÿ-/¨tŽoˆn3+èbUà~Î2àÒ]÷‘èÃâËÚÀâ;Î&üO"¼@3Gar§’㛨ۢçôÓìó¼4ûbàÀ²á3Dès¥/Q×Ê¢ÝHûïhéí¥ +lÖPMK}u›Ÿìº^Ïç@~¨ jÆ ©šõGU"º€Ÿ¹>Ÿ¨[ÒÚ/Ê"RÓ¾Š?Gž”Ô×°¢Õ×ë²IFk@"¼¦;®,Âêán@†„(#c³ÕlÎvÄDM&­` ×Ï_`moÓûÜF/î¥`[áf¶É÷€LÓ^• @£¾`¹– ðr·uÇÔåùû`”(B*}zÊÕºw —Ÿ_„§v…§vUßDÝGEw¡>´3§Àz"A¢#k +E¤ªyI=õDô×ÿU«ã/Çì<–:4,1O·‘†ˆT<]øvH~‰‚öZõè—âqø±Ñ‚Åî^ªÖ£ð$Cí>›îçMóó¨X$c£XN+=KÓ%hìSgƒ„ÉL!ôµŽ²öL·Æ AT¡ûzØ?$‚Y‘zet4—I«1WY¯îTc(ç¾_L××ófM@å +ZÜ›`^¿UV{ðÀj"Ä23ÐaÁÆyRÎø_ªyǾœ‚%àùåzò%yÊïBŽ!Ö? +K°tëäD÷ÿΉÀuCwÿ‘ZÐ!½â-]¾=[<ËRÚoe.Iá{ïW Œ·. ¾û‰=ÑÙtÛCÂr¿2{DuÙ³´’¡&Båc`t›2ÝÖÑH™ÔÆ5÷%-ÿÙÔëÏ&œ¥‡ü!°²íµÜ®¥PDt: +æ¦{/h Sp€¹bíý*_Ü;®NAs` Ò“zK1ºè =€ED{Ûq0L:-ø‡Ð4ãœ0ù³+JõÜ8ŠŽ œñ=å<íIDòuêE´·¹’*­00¯\IÁòïÝ#–y4{µí–âF*få8»Ìé´ºŽ\ǼVè +‹ŠƒMf¾š7 <úvR‹ØG.U<ËSÒ5îš‘ñ´·0T3°ørÐYH˜Þ‘ùÓùuÛ¦ÜQGÑF~þ´¥³zN i²*]PJÝçŠp­zæ´«]1ô¸Ö¸†fS´oÉîAcÚŒíŽæt;þò/ +ÞmóŽšwI]Þ6hS("â.·œ§ßqâ8î/ðÊ0N¹øNì¯G¯\ ¥YÎA9cMµ3ÿ}6ܺÁ‘ s…š PÏ™˜ˆàuöè*¯˜òqXÛŸö•á­©ãÕý5YMïq [’p‚û<ú¿ôeüþ·üAeÓÍþOŒM´Ïö_Ï®KH7ø=¤ðõ$ˆ¼— ¦³Žäí%‹ S À¨`¤|"xRUr¡Í?û£„@û æ)š® pÒ¨ÄöezžHTN7'‚yVòK„…Ýð ¸y×9Ç…¶×N°^€9ZA^Ôh—¿éŽh´ÅhRtP/DµNEØÐ8¯ +ÅTél8šÐù5"û¢~ õîºÿEzÒäÂc²HÍÚ ×=‘]± Dí“ÀQÝCºÄÚÅ™¡Ab"\Þ/pa3WŠÆB²3BJîQ>Ü~*€§)#÷M‡Š¢EZn¨n^OÎÓnA~MDgæï\ ²04)~6¾ÒnBZ¦â«èñ8Oš^j×ðAï'7ƒ±+·t\f6°d,êYߣÁLz„ñÕ»ŠÒegÑv€N,ÖºSHQ§’¾çb€Í–ÀùgÜ–@!n¾-÷àá:!µ a;#ÑI¥_•ã‚ÐÙoO ä3ÞæÉþ(íiüñ‡ÓÓPÞAs’õM”:b)ïd‡þwp†2mñÂþdGŸƒŒj›ñ£Ì3¤òÌ6©§ž~x–{èiÎ [ KäyÐ!ÍUh%ÓnyËÚÊ5…«µ7‚·ƒ¶–dE§ÿE#8´JÍ"À Šãº° „/»`5Æ£‚^ÐÓ% +»Ö?{¢Àïz!\jñ‚$bÄ:Z›(ÞñòFÑgÅÉö¤ ·Ë…YЯc‚nq&Ìž´¥Òìƒ[†.Ï\¥âË;û.âÐînžÎk(ô% +’’ÀŠ?i~§2Ýd;Ф›ÆÜ|[̽Ty}¨иÿ5 ÓÔ±üìû1= XëMðªéÛ\‹Ÿo˜·Ñ£ãÛ~Õ¿FI) CŽûšzPš-_›íO2Þ>#Ž(=¤¿ èû•ëÚ«þÇ +±‡3¾/Ô¤°CñÍÛßãuð“° +4\¾Œêë§âUé‘ÇÈþ¶Óô(Kì• ™Ì8±ÇåýË\WLÄôH­F¡ôyüB@RYÝÛƒÈR¨Å®© ǵsÅ ‡ð+Ø_º¶s¯².@Œ˜ Ÿ‚ó FCᩘ0íQcwXÖ1Éa›Ãû5ªèý9Ðk3J²éÊ9œ>VØPªš=Cs»ï7ŠFÌ û:›©’ëevÛÇ‚IX-<`M*$EŠ*Ýëhƒ…£†$æÃü¢§àq¸ÅF´¢Œ [Á÷‰Pâ<júQÐÇFÀ3.¹SîM+‚Ê'¬ÁÐ_ÈŽþ–£v$8ªÆf¿–B4n¿åXöÃëÄýnž´N/6žýØcsÀî2…R“fudžsÐÕ Þë>¿«ëŒHŸ’îœݨ®ÅÀŒîÒ¿XõTÍEçÜy:ŒmÎbë0 p¡ÞïŽë*+ l¼{€oôC“RÙ’Àý䣬~F?áéõòŠcÔ¦öéÙ´'~ÝU“$ÒKpSØõRøXNWpØQOØŽUég…ÒñÙɃi¥$çAõŠ!V,ùÊ+“Ø€ ¬r(“G½’¸¦z–@=Xw4í‹WûèÚOÊÆʺ·”Ü›â!š…Ù ¯8 åddaH¶¨x_L7ƒ‚ÔË|À6'(Ú}ï¿£å’å(ä©9yP00H5êp{ëßq7º)rMKNû!O!*ëýOûdÈiÏOج%g`?€à†ûFx ÐÐœ¼aÀ3?žMdüÄ‹FÇZm…ÑrO%+¹a]Þåàlþä·ô1Dúõà¸"ÒÍÏâµ'Ê…7KŒc“ÏäüÙS˜OmyïYáaÊ#°ßÂ[{ú¶mÄfÞFŒNΠ¤  ¶•ƒ"ĈçôŠcó‡(É•öM¾5· ¬©Þg“ü§QêœÏèœïÑDÏ%Úâ±VPzÈý‡–I³~=pÞît²øõ ª5ˆs¼®X Èa&‘ë9üœý3´AP1ßbÉð©n°Z;‡XõéW¡û9î¯i>˜ùWÑI<ç³±‚é¤âu¹ŽÃrnûÓÓ‘ì±\áyp­9zw Oçz½/rŸHDTÍW™Š…%P/ºÅ%Wéâ¯Oßð-_ø–idãìôÚ{C’Ž»êú£w€›‚$NÕíçA*Ÿ<ãkBUµ’Lë,Y´,÷71Úø—þDðë7¥IeFºžÑÜ3#üýw¥¸5ÇŽ;ó9†TÉ I üÜ£lÿÐuvîø¬Ë£‹Ñß—ïؽ‘”›èŠ®oþœ²–€Ç¦”vnÓeŸõëq“éÍ{L)?¥±'d»Ó¢O)™¹óGË;÷«7rt©Òª¼Œhð¦Tgõ×>¶ßŒàÙsÖveaÝ ì¨ASêþÝ«JˆT"Â5‚§ü.þ›]à8B FF"bç=bçïnh UòWB,Šæ¿þUËM•“zBÎ}¼)9âˆMÇà£?X“Úv °ÏîÜ¥òØd]Þ˼ Ì~N{%ÜKâ:ÃÎ÷9p êû±þûrλùDPøº{W²ØLüík4¿ð 1IcQ$§8N>ŽÓ׈ïfî/Q·­f¤€ã°#c¾£h…Á–—l¹¥«~(%ð1Aîóð1Á¦ãÿû)Ξ’i cX4§a»J[¢¢ø f1w¨}ZI¥¤wd@á-²±ôˆDŒ +ðDv ×1%ág¢BÖž½'¾‰ˆà¾Ô‡/þåì³¥_«·ò|óç{jkópS¨i¨,HŠ² ^À­àrîÝ:[ãð ™ê)±·×rÁ¨z¢Êe`Á—:çrs NÄ<Z¡×ƒŠ& +G‰hØøæJÇã­&i™Wh™ Ê `Lu:qR4ß¼ÙmÜÌÄF°=cþ#E~¯£†5µ*¢[wÈÌæY^¿u¹Þ{O†EåýE¤ìPùñh\B} Qý:N‡zÛô=:KJœÒd5í6>å¹=bnÔ“5§5A]CðÿsHX@ï×Ђ¹rÔøŒ(ëÓV#ªG¡èù IEé(ʲxÊ}žË¦ås0((¸ß±Aëëþ\`©%±s:Õ>4e¿ÀaÄ|¡~«%M%/ÀÇ^Ÿyl,oÅ +“ÙçåŸÂ“¼5Ř~jLq]svY|èmèAŽ>Ïao¯z†wÝ»LÅËàù ” ¬Ý~dMñ™ØWj­Z¤ÝbÔ׈ýDém¡Ë4ßr³QóD‰e8õµŠ°Àáç×i$ÜÚ¸–µ£´\Û˜|(Ñt8 ýÌÌõZýhýKo• 5s£üì¾âF­æ>l.˜Y»÷WÚÁèJøÀØK°™övC!{™±- ¾D\& +¥EÖhQ¨hÌëtÏÝR¤¾O‰º³$Võü¥8-<ÝO²9jöwTÎó&/·ElÿÚj׎¸QDD“ +Ý>aÎÁã"Æ!ªŠ±çwäüs¥ž(¸ã%úª¾>Æå–I:@³$kA. ´eöœ/Br§¤e•¬ïÒ}¾3›)¤×cï¸Ï»úÕÕˆˆ&]jç&ãŽÁ±J(EMI¢5ƒÐ¨7Õ;@±þݼ$¸ß:(xàÍhȈÜàø?ä'UÊWð>¯=o«YoFÂô0>“‚y“Ó,ŸG—$BÀˆÿj¨¼pªÀ-ôrÊëE±‚¯yð‡­úåÏ÷ld!žÊû”€6S⪤ ôh¾Døf{ÞlÅ\¿Dfw&Q÷97Úr£ãh¤iŠKÄÁjL¾óÁ”~¤Y|¼Çרà@M m=ñ¤ƒ¼haG¾ +ت¡x‚Ò²ŒZI­R´P½êQ(ÓkHÈ#Qñׂå׈¾bE@!òƒË6ŠzQân–Á…»t<ŠÚJ”ã=tŸÂ![kü Ò€nf +z¡aɦýƒ^§ä~Œ¯HdV‰Ÿ¦xè¨#LC"ÂD°99^Y-@ùÒ¤»ÖÑÖ” ñþy~WÓÞ°z,´ì •êœD§ +|MZB_ ÂL)+×Ç€ˆªv½ÒŽÃO`½³l 7:YÔ'’ü-}$€2§^ö>®¦E_fÑü›l zØ]mì)ß$Û¡ªe¸Y¹KW+žIo42ÑPT~ÈÐŽŸî0wÿæ<ŒÀ³ä؈B¥±ßß ¶F^²‡v¹æËÔþ%ê‹–*ÍËKÚæþ°æôø dÙx ó<} ˆÎý5à3KèE|Aèoßœf/‡Q¾ÙYÛ<ö¸€¡ö L"£5i½€=Ÿ»Ì€ÎÈ?W‚L5Œ¢·Ÿ( +”ò†Ôð–ĨntUGÈ1]WѨˆŠfGAâˆ¢í¾£¬¥—EË•ó„ø„ ˜ˆr¨BEk#‡â˼νXïV‘_!€û\©ÈǵùÞcB×~?²@âb{xPr€ÁêOG}áYïÊ°’6Eû° TQäfÄWžØT˜[ì÷&ÇØF¶îƒµh|Ș:‚p_þ|µˆ}w40¨bàöäÖjï‹©ä«G+éÿ,rÆýÒ}«gÄ—) …ðÕ {oèë &–8,‡ÃÞÂÞ|¶™çh5¤#ÕÓ·8‰ëkÁïsc’ÄØéGóO¡ +zØX13Ô+–sĶ¢(5 +ÓúþžbÇ'`&੪‹táë¾Ê7§)G±q/ó—Á®Îð—ˆò2è>Y/†øKÔuQœ„Ì/¯#ˆÓ°,ñ>‘ω{S¥gÆOzò¨ný5öôê/²DƒW0ZØvDÙ9ˆI¼Ã{þ\ÿê¦5à‘)½‰ Àˆ¢¿–¨àN„õBßâ§ÝJÌd¾ñÇQ4éñ™îß2øW + +ˆK¯¯äoY7—Í{ø¼hy¤S ­]\÷õªq£0G›¾EN]ékÇ9Ô©U¾‹ 0¬¼P¯{o¿Dõ£'ÝûX>Ãg¥x¡®/Pða¡è« ¤jăÂcÿ‘ÒÃJ¦Y\±£_£:+£þ¨ü`åW¢pO1‡ +w%Å•šçB¾r¾˜y`9x%ê^‰Â˜äïÎý#ÀÖDƒ]ú瀵ˆ{Õ?ªqpA©o*~L<P0ú]Iœji³a±’hs‰J?·Gð¢ww˜q¬ðŠ­ÖW‡/q<«C\Ç»Û÷Ë"ê9¿D!ò@Ò†VÛÊƈêŠÝ8“×4å¹Òsrö=ÞF™GÞºGÞzÕÂë¨ð€d[ìܸ²¬,Ä7hªÏßÒ»Ÿ ¦¤¡ð³^ +?+£)Ðûm©£ø-ÇNà¾ñEê¤v?098W¬£Ñ庋üÂ;Pd„š°wB¾wá%0#¤ÍõÙ¯Š¦ÔJAýzàÀ1R+øåµg3=Õ…ny¸•sÕ2ž8 Ïö9ÈÊ‹™ Eø†ÛZô´ ¡@³ïÈ,ãÑ‚ÁÜ/Èþ¤êö{7p‚x¤Š/ˆûµ*™‚iü«Ðœ¿%þG&î¿ÊÆý+OvaÛÿ˜`ëÿñiÐüø·ÿÝÿóÿø×/V~ü÷ÿã?ýÓÿýãßþÿþû‡þçüoÿåïÿýÿó÷ÿË?ü§ÿò÷¿ÿÓýÿþþŸþ¯¿ÿŸþãúçÿù¿ýÓÿû_sÑïÿâÿÇÿúÿðÏÿøÿ~_âOnîùÜÁ_ ÿ¯üÿCÒGcãæùÒXµq©”R°Áл sæü¤§2ãwüIê°J_,:¯œøó_|OüÂ:“æ­o™ÊewØ›ÏûühìxÔ»/7¿¶@­íD]ªÅçó%ŠªÖDtêíM±[Ø7ä5#úNˆÀ>¦¹/;@§K,›³f7£Qxh´€YÞ K“Š­ÃãäºgtX9 YU“"9mh³ZKÜ\œ +¦°døŸ‡¥òAì RÐ…]w3bïNÀ©²|÷D\M«¦"Œˆ£—ãMôüʺˆþÀXñîÈ,êüNÄÀª€þ€KÒ{‘£ Ä<®‡&‚; h=ýýëÍìÝ€-·œ§*®ÔEÍ3´*$ôjz»_È%Ûa¿,j€3ÅÁú‚mû¾…Õ•ÅFªÆ°Á”Õ«qŸ`Ok‘+]'O½â°‚rßåEÐ5/Ú‘’8×'ó7hÆA¶¼¯ôÜBp(i!°šv"r:ñ½Ô(Q¼ÉÆãö4ãüûÞ™û×€R<NÂÀnp ˆ÷Îw(u„‰ÎLTC3߈Ž™+›Ê’ûÜ[IjØ¡p°/r¡W›{…£Ð¢sOóÝIá6‡:÷û¯Ñ%‚€EÇš¯DQRé0qf_sþݳöæwEäó7íÕnÄÄ,Àˆr;ˆï#Pçõî×·ÞUí× §XÍÞ¿o¬ª]kàï€P +âSï·…;šêy]¿Èýï¤ÝßüÕÎaËŸýÂããbÍÛ·wkÐ4®cµÆxðT†ö ûb žOÙ(ˆ‘c3^õðêˆC/TÞKÏŒ³ÇT½¼•+0¢ý½¢“&©I)®.$C}g†=A´¹ ‚LãiÝo§KvA9®ûñ_™úx(D,d‘œøß A{¡½Ðòkøâ5äÐ¥);@¥P F†Ii?:ZZ¨æ4É@_"7K“\ߪþ7QL{sMUJf¨¾€ta–ìmøÎ-ʼn[âÁF@äxè`£þ%"ÃLýìý#j' ûæ<æWŒ®a¯dßBÓ¿âsà»Ñû›/q°(iYt€v;³‹åÇnh)ìLFÎ\[Uì£ +ÒTØQ¥{ZŒÌ ±I¸õ˜«:zì&X€)tAÛÄ\; ÓwÙ úó0g‰;ª['Š/…(ä=O°6Ìž{¯l +D<åP•PýœyçVðg …ÛóíV‹‘ç§Ô‘UlO DíI¿l¾ÙÎ7 +^±d5oF ðË)G¿fR_L–¾Dx¥%Œ›š°oÎÓ˜vèYû—ï=iëJ^˜§\ÉSʺ˜SÍS.sûU¬1Šyœ§áÕ|±Mò$üVñyúš31%›3äL>÷z3òÐŒÛÃ,Äó†ëEIÉ_½0S5F5yÌTˆçR¬@{I 4üC²—ñä£rîä±s+'½“þÑ‘t?v^k¬À„âí1èÀûYbûQÏÔc¯g°ýn‰Ø´Bîœgš¬gš¼s~¦ "J9ý:¦[#Q”0â¼pYèÍži»O§mL¸×eÄ(앆YÐ.^.„-yÁ”y]žƒE쵫ŸgüMË rl2¦3txè ¦,BØÛ“8@€õÖ–Sx‘}nF¥ö¨ª¢—ÝW&ÚÜ™%;÷‹1Еe¼ªD\ì”±CsÓ* ùhû쬉թ©»Í¯€ÿÃ2øœ“M¨¿=ó‰žÊÞãFcºVmøïáQ~^@¹Pô¶Hƒ‘¥"±§0νÝèv‘iè G„#NýÅÜ/äÒEÍ Ñ Õóz6Dåþõ’üÚ²ÉrQÃáª4vž¶,ÒñÁèÿ³øò ÿ¥/ä÷óAí¬Èehß0êí!¡*ƒxa¶ÂØ'ª]ì$¨» ßiü¢W—çqp^€R5”vÔPЮD€’’Úî0B_…hšS€”Ý ?aoŠäÂbyEh" A&@r*²¤¼Õo ¬n’ñFOß*/qàÍ'R8üµ>yU©F3¼Ögºm¡Ý=z²+ý˜ó#?J„²0ájÙÜëMÆžîŒñìe¹ÜÒ£«-ÝDarµÇÖž¤¡c±X^Ò£ötØùì6`±Ü ª*·€Ó4lP d 2Yb”4‹]’Ÿ%E`\ðÀ8ÂAð¼â›ãpn¶O7*ëgL}ZAiCl¬´Çå~3*Ú=.¥L´SÿTÅÀ]÷îêÊHêþ% ¿mèŽ$‚~= M/šÙô΋÷!®†~âæ_v®ö«¾»ÕUó3ÚñXƒís±kcS4ƒGL‚^³E%)`‹ZÎ)±z¥<€¢{¿'zìL ȺºÒoŸÃŠk›9Þç>78Yó삧ë>M %”Þ¢ŒÕ(Ý»TÑ`þ—?Ø¿ï5‚áNæ8‚Š!¢Z“XT£r§ÂÊØo÷#ŠUUÇ¥ JÙgÄ ˜0 'ÍýFH’¹·‡aÙò„éÅ_Èì>Goªö%êê—ú(zpÃðÛx2rÃ}T|¼èn?6¡¹¯çú—ˆQèÄ«™ª¢}spoÖxnį©uôˆlSª‹õ5bÁoò O¥øk^]œ«}ÅâûÊ>¨û5R¹x0ô®Ô’n6·›üŠaÏ…DV]§Ú;‹QÄ ñ¨øçgÐéØO¥vÓÈÂ~)U¤Ä€Ä÷(°êy={_z„›˜É=°­t+°zÚf—¨‹H·[Šn2ÃIìz]õ’lÜ°:'#e÷‰H¿ÔÝ3.wpÈDQ²@Zf¯çÉŠ\™¾²)©W67âjMñT' <•?¸[PËo]xÐ1ö'_èw3¦ŠOD]8TE¿“¨nÝaÐz\úÒh³d„sÜø$J@C¯óïÀÐ/ÝzžÏùQM•ø°Ý» ç.ÀzÁ²¹L÷n#Ô¿¨ï¶Ü›ÏHgµrUPüB¶õý%i©…ê¿•PWÖVI6K|Ä“Ÿ‘UaÒÑB3¹¬ä'>z7!;Sü ÐêêkÒìtÌõ¤µ¤LŽë=L!%ùÔô…Ã3ÿÁ ìèdÈÀ¥¬Ì“èl4™#÷¯œUÇ$úo''%ª°læVnZ£Fõ<kYC€{ÁjÍ•à·u÷Þûû<âšú‘¬ãK´æa»•ôJ?‹ ï9r~2ÏÈ•ûd‡AD…³å=¶ +¢vÎ'™¡êWxõÖSoèÊ¢^܇Üf Úý¢ÚºOp´¿‹ÁO£úŠŠ:5ë‹I Bn(Ì⸺AÓÂé~ãh7uÕýçtÜ’¡©\¾³ è^à~Œ`M¿¦¤ËÒ^(i%VxwÌ컾ÆõÒ٠í,ú¯DÙÙ»ª{]ðN£¬K³Ù€'+ìĽÀöÝDÄjŸ&8ÕbéÏ ]YŒäÝ\`.¯Üf߯È?G£ÇåªçʽÎAŒÉj CÒí endstream endobj 78 0 obj <>stream +çÌ4 ºž|JIäÁ„¯Ç‹,çŠ@3!ÑuC¬ûè_#è—ƒ·üz«c¿L]nÀ~"$öSÆó£©-É«¡ö´3ÂŽ{¥Çlº²}‰ðJø®ÝÈj> >¾;Ï¥;}ƒóÝ(wï+~lQm§ Ó†VÓè{s·ÝÏ—¬Öœ³9Ï> Âýë» °J° t–œŽš£[C2¥IW¨ }g£i¼BEk?–uÉCýáOªlð±dÉlßœèkÞþRÃu¯+;‘Î + ðþ&¼G9¡wpýILŃÞzOªAZa1Ñy—J–eÒCK x±ô÷ù›/tEú{?»½ºÁ´ûrèKbî.Íé WG©ÿ»ÐMÐ/)çÉ}‰¢¿8BÅè +=n^ ×喇,Šò é^^ŒKÐ/ï`c«Ç`kâ|sP0¸Ac½³ØyA¼r!›¸×ÕßhHí¬+oL"jöÞ›êö¹Òsæ¡E ½%:‡bþÎcr?pŠ!n ‡ÆŽØoya—9xÖDÜpF®Â£[Ÿ+Ùí±3H„Ë™ÓÓÜg(ÅÊ]" š‰€dÈ…ÌG‘¬ªç'%kBlü~Ú¬ þ=I)f”B)=Îe• v"#RÝ…ÛˆÇeæzÖ;Þö£:_»9É/¹úõ»?'9³¸¶â&UºÓìÜ7ÇmñBï]¿Fµ@ú€OJUžŸ"Ø#ós2‘ºW7¤+.Ð2¦š%ãÿׯ„º+&òñõ›Ó€acµÔ4c䆵x¿Žÿ׈È50"cŸ‘ ýÕ‚„¦äkÂì ?ú+=Ö­ÜAw zFMEñæ±ìq[Ûüñ~£©"“Ñ¿YÂm$£ôƒ©¾ãKòõŸÝ^ᛇÂÓo™ó×(ˆS~è ´âLâ0Ä-d44RµHÈb!&tŽO€¨Ó2ׯyb]Š5´ƒoßœ§RPCß±kót²²~²2žX}²{{ÄI’y&8Ârpçœ-Ýó³OîÓ?G£cGŒé¼úøÎ ØO×wé; F§œÂ‚kîg½yd¯UdÀ¹ ÒØîy#⚶Ð'dôðÕäËèRFÌþþt˜0®™})å¢ïañN²Ž¤ù€vò_ŽDoME—ÏÏðÝÙÃ÷F¾üóWv°ØLàIAk:ùæš«¢wp x  ˜ó¢üc¡õBÑ6`¶.’ïc€o™Ž8«,N£¶ðé_®Á&:Â)¶îÿˆðÌ=ÒÆc'õkÀÞ–š€9»ú(¿Q^§½·Ç{?:2£(ƒËŽÑQýñÝù%Šú¦<—G + šžIǾt‰¿&Ú¾ø1Ø̸Š¬bA9ÁX7°8§¥pCãݧÜJŸ³)ïb‹šÄsá$mÍ›EJòCCºMƒPÛÔ(tßñ¥³?þÛ¹`AT‡g +´"œìƒ*¢58ÛçÀ¿XNº2…³&Rýü•’ +àê>é¢Ìþè9Îo´¬°MÃBÊŠ?ÐÔÞ¬a +k™’-ÝSvÇÕDP1#ªsæôDŒ7¢% +¬6îëxÊ„¤'AHü NŠ{;uRqåFð"É +†¹ß#M–VƒD”ni®QÙ'"h¤ÿÚbÝ\MJ&3çi¶³\æ<|"óÊÔiî8,@Ø7x4B6žÏÙxšK@™cta9ÖP¡ö¬@‡©va•å@Dl®çuÚl˜ {é]AÀõØ»{;ôm{¢ï¶Þ¶Äp£«ö¬ ^h"àî©Ú‹Nÿ­cU7BïhCeÑÍĵpC©‘¨É*Þ í3„:ÁÛrÐÀ°Kä–gŠ`o¸Ç?oÉð-¸í#û¤™¢¹¥¶¿Ï+eQû¾_/kÔô€ ¾jƒf'ª¶ÛyÎxIÂfiõ^—Zj”¨+2>_Ä[Õ„Å} ¤ðPàǼ?4C)×|®ý›ã]ÅBúò~á„¿i…[Ù¦íÝíÓAÁs¬6€GÔ  P¾ o×Ï#kuú¡ˆ€`…ćúX;ñY§ÿ‡ù÷ +p$WªzT6aÙ âIt éĸ¤]Ÿ,Qû •Ó» IöTÒˆ²¸£šïžÞ*{ô>ijüðÕÑÓ}9`v¶FØ5®$ +õ‚ñ|®ÔmÉòö[9÷Süs·8X¥ëôf-´?†Žžî¼Åd/*{ס6æíšê°C¢ «ƒB5Úu¼¤ÇÓ#‹&¦å¶Š :6Áûáa²×®”& pþ\ Ÿë4ÔþÞƒõö k¬ˆ¢“U$”Ò‰XÖ‰úlÌŽ¬ï0­í;(ïfÓ¨Š·ÔŽ*b^ï3vª<¹Ò,žçžÂqo‰MÞ5°}@â‚Š Ö²@H½oÀ,t1³Áþ4•”jpŸ-›Ø}šœ9XÏt4ýÍ{_r]ïÐ9ñþ¢0¾Ÿ~äd’¯V®$—ým¡³'M«c fHØÝ/ÿžâüã¯3Ôrâ³d¿ÀgYÆóùgÃ;Íc.|žƒc}íÜR˜3ˆÌ*ZŒz`Q¨’°¿‡Â¥y$Šý`¶uJk÷ûkD^¹È^;ÂѾ;O4æ|¥(æƒ ³öšfß7èpqéúøù94þ$ªê6{ùùßô#úHr¿´\z|uͬäJÍ¡‰Ïàfª~¬•øó©ïÇARÑ¡á…3Ïz±AêÛ÷ˆCüèÒ—.XëDäãÝ™ÎÛíoƒÎ¼s7¬a:ó.¾À¯1…-D”~h!Ú§ßSãNÉa÷À-ßDüá`álÁL8È<¾œl”pld.ˆÐëÜA¥?†˜#Û#sè€üÌ L m¹ø ?Ø%1VoñtOK:ÔÓç)ƒª§4>û7íØL‘‘ñ% +-—~T÷@…¢¨/–„~îûb+lRB^+Ïã¼ë.;tÐÓUãÓ¨Ë=ÁNEHNº’Ñv}›Œæx‘¤lt'ˆÀ!gA4ë™ØœÑ¬äþóJY,;ºD=$“{“ +«ÒópZ"9ö'¢ÜBx%*"4Øãòµt!ý¢<ïr‘íçÍÁpi[Þg-³³bŠ :잶˜xB‰ˆjê§Áû'QôAøÆéƒ\r:zzV™X‡ÃË)|’ÞQ†Ûñ%â'iº†½*”µ¾œqg +‹OÑÕÄ2-i ­C®Ø—TÞÛð'Ç +ÃEÚTØ–êŠäì/Ž@ñÜ›öS>”=»“þ5þîkÄgR¶4Óÿrddë¨ûPsŸò–Uõ›YjºT ý”uwËãîo×½Aö–ÐÆéqûZ8¹»#€j-ì8»êňî˜çBf7(RFÂ{—äuGÐ(ú\(ÓöiÂQ䥂HÔUÎ 3ßÌ¿Uà‹pO ¸nÚÎùyºß[!âù ­ú»> ÑÞ4,…ŵ]?îޤ׫ ä•ä4)ó¡üÁxÎS¡ónÔ¾D!óE#Ó+Š6­Õì NÓð Ê`qs‘]ý,6Àú ™Ø/v-“ÌÞÍ!ÿžºéÃVIŽ> 6S7d äÀókó9¤>¤wÃ\ÚAèí w,aÇ=[®`¾÷œ$\…¢ Zº£\ÈË3 EúÊ<Ì%þœ©cܽž-kF+à#JeÉQ aCàÆ”9¶»& áŸîö5"@¨æ Fb“ú5ª*È+Æíf§L/—žú B›`Üiî\éKÔ£¯.ÈZ[Ä`°Ä÷?0Ð;(aÅh¨ÓU¦kðØï!ýLDùàëöx YCïc¬s0`뢄žÁ€^çaFÜ©Cä¡2ƒ¡‡IŽ×žyŽ +°Q „¼ÑºÚŽu¤z‘NB›ûGô8¸-˲w¿f7YFÎaÉb/\×[Kµ4ªÞɇ`ƒµ¤÷ &þêŒîò±šENô*žo#æo¯gÉ7#õRECÜ{®y‹€ß㘠+ûÝî/('bi)ý5"Ϫ%S|fà7ç‡ü'¦x`¬ÖÑÛ¡‚rˆžÝÔìW½Jˆé+7¹÷Cz$q¡Ñë¼õbþ`FDóÒŸd ²ý…Á¸^ Sðþ¬ÔlWj[›û§ß¹„N<Å`œ ÿªÒªÚVF%* ­êÜ>ÐM¥‚Â&˜úÜca˜ñù“ö° oßüa¿ýÖÈOvåP¦ã+€z¾ÒÛït¥^0$ñ³þÑÃä=âÏË7z—üÉÐxÿ |^ÛÅ9ÖÉg!<ø•gÎW5JÀ­:-zco .ͬÎ[ÃÓ‡”ÚgÕ‡Øc<þxƒbЦQ`´)dèþ8BÓ-ØŽ· Åc&¸‰Ýú8ºÃ;`Ý3µ×–Ä@$KoŠ®¦Ûrbm©hvý¨øÊzQqÙŽx&ºM]TðÊp%jÀ;è%‚Žy˜ +þÅó\!J«e2‚À¡¼Žõå´ðdÑW¹œˆZ…÷ ßø“fÙ4Trç>Å|}$î'Ù‰cÌù§}ß ³O†vsX×ÇíÝ[# %,<¬‘ˆ°ý‡Pá:Å9!Àtùð”ÁZ¤V>!…Jó`HÝø!v.Ùç—¸ Èr¶L‰I+wÞ2ßðf˜aúæ\tzÂÖûyJ´l6ï-ÚHåMlöÜid½R×lJá?9DfœÃI¬îWÎ;IQ;I‘1©R5i»I«XZI«lp‹ºÂ®ýó Ü›~«ðƒùä¯òÚ’µ˜±`•rxö 6„……R0ŽO'¶S™Ú›»1-ü.*Úð»†c;l +’Áñ·å@A+VLwR C&Pè>• æo”úJÐÔEL̓'ØHDQx¡6œ4Ù)Ö¯¯¶Q®ï2ÉOK àœ%èÈ Ë0ì• ©-¹ÎªÙ€c’C×Ök'3P¢gå¤"t˜OR@×Í0 ”+Âh´ù|î8’jSI¾&ïÿ‘JHØ®Óþý}tøHûZ¶ltλÏYI72±ÕN*-'œÁõ„KµäC’8±„€·W¹Ýó•§ðl;r7ï4A”8ê–M«¢D¬Ñó£ùp%sAX5‚Þ²+èÕ&]óI“&ÐÆS_ïá“l´•ªÇÝÌïãÈ[yv6 \Ÿ]Öíí þpvÁÝ’ñÞŽ_~MÒ‹žDÚ½ ŽÙº}Dìû$öËøýoø1Š4z¾{Û¹ßK9ú¥;Ùô;¬zc K¢ÙYÚYã.2{{0ÞGêzBE1?ÒÛ‡joúU25ÊRÒW»¦D·@tfÎó°¬ö”ˆ«\a©¤À­Xð‰ç! äÎ?4ëg&æ Ëj…à(N¥[*P«‚9Â`kyÍ[¼OFF¸ýãpû_%4ðí¢¯v…ì=šhJ¡&y[m¶Îñ èÖ“ŒHTíj{&È·Æ‚Å·ÖíPàÍ“¼•úâûÈö¹¿f¢˜BE©+xà÷.²ÌeM]ìùqê‰êG=<²«FظdHeþ¼Æq—Ï\¹M¢ÊÇöÜe’àÏ}nåCþ—ôD<.ÐíU‡Â»·¤·´ ³ŠûB ݶNI¿)üÍ.ËÓØÛܧi0¤[ž`ª‚MîN½>-¬{œ‚ç çcø%Z•Ÿ"VçK šì}úÅSÓËác÷eý?Ù©‰éÛw¿²ÇµR´Çïªp fg¸¾}©0Û9O6*¶Oi+6±“+!õ쉔]ѧsU‡ATÎÒ›NŠ6ëA)GOeHWIî…þþ|‘Òd^ŠÑ}v²ÜLÀ¤/$H†«gSX@ºCžg{ͳIÿÝçDØ«Gñ + TžêåŸ&dvH¥‡;Øζ[ñK3mÿ\ dæqŠ*ìɽÑçÜ©tàüοkÈôžÿ8¸×,Æ¢»ãbͦÝVˆxè +JÝi)u¶s]¾_®;Ï#˜ðß–Ûþù„ÂÞ1öoá=1Ò[¨@TÇ$5!ÛŽbÈÓ°<–x.׶÷¾Qô{Ü~X2ñêå– ]ë|È R¦ÅU‘WÌcÃ>–ÁË¢s+?O+aPÍçô5„cÒ.²ã…Ù"14Û-¾®øéÑ#cNlÅØÅæ½ÙYÀ»‚ÎÂýª !¦κö¾8ÈŽ(Àñù1R„‡’ó¼bF´JPò¶o‡&¸¥R?´t%ûX„0´ó&žW‰z³mH[V¬uR½©HgDšÒKÀpÞ[ÿ«QÖ›ô Ú¹ÁõÝg;I»_꣦ÃL(aíGâêZ±¥W ¿š|äÕ\3Š†4BX">é<Ýß,âè˜ÇÃ8к!0½öªúïo·+bW×»ª‘ü$Ì `F!\%–ÝgÜ="\€€,0rÞÎàéÞvó‹cæ1÷À Á— €LóRïú(J’’?ŸÜü-÷5½Ò$ä„lžÒü¢&{R)Ô: +íÖìFKBtÁAù+R0u`ôw5Ž«Î ÌDE’R-麈Ïã©«ëGTã~•DÑä%Jf‰â'ªZ6”A •¯ÃÆVV0š#Ô«HáÌÔ8Œh¯ÄÈ|„!=×A'å7¤¹s%’k"î(^Î(‡ó#süÉ/ºn]ºUÑXjKôûÔ`’SÓÙOªçmocg(Hjì5œ¤®9Úô{ŽF_jGT‘ô´Itc»p¿ñ‡Üq¢ÂŒ²š€js“}Ôí¯9¬2~.¬² ?!,/UY4‘cÐDQëßÑQ­@Àö«÷ñöžíÜí¨»ÍDµ<¶f‘QR³âÑÜåDYÒ®Gh)©ëCîD ÷NÄhÏçJSì‚èdè3ß²Q =‰P½d@©‘}…aâ×ÞÄSº±ËHN ðëO i“OÈB*dçñ”Ïü™ý÷WÁv8Ò–_ï‡Xw Qék€×gû‰Óž‡róÐëš²ÊI-×u“ª ~…jÚ‚ÛMñ¹Êiá©Ò"n‡@ls`¾Ü½6ÚÑ3Aµ_ÅuŒÅ`ÜÔ⥦Fe xÜCAÝd/Ù%3°[$D¿®{ …䌎ÅÕ…†úNµxTÃZÖ¿mÖô™²¨#–„:ºæ [$x¶Ð·>0_a Ù•HA¤Ã7ð/«AÚw|ŒnÕÆzì”BiÎ먌±ózQ–4ûáãר$Ò¤õ$ ‡ì§Äq×ûé [›3À) àO}A§F¬$.Yn›œU@̈*˜ØMµ¡—ã6JW›DbPâ(XHå5ÍÅÎòPŽ +U”†¼oú=œk>“‘l¹Ô¦lߢ-`–Ré+„®2  =»Ïù³Zµ(YUð €ä3²“›ûÁP£ÁØ3à‘o¤àtª„=Q)Þ‹íHd¼”%F͹^P`õx™u}â¼Û8y¿Å%ÛMj¤$hΟÑy2ŠäÝ¢žE>HrŠ ®Øîçô¯hRƒ|‰¼ÿÇýN›íw\2«€˜®O H– ¥šÆ û¯!çh¤5ûÌö®7$bÌ¡*²€ô8†‘íeu^?ÒŸ¥æ:á Í-×ã‡)\ùô‚ÙÝOÏÊÃ#X€>_f ¥¯²‹à;k+~Ô®ãîÃãR$û#R(äÓ´d=GÝÕ}%¾ªÑG!*_Žø}˜ Ç„ºÑ!åf?(™k¤ÙòAde±;»‚Fw4>Hö˜½Ãv¼OÕŸî•k«nWÁ°Áæáî«2³®ˆ¢ÉŸÅ­U•W9DÓ¿&Mh!lL!;E©ðnS OHù-X¨pÞÆ1a÷ [>Š0U9}|{‘?[G-2 J‚ º$øWäs€ DÔH…Ô£W!š§~®$ð]»€¨1_qã—«À’5”GusÚ}~Zõu/.4nA–\èÊÍ>ïæl ·hbvgP¶¨PÃð Ð§È; Ça& &ˆ/it¿º\ $ÈžùÊv+Î~?G!HWÞ*€Åª~˜Z÷]ŽŸîO;y„Vèr.©šëM˜5¥ÜkhûHQŽ4YÕjÁi”ä/I²Ö2ÔbÛ?¬¡ƒ7¨=´¤Ã·{_53©¹úTgîÀqS&ÏìïZHºÌ;ŠsÕåÉÕÚæIñw^¥È#ú¬Fèj†úæ¥nç}Šh8Æ:Úî“­ /uªŽÉj×ÉjÕV»O_¤bNÝ=Mv›åIDd¢ð@}Neõ®hÇ©åQAÙIÁóG×ásÙ×בµ‹¬/#Xt»:Ò ßÚ?‹ †O'GC¢„Ñ=ËQ,¡àõ¦±ÐîÕ'ÃpwTÅQU þÔ¼«h­e3ÓK™ö€ÆP³Œãuœ‘nÇq.ЭK‹´êÕUHBPZÁ/DâÀa1Ç›¬Ã×&qèQÚR¿„”\ÑÚb9¹²ãÿýßÄevòéw­N9¨ººÄ{Q@ò•Z¿‘Ôú>©õ!â2êõnü¦ÚmThZ„£Z¨Í` ׇ\'ŒÀêƘÝ #d­ÃdV¾aºT+C§’€áKuLj(%sæ4íéˉGV(„ÅôYMy*T¼~AÖp–ª±P&+§ê‘Há¾½d_r®šºpTã\w!Á€/3õLÛpˆ/É÷±2×S +É„´ðuj-Ô,€>˜9Q0í¯<–‘ Ê c…´|?†¾Äøt`F<˜¤é®oRÄ StR‘á;€‡IÊû¨c¥¡´;’DWª%ù©ûUTŠCÚjˆ‚»‘Þ;êßE±üE¥8#íz#àtñ¹’œ•ýÛE°ÒÒùªý¼ù—äƒõf;j ·ÄðqÕ¨\GØ›T?…ž°E˜`0r³ø£½×Õ¿"S,AË®œ¥H€Fš¯»–ÝÑŠmjàâJ"ø…̲ƒÎNP5ˆO·§‰6•,¤I>Ì¥[Úne£ÂÒÐkòñ4 +`|:m1´¨&ôç8 +ì‰A>‘î ós^s¼ªæ¯ñòÚ2¦”‡®¦pùcvÖ* FŸì)(szû‰¿Âݸ>X³fµq}ˆD8î]|½¥—PÛªHä_ñàl´—[qd0ë7N¾hà¯ëÖú,’ò%,·L¬t<øu6sˆ§"Ë]«æ0Õ[-Oñ˜O¬0jE8K¶GURjÒ òì*ÞX8yÖ8OrO‰NϬ$XTèvõöŠ½'ér¡1Sv¥ùÀ«a±pG´ÆWÜh§öËà#S?‹ª.)飺g˜~P¦dú½z’¥GI~œt\¦ýS×¢&øT½ªÌ.wŒÔܯˆö‰<î÷±`꡸æÍ.¸‹ª¯¬¹Í¿r3‹÷my}þ³ú +ƒýü)±; @Åvç¢ ¨ð¶à»×Ö2Ž¶** öÐUª¿]_wÅ.`“ {P=y²_…¼^š]-¬±OæI”ò4DiI€@:¶à±–Ê çBlŽ€ˆs:Ûù>ÙL0—¬~ˆ-¿ lƒÐ#5`½£óo¦Q±§šc5ãx&ìÜ¥çÓ¾¥ô}çÌóààj3*ñ ͼ—r?=”جíéÙ?½zʺSY“p·óf1aQ(ZÆL¨Bñ—=·ì½þ¨ìñ¶¤Ï…\TvÐþv×!‰ÄÍN¡Ð[XÇ”C#O2 "¢<ú(¢œ›^ûåèy2@œ_×…NDÚ”Èu­äYÇ  ŠJæÖøØè 3Ôóqeñ^Vtâc/aFË*lgÖ_b(z€ƒ™òÙqyU#ªŠå íB€%N,§—-'@·WØR8£e´=6Ù~Q¤­·6×Ð!gúF‡ºˆ’f ¶Õœ?¯èüË‚ãèNÂÒ>ènê+ªŽ=%f]ßÓ¬»š`¬{·P²Ïu°«g$¬¹Í,Ã`÷Ý!A%IìEÞß¼~´ÎÒ9Z§sDj]GJã@ŒÇ“ÓdcÙìAYƒP m)3MeùÜ"ŸCô‡½© ºGc=¢B£™Å_ʦA&E«KsFfq4µ¬‡ŽVhZ@t§¬þ"PÔbT‡½ ýB‰²®Å2² Hb+`‰šè:Ú°»mÅÔóì@cìˆý•µD÷µMÖŸlU•©¸’eW4Þ­‡u=Ò€Ð]°ÞœF¨‡ˆP¯ô„‘0drÓÜ»”{Úc§¿t‚ýpE«xš°¯˜î¨:‰AîíV•OŽ‰ Ü`å » +¥Gצ–$ºÔžç›¿¬„u6h5šªT;OB]d5*!lÔ”8ÙSÕêJ:ñ0¡)_c>Wò'Ñ×<Šþ©'mÿÑïc¢e§ù ‹:ö¸kƺ›ãùý ¸09öG¤¤s%zn?ª`‚šda¢ÉIË«ÊåNgðù‘l„Ïψ~‰2>‘ó©Êeµ—tº_zéÃ…œJ˜®plâË1…´ÈRi¡—«?ëI½db6÷y+322ƒQÛX(LbCóíº˜Aµ1ôŠÇ¥ŽÒ]0¾¿5ö‡íáÑ?Cº©ö{èq/x^ôZC­¯H¶ˆªþތð÷ßk@¦åK¸£–í3#¶øžßvÿˆ«{’TT{LÏã†rÏw÷½â é|³#¦r­¾w°³Ûv"Ü’L,ÊçJÂäЩgÔT)5ÀsŠ”B$‚ÿ~ý¬Ä[³Åÿ»§xV’:»„Lªõ V3FʘvjD÷ñQ8ÚЫé—½ÊUòà^bóK=¥D)Õä ã 6£$è² × »˜¾€Ð…=‹Fõ9];&;H¨jTÎÖè’Åf$ð¼Ö¬è+²[Ø+ l~QVB¨ÉºŽ^Q´Âïò(S$h­g™ ’ÊÈÚÃàïþM¸pwN€5ÿaÉÉ/j±QLË_+€²&Ñ$BŽœT¾áðd­×ÛÀ^rãüýhG‹ ¿P;ŸMÖ@Š¦ðȾoßÚ +½SÞõ¼L¨Z2Æ¿#Ö»ò@)@õŽ†Ó>…AªŽ›ë+|RJ·LHQ®ÂüŠó ¨=t”µš¾›TàT§;Þ+¥2Jë“{ñÀñÈD/;8ü¦Xã¿Óp’ÍžêjÄ0Cû´dûãåo?Rë#+‰' y°{·e÷X'mŽ=&ÊÞSÁ<Æ–Vªp\G…ã ê„ÄĪ-€ z(!þΖVZ¢MMúfkæÄ ¬%¼[Ànl®@+ëaðûµ“Ùs¨ÙñölfZ¼Mö—ß°•}tÿ¤­}®¦~_×ÇüG•B†i+C‹ k×?8• ÈÉ1&8´0^•–@±ýûStpøVÔÓ¦w×Yöôï±êéw0&{êë"ÿ¨è<Ê §•cÀCåßÝúÑóعÐfô6jýrz°P„m‘zž¾N›lÏ/„ù¿Óû[‚ÿÝ¿bgÿWŸè/˜ÒçÅÿ}ç/Éï~äk0ä­ÂˆÈÐj«…nÇÏ j‹¯¿ÄÈàsvÇ ”b†û—•’ ¡q6Dðí_ú•fZ%0ýøGŠ~eE(F×™LŽ»Å‡Åe¿ãœö¼¤ª‘ŽðŽªÖšoå0âs&êÖ¾†ÀÖ;‚;˜gˆ±Q7ôj÷CçaG»¦”ÊR·~‚ܤŲ>ês.E™bFH_ØTA^NÄõ.Áåx?Ž(¿MWÝî¹ÿ´˜2û“™®,R÷äG|êTƒEòôØá&§ÙBŽ&â"ú3þXªɨ£˜!.Õ¾X!'¡: §J…³ÐïD•¶..n¹¥`ÄàXmu4¦NB{1 ˜½ŽP '­‡6u³£Ux…pÛ]ù&ˆ‰®BœC QQù¿dþýdF•¾®üð½Þô㺠•ž©3Z„ ªöñèÄkÖRg=€3£”à€†0rü”}VyëDˆÏSÃdŪA0Mw÷{PÙÎÜÓñq~Wb:€{Ò„Ü 3ËíÅŽž=®S”®;À)—%èn‘cÄ'D|¢~ðJGKK¿¦ß¯ç",ƒýÊ•J‡euÝûsÀÓ‚[Ôi13)¼¥ÇR*í…¤¢ÝÚ¬(ßòÓç±®ìÇ©WüÏûÉqn'½3¢H ³Q´òçì.àõ0kp‹ˆaÿnÎlÚºêÓ‰Þ5£w™1즆Væ¹^ÀïU‰¶{GÈG¶F1÷Òïây +h"¬æ‚ün1R +A@}[{!JwxO$ípò ¤ +Os*’ûÓ6û¯Ú¦ÈnzɯQhÝNÜÆ×ìcÄ–“c`^ƒãá ŒŒa¹ŠÑ§V+9 ¨##ê‰8¡Ëìùæà€®­¡ý7Ç¿«_£°² +_ƒ´Ø¯ÞiØè*q~†ªÅ]“â½Hu<ŽŽØýváŸëw´-VP$vd0 ¯l@S¸é×Õ”C-~!!¼äÀ(©À¤+¢oëªMñÕ9«6ýŠ¶Í6ˆûéZÐ=)ý¾“K·çÝsb|µŠbV´!,Äv"å­äõz{°l†B˜œ)ŽSýqûyED(ŠD:yL{ÕZ4€—þÄî`Mø3¢V¯ ¢/ëdRá@P¡(÷—ò±?›„Vi3Ï_Ǹa=žÙB›¡v Yðgkr@«™6ÚÇ”ÍGö.MlÕñ…°º“rnRu9v;UOË£¤ôͶ‚¢6-.s;ƒ¹îòÂJl†¨ kŠ¹ËжÇUâ¦XHÁL–h>ï?W¢HH²RËìá[î1ü”÷øÕÉ?N¥ìƒ¥ê6éiU»‘gªz¼?*š~T\žù“ùýoø™JHQ ÷Ö´N”Nd'o„äz>ÐÁlNuá¶veˆ4¢ØÆÛâ»ülnR÷A+Õ •ªÍPP•—Wê®i× xº»eÂT4aGáy<“ 3X5¬ †j?X¶ï–êã8’À>œ{‰°h‚^ÿ§ÛZNŒÏä G¾¨èÉÈê%¤ÄŒãT‚ÁQo*‘­”$¹}‰È&êIÏt„Øú5J1*u=xÑ3Õ¨`ŠÔŽˆnND7*%£Ñt \Tr_¼Qˆ] >åž=sܽ i´8£9WŒ£O„Ëü°Á¹Œˆ°_þŒ>‘R¨D´?6Qs³^å G^‡J/ò:WNã– ]‘r"˜²ˆ˜^YxÌlöÏÌ…‚òQ‹è3¹33Ñ4Së~õ‰PéG_Gá.’bYÖí õöfBÍ¢úÚK6À5艥4îŸ «EÙ_Y‹Mp\ üëP×DEœA·ý­ Ó@›ûÚ± üŠ¾)‚Lañ”"~š!ú©‰ ³KÛÀÒAè[Jj +ü™p=ÖÑMJ_†µf~øÃi›DÂfïu‚­øržƒÜüÒ’{‰ÂÙ[Û#ÉpôzÙo-ýK p;ûõ£ Vß–Ö3%H)Û³ìñu›©¹NcZì%d +-ª†ü§Ì®j"Hí}  º#âÙk2¬tÝvD;²³:/M¼Õd{áep )ÁVPÅo D3?WŠ 5êyäݨ±îs¥x6RRžQM¥yÏ r¥wÅVh_pÏûaÞtŸùN’ÏáÿÆCVí'Êœé0îœüÔbÕ9æÙ?zÈýq(«ËŠòǶïKÔuÀB¥Lò—t«ç; -ë 4Dã(é'L•ûù÷Ìl¯Ïö~ŸÒê¾ü5è Z¸¡17OèÏ7€éb»L÷£ø5ŠÍuàO: ªh3Ó³Ã:Áõ«Ð8¡ ¤¡#o¸7æ÷1:‹a?J„+JyÕ–Á,E©#rà¿Ä\RI»Ø€ûÍKÁŸxR¿¹Ós¨XË—ƒËD'²b—®aiÅ-«ßlʆ”3KÜ$²æÒT: u€]YaiŸ™gŠ3–ŒcÇT¯;´´— °#Öûø…‰})©Ùê×M€c%PØK0<†ûXC²ÁÒáîÑc—IÄÿÏÚ»­Ú²dç¹O°ßa^Êû¢œ‡ÌK»0F cãÛW…(•A`©„\øíw|ßÙÇš½imAIP¬9²õâ=à[Ó&Öz›ÁO©Ž `9&Ú£>B/r´·iîÓÜ6·Œ‹íéÊã8}Å)iñO):û¾Ò|Ùž†š_&³íØõâÓ©®âi;ce7 GO¦'Ö·õJË##Ú¹%èjö îë@$k.®–lðÞ®ÊkGšSVPéÏ;ߦçH÷T{wØó‹ˆRS¹uÝ´ÜPC>”Ý…õ¨Ùõ3L(‹K€®k–µškÂâT“ZOƒú`vŠucéS@ôò“؆$b(4¿i¨åE6[8v¶ÐÓ˜c:RëŽL¢¾gʇûúgU¥‘>yÃ4 ¾©6RCé+}ê–)–Ç·[€%¬i;^T»è`¬ˆóÁuKàëÄs>´€ZÖÈ’áÍ®¼Ú™Ö|àq3e/É~ûxý…†ë¾gwZ0ÒÂŒŒƒo×W += Ýdͦ³Ù\ïÆø&bìlÄük—Ï5wÔýp\39Fê®S…¡¦5…œx¶ÛkîpwSÆýghëÒ`׋?ÉöOä€ZWèA‰²ÎÂ:cÝ¥%O•·À€÷eˈ…ØÍZñŽeWP¶ëŠ5ÔDxDý3$ö!6…2C5—±‹CâÈ{„§ÿá^ø¥GfgÌA·‚qƒZk# .æ1!9^§µGëá}#héð¸whÈ&·È)·ð!@jÍ´DÄœ~žVÚu=m/"îò¥ëc^†fNÛ»¡[nÐœk{óõ¢:›nE†CCƒˆ«¦1µ^¶_Zèý¤ÃÈÜ#ϣЫƒWoÆm¨2†¬[øºIoâîã½ÐQ¹ˆ¤jw€)W´¤HŒ"?á:˜ïxÄŠÈCiq9ƒ~É¥&Q·h¿2Ð]éê&õ¶Á´î ùï"î@w…Ò<.vQR*ÎM©è¡AªŠU;úÎPÀ#Ö¨VÜŠTœx´ÏˆÜ4ÊM1¶S€ÏýéÐp">åÛqž‹aø›€ºÑÓÇxê)ï!¶ yYqºr²º²ƒõ-–7wEgM†ÅnÊŠì­ бó=âù>5ŒClA)ý´ñ[t.ë™Ù"®˜'ríßE°~ +ŽiÝìöUY½Cô¢\hsÔKÀƒe¶œ•â‰°Ê,¸êÑ„ÄL-9‘¡fk=¯—2gÝr”綕£­®P}t|Pjñ¶ÇÆè U¥Ï xÄU<¡µ1ÛõÚDµP¥Þ.-Ô×YpoìJ}WŒ±¢aHEwtTZóDjžHß:ƒ)„Ð>Þ½[.4 ž)bKÛ…©c]?¸M[©¦}ìœN +0”œI_JkßDÔºq…×Ù¦®D]yei¿»QT¼Ñ4.x3æAn‚Ï÷[[Éz(Ç\rãw”*µëÏ@Í3‚AsÃ+÷%­Yn€h-FÛ`7¢©éÝžÒ¾~»‡`ׄhÇõ‡“šê 5㈽@j­Ó”Õl6çVN$B>#~ÿtñ4Ýì Éoö3úCã]ß^É"™„mÌÿøvn|BuZÙz»›T÷Qã™ 3UÜç<ïaŒ œ’¶ÉÆV†Fù…í|‹íü¬±¦UY›y¥>Œ{¼°dÜK\¢ìóï‹é£ËÖšÖätt”•Zѹ~ê2mÜ£ë¥Zc½ß¡ úÅè#âŸvýÈqû}#¬V‹)ÓÆÓvͳ2è´BÍ,ò&‹ éÇ`P¦z¬} :4ûD‡ çS*˜¼ïˆ™ˆÞžÍDˆ5‚Lšˆr¿¬šŽ#t¨!]G6ô±ÙÐWˆMG~½«£žù;KãõKKFh]\æIzû[ %¡Ø,ÌTgæ+¸XBÕS´ü‹-%75Pä™Op„c{g£PJ"‘(V8šTÏb_Ý¥÷§c*»¾éõTšïŽ¥êõîP9wcoWa©¦lŠ>à/j÷¡‡Ðl=â5I¯WÔÐG®*ÔÀŠá²Ÿðß)ö1[¬ú/ö«÷°~á¶Ø2BYß÷M€6gtù+ç¯C8Ê˪4Àçq‰ ÌS»­wÜ?‡lª8MV‚¬{À >4–Žhí´$vµì»>óšÕ)G,?Ñ'»D"Ew9m‚‚p´Kc°}±ÎDâöJï§;c”GÂ?îŒÆ*5g4VÏMŒ‹X;RÍU9¯à×<ª¤ÈOF’‰„»Rà…REÊì7uçÐâL‹'|èÇçØþ=d p®€í˜k@:žmSOäg¢°e…¦ :e5Ž¨Éf1^鮨n«š¨£[1*Wï+ѨAº!¢\©Õ˜&M äEXû!¹’ªÑ1„¹8 @êë4dÒ3HêJVr€È‚Ü"Á姼vD@%"Ê‚Ð)¥nôÕS;¸ŽíºQ¥¬SúûÅé ôk+ý‘Î5Øœ‘ vʚ̩›0°&3"Ötðè>®(%XàCéØl”¦†éÙ ­¯~hŸåv%ZPǽç6e¤QIÄVl‡rk“éâ9Êé: ‡ÜÓ”ÇJ*+d¦¦MÚU«ò°§ Γ‚Ö$KÈii»Ê1¾<É$ÌLh½kwgP#óle1¸¹Æ»ÐâÿÆ’¾FôcÓú%¹®FéÍÖ«Yû±˜®HÖñ +Ÿû!+ÏGT;†Jî®Gê!YdåçÏ)àϨŸà„Bz~‚`‘&íe¦.'¼F# úM®+Ū¬G‰ó=ªžsj‘L˜šN5Í7),¤S +5]Ùb’Èå¹adÃË®”Œ¯Š)Îüæçúw6׊Ñd:$Ë_lè©@!–:~ñîÌði¦vŠÇÙä:¼? ã¬y#kë +7no4¶â<ø×M.þ)Ž#ú^»Üc[)„0ùÞöZFLF¦4ÎìíÁ°²Ñd…¿ñ–ôw9â¡šŒ6EZÝöc…å€ÎsÞ)ܯ~³b©w`¼¸% R·dÍêeî®øHW\¢ÍNÖ‰½ +÷®&ÕúylX‡ÆQ=Üó3"‹…È<ê+rÞ÷7û%z+iuPÕ¶kÁPXa%ˆ6îTCLY<5# 8ù”¸gÙԒߣָc†5oŠðìWL÷®xÚ (‚£zЕ°°fÌnÖíœÛÓ oOƒÇ‚¾mQ,z{§ŒºK$™sb:‹JEÂŵ‡¬´ïר5¢æ †¦ÜåüÇ]ßè/P‡Ià:ù«Üqq»q·í$”Š(tkY{±ÔF:;”W¹ùuëtßhvIwCBÙ"jÌ£ƒIx–t£©X¡”ö[/»õ­…0õñ ˜‚Ý€†Çªæ= +ªˆÎÚ•Ô˜i;‡BØ{’„A_­wC5^™ð™«/ †òÎñjé‘T‚‘Ñ«Æ*e½)œÑ¹ýínÅžé\Ôù~»±r:”S»‹RgÂÇuÇz¢71÷ã=Ö×lÙâDò/Ãìþœ >øÿ, ÿ_¹³ãÄ®_ëý¿Yÿ1~üÅ¿ùñßÿÛ?°òãßþû?þñýø‹÷—ÿå¯ÿô§?üãßÿî/ÿ÷ïþÓ_ÿíßÿî·ü‡ÿû»?þÏßý‡¿ùÛ?ýÇüãÿù‡ôû_ü×?üÃþúOø›ß­Cütr÷ë ~E,à?ó¿PØõI•V‚vàÔ‹.ɽÆtd-\ˬ,\™{®¾Ñ£v øªFh—µ)›d­:„ >ÿR‘*‹eå_•¤¿¾U(XSoäïOØ`®UÀg5–Z °¿ÛQb)­Ö{|FU¥ÝŸÅŽL´Õ<üÚÚ±¨#‚¹Xõ½Ú +ê•54µ±á-â‹‘Oµ!ØT„G4oWDkÎb}¿(ekÞ:„¾Ñö¸Ò™s/*2ž‡¶Ø&:ib±²¿H½× lD»hõ)³‘â_ò³z"„š®}´²»0÷ÞÿV}]RyûZy[Yë,6\–Ö,ªò4~ÔÈ‹]‰€°"X DÑ(a5{:믜d6„’•úgµÜ,ì+2#+dÝB4DîOE¬ +q ‡?­´¯ÈÉŠµµßÓ¦ª4WÍUlŸ.¬y +(ÐP8t¥NˆüþÊ»’žÁÿ¨‚ÊoD—îDܵ…—ÐVØùv•CÅyåØktm[¼ñ²N¸žÆºE o:§& .¨€DuâëYP îˆò_ˆ¬Ü¹‹ìêJ¢æ¦QT>m¹è“¨­Y(>ànÈß ¸A>ÄDÙÖ/O­ˆ5£Ósº^ûw4F£L-@–úZTR«è9O\tˆXK½ ‹–©ŸU΀)pJ:‘“Œ½û+Î-]´„x.øyU½Òôñ}¾Z<^Ðéeïþ=Èõúáz]žµ%4ÜY/êÑ]¼äY‘ô Tƒ:>7xî ›÷_ÝÉÖE¯ÄâŒ=!l#pÇànÖà·Cнêò¯/é1tu#– è–ÙËÉkEf*‹–ŸÓêÔ¯ˆl§Œ>Šgä×­éûˆh˜hWd¸þ:Љ¸Œ×¾•Å6mCŽînHK‰X¿M%TêI¡þND‡€Ö1kßè}çH]Ž¹-ºo3] ï0m*wÚ0ÈR³ ›„Y†´ãÏA8T!úºÕçóL>¢®(Mz$›W…Ñ߈©)æ^±°5£à‘X®¦áØM§Ã{„GB…gŠõùð¬¿Ù¬?¨‹3LcètjÍÞð©ü&â»÷ø#„éº!3—7ØgR;ˆ=118ÐøÁ÷È›ïë°H;€=ä•A°PÍh™eBÝ°FÛÂÚQKãÖ•$ÕGÓ“TÈâ?y6)e<°”·;70 ¬_7½Œ¨­©È FëàôŽ¬}(òù€R,[Ì—få= q¦‘Aƒ»h"Tj_ãÛÔõ‘ù´‹°¾ ˆžØˆ‰“¾…:‹0y¢ênç‡Ë½Ö£ (‹0.pšEŒÌ먎]1Ô]·=•[…òs~F8ˆ–x[“=ñÝ~*ÊØÀÀ›%Èèsña’±ÉXÎñu^ñܬ,>~¿S#ªPUkû˜·£Ö;ÚÜ … +"N}÷T2¸wò4’<ýËIØ“šGSà,CÐÎZÑ£ ™Òछ4/z^!Ìà Æ‹j¡`0kĸµÊ?κ5¹XÆ ÏË·DyàFu#ÆxSÞ TîaelˆÛHG·¥ýQ…Ñá³g8»v H¼›ó8¬ç±2]νûGö¯ +'ÚeÃÄOèØÁxoÏÀñÂÕ‡ÚB»Ü:¼Ñ©5!”·óŸ(@§ ƒª¹{ê ° +´3TœXã" ?Ëé7yÖ0Þ×7&-MúÎ, ­9Ô!ù[B™øqæñèXÒ÷,ÈOÚ‚8~ƒ,Òê"Þ-òyjÊ‚¼s¾¢áš»êÏ,4YÄÛ&¨0~«â~ýæñ„tã€7@®¤lö† Íh5äçRÊ®„ŽÀ^w/-î(E£c27ÙU”‚Ë×0%ê4o¢6R`ÀÿÀýP_$"X\"|éè!ž9…&ëqçL6ؽ²TÞOd†ÉU¨ó”¤/A¬_RÖý¦ü ›Isù‘5ÂØxPÖþµOä·û‹:Ñ-dbZŸt¡ä0Ý­úàÊÈPú»…™0.æ7õHpÕZ¿®×¸R½TþŽúõœõàéDIkDÕ£©&㋱̆ßbÖ‰þöúy³°·¢¢·B‡B-ýRF x<ñD4ÅÛÖé_+¢[fcÿºL²ÌßõŽª{"ÉíZXøÑõˆÌq](ŸéªŒL|Då•æøúê*Ä;¦úqßz‹Èú¤T\ße§"ýÍ~ÎSM%­í+€X´åŽ#ÇADYŸó µM—“·iÊPƒ„>1¢t¥‚ö€(¬%oñŠ,ÔÎØ£@•(Ê+N§P*ßâÊÖâ³È&:6ìƒmÖÕQ¡:i[D®…_”"²~Yò3U¨\'`]2n±×[1íÍqïD„†ê7+˜³v¡+ôè®+Ï/šÿöÓO]P-î+ln–}-Fé:¯=€†5œ«¥|{x +K0nûo+!_™×ú>ãú{šÚŸièE¶æêó›íffÓ5å=ï}D¯‘ãjùaàk¥=-V¦èLhÝ·²O§=Òå© ÚÞr=1gev®š¿ï3{úsë½*º¼]¦[œG‡ŸùE_öþ¾­*­è-Ö¦­hy€Lq ÝmåÀäè6µð?Ó¶µ•çýŒW!ͮԭ?Ê7pfÜYc·Û!VçÜ7ÀÿwK;¡ÚTj’Þ^‡±^Ø{ÄFűUº«îÚɳ €#f×o¥´ÍˆSNÑA)"ÆÓ¶5lÙž'P÷ YLsSæŒkã QBâB'V„™èq‹‘[Dúe©ßÜÛ “ çIÕ>¢îyã[±«ÛF&‰‹®¤0T{iùQí…MaDGÉ5¡ï­ÎPÏ•¢‹CøØÅ‹=Ø êÝßçíøM²µÌ§äAc³¾‰‚šGïo=ô•7ÿ¨t}Á›ž Ë£íÁÝôèVù›p!aëEØ„gývïŠÜ.ËÝü|¿ 4Wr9ð59I¡¨é÷¢¨$…<Üâ˵嘤øîãçÞ0ŒÌ‚ëiè1É­Ë@ÉšJ_¥\w§A™†u¹5­>+§uA ©·ú}Ä?½M”¥‹ŠT}Ù-.çã“ák »Ö¿Ã®*G@/69éÖ0"‡tA +{®¹äiÁMä8‰37HiîVµ¡ÖjRƒËãÐœíý~"áhP]Ä¢™e¿­ï5Ë<ìÐãOǯíŸq +(øZ†äå&€sؼuFJëQäm98ìâõS4S;øÔÆV¶tæ㣭Ñ*‹õŽÞ7VúØ“ÜD N]B~üzô,@ôXÔ(d½…§¶£Ðvº“kzH¶„ ˜3œS“¾ƒFÊ«Ÿ;5Êc¦Òæ¨ë†e] IÆñ`lŽ¢- Z1UœsÛÚÆì1Þ€oy $æ¥u;ר{e`‚ióã!’Ñ¡šü1â¹FE ít±›–dJyÔH™€‹T"Xw¡ûJ×.µ£­š~gÕBR°­9ÍîhÛdáfºê9p­¹™f±ˆÒè‹wl-õ#ŸSùµ°ÌÜ5tµãåÅV"Ô§ádæ ò!ºÎ׃øy#ÂN‡DI\³ƒ¼ºä¥kcZø +Ž·PBNŽ_œSñÆo©]ò +Wz)úüf?­¨bÄb·Þ3XΡº$Ûšì2Éí-¸ó©èÂVÿ¨u>’`ý+e½ÛÖrdiî…aE@­èDSEb¬'A©)˼B;¿‰Hƒ•upžŠa¿ï Ÿ?’g3®8ÈÊk¾áa|Fü -^¯Ÿb´o¾cߌmMü–u¦F¹êˆ¸ íx«HÀmu ‹ý³ˆ,ªoýÖ®d.ßìg­œà(&FëƒiH^Ë‹ò]má"ÉR…¿}¤÷(1[Ì † :§­ÜÃǸuaWZ^ ìbûìüŒxÞ·a!…rËfæþ¼Ÿ‹Áò?ú¶7£¾õ°$Kˆ•áÙäO&óø× E,4ª°Ñcƒ‡(Ù0ãq¨Yy«£¡Ð* ÿõ«É8Mï‹7‚š´=DU:£] ´ú9ÏÂ8xFœ%ÇNw£'Ìšè +¾ƒDQ b#ÌHY’–}EÉœJ¤œr "{,ÉZ· *E×ñ(?b½Œé=_T9§ÀÅÑÿ¾ž÷M“é¢Áêù‘§ø÷7?oJèÇ9J’ôXCcÊr~0õc…Ê»•gÿQoÄZË` NWFèä#H'~Àqj‡³•ì_õ3"÷¬‹1£»ÔúÖq~Ûψ–gθ9•T¬¿‰—~ðt3”}¤·(ÅvõOæÉk{}HBG¿QCa•©<b¤Õû‚,IýŒx¾Ñ” Þ-?ï71½‹ðÀÎçŸ]bÉÖÅ€j<µÎ÷¨ë%5ÒQcæò"êu:×ÜB‹î a;´Ïa©ë="·ìRKÈ«•Ÿû!M9”_qµíÔ¬ïÔìNžê +V_õµüòÛ®•tLoˆï½ðg­Üc¯h"|º—Û§f„*­$ÂÒš;$À½‹j¶ž9g†kKŠŽÐ™ ùlìÝ1‹…mŠ©în¬æá2»Þ·íVà¿Û)ð ªÝí\èSaP9)z*`‘‰!í¦¸Â* è§‘ŔдC#æñ‘ä£ÈA5•8ö±4Š’ˆn$=… «ÅÒgù.âR’ yF¿^ íÏQ¨þžbÍ°Ÿ™Iﻬ*¨!Œ,A¡s)Ó‹í±ÌBý·?Ã×›$ŽvÆ™ëãîOYkìôuFD8(à5Ü)¬ÝäÉ`ÎG'Âæ¯Úöž½=Õ·Ž2Bv;‹Ò·Å;¶"¬¤Ùý(¼t“^VÄK÷M"‚+§W:U;ìHq¡#µÅuìÉt%“³ç{˜´Ó–MËýv}D­YsKl­±˜=mÆ)4ÐzÆ€à#­Ðl] ŽSÏ…½áõÒ¾ç‘ÞãëW´]i\5¥`¼ŒXYvÁŒY„K¢9N‹ëÒSc]i'*Ä&•˜|°‡i9¸])°¬÷l¸öÄφå~6M«º ­hµ5ms<Ç5Óâ–ù¾ý÷O3 "—ï;9zÓ Ba|1H¨vÍrß%ÂGÄ·ã{T”M.%»xk?—dÀQ…wKÛv»ÔªøVJlWnDC¨Çòñ¤—xÒmÜ}¦c>Ý„u¹Uç-ñŽllíçØÊi‚-û9­¥OÕÅ~CMmÓ)ûšPÉX£Y½­LªâokpÀ¨õ¼³¨’TûÄk¯kbÿ¯ ÿd1éÌÐÍ€v~m«ÐÎ'Ðxˬ@-éM(tZÌI1ëèR4/µ°š©Ë÷³Qe˜ +â??·Z†“çŒä‰ODÛ÷6 `5Dį)–BS±]ÑÌ? Mêz[StóIÂGoÛ9'tÝÿ&¢tËrgdZî¸6Þ[•2GZIízõÕ^*zR볘û)Jºh;#ÎT ?y€Äʱc£VFœ&ýú‚4 +•=«I + +ƒ:êØuÔ©L´/H^E¼mìÖì[SO1P\õ;ï¹îxÚCæ—%”M\Oº?Ÿ „ÛúFŠ~ =~~ +ÚÊ?£D‹'Ó$h¢R9^û·Ü°‚NŽŽ9Uf3ææD”jwŒ]ð2ÅFÄñ!Ób—O¯mNŸ†G‘ u;ÃhÐ[³š¥€»weýZ~½+Ÿ©qÄU«.æÊ@ñeR›œ@rdÐ+ȼÒ4(÷Ó9U¼å‡oãW™Ö­—0ä›Ù˜±%=|OnÙw=–ywtÊàïQ"­g„îî[X'í$…©Î` ´iá5 ŒDŠ¢4K1šh]ÂIä:÷{<ÓüƒÈxÀFr$Wš}ÁI:8"yNQuÝ‘ÌRë;둇=7„s}ìl‡¨*š²H™žÁl£‰2ÛQæXÛ)‘ŽDt5Yiæ8 g£ÏTŽ#õHÁæ9Ž> \:Tz6şܬ§$j«ìü‚÷_¨V·> ĸ-ÁWqÂn§¿f­+h•­ií¥+Wrc:XLµû‰ï\¥Ïž£NI#Š1ŽŸëNÇq»Úç{£¶]Tðnn5”ŒL.Ûˆ˜—ÐÈë *¦Àl‰ޱΠ<«L£NZü:¯F‰,/ÎYD}z$xl©+Ú•çFù + èæ׸uª3² §ª5ìÂëPäå÷èzÕ16÷õåðÜO kTDž1ûý&a‚3Öô*ÀgýNG ¤Øèß?J`Q"ŒG3ž÷“rÿZ‰t +L2¤Ïíî|ýò®_+¤2¿isÙŸÑ°í"„IFª;B0œfwÝ%|kSDȤÞ×Óé½w£ªmÛ´nehð«¢7MÄe ê’­íƈí`Å¿ªÛ[Èéëk—>¦(Qî¨OI4R"‡¢Àzõ×ß½e(­©d5”©¸]èSì­æ{š~Ôd©}Fäá¼¥mŸû¦žìDŠ³{*J¾Ø–SýàKÐöK°±]A,AÙ^LytW=ݹO®Ò(§¸í¥üu`À½ç (Ò[Äï7 +Îî‹.1ß ‰:EAݬA•Í£žb(ŠiÌò ”¶ˆÅ‡û)ˆ%+õuÓqÀAM‘^ôë.ˆ+‚"~¿s%ÈO×!õ›ý L’§  ~…T0r­¨«“Ý{*àíIøi[t-kt-…jÁ8oZp¬Ü‚Ðß oœëóœ@œX½ôcœxx&V`QŸJ¾½ï‰˜‹é‹á¯Gëüл¯2,Nág½3nñpïsßî–ÛýXŠÕ`qò¨Ë#z†+ 4vDP %‚f¥bV8!NuÉÄæXk¡ à$a»¾Ž”{·ÞOƒÏ°¢Ž²ÏÙ&›[EN9“$¬wJ u3–>îÄé‹}ÒxV×37@àñ¢1…®)ýYÞx0ÐݘzàtâОýà…Î]iÁç8oAÊñö9^csìEö÷vªW¥¼² + °^zÚYllÝOÈ£—ro{é¡í]×;DÜQôÑ¥ÀÒ8t‡RæY*ã+,ï”{Gš$0¸5kZÞˆA´±íÓ5…°&»è!Ë+§ô¤(Ḟ·ÔbÂÌt5%K2rzcÉN\C·X5KR|¨-W‚|T’$ç¡ÏÄ[DÐOsC˪àÍoöSOW 7À‚(â\‘ãvÊ[ÿÁ÷%üvê ¸ôuÇBq ö…Abê_ç²ò-Ò Ðø"‰{'QòšTÔGP•›öƃM;Õnà‚¯Ö÷FñÆôeÚðçÖØìR¶b¹ / +¹i»>Àú:4¢¼ÖÀ³ÕŠ âÍ ¨·­ÍA~ ëO…,6›šÉ+".#”kNŸ„#(U ñQÁ”"ñx·Í­Eõ¢Ï@1ħõ>ä@pGc˜1èJ~ŠÕs›4U¸7¦0ÌÏ|›ö!Ôêž}ÛÌ´ö‘̤‡'•ùí~VÎ @x­ó‘iñüUÑü\)ì”=¸ž3Ù]ž‡ºòìc×àVTðn÷Öq{ú«}>vÛÁ™‰>0CènݨªíR¦c²?Jw7ÌcÛgD¯Å¸µ&¦ñP?¢ÊŒ¨#¹':7ëuÞ,¤­•®x“°­bØ}'˜ÿïEnY¡ª?øLÏòÍ~(ÞŠEªÖÓgtSCÞuð÷ˆ©9ë÷¨5Ž…Ö°Æ [¹(›Ú !°šƒH`ü{Á™À±dH)J6;/¡¦ §I‘#(ŽˆA´@¿ÐÂeÀ¢ž2¨òÒãÕd ƒ9Ïõù‰TfÛH?@#fHäTÇxmÀ€açÁQnM¦éÈói¶KyÚçZ'¨@{‘ç¡Š*ÈÓôÝ~é` +‚m|#TU¥”Q~¬÷zËûŸÓ¥™©cà5¾ 9j·öFôŒXLØ…oo"p}èŠ×¯SÛÃÿgÔÁ¹(m]®ŽÇ”93hƒôê‘ßfVäGßò¶—h&³V=ewïâ}}Œ®‹ôûV¬ Z+ÊOvÖÖíǯbþp ¤ÿOê»\ô_’ÎÏmàAV£&Šq ²çx;þ” "JYŒûñ;ìd9=ÝóÉ.ÍdÛfw ^FHK¨È*ÔìÃ:(íÏò¨6à)'¼…vò[3:Ѻ—A£‘„ $ŠË./ ¾ GÜÄÒ´Í0/kézÞY°VeW +òàÚzµfTèÓ·¼~|hñÁ2•¶š¤Š—ÛCƒæ^R²[ŒJ³ýÅþ©ºÕD?%{Péì“X"ÐåñL¼@ä•«„39}Lëô™Èöþ‡º(|Õ¶:!?Þñ„LG?y£¶¹E½9B5ªÀ“Yhs +ÕPà¦N™—•*@” Ò|S‡ÚNƬ¨Ñè.œ½m'ó"•´ø±É¥5Í:K#îcß +´JÑT_ñ••84m¨` Ž§rPþ]ìØÚNà1+ À?7„°DÁ–þe]$8+CK‰R6y4VUýrƒ*þ  ItŽ*ãÊ tûتOæfÔ±7jéFù¤ïe¡i=µpk;búóCÏ%aªË©C¿#tNúLb¬ØȺèëvŒOܵ}⎾•L¦°‹(=Á T6Êxîµ3*ÑèjÉ»Ú×>XŠ¨3(ž”¹4Ì3ˆ%÷±…Pl\0Ç6 QŠÂù)NVàœØ<šùÁcx®àŽüÿJŒZS +ï³ù±¡øMEWG‰#ûÕ2Ÿ`Ò¬…`gU^/æ¨ß_á#´iPë©iZ£Ø5ãüzOÞaʪ¬jØ_#f^«&ñ^<ôÌÅèÊОÀº÷¬¨¹8 ®Ñ¨©)Âd 4”ÀB¤Ç0»1‚’±Õä«lŠ†£DÂw£tÔtÞ®Îð +*úFȇ^ëÁ¶•‡Èzús#òB×.æê°×tÉ»œR–=lŒ€©Ü›]ynv%/Kz*÷£özljÃà©‚SÔ’E½ÄýEhÑÌÐrÙòW“-ß k³‘û¡ ]¹Åû‚^ãˈ>!#R˜l©Ççt¿›®Á·Þ€LE§’wh®!¡‚øÄõ\Ùù-I 6º$5ÇYRÖ ¯éjùZ%¬Ñ7©O›q_NªÙnHúÄljúäÊ·o,Ôµ˜Í5Q{R¿oež@u0üÿ”yÚävñ©{i¥L½AâÛ&†(¹a/úû$>‹³øóµß$£õÏS,s×…[ÞÖ-}u³$XP>^Œ³m|'­.œÔÀn “݉×åÌwnÁèÊ‘ˆ&Hå¦ ¢Ve˜žÍùu L}}M3¾|i8â—½ñX±lr»&·œ•'RºÃ +ŠÜ¸¶e”8Î&ò¼¯3àÜ TS9"Ĉjl'r)·¢$h/ÒD¬blEÞ6Ò»é³dív¦I¾î¬jµ¾['ä)Ô£wÂ,ÍU5À[,D¤9’'Õ{£>@{éhŸ¬¤æs‹´µÛ£E^Q£º°³Ñ¡x­„ìuê' ;»#0ÙÃÿbŒœK2vÄt<™œF/ç àßÍ©]qç \³¯Ú‹îžÖ)'pœ[&TÅ̃ö“:#Ç€ÞŸè-±Ü.]ŸZßPLKå\ë]–šG‰š{G3åW?ßþ¿FjO@Þï&®¸ø†Ê 6õÔ¿ÛQ¸}P¡²©f6ÒP º84àîEC£VÀ~p½Ô–7 7…¤f·°ÏHxÃþ~±PS2*Ðü›Q…ûwQµóªy*††Rà$+bå%§W¨axÆâ]‘å›}¬ׇïzoT z€%vmBŸØ×-Ét À€$ÐÞî#»o µsœU„ ®u/T²]¶.´ª[ýÜÂʤú¦«e k¶žpL†¢Åƒ‡9‚|%”^\Wü“0J~$ˆ*¨c5œÒÎ$¶ÖôVY9èà'õ£0e¿suÄšŠÌF(‰{Ù›" õ2¿ŽÃ² j DÙÒF#’^!¿:[©[©væT~^¿¤ßœÆK"ž~Þâ`Âyî +ÿn(Ú çi×.ÛŸ)Û›ƒ^q¦^{ià@?·'Øv¸¤ø÷êRõ{6ÛñºÎÚÖݧhÔ@õ¬2kÒIº}œÖn+hq©»tɪ¶%ûAòøví€wg%¶Ç©Þñ÷Ž€A}ønçÚY½ËÍ8erXD6éfY|ëÄÒØ5Á;Ês¤u7ð礴¸ì‰RDŠ†5Uû“õgÛM+B8P3áKHo€å)÷^¹Ê³=Vöô*T¯ì”ü40›d ¬ž··Æjè©9øŽP\Ì€=á.EIÚ (ÍŸ_=ÐûVÍ]äˆQXsƒì¬ö@gP+u>Ú^`sËÖiÞ{³æl¤•*Ë4…ÿž½B±XÃè¿V3´±Æ̨Ì+s8Oÿhû¨<*ŽÚöe‘LõÏXE+\ÁšèÃÀH#Ì>X¯u+ÀÓ®‰]EΈ®â@u¡SL,ÔîÎ[†y±çÎðéÑo«+†­g 3‚"ƺ7¾ªcƒª˜ÅiòL€}1Ilåk¿Ò+©Lc³PKB ñxEU~9ù$Ž4×bC8# ‚Ê&×Yý :‚4ê£h©5\ôÏ.zdGÚNe×ÇH­}}Œ}š“¦i@V§­9Ôûg:Î-Å!xŸeC'/•××Ïñ¼‰ Ù=:;¸t¿£óØÎcṳ̂۩çm3Ói˜u)B.• ’KÕ.ë_¤e'ߟvn-¸¸ÌðRhË‹±åè<ªóFâ?éqÀr"©Teneß’ÕvçýÂêVÙùàXo2pz foìuäÊ1†|F²ãµÌ¿Ð­íj¬œF tàGl@ñ.C^³?ÚjFQ¬9¡8Q$Üý]s—µaÍ’q˜²ª§[ý<…Èâ<õ4µ¤ðÊð,J$=ÉóJžàïò« +¶èãw[ ö´jÙ²_ìŸp´zük¸1ùÉ•IPÐcFÐveòkQ€D î‘Âé{Íõüjjóç\ÖTŒMHt×»@ã»Ôµ¿ÖÂ,ÍM¤ +MÄy@âR9ëNò¤5/¹6ðvÞa/±]×x@ÌT7 ¤f‡ösÓZÀY¿ßGZ+P}TRÔÖš ÏZ¶´P£Ÿ¢¶ÈµIÖÊÞFÈÈA‡<âê×VºF9ôQqðUÇs=6™·×>ã5ÏÉäšK´¶Ç¹(UÞX$Tf!¤ÓØê—š(ìïãœZÍâÝ>¢,„JSmžzÝ"èÚ(MQ¯xW“/[´cíNaêpÎúæœ=DäÀª"êÉàó!ìjö7ËCaýc½&M1¢¦1R Í”‘T9ÒÚÌÓ]VÖ«•ô@\ä.°0‹4’Z0õY p…DŸ[;i¥Íè’sÔå›äú×q¦F¿ 6ŸÙ(1œ(ºwÓì˜%y¾·ž¥ËLD’,I%Bû2¤/]9÷í¸Tk N•eTR¾ñóN]‰âÕ°r߶ +ºˆú!†VÁI >M„/üõ2öð/GH¦™“¦ gEzŽ6n³øªõåmªÙЦTã‘ú0ñ€ÓF£äÑf‡ÉžKÚnàÌ.¥2ÖºIÔRJíŸ|=Öâ»}?B÷…®ï£UBA•\¨#dELäØöp´EÇFÃ"€„îta +ä|y0ëŽöäúÔÄ»¾5ý·ÜðtñŠ›gðóôQX£¿ ËõWobÁyc#F*=ŸÅжðú¢T†\k÷fJO¾²ßÀéËU‹”3Ž®Ê¼òÝ<*au×'«F‚ž{†@¼\°™èv²ª¼—yÅö© ©Áë]\Éÿ)¸ºIòY/rÙnÉÊ%+-µf·©a|·k + +I5sR‹‚³è»`ôM<€ê]ÀÛT²>`ÄZê%ѯd®”¯bN–¶^±á*®ã±žÅTË‚_hxú® œ?¸¦T@ÆÃFâÅÙGj¤¢¤G3ÖÛQÜ’ÛŒJïsóî‡Å)Y¾F˜¯£ÙYRœ29£¾ul³º]¿šy5õ'ŦÇQÈå×M¯=ÆÆ×9æcÆ4§Ìí[(>{ÿWš'Åæ]Z²¹„s7€¬Êšžx \Û÷Q=®vo-1·6SdzñƉ½=+¹G i=™qÅ;\2?Ž¬—S8Õ_©F‘ +„= +œ#ßjÒ"ž(­Þ&›h¤{ÏöšmèqÊ—ž)ݾĈó²ˆBØ슺ŠYy›‹ôzfð³Ô…HݲV|­ü¬ã9ÞÔÒS#\ï±# š®ˆ¥«r  ðíq)ï3fæ6*ü±îÖ°ë{Å´ÐæÕdß•EåúæKt½ÆÖ}"h¦¶•<×ðÎÇgku|êÑEöùä:ÿS㈠Rì×ÊW£¹r¤¬¼NFƒ4öv\åÙÄÿÏ\ž\Žu? öÐ.:R%1Hk´Cïµé%:ˆ¥ŠPÌ5ÕÓ ¯ ¿½ÞK '§°lkýô|NtÜÊî&­œ`2?aT:7rKSÞæ§}©×zÎfFAŠ¨S 'õ¥° ã ÔÜ—´µè9E–îQ°„æØÏ%j¥^ôáŠé¹Ã|ƒÁ<Ú<‘¯8…ϤcÄšYáܺÂtÎב„²¯¨fÑl'¼Ç=îPU5j[b†hçð‰páC†ÏÜf2èùr ûµ^_£(øw_ň­WðxÅ29 +¾`­z¦‹#ZÝÖHÖ&–è,A‡¢Uãž$wK‘ÙåÛL{>Î;¼=ªJ­×™=[j˜j«ÝqdåÈå¾B‡²'0#qwøD˜=žüëØ U„Uõ{±”‚R@ƒšƒ <åk²X+wö£½Á¡Nþz) ÷"ß¿N ­k×5”מWöØó(" u+Â<¸íÒÔâ~¼¿”lŠÚu¨˜T#R5»JÀ!D˜¤ õ”4ÐŽ^Q@\e'„U "ú]ÙkHÁ äs. +>áŸuïÒÒ5|Êÿ¦7Ó)TÍî¯ÑÎæ@m-áMö==ßÃNÈ­àÝ ~¨Û°ãºÆˆ´:âhH«#øJöéŠ\{þ@Y;Úߺîœ&ñ”ÓV&B°r¶¨2jƒˆM†ªÔ=êäº 3ÖÑ}„ó~<¶?èÎ7QÙ+í9µÚ^‰TÝo¯3Â[¿³þµé׌‘|OŒuÀ€X=á@o·€W戚S²@Uÿé²]çõ‹é,¨@d×nŽ²×ŒwxÕŒ¡Ûw'mBvQ}±É:†®o=æªkóY%6Ít=OÅï)Cø¹›tg‚±Óï—…£çÒÇ3£pNñà|Š79÷OCÒ;µQ¾Up|Šßæ1 €W\Ù™’”û­qg†¢*<ßm1E6mjÎð’BÕ”xÛàd °¿YP`ñ~z6Þ.›¬©EÊAnuƒ•Ð>†õ½ÁõPÒ·Š¹vj*ZxÌÍVGÇD{ÝÇã _´uÿi×üdê £ÑAVÍHèÁï,2žYbäÝîj³<£?÷’(«[ÔfpÙ¥=%®o£˜õ„‡¡;·Ì´ó‰À+™ˆ×‘$¢Pô»v„®±ŒíëH$]Œ4ši^@%HÔéÀ0ζ¢l±­$¢ÐMç¢çT6¤u£‰9YL“žãЦ$Ô¯ÐØqe7E:3*{®šè*4xh Ê¨ Ê;â×҇ʊR(ˆ†ì]CgIp¼âñ@^†Çƒ…ö{ÃÚ¡ô˜jcd\°"½ÊòO=4¦g˜‚VÀnS»¢cú"#ùqb¬t <Ž‰Ä Pd”KïMÿ¯Aƒ¡š\,6ªw)Ô›&vc˜’_Äå±%A)ó¼Þ§x(´À9E"Á$” šÔùìÞÀzNfÕ§ÕŠ5wpÈúÆ•‚ŸV‘¾bãçÍòúrN$JùÍ£ÂGÂü Ôé‘úXf0„›x[OE>ù»°×ƒÎ]YÞ]ñ‡-»>® ½òb6KSܲÄyêåààÓÉ›+¸á²ü#-Tɶ诟-J;ÂåÉ^û´²³fÔD3*L¶Ò† +’@°Þ*®3Õ‹O(¢KˆðÏ|ðg8ù3" ë‡óY©¢ÚؾnjtáÆÔŠ³[®P–ÄœÓñ6Nhë¢MÐ-g +Ô&£¬Wô“q¥Ê eµ¡Hb(5„±€ +àIù½5éÃױ͎1«=Ÿu*úŠ ­Ôu‰ ÓŽtDsÿ=`E9Ô@xeÄôÊ©·m™ä¡Š¾89Îù0TåŸpc!¶( 0~Cæ +Gp2€“FLé&×®{Ò5*äTÒmh´È,<4Eº¦ŒdôòŽØÜŽ”DikÞ-’Œk‚SÐñ(`'€M‰Œ¤Ú‘·|X¿…ÿÄRêÅÛ”ÓHà5ê©ç®ó9RX =Õ(î+—¥66g¾j"Š6QãÜ”ïaY¦Gr¨ÔÀvQŠÕ‹œâªe¹;Cg {Å…W + ü`ÒøÅŒßZ¤2² ¹IØsÀºÔXxtÒŽÀÕŠÂ:¦Mù4Qªg )Û›‰œUdTÛM| Ìd@”&άQJWBÂÄ~:÷&Á“Vù «´jETfÛ^ÕûMÏEñ¹†—³:û |-ÓúËPàÚêÂåö+ke?[¬ÂG´†.áa…åKÈú’á`h0³}»ÿþ×;G{á9P&M^ÎÍ÷á{«yГ«FP®4 iX¤HšŒí½Ôìp­]”G‘óhÝ©¼Î*œên]É°ÐcÞëêªåí‹ó›¡0“JNEPîˆ3‚¸º$Á}¤­´[Ï­4ÒGSDï\‘²qÕä§kµ–Ý(«Öý2±Þ\_&£&ý…Ž'7—Ä~ËFÈ%ˆê-y'UêèCB6¨Ç×y:ŒVêÈpZ˜O!zó‡v¾æA¿ÖòqƵ“ê…6`ôCQâÑlÒ,?8šÀTáØy7»¨òÞo±èMG’WF%ý€²ó`èÓº !š$*cˆZÐ+Ñž'ÈJjæïëQÃpJ¹VÓ,X¬jÙ\êç}MíŒxÕ¨°GŠb‘!°,,ýÂN¸gÔwXGPßPñµ[Hí‹<šÃšúÊÃx&Æ£Al>tx×5b¹ Û†& &Ù¯cÂüϲHe\ùëêe×t)%1@2øë(ž²æÎq§Ûé 凙 I1Ö õMåGm'_Vt(¨ˆ„ÓT¾T¦<ô±V#@R­§Sûì°*ønìÕ0Ôg±©ýƒDnIW`àØŠ*Šø«zÔË´¼¡5G³O1„ë*Ñ3®Ö!OÐæâ¥Õê ÉÖw—"ã0ƒ79³å\Ž˜Þ¥§9x"õÅYn)J$Ä¡èÔûti (÷…½Á#€ºÕ —Ö&¦]÷õ¡Ÿ)OX?@2Œì&+ÊŽàòŒ€D¯êX Þtc¤:·M®h°Ì.¸°öpe*˜X½’¾Õ7¥ƒ¬¡Ëz¦=ÆDËJsF$q4å¨YÀE äì:ã“}¿hRÒSox£,|ÓX9ÚVáVr]jKÀIqØÎ˹ï]W®_'ßD¨CëÛ“ßÉhF©EP5®ÚVjµî@j 8O°l(˜Ž+‚è¶+@Ì0µ79A0Q¥ö‡(rspP¥«y±'|*Æ„šî·CرFšzGÐ$Õ¨ËzÜô ˆ"èÌU’êR¸ïGÚu + nopQáƒt“Èz)%L•ÜOø +’dwWâw“ƒ)ê’߬7_Gz@ø¸cá9Ì·ÊÛÄÔšï¸3ÊC¯êJ*–,lbÞ5¤Ÿ±ô@Ý‚aƒùû&k¬{‰2‚ rHÕ— º°£ÿ}R9#‚>>L®1éž›â¡Õ|Àœûb Àádh¹„ƨËw Òo}…!¾„ª¿E6æ%\·G-€ÍmÕçºS'YiåªÎÿˆ‚¡Ýˆ{ð_²šשüÀq«Å“+v•>Q·Ÿ™ÏoäÚ0 ¬á¸4Ç[_§:¥ü÷ T[Sɨ±çŽ.>Y˦Ë×8¢k·%K(QO2½¿djGj¨ÊÝo«Æx¢ŠëˆgºkÉC Ñ‘ˆCs¨6-¹ãªž3Ð8+Òy!A< +ÿsGëLt+Q[z$üy¶œ'}ó Lv¹aáÑô,d3_Ã¥VƒDSœÔ%O½ŽÓëbµÕ¼6‚·’ ÔuM…¹q÷h=¦ÿvÅœ‚Çß0dE$dO€dAªÁhqÅJçò2I=È÷¹}&|«†»¾¼úìÊAðîm7é Ã\ÜÇÐö4ˆÊ„§vD˜ +Ë­2‘ Ú,à_¥Š›PÊ‹µÖÅõÿ„åfeŽÆÜå6dHú¢ù +âM>ÿ±ÅL.™Bqyûí ²à„ý€ŽÁÇÖ¨å¨[ê®ÈM§ +SŽä +=P.eúxZq hY1ñó…> +±WÌ(këµ#µ›.ˆf‹á,ìok,šÑ"¸pë3{ìu:’×£ °‡–ëÿzlŽÁŠÜd­$+]’Dš“r$bÊ¥F¸5«¶$ÓõϨ0Q{f‰€‡ ù…d/<8ê4X‰v™¨0æ§âØò>\­Él]×[ÁZꀲvU6¶^ýä†ÐO¿ë8ìwME£ +aìC¸Ì±!àÿc/d¥VtðkØmaGTÐ+aÞH.\c/…¢žêV7+唊¬0h2h™ÖìŒ-É$Îkk·Ó­·5F¶Zä÷Ö~Zª%'Œmy§"@N{Ø,è +IBL“JÇ£ôÁÌGR¸Î¢Õ²Eäig•fal¿NÀÇRÅ^Ú_(ö‚÷Ò‚êVÁƒÌíålß÷ÎF+úöí@WýÖæ<ô:é¼ëä®LÇfðõ©«ÊÊ‚7Ì(œáy6×Îz<ÿ®;`€à4ËÎóñºê.²s*;¿ÈxƒéñKœ}­ßi[,H›‘mMoåÜ‹™‰ËáK@ëÚ9§JºÊ´}q +Z'\Ÿæ %©9mx »±æ ¥ñ ‚(ˆž\'Žèó3`rý0O…9ÌGÐF°@À¼~€R|˜S˜P¢GI–éÝ"Ɇœ=0yh£—¯_¡™ª~Wmnyþ¦á—¾V¦DöŠîxêJß™Ûhf®m]˜õAÑ@ǹòë5núk]ø`ç÷)‡Ÿ&\:óÃo­ G"‚ F…hb HàÖw~´"ƒR¥GîE±¹°®-¦Tkšr7r~ˆ¸¼´±.ƒuòkÓvëŽ!ýa†Ðj›‰˜è0Xî'UG1mcû-\gûnCÛÈùJóý=ÊÎ7ä~péfoHfNOçtöÀœ®¨Nú‹:O^ãÚçŽØøŸVãFô¾ÍîÁm ×äbjOkDŸ½nÿîEýˆ‚ŽnëQÀQœŠŸ*ÿUJ¢áÜZ7,]©9>¥!u“nèn ZJË’Æõ7*Ôßæö°¾…ÞïµñF!´™ªÛ¨ ÐÖ:µ»Ž74…9ªœüîl° ‰º*4‹»Ï‡ÄFú˜0àªÂîM^•Ìõ´Ô*öíØ È¶Á¢Ü +–ŸõÌ‚‘ §Âr¼`×~Ó§½oð¸·^`GIÛêVÌ!ßX}¾å©o“úì,˜ ¯ÄúÉ-ž}F¤*þÇFƒV©&“ýȳþM÷ýÌ;E©L +¾%—q8ˆŽöÈ­e½ò¢ùš(}ãùØÛ9·KŸŠÌUn‰ÓTjx e-ÿú“ÎMƒù×èE9Xq§«P"ý¸lØ39ø­T)Ù»L…J7µ-w0þç#¥2mjŽ]¬kFkÖRú^‹”µHª=”ë^ÌÏJœZ°R¹e„á¨Â’áåÒtïÐ)s$ÑÈÁ—IŠiǃh½Z6+J®¢QG ù +<¡¥¶-•EºÊìm«xGþ¹žº>:犘­>âò·jl YZŒ].;ʔޫâï=ææÜÒâ4å´#e½™œñ '1¹Ç®—Ši„™w¿ÜV-¥¯$éÈLÜtI[+ªóˆ*¹æ'Ör–wû6Y˺ +ú‰ì«5W¥n½XñR±(\x“©´3¦Q4C‰BË‘ºÐÄ„ªÞ½š5ÅYI+¢÷‘1™´»0®ÌJzè´“õ#Jba‰ÒäÚpÔ}€óRggœ. 7Ï1€:¤›–{úlŠ®¡0Ù;0Ø|TÆ]±[;Q`R RQ!â×>—ßþ?Q &ÊÙ®ûQð7QŠrÔóq +ñ'!†&µñC@͈ê·@%ê]—DH‡t‡Ä&¢¨¢®˜G¤uƒeZùn_H¬Æ‰Š. H%Ñd°dzu?ªúæ,=ÒóÁ\Ñ«­û§ˆ q€ãÕLm¶žß1Ãv/ +p§ON¡p:Udt÷n +Qêñw"ªmyý:$¬}D¤ÊTwG”Ov~³›”9£9úŒ=¬_3·© D´­"ŸÑ£áÓ¼[É¢RûàAˆ¢pÐm@ÂeE)6HóÞþºŽÇÖ©'Â~€»cÊu@m$‚‘uhÅñ ‹³#ödHøG‰HÑ™uÙOÖW’Œ÷‘`«¬ˆ)IB÷­ñØZÐEÍ ×Dõë«)–F¦öPè™!’à¡èrJ@ÏJÛ¼lHšbÚ?2‹Òµï(bJ=µ,|Í©”]o›{%’2Áh5€­CåmŽ{çà”ˆižNú—õÛ’š¦d1ÔÂýB¼GÍöT±†oOÜ#>öÅ'a«a¯ÆnRqó±¶Ú(ýz®¹ãØú¸K«c<“ñ Ç]DAZMQrF]äìÈnö3¹Õnª­U#)ƨŠ(OæN#rW'Æl#jŠJðIQûu$pL·Â|ÔPÁ»QcÍI9’E¿Ñô4 bäE‡¡R¹êf‘#å½Ò—þˆ::åxËY¦ƒaÉ“W¥œh~¥ƒ¸nµü|îý­×Û{ĦŸ^ÖŽS½Ï¨ccÖXT÷½ïÖÉÉȱ)® +¶‘æ§JÊûßó"o/ìÂý€üþk°¯„Ñ^6Í>6˜öA޹ȽãÖ(4ef,JÕ¦ñQÞi¡N»Ñy•ÊS¶ BΑ&\ÃZ} É@^LJíì"|`õçaC‚-ÁfpÏÁfD½ûýu yž²Y¹ÓÀÙ|z~mgNàbôN*,/78ÂÒ$:W bÅfÔ¹… •¦ˆr§F¸Þ)¡+j8é¢"¾{¬ª²Z¹g:ÚCÏBLnu PUT¥"ÈƲšŠŽ(îmì%´ÕQ’,…Ó\eº¬i·Í&ãšmí¨ÁÃµÒ +Ïk­LºuçWòÚ[z¸dÜD|Ùº"Ѿ¶uîWÅ{J-3Ð4Vô0^ϾæÉœ7e"z™¢ èÒÁO:@Ó5Á¥Õ\0ËçYU9¸7̽’ü~='ús.’ *)ï³¾Òj§P 8­Ê{ ¿¬´@ìh¨ø;™mÕÙ?*Ò(¥´Ž¡ÑÖd± ŽZìjº®_Eƾá<±WÓÍÐ:cö ÑÙˆâèédW±<Ý…é1¢Óc‚ö‹~u›Õ¡ÎÎC7DS®ï*¼Q¤kÝFI>H¹À ܨkíÛ¯08 q>NOq@1êÝ cÎ/Ž™`àÑ÷ØV¨,€´TöžšûH> –ÙDƪS¹¶|;€y+£4Ô:µšØ–0<õ’žƒâØV~w„ågƒ›šøþn/Ð¥æ rØFf$€Ç™ÉQL7¹Ý#Ú*…Ùµ]·z&Ê¡#Dµœ§BG^DZÑ-“liOuiÐWšÕö+VÄùàþŒ‚áITÝçèETǦƈ5ÓÁКɋ“éÔ·×D@óN›ùêÂìÔt\®¤‡Lh—°}hØà£Ðkò[¾= Lïc'$¦`¬ºQsG Æl*@†W„ ©35˜Æ +€lÖ¬v–ùƒ\q®,O7±my€7××o¨¹ÆÛAT/<‡a»Ð#â3±¶B¸ê¡Ã ÷塈Évls¤H$íºføh*‰(~b³ºûȪ×I7Ú°lfa]šÞ<û£ÁÝÔ™®J£{ÌÝRqò•çlÄØ÷cŠöèy½oœÌXÒî#ÝÔ;näðŠ/ +nÑX—2Pðûî­A ë­õ´¹Ä•/“34phëJ!Æ'ÓeÿöÑ›"ôo(Ú*P?ø Àî­šx¿t»û)FG¹A”•éÛ[ã”îhfU­ã[øP.(v»k÷ð¼VSCà}ßUõrøL)vëÍwº8²fº·3å ü‚8JGçÞPá(¶Â›“8V­¨ ¸í?zì?êkž9âX·¢„.xt×tÒWöÓ¼‚2EÂ*öæJO5Àœœ]´‘Å@ ÍõG”¨Eé}Ÿ¸Ò3òY´¦ÚdL Xd=°gUU çCh8Y¸:Þ%¢ó•¥×¢D)ð#Jý†ä–@‡bÝ +­¼éî¦ïe·õõÂ} +÷ŸQz9qVM‰ +™pL áT3ž¢›Nwy]ÉmI°ÄPèbº^J›}ëKžÛ +Ž¦º°¤þÈâ ÆÑ @nȉ HÄ£(´šÌP^ˆNi ˜VMqÃÊôÜGJözwåÄQ&¼›jÿJ,ä¡ÔýP®aADûŒ=Yrÿ\n4R«êãoÌÇë.€¥úÁÒÈÕ.E,‡Ð*,”žÉaPñüŒÀC‘Êð@iàYú|F]v2ÇÒ9¨¶›¶©e|ç̃ÿý½¯/b0q³ï Ug×_Y´c«w¢£ˆjÍš{=#­<§È¨dz³§Ü®ßîA¸êÅp9 X˜ÛÇìDÉ$Km„ÀSqæ¬æ³wlÈ©‰|üþiã ‹ûã,Êпï†ï>,]:YÉÎè wJŸßNQô=QÞC”©¨z÷ÅÇ%LèjÛ`ÞÍ Yd›Nl…h”_¸Ä·¸ÄóÕ‰xÇþ²¿wß±±Zw•¡LRÆÔ³µ2,N»È’²Ôw”ë¨I÷y¦?噹ýè]ùÞfq‹ö¯.9ïD¢ˆÚe$ÇɚÊZ½E¹fž{Ýs qREIÞôhŒ£õ#øñâAz¬ŽdWÕ¹ƒ(æD³¢OÅ Áþ{GÌD‡2bîˆúD€ö'¢Ü/“¥ãç©[Þ‘ð|lÂóöÒ"ô6šž‡Nü•/¡~çD m ÅäáA·íU±&°u7[¨â@Kp°ˆuª¢E TY…è35AZï+"6‰Z]#:Êd](xô¿iS> "M4ƒ>Ó 0ŸE†Ezß%ktÈš:Šö÷ O#Y³Mª§,'QÂÿÄ <Œ¨5”@á8‡x© kM>÷~îx¥WÁÃá‚ ýûuX>бjq+&(?¾Ð¡ìb>¸rjØ8ßmû E‘ŒyŠ¸£Æ´s-ÒÇ)¯ rÕþj*Á >C—Òsmɲ©™$wu#û±ßsjXa±Ò…ÅzËO]°`áclíÏjš_£fö±n© mÔ8_]š#ŽF‘©Ö]{†-|nþ[Ø…ž¯TÎ z\3©À\rÉRqÉâHQ¤“%\f£Ã· ¼ò‚ç eFÎø»NéÜ&<Ð×0§»cºq«Ñ +JºdF*øAzƒD 8ïРöÁ£–ôiaZ´¢ZG¨qDèè ¢©ˆJ9–ˆZx8䘞ízûÀµÉÖy0¡m˜7)¦fœz7à5g~mµ¸ ü}eÿ‘»ÅçÍO‹KþF­ÄˆBš<Qü^6îÈ{È<˜ (—Õ¡õ©X,aÚÌ8æÞs¢Áû.u”€0Ž ŽÈ=¹ïõÅêGTVŠÐÐÔ ¢©TxA¡—Mì‘",H+ß°W„H£ú](²cë”Qòë0ÖPlO•Gîê=cXè‘€Cq$—¯jh£qäv [Ej@Žˆí-Çø²“ƒ<îözGVA dàÑóhH,‘ºšFÌÌí!3¬}S•ªqsŸ¯ÆíÇ^à´2»Ñv=÷ƒÖt¨  w†©Î ÏÎ"×ýù»{õ¨ÊIš:^¿A–HòÁqÔ½kì©}Dð-Þ â+ö# +D™d´‰˜Žž¶5v• ¿>"oÔ4U‹Ça™{ÃȆÇdþµ¯ g]õ›Ÿó"ÌHÏEy‰ÃÍkCO1 +™®ñ‹·g†E3uC„ù³A sÓ7Yû¶T øRîc¡’®BÝñ‹›œ?ÅId=Åî…O‹‰We„Ú­?õó +mcïí²²ÑŒ…¿ G-ˆˆT%•‚·ÉW ^S•<ÀOF0½¡š_½£ßïPy–×é:¿TƱþgJ Å&¹k%'Ö8gH¦ ã• „Ú{³ùô¾!7÷=3ûøùkÔCX·«ƒvP Šò&šE·fíï>Åž§¸1/ŸAPC)š à}ž]D,ÚUô°H}èaÝó ‰] Üú×xai®º¡.¬„(½G §Pœ +-ît`J%- ÖEj©9ÇÀÂúFcgéÚBa¹\\NÅ\.â¢ÞßÔº?"j½¢B\9Q,6EnÌȼEN4* +E_—4¸¬CÍ5^f„Y5f¹¯pq²ŒœZŠ’×*ö–7:’!fÜw±EÁ „€YÜ BA}b¶l˜åØœ[tà*sxûÚ¦H¨%ŒC7Ș۟k8UP¨í9=÷DtÄ•<Èr ©‰j*=iLŽëë3¶ŸX!µ;‘V•xiœj*iÝÜ&}b¾Q¡Tƒã=b}óA¿o„ÑD¹Î1‡À"sIÄ긘ϑ­@Ñ'þ¤x¡´ŒNÒ—÷ˆL!#ÆU%2ßìUj…¨úâ»’ÉŸ(Dšˆ\µ~ ÞbÞ´³éì£!ò^A]vŽq1¿]ýœ[£ˆ×øAõ§©UÒû~Ö”gm™Þ½Üºb ¯à»€š‘]ä^wm®©CCñ«—U]]…Ǩ‰ämr¿ðt@T–à–°_“–ÊÐ q@È!bí¯ýÛu)»5Fõ‚4ž!B4#¹§^­ºê6¨OÖ„"ª7U½Q«ûû‘—{ G£3ð“í§ +cº"­Ç6V† §åcÃ,ûŒÁ$Aš$!Ì ¥šÜ%)À"ö=§š†%žŒÕô©‡~䑬6ßõ‘Wj«9BT,³}³Ÿ^â”±F´C%î +ƒB#קç7b£~J ö8«ŸóÈtF¡5‡5( ™Xs;Þ­Áml®lˆA ñÌË[ji„Ž’ÀXj æ } ÖÛTžý„´ÍÀxDÝ[ :[wô#ñä@?²Ž¶9üz¨P˜ÛnjÌDy}A{ñQ—ó›ýÌ-„d‹ëÜÈÞK\í<Êw“õÄJñAY½A¿ +ÓùE¦àKϹ TÔÅ“K®çÖL˜–|ü‡«öYŒÂž”5zx SúØQ‘»6¤zßAwøô“„DÓÃ9Иê kUR“B([¯é3Š5òó..»c'•ŸÃh•477³‰Ô^“!:ïê +RÙPš<,=4}¼¹•Y_ëÿHðÇçþ3KJhóA^ußÒ¨ÞÚãßÐQêÿ LòÂŽþÄ{eÐZ[î]„ø±2ºUrÏa•Ö!¬¬Æ;ð…sJ ¿r iØñí`Sks¼ß&Ö$¥ïQ«˜P;Wš4ЫÛBT2:Ô¶aÐÁ5±g‰vÖmRзIÁvƒdÇQTË…üyÊ„t)-£\%¢SÌ[‰ù¡ªáè¯#FK-ïV|å]êŠßìíú@çx:LüTߊûÓŶ¸óíh(žœàqå^q;Áõü?@G‰ƒ´Èt]ÝÐx~жFÚúf½踇i4U#”¾~ ªZÏpÌGÄa +p£[ þf?T·¥Hëe² ùÚ€è`°WýœLãÙÈIQ÷¡n³SD£SŠ¤–~]âàÊÂÛ“Î¥7V€Ã¾@;yIå½ßn¤œâ^My–€ŽY¬ wO…¤á!†TÐý¸ˆu~ü:Æîωè“kÿÏòíÿ•;;0«ï¿¤Ðû³þcüø‹óã¿ÿ·þ`åÇ¿ý÷üãÿúñÿî/ÿË_ÿéOøÇ¿ÿÝ_þïßý§¿þÛ¿ÿÝoÿøÿ÷wüŸ¿ûó·úÿøÇÿó9è÷¿ø¯ø‡?üõŸþð7¿[‡øéäî×üŠ,Àæá®1~PjC¹üJ%§6Wxþ±†G½‚uÕCw€ÂÕ7òOJ櫈ã7íõöà ÖÌÊŽ_ÿÂK†­™QY׃âýõ­ÁÄŒTxÕÈ,fó¶ÿ.ûÜ8Qä¥MK¡©æü¡¸‘"ÇooEÈw‰AU$O'Ó(/¯yV†ktZñý…pÚcr²ô9wÆ_¿ Ä9‹ñµÍÇlhw6°p`˜7m·S²@ä*¹¬?)€}­ ±”[/ÖÄ6?½‚rŽ4‡uCkþB®1»» šRMG=JÉ1ië¤ ¢¼‹OA šöîÄ9 á”Oœž†gÛÃ>‘ý†ã$_Ü×õý!~[Üҵŋ*Ø9,¨—9…F DDµ@»¾ø´_£]±<=©c”€ÅÅGa#øJ˜v7’¼F‹uºèCÁ¦ûw)ù¡c¦‘ £dº!Œ†ÞË‹´6ªpªœÞŒXCH;ÿMbMèàMû?Âßshs±ý¢"œr`®ãv½Uê1ÙCÃÍ’›²ÿ™!z¿¤ùv7 + ^mc…16øiÃ¥&ÿ¥‚fnÈkµZþ˜s®2©½ACĹ¡ê…JíýsCðP|ÑßlÔÔs Ø‹Ö$ð,ó̃ª•6Ô—É(Ńº¥´ÓaB¸ëòW‡)è̇µžáI) L'Yª}õ¯Ý{ƒ}©Tt ýh ’:Ð1ìJñcf”7±Ý +ÝåM\:¹ŒµPT¬‰+®FŠm lƱ©_ZyýwZ ”—û)T=Û.e¤ÛÐ6úA»Š%gW5èHˆŸÿ(@ü°®|ßàW ®ñèŸñÍÖù'òóëß¾G0ˆåG9öX4ázdú™„!혿cé|å›-2Ù÷ $–ç´5XJ]"”n„äp¦¸^lªÛö€haƆŒ<çÖ[œ³Æ+|ÙHŧñªO+[uŠ"7ÇŠ€dø•^ +nMc—¨üòrÇHQ±Ùõ÷«o±ÅÂjûŽ8?Ü»µqM``|€æôÝ™F1êŠÝéÊÇ©‹þ½ Ÿ«ßl”Æf\Ð{¢ýÿ5 N[+ûÌŠ ({êB­›©küj=™=ÙÉég²NvßO‘O¾ŠwaѱNÄ0êæ-QÑ_+dŽç ´°îÁì3¤Ül'̺l 9 2ÌvI¾‹ï"뵂^—¤ç3–Hx‘L1öâ˜è’àá_fÄZ«X¨›Ž~d··Z´i¯Û¾H"JÙ`Ý…(<áÖdQƒtŠ§jŸƒ#Ul³8ÒšJS!e‘|¨ßš{ß ˜p`9ÐØùÒÕ¥4Ù‡œPúÑ,g¾ºìàïûg§þ1©9}¥•p×˾r©RƯ¢‚Qßï}j(éF‘Ž• |%à…åPÇDg½Ä,ÔA[—D¿¡ÿJŒ"¶³žï»îÎôëÞ¨ @Âô/ À&™˜5Ë +Ø`8KÝØ+ 5ü¤Cf 7åë0oª8²¾•qxGúŒˆŠ½r‡ qL‹iÙœ9‘¢À(†@WNu+ •} ™`“CµLÁ +ëp1Ö=¦Ö^$‹ Öìñ+ŸÀoŸïI8Œ^Gƒèt*Yu«ëv¾…·£Ú¡öʼ¢ëP·qæubîüÃýøz³Š’ÑY²j¤èTq¤bZ2 )T#®G—›(:úrYtØÑüqßîGm´0ºÖÑvð®ÔÐn”Ž!GÒ¹ïR›s©Bj°ŠC=E2k´Ö5‘H¸‘-Å\¤1è»çŠ€ü´‘cuïßD8…5@båsã@áß:yÿM›GE6ýÇ éD5%1›Ìǃi 2r¥ïmÞ~•rÛ ßÓë¯ ÊôlèŠ{ͺçWEñFºìkÁŒÝ>¥ƒ™¬ºáVï ›÷6¡§yrˆQJöÞXgSDÃQv}c Êã맟j‰ W? ¾*qÁDZû¼“y¦ogÑÛvÄ}À±ž˜Îñ4펬_F“¢NËç×ز¸_ƒ f½Ecý‡ÅêÇèiÍøþP™g²­÷¿{Y8KÎù± –U8ˆ»ô9Çòkj’ûÞ¼þVÕ„ãˆCg ½ôc=áõÚ ;*WÊÊ:I®eeö šz +Î(dzå\c7?™çþÉ©:bcøξ¼XXÔ–¾Elôgw=zž÷6ekëQ¬y‚TçŒ ’Öi mêšv@ÄEÛëޛƠ¼ïQßšËÁñö€Û³f~iQ:I5–¬"Ï:~ñ÷{»éÁßyÅkã=¢•z«©ssŽuM'ºaxD¯_M Ç¿Ùà'ˆé)´˜÷7º'˜ºݼp€¥¾6\Û÷–é{l”ñ×FÈ<ô +N-»~ÜšéÔí¾Ûtçí<™›Ü³D)j=2ŠíMüÆo³;Œ§×àƒ\Ü”îë7Oè&¡Õˆl볬‘à¯Ó(ÐNßà +b7š')ð3 ¯!º§çC:À¹¤ ýyHk^¹©2&¾µ­|EkLäp&QkjXéW«ÙÎ'í: à»HønôaË<ÁÁL {ÓN´›¦½—\ç1ÇíñY'¢È]ºQšB(Ô®7©è!b¨®Y§$Âþ°+EÀÔçéd½hùÚ탭coÚQ¨ÚÝprìL=nkúÓ\·û¹€H"`1JšNzÙÔ€ZN…dùC0ªÖ4)­gÍð@וQ¼#L§} ­¤£%Í kïUóLžÿò4ý$Àðq§…¥‰[bÚ:V¯†š¯²wQ é\OºÑidF”o=S™§6»¨s -Ì8^Äî¸P$X…œ¹!Ö8|'ñØ)9õÄßÐ(%r,' +ú®k ànJÎD0ñp¤¡eM^LDiZ-0áßý±r$ŠIŸ¾%¨à=•°@?r¤:=—Ë·¨ìPà´Ú›;ä´œþìÔg¾ƒÊñõp;)5˲ð"r5mêŸÁå#¤ÝuÏWâ(Î Ÿ‘ƒž¯çðóFáI"'9ñ€¬ÑÃÔÛh8` k‰ëŠ +Ýu>–®¤À7Ž*Ò¥Y×ÕõÇ~%8¢Á?Tœ£Úµ"‹ŒM–²#¸¨%Gnª•HëwÔ„î¬Êe×i~±r¡ó袥჊j{vM“YFÃÔ yöû3"ÕVÑW +¬‡Á[ÏôÈSgÙÚuÃ@nˆã .û3âg éóvýsª¶Ò´¾À¯"«k¢w+s½).¿×Û½VÜv Y_ѾûŒðŠ¦f´Ð^û&ª ÌŸô\9ºJ;ì +¦§ù.‚Ž‘öfÔí_+¾÷(ÑÌ ‰ØºR±¦gÙ}!Ë6´©Í¢…)âKݵþð¼oƒ/d½oµ´ë›Ý\jØc ªœß­ÒÚÈU‹q(Ãr‡ýÞ$ .€$ãxœI{F"¢'âcC ŠNÍÙŸøŠ€nD}×ÜÇ‚¤$#DhDwÓˆb°+:y¼D…‚ 0ܱ‘åî‘$“L@Û ãç8àón9„ûŠ’G•ˆ½ä@àÅù ˜ØS¯b€È ¦«kðâ|×7é5ÓGö é/ß{Ï÷^çg@Þ; –(€uü.ŠgÖ2ÏzzgÐeц󻀩'ã–Oy*ŸQoð¤‚å‘Ñ7Ù +t1õ÷Ög-deÜŸ¹e €xÝP:¹ë7û¡AuJ÷›šmÎ(¨¹SIýˆ¸›ô)ˆìÑç-J!NS…Ïø¶ÆƒèÄE}Ê (êÓ__‹€·ó“Ï€çSµtõñëŽðeŒÃÿ ÿóÏ.‚ª:ûÌ^Oåí=jÆrEÉdôY9nÞ¾³²>ÕævaOZ€ÚÞŒ!47Áò¼Gä>Q¤% +»G))ïû¹)ü¨6ªâfg}ggȼh£¼Á«.¾ÈþïÎ1ŽAY(³í1ƒÖ\§)…´À˜›6,ˆÀ?ˆê"AôeÐw{éêäbØtmAÉŒÿ¬NjLœI}‰¸" íÒÕàžÆP:ŒÚµY-.¸ŸKA¬X:ΗppáY”Ø~Õùšº5F×é‹ìó `ìÔóXŽÉû†d¢_NÕ`cWùñóžï¦¡+'wŒŽÄ!<-`j~F\R’yÙ%`?yëÏQj!PCgµ:Z”þJ-øDžJß ª-W„‚·—~ÉW¢ ŠAE—~>Iÿ±Óµ52×2·Ð?C…Û•Æ"r»ÍDÌ;¤¸z$n2cZ²çÃ7 +6ÞŠê¼PÛSgZÙ Úá´q¨•½"¬¶íXž‡ÂÝX§¯¸!”=VÄK ŠD½»:鱃åñk](lC»‘âÔq +ÑÂAÐU)”Û¿ ªrÚ¶ €ÿxÞ¿G—Žv€~á7U8Ó,TÕì6ŧH[.Ÿ¿¿ÞÞÑCn¡¶7j ÏÚBçíÛsrm   |á‡K!š•,I×…§P¸RNî„ ¥ w&ÀRÔFæųl‚ÔŸ ³é‘ðT¤ØR>D¾‰”öÌ)öOáúøýÓϲJ1;Vuo{Yw |/ŸÃ©XêS<äõMÄ·“à{”šÑvùÖ»´Ä£³ÂXEK™¶=6v­i­4ÍÏðUèøckó¦úIwk7=h§Î½ÖN!ÈmKÀ!£7ˆ˜Ód»3 +èÃz1ð{+á´V×J +PY•þ32WèWn3ê1N°^Ò0jÅ6"ˆÊ¢ Ïkƒ­Ìcd§(ü”@ý•‡@êz­\sÞÍÅЭƒýëoæaþ—òYVºÐ¸¿ž¿ ½@ùl ìΰ cohÏH_8ÏŒgo*ð¡4¯¬ÖÍÎ~Ä#$<ìf×äÄV̺ZqÇPjÎÝ!óź—¹n݈ }ðñè°…ù‡ æÅ¿…–ÉñÛ}bÅ|ïp%U †¥Á”léκä½_”Ð)òÛ—¹Å¸©¯·>œ26J„,6ÊòXcÝÀµEDE©ö–˜:Ø0Ú`Ý4û Þµ•ýjðtª2¡0+æëÈõ¸×ýêØWTìÇÿÇÞ»6[sœçy¿€ÿaIå*¼œ>÷ä(ÊVÑŠ-UÊ…‚ˆB"* +¦¬ŸçºŸîYkuÏæ Ò •˜eŠïž^³fÍôt?‡û ž‡Å*®ãI«Xö<"˜ŠºóF"Q£¿ ˆ(+¤Eë²Ë#ï%UR§öš#îæ÷N¢^šù8–o‰)X$Û-º¨gnt™(‹=ý½¸¥ʺqÂ~æAhÓN'´ã³ðÔ…b5h,Ÿè¶‚ÂÃ!OˆÁáüz"CåÕT$LFŽ™¹®¦ºŸWH{ù°9kK§@&D¬¨hTæX±=:&.¼PR–n\à©â5ê8Yý¬æwA·0ËG” 0O äJÔÈ들b¶ ¯r¢zÔý›ï:@Æœ×71¥Â‹_OÐÇ«Ló0tý[›'µ.ã-€)2Ä©Â!.Þ$v'~º3äOˆývK!ñ'¬Wš.´á u<¹XÄ’I¸\¹õEM9»%)û÷È—£à:߈ÇÇ(ùéPÄ:u‘Ÿ€V(‰´ÐmD§Õh“BTÅTk)—Âê ¾ôLµ•PnÀ€ppé}Ê@'ËÙ¿ Ôßäøg#è"©Q +“˯hø™T²¯' è‰Fš¬F‹Kß°^‡SLe=ÚQ±GtÀWG¿Œñ(^E¡ +).U=@”¤øžL ê,€)…t˜äz{J¼‘¶ºZJ€…*è$9y,gQMGÝëU %t.Ý øßGåì´@Ð_HœS@«B>¶~ÔÊiîˆEê[bŒžÛ:Ÿ+¼PVàSõ°›óh~t-û¤'v+gd‹m¹³7¹ó¤Õî£0pÕârâjlçqEãt–[K”7Tw;HøŠT×#×’Ù] áñL: “à ] &k«ÎãàÔh&0BØ¢SÒæ‘™hòÖñMÑå,]MGF)°QŽåãz$ç€X4‘#„Déøkø$¥6Íbw `cy +„U[hEÂëשܥ]sÞ¬'Ó”#h¿D^çìbl°B3ç9¡R8WQÛvTh°ð§³D<ûypÚ“2Y麔ºw-ÞŒÐ<ÈcLÎ6ŠT‹Hº#.øMWÜüŠÏ¡Y!†w§"a-%€@tɤܷør ˜Ô±ÀõT+ÿvà.ìÁlÒo^óª€Í‚Dm[LAÝ{‚CqØ ‰îPü<ð4¢Æ"KÕ”Eòî$B™$BÙÎÑjß7°Ï"›Iíë‚4Áy(àතŒàÄ6µ‚4à»T{ë|â ?m½Ó¥=EÀvËd6ÆÄŸ“Ðë@³t“°ÀXX#\…Ñ^Oñó›|s¥×!Ô@j–:ªHÙÛ¯Àª5h#¸C¡ey•Y¼ôM¤¤j¥Äˆ®5^jèGñ¼Ý©ªÝYÏO€YfŽŠâ€AâÀ “Y\òÍâí +¢3Ö«1ú2ÊæËï +Èî'­¿¢È”_4$Q…\çîIr?ðå²b“_OUxu +q—]cMúkx³1ÎòeŸÝyýÉEᢋ±ÙË ] F8lÀݨCºlÄ°dwuq-R"åæ4ˆ)t÷w8–ñ&V®ÈU‹ºˆ¯K÷/ûý›» ²G¨A:5 +Za"æiÅJtÙ±éfDG;ËFŸÅÁ[qœÃ¢T[V 2hº¾Iëq]( }’ÈfA ã‚1bØ„g…ƒþ6ý 5& 0d„½w~ŠÆÔ¢8>@8Üÿ¢ƒb2§inÿmŸb屉Cé Œ"µê8_ÚíȣѸ`ŠúmÁîsäKû(iW–ìÚ•2È¿¨!¾ö)¢Ú‡ˆjSQÑGYÿ®)…,^hÛ1<â^…+i·VŽ,‘HËA|L¨ô&´ ÔH °°[<ÿÄæ·ú f䟞ó~ð—þU¶MûºIÓ/€»eô]£y[Å6Þ€œò<€NyÕ²ay_qþumlöÏêÖmo è€ o2…lä'I4¼˜[!Cò‡PU +·¸¦ÁvžÜcBã:›ê† +ƒ5QVÚFl›ˆ—!×QØ$ 8÷zòx%+,I®m(̲œÈ- S£3#˜õê¸k Š(€iÇ €£=N·dIIR:]<Œqô~Ž…î4Æ¢7ç\•æWóÌ2Ñ>ζղÇ1 +nØì,vD›® ÚTüÜ4ÄÈ#ðs‘È +ÌyXí‰*àߌ†$”tZºÒQ£0€ú:zPv±TŠí4fm$€L5œMö’[°/«màñÓqÛ/ƒ@ëYäŒÌc ¢¯´1oÝŽRG½a‰Mò“’g·bu¸œD` ØÆéjIS4/ÒTíÜûFLut@µß¦óQ††¡$êkr©ûSÎ]ÓO9û*’€êÖÂÁ$—k8õ’Cg™Kø˜k¢¾Dñ܉Žb>S ƒ µ3ƒmhW¥Jª`/3oêoÆ(a<*¬Yð&çô¶*lÒÅkÜàÃ8¨xKÅm+ªßhDf©Mª_gFð…Òï1¡°§À:æN5´åT›öp´dW´ ÌÅɬ2^ ¨Ã1J/x”F©ÿMZ RöRiá0HK—½–l@ €.Á¬>UO%‘¢jo¿0Ȧ¤iDMðª;ÓyªõôEéTôLq¨j©éR õó¨ÃÆSdZéRôS;f|ih=øï€,a¿ƒ}eœcïSd¦gK"Ä› ýqõ«m ÌÃh¤$ä–%ADèÉzŸeìdRæo^“×@sð”ˆðéÛ†@ýå+҆׀/ áÚáÚ÷§ˆpÁÄøZYtJë„™ÀSG(^¹A@SøŠŸŠe쥊 x.ÔzÕý< Â<Ÿ.{ëM_ž„ÔŠ)ªY›Ä~—‹c¡=U4ŠˆP‡ªb£ÒmFÏHs[ýè@ÛuÔ÷g¬£Q€J3®ìßîŽ>h|Dw>QaÄFX2Lj¦ó2Ü@ú mÅÝjM&¨|ÓŒ`±Ä]ˆeÁ¶¼1Qæ7êDö¦F;ŽS’´ÿ°m›t©HÄ¥¼ 'í¼ž}9zÕЯj‘©ŸúɉÖS(VØQ«§‡5 ’ëÞ%@WMDm\½¨éxG9‘i°±Û®˜¥ÃŠñM‘aJ®–“€[6"x3SÜ ”(ùW×<ÆÝÍã>í¾°Tÿ–©+çÐÿHÇ,÷G€í’Å$2ÜkÂOÍ.åjdÑTÙQ6NÓ_#hGÔAŒFHê±f‡ˆ!F`S#(dªÚÙƒF€ûaÄ ‚S_€x´}p®f¿°–ÅÛYŒó·2¹‡…ÔpjD¢ÎùÜgÞ ÈùÈÏáºÇ@ðA&7|FóõM§Ï0 /êNh —¬2V ¡zÅ"K’‚{uŒßÔù“Ô(bÙïC©§°¦¬hóigAŸÑyÆú¼x$¬³UÿÞ ¶R+'GiLŠ‹°Xö‚>d¡êþ}±È¯ TäæµeQÿÆ°ÈcÞ¢+›&r!ŒRÓ>˹§¡R®³ ›ÁTØùq +#­ì­=îÛ4ËezûÉú6ÊÅû ˾y²ôï…P9ÆŽþ¡7ï +A]Ëeu3­Ž@N½6Ê~#u.JZjƒ þ Œ½HäË~`ÎRÝêU† ®¸Ì¨Cu¼›Ï¤Qà"pV ³ÌiÙ_Q®ÓˆÄ㊸4i Hò‘â‹ôCímÖ# Ds€´¥Iá—C?ÏÏS§4À@Öä¸ÊÇìô‡`\L}𴲟Aí(:â}ä¿ÉÚÒÆ‹BœUý~œÈÿÙfˆº8†«#øôñCDM,ÀïY}bvÏíŠ_ÚlçtèÆC,tÙ>-ÉöI7iE¶?…DÊt„šyr›(FêÒ|ƒ?±Ë­äJÒ°Ûô"IµÏ££,\hQt¡‹Ÿ,¯Ñööñ8lFv·šôâY0þ ßcGb$–µP¾a…îþ;B~xèxšª»%QQð^R9¢“spC ßD¡FJJ–7ǵ[~ÁÀ0íLŽæ#’°^‹“Ç+‚RgƒCx}ÑÙ‡vŽšbT÷Ƈ«þ,­S?+BÒœÕ2ÈÓGÀž>U¾(v9ŸJÉ8ºîZrpOÍ!Þ0F¬¹Ìa2dZP†f{ +÷¿¦\‡cõÞ¦8#M«ÞËE|!‹S$ñcçAýs„Äârû«.¥‹ýEôc;‘žˆËöö¡_»3g<’<œH *!®€ÆÕ(”Ç‚EΠè0çé$yÈŽ¶v2‚“ÎcPÿvâ™á1$ž-?F•àRk\©κ®ž(9?-ÿ!lPUšoR@³…ìŒ32†ÐÍÌ+RÝs¥Ì ¢Æî8•n-Æ8E—§®yAÍ™-ð£¯Èg?â[‰¦È™<Ë>A0³¾Qüé:§ÝmKd=VÅÈ­±º[Áñ)È{ˆ`4W/†‚§Þfš°’2*9v?n&¯¹³÷Me¤bËdõ5U~§û³¡6#‚R“°e@Ÿø$ú‹¤6=z‹ž.MGÊí.Ež‰ÄÜCâ¡;¼†üÁ•Gr#Í×È +©_4ºËùX>bÂÃcB‰N +j ªƒÔ¿ì ECÒ¯Spw¬§€¦ð‚ÿØe0Èßs&8‹ì(–°¦£®e+WÍ8‚;q°©#Iغ9pÊÖÞä[à8KH èjtýUæÅA$ªÅ¥A½8ßzuŠ¨*e²Î€i2Údh-ˆ#¥!!òrRÁ“R:õF‹>ÔnëÄC;æŽðêF¦zÂg§k¨ÚÝ0r´%(4Uн¹`ñZ!‚±ó8“r~ö&OŒj±4 &wB4G cæúÝ~´¡4:x‰È@ +1Â"Œ¢;§Lá,¹à:ÒC )xòåvÀ`¥çÎhL¡Í¨¤øQcû¶(!À½g=¯’:ƒó?Fdº ’Žt [Æý¤Á¥ÒµD§¤Ò”8PÒv£ƒõTÀ¸$¥zPtuì›DGÛHC¹{Äjc0 $íöx:zHö!¨¿¾H÷ e7šRÆȪAƈ]‹Fœ1jD?‰F@{ùä4lmØXa…•ÙH9”s¶¿“á ªC_›æ‰"˜tKxNÍN•N”Ýz®t¬ôQ©|1hóI¾ªZ)¤s§ê4;Krh„ÞâŽ0‹ªƒkPœ¯8 v÷ÚlÓŠEçøÄz˜µhÀzâd6M ­þl7HzNЇɪ3pÝ9I‹Š?Zé Ì zmEàk½UŒUe6Sß)$ë$цsJ‹$p°t/]’¦ ¨Iuì|“à_wÿjw«W×âBQ"YåÖ´”;À] `s†‡ð‹d6··þ^ ^`™*£$íœÐE”±´Š'·UÜñT§'KY®ÈÃøg…‹+j‘gÈÙl‘$ÉsYRËïte1o«asõ2<5ÆNþM# ?Œ‘‚QX³Èß„tû%Ÿ^í)€Iè‡~™Œ'0Ó˜ªù}B.Q‚DL¯ã_ßd2(´UÔ¥½»ñþ˜1w–ZŠ“U½êÛ©vùîNY’Khº¶)™À¥6$²¥?a¯5¶‚©K„ìœ=„‚8˜åÆÝ„@”*}+@L"EH•Œî²Tž˜€öÇ)bF&KŒã .‚Ÿt:u=õ=0ÍR_!í”.«{‹üG6iÏéP8NÙÖ®Eb°AF8˜Þ¹˜uS¹AbWwÅ×Y¨¿.Ä]ÁYfÑ“i‹ÑoÄöÑXà%øç´‡‚F‰.(›ýò‰Í%»¡y¯]¢ª`œü€Tó[Ú°êÛœól´Þü`AÄ–\æ”æ~ §î:²áM¤¹Á©j#Ày©DÀ~É׃p¨[6Eè~.Ž«—,©`·4¬Ð‰‡mŒJïë™ÇN§ž’–äœ!s!ÅË>‰Ê 6˜V“4¢)Ѥ>º'ìûA9€Y¬˜èxðb€ä ©DJ¼"f$Œ~º$àTº(ëð$Ä«"sÙ]êñ +UZ§_èc€,°\wE!ǯG¯ˆÉB¥•ùèàg÷wØIƒT(TWëÛ¡ð›s ˆ>ˆüy–ì©e„ E=oÃԌّ¼¬nHtÍÑеÿk¿™–¶¦Ÿ ÌrlV“Ë‘+%ô(2½Dž«RÏÌ/Ôƒ„ïoŽÆ@oÿµÔª¼€fq‰6ê?ö¢ò…]ÈN>-3?lO@Y>ãT@µÏÀ¿ü @QÒr*ðä)"F.# z½ÐÍ´d%öýA~Á§ä£ê<‹–z¡é³Ø¬©DîWY)ks ‰9É +øˆ‰„ÒŽÃüyÎãtÄ-5îSœqœŒÉé,:P‹'ÐÚ¹©!C Z>™¼IÀ~‚^ÊšxÍuºî\Ø,? +µö¼íü“?y&ÈéñšKÖäðz…jïpÈÞm*‘s»d]p’Fr…zIA¾ýÄtßö¡ô¡ÛÉŽÃí„…š“ô8\“µ ôks¦¥ ÓÀðÅiy.©¬¬Ï;5%šë" e#KÛio~69¬Ù" d ð@œÁ«$¸šóNBo*%;û¶Kˆ‡W·éׂԖäÍ©å™bÝ ŸœXtÍ:dIÀé@ƒ<†è²¶qèc¸ÎXC‰óáüDÑ Q1+ûH’æ1•áüHRD‚µØ“¬I?­’Pž‘¤¸UàÄàá˜,«íñub€î¼øLKDzº4¨m0=åü"Ç–€¦ef°ÒäÁ= +˜Ô‡‘±ÈçP¼$…dÐ<”hx-ºDëì?Yº›ÏJFH2' Uê¯üöâr.4¡´†Œ¨ö¼üAp÷$ÀM@´!È}†ªo€+4!ªÓjã¥YÀ4Owô¡×ÂKKšN+¿ñ”Å$…“X¯i }èól‡ÿ9óž]#SóDû,)Œ„#½ûÚvH2S¹|’¾¬OXe½¦ÖØ7NìúíØ-¡ §FaË9< ²–ù·$8” º_p„ÆîžÔ¢ Ú¥p–$l±¯„²jÙHõÓIãÕ¦‹Â¢ ¹ô»â¦d‹â˜t†n”R.3½&ÀÒ8àî°$Dgö€h'D d;Ô³ÇT4M(]óè1šu[—îpyúߣþœÜS€@þ¼Î%þ4o+`8,~ø7ºäEÅz®N{?$.°@"†“›ÏþÊá21é÷*”ao ¿äÅ™vkGWtvÌGºÚMTØg=6}ˆ’Á³hZ&w&¯L.¬ZŸXˆöìÑRcÏ—ÆlÓZêÞS`ÁàzLÍû?TϽŸpFŒnVå.VïÔÁ ʼ?ÀÇèB$é³’ 1åà'bÏä%?¶y’:_, âz¢sJÇ×¢âa¤ò$´y¨·Ðreè”Ú¡ýÀÒ„çHžÈŠ—Q鬇ÇìþרP§!ãOX¤~ýdÕDÚ<åâÄ:/’ä¨+}R>Qve=v,ð|@v}fiŒ¦Áв'Vâï‘à NdóöûÔ)¤f Mž<ܱý¿€Š:Ù€öù³ÄD|‰eMf®ìJiØÙ4[šËÄÆ êÔæmüô­ +˜ÏJÒr6>}agq%ýÜaWvž N¦]ÐÖ‘J¬@Г×_=ÃÙÞ¬Á3BJ*¯#D”‡2kx’’]&ű[YÊüáË2B«‡«yǧMÒ–‡¼=‚˜SO+õ¡2Q¤}(=¶,m#è6å”Qíè2èäë¯rVFg¶Íñ²‘°LABÛíe!‹ìÄ@êbIs¤éEeÙu¹TB[Þ àÓÀov3IËr‘®#,´+ôb”S÷±¹æÇfwú‘P9øå «b°’òÞõ!¹Ðè’>ÕîˆTçù•^æ@ϱé†ùÌñfÆJÙ¿X€K¸ÈÙ µÁÔJ~†4ßg«ÑAE—•Øæ2Q&WK@^#á ZûÞ+ŠEbÄÿ%2PmGˆÃÙzv/¦Ä3Jˆüƒ¤rŽ½öp!csE«JûYÀ¾ê@˜nÁ4P(‘X|¢ñti¾€Ù â R˜„#„ƒ(A¶Y›éß$@Mmð›ØŽRÏh^‘+b…ß!TåÝ(¶x%äâÀ¸*Ëø 7MÏKÀå7•|*>ÚIˆu‹]"(‹H¼½hØÙd +Ç>tÑs§ÐLrÄËú!2[o(EmÖ“D«[8…<šuÝBKáŽss°G€©e„ܼø°È?):/é +Qœ_à;‹­ÍD¢ýU§ýIu›OÑ~±w2m=är–:#úCôX5ÿCÔ9B˜b‘²µ ê_ÅâA(Ê%Ýã*T-³K0Tª–,$¹ Yù*%í.~-¬Ew[þv·ÛÅ«NC¤°èéšõŠE‘K<ýI€§ª˜á¾~–„·èÅÄ«UŽS@o ƒ‚¶’ÝuL²ÓÜåäö&-Œjë s¦f;!ˆ<=“3ÙÎ|ÅŒô²ù(Ãé5§k3”bŠ­5©B.N…†f* <†é|!˜Àz%®˜“)\Šµ="í¡,ˆ§ žY2ãW,U¬€<›«¨¹I';¾€HM³j˪^µQÀŽ8€¥³œ’Ó4è’zlêÝËšZìñ€–((f-ºªì[œ)‹ÓÿÃT`'¹©*tad§~;£€ã0*j9>ÆfU‰®& ù‚IŸVt¬þMI[&pýâß40öõJˆP YÖÕuŠk–®¬¨ˆÄ±•iÁm0ê4ÒlÔ]léòd„ǽª6ìßÔ [0J¥[÷Ô ø"»t½al˜£Ùµ¤ O‡EðeœAÌmÄL&†ZŽ£ˆY²W·ÀE(X裳¹@*Ñ`„.›Ø莨¼¸ÆRN á>ç‚Ç+YL5€E² j›Põͺ¡ôÀ¢ ØÛIx†×BÑÒ@‚œž2*°«=Á4->UC·’ú Q‰ QZ©FÉLÖ¾)?‹'“Šb¿†ž Îð–tgóÓL—¿ÍáU#UR*\Ÿ쀞‰»†N=?feTE¦5ןªh¸ç*¸s•‹Œã° ]°©H©Í͉ÝR˜.ò¡Ð/HÃ0¢»ÜÁ¡2 IR˜5hÉUO[¨Vî¨RÇ.*œ$š‹i,†J×7 ŽÅZ,’OU]Ž"PÒ· Þ9a*iQ;`£Ížæùºq>o„áÌŠ0€µ} ¥Aø‰¬Œf5µƒ‡ H^†Éל#‰X#X$ܪõ-7IA8ѳcLo¯S{Bx# ”ÅSÂ)Ü4–ÁkLEU6ˆºI·ûœŒëÖ…¥ƒS˜Ý"IE’†$õ|*Èh r‹²K>ØJ¡H„$ÎzºÚÑq%#C?M§·ñ§ÞÒ4Þ?Ø€JY뀑d­ßc98‡R­íf%ìªp/÷yÞ0D…+˜?w;âï €;ƒ—=cU8€æm¹ÇNwä ;),5¶›>®„Z[Ïn{¤eÆF@ˆÕÿâæF³!ê\ƒ%®/œF®ÁŽ!'Kß'C]Nþwìeù48  …ÅIðK9Í€piý‚@ +°Z¬¯‰ÆAjBh k2P®¤‹ìƒÅ)KŽ âíд+() +Áœ ÀYàl¿FÜ‚ƒ¬£L »N-·b!ÆõKîÞ\ù+(cµš:!²n2Ø\ð¡§-œlv¢¨”hOæ®™âµ0:U½È5Г¶Ÿ¦­‘R‰š‹$¾ªÙ4lfä‡Äæb†ÙîöËŸ8¡Dº´PÊ¥,Íè®Q‚±ºž^%”)~Qâ5-]Ôº;÷Äs™t°—;ãÀ(ÀPM « å"@S%‚@Å+æäEb§cIEÿ µôŸô$Óèo'Ž\ yÏš&ù9ª ""JÉ%ö¤£‘\D»¿0°ù3ð=¼¡À„%¡J»—'Ï<”U)𻎱²,´Âú%Æ›ÝA$*z´ƒ1^–¦Pö‚‹'ÊCU-ÓvŒ0*é+ÔEx7n…<`’`Ø Áy(Íc¯ƒÂ‡ØvϸzõúšlhÅ…8•ë·”9‚Äç)Ù X,ÔWøþèþeêê ‡zC¼êkSU5dà|Ý1yÀBÿf¤¿¢Õ$Õ+5ßA.8x^¸ñØC}ÈP†JŽ½jHò%Ù„s´iWN©Mzð5W fiÓ!˘q8¦Ÿ]ì)É4‰ß‘H8k#,QcJDÖÀR\"6IuD÷ÁŽ! %[Fïj»‘îÓ²³‘ÍÆ9Ü€Ý8'„¥ë­fSka!ôõ‰úìd¡7, ¤˜ º"iû>£PÔyR¨ÆVÒî@*dE¨J¬u +±já¬WLDO‚B¸¸¬Á{  =¢dÆ»o†TØä8GĦâ­Ý‡8DW?©òUÿIÕsU ³j€Œ™0È».jŪG(¹(â¼]¹´½²äÒ¶¤C®±3°lq_á äǧðv+¡zIì§T‘EÅ ;P³%„Â!ðÂjÝùZ\~{÷!¦¸<Óýö8h¬‘ +4ï|È'I®*2ºOª·IV³“bÐÔä£SXœÀV|7£ú%½ça¼Í"]‘øb>t…?5M‘)Cï]¤_|1`„4`Òw9Î`H!ez!¤¯/pÂz ï_à¿Äf¬”ˆ‘`gÂÈwózGs¥Ø~)¾Yf÷ÅÊcõŒ}IÝ⇠+w4ÂwkêØû¢ÆN ñ0žcŸ¡È³8ÌQ†8[c×ád¡/gâô¯Õ›QQ…Oȶë´ñÐÜÞ$ADl7#Ø~¸‰Ìþ<¾iU´iÓñ•¤a,ÆEÕ¶TIÙÑe/0û%Kxb!t’U“ð@! lbG²¦?}*¸ö ÒÜ ‡L”ú1¦ +{lÎòQ7Í“™ÆŒn9…Ýfa`}àH‘*¨FE0B+¥i8¹Å.#”œÙìá€ÍäÂÄó›TÛ³Qg—QÐúT‹t¤)š%ñÝõÃB>‡E#¨Øê xí@š=¼È–{¸Y••@]ó©4ÊIµowWzs ‡›š—`UOiê9 À¨":‹! hNäÏ°¦±U´÷…è)WyÝ0"õ‡äÜEœ3Oš¼AN&ÂÒO#hçìûñ» ¹:é]ñâÒço6ú°˜Hnü”Ó©&$ ¼4E/÷Ùtà³1ÏÉí§*ýj'.ž=šõp1-¬‰Eˆ¶äu,”ûÀ h”å[Œ:ó˜VŠŽ•)ŠoHóš)2 gç€×b¨æΦÈWçõ=Î.mÚ8ðdW•5ëã¸ôøa1c¥ëÓÇ$m#æÕHÛ H'4º¶5©N±¥ýÅ)äŸ8ÅÓ7e·°·,¦5‚®–Œ4L‹ú^ÞlBcÊîõ Ê©Y ‡$l°A´{—ÒÎà’½í%™±e`]¹ÑÎ:»(MvvQêÛÂÑ9$+ŸrƒG :zÇ$«¡ªŸ€ãÎ’¬„j5Î;6gN0@ƒ@=µ'{÷ÄÞLõ4–_Žž†tðc‰ýf”$Ú<=@Ô¿pèŒÛ΂4o÷<KMJ®9î"^0äIÅ êζlÁ–ä¨xFz¶°‰ˆô E*ZAc5L98FÉþÄB[ ý!îF ÜFx,ᳬ²Žh dô3à]bæªÞ%ÑÀˆ#^oênY£ªÐµp@‹FÉ”FçËF$éQ3¢ú”–-c¯W'}¡VPQƒ{µg0ñˆ›»¢«<ƒ­]–ãbݾ拻î9úÄÜsÊzûˆA¾ëª×No¡}Ô1Ð;¬’ãæJÓ0ÑšÄÈò€ÇHÝÂ=¹¤Î^Xèû>ÀתaZì ç¸0ƒ*N…¢TU³ªç~ä,^ g§ÖÍ(@R´Mš›²IÜ›êQ-ûû¦þg«A¸B¢H"e¡Ñuá®Bx@6후½Œ.ŒÁyÌÇ“08ü¢–@ëf‚PbE¯$c]YÛGõšÈ~ÎË÷^þ}ÊšÚ‡)æº +‚T ‚\sÕ•J¥å6'zÏfM¾†±6VfGƒЕ +éj¼U_hš@ÀDI§À¦2ç©Á$"‹ÆnÜE8Uü˜lÖdµ«ôã1"X>!KÅ›f€YÇ2è‚ +Ž@t¸«c¬ð§žÅ˜NŒ±àüŠ¿¬ú¢ ÉÝxÙ1 ØD`RI…˜1—ª“Ji•Ý#9YZí¯ £ÎÁ QšU5#JhÓ” Râ<†Á.§GÓ¦!û­Ð¥„r¡ä[A\$hÁÛǃ¤3=ÊS”Ãòvðà\ñsD8Fþ­k Úâ¸Ú˜¹ÝÔNŽ<2|³ùsÒ¼e¡fL7¥Ã¥=øAØmÊЛ öIàõ’€"ÃæLÑ?Èã<\„ñæ´ÀRŸhpa¾ ï]Q¡b ¾1^@%¢µ‹ÞÄæïÜÀÂÉýübéýX¸u)íM•ŒÃõSì^P‹)rº7­ó Ó=dé°±ŸDþ¢S{8©ÓY¸ +5Y16öUd+ïˆê§øˆµÜ}«d]É〠_½zÝߤ ¤ã ¸‚î›C¼xYô©20þDm쬔v¸8 –sÀ[ᶚ ;/™‡ˆ‘”!*Xâ+uxÁYúœ$Oœê͌“ + dFP}¶£„tIòZ ˜€BŒ@$ãŸê”‰Ò~ŸÕ…ÈFE§àÀ¥¹†Aƒje žº¨,rô–£FÁ„@Ë<½³âÐñ¡ìd;=…Ï0€6/¸¢Ëi=X¡ØÑòhá8P‡Ìà‡?±ë8DŸrŠé”";ž +(ˆåtɳÃ3\‚]%ÒÓÐAZ9 +ܵͩ’$kM¢{3¢Go˜ØÓ}vóy$Éó6$ÏÑmèSh«aŒ‚< ˆ¤»ü}<ÚÖ´L¿“Csr@èt,¢v1[b«ƒ¦Ãvþ ѪŸ"Ád©}S•À*yŽƒ©TÖg¢Ð_Ðß…Àâq¤Wˆ±‹ü…€zrd €®M­6åÃ1%ð)Ãéô:KÓ¯]íÞšü­¡ðÕ«sŠ…KÀm£äBNŸ® /ô”é˜À“Pz$Þ;ÙïY€^8ÙµˆÖèãÀéÐM¡$†ÍuP¢ø©¸(~Á­ù’QÆ–ØÌÞÊ b¯ôQÃO7ŸBd +r“f¥¡Jzý<XéQG=Tu+Àúý×÷ç!MíRÛZÑ S¨±µ ÷vœ`ÚÁ$¨Ä>ªc§³îlLvz”±ì¼“š¥tÙ!Å ÒkE ÍPºÂ<|©altO›ƒ®~vŽ}5¾¯Z6_“£ƒIðÜÒr_’k)f—KyÓ‰^tÛÈãQä™ñåï"ŠówwìÈà³ýdÚvq=`Ý9€IŠ, IºbÀ›¬ž¥û”óÑä‘{—Ḥ«`:¨„Œ»ŠáøÂà“·Ü(>"8ŠLƒÀEO¶öÂBÔº­Šš¿L‡Fã‹ vé®4¬Rè9Ôè®òÀ’åd±ÈГà0H$€e¾|Ÿ§“ä +)>¢Ùušî±…ÄœèP7L”©¨ôù+ÒH*i›rhŽ/7–€0—(64b­,é&lm»läÅ"i èö-ÚO÷8؈FÒBiTÝûô¦Ä_(üž7ýsz(ŽÔA)ÛÙA‹²`&—qÊ+*Ћ  }/C'L·§‰•ò™¯1b×ëaKE š­»w¸I +ì[Žšâ B¿€õÀ—³ñù‡ æ”Xí2 +¶Ÿó +qL“(zsþ2â ;åmÄݲ½ª`¢8ê#´‡œ¹ ¹N™«€)YápË%¸-Š@îyð • ×ðä š†3è)ê*»ð€»ú)ʇžZ“ÇXFQ+Šr¨#p|È€ks·Èɯgþy ãQ,N +s¢Ñu’*»K¶äõÀïFzì ½#ön>.Ïh|.š\O]fPÁ§ÅO¢Ü¶BðÍRuI©‰™™[ÔC§1BrŸB +sÉ©Š¦}œFˆzmŒh>¢äùEmŒ ˆÓÀÈŒçeÁ ¯g¤>œî.Qâ¥Uç[Ðc@’ÕaŸ–ŠXѨ˜TÁ–ú)$—ó"oºŒµxrMíßÂÝ!5«;‰¿ˆßÁqš=dÔÞkE"~ël}ê„¢ïÃóÍAY&/dŠ-+Ž¸(£6×ñÆtqZT4ü¯“ƒEÑé©"ézÔz«ëëÓTc<‡’ ¨(²%ÐyN·úŒêXžrº0(#ÊÓ(r‚K©RdÅEæz¶D {t3BV%éé)é Øßø‚é5 ,â³X…ÝlÄpTGžŠ#-cŒ¦÷Œõ­È¤]4¾bk±øñd±ãÝìiÌm»C.^Ç:…ÐQTÕM‹Jk)*¤¤£‘ïF@Gf¾u9š_µ;×{f¸ë8JkÀŒÓ ç80®t12qsuLf#ÙiÇŠÀ(Î`#HÖÕGLªÚ *û…ž€‡iŽÕ!¼ÕF6DlÜÐ…¯P•ï¯—ˆOæ »PÄÉ4{»£€?Üœ8@GlµÔ{Z³› b²ŠA§ÃrJ +AUH‹G3 +”®ÒâAÄ\"v¡ùÇUé’êv«á¢TTó +s&™äÉ•Ù—›‚åuLÑÜâTQ@Ç]j?Çð4î*Õ +®›‘øX=;p0 Xqňz§xËØ*©¸KûæË Ðc’Ô,†ço»F/sTÑ(öš‚Š\)‹ˆkt«c½éCž"‰&ÇTÄ‚à‘q%ÌÚ°Qx|vºj¢Ï¡jOo“/€}AŠþC•aDðÓÙÐÙŠqLÀ_ƒÀÿp.9í$ÞéªhZåæ²È2z‘;wˆ ÅE`¬ãŒfy¥ áZGö7ÚbSfx= ä;d˜h ¥ñ€µ)fê/¢âºa¸¥L²îñ¿;9 …DX•¯Ï t"3uÙVÝ4:'Y"éÛˆ +Á BaåOÝ»iàB'3î*Y*niDK#ÉjDõ—ó)εš%–:Hr;OIεa–ˆ™†¸‹%ø ·ö¯n²×$z#éÕV’y÷•u‰žD'™‘ë_y`à¸å‚ëG9«=ž‡¬h`ƒ¬ƒ.BŽ%ŠîFšèt4£}„dsÀ³ bÖÄÛñ7…0ˆ4Õ:òíthÐèS˜'è"äÜè;x…_À½À§kSIŠØFXŒ®ëÕNSѶmú±J|¸4±’iOê±€êp VvHyˆ ©Ùà%õ@ðœ÷~ßG¤¶}¼N‹§ØÞD;Ë^ÖB^ŒÈ>BϵøsýûmP@éóP—Œ r\göë¬CMN øCȽºk0‹ ÊÐeaãŒuå¹A ëóÁ!ÙE˜­8i•d,Ë5ÆÈ€²ô¼<Ùe¯ +Œ¨HˆüC™CÝk”ûˆX܆Ôõ…ÆÖ(jŒ">:…žj K +FJ+.é(ë!!b¤àÄ &¾!†P +äT.Œßk²½=MOÙá{E Ñƒëï¹ýé²#ŒhÁÏKp!>ð©:´×¸ Xsai§åÇùµ‰V±…Å{&Xˆ +Ë)>êá×é\§#T‰§Én/ )G5H#„õ4Ç/…8ç8/ïkw}$N=ÙóÃpW…_ +ù>â¯`r÷-Œ_^/ø»’K¡ B×’’6Ÿ‚"L•ZInQ‘¥¼wØfvŒÆµDFñ°LuáSj(ÁmýZÆvÆ“ÂècWðÓëœÄùuQ‚HcÑX‡ËGç|zêÃÓ„‡A!:8ß!Ø^UåiÇðÂak<œïL…L Ø…ZP¤` T˜/ Üž>&Hœ½’‡ë7»·ì(›ów½"#@€ë]kžSÅ8êÝi%m3=ÍoZG1»4 +"m†•’E—¶dÊÚ m­&D‘ ;Ìeá‡îQìp4Ž¶Q€Â\9ƒâ2  .ëmÞ)ìÀšü}ûM–6º/þ„3N3“tßÇ1]>*ö1Ê¢ô_Žë9Ý೑Š%µù"<¡ªò%¥ÍÁC­(mŠôw$š(I6×r}ªq0à·éBt)8Ü=#ƒiW.½Ä¨ýWøHÂ5!î/¸ìü¢ä¥RQáØÜ‹ðÛÁY^yaÎ3Fœ>‚}lÛAuÎm^2Š’!NHœ.»N•XtL³›~c€>ä9¢u›m5´¡h]†¢õ4‰=†ìæB]èé.ˆ‹6:[ë$—ÜÝë¨KJUa ~©ÓI¸KrÏÒϬR¿-ty€eïsÁµ¨Š"í&üÅ¿°WÎY IpB™ŽŽX4èFÙ-éCmI°Ð,]cZA\O @­þÂ+Ë1=ÏÃex¤Ž¯¢Øu@„_aB@ ù¹mš U"t",ãí¢_"&ý5Œ®…ÒBÖÍ1—ö„Dcè”Ú>sxM‰ÃÅ;Ë& +ð"e@W´'‡jí»8œì#æí»ìÛ?ðd.±å™P«ÿñ-™·ŸþÙÛ_ÿ‡÷¿,¼ýìÓï¾û‡·ŸþüùÅ÷ßýÛo?ÿÅ?}þ_|óíçŸ}÷ÿòùw÷ùŸõÍ÷ÿú·ßý§ô/½ÿį¾þǯ¿øþë¯>·¯x¹¸ó£Wp¼ýìW_ñrB¾ò»ß~þ¿|ó›Ïÿòëß~ùõ·ßþ|ý/~Þüö³_|ûýÍhþÏû_û…ÿò»/Ÿ¡@9¼S‘÷Þ7þÕ7öùÿðÍWßÿ½°¼÷eùÛ¯÷Í×ÿlßõÿôî}yúvMß|ýOOWôîè_~ýwßn·ÿýíwß~ÿ±ÁõÝ?®c-ú½¿îûú›_ÿý÷?ðçýê»þ§ÛÇùç?ùŸ~þ‹ôùŸûÕø¤ÿûÓ¯ýÍ·ã/ÿóÛOÿÏo¿ýâ7_õ6þòÿì'7ó*x?ª„U¸ÂP).¬‚&K@Çi8a@X±üÓÒÍõŸë¿ÿúŸ²Ñ|^_ŒÿÝþçÿmügKÛßþâíÿúÇÛWþù_)ö^®dýB¡ñ>zYÚE·QóWýòî‹~ïÁÛóûƒßèñP?ýâËÿÇŸ¿úúËïßçðÿ[þ[en‹ÈlÇC_²¾a™ù½Ùæ 6rséØ*5à T4J"3øŸ¸Mõˆñp©+£ƒ¥Do©…ëÈ +v¹m @¸9‰ˆîz:>hLM=¢$¼ËÝ–¦B§QyDGøb £†Gy5Níê,Oõjô|K—6I‘XZ—t^›$ñΊ7|pHUïHvaª!°Y“ePûè’¶çíÞv¥zHýp -`‹ð2Š\yeê •“Ùظ@8ãõöïuš4Œœ +–F®ß«Œ, Ñ·wïÚߌ‹öº4`T úQkä‡Xt…µ²n/êÆBÑ|Eï+EÏš-˜@q‹œ“€ˆ’ +Dp)`€%'NãS¥ˆ:¦)5äŽóƒîK .=ØÚ¯n1ZlTØX-±E´Ju½–^ÛUÈY×ÔqOÚ×”H½p0Î$›6¾¨ŽÉX7vYÎW—DÏ @ bsYíZë0¥nÖ˜ƒ´9å­,±@Ëú’ä}@9b™©¿s +i“ìéíi‚;jT4!çœv Äh +§'q}ÎQ\…?á‚÷kro^’'Ä„¼±xFÍõ*ïÀ¦‡£*”E{¬.¦ºr}ƒž¹HžX‹±y@Íë {²¯”1² +0EU×7ËÜžJ«“УćýXzÚÌjÎî‚`¹Éûì“dž]/)¹^Râ…’Î + uÈäŸJu±'&‰*YNüXÜV]Ô0À#ƸyQK¤º!j.<ÜÊŽ›ô— +q‘ÍpŒ)¡¶åG_œÏžÞ°:Úò\ª GÙñfaôþ+ð],´Tÿ$ +¯vgrLµâh”J”ú 8«ì~œyçWâ˜gï¹VY¿3Å>®£ÀT¬®ˆ¬6+úÀ, ’Ê–•y’B“¯JÑâ„ÇÀ°•§QÙÊA¡žUrùxµÈÕv…—xijC%Cñ" ]W†®9¾“ê1óëB{Tuª€Âg ¤´w²m% ªC¾S(=x½­¸%€zÕ‰rg¥Ëº-‹"/Ü~i~-!ª»MC2‹’’EïÔµ‚FøRÏ›væñM^ø²PUɊ˭˵®›dº³Øtp!¶›±ED Ä4Ñ$@£±P ·e¦y%@»6£Wâå‹P—½‰d&µªO@1yËÄ^cµLH)ßrUoŠÖDî’`G>hlc€gÄ¥îÿÔ»z@¶U%ÉçÑQ0¿Ä«öräÁþÑtR–¥üE”«VöþKxÔb‰£ÒÔaÔŒåM•“@WŠ¯¾ºšk¬NMâºà­¦[•¤0ŸíÌaüùgJZÎ6"êäyЋ+=9A‡ÈO š¡”­øƒ]hãÝ}{÷…ä >ý[ÅIW(úëß~ñÕ7–d¼¥ògoŸ`Œ%#‹1e²Aƒ÷ͽ¨P+¦üDŽ8È'Âl,Ð(ì²¹ñöé¯í;>‰I;*zE¢ŸPØnè@׊ñfØjàÚŸàûÙ\üDÅiJ“8Ûϳ©@¥:”øü@ÀÞt›ÃðvzûkšO”gdùØH©’~‚ K€ý…ùþC¾-²ñ|@ÞÐÖšªŠÍ „V„MôOYk> ª±BÊÀ?ó,oŸÐ¬¸ CS½Ñ?è·uGR7”%í}fîQ Ò6²Yþé÷Û>ij†QÎ •Á¾­R8³ÜÒƒMñOgž¼}úé}ˆý³ç¿ýìß|÷½EÓßýö+›Jž®ýÞ¹¡ìì/¾°Äþ?Ûà·Ÿ~öó_üë1ÿêï¾ûíoüЈÍ-Œÿ껿ýúóŸÿâ$µþwßÿ‹Åî¯_"øàY¿æwüæ÷üoMæq?%…g©¯0²-VZêxÅ ËŽá k!”†Crwn{_‹Às¶ÍS*#e"Àx«Ô¨A7Ài^Ï®[m} ÚXi&l¯¨»ÔªÈp¢Ô½ê€‹ö·ÊÆAX’œ†¨r»¼}½Cqõƃ K›>P¨Û§p!Âá§Öáb’ñœ2– nek´XŽ$ ñÄ:¯Ó k§‹¨êVC¸ÀUH²¤N§½ÉåÐ6zÛô\ahã¨úáë?v3G:Ú^¶£'ÏM¾ ¸ip©Í[§U4SEô=N.Ú¶Õit FË[À­#q€C\)€# ¼íöŸE'Ã7§mºÂM$$³õ@,U:Z~vùîäˆGHž=!žh߬†šEÖ‰õ0ˆ‹…Ø_Š¤É-â¢&H5V§>TÙŸ„V<*\ºì6–ñ4Ø8$Ø4G‚ ÌA_ø+ÒüºEˆa~q¥e.,;ÊmpyÛƒÐÏ.ÅÅþyÒ‡©`‘G1½‚UŽ—ð¶ï¤[F|gÙ S`q€&b +i³ 9®2·UXÖäñ8ž%BåDïàÛB“<á8]s +ù€P§=ÛÓLÙ™\ItÉÊeƒTñÓ¡jN,˜£ª§r¥¦—`áýáJÏ£J/pdA&*JºCý£fK¦|:á'ÔÓ PÿÑGÅ劮ö!‘NâU»XɽÙÛ@,x0/ןõpã¨kKë÷íë3ÝohFü$éng›7ûJ¿´iýtëAÏ~«DS¼qœ½þ˜–³œ0iZO× {Ø”(ñjž® k¿î@s›Ô\¶4Â0šØ"ùèLºêòõ€åˆ´åÛ².TxÊœA4ÉÚÜ’Ç8cògL,[ɨOó*c1F1=É“€2€df«@K®òÈÀ›8myQÎc—ç-N^Kí(ô¢zÁíÔ1`Á³áÄ*›+ ñªX ÃægknÙ‰ÆÑ +ø…Ïî#8 -ë¨Vžß/p,h²aÖ¨ÁùªùÄe¼êt”–_¸0¸m’¢ú†?—Âj£ýÓ&S:%2s, Ðªé¹Ðr;Ô«WVtHJòÐ}ojgEï63gGWdìL~;š|c?h]Uűï ÜE/RÐÓÅÒžâb4‰ø>ßÈ#z}MµJñáëC:(²B€E§@õ¯ï$1E®Ù,Â…6\9MÍ$êÉmfªT˜5<^»D_á9ÁâÇ©ùW$üt^i·½cÊm·ý„`39µN´qˆ_Tîó@î¤uŠ®ä±È§^Y¦ÍM·!ÀZçsnjÑ’ûÊ#Žkef´|Jòhëƒ)0o“˜*E¡ûü¹Œ~fÝt0Œv[qD>i:„b¼¨my€›^r{ÛœÆt).Œz½ —ÍÀë@’Ã^A ./ö,¨@¹<Õ@éQR/v œn)h˜¸š +l‹ø¨j°zÛà ˜T öô\¯¯Ùv4¬gÙDômÉ…PM´%hÖY|·³L_»]//Åú¥R³ã¡¯~•tè€zÃZL³tØ ªÄÕŽSäðGá¨L«á +Î6—Ynâd8p2ô`¯=G…þ t6žËZÛ§f1L„Â¥Y„…ð,ŸqßØÍžkmÜ/vY˜S?USÒ–>P¤[M¯¨7»ÁC§W½Öýêš[=W^=÷…‡j åI]>ÁŒÊGÌbrëî¢F íì±ÛuPä³Ø0Ÿ†2 |'’’f”d´ÆÐT)Î*IA²¢ØCº¤Duá ½ºè[IÖ>…]î@o·ïoQU ž¶Ïc‡â±C8ö#Þ §3Ÿ«š;Y·wnËY†gã¶ÅFÐåâ×â˜j§§C#U¤FµŽ•dEy0néPjø.³;ƒÅ~ó) +ÁØ€6 sq)U…ýcHq4OÃ)Sk²a«Š#ˆÒ‰œ,uô¢ÖGqFÞöoŽD5h + æ%‘Œõà囆—ï1Õ¶;!} 3’ù¾¹¡±~°x¹É0:Úß(*[ž*š$ö÷þy}¢|ÑåËŽùffð“ž›MÎcf¬3,ÑÀᇳG÷{z™œAHDÈ0³ïæ¶däÍFFî¸íÕ$$Z™í"¶¾]1K~`«Ìòö—Tô<»³¸¿ìÉ &%âJ©|.4ál"ÀhèBøε€f{Á)$p|Ìò—HS™ƒ†8p&ËâEûOÊ‘P™àºöÑ£<,†™%Ý/‚´ÝéWn‹­TÁºËãÂëJMÝ=Ä^í[òèò²Ì‹ÈEW«òmÛ!hÈH¤¸@Ì:¾Á@Ô<ò•¼ìJvÓ?ÀÆ<‰›ô ×ýŒž5"Vë&ˆú¢ý®,O…¥m…UÁ;«¢»tî²ùJq¼¹G‹½cqß»–ã™Ô]ØàÏláeëg”´ñí ë¿-1f-=å=Πi/–¤Í)P·)ÜdMF4d×k)U…™k(” Åä2µf<#Xâ(^Æâf[&y¸kF·žÂ¦ÍcøL7 {®Ù‚~)÷é-êdô½’ÑÏ¢Úä¸YTIJÉù¶x“Âm™aæ¥jíÓùYáá/® c¡éTRÅXöø˜ŸH-’Ÿx\éø^ƒL8uC‰ñ)G¯‘¹<”yÓ·À^•@4A¾÷q‡Ö¼@ÆÈQC„ùη-¥ò™ÎÐÀ“×=#ÙF|9bþ—„f?ÏH€»$2op@ª4OOÛKâ†mÍ9%¬ùk2¶Xs9C65õ¨®©`Ò¦;'½Ÿ›B ¬O PöØ Ÿ^iÎ6»MFy%üeïPÖ^²_Á*Û!I^®É3Ë“xhZ´|®¹··ËPÜFï{ËÚ!¤ +šX§r¨%ég¡ÓžHB8[Éœ&3œfÔ:»VÀLY¸'êã)Ñ©µXRXrg>Û[©7%…3k$Hé ©ŒtDTÙάõÖc@׊ <>ñÙVO²¢µ ÃVFäcJl­õ 1ùj»1kóo¿¹kïð‡¤†ã|²[cr›³™y;§fãs™£;ºÎã­£z÷2lýØí•Z;¹Û[¹5‚ßy»_ÛÈsmØÚÎÛ²²u­o—§­é½-s[¿|[*G“ýnÝóÛr½õô·ƒÜî¢`Ý€v,ÂغvÃÝη Öt‡N¬›ï¼xÞ»w¸ÆºõoH-|Ø€"·aȆ3Ù™‰L™Ðc¹Ÿ6̇mø™Ám ›ÛøoÃìlqäDùÌÈsƒmëgw€¢÷n0¤-lþ.kA1má÷Ä=m‘û†–ºK6¨Õ–Gl(­-Ù@^·9͆Ûr£ ^¶åWûˆ»‘6¤ëVƒÚ@²[kÃØÞVÁ6ˆîVMÛÀ½[En ßUö6ŒñZÜÀɳ ¸AšïÊ‘ z37õVÀëÛ"êŠÖÞj±Þ½•q7Pø]5xC”ÏRò +AߊЀý©„½¡Þ·ø˜ßŠèÞþ¶¿Áõ·’þ†ôŸÝ€pÛLØ?¾6%6fÂÖØ؈ · ’±õWvnÅÚšÙ9w-žJ¬‹ÔŸåÉ{[K«H¿šè˜_ôÒ-Ý&¢*=bˆ¹I¯ÓMת’S6[è )Z_»_¾| ô‚HN¯yk 5zt#ìzÈîq9Ôùa·†½§Òåõ,ÊHyo Bòh•e–ÌÚZô‡”ÜQÆ‚ {ÆçÖ¡¬ÝƒõŽ'¢:kŸS‘Í9$N£ žËÞ/m*¬ÁAĪ/=Z­¶Å¸Ë=:ZT¢ž´û§ÖþîþÍkxûk«ùËÛÛ°¶¬÷Û¹¶¾…_‹÷Íק¹¶Û÷9q׶ߦÖÚýßfçl“ûn°½¤°¿V+¾áã*®ÛYjOÄ«]xq0ó‘‹o% 6P{õdt…#ÅÎMÙ‚·óP‘ýã&@´lÃ’ 0èÕ•}# +h²®]Fèw£^u¢ACø¸;O—“„.—a¸V0*tŒŸæêc0ªwv1¸ëbût2{­$3óÍõ®#|Ž®¿{;Ïv`Åc‰VD{yçÖ?žÓ¯2ÀÆøQ#¯5ó¯I áÑ„ú"Û¨¬º8±q «K›¸©W‘í듨›¶Iò÷ÓU¨9¹ÃÛ̸ûÞmÄrý_ÎâÑË( ŽË«ó8ÐÂà +¤Ýd·É Q¤ÐÎyx»_£Ýr0$ךµD©%ªwsžõ^î×ò±gòåë3ŒùåÅ¢)’„¥ÀvO‚cËäÀ•#áÅj Í¡o`´GŠLŸ¨f—w&*¬ûD>Û3HÒ×QrsÁª3v\C¶—>}“Ì=³ø +ÛÙ?½¼Ÿû¬¯öþKî–ˆýŽlçÙîêº\=?‡õ-[çÊ`%—k9˜€Å‰c±ªúà…žn^* í|âö]z|j™VïYçÛ¸º/o_}Ö8ˆYûLÿà†xÛ+!Ö„îïÙüÔz‹®ïyçÞÍ—€bHÉ&ê(åu“‰}T9Ð=ÛuPEƒF¢ˆkªVÐ$=O98 %‘veT8³+ûiS¬šÍ„ó¨®>/…œ Óx>Œ<0 Eʲ1î&c¦ÑÄfJ;…Ä>ÜR0Sv á8ñ¨Ž²2âÆ(‹hqƒÄ5%)ãÇ°Ew™0¬=Õ+6*0+Q´]OEŠÜ"Å>wñý‡£ö’¹D{Q¨“’&k{$‘•2Ò©ŒêÃÀz¡ºR³§õþÁ1ò‡ .¯ö;•ZmØb¤JkˆÇîJÊ8{bø™u*çh¥cÛ ×$H¯þôžn€*„,ƒWpöPêì%Ž„1o\È¢¹]ºUµ`· ÉÍ|–‘ 2™ÚGIÝNäz‰ÄöóàÔ¦[²^ÂÐhºÿ½ze¶ÜÄîî•=Y_X +-aüínʬåRÖ»§Â¨"tž ,ÕÞ—¦_ç—Ðlû¢-ÉlºŸW|ò°|AÓ\çgéCàªØ‹äeâÀo$­R²·ûïÞ”Ò†I2š,§Â§å+T]©Ré $wë[{ýÔ»w^ŠöÊÓ•â,k’A9íòËcÙ)¢žRÐB½8Úâ½Om_¼¢ï›eãz 7Ðjª1 y‘ýçrK$ÿ¶ß20H µÖ§ìwþ.oÙž{oƯ%&Zoû@òˆ<«E ÒÝT2e¥‡ïÑxÛæϵäÍB»Š„L§Oõ×I|Åb§b‰SØú2`Ò…€‘Ÿwy—ä!Þe{ àUŸ–©?½Åxd+,°%ŽõÞÏëï>î.A{ñ²Zœ½‰£Ñ€›¨Äu©z|hYå_³.’··-¶ëoÛìy[æ2ÿ|÷Ía}û³>Æ}£º›û†·Î¦}Ó\gä¾ùÞ&äÛ&¾¾[°¾bû¾{U÷°d}ÓßhÞ‹ƒXZ¤Àr åÉOÿþ'÷rC=ýÙ~  E/Œœ©o³%ú‡×?~ŽöC·œ¶f$ÒÔÁ×4¶ +R£tM'•›õŽ:ëÿR7/7úN÷f¿Ñ¿_Ù¦Ho!Ã|°ïª|Ê$ #1m“TþBhJŠ<“¡ÀÃÔH¸#tïQÓcçêT…m®Û"­¼z…›À%Xq̼APk;*RÅÕ‚SpØ +¸AûbÔÿóщ ¯ÀŽ‚bÁ1û +v(G²ÊJ“ YATæPbÄØZ;7B~øÄ/µƒÉÂÑDëUQ[6zgÄ/ÆU!ÇúÞÈêøu¤ÒàkìãòYÀèô¡dÈ_[×À„ °'ypªÙH³i+ÐOÁÿ½¢hkÚ‡¶aÄiÍW$9Æb ¬Ùe`„yÈ8© Æ‚÷öEÀ«²Ø:ðéŸö÷58ÚŒÀÿãü}ÿEòj›#ÿè«ÝMí¤¨ö±E°›ùÙê¥ì^‚ÀDöOnú ÑK|_Cõ“™ãͶàwÚ³(¸¶²½Ê¶odWX„Gø¥hs4-¨KL*J„@òmhQ^ *7 “m*+ÎNˆ endstream endobj 79 0 obj <>stream +£ÒDWËžÖz$«t¹fÀëà‰Ž·JR–'ÇE²<É<¨ðx»4þÉðjPŸ±áå  +E%G@‡6I¦½ã šÎGÜ-IZå—‡Ø  ž¼²íµ½A‡j5yʘ*¹ G?{g*ª—š³âfúÚyz(‹’HEgÑ’iÑ–¨·ôò0x9‚eÔ¶¢FrÌYË°ÛCv’e +{óñß[<&û¥ÜàXaB½ó;Ž‘mÙ·íqÀTÈ€ÿL°Ä¶Ûg{°%›‡ðÓ-¿Þ|Ú3”±êiw6½¸7AÞ97¿ËB+a÷n7±¼3`"p(¶gÉÁk›Ž(¨Â°h…õœÈÄ(à¥'€OËsÙøæC]m»Ãð&±¬õ‹-•€@*Ѽ°þ€0žÍ‚ð6ùzÛPJ‚†ñÒÅÔ/÷’ô$«/hy.eyK®+ÒsÄBÛó$©±—[-€ÓKÓ¯Ï?M&9»™OÁÑ ñW k›– 2iK“‚ŽÞ§öA?ŠŸ 0ß•û6¢ýܲw¢'Âúõ Ûϳ¾¤ûµ¬ïúýoZWŠýÞ¬«Ív{×µêö)mkÞö°·us›/Ûú{7ïöu|¿7;Àò¬ûÆl¸üA¶"?À$äÉ… b’ŽVq¶ç'ÎÞ¸61ºGß dÎsצ”ºéi£¿N¥ÂÂ^ x¾ÓÓf”Zû™éÛî§Mè«a¬‰¹êiÛç´dÇnÒe¾ÑÓ&‡ QM!#ÇMO…{ù'­ò®§­KÆž„ö÷zÚvin˜œ$¨Ýw=íˆu¤UF;"ÌÞÚ½z6?ßs&'õ–E?Ûâ‡à®²Ù8Ï9Ùt,á^>;Ê#3µÐ’Œl—ϦþDß^”–Ó.Ÿm¡ö™i=©fG»åH€¦…¸ZU³9¯ÅÀç%$ÞE±- ´ g°è÷²ÙÜ=Rf;òÝi—Íæ›ü<@ÓîšÑ Ñ"Ëâ^ÞÉgÇ2¬¬©íêÙ±WjŒ[i¾QÏþø«÷ƒ2¼Ë ÿÀ|Ïe´‘à·Æ¡¢eïÕÎ ñçrØKCE¦ ñ爖:%0[ö>i€Hí> òŽ§ã¥¢ ñ„$KÉHÏ.ÿV‘¸ÈÖ|S¦ŒÄ?ìÛl=ÅSØî©m„'ö0µ1S ¬J…¤¢)€‚÷Nq¨hÛ"”dûYÕûmpPQZõÞæÜ%£mS,#ðéùãšØšTØë>t´mòÿ¿‘èýHBÚÿõv`ÆøþG¢Eýá´ýu7¦g%Z-wp>¬Ä^ÄÔ¡¥ÝrG̘ðê´#7DsNÐx}·Üî¢mÍ¥ñ‡Õr–•ð¥"5[û“åŽH1؆‚É+ñÆs‡ —emÆ2øl÷ž;Q.ÓœjÈYwÏwïßôÜa õwÒ½óÜ¡Vê¥5ê**Ó.ž;‘§à-OŽ×jºâ xñ ­ B¾3݉âä‚ä²-×ÑÍt' +7yŒ5•¢òbºpÊoŠ¥dŽ w¦;ò‹Q=‘Ÿ +!p5Ý«*PUµí<Ôº»åÀ ã bøÒeÝrgº£Y*‡›‰¾îÎÓÅ?år‹ÁËpÝáùfv»Â%ßîO®aBv³àr¢p¯;©ìÙ4,\…¼õØ!2Ò·ÚC;E3[,v ÙaÇÞt]îâ°c—¥¶+–—Õ[‡îÇqã°C—a­•,Zåî°Ã{˜U:¶ý+‡¶9ìðë lÎ:Tž±¥ò £hwÖùèë1 .Þ§·¥8¬E·­øæl¨ T…äGp¶ ÷’B»ÝKÌúÒ!+pZR£ó¸3{á2Xž-MÎiïĈhs¨›©ÈÝwb0’n¼÷lû±¥½£`5Á|׬\:1ÖY”¤ŽÏP{éÄhÖ¯ìù oY1œ_íÑB[ö> d… bQ§=‰û>L˜1l>™tíÃ8-6Úx /}\¬e+‹›gÌá¾#ˆ¾É~’ÍÒ‡Ñô‡ˆSp}<ÃއዔTXºuÇö>Œ³£¹/¶L¢Y5û0¤‚r/°Ï~õax½ýå„xïû0lL=ÊÐû€Þµ÷aàï ùa¯ta`ëÃ|üÕø£û0?¬ýCº0Þ48FÓ Þ6 ì^KV“à‘æ¾ óòIæÁÛ'ö #ll,ÜlZÿQ_ƶÕ$Š‡s\Hæüi7ý—?ÑOû4_þûhøÿIz/ï¸ÙÈûèdåÏ{75I¨rZ¶eW¾ŒÂÎad±/ï—h¦"1rk[ê‘ÑzQØd '|ž*œÄq¨"Y‡›e»t;Ù‰sìÿÛ¹ŽW›íSS#”àÑ× `Ž3\ª¢¬Y‡>aÓ4åE‹”Óyôo¡4S¿”€@»aÖ†û0±QˆÃ¾DTçëY'•M;?™×p§<д%íê¡ÂªøŽÒEÒóïIºU¡]¥#RY¼ô^Y¯-ü+n8.X +V¶×Rƒƒëù¢*«­„Ê°¤ \^[Z´“z-‹¤ýp³áù[@¼d–‹gÅ[’€]¨j`C&×ÆK¢‚Éꇛ ´z펞0üîÔxôèbìÔéRòuWúÜ•¾?Ìldþ.¢éC'˜P–˜³wè’—º0ûž<—†ú°Ç¤ÅcÒÔ屢· u*³YzÖf «©•ô?¨ØEÁ½^–¹z!’ÄÂçqê2Cx°‚¾³­;SÉYaNA]ÀMÙî„ ©ÂI>‘‚ƒ‰=u¤©©Ò·²óÚä½j®m ¢€,qð'½j~œæ¥E=>´¬Y9to™ë!‹½xÖÐÞzb ã]j¬™WuþY…} íÐô¢å­ PZ²ˆ>ÌT‡tÌ;5¥Âç¿ŸuÅçߦ¹R僛k’)[Î¥ñÝá;<¼g±sn?aNãÃÀ‡S­e m:×Tq9‰glû +ÚOBìÒ• wˆGmG:}È·“‰no‘W‘¨Ó|g†ù$ŠÂÓ¾8Ù¨Ì.µ‡Œ•aÚòÄŽI‰*ñÕɆ'D‚n;Bsc¬!c¯+§FϕòÂ÷0Š’^ÉÆñ¢–¯É#q0|!\û,ýJ\™á:›‹òGºÃZKýÊü¢ä¯ý–ˆ“~ÅaQúÔÿg‘U>gÏïàÕœŽ$Dt‡àÐTpž}Øp‹µOÕ=¬mF){LBt±C3µ&͉Ëû€ V¤9–ÖÅðKà›ËÁžiÁªœd‡Á· çd»]ê^¼¸1ð U5Ö „Šrógš=ðZ²u>;C0çêcÎÙ½~ø×ð•"”ÛWV_§EnÅöxŽ@Oöٶ·5s¶µò0»ÈÖÅ(ýyM{ Åýt%¹Z{Ÿ=5ÔÑkÔ#}·iÄArˆ¼ É!¡Å4îP£«ÁakÝùjdC0›òwŒiÀ$fâ̈i"[6”ñ‘.Qö}6#Ñ+®4ȶ*Rüá`¢³éïpµ¤:çŽ'¬±Ò§±hÔò¦òä’¢¤ú€Ÿo+ö-ÃWeK•§KÐÊ øt{ño jhÁôæS(ϸžIs=›J—KÌvàÙ[f;è—­ŽNua‰\DNrÿ·j¯Ãª½žÃî†ÞŽ—‘ S3ÇÛË +jf`“£ŸýóË5­¯_b1ιØ|…? Õäè€(¾Þ¯ñÖUK.ZzøÝêèHOVÉa=ünD¡D *¤ç'‰ÚÎ…`…ºùôŸèUK.yLTlP° âeŠÙÉZâdÄW‰É¨3˜hL?1²3,óÞ®—•j nÐQòõR!:f‹al Ä{~aq‚›o­vÍóz»©¾A&y^ +zò<× ` è“c°»ñp®à”0×óu}âªxrRBn×Z†k3]€¹è)J¢ ùlõÅÛÃê:}Á,&Jû0¶äúâ4ƾ®:Ât%³Ûx>–øvh»yu:ó{tÙ¢Ñëö»;µ}É‹ÇZù€–çܽšô–Îk—SpÚ_vÄSU×æf”Ü †ÆüØna§R¶µ‘nö‹k YšŠÓ®±t¹Æ(¢YØn›_ëÖ‹^š¯l»ÈÚX/U¶±JÞ{Œu‚›Kïnã1Öé{÷Ž±¨orusõŸws‡¸SÅ››É”Ò››Íª½·oUw~sÛÇ>¸iÎ=óVzpn°›rá¶%oê‡ûÖþ$ž¸›äâJlª[ r«þ¸Å1›ŠäMÊ+pºÓªÜ­Mór‹Ô6ÝÌ-лÕßÜâÄ›ó,!æ¦z3âFQôfÔ¢L:â›K}«ŒºEá›ÀêÀ¯Ò¬û€;…×}Ôª;óMdvËRnÅj·$g½ÝÒ£M8wäTwª»3ýÚ4{gž¶©ü.¹Ý­ÅÆ–N©á-›¼µØØ’Ñ)t<’ÖMyä··rÊ3¾4˜=SÞE›GZ}¯ù=ÖÅý4Û:ëd][#Ût_+·/ÍÚ–ÙÞ¼µ¡³¿¼k?èþÝ_ºI×ʱvŸöµfé]Ý/Ykçk[ú¶¦Ù¶jn=·»%wëØm öÖìÛÖúÙ"¼ß*ÖÆâ¶ãÌNäØ¡ö¶åݾ¶w=×mqï—®;êÖm}Þ†¯ÖìºgoÍÜm»ßzÁ·ÁÂÖJÞB­ =ƒ“­w}Òlï-"Úšæ#„Zí·a×֦߂¶­Ã?£¼ pkg±¡ +®sÅ"ÜÚYlP†=Ð]Q[Œ¼(î"ì ±…çxcñWìÇ}ª°BGö”c€Mö$e¸ÍqæÁ5CZq/{’µÂft³'}+\燌¸Ë;÷QkþºÀŒöx)ݧÒ+Æi?Ï +ÚÓú fu[XQZWQaÅuíõˆv_×XQe{}d¤í%–×ö\ ¸­¬³¡æöÒÐÀÚÝ”6„ÞVZ¡}[!kGÞÕÁ6€áZNÛ‰³þ¶áïŠvrVú6üäV\Ñ—·•Åº¹Õ%7ÐçVÒÜ0£wÑ p:«¨™º•[7<ëSvÁnuÝ ?»•„7øímAyCïnõè ø;+Ø\ø¶î½|­šO|òVgßPÍ·eú ½Uùw`õÚ ØÚwý²”©$³¾K¥téSèÇócóoº+=ØZJ¼ïDéÍÂóÆÁ©ß8YDuÅ%°u1ï™H‹ °ÿ´õoÛ:ð楰’Pÿ>ÓÞR Ùçlמ²6”ˆ£7vש>›ÀûK²v?Άà²Wc +*Õ"ЪwxÇC~Ší1{¶¤¾ÜSÀD ö`ÓóªÏcˆÚ‰‚¤6îUç)‰$Ö}dù” oçÉAfŒ´ÈßiWÀÚé#\j‘>OÑýËøþ~«€ÿþCîŒö²g»©«)Á»ÏäñEÎy·Fƒ‹OÄ^r‡‰íï·þïÚÝ×)õZñ7ß»¸ñrØG­žìs)j~\}÷•Ø¯ñΟ‚ˆ·u‰ˆúwç·p¿„wnü—/ÏøU9_)0v½¶Õ¥¤ã‘}3í$±Â;¶L”Öo\+HsÛyc2QÝ‚àEgë¼zJÌÓo.1ó¢îMfÆOY^?~]EÖ;µÎóuN´®‡××lËéíUnËòökÇŠ~Ýžux¹©Û6²=“m+Ú붥ÝÎŽmkÜæض½n³sîη“{ÛÜ·—d ¶mû±·/ì°lïý»±Î±¼ü·6ˆhz±P î”ÿƒˆ?Ì âO/ÔÍ´o uÛnÑE[Âjn%«_¡–ê:¦N-MðVÎìY$’]•ÝÈG~G±;HBŒ¢½µß(v¥saW{–Lýûè‘Ë«V´$9‹V To„ºÕÁ©uJSzÐ댒¦ÀÓ7ºÖ|FU+[aš÷p^Õ±Iv$à¥×þFž{5Ÿä¹I°¤–eK7íµ»§qÛSk•Û. »@VMÑ`¾ýiìuIÎ6{@?AÛ°MŠxÞÜ4ʺÉ7ÃLcÿåžS•R¦G½Ü<1©˜e-Â7;£_Ìtȶæ§wô¹€#º5v›j7úÜêžÜ†!"6§-b`è +8^M)o>´hï_¼êï?àN'y¿«Þòv/WÉæýIÜI?ïOtQÞ§Â*B½Ï¨;1ë}b®¢Øûä^…µ÷wãN {{ÅöÓ¬/é~)ë»~ÿ“ƱݑmmYoê¶2Ý>›¹°mv[·Ù±­­·³l[£·Ùº¯îëŒos˜5­?¡,÷îþRÀí¡J\‚´µï½‘\|ÙFYl±È7RKP§«°t׃Í NrÇQ­žÁœ&IÍœE'`ÍØûK@‡NSƶmìmw—$…Íœ#à˜fr«KR…œoÌ‘*XáîæHõô_žÔÃÆosIŽMÊz¿½—7.I¥y#/eëw.I…)BçˆòDyÏ%©Ìo*èOÖ—$¢c¶ {º yÄÝ%©‚¬¨RÇÈ×7m.IÄá–LÜšµr³IBâÌ&±}ÈŒtc“„67Ø Tm9˜Ž›Q0H*ÂÉJZ +»cIåË(¿ÜX'¢§llw_}i}ÓæÄyŠ- œùÝÝ;IÀz)vs‡ËwÒúö|ö“ÿ2ï$©%ÇÃÕ’ì>«üë$×ì Úû»ÑÏö™{§Ÿ'B 6Â;ÎI\Þá`,K«U@þã¾ïû4  ”}Où9¼g$á>øÐtã õC p[ØáßÚrtoô£ý@ !HlkµÄü‡¨÷ýô“ä»–å3?ûw–;}ûë·Ÿ~úéÏ¿üò?ýæWß}ÿc}‰ÿaÚÛïM¦ÿ‘uþþë‹m Ç)1u[¶±J¢È9bo}Ç´¬ BRàa«E´EæÀc•Bsé‚þv0¬)ŽrM褞A·ã@11Q»g¡D±õÈ—/ “õÑ•8Ø¢åËîJYß Ï¾™ÞFˆ—ÎrÆÚxÚuw·fˆŽ J+8 ; d1;KpXzD'é J„Z61Ù´0+YX¤Š¸í¦ýø÷:…¼ €³mí¬¸ Z‹k ÑÛGïâ”Þ.Áµs1F±Ëì2®¨p‚ì!~˜î7ªŸSômÐ>V %»r?M(6v@ëŸÍÄ›w+ˆ}䱘ÛDÂ"-6 lrM”2Ðì`Ø’.ÊV°#9äËÎÃ¥4 È ú[Ò³YÛˆ:îŽå“HÎ`òPã àª"]ù¸í^Ñ­0TÛk£ì¡à¡$Z)G¿™ ¢7N€BùöÄ…0MÛtpáçÏæÔ$’ªLøçO`R["œéFMLa´¥(>kf‚Ö&³ÝqþdY:ùux’(x!ÍÒ‚1dñLeÂÂþªk“ ž#¥4*8g…pHe;¶–í]º ;N¨Ù鑆"TàÒ‘PÃ=}0PµQ)k9U0ê!Ùa·y~=@j¶³亂à“ÖíÎÿ¿ì½ë®/ÙuÝ÷ýûKË@׺VÕG±áÄJ:Ž Š… ”V[bà&Š¢ ·÷ü¹Ví½×\›ç¸Ó´hG”xéÚõ¯ªu›÷9ÆU'ÄP-Ë€n¤DùÅEy/IkÓ ·Fb‹¯¼&jQèH§^*‹V` Å }êˆ.Êë©ÿšj_ÓvJm¦ˆ°šLæܾ¤kOžXP” QGüùãñšßC¢vªí´_f0€òb‹òÉœ.úD +!N+רä¶ÿ,˜ÇÌ0-ÌžYeU0^¬•EHP +mmä$›í¡°à»áRíÃåG ¸¶êd5TþµÙ/+Û$B¾»ò_÷ùRg]ÎT#÷îž$šA^”G«jÏ6C·§3åb£ƒ-8Zî×ß–Ëmx“7~EïÎÿ‚%ž(43¹G|Pã“a7Ú~”lLx³ÿÓƒnÑýàÙv©tæ£/¡àÓׯŠ^3!?‘ä·ÁçÄ^ï€mß(3ÚÇÍc¶i5?|ëL!Ýx¾ü*[xƒÿÀ`Ãæ‘€ä½î{ºI–2˜sÈV˜ÛÏd qb€¯ˆc¦Qˆ‘U$mãûÄ90Ýl Å&Þ‹­=å¢ÅŽ`¥¹S«®+|Ú'£¯æt mÕiå8˜” KPwA)m lÂÍ–Õ$T;ç09J‰Rª\ {B¨•¢­dÓNå!ìWrªÏs;çuÑši/4@Q8Ï™®“¦(¤i¹k(^ò0vT; 3-8Øç RœXmñ1qO —6>Tívl® +懽à¨'É2èh$ÕÌGë½E›ûÁÙ†"Û–¦V—ûìÎ rÌ<Òý'ìb«vìÛ›(Î(~ŽÐÁ‰vÕ÷µã]Ô2fÎb# žÙè&,µBœv::ý“&ûVòãÂúMàá¶î/0Ñ•Uªs*}Á&qcKØNÌH%G@{V,ՓĬ-[×X±;n`°¯<[ˆ«²®‰(;ývý5HSj&8_:xöþäªßlÕÁOæŒá¸+†ɦïTÉ/þt;Û6ÿ¦‹³$ÍkL8ñ6{Nœk Úòhð³w—O¤/áâ†ÿ®½eêZ¦&,Šs÷”Ë—ÌLGógYØÓt”M´‰|‰¢x…϶ýàÌ8FisÑ:ó÷i™¼€;êRžÍ_m,…PsŸ;«vyX!ÑÙXžµ·s)±GGÔMÛ >€mB›]”SõU¡w@2‡ô¬›;TK@#ÍéÌBC¸ËŽ«4«¸Ã„¸F}*‹›¨r6r?5:'g§ûJL¶©mëñ?Ýö¾v4fTY5ÆÑ®abË*w ì ôºÜŠŠZQßr“H½ªUßî õ‰†Q§Ù¸Ðd~ +Gñ…²…@LòÕ.Õ¶öc³Nî8@Üô­d9Š¶= 'X•fh7Ž&=âe¢\ÑšBó¢)KˆPì®Fæ8¡D{‘{3@Á´³zëM7 œ”l™é:Ð…nu›>gÎNKEËd¥Í¦FY™¨PèAÊÙÛ쉇$VÍ1ê­9õûyô€"¢m‡ 2ÍšC/°·áZ™M™ñ:«J½¯¬:n[Qúò É€xF£:‡~5Ó9¸îE&•íKŠ™Ý}®íI쉡€|Ï ªª>^ ¿"MŸÕ)Pqf›á™éJ6Ñ»p»l°äìÒ²cò“;Ú=C…+Ÿ‰¶Svw Á ++YÐéý:D¤ÛGvý°Ømæ4eY1Št‰rËôH>M…r³QŸÆÁÆ[¥„U:Pd£vùWS¿„ÙÏè²9?Ô{Ñœ‡ÞD·e_š¤`ÿã)vÇåa¬ŒP¹ËP|Ô`—QÑ Ö»ØKV¥{ÈhZi¿Ô¾C#t ¤»²b·.ïerU¼Ì«û°éé×2+w J\B°7Ù¢ÐØ d½ª¥2ŠmdsPµeµg;Éx@?°a†kÕØ~ÚÑÍ& ³Gƺ9fD m6r]ÌDöz3ŠàÙù6'Û¬D˜žfõø#„RÐebjK ¥IÜÔ¨u)st#_n¬à°9…y¶âªÚgˆº,Ó¬žÍ#w÷ql/ÉH3‹¦Ž•ì:5­4¼joa4_§?ÿÕB!óÏ—™«7GR п¯¤‡ˆWšu*>Ïò¡ªÅ£)•}EP€oº‰¡9¯8¢Ø¦[†¨,Äó¹(Š–+P †£GDª—â_«×E©fšß <ìj354žpÇU½{z¶cô~Ä»ÖaÂ{&M)ó `!fVþZ‚Â2#ÍtɵÎõMnË›{áÉŠ,(©«!ÊA+ŸîØ )ÞµN ”¼ä¯ìSp‘Kœ^Xˆ•´iÄŠÙ.Óš< ËM4„&»ÖoöÍ¿Y´¶çM×önw5 +Rô|*EÒfs6PuVïfWó²Ó-üùÜŸ ½èhz‘)âÍÙbõ2!®F³A»ÖÓi¶Ã˜Rs„»Úžñ À‹‚3ÔéH²‚t‘?Gyœ´7ÎQ‘‰¼±½ØjÕá.ó¶({ŠâO!£¬‰ÓVÎ(B›ãˆÚaIÕºÅD†d £7vr¼ÑU­JÚ%¥©]”Ij‚7KŠ²­ÑxÙŠŒ÷D¹®šˆ%¹è‹¼2½”A›ñfˆùéõ³[­hßàœn«Rm€8ؤÙ¦I±EÅÜ`O3ǘ=®6ä~oØj¶÷.›ðCÝo«™`öžBŸL8p«©Á7’ø£û“¥Qࡹ “Lg4}}²“í*J4Ÿˆ"yùsìÞúâ9Y„à(%Zq ÇQ æ£-AV‡t8;(²·µ(I¬µÄÈYUá‰/–i›ÎºÍ:ЀѺ%6¡ÖE¡ãí¬Æ±ï¸ÓŠ&ßØüÑÈn4«;äÙE¬7ë¿ÕW;ÇÖŠF?§”ÌEϸ9 ÑqðQŸ>jú7^ìïç1ÕïB‚T 7Тÿƒ µ!ú‰¨[7ªTÃ…tÁ5NX#ú€ Ô‰içý·xÇÎŒw­þ$QZªkHKqŸ‰ï wòì¦GËpEñŽH%C±ºÅìÅ?¼=ñço« £o†ŽÈëB,€¢Ö˜ öÉ>ÜÆøjT²}õAUïæ9@H䆢ÔÝ Òà@ìSi‹Ø6Jb¾ê¨6h§ÒÚ!ÚB@]GÂp@:B˜¦¢Î¦•„ê›m¸‡¹Q‚É„¸1ljÖÈ“"÷²%º “ö,¦‡†3@ú „¿H0xèx‰œ5êÈí@¢Kmæ>ˆÀ5ˆâ%Åj'n#y<ÇÖ˜4™=í¿F‘+²àûBÖ>¨Ø†ï>C‘$×NÓµ$׎SGb‰b6Òû¶+MÀÚkÙGC}ú<ò1¦Jr_+%ô=\ËŽ­Ô¸ƒÒA!DEÁ&š[ió„î ÈC/X‚Áí ù—n&ù¸‰'£ˆy0HY‘¹× 49 -ÓDìö+„°QŠ ÛÀ*ˆ`‹Qp7‰Îî&ÑÕöÁtr‚æìÙ“ÔÏ‚ò¤û<]Kà·•ÎG½«Ûû<@0Ú¦H(ú80jO&‡rtxh¡Y7$!ÈÅÉ«ï””¶Keħx=nª”Éé¦RL 0÷ÐFló/L>úköFYG[éž7 ñ¡ëtck“Ò]IþÙ§XÁ_£çºœ£®ô@Ïié’[Ö +ùël‘,ð|š<²É¡¹ÿ°Ÿvä© äðõˆS4JiŸéeÀWøcÆÆ…%v› +ûn³>0ò0ð +8ñf´Þ¤v(à¬dHHÁœxcìïN¾î‰%—õr“Äž“³ñæÀ u˜Ë26››I#éî!îHÖaQp‚g ¢Š¦¬âÎàTL»™¾}„†‰Êþõ&m7{“*Ú¡Rt;дúbqÐɶ8”/9†:øT ž£bÀáa\b«—¶z:Øo0£"wŠP.¶w+Ì•Â J·ØD§IP0ý•7º*ˆÏQf3ÌÔH ñ[®Ó;½Óž4·Ä1]·È^¾ÛNÉ}¸?iv§kê0µf¢›UÇ (€Uð4®ÀÏn{ÁV(®2e‹Hz Ü,²“u·0¬Ùƒj‚46˺éˆ4`u‡—±…[áWLñ&×_Ⱥï«ZÞØ—Jì¾›Ráíé©„¬(å°c¿­ðªfa£³Q´Í9Xç -ÓsŽßË2„Z@P®—)HÌ<.íÂQ°ééø©4Ú8.U6ÌǮҫRÙaÛÖfà £ôä½o„f…ø‚t68û^lV¢h?‚ÿ°e•Û-l«o5yé_)ß&K‘O˜ŽÛª9*À0ÈöUéØAWüႨ°Ú ¼*36½ÏÒêã¾S‚•æùl®594jÞéÑ +J•”æÎU +Z¸ª}ïÐHÓ©A™WŠ³î/^ž=vµ̳Bk¢ +¬Þ ?X32´Ú"ÜDýöbÄTl$ìî &‚l«)dv•L,çFŸ!´Õ¤b¶áýŸ½,*·ÁØ,&’9LÄ‘S´àࡲ5uM n59“6¡…3™äʮƤÜ6 >5Ë•£QZ1Jñ׉¶QåF©Û´:N'Ý&§›«5\Z,(Φ„¢mlj“E +y +pª`š# õ„ÛjÞ³+ Ã8x“J%7¡Òs8hra¼iq7ªpÍ8¦&pZ/.Kê³ qÔ>Ž1×禇’1™¶šþÈêAiæMÐ3ó؉/Á «‚£º˜ùBasôæÂß ÏçWŸ3J––Zbº€¦Gžüá» ÂÌ ¶Ì|¯Y¬ZnÕ"#U±nb6¬6pCºìÏ0ãÛ¤šý}ì-û§³œ/!/W¹`¦ÜuŠ_&…ôžXö mb³ï™Þ[’ƒÌM„úšWdæU»k>Ÿ>`MOV ¶Ii¹$7±+¥ìsµè¬ ÒÚ“+/Õ´”{sÇ™TNM\"õ0 w­£\s¾Ö76óyÚÊS[SÇ8t”žaÓ+7†´¤ ÃsB;|J¼c7¤xW˜š55§wMñ¿[•¬ëÊæN˜ÅÛý3*ÂæaÛ†úˆíîuñ­•á$†ŠNôû‘ BíI.¡†e'£B)Ì*éB5M–£g+jC%OÙ¡h +ûPCôFC„ +¤ _BSÐQ¡j«ëBUUЙ¡2+¨ÛPàµUÛ¡P,¨ÿPl¶Z¡fmkˆ„Ú·`Ð̲¹` …ª»7–T¨Ù vX¨û ¶\¨ÜÚ„¡1Ø–³„1˜¥¡2˜·ßì*)ƒ™*2ƒ¹ý[}èRÙÌöY: ýPHºõBAjð7BQkðYBmìÖ÷ ¥µ« ªsƒïØysñ®Õ+œ…ÆÁ¡\«”·~éûBçà܆Bé/¸cç_oîZÜóPû<û¥‚|uèñ)k-{ˆUÄšøMÈÃëéC¸$â‡K(è߆nBc@ÅÞ‚5Œô´&ì¢P¡³a f…æˆ MÛhZhÖQ¹Ðð"{±qd! }'!ÐzWÖehÙF:C+Mˆ˜†.œj½;»øìÚø3b»³Qh‡î¢mH94)…ÈôÚç‚Û¡]j$mW!ضfœ>ô{mÃü¡],$ BËYH8„Ƶmâ">gä=BÇ\H™„λmê%4ð…ÌMl\r>±—p—:ê¡ØnôŒÙ’‚ÒX±§kÑá[²XØ_ZX 0‹ŽUL†u¼O¬[0hdÞ¯953¿>a£ÑùMr8¤åN2$ä6ìsh¹Üf÷LB˜_a~ÔS„2:‰ðËà`Àkš±Co&ó<=ê–l¥/Pxõ°ýĤg¿œZËìjZDŸ”©Ì›ûv£ µS›3®§"oP†„æ6Y[“±‚‡ŠAÁªmö7>gÍ"ÇoY3Ña$kBû»í„¬‰ñ8¯k‚]=4a}ÖDýºÂkª?n“]É@ØmkåAØ°¡z!ìû·Åáج¥ñä­ÕŸïf +%@‡-Ô,<“‚{]q_¨‡§NJ×þ€ ƾ0©™ o'î%NÓ(£Œ´>²M]78¢ª>èðþ a_@Ív¼¨,'ïùÕuŠs»@|ÅàPÐÔ¶ìvíëÍ0NØÊcUôˆ¿’ó6…ÐpÛ|Ýz‡ïÖupá9q‚`ª£æ³ýº<óÕ¨ë7ÿ§N »¸Í…q\À0dG ÜÜe +¨Þ› –m L˜å/Ž¹£ë§ +«}ÁÏÅ Œ÷höeϛÖÿn¡ÞÝuÂõf'ÖÖ)cmñ w×ðµpGÒóe¦ñ}©¿eýH›tÛŽhd"žé‰EV¢Üf¨yŠ/>gÄø-Ÿ[ŒïÞ/^®ûƒDš¥¨~Ü êÏÖ}Ò Ç07‘s¨¯zÝk¤Y™ë“¸xû`ÏÚfCÈÁ(há.“蟪‡9ÜÁx~L\}:O•Øgå*†âcüÌÆ/‡;àHˆãŸ¿ŠS·È í¬¯§jÙvôûaûG €vͶ“¬ˆ¤ÀÂØÝqë§Ûôùù²¿^ß¼þa|ïw»Ãoêæ¾ÉÕ¼µþö¾Ù=r©0£¯ PˈܜҞN°w'1<%LjøŽ¦}"-Ø™ì–~´yòÃðú=–’€ì8ã]ŠQœ¸¡&¨›œU1^D\ôP4»àÕ™àg:®H õ4C¥”HÚ­·$=&ÉA,™ðjÇe‘On¥è‚.0¢0柟Š¦BºH çÎê´§«N«Â§–½ðLAG&ÎXU8ÅÓÌÊ—îÌý!æPoh”ïiÖ<p²;ÍÍã=¥9Œu°ô픃¸þhÑt¨®Ï[–<™íãJT/G£$C>¥ÑPg®£—3w8i1V‹ ¢PL†ßUµøÄšêpï‘Ë7Ÿî:05éJ“$L„‚f®âò´4QÞDÉÉ‘;!¬à‰»KR)¹£yQ™Íì‡7Àd%îR#³Iªòª$”Hm¤c‰~-Oa5 ëë/B„õƒ¯ p)½Žž#‚d¦[ˆ@lf +áÿ‰€4ígŸ»š +{2QÂ;.^cû_›uçNP7Û’jÐÍöib™¢ÎÎ+sva»xU³SMËĺ‘©÷éÊ?Wo<Úà!¦Ç +¨žç0ì +;pl'ô]ë1|†·;Ã*¤²¡R¤g” y] +ŸÓ6ò\#¥€¬;ê¦hÖË=>ûœð-DI.´1ݔϡœm|¤™túPÖ‰…BSÅ2$1Ã’Z<7 °soÂ2ŠävŽN‚í%n²3•°‚©G ûItÜø¨4êÇ$i$:î´¨í ìd  iþ<Èdäx pËdÒkÅA8Xʲ¶Ýn›Ø2:ßÉ~xqç<È€jɪPÑùôŒrüi÷PŸN:h} b£¤ë‚ò$âøAüPºO­ƒ½³w}Õ°ï„Øæ9‹ ŒŸ²ÊÓí@‚4Â|¹©¶ÕȲ~Q­[ *´ÝŠŠq݉Q¹.›9ªè­Ç4ü8PÁ4XbêîHGKe•_`í|ÖjB:ýssÐ+|Ù^éæ)Â8oq ñR/^…Òeß-ì Î7yö% ×I›w㩉}ø›á·^xÖ'L­DªÏð Û%G|7=WQqb´´z +YϤÒA'l¥øÅd$Ÿ‚—¯RÇ Àƒñœ[˜œpn!kV¯š@˜“ù,¸ÇÕ§É/“þ!ÞL¢—÷Õ^¢—Ð ³ó‡ÁRUÇ`³7û Ç0A€’¼ +‰Î`j`N@,õöN§bOjè¹ÑäJŠ}<¼Döë6¬`¥&‘£žŠ€À•z u-]R5…ÉuªH€ š\ÈOE…®˜¥x":m7 D4ÁúCš•Y= ãC­k—#h@Ô•TevŽªHðA[¼ÁbƒUË õ(«F¶¾©Ü ¶’E¾½&£ˆÂ¦¢ŽNÛ —*Ž4?¦GžI¿(ròì|¦G%)6nS’ÇAMÜ‘¼è‰Nþ¦Ïó8û‡§ì›¯¾º&ªÔ‘Ü >´ VªËÑgül¢¹„­ Šþ…ÎlÛy¶ïlvëË 4½ß‡-‹¨ƒÉ80›M«È38*œæ‡)ùŒÀ%Ž7<ò¶Î\Š@ÉÖöÓö„#BÞMWcQZú£eW·bìÂÍÿì»ìfú.)‰4­cùº$–’)2é×6Р©¾IÓÑàLÞ“ÆvH{%ôÿ%#'E€û¶ùNå[¯\© ²<  Š‘} 3æ'c–}`*+Eaà¤|íKp ¿Hc}´)þÀ¿|_ÿó²ôPbUÅ>j¤:3ù+aÅêIÊ­ì®BÕ–Ylô›­ä 'ù“žÔÂL@×6C©i"I-b’9jƒx¬ zG¥£ W÷KñŽ#MX×W.ê™Ì&©š\Ñ›6~zQˆÙÈ—ãK´£0O™ìÛ!ÙñqåÒ‚`ÏQ9‘6·ãmü‡Ge$Äò­f SkT¤QÇ*¸v¾QøE~ƒÇnœŸ²ZyþÕ‘˜ ‹|é·÷v^[G熗ã¥Ç}Ÿå‰³àPØ(*o~~øPÃ\Ìë “ø +yÝb}ï1?{úqn†M×*© ÛvT]nfΔÔw*!?ë €v#jH?wëˆ +Rcpí~ÝÂã-%‘}ïwEÅÔl´ŒÏS6;‘ŸÑ&a®õ¸››`œØƒëbgíbâ›çœ}蜀…µ~ {ÀÜÀN–è‹còÊW…äS{‚`ïgw¨—´Cr*ˆ´Lª™!Âd>¨sè5.¹bb@>hš>tXa*À%¨û®Éƒéï7É™ÕÆ`wP‹W7› +Mų5›éu³½Û«}&Nìó)Û¼÷}Zÿ[P=”?\“‰$²çç뱌o^÷~«”ˆ3±Jš8›«ÄÚ®J|aqƒÐ û# +߸͢ _wëF,;þC52“H¿G>'V…²ÁñJ^Ì)|€#¢o˜~h(Ä~e²ö+›òæ=¢w¤¬]„YàF¨¶O<5ßË šOÈ»J¡gï‘£>Í·]GÇö¥ä_ÿðu±Ú‡ÔûŠ€‹½b9îúƒ¨5 þJ·ÓÕúOÙ—µƒª 13Ñ;¸€XIWúÞªàÕf°ƒ#²8Íí3ášÁ@§²½‚Œ]Xöî7§ÝÕ› Ò€í6¸Ë EÓâŠKÔ¶èE€õSËBK…¸ÏÌÒ÷Ù¡±O‘‰Ð~8q®˜:Eãl“ÇØŒó½fÝôSdqˆDºªê)4^[>؇“=ZY¥9‚×ÁǪÎ*%:¬Ã¿•Æg û1sÆÚ¤ñ¢˜Í)ö;jží1öj™ZаiE:ØÁ¢…önÙqˆÄ #DÓö1øP)ï\ž‚4aà 츢5Þ +}RKîMS«l^æ|Ö§ÊR)©0OÊ©ª +"eÑ¢†ƒ{:·Ë\ûñ"oÓ¦½êÏ™)Üp°/RňñsÑa±#ø°9,_ä©ý{.Ê‹ +Ôů 3ólfh ´Mwáêv3,NÚ,(AaåL“ï){„ïèÏ6Í48ü¸÷}m¾sU‰óò» {TÉz˜Q~üðÀ­lÐœ^T'n {~ºáTejO)Þxý aÏOBØC¡¯"‰·"€e¯­È®ª;å¦Ò4§¶ºoïG¾)»ËF[™ SE·³^>PVÄÇ«‡‰t\euµˆa±d8¾¢Ö"tO> ŒL6Ó^k©Ò”5ö¤ÖºŠ0bÌH§é®o´–§´aÝ Qžù¥%;X4ã7øl­u‘4P¥ ö£nÔ–}lÕ°å®þÚâ9G’wÔÏs§¶°`M£Ù´8öDP[„aÑv +Mô·ÔÖ=Ò’÷M³ÜµQ[÷åéšIóeP[*¡¦ú†Ù(ïÕ–䔺 ·E½Em¶)¿¨®T[L µÅtlÕU…øü$År¹uEt®mùÛÎGŠêêóGçGë®×’mÇ'„´¨®/Ð\ï©Ñ>´•~1¯'¤µÞý. Ÿ’v7øáhd;ªü¯~Õצ (¼îÃNj=]¤ÆúQÃÚh«ßË°þYÕïÞ8ÿ=ë)3ýëA‹ ‚þ•ÀZIñÂë*5Eäm('þ€=ó:Q/C»Fg ‘4kÒÆ•U¹RA$V³œîèdpIКµëð½“|ŒÄ…³fg±]hpë¢K¿&Þ8ùóª ¹úŸ[õ|e•¾NæRñ X%äº_ôºFï“mxúK¬°ÿiÊ„PÀrw½ wÂÀøµrh'AH€KþâÑ%Yn„ )¼9Aa©¢<¥½jh¼Ÿjt'vSnD°S:ÉFÂTi¢R[ÝÆûäÑ>·?þ´ÙO•IûoNš +÷ZçÎEMÏ*ü¸VÜèé1ÊÃ4‹©Ó[e¡RPÙÙÕ³zòœFÔŒ|´+%]¸Âí *£PæÏOŠÓ­Ûñ½!¢GÜg‰ØÖMP»¤íÜß„§…smÏqMBÙk¬]ŸG$Ú?-û”[ì[9©ôv`Uœ¡ªRuNÓs1[0ýI¥©êêZC²>8¿¢ï ûA÷\† $Ýbê¿Ðslò!¯6Tu¶˜x-Øpº¾|v†'¡ªt£yA²7…NØÜ ÎãœéNˆä?‘X5y®R<áÌ@œ`N ½@xÎ&¶äî趫æ¸q»‰·§Ù¾T›yõ®K±t_®ÐàV=\.*øSíÔ·,Š;Š}ðÝ‚e­‰°¹§J dé¤;OL0ê†N€j;˲wÊpôiÕ;Á:V¡­; >û—†³ðî=–<—l­ã§wÇŸ8­ðº‚b8©#ñbÓ¡TVò"CòÅ3‘f}P¯ì/¸Ç"±1&Ñ‹&4›³PÓÁòÒÓ‹ñ–a=UÏ"[˜žÅ“Ÿä¦r_úð©Qò;Eßø¬Ö"!¡×2xRJk„@Ï…L€Æ%ÇÖo§¸¬ ^T…ÊfGhz~BͤlpìÌ$sÆ;Y´ +cfQÃêÚF³rRÀ7«tÊL•3 0E2DDˆ ÓÆHÔPdБºÌ€ÌПWÁ$"‘© ¬2èë©¥<½¢‡–$ã³8U>{(¾ys|À@¸l±5Ý{v¦ÔÒ-À›óàÐý¢èkZà"[=õÇ蛈{¤kïðàN9µQN`±xú@ć wJÞ¶nô<4.@j„uݘhM«…Þã»F7@聾¹Ð+&â±W7ËR<Í«™’3•É¿åè@pKÑ• Gð®Î½ÀØÔ +Qlÿ_ÚÝJd OºØÉ"[Ü~©.ìžkï À ÕêSÞ@n#¼g‹NS^ôlžÔgÈ ¶Þ@¦†;g2ˆ'ÑÈ2ó¸Ã¾ˆ û4ú»dq`Ëjã 0ªü6 \Cô²²R¬p3QKÖð2Eãš!s§µSwÞ@î+Á›SˆçÓÈôܪ)?³{ ïýÏŸ°Ÿ´šîsʳœ¤r蛧C`êŠjl³£Ë¬*Hð3_J°ã ì«ü†‚n›ApIl+߯î0馠ž‚º[Ú”6‘fß—Õ8Áû$p¿àm©™21i;·Á „’ ÆäÕÌŽÕ»‚:ZÎx\ÃèaT‘§áШ6+ïð(¯¾À ªññZQ÷ ÍÞFF„]J‡|¾W€Æ“0ñOUR÷Ï]þ?¤' Ä)Å»à°/ië ˜=ãuÏäÍU7²zU‰L*“!ˆéà °Z™&øáJo{O@嘔s Z Ž@ÍÅ{š ÷K²»G¬?ÁLÛxn9-?€Ø½é XÚàyP‰ TgÞû&?ueB²5E?à³ó;ý€*´nnT2"ïý°ÔªÄ:_š¢Jš «(¥¿¯è-¼½y÷OT™…þÖSô L‹|ª¸xÃŒRsA9:xç +0-ÚÿBé<”žNuÛjÉÑ%Ü&3«:ˆ’[G@õÄΰZÎGÀš0êÉV‡€%U3•Ø_F5Vpø­&¹S{/;Uh©èQa¢¯A¥YHE" H½ôÎ!~ }_Ô¬µCpwïκцׇŽô!º_Ýp[‡€ÈP·ZÁ6¸eæ§pË*M%Á! /,ø/ü@{‡€©".u¦ ±Dr³úŸ?ÓÙ¸°lÛD¶J“(óLô»Ð·&²Õm n ø +4ïïÙ*–—€1‹™¦™m"›CFYMÈ_«f À4ðwDK´æ¯Õê6Ÿ»¦­ÕêÇ;ˆ—×ÓÖBµa@µ9Õˆû>mí‚—ÝÞ´·M[Øu©Ä|ÉtÆ´5ßÙ ]<paM[SLxêtŽIÞ§­™ [øMjlý5mÍÚÞÂô²x%kÞš¯SÎ0÷ykäPA†€4!¡²æ­Õ®X™«NEí&oÍ m8Sb¦öykÆä… +I˜ï#oí´M¥…žÁ˜·.ø6‡8Bz¾`É[ë9žZH`3%~ .`ð7 ì­¤ûÿÀþœ)3Ø_{ +B ;kD¿—ìä_•2³‘«6åÞ&°mV¿¦s³“êE]±Áÿ«ß8s \«寿 l$šäýG¼êDBÚÙ=ðE¡òØ寚QØ*öìÿ¿0ßlZú!tŸh ñ7Q‰ÙÇîÍVV/¾ÙT°·»OÀÊPÞÔà´¢`:ÄîN†:'÷nˆÝë97g|üˆ|¿ Þë[h6´oé +­ÁûDûƒM–b¾iºO@Ñ2ÖƒgŒÜ§Ë ÓmÀ>A4Ü7qú0êØlvÎèm¡v¨§®LÐ]XÔW Ô{Ù˜LYYz +ßžêøP8êy¸”ro/Ý1P¯$^Õ¡$aU׈}Ê£€ñO삲§.J<ǽ#Î'dŸJwHîj´47†EÈTFM•Šíȧ¤š)­óp†*Aåƒk»ÁV䧰b–O¡ ú]ú3¸T¨‹ +ú7DnP"×ÉÔ;G=ïU8§@…=>o›)Õ\œþJö=Úß WŸI*-+ìlÇ’³@|’À°ˆñ§ +dôƒÇÐVÍ,qª`hl@Ÿ›¯i7ÚâÐýe4p߇KR@¨uvêð¤8uEpÍÇ᬴¢]¤/rÙ™} +•Ûy4h # aG9c‰’:=ã°œÏñ&GiUÜÂ#€çMsZ¦×Šx93¶,•ÌèX;Õ¶öÔþ˜àjOEpr®Ÿ[ G&óRWÖ=PåŒºÛ dÂaV4`2G®ó ¯Í” +»l3(³dc|¸½Iü}B·º¨³JL¡cKÉæÏw¶(}}ÍÝŽr;õ!à¢ð•q„¯ÚX"Âw”‡ß—ã~UŸðxGfÍÔ¨31·ñ‚p׈hÚ?¤ŽßÏá4û±ñŽc† 2òG²S%ï0Í} HñDJ)qÕ—P œÞ]‡`°ÕCH-C&¦Ã匵“Ôª`¼5çä‰w9Ë„«.‹Ä¬g$9A ©`³4Íä@–šãÏÇû÷vÑÜZelªS• „)ðéÂø±äÿu‡«tHYîÁ Ø„J~Øv¼$¬‘m§ 3Ž™Žõh[Òl^sÐeY§¾a‚Žã[RÃ7wC$Ü2´'› ž‡-,˜â6j +!Ò¥J‘»‹“‰MÔÔÀ’å&”Ä‚ð—zNw||3£±Úì9NV‡—`òüGõÁñ"ûjÖÆd4”¢´]RéàôWÝÁÙòxbqþèŒ/=ß$€Í Üt‹q„Ä*âŸð!þ È +4ª‹ú¸À /L)æM°ßŠÁ~3Bñb…9³ÒnAÔñh²|KT$”“‹3…ª9W#2AMòš±™EÌ,úD<μî '¸KQÓÛÝÄØï³ÙMU ¹›“El +µ›`<¨uÄpŽ fò1‰@€¬¦÷m˜ôwš=Q@ãLEÐF)é%jŒ[6ªÄOOô +ø‹~ +™žÙóöjâzö¦ r”õ ØyJ%ÌM†Vpœ%îÆ0CL²£ [I%Þ'ÈeªTŠ–¶\“>={XC’| +‚K×͆“Ò=ÝCµYϳ—^Ä•³eo¸Ý™×4Õ§ÿ ˜âdžÄ>4¨š•Páws^[É[‘„žÔÀêO¢BØú—3Ùhg2ç¶ °r‚Öt¸!0²õ½··VÓ+íC õ³Nó/¹üKèDp÷Œ:‰’ty·)‰ùƒY°¬Š›—Gäð óËêp8„¦ºÔ¢ŽglFG.¾¯áï©£øíÄa&ÐjÛt¹D³·y¼CŒÞˆiUf›ZÀЄaÏ$Ââ¾O—ÛruÄó#Á[„SÕØ ‡×À ÿ=‚ rÝÍ +¾Ù(ÄË›t‡íéBSA EO:E݇Wðˆ°Šƒ×ë,ùM¿X>õß@Ñæ]Øy>ʦèöK“ +¹ “jŽv’…6D'”3³MŒòø¦½daÕs<ŽÒ øW}hÒ>lb=gÿ>…"1þ´É.Û*åŒE\GÅ"ɳ]Ú`jœr¬±gÖ‰ÉâaLôkdä:÷ÍÏ›§E¦ióæpÇöÃÃ]aÜ”a&†™¢!Ó€OpW1˜ÝŒ‡¦ó°rØ+Ò—$Ý{Þ¬¾}$%ìDJÀ·ü`ó´ÍB²ã‘ĉE-É*YhÜ«éÁ”HŸÄíL) +8E‰(J#~ªÂ›UHz=A9t3èYkvŠÛ³« &q Š®¹¡(ìI¾IÛ:e2{¥¡a²óX”hÑUùØžÄÚ-±ë +ê‹oWÎ\6*ê÷J€oJ’s«ð*èÐ 5`‘Ô z8ÐB +Õ|"u™nõy´*Ѷqï{cäk–qQ˜#5¸ØÙÄ´m»ƒª}ÝMŠi(¤ »^`µtý¨EÔ~Š­%MKƒVhgkuñœ›ŽáLÑ]¥«õ&„u…Iþ;~í P:VEÑ^­Æ’þ–ú*H £ÑY†Óm{élÀ®»•H\R<Ðv˜Ü‚ÅüõÍVGаUaªD3:ŸEÛÆØÇ +ÿ­¾Ó܇Ä p¦{•2„iìSßGxŽ–¾w8SN +‡ðd§¯®øƒƒ x:Åë÷Eøƒµ+ctñ;ï‡*•U&•åÔó„ S&î øáwÅ?ìܶp×ôú(‘@qâ¼aî +#¸…gÃäÞû¸N[&Ò—6î«-±Œ;u… +‹/¹cãJ‡»‚K,‡BTÛÂ÷Üz!{@_F¹JRxfæ#M©`>RŸ40çú˜hþ3êÊ©zfQÇGáŒzè•  ñ.,b껞|:ba ¬Ðõ®m‡ªužAà{ªˆ¢E‚D#ºpPB\HQx¬¢ðTxoÃKVMjSª½Å†ÃT|¶êad¢z u¡8¡ÈVüHò]ÄŒü[“¨JvÚ©³]o¢fÔ5ˆ­!v‡ñăðÑÛ>X†;n2Q¡ûK$sV©·óBª(Æ#IöP}¥€å‰ÎD,ë;scáZŒ†R¾®E£$¹¦ã©úX’P%‹ n—¥d™[몘»ÞN^b £ƒTŸeßBBabFÙÆBSU)1B­¢y@Ý´ÕQn7ŠN7Šlûî£åFM/Pˆ^ÏÆŠOã +±yÔy!Ò¼‹ì—#¤clÌð|Õ„qüEéK’¬þûM8 FÓm®">fÍy0ƒ—¨–j=¤M°o¼½á:J¢8z—}Q÷I¿,½Éâ¨À”C– Õ†›L@Ù%ˆD%f”|;T–J¶ÝE±tÊp-ÂC=ݼfÐH²‚øE• [cLÅ£fŒi;fÀÎPB% °Y{‹”ž*ü),Ó 3pHp u;U â´"NAÑ8—¶¿8/™ôú¬Èºº%Âôñ&ÂÈ ŽJ@tþ° œ‹“·ÙÌÔ“’0·BÛ°B«‹JÜ£JÎWMïÍ‹ rµ©²I±F=m!só¡·H—i ÕÌà·nøŠ«êh%7œhaRÍ/kDË2q? ?«ï¥æ׶« O¤FÕUãk¶7Iú¬°m |;‡ö9Ý%L±ƒ¦ÎhlÒår‹˜»JÒ pìSD°Þc±>FùMíì0k÷†OiÆN[F£1Éõ Ao32äÈ23æõ¨Uˆ aeíà »¶îþROY–©ßjܦ¸âP«XiªPoF]n ›À² O{Ò8ÖëÆëð¦^š<^âÞ…ú‚ N$Å3@ßÿ¡†$È>‡¦XNÒÉçòu»_âa´ï7ó€æƒ3ÉQ‡švÜòÝeZ#A8÷u„yÁ)—Þ ³Òe_ôžÛAPÝ´gPÐkjí(íñZÞË;ñ‘ˆÓxžº½PiQ‚PÌIdóFÙkz®kÂØØ˲Ê^ +O itÌçU ô81ÙÉG‹PL#[+›˜23ðyÁ;Ä,R",Nî4¼y)-1jR9 3Ý·Aç™GC¬…xŠ$ ©N–¯®ê%?_EØe„\VK̹ÇDlü²ÄVkΆäg÷ﺱ +E2;­›’¶Aõr§}zYØ{³”ÖIÛ§T6•Ä®Ö-UIÞêQ©Q™æíj%ŸŽ2 löãjš«©0‘¿5™ÒgÌjá÷{GŠ©©ÁD-¤ ãÜ-AxŽ™kÑJÙš÷(½ ä«ô‘È +Ù|$õšÐlßZ“K’zÆ@ßåx Ž1s\ÍŠLÊ4Å<†š­ œN@üÔ‰C±äCØ´?1Õ¶Ñõr*ú¾ª®+¯™)½yiÎü ‚‰E¤¤_Ïø]æG›–žJ{[J¯Y# Jº“ +Ý{30´æœ0ÉË…t•0 Ô+o‡ÔüöbéÔlw›Ÿ½¦ÏÐJ¾_H½ŽdIÁ©5ìR/–Y=-fò˜ŠÖ´1a Š{Íò"ÚŸQ§úH׬"+skkÑž[6ÙIĈ7Ægªzg¢õ+Ñ=5¨DDʬyQ¨h¶†ú§ûX×;잪º6?’Bém~5 8äzŸÖ²‘!.BLè4|Ø’Ïv¿‘W~n èøøù‡í×Í?†Á­yò8Ak¾}?¿¡ù-¬ÓH5Ä%^+ö[e­<;n-^ˆ›v-‚Øoþµ˜"¢µã9¡šc{|CUÈzø×Â’ >BÊ[¡ê[‚¨ +52AÜ­•6[© +v¦Ð µ>AL‡š¡­¸_KV¥j—‚Þ™¥O[µ*§¦Ò EWA_†â­­Þ E`A‡B²`„z´·&D(g H(‰ VL(­ÛZC³2/S¡¨/d¡&pkØ­¥…Ó( E‰Ñž\‹ƒ]úÍ®H2˜·¡Æ2˜É¿Õwª.3Ù¡¢3ê¡2tgï‡Óà6„"Õèz¬5®[&ÔÊW(”Ùw*Öñîܲx×êÝ…‚áà †ºã­£ê—W‡5Ö@þŽó¼¹kqÂg9wðßgøÞý_kÈ£ûÊÏC("”±oC¡~ Ä‚úU‰õø» L¨æ±Ð0ÃB¡Ÿ`UŠ} (ÆÐÎ0¢W¡büŠMk-6f¬¸Øàñ&ŒûCÖ(`ì1Y#‰¡Ee‘\]B\3´Ê„Øhh¹yZ ;!2º~f,wö +íÀ±Óh#Çn¥5»žv1íØ3µÆÆCÛU«‡ö­mx>´…è~ì$[3±#m—iˆÏY3±9nÍzÄ&»]ö$6ë­Y˜Øð·frbãà.#T¿ €*ÕaKfI£Ükt‹Ù)ÙaZkÿÕû6ÇÅŽ¦Ã&pXõkª Tè\ QŠ$bº­’ä@–î’u𹊆ÌĆÙk-&ý˜{r‰nwžwLb—cÏ®YÇi¢e?“—µ†ÕjÆPÔר,œ“dF%(­Ä\jUÍ¶Ì Ùž5 Œ0ûmšˆÒí²ºñ)kr8~Éš`Ž#ZÕßmgfMx?óº¦ËÕ–eM»Ç¥]3÷ÏÎØ%þãÆZ âæ\kâßÕ2ij²ÖDÄó¶–U|¾á—1yËð›6áB[wÅ>.˜¬Ö-ñÃPZr.ÂЀoWó(ÍjêˆqÙBJš™åÝæ…­(S¶ }gZþ@Á¯wø!?™Ãð3É­ð°1E¡½Ç¨°÷‰s¹ðUÔ–*¢ŸäÎî·vxÊí‰â‚†ÂŒX¿Ã4 @ vƒ6ÃYïðå³~'òöº73ó¹õx]Ä¿ùjT÷Ó R¡¤md3Í*7óÙÁ+âMÀ·*Ös&…5G¤«~€Àܸòõúú}#ùØïFìnÿ+U7àP,H§å}ñ†÷_ýÝ]½¿©‡¦3³Ð„FÛ€ ™ñ¿' ~æÙܯߤI8øÉdEyBbó9lÅ•Ò‹¿^ç-|Áç¦ÿ»÷«u°½LÂÊ‘(’Ø6Ð )e9”}]÷HV2`]öÿºËðã’²çç ú~“bø«ÑDÕÀÔ¯‡ç@· Œ$°˜J<.èÁJ©xáÊBvUBá)ËѲžþ8 Y§%<%Nì"Å>»>Ëá[w(M Š§uS.ÇJŽwõ" jpULó´"A‰YA̱æþúÚ@ô VKywü6¿Z6åæ…ë뇷ôV4aP$ g7ìÝJ„ˆñÞzB½Öט ATƒ¦‹bêùi{w~ãÏã ¯ŸðÙ5˜Gx@]™è'œ";=g*” Á(³âú+ÞAi2 TX¨”À™Ñ 2Å*Ââ—ñ¨ø§vCjššéQs}´m›×ã)™-ƒB¶+a1ÅôVPžºn…ZÍ¡,ÚîH¦ úÞ¤m3‘¶hPª³Úè4‚”©Öo1+@QÝ!áHôI½ v Tñsù§#Àç§Øs­™¶ÚÌ´½²/±‰,êKÅ ½y]!LÐÐßzÜ,:snÁH@6S¬rãÍǨäÁ–”ä—c{ߎWÁ§¶çª¼·M¼‰ØVy~ȧ#MS›¤(>ú,A6 V°òðÌ€Çd’Çü9yʲôzz±™MC{Õ,LIÜ0ì¹Gµ(­j⦹Ã7U•¥¶ + ×÷uâŒE𙤯?ølhW1‡å,ŠÈf>ma +¹]$fëë„ÁǤkúóÝœ£‡4asŸe]7¹|(¢GÛ,}Ÿ} âí v{é9â:˸Û€»:ˆ¬rrÃfnÙ1Õ|B'ß +2uHAhoê™6‡«u/rç1ðÝ>ç2 vwª+8o—Šn ØÞÈ‘ÿQÃÒ*ŒÒQ¼ä:²íYwÔ§³ äw?%|Ü‘ð‹¨º_›ñ`úH‘›«SF,)Næí¶sõ…®SJ’ó¢ìPÞ´.ÍÎÑŠK\H± ¤³^â.)€8âÙÒpVïÍn%‹¼%ó@jî¶÷Ml$“ßoø’¼8ÊÔ`Ý›ƒ“›':+µÍ#óÏ’|´djJ®—xvíM +_™»×)u‹2€â3ìÒ£e"—Q’Ÿ‹ÆJ}£Õªêõ’×ÂMv V¢ºFS9¿—|áçAx®_dðv S„‡yB?ÌePÛ5YuPXÚU‹ÍM±ªÀí– +š4lÍ ×Ý”úöã ¶`W„»Žt{³ÊÏÚIŸ±µcÂ<^üÿ~ö·_íAQ¯òGã–ô… ¨°ÊÒPÐm~áüò¯Aél`$ +|šð7 +ükîýÙ'ÁלÎý¯ý`ï&z‡Ü'ú©3@¿o‘:¶~@ê Øú©3bëï:WlýÔÀõPç +®¿Áé Ðú+Ng@Ö‹Óõ'Nçç'óC ý-NgÒ8+~€é @ú[ÌΤ0;'~€ê ˆú[¨N‡ÔøœR? mHý-Pg€Ôß<ç=¤~ì ú[ÀΩ;¤~ì ú[À΀­;Wlýعbì¿ì\¡õWÀ΀¬;²þ°3 ëÀΉ¬?q:?8¾ysŒÞÑ€f²Lt›%AÛÇžq¬ßƒ;`€ÕʸK=‹mLOÏÒjdÜúij*aǵgÜMbx2)Ш{&·2î"x”#o4Žö ãnšEvœa—A÷…r7Qölæ›í)ºßj¤Ü¥¿[³˜v)#Š Ëý¤iåî‘=…s™‘Œ+å®ùC9‚NiäïJ¹Ë·¹ 7Ïçx0“rXß´™Æô¼!ßå0çî1 /JÊÓ œ»â6#ÂÞá/­Î]0vqô«aC¹ û¨4UOä}Ç‹VÊÝÔÝijme'-m(wûƒ™6Q€³¹w×;üM+ /"åd"°‹=9ðšð±šiº®"ÇÀÆ[ª÷.T$ïoʊA‡ðZxyi­¦ä¼Vö÷†˜w=‘ß|õSó¾ã]¥|»Ñ·Õ÷¼¼v ßÑòƒ±2ÉšùŽH¶½aåͪ€‘¬ÙÞæ-œ°æRN·°òÚVÁyMÚÚL=f¤­Ý½ìáä= Ô:`¿¥Zü“¶g1MTv¤¼(â·œ¼­ñÐœ’·ÚÎ=l~ÔqfÇŸ¦n©dúÙO7²‡·©/ú_B +^£ òOÇÇûѶø@ñÿiH¸"ßÝNóEFÉUóEFÉUóFÉ­æ Œ’AóMFÉ ð£äVÍJÉ æ¥äTs‘Ir§æJÉUÍ­”’AËJÉ­– ”’AÝErÉ¡î§äNÛENÉUÛENÉEÛEJɶ‹”’«¶‹”’«.‹Ü’;mI&WmI&WmÙ&wÚ.²M®Ú.òN®úîóñ'RxS¼‰xD}y'?G;Y^Þ³%š}þJ;Ù‰8O»ë;áávÒ>Ø—‡™±Q¸˜7ïzC:IM)äGgƒø€Gý#ÖÉÏ‘N~00'Äf3íóªî*™öÈ9ù£Çõ0NRÂh·½*;*»p *Êš¶Äÿ0ºNé—Qšp*-зm‹\7DiõøT:M‚•sÞ¥™ôlœ¹û§P¤¶LiÕPÊ웽³òig€ -ôò½%H3Á# I3”Mž‚4FBtØFÒÅÒTݪvt“^ç¤R_Òhù×ð’c`‚4>\¨è€~4R+È•±í>àG“HÎ|oò6®ÀVeJÊ ÜÝ~´ +×&ýšæU©‡mËVÓxѾrnøÑà÷Sª®Ø¡kiWÒ´€4lùÑb ¾O;±­Dz´2Ê©:;ænxÇ“F–S¦PœÛËž'Í›š7!QtxÒhrò”¯»Dž´í!ù"Õ³£•úú °¿±£74Ç_BŽöõd÷š'aOïÕ à]ê/¿> H{ÿ:"S<œÞÈD“V'fþã^Gm–)öʉoDI]é| MÚÞŽ*í÷7¾ß_Úç¶È€úùñ„i¶Ô˜ñföг—IžØz’άt; ØBW¸þPŒýê´u™¦"$fÏ·çUÑ/ÎÑ}vþâXf›Â)2ªÏ>Ì…Îäôv˜è2J9Ñ%~F*'z¿Õ›½`ª bÌf’úðrG‚—Tâ‰ÄÈ$õ› ¼uNá>.ê¨ùÄìkC“Uã鮘¥ai) (úN³d­»£•¢ç˜¡W5첊yJk¯_wi¯»ìðJ :¨©”ô²¹Iè9özNímUžr_ôy$ZVæÉ^ÏUøy8›áýáŒo??ˆŠ0 AÊ„© Òj»$Aê…¥ ’3l(ßì®)·Ã–Œ"ÝÖŸÓ35FaÅýªÒœÐ>;Ðbò^×eq÷¬¬¼Œ€ò!ŒF|>…dA¶Ý”iw p™i5tÖWS˜€ rBEušâÝ» [U·a.#$;MDf”œÔ8(â&¨ðb>QóÛ$ƒ 'z6 Ü?EPË(æ"ú‰ÛrzΨY/bÔ#ªZRýEŠ!•mò‚¾YÊ.‰âÓ vT"]A‹›ýñ ºµEA]Õ­*¢ˆ£ÀH +­¥G#©ƒÀÎK9A)7Sür Æ«q¶/ ¾ xÙg„"©]E; $¦¸—´‹‚wDk¯¿ga@Šû‹áØ.cÆr*epÇ?â¢vo‹ú=ªEïÁ¤| &åü\¼Û@Ç™ê?Õwt6èVU~§öË-5î-Ž%Ðœ¶RvÖó{Û×v|›Gñsb]?¢¤–«u9oÃÂø±ƒ³u®pþBàzÇJý“ îl3j@lÍ_”ÒúW_‡¬)ôòoþƒyE¿ü›—õ³ŸýñwßýÃö«ßü÷ºôÅñÀÝúïÙ!û€Ž•º+EzšðnYù4¦é!ôêY°”L©’?èd9Û0¨(ú4a©Þ/`fÌ»cÅ$0ˆ÷ÁŒCk›b YRò6ià°”ú)S “H†#sö`öž:8&ÒLu&«Óàx×JNf2ò8Ne§œöpÕCgÇ„¥xdÂoqåÑAÔ)]`“ +ˆlŸr;Jâ!„ï[•”öšÚÈÅ43¥sôx§à º¶ke÷š™¤D†Ôo•®?=2J[…iÔ”ÉH¥tDÖ1>åOR&‡8žŸ½™°Ü!X¢BwoÖ¬«ƒªšÿDœ¼’ÙTpe ac¾Àþ-—L!ÖRhpk6Õ @m&¬¬ë!vꞪ“]“÷¹©é6Åð#‚4#ÀL™ËAa™ÎdŠ J·äNîŠÃ·uäI%ñ +UÏMb ŠEŒF´ó‘œÆ¯ UQ.¥&í‚ õíä³îä|€Bf£,#gGƒ¾«`Ë( ðIU¯‚™Nl–x‡ÊDÃã Qä‘Ëæ10뚬¢ +^ÍVƒ\[.âÍ w˜#h +ÒM5Ž÷„›ºãy¿|9'B‹vË*)µÞÐÏalS)NÀ]ÌdwkyÝ ¶UØ BÒP46§óÍ4Ó{¸öD .‘ÕÍ? v¨@Ú¶÷ÏŸLxSJ½Õ© +^Q:ÕpÈ/zÝÛGùN§cleal[r>;Ê÷ù§’L¨ÒSi ‘`ÜrBH"ê‰Ð +OÊô>È,U1z¢í[FC¾P^~ÄíDan.µÐ¢eAÚÇ\EÎÎí wv‡ãZ@Pogý´÷˜^ì~F|÷gê +ñ½qRúÂõóuqñÒ:Ÿ +×€™ +o묄’ÄjrîÐä™ÆL´”X7„if6ýåØ/J_5êÇIs;—J¦³8‰Iê¤q·ýccJƾ&y­J‘Ü9’cê²ähqð%^Y|¢ZýWBMö E±TräÓ» 9Ñþ¢äcòþûˆ|HÑ™À:RmKúš2ÛåUý“É®&d¼¸ã7!ÚÅÂl¾3r¸â™íP¤•š·Y3Fá÷‚&nŽ÷8pÄ%gÈÛ’ú;l-0ÐجäкŒŠxd ']'UgÙK­ú#ˆ *×~¡íkR—ܧ¬º£N¡ÇåPš€%ÝÌ‚7¼ …Åü +^Sꢥi\½{31$«˜24 !@xa»§\~Á—V­½o.3Ón±î–qZ¢À P9öteá!ÄÅ­9 Û lÏag¸ä×Ó¡&~ò±ŠC±bÜèæ»”¢MPMY1£û Ø!Oa]†U=F“ªŽsØ%Ä9¶C>ÑQÁwÂD³@}L¢55ÜqUOâR)a‹êsîZÇËê©¿¨Vë.œ6 lÓžÞ¿~» ×[­sÔt3*–ƒðZ+@H²Û¾H›o wlÇî +sƒùPwçÝÌëüÖCõúf¿šKåwS®i³çM5È”7ï¯à„m'’¬D—»¶;‚µz=ÊrvÍJò™¬BþH€ê]60<ýÜL³|Ö :N!‚ +âß½¤,»Á‚¡Fn•„PK¶;ÊP%ÃHÁ—ÀXÏ(Áú›èüY+`·ðOÀ97ÃäÊíþ@w06c¡tÕ<À_ŠgUZ” ¹ïU¼±j‚^5%°^¢òYt, ,a*n4´:«Ïõ»B–ƒ~â«íÍ Â¥÷€v~gþž˜Ïï ÜLJÌ·vPÊÖÆŒR÷ÑuG Ìæí¬×Þ~»Æýjü¥é›c›²n H³…£j"‡J hˆjµøÔ]iЃ(D:–MtˆOx1‹Á‘#&pXºZÕÂý¬ƒ\ã:·Æ†HªPhrµmv©¢t ÚÂöwc¬á^éøs#ÄÔù–3`éš!i:·íâا ûý>Õ¡~ÅxùÕärnbíÏO<<ú›yïâùôÀõ=²Ð¢Ö Ùç¬z›}@“ ¨å¤$‡òÏ5‹¡t|r*9úCO*xQ Ìku£ºo¡á ¤ý ¡+æjVuàäêÜñM¬îh{¸ Z’mÛ4/2‹ƒ"cqhm›Ž  ¯Aœ²Ñ ýI¬¯‚V/byö /H–­ÌÁ¸õ$[ƒa@(³öè$SŸ6ÐèÄÓ|míiæ9Ÿ/8¯¬±—¯PäB›¶}”#ÔÓ=*``ŠUã±— Ãze¯ŽÊAhû ÏDõ9Óû6ÓdÅ÷_ƒþÏD™@ååy\Œ PHB‘Êó]&2ÌñC1aç[À‘\SžÀKO[9 +ˆ§'MsŸ¨ßé_Êß7ÎC-Žâ.¦;0={ñªhºÞ<þ¶ÙÊWóò‚Wo¯ÏI¸ ã#“ ñçÉ!ìlçù  qž7š)n£rÂf MsS§,r +Ȩ(Rà<Ôîqî«G#ÙhhtíïN>,t,^Šë˜m4¥Š +²ÊÕÊüY$öè–Ìj¹Û°¨‡ØßmŠ7x? ê/®Ë‰•ŽÏ¡ŸÕt7„©F (oJ^@,¨<À¸pæÓ|kÚľ5ͳ?…; ºf3aP›Ú–Æ94GÕýÀ~ãvjþÞTG3sfli(¹%&tòJ30ÃOÔ-øSö@¥OÉú˜´`#&ñfG k›[-ÀkhØ© ÙǦñ +û8á( n£°³‰+‚Ãjó:Í€ŠpCÈ`C(ƒÚyÚŠ'§kš`w@-wÔ4¥Gó|sü:ºóÀM‹V§_/JY )öÈ5Œ9áâö#¤å"Û`g걓ÞÙuU~Ûßd üÁ6ø¡‰N†4MË;9`ËauÚ{«aªyN´Žæ Æ-‰î|ôéyæh$‡;¾–å;c{óœÅ`giAºÄŸr\»;ˆÈ ßÔõþáï|-Â××Áã9|‰XÜ– +T§«Å>;4”àþ vð]/u 9:ZU.ö”-nî H“ôÂÞ¿÷®˜ j@ð'tŒÿt€×´l ÑàA"Uh®ºDB1Ìåà‰"‰ª]@TšçVo–;LîÀ¤˜ž0Tõ¢ëá0ƒ4ûó§û,Û]ÓÏT © ÑËê¤ÝÙ…P#—”Ÿu}çꃯW ø:à¯Å˜ ]n å®ÖÐ#Ä%…žcÖÂËZTÚ&oQA]Uf ^² Û×ú×Íè”2༢™g0š¥uîf€‡5ùQ5Ò¶G¡FzÆAõfªDY%’´kU¯«Y¯ãÁƒK0Vðé঴bÄŒã„Õd ™˜ÃŽ +a`ÙBœ"àðÑ38cÈÂÀ*X[p­0skø\õJ[Ì6Bi‰b‹4¤‚ ßNoÆ–`8€ÿ¾%r¢rõ%ÔÁ%ÈŽ-z,…¸<)¦ØqÌ!f—¨~¥â™·&˜ç¦]dû‰Xó + \Í=²f%ªz5«¨¼jÌšRe#R?[îÍÀ `bƒ%Ї»ïZG²5Áö'H ¢5ëS)s°ñ|Î É’=ŠÏY3Pñ[ÂÛ1…»ÂܬYµ8¿kvîÝê,¹½°´KRðÙkJq¿¥ÖÔdÜ™kz3îî5Mº?%kº5¶5aìšøÝŸ÷%ÅÆš‚ŽgÉdoåÖš_¥_H©¹Ró[©RüAh‡ê€)ægMÁ[•°"D…2j‚* +%[MJ)‚" åA‡†ªŽ­žE!Ao‡z’Uㇲ”­¹Ê[‚±Jd‚JmÞ7¡P'XD¡Ø'SkÍÐÖ ¥GÁ åKÁ ePÁ”üfWNMÒµ,+˜¶¿u4ïÊ»¢¼–ˆM“:Ô—m ñP§ÌøPë]µdnïR¬wÁ3µzÑ•™ØzBóÁ‘ZK +£3¶V&À1:‡käܱõOã]«Ÿ»T}FWy-Ý»Ükj|ÎZÈÝÿP»‹"¬uµ1±ÖæÆ8ÆZ㻇¬µÂ1®ÊChf­ZÞFxFÍó +ÕÒ1Ä4Š­·©P«âZk¹wˆÅªñ]<-‡¸\(\_#z¡þ} uô!œJðgr-àß-×.€ç ík\44l£ª¡‡!egûCã†î‰m8ta„rèߘQçÐþ± U‡î‘é(!HúX¶1öøœ˜Ÿ}3!‚Ún¶ €Ð½ò±hÉ<ÄF¢]Þ"'gö°+˲æ?4DLi†ÈV^3'2Á´œ¤]±6i—,xø%¡Ûe_¯IÚêTÐY5¦{ ÁX8¤‚¢µË‰‹¾ï¢vâ3M²Æ±Ò."ÊNá¾7j&®¸üjÌÇðLP€Î>ÄŸ™'`H‰o²0‹vƒY»Î{”U<Š>ª*]Ôã=Шi…¢ßL©ÏüxTÈ‘ehWš¥,äÅ.|`“äÊÔo7kü1¬-‚E¿¿Ä÷‚e_ÄknZ¹´Íg¯wøö]Gžgî» dI:è>»¯ë¦N6šd¶MO491ÛF?¼û£)EíÖPV»u@Ì/¸Äº¹£ë§2f¿àç·péˆ%rþ¯oX¾÷»zzˆ,o(ÚôN£î8¡.þóeF®©ˆºM1èœP$0ÍORÈ%ÔÊfßá”ygþèÏ@*pN=:P‹¢™hÛq¨{8¥Ùr‚é@AžºÄg±@, +Ä ‚E©KS³‘Äh©”²9¼  ìJD‰@ÊpÀ5Ñw™#6øfðÄ=®þU`ÚåLÀMÃö¼U8Ùìøx;-tìèî G +9Ü­Yž’<&ÙÍäSiMüŽ$¢z»#a~0Š¨ñêa\RŒOF¹<ìdÞ[Võf˜F9®LàHÈþí*‹£ÞÄNý¡a1KwB-sˆœ¶sÝ0p‘sÁɺ÷›ª Œ7;²ëíöS›Ä4öìû]±¼ù<;úµ|p8Šs¦8ð +bž¨bj[ÕèÈr‡–³¸n{¢!B#ÊNÞ0Ï ÌÏTÍ„›¦ªÿ \äî‘|®… n¼c*|æ9ë§ÂóÊ!ðþ; Aß:ß}¾Öi‘¹@í²=¼‘ö 3JRïÜ­ÇÎÓˆë*„¢æPc·Ó眎\zª=DÞÂ^RR ø@_¿ ‘Ä 0„-ˆX…-Ý“²_@ÂÁmŽ +É<•'˜òV'à¶0çÔ—p2Aó¥4<œëÞ†9a~®ù@¸*øÓAûÕK0E ÕEˆ=&‡6I^ +“ÅeRü˜LAÜÅç¬"3|J¼Û¹='dJú0ƒ«¢Ø¯DP8낶DP}ÛThØŸA ¯{êðí±šžª`3„†¸=ØÁ† òáóvÐGfê¿Ñà½#¼…»ä,D ’N±“´á +Mœé‹!ü#$Ü]œ/âR/Y!MO RNÔ‹{l†d ¦ \œê.!H®¦H[Ô£;VG»¯FŠX­!ÞÅsiçü +ÃáOR +NÚc¢ùI-ʾ`¶xg 8XMt 9ŽÔAíáT“ IüYudŽ@m/ŽQkh'vƒ<ÿ ÙDSOrDØ ´½ÁGqÒçzQpsª3° ¤ÜGÛT¡çô‘W€+Œ  Õe`QEãñ™ùœTƒ„ÇýF²Å‡3—ôKŒ#&ãld?ŒÜº§À–&f®¼¨t/™™f»M°D€!vÀÍ?;›GOõJYä,”¬ØvKM¨LP:ðIÀƒª]á|´|‚—ÛžùJó/†2DU2zSÓc&îA#jË&¬ê+4u«Dæ‹f")ipž˜‚T|À-ø Ô=¸Ç9hBLur©’¨²)v©v)Ýco~>ðy¹â±pJÞ²Rn'¡/ï8·ûJÁü&@ÊæMÔ63WÓæ9TÌÎÔ7aLØIV‘A"MÚÅz£^èöí(¹‚ÄDù¾ +/‰/üòLc²ÊgÏg²Òt[ÃK·5ñB=a; +KÊΘC•ÇéaBª ­vÕ&ñ!]C®]ƒÞUãt…ïàÖ8n/v¯·O3}ÍÒÿY¤)+'‡MUÜßD}¶dúùóídŽUì8]ï¤ëpRS…ËçÁ7oŽ‹* ©£=’-()bNŒR4:.&\NÛóH=pì^@i'Ç}Ó~K$TÍ}À¼B39\<œú +3mÁé¥M_©‚dV•Hybžƒ2™¤.ï ?ÄH‘©Nì-N4jKÈ(Ÿ¡N8=1Úë=Ó)fŒtŒG¤¦T©×ug'¨PÇA¥àIÈ<³[‡Wu0”‡PxD¬æ5QM.læÓ·ÈßRÕÉl³=9F•ô±•N3Sév€ãäR;Uƒ)]ÆRš­×Ô"‘ïåúìchd/½~ áòÝÊB4I‹öÉqÔ’³1в+J÷ÛWÖløÂ)=ŸÚ9TÕ~iªíD¢œÍ)!R/‘•QâQÔ ?·äªcô’ºˆü¡—°ûj/«ÝÕA•(Nÿdg +dÕ£€úœ…·a‹ + e¥TýUÈVc,®wølÛ*ec;FeTõa²Ò„œè±ö¢¬FVl\*µLYää°µ>=81⪜ócJ?ÐLù»;’ ¨âQ‘¶½»ïMe߇§ô>ž¾ù꟰)¢n‚`0Þ¤i©#z¨ì( ¨&ÏÒ ²ðyUÀý4_ð…—æv˜¬ÇüŠ¹všéÊ$¬·ÐšÁÄ-â_½È+SfrÿEï2—ˆfäže±™Vý\wSþ€8\¤ØÞŠÙ%©©Ä MöˆÚü…#£¤˜ÂÓ +m·L õ¶[aɵ}ó³Ÿnd°Q–Ú¡¶íCäÏ2èÙÃÿÂøåI¿Ê +ÚÓtɦpf†]x'É[ÖuÕ)*pLÞyBËùxì ¼’ø$¿í@Ÿ³zŒ<™»‹¼†3>]¤vvÁ³¯.U ó¯YH +=6–) +ûÞü¼Œù&ă¿ñ¼’Qª +‹“*ð¹eD¿ +ê×fÔ()R—ºzÆÃ|A€]<ÀŸþúûßþâû´1ÿç¿ÿÜ·067¿øþï_gæ㻿ýþ?ýæç¿øåÏÿç_ÿê—¿ùÜÍþ«¿[î†ç@0L¿{¨ÿîû_üÍßþæ Çúg¿úÇ¿ÿ¯^©·Ý•ÿö«ÿéÿ¤üüßþò¯ÇOùçÆ?ÿüßÿê—úë_üò7ö㯿öË?ûþoloþðÕ¿ÿ;þrù_~öëøû¿Ïy¬ÊþG_/lÿþÿø•Àòÿáõ¿Òˆ ÿDzø_íü¿vé_êËÿþòýßÇË_ó«?ûêksóMmçæ¿~øêk°¡ðÚû¼öíûk Ž›˜oßüvwmüö—¯_ô|uÚ‚Æt¸—ˆdA- ðMé3þ WÊÕMv™M4`«BÍK…+j +G¿Æ™±V_”>ycÐêÂ;skÖÇ¡V„®"ýg¸€øøÕZο˜•¼‰MPZû~Ô<ˆäôËßÇ亮a<à&¶ÂSÍ>¿_ÂÛ¿ùê?éçš']?© Ïã³Ê¨Mâv¦g,ÎùÝýn˜ÇåðoÇÓû'ÍÐøƒÓŸÞˆá&¿,Úf¿Hó‘_„õöÅ_x•c<™ÌÜ´XmÛø&æç™Z»ý«Í ­ãrƒL|\¾ÑR~Ѭ¡ñd˜Ó^¶ß;§‰þÍ{L~'×óøœK—¯k ä¡ìY‘vŽ‹Gö/¦T¹Ô1Ë}|0•ÛN™¯y±BPìÏ: ¿šr·Ò˜=.’”ûüý2‚ס½ðcåÌ2›>æÀ^G«ªÏßõ]ï¯Î µõ9®ŸNÎy¼èìÑeR]cá¨ðŸç œ‡Ï ÷¸—æþñXj%…¶ý2]´ãÖ¹ÆØ!ã^á/Ûïúæù`ç‰ÕIB&ÿ0.¶¨.§ûš|Þ§ŒLÁxv=®yï1–3<÷u9n¤™¾›òs/Ì4ÏŒƒ^æ³óUÆ~'W4Gx–q¢ÉŒ­qç=?ðÍ뺎ñ¢h{[…”ú +îÝ~Á7üÁ;‚æºÎGþvxÑHû<9qŽf1ÿ¿Š«å!­nÀPýÉ9ùúê'Ù¾m|F>ÞÈšòXSÁñÌË­‹¦ˆ‹6‚1Í´ì΋=}u€^ê3t»vð{Ë#ï̽ª}ìpóôæ#’è%t" po?ìõ‹—Î/®©M-#ô·óîûNo6ó¸Xç#'ýh Ï9ksî)!x6Ñ=¾º;”ÔÜöý<¦œ>ÊsuyÆ:9ù1p9ÀVûa\.µŽ©>¦ÐQ¾'Imgy½¼äÅy¿œ—ÆeRh~9¤à{õù«DWë¸(ÆòX2ߌœC±£Û¼÷–w{vÂ/:¦DLGzpçk~͉㩩§))mj·C˜Û ¼ùƒ6ÍãrÁÒ÷¼ÇWÐU0‚Ãþ;>{ç¾+ç9‡QJŸ›ñ3¾à›gMtÍíEDj®éÊ}'l¹x»ZÇòpÓ"c#Í×½Œ3•1ÈÎùÍæò§ô*Ç™Jà §y±•—퇽~±=áš&X}Ý…¼ÖëqÃÏ/Ú‘šBœf¦q‘”’_î¼õ¾ç­Ç¼ÖÓðÐå»^…À”ø|Ù!pßýõ5gó8¦Á¨Q0óÞ:¾B{æyêüŠö­å ¦¸i¼'3¸ÆU:I†¡G’bȸ1æÓÍj¿ó<¦¨Ìߨ­ÝCÔçsØÍ7møS¬ô¡³Öø+ó:²÷œe~™€ô¦àœ»LõkÎCæµ2%µJQ\–6RxÝ·¯k§D¥^H(þ‡îwSKªËй¾^~ÿW™wÞçXm0U™w‹ fOPæî~Öº¸î÷‹ý~„Â4âL‹ŒÃ”Á[¥Üׂýš_KÞó‘w½ÍŸûÐB56«,ðíç¿Ñû~6lëå×ñ¬¥ãZ.ëùÊà:Ôy¾Žóù²CiV7†ÐMo&7Óµ»ý€ùeˆÏÇš2çt|Ys}ë—‡Inßz×5/^yŒ¡Tq'ÏËñÎs~Õ1ÏÅ–¦æ~¼|ÔëþèmÊ©ŠÉ4çQ°Ñcgßs"i¹÷¢|ÆÅg\%¿Ñ‰5×ihP^;–¸ÍÙ-÷g¶ÈIÕÔx×T~ç#¹ ·Þ~ÿ«B¼ƒI×Tˆ”ƒ«4.vÖæŽ#O%w›_súK\¾§Õw#™oªú$¾ý€ož)7u1ŒsülÝLj>š;£\<ËØ ªÝ{=çÅò:ef¦Í¡ájÏ‹~¿žˆ÷_ðÙOK/[(—³ÍCq·ß½€Zö>_6‡6ã)¿ãX¶ç2Þþœ›:ÏúQÛï¥~€ndDyŽå5|LŠÈÜIÍØVî¸Âœí~„]<î<ïD£û§Á]’ƽLˆ_#‡:ôЙËgŽõ#ÚYo/v*øýbïóøQùü<  ó|\@`˜°KšM­Ž¯:ÏZŸß‹Š ¸ ?¤=*çñ5.žÃ;9ݯ# ·? t‡ã–ª‡KòqéâÕ¯Wá´¬Á·óòÙÇÌ>§ +5 ž»HUöËvmç¢fš[D±„ÆåšÓƒýÛy÷ݵ4^hë+rBßeã‚”p 3Uí„ÏZŽ}ÎaKy®e›*,•ë¹…49xÌ-¿~ÖûA|ûˆ¸³´ÇE/íqænŒûÏ>¼‰JéÖ¹\å±äØ%õÕæo*,S`ÄÊì¢À,}OÓ…íiï˜fÇ™Ÿ¤Çj¸_ýjeÇžÎ'AhŽ-_¯_pOÌåžÊ<•H‘s>uo Ô>MòGÛCïG^´4Ýž¤üó±Ç5;ÝM®Ýsý~n¼ï×)ì÷óØ'nñîr:Žþ<âqŽ´»XÛës{~áóa½=âù>îg½ÎÇ>¹Ï×<ê6 aÁ»Þº%s°Ï‹úÕÞÌË|êc +•7G$£ÃâæL¯Ceï”úù™Ù~ÍÓîü™/×êùúù¯¡¼³~fþ^ï¥îh^le³*›…ýPtägåž2ø8§8ÑÞÞžÙ7qœaW\fÜ´W7`*uB¤O,(õy-÷ò\ôƒpé ¦×‘†Î #âÕϺ¦lCðeûþ×+c&©á«÷óa~^ñÊ:Ÿ<=õëÕR’¥‹užQb_#`Ä^G‘§Ìã[î‡v¤6F1w`›Ûó ÔMeh*åÍÜ”'ZÈ¢<žÞ°\ V1s¼ñ,s½gð5 +iç®>ÏíÃ$¿pÍPž?¾¡=ÄejßÚaS§c(O3¬_÷Œd1ùv\.#Ý4øsù>ÇÝtq<—VFòff¡°ÅÏ»õþØWï>âƒsMïïhé +A?-þ*œäV~»ÈTj:ìO ~æo¸\f.᤬õÛqxó¡qéKùvÿñtUºd¸"3fO‘®? è“ߎ˭µqù¸]çqÑó\ln°ÅçŽÉê÷ æ*Þ5u4—=¼ˆŸ_¯î/´ËÀÀ¡onp1Ï›é¶øÜñBê_êÞi3àB5ò“¨´=©eªöqQ²Ÿ ®õ'Œ×ÊPˆ-? +±ÒcxÜ󱀣͵=ûËö»ÆSiïɘy€Åü0/Ãå±V¿Øî) /ZRÇÅsæ× ]quD°ë¼µ»ÍþÌ(üb¹_EìõüÞ}tk}nqëËQ··xÙH‰rúËÜlT%xbq‰´úv\>Üøm^­'Ô@d™™rÕƒûÅþ_ˆ{Ï_I’$Oì;þ´¢§K<™Z†÷”©µ–Oë÷ªÞ+ÝÕjº{ôÎì‰Ùã’Üñà $þ‰4÷póÌ=$A€‡­í鶊ôðp77û™tšüòŸ‚‰ +š$l*ѱÐìeÒÙøñӬώ¬@kg.MgC t[‘6²Å®AÁ­ÊùrÌÃq¥KÕ‚u„uX~:\4s#ÈÈê`Ä¢@´¤ájø'Iç·3ੳU$jT‘pÞ— 13Š ÝØðLðPàß\u*°%‹gù.&~âÀVücôé'ðoc‰Ü¬Í¨ƒ€[øYöÉ‘r”E´|¢­˜‚H˜ÃÐ'ú¨•{ìý£Oö—ÏòQ õaßç& f¦*2‚ÄÜ©¾ùÏÉšÁ][ŒÌZJ•Å¯;ñ‰ +ëçÎi‚, +ßR÷.g‹Ô>7tD³j'©Ãd2ÔŽî#¢ + +óñ~îÇÞg‡DåÊî&DƒÏÒ5TÝDú嘨·Aqü€þ&6u œ®¬uf›Øè;ærSXŒ¼åëgg VAg{Kˆf¾¾÷H¶U}ƒŒDĪ’)×AhAôp] |OœHñY[˜OfàÉ ZyV ¿Þ!izŠ™MS¥èCo•¡ ÇMÒ¤SKæ(•ÇmsÌ^¿ž—*Ex—Jœ—"v“¹8%ç(Š‚-vg"‚jªšÜMj Ðà—Nೈ ˆîç/|:ƒõÔL™Ã*ÕäÔŒµ8Òu\ÝÆ4Vø·× »‰ÏÊÂŒ 6ªjýíƒaËGYÏ1+™¼Â¯HúìFe‰p±ñ÷‚¬‹$ +Ô÷MFT}{ˆÊïåÕ‰ª°FX‹C߃–˜ ú^4Ž·pÐ&€Ðõÿ#X2&ÂÉŠ‰dŸÑÑgvF4|›—y8Ndð#3œ¬ÈüT-Fô£5ŒægwpÆ?—G¬™µïácpצ›¯²vÞTXvŸ¾ŽÍƒçÆÞqtÀúT) ÞÝ ²°?Yj&mA¶4ß:àþq>#›¹ÔT¡©Ð ÏÆõ&Ïvô>ÿ.F„ßX¦H©Ô-‘3¢b£öT0eŠeû(KS}§z[m5 fû,Èš&žåµ¦>‘(Š0!t}oþmdB/Sêo ~t7ùSÐĶ„¹=ic™n7AŒ%<Ìà1ýhÿç¬&$×[,€ÆÑšem?K‰Õ˜+ÏñÀ¨&¡ï˜È‰xô™Å$lB"g ¢Òìe¬DÒ'²î±ˆRUUE䉻ôõ'øÕ¯Òxò—ÆÜøSñq5#ŠUP}oœO4y;þe’LÌäNü¹Fñœ_±XbF¼¡ÿS“øØØ~%ë§à'‡²ÙÛb¥Á<£Š/±ÖG +ãE:=å—êòg…|¶té`Â@žVö¬Šãņÿ,O3[å[µlK°Ñ*°‰”&¬`¡dßAÏϧï\µd"{™ÀzŒh  ½:±.¿6>k‰¬ö¬†œAMKæ‡1%lšë€#M¡dLÁìHà‚c֗ź<ãñÔ˜KÍ@I¡,`}+Ä“"–OJð;$Rvc½€l\œG}¢w&ßÃGi&MYþûY¢ŽØ_öC˜"/‹«xC ùS=EŸó{ød[âpS¸„˜Ë‚bˆ%'snøÀ„ç¶"¿3ŒÏ^<çÜ>=v¥ˆˆ207§ŠCh„`˜Q„>~Ñ¡£ «Ž¥ùš8/ÌÝ"˜ÉÂƴѱÌ&È߃U-Bªx4â‡dŘÂâ`—§ÚÖÚ¡$ƒ”êÚwdˆ@/è.ìçZByða}Í×UûÂnoG¢”æ5âD••j8€­+bTÖ1wVX6”µ«_%Í4%Žý^A5¥PWP8ª¹îâ×E²e™xº¤KÎBSáw_‹U±+†)]ï óñÌKÆ /yî¸O¶7°3¿ÏÏ'[ÄfïÞyÖX˜LLï«þ±1Q{q¢-D"k!râ˜'žÔUÜqS( FÔšh +¦2°Ÿ‹ 3•)ߦµáûãÀ'ZB ²ï²p- ¼ø9¾âQÔRŠï÷‰¼nÞ|*Þþ‡å±Ñ6’mt*Ú"'Œ}ƒ‰ó2…'õ^S‘HK“ãjòÃ8(cD.£b8üò‰ F¥<ÂßÙç8Ê-²ª4 噪⠦_ûÁí¹²z¸Jì¥ËÔZanûDÌñ£k=Ën­’‚ÏoAÀ‰–‚Dbª8¨eàWñT5@57t½„¬Õ žpÖ–Mù „èÅ~³…êÇÂlixZ$ÆÂ7tâñg}';«àÙP~{ OØ=¬;š`9Í’¿7Ñ*4„½j*˜ÜÄN˜ïjHr{ŠõòE/»EB8ÿ)랇ÁE¢¡I¦hd±{Æþ¶a)¼Iš"ÝF3ÙLd/œ ‚)xleýû5'߯I‰Š~{ö †;ƒ +”5Á±QJiÔו’Ö†qîÓ4a¦ðn€†ü½H ÝÍìYCšžBÑ6»ÇYðÛÚÒ2XŒŸ5UC>«#Úã·Š'uÛÂs(°ýBÿ³ØYo ²)’¨„6ìYKŠ ͇dž5%¸8®æ{œø©óo¥L*åƒégß±v5 +Zê–!WƨcX‚Ù,´¤ÈüŽ QÕ2Ác"†"ÑBÄÄ.­!_*üÈœ­ÜF_ úW™`ÜDÇ/»¾Z„éys2C<«ê†À–ï²cõê£oû\ìÿ^GUÃâ¤~Ô’‘ጠç'ÇÀmñì: ®(fDP?aÆ'®%2kÉ('«ÉÊ}"€E±†¬ý)Žª¢¤§2åØбx 81ª4ï !倨ûðŒsà0˜ ¯±7#Sû#ønh~´ úá|C“V!¿G\“㊊>Ž’u9, ^ ›Za«h£jÅ4ƒÝ«!Â’¦­Á ZëÂ7È%Ø’„Ȉ&bo[ÅÖ’~'”g*Ë(@”l GëŽI´OØKÃý䀧ñè°X­o²Ö "´Ã´ø0¶ÑòàˆÜ 3ÿYdQ885u½\k7 ó¨ K†Ýøj£\Ç„F6ª†N{bã è +¾—‰mì]S±<õÇ2{s»OÔM Û2IQ§~r•r…×™}ÇÝlT¹º…IŒ¬¡È™x™(.bžPsq­±m{=OŽôu¶nÈgmÄM†`Z~‰ ž;ÝÂ8¿×Hƒ$:³:j ͵:dbZ<ƒ0ä\q +¢"1µæ é‹5>Áœh ‰{?Hgró!1í^_—Þ¿C!ªL7ÁZFTЊ壟‹„02Ëî2Åïm9X7:Ô³5w,j( …à +šgYó9žÅ"2Áð¶ÎJH%íJµDÜÍ…‘Od­ +ÍŠÑC21Û_]þK¨¬èb1O‘ŽÆ//Æ X*J-îØÅL‘C¥+C—¨•ÏÊ÷{éë¤Bê6}!þú©8YQùº6ëØ·Úhp—‘\[›-JY\•ØL$v°Ž¸¦‰œÝAºÆ:a²°.+ ô_ ¬Ó•TD:÷iã³–Ÿ9¦³ä!SÚ ßîG“å€ÜîÀ,YND”[Ý°¢ÑúÒUY +ÎŽÕä 0ÒÈr…åˈŽBGUnlZ–ú—Ðõ'ز¢”§a·ñË„uNX®)†@0G¤'[×ÐÙÊýš!×VUðuXîªó\!1€)‚:Ÿ;2é–ñæ« ìeQ0EÁ Ø"—ÊÒ° ÷UA¸3¡¨,àgÒƒblK‘QÜ0E,†»ž–â'‰ðœo #»XÉ“‰‘(¢6~U;FìØ–ê"¶LÓˆLô·å¹aý“|è¯rß³!ˆ¦‹’ßfâ“5Šè" ÀúOúÁlI–½¢ ¼3ѦÑØ-ŠˆÚ¸«¯-Ȇ…u+TÀd *2Ucƒ1¢…–àaaXȼåƒîW#‹:(kcÁøæøD*ÔŸè`–Ÿ%#Þlqen†M|ÑË¿kdlYKÏ–ÖÀ)¡2š¿Q~Ž…•DÖ.°ÚÉŠ@V±Äž`íÙÈBWLÁŸ¿@&2+LUm‘¬uA,¿Ë³Â4jlpŠÉš|Ô’õ¢Bþ.6ŽÏb:®ªi2Žna +›*˜{R¼(Ìò{ì4dÍ2¤ÆzsÓ¯Nñ‰Æº¿†¼9¬LOXã3à:¦Ø¢zƒIp"'& >'¶Ê¤E©]µº þ«6’-Ìøæ»ÞÊÜ’ZwiÊ\É›öËùZ¦¬ÕM)xtÓwi0ܥ˂[]jV$¢à:¬5™%Ýò¦åö®`ÿ,Ýã×­šØÅD7+ë>'r æ16RVdÉ·Ån×ò‰(ñBrÉ9Ô÷ñ© £ÙÈÆËÜ iñ Wœ%¼$RÅİѿƬ#+»yÅšWXjEÚlXÅT}"Ç— }(ÒDåïòù™ˆruMEcVWŸ×åO‹[aJɆيi‚ü.hKXÙ¶¬‰dýn¥¿þZLJ5L¹Þ–ŸsàU©œXóBéQ Ìüã·‚ ¢ŽIl?%?ð«XëLzþ(Vþ"ˆæïB•¥‹ü3F”UüIé—±×e¬N@øe8k8À'YÀâYK$£sɔŖ4: Sv¶±6-@ÖIŠpì˜ °c²':XÁ–¬·“õä¿œßL(2 †7Œu¹™å‡aQ&½ò"t…¡s‰1½†¾´uÒ .Ò˜ žçd¡–KÞ•uà¶øù:½›$°ãáP¢®]q††ÕèXSD4PY5ƒŽŽG´d¬b0Ö›ÛÆÜVvµ3–ÈîKëjx¿¢@zìwéå\÷Z•¼ÌK*Ë 1Ç ÉöMYü½ncƒ®¨ø,k7-¾@dnøn™d“ÞkšCN&Œ™O[ÂUvE$Û~„Füú$ƒ¹þ-lxeùÐ…9¯MTÐìbélG eËBm–Ñ$«öÑíg*˜AÅÖK¦¸1²aI# ©©È`éú‹MU¦’ñr¨ "„e‹‹ ¦Ì-büešÞ â<²ÅÕ1À£ÉtfKÖN™†lñ` N4MÙ{J–É™›'i¹gšÒÎX†?iù‰þ +Š’BÓ”&KäË-i|‹ÎC>wÖô]=I÷['Rs‰ïa8ÐX¤û‡–ݤÉz\?æùÂWqˆè§!|d7Š+ˆ†tø³eøV Âsñ{Ô?&o™-žÅÈŠ‰ásÝy‰É*cýdfQÝ«)]§®[ëø7ÚӶ߰죪ë¾EmÔR2¦‹Ê’‘{˜þDz!´¨éØZI5eðÃÌ 7¢Ž`x.ÐÈ·¸7R&JË|ÌÉf'q£Åó§q²¦Y¯Q*Û€X˜ ÙÞˆ¶ðÚX”­‹ø$»!J¨[:F-CcüI à³[™D\Ñ·yíÕ‘™<šTßìl‚f˜ø.Ë–iGë–>¶Ÿ&è«o”o)"ÎkqˆŠÆ´hÇgéeÙÜ’õĶ<Ú66«a¹;ºŽe1¢×»KÈa¤enÔ„‰‚@ÿYÔs6ë%(sœ°Õ‘Ëq’{@°$)iÆiÒ;gñ;[N‹ÊNv=‚¬vEíË.S±ñIE–üòì- ®€Þl©¼PæY–ÌìezP]ÏÀ²P«Â?h1U(-¦:Y²]„¹QOhÙÒÁh®KCì2,À°ÖYLÿcÀ‡ß¹»–q¾Éf‘òqžŸèMQ6͘E„Ed;1[–š[ÔϹõ×KDÝleCÙóä$>€­lXFDÙ¨„A"÷Ç&±<†etJ¸U 6KpEw“¢ùN?v¥™l[û-ËjÕ0£‹PX/cÙ7@>NF”m—lCgWôJG‘ºŒ,kÒxØÉ„ ðÄZMÛܪì6kAĬ;%Ë™ms#2®ù§É6eT‚¡ß~bDS–Ä´Òmk9c£v1®,R’ noT«®ÝŽ@öoä/S0øÈJ¶TTµ‰ì±nÙaSéd[ŽÂŽ‘¥­b›ª|VZ*xœØ-Ϻ±©™ùd]îbcQ9ë /+4‘¦B4Lñ`_ "#°þîGæ¿ÂTÃn–U„]é…¾W tÖOH’Δ]RسÂ/¼˜~,°p/¢>‘ÙÄúÔkèªæ&äïMT#¼¡J[‰²Öz¾ë‘,‰‹]DÏPFTP.¯“Gˆ)ËÝmi³kN¥ e +'!³QAC–N«ëBÛÛïì…dÃ’¯š“°4l@!rú •ÅæbÏ=VCÅž‘„…»e„MñØpC˜ÿœ*˜éºa°9­}” +Áj ìþÊz©ò÷ˆ&˜mˆÎ)‹ÐèeФ-ž^÷ªñ½ÕT‘æ’í¥ûD[ÇÓ¬¨˜XDÕ [µ.»Z‹¢½‡’Ø“R&q«]  ;Ó»(ËG¾K†ª~!¹?€ª¬ ²« ÷]´YdˆñMDYGY,ƒJ姙SÕG¢¢òuT†{ùaàP•²{ÙС€Å!Tf)pËȇJ”÷™‘ê FºvØØ®K…m?)„@ñ¥ËÔTÊMh4aL|TÑ°ÑŽ*”­'ÁÞÚÆï1!Ïâ–Ñl©DlÿzFŸh”h†´š))Èž:bȦ.rÙ€hÈV?¦ln@™S 3C÷Ñ{–*Rkû6 %âÌpÎôL1»€ƒR^~¨ðë™ÐeÀ.cD3ƒ¹/Ã÷,úd٣¯ÜãD["]…7ÓõŸ´1ˆ¢‰–@¼ŠrÝŠM÷-PNµåñäk%ˆ¬óx?#ê~Cð‰bX}ÃûäçpâÚ°ð»³ùOÊf3šH½²);X¢Ë0m_qúYó‹-–S!»Š©g@%„çÉþ¶x–ÈCë×<ÿb¹'{Vâ?ã?k a¬òãâUyD ˜“©AdA__Y•Kßöç ú1ÿYæmÓ×v”NÅŽ©\³Úx8ýÌAþ°*z;‰ãá?«É ¤i}¢Ÿ¡·‘rÀ§KTÈç©+¢æë|KŒ¯Œnë˜Ï"|‹œ¬©˜Î¦êÏŠÚ|Í¿°Ð§­ f ÛOñ/K¸5éÙ¥iâ]¼¿¥Kˆ'€øZK¤ZR±àŠQâiÁ 6Êi–gÑg:ÌçiX†dEÁ4˜¦ÒdS—Y•¼¾×¥Ü5 xÙ©sÂÝÇÉŠ†‘¿bˆö[dÏòögþ d4â¢Ä’MW/Ó7R*xfN žIæ{ ü£Gq²rm¥-ÉS³(R]ŤDîÀ4Y®`3¿o[*ózX3 +¢bf’¡ˆÓàH#Óø± Ÿ(>Lõ•Ê*Ãä>¦%ž;^pnÊ‚ókÃQØ™‚ÌsëP²âŠ3&$¨-+öØÕ[ø{Q²ËË3¨¸Þ€Ýôªá¼°ê’RlAÅ3ÁT©AäÚêèԧ݋¦ÛU,;!ê1•ÁÏ“ï b7…ÊÉ¢INMYÐMýH”?€‰ÍKÁe [ °Ø©-@ :ˆ¨Ì ¤ì>[V #3Ü,ôF3ÎÄÌEK#h~©2{Ÿ6&?_íí“™YË£bT³áP80»P&¥Êt#n-¢^År~6™ã j7VdêðóŠù”ìþ8 “‹±›û*eâÔJúO2Ûû\~,üQ…É‹i1eYT"‹ÿ.üá ÔD][Áß,Oñ i"‹ +;Kó¤z à{£×¯Jk ²i¢þ²Du ±ñN– -ÒDˆ%5’ºÑÓØŸ¨~£[ÿYíÂÐP£(‹yN¢ÿ{ÑÉÐß\qÿ±|O²î7Ã÷e 1ýŸùÍ&kƒ%e‘)Ìba× . ü-'<IÊcý‘>yá¨`/ýml¹L9€ˆHó’WtV}B~î9ÁÖ}`D»ŒSÖíÚ2ÿžÌ©òäÑ” Š·O-.#4M Ê„_€Ùè7)ia‰.6úb7®e¯-xQÇ®µ(<1€!KDˆT«DÇ”^A IVµõ¢ã!Dö2æéã*z±$$%ÔÏ“#ÞEÃ땵kJ5ñDas˜ÉlfLZ¢ˆ¦!úõ„sM— Ó¡™Ó oDš Ôõi2°l„ݘ(«‡ˆ¨ˆe—{ëئGÃEkJ¾ Òã§nm¬å'ªÄ‡Ø%È' +ì¼Y™Î¾JÔÆ«þ}>Q‘L‹ñX†)‰d$Šl¿À¯À—‰Ä$ÞPÁOþc+ Êæ +¦·†}$à‘I˜DA3 ë ijëò‘êü¦¦@T Ú¬2_Å-X¤@ê +^¨ŠQléÀïÇ‚%;ƒ`‹?X$j#hbÁ +Y²Ž5¢lP)4táÔ¢!ù[¬8€*ËÐ}ÌÇ{ àânVŸˆº’s¹øµÎªs%hË¢3X.!P$~ÔÄ„µ¢QwÊ"&B.b(¢QŽÅ{ +#/ë*öt°4TX÷Ko¨¹îó`Ê3fˆЖLòÕ6ªù?™6æ³e"õÙü^‰_NÈ5,ÁhþºÃ6d€]E¨h® ¬r°~“u– yH°oȃ&€Íá8–ÚL¤¼—dt¨é⪡´yÑl]eŠ˜¾‘iè²Ã­ öºŽÞ8lºûéû=Þ"‡o¨¾îaê·¹»GªÌÁ2HNÄPßnA4eö™D’ŒL14†í~X–¨†7ÈÊ%OQB\³O‘,ïmv•Í?žÿ³Ru#áW^SÂŒ ™×ÁDÊ¡ø:ìoÍ Ü Ô~2,{el‚+Êr%SZãÄ’½/…W}£\‹±JÕ'ÿV©¿H)dÏŠh:'Êò{C6Pøh½$e÷[3q*jsú*žMl(¢S ;I~^bK¬‡Az[æÀ0¢ØêÏõœüܬD')VÈ¥¢‰¶½è7¦3Å…ðZp3ùeA )+Ñ~©è̉¢5>€ óCÆŸ¾¡1Ô÷ÝYë›yìÄyžûÕ6‘ÑooQ³1[Þ”M„¹ÿ,Œƒ·8qŸfoÜ$%'}:¯uË|á¬T‰oçÈ–ù*&xXš‰®uY\bÙ¢¹Á@$åõuŒ¬a8V§-÷ [6å½ê Ù«–ÈrÇOçµ^aM^iÉ‘>®°póô\IQ_Ï‚5¶¨K¾uýÃ<F–Ùy^œamD3± +dJùá¯u¼?Ëúx‰L—RM$~4}ü.K¦¹Û~¸!cõ-}b¬Eä’Û’©Ù &‰¶,ÎàBS°¯#‹aøÚÀ¾xŸÌ`ÝÝÈl[yI•,Ù¿–)&ðÛ:Ö`ËÓ7i<ñ{Ñ„ß4&Rß™èbIâǯ_3öv%þá@FPMlΓbð¨­[•›ÆšúÑíuHÉêš­š²s&&׈rW¬nÂ6ý„%ø`¥ÊªLQ?È›dâiÑd>+Á‘³Ãäi>¬}S5YUóá¼¼u«ÏÆ s¹ë“eYŠ&+Õ5`YŠ¶¾ÀôÖCw‘‰ílP¬Šrà3_&E¢l_ÏÅîßÙ—íØÉFØ—·h~Ô:vªÃ¾ô÷‚,LF¶#*£¯]¹Dº‚Yù¦,Ū=Vï¡`³ SúÓÙë(6œ7D‹3]Jõˆ<ÖñÙ‰!æÓd±’èXq/Ȫl‚ƒ·ô1¢¸ª€ú·*øDQÒÏܹ¨*u ›8`rûóo[/Vn‹VB¸pºt`bòƒ.ï6âÞGY3* +tà +­»¢ÈIJ#0wuê8ÀG3ð¤v§ë^¹DíNî)¡rOySCb£Qöé mÙ1XHÏóE±cº®¡³j£,cÝ -yV“`®=X뚆µ{’Ž|¢¥c³ +[8X‚ŠÆ‹iië² ¢ÉnpÂónˆ‹e„¡£á¬>ú‚u3øFÆO3dTFVkʶ#â.^aja&9/âÀ~f†èÄň²§©ýÒw]‰hõº–—ŠÞ 2UñVºŽŒ¯/òÀ€Õç†h‹±5ߘÑe’Á=’åumðo8º¸˜œ%+Zë‹Éשo€® v×ÖVs×úçÞ…ÝÇ-lîÀ›âmœŒ,ºUª~FÉ2ZIDùŒe¡ÉÆ|Ô/‰a©«"J¤ú}‹½Ï¿n}Ý!è ¶¤Éf+Z¸›ûÁ+²gŠêwÆj~ Üí?5¿ææ^1p©ùeR>½¼›z4ÐÓ¢É$_@”ÕnxÚ?[ÿÉt'Ý™Ï>ø· Û Ç•‡‹Òëwonú§oß^¾~ð‰¥ËëۇȑÉÃÃéýåŧîyG²F±ðÿó÷ë›êÕ…ÿßü[ø&üËÞï¨ÊNggu¨ì\°ç‡_$mX@Öë¤s,¨\~Ù`wù¥¥krûC²­ùWä´7‡ø,q=À¼sø¿1ð+È*À>ìÎQßEÈÚ%i(Ãþª©è,KBÑ…å_š¦ f:å×ö2¿ ¬¸ifDƒNf­×ÿ­[²f]̨cEÀ>ppæ.XÕMXŠ»æã„1v:l¶Ü £ñ`måýÛ}mÂz­c“Üþb´^eÿ˜¥aÚgõ<–EÙÔL˜41u•õâd<²Ùi:ûkºð^Ü? 2ÙbõJ:KÈáM€7'̾€Š‚ŸÆ¾~¸ó^l¯gÙÙ~å^¬¼§vƒü|sÒ½ÿ¿g|ú ŠÉs·$LÒb2’ñx ;Iýëlÿbö‰ü#Ï?âPÑŽöÃAÙ½í +ñý‚è îNúðYË¿VïÃQ×Äf°I–³]ºùY.ÀùBìÛOiüoÚX)ÂÌ^@Á›Cʃ¸~ói=GI\ÍÆpëïÞxóævšn~ò¬fXêG£®‰¼“,gºuýAúù/JQ.í.¾°>\>ù?ÿõ?¶(oT݇pða,éÚÇœ G÷É»4è¹NÜ=K«2“BEþQ@7ÛwHæ¢Üf]M ëÃ!X Š…zׯû…KÆYY¼¥¼úáÔmqƒæú3½/|2ÇëEùDpý×ÜÂÓ/6åC0Ñ µçï æg/p²Í"™ŒÈ¢&>‹}gDÓ·º8Ñ`[t.XÀ4Ó_nœ>ãZ, “Ÿø$ò¬þ,‘gVø2“ù¨>7Û_’667‰?ù.VäaZ} 1õñÁw1ÄL½¾‹•Ž°:Ⱦ‹ †~ýïb^$óœë¾ÌfÅýðË>ïÿcñÿziÚgÀ—ºã¾ü…Àx·ƒ­ Õ¹?U€Âìz°k7ÿ¢ýÑ_°r+A]óYâÆ ˆmÌQes„6«·Ï/3þ¿òïž¾OÿV æZû"]¾üúöürX+íÌ»_¬B0øIþoüôË×î°`¯ªXì·7ÿ÷O³¿Á_àÿ´‡Ù©6Ÿ¨±ÃþE0ÈçV>}{šÙaŽ0õ‹yã¿ÑÝIœ¶’¹ŽUžÙÕ…íÍtgš.ÌÌê iž™å¥VÅ­†áNÝîe¶yBê©Â –iÇhS)4wl¸“t¦©Ló­CoxUè_ÒÖ¹Ý<3j'ÙÎm<Ó ¤s$M˜e³4ʶ‹ƒÛÜàŽv®ŒÆQÒ†íF©škªÅQ¾}å ŸWgo¬ú‰ZœÛ­ Í[&³ý¨ÕÐJs«vDêGÞäyÚ›ï(¥x¶§8c˜|Ĩ)¹A¡}V›½Ì÷¯¬Æa4ÓRœaªØ5«ã©•iyö¢ºú¦qú›üø…âÍcù^4Ó®LZ'ßWVo˳Wƒïrý;­vÉ´­êJ÷fÉ\/hVƒŠ›¢u5߶Ëc³< ¨.¼KsfÚ‰Òn<××Ë ˜˜áÍhíÀð檻h-ÞW&¯•Ò*L;ûz5hÔ♶ۻ̷N¢v-jV³µ£|ëÌò–1«Öª©L'W;è,ßÀ•\VBje;–‹Y­í&i7‘éÛµ«~jTŽôòÁžV ›Íd¦¯äGj~D*‡0T’ötg#€æÁŠ%³ƒ8íÄI;W?.4Ï”Â(™ŒÆ“Xîi,·—vƒiWÍvÌâЂ5´aÍKÓæ^"û8lî)NĪÃÏc¤«; ­0Iea½»`V–‰Lg/‘‹™õ ZÙK:©Lßôtgi—2³lãxzúM}v5½t~”mž»£Û\ç4bÖ" +¼¢§9°\'Ji¶;a£n——ÞàÆ휫™nypm×–ñ\7l×Óùmœešç–;.uBšT]»Ð@º¤FÀÉ«±OÚñâ<íiÞIqüZ)ÏöTÖ9ß» [Í=¥ü$^ › ØÙ˜UKЈ)øg2Ó‰›`ÒÙ‹ö“ˆ…„Õrš§™êÁN<Lô­Hf'–ÛŽg#VSuç¹Î-i\Óú¥Û{p:w1»c•æ Ù@>¤rcÃ;ÒJ‡ùî]}ñ^+ÍE¬dÄ h£4¢¦‰gwÌG#¤8iÒ6ÜÅYÆI?aw-ï8_;Y‘­ÌöÒÅt% ·´â>64í§ò-ßKg»[QÑÊjnH+‡ð€á,hù 'ôügØâ¿ßIdZGÕé=0Xäž³HäÇéâ$¨W@òGù:h¥iÊÅó R†nóäèîw @ªÎ˜”2Í‹´3ÛÓ+A£ªÇÅöYip•ÌõIã@+ÏõêâÎÍòA*7ˆÕÚønpñƒ;º®L® ÃK³¶ÊvÎ ƒø§š×™¶ç¯ +ýó]Õ he%7ε.õÒRuà0ŽCf=Bš1PV5h6¢d@ªgùÎ-­ƒÖ>HFFi +‹ÖW™Ö iú·Þümaü\)ÏËÓåɳLûÄéŸ[íÃÆá·‡\þNóf!»2«ð] QŸ&òûZ¹Ø¹iýT_|SèÞ€x7œ)ˆ­0 VÙUJ!½ +"‘éiÅ |)h½xaœrWjé˜Ô¯Ë³ï $²½êøE®wÐk»io/]1ܹV3ŽÊv”üäLš­I}'šjÕˆV ¦œÝD!•ééÅiX¯ï&Ýýt9¬Õ@Œ< +Zûi7žé‘ÚqÈnõFHo„ Љ°G©l"°M˜´àogfÕÎAªƒHgŒGª!­Œ#mà‡„ÝÒó#%ÛÉ•r é< ÚI2„e„ ¢/f÷HiQ\{Ý3`é½´Ôêµ1ª»Ì´ïË“WNÿ:j3¹·Ÿ,ì&rOCÆV„šÅñ`õ6ß¹J—–Aö]¹˜]ùlW@Qæºw@OgJq’ože*³¸‚¨¥y Ò¼p÷åá-­-•\·Ô>]ü6•ÅH3‘éš•©PÀ•8\Åîu}ñ2å ·ÒN" ƒfë§Ärÿ +`{úðÏýß/¿ûkÂí' +]³qœé³½l.¿î}c×à+àˆÅIWu–´yS¼. ^å»Ï³k8;oZì]…i”u„ô”â´Ð¹Îuohûª>}yõæßξ ‘ºá-¼ñ‹öñíÓŸÚ§?‡7µáÝïþérç×»FT­â®”Ò2Û8+¶Îiõ€¡½ +Ûmz38DQÒƒ?1 ÄKOÓZœ<Š>§›¬UœÔZÌ§u‘m>NäöRå8gÚÏ‹ƒ…ÞsÚ8O§À€(`k©Ân<³ŸÊ‡ŒŠá̈·"ÞRÉ ¢f3bÔA³ÓNÌj€îÛK•¶NP­•*°V‚t"Vc7]ØŠg¾ÜMoÇst9¢ƒí»¦r0U€d§ÉÜžV‚éÓæÛ7võXw°ìp¢-ÃâG­&È™­hf/áì%ܘÑÖ³“ˆ +¨’¦Ýíý*¨? g@mé aÀXn'YLØ#°ZM”.ŒoióXÅ*êÀؽí(yÐã&üj°«8OSÎÓdÉöVÓ³Ÿ÷Ó 3€@¶ÀPœE®}×X~Û\| à*Sêw¦·õù ³z { @{yâvÎs¶¿‹Xí|ã S[ÆhF°ù×ÎÚÇ?Ö¯HÇ­¦;¸†]¶@(¹swø¬±z3½úé‡?ÿÏ‹‡ß¦Ü!ig{7ÙÞ-˜ ´uVÜÕ#Ào ˆbvtŠÓ¿ôEjg9@øãNïöèæó»?…i?Jº·Ê6Nòíó „öEmò0<ú¦Ø½Häûfya–A‚Wfo[Ç?äûוéý7ø/õÃW[i §©}ˆ$*p2H€x¦ÿ¾¯”Ò´MëÇ´yrÞiã, ï€ lÄ~º¸Ÿ*„ÔÀ«|b³µ|ŸmÁ.Ÿ¤r Þ'qPO ©ËG6 îâ"AÛÉÂÓ¨½—Ì…T7fÕ g’0P> Þ*W;MÐ>Ȩ„ ¨²³›,µ0ˆ”ýTi?]J6ˆÇQÛMæ·BVÜjRå­ha'áf µSølÐ+ öÕâ$JÚ0gÓ[­l?׉í-Cz=¨xAB©Ì?f¶tí§ÜPÚ-ù$lÚŽ‚‘Ù?aQ³üc:sPONï&•ë¼×Ü™^‚µ](ùAHñ€Wa’Z~˜Ê´·’8ƒzif—g œ÷Rf‚,N`/²ÍëÖáOý‹?8ý;âÍò•éÁÕ¯G߃ú³ªví ß9­Žo»‡ïò½ €ÅÖI¾y¯6yY¿)ßû/œÑ+½²–)Í»GoCv иQZvœ\ÿ~~ÿOÓû?Òþ›ãËßx³W‘Ü0éLõòª<}U_} ÆZ¶}SʵN@³GIDŸé-Ê“õÅ×Ó«? æfªw¤Šðf¤z@êÀ„7…î•î-A{ÂÂÒúÀ~Õ™T¦/§·*Í^:ãg­£w©âh_«ªÎØ,‘=Ý‹ØM@ ´z X^;‰"u§µñ3Õì¤ + ›4w RˆTO’fwVˆZ-E?õÒÍ |˜Ên=vR¥°Ý‚WÀÆí~‚Œ÷•ê¾êòÙ‰çÆø½6Y±qÖš½ÉÔÎ"V'ºÏîjÅ™V˜jMÙ-ù»É(ÍG¿ðŠˆVUrÃZhõ¨jLc0ÇaöLÏ®Á‡eN(´/H…¡Ð˜Ý4ÜY¡} k˜ÌôöSNH-'Io?Y®9 n?é‚$L’.H³­X”oH+ß½$ÈÒ¼(‚pP§e¹êÑžê=Ò§!k;œ‰YMPÇÙú¨Ý´‹–Ì4·"Æ?lÅÁœ€³`{ ?³Í³lëL-M@Åk¹~±v8:ùÖÝ€Ö+t¯Ú¡RZ.vVv¦Ýb¾‚é+µ0†Ã›hä­’ùIÐê¦ +R;ª Ÿåºg³¬¹#«º,t/hó˜¶Ï”Ê*Uš•§/çÏþìÍ^€yeÔOôÊA¾wíŽ_æ÷ÙÎ-˜Ûð|”¶»€Câ™N¶}éŒ^gºÏÕÚ™^;¼0j©ü6ŽµÒŒeÀº HÓù©Û¡9ãˆQÉ6 °àœ±âÍ•òl^°XÝÞ]cþ6šiGH#‘ë&r=ø{·òv•2h¨lå :¼MÀ1ŒØß(/Àè§+á´—"mØ­°Öʆ»Êw²Í[R>2 +ó;ÅY€1Oc™Çû«1ÀF˜Ç è…È–½´ö,p˜À°æ™Ú!#a³1›`8Ê‘“ÌõòåE’4¿ +¨;ñ,°\: ru˜ÊNè¥i?_;Œ•/wS»ñl öÄô–@áZ—…öUŒ´@‡f#Q)L@㫃 VËð +J[ûqÈ ·›pv/ELN¦@N¶‚Š³Ë‘t@¸…À€µ›`÷ç/n_þ›§ñì?ì*;±¬ž-7—©LM&åDÍÚÓˆþ[¡Ý°b Œ_8&0Ãd®¦VPsÁÒqZhž¹í‹|û4–aG&×¾P+ó}­˜Ê·ÌÒ0W_æZÇ•Ù«|ï +6(—xax>YåƒÊäUuú"Ó8šÕ=ÕIigÉ´À" pQëøçØÎe²8(ï½éKÆEÙ.iœÕV?t.þÝ«åUwšrGARÏ´¯œÉ»üø]8§¼Šeº»ÒÒ= °]P +Ì\Ê 9ÝK»j~Tè\tÚIæh㤲üº8z€Ó¡‚¹äÿ×óí³\ï:DÛO“à^~pú`­ÌÒ\-Ža/ñ‡?+> À&‚¹°z®çvvDDج’†u8Ú#%?IÈ´§Ñ,Þ¤³¥i'åó€9LµË壘\Ó"`+eºÌÂòæ ‹Cª†ÿ~ª˜$¨YÙKd²Þ¨Ø:MP«ûJe+V ¥åFaÍûÕn\¡mË™DÁ´7»ÀJ)¢WHù°Ø{¶£ö¾Z²J39#S™îÓ0݉‚jå÷O£f@qÁàUsƒPÚÝ8´§2i3*u¯@ðn'òÃö—ÉO»¡9£Lý`—ùúZ¤<©…§aåi0¹R£z…–WÈ Z«¯uÐ<˜XÔ¨1¼çŒª“ÊÔ­Ò8hT@¿ÃçG­:Lþ%×<5«Ë¨áå;Gji§m8 {š4kÒšßç:WZaRž> Ó,xبÁàa£¢•ÉóÒð®Ð>©®^õ½¼´§ÉÂ4’é%Aâ~ß:ù!íL¬òpXvvû2^…3]Ð’•é›êê­UYN£½ËiîkµÅ“ ¶£:~ È?ß:ÛÍd) VÀ JnexßZ¾³j«„Yë¾ÉöOvµÂ®æí›UDqÆãóß oþl4ÏÀ¼ªLž¥‹ýˆ À£ [©;³XyõãíD&¬Õ\÷iÔÚ‚ÍJäààƒ”KåïÕ÷”L"Û}·ÛqôZ}?UÙO¬Û¥yX÷à,Ôv<¬1ª +ž0ë©C«g¤϶Áì…Md– 9Å…êù^T/›ùnst%5Ø‹˜Õfb “Õ‰-`Â(±Š£”ݦ]%3ŒÛÝ$í©ùØp.@&ëî ¤—óì+ð ]·Ú€ÿw“Ù RHÚ0Û"ØwöuPp £@3‚ŒrÚßüñIæ{öÕýDP"Àû}ÅU0ê`öW¯û÷Oƒ©p´ru+ßMg@*·4âvSφ'_+ù¡–i¹AÜ‚íhí¥óéLÝiò܉CJ-i·“™¶’ï“Ê‚ýÓO¯~mUç#™ÝTq6‚´¬êaçè{ö0òý ` ÚTJL‘±WtGïtwô$bƒîƒã dÇœSœeºùúþe ¶2‘ßO`äý”·¯”§¼øó¾îîLjNZûÉÜÓ0íÉô©ÑIåÇõÙ ·w¶64»lå Ã{¶÷ÓžáN +­S0Û&1ÓX)ÂÜ8ßtÇÙú +Dún¢p8D+ô`aAo…Qmø P½YžOgZIÚ€3±Jq–¯Ó>æ Ú£óÐ,ÍÀfÑ݉R¤óÝáòááçÿT\ÁÌÏöÁ)4ÎÜÁ]óðk«Ádhs«u¸cz¦7iÎ_³%Á.N¬úÑòâû?ý÷ÿçäò»­xÎvë2ú®R²*Îàe¡{WY}“,&ɠؼ…¾#׃÷JìTÞ†íêÓ()d–ëÖ♺Z)¥±ê g¯ÿòßý±LýQPS²­êøZ+ª·/pOéØ^Z]“Ê´v-íî¾eú®Yé^¾ùã‰å:ObÙT¶†m:ÓOg þÂz­:¼zþí¿N¯~ür_{P÷â$sƒc›(‚%˜Ê€?S…à:ÀQ!£–ÚnŒ'¤ìv±qZî]ÚÕÙŽâ‚Æ9ù8B A¬f¶4Ë”fÅú< å{õÁ%hϧœö԰⤬&˜l´zPŸ>` Ç|?™¤ò¡t),‚Ö"h´b}î4@±/ØOƒæ^¢_µ›A­²¯¸ÂºíLÝæ9Èê¿yT#jI/®ÌÒ¤4<³¥Q¥Ó5lmGiŠìrÞ.¥ò8’Âövô¯§å +XâÙ>ˆÄ8cà=ÐË©¢’k+ÙN®ºjÍ^e{WjišÌv“la«ðEé|˜ŠTWùΩ±v˜. ½ámeþ`xS£4µ«KÍe7+.ÍÚrW¯í)Uœ`΃¶¥¹¯¹º;&Õ¬s®w•tÆzy¥Í]`õâØÜvN¾«ŸüP˜<¤Ë‹â®ÍŒq­´§•ôò€ºîæuÊ]y£WÞðÀUÈð™V̪º…õfÄë¯ `@/=‰š_…”­¨©Â<Ç/êË×õéu{qH; \²U85Æ“ˆ¶Ÿ.ÂRÛ×´~fUb´–8˜?µ˜ä!TRËè¸6yÝ<ù~Wgˆ  »1w¢öNŒÀFd‡ÅÁ•];Š’vܪ†Ò 2[! @Ø8×»£}«|âÞ)îl'‘k%PU°Aa¦ÝŽ’žY=«.¿9›žÌtƒig+z9ŸÒ+Qµ¬e{ÑmP…½h&aXÒ1³®¼!Í™ÀiR³½G{©½h6mµâf ôã6@Çxv? 2¶ƒC§I£œ¯‚H³1³Í€I |ŒAî¥á@‘êã ¶ËlǘáAJ»¹ÚIH­“®S9zLîD2ìíV Æ'a²—,î2Ï*|Q%Iú–»¬5šÁ´Hkõ¢èz°Ž›0EA×´/2µƒ8ìÚÉ5ÀYÈù™R:¬N¿éœþ¶²z¯Gfi +¢#JêÀÃ#9èųCÐÚ{)GË‚±s±k¤2ËV—™ÆYuþ®4~™v§ÛiW¯¬ŒÊ +ä!œëüøkïàçÂä5üU<ÓWœ™êÁW¦ €ÇöVÝ£Ÿ +ýgJq#Z-Á’ÂܶÂ6sqgÇvõÌ®ž¦¹ƒ>–ÛàžR˜µEʨLv-Ò¹ ØÉc: À¦±Ê`’úY¶{«º‹‹ƒµ54ËÌ•_V˜é®HãB+ÎõâÎ èÓˆRØOzInw‘6àIX½4g!ZÕÝa{šÛe·#™½T)BºéâÂðŽâ™q,3ÖK‡´r·k G`­ŠƒÙ æ¶æ.â´k83§s¨Ë(v+mTÃÉbT­ï(•§2ƒ˜ÕÜa 〈P µ8·*‡¥îÓ< $ q­L:ÿ¸ü»ÇáG dhçG”ÝY¦io7éÆÀÖH9‚6Ø&¥Pj½^^gk+8}iƒDø˜p7– k ‘­áëÇAëIÐÚ‹ç¿ +šÿ¸§$‹èµ Z†-ØO™Ï!?¯ ë ¸Š”Që†3 ieг ÈÀ&Þa©w›Î aÔ›7ç÷©B—9Þá‡kwô¶¹ú1×»ƒ­‡“^›Ü˜’R·d{ó|ó4ß¾¶Ëò÷R.u­ÙË €g DAÇ<\þ¡2—r¦`ý‡÷¤yÔª³î-¾+Œß¤½%l–æ΋ÇÒì-°¢^dÛÇ‹¯]ų½€VIfû`!ÒÚ1¨'ØDÀ{Éì0Jú°Ý,wÍtlü«¼a«•Àb0—]å<™›ÆìÖ^"I{¹ÊJsz ß"F%Ó:%M¦¯ƒ7œ»wîð!Ê$g%É¢=µ8Û,Ó€ZÛI:*˜®º÷$¤á0jû `Ó%Xº8óç AWÕÚ£}¬r6 ÃCz+d´3«òè­Û¿·¼e¦r¨ä{Oc6اûZYwÆZ¡Oʳbû*¦WÒV•º“í°ùd_Û¨Çò(ÀÔÖa3›6’´»Ç¼ @{Fa–´{Zf ìôwO£ÿ8²ËcüjWû‡­ôN 0‹`ÛO—“™Áv¢øU¨…Y*;Le§j~^ì<ŽõZg)Òù*`<Ú×€Q£z]¡}=?×2CQ`P€f|²ÃJ¹ÔGo7Yó2°Ù~ŒeÐUP¦°; ·“™þvÒx&ìrV#UzɆ”r¦zê î‚<\6¼¥é­`˜§ Oâ™í´oeroU£–Ìöâ”i¨(Š—–Šó\ët'I´¦ºC«¾Òk,T”©;Ý«l÷&Y`!•t®¶*»éÂ^º+™Xõ3µv’ÌŒOÏ~:ºÿCÀªí«eæyÈö Í3Ý4ÕÞã_Ô™=@« Õ=Ì6Îugª»0Ï£xv`:³gïþåæý_c´µ/n'Á¯ùŒæàFÏuzÙ.Mö4÷«¨¹•*XåƒÒàÈÕBï6f7ˆ,:ÛŠS€@Q»—Îiç$™_ÈM“6Xý[ñ|@+ÃœÁÆÏ–2å#-?mÀáiÒ $s`šRe£8K1³6Z;J-jõ»³·Ùòh?IÒ™æ¾ê†´ânÜÚŠèpœÒÌ9C§¶|Ðø•R(h*€j;B¶c9`‰lý$ÎD¨•4Ûvaa»+VaQ+ÿ¸z´«ïÄ2ÿjW&JA&@J1 þYN­_$2àވga³µ§Ô¶Så}µ +lÚÁëÞ‚ÚK¾”é^<¦å“€ŒgcF9ýÒ¥°ZQX†Cy; ú½¢g»j¶ ´•(€ý˲‚Õ.ìÂ´Õ +·T¦¢f'A·Ât/á0 ± ¯¦M +lÏL÷I”>;"YØNC&T`ÇXU¹U;Þ×ÁX°S´ž´kZ±€mŸâÁ>­ïíúê«8’N¶y’­‚ü[-8ÎQ«'=ó +©ZÅÈŠÙL姴qQèÞôN~tç¯v4€¦µló lí'òUØ|£!£ +ö/Ú!½¡ä§p·'DŒ@Ú´¦F•éÃüæçáù·`®*À´ 8DËÝ¥îÔÎha”¯­¶`/F»“Å…òÍ“BãˆÖV¾3j?íjÎ4•ëçƒõ4 <@À\I+æ¶Oëó;Ébd¦Úà·“p€6ì3ÍRîn¼ðåŽò«ô^,·Ú|·HÚ¨æeÊóí}Töâ”1€^+¥ˆâEi§Šap—ñåV<Ì1¦ÕÌì0S=C2”öhi–«Î¸vfÆ)¼âi˜mKª‰åAÿÕVôñ®,jå:F®›¤ý8’tXh?MäÇrûz=–a®î¹Êw.Ù!¨0+üÿýÓ¨Ú¤Y‹ë•íh.r)Øå⣠§O-•\L]85“¹!€j0²"´ÁÐHi§¶ì„‰,Þ€î˜pK–@†¸w: ?/ öŒê6¨~£f®°ê;ÉXúåÁu}ñÊß'óãˆUcÌψáÆi ö´j¾zZ½0Ê‹}³º“r›³×vÎu{€yÆà1ÒÒ +c0gLw¥m0õò@w¥8µ †dÀ¨†Œ:üç.€TÄãv*¿ÏìzÔê´zLk'`ÔÀ>†U@&„ta`”—îè¶Ø»ÒŠK»zRî«€¶#iÚ&`œ‚T&´[€‡c™!@âRLÑ>ï´²„eQ +3R9¶93IŒ +œP  öŽD1®ÀÑc¼;¿Ÿ^ýú+·Œ-G1«½˃žÚKU÷•ZŒÇ6·¢¹Hv+œÙ‰fIçi8ó$DÉRܨg«+àX€ÜI–Mç<è»1ÀHŒa©«ûiçi”ÓÅ@<@ýñ^PØòÀ«1½Ñž¾6œî?l¿| ÃôbÙ½xq/îÀq(eW`£}¹Ù‰Ø`Y=«æF Ûiý ˆñG‘ÜžÊr«ÜvØŠdÂl5Àܳ€”Zégd ½òhOc©eÀÞV“åwÙ]»vi˜åÀ†t~ •–´uF›'I8³Í£Âà*×»hUø*$‰îÎà‹F©UvöáW§& ù\þ6×:3=¾ÌTNû¨Ø=É·Î4oeWVvy‘o+…X‹•ñsR=3Í,Í÷ôÊ®˜¹¿ºù­-“¤žÎuvÔ;5j-b÷ŒÒ"Û<ØÀ^ó–A³õ$án%\@ò6 âÎ@z«€íK Ú¤~¨yó(àg掚ïõÚX=Ä + ÷¶Óp#XyÙî}Ðh>…Û*$2í\÷" ®ìk éÂĪe[§!ÀÉÙ.ˆb°n¢f=I;ZqVhßÀ·'YÎUG¡­\NÊ¡æ,õÒ*L:ñüÌÏíÔþ ¨,Ç;p—á-Ò0a»Ë€Š¯í&rzq”blÜIäÆ!« ‡.ß¹Ô1ÛH‚ze'ÁÙÛñ°–Q˜ª¹1#ãΉSf˜¸‹…–Šs¥0Kd] YŒÕ(­3ÛQ¶D5{¶Kœ‘Û>¤ó!Å¡•yeò €'”ÂÁ<„OŽ³¨Ó0ßXmœ“éÁš•cÍ;ˆÃ'çûÛÑÌ^ äªý(hÔrŒeÏv­òÒÝW§÷µé}¶}‘€u0ka­¼—ö"´V-i纗ýó÷åÅ=XCåéóLç–\5¿Üü®zøM¦}®¹c5۪͞“æ)H ³ Hc–ïž{¤yXÃÊÏ ÝóêòE¶sìï*Ï_vO¾m¾)Mž›õc£|P>`Oë ŽaO³íÓB÷lpúm¦}’( µòݺÊöŸ†÷™îV9}—ïœ×—/ÕÒ¸²xS;øÖn§ÝižYÀ¨µÃ|ï"åÓÎ0žïiÞËwOÝÑ]eþº4y¼J*G&YÓX¦¯¸ T£²ê`*Î8hÖ’¹AŒö@†³ª˜¤vd”f ¯c´µ*¤²yž.ŽàÃHõ°2~VÞ&´*+Ò8J:“ í†( 8uÇÏ‹Ã՛킪À°£vhÔ ƒëÒä™Õ82« xǺ7JúŠ3‚5t·¤q +ÓÐË‹ta(1AÛq³ž&M¬ Ò¤pÖª‡`öšå%¬¼^Z(ÅiØîEà½v ~¢§™Úq¹wFÜ“hŽ°\Üî€k1[;,®•Ùmi|>{öcyz}<;´ë'¤qaTÀÆ9l /êã½²ˆåû¹î9ðÏNº _ŸJ-•+£·«¥ÁI:ß±ËãlóЮƒ'ºØÈw®bU&»é"å ù6Û ËÚÁËlÿÊ›=ÔW¯òƒ‹Bÿ„6—Îð¼ù]ïú×ÅÑu¡wVê¬îWè_j¥)¨|ç fèŽAœåúç¹öiÿøÝìî'à´”3n¬Î__5ß4Ž¾&ÚºÉ4N ·¯9ýTa˜mUfÏËÓgÎè6Uš²Ïé_“æ‘Ý8±™>÷–_WVïêïKÓNçluÿO•åÛp¶g×k˯k«÷¥Ùkwò`ÖVª;Jäºp’yZwß /h½ë¿™Ëa²ísøX“`qèî$b5¢Ó«Éü°Hµ8²Ê‹lã´6{Uè_ÑÖ0jeúŒ6R…^¦}–ëœÁÁqÆÏ`¡:'ß4Þ”çÏõÆÁŽ^K䆙:<錟Ã?S…7º©¼mÂç¼-Žî:§ï«{à®LcÞ;y9ºú®±z‘ÊõÒœy€+ 0–ÝÞ¹æ ‚:X(U0€í‹ýÛ\÷ +ä¼½4¾cå!•ðgª8Ô½Eix7½þy|ý³Ý:Q§,ô€V‰Ó†áŽJÃëÞÕwÛŸ^ýéöçÿØgÒö‰Y= +Û €Ž2­³êøÙüêçîÙ÷ÅÑ3P:Q8³®åzvm èÈ®ƒ(8n,_vO¿n¬^–gqÚM‘í\´O³µoò¼º|È?°èöØ(ƒù¶,¯ò£;gr_]¾\~?¾ýѹÓÆÁ}uõPY=4ŽaošG¯à¥Þy¦s¢–&vc•i3HV[¾êŸ|wþöߟýïº'ï¼éólï2Û9-On*Ó»ÎÙ÷µãG·)M4wkÀ¡ëƒ”+®AWVoIïÚî\u.~.Ož¹ÐS'ðÕåå[gú¢0º/ žuV/Ïßý;wú<@š°q õª‹7…Á-[íöKZnƒlLºQ»b–úÞè¢:»n½ê_þÐ8|›é]U8)710„Ý™Ua*Û(¯_%s}Ú8f0Ò™raÅD}ëðýàò§îÅ÷ݳoà,W¶}'H¯.IûØܹ“gý‹_wÁf9£ëˆ]׊€-YʈëÊô%HÚÎÉûéÝïo~ýŸ†7?FWÍc˜ó«ñÍÏË7ÿ¼zûÏý«ïËÓ»æâîôÍïÏÞýyþü7fu™m†7¹þ…3¹+OîòíãááݪÎÄ\7ùÞuóðÝâþ£ÛŸë‹óÛËçñhÕ©7¾ëž¼ï_ÿÔ¿ù™´ÏRÅquòL-jÁ,닇òì®ñÃñ×½þÍî\þ88{ÿã¿–'Ϲ™;yíÍ^—§°‰ß¯^ýÛúá7š·ØK; 3-gèöÏÚ'磌×ÍãoV¯þyt÷;àíÖêáàæ{°œõõÒ2ß¹©®Þw.;}þ—Òä~xúU[Ag×V "ºg?/îÿùþ·ÿã7ùßžÿ/÷?ý‡úÁ‹Òäfpõ}ÿú‡Úá«áÕwg_ÿËÍÏÿ¹~ôÆj¬Ìê,Ó\VçÏ+ó³g¿_>ü±yôæá·ÿÃòå­î±Õ<¨Lo›«‡ÁõÕ“ï›?9ËWîìþSu{a˃߂`™<üeüòߌ^üeüð—öÉ·goþÒ>záM.:çßVWo+Ë7õƒw£Ëï^ÿypõk`t±\K+Oà¹Ãÿ‹¤÷ðrã:Ó>ÿ‰17;#çT…B€J¨ +…BÎ9‡FtÎl6›¡EREeYql%K–4–£,ÙʶeYŽãñ|ßÎì9{v_hÏÁá¡ZMàÖ½ïû<¿§Pu«NÆ&ü¥µ`mÛÄ9D 1§Â<&J„—骫be5ZßÊv÷LTÞÊ ·x NE'¡<¤òF¨~ŠË,™™ì Ž —§c\nÖmãÁš3ÜAÅ’ŽI""4`•ˆ´ùÜÌp´}ÊîÍkí¼‘5ŒÑ¢ÂÉîn¸µ¬­G'öüÅ…öÊ%pÕoÃ@m­°x©¾v­¹~­Ü;C…+¸¿ äçLL +ð¯ÿuy°™š<mn‹ååìÔ>4¾Ìê±x’ ¢d´#•WSSg’S»±æÆÔ©[ÉÎ&L²Æ)Y=)¨:&3jïøJ+žät´uJé”T6Š —6>¨±[™¨T^.®Ü]\¾2¹}ëÒão9¥.M¤{W}…U#3³EG°eæŠj":bñÈ踙+¤£U69Áçý¥U^­;&åz<ÿŸÐ¤TÉLìQÑž+6ë«lÓ©ypöÎòU•1ÐXŸ¬&ƒÕ­Pýt¢»®¯÷¶nÍŸ õ—¼é^®w¡´xP\¸ìž*,^©¬ß,Lž½úÈ÷Äò’‘Špñf°²ïœÎÌœ+,_M´7ksgÚ;·P>•™Ø¨¬\k›D¬›˜Ú¯lÜ–:çÜ¡Ÿn8Y !¢þ²3Öes Lv6X_5·¨x#Þ^ò•ç‰`Õiš¹m0ñ6ëd§/û «z2ˆøR\jõ¥1!: ² ‡Ìe"õSÑæ-³Ñ +.©xG(.xss¡ÊJ²µ6µ}£¶xji÷faáíüÌ~¼µªm +ÅU‡X/Nœ)Î^Pa>(Q(‰Hs'X]ó—ò³Õù+[—ŸH¶·•DØ 3PöÐ ÎØ,Þˆ¶Ï;ø¼Â•‰²SîX“ÏÍPñ6—êFª«x  +.]ïËL†k+þü¬SÌ[¨¸abbϪû²3þÂ<ê+ø²=©ºÌ¤§Œ\ÑkG›+b¡g÷¦ÄÊ"© +Ùnª»“Ï&Û‘úòÙ{žr=˜‡üôÙòÊõøÔ~ ºÆgfìBø6ZZÚº?ŸQÛiw «Á±œ-.œKõΗFE¦ ÞP¡"¨ä|föZjêÀ[\÷V6¼ù6Ñ fcÕ9¹·ñ¦00š@Î$—îÙÅ +îM%j˾ô”ÚÆÃ6¿L¦úÎëIM[èQ£Ûà’Œ.‘€µˆN€lÂØ­Ý`ó4Ø%éÀä0‰ªTžñçøì4¨J¹½úÐsoÃü¨>O¬Q˜½^ùÙ+Pxl®—¬.Þ¼ý쵧`¢£¹™½òÊôì%èßüü•ÂÂU2:±±wûò#¯P‰ú€Þ… Ð3Ru-7{®³uO¼³S™Ú¹óäkÁú +Ô@¼±.U–ƒõÖÚ•‹OLî=Í¥—J­õZï,êÍ:ľ“Ñ®PXNMolÝ™<ûD|b¯»t®6³ƒð)X5&Ùu†ê®pCÈδ6o7O=èÍα@ bÉÌÄþ‚](ÂŒi\Iµ3áM/$&Në]€‚awqôÊn¸#õTsóü=Ïå§N™ØD|ò ÜÚË«ù…ËÐ)xlÈÐJ'ùø4tº÷óñ–ïU—šë×33ûˆX³²ÙtmsïÆ (÷¥Zé‰S©îYG¨I€Œçæ}ù:Þñ$&˜XKf¥õ°Áª¿°BQ™¿¸rðxzâôäâ¹îÊÌ—†.U¡æó³çöØ¿ï9)?;1·{ñö³P6Àz2aèZ,ŸŽu/Å»ç™HsrñÌêîuo´htùq©ŠG&ÉÄ,ŸY(-Ý˦ç4¸DFš|q êŸË€=tzæMÌÏž¾ñÔäæ…Ý úi¢RÚ¶PYwE&€Õ _yùÔ½÷>GK5;ŸÊK|iE¨lfç®)AÌ]àæ¼a]2ïFjëÉéóRó ›]2»bùÖŽ[ÊÉ'ÊGý…¹X}=ÕZK6 SÛ@ûƒÜ)f•puK,®€‹9ÕheayïþÖæu½S +U—Áøü|bꜿ¶A&¦Ü¡úÚî=;×s…Š'tN"Ð`’“îh“ËM''wåÅFo÷Å7~žéî8…lsñ wöÑâÚÍúÚéÝŠK7 ±¾qúÖöÅÇÁÝ€7àCCÕõ@i9\[KÏœ‹vNãReéÔæÂY‹'(-žÌ,—™6¶›·S½+L|ªÒ¿r,uT à¡BÅÌ—Mq­@a^L5âå9ƒ;è”J$Ü`ͨð©™Ôä OÀËøÔ90J+s†*&>?`†Q ªBnYŽz5˜Ï›h“¡jº»•ïíñ…y3_4‘©haéôõg\Á| 0]œ¿ïìR©\,¢Iš<™@qÙïjqîO»Ã5 +º&Ò¢#õ@~Î%Uj“ÛõޮݛI4× +sçr3ûÙé3…éSéæ²'T¹~ßS¯¿óA{íʸÍk$c—óf„Ò–¯¸NŧÌîèÞ¥‡{î­P¶ceÑÖn¨µíì§{ײó7ˆü0Ué“J‹#FzÌä„(ÕAÉ—2“göx¼›Õ#åy…7{2@5. \*¯LoÞì,_vð™Dm!Pì™Ø¸ÞG¸› ”Ö¤âŠ9©ÌÇÚwV<Ô¤âÉx µÝ3bÀ6äËt²“;íbmÅèIÔ»u„Þ)@#Á²]ðW6bíÒÂÁÄéÛT²‹x‘~ÔÍ÷Mì™s…›2l$C\fÊ<77s&=¹E„J——–…Ü´T[uvCÍG¸mrG¼ÑÈdÈÔl¤igâz»–*ñÎv¸¹A'ÁA¶Àïl\Ü›žpG¨Á­„‰%½;8nã´vayçk·êñ Ý›αç0;ÏÇë±ê¢ÌÆ„Ë õÕ[ñîE&¹˜Ÿ:ˆLìâáz´²¼vå) —þêÎŽþMBN/‡ºW=éùm"C¡Òè;È„þ‚75åONzà ˜«l{;Xß$Â-Ȫ&&«´ ÑàþZeþŠ3TSÚŸw†ÉÎn¢s +^©öiHÙÌÔÚ¹¬® É_ݤRÓüµ­Û•Å17g&cÛU¦·Çû4HÇfâ§8Ž°r„s‚ ö/x3 Ô¾â²TÛtHµ1³G‹K—â"å!¦°2ˆ7o*),,d´*¨ŒèzÌC‡rL¢Æ$š€7‹ˆPCÈͲ±–KH' +3Í•K|nñe_Ëd¸í v˜ÔT#,g°0mnF›‘ö¶-PV»$R* ™Iµƒ“õÞé;“§ +7O9¥šŽ`HÊ,PÌÜ ™M¦'P&ÆÆt¢åŠ5Ùô¤– +Y=±ìÔYXM—òef½Ôän¸ºä– +V&4f¡‡4N™‰9©²iq(ÑT{'Ò؉u/ÐÙ9*ÑQÙ=®@1\^¥£SF& kdlBJ‰ÆJ¼µ!³ó*»×íB©ëpÑ&LBºÍ“vÊî`U‰ð‘Êzeñº[\É´·¸ÔŒÂ.°þüâÎ >Z6¹Ù̬XÝNNzWéø´…/꩘KÈ­ìÜ-&J…ùÊì…DcKÈ-€$çûâ|ç4tm5Wo¥§ød”d¨‰ðy8ÒPÖ9,d˜Kv™X'Ó9U^¸lç ã€Ü\ìʽÏ0² +¬l +÷q?pï|º»_™»¬03R²UY¸ˆøòJ”Q#´Ñ)ªû_ú Ž  ¨,Lcî<88„qÂ*1¡Õ(6_vˆ“jç×Nh5ö€;Ø>&3¨Ðq ä ìr‚MN.^âò“2«u‰:WH…Ü¡¶4 +‹3B µÇeæ¨Ì„Þ–[<wÈÁÇmTÀŸn»# ž¤OÃ8GõNÝçôæe¦c#š¾JDÛÁÒJ´¶îüv‡ ÎP¼¶‘<«Å&*ì +5À ópoaÂJ„†€Ì%;(Ÿ±0 •°zrlb:ZÝÈMîc|Nióñ€'\WXi ÊA×3±.P%éÚÙ¬¬T–ÌØ?=•s‡;ÉöneþjqîJ°²*³y†´˜Òì–™;qÆŸ›ó'Ún_– ”  oºëðå-dÜB%P&¥±°¥ÚÂêþ*;whP5®µ›%–ÙPCg÷¨q{ùûïÕ'7²1x‡9Or^Ì­Š¹¥þfJ”‡äåŠ (˜XP* î·yâ!ÃH…‰…³beJ†‘&F¢ã5w´baE0H­•õEÛT¸ïez·s®D<"zâl÷e`Ò¦×/‡*ó®hÕâMëé°Ñ-:ýi©‰±Y-âÓÀ"¢É%ª0¯#XG G°-–·BµS*6b$È@ð õÄЭ(²);“Bé„Öæ5Œ*Í»abd°Šùò@JÄ‹ EèGH©c&ÒŸŸJ tjÒÂÆ!4iP/%âµu T¡Cj€´;ØðË”W¹X· Œ3¹BÁüÜ %‚xbL´m¬ÃØLtBnaä&‚$÷C{&»û¹™óéή˜_´²9€Ê±1Q™‰PÛhø äµÒÒÕTwß“˜b>¡Â´„`å6>f÷¦É@MHΈ©Y'—AÜA;;®°3ɵvµÉe%$™Þ= GG4¸Ë›YÙ¾îOŽš­®tÊeíž\ÿ›/"8¤!`>¥ô J§OjÔàPZ¡g\¼ï,§§V¤Ú¤Tí¦:³Íµ3Ûçò ÛD 0á‰7) ÙHËFE†õ¸ÊFYœ>§/Á„Kl¼â f\ál ßÚºüP}u_,uÌ\Øê‹s‰r¢³À'd(ü¾7œi{"¥aµÍFI*4n¥%ÈøíÓdjFO…q_D,v¨D™Š¬BTéòšù H§{ bsÆÀ”ä V0iVêè¨FfrZ€Ù%Û;˜/l"(;'‘Ñ‚…q1æŽäP!îI”‹SKµåm2YÒ¸|d¨NG;FgtÜHÒÑ+L¤˜™ö&râ»ðL(.ºã]4P1Ðqðe%ò©2挣n¹ƒµù‘úš™JŒhˆãÃ:½…²»$;2`>……3SjÌ焬œ„¤Æa „ÞöåÖÚ9*^<®·Úh7PPlÂèŽ3ž7«1C0:ƒÃÇWw0˜·ì’šÞtNà¾LoûJ{eO*w´4hÀT¸Ç)#bVf§­L@*ÍAXFø ”´Ú.˜¨L²u¶8s‰ +׆¡6l4ÊF½©6D‡#ü—˜‡¾×Â6VÒ-v6_äâ“C +û¿‘}ó¤ÖFE=ÁªBOP1Êõ´Ó[ˆ•–‚¹„É ©2«Þáµ{Sß3Ü5¦?*·ØøôóûŸüN$7qLf;!w‰( +f—ÇtԈʮµR—Dè¤Öîס¼•”*$%ksëç¶/Ý·|îæ¹[Üûø󋧮¦÷’­MœOG¾~T‹»ÅbujzakãÔ…sWzìÉW_ÿþû|öÉïþð«?ùðãßþç?þóÓÏ¿|íû?yø™—§7/FkjLÒ#‚O*±Þ˜N*í…ý­³W÷.ß¼ýÈS¯¾õ“Wô‹§_ûÁ#Ï¿òÆÛ?ÿåGŸ¿øÆßþ÷_üý?þùÒ~yç™×—öï‹{¹‰µHeš¦Ãébgföô¹s·nßÿø3Ï=óÒ«o½óóûǾ÷Ñ+ÿþË·ßýèË?ÿýÿþþß?A‘þå~ù›«?›í®q±:¦g}R"]lL.®Âkn}gÿê==ýÂó¯½ñøw¾ûð‹ß}îõïÿô½óÑ'_|ñÅÿþ¿þûÃß~ñȳ¯l_¼/”›pq9;™ä#PiYï 6Æ#Äså‰ùõÓî¾}ó‘§o~ëù»{~ú“÷>þÙ¯?úóßþöç¿ÿׯ?ýâÓßÿñ;o¼ÓÛ¼pˆóy6ØtðYO¢í‰VsõÞÄüÆÒι«÷=xßãÿöè ß}áõ·úþ'ï}òû_~ô»ß|öùŸþò×ÿú_ÿ Ýú“_}öÜ+?–òÓ£× ÊÊ9fp«ÞBEI1Î6gVO]¾ÿ‘+=ö­ï¼öÓß|òîÇ¿}ã'ï¾üÃw>üíçÿþ¿üàã?þé/ÿó?ÿóéï>æ•7·/Ü då—lc:»a!–$ŠSµîÊòÖ…ƒ›ß|ø©—ÞüÑÏóÉ~ñþëïüâ·üËßþó¿>þÝç}úéüçþâÃO¯=ðD®³./‘Áš¢¿?›}HŽb¤„ÓA>XH”gò͹B«7¿sîÊGÿí¥×ßýà“O>ÿò»ÿþó_}ôÛÿúßÿýåßþñìkß¿ùðç®ÝaCUŒ+Øq¾ZŸž™ßØÚÙ?éÒÕ×ï<ôÀ›o½ù‡?üáË¿üå£O?{ï×ï½øêKç._™\X fk\¼ip4Vu ¸ÛËyÅt¦°´º}ùî;7îüô³/þúXŽw?øô³ßþîïÿøϾøâÍŸüôê;­…M>^u +)Âs{É\µ5½´¾{°zêìêæ©Ë×o¼òú›¿þàÃ>ýý;ïüæúþGüîóÏ?ùìÓÏ>ûøÃ?zéõr;YŸµ¢…0RÙ—š²‘Œ øÄD&WYX^¾ÿÎC¯Ã8~òËç¿ûæÏßûÍ—ùÛßþñÏ_üá—_~ñ«>xñå—Ÿ{ùÕ…Ó—©PÑä +‚X¹Å«ycåJg®99·º³÷ÐãO=ûâËϽòú·¿û½Ÿ¿÷ë¿ÿóýîË¿¾ûÁÇ?þéÿôå—Ÿ~þÅKo¾}ûá§2õ%-&ŒéœãBi¢u¨$"YîÅrÍ…µíÛ=õÔK¯>óÚ[?{ÿÃ/ÿú·/ÿö?{ÿƒ?ýôË?ÿùó?~ñî¯ßÿø“Þ}ïWwbïò­@ºŠsa¹É>¦E)1ã fýábwvíú½¼öæ¿ÿì½ÞþÙ/>ûüó/ÿò×÷‡_ò»¿þíoð>ïüü§?{÷ï¾ÿþ?½vþVgó*.äNÈQ•Ù£6º 6R®A¬[lö6÷®ß~øù×Þzñõ7¿óÝ7~öË_ýãŸÿüíúÙ{¿ùÕ{¿þࣞyéåÝ W¦¶¹H-VYõð‘\±™.TcÉLubÔ|cjbniöàê¹[wn\¼z~÷Ü™X6Ay+îÔZ =B©Ñ15"Ó¢V”|‘D<_,5*æüÊÚÜêJgº³µ»výæ…{ùÊþµ[ëç.•&gX)îô¥=±ŽÓŸW›œZ³Ód'­v—ÓíYݼ8³r*‹çÓ‰å¥Ù½ýÝë÷Ü}ÿ#·øü÷ÁoßÿèãO>ûø©Ÿß>¿_™œd*¶BtE=ÆL`eãüæþTm2Q¬5›­ÙÞÔ©SO?ýèÛ?~ûÃ?ýì÷¿{û'o÷õW_~éŧžxðö½×–W7rµ)Íì2;ýj”;©†\ƒŒj1•ÁA’|,^š_¸÷úµW_~ùÕ7ß|õÕ~ùËwþüç?>÷í»pîÔêò\¡Z‹æËFÌ=¦µÙÜ~x¼ÞÁ[)–)ÔgfÎ9ýàÃ<ýÌ“ß{ãÕ_ðþç_|þ—¿þù½_ýøÉ'Ý?ØK²Äe°{†Ç´Ä¡å‰QÓÉq‹å1ë“ÎTwvníô™3.^¾zõÚõï¼øÜßþÑ˯¾òÂóÏ=óô·^yù;÷ݼ±¹¾N-.¯ÂêTÛ(îCéP0Ýa endstream endobj 80 0 obj <>stream +Å”qû¥ØüÒæ¥ë·Ÿzæ…‡ýÖ¥+7}ô‰Ÿüô?øÑî»yéñûïyìÁvÏîÍ/.”ªí`º™ØfÃõ¯.‡v€/«-”\ƒÌÎp,·¸¸vùÊÕï¼ú°ÒcO>ùàÃ>ÿÜsïü콧ŸýöåËw÷æ—¹’ÝÅAœQZÙq >®2kL¸Þê4ÛIZLRõ|}¦1½b¥X5‚éì.¥Õ%7°Žf§ Ó㇎Ê-kvxuVÊŠqˆ³ÙcY_(íã:¢1[µu1É9„”å5¨Ü@˜ˆ€÷ ëÑ#cªqÍ„2Za@(§ö¶S<ÅòV› ðP$ϤjíÎâöÞIJ/5:ÈQ-2¨±Žê1……Q˜èQ1n .Ês(0ጼþ ‡÷y(–bñh®TîÎr¢†J•j:•b)ÑêÒ¡¬ P:ÂÆZV&öµ•ÌHÒBÞÅ&9>œK±„äD¿Ð›[,—³Éd¸\¯ŠÑ ÒNlTÌ€úFUè°Â2$3žÓ ŒG´. ï#ùL"Û FrñhúàòµõÍT"R-•2Ù\«Qo×KÑxNk¶99`Xa;2 ::¨¿Œkûwâ#D€ò¦x1!ERX– }:£ÕIòb(çñF£‰B¥6U«Oº)J +ÅX.hµ32qLiïoÅ`å¾<éÏ!8‹[gq¹¨ /R†¦vz’©ÚZcáryjÏÍ…u=Ïñ¡PŒf}&„ë¨"BȧÚ{d°=¬rüßÒXy3!)MnXe ÷ø|Á`(†CÑ,Eyì6;îpÓ\œÒ\ χ«ŠþÍ ,mþÒ7Ž*ï3€„j-n+qp©h®;»sKŽx Þ¢Lã2&gÐì +©lž!%b°ójÄshPq×Iå±qã Üf@<¨;ÌÊN>ã ¢w¨¿'‰Ö"‡ Å$5"Ø©¸N*ÍãF‡ÂJÖdgUfBf Ìtñ¥ 1ïÒ*3¦6c@P;euû_RëàGN“+|BaûÚ€üȨXW‹zû7Ô> )Žcz\m¥GÔˆÜ`×ÛÍŸÛ›˜ŒPQ»'aÀxÊqxÄÃÃòãƒZŃ#°±::e¡’ +Te¡ÔrPfÕɦ1™n¬ÿHœÒ8å·`´ ÷+Lì°…±ƒ¢M¸¤6Ó# +›LïÕS£F‰úÇÍ&X\p¶5·zV gFÆT8d:°N§høQx‡!Í€ÌbrÆÌÿç¡áã£F³ÃÚ5¦u*­ÂÃx ò=ѦÎî=)3Qb 7GC<÷ç¬vNcri D¥¹ŠþÃ*x+•6s%r¥¿dt‡ä6å‡58˜¬[jPÑI!¿*W’ûTdbP‰XP2’jêlì7ŽŽöw´ðÐbµ4y6Õ¨?1f6ÛýÉÂâ’FÀW%„ËËm‚ÌÌÉL¬™N¹C"PW£‚‰ðCH‰7OyÓó&wÊfÜÄ3‘žd±½«G…»N¨LîˆJàl’òð“A9òÍ£ +¹ +iNž2;C*‡ÅÕA+tKM1·‚ó¥a…c& åOŽ›OŒèµÚFFýËMkî`ãò‡‡L”spa+>¦0ë\_íZp«\|"ÕÞöç¦6Šùr(—!C w¨eñd•˜$³ùËírZ¬ÿ°ÅJ„Mΰ >ë+GÆÌr‹adØi™¹Ìˆ™V£¬-vÎ`þâ4”ÍcÀÞßbªZftkÌÄüÚ~ufKaqiÊe26:íð–þÓA…=R +ïÈvH…êìý<åðW<Éêš)Õ¥Cåã +s߂ͤ÷›ðÎç¬TBƒúÜŸ(ÌZéØYa}Õh@‰ˆ +«uT(w×Vcc-Na\‹Éõhê“°èZT¡’ý°Í,̳©á¨Ì<¢wéÜ *Ô +äfP.=öÕ6#jT„ÿkr…lTtT׿éÆáÉ!düë‡Ç—Ñ’RÛÁ—4ˆ\GÉ1Hñ@83’ãfÔèV!^ƒ3¦'¢zG°2}&^[Ð~Gé´ÍEÜ1›;®²ùà_ÑiÌЉ®»¿ÁñeWêË÷Gj; +›On¦0. j0¢g Ž(î+QRÅ#ݾ¼Ó[0;ƒ2¥µ‹Ã*(lÕñaÃà˜å(ü)G@é@þ¡ÌìÁ¸ÔˆŽÓ;åF +ÊòÇU'F­ZTÐÙ…¹køĈÎdç€vÕî“ú„ÊõÍó]£6p·ÞòAeñµ}ÈHZ½egl†+¬‰•u*9‰y³åúòò¹´dhØä6ÑjGØàŒcÞ±ð  +wB†Â!t¥–þ/ý-¯q_ÎäòYٰٓÐSQ›/‡KEµqW¤Ãg—pÙè +Béj?JGÝBÎ%æ .Qíð©lœÅèïߢ=4¢ù³wvz³6²ú<$zLcT!rÔ¯u%¬\Ùá+;…¢S,›‘”Ò•6µ3:Cfw ª‹ –gVP&vlÜ4¨°°€•MΡž¼‰Šé Ô),m_’­#ÃÚa…Uc¦õvŸÃ›wðyµ……A:Å¢É<2f8.·k1àUsk:\D<‰úÂy"XéoJsL îi $‹3LKo|Bad†ÆÌ̇0±»†_½Ì‡†Í:,ÄÞhËÁ§œBNaóœ€@atÉ-Œ™Œ;¼…Hu³´p a û˜ls5ZY×ÙýCjæ|X謄Pn>:¬b2sÞÌœÎ1zFm>T¬ë;Ùé}\(Œ›<66sŽ0 ™Á©0¹FUý½¡­[ŽŽèF4™Ñ +&¨Cx¹RâC'H_kþ’‹OýëQÙ‰¾˜ð¤¿au%¿º¿[<4l‚…鉻NÈGÔ¨ºÿÅ¢W‰øìþ + Š˜l“áÒq˜(LÐQQ£'E§¦­¾¼‘Š’òÔò•¥KkÝAƒ3à’*\lÊ›ò§zÎpçˆÊºBÕöáÍó¤vHíСýû+™P«8s­n±Êâ©PTV>åÍÍ*+Ru-ÔØ +µNã¡–‰Šø#•{z¾ØÛ…–ÔØÂi0åò|rª2#¥F½Cý}eý2a&SwÊÊä¨`›Š´äúø˜–é«;zÔÑ䊚\”M¾|¸¸€ó)hO&ÒÒâ¢ã«K¬±@EGÅ娠°ñ AÃÚþõð +«õdÙhÛNÅtŒ +d4¨§¿AK‚º×»AŠÍM¢|F #zç°;Ö©@*†2 2\OÓ1Éã*Tiå´ˆWçðÁG(l¬Ìê±Qq„ŒM(¯ hšÕ„Úæ³Ñ9ÂWqKu\€Ö(ZY8Æ°KA•7’XW,É$N÷$øÄ×+OŒ[Ô6ì`Òì œYd7Æ& k,. ãKOùK‹x¤K‰zs& áP͈K'Æm#*B‹,®8ÎWœ¾†Ò*iÜf\‚òF™Ô°QcÇFLý›Î¬>+™a¢bf pHm‡¨Òß‹Õ& «ˆþ½É¨ˆ %>Ñ…a8=1Rˆ ©MÃZt T×Ðc~Ä“4áq+‹ +yWâ"šrö/ÿ›IwöÒ“ç½ù9;“O²mvKFܧÃøq }Lm·‘‘deófŽ ôv?L ‰ˆ¸¼¹py‰KN„²“+gï·úÒ¨?i®%º»ÉÉ3Áúº¿¼jã³V&R¬/|絟,ž»-·1̇óYB¨é¥`qÓî-‘b9ZYÓ8¤“JÜäJ`þ†;Úóå·â‹lzN‹zŒgC-¨½™28®!œRÙæIS‘v¢4¿wåñòìE™²OŽMM“‰G°MF§=ñ9 …ƒßTc¢`\VcäzfLï§7µ=¬!¬® X Ã_vIµhuM,.é’Üì†P žë +”`–ÄúŽE(Ùý%ÀË“JûˆÆ®Fy2TÇ„—˜R=<4¬?6nÑ9OÈlcz +¤ã v>r#™@|E\ªÛýe½+¿ +`tÇœŠ[,r¡J¥½ªÇ¸q£ÆÂ@bB¨hò ¹íèˆçÒ&>ª±+­ˆ;ÂË%;V>ME;_@<&T·Ñ‰þNV¨d b:LÒ؃r³oÌà19Á2ŠRz|€\‡òc0¼q+íÜ0GÊH„FÔRÈ+,ì¿9:¤—ë)™€|Gø  ä<à6h1uxH>¬¶©l¬®ï¤ŒÞ†¬äIÌÄZgèX›Mu±`Õiºbm.Ó#BM ‹JyñÊg +³gŽŽ•J׿n‡u¤B 2ØÖ +=nv…ef¶ÿ„+xâžTW,. +ùy %¼'Úë6oÚ.dð`…Žw‚Å¥tk»ÒÛŸÙ¹ÏƆÕvŠ U…䌣¿cstÆà +²ñŸ›³zŽËQ>ÑKvϧ¦ÎqÙy«'«qE˜èðæB…yB*[Ó5â|º±Z\¼ØGý5L¬cbmÔì)6ÖÎ\:éjpL¨É‚Ù÷§¥âŽ/ ÃŽ¥¸¥²LïÇÑçNWfVÎ?©oÁð&ö+S§‡Ô˜ƒK+‹áöN¤³[˜»Ú\8X9 Âe%%ÜŸ5Pf33™13=ªwìžA|*įìoÑÖ“ »ÔàËtvIG%u¸Ï-BÞƦ6årîPM*-QáºÞ΃¶¨LÔÄI“¯¤†x”(X’µÒ¢0&—.ÏÄ'¹TÏƬžœ+Ô‰6v…5H²GFLz"õ v€{ F' ra³N$jIÙßõËîf¦vöpsTçü—CÃÃrëÉq dÛq-!7³vO¡“v6kuEÆuàÑô¨ÖµõG^ þÂBeòÌÙ»Ÿe"u„K«|fÞldÛ»…îžTY±z6@ uòyh„~9©n_*Xè™Ü!8^p"2Rg]_q‘ŒMPb¡ÒÙܽõ¼ñàBÎ_XŠÔÖÅÅp}#T[÷¤f4˜Ï%d=Ñú„>Øá-ú2 õµ[©©ýþ¸:ÜL†”vß°‘Ð`:BrêþÒfcùo{â­@qÖ@N¨¬§ÈÄšµå‹»÷<»zéñìÌY»•¢ÅÞæ5W¸z\Kõùr=n›b~±0¹é3 ++/•·ØxÏJgœþ*äy·:&ZZHÔ׆µø]ƒºq<à +Vì¾\ÿ@ɦNÁç*0–Õ³3gJ‹çS“Û‘æ—™E…,J‡}î›wt„÷¤ +e³¡ö¾ÔØuÛÃZ7°b¾¶8µv÷7NU6¶„ÚV|ö 5w…-,+ˆ(<øÌ[Ók—¨l<ïFÛ{S§NMœ—[¸£`çLjà¨ÜvRKŒYxÔÛ¿\ +ÒÄ¥°:E+ÐJÅ:¡æNbê\uãvcû!𠨟CCæ\k›µÆ T‹Kˆ'V¯/¥§ ­CVšiàUܓРܸ·‰:WÿÖQ°4*þ‘Ù̘¨C¼VˆT€Çtà•3daÝ„óCǘ……E7¸%”Oó©éHmþ©0ÜØ«›\v!Õ>šÖßWƒ›0ÞéKiì¼ÜÊÊÌü¨žÖjDþæÁ$Ø$.i0 +eÆ­Œ…M†+«ùÙ‹ùÅ+v&–o­EkËZ·hãR|¶G'&Q_)T^M¶wÙÄP +ÆçüÙ9>Þ§Ä_Ñàa D‰5¢@Ð dç„Ü’¯°Â¦fÌdãSÁò<.Ô˜KT¸–¬/ÍïÞZ»ðP}é¢Od«sg¯?áOOeËs{íÝÿz~õ6™Ò“‘A-R )·0Ò¿nÑ9D°H™ÅñŸŠtäöȘeLï6àA ; .Ȫƒ‚Ê !ÕT}~þÔ 2X1‘A­Ãcò$ž4”V¸¼0»÷ ?39l 4bâب3Xëï„LjQ>˜ìd››`‹\Bø¬ÏؼywtÒï +ÅÙ|ïìÆÝÏd¦Î‘c`+t¬ë 6ÍL2Ô 9>ÒïåÎ%ÿõ„rÔH9Ã].³êwÉðÄ°rœÛJ…Õ(§Ãý“[76¯?5±}«0w‰NöXย¿Ìé»_ äæ5õxˆ·ôxJNÌÍ+á®A½ÊB†³]'—8zRù¯w (V_…ͯy kB~ÅìLhQ‘kzT<2 GOŒÛOÈ1¹‰¾’›èÊüÄ°÷˜‰í?BÀ¼9 <ÒV ^LÈ¡ª‰M˜è$lÙMÔ[4F†l®€ò †Œ€Òxõ·«êo8Fô& + bfâ®aõq…UnåB)RßLtÏH•˜Ù>÷`m~_qB¶W_¹YZ¸mî{ùÙKD¨qB…Ñ¡ºÝ“ÔÙ¹>K;Ãf¶à ´‚åu‡?DXe79ƒ€ €»FO>g¤’¸Ø¿;ÒƧ°=±6ÊÆq.–j­f¦vS“§CÕ…ÆÂ…ÒÌYRª°ÑF¢µlmf&¶Üñ %1Cƒ0Þp#˜PbÇeæ-‘ w°å +¶¾ÊI®03VwJ ˆO÷²½‹p¤?;»~áú£/¹¥1#eÀE§ÔŠÖ·{§ï¬_{6=sJwÜBòÉï¨Pߘ‰>"³éÜz<N¤uHŠþÉ´ÖáPÛˆÏá¯ùr Ó§ï=ÿà««×_à +ËCFÖÎgô®°Êî5Q"lq&_÷•¡Šàm™DÏÆæÇÍAýG¹‚î`Õàšâ‹S۹κždS=Ä_·p2:‘ž¾¬s%Fô ëŸQýÿwW°ùTÄÑ1«Öî‹46ö›G†¿~xD3Àܱ)»¿ªÅƒÇäN90‘©zè˜b\OËMœÜÌAŒ2!yÿ†ý` ´ˆ8ƒ¡ô„Ñ3‚CðV©ä¼3<á-®"|Fiîã"°«™MCï@MÂOdRf TfÄ¥‰UiàÒoé  ±²ÁZÇõÃI%: ñŠ"Þ¬3X!C%o¬’ª¯AÇ<ñòì¹òâA¬½AF*V&¬w5Žþîd”X4ã~…Þ ÉÝœ‹§bÍýâìÝúþæÏ /1&\Ó5ºåVFKDœÁ@}EˆÙöZº¾bqúMvO¸0Ó\½>»ÿð¹wïùv¼µãôOïÞ{pïÓ˜Öâ~­;Š_v)ÝÙ¯Î]5º’ß6 qǩ؆\‚îQáÛÅ tC¹Cu +(4P¶PqˆŸg K—¬\ViõFKk©æY)»Píí×ú×çÆMãÏ^¸ÿ2Ú>.w¨ÐÖσ6OúPß„û¡$F N@GoºçÏÏç¦N/°µz JL¨±zæ³SRÚx*Ôôgz °bn óÕTøˆÖA5Â÷a~̪B±°ŸØ¶A<)ƒÃ'$ãFרÁ¥5½÷X{çÁüâÝñÉ}³'{×Ù„÷±xâ‡ÇLƒ:·…UˆEK[ÁòÎÑ1Ë‘“J™³ôÏ·˜† 䈑† +7³y*:t +Ÿ8ª²éPvPÙßnBG„,lƨÔ/-^zB GÄÆuv +Õ(¹Ãuw´Ã¤çé첉IšÁh~aÂZÔ〠ÂeœB¨ÒÚÌ3ÜuRytX{hH; °C×÷Ÿh¤Õ¯°Ðá—ëqŸv‡ªÞì”/ß‹4·èøÊg½HÑ’™ôZHˆ·"Î'á×(©ÊG'5¨¨4‘¨[2àþQ°„ÃؤJB/èìŒI#Lâ„Ì +Í1Ä,xHã’›yŒÏ²=*X6:¼ÜË„²d:¥“œÚ.ÌîGÊ‹‘Ülwù Tœ6Óa.Þ‘*ë`szV,­¹£3:„¦ K(8¸Ô°–‡l¨uöáP2áa²¦~¾ðUý¤\mcÙpË›œ W¶kk÷¸ƒÊŸ›\½Ê$'AƤú«›;*ÉGÛÑÚêq~RŽáž‚Ã[Ñ»î55ŒIŒÏ0‘¶56ŠV¬dXn¢”@zv^‰ Å™Ö);J+ ›nm!LRefG5NˆÿGF £‡ Žë‰þìÐéíR•Œ4Q_Áî/¦Û[è9I7V­ ø‰I)0¿åq¡ä‰Ïøò«£Â·Tãsl`c‘kcFï]ÖQ ‘­Ì׺ëýmâˆñ:ÄŠPZ‰4Oƒªµx¤r0Ý€J8ˆ BU.Þ"|È2MÿìŠÊæsðÌ—µ11O¼ã/­ù +«©î±¸JE›JÌé;ÝÜŽ­ëoBhöÉôPC*;T,°ý7¾z.Ã@³zÖæŠ1Ɇ©Øèíšè0¼ÔÔéù OÌ<•š=p%¦àƒX!Ù™ÞlöιĒÜJËÌÔW‰X2b‚7T6b¼Ü€QBÒíMA`1=ñq“÷¸cÓ;G4رQC«mi쟡­:øþ×g‡óÄRÍÅJo³µr¡³uwwãZïÔ=å¹óbuÍ@…ã…éþ‰S6¢´Q¸/ë +ÔQ®ì’:F"À¬C’uZ+¯ï?:-jp„TfZcõŒi “Ä!²Q!—/¥sxá³Ì4CÂ(Ó¡J²º¸ræ>§X€‰íûrÿ‰3E_bš +4P&=n ¼áJ¼87ªÁ êFu¤ ¡ aç²@l°”m­jñauÿ‹v!ÝÝËÍœínÜ#d ÷³¥‰•K£:·ÆÊéQ/ÌÒ¸×Ú;nŠ–{> •¦‚v³zˆ@Ù[\JôÚk÷úÉù3¯½ý.ÚÖ{®ÂÄçÂå•KO®ÎNš ÿ¤:* ž’÷ÌŒi8ÀQ1¢q@ƒóª°þNøv¿•9üYg ¬.<øôÏ~ïW¥Ù3!ãÍLñ™™ÌÄéXu¥ÔÚjNŸ¦Ä4-fÉ@Éå/‘Á†•ÊŒéÙ£#ÖÃCýoè ´dz÷ ÂqdØxxP;(·Ž(!ט`-ßÞnÌŸ2JÔ«s†ÔD—JÂ’T\%ƒ5V…Öj¬4¯²qriõ&Bð‚`Jw¢ÙÉ#Æ“ãV3pÓÙ}CJè¼å1&Á†k*3cÀü6H +¾Ÿìºû×Ôe1oÑÁ&òÍÕÒÄp3°‘!.*¤ñúêQΫ!îÀÀ¨Þ€r&§äðå\á:kÃû˜Þ`¢¼¹w pÝî­‹;¡Ò6jŠ‰ >Ö6ÓÉã2»‹KE³S€¸‡‡uczFçˆþ‰úÂ}Õ¥{±zBn'øÈ)®=.ÿúˆa@CÊ-~+™æâF2¤%|r u×€ +^'6„Kù +súp±âÍ/sé9„ËŠý;£ë +‚sG«ÀÝî™ÉÍûV/>¹}íù™S \ó$¬t\‡ NªìG‡õ'ÇÍ +=¤!¬t xHçÖºT&\É€s¸˜H·–—ÏÞ.ÎV<æXXŠÖO ùÅþu¶Ñ&|zC&n‚Ú½6°†21>Ö:u剙Í€mfWŒðÁÓ¥üJEM‹ºýãF7¸žÅàÁ=y›óD&Ìîè¨#®#T&fX€ˆi¬¬Îæ9>¬ÒÚ(;–\Pi‘Âds ¢Ê¾77¯o€RÙA>úkbe`׸֭µþ +BÇNŒ[ tˆGe¢´ýï(%3æ“iÐa…m`ÌŒ¸v:ü£ã_?2òµÃ#‡'6µÕCò)R²Übq5êæJăòi"Xc“SÞübª{.ÙÜèL¬¼öƒ÷zÛ×!3Bó=>=)•ŠNYŸ„_ÑæÍ›ÜÑbg³ÒÝ„ņ‹t°äôõŸáEKV&au†â¹n¢ØÕ #*Dma-¸F©¶0# +tLòÁ| ^SèqŒ”òݵÞé3»÷³é9‹'¯#"ÿGïý%Éuåwþ«‘ȺmªË§÷™‘a3lf˜ “‘Þ{_Y•å½éê2ÝUíMµC£®a †† fÈIÐψäh$ÍHÔH+iÏYížýu_âœ<8Õ‰4/îýÞï'ã½û–Ž?ýñ¯õdgÌJw秄P!¤*VƒM=PRÌføX}܃p™„&­˜ÝË9¡+$½°Õ' LêÂ$ô º.:Çl¤LÆIÞ€.Å[G'ïŽ; ¥ùù4©sÙ¾\^ÑŠýîìö÷>Ïu6§[;ÙéC!;ËƧýbub`!HA.Ü~ò9ª”þõ™¡S&$à1[;Êè¥ÊÌÚáÀZòås°” &ra:ÓÛˆ6=\TÈLéõ-B©Æ{~>KkU\,ñÑN²¶LÈq1]˜cðID²áò¨›¶S›!äº8©øƒyiÔ=êb͘FFZP0‹Sý•…Î¥•B™™Xk7×?j¯Ý[>xZZ¼Êg§ë³—ßúá7d´eÆX,`RK&:ýí®Ü@7Àà¥[ƒ=S¾m lü¶#è„3è£ÒH¨xÁŒ]´À >‚Ü}l“];ÕÝ'Õ2JT:[:@~.™oo”¦w0)g€‚.2¢" ælŽÙ@²f_Øê•,ÚKôÎOøÚ“RfØŠœ7ã„ÖÊÎ^Sk›t´e%"DÁǫ΀ê¡ÀØ}Å{ƒ.îø &ì8‘I;>aÃÀ3V_hÔ„耾]¹æ¤˜%ÃY>Ùª®Üìnžô6Ìî<šÛ}Xn-øpÉî!*êðófÏ`Ï&™p +è!½©ƒ/ÒJãfØî y`yÒ‚¹ü/“»8é…è4ŸÔã!ij“þÓÝF3ag=d’R›˜ç#U'&äqÂÀç‹ù™ÊÂÕþîI÷qqå¦Rä–ç¥âæR^.í¢—A8P +åÞ†ÁÏ}÷ÌØ„µú$ƒ“›p ®€|z¦Úß¹á Å ¨Äç¨XSÌÍ$göÂÍm¸H©½“Þú ‹_p ŠŸËñÉ~µ¥½x]J÷qÀ˅¥;—ÿâ´á¢ÙoðqTSéæ.2CüÌÆ]6Ö|iÔyÁ‚šQÕˆRL$fz‰òìôòa}ñŠ09Jµ¸XWrñúòâþãµ[ïûļR\ÔjÞ`Ί*NP}PÕ„h ÒÔü‚VX0BÜé1®£Þùv£Õ¨É>g$Î ö1çNÛÆœ˜‹PØDO(®FêÛz}džiZ²sòü³å«ÏA¦õ +Ÿ›æ2=&ÖºmCD³#Åb¶½ó¾õí0áÔ°Ë…Ç€£®t6¯Ü}Û?øqL +h LmX BmªåõÎö.Þhôw÷n¿Èv¶ Þ2V{Tá9¸ßgñP ð<ô8 8;uvsÍX„÷ãÕÍp²Y™Úênß_<~cáøõ™Ë˜xÛàà`2V]ÍN]öRR.¸é$¨Å.\µ’crÒNOZ §/ËöY¹üÓçG]fm´ã&;iòcÎϦ§7î‚êÿœ2žŸD€O¨M.Þ³¢‘¿<ï˜tSV”·b¼—‘°îµõ{éþ5Tï¢J™Ïö£ÍAKdà÷¾ 4ί€Ä·‘ê}п×à -nvÔŒ¾<ؾÊ~Ñ ÛPÑŠ‡'ü¡QЊd¬ìâT)?S^¾©oD««éÎ¥DcTrÀ?Û Xr(Ÿs“Q`'?¤ ©|}qçøU&R{ù‚ÙM¨à\*‚êc†+¦»(]ÎNû‚‰3ãNé“>ÁŽkùAôíçZ³kû…Þš áµêjcýÁìÞó™íG•ùÃB/”î†cõgßûë+Ï>ŸðK\K¶v›+'±ê^¬z™‰v~Ðh8^Å̈:5†œG†mœÒ;î¢m îøù;6x“Ë á_çV¥<ì¤Æœ¤‡Š¨uà€©HMÉ÷c•yð_F¯B´«-gº;©Ö†”UËKji‘T+áXuy÷v{åÀ†Iß"•¥A+½ K•ÁN£fØ WwïE ³c”0+¢Ûñ$x€ÀÖrÓ—o>/Mm,‚¸›™Ë«ùþñö­÷žý¨¾þØͤs•¹Õ½ûH0b,R\Íõo—ÆšÇl¬ ÝÚ>|¯¬™ð +k ؉蠰–bí=W š«-UzÛà•*KET®h…yP8í]1Õ†0’í‘áây~vP9› h-.:eòñ£6< cÍAM‡˜„Mø…” ¥+ϤLqöpñøÍDwW)Îcá¼W Z8³|øêÉ‹¯š‹Ç*ÁD¦`.gôp&'>˜á0æ}eØsaƦFlØ¿:5öʨ{؈LÚ(«_ñ‡Šv#p˜‘ËàÓ Æ»»½ýçK7>È/ÜôPÑdc£·y²}ë½úìþ¥Ûo×V®…˳…Åãxÿˆ/¯‡R³½•;Û×_TŽµq‰éh}C-­b}{ 1d„_²œuyÕ…‡ €B„›ŒÀb øÜŒ”›žß¹»}çm!ßÔ²ýýA{¢òZ¢u¥8{G«¬[1ÉŽ n+ƒp¢ô&“˜!ôi:1È •´À⨓ðÐ1O0k„EgÜ$´ÔÀg2 +ÜŽŠÇü\”O÷rÓW*‹×‹ñ‹éBoXX£J…ùúʵk/fö^“J‹t¬ê¢D„ÓZ‹G¤’q".B| Ì% @$–Ÿæ£5«_0¹ƒF÷`s ¬X`YLõb•EPGN Ù<B)‘J!V[ª¯ÜËËB_Ü¿ûôCNÍyj¶{%Õ¹¢—7¸XÌE™a,î=ÍÖ×Î 6™ÜtŠÒ;rq5Ù=Œ6.Á´~åæk;ÇÂ[ü ‘ÊòÝ­;ß[ºñ!_\³ ŠßþÞúkÇcnî•1ß„;DGg„ìŠ?X8;á³ú‚ùö¦^[¿`B-àÀhX¸Ä§gƒÉiœOîÝ~ãÚãøXˆHøà§øž^^émܾt÷ƒBÿæK›&åú¤›9=bÿ7gÆO]°7>ÊÇ€JþËó‹‡Q’½q+54ºiÇôÁ–£nfÒ.4 sqR¯Ç›Éö$”i9Ÿëîæû•…Ãõý“¯ý ÓÝàÒÝÕ£·öý°wùuP/n?ÿqcõ>iÄssó—‡’­e„DB( ¬8wÂN8a^Ö+%àüCIƒ›š€ËE­¾ëîÖWn•—Ž˜xµ»vœŸ;Têër}ƒMÏ¢jm0«9Z•‹ÍôLÙJÚØ ±ºcãË°æd3ˆZãsóž`VJ°Z÷ò%T*C¡<Ä¥M0Û¬ŸŽziÍE‡µòJsãQcóQ~îz²³«V€¾•ÄD}z÷~(;-æúõ͇Jc'ï´ + Ö©å«,4î (…e&ÚA‚6R·#ŠÁEû(-¤×SúËóö³c^“/ˆòÉheŽ4Í4a#…hÝòãv¿Ñ’ß»ûÎþ­•Z®O«%“;àBB N v 3øÇ턉Å+ËñÒB8Õµa§.ÚFm„ Ûæ (`Ð<´æ#¤d±Ç(©sF©ÔWoNï¿Z^¸*å¼\~ðã½÷üýÆìå1XÂÏe¬ˆ:îìÉ™½¬'+óô€­Œ“NÎGG] hÍ@¤íç b´rãÑ‹+w_ \ÊCÆËs·ÓSWµò’”ê:pàÑQ+aòR¹Ö%5ç&|.À)BæÒ¾€fGä—‡“V´Ü\~ýƒŸ\œð²ZN"Bi-19Ž·JªÎlbÊ)Éézº:«ç™ø Ä—}lÎO'0þÛ]¤AHØüg;uÞ2bÂ\ˆèA„‹ÏÿÒ+&ƒ1#yÁrzÔuÁ‚ÚV Å=ÙC*R~.\XÆY9ìP})×»mn“S)+ÆjZ© +Ì ´–#Â9¥¸©mÖ3x9ÃT¸ +ç'¡a# NP°—Ô N +ÄØùq' bP<¤JÈy!7›lnÖ秗÷vo>i.îe:[sÏ:[OVŽÞîï^©/ɹ®^è*Ù§¼¤J+V­ò±†‰jÅÙDc% äý|ÎI‚J§Qj–׋z¡Ç'§W–ùÌt0Ñ­ÌæÚëj¼X­÷nž<¯/l³Z¾6{iûΛ‡OÞ»öìWŸ~xðø¥£‡­Åíã{OמÖú×ß./ß­®œt7NjóGzuÕCëáhõúkŸÖ–Ž_™„†,¨?” +h ¹z)Ý» +‡’PìÞÓY¥hô B eûzc»»õdöðEiå>°1—ïÜþq¦»íf“D¤áJ>±–ï-\}79uà$”ý›¯¥›k#N`õ˜+d'b>.Ÿi‹Î¨•Jg«¹r j¼¹Ž)%{@G¥B Rµ6üRÞè¥5ü$&¤Áµ°ã’—M0ÑziþÚÁ³ågöAšã`Ç­ƒÆF ,Š œCc²x(NµÁé$:W˜ä¬/˜s`€©Ë@œ)µeò +øDKÊö0©"dÂM_ú¢ f]}ÔFâæðì„ÿ¼¶àÃÜFܧ†]ƒuøô8dB:ÖfúlªKG›¤V7xEVŒûuÌ9"¤Ã¹yµ²!—×qµ“JªÆDËfˆ ÅZñöž^ßI´.#|ÎÎÂŽšü¼\#%ƒ?7f?;j¿h„ ûé´L L2Ó\÷0\H…âõhsN´19Æ$Þ¼q‘I'ÔJJqU)oz^á*("\´á²@fmˆsIV¯‰@(ä"ÈúI5l†ý”föPN܉‡½¸È†ÔH4Í4 >Ê…“ÙÚLqz9ÓšQómZ/²©†\ê'›óµ¥=CÕÞæÖµÕ›`$Y9Óšá^<+ÍmÞŒV«õ¶’êóñ©Ö„bõ tPXÜ:t*,TBé…DóRwûQÿòãæÚm!=Mõ[÷ž}ý»ÿпtÏ'äåʆ־RXzùáçv¤ ¼žyüöÇs—N&<Á &œŠÍ(µÜÌñ굕¼«ßzôÁîýF\ì¸7‚Ä”Êõ“;®Ýÿ8”[HWï¾ý£xmÅä šüädkofïÙ埔çorñékoF + §F\¯Œ¸F¬¤Á\V/,4–nøôþñ£÷>ÿ9ÊøÄ*š§â}.½8³ÿÖòÍïÇ{ND¹r÷ÓwÅTŒù9£d–Ér1LªŸÄ‡ ÈÊæÍýk¯š½Üw^™üΙ‰¿xÙðÒËϳ`‡ÃÀûå;˜˜'µ"äç:ƒÍŒ. ˃KÁHÁmïebL¼#—VòS»;\ºçÄ=?JõLè`™Õ¸‹¶ƒÐ*ÅÇmÂ`õ"ÁÛ1'u±Ió`‰_ÊE' ^šQ +r~&5³?½÷jsë~vþ¦XXsvˆaÔ¢ XY\¤?b£,žÌh…(˜q`ªœì€C2C¬ –FŒÍP-ä@e·zYµ0Rž²µxCT Ǫj¦ 1ò˜Í磄OP‘bqöòôöÆÒQ(V—SM>Ùvl¡NIi”ÖÝ$?)O8ç ùÛ[vÈ ND"&R…²ÉôÑq,˜vãaw@ö³:x»¥ÄªÅÆbº¶…w3‹ý+‰Ö¦”i©€ †£¼qÂÍ\4c— ˆ9?sá’ÕÇXÝ$ÁÆÄdW^ÊÎËÅ%.Ú,÷÷›k7bÍuo@Ndj‹Û7µì´7 +¹¾”æb BÎ)sã²Ý/ƒ¾^‘ Øè ¹©d(>#eh¥†°Q†¤ŠÝbw ¼@¬¬ ¥µDï(Ù=Pòs@ù!&慙饃Þú ເd©¦?Ã’BnÜ‚Žƒj*ån¼{÷éF/wjÄ3deÆýš‡/É¥u9¿ §ÞüÞ—·ž¼7fBO9Æí40ÿju7·|DˆÑŽa´*'jnL¢áct>ÙÞ/?µ¨-yä"¹ÝDeÎè Ú`‰—ü\ +f£6o`Ââ58lN(@sV§Ëêö#\Lo]¢¼;~>Sr£»6¿u[ÌL´’™á3‹N*cò0~B £&nv’LcS¡h pˆŒ1BŽ¥råùÆüU3*9ÙIÈopÂF Ž™’#¹©q@xhÒ?lDh|ÁÅýl`C\LØQŽ×ãõ51»ÀF»¹Îe15í@Å|}9Qž3¹YÀƒ6X°ãºÁqÙ€X‡4iqsB4¤–F-ÀIr†……,ì¥âV8afàLr>&Œµ½Q`¨L^Ö?˜=<ê'Æ{p"eàÌ>~Èô-à`ü˜Ñ3aA&m8ø"$0Øç n*np´|OÊu-Q +)gÑ`œÓ¼’ #F;JpQ-Ý°yq‹qa€ d:œ#ø80¯Lån<ãð2« ”êðó6pÕ&©”}tÔÇ VDB¤Žqq6œö¡ü¤¾0ê𯎅Ï\´ŸqM˜|ÀI^‰”ù>ˆðc7 v4æ æÜt܉+>2ä0Éb3¤åNºëÂâÓ¹éÃêÊÝÒ±Ùͺ"ÂN˜qÃŒ†-è£d\Lññ«Á¬ÎðQFŒA„hv3~Rç 2Î…‹cfÈígÂíÃH&èõÃÅA¤È§ê°˜¶ã² qB|néòúþ=ZNT•3³é澘^ôªÃKší8)»—u¡‚ÝÇ8 ÎKÈ“ ÂU”M» PHH®¯=|߆‹FíÀD›/ä¦~ +!à÷&m„ÅËYaÑè Nºh³CÙ88x­xp>Vš”æ¥LŸOö8½ƒ†²DäµrH¯‚¸rኘœRrk^®BËäâ†'œF›—✋¼tÞtú¢mÌð’I?›w1+,&¥¦`ªkñKv\Æ£æ/Ž¹,ÜØÙè=?á†ÄIè€ã¼XØG&]A)§Æ;.Xtx9‡_ð8$‹‡þSˆ—Ǭ~ ¢x°›ŠÒš Y]ˆÙæƒ÷Mf›Íáö !o@óQÌÛ0`tGŒ~“‹:uÞ<<áuB¼Ñ°ƒë…ðNc´á[œÚ¤Å´ÅEø©ˆ×<¸‘ÈÁ‹ãÎ #–q£Ï‡CãΡ Õò a!’çÕ,Jºá0€ÁsfòÔí•aÇÅÁ2Xÿ˜&‚ +À@7Ê =/]0£Á4¥”ƒÀÀ¤Z”R³"F'vaÒýÒ¹1³ÝçDƒˆFépª4¥fZ¬šw¡¼É…Œš]Q (n4¤%šÉöæ9“hÒ94f½8nõú ŒàBJ¡E!šA„¨ÁC\¤P‰¥à'¦D-¨å‰Û±ð6:VM†’l8çBCV¿ÑŽ˜]¸T@3fÆ\~QP²éâT¬ØñÁ ’¹lt³à.ˆùòÛÅ ŸÍ;8µ3cNÆŠF¾H«`´Íj%»â„Xcv7 g ËR¢+-„¢m"M:p?¥ÀŒ:˜Yç’vÑá¥]~ÆèD†'l&§ÇOÛ=‹; W*\ÆCi f/ +£Öæ |•O.SJÝ<ƒ‹2Ú £ ¹0j5»€ë9ƒ°úˆ :5d7zÚÓ›Ë;w¼xxÜ ™l¨ÝE‘¬î„X‡1ØÐ £vÌ!´†è³ËGù` +ÆX/ÆÙ<¾ ƒÉåñÁ¢ &a61¸OmCGíøK§ÇÇ þq#4tÑvöœéümÌ’—C*ŠߢÅs«;7ü”:f‚Ív¨ŠÅÍØÜ´ ;½ÜȤGˆÔ¤XÇá yqÙì¦/Nx¿{Ú0bÂì¾8ž—ÏŽû0cuƒ ›´"#Fè܈§âp:êE$«3€R:)U^süå¹ÉóÊØ©!3ÈFJÂ$/HÚÚåkA-7jCnÚ‰‰‡Cy†#¤nlÝxü½¿„¸õÒЙ!£ÕEØ+Æ„HŠd¥õÝk½µ«&uaÂ5é &lø„÷"ʈd0Ždô|Ÿe RõƒTEiÑ a(ÁС˜"­nØæD ,$êeˆ'î7šÍD€"QBN¸‘ §ÏêFÈPŠ’¯`p³ç&œà”íƒ üq?£Ù´úE;$BŸ †ÂâÁépZ+/Ú1Éêe,n +ð)>ÁÉÙQ«ÿ•QÛ˜Dì>vÌâG¢DSš¦ƒs3X=cf/ÐóP´¦—¾ý¥…ôÓ‘t}YJ¶b™—È”ý´N‰/®‚aWcÕH²nuÁ@Ò Rð"œ Bkqú&-N9š\ß;òÀÔÐEëà볆s¬@aPRå•ÉÉ:¡°Õ[¬®á1Óù“Éæx>•Ð3é8j~¹ Æeh”0Ë…1Çð¸Çåã,êÜEËK§G_zyÔ`!ˆ`câ6g#IMÉ‘,+e@H;<4ˆെ'Ü/¿2ñÊyãȘÝh1ZwAÜø¤khÔ>f„Lö€SݘntÐg/Z^9?I†>\:7lžðLZq@I?*­¡¯ÕA²cØ>lôÙÜ@<© ³!(”@)MÆ•b³ægh› ©ñd¡&E“~&hq»Ý·V“…†˜¨¼?j·8ZE%I€“àÈ\&>µ° ÄÓãNhØì³xYˆpNG=©ë mvvêÆݹzÿ„ýü¸õü¨ Á’¢D‘gXÖáró<§ëJ€Bæq«Í„¢M ¦ÒêæúÜÚöJ}i*^Šór'ÆìökðƒL§9!æ É„”1 ¢Øž±IøŠX¦˜ªw()ª¥j%¹`Êå§Môìˆí;g Fç Ä.Œ{ÀÐ,^&¤eËæÌä‚Œš¼.„g%;Y$ñPr¢4Å(*œAƒ± bó¼hЇ1$#¢TØ1^LD¹J«$¤,‘)L2l0DŠúpÜ[©$¦ú-Œªˆ9¼”݉»!Ö‹67cqRN¡’ÓCZ¬›Õhµš9Ž+¦"Ýbl¹W8Üî\Þì=|tki¥/‡%´{)Pû,<<îþ×/ Ÿ¾`2X0 !ƒËãÂ0„C +±lÐ醭@ˆ) à^¿'He”’²7qvØôÒéáS¯L^± z¹F'ÑSç/³¹è7!F+f4{¬¯K»¡€Û‹s!Ýîž…‰ÎDÇÍÞÓ&ÇŒ^Ÿv:üV³EìbЗK0íšÞ›.eKz4)”‹‘¥úñþâÂR3ŸWs™ˆÑY0;}êìèè¸Ùáðp$%Ñ ["<Ôo&³-(Q¬È™ ŠÊe³ÂtC;¹±qÿîîÍ£Å[×WSùä…1ó…q»Ãƒyb6Äà ‰´¯ž ÷Û‰j^Ð%¨šá—§R'7×ÁãóÇ¿ÿÛw¾ùågï¼wn6§hd€¥ ::Ø<V2Õ•bAmÔµJ2ÌÓzDÅ)Æ`uXmöÇæ ™J»2³0çéÛÉZËù&lÞ¡1`€^(µécRçF§OŸõC^MQ²ÙL<qyì×` :XÈg.픚­ªöWæÕd¡&7Bð:ÌEøh"y¯×Àà¡kz*•SÂb\aã"¼ÒÏo­õåD!Î/uR·WÝÞzñôÊ“{—Ž7:²Q=.¯Ý™m„Ê@“Œ…!˜Ài®æ¤rVêÖ´í~ìÖfñùÍùŸ]úèé¥?ýúËßþâ‡Ïîí¬¯L—J9–á\Äîr‡ûI #M¿7!ó1))ÓÍ‚:ÓJ¶«©…™ÆÑÁúåþ«ËOïï=¼{}wk·T(©•¦ ‡Ã>4b1;ˆôÊEû¨>svòÌÙ‰áQ‹Õêµ[ì Fe¾\LK<Ñh&K§“ª¢kjÂí#N› k²ú= ;xÔ˜S¼›]åî¥ÚñVýÖ~÷½g‡¿sã'ëïÝëýñÇ÷ÿé·þÛO¾ñä`y¾£ë:„’“F‹Ù0Ž8:ãmÆàfÜ9“‡/Ϫë…K+yð¸²Ý¸u¹ùäúÌÓ[ÓïÌÿñ§oü‡ß}ôù»×72±0l4›ÆŒ."8ëõxIŸ½,Cuf·ÇŸ\ʽÿ`éÍÛÓÏo¶ß8÷«/ïýÓï>úÕç7ûùµúæõÿý?~÷7Ÿž<½µxy½‹éåt“@°¢j(Ÿ`gªòÆT¤F¦òD9AL×õ~+>׎¬Uß~´ý‡ßýÛ_ÿæÇï¿÷ðþÍõÕ•) ÑãFƒÉî·AìÙQËKg.Ø åÖXo4ä“H“DY«éP·¢ÔXŸÒžÝß|íáþÉ­­ï½yüÓ¯>xüèf&§u¦§s;õJ)8­¦PÀ§0PQA7Ûò½Ýú­­ÒV›xPûåWO¿ùêù‹»‹ÜïÿýOŸÿË¿ÿâÏøøgß¿òç_?ÿ٧׶gã|Àå°Ú' NŸ „y-2i릉«©¿zwÿ›=ùìÝ«oÝé~òêüß~ÿÊŸ~öüçŸ\ûÙ‡—ÿüÛ×ÿñ§·ß½S½µ]X™ÎE51‹ÅX(œ +H…õ”#þÙÙ«}öúÖ¯¾züæÉfDæ'žó£N£G!‡Ýê±›üN‹Xƒðx'ØŸOí-æÖ»êîlôþA狼÷äÒ{Ï®=}pSS#6éXA’B Ç–ËÔõyù½í¿zëà‹·öñɽÿøóÿÏŸñ‡_~FàOýðÏ¿ÿþÇo/÷²™ ¬(G âÞ¼ŒN§áK-úhV~¼þüÙê/>»÷ÕûW>}}óë®ü§¯ŸýÏ÷ýÿúû÷ÿã{ÿÕÍß~yëññ\:$)˜ƒÅå~"$¦$¾— ­©ofÞ9.}ñÚÂßýðèüáüæõŸ|ïà÷_^ûç_<ùÇŸžü샟¸õëO÷üÎö•µ\.¥[@¹0È÷[ÅùFl¶,^™|ïdúo?¼üÙk‹Ÿ¼¶òÇŸ½ñ›¯þÕ‹ËýöÖÿõŸü¿ÿç7ÿüÛwþøÕíÿþ‡w~ôþáb+yMFF6ǃñ$ÙJ˲«$Z÷;ôµØ­µè£ƒÒû¾zwçÓçË¿øìÖû‡/þþ'ÏþôõëÿòÇOöÃûóåVwJϵQõ´ªFËE¼ýý›­_}|õï¾¼õ£··>sógŸÜü¯¿ÿà×_ÜùêÅÖ7Ÿý—ß¼ýûÏ®}v¿öþõüf+”TèAŒZNŸqrÀÖŒzwÜÕyýd¯üâÎÜ/~xÿŸóâ?þüµøé«ÿðõÓo>>úæ{»óÆü‹ãâÞt¸Å• û<F‚á°š«Vêýfº™¤º d¯C¿s«ýå[;?ýèð'ß»üë/oüÃÏ_û÷¿xý7_ÜúÍG;ÿþÇ7þË/ÿáÇ7?{µ÷æAòþN)—ì.Xb„‰0œO)9 ¯èèv7|cY9ÙП>{¾ò‡¿9ùÍ×õéñÿúO_þ¯ÿü7Ÿ¿¾ñùÛWî]_GÂé „{1X„v—5d&Kìvć;åOŸ®}õbÿë®üËo?øÿû¯þñë×þöý½wï-/Mç!€"¨fX1’’‚ ‹4 ú¦2ÁK½ÌõµÂý­ôßXÿû=øÓÏ>øðñÚ‡÷z?z}åç]ùäùæ­KÕ~±+åÉ'"T5‘ŽD¢ZÓñŽ¾==œ¾u\ÿÉ{{¿þâä«w?}ëýû+O÷ÛOv*×–3sp> ¬aqá—ÕJg⊈ör¡[¥OŸ,þô½ß}yóï~üðO?yíŸýþ/?½ñ«ïïýù›§ÿò«×÷ƒ/–N¶Ó,{íF›— ÑD‹åT>€äÃXQôMi®£éГ½Â³+Õï?Zúoÿîƒ?ÿþ½?þôÑ?ýúÍùãÇ¿ø៭¿¸¿0ÝJ„Ä0B)><œÎÖ9šV‚ø|-Z"ݘw£JÝZN==ìœì6n¬æß½ÑýÍg·~ñÉÏž®ïnÿÙaçr/1•å% +"pBàd†F0„^»„Ù**¶PÓ×{¹ÕVê`¾po§üÚ•îóks¯Ïm5•íFx³©M@®GGá8< ÅÙ+¤¸`$O$>!R³¥èöTöR'òì°ñé« ¿ýôàŸùìgýàdöûw»OÖ£w甓Õìl.È#vÄ瀌´¼„6iÝ^ qÛEÌ™‘¹Bp«AßYÑïd?¼ÛûÓOŸüï?ÿÕ?ÿæÍßõøOövûÅz6L¯âérØ!—=D Q‘ΪT=œ-);ýÌÞ|ööf士?Û}~söx­ÜòDøŒÓ˜ÁnöÐJ¢®¬ÈñMK †å£òæüÔþÖ\-Ž_êÊv›¾výxkê`¡Þ»ÒŽVR’*Ò"/ÀÅêÛÕG'p>…RZ¢*Šjò…,!ó ™Ë¨L¿¢ïÌ–ê—ÊkÝL+o¦ãÕ¸¦Š Š FŒ.bÂAÃTÜ‹„,§Ýbñ»\<¨¥S ­ü¥éøõ¥øûwg¾zqé–~òÁñOÞ;úÑóÍ/ž,ÿàÞü‹«ýU¢Ý^—§x«/"^\1Ø ¯OEb¥¸®‘ŽŠê[«K—§´£¹è¯­ÿ׿ûþþý‡ß|vçË·¯<>ꬖzõ¨ ñ´˜äõDE JvBEKÅL)¢"‘՘ȄÙfZ«Ç¥NœÞí%¯­w¶{¹²B¦¥  2Aƒ6âgG|C€™¢˜A\Nòi’˜Œê™h4§«QžÔX"ÆÓ•q{–Ë嚀ÐÝ~Æ ¼ŸdZ g`­ˆÓ…Òd0ËMuW¦ê½¼šÉ…¯,òÁËÓ™vr>/.¤^&<•Q3"c6L:ì>åò8|vØþ—§Ç†GÍn›3DzˆÉ«Á8çkÆé~.¸?­?;ê½q}îîVk½UPá¡p†ÏÌ¥ºG0x ŒR$-pA¢¸`PÈ粩˜ׂq••BPˆfyÁOrvœ±ù‡ ^›Ÿ'„”ÑFì˜ÅËŒÜËËÄ’ŸË!3,@±DRä’`msølNÌæ&Ì.bÔ‚ ›' gåÂÌ%h)SA>êñ‘ MXV®Vg›Í…r¹'‡5€^ ùpÖâBNOŽ9p;óó•€TfÃE˜†† ã&?^¦ BTä¨"å“ÊT-¾3WXjF¶g²—æýJªž WZZSlv÷顉IÇ`mûy“屢–!3æcÀÏ¥Š‹ñT“$Ó2Â1Ö·\O\Ý~pcÿÒrº\TyÇ„ÀlÄ©vLw3”ÞN¶’õ½hrš¤ÂÝîÂ¥ý»>ˆšœp¢XH’±X!•®èZš +ðv+êòGƽg/:‡˜ÖŒ^Éàæ¨J³ÇíðÚðˆÁ7f†€3·z SCHÍ 3£Ýé HZ\Æè,ì'c¤R Æ»Oð;gáEÂ0!‡”"%U!\ñA$ˆ´B¶ä2ÛüÑ‹|P½¸B(?n„Î Ùœ¨â§cfì/¾;ü—G/Ž{<þ Ï«‚õùpŸ¦ FâxÂëæ`Oð„À……`Ü`€FL0­5õÆn(Þå¢Ýlw'/ÛQÆK©ŒV”Våü¼VÜ(Ë„"Åæì°Í{fÌ1b§pIÌ0Ñ*|l’¥‹SÛ¸ZñðNz°(ÃMÅM>Ñ„ý˜8iñ6ƒLô:.ýlÆŽ(6T¶@"þmÃíQ'=êäÆ]œ;eÔr(Zc•|8^Ÿ(x)朸ê&£¨X$¤)¹X“Õ«#¤œ#3Ã’ ›ý²+u⃇s¢D«””ÁCqJ.HÉŽ«•œ¡1’ãDäCÛ¤ rÀ)7¹Ìª“NŽÚñWÆ\/ØÇ\¬‹ÊjÓèeG¬èˆeГ&#®Ýn˜eÄX¶é ˆ6d°<aÓ,bÇ4#:52hí@¥€TÐ +«0_2BŠÉ´!"ŸèŠÉÞ°5:!Ä©ÕlXÄରLˆe02NfØð1Y½¼ÁF»¥î$ãmŒÑJR¬N…¢ùa¾Ì̉¥åXc3˜îÛÉؤ‡óÔls eSૃ±®”YT k|vù¢[85‰œž€L¾Á¢¡}jìü„PbyS)¯³±žÑÍŸrX\ì„ùîYÛÙ ÈE%¨È”˜Ycõž’ÇÝü9:nÅJsúùW†àLœvLZq7&³Ržäb#ãöI“Ûëç<Èà~–ÁÍ9˜ OÈ‚ë&DýÎË\fÞJ#¡øôÒQvjÛÁÆ 1çf“¸œ'Õr0ÚÊõ.O"A#ÄùC)&Ñr²Ið^{ ŽkíTóòʵwÔêÊ+ÌkØ\(¿…Gz^.kʼnÁ²tûöî˜לd’P»L¼+uRCš5ø3"Û0 +æéh[ÈLÔª‹Š†âm½¼‚‹9J.û…iɵKBy#”[`bmLÌægŽ±pÕó„<ØN‹ŠuàpÅÉeÝÁ, lËÔ~gýŽ“Ž^° oÈÊ[QÕÅ$½¡œ SƒJ)ßÚhA/q¹îä +žP“{H±ã“_qcÌ +bWº>¶`tÒfMI%D,Z1¸´®‘O¬ùĪ 9"Ã|äš –ÐPÆì4ÙvQ1¿PpsùaxÖ€ùhÝè¡.š ³/hÃ#˜X†Cy„ƒ“„¸*–½3æd­¨æ¤ÜLÞH@¡Á*›³øü¤ŸV·,Ç]¤Ñô +y·Pô„ +”ÞÂå²›Š: ¤öˆG˜„e;“ár«D¬Ïe—¹ÔÒ+è°…„ƒ9LÌ›à°[à˜Ù¯qv“q‹?Q½…)ÕêôAoû &—Ϙ`ªðÙ¥Hã0\>€Ä¦-4ƒ¬!c—2CœÙÏ 9™17oõK.B÷²+åÓ|fÖI«¶€j§3°Üƒ©µIõ­¨Ù'»—Øh œïE;édS^¾äêX¤‹E bV/˪e:ÒD…¢–€è´Ž] +VÂù¥qGÈ€6……›à»LXd ’ÏYh3ªóé›9o‚íˆ_*áz‹Lù¥Ê$$ 6BM9è4P`p‚..Ë$ç`¹AÆgüJˈê„Ö³‹Ã–¼ƒdŸÏĦ< Ž`º Õèh×è‘F,ä s/$ÙóË~±6f#F,ø¸3òèÞKg'¿{ÎôòbÂâµÍĦ±.‡RÓ$ †—Ð;lj.1uÜÜ|–»m¥À‡è‰n{᪑ˆL;F=l‘ŒöåڮܼLD꬚—ò}¿\"´:QL®‘¦XXæ3}¯æ’íþÁ³Ö¥“AÛ¨ò:™œss9ï™úZ{ýÎE'‰…KzýR´}”œ¹iïᱞÍòé~mån¤ºaðJbf¾µv·´p-×?în?¡’}'“ô}»k-】¦UïÄz·…ò¶›J9ÉÐmT«žµ’® Äh}ŽŽ/ð¹U¹¼j'DB- …56³LÄg½£üÂíAWŸøL²}ˆ€ÀP±p´™DKÏcúÌ$6aðò ®˜hG©îÑ$:íá+_8ZZçãSÃ.ÎN¦Ìˆî¢3Lj9TØÂõ¾‹ËééÅÝ&X>kÂ/ØY \(ÐòVóÒ›¨Tݸòê‹O¾ÖK‹ç¬ô8$cZ;Ú¿ž_{”œ½I'g'!I).uupg'°â ~´ên(½<ᙽ(1f(8döí:k¥‡=¬´èôŠÚ8øîóü„džHfD1û5±q¤šñ8“˜“ŠknntÐ}Kv’1“ +ë.*顾PQZèt¼u¥¸rÏ/f…TTºXcU¸0OEë­‚k•D÷r(ÓÇ”Š?\ ¦õæ¡Þ:äRs^¾0æçít”It½¡4$1­ƒé}Pž¾šîîÝ&{@Çz–jØ4“™%µJsápzçoƒ*ÞËDÛÉ©ƒüê “]ä­Fçá[_&»Æ€æ7´ú^zúF~î–^_wRÚEtÁ´‡K[IÕ-dŒÕ…¹Ûõ'±ö¦5q¹šêÂrÕɦ‰Øt´sÌ.ã‘®[ +¦gνãTÈ´¤\—It,dÊ,“‘Á|ûÞƽé­ûç@ÚºXT¬e»7ª«OØüŽOª#¡ìÕŸDË+&¿ŒJ•Úòí+?¾òê§Çdbƈ3ZãÁë_p±Îc ¤¨øB¸ºŸ™½ÓÙ|-Ö:€‚©Òôn¤87ä Œ˜ +É-¾´[[}5ß?.ö¥îa³ZeÝ«&X!´V >ƒ¨] ~‘Úniöð ­6åò6¡Oá‘&¡5¼l +½[[wÞòè$|z‘ÏÌÓ‰$Õ¼Á‚ƒL¢b5Ù=ÏŸ5Q“‰ILñù¥²m^Ž×J©é™âìѨƒ>k@!pÕR«X¤K€êÆWÜ\é¼…–ãíÝãçœRþW/]0ø= ¦WÒý[ýƒ·A­™t‡¶®½JL`Ɉ(>¹c#¢6"jS(»šœº9»ÿ^gûUF­,mÜÈtÖ±pžÑk|z&ÑÜLw/§§¤Ê +.Ä*Kà{ÀE”HmPAai¦f#ˆÏ¹¹(vju/Þ»š¿­u¥,ÅZ½­b~ÆFilrF©l6–ï¬>[¾önaîXHõŠíÜÔ­7•ÒJzúªRÙŠ5¶+·g^“‹½\k£6“NLƒ¸õð9'_äë\z W)­\ìïajÕBD¬‘šÇbëSéþõêú#“l²/”Öjkwš;¯ªí+>¹9‰EL¨JGzscÜOô²Oª j˜TZ#¢mà9Ï›1“$µ:®½‰Äæ¨ÔR(·,ææm¸lÇÄhy‘ŠT!Ågz‰þ¹²¢”–µê†V\±ÐÃPv!4¸ÊÝ`n^,m’©eà"õ6Ù›ð“ÍÍÌÌU*1Ã&f@Šç ¤ÌÜÌÖ}XÈù¸TcéÚö½ïM>/.߉u¹xõâÖýû`ÙAÆ„ÔLfú(=sœš9LL_µ;Çϳ.\…¸D¢wX^>).ÜIö®gçOàpó¢ƒC9 *Ó³\vNÏú•Áà€ŠÅ9#iCuY_>kð7Ãg˜H"R= 4Y­5éb_²OrÊÇW\lÎ,NúOiÓ[O™¾Ñ/ÚÉ(ˆ+®ÛŤ`±LÏk• ËX(Ýé洞ig@¦Õj´ºÕ^;én=JMíq©)"œ`˜í_ð°vJ#£M­²“îÝŒ4÷´úŽT\&•j¤¼"„MN‡k;bm“é#–ôÒFuõ›žvÐz²sY+¯–fö–öÕWï„ÒÓ”\jÎì—ú{¨˜× +óˇÏçÞhm>ª­?ˆu.ÓjzcïþòåÇ6B5cš_*ôˆpe›N-@BYËõ·ï¼2=`åâ*“^äòk±©«³W_ÔWOÄÔìÜΣÒÒ ¿Z +•–‰Ô"¤NQ©e©´ï\EÕ&.f¶o¼Yž=¬v$ã¡ì•ª°RósÑòFª±=½zµ5-/,ì>žZ½eòK´Ö(ÏÕÖïs…•Á‚w½ƒ+•½Gz®gõ+^[[‘êŸì±ñXíŽûµ‹Ž` \²cJ®µwøVqó±ÔØUêÛru Q{Ãvž W˽}”/Xý¬ —Í~ÅÇ€aCĪÖ^‡,~ —j6\?g +| +&µP©Å&—œ‚¢@ÛÍ$¸ûƒ™Ay/g!4O0CXËÍs‰..ÚPçÓÀJñ™¥¼L¨5@p°ýÅU">õÊ„˜pZÉÎ~¢s5뺃é1àɹt®½K*%$˜ÌLï——ï€ño®?jl¼šê_C#5;©åf¼°4¥WhNC-Ìkå%T.z(MˆÕ¤d%Zž‘ò³ »áp™§µü k^´ãˆPo±’Š…”Éx;”]rËRnžÏtm¸DË…µ£·¦öžóKB~Iª¢×I©Ðž? +àfÓ±îÕHëH,o+íc2¹ ¢hÌÍ©‰öâåzeñå ¯›É 8½±Ê/…Ò³áôt¶¶òäOn<þh˜‰˜O¨1éåâòÉÔ•÷3‹'W·n=}ÿDZêÊ8¬øµžOÔéDïzýÒ›j}ÇŠÊ|j*˜œú¶»o˜U7“ÆþöÞëI²3»{W +Š;Ý]6½½™×{ïmzïMey×Õ]í»4ÐÀ˜äÌ\î’Ëà2vC±Š …ôèEÿtnvµÒ“¡ +F}HTWfeÞüÌ9?sóæw¢MÐé«¿ºþâ/ë³Ç‡7¿rûb´–뇵—ãB`PžýãoÌö±·Á.—ßmn +g/g&¸Óîêy4¾d±6z~]?ú*X¾­õªP«/žÇLU•Ÿ]ˆ}«ï!ƒÓ/G_Ï¿$ºS½u +X½W‘ ‚É“ó7…㯿àÁýªâô.»—ÂäŠÙý“ÎâñäðÙÓ/~nL.¹möžØƒçfç +lXÊ_{ýëÕÍ÷'/~[UÚUµïÌÞ6Î~ë-¿4zWæà†ö–`ØÏ_þÜ[?û(]Úw6ï_ÿËùãGïZ‹'à"þöÿ§ÅÅ·Ucâ/ßÔãmÕۧ߄³ç¤Ö;¼øê?ü/ÿÛ7õßb—¸@i_ú³·íãoë«×NÿÜnnž¼ùËgßþëÏQ£‹»s>:2»×RãŒvW„>Œg«›Œ7Á̪ól|ÚJ fÍËÍóßàjSô&zíÀÀ(~}ðø{Öžf óªY;8zòΚlçÄdŵ6>ÿ±±|Ö×'A÷ì¯þáxñþ÷RäV^(ÊCÚY×&/“çÀ›¢Ý7û—à’`V1©nvŽ8o.4OqwÉG›Úâ‹`ú:˜=à ~Ö]iŠµÒ™ö„‹·—ÏÿBïŸï¡ +çÎIØp-Ÿ3î׺„Ñå½Qóà-¦œáu¸zÝ9ýÕôöwWßü›Áåw¸Ñé7¾Ì‘*6 ´Ó’°¦Œ·j+T«û½¥¾Ìs!n ó\½À×@S³ùÊøs8øÕÛŸÕÆ +T±Ò:Ñú×á‚;j/_½ýCEi3Ö‚VpgõÑìÆ_UâÒ{M­±F•Fž4Åpæ÷Ž'G/íÎá¢í"z–sdüªuV‹Ì檹º]?ý~ñôÇhy3”7ÓÛgyÚ( ;?yº¸ùíÑ›­ônKB7YµÂÁ¹?¾.Iµ}TMVÔ[gì¥ÙjMžç·*FÓ‹o@"‘zUÚ`u[‹×ýÃÍÕ{°„¥ïÏ^Jõ ÀHYŒàùÆ팯o¾ú›Éå×´ÑøÛ;:3u[Õz ÕxzúUgþ °Qkmìñmûð«ÅíÏÑê‹¢ØÉb¶ß>ž]|YÌÙ3©q f Œa0~2:ûŽrãôæ»Åñ«;9»¸ÞŸ5úÛõó¿¤Ì1 _‰XmÀ¨ýî"\”£föÅönJÀ³Þ4š=A˺#€¾ÁÙ×îô©5º¶ÆWáâ‰Ö?ÇŒØsx] !‰ÖRãTmŸsÁ3F%¹:8|ÍŸV´ ¼¯ô(sŒ hñŽñfïbþä×e±Ÿ½oo¾™avÎÃÉSˆç²Øƒ™V[ÆÛñ)¥y¬tÏÀ$VÕ&i¶H½éuŽîQ—Ó¨6s·¤ ê‚Öß²ÖPPk‡§¯6¿àbý .)ol¥5Ž¤`™§,-œ„ãK«{èõ¡Û§}’§Á•·{ë·Vÿ<…kU1 ÕN9g¡µ¯p{–%Ôç»ßSÞÊÐ@" WŒÖÉâú§ÙõÏj÷ÉVIËç¯Ò˜Q¤½åJ Ô…Õ8 '·€d0©O.Y«)aE®æXmû£ÇfïÀ¼"ÍùMûà ¬¦Ü:åêÇi¦†Ë=ÐEZó“š²;¿á +/-Dš£x¿/Ê9{òíâè¹hµ”pÏ;›Ó›ï:‡o³¤nØP0'’=ÙJó©ŠÉù‹`ö|púÕ9­pa +ÑpµNoÍÎÙÃ$±›cƃÃÍì]·¿³¦_Xc0£ªnw‡¤Ù‹Q(XaÖ´¤ üÄ`Yfìhú$Z¼2 f¯„ÚAEïÄf†0i½U•#`·îé·ƒ‹ï­þcXhgp)D 1÷7¯†g_£Z³¢6ªzøýò«¿}öÃ?MoÖ†7e>®Þ z ‘º€]îàúúÝf—_¹Ãóy,̦E.‚@‡püöá×Û¿Ñ"ÚÝþú©Û;bìa !¨ø`e´.a°\{%‘u&bt ÀÒtNËj'Ã8˜Òì®^ZÍí ú(]Ic*ðª:ÀìiEïò2J#ꞀBKbºÔ8Ñz×æè9ˆº*¼œpò`{žE“³2gW¤0Ï×Hsê^˜½XÖnB®¹@öh·¬äé3¦Bí´±x×?ü¦¹|µ])¥=8| ±Á<åØXRi]ÐþŠr§yL]œ~ÙYÜ"BTæ!ŠZyÊO¡†äÏüþyº*í˜?îÿLÅCî—¥VŠŽ ý„£ëhô¸Ì…ÓëïAmFë7Vÿš‰wæt“e‘‘#¯½†˜/3cÅ;ÿø£§1&ˆa‘2»³yü¾9>áôšMËr‡ ¼ÑS)8 õá~žK#Jcò¸ôzQ³˜•(«ÛYB×Ü8ýë*_ËcšÛkLˆÍlÕ£yÌ)þ´"µ½ Ø©ô7È­s®vs­k:<"iY‚pµ]¢úäàƨ*7Y³ïˆ +.!×Õú±?y>»þõðäƒÞñŒoôö9®€ÚöË +„.sà„>¼©ÝÌ;K­~  O‡þð±­²˜Y›”=Ó{7ÁâMsýmKI½3>ÿZŒV¨Ú¥ìy†®ÁˆJŒ™ݽ­x£°b4–Þðš´G)ÜH!¢æ íú:i.4ÛgR°æì)*µÊ|c¯$ï½~À»óDYÔ.¦7®;†©Ýxã÷"á´–ÑèBëOâ½þ¤ñ­ÌDEÂMUõÛœ]/®¾%”îƒ$OÈT³F”Ò)àæ^Aø<æq¡CBïmÅûsr뀘¡œ%ã¯A¢ƒñ|ß—&M!X‚}øü¤or|”&}Êœ·@é´Ñê¼=ýòïû—? õÃTüåD“V|Æl±n_kZ£Çऄú h`ƨQŠCˆ6c¶åúJi¬AaT‡×bÑ>¢ôFUbNŸ>>yþÓáË?£—%®ÁhÞVÄ•›Þð‰Ñ¾ ãM_Ëóß(‘–Íy«(3e΃Â5isd ¯!—I£/8ýÎú–¶úe>âý¥\ƒû¦vø KXw5µVÏ•ÆAžõ”öùàꇃWˆ?‘<ýVàqúó›Öòiž„ð¸µùæøå_^}ù/Ï~ög·Î;‡§ÏÓZ<-0N–´³„ ±­7ŽDkÂ(­L…w[›áñ{ÈVʜوs—ñ…íK‚v—¯zG_ÉÍS¡vH£4nÁ:ò6h‰×@¬7m¬¿€ÆãdoÙ"$Qàx½)˜MÎh4¦O´Ö)¸§ªPçÝYòå¸""|=UÑp©%ù+ÖžñžÒ!Ð*wÒU¸ À…YW¾o +³iâ.½áãßüÛZeRKano…¨‹Îê¥Ý:.ëH—»(:©“*ÉûŸ,ä ¼ÂדtðiŠÜ/ ER¨4Okó×ïþîìKBmöo2¤Ф֖R0'|ëBî€×û08ÿ)®7ÄÙFc¦7—€ZdtœàÛû¨ã4N‡ë·à>Á#õ:íŒÁÁM.§Ï²”–¨²˜)Í#­uDh-Ùw7¯ûWß‹3Ü#b“4F|°F¥2ÈéŸÚãgÐ1pCà%³¸ÎZ½}AÛÓ¸æ =rF/É[±vNýD™ýkõÆ¡èÏìöÆj®>äýÈÆŠõcoòª¾z/·®`n3„žAÅÓç?5—ÏY Y½_;ˆÜ¥íI4}ÊX=\ë4/ç†Ç¯;ë—Bm] %ìÖQkz£×– D,ÒnŽppmĸ³dÕØÊr;EÑj¬»ëç%ÆIÅÛXùB¸ž^|?»þIŠŽ’Ö»ç/ž}]ê”5Þ´{×öà±Ö:‰¯F@d³}N#JóQQ̱fL$À=ÿ€’êœR3ƒÑúæ[½s’ãjJ*nŽËRQöð6‡[‰cEËöìÄsªj¿í¿íŸ¼œ}匮@%RÆ@®­AØíµ~·xúûáåoG@±€NÀÕãt«jMižX£WBë‰ÞÝ9øvxôÁêœçh“PëR4'Œ6®6AK JKkl6Ï~wöå?§$«J‘4·Lʇ+uðwfµÕWÝÓïo…ŠµáúÖZž‹òL UÀAÏ;ï››o)ks^fA¿Í¥úx´,ã—ùzEn“ÛÙ“Ÿ*`¤¶èÍHk ëU› Œ=ã/Tv“UĘÙ<8þjóê÷¤³Ú)«ITõâ´J m_ªº“·›—»zö{Æ_¤P”d{yÛ^>ÅÄЃ¥¯]yëÌÞ‘ÖTÍvë§ÔÖ‰’´[ G°øÌáã`þž±§U!L”…2mIî @iÞA%ÀŸPp—‚·fí1*ÖdDuøa‚ôêf¨XyƒÑmghуǵÙK{xS[Æ%xOñúª×EyK°zÍñM4¾ŽfÏ…è5Ærbº,ñ%UõDIL#µ¾V?Ò[g˜ÔÞ+ÊŸíã¼Õï,žPZc'ÏžbÓTÄÔÎìÕwÍ“Fã €ÊQ{Ý?|nñ;ØnQI>jÎ…ÖÝ»Ícææz“ÕÅw’Ô/¶xiÍÍÁã +AcJ2ºj}i4j4½.‡¥x+­šÛ9 §OÕÆš2:ðg +v€ˆu@up ˜¯ÚŠ0»R´6ºWRóÒŸsÁ†4KñéÁ¦Ü8²OÁPCô‚aÃ%ïNýÑ_;HP^5H­ëôΔh oZG˜ð€òˆÖKÓnæÁ™`æ0‰™b°‘Œ»"´!hãìW@ŸÔq¥ ê"]‘J zMoœKá‘m s³¤GƒŠÔN.aÏhÿ@m]‚ƒ+‰Íaìi!Îêðz‡6lxýwÆ·IÂ|˜e2¸ Ë]•Û¸Þ¢ í­€Ð;ë7Áä™\_R ìmÀ—eèp¯¢h_«;cJo'ÏŽÂô±ÞZk?Nânžö! ¥)Úý4ÂÇ»U 0óm!X!‚¤HUͪÜÇ‘£ÝDE&Œ±Ú<¯¯¿ÍP`¼­,“«¨g_5†gUÖÍãf‘ñ0!Â…néEsú|uý×ÿßÉN7iÌ‚däÃSTŽI0JÙª`¶6‚;ÊbF‰ÒUdˆ(Æè“R=‹L£Œ pÁ!ªM÷‹b²Èg+¢du@“š “ÃìÆWd¹ãgRãb¯êür—ÍÆ›c£v˜Au§}¢µ.{YdbÛÙÄè-Ñ›¸½3ÖèÄ›Ÿˆ~‘Œ} +.ÕÔpi¶O½Á¥Ö8‚©ÑËçUTÆ‚¤Ã9mu(£Å{#1\ÈÍLîjO ×fÿjòø7³ÛßY£Û"çÃ`+B-6eb«¬ šâ½†—j}mwNA-€‘Ǭ1¢ h°TÃJ÷1pV Èžr/ê- +1“¬šßV§´5ÜJa©+¸Ã,á°öU†)ÜϦö…pS–z Ä„Ú ío¸ð(ÃEŸæ¹ÏòL +×8kXå|BðæDŽÚ½âjLjÞO(.LiŽUņѾ𧯽áÓåã?÷†7²Õ3ê‹dEÜG¤²Ø¦í¹Ó¿™œÿ ÕÏ‹l}¿$)'GXûeðMÎ_Ó ÝÛ— ð ”³“c³¸0Žimðƒe©‰#ÐðJýÌîÝæøQ «@ˆ‚Vê‡f÷2‰; D}PïŸ3 +„˜«ª ²¨–( +É’RÂuË´§ýùeªÌï…ø„žÚ‘kÇÂÛ-Ê¿Ü)•iÛ5êÉn–£Ô®t!I)½Ñõ(I|¾S¦¤WÓ‹Ò˜'¼áäQè¯ÊGE&ØÉKœ9ê®_¡J#K˜pw»ÙÑ¡Í)üÜ)(a÷ø»ßÿ¯}òy‚ÚÊi¸>e’'´2ë‚<Ú%ä&D5t âŠR›ñ>½N_æ¢7I`¶œþµÒ8‰O¹0`Tª•»@›À„ÖETâBR-wΞ5V/ÃÙ1ZÄ›°iAlH‡6† bÁ›ÈõCBƒ‘¶ò´‡*íúÁ×öä­9z£õâê „ÞM] q\l¸ƒçF÷VŠN¤Ú ë-ã c3T…r’'µvb´o÷Ž (ªwÇqev­Æ!ˆ–ŠÜ£¼MIæÜì\YíË"aÓb¸ºxÇ:#L´Hxqåz£}6³Äy{eAòçÎÇs’l˜ÖËÄ>ˆ+Ãxå0ɸ’`Jè#€Ó"Wß))Ô!´‘ÙºƒåH#ÜÍŒHMÜ=ÐIãú¢æ$œ½r‡ ¥õäýßlnKX³ª2 ìi^hìcVŽö =38€¡©¶Î7ÞIJJû@µ@a[ž·&6„„­­Æ‰U?bŒ„úNûXÚ^ßÎ`{Yf¿¬UÕ!ôLHÒÌ`ýøt+'îd °D¹0êà7!ÞöJÊ£œTzZç1 ÿnN¬°ÀÑ]˜URiae \°Ñ¹Œf¯Rˆ–Ãl¸¡|K ˜ËTr+‰êb0G¸àÏv«ID¯ Ñ[(á’³F%2ØÎHû%“±f%¡Îx„5‡fMÓL¡ŸŽ¶ÆB°êçì…ּĴa™‹0¹N[%ÚÔço¬þ“ŠÔ/ríÓD„n¢jeB¿"Õ ½þ°ŽêtD=|Ô€Í2¼KELWã ÖŤˆóÇjû¸±|ãMžƒ¶A¥:­w8£]_t^³Wõ †ÌiµUᥢգ1´ÖjU!¨JÀÈs• +ë¥Ê«w¬ÆFrƤÚæ@°i0z%tu4Ož¶Y«y¡5˜¸–Ù ”3cÕƦ,ÖÁ‹±€aô Ñ í¬€# +”ö€±ºÚYrÁ1$#ª¶¥úA’tþôQÐjŸ³öxj¿,‚Œ§ß=|ß;ú¦"·Š¬ç ® )Êœª QÕÒ˜138}?öró×zõÅ[P‰>ÊÒn†ôÜvŠ +­uµú2ýÑWÆÅ¡Ì)¸à…½Š¶Sà+l@*Ý, êìaU‘öRë\FÔÚNž…ä‚&Ë +ïÐΆÐ&¨<ý £ww²Ô~^(’Þƒ$ I˜ŒžYÃg‡oþÕ³ßü÷Áèåƒ$SÀ¬nïäx ã½B|™=©kÓåkÎ&mtø¥™Ú>j'¨¨(J9Z=þáÛ¿ùŸóàªÄvIhÆÔê=å½5ÇÇj5TnWÄ:†\(pñ9 ΀LJłÔN“0‹T»”kçiÂ]#=ÐT ‹¤pôJ›}Ðù Æ \D=o|ÇpüNž®•Ùë„|¡¼ÇºC¥µ‰¯þíܲ +Fƒ6ZˆvãŸØÝ „‹J”#Ú#Îèæy'S΢B4åè°¹~GYÃå$•QÛ‚ÑÉ£jÕp¹)Eöè™Ö»®Èd\dÙ]Z`ÒTÔè©y P©6»rŒË‡ wüÔì]æ ’Ü(ïmÀ»-]•DéO^Sö7z\¸ÚÅ_îc%ÂQ¶ª$‹,øqx_@þpúÂhSåFã pÙ1`€Ú”!ãÆÆÍŸüzýâwNuÓÙÙ)ˆí¡Ô8†…ÆÕ!©ô)­—# HÞIÁT\Q@Å•!”>¦ö +LðÙ.²e¶òü.¢%P³¢ñ 0ÃúØÜàR+ƒšjí”ÐÁ¥6Š”›®¨öËU\êAˆBÆy³—‹—Ý9ÿ¡¾þBm^¤ªî§{ÂÄBëa’*‘.ð‹Þ:mÌ_«Ñ!¡å!ãæ¿2' Í +|‹mßt/~¸ýñŸ¾üùŸ¿û]–ö*`ÄÔ®ö9oQâë ™Õè@ Öœ¿À~·÷«v +ÈTh“æ â$C»µ]üèô‹\|Š8ŽC¡AéRïX¤/&5¬ú¦³| A˜¡|R磻® (cA[KC(€!_'ä Fd›ÒÂImù6Z½%†t«p^2 LüiE‰ Šl SÀ,‰þø÷aŽÞ-ФÒ@Ũć¸> ivŸ³/aDÉ’¸“¦°˜7ëq¥ ½ƒÛ#Ú_ Ñë-rŒ“¨œ?•›ÇÍÍáúéÌ+ + [þ„iMTm‘•Å†X;®­¿©¯¿¸ØÊR‰²ŒJM„Ë‚îB¤.¡J¬. ýçûh¢Àæ15U*ñg‹CÂ!R ´œÍËbÀ9òÊè=Ñã—SÊê€.‰5)˜yýó,i`ÖZçbm Z«ÄDɲ¶g2¨ +ì_ÀÍ϶Ë%Ú½gÏòlcÑwu·(¡?ÈРLJl:„2Æœ·¦­¬Ë^IÜÍÇ°ó(C§ãbÊ^TúÇ2g”:R¢“,åóÁRªm€ÙÁœ>ÈóÛE£"8{d6×fsµ›‡iŒ€4aYwKÊNICµ.Ìù`­7Ï‹€¯AËií+½q,¹cZ¬¥¹(´!¶AQ'q{·¢Á-Cº’¿pOìñs¾u^Ñ'i°åøÚ€<éƒ`àjgLpH»+XàeˆÆ²Ð€IãÖÇG›4p«Ü‚ÕÌ€,:$¸l\í‚T.Bd±²m.Þ­^þëæù¨2€ƒÙ•$€Þ‚nñµ¾Ï¹Ú¦ +Ô/အôƤ6¦t0y(gRãFïÜT•î~$ M^ºƒg|pXà@´÷Yg †…³Û%Œ4½õgou˜eB°¨€Ïð‰Z[!¬]•jb°˜œ·¾ý 6˜gX/M[œ7áüU†òŠ€ZßèÝZ£Wbí,Ï„²d>‰¯à嚶”»ÁŒ ˆ=Ѧ—`öÇoüÅ ÒÝ”è§^b\Ö”X·@ƒÑåpÕ<ø²uø¾µyȺ ‹’HNÛ96Y†ç„B0Cø0U‘·3ô~A€À® +µÏØN^¦àÝe8‘eƒG~Œ!i—+_Ò£ì•ä)¶HXL@ ëEÒÇ¥mÅW>ÄŸ!¢NŽ®ú™½Ç0Ò‡YSºÞðÖ½jGEÚ}»U`ö’[ùŠöù–Å]op½~öC8\5€’âεú1P3hx>< o»Gß—ÄNUa•J?My»ˆ²[–1©YßN~5ºú9X½OâîN|„\ C`·’ÔªèC>:…(Õ:—`:@’Aúì”T˪ԑ£sj°”‰ª쳇Èé?âÕÇïzRL%ÔŽ­íÎJm€ïö‡ÏäRµQd@öµÎ æLqwf ž ÿν̂ü( +ûE®DY’37š—¤9á ŒWò— Û@秪0«:ôÊê]ŠÑz‚©ƒªÜ—‚5eôó\­(¶YwU_¿–_ðáQUé;&µ–è­öA´¸åkÁüUçä›Îé¯ ™âö®ÂÙkÌZ”¥mM(pF +¤‰—¬ðeVÿ ¾þjþì¯ÅÖ€@ÌVb“µ&ŒÕ£¬–Ñ;êg„±D•ø I‰‹öJŒ%›„\Ã6©v "Ÿµf¬1IUŒ­›ÅL„­e0à¾(ƒ÷—Œ9¥ý Eþr»ÄéñIž"؈ ÖÞèI}þŠw§© +_ 5«¹¶[§Ÿîaþ`oS rä&÷@.öîyRþ+õӸ첳.²­4êIÞ!¸ì4f=H’yÒ…ð(‰= ¿ ì•G)ªJ{¬Þ"´6¢t¨ð¨qô«ÉõOÞð™àÌ!•¤`Þ=úxs XÒ?’gÀI‚HÀĦß=†—Ñäæ6QuáÈiÜòzTäR”…¨}¹}팟É3p4Œ—úÀÔÁ dw]UÇðû¢$Q­Èñ÷º—ZÿÆèßpμ<€?Ì3¬ç.yÿ¼9çŒ9Xµ¥-ÖŸG‹£«ï—¯ÿß8Ý­è 'Rˆ(Y]ZkåI+…ªÀ5jëBo]IÁf7ÏìØøô é€5 íA Ӕƙ\ŸÇ×9ÈmÊY€}“k‡ˆÒ·ÅǼ¿¢õ.m´9»§wOÃå³åÓŸfOÿÜ?+˃S£ Ð9+LiâúDOâʞ͓ŠÞO3 ¶Å +ç«Ñʈ¯×=©š’5Óšgbx|JÛýöæE|ž„ðá–"<Òœƒ9-sõííæ(„sœÎ±Ñ>•g©›#à ÁÙP"XåøŽØÐÇBtˆ£"ÓØ)¦É ~}˜'¬¸ÜW³ ò'Ï´æ)Û®CÚ6§·Š7ÿ“Ïs0QJýÀ>›×´5ÍAd&©TÕÈÙÓåæ©@ðoC¨#5Œ??I”• +WÕX—Ʋ2rA˜c¼ƒŸF^ oôú!¥ ¹[kvû°¿yY$,@Ô íÅnÏÒL´W5³L”g"Z€È©.« 5©¯¾—¥"x‹­’PQ;¨>,Ë­œ¢ÖØ¿ê^ýÁY~‰#H(€ôW3šçõÅ{¡qêÓ,[OÇ×®4!ŒKÌÛ3àS˜FÐrŒ=†|¯”Ä °ù„>°ñ—¯AfH§½~U_ÞpÁ ªwª*àØ¡vZCJk¥p-‰ÊB|y€±hÉŠ‘AítÕ¨òñǨÖàìöàì+©y‚Uû€$€«Â£íÌrL _úU;T;W¬»È3.ØF„÷o$‡Îé‚Ø£Üe÷ä×zïz‹Jí,¦qþÕÚ9Ö/ð¡Ú9™]ÿ0<ûÖl°Z"÷µÕÌœ@BåèØÎ?h¬ÞšÝ“4ªe«F™©CpB¶âö<ÃÔ YvK©µõúªÀù´³$¬÷0ÁÕ*¶e• ªIêÄ_㛤±$­µB|º%™6G Þ÷*fExóæì­?{²äAšy¢>À|Æ Ï7J ‡í¹R?‡°'Õ>€ç£,D¬ +Ö/1V;Áƒ”)?‹Å› |W‰²¾WP²DH“1†ñw7”fžrfh€YÀ[ÁSÆ "Ôr¸íu齃ëi.HÆ_ën¢ÆŒ4FëÄ©uˆcÂ¼í¢žÁaâ oôÞeEë‚ò$í1í,jóx+r}t›çšû¨•gÃB¼¡AT•[ÐC68ãk׬Ç)s>©–öŒöÕøêÏíñ-¬ò´¿WQa!ÊXr#…[ W¬ÁËhñ^nã­!Ð'UÐWæ Ç»ˆ¥}±© +S›Ÿ%‰GYr° ÀÖã…z†«aÆPnaÖøQAFøfw3˜W•ZU¹ /DZٿ­h£­²’‚¤nkÇà•ÚJôO\ÉXÍCÚ™0Þ<»[%p^6@ Èò i죊Þ:œ¾[>ýÑì_$0 TDŽpdoáõ/ãÏ1…¦Ö8µº×ñ5êµ£’ð‹­\Õ)sY“ãëltnŽÞ†ë¸©÷s¤ó Må‚D]–°·süÃ4Ž ïÍãËéÀ\¼¤AÜG] ‰‡%–BH©ÊÁÞš²F9.Ìñ]<Ü­z˜6foœÞy‘v‹”£wNÇ¿:|ù7îð),ÓV^Üôãêbp ±W1h{vöþß·Î~C8 Ðê»y‰1§Áðäìõgé_î`±Û{ò×ÃëßÈÑôæ2û)ÔLa.HÌ(ûòò›ÿFïaÍÍìêDzÜFõ~E惡2È6.8 Œ~\š qs->4~л7ˆÐ TaÑ-’T¸]õJBOŽ®Üá;1:Û)))ÌŠ¿9ymôŸ•µÞ>aíW5RngIûQŽÙÊ1e6ÔÛíÑKÆ[%qãaŽ+Ð>Üåø,PÞÒ¿_ÿ¾uúß8KQ0¡ôˆ±•÷ã‹Õ£’ÐRš—›××8øa#ºÃ'Öà™–„Ú.ªï¢cŽµÚa‘‰Á³,´pm`÷[ý§E±Ÿ‡á?â€ÞE¤FQ¨øXTéJ'¶BˆZd#!Þø"Þüî&\<bÉTäa¤Æ¹;}möo²¤¿w b5“e)‡k\ßÉÐÛYájrp †p»EbÃl‚˜ßÉ Œ½ê]þFé\qî†Ô'ñœøÓúð¸H©¿Ü¯Tõ)žƒ×õ¯¸`£þÝFSˆá„[cû :99¶FX0{W„ÚMáŽ7y±yõw­Ãï”öõ^Õÿßÿ™´ñÿßøÿªÝ䮵ûܵv?»Öîr×Úý@îZ»È]k÷¹kí~ w­Ý䮵ûܵv?»Öîr×Úý@îZ»È]k÷¹kí~ w­Ý䮵ûܵv?»Öîr×Úý@îZ»È]k÷¹kí~ w­Ý䮵ûܵv?»Öîr×Úý@îZ»È]k÷¹kí~ w­Ý䮵ûܵv?»Öîr×Úý@îZ»È]k÷¹kí~ w­Ý䮵ûܵv?»Öîr×Úý@îZ»È]k÷¹kí~ w­Ý䮵ûܵv?»ÖÆÿë?“æmý3iÿåþ¾z2W&W“OÚÆ'û¢‰Žà~4¹¼Z\|â}²?*ŠWÊÁìêàôdrñt‹‚‡J¤ºUŒ“£­ÔŸ¹OÚò/V'ð`m69Z¤·rðTþÿ¤—ˆ+]\_®ƒÉ¼ääJ xÍÿíáTãädr¼˜o}|t ÞB4ýIiK„ÿÛ7ñ/‹O®áŸòVéãí§pÇ‚_6ðÐÍV¹´ånõ¥­yüüè“íàhAýñ׃û?ç2•Ž{ªRTf‹H—¶ÚÞ'½­üÇÙü8ø—ÿ¬?D¥PÁñ2¶5ØBJeaýÿö5ñŸÿãëþã¿ÄVzZÆ?vººõñŸìïìgÔV!‘ò'm󿨈,içSZ¸ÖÁåVEh¹ª kŠ*]„«ý±ô·è-hkLýf('CÆÅ4±^EÊ¡Ô&kähÉ ÒžáÖ´ªi÷ K¹{Ef/OæP•j´3âÃ&Üî²jób”ÄM)˜0ΠÌ×Xg)GGZë3Æe¾ÛsDîæé ™ˆÔÆô!a åÆQQno•¤¸n³P‡Î§ªz‰ 9gª·ÎØ`‰™ƒ4e—„¨À{¨VOZUm*­S­÷Äœ¼aë§%¹aý4å¨{üLí])­s³ËDï§(Óz¹•gü}TÛ/‰Ò(³®ÔQ¥¹Wὡ•"Ý4ée™ ¢t cU¹EêýªÜ.‹»s£6.JR/Iº»m¿ªg)Gô¬=NãzÕh}ÈÚSLîf0'‰hÊeô¾Û½„w,1>©öeõQ†É`vŽôò¤—£\cƤª+JÑ’¨•§‚[+³5BÀ¡ò¤_ÚÂÝCd˜±<fI7K8Œ1â¬i‰«å©p¯j~žad˜¢¸_Ë´‹òsˆ™ID.’ÖNŽþ,‰î”„fÀË3„W:×(Ða²¢Ã* j7G¹;9&ƒûeu'/¨•û¡‹+CÊœÒæ¨9yb´Ò¨\dk´5kŒ;I¡zªoá#L׸$u’¸›¬¸Ò•ÃµèÎÊ”§„+\ïf/‰E6$Í)eÍ0±.¹ý"î—E<.ŽzD9U}Š³ªÒ‹ z µtU)ó!®Ác±qÂø°ŽÃ ËÔ8¼ùópzSä‚"pþƽUÛOQm”c£L\6ÓÎV7Òx\¸£,6áOy¶žgjûm§×âËf\›Hk¸¨,µ9möŸÕf¯Fçß%?C›Œ;S:WîüÚ{‚ÚsÔÚ`uñëÎÑûœPKb†‹÷ÖðjÎQsZàj0“yÊ+1üc¹..ƒI:°[9v'Ïǵa¥6ÌvYíæùFo¸fQì”åfòc!T§É¸„l·Ó¸•¬Æɲ¸YáÃí¤1=‰¨Ùª™ƒ?!R™®ùí «y +qµ¦÷‹Òv–}$ˆš‡(’z„1+‹ƒ×aŒg--OºE&¬Jˆ"ÃoúD  lðiÿ³D"“Ò‚³à­yö>O‘‰’šÅâÍ?ݯlgÈ2é`rW6z”¡¡EÚß- +ûˆ 3!ü’‘ƈ҂ÐÄìE‘ Sˆ”ÅŒm˜„W¢Cµ~®7¯Ôú%©¬ÆéËÿ8¹øêOeYoWYœÜâÖ8‰“(Èî~U÷ÆFMHÞŸsΤÊGߘ~àƒY7¶J*4ÍÞ­Ö}Rëç&JÒÇúHsDløFŽkVõ‰KÆšHKpÆVÿ’¯-«zÕ°¾¤=—ëGýÃ/¥h]â\nKµ¡qŽê“<]¤‚)*±A–´¶ +ì^Y‚pCÄNm¡ò°Ì·P)ÞC=‰ª`j#ÇzE±!7ΛïÛÇ¿ŠÖ¯ò¢* >˜³Ñ’ŽVUs"·®kówNÿqgùÊê§ãÒ:¬»hoUVUcć­Sú0®¡Z”vËÊnY- q‘TE{"÷ŠR™«A$ïaæ.ádùvQ"ò˜¯_””ÖNY„yfýM³vJÊçY>‰š°²LÏ‘6ÀüÌSn5÷óÂN–ÛÍ 9̬ ¥õ·²,<þ0Eme˜GY:…Ye±Í¸„¹"…èŸî&ƒ»˜ÔŽkʱµS¯ÊCD°ÞÆèÜ RëÓ¶•gqªR  ºÄÃÝO÷ÐO÷ª‰’P$œªØ/ Ý,äp“G¬>¬ ÕÖN‘ß*ª{á›0XXТ<*°!ÂúEÚ{˜&SˆRf"RÀªB‡Túdèì5,ñ½•£ì¡Ö<†Ëî [/òýŠ +ÈŸþ8ˆÔ,µl\[,­ñpóÀØ°,Ô‰¸nɼ(´v*ê~U‹ 9S)\ÆÕ3Ì>¢´+Z¿$¶Q¥_`ÂtUÓë›pþ\¬­ÔÆŠ‹¨Þ£Ý®ág˜Wh:ís.˜m—…=D)1uÆ^T¤nY€d¬'P#EX ?LÛGÍ4Ú”uHX»_äjU©„E=Êf¼‰¾Ü¾âêG%¥­4O•Æ!包`†9sðtpòc¸x‡È­n&P ƈú Çî" +ï®á+£ó$®fŽâB©4Àx:°¨Û%)»s”ð )°^–«Ä^YÆJi=%‹«aŸ2þÁ^Eß.Ê;Eµ*¶‘x“x;O»%¶8SŒçÄØJÓiDK!ê~AØÎqʯðÍdÅØ΋»E%‰è#Ÿîc»E1Kù„>Jàö~ÅLTÌd8&aXˆkLu!l’„ - -LŸª¤ÇGh D‚ÀÎÄC·+l­DRÔ~IÙË Ÿïãy"‚i„„èËà>!uôp%{S颼{e%…še±K9ÇJã\Vi<ƽÝ<·c$ªS$Ê×ÃÞë.‹Rw?“Á%Àg\íQ2Þ/ð­ß`­)¥¶²‘Èš á±z·Äx’3«ÍßØZ†°r”‡ª¸HèµÉÅ{+£sV¢‡E!GÃÁ´1!–ƒ% Ó<ùöÇ·¸ý1'9ÎCÍåB°YÝÇîð nÄ Ų„Wº¤µæ .Ê2{E%Uu!\ãjÕH2÷AžÙA$è-ë¬qmT;0íÑ –aòÓ˜8ó0Míä„œ˜©:º‘*ƒR‹¤÷(Cþr¿òy’ÚŠ Á3q™Çˆ=ÂM–U`¢"W‡¸%­9„ +¦ *hlÿQšøl¯’EáUávIxPä%\î5§¯w‹€™!hÀv%¡Ã8³ûÔê<qEIÛ<0Ú§¨Ö¯Èˆv¥!ºSÐœÎè6…9¬Ù§ôn†tà(}1àŒ^êsÒYÌì2 $¶ÅèÐì]6—¯žóo:'o bDX#Ú_ÓþXÒžrᦪ A¿ep8E@}ú”…Wâ:®¿loÞ'É M†¹G›cÖ™QÎ\oœDÃ'¼7ϱªtP%®ä©¶®ìÑs6X©Íã'_þ­18XAU!›œ9(v@Tˆd@€,Àï»%©H:qåk +8ÚªÜa ±[äw \¢¬ƒlÀ”!À¦Ý½‰ ¼çyˆ“ðÞˆ«—S+CT7ßÉ‘á£<÷ ïä™DYÌ`FUh° ”>)÷}’#À¨ªÒÝÎKûˆ²[v‹RŽpU};Ï>L`YÌÞ+(ÓÜVNÍ@ê¸AØìUÔ¸H/ßHô•{à5 Ìàå¡ËÝDÅØ/Éû€B úŸA]»1Q”%?ObA2€Bpäø'ô!š?¨ÐzüuñAÞ#b«"ÁÜvJl˜(É«ÐI„ +”ó0ÏAV¤ÖÇbæîN‹-!€$߀µ ­•=xÌ¿‚ !·XµÙ_¾¨ÍŸýaZ×û¬;ÑêÞàšõç ?x{ÌZq98½q¦Ô/•úœ +µóŠÚ@£¤¶7¼Jà:¨ñªÔõF/«/ÚÇ_7¿"ƒ)˜ÍúâÜ:O1Q^hV”žÒ<7zOÁ¬ÑκÄØã¸Ø#áô¡rGiœÇÍå— ÈÓL«,K "ä¡õ ‚pÍyËŠÜö„‰%!Èþ²ÐP›g̓÷RëL¨ÚÃë_ÛE´²Ð„ð'²S‘S¸jÔFqiÔÚÊñ¤ØÔë‡e±±Uà€›± (Dhã<êmÃLƒˆ^ @?G©f ð«T¸ý Ëm¤$nÃ[ÀÝ,äˆún).%Êg+Ë€Œñk +-ޜڭKJŸ¦07܇{ßB¸&¨ÖnƒÈßÎs@š¹êÞ"…h%&J”b¤«@‹`Á$Ö“ñs|\B‚ôC$pÎœPcšÁ­ªØâœÌažòw B¢¬ä 7/ATŽ¨ÛÍ‹€„yÂ4{˜a€|ˆ·<`©oT¤#u2Úp§,?H“Ø£$•Á, cÚín˜´T£CÆ›î¡ +"Ö0­ËysÒ‘δ¤ö +RKižµ¿‘[§`¯ªÆ¸¢öY%ÖÏØð˜vÀnÃóӤђ¥\ÚYµ Ê;*ëÓŠ>½½WÕ lDš#Dj€Y­ @Zd›bpŠõTU¥­QœP/Éí’ÒÏ ŽUô7fû*M9)ÂÌ1^Žñák÷¨ o—`(ZíkÑAÒ0EÀrÀñ«JLw²¨&‹rp`u&±$¢TÅëÐÖ¡ «\{/Îbd̃ õY +ÿe¢šª‚Ghg à…`ËNQ? ‘ÖæœÒ`F’¨“B-0„:Ä “ŒÏ*˜+Tj—ù:¬(^øçàâ÷J°ˆ`·s˜YaÈGXqX€ˆ$ªÁ”&+ÚµÛÈ!`Úƒ4 oÂÎàæËÓmD°óT3ìNÿÈtµx%Ê‹–Ü.N”e0þ»>O˜iTÝÉQ´\ãí0õ^YÛ-©3<-„©%ù϶³%ÒÁ„F¬}Õ܆À(I©ŠJ(Þ?Jbægi|·,aR 0'® Jy’äV–Û/«ÿb'÷ î•D0¼e&LÅGI’b¯(—c´©IÞ€÷QŽý,‰ÿb‰ñ7¡Fýíø\ŸM(õD™{,=ØÏ?L”Ó•TzàidËœl÷ãB¯( «ë=¡¶W +”Iõýª +üÃOct~a¬ ªuÓU™u‡e©ž%HDÞGuiVÿã.®¡4“¤ž¬ÆUd“UáCµq$EÎk½³ªÑ¯(]Üœä¹fŠòó€xƒgöøyQh`Jt8;ÜYd¹Z’ò€%Õæ¥Ö»ÂÔ.è4Ò_$kÑ·J2X6X­~B ”?k’¸µ•—öÊ*¢á©Ñ±Ý½Æô^Õ½Á%Œ·n‘wQ RêõÙ›hýMÕš‚½R‡E>H¡ ïy2³€£ÈP}õø#fL¹yÔ>jBÁ%‚½µ1 …c.âa47Í÷Ž[&MnO@ô`«XÐ"½²‹©åe¦:°¸#3z Á+fõ‹d°ÎsØHLس÷ÿÿbs—ü$µdsËçoÑù[ˆÃP_ÐÃÂÅ 0dð[qó\ h·€(–V›:\V‡ àÄ$ž +ˆ ˆZ¦ÁŽ‚!üê˜ó¦Qû 7è¨ØZ7“7¡a*[@F|¢s°¶€!¡ÓÍ^™ +ÅDsØNÞ8,ƒ¸ÙmðÅ×ÆààÝxœU.,ê„@£Çmô@ÈŽ—œTü€Î Úí`C50Nà©ÀÎrãLLÃ?A)Mب ‡wµ0£6|ZyæÔ¨“5øœ¾à¨9ppÒê9ÐSWØ‚ibj†RªÃ“.‡—õ`’ÉŘôŽZ•Àƒˆí¾_–;ˆÆ6&øFðùnJCÅPúavâÀXXÐMÔ)põn6$oõ͈=«óJ6B…äK†*žq/ç"@1 n:™ÅI%lxÌŠEÔìôôîD¬51BÁ¥*ëÊ…e4àœÁ×  ÃnÆÍ$äô €ÍŒ¾óÐ#³õw<›h¬2¼xÝÁ!ôÃ6ÚÃÕÉØ,ér¹U3[0ûb„\APàsÁ¥ƒw¢ÕΤ—?¨÷ ¹Yðº‚Ñ/Úé¸Ö줚ÊÏŸ¾ü´Á/Þ<î°¡A^k9uÌÎ2â7Ž”jŒ:ø²YЋ?hò +V4rüí@ïd.ÒX8~Ÿ!>`@-¨ÁÖêZÑÈߤSàÕfoíödsû+£Ž[Æì#FŸÆmk" Z°8àÓ‚ÇÀךpIÔ|€‹7DHVixùÔ°Åž¼E‡Œ‚xd”Nùé!á Lc Pσ`œFì“6Òâ‘!²!|^LöÀC›š±1 6a¥ÇÌäDH‹ h„˜&å>ëPšfRs²i="¨ë„ËëbyOL[ÙÌ„è.4ãzÄA;Ù u'“÷É- •câsŒÚs5ábLþ ÁÃúM:eÒ_à˜“> wß4a;¤wÛaœÚŒ˜“­P¦;f%A\PºÆu@çµ°D¨…ˆU_4 aHâÆì„ùƪ‡dTóryã°sภ¡àm‡uîa½wØàƒBø¥kz…¢Þ2zø +ƒÿЄ úZ稇-3ñ%•6a“¤ + +4é‚a‡ô>ÅÍWùì*ðÝìŒ[ÉC Ë˜ÅÉéí¬U¤xgܵÍð¶>ibëDÀ¶Îv è&;ªÜÝ„Àx`Ò7b&Ž¬ÂŒ8³/ê¡ràUô.yÜÊŒ™ZŠÞZéXƒ( +Zªû…¼ÑÞ5ó«MXÜ„¥ltO®†+û\nÅFÄÝt¨CïÃ`#oxňª Ú#ÒBØÉ뼂K¡|Ö/Uùô­ÍZ©ä•rr9—>„¾Æ´e&¿‹'æá¿Œþ¨LÙ˜ulÌMáñ2¹HqNÙˆ´B´†%…±šôq£š—¯zùŠõÆ"˜ì Î؈˜[ÈXȘ}À]k dhpšÑŠ‚±Qt‚¡O¬¢‘ŽÊ˜;ŶT7;8”3‚æ¦r>©î ÒN" ýzª³á£&p/æC€._ü$¬Œ“N¶híÔð ¦ÃtHç±Ð:_ÄJd\LÑè× ~ÍI®hô + #°V`Å!öBÜvP#q‘)2ÜÖÕ7ømÞ ÕÅOš ½ó1EK@³øc<< aÇv"íá +t¤MÊÕ13ntˆãfòŸ‡ÌÿpËäÍcà(Pç›Ç\ v‡nlYZå°™2@Ö°7{!›ŒÙ¸1› sŠ‚ÚB…tŸÃFûžð°!™t€"g‚êü-ãžãž#vÓ¸ûŸG`ÉtNaÜÎB FÍÄà˜–€ÙM:¸ˆ1 £³‹.29á`AgAÈ û˜­t¬€0i9Ý·à‘Áwx¡Ô¢â‹rn; t¡ôÐéB¢ïƒ!9€ui/“Æä +jyÙ<˜ü …P™`jv̳¨ LÆz±Æ1.½d!“þµï“ëã^ç™Ì:®-X™,ËA¥ ušN-D •ƒýµ¦UÆœBBD„ÈüžUõ¾¨²›èN¶¢ñË6dë !±Æ‡ì¸š94xƒ#¦€ÎʸœƒT€ßt.άøä^»nçH—R§õæä̃Ý@ÅN¤ B2³ ÃfÒÑÕɘp@ðs £@°V–Î88ž£‚VŽÛ…›G]`Hå`l€Ã'œÁ WÈ/5Ùø"í{˜¬Ÿ+Ø0å Á ùtÔÁ:IÍG}lŠ5 NÎêá*14é>0ê5à38¢@ ÈÖà–Ál˜‘ÈÈàè¨âÂSf¯âðk§8¨ÿÇ[t#?㫇ÿtÈ:l7ØÁ'6jeÍþ؉¸iÜgÇSTµ I;–æb`;‹€X&XµøÂ7¹nuPõNцDXÚáW£ P€2Þ2á´±ttZï°™€ø 0µBX}äAL_.(ftÈL‚=€U‡Õ°Ðuè„õó2ÖwÁ“Y“u39s+~Àè²’x¹DßÃet.ÁŒ*Fd Pz6,.Âæ ©V†Í>"Ø)Õ#æœÂ`«È/–ÈH´Íø`KÅP&=Üa+>b%Àb™Ñ˜G¬Ú…²Ù¯Uª;Åþ±10jgGÐ(.W ¸©ÐÈ…SÓc ÁvÉNP©æ$“N +ÆY4¢17™šZºØ^¹`@‚CFbÈ I\pa + 9Öv"&'ë¥#ê&½û÷°y:6¼Š+ƒWò1ÑÔ!#HïU¬˜Nc¢¬¾¤þCFlÌÁ˜!ã£lÞÏXZç +·úÂcæD³1 ë"R–AÆ Nº‚Ã6Aï‰FR‹(5û¬~yÔNM8ˆÃFÏ!ÚÙ擤J +Ù[Æc`ømô„ÜT ÕÎ7d$P±lP¨ÇìyñŒ—Ê]xðŒÎÎýóåæÃÎaÃÀ™ßtØ9n¢ÇBð“5ùD¬›üê¸S2úc“îàˆM²°£v`êÀD: [`F ¦#F?DËc®q#jp‰ƒƒ~VzÒÎÙg8°CfÐwΉFìh +tÈ„C~„e²Àjã‡aØvÈÍâÕ ›C“Ȉ‰h4$b7X>¢²§?r@Ü 9ÂŒY‰ ÷ÀPAŽ³j'Ó¡4ꄰൠ¢Ù+8 Ûèxȧ‚Ö÷Š¹›ŒˆÞFå2*€ÿ'=Ahg½'lô)Àó6ï!àŠ ·lÁ’ˆTÇ#m¥¼M¥ç†`MT®BÖ> óÝ4é¾Å€L¸xÈ¿´'œ’ KBOйƬ ¸5ç’Óéö®Z[ƒ¸jH ð!ŽäèB%½X Áã˜;‹`c HDçì ~0¹ŒKEDÈý£F­”ƒLZ + bÔÁIÀ€â0¬ªˆé™a3aδK`ü†MÔ¸M—µD3 u؈eØöÕaëˆ!`ô„0;&cöJzãgÓC&ä–qÛˆÀÉNÚhÑÓ¶“vð]®¯2Ž™1ø£Á!¸QÕÏç!HNX„NøÔ u„Søˆƒ“ƒò Nª1` †àÀ¿zHËa@Ô»35BDT0¬CMú‡õ蘙<8é?0Œ™i£KDù ,·yp6y˘ó°<cXj~ÔJÔ#ãVbÌè£~ˈ\dyÀªÁ)…’ó.2òO‡Æ¿rP7 Ã3 #FbÄHB;ÙX0WѾrH7¬óB4l £ö@¸+`Õ€ÆoÖFìƒs«Ænd‡C:ÿä`5 îiƒ );ìçBc&'wóˆcpjÀÛ#ÎïòF¼BÞ,»Ù Ø+sÐY$XEä²zV.â±f@©9xx€Ä“8©<»Qv~Ðûð*?¼<é“tàäQøß@°êfÛ—~.C†ŠD¤Œ«&çår^6ƒÉ%†´Èi=Ÿ‡˜æ¦Ó#Nî°†Y³O´ÂÃvzÐ5vAçU\t•‹`ÛÀØ;˜ì¸;xÀD2Qàä½ð&T +ØÛޞΠrÅF'¾:áºe ÙĆÅÝLÖÅäldÆAå€Ç& üì(¯V?¢Õ‚7[^‚Æ™€€f§L¾A2‘&$ll°¦ÁK[h"ÚjÒNC3ùã¨X'ä:Ä +`õ±¨Â8ƒÕp3)"\Å"õ›ôD~!pÚa=jô„M¾¸Á·’ƒSMtžÁ FÝ2î½eÌBv㨠HUH ºÆŽFQ6cp£Æ€É|H‡‚6ù¢ÀÆ.R3øÿáæñ¯2 ëû@”#P}7]лÁ×™‡&ž@ÜØl0ùVÎÊ) v¬ô>˜ò`?Ñ€BÞ7zç¯/ݘ”q· ,ñM_=d;€·ó$vã­48L@ —J:a€%O7È›A˜Ž9  >=KÇ»T¬É¦zn!ï•ÊþpþÎ&§…Ü’T\·1y3‘°šÑ¯@â¤62i Äœ,tnÄüæ ǹ¸L TuóypÅPß@«‰ð2\¡ÕŽO¬ bÙMgÀ?ãáz¦±¯–7ˆHÍ2Èb1à"™ðË50ÉÅ|\‘ @>V +zR¹•LæJ 4m qîਠäã &­ŸC¦¨ø´œ_q +Y€úÄ à½!+h„”‡Fúã.ù 4¯7ùCH…sùQ‡Ühžˆ+à“ÑP1¤½[4#a‘ÂCm˜»ypÎU؆"tJÁAftnÒ6b*ÄO«ø³Î1€ft¹˜ŒìU ~xá°)à$ݑ€6á‰@Óaá&¸V;†dÜÉ ›ÙCÆ@Ë…'íÍ-C¥ÆLd¸e! k°µD¤mx’8pݘ™0ºøa½TÕàéK$¸€ØшŒS¡Ò˜›°‘—æS€'”Bc`ÊÆÁ®“ŠI9ÈVãàsü +TÐÍ•LÞSÆ¢CzÿˆxÕ{ó¸gÌÎgÏF‹MÏFÊkÁÂè¹Å’‹Í³ê{Dþ)AMÑPTc•5¨lÂU›÷›h´‡«}¤íà + wX¸&fgí´Æe„üš7X³R)Ÿ\õP…¦Ô-”j%U#¦8˜< ‹T¨x—KÏÓ‰Àª+º”•4ø£6*L5æ'<"ÄC©»s f@àðÁ¤ø¼§O(ºè赑ôÎÇe€Ï­D&ðñN›¢Õ6xB—óIE3™G"¼a’Òz„Ú¶3©Ã"@|𶠗Pp‰%<Ö¢S©èæx5'·àQ‡5$cŸTa8ÙŒWÁ%šÑ-Z}²Ò„OF ×øÄ^7›…•wÒ‘œô*:ø\o^b'’~¡Ä*mqôh=€œÑ‡´ˆ +6Þ’òÓ\ªCkµÔÔ6›ìC¢7¢ªW,û¤º‹ƒŒSÔº¨µ\Æ€E‘àgØÊÂ,`: j?¤ ÚèåéXÙŠ…½¬†Ê¯P‚MD§±p þâᇭrã„|ï @ !?‹F›LjZÌÍa±:-#r–TkÑƺÒÚ"â-\©ÒJ9×?‚G: ……«0BJ6¨¢µ@¨--¥º;€4 ™4òéÀ•\XŠË¾p ¶ýRÙEEdÔ‚«h°Ê¥zlrŠŒw,tr0hË'½RhS{Lv™Ë-‰ù:9C†«¹þI.»8‰*^±$d—…Ü +š§Ón!g§â¦@ÚÁŒ†>)-©ÍPq)RZN6`*T Õ`²`&!q8©„Î#“7c*x`;÷°Tª©9<ÚD‚E*—œBä¼Wü¡j \…Æ!µ)X¨pyUÊ/°éžSÊ;S@õ‹ðü©õà§Á3ùÔtfêh¨²ˆ·Åü¢T€é,ñn¸²"åú€.¿”Vʳñ溔›±`ª“NŽsË”Rs±q'$bÀžˆv‘&ð|:­u—‡p)À§…PL†V»ÉÖ®ÖÚõ«@5ÐÝÐÇœ‘\TœV[Js]mïäçNtv¯DO« ¡²›/NzA€Šþ`•×¦ÒÍÝHuƒˆOèè}à3EG@ñ +YpG^¨ $eg#•e)7KǪFD¥@ÃM`{ëàµ<“èñÙéàa°»­¹XˆoYBmbñ.™èóÙ¹XcCëlSñ*¥–¥|ŸÏMs¹i©ulËÅy°¤Ôüá²Nx¥œ?4°dBv.Z^¯-ž¯-Ÿ‹”—˜dUh¸Â&Ú\²®n¥íxç4œvP±€M–£ã-c.·èSZÞp3\ßeST tª ³f³‹dr÷ñØT87[[:G%{c> +ªÇgðXg°Ú¡êà¤e¹ÜhÆ#z/禣L¼Î§ZÁâ\´±)ýJÝÅC§´ „©”‡H¶‹Í¿2¢ˆTØH2yƒ¬T,¬Ä;‘úF¤º +X.4T„ròY_¨D%ºTb*ZßtA±ÈxKçxËÁ)@×\r˜6\^Iv¶·îTÛ»x¼)—`ÌsZ{7»p&·x&ÚÜ`“]9Ó­,­.J÷öÜ| –qµˆÖÉD—Mt±PI-,8©¤L±kcJK.,eúÇâ]13“îlJÙž1ªšd´n¤¼míDÛ»¾PÕBh|bÊÎjcvÜÍjbfšMu£õÍÒò…ÖÞõpc;V]éoßÎ&z¦@ŠJÌ3©y6 EÜÈÍÝ*VLfÄJgzH•ŠVCå%>7/—VssgâÝ#€í`n:ßÞð-\@uÒY,Üæs+áÆ~²wšNôÕʪGÈA ó +9 ˆHu7Ó?Óß¿õô“½‹ýKb~†N´cÍhkS(Ì©ÍõêòÅöîu±¸à‘rn>å—³|ºÇ¥gRSG³ÓÇåâÂôþ]ÙÙãžHÉ#ç¹dGÎMÇZÛ|yC®ïÙ9*Õ‡_í”2éaàµ@,‰éÓÚìÙøÌimút¨¼V]8*Î0‰z¸¶Æç¹ì‚˜_Š76òó§bÍ-€!t° h"Jm‚‹ù…xûHªw ‚sȱZÝN…)I©õHu-1µ¯u÷sýµÅsˆT€w Ôð-“èK¹%€G²s,Ý?©îøƒµ ·*/ç"õu>7Ǥz\fx†ÐÚî` × §ØìœRß‚ÎÍ&£ ©øX͉†ÁÀø„²”Y(-žÍÌKõŽæÎÅ[[s{w{¥A&zGšÛwôÜ9sôÎÎÚ­R¦ËÄ›jc –Áþ ¶ËS3å¥K¹™“Zg·¶|ߣᰨ˜›OvöËË·––ÏægŽ-Ÿ¾·4ÙÉ%á2 .XÝHÏŠµ÷Â¥•Üìi—´cR(ÓÁC… 'æ’ÝÖÞ]­Ý«K'ï½ãéïpÉi&¹PY»kîûäº?Ô¢S³þHËÁæôhØ+æLþ H¡œ› +•”úv¼½ÄëòÉúÚ#/½#–Æ\¬˜ìVÎI¹5>¿랔˛ ìó»×ÜRQï•©³ZJMH÷Ï/dúG×NÜ»yé)"ÞŽVÖêk·µ·/·¶n+-žnn_í½§¹tþÚßÖ:;>))̤ºG`"…ù3ÕÕ‹ÍÝkŹã½[çNÝK(åê±îÞU­wœÍ/—/t=˜œ¿(¤ÛJešNÔœ¬FÄ;\~1Tß +ÖÖSý£é™Raº0·ël²©)!;ã”ÅÜt°0'ççk+WâÍ}˜ÂcåHyˆU(µ< ´ SŽÔ¶²ýÓ¹™Sr®Êu­%æÕÖV´¾‘îî•f,Ÿ¼»·}Ø’ŒÖ pŹSÕ …Ù“éÞqµµOkýÖ­­õÛìT +ÈÎœJM‰µvë—§6¯ž¸òLiî¤Í𹱸 +°‡^àòëråXnî­4ÜF¤"PœZ[ò3J}U*ÌEÊ‹Ù©}&1*]€U—2½½xcÓ¨”5,.œãÓýXm5ÞÜ$bÍXm-9µ¬,û"-!?—›ÙÓškd´¬u·Åì”Z[,/ž‚Å•æ²ýÝó÷½¨Ö×`+ç;{× ËSG”ê*©N¿Íµ÷—O<”h¬:HYHÔó=˜ËùÖÖÅòÚ¥Öî]Ö¤ì2dØQ;!B*mV×ï,/_Ž¶ŽF»Ç¢­Pq>Ý\ÏOmX° S LQ 4y09K‘Ê©u™h¹ØÛU–t†É̇»by ¼áò’• >ÁË'}¼ÆB-r @›0¶ÌìÙÔÌË`v'XœJvVã­ ¥¶¬Ò™ÛìÅ·a}ìt,œŸn®ßÆúU^¨¾VšÚ¾çÁ¯Ýùü÷9W_=×Ù»»²~ôocójs뚘[8vîÁ+O¼&ûcžR¡#V“SGêëçOÜW˜?Õ]>õð³o¤ú{€ÂôÑdw7Õ?6{äî½ÛŸY:÷|¤²Óž=Ú[;ODk´6Ðb1·¨6wËË—¦O<¼tþ™Â¹ŋ½ÕS¸R†ªK‹\ºÏg¦ÕÚêìñgN?­m„À-hm°@Ç›¤Ú‚sò%WŒV¶Š g<\\ægÍÙµHMÅ›;@ÝÍÛ÷.?]Y8³´}qqï6*V—'»Û€ùÆú¥­ \xàÅdc}aãìí~ `^Â#æ!,€»Ö:gò‹w/³3K۷͵||œIN1Ù%±¸®T·Ú;÷‡*N&)fg”ÖàŸÕ:`{äʬ›ÖX?s÷sKǯZÉ(ð'"•½“j÷(Ÿ]¯ÎÆ:»§ï¿|ÿ‹r²G*uµ³£´÷ÔîñÚÆU°C6 sÔ\qâ!>Ñ ³½£¥•KÉ™[Cµ?ŸoÌž’u ÎJ.ÞÜÈ÷–g”f¶›Ë'ÁíOxN«fºÇ2S'´Ö¨—éæº[»çš=~ÝÃ%ÓS» Jc³¸|1Þ;&—…tÿÈÙûNÝùŸnº961,- ¹™H}¥´t6ÑÙž^;ûò·~Z]<Å©µ™íËkçŸl¹§ä´vîaµþ±3÷ž¼ýiP7ðð¡é©£‰ön¦w¤²z17†IvwNß=³u ííÔô±pu=R]ÏMŸœ9ö`yíj°°Üœ9V¶âàÀàjׯt0„¸ÙDsS+O:^!Å%Û$ÜTNt•òjyéVpž`/ ËA(¡<—î"Jc UuDW§Ôú®…ˆ:©X´8'¦§*‹'kç”æ¦_i!b9×Ü9sý>ÕH4WZ›·æÏJåUFk²‰–7XBÂÕDk7\Xt11&^2= º&;+gû‰ÆŸìö–Nö×Î’ÑjqæHsãb}õBmåÖæÊéÊÌn8ݽþÀso¾óÁÜ‘«&,êóx¤­m©í±ÖQ©°ìrçîxì©¿“®Í‚ÅÜìÙôì¹Üü…ÊڵͻÙ4ü±Ü]»˜loë}² CBLöÉwªK·^xäuÐîP¾ŸílZ1Å®‚«A#5ðéÎÞÊñ{æw¯ÐJµØÛJ´ÖPÁ#ðH[Î/%ÚG’­=£E’%?çÒPÐP.·L%gñp5œ™va½—ÂCéXu¾¶tjîØÝZoÏ.{„ 7ëáTh1ÕQk[ñî±üüÉöÖå…3J¥E<\Ì¢n´oáÔ#ÝÝëéþ±tw·0}LÊMÛ蘋𙯘ñ‰éHu`š[_½µ²t‚M·½|4”ë¨õ•do??6=sŠÎÌ!B6šë-@€LÊÎÁ‚‡ŒÉÉnaþdfæ˜\9z‡E +ÑÊ‚›&TnmJk{„” ‹¸Hu÷Ô½b~î)àaRd´>Ÿ¬º…__¿<·wïìÎõL÷¸ÚØ梕ÍS÷”föŒ ØQ`9ÈSBnM*®%{'¥â"ʬ½œ®-!BŽRaU×åâ*›š‘ «Éî1%7Û]» A¨¼aÒ¡‚“Ñ„x+×Ù,övÐ`ÞÂ¥d ú²Âxs+Z^Ž—–¢™iX«ÚÜÉTÿ8›™…¬Šk62‰†‰÷º›W¹tÏFª˜ÒàÒÓ¥ù³ÅùÓð(Ï”¨.¹øH€OÀâSÇ¥ò +þÞ‰»Û—µú†_ÌŸ¼üXwå¤iHSr~@üÔLxÈ‚G8 ÁAàUðhˆ:ÖÚMöŽÓÉžÑv1I*RŽd;“nÊâѦv!S !ÈhSL¢«÷p*,§ëÁb/Xœ{±ˆMO«õõP~–W+ÅæêÌÞJ}ÕðXÑ:bfŽKÍË€F(€3ÕÜÈÍÏÍËÎÄŸ“mµºä #Z©¿væá¥3efNsÉž›M ”¡Pü‘Q3fö°D0ÊOËÅY>?ª,¹¤t œ¯-Ÿ‡jb‘r¬ºZœ?W^:›™Ú’Í@0mDåI'gF‚ãöÀ¤‹ˆ–çNe§Oåo“kRqÞN†ùD+ÓÙ—s˾` j„B6“Åé½Âì13©ØÉh8·Pw3¦6µ  W¸DGHMÙp%Û=Úݾ®Ö·Á®TçNDÊ«VR ÅÛ§îVr"„ªëÚÔÉÒòåæÚ5¹°‚*-”çÕúÞ©{´â¬›Ò’ÍÍîúmÅéj} (|~¬0ߘ?ÉÍÎìß[Y¾¬”ÖÄä´˜žÁ•Ì4®L)èÜ4*f"¥Å`~¾:º³u…Tš&°Ü‘üÕû_&:vB „ÊL¼ÅÄÁ÷nV/t7®XýÁdi¶»u;k؈ —}œælƼtÊG%ìhpzã(8„q;²Qêà¬'`l¥CkÓãî«£.'™Rs‡Íþ1;aBƒà<Á{‘**-mßi,™é‹×Ü|ÚN%„ôœ(¦t6åÒ@Ô€½HuCÊBÀ,zøŒ £BšV +˜”ˆWæ„ì4“kÀ¡ÜŒšŸ^Ý¿cjóLùÄD¼ºÜX<Û\½”hï ¹:9å2°ž©ú‹ˆ6ícP‘úò…Åã÷Ϲ‡Œóµ™Sw%š«f<:Ø:¤Sh¨ª”VcÕ]€%Å‚%'5yY2œ‡ ÒÞ¾Z]8ñjé䣭ÕËñÒüÂÖíµÅ[‰X¢d@ uК˜˜%‚U3"˜üB@Jq‰Œ\(®¸ä +È“™¦¡Ýbuú-ôOÅ 8„K¤Rq<œ›ŒqÑú„9¬wX"7—jïåzG£`¿…Œ—KzÇjKç]L‘2|zl­àÁŒ —! GJó„REƒED*ÂõPq%7u¬¾tRê6,ìcáLßDº>˜_W)fÉPÍ«) %ó OÕ…Ì|iîlwóZkãjª»oÆ“.ÊæÌ~ÎI* €gâõxqNˆÕÄDsÌF£rQ.ÎG+‹t¬ŠT*Á² µ{[û±“‘ƒv“‹ôÓª¤uBéi7×;:˜õ»ïõ—ŽMXQ7 +åá6Â¥M­¾¯Õw7‹° +$/>?fÃaa©œL hµL6¶ÎkÝe3%"Á¤\è ¹.©AEŠ0HW ËÍI™–y„$¬¹ {Ùð!3«Â¢­½’înò¹)4ZñÈŸ qñJ²³Á& @ÅX´&ÓZã“ ;÷p˜RÀ‡×w”â’±Én¢s´¹z¾¼p"ÙZåRM;¬Ï¬¯Ÿ½‹ŠY04ܤ“sbfžS‡-x ,«ÖØ¥Ô¢¡¹h>;½&¤¿sGcíBqö¨œŠæºGÎ^ß8{õŠ*Þƒ.,Q¡š 9¡ˆ¬†ðLÐNEéTOLÓ©9­s"Ý;í•òz+&*`ŸˆpÞ +ÝJ(D¨LË„\taÑ ƒ×`ó{É0Ì‹©)*ÖwaãŒÚ‚~„”jDÄxcEmoÉå%4T€Ðä$¢’Ö,ôŽ¢RfÂNL:ÀlT„Ôt T¦³É/.qPŸN56Fm8ÎsÓ¹é£06D.ZР!,¸R˜8´giñB}õReþ¬ÖØ„êV"ÈÁ‚93Â:0þy­½s­¼x!\\0Ú)«”"¦äÉhELôÔÒªV^ç"U\H‘Áüˆ1"é@ø›4{„1 ¡w2|´ºwòz<Ý7ø|ºˆÔÈp}°óŦ&,¬g²²JÈe<\6xi[z6)ô ó»•å½do)9µXž_Ÿ9rëÂÉ‹­“l°.ÌHàf³³˜”Õy;&¡\Œ‹ƒ™v¨ÐåRU>SK4fO\y¬¿AkÏû#™@¬)vŠó[ÁÖ‚™€çG3Õ¹p¶­s`˜”D¥´) '!ãÏË«)ÃIJZk^*v¤B3 æl|Ô¯¤äb¥²¶¥Í¬z#)Ÿ”äRS>X´€4lpš¬ˆ]iîË ¬DF’b®‰†4FË Ù:¡ÂÅNky§·{R,µ|LL÷åܼ˙|òФë°ÞcED­º-É)8É(Ø3µµ-‰D×+@—½’¦”;T99á¥ìL˜Ëvp­f&å@0‘lo@XÆ•*@ÚAªˆT-Ížo­Þ!ez:À&¡\´<Ñ€Vël¼Ék èëL+3½Ê·ÕÊl¼¶žhlG +K“Vò+Cæ[Æ]˜” §¦¬öИuDï³xd.ÚÌ·wRõ-ré¡çŸ|ù›¯~ïo½óþë?x÷á¯}s~ÿ</ºÅêçüt$šnÅ‹].–Œ—ê­Å͹½3½íãµ…ÕîÆ^çÔÚ©ÛxêÅŸ½ÿÑG¿þÝ7¾÷ãÓ×n-î«Å¾ ‘l¾UüLB+ÎåÛ[~.¡wÑL8Û\Ü+Ïm¥;Ëjc.Õ]^=yíì]_yøÙ—¾ùýË?{þþ¹øðóB¦eÅ"Ž@ØâáÁBpц™=Vóóš’okÕ©|«_™YﯟÞ9w÷½O¾ôÀÓ_ûÎ;¿xïãß¾öýŸž¸ò`ít®¹B†K`íñ`–Š”XØì“6¥– 3ûñÚœZ›Þ»pý‘}íçÿíÒ_yä…‹÷öÂko¿ûÄ‹¯Ý~—î#£%*Yb²É/ð±¦Vš %ëñB¿Òß\=~[oiuïìíÇn»ûÖk|ýïþæË¿þöýâùàÓÏzöÙúÂa36j¡}l.’[NÕvnIo']‰”p¹ä"ãnB ˆI\J'K½£OÞñÀîÅ{.ÞûÄýO¿´}újså\iö8£”GLøMÃ.FÐZSË+['Ž¾íâåk=õìëo~÷ý>ûä7¿ûŇŸ|øñ¯ÿóoÿùéç_¾ñÝ=þ«+ÇoÏMqPI®Æ’íP4ŸÌ”šÝ¹­cNœ¿vîÊ=>ñÜëßùÑë?øÙóo|^ûÖÛ?ýùGŸ¿ü­¾ýï?ûëüý•ïýüáÞܹp˜±lk­¾p$Û]‘S•L¥5¿º~æâÅ{|èé^|á•×¿óÎO?üõï¿ÿÞG¯ýûÏß~÷£/ÿø×ÿëÿþþ ÿüËüüW×ÿZmñH$ßÂD™P,Y¬´¦—¶÷á±qôÔ…k÷=öü×_zã[O㛿üÍßüîßûðW}òÅ_üïÿóßþú‹'¾öÚÉÛH×øHKJv>ÝÞõК †ÕB½³°yôÌmw=xÏÏßó//ÝõÔ‹¯|çÇ?zïãŸüò£?þå/üëýòÓ/>ýíï¿ñ­wÖŽß æQ¡Ô ­ÔÂŹpnªÞ_[Ø<¶sêâµ}àé}òëßüú›oÿøýOÞûä·?ÿè7¿úìó?üéÏÿõ¿þºõG¿øìÅ×~˜l¬¼ü„æ4z® RNÔ™ÚÌêþé+=qõ±§þåoüøWŸ¼ûñ¯¿õ£w_ýþ;þúóû»Ÿðñïÿð§ÿùŸÿùô7Ÿ¿ðÚ['o»'QÆ¥¸Å‹ݤ A,)¶–{‹{»'n»|Ïã÷<þÜ+oý৿úä?{ÿÍw~öëßÿé/ÿù_ÿæó>ýô?þó?öá§w>òL}~/ÓÙS=ëàþl䤅 Ä$#§”T³ØYmÌl4g×6O]¼úð“ÿúÊ›ï~ðÉ'ŸùÍÿé/>úõýïÿþò/ûÚß½çñg.Þùp(=EEš$£LõWV78uáÒw\»ûúÃ=òÖwÞúÝï~÷åŸþôѧŸ½÷Ë÷^~ý•‹W®.mí¥j½HaÆK'œÁ«ŒDµJµ¹³òÊ]ßýð“÷>úÔ³ÿúò~þþöþëßùÁ÷ø“/ÿô0¯¿þí—ßxëìÕ‡f·ÎUf¶…XYÍv²Í¹Tu*QlÎ.í¬mïoïí^½ãŽoû;ßþÞ÷¿ÿÃw>üô³/þü7(Ç»|úÙ¯ó׿ýÇg_|ñÖ~|íá‡g·Ž+…)N-³Ñ¼N”êS³+;GÏ^Þ?}~ÿøé+×ï~íÍ·~ùÁ‡|úÛwÞÿø­þøý>øÍçŸòÙ§Ÿ}öñ‡ôÊ›ß=õÁRe5”M“Xy³”˜ˆiÅj½»µ»ûÐý ãøÑÏ_úæ[?}ïW_þé/ùÛßùñ‡_~ùÅ/>øàåW_}ñÕ×·Î\‘Ò-„OY Z3’ïEóîüÆÌÒÆþ©s=ýÜ×^~õÅ×Þü·o~û§ïýò¯ÿ_¿ùòÏï~ðñüÃ?|ù姟ñÊ[o?øøsÕþŽ‹RnÎädmˆì&¢@¥ÎZ¾>³uääƒO=÷Ü+¯¿ðÆw~òþ‡_þù/_þå?~òþ~úé—üãç¿ÿâÝ_¾ÿñ'½ûÞ/~ú™sWîMT¦˜HÆ‚F!iÕpªÏ´×\¿ÿ‰7Þú÷Ÿ¼÷ÁÛ?ùÙgŸþåŸþüño~÷ËO~óç¿üÞçŸþø'ïþìÝ÷ßäéç\ºwþø5F­Z»?ìð ^L´8ñjͬ?wùúƒ¿ôÆw^~ó­o|ó[?ùù/þö÷¿ÿú‹?üä½_ýâ½_~ðÑG/¼òêÙÛ®®lŒd{ùî~XÉÖ[3•æT¾TZ€µ9½¼°±³~ùÚÅ{¾ûök—Î^¼5_+JÑ`€á\ÖƒKFatàf d5–-­ötwzfsïÈÆþÞüÊü‰³G®ßsÛ}\¿påê…;ï=zñŽöÒj(Yàb•p~ž‹7çòs)HžÂûÇo_Ý;ΕâîÎú¹ g¯ßw×CO<øýïï½~ýþGòÙÇϽüÒÉKºKKÁDVJT]‰ ‡ +±ÁÄÞ±KÇ/Ü]î-[½™™ÙõµåÓ§=ÿü“oÿðí?þô³ßþæí½ýÍ7_õ•—Ÿ{æÑï¿swÿX½·Eóó~.î "ãÈ5¸ÁEÙ½´(*ù\fgsëþëw¾þꫯ¿õÖë¯ýç?çüý‹ÿö¯·]<½¿»Ñœêå%]&Äáᥭ8…`¥X2_möWW·.ÞzæÑÇyþ…g¿ý­×ùÁûŸñùŸþüÇ÷~ñÃgŸ}òÂåsåfÍ‹ó^2 +fØèbŽÙF ȸ õU«ÅµÒôüòâúÆ‘3·ÞzÛåÛ¯\»vçõo¼üâ÷ßþÁ«¯¿öõ—^|áùyíÕoá <” ZÙàfM^–ä‚©:!%&LIj4ž ++±¨Oç2É|!Wow×#Z2‘J·»S•r9$…}ÞM„F%äl(?æ¿:f7ûDYmð¡RDÉÔ+Íb¾˜Œ«Z\]ÛØîtj¥R¦ÓŸÒru$)'0)ï%b;¡³¢“f߸Ñ=fôé]¼‡÷Ì‹JµX[Leë…\åò•;;^.f§Úíj­>;ÝŸë·s…ºËO!è¬ØИ}x ÿ0¹WâãlBŠ–­˜Ì–ù+Çܾ'*ZºŽærÅf··Üë/ ’”LçC‘T€ šÝìa9¸C@áb 1^Ç%PÁò¼”Še;ÐÔ\¸Tî™ÞºÒY>'D2n¯G‰(ét^Åœµxp@«6ÊsçÄÔœÎNÿã͓΀âg“6D€*SL8K¥Ò…D*“ÎÕ$)Lb$C r¤T+‘DCÉLY/„"¹i6Þ¾yØv`Ì8a=0n;lòMX0/&„L0Ñá”*-åP!=¸'‰›Ò¹p'­º¨¤WI©à£Ôq›ß䣭É‹‡2d÷³f/ë—sx¬Âj A­Øý”ÃOƒò’R@ˆ±±’‹V >á3£Vì«c–!ƒ¼®‹ˆ.¨ac¨¨™|œÑÃ8²Þ[¼¤ÉCú阭BLÆ¥.z)EŠfé°vHg™p9Ñ0.f}L UåÜ2*•Æ¬„•¨8aöOÜ+b4»·aBj…‘â(%cLÜŠ„t.fF6ÂÉ“tøe½3{xƒG2xƒ6"nò‡Ý”Šò‰Lmvcÿ¼–©êv2H'§aTÄï0é3£3úÿù nÄàóÓqà.£‹³Âv\ñòù77#R¢•¨oÈÏãõq"¼ÓËvgöq6~hÌoå•*þH›€\oû„´ ÛEçd@d…ä´”[RûÉÖ^iá‚”]˜°á(!fË3n,tó°ibpG‹°¬Mµ—ΗgÎø…ÂЄgÂàÍ–æ½TüÀ¤gÂN™<@°ª¨¶Õuµ°dq0cN;Éà hÈ…«¾Á©nƒ›LÊ™¹Ãzÿ°Ñ}Øä1»ÇÌó‹92RŽV–BNËÏ¥jË”R&Beð²iT.nÊ$mxô¦Ó ûB&@'¨`‘ +—Q>¯oä:G† ¾Ã·ÙÇ‚E>5ÃjSD¤ìÂ#Œ˜¨tÖ±PqÄä5{'l~'ŠU7å—ìÂbÆó-9Q±¡@ÎàámXÜE¥iµ—lžôÐÉQ jGx-×sáaƒ›™°c€:'¥2Ñmݸ¤‚*óÒ1ÔVÌŠQ>LM¡ÁÌa“׎F­'&»©`'“¨\5"á1é¡¢F7uÓˆåÀ¨MoòíJÇBÆCF­ˆdñoóŒ˜qq ;–„Ÿ±à¢4ƒ“u‘QHýƒ;éYé‰Á…Ó¡Ü´Z™wÓÑ2nD0FÓ›±C#¶C“Þa1acœ¨’^tãÚ˜%I14á0؉¨9ññY9»,¬Ù +.&åt×/ç­þÉFLxF~?/5wp>9¦]M⑆SÍþˆ ù岞g}¡"lBJaæt´²‰€ 1\jÍõêQ;"d1©È„JAµ™°à· [-v|fé´ŸKÙiTȹÙT@. É­¾Ç(m•ÖâʸÉ?ª÷¸PsôàtÓžš£"C“ˆ“ˆÐ‘L ’9lõëÜü»€6¹ÔT¤°Pž;¯¯à¡«‘ª˜žÒ³h¸f£’f,>b!Ç,8´Øà`3—qS«Ô8­;dôYPò‰>;ëTõ~ÙA„´\k~ëV*Þƒ†ÂÂ^Fõ2ƒ[LªÍ>Áég7\˜Z=aEyxÁ*&Wèh›÷áWZÊ„“MÞФkÒN¸ÉAž¢ãÝpiML/ú¹l²¼(§;#Vÿ@‚ý¢—‰#L‚Qê©è$b8/6×r~ÒÉŒ™P_‘°áš5 åçíDäÀ¤Ë‰…PN5¹(‹‡†¦‡¢»X`]\* î€íÁ:{™´W‡Í~½‡w E)=›¨¯‘ŠñÆmF„ÿ‹ðiLÊ܃‹nèp 72±ÀLÅä­´xÜä–'-¤ JÎÂx }¢ |‚z¹¼‡ÍyèTwåÖBoËÍÆ1¹@ÈŒÏáB +v,¯Ñ»~èD^ï7Øa²±Ú^÷¡lYü)è=A/cbm)Ù '[B¬ÁE›~.eöJ.RÓÙØöwˆÃO l,'ZðB³?LEÊz7kôpŸ°¼yÄ>j¸ÕMªÿt@7ªw#dÜ΄CwÊ£vþ½ÿ€u[Û½ÜݾmÈANúÄ@´ÃåW#Í#Z÷¨TZ¢¢µNw÷â#.1­C";茗+PÑž˜ÛУ +p‚35ƒ Dp¹HÈEtp—Á-¯™XácPÆ.z¤«3É"ç°H•ÏÎ+µ&Þññ)€®“rNPë¼V÷òšƒŽÙ±ʧÆ÷oqÔ{€¾@¬A¹h ‡¯AS€¢NrÂŽ[ˆ¸‹/":ÖáÔ§uVS²pé6ÌE|\Ú/ä]‘Tguï2Ì6!Ö€—J$àä:n RÁèa NÝ9y]-Íé\:kÀé—=dŒŽ6h¥á@C0HNk!BjÈè±t. +ü*"æ…TÏÍhx¸ØߺĦºƒ›Òv€zzÙ$Êeäd7ZX°ú‚“F?JÅð`þ€Îwãá?¨ó»©t05ÍÍÒJ™SëV,< +ÂÇ[Р_,ÐÑfvêx{ë<ݬÍìçºGÝd|ÒÁšë Œ*ÀÆ',þa‹Z݈V7Ü|Nï °¡uSýSµ• ŒÚ4!a,T‡5ǃE³—³"¼Á>¸÷ ´Õ!:¬wë´ÙtãŠÅ+NÚ˜I'Ô7»y¯”¿2l‰"Ƨ|éÆõÝÚA…0{Ø£½ƒp 6£6ÉAD'÷•£bÑ/–½B9¬K©9);kAå£r㊭!|á³D¨Âƙ֣”¡=ƒÙY£Ñ7N±¦]·T°ªS€‚t®ÁùðÖ@”×B¹9RÊÓr^JTDxpƒ > ¸2y b¿uQªOÈB%B©:(UïátNj¤ÓŠãRžÅL¿°|Ñ,Ø [ â£n:aÅBæ@“ +¸˜™³â_s4ø'¬‹aru…dŸQ¡5ZÌ1ƒE*>.eÇ›$Áëjm‹OdÄԹ˲Jñ¦Û¨ u` +È1˜I?—5£f¯@…ŠÐ5(Ÿ„ÁÄ*Ëñö6“†RÑ:N8Ýó1ÉQ¦·³.<òFér±i[@›t +~& ð&‚e×;¨ÃzdpÑYàÿ%齟Iï4¿B{»$ÛwYx›pé Ò™ $ðÞ{ PÞu™®®êªöÞM÷ÌôLs¼¥'—äp —\r—GòöHžö¤½ê$Ý…"dB¿êE+1QƒÁ™o~¿ÏóyÒ¼¯ +s%1½ •ÖÎ:pU&s±"‘9;=y6Ó¨HCÎÁf0¡ IÍ:|s.ÌT—ŒAD å=\ÒKX¤ê“²6J +KÌäö¿•âèzqñ¶R]Ç¥Œ–…òC?÷Rª›Má¼G¸T¾µK(¥³s‚ôÑ© RI6·Ãù…DyqçÆKX-bÑbª¿—Ÿä¯éÝýhs‘Ë°˜ªw7ð“Úºõ¶=„JÉe:ÒŠ·õú®48­™ní9Éø´òsD´Ç¦WÕê•ìè®T\wPDÈR¢åjïg=Œ7˜ #5&ÞDBE>5Ì56®?ü¨¹v×ìÙ§"–¹Ü +©¹ôr(»ÈÄŠ„Á'„Q1"\v $¡ Ða-7b”¨í9' u` Èh3ï¤Û{Z}bâ? B 8Àsƒ±%­{ˆ4ðhàå´ ŸwâLæ]"Òç–#…U­ŸžƒÎ›üónæ¢1B<"B®ár ×¼\UëT¼‹G›P0>ÀËf˜X‹ÕêáD«5Ü…ˆð”Éë ˆ 1¡|hòE rn¢ÂERÌœøœ FÙÞp~ËE>=Bå*‰‰."ä&3Yaqqq'®[üªÑò1À2êñâ2ðänL6‚Í3Á(hçÉÂ/˜w\¤j HqzþÜ,dx„Ë|GGk@É=TLI÷­pfÖ2ç@ìˆäž8©1I•B¹•ÌàšJ…1¡·™T?˜†K«t¢è¢ÕÜzøì‹ÚÚµsF¯-À»'÷ Êà8ò‰§÷æÜ´¢üÁ¤Ù/MVè€4” ÆZ}+RÝðqï¹á>¢ñH‰Ò[Bv¤×·‹ƒÃÖêÍ•£·)éÀy)ÑŽäWÈÉŒÍ1 3ž .eGre͇.X09·šß.,Ý +—7àPÙL[ T*‰ÚoBy$œ'€¯-6ÕÁÕ2—éÈÅ~¾¿-—Æ^J.övë[Ò 7±h‡Ðº„Ö1øCõÞÞµ'ŸÇJã'ED:^®æg«ÑÂV¼~¤Áf§¥°ñ¦b€ãÌ»ç.·ÖîíÜþ(Õ½6oaófkéxÖAáœÞÚJR£“Úú£þþ{zëÌÅ©hÙÃ0 ùøŒ_,ý2 hÄØ»xUíhÔ6™¢3 q9<Þ“›—…ò¶›Ï»)•×ÈH‘ +¨T #6щ7¶ùdÂe -v?â$ƒïI U¦l°$?Ô¶€ÕKû‚qàòbv1\XE䪣tï$VÛIöì¼¢S žPJÍËTN¡R™‰Öŵd›Ìúîæçs8ödßàfþâôÜœž6@¶5¹h‹_ÂC%TÈãR¦LnàÑ‚ÁI¬‹L¶¼¦Õ6£µÍÖâµO¿S]4\ÐÛ—åÒ£÷ÊÓÚøz¼µ7‡¦¬Âg  eä*h„I9ÙIV-èµU›û œˆKu¥ÜX­oq™^«µF'Ï¿cACT¤­m§:û±úV²{9ÑÙVœ„Œ”Céî,}N0©ÔÕÒfwïyaéæd +\7åç6\órSNÂMÇÉX7Ú8è]z.g‡¡ì V_óp±‹vØÃhb¦ß¹t÷äÅ—»÷?*¯ÜÀ#åxº¾zð8˜l_pÑ€úÔÊj´²Nh}­ºU[<j%+,Ç›W¤ì*,”˜häËd¶:1ÝØÌu÷æ\Ô©·É'ê-\­LÖ‘lé*ø]+!I™nyåZcëvañ0Õ¿.­a‘2&$>øöÏî½ã¦•i;&åÖÛñÞIPιXÀŠÕÎÖÒÞÓ¯O{íH„Ò‘ΕìÚ½ÂúC©vÉJ'„XíÕ·¼w"‹Ùqzx}éø½ÂÂmK |ع˜5p΂L»hc@Æ”ÉíR ˜`óÐ0£Á| +„V>3JôrK·Ú—ßî~x¨ŸÓ³þÊàPH Œ~2Å%ˆ'°‚ËâÒ=ÖA¶ùÀ«T(çDÃ&xÌ„hîàäÑQ`i,rðñšU`+øœ‡Ðnà•!?ÈÂNÜGɳNÒÀA÷°qL.Ê…åTçø¤ÂdïHk„Ë›…á5 i“ép”µàÄe ,™ý²’朜þÌ“–òR²á$BvL4Áb@Ê'[»Õµ»Õ­‡¸˜©öÒK.VC¹¼*ä1µ‘hîæ‡'RnP +!W¢åu9;.äFh´å¤’%)uÚàˆ‚^¬¼©l«µ©°âçR„\ЛT¼æ TZkðÉN¾»½qò|ïÎ7»Ûw9Wn¯ßxòI´¸(Ko^^¿þáõ—_UwߦSK—šqÑŸ‹W6ç'÷ nRi„@üçS#K@:k !ÖCé€îœTÜÃeèD(X¬ 4¤]ènl\}Æé-§»È/”÷†Š ´’Í͵믢¥Å9í$£¹…[ÀF½kœÌ„̹0YÏÊý`‹*ŽÊeD.!J•M/²Ùq¤¾V]½qù饥kg-°!3fô¾_̃ uÑBÍOz¹B…óyÑfðòLr.í²É1—\˜sÇÂ|Ò…ÝTtñʳƒ'Ÿ->¯­ßò«V"vÁ:™ +æøé÷b• €š•’ˆJ‚’Ó*V4rj²¸dyÌ„sç¦myjnÊJÂjKªî)µ½HuÇÏä\˜ÆiÓÎN9¦LØE~ÑBX|à+‹O]Y]Øìmôñ†ÉòB©¡RC+¦‘ +hû¤œOÈÓúõ1¥î§ã—@‚1È/tdL¨×dºªÉ„c€Þ\mS+-œšs\°ÂX&#T÷ 7¾om†´Òá­W›V")¯vwÞhl>I÷Oê«÷ªk÷éDï¢]<”wãá K3I¿Tcb½¹OF«gÛq£l¸ëâ)W¼|žÒ&OG"rv(3Ĥ,λ¥¥“Ââq¢½ÙÛ¼ÓX¹ÁÅ[Rº—楅+lvÁF§æý AD%ÙÓËS6â‚%”—Z`õAPjkÚNYý"̦@IÇP$WË«w<€]à¢åµý;O>ø!k½¼‡Ò˜ø Ý=\=~gÿñ—Å•Û tMNÎøìÈŽ©FŸp֌ϺYˆÒ¹È¸urr è"£SÜŠªd´£V6—ß¼ýêÇ»O¾®]šõJ¸\‚‚I;5øx 09ZmRjTÑéyøZ1·ŠHU“?BÐd©£ ÎêmOД\_:¬Œö#ÅE©°ŠF»p H—^(.?psó(d&g ÿÿì +ˆ:e§Ïa®¦ê›NDúÆÙ¹¯™·€klf ¶]”~ÞÂXИ+L™±Óç­&H°øÂÄ(°LØ×c-”ÑÅ/fvA©íòù &¹ ÔwQ¹dóOp°«_*‚Þ5 Þ1{8³‡·ûC ¶Ø|’Í+.ýÆ,tzÖ«¤w&3®Ï{¦m؈W´Ž*eFoq‰†’iº{ Œ¡lsíVsë^fx™Kµ`1 ±º“œÌNÆku?µB HîA}I«_ÍôoÖמB“ÉŸ¼dÄd˜¦ÁËZ`ÑE§}À§0µ¢Dy¸Wì%k+ýÝ'k7ßÛ¼õêäÅ÷³ƒ#F­Ÿ¼yïÍωHÑEE]l´Ôòvqt³½þÈÌcÎwh›å3 \äÊèîy;`d1ºA±‰.(4Ö ðYi¹˜¨¯Õ¶ïÃá² VÒ½BÿF¼¼Ù^½Ù™Ü\1ùx1Z¾óò»\zxÁBÚ±1Ƀ H¨ +ú ¾Š‚v að0•âj´ºQY:Þ¾ýj°û4ÄDo÷Ú ?·!2ŸèGK«@`µÊ6¡v§ìÔ¼‹D9Ýʘ7Âv4¢Õ¶³ G€mÐPÁCª‘\Ïä Bߺþ~ ”=cô͸Y+ŽBP¤Þ¸¢7Îg§mf7˜œoñÍy¸y¯*Ü/Uùô + Sð‹;âƤÛdº 7H%2ÖêlÝߺÿ‰ ì‘”uãP¨L¬Á&»lz$7„ò%Ÿ˜÷3zºº†ŠI"A —˜H PH¿tÁè95m;7ç:=ëš²â ë'«zG@’Q D‘r‘M´•ò’Z]Mõ¯ÙL.+Ò ?§8o5J΃ññ¶œ^tbšÍÇalÜCE ÀJÐ0!å>zÁDZˆŠ¹‹f4;ˆ!@<Ï:ƒ¿LÈÕXy•×›^R PŠ˜(sIÐ)£üÒamífª¹•ª¬/ÝKÔ—ýB2œÅ[ûÀæâšÖØcÓ+n„&=©‘áÂœ‹6lèb&ð€F0.Â*–}“|¡ž68¾6mq ’”(ùõdë°³÷‚Õ[|´²¸ûHÌ/0y9Çë‡;P>/§‡éÎî;5m!¨PTjóPð”ÁsÚà1z9B.‰©!DiN„—Ó-˜KZ|¼ .Û¨âÒà*;6X[\AżÝ/œ ˆÿgç='‰pº ¢'w°ƒ„.ÄôˆŽ·¹TSkx´^^!€ž ©bo'7¸ Þñˆ+µb2i„²+ju×àA˜dãpn]ÊØØ¢µŽÑ«œš œt¹µÑïO¦‰³¢VT!µV¤±“êU?k„âM½ØŸ•p ^ŒO´ÃÙ­–@¾0;'gWìˆJÊ%B-#b&”E{jm·0¾£ÕwùtßF„@ú.öÇ­›LBèWÍH(ä¬ Øþë¯×e˜šLV/!Á¬—ˆ#”‰×{«'>! ^aéxãÎ'÷>+¬Ý æ–ÀI‘ühù ¿z+¨5,°`öó¯qÜKD”DÓKÈÁGò¬RÅè‘Κ|ÊŒÉ1óNâ¼Á3™jÛÃy'ghÛ¤<¹|æ$"”)ô·Z«ƒ;£+OÇ—¯^}Ñ\¿­µ÷<|2[[žœ8•R6„§Ôr0ÖÅÂÍ`|ä¥3˜Ý€d· –¡ÉÒii™°û'2ºhRÌS ²ñ‰ Zp“ +ø-¿€!GÆšB¢•ooí\{‹Ñj``'¾<3ûÈ-W@/kx- ¹Ô 6’c6Zp>ç ÂŸ2xØY¦ÜüŒK´xe!Ñ#Õ¢ÑCƒmõ`CAIX|,Ï‚ŠT¬MEáÜ(ÑÜ +—•ÊªÞ=Kët²GÅj¥ÞÁxïM.Ñ™÷ðf¿â"¸P‰ÕËÀ­~˜þŒƒœqÒˆuÁªÓò㪜¨–‡ÛRªkƒ¸÷ ÖX‹77ÃÕM,ÖórY9^_Þº=Øzêaô)fñ³0—¡Ô:*åur¯5#ç“åE?œTÇ"h¨ËÀ=K¯vÐà¦ç$èqà¼3vb2>…¥ -3±Z¾½ùêóŸ}ù7ÿ¡±vŒ””Ò’\Z)-gÚ;Á•þò1¯­ÌÅÁhƒÓ{0_2BÒ¹yøÌìä +(-3ÄÎXɳsÞ33® &êêð°·q{ÖCÛ0ÅÍ$tŒŠ7bµíx}—Ó; XÕ»™Æ† [|œ¨7/ÌÅQº¼xqÞ;m‚ý€øŒWgm$Ðy7&bNJvì~ÑCDÔŠœ³“{êÊ„R'¥\µ¿ÛX¸¸ŸŠ!\ÂGi6/¡!€¾V2”M ö1qR­“]>3ßã#=×<¸þà:®´ôúQ¢q(%úZnAÎ ýBþ‚† éò@Ü3sn#$ºÉ,]èn¾ÕÞ~Akí‹œ– R¬bóÿò‚åkóž)'g Da®Î.x¹„‹V-þÔ”¼.Z4\Pkë ôQZK©^ +×ÑpY›<ݵÒa6ÝNÜ_[aÖIÃB ñ¬;8ç +Ú}p%¦´\qpéÒ·ëëÇvZ¦€9Ö¶ÓÝãHukrŸmº~}2¡˜õ-ÄX^¨5Û¾R3ñþœ‹óâL*r€ÒFæ|2x¼ÀK0Œ@<-ÞàŒ±Ã|8Ýlßï=Hw¶›×W¯>aULJ‡sC!Õnß)/\õNLä¢Ù…Íñâ¤!7¦ØѨ‹yÈ$&ä Tq¤i³f2Ÿ ×”É7m ¡‚$½¸)Œ)9·xéa±ÙÃÅ ½™^+,Ý;%$:ýÛÙæÈìŸU K‘Ü£¼ˆ¾hòýÕ³Õ`ö§g¬MÈä¼=¦Î4@A‹‡Ÿœ‚‚çÍ>A…à„Tc[Ô› –¦-Â$øHÙàÀ/Ìy~Ááx¨Ø´™µLNðÍè&€\°¢'˜PšuFÎ`bFÎ ®>üdåàÀ60C+uàéñê6Ƨ}„„±Q“—®`Sx¨P•”*¡Ô‚ŸMJ(zÎ_œ³€àlÎê§ÌÈŒu–‰TŠ ž9@Å…†@¢Í…„ ^!íãR˜\­§·vx½¼zø¸»u7ÛÞ©.¶·îVWoª•u<œ×Ëc6V±ø‚\6y‚À;æmH€ÔH)/Ä›€Çò}'ØS³ßàQ1kl,_}sûÞÇå…£“ûï<ûBÌ|| +>GEšáÜjº«´öD,,R¶Ð½œhï +é>ˆ-îÉl·²‹ ñ‘I}Æõi×9+î—›8xG,›'+¢Š¸˜×6¼îÂ$­0Ü<|ôüƒïoÝxmn¾¾ Zï=íï>bâ7­ˆéauá(ÓÜ %ÛziÀ„S& âˆ³ÃÒ¼›¸h‚D¬ºqÍϤÀq?3íœ5Ã7Í(eA ¡šŸËɉÆhóZ$×…Åx¸8jn?]y"arxNô-þP2?Þ½õ +b£ÓÔêã€!BdÜCÄŽ Q¹p±;¾2¾ôàô´óÔ (Œ@0%dÆT´ %0µLmuáÒ}—Ý@ÄÄ\€O!|ÊG¨b¼Ž©Y‚'Œj‚(“›¶ûÄ9+ +DÌ Kn$taÎîBx\LZÉ ,À4¹X#£-TÈ\4@ ¸ÑÝÇ»&×(ã~B5;±9+2eô£Á.$¿~Îôµ³óufþÌ”uÚŠ8à'À&囫‘LÏäÀX9gCC˜\¤õŽ”_Rª[…ñ­|ÿòhaç'?ÿ—ÕÃ' 3‚4¤UWåâH©|z)ÊÛ‰à£õ;.*v~Î>mt˜]¨q²º @BˆVh9 |ßËè„\²ƒ\ÿRe|%ÓX¹ùð«ßÒm$\ŒV.EJ›¹Þq÷­ÆÚƒÚÒM>Ù×2ƒ+¨hÆ‚q.:Mæ+qú€Özv,jðò~Á mÆšõ†Î˜±) r–œ_“²Ët¸¸¹ÿ¨:Úcb)7™Î%;¼ÞÜx¼zôÎÞ“ïd‡‡…îööõçR~YHv¸X“ò¾ÉRìyT(½6ëÄlHÈEhÁHŸ/€€ï!ãF0æ°BŠÅY;qÆà Q`Êvà†Tü5„w0%‡ˆ)0V.:ÉÄ;Ý{ñÕlm5S_ôóqRN‡Mëd ”° Ž˜½’# ¢t¢PߨôöÏÌ@Žá!ó„O’¨ZG”ªM×G­ñ!ÐI²¤d]ÐŒ:YËÓ°˜ƒ™D¶2ÎÕW NtÞŽ:R€Ò€Q:â¼3:0Y¯Æ²+D\¼:Þ[=~¶ròR*®BU7ZؼýýŸý&™]  ;ŒÏ2J“‰tIµe›,êA²j¹ºtMNwLN”Ó¼µ¸(–¼hXTrp0êBBÈO[ЪkÖkt³^T±{ƒÉH¦ëÙ'&/ããtL.ЉŽTZÖÛzmy´rðüƒ•‡û úWJ‹×•ÒŠ˜YÄÔ–y‚¬¢U¾õ#2VÿËs3g¦Í $ÎXq£;„’õæÒÎõçÁx È¢–ñH1”ëjÕÅâx/ÕÝH)¥¸ì\fbíH£™1&—x½E«u95̵·-£Z æX‘ˆ“ˆ¸iÍà—æ ‹ŒÖqÑ /—™ñ§ ~ƒOtP:›è£¡Ê/oß«÷8½..¥ûGåå[ƒ'[×^Ö7nÊ¥ÅÎÊÕ~øk6ÕwP1\­R‘K!µøzUî!H7ðòÝË“5S^O l{=#¨ÙB¸®M;¨Y'üÔØäêód™ììüè„7˜p¶9¼œ‘_ÊU{õÅ+T¤lEC>6ª"¨–AØ4BH²$ê‚#NïÃ# èM™1 öl¤8ç"¦4£÷K+wâí}>Õw1 '¡Ž3-o0à³l€>‡3ãÉ,îô¤Ì dÄÑf7Þq!aƒ¡}ý䚊²j‰–ä\¿µ}´ÿl¼ÿÆÊ•«GÏýu„Ž@˜Šr)&;“5›lÖ4*˜ '{IðCzÝäÀ¡@8€k'åà _vˆšµÀ(_3+ õõ‚;;ë·y3$ØïQJEN´¼” +"/œ¯V–šë7—ž-½YÛ¾qq ¹µÛD¬é—ò°TðñYT*°ƒjc¼gŤ¯Ÿ3š¤ ‰X½’Ù´ú‚NðíÅÖò•{p8m%#reK÷ÔòRné8Ú;À¢5FÉï?ïÞsbŠ‡ŒaRYÎ-·–o 6îF +Ë4ÈËÕÑ»ý 0¼úïÎZg˜‘œ¤®d +½#!µà@好ÇbºwÊàv’2S ©L¤ÇÙÆÊâÖõÎÆ ¥PZ)œïKé+g:['oî<ø Q+±Ú†ÞÞƒCeó÷!ãvB•¯¬ëÕu*5úPp“Ã× ­¦ìHô¢¹8YÇ\:cr½”‰‰Ù±R»”è$;WÜ”®ç†Ï^ý`ëæ+`Ð|²)—¥âXH€n» ÕH¬Z+ NðPeú5·[=ˆ gæ|>: ˆº9Ü¿ñøClrr,Ô»T¼ë +f™x/Þؼ%eºÝå£ã‡•†Ö€l‡Ç'kTÑ „\ïs8`|Öo â.X£/ä bf9ÓÚæzÍ…Ë£ƒ§·ß[¿ýÍ¥«/„ÌÀŠ)x(—n]*-\…¹«Uý|x±Ž\¬ÑÉZ Þâb¼H(]ZµÆ×Κ§ >‡·A´bíÅè‘0±°¸÷¸ÿÿpÆ6e!'ã=)3v‘‰oLy,~ÎEÊ.J†Å“¨toï>),ß!“#2ÖKË©ÞdJdÀ{¯ïZ‹V¶Aã»Ùø 4™¿×êá~Ñà OO–¯‚f¸›T]tÔŒ… >¨×ØtÃ'Å#•¥ÆÖýDg/ÕºTf»»l¬ øš<ÀR&岟Mœ˜œHWò•ÎÆ•Ûo ‰öéi‡Ÿ‰ƒ?èH ¸¹¨¤Kj¥E$”=gò‚N· +Dë òƒêÚ endstream endobj 81 0 obj <>stream +Ÿ)÷WvNªã7!ë­KÝÝ7VŽ_-¼h®]¯.‡ £hºóî—{ãÝ™±ˆ‡Ösý£Þö³të8ݺ*¤F6Li4šiÓJqâΉ³&bÎ-ÙP= ”¢Å¥Ãû¯®?ûÄKG潜WÜlŠÒ¹în¡œÜð†J^ZÓêk@«=\rò¸=—qઓˆ–Æ7&ËùAAˆŽ„‚ŸIºP8,°`ÒL$^¹ˆ¨Õ¢µz²³WZ¸¶°÷¨½~{ráRÉ\¿ûöw¾úu©»9 x¨J„«¤ÒðÐIK €“ +`VŸv`æ€@©U0Vx¤žœLËóV¢¶¾´~üÁç?nÝìí>^}YX_¹ÛÛsñò“åËSíK™ÆÚñ‡Gï~ÏK¨|¤ÊFÛNXÁ9àã]1Úºqff"U"ž›÷œq~íŒùÜŒI &†ŒÖLT×X­†)e:Ñ#c:1à²KX¤¢%­²:"¨×òÚíÎîãöÞ³Úö“XïˆÍŒ´ÜxïäåêásT)bJ51¹«d‡N®’Ñ…Éòîvò¼Ñoš\) §m˜ÑtàˆÌ<£UW"ÕÅL{uéðéÒѳK·ßéïÜOv÷0­éaSøës°¡X¼“ûÍHµQ\­.ÝŠ–×Q¹dòñnà;˜<Qf7¥"í +™õhy›‰5漜Ñ˸5 2 —hÇ*Ëéæø§l¡|<ÝÞ*Ž®äû{‘ÒJ¼±¯o°ñf4ÝÚ:z8ؾæ¦" ¾%š›“©l’=<Òœ¬4êÀ½hèÒÑ“TuÅ者¹ˆ$DçÀ ¶^^¼zÿU}aÄ"Tʋŵq©²|ûàÁg·Þýig÷M¿P(7W/?%BPc‰Ú¥òòÃÆÆótﶘ‚°ðÁõ73Ísfl8¬;1©‰±V7Óƒc_0Uno6Çà“.Gj¤ÖÔ«kÀ8²ƒ#5?@˜(ÙhmÊN_0¡“T.–‚z_J-ØÙঃZ-Ý›x:*d1‹)y7¥±Zº±Œk+×7n¿ŸÅjkT´â¥c(ŸqfëúÛÏ>úª·q;Àe…Ä.•mÉî¥'w8áósi J/Ì»©¿8cí¬œ>ü°½}'ÚX©nÜÎ,ß’»áüÊxûÑÁÝZë·@j“²‹©Î^¼¾L/CÁìŒ ?=ãT*£Dg½´|2™ž¨±“íߨ­<Ò›».*Q“ËÊ œ¸dOÈ.1ÉE>»FhÝ—sâªÁËøt T²„Åý,´¼Äg6"9D€OaRJ.ŒË‹7šwÅú§ÕBu|6 Ä#ÕµÎö£;-¿©oðé–S IïoÜbcE«Ñ*WÀPàR &Ò•E9ÕvaŠÝ²ù'‹³8ñ˜×Ôü8ÝÜ>rfÆ&@Àabu6VM·7;Û÷´Æ–‡‰¯mœ<~ù…/‚ñÒèF~x#ÙØ“ÒËF?ãÀ}¸z|ëe©³sq²È¬âçó\r¨Õ.åF×SÝCœOÞ¸ÿΕÛo€ïÄ" ‰4·_~ôåæ½/äÚŽ“ˆù)õÃ/º¼sÛè—γ?̧–”Ò6ª^0#.$Tì'Û»ÓvÒ‰**­Ë…•Pn‘–sÇß»óæ·ätßMDèÉ©øq²±=Þ{xøøóêò-\®£bÕ:¿pvú«s¦3Ón@ƒà«8uôSNg@ˆåÆ&7cFoBTr²ä¨_Á…‚ŒâR†MvÒÝýÜàU¼V)Ž*Ëךë×wOžÝ{ç;ÅÑžT]ºõÁñ‹Ž¯~øÅÃW?ë^zÊ%º™òêÚá›á\ÞÇÙP•Qª¤˜9× 1^\Ö’Í: ÿpÎêg&ÐZMïì¦GGíÍ[B¦5Ú¹]Y½ëìj=±°BÆÛ“»šSà\bqlj¾pÎ-A‚Q[WÜrÃŒë^±HÄÛry-*à±:ïÀrŒ4Ðp• +vÀ¶ˆñ)˜×}|Tol÷ö^t÷_TVïæ†Gñ&зºší,= —Õòrgÿy¬{%˜õ&H¬ [7=TØä ƪ[BjH„Šb¢1«G8=œìRúÆtÁÛ‘)çRÍ>Ñs ³›UR)› Ìæ§A’?~üñÉ£úÛ÷ôò2¯ÛýA>5YΊ™ Ò™æV¦¾Í nê̬Ûàf " +°-ŒA ð:ÂDrµ±Ë_4{„X³séþâÉÛõ›‘Ê:,U&'¤Ô“WŸuW®@`L*ºˆ¸É ²§ä€ÅÍ5×øI¶²Y¼Â¢nõ^01À䪚jÞ{ñÑÇ‘R>Àf« 7õÆf$?éÀC§ .Æsåþ!èš‹fÄrŠÒÄ¥Ô!B;=㱸ÈFo뛟ÿý¬9;œA/“àô¾š[‰fi-í1jÞ1™ž«E&üT(ÛÙ,ŽÊ‹G…á¾V]“Í|÷ÒèÊ“áÞíòxˆ§ZZb=XÊËÉV}ဋÕ'·²„'<± •ðóÜ…ˆàoRÊÝ$H+0Ÿeí­û[w?]¸ò¼¶r¼°vð÷¿øÝõ§r“ɯ–SƒãhíR²s0Ø{¶{ïãÅÁþ­·¾ÌŒ¬d,TZK ®fî,]ûxéú‡Kʽýoõûw¾ý 7úåy_ȇÝ|.˜G+›…ööµûo/^yTZ¹^ß¼SZ9ÑšëµµkÛÛ7ß¹úÆçÀ óÝ£'Ÿßzù½µk/++·”Ò2¡Nîí¤µžU ¢â.JªHGšB²‹Ë%"Ú´¡¥Ô\DxB›Ñ±×+ÚðSv4ÂWsù„KÔµB§ÐZÑkkBf •ˆXÆøœ—§^¯" JÂÉà±øÄÉÂná2^Bo"\¸*¦A}ózPÙ´·Á‚?u¢Œ— ±ZAÎöjKÇÝ­{¼Þ ð`#'Ït¼¾ã³û/¼bNL÷=¤fóƒ˜ÆYýa‹‡7¹i',؉H¦»Ûݾ[^<–‹+~1oôpb¤¢¦{~F§äb ˜Æø¢ocBƆHÉ£ļƒvÁò¹YßÙ‹î3SÎy;å#Ô©R0ÿ©óv+ÄÌ;ˆoL;Ï|ÓNÊÍ.Š +gA-ÀÆ"•Õhu‹µÀ¡Îfy|˜ê„r ÁHIM·õú2©è¸¤ðz™‰–cµ­Dû2ÈzVX5ÌE›ÁHuÊ‚ÎÙp° ÃlÒêå@M™¼ ;°qF«(å•\o¿³v}qëøèþ[½ãâðòêµw‡—ßÚ¾õáò•7²í-)Q“Ó|su÷Æs1;PK+õ;£½G ­­p~À&k‰âàæã®<|ÏEÇC¹e.5RË›KÇïßK5·º »?øêWÇÏÞåÉÖ&ÀíúúÉÑÓOÞûá?}ñwÿñíïþbÿÆÛŸço¿ÿC¥º¦TÖÄüŠÞ¼ÜÞ|²}ç‹Áåw1¥Î„óu0ø…E+"[àŸOz¸4Ÿ_­¬<‹ËN¯¶¥ÄëÝPa!˜ê˜¤µVit¼qã}2’õ²”jZ³8º^]}*n{Ù" >=fôž- pjÎÇèÀ[Hôõâ,‘97‹I…tk—RÊv\AÂ¥æÆÃüÂU.Ý&:”Vq“Yh Zv ,ÌEI9KEÊt´Ì'¤RÖ@üÚ½Ÿj¬a¤£ 7®Z  ¸I¤áFepè¹xÝAFíx åøì8Ñ:¤c]-&Ú¤R)`¤SÏÍùA•ÝKi \xˆ¨ÁIžÜèP6þuÎA^´ ÓNÆŠF¼ÁÄdÅ)ÊtÒm“ˆ§«±Ò€T²J®'e@J +¥‡ñòªVY&Bñ ¢ó‰2ÌÇ…T_*¬€l8‡J‘ô8š[0€ìï弄âB%‹—»hôžuáÅ£T¸ì£4`"„Z* .¯‚ä{ò<Ûß"Õ´œiv6niåQ²:Š•†„œ‡Ù8kŠñ–œî"BJ¯­d»ÛÁX“Ë^8ÎÅKr²–¬Žå\׊HÉæ–\\ eGÍ•ëåÁntwI¥D‡³ÑüìNvxCÈ­ ¡²‡™ºÄ™‹÷í°"ƒœíGJc*RböóÓ¡g}x¨ä & n$‡ÌØ”ŸsÒs ¸ÍûÏÌù&ÏqXñ³&ÔNÆøô T\ó#>ÕcõŽVE5ƒq£‡ò#„Rˆ–×âÍ=­±KÇA5Ë·…Tà +át?38Nv®dûW ¹ì{Ñ;&kU5Q·zè‹Fè‚šµá c|a³¤+övB‚VòáL'ÕÛá³J+ƒ1ÉôQ)añ@ ¥«]Š5ö's^Ñq`"Rª‹)% ³n"†K91ÙVPh5Ðõ7çÀ1Nw8³—öÒQ˜VÅp<‘ª¤Š=FNIÑ\©½T[Ü*ö—â•Ÿ¬‰ù®V_ÎõÖÚ›Ç µÆû—}Ô¾tŒ¤¨Up^÷’¦éúêþýTkdÕPrË/Ë™!ïx˜˜+@ð!eãòu?Ç•f¸°žíŽ^,_}³·óP),²¡äƒ'ïþâwÿyùð ¢T´æž>¸QÝ}yõùWÞÈw×ådñÍ¿»zøÌMÛi.½k_)/ݾtç‹XuMKw¼øüèéçó>Ñ„È6И‘Æp÷ÙÞ£/vž~7\^/´6øÓL{Û‡ì˜r®¼tüîÕ7¾×X»/e¯Üy?Q]?3ï;?ï›w±^:K¥du½»y/(Nn¿øôGÿH†‹ˆÚâók\fY*l,|°uÿۙˆÝxüñõgŸ¨ùó‹6 t–û™4é\°Ð3Vb{ÿþÉ·°ôµó–¯3ÿ»ÓÖS3>;˜g£€ý*Ã=J­°z›PÊ çz‚“ÅŒ)BV€Ž„U7r2,¤…ÌP«oWŽ†{¤ÂØK)ÉÊJ8?¶““ǬL>qÎÅX}ÁÇ99ã0VLÃV7j‚(/Ÿò‰9Ç俼ÏZa^ˆUµÊR~édñøíÞ姥µûjuÇèe Tâ57@YZIÞÍ9a2TÔ«ëh¨è¡âZn6ÉŠv<2ï¸ê@à ‰ðJ8» ãÕ5ÐòœR"¸”H5šnÅ‹TÐŒnáb„œåµÚÊÕŃGÝÍ[átGË÷äÜÀ?ÁÂ$)|ÒOÈD0‚±šÙœ²¢Ž×—0 ,ì§/¡†²Gƒš=Bø *øé¨?¨ab¼nÅÒ­Zw£ÐÞ@Ó«™µåÙþ~¤ØFóA%Š¦d- Ñìf%å‚jÓ>:âB—ŸeÄ´šÑñ®9 GJkZmSJõË'½{éÞ.Ô²ÅöÆÁ}½´“±òr¤´(¥»ŒVRæ§5S˜É¼^‰i+n „ý\.œYŠ×ùX›S‚œÈ×FµÑø€ÚÜQê;Ùñ­ÜèZ¬² +”Ò0.,n^ïÞÜPPPÍMNòJÙä$MÀM#åÏ>yüòs,™̸¦äºVßÕ*¡hþý/üà­OvòìŒÇñþã­£òÖSP!6ˆ¢ø¸–mû© DHʹ>`¿ÊÂA¶½ IVJ W²ÍUrã&ZǤ<.¦ÜpÐìD VÛ‹yÉåõ¹ü!¥“ýC~2ƒ÷“+8§uG;k—ªÅ… ^WŠKrqÃËícÔ`(e÷Ð/ b(“¤Ä|8Õ¹ ”M J™ç˵îÚMñ0š—ÑœpÈìf&ÛÌi‰ò‚ÉÍ€ ¦T[`“,N¿¤¤ÂñºÁ HR²NRX؉j0—qaQ@„Lʈ ¥J²ƒr TvXÄ&wOæ!1F Pr€VQVÌà@äûë€CÉF[Àì$,nüœ¬óHªU?—±ú‚ze)œ¨€r1V+‘¡ §äX1JØ ’‘Rz¡ë†i§ŸðQ h|´ÌÈy°;`¬¯ÜÊh¼ãNŒ‘\܃Énäª}6Ö@ø"LžˆDÙ$%eÄh!e‹ Ÿ6x€Õ©è¹Yèâ¼ÏlGP"H³r,QÏV–A…OˆÝJ@d•ý|ÆKÇ6Œ…\­ÖËg þÉsa™ÅòâõÖöãúúm‡_ô +ÊD½¸àÇ/€-„p­æåL[N·q1)È)AM£Œêð ›û :ÎG«FêÇDO€ñ#+„` §8 eU9ßÁÕDkn<,)™ÕÍ«»'Ox-ZU+®z'ja#ÀÄ=0뀰S,úHB*ÁŒ† +Y&Ú"Å‚ ‡•Üîî­[Ï?sÓª á=”êFÂ^½$xÉfn°¡€÷,nÆ K.\µÁ!‹w )fÀÆ#|,@ËéúJ¢¾).˹±”’á’‡Pe½N¶@]ù蘚[ˆ•w`© JËî“æÌ^›æ¤-%NMÙÏκî Ìæ0±âcÒ.4 +²X$¿@„ +T«]„ÍKM[ü§.â%CN”'ùh¾¾/öÅxÅGÊvapø¬å€ÄüdXÏörƒý‹vlÆâ1ºfM.c(F +Dz¯*©"¡¤¬–‘ÕÖRºÐxÁ0eÛ!½’8DEgl¸Ítx6œ£e6»0D8|40 ”S•X©P[H׆ +År —m~ü>TyzÚ=kFÜðd×ÎÍÚŒ^ÁE&¹ÆÇ»¡Ô@ÔëÂIJº»rÔJ Š jHv˜®¯‡S7±xhŒ‹áB|rg R¸èy&ؼĜÙm¶{‚NW.Ú ÃP XÆ!Ä;@s¹%綸XÇ ˜ÁÇÙ Ææ&¦ .‡r½  19oGÏÌØM¶À`qëÊ#˜Žš¨ÝMB>Ž“^Tô ‚ÕMN .| ÐgÂ!8‡S"LIîb¶Ú}§P-T(‡‹ÙÉuj':ÖѧΚLVÌdCgfÝ.Ú§fÜFh^‰Æùpp‹ž)_ºrãâF;î€X *N¿àöóõÂÒ¼% $Ú‘ôЃ„aZsøùY3üõ³Öy;!a°=§/˜J¦Ä¤ÕMY\ļ ½8ïÅéG%šOÁDÄå ’\’4Ï=߸hù«óÆ33ÐB$‡³²Ñw®Þ éeƒ›´ùy/¥¢BW\Æ€#ß»|ïÍ/ÿÁ‚JqjæÜŒÍåc‚bBTÓJ"ÏŠ‘Ý£;ã›v„›6û,Æì¦Í0*)¨l(M“•e&\DÙx€™´*É«~”"§!”uùq·—@©°šl ØqÌæp0AFI¤Üköf/âòl8ÏEºNX±úÅ‹f/Øehrt„VL…  +øN0ÎÍG zc¢".Xpú9`à¿rrVÒJvÞà6º€ÑHx0!¢Ñ‰€-‰¥òºžûfuŒèy8ÕN6Ö_Ÿia1>QèlEr @¦Àa2 TŒOrj¦ã`ØãéV"×qùp é «À„!”^Äâôj©Üîñ­ÎÍ̺æA¾¾`½8í +C²q`÷ ¨ì^Ñ‹F]ÜéòÍíSóv»Û§Èr>›,2ðüƌˌX˜sÚè™3|ˆäôpg§ÎN6X *RBÆí RŒ‰çµDIŒAI{<¨ÀZsfÿéóæóS¶y#dsâŸô¡’Éâ›1@Fj‡‚0÷SI›‡¿0ëœóa¼ÝC^˜wí‚ÕÁô´)†Îê„…°^j {K«|H +b°Ã>B# wJD(à´l}Aˆ¹h‘ ¥ÍnÂÂd¡VPI.êC˜RI)Oòq– q •JD”H”ÄP8DI"4 7›Ù…å>ÅU¤<0yi?*„âö N/çE$”Œx¬Óåt»l.—C’¤Z>1ª¥·ÆÕëëûãç/ln/kÑB‡ ˜ÞGPÑ9“ÿ/OͶ[ЫÕðQÁ¨aE‡E1äõã. ÄOiCh†ÅI!ÈéáHÉég.ÌÙO;sÞ2=ÍLæ8ò,ä™)ï©‹îs³“°¹(›#àòÀ±tÁý0-…“0?‰3 ZH™ðÙi‹Ñ#ïõ`.‡$ 5„”³Â /ÖKõd*§4j‰+›Û'뛽J%^.&´DRTAfçÏ\0L' ±\„§xÜ™Ñå^®TÕCNTÅPLcø`,.•JÊbWvoïéã£û·6ܽ”¯ä¦Žiä Ð@žA ´Â£*tÊÑåA¶UQ’´U”·òÏîï‚×>ºýûøø×ÿôƒ?}ººRŽélPäP>5Y<1l4•ŒÕªñn;Ûnæ¢2ŸLÄiN°º<.7–ÄJµØ4—Ö×½ü0×î;QÄì†gŒ€^¹xò ž³g/`(¬Çb¥R1“MøÇ7F†U+ÅÓkõ^?/o¯ÅsY%í~‚‘“¸”S-”•aؤƒà•Ô“ù|9U311£âÛË•Ë;ãn#[ÍÈ›ÃüÃÛÛ/^þèå·žÞ¾¾76ôD<àƒ!êp(©M&(Gq>ˆ’|«i”"£¶~°œ~°_{uí‹w¿õòðO¿ùñoõÃwŸ\ÙÝ^¬×Ë¢ ùärGc¬N±±(M ÎFB•t$§ñ½j|©Ÿ´òëKÝ[×v¯^Y¾wsëåÓãçï]>ªWëñDœçš™w:<̼=? ¬ø¹ –sÌs§ËCNH`È”&7j…ˆ,H,Y̧ …\<–ÔãY?Âœ¹h kwa›Ç=2i+ÇàýQìñaûöå΃“ѧï^ÿîÇ÷>~k÷Ó'ã?þìé¿ýö‹¿ùÞó÷Þº¶µ6L&“(ÉZlN‡ÕDxmIî¥ñ^Æ»TÁ¯®Ä¯íV·+àuã ûàjï­»K/,~úlí?ï?ÿî[?úäÚݽb:ŠÛv£Í‡Ó!‚áÌ"PCC÷:ÂÑX~vXþìÍ÷.¾º?øìùê?ÿøÉ¿ýî[ÿü£û¿ýÑûõ7ÿ¯ÿö»¿ûþ³—6®î¶Óédá¼~V*®dÅ¥–¶·ˆ… +ÓÈ2‹är?³:H_Ûi}øâà¿û›ßüûŸ}öéó§÷w/m/‰6Ù¬vs£âƒóÔ¹i·Õáüº§ÂH„µG8W«5uл ú»O÷ßy~òìÁå/ß¿ýó¯>óÅýbY..tW¯ wŸq±ª×e‘˜€Öbäþ@{rÔyp¹~y ?¿Öþ§¯^þú«W=Þøüéò¿üüÕýÿúÏøî/¿}ãÏ¿yõËïß9XÉÈAŸÇY¬^‚R°ScÝ£sïRþ'Ÿœüú§oýà“›<}ïíµøö?ýòÕ?~ïÎ/¿¸úçß~ó_þð“G­ÕíÅrJWÓétHM‡£ù`‰F[©·6rïÜYzã¨ñìjíÇŸÝüÝ/>úó¿þÝþù[¿ýêÙÿÓgÿïÿù¯úÍwŸ·ðÍËÿüÕ›ï?ÛOh²Å˜2xmš †=+Ù1¯U$\!Ü4,OÖòÇåÝQüh%õôÚð¯¿õƧo~úî—oÜ×ã 7ÂP‘%ˆœìe¨­wwMûôÞà'\ûëN~õ½'ÿÓ?~ôÿùWø§ÏÁüéoŸÿù÷ßþî··Æ¥„&YQÕR E†h¸¢‘‹ü°ÏßZÑÞ<(üèÝK¿úÁ“¯>»ñýoîÿâ[7þç_¼ûßÿã·ÿ—ßöûŸ=ù—¯îÿöÇÞ¼½ZH„XŽbuú|€'Âj>"³ì‹øû׋ß®ÿõ;ëÿᇷþÛ>þ×_óöûßù/¿zë_þì—Ÿ_ùÇ/.ÿæû'?ûøàÆN¹œO:Aù(4€/÷kkÝôJC½±–øòÙâ?|qõïl|ïí?þò½ÿÕóŸ|tõo?¼üü§ïý?ÿû¯ÿËo?þãWÿ·?|üÓÏ®oô(lŸž7ØÜ@€’Y¶_54_]u ùG;é;©×ꟽXÿê“+ßµõ«<ø_ÿÓ_ÿËß¿û§_|ó¿þñû¿üáÓ½µF´,÷ÿ?’ÞëI²ó<óü#&f$’º»º»|zŸÇäñÞç1é½·•YÞtUµ­öh G$AŠ"G"%J49’"$­¼8’vg¤ÙØ]Íh´{17{¿ob"2:€î4çœï}Ÿç÷ó} RϹùš§ +Üi‡ÿàÝéßüøù?üâ½?øÞÝßÿî?ÿÉ»ÿýïø·?ý‡ß¿ûW?yñß~ù½¿ÿÙÛ?ûhøƒwZw¦ZÅ9VX[\zk- Ú\lR@/ÆÊó£üÇzß}ø—¿÷Ñ?ÿòûÿÇ_|ëŸþôÿôgßü«¿ø«ß~ðÇ¿vôý—G»Ù~qT‚ÀN².›u›ƒþhR›T„y™|4ÿý{[¿øõ‹?ýÑÓ?ùí‡û‹Wÿôßú/ù_þü½_þèâ¿üÑ«ÿöןý§?z÷gßØùî“ÊGÝFÉŠ§X@bRÊIŠÑª:Méç©{óì«SçãÛùo?mÿìÛgÿé?þåÏßù›Ÿ¾üÿç/þÇýãßÿÎíßÿ޳߹E‘lå²½$:'¦{¹×`Ì̯_ô~úÍ›øýÇöÃgÿúøÿý?ó¿ÿÙ·þ—<úOoì6ƒ£H +!$Ù¬hVÅ0ò¦ÈUl»®Þß©¿s³ýÑÝÚýÚ­ÿõ>ùÇ?ÿáo}vó·>ÜùƒïœýÅžýäÛwÞ»?¸½ßi7Ûª]åõ +D$Èb Gq˵\® PÃÞúü¢ÿöiýpœmU=ØHŠa•†éö9F*9FÁ`Ë:µÓÔÞ»Ýýéç'ú›÷‹wÿá¾þò­þÛüõO_ýÍï<ú—¿úæ¿þÍwþîw/~þõîÇ÷j³†B ñ` Óív¡<•WçÈV–î˜Ø¶—z±«}þ¨ýųÁï|zãÿþß~ø/ÿ›ÿùO?ý¿þö»ÿúŸü—¿÷úÇ_ÜúþGǻӲffIÁÁ˜l­1RDÑQ™£aaT çEôö@xï´úͧ³Œ_·~ãÕü—?{ï/òúgß¼õÛìñtöp§¼ÝÐ-g § ™åµ3,·èXߥ‡ù[;ÍóiõÉQûË޷žÍ¿ýöá·^Þ8÷ÆÙ;o» ½D'0ŒÌÏ©F.ÊFUQsµR¹âèeS8èîm7îÏr_<ÿôÇÿñ§Oþù¯¿øó½øÝ~çƒùç· +:Ÿ7šªNÆI,GÍMQÖóGˆ4J“é¸I'&yØVïŽÅ×gùÏ.¿õÁÎ?þéçÿï¿ü‡þåwÿþ?ûÝÏ=ØïŒE€Þ0®'q>•ˆã©¸Æ’Sl¸Â¨¬t‹ýú££Æûwú?úäüÇ_<øö»/oö& O,Œ„6ñ0":å­ZÿÌ.MEÑ’hºU°ïm?¾{8,1÷çö'&¿õ­w^ÞÝ~r܆ϞmúUË5ES7Ήf²1ÒÅÄ2£×h­ê•¦ér8¦±tÙÖ˶Rw¥ý~þb¯ýäÆèáqïæ¼>m–&µÒ ä¹¦DѨÉ`Šõ%DB(¡¤‰$ã‘H&•ÒYnX«O[÷wKïÜ(ýàƒ½?üþýßýôÆŸüðåŸüæ‹?øöŸ~ú»}ÿùøñžk‰i4g=Ši8—C'gQ„©æŠÝRÞã}»9²n{/ ?ÿÖ­ÿþ¿ó_ÿþ·þêg¯ñ½gŸ½ØrÞÝ KÍŠžãBì$.¢Õ©wsšP6Ù†'•u®ž•'5oT²f%ñÁNåí[³{;ÍžÃ×,ÕUU‰pœ ÄùÕ ³´†-û 3è I¦’<Žy–Y)äë…B3ïtÞ“Ù¢.Ö]Åd@Yi6'ÐÓ) l‘sõ)ô,Ì`”L¦(‘W+Åæöül{´Ór´½föÙqû¸¥>Ü­ßÞªµÌ㶵SÏn×ݺ)EÖWþDÓ)¥• ²K«ñ¯]ÚX]§cIeóšÔrÕ’‚MJâ~S}¼›ÿâÅί½søÁÝé­iÛåXg´l]¯Vç/¡ñ€‡ ^4ÕEUV³Q-Ú%O-¹²¥qš&ʺ‘á•8£¬Å2Ë4–ÑY£ŠIÞZœŽ  ++yêâZ^½Xic©„-q ˆb助;<+q¬K`±$K³á»!WCd’-d'vû¡”E«FòNª^@0ÚD–íÁà`29îõvì¬Ñ zPÏ6")òÒª#ÁÄÙbFïsVOÎvÖZ^ ¬®‡2$¼Í3Œ‚iØÇjUœíaéâ°}c’»·×¸8ÞïWG•ì ìÕ<'O_Zöù‹gÛ¯…°7V"Ëa“àV;'¥ê„gYC"j¶PR‰¢ŒŽª?¿÷É«Ç÷O÷w{WWšDp’s ÚÓÎfZò[•é“ÊèQ¡²Ë Ùùüøþã0\ðû’­YV¹XlWký¼W8=¥Rˆº¶‰.­$Wƒt”ð‚¨HëIÊeÕr$Œ¤h<„-ú•·6®ù0Ö›½;Nï–\Ü ¦õËˉHJöŤ¯.Å–|xJ( ¹m³~SÎïq{3­_ P›Qš¼dF¿² Çwm5á2iÚ–­¯×6ãþPÍ(¹¸žH+ ɇh&"ݯ¼éSêGˆV#µÒîí{ ¹ˆ›Í´\aìïöÔ´¹óÐOªA\ÉhU©ãŒxi#€aÒŽÑ®¶Ä–QßåÜAJ(h¥­|ïŒ1›‚ÝËM:7µ‡÷Þm­y,·h³ÑÚ{IgBgíÅrZBqFdûI¥‘V2`ËöãÙ­×I±p=BP-£µ¢”›’*¨ÖŒÑ®êt[Ó{œ7^Ì%n’JÑ´½À8“ e̵»‘ £¸Ê™-Æ™cr;˜Ã)Q°º¤Ù‰Ò.l¶{c„™CÌÄ ÈI›Ð›Ðk1¢´z8³˜d;%3F;­´Vs)@cb>ˆ+!<Œ©1&G›=Bk‘:œ +®4)³+ågI9Jy ®š–Zq®Œk‹§l–Ä5Ft—,7S|SQ£•6:ˆÖòSÆB‚õ µ×ÃOØq©®4ÏÙâ¾Ò8Uª7®ø¨ÕO¨MÚl…ˆl‚)Eˆb8“qNó¥H&»¢¹ª·•Âv„tW"Œ1qs@9[²ÓaʵMô«×¢«40œ–L>ˆšQÒcZšq65(\¹8K»lq‡)ì JóÊz&c «—­íœ>ü¼492Ù¤\ŠÃøVw ;Ó¹çÆ‹›m»zmî'µå´èËØcPÚzVÚ}Ç?@ÓÆšT¶/”ö…ò!¢÷âb Ž¿}Ô8Kó ‘ à&çméí{r팲SÅÙÊöî•æÏ‹³çÙÞÍ„°xæ”uG¤ÙGÔÔ'•ŸÒÎ`°ûdçÞç´Ý»"”£7näÆO³½'¸9‰q•0t _Ä•jWÂe9)m¤õhÆJ±yT®G™‚RÞÕëIÑqn\¬ö¦jSÝr…0ftæ÷åÂöw%Î'å*ªw1cDçv³"EeÙ퉹 et¢„¢Çy3£q#Û>˶nl&ÖsÞ6Ào…èÜn_ˆa*¯×Ž1¹~-DĹ\Æê2ùÛÎX}?n,B-n'Ä(0ì`JiH•CÂ󥽌3 RyÖ›™“Õ”¥gJÐ,ðýRq¡ó1Ê ó b­EøÅ̽¸²i¶N3æp#Æ®E˜Í¤ +}º÷Æ’ÿ«WCoúÈ]âÜ-©¸Kš½Í(ïOJŒmÒŠÐ^˜ÉÅØ<´çLa  ƒ{ùþM„”\$¬¶\݉KyÊjÑÞ˜‡"t‡Vc¿²uW,Œ6qö†)ð¾ŒjW‰*ý¸Ôâ²=­º ³pxÙüL®–·_Nî|Ñ8|?*”CòåùÖñó ›óNPDîð…}{øÀž*ûI©‚}¹j-®CÁØ iƒ“:ÇŸwÞ7z÷ÒB5Éç@·)o°å})WÚbþP,ëÍs»wgMÖíí›rý”-”w^´Žß_ÌêSÚ«l=árP.m3¹-©¼£ÔŽèüžŸX<즶†G/0¹@u¨+©0sØÂYØEô~˺·ôÒöjJ‰óÕ0™O‰u©zªµï2ùý0]²k»'> öRˆ¹—A¸(ÐÞÝÉýïRÖàö³o|ÿ'–ïž\Š›¸M{[…ýwZ7?­¼+Vü¸åtn€:­'”%?™Ë®õã hµS_B £XLW—ÃЮ¥¨¸Š„3kgîøÉW—“×|HŒ´Â¤Îx1*gKÜ 3%©|hunúÒÊúbö-;ÉSRÍhßJ D,cZ“t¦\a·4}Ö9û0c6Œê œ®8¾ E•m …çõ¯_ž?Ôêû´ÓÏdûjí$?yšŸ>Uª‡¨ÞÞÈèq± •ç¨VÃíÍèü>b á€7vŸ×æ ÛjetŒËoÖ+îJõÞëOŽŸî^|"–¶ÀÅà³Ra«²ý¤uþ±Ô8ÑËÓñþÅ×ý•ùí çe²coô¨¶ûªuø^~t+)x+èÔ¢Ô¢¼›6êA.Oyãöáûã[Ÿ·ÑÞ„±ÕùSÂ$å[Ü-ÌžªS&77š7ÔÚÞå º‰PF}j5çRyá«)µÇç÷ÛïÜþp÷îGW¡mS2eóWƒóÏåÖfH­ñü“Ÿzg¡ŒMYýáéûÏ>ûñ³oüt|ñ_Þ‹q%ÉòŸ+ÅÙõ˜ãªBé8;x\?x=»ó­âô ®V»»rÃå¤]ÜžêÝÃóo´ö_vö_°Î‘^ÿVˆpC„ÃzS®´GºsP¿ÜðA÷à%äÑؽ{l~›ÉMXoŒÊ-ÚhïÜ~ïîëßyLòe½v¢×Äòn Qµà+”9¨ÌŸÀß/…?bIåm½uìôo&÷7€x£‚[Ûë¼XOˆK +‡Q«žÓ¹9 î¦÷ÓJ÷ZD´K[^~[qzÿöë à™Z;«í¿·ÿä{à5þ´v÷íïiåíaI³g1¶c‹àMZã¼²ýîÁãßœÝû†äöoÜ~UŸÝ¢³-)?Ôk{åÉÚüam÷‰Õ?c²íbÿü (ét¡µÁÁX¡MäêAn|ëÍ´R³sJ;ïWÞ÷æOH§g§;w?1[{1Á“+{NÿÎøôõÙÓ/NßþöáK£ºÓ™Ýkn_ˆù‰Ó=«í>wúw‹ã»ã³÷ž|Ëîì4§·‡GïŠå]¨[Do&¥üPÆ)µ*;¼^gÿí"ln‘5ªG (v~»¶ÿÎàÖ§P“reßèÞÞ|=¹ø†»õ ³'~:¢\±0ÎOnofx.ßì>éÎ`ìîM¶°Ìy-L#R…÷FŒÛ!ó²x(TohÍS³ycì8mz'Bn@U½¾SÞf÷Ïœî©7¸íuÎâ¬z¨5ŽµÅ(ÏÕæ‘Ù½ÃWOr£ ¹²ãCÕÊäN}ï¹PÞ“Ë{` x˜Ö¶ê‡{w?"Œ&¦TÇ7Þ¾÷áoï>ývçôuqöT)Í!PŸÜ}ýø£;Áê^}÷Emïeuïiy÷yŒ+_¼üöøàIŠqq¥\ÞyÚ;ý¸süº²óNãèc";Y‰)„ÖŒP¶Z;PÇbí ã,8ÅÕ £òÐY¸Þ[ +`×ÂÄRŽ³ÒqÎDö¦þ”üær ˜z +Óû)¹‰©?yÊÛ½ûy¶¾̘q¾•¥s@Ý)©J˜=µväõoC/ÓZm¶á¶w“œ-ºƒÂàîÖÍçw?­n?RªÛl¶ Á°±ÿ܇ÈqÁã ¯QÛy77yä.¬Î)ï r½P!re7;¼0‡wXh³›ïÞœ"×vb¾2{èõλ{n<þttþZ«í +vw²÷¸»ÿˆ2[^ûèôé·žüÚôΧÃ[ŸgE·vûÑG§?‹±n˜ö2VËO¡²ý{bõ7z^sÿÞëïõE»s.ÕN”ÖÍâöóƒçßlV/>íÞx•q»Z÷”­žàî¶P=µºJ³ç”;aÌú½Wßí¼\<íÈ—£‡ZÂbj³Ð»]ßÛ=Þ;|†˜Cr±,õVZR(‚ÒvOÞ]Ȧ˜·ÛÞè¶Õ½QœÞ7Z§@b?îªô4Âx¤ÝÍöoy“ÇÞôYuÿƒÜä‰Xܺýò‹£GÀ~}€«Å»³âäa¶}ª–g@°µ::y99yiÕAí·ø–^Ý-ôŽ|¶}þ^(c‰Þ¸wøbxë#¥}¶xà=?cœñÙ£OóÍ(¦.žxÞÍ nꕹ´G¸óÍŒ·’P¹l7N;Íýç;O½sç3küÀݳwIwg5®óÙAoç1¥·£9ÅØጃIm6ÒD ïÊ&ÉXŒ5Œ1ù«!.€9´5¥¬©\9…p +¦A;-U\)Ld3j}1<ªDXQ넵æ‘RžÙNŒ2½(¥×÷œÞ)ë!ÁÑ€ýs¶´}Ň„CiUf˳ç\qžVkÀäJ­¹õ€wº¤Z©ï>ã?¹õéøö7ªûoS¹aœ÷š{OPÆòÒÍ»í#¯wƒ²;ˆàÅ¡Uéz{V뺛ÈöØlÍkí)ÅÉJœ!6|$Ê;ÞæK[ZãÄhžZÍ#½>1–h·o¾øõíGßV[7ŒÖ T%?â­öÖÑSP€´\+Οç¦/ÌÞ=gë%_9…*ÚH+nyëäá'ùþÉ›>4-Õ9}ü@kÝÐjÙÚncxöù¯ýäÕg?òS¹0[ÄŒ¡T;íœ~¼ýìõ“!®žÜ}ï›?ø£âàl“p2ÞæîáînyçÑýﺣ‹(eëÕmµ²ýåì¾€Õ´T£­ êtï£Ý;ïÛͽáþµ4'­m#lq7ÁY€auA÷Äü\¯ATOÐÙÊänyëÂj ¥mÂíÇäRR©Y­àò ¡”KŒ3àœÓØÏuÔêö¦fä¢^&‹Ö +‚7€,“Ý%Ì.¦7#Yo‹r†>LdìºÙ=ªÌôN^7^mbJ•$»ÕÜ}¸È­ÔbŽÒè—§w«ó»•Ù=`$RmðÞ´úZ„‚.0ê³›ᨕ]ð/øËëQF)ÎQ¹¸§#”%—&ùö^}x|xç]§¾¦sbñ@.Ÿˆùˆ9ÒzO+ív÷ŸNn¼erQ¶¤4o9[ok»BqG,ï#ZûìôÝbïâ˜) j+?¸Ÿ½µ÷¬<ºíµ E|úŸ¶ç¢B]ïÜ´Ç‹iÕsÓfó$Ňó{?ø÷ࣂbqƒÉmëÍ[¹ñ#»{®”f²;8¸ùþñ£/0½ + µ•±Fba—r¶µ›ä+Vy«»ÿÕêq±ãk>lqÚŠ4šùÁéàäe‚uI­ÎgûZöâEï)&76’ó¬˜í^âRýÊ&¹Öj³çNç6D¿_7 +[}ñ»7.>¸´šºì#tQzÙú©S?ß$å’XÚ†”G5NÙb~„k-Â&ÔNÆdÛwŒÆ¹Ñ<†À yÆñ†d¶ŸRêI¹Ž[}ÐíÎÉ{|iv-Æàj”3ÛVçUë ® +­êöoRVdJ©ìšÝóüôIãèõ΃o•·'„i6´ÚöfJ‰‘n’vê$¥ªµ‰l7ÆÙz±ÏØn&„Š·ý™,0$kÀWToÁ—ïÜz—uº@ÅŒ7áJ»Pá„ZÍuNG·>Œ09T*CÑjºÞjÈbé=—sz1Æñ¥DÒlêÅq}t*ç‡×ÂÜÕ0¿I±*ƒü²6ÆY¢Ûu»G½Ã§íÃçVçháPZ“Ïmù ¤ %–ôúa{ÿíÑÍÏ™âQ(¬D%³<Ók»A*{=Æ®DX?f£rG,Jõ“MT’Vcþü(ÅbL¢®×>/ ºÝ ˆ„¦¤7O){2"-xUóµÝý{ŸÔ·ï#Bä bouaê(Ê#U­1½—oƒ6rÞ@®å†÷ÚGïZÝ;2¿—õܸ9¿]ŒËMÊCXƒ`hÔª[Íê^’v¦ûÛã³/grV|rVëðíÞÉûi±êD Œ+£li3¡†qk3­Åù"çŽ$¯ïT&Øâi2‘ófV÷^ÏnFÙU&šVIÁ˘=Lï&¥:"ÕôÚŽ€¹K-ÖWš—çÏ!Ž Åí¦G0}1;ãHÅÙÿܼâôYÐqç)å –£`R­¤XŠ‹%27JÈå ø¬Ö°š‡´˜Zé+oÝW‡RuWªí˜í®4‹ Eˆÿbe×@õ(gÊæf¸1ˆ Õ íA‡–‡gVë0Âåð}¦˜«àÈ öqa1c¼Xœ·^„H6¬¶u‘ÜÌó3³~õ"ÚhrÙÎb:>&ϸc¦°!1ʺ)ÑKñ®–+…ÑF‚^‹‘3¯™[†¢UjG˜T!Øìpz6Ø{Â…éuÌ줵¸çŒ(£ãKKœY7kÛRa¨•`³§¾îC •çŠ½[Ri¶šà¢¤‘bó~ÄÄ•6—ÛIÈÍ”B}Þ~ Iùò:&¸"x“öî«æî»láàr[Oi¸Þ]‹ Dó§Õ$ã]HÎЬq ’FÝ®ocR.ΘÚNŠ5ÖëÕ=±¸ b! ·µŸë߄Ѥ½)n×Ðl‚.qî$N¹´Z«Î.\áƒÀB)±º˜ï+­l–w¤„‚j”2µ˜Q+)±¸P!£—A¶ åG*[«}fj4ψl?Âý¤»žÞ‹Ò¸[aú¨<*•ö` •ò6aµI£VœU¶îÇ87Â:QÞß¾÷éñ³ï6ŽÞå*û¡Œ!ÔìÞŒñEâ0UíRË»»·?lnßS+³ÖÌÜ‚Bɘ}øþÜð~eÿ=€R.”z‡jq„ÊÕ¤P¢Ê]ÁÛ†áº$1¥NZ}†&? ±ùuT‰3n¡{*¹ÃËë±Kk‘µ8 <Ê–ãr#—`XQƱ + ´•8O9®¸+VOê¢ðñ¤âƒØÓ?¶ê[!\ŽP¦/“M‰ ­zC,îð.'Dè5,@®^ 1>Ĉ ";uÚ·KÃnç슟L3¹òðj{=!øÒª3À%oŽèÝ´ÚðÅÙöôn¾}&¬PªÈó¥õÕ˜@éM½4[‹R×üèÿœÿ9½ØåRˆòV‘ÅB?fuתî…p³±ûhÓêÝ”J»èbfNu%D¢´¥åzPó!TC¥ÅÌ?zõp¡ ¤H „œì]¸µ Îg)«¢ó¸Ñת‡”ÑGøÊu¾fœú^it~=ÌnÄ¥å{eƒ€ÒUËûJi7šÉúâ¿xÚ«–$ݨ@[­…§èå%ùh´Ø¼ #¸üŒ-ìáÞ.bŽRJ#D˜ A 6Lk(_Îè]¾t ¶îp…í©­%éP´Û¦´jF©³ö\­–·V¶ŸáÖ`3 ±·–mF·Æ§¯¦çï­#Ôh§wšG/¤úÁµ8FoÖÏhaN»0D­8ml?ŽŒ‚TÚÎæF÷·p³ŸªQÚÅÄ"übŒP“´ÍÚc½~ÒÜ}Q™<äÝq˜²—£,®¶0xéMPNÈàbù¤t Æ6Sj„ÌBmûU)ïgO +³‡¥íçF÷^Tl@´Q‹ãÚì¡\ÞIB »Üp¹9||±ºc»Õéé£O¹¶’T †£Z'-×µÚ‰Þ¼ >³a“lIp·½Oè=!¿ 9ýZ„½´†bübÚ4L«EH;š±tŽ6:i© +ùt%!…1µ·{‘mìøq÷ÆNï¶V;ä½9üõJL|k5uÕŸ¡µúÒ‚y³qP™?½ñî{gJÅùÕM$–æ«£s¥8…Ê©ô¥@€4H†É-‡éÅ„¨î½ŒÕå(¢UÑ,KÙg7©l Duöxçñ¯v£î0Æ—x»Gƒx’aõJ“‡Ç¿·ÿðûå÷6rU•üˆõÆ)± µGÙ"»åöî«å£8›¦xÑî +îˆÔ‹•GØârDÜDtÂåÇ•Ê~ÆhFçjm7L» lq®ÌzólïBoBœÉñVu|ö>ø{\® VŸÈÏk@dGùþ"´ü°0¾ ®Íö)e½ÃÚý|ç¤9»Š\®X€O£¶Ïçf ¾ +Öv=Ä@ fgaáÃÊ¥½ŒÒáì10€1õÊcu7âb”tÓr“/îí›nï"—AKS|¾6»OZÝ[HË­u$ {Du¨\,\ÛD­j–&‚ÓÑ*»)¹ºšVÃ$§Ud»ç[<4gŠ¹-Êèár#Fy¡Œs-H_ ¼ÝϨ­åg +q¾‚ª‹uÇâla1ñ{ ©x«º ¥õosýQ Å s!Ô +$ÕÕ(¿äÇÜæn{çQ’)¼¹‚ÂÖ£àYÕ4“÷'Äk~âå˜/!‡3É//æçÄØ0“V:¨ÞD‡àú ¹o-%FâCu âóŠ«íof¬µ”žTõ§yDð +ý[Ó»ß,m¿"ìáêâáDatTô0µÄyC©ºIŠ°'ÀÀ¨M3J’”Q1GÛ]ÆéA`d+»dq‚”¥y'J OoìMN^ O?ª§AÜA¹|F©DH3F»Zå@ÈmÃhsÚ™3N0% V+#å–ChWI£Æ]D¬J•]èå”P"”R¾w„H¥PÆÊè: %÷ ;|` ãÎU¯{Â8}¦1¹YyçYÿìÃÅÉé#ÂhCÆ)µö½Î¡³sì ŒOßß¹ûõöñ»zó(‚ëf~8=yéµý¨²‘’7’2Ô6ïŒH©Ž2Þz$£zƒÊøº5-ÖA ˜…«Å¹m@Á0n:gÅÑ=ÚÙaR¨®%$ÇŒ ,q6i §wJ:±hv'€P!Ë~<û„èâ‚ã48o +é)JصéOk—6ñj†3öj„KP¥w1¹•\Ì)m‚mÅèüZT/ðãæ”kƆ…£m¢—·µÊ^0ãþ»+­É­ÆUÆ ÐE¾{*{ã|*¥%èBˆŽÊ¯éëÅ:°Ð#°ã‘Œ½‚_]M]1q§ÙÖùüö7¶î},–ö×SH›íPF‹p&oNç!ë=,Ï^-ÖÂeÁiònT+e—3¹ë1Eq¦•Þ-HaBKñ6¢Ô ÁÕ·Ÿ™ã4·Åâ¬Å¸#Î%9ÄŸÖk…Áyiç)™ßJȵ0馄jÆèÅ(:H)MåÚ1l¤!È’ “Ê|nŽÈÅšƒrU©ž*õ[dv†¥åöÆj$œÑIs°‘Pý)“j¼3$õ¦œHnt œ13zðU¤=Öêgv÷‚övàØ®'ùõ9=yåvN00Y¾ä'óaº€Èu«qˆJÅ—wÚ§åÙÃÊø<ß;%²=?åKÈÞÈkìóÙÎr˜ êfRIpUTm®D…ËøR€”œ^¡wD•ÕÅ4V:aöó§ÍÝW”5Z‰ð_˜¾Ûܺ"ì´Tß”‹»ryó&‹»´˜™½0ã^ +›˜êèžÞOS6ÎdE£ÚÛÄç'›xöRMˆµ•3e¹r´™–7QÉêäš7 žW£Â›+©ËX˜ÌøCi] QÂ’‹³l÷&T/¦6“\y3­/'>K˜ÒÝL¸TçËZçœ E爾á—4%Ö³åù²ýÊRè­å4–Ól1„éa\_C,*ú0xc¡êJÙn•Æ·J“Ûå­{Ju(1-”élÀ^^ïvûðƒÊöKgôˆ8!ÁfQ¥e³Œ;‘ªg„wÀ—ÎóýG•ÑC)?ÛDÄ$kSV+)ä¬ ,c<Î Ž_oÝýxÊJ” ¤B-“fÌ.[ÞK(Íl÷^aúÕº12[éé¥I€Èúpˇfc $èV¾á¥¥óüÖ¢ì-Èh¨ÊØ:gÔš¯"¨©5SR Æ+DºÐ ¨\'TV¢$À˜XÚ+ï Î>H)Ý¥»ã€^”Ü(ˆBÐÖ©ìP­ßœ~Ú=þÕÛ«1H2×9Êu㤩ÁÐ/î]¹¥4o§¤PÍ?¶X?%Û[RWýôH|qæpÏh] r#J˜Ë!"„H”Zö§¹HF‰Q ?&¡v­‡ÉµiƒÈz;LØðOIЫ°ž^PVžzõÊ:BJU£¼—mžÊ•ý(éEP5™Ñ­Äj…XF"¤¢[Û·j»Vó„°†1¡vi“\ ©Å-UörMKq%ÎñÞVœÊ] Ð_»žÈH¥|û Í9K¾Ì«ØZÚB³[r÷±;y(8}Œ¶r½Òð&¤Å_YŠ_ 0ËI=&¶o_.ùââ[ËqV«wç/­¤åJÞ’Zby/’± ‹ãŒ +¬Ýœ6kÕH-Ÿ Íàb*­¬šß2‡¬ÓK yxƒR‚-‡ITR' +á+ÛMŠÊê …ÊAûã*Ä7¸8=èÒÎH*B †ê…ÀHšŒÚЫ;™l9­-Ç„WPŠ[ŒÕ1*ûÞè!jöÓZ;Ì×5ÇA©ÇÅÊJ\$íÌQµ›ä*ÀÆ›ˆq=|b'èb-BqPõ,ïÌ(sDYèÜ”†å•[IªI¹‰è}ÖÛ†$ÝÕ¤°@ „p©›äóˆ1ÀÌ!l¿R;ZIŠom ë †;Jç|‘°ˆÖCÏ÷nõcÚî%©,Ä1D®B.[GÌkÞèœ=wŽ3Å%¾Øª8ïÇ,Lëq¹½•„êCthÆ$ã’ri-œYÌVMÀ‘ÏF4ÅjTŒÒyH›ˆº¡“Bugvï>0ƒÕ.o ›¶¿uÏ©lE1Õ—¨'¬aÂkÍŸFp¾ÕÝýø›?¢•ÂZLX‹KÐŒs£&è‹QQBô„Z݈ AÄX‹ +€IQ¨PJQöF˜ðǹ´PÇŒ>n c\ãz€\ d6"$%åÉ¿ºœZ‰baqG–Z;¦œùµ¨ò•«)`¶ŒX²Ãõ¯ä&œ7GåN]Ä.è&”÷H­®·0!¿˜ü„Ô©ENIPYÖ숹©VÞæœ>e4(³&õÅòy*€4¤ÙB¤|Zð2Z•4Û´;‰ÓÅ$[$ÍžXÚ©ï½l½–ªG\‡7À Fˆì"”‘^ˆ)ƒ4-fôªl³vOÎO ÈÇ¥Z˜+#©*7˜ÂxVHnà_ÞÔ, +5³ÙëL©ry5¾êǵ²‘T0¹c*« }=eÄÙaBTHŒÈN}€›£uÜúªÿš]Mp¸T‰âz’ÐwÃvðì8Ì—V’Wœñ@‚@Ç¢¤#äæzã\«vöÞÑ*ûP´TìöJ„¼¦Bd‘[Ji¿>{FÙ³f_Ò´²™”®‡à]\ï!€î¹m |ZYÚÄ6ÈxœËA Qn\¨Ã3ö–\ÜOŠµKAøZJH˜±‡ba{%¡‘|Ù.ÍPʀ܌²À1n9@¬™`‚—´²Wž–ZÛ«¡Ìõ±8¡Çæéìx=©] Ð_Y +†Y]0êäêžfó ¦MšæKP]—V’o,…ÒT6³XMÏZ‹Ë¾¤æO*¾˜öÍXÔXòQ¸X-ôÎbŒ³‘á¯ø¡;òˆØ€?—üŒY?þàZnòÆrúò&—àË@&¾$ÂTÀc°Ý$íBUÆA]¥Yw1O¯Rb­©5 D¯¯”vg²8å‚*À1*De?"‚G$¹Q7S,°ÜÐl;ÝS³y@ZíÅ$lB~3%AmûS +"Tb!›ÐöÊ#ÉÁžz>D‹19»_®ß«7¹âbu†$_ŠN 0ñé¨å¡pDY*;Á´ÎbÂØõt$­0zÝ—RØìDÈí£j¾T”Ïï-êJ,HΠ%BÓÚ HW“bKÌïH¹í@RFH³;¿)U@&D&µÅÊõBn13ˆk×B¥·”/ÏIB±Å¹âú"á!Ø_Ú\‹Ó  ‘ä« §Ü^ + «1%ÉUEoNk€F ˜9L¹ x ¿–௅ù¤X7›gje/ÉxŸ ŽÞNJÍ(SNÊ á\K›ˆí¹ž1Yo U“XF¬,ìòz&#Õ#˜ %'²_“œ‰dP¡ ¥¾äÇ¿\Úž¿²¿¶^qQ¶[¡IL—ÖÐrïüôò&yÍOƒ…ùâ`›h5¾ü«Wc_»ž cVÑ–ƒì•õ üéG,Ri³f7–±.o Ë!j9Ì•¡b%J¸¾¤B4«8ªÎே$L$2¶3ƒ¤·[o©¥ ¹‘3JS)Î)³§³>Ô•ÞˆÑ)Æó2[7åÊIZj R-Å—VÒké+~ÂPq®àG¥HDDi¤Ä +¦ÔൎjKAj5ÆC…„!I%˜8 rT%Ô`$íCBA¤ªTÚårÓ´T‹2È t$£k!ÊŸ2r•Ô[PlÑŒ™f³qê¥9P44Åj˜…Dø"eR•TÁ¥x"ü+*–!µÁQ5Z·ùâ!”¥˜›AXXœî ßדb„våÒ>_ØKIUH⛨~)ˆûP#%Ô ho&è£ÍtvnϯÄä%?(¯Ç)¡º“IkÂYoGȃW¶®…)P'pºõ”¼¡Q¥K¡¼›-N†y†0MÎ6o?û¢»s¡œ(_Mi¤ÒŒ²‹{oHëiÖQJ³å¸X=mÅ„ãí‹¥@#‚+4·#¨ »bžÔÖQ[©Ý¨ÎžÐfûÒJ4™1c¸¹ã!oB½] 2—6©Qäò{ üW7É]€£šb\0¬¤ +)XÈo[ͳÕ0·—áËxŒ9‚b¥ À­•O­0nüêÕèJ˜©µ³ƒKÕ`ʸ²N]Š¨Ô 6ªõ“R ^q©±†P*‹ÓÑR0:`ý¸ÜæÜí8W áVœ¶©ÌX»uS*D¨RÏm¢n˜(,G¥ PTPv’/AþÁ-‚ïº“+` a Á¯DȵèbЦÆ) ×klnìtnjõ`›e#|rvm^蟳Gù2(m´Ö‹à +@))P ÎD¸l”0¢8r J%‚i«! +ãó’3 ”ZŠÍál\‚^®.óø“ŠÐœ;Bk™5œQ¹Â:ƒiC'C(íÖQºàþ´ñ„Ñ\­tpc Ícs”Ý_I)ÿöRPÊÍ0¹>u=DÆCÒ/ /Š£Ú `šVÞ¦áPÁr”[‹ P3åéEëø=Ú%¸¢Ý¾”èÏXˆºžÒ@Ü– Â8»³öe®\,%6 €/\‹pKþL3RLþêtñ0ÊUSr‡ËÏ“BhmɇAsÁWBLFë#Ê ÉÕct™Ô(_XÚH_÷”öæJD2 bR=–*ÇÛŸ¿ü£zúæ +êKþ„¼´™;¾æ_ÜfŸâ+ÙÆ §sŽ«å0WÞ¥Í~Í^ÉËi+@¥Œº{Ï}ò{>HUd.HxI¡!3ZŒãËÕ:²1:!½Œ45†^ðã‹s¸Z‡Œƒ­½–2ÀY¨ì6­%uàêÍ”L\D™°WD,çûq+)µÚ~Æ„ïÏûl3“´¤,¯XFÃÔ +ã wÿæ÷AH1µ‘¤”2 ÁA/L-®Ýèµ¹0ãV0­r +›Izi=´#ü)‘¶†nïvZªl¦••0‹²9BÈûbìfŒKÐ.eõåê1WÜÐÎÊb‘e ¸Ô))©a‹À9”;©dÝh×&ªf̶Z;‹»I± Mi4£ »ù“ÜZ”"õŽ^?OËõ„PÄÍîÕ„ò•ëñ`R&•êF”Y `ÇáwAùÍÆ Áƒ¤ äfZµ9¤ìi `mLUãZ/z7^+‹ªk4·RÆ"RÎ:ÁVRL)Í7“4KF©RF(n%ÌÅ… ˜Rœ-úQãkWÃW6Ð˾ÌÕ0·í¨î‡#Ì×”ò~‚òÖc"›&yH©N ­®EØ7¯‡ÞZŽBÙ$¨"”(tœÖ!W½KX#Lko¢Êr„ÀõíŽÝÁ³w;¥´" (› ÿçÜ뀑…H‡ÌŽ³½vïÈÅåôrˆŽQn8³X¾¸+LPccŠuAí߸[öc¾8»""‹k‹•¤P S°mµB¤+e½~&øÅ—´”‡$³”ÑÔJ³”ÀÌy32ÛÖ +¢ÖJˆ»âC×c,¸¿?!~íJ(ˆ¨¤ÖÄå¦s®†ù«aöj€Cs2 b&pHZ¨áZ‘š0.ׂäUßBv.­#k‹Å”µu ô/—9K³UÆšl¤õŒÑ¡²pv§oú2WB„®ârUt{¢Û½êƒÃhi°^ 2KA.Æp£•1z¼»Z~ ,ÇåvxgL©5„Ì®…鑃Ú¢^IÈW#¼ÖS*¥·•ò\;Éx³__ƒˆZÜàKé xv 5†ˆÚ…_†j ôÈZBúrÆQo¥=ÍÍ$胃M);Á•P™ÉÙºíÛÝÓÏÝÙóS†/ `FŒrRP¼›m,îõ=Á³ƒ(D ß¤Ô;NåâL>NWc‹röùü~”)\B¤ Á­ú©Z>ÎC?Ð^”\*_ ’ü­Æ‘Þ¼f+¨ •ñ©°Ùn“£T–4ÚõÙãÞÑ{˜ÑZÇ´5Dµ:®w×ÓZ€+ Å#©zFf·|¨yi#µ&à Dfq/îBÛ¦ÕA\¨ì‘re5L'(Â~y|SoßH©ƒÛÉQ“ÊALõ#gxÚìºý»ÞðÂ\„é<€.pÑJxQNW6±•¼Ç$Œf8c®Fè+ëÈu?…%²o,Ç—|8EF혭˜qÉŸY‚`˜’ƒ¨´¶¸¥‡¹¤ß\ň_¸Hé *H‹;×cÊ&bƒú‰Å=ØÓ·6ð8SÐ*GJõ•øö²½&Ò´ç‹po\‹o$T­¼Û;~f¶ö¢XÒâÒ9"gÁšá3æÐlß*ŒžÉ|”©ÆA*™ÒZZ»f®†è8åfkGåÉ“êλF÷b%¡. GÐ~Äw R^„¯d¬)T)—߆ÐHí³d¡,£Tž¶f€j0”ËQÜçZ˜^ûŸzõå³ T€©I6ÏZ=9?Cñcän½rL›ÐªN,qùI\i$Ô¦P>(ï½–ª§€âz¦%Ji îvJ¬ãæö—Ò;€mÀù«Q8ªÊdûFë,?yŸ>AõH.tŠZÜ1›çq©¢ÊˆTOC2b M´•H&„Ãè÷íÞ½ÖñǤ7X¸ébR•ŠiÉŠ#ÂÞJ +³8CÄ­kA +öÅ—“t–4›lTv IML¨¯F„Ë›ØF\ cÙõ8xŸ –‘Ñ;¨ØÒ~s5õ•+Aœ_œä  ¦³p£§UìÖYFm¬F2þ'¹=Ù›~õZÄâí*@]ÓEÀEÐÞ¥@&Å×@ÿ{ºXvYé0o-¦QÚRöZ\zs%åK©PA²ö·ž4®˜K«é(¢a¼—ära&Ÿ6GÎèI}÷•V9&”´e´ +£;à› ˜×A +À%õål¬$%¨„8éê…©UÙ¶êGpl—£*|óZBóºÀWÓR˜-ѹ]¥vLç· ÑÄaq°Àx|aYíEÙü÷R˜Y‰qÜX<¿PØæJûBiWåAüá8Ã(àj'£÷!›ãJ —ÁUsˆ„é-«}£ºó´sþYÆ™^ð€«a’’ +çùRÒjŒ¯a½9ïíPÆઽîǧS +DD.ûq4q¶H p½µ¸ÏÎ¥•6Ä7:; 3EH[˜1Îè]„/ B—‹|ajvŽ;‡¯š‡ïˆµã]ÞD³i8§gÜ_'ÌÉbeOwáKk(À6ÁuÖê +‹ûu'Q±@’šœ»Eš}ðSD.å7çI’:¼V“ZJlA8 ávÑ®n¦Ã¸¢äÇBnJ;[ª°™2×PœcÁ(KáçŒ kªÔY +€¦Ñ?_ñ%¥År?xV‚ʯsî‚íj‚‡¶uGŒÖú7olÂbì¾P9$Ý]DjlBe®¤W£@ .7üiÕ—6}Hhƒ$[eÍÅõ#‘åÁ³@ uk %Ä”Á\¨Gdnq|Ílßäíaš¯$éB”ÌʹaipHJ ¨ëˆ ½„Ü\C­kQqµ|¨…ðe€œ¡ÆÔKñÝp¦¸‘¶à'.‰›ñ•ímfLªÉµ³Â·JçnB¨BC¤ûñ¬àÎìöáìÆøÆf¯-î]q„¹Xb^n‚ŸÂa–Cåô#d¥•¸1?É—åòâák Àõ”’ëÙ}Ü(Gù|”; ²Ó(i¦9o5Á­Ähbq{€p=Ì­D„õ˜¼¢™Ååƒçàr®¼ur‡„1¶JººžTH«‹(ÍMÔ_Üú•²ùLmûPbc8£Z•6˸RØK«Âä_<‚­Q¹8‡ë­—ÛÄtÆdó“æî³ÊÖ#Ñícœ› ,Àûl÷f\¬CCm"Yˆ9¸Þwº·ÄÂd-ÆmD…jCqB·&äÖ:š…f¹$R\Ž·»~\G”NRêfŒqiü Ä$Ác¤·bÓ€Á@MT~ñøXÆM ”Ô#Œ!ÉW¯Ç—Ã4"VÞ¯EÄ[ÖZ7Äæ-½y°äÍ5ôÍUìÂWR(û2NxXn1ö Ê>Å–@»øéHTDŒvÕÜ4×9ö®cJ5£ºo·N½{ÔË;ˆôéZ,B˜éLº&&VøÒa¦ÿ¬¸åíÀŘãÞ§ctŠD]”vÖcâJ˜Ç †EÌM¼ÛÙB¾{úñ–ÙOd&V–JH+o«…|tÚîÇ„bLlnRÅML²ÙdÚ5›ûƒ£/¶ÿ:Û»€eZ‹Ëk€~BE.,4|)‹uƯÿ®~ð íNA«oÆ.3*ô® gÿ«Ÿ„?Û Sr«}þ«Þé7jióÆ<¤3‘ ‘Y +¤Pöòøíß›Ís.? ƒ®+Q¾œê˜> Í ô*ÖÊ‚µ›R ŠY\hɹúÖ ¶0õÓ–U[ŽO> jƒ0;)³Ê@Ê Û„Â‚¶:Þ®ÐB‘ÊŒJÓwÕÅWfë&UA¥ø‚ì¬êR.Mƒéâ:žC¤¶Z:ÉöžË¥ƒ D ‘¶÷K‘Ãk«s…m?mûqƒQQÆYqk1å‹fãÌé?æró e­Ä„›‡ÇjLŒ¦ éÜÌ<œþ¢¾ÿ•X=¥! +­µ˜µ•ýÞÍê%Dªkµãåõï«‹w¾D;½lïÜî^IÅmD*oæ&aq™QÞNrx¢R2ºNûÌî\$åŽwFüˆf SªI©œ«`­EkMÏ +az’/IÞ¾ðþø|Àtpñˆ¥ì0¥Vi»¯T³£ëLçA”ɯÇäÍ„!2AT‰QF‚27"ìzTÀ„²ZXÈÅ%¸¿Í¤µ‘©nƒ˜ßˆIœ3o£5O„ì’1‡^Nò£Jo7™Ö?ó§psÄ­îuuë ¡°„¨ïéLe1?ÿÀXM¦`6S–Xܵ¬{ûz{W„Ê8´˜•„‚(]ÆšTg¯úÇß"BõÎ:ÂL('Ê@Ùß°ÒñeÚ†ìÐz+D¹¹á£å“ß×·ßkSžÿþ‰ŒÁÿßøÿjÜrÓÆm 7mÜrÓÆm 7mÜrÓÆm 7mÜrÓÆm 7mÜrÓÆm 7mÜrÓÆm 7mÜrÓÆm 7mÜrÓÆm 7mÜrÓÆm 7mÜrÓÆm 7mÜrÓÆm 7mÜrÓÆm 7mÜrÓÆm 7mÜrÓÆm 7mÜrÓÆm 7mÜrÓÆm 7mÜrÓÆm 7mÜrÓÆm 7mÜrÓÆm 7mÜrÓÆm 7mÜrÓÆm 7mÜrÓÆm 7mÜrÓÆm 7mÜrÓÆm 7mÜrÓÆm 7mÜrÓÆàÿø'2rkÿDÆé÷ë{mx2ü¤a}â—3D¾/ O¦GŸä>ñ÷“òщ¶Ÿ,ö÷†Gkix +I`øZ²4þôÊ5xÑZþh1_ìÁ“åñpg^‹ÁKYøïd ]C>þ¯qñIœ¢ST%PœD„fð5Š"è†0EÒðCrm×{•J¤( +#1%pú¿hÇ{þñ9ŽC/¢?¾ MQ(£øŸ^ô>î?ëEÿèã¶>©²÷Iñf-^kÔ!*yúÉá +õ‚û˜?c±3MÿéŸÊ2ò’ Ÿ$µéÙb<-™ÊZ#÷IÛ{³—Ï?}YûOAy!ãd‚"׺k‚®¡é½ë?ïÞŒþã»þãÿÓk)˜%J}œ0¾æ½ùÄïÿ8G¯ÒkdŠÁÐO™ÿ"%W£Œ粤V§Œ&¥ÖSR-)Ô c@Û#BkaBùOû~˹)kh«“Š‘´a¼40¹‚ËÕdÚMë5Þ骥™P˜2Θ²G¸9`³‹h:ëKr¾8#4B)³n_,.¸â’ÉÎðL/.—‚TF) 9·‹ŠeÞ©¥£~LZTlPÎS[q¶&3˜Ò ÍmõÔêNRm¬!Š·i³Tɇpኂ;2ë|aFfºá´ƒH¥„˜#ŒJ€6p½¦Õ÷öyfø”¯ì#j#ÂçÃiW¯î9ƒ+½}¢Õ3K®°ÄÌN(í’F;¥Öã\ÞO~DN0Ê»”V!´š•á³0©b²a&å +)­ ÃÕ:cvpµÊM§ù@¯!J;Èd7S†7£iWÎOyg¦Ì0a°fwF¤ÚŠn3é,gv²­cøD„Ë3z'€ê«.B:1&gr±t2¤5Äõ^Jël`F°ãé—Q¾Lë]8TœÉ§¤F„Îú02g‹Q&¥]Îê öÊñtчgîE¸ûn#)û“2Êf ±DBÉLS“Œ½cï‰ D +‘¼=BçRRª ¶L™° +„ÞŠ¥³1.BX~T߈K‰tP;)©Ei½tfÄfúµá¹U_„ 5É—Y{,—\v"Ì‘Ç$H×QšA*Ä-Jk©Å-9;FÓ9­8§ÌV”Ë)+É™Ì(mI¹¢d;Lö£2å팺“v¸9"¬1®µ½Ý¼¥r×P±(·¬î™\Ýãò°Ž½ˆËTÝ~ðmqô )’|AÈ/þ3½qAý_Šx{f:QÚSV˜òví@åü(ÎWâ\ÙŸ26’ÞF|:ãmLd4B UB~+Ó¹*Ÿôß&•|„ÍpÙ±Ö<ÉNžëís™Ö€6ºó£¯›;¯cR9HZba»8}m÷ž™ ‘%„2d2žÎ!\þq¯ÁÛ“qa!ÖbüF\ô6†UmToÅÅjB¬%„ZRn¢j-øqû „oÿØ0å„);ˆ{Û‘E©LJ,&X7LšALâ™ü3 P¶œoÙµ}¨«õ0ëO*ëQþ~ `zªHiÓÖ•»ˆÐ䬹`Ï)#Îd“\WšPI¯ÓæP.l'øÂ0õ“•™6º’;íI‚ÍÝ 1D’ÞŸ3¿ãO­G”qIµCéÝ_Z°0$›ßLJ~L… Dèüb…Iª4!ÕHgšŠ!L‰’Ö:$!& lQ¯šµ½r̘}»ºÿøÝß ^ýÙj”Ïͼ-‡—”=ÖÇ&*Dé¬×½?ŒMd ÄüDp‡¸X¢ÅêxÿX(k ‘©–i_­s\®`B6€(7Gš`r#!VcB 7‡RaÛjsö0ÁØ’;°;Çby†› ÂìÂú2ÎD­ìt¶_*¥-D(PjC)ïIÕCÂÆÙ2 ¤á QÆ^Kð>TpÃäf‚¯jë„âýõ ¡cBÔ«1>—”«jõ ºü²±ûEiëI\ÎZU,LøÒŒ-ÍñÌP­Ÿ–'ÏÝÎYsöÄn†½}u +Ra °‹ÍÍQ­‹[SÌ;l%mö¼ T“Ê&ªm¢:*y;„„RÆýãK*¨P†Jö‘™MÚŠ¤ÜÃÔX9B´ú*Cžùü2HÚˆv/*‰ ¬l„4cŒ0_ãél”ÈøãÒFTØŒK 1Ò‘ìaÚè¬Ey(*x~%”^‹p«Q6DÚ¨Üಠ:3g¬©œß“²Ë•%•†·¡_Np\íaJ—Ï-­æL©ß ‘kq`Wq0í •½ã#îøð"%i—;ˆÔŠÒ…•#Õ>oö+X½¾‘×’º/å`b ‚…Mªý_Äø|’Í­„™¦¡\‰Ñ»ð\j2ZG_ÃÿùZ,íôŒÚ.XpOjÆøJR¬úS: øc0¥–ÊQoc±’lzËçÀ†¨T¡½MK&I©¾‘Òý¸áí>䎔âÌÛ:#ÓÁ´FÊè rƒÐ: ®Æ ³²,NÊå¹^ ¥)a¶ÙìX(nÁW˜Wª¹C¡0^G%¦!\…s¦)¥…JÐŒ•a…h;ôG~"¦‹´1â³ ÆÖî$…2®Ô°«vtÆû újãD¨ì ZC«íkÕí´; +cÒífºݽÅésL­¨L€0 .@Ôû1~ÓÄì–Û{b5ϽÍÁ2}o—T`¼ +ðcú:¢¼®‹±t«)°^T¨$ä6ªôik®Õ¯@ ļ­°÷¹ü—2דêFRÇåæý…x'Îf¾8“ôrb­…Ù0f„0ÝŸÖcB"O‰µ`ÊZË›I-ˆ™#wüäfRŽ¦ó´ÙPŽ?• ¤2A8’ÐKxLµ l‚´?E¤:iŽÕҽ£¦@aGhê!F9)¾Œ°…û¡´Ñ|q鞟ŠÓ%H#4,@_„ÊÓJÓ,ÎÕÜJz#©ú1ˇj!"ƒÊ­´»«U¥ÂSzˆ’Ë-áù„XGÄ*oÒz=J9˜Ú¤í‰TÜÕJ Æl!\NqÇåɳ_ŽÐv,#ô¦·Cè½Í%ææVó !•V’RŒ…ƒwYkÈ,f€nmïó;½ü“ 1!Gdúé,ÛÝ:ËöÎ)ËÛ½Z,JçP©ÅØ[BñH(ò¹6;‡ÞI«51? 2y ëGÄšs¹-ÆYµƒÙñWåÑe€¶pµ©VöÝþCwøÄ>K[fiùüÍ_Éù:®Õ"rQZlf$:cÆèx*%eÀrÞÎœ¥0‡G„xÉ#ЭbõN÷!N.ZKløP3BlUr&¬Ý½ã6Z”©¤Ý±¸/äw˜Ì8)Ö AQÀÒøÂz4½™à¸ŽKuZmÓj IÄÂ-`RŠ྄²“ü¨éG (­ ‘™õ¤°Mºž\r¾¤Jf¡\½­ªidÙûqnS`zP´¼»Eý”Ü„´CGƒZ†ä‡Ipf%œÞˆI19‚»)¶BAéI&·a>ó§îÓ@[Þî@pÀˆ·ÇcÄ ¢:0QR¨@Ý2öJ…Ôº)4v~5Lßõ¥¢¼«¸ŽH÷Òý¸B©íÚèz3 ˜YÍØ‘šœ»Ì´.ì戫´RÈÖVcŸ0:)µ‰€hתrvšÓí_†H—ÏtÒf+¸p”¿9†pûÍæ!é(iËÅ9¬2  $7äÒv¦}\›=yøö¯›{Ïr‰¶ûl~‹Í/À20ÎH(.q£ú €(B¹À)Raê‹6G(|o®Eoëecù:ÈÂL1¥¶ÙÌ€wÇihwbV÷J½s17‰ñBkš·§^?qúùÂ\¯íž¿ü­Õ=\IÊ pè&wŠ* š.À¿7%ɸ޶-öpž´‘š¸Úa ±™7B5A6Z`Ói=ðvw‹P' à½êm]L­õ(PÝb3ÆWãÂý0µç¨!-\ªò ´£¶9sc +€Q1 +Tev=®ø1 + e3¡l&•í<ps=ίÈ(éøÚJXX‹I s(_J÷vè«aÚ…9j¼”¼=%U)µHY~Dõ +%˜„pAtm&ä@R–¼$‚V#€Bpdï+Ì!Ld ~©ô$å·\ä=&×S +䶉ðÅ¢B­Â$1¾”H»+qz0¥Ô?îdžÝHž%«°¬=wºO +“—RaI«u^¯ufÊ“+ ?ÒèPf‡ÏÊ"×=åó¢3àmo/8³z UŽµÊ‰Xؗʇ)½ €–V¹ÞI€2AãJ+×\¿h쾩í¾b +#0›•éSµ~âJq©–ÒÚZíÐj_€YcÝL‰sÞNt P›ZußjžÕf/A‡¹:ªöPj6:´E¸%äf)µì ‰e¬È~TªêµƒÚâµR?*ÛNï4!–71•jP~àD6Rjˆ²A-0FßÛ>š°×b"#×ÌÊ6*W×p&·…hc'rëIx34èçRJéP…(|ŠŠrîG…µ„¤øø6Jbteñöå³å@ƃøµ&¤º˜9õã´9 +‘Ùp•ÃÄ:&Ô@µ&(Dþz\ÒŒ}T¿ð!Ì@¸RµB˜ÆÁƒI¬½×ä)£ i‡JÜ ­{*4BÙ¸\Ü)ä0žÎo&¤ªÅéüf\ªQ·— ãtÐl%Âù0 qÀR>(É–@Ôal‘3z¨z?ÌÜ«Át„´ŽY«´»–” iñ´½Âÿb%Šx»EÕ (ð³ÏÚ#Ö¡J(ã +¢Ù-.äò°ž›ãfQJ –Ål›ÒaÚŽw® vˆ +hÞ4H#µç«~2—ª´ÙÓKÛ\nä#4L.“FKÈM»Ï¸#Do'”ºV;hl¿Uëû`¯pkÒ;|~.Wøâ.›]€Ý†×‡ª *$šÎ²îT*¥s;¨9J™cÐÛ>ÜLð%&ÓÇ”*˜eк¤I¾&ö1©ÂuÖîãàठ+¢6­ž«œ_f'á´¢31.ãòð€µ[M¨ëˆ ÅꣴˆA†hX8>®5Át“z0©&hVg%H1 —Û|nµ´ÖÃ…†ÏëbdÌýHúnˆú,€‡pð( ¼ÐlÙHJàg¡À@a@ÎÓfÌHpC„ ÆÖ{$L’ËóZ3NÛŸùе( %—dWK tB>Éx³ÁõO×ëQÖ—Ä¥]%Ô \Á™ +î,B;À¡ ™½=c…*0>”:xÀ ªÁG(­„¨»„ÜzLŠQùSôp28éøi%®ƒÅˆKn0°” î¸ÐØ_¼¿eÿbY‹°)®"‚Z¶[‰´éM&!… ó~(õ+õ °æ7àm>)ǹ,X-?&ƒÓ8ì‘ìNxwI{-ùTolbb‚w¥ÄY-ÎéëõC>? äJ çãB ×:zõШí§3}?al RR,&¥R(í€#ºÈé_+аÙi\,j•]µvàU›£3#³ý0;yÉ–w½ýcïlCB.ûi+íΤê)_9e¡r´v$ Q ¥\Þöá °eo“4°KXÈÚFRFù²:­Å9&3Ð[gbyº»$Aý[¼;âòóãÞ P½€~Ð}+Bi bÖ/~\¼E»#3)®ý+«$ Hi0­]FøjŒ.¦Ý³žð¦•ùÓÞtk Šì<ÕJ„ßHˆ™®¯”ÎyKmPŒÿfBŒÓ™0¡oÄÒ¬Z>0µ56}%"‚иrS²E—”ªa°öxf +QB)Öºb~'HfMT!•:`Ž·)h:w?ȬE?ªÿåFì~˜ð!2^”+’òj†¦ð%UÔC›²’›ð®Æø»AêSæá'•Á¤rÚê¬{çúZ«Pá~¹ï¯ÐpJg´¶¸ÁXQTPŽ·Ë+èjzzO*ûP)‘¶H¥âÇuàw?LZ0=øg £ÆU>ÛC•J”q¡A60ÕO˜ ÒìΗaBU«mĽ-dƒ¸Ž‰E½º£”–‚;0Ú¸ÕIi-*3Œ µP:Äë^9ƒ‡I©JjMÐEàì(wÊÁtXR¯íRoNcòÓmob梂eƒå0*{ ´@ùóN?HÙkqŇê`ˆbtN/í:­SÒlÇ3×=f ƒuLXÇÔM€ƒ R¥2~ZÚz‹Û#°Wzu;)B +–2%ÕpyV5–¢"Êåî‡ÉX¬(—à@ïYH:ƺÀGQÊRÀkÖfBßL‚¬mPJ#˜Rá‰ZòPŠ!Ü(¸ç¹§,cŒ@$i+ʺ`{a='B‘ákŠÏ‡SÁçìò$L›°Òõ` ˆ‰ÌFpŠp-L“b9AeüII—¢T.ÎäQ¾¾ú09%) 4Ï&"Aýû’:T”tAÿ¯ÇY?"Ä)˜­þîÎfêþÇM£$wrþêq>gÝŒ± AÞo"*P¡·ÀÚG…Îî}"#HÎ"ù\2 ¨Õ’‰RvŠ/–g_Âø2Æ£$,‡³‘ä“iKrz <×¢b1ãÔØ՜֛ÞW©R›="ÆÝPz=!®ÃBÐit³½+<²3ž_ütåý¨Œ°ù ˜·ÝzJKÈŽŠÍýéù×Lv¸Ž¨AˆËMµ¼ßÜù]#Š§š”Ú^„χ„iõÅâ¶Ó¤µN2¥­£Ç?SëËOD5@ñ‚ƒR² Bï@‡W¾2„¸{PæRv&åçÀ¤¤Pi-Ÿ¥ŒÒ§›1ˆ1)UB)³Õ\¼¨ï¼e²cÅtwžùIõ'›‰»þTJ,ÃL€_´ü Ú$%‚tïøÑÕíO +ñ¾ª¡¢4¥4 1 ²8x¬D@‰e0¡ÎYS°Zà¦AŽ‚ ü‰/õÙ&z/@p»¬%ÔNŒÍFX{-4êáIÓÀmBB§Ç)[vzVu¶†JO‹Á.wóv½N¨Ì „²âŽ ™vâLz6De±ÎWr‡P<~JÇE`Ì.¡ÔÁ³¤ä*"“|®ÔÚÛ»þ…XœûÁæ³02Bf$—v÷ŒÌx˜ãí-ìtוP«vcŠ-.x’V¯5¹zýý¿ªN/W¢%ƒÖõN¡¯# +©O¤â[êíó¸ÖÓEÑž¡o€Æàòð¹ ÒA;)¥E2î‡i@!B­kFÓª”¥‚J¥zçèÝwI[wüÂ:FeŽ‰%ª®D…gJ+jÉÛi¸&‘vb”™dsë o=¾³õÜôøÕo#\ö^„M°y0¶Ét!Éþ‚)Ó(Ív.¾­Íº‰Ýõ¡Q:sƒ¶‰à|ê3!A׎ +àpjë*!A¹bf¨å§”Q_Cd`LÀÉ»!Æ BÚ¬RO+uÑêÁ 0>o§Àž÷A8m ADJ6X6ÆèXµÆÐæ›qÞ—àIÅÁ'‚[F­†dw‹¼HCÔ}?± ¢0eû1}‘ïS”T“í1`õŸß Ý÷£!TI‰mBiJÃkÖÂLQü`]ƒäj˜I0 sk[IðUhÉ;Aj5ü«b|'Î×¢^o/'D„s6Ëm§~Èæg¨R‹³¹¸—X"Jòy(*ÚhóÙm‚Yë&…’ZZè=\­áJ2Z˜ dW׊SÂl­§Ì Ää;l ¤¹‰É)¹BMÈ3—ŸÅ¥JJk„{J]¬ÈÅEvpi  +Õ½¤Ö w®gÆ1eSRZ„zJíÐöEäúZŒb +P,P‡i»a:O#£u8‹OçüIi%¼Ì'RzÕ06Ÿ)/ü(¬…‡ÃÒ™€gë,¨íŤ*tÊæïl$6Âl’t¢„·1ò*HÇ(»ŒÕ#ФQ&Žk¼¶1½fá2 ÷.|T÷’ÐP´q×­EÒ«Ï8‡H™g¨îË’Þ»€ +Œ¯…ÒÞ§“Æ{Az#.®{gV!"=NH¹ Z%ŒÛþ¤ê‹AiåÃ$p=¸cÛV¸Æ¤ÍN”íšåì@Àê_ŽñuDéµóìð™Þ~€ˆeB©t„i jdäG ²%`í„„±`v:!ʤõ:k´Ò™‘Ñ8U*I¹¶š”Sz×Û€‡Ð×|åLí\ Õ#øQ4]@¤:ªBÔE!ƒà¡Ôv®÷D(l#b# &U ¥0·• åâf+”1¢Œaòã "ö£W±H˜Í„TD=ìj&¹*€a„ðš1É‚°É‡H Œ!mØÜ•›1ïJ1¸­¡y§ò "pa„ܦ3Ll¤Äô ði6c ^â+P]´ z2“RÞ%ZT^óÖ”[°«¡ôFB ѹ¤ØÄÕ^4]‰¤+)¥Ëè½(e@®@Šƒí»ÉÍ(“Ã¥º”Ý +Ô¤ÊIâF0.†QV{ ®’H#¤½æŒ +UTlzWÉmIöÈ¢˜åK¹ÿ³»Á;> 0 +ØùŽ²[ùxÉ2Éä×ãr¼FBºã§À›ø݇˜¡”e–æ¬Ù†îÃhähÂõÄ€‘›Né讟¼ç'7¢üg~â/70d¡”éG5X‚͸èsà«]0À%újµp©À4àY 20´ÚUò‹$W‚ 0jÃnì&„œwâÞ˜™Ëå»ý˜Ë/aé¡ÓÍê. SÂuJmðöwç”Ö‘¿‘¹éÔü ž1€‚¬TÜ)N_êÓ„T÷'–vi{âÇŒa©ÍK¡rœT[°X˜ÜK{JýJ1%Y·y××fQ6ïÃô8[‡È˜} 'XDÐ{q¶¦ !ðn$ÀdÁãH­ `‹)àX‹Þ);}çjÊÙˆq¡¤ÊémLʾ…p=í iÛãk?þÑ8ç–ri/ì!§÷®æQ±Þœ©5×â +Ö5¥Þ ``ü}¸¹ ›T uQï|N ¸Òšw6q(`på lÃ)'€»éÌL+ŸÈ…]Rm¥õ.ÂçïG(𧛘–’*˜P µºèÎ")=IŒ\] ÷6±ÍˆÀ¨Þ}`µ ´l#„ b#Îä6¼³@ y\¨Ç©<–®@9ýÙýðŸß mDÒP?YÇþb%¹ç]Á%¶™ÔâéâjLüÌO£B=Á–l åzdg*VuF :û™¿³‰A¡†SÂR|K—£ÀP3Þ PADS +ûÐzëqì'42”ÙfÌ2ð£dêí,ÍäãéÂj\yVÙÙH(÷ClÑÒÆP*.ý8¼XÃÕ¡¶c`̓½hz5)áÕ«»¤Þ áfœÍG¡Â`$.£uÄ̘s†kq:Ƙ¨\"­vÊô.¥­¾”›±¹­¸à]RIrù ©¯'…¤+ÎIk„šƒxº2=éí¾ô‘æ&ªygØ‚`R*¨)wãcDÙúž(Í r—ÍŒSR-%Ã<{Q¶HHõíÓ¯·|ˆ0ÎjT\ƒ7q>Ã.n¥¸\,¥QJu“? + Ô:JqpUÈ/"T†V¡Dë+Q$P˜Ê'ù +(m¨œ¸w^HNÒ.¸þ•(ïÃ4˜3x|V뤵Æ7B¸ :T,!\¬.t ˆÆ8WQ &+Äd<5¢Ô£LÖK;íAoPw¸ÅÒÀdzÓIx»PÜÀU ~Ü$AWÖZ\§¯çVóP­ìÆùJˆ4ÁŒƒý ár”1a-€Uych–÷q­¹Ik Ù®Q:ôµÍîóÎŒÀ3â`Bì !—ÃŒ ¶1¥u@º#bhŒ¤7¸ß®ƒHˆ« ~5š^õˆYŒÑg̘XÇ *ƒÈ„FH +E\kÉå…˜Ÿab‹2€rŸù°Õd\Ì)  +!倎¤K ‰ˆ˜` +`Þ½iA„:­÷)©áY\‡Q±7b¢/©Ck€Ï5vk³GŸ¸õʲ!ÝÕ<µ‘063BCÅÚ+an-Ä®ÓkaÖ—îÓ÷Œ/®Dq‹5ÚP± ¹ãÞÝtÒ]_j= „1¤ÚØLJ÷ÃŒ?)ú¢iêw7’ âÀËC­FR·v„K¹¿Xñz?„éEب¸• }ˆâ +<Ú§+¡µÖÀï]@gQ® ØÎXCjãwBÜêÝ[åûèVBé — °{ï‚júál1–Òïl`Þ­ePÞ¤íÝßEå(³“v„ÖÙ䋘ÒbœcâгvO(θüćðŠ$IÉuxxW£PÃë}xWŽcéL”•‡‡Ÿ°%þì~ì'+È}(xÔˆ0Å7h5@aBRr ã²P–Px!Ïo:Nœ«pÙ©Ñ8PÊK¹8Óê;„Ù¡2ƒtv +Ïkµ=³}šé]"j'.V“b%šÎƒãð\›T‹rÅ”›‹¾&ø8\orîˆ0: Ša}¹,ÖŒ1šRv¨”´5d¬¡4A? ÙIsú¬4¸sã„çÅŠ€EˆTMÛcÉàÅh½ÍØÝ€OR†ÞWž”jPó\~Îæfpál" ð Úêbj# :GªËå=»ó e¶ Ô/(î­&U¨Fpyln×Û÷¡yB,ír¹ Ö;›X°1)TI£Ç:Ãèd6P î&LXq&‹‰uÁÝ‚ØãÞ=WY„q8 :¥‹I­”ÒÒÙ(_ûa + õ¡~|¨w4;T®6“0a*IÅ›ë1.%–^gc\%@æ éøì TkˆpAøSúZÌ»½å ´p¡†rZF®ûbœG„ EÕå]ZˆP'Xç‹‹QÜX ÓÀª {)2qv6GKeÙíû’|‘½¡W·¡>ÞP +Ù…£ÞU§Ÿiƒ·òƒÎIça ½©(„ÌVÃéà*uÇOúP-âÝ=›#µ–ZÞ5j»fm—u'1Èa1m#©†˜<¸ZÚs¹iaü@kî‚Òj;éì„€’(ÎìîYqë¹Ñ=O»cL® ¬cÖwh{(Ah 4ê|n,æ'´ÝU*ù†­}6;‚òƒÏÒ¹Á…Ó=Vª;„ÕǵŽVÚaÏX€?}XSÖ +¹Qqx‘v1¡„iÊ™±…¡´›ÎmazøŽÏŽ­ÖªTôæ±Ù¹ œqR®Óöˆ„B5»|~’KI©åó˜Z…—ñ¹¡\^ê#¥ºµJë=ƒ¬Z$]@ä& •·¤ö‘*~ÂŒsÅ“ ÷‚2ºpLÚìáJø:Âd¤NëMÀó¤X†À¡h£«W¶•ÒhBRoÓ™^\ªú™\€ÖäÊŽXÚBÕú:˜ [ÅÍ.nõ…â\©n“™aðVRj9!© 9”Š :3„i¤´fR(JŒ1n”°’´‚› mzÍè‚í%´d>¥4±¤ò!ø\Ê· b-möµü˜¸{aZJ.JeÁÁ-²fW+Ï3=½¾P*ãúöc­¶ Ž>Ê–(k@g&¸§›)M¬ÊVJoFø—Cý¬%5ˆÂRK¤Áe(QÊPŠƒ$Ÿ¥´ +kw)³>:Z,ìñÙ9편ìGªlC¢²ƒóLçXkì¤2µ”ãJi ^?•*;ð5!á•F}¯¹ýÂ>àÊ[Vç$Ó…pNÄò2;|iïBu¥3üà <»Ì´÷|)¥4¼3Àz̲œcRÑŸ‡b€M€² .7€OW*Kï×Cô:ÔgB,¥Ô¦RZÖæוù5åŒj »Á¡û0=Êdp¹¬”æùÙeiëIçðõâúgïeCÆF/HõÒÎȨl7f׹ѕXÞÒ Ó 3-ŒËSf Ôeô3­ƒÜð,Ó>PŠ£(cS°Ù }Ò»E­£VwŒÖõà]Ý®àØ·–Xšñå¥TÝ5Z‡ÅéUeñX.äÒ ÓÙ5Ú{z{/Ó‡uܲ{GÔR~œÎP¥JeÚiדdfë°0¸Ÿ|5>û278Uk;l~Êf‡ZuK¯-³£+³ÿ¸¼x§Ôö0¹Èe é +€rJyt¬·OèüœÊβ“k­º-§µÖ:‘jûByW(ngÛãÓ/åÚŽ¶aá€õŒæ±P\xÙvGÞMËv°1.ä”N(µ<1ês§wX˜>ÌtOÒù n@§lEÀËuR÷(×Ú ¯â\Éô=)Õ>‚•õN÷Aqú$7¹ÊÎáébÝtPÊhÑn_®.åêvaòª K*ÏC”…‰ -½[&®õÚ mvð ¶|±õ襭k¡<³û0çÃÊÖuëøóöÉç…Ù•V[ÚÍåðøÅèômcç)a´Xg ”¶¸ÂDª.µê’wû¥îqJ®¡RU*ÎÅ⟟ÛÝÓæîËòâÚjî73­(¬ZS+ËÜàAaþ¤°uM»£„X1ªÛ¨Vñ¡¡U¬æžV_&ûgæOÌNGv«Uwb\]®©õ#­‹xÕ>üÂêžcjs#)f’RI.ŒÜÁ©Ñ>²ûçíÃÏËËçPÛN{¯³uEƒ,÷~¨RZ|vËh?ÈNŸÕvÞ)ÕÝÒðœ4Û`è(³ ‘]7w?ß}ö»ówÿrçêëÝ'ßX}¥ºUœ]æÍîaiv9:ûzëúG«wLfÚ„QOÛ-£±£7öëÛ/Z{¯ìÞñÞ³_¶^‘¹>iwôÚÂnïçÁ•=y"µåú.|‹Êù ©Â{Xª{ï*ïËûï*{ïÜÁÅèøÛÛW«“ìøÂhŸè­c«sZž^uŽÞg <è"œƒiUh"¹4·:Çå­çõ7ŒÊ¡­U&¨œe25¹4É.ªÛÏ*ËgíÝ×ã“/™LŽ –€·ju7Ó>…ò¨-^6vßåFOÒÎ8@X€Àòvç87¹4Ú‡j}GoîΈ•-Âé hÀm­u˜Ÿ<‚ ·ßI…).åi­’b³ `hsi÷OÞ7^Öw^´¿,Ï>ýœÊxmXÝy>{üýîó_ì¿øÅââ‹Ls©–g¥éã @þy—ËëûƒÓoÚûo*‹ëñÙhü8—e³}@Q«}T[<œ}Ñ?{ßÙyöî7ý£Wä”^㲨:gtÕ8|[Üzší?h¼CôÊgÜæBp»”Ä9íÚâzþô—óëNßüæû¿ûwzmO­/~^œ=£íIÚ+õƒtnŽií0›¥¬v,íÚím·œŸ<.o=àÅÍNmrñ‡ÿúß[ÝS®YµåèøËLûÂè\—oìÁC`ö£ëŸ™^˜²eOYÖ·_7v?ï|hxý›‡ßü­XÞ* /&?ÝzüÝüÑOû'ïfX¾øõìô«Ÿÿ‹ÿ¥²xBgZ¹î~}ùé}>:ÿzvýóÞá««/ßþFÌFÇ/—O¨ì¼Ò:'½³Ë—¿¯}m6¶òÃ=¥:Ni±¼Ð;'îä‘3¾¬ï¾hì¿Ît÷º‡OŠ‹‡Z}Ûlí§s«½çtíÎÑøÁÏʳg¤UŠƒÜàX,åÒp`Bεvßµ÷ßÚí…Û^ª•y¦{Tš?*L®˧ýƒçgo~µóø;@K©0†…뾞è¼iì¼*ÍŸ)•ÝùñóËŸ¢rJJ¢µÿ¶¾ý¼82½ünûá¯ö÷ýÃ7ˆÖ4ÚÇVïÊzAï\Ú×íÃo”ü”3’éÄ•Ægfg??9Ïtsƒ“Öö3µº ,]_6wž–§—zeÊfZÀ†½ã/Ænq|^ž=‹³âø¢¶}í ÏèÜÜì¶÷ŸVfRaPY>¶ZÛ¥ñÉàä-$ßí¶v¯¿úíK“ ÈÃôÁW‹§?vÏ>T·ŸçGçRiôm{ëÙÙ뿪NÏ1É6«“ÎÄòÕüÑ׃‹oæ׿³–i‡ÝDE0™þÃÑå/gßæ/ +Ë—…é#·wÔ˜]v¶¯¼ãó`¦d šˆœÓÜðBª,Õ ·s]žaJSm¹Ókkà1ovpbímRF6*¬Eû`æÖêN ›fñðJoî™­ÝÁþ«o~ûÇéÙ;ÆíuO¿k|YY<›>útŠÚyʳûùîètB-绥éÅö“ïö_ü8:ÿ Tv8w<Üyõå¯þ1×-†Çï'_)} `|ò°8}dw²½c§sçlÖ¢¾]ž= X>üöéw7<þüôñ×'O*‡ðöÚò1Ôüôò›GþðáŸý±6½<¾zÿíïÿ-” h Òê€Yu]Y|Þ9ù¾{òÓÚ?}üų÷?ÚsÚ(«µmµujõ.ó£G[O~ç¯RjÍjíççO þµÊd=¼‚¼U¦—ŸÿêN_ý” +€ŸLfPÝySZ¾0ZÇ ÕµââúÝï¾ûÝíÚŽ”Ÿ”Oò[OKËWã«@!æ°y>%¸FuátOZ;/ú¾©í᎟¤Îôà­Y›$]̷˳«Îî‹ÁÁóþþãÙÙPûJÕ+£æòesûueþXLo.ÛËG×_þÕÁ«I½Öؾ +ÈOöξ.ï¼´zgfc÷ùûß¾ýÅßù&¡kÕ=§j¶÷s“ýÓ÷ÕÅ㽋÷ÿíÿüŽNÞê¥ñþãï.¾ú—óç¿Þ}þ«ïÿ0òk­²ûòóß¼ùöï€Ý@oÀ‡6¶_T·®›;χç_·>WkË'ï~µÿè+6Û«n=®ï½ÌŽ.s£ËöÞ›ý—¿\üàtÏ–Þcƒµ¤JžXZ¦ó & &î :{XìuW”Y×k[p¸õ¥ºÌΧ_€òyÙ=ûˆ’s;zcÉä§>¶kBi»4¹Nˆ…”\,ô­ÆöðäõôâËüìa:?g¬A{öäóÿQŸVgæÚ=zŸœ«•™VSNŸÉŽªóël÷W‹jyh6w2Ð5­»µ[^µåÎé›Ý‹÷RaÔÛ>»úzrþaüà‹ÙƒwÃýëlcùã?û‡ÿéßÿ߇ψñÚê¹Iaü¨´õº8‘鞥Íö—ßÿÍßþñß5ÆGœÓk¼o|Ù>ú0¼øÅø᯴<9X^|]Ûz¦í(“‡XÛ$2:ýâÃþàn·³ÛZg4÷)«I[Üè”pîäü‹áék­±E·½(MÔvžuŽÞ7öß*ÍCÆlÚ; àÀS»­}Éé’RÑ®-»Gošû/í>0Èkà;>×- ÍöžXã¶%W¶H³ãs¸Tº~û«s¸ãHµ.& sXÐ9Έ0;@ñùîngûqœwš‹G»Ï~Ó=ùÖé?žž}×:~¯6wÛËëç?ü›„>þf‡÷K¥{xÝ8ùyvø0ÌØŒÕhl=+58ûjrùÝáÓß<ù±¹|Uš>Ö Ã‡oÝß壀rà§ÌöE¦wQÛy“éðnóòÅwñ)c¶ådõÒîkõ}»{^[¾Ì·–*`*?Š4Îí¦ÔŠYž·{;OX§Cj@@”T„¾ï‚°<{Tœ•û§…æäj|ø¦¾ûJk€Weœ1"UÁѨååÃôÆ"•øüToìõÞ÷ŽÞÁcpø9¸ìêèìù×àŒ*L©¼ý*3x‚çõï—¿«L®ÒVçÍw³|ð&æҺݹr`?+1ÁM9`Ð3¼y¡0 .ίk;¯”ÚN4ÅÕšœäZ‹ !'9G(LùÒ<ë‚GÛV«Ë0©“rÖnLœÞŽÓÛy¶Hkì•&—nçÀ( {³óý§ßç'„âX(NÔÊÂjêõ#gpÕËÅYŸ]µ÷_µ÷_¶ßðÕfÔ¬ÚVitŠ)¹J÷âó¿>ýüošûïôÚ¡Õ`J`ÊXp(éÜfœ“šètÜΞÝ;0:ûîðÏ4¸lg|ö¬&ŸGç½£/§ï›ÛOÌÚŒsQÖ¦ô8ãøQ.ˆ«P¢ƒÃ·­½·“ŸÚã«LFuÞ\<³Ûg´3†5bÁ›XµÞÞÓîÁ˸”G¥B¶}¥N¨¾4cJKpè|v¨Wf}ò­å‹åãK“Ç WF‡¯sƒó¤TrËÓÇo•o/BŒéŽ.+ÛoúgßÍ.~nw°ù9™é¥ÉÓ·¿®ô¹R›=\^þ´·÷º4y:¿Ø=š}‘kì?ûÍðì»|ÿªíY}!?…H« ÊòÝ¡°V3×?q:G££w‹G?“ò³Hî\ç‡ßý§º@ÅçÔò\-ƒî}8<ù°¼úY2íÔúËGß +Å)":˜`Ózó.)¥NËU”uö®¾3Ž +."—¼»ž±ó ¥²çÇôŸlâ)©jÖ×ãi*ÆX”'h17ÒÜþéãïsÓÓ¸ââF…0¨\5‡&` U!«7¨¡ör£«L f4š 6Ëš %ßå3ÕòðÐlí©]wtèá¶÷K½ógßo?ü’uê´U-Φ'ïgçßT·ž™íc¥¶MšMÈg}r‹%¦Õ­—°"“³'¯~wøü×R±×ï_½ýeuv +Þ¥C¥Îº£|ÿ¼8º† $¸ïôSJ!FiR¶dëñ£ãÏÁ^¾ùçóóïÊý£ãGߎO¾‹°ZàBS*Võ@tFqÆŒ¥M.S׫S˜¹Ù{€ÛC '³¹§@»'¸Vøíî¾-‚qÈö¥üæ!uB*ê…I ά‡SJ´ë[OÛ;/ + ¿Í&¥7º;/ǧ_áj•É4ÆÈ<µ0œ&"Ø`sý#1?b“éqÙ‰Û{ÐÞ~99ý ç'Ÿ¥Õj¶¹›ä씘ƒ®w:' *­Ö‰äŽ ¡ÄeZ°d´wzjb6ú‡ï—>¿ú¡¾|ç³A\FÒf<­§¤<0 Ø™òäªÜ;4‹c«:ó! +k÷ìÞQax¢§¬Õe3=ѤXwkçѳ@¥ÜýÃ¥´RÊTncÊaLUœÎ÷¿þ_»§/I–\·G¸ÊöV&Ï*“'Þ‹@Ä<8/£ãCH, UJ-óÙ®R9µÙñ£¯*˳¸l1NÍîî˜í¥TéÁ$qÎ-¶3MËH³9G„,¥Uœ¥â’öàÅÏˇF{›- I»I›½<¬-®´*(Ç*€kšó £6E•‚ŸÔùüÄ>y’ï"¢«Õ–ÕÅ‹ÙùWƒã×µù¹^Ÿ¡Š3Ù¿¼|ÿK¹Ø[Iðlv¦Ô­æ‘^òNÿ&„"HÖÊôZ.õ’Œ¢:­½g BvŸ|?½øÐ;xa·¶ íåó÷?^½ÿÐ(«+—w@àe»§²;Æ…b +Q«0FDå‚Rߪ{Jý°²xÝØyGe:aZ³ªCOb¶“„nó¢;œh÷p¾ˆP$MIYÁéXõm¹8uµ4‡~—e¬òôAië‘=8eÝ.˜¦”XÈTfÝl¦@Å bchÖ÷ŠÀ2‹g¹Î‰÷+0˜Ìúôj„lÇiïµ÷^ÀÜ»—`cY RÔ2´gÿäÃäü›áÑûÊô1çN’b*‡wÚqFÃxþ~mëÉÏ'²½s(æÿ—¤÷ðrÛ:×~ÿ‰ïœ«Nö^@¢ € A€ ÁÞ{–áô>#f4ÒH£^,K–-Ër‰kì8îvœæ'Nì؉{ÇqêÉ9çûî9w­»îÝÔ]‹kÖˆâàÆû¾Ïóö~÷ 7‘¢“OÁ| déPCLÏJ™yÊŸC<2æM há¥]c v·“ «-ž! :n$ÜÜÚÖÕ`¤<¬€œîÈ>ÔŸÇ|…þ/R5’`<ÃÙY”Í ¾ŒÂêÒ9AΆüÉf²»š^ 7¦Âõ^¦;ßÚ89¹µW\Ú"@S¾d‹n6Ö†™Ø˜…ÐÃŒƒ(!åV¸d’sîh>Tl»øpsý´TéBþ¨SHúSÕTwÉ[žT£àõh®ã‹UÆ 0Ì„LDådÀñ;;tfÖÂD !&•»LªÊ$KN1®s ^fSÙìÜ’Ôšµúe¦äº š“9¤0ªí°@ìÒm\ˆÚIó‡éxÉÁI„”ðÄ +¨˜ô¥ªåé•Æê®Ýi²ñ®Š«lìÁQÓáq‹ÖNK¹™@˜œ¤ {&–—=ɪYÙ$Ðe+#ñ™*Œ©PÆÅÁB*ÖÜ€˜Ô¸‘3[ æctÄŠ Z«„.P€µÓS€€pXIqnëb{cI–,°f=À%&mžØa¥mPp³K´Qò˜ÑuwÅTÝáV ;ÇÅ' !7·u©³¶®öllxÄŠë «"R^±No(\Y°Œð9ÒL´3¹tûTyömŒØ€Y”‹2€.±@Kn©ò:Ú\ŠN,q‰Š˜móó¡â²?95ªÅ¾qP}Ï° fâ>¹®µ†´ã6…¥¥DeE.,!ÞܨÞ5¤vZ\,¹Giݧ´Ò8`_Q*3K›U[YO¨Lâ±B£»¸9»¾{ô̵‹·ž¸ñä÷žxåÍ·~öË?ûã_ÿñŸŸõ½ûñéûžÈNÁÅB‰ºÑ Sr45‘ÊOd*½|k±Ú[œZÝÚ8uñòCOœyð‰ûY=߱˜¾ùĹû{éµ·Ÿ{óíÞÚ‰™õ½Xu$mTÐ.Ò‘ +â‹2ÁD²ÚiÎ,O­]Û=sòÚÍ+wžxàÙ—·oµ±“²˜î%[ëÁ|GÌO¬¾úÐw_¹ùô÷Ïܼsñ¡göî{d÷ÞÛ—~æ•·ßä¹WÎ]¿½zæHëŒÖî†é®ú“n¡$¥Û\¸L6³ÍÅÙͳ©Ùµ玞½vòòÍï½ö£ßý?üù_ýùï}þåƒO¾+LV׌ûãÓr~UifÆõ˜ÉÉþ4¦MXÐŒòN:Œ0‘pº±pdoëÂÍÕ½ûö®?rÿãÏ/¿TšÙM·7 >3 B¾uÈDx¤r}zféØÑãg÷Î_~ø±'_}ãG~ôÅg¿ÿã¯?þìãO÷ÿüÏ¿üúµýüÎ3/Ïlž‹Olð°…p… $ÂÑt©ÖY:zúØ©Ë»ï{à‘§^ýáÏ_ý鯞~íÇ<ÿÊ›oÿò½O¾|áÍŸ½ýo¿úÇ¿ÿçK?~ïÖ3o¬œ¾ÌX¬}ùÆÃOïù×Þ|üÅ×ï¼ðúsoüè|üÛO>ûꫯþÏÿõßÿî«Gž}eëÜÍHaÒí/`tšu#•U‹K²Â^Ÿ˜,T'윽÷ûyú¾ï<ïcϽôÃ_üüƒOßýÍ'ùûßÿòÿúÍç_}þ‡?½øæ;s›W€9$ø"'·\|Þ—êøâõBsnrñèÊöÞå›·o>þÝG¿÷ú÷Þxû~öÁgxï“ßÿö‹/ÿü׿ý×ÿþo­?ÿõϽò³pqFauè1P9•VáLœ–ŠÑ|kvýøŹôðcßyñµ_üö³÷?ýÝ›?ÿ埼óñï¾üô|ï£Oÿôç¿þÏÿüÏç¿ÿò™WÞÚ:{_(70AVš1Â,I•§½µÕcgÏßwç¾;O½ôÖOùÛÏ~ú«ßxçW¿ûÓ_ÿþÿõéï¿üäóÏÿý?þãW~å¡' +ݵhu…–Ú~6lTƒât˜`e^.¥ª³ÅÖB©=·¸½wéÖ£ß}é÷?úì³/¿~ýß~ùëO~÷_ÿç¿¿þû?Ÿ}íG÷ÝybïÊ-.RÇý%ŒàëÍ™ÙţǶOŸ¹páòµ«·~è­¾õÇ?þñë¿þõ“Ï¿øà7¼ðêK{/M-­Éù†?Ù²ºBF'‡ºEÂð¤l®´²¾uñÞ[×n=zýöcO~÷…Ÿ¿÷áÏ~õá«?üéO~öî×ýwðu¾÷ê^xí­—l/íf[Ë!#ƪ±RGÎÕC©R{jeny}ymõÒ… ?øÁðãŸüägï|üù_ýíŸàt¼ÿÑç_üî÷ÿøç¿ñÕWoýü—oÝj/mòÉ:%fÈ@Âã ¥ õöÌÊ‘çןZß<~ñêµWÞxë7}üÑçxçÃOßúÙ/>üä£ßùåg_|þÅŸ~üé'/½ñ£S—H7ç¤ä CÞpUÈLÃt §C‚”ÊjK««Þzø p?ïù×ßúå¿ýú¯ÿû?ÿó7Ÿ~üõ×_ýú£^xùåç^~uiç")ÛÝ2(V©äO4‰j­»ÐšZXßÞ}øñ§ž}áåç^yãû¯ÿà—üæÿù¿ÿõßÞÿèÓŸýâgþúëÏ¿üꥷÞ~àÎS¹æŠ •fJe$uvÖŒ@‰HWç…ÖÒÆÖ=õÔK¯>óÚßýðã¯ÿö÷¯ÿþïï~øÑÇŸþõ_þò埾zÿ7~úÙ'ïðë[?±{ñz(['üQSšPFÊùä|0ZîÍo\½ÿ‘×Þú·w?øèíwõÅ—_~ý׿}úû?þæ³ßÿíïïóÎ/ñîû¿zÿÃzüé3×»›— ±0¨AõÏ`óXaZcDœ8WnÍmîž¿úÀç_ûá o¼õâëo¾ûÞ¯ÿùŸÿù»¯þüî¿ýõ¿ùè“Ožyéåg/Í,mùcDmÝÇÇ +åV¶TO¤sõI€Q‹Ó“ +óç/ï]¿uíÜå3'öN&ò)&àu”ÉIZFi@•DmB(+ +±T²X®LÔ&Z‹k ëkÝ™î±Wï;{ãæÕÓ/¾rýÈÞ…ÊÔ,NRBÖ—èRÁ¢ÁN™ ÊŽÑNÌMy|ë›çf׎GÉb6µº2¿{úÄÕ÷>øÈ?ùÉ?øèw~òég_|úÔ Ïo9]›šò†bL(ëèŠz-8GzCkGÏlž¾–iL¥ÊV«=?7}üøѧŸ~ô퟽ýñ§Ÿñ‡ß¿ýó·_ãÕ—_zá©'n?pÿ•Õõ£…Æ4 rCTЀú‡ €k… ×[]4Í'âÑ•Å¥û¯^yõå—_}ë­W_ýÞ{ï½ó—¿üé¹ï÷ìÞñõÕ…R½/Vm¸Gi‚aO<¬.Þââ’ŒNäJÍÙÙ¥½“;·ï<ôô3OþàÍWóч_~õå_ÿö—~ý³'Ÿ|ôôùÝL)oEÜV,Ì°ÒDîÒ *ìÃ*„úE)”ÒÝéÞüÂÆÎÉ“gÏŸ»xùò•«/¾ðÜOÞþé˯¾ò½çŸ{æéï¼òò‹7ﻶyd3š*;Ü­“2ÀŒP6"g»œ”O0œX\Ù¼põ§žùÞG¿sáÒµG}âç¿øÕúã›÷]xüÁÝ~èÄ©ÝÅå¥J½#g[ùÉ-.Ú¼;ÚtÙà`4FÔ +QÑDayyãâ¥Ë/¾úðJ=ùäí;·Ÿî¹wÞýàég¿ñâ½s‹«©BsûÎ蜜ÊH¨ôÑNXœ„Ѭ” ešÅæìÄÌš“á nÆÜ:§[c'Áy„(Qm!ö¨‡æ WÀìdœ¸Áü0|,'D²>)i¶#FÈir ¨Û‹Ð~—˜Ñ þ#ª±’v2d!„1 zP©Wa;ê5ÙI+ÂPbxoŒáŽwÂ0I‘X$™Ë4:Ýå­ÝÉ¥U!·¹h… 1:\ëðjí¬ÂLª¬$é{åÊ„ì„gÄ@PöñB@ FâÑp"/Tª½y¿É‘J­žÍd8ÆgsºÍ(g'D”q‰¶Ó›øæ^m£Y±èæÒ~>ZÈ–R‰T8(JAqna¹ZͧÓÑj³.Å à 163 +*(ôè˜Ö1ª¶ +ÍCJÛ¸ÉmDÀ{&h>—Ê÷äX!Ïž¿xåÈÑÍL*V¯TrùB{¢ÙiVâÉ‚ Â+ŒiáƒCúC#Fð‹ÊÔ_‰!&á¥T8– %ò$+˜mNŠæ¥HÁˆÇS¥ZcºÑœò0L8’àü²óªÍäaÖoÅàä)¡H ”Åcv¸ÝŒ,Ī ©)_:ÓؘXºXÞõø£f«…÷ó‘H‚å;Bj,ˆ"R,f:»´ÜÓ»þ×·GN"Ã:»œeœð ‚,G’!9‰çƇÁáò°þ¤WÌúCE>Z×ö/pþø¬|ûnßzPi%Ôäð8é˜ËŸ‰zóÛ×5ˆà-êMâþ0vJ†Ü=ìÕ!VŒ7 ¾ý#Ú}úÃ*Ûˆ¶">Ôõ†ªŸs1q‡'ÒïIbÆÇLˆÑ%šð°1&iÃÅa¤²¹´NÆŠpvŒÓC¤ÚJBl²¤TôˆY=„ 8(+Æ8=)¤M.^a£ìîè þææ Â¼® ôÔ‚ƒ–T6Ji! NvÜ€h¬˜Ê‚A.ÁÈLF˜8æKYqž Ä\>éÀ˜f`Ädtø:f#B0—cãÓ&=¤EõÆà GÔЈ¬ÑÚ•j³Rc6Û NÌLг0ÔÚ¹11 +*̸ã°|k'ˆ×Âj‹[aaV¯ ª ŸîP4ß^X?%EsãJ=˜H'%Á¸_ÞaÔ8¤vØ]òú×ýc +ä +‚Ú¥4Q:§Oðàx@äûâ-3VÛ™P9TX`ž NÌo´»V²ÖZGÈà!=x++“…üpe°bóD4°O‡òcFˆ¬'<ÁħÄâz¸¼–ž<ÍÄ&Gtˆ¥c™–æ¾}H5Òïhác¥zeêT¦µy’G,# +k,ݵâÁ}£–=®²€+Òb%”›“S14b´#>ƒQ\FgBD[ª[¿É$í‡)͇UƵyHm1¡DÇ1&rzâR¢#ç§q>ƒr‹+d%#6ÕoJ„uHà[ª}#ú~§+„{S¸/ãpG……xuã ÂvXaVÛH§7å–[¤TGýâ'èP¶:s©•mPmÑAF„r‹lrŠ +×À`e6”Õ9< ä·šðˆKl„K[WxPãÐÛÝR¼aB| +31¢‡AÔq‘äÉ@ùî’ +”2«KÎ/1­ÝëpǼrÝáVYõ¿GjÐáš“Iê±°ƒÍ)í¾!fÁJ3þ­;AݸÊj‘R;\A§'jÁZ;£±y¿=dP#:‡ßˆ†ôpütÒI.)Œ¤ êïwÒÓºFú…#\|BÌvÍ®À€Ê>¬´Ã„4®† èŒZ©ÐatøHÏŒHC'xŒêЃ#f z4 vúmîëy“s:'Ða6RƒØ„âT:×ÀˆeP AX0]ZAÜá¡q «aÄ_ÔÀ¢ò«íÄf<‘.jPÑN¤$[ÇÙE»' ÂFeç”vÚ—.wNXPqß Þî‰ÁLŠàÒ^±žÑ ÷ÒjôHkê8DE†ô.‡'n&e'›ö„[Raà+cZ×84”VAƒã“ƒ…鸫?Ý´á‘;¸¿x`ÔnDý.ÔéÖBcf÷Ý. %J®û““™ÎV°0ƒpq\( þ™ðDÚ_^‡‡Õpp@ƒ ibý5þc'µSQ3.‘|ž’j•ÐÆa@8uÇÚ?7±”“âåîÒI8fÓ:kÁW èâ‹’’Êv|PiÐ8ÇL8ð«v:á‘fBB|©æÒR®õ›Ò6õ´’aeõ@rRkóŽ*!. Þľ1ÛÝ´ 2ã¯<ˆ·]|† ZØ7€ÂæÖ8¼tJ±úfeéâÙçÍ·Öãµ#f,8j Á˜pTN28¢Y€cs Ü‚Ù·ù°€J5¹¹Ÿ9Mˆ%•Ýs0æˆ7¥¶RZ»[¡ï÷iu`ÌqhÜ  @ͯ±Ò£:bÔHÒ×^¼àæ3ß8¤ìžN8Ýé»ë»¥ýcvp"Ôrß fÜ€ú7:DÀ‚5`Q¤t‡ŽVÀ@ᢙ‰Û|63ãŠ6&N‡ªÓ«—V.^?*&jËǯ rò™@a6T[ ×7"Ç"í"Ò¶3±`¬vÿÃÏ—çN€”4Â^=â7âê/òéB¬«mŒ ŒöûÊt +¢3VOÆé-0r‡‰µ5v@i„e¿»¢Çà’ìî¸ÝC¹,)£å%‚Ï€ôôÆÚ&BrÝb‡jf&©AE-̃4fêχ×:¨/ÏÅ;“p± &”3¢¾~ƒ wÄ•Êâ¥òÄL¸hóD\ås\·PcF|H§A˜êMÑÑfrzÏìMèQÓoBf—>B sj§f’2=¤E¾9dÚ¯€F ¤`¶@ +5O¸Iˆ 5ÊN|Ç(ìÏÚ(Yó62Œ¯+U46š åÝó·I>õ­Ý Êa€y ÇÀLBThPíP[=8—Yãp‡ÁÁÙé`e™ˆM€S‰ +và„# TÁãzÒ„„î$Á×(aBç”FˆƒðF½™1-2nÀÛû‹Îœ‚“Îyã“Rn˜ÀQP¥ß‹Çôdm2*b…OõÀaP¾-ÆF ö1ªUײàAÄ—¶ÒQ•“CÅ¢Kê‰ÍLSýé³ÙînvêL ¸€q )Ýõ¥;'l#3ΫìaÓ±tmäŽY-X  Œ¹…huÅŸžŒä§ÖN=è²h0km¤z'ÒS'åæ‘`uæóNo¬Ü\zñµŸ/ï= ½V\ ø<)ÖÄìŠ\ÞÄZªÆkFWxXGØÝ)<8á‰Ï ÅcÉî9.»` $ Îs‘š T{È;j¥lî)–¨pöe™X'UYܽôxuþœìSà23tjÖ%wèøŒ/¹œ‰öƒWpÉB„pÞè5¯ÒâuXJu©@Äö˜‘tºe À¸‚Uw¸¯oHå Ö@5àDÍu‡*`”¤æ¶C¬`Á +°—Ã:l܈PžŽ4q±âO͈™9+)ï³VAãfjP +- (E8_Âø"ê/Ùè"”‰p V-îx ¨6O‚ +ÕËÄ»_B|9o¤ ³©~'+4l%f;$£ÎÎ݆܌òJpx*'Ò¹¿1GÆFFÆ .Z,jÜ¿ì?4jÑX˜N¾#ƒ%PÉ­D(Ÿ`¥ÌQ͘ÖÃœ¹¯¤^ ¬äKÍ&Ú'ÙD‡Ëôp¹NÅZîDÇŸ›##-à.jÕåKמ)ÍŸ<¤´éŒ¹?o瑉LÐòĘ™ÔZÈUC\‡'‹ø’¾LO*/‹ÅEæ=Õ9²˜˜#ä›ìÊå•l{«6wzvû&ÌE ÃEêbzÖÕïØuÆê–¹d—/Ì+¾ ʧæÒ½3™é=~ÑéËÝq-.¹…Hi‘ W¾4ìOã`_kžXòt¢Ág[éÖ +ŸëÙ>;±^^¾Ÿ<¸ÔÄ¥†ò•'6N^}:”ë \lØèä)3Ëáò¶‡.Å®ª-Pœq3ð¹3µùókg5Û\:]›Þ5à.J®-G;Û±î‰ÒÂåÖ‘;rm.'&‚y+Œ™ÏÎ$ oN ñÀE+,0{ÀÏ ‚ êú-:£:……'øêQ6¿bfÒfBð„K.±s„˸Ă'ÒWV˜hÓ‚ñ ¶èíÌ8ÀIØßH éP IjCk#íî0PyorÊŸ™ƒù’ÓWpGºñ‰¡Ò Ùƒãv ñ 䀔l°Ê1„ËSÁ2(A b€XÒõ»~ù€ºAL +…=ÚR˜©Ù?6¦q«€mU&Rq˜/‡°iŒË;Ý1•h4«0âÀ¯ ÷¼$•–‚¥¥ÚÔÉS÷>ë5F®ås‹”<‘ïœ(õvõq§oH ÃLTPB)¾¡Nz—GÈÈ¥9»'¾/P":ÖäR=¡¼L'&©Tënž¸þ¼ñb!XZ‰5Ž„ÊËÑæÑHãˆ/3kÄ·˜÷Å›£úŒ.`€]²[jn\ÏLŸî·À5Ña˜2âf2ì +5ƒ•Í‰Õë|²ãK¶Cåy+Ô;­”äM´«çNÜxvýÂãùÙS˜˜ÇËs›WÜÑú€‰®O(Ì ¸Ô’ŠË¥©M·”Ó:ùpõ—œs²9*X\ éw«óÆ+K©æƘ‰Ø7bVÙ½À¸å&ú{$›>>W‹s\¢™Ÿ=YY>“™ÚŠµŽúsó¨˜GÙÈ£Ïýxóü-3Ö£\j>Ò9ž8á–;c&ðŠÅÆòôƽ߶éa‘ÛbãXrþ|fáWZÕ’6TºýÌg6.ŒCóÞd/ÞÙÞ¹“™<£qø9÷F@ ÒÀÃ&RéàÑ@º 3€ :+é¤$'ÐÊ$º‘Övjz¯~ô‰­‡øÙ? +Ú[l¤­´2ý—OœŒ¯d§ÏZ¬ƒXàW _ʈøUVø1,™Ýý¥£Và¥Qñð?jÂ%3p¬`RV\VšVú ÀÂFÌNð£F—ÒÁ“nõ„Q>ËgfbUð; ÂèĶTßôç—2“ ¦õÛá ;ÎSBƈñ'§†x……3Ò$ üðü `’\š‹VŒ¸OzUN¯ƒKGkëÅùsÅåK˜7QloÄ«&û3|~ŽMM¡B%R]OwNp©IàRp¾Ì/ðÉPp6ÕE‚5#ÅAQâbû6`Qè…ò baE(­q™YˆŽá|F®.á’H©ÂDéæÊâ‰ëgn®œƒùT¾¾pêêÁì$pYrõèÂîc»¾Q\€ŒM[è؈‰D™T¸°4ÞŸ7‚˜]HµÃðŸ‰u5î Ò¡´x¬„ Ü‘[éi‚ +ª‚RÏ4_£åš–M.ŸÝ—¶ù² ´¢Õ¥ùÝÛÁÜÔ˜•4º‚©É= £”ÜTö;!Ó&”—ÓÝ|kÈ¢•#|æsp è‰Oy’=±<_œ;uôÞgrÓ'jp +l¢GÉ-È› 5¨!Æû¹\ üéo ê6†Šöü¹uO´GG'ÇL€ãnÖ¡c¯H ä)¹FG*D-ÓÜ0Žû’Õù½êòùDç(«9½Q‹G6ºúÝÉ© A­…äî–§¥òñDëtyþ^K¿ù3(/ o´ DSaóhœ^£ä6ŸD…2@‰|g#Û\sPA;æ‹–f[ëWçOßYÚ»}âÆ÷“ímJ(ÿüýOãbÖDMž8"Ö„üJ¶{º¾pÙæNß3f?jˆ'É$&é(àÊÈîq=Ì6`1Ý Æ<‘&\h¨ê`’I>)Ï—V.8ýy3¯ldZ§Âù¥úÜéFpAeg¼ÁüÙ¿GÇ;— á}œ„}EwÀêÛ‰ H`$V +XÇ@v.X\,L﬜¹Ý^¿‚ˆodbýä ˆ +ë`ž‰´‚¹9P`¥Â +.4‡ôĸɅвáûf^éÔ#¢TZINnoƒø2V— ¦&T6·Âê¡5³ûXgûvqùÞäÔiÈ—ß7 +Ùqyy÷‡/y@i1{´(8 à"åÊ1¹º}Hé88¬S›qGÿz‹}ÌJÛXáWdâ³À‚OTèa3Êèúí&ÌdÄÁå\¡ZcùÂò…'tàqI3&‚@¥BO´é‰w½ÙE6¿j÷¦!JŽçoÔ„ú\€Aü9J,×èÀqJë¾aÝ¡1ÓþQÓYßß=ÐÆ'°…® ÆB¸ø¬'R䧅â\¬uŒMN¢|> R¼Ñ ðV"ø4x®óñ)#*éì4ê [‰ H âǹ4̤A.˜±îÍ"ÞÔ Ú ’`(ž@‚Gn Äã|1”ŸcäªÍpo$OGA¦tÓÓ[¥ùÓ±êr¬0ß[=)Ï@lÔŸì†kGp`›³óReß5»4Én±äògÆL¤ +°¡‰ê›DDé€;Ä›·÷ùBد0|kXc€9.Ú¤¢µ­ÆÆ \c‚…©õËÞô¨*m¸»¸aÒ|¼o¬è‰a NøJ®@iÜâÞ§°îWX•6çsÞXÇBHF˜áã5'ÕØpz¯#DPŠsíãvtN8ØlûâMë!Na¤þ·*Œ.˜–U²?ƒ:›ñÆ»d¸NÇZ¨P‚ålçê9ËN¬¥ÚGÁ3VoF‹µ(Oˆ_rV(®+¬„]žpßZà’Àl,“RCi ìs(Œd¾¶Øèé·‰Ó"Z$à’jbe-ÖÚUý Âá WålkDÂa`ñBL¤îO¶I!øBmì_]Ñ‹ÏáBö&|Én°²!”Ö3½³Ry‰·t¸Ðw¶µ|,¨uý&„ ¶Bqê1±ÀÛûî¾ CýfõìNÚð0LÈb¸<1wÂÎFàe¦wÏ>±xþ©Ìüywj|'¦»3›­¹=·TÑ8Y5ÄÜ%â° ‘ª ç5VœÓž@‹¸G2©²t8&¥…7â‡Ö~«m+më_¡­»øþí3£+€û™Örmn³½v¶{ìÞÞÑ+sÇoTÎHõ +M–fúN¹˜f!ï5QÕîÚÈ0Ìf˜d³ÉÉ[ú[§Å­®ˆbNŸÒDº¼i q ³+> baH¹BU6RK×—×NÞ¤¤ؾ.÷wœ) ©&4z³*+ˆÖ’å…‘Ø?bV˜i*‘bdæϧÁÉ•|{Ca"Æ ý+ÁüR¶·[˜=Õ;zCÌ/ÜÏO¬L®]P˜=F§ß‚À(©L„ öbl dS¼:çâÓ Òô Ýœ>2T ”WRsç;÷ ©îÔâÉ×Þþ­?Þ³øÍ›\ˆV׎^xríüS¤Ü90î´»B$_¹¤án‰É%¸¥íy‚e`ÎÇ °p@§VÏ(€)33bòjl<™p Y¥•­ñ C@Hh싼@¨ƒÍ¡:¬øSÝHuÙŸŸ +æäæ¦7·@F'ˆP)7±ÙÛ¸ŸŽ4Æ­Œ +˜ðÆf±œ<D-ÄÑ1¸FŒ¤Ââ19#äƒ0ó.VOÕî] UæÃÕ%q MØè$.Ï,Ÿi/ßk¥ä!ªûƒ_WæOºÄ\ 7Íçfs“;‰úZ¥}¬5³ÃHYVÊÓ¡Š;X¡å '“SZ¸CãΣý;t ´ÔψÖupÌv`Ä4¢qŽëׇ¼r£ØÙšX<3j%uhÀLE dˆWB¥•py–¬JíõDeQû5vÚª7æ‘l7žŸ· «œð LÂŒ £:¨óf”ǽ).ÚÐC^+„)>ÝóôçÔåñ@ÙÅ¥Š­õÊä1à‚éˆt6Ú‚ø€õµ þ@¢xBC +‹õÛ©°K(¸£M&ÑïcwäTus÷:°ëX &—·#•-.Ò’R“|¢±é5æögâùi`qŒ™•¯Ù•$ƒ“Í¥›õ•¤TÔ`$ŸáBÍýÍ·Æ­CFZã:é¬?9i£#&RÐ8˜}CzðÔˆ?#”ôR-P\õg^ꯌnjI¿'^»Û;9µysýÜ“[WžŸ=þêOá¾”“MšñÈ£a=vhÌ2¬‚´vvÔH:Ù°Ä£f÷˜É­·Ó@•¬„ŸRÙöêê©Ê ;z’'€8–Vâͱ¸ÜŸgoOï74ð&íà± $ÏW5Y?–mïPáÖ˜‰¶a"Êåp¾ìdA¥ÇìÑ>~é‰ÙÍkÀ¶Aî(MWP&nÇ9ÔTÙ<@õž0<„¯èâ +¾Ø$ä‰+ 8é‹ä"p8ÿrHÀÈœÖæRÃ#ZdÔˆkú¥Ò; °ŽP`TLˆ H.ØŸ±±q;CùH=¹¶ÆÈù¹­+ÍåsÉúZqr«¾|®8wZ(,`þ´œïyBÝmÅx•Õ ´c\;\’‹K³á*ðcéÆ#ø¦jÈà`o2TYœ9~ÿÊùïä'·O\¸sâÚ3ÞT×Î$œlÆÁ¤±êOÍÅ[{¹ù«ÞÌ Î%3Í£‘ú:ol1÷»Ýòz4̆»v*þíÓ=æCZ â«xÆ›W÷wDõbÞt¸´è`dÊI™ÎÒÖåë~ùÔ`uéîmÐBoãÞÖúe*\0“o¼SœÜNT—|ѺœkSþ˜Ê„:ˆ0̦ôNnÜL»¨²xuNÁŒIçýÀ°qTíÔ˜I*gå6â+AtŠTºK'ÅTÓé û³ÝêÊÅî± £]2ÒÒ@¾hº·¾wÛâ ­‚hq…­xXip[aög›½c½Õ‹û‡û4 0î›èÁ*8•@Ô¥¹ÉÕ €—Í ˆyS&31;.xÃe˜ê`ÌÝ÷¨* ¡2“z»wL‹€"ftrfØ70¦7Á æj¬ni±ÒTk Êé@a1Ù< +*ÊÇòù¾ƒµsj F·Êä1a!W°†°‰A•¤€ñé팩2 á‚ÚˆŽiá!%„¸Cýö!Õ·ŽóÀø!í°68}4Ÿ‡”®Î‰‰ •õð)âCù,)7¸ôt ¸œéí¥[G»“k¯ýøƒ¹­«€ IÅ9>; (•‰O;|iÌát¤»pÖD„釕µ Qöw·‘`ƒ’OÝ·Q2ÎØd;ÕZ-ôŽ%*³§/Ý:~å6^‡ýÙ`aUÌ-¥&vZë7+óKÓ§™hKJ´]&‚ J›È°¥ßO,GËmRšÐ£A…ƒãÒˆÍ7jóP£Cà,>=Ï%gHvéÈåbwƒ +¸T¿K²³[]¼2·}kãêóÉÎV¦¹²²{KϰѪ¢\ÚÞߊ=°Y`‡@®Qì3á’[l1áIøVWX ÆÜpy³£zü€ÂL¦…HQÖ5$ÂwMx ¤`o Œ•‰ŒRáFsñ|¥w_(LWNÏl_›Ù¾¿´rÁB‡AÉ­ÌŸÁCUˆK;¹ŒI"\ç€+½ -Ê}ûRmp™`QkãÔV·Öî6‚wÏÖfŽwúãZ—Èèø„ŸNMï'6Ñ`‰ +¤7v®õÖÏÑ€ÕB¹<Ÿš©Íœj/ž33$àåb÷¡Ç_ÌtŽÿëAí¨ÕÂœÑ%’“™‰m66i@øé+ÞøÄ>…mØè2¸Âw `"!ÛKVf§–w‹§ D€rþt‹‹×ÈP>ÑX^qÆïdAý›»÷'ªk‡ÔèPX³ÛBÅúÂZ\Š·wìîX¾¾Tím‚W:è8&–\RU.ÎáH¶·…tÂH®ç –†ôä€ +éS¹7ç–[\lRó +3é–Jñ‰¾¦#lö&Ñ@ÚLØP)^™w‹ÙÒìîâ™G’ÝíPižlda¢g–w¸öø‹gt’Lb\^çàô6²?ÃAé<<æÖ¾ø丙ø—Êà +hL‡kÌ´ ¡þ’äd¥ +x7@‚‰îvïÄí¥óO.8èXª¹Ñ;rmóâ“Ù[—«¯œ Vf‹‹g3{|eÝŸží­\Þ<÷xmaP—œŠ56Âåw|ÆâNŽè°ý#ÆC +»ƒ +ÛÉ ÖPˆ‚<LÈÁ"ŸŸóSóÇ®l^~,PèF ¹™ýöD•µdëTiö²\]7¢…èßVáDG'Øä4b’ó¸ÔtÐ)#&(l”ƒ‰;|9 ,& yÀ ¥ÕŸ=1€äPÓËOª.ž.Ä?)dŠ½M`alX,Î7V.¯}|zç–X^dâ5;-àœÜZÜó„²V€K_CqIĉ¦øXÝ„ôOõ7g1b!#& é^¼ºtäÀˆÙáŽÀ¡BeO¨¯/5VÎK•e+ž_8bQÝ6*BË-!5L´qZ¬MoPBÚÐoÏUsE&!—l,e{Ûù©íLçˆTœöF«éæj÷ØÕÎÆ™|oO!7ME&œ\šÖÊ“›t¨ÜŸÊâïûyÔ¨„7`&Ø ~wq ¥ÙhÅÉD|Év}ùÂò¹'']/ÍîLÎoþè§ïíÞûÝo~5kïK«ÑÆf{ãÚúùï4W/eÛGön>çNtµ®/7kONž>ùéÝÇ*«—óGž{ãý[ÏýÔ@„•?n÷)~3“rÇzÁÂR¦¾ròÂSÇ.çfwËKgs³'¤êBiþdcñÌÊé[Çï{¨aº¹¶}õé½_˜?ù`av/›Á…þÜNRšÐ"‚ÂJYˆ°‰AU$Å*mb|VuˆDJ&Ü?nA€7#CwOV°¹czÄà«:s‚Ž”¥L#S›•Kólbá+°72)+ÆÝÝE„„åÁŸhìÞþÆfL'l¸ž„é(P%ÄñÍÈ àʆ˜ÎÉBî ¡l”Ï#eøäDiz§¹|ž‘«dMÇÝw¨bmx½)o¼euI:`­…ü+£2“F'«ÇÅDs½¹r.?µÃgg!oZi¥½bAˆO@”LðY‡;Ž2Yo¸Ž² Ì9úKðqirò‡Fí͆ŒãzÂŽ WçÀóï;¬×Z¨q~Ï°ñ Â>l$·ÚDþ„Ã-9ú«¿{õãž»öê‡ßúËÞú¶ZÝP+B~Ín¶·ïïÞúhéðq\­Sr¾¿0rÁÊ"$E9'Ħ¹üzeí®RÇX»º´C©%ÎîJ…e:Õ0I­ÒðÒÖµ·p='Øe1ÕÂŒfqxµºþ¼TÜ 3E@þ\z…²{îÏj¹eƒÚê…ÜœEŸ0q±níjÙƒª°\jn=Ÿ_¾È¦ût²C?6éB$/Ì@lW²„^&e.ÙÀÕ"( 8À¯ý;©ÆF2Ñ Úb€j¢7ˆ¦žµê^<áAeDÊqÙ•dëzÿÖão]í£+¯¼»}ã¥þÖÑÍû¯íßx­=¾rðÜÛZ»‡Û7œÖÙç$R­ç^ÿ´½}óÙEdʇÇåÊ–Kc§{4<|´võúî€1ï=xããâð(*ä¨dRë°Ö®¬Üؼþ^nùJ˜2/ßy½ÐÛ› óÀVÏEä •†ÅJqé +@tÞj6‡½Ý» P3½}¬i׫t²•îÄõŠby« x’P `.‚¤ Y>Õ©oܺòø»•ÕË Í¥ÌÀá¼Ò8¢À3t÷qµDÊÙD~ 5™¬ãp¡OÏ#ÜäÒKRq,ä‡\ªÇؤ Zæ­¹¦uL-$ÊVóÀhì“VƒÖrf¾Í§^„—ÓýÌÒ%§sœí_Ä”²Îõ6ÚÛ—€j­œ;¼÷Nûì0’‚QA9;Œ‰!ˆL¦ëëçî¤Z›À«JÎ’™+™cuB”éaœ¤n^Rª6åÂf¶w~xôòøâ+½½çÕˆ‘œ»÷ÿð×ÿ~|þ>¬VŒæ½t­ºÿÚÅ—¾½~áÅ|wSqŠ¯¼ýñúù‡ 1é´‡dÓ«fû¸¼zóì­ÌꆑîÜ}ùà >œ‰ó°â‰©7ûî}´÷àc¹¼Yhm½ðöw3í]$yâ"0ȹþ¥ÕK/¾øIc㎘ßz+YÝ|j&òìLdÆÏ„É4*–œêfwû6­.ß|ùýïü—‹°Öâòlf,¶V/mçÎ73ÝKa̼ö»W¾§å—À˜ŸtÇAfy 9J¥ ½sb‘œra»çî\¾õªÿìÙÅ?{fáOžt=1ñ €y6ƒh°_ep@hÆncjøÜ=ÙÌóÀdÅH]JV¨ÀˆOó™Qß­,_Ü +aBu*kr~ŃO–YÍG„i?åŠðg±J&£\~£eW™a.rÞÉ¿|„˺ Ž7«Fe5¿zytéÕÞáƒÒÆ­º7¦‚Ï[µ@YÒN&Àúb2.íê&"C„eäà–¼ˆàAõ™ïE5/"'©ePÙý`U7@ʳj cS>HŽáZ"ݲŠKoÌ`˜51%Ë&kµµ‹££{Ýírºcä{Jn):ÁB‡Õ 8çD1£õ8c,„èS.ÄûÇWÁ¸%Ô0¦ ¥,ÆXmxbÌe©%QÚˆ 8n™éV­»Uho!òämfm|-Û?§ût"O«))‘RŒ(ˆ QþŒ— Ä­•ãB:Bê~˜÷GJHk¹!iubŠ^Ú0jÛbª×_îíÝN÷ö!ÚÈÛ[GwìÒ¢³<ÖK#1Ý¥Œ²(iã*5éë•<íBÝ19Êæä̪^ÜäÌ6&¤x%™¯ kÃ=𭹧Ö÷²+7rÃ+fe(?§!”m_YÙ¿ ¸    šü–QËó>|TS½|÷á{/¼ö¡Ÿš‰Mùùù¸SêF}ߨlI‰ü[_ÿâî£÷ç<øÓS¡ù àßj](ï<âgÙv”ÐhÀ¼£äú€ý*ËGÙö6Ä;Œ˜¬_È6×Ý°@u*Q‹yTH zÁϺB0Bs¢?ñG㘘vúç¹IïA\© ¬Ñîm>¯—i»®W•âV˜-zb|œÒh)å ‘Þ0#L„r!/§úÀ—Â0i^-sr¾ÜØèn\÷âzˆ2”ფ…5¹gÖH–—ç0ÂS‹ñi7Æðb&.$A`oHjÙ .*™N¦³§•6…Ô°<¸¨åG!\«tv²uOT~0€ªAÒqÁÉU¢µ¸¥E_TTS²UŸõ’]&ûb3þx0?!“2Ìç¤ô’êt6 €Ê ñÉ·§óàqJJŒÔÆÌà…•)Ï ¡Ì¹c >l1@‚ aôdŸG\«FÙŒ+BÛ•½<ô!<šŒQÂ¥ «³HKIw§Ä”]è ÒÅ"ð—(SJ<WˆÄëC&_å4~‚xV0qÖ +Å•|Õ9ÆlÀ\ +æ'+"Æ!ÄŒ(À¸²èGOφb€Õ‰Ä3g‚'g" Áh’QÌd=[ƒŸ» âiH*G¹L˜4aFŽÓ|®Ö“íòÓ³Ñɺ°Ì¨<ºÚÚ}¡¾yÓ¢˜ŠP‰0ÊGQ>Œ`“`Ö µ¼’i+é6*8¼’âµ4BiÞ(gð¼ ã"¤6çE¢q!£¢0ÁðG VDMÉwP­$*‹jf}ûâþåûœ‘©j× +½ËZa+FY!ˆñ1ðPAHˆàjæCˆQÂg©D  +D–ÕÜþþ/} 57Ì…-Ëa½88”?:ëFï-($úQÍ I‹Î ‹¸7sfŒTÒõµd}C/Ž•ÜŠè p¹Â4ÅnÈN ÄU„4µÜ²YÞƒÄ6-ODœ^»+š¤˜|â”çé3¹ 1¹¸P‰Pi?’^LÏ/cR€JˆHÕõÅõ i0ÂD•3s_ˆ ïì†N-D„)ø8ˆHDqif1"ée+3ˆ ZCq¢lpK¾øSÍ4æüq ¢¤ ¼›…s6„Ëþæ À(`ß|Íí BÑ.C´ ³ÉªÌº3î¸'Â>uÊ;½…Ťƒ`¾0%ãÝ2 µåsœVðE¨8›Œ‘vŒ4Æ9xf>|zÆ7ï†aLšO-Äü19†%ÔdE±Jœœ‹¢ `ÿô™Å§¦ÏN‡ÎL–ÁÆç|(%™ÀFqqÚ{â´— +¬ÙÀäû¬YŸócî0qz1úÄÉ9oã’áp.‘¯/[ž`U"¸â‰`³Þˆ+D!,¨f—íl/·tî¤'>µžšóŸ™÷CqŠ DÙÌbœ¦¦Š˜šrÅJLV[«éBüG S¶-ÙàăDbʺô?Æ1rNH”#¸¼à»ƒ˜7BAŒñs^"×T³T¨-§kƒ8%Ifä²;*€#ˆòÉÓ3 pš<Ú3gÜsaÞ'1¥ÆY])µ$Øõ ÌŠjº»v6JÀ Š£†ž¤ë›rj)€é‹!2Κ(oM¾Y€ä.† .çÝalz!°à Çâ\0Fû¢40®l¢AÊ ^H…ƒ·:@s0¥¥ävX³ÌaÝAÊÀNÏú½ +$ðõ¼QÄgƃ<5å™wÇ–FçvŽïAdbÞ‹xx0Â2‚F„Ì»øéÙ`1ÎCô9³0Ê¢„b /¸<‘Œ<ˆBÊ¡BvòžÚ†ŽqÉ'žžŸwÅçÝÈÔ™À‰“žSS97H^£-NÎn±3å³Ç·ã¬5çA½A¨Š/Ê¢\œH„!qf1¦&Ûzz‚eˆ4¼QîÌô•§]3"Ëà~ž<1 +!8®±èÇfÜÈÉ™Î("’\ +Ât˜ÆY‡Ñ›ÏÎ…þüäâŸ>;÷Ô”d¯çPFQu{ïâ-É.Ïpw” ÂgP¹c3³8dëàðö+_ÿëEDü7OL=3åöG(ZH +ZZMæAß¿pkeïºfO/DCÔB€\’0¥á¼ÆH‰D²èTÆ”\D+FMRç´(BàÏÉé Âø£h Œ!„¬9 „w{½M©ÉTc¢ØBöG1Fγzש®¨pr! 98ù&ÎÛA`ZãZ¡‚ß †Â#¹DÁnl Ýñ¾( +øWVÉŠFiÖv60ç…FDédæ|0¸3•·m<›Ë›óB@ÏåTÛilþñ/-LœK:;zn ()0­@¦b„çV«B¤†ÝJ·’¹Ž?‚I§ÂD“Lð…áE_ØHåö/݈¡ìÔÿ ð×'\'OûÂàŒÊ=*OX# õù#ÓsžS3O ¢*J>ë ÔüÆ—©EPÂ|§çBÓó±,úBìÉ3¾'žž}âÉY—¢¤"Ágaš TÝÊÉ’ AH‡bˆÀZÓ Ñ'Ÿ]xö”{f.èö¡çDq~125œs#ž V”pÜ!îÄß³§9 “úÉißôBlÑOÆiCÖ‹q\wûé©Èb&Ù1œvÃ(OvÁÃ(§p–Çs³ÖkÇy.Çd+“«¶õT.ÎK¾h4‹ª +WíjÙæ“SÞS³A_¨UJ×<„È”‹™åÍM5S˜#Ó^Ø ¥’¢šHšNÎq²öÚÚòí^,wƧ‚§æý§f=É3,«i +/¡HTQDÇ1iw{çýŽÇl[ʬsûë{G»íåL=£§ªaB2<ÙíיΉªœPxU”$ƼVÑ °gn1.‘.Öò«§ì|aõÊFâœ'„Ÿ˜ üÙ —;&Æèôéù:—âe»ÔôV×9I +2ë"˜"è wJ˜”Œ±F¶¾Ì›E6QÄ¥ôB Äh—`‚gx g„‡ ó8g1¬ÄRD*©«z‚áI–p Æq˜$¡f3»<î,PE"±Á0ESQÞfðˆàz8Æøü¾€ßí÷{EQ¬å“ÃZzg¥zõhpñÜÊK/ßÝÞ &¥ Ä‚Ú‡‰éùè¿}búéÓ—ârEb‚À(MVY)Eý@ˆY§I(“ƒâ<ÍÚ²^òE©Óž'žž~êÙÅÓ3Á©I£Èì"þÔ©ð'Ïœ Í{0·Ÿp{cþd¦ Q„ŽB¤(;Á`~¥’$Ÿš÷BOŸ^œsC0Ì…Cq¿×cAM‚ËY~©í¬Œê¥º“Ê©Zòx»sóòÖæv¯R±ÊŤ‘t xv³óÞP(&2¬ÎêK*ȸ—+UmIgMLƒâhÓK%uÔµÞ>xðÂ…;7¶î>w6_ɞ󞞆b$'ždžT9DãàN91^ʶ*ª£#­¢²³œxgßyçæoþúÝŸþì³wß°¾V6m†X„KM6ÏEMŠI¤³Vµºíl»™K(œ“´H–wùCþ@P…JµØ\j®nnÜ{íí\»ïCà…45àèÍZ=˜ÏŸœ =ýô‰8Ù¦Y*3Ùd$ E&ÃHqRµR<ùJ½×—-k¼»aå²A÷D1JqP1©¤Z£@P”&ip8¶“Ï—Í„–1…Œ†îŽ+‡{+ÝF¶šQ¶ùçoî¾üüá;¯]{tÿüÍ«ƒAÃNZ± !Þ†àÐdŒPåh´àp­²Þ(éö}4Nß=W{ãÎÆGÏãµó¿ÿÅ¿úÉ·ß?ÞßÕëe#1,rGÆ›`ÌÍ8”Õ¥JZÏ\¯j­ösK­üæj÷Æ•ý‹ÇãÛ×w^{p饞»px¡^­[I‹ã¨P(85ãó†¨òì™à¬ }æÄâ3'¦g}~?ôy +OJ£VÐ^dðb>](ä,Ó±­l¦ž:¹ÖãÇB )¸»lBç†æ çÛ7;w/ß|õãwo¿ûhÿýû+¿ûÞƒúÕGÿî“—¾úèÊÎÆÀqgÝ>¯k »ê¥Ñ^&¼ZA/®YWö«çw+à¸vÔ½{±÷è¹Õ×îŽÞ¸ñ»|õßÿúßyïÊsÅtu{=sîJJ)@1ˆƒ 9èðV”‡ç˼¸ýÖó£7î,}ðÒúÏ¿¸ÿO¿þÆÏ¿sçWß¹õO?}óý÷_ÿÕ§_»»uq¿N;1˜ G X)K®d…Õ–q°œ\*`˪‘¥FgÜϬ/¥¯ìµÞ~ùè·¿þw¿øå÷>xÿ¥wöÏî.‰žw»<ÁxNÌúžxætÀµ ³Q[€R2¬3õ· +ò°iƒÔØ_¶?8÷úK—Þ=üú[7ð凯¼|§X¶£åîúñ`ÿ!kVÃ~LÃ&ÔLüÜ’qÿBçîaýpIyéJûg_¾öÓ/ßxç…­Œÿöoüë?|þ‡ß~ü£o^ûÃ/Þøѧ·ŽÖ2 + ùƒ‹®0‚Ï`Ãuûlþ/Þ»üÓï>úì½ë_»7üäÕ¿þæµßÿèrëG]üïÞüÇ<ÿÞ½ÖÝ£ê²µt:-ii9‘§iÆbd|­ÂßØʽ~kõÅ ‡k_|pý×?|çÿøW¿ýù7~õåÃÿñûþ¿ÿçÿ‹^jöæáÏ¿|孇璆²èŽš »C$NË¡ ?ôÄÃ.óKèü @_ÞÈ_Ú*ï­ k©WŸãÅ÷ÿñ­×^¼c[ÉÌÄÁ°œJ÷2ÄNƒ}nÃxÿöÒ_|íÊç_»ü“Oîÿ‡¿óÿþá'¿ýÙ‡`~ÿ—/ýá7ßüøk7wVJIC¤A3RK$T1ðQ=ßçn¬¯¾óøìO>»ÿå×>}óÜ¿qí?þðñÿø»oþËo>øÍ÷îÿí—w~õÅÝWn®’Ã2B\¾Hð„¬åue%˼¼g½uµøîÍúç¯oþÍ·oü÷ß¾û?}óû_¿ò›/nýóOýãþèÃãtø‹O/ïÝ£k{årÞñ<ŠH ÷kÝôZC»¶‘üúÃÑ_tñ³×·>y}÷w?úê/¿|é/Þ¹ø—oþßÿÉÿþo?ýç_½û»/Ÿÿ¯¿}÷»\Ýê'ÈszfÖˆÅb„Â0ý‚Ô0"uÍyÀÝÛKßÝK½|¥þÁË›_¾wüé;?ùìîùûÏÿöûÿÃ7ÿõwŸþèÛ6ýá²Sî‡0%i9[n¥è NÿàNÿç_ÿ›/î~÷íÃï¼uîGŸÜù—ß|ø‹Ïï}ùÎáO?¹ñŸùöo>»õÙƒöÏUÎõåœÉÑ;3ë{ú©™°ÛmÐ^ +:îŠ×7œ‡—ïÜ[ÿÉ·üó/ßù?~ýïðêßÿðµŸ~|ã§_¿ðW_ÝxçfíÒ(ÑL‘¦„¢pŒæu”N$¬r«Ù÷ +½;Ìb—Ü»w—¾øÚñ¾qõû_¿ø‹/nÿý_ÿ‡Ÿ¼ùËÏïþòÇÿð½Ûÿùg¯üö{w>{uå­+¹ÇõRFF(€ÄŸäEµ’7Ë6Ùtð£aâöŽùðÀyãjõ³7vûWùùs?ÿôæÿü_üÏÿôWßyóà;o_»ÿÜ>ŽQaˆNïÅI.Ú°±Õua ½tÜøôµ½/ß¹üïýë¯>üßÿõçÿøÃ×ÿúƒKïÝßÙ•M•Æ1<†ò‚–“õœª:Ǥ%x¹(_)>·W}pXøÞW÷ÿö»/þþG~ôÊÞG÷W¾ûæî¿qí“7ÎÝ=ß:תåªdä%,ðb“Šbe ÉdJÄÛy0pŽ–SW×R_»Ùùþû—~ñùÃ/ß»ú7?x°ûÚå¥GÇÍ[;Åõn¢’èAù"$%–4«I“|ÆTS*•Uð•²|÷ þ飭¼üë/îüÍ÷^úý÷_ÿç_|ð³Ooÿü›—þðÓ×þõçoþú[ÇŸ¿TxT”D +º°bTSÙ¾ Z +UDMƒ—íÈ‘üèRõñµÖ7_Þþ/÷á~óþï~ðò?ýâ­ýÝÇ?ùö½ï¿ó`sÔÏÊZcM˜LJ‘ãL‰Üh§:)l˜†ZìÝükW/toŸ­¼w{øËÏîþä“{Ÿ½¶ÿõƯ.®d—KŠÎ"É#¸ +Hfj&„"$u"дˆÍ¶³¿R>ÛÏ_Ù¨Þ?n¼~møÆ­õ×o®öÌ£nâ\Ï^®‚\DÇ’$ ˜Ÿ–R¤Ô¼(% ™lÎT²»VO-—Î’¯v?}uóWŸ^ùçŸ=þÑ7n|ëáÚ7_>ÚO½°n><[Z+K +Äà808R²Qö¢B jD¸¤aëUé°ËÝÛu^9.}ôÂÊïðèýá/þù—oýæËW¾õèÒ…q­SJèõ"Ja"¡  Ê–Ò¸’Åv²ÒZÝ</m”ž?×üÆ‹g?~|á;k7÷= Oìöyæ\AoŒ3³K…殑ésœÎD%eœÛX¾|¸ÞÎç‡Æ‹z½þÜÍÃå+›UpîîRª™×-Ó¥M<À,˜Ë’Jóv¶¥iÀ2Ed %kˆE‹7ãÕê•íÎÅÍÆÞ°Ø/gz…L+c[ÀPcîµâP6a²Ïú|ñHD¡èv!¿Ù¯œežÛÎ|ðÂê—ïœÿÖËÛßÿðæ÷ß¿ñÝ7Î}þhç[÷7Þ¹Þ½¼jé\ŠIVñÃ2B'!Òt)(Fæ“ézƱ™PÓ‚÷:úÅeûÆzêó×÷ÿåo¾ùŸ~óÑO?»÷ÅÛ×^¹1¾r¶¾ÒI©ºÂi9Åé"la0²œ^+Ö“2›Õ¨’Ígº˜z»“ÑîÂJîÖþàh¥Ü0™‚.Y’ÄS,‚Ю 3í&OÌÀS À3¥ˆ8†E Ûº–K9ÅTªìX)…±*­pEKÔȘ‚ÆLA,—{À¡Gã|°A\Hû gÁtû±pç)—./w—;+S^-'®mV7+ÒÅQñ`)·QÑ6«úJ1±\´Šï›v-†‚°‚‹•š81üó§ç¦g½Ñ@X¦(Gæ+–”á^†—¥Ë#çñ•¯>·þÂa¿_µhŠDH9QTŠëùá ”M{€ÅY†SEIeYQ’ÔJ¹”O[ÊX‚.Ó²Ì ŠgÄ )ÎâS.(W(5óöLðA"ÅÛÒä]^1«Â‘ÁÓ%`Ų9M1Š§).‚a"¥¼jÖ‡M{°0•J”¶Œê6*f9½€1:‚²’’ŠÁ HA0Z­µ^o³ÑX16°^ •DÉÁžž^œ ‘A*Wš´Þ5”Ò§¦]Ó³ž8>f«jJS”©Wrær;s¼^Ýî%VKç×»ãf¾“K´²vÁ6ÁèÓS ‹¡ÉÚöSø‰3¾)/ó`ˆ×óµ­L¾ÇP”Ê£ƒÍHhZ€w:ù‡×^¼}ùüÎxÔ¨YŠHX ÁP!"¬ aÎGyÖYÊõ¯ä:—R¹Ã&†ÃÍó—_€vq!Œ²®gÓéj¾ÐtìK+A?‰I3óЉ3ái7áGm7¤»¢J·()ëóÆ¢!(Fg\ðœdîñ$¦16„ò.w0ñEX‚wbD"Τ³-e†®˜ôg'Ü®a ”2d³Æê-„4a„‘V-Õ#Þ`Bq’NM‘L"㨄àʼyf*ÆÍ8›óò•é?{röÌ|,—ÅRµ “0„r¯‹ +EE4&Qq‰¦T1¡J— ™ñ œÝsºäÌPL KÃc endstream endobj 82 0 obj <>stream +)Óâ<ÄZ¼ÝJÖÏ• ˜3£¸ÀËÉZom:=3š ²X¢ÍgWùÔ +®Va!GÉ…Úòi5gbJ˜›,ʈ²¬E±DœÐ}ð3Ó^‰åj-.ƒ˜À ¢‘l¸=æfÃâ|DŒÒ)ÞjÈ©¶`V™!¦À­&­(“µ¥×£&¦{‚Ó¢”4¥—CtÚ‹ê~,á:&“®˜ÆU„³X½HÊ֨깚îHf9Žq#ŠšÃ(Ù)W`1€„P1zbñl˜ËÍÉgç"OÎç"B„-2VÏ 3~|Æ7éÉ2I`®£QTàµt©ÓZ›,OÆ„BˆH ÛÈOÍLÚ_‡pÖ«võ,ªÔ݈餦)Ù¡–[™vãî0³IJ+3v;@$]êG Jk€‘YóÓ^æKNã@H i³f2g¼ÛÏ°‚ÃÊ)`ùQ¥*×µúNº{N*ŒƒLz1&´UêâB\ZJõâ–UÝSJ;g¢êS‹ØÓ ˆž,ú·OÍZ€)³«5Ι}!½âŽ*ÏL…|a!ÀåDàÄa³lrY+î Ί1æ£ÊI>ï'0ÖÇ•g§€ÁY85Zô“QÂô +#¦g惋ž(cØä}–+*Î…ø…˜ì#fýÙ“ bq#&093Ú¾QZ> + iD+G…iT«!¥úå•‹‹˜äFĸœç³ý°çé i/å{wo½kµvŸõ.Ô¦ÓëråL®@bɇj “eé&ñÇ·cAÒ39Êò™1iv iÉ«^Ì&"U¸Ô’ZÑV+¦äÌ’ÓØ%µ2k4âj™Hööyµq —7ùô¡•*«7‰Dˇ*”1ÙN‹MÐD3,–¢RIز|y°/Ì¥Nûp$Ç劷"|’ËÂ’Ìz¥DÛÝI/q£«1¹E+.Ä ’IO\› Qs!ÂH´V!Í!,TÝaÎáX½Ži5?aûOÔwÁÁZÖZä˜*ekTÇå¢7>i²aÓqµ+Ó1í„‹€9ÇcÏx/,È$¡5P¹‚)`prˆXƵ:ï æ‚·Ct>ÊW‚t‘'«lN¸ÐS‹qΚ¼²œ0nX‚ÔJT­Åä*ëôI£eS!Ê©=SQ#ÈÅòY*=K;b~ûÙ|ÚÇ R™Ð*4"3>4í;@œ£LÆOLyˆ˜ÓËbjÙ‡Yg|äBLC´n. f3‹§æ¡¯œòO»P Þ¨"7¤ù1à ËQÒœsŬÀÒ.3¢Ò+dj%&–ŸÇ.ª7…•‹2½³n22A0¿ù“vîÉîäË6¥‘R.bòT”[ˆqµ•Yº–=gu/Ä&mc5<Ñd3c6»SA®ÆŸyTÚà2C7šp!m/)Õ#¡°‹“dAÊ7@˜ÝezOÔ…ìÐlì9­C»±§•ÖâÚèÜÜj‰ºÕ¿TÛ¹ß9x±±{ßîÏ ¯²FËÊúûwÝD"Ä¥Ah±ÙDã(3¼ž\O4öBìdÍ)eu0­“J >q§O˜­ÖèÊÊÑ#Âh<ãA]¸©”¶“Ý«‰ÆDëèœd “Fļ½qq*ÌÏE\P$ýdJÌŽ”âZ˜³´䊨уiµÉýtÊ «µáy!ÕÏ{&È„…<¤ÔaµC$WP­DÌ ‚Õà’=\­ùQˆmÔÒv¢º›¨lχDÊèÒö2‘èkyˆäbœôq^ÜQ +›°P<åAƒt2®×Ig@$—ãzsQ'¡¦—C\(0xÀˆXâsë¨Ñe2«q³ïÆÊh¥­éK%Hf@²€ßϧ—c ŽN·¹ÔÐÓg|̤s/¢ÙÔ*;q­= f|ä|Xyt_9éyróÚZâÓ#LkÌû™Å0Oª M*>Âö’Éå€t£Í>˜èTëÈiîAˆiT¯ +ù• ïàz…°» B«­—ƹ¥C.Õ™GdÂnG@-`²\rÑ9¿Ø ò:Ñó#–ÃK9!¿ž]¾Ù;÷¸´þ¼ŸÍq²Ã¥Íën*¹pOÅ„“í Fï"•ìVE¯ŒãF²; D £E%{ZuG)Ž!µ æ–ÆW÷Ï?œ´jì3¹õ¨Xù^ìì-íß;fˆDÝéœO-ÝÈ­>—\ºD¦W‚BI)ŒÛ»/$[.H׊ý½ê›·Êã›Ã£Glnæsðw­E0дÖÖƒÚæ‹é•çÕÆQ”͇™$ÐmÜnð3  «œ³Îe6•òY£q6Hi”ÕP«{Bq‡Ê¬eWnT6ŸŸtõɬ斮ÐI‘¨’É%>»"6gu,v“SKí°uA +ˆ+>50[¨Ô*–Å”¦ N¤êûJfy:"™¼s"\‘ÏïÈÕCÒ{‰ŒQm]xу'<äé „ Ú8ì ×[×^}ç“:õ­“~n1{)5~®²÷rní—[[Dt³¶ Ôi6$žXÄB\ÖGg@üØ­ rag!${!”/"Myã@»Nø¹é˜Šš}®°ku¯|e*|j!Àt/fzãvO©Œ ±¼d†Ï®ëµ½…¨8;é¾e„™t„/¨Õý›‹qYX.cfŸN2ýkµÝûq­¤æ Ò¥» ¨Õ 6Õ¡í&i7³Ã‹rqL˜Íx¢)¶œÞU§U̯CJu.®¹ŸBrQk„= œqLmƒ/®†Ç@·¥Ü +Ð1ÚYBõ6ñÅ5Ænö6¯ŽŽ_ä2K ŠsùÔRnùJåìC¾´¥dûÝññK_û"7¢Ü„…}¥~¡}öÕÊøfm|ƒ2;1¡d7÷=¨åAMÊîÓ™UÌõK¶/Ô×nÿÂY=£qD9Ëd²GÙ]H¨juåàîá½÷€<†™¬RØRŠ\vÑÛT 19\kå†WÀÏOxØŘÎg—•Ê¦ÙÜOõÎÏâõ³Vaµ¶vc6ÄpᘵüY"9¤@uSšQ±~ÊÇ™¥ 7ßÍÆ¿ybî´+ðL*ìÆwÇWÞµf1*Þz[Î.»PÝ™°1P©•µI.Í-ßY»üþàèUÞjnÜ.ö‰D…wÚJa5Û;W^,Œ®èÍ]2QM7·ÁuÀ„bf¤6(‚ °‚4òkÉî1¢”£b;«u)³ò|~ãy{x3zº¿rø¢VY °¶[5›çº;÷v¯>Þ¹õ^uý¦š_© ŽÊËÇœÓ3ë»…Ñu³y˜îvwŸ_»òºQ[)÷Úw¸ìÄmL)‡ù ¸P\눅-<ÑbíFm|‰°Z>*9ñù (¶³\?×ÚĤ«õ½öÞ½Þñ«ÖÒ5Øè-Inq©®Ó;˜3´Ó€õ&f Àéõ=*µ˜ó”—ˆñ9ÆîV szXzÍoËå­¼ ¡¥[l²…©y¥¸’_3š»f}ÇnØµÝ e=”K›òd–‡RyC«Ÿcò;€’c!·²I¹Þ¹âêu6»*dWAŠËU½¸¾zøUË°˜ïnß:ºÿõÑÕ7j;÷Òƒ«bf õÖá½Ë>v¡FˆI«ùÕâèFaõf~õjvt=@go¾Ñ]»!-DÌfW®6vÖ6ïåVž+mÜ +kbi“+¬ÅÍÉà€Šˆâ¤› àÈ,DiœpÁ§¼è 7¤r˜Þ¡Íž`÷#“SÀ„ §`¥Ê°T[„Ÿ²G‡ű;®™ˆ?‘Ôáó¨Ö +vóä2!ãc«: +ÓgµR­Ã¥½‡Ã×óË—Äü2•(cX__ˆ AÖfR=»y\X¹“ì]²;Çzm‡1[ÉÆ6ˆ!7J´µö9 +¤Vwê­³/ +…Qˆsrƒ‹vãl}õÒöå—;gïÉ…kÔ{«—ëãK¸V±«;WßظòÕþ¹—Ûû/¦9«ppéÁÎÅW”å%ì¸Þ >ˆDóˆËo"jÃ.î½£W(µ³|aK¬ì¥—¯¯]§sö¡–_[?~¹¾};nÕåú•ßB¬e6¿£×/d×q«GjÅ£Ûo5ÖnNV;2™˜Ú€ôj¶a©œjä»G£³×ë×bZ›lK½ä)ɦÒÖ·îLd“sŒêšÝ9ÐëÛéþyµ²H ÀÕQºã#m̨'šûvï²Ý¿–¿ì]áÒ+ Ü|¼q °_ÀÕdƒÝÚnºw1QÝ‘²@°q)ßÙºÙÛº©Ú/1©%%?J567/¼²|ö®'®sv·±~£½ÿ@¬îN¼;Òìî^zÙ)¯øai²âµ˜lí)¹!³ŠZÃù¸}&$щz0Ëãë+W¿V;÷ŠÞ½`vŽŒÖ!f­L&Ñj¬\Æ•ª?.DHÃ7a¾ +€ ÓZ~Ô~vñÅuRoH礇vÁ&¡÷q½/äv€9Eí(Ÿ Ñ/šˆKÅIyHôQvL*²À¬•7ÄìMÔ¸F*€RJqÕlìPV88`í,•Y~vB+7¸œ\§ÓèT˜L.ÊK³ŽI¹âèrcçÿÞþË݃Wóã[x²dìòêHHc³N 3€æt­ê†ÝØÆZŒµÕt[Ï5SU½²²M4¨DÁ®¬ŠéÞ™ ‰©UpŠŸ1}ŒÁd–äÒ–ZÞÑËJq uΨîÝøÚò¥7¤Ê¶ZÙ¶€ª8F¯.m\ + +éáõdÿ†Ö82—n2¹EsQÑÊ.m]|Ñin=¹Eùâħw/È•m¹°–(ŒJíÝG_ýäö+ßXÄ“^* «m¾°SÛy¸|íƒâÖC`W·ï¾öÁ÷Ò­ÝyÔŒÛ+°µŠX£ìÊsóoYc?n(ùe)·üÇî¾9«Q¾@è-¨Óуѹçòj{|EÊ 1½Am•žG4PYyfº¸d—GvתÕåË­ÛZy˨TJÕ·ôÂ2,èü¦Þ>otŽÔÚ¨¡>Ô𣠣º <æ´Ÿ\ˆ +ˆR#3ëjý¢Z;@”J”Mçûݽ[ šœðQ °«u£y>QÚÔ cÎl͇Ø¥¥q„ÎÎEE§¼ì\D ÓY«z.Ó¹F&ÚÉê¦ ’µ\QÙg‚¢6I³¯–v#L3i5AÞyPy0òX¢M:ÃPòRN”s(£º—ñDÕh쪕M9¿xÌހ͖ U•ò—_YDµ¨ìRÕë@÷8g¨6€U‰\ï0»t¬W7ÙÌ2j5B&,ôÊ6¨ò!6å2¤Ù¢Í–Y'ëR~y–âBZÉ÷ìNÈ)Ön/“ìEµ:¬”FRön¶`Ž4ŠZ}#7¸ÐغWZ»=‹^ˆçJytqâ[ñILmfû‡ùáanp “JŒÝZ}ʇƒ,P‹kƒ½û€p¤ÜÔ/ðÃÓ~RL!!=$|¸.dzNuµØÞ\?wÇ,.{‰$—^²[œ³l° Q¥!gFõñÕÞö-?™ôS±¼o.Ý’k‡lz…ËŽcr öÁÎtc Ø/™ŠI§uÜ=ûReõZ¶s`W×€‹xùÍO«ÃK~¶¨ÔöŒî¤­z²A+oEèt{xôÁ_üúƒb»•L.+åýd÷’Q?+f‚ÕZÛ{~óÒcX©ØTHªÄõ—áæRLª‡™œž]ª/Br1È•LažüÙ +SËNk§µu3DY˜\dM9 žâFsõ*,”æÂæ).Ñì¬ÝDøâ³óØh­0¸nÖ€õ 1E5µôàñ·¶_xz:òÌê"r1±‘(î˜Å-P71!Ãe–K£Ä Îé rµú!©×[‰ê9µtV-oà ü8˜wÒnc‰fD,†…"¢7n׶î2™Á©‰He $°VÕk[T Ñ©0›ŠËy«¹‡ëU Sbn¤ÕÏ:ý+¥{+^Ï._±)L+É…åùˆÀ¬0Ø©æK\Eõm(é&iÔ-Äæc1žLœ5ÀWH©€_¾²‡2뀊I»GgF ÂQ)Ÿ¬ítöïûÈ$ÄgAТRd½^K…ßdë=‹6Ò\ˆp˜VVÒÝbgGpÚ§¼ôI/3SÃ\^òK0­sVݪo4Ö¯VׯëµI…’ËLri!&)ˆp¥¸^ßêì="Ón4uÆÏkÙR¹ñÄéuÆG-Â$Ô¸Ì:_Üš‡$?¦—†"‚zaR2 ¬®]=›i_´êÇÀúÈŒRÞÁ¦ƒÏû É)ŒÆG/—ÏÇØ$/`{ó`¦6ütÚ‡ *”úGNeh#m·„ÂF²}Tݸ£×Ϲ0g.((Ényx²ʸÙf Cµ°–_º¨åWÄÙ_®vwÿØÉY +1ðY•õ[­ç£\¨Ÿ;¦Ât¢2ó!É‹èóQ9Ȥi«ÃÛM3׃'«É8Úèõ#/’˜÷SÓ‹qTÂX;®5`¥æ‹1¾ VØ$˜C|²¿Ò0;¼ì›^vÁŠV&íÜI“OþÏí¥û׊W®âfkÊŠT%Ìe‚\KvBBÖ ê¬\ÒËëha)¤/»t^*­óù_XѪktfdÓÀþs¹Ñb $Q7ûTr€¨­ ›w6ÈÐl{W¯¬ûh'ê>™ŽryP‘ÚÙIÇx.=¬¬Ýð`¸±ÂÒq²u`ç ´â:ˆgfj™NÔ&íøH‡´ºdj ˜D?eE8;ÂX²ÓS¹1À€Í<é&T­XØ€ùJ%ÚýÝÖê \°R„µZT®€jE›\­-DyZ+j…e>Õ–3à¶û>¦¸®<™nìó™Átˆöcj„rc"VéäJH(ÏEDÐçÁ=à”Ÿ™"p…µ{ÕÑíòè•Z{ÆMÏFdD©ÏYWL^ŒJaÒtÁ›m­¸A‘T‹Fqæ“ARóF˜+PVWɯrée æ>Tµ*ãdsÌ&a÷£;%BDpmõ‚¸EH…üà€+8°P„ËOú}EÅ¥µKÕÎÆÛ¤VÐ §µ]_vÚûs¸EP Q®ˆ ÅgfâÓ>Qªjy+Û¿À;}¢M{é•ÒJœ³ôÔ™ðÉyÈ Éà†ÁÁ¥Gvû2_:Ç€)Èûq•Òq)áÒRëA¾ä¦² ü0µæ½´¦WÏ‚bª–wÑDÓǤ1k6ÌÅÛOè º¥ú—²Ã«|fL´˜]Fõ*¦2­ÝÜÒùmù(ÓÏX ¾/½¼yí­ÒÆ:7öÄU`Bµú^€I)öâ) ]Rv4:¸_^>’rƒÊÌJ.D8$®5ÁïO¶ÏçÆw´`B*ÓX—ÒHȇÙª¸Zgíeð°@¸N¹1X,bz“Sãô=”3 ‰AÒJÕwx«ýÌlàéßLÜOeƒBÉÇdÀ´B¤©§z€ÐÎÜìÑé—ßP秇Å`{š›zqɃ>\[ˆ'"\IÎosé1˜Ö©rM%@ÈŸô 15È–ÐD߬dÚ¬ÚX”LfÛgAlφ؅¨´« J’ö0¦Ô£Ri!HUû‡NuËêž8ˆ"{!ªLX\)+™ÁŒ?µýŸþÏÑÉ#g<¸=›lô£åGz~Õƒh¥ÑU@›zcÏŒ IgN錃]N6@Ì{ â'”üúD0ÍeQÁi­[…Â$p½ä!DmÊùu\mƘÜédÆKšÅÕLçìi/5ä§<Ô³s(]);3#<±¤™Éj¯B³æü,¡W&5E)ùp;̤€vTå  #hg@¥V{Ó:±äA5 A!*éŽÊ“+u&³&UÎÑ©e&Ï„‰ h«ŠËù¸X¤Œ p©°ž]º˜[¾†è­ù(°½…Dy=ÕÙïîÜ£V6 µšîŸ+oÜà‹k§‚4(ôZq—4- « +¢œî—–/û0ÌŸYN´.&;çn!Z3Äæý„sipÅ*… ƒ2ºJq«<º‘ë]d¬®7¦ü"U`p(e œÀƒsÙu }@dj>"ù°ˆíŘ$fÇéÁ•ÔàbfùºZ?òs%`m¤t·0¸(dW †­¢µèäœ>Ù]Ž4¬|çÒË1¡p&,ɵ¨P” [JùÔ™)¦2¬µ„*MTi°ÎøôS>êéf&mÓ`¹àà ÜIB­Eù<ð§gB¼–£ãDie‘»k6äÂ:cÁϸ§¦#'ã„\<1‹±ŽVZË ¯nßù¸±{ŸOOÎÇQ&ß9+¦û 2T.DE €ÒP@2drÊKLòˆÅù¨*øSs0Zð¯“$¥TŒ ÙÁ•<(|`pÎx‰??åÿÓg<³^¢R„\XˆPÓ~,L%¢ DMBkz3€:§q˜² Ú˜vC§g¡3‹̃J»¢ü¤W†Ñ²¬ºã‰¸ZÙ RQë„ÑU‹ÛZuŸNæ!å™…¸7žÓ)HÈFÅ<ã,‰ù1–hDØäbq‘0.“zøJgòŽæ…üêM›ŸòBâ´,Ÿ(ÐFOT€ƒÈ.¯\þjjt²Ú&à ˆ'¦¢z#Ó»¸yùíñÅw²+wçB‚’D§CÙÝ—±‡=4±d5ÎKÙ å¸# gÔY«ƒ)¥ÉÎ#TzÊÇÍÇÔè8Ý‹bnWK©ÎY©0òP¶ ¥ìa¢q¬”I2z¾»û<¨ïA!Ó›¨3Œé-4Ñ*­\rš»1.%;íT÷Tm&5ÆÁ,+5Êh:µ­òà<Ä¥!§—¶|ª…1“„˜<(m§=$!V«ÍG€ê€ðÁE…Ìj\¬ÑF0ÀBLSr«¤^Ÿ r~ÌŠ +e&=V«{Vã\LÈ-0NapÓë**³±x"7¤€A¸Ô©ù)çµL5krnòÓ!vÚ‹ÑrN0 “Es—\ÂÕ"”¸í‰›§ÜÄ)Ê͸T™òÐA2dr4Ùw,H¥&ß]aÑ®éù­ÿkÒëŸ(ž—ö@º+,Mû™‹°UUW.…ÉÔ“g ðY?¨Yù(é,†¸S‹èS…àia&ý̤?'â…E3Q±) €èÀø}¾o&¡j ؇|ˆÏmº0žë3%Ê•\´eb¬jî÷_Ë,ßFöôdq"#ˆ³a)CÛm>¿ +œjôCl"JŠaL€¸$aÔI³ÐF*7ÂÒËÀH±ÉN”1ý¨:©é¥ÕÞÖíöÎ}6¿ãFLˆvâb·iÂ’sklr0Œ\:K˜wÜtGxV¯Äùä”ò ¦Ö½ˆãò|nr9ÂfP1ã46b|Æ×ãJH€»h_` æRóv}‹4› °L&Ù•kÍÝû“7’ýK¨Z'SÛµõXGµ®ÝºÐÝy~åð¥ê楼áCÍi÷·nÚÕõEHœ‹saÄ6cv0¾‘ö¬/.Ù­\÷dk”+5pÁ:"Õ&_´H.ô"Zª¶›îVM´Ãl~&ăyŒ €%΂2Ë%³q„th’ì¦ VA„L-"qÆB9 aM³´FÛ}àžü¨—Ê‹QùéyÄiÞ¸1í£C¸+uX¨„'=¥5P¶„3ãç@-XD´9®q\ŒH%»,çVÝqëOžõÐò éé ´7]¨ è©ïv×ΊÈ!"åD‡;Ónâ´k²,Èðྸq&¦~e:rÚƒº" °¤ÕOTÎ^]: ôËŒg#<&*QÃÕ +jöâöp€×»˜Üžì7„¬Yf¬P­ˆÞŠ'ODÑìçûÀ}xQ9Â1±\qùšVÚœ‹ÒS~8Hé¤Õ¡íN˜¶øJ!Õ:›Y¹Š9K!¡àŬ›«® 3}¡° n ¸!à%çB Ìg™ä0&”&{ +y1¿#÷±Ä Æf¦<ðÓ>o\Á´Ö\HZŒüÿì½×,išÞw/¨/„ånOŸsª*+½ ï½ÈÈHï}yoŽ·Ý§ÝôôÎìÎÎìrw‰]a R¤‚!éBºÒÿ ?Izâ I‘„èB€ +Äù:»NUVšÏ¼ïóþžˆ¨üºz|Ž¯íîqkvO. ŒÙ7»ÇÀ­}dn;‡ßŽÎv§/1·U)¬òöý×39ûZG‘ W„=gÜ…Ú:½Óâ¥Ìǧ×Ï~³¹ýn~ñÑ^Î,ÑšÞLބó"c“j».%b°ÕÚÇ%.ÊÔŒ,iÇã‹ÅÅ×”–”Ó±êZý‹£çqüêoœÁM‰ Õpñìãß?ýSÚ)ñ!êfkùªµ~LïÒ«·9»é½f¼Éi×õ:нî¥âŒ oØìm/ÞüY8¿«Ã=Ê›´3g¼ukó¾.ÆźÎfÇß žË\´S’35±g„VŽ´9kÐZ>žèÕÛÇR°®+Ý¢ø\éÉy]êña¸~Û9û΃‡rgŒÚ­²a‘tæápý¼Hh_eéÝ¢¢úkÅ_Òz—1ºE¶hÙÐ{àTÕ“õèäýêö‡ÕÝ맿J¶/A‰J´v‡{ܦ?ž¾ûûÍ‹¿ßüÄNý¡–,8èMîâí·Öôm¸ún~ùg››ßÄóguµ)ù#gp"E3ÑŸ€%xoŒ¯®>üÝÓŸþ5jJ‰óH9²Ú+TR³î¯_‹ÉñðüW‹û¿Ð:ç¼=Ü\¼ï®îHkØ0 mÈ{pÐ'óËŸ'W¦Ä'˜sZ¿8£§ðh5­K›#Öõß¿ývÀ™Ùc9>ÀzÑö¹ µíô*%ÎŒ5W¯×·¿ºúöïåä½$³JƒÑî:ÃëöáWÿÙù‡¿×º§eÞIÎÎÞÏÎÞ v¿ƒ¥O¯]ù!9þQŽ@5û„žîŸ2¼(RNŽ°#Bzäðuïäg­uÄYý"mÑjì´×„°fÂ;П¾Õ>³:z뀷G»{ÊX#üJj½U%¥ ÎúÎîn÷«ªo{ë×Ãã­ÍΞ²Z[2;^gåw¼[ñrrðfpðjpüµ5¸æ£ƒ½º]¡-9½¤jT¤,hš¬‚ÑM8}*8³<é>.ˆf¼šŸ¾U‚q¶a>)ëe  Ÿ¶Îÿ|r÷›h|Iðî`v±ºþnñˬ#½¢Ôå›'ÖôMkù¾!4w‹‚ß9<þç{%åË}ã“æú5kÅ‚7R¢…?:‹Æ§þàÀîÌE·O¥¥5lÏŸöÞùã %šãÉ»fìT®SƒùžKÍ…3¸ˆ/É3¤¿Ñ† ™PéáÁ‰;¾‰×ï`¨½0ŒvÿÌlu·/ÍáeQéùHÉò©78ëmÞLo~£õ/•Î),+j›Ä<$‡BsSšvïÊ?×ÚçR°×Õ^ŸŒDoº¨°e@Õ‡áø™Ó¿qWÈÜšÜQ£5ëÌJR[j«ÝKúŽ²'e)Ê’*BȈ—^)œ«½+½þ'ïKRs·¦UÅ&–›sgb¸´Wjç}~ñ}ïðƒ;ºœ!ì˜ÚÚ—UÕ~ž µŒ®Qo™mi¯„Ðzç"˜½.‰í†ÚE2JÞÄn­*Œ™~Zµ…™ŸY½s"$E™kr®¶‹¬+EþäÙèâOÁ „ÖÉÔ´:ë_>ýÕxó”ÓÛ ±IjÁˆV· +¡¨Fxrþêþåÿâ&‹ +U„Éhöïy7-‚ Þ©qVszeµ·5!¢Ô^…‹€I€(-ZÉΨÆX„(Ñ¡Þ»4z×|pT íiÖXÛ‰ç`òGE¹ÄFÍEzEVûàƒ3~žç’¯r2˜ÍlDÃë*&³»`ú\k‘Zj»MZ8µ;‡íåS=š§~bwI9õ)¢3ôûgÍÙ}gý"_:½#§¿aìnº}ëkÑHc÷OÔx®DS³³µû§îäNp—’¿´ûÍÕËÃ×uüþïâí{ÒèâXDÖ¦¦ÌžÒÞÒ”~¢×æ…?ºhÍïA 0òB|Àk–jó·xšEaZGƧ‹úÀ¢ˆ™×dÌ™?¾WãM¦,” ÝjojR¢·NyoS»U¹'ø+«E;K˜5¼S»WFÿ¦j 5ŒÇ ­,F¼áŒ®du£É Ç_¼4†·L¸*IˆKð¦ èg£ÙóîÑwÍ»³×ÝÙ¼AH¸ñ2–X»À8´=S['ÉêÍá³ß9£g¤>*P.©$u).Ðø‰Ñ½Pî³ |BI²u½&Fq!˜ÁÒÎDˆ¶`xoô´µ|#5ö(¼¬‡ {£ëæâEIL€Fv¸­žiÂÀ®s>x ÆEÒ*Q%†qg=]߯N^”i³@Zé=îo«R'Gº_e)ZmµSF½ËÕ ÅŸ‹ÞIª„+D×^Iz’¥gh¦»é *B«!u)iðÊgH­—m8Fs»¸ø–÷Æ5©‰÷ dÇ\mák–ðú‹Û?ÿûÿ¹3»{RT2õ@ × “†ÐzxŒ²+¹D5:†¸RüIú9½ÉÊœØ# Asz™¬^yã»ô‹–€ygHi-Bm¢FHÁ DD}ÙË]÷?ŒÏ?ößÚƒÓôCØ¢y]ŽÛ„œ¨Ñ o⎮R€‘Nj‡÷f£Ë?mþÐÜ~,ÓݤpŠ–£Š¸hÛ믣Å{gpç ïôÎYú±U…U¯{ØxÍÞhíK¼2T4œ¿N㪹ˆÇ×€Ö]*+ÊÝJÍ“æüe<{AJ-ÕîŸ?ÿQO¶@&µ{-uÒë£Ù5l&etò´åtO’OÇ$lB°¬¦>È 1^·_\ÑIárJ£,•ùD +¶Íés»w–‰-03ãLÄ<0¯ˆaž ¥æaÿøÛöæµäMßþüO¯Þÿc)>æ¼µÔ:jXã‚×ÕÒ³*B ›þô©ÖN?Ä’S»(µ(a™ªiƇ¬ÞG ÖP âñ]<ºÑ¢5B=KŸ¶¶÷«B¾¦è€ó7è!LITz{m}ñõ4S·ó„‹Öb`[sp¬†ë_äøljѤÚ)Rþ~ÕÄWBØÉ©ß?çÍA¦¦i§Èø 2­¹á¬ICêÒjg°¼Ù^} €/б޹$模÷){Z3»”“¥ìšØ4“ãdùÜéŸ +î°¡B]ÝïÊÞÅ«ò}kóµiñ®Êbü¤¢ì¡öB° ´8 »k£&Grs£'¸UµN–rÊ|ˆaà¤DOp!G[«}Œt‡—p(j¼W¯‚Ù½pÞ2ˆ,ƒPÀåi‡"³µµ»'6Îì+^úiœÝÕsP4’¢Ìø .Q(%¸ªxcĨ‰ø­Ö\õaV{'?†ËwËæìÌBz¸»¹€¯JMÖ´VoÂÅk9Þ‰׵îe4´žÀh×ÅyTW†u Ü>/ñ­,eÛË[9Z¢€Vø–=¸ ïüéËhŽZy’g¨*]UneYWKέÞU´~5»I†€üwr#ËÑé DÂÔÔvUî@ܲ¤§‹`tVùä+ÓÍ¡šGp¨ y6È&«÷dož«© ;ØC.ØÊ­³`þ\Š µlCGrá‰%Ú3;—jr%‡¼»¶»WZ¸ÈÖ”BÃ"åÎNI‚H*“í‡xóáúûþá¯þ×ÞöãNI#„˜[Ùº‰rœ'ÒËìåp3<úf|öÑ>*2Áöú'·IjÃß**ҥܜ¿þÝŸýÓÿ­WeÏ(k*EGñòÙ¹@áø´[Çwg¬=5ÐÔ-r0ÒcFû‹…Ô®È=TgøÂ>«H]pu]ÀENÿ +åUm®Àù qÂHѲsðÆìãõç uHë}ÉIÎòÅ›½½ñ¦WéÕ¿ó7R½}$¹cÍé[ÑX¦Œ“ž»é¼m-ž3Æ€R»µ5¢E]r³UºÆ[„Ütד‹•xSW’ãkþÌŠæ Þ¯óèNœÁekû!X¾bÝq)Ýd¹.%ôDŽ×¬¿ç8“[H¥?¹vÕµ¶Ù?m¼k._IÍc$ܨٹ‚w#¤ Â9v÷¬{øÒ:£¥Ñ?ωÉW’Zv²­q^‰ÔáÇñ¾PþþÑ7ÑNäÖ<‡Ëf힆Òæm´vz2îäí_^|ówIuGÇOãôR{èŒo±Ð¢¿‘½•,ëR„d1“­Ó;Å•G#¼•à/ ­÷8Çì×´LÃÌ1A‘o’€v­K`†ÃƒdýFt¦U¾éï¥.uL*í +ëïèÝ"‡°%B×9þxúñæÏ~7ºø¥?y^æÚò£¥ µ[R(¹úNïÇ'ßùƒk)Ü Ê#ãNžÿ6ßÍsªÏÞ,žÿîýïÿÍOûo^ÿøw5µÃˆùKÑ_SÊ™ýÁ¥Ý»0º§b´ªˆ­×*£˜Z3¹¹…¤ Nªj›õgä'§Oé!â4­±®åpAè] ¯àŒãÑÕüì#‚°ªtåpY–š@#Ñ[+Ñ©Ÿ‡xˆ¡9’Ü)ƒ¶yS1:žý08ÿKŒtc¡4 -=[Aé=R +ÌÂݽ@ýÝ­«9B•½1o(³/†[XÈæâmïø'Œ¨DÙÙŠ"¤us”î4ÎÅÖVíž[ƒ½sZ×’"kÝ#wr;¹úeÿâG99a=(Û¿‚ ïQÈh{lo‡¿]ür‘©)EÚå c¦Û‚»g¡õnxo « µRà‹„Þü2m±é¹Åmg +–s'´Ý3’u÷ðÛhù6L7¾Þ§)µmwŽÖqCç˜0Çø9ÒBAß©ª JïƒC”èÀè\¨ñ1Ö%OÙ¹F*;{Uµ’n¦Ü©‚Ò?ms¦ø[opWSºfïÌ^¡²Ãœî4Ì}2bÝ­ÑÚ6'ÍÉy®i hbYs”—¥>X½³wNžB‹P¯ÁrÁìe8¾uÚª=¬0.iÍÛ ê’ØʱnU¹ítO“õÛÖÁ×æôV`1èôÚ€†Ü0çZïZmŸc!P—´5FŽTÄøÓ'ŽNTÔVwŠÕ¬KЇ‹Ž$‚ËýP™DdJ)ÙNN<ÿøßMžýž÷ÖxRïñÎXF„St»—^ëûµ1¼â`a@¿RC õœ™àÍwcõž:ã7áü ç- +,BF‚?¶×ÌÞ5aÚWzrÃbÄë}ʆñ½ïÏø›šÖ‡Eµ >›·þðœÑ[œ3´{§‡Ïþüâý?Ñ{'U½SQc£shtÏ«J‡„«hù>Þ~kŸ6´þ^M.16c 2é¼Æi«´¯„è°g·6eÆ1Ìþúöûîé7rûŠ¶ÐÏÒÚz¼¦ô6¡Â΄nÿ|rùÓôúçéÕÏŒ;è‚‹JLNûu½Dã1}«w̘ý2ëîWÕa!°9kø¤(d*…Ù>ëŸ|SÓ{{„™…1”[”WÒKz¼<åî”uRí i×I¹+:s5N¯|HÏ!òI]AýšË×énͼEgó>Ù~ã oH5ßf­ÀXŠ;m°Á“¼PÛõ«‹¿ëŸ¼æ"”¤ôÔ9 +b0ºEiÛýëþé‹›¿ ì9çmH¥·ª(ãåhWp&Ã÷ë»ßn_þmïüç’ØÎ’ð.¡öQÝ(gʆsp( æ/`:€dHŸ,å#,9gîžÕ°”E.DõÉ3nåzõéo= TÀTÉŸûƒ‹Öü9 + +¡á»»›n©:&5@à*˜ß É‘Ø>ŽÖoׯÿ.Þ~¬?H«@”;ÉI4y!7þÆ‚ÅuºgÀ6p~™Ã¬†èU¼|a.ÐÁ_sîÊé](Ѫa I{¦·ÏG?Î~iöo8o w,S»{Ï.§ïÍáeïäÛùݯç÷¿ÕºW\dJ{ù²üŸÒÎZ8#iÒ)±&m`õ/G¿:ùðöô9D ­VöDµx©ÄÓhycžJÑï¥GH(c§Œ¥!6%wh÷lÎð¯ÇÇztXf£L]¯ MFVÔ¾%ÃìžiÍcöNYþjŸ2Âô ©õ }`ô.:Û·£“oÍöQ™5 9ˆ'­éý£¼ñ‡½-rÜ­à.‹ÐÞ,iÊáôßݧÛ.'¤>­ð§s —]â’ÜÛÊ^¢üU¥^žôöÊ +§vôp*3Æ›+ý›ñÍo_ýMgóÁJNJNïdqóKÔMfR€*Ù½qÆOQ JRŒHìIwq?ؼ¾Çܹ6^¹"vP¼öH£¬ÄŒ¿rg¯’ƒîü)€ñ(Àø¦/(AÛœ€ï³ŒWâÒ西°x¬ÞD«7Fr/ñǧ/ÞU®¡==<('°jkM=hš7~j€ë'éuîLINaßÜá5ã-á¶ôÞ­Ù=WÃ…ÍŒÖ2\Ü÷Ï>œ½û›ãwÝ<ø@»ëº6T"pιàMÄðÐêߥ;{NîØpUÑÛ6ktýÁy”^¯{Ç5R|LžÚýKÔSµµš]}“'‘º¸•¥ŽÜ<9¥¥vru…1’d~ÍîÝñSÖYÔå~UDpŽ½Vù:Ý +Çã[kp-D[RgIhš ø±ÂMCŠÓí~ŒaŒÈ?üLîalËbˆ´½÷:'ô¤Ž‰òF—Ñæ=y¥ÆGuDfI)s ÐhJ»¡ô¬îµÕ¹’ü­ßOÏAFŠ´ÇCP´®"&´·Fqa´¾ õxx‡ =ŒŒºÖ?ý>]+áFrœ=lÍ®WWI)†¢VÕiOÅÖqEä¹fM4´®9¬ÕR +ºÃsÆ\Ö”Þ"CY¬?çà íNëVŸZß.^þ·ÉÙOb´EBAÒ cMžN¶Æ¯øð¨¦*éµ+cÆê§[Ì·ŽQO1`9­u€|„W* l¾®[ëô¯A€U9™]|;:{côÖ\8ç|èØ[kxÏÙ}%˜–Å Ä»Vzy@T`‚UùV…‹83=}Àc£5[?ý•3¹òþ +J]­J‰=8W“ãºÖCO/ý^ûó—zû´¡µa³cu¶nm$ ÀžÒ>[Üýe¸|Þòά&F÷„fu½K˜}~wüêw›§Öœ\êÁD´Àûáù÷Bó UW‡°9F÷r|þCsqWáƒÑÚÁ‰l['UmˆdÉQ–ÌÂÑ9atÕäLŠÏÍÞíêöwÑ_òö´Hû +0ÔäÌÓ?3'rt&ÇVïAò¨ WmnAïy¶ÉúëÎÉ7ÍãºÇ?Kv*ÚNYEù€ù’¢uÃSàáÖ‰7z†°—ýÄs¯¦¡Ð ªÂúÕcçžT¬Ô­tkBú¡Œ9ýu‘ó„W“!-Ú¤»áMJ{·ªBf¡·VûD‰Ö¬5¬‹­ÎüãβbX1z¥ôϺ'|t,G§Ñô`Oæ"!Z—…Î>V(LzáM¸|Á §Ü:P“ÓáIúQäáö}Øø¸¡÷‰ô œ;EõÞSsøJï^ãuh£+ûÐÒe4{yðò¯[ïµÞyCíæY A;°äQYŒ+ñúãàôgwzC¦ áO8ðUs]7z9ƪ©]{”þQ•àO—¤½šŽd!ú(=ÕhªÆPˆ6îô©ì.cNªb»*t8gʹ<]Œš«÷l°ÍÐ^I=¾ æ¯á½á¹Ý…ž´dO®ÕäPëœÅv†‚ójAj€åU9*ð^8½^ßÿxöî÷ÍÕó¢€"êRâvN;«éyLkŒïãÅ«ôõáM–²¾ÌÔ«|¨4·Èšº9ÒÏšÛúé\r¸ªËÉNE©KM  ®&µöëænEƒã†a1;'éå‚j¯»~õé’»À·Q&v)Kƒò†×nï o­Äۺѯ›óœØÏq!8éŸ,Ÿ‘j›T’p~ðü·×ÿi{óË”iبŸ1²{—<©­ã§?ÿÛéÓ¿’’S°z®áhÍ£Þærö¿ùE嫬ÀÚ‹åÛؼú+wp‰~¢â`”æªÌ7ËB¨ D²Ÿ^üú çoµîY\mŽjú°¦Œ „'ÈÚœ£K5žW§„çÛœ±°;7Ó‹_ª½Ó‚E“«ã—¿§Ý®ØpQ1†(ÊÀ6£w)E«tWh£/6§¿_þ.\¼a¬1ˆÕ{vr¯ìÁiIéïsÊZºƒ—íÍöài–òÊBœþQäáwÑê, R\àÙÕäÖ^]ËÔ5Z׭íG­s^£ÝºA¨]ÜöêfMé)³ÖÁ7¯þ~zÿ;sü´¬`É[™(S³ éÅêÊšz“Wßý‹ñåoªú@jmÚ›·ñúƒÕ¿¦¬aŽs|¤5‚á5©¥âI[S1X·–¯ãÕ;Ò^¥ÇaÌO:.gLZCÂÃ2ðÞBòæ©b|RXé_¤þ€‹Œ¯–Ú‡¬;–â­3~Ö>ú®¹zS“»ûu;GØU¾Y¢ºb˜­ªû5ƒ1†nïÒî_ÁýåH±Ñ_æ³uKk/_ü•7i´¯äð0“îÑhsK*þW– ´þ³hýÝøâ·Fï +£~R’š£Ëó·¿—£yžñ¿,Ê962û· e?Ý×;=#Œ®PÓÁ˜]¡œµŒÏ~µ}ñ×”1~´Ï—™á$Æû¢Z’º>”bÌÞKÉ_”ŤsøÍÕ·ÿbzýçÞìUžëþÿ…´ƒÿ¿;ðÿUû<‡Ö>䡵Ïyhíó@Zû<‡Ö>䡵Ïyhíó@Zû<‡Ö>䡵Ïyhíó@Zû<‡Ö>䡵Ïyhíó@Zû<‡Ö>䡵Ïyhíó@Zû<‡Ö>䡵Ïyhíó@Zû<‡Ö>䡵Ïyhíó@Zû<‡Ö>䡵Ïyhíó@Zû<‡Ö>䡵Ïyhíó@Zû<‡Ö>䡵Ïyhíó@Zû<‡Ö>䡵Ïyhíó@Zû<‡Ö>䡵Ïyhíó@Zû<‡Ö>䡵Ïyhíàÿ/¤u2ÿ…´ÿºPðïN¼Ã—‡_Ì¢/ +v“ßâçÁá‹—§Ï¿è|QØ’öó—ÞåñËËû»Ãçï2 +˃ÓÛLùÌàA™îóËóË;Ü9<>¼9­dêx¨Šÿ¿ 2t†úôßìÝ QY‚EF`hšç¤Œ(ÊÁ±=‹fEZâhîÿáAÿÙÛÝü¿éÓÍ_L¿¸û¢ÿ…œ)W2³éãÿè;Ì›”ΛóüÕ‹‹ÞáKLÉÝîtN1'ÿÉÝåñÝÝáíéIæÓ½Üa¡‚Y²ñÿìMúÍé¯þÓY£21¾¹Â]o24•ig–k*s’>~ö^âÓó˜9V Dá?'ÿñÏܧ“ÿðøÿüçO¿û¿Þÿ<û½ Ó^| +àòæTù÷Ÿ÷ïbSÞ„_ÞéëËãÓAèdf/–¸³ñ)^þð?}škžÿÃJð™u†¡hŒIHŸ~ñÿê iþý“þý¿R†EiñSw¹LúDê‹BáSÓèV2’þbÖü¯X{\“[ ­-xS1˜‹î”µ&¤1åƒ)>â½c ÿ°©¹Ý9Uã)ZF¿ª$U9Ý&„±Gœ=&•Dñ'zkíΌީÜ:ã#.ãš›†=(‰M§w¨%kÚêÉ™;¸ ¦/„è€6gbë„q µWšŒ3ÂmÜñ éÎ2”“îHmÐù2RZßHŽÂéS½w&4×¥EYÂìðÁ¨(œ?ñ¦÷Áòmóð{}tO¹³ªÞ­(‰?¾k|ð—/½é³æê½Ö»bÂUYI„`ɺӆÖ-ðA² 9¢õDôF¼7ÉÓ6Þ‹±¦e¹]‘;5­ÇzstŒs§r¸âÜmÏ[ó7þø9å,Kr;Ç.¬)‰Ý=Õ[1¬ðnôÖ‘à.ªBRbBik᪽xw¤´®ì¯Š´¿WÕªB«.wr§®ôÄð@ˆ9Ãz«,”ø¸¡ô(}HëCÉ_ã¥r—µfU©g\ÌXCí×ävMJ´hkÄG”1l(ý<×|RÕvªZ–´ ¤M«mÞ˜C¡Yb\RŽ³uõq‰ÏRVYˆðôªÔa­9cŒ µ_bC¬ï/êJ;[ת|T ýlÃ"”ï®Xk!z¥y¤6·“÷Ñô²Â»¤>Tãc{x©µË|X¦ð]ÆÂtPμ$¶K\$z ·a·i¥ãõÏÅpQÓ:%1"õ¾Üú”D½šÔ.p~ú©ß|)`vOŒä3’9>¾ÿÙ;.ŠQ†²xkÒ\¾o9{Äí"å|Úù鄱g„9®.<´z×Ñü…rl%ñê…9<ã®±¾rëÄݬ®r”ÑÝ™3¼³ÆÏøð°¡¡T˜"JïÕä8CèyÚAŒAÜ{NèSÞÝÐæ”wÒO‡/ñ>cô\×;¤=vÇOÇW1»ýíàâÛ†Ýå½±Ù;ÑgêàœkºÓWÓ“ÕëùÙ·ñòY%Ý4¨gõ. ]jçœöÖ\tʤ/;RÂMº;,éäh/Gû´•nRfƒ²œ'Ú"’óB3'%5sFÚÆ=0GÏ)oš¥m̳޽* q–òžÔÌßÄÊV…°.· SøÚPÚ5¾YhXÙš‘kX…ºÐ²âC%Xej:‚ +÷ï–•LUÛ«©e!¦í™Ö¾”šçrtjwï¬öUUl Î,Ý-OÚˆs7Œ³Ö;WÑü ãL•…LC‡ ¢âpÎ )@·«P<±ý(Ï?ÊsEÊ"¥„³W”µ¨I½ºØÜ­n¡ª?Í’f†ôól‹1',”t·„Þgô.©vv+r™ñhm ûk<€³æ²·r¡Çßa‰ÿQ¦®´6ÁäÖ€îYóº>"Íqõ¡ü•OóÀ8ÂÖÒ]Óv|°¹úâ€jH[#)Ý‘å„´¦YÖ/pAºµRräôÏÒ}Aš+Æ›±ÁŠ²g¼·"´~… ÂÑUÿäk{xîÏÁ).Õö±Ñ¿ÀW•×š$³gFïxŸ¶òŒGi#­uÊ: ÚB2ŽŠ|T–â*ÊŸøfEêKÁ‘Þ¾”#Tíi 9gŠ‚%GK¥u 5ÓíÜÙKctCy3orﯕäÀê ɺ¹~·¾û}ÿôGÆÅf‘0.(êN]Ï1žÙ¾H6ßFó·éÎgÍmº¬ +£Æߧœbºw¿®tsŒ‘¢êÕŒa/ig+EçÞôH žîó}¯u/ól¸OºYÒçì“~ü}«¡¶)}!Ó9‰2µÂeÆ/Ö~Ý ”.kNJl´ß°s¤WbBÈÈ£‚#íšÒ•ÂmQlØf‘m–8ÔDL†HwÏZ lJR ¿¥¬©CÕ!éiàIA‘qØU)A<ÔÅ«)µ·SV +”—oXO +bC`‘°¾ªØ•œyØ?w;Gé,é˜(O{e¾IÛ %¹õÆϬÞyELu/×0öëÚN‘Û-˼9ê/_êí3ÒYÒqiUÑ>‹þ +…Rë\á~ÂœRæXZ D-ÆKñ‰Õ¿õ—r¸ ´Ž“O~ ôaUŠëJ‡÷çéöoà…ä2;çÑü)a vI«®âÅ×jt(C–{gÀdr÷g¿ÿNßÿ¾n÷êF‡on•6‚íi¼xÝÞ¼£tk +¤XMêÐÖBŽ/Œþs£ÿLïܨísäŽâNÌîYIî¢X—¥.eNŒö¹Ö¹“³hòôìÅï†Gï‹RĹswtŸl¿N¿M?šƒ‹ppõãŸþK{v¾Ïù(µ”½¤œ…Ú<2[Çr°J)… °Ü|ºíè "uq« +—.…l5ÇÊ\žÂp: °–9ËÓaUìêØj¨ñúq]Ë^M)ÉÙ¿7º7ró˜4'ˆ@–&Oû5%GèEÎ笩ä.%wA)ý +—¹•¥@ZU¡‰Ú—%œ½ºU Ã ´êR»,4÷Ic·¦|¹OîÕ´<é•Y”Ñ6Â5݇[’µwZ–qÐ=­ž\ˆÁ–µç˜vd4h“_bèÌnEÉÖ­lÝ®r «ŽË4È'åÎ^UþªÀ>))([éÖGxÁjº%Ø“Ú%ÚG%"âVŽO*‚·f 0vw¯"=γ5ÏêïSÖaí4Ñ]NŽ¾Ë‘ÐÌ>˜ÚÀ ¬¹–\5ïâù;À•âôÚ“ËhvÏ+ÖS€vol·ÀœÉö}YHôæJ U9Á+ ÿð1l?†ógéšÛýs¬²Q²göູ|19ûöë_ÿ÷ó»{ Å[µ{¡v/aäÖ‘Ñ¿â‚ ø BTÔ«w ú’Â# „Ÿî1v¹¹øivõsIîUä>ë.Õæž+H„ä$ß 6oÍÎI]ïñÞœ÷Ò=JýéËÖök½wîOnßþôÏ¢õ³]ÒqȦäÄEE$CjJßç(‡”“tOšø:ÏCm¬9ç®6Xˆiæ£H‡ÀÁÛ@6[‹7éÖõ qBh÷qº/ *µ·AÝæ¼.÷÷ÆNEÌ6´"mW…ˆ³Æ:`À[ÉîR ërUA•íý†S`B$%G89Ò©K ä±È…û }·(Ô„Vžðv+F¦näð7„MžõÓí‡ÍqEJÐgÞ]Âk ÌðtÖ‹î¢ÈFÊ-@…ý¯ò  +GØEÒE•|R A{U¨^9ýŠ>Tø&⇷f(OV÷‚кÀ{Æž²ævNéý"å"VÑIFJ²Û0ƒ¬3ý´M{;K©%„Hšc¬…Ÿ·ÖßöN~²zW’;ÕýÉêì›áÉ”?!X‰áJo£ËÎú•Þ=~˜­=N7º ÇO½Ñ oôÒìÝ[Ãg¬¿„ )ά³yYCÐ8ç,:Ûãó_Înÿtrû+¹w³9:ýÞ>+kƒ†5a½¥7y-ßÁ¬©Éº¤µÒm,¥6¤wçÞø>š¿žœý ¯hSÚÝP w*+)B^3Ö] zbbåh짭±?y:¹üÙ™>µF×­Í+Â昀¶&?8‘,ë–Å´ Ûtol>ÎÔMÙž„£kÚgµ‰±P!)8hð}Ì$îdBB?Xg%~3>‡ [;5#C8%±…·À5±W—F9*Ý$ ä“©iÀxÀÖš·¦fó¨5}¡„Ge¡]Dí;Œ9eŒ ¨•[€üý†¢YÿD¿x‹2PÚ HGe&ªp(‹°Æ0‰£Rú˜®là˜vD‚‘œH~J¡U1æì©‘œbJ7GXEÚkHÝ\ÃAT@Çu¹† %lH¨ÙnUCñ-2nÙ´ÔÁ‘êâ¨cÔ¾l²´»S‘wŠÂ^I© +1ʱmPv3¤…Ik(ñn™ûãÝ•n…5A.ˆ.ôs«ÆGjëˆvÆ(ñŒÖ3Ãõðà=¼@Õ3:ç\¸¦œhÙl/EÝn¥Ç +&Ïhc„äU€F B‡0ÆR¸ñ×Zç(Ï{Œ=‚…Ñ9‘ã­œQþ’p¦Þäéìú×îôöŠ‹X¥wÏíÑS½«¶/a·ñøŠœ º!5¥­&§Öð¹Ò¹¡Ã#6<oç¹ÐrsË8c˜e°.„”Ô'vïž±FeÎWã-g(wFy x^8V»{Õœ½¬(IYjÖµN]ë↵Û#Ü}ÊC…RýU0¸¬# Ë–¯Ïys˜îé—H—¬ÎnI(1g/õÎ_JÞ†3fù4‹U`ÌNUy\¿*reaV“PæЖ,iÁÏ"` ˜s%\ÃŒ”ø¤ÌÇ0’¿ÐI­«{󆕧35!GªÐÕ¡‚º¤ÜÓÃu•ó¿Ü'ökjž„â´Ç¼»0 à­S#9«J-ÔP0sº!®1FÅG¨Ã–hoQÚ-‹‹<@n¿nÕÅ.!÷S$ “­eíVÕ}XŒ†q+ÂÀŠ1ÜqovùôÏwjêïS™ªÊj#´/%L;CX>Ü)³¼[Ü/q5˜ßbº³¦ÝÐÚ°ZƆӇœñ‘œèÉaUISFKNh–cLBoñÎ@‹ZkëOŸéÝ36ŠKÍ€çÆ€óVþøY0¹WšÛdi‹4û¤5(+-888pQkûƒ„mŸ6̾7ºu'OÓ(R;Ró(\~Ý>ùIÞ¦›ãÊéѤHIάñ+}ôJEäx˪Ò)‹-¨¥=¼Îsl;ÝvIƒ…œdI›Ö‡Fû ê”ihróÀ_¼6‡wÈvÉBüGzr¤uÏ‹r²Ó0½P?dæŠwf´9ÂZ€x1ð'pñy +‹»]š¬ÖC>bű:ˆ`JK,R{HéãºÔ‡¦íTÔ¼¥VUlþaã½ a#x`çT»U=K˜Ÿ*Ý° ¯¤tR‡åÎP‹‹´ ãŸ#̆Ԭð~¶®¨îÐlmQ©ót£üݪ Ðb´a‰q±_£äD°ÆX{®¹À œ2ëKÞÚìÞ”„æ㊘£Á™BsÒO•ÎNIÎÔŒíÿI¶¾Sáó” ÃKký"iï•$$EžtéTm†Nç »W×—Ä/óLªŸb“±†J´ÚOõµ$oT¤µShìé +ëËÞÒ‚nÈQ6ÜÖ*Ý–‡º†)ïYÃ`ô!£õk–£•%uR‰¬Ö䙩™E*lˆÿnËvÉŸ§_­Ñäì!˜=.+û„¹…ZB°no>xìÖñù»¼GëÚ¦Ô. K÷’_"´ŒöQ~úö/åöá>å–ø³çîð~~óûöÑw”“R“3¹«êݲœü„hkö¯[Ûo¼ÅËæàâùÇâN¯¾,òE:ñÂÇ!ö%ïo PýÃU} HÀ̭݃ö™Õ=G%ŒÑâê6|™«cŒ¤5‚„Šáb~ùËéͯåö±Ó:XßüPÜ_äˆÇ–5‡è ê‹×½DÁBš°&Ì`ò¨@ïU¥i4>ùbD;e"¢ËÐÖ§Ãb}Ø%x·tKo­2o äáÁé=Œ!'¨ÑÊI YúíþækŸ”EÔ>¤¥ŽN`*à8Š7:z4Ã7»Xʺž«xåáæ(œvpÿëkçª+µr m§$¡z¦õ”kú(šÞÛÝ£L‰cDOЛuÎ}Rs¤ËÙc£uÛ.}Ú8µÆ”Â7‚óy{¤FKHú~Ý."B£‹‰EÝäŒa8¸ÕóÞ"O*­†ÜDΖÅ&eà|­äÁS}ÎDÅ\óΞ…µÇ”Ñ'õÎ`qw÷Ýß›ýól¾Úƒ‘1šGvÿ*^¿š©æ¤'·ÖÞåÝq<»G°5Œt7G!Ú,N>üü·ÿÓøôýnMm°nz}ŸrÿÄê?5:WþòmÃ[7¤¾Ÿ  gÁZï J;9ƒË’ìT$¨ïuÚÑÎrF´5˜®žÿæoþmU‰Jm£sÆäiw·f|:R:ré6º¨5„Òª‹!©vöÁ·i½‹ýÎé‹_ý³ªÖ~RU µ cK*=Rí£ü•Ø0œÝ¼ûëÉÙÇ/sÌã<­Iú†´­›p‚„>D|F\Ž*rM8µýª„H ÄÄlzÝS1˜f(:ù¸,çQA„Xu¦Š35£ ÀèݨŠê¹pÊÒ%Ê"„–MVÑä`Œ4Ï5ô<¡I'ß0ááQÑÌhfÅ+hQ:Ò²¸Sà³u#ªˆqñs”ý¨ÄŠÖÄŽ¡ÕÿèIy§@—i‡5—¼³€Jã1™Š\¡œ¬kIØ«È„ ì|Šm‡ÐÇHÉG%q¯Žúë2zŸ‚W{ÄL- à,ê2aRZB©m-X¶¦ÏÔîíLj§‘Nl€‘zA%K½}$…0kkÒ¸ƒKvǹΙˆÁ‚±Qì¦^ÿ”ûl˜¥('ì<ª-ŠfŽ±Y{$s̳Ö=kX#Ö›Uäx¡nŽìþeûà}tðµ1¾#½yQ€Ü%©gœ,ã°Þ Îº+)>'ì¥;|ænWEέ+­ª`ÞJl\æáþÀ<ë<©ð_©Ý +O£Ÿ£ûhñ<šœ'ó«› +/›)󙊘©JX¥¹6ûgb¸©HIMŠ$ÄAÙ- +0€XäuYìTåžà¸ÃW”=ÍÔõã TaJºT¤.‹·Ð,zCéHk·ˆº¬¬_¡=Fí6‡—k7ð²R³˜Úº±]–ÚŒ5F6Ñj÷Q–ÈVTRhÕøt×ç= cMÍ5 ±~IZ“œ§ØFe¯¢âLâÒ#艄’‚Ç&SUöª©q®@HåŽi¿Ð°-ó¤ˆldÊJúîB †ñIIÊ6ÌýôÈ*Fä7¤ž`/Á*..n¾ŽÐêVÔz¸ã8+ŠZ“œ(áª&]ÛZ¼‚„V×õa]ŸRÎ:˜¼mþà/ßPæw&ŽŠ!†‘Ÿ [S¨ÚYÂbT˜UY %ª ¥yÌ^9£§¤=Ù#mÖ_rþzˆ¼ÖG¯ÝÕwÆø9~USz”5¥]ŒºŸçmè.;›oÞ5eÎ*0Ñ´ƒ)EßvKbzˆ[‰Á‘’Ÿa°Ÿ<¸K™}>œVŸNµkNjcˆa•O“‘T6ݲàÁJÑ‘Ú¹¤íy==S ·5à½ôPFÆÛK©y˜3Öœ _POË”‘«ƒ^»ˆ.)ObfXg–ž¢¥íLº¦Ú~UÝ++YÂ)KÒœsŒªÊˆuÖ²¿©‰!êæ +(Û »ÍØóšÜᬩվ(õ« +%¶H.(5Ì +íKî†ÐF„Ò¯ +q&  AcÚœ þÚé\XñQ¾aÔ˜¨Ð°þd¯ñGKò 4 +ÕùQžC±ÛýtÊ’”»û » +¯AX +"¼IžòóTXf£pp®†Kd#%PTà˜p¿ª!BJ *ò¼5xþ¸ <)ÙšþUÿ“,$+³aö°¹†™sÐÇ]‰…p™yÂ-ÓgMŠŒ‡:‹B#,¹k§{Ijt@vgñì–0:éw<±yn_ÆËZ÷ +KLÇ·ºÄ@uÑéñ¡žœ‹Þ +Ÿ%lÙž·¦O €gRжú7ýÓŸüÙ+šÀý™ƒ[)>)0A™Üù{cô‚tX,Æž™ƒ;gú¡Èš}5Ù2éùµ³šÚÍ3~CíÁ!Êáå ‹Þk¨ƒŠÔ+û »˜Táño ±e8Ö~zÈÎ?nh“ªØÊÖµ2éjþ’±ºÐ·2ç+­C)Nëuûdœ;Wöà®’*§ßHÏvis +ogš§ÃLâa]Y÷I‘ñÏsaK:˜ºZzl4äN6=z€ÚåŒiCì2ÊáôG;•ô¸œ­*Œ_ì3¼Kfª`¼ô &H,Gz ¥¿W7¿*H´1%Ô¡Nh}æ÷D¬Û:"¤öWyîQŽA V؈’{¬>c”4 +†•ñqQ,QžÓ»Gêí7LØO$2Â,GÂ,£>(¦é¶Ùr·¡ôöð«\ÀlÎNY-RžZý«‡{œ»àÝeÆœ4žÔ”=Ò‚áõÇ·‚?/saCíÖä´BU`)ˆ+{+³y¬µ3 ©.‡´=¢%¦§Š”hkuÎÔÎEÃHO©Z·$øû¤‘%M VCí Ñ4”ÑáÑ·›ÛŸòB˜£½ôȃÚ3â#ÖM%ÙO#jOïò(Át“¶×jó˜µ&¬~njjŸ·¦×¯þòâÍï«rk¯fî5àÄCNï0âþ«uê¬':ã,cUáw CðVNÿºjt/«bSr¢ÓÝš ªˆ]R´9ô¸MJ \ÿnMÏ3ú ¯z+ÅÛ0ú¬Ì%àpRjç¬Yžð8sJ¤³UâZ*¬½Îô¥ê s ‰Tâms¿&ì–Y¤3%Åš5°ÂÅã<“ðSN‘Miª½²´WÕjtPK%Thð‰hÌE{ ¹Œy™öÿdx´Ïfª)™µÏêN!§Êà«W—ºrtRW¶YSú%¾•¥Â=ÂËÑÂÕÁí\¢lÁ)`D(¦Ùškù$Ïjj•‹Òƒ~¤S¢}*½ÂÁÛk ¾û¬Ú¡Õh·nÀ?bZö̶±nÓ>ÄPzšL]Þ-ÉÙº•Öh8bÈÂÚðžJçIE~Ñ0öH³È§@X¥­™ns,Ì‚HÈQC ³ `Ë}:ŽnÅhùUM®Hm5>P£5ô¿$´Î¡]“ºÐyJ +³ ­(ò1¡Oäæ‰Ñ¹è|´gÏ2 Ð4Tã#xí'eé«ÿ¸*¹þF»È6)}‚Ü'”¹<é‚Ö(cèOîfß ŽßÁ®R ¹a4øèŽlOD½/C=\îb(·*wÊ|z^ñ£ÇFs#‡Ë?ŒÊ‘6cM­‹È‡Ú)!$Ø%(fÌN£Ù}¦aÖ¡™tà—©ÛyÐ&×ÄZ¤ÖŒ°÷kÆ—ê2[ÕjBÂ`tî¼!6+Œ«x³½ºü¸@ekr¬W¢œ2å–AÚ„Y¢Á]Ü—»µ|CÇU&äÕ¬`$‹¤+;S-˜~ªÎ©9Å[ì”ÒåK/ª©ê¨† ð_ìVïSQAksZ§!÷j0’òÀhïÔõÇU-ÇFU%=óétÏ™Þ>­«”Ø +Àÿ?Ú)£Ô6ø°Æú{-OØy«l>*°È>ÚPZVYhlh@5LVYn¦4âLkr;v)•,€7è.·†!-~::MâéF?Ë{(ý\(€+„(Ó0àô½þy4æŽnú¨,„0ã°ŸeήÉ!ÖUUÃá=çÍs|!ìxú\ô‘×’=ŸàÁŒ´c;ÃÛÊœÀ6²Þ +èN™c”]É<¹?îò¸Gè{5%zd"9ØÊáL Ö±DÛ€L$iô9oa/Íîc.Äà*÷UžÙ«J¤œH0§P¡ØW•¸H™„܃y—ý¦…2¦’¿­YjI8 +¨@ÈÕÍlÝÌ“>Rf¼3»œ}óà6 ËaUHöª:êT–rTX•±ñnEË”ÕÝ’’©¨ù†µSRžå|éq‘,±@îFz5õ8ÏîWÁHcLu#­Š\ Í|M¨?Î’ 8xyÄj•m&“çœÕùãÝ—;åºWU³53[³ÎyÊ\Á£}¹[ΔEXƒBz]¥µ!´]ŽjñGe-K§×Vå?y‡Ý²RJgvo”ž¢¨§öë¬ÿ(ˤ—–!¼…8½¾KìˆáJiðÞØ@ê}ÆYÈ­#9>h gãÑ?Óº'y&À %JÂÚSÜÒ³Qtæ>ž¥àuâ’Ô,ƒäµ~«µŽx7=}©øs+Ù˜½uĸKÑ_ŠÞ\·”ц[ôG7R°‚MãY–õ÷Y0soyñ“.RDjí í¤YC‡e±Ë9s5ÞÛöŒ»(ð­'u{·nƒäE¼ˆ=…zÓ`{g.LJ”3þE‘{\dáM(}È» Î]RÖœ±—б"ãâ~à*ïèäÇÑÉ/µÖ%ïm¡KHœ" m×¥Ô€ïÕ­ºÜ¦Ò¬3°4!#‰H«íÀŽÕ•¡˜ñ lT=öTú °0ã ³Á»S³}¤wN¾ªè°üBhÚÿIÒ{x¹qÝé‚ÄÛ·3¶E15;7rU(Tª +¨„B¡ +9çÔ9çf7Ù$›¤˜D‘”Då0Š£0V²lÉAc9[²•m˲Ç3óÞÎì9{vОƒÓ§ ¢ 7|¿/ î½8:â³pã¶Ð¨-¤õô—š [ØQ0öÖo X@Ⱦº6©Ê„ªÑ;E'5xŽ¹Æ-xà;‡à‡Çm"°±É#Œ:þÇ×OüãG†íú¾(ó0ûforÄ ¾nâð ÁââÁÝÍ“i¥ï¬ŒTÿŽÕˆ ºÜ¿Ÿ8ꄼ?fé¯_^úªSŒ¹q—<æh™Eï’mP2Xd`ÜÕ— ³@èêßZB£:D$\70Ž™|GFl ª£fv¤?D” ˆÝÉÛl ÕÚy_ó³D¬ iˆP®`HKþäL°²éKÎ9ؼ“õÎiØüY` 3N#âæó¨P°ù“^F>Šðy_¼íär?x/"Úá3óä¤7Ü0Ói‘ ¤:{; ü“†9u²Y„ϳó63ŽH"a ”œb‘š¾b “ wn.OÇ;z¯LÆ&©Ä¼5×b›?g RI·PÐ`’Ö#¹†—¹ù,ª‘Ñž7ܬÚÈ”¹OYʨCÔa1`ª=h¡!ê<ò 35á +ŽÚàð~§|I¸¦J™¼ÐëQ;3b!md ø\‹† ã€›/IÊu¯TOh!U“šð„OØùA;\PÁä*Uôxä(„\6l¢’&:ËÞpݤÌ> ^Ùˆ‡4ˆ¨ó„` =ÁªÉB3ŒDL‹HàÇí옙ÖÚüzH6¿jÍ—„Øk&â0òFoL‡*CVaÞ×€?Ñ£ŠƒJBBÜ#.(=€Ü˜•‡´è¤’D¨Ì$Zd¤ê•ó‘ú +¡4!Ñ9%+±1 'ÉHZ®Éب[tñyÀÏ-½€î€¨i2¼cVŸ7˜Ñº9+!;ýI+•†Š-7W†g,dø¨µµ ßÚŸ "•è8ÅiÑj×, bÆî{¤¼X\ÊËh¨Œ9¯Q››ˆX4x (7—ƒb2°AÎ%æ]lVLOGj«€4G4ú¢mÀ•?9ɤfl\Ũ8˜Œ  QƒHÎ@ŽŒ4¥î U5^¥ß±ló§¬LhÓ-5ðø ©NÓ‰Y¯Òöp9µ¹KƧ†œ‚•NSñJõFzX¸e¦T=wñPnà@Îî‹òéi©¸Ä¦¦ùô,pò¨[‚Yp²yè,˜IHF,‹)›&TÏ›D‚Õþh³¹þ¢e¸qáG¬¤Ù+â¡‚/R¤ºbq‰IN9„‚É•R… ŒE,d_²M„ +þjÂ%Ú™tßFz”¯ÈªOõäl°¸ÊùÜ<`¸œl +*Èè‹ÛØ4®aáºXXtÁdyBåa+m@Á[ö—L]“J˜–ËÌ*µ­ÊòÝRe •üihsW®¬Å'O«S§ÅÒ"¡Ôü±Zvr+7½m¬›}qg ƒH—Xð„kD¸æfÓRrÒˆ)zOØ,£ÁŠ[(û“Ó±æv¨ºFÇÚÑêoŒ¹@U\®ñ™Y±¼*VÖllNƒÊ¾p]OÈzÄLÈt¬EDjba)=sP^¿ÎW‚¹ÙæÊ]D¸1îŠ`áé +Lâ¢Ú=C'ç xì˜ÖœiñH˜˜c3Ó>µçOÏ©ÝÓ¡Ú&`; ¶•EØòþ"Ñ軹ŠOåŠJã”7Ü”²sJ…@g¥T >·kžnnÜ7wêñÆâùæê:Ñö†+ÁÒ¢X^¢’]©´›9_Y»N§&-ŒjöEþ¸/Ú £íH}+ÞÚñ§&[÷Ä;;>mñ'H¥êW[ÁòŠ/³è/¬zâ],Ò„ê1aÈ‚Ãß±„[§äÎ~¨}Jnb3ó¹ÉSlª‡ \~Þ§N‘ñI:1*.&z{ÁÒ2ÀˆnÔ0a("L*ƒ‚Ó‰ÉPe3ÒصÀ9¨„\ÐcœQ0©ÀçæÃõ ¹¶¡6Oæ§ÎÚ™$\•ªÀ·x¸É¨Ó¥ºmžâs«Ž@~ÐL‚Êû“|aÁ§vñHƒŒµgP¹b¤ +°NÄ»BaFXížòˆE“G°²ÑɱQ&6™žÚu¶#-uòl¨¼Ü]¿ neúenl–V.77ïnoÝ]?ÃÄjx¨$í Ø¿þíòH;3}AmïÊÕµüÌþ„‹sri`QZí)ÕÌÌ™ôÌ~¢½=sêVº·ƒl$—Ôr‹Ñî^°²Î¥gÕÎ)©èÝ «"lrÐèqT¥ºV^¿§¼vuz÷Öå'ß&•®Lfç¯K6ÁÁ–½‘Žƒ/uÄÉYiuÜ)ô«u6=)VB• ^•P +ó½ø.œ0´RËMžeÔy_b!XÛõg–@Ù{k×ÌLjÄêÇúÎj:R?mžNMÄš[ó'o-]x UÄì|aþbeåRyùbzêTiåjmëfiúܵǾ#WWmLœO¶#µMèH²w:7w¾´v-ÕÝi,žéîÝB…Lnr»¶~Un쉩ÔÌAmû¶Ò;OE+B¶å ç„Œ†ªdbŠ-,ò ‘æV´}’I¶’ÝÕ`u‰ˆÔ©xÛÁghµHvý‰^~öJ¨´a¡#H0Ãg&Ñ`“ŠÀÃ@›Ðe>¿ožRÛ{~µÊª5\.3ÉžT^ ‹ÑÚzº³9³{£±r ØÒ#æaâRݽâÜA²³mìHå ¯Ü,Ož)/\ÔcA€(@"ÞÞ‹Ô7ƒåÕâÂ¥úÒÕ“WžJwwuḐNÒ©9€=Ô™Xðg·Õî¯P4CaR@qR~†J´…“ìò™©x}×AÅ  +ðÁÜt¬±*.rÑÉÄA S“g}Ñf0?*-¡ÁR0?¯Ô×Ù_¦]µ½.—æ=bF®­Ðñº”ŸÊLíÁà³én¼¹vîÞ¤Â<ŒCqö\uýzræ \ßrs©þV­lÌœ| \œ3xüT¸h@_Ε—Ïgæ/”×î°ÆÄg Ã×£"˜ôRnáîÌÌ%±¼%Ö¶Åâ2›êEK ‰ú¢ÆÍŽ»SMLÎ4Ÿ÷È5\̤kÁìŒÁÃc=¶¸FgúÊËe¦‡þQeõ)6ŸLÀ\¨“@›Ð¶Xg?Ò> rˆ÷`p©ºR •…ü,°Jµ»ñÈ ïÀøè½A.Ñ*-ÜâÂU[˜O×WnÞ~þîg¿g÷«…¹³ÕõÙ…ËP¿Å¥«¥åk´:¹}öö•Ç^cRÍ‹“ "æ”úfaá|ïä½ÉÞ^mfïÁ§ßˆ4×ÉÖ–R[‹4·;›7Öïzjúì³|vµÒÙjÌŸCżWîk1­NI¥µÌÌ…ÖɧÏ=•œ<;µz¾1·‡˜µ@zŠŒ6}±–”ŸëìÜnŸzXÌ/²àäŠ#ô†J© #fô¥ dJÌ.§&O[|`cT &qøŠŒµ¨x3ÓÞ¹pï Å™Sv6•œ¾뜕«Åå+P)xb œ¡ËŸ’³Péf<$$;Rq¾¾z©½u=7w€È ›Ï6vÎÞx å“ÁL';y*3uÎm@ã…¥`qÙŸìq©É@¢3áò[`."õPiˆ¢¶t×ú¥'³“§§WÎO­_Ä‚Yøs¥¶˜/.\X>xèàþ”âÂäâþ]·ŸØ€—°Ð  à®åêéÄÔåäÔ…@¼=½rfcÿº¨–m¾®Ôñø4ZrË•ÕûØì¢Wèx[(¯þ ¹ +¶ÇŸ]„q“‹ §o<3½sUë?íL&ÜØ•j[¾ø$xu"X];uߥû^ð+ Pª«Be]ªí䯂ҙû@Í#ÂúÂÕ@r*ÞØJÏ^PÚgØüªÃ—(vö(¥ AHTPC¥ÅDs+ÓÙL·WJ3»àö­8)çbµíXý¤\^#c5µ¶¼vöÎÎu ©Dëk Bq)5s>ÔئS3T´¹¹ïÞÝOø¢åãf’·éiJmó…Ùôô~¸ºÒšßùÛ?ÍMí‘R¾½riþÜãåÍ›Íͳû•Worsûô­Ý»žu¿o­o…+k±Æfvî¼Ú;+µÕS7ÚËçœ\*\Y‰´¶¹ÜŸ[P[»ííÛ™ù«äL­¿r,sD‹€ƒ‡J5‡Pµsâ:áÒ’œi%«‹V*B*n¤á ׄÌ\fú 8O°—É™ó ”.6AFkv¡8à”†Q‘êRaMƒŠF,(¦ºt´ž:Yœ?+”–BÙNgÔÒêéëÏù"Åpi¶¼t1ÙÛg2s¸\"Âek mçráò—œ2áA<”¥b ª&ÞñÇ›áâ¢O©5¦w›óû1—jo–Ïæò³gJ³§²í5.Z»~ÿ3o¾ûAwóê¸[´Ñ „/ˆùe©r2XÞb’3J={ù‘'^x;šï¹)µ³íœU{Ùù»óK7ˆ(<™©ÍŸW*+#6ÿ˜ƒ„¨4ÉWsÓgz´›M4ãÕ%­[pp9p5N>¾"Z]ŸÝ¹Ù[»âr©Ær¸ÌÍ¥zg3Óû±ú*¥”\è˜Ó?d$'ìz× ˆfº{ñÖ^bê¢?¿È¤zzç —cÕ ¿:c äaŽœMh%ÕZOv¶'<‚Þ#rê@ÝŒËn©d—jÐÝ\– W©H]‡ñÚVmåºTX»’ëžä3sZĆŠ+{7µ:l§ØÜ‚\ßMÏ\*Í_ó'gBÙÂ$|Ra}列ê˜1Y)-Õ.¦Z'¥Â2P"øü`²W솊àÕN{ãVvæ’ž§•m#BzW&$‡Í^'ãÓSD/×;U]¾âJã`¹ùÄÕûž „«zTr±¼°*¤¦u(K(µpu«4w.3yR)Ï‘‘’Þ(´öïÁ‚©;5n'Wò*]:Ö#¥þÇ¿$–U.®aRJk÷’b"ÞÚÒ\½\œ?Hu¶üñº¨Ö6÷¯/îß0V:‰…`ð¸ä4ÆæMHГHÈvŸ Ôc¢7ÒDÂ-o¤+WOF§¬LbÄFÐá,Ø'”Kh¡ZQe3ž@õ§LnqpÔ:ªsX=HБ:,‚»Ð!".•¡!¥ŽÙéPqVª,û3ÓN6 ¡ÉˆŠŒ\J6¶œLlPÀld©H+*SÝàSý-0Ìî‹FŠ‹ÇuÂ%jKmmAÛìþ”ÆÐØi f <噞:(Ì]Èööå⊋-hÑ0 ÇP'ì„Áí‡_ ¯UV¯e¦¸Ô€ù¸3’KH¹…„GÌÒᆔž“3 $ŸC¨ˆ'8¦u³kLƒÝç"” 5 AGŒ¸OÌ­ï^EË'F._ªåó®Ð¿óED†ŒŒ§’Cý„ËŒZ½:Ôl˜O6“½µì̺ҘVêS™ÞB{óÌäîùâò.‘LqÉ6n6Þq3ña ®w3N2HSX…MÖÈHΡ‹“WinÈ•žƒ¹‚I>UMõ–åÉ ^/Ær].^6¸ÝŒâd¢ã.¿¿{šÎÌY˜ŒË哪2É’KRu>Ñ!Dü©lv~YnÏYùˆQÈH݃æbŽŒ'ì$X »tw ÆìãáZ-9Y—T¼€JI.U-Ϭ6ÖvétÅè ÒѦ_íÙHuÜæ?ŽR/ë¦âÍM“1džÍ'ãñ):jÅ‚Z§ÌÁ° Y;= I„ÃJHó»W:›ç™dù˜Å=êöSà‚“6*~tÌv|Ü1lÀÌ^ÉFF†Þ¯v0±êSÚbvžU'ñ`n~÷jwý¬R²ù•A+¦Ç92^Eäü„Çï +„•Ê"„eDȤ ÉÎäÒså¹ËL¬1 ØpûQV3]ˆ^©@„J>¹uk.ÇZËl¢"e;¡üB¸¸Â'§‡´ž8<ñ&7£r‘ºÖBÜ9 =6bÓXü¤XJTV#…e$Ò{&\¯è3ß³Þ1f9¢qº¹¢\Ü–2ËvÂê§ÂeRTã…Foignãìö…W|êÞ§_zêµo¿õß~øÉïÿü·ÿøô‹¿}÷'Ü|*;¹…I…þu£ÏMFb©V*ßÊT¦òí¥êÔÒôÚîæ¹+×zêÂO¾ï±µK7O^»}pÿSwÝ|â•7ÞyáÛïL­ïÏnœWg01i#C”R¤£„‹1¡D²ÚmήL¯n¯Ÿ½pæÆýw?úÔíç_Ý»÷ñ­«]xàÙÇ_þÖ«ß{÷Ûï¾ÿú~ñàóßêmœ#B)3.h¤ÃË‹Ñr(U#ƒJ(](O-u×O7Vvò“sµÅõæêÞüÞ]÷?ñÂÏÞÿè£ßüþ›ßûñ©k–§6¤TSggt6ÖèxXNu•e1yq.^šZÏt—£Õ©ØÔfæv¯íßóè•Ÿ~ñ[ß¿ôàÓçîû§ó>KÅÊZ7opq‹,))ÈìÁ¼Ã' ‰Šœ«'ÊÍl{¡¹pjõì[¿xÿ“Ï¿ýî/ßûøw¯}ÿ§'¯ÜnΟRK³. vQïb'ì4ˆc|Úàæ&lŒˆHé©d{#”ïJùÖúÁõ‡þùµûŸý— ÷?zå¡çÎß|ìì=_}ä¹×ÞùÅc/¼v×­‡×.ÜëÓ:'£µûÜt˜Vª|bÒ,Éé«BÉf¶¹4·s±1=·¾×öÅg®ÝÿÒßýí—ûÝÿöÅÿúÁ§Ÿ?ðô7ã…É£îã¯Pyu&’_33#zÉÅ|ñ§Mž\´‚0Q%ÝXÜ:¿{ùþµó7Ïßzì¾'_\9uµ4{6ÝÙÁ…̱qäkGL8%—ë3³Ë'·O]<éÚ#O<ýú›ß}ÿƒÏ>ùíïùá'~ü›ÿû¿úù—o|÷G>÷êìÎ]jkÓ€)D +*VL(±t©Ö]Þ>8yîÚÙ+7o?öÌëoÿèõüìÙ7¾÷Ø‹¯}ûŸþü£Ï_þößùןýíßþã•ïýüÁçÞ\=¸ÌX¼<_˜ÜŒ×fý‘l,[îÍ-œ>þÖíž|î…ç^yýíwúáoþðý÷>zí_þÎ/>úòOû¿ÿŸÿ÷òÏ¿üÁÏ}íÑçóS›|¢ „éÄÙ ’Ê–[Ó+ðXÜÚ;¸vï#Ͼôâß~ò›ßzôåo½ðæwüÞ‡¿þè“/¾øâÿ_ÿõáo¾xìù×vïº?Z˜ôñâ½heÍâ•­î'% ÕÉ¥­Óï¹}ó±goþÓ‹÷<ñÂ+oÿøGï}ü“_}ô§¿þõOûÏ_}úŧ¿ûÃ7¿ýîüÎÝ`q¡ÈFÚ^!Ï¥ºœZ/4ç'—¶W÷Î_»ÿáûŸüçÇ_úÖKo¾óã÷?yï“ßýü£ßþú³Ïÿøç¿üçÿú/¨Öýò³^û¡Rœµúõ`Î1+e@'£Òr1–oÏmœºòÀcWy⟾ùÆýÉ/>þÍ·ô‹W¿ÿùüãßýþç|ü‡?þù¿ÿû¿?ýíçϽöÖîÅ›á\ aB«{Ìì1!,Ä’Ty¦1µ¾vò⥛Þ|ô™WÞúÁOýÉ~öþ›ïþì7øó_ÿý??þíç}úé¿ýû¿ÿìÃOï~è©Bo=V]¥# mÿ|6ÏÅh÷G„H)U+¶Kù¥½óW|üŸ_yó|òÉç_~ë_úË~óŸÿû¿¾üëߟã»7}êüݲÑ:Æ—<¸PoÎÎ-mŸÜ;¸pùòµ×|ä¡·Þ~ë÷¿ÿý—þóGŸ~öÞ¯Þ{ùõWÎ_¹:½¼É7ødÛê ],ê“pJäE9›+­nì^¹çÁ>~ëá'žþç—ôó÷ø³÷_ûßÿáO¾üó¿Aw^zý;/¿ñÖþÕ:Ëg³í*˜‘âÕx©ÉÕéRgzu~ece}íêåËßùÎÛßùÞ÷¿ÿÃw?üô³/þòw˜Ž_|ðég¿ùíßþþoŸ}ñÅ[?úñµì,ïÉ:)e1Aqát¡Þ™]ÝÚ¿´qêÜÆΩ+×o¼öæ[¿úàÃ>ýÝ»ïüÖüþGüöóÏ?ùìÓÏ>ûøÃ?zåÍïž»z;Ý\p²“”j03ã¦ãÊ©\¡¶¼¶öÀƒ¼ íøÑÏ_üÖ[?}ï×_þù¯ýûüêã¿üò‹_~ðÁ˯¾ú«¯/Ÿ¾ÂDËv_ÈŠ’K|¢!&ªµÞb{zqcïì#O>óü˯¾ðÚ›ÿò­ïüô½_ýí?þ×o¿üË/>øø‡?þá¿üòÓÏ¿xå­wn?úL®¹j¤139n$tv¿"ÒÕùD¡½¼¹{û‰gžyåõçÞxû'ïøå_þúå_ÿí'ïð᧟~ù§?}þ‡/~ñ«÷?þä£_¼÷ËŸ|êì•[álçc»gÌ„2rŽ‹äC±òÔÂæõû{ã­ýÉ{¼ó“Ÿ}öùç_þù/ÿö÷¿úä·ùë_á:ïþôÇ?ùÅÏ~ñþû=ùìæ…[½k¸T8®AõÎ`£¬nZcD\[nÏtýö£/¾ñöËo¾õÍo}û'?ÿåßÿã?~óÅòÞ¯ùÞ¯>øè£ç^yuÿâÕÙå]>ÞHÔ68!^(·³¥z"«OBŒZjÍL.®.\ºvþÖƒ7îºvaÿü™D>ňNš\„aÆ è˜™0¡.Ô/ã©d±\iÕZí¥õÍÅõÞlïäþæõ›ï½ÿúÁ•«wßÚ:¹2=Ç*I2˜å=2T4ØI“ƒ´{h—ÇGRÜÆÎ]s맢‰d1›Z[]8{°ýÞ{xìö÷¿ÿ½÷>øÍû}üÉg?óò‹»jÓÓpœ g]]Ñ€c‰@x}ûÂÎÁLc:Un´Û…ù™S§¶Ÿ}öñw~ø·úÙï~ûÎÞùÖ›¯¿úÊËÏ<õðíûî^ÛØ.4fXP4‡ÏA† (¹5az«—¦…„[]Z¾ïúݯ¿úêëo½õúë/ýüçïþéOxá_þùâùSk‹¥zC-Vm5fr»©<¬^Áâ\¤€LPIäJ͹¹åógN?üèCÏ>÷ôw¾ýú¯>xÿó/>ÿó_þôÞ/øôÓ\:›)å­ˆÏêÁ ™ˆCºã£öãNÊKr>$§[½™©…ÅÍÓgÎ\¼tוk×î¾þÍ—_øþ;?xõõ×^zñ…çžý§×^ýæý7oìlíÄRe§OÔºHƒ›±ãAÔd{¬œq THI,­î\¾~û™ç^zôñº|õÆã?õ£ÿì{?øÞý7/?ùÀ½O<üÐþ¹³K+Ë•z7’mç'wÙXó«åÐ^Ðeƒ“ÑQ«ƒŒ% +++›W®^ûæëo€Wzâé§~ôá_xáÝŸ¼÷ìóÿråÊ=óKk©BÅãã!Îè\ì¸×;ŒvÜâ"Ú/gÙf±9ך]w1¬ÁÌŸÎåÓØ ˜G)MXðCÇÆG5N«›uxE³‹qa<âáÝð±l0šåä¤ÙŽ.“E}„æ½RFƒòƒFTc%ìDØ‚‡-èá1ý¸ÑmG&;aERJ‚÷ö0à +.·› ðh<šÌeÝÞÊîÙÉåµ`\µyéQ2htZ0­3 µûGÍĸ• x5) LØŽs#‰¡'E)UcJ"©*Õ©^V‘h¥VÏf2,ÃÙ\>3ÊÚq õÇÙDÇHüã€~ÂFû¥¢MóB¬-¥)%$É!i~q¥Zͧӱj³.«h¤Çv3 +Õ£ÃZçЄíĘy`Ì6bò¸f‚r©üT$^HªÙKWîÞÚÞɤâõJ%—/tZÍn³¢& &‡çð‰1ˆÃZ÷áý‘A#ü2nêïÄGˆ0#f9¥Ä3áDžðÍ6I r´À‰ªš*Õ3æ4Å0J4Áò—'0a&Žê<ý£\,Ò¡€²Pf§ÏÇD‚ñ*5É¥3ÍÖò•êÌYŠ™­¢Ñ„Ÿ ÚBcAE„TÌtÏÒ‘î°Þû|}Èè„¢³S0Ë΃‘H4ŽÄ¢jža8Ûƒ{)?Ÿ HY>\bumóË«-"TùúÝÇǬ@¡&'å¢ã^>£¦öniâ-Hb|Œ„Œ8|Q½›Ò!V`@¸CƒÚ;N莎Û5n+¡T,®’BÎ˨N*Ú?“ÄŒ ›£W2aŠ‘9¨Cœ(Ï´ÍnöëGÆû'Zp~¹^™>—iŸvPÉÖÁQk<ݳb¡;†,ƒzlÜ+ÑR%œ[’Ó>0h´#œÁÎŒ¼F'kB$[©[ÿI¬{tÄqdÌ|tÜxlÂ<0a1¡A­zøŒ˜vQªœèFò3˜AٌŶQ§?Õ?2Wtˆøµcãw êû2à.o ¤0.ãôE…EµºyxÔvtÔHÎë\B+þhÍáOhì¸Î{lÐr|Ìáð„Ò¥Uħ Œ€®*_Ô¸¥ ?agþ íᦕìDBJ²}JÌ.Ù©$ÀfÜγÓ\ºÜÝ· ÒÇõv*îfR8›HExfPƒ|ãˆV£GÚÓ§dt@ïuRª™ˆ¸üiJiË…u\¨ k½#0h¨pbÜq|ÄbrúÝ´êí/7mP‘.Æï²QÞËÇ\|ì¨Ö1lö}u +h‰ŒÔùäd¦»*Ì"¬Š (Ÿ££-*Úqry¦L¸CÇ4ž %Ößã?ìt1;3c2!äI¹vxÌ1 qÖFÇ|ñŽƒÏ8ü”•Õroù *@A¹9+.Yñþ€ê etK›õ¹“Z§Ï„Þh çög½b…5áŸ^&Æ)%Þá!Ó5{úyʪqéy::å ãJfÊ­Ó:úì ­xÈŽ‡q¡àbRF4ˆà¡TiÁåO ñ ̯ ëYë +²‰žåï2ݬ“”ÆM˜Æâ…¢>“n"€u&Ý?ÛÁÂ8[ñ¨‘ŽL8F,>3•b¢paå³c_3b@eø_»/êfÔQsÓ—+ tòkwŽ:¦žÒJ×+TŒHhÜìÒ`&0ÚáhÌF;£6JˆV2a!T‹7R›=“l,›‰ÛŸDýY·OE¨„›JêÝAø«c#f£*Ñ7b¦úìàñ`~½¹ö@¼±§u5ãÓÀ#–€Õ«âÁ +£Ô8¥L‹¤Xr‘ +còÈÃz¶þØ°upÌy~j`c¸ 8áà0>3b&Æ,¤ÆÆ,¿~L|ÔeB%³GúŸw 1Û=<¸AuÂè?®÷}cÄqǨÔm~íRmåâaƒgÈF»Ä*™˜ãK›rm‹IOcb¾Ú\[;ÿ‰ŽÛ©a»ßàYÉ$&6huqÄ)']üñ ñ§PÊÙ?ã¥ä5,Ø}Asp) £ºƒ\)Ûýª›Ïùâ=!¿Š‡ª6_ k$B¨_¥¤‚O.X}²ÁÔ»y§/2Ð?¿ÅthÄôb êLŠy7Ýÿø4(zÌèÔ#4dò¥\|Õ¬’R™”«vBâUpéƒ:·ÁÍÛȨƒJºøHunýH·j]V,ìb€“ (W´3É1 ’Òêîu)Ý9î4¸c0“2||Â9a¥06Uãô)И`v&TYÁã-˜JT,ØÁ G6\9>îÑ&$ìô%q¡F[:—=ÍO¯Ÿ{ÀÌ¢¡l¼½™šÚOOŸ‰4·BÕ ·wâåæò7ßøÑÊùÛwÀŠq!OH5)»)ïxÄ +-WÕڦѫœÐáv_ + µ(u>X<™ìÝÅf ¸lÁ6Z3Û;CVÒæ‹R‰Tªn.ËÄ»©ÊÒÙ«OVîšp@ö)°™Y:5çtiu–K.‚3Ѻyx¥“-xãóF—¤±Æ,>àa9Õ#Å`{ØH¸|°ÞPÕ§4Ôú¦\^µŠÆAA¨‰Íõ…+0JrsÏ)U<¡ +ØË:ψÑc@:ÚĤ +Ÿš•2óV"rhØrtÜ1b&O¸Ç, P&”Z«u7,?0n3:˜&œ|\ã>2bÁù¬75z†u.„ +ñòéžKÈ2jJ— D›nª’ªX‰„SŒžˆÆ³rv$£¬dgAwÀ›Qa š7îB œû_Ì‘±Ñƒ—–ŠZ'û?²h,Œ›NA¾#B%`r+Õ–_ÎÜ9¤6¸õnÖÜWÒ€…ŒAVâRs‰Î¢Ëf¦°HŒ·}‰.Ÿ›'¢mpµêÊÕϕγ霌¹¿nP€yd¢-:Ò6Z îðÅ&lÿ:\~„Kr™)¹¼"—œŒæ=ÕÝr‹Y”Ã#5²)¯f;»µùƒ¹½ûÝlÌàaØh]JÏyû'6‡g¬¾›ì ……1wLƒ +©ùôÔ…ÌÌy>¿äâòFŸªÅd¯Xˆ––¥êäÒn>‰`_kT¼á æéDCȶÓíU!7eÃ…lk£¼rM<@C LnbrcÔÁ•[›g®?ÎM qLjØè’ƒ*†2+Jy/˜…f«àR(¥:a!AqFÌàsgk —Ö/<ož„æM.ÔfN0/ŸŠÔVbݽxo¿´x­½õh¤vˆËE+x(oeÀ˜qv&áäƸèQ fïø$¨GBºþ1 ò(-¡ºíϯš™´RJÉ+Ýla3^©@EJe•‰5-¸EogF Nºy|#$5DС IÔ:§ÖFØ} +¨| 9ÍgæÝBÉÅ|ÑžÚÚ—6!ɱ[ˆ8àäK6¬raód¨ ŒXÒõOýâ@ÝLÊÄkšÉÿyhxXã:1î„l;n"4ÖÃåÚÃæ]¾ø¸4Ú?jÄÀ‚×u÷[^’KË¡Òrmú̹{žÄ›Ÿ‰Ô·…Üiå»û¥©³JmsÄÅ hÝn&(”ŠP}8é½T0)ÍÛ©(ô”ˆŽ7ÙÔT°¼B'&¹TëíìßzQƒp¸T•Vã­py%ÖÜŽ6¶¸Ìœ ú¤<§6‡ ô½`€½b9˜[nnÞÊÌôÀ5ã:ªó‡mô€3Š7Ü UvZk·„d—KvÂå+>®wYI9h7ÖîÚ¿÷ùËOæçÎy¤¼¢–çwîöÅêÇL¸¾`a>TXÄä¶\\)MïøäœÖ%(Õ“lrÞåÏ‘¡:äMÿ´º€ZYN57‡Møƒæq{ü€/Ró ýï‚H6s +ÞW‹±l¢™Ÿ;SY¹™Þ··ùÜ*åQôñ¾·séA3!žÐ£lj!Ú=PZû¾HwØDW,6Vf6ïùú ›Þ-á‘ŽÔ8™\¸”Y¼Ê–Ö´DÔ.=üÜÛ³›—ÁP¹…@rJíž9ýhfò‚ÆÉ9DG4î&bÌ) b¹¤3ˆ :+á"e‡ÐÊ$zÑö^jæ|}ûvk÷Ð ÀÏ¡!G¡³ëvƬLÿˆKˆ'.Ñ#T²3— ­CÖ9üàWq.eDøq+ ~lÜ-›}ý­£VðÒ¨t'øŸ ·“͈è‚XÁ¤¬XdÌ ZÉ9 =v\2zÇœ,Lº•RP!+dfã5øRa¬µ'×wøür¦{8­®·cÌ=‚ÆÅN8„Q ;l¤ ˆþ#äçý©i4X‰V7ÒÝ}65 . +¡ü¢œ÷§zH¨fÄc?4j‹A/œ_” +«ÁÒ:›™sÐqLÈDªK¸R2`AB®0±Fº¹º´kóâ#ÍÕ»ÜB*__î9®Á4vü•Æ€ª,Nn‚÷³3£ý¯‡0±nwµ¨ˆI"Z·³)»?MD:žpËBÁè¨ÛÖA~!bP ýãªúŽùÁô¦JËrnòŽaÃ1­Kã¼R%ÞÜIMQjËœœÛ=ÿpcé@‹ñR~¾¹~³²|]mï—ç/.ÑÖq=æ6=\Úìáû^šŒ9ØîDª[ÞPñ0°Þc'#`ÀîÚ€<…‚Iãrw¤[È‚Áæ]”Mâ|"ÓÙÈÍìg¦OGëË­å‹•¹s´RcÕVª³›îìä&ORÉIq@ÄX+’_ÐaÇ&L,ÑñI*ÒñE:Þ`í„×:.*ÅS$dçóówy€.СüÂÖÅë¿B…+c6ƊˤÒQ›»ó§ܺûùì܀Ò&ÙÓ£Á1»ÿð„gÈLYð(‘É«hûdMÞЀÁ£E‚ÞP#XXž=}ß…‡_߸þ_Z²±!gñÅôžÐ¨±1'™"‚U ¬~xÔÉ)ÕH¶=H8 +/ÌDë|²Cs/&ŒýOWôî WÈaÁ¼;à’½Pe3XÚÈL]”ËŒÚÖa¤ïl{|,p]ÿBGp Å;¤÷bÁÛý«ïeèVϺ}I¦¸ñˆ¤”[óûv ^fæôÒŧ–.=“Y¸äKÍÀ±Rº7»Óž?ï“+—ÂÁ|•ˆ&‰Ñª 4VŒ‘Ò”˜Àb÷H$Çíâ1Â4f!GŒØÑQkÿ¨m+mëB[÷ +ýÛgF¯ˆq‰L{¥6¿ÓY¿Ø;yÏÔöÝó§î­.^ë›V&–,Íö?8eã:7ƒó¾på«>¥g#`˜Í(˜d³É%Xú_¦Z½Ñÿ£÷|’ä:Ï|ÿ‰+Cß¾ËûªôÞUšª¬,ï½ï®®önÚwO÷®1ƒÁ`nà J$’ —DRâîJ»”ÖÞˆ»wã~½§‘è)”Ésò}Ÿ÷ùecó (8á¤1KdãcŒ–s*ø-¿ C†ˆÔ…X#Û\Û¸ðˆÖ+ cuy°ãLUËÌó‘*æ'=¼o¤«Ëãòùa׸‹³£:ªƒŒÀä"pR´VœÚw’£öÁƒ•pq5ß¿XZ¸Ôßy*®‚Ü/vÖg6nŽ»X$»QôÒ¤“tÂ"&$@6%ë‹„’‘fé©H]­®goLo½¨ez³+¾ÿÓ?ÈÉÞ¨;ˆÈ 1½¯oìÜ|{ãÆ;TtúØä#"”R¹JÃ7’Kcôi!ÞgÃU`ÎGí$°p N{ØS.~Ø)š½ŠëZ~ÂCˆñ`E@H˜}¬›Ï y2Ò$Ã59Ó‹Õ×äâ¬ZZŒ¶wÅÂ2ï‘J¡³Ûßz‘‹µÆ<¼É¯:ñ&ä±Ú!D‹_EØN ;¨q7ë„4‡?èÇ4%V.N¯K‰f¦ pïV¤¶dÔWåò*éx¹´bTç×®N­Ý÷ÐÑ3vÔìg!.EjUDÊÒÚ`¬5­dãÅY?ÜTGCH°†) zƽhซs ÇAå¶áƒ•ð±0$¥ˆp‘ŽT²ÍÕ§ïþðý¿ùûÚÒ"TP sJa¡0s˜jnÔ¦öºó‡¼žô"©1áí@|aÂ-ƒŽ žÐÐ2¹Ùa q|Ô{lØ9l†Æ¬€ë#b´UžÞï¬\ñPVTuÑ1;!Z¤²nT7¹h €Uej3U[±Á²ÙÇù€zS1p0å{Éâìé1ïÐ$ä>O¹0mÄJw¡ +.f¤xËæ=x¤ •”lŸŒ©+âj•2åîfmf¸ŸŒÀ\ÌGêV/çF‚ÀúºQYMµ6rfÜíAemZ‰‰·ùÔ4ø¡F3õÝ‹€]ÇÔF´z«íK±®ž™QRÓ~!{Ê„1r.Yœ÷بkÂ-ºˆ4ži¯>j®?¤ôæi3F)9)R²z™¿:eþ֘猃3——Ó3^.æ¤4s€îŒ §-0"ç´Ê2€>Ro¨å³r~‘‹ú`ftÛBÉl²™v·av÷Ñæõ·÷ï~wáÜTÎàÁ $¤]xäÑ ;1êšô[|ˆƒ‚„°Ä#.fÔÉØ|¨JR&õL~êìÙK/U—m”B‚âXYO¶CåµÁ8Ûdüú`A1ígˆ©0(yÁð¨éæ^~ê6º£N΋…P©€+UHJõ)à÷JÀ^‚nâiö2Ã6Øñr²5µ~µ¿u+ÙZ›Z½¸xî+£RRÎL ‰öôúµâÌ9s "NϬ^2òÓ€†\¨jCÂ4â!â¨q#ª3 ™üÃåø| »ÎLú†Ì"˜S¤ççC¹>©dfÏÞÎww<œGë‰é ¹¹k QB¬Õ]¹š®¯f‡ù´–› eæhõApS§'}}Ìdq1 LüùaËéIxpßUÏw3f?¸;äfNš|N<„àµu1Z±4dFa:ƇŠãvìÔ¨Çîì>2Ã#æÀ¤¼AŸpá Žœ² ÀNÐÁ$%Fi%…Š)%5uîö[ »GÀ¶ù™¥VAM7Êë(Ÿôáʆ'½,¨z6 ,R)˜˜ñ³Éq;Ncj´ Î_œ0peÎâϘàa 2âÀÍ©O{Fí(0*N$ˆ$,ç¼BÒÇ%P¥R/ÚØà£ÅÅý»íµëéæFyf¿¹v½¼xY+-cr6Z쳑’ÙÇx0eÒÀÚ1f…„NHYÁ¨?–mm;@KM~{€GÄt¤¶2îÅõogÎß|õüÑ{b¦çãS ð2T—3‹Éî•ÂÒ=17Ké\{'ÖÜ’]€-®Áj·Š 5£ç£“ßv~gÈy‚ù•:^‹¦ÁŽ¨"&fÊJ€:QIÏM¯îßyðú'k—†ë«ß<-õ·îw7ïÐFÉE©brºó ®‰F#VcuÒMNº(›Oµ @Ä䂃§FmN˜ÇĸÙÀHKTf»ëU.«¥•t{(äcíÆÀÁú$(fÒÉ:±n Bêôd¤€ Ú|¼sðŒÒðãšÉŽZà3~„‰`BüÛ'&¿u|ì¯;c²Àv(È)9pJÙúb(Õ™´£¬’±"ATÉSÑ–”SËk¹þ•lw§7³ñýŸüÃâþ=ÀŒ€†ôò¢’Ÿ”Ê'çÁ¬–p.Ö[¾æ$#'GmCv“™ìn#!„K”’ußKGq¥$¤§2ݳ¥þ^ª¶pùöËçî¾&$›°œ—Ά +«™ÎawóQméVeî2ïê©©•½;d8eF9'e¸ë‰¸è¥wlhxÜËûƒãú°78â 3¡gìà,%»$¥ç)9¿º}§ÜÛ¢#%)3XÎ%=}±¾rwñàå­{ßMOïçÚëëHÙy!Þâ"uTÊú[±g!ìȵj…ƒN\gB]Þ˜€ï!Œ ÐçJˆù~lÜL¦›L¢lÕ4¾1á-TÍÀbô•“ŠÓF«½r£Ö?—®,¦ª³~Þ ”¤«[{ ÈV(dòJö€†P±\u¥ÔÙ>6ì¶874 üIѪ°Zö±Éjo·Ñß: KŠW…hÖ{xqÑ$f :–.õ3ÕÅq2fCì)@ê PÚ☰£J´I·,nçŒrkñðháüc)¿–]Tbfõê'?üU<3=᤻Cù4­ÖéP›ÐÖÁ¦«Ës”dkÒp3#f'é†$/"‹jbÂNXÅ…ìùK]#Þ ëET›Gð !ˆ‰‡RÝ+GoMziE•kI…y½¶­Ì÷v¼þYqzàp®»W˜½¨ÄÔ,ª5L Áªzùö£ÏˆHõ¯N 2H¶`.;!Ä«õ¹‹£ä ÖŠX(Ì´õòl¾¿•h¯¤„šŸ‰·vèH3h4ÕG•mPZUILgšk´žÒr €98äÀC.J÷K£nó´ÞrR1/—öÏûÇ}¢Œ²±.,Áìüúòô­Êù¹d÷ 8ejãÞÚ…ÇÕ•ËJa¶µpîõï}Í&ºv2‚ie2TÆRHÌ~³+÷4 `ð²íÁž)ß, lýfEP“7s9\® ÙÉê#ˆ±ÁÓçÁ6Ù `°³½ó¬Q£åt}z'_Ê”¦¶ª³{d¨hA‚>6¢‚ÑŠ6'Ü Y;vB!‡‡÷a!zgL(P{6”uâgìí®Ím>ÑuÒ1®ƒŒPR /cø406@ŸåT°Š;5$“›2bvS& ^qÂò¸Ð|3sÍG†Y­À† J¦ÛX¿ÙÛ>êo¿°°÷pñàA­» S!7ª!\ƒ*öÀ`Ϧ›öbâr¼?­NÚ1w@`ºÙAúPÈ—ÍMŽ˜!„Ï)©@=Z;eFø­Áäl†3:¤ZRb /©äñ1aàóµÒ\}ùòüÁÑüÁ‹•õ›nÎ’[[ºŠGê~) I9ŸF¤<.rP®õ·,¨ôí&;á„C¯dò0ãßžoÌï݀䤅)¥e.ÙÑŠs™¹Ãpg Wh5»uxÔß¼á@UA¥¢’™oÌ_šZ¹ÊÍS€—˽'Ï>ÍMŸûËã–;j%UÓ3¹Î˜±#ÊÜÖ]1ÙynÜ;ä ì„áf€Ôiù~º¶0»v±µrÉNª¤^³])Ù "ÅTkmåü‹·ÞµR¤²mnAÁ¢“ˆxAõ! ‘f”–£åe+"Ÿð!à:Ƨ¿Ùh5aƒÃ§­ôéÁ>æÒ±Iׄ—ôÑ1ÝW+gc­ÝxkÏEF£™é£§Ÿ®]~ + +4¯+ÅY)ß’S@·]¸f‡%V«¦ÎcÁÒÐ7¾Ýâá&õù¨$pÔõéíKwß@7ÇBL´Mm'“¦ŽQÛœÞ}$¥ÚíùƒÃÛÏ +Ó»–€b‡ƒ=ª¨Ìž÷9(|–? ÎÍ2ã¾ Œ‰©ùTc;œéÔgvz»÷W®¾º|õ•¹s…Ô”U±`&Ù8[˜9q1V/ûù ¨Å>Êw²ÖìæÍNÚ “…yQ¯}ë¸é̸Ïîã­nÊæfmuÂ#¡bnvë.¨þÿ×1ë3|2ct¤TßIľsÆcösNBq’ +$ÆèXX÷ææ½Üü5"Þ#"5¥0Ÿè –D~ï›±@KáÒ:H|k »ë÷Z<¼Ã/ŽÛ‰çÛW¹G옋МTØ„Ê㞉VØdÍ'¡Ò\míf¬µ•hœÍMï§Û›l¤ü³{0¥H(E?›vbp#]Í–Z+{W_bÍç‡ì~ÚP¡ +¨>v,â$ã>.®fá`úĤdºVÝT ?ˆ^ ý©bwaã|¹¿á•hãl{ó……çs»ëKËó‡r®N¶ž¼ÿ·—ž|fBC*šétÖ’ÃdãœèYQÐh8Õ¤Ôü˜›;6ŸÄG]’‰„B8?·óéÅ£·¼ThÌË™1ÕÅ&H½–io溇ɩKÞ`ÁKézu hµ‡‹¦Ûs);¦9ðp¡i°Ÿ›qSF@Èùé¸Ñ@…%@z€Åž[üAJ¯Æ[[…™ 3[wšËW.ÕÔÅë/}÷˯ íÕ1·€˸\&Ôš‡Š›20œ¤œƒØè5R+ƒ¾ÂBÕø`YžG±ÊòÜòáëï~1½v¹³y{úÜãÜò­ìÂõÎö‹³;÷æwî&šgSµ¥/¾úý'{q•ÙpÓ©êx[ ×€n…èPÙ +‹'Æ<LJß:f:1ì é¤RLlšÖë±ò«WPµHÅ:D¤EŦ¸ôœÉpA/ÍŒ`¢ÕXk£¸tµµy·¹uTY¿é°©žžéo¼¸ÿQó¨ZŽ F•lPñE"<3ØÞÝFœœðOžPCVtÂÃر›¬<£—BåÙTsqnÿþÜÁÑÙ«/w7nÆÛ[¨^÷° ì›{°n\5{ãÍ­–›:Wž»..#JaÒÇ»@ÝA•17i¼)å‰p[H-‡‹ët¤6êå&¼l€‹¨÷P€¹X3RšOÖ—À…xáds-ßÛËv·B…£¶jTWX£N6ÖnO­_p‘!€o±úê`)›x Õ;Ú1/<{p/Q^˜ð „9ñ¸›Ê€v´8{îæÓêÌ6À"DÊŠù­v¶4u÷Ö;Wžü µù¢_Èë‹gïãÁˆ±XålqþvmåA²sULö€r£òîÅSõ&tTX㦃ÂZ^MNú˜D±¹Zïï‚w¸$ªz=Z^…#=u e{ÀÆ +}6\9c£NM"* L´+%fl°2’ì j:"¤a1ªY© +‘J²¶Ä„ò•…‹+W_K÷"•%2\òR„œY»øÒѳ/;+W\ZˆÍ`RÑl^j0Âa:92SÁä̘‹ü‹c'Çý£VÜìâœh•+n#XXÐkàÛ ¦zýóOWo¼[Z¾à™öVûh÷ÖÛ­…óû·ßh®_ ×Ê+WSóW”Ú¦œ]è¯ßÙ½þ¬±|P›”žM´¶Œê:“œw3éa+öü°ãĸ/@>*l ¢ýl ÓŠd¸¬çBÅÙ¥½»»wÞPK½Xk¹0~°ïgA§eMŸÙ@r7(žD¥„’ëg/ÕW®âŸÒråþ.°°Á•—Zëw6®=›;|9T]á“ §áR´»r…ä=¬†‡+ˆR]Ii„‰%K³J¢éDU›?hõ6gq`¦kÙ~²¾êȱaW€‰À¡#U6RN6W[ë7ôÚš‡6–VÎß}üždŒQè]ÊN_Š×¶¤äü„¶c>L;¼ò¸ÐÚ8=ØdVõóY.>­WÎfzí}Œ_ºùòÞÕÂ;Ð ‘úÚÝ;ï¯ÞxO©l8ðˆŸÔÞxÿóW'üÒÉ Øä—ùÄœZXGƒåS&Ø KSÛñææp ª‡Œ@#ÃU%·ÌÌRJæðö«×^ü@Iv]xˆÜŠïÇkëý­Ûûwß-Ï_Á”*"æX½eö ÇÇÜ}bòØ ¸AðU°*uø;gŽ€Éô'Ü° uÓMÆ[ŽúULÈùˆ0&¥Øx+ÙÞÎL"j×KÅÞAiþB}ùâæù£/7ßÛ’r½³W^?|ø½þ¹W@½¸ýô‡í³÷¹X;U\\ÚQÎtÇ|œÑhµLˆqÀ¹&7íÅ=^¯ç/g,~h¥W¢­Ídï µ~«¶zEH5zWK‹#­M½µ%æ£9ÕœhÊ%æû6F÷É—˜£5ö\JÍ„E½b7šJq)Ìa‘*f´ ¥J„jˆ\B¤œ f[DùÄG}|8Z[ïl=lo?,-^ÏLu oU-Ýš=¸/fµâ|kûA¤½Ç¤¦™hëÌÚe)Oz™HyMHLãÁ¼k¹ñˆÅÇÃ\TŽ·€SúÎ÷© È %“¨o𱎠™\¬šhyeÒZý ùûož¿ó¬»~#ZœçªÍÏøpÔ©ÁttÒMÃB2U_KU—ÃÙÞ¸‹<6âwÑn< l[€‰€N ðQ˜e*}!’=mò‘zëìÍÙó/Õ–/‡JËTÜ÷ž¾Ó^87K£RÞ‰“^Àž’T8S_âle5{%˜ŽºÉD;Ll +UÊZ¢~ãá³KwŸR6À¦j‹·s3—£µÕP¶èÀC%Æ´ âŠÝ}5§M°pŠZǤÌDݸþü°Çì$jµWÞýñˆ >>ìw0^:ÆE»Zf!œšÂ¹Pcn‹Ö²öÁò\ "6ã'ƒéÖj¾Pœ=ÈMoëå91^϶ÏööîMo]-ö·€xj…9:Ö¤¬oTgv¹Hu0”Eøy”TÂÙ1',‚¿ )5á"­@|,˜žj®Ý\»þöÌÞƒÊÂáÌÒî¿úíÅûopƒÅ¯æS‡áÊÙxkwjëhóÆ›í³·óSÛW}Ȥz",,%¦Î¥g®Í]xsîâµ³wŠí¿üÝË~e' ¿2æ N@²‹Ï0‰~¸´šk®_¸ùÒìÞÂÂÅêêµÂÂy½¾\YºÐZ¹º~ùås/¼ ªa¶½qpïÝ+?^ºð¸´pE-ÌãÚ`l'¥w,ˆ6î¡Ý¤á$£@©P]ˆ·1¥€‡ëVD'ÕŠ—ÇÜðfT䛋®ù™„ øªÏŸçbU=×Ê5¢•%!5‡(5X,¢|ƃ)g¾ÙE„„ UÀGÌ>q°q€‹…¹”×Á‹0U “ ¾ùh ¸²!f…?v ´—²zNIw*s‡íµ|´àÁIæt|3âµù/^1#&»B·ú¦q¿löð“.Ê 6<”jo¶×¯g•ü‚_ÌNx81TÒ’?%•|€I¢|^4š¨²ÂR`0õ³SNH91â;~ÚuìŒcÌFúp-@¨¸”žÿ¹“6‹›³ãßr÷ 9Èq7cr’¤œ +0z€„J‹áò%ê1`‡Z«Åþ~¢³ÌÌ0¡‚–lF«ó„Å$•ép1RY‹5wëY Ä0®3¡ò32jÅ@ClÜâå@Œ™ô"å À´^R‹ ™ÎvkéâìÚáÁÍG•ÃüôÎâ…'Ó;Ö¯¼1¿÷Bº¹&Å*J²•­/n^z ¦§´ÂBmùZoë€XcMÎN±ñJ,?uùîë{·_uRF03Ï%zZquîðÕþ᫉úZ{fóÓ/~xôZ0;o¬»]]>pÿ­W¿÷‹÷~ô/}ôÕö¥—ÞýîßÞ}í{jyI--‰Ù…h}§¹zoýÚ{S;OPµJËÙ*èüܬVÌPÐÏÇ=\’Ï.–n)ùù-O­Ñj¶ƒ¹&Ñf’Ò…Þáʥ׈PFŒ¥D×ëùÞÅòâí`~ÝËæóç“}:Ú±NËøè(¨­v8üÍæ,¡Q‹J¹dc“T‹6L…åB}åvvæ—ì2±©—œø`7¥Øaâ„’&CE*\äc5B̓Ò@ûµy3Q[ÂH…k.L3»¨&¡š QÀ¥çŒªÛ0 føt?Öا"m,˜£Ä$%%!..5‹O¶’ŸcMB­J6Òj'Fý JtÔKê.zûÚ“ï^~üÞ…ß\½ò »²{õÞãÍ+›ó¶®¿Q[»ÛX?êm5—®Äg|<œh\ù“æêÕ“fdØA r–‰¶õÆ~®“3Œœ¼÷ø=1R±ÂªƒŽÊ…ùx{··óháâ³êú}`c¶Îݹÿô£|o×/fèXR«°Ö,õ¯,_~+3sÁKGÎß|9×Ùó +«'|²›NÂR)?uXtÁ¨×§w:ë·@ ¦:›d¤êfâD¨ÌÄÉî*Y!N0ŠÀO’j\ 7‚Ä´hU—®]xòƒÒÜyæÁÔ40‡“ÎÁÂVŸ,Š ´¡½I¨JN‡³S 9ééKBf=$`êgÎèÚ  ƒ’î† +}2TbòóCÀBø°`ÁÇÄÇ], `O™Ð3lÔApóõ æqX°ã“ˆˆðÉ©`~^ÌöøD‡¶,&j)X0&<¤— áj.\\2ê[zm“2jŒ–‰d›B¢fG9ÙMMÆ[{éî9\):@+ÜÔ¸ Uô²«Z<Ôé ÷©q÷ˆ,Œò9˜MB&ßÙ 1JÍÊ©V¢³Á§§H½ú$ÕÙG¤˜Ù‹5ÀÕj¤r6RÛ¬yE ˆH‰6ª€Ìºð&eÄxSB¡W@Ö›}ܨC¹¨=À™¼”— +C”&ÊF,QJä;´’™Bs®2»–ïÎ¥)>^³m½:Ÿé,5W 5úÛ;wž5ÏÞ=)ê%ŒzqÉQ±duqûf¢± X5ŸŠdç•Ô4k´B±ùðq»Ïâ¡Ô‚ˆŸ£éNfjû´ 6{‡'œ#“N¥IZ’#iœ×ÔDW–KK±rc.™kƒ?¼ ›ÒÍ`´HÜM†‡­˜ÕË8<+gÄpÑGÈ&'juãvå0 LØIª©‘B®2“¬L£t0É€\¶úEðA"‚€|~È5b‚]Рi'F¬^ÁIÄp¥Âí`bJŒVÝ0'©Éö£ ÇèµPz:Y]–S.T°zñQ“ËdóPÞ`~0®\¸FÉ9 vH…C0Z@sp¥¡dÖ¸HË<ƒ³ºi« wÚ}4HÀõ‚žÇÅø˜ 96l›´¦f·×öî@TxÒŽØ\„ÛDZbÜ‹ˆX°¸ˆ¡q·“p>ºè³æ`ŒÃH"%W6Yl¾Œ‘ˆ2˜ÁÄôà9µtkuSÏŸœ´ “VdxÄuê´íÌ°k +’Wƒ—SÀ·DSų{7PΘ°av7 TÅá\~%Ã^H3ÔX3”œöÀ2Dév??b‚¾}Ü2f#Ý° ÎçùS“0©bÜâ"ÍN|ÌŠœó€àô#Å' <äô2gCõ“žïœ6ÿõɉcÃvB(ƒ±ŠŠnœ»ŒÇ]„ÕÏ{I R˜\ +p©q`8dckçÆ‹ïÿ‘þâ¹áÃV§fʨ%ÕX–C›×ú—m07dò™=´ÉE™ÜLk„ ±Áp8–—æi9°F€¤*Ák~„$h—“n„uú1—GHY‹×4µÚí4C«±„ gM~Üä…~œ•³\¨í€T‹_ H:ͪ.AxÁE‡6;¼z"³yx%€qÃ#Î1Àק,§‡œ@aÖå•Í+z‘°Óƒ9œ¾Ñ Û™1›ÍåS%›Žçs) ÔüÚè—a3(aŽ¡ ÏèdÀKwzÄñÜññçž·8h:˜'…”ËË´2²z¬ †ò ¤=ÄðZ£&ÿó'M'ÏXÇ&ÜVFòq"Mš}Ããî +bs3iøɸÕßqœ¨·A>\C w +x0àôtuFˆä¹pž&M.Ü` "“+hö!Dj„”%xƒå‚M&b!5f1( &˜¢ z==3ß%9 Š¤âÜ^ʈ®ºü‚ÃËya !BÞëp:\N«Ói—$©’õ*ɵ~ùâîô¹íþƒ‡·V×çõp¦‚nˆµ'ã“þ¿znôøÍâ †X,¾€$qZ“UE–E1èõcN ÄO0„ÂÍb„ÀpQ9TpøéS£¶çŽ;isÖ8ò›‰cg¼ÏvñLÚp«“´ÚNIæüã‡(IŽ»=Àó£„Ĥ:>dž°B0Ì{=¨Ón%p·„‹iaªïÏV Õx"£Ö*±½ÕÖÕó+Ë«RÉ(æcz,.j€Ùùc§ÆÇ'íO@b¹Oò˜#¦ óL¡ †8Qƒ晈! +êl;ztcëþ݃›WVn]?›-e†&ìC“nO€ò$¢,P*h<Ü*†ç§Ò’!¼²6“=º¹ ŽÏž]ýÝß½ùõ/>}óíû‹ ÅH”eDáƒÍs±͆ñH¥l´›éf=VøxÌ 8Áâô8]nYKå|}ª>·¼tçñ™f×À&4<ÌÐ+†3:°==î9~üŠ@ÑH¤PȧÒ1_Àíñ º‘æƒåR~ÿü…j§+Æüú’‘I»ÂæÇi%ŽI1%Ñ@X‚ü Å€#g³ÅHXKEÄ”†­Ï—v6úíZºœRV§³·¯®?¼½óìñ¥G÷ö¯^Üšž®EcFÀ¹=ˆÝ…#„4'E ÁxËÅùF1T+„zÍèî|òÖvåéÍ¥÷žìðxÿ¿úâ7?ÿÞ“{{›ë³ÕjQ$_wû€ÜQ(%ÙH„& +¥CÁR2”ÑùNÙ˜ëf¦Ùå¹ö• ›çöæo\^{|ÿðÁÝë;ÕrÕˆƬvÛ„Õ‡QAœ¡ÄÂlµ„ƒ¾r´_|ç…Õ×nÏ>½9õ΃Å_~qï_~ûÁ/?»ù›Ï®ýËׯüïÿñÛ}rôøÖʹÍf2Àœ×ÏÁJr)-Î5ô­™ØTŸ)ѵ4=ÛŠÏwS‹SÉ 7îþþ·ó«_ÿð·Ü¿¹yv}Hô¤Õbs£.D<5îxîÄËb +qþ¨%d8ÄÚBœ³‘“{õ(HÍ™è“ûÛ/?8tkçý×®þäËw_|x3_ŒNÏδ÷¦7¸HÙë´É J„ØžÒï´níTw¦”š¿øòñ×_>}vwåÝûóÿð“§ÿþÏŸÿù÷ýôÃKþÕÓŸ~rmw!¥0>Óm¶xatBBuõrô³Ùï¿uþë<úô­Ë¯ßé}üÒÒß}xé?}ú³¯ýô½sþÍ+úÉí·î4ní–×g‹‰¨–L&ƒZRg†ˆZ ]( WV2/_›{á vt®òÅ;—ûÕ³?ÿéG¿ÿå¿ùòèþñÿïÿùÓõÑÑaóÓWv~ù勯mÇtÅl œ÷Z=ÁÈ·3ඡ^‹ˆ;ƒØätŽ9¿”=\)nöŒƒ…Äý ÓŸðÂÛöß~ríñ 7£F̳Ddq<£2¹Vã®/éoߘúþë>ýüÏ?¾÷öìÿýóÏÿ‹wAüñoüùw~ôúÕµ~!¦K +jz‚&‰ •tb6‡íwù+ ú‹»¹Ïžœýù§÷¾|çÒ'¯lõÁ¥ÿôÕ“ÿùþÛïÞùÝïý×7óÅ­¯.æbA–c ±8|>à'd-Rúiöá†ñÚÅü›W«Ÿ¿¼ü÷ß»ò?~ÿ柾~åÇï_øÝ×þõçþô“£Ÿ¾»÷³÷v~õÉù¾¹{i£XÌÆ |$À滕¥vr¡¦]ZŠ½4ûwïûôå•_^ÿÃO_ýõ—¾ÿìÜß¾±óÿÓÇÿç¿ý¯¿yó_Þþo¿óï\\éÆÈ646nuRaÙn.XÓ}UÍy~š¿³‘¼µ‘xx¡úÎÃå/ßÚûäéÚÏ?½õ_ÿéóøñ“?~õÊ¿ÿá“Ÿ~ïþÖR­Û›‰»\‰ñ\Tn$˜µ +>þÎÍî/?ºü÷_ÜúÁ;Ÿ½¶ýÓoþÛïÞýÕçw¾|¶óõÇWþ˯ßøݧ×>½ß|çzi»+g"Xb\ˆ ’ZÊFŠQª'v{ák‘£­øÓ‹åOŸ®ÿþGG¿þüú/?¹ú¿þÓÿë?ÿè³W¶>{ãÒ½ë›N{!& ØK c¼¿Åç +ôÁ´ö`¯öÉã/ŸÿêÝKÿþ›wÿÏû埾zùïÞ9|ëÞÚêl1¢2N0AÔ2r(£ªqg“Ax&Üïç¯o”ïïä~øêæ?üà…?þôÝ÷^Üxï^ÿ¯¬ÿìƒK?ݾµßØš¯”‹å že• @$ÀbƒŠb¤s±XB"šqjk:¾;“¸¸xýjëÇoþêó£/ߺøÙ+;ïÜ_|~êÑ^ýÚZ~±.e€õ >Š– +šQg(!Q*Vˆ~Q¾µUýäÑÊOÞÞûí7ÿþ‡þøã—ÿõWïüâ“¿üððÏ_?þ÷_¾òÛïî}þ z´››.H䶺`E/'Ò]Q2/…ÉŠÏD}WfåG‡å'—>\ý¯ÿøîŸ÷ö~òð_~õÚ¿ÿᣟïÎGO6ŸÝ_ží¦e-Œs˜ +ç +-‰ç#Aj©™h%ð^Újp·Ö²/N´oœ-½u£÷ëOoýüã;Ÿ>Þ|ÿîü“‹Óçú陂âšBNfx̃! ¹C¤«nËÍøf¿x¶›½°T¾·W{ùRïéµÅ—¯.ît"»íðv':S¹GQðüL0A‰IQÍJÁX.•ÎD”´Æ-T»3…ýéØ“‹íO^ZþÍ'þõO~úÁ•ï-|x·÷h3qw1rt¶°P *¸‡Q8ÁX¢£fæ‡HÜïÖHoAÃËÁ6g=þâ^á½»ý?þäÑÿþó÷ÿõׯýîË¿ûèð`¾Ò*$éµ#Ša}7âsË4žÐø‚ÁµÒÁ…jdo>¸T¸½]ÿà…³=9xzsáêF­䉆­Û„Åmð‘ôT®¾®§º<H²”з—fÎï,6SÔ~Oá óÞËׯîÌ\X.ƒÏ®O%êÙ¡ñš¢bLĉ†]¸óiJÉ‘r6šnhšÁ °L“i]IëRÞæëñ½¹ò…ÕÖ¹åÚF/ß-¦:¹T#54 PãVmòð—‚pÙáðºÔçSh¦™Ë.wKû³©ë«©wîÎ}ùlÿ»WüîÕ¿}åO·?´öÝ{KÏ.·ÏÏ!Þùܧ8aab±¸i(@ecÉj*e=uÞh…ÎÍD¯,&>yóßþþÃÿü»÷¾þôÎo\zñÊü…³Õ~+¡†^Ë(ñ6ÂÅN÷"LJ*ùjLæÒ]ˆ +i…ɇÅN.ÚJ…¦SüA?smsz·_¬EØ\(hƒÍ!cq³£VêÔ1¥æg£áãrj*^[§´"§×PµHƺzs_­mÉÅe!9Ej…ÒÜU2Üp` +­¶Óâ’ÓX¸î• +þ`A¶eæüôæ/ŸrHFå’“0|B’‹.ÒFª¥î.mÖ×[^©¤Þ· 7³¡Ú˜‡žðN$Èh%*҃ŲÕËÛ}<ªâZÅIàüÃÕup`­ k r\Ç”"È5"ä¼,²íã’¨ZöK¥Ñ€vÊBÂ|ÜàFlˆº¨©Õ0¹„+ s2ˆT$´ªŸžðŠN"êa²~¡äfÒˆ<˜esÊ‚1£¼1xd9éc­pRK~µË\¼Ké5?—ðÐQÚcÕŒén!/ÏÒÉy©°&eWOšˆQ‹‹¤V²aa•r`I;âìgS4MÆfÐPÝŒ¨ƒP“3>4Ð'„Ì"¦·ÙÔéZ‰8Ö ++£–Š›Jdß/$g Žqå=k 4æ`+÷"*M­´†jÍ =æ &½Aw@÷ž;eþöiÛó&ÜF¦cJHÎâZmÒÉš½¥‚4)9ȨŠ¹è8H7&Ò:ÑØ×7€ øÄ$*‹Ù¾[ˆ¡m³ f¨0Ÿ™Úá­ID&£M¨l’ &ã”ên¡Ä„krvÖ‚‡A÷Òñi1»˜ž¹ÚÙ~RX¼íäÒÀ‡ÄÓ½©åËV:fv‚HÄ +›˜×›zçk‰F)TšGõ*m%õëhå5%?©9)35áIwÿh°lTm“Í,ú¥"È÷|kcjóΈ—%ÃÕxk?1u%3w=6uH%ûn± äæ›ëwc- ÒòKÝ»ÕåkÅù«½ÝG\fÞ+dàov­E0:дÆÊýÊò Éþmµ¶ëç²^6t›øÿÙ{¯'9Î,_ì]!>(VW»Ã!‰F»òÞeVzïm™,ï}U{oÐ C@ gÈÎ ¹cÖÎîÆjºÒî …¤½éE/ú¤“XÝû "îƒ"Ôq£¿)b€î2y¾ïœŸÉÊüŽ·XÏJ1Ô õ±R¿PZWÖðqyö8/8BufŸhý¡uÞ>þztõKWŸÖigÿ+±‰QåJc¾¶¯¶õÞ%W?ÓþÍnfcyù5¡µ¸y¥6*‹WBã”iœ`ÖzòÛÎùwJçxñµ:ôìÛþÁS®4RëK«wÚÞý¼wøºwò•;¿åKãæü|,(S™Bi ±B™hÝóÚÎKÒõ.]uñ¦uüËîå/½Ã¯˜ÊÌmî?ÿÑædOëœVæŸïÜ|ûö¯n~öã‹oìîñäàÅðè¥Rß­Lo{'ï+óçÍç;·¿<ÿê/Ë“ãáÞ³ååwJûò³†ˆÚ‚¢œ•Þ»fK Ù›MÎÞpÕEF¨ù^£{Éb×zg?_<ý-ä¤Ö9³§O–O¾ß}ù‡êþ;¢¼çj)¶ª4vê»Ï¢”$Ög„;gªp`îô‰ÐØ͹™æ0µ#y+¾:aê»LóBî>2‡7Îð2Ç—óœÓ˜]˵cw­þqûì]y~[™Þx‹gÞä6/x€‡æàÊôWùÐ^:ÓÏ¥î (‡Úê¥Ö9ŽáFg÷óþé{¹}ªµO ñsìö/NŸÿ†¶‡„ÞÝyô³¿þoOÞþõäæûæÁ[½u†úúù÷_þæŸt¹ 5íîiÿäëÞé7ÝÓ·í“÷9±ýò›¿Þ9ÿ +嫤Þn¿Ýü0¹ú¾süóÁåti7Óis˜aËFï\\)½sªâO0(Š¤”cëPY¤5[O›iz=Éå…ã®ÄÊ®æíÅQíÓíhB¨)š£Ú0&qü”wòü÷¥þY’ròR2!ËÕ@u£j—vfFïÒ›?ƒZæÌÞÁÙËêøËJuÑX<ßòÃáóßvÞèÝ#¡4c88{ô¼ìI]oþ²wü]m÷·zéNn¤Ê¢6{¢uNJË—ÎòsÊǙ֧ÏÔz'¥Þ9xíÍOOß<úò·«Çß›½¹<Ý=ýrzö†uFÞøòæí__~õ·{ŸÿvùôÇæÁk¥Ú{öæ77¯—ªiΣܙX߃(Í_(Ý+ÒžyóßÿƒÝ?¡XžKÝÕõ7»×߸}@û}©±ouO³««W¿;zü‹å*ÞÎìâëåÓßèã[ÿ†÷ú_Ù¹}óÛúð8Kþ¯{Ïk‹'VçXkÒÕÃ(å +†Xšæ¹ÊðìýñÛ¿›|þ;wçUeõ¢¼xÎTƒyK*-fÇ_²Ö8Ki(_NSBƒ`cœE–öFÉ åòî2Ç×7Rb‚¨pîëîi0§@ú`´‹j§ ¶Òt‰2úþò¸ž<ÌèË`Ö†—zû.Mr¬Ã[=RVÿ´2»ªKppÈþÉc¡uô0†ƒ‡Ôê|Ù>x/6‹F/š\ï ÷_I•)ctú'_În¾‡ùß}úÛgèžýŒ­-ó’7<ý +×AÒxr}Á”svªãKoöˆ-O0Ù³›K·3oÌNÝÑ9T7]š ¥ž7:Õ›»<ÏØcxIVªd¤²ÔÚ7×öðÆ^ZýÃï*åñ“¯ÿîèÍ_£GöèQP¥¾’Üñþå[@€¢Ök¾¯í}íÌ^Tö¿‘:7E‘¢^mï_¿þ±>¿þ4†Õ¾ïÓw^™£Gfï¼Ô;,oÿ·ÿòíïþmœ­¥…&a/ÕÞÍä懣wÿÔ¿þìêõó_üÅ?ý/ÍÅm”®PÞ1Q=%«'í㟯¾øcuõ2Ë–­î‘Ñ9ú°»oÄjQíqî¢ èôâ7'Ÿÿ²<<]ž}e´wÆ•—¡%`Pž­WJmG†GûrÆã£/—ß:ÃG¸>¤AczíöŽ½'v¯ÜååÕ {ò84C—³t©<¾Ìò±¢FZ¾uaO_Û“g¤5*ÊÍîÁÓ'?6YÏ1Â"ìiyþEipåöΔÊ"Z1Á.ÎP±ÎëE›i9‚:ˆØ®Ž?o­Þñ¥em|åAÑÕDÑLàå@^O¾²gnQ© ‚™¯Î¡îR´ Ffž)-ùúaA¤…zQ© åqœ2ÙÒ¸<»µGWf÷ôXýðk¢²Hж5HÇã·le±’!J+¯´˜Úª µ“À³æÀ^€ %Œ.@_{ÿ cp¡vOÔÞ±3>[y¹ ö_éœÄ1(¢[Ùj¤½ÈËÝ$çA…¶—·îè"#Ö1à}¾YTºÀÈ€öyÙß1^iŽÎ¿N1e8°ÞþËÚâsJýÀé_@>§˜ +gÅÒÄߎ¯óÕ¾±&1+TQÅC¥ªYßÑ«H å°™I>'´!iõÞ%¡vh¡´Ü»]œ¾à"¬>áLŠæØJ¬¬X{+ª¢ÓwzGjci¶à°÷2R?†+¯5gOÕÖA° fêqÌ!õ±X;.hêӠ>Ÿ}Ny-Œ‰€\‘½ÝñɷÓï„ÆùZR £&iMCy9™ñ¢ð¨ µ²tú—"€¤Ý/÷µ–ç WF”žPݱº§JóÀÉIM€â4Ûì2Ú''Ï~=kÏHmc½UÙLr› Z*Ï)c´ó|#/upÃï;–þÆï D÷&n÷RëOü½þXñÒb +wˆÌJëq¢:<¿AøƧžÎgu‹|=^P6ãô'Û¹XAKc"5×üý9É4¡ƒ˜)êÜšDãø ¾/„*´=ûÐÝðùVìE)7„ZEeÀxQÂd¯1º÷ü/ZGßÒåeп9QÁx W<Âh‰ÞRíž‚“¢Ë» q¹Täu„Ñp¥Æ•§|eÒ £Ð9ašG`¤äÚª(U²´ísúàt÷úÛåͯåîM’¬àbÒ;ÆÉqU³s.׎@؃Ç\å IU’¨*»#J­m§ði0ö4MV1¥«vN –Q¹Eë­úìS[)Ê¥¬ W‚”{UZ¾a ë.Ø]ozÍWæ1ÂäkíãwóÛ_ûßHí1xœÖèÌ›\Ä—vv¼Å«›_?ÿóñÕwÖð2CZN}¹wý7¾ˆãzÕ"ˆ¹-UVŒÚÇy/œ¡ oÑÙy ÕZTú€ Â%‰¡Eí¤`št“ÛæêWÝ£KKDî† +*¬#¥–x 4A˜ƒÊìsHé‚_ì•aC†lÇIJªÒJ•”+•Á¹èí{ÊÒeÊÆ‹æƒ(™À4UfÄë±Ö”ÐFˆ¿§´´•ãꡬ\'¤+U†…Y‚2±ÚGfç4IUÿ«‡Z)R æ8UIÐPõéæí¤àU¨YàiPtl=˜ä¶~X¨ fÒ”Å8‹HÁˆ£¡ö¤Ê’±†Zm¡Vg€iÊ¡¬!ÈÜ0å³[ž¾ä¼c˜Û0"…sÌÞõ·ÕÉ5$+µâL=Í50­ï.pµYë•ñMûàugçq}vC—fq¶ZBóVÞàL*M¶ÓL3¢ˆ^»¸1 dåµ¹ž`Ôʬ1»NâzÐßÆÊ¢Ùàðíðä[Ö]2&5n¾î‘¢ËEµ¼©5O´ö©èíúW#¤9¥¶r§i¾ú ÁD 7/÷YÀ=k^dË$_RìîììTß’¥I¡ ôRl=Í·µÎe´ nGqÕÔ† ŸƒYùÓº!ÒL ÀRk#ÁdiWk”¦O { cˆˆíhÑÚ.€ølú4ŠØ¤Ú—Úçæä1Š«¥1+œ‘¶«ôKíÃí8þ“õÔgÛELh…fŠ°Ò¤µ[ÔŒ6è ÕõvytÙÚyÚÚ}ÖÞ¡wA%å6Wš°‡‡7{6¾øUçè›Êê5(Ð ¡„ë¬Pâ«»j÷–öÎ¥ÖãúüMgõZ­D1ʬ;BäZA¨‚–ÈñžXY,®¾ßþ7À),Ÿ@eÚh“RÎThŸôaiú¢±÷7§9¦Ô™]Z­Ý]Š‘n /åxpУúüeuñ¦¨Ž`ÎSè·[ÞÁ­UÎp5»9<ÿ6v€­1æU{°^)¦ +µ€k}Æ¿¡²È2 Æ”Öi{çÅâöW¨>]O œêE¯­’8m‹--þÓÅÍo§W¿Â­q0Ç€’¬M.k“‹<㘰ôþµ+Oõá3T€ªy'üþ)¥Ùv’݈ÓP#yÿÌá©=z‰kƒ,íl§è¦²F;^3”žcÚ˜ÐæŒÐz9¦ ÃXã4]†_! +H¯F¸è« ³½ËX݇aŒQ»vû´4¼Ñ:gYÆËàB™¼ÙÌFŽRiµYí¹½wxM»ËœÜ{eB)õ/©*o'iÀ4Tl‰å•äíçÙÚf‚ûéVR[õñyQ¬¬Ç¨O‚D¨èâ¥}múeu÷µ\™Çsœ[›µ–OÀ-þéz~#Áo#VNÑÞ™Ö¼Œå•Ï¶ó‚ÙŸ~ù PüÓ‡ixªŽ”öi†r¡Šó|¹(7„òD®Œ·Ç˜õç$ý­´JF}ß\•YQ®Ãô6(Øvš)ªƒëÄÁ|•¦ˆÒ`Ý™Ü8f«Pþ¤6¤šôOV¹ÊJm_€¡†ìÃÈ8ÊXÝcª4ß.šÛ9zsŸw'vçÌ[½ÆyѧÅf30z?¯ty…±\å7¦ˆØmÅì­ è“r¯‚ºeØ$ ¨^’*¬³bÝTn51¹akÄ@´!fÍï\’©y=A +‘j€‘꘽ œ%¿Þ» Êg<\P`¹³\­ 5iw™S ôúì‰Ý¿âÊ3„-ô.ø²0ælf¤8f‰å%°sžo®ÇHÿ¨òRœp s&ÖN#†YPŒ_e´V(Mù»UÓ0ó5Úž‚!‚¢f•,WÇÅŒí ‡È=¡zPž}š!Ž›k<šæû/*ý,aÄ +J7ó´[ x„âEŒ”FÓ“þâßrz#”“CyŠ‘rörœO‚±ÉÒŠ· n$/'1;”•A&ˆÂåÊ–#i:ž‹rŸ°ç¤½Ì‰ƒ­HP‘ êuÐäo£Œ¬4ü+²ŒÞ[9ÜÌê?Ù@A³QJO.-Ã9I¯íŠÞ!®M¸o» špÉc̾ÑÜ'亿ù c%PߧØ’àL”ÚžÙ>+sÖ°N'ÍX~û¼Œ€Ë4Œ3ÂÔzQö(³Ë8c®º›çšˆÐdœ™Ò:îŸ~3¼ü^í^&H ž‹˜¡K¾)c¼ßhòwôê å™VßµF>¯öÒbKÕyÄ7N³’°@Ú€üpQhQÈ™@VIS5¡²‡©µ`>'h£AtBçøN°`…Q;/´hg‘b› ÄèÒ.f-Hg&ÝcäOcx° ’j'KZmÉÕˆ¡qL–vÒR+€È ¸ò¼8–e*ríÐ<6;“ÓŸ›3H NmÊåq Ãl¥ÙSô‘Þ:ë¼cË ¢¼•äE=Š¨[)ðUÒša ÝkG ðãE}=JD +2Àx^¬L±Õ¼Ü Ï—÷µæ¢ô$ámyHQPÂ|y©4Ž¤#µË­œ‡4`¢Yô@$'n'è@’O$Õl{í½Öè(˜¢¶´BO¨s¥0bn$¸Ÿ¬'S˜føuw#B…zo@‘¥d׃òÉzªÈ–(¿›žÊk1ÄŒ#z,'ýe)7Ûë1–TºÙmŽ¯Dþù0ÕQÇ”ü¹çÆΗ¿ú'³¶ûÉvq-*¤6(“"¦ä1Ð.ÂU!«áÀ ¯ŠBÕߧWo îˆ1 o®·NøÊ®Ê×AçØR×☈5PDIÒAÐrKgxU™Þ8ÃsÆû›°Éõ(ªBnÇQ“; bÁ›på%¤"B¤^ 3s|­<ÿBë?UºOĦß‘ ¢Q¹$^`*FûZn\²î.[Ú%̉¿al¸˜)ê¼Õ¡ºPÚ•kg¸1‡w•ê§~^) µ²Ñ’ášEs‘予2RêÇjí(hãLŸz$f-Óï\/×–`3“¤¹™¢Yk¤8' É–›aß‘)ˆ—sBy®Àƒ$ Rà4A–×Sr0§#bWñ{² Ò¨ fN³Õ‚ z *H›i QúÎðÖèœ"¼wþòÇÅåÏu˜åÛˆ6ˆÑ•­¼ÅL(ÏpÀP¼}Üð7±ÌbP-PØZ˜¢Ô~†p …òt “zjeW-¯p¹ ©¾'?´¶—†ó›|+%f…!˜ ±h?áíÙ ðéZ”ÙŒs@a±¼ +²Mq‡˜Ôþ³ÜO·4á&0s;)< Sðgs},8Óå®E°í»@•áJ'KWcˆ•ÂL·¹ê.nAÀo¥TÂÜ‘ Ê1ÂI2^„t?K²ëI&RP(}¨7YgœçJ1 Е‹ä8”w¼œÑ­s]T¸ÚC¥V° ~*>ŒÓq̆ÄÈ‹8®úB‚±ÁÚ`úU:„ÞƒG7דl0'A†¤ÁIø<pÔ¥ÈH®4‡‚©]µu"ÖöŠj/Ë{ƒPeàŒ6Sl‘)­ËX#H¶,åy7N«u*Š"˜ @LjQ"àªÔ©ö€á·¸Ò׳jžIÍ HK¥vfÁ?Ý­4À¿‡%ÃUµÖ™Ô8EÕ.8ñ(n=H’1ÜFåíhA†:ŠKQt{=ÓÖ〠’ÑÜAå&h(§1î®Ô¸¼c¹\9ÚL³€NÀtaT[Ïp¸>¥í…Ü>©­ü“! >stream +ÅêQ^ì¤H7Ï•1µÍ»‹òè‰Ú:Ï°­Y‹âÕ4ÝØΪ€PÜÊ°eDjÿÀ,‚÷u º ²Nëœ5¤éj +>%IJ~Ð aäY—´zBm§2ybö¯AÛäØ2&ÕI¹Vî6æ·ÀìY© ˆÁÙ#Lð2¤¢”Q› †è`b)KÛYy©’!Ì`Š%¤ºZY°zj$6± F/Iƒ®n‚æ‰a¡6¡.Äê +÷{™ A9ãZG¨,RLü8ã øGrë”vw1} +/Z`ã «õ iï@1æ„[žPýßÝJ}¶…´)°MHQ¨8sx3¾ù¡~ð®<û\¨³ÆÇ›H÷…Ögb5€_$o¯2z,¸KDêËCÅ¿’+» Íâ”GÔ·ï.ßÿñùw<}ö}33`Ä„fAh‘æ8I•A3 g¤5.È­PAÛÊjA Sº†*]€È“0fd„ZâƒÓOþ)b?éJQj£R#NX }ólE-/ê“HÂpÑB¥fQ@øvQcêäPÀ*#œˆ‘ÙÆ{¹_šo–ýNR½ u1kJ»+ÂGq};C“Ö€«îTŸ;³g¨>Êð€leøU^¬æ„ +YŠ©0¥ÒìUyö +àb-RÜNq9¶š¦üö… »Òl·W9¾ VÐþ“­Üvœˆå…`ŠÎøß-v¹›f=Ðrœ;J16©·­þ­Ü<—üÆ—ƒ¢ZdJ¬=4[TÁ,zLiZ+‰»”ø0†‡s°¼ üôa*‰Œ9$µaŒ¨l¤¥´°‘ Ð? c L’„:¤(÷Hs†©CX—Í$³óaçA ùÍ”Í0¨ômΊB—ww#E‹²'liÌæôÓõ0!g¸.©u•êL©N7b0.&,ëF’_OŠ9±AÚ#ÊžIÕ}À"àkÐrbíXªì°FcJ¡4— kÛ ¨m##Â#Œ¬5ÖÛçZïšò2R?#å_C- di·—˜1……^†lLѨ‘PAý°ãhnå[9“êgY¾±• B»ý£}EÙË8 ¢½Eè0,¤Ú~˜dÀø»ƒKkø$-t"¸•ðéœ ¥išÐ²l‰±Çýƒ/g—¿ ìQ˜0C˜Jš}Òš†‹f@lÉÍKµ{Ë”öc¸ó ‚ÒLšrdü+xÉ*”mÑXäå>ˆ=FëÓ\­€Ùoï<±ÆPc‘¢á8¥$nj;Iq ìŒÄ9Óêü¹·|é-^¦¹:]ÐE´ŸN£D Ïqh{˜¦œ`†{ƶâ4$v–.}²_ÑÀ”1qF"„ý N­ƒ1Dµ$®†üKzøÍ$÷iH`vÞ'  +ÈõjØ:¦úW>øß!æô(VôSš§ég2Ï7ÌÎ¥Þ}Ä–V L}»Ç·Òt‘óbñ“Í|¤`˜í“ÙÕ;gtš•’ü¯ÎÅòP3hxÊY:ã§ÕÛ$SÏòÝ<@%ß +Í4¿‘âòlµÔ»lï~Õ=þΞ¾ Œõø.Ž9ÀnIÖËHÊ݃,ëG`:@’Aù¬'HË,[çÜj°”ÛY Øg3Í…þ¯>ÜëH2ê‚;Óê‡@(q¢¾Ûê\q”j%ƒl‰õݼ>(C¹}Þ>ý^íÞD@~$è­™,ª¬>’«G¨Ò'Ä‹ËZm óƒY˜U ŽJm1î Ž$/´³\‹µgE¹#K ¦FÓòì¥;ùœrVY¾ î=Æꩵ¹;¾¤Js{t[ß}Ußû +·¹P)FóØ>ΫãÛÆÔ~œeb2TŠ„ÕŸ—g/FW?0Þ!€€ÏVL•Pû¸Ú,ªžÜ\Ñå}Džäxÿ I’t7“,Ä+(Wbœ!6¶´"ŸP‡„Üfäµ(É+i¢Î÷ÙP˜@”5Á•!(íOƒèO&IÉ?É“À8á’öÌìž—G·”1f¨8*ªÕ™æí}¼™ð{‘Ãuó\ä"`ïz‚B¥à?_ÞóÛ.ë³á…r&k.Áe‡òê§4†I¦ ôFìÍÿ XÌb&!yˆXKóõ¢³ª¬¾êŸ|kv®h}¥ÄÚ£ÆêsàMÌ-€`IkÅVö ˆ +™gªVcÏí¹ýK˜Ûí¬ï*˜@^d°¨¦…W;Ñ{W\}Mâ%>@ÆÛ0uð†²1Ë +=øûzšäÄiû÷/4ŽÄÖ™Ü:#õxy˜gXÒ˜PÖ¼9©÷H XµÁT¹ãGÝã·“Ç¿£*{ äD0Í°j½ªspàJÞ1k/6bøVœðO¢:XLkÇI0¯ì3.Èõ‘W+êc°o\i™æ›à¶{‡²¦˜ÔÀä©5¥Æž3¹š\|;¼ø¹Ò»Jqí(^*Ê s¦y¾Zú´³ëwö¬îf¤V±ÍdHKp§²½înVé§A ©C±ºÏ8sàSLkÕüó$ˆ b¢ÊÌiŠ,'1s#ZL“º^ß‘k{\e?Ã6¢¨.@rVxVyé·Âa*be‡v—y¹›À+ë À4Ä-ubˆê·û!K*d~ÿJ¬î± $(Ûêà’7GòI&Š/ÏåÎS=ÁÔA23P fe¤6ˆXѦ­%m.¡+8þ÷G#Û)>C–@uÖ… +zŠo¹¤q'Û9ð¢xÍ?‘ÊË¢ÔA¸F–)iµekq“@T@Ô0f&¯  C¸»™U"¸Ã]LjƒÈÉÐFÞWA3Tš¦©f¤èÂG¬%éŒPÏIçEi'§ö´Þmãø×úäyAîBA¤ÇÉ’\=(_Ò•“œ4ˆåíJ%M;~‹ym| +ÓZ×zPà•yl>"µµ¶ó5(À0ª×f·åÉi·³R=+ŽÓ¥½,ãE/X9Žö/·Òb #‡sZ(+g)ÿ냜X!µZ{ÿ[]‚ Ì -@ÀÕ0¢3îÓ‡QÜ÷/ý*-…ú1aŒc¸¶1M™´Ùåœ6©7@ìIc÷k©y G›ck‘¼HZ£œX‹Vœr„úîðä]gÿRbµ@» ïKÓ'y¥ÅJ`sHk^™>U»¡œÉÊ)¼ É ÕZÐFa¼Ų‘¤Q±&•§qÒÂô ¢N){§µóÀ¤ 4sŒ·Š ƒA5±uÿö1ªŠÊTÑö’äã­üvšÃ”.¨÷ÍŒ’Úæè‘2|j Ÿ,ù4„Ä€>À|!r;FU’ ‡µ_>€´G…€çƒD¬ +Ö/ +9VÚÁãƒf§ŠV$ïo¦Ê¡½’6ã| ©ârÇ¿wƒ¯ÆŠÆga `ð–6FE¹¡KÑ‚fÖÒ\m½ …H;àßÖ]ÍÉCTËÞˆ=T¬ã r;˜7&¤pÆ¿ðFjeÄ(OTëaú¸4ò·"—º—1²º•Sc„÷74p³œGHØûTé„°–ð>)ÒBÀÒ¦\;îÿ\ë]âö4†Y›"Å‚%—ƒäŠÚ¾qÇ/9o•ð·†àAŸdA_)í(io¤éf1eÿ¦ª¼Pýiy! 3DÙÿª‘.‡ÉR^îpÞ~^í=ˆsiª.á¼™e½,W…—äžÒºÌˆÝµ„¢®ìˆõSðƒ|iÊX€'«·ÕêÓû¸9Ú.kIp^@ Èò0*oåxÉ[¶÷žM.Þ+­Ãí¼*"Šèœ96[Gþ÷˜tU¬ì©ÿõÒj=IÿéZ4œ“ŠJª&J• ÷@é>uf~.TjEQýÓP1Š($ ê"ˆö0J}ÂÁqƒa¡Ì‘¹ f[í“—40[9hⳤK)Ä—–œ=.ªÝ(éD©úFÁÙÈšyqdŸè̓f$ŠºTßë~µ¼ùÑè\À2­Å˜5@?²ÌØsÍŒŒiÃý—ÿàíƒècÐê1Wvç +jö¿ø³ÐOÖó¦Ñ<ÿ¡sò çÎá8q`ŠJ+˜S‚y¤B^({~ôê¥ú9nMB «©r„(Åi/-ôòÒj'EybyŽ©õpž ÀŠçŒ,Ù`Ì•7û³Ç[ˆ,WÃã÷)®–“Z©"K@Ê ÛH{ŽÈ-¿+4é”;~]™¿“giº(C،ޓ+ ÆŠÎ왤›œ{ltž1îþz’æUÿ¦Èþc¹u•›[ˆº•Q®AµQ|-Š§GªjÝÜœ +ògQ2ŽYðx¥"E»hN´Þ£Þɯ¼½wTe?X„ d¾¹–×"Ì–±º›¤=¾z´xü‡Êüu˜p­ctÎÕöí,“ti#'mäd\鉥e÷Á3E{±­5OÕÖE‚iùça¨8 5Òl%A—âT,CŽo |Ý·Bi!A¸´¿ñ…¿ùüs;-€‹ÇA,ý WAÔ.[90•ÖYµF™8Î)-ˆñ‚´ÆFÈ4Yâì9ã,Àým$HÈ ¥²1¿¥qmÚ<ú†¯“Æ•úþœXƒrg'Q~²•ÉJÜ9Û+³¯H{Q@”ò|zþ•ë›iáO·ÑŒL9; –¿¯·ÿ°X^§ƒ6óYœM²mTU&/ºG?O’•æ‚i Ò© ö í?Ýƶóz”(!*ÌÞ1"4‚Ýì?ZÜþÁ[~É×N6³ÖÿñŸÈèýÿ}ÿ_û@îÚ¸ä®û@îÚ¸ä®û@îÚ¸ä®û@îÚ¸ä®û@îÚ¸ä®û@îÚ¸ä®û@îÚ¸ä®û@îÚ¸ä®û@îÚ¸ä®û@îÚ¸ä®û@îÚ¸ä®û@îÚ¸ä®û@îÚ¸ä®û@îÚ¸ä®û@îÚ¸ä®û@îÚ¸ä®û@îÚ¸ä®û@îÚ¸ä®û@îÚ¸ä®û@îÚ¸ä®û@îÚ¸ä®û@îÚ¸ä®û@îÚ¸ä®û@îÚ¸ä®û@îÚ¸ä®û@îÚèýoÿ‰ sí?‘ñŸom »#¾Üÿ¨&´Å(¹.üÛí?2?Úê&˜Ãc~><žïíö/ÖŠð£d<]K¸ãþj-ø¯Ï\ƒ'­Y‡óé|~XöWãÐZžŠÁ%×RkÉÿ«]|+ Y$žAÒù4’Í&‘üZ¡€fãù$R@ÓZȤÖvþŸ„dâ¹\2“Ë$sÉtfmå?©?Ë¢(‚²ù|ž”ûð*MÐd¡ðÿò¤ÿÛÇ­þcŽiõÑì#ï£ÝœÐµ`h­æATÌø£ƒÿ\ÊîÃü‰óÕ¸ø¯eÇ0#ÿ×d«`¤üøt>»»V3?j®}˜MÿbþÇ‚äþC$Hv­½–N¦ÖRɼÿòÙÔ ü_þûýûÿGÖ2pŒ©Â‡ÃÍ®}x‡¶¶>¡¿üŵ|M§>ª)ÿY†©DP-†yÞ+ˆõçeèj‚ôrbQ9¾‘&KÿÚõ›1ǘÚCäVœtÂE=Œú}4ÒL9ËTE½(T ­Í¹Ò£Ú° ²R3æ‘¢±™À7ch4Ççئw)gŽ; Ô˜d•NŒq…µû¸ÞNQ%BŸpîJôŽòr/EÕ +Ú(Í5b˜Ê+i¶–—:ˆÜá*«W[K²~Ëfº ÌJIÜ!õäíö$¯´CE-I»qỂåmDÌ +UÞÛ›çJÿ QÞKrµ0a…ŠºPÙÕzWBó˜÷”Ö%n/ÒR+XÔób3Ãy1ÜÚʉ[I&ŽÊ)B/ðå_ÝL1ðYiÚ ¢F5#¸áëp`YÎC¥V–«¥˜ºV?*‡I¶@Œ¸••"E±Æ„Ö ¤PNĤ¡ ò\#œ×i1^4p©e4Žà“¸… +­í”𠌇óZ5c¨-Ú©——ûY¡“á[ëi1ScE;I”RD ÚðV1ÔÊе0bl¦9˜±æDP#‚è¸Ü%ÕA’,ÅŠÎfVù$ŒÆ×ÌV‚IaFŽró0‡y%樺Å~È­'é`^†—‡3C×Ód%Ž9Œ«Ñ¢±ÅÃ9y+%¬ÇèxÑÎq­ Ý(ð¢2À”nµ.{óPŽK%L2¥9nôƒ9)˜„°Ò4LW/ÉÖ#• |ƒsfŒ1LMÞ™¤F79A8¨2(ªÃE9”3“Û§Le·`;a–©²<û¹38Kv‚°Ik¡uŸ +µ‹œØnØE5TC¿gGŠ©Â¯bD9†—¶2âzÂoÃF¿-‘X‹“nŠ­‘ÖLi]•†·ÝƒW Ö +c +n ùú±1z&4ÏsÚ('÷±==üº¾z¥K¼LÙKgüRíÜæ”QNÄÉÌd¬h&qÞüC§Òê°kQb=FùmaÙÌvJhĨJœªÆÉj‚©§¸jàCó œÔ ¡~÷ØPA Ô@ÖoF)(ʉcz(/ÒB$«DáWi)…•¬Ú¡Z݃¼z¶ìÃñiÝN 1È"¶‰ÈÃÓN’u\ž’êd;#ÆP#;Y¶9 !|‘úŒ½ŒöǡŸmg!3‹b›ÖÇ”:Šcæ'At;)Dòþfæoe†Ñªç¹VAhg÷AƒÃH`ÖF‚ÞJs0aÄZOÊ¡¼Y§«ymœ `šäå‡0 Q2‰9Bù@ª å#Tꪕ½›×Ó?|ñ'"„9ñ,ö/ j/“?‘AŒ­¬ào‹S (kDêý,å"Te¸÷š²‡Ûy-IçèªÒ¼çY¦œ&í$û¡5Ò(ÍÔâT%JV³RŸ¶—rýWûqT¥õžÚ:¢J“¬TËImX_TqåUkùœugIÒ.p5¶´KWrR?†•©`Š’„AÕµ8±™b!ÇÜÒL=Nx9®“¢¼ëoŸÈ iÒÎ •(a&˜ +WÙ¯,ÞÖv¾rg·1ÆÊñÊîs§Y¥Ïy'¥Ñ3½uZŸÜªÍƒßUǦí`fNS|;+ÓþÛ–‹RÇoŸš`7RüFJHÑ~`Fü4ˆn&ØY‚LÞÌ+ˆ¡j ¦“æzTù0É{ë)æ™°¼ºžä?‰Pœ+ÎKQT˜‚?cE#’S¶bôz„ÜˆÑ Ñ¼F«ý¢ØZ‹Tðóςŵ0þ ‚ójŠ©áÆQ¦¨…»¨Ð†'dé:Ê·X¨ÐácXâÿr-ZÔ:bu,¸G×£D9AU¶2 èÃ<¤Ùjœ.Eü¶b.£ö:‹gÀ†)ºŒø-KF Ú[Ï[YÑï=¤Xgâ7ÎPZi¾–[I¦–ã[qÜ eE©¼pF×Li*T¦¤;ÎIMÌ’Î þÌóÒU½v@ÚÇ)z3Í'ñ2®3l#EC1–·srQÃ@yq+§„„1Ge`íV‚,eY •›E­‡(þþù\í˜,¯’|¯îñ•eQïÑö0¯·•öE{÷½3~–æ¼í‚²!.@ÔO£ÄFš§Œ™Þ¹•ëç~k0¥ë÷HÅÆ+p[iáa’Ýöû\;Ñ¢•¦*)°^„,Ç™fŠí"ò”÷®@ DýFØ{¸5ßÌHÜzBÈ2µ´¿?¼ÃŒ$QœIøs"¯…°PZ ¦…­8ý0JÆ‹V†ª2òó‘ài `äã­üF‚‰-Dên´­Œ²QYàD˜„NÜo/Õ€´ ü6I{yi¨î'"n§YHì0¢C>D Z†(%1ûÓ`q+ÉoÆèO¶ +1Ä…i„‚è ,„­KΔ3Òë n+-o¦ø`NI1¢¾ÃWh{*ø¸·#FñO·³ŸÑUvšÇ„1I°-?.<\`Ÿ B ˆ7ðó8å%© +¡Š‚Éii®Ž¨#ÚÙáÝ9*5’¸ÉêÃÒèiœ(…5Z4sBÝïz@hAqQæT®ïÇi÷³ÅàÍÛ˜ÜG–í  ^Ý}óþïǗ%ÍœÒ-lûjãÔèœd¿w”X1StUg¤sH:„¹ÂŒ)ÔN‘«RÖ$€Z@ÖAÄJRUÒ˜âæ Õ'rurô®4¸ÜFä,WçÊ{z÷ZïßêýÊIîâÙÁÔ¦³Pm’i&Ù¦ (mˆŠ-_¥dDXîœß—Ó !<Ây€+ ÕJU>f7“Ž­EÕ6SR¸`DZ +­0µýÓ(¾ç#h¹¨¯(g´V¨2LPUÈ@P°4›qòa¤¸'¶³B–ö®‰pdÑ åÔ`VfÙJÐá¼Ü·gDé­”´•!µ¢ˆÌ+äg‘âŸ>L<ˆà› >˜5 ]ýFÕH2ãÓ¾žfáð i }V»¦Ó j&?”Wg> ×£ôz” gõ V ¦@ Ô|FÿO–ÞƒÉûJûýl‰äDÌ rN:t£‘9ç8À`rÎä0‹I¢HŠ•,Yq•¼’µV–夵eÉV¶-Ër\¯÷}ïî­ºuïi¾· +55b€8çy~Owcú– Ûá)Ø–ro xA­r‡G#Àž;8eaÁ‰LXêëP*N¦`À±ÃÃ÷!•Mç€ßŠŽš‰#FâˆrѹduwÜšfmÀ0¯Ô²kbf àÊCE‚ÉŽ?=ppy1´3 2Xæ”Jëj§äò>«E$x'?_ƒJÛ|f@ZçÉh vÙ ¢D¦IyZÈ-$›;›§ÊÌìIÙ-–Ðp w 2 *íÚ¹"ð‘Ö%§‘З›¯zð•›puŠíƒt÷ÄÑ QC…²Oªy ¤:Ÿ˜‘‹«x¨®÷ELÆÁ(7ñdS‹Ò¦/Òb“ýÕƒûü…¹! d‡n’ê@ì ¨PÉ :O¾7S&DRnÚ"VAç 6DÆNçl`#ÆMø¸›´ð€ N¦²È®(÷v7àP'F/È{B¹q 85Stuã=6`G4®1ƒwÒBj~;‘ð 0y„ÎyùŠ‰€Fé]@•ÁQ5aå¡À@RÆÔ¸‰Ò»%ÇI;?jð M:u΀ÊÈ i°=Ì€ðx@Ù¨l¬r^<¡qK0fƒ¬e¿n#.:;ióO˜é P!#ã×:$€®q#9i¢Á%O9A‚†µ BðÊÊWƒÆ!@ý8ˆ4Øn½aÀ{+™²Q°¶³/:i¦¡VaVŸlôHC zÐF¥nÞÇ<8fÄ”H"‰'`/P±(ìDêD¤ë¦S>6™onÅê`N.ïâó¾`…‹wB…%_¸øÊ>Q¹Ÿ˜eâ L| ˆØœÍ y¨t¨¸8éâÆíT6TÚN´Ž¥û'“ýãH¤ +a3ÞØ£Ssj¯l ’6&Ç$çü¹5k¨Ô„!yeå>î HŸƒÎ0‰?³œlk¼) ]4EÐ)7—wû¡ÛX¨i£³àž°°ˆ¿Øo!lr6Ù9A¥f‰øt ¸dÄcãVÎB$¡ü ‰ŒÙhµKZ@¸’róh‡8¢Ç2Éǧ-dbĈ7YÉ,¨›+¡QXIø¡•7ºŸe•wÝ3 |;•+pD‡©)WÞþ©sEôîø¸Y¹‹ψΠð{í R¸P ¤<|Uí N‚÷¹BV”:dÀ) o¢4¤vštÈê ½+lD¢ŠNA'fbH‹ŽBÄ0 n“`]"¤ãHzЙ={D‡þÓ¨yD‹Ú¼qhYÌ=¼2#¡qðGÔ¶š²ƒ¬AøTn=I¼AˆZV’>È)&VI©î“*ZÒ2^©naÓãVÜè 8(ÙëÏz%65ç 7°Á\t˜ (Eµ)8¬¤§ ÂU¦Ü~*Aì…MT’ €œ™„¯6_Xcc¾«kÜ<ì…Ö))²Æä jí(Âۉnj.aÂDš=²Î2 a‹/ +¹ú4ÙFF'm 0ϸ™€úW™X(Sþ5 fÌà‚Ñâïn·¹yËcpFÐ(Bª¯Øà ß:n×£@‰€÷ãf¬Pe÷C<Œäæ#ùþ‘ ã”Þáôú¾ÉªÕ"è\¢Í•ËËfŸlõŬިΠÛ3ùL?(yŽèðI3opýÿ÷4w³å+O6·œ\úÚ3jÄGa#Ü'W7xÈ@­µvû°Å7a!ÍhØ +¦Ül=¥…«ÑÌ ±z VFÍô”ÃÐNfèØ Ó»¬îš)…š¨äŒÖV#€ŸÓ_£ÓÒ“]äöüö:ÕýʤcÒÂñBŽƒRÄ‚[ŠV6´¾8`0€¤{ s"Ø$Â-pR'Ïv÷mœü•q=ÌÑDÄAB]|6Ó9–êB‚5*P.ôö'œôWLJ&l6<#aÂ0,haPºuÂ2¬uO˜0ÃÍ\ ÕnÆ¡¢Jnª ,/<†´@b‚Kyý ˆZ¦G¿ª²Ý2n9<éáw¬uÐy=Ô¢âˆlTѵ•´ + np‰d èO4G,ÄÍÃbQˆKÝ”{^i­•s`1JªByØ}0"GO˜)ÅÈ”·F‹K62vXíïƒv0£q'`*À9à(òùÓðÍl¥Þ7®Çà•Çô¸™N+NÛÈq­Û挼G¦ÜàžŠŸÚƒF_ÜŸáêÈ”Ýêbœ>Ao§O¹ÆM´L` +Äv÷Íûä*ÑØLa7ç;È8êϤêqÀE¨+†…ß´c1^žªw0)y“'`@èYµK0ã2$_Bª@ñL¸X;ŽYpP)È,62aÆ¢&_HÎÎÌìÞ…G[óÑL¨’Ñ®XXv +Šæ(wF´ƒNˆé›Snwèô³õw>h¬é¼.XW9„>j¦œlˆÎb¡.›[50ƒ;Š‹u0ô1` oÞ(؉’;S.îˆÆ *ä`€uyÇo¡bf*n!äT~þôå'µÿ­V3àâ-+.«,ô»y¤4NËÊ}fÁkŒž€ÞÅ›ÐÐ(ð­âw"j,¿Oë Ö¢F4 ÁÖ䉘Ð(Øß”çäfoíŽdsû+ãÖC*˘Îm„±AÛêqH‚F_ êÓˆE뀣&í$µQ­*Áè’p¡Â„..5b&Á1A'©8ˆSD©”‡Jáþ"<Áê û£ pÏ#Nc–)3atŠÙ.ïOöŒ¡ÍÇ >•Ñ7i¢Tr"¤Ep4ÜŸ&Ä2aQ[(žsPYPixΈј© ˆ®SÎa bD€C7k›2úÐ’·N¹†õà¿´Õ5CG# ‰#:¥€ÇÀ—¸Ù+™Ñ —ËRsh¸i¡’4dP–ƒ™|a(*7—ó«nÂZÁ„É´ÜaÓ3v:i§’..k%ÁìRL´áà³£6~ÌÌrBœ·Ó·’62îæ2°ÎÞpÓ@ÄmLZƒˆ£PêxœŒv‚åuyK̘˜Ì¤äNR¸•³R6& n£ón±e$stlŽ–ûW“vZï h¬Û”MT; ýIU6ê°ÆqˤyHã°À8ãvÞŸlI™®ÊD€¹ tý°Ú:nÂa)p©…ø«N®¨E‚Ä!þ¨,¸áæ)T7ɨÄ'æÅòƨM!.h(xÙµcDãѺa#£ÕX+b ì…h€—u “J¬óCm«ÝA+‘€n² á[ÇŒcÔä èÊm‘‡uè¸4–ÕB“êƒñq )=ÀIvåÄGtÏ åæMXG´ža­œ5 ¤HÈË—'-ì„$ØâáI¨@Èڣ¼»3ñð”{Ì€*GVaF¬Áq’9`]œ0Ñ*=”VX㯇t,ª Š‚×HuŸ×¹]ƒ^1´Zï‹é})3Uà’«ÁÊ>›[1ã1•éиýPÀ‘7 ¬Cepí1#aE!ìäÕ.ÞͦP.ëª\z‰ŠÏšÈä°‰´±9;›=„¾öÅ—éü.–˜‡ÿÒy"f"e¡aÖQ•ƒàqѹPq‹L›ñ´B´…‚%…± M¹”CÜhÜÅU]\ÅtóLöf§ÍxÔÁgŒDÔ¢hWÆäM€jJ3šP›°ÚÉ@0tû«h¨c!3zåL1¤-ÙÁ(‡ò`FÂdÎ-Ô­xÚ†'¡_ÀOÕfl\ôb‚êrKÀ“°26*­œ¢µ#ÊžzGµè°Ú3f¤Ôî ÏØé¢Î×zâ6ª€°E‹µ‡Ø qÛJftHÈN¤ˆ`[ ¨¯õ˜]“›2à 릋FoÜè‰jâˆR0H„KXð´“-P¡6!VULgõOˆ6üá©[UVÐ(pç[Uv0»¡›§,MHxÔ@j!k‰['\MTfVeæÕ6?/·P>ÝguK ¨€OÀ„£Z/TÈ”9çM8O8Çt¾[&ÿ FAØM¨pÇä•aÓ}#R¼Ã/ +-2¶(涽á.l=t:Ÿè»aHVP]ÊE§}bÅ'µ\L ÌH"d&šx¶‚‰h/Ú8`ÓKF" é—ûn±>aåÔ?YÇâ &: ›e%Ó¸i LÚ%Ðdb‹d¤ï¤³¶`ö…h]OÇ­Œˆ[±ˆ›IáRSkcMN!ÃSŽÃãÖq-†ÐÊuµ ´@lµ`À„Æ”£` a;–2¸ÂVOÊéŽhþñzLëÂøê¨õŸ†L#Z`<å &ظ‰1x¢Ãzü– ·KQÙˆ&-¾4ì,BÅҪѼEe¿uÜ +…ª±ùÍHÄæK[=2h +pÆC“®)3CEÐz£â'42”Ù¸ Â2ø#fªÜW <‘axvyVÃHQ£“fÆÃUˆhwÂOfìtÖAçôÌMØagØD@àe}'›QÛyÖ!ŠCi <ši@\„ÉãBͨŒÜz„·²ÓŸ³ñÊ©"¿D„šh¨mÀ”S*&oxÊÉŽš°1ˆe@£NÕ— žx¥ºS쨜ü¸…QŽ< L¬Úh )iì挂©X°E°T¨Ùˆ¤„quhÔA¤¦—.¶W.h‘À°6@çí¾0†mÛ¼!½qQ‰1+y‹Æ1dÄœLžŠNƒ®báŽÖ%¸i(ÑÔÒ¸Â&_H*Ç "Mn RÿΧ²20fÈø(“÷0E«/­¶KÀá&wPeðB4S;ž2*30eŒ˜y3J-¢LlÜà6yÄq 9iÅGuÎ!µ ÚÙ콄LðÙC*« +€ßLM¦¼TÃj÷°Ö %úË:EB‡äÂ2.2ráÄ2j ûÏÃÆ[Gm#Z…ÌoµMè© E@(­¾2zwñ×õyÂ&è<Ñ)G`ÌÌ™q eî@‡:`[`F`¦c:DËÃ*û„ÕÚýÊA?5eaÍÊÌ°üµ¡! ‚ ÒcaY†°ÚØ( Û‚¸=š=24…Œé Å£!;ùxˆ6FÈžžÐa r+ä6lÂ' +PAŽXµi'_·AXp¿ÁÅ[ñ0ÛøÍñOùxßåÏÝ¢C4î *–QôÊ€vÖ8ƒ:wtÞìæœx´bÒ!}ID¨c¡v¸¼M¦çF¬€¦<*V!kV»o™rÒ"“vò/íI›`ö%¡‡Ôv•‰Z3c169“nïʵ5ˆ«f( $bõBŽ!dÒå‹"XÌÇç†`Ì´ ©Êya¨ŸXÆ„"ÂçþÏÁ¨qi%’Fo*bÔ‘)¨7Ä%P*X1RªøÓƒ®Í´~#zR´i`/”hf$GuØWFÌ_1i½:§d…ÙуKÐXi“Ö#‡&Ìc:D)3e¦ÔfZ ¤mħ,À]ö¯ éTüPkå¨ìáò$'M4B¥¼\ê¦;+áÞâÈ”²}ÊE5Z¸!øW‡4‡FÍP¢NoÐî ˆ‚$"cÚ½ïÖ;nók=Ê¡˜›§{š¾`CÊ`%+þÿñˆ¬Öààu6vXãUI•v¿uÂÝgÁe³7Qº Ñà•ª!d©A¡*¥C‚ʲ»ÉðºSÄÍ@NÞ<:m‚_Ç¢cvn¬ßÎ;+œþIŸ‰¶ü™9:Þ7øâj'aâ§ÚNêö\ÕÇUøØÀÎdÆ܈‘Só.úšfW)GÆ𠌬X⌃Œi b£Éº›ñØ.I•›´û៣FäqØèÖyF€­~„+!|B ìã”…È„F0aQ;“%c<Ü´âYW•»EeÖºMˆä†p +ªEè +k=2 ñ¤7"ï›…e1c)7[ri%’ØYèP€ +0ˆq=>¦ÇU&ZÂx(ÝO6·n¸UÊ2¦uJÃZøÔ˜‘7óZ7T¬8¤ñŽ¨Ñ¡)ψUˆ#SžÃ“ˆÊ@éì~”ËAÅr”«éˆC*Û¨ À–š7G4È„ Wé<ê‡ÆL@qå¡Vµ6AJÎÛ‰Ð? M|åˆz +†§EÇtø˜Ž€vV™€+Èh_R¨] &”è¨ÅmGü@5ñ[ÕÞ1‹rm•êfvR{¦”Õ€¸WNHY8P?;ÕÛØ[ǬʥePÞNQ¹¾ËrñyO ì`2€ &_ÔJe‘@ËèY±ˆE›Þp]eåàJb#SðPÎFY8¥÷á·<ð:â”[PÉ{#ð¿Þ@ÕA+§/=l†Šx¨ì T­tÎÅæ\LÆ'–ÌXÒ"ï¹¹<Ä4•³±£6`æH®}€ðYƒÛoòG,”Ò5^í +Û© *Ûì­tvÂ8¬'‡ô$¼ ^„Lz[€í© "VÌTâ«“öC“6È&f_ÌAgítÎLd¬dtlÒJÃÏÿÀyãõ£ñú1o ã`J KÐ8“Ð,¤Þ­ða=¡G‚fåkXÚˆ@ÉÐVS +â˜ÞCýu\¬C¬UW„]‘>XãP4¬†ƒNáÁª/T¿EãƒÈEš6ªAuΠÞÓºc&B¹ÔDí”´VP0òЄëÊ FvóÈIHUHºÆ‚FP&£µã:¯ÞR£ÀÃzwÔØNÄUZÏ?Ü:ñ•!툱(¦‚ÝwP¸Î0ïÊž`~Î$gøÜ’P\7Óyž0áq' ‰CImDRçÚèÜôÍÁCŽ³³¯Tupy bØ_o «‰p"X¡äŽÛ_Aüe•~Æ‚õLc_.oà¡šQÉbQÐ"3‘ðˆ5€dÈbn6‡ˆ…I ½©ÜD$¡æ½ájšÁãq3âãö¬tZœC¤ÈØŒ˜_±ñY(õÉ›'@÷†M4T#¤<4ÔŸ°‹G y˜Þ#yCuÌæÇ­h£ K8¹"¨L'£!bH7‡ß€­x +“Ú0wƒrÍUÐŒ¼~蔂•Èڨܔ;¨óÉ?µHPêGeQ®1€f‡ê²Ó ØÖzÀâùQ½×†ÇŒJõÞø¤3Mç 6ZÕ €dÂÆŽè•ÙÃ:/”–KZ¼q7´ ™R齊e8D(B¨.åÔž6cIHâ u*®³s#7¸ªÖ!i”%âí ìhÈMÄH©¤2ù&ͦÙÄ4ÀÍ J¡1 0erÖIö 9ÈVÀ9ž0ì ƒ-Yé¼¦ì‹ kÕs‹P ¤‘ò…jx¸î TV>…j\v€«P~ð^Lz6T^ ¨DÏá/Ù™<#OØ#~Пì)*U°P5ZYóHe=&[™¼+ÐD#=Lî{Bm+[¿ókþ쬅Š³™>¿æ +ÔLdÊ-VP¨|Á®IÙDÈ:_ØJ'ài¾P…ŒuÙô<•@­ºÙ¢C‘¬¤Ö1“P*•Ý?éôC<4ñ oðFµH4\™W€×tóE;•¿Ö"‚ÆÉºÙ è¹ ÁÄ¡Ü\OSr˜ÐÉæÜBÑ@$&Ð$/˜$ã=\n[èÔ(„°7¼lÂÎìþmQ‰i§Ptp ¼q3b3ƒ5$¢·PaؘŒ “õˆ¤søMnÑiÂ-"Ðk\b¯ƒÉÂÊÛ¨ŒON¹Âjx_W~Å‚'=|‰ ·!ÄÖx¡õ ät® 88¤E”/0±–ŸaS*^KMo3É>$z*»üe·P·³q +‚\÷ÇÛ66£õE¼¡Ôψ‰YÀtÀÔŒH”ÎÅQѲÉt1qT,¸øä8èh<2ã ¶à'N61j‘›ä»” jðùY4Ò¤S3þÜœ/ZÇ"eDÌr-ÒX·¶ðX W©p9×?ŠEV* å Va„dÔ êÔ¼R%RZJuw ÒŒDª‘K ®Ä‚P\vÛH íÊv2b%"FLFU6Õc’ÓD¬c¤’Êt"-·Xt MŸÜ£³ËlnÉŸ_¡’"XÍõO²ÙÅ)4ìò—øì2Ÿ[¡RódbÆÁç,dLï A;| A„K‡JKrcS*.…J+ ÉZŸ »€J5˜,À$$™P;E…èlœÁ'{€ÚXð˜“É B…OÍa‘&(B¡²ÉiḎ°GªzƒUh"> ,¯ +ù&ݳ ù¯÷Ê?<¿AÄ{ðÕˆEá™\j&3}Lª¬xcm~Q(ÀtñX7XYr}¨.—gcÍu!70úd•VŽ³Ëd¸f%¢6H(Ä({<Òñ†š ðîT¼«|<„MA}qÙFg(¹›líÆ[»®@¤ººÊÊêÁNÆ(¹n®Ëíü܉Îò´ +"•\qÊTôª\|:ÝÜ U7ðØ4˜ŽÆ œé·zÃ.> täòƒ”„ìl¨²,äf©hU‡ˆàh° joR.QËÓ‰—ñB=(g·ãvâ[—›¾X—Hô¹ì\´±ïl“±*)—…|ŸËÍ°¹¡ûØ‹óÔR¸æ –-TÂ%ä<’‚d|v.R^¯-ž¯-Ÿ •—èd 7Ð`…I´Ùd7XÝàKÛ±Îi*9c%£^š.*GÅZ`ÇlnÑn¹‚Í`}—IL“Qð©2ÌšÉ.ÉëcÑé`n¶¶tŽLöTn6\Ë,`ÑŽ²ÚRU¹hY,6°ÆÅ:¨«s©V 8il +…EO¸nç SÚZÂdÊÉ*–mgrÀWoJ +FÉ›b¥H} °mì„ê¡ê*<`¹P©dã²n©D&ºdb:Rß‚ê‚Í"b-µËoÅ-•K&@®Ùä,(m°¼’ìkoÝ%·w±XS,Á˜çâíÝì™Üâ™HsƒIvÅL·²p¬ºt*ÝÛspY4PÆä¶7R']&ÑõI%¹°`#“"AD[x´í ·ÄÂR¦ëìú3ƒtgSÈöt^pÕ$ï†Ê+‘ÖN¤½ë–ªF<Î%¦-L\eÁLÜŸ™aRÝH}³´|¡µw=ØØŽVWúÛw0‰žÞ›"ótjžIÂ&näænóV­tfÌD€f: ™ŒT¥ò—›K«¹¹3±îQ¨í@n&ßÞp–+ ŠØ¨¬/Øær+ÁÆ~²wšJôåʪ“ÏA sñ9ˆPu7Ó?Óß¿õô㽋ýKþü€J´£ÍHk“/ÌÉÍõêòÅöîuqÁ)ä\Ê#f¹tMRÓDz3ÇÅâÂÌþÝÙÙãÎPÉ)æÙdGÌÍD[Û\yC¬ïÙ92Õ‡ZÈ𔓆ßaIÌœŽÏž NÇgNKåµêÂi©8 õ`mË-²Ù~)ÖØÈÏŸŠ6· <@è´Þ€•I@‘r ÜŸ_ˆµ¦z'‘CŽ‰×-d’¤\U×Óûñî~®¢¶x +ð +¸Ü½¥}!·å‘ì¤û§CÕO 6éðƒ‚Ë‹ù…P}ËÍÑ©›€Îàñ¶#PÂâЀÓLv.\ß‚ÎÍ&" ;v3q€qóe!³PZ<›™=HõŽåÎÅZ[s{w‚€»¥ ½£Íí;ûGﻫ³v›éÒ±¦ÜØ@eÀ?åtyjP^º”œŒwvkË ñ Þ ,ŠúsóÉÎ~yù¶ÒòÙüà`ùô½¥ùã°È66é –¡êÕôÜ©h{/XZÉÍž6³I‹O2L*LÚo —ìì¶öîní^]:yïO~‡MÎÐÉ…ÊÚµhsß-Ö=R‹JÍzB-+“Ó A—?§÷À +ÅÜ´TZ×·cí}^;ŸOÖ×~áaIegüÉnuáœ[ãòëÑîI±¼ Î>¿{Í!5.‘TÈj)5}"Ý?S\¼é[;qïæ¥'ðX;RY«¯ÝÞÞ¾ÜÚº½´xº¹}µ{ìFséüµÇ¾ï츅l¨0HuÂD +ógª«›»×ŠsÇ{·Íº—« ݽ«ñÞq&¿X\¾Ð=x09‘O·Ã•*Q³1q<Öaó‹R}+P[Oõ¥'„ÂLan'ÚÙdRÓ|và •ý¹™@aNÌÏ×V®ÄšûN +‹–CåyOoû2¨%©ÁÆçN5V/fO¦{ÇåÖ>ï·nk­ßn!£P¢PÙÁ©ÔôÑhk§±~yzóê‰+O•æNš™ —[ðW¡ì¡ØüºX9ÈÍ]¢Â „¡'×–ùü \_ +s¡òbvzŸNLƒ‹A@ÁG«K™Þ^¬±Îƨ7,.œãÒýhm5ÖÜÄ£Íhm-9½¨,»C->?—ìÅ›kD¤ïnû³Órm±¼x +_*Íeû»çï{^®¯Á:4VÎwö®–/$¦†««„< |›kï/ŸøZ¢±j%D>QÏ÷`.ç[[Ëk—Z»wCX²ËaÇ-8„¡´Y]¿«¼|9Ò:éD[Rq>Ý\ÏOo}’Þ†0E‚Ñär–B•5"Þ¥#åbo7ZY¶R:3/5výeÅyƒå%5*jݼ‹Kº¹8{‘[Ù„±efϦgÀ.ÙyXœ@q:ÙYµ6µP•ÎÜþ#Ï¿ ëc¡¢ÁüLsýnx4Ö¯BáIõµÒôö¿q׳ßCÄ\}õ\gïžÊúпͫͭkþÜÂÁ¹¯<öŠPì«œ)CG¬&§Ö×/Ο¸¯0ª»|ꡧ_Kõ÷  +3Ç’ÝÝTÿ`öè={w<µtîÙPe§={¬·vÔ¨¸âÅþÜ¢ÜÜ-/_š9ñÐÒù§ + çw.öVOaá2ìZ ´È¦û\fF®­Îppúë‘Ú†´o{*Ö$䬘+YÙb¤²U\8ãä3|6qôŠÍÌðÙ~ypüÒ}Ï7–O#R±°t93{.ÞÙol]N¡ó›@†^±.¬@§;èX¸0+7Ö¦w.Ž]¯®^Àâ=¯T«ôŽŸ»ç›x¨-ÏVN—ÏSé2^ߌ6¶ÄÂ|°¸Èϼ¢ö"5kî€Pt7ïØ»üdeáÌÒöÅŽÛÉh~=Ù݆šo¬_Úºðð…žO6Ö6ÎÞñà7 l€%œþ<„ ëxçL~ñÎÂâ¥@v°´}ÛþÙë‘\ËÍÅèä4]ò×ÃÕ­öÎýReÃF'ýÙA¸µõÏÄ;€=beÖ-ÞX?sÏ3Kǯšˆè'"”½“r÷—]Vg¢ÝÓ÷_¾ÿy1Ù#Âu¹³nïÉÝ㵫€CfsÜ__¿<·wïìÎõL÷¸ÜØf#•ÍS7Jƒ=78 +*yŠÏ­ ŵdï¤P\ôI™õc—Óµ%„Ï‘2¬êºX\eR±°šì„s³Ýµ q•7!Í+ltœµrÍbo ä PÚFD¡ï ;Æš[‘òr¬´ÉÌÀZÕæN¦úÇ™Ì,dU$P3 H4t¬×ݼʦ{fBö…lz¦4¶8å¹3²Õå£ör Rlú¸P^àïx°»}9^ßðøó'/?Ò]9©WiJ̯c!ˆŸq=&± 2¨Þ0©‚PG[»ÉÞq*ÙÓy‚v:I†Ê¡lgÊAš¼,ÒðÉ]ȨmšNt5NÖIÅt=PìŠÀˆELzF®¯KùYN®›«ƒ½;Ãõ,Zâu:ÞñgæØÔ| ¼ÕÛÅ™jnäÇsƒƒìÜI_¢cå’þd[®.Y©P¼Ô_;óÐÒ™G2ƒÓl²ç`’0$e($OhÜà38<—ò3bq–ˤʒ]H{ƒùÚòyØM_¨­®çÏ•—Îf¦wødÓHëPqÊÆÀ„Å;e§¡DËs§²3§ò‹·‹µ ¡8o!‚\¢•é싹ew {„B6ñ'‹3{…Ù¶‘`nJÝAÇ}r‘»Ð}Á +›èð©i3Îvu·¯ËõmÀ•ê܉PyÕDÈR¬±}êžp®£Fx©ºŸ>YZ¾Ü\»&VÐpË)ä9¹¾wêF¼8ë ãÉæfwýöâÌ ¹¾’œ-Ì7æÏ@G„r³ƒý{+Ë—Ã¥5rÆŸ`áÌ4T.¨êÏ„J‹ü|uþtgë +nê¹Cù«÷?Ht,¸ì•Êt¬EÇ€{7+‹ºWLž@²4Ûݺ‹6ÌxÀŠ‰n6nUNF]TÊM&,h`fã88„q &™IY¹ê ;Ü¡â3Vö«ãv‘àSs£Ê‚ëÑ'°ª2RiiûÎPcÉ@Iv.îàÒ2Á§çxÐ@JmÆP6 B µªnY˜E'—1¢A”OSá‚OHÄ*s|v†N÷¥ê¨‡”Èù™Õý;§7Ï¡”ÛŸˆU—‹g›«—í}>·@%§|Ö3U_ƒÍÂ#Dûv¤¾|añøýsGoÑb¾6Ø8uw¢¹jÀ"Ê©C*…JÕpi5ZÝ…½_ d£"zCóAÚÛW« g ^-üzkõr¬4¿°uGmñ6ãbÓ…ÞAmé¼N B†KÏ€AæÑ‘ +Ș1r¨4‡«h ˆEo°.WrÓõ¥ d¸nöÝt"˜é›¼¢ A×ò‹@•þì"!՘첰enåðTÏÌ—æÎv7¯µ6®¦ºû_pÊNš=¼ÁÃÚˆ08 Ä™X}#Vœã£5¢©2S¨X‹ó‘Ê"m þ*ñ@Ù†JíÞÖþ…‡-DèȤEo'<”,Ä;RzÆAÄ4Vš +ä_þî{ý¥ƒIêÀ$)¯°,mÆëûñúŽòÇ"Ìx’—W™1XXP*ó ”\ $› [çãÝeéGI±Ðãs]";R„AÚ½R47'd/sòIXs3t1 ÐCg"Z…E[9v%ÝÝärÓh¤â3n>ÎÆ*ÉΓ€ðGËà5™Ö—lX¨È„“õ…ë—r‘òDJ®3±&o@_gú[™™-)ß–+³±Úz¢±*,M™ˆ¯ MØ}B.˜š69™!•iLã6:E6ÒÌ·wRõ-,P²P*ƒ×IEˆHùÎuXç1¢¾`#Þ8Ë[„X1¸D>Ñb#¹l½7¿y|uÿÜÁ¥{®<ôÔ}Oó©WÞ|ë‡?ýð“ßýé¯ÿô‹¿~÷'^¸ñTeá)ו¨Û8›ÊgŠµ™r{±6Øì,n.힟ì„ò \´/ÍJÉz¬Ð¯ô7WßÞ[ZÝ;{ÇÁí÷Üvío¾öÝß|ù×ßþá¯_üá/|úùמþV¶¾0jð)7“ å–Sµ]CÐX»W`B%L,Ù‰˜{ýILH'K½cOÞùÀîÅï}ìþ'_Ø>}µ¹r®4{œ—ÇôØ-#vš·¦—W¶Nœ¾ýâåk<ñô«o|÷ý>ûä7¿ûŇŸ|øñ¯ÿóoÿùéç_¾öÝ=úÜË+ÇïÈ͵’I'&G“m)’OfJÍîÜÖÁ…篻rãÁÇžyõ;?zõ?{öµï=öÂ+o¾ýÓŸôù‹oþðíÿÙ_ÿãï/}ïç=÷ÆÎ…ûƲ­µúÂÑlwELU2•Öüêú™‹ï}ðkO>÷üs/½úw~úá¯ÿý÷>zåßþö»}ùÇ¿þßÿÏÿû(òÏ¿üÁÏuíÑoÔ†ò}L”–¢Éb¥5³´½c§.\»ï‘g¿ùÂko>ù­×}ñõçßøîßûðW}òÅ_üïÿë¿?üõ}ã•“w<®/p¡:á/…³óéö®“Š»| \¨w6¹ýîo<öìyáî'žé;?þÑ{ÿä—ýñ/ùã_ÿë—Ÿ~ñéoÿ­7ßY;~À!nH©®‹sÁÜt½¿¶°y°sêâµ¾þÀ“ÿúø7_ÿæoÿøýOÞûä·?ÿè7¿úìó?üéÏÿõ¿þºõG¿øìùW~˜l¬h]ܤ…åÔ¹x+F…œ?ÞÈÔ«û§¯|í±«<ñ/ßzíÇ¿úäÝýæÞ}ùûï|øëÏ?þíï~þÁÇ¿ÿßþçþçÓß|þÜ+o¼ýF¢:ƒ 1£Ë§svL‚XRl-÷÷vOÜ~ùÆ£7}楷~ðÓ_}òƒŸ½ÿÆ;?ûõïÿô—ÿü¯óùGŸ~úÿùŸ?ûðÓ»~ª>¿—éìøS=“ò÷Ùˆ)#Nú“´˜ +§šÅÎjc°Ñœ]Û˜(Õ§gWvŽ½¼úüþñÓW®ßóÊoýòƒ?øô·ï¼ÿñ[?üñû}ð›Ï?ÿä³O?ûìã?þè¥7¾{þꃥþ:ÊÄQ&Hv¢åeŸ?KúÑx±Zïníî~í¡GÞ€qüèç/¼þÖOßûÕ—úË_þö÷_~üá—_~ñ‹>xñå—ŸùÕ­3W„t áR V|¼Ê÷"ùNw~c°´±êÜ#O>ó_~þ•7þíõoÿô½_þõïÿë7_þùÝ>þáø‡/¿üôó/^zëí}¦Úß±“²ÎÁêmŒx$¢ÔYË×[GO>øÄ3ϼôês¯}ç'ïøåŸÿòå_þã'ïð᧟~ùÇ?~þû/ÞýåûòÑ»ïýâ¡'Ÿ:wåÞDešeŒ¡³ãB¼LÕb™ÖâúÑë÷?öÚ[ÿþ“÷>xû'?ûìóÏ¿üÓŸ?þÍï~ùÉoþü—¿Àë¼óÓÿäÝŸ½ûþû?ùìÑK÷οFËõq#nñ­nÞåóm˜—”Zƒµãç._ðÑ^û΋o¼õ­×ßüÉÏñ·¿ÿý×_üá'ïýêïýòƒ>zÏÞ~ueëd(ÛËw÷ƒál½5¨4§ó¥êôĨ͙å…õË×.ÞûÐ=w\»töâmùZQˆ¼4k÷2NLÐYq3Øq/.ÊÑl±Ðhµgº3ƒÍ½£û{ó+ó'ν~ãöû¸~áÊÕ wÝ{ìâí¥U)Y`£•`~ž5¬k÷°á÷Ë÷ß±ºw:/4*ÅÝõsÎ^¿ïî¯=öà÷¿ÿ½÷>øõû}üÉg?óâ '/]è.-Y!QñBtÅNRb‰½ƒKÇ/ÜSî-[½Á`v}mùôéƒgŸ}üí¾ýáÇŸ~öÛß¼ý£·_ãÕ—_zñ™§¾þàýwíîÔ{Ë8š‡ó°1+š°B®Á´vÒâ¢üþp>—ÙÙܺÿú]¯¾üò«o½õê«ßüùÏßùãÿü¿ýëíOïïn4§{¹FÇMò:»ÏÇÇàá¢ÂN*ìeÃ8#D“ùj³¿ººuñ¶3_ôágŸ{úÛo¾úËÞÿü‹Ïÿôç?¾÷‹>ýôã.Ÿ+7k.Œs€a9¢2k‘ =êÁCr¼‹—fæ—×7Žž¹í¶Û/ßqåÚµ»®ëÅç¿ÿö^~õ•o¾ðüsÏþË+/ë÷?v¡£¸˜NUæ¥xÙƒñ±d~sçø×|æ¹o>úø¿ÜyõžÇêG?þÙ÷~ð½nÜùä×î{âëŸ=ns{«==—ª j '¥LÿæåÐø²Œ6Üåa3ùúööÑ+W¯}ëÕ×€•žxúé¯?úõžþŸ¼÷ì7þíÊ•»×6w‹õ6Á… Θ½’ÞFë-B;½¬‡ð‹ñJ¢ÜoôWgVö¼‚dÅHÁ™½œa`=¬lpÒGÆôZ#êòI*âð +^2„!+EÓ•`¼à@0›ÇkGqœ `þ%—xhÒ†] Â$œtTíću½Í‡à;¸0• ÀÞ„¤°×çc:MªåÞÜüöÉs [»ÑlÎMùµvlÒæÕ:I0!¢ÖÁè] ÊRu\H täH, G#r,Ë$ó…\½ÝY\Å“‰TºÝ®”Ë’t{9.!´Œ‹Y)?ë 俪²Ü~QnpR)ÎÔ+Íb¾˜ŒÉñ˜¼¶±ÝéÔJ¥L§?ÏÕa„˜ð yÕZpµ 2¸'t•Î­±s6 ^3ïW‹µÅT¶^ÈU._¹ëØÁñr1;ÝnWkõÙ™þ\¿+ÔíbxB@mò «,#“6øFoW>‰1 !RÇ‹Él9‘¯1bÔáö²þp<]Fr¹b³Û[îõ—xAH¦óR(å%3j&”?Åà ³Ñ†?VÇpÞrœŠf;ÐÔl°TîÙºÒY>LJ2—3 +§ÓyQŠ"ctbPEŒÜ(Ïó§æÔêo²yÃ&iFxØe’F£©TºHeÒ¹š  AS¼*äJ(Ñg¦Mʇ¤Pn†‰µo1VÆu.P;Ê{ýY*TÎÕ×OÝkÄ‚oñ@ U$6åáÒ_pÊŒ¹ˆ° ™4ž0êÝ“FŸ â|&è°á*%äP>­üM©¶c6J¶“I+&BÁMÊfÞM™¼‚ “B²xƒ‹ñˆ9,Zaâ ^®X<¤ÕCA¹ÁËG™hÉN…µná2ã&ßWUÆa­X׎G”Ô0QÔ×»Y“¶zE3º½“ðPQ>R…˜Œ 9"Xt‘a!’¥‚ñ!µqlÒnCƒ˜?ë¦>©*æ–Q¡¤2áT°¢þIƒgRë0šÁ¡3:-ÉZˆ¡¤è£c&DRÛé)P :ªƒ7:iõˆ“Ïàä´NAë +˜ñ˜Þt2Ê%2µÙýóñLõÿ#é½›ÛH³tÏ/±cº[žÞ™HïÒ $¼÷†½'ERžò*©JR©ËvÕ´©éîê¾ÓccîÌÝkvv÷Þ؈»öŸý*{ @0(Š2ß<ç<Ï/ó}Ï»â²Àt ¼Óº Þa)<ïM"Œ3ïFÿüêò-We2P»Ü>€¥‚„Ç‘Ÿ*­E)sÁ‹ÈÙ^¶}¨žgÚ¥‡!ç†kç—¹6„·ŠË Tï“À•™~BÌûðT€4–Ã,ˆ¬˜[•KÛéÎy®wVÛ|.7D’”Šõµ(®ýô†gqÖÑ"¥Ø£þö³úÚ%*V®/Æ]ñbm#Ng®,Ń´'6-¥ûÙæAº²í ±ó‹a„H…ÙbÂI-B¤³©n³&“Jaýæ +zýé ßòFç½±i¡R‰ÒëfcKvyÝiíÐFÔê1&çòI¥:kÊæ„ù“[ž+‹ÁY…XŒÉÒj•NÕ“B¾Ü>, .®»7]Qo‚ÃÔªà¬qöˆÔëBg¥lcp€kÕ[žÄœ7¾@Äf5”Ê6ŸÂ`fÊ=%Û$E9WLà™gÒã\÷AŒÉÍù’AD°Kã‘rEÙÅ Q¦Ó¬ÙâÌÞÇ%4”²8cAàÁõ…ó#jR(ªÎ(©nzâÁ¤.Úc)7ÄäJÊ%•¦Iͨmº£ôOnù®ÌV< ¨Eî žd2˜XˆQ¦‘} õ§ó±[^"ÔÃd6ˆçà+&U"´í +sÊêŸuÒó3‹³ÆÂy­´šnlDó–Yp#8k¯xñk·×–â7<äb€ c¦‘ߊö¼ƒ×R€¼¾…`’¦ÓBQ)n©•ýfRNÉQ¥ìG5O€¹µ›s£(•©uO !7¿ºš#ôŽO{QÝ‹h¨Ró\v"Ó—H©¬=2GˆX°ñ Ú-7"¥j½õÇ12}e.ˆˆE\®²ZMMwà'‹>âg7ü¾ ±¶ýåóóA&)–¢œƒ)51·f·ÏX£¿ìgV`ÐHcÁƒÎ­Ä"I—JÌlºéXtÖi½sm “:£0½pÓ.G…]@»¼3Ò+›õõ™ö.¡•h«MêM)¿*æ§ÉT+@ç¼xæ–š÷b³5þËIŒ+ |!JÛœÑâíáu7:ïK†-!„âÕ›+¨"5»ÔÛ8~BgzóPx*Φãì¬ÅDµ7!†Qîèâùhï¾?)D›T›¸Ò`Ì>—™À?¹Êu!ð®/E–‚d”šñ“¦jûR~ 勹ú–’Üò£3 F¥8›AØ,k´1¹&-‚ÍT»˜R^ +³ó^ ®oˆÌÛYZy#HêW–"a\KòiO„öÅHê¸èª.!×f°Q Æ9ÎæƒDú†]‰ Q±*ç§Ùö©7ÜÛŒ„Hþò¸\rEg‹n˜T›*?¹æ¾zËg*åÖ£&2ž¨²ä£&h¥ÇpäNHž¤êJˆAÂŒóåWŠ1Îp÷Ie|å2¸R!•.”±Œ‹• nÁ_ÝZ‰†QÈDa%*Îì°E«u6¹ýmqüÐ[>T¦õTƒ•˜gJ¬Õ—sÃT®'ZÞ좼ãËÊ^B`o-ÇÝÉðÕG@5V²=øC/š¢õúJ”sÇx_B†°üé­àœ ‹é(•þ³+Ës+Q„ÒÁí,†Ä…°2~¶‚^qá nû·_O^]QK 3|yOï^ØÃ;rm›6[ƒÉíÛ/¾‹HùeD\F”SˆóÚK¥Ã•¤5!Œés^Pª¤RMÎz¼ÌZ^³V,L+ ©jL.áV›Íõ¥„ëM¡¸a´NÙÌ !8ºa.C*%1Ýìv\°CŒÄõ¤àÌÏú·D®®Ä |Xƒ:óf —f·¯AS D»ÃÔb𑙈PÅôc øt·gŸôÅÂõŸGÅ2D—î öÎ^“jù¦Yôcq:‹ÉP“ÛdªƒÈwŒ#ùôéƒ÷éÚôúrdÙ…Q%FYŒÙaŒN(©ÁAòvëîø-¶¡Á¯"RYtÆQÖ&RÕÉñKÎΚÒÜ zƹ\’/(¹¡YÙô'Ô%7š¤-B-_YN||¡W—Ñ(WU³4eŒ:ŸnûñÔEBð%UTª0f·8º×?~C¨}jkí¼4¼¥2K!Æ|9ÄÂQa\fчÞXŽcI7ÍæaT(­$R.Ü"í¡3yØÚ}Φ»$…kmsB­zã¼\ÁYïAH«kËÉ+Ñ•0ãM¤@@A£„á‹KKv)ÌC雽Œú_ÜðÎÍŠ‰!eV1¡öq}·}u áqWæ|+!24{°h‹Ê Á¢Øµu©Ð¿E§£r)‘ª+õ]Ìê$ä’”ìÜþìôÍщóY!7ÔË;fy'Sßç ׃ )äGë9³ó³…ÈRˆ‰’³õ•j~ÚÛ{]ÝM—‡'>@PaFÝlïe‡g¹ÑE~õ~~zÉ槈\̇_ýÕŸzû!%ø$ô0m“zǨ²é‘7!‡HsiÖW6“”ª¨T‹uLmËκ\œú’Ê-w  ù¸¢'Ä؈PB„"©58«Sè³FÒS-N#¬Í|œbMg‡Q¹â#Ó~Ü€´™Í‡÷c&™ji¥uJ.3JYÎ6ÃdjÖ HÈA\yb"”bT,FètB,`Z4š!:½ã—ÃôH§Ÿ ä2©V¥Â¤²ó"ªÖnɦG3ÊXð~\ób)\®RdzÞOüå|äª ] q!Ü•6g ÅÜ„MCjô0 α€ëïq#Áå(ðºvß—XÉyúú{ΨþäV`Γ áÈ1˜I”ÏÎy“Þ¸HkUÈš¤ƒƒ±;™þ [\…KIšmœp~œ`ss|%ÈEˆlR¨°Æ·V˜½Q6áMªõe?±¢o® ³Eg˜…IMµ´i7À.…(@•Y/V<½äfk“I›M÷êŸ*KéâRYŽn¨ºL6FgˆT-.<˜F¦;ˆV °¶RßágÓÿöOÛ/ÍÎ!¥•íÚFª¶ŽŠ¹kEiÓTn†(\*Ö†ç´Ù¼¾Q@„+ +f»08Õk›ùÖöÙ³o1«Afŵ‹êÖãÚögr'38Ǧ{“ãø÷ÿíäÅ7>\Ók´¸ô0Ý8uz÷(³/ÙƒÒð"Ìä,"Té̪XÚ·:÷+ŸhÃkÇhCË#PíQu)Î'„<—îò¹žjÈÅõjÿèég? >ñ¢À>m­¾+U÷g]*í¦*‡àLü¸¿¢í›¥õVKûbª;&@¶«¼Ù„Ø^s˜à€4€%`2!7..ìÞiŒÏùP .h®íÃ(Ù“‡ÉtŸÊôÁ^.¨•0" )?¡Ó}½º›®ïÇ9çêrì¦]‰òs^Ü“¡ÑF—2:¤ÞMHUÂê±¹ •Ä„,üT€„Xæ³CÑîéùápýü¡{ðä†;HÊÑÙ¼A®£œ_•œÕå(籨Pð¢Úl‡L!R•T}Ëî¤;GI9潺~7TºÉ:C¥²áôNÓÃýç{¿ÆµBˆ’µü(]Ûcf›³Pgâ‚£U6ŒöKÝò‘Fu¿¶õ²¾óBoa©VX(ùi›1Ûùî—$S5\¯Ñ&ØסXSVK*ÆZmíÔhn%X£±zÞ;y[Ú|NfÆ´=¡í± MõV/ž¼ÿ1ÛÜZ ³tzœº¨ØÉÔOr½‡V».EÌ ¼1g% +>wwxðúìåÅÉ}8¼ÍãçÃË¥ÍèUgxRXXÜxÜ=|»vç—Îð +&åØL+.ƒ1K!rU›nÔíŠñ`önŸ!¬ ‘ ÌZtbR•Ê­ƒ»Jë4*×¢¬%æºLºƒkuB«3鶘çú§ra£ ¨-AD^œÄuü0aÎH$€:ô'8DÈÊ«•m½¾],Õò¥ÕÇÙîìõ$Æ!žAX³›àÁ* ­ÅgzP‚ b@,f]¿R n¨\¥ °Ö\QþÏ®./û°OØÖá|¨F¥š„R£´&=QÐhŦÁ‚×ÅgGÞµ»Ç™îñpûɳÏÿ¨'„^wFwæזּÖw·žæ†+XjÞãr *”PÞè@"ÌÂ)ȈVÝéî#bΔH*N´ê–Õ;‘Ê›²ÝnÜ{üÅŸ|DŠM·3ÝÓâøN¶wR˜ÜÍï¤ê{aÚÒ­Ti²ÐfÀ3fÏjO.¾¨ï<ŸµÀ²¨”PÖrBšÓQ.Çd'™þ½ÕÛ_•õTešíÄ¥ì\‹ó¶Z^ßþäñ—<óCkï•nåJ½ý{ï„ÂèV„×gµ÷3íCÚ^³;'Ýí{‚ÝôcFnp_«ìcJ“ÏŒ€ |³nuj©\\,GØ+‹Q¢‚œ!eµg{’í<‚ÏõÓšVž´öžôO^Ö·×îêÍ2Ý"•ü¯ÿæ¿Ü{ý‹(g.I­z_ž[},8ë˼bg|²sñùOA<Í:Óôø~åàuýð3­{ÛÏå•l÷û?ü§Ý‹7‹`¨pC­l•ÖŸî\þ²¾ùÒ—Ôo€œ«yˆ>|!¹“iΦK&âÆÛ˜\h•Ëùµ‡Õ£»ß¬>ø+Ð ˆŸ«Kh{ú@ÉOÝqyÖâð3)£ßØy ´@ð«lª&tO\?æÁí¨0[:/M¦¯ÿñâ(mG ¬«qÚqGA+S(°p˜BXc)̸“\ô¸˜#†Qß-ŽoÃ÷@……Õ‡öèžÞ:®¯?š6k‡fÚà­z˜2|˜æE WL[K!"þéœ|F©åÎô¢4¾m\¯­}¥ºMZýü༶þX«n‚K¡v¦uhT¶@Á•ê‘†Ù EI+^u%À¢èe[‡éö©Õ=Óê{¨T¤º38bsÝmqv_.Œk“Ó£Ç_\¼ú«Éé'¸QmŸ½ÿm¦± .ËÜ=|ú›§ßþkçü®¸“Š‹Ž”«¹öñÊlÞelHo2ø/7|Iíº;鎉qÖwfsq©Ìå'PÁ²¨!£úäèèÑÉ"’aRHª–H5 ´ +ƒãƒ§ßgšÛËq.Ìdª›/@FygâžuB–"¤áÔ6Zk÷@ãlŽ0Z¸ÑÄÍŽXÚ+[éÞAgÿÙÝÏÿÐÜyrÝGƒ¬(å-ÞYCÕ0Ôœ]™år›Õk1p%d¾°¥7ÏÅ–TØ\ŽÇ‰˜\‘z”Ílßÿpïýï7|Ñ=|£Ôöýtö–Ö +æòó¿Ë¶ÀjÆؼR˜ÆØ„œÝ>òé+‹±`R*´¶x½zc!ðW–çý f µÎ…Ù½HwÎP¾!mÉÇHûú|hÞCÎy¨9íC4ðW>D…¬ìl^€÷v#²k¶=Dš6ÛàFØ⺟4ét›Ë­Š(5ΙRÙ5Òì¡\Ž–ò¸ ¿p`RéÂkÖ®jÖpLÓ[íÛÍÍ+Ë¡[~̇Lº_œÜ«n=É SvóÁ‹ïÇGÏý´žníOÎ~Þ?~_Z{ÜÛÝ9xÃåWç‚´’ŸP©Z”Òg^š/ Z—ÏNÁ&Ó¹E8H!¼¶ìnŠ§ÑNÈ5Öž­ŽÄìTyÔ*¬^®OÏ›;ëÛ—ùÑñêñ«þÞ3)7ÔJ«ÕéƒÚô^só¾XÙ pÅD5 «Nëh>@ßò´Ù•Š›¢3œ)c ‚¬U1±! Š¦Èhì·ö?ó§ eZw^½ÿõ?ŠÙ¾;!ÇY›ÏMK“û—¿¸óî½—ºž¤dÔ¦re#HZnD¹î¥–¢bŒu@‰"LÎ?»9Ј0™ùå',&3¶ÚÇ»—_½üþŸÏßÿ­Þ½½”Ð(£ +A*ãBä8WHòUΰ֢èêJÞV­îãZǃ¦‚f[ ŽèŒâ¸)£·ó ½q'ÝØÖêûDf’Ô»P"¤Òfc÷Ó¨P]‰©JyvGÑõÿwWÀ­ù wÃE(«Ø;ãÚÏ®/ÿäÚŠFÀèŠå*3Š°ÎMï#²ˆTŸ÷’Woú=1Ňè>TŒŠsyßlÁ¾“퟼“ol&ø,ˆœ‚Ù=—kG|aÓìF3€Îì"xWTk@î@LÂO¼qÉ—ƒh +°%€h„¾ôgK±«Kq VÍÏ:®¯Ää2àçf‹w†R¾o–‡õÉÀ8ª ^ N^—×ïJÅ!¦b¢ffÝÉd»‡²Œrœ»÷¨¼ö¼wðylÖüÊKY-L@4] ч©®È;S¹´IZ=@‰ÖúEcr–ä3•*t÷ÖÎß<ÿåñ‹ïù÷•éCÞê]>þêõW?ÒéF„ÍDÄ‘Z­ÓÆÆóÑáÛ„PûÙ2rjˆX‘Ë›R¸2Ù½dÁl‹tCŒ‰ù‰ .4;HÊÀFÎhä{ÝÓ7˜Þ +`f©Q_{–köŸgs€ÛDV3­Wßþ­TZ¿åc‚d–žñà&žê@ÞÕGØ ¤ Wœëh6ö3£öÎåéËï§çïˆt_ͯž?ùåsÜók™æ>X»}J[“ù »aÉ ÆÌÌ»± ‘¶»§•Í‡àmˆT=ÎXéêª'!¸â„ÖîÓ߬?ü¾sòyeû9šj]YBÚ9yú«dªrÍ,FE? W¡ .Òéßwo¸“×Þ(œÝoA–ãÒJBGµŽ\Úw +Ÿè +âQR[ ÌÚMD¹|Rk2ÙáøäÍÉ›ßàŒ´J”JC òÙ¾X˜ˆ¥ µq¤´n#j åRç€P 2ŃèM>Ý×tBµ[îø•…ÀåÈեȼŸ‚¬Ÿí˜PBI[Èd|1–1b~d¶v¬Î~qí¾RÙ$– ©ÔG%3)ÞÚ¬Qƒ_“s#£´&í"‘b.Îf\ %„Nk5\®A.D©,­6µ:çÅ ÙC x‚/…jÐF'ÛÚ—A‚1“¬©æ[R2e£¶ó {ð¼88)¶¶n¿Î÷vQ¥ W6rÃ;4ØæÆÝ¿K{Q ÉÒ]F¯/G8°a„Ÿ™"MJU€;Bm!3¾°®ºB?Yð…pM+LÍÚaaø`|ñ¥è åL{ûü­ZÛ† +àIH¡‹;¹f”ÖKãó[AvÁG³©.cvWbÂWüª+îNH´ÑT‹ë1Öã²QbRÁ‡Èpz”`ÓPŠ›ÓG;LÛ˜Þ'ÔZÕ\aðÿúJÜfpÉñĸ٠v t¥®–6¸ÜH*®‘V—Êôë÷i¨çJ±±zVÞ…ŸÄÕºŸÎøIƒM÷S•=«sîŠ3bn¬Wµ +˜Î»æ•å¤+̵†Gã­;³6q~ÂO˜Œ=L÷ÏŠk—PÕ¯»’©ÜÀi¬ÍC$Ü‹—•ó#½2å¬&ð…7<»»Ä-ÆhÒV WË©ÊF¦auÏë[¯ìÞ¹\Z Ð) ïÆÚð±PëfMQËBa–‚D,xûŸ~Ü—a~Ö¬^Ã…J‚ÎᬓÎõV÷#J¯¾syôê·G¯_?x-Twàƒ´tmc÷ÞÚþ Áîû0ŋʉ8— Óf~  _œ–Ó5Ѭ° ๊1oh&wŒ_ Ó7]ñY«í¸”˜Ý¡1ÆìñY˜1éT¹¾v2Ü¿7={µqÿó­»ïö}98|i.âr¡ÒÝÝ8ÕŠ\f­–ú@Èm$¸2æ( &9ÁŒØlë´RœÉQ%Œ¥ÜŽQk, ›œ¬z”1á³P C•É”ü°6:9{ò5owa`gº<Ûq¦gUwåì*©6e€z6] NÐåV ä8(ïbžu§2˜Vf2->Û­Ž¿ÿñ?üñü?úO˜tÓlîͽææeytÖŸÞ_Û½”í†b·¤l_Èô%g“›î˜vc»¶4{B¡å‰‹~æúrâÚbdч­€ë³ª3î¬?X=z¹ç¤åó!.ËæúÙîi®w.9c«îô¼Ü? +⺑¨Þ\^æùÆF©µ=·’Xð`(ø¹¥¬¥u>J´ZÕ +ã ªÆé ¤`µÚ–8›SעͣU;kçýÍûà(›Å¥<ÂÚ„#R`}c¤n–Ç„˜wÅ⤎ð9Æj …‰\^‡÷AÓ©î=ýì:eÞÃ|ÿ–_³«›FyUj·¼” ×K­°¸×–£î˜e*\fsrüõèôKÎÍù(ΨkÙv !üÅ-ßOVâóaÉ—Ì`RC¯l&¤|„³|IùÊ|^s~œÐëV÷ µ‡fç¶Þ8$ô–=[=ñsºXÁîn=Ù¾÷õù'¿{ðîO{¾#õ*ªbJ%Jg!‚ÔåØ‚õ#ÊR˜Ã”2X⥨°‚ˆªguÖ®6¦·o?û¦wxä ı{Zš\¦;'³y¶¥5øôYCµ‚ÀR&’—jƒG­Œî7¦—|nm9"%¨4©5i£‡)PiÓˈ/WB{ ÃÅÓ—ƒx“õÒxzúrëâÓÒødzütÿÑ{1ß!µ’^]WŠ“õÓW­ÍGq!&U)SÙ<~–k¬ EI3HdÂd6ÎH¥#ÌHR[𢋳v| ×¼Yð%™TÝ„’ÞØM×·X£º}û³ÆÚݸ”£AqýI}眔’¯½¬ N€Ùq¹bÕwÒÕÞüXbÜœùËk^T€ðÆé«‹þ9>»oOšà3]1Á—gw‡bÂM/¡Ó„RŸP쟪ÎbiÁGâ|^N·\!êÖr<„*!Dã‘d³ >|É—ô„álw”¹å'ÀNð©§:¼Q&Õ²Qž>úì·{÷>€mC…2gö@ÓsSR.!´FŠOBÕKŠE0|ÒÙnµ)½æ´¶ÄlÛ‡qÊðÄÐŽ•ždlF«)¹ø±ÚøNÎÔ‹†’2¡V²ý£ÝG_¾þëÖæÃÇo~ùøÃÔê"—1¥ž”«lz W÷Kk/šïÕú.­Uê“»ùѹRZl‰ÎºÝA2§ä6¾ôÓÅÈÏ"7üj (ø‰ÚòÎvDU)µ–ë%e'Bjv}ýøÁÛ/~ý÷'Ï¾Ì Ž?>mo]|¾vþ–ϵ£œ©–Ö;›˃ãTaä4§¼^ôDÈ$›Ã•jÓV¢<ØEOL `V”²Q¾×ýÚBxÉ‹ù¢o¶gJ¤º¨T5òýã'éêSszccpúéÆý/ ëO¹üšMj[ç/¾‰™…áG$Ä“‹Ó9wHˆã–¤7&[÷·nzu!|å–#)•ò›À¥Q+w÷7o¿^ŽBS«I¹ˆËE„¶Ô\WŠKœfÕc=Q.ˆ¨Ë~ŠXÓ¢xêÖr0‚Ë”Zðň´bw{íPå¹Ù>ªLîB¥¢ |œ¼ž9XDó‚„ODŒPY&3$”òœ' )%RADŽÌžQæPÚò†Ée?>ïF !K)…ŸÞðüäúÊ_^[¹6ï_ðã!,%u8¤Ú`?]^õ„HѨˆi48g¬ÕvÌÎI}ëEmíîÆæÙ¿ÿ/ÿçþƒ÷ÀŒ@Cvgßhì¥Ê¥dªÀ5ZÊo¾Š°Ù›ËÁwÈ!ܳÝmp0J¦ÍÐýïÐF[©L«k·Û[÷Ëý½çŸýâÑ»_)¥®72íÛéæquõríüëþÁ§ÝçraÍ.Oî¿e3e)E¸\lÖO¬)9SÎ^ ’WBFÁi{1‘ZJ¤®yÉùœeÔ´Ê.§7Žï¼íl\ðÙ¶Vµs©¬?½Ûø‹‹÷ª¬?¨ONOŸ~¡Õv•ÂXÊH­†Ì¶b¯JìäÚR˜ à©m é59· €grnsÌdÔÆR¾æBÀdÆØ2ˆrÔÍ}4ácÒ¬âjÆ*ÂøÜxrôº¿õ¨ÒÝ/÷¶Q9Ç%=?ðÏö@ÑXÚ›ÐBI‹àòõÞQ{õεÅX()Ũ”wæO +„ÕÃÍ"–z÷†[ Ndi…žâôyk¶‡—äô1µŠñùJ{«ÚÛw…‰• JjIÖ¡ %Õ?鑆ÓÉVÆþKK¹ÎÖÅþ函ÇßjÃdª力Ç/ÿþ?üo…êº;ƒ»#å +oøô„±†Ù¦Œhµ:;OŒÒئ œV|„/ÂÆ0-AèªYÅ„L7i¥¶à#þ¢k)ᎊ  ƕ8‘Æ„Bº¼öâÃo= ‘Ò¨sù±Öܵû§NwwcïÞ¿þ§ÖúÀáúÚýæöS³¹§–·IkèYÑ´;Ÿ}ýOL¶÷7¯-xý”;*@ag”Bo°söô !×…ò…[-*ÝHU'vg»±uQœ%µ¢ÙØ,ŒïòÙQ +h´¼EMÙrVÏ(®WG'¼]¶êCÀ?žÓé(g»Pm9&jƒ·Ç.ŸÊ‹qåŠ u!jˆuÄü‘j²©ÚîéëÎú…äôôÆNiíak÷ÅôìýÉ“o{GÏæöxïѯÿñ¿ŠÅµ›¥¬›î‚±TŠÛwå^ºƒW›Üí™ò±-pàcGPo"…KuZï.„Ø¥0ú16{ú<Û&{»¶ñXÌõy½2X¿[äתíéEoû>›nù‰"æ!*«°éŽ)@²!<ÁÒḌPi½y/ Õ^L7–#ô|ˆãµæÞ«ÜèŽ\\‹ðù0mCFåaBÈ%å +¨ÏzykÖÅ›’7ÆAñÅ8o”…ŸDpÝd:ˆ+×6#ZM1Ó4ªkÃÓ7w>lÝùùÞý/÷~Ñ_;ĹtŒ´©'Pr¶gSR¬Ä¡F ½°Z€rzžKêIÊö…Y„4¡|cì’#äºQÞêIòÖ-y} ÄoLMŠU)·Êšm#?L° "dÀç[íÁáó݇v~Õ=}“rPrû/éìÕj˜VGä +¡5h ä Óߺð“ÚOo¸½!&‚§ý Íüˆ†wo wï¿Æô’ŸIíC©´jµvª;—™Õ{d¦Ë›µ‹Ë[ç¯Ã¤g²¤Ö2ª»ÃÝgÓ£OÒõ]x¹³ñÝÿP_ôç×ýK!ÒkaÆ1+›õÕ‡Jq3D;ïÔÒêWb!Ì„˜\L(©Y­JoûäéøèYˆ5Y»©×Ö´Ò˶Êã“£Ç_}ú{Üjg»GÎèKµ"L6êÃä‚´‘–k:á]w#\ÇÂúÇV‹A<3àçfû˜k×ßë>:_ß}Å6˜lßhîWg-‘Áï}œ tiŸBâGÅÜblÖ¿×—èê +1WgÛWÅ–BT”±"\ÆKꮤ,8]±ÔG´\º½Ó?y“_‡·ëë*“s1Ûÿ›-`i1F ‹`'f7ÒÍZ{|tÿå7J~tu!„ò9ø†KwA}BT6©`7·ñTå†'™îÃÍçòCôBí/·ÖöÎw¶Î¢´á oOξwùýν/O;»—z}#S÷Çÿøì»ò’é8çT×®ž~( /KÃGJq#@@£™òˆ3+1éš›¾î¡—£Z€p’J3ÓØyðæû§~›àÒ+ ÉG™Q±ÈÚýêä¼¾vYš>K¤š ζ{P«ãRa¶Ü^*‡(+Lgš[ÏfÛùÅ„—K*u”/D $ =ɧs­ñ£)ÎîÆÍÍ'›oG‡/g.ÍòÓO¾ùÓ¿þ×æäx%¦P©­w³ç +¾¤†“Õë˜è,„HoRa­Œ•îfmy¾Îww/ýã?¯Ÿ<_=ÿlýÑ·õÃOk{Ÿ¬ÞùjûîûݻÛåþÁ?ÿÛÿýö»¿KЖœîˆ™Q3) t|¢fúP7®-c|ºÀÕ+ñë‹áŸ\óÞXLHF¸²_çíA¾s Ú]ÒlqùU&;æòS©²ãÃT6Ó´Û;‚ÓËÏZ/ÇçïFº§ï³«Åò†]ݺxüíþƒ/³AšülVÉWØg2›³í݃ÌM7ê™=)à¤;.„¨tLœuž±;{éÎvy´¿óàó‡n¿üÅÚÙ›Âä‚´q±H}¼£M_b6ߌ±úõé£Î΋Lë0šDŽ‚îÆJŒõoj &3Qʇ™Ö)Ÿí/'$wBLJy€Wœ”ò£l{·48€¯JaHȹÒ褱q¿¶v‘nîåúǹޑ˜dJÓ‡ŸMOŸDÙ4à[~pýý‹ïþe|þªÔ[ƒýÛ—ŸÓ©2ÄX¾{»µûYÿè‹ÒêKµ´(Fê÷ž~UœÝð’‹ °Q!ÆgÂÚ9.M/¡Ø¶îÁo&¥•î2öÀé€pT¦­ÚÂ|sKÌtçƒÜ-1£rµ)8kZq3ˆ®('ØÝÒêLÓ ¥‚«Ò¬EYSÉvKý!Ýèî==zù«ÊÆÃl÷€Í´\– €3'O¿ùðÿ®½LJ%¿Ii­@R &¸Ù 7vs9¹àãR¥Í•(ûg×Ü7]èr€öE¥™%õn r„Ê(vÞ H°¼ñpëñ÷ǯl¾IJÅêäbë·{Ÿþn¼÷øÁg¿¾Êô÷:G/Ë»/Œþ¹^ÛÛ:}{‡/€Ú´Êvq|‘ë +¥Ý˜PY PWÃ7\H’Ï!\ÆŸâQ1OY-6Ó1Z;éÖöÁýw÷ÞþÆloäLJÍÝdzöDý³ÊÚ³îÞ[gpaÓ1vöXÂI*¬*•¾°-Wh{’”ªaÊr%ø¤\J¦š ,¹Š0h5/à³X$Ñ@ñ,©úVkûÙàèpqÿœUïlÝ ›TréÎÁøôíÙ«v.‘îÉ¥!"Y´æ¬½³¸hÑ™.a´a((­BùR{Û(Ž"¤DSt¶9K˜Ê†)Ûªm•G #×£I!€Ãg{b¶SO_Ûý“8Ÿ;8züîÛ?h¹VRÈ57žÕÖŸúZi×È‹! +¡¬Ëß6Çgs³MfMT®I…u»{»ºñ´8y@É…go~qÿåÏáÃdHdpòîîÛ?¿þƒÑ= ÓY”µ~óÇÙ={éFµ›nÜ‹êrqÇlž’©Î-/ÁSíéÂè|!È„ 3ÎfÐØLϨ索ۜQ½üì—¯¾úwFi-J§¹Ù­ø­Bÿtëâ³ï~ìì¾ Œ¡ÖE{ìC•ë+±¿¼á¹¶7o…+ Ô™ŸÍ‡ÃI%[ÝòD¤E/ºc ³-GQ“Rê“¡´²X—&wªÓKÂìËv»µñ°½ûdpøôüñ‡×¿øScãB«oÜ~ñëË/ÿqëÑ_^|öý˜Üþ\ÊOÊ­ýƒ_éÕµD +ovµœëñ Ê° ƒ8½êGE¨ œÝuÆ祇ãÓOûÇ/”òpãìe{ÿiv|n/Ôú“Íf5Ç \jc+(؈^ª kx?jô½”“Ptnd´’©:•íQ¹1fô˜tŸÐÛ„V`¶UR.b²ƒÈ§ºzñåäΗíýOªës¨o=«2Þ~ø¹ÞܶZ»ã;_d'÷…òºà €X7OžÇYÝ“²¥¸N§j~£³~DÆ%G/ŒÁ)ýl>vËñcT‹ƒ39¿"ÒÞ¨hÇqÆðÄÈÊÉ_¾ûëÇoX;}í´vå\/ˆ +­ƒNÍv ó“ž+¥òà¤Ü;ÌÔ6\QöÚRÔåctl[RÈ %eçÓÕî–’­ÍyãJv0¾ýfûñ7ýÃçéö!¦µg7´âûï?Ù{äNBåI­¡sž°§ÂÔ$—©ä[| —ÀQgUÈOI£c¯¿üáÙ»­–ËýýÏê›Ïþqº¶t犮ĤÖÚÈš9/Ž§˜J«ã‚£í«‹q_„鯞üÕÿyÉ‹__Œ¹ÂB‚ÏKΚUÝË”§´”î\ðV-4kÏ5dò›(›ªŒ[[ÛëëwìÎŽZÔ&·7î¿_¿xÙÚº€âi5wøü*¦ÕŒÂ°·yOÊöfSYô™Ÿ'E y%DEp¾g´²;Ê­`r>U™ŽNÞœ|ò»Íû_t÷.7îýçûïO?ÿ4k~µ[œ^fº· ã{Ó‹ç¯ÿzrû³Æô΋¯ÿF(oø™lªyPœ>ªl¾Úyò×;OÓ¿ý¶µzçoþõÿÅßü[ˆÍ¹QcI¹1=*W…âV¦}\>yóÍöý·Í½§½ãWͽÇöà°{ðd|ôòôù/ýüGPÃÚäìáû_|ûwO¾mï½0›»´5›ÛÉÙ«~ÂrÅù›‹°TE.=P +ÊhÒ™A€°Y³¡õ•ÞŒË~¼X™>*ƒD +àk°ûXÊ÷ìú¸>ÜsºJy‡0ú¸Ú"åjœ2æ?î" !% ø¢Î6ˆŠ¸TNÐ6ü— + J„Z‚ø–1¸²…0ÀTÈ„ >Á§D»nTV»;—““ײ3HÊp³5gÜ‘ATIðªUµ´gì +˜&ùQÝ—=Q.Œ)A:]žœON?im_=T­¹ã’šn[¥U”wX£‘J¤ÜPs#R)p-9[z@¯„¸fÜXB®ÏE¯Í‡W‚,B[IƤµ2xþ+7ƒþ¿¢¶¾îB¬+&x#,«—“‚³éö~¦s©vìÐø¸µõ ¸z/UÝÒM«4rz»ŒéPš);->ÓÊvOò£»Àz~Lƒ–2!Ý™÷Ë +N( þ„16ïIƒ$Åo·ÍÖ^uõÎøàéöÉåÃ7_¯]6Öïî?ùnýîק/~³{ÿç•Ñ‰–ï¥qm°þì µ2µš{ýÃWo!òý6 Ý|cúüݯïöË—KUw¥â†Õ:Þ¹üåÖå/‹ƒ“Éæù?üëÿzùáW©Ú´0<»Ý;|üðóßþòÿÛþÓÿõÍßþÛgßüø§ÿøîWÿhvÌöZÛswGÇïO_ýaz÷;Òìñz­ƒ_ßöã†K¡r!.•äÚ~{ïS£±›”œÎô„7›²3IÕ7…âÌ$g›—GÏ~Ť«ªÓÒŠCÚ46žvö?K5Nbœ¿\ÚâÕ@R‘¬*Â; ­!<óqs–ôrT$µzixΚ­ eâzspôYmó‘TZòcÖnGèYšg„p“2ŒQaÓ-.Ó’ó}Æl€40`¿ÎßûP¹L?JY¾˜5I÷£„—^ÊõBL&HéDª*W¶òÃ\vB¥êœZâ´&”\ߨ‹–Kj~Ę] T°‘aÒº±ŒB”&y'ÁÚq:ã +³P„g3 +!æáŸË!fÎG,„y?‘NùÙŽ9Z9U—Ƨq>Ÿ+u²Í)cVÌêªVÙJJ•Ös­}»½K§r‚éÈù&ç”âšVß6ŸCkÍti+SÝtû'¤mFÍ—æ܉ëK€ˆ•aõÂÚ "´ÕlNïîù>þ¢²vÂX%£<½°[…ÎF¶¹N5LÌÉÙš¥ ®î^er*dÛ¤ÑJˆ tŽ”k…n¡³eT'~\+ NŒÆvª²1Ø{ÚšžçÊÝáxë͇ïLJ÷T§=Ú{pïí¯ž~ý»Wßýéù·xòÕ_¿øbíèÞË÷ßž¿øv´ûäâ“ßôOÞ O?l\|¼( o'åB¦8üä?:~yÓG,†R¯ ÎÄ>¨o=§ôª —Þû5Û àf˜wôænaroãî×{Oè~6æâÑÛÏ¿ÿÛÆÆ=T­òù föpkÔÞzqøü·ÕÍ' >ûøÍ/ê«g+ °Úè1¾„kíÆô Xt%7¬ß]=ýµ¼zÎf{1¡À¤;B~XZ» Óí&)¹øI֬õˆqiL­(ÅqïàÕ“ïþ¥½óÒújõì3³¾-¦ +Ÿ¾ÿîßþûÿ»ûà=n¶íÁ…3}Ö9ÿöÑÿ¸ÿðçµÉ¡Qh|õ›¿ÝðÁ›L-9©´“Ýoí¼¼ýêÙÎ]úå?ÿqQ=¸€ÄL÷×Ï?\¼ýÃÙç«·ëãw¿ù—òè4ˆ¥‚¤€\]»Ü¹üîÑÏÿ®ðF+oßõ«|çðÚ +rsY‰ˆ ®DiÍBçprüZ0ê_~ù»ú_½[C¹v •wµúÑÎã_Ÿ¼ù›òä2AgŸ½ûë§~kÕ¦0æs2+ˆé(_bÓã[>nÑOŸÞyóøÕ7!LûÉMßOnxÿüªÿÊ"¤Àóƨ x¿öúkµEgD›-àܸ0Û̈ÖjYI.Êw¢T*J˜RRÊëvï´½ùpýâ­VßJ°f¡½§×¶‚Ìl™•Q—#¼Qh9'åh’÷G0ZÐýQÂcrQ«¡Ù¿"Wü˜¬d;v{§¶óxûò›Õ»Ÿ7ÞX3w‚Š’ëFÁÊrþJT +'u&Õp:‡Dªgsvu)D¨A*½WB”"t Ùl²G05×9€”—Ì&-Øžd¬Li˜kL ÅvGq\ÊÒFEÊw»{¶ï½¿ÐKc»¶jT§è̤t‘ (mÐBšmo\˜÷¡0b¤Ž²f‚¶ © +-æÁ&S¸\fSu”Ë ‚MªxÝÊ–†ÝÉQ}tD賧™ÝÝg•µ;éÆš© f1•)vÑ‹*K!–Õª‚Õ"ÕÂ¥#¸AE^-YÕ .7ñ&tóÀîkÅÕþîãÕ³×¥ÕsL°+Ñѽ7Ns +ÙÖnº¹­•&¼Ý„R†rvŒ4ùY_¯ü‚Ÿ +$uTªêåtãPÎŽhµ¨ùZw£»q¿` ÎÌÞYeëEuãI¶½•ŸPJ¥l?Ù: ¾ ¬  +¦ZšÝ†Í–'Ìx@MÓ­O?üöÝ·?0íÚJr1¢xH'iôìÞ¹Ý>Jej¿úã?úõïÜAæúbÜ“Áüç†['ŸC„b,+çìÊeÓP4p¥`T×Àûµ7ïUFǘRµüúþÃÊ`?€§¢TšÏôH­F©Å(&xøË&AÖ" $‚’´V*¬=g¼×I£MIödãìàîgVcSpzfcÇh%¤F0©¼%¤ŠÁ8JˆI6KðV­éÅ5à2B,)fKÖk­þÁäàyˆIÇy;ÁÛa,åò³c–ì|kÓå„}är€I0øB+“jس*1F3ÊãòøÌjªÅÖú#«¶g¬öø¤Òߢ*ð`”2c\Áç¾)XC8$_ÕÌ¢žë¹Âà$5ÿŒÂô0acR9BfÀ +3gÒ•jª45 cBʃ¡ +b*9›=ž‡!y3ÉIÎ"Dsì~:Æ”°T •Ë .‹‹:)(Õîªî´®»ÐÙº°òvkûéðô]ïðeUQÚ$øL‚RPJIÐ`ØR¸dsVÍ(ŒÒˆR ŠQT¬Á[!T!Åœ/dÂYî’j<É£8+*)Œ¤XI#D˨)«ãì(¥kfyÿøÑùã÷²]ƒTµ{õÕÇVý(Éç☊ÑpR1LE3†+qBÃx›P*|fȨu„Ðu³z~þâÅ¿rV—ã¬Åõ˜^^†7B¹ø=_”cZ„²XʇÈ!\cÔ2<.g“œQêíå{éÆ®QÝÒ +ëŒÞŒÓ–áôõÂâ +á²Vu3Û:ô„VÑ–½‰@“´,§å¯Ì¯/EÝQ«¤ÚFøR„È‹¥k›tªF%Îæ¡ê†ÉtŒsÀCaŒQÆ’ ǹ°s›÷¢`H|8c3(“Zñ!©t+W^G(+ŽiqÒÄx)œÁšå¾;BBåt`·#;£G:Å)ð¾µn ÆÑ$£c‚ƒKù(ex¢,Ý•D¤kó¡e/– Œ@LˆÁõ¢DR D¹8®v7ïÈV=Œð¤”OrN’Ë¢9¸äI,¬„=§ÍEObÑ›Œ$õ$1óm#×”õ*Jeÿò†ïÚbôær|i¶ –t‡)>• Dm9¼²bRu)ÛO©­IÙž;B삽2çÅð“ +2#gj½Í\cM͵Æ"´+„øãðœS‡çÄRxßçù~?ßê} =_I§Ù‚K.£¸è ÅÞ‘)Þ¸Ÿéßäë)çù‹>P‚5ÁÜ!1„&}AÌë Ï.¸/̹ÝþpBU‹y»\ÊIàù­—iX˜÷âBpv1ŽIÞ w~ÆûÌ™ùgžwziZ.“BÎbH:¡›E#]õ2”t0ÊC=kÍ.Ež=·tî‚kn!àòb$o‡QiÑžž,¸Pw€AH3BÚ® ?5ã=wÁÁ*ù¥ŸŸõÎ.E>*Ί^ŽºËÇLÏ!¾ ;éŽÙÀ¬+æ€xrKž(NsMpQÈ¥ýn\àýq\1s…zWÏâ‚ìD"ÑH"iêËZ¾ýì´çÂ|ÀµÊèºÍÀ‡Øj9·º³“È•Cè¬'æED”NPR"™NÙÛÎ[››«^z¥Ú_\ +\Xô]˜wã”Àrœ¦©‚(ÃU•l;Åp„˳èó» "jYr±d^9ܺ|²ß»´škæTCæ‰) OvûuÆ¡Óy)¡$U!!)Fg A«@õö,8ÂðÙr£ØrzÆ*vQNc\8λƒÄÔœÿ SNWTŠ2Ù‹‹Q:§«Òö7¶xY™w#a\uè +.§£œ‘o® +©2—,rvÉû£ BÈ1R`à’aT@HŠo²œÌÑd&­'ô$+ˆ²"xŒ b…´ÛùÕñ€ä@É ÂBT<áÞŠI(¡‡¢¬×çõû\>ŸG’¤F1=jd÷Öê·O†×¯¬½úÚ£Kûc#©Ç(9€pà}8™œ]ŒüÑ3³g.º^4Äé GÃ$‰Óš’PEåPós<ÁPHºÒxçáö7ß¾úÑ›W÷óïýò'öö˧‡ûëÍfU¤p„Aî¨8k‘l* +¥Gòº\Ëêƒï×ÍAa¥SÜÙX¾wëðúéøÁݽ7ŸÜxõ¥®_kÖ›fÚäy: LÏy=AzΉž› Ì;±³SŽ³SK³ó^Ÿ xMd µÕ(éª ±D¹˜-• +fʶÌ|$F?w~ Öí‹Gƒ~ ª„«šB®ŒR/]íÞ?î=º9úàíÛßùÚƒ¯½qøÁËk¿ýþ“úå7ÿÍǯ~ù[{ÛCÛ¶Q‚u¸¼ç"rÙÒÏbý\h£†]ß4oÖ¯î×à¸s²üèzÿ6Þ|´þÁÓíßþðËÿç¯>úî×o½pTÎ&1—ǽà +c”ŒS"EØX e G=áÚšúôjõÃW.½÷âú;W>|uëgß{ùŸ~õÑϾûð—ß}þŸ~úîÿüo¿úËOž¾ùh÷úa7›µ£1.aA°2¦RË‹ãh5½RÂWkt+O¯÷ìñ ·µ’½u¹óÕ×N~ó«óó_|ÿÃ^}òðð`$zÑåtâ~Tœš÷>sö¢ß¹¤sKD2JLgÝ:çë””QÛ‚Ö8\µÞ~rå­Wo>}tü­÷îÿðóo¼þÚÃrÕ®¯.oŸr©zÈçV˜XJ@)âÊŠñòµÞ£ãæñŠúê­îß|þæO?çý—v¿ñdüw?|ç_þá³ßÿæ;?þößÿüòüÉfNeÂA_Àá Åâ0 (‰x Ö?*ÑŠþõ›?ý‹7>ýúݯ<}ü¥í¿úößýø¿þøùóúïùî?þðů?î<:©ï¯W3––Ífe-«$‹ æÄh+߬ ÷v o=¿ñʵÖÓëï}x÷W?zÿ÷ÿø—¿ùÙG¿üüéÿ݇ÿßÿó¿ûùwžÞè~úîñÏ>ý½§WÒ†êpE/̇\AŠ`”`À ¸ã!§ˆûdlqXbnnoìVGæµÍÌ“[ÃÏ>zåƒ7®~ðöóo¾òÐ2ÓþEEÇ ¦Ÿ#÷ZÜ ÛÆVþü+·>ûÊÍŸ|üò¿ÿë÷ÿßßÿä7ó ßýÛWÿëoç+÷÷Ö*iCbXQ324IÈR3ˆõvuÀßÛ4^?)}÷탟|úòçÞùäÝ+?úèÎøÑÛÿýß}û?ÿúÃ_ÿå¿ûüá/¿÷èõû[¥´Ìr,@ˆÓO(ZQW×òìk—Í÷n—¿v¿ùÙ[;ûg÷þÛo¾ö?}÷ߺõëï=ÿÏ?yãøôÇß8ýëoÿü“›ßÿÚÉËÕjÑöB…I4ŠíåìfK»³þÖÓõ¿úæõOßÚýø­ýßþøË¿øüÕ?ÿú¿ýêñÿý÷ÿ¯ÿë§ÿü˯ýöóÿëo¾öÞÞ¤QÄ}qnÞåF£¤Ê²ƒ’Ü2ÂMÍwsÈ?¾œ}t9óڭ懯í|þõÓOÞÙûɧþËßöw?xûw?z÷_~ûÉÿìÉÑvk0Zµ«ƒ ®¦M»d) ³× àé>üì;wÿö{þâ«Çß}ïÊ?~øŸýŸöøó÷úñ½ÿô‹¯þúÓç?}Òýð…Ú•RHñ ÍÍÍ{Ï<7r¹ ÆßÏ §ËÒÝmûéÖû·~ògOþùïÿû¿~ëïø¥¿ÿÑ›?ýνŸ~ëÚ_~yûýûëÉv†JÉ‹2‚Ž1ɤYí´{ã~©_àFyüÆÿÚ£•ï}åô‡ÝþÁ·®ÿü{þþ¯ßú‡Ÿ¼û‹Ïýâ£Óøþƒÿô7¯ÿæû?ýÒÚ{· +ON›•œӀĸ¤D­˜ªZTÛ&NFÉ{©§Gö;·ëŸ¾³ÿ›¿|ú‹Ï^øÙ'÷ÿÇøÞÿøùÝw¾ûÕ;/¿pHàta’½2ÍGZ¾Q¡¯ µWO[Ÿ¼yùó÷oþèwþå—ßø_ÿõgÿø£·þêÃ_yïÒz5•`œˆb‚¨½HØÏfåØjY¾ºV~árýÉqéû_>ü»¿xåw?þÆ7_¿üÍ—×þâÝý¿þèÎÇï\ytµs4nÔ«uÙ(²j"d±‰£˜ùR:‘ˆ®M í“ÕÌíÍÌWî÷~ðÁŸöôó¯ßþî»Ç>Ùóæʧíç÷Ê[ËÉZЃö†)Zªhf›¡„\*‘IÐy•X«*ŽšŸ¼±ûÃNõ½‡ûýW÷ƒ·þùçþÍ'~öí¿ÿé›ÿò³wõ§§Ÿ½Ú|zRV$ ¸ü1Õ¨gòQ2U¯%Ɇ[µÂ÷Ö•7nÔß¾Óùök—þË¿ûÆïýÁoøÚ?ýü½ùíw~òg¿óöáûOvÖyEKâ\*F%K•žÄó)™Úîfz|”EŽ:Ü£½â›·‡O¯-?8¨}ýÁèŸ>úÉÇ?}óð[/ß¾=¼¾–_­¨:‡Ò”€ ™é¹ †R4ÐIÛ$wºöáZõ`P¼µ]ù´õÖÑ;Ïo½u븟:YN^é[«uèu :Ž¢8`~FÎPbVL%9]Êå )5¯q›ÍÌÉjåê0ýöíåO¾´óËOnýóß¼ýãîýéÓÍo¿4zã0óÒVêéAe³*«xÅ!àÈéB[/AH<ÐÈPE÷êòñ2ÿxß~ý´òÍ—Ö~÷Ã7þçïÿüŸñÞ¯?ýO߸qmÜèU²½T ¡l8@Ã…Æ3_1¹^^Þl¦NÇåÛ•¯´?zåà;o_{çáæýË­>ÈsyÝ Î€'ʧò+¥ö¾‘ð¼.d-c\Ù^½y¼ÕÍQWGÆ+×úß|ë…ûÇ«·vêðÜý•L»¨›¯© ŒIùâI?nÆø<¥–H¥hå;šf2hL¡É¼¡æ ©l +ã¶}ºQ¿u©w}§uyTTsýR®“³LM HÔ¸+L/yŒË!¸âõ†^o<Vi¦[*î jW×s/\Ê}øÒÆçï_ýÓ×.ýà÷ðÁ½¿xçÊgoìýéËÛïß]¾¹aê| (NõÅ”I#TÊ ‘(ULg›9Ûbƒm3v¹§__µîme>{ëð?ÿí·ÿ㯿ùÓOï«w^¿7¾uÐ\ëeºÊkÕ^F¹4Ê!”ãx½Qn¦.¯ÑKÈ«L9)öKV/§süµµÂó‡Ã“µj+Å–tÙ”eæP”qØY55›^‚Ì”!ã8±hÌÒµBÆ.g2UŲ̂¬%ÒY•/›’FEU,š¥jµ =BÀq1]@ÏBÀtùðP˜àY¹­®ŽöW{kµ”²QMÞÙ©ïÔäëë壕ÂvMÛ©ëkåäjÙ,k‚w~Öéb*!Õ‚Xrj6ð'gfç=H¡i[j¦œ“bý?®Ê7×í·ï­}ù…­—Ž‡ƒºÉÐJ)ɲZÞ*Žîa\â9Fp,ŸäÇI²œ¨U+Ŭ‘³äœ)ê +£(¼¨&⬠¤9|Ú‰øã*(Æk.@z‰,yò]^9[¨ÇÂAC`*ÅòMM±´Àм?ó‡H„ö„éy/>ëÆCt&YÙ5ê—0)Ïë%œÕQŒ“ÕL4ÆB›ˆ¢Ñélöû;­Öš‘´ zAªÉŠ7ŒŸ™u,©«mFo‰ÉFëÓ³ÎÙyw‡‡Y‰DFK™”^+¤V»¹Ó­ú¥~úd£rukyÜ.ö +ÉNÞ*Y) rfzÉœÜÛ~Á{fÆ;í!c ñV±±›+öYšNXÉàr2–c{½âÓ»'¯<¸yuo¼Þj˜ªD‘xÅ11$Í™ZŒœ½RÜ*ônd +ë,—v®Þ|)†rŽ¥A*ºžÏfëÅRÛ¶J£|D8*Ï-"S3¡YéÃ,¢;#jˆ0i9ïõD#A$Â朱 +dî‹ +a ÓÂY Á§+ +Ad½aŽì(™Œ³Y6Õ•s#gTþ”Ëé§<‰Ñ†’jpz¥R1”…J«WšaO ©Úi»¡Ê) ¡â˜Œê¢ =;í©8—_ðÿú‹³_xv~f1˪j&´L,FÅŒ§]Ri$"aQ™ŽË ’ 9çt¢snŒ·úöò5%7’2£ÊèTε„€p¦`uÒÍ£¶ãSB”t£¿9ëGÎ.çžì +ù !³F$ê1±@+¥Æê e¶ç¢jˆŸÜ”árî˜Á“qRsxcgg=ЉmS‰F\,ð”Ÿ0¼¨FýaÁíù?’ÃR„ÉfKÉtÅT-™ëRÀjÕeFØ ¡5h½É )Ûí­fi½d²L÷áIOÜ3™•vF¥‘@y“ÓË”’㌺^&²=9Uã<ÉJ’f³j~ÚéwøÑ ¦³F_*„øÂ|€:·~v.°Ã\™5û.DœósÞÉšü›†p‰`¢ e+ý£ùñÉíɸX +’éi¹På¹¹Éò×ABgôºU?ÀÔ¦ M¹Ùkj~¤Öf]„+$ĸ4­UY«ë'ÓN$áà ZkÁÈ,…„Y*vëHÌŒ˜T/Äæfü‚ËÇr¢Í)ˆü˜Z—Ë[Zs/»|E.lÖ•bŒYébÞZÎŽôò®Y¿¬Vöf"‰çø™%Ô›Ü4ôGÏ-\XŠÑ©e­u%Õ:³k®ˆzv:è ‹K~á‹Sþ©%4Ìå¹ôªV¾,Úk.ÔXŒ¨çÄ¢Ä9+WÏMCÀYº0tø¨iˆz•²s‹‡;‚Ä¥(>ù>Ë‘‚ÂRTñR¶7¿ðì’TÞŽ*%\É­_ºWY= ŠYT«FÄeÔX³%gÕµë\v¡R\) +ùAH,ÀsLŽ²VŠýëûÏÍììŸó’NÌb²[Jí˜J¯!RÅ‹iK“ÛÒSä¾ PVˆ-ÐæHÈ©TMÁVœ±„7üd +•k|f%Q^gÌN˜Ë(¹»µOiUÎhÅU2=0ºW­#¥º#dWH­RÛ¸O&;^L¥ÉvZ\vˆ%Û!©‘+"`ËêÍáá㟹è%œˆWj> D©úISN5kƒÆZž¬%nôBR=ªtHc͉¦TÚ×æ‚ôBô¡2£Õ¨Ô(&Ö]!Þæ9½‰k iÂù'›û0G1­Ó:~(rÜÀÔ*ôšÓ ¥ì‰OÙsÙx¢‘j³QmÊIÆxÛåfܨ'&û©4©µ0¥†«08TªZS°‡ !ÑGXA¦j&*“»l¦œØGœ7'_Y.†YWLFµH¢Uêœ= ŒV„Ëi Z{.šp`F@(KÕ:;–*{RñÒ¹%bÖËbr•Ôjn,¤r^,ë‰Û Î6ç'§ÝdT,JÙU)³êÅÍ/µÕP­C¤VÄTÛ“.,"_¼à›ub žˆ¤l¢ùpÃS"TjÁYƒÂ³C>·NgרÌZTªž›ÇeLo%Kk{×ßÈõ\T2$æ0¿Å5èŽÉrîéåÉm*ëjiäÀ•é¿7â‰NnåNnýsùZt²l¬F$Û\nÌå·¢j+À—`üè£Ê6Ÿ¹°¤ÕkE­Ÿˆ¥}˜,A m82µì§SnT%’M1?Jµ.Ûc«uY«låÍõ+O³K6ÍÁÆÞ˽£WZû/[ý«…ÑmÎè˜ùáàð‘‹Lù,”—ßN¶Nr£»ÙáÝdër›ÜsJ›=\kGå +Ô'aÈT§³~kíä ÒhucN"¥V.¥—o'[·P­ïg +è6‹JE*yâÒtHXˆ¨¾¸¦mD,û¨Œ”_WË›!Þô3f€/cÆ3jSû˜Œ'–hŒ®Š™|Þ™‹ˆÚŒ%zdz Ó b>D͟ÓAôk˜¨\JÖ÷“µK‹A‰6–k•Löá½Üdz5Î{ya«¥˜X¾àÆL:®7){H¦WãzÛ&&¡fWƒ| >`Xª…-ÌXfsñÔÀEØ´5Ô*»³A(K5@å Yàõ…ìj|„´ý„ÅgF®¨>çe'+÷¢ M­¶׺ ~zÎK-†dè;нg¦_<ï~v w“9Æ\²ë¸ÖZô±Ž@% Mj^ÒòPi?mC»1©Lt¦sb·/ƒ „Å,¦×ÅâZ@° ½FZË,¡ÙÕ+ãÂÊ1Ÿé-¢ +iuÃàlQ*N¦à“Ú¡Æ$[Jq݉'axi{(·ò«÷ûWÞ®l½èãòÀ!v~´²s×E§—'ˆLTl°™±Ñ½fô¯ÓéžhÖôÚ8n4i«%J:Ý×ê{jyŒ$JRae|ëíÁÕ§“e£Z‡la+"U¡ß˽Ë+‡gB,™lÚ½«™•{…Ò+7¨ìZ@¬¨¥qwÿ¥tçȉèZy{pù¥æÎóÕñýÑÉ\a +±?ìZ‹ªP0hZg÷Icç•ìÚ‹‰ÖI„+†Ø4è6au¦|ìRXF¥:ooñ¹µz`´´F›­Dý²XÞ£s›ùµ{µ'«úä6 ++·˜4†I&ëTzEȯI¥mÒÞp`“›Ý”ÌJwû^LÌ;êJÈ SktfϬGÕ¶3–Ì4ÕÜêlX +°En‡ù²PÜSêÇ”=ö9£´¾{í7fL¹©‹„‹ m÷¯¾Gè£;_zÿãÙÍÝó>~5Hk%3~¡vùµÂæC¾°é@õTã¨Ó|PšràA>ïerP?VçšRÚ[ +*$ãAåiO´kÊÇÏFXjÀ—öÍå[_œ]XŠúq݃§#äGˆRB Ò’ö8šè€WÖï–F§ Ûra tŒ±W0½Ëd×…ò&kµû;·×O_ás+àbð\!³RX½U;x*TvÕü`y|úêW¾W¹+ž\¶z7Jëj[ìÞaˆ³f ÐÉ¥¨Tò±f$Qv16a-×·^\>|#»rƒ´ú”Ñ)ŽncF'$–èìzfx[®ìQéQ¢zI.mœu!‹Q"QèÕ‘zÙbXn±éÉïí׎^^?~rÚ6,Z·2zÐ9xC¬Æô®Tî¾òq¦µïŽ„Þîî½xçõïÜùÒ'˧¯³ù ?“¬åWÞýLÊ/ú?Sär;ÉÎÍòæãá•·²ƒ[¨\l®_K7¶¦ƒ´‹4Qc 6¯u¾TßoŒïÑ©^T¬XíC7fº±m ˜ÜnŽ@ýÒÝkÍÍû_x³o´Nh{•J÷ikkd¢¾vôèøñ×ACl^-íªåm>¿†ê]D®Ù¡u +£[ðïSnÎÕ…üªZÛIµ3ý« @¼>Î,m46ïÍù)'¬ÈôˆwSÛ©yÁ˹•k÷ß‘R­õÌÂEgðL.í—ÆÆ·¾ +^ãˆ(ÇÏUɯ:1Ý…§bÆÐOgüt¼I©VnÞü`xò%Ál_:zP’Éš`wÕÒF¾¥4º^Z¿¥·÷©d=۾šÐÚ`‚`¬Ð&bq3½|ŠªÕˆT³3;7rk/·_´F·ðTKÏÖŽ_Ñj~Î ©ö•å½Çû·ßÞ{þëõ­û‰âZcxR]=åí~ª¹_Z¿›jg——÷_ܼõ–ÑX«ŽºÛùü:ÔmT­†„¼Q\ëI¥]"Ùá¬Vc|ƒ4;^:=ÉÅm +Û^-_è¾5)ƉæåîåÇýÓ/™+wbFßA¦Ý„Ég–íþÑbœeìVLoãæNLo^¦3+Àœ-­=L÷oX½S½±Ç¦:éÖ%¨±°žìžjÝ+4´Ö´›GƒWÄÒz· ÃëVë ¹qãÒÍ×z•Ò:g4û7›ã„V³êÛ{·ßÙ¾õåÁ•×º‡¯d‡×y³ttãÉÞõ×ý´é!­¸ÞbìÔ@²}ÂwÐD˪ŽO¿Ÿ(¯(¡´+Õ.gWïnÞ}¿wðT+nn¾Ö¼ô n6•æ]ÜEÍU®¸§7¯å†w ³Oiå“ïµ6ïOîvdsÑD Ñ;Xª“«™ÖQqùdýànkëNTëâ“m©WÜÐ’\”¶¹ûp"›¼mÔ7­Þ‘Þ¼”\MÔö€Ä~Ì.Též—²p£™lZý›ÖàNqüRº‹Ï®Ý{û°_àj²Ánc?Û¿ž¬ïÉù!l\.övï÷wïëePû6³¢×3­k¯¯‘êû“Þí!•ZÞ¿ñš]]óÅäɯƒãtç²ZXs˜9ZŒ[3A™I6dª:¾»vû++¯ëË×R½£sŒ›k³•MvZk7 µî‹‹aÊðÄS1¡À†kf[D½qÒ»~Ê>ïfœ±©} ö œ‚éCÐŽ… “ó`ɸ\ž, H^ÚŠÊeÂZu[Ê°dÃOh”Z”RË©Ömv!Á‘€ý:·zn ‡Ò* oæ‡w™ì("—€É¥Ruå›jâr¡¼~³µ÷Æ¿øÚòÑ—Šãç‰t7ÀZÕ[ˆHcqv7@s–Íú¶ÕºD(g%²]½Ðδ6ôÚ&t7–lÑÉ’UÛ²ý™…'êð›ò²›[Q*»‰êž^ÝVË#?¥óFýò½¯¬ÞxG®]JÔ.™ *vÕë+Û·A"b);º›ÜÓZ'©•ûlaªh!"™ù•Ýë¯ØíÝg—ˆPžäôåkJí’RÚL–Ö+Ýý7¾üñƒ×?ri%ºBi¯±÷tõ·åݧWw½ùá÷³ýE,·Öbæj®ç×^è]}ÏìúC-®Ê…Õ?¬î[X%Rï N'OÖ¯¼hT7ºã[rn„ë-Òèzéì"ª³yæ–¯ñéeŽü(®Õë«7;Û´ê%Dªbr%ÓÜÕK«1©ÄwôîU£w’h\õb†KõȘ³>j)"¢jƒÊm%š×#T­E¸lqx¸|ùyp“)/½Sc‰¦Ñ¾š¬ìè¥1Ÿê,¹(0*ã0“ŸHPE<ÜBX 1y³~%×»C%»éúŽM„™ÎˆâDŒ™€äŠ¥¨Ô QÙ³EfÊlCß¹1‚<Œ<žìRö((V<´ámÚ¨;â +‘¬­ýDmG)nÙ£{±Tlj%Ôê&_\s`ZD‚¸ÔÆô&èoÔÒ6Dõ ™,ôó+§z}‡Ë­bfÛ/æBRI¯]—r¹Ÿ£R&ÕIUÆéæ¶\\]ˆÉq1«!N'• gu ˤ{' °˜ÖŒ©UÀHÚZ!RÝ¥Oe­¹]^kí>®l>XŒIDŒZuýú$·“5"ðD;?8.ŽŽ Ã`$\®°Ö´ú‚—€.H”7‡—_‘ ëà_ð}””!bv6@z ]ÌõíúF¹»³uåaª¼ê!Ó|vSÌïòöĈ µ¥äÖ›ãÛýKÏû¨´ÎIÕÃÔÊóJã˜Ë®ñùqTi@`î=̶v!þ{¨LT®ÙÓåƒWkwò½#«¾ )âµw?©nø¸²Ú¸l,O–UO®iÕÝ0“íŽN>üó_]{ò Plš Ò«jõ0½|ÃhH¹¡hv6/¿¸sãí˜Zós™ \‹ë=>³N¤V¢r3ÄôüJs|QʾêgKK±Ée+*”Ï-â3^h­4¼›jAô ²åDfåÉÛzéô¥3³á³K˜“,D¥V²¼—*ï‚oâbŽÏ­BJ‚Q o÷P¥†™ƒ ÜˆëdýJ¢r¨î@à…<óNY]<ÙKåXFõ6èvc÷›^ðS¨\%‰iu½±‹Èå “ q™¸R4Û— ½2%Öµæ=¸UÙ~¼ví­üêÍ —ÁµŠRZ] K~Ü ±ÀNPA”:–lúCͶ)£±„jA®°„Žx˜ +’5à+¢ÖàÅ×Ò©&P1eõ™Ü:T8&Ó½ÞáË^*y(ZL®B×ëÕ±\ZóN¶Þ3™TËO¥–Â<®UÕìr¹·'ÚÝ 漇]ˆ&B|Qù¥£ófÓln·¶n×·îêí‰C)U6½²U@ +Â|N-oÕÇÏ÷.¿Ae·]XfÆ'hù¡ZZwÉ‹~zÆK;b"6øÜ–PÞ]Dd®WF×ÁÂlÆO¥!êZõƒ\÷ºÙ<…Hè¥rju0: #n\‡Ç{Ù.­O^)¯^ri/ˆ½Å!„©m“õT¥ÊàÄ®í€62VG,m§»'õí‡zóŠ·¢š^®ŽN ‹Q±J¤–!¬A0L”6‹+×µâFˆL Æ7ëËûXÉY²6ä¬ÚÖó­Ý#| ÔÏMĘCR>;\á¬~}ýAuý!Ù<ëbæà +ª6çœ3ª8"rˆ²€.„TW+o3 ’‰²Q^ é¥yI#Ä—hsY-nðÙUs/–0kãtû2Ì&i PcyIÉ,pcö„IÊ¥âðÀž,æ‹“õ¾"ÒÊæzo,J+饡ݹTß´»‡ aÒ"¸!Æ— ±|v.>ëåQµž¨îæ×{àEµY¤3Ze›·Wž› _D<ˆ' Ÿ]·º7…Ê¡¡ è#˜œË…0Ÿ¨P¢*.:å‡'nDÔ+›zýÌ4QÝÇ’m/›uàæ|ˆ²–ÔÁÝ2ƒùÑm!·-åW1½Ž'J¹Î~a媟1½tÊÇšàï«'¯íÜy¯²ý)ŒÝñ„P­yÙÏfAŠ=D´Kί¯½\]=‘ ÃÚÌ*NT‡B‰kmxýt÷jaü 3¹Ö–œí!b1Ä ¨â‰&g­Â‡áºàÂcR×ÛL=pÓö<"(3ÓÜÌîÙyÿ™9ï\€†î£ó±âes0­•Ò3} ´™K¤úLv/îÔùàé!i bO{G/¯¸QÑKhKñd˜¯(ÅK|v Ó:ä¡×d°±xÞM-E®‚%©úQ®{ÍlìŸsà*ï@mϹ¥ˆìˆ%À%)kU›¹² ëƒc»¾íÁtwªÈZŠ¨³~ŽP«jn8ç#.8ÿ½þsdò‘snšN6úÑŠëzqÃj•õÛ@›zë²[G&+sÊ3n!u%Ý‚šw# +"LVþQ‹[MÀ5g„ÃD»³qj–ú(›$ôŠ›´ÑD[)n‰v”-\\BçÐ?•Y Ë^< µíˆÊR~œÞÊ ¯çVï&š'>¾ÑFÎ.—†×ÅüZjØì£Z‡Iàé“Ýå(Ã,ön¼K3! b8¢4"bY)íªÕ#ð™i/¢sœ¹‚©mLmqö:äô ^úÌc'˦Ŕ’7|q#H¦ÉD#"!ŸÎOLn­Ÿ&+kTa­åTëH)m±ÖþyÆÏ?7>Jyj!ål­²Yݾôð;­ý—…ìèübÔa‹½);€Ê©\ŠH €i •žö“y¤òbDn!E ÿ‹°iJÎD)‰TlB-‚ñÁàÌxÈ?¹àûã³îyƒÐR)-…éY¢ÓK(Ñ©µI½íÇì‹"F›c̺‹óÈŒƒŒ à¡Œ3"LÖÊ0úb~ `ÕOÆ èNh4Ñ$åDù’V?d²ÃED=»÷Ä“!&ƒˆùˆTdí©8Æ“­0—vPW  +¥W!WÚ“ïh^*nÜ÷rÅi&e^Ë ÉcT‰d Dqxsíæ—3ë7³ëgs¬Ñ"A<ñ¦·rýë;7¿:¾þ~~íÑBPô!²d÷hk9Ìç¡ö£%WÌÖU9¿ mW˜å&göpµ2Ùy„ÎN{ùŨŠ={ùºTÇ•Lï@.­{H”-Àäik”lªUˆ3iV/.ï¿þ Q½Ù£¨ÞÁ’ÊÚ »½å3ŠÝÍ,ƒk³™1³¬6h£m7v«Ã«ŸAÅ‚^ÙøL”Ælzd‹`mÝ”§5!`:>¼©˜ÛˆK ÆXXŠjjaƒÒ› Þ‡›±Êfljúe³u%*æAKì]^Åõ¦ŸÎDÄÚ|4 ŸÈ…¨P!(Ÿ¹°¥”¢–ës©†RX‹ÅÙ 7ëÁ¥ ­¥ÉMsŸ^!-T¬ø ËO]p‘œk´ãrmÚͨL€- òdß±™,üî IVC/®Ciý“µþˆ‰ây7¢;Cò¬rÄÌêz}íFˆÊ<;ƒÀæ}àYÅe;‚üöÌ´)(z¢ZˆÍž¬Ï‰zbÀLDj j ‚è3ä¾¹0%ŠË >˜Òx1®Ï…Õ_q"²#ÂF9+Ó>¿™[}€ÝÙÉ͉|”RÞŠÉ9Æê +Å HR˜ÑF¸d„’B¸ˆðiÒhR© Fº°ŽgW!Hqé^„Mù°ÄÄÓ+ýÝݽ—¹âž M!Œ— +^\ó“¦RØäÒ«À0Jå€L ]ñ”+,pz-.¤§Ýˆ•ñDÓƒšQ¾(Ö¡—Ã\“rvk;*äÜq=®6È$”ܵd÷€%Ì;(ZÍ]*Õ^Š)Tz˜_»ÓÞyòäà–¨CÆÉÕÆVck)¦cÚ²Õ¹¶¼÷âÚñ«õ‡juÛ‹ªšÝìÞ·ê[DZ‹ !j›Mõp¡ŒPÖ¼7.[Âò)tk„/ƒ8c:*7&?´H¯ +zP-ÓØÏöNHs€%»!®8`ã"°ÄØDL©¤ZW ¤ƒ“fO9c ¨igMŒ7Q.•ªl2ÖÒ“3ârÕQÎ,¢NDóÄY/$,BmÆÄZh²¦´¶å'í9^à@µ(׸o +£m¢æW•Â†+nþës^-7 +ÉÌdG<åÄR@vsO´–Ýð¬°$3 :žu‘“}`¡Gàƒ{ãÆL4ñÅÙðE7æ ³)s¬ŒŽ¾´r ô”ÏçÃHl‰–êÇ­iCÖ»ž>˜ì7„Š\ªÊš P­°¾<O_ôKRjPhBúð`J˜5¢R \yõŽVÙYˆ0Ó¾X€Ö)³ÇX½cø“j)Ó9È­ÝÆí• Xòàf˜+Æ-?¡AI¹XÚƒ4Yr!ÈÆ„<›EÅÊdÏA±(÷¤ò!žF¹Ü´;ö̬×Wq­³”a5&”ØTW«bº#˜-ÐO\‹«UÀD®àƲRÞ7š§¤µc;bçýø`÷ÙØɲ9n{ÈLT,ë•-DÈ;Uß˯–ìÖ–l9ˆ°„hõ¬Ê˜M6¦=¸3*/†¤ SDäêŒ;»€N9q!ÕÊ´v]ˆ4;YÆJÅ´Vet»ºþ€Ð{3^6Êf†{«+WݘÊà›bv]Ìo0Vòkɧ{ZeÃC™gœøbLpetOmG¥’|¢Øß`íþ"š<㢃|ÉMØ*/¶ƒÂô""ètõÔó¬{v&|v!æÁÓ þPZç¸ÓÅì0Ù¼ Õ“«!&¿Q§ƒŸ¹˜Ô\ %P¡Ìæ7•ÆŠL{¢ê¼—v’_NæGÓä Sîç¦#Q:¡³î˜êAÕiÄ¢ìR,¼1Qu)oÔ¶sˇ¹þQ~åD*®%F¸<™lØÃaµŽê[/Vï§z×X€‚t‘2>:I™}¡¸Y›lîÀnß(ô® öp1ʇhƒÐk!.¤M` ?e1©NgçñÊñ»à)3>Êæ09Nךt~#(U“Í“Ìà6¢4ýx²ÐÚVs}'–\Bõ%$é§ A×ìö©Ù¹j0æîð[0V £- ª;nxÉt¢¼]Ý|à…8@¤q¥J0_nÜ„^@Ä2>¹¡23ãÃÆøÜF~ù¤³ÿRXjN¹é?ô"¥{.‚¶J$»rù°³÷Zsç%D­Ïúq Étc;ÝØ +àšS?ùíÊ¡T= +  šsŽØdÿ”dkÚEœw`Ð#É•ÃDí+>L›vcî¨@ÈyG„ñÆ%?ú£arSZ1±äÇ \­{0þ+Äzeæ# +Rò}\-ž›âB1‘ßHV÷ÄÂ؇[^DÅJÉÑJÆ0!k–Æzi]¯îbz×Ï•Î,âsn,<ùI•1íÂ@ÓÂLŽ1z¬µ ÒœäŸ\ Æ…œ]ߌ0©©¥ø3³±¹ˆŽ$WÄæM³Kµ~RO·rÝËÿh*pÞIM‡T?_챘Ý^ +ðÏMh¥ÜÝ<3ù£sx@X¨ñù o\‡.PF„ËÐFƒKÕi½„+vÔ\“¥´’²½¢U¶èT+ÂÙð)›÷à¨:¤NÂW²â3„Þâ2k„9„öGeˆ!¦kryÐ$S=!¿ª#®5ârE-®Å“íéˆ2íçÂLFÊ®Pz#Q[½ëˆÖŽ(u“‹ÊN©à 3OtÈÔ‘›!¦l¼M\ôŸAʺ˜ó.T=ɦ†„Ö#ôtîBX‰ry/‘ž É!±UÛ´µ + Î…›³!nÊ…B…,oˆµ£‰NLëÂùK¥í™ÿÜ2äaº}d:Èf1½Uš`èvër¢¼C­‘„8‹Ëæ£Ú/눪ŒÑwPÙ©%trVÖÓcJ‹IoÌ奨 +Í¢L\ÌÍyâ“Õª1ù4–hB ‚¦˜õñ>҆ı•§½dˆ+ÑæÐh]fp ÊÙdÑK·WNR…_L^ +òND `zÓà˜sD¢([k®?}ó#RÊÌù¹¹€Í×~rb‚K~bÁ‡ñV“‹ ÎMÌù8À$€(„Ë… cÁƒ9L„+Çm4Ñõ3•‹N|Æ_ðâ„`“q:<ãåøÌäYri‡H.ø¤/œ³Åù—ìÎûY)Ýg¬"6œÈ$vA7!¬…+e9»ãìÉâ'¸ê OrJHÒZƒO”ü*“j‰ +¡<¸:Ù>ÏK#\×jQÁŽpV\)âZ4û2¢³¸ÖâskåûÕíÇBqÛ‰ªð˜D/–œ„2ÜrSy¦ÉŠ^…UÚh‰öh‚|@(y˜|"Uá•ÙÏrÁ‰ô?ê…š™ññžxšN ¢Báìl`ÖÃäÂBHŠ‰u?U˜ ªóáD€ÎaZÇMdÄ°d?ªvP­7ê_\Bÿd ™ 2¨Pð¡jS9³CgÖÐ䲇ÍÍ„8 ®eŽùð—©•¥°ÕØxA)Œ¡$H!Ëõ/~ÑC¸ñtT¬I¹qyx‡0†Î˜qÑE:#ÒbH¸è€7QµtO¯á;"ÒÔbl!ÈŒ˜4äA7a¸"0‘ìÇ”ÆdÁØùˆ7"Qjy),ÑÉ>—#r^T”µ7&uÅg„T ÅKf#JÇEC|·×„ôª3$Fq­9:ŠIE@¦¨Ú )“ë¹tb¦ U.¸1B­I¸& Å`²ó“„ºáó’Ú\€ R€•[9u¢Æ”››õK!¦È[#<Ѹh™=„ä€ì¹ {ÁÆø²VÝ— !ÊÚ<}¥³ý|H¨ú¨|H¬,a©‹a1ª@{ÎA yÚZAäÉ"–¾¨ +V vv>ÊÞ˜%À’Q¶$¤ú‚ÑC¸<”ú”ýÃÖöì¹ùÀ…䢛ñÑ8C(Hb$qfÉ·öÀOÏ.â$XØR@lãõj”ÍÿñyÿŸ\ ybº3ªL»èsóqøÓÕq©NkM\?»vÓ¨ á >Ì\ +©î¨¢g{ÅÎ>üE·S–œqc)¦¹pkÕŸsS.|!ÈÇ¥ª”Z=@&—¢ ®ä‚Ÿ S:˜—V»,v#BJa67ž™‹œs`Žh +#Àdˆ0 <Ñ&*UÂ|!&•à˜G”)1ëg¡B<¤‚T€9*br 0’L¶!¡D…¢[gÒƒˆPòQÈ t$£ nÂââbWkPl¾¸¡&«qª¹P44Ŭ‡†e³`”!HUBJà‰ð¿Ÿ‡Ô£š¨±Ù-(K>=„°0¹ÜÍg ¿Ï‡x/iŠ¹1›Ù EH⋈zÆ….!‰0W‚ ½ä #ÉE¸Ýžñ‹SPVÎ.‡¹,èœ_Äõ>›Ù¢­5ί¬]ð NàtóaqÊK"RKt¸üzº7¹äéŽ)b²ztçíæÚ©—HùØbXi„¤ªžü€³Έ¡SRn8íe@'[¢Gt?W¡¬1ŸÛ4˜LµsäEThØ9ó2RéRqx‹Ôêgf|¡¸æGµ9? yêí‚‹:³H¸±,co€òŸ_Ľ1ðè Œj˜2Á°B2¤`Î^Õ«û³f1 Âá[”ÖƒbvG€[3~OÔ¹¥â)³n"ÆÚBªCH¥0Fؘ<=\æYŠŠ1! }Á˜=d²—YÈ tªãÆ Èãøà/q¹ LïG¥&x„#¢B<atWK 4± Íè§Ó„Ñž KÿêŒPHcb|ꢌ‡¤Ÿéžf{×¼¤åŒ)J~ šÂ*@Ó>f.ÀAÍ䧵G¤Ù 2Y£~”èˆë Qy>¬€¸M9©(“aŒÆÜråds(¾é|á‚—™rĽ±D˜²Ï/Dî ú˜bXl0ö(Äe€Ö¦–bÐ\ðÄ7WÚQ©bÊ~2«„ÍL-D..aΰòìLD2bRÜ +;Ý˯ïÜÿv¢¸÷ì ⎠8µ;¾à˜üÌ>Ì’•K©Æ*W¦=L±{Ljm'’¼è§#º“Jé57îÜxåÏ– Uáif…¸ŠÝŠ+-0Ž?ìÖ‘ô“i/nÅ% ©eè:¹¦ÊeÈø0YÐÚsá8 ‘\%“ù +\½V€©€‹­öåsÀù@ãTqY¥4ŽkðúöR4éŽi!Ò:È—?®Ääeu&¿þµÇ ¤1¹"S¡a\*ÊYbòÝZÚ3#ª»".Q.³"§æÝ ~ÌæI½k¶Ž"Ba1"Íxh„Ncœ½ä§ýL4 ½-w˜ìº—LÍL6YV€K1),ä½t8‡0—A*i³ÚµˆÈq­.—¶øìzˆ¯BÓA+ÈnŽ3ç#pµ¡–"b9ÈeQ­y>(}ábÀq©¸à£fœ1Èãð¾ üZågARrÓôÒR¶O `mT‘'_ÆÕ6ïµ.=–&UW©®\'“xH¤–a¢ƒt!Lå"Lv1ÄA³Ä¥"‘hÅÍx( 87• ÐY’ø“óžs ÈÙ¥øy3íçíˆê€fKR~$¬y?O'!RjÊ‘ç¼ô³ÝÏMû l‚DJ:N©îÕ÷žÚÃ;Fë +mŽf}ò/„<È´ž›‰¸Â2ø k RµZï†Ø¸µÚZ~üÍ¥t æÙ{ßL®ï’­\[ûRÍ~2zí¢½IÚ¿ßú·Ÿ¨`lir¹5~»5z}ã3=÷™¾ùÙ• R迺8F–IpýÙ!WçŸ/ïŽ-´h]>&?…ØùÍű 8Lyù"Yé|ÌÙÕ›OgÖ/]]¹±º3µþ5ivrN5zã“+óáôÓñÛOomîÞÚ|ñÙ(Mã)MZÖÏ‚™OƒY;ûp|uûÆêîÜæ+’E¤¯É–›½2·q0µôllrý‚ž¾2qŸh›,ê/ãÛŸ…³ôß‹éÒÔJ{ñÉw·Ÿý»÷¾ ç¶.‹¡P0š®Á0¾þêÚê˱¥´¤—‰ÕÄñÈ…x;ŽnŽ‘n¾G«y9!ù°@‹NLD^v|ó!™ÊWˆ2X¶›í¿yñûÿkó›¶3Oè!W®¯Ú©”`î {µ¾ÿn|ýkC. Y¿É"9Ô$½£©ûÑ̃hú«‰ÕWSßÎ=øÖÌ<<’ ‘ƒ¯mý~éÉoo¬¾lŽ“Ñþøúâ9,ã O> &Éñ_{þÃJëOúæW—®Ý!u‚„ÏWßÝ\¡¯ß6Së“«í­oþÃîÿËõÕí‹×—/Œ-Œ/o¯¼¸xuù +I€ÙÇó~Xxú‡ÉõW£×îüæRú¥žÔ7ÖHÈ ‚w|“ØöêÒ×Ñü{“·¿:¯§ã© röŸüi¥ý»ték5A㜠®-]_x\_jŽ‘;37}çÅæÞßÝ{ùç{_ÿYO? C—ì¢/5Èé“Ë׿Tt͉Ֆ¾qç|8ýÉűsÍ "l3±þW_DŸŽN¦¸±´sgûw—®¯þ¦yãSr ÓÛÁµ… (é™ù<˜þÕùëWÆV#(  2ׯ¤+ñÔƒ±T> ‡h/Ý%éwëÑ[Âô×—Æ£™‡Ë_ý°øôwSëûWÆɾm4¯ÓW§ï†³õyt)^Z~òf÷·ÿtgû­™'•„Ô9)ÄÙ»¤šÉ†¿qçåö_?ÜÿÁä3ó4"Q9óøÂÕåÏôÌgj:šÚ\öÓÃ|zò_V_üùËxéÓ+äGL7Çîv ¦î…s_ÝX;"*}ðšœ2Ɉ}> nYš©Ókß©FKù…™#í󹞾 òŠ÷z¤"35¹ùàæÚîíǤPš×7Èï^ùê·ÓwˆU7®\##ðñìƒÃhñy¼ÔšòÝ“·ÿëÂÓß_"óãÊĹ+ãÁÕ…©ÅíùÍ×é­­ñ;_.´¸S+;d¶‘ÞЬÎѨ½ž\Û¥‘D7Ÿ˜éÇS«»W环_™¼}éÅÝÝ?¯íüí;ûfæyÇéì½É•g ÷÷ÖÚ?ÜXß[ÝþÃÃxpô×V¾&‘Kœ²ôèäNëÑB[M=[غJžÑ ±Éò—á 5N«¿ww÷ï·û_'ï“€¶šÜ¼¾°umáÑÕ…{óö'î¾Jæwì "$ÁøÚçÁá2ßJ¦×'ï´È`›Z? #ÿúBëúüÖùp¾qùú¥è–¾¾~1"Ý·JŒI*ãÆÊε[-²´u>ý‹O‚ñ9y®\»Ó¼¾6¾º»üô»»Û¸±ôü|x£™Î.lîÞ¾wô—ŸG$üɽ=OFÎôÓhú™‹${?½r#{FòæîŽ]^ܽrýÞ»<µü’¼ì ѯ¾LGÓ%"`ò©¿‹ÉêçWf~sþª[¾>w/™½¯g\½³¿±ÿ[oþóòW¿XÜ&VšZÝ~¸ÿ·¤7I`ž#Q@Zrejãé‚/“¢„hrsåáÑÚW¯×¶~ ¹ýÂ,Ñ“/Äˤ¼~seüüÕ}óñôý7‹Ï~;ýày4á;NêƒÌøUš:z`Byi×Ü|Fß?Õ3_ÚÙ+ã«Ø¿ððõìãoç;¾øœ|yþ4Ï´ +ãK;7VöÈ7_|6~›´êýKc ×W¶×Ú¿{zòwþøÞØ8ú,œ#s⼞œZx86{o4]8oo’®¹yïxîÞÉÔêן^;×¼Žð`ºH®ÁØí'ÍñU’i3¯&×È\ßFÃôý«‹mrߦ×_ê™Gäm]_=¸±òblîáØüýñÛæÝÙùíÎ÷ÿ¹õý¿Üzö[5ýäòµõ«ód缈f6ã¹­‰;‡8Ùsó0œ{|áÛ“áøÊ͵ó¨×=4·¶4H ­ÙÍW“wöHŸŽÝ~|ÿëß!N’¬ÐÏ'Ëé­mrNÕøÝ`lù³ËWõøâ⃃ùûGӯ©‡—Ó;c"Ι5Zå—8 +grcvã`bíe4ÿôʵO¯L›&ãgbî«ÑdÇýŒ¯/åoývvóˆÛóñ±íæóf–·ÿ‡¿ºL5swoþ«ï'7ߌ-<¿L”ùåÕófžŒÀñÛÏ›W—F¯®N¬¼œXþ:¹ùôæäHŒ|¡fÂñu²:HÖ]ˆÕÌR.úÚèÚª%ßaadÒkwÚš»ûòêÜWÉôC3¹~ûþËÇ_ÿþJ²@õâØò•É{ñíÖ…kkŸ›[—®­^[›{BFN8±Á +ÚMç^è.]]£W4‚‰ðæ;÷•š¾wyâŽ]xvûÙžüï‹;Ï?%†"‘Þ_ŸßüænûÏoìÜóK×ï^@íʆž¸ƒ#æo·HŸÒ4’-wíö3âGò•¾ŒæÉÍOæžÜ~‚Í×d^Lïïþáîηã«OÌÜs“äØwëGfòÎÕÙ{çãÙ/íôÊæÏéÙ/Ãù‹öö3on }`g7Æoßòêï§6_’Aho>&IBrõb²8¹öbl±uùÚ*ip”~­¿¼ùàäúR{ôÚ¹úÆòÄòÓé;OÆ’±wuiçááÿ<÷è­º)š_Ù¶³÷/__iÞ¸sóÁaëÍ?}õ꺵¹w}v3žX#ó~ýÅŸ¢[[ÄP—ÇÖÉÍ_ÙÛxñ×·^°³—̼ºv—ˆ“¸5¾½}ñÚ:1ËgÁD:{îî‹æøÊØâN²ðâÆêÁãƒ"aß|d'ï}¡n^%3˜¬¦©Ø>vc3ßIv'V_‘üå¹è ==vë)Y·Â›O–·w«õ×+­¿!³äW®ýêü©r¾’ù'£76²‡ooÏÜý†È>½ù˜„ço.]#ECZ•\¿ËDcë¯Èà°[UWW.Eh oÜo>ùBÍ}Þœ¹”…l^›ÿ +{7f6G¯.ýúâ‰Y’·KÛW矄ë—ãÛ˾ÑÓ÷?ç.Œ¯~‰mÝ›v¾•Î·çï½&c/}p(aþÉùhù“+s#’0(¼™{ô:œ}H–gzûÙØb{}­Èçžþ0:¾yÎ.Œ^¿ÓDCƒ53}Fx}õÕõ7×W^ÒsÔøJz“dé£ùû'ÏNþåö³®­¾[ù<¼I ¡¦È%Ÿ?/¹²ðä÷kí?OßÛ¿‚Ö3dŸ²¯n=¹<¾ú™ž¸4¶2y›ª¢››ÿöËä7—®†$®ßEªqâîÅñõhþ«é{¯¢…g¿iNë›㥋Ѳ™ºg¦7éöxþÙ­Ç?„³Ojæ<1õÆÁ샷äά¿˜\!y²4µødaóåØâÖµåí/â¥F@ž×m5d–_LçÏÙ™¹{/ŸýÍÎ÷ÿ|ëññÑ,Y—“Åéåöòã×ÈcNlÎn-<|ƒõõýOƒ‰Ó¸|ÑÎ]½õ”¸æò»××¾¹õô¯ïìâ®tîñåtñW®^Nn‘Qw)¹ýÉ忾pÂɇ¾û¯_½ùOÓk{4NÒ84Wo=>oo–ÈTˆæI”ýÝëøæ|wmeçÙÕ7î^º¾Þœ¸§o>‹æ¶‰wÔ{³w÷Æ\Œ¦¾¤·Kfüáäòþ½Ý¿[mŸKæç7¿nü³š¾oç‡s/Œ¯“R&³m|u/™ŒS¡ÇïÄ·ž¯µÿýÆÞ?Í=üVOl ^_\|6¿ñõäZûË«w>1ËÁģ鵓¥¯þfríÕ§ÁÌùh›"·þ8ÿø·jöѹd᜙M§ï_JoÿæòµÆåkêú¹ûoo?ýýµå_Æó¿¾<Þ[¡ÿþæòKWW¯.ïÜ~ö»goþ·{GÿtcãÕù«4SÉÌ£/ô|ãÒä9«¯÷f6_ýÇÿ¶±÷ï/^_KnµôÕw O~;qçe0±þ™ûÌÎ_»õlvýå•kžjâ^<ûäö£· ¿¿2ùq˜,æê©+ëÍä2Ø™‡É̸Búæ•ëkh|æôçú&yñ×ÈXZÚ +§7’…§Sß,=ÿã­Çß^JW>¹<ùYsò¢½õ¥šºÏ6ã¹O/Ž}ri\¯O¯îMÞùš¼¿Ï®ŒmÜÚxIÆü§—'®Ý~ñèõšyp2¾ôu:·…9Yy~÷«ƒ+WoþŹÐÌ=¿vç›ù'ÜØýÇñÕ¯ ë¿ú2¹uwïÅwÿœÎ?ø\ßü7_¤Ÿ…ó7îµ|çz##<{÷kÒédóëæT0õ$ßÞØùû§¯ÿ%ßøËOìy=Gä/<#²ÿÕc_D‹—¯¯' 4{'É͇çãÅå­ß}ý‡ÿvï嘹ÿæs³òÿ‘ϳÓÀOõ©´OÈ }jDíS#2hŸ‘AûÔˆ Ú§FdÐ>5"ƒö©´OÈ }jDíS#2hŸ‘AûÔˆ Ú§FdÐ>5"ƒö©´OÈ }jDíS#2hŸ‘AûÔˆ Ú§FdÐ>5"ƒö©´OÈ }jDíS#2hŸ‘AûÔˆ Ú§FdÐ>5"ƒö©´OÈ }jDíS#2hŸ‘AûÔˆ Ú§FdÐ>5"ƒö©´OÈ }jDíS#2hŸ‘AûÔˆ Ú§FdÐ>5"ƒö©´OÈ }jDíóìÿ=#ŸåÆùüwçÎÝ<ÜžÙ:Ù¹??rnò–}J¯m½>i,œ{zeòødf¯u²wt¸uü}ã*‚¦6+kí­ýÆy¹²A5VŽ÷^ìp½µµß¾Ð¸L—ŽÑÿF‚†jüŸûߌÆI7CmT’húG7b‚4­ B6Ða㙤&:Ò‰1AU/ÚÇE1ÁLš&Il¢ÈÐE–ïJS§AËE•×õtQåu»#÷FGó÷ïlä¾Ñ¼%˜·©ã7¯wW·NhJ³É|º|t¸z¼wx²wøbtTÀSmšªü#˯ð‹ +ä§õ͹ٽ}¬Á•ì+Íý•ûK‹ËGÛm|-,Ê;kœÿî`ÿ~¥aï=sÒ~µ¡u=Þ*]ÑÚÝÛß>nâwݸrëð¤óþïäûW¼®çƒsW6÷Z\§§¾(^øvkÿ\ùÝ_x¸uÀ×a<ªAÅãûžñøþðPAï˜ì¶÷^ìžôŒŽ¿| qúvoûd·g”ÜÕ£É[O'÷_ín=U½âµ·MW¾\óÑQ9zþu»u2uôæp›Æ6uô6ï`´Ã¢Œ.=yÝózî¹ÜF#&›íubžo½nÏ·¿yÓ>lõ.lJw}t:8Ú{]û€µXû€µXû€?±Œê³âöƒÉ€ûæ ú}à44~àTûm{}wkûèÛŸ#!8<.R϶èë“í™öÛ½- ¨ß!ÓG_èçûoÞ#ê‡ÏyãgÍB˜ÛzóúõÞÖáÔ{—m ì£×í“÷}øH®g±Ý»±}†FïˆônflŸ†Ñ`î_aþ>¾ïÙ|xýªÝz³¿u<}tøúdë°wƯÞx +É€~±¼ùÝ«£Ãö`Ù¹ñ£c‰!¬¼yχO~ïÃs@ýkëhÿèøê·»ïuÂófß÷û½ÇçÜÕÞ ½^¿9ÞÙjµ]‘t¯Xnú¥ ûA‘³£6z–BðPA¸ vÈcT÷ƒË=ãòÃ)š"«G{‡'‹ý„g~žXe{ÝéÄE'Á‡Ï::£*õƒ¼ð:©rI•>)pXÜ¥H§ ŠLØß;YÝÚ{Ÿk0|B¡g-øò=ˆ2¸t€yó›GD ﺈÞ:Þ;Ù=hŸôž&QÝs(åeïëôò4–©wDÂÞ OÍΩ+Þ«B‡Çî?O1,ë¹Ô>~ÑÆLž}“è /ÉÏ7Žºðè' +Ä;#a¸>*[;w&ëŽÔ¬;š>:ÚŸ:n·è9SoAÁè†v Šjö¼ßûxk{ïMïSâ/ÿø>h_¤Û£‘rÜ3"ÀÚÞÛßê=µ;L‘3\õ¶ttüj÷hÿèEÏ&Æà¸-gPºõ¾IfÀ¥Û™Û6wv¥[-ÓH¦=ïo?À K€ž10zv*xÏËkùîóž-˜Ag÷ wc¬îvð.O·ÛAïÄ8,»çÊܺ×A ;ÿ¦5†E3 s׆µž3-Ó»[‡‡íýõö~»ÕÛS½ñãÇÅ{NÂ|(’Õ?>_½§ÒcxìŒÞ1%Õ‡ 8ðb=/ÎëþöÀœÖæ—3§Žfö^¿ÚßjµÚ‡'K[¯†O'=ï¯}Þ K²ž1Iv°Eê9; öhÐðÿiT¾ªÂ×^±æo½{þòÖ³Ã"ú¦±ÿt©H±×³+;èb¯÷ëÃØó¥çe™Þ‡¾=»»÷÷Û[=W,“±ÚZ:ê½ê4wÃàrãÎñÑAïS|ñÇ×ÖïÑ«¹4NÚê=ô,WŸBÈù°çèÞV«õæàÍûsÔ9´ò·|tÜŽÛì‡ôŒÞööÞÉÞÛ>Ënøø õýo·¾ï™I²Ÿl÷¥ äúÁ¦Ÿõn×"½[9ô¯_æÁ÷J…Å»N!OÐOµïÎÞþ~?E±û§A„=3Övï}ÜäÚSòL¶÷úÛ?Ó•án×:3e3½c2,ÄhR—Í hHdXËfZg¨l¦>'²ˆåðÕÍôNÃ"²{o¸XΔ°;¥DEÐ覺p¦.œ9}$[g¦p¦wL†EKõa|áLÏ>ÒpÎœ=u4ô…3­3S8Ó;&Ã"É~…3ê—R8Ó‡Å0$¢o¨ gZuáÌ0Îô¾LÃ"ÓûзC"~âÑð”ÿô!C†d)‡¸Ya•õbÔ½#~þµøùÆqºc83-#'o=áî-Oû æõdë=þ7$Í’ÎnKž3ÝøúCÚóÔò­'ùý’å[ÏÈ×ò­–oµ|*ùvó˜µùv¦Ä[kZK·ZºÕÒ¥[m¼ÕÒ­–nµt;kÒ-Ÿ6zÚ_Êr=#ÿ“dp‡*KX3QLÿ’™¨gäk&ª™¨ÈD«{ßµ÷W÷·¾ÚßvÑA¬:Í>ö–ï a{.”¡®õQ)˜»c˜äàëWèJÓë´ SOšºKÝÆ%C®nãòSãÕ£„öÖ'ª¡ÆtÐP–þ?hÐÿÆè;ý;F?4ÎZÑùÞáv{gïð½§IçéõU{ëd¦)¹;NA̽Oj WÕ»–;³lÅ”zÞÏqä¾KàãºÇ¼PòOà .9ä=¥Ž^½&•ºòæ=d4¬D×wgÐwQ¿1†3ãÖ—zÑ0í™k¸å™kÖÖsœíå{’Y9dpé#òž5Ì#¢†Å>tA½u¼w²{Ð>é]ù “ÀîY*¼ì}^žÆ2õŽÈ{ª󈄧€È‡Ør¿DU:<éÒÂò¤õ.Ä3žî¯é Æ™êüó¡÷ È?ŸÝ3Qêüs®óÏuþù'ÐÈ@ë`¬/ Rçœëœss®sÎuιQçœ(¦<¡“áÎ9oïíì¼éýd‚A }¢3,ìÓgÖo½¯–Ý…{>¾ÕÚ³(s¼CŽW¸ohQÞ·¼Tt<8}tHßaïÜU¹ï££ø}{ÿèÛ^ñÜß{±{B¿¶Ð®¸g4Ë·Õ!¸:W‡à꜌õŒ†àú‘•Ã‡-2öâ¸Ý>#  =¶w¸½÷âhìíÞÑ~ûd츽=vt¼uø¾Dg ëNÃu€î'4êêÓƸRIÏû­öÞœ¼ç„˼Hô×t‹zÆ©½Oô§ËÝqjÑŸ™=vV¡ßN¹vfFü§E§j‡z¦•×¯Ú-²>ûö1«7ž‚Èí˛߽"kþ°ìÜøѱôC8ƒ[YúXÀ:duª!+²´ë`NÌ©ƒ9u0§æÔÁœ i t#ÁÙá˜NÌ©ƒ9u0§æü˜Œ<+UudªŽLýk†²î‚Ú:ÃáŒ3¹Ýûlöåø*–*Ê!nϱ¿w²ºµ÷¾ðìð †3Ó™£÷¦Þ™£ßbÝÓg»+Gï 4à]9zGdÀ»rœé£d΀ +­»[ ª=3Ý­>Ȇ®õhÝݪînõá.Ï/Q…S!@ŸÚwX–³îju&»Z­ïnm}[©´ñ¯ii5<â©çÖeõfÿÁpzêÍþ½Ú[Þìì¼nŸ`ìÇíí¾ÖgXH¯çO·ß#kóõß 4"=Ì—´€)°Â|ô‹ò>\t Ë¢~€³0(‹s¦ÃÚµwöœ¸QeÏõJ§½+êÓÐÓý`Ò»¦> E­Â gLvÛýT•e—|œLï8}»·ÝGÝ¢»ú£cÔ Ô½á¨ —Z‡?ŽÓL>ûá䬄?zG¤|t)P‡?Πh¯Ãgf]êðÇ€‡?àÄlõQ­U»pCíµúóÕx'hÐì¹ùÍó­×íÙãö7oÚ‡­Þ´Ò]Áãõ“½“Ö{Ay§WßÝÛïcKណaïÄ8,^Oï}Ã߬´N¶Þö±Xù[>:f;Ç[ôîý壽ÞwýÈÍ=bçßô±ið4K E+œáþK½k‰ã£ƒÞ ¾øtBÝ~©n¿TÕv§Ô~)hö|üÑÉQïšàèPéÃF<¤êvJCÕN©î¦ôóD’î¾9~þfŸ8~hCu³”!Ø5ØGÐeHBÁ°;­Ãþ˜!uîlÔ õŽÇ€W g°­œ†¦­£ÁŸ¾g£rÂ8:)Œ Ô‘ÿ£áŽüŸÛžµØÏ…BÃú?éÑKúWþOÉ”­}ÀÚ0‰W{}£ök/ðÔ=¦Ú  /°g× ö‡Ü ì¹/AíÖNàÀ5Ë6'ð£ÕÕn`íÖn`íö=Ž3㎪³âöƒÉ€»‚ö º‚}à44®à½££íÇ[½kÚj?°¯];¥©gç¡î¯1ÞÞ™Þî{:lœÉpöû…ÔíR ‘º_È€õ ùØÄýo>è¬/d†E~íì“ã!ÇÐ_}¾¿Õz9ÖÐÑ«­ÖÞÉ÷WûHX¼>ù~¿÷À©»úÔxjhK½æÞ…Óg‰±Î¾•ð¯i~T¼OeïK_ 6$fÄŸoØïÁ­.òúDgXä\Ÿ§O®·¶ú0 +÷|ü½¬=[AoŽw¶Zíþp+Þt¶|¦A¥AǃÓG‡¯O¶Þw_Þ«-ß÷ÑQüv·MðûHÓÐï£=¨´–åÛ†)¸Îc?3ÃTسìÙúaïàM ¯ìúŽTÔsÇ©ö>ýÑWÆ wÇ©™Z3{,ûI©þLÝfD^-:†>Û¯g‰îO&î[¤Wo<…ç~±¼ùÝ«£Ãö`Ù¹ñ£cùgG‹í[ˆCb ÖÖSÖSm<ÕÆSm<í´×Â^ëé «Üº€|hâé@…uTý#¨ú“Õ­½÷¹Ã'zÖ/ß“ÜÎ!ƒK7˜ùò=WæQ§€H¿ù›Ó[Ç{'»í>Ž &qÝ;õ¾N/Oc™zGä=}¸òˆ„§fëœÑšÝZ…Ö*ôôpúA&t­FOSön¾ ¸í‘W£ýŠë_¢žPu}¨ä²ŒÎð’ü|ã>²¨Ûà–°¾H½6>¯§>ï_Ýir@áh†¹·ÓÝúúý.Ã'!¶èQ=÷´RÀý§Û· Ò+Êü­w¡è/%6,rƒ7.õ@§ƒ(8Ît3‘³¼Çñ +âán)²ræ·×Žž™.£=ûƃކã,况‚ÄX—»g°ƒñ‡K¹ÁO’Í’À¾]ÄaC\Í z?w~íï¼ìyè°HÀ‘îÃÂRÃmceîï´g÷ŽÏ\„qßì/öW¸çô½9l­ ŸP9sÄÖŒAã—Ans5¹>¹©_Šp›:åBö‡ÐpàîñÖáëÞO»ê +à>‹6Üî-¨Ã&§6ùgbXܼ!Žœp5ÞäþþÏ.†Çú0¡9,´:¤e ?Ç>ä«s“·Tðôæávv”@§ËG‡«ôn 2*à©ö‹½Ãü#˯øF~ZÿþàùÑþÈù¹öñsÍF‚Æ$ýïþ·øÒy3Ò©i¹ÿ=ý±@_¾&з ÓXjJ(ýíÓ05€8ÔxE’Ɔž3M÷`b0 "l‚,Ä0þt—"êÆc’ ±)ŸPS¤©ÒT㦰󘄧•†&†Ö9nÚÈÐ+ G6ÂS Œq…%ÌlÊ7•PXtù1™ „†wÄŠfû`„$¥)ˆ¦¾h¬4˜€èÐ#JKé—@ø%U3@AĤošdâ…@Ì šV1k™m¾-$Î!Š56ä—­D .×ÍăY":7Z¥rMH3IoJcº–IJ•ñƒ“& …ÖØα™8è!`Ib¥Â&›^jŠH ˆ·‰9‚B/ 9ÃÃUÊlIËB‹á$X5†S'V$†¶´®tshbX=UƒMbäèÊÄX‘)q@ô³ $‰^,ƒ˜W " E€€ · +RŽ\ „ˆ„ÞF|r¡¥%úÐÄ×´1Ó—JZw&6Á5L.©QNcÒÍ‘(5tè®cÙŒ£?5KVEÓFsKüD—B쮉 ~¼–i¡57Œ@¬9Óä‚0—¹«è±Ú@óØažâ)MÿÊüj‘¤ +eÁ‰ÀtB´O3L/U¿´<4šKȃ*ˆYÍ’Ô8R#¼"IG—%1‰†‹7º ÷àX’ØCÇ¡1Œ¢J È0ËÑ«(`&¢Ç0©E4@Ñ^Ê‘+i ‘Ì£‘³*¡ endstream endobj 5 0 obj <> endobj 35 0 obj <> endobj 44 0 obj [/View/Design] endobj 45 0 obj <>>> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 61 0 obj [60 0 R] endobj 84 0 obj <> endobj xref 0 85 0000000004 65535 f +0000000016 00000 n +0000000173 00000 n +0000042259 00000 n +0000000006 00000 f +0000653862 00000 n +0000000008 00000 f +0000042310 00000 n +0000000009 00000 f +0000000010 00000 f +0000000011 00000 f +0000000012 00000 f +0000000013 00000 f +0000000014 00000 f +0000000015 00000 f +0000000016 00000 f +0000000017 00000 f +0000000020 00000 f +0000654119 00000 n +0000654150 00000 n +0000000021 00000 f +0000000022 00000 f +0000000023 00000 f +0000000024 00000 f +0000000025 00000 f +0000000026 00000 f +0000000027 00000 f +0000000028 00000 f +0000000029 00000 f +0000000030 00000 f +0000000031 00000 f +0000000032 00000 f +0000000033 00000 f +0000000034 00000 f +0000000000 00000 f +0000653932 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000654003 00000 n +0000654034 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000047596 00000 n +0000654235 00000 n +0000042672 00000 n +0000050591 00000 n +0000047908 00000 n +0000047795 00000 n +0000046600 00000 n +0000047035 00000 n +0000047083 00000 n +0000047679 00000 n +0000047710 00000 n +0000047943 00000 n +0000050665 00000 n +0000051017 00000 n +0000052453 00000 n +0000066435 00000 n +0000129158 00000 n +0000194746 00000 n +0000260334 00000 n +0000325922 00000 n +0000391510 00000 n +0000457098 00000 n +0000522686 00000 n +0000588274 00000 n +0000654260 00000 n +trailer <]>> startxref 654498 %%EOF \ No newline at end of file diff --git a/tests/dummy/public/assets/branding/ai/Ember-CLI-Mirage-Logo-Stacked-Color.ai b/tests/dummy/public/assets/branding/ai/Ember-CLI-Mirage-Logo-Stacked-Color.ai new file mode 100644 index 000000000..ad31f4721 --- /dev/null +++ b/tests/dummy/public/assets/branding/ai/Ember-CLI-Mirage-Logo-Stacked-Color.ai @@ -0,0 +1,2802 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[5 0 R 35 0 R 60 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Ember-CLI-Mirage-Logo-Stacked-Color + + + 2017-04-12T20:08:18-05:00 + 2017-04-12T20:08:18-05:00 + 2017-04-12T20:05:03-05:00 + Adobe Illustrator CC 2017 (Macintosh) + + + + 252 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAD8AwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYqwjzv5y0s6TPYafcia6nPps0RNEQH4qt0NQKbZk4cJuy6rXa yHAYxNkq/k/znpEmk2tneXIhvYQISJSQGoaKQx26UwZsJuxyZ6PWwMBGRqQZhmO7J2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KqF3fWVmge6njgU7KZGC1PtXrkJ5YwFyIDPH ilM1EEoX/Emgf9XCD/gxlP5zF/OHzbvyeb+afk7/ABJoH/Vwg/4MY/nMX84fNfyeb+afk7/Emgf9 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 tP8A/9k= + + + + uuid:e4d4e5bb-1cf7-e542-bf3f-b9911c13fa0b + xmp.did:3b81609e-aefd-4ee8-a794-d6d24a4d8ac6 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + xmp.iid:d6f6ba12-a5c3-42d0-9afe-14c7af2144f1 + xmp.did:d6f6ba12-a5c3-42d0-9afe-14c7af2144f1 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:48fef565-7731-4c49-bee9-dfbb0bfe5fa3 + 2017-02-28T19:39:58-06:00 + Adobe Illustrator CC 2015 (Macintosh) + / + + + saved + xmp.iid:3b81609e-aefd-4ee8-a794-d6d24a4d8ac6 + 2017-04-12T20:05:02-05:00 + Adobe Illustrator CC 2017 (Macintosh) + / + + + + Document + Print + False + False + 1 + + 300.000000 + 300.000000 + Points + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + + + + Mirage RGB + 1 + + + + R=39 G=50 B=73 + RGB + PROCESS + 39 + 50 + 73 + + + R=110 G=116 B=125 + RGB + PROCESS + 110 + 116 + 125 + + + R=54 G=181 B=192 + RGB + PROCESS + 54 + 181 + 192 + + + R=112 G=201 B=203 + RGB + PROCESS + 112 + 201 + 203 + + + R=255 G=147 B=67 + RGB + PROCESS + 255 + 147 + 67 + + + R=254 G=201 B=78 + RGB + PROCESS + 254 + 201 + 78 + + + R=214 G=237 B=162 + RGB + PROCESS + 214 + 237 + 162 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 64 + 64 + 65 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 112 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 129 + 132 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 146 + 148 + 151 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 166 + 168 + 171 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 187 + 189 + 191 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 208 + 210 + 211 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 241 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 236 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 241 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 221 + 21 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 34 + 64 + 153 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 151 + + + + + + + Adobe PDF library 15.00 + 21.0.2 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 66 0 R/TrimBox[0.0 0.0 300.0 300.0]/Type/Page>> endobj 62 0 obj <>stream +H‰tWIŽd» Ü¿S¼ ¤¾æaë6à•a^øÛ½¨úÀwßpI ™YF£+“‘¢DqR¿ýíÇýÛ_øûOþq_\þN^ÿ?øç¿ÿºþyÿ~ýöãþþøu{JâßQñ7özß¿>ðó_ðó~]ÜáöøîØ›‹9§;f×}Î÷Ç×Å_ø÷Ñ]náþ¼)¹Qò;½kЀC«˜¢‹>QÄæq¤w zWK” ïáMÑ……7ÀãûÏë‘,»Cu>Øn2vI•‹su!ÝâÒønà2éÂ((™øq=Zs¥Æõ{ï®àªÁõqHØÐG®6 y—x„)çàR+²¹§cTÄò‚ ”õ3ìíNÍõƒrq!;UW{æâ<\Ž‘]¼Vàž~Çázäm± ^Npú£Wa’‰¼I x4Ê87°lŠû"T—xëæq(–yZ {#ð*ñÍ:e1Á‚p%\° ’(zß²#¡ +¾:8¡Á¹_KÆU«\RåØœGx!xç³Ü²ªÜcKÆ 7*!íð‡¼v0ÙN CÔ±jTÇ|ë®U±JåðjÕ«\ĶϽåph¤'æo;õ@P^Êi… Ì|™·ßù<Žlkš=ÕŸ.ÅÅuHÜB†Ž:¿¢PÊ¡ éûÍSÂc„–zÎìèižj³¬›ˆÌÌ0e®oHð'ò¹;Q3eãÀαjLIu‘!HEÎCF¶±Š4 4FG”^ía¯¨¨.ä q@@‚—H±Úz3LÃÒ#^•Ó7È&>ú ¥“ +Š%•1˜Ž~ÜB¡iˇ— î”0 !#jа¤q“iÔô‚«áòqº¼ðÓI s—U”ݛ˽ïß‘$åIܱÀòè¡ßׇ«<FðºÎ#’Ÿ@Kæ•/"°'Ä`1YGÝ#ºfôqÈ$a„åÐÒž*06u|BÀ‡#¾Ž5 H•‰%#‚šÚ¹ 2sž2»Ç<èçõïëï[ZÉ52]C䤣îN:˜*Ö‚êûÞv+Mèjߊc¢% +ëwùûq©PA•œ# ØÅrËýúquøf˜Ô…~îÔ#/=W—]ÁÇÇ…ŒJ.Ž®Æ—ਈ/h±ß¶&©ÒöIzR‘½åk?Îf m„Â4^¿~\z+•Ê^_ŽmÊÞ]Æî.óÅ¢MU+å«Z._õ6¶ÒË?6ç ¹]Q+à­¯é ÖzSÕ£’®™Äìb}É6ô²W€.€i8ñ”c ˆËó’(á!Üæ+y6¹h#@dJuF¡椈¾6…­'àá fAl2SA;à" ¿ÛÑEüÙµ*I£¾ ”E @Ìpn{qý ˆ²‘ùA쟘F"¿Õª®ÁáE|´€¾÷™šoê÷ÞW°]ì$ìp™. ’1jõPWÒ‰SNàp—Aèƒh8÷Þ~ iÜû$ìðò²¤Ø + ç2 hËYäBB°ÅœÕ˜ßŒ˜Œ=¼·Ä)GÏt8º˜³2óP”É€Tò·¥0óL¥ ¿aÀÊ^\²h +¿¤lž);†æý\22^tb—m)‡¬ùZ³øˆ¯tK–Jy 0D-"W⃌¨2Û¼VR‚‘‚Ï84 ßDÎüˆS ö»Z…áY¦ ,È>4»l’j­©,™ZI{Ê[ËÎgÆOÙ +I2lÌ fVÍŽ\ôÉ…ü”ŠNËåHEú÷Lñ)ï*˜È,”¹Å*%;eà´d×¹+:‹íÿxÊ󲕑ªf:Ì$‰¾<³×k}M± b³ÌÀ˜…ÜÔæ`Šš»›ˆã’rÜü»’@!– “`mº|TF›ÞÁ—&RRÂÙâà‚Q6±jLü¸@ ’n ok¢¿)aIxã¶LSþE-ƒ†-+T.|UuiŽl’\Í× ˆI7µÆ÷i§!r<ÇÉ5['“ñ(rªT·yN™“n–Í;>#ûE Ö…]‰ì‹A÷×ïIÂ1Ó˜ÛK\¦ÀÇGA×éÛÃ-&‰PóuHR!|ìùØk°|HüRbBèA:ø¸Ekc@ /)²Da˦)ÌV±-`T—w»Ga\»Œé¬n* 2Þ¶yíˆwÒṉ̃¼É² àCs ÷,qåâðî)¦\µY¯DW–£šX‰|ÒOžÉhZ„þÒO,1Oý iÅK[ëfí^mùÏ |:h^É Ï‘;Á‰Ýšo³õ3¢^qŸ¯‹oZ&ÙF*)9läs#¶éçEš–>öŽô*AüÜ;/äçÅ’Xîï‘/_Ûe0~mr\Âú¬¤ÑàCŽU‚:'û€Ìnò6„jhrè Ø»c@)ãÌ‚Ÿ²äS-`Ÿ.I̘–Œa3y ƒ"dm&4Búd³Aü×&#MÒ¢aÈ2­¤{¯Kô!€kñéÊ‹w4¸Âw']Á‚%ÂAs¹ +刿œi²m¬a#°36Yn@º.¹‘ö‡ºB‘ÊÍ»d0‹g…ã%`|”Õ.ÎB—÷|A-ƒ*GbËÄ@™NÀeyËÀ¶±‘Ï`–ïIìòŒÌm ˜‡ò¹€//F ñzfÑWA_J* d½xŠ¤Xc'‹,„.V‘RêbGÜy‡8ú™I«u-@ +Ȭ}Ψ¤r,ñôŒ!‡gVq”×ôþZû`´â‰4$îQÔÔÁá2 í.¼ååÁ‰ðÉ…”à›BÞ D FŠ<³“©À·_Sã;²LÓv^â»’·eâÀ,!­ñHâ×èó„ÐΰÁç©ø±ÌàZ*FWüøÚnÊàŠR¾‡¶¡˜¾Gµm¶#ËG CgÏfnnì[(›íÒ261£o@Ÿ¬šíŠ|n§u¹ÜÒÚHÖ®iÈa ¨ÚÇûͺó  tõ%ûÖx@Üx‚Aì^9M)Û €‡ô™¹¡¤?vIYÎ30ÑÔǂʇ1 +ˆC1 Ét«¯ê Ô&9´Ã%®ÉGü8}£¹ô§þµ¡ +0Éçg¨² +ŽR“Á€£@¶fy/ ò9!O– m9\–.ô "9ã°™®+ŸÉÝÑÉrŠZ}•Óɼ%Ò&p¯WOpRGÏI‡¹_|“E´º¨eÊÇ™¼`+*õ©Á?ð“K5¾`¨—ØŸœðÀI-½aJ6ðWQú¨÷!ö#*¥æ­˜‡‹¥ëmÝ1$Ï#ð­Ôç +§VñØ2øç%@Û5H Áq²:KucÇ%*Bþ?Øé¤xíÿ£»Zr­†aèü®¢5Ÿ¦é1dÀ*!\$Äþ%Î9vâT€Þà>»¶ãÿç?¸è5C“¿1ѵ6U ¡fœ|óýõíõõ•¶];ò±•mû}ÿ|ýÚ€ÄfpëœMhë¼4xSÝï?Á#`«dc &­Î yÚ8ŽND›mLSº°;È„{¶´µ¢y®²Ýqut LQ:uÕ ÿkfáÖ„—1GšÞÚѼ°4%'·¢zfÍ^:y|œ‰WŒî+ô– >Á¡O{Ed$VÙ=5]k;ê†* o¦‹ÛKÕ9‚dÃíP…Ⱥs‘Siã•vta˜‹­$‰·Uá:_U¸%:¸qî&ýÀŒ$xÍ.NöÊã sâÃÉIŒPXÌ(Ù]«ýÑmª³14¥q!êÜ2b‘Ð(†‚€d¸©ÈŽ`¹°„~,F.¤ \ž,h{M’ÓœƒÕT&JiÄrpa¸ÃµuJ ØÞ•C¡‹Ÿ{5)ŽA̬èOn~vUTûjðm¯òú +ŠüàÏ«|Ñç‡?VYTö6·dX›‡¦Kò°ŸKÛ4L>ó©Kð´Þ1™ÛZ÷.äˆÌ%ÎÌ +7l÷Èßë4~t´Ù„ž_“å?:Ê–Nßêñ7­„fhC‰–V$;+¯ëºH::‘m…ƒ-ó)Rå´TÉ</%O®}| ÷ “n^}O…JùîMÜÛò®²̤­Ô²1ós†ÖEßági…t»P,hr +2¤0Om·0€× Ò¨—fµ‡BÁæ¤gg6Ž²Ëà]+¡ƒÒÑ›b®:±, õ`ÖìY;Ê ¯¨¢k +­y„4Ü+[f2ŒVÃD›’ù?‰®â "kwÞûî +Ú6sŒÕÍ:åµJ6ÏÛf"à „úðù‘ÎLŶƒ‚Ò–Þ¹ë”sø¶YÙ @¢¢)”|Ñ¢f…còWæ÷/8, M‡IaN«$GÜÓµX4®OJv³¡0ÔÕòjXϼP€“túÄÁù¢#B#㟠+û ‹I®CP˜ŠSÂƈ†àßE˜û}‹8qC^Âdà¥ùÝ‚0Ùlò—0q«¶]ÀÉí«Ä /aš¦áð°`‰ÓbÓÀ ­ÜKCiwcå~ß= á‡ãIÇ„N&`ªì/,F¹ +Aa*N O#Ç]]¡|†›a¹rø’M Û46gÄâÍ 1ÿ…ƒý™H‘ë@ʤȈ ³PG®¿áð’Aáš OKî×ôs¼#S†{8´pxQÓ0‹!&",õWVoxó{HqĪ¬c†*.cªú4f¼Ò7̬ +×Ûö¿Ä­È0Úî3{®#´2Š `ª \õ]k˜c ŒN?І€2>W¢Í'+ÏÊ,°ËL ƒñ¢#†Jƒ}¨ü02è±Ã5ìï@`Öµ+ôCC€ƒwxÉ1á¥Éá>˜\B„cxM'õ4øý4é]‡4_J·Áå=L¼um|þòiÃÏ;íW endstream endobj 66 0 obj <>stream +8;XF36#qJu$q7'E�s!0X0P?XuMBN_7ra/*s>PHgJ5Wh!lWD(LqoW7k4"t,;k>QG +Y3o2@50Z[qD$!+Ekj4DA:8A\+.@OJ<$rOEAem/maS.sYT.Zl1A0]c2rK-K"ej#ei9 +-I\At.@!j^MnckS4)S\ endstream endobj 67 0 obj [/Indexed/DeviceRGB 255 68 0 R] endobj 68 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 60 0 obj <> endobj 69 0 obj [/View/Design] endobj 70 0 obj <>>> endobj 65 0 obj <> endobj 64 0 obj [/ICCBased 71 0 R] endobj 71 0 obj <>stream +H‰œ–yTSwÇoÉž•°Ãc [€°5la‘QIBHØADED„ª•2ÖmtFOE.®c­Ö}êÒõ0êè8´׎8GNg¦Óïï÷9÷wïïÝß½÷ó '¥ªµÕ0 Ö ÏJŒÅb¤  + 2y­.-;!à’ÆK°ZÜ ü‹ž^i½"LÊÀ0ðÿ‰-×é @8(”µrœ;q®ª7èLöœy¥•&†Qëñq¶4±jž½ç|æ9ÚÄ +V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚óÈtÕ;\ú” Ó¥$ÕºF½ZUnÀÜå˜(4TŒ%)ë«”ƒ0C&¯”阤Z£“i˜¿óœ8¦Úbx‘ƒE¡ÁÁBÑ;…ú¯›¿P¦ÞÎӓ̹žAü om?çW= +€x¯Íú·¶Ò-Œ¯Àòæ[›Ëû0ñ¾¾øÎ}ø¦y)7ta¾¾õõõ>j¥ÜÇTÐ7úŸ¿@ï¼ÏÇtÜ›ò`qÊ2™±Ê€™ê&¯®ª6ê±ZL®Ä„?â_øóyxg)Ë”z¥ÈçL­UáíÖ*ÔuµSkÿSeØO4?׸¸c¯¯Ø°.òò· åÒR´ ßÞô-•’2ð5ßáÞüÜÏ ú÷Sá>Ó£V­š‹“då`r£¾n~ÏôY &à+`œ;ÂA4ˆÉ 䀰ÈA9Ð=¨- t°lÃ`;»Á~pŒƒÁ ðGp| ®[`Lƒ‡`<¯ "A ˆ YA+äùCb(Š‡R¡,¨*T2B-Ð +¨ꇆ¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r 9‹\A&‘GÈ ”ˆrQ ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½Ä­ÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@ æP+¨íÔ!ê~êêmêæD ¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒÓ¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…åÆ’°d¬VÖë(ëk–Íe‹Øél »—½‡}Ž}ŸCâ¸qâ9 +N'çÎ)Î].ÂuæJ¸rî +î÷ wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö +n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=GTB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßY Õ.©=bàá?SŒîÆ•Æ©ºÈº‘ºçõyõ‡Ø Ú† žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹­³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝ­èþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_p߶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMśΠnßLÝlÜ<9”úO¤[þ˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ +¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäüå„æ æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ ÷„óû endstream endobj 63 0 obj <> endobj 72 0 obj <> endobj 73 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 17.0 %%AI8_CreatorVersion: 21.0.2 %%For: (Lindsey Wilson) () %%Title: (Ember-CLI-Mirage-Logo-Stacked-Color.ai) %%CreationDate: 4/12/17 8:08 PM %%Canvassize: 16383 %%BoundingBox: -130 -1073 143 -796 %%HiResBoundingBox: -129.654645872944 -1072.96321614583 142.577776002053 -796.918294270834 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 13.0 %AI12_BuildNumber: 242 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: -144.666666666667 -1088.66666666667 155.333333333333 -788.666666666668 %AI3_TemplateBox: 306.5 -396.5 306.5 -396.5 %AI3_TileBox: -282.666666666667 -1294.66666666667 293.333333333333 -560.666666666668 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 2 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI17_Begin_Content_if_version_gt:17 1 %AI9_OpenToView: -3343 223 0.3333 2549 1289 18 1 0 5 43 0 0 0 0 1 0 1 1 0 1 %AI17_Alternate_Content %AI9_OpenToView: -3343 223 0.3333 2549 1289 18 1 0 5 43 0 0 0 0 1 0 1 1 0 1 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 7 %%PageOrigin:0 -792 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 74 0 obj <>stream +%%BoundingBox: -130 -1073 143 -796 %%HiResBoundingBox: -129.654645872944 -1072.96321614583 142.577776002053 -796.918294270834 %AI7_Thumbnail: 128 128 8 %%BeginData: 13896 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD50FFAF84FD7EFF5A60AFFD7CFFA86035AFFD7AFF845960356035 %6060FD78FF84605A605A605A84FD7AFFAF355A84FD7DFF845AFD5CFFCFC9 %A0C9A1C9A0C9A1C9A0C9A1C9A0C9A1C9A0C9A1C9A0C9A1C9A0C9A1C9A8FF %FFFF8484FD5CFFC9C1C2C1C1C1C2C1C1C1C2C1C1C1C2C1C1C1C2C1C1C1C2 %C1C1C1C2C1C1C1C2CFFD4CFF848484AFA8FD0EFFCA99C2A7CAC9CAA7CAC9 %CAA7CAC9CAA7CAC9CAA7CAC9CAA7CAC9CAA7CAC9C299C9FD4AFFA95A6035 %60356060FD0DFFC9C2C9FD1BFFCAC1C2FD48FFAF84355A5AA98484593635 %AFFD0BFFCA99C9FD1BFFCA99C9FD48FF853560A9FD05FF84605AFD0BFFC9 %C2C9FD1BFFCAC1C3FD47FFAF3560A8FD07FF843660FD0AFFCA99C9FD1BFF %CF99C9FD47FF846084FD09FF5A6084FD09FFC9C1C9FFFFFFC2C2C9FFFFFF %CAC2C2FD0FFFCAC1C9FD46FF846035AFFD09FF8435363584A9FD06FFCA99 %C9FFFFA1C199C1CAFFCAC299C1A0FD0EFFCA99C9FD45FF60603560FD0AFF %AFAF84843584FD06FFC9C1C9FFFFC9C1C2C1CFFFFFC2C2C1C9FD0EFFCAC2 %C9FD44FF603659AFA8FD0DFFA86035AFFD05FFCA99C9FFFFCFC99FC9FFFF %FFCAA0C2CAFD0EFFCA99C9FD43FFA86060FD11FF846084FD05FFC9C2C9FD %1BFFCAC1C2FD43FFAF3584FD11FFA83584FD05FFCA99C9FD1BFFCA99C9FD %43FFAF6060FD11FF6060A8FD05FFC9C2C9FD1BFFCAC1C3FD44FF5A5A5AA8 %A8FD05FFA8A984AF84AF84AF5A365AFD06FFCA99C9FFFFCACFCACFCACFCA %CFCACFCACFCACFCACFCACFCACFCAFD04FFCF99C9FD45FF60603560FD05FF %84356035603560356060FD07FFC9C1C9FFFFC999C2C1C29FC2C1C29FC2C1 %C29FC2C1C29FC2C1C1C9FFFFFFCAC1C9FD0DFFA8FD38FF848484FD05FFFD %0984FD08FFCA99C9FFFFC9C2A0C9A0C9A0C9A0C9A0C9A0C9A0C9A0C9A0C9 %A0CAFFFFFFCA99C9FD09FFAF5A60355A3584A8FD4EFFC9C1C9FD1BFFCAC2 %C9FD08FFAF5A605A846060356084FD4DFFCA99C9FD1BFFCA99C9FD07FFAF %355A84FFFFFFA885355A84FD4CFFC9C2C9FD1BFFCAC1C2FD07FF5A6084FD %06FFAF3560848460AFFD48FFCA99C9FD04FFCAFD05FFA8FD10FFCA99C9FD %06FFA85A59FD08FF603536355A3560A8FD46FFC9C2C9FFFFFFC2C2C2FFFF %FFC9C2C1CAFD0EFFCAC1C3FD06FFAF358BFD08FFA984A8FFAF843585FD46 %FFCA99C9FFFFA1C19FC1C9FFCFC299C2A0FD0EFFCF99C9FD06FF843684FD %0DFFAF6035FD46FFC9C1C3FFFFCA99C2C1FFFFFFC2C199C9FD0EFFCAC1C9 %FD06FFAF3584FD0EFF8460A8FD46FFA1CFFFFFFFC9A0CFFD04FFA1C9CAFD %0EFFCA99C9FD06FFA86035AFFD0DFF8435AFFD63FFCAC2C9FD07FF843C84 %FD0DFF5A60AFFD42FF35AFFD1FFFCA99C9FD08FF84AFFD04FFA8AF84AF84 %AFA884355A84FD42FF846084FD1FFFCAC1C2FD0EFF843560356035603560 %84FD41FFA95A5A35605984AFFFFFFFA1C29FC29FC29FC29FC29FC29FC29F %C29FC29FC299CAFFFFFFCA99C9FD0EFFA8FD0784A8FD42FF846059605A60 %84FD04FFCAC1FD13C2C9FFFFFFCAC1C3FD5BFF843584FD0AFFCFFFFFFFCF %FFFFFFCFFFFFFFCFFFFFFFCFFD04FFCF99C9FD5BFFAF60A8FD1FFFCAC1C9 %FD1DFFCFFFCFFFCAFD3AFFA8FD20FFCA99C9FD16FFA8CAA7C9A0C29FC299 %C29FC299C2CAFD58FFCAC2C9FD13FFC9C9C2C2C1C1C1FD04C2C9C2C8C2C8 %C2FD40FFCFC9A0C9FFFFFFCAA0C2CAFD0EFFCA99C9FD10FFC9C39FC199C2 %A0C9C9CACAFD49FFC9C1C299CFFFFFC2C2C1C8FD0EFFCAC1C2FD0DFFCFC9 %C2C1C1C2C3CFCFFD4EFFA1C19FC1A8FFCFC299C1A0FD0EFFCA99C9FD0CFF %A0C299C1A0CACFFD52FFC2C2C9FFFFFFCAC8C2FD0FFFCAC1C3FD0AFFC9C1 %C2C2C9CAFD3CFFCACFC9CAA7CAC9C9A7CACACFCAFD24FFCF99C9FD08FFA7 %C299C2A0FD3AFFC9C9C2C2C1C299C1C1C199C1BBC199C2C1C2C2C9C3C9CA %FD1FFFCAC1C9FD06FFCFC2C19FC9CFFD36FFA8CAA0C299C199C19FC2A0C9 %A1C9C9C9A1C9C9C9A0C9A0C299C199C199C2A0C9A8FD1AFFCA99C9FD04FF %CAC999C1A0CAFD36FFCFC2C2C1C1C1C9C9CFCAFD11FFCACAC9C9C2C2BBC2 %C2C9C9FD17FFCAC2C9FFFFFFC9C2BBC2C9FD36FFA1C299C19FC9C9FD1BFF %CAC9A0C299C199C8C9CFFD13FFCA99C9FFCA9FC19FC9CAFD35FFC9C1C19F %C9CAFD21FFCFCFC9C29FC1C1C2C9FD11FFCAC1C2C9C1C2C2FD38FF9FC2A0 %CFFD27FFCFA1C299C199C2C9FD0DFFA7C999C199C9CAFD3AFFCFFD2DFFC9 %C8C1C1C1C9CAFD05FFCACFC9C9C2C2C1C2C2CFFD6CFFCFC3C299C19FC29F %C29FC299C199C2A0CACAFD71FFCAC2C2C1C29FC2C2C9C9CFFD77FFA8C9A0 %C199C2A1FD7CFFCAC9C1C1C1C9CAFD7CFFC9C299C1A0C9CAFD7BFFCFC2C2 %C1C2C2CAFD7BFFA8C9A0C199C2A0CACAFD7AFFCAC9C2C1C1C8C9CFFD7BFF %C9C299C19FC2A1CFFD1CFFCAC9A0FD5CFFC9C8C1C19FC8C9CFCFFD16FFCF %C2C2BBC2CAFD5CFFCFCFA1C299C199C2A0C9C9CFCAFD0DFFCACAA1C299C1 %99C9CAFD62FFC9C9C2C2C1C1C1C8C2C9C9CFCACFCACFCACAC9C9C2C2C1C1 %C1C8C9FD68FFCACAC2C29FC299C199C199C199C199C199C29FC9A7CFFD6F %FFCACFC9C9C3C9C3C9C3C9C9CFCAFDFCFFFDFCFFFDFCFFFDFCFFFDA3FFAF %FFAFFFAFFFAFFFAFFFAFFD05FFAFFD15FFAFFFAFFFAFFFAFFD09FFAFFFAF %FFAFFFAFFFAFFFAFFD05FFAFFFAFFFAFFFAFFD16FFAFA8AFA9FD07FFAFFF %AFFD0BFFAFFFAF596035605960356059603560AFFFFFAF355A84FD0BFFAF %603584FD04FF5960596035605960598484FD05FFA8605960356059603560 %596035FFFFFF8460596035605960598484FD10FFA95A60355A3560596084 %FFFFFF84603560A8FD09FFA8603560605A6035605A6035605A6059FFFFFF %A8605A60AFFD0AFF85356084FD04FF6035605A6035605A60356060FD05FF %5A605A6035605A6035605A60A9FFFFAF35605A6035605A60356060FD0DFF %AF84356059605A6035605A6084FFFFA9356060FD0AFFAF5A605935603560 %5960596059605960A8FFFFAF35603584FD09FFAF35603584FD04FF5A5A35 %605A605960355A355A5AFFFFFFAF603560596059605960596059AFFFFF84 %5A356059605960355A35605AFD0BFFA8603560355A35605960356035AFFF %FF845A3560A8FD09FF84603560605A6084FD0BFFA8605A605AFD09FF6060 %5A6084FD04FF84596084FD05FF60605A60AFFFFFFF5A605AAFFD0BFFAF35 %605AFD04FFAF5A605A6084FD0AFF8435605A6084FD04FFAF8484FFFFFFAF %356060FD0AFFAF5A605A35603584FD0BFFA93560595A5AFD07FF84605960 %3584FD04FF5A603584FD05FFAF356035AFFFFFAF60356084FD0BFF845A35 %60AFFD04FFAF35603584FD09FFA935603584AFFD0BFF845A3560AFFD09FF %A860596060596084FD0BFFA86059605A60A8FD06FF6035605A6060FD04FF %845A6084FD05FFA9605960AFFFFFFF606035AFFD0BFFAF356059FD06FF84 %356060FD09FF5A605A60AFFD0CFFAF5A605AFD0AFFAF35605A35603584AF %FFA8FFA8FFA8FD04FFAF356035603560A8FD04FF84356035603560A8FFFF %FF59603584FD04FFA86035365AFFFFFFA860355A84FFA8FFA8FFA8FFA8FF %FFFF845A3560A8FD05FF845A3560AFFD07FFA85A356084FD0DFF84603560 %A8FD09FFA85A3560605A605A605A605A605A84FD04FF84605A84606035AF %FD04FF5A605A845A6060FD04FF845A605A8460845A605A6084FD05FF6060 %5A605A605A605A605AFD04FFAF36605AFD06FF605A6060FD08FFAF59605A %AFFD0DFFAF5A605AFD0AFFAF59605A5960356035603560355A59FD04FFA9 %355A5AAF356035FFFFFF5A60358484603560FD04FF596059603560355A35 %603584FD04FFA86035603560356035603560A8FFFFFF84605960A8FFFFFF %A884356035A9FD08FF845A3560A8FD0DFF84603560A8FD09FFA860356060 %5A605A605A605A605A60AFFFFFFF84605A84FF855A6084FFA8603560FFAF %356060FD04FF60356060846084606035603684FD04FF5A605A605A605A60 %5A6060FD04FFAF35605A848484606035603660FD09FFAF5A6035AFFD0DFF %A9356060FD0AFFAF5A605935603584FFFFAFFFA8FFAFFD04FF8435605AFF %A860355A8460355A84FF845A3560AFFFFFFF5A5A3584FFFFAFFFAF843560 %3584FFFFAF60356084FFA8FFAFFFA8FD05FF845A3560355A356035603560 %A8FD09FFA860355A84FD0DFF845A3560A8FD09FF84603560605A6084FD0B %FF84605A84FFFF84605A605A605AFFFFAF356060FD04FF84596084FD06FF %855A6060FFFFFF5A6036AFFD0BFFAF35605A6035605A605984FD0CFF6060 %5A84FD0DFFAF356060FD0AFFAF5A605A35603584FD0BFF84356060FFFFFF %5960356035AFFFFF845A3560FD04FF5A603584FD06FF60603560FFFFAF60 %356084FD0BFF845A356084AF8460356035AFFD0BFF8535603584FD0CFF84 %5A3560AFFD09FFA860596060596084FD0BFF84603584FFFFFFAF36603584 %FFFFFFAF5A605AFD04FF845A6084FD05FFA860596084FFFFFF606035AFFD %0BFFAF356059FFFFFFA9605A6035AFFD0BFF605A603584A8FD05FF84AFFF %FFFFAF5A605AFD0AFFAF35605A356035605A6059845A605960A8FFFF8435 %5A5AFD04FF60355AA8FFFFFF84603560A8FFFFFF596035605A8460845960 %356035AFFFFFA860356059845A6059845A6059AFFFFF845A3560A8FFFFFF %8460355A358484FD09FFA8603560356059605960355A35AFFFFF84603560 %59845A6059845A6084FFA85A3560605A605A6035605A6035605AFFFFFF84 %603584FD04FFAFAFAFFD04FFAF5A605AFD04FF845A605A605A6035605A60 %3585FD04FF60605A605A6035605A603560A9FFFFAF36605AFD05FF84605A %603660AFFD09FFAF6035605A6059605A605A6084FFFFAF5A605A605A6035 %605A6035AFFFAF35605A356035603560356035603560A8FFFF84355A5AFD %0BFF84603560A8FFFFFF596035603560356035605AA9FD04FFA860356035 %6035603560356035AFFFFF84603560A8FD05FF8460356035FD0CFF845960 %355A3560356084FFFFFF84603560356035603560355A84FFA85A3560FFAF %AFA8FFAFAFA8FFAFAFA8FFFFFFA8AFA9FD0DFFA8AFAFFD05FFA8FFAFAFA8 %FFA9AFAFFD07FFA8AFAFAFA8FFAFAFA8FFAFAFFD04FFA8FFAFFD07FFAFAF %84AFFD0EFFA8AF84AF84FD07FFA8FFAFAFA8FFAFAFA8FFA9FFFFFFA9AFA8 %FDFCFFFDFCFFFDFCFFFDFCFFFD91FFA8FFA8FD11FFA9FFA8FD07FFA8FFA8 %FD07FFA8FFA8FFA8FFA8FFA8FD13FFA9A87D7E7DA8A8FD13FFA8A87D7E7D %A8A8FD0BFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA87D270528A8FD0FFFA828 %05277EFD05FF2827052752FD05FF52272728052827270528275253A9FD0D %FFA82E28052700270027277DA8FD0EFFA82E28002700050027272E53FD07 %FF28272727052827280528272805282728A80028007DFD0FFF53002827A8 %FD05FF5205280053FD05FF53002827280528272805282727057DFD0BFF7D %05270528272827282728002EA8FD0BFFA852002827282728272827282727 %057DFD05FF520028272805282728052827280528277D27002700A8FD0DFF %A8002700277DFD05FF2727052728FD05FF52270528052700270027002805 %270052FD09FF5200270527002700270028052700277EFD09FF5327002705 %28052700270027002805052EFD05FF282705280527002700270027002700 %277E0028272752FD0DFF2828272805A8FD05FF5227280553FD05FF530528 %272828522E52272827282728007DFD07FF7D002827280528527D52520528 %27282728A9FD07FF532727282728052827522E522728052827FD06FF5205 %28272828522E5228522E5228522E7D05052827277DFD0BFF532727270527 %7DFD05FFFD04272EFD05FF5227052728FD05FF7E520027052805A8FD06FF %272705280052A8FD04FFA827270528007DFD06FF7D2705282727057DA8FD %05FF7D59007DFD06FF2827052728FD0BFF7E00282728272EFD0AFFA82805 %28272800A8FD05FF5205280553FD05FF5305280552FD07FF53052827277D %FD05FF7D2727280053FD07FFA82728272828FD05FFA82E2728272828A8FD %11FF5227280052FD0BFF532705270528007DFD09FF530027052805057DFD %05FF282705272EFD05FF2E27052727FD07FFA82805270052FD05FF520028 %0527A8FD08FF7D002705277DFD04FF7D0028052727FD13FF2827052728FD %0BFF7D05282728272827FD08FFA8052827282728007EFD05FF5205280553 %FD05FF5327280552FD08FF5228272828FD05FF2828272852FD09FFA82827 %28057EFD04FF2828272805A8FD13FF5227280553FD0BFF52272727002827 %2752FD07FFFD0427002827277DFD05FF2827052752FD05FF2EFD0427FD08 %FF5200270052FD04FFA8270528007DFD0AFF2727052752FFFFFFA8270528 %0052FD14FF2827272728FD0BFF7D002827522728272784FD05FF7D272728 %28520528057DFD05FF5227280053FD05FF5300282752FD08FF2728272728 %FD05FF272827277DFD0AFF522728007DFFFFFFA8052827277DFD14FF5205 %28272828522E5228522E52287DFF52270527537D0028002EAFFFFFFFA828 %052700845227052759FD05FF2727052728FD05FF5227052728FD07FF5227 %05280053FD04FFA8280527007DFD0AFF2727052752FFFFFF5327052700A8 %FD14FF282705280527002700270027000527FF530528057DFF5227280084 %FFFFFF5905280553FF530528057DFD05FF5227280553FD05FF5305282752 %FD06FF522727282727A8FD05FF272827277DFD0AFF522728057DFFFFFF7D %05282728A8FD0BFF7D5352537DFD04FF5205282728272827282728272805 %52FF5227052752FF7DFD0427FFFFA800280527A8FF2E27052752FD05FFFD %04272EFD05FF52270528275252532E2800272727052752FD05FFA8280527 %0052FD0A7D2728272752FFFFFF5927272700A8FD0BFF5300270052FD04FF %282705282727002805270028052728FF532728007DFFFF2828272753FF28 %27272753FFFF530528007DFD05FF5205280553FD05FF5305282728052700 %2827282728272728FD06FFAF272827280527002700270027002705282728 %057DFFFFFFA80528272753FD0BFF5227272752FD04FF5227280552FD0AA8 %FF2827052752FFFFA8002705282E27052705FFFFFF2827052752FD05FF28 %2705272EFD05FF2E2705270527052700280527002852FD07FFA827002805 %27052805270528052705280527052752FFFFFFA82700280028A8FD0AFF53 %00280052FD04FF2827052728FD0BFF522728007DFFFFFF59052827282728 %007EFFFFFF5327280559FD05FF5205280553FD05FF532728272827282728 %2728272852FD09FF272827280527052700270527002705282728057DFD04 %FF2E282728007DFD0AFF5328272752FD04FF5227280553FD0BFF27282705 %53FFFFFFA82705270528052EA8FFFFFF282727272EFD05FF2827052752FD %05FF2EFD0427A8A8A87D280527052753FD07FFA82705280552FD0A7D2727 %052752FD04FF7E0028272700A8FD09FF5900280052FD04FF2827272728FD %0BFF520528007DFD04FF53272728272784FD04FF5205280553FD05FF5227 %280053FD05FF5300282752FD04FF7D28272827277DFD07FF272827277DFD %0AFF522728007DFD05FF5200282728057DFD08FF5327272852FD04FF5205 %280552FD0BFF2727052753FD05FF2727050528FD05FF5227052752FD05FF %2727052728FD05FF5227052728FD05FF53270527002759FD05FFA8280527 %007DFD0AFF2727052752FD05FFA82700280527002E7DA8A8FFA8A8522805 %270052FD04FF2827052728A87EA884A87EA884A87EA8282728057DFD05FF %A8272827FD06FF7D05282752FD05FF5227280553FD05FF5305282752FD06 %FF5227272827272853A8FFFFFF272827277DFD0AFF522728057DFD06FFA8 %280528272827272728272805282728272852FD04FF520528272827282728 %272827282728272727052753FD07FFA8FD07FF5227052728FD05FFFD0427 %2EFD05FF5227052728FD07FF272705282727F87EFFFFA8280527007DFD0A %FF2827272752FD07FFA8520027052827270528052705280527007DFD04FF %28270528272705280527052805270528282727007DFD0FFF5300270052FD %05FF2E00280052FD05FF5300270052FD08FF2827052827277DFFFFA90528 %270559FD0AFF2E00280053FD09FF7D28270028272827282727002852A8FD %05FF5200270528272705282727052827270528522E527DFD0FFF53522E52 %52FD05FF5252285253FD05FF53522E5252FD09FF7D2E002800A8FFFFA852 %2852287EFD0AFF525228527DFD0BFF7D53272805270028527DA8FD07FF52 %522E5228522E5228522E5228522E52 %%EndData endstream endobj 75 0 obj <>stream +,!-y+Ðm ’ ´ ™eÚi !qƒ-O¯ ËëJC?"¥¦¼Áhð±ÁôE,öƒ¬Õ¬!˜‹t…é¿w»=e +%®B»û=&Q§1Ô%hIDɉe,Nèvkb0Ê==Œ-s㉋(7Äœ# ¡,‹ª¬neN[#]g¾º:¥5¤ûh/Fàt o£b0Ž„&8dÕ‰7 dNR&wpµLõSGÓßØmXž;Ú& "ŽžÚÜJS~"û†]†P¬kæ'¤áE  +Ð!9¢„&ˆè–Ä«xÀ¤Sñô&+zc¦0ÙVh‰¤˜a&Æk’)‹+º/Ö˜uè–J³T±PîˆÝ3Ð} lŸT"‹(Ò4Ó´à’)±¾YÁïD6á“Ä噸DMÊ»IÜž§åHØqÀiMœòîÓÐ`d«î¸Uð¯ÌPi[¼ŸØ[÷†ME®Cwiп1ë2lÍãM¤Óñ›ó7v¶ñ›ˆYiC+G×Æö>Ÿ¨^3õaÄö…åŒEÒnÛŠÖ1Ãó€YÇ<Gù‰‰+´8S'²{ ›ðø “+Û‡˜ ÔâÄ3zÚ—ô·Nb–›2E4rpS6½,»$áA‹€G˜×‹fÕHvH²¤‹ø+Ê ¼2I¬YëX¡‹;E­ƒ¢€ŽŒ3‘S O*q=)VôÄPƒÝÓšl²í&R†t¯´€‚˜]€EªÇy¦Ë<ìÁùKˆ‡šÙ|Öû#dÝ%L FD¶b®)†ýÌö8'Ï ´Q7h´GéI:‚`ÓߤRZüì Ó5 AÉÐZìlL0¸C7é™* ¥f^æF›FÁ.$‹Ei8‡ÅeF›ŽÕÄ`ÁÚAEt¦EÝÃß,ûJXž„(L1=ØP4DYðk*1ýÌgøÀI|Ç´c1/4&âmì´32SÌ=èo̤”‡À×ü; ›Ý†•s,±GöþѶbZ‚"†9¼“ÄZ‹;3ŠxîUbxtp77¼÷0õÔ@£NØ¥RÆã„œÄìñÀ(؇S“© ü—v2û+A4~vWn²Û“çJÁon0¬YƒòìÇ؉ì'N,³*ˆX°7v˜’תÖ<‡]ʼnØOç?\Ë¥A—B1ÊÐBÜ!T| "o›PÞû´Ì€¤UªH¶±ÒÊ©Ÿ¿Å …pt4o$ã%3YX´dK“¦šÒ’â +bešÿf!J²’ÌßT¼øJëjJà‰þïtÍ:®1W¶˜× Ë +$»Ç™ÂbÂZ‚kµÒÓnÅ+µ È0ƒæ;˜ËkÞ@ÐvàÒ²h‰>”bVïF*Q­JØ«KC8`&È’'fÉðPiÊ»Äy^ŒT"û 2†C‰‰]lö†Ü!¥Ä¯G*f¿Zä=SsGÐr„lâvGAGQ”ÏP¨€}¼±3¶ÇA¿ÕH¡*Å«*¸¶F*óQ™±Ê¬¶FºD%«‘ËBl³5â‰:«1ÌDµø€²ï"R`Lh +žãÀ¸‡â@ïFJ¢J©k)E¢ÁãHkL9O#±"(šMÅSo m—$Ô ©h¼ضža +‡eYäå?ÉóY°•ü„46“ñ,ïC³¸…{8!Ò Z³Â ¶ê  càPmñW†wMÁ²‘€¸»5Ib‚ÅN +è]ªœ©Ðn³;}fîÝH5’W‰õ•ã¼ðbÔɆàuÌ[‰BTsïE„}”°« ¨©¸*tZ Ò1?(òÊ¡¾J8¹¥fûÁ{¸¼"šv ƒ™ÍÊZˆ¢•ŽÙWƒx|m])¦2Öf·b%ÌØìŠ,†+ßAëqk²W…¹¸ºè½*bž9Ƙ•1e% ôxeÅ–dŸ±÷æªz6Ybì¹Ãybú±Ä £’Mò.2*rꦆj•È|‡Øˆû#2·LPû4h|³ŒóvTÐ/MJz+;fà J%>– ÿ5ôM,·…²6Êág ÙY8+yOáQØð…!?8æ 1R¹%N„¾«‘bD˜#hGšCV¬&löÄÌO„ãÜÇPIöÈNuÒÜÑeb3Ä* –“¤l(p?hʬÄ#ÖÂÚ +±&âÌ;~aÅ…6Á¬4ë¿|OÈ E±HëX0±GÒåÙ +%Ê1˜ð€Ô{6Üý‹À®9t˜Ê ;^µs×h¸O}¼ÖJôM@—sÅÒ@D,½Aü"”¼úX(÷(QrO%ŽNÛºk/ã«û™.ËÕ< 9Z¸º y9.[ŽÝV"¼-v=ÈN‰}ÐfK‚@™{MݦaŸƒ‹m&Lj¤¦Ê£{·µPŸÓJ$Š ,Sr³+½—§ùÝH·,‹r&F—œ†n™•ôˆw#ì’ ˜ÄÌá3NÇå0áy‰8º€‡3+bÇMš±' c.%&¼éš¾PMq(e´d%JOìKÇqþªjŒí}oH¨ ~$—È•)6DÈ‘Ì §#“r –c4<¡!ë]à#Œó8|쨕ÌŽþ—óª9¥ ýL÷À~1úÿÎË€Ý:œ`$Ží¿0Õ5o“4 AÙpîËTâ&ÈÒ„š9g"¼ +öÈ&Æ­9òH/N„§Äárù)äøŽ’Y´‘óâŜϊ°í +¡rŒ^ŒíÊ‚pp‹~5`P£ìó¶œmJ0º7-Z” +¬Ä’S…ˆÁ!c@x‡rÖŒ“ÂfL,$Îçà·qI‰»(³” »›<Ô%ÖÅVI&©’HagÎ )ÏLuö*sÜÂ:šcÚ°ŽAº°5»X³c¯+L~!ClB‰t ³„ãçJ¬{V†£jÌ­q(ê C”{U"Q 4K_Q ®T’3xÇ[/þ*«r"Ö(Ûº4ŒÌ—M´-ü:tÎlšóŒ²Ø$|îsò…K|Î:¡¡di±—‡z¡8°%9…—&0|„œ%ßÙº|(ûF–ôÊYž™æ݃D¬Ug´5ÒeÞ«kS^ÀÇq¡2 6¡dÀ ÙÈqj—A͹ ±’pïÏ&Ì ¡ŽrêÍ»‘. :Õ$žJ* Suâ;Ç[5†@á'UÖód’0*Y.û`½âãš0`íCRbf²ðqØŠ6¯Äv ŒHr†fÉÎ 'UI…E§;•u¡Å +¹iz¦ áWf“…CÊù¿`E¬‹ÂbÑ‹­(5•ä¦ÖH—¨J’T9‘ªÅaY7+èSY4›íWk%qKT=Ľ‘‡1ÃAqvx`Ö™ÁW2õßtIç¯$ü—ÓŽZ#ÕܤjúR—$§#•fšÈS@•B*jtÉ©ê’wUÎΚéšÃUNjy7Ò5÷¥’SN¢‘Y)%U“‡º¥%Nµ!˜N€'ˆ†&ÌX4”ÎË Àj -fÂOrf[Œ‚a7©åÈ ;RÙ³>Ã#fÇ+'Ãã%s.Nf¸/å ]6≤¸†iÊNqÍ>&ÃÇhýXAÈB¡DÉÁ;8bÁ ˜áÅŠ% Êq ¤±“A,†ÓåáHbŸ2 »B¤lïØ…³ÅãûÄbxïò1)-q• +*´Òéš´VNl«$8‰8+eAU¥JÙTÂz²n j,V k¹„³h0³9ª‘ËKo€G›VðpçzÙä}HÓiÙ;&ÂÚàµç0 ûïb§9êÌò„G=e¯G$@‚AF)q|éåÄ’Ù0CÚJšH"GÊö4͸ØÌ è´!‡¢;a| ýúÄ.º-9’e7Ù’½Ì~Oι#¹’@àÁ, b>‡ÇFlÉMLx¡Œ/b…ƒ/:bs<äô3ð–ŒiÎ BL܉m6Õ9lÎR¶´^ ‹KZYô2aHf*©³pî°ë…3Uåo—CÙFc5’D’ô k œ`'R®˜ƒWIÒ+%òÉø}XÏŠ¬†8Øñä^T\i'à$ìàĺtÌi„ÙÖ–™kÊR›èA„vìrHÛå3G<ãŠì8¬v"ò10èy¡„”*ä l®L2¢*ÞLâ,a%ÊjB[Ÿ1¡8 PB$å¬@a7ù´ÁJVa)NXM)K®’GWʵkq®uI .½)ã˜+´÷ véϱdìqÕ ‹w Ò©öüi¤!1uMÑoÎõlÔÄ¥ØâÄÇï A±êéC+¬9ʱ’Jˆ1”,{´L'cíuËû«dÄ•2ËÞ”sÏ*¹iå¬,6¼ €sº“œ¤‹œ …Ⓣ9&"…eöäŸ8G³eO,*7Ça#ï[„]—BLFNƒÜ™HÚìàI„ì ´S£‚%+=\±\X€Æ‘¥« ̶W‰ÊTR¢#ÙŒ…s|³ÓY M»[J •’ŽWJº¬¤e––ðdä)ÚìhŠ7ÛçSfCÑ$1bœœLù¤¤“ü+ÄS±¡K‰ºïFª‰¼…<ß÷¤È~R…§š#›:Þµ5aÁŠ/´\lŸDš2³lÏ“°bG -!§%[§µBE¼Ã¸``”%YÀ#™ÃþÈÐ91!FtÜ-Û¸”Ž\ÎV.ç3· í§>æ3ù´jH(cµY%•<ÞÖH·Lßr&p>Wx¦’M\žËw'±ãÙÓ.~ïý,çÃú©lÄ¥Sº­NyýÊë[¦ä JÚ¢bo Ÿ+â@…£mJURš[#å¤çrNt1gº…D¾„·o̹í’pÖQJ è|Ü‚·‡*9 ‰˜E%Ó˜3‹¹Èå\åR63ÓÛ͉“ŒPùñ/hÏbÌ "° 9“Èþ¶àÔ>Éå`}I˜DãrfÊ w{ËÙÀ ž9"°ˆèòH2‚;AMh>}Ð8—ÞÌH’ +õ>yDˈ#ë.7/¥9+Oj‹û@[‰O'Ö.ý>`‰Ïîb‘âHÄ6Ø5\<‘s‘”ò•ßTš‹éÎ¥tè™Ê$D6>ØçWXç–ØGê‘$<Èe÷H΂0¤]R»ÊÙ_•ô°J +Y‹¸ƒK‰Tl@6¬Ï‚âØŒ +9¯[2RpB ÖQ ?F˜P)£ ²²”õTN‹ê’9¥%û…MXf^„3'>#ªÄá™ÊD±Ea« oGTci6¤–Ĉ©§–Æ(†& W˜¥a²Ë™¬¥€ö +¢81 ×8$¹¥š¬œ˜³nT…]«òÒªÂÊþD £0aÏ7ÿ&iÃçðlX'I5'¼5RMï’[^ÊôÅ]¥làJ¾p%§¸…äSñ¬‡Îãl\à —ÓXÊÆÄM•ŒÍJNg)’ãŠÉ’•tÊ +Mƒ&Êd_Ù%’À=»Ì8ÍÚ)˜G—¨¤úážb6`%]°[Na·ÌÃjvb)?¬5Ò%‹¬šiVÎFã$6Vs ¸ ”zÅD#¾¥œ‹TÍW*çЈ™#”d]ˆ™P'[Nɶ]Ò^Øj.'ÇTh*i6’ÚÄ.2”èH%%F.X->•JŽßUM¤¨&[”‚å’#Q +©w »C‚ìR©»†‹AHç©ÆÜAUäØSìÈq5VKªñ8Ç«Fíª‘½jü¯$¬„‹¡#yϳvîZ#G›8N\ “È-åPJ9ÖR Çð=„HÌ‰Ó ]¾†íПe/Gx½J„.1†¢³™oþhÝÆ"™Â'N¬SƒË~R¾¥äJ-ûZKþ<&ø’˯‹S°è¤âÝ•²¯(»J&6Øvå˜jékÑô„*§eãµl@AE*šX% ¬¤è·Xó¹‹i>Áظ0eYÉnTÕð²š^ÔQYA(ü+ ìvt°|¸°|ø°p:‘OÏ°ò@!ÇÆr€0îR{‘o©Ôg,p,êGHã½°ák“ªÆÔkú5N“G•ˆÐ(+ÝÈÎHÈd‰™Xö¤%)ŽÿÃP/$Gï„ËGá½qÇAbù0fQûÆPTɱ–“¸¨”#8“r3(PóIø»9 åÀ/ŽtñF´âOÀ9qÓZzå$ðÐeÞFByH¸*vO”Ë‹pÓÄWnͲiè¶e›ìñDü jy/59W]sd!U¤çrXÚàDZsd4٩ιP^Þ0(6Ø:‘ˆ(;mŒØ/2kš#Y>ªq2›¶:‹™A‰ HZ± ï§R®Jň*À0§à0v#’]=&§n&_QO„'‰bùBxŒº¨œ×(™9WÇ<;â¹FÊ“¸ùY÷Q¼lÉÅ•<«¢8ÕÊW ÁÒ‘èåy²Yb‚qkp*.†  26ëf1OxäxÂyÌz/Ÿö’|®€%0OV( +Ù¤Ñî0o™Pa½b;{Û#QãÜùƽ»®ä/ÈùÂ4|Í{”ónht4ˆ0æ}‘E,:!Ic9í‡öŸ!ó%Ä¿Š÷q’Û;ŠDiÞ ²o"o=%rÄMÂÅJâ^û’äA´j GŽ@;«à!¬ÍÆì,È."ÚåküS2€{Kh@ø…\*Ï=:¢¨ø÷ OòöÏ)a$çÈb&®«lBÓñ‰]°+h +™úìì¥ ˆ?‘Í–„,:1©–ÄGCÒ2ߊòÞ r'Ôäd¦ŸTÛE™*˜ÍÆg"d˜šN’-jm†ì"q…Žø§d€Î¤zÈ(;8DO–§Œ*wÊ;7«ù.Ê@~ÄÙƒJ8µÄ¾}òô+)m(D*Ê×ù`Î.ÂæK³sbJÂ9ÉÍ°Šœžœ»1»*{~³Ë;±»CvkÃáæÒA݆Põ짙]ƒÉ4\Ù¸`eb†Ð¹Ë_c²S_åw‰oŒ.J˜^'Cíƒcj1ÂC®Š²Ôr—i Ž€…œZœØÜ þgÿØfõMx=lg%Ç»8O'¤x™—°×2!鯄«7Q‘;=(®€<Œ­ •¿¹s]ö–f×wó˜´ç œ!Ïå4pfŠ“ Y¹‡Ú×Ì]÷£†Å;]uÂH¢#ù[ýeþ Í.omÊáëÐHb%g_RáeÊyrš¹Ë´Ë `AŠ U\‚©8Ò½ÙuîÍê[ÝPB.£¡<9ƒ”Ê€u¢ì*T0uŠ‹áÃaºéÌÝè¯ÒY*¿Ñ Cj\{w'©… üºC-þ*%++ D +Udœ=Q¸Q®òoVßÈÃ@¸PÓr`‘3HRÆÀgŸ7;W….#žQ·\õ bßWî>‘z³úB…â§|R˜c9¼wÄñç„ÍÎUÞÀ´oÊ°€Å0,»3»Ì¿ Y}§°.T«8ÔÉ%k÷%¸&eV”ä7;×Á MÜ–Sþø\§bZd÷ú˲W4»¼¶É%œÄyº=ˆ¸¶·¯dë4³k@€¢Û…N;ÎC$LѹË_f»»ü.y¿–fpM³IÌ‘uQW•;/Úì\¦Ý¡<_iW$£²ž›ù³«²ç7»¼StÇÔ)#gŸ^ž::.ôk9ûtœþ—]Óé¥!]0ºôŸ¹·÷v÷`븽ÝX9Ú:xÙîÖ"#oý­¼¿e† +Š=3ƒtHÈÀõ•ð0R ù¸,þ…•"pz”û"){|ÏAFË·ŽVŸ/YRô·w¾øŸ‚ÎW6î9µâ@•t{Íôsšsè_²Ýxy´µ½Û>8n}ž'&ÅÉ,ùÿŸ~É2ÿQÜëA#Ô Ë÷ŠÜn»$Meqœh8·÷ö+Ï"Ö÷÷, ƒ˜$ìt«ËÀPp‚”^2áHísxÓû0qÆ4iŒ¤˜è(LS8{}J +K:òïž®â +—™¥-Aì6"¬çç"U¢¥»=·ï9$N§”0ErpZÔáéé_!å« ¦|Gùð0!FÇî·'zˆ ˆ4G­¢°g"O¸û#o‰a"gC¸# ~}4ŸÉöJó£žèGzêcøláóM‚XÓ•ìGýBöü¸Ð &”0ᳯLkRÈ5l‰¾‡Ä$ +¿™%Õ…õó èd&HÉ€tDê:Û¼Hmï¥ÇÚ’F™¤é.*øœ« ”N±/úx4Y|¡ñ·uÝH}/@Æ&²=”W±.¼u¾·§ÿ‰¸E…KÎkG‘q5.ÀÍ‹ó}Gò¿þµЄ#¨øƒ£u±©¹rTçGÜÄoöWçer!ÞñР ï¿aô'Þ4ú“C}/f£?5åÙ›™“Ä”Œ#ñØïgÉ´ðsùÏŸ¼¶2ôÂÏŽÁé Ë“øJËE‚8$WÌ8†æ&·øãO½æ§GøSÈå_X¤2‰3ÕymJD‰àcQž¬ >ñN¨©±&†,8Œ¢S•p¸)2VY¥R˜•\ç‡.ˆé7â*i¬Q¬FdÅM”ót”ÿÄ{SÅý¦aØ4–N³x{CËáí·òBœ}Ú ñôèŸ}úqÈÓ}ý¢öéÇMÀÙ§ðS‡?e\û®¦dF‡«[ÇÇí£ƒß½><:¾ã:bž}4.Oî¯9@Ëïù·»ÛÒ´+}õè°Õ~ó¦±Ön“¾÷~#=èÛHç~´CÒÔ¢Ò§æÚFØl¤~ÚÐ5ƒL‚ÎûÐàœMå9 +ŸB 90¦=§LÚýbö‡ÌŒT¯-_Ô|ÏE]^Vñh·!¯\23Â×B.9œ[º¦É×à!dâèoå +®-=£8Ü®—”æ¦rMufº]RyQ~¬]†ZD·:#¦—æ{mÄ>MDðtÆO‡©T QIšpÖ©hŠ÷ * â]ó>ÇûJ3ö3²¾_ì]é{žÿsr¨Ü@K.6›SäjŽUs¬_€cyÓôNw½-=ŸsIuxÑ&¸ÎÂ'èb'Ƚ£žKJ)ä1§†Æ‡ùøÛ6Œ + 2&ÝÎêîO®i½¦õOe˜D}{òKòy´7ÖO +?—êÉܪ°þ®z´"h>úuM- +¹þ]E4êGÆ!ÆÑbpçσÜ{ýóÆF¸ +Gè9¯÷ã^§ò×ÝûÒ÷¼îg›ËŠ +ò^§þXlh£ÓmQaRù¤qEmi¤™Yœ ©#KßIwJM UÂêôRš)¨Ìù4m%^àvNæ Ç‘¢0u¡ƒüÅßš~?yÇí~-ÿþïm:§{ùœðȆÖåù¹ß³Ò(.È]ÀÝ1“Âí†O¼øüÂÊϹ +3ÉýÞ ùâÏå‡ç‡VYq^s?Δ—¤€3?7(üÌCêܘP駦ùߺ-báÇÒC“BУ<š÷­íÌO-|.>à9q5:°Qvo–]Öð‚Â; ¯-¿Ì!ξk¿ỖF;0cP’9Ž*¶é<^Û}þüðàCcDYNðlöTw‡5j‡6¾m˜’Ëšù 7cR8Ý$]î•N`ã” [ЄqHM +é¢ä€áZ Ç‘¸ç €Fš/§ð¡Ù#é!¦ªÏã,½åb!ªº.ö¢ŠàH_èº. û®+"•°¸½ ªƒ%HÅHˆ“—ýã㺚Ëq£.jaဃAqí˜÷Qp\EDZT™B^"ªŸ Éêz‘âıÍ'ž¸ë¤TX,j4*NwäC°RÝŒg-1rFWŽÁ„Z$B§2.ùa-…¿à YýAL.ßj9U†ë#¯„=7a”¤HL›Ž¤“ +vöœ«`€®ª!26%Ó’\8,àZª&öõ¦•œýp'œCœTL¤Nºc¨1£ºº ‘JÕ8ínX“JŒ)ÔÚ•MáxBMNFq•;œ(å8]j_˜?–³ã´ð(·†9 +yKÔ‡Z×=§Œ1ùç—×v^6ÎMOOµZo÷×·p©ìés·rW¬ïl½nOﵶ‰ìtØù©f³ëeK[Ç­;‡Óí‡GþÚé÷>ðælŽ¨1Ò¸¹ó‡;Ÿ¶ÏG›¸•+HÍH¸M^ ¤3—MQìÅÕœpPèÉj©!.; )¸æjº¤1²h®¥S°; ’H\Ùx´ˆã¿žBƹÔ(˜™@Hâ*·Ù@ýÁ„s«¥ãˆF±s©0–ÔÐ|R-ä4—]ÐÜ”†û·¢ W’Q–[9s? +¡‰ :i>¢Âý˜®MÄ“ ¡g‡ŠÏ¹r²=JÀUàää4 =Hša 5Ä„\ ‡Û¢ ŸuCÕt6–Å ×ø“þ˜5æ(¶¥$¯$v-Ábë¶]sY ¸mÄ…–ø"£\"guävQJù:‹>lôä”ð¶ =ƒw¡Ô#g4ãü4Ÿ‚²l8b«qÀAI#’ÜÒïF¥VÊ™ívQl]½Úü JÐï@ª0»QÑÊò °"áa¡îTÈœTÎð5&È’†ÝJ ³”NÃ(Rdœ%jébCTƒävJÒ-‹¤€( Nè+´£»E…zW{—L+ÄHÜHKrœW˜b92ðœaUŒÓ R²‹ûé“D9zÌ4打 ¤IŠjgLÅ|Z¡‚áæȱåê +'¡¸ÞKʇ|™V°dp%€û»°‹°,€ÌÐW'–k‡ÒÇTÊ’UÂ)uá.«‚£X†kx’œ6˸faª”PC¡Æ•”"ñoŸ§Ra>ä‰{H„"°{{qWøUï-ïgÉaoqµm©tÁ$¸¥Q‚>DR™—$–âm …œš-‡ÂÐ?–«0Kv38RäsÍØ„RBñ"Æ®æ…Pže)Ç(k¨¸âj£Bv Et4Ô±ž‰%çGž¸&WúU\­-RBúÊñUÒØ\kÆelãRpºBs 1)ÆÃÉ؉:ø-¢†±«/«]4‹£³RùH#ŽQã –š/X(ðâÈ•fFnšM™ÍE¨ÏªÑ²”$õ|ãD¦Ž|q·†ˆ(ÍÅO˜”0íØÏdÄÙnb-#L¥j  ¥'ƒëΠqæ'åÓY¬PÄ*–×C1i,í*C×PÇ #®åɆü(ÏYÈû„•,Nž³¤¤tod¹Ptàø¢t. ¤¡4aP*’V‰;*‰isE”C¤ÿpNŸNsʘ é¸RÏ™‹&µØþ“æ@p'à"¡E½ãK*”F@ÈVjäU䓙ʱ]lúsà +§ {×ó+шՎt…pÄ¡4×NØwwëàYK¨TÊJcôÊಳR}Q&ϳkîójÜÖCšqŠƒlÌÕ-÷;ebÔÊ‘æR +ÜeŒRÃ6Få œ”Š°Òg©Ã\˜e2ÉB“5E{ .UÒôŽ…:ñOn©ÎéJ˜Dpœ…DHƳRj,—2P¨¢s¹@®o­¥ŒQÚ´¢´AJë‚ Ã¿"m5ç?C_¥†:Q¯Y*§"ºRÓÚ¿EU׋é¹öa¨B +77gJ„DaÔ©,-´HV"ŽÉ©/&FÎu½¹ÛW"G¤™9R¤'J5u×G„7³ëûYé,ÂÊ;$•È8áŽ#ˬ†³ß;åº{FªúÄqäêÞã8×–)â¶qìOÀîŠEñK¹†U‰ê@Š\»/ §Á¡ªÞ«±pŠÍã˜%š1——˜&2½®ÐŒtŠXPÊYŠVkd»Ó ¡x¡’Œ+iòi19AÊ}®¸y¹åã]âì…ÏøH\Å0R¬*)®Àêû†œ‚©ç†&4µ+RÊwĨò‹y粑fª%ª‘8‘T,…lÅ4“®¹RàÕPé œ‹p'ÍL>’—£N—Ó‰«˜„RzR>Ø·‹׿D# ¾Áò)\®Î3÷CÖ³aYlB¿>IÂŽ‹¥ + rQeßÊT¹R\BIYÑ扤¤O—1‘rß±\¤‹â4NœZÉÂ;•t<ÊÝGÊGÌKˆ‡¢þò!YÅEF¤´{`î%>ŠÁ×R‡Ž¸¨aàª_æ© $/a33õ}þ— r)Ù\WµLêDqÈ{šôdé+Qß, +·ˆ!Ƚˆð’8pñh;aàÌë”B&DÔ˜g7TCØ,®ÛR(«a3Q)h¼©«QA»”d€ù1¦h¦Ì’$Ò2.•(>¨Áy`e)¡Œ®Ÿ!ñýHtÖ@<Ü—Sª‚£[Ÿ‘ê|‘â$‘öE²cZÔ0ïD?¶Èíßá’Æ|EÂ5·)ˆEÃÃáÏPK©p·&0€…Wée P J´÷ˆ»=H±ì‡ ð];¹.[ÈÕÏ°Å5z|B½± ×€áZ0Š«q•.œÍ„ëˆÕ¦ aŠ P)Ys]ìÄVbÑÓ^é]l¼[izž„©ˆ|V”10ÞÆÕ«CᬲJO"ÃöAÈÝ~„ÉK­X¢aÊ jÓÅ*MPÇàΙìkŠ¸èmœ$žéÄ„JIJÔÁBqcÝÄu@g}> uVLZhÑ7ð2‰¸‘ HB)fåH¯+{Ëýð"¿S²Vš„Œa‚#âIéD4N~=óLíî Å&ypOîŒÇ ‚¸¨.‡{Á[”3—´–nÈʦŽ>q&ÕCΔæY;¬HwLŒ`-VL*.NĘŠŽƒAIåúÐÓÊ9ŠÄyjà¯jD•¼È91Hl°Wƒejas‰ÂÏ5¬P"œšÎ“Çõõ¹t›Ô3ÃB…\Mú¨Šü¥þ/ÊŒB“˜—2í\™˜ §L±«6åÞ¨öw„q"…¦adH¯'çX¿±à$˜Bný”º¶µ`P¡–Ú§¬»k·p¢K¡Ú ¶@¢òìý¯®1•õØ”K] õ†0œbß­{†lì;ò…Òî·¡]WS!D©µ‚¾Ÿ±vÆnìŠ)¦ùˆ}ØÒ[ÔÄ^à6E¬6D¼°ÜÿJìYç¿a3nM$`†NóÇ0(ž™–v¬Ôàw­VÙaaØâÓaŠxÆÁYÔš¦wÉ^CжQ!9С󌺀%4ÑýqÌGR¶)+N © êÊ̈k^<‚eŒU¥^8yß|*ngÙËìféïË,Šw^˜W+÷¼w4K¡&ÒëâD¦>‘ì w«ÁåÙC/s7Ovчâãæ–(lHó¸Øe/ÜÝzmÅ°ØGŸp>ÅuEÙâ™Çþvž öÒ'q§ñmg +µ´ +á]–®ûey±+%†ƒVK«„H” 4+KÈ\3am’ËƉƒ>ä8‹4vn³¦æ%¸ƒ+ §Ì­áä†wÞˆk–Ï°±sž»üzw}KZ`è€u¡˜%.»æCV>\ßFéeÃ/ +½m †8ê½[Þ +gÓÐTÅ+w³”›—íIz60–ºaÎ'³ß5ƬPÞûó°ÉêL>èœÿ€ß}êÅqû¨/?~o¾yåTî|mãÛjôg)qçhw¿±´uôêMãѹowwéèúÞn«ýè|5lèNfõZ")7S‘æN¹?›ò'ÿ_s¤ôµsÑ«“¸ÑdÙ!—Br(HŒ)2nIæÐ>ä8cDæñtI-ד"Å™ö5± ÔÐU~Ðç®þoŽx•ŸçI¾÷ÃÈ(«\«kTºØ'¨°)Q‹_ÅDë|å€(—Bü D„1L¹´io$¨¡Hh럑&ѸÈ0"s™;9’Š®R„'q0/~ïðÆ” ôYåú÷GÅä¾f„EÃ!NA;‡«û‘¡bƒ¡}"C&ýœ†BZi6Ò֛ܭ\-1êfky…Gé R«]fs~GÉä+n&#A¨âv2ªíÜœm“ì ¤pD¥]mÜ)Þü^ÍâmFË›’Ç>ƒEnÂåäGŽ'¡TdTæ]F’ÿó›É+b…ås‚+¿™Ì˜t‰)­=·/ò`Ã-‚*@NyÌsu¤2›¸Àú]8®("È™qI’MyGÜäA™TÊðÂÃœXò/M½PÎé§h’”—˜FÎ’äÄ*&ÊaБÉÙÎÉËd#)|Å›Åîω}©/_R r€ +Z„S9¯k._A¿¨½43u4LÈ¢%‹É:±]G>²–ËF‚XÕ¦Ù…3Š3=Îilœþl3å-÷5ŠOPáì{ 'ê†ãóÍÍtìõMÑ=P@’&d 6ä³€Ê Ï( äÖŽ8a ¨Éi‚0Ho²ú‡q¤¸øR¶N3Ÿ‘÷ÈgŸ¤¯rp7Sò´å¯ó{Gç¯ÎÜä_!]ê‹#1cÒU77bãŒÆ^9Êíÿ0òwú‡ù¹4ÜB»8åÆ¥ ç–ÆÈ™…üb Ça”á¶W„ùu,ë5Žá•q–¼džå³X}ȳ5¥ÄQ‡s²2 `êå°°ÉÈÁ(ròµtN /7 )/ž„ù¤3w‚œMŒ5#á°npâOñ‚‘{P«4% tØK7—2í2‹Oä^êò¼ǦÝð:4¡¹;£á™8wgd½„é€r“Òf“ÇySÅ)ÏGi)\I×΂‰ÚTXTn˜2ÁUÉDi!E^`¯'ž$² ½•[¢=}þÕÞñ” -vSB"”nôydŠ“”äAy›#fœH™ðBxoLÊ21âóZ9£#).l¿ü¡Ë+”·Ô ´÷db*@öË(ˆ ¯›œé©cá›`L¸9åA¹9é³¹óëLpöÎüBdcóËeÒ‹%¹¾HM9ÜóÔÄç–™=Á-VvøXI°eªHššˆt­UŠX!¶*FÒ¡m,G²é”&J‘€%•7¬E?K‹tHnô]n9‰¨lù{¹Qe¦ÊX›iNÀWfjA'¨Êô=ÐõE8Š ?jâ,fhåA~ËpÄ¿p‰ýÓœ×˺zWK:vsç‚‹ÖåßÈs Np1¦>¸h]Õ¤YpÑ:Ý‘·nšW¼SàøNÅ·Îg +‹æ¸C>ºÈ=ó×îç, ŒqsÞ·£ ãlâÀ ¼ØïãŸz3²(Pó¾IÀ‹.§æÃUÂ…Áµrá*%3žæÂUr|Q÷ê(²#”ÓZÝáÀ4® +Ø Çã—Yãó£9ߊ2~v3טvù$…›½\ôú³ævçn$~™QŠÃúÅRîN/z¼þœƒdŽ±̹ñ¨Øó{å߇NN$”cãÞe©¡S Äù5µ³Y=ÈÝ)f·zÔÙU_+¡”Ì =G¶îÍ¢Ux9\ýŽQyß0zm†Â09ÉV:ôñ*€RÇb¿X|¬›A™k[»•йÀµSý’ÌM®½´O +« c@ˆ}Ïß‹#8AZxA(GÕe KI+]²’3†Œ–Ye |Ȫôž2nÒ +@æMãîì2㯛ò¬¶²RçMBž® äæ‡?t¹>¬ÚtÌN¬¨Nè7dÏ=¤‹Y!\id’}`(ì(˜:«Fî:å³åD2Ègz¤Ág oSzŽÞ¹ç]JOãÓÂòÖ0{«×d:ƒ“ü?F!r(Huª»3ñšW~R¤ÐLiúâØ Í<0SA²qJj’wªzœE­à®·n«d)#‘§OµÊƒr•;”'L´@Ÿèl^¡c. T¤÷8£ãlWHNJaGg ¶”‘ó¢ù›Mn«da+.÷PÜÛÆ©ë9î¼”Œ—[yH>l•Á¼~'Én9Ö„7º=–WG¹ +D~C>“YX?„XunIÝ­2ÆÂâÃC¡u‰›Ž\ËU`l½#ª’Ä`8½»$+Œ”âʉ”lÎÓ\تÊÇm2`æTT^>uÂVŠÓn "ÑW¸È‰NçñˉWãV© ›³­“RIø@]þfW +¬(þ¥PEIMˆY“-¨|˜³¨tÄÚÛιd’¢Ó‰[‘b•‚Р»ý&ŒÆˆûˆÖ„ö;ª2‘ KËzÒñU¨,—‰CZU±”!*WJ²ršºÊWríøŠL˜¹`œ³E +Íe~—ÜWž ¯¨ïž ¯È +£œâêµâ0Î)®ÈÄ–0s7ðÁH€:Ò˜ëF”c?$¥ÜuYÀU;”m.”2“k¢Å…˜.š³•nٻ̯Èr!¤4_\ئ!G—yÈ~;sq!AÌoú(Ç:ÀŒ‰Hæ@žÓprPøQ(Ç€ãßrÅHâw“¼ʬdÝyìÙ&¦%+æ‚€Ù”€!i ;•#€ÛOåÆœt`_@™É yAã^q5R¸“4ÉXó²MJI˜É@’ÙîºLR†\߃㚿9á\®Â+$lj‡’‹£±3À,ŸE +e1^>ë%òC2 ^&lC’/%ׂ§¼½LØŸVX·ãòëÇU 2w0°¼+­½8u¸[$5¨n…šµ ôª+ZXy³×­Ká £œêŠãÈÆ]ç”Mëêî0(pÎ¥länåƒÑ¥ëG牷…ßv\Rõ&?:qz1‘ÃA:WïÒãˆvaVp:(ÏüAZrOnE,i½î +÷_»õíøcÄ`:åÕv¶žW^ó s'z '>ëŽ}çHo “)ct*,Ûkß­}æ¤VÇêÊÝ]……‡J¯ˆÃ€¼rQ‡FD•a‡ 8 H‰ ; ˆ´ÂQT eÐa-dÈpаa‡M/ê0 e„´Ø°Ã ¹0â0@,¡­iË„Ã@ÚXá0E’à „Üa€,kÀa©È”¿h¡íÚ‘¹Jb8 "Ë ‡AhµÌ‚IP4à0 ‡´a‡0MBƒÐÎúKˆ: "Å!ä&s¤Ðæ:oÔa +Œwš^Äaà‹²À á“\4à0`tu„öAš[Ôa íªHàA‡A%˜o@¨·Ñ‡(ó€¸ÀÛ ÕÕ@x6™þYô"UQ)¥ ‚ƒÂ+˜[Ȧ€£º«Â¢t ³ä¨2t“C^IÒë»Ô ZD«‘"ÔÈ&ús |ç4èUJÙ‡QÚ÷ÉR­P!÷˜ifÛè¾ûÕ#‡·ôÝ&çѪ.ܶšô=™eEìL‰–tE1T]~ ÎøñÓÖÅ4„2iê¼;î>0¹¢É\qhùî©Ð0ý–,V¬pp«K÷°)Ï‘j‹z*+ +Îrƒ"7QPÈݸ²âtá>0y$!U—Üâ°LÕ}÷Ë>ÊŠüS0“/ ðà^if¤‹é®ê¾ûÀäwmpQ¾û YKá=ðý;ºï=0YŠ'*ò½&¿$N™ñľ°cQU÷½PäZ¬·À{`òÊXèØâXX@\x,ñ]—¼þA‘\…¢!˜²˜|ÅyøÎKðhÝ·½-þ°áÆ~‘&9¤Bá<°ü§ Â{`±'¡ÝwXè-%8ø΃à*€ï°ø…~U b»6ƒ¾ädpµJÞ& °Èwà!.£'ß{`òø‚,}ßS[a?JÞ“G”Y0Ÿsˆ¦üƒÃнJÕäÜ« HÅ¿WI¶E˜ºM©%ï¿°T¤{•~‘|¯2(ž€µt¯Rå24¤‘ª¶æ†H +Ï&õ0Iá]`y«ySÅУ\/n„›x Ú\À7+U•§b€§«‹ “2~ÊRÅ».ݬ Šä›…~¡³R5•°À3™ŠŒ&Ëd- P<v¸Íí_ŽT,ß–HŠQO8ž{ã*5Æ*—åÁó +ÎÐ+ 'V ´ +fWȪ OZ~T™¼X© +³N¢ñ“\ !4ïIBTºŽHç$”!QFCTÅ9Úøîµ D:'ñ ƒs¿³àœÄ48œ&'14~§Z"KÇÒ ‘´8O Ñ´8Q ÉX•G*’ÎIT‹3zùœ„¥K”¦¬S:´Ð¤"YM +…6áw¨ªÐi$ÍD5„ºâk0ìazHÍQ„8ßβ«â!’– +å“vzIš¾ä°T9þ† +™´Ó%Ç67 Eðe*¢kDúc› @]òlûŽ£À³Iží ÐÏbYÀ¸fkPt«ˆÌób‡"=S¾>͓dž•q*²Û. P¡Æ2k›ÅÕ”¨_V¢Lþæà “¿ð)Ój…o;(’|ÛA¡O|ŽÉ•öÀ¹ín-ù¶Whè|Ë4~„+m¬ÆòæúE‚¦ŒN`B¨à¤D‹  /4èu@´Ðæ~Í`\žÃTžáUðd·òbYbH‚" tA¡ÏX/ÚGôærþQ êjZtcý5ÛÏ’…J£d_¸Ã^ÜD +}³ØïPˆ5PE¾Yÿ b L_RùÙ³„Lr‘¹C.è,¯?¦¼ #üÍ +tKUæÖCÇ$þÊe|ðõÆà˜D*”9YH¸ùÇ$S±øÏtM‡²ÄaBNŸSn`‘ï³uaŽ.à,­³­»À\À2Ó¦¤]"õ‹%ÑøijäÝl{ ˆè/ÎðÖÆ¡ãÇ‘¯©öÍö‡Þ¸d<Ž©ÐMÍÝ8ÌÉì—ú ju~)+£xá,"©¸G¼Ia‰§}#†=XlyC +1’#*{u¹y´N€E!›$sº#ÿós¾PBŠ3i™ô§x”º/³2RB’G FÀ4Ä¥??L]îÈlÛT +>´ÔY | JrE”¹Vy‘0-±D¡ %ÂÀPc®’X +a4öt$“ÉúSýH¶Œ>(Š©€›_$/ß/ nÓ0´!¹$âr0?=É%½oíŒFCûÇU?^T‘9LdóÛq\r ˆ{WÌ”«êü_´näF +yRö`FèݲœÐ¼uþׇ&’ð2= #–ªÂ[ÆUÈ¢Úý$x ¯Î¾2ºd7RüêÒ']ô©K‡R{560TÏåV0kFÂ6ß1Ö#wœÚ2ÐE±R?Ѓ¸cã¿ÕñWÊéØ î½Ç˜)%Ug_ùJésPÝÿ$*Ñ'îʵ7bãð•þ]T¤1Óòþ~ó÷߆zEÆÄ?ÅP|ô£5¤%Ë¡?‡cMýýoL„чï9l­°>¸÷öñšPIJÁNɱ‚Œ¼>º`u‘†4†Ñ%<2¦ÂP×ÔBX­ð&®¡k.ÇÂRY(k¢c8|™=Pª3Xî‹¥—‹U7y  @ᾆÀ`‹¡ˆÄñÒMTÓÕ}xDJe=¤ aìÀT:l‡ŽõMÄzK „0Ë6Ùµs{°TïÚCÇ££xþ¤›ÝüÝø'•þ!*ý£:úhpD èDEAÑ里$“Þ€¾%Ôá„= ‡ 6 ØÆPZbšÝá v%Ø$>¸†Ã˜ÉP ½p(ì†P¿ÐK†ùHCéa@ÛØô”7 Ç i8„Ƈb"Ó(cÈDAƒCm8ŒÚ‡Â퇘??)ëŸIY¿…ö“Žÿ4:þƒ–âÈ…OƒÒt¤0½˜H<.e:½|­‚ã—:ßbËPdÆ–vš½X2³£êÇ¥^Ïë4åižk{s±E¨¨º61®©(*VÓaþª‚×ðÃÖYÇl›–ºtê•ê¥^§ö´ uîžÕkï¬Rª×š/[ZuÏûÆ€fÙV«NµÍãÚo^ýØë<{•ÞÙ·F¹U/4Kåº÷&j«ƒó.üÖnuzÒŒ¥ý:ÔËV¿Võº¬Ö +ü7áÆ’s±ë«‰TU Í*“¾YH“—$/aF­N ¦Þðæðüwý+»Õ_‹Š½LPâpú÷ú|Ù…_¡ˆNšb·÷J¬ +äw}Šz7#éXx†Æ<Í +{åøÉ5LUÉÁ|…ü2=‹V9T§øƒ(s þ|ˆOB‰ÎnFGËM<ÃDòÔš¹p-‡¥ä%› ­ÙxLhÙxŸÌ—²Ð«¬„ÝÐVؽu Y™ŠÞ’¦ò£chË°ÿ0#›_«TKs(wš"[ô’†šá30 U„e®N!¯Ò:MDzÃK|ìùŒÅ¿ä0#™Óx† ÌRã×…`’t,±¼ðäÒÂŒi¶¡Vh>Ù +NÄŽQÌ5¬c«ìÕ+¾vð° +(5tnÂÂ;—`Ûda|ðn ]°- £äÄð‰=ŒÚ.3ñr¥KÆͤC``'SöRO+»—£±°8ŽÁ®™âfRH5“jñ—Ú +)íðwâ—½œ¢Í@¤¨÷¥ÂÅ”'„Cî :¥µÆkÒx¤ŽÄÌY†÷lX#½È“b_9H çúe˜³–öUþò`À+ˆËª)Ûah˜#Ôri}:HÅ·xÈiãs(j‡o‚ð˜çõ&k‡xw4`[tMçŒé¾­ð£ðTF$7ðÍ^Ù²môž‚&Ïãs lÚ”œ‘6Øaw¥1!¢†XáÀtQÂç°‘Cà,ôrÞÐø]0¯ÁžâÝC°\œ^ÅÛ{›fˆ$e6f<²©—ðôpΈz,)3"œ/W±È¥ÜÕˆÙΫñ9cè± `?SnÃnðR ÌÌYJñ>ÙÅlJ¯íÂ^ÓgË䙪°5ÌÇÒY[¬(ci<,B¯¸y¨<~›å²ˆg˜#žc×tc¦“fc8Æ47a:<ªŒ´lŠä$ðÃÕÀwWCL·ðÉ-ÊWÙåÕ6Üðl[eì”+ ¿Ó ƨ ^Al·4Vd"ÖÛ¬âêT Qê\¨X¬Ý}ÅDÏ43¿2µí@cÝcÆE›^‡á×0/vj*ÄüX‰KY¢ã}Zü–•†Q{¢O?n3ƒ0öÔÃ9 ¨€rËà@ÚS`”,)F{Á¼_Ø/=hÃfÔˆ` ãX@4•]Å`¼v¼i E¶H EMŒ;GåmvñÑÄÇ+¶FáûeX¤S¬h—½ÿ3ñî……Ç„VÀ¡8¯€&Þ]$D 8”Sa˜‹p£‘¢£ŸÄ„R¾†bý°XT†Î¶‹ò™QÊ5¼õ ”jØìq6²ÙsÊœŠH jÊU˜Kgç§0L–›¸,d‰‘pœÞf3,FxX@ó¡3y.¢`ˆd&7 ½±¼@xô¨–e¿%Ùg:Œ›:‚xƒmZÄÆTeêD("é²KS|6Sdƒ@Fj|×RˆtöΠإÀ6@b¨†™1:ˆÄ™T—?@VE–¶¦ˆÜ`*‹Z ©üy³ŽÝ`@ÚOÊ g2‹˜6”EÛ ì\°Ä Gd€ÄûôšŸ(Æe¶CnBu7†:4 &SSE_ ±^…,h¡ó·¯ÐåcªÊ"`MÅ¥Ëô±MGQp[]ž–VwY}”ÿ[T`–Æ‚m¡A’Ô0e–ݘ¯Æ lpõ6íò¤Ë6æÝ#nÅê×(7+ ·*ñƒºu4âª*béÓÄð¹2K%'¦‰§IˆÈ\š)H©äˆBµ–\‹JhèLä¡ÓK¡¨j|M9òÙ±Äm(êê ˜’“„H‚lV—§Ê¤Å|v,„ €M'§{9ð#+¥bŠe…i樇`3—õ‡JªN¡ˆyŸ8GÝ¡àÑ~Šz´òØpeDa: ŽŽV¢Ã4#BK@TØËD8Ã2ç:¦`@"Å09:0ž9ä+|(4þP]ryÈyöŒ‚€¦ˆÌŸ?@r`¹h\¨ðØQ™ìƸ¦TÂó¡Yiþ ÙåÒCçA÷SôPÞfz„Ê㼚 .;\MFR¦ÈôŒ‚‘ŠÆB%[dôžP~‡ù˜õÃâiä6ÄÀ#é:´2$nÎ\GÂk"$5ü‰êøAÏЩËØsJª‹ÊΔ>*Îb–8–0/êð¸sÂØJ©6£lœ¤&Þ(™"ñ·ÂSt¨¸[ +3ì\4YTK˜&Ë#Òä× êb1þòµF%Î!wqR¸i&ê]6+PQÙÀ…FŽL6š©s @u™;âK]®­øÊ“7˜™k,êCôÐÅ4Eäb¼Ç:¤a²”$ÌÉi3½ wÎÐÉãòçè€ ,DºoèiÎŽÓÈ0Ry?ÜVÂe´Œ4jçâ¸ó±$®P±Ì%»IG©h0×6#7软ƒÌeoðµA…Üt+cÐFÃ!«F#ŠüïäÃÁ#ÜI亦÷Xèí UÝ7Ü4´ÒȽ¨³ü}öÈÌKT|h)°S¦ÊÜ¡<3…‹ñ!TÒýX܉ l—«È (‰ LLBr%Ûש$™I_^ç:h…,“ª¦0&Œ‡ç¦RÛÙüy!"$‚ +xU4È5P/ÑKL¡QØê8’Iê—"u¤T ¶Î㸠 b¦KÁeP™ × ×´·(š ú>)\ +a[g›çòL±†Œ$g—Ãy<šþ +Ï!Ðc¨1:·LžMׇ€t¥G¶(î»Æ|oì¬%˜& 4{•†8£*¬Ë3êPP#p]À‚U F4ÁÙÔ]zD«1Ç¿KoƘóI —^ ëœòøÛ/…9-±sãÙÙá‚ðð$@a¨‰Î$~- ’%ºˆâ©r=ËgGå(Î)öRã’Æ %<VšåIå­PÛ@uŠ1h²`5 ææ0Ç'e¨è?Á-1xŒ)¹ÏF­ÒC>•8?ù²’ÈŸ…ᯨUKxÕÑ-L‘Ãч r;fÛ“ü.úº]Kø?0».žÑi˜ÉÍEUÄ#Á4²Tƒ)‡òèUñä ‡å;Fâ·Dø()‚:ż èa‡ÍA›Ï<0â ê ”Ùˆ 8 9…bqðž£îʳìiøÒ¶DrJ|ͪòP9¸M*_ΓU«L %e3gtاí˜W*(©Iy²=ü¤*ÙκÎÒic—(à/Ì=ë°>èÞÔšÍòPl$ƒ˜>E*E ut•Å€'Ö§ zÖxò ó—h"ÞÖEg-êæ,÷‡J¯ câ5Ó\(<%i>Lq1¨5~WT;PwpF¸íL‘££KRxx"r¢£^¦êÒᙎ§+ŒƒÅu«kìDµH"4\lvGz 8 vèðB I×xNWO¢ÀB3ÐêÂùâ¡y8Q›áÓS™Ï×`'±ì´—†vX8oÿŒ ©u1´qV@™ Q]¦ß ®aÇì¹,úðÝ;M~Þ©³ð +d‹+ÓI™‰ç¥¨v8„óëä; ¤4 +sU3Ù5°$Š£°ùÒÄÑqi +Ø¡Vn)<]6Š +UeÞT›‡eÈF¦æã“£y¢ƒ—$tñí8¬ð }ÄjÑ©j0‡|›‰¾)Íp[Åf éñt£J4,=F!Àb cƦs Q, +eLAšÑoc £ƒb[ÿ²Ðz`{¨Ò©8:ït=*†Å.i“2,“ Bƪ袃¯ìpO/É™¢°ËH ”…œ„,vÈ—ÂHJ¼Æœ4[‡?mƒ¹kt.b°£ ˜ª8*GùŒ@<^×mt¢ óÈųt—¢ .£ÅÄÞÚx|h‘á©¡ƒu E'ÍÞX3uÂAîjàU2òõÒé1©0_Ûaz™Jï­Ñqb£ID‚CGŠÆÌaŠšß)H †Ü#7§ƒf!^ b¾¥,&ÅÑÏ‹×dl–)Èæš:ra |4@íiÛaT‰ßñª.±Y’%¹Ë4 ™‹+ÀÛ¨1áÁ2:ð¼~пÆÏ°„êkL÷¡û ZŒ‚Rk:ƒú˜Jw*üBnt¤Y$ D}žU=7J²ÁÏâËèßEtÄ+è[%TãéÉcB ÄÓ>Ø*ƒ8®†­Ân£_†tC<¥`¦®ÁÓtàé6ù×Äïš +ËFŸ‚xcÄ ZEKÙð|Ø¡cu²-:D¹>¡¢ ½jPš[رÅ=F:êÍŠÎ\¥tÛD·Øá‘ÅÃûêèèÒ©…k ŸyjÚUël&zëaot“ÁsÀ@ ñnTî@‰d#M‚*š=ëížÎ¯mKXcBã·˜ ÄF>ˆßÆDläÄÀ(s†4I&“—‰” ¸KŒaÀ\U:ò±bÑ!pØ ÿ*/»Í*ÌZ +{Ÿd³•ˆñšÂ¼Me¾Í=³t£€„’brûŒÌäJ„EÈfèvà' ÄŽr™òJŽ4¨H^ó$ƒ*ÅΧËX®4 w&sOãñ%‹è† %AmHáZÑr,|ÎÐßJpsZ‰UZv«ß¬Æº¯¥¶k´ªžt-ú?½3ŽRã´ãS C1Ð]ö+¯CêˆÖ€èGMØé×Ð(¹×R§Ò¢.JõX*Vô †×ß(_ûpįTÅߨ‹pµƒV[Tá6¬/¯YkÄμRci.–f8HÂ?Óªl| ‚I˜+üUb”Vcæâ]gŸ@e‰Y±ÌÎc¶l îQËýZ8Æcî jšˆ3‚êc±Ôü»V2l{`lSåý„B-¶»h6K ¯³–bâ_`IKôTj)FOvÔXð¨Cõ?)´¶˜:naß?OŽG‘ɱ*P;¦F¦‰{âðÅ:…&Ž‘áD“C™NkP†¬]ø¿± ø3wfÂãª}Œ¹pMS‡›ábNtì7¾© iK: üóߊQlk")ó[üŠ ÿ‡qÛ1cúïâÝè¡uŸÓÀ4PÀbxzBSà ûÓ‡ ˜: k"Jÿ.ýÏ'µ¿dP­8¨J¦,´Û^üEã»Ëöö¯Zï(IH“PbøQš…öñ,¾›\ö °½³Þ·º×XÚk¶~mÒÐ1“™f dÄÒ!2èYKÐ?ñįK9®µkuà!Xz­cXéÓ%y•E°–.kÝèoØá`g½Råí;zÈ–ºµŠ4V³Ú¯õ>Óte"¶t\êô†ôrÖë´Þ¼ÏÏB£êGÞz”uu`«wêUZ VñGVÃ1Æ¢k⹕f9°Û`É8(A Ë0ÁèT]ÛU1œ3žmZ¶Š‚Ê4"¼ Ê"ß³PùøYÁ«´"J>6C#%øÇŽ]g†?ˆÔ0Š¤ÿ RÁ‘Xëº +Ëñžc+±‰XRš:ªÞ+1ZiL掑í`tÄa{ôüÜõzs4ÿíù$YÍt©úï#¨ïqdN†ú‹íbÇ +Ïhª@íóZïllr§Ù­¡é†; TÍ¡Û®—¾±¯s#ö^zêÈÍQÓÎ÷oÿöV†ˆ˜äðÝ‹À>[÷À,ýüÖÅ{ê,X:àêðW¹ÊT^f°¾ ‡óÿKqáO‚…o×^t½Â/^ó¨Z%ôÀ!~¹…E¨NdË€´I¡{X©Ö<0±6Ó”èVâoŸGg³ý9üpÁûö_Š#ÿ5;¬*sBEûówøß CûÁòƒøä'ñ]0±TøÍ«ôqôµ¦þÅTÛü_Pÿ‡µ–£~ï¨-Ç°m¼»,*ŽéÞ‘q]ƒ.B Z«Y&|vÅÅST”úºj[†­˜øºŒ@Õ¥†Ê~À\PØ ÐcÍ¡j‘ +„À¶€Áö]z‘òÖ‹£ú©ýÕ2Óú©ýD I„)–}Ž/îœd«Ø‚®ø:¾˜…ñ_¨0jêO=zêÿT£ÿ°õ~ñ`Û[Ͻ•"ýw{A?§ßï’üã&ÂØ%ü-ÞÏ/Ï0‘iàëxtó©tMIÑÀPp\¼'„ÙðšÝŸÌb™ÙUìÿþû·ØA©û6Þæbµwêõ>]›iuÒ¥öpÃKPfÖXP«üM,y +Ðèw„ÎÅÇME<ß Vë´>C}}¶€Cë¹Û›cl‚.ý|möÚøÝõZã¿^Žš79 F®8ý_“¬ùN«;{-U[¿þ­ÿ6ÑúO¢ï? + ÿ@ÕeÜ9„Áã¸3VdõFrç05|NLqf\®7«œ93fü‹×é…NÛ¥Z L_°UK·á¬òÇæÿ^Nìf·Rï„ÝïzÇgûÙz¿Îk«ó;袠ÌkÐ-'[Ä ‡f¿‘kµk쮾/=:­^©ç=¢uý†e` j«QûÝÖ ï½t8MjÔOB´8é;f3e“Ro·à¯Ó°J[i9Šiº*f·@åÑ´l3ý‚ik”)öĆ™¸*ê‡S'U9EÒWäàcNŒåבÈæa8 GÅi¸š®€î +{ Ù&æb£#P“®[ºhN)L5Kƒ2Ãqs¾+ŽHÔ^;¬ÃbIdÓ44˜†¦à44EHOIWmÌG„gÒ*Ó¶ßUÊò㘡`l%Êl 0– 3É®Y6_-@Ö:*b*¥"€ú€¶ +³2u¼CÙv1¢±®kðÿ.¥R¢È0ú ®Væ¤â­1 Ã_­íðY¨ÀITœ¢ ÁÓ´€>m SÌHfÓNÆnh[5"vy«Œqá¨:®]µ4A²[Ò·®O­?–—äÖ€™Ã7ðßÞT‚,²¦ƒ´<”^aF&°¥,M¨!´Ò&&¨Ò\€ªD̸Š†Ùz5â%ì­š)S…>¢$LÀƒórýié˜ÉÉVpdÕ"<4Mº² ‘‡JÀÒS  b qhJ‡Oft6ºš•„˜–HÐÃœóƒÓrÄ´LGµMEÅÔê&0+bAª\×QMÓà×V5L9 …6á د¦¦†Ý§¥2ý˜#˜]çdûs¢5U6GW1¶Õ44•5 dÌ4…©5U¬ r@Çät +¦*‡]wQN¨„W¦ ªb†(ŒJ"‘ge‰Y³¶mÊ 31h+UTÏØ`rľ¡Ø=à0fâÈÀ“` à›ä™Âu†‹¡øåT2Œÿƒ“2ŤtË´íŠî¸ð‘X­’ð80:‹áƒI£†ªÆ#RZ¨l…@ÃÔ\æaˆih@Ï:`‘ \ó|*˜E¢k®¢3™ì‚I\ +6„Q’Véz…’NTFïÁièŠÏÑ—Ì^ÁÄ\ŒqÀ§ EÁ6á.ÎÕ@Žd«ª\È&ep;pâs:œ†&¦LÔRtÀ “eŽŒmo2àb‰ašCrØ,Ü|u#KÂ’z#³ÀÌn0k`3”;¹*JÅ F%ºjÅèTU˜zà0˜a%í‰)DF¶S{yíBCaš@U‡­1H6‚öä"˜u$¥lÍZ53·q·l(ék”ÝHT¸BT±$‚KÁ,ñ”ä†þî­ùð‚ñ½Š‚êø‰>A´¹@ç®ISÕñ7$wÍ$H(Šr̆ɃîEÜrZú€ðW#xÌ tŠ‰©@ÐÀ’ ƒpQqa]À&$$Ý!ˆ©J0 AD:ÇÐÓ}L±uú a‘Á¸˜dÙ%Zr`8ƒÆÕt /`º–é’ÀGÇ‚¹F¸Nˆ :—Ü ?#sk@„Õ!8A•æ CÔQ¥(¸ C¤évC#¥S71s·¦•Êy/Ì$˜ "3ßB}˜D·øTp ½9:û¢ÉÕ]”Ø M`œ€ýfè0`†Ê €P·U†½ +êŸÀÊWIÙLCÑ~1;¯Ìnµ‘bÀ2¯ã¬oŸ +3ô{² ìƒ)›ûáÀ*CÝŸWBAÿx0‹Ðe°È9Û€‰M“ø#)]T…ýÄ’ßa7ÿÆê´*^· ¬ôJÍ—:˜¿ÉKÏ`c[Z¿¢ƒ´Qk–z^5vÔJXx?ÆJ·nì.ùk­÷sS”ûïnQ+—[Mø°åuÊ^§4M½ÇF½ +ø|«ÒoxÍ^¾Ô+aªCñ²†œCøýú`ÿ°Uõ†þ¸KþÖ¨7áçT©×ëÔÊýžH¸”逶þ·tñ'ô/Õª¼ÖêÕŽ×duDô4ñ+þéùÙ“3Íîã/¥NwE +æ-Wý¥TXÞQÏÜX5>“nèÛ¿:ÍVÓû`ê­Ê›Wý dDÍÅ»®r­Y…‰ªŸX Ç™×;¤E|¼>¹öŸ´ýÿ!$Ô±øÔúk˜=ô3ˆÿá®þ›}ù—O“:VýÁË«ô»½VãÇr²¿—»%<;@™$öYtüËéâ ³Tüc¦òß@¥Ýç_ÿÁÒø“A•Éù.§ÀM[&¦ësl°Vü€¶#·úSÛü£ypJÓ5íZº†wtСýÁ²¾}fYß~ô²4Û¢$òšê؆ëZ­êÕC‡Íg–&jþèõiiM× ¾>û£õýZ«R0ç—Ç+þØÕù—ËF-§ÜêÒ°ï=÷Ž:5°-?³²Á6ÿ8ãY«ß©xYt8ü)Lò_m¾)C~•!Ö+u^¼h è`èîä?³õƒm~°â{|¸¥ÅV§QÅsä%?×êÞØÊ¡ÅʵÿõƼò'¨5{^§^ª|Î’—kÿXøpaôZ¡]‚î*Ÿ¹áúÿðÅ=Ó ±ÏíYP÷¾¨fëo¯çZu|ôòñÂÂõ0Gš*Ò?ŸàFïZd#²Ä,o?f¼›J?z6­v¯Ö¨ýNWêþ)s›úGO¡áõJÕR¯ôŸÎÃýç1Uå§%Ÿ¡9©2g\Ì8ÈÖ=¯Š +ðeÐs”Ë辩Ô.U9Ï!m*­z' KõZ7RÔ z!5¾Ûnñ¹èŠÐïªíZÚŸqf'–é÷Z±ÓRx=Â(õ™ÙQÕ˜XU¬ÖmÕK=/VÆ;¿HÁØ–iê渪“Që\òÌ©Q ­|†/ð‡ ¸,9àd 7z©4/y­Æ躗5ïW ;H½R³ÂûvTW9†ññt{%Ÿ×+ˆ´^Ñ1ü9€§…WÊGW”y49aÅ5áĨ~ ñ¤Ž?`Ðà\ioÖº¯°‘Ÿ`"’>½Ó¬z¿knï;Y J“g,UÖvMèCW­úðÁ†ª„Ìh?= ¿‡I|víg^¥Õ¬JÃÚî÷,Œ)yå¶ú¹-cðàŽ}zþÂÂЄ¤üY¿ ˆ\l5{ÝS$4£Gi¹mÁwZÂ,àú ÝùþÌæ0Šî®0ÂИâ©_ØmQ07I:jš¤ïJ ¯·ü,ôˆÚw¤LŒ1“ôÐ4ÿÅ#Rü.òW7”vìÈ÷À A.µ}~°¯Øh0·ˆz¥z”6Ùi<(µÏO/‡VoVêýªº$²¼nÔ29%°!zµÊg&ÄíÞ7ÜþnTõlrž¿Âc_ÙTÆ-b«…¡…ê^è¸ã „¶Õ0 3dôY>ÈúhcU7ÔÝ`ƇéIÎÅfh¢íŠÝ) +7í5ã;ÛÃfÿA3>”óCipŠ&W}>×  í+,ß=”.yñÆ2|£ÛVúU¢‘#êçùA+óµ²y+å»Z©a—ïGdà«ß5ò‡e EÃHü£Fy¿¯•ŧÑ´|¿ ˆîá EÖ{…NüS¶FX?F©;`É]ÇÖ¹ª5«­_»Cy¿\Tþß"K“~y@"£q™»>8®i·ÚßbÙRå ýÓÍA[ë\t=Æ„c <·êUC#YÃRù¬‡®“Ýœ¼ +˜oOpfô¡ô€©äÎÎ"}…ª ß§è ©I°l>c–µ~„Ä“j“ç+6æ@-Ó„°eÛ¶¦š3l­Rð²ýj²É5¶Ì`BCKê’Z%Èhä•°S0–Ù ¼ÑÝAQŽÏ¸Ý¸ÄßeGi‹¬2Ù9®'žÊz¢\—F]u„-ÙÏÔÁ8›Y>j¶å:Vk’‹NopÅÔ¹¸à ºq3èÆõϦVzÄ]³g²'{vC«} Öx 0“ÆÓ·Á9+#gsîû“•Që:æræ½DÐKH¯}€±ðøW´ÆcnòV +ø“"÷DÜ+KÁUƒ¥J«Ž¯÷ ÓÂ#×Ãùç‹Cس:¦:‹È·~m²{ÿ{5ŸYøŸÃZ6"™ˆ\nšÖ «­am`dô(ZÈ<²wŽ;ç—ŠÆ®‘ øéùk¿Qn–jÂôøh’c=؈Ù;/· Z½×ÁãÊ¥6bĸs­æ/ìðæ¸ZÅ7=ÌÎ6ó¨;­ ó¯­Îº 8áŽÇL12nô-ÀÏO6Ì{ݾí áö¸5J äõ}r8æDÄ j5ɤKkæ8ðà[SÜ„+ÉÖ4Ìq;wÐj¶Š"iœ)·~¿<Õß¡ÄøOÃí>åKýœKw U¡›ƒ8r°KãH„câQÇ.ÌŠ¢«¸Ïyxþ†ìTA›©=ׄêù}tt*O´øñ²0EÌO,ŠiÆ8Zy…¹zÃ÷i,cbÞ¾L¥Ó*—zû¥o–òûásÞjf‘¢ˆ®ò»vÏÔ›=~‚ù9–Ã+“Iå«Ÿ@É¡7FÁø£ðñÒ• ¯ß·Ì)þ9}a¶J‡6Q6õ©œqã;’A~…>9,m?Ø[ͪ4bylÿ¶ÚØ^ ’c­ +ÕþX…¦Ýþ b°Æl©Óý”‘Û;㪲5ÕšoŸÐÀ`k¯¼2nsÊ<Ne,Ö{õbU¦íƺ¬þõÕkƺÌ/5åP¸1¤¸X©‹Å,N. à_oK“•Û£ÎÃ}kõcm0ub€[²pè‡fݽ`€ßZh Å æ7mÂZc½vQñb52´J±zé^¥ƒm 7 âm·_yÅéí4A!©½4ƒnØhM@‘>Ì®õ _ëÆúÍ7 Ý™þ´rTéÔÚ!çóÈ÷i‰ÃÈ(ÿãmåŽ"m|v2ù¸¶/ƪÂÀñwšÏ­k +eíD Ę„ †2¹R››×¼¨Ca Ãs ¥5¥†1¶ïáP#$›,§VbI¨ÉT¸œoNŽ?´b÷3éÔŠ›¶Ùš0k3g¹ÇÌ{ˆÃø£±q4s»°zµ6»Rº^ÜÕgŽRÙÍÎVãuù¥ß-Æ“³¹Z)ݶ.¶ ÖÔòæÅÖú±±¼7{°ÙéWìbA;pªaL)J7ÿ5ÿ²¨Lo®<¤ç7WÛÝÍ4‘Ø\ÙwD¥Ý^öeûdsÕðÎrµµõJ>ž}j¿zãÙùbbÙþ²Õ˽Ï_R‹™Fk¿›Ù9ë½.¬[SýbÞ˜¾Ê~­Ï^M$òÏÊnyhgÓ¶ûl_žÜÞeÎséËуÊõ–ï7Wߊ÷›ËÝtc!¿˜è“[Õ牫ø»—¾¿²³õÍúõòsöµ—{µ¿¨!p<Íä+êþûæêÆìë¦ÜÍ=¼<´àÓÌ{~§ºϦœ¯Ó™³ÔT“ÍáºTíO$ܯɅJ¡bž$s¯ÆãÊj&¡Ï,dŸ6s³Ŝן_¿Üz]©TJoø©¶PxÞe#«ÊRÉîÔ¦Ÿ–k»Õl=±1›ê,Üõ3ûg3ï8ÿ¹Í•ÝW}"a­\Þofš•ÙÆÂÚÁʒݸ[«ÙöR÷YÏt*;êÂÛ²ê÷XÉïv/lö¬g_éJu¹–[*ÁþªkÉÔ¢—­ÛÇ ¶‚›ýÄfnguꪰèš]Ø—[kjÝεV/«·ËZyꞺ]o&`AëÖünÉ­ue4NëÙ·9+ÅQ󲺯¨÷Sù¥ÒêL1¾ð¥ƒ£XøÃõBU&JyrÇ Ï ëÅUþiõª°Çªç O¬3íFÛÔ½VÖ× ‹Z~ãe÷sµ¶ºRýzø@;éOú;Êš|¨”Ýõ'pL@M®b%Ï 23žÍ?¨AlÖëk%sžÿº^Ú{/”J³ÓY«|q²º\Ïœ¿Vz™ãéÊAæ\Óa÷3öýÍ´©~)\?mô}1¬ ¡éÃ[ЙSOw¶Å†Ý´òÏg…*Áº-Í-¬O­\±ž'…Guá2k\ï7;× cùàjƒvÈ1k 6o~q!Ûr¢  /\†»€ÛXìj"±²°ÖOóu5«ìšËðgK©±~Ö­rkså¼7™9ßíõAÙI îbã¯;q,;>öž®e¢pꟺ^19Ӟ˽Z§_ +eeu>ïu:‹Šw¼¶âO„ÃÆþVæqW%l[M=‘R÷Òù¯v‰Ñ>ÛPçì½±—9zÈsÏ»Ž¢î•«Å\µqCÌsÈleëÖÚUзÕÛ_û’Ý>ŸZ‹Ìa"³ðŽò[o †:YE£+ÏËW­ÁÙFëUàÓbo«=YvÝ…ã0‘•në9WëÖ,ä–©Ûcmnjg;XÕŠ·<ÓJ>Cô:XXÛý²+}¹>¦Ã¯‰ýù­Þcµ‘9{ÚÍ/ÕÖ’EÖÁó축9?h½l^žï”Šçäz"±º î|p´ ‹­C­8c-_Þ÷ÝBåí}F @R/1ÆÙ»9kN$$.~Ü<·gŽrûïçjHdÌÏäŸ3³!pZ,>ÎÅ_iÀs›”YŽüÊw I©õ<Ñ­Vañ¼²P<¹¾ž^X_³tú5s¶¸ÙÌÕj'U\Z«œç÷ö¶SÅÕ‚9G¿âZ^曬úùÁf"[ßUÒ¸W·}ÚÎFmÞؼôÛüÒ¼Pö’ü©f•=µšaŸvoÖ\øt½e¥M¹L}É· Úðš%Þp/ù’ ¿Â§9÷˜ÚˆÖb*c’í"ÔÛ8…O_ó¬ +VÆQÔvAžV’û¡QùhÒäý»oÕ<Ÿ ›Nz¡Qh*´Lê¿ÎeÏXïŒVE£`ë(ˆø”Ý_%Øà(ÔcòvCj½Û;Z…Jðç6#ƒ’U~ØP\=‘@ÀàùeöPôòñ×Ú¨1[ûÙZ‹¿Z|K &Ê«ß® 8…ÀÁê_¾æàÈ¡9ÐZü½ ¯å3[B+`ŸÄªø¯òWeb|„_âûòªTÄYe$°¼ Òš±òP nHkn&Y&kÃÇó»ÏFnK˽] ŠýÁ ´/>8Ø(á]e°ÃÙÃH…Û!ÈHÊÖB;H¿¨?‡/òëuÂdXoão|І‘áKî¡!á4Q¥4=g‰O´ \[)Ðô^«} ü«Îåž›ifNŸ_ö@­ÜkGFæür¯YÜTÕ·‰ÄVbëÔ3iIºIÿ$±Z|ìÏo®(Çñ…Âåõ¶e©iI´‚¨•$×›HaÀÔÁ ’i¦º`°ìe­YPýænGZSöÊ—ýbF›Þ%; ¼ 2&NkW± ©Åg#¿·ñnÈ£d½Ìióì"sÖÛiö—’á_ëÅM7ÑFÅé\`|±vnÏß3G¹ì1ê0\»j„(jaá•Jʆ½R¹8ÍØw»§ùÝÎüÓ°2æöýNfïêôd>³‹ÄÛV÷ÈëpÕoßʂؾKû¶Cz¼í0Þr@íBØØ™m_Ü{{ùç“îÙRíøP²ðžcú¶®MÞŽ7†FšB Ù +0—Æ,ìëÌQ1ÿõê1Wûj-­<7/ ßΫ“õ'Û>­¶pr©@?âjìYý>è +0™wößdYXó¾?`=ÿ’šÛ`œèëO ¨Íæ^nrKµõµe¾Wa8…l‘7@ût10„ÃÈ{p¼Mà‡Aõ)tì3œçÈ)Md”Q1³Îð< €ãí:XþÖþ¥‰ºoÞ^T](>=®»ù­ûÌñ‚¦h[ÆA´Û“øÜ]ÄHa8VÃ>äŸ/¶¯\ÌksÕ£@²TÕÅdÎeŒëauæm]ÙŇûù©b¡ÙÒnÃỿº8½tëØ•ýÝìÉñ&¬å¦qÈ üþM"srxvYÌÏUŲ·fû­_>Vö÷ÊíÀFŽú´/o°/¹×»øòÂúÖã£À¬û4ì`z/ûv°ªýñs@³ËèiyȾikñàß ,WuT=Dh ¼`ñ ûÏ¥[n;}²°qYzœÛ›+{7“`>¾ÆÃ}eζª_a_Ö:ÚæEÜ¥= XKö5Qî™~>¶ñÚíÓ&»'ÀTa”‡tqÞ-<¶ÕòæÊÅlZr’if}rå¹ü5s~Qº–ëJñnS‡Ùl§|îu`L$Üz±õ< +cT¿æ¹ ^¹³OR¯.{ÇÓ¯¢Y™™|ÙðÎ>¤^i"H½/€ÉŹãúJ1o~ÑÖoîç{ü„•/u»/Qovÿñ•à û²níöóéÓjjsùðë›/¢Î­Éb3Ç]ƒ€|©ö{«–_º^Ùðœõ–^½‡'„g—On+¿Æ9èÕš‰b^Ë6ŽÖAŠ…C#{Ô׿¨O»……yëY’XÞ!*YÓSïÎæòÕ{måy»ü²¹|]”»b›Ùîny"A{uñÆÚ¦¾%ÙÍk*I°Ó{Ø¿/+y¯}´Oê„5µoLa™–ß;?˜ †·/ëûç è6¦ Jó>ÿ|žžH[ýŒ¹™¹-TŽësu‰{&_oÀPÝI»»tx™9ßßD2tSƒ“_MnvRn?s|ºt¿\{pžaǯæa_$õ†‰£µ%À˜ýyPPî.Š+¯KÑAµõ÷lòK|ó}£â?à^õ3N¹ý’V·/yl1ècçÓï©b²åÎE~RËû;ZÐ…/_qʇ©l½¡<¾¼}±Ö—n6WÚ®:¸4^÷jÚÎIk~d%ª²\­–ß«|Iå÷Ël1çYo™ó|IÍÖ)GÑßk›ËG'uÚ0‰Ã `O¬U®ohò™ÓóÍ÷AܘêæjkÝÍåb¢dmX×[¹ÃÜ冯Z\¾Ø«µÊm~§rzœ5®´ÞÀÆ?LÅAx('Åäîƾ»}Wìq%˜obmÏZÙ›Î<ç_¦î {¹Î:T›º"­;{öZˆt·«sÓ‰GÄîÕByéK;¬y³™9ç3ÓgÅÇ©™3XßÂ]áák¯B>ÈAxnõ +åì|r"±|° ßfÎÏgâ!dÙØñ»Ýç^*ŽûŒ ‹¯w#d{ª˜Ë܃Š¸¹s |,¿xnú>C6[÷-S8ÏØîé‹k&Â7èbYuâ‡Å¹›ã^fïF­Jƒ®íVóÕ†»(ŸYÀÌ’ÀåÞ^þ˘pëéÕ”(Õ?½` wá°õ5ÿìîÖóåùZÂÝê¬3õæ$¹C#ø»Gyˇ¹¥»üÞÞêSÕ´“³T± >'‹Ë™ÓI±¡WIàüçKÖZ1³žµm3¿Sª'øOýx`sŠ¼4ß̷ۙ Ðêbÿø¦¸©ôaÏ›åb|~QöÛ¸PŽþd¸áHÝêóÉ9f\Úçöƒ8»ÚL„Oß8VŠÉFÆ}½;œ*æΊ‰¶ÌåÊ{ÙÔ³_Œ€¹Ÿ‹Îð2öÙT.ÿmo®¦ÒsCGÁJ3[è,¾ƒJ}ƦÞ2F2{QHvË÷ÈHÔ(°”îâÚ ÜÔÍÈQÎö³ÚÜóùÐ.ÔÙÝ*šÌ{™ÖëѼl9£TB{añE|ßù~K§¸WZ¾t¶u·•Øºw_ÞúRåÞ~ñvsšT:£D=ÙÚ<ȧ^W%¬]·[Åù¹E Ô #¦ÄfW<·rÉà¬Ý y¥² bC+®,NüŽÉb»]}.&÷¶\y“ WOî¦ð‡zæ¬Ü~fÖ¢fM¾d“ÎWISÚÜn¿ ª ä r¥¯–ì•“£ãÌYÿB(f'¿Ó¨uAle0úU|:H¸£5€£åÕS€ØAujøv Âq[K•B¹µú ÞùÌÕ}¡ô´3™m,ÌHZà˜¤}l^ÃNפsûHgÝ ¬Êó#lâöü;¨Ü;‡B"ûüÚ™½.ÎôÛ^ÖègÁÒK[²É©J#éMêÙ¯_7ó;Õ“^~7™,â1è;7ÊÔK R +½™¸y·Úø òº?LƒåjlgªŠx·˜9™ Yi¨2;Þí÷”Û­Õ=𵀂R9_>|(÷‹OZqL÷ӿȨ´æe%ötÎàPÞnA8\'óÏ3í)«·×[+>ÖÓK¡Qj‹/°Ýy{ùaá σ¢û¢Ï5uPŒRƘm¹êÕÞRÆÙêöðÚ(t;¥ëÍîÜõd~o÷þ=ï­>LF:ÿ“"ú¹ ìãnÉZ.Í|¶5¶uÁ¸ÚÞ.>öîSÅÍYï<|g¡0# ƒcÍ›©WÆ[ÜÚúâœßÊ癫ü‹9S‹p/Ÿq žåKiƧø–h/&t™{½]}/fŽ7ÛËÝ~+ì´¬wÕ=ÍWr¥·ü|m©b¯ê¯ðåy§à»'©ÊPüYeS)ã¤Ò“è Ù"¶E;þbŸ?m/óý Kž€Æ1›Ê›™ŸçsÙ·•ÕWP"=¾ƒ;ëŸWƒ‹ŒòNO&³æ\q øXu9ÿ"qKþûù‡2‡ÝEæ´µÿd­¿Ï½É&3Â8;»º_X¼Ï‚½oiÀ9KÀÙ{Wˆ­¿ÏïæË×Þ)PÛúöÖÍcû‰x¤O># ïo÷®O§¬ÎÉö¨>À¢÷Þ³4%áÕN’=ħUë⸺”z±XL¨I°›ONó»ñgE^«ÜV­Ë÷ç ‰„bbß^ŽôíW+Î|yiæŸ[÷ ä:ê¿æ¬>ë wø|«Ÿn?dö¾Ì9Áîã€ÙB¥?ùàmë箾¸»R|\¼\Ž¬Åïç¼ÐŠˆíp?O¹—×â,žz;¡)û´­­Lë½»„·;Žò÷µ›)ù´:`Ë»¥Ëƒ`ý!3úô߃âìV¢¸ÝðÍ"0®¦ÓùÝ…)S¹Þ›.TÊ‹U¼Ep¥mðÒÆä nü#êk«!O÷½½¹òêgÎsö#XU°°—R¥L+ãƒÉ±^ôdfesåþ"k7wÎÕüý˽öþY}sItü⸠+ôW[…‡TÑBqfk¿\GJÇgÜKËÚ­½Xç©›/Z!žÊ.½6«¥i÷åªsÝÆ@NY5W‹ßν,ÌWÞóÊtªIâÝŒçæU° “ î_”·ÐsšPõÿ[oU-¶Û*ÇŽèf7–§°š¡wo±™š%~Ÿ#Êoò䎤`;ÁíVv;/ýµUn±jÑׂrƒW×ñŽu$äM»Ôñé>x–6ìzb­ùVïöÒ• tÞ +·Ó|‹a +µXQN ×֯۵ꫥ_¼ƒ~½Wk×=ñˆnð½¨j‹:®ýæÕ¡ÿgo`ÔÌŽ¦Œ«ø–ûî¾ÕÚåz©ù6ú&V£«Ô¥:u°kõJ/Ë`÷™‡ ØB~’ZškÇÃw_.ª3¾&¾'ôß´¦Rxk +Ðã4ÄH¼–+áÁ‡Ïÿø“Ça3íöêi~­¼ÍžË¹w\i·;i)[ĘJ-)ȘíjÃ*b½×pø‘½Éµ’°þZ QþËw€H:ãíƒH¹¦kŒš +½‰OwÆßÿ–ÁÕó¤;dY®>…©Ø-ó³/©M»Ú€ŸëßÕˆÍËŸ¾êŒ‡HÝŽ1ŠªtƒHŒ—¤¨¹ü-Î8²)ó¼ãFeôÕ-×zÒ˜ð•:ì=éìaHâq—ð®É˜;vlº'þ9öÄ}KI +aºö·vºÕîF«Gj”#¯Ôñ²›®«zÞ<djú¹^k¿¶:¿óñ´QõZ iï?Á“›ò›ô¡Öð£“#ÂJCª¼HŸ¥cW^9–kQŠÓ»äÙÕÑñÝ\ìíÙ€}”7qøP"4W¥ñmÌ©b«÷:N€À4½—Rºy%@wÈ âbÉuž›½tµÞî<·š½1´Ò~i¼¥½&†×ðp/{ÒCñ¡À€:ÝJ¥)‚× }GÃ5ð R€ø£ÆìVÚuñÆbRc6ÍX$†M?  ‘=?÷›•1CŒäÌÒÒNÿ"8ÜHFÉXjù£GRŒ;½ˆÇÖÑc†?¾dxZª{¢¯ëçã\õäÃù}ẽ-¨€ÁJÑÃ{ªöGSO0%öÄv|M £ùTèò8ç¿b˜ó±äŒÞÈFBåmÜ[/è¹Ó‰¾éúdj¾ ÔŠLŒ6ÆSFÀ4>O äzµÞ8ª j] w÷I²ƒQÔZFµ±üÅvÆíUé°P¥^M†™éx%‘ ¯kËþëÚOtê a¨È¤_ |B“üDåNÈ0&ÅËô˜ãì]+ˆo?J‚wûåîøq€6{­æx¥®2§|8‹‚ªÝ׸ãÞÑc%¯÷1i .ÇÔï(¹}bseþý‰í(ð¶>Üy¿ë‰÷áCÍîŒh(ÞºjAõ@Mœ!LI”|NãÞqÆãñBß=ÞÍ>ÆoÖ×õüÒѶ»R,%:kٳ烩}}å0ï\)ñcûtsùh³çÖŠw¿;G7ýWrÎýþûïñøÜS>ŸŸŒÇ“»“ ÇÜ/ýü£ÄµÍÎÉŽ +¦;øõ¤Túµ˜ó:ïøõ¿¦ +OëïIüP‚?®™Õ^ËúJkqaf–Ù~/æžï×~·¾Xí×Bù\™,®æû™´¾¿1¯g—RÇ™ó÷n¢XÈÎkëä}¡<½|K—ò{}ý@FÀÔѳ À_ÈLÅ_µüŽ~ å§o—•§Kõô÷ßgÚÓÍ/ic}AìÇDÿÒãæ]<óÍ›û +¥_§;š©I„óÂ#Bk(Þ…eÎî=@ñ[MÔ\ÆÝ9z„_vNƒÙÚ„-Ù“³ G¿;L«[Ù›/§™ÓêÆL¶°4eà|’é—÷‡…üúÛZa¦u=¿•½³ž²oËÕÅÍ÷›ZVB¥ ×#À3ìWZ~uæ ¯½ô‹«Å#ËÚ«à£Ýíå…ÂÁ¾Š—žì…Â~ñÐÒ§û•ß_zÛÝ‹/¬÷:¶ð#ï.ó§V/ÕÞDÂnÜ­§ñdÛ.|y.féqiïyÁ°·êEd6+;Ýí£BYYìgön¦ža'¿.dSîÉ-¾ÖÅ›!›u=[7åÐKY÷ÉcòdFÞoeÎúñ×…lA{Þʨ>Ú-‹³¦;=Ÿ=8Xn)ÛËß ‡OÍ©©ødñÉêö×x<eÎvrñøÆnç9É÷jnþ~2>wxýŸ_vç Çi_¡§Øä=~›*&[Žò»u•ª/lvç^ü)…¸Ÿ‰OÎÜ/ǧó‡ñim¡OØ@º3kG&àþì²²OnÔoãs…³V|~o%_8™ÌÆ/.ã©»Â×xºœš‹/½ÔÖâJãø$®vm/®Oõ¦ãzÿŠ›3«»qkqê!n«¸³y ÇÝ¢±_¾ˆ?ÄW*Ø¡øÚÌ•__ß=Šo\®½Ä7›êB<»<Ÿçn§ã…™Ît¼xü¾ßN´ïâ;Gí©ø^ªŸ‰ï—ñÃ…¹øñŒµ?)gjñ³#~¡\_Ä/û_'ã×­ÅBüËãÚ+Œrw}aÇNêwñ§ss1^¾<=‹W¯ÛÓñçêú~ü ùøÛŒ²o,ß¼Ç[Gé­ø{åê=Þ[Ô¶'ã;¥þäT;{09“š™L¾^_L.ä6”ÉT7ñ4©”V&uõ 1‘˜4¿.ïN:‡³ÉÉ•åæÝäúliur³só>™{==›,>ì“;÷;õÉý»í£É£ê1yZ?iN^ô.Ï'oèç.SŸœ|<‹?N–0òóÊŽ6Y»€SíûÉö±³£ôf/¬©É³ÎôÔŒ±ñ:5W+_M¥Î¬í)U¿q¦Ì}aÊi”ºS«O+ÏS›§_¿Låw¦¶Ï”âÔþÕÛÚÔñ݉1uþu-5u357;uï¶'§JǥΔ÷rÖ˜úªí}HL5Os¯SÝ™ÌËôäÑÆóôìbîezáaëuZYÙû:mÆ/ÓîÝãûôú^;>Ë«³ÓÛz&5}°peNŸ.vצ¯ÒË[ÓwK—ÇÓ¥å©Ûé烽×é·§nºÝÛJ'â+ýµ‰Dbæúp?±ÐŸ½K¨‡¥fÂêe«‡3뉬ò|–Øz=yMì­Í%Îìôfâf²wx¨¿½'ª_kVâëãÓq¢ý\iÌÄ«%cfö­z2“ži´g {refùX½Ù¬e’‰™-ëroæàú­9s>³¸6óåd«‘_˜OÏÜNÍ[÷ù÷ùmãm~[ŸöæOfZ¥ù›–÷0öÍÝü[íþv¾×z¼]˜›{¹_ÐœÖãÂÊödy!ÿ¤ÑM¥ 㪉äþDBUç–Ôµ³¹Wu§¤¨-[SËj®¥6·/µÄ{-£ik³ Úz«P×ör7Úõ|zKsËÖÞ÷§fõ¹üYS·Œ¹'=g>]èÇvvW¿w§7õ¯û/Ž1yu¤L$Œ¥^nÁX[µgŒÝ›…Iãz~ºgx7Ó]£«OwÍ…·ùžé^Ù“æV.—0/–ŽæÌJêE1ßçmk~>»a9êÓ¶UÌ.Yç§gV¹ž¬[ïîÍŒ=gX¶;W-‚<ÛzØ»¶/×µ7»ÚiÍÛÝ*Ê–ƒ£+gu{»íì岆óe}åЩím~u§Ž65Wóöþ{ßµLÎ,ú¼ƒ±I:H8Û8gó9'Àçßûf?û©R'µZûâ¬ufÖx »P(UV•´o®Ïu~̃ÆË’y×~7–æ +¯ç Íé4Ȭ•ÖÂy÷ågáõx¹žÊ,În|/*µVs±^Ïöë×íŧӭìâà^8]r3êÒjííuiÿåqséÞ¸Ê/ýþ»¸[.­œ×–«…§üòîýËãòmgv{ùgK•«ó­í^u¹þp]ÝÝ.lVo/v`õ«?¯?s+¥Rí}¥ºÛ»^Ùûiï¯Ü7çë+½Ÿ{sµ²×ª¬®érvõ(—I¯>}¾ÿ¬¥o®ß×äûË×µÆÓùóÚéó鿵·ìýËzvéýmÝ<øû\ßþzë7ë­™õŸÞc1•©•w rmMjWkGƒÁVíßC«SŸ=û{ªë{»ýúÖ^¹\¿>}Y«ÿÜí5*sÕ×ƺQÈ7N®Òk×Âçy3{úÖo.V^Ìæn÷ý¤ù°7è·Ò ùå–Z2nZ›ù]è¥uyÜiýó½ ÁÜ®mÔ÷{ïg/êÆgáãysþx»º¹–Ï¿mž\>Ö6ßÌVo+ÿ'ínU»3Å­£ã—ë­—N·ºÛ»ìo/_Üt¶Á;1A^¾Ú9£wÞ^¾•ÖS™öQv­Ð~é\¾íäÅtg§úº^Û9>y•vÞÖÓ»EýùewMk\3»»ŸKWõ½òNsq¯~#H{—Óó{¿÷ì¾ôr?³¿¹rõ·;¸¤¯ÿýÍïéƒ=3—Ieþµüa®²/®ÈoúaǨ¬~îžlUºs'G­ÊáÃÑÍ^þç8=}U<6ŽW–Ž÷r{Çσ'…ÇÎÌÉúåöÂÉÅÑêÁIïxñ½£Þ,‹—êNçß\ãí4¿~¤¤2§kÏÿNN/ŒÌôiï_µq¦m\¿ís‹gÏï;çÅ»Yý¼~}òp~})éû× /í•‹ãù…ï‹ÏF¾})þë.·åç›Ë§›‡êU~ù1}U˼^\]=üT¯Ó×å¹Tæzqwááúäà¨}ý}ü¡ß(÷ÚÌÍ^úâßÍ«^8¹-Ÿœ4n7s¢~ûxöR¼Ë+›wµ/ñýîærðx?»ùpu¿²Ú9½¿XÝ?ºÿÛÜ?xX<Üßè;—ù®²%¨Ýýå‹õîGmñðŸ¼ñûøoïôìïßû¿UùY–äÍç½£¹Ûgp9Ó/òÁ×âË~å³óòñÞë½*WùÅ׃“…ËׯÝ6XŸoÚþãæÛÑUñóíçysùÝœûxzïÔ×ô÷þÛÏýÇRãÀø8ÿ»ŸÓgŸÕÏÕ¥£ÏÏ©¹õ•Í™Ù¯FV¼úz¬Ëßózyð½µ!Ÿ~¿i³úa~—שÐ<>­{ºÐÝj3™ý£µµ°Nï„ÖÌÅ ¿ÓVi5»ùP>ãu +ërõv¯ÙÝîg³ÌªÊ‹ƒ'Ò)äCÿªç½kik;Í×´|©,ïԊЩòÊHéf©Ú©ú±7=ëô¾w3—éð:Meà·ÍGí+«É¤[¶ÓþÚµÖé†ò}yþÍïti:×Ïês=Ò)) »íý݉™|nåòš×iqiñ0l¦ÚÌÌïß…Îë%Œr~)4·—ö¹žn~še·~ÀëTh~¿n…v:·³×m‘NÁýa窜w…ÖÁÌUwO…Ì{¥sê?L§ýlëÖAïy)çu +®v«þ¾Zsm\½7}^T…ö¦)c§…ÀL7Þue}Eáu*´?ÿuI§(-}Ý’NÆÍCX§7ÂÞÇÞ¿ÓíìÅv¹üÝc:…^H·G;²Î›+é´ÝR¶•N/áxó(Òéßà¨Ýº÷‡;׎0x íô¸»[y ëtSèÜd«L§Ð‹ÕmÛÌvréÝn§§¥Î\h§§k¹Å™°N_…‹ùeüü¹învßÒ…·Óë‡éÐNß>²[L§Ø‹ÕíÕŠps³¦ð;Ý+Nÿ@¼s;½“Ïr¡NŸß*D#s溔N÷zÍýwì´`š=iµ8m,=B§ ¿¬Lú¿:v§ïftjë}Òíï­þÙ#‚¶Ïmøœß/.|Øé|S+™½×CètµÏδ±û#WZÝVŠŒ(̳·ÓH׃…-¿x8“&vZ +ÂL:ÛÍéçÐiót +ZÌ…Ë•Ò©Õ銸]b:>Þ:¶Äƒ¼rÒnÓJƒ¯´TyÞ40“õ´åÏT^—ò°ŒÓ è+‡>Ù×›–²Ëû%ËöB?‡šiuFÎBÛ[ŸD´¢ŸsNÛc•ã+ ^ðÙª$¯K¼NA¢/ˆ¡?'¤Sm&•AOçÚëÖ×éùUh§`ÚþÈᢟã£d·èé<;¶>èN—ÒyºSåh–Fï¾*Q>ÍÍÍx‚gö¿Û­ìëT}Aëÿƒß©’¿ïtºy_öÙcþn‰õÒ)øƒ`ýß…tz~Ú)Ìeº5«…ΕXÿ!‚i6Å}X§‡^§–ÕçCðîv'¼S´)ü¤4‹oçÝO%Û\*,WØÕ”kB‚…»ÂÂZ4œ--‰±åÉ ")Öo‚‘«,ÁŽ–©š­³š”]6-2ðªÎ7H| þgý©• +5×]?ÀM¢|vèq UÍ׿û»ÖàSã Ò3#˜ û“}ø:—!6ÿ_ÁéÀ2‚í¨ñìÏý8 G«tì „ž°¥f2ÞŸêOîéض˜I+tL Àa «¿/®G†¼^yéÖ3øgÆÅN™ƒ\ÖÅûÙ솋@É‹öà«Œýg~ç›7(ßšýÈ!͈ó'â<þ¹´m~;æblBúJ®±tûÏýYÝóª™ù~Áʳ‹Ûmo†üù៸õËNóÖWß·‚ÈŸ§´OÙ¯C­Ÿ!á­ Ð}ëv†AV81À\ºý÷Ó¸Æû·Ø¸î·xxOe†¥¬ÅrÎaðNaÌùÛÞd8GøW+;”<²ÑÓ¸ªü¢§á‰‡÷Ýù¹çó=Ýûˆ«¿_ž³Œ² îèMoR¿fGsû—Ù¾3ï⎻@¸ò¦!]ÿ­oó7—+­xgj¥iÞÔ\3µ•…ƒˆ©Y<”Ÿ#<ä Ä/-Ïç\‹šUk{Î^}±7®ê%fB´äOþÔ ëoM¾Aà‹¡£O‹½ƒhÅ”`} 0 þ槖 Žýi=µX9DVV»ö¾wPÝé0]¹êŽ&ÑР Õ•{‡®ˆQdý¢ ºX›Ÿ73#®ŸÇÊBV§41bèXñ^Ço¬=®ÔP “Ę89ŒI“Ę<ÆlµlÚ|Ðq}Þž²÷h¯$•Ä:–ÖÏž¸’ƒgІɱÁJ:±ÍçÊç ¿'>WVf‡t”É~,—ÆÖÏ™q°ƒ£™cF÷Ǣ±#tïoOº +‡¡s¹áäDñ9xh]Ä…3Æe³-a(Œm9Ò@(Nµ÷øb|ÃûéA‹£¢6Hè:© miSz‘“fd·¸’«÷€Å/kÔh¯ûσ¤´hÙ0Ü°`çm3Ô¹æ»Öƒ0„¹\÷Cu<ÏR¨pýý„l…µÌ!6Ìõ 77™ùÉ+ãk]ÆB: ü%V#³TbËo’M½çGgC‘ +ÿ²¿gCÄ3B|r ýVt<‹Ñ‘¥$ †TBd%bq>1ƒûöÅVÄ­>Ãâò¬ùóï¤ÅD—H„äsËÏâ#ÄäÙ…ÜlèhR™aœŠ-6$ËB²<Éÿ¹å·àG›š’ó¦æãÊ°o ¬ZŽ o¸saÈ]Üúó»”#MÈü• –¥‹Œûl‘ÍÝqŸT&1ÿr b Ññ´a;ž(ðEü¦t%hJÿl#Æhc:¶ƒSZ^9)ÎÄðKßð/X”mmº±q¾•òC³Ê]¾4èÏ: 6`æ\µÎÆq£,XÐɘts›b·KCö÷ãÅ,6&'3N¶-WWáŽOBfîØÖÅ$Úñ‡´‚­¤¶3d +/CÚIäRÇŽ†ŸxDíðF™älcòŠþü1V^ýµ!<Ú«æ{|(Ç*ãz|5#g1_rmŸM‘J® ï§FeO¿œN¾‡UãèÂᵶeß'ÕbÐÎö=ÝŠ£ #sá´ã·ïÃtaØ.͆§ ´a´.ôïñÝåKmx–4)Tz–Òm/BÒyX l3 Ômøvé‘ÑÈô2,bQƒNÂ-J·S™Ü ½$`ÈpÞ¦£ +ÐØ{x}±}Æ08ƒ±¡œËÛ^"›×ÍRãƜʡë!2óˆ_ ƒŠ0YãMMV-=ôµDzyèO&Ü‹.%7i[}LîZì’<ô#‚€Aæ²bJ¡Är>Ál[hl´Ýî¸VÄíöd"$ýDñdg%±—,D\ËJ¢ä[ÒXˆ‰ùBD ÖGüí +fH¡AòabÙËb\›-p!Ú:ß³ðUËéÿ.ÿéõ‹fç(•Y­ ÖÛÞÍòí85tÑtÌé #×ÐEWÐY;¼ã×ÐEWБúÊ ÔÐEWÐù«G¯¡‹® Ke&SC]A¨±†.º‚¤åDjè¢+è‚Õ‚£ÕÐEWÐù²ƨ¡‹® óï$ÚŸF¨¡‹Ý¯¿†ŽIHêk'¾°¶üïöÒv]xÖy©Å ɯÅbå ©]O4ãïúOHAu®?™dXN¤7O!¾mÕöþ¥s¢p‰ðtgÆâ)dO+ËüŠ>˜Z£IV„wôåß㇞âò°¬ùÅ׌DUÎ%ŸSª"WC /¹Ï¿3’é1‘«H~¦h.Ìlæ’k ÛÚÞd‹d†úÝ4ÑÊ©®Mš}^J'Ý›KÅ„ajç J‰b¦–Ê • Vì³ñŸJXì1NéÅb·±CUçó?‘6rÄ„o8D»!!¤)^~26} +Â0ãB21ŒEVÌ ‹±ˆ­á1ÆH´á&É~Õ_’Óë«žY?»ÎpäóÕ J•dó+†‡a[<ïÇ£#‘ ±ËÃTÉÅ«·°=‰ç àÊX>/$´#9{o›ÄŠŒ¬±òÛ‘á•>qv†GÉ1åG1åq~©0 ÝÓçrp}>œ=v=È°ìAÙcCqüfŽ÷ï¿„âiPÌŽƒ'¯r,•.¼3Ze\*3Ô †‹È¸CòEzíA ‘‰{¦ÊxJ‘ ñ’üyÖ|¯ø#2[CEdܧ¹5_Óã†->·(Ïb„òz Äí¹d±‹å9³ bvÄ©y~åçÖØ,Cã†;OikĈ S‘ŠehãFdHuž?"vÆ]bÔ¡ŠsR™°d—­èòœ¡Šsp. û¶uå$“M“ÄX[nfüšÄí¤™ TÎU˜×ò³=ö¹a®F^8È_†–²G"Š )tá (u!HŸtæ0®yâd਺º@Ò,׺ˆ­«6w=è%!b•Äæb nôD”œ0m=ÇÙG=Š?¯/Ù^YÒz¸˜óú&Tgí%±q“®‡žÆF©‡ãe¨b%ÛdëáÆÉPM^U‘:¹z8ôø&Q ]ç—–a[瞪‘°Tc´z¸ø ×Ã=ñØ”¾êáâ+ëmëÔçZ/6FN$c[bñÙ¤r"O<7zÞï|'µß£rzA G4'˜Vð&£1µ íDW`¥’·3F½ã¿`; ·òbÏ"%Åu>&dNÓ>ãùü'ȆðÌÏ„¼,‚dl8LNCè‰ÓX~4‰ÔdÒö2)6ìðR“‡µÆß#ºÑ¾:>Ðâóã³!¶Â0á(Þ«ÕÎ0…a•\ØθG]Vâã0ÉL{«±°m×°“("âÒYΑÀXâÕŽ1¥™3‡C+R¯~'R‘*NÇ¢’¼"UœfýÆ1*RÅi%©U‘z?ÝMPtm.œN¨"õtB©§ªH=HEê)ïhÊãKP¿æ_0æh_Â'É(PÍÁ°!çh¬Å:‰V`I³m'[ +gÍe#D‹Mªn„³ G(…sï¯ä66©R8·Œ÷ÞÇ,…ãú•/…ãE&_ +géJ¿i_ +—Ì0ôæÖVw"<ÚÄ1'ÂóNŽ¨ñ@5Þº@cºx«×ðÉØ0µ²žh/)$Æíþ˜3B ¦ªÑÏ#•ÞpʇDQ„?#b˜T{ñÎ8.9Û+`Ýö+õŸÓ¥¯ƒÛô|禑.­É7éÒ–ÙÀëÌkøé<=ÿòvŒVÓÅÇòVz¾~XÃ?x¥¦9ë.ç3`ûÓmošX}NqO_Ìôh®õU()Ó҂ɯ;[šž‹º.®\Š¨°+.IÏ!j33'?—aÅnvýéæ[T…Ý¿Ý£ÐNçÄ­ÛÇ°NŸüvl5ÖúÕ)Sì6óÒõ„"[VýýtgÊVØ)ùóÐNÁËávBÓvC:%÷ñ~J7aug‘v}%¼ÓÖü]Çë4x_7§¿„ÝÇWŽê´ íø¥RM‡Î5½z]:ö­j×tº'Ÿì…È×.ž>Cáï;7Ÿ_±-j3¿7³½X8õŦ;÷œ^,:ºZcLQg '<Ò°ù~K/å6p–šß‚åì]ÖãŽýêë°{¬ö³MzŒ£_úEìà!r®ÂK{ü&plÎÕ$n’ãY¿Ô^Ò„n’«rî‘5 +WOž"ƒ÷¢B].N^_ô½o»D.4yڵƗ .ÆÞ¨œ/?/k‹¾k ù*Ì>òÈHOJ™”_cïQád4»Ûi¶Õ7Áj:v„w;¨¦ãùŽg1¹j:^ÀËwçDªéx!gÎÉ“cVÓñ@ØÅñ«éxµtagÝŒ^M—7› ‰§lìÝ ‰«Ò†K­Š(+ÆU¥ AO‹óÑóKšÛƒ%n!)› æ竱‚A•‡G:H¾ŒæĶá.LŠ_xyZ®à:áçÆ2Âê|þ+pg +‰2O Æ|>ÏÖ¿Œƒm ÜŠ¾ûé¦1™}k«ºv:Ï3µÈ³lÆÇÎçƉk9w¤6®êI6wcoÔãG–)i™¬ +p¤Chýº3©#±)7K‹‡Iz%·{eð¬¸&“2ÍÝ­N$aî§Ïþ&ä#7'sÊ"‰ócÉ]xÖÜp€&ï(|úv¹A;ÿv[1˜@ðÔâºÀÄù“V·á·ô&:#‚J>f£•£’Ï£ü(Ôx£ÏQôbxÕ‰ƒ•­0¥–À÷Ê'ïcJ# gãë÷—r~ÅÔPÙ±ñD¥œ!…: ˆ­àný7U¢èPÃ鈴óèû»‡ÃX\-ÏP‹Ù¹f’¶D› ƺ¡2b•Þ± ·Cª“:³„_F®LZ˜èT°&ߨçÞnÍÈÄ/å›Èý•±—ò1çG *Âv¶F{6ÔØ÷úEßê7J®‰ ¯_ò³¡Æ¹×Ï›ÚΆ +½×/:*ÄÚÉ£Þë}«ßHgCqîõ‹—…ÕW{¯_ô­~I(9QÊbä­~ÜSšG¸×oÜJ®Id+Ú•\*D +»Õo¸û+Ãïõ"n9ƽ~þ5Ox;ÃÐ÷ú Ÿ¡:ʽ~¼rÄø\¸aïõ‹£äÉÜë­èR1[kIïõKP•6{ýœú-þ­~lœÔ{ý†§±Qîõã•#N¢æݯ_t+ñ÷ñ{•­sß$îõ‹.|ww¬Æ¼×/:Í +Íð÷úE{jÁ\ëÑîõãs´s«_|Ýk²{ý¢Qéí$Žw¯_tÂu*ঌv¯ß0Ui“ª{`oõ µ-‡¼×oÞO~¯_d™d‘ªH«èS<†¸o÷XuǼ×Ïk…·måzIcÞë}«ŸÅûãßë+He&s¯_±[·úEV q¯_ô~3WŽp¯ß0Y£ßëGgPoõý>¾a.׌ºo 6¤ZA&óô÷^¿ˆø—§_¢Mû÷ú w¢Î¨÷úE;Ô®„ó^?·~‹[`B{¯ICÒ¼{ý¢Í’o9{ý¢oõ›Ì}|qU¸Iïã/šåÝÇ7Þ½~N+ü*Ü¡r®8÷ú%+†çÆÆG¸×/ºÞº/iü{ýB4·}«_˜ö^¿è[ý¨÷±îõ‹vÛùë2ü½~Ñ·ú·ôc,Y&ä˜÷úñjžÂkG½×;$×ûŽ;m>é½~AþÕ/´VtÈ{ý8 K‰‚T&4»ŽFeì½~ѱŒ=6ò½~¼Z4/|Qâ^¿øêÚIÜë½¹@ŸÛ3ν~.roõ Ë·ö^¿(Š ¢£‘—¾ ®Á³çðªn‹qÝŒJZ2¡]Ú½Œ +íF$Þ[qKáb“É®Ñ1¬»Ì‡íÑdssˆ-Ál£ ï¡…øbûßF_kß6ŒRzî¯qº~š†gG?6Èm·Öë-KëÕ“ëó\:ó¥+éì‚ÐL¾ÒÒÂÑNqñca½X]îa>ÿÉöKVhìþÈBÓl¬ +Íëë ¡5ÿw(´õõK¡}yñ(ìúeáh1« +G·+ëÂÉÛÓÐÉ~½¶ø+t~¶f…Ó•‡ºp½÷¾-\ÊgÂíféK¸+f„»¥›<ÖWî–²½þÚµÖëÏmöþ—ý™Ÿõe¹müÙ•ÏßûU-›Þ9YÏHzî>ÛÝŸé\Wg¿z•æœ¤Üîféã­ÇRñ¸¹Ÿ­,uµ¢[˜Êd7ºW’Þž{ƒ%)6±ì­”î½^W2{¯;‡ÄÜç°=]]šý0ÓÅåÀwd»On,.-•@‹ñEОîvrÑ3-.>*ð[a¥*4O›Bkæ{¿×7NŸH%©[‘ªä‹Ë•¹rÚªIl4Þ*½þÕ÷">›a v‹K<ö©.ÿd¨È*Ù°£­mÓç¿ð0Q¸nþáݘgÖõ™ó;§gé\é~Kl·ðÏ"^©¹Ÿ.UænmU¼kó +/Ò4qpž´Ÿs²Ó»ƒUƒ¬ÖÚçw»¿¶}zzS¬Ïgþš¹ÍMð@?¯š·ùËmàés-ŽY”0àpßÍ”,Ï©ª^õñkÅ–ÄêFÖý„·3T› Âku6 +VÝ/hìyü:o­•Ëøµìþ°RltÎ6p4WòJçg½öz_…JUÉ5Òx;ï ­>sp¿ºØN÷ðU‘šÁ|»øè¾(Ñ/nô®ûÂëï4ÍóšÓßžè¡…XJ™¡ÒZ.xOÅBM\´Á[µyêÅýlmÙy±YÆâÈàÈʃ}ûƒ‡"ù*¯œ¤áëþj!•q›¸%*ž6 ¾ À>ÝuB6( ¤Øg¯ {=)¤ {ißI‹%b€Á׳ŠýÛ÷KÁùt#R«ÿ¦X»jçýI¦^ܤå[‹+ïv~3ö\Þ?5¢iäuC6»7ùµ­¹·þaÌ”Av´«Ò¬ y¬¨ƒ(*ƒ³²Ûé£M*ƒAl‰«9øt/:Ÿž$Å!Ìoð¦ØÖ8=uÐiòÕE½SšÞiÞídL¢ªå¹Û¾.lµŠ*¬Õµfóâ™0C~KP¹_s£pR{ÞÍN(7ó»9”Y› ä‚ô|~å˜#7g);yÎ’›Ö’-ŸçˆP¦YË–sDØÑ rÿ‹œçà9í+ˆ¬ŠºÛCš(-1¼ûÖ-™¼‘·Êœÿe±pfþœ—±í¬”]M_“…G‘9OÜv°²—6+¯gƒ²‡x_(r¬±Å)HÝÝfV_@/:H“ªžwôÚfêr‘zv?½ *±Z#4Cñ}ýcú«éIU2—m°ðôÎFíî}퉖㭅<ÒÆ.”eˆ['9Víy~»k)±õ¬ ÆvËÖ×ÙÕJ}ké[€VöKŽåi™Ý:‘ÈBÀŸâW¼ýGYŒpŠw› [ÚNˆj¶q£‚é{8À[­|§7 m"õK”5÷hlSö&y–äúnûþ[˜-ó¦Ð*+kŸÂSæ«Öãw6 ‰E¹T²|{byJ9ó\ö¬ ë|‚ÌúlÝiàqŽ¹·›X¯PMˆÍ³–è:Åë6Ûñ~ïÊkõ¤AL`$´*¡sçYç×yvÞCïuï«(Ï.-Ý‚%$çaÞžµuÒØvÖµÙ‹Ÿ‡B¥y›Æg–1rä(âÆ°›OЀí½ò›¨•KãMãd¡âpåh«F|!)M“uèƒ|ì&j™"·‰„¨´AqHÊ»Ý?û¥]¯ ùòC4è&~jBìhT¦2ì(J³›"i¢?ÝÚX/º‡Í.{ò/×ZÿÍÛpÍ7уË(»õ;æ ý1iÌÊÆÚJy<:¿YÆ¥±ìKn\¾òË^ºvqÞk€¢1?&è&ӸчCeÆ柗+㬆ØjO³ìjċ‰È&NrÅáÇ@k1±uSžk5ÀÀ,ñ”H*“˜¨Z? £¶sÓ7ÚµcMc£ÔBu!ÉT‰Æ†ÖÇô²±r(Åhä^µ"ºMl(ƒòÉ5†‡›LŒ 9 +ÏÅâxcøÁÞ±VãqV/'-ÅÇÒr9θ‰ÔCZÍÕÈ#²øãÊæ +ýuco•þzp²æ[ýÇ‹ËuÊÀÌÏ–è¯%e‘þª-,Ñ_WV—é¯Í*ýõ ½Bó‹”¿8\¥ß?ž­Ñ_?nÖ‰#TT1G,]'jäé•úJñö¬þwßj×®·Ì;î¡®–¨8Ìx·O}kK¡°vµV´ã3ืN‰ÓŸ£ÂŠ›…%ÛÝë~Ù±™³÷’t»ñ4O¢VõºÿR²¼W˱•WN¦-/߉{Á'Ü_ƒñ(yòlõ¾.íh‰´Àh­¯×ý.‰f=¯ æs*ã†9s^˜SxÊåœ0çBòí©TW½€æ5ª6ËÔ ŒG¥2¤G4~žÝþD +1`ª`x·@?;É=8ÀàïS/ž•'÷E™x|(!+‡d…rå®hVñëÝ6H4±ì00ä‚í9Íï|[Ë †LqP!$vŒÈàmòÖoNH³2‰™ZÓÛž5$gäœã[\Y]Ä^å•ãÁáúGù¹°¶ÿø¯]ßÞLyN°O7õ'dü‰$ëÈKI[äµ— +¶xÐ^v[\Wû³ÝÖõ…ñ¼vô7ûÚ¸xÚÇm¹cÑ%•;éúïfÕ^øóÙ ª*t^ª¯èn ý´D(Õj(#O+ÎVÁ)´ýpÎó©èDÊNÉ®á7~’ÝOŠÕ@cñ÷’.¬ö —ÛG²ðînÃ…à~¢¨Mº“n^Ñ\Èô‹úû¬1}S¹\h–[+äg àJéã(Ó˜7ó7«‹Bg¶H‡„rŸVv€5!ï½mç'Í;r”°%îF9li3­ZÎ:ŸÄÑ „ °U/XV„Åê²e,€mt ¬£ÖÊΛ—Çz¿4ûrë*ö<ýÂÙzµXg”ÍWêE¬ù½Œa@$5À˜ÀHj>Œl@$5¬d¢‰µb>€É<†‘Ô| Ǫl@$5ÀÐÀHj>¤2ãIÍʜրˆÎaq¶ˆ¤õóbÃ-svhé ¦=»0÷-)ÓõßHËB½hªÊ’#7VàÅÎøaû{ðby¥iÎ>G6³Qýýl{ž›¥6Ýü’­O[fÁx-ƾŸÞ"¾RÑéü"a—Lj,'UÅÍ.±-–dOþ,ÿ0ÒòH!mcý×^xð¹È9ÞѼyÐé9‰¾dm4þ;Y¸äf9‚Gv\}|…¶Â®EŽT-Y•ˆŒãÙ–…Ï-ÃB>R˾)Ín¾¸ò0O¨Ãa­ötYª—.‹`¬=ëÆv6[Í’•¯b9›­vEP¶Qdì +¶ðÔÚ/ž‹¹kìaœ“¡çϪ£s JJœŒrS@ö²æ&[©t•·¢»'t§ÕŠoãSÝÀø³ñÙ+wNWŽ¨6¯æËt€„Cª'·…†»C{ÂÙâ¡·x/¤-f‹Wh,í5x{Ä$É‹4ñçkbcnÃÛ•FœX'Í“5BÛ•ðê:Xøù"~*»Ï*î3X—ù#LÁÈF¶VÈ•/G€·oWL´kGD˜µuyíߺ¤÷oÏ#öoÉ)îÃîÚù‚¾äþ¾„û·œÝÛ…‚Ëžüà `A¤·.󵋧 eß­wÊ/³;Ôî-öBNÿ=ºg¥åRÚWW\{(€^¢P.Ž·…½úGP€[1#íß:¥Ð‰¸—N¸eœ45I‹Ö5töH +ÆÐéÖZÉóp]Ø&úcNãåÙK·1–|5ö¯Øœ„4í;Ž¨ºÂIQ¹ßíóRÀ¯¤§Q˜¥šX©ý~ûšøNÇ‹J'龺ߛvš8ÿôš6vÎé®Î¯\ú=§ÞI‰dÇ0.}McÝÁxi7­ôØ4Öù›ÆοǽÐÀC×Ì҉‹¨i¼ŒŠJÆÞÿÆ[óÛpvMe’5ñð;ÎH³ËEfòÕ8ár¼GRVúUä4ÞÇ$ìó¯?Rž8Î4z,oð8Ãâý°QüM7†‹™™x,õ¯¼&ÒÙÎËÝÄÃCbàjdfÝß8LÄŒá…")¿´LŠ‰‡÷þ¸Òòá+>9-R=ü² ε“£èòá/M}œ™ö}›qR£7r–= .ªéH2ÚÜeAÁðëYzþ÷§žß9Û³Œ@ø vB?¶b»Ëç +f9'-ךªshÞÞzßþ·9ú_ô¹jyÝVxò}š„÷g­BpC*–/ݽ¿ÍÙŸÞº{÷€”‚x»dçT²Fk½‡ÚîøÉÂÀqÇ7Ïí¥Óø™ o¾]T†®Õ¨ÖJÔÖæúÅÉŠób³B;×!U"¡5"©Ì«DBkDH¢Ç¤ªDBkD¼^&UÓÁ«Ie&X%Z#’ÊL°J$´F$5É*‘Ð_ùȸU"¡5"©IV‰„Öˆ¤2‰«DÐ]õå–em™µfdíЉÜÿ¶±xön‰5rŒúMß’T¯Óûs®¤ê;Â¥lÝ k3šªä­H¡›Œ!n̾¡ÐÛ˜÷Šð‹l7Håìj*ƒ‡š–ɉ8˜°†Ç¼mTBÎØÜ0üu¶Iß@)ù‡wîIÁÖ2T¢‡½g1BÒL·+Þv¦O¢µ'šÇîµhîvfÁÝÇÍ“ü»€€È1멵¡„Ò‹È,@Ö›tÜ(5Ek›ÅkÛÛkqë$ÿ§š‚ÕÆÍÌÛÆ×½‘™ÊdàÉQwð÷ƒêíz÷ùõ«}ÿßÝ^Jœ²þà_qJ›ÒÍ)IUÉ”ŠOÛ©ÜÑàþñ½û4Õþ~þž*MÕ¾?¾{ù©öü|­‘ÊÜVÖzƒúëãàõûë¾÷ßS øèl§}²YŸZ˜r~}‹¿¾-ÝÚ¿^œÊÁ`…[ø)ÀåqsõVœª¬à›£æéTã¿~¾{ƒ)2Ò©Îkÿõá£;uü=U;:Š‡§á1·)aj þ;ûº›*üáƒn*ø¿:ü·—ʆ.*’®èš"h‚©O e]MÃÔuIMÝTà‰¢ †*™ª`ˆ¢lhøDÖd]WLU•tIÃ_‰ ˆ"´£ ªaàStC‘EY—TÅ„'’¡AWª`‚lJÒÔÙ}J°W†üßðe >¼Á£ÿL‰ÂÔÎÔåµ0õ„Ó9L• ­,¦iꊬ*Š.M•DA—ʲ÷ÏÔ'2ÓMY(E*ë¦ kŠj T;Ï„² @ª j¦ ”¦•US†±™fAieE”ðg:L. J4˺(K²©I§G ¦/ÈŠ.›ˆT…3ze–5UÁß¹=ò Œ²(¢h†èŒ^’á‘¡Xò¡¤2<Ö Mq{ä@ rYD]ÔDCµÛRUXq &äBJYVM 2x «Á¶tFjJvS¡P°Bš Oº¸ëØN´ÚíÔ¿ÔIÊœÊå§ÎN©O~J/ijÖØÚ Ð ÌÙTd]°–:lì<¨àØy=&ƒ +ô˜h†2ÐŒ Ûô§‹&¡S¥léÊV[8CŒJqÉ”ŒJ.ëP€$2PºM Uò8-™šŒkM•€`fšÍ†\˜ÇT ˜&m†  ¦|-«ª (§p®0" ’„ÏF® ÀHšÍJø|ªs*|Ëto T›\=E) ŠŠ?Š¢Tª$­¬«²œÅ7¢RÖ QÉʃ%h0%‚dÖÝ•‘b +(él\ñ`ÐЬÃñ°2\(fãI5xRVEQ0i +Vå²*ˆ²@:Càvx¯K«ÀÛ6ÂÔPV•U@¹¦P2A56D¤ %½5™>¹Tn ö"#Gʤ›ñ8‚¹!kˆjnlK +(+š±†Í‡IÀw5à`t-R¨lÈHÔÞê)¦OK|~@Tùµ— +1ª " nIý+è.Ïpak̃’Uh‰¢Þˆd±¬ = ËX܇x‚U×Â`B¸ +á>íDØL&;ÑRT0y ÈÒ@{Æ ¤lÒ, (Àï2,ƒ®Ë† +¶‘0 H!ÑxH6â,xÝ% +vÜ/Ž «7¾ â1(àɈST-´OK²*’ +ßíüV ]³9~JRʆ¬á¸CAS²RDW4hKø@¼aF“`aþä. +ˆ7 %·l«PHx™â*þòÂ3]3 UÓ‰’‘AÚÉš® 4ˆXmiñA–Ç”¨—vý ‰0£á0³ªñéÑŸÊf’r¥‰â߀åTdoX:`eƒEŸ\ ¤dÔ]–F7ÁŠª æ]3˨\Õs¦PF‚Š“h;ÄÞË ³ù °ép„`i=ºe€T0 $Eð­¬&–MÊœáÀÔÁ/¬5îx@2¬Eÿ¼Ñ0\³RUM2EpÌB@S€0üëÊ™hÌ2 !±lš=æ)S‡V€¨A•x :PŒ+´ÎL0hTÌ Ñ¨C7ÁuTMf†AIá$;Ö‚èÒ èv@Ù¸ö™º©k’HËä1¥‹ ÚTèG Ò°gÅ€u¦@ÀÕÀ°µçÅ ,(H9¨¹ÞŒt³ìÃŽ†–ŠCÈÖ¬€Du’À Èc +Ü9MÔ ™F ÛŽ^ÖL è‚" ÈË5íÓ¬Ö$âWÛò”Ä°q; ¯'"8ÞªÿX$/Û£64É¥ÔO.P@#ÂxÊšRZ!cJ0ܱ;Ópjr  32ÅHgÅpI$9"—%Ñ#G´̲bƒˆDà%REpU<óžß]" fYÚIÖ.Œ¼O…~œÎ Y1 mCÒ AUAXbÃ@¤ A¸+ …E°w1Xfƒö°)`Ó£¹.x†¿Óí`–К„a/ „Ý[±†Š¢ÊâTÉ4Ñ{01ú†ì"¡õ±S<º0DIå@µyP`ÐÀtYu„‰IR@ça‡rR(pfÀa“uÝ=Q7¬àO]GI &‡-«› ÁdÔ†•b0‘ JçSRÑ'€U'>^š,££ÆRb(Š)šå2©!=&ƒ +®íñ!Šˆ§‚šQ5naÍu°VLô¯HM6°_|¥hÉÄnAáT•AIàJ«|üƒ™´k˜À*0tÒ +4.ØÄ`ÚI gÃ襶(i kB ÌÊQ$`S+„+ÌE4 ìŒj„é&ð4LEVU˜:˜ +°² Ì¥€A@ ÐPñ'†B€vÒa,ài À“„P9½ºŽ:XDJU‘&JÀïša„@e0aýT`m)ç Öé2kK"à HHE—É•@„bAö*D¡p}mº&P% YBÖ¨Ö n€ƒ Ò; à–+¨ÂT@˜9B(΂P=Ø=ò»CAP.{Á@§¥p†77†79PY¸½§*ħ"F§7X ¢®àƟ⬠ś¾ Œ¡üÒ¨\‘>S¯¤–e ¸ùèH V;ƒ]vX¶Xçµy@›!Ø]"  %#‚lSAGjDIÉ8ö•f+¸÷ª&¨ŠMëI 8â\”AߺZ+DÃxÖh ‰€‚ ãÓ’ +Ê;<+Oû)4lßĈ¬Y«Õuà +,HÊ2t â3 +ÄPtC¾VU1TPR¶h|·hèÒ˜"΀@˜¶…fè Õ@ƒ{6Ãá +ÒÒ2ψêí–L)høé`ÒøU1 ò˜’A2‚IùÉmGÖʪw‹(YÃR ª;k`/u%Šl×6è˜ZJÒË*š ²¦:˜js€8´„›ßš†.“c$â8*°ƒMÞ¡ àG*ˆ]ñôæŒ +t²LÔlA¦éeäPAD)p @Õ>pâ:h`p€@ãƒY è:ñ£ŒAƒƒ…;(’½\¨ðÁÏ¢0 ËÔeÈ`¾ˆšn+1pLpLKŒë° +Èu0ÜÁí”Ð @ “x­`þֈˀaÀ:R4»'–ØãÙÊ1,@g0+°‹TGØ°Óÿä‰eS2ÐT7ÈÜdæ*aê²£|AüIÀn-BõÒÏ5ÆY.20<24 CONTY:3€W q@fa8³60Zª]æ…éó@‚ÄCë7XoXnA0tZMˆ0܈'†êg +Ô¨h€'+PÆdâî Õ1dÅ2ÎÖŽ_›&î® Ê6ˆÔUbšÔ0'1®–†iîõ"·¢Qn$°)X^`ºŠ¶ãÆ?°am6Cg2ŠQÛapX(TD²ù`LYT’¨ßóX} )â‚l Ù3 ¬ ô£é–ãkM Ô<˜n†JvtˆAÌ"`^Ñr)S À9‘+€¯Néà½À„LÉw@úgÅ‘â¨$ÁyTg­0 ›ÐhQ 3z”)ÎBhz1wäôUÕàOk¶.0E˜“²HÇ’˜@È @—t0Æ®êàÍÙV +‡ø`àX(¶©‹CÄ,,'870^à9 p¬/K–”·­Cç íˆ`U¹ "Ê6 wÂb*vOpPD?ÚÑè “u*f°TÖ$B·>Áœ]õΉö`ˆÌGÌW}¸Æ™@¼FAU‰ßšˆcœqžˆçŠ0™Š¿ðâ Ý +ƒLÒï•„@øg6³Ëã6ć(=FD鬈B›ðâ8ÓCe%)8Ûš.»kŠÚrŠá1;äNZÞ³Ó`ßפÀR£„5 ÒF›Ýy7øQùÛÓÖݹ¢¿ íˆTÖh Œ‚Õm™°µX JB¨èƒç+:QF3% cè…ò`p´nZ¨yË \? Ó²+Ñp>˜¨M¹¹ä½«¡Èhq c]u$†„ìí¦NAh%xBMD )ŽìÆ×&îô*n¬?ñH6÷dÌuI(ЊÊÕt¥’$çß+¸Ãlm\Z¸ÀÚ JÃLÀ8ÖATºKƒ)`^rZE85ŠåÉ6 µúAÐ"^•™ + ¢È~!£P혔¥Ž¿ª7Pœ +¸lžºÖIZ·+Wj¤Ê@@oÕaHqÖL¶±eº¢F/…ÆÐ%WìkìBÆ=3Íݳ ÀàÎ&Æ0LŠñƒÝˆl+¸0*½nÕßÆcŠƒÁJsF"'Ì´!óæ,©¶åÎmçŒ1)-¬‘Æ£|«/b0S×¼ÅÕc)(¢•½„-Ò†o ˜,€@Ñl«28 âÑšª@KN#¢bR&Bx©86FÁGtȘ¼w .Ÿ˜Ðgx˜F’=³®M`ÉÞ•ra¬>Å][Ã0¼¨BÀì=£!ÃpDî暢¬ˆÔl€ JFˆgL„²†ÐmAJ¥€;`8y![ê^/BY§l –Mt:¡ °(tSR g?%iŒ¨d!ÉÖ=fÙxc ´¢bä@¥0"©þ±â–½nÐnK‹žâx$ÛúºÏÌiéS ¡€TÓ] +…’)K5t¢zÊf%kxÄNl?Í‹4"Œâeb+¸£MÉuteì;û=ÐH®@%-P2{Ñ? +—Ï[aK‚» ÑÝ0³E©+4C0Ø ÌOSȵ”­(&«²1g“r8ŒâǺ ã¨à¶QHcGTùp"X;ºáExyòP#–µ»zn¤}M°¢;”ÿV‰°ƒ`ÕP`A}DGPß¡5E)¶—€9†‰‚^¡"¸¶hú¡êI ŒÎyæ¶eø1jÙMÔ0ì~@ühžÅŽ¾ +ÝÖ[™t Ì{¤1 èíºX ¶éºŸ40ÑHt¸y "]Ie/näŒHƒB°£²º `Ò”dpÝØ&L¦Ü ¤´° =nAˆàd0”Ô/nÄ*îÛ™Ôþ(omPjTä)Ø&~ûaI$Áv€‘1ÖíùÈÁȱ³‘ƒ³aQh$€UÌåuå‚H'£>dm0Ž¡:¼GZñÓúztA:c!,rök ‘½†Áƒ`'ä=%AþeÑÊÊ€àÊåH  F±#ËPÞÉh˜^’.ÈC’yIyº€xA¤#,è?Pÿt&Ʋ=zˆ`›ŠT © ’`E»F‘‚9jö+ÌŸ¤ûÇÛÿ[š›“öÄM(qÝ‚S`AhÐ0£“²Èˆ4a£ãÓ74ZÛ²ªÈ®'Ò5‘ ¨E¦˜I +åï¡ÄÍCaçÄÛF›˜·(©nüžÐM#°êtÕ©‰0d¡ãÆdeáê!/YšvN!À[ ‚ÜÉ 2ÈáÅ3ر‰¿–ƒK飅 @€ž‚ MÒýëq£°Ä¿„åä,¬W@?`Žœ©«¤ >D+FUI”5rø +ÀQ%9_D¢5R2!I¸üºìº{ µ=ÿ×2ƒ0Šßá+Ièek^²¯¾V0G˜iƒ¨abw¢Ñ°¤‚~_L€ÁÂÌPƒÌ|SAHÔ­Ÿƒ6£Ð™Qf¢³“å DggËA«Î¢5°4ÌXãØMrŒHÇCXœø%!…ÀÄXα ôbdC7ÆPü-p–LÅT¼¸Op3ŠÀLÞ±0¼%ba‚ ÀŽ•˜0†Ág$;’¸Æ2í’2·Ó5ÑIñ2@ˆ)†$èNÎø'9Ô@’d™‹1@x’†"ÐAÜt­L… b4Ï‘¬9;ÁÔhÃM¥³Ž``Ƈ€v·*È™Á ±0Vƒ.(’o;ƒm ÏH‘Ùð*„‚âÀpæŃbÑÃQÇñ‹E¢Ò&UýÔ'(8; Óú"n$íªªÆ£›‘ÆC·VÖî¼0$Û +n‡J‚•]ÍJ‚ƒæ ‹dfsfD0-†8+ÀŽ%~‘ÈZrhG0„•Ø˜P ÙJ;…;éní)ŸÂ°˜³tŸÂX˜Gž86Ä°r`4fRq€afETë”"®8À°¤¦DÂmwB, _Zâ 80 ‹E5@©œ% °(d¨9°jæ,fš I50HpAƒ@A FXδ8KÊ 'ÐJ½¡Ä.Rb§Çëf’Í_]œüfb§„I!$î/sÉ™…áòg°!†·£aØIqøÓÀÃ(4Ð+¨¦ÉcOƒì{dû/oX>{Zâ­3žKÅçN΂`d0°2æ,e ¹*0– g99@,ƒ ,gVœeph%¸ÌHb—ˆø9’LGM ëuœ€#ñp°ôÜT©*> vÏYP¦D°³u™ÊÜD;¯ßH²¿³]ˆ`r{¦ú#­"™t îíxq\e +s½dÅÝ7Áðmôã¹0t}¨—UïÀ%â"ái2’æm:›x™·_ãÄ`“=£)ãù€ö&>¼ÕðÀJÑP¬j\Ù¥vö5Ð]q¦²AÈ2 ûÛŠ:–Ý€ˆu€€ +ËðÉÉŒ$ñý¤©8pìvB–f¬ +Å-åÅ3I¼NÀf“¼ +¢Ç@‹H’—i–à8n¥b+ÔQ¸gNgøšUÙK¼u/ˆ4™±¨î}&žA¨ˆf$X4¶1L R}‰9K—Q¢¨÷Ry± LõUÏV•qÔºâÖÄı»Síuë€Æ×9)¿TJe2û÷ÏÝãÞýëG·—zîßÿŸîÔý××÷à~Ðý7SϽnðÝëNõ_¾ÿƒOà'x&ÓØk¦þ/ž %Ë endstream endobj 76 0 obj <>stream +%AI12_CompressedDataxœì½k9v-ø â?œù` ëb*|Ù3à¼Ò·Ýv£«í±a\ä*¹­k•TP©ÚÓóëg­µÉxœs2•²êZåvB©ÌCƒ$÷síÍ¿øß~ûÕ—ûoßþÓË/Ãݸþâ/Žï^¾xÿöÝ/wúv÷«×¯üáý;~õ‹ß}±sÓ݈Fû_•¯[ÿ{ùî‡WoßürçÝÝxçQyÏ«ñëWo¾ýáåŸvÿÏ«×?¼}óÅî_ ê÷¯Þ¿~‰ÊówÿôòÝ—Ç_ÿêËß¼z÷â/¿üõÛ?¼ýò«÷/¾ù×—ß~y|ûúí»»¯¾èÃAÿ§ïqaüKçÿÒM»ò˱ì~ûÖ¿xóÇ?üðêÿC­Ë¡|wxûã›o_½ùÃáíÿûËÝ—.Œø1NaçbØ}9ÕŒ&ÿýÕï^þpÑÎ×»œbŽ©L¾Æ¨‹ü]ÍÁ»ìð-;ðwiÂ'£“õvW]A{?%Dt}zûÍß½|óþ·ïÞ~óò‡ô0?ürwüÓ‹7»ßàYß¼±û‡—¯_¿ý·Ýá5xÀÛL_ß¿zý/î»ïw.ðïåüׇ_½þö¯äÛ Žž_‡¯Õåßþ€¾Ð-ç×Ó׿úß|õòý{<nÈyúÝ_ÖÃÀ—*¿øÇß½üÃ+M+^íÿø¢uûîí÷ß½x÷¯?ðeÄx——ÏÄ—QÊÝú—Ò]X}ð26-r±nÿò»ï_cöô–ØïÒîËPùßúÖoÁfÃ9¼äÍ| Hy¼1€eB^þñÕËûåî¯ß¾yio}ÿîýW¶tbGûi5¿ûñõËwûæÕ{¼ ½öj¯ý7o¿}ùíçëï_¿ÐÛVqËOkðûïþðò=ÖÚÛ×?¾×6)ý˜Ö_¿øÓK® õ榯˜•7¸Ï›÷îׯþùë?Úæúúï‰UïlóýË7¿ûwz”/CÀ¢ö>ìF½‹O±îœ/øQ4´Cƒq5>g?Û-÷¯ß¿|÷ÓÓoû¿àç7ß~ÝÈÄËo×÷IºïÒßÄ„Eû[,ã¿y÷ +¯â—#w˜·åýWï^}»¬îÉïŠýÐÛ¾ÃkåǹêÇêëS¿©úLÙ¥‚Íý”oìý`Ößã)úÔù¯¿Yí¼ñî7_áAðÜÇ·ßqéý@ªÄÉÅn|ýöV7ÿ®\þã÷öRl`•þöÝ«7ìsøkÕ”¯ûúGTýÕ»·?~ÿ«7ÿüvø…iÐÚ—;«Û©ò Ñß—»ïÞÿÛÛwÿŠ?õíË qýþ‹G»üê__¾ÿæ_.;mßþû»ý»—߀g`Ë}»û›úŸøƒ}ní~ÿîÅ7xTü=·ùpw˜†wýÉq¥þìÿøêÓËÆ°—ËíÛó›?¾|ýöûU·ÖîÃýýöõ‹7/ÞÍ/«ÏÍQó¹tȆ/ßÿýzĦø¯C}l§âƒ VUO¸Ñ‹÷ÿvô<{îÛþ\FÍ'±ï>ÜßñÅëׯþðîÅ÷ÿòê›ÝáÝ?üËî÷oß¾žû¾Q?ßg]§*^ù„û ·ä»[wÛVÍ7j_ÿÌîñ[]ðæoÞØœ\ß©5¸¼x‘]ó3½×|Í­û ò?Ë=¾úÓwÿôöõ«¾[¦~õÍoA_}óúåWúáý˧Ќö‚Ïß¾Ñ{`“?Úæ«{šüëWÿôè¶äCþ3Dr¬Ð¯~|õþå²ß~÷=åàÝWÿòâû—z‚Þò«¹Ã$¾âH_~ù«rywx³ªÿ«w/¾}.Áÿoß¼yñˆÿÚW;÷ÅpëKðô¸;|;üãðÇ %£$”x G¯âPÆãx¸?œUN(üì[©(e:d”tˆ*áà‡ƒCãþå¼?í(v?¥ L*%¡D•€âQÜ~Üõ¾žë©ž†zDá u­É µT(*©¦áÿƒàºWѤèëÕᾜ1Ê}™J.±øâ¦ótšS…š‘¦8¹iÌg<ý=MjCöyLçtJ‡ã* :K +ÉÅûxÆîc¡ +Ctq çp ‡P¡å º9ïÏxy{_!`gŸ<”?º3^æÞ•ÁM=9ïÜx?žñv1ౌӘFôgÔƒ˜¥nóºÂ¿þ3è_h¿Eýõ¯—d?ü’Q’îÅ;VÝyߊýv˜æŸÇùç©ýÔoƒ¾<êËÓ\}ÒÏ3~žÇ3dÄ£Äæ)§Gʹ—aùµ•û‡K)ÎÊÐÙ¿.šªD¹`‘ì±TŽù„Es?X>~ +XFiÊXPËjÅuÄ;O÷e,Ð]KÀÂKX~ÐßJÅR<”c9 X—÷u¬–±N#VëT) +ï±ÌXõçzépXÓû"a—LØ3ûç€Ýt¾ºÇÔ¸ƒÇ–‹Ø~yÀN,Ø${ìÑ#öêùp)rØÉo7aO¶Kxݨ=Êkƒ&&iO­‹ªÍzh´ýÙÙ(¢Àƒ¦Œf£…[”ûüx8òsB9£ÜsQœŠ?Îf:áõðŠNåÄý§Á]x ?çátº?s aßœý»L3Îxçg¼×sÁƒÄÝ_|}xGòµÇK{8Œ{ÛF¶UV{jlÄ Ûx6³“6~抽Ãû)¦±–1Tï—Û`iŸñ\‡ãÞÞbÁŒ„½«÷Ö{è;rs³~»c¤éà +r₲®l:1¡Ëcý#†’J€ŸÝ˜Jô‰êÈú¨S 9ÆÌ/Rr.±¾Ä*;55Pœ´<¾˜ô(ó—ø¦¶Ç³ïÊÎCÉË»4îj¹ =c P°¾þ¬c8ü0èº +Jëó”BUO9€Þæ;.E ÅF„Ý"ì±A‹ Àã*7a xñßðßÅä.÷Ìþ# Ësÿßמµºì=(Iu.ªÆÙ‡ê€KkiÒ=˾IÁ\ðúfDßMk'¶ñS‰Á…‰f„‘MâæÝ»GäîÈW/âg4(½¥â6†q€X$a9‰k&ÎQ°84A»‚OO·Sä‡B·×KºoÂ7Åï#”†J!|ÀÓLû…4î)‘ãç©œrùÙŸŸ 9íÏÓ‘!õŒ|„Lt†pt„ Dq©BxÊx»b•›EÉA]‰0î{émikSÓÒ<•³¦–Q!£"–¤zyŠ3R¹ŽÒ²L‰ŠP¥F [÷`¹v¨KÙʧ{­š#VLÅšájÑj Å4+..Žˆ…á°,ÎZÒ¯lE$éXXxK\§¶úäÏiǤŸ4éû6× U¾Ïñ€ >ÎÓ;I‹¨íÓz†j³Y4‹©O²1Ï`ßê…6· ºÌYŸ¯¶CÝG”G?ÃãÕÿyîpþšóE­bÖ,zq›âW%lÊVçL,ƒý'¥d)Óª”M©«²ß”f`Ú/ÇU9mÊús¿.÷F×Ë ÿüª„M¹P–W%oÊÔË€eSêªì7å°)ÇU9-eà|¬ŸÃ>š/)ÎTMyÎâZT ©B›}_;k £tiÓ¦©OS£¦qhjzud;:È–t2[*¶)Ù^¦§(STnÊv‘¹ißTnjiR»»=—4 :Ít™5hÓŸ]n긓q-4¥\´Ôg(Ѓ4èìAK–mú³Ÿõç4ëÏeÖŸ»Í•bËÜ mM‡yÕæyaÖyéçµu?¯?/[“ÍüЦ٦ôÔfÏæ ã;ã²Q,—.MÈÅ ÑÓ±—>a#o‹‡Ï +±¸ü^–!Zyîe˜ñ`’d…±Çû=â±ÏË(ùÚ§©ÐO·É 6Ê\ÙdòcV™á)f™[ed;‘ÝdФۄÛdÛDÛ$ÚôjjÛ¬ÚŒÚlÚLÚ,Ú Æ¡M^ѼٜÙ|Ív °F/1zì¥I?çöó4—£þ™@d"ޔ澉¥‰A"m¿f÷­MÄ]÷†€LêT`^WøœWßð FjÊL›¸<Û25®¼¸»Œ½•¬gSÍ­b¬Âo¬Uie±ê{ÎvݲïšíÊöÞbåyl‘~Àlh›ª´RWe¿*‡U9®ÊÉÊz¦›žeJ˜)g¦Æq&úgåØÊ©­‚ûùíHÞ5êl;Åö w ÷ˆvˆö‰i¬o7Æz[´Ma3_6 ¤ÿ^/˜I§8·>Z#¶’¾nÍwhFón.O+eaƒ‘t á^BÂØ„ñ³fü(‘¼ åkc’hžµj¸~¸Žl2¥s]Ë͇&9OX I²³©Yç¦dí±vŠ,JÐ!·•±¿*õ ¥\–Íq†˜°xüvÓ*øx+YiÆÊÅuìJu‰¶ êüK¿ŒUÀ ^@;Iòø.È*’Ç)€“O.ĉV‘rañ@?»!MK‹½†©¸“uÉÆTü·×b­ù™KïÊ¡ç†èÇ\Ø÷­•z#(IGTÓè6.8bÐ7#h6t*—ÁfqŽÈîÒ¬·íGk£,ÆúˆÙïg4&[O½:F¼´q ì;%ŒI‚„zª˜¢0e%;Ì0)³dÂýSöš·Í$q¶SË( %G´™6wÓê÷3ϧYýâM«_üýÏV¿¦A9ÑJ£Y6 3‹äö#M¼—ÎŒuQì¥Ì,ÅX Ùˆde ²¹à‰oÛ‹{V"ä"DšIA²‹’]˜”89Èc¥É”,”*)W›\yž‚Þ¤K•,“"¦ ™3Y¬LÚÈV\šµ8JT• º¶³tjfcI¥2ßËÎp2ßvw¦72íÐÄñ88î›™ê­)Ù Ç^£2û=Ìz-’/ÛR”•)´íØ]Y¶8;)mvMw«r¸(ûËbJÎý¬ÜÛ¼î›2[t›Üf8Êöâ5ÏN®…{ÍvŸï£¬6ûAÓ^õØ“&?ËÄsC_ÑR¸ÖYÖZ Ê°Q]å%H“4*iŸû¶hΦùÊ\¥u¡´ËhYkšñe†0K3âGþ›Ú¬!Îêì~Fžö e8´Û–Ï~H«3,­4pÚRò¦Ðb—ûO%Þ(á¡Ògô~c´8Í6În÷\Ú>Ó}¶ûŒw# ³-¶[h»Ý¶³¥î»\Ì"ý³‰ãñlQ^LÍ‹ z1L¯eˆÅVe¶|mmõ²6˜oMék#ûxºß”Õ`‡yQn?Çåð@ٯ˰ýs^á,kKÉÊDhÂ0Öû´eœöuX™·µ‰ö­‰pk$4ˆ•ŒÃf(<_a«ÒÊ`XWÖ©•Mxvn¬ ÂÓ@b·+!iБv–Ë`”ͼ©&çY/ÇM﹃€àñ³ äƒdrºòª ž|èY"Ÿåñ iM¬ËËíZü¹€nˆ@õ ôˆt-þ\‰>Cãq‹È³uÖ"ÎJ¨YÉ.~ž[g¤bà¯YÝìŽîžç­·ù~ãÜzÍ3˜¶nâî"~È)¼_¹„eUpýpCF6j-m€Ë«ŠïÛ +äóŒBw7DÔÚ¥.`¾ÜƒÖ7×9V;W½ÞŽ§?—¯-ÍþܤËW\õÒ ½×dðßIÿŽxuG ©ú‡lÿ2rýë_âw#¶Ó¬‚eþ¸o³&Y1öZ÷àíTÖ}³0—íÅžÏ2“1å<Ì®Ö΋ïÅ…ý 7+ÿ(Æf#XiLwö²·Ü¬·øÄÃN–°q¯të@n*|7ŠGn­‡´íLÍ1ESM³ÊÚ’d2ܾØ~¯G¿ôä|n>³„´±|]5¬ì[?ÐÖjÑ­h³ù ëøw女z+3ü°7›¶lcØB"ÍA×ìZæL¬â@k¤]/ŠŒ¼8’“Áå^|é¼ÂÞ­ÑwEÇ<ˆU%-€…GžÕ¸ÖYôoÁâíeO-âa“,¬©q² eæÉ}£Ô–³PZ§plñ+KÀ~ch ³%ÒGŠÿ~î‘oX<Ãø¹ESëkcv¨}Ÿ·úcn1šßƒÅƯ|6’#!epòÉÇ<Ö(Ó>FPG?…PFO˜9Þ!ù7ƃ P¢@åñ;=-þ|K_CÙ¸ŸÂâ#ðõ‹,­ýŸqz Õ¹Â]›JG…¤\Ár9Mdà§Tð­K˜Ú1`:¹‰u¢kQk¨=ñÃrwW!Rír¼ËŒP˜ßÅ犽,>,yl¥”–Ž¢)…B&0Ù,éc$Ž>—*¸<_{É RlÁP÷u=%ÄÆÿ¦ÇÙ|QÊÅ° ®ÞÎÏjXŸæêÊ7]]™÷°quy‘{Òõèµ—£¡ˆ!wfeÒ¯3¢nœÿ…,‡T¤æÛâŒÓÅÞ¨‰Þ&±Ú™Ëæ†éè¿Á†RÆ¡Y%Ø’Y%Ì&Ñ-e¶Hœ$—_†‘uT¤ öˆ æW8¶ÒÐ{É7küš¿ˆþš6– ÀÅ~±lÑ4[<Í‚¦YãØÎרM·Š +[#3·PÌkf³{ WøËãE9Ý(燡—Ã(Ì óe ÑôÃöÏ°›—«0Èáú«O+¦®Co]óvçYXåZ¾—èf2*¥ô}“Ò µËèµ9´ïI–¡ù²öi‡ìnër)³ØŒ‚( 7ºaò9¥óÚLbGs9‹‚˜972….ÒêgN&±`¤d51«˜jÏ3˜–*{À«Ó•*ÕÓð³g‰¿~FÏ&A¾¦¡gísœ¡³'i€¦ŒvCzš‘³yVjMÅí–~iÁ5űû +Â\–(â¼*k'M]—áx¸(—Ÿ+ªÐŒ­· +ÜprÿIJ‰w †~BÉs1‚›†þËOUþL;¼­ãÚO?+kÝö:æ~ ìjñavç•“|j?óEÀØJ±ý7·Æ„1ÍþötñÛ4×OóßËÍú8³¹üùkO"`äf¤ìúÿøàÿ›o†öNÖŠõ€»(Þn¾U(„UÀLûv¸ÐÛCvº«[]†‹‹Öãë¯àò›‡K{ä§6R¨x4­Á àó;üÉGøŸ¼ÃƒAÐyËTld¼8ãò•ç —žä, ³ŠÄ;Þ˼oqx´îŽs^a††7ƒãë·ÇfH3€,æ9/•8<Ñô±5~,æÅ¡Ñ, C3‚˜d‰Û,Í»‘¯LFf0zÐd4llFëHÎÙr¤¢÷Þ$Øól@:5þn‚dŒA¡ž +÷l¥¡éä—챟IŽ”^–_•fxôßš`låîóU¹æÝkàýqXýqx¤\ã·o— 8ìÓJ‡|_£À?­üYvØšØ+æ$62pžt ŽðçÀÜ(¯Ñ8“:‚ OÅ°ÜFèAèªÔ°SKÔL·”Þ²“n¬¤ÃÊLº1”®ì¤ÝR—pïl:5“yÒD:†F=’\êa¡!³3­»Ó–ðKót^›§‡•…Ú5áã~c§>5Ìí±qö³Åº[­Ín=)êŸØʼ÷WÙ{ÖY}Ö¼q£û]gº”¨o%,º 2Ú7Äýƒ¥>±”u¶~t™.ËpýÕ§•?Ë"°Ec^á1gDæq…È\0™qä 5ÌH<0­#‡¸b£ æu^wk°]w2ËÁT~ï ø=UîVÚoˆ~.au!ÝÕô™£êÚ>sP]Iw˜hÿsªëC±7\<8Tc¾Úš]¨ÛiB‡ÊÙè°Ó00L tkòƒÍP¦P 6·Å³mæCg·¸U2F ß”M¦ËGƒê~VÃú4/k½ée­_h£6/ël°<¶à’uiÊl°Û¦–ïz½kyÝõÿЬãæ> +-Ù{OùÞKšs䦨­üŽŠd±Ÿ(Cÿ¥QÞÚ~3Ó×¾™ë2ƒZúø%‰ü±ÿÛñó!^½e²kŽ:Ÿ#³ä ¨þ™ãª,¡q‹P±>g9\'óÎç:ëó=¹YóöOhî@qŠù¨µrœ]ÓìÊÐŒ5ÎuÐ+îú¯o,‹*ïQg1‚] àV¦á:qªÃ|pH´ƒCt,ãQ“1¥Q'†!U1£Ðˆ9“ãÛ!!IǃØá/ÆÅ—cOxð¢ó‰Â|&ãa6(èäæ¶jîë2-Ÿ<—Nì°±JöM[w@Ù´vùÎÏ3’òÔ\ë‡OiˆJ“¨J»K¾ü ñlsâ†ØÊó +[yØdX£*ó §¤àŹÝàÃUٞݦ¬æ²5¬<+¯Ç D{Šëcãünø>®Ý‹[Ã_€ÖºÑ@i¹í`‰²9\â0.qž—ðÍ:¾-±ÄÚv+ù¹ÞûåH‰¸:Nb9J¢ÛÊ·Ü8*ÀìåÃíÓÚO>.àâtÁ+˜1”G‡Í(–2:(LÛ>g'™yâÈô ½Ë7‰eÍgt¶ß–++‡ñ漞#|ºÝ‹ë4ÊŸs’ÀzA !}… ÂE kUJ” *¦³ìß~œä¶:”vÀá¶sôtå^.¾‘xwµõÇðIüßß<[Ø»MP}ó¼™smë¹·È™Åmï»rvÚ÷­ÌÂØOµj>ûóÊz¸œFÜ ÁµpÁ¨ž±o‡ê‚=]°¦k@é%pt‹Aš—.¸xÚ‘®Ë§Ì%Ï%­ +¨Í0‹5aS:LÀuËóÅét÷7Šä¬a{0Q+—ÂÙÃåpY†ë¯>¦˱ æ™e'Fpi¹?IufŒ[å»Ý·ž)bŒ:ØŽ¢³#/¿‡¼§81‰ûù|g;á9éŒg&Îb‹ýXºvÐs;ê™B…¡õ'Ór‡å2Éçž´ob†™z¼‘Îk¦„nHè¸'b)E5KB4âæ3Ê–CWúQ+‡ÍÉ‹v]?Ê£ˆ2´CÌh_[p‡v(ÝþÂo¶>¿ðÖi…ÉâV¯ÃoÛ”>|âÆøÉž®~ÔnhXÍ*åýœ¤ƒbm7ƆT+㡹z‹6² fIѶçÉê1øX PÙÝ·=CÖ±à[~šÑ’툗¡Û]g\¤ …[ ä¾™]¼QöÇÓfg^¥.˜ {µ-6^(K]eòWQ%ZíÃL^¦öóÐg‘ÁÖQôOU&ÿèüÇ^n2»áœobmÍ&ß½û÷²Ì3à¶Cn t;EËŸV‡ÙÏßÏ+_¼ýc;R|ñúÇ´Æâ½ö}[J‡‘{j¨Ü—;¶x)ß=t„nG馦t%DªÂ ehe Ý]à»Ç%5Àêܺ%‰ßúS¬ßaÖ^ü¦„M¹œI7Š†9¬Ô¦¥<ýS.ËpýÕÇÑ”Uª ;rì±Ç>rl>Ñi˜7y?Ô©ë´=Ö³ø”ÕÎ^g·>ÌN;v­r,JǬv̇٭³[h·9Ònh™—äg;Û®)&ý€ø~Ä]h*Õ:aGn*˜¸øÐ>ýôø~‚|?ïØÎÂëeQ×Ç®´Ça>p~]üÍr­¢^ì×á2~ïãŠô×1C×@—9 ±\Hè~-Wbàb¦Ê‹„7%BÉà ·v›ò!áðZlƹa¶ÒuêÅÁ¹ìo•aþµ>©|ð36²ñ¡¸ÆMT#áÛÃ…sÄ"{ŽÏlsbmGñPV¬NÁûX¶|ˎç?õq}ˆ»Lî²Äo£Îç˜sÛ0GœoãÍà-?åò‚ƒƒ’4Lt¤H¤.ÊxKº‘ƒ‡ˆW}3LÇ&˜½a¥_‰p¬a éÊõ¹ði”Ëߤ\žV‰%ÏÏ&Ý°EEfÉúŒ¤íR¾–š§ÓԷيɶüðM.jR‘ÙGWq\[)òö0ÌÜo“z繟cUª­fF±l._g_^ƒH·€ÒëìÇ[ÛËL¥†uµ…HVAfLD$Ø¢K‡KZÚÐäBJ…«'oÒàI’ m~á/(Îòß±I4Kμ…BtZu¿’òñî3$ò04’%9î}x¯=ÃCç9<~@Ã6ÅdZÊ0‡¢˜ñë–7ñAµtv!öc@®‚ø‡u¿¿{áLbSí–ôTÆ|ýšbÞUóKÇy]'©z–*êéÖ(‡'p%ø:† Ù…bî=V¨áUYÈ +pçM p&Õ+»Pº²™ø‡¤ ZîÀÑ×æ©Ï9Šf¯":`Ó$Œ(æe¡‡2î6UYÈ)IÑL–%c»6ëÎwâ°hqòk'ËËý³¿Ãam­úlcè6;z=вTŠu3˜F™&¼Í(lc 7§œ §6 [ãgájLþ!«avàBÓ´±Ù}¾Q´÷P&ìשˆ$ó~Pè +XŽc‰œèÓXX±F4ðµ¹Ð;Ö,¶¹“ÿ¤ncbø$‰ùèÚ|nÉ"?—ñ|÷¿é’HÏ9þžsü=çø{Îñ÷œãï9ÇßsŽ¿çÏ9þžsü=çø{Îñ÷œãï9ÇßÓ?ÿI:|Îñ÷œãï9ÇßsŽ¿çÏ9þžsü=çø{Îñ÷œãï9ÇßO¬KùnŠ.^t_Äs–¿ç,Ÿ%Ë_º‰MnùÕœPO)W š+§Ê° +K¸UÂœ—.Î%]¸­ºÃj>ÿwí 2ÝâØ/§†~97 !`Ì…Û‘²yãÈ­ÃœEbGâܲHø«,ÓìÔÝ·ôKâ%æœ] <Ìò I6=–%I©«kÜÐŒš;ö<´ÎA[Š‘„ÈÂÒò“Ëô”2Ì.ÎuY¨/çn. ÷sœãÊçIÞ{Z–1dcÌ–?ç"šeñr.‹cY}=TÚ¢èKáÔ—EIT}Añº¾&qÀzSdhIEÌ¿[ SjéD–…`YD–…¤$ñäפȦ¡©ëà¦m€Sm‰»'_ËÂæóéŸGvÝR†öKØ”¸*Ë©ËÓÕR)íÿžÐs>´T”ûÙɽ¸¹ùóÜ@Ùç–šr™ã8“´Äœ?y Gnß<ÐÇ£qž{£ðæc³GÍk”€üÓfs;<‹çèÅ®ew={‰aÔÜmj׌×s/çVó¹q?^üƒeå`>èg¾µ .ç}Cwå ˜6Ûx™ç‡çxc<.Â>^þ¡¹í›6³ÃfÓZ2În7¹´œ<´cëÈÔá€ržzÓ‚r‘?&M#h¥ôcÆò¾‡HÐ%Ä6!ZYG]%ã!ËóŒíPÉ „'ÎëÕ»x•‹5®4|hÆ…þ\F$ýÚ9èá!3íX.e +î]ÎÑ‚R5UvbNéôå*³MYÅ“ï¯RÓòæS¸ƒ86­±ÊŸq Ÿ¦9ßL¸€o?Bsþ ¦|©&«?žª#oÀœ— +ò°Ñ×úqxL?¾­¯!Ïþ"Ëb± s‚ÅÅW²¤UÜ*ÈÕÒ= M„vèÈÇ É_³Ž°ijòÐÐÇ®a/’ea¿¶™)p«¼àÓ*Aß±žž¢O?I‡^«ÎÃJs.Wšó¾©N7ôæµÒ¼V›‡yɸ+­yš—JÝh͇y¡,ö“º‡†‚ïËäRkžä3«²!.08‹ …j³¡Ýó°Ò›MǺoš³ošsÏÒ5çžd¶£¬Tg?h±¤YÏêI;6ç¼J‰yµXVšmå)Zö“4ëµB=¬n¸Ò§ѦR¥‡Y—¾¿Ð¥} u^ÂM—ž„þÞªÒ+ˆÕ0“…sÓ¥}‹òˆ›Ù6¢°Ì5ýgºÚ\Qƒdx«©iÓužés›i§™îñiŽXfù¸™e×g¹[Hò&yç±[IZ€COáfê:‹gŸåÏ¥ˆþYwøa-Û¯¼ši£f"êoëÙ‹¦ÝÃ-JÛ2'-éZ4üOÑÈ?¨_ªgà ýìCºw| Ç3\ÉîOÒ»à‡U“E;»™Åd#Ä?¨ž 3VþaÝ{£¡­µï0¿É6sé½ÒÀ›GôH¸§èéO›ûÝå¶NþA}üJoó=<¢/@—ý•²ö º6¬ôµ[ÚøFgká·”¶y¾‡±—ó}©‘wkË-åmåÿÞêoOñ_ÍøS´÷jë—ªúð¨žþˆ–þŠ>܈Xð¶í¼ßžõy·Ë-~cÆoÍ÷ »šÍöpµ½óÇY_VJ¼ jê·mk¢¶:}vq¬’ÄÅéoF‰pïI© +¡ EIH!¬Oʽ)…"”§‹?R;¾N°¯Ü±qízó:ýÏfDŸI§gÒø™uúy Ÿ¤Ó—[*}¡FŸ.bŽoÜ yçäkõípC z(á‡ßÔ]·ü vl›ÅèáV›2¥cÿ¿ßd8´à¦¦ -cXÙ¼üU 7J| ´Çú/åééý/Ž'žxŠÁCå§>Kë¿T‡—û6Ëá®L„nÔn% Spóyæ¶? hn[²*ÐÂÿ kt74ž,Ç’ W…öuóR˜-‡‡fEr pÞMÊfNž!÷\iE“~œ2iZNcÚë¼¥vªË|žK¬ÝNqæƒ$íì–~”dÝè'´ðõãXsìÆyuÔJ;Qe¸qŒJlá$'S êèQœµéûYíZO‹Ýæ˜ÁÅ—æWeuÑiC.â[oDÎÞŠ²=>j±¹ +ݽ]žà¶ßzn¥^|q©?~t>½‹Ÿk‡K–ˆþ9_•[oýx³Ìéú‡UæþuÝ[åC'ˆ)Ô}¸u„â¦\f­ù@VaóŸR.RÉý„å)Æ)ÃÇ5îðgÝá:óë:·Ëí̳ÈêÒRº\dŸ½Êô:gu™f“fh™hÝ ìÉ~ÝåÒp½2nÍæ­íáC‡‹Ó`§nÊ6㦙¼ú°WGÁÎgmO»<l?\{ë°§&ËÚpyئ¸e¼]:e y·ŽŽ½]NÛ2\~ñ‘åêà±á#Ž¬}Rù3î°ï[îÚŠ›°_ò®°J'ìÑpv؛ܙ{¥WMŒ±ÕFw›ivãÍÂéªÜ>ñáü@‡~Ü5Ë°þã¢ÔO.¾¸©ÇL>½‹Ÿk‡‹gclÅ©|ô—vL”<‹É¥˜³¢Ò¸OkcÊOÙá mˆ£äÊôPJÜ-–iP/r`ä¾Ï9ˆÃƒüøƆȡ¯ùh§5½ý]N¨ÈîŽ0ž]ˆwýæºÛ-¶×Oè5ù¼óã]ðuºqýe‹ùúiºÈàzùõ§95ÂM¯Fرò ^íéìnß±I=Fñ/½³cßSE Œ¤óÌCKýÒ:;·CÇ9-%þÉsúÆØLõº`ì9a~â”ç~Ìæeù4ŒŽ^­zèÈ*Ã*=11¸Å£¯ö=·Œ]ý8ß%·Gn™»º‰¨ŸÓ;§öèæ!KM+g€{bñ×åÂc[uJ"@˜0ÃtþUðöP&9@صcÇ‘¦2ˆâ&lšÛè +õü`®nlÒ©ºU–èÏ: +‹rWrXæ°sdpïNgÉ…q¢©2zôUº +Ÿ®³R?pæÂÕ1~ÿ÷|ŒHዯÿúí›ß¾{õæý«7øòËíZW ý=k‚ÕüöÅû÷/ß½YµöÍŠ õovÞž5ŠñEÙñw®°úDa<%”d-F`ˆ'i´Î¥PsT²‚½~þý¿Ù/ñßúÕµ4ÿ'ýùã×ÿ‰/ÿ ¬g÷›Ý?þq÷­]ù;üw5˜Ë[í¾C«h÷ë[­®ì×·îø´V7ïøÿþrÿîýéÕ7ï_½}óâÝŸv¿WúËÃÛ·¯w¿Øÿª½õ¯Ïß¾zÿöÝׇßü+fïëß¿zýòëß½üæý»ÿüøwùõë³ßÿFK4`iVŽ0–œíèDb|NãÆR”¾}dúöâí(I%¨µ1yž`òÂe®òp•ßÝÏy¸ÜËîï_`qœ˜îÒ +zÊSÝÕ|𫦈•QX9–äÝ\É +p=Bp”YñbU‘ܨ+0¦È +4Ø}£Þê^5‘9H‡sþ.UúÔ‘švÑUÌGÚ9ŸîŽ€®ƒ§B/ØŠwu ¾TâHF´á®‡Iƒ0"e7$,Ol•SE£x7b®ÙœÃfƒXÕ Åª…Ça‹Ú‰µcQ9µÀsY÷D²¯âè=.!îyò,/ÂeÁ[‹\Ø­¢«Õ Ž7®¾X P µÈ µºw˜Y¼ê )ŽXëM”3À3‹ã bê¦]H•ÖàMñýºoŠ#ÂÆtç!`b²çIÅ‹ž&„i?j*˜‘!¡ÿ‘wÂ9:tfÚ¡÷;05.fÈ&;t~°g@ñd²Á³cYb1Ï‚©àZ½nÆ ®ð€ +LmÆ\Ä +9°pû¹ÊóRÃTµðÐo‚ך°t*ÏiÀ_dkä}Q#>äö}ÉQCËÖ÷i¢‹ÃMA &îF4¨LàÑ»gÌ5[Å8Z7<­°ÇÖOJYýLÎF™ž’Kk1ð1Þ‚Ý(æÖ}º£»Ž‰QQxË)?ä¹AyH®Æ +ÇB ¦ZÁÊÖð:ÿ]y[¨ßX{ý{õš¢6aÅšŽƒn×`bÁLVy…»Q¯à:õôÞl®<'wäüZ÷צ;Ü‹TÅ뺊ÍUêúrOõnJ‰“‚)à¬ð95+6þzG(ÙõUxh-5Þ%r‡£Bìð‘S‹$è¶]È\TOˆÕ@eêk&ö’G¦·‰Ö +’y`«‰—©EàÛåzãêgÎÑšY4‚®8«Œˆ)ÙZè0 Š¹ó}çm¦)[›‚ÝÉ6 I½`Yñ*Qð.5T¨‰£Ñ=½´Åe‹06ÂÇ÷2as“úКƒVýVª¢<„ÃwxÜhªx£Ao{‹oÔSt£V:dq®c,Å65W­2w?–¨|õßqòx0<^ÇÂa‹Jm`Â+öXdTA}äú!l°\·°U†9A³ŠyÀË‹7ú!yñÒx*K )xs ›sÅ­ÅÛëÐýDm6Š#ð(wÐfl­Ë zÈŽ{)s­`/9êôXV½vMhäŽ)ÇáIçb {=Älëó€ ÆÛðXÛà,5CÒ,¸Áõ¬hå’*£l| hèZ߃Üój¨™^ yžO¤F‹‰V‡ÂLø¦ž{-âä]{—hE.V®Ö¨VÚ'h2QÕ7êñ³µ V'S)Ëj*”Ø {oCvªã¯yœ{Û¹»[A~®Ñ8ȧ#ÃÊwZX:Ü¡h#NNŽÍ@œ}âRÍØÜ5S`NªëºSÉ e‚ª0•[ý`[a©‚/ãýÌä&ŠIQFQ æ`ID f%ˆ7+§fFÁ&e»ŠOÆ +¥=¢(Ä“À ØÝ?Kp<±ãÂáfÞ˜Ié#ØÍ„y&,”èN \¥ÐôíW¼’Ì„÷O<¸ì–²ø²«žR™ƒÀh›‡ ùŽˆRžû“\Å ¦ÚÙŒêë‡:°"¯º4àb´ƒù©…ÎÄ£q‰‡P[på«ÄÑ s…@6Õ¢!öcL”•Ú²V[‰­Ø/[áuñN9ñN´Ždká©pFlÀ¬š¸9È.“݈YÉÐOîíFÕ‰d— ’P‚Xƒé‹á¥I[ô{2*Þ w¯HÄ(Nb„|ÍA‡¡F\³("ÏXG¸B¢æ«7ŠÜ•E’ %4J2KÝ”»1qÀØún4˜',3y…²Š×í=æ†`_ +LXÙí1H*î +y¨P +B%u¬”#žK-¸õQa<Š¤B2+"!ÆèÒ´] +qË‘ÖJ-7 ý‘­0…h„u˜ÉC-pêÆCËgƒ2òE²…–M,6ÎÓwªe»‘£¤†A(i7Âø ÷àe:“œI1ÊHÜ3– ö¦éÏð¨‚MU[@ÂU¦HË™ÿÐ9¶=‘GL#æTº‡ÐÁÕ6*™©Ž•< +Š•ù0 ¼Š‹ù*+°!²*(<ãïóæwŽS‚ƙ«Öx$,±ÐT’í{°XP[¼Yõ S¨2G1»xjl”¯@vA”±Ò‰ +‡t‡7BÅ'&“ëñŽñºý\¡^ Áƒ­GTg"m»j¤éØ”âÏ£„þÀ`Iï{Œê^§Ã“ìÔY¤e%X *1¨Ì ÜIWiKUj›9(&4;9üZii½L ôGž1ÇJ‘=VPò/”~xŠJáG!°ûÄ“ê8(ð>¨¤­XGaÙÊ®RÕ¢ŠŽ= +Ž ™bF ‹œŠ5RjèðvÐ`üØ4µ‘,„!•"ÔA⦡qBìÀ!¨\ÛßÜUERŠ¿FÔ®*±G ÇàhÜÆJÃ…v˜VP«É˜‚âžV²^a£Ã'ê“V³)N««ð…[¦ÐŸÇÛ€K–ëïqWßuêm6 … +½ô,Z1zPsn{ŠŸ`ïXo+žQˆ‹•t ²2rÆTÝŠº$0iƒúÒCÓ“9ñ{Ÿmm(¯iû¡ÏÌÅÛ§&ŒwtZÑ +VɾÀßôÊÔ]Ä Àx +u2;Œ8ÐnÉ+)hÒ©\Èâî2•ÿˆg•‰…š3‚r°”“Ô*©´¢2B!k1² j +Çô‘T"=§¾TL̈‰Û@èδƒø¨Qyų‚U°’ÐqVBÆ´«À±¬hIà{®mâ‚æoþݵM~GéƒÁѳn¡Gbén[÷¬ày›V UWŒ¤49¸F{ eTæÅfŠÔ[ŠrÅS®åb¦!¯f%f[Ý=È̺ &Ý‹›Aš…tržðxبäv‰Ö2®» ƒ!²¸‡ô½Êú¤ +4”‰{”Âu`ÅL…Y騭OE#I“Ô <0é(©*xd’~ƒU•ù*À²=9O)­»Ü8b åHÛžé^ukŠuª€Ô‘Š²…Š-'ºA­Ì£Žáú¸3õ0!°"<'=xtpN>w‚d +ì6hôÐX/x ‹ÿ–ÅB9={ñU$YyfʬŠcƒt”&{².MØ¢ûEÌ,7…* ¦³ÜoRÏUuVР×Ö4]UŽ"nh­1߃Ÿ‹ê¥Ö= ±‚Q;)mËÔɸ +Ùµ2oM¶á£cGñ=áAqËD}c»ª˜F)ý}mê º³AÅç™×x-}'X¨0 ×™N£QÓ`\0óëº]†t^ø:È®û±bi½…NJ«l¯Ø4‡Bê¥* b‰'¢„çt´^Ug‹’¤†—ãZsG” µ2P0tëbwGº\!Ì’ƒŽ˜s¦í ‘àÁd„g§yºn¡$Â;2Is¼ÑM 2 b²ˆ÷ñ;¨v:š÷ªb"(À—y-l*1•’K‚xuãiŠ² ÜQíßñMzB‹@!@™çïÕä õïAG/Ìæ(nfZiÁè@ÖËŠD«¯ïÝ]VâÓ8ht®;ñ‘T#‘k*5=_ ˆA¯è3O{gžŠãê*°Ï¬ó¶ëÄ'¹…š@Ä5\Z¯qcŠéЉSê+••Ú§´c™Pa`ªÐf¡niÁiTó] "Gnu(¤àßswòxÐzï Ô²rLNWù¤@^¼ÐzV€—©B"B¦!ÝF'iÝá y®%žÔ\ª6ŸËdüø¥pž:Ëyžx0qÝÙÆÈmcUµ +ëÎ3õª1™-µ +€QÒN¤qýº‚"§ëƒº¬¤Ãgu¤/TuGŸÈ,@SÄ¡8ZˆGxfJ!¿nêÎS¶ä„N5Ñ”Ð/òYFIúµ<Í÷´I’æ]U€½ÑŒÓz»¨œh«%óŪ"j«ÔÌÝÔô1ì9°6>VA€8Ý+ú’5ír$$„^G3 +h‹£·V mºþ–Ò#m ¦à^T’jA£Mò芆=‹µ‚!c@8ÄÉ.ê\aŠ¾¹™ ™B0ŽËUêk"eÑÅÆkA‡R¨&Cgz© Ý—´ý5rD¡ › u`þQuÔX‘©¼ËÎCû[{¡šÐoçæÚTc{o˜]ä@“I7ž'ÇŠ‘* *¤ZÛE ž"CSêcãªä^'²‘,ܵè7 _œM5•;v‚@›b¼ãv„Ž‹…Ø+ŒD™<Éé˜ÀguUm ÑÑüvt–p]A»pˆ³€±­¤¡¯I%С0:þP¨yJˆäè&îbˆO•Ã&¥¡VbÝÅΣ‰/°Jȃº*Ñ9‰ +H=ŽS ú*?ÿ¬³¸¢ï$`DðùDД”^u2‘ë0:nM$JÀˆí)0¦JÆhú•qsgšEæý&€'«í(;J³ =VÊ5¤7_nUûtuY‰5 H’õw’Ô@%®¦ 1‘Æ| vq·ÔÌ œ– Ä׺¾B]܆7F’qHÂS ›$ªC<íÆû¡1]?®¢é™v$S³H«ÉõI«3M–¥™ ýÙMÂlæŠoºé–fqÌ1½òs%->tdÒ‡ÇÕæJP¯¯+Öä÷ª2WGΫ aÓ'¬B—ŽW á ºæŽ"9õ‰CW©è433È.Ú*£‘bÅDõR§<4‚åj +w¡ÈM•Djššö˜ƒÔà +Ýà4”z£$Í8’gPöìßÿQ*âh¤‡8snÚ56&<'h{¥hMoeHj¢tKR\u˜¢5¦ÚÓ¬#-­ÊV­Žš¿*¨×²|n$É*¢UСŠæ†f%Xé™1"ƒÊQIR…ü_`&à4ªÐÔ±Â%©ÉXAŽŽò´uͬBx¬ôñMº*ÒZÅŠ,;AÛx¨ c‘ßNB¥„,Ó<ÞÇäQ)|9 H~ñèB39€ºá*Nœ­‚±YGAÁ'"*óÚ¦åPßÑ¿ÉicÂÆ­ªÈÔBi|âÆ¡ñ‰Ú>ýç©õX)ņ§ÛsIÒ'ëNt‡&+*aêNntçñ‚¹¸sÇc@© CìEŸ‘Ü—"ž‹1:=1‡nö £Ã62Ül ô?U#ÆÇfoáù$´·ê´…VzzDc# 1š°«'Si/¿‡~ ³M̦·­s+ŸŠØ0MA\@G}³¸"h Lƒèè>Åd ô!Ñ“°O3!JÄLhÔä2Ò2j·˜gMwÂ>¹QI5*%_BaFCTYBðZ¡Ë¡E5ºŠ>Àªéf¬ Ø'6²‚ïdóE#ĤFòagh¡š³E ˆC¡L¯ÂdD¼Ç\Ô‚§œÈé›áªüï ê±ÎwJ2€sgE׆ãt¹äGTDqL¼!0y—¯ ЇX˜Ð‡èᙚ â@‰DÍ)iSi-HÒÙ¤öù>ÆÌqY lËÑ"I\L¤›‹-¨æ" é)‰á;¥ÿ'[Ѐ¬ ȸ°ˆ$ã²jdK ?.(X›f–è»áœEÌ=•‚DµËkí™–ZN˜¿·}!ŸÌbQQè‚£7ŠÞÎByâ²Â¦5¶iíû쪵ƒÊgyPSl£šÚ¨@ò {Ž”Áš±S&‹!QÃRt7Z|Óÿ2N™¾Òt£¾ "ðfq¿¤×*ÿª^5ÄRúWeË?ÉJ»BŒaj’]r#S‰%£å{˜¤ÓB>™},¥ë +2FºÑñ^rê +âu+O ¡³˜ÝŠ&×ÀòB$o24nR ÀI R÷8{TЪh§ •­[¶rrl¡¨ŠÜ1‰‡%ȱ¾^µ`n ´H¤|lJäØ™(ö;K$þÖŠiËØŠžVõ“tê-ÃeÉ š‡ÁBÙ¨sq,Ô Ô‚2 ^T¥±ÑîTÍõVhW!ï‹NÓÞˆºÓ +‘Í/ÆÑØJ·wñ™‚8H5¬«Ù1 :±Y 1ý™®ZA7à%R‹j¨&HDG“.V’NGù•*-E+šÄeËß4QÆó,8JôŽ–Ñ«~°j3m1•ë…,|šîh5à ‚ÐsÝbì¸Åëº =”Hi©"ȇŠ­",~°Ô@æ<½Yô2“|@9($Ä—-fzA¤-¦ÄÑByÝ Ÿ…,óÀ[kœŽéL¾E· }¨Œ«Ä]"Löº£½n×]Ñr¦&µ¢NÇFÑ\$vŒ§RÚµØ@àá‰ú´S ¯5ÏI昱©)Ù‚fÅùFFv»Ý}’E'C<…ú!qa GT(3Ä”£ãHÕ€‘¨E8•j˜šq `¾a¼øfìFt×ð>T=L))‘r&±^>¨—4‘¢D\6­`c¢œuݵ·R]ä.¶]¶¢/¨$žœ ^1˜ŒN+²)Ó …¿¢‰¼ÍsFßf&Òó¢-»("S£ƒË^öc%’5ò‰ éý®Š2·4 g.‘SA½#-½nAùŸÔvÐb1ÛlZÂ&?1£ÜøÞ7´j`z爉!¹ÅS³‹ä#‰`âÛ¸nÑU-"Æiö›„̽꧴ЗIg•R -‡Ö¬Ã,dæe‹Kþl¢ìe+3á7³l¯&%FTAíŪ˜¤ZFˆ—§!‚óÔM¸ûh7âëA hÜ ¤õÐÔ¡>ŽŠ£ù‡æ¶ƒ–OŸ3DNOeß »Péãªt¤Ê|Ms¹æ6(dhfúQigDÑÕ×fŽfl}‚ˆé®¯¥Å—ЀDl€|í ™Úm<  šËÔFRÓ®*)ÐAO8­äcMF"šJŽWŒ‡(3b¢H$åÂvÍ K( £phâ IK€µBo 6µjô–…g6î±/óßþv¸Œ¬#ÞZoë EÑ þš`A#·câ¦&h¶á¯›ïb"L¢nÑK–Á< N³ÅU3)4Í©…ÀÚ©2Þí#Á5éj¡ÍH-F:\j$^¡iPSó‘SZã¤í§À,šÑGÒzˆ:r˜qC‘&ZS±y´Ì]‹wƒV# ¼'¶ÇÓØÅ×µøŒ¡@rñɽ¢V"U™’ž:Š†ë’­ž)Ò<'yMðÈ”_ë7µû0–_-´Ü'PHB+BË­•E:ÐgÃUÐ :pMÇu„¨Ð­M+ˆ§ÒƒˆMƘº§RŽ¯‘[+Å+T” 7Pà ýŒÝ¬p)R˜)cà}§*ȈE†C‘}RØÚdx¨÷ò0£ƒÆ×3ª´‚^‚˜œ™ÆkO"š‰Û9  ȶkíXñh +Q¨ŠEÆÂÖ¢’ Œ´ñQ@+ês;º6 Ì@éQßRJÁªÈ:ˆšŽ<óËÒŽ$m¢0^”™·¹‹òìî\5“ÜH_(†zSì1$£@$ª ÊÁ +eÐA8Êî9Ñ2Ê(·XÆ.œ©•ö¨ø™~‰É.—IˆNîxkA~ɘ5Õ ‹CÖ§VOè.»»:™)\Xd¼@h*M LV¢`NfÚZ„Lw¤ ¹ƒ`ž0Np„:¶ FkçîéŠÅ¡Ô3–*ŽT/ÆÙæ$4[5w¬•^Toz6^o’s>…Ï€ˆFì.TmæÞ^P61ˆE¤5ÖS<2A$ô2 !KÄhe¥TÅ拓ÔàòG9Y¹_ ½wÏkƒ‰Ó¼àH4*CÓ©7€ÿÐí®WM¤?#…ßBð;×å·0iI±e@£BLè¡Ÿ QnÐJ¶"§c«Ló[ Nl•Í ^îÈQ¦±4±A +N UlFSŒd±¼QŽ£näºošÞ|aéhm¥VŠV +¥ +\œÝˆ™0Ä—¹xЀ¨O4ÀtO­‘)Ê»B=-„§%3w6mMro9Éõd‰´{$, lB ƒbðÕIge9;Ì~$æÐ)è†zk =°/ƒbðPîQ/¯z” ­ðN¹A6¸z°{FÚOÐÂ¥¸Ö:ç‘ÓL_|VÔ ž wb`Ou/»3¿“§±oBR¼$W¼8BwòNœ6Þ©Ð;ŠÚÑ"q%%­¼LgToe?ðD­0ô”“¾•Ê)kn¶%/ ”E¡SmJt†Ñˆ ¦ÙÜS÷$m‡à"oNL‚ãµaiÞÄr `"3mF7sÕB˜ÍfMë¤ iân%íP¡ ´ã8F8 %&ÈeÖ 0Š&©YžÐÆ5™IŒ•ROõÂÐM´ðÁH|ëòàÔ ¿ø’ñù`Âþ‹Ý_~õþÝ«7ØýâpØóÍßýîíûl»ÉÙ`!{†¶s’W˜ g'R©0صch¬œT êÖ{ÿcÊ"ö²°ÿ|Ä –LE1wÚçÖ-P‰õªÃĪ-˜YÁðxU8‘:gF„3_Á“ TÚ5þèô+ÈåÎS…ÇFÒ VLY¼À 5À¿¹šlÍemÆcÑ:S To['Z–ƒL³©)·7Ø hÀ(Ø †ÍA ×mBÕh.e(Dô2+Ôšx«¨2Îx&ŸæwÉháè)eÕÕox¾Øâ =_°ê°J´L•ȸœ4jÚ­‚(T@EX±À©~Oê…\Ke蛘B!ð{ú8¬úٻĀ +ªÚ™òȘM²NÈä£&˜þtI£Òíiõ§+A ³|`]Â%LÓÌDìa¥ðMþ Â_¡ÀÒõ9Ѥò]k%-±ŸJSZ)˜ŒŒ‰c“‰G¬¤ìMí¶«Äs³ÅRi˘Ìõ ­@]„êz¸Xm&RÉbžX&8`+ЩÉú!‹ýP)e OþLÅ™a¡ÇJr(¤Žx)â7º=›’rÃu`®$ux¡¨¤³gC‹€bÑÉOK }ñô°ËGEŸ9— +y,“–×@^I˜…뛄» +Ÿ<½qÒ,#DqÂü;gÚ¾ìg‘X¸cŒ›§ úA’Ù£2ŽR2M‰uŽ„C?­´g­hé"¸<+º/ ÅÆà¡“Z(š;ñݧälQˆíb znØÂy‰¹£¾£VÔÅÙ +ª­dÎÊ„<° “£DQ T߃*Óì„uW Îd²Ä+6Ð;¡þI£%Áh"£…¢M›qM`Ö ¸a7tî±È)„zs²ŠQB¡-töáøÜ ~žÀlú3²Y¥!¦ð*,—™`)êNòCЦÂï´¨•GS›ÂI ,›Ce4uP9"ÁhÁ#ˆë†Æ¹šc†Il&õ£ÐY&Ú…Ga>Š—e\'þÊT䯄8Í®›e‹ Û2'‘|¸´‡ÐäL‡ë\¡~„;L“ÊI£C4ŒP¦ZMôLôM飭+.u~Oï=¥l”Çd¼ ¦F;³ÞÙ ±ÿSm-˜¾„'wÄd¸¾HRAݳ¨¢(øqvVeØñ…Ô +ãR«B!c`IDAq¨ß´S¾4 +5t[° µÓQæ…þÆù£hP{ém’.IºF]2èb¦6+¸ÿÛm¹myÛ©=!†‰Fš¼…§/tpg`pÈÄiŠÍ%Döçåéa‚)o‘»mšˆþ÷º”(&š‰™ÝÍw唦qAw§ÒÀ˜öHPðÁùÌÇò†J4üÖ……ç”,Ã^ïV12%É–#o H!½%‰ñm\¡Šþ&¦T–Gê82|8%X.È<@#Ý(ú«j ±÷÷2öàÁ {EŠ’ÆÍEo97#ÐíWy*²ä¢'9®(ñ&AFU”ö©£> £l ­Yè2XÚÚy£ÜÆ–¹‰B |.¡ù³$V¹úÌ”îžõzÔì”2oY𥅃ª´³–ÖÈÑ‚¢$q„/a,ËôI\…ÐKÚ2QÝ`Ôïdñå5*.ZxIF4ÕdFòtx§WXeÏ,bÆ(ÝJTÐf¾i^tw3Ö‡àÜ#W‚X´¸ÓÆ:«Î‘ù0Cž?tBšC–¹9„x€áír‘9f!JŒ¬«N)_ËF™•i»›wðhKM4°Rù´È~™Ë’°?V"CøÂLM4:|1R s¢~AaÙ‚¹‚ÝîW¾f‚  "ùx( +Ò-È€3'«+zžË4?¥¸ÃÁI0*ýç¾™ª%8‘z$e‰ðŽÆHfêrJ5IÖF3ñ8FyR/S¾+áøF¥$¬Û ªŒ¼W¤aA•r¨°Â²KE@sG[ +¨/W*å‰ë_z}ž»#Ž†•BÇ)ËM\Vøª|gw2±¢ÚèFš·,Ƹ…lÂsi’é/"±‚*C]•yß ïQFÚ–ÙêÅšIƒ'…úHÍh¯Ì-X ùá-òD ‚ì/•žØÂ|$Æ–— +fK²$ŸØ]ès¬Tj žAçÌÌG^W)#årVÎ+$!b-SªÆ+/ÝM‚¸PÊ^•´f±BÁÀt;ÔÅpöª°D<ƒ§ªbÆJŒÎ’bT‹``Ü©ôŠ©2gT:Йž[µ²[†(@‡"½ë/äÚ1@µ›¶o`ÞB+9-šTú™>‚Ö™ÞŠ% +‡˜J Ìö“pz´e1£JEáÇ¡HÈÞⴢ̺‰aíÔŒª¬ËGœõdƒ†,’‰97@<Ùs€E³ÜÑj0Ã2åÖF…·|òõçL W¡ë” ÷颻 »ëaI­AO.AP·i/Å›¼kárZXKBÅ1Ÿi¦Ó*,áMÂPÅ­•,5ìÈí£’ç1îHŽ_f¶);eÅ)ÐPœÙ¢ Á®d= ¹–ìÿ õ¡» •-Æë,ËoæF¥ð-F ­83$ÎáãôfCÀƒð(ÄÀÑ…I®3ÑDR1Ü„š¿SÎÄhùt(S]f6¬Ú\V2§+‰T›+ù@UÂ3$fP&×;+¤†an(Û+"$tÐ<É…ªdj†í+e€º“\mÒ lySiŽê>Îèhª~“ô,çš½ Šõ:âç +áwD]E†r…ï-ã„r¢Q Ÿ·†ëé (TÁwIl;o"¯%Õà•:å6Tš»9•#ÃŒXÝr¡Ã0§‹­Œ¯É,OL@;™B$ÇÜ‚´›dN·‚5h “l°òR¼a&Ì@i’K3“ðOª°h<)s2Hí„“’‰” &žþµ#BQq¡%o"N„ŒÒÍŒPÀã˜æT…ëð±3 l~`‘0L½‚UX +¥Ø•Ñ@àUV‰èŽ3}ÌfW®Ê(š¸%5Å>œÄ£AÝG…UÙ5±yKh©™Ì0î¨â´ÈJ&‹¤D@6"N“åŒ ÜÅÁ-DkÐ< R¨cª +&²^Šâ˜ÞT`oŒhÂ`…2MR]øÕ"YA,+‚¢ «Åôöî!–²bhò)Ûó{ +€ªÊ1Ãt #LÚ]¶¯iÁgÁo9Ñd]Ì£GÔ7m&„k“l–ඃªtñQ BÃvÔAŸº3Ž–0@A8AÙ3” Ò{g©ZHEQ‘Á@wãdµý}esà`Ý1¶€@’;üAŽ!Iƒ#Vê/â"‰~gJ¾å¥÷ËËy;ìC•„=ŽôUF¥¢IšxTðPPÒt&¡b…¥š|3#@ö—^^Œ#õîèÈb%dJ¯JÚQYA\UðVU…26X…ªàd–;Æ$¯zã +Co4M2ÞM![b zºiW_n™%$s¢‰ª“RhµºK ÝF#vfRÔ*HÓŠ‡2—§ bÉb"˜“­Lˆ ™ˆ€qÛ¼RÙá L¤9!([ ¾d–_㈸ ©¢)@%“£Œš9µ„e–otŠÊ7HE±Ui?å„›@›ÜWHdŠå^Ë„)Í,€ +¬¡ÿp/æ¡~•©ž +p&æVCÃf5PˆMŒ· ÒRhÜËR”x¥ZÞáû¦Ç0GëQ(ÆÂñRÍLC#§hK'ÂQÂFlá)XËLEW©éu0$·Œr¿dæqÊ12\ˆ«àpK&Æ49¶GÆQS +PÞ™ '#€Á$ŸkÓë¨1ï¸@ÞT_”r"Ì™D1”pe! $ÔŠc¢Vž-l’HIbíT™­`©iT¼VÕf%J@/[¦]Ëþ¥Š–À›‰F>T—dÖ©ÒBDo¶*®µ +­›l âØðüm4ÈÚ¶ø]¶0€[P)VŽ¸Üˆ|š®¸؊á§l%KŒ AG,—žZ0= [Ò4¶0d6‰“5È6Ö8u)4R Bz0z@@éÉ™Â!fL¦ SBtŒZˆF¢…òݳ…,ÒEÉŒ½e££5$¯0”ñØDUæi¦¨ÊDù–*–q=L«Ìa¹ÁM1Sx'!–Ä»TQµ<%†’’[Ó+›X­= ¡j²CÿÔÊ ÑD‘k¥™J³ËDs&é4måÒ(ºÔÀû +ýæ~%Q Ò™½llØ GÛ脬, +#)v55 6¨Ùñzó¾¶þe|ÌŒh‰³~!™¦ÓN–V)Ç m0"DQ]ráA ²_‚/©¶é3Dó…Ùn5'äj„œ +¨=õ®)zØ™ +ßtj’øÄŽÊQ³§Äï‰e9ƒ™×ëVpBF? Á Š‰±¨Ú•'KóJ|!Ó¼Ò”»K£³LSPÕt"H&t0eH‚-H@‘‘§(^”¹ñh4’áÐÅT 9Q6©¤ì5•úDfˆódÙ½Á¤aË÷¼¤XQBÊÜäA¶²´Âµþ³EÔ‰^-Œ Óí tÑË®´íô3v4€¼DÑ*]R%-YºJJ +nÄÈ|k¡¯%œ©q5ƒ#Y'òÞîUBÄlœÎ˼MˆC ’LÅ5/œ^2Û*ߟkø¬‰²˜à]ÞRg) +Ž¾˜(S# AÃg0åܤ\‹ä-“ZAî#¿ªÄx«a[@— 2Q óV9s‘ÔB™Ñ‚ù·­µ"¶è9l5ZÞOgÉ»…ŠxˆeJÈŽÜ“X8s4a3Id h cc¿\Ó ‘%|81ÇÖo'K¤g˜*Õ_1ŸDäÛ¤üîæÊ¢‘•Dƒ¢5ƒA&ù‚¥Ïí™/é¹!E¼hqMÄ–3'2מö©’(1ߊ²oXšL¯±b£J#VÔl¹eˆc¦…Sªœ{FœR‹ +‹–TÇãg&EÂ-íN§"¨8ÒÈÏ¡cV +§Ê¿ÎÔqtRF pڤ̎T¦ˆ¬SO¨Ì75)àO"B¢QŽ^ D‚•'šéš’½û_þ¥GLU@˹®´ÜFÛŸ™”£¤† ž˜æÇ|–ò4¡ßâ…%,€kRšA}þí²E•JxI¶‘=du®xO‰s%£,O•Rºy7ÙãIY%ÈËIWÇ–°kf¨“Q‹Q?5Y¤æq’‘hÚY‹ØZŒýªÈ2p?Ýîßh=±~q¾‘XÈĬgciÑ–¹E[:K~‘è·A‹Ä¨8µ0á«Xè5!(£WUF>kAƒ:ûè<.e|YqYsKÅ-SÔ¤’LÆôD¡FÊÇ\t«°èç->¢±@¡„G%2”ŽI¼v!}rZ:H8 eEK< X[GÅbó¡ÉX™ÙWÉ»³õ.é3}RT‰½¨¥ +„>:q ÃÐc-ƒá»'ÎC6ÂE;Ɔ…Ê Ge&JÕQ©9+­uÜQc¢–>Æ%‘²¸L „ÀÚ’B®øíhn† *ô¢EÇ7É:)]@¡Ã,( &G›iüT 6{~B®Fêb‚S5¨báéEf°%ç +™2ÉÓ\Ofî +†Á3 +ÚO) [Œ¶ibg”/ŽBÁD•Ü–Z:È|Y#[QH#L€s…J¹½XAÊÉ +­IÊÊ… G¦ðˆV!ÂÌLjÓÜ›!š } +vOIÖp¨_*„€¹ËBà”nŽ†E]“'kÑF$a²Ï£u৊`K·£)Ü2ÙÐ>LK@e@x`‚>ËüEˆ²pIL²ŒEVš’· „HÂÉke %&U®HRPˆwžÙU˜bFH6,ˆ£ ‹9×ÎìŒd c3è&Ê^9(3h‚qÔ‰¹¯'a˜H+É€~@*4a†¤,Kb€Ä³J9¡±—€ÕÌ«j‡6yK›[^JF2x1à:aK2Mw—«õ#­Žî6 +©Ì2¤:H Øæ=’HN9¾Ž=“á +‰H8¿“v(Ègl)a¨i2ÏŠ[gæK=HŽJÀÈK-<›V9æ\ŽIŽ}6Ò©õœX‚|eåû§¨+·9ã>•¡y ˜°–¾i6ø‡¦Î)FF^'æô†&6œvs + ÊVFpFQ¶ÖJèÝ⥛h Rjì¾$€èØ2Ìi„N18<Œoç„J)J:!~؆¾ÐÙÏÓýŠ=A{GóvÑ_hþU&x%Ê­˜ŸZùî«Â™Sù¬•§ùØ™²pðpÙÀL¢˜yVÊSES=Uº*š«äAÊO‰„QˆåOÑуg!žôÓŠSÑá„çN*ÄWeƒœ„ ½EˆaGq² ™Ïíéìd¼l¤ ‘4Og-¨«BÌ’GöJKõMæ§Ε™2ÛQ½<¨ )i&9¨ÎbÓF“Y‘…ŒÖ9æÖ ]#f%¤jÖ Ú ¬ôfðá9 Ü…X}<ºË슩]tÅìÌÓ½hÍF¥†ÊBOùš8 NôOÝYwʤƒ +Y9YQ›M”™keÞʆðÛqúž¥sò¨ÈMI¤Ü·¸I2~ô@Tïy¸C6 †r‹n3™Ë–¤W9/huUfî–DŸ¿Šç1=”:ɦ˜fTÝ¥¤ã¸$C 7YíÌ…¤$•›—¡’†ØôdŠ§^¼@…‹ç®I­$Q)­’½ÑĬ8=¬DœÔØ2]Ó5M»*²üÌ:ßS[ËoÍÁϪc7ÚàX!¼‹"À‹R+G¿òDVý=ÛA™ …Ž!Æ”*ûO4"ÀiQTp¹_éD…yI-x0’S…¹BÝ1Kba€¥•º\$ã¥9ÇÜ\rc뀀Ë¡%t¼ªs¥€S(ƒ`òv‚å\Š|J\J³·L±í{õE3q‰gi +þe×0 ªÂÇ£A¦(±ÑüÀ ³Ií˜%¦ÅïYÀYÇe¢Y&o™ñ•›:Q1ñÌQ­:%0L‚O ‚,ª˜!j¬”e%Ýg·R +ÅÄÃ/uØBwW…‚µ§lv2T0){ëÙõóѽ†ýÄÈmz…-.gj–¬@“HÙ—RÉÕ÷£yÌ­·‹Jªµ“D †A:“Å%ãIsJ\tTÙH_ ÏÙ¶Š~–uù.KÝ!áAÜtÒ`ÿÊzU±^W•„)‰2ï‰Ì¿ÎÜ,“|Û´qe„sUN´pm·®2è>”¤™TQno£ UÉè‰w,Œ¨¥Åhâ²Rè_µ8V’²R UÐ Ã +:Éé%R¼Ñ¨#ü>sI;W_œ¬s^M½3 ùÔ†@Ø1!—ÜÀü^Ù«]Ì¿CË>È]á•|Ðó@÷DÒ'x ——àΊ‹ +Ê1˜æ™ñœŠ J!š ` ¶Îd€Ü}ø<‹¬ý©{Ë‚‚v“]U]Å"×zfÕ]b®ð#ó¢€có>ߺM1ÆT-7…­©î»(£Ä?‚ƒÀ¨Ù·ÃnA•FB}hǤ/Öç0ÕýüR5d ±SºbÃËmÛ‡M€3.Îη£Ä}Éee}—5Ç©÷+ƒîÛï8¾Eèš )PXgW¥ÉxÞC´¤T’‚@oeGgþŽ:»¶†ôȽlÀAÝ€ÄU@Ÿ©Eºb3hó`˜(ËgE?kGø56$á +àB§ bÍ¿öÝ3j5@Í£!À¨q¶ýU*ãœ`<”íw¬'qT:!7^¡ŒÏ ŒEaS°;í”t k@‰dúV'óo="œ½£2‚óÞ‹0µI¬åùÎ §ŽÜ 4àdy±€Í-ŸMi,ªkútN¼:xÍHgß=_«tWãk;ŽÞëÝ#W¾z4àÍôÊ|Uå0z°û„ûŸ¨‚xÉmT‹8Ìf€w”r"ýJ¨<ªZvqʱÐ5º’3v›ÈX'NDžëÄ'“\bÖ ÷^¤>mê?‘˜O²+²¡“+0R¤P v™E +Ó—Æ %x…È-‚H£.I¤€àŽà’§@bt1¨C²ló1ù™;_…Û0–û·¢=Íè”y›—÷^}×Ç×xz¡IH½À:¸T ²t?ö¢íâ9àµC’JôÒ㧢 žxÏWó/Ž³ÑWƒ:ǵ#Ù@͆(')}ƒ™íÐßz¡\©Ã'•h×ñ“/gtèÆ]Å l(¡Fé ¤^ƒ]eÄÀ´3æ9S A"Æñmæ +‹ «îPô0±¿z´­Òv‹ ÅŸò²CÜUŠ¾Û¢‘!U®› µXp£æ¦›õèÕõòQT”˜®¶¡1F]¯×}i æfªQKÉÁÎ ®=`!_ìÂC¡CYwn–.šJ“Þz…h×ýiº8½õ¨ackµã>éÚ×^p¨ÿìÈ÷­ïæð"}¼z¤-ý8 š„ŽB·/ŸÇÄvÜÜÖãlB _¿M½Ô¬¢sÊá²ÆÝ_4Pyj”Ö ùˆò¼õÒPbÖ=)Í}F^,†âUÓ ºí,ã²Ý „ÁòÑX»ƒoÜUxƒ>ê"#ê¯q­ë†zæë` –™Œ”Pt蕱·&(Tëoî ÔG‡5o¼_è:êÝÇÒ©É)(ÃX‚= #R2붎¶ó.¹Ð‰°¿°F¬0”ˆ÷Ì3ÍW3ÅÝÂДÀ[QGØ׳µ®¹&¼kâð(d%R^Y/õÝ>üLý7ÔCIb7*€W±&"£ʯô0ÎÃ#Zå×õdæØÇÏ*œŽ§š-ìኯñää×ܸº° N;‰/ñqFƒZàkT…ÜsÚþç+Z:²þ2Y¯ãªVX1/JšˆÚkåHQ”''WñÛÑﹿ£1l…‹øÈEÅ丯ûÌ¿5Š¦'!I8®C o°4?Vc<<ýµç&}[ +hªÜŠ¡{0‹€°‡¸ÿŽöc>²›)Hû«W!†ž§.µ’Aâò)ÊË€ +„Þ€åï­CV·¾K‰cÌO_Ô´½Ô3"ïÞšïr»¹#Ù\åA– +e°‡Æ÷bQ» ­n˜`°4ŠT 쯔P†Ç ºJLdjõPÌ°í@YÖ†åê÷W´äšÔ{E'úʸ8@q¡Ôˆ«›þ’ï=úÛ´C–}¦·^…yº¸$˯¡¾…2…âÕ‹ßÄðdûv+…^÷hï=â¦!ßÔe©ãþò8) +\ˆO¹Ç$Á *IôÒA¾¼f@Döˆ~íÄ A%™^Ãî*<Ö2Uʼnàù ”ÂŽ,w2âNã½ÇyIÑêä%­hÞ¾ûbY1pI,Šž€Ÿ-_ö`{$$‚ü¡Û¶ ڳ׳Šò$P*td`}!XƒncWå”#.bâd …æ¿õˆ›— ArHÀûqŽÆÈŒvb©–"–Ê*¤ïÚ|SV9›ü‚ÑsQ×9¡ÔŒÝÐ?&þž¤!‘_QÁ†‚² ¦\5z„ƒÁ¢¬ºWŠj§ÏãêþrfÞqcyÎ^J§yý„«€yÁù+°57·øÞ& +8OM¼ÊCYÎAû DáƒèT;C{C¯uä¹´¹wl —Eùâk°Ö*Ôw‡²;ì O½ÂNeEý­—üacÆ‚&TVS ‘µDø«¡´ÝÒ¾wB?P™r!ë¨dgSU&~VÔsÍß0#L䂉҆P‚µÔG¥«Ä”N£+¬Ø/ã¡Âñœðµ"ÿ‚Ѓ&[µÛáAa§ÇŠ^¯çø!Ô‘x£†½ªé½†LÊ>QD¥s8ìo³µ*9á¤Äé[sÈ,=¥¿*qÀ¢ÀYœ>ùקCí’õ{EÌš£þеM'¯éœ ï‹—ˆ¥ǫ̃‚"ék/uÅzèŠ]×0Æ 4DÑr}Ѩ_ó°8®/î¥Ò pÉTݽ¦†<-jõ3t¿€%ǽb+ÂUˆévfîd*RdsóÎñdùµÚ­YzβYQ Å®ëJ!ËyÔÕ¤Ñj\Ör^zütJ[ºMõ¦•ôûq(þÉn½È9v¨hµÌ°½wørm|í¤&s3¾Ûù5Ã7Ôn€GŠ % d›µ0ÉÍ› +HîØÿ·]¢Ø…w%· [ EvE”$FØB ó6%.­¢tõVjbt²ì +pÑ·%ݱQº¾s?%ÜOÙI¢O-’qQ ȼ Þzüu'‡œ¶_ᜑ(ÑšÜCBõfCƒÞ ´t,u\YqÑDLràZC%æR´SN³ŸNWmï¨Z¾ 到O|KÏ~HK-;¢`(»>˜E¤ÿIC‡Á–Ú]<…˜pMˆ¤(¾øPëÆ™ó SØ&LÄ)ÕÑFÜÀ•IÝoÇ!ƒ5)M{8] »>˼̷Ìñ­6µrÌ´üTÞ(FrTëî(\-‡ë 9üy2³¼´Ðž†”‹KÂCîÁΘÐÚö§ä;z[¥Ô%ëÍT‹¸®lËd|íçCñªá+Ûnh©ãŠ$ã$j²‡Cþ‹éq¯sã½l2y•ÌM.unñdz5]YµÎ`…ø*jëWáe-,û(–€ø/àbÙjïñ2p9g ÷Z¤pnI{¢ ’¯ÄKµ§ûr‘Á«¢&0RïœÙ¸ûl[Ö‡Æ$¡ò +»ÂÕp‘ÇÐiÂB/`ÅPÀ•øF;A¢ÁŸI­ºçæÊÊ%ä’èȘ >Š(ÖˆyêüWT«bÖO}çÊý»ÊkG”+Êã=¡@íá,*N£¡h{|«I4=ÐÐ"NBÃô,G¤Ã&Üvð¦Es*¯¤/–C¸`Ìp7V÷ÄÓ“þ™ˆAzv¡‚çn a_7a½ +C£=ìS -ŸI +ðÖjTG”Ü/ ÷wr9oß’ÖÛ“º3½ëJáÃeRu:c€&û3*Óºóq$³gpùñÐ ¾e|…z¦þœYáMp+SÀ>å÷€äzrû/×ØN’ç–h/ÍÄdËfÒCgÝiÿ>Vƒ¨Rù¡.¦ùٙ紶Å&ô÷ßÇ£õy–S$ºÚ1ÔÞ§.¥ä>ÚAØMbÌõ¢KßÝ”Ì'ŠT·9O!$j\wÆP QŸz½—ë]òÀG›ô]J0$gø }•I¡în”› ¢×).‡ è +•Æs!ΉëÌàĸúII•Ó]Ûôñ +Þ:J¤Íºª¦W艽5ÄÈ| "Þ¾ÎÈÛ +®Ób;äÌ.š +¬úýÞÛÿœà¥ñD^Vk«D1‚ÿãªx*™’læÞMßN1P¥mO£‘¾ùf~+°"åÂrB50ÀòòïÙË‘)°mµ‡U¶™WÓþÂÑrS¬{û"­úÚãfÓ>?±=kÚX“^]›p/BB„–#…&a&+®"²º³,òö%Z‹ý…· ‚ÜbEV7—$«ø’/G ¼íÔçû +­²“#ÖßBgC¡úsÊû·Èx”[î LuÓúÑÜ‚þ¡á0"…@š]M|œÎŸk¨OÒåÀŠt|mjuöÒ@-Gø]Ïâ*ý,ye“P»‰¢óyÌ’‘)4À­ +·F£r QÄh¸~VˆjýüŽÅ픋Ñx´©ÑjkuQ…1 ­,naîZ'¶YOÃóÞ…+.®Ùùó[k†Véc"4QexˆîDNØ{r6†7âÓϲïê–Ã'~ô˨W§h¸\éúÔ—¬°¼/id£B¡¸Ÿ*_ysY:Mἦ‘ ÈÓ¾^œé5•q<'¯±6yó2L&à- ¨’f£©XÃëç3~Jªì€†ÅCŒ­i5‰X}C€Ý?˜ +¶\®¾þÚ 3¨NCDg!TENøƒèùV¾BÁ˜j£¼èëÉ@^ܨL&<„Ê’>–Q†à®?Ç„o§æX äáƳ±$õ"}íɹƒ¼²%£WÄAÛjá•.2òðú’VÔÕˆ5„V™DÔ;‡·À[ q¸k»N9¡»·¿•6õ¤¯µU¸"h‹ªGG€: uŠdql4·®F ÜMãúÍ#¬à›?,AÀ`I‰—=äšDËQ7o H~C½×Æ ãVÄLßÀmæï…êoYîðD\„†§'l”´°Ö£õqë›%té®B*+Ø3ÑÀŽˆlQðÁà·Æõ^†-˜SRaëö׈’ÅS˜”}†ðë‘Hk[×p™à ÜÈI§jRÃneʆ37B©U’w]­Z©µ?U[h”cVôa¯½P¯fïEu†`”•GÙ‚kF…ØK©)ƒ—'£­rÞ’&75ö5»«¸åþÀ©U@lmåÆxÜ J±ˆB­‡vQÕC°9\>+õC½ @G9Â̧‘ßKÄ"ë†bs÷ÍͽçÖë²îŒšÊk1g…;:vh2¿°Cÿ¶1,Èp€a¹B+ ßëdϤ²noI[Ûí €mWTð·à/¿'ØFNá¯ò +ÿ•K˜=öï©‚þÇ׌¿ù·ÿóüúÉòÇ¿ÿ?ÿü¿?þæ?üíûÃ_þò§þ§ÿöÿüø_þðÿôã·Ÿÿüÿ~üùýøŸþøùÏÿüóÿýsœôëoü÷?ýùOøËŸþøã:Å/.î~®à7èÿ•ÃÉX«³¨Ž‹Æ`òÈw¯ÉOîÑdÁB‰½%)‡°â*h‡¬éᇵú¬¸x +2iëÞä9)=; å[•8½¾ä\®%%ÄS+ "÷¨-°P4 +@Z³áD´î4Ò`Ò«B1À¤Þ6°9±!¯å 8ÈÖ.l4@¿ˆËl¡eÚcjX¬˜KœfW8M­¦¡ gû(P„V`q£Ñ섬äeê2ëðáñ5 š¹:amf‚Sý}ˆ k«òavÛc…é!ô–W`GDn.ŽAzt£å$½÷ñ·dÖÿÇ +KPåáœÄ—€ F!œ0U’ô˜Dóµ2WŒèÑšÇ@’"NÐ[(T€¤ü¬ ‚`ˆÊ‚Å!ÛÍÊ^MÙ­á‹/ûJmñ +-6 ¡®¯;¯^H}BƒçóA)¹æm^0ÑZá׬Z°+†é*dôï£è¤T œ+È1ÚÛ¶lOô5ƒŠš Ð%6ª£Ø­ÄÀÓòú cÀÁ.«tÍîؘÂñËS~&Ýv†NˆÒ ¡ßè„"ø!h~—(=CÞäó1ãèè«`¥§œ¯FãêýÝ2TžÃ;ß"D¢(U¿¶•ÌÜ>`Ì-mû‰SʵÆÍØåYR(7íDZæÓÈ[aË"·Ò… Ýú6ïÿuš?(n; jw'WUò5@E¤“ìµ:?”„§2'@áµÁ¬hH<êÛ·îXóמEçE QnÞð4dÂÝá¾&®.‹‘¢{¶îºf.ëãè(š 0ñŠ¯‡UæºãWèSÆ<Ñ+¨ÊÐÇp„6ˆ3Ó²{ÎS5{Ì[*HF•Jàf»G!Ü£GÅ»'GÜåyÔ@§G‡øÑ‘*i_(eÆ™º©%!îR#ºvgÛ02¸ +±Ñ7ZÀ¸% ¼÷¸Üp0~IÐí3½öº;(Û£HÆœw—^ÍŠ˜ëÆt&–{]Â&›ƒ›4ŒXóמÉа¬ãÍ[ÿv5Á™ZaŽFõ^7X2Iz¾öøj¿uý•­ »H°£è¢^à¡i»ˆÑ••7`CøME‡¡ôÒ7ß’ÈYí”À· ”>°íu»ÒBPsÃG¹˜ÿ«waƒÁËm&ŒFSù¼èúôxFmWÍà‰Ññ_3ŸgrMsÚë+H^Ð!×I̵¢ÞW3å²6B,Àét6<Ílãúéšÿa*t +—Cy¤=™€˜«{ØaU*=äÒk˜L¼5¬9•]™yoɹ®Á„XF=|m7›.E”cM(ò@à¨æ§!®.<”X— +FÜÏ·j‹é§± @ ,êäoŸ'w6q¬_65±xqsðÐ@qƒªèÊ¡,?ÚŽÏ’WCÏVY{r÷à|`è±Ç—`JôPjõXüh$'̯¡¿¹“ðEŸnãRáìB æoêÑ4 ™CCš¾bYÄreÉn E©e?ý,PæA:(ê< ¥ÆâO)Šï =4b”½4棿 } .»À˜WÔ/Øxka³¦ŒÙiˆ×²Ý«²8÷ûó[À<Ì&`ª‚yP=Ö·U*6­ê­Q"c_‡ÓÇx-~u…^9ädÊZV#œl V&ßöADÖÉNå +y(´ðúA§¦Vù<Òܪó‚Þ;Ü0&&gM•°õ³BðQXÃÿ4îµùô¬^I€r‡¬.oa‡wGÉ™F7¯ÝÑù~&íBÌDÒ’´,6|L)wñ¦PK\uÌÐIìòjô^n?i>FÕu§ ×•½ÄØ`7*¤„µÌ;ªÊ¬GzE_^ˆ´`4Ñ (Ô†¬F9‰•òè[Åtjˆ0Oý«C¹u@ýÅBÁE2áZyZ,&_®c'z„ø® +fX«¬2°¾{ß>Ïy›¸dö‹…E¨ â¡„:t!â@Ø(¬ý`ãù×à¿—ëS™Æp/Z$ŽÎÊ”©¯´ítçZË0 ZÙ¸©©&¸‹]yWmô ƒâ æ°×-…|pè"å`€@º ð,ùqÌ¥Ðudk]º›8¯êtc< b° £7¦8FptÁ¹R¦ªß\A½Ý¥¨^Ãr䬦ÍõknàõaË®õ¦~gû„d| +)5-xDž>5óôšŠŽP_³= ¸Õ€™)íóháû´= ƒKwKÕj1ëõ}ô@¹‡Ð©rXéóÙÇ¢ÞpèEls ]./­×g(x¿5{…/müAiRo¸d¾é‘ZD¡Ù¼z<¯aÄ}Bf^zx#?ʸú:×/Žƒô.R–Y à€Þ(Ú0WÌËV²ÖmÝб†:èÃvꥠ 0S +Œ]å¦ì”V²Ò×£âÉò×ø¬MÌZ°tê=¢æÃ3Ï* …ÇúÛq`Žû;Ö—ªok«ðÖp`tg4ü¢Q­|µÐmÑ5m­Ü~hNœ*Š2×€êÆ¥© :œ³2¦dS}5F¼ä‚OCܺÀ³}vnjÅêR, òìï øô +ú[ãÆ–TUv97ïæåÔ냀RÏZú)ÒÓ¿±‹a Ì$ýÝ·îHT&ï¡é[ÃÀ”ð¹e/¨¯‹©J¥±ßÍë¡X{¶dòý=ðuËÓp†llàÑ„[óó-lx<Ì,Jx¬äýS"Èr, _æfHN÷1wA³X£Q8¯`dnµâ§0‘Ó¿ô +Úpbãã¾mk on¬Z¸a.¸}~„ãÝØþy‰•ÎªTÄë”×à$m - Š» †vû†ªõɺ¾Æçˆx!0y™T>7ê­ÜðC—zmœèEl"!ìÄ“¡Ëqëà`Uˆ;4h¯8ÖgÊÿÑ„†Æ~È)ø6eXA"pS{?¡ÊÜÄú®›ZRlx=Úv¦>Ü]³@¢¹vî‘)¶VñÃZl*”«¿¼íw +ä­³À$ÈÆú +<Ì{C#ÌŸvÀù‹Æ¦3Ik¥5` vùĸh©MbEi¨Œ|¶<Ãbt£Cÿþ{`3 ÙðaÐF}Ç÷ˆ».®½8Á.9S….ûø¹À3!2H±Ãb’F¤…)…WîãÚé‡J“+X L§ë»´„ù(ŠŠä£Ûž/á-È LÌ3û^qo ¿˜v_‘~Ñú %ϵDÀµDjWG£šÃÜkøžxÔ½ªiž T· º8¼«ÓÖ­($ÀÈ Óe¬ÄfDzÛHŽà‹ÝÙtÅ&LqL$±- ¬«*8w¨ØêçuƒXcÊáý­OÓÚ€†gëz™.¢ê‘"|d*¸#yá´ME’غ–˜Bm»w©w,ðOªóÑÐNCÛ w(ŠÞ§ç*5D’ÈíRs-ÏÕoy³WCi¡ß,ñ§•±Û™²ãpëÅaȯû‡—;râvÀ¯á{šã¸Ž¾ÁÊZ¯ Pk<êûÒ›8qùk&¾¢š·iŒ+´a4»TËãë†äÙÕ › wö‚ô0J3êt{§˜S@>cŸˆ3Çn¬~»Š`Z f2àèó^«}í¡åªQ6„ù#Ž€+ ŽTÎqA·W¥J¢ûLh(ÄÀ™ðFjœ ¸7gB„<¤a⸷FïºÞcs$s +Žäø|ÒF ë~jïSB’ 0ÁPt€y#µ®úÙÀ/Uœ‚F9"Ö§Q^úz¹‹±¥7TØÖÅ!Ç7£PÅçuÝGº+DyÎg,/†ò)·ø'¬‘¢õVË”'÷Rmp¯ ×/B\óƒ HæÛ‚Ð "–&,$¹ËE®ù‡” 5!ßÌ—ñ†²÷7T‚¾8ε•RxœU7ͼîPIƒ +ðÖCòWÝîv[‘æ‹^9üL Ÿ]Ö‡¶8Aˆ£è-ÕL +ÖH·8ç#žê™åÛÎ5Ù Q Âz¡\3RÊ5IhA ¦H}‰3¡d·?¦‡za%"i;„[™ÕûçD®åEkŸ—Cž Kž=.7Ó—”z`(_ +o3;l(:„‡ÕÍ~ AjŸÃÆBqJçrCÆRñ¡ˆ{ŸšJáåj;K{i£ø4Äx‰Ožo±zRE¯k‚bpšß>ÇÚöc}^³—Ny[˜ Vwd\ÓÜׄRC™¡ÀdœOE>¡$Êí¢ +Ee÷µÇO»äoöSÅç/:Yþ’UO _0yZ:ûÞ–UÍa"ôÀÇß…¢,iº{Ã…©ôN‹ÙäÆKdÅzo¡­º…¶Î–ð­ÂÔé‚·š¢€-äç¯p… ª5.5%ÔWVÀž: +ZŽßµ~)ßE/U9eMƒ$Ž7UekV \°^`•ÙŽœôXHP B/}žÉÕ C+5*ˆSyØñ8°Ìè! Ÿ@æíÑÃíV„•¦®ØõÍÙ,w°QÖP†pªÏÉŠ¾«¦ùV ”ÜR»S³ ñ×¾èAL2Dh­é%2õk/l ”.éÚí8aªæ|…8,fÛõ„Ö°‹âkŸv£\a5Ò._g˜8¶p†!TfT !ö PúÞ#Ôâ{›B9e åJQGÁÞ‚›®Á U[óQÊ\*æà×ÏDÎrQUêõ80mÁý¦¯ˆ ‹wä +IÅ“Gš–‘®¨ûv·¸ÝÇíŒ^ NÃ&+oÔ¶ë7F‚TÉéA*Ë%"‡­t¶GqÌs&à Q—= %;l©ótèåŒ{²í³‡Hèçsî+}q ­!¤ÄX¤)$zè 랥I`d9ÆWçÞÄ™.Hv§†Ï"ú ðE àN‚Nt¬6P`vÇ]ÞëµCÞwåέo-±·N +|õ¦À—¸®9vhžPãÚzja#67­hZ2[‘ãÕJ}ë[€­$TñlR@äå(=ØDkÀïâµO +ÈwÉNa8X—³›% + ‚…w @·"'Aõ’ïe³'>­ÎxZ»©gÁ°èûv÷_ET·¼Oq‚ÐFËþjÚÌ]ÊdÞÉ·T\f¶þ;;f·•Ðél˜¸Ý÷{(–Ïà½w®|=DòH'3ÛçsjJ”à¾èqo8Û +ÅZ;eù×^À{ÕÏ]/óðLŒØpG&4´]E’ŠºüMÛevWÑ#?(‰*o‘ì®ÑÆp¨7‡éקY}Õ…óÖA•ž(÷FØTƒL ð³l€DF©<'RàT2¯sn|=A(õQ.…˜¾"l«G¨'•]âé€&ãéÜ5Ž¡º[_ +œãôHÛœµ•F¢–X¸CÀ_Z¡l¬ÀîšjÀø¢é¶ú`{^“<å"™§ã/' bµ“Wßvu"añ¯=â3½õºP…ûê8pu’ÖàCº3zôâjd9®ÃE™£‰‡êæe3® ª€1Ûï÷^·¯Ç=SK »2Îï²í²ÉRþ$`¦“DpEáµ2‹¾÷ –Â`›×^ЈSóÒƒ}ÚÑÇ»ÞU±X·dßP¿ÔÍb‡fœ\ߊû¦º•7饘šÒä¾îÊùÚãumŽ,ék/ÌÚU;âÃf˜k¬R,1S”YÑ¡?0IgŠpÄŒ vDI™¼$É\eý+SåC~ +Ôͼ&Wôè@ÒJf'9Ó-l)¼æa¨n› †F¹OÍØ ð¤PRI늞â<ܲõka ³áAÀeJhþ~é”}&/TÓ6?«0Hýê,ë5©x™£˜Ák²fÛ@/O˜k0Þ}ý8Rú32 ‰]à‹àßU×v5”Âï®tt"ß{°æöq×^gè|(4¨_ +¾$O‹¬× –ÃZL 0à¾U\¾môŠìts€6<賕VI•* Tf^´_Å»@Œ ÃwžÄ·ïnu+ûëV†œý±y×¼ñÖy—úé¤÷Á8–',ºT*9L=!£ái +FØIðrUiÂh(œ%Ž¡U)zçãAá¦]§@WÃÚ` žcÞ-DàÃ@!¢Mh) Ç"ªÅQÞ6ÓmmÝUþQA +™EœÐ®úY"N[ÖÊj8ð±hµõå¤0ÍÊš°–w5Þ²d CÊj$4ìñH$¶pŽ¥Wks÷ +"鶸LŒQè¥Ý ‰BíššÝú ëÊÊå‹·^[°¶ý¼©,Õ¼©hÚÊøÝ^Ó|±ªXOµ·Ê©U7 jâpOw¹32^®‹Õ¹–D I\™Ö>‚‚¼›MKéP@‚çzâz™¡N푉s°‰uH—êãÖuêN°/ò–ÕÄî‚%cXO„a$S}Ÿ'‡H;Eñ+odQUúÀÏ¡ C‡ÀäPST^Ù6S‚#†'¹Ô¥ÿÑÍ°ÔÄ,ãáßæ×Õª,ÊPØ@Y†¹ w‚߰›N8f¯´ƒ°²F׌¯›þIhú’ݱÇT›’ ‚ă‚#<ÔºÛÑ ãðÇzBÕ ’hÙÌ.Â?ðé¨3KšžÖ±ñf +&ƒ˜,RȽµR PFêáÀ©f·’ÒŸ,{¯µŽ1@ÔPíµ6³. ´‚° ;kÀYÖß‘²ƒ±†O£[RÖH9~ÁmM¸€?DÞš²Dc®¸“ö’kԔ˲Â=­ÎWÑÞà”3.ÚCLë¨èHtõÅ€'ò¤ÌÛ¨ð3o¯—¸Î+ž€Â(b{Ÿ›Þµ/DÎx:¸ÜÁõ—@BÝ#¸mÈ´Ö{Žu jº¢×$õŽ_»unl~Á!·Qe¦åPœ¤GG³¹PU+©œgR‡”ºÂSF€jöz´ÝV>Ö»ýg¢¾K&}P#°Ndò®¹{°æŒZ€)ÉVŽgUÌ1×[•` skb&_1ÉEr…2àmàGcì_„m0¸†kÄòÏœQ6ŸQ¦Çš\¨ +>%p +H‘$¿ÍÍ~'ºbü"ZÚÜ­my0ÇüÊ[ÌdDŠ»2 }w+¸<áCË£šê÷¾Ö攤|ÃÔµg+Ê™xlœ‰¬Öü[eoƒÚy²‹+¸Ì|áVÁ”>~óŽjÚ)$¸U:A1)ƒ ÔÅrF®×< ˜fô¥ÏE uH^“ânõ»òo)GJ¤œÙ™’§eyœ7x*kýèSë—C‘ûK"qT·ÖL'©YI i·—Ymöˆ"!Šš¹¸Žã¬•£oD¡Æô˜5\”ÂFœÆß¹Fz=+@á k +mr*RÌã\̈ÃþàÒÒfÓ¥¾rÓéÁ%l£9=þKûФ©åbœr7j¼7ëš:.EüP ç$gÃú Øl×½KZ§Åƒ ÂPp +NTÝ7TÖÐĦR9«æ M°Òˆ¬dUV ÐÍ÷”k¦1 FZÄ4I:Ø[YI•·½žÀ¿bâJä£4ïÈ;µDrfÇF®¥FO„Ff§àÙc‹ñ/†i'îû=Œª7O `Áõ ×1kØ:üã0ö‚X²‹s¨o`{"ùÒ‘½?qÜx9^¨¶läí“.¨k.éöåMô÷±ûs)rªE}?1¥ÀQ>h¯øÖÄ;aìb +¯!(«ÀÜòfHEçÀ +£;ƒ–KheÀ€Ål\‘¤À[“Ì…1€9`ÛM4ñÚ±UªQ-^Ó +òb>øºƒX‰b¹õ¢Ó;´b²à-®åiê®ÁñܬÁÆ›Üm?_•KYÿd•8Åÿ“Œì/²ŽàžçíÍ&{zŠîS™éöÜ7*eä}‰ < +©lOè +òðYŽÙ’(ª/T!çšÈä{ø\#Ú[³àôä¯ ¬o¿ã&.õæµÊÔé3q`Iªû‘;ùÇÝ !]25Å tÖ Ü^˜D.G¹œu?“ ÇASÓ€<’=¢ØIö0ÏYB­ž…{yp#e¯IÙeÔ^HÐ+3øíA€ÝÜ1„î¦Jøh‚!‚á¥Pymxó*,ÝÃE¿èù$î Ú¸`†B³xCÙ…Õ‡5|Ôõ5‚Ž G¥+ÌRfw%hA? d‹ëaÙõ äéfûCóa…3 +͵ØÖ¯nN¦*"V]NCœ¶v²UUzX0Þ­îHVÀÁ€×°z ¯‚^¤´ÀŒƒÂ•Fmõà_ö·Ê¤”=œ`é!WºEq¦o\ôs"v8tbÓM¯j•WŒ×›ŽR{¥v,iˆu·GiÑãÖ ¹­‡ãæ]ÖvèîñzBÏïÚyëyk¶å;T×3@ßnF$¿Br}\O™†WÙÄ^kàó![à„T7ˆÌ,«Ö7 ¨q›»,$JQ&*êÄ$Á~´7x)¹;+ +LˆÊ’§ÛF_¢=,0„˜Í:éö,ˆÇKl°Áš€ÑœTdHp•À„ +ÉQߢ®ÎΣ†WÓR† +NŸ$•ÙÐø:±U+s Ôãóƒ«u ðÏ€T[×;‹ä›¼¬Àz'O®ÆŠÀE‰ÓZ)TY­¯rkÌVÍôv¢˜Õ!1{ÍRõ"‚ïüï[KÇèÕ5 ¸üõëÂV˜™ÚÞ‹rˈj(KÐ^€•ƒ8ÏÏᓡŠ™cç¨j»Dæ!Å€È ¬}õ©í“ò¤8iÛ¿ŠÄêúU=VJœæ¨ó÷õ;yH K>¨¥˜j¸ªE«j\UµAqèÊOZSî.O5–#•`œC¥@•ö}"?D¬á ¤$ ²¢T6õ·EjZÔÇÕã»ãÊ|Y?8< ¨‡¨¨žÚc„Jé^#ô2ÁˆÂ¨™Ž¬€’ k<µŒî¬æ 5¥S§Dæ4H=dðµÕTZm“{ØÈ5WöV#†qFes*ž³3J®Nóê:í"øö[oXä(B†dËLT±­ ‡4uñ(CDµoÐoc/¶ë2Vñ§êzìðúÄŽ^ ô +@P霨¶5l\¹Þkc.=€x¡Î2™ñ S¦`W0aÄÍ¥Dd4ø¹ìf‘.ydBÖ*t_n¶7’lì-× + L7!¶^ô5G” \võ0ׯ† <'Âë÷×3Ž]p­}ˆd/ÊÑÛ ¶²"’í&À”vrg¨RîÏ\÷áYäPáb‡cà.Ž”ã[%Ä‘à±_öP·ôfs‰/áݲzä¹ãKnL¼‹£Æ%$'Ñ¢Hõ’|]#Ù´6â—®ÏùŠßó›Íï¹` l ºî–誒6lZ¿l½l<Á;$B%1ÙÊj{óˆg‘ú… ɽ' ×ðD¶~ŠoÛˆ= °ô‘¹Bx”ªGQ€'Ý‚ûGÃ+ƒ"¦‚íSΑF¤âilJ޶ϋ0ÀÅCBÎÓÌ”(MÓ@Ìn¶»•«KX¹º$&W·¥T˜+ÁÊ¡ì Ä]!d׆—²ìˆ™£á$´–ÀFë¼!J(üš/b  Y¸r¨ ´ác—„¥u9QeŽúP\‹©úFÅïÈím$`.?ÇÆÐÏ«ËlSl8¤4ZNn·G4’¢AÌEË!~Þ6€Þ†70%bĨۨ–"8êlÐÙ¬ :y²»¥¨#•ø¸1ùhå‡ÀÂ’-@u\"»¨À ¡!#<Õ*Þ±†`V£ß>95€%ƒl½å=! /úHûì5vüå¯ ZCˆ1g>ØjDéIÀ±i(Ï"¸!éÒcÝYÌÐ-@ö‚‰mŽq$*H˜v1\HêyS¬çˆ^F0®R¸'o˜Ü›@\AäH±ö’‰HrdÝö¯2ã~k ™×n))LÕO¶’¶·ðÞW|õÁbC u+j]$Ÿ®À_Hi«­º +Œ•ugÏfm+8£Y¯3SxÔÐ÷`í1Y¢ö#˜è#k´K©’xnG{xá”ûœÊá+_’2[!ÖJ1—FŒ}?î ‚LHÈ2a»LjënG¤ˆp@ÔTÄêiä'݆Îsˆ”X9J4 "î”Í/äãU¶]›ÓçsžG³/$r¯)Æ7ZÙy†¢ú£òxE:¸’ä‹lÁíÂ+~ç.Cõ^ÇñM*ºÜ®vJèÏÛÑŒøTnØTNS“œ˜®Ì¢Ì\ªYnêg¸ÃE8F,<•isÍ÷/,0Î d:®³T^"\t³o²iRä„ybãï° ^Á}k}*„P†I‚J>’ó¤*ƆT£¨à›._ùÇÍ‚°Ä¾ê\‚´l6Çdª:Š6Ò2Rûá3z=$Si8ëÈP‡YførP\´Õ!bM—¯€wï¹öYÎ4ï˜#}(úÙÞõÞ%Ùj·ÙÌa9Ô ×¼Íȶf$I@Ÿ4ºò®º—ŒS(¢(?Qâçp“úv*ô3¶M4­“³({›Ea.°H„EáÒ$+Š rsÏáÒ¥ÏfFwˆÆxûÝØ쯆«(G!ÓÏ/â$¹gHO—“GCD-×­–†ˆ™áI׬RdôÃú9±Åh0õ‘$l‘=# +äeYo–œš¬†)_Í•åØ©aÉn09•IIÏýJ»XÓtÍŦñÒû¦–)Õ‘ZFuo!üd^ź $Ïa#Œ€Û%Teº>õ|[ k%@À>tûiˆ¼Á…Ú»Ò%› ­V#Ÿ6’9¥Au¾5ÁAà÷<ªñØÀêáa¥’x½iNˆWzVWÞºD%°©ªÿ<ù@-š-»(ÕyG„©ísT-çÖT¬‹šŠh¶‚á|½^Uö©äöˆ†) +… 7 ôõ +Á¯;7BÑ© ¤Da^Œ„E鑤ÅÌ Zd.”(é Râ#5Ù·ôXHˆ'[›<üÖ©Ñ Yª!ìŠû{²º8¯¡«‹óF]m´9ü€·´êÆ„;Üöí $QrøXŸï­Kž?9*ìk$f(Î]-NYDRGfÆá +"ˆIœº˜ìÍ(žKº7ëÖ|g*A´ÍÍ :‘Õó9Ð>¬HŒ¸õ~—L[®³;e¡•³¶Dd ݱ(è8©„åȉ½v6)A2•YZñ$HàSêÓ=;€‡ªˆ‹ÓýÍ,Äü›O[<7ä+Ìò<;v äÃ-B*0+DÁ+þ²—®ôªû0cw˜§ƒ?1vAß$®Ýƒ}°HíóD,μÒXšÐëÒn® EuÊÜ‹t¡5«ÎªÁî}ÐÖ-^CzŒ¸V>NDaˆýg§&˜?ŸÕ R—~á)¬’fŸÚêP•Ê½¶Í=é$tÌ#¤Ùä4ö`¡¼Ì“ÒÌÕh:¨À:ëÜB +ÿtûø0žgcתÕa B©t¸8I÷†eØKÚ@y0Û+PÎ{½ÛãÔ ¹äf¢)h³ØPï%Mp™0LÆJ縆«1áa˜5Ù]±ÂÛ—'d²¨ñZãÛ:ã脱-p‡”PÏñM7®Wø™&Ð|Nýd +sSꮩRIZQ³swP%›•Ë] ŠqB_tl}&,jàúàŒ—£ª+9b³ÐÖ^ 9(>k–fØ+š«Ó›·\£a Ú!‚Ôá}…©ú%D e©dÜ…ŽÓ"¨Á1¶K-ÜK¢1±©K½+î;cC»ºå_›C¸ª2?¹#Kd9á  ,–­+¨Ðp{Ls .B2ä–š‰ÑoýJ eÉêÜ©`ð}_Òøé±-=c^ï$ûCO@9_[lzâ©øó*Î8ØYIYù-÷#H%[÷¥‡kXº>Æ$4>:J­åâÑ&IAMmŒ&`ÂÙ ¦]y×ÛðÀeœmÞà«©r ¿Â¹Kÿ”•W]ŒÖJ}ÒÑôR€ÌÁðçk§¢Ë€mš8k2jhY°,µFU–ñÔCš‘”[Ï»¹z<ôšºiƒ«eF;ÑÇþăCÆB$ë9I`.E°¥¤ è€Zƶ2Ž_t#{scûZÑä¥2{dµIñCc}—B“e$â}NfŠˆZ^ÇÓ]gQv\ûÛõümŠIhØN¹A›¯PC¡p„ +ÒZÐǤÒCŽ¢jãLÒ†b–j)F9î±äB‘B­‡Qu‚Wˆâä\Oöeœ)8W]ù µ²Ž7eÔÖ[Ý4B¼Ñ‡¨Á ¿1%ÐLÕèØ\Ç qlâd 5ái•M˜°ë’CM!‚E_ðͽ${>ÅîÊûö\Šs1È„|GøV¦ÔʽC,ÚÇÜ;ªI5¢Å—‚­Š&$(༦ð&Ž3m¹R7·^‹+^¥ÏâΠS vºÎ f`Åšï!®8Ì) Ü]30U8,ÏHŒ+iÉV‚Ô3@Ô!eöVSEzˆ“&ŠbÅ‘ ¿õLLíSÈPgíÆtrv+NÖÓMöáà %ܵà¹ï š/Ø¢7‡;A’z¼dñÖå£Ú H¤¡AœÎˆîȯ(“·Z¹Í±?,Áù–dÞy´ªAp ÁD¸~ů¢*¡º"¢oÜÝŒÓ#¤|oIëtϲ˜Ã/Ë3)§1C3®(鶡}«¡¢wJ3‹ NÎÀšæs´€+WD£AõêTÜH +ÄF}¬²:G‡ O³QèÑa_¶µùÌ`dl›l€[sGà¨!I“´MBŒh‘½ÐîÌè6Á¼^Økoï>Ñ@©;×!…!üWÍG*‰âOöR¿÷¼jÀ‰I¦SC†¡NB€:WÚܪ› ¾ò1b©›SùÆ,%`ªM²ÕQã’b DzÐ] t +ß‚ïƒbêÚL[^†˜ÅQb"Œ?…U›‡L”,GÇí¥5%ƒ1Æ"Vcou÷À¬ÈA$‚¿ÓÑ¢\*Þp$èk‚a‡àFG‰†3Qà •ì>?d45qó úz¥@0ð:Š”)ªø -ËéÕ,Waäu‡Èfè`­ß×¢CEï‚÷µïUUvÝ°*=P,žxk¤ï°³*VhXaO +ÚŠ^؃•d¬¼lAç€ö+âSd„ÑÉRE)ÕPZf¼ÒL_QQ\Á¤Jo`^Ší4’Öì„)÷Ý#¡¡SW ,dòg@­€¸¶Ô«·1…ó¤ì¢ãµ…ùÈyZm]oMs^é›ß†®i·ÌúâxóœIˆVb²½Ã9gÅtT²>ªejpÌ€ƒG° Xú+ˆ5¶ dààÌÁ¶  ‡¡Ýk~ÛC)ÀÉ+ÚDµL¤¼À¶–Ñ ÷†ÏIioö°‚·z˜e”07M•¢Ò€Ÿ>±±ÒV|YÞVQŽ9Øj”n¥0“ÇžF¢xÍ:`ÜA–(iþf2‘~XwøjÖšB¿€œÝHÌ@pÕm>RWÌ„~ Á|mbÔƒ¸Bª-^,Tá™EÔæ¸Ä–íÁ4¶D(q=[ú±Ü¢óþ][sÕØ øž%œÊTÂG÷4À{5 ì”z~orP‰Õm‘FDk™ éôû34¨“´Ù3¬'W÷™ö¨i=ä£!MÿÝ™„´ö0ÕK¯­ëI°´41®³f9¸–Eé@|Ôs¤@€EåG$®‡ÅGǽdŠtòN’jå¶VÝlZ q†$¾x'A;r}œÜ¸3[àËö‚ñÂ<‹sÍ +\œ4%ìP›(H`M@o» ìÛØg ¾|–mRŽ›ø}Ž hâÇn=ËÆØ„æ„ã= +8] 1¾¬–¶u‚ƒì‘Ø®ûþ jÁûsWùî£ 2¡þÂ3ÅÒž·Ž*úOÀÂ[Šz,û‘ãË ó—õ“BÏ”‘Ž« +ù£)–¸T D9ô7uŸuu¢cRËÛ¬cýŹ-X«/~Õw•–èlâUK8Õpö/@ F^Rì©Œ\¤ž ´Qq‘^kØdF„´©(!s±ÙÁÎ2P0[Ï +&'¶¸ka_;Ç]aÁªÆDä„°¿Mâ‹5Sýû½‰“ÿRÐu¥R6*8‡6¥3#-ðŠÝ¬€žèΓ_@"Øè0½fì[ N†ŠJ¼KYÜÉ¥p„ËL54?ˆÔjŒO¤RéÄn»ºÕöŠ)_›M¦¥h2·Ìîn¶áä•¿mÀ¥iu ÈJ`Eèf‘ FÆLšGþ×@(¿'Òåßýªã¿ò@¿apÿdÿùÊkPvG¹UrDÅ €Œ¯õ:‘ê à½÷f¯Ûìêk/ùNdœG;\3h®|~¹/-;Ê'ç–¯g­ +fy9^3e24ÅækfÑ %ck8ˆ ±‹‚‘w¤T)EA!n.Ã؃‚™ª(ê…XÞÃ*òs#ù§rç¹È]£›Ë¬BªÕL'P3­‘'‰ªyŽÃ‰¥] x‰ÙpŸhÛv#.òŠÓð 6Ñœ\“š¯Ìß\a 1 +&2£ø£ž=îس0á{–åYæ[E+¨®S39ò÷ðv[$0„î鲌€˜‡»®°ÎJYè´vÈÿ@¦Š¡Œ’ÊeÞO羬²"ÎùýìªÿìmÞÔ6qɺãc|ïü\Iêû2”¢¡#äòÑ ¾ÃFbTx ×>HB>'+­Â¯’úœ¦i÷ü9#Ýá1¿~t1þø¬èú$VÊ©Qî^\òÚ.gBö4‰BÔipÊê‘7Ô¤û|ÉùÄ*€Š§ Láíó5ò`|k˱ˆ´<µº .v‹€–߯Ò(±4 ]VÖø<®+éÈHQƼÖù²¥e*yئ¨3ÒL®™fèï0D7²Õ®lB8‰ÊœNp.”ÈlÀ ]?ɦÀ´° +ÔiXó‡ èŒF²'p¤‘Óyim{n•½øùŠ¿UÊïÌòÍìJˆ'®-}óhG ¯‘KlȰƺ­¾ áh)²7Ì(2ºÑAZû<}çrÿÚHJš]C- Ö§¥'ÜŽ…ñmåE3”k\Ñ°uàš\†ç£†»I£ux¼…R5ò8o ¿¯Ü Ÿ©ZEE©Cä_Ó祾•˜Ÿ²-­„oÃ*¿X84ŠìÛîʾT™ÛÉTðW¿Tew*äHÏþihÖ]…DÛ¦™l„4µ§{›·vžYÂr‘¶Q¨ƒ§ð?jfžÄ ¤À¥À;Ñ@h>us;crZ±»À;2 }A.2ºä"SAŠ• ,¥Cï‚ ló4Ķ=è{ç3#i·ñ“…a%3G§Âñ%‘´J‹u‹ôëV:âêô2{sQŠ^8ƒÓ‹]­Ç±â¸zˆHfᜠ+ÞÞÚß^€ÿÅ°ã_éÚ$;ë­f Ie]‹, ³NOoM¥HÇ’$X -?«ÊáÕ©cÒQ-’t„xî¹¾ E5*(¸¶Ð¤L‘×™h1öj(Hü"ÈmüÅá,0®‚1›ïÐo>‡«¡6¸6mäjoSâH £€VTÕBS͸uÿ±Â²îp| +)ƒ£˜‚ä³êÜí7Óp?D˜ñsrSE=Àsn—2´[pÌ¿Ç‘Ç$ß +†“+A“£:·°sŨ†$ +« +û^Sö=ävÕ š}p1¾@ Òñcë[\4‹y6 z5tVè +¥Áœ{MÙýÒn•.”rIP¬ÏS‰£aïP¶æùûÒ¿CÙÎí`³fÃ&âu"h²on@ÌÜLÆÕ%¨þ×Ü·ßql‹¸5‘ÑàœE]a%KÛyï›jM(cÚ«ñF6iwTеd§y—¹¡uC hV¦h(˜óRtG ]>kõx£ÑKƳ`ƒ+ *‡ÕüÚw,§Õ€qGqãÊV‹úKÙ_Õt`<’íM½†ÉZƒG¦ãÆΓe‡Â‹2˜) ‘WJV‹•£ÆªQ®ËÚ +‚ë»Þ²«9 âx; P)²Èõà9N¡Ýnz$®Ð˜g˜%÷)‰ýÓÖÀ­W"S¯yðt­I¿©Ê¿=KÓÑeÅo—LxW“& ‚÷NY“)WGÞÛ3aïûœ)rJ±ö`ùºTY¸9D\¼–{ͨ9°áÕ^Mô€ÔAöª+´ëÁ|—÷?í¬”ï´‚”â|;ΆU­¡IÛk±7<“×ÏcoÇ5WŠÂ×oý(üTEP£˜šû¼6€ÛiÔÖ ùê¼õÒ¥ 0Ž0qøÝ>ÊpbÕ3À‰çßìGóç¾êuä×b ‡ LƒèÃN.¢¼*õŒ²mˆ]¾«"¦-òÙâC¿[3gÂÜ EÚÌ.hCùB†P[ â,¸ëÞ²‰T(pˆJwä_ +9þ;<â]s¡FøvÀ‘ˆd9ÚSÏ4%Íw 1“ƒ]:®Áž^ æšuò.yßÎ)ün×®ùnŸ¢{&÷±‘?13˜G„Eí+ú¾¢ 0zÜ,¤©lÖÚÕˆãgIÇg±XÃ’¦È”sòknÈ\˜§¦o8´ÍhP´»öü0›7QVlÍ,å 5u›¡#Ü¢/“I"v:¢צSRäHQs‡Ï…>Ço‡D¿çæô½" 2%cûJ07€<H‚Æ‡Ë sž · —…àx·Ò¤¸m³âÖ×lß6ƒÛb×@#åV»T½4XˆíÐ#ý<¶¥ ½$à·íÉl/V;zéˆèþZʺÿ"¹NÔË™h.[òòƒ‡â1æ§yi݆ç¬~9Â[‹\6ˆÍKàNÔ¨ÀPa•^${&q¦Ý†Ví¨Œ" |Xh“ÄÖñÂD(»ˆ­Ñó y›k«B!×a{„‚ÄzåëᎨÀO­à„Ñ° TmZkr‘la5ìä~o/àa„ M؈ èOª±6(3+2¹Æ»ª¦I5ݲ+µÀ}zð-Aƒ cÝKa92§‡z@Ì®¨Œ©C1r@¿ž3A¢WÙ×㬅%LF{¬…žL­±xb²šÛô7ü¥!*‡€tÏ“.fªsÛYÓµ uq·kÐÊ Dv¸—gX”׫œ“<È·åÄ#ðãy(3à“öÒda»ÞK@bÔ4S㞃–º>5+°aô o}G=¥m.=:é×ó òHîW5è †–Äk¬¨ Î|Ù:óóx÷äpçÀI/bˆ#±T‚‡`¦»‚¼*V¥øaB“YqG{>÷_lž/•IíFM‹©—ÄOS0ÜíØ=ÆîqÏŽ#ìñÚ¨W²ÈcásÁ'S(é0bˆÏ¡ïàé;¿^îîÞ%Ê»Ç!K†ï*[›Î´W»¢—%L¾áó2­gªcœ‡:Æ2^;4ø†õø˜½÷I[K_¹;^ßÓUÒ1“Šh.5qOɪ #š7yj ¬y–ÜÝ{¸w- x¬ ed^s» ·•Öw4ÕRDSYaó¨Å¯¹8(&e¯;KúYb1Ê6zÜæI6|Häên(èàŸU£‡y—Õc=ƶ¥°û–ÂNŸÇÕ«eõÂÍô® ½ÎN“‚mVÙ6Ê*rƒk¼(—•"âæmĉÂMã_°ÏÓ‚Ýð¬+©­¥¡x&b[L +d‚">.â&×RÖãMhØ~è B²{ôñÄ ¢F@ZÀzë%+8âFîÓPåRUµ%œ©×¯z´À¶uÒä'Øyë¤3`F¤ðDÀõ b>-˜Â@o.äÿšò;ªí¬I9×Gu«Ç´N£¶(HE¢èZúQ€™Ýíá6\ø{°ÔÐ㨠ÉJgÖ/÷õœ ´7WxWç½9¼ å“}¦M×//q&³¶¨3Á¸gRö3¹vµTª‡¿yÅFÛ {(ž~cÎëd^5÷Ìù“qQ}‘VÓÊÌzÐöÞ{lˆÒs +öÿ´÷O¿ì¥RX¥0¤ŽŠ53ÔãåùJ¤}õûkizG/÷±¡gÔw§i±Éds¬dVÖUºŸF€Fú!)·4s§TÑ››W¶æ0eu®=¬ñ&¼œ¥³Âw#ê6úÞo57Ńxõ¯Iï~:µ-ÅÜçÐðùý0÷u8t »{lSM¡K¸ñÖãËò­×ZLGy!—r÷‡&È{MÚ2ÂGVͺRAó&ûM¡ìù;ÓϦŸ]žÔvšœØ7²ZáÎ…JÁÕ\Š&$V.ÀˆE2Fê’(Ôz’‰„Ä8æ}¨‘H½Ìm/Ê$º}EÈ ot·Ý9"§î·¯ëÔ„7sWó@‘?æbDþ$Ÿ€ìÒ†Õ¾—òÿÖü"ÿ/aËÑ•ÊÜxÜtsÆt&e÷î1£ÇZÜv¹{”Óƒ8Žãœi[¯^ÝÔtÄ$qÍ‘VKASÜ^ˆÐრ½+C2ñC˜èñ ‹ÛÖxÆ‚ …ü°d‘z0e†Fõ‡.‘s€Ý›æ)Hc§–A¸1*@†áB9iÁ#ÚI ñì‰ôÁÁ®ðŠR€ñ,ú†"ZËIGŸ÷°¹îBÖ¼JV°lf^©åÒ±…›×\xÏ”_7鮉z€ÇÁ2ŽøïãÇšS©9~æÈgÎË á–rú*ªÌƈùª‡ƒ(Žkí}EGu_všöóq9.á`•Vø\å>@T)ú@L¹ÚàWgp*ª Ò{³Û2Z Û•íûÛwb0[ð•Õrf­ºSBiw˜µ'Äkì"ñ=óÀø‹Æ$P2;=HÔRÈöZêmb9h:!¨ZåãÕ˜2 âI1ˆÃ¤z¶ Êl$ê‚€Û™Ão]Mp(’êÒC[Á}• ©sjŽUfMŸL\ø‹¶ ì\Žr_¡ºI#(qô\ Ðt>ô„ÛElèÀEÐt¾´C¬)$s9u"B¶­Î˃(ƒdGÆDf7´¾ ®ðdVôêc_WŒì5õ…fhéÏßµüuw ý0¨µRÈ…°Höp«Qýø+6´­Ç—šœR¡àÂYˆDm°î‡7A gáGˆÃF64w²‡›J—æpl %ŽC)âü¤ÐD罟#xî˜xõu#xgõ Ñn¾ÎÐèÉkR¤€rmGŠ<Ñûü¸¿SÂyû–Ô/Ì`de1í:ã£4"&‡ˆIyƒwÆ*†úý|îQ•ÉÙÏCRïù +ÿ½6—Ð >ž-_{¨órDà_ÑÐ Õˆ+ÁÖ X©KXàä§^Ü´éÆë†væIMe{„„œ¿³êó4§øsb(ÄÏà25.díøáà(j>é»›â'!>Ó)Š¬;Õ†CmÄïÐÆm¶Ä!Ž6Va>"OãßHÜSˆ%Ž¸7ØÍÊÐÅAÙæ\ˆóbá}Yñغúi¹:רܗ4ÉJ[ +ÃP]׊… #¸×†¸7¯‘ÄÛ×ñÌÑÙIG[ŠŒÜšQàL¾÷ðæ?'xi„UÉ{—ÕÙ¢sReleË'Œc?¿Î®šŽØ +¤VÔx…ßË¿Á1wݳÀ¾äH•cp÷J$?¯Pb/G$¤oðΊ!š-‚ËÉf¶[£>ê ¬*XW§r‘^}íqsæù‰óÑÓÆ©8W×Ûa‹Ð®#òГ4Î3æ¼vÊBªkÐÈb„¯o:S%2Û>ÍÌ~ ‘µÑºoÒ Ð­é껆 Ù©¶o­öEpÞνÊYvÏ]ŽÒ ÁT0â@z©Ï¸´ÊT`Lf¾¤ÜVù€ÃÇ9Hs1oúÖ€HØ+xmƒÀžNV„q3[(Šõ{ÕcckŒ>~·§!¦ÉIÃŒÕÏo‘ö$g„ú™²’!ˆ×ÏïXáNíøG´±jëÍ’ ìñ;ÍE5ƒ›zÛÓð¼vae» oÃùÖš¡Õó ê +š]ŒŒËÒ”æõ–œ`© Â1ý,ûªn•{ž¢_ +˜¢Ár›EóÖòrÍç(¦Êó.U°•,SZÀœÜ UgÐAƒbµYL¢H=ˆ6{DÜûpÈW +èbš†GÕäv€ü ùíó¿%Õ#¨±ñ¨¦ô£šFì뱀ܗí®ò¹K l’ëiˆG¸áKym[¡<>ß‚·£óÜÂÌI¤R])”ðí¨E + ˜²‡E"b†|­ý©Øº(¯¸œn¢Þ¤JQ³çª`ëÖUÉÆ^äïÿM¨_JÝ­H®/Í BPÅU±¤‚Sbã“K ï‘êÍOÃÁD¶“Õ¹>¿E‚jý’;›ÝÏߊùPmšr*\ándúgÇ ’š†®EÌU˜™A;TTGç¸N^"ô‘1ÇBBEƒü(j²ŒNØõ»Ccc û¡¶UX³—µÝÁ~}Î<œJ ]ðŽEVà·±/¿'ÒFöà¯2ÿ•K¸3öïIþÇ׌¿ù·ÿóüúÉòÇ¿ÿ?ÿü¿?þæ?üíûÃ_þò§þ§ÿöÿüø_þðÿôã·Ÿÿüÿ~üùýøŸþøùÏÿüóÿýsœôëoü÷?ýùOøËŸþøã:Å/.î~®à7ˆŽÿ•CÆàÕ%ñ„²æëÂǃj}c#cìƉ«6“$ÂO«°õ¾?Àd +ƒALñÓM ÏÈÅf6iÃÍ +ÆMIaEæïñÇÈ ¹ä.£NÈÚ¬ëÎn(ÃR¢¢êÙ],÷Éo<!LTYýÜ5ûñ*ÈçjpéNk¢4€¢šëÄu÷ip¡¾¨T|n]ôlú¸ÂWdäÄ»Çä†m«T­‘6ÔÆ•#EöL,ßj»!”±Q‡ÀuɃ¯Ïœ³jP%PŒ ©¢bÓ¹QH‘ BÀ€¤:É¡Õ#²@NŸÊB槞ƒ_6Ìàˆl4OKšý¨§þFo°ì¬ôó™(6ä×æÖ—J+Ó-ÑÆùÛKÃfÎç3LáÈ͈íË×çßk Ý°ðóúé7¦bú=O}h¾)®‚¡âfã³æMB‹.ú(Éw¸Rcä*Êû™™Ó0Ó0zÍVE>úgÁ×—yÝW.à3¦‚Êù§(?<÷`yûýþ¾Êûƒ¦\o(—DNtjG÷ù·c ®T»žÏn +5î²ço³µ›“q>“ý„b$T41€7UòSSÍâæ'_lõW†Ù=o8ÆÖ¹%7Ù_L6kÝyL<É]¥›­T£¶àK‰ïešÏ$ð†ÔÂÑ0µ­„Áòìá@G¤.:¢™ãSú›ø&JUEªBc CU²¢ºÉPÏÇ¢œÆFòj¬ àñ‹¥až„^ÌzÙíI+¯Ï +ʇټӈ4æ­2Z¼VYF( @PVêô4ˆ³ù¸‰£ hz﬛ëHW·‹ié‚?†iÉ@¦Æ“Ü—3í‰^ ‚ ¦ÇVHø‚ÝøV]И¨ttìNÖƒ¼,¦n˜Œ½ÉEBâˆsg×d"±“ÈÀÈÜ›Ø4™§Raõc'ʜÕéy.¹W{ Ex0=¦üT‡oì%u<ü°NÕͪ!1Öµ›A|¬žFŒÔ¢ðš.ŸÀEiRr4k5ŽúK–Ç‘þ3E¨ÂÊ™"Í­‰›¨˜VÑæL:);Ä;ÈϘ¾;%j.Ï?aNù'åRäÒzb ôPõi\wÙFjÒìlµ|KJº ‚¤™‘ú>úÀ«‘ÓòXÐÊIŸÏIH$KHc0]ŒùåèJ34Pîc² ß× !gkûÚ}IÉ y0Å5Ÿ)$3a(|òq2à:lÄ닾7vnd¯×r‡ðv€B)¤B5r›˜Flé„2T%X¯ûƒ]‰v™ÀR9;ú·Šðn@GÄ@lý"eIÃSGš0¾Zà^WÀ•A”@^{ÄþHiXòz+^P>õ¥)ÅÓCË´£º /õ½á€jÎ`øE£,lp LðG–]Ù00ÜB,RˆÉæ? ^&JÃîöû³FÙµµÆ®°úº¢u}Ñ@:Ÿ=æ[ãvÁöá(Á0Éá/ÆáXùPSXo5 Óùü<üÁ®¢s‚v}~éR‰'ª»q§*ÄÆ ‹&œò§[¹´.‡ëñ¦Ò˜˜æGÒlàuY kn*N¨MÖ§•]K£ƒgßèmÚÖDJ'<=hÔá¢JËFpãeñÄ kxñ ’_~ã1ââ'5ä1;«ÄšD@²¹”ÅçÖ8æª1>€)á«ÑãÕ(óù<«™`Ö #?¹ÝÈÅq»§?©‡rô{CÅ¡d_Ü[ã.<»/MÎ/±já„×àq!ûiˆŸH Ãã„|—ÏoÝ:‚Åî¹5|kH“;öÚˆ2¥ò¬Œ ŠÞFµ±q˜ÂÜ•öï>?#—¨öéËàh:çúorïŸã•ûì¶_䕇1ö³•$ü±vØZaY¬æý4ÄÏÃDžF´zÉužoi¤ÀÅ 8k.,#í²¢ö—ÎúC JUzEBÅÒ~Ü4 ¶“˜ôðÇÓ"kü…vÓZ«°fXI<:=²Èõ* ÊCa¸¨OÓ@YŒ·~~cLn±ß™P& +ÙðIîxíÿÖ“-û£Vw­k#ÃOÜÖŠžW *Ïß±5~nU‚‹=îgçà v‚”GR&e¾5ì{¨¯L«;FÂyÀb²­2zä¢Êcð:¶èÓx‘\±+1FÞäzî€ðÐÐñ´mxð ¦4‹5ÞС+ u')æ#¥ü¤ØÚy45VCBƒOµÑ÷ã瀋&±›bc‡CÑšgÝÃÕ§@~—dÜØ6À+·ÞøaP}ÕÃøî§tþ¢±iGD^ÛX‚„†&×SúÖ5WúÊj¸úgÃ3>F3À€§U³;‚4b@ý€w„/G˜0ñ¾s౎%ÿVÙm½*·-h±ob^Fûžy¹aˆG¸ÚÆKÂv^ Äá;¤º1Õ»ƒ„´þ²è…ÞÚÙÊ=°àÐoÓØo-Í\sÝfj@`U‹¸òZIˆ‡îðtHŸ¿ï'³û30¢ {‹‰ƒÕšáï%cu¯<Üdnð[än9VyóRÌg'`_f ›xƜDž©Àz—Ã¥#ò(á®7µëvXkÓ bLÉRýKÈkÙ:+tZó[¹fVÎ4£lkäÛ©¿b=Hz~‚Há ¬w¸@®È)؃m =(¯Æ‰nËz×H›e@¯NšˆFR^NS‰cö—ãpNÞtĆÀo R°QÛ‘×k¤uèÖµ&È=µ*°‚UáØV…ɪ¥3Û­'#k{¡5a•ÚᆈoýÜ1CVKVC°I°´{U£}3=Üܯ Яäàln§éÖ±$±ŸÅL@my.…jÇù×^U±5lP \‚)ˆžb¾æå5kp@/’í%ûe…¤å¢ñù°]šÉ•;•`íÞÔRàý×;ÇPŠ¨Ÿ à@ånrT^O#Ù÷v¹¨%ÅEºB8}RŠ¤j ÛòªOƒEhƸփ^7ýùVh)ür¯{@ûo  ®‹.5- óŽäµ`})TPuU? +(9¿Z¹Å o”w ,õÚS‘ï‹%‰×‰œy_ÇÇΫ“†7réáÅ&ŸÄ[Ùu;Amu‡/zåÐÿŸÞÏnKÉÉ%¹Ÿ$(–È>"Sµn.ž½1é EG±³rUÑŸ!iÅTEùCÚVøtL–dzDÙ ’“—%Ul +¤8Jä<|$ÀÆ>S o ¥Ï™\W/é¸^ü2Jö¢…Ð}WŠmb¢à½ óö/a‹N‡¡GEÒKp»ÚÅçDî¼Á¥ñƒ|éF¦ã穱æVÓ»kN,R›Ó¸£< ñ^–öç[øp‰¬/*}qÀ[C<Ù¶ŸìóF¾ö"¾†)6¹?rY3.ëÞ¼8õLLË«D›;6ÂæµÃO»dkÆ‹çè·ÃPÚc%¤´§ !p{ÙUzw˜dó[Šäö÷î”Ú¢2ˆþÐ%F4ž•¼Ù-Ô©Cb©÷·ÏC¾¦nùš½Ázë„Šmßµ¾EE"ë”÷ö~4]«ÏÔ¤†˜…<3qÂq*†áë`^‘•\ÁºYãòUKËjó2¬]óz@U8NßvŽdŒuƒìfÓû–vAk*}ž)Ö<ò•€ €]N….(ÊmãHpô!-ˆ°ÙѶ!%oHJêàÛcËH“§ÚãøƒtÝ)«\©™²è;Ýo¦lŒp.$`û›‚zVû¢Ç`Ç!¥äcäøÞknseu'>P-%bùiµ&È@ ÉJͼ7ü´CŸ25'F ô~ïµv.1çsUÐHeíû>ÒÁ?=©2Q¶ÊÄ¥ýኛŠ…ö ¶¡ÞÑ÷+bÜÏ[ôékgFh ÊáÑõ/'튼«~Õo–¶ýH,_ûþµ¸Çû‡Nmv;U‚yz…ùíšÅrÌ­•öÕ#¬QqãÂc QœÅ9²è#1iãxF‰fõHõÜnפqÅšÄXŸ=õÖÈs_ð`§83JA%G 2Ñj#œ8à $bd–Ö‘=Ä"æ†Ä‰;äéÏžcœ)CæÍ`6Å÷è$í_û×vÕcËéüÏäÿÚK5bŒRsÑÀòŽÌÁ„Ove¦k+3 ž÷¼Þ>wH!´‘ç[" ,Ùà¢Ð¹#unæ>€°9 {3‡ú²ˆÅ¾ÍFH° ˆ¦E2¸‘yé‚+ zÀKævöÖ;šg´Ö# ”±€šJÄü—NÞPö àñ¯ÑÞÜ_¥¨"¿5jN#P£…^xˆŸ ÷F­¨íéûiϧòãÚ•©òö`ã%¹'p|“T#¥S†Û…o¬ sà'·5r"q¨‡»&ŸýH[b¸—ý‰î$…+Šv™¿³l4úP¸‹âMSÖ †ó¸ Y !ˆ¹¦[Êâ’æk@HÕòY }0Ã%ÐvþDD E$Œ¼E{q\‹fg2ül¨ZºoxÃþ,Évš’š(##©‰‚,ò©_|ì.—Ü*ÐÉ×Æ©—µgÙ“¬Êv{æ½-}uœvXå(›¿5þ]œj­Ó1qÞMBôEt¬¼bÙ <ª !õ» ©˜7¤}ä'`ãUC@ô`·þ#¶íMùDcYä¾ÙÛæÙ¿ÖFa©4Güß5“;N»¢ZKÞ8™Ö#o‰¼a¾2¾èñºŠDêëµb**òJ_°4ã’ºåR´Ñà=Z[Ê2â‹°42£!«¶ucÊÖX[4|WÁ¹ò~®gåP”ª±A ¼H×Î@Ê!á„þM.yp1zj†2¬?€1PHPð‚¹@)“IZãõŠ´tÙµÖ±ö$ÁÚ¿‹,ë· ×ƒºÍv¯Ô`/ fï ZÊúZ‡a³Ao\GÃ>46l[ùzëyÕÛä5Ïdk©¯GÑbŠ'‘ŒŒ-ÃƨtÔÀÞ{PÃìãˆê¼4Î`q«'E¨Æ&;w´(µ+ˆÿ“ìo%£nÔ7KÿÛ†%À)Qã’üPÛþTC6ö˜+ê«8yAYã-úU ÃA:È'ygUHsøžÏCÁ‘aIÌÐUœÕªñ°¼¡œmWoêÆãÈÛßa¶È«V‘â2Ô®%ÿƒ„—÷*—Èu{…OÆsJ{> ¿º+›"…Zõ–¶]CÈÊ|e&€5G¹EÐ-6ÔòJŒrɬ†ig90½)j„ ;ùûÌ6¬^% Å3æ£Ü.äî×ë Ü=F·B$Îu:5¾ÁXzÚc¸ s³„R¡Ÿç©wÈæ¯qš&)@Ëd‘âz-@<¹Z çÌúFYý\°"ãwˆí\{ƒ¶AÀ¼ºE͆7êªkî0xÁN1êvk^k[l¸W»#•OÌÉ–ƒÝ +pXžª9Øèxñ±á@0 ¯hwܱK¬Dèþ¯ýue)vm,r´/rÏ%¡B«N^x½“C'G ´¶oA¢´»–h$d¦Ò^ì,>(VXÆèI_ö0k ¬kh¡Ã%6Å·nýˆ(å>šµYbSåŒn/Ã~€¨E Þòî4L hΕh¸[”OOn;"p}m[œ=d½ÉkÏ8Žé +Œ5ãµÇT’ŒI#ÏVPSºJ˜- ­íyŽò¸h#\ÀÔ[Û´¾2ë78³Á™›V.Óµ'ö&ކ㭷±)9+Ž$ÐûŠï©â%(„šš~„ÅV¸pA‚à€% Øò­»K5=Ä‹)«‹ÿùÿ¬½Í®,Kr^ùz‡3”4(ù¿{ »/A…nô¤ÅQ(²M!± ôÛË×2÷Ü÷dîâE—’uvXFdFx¸››}?)8µÞ©¸œ&`e÷p&p¤MÑdlHi¢qê¤Uâ2hÇñ¦p +º0¡Œ¦À1Êh—Œ¦²àÓ½ºJÌãç¦r´[犀E!Ýt];„жô³üÍ4XÞpkš—áØXâ<¨;ž»Ñ½lQ œw˜*6DôšÈTgšÄs%樊¿z‰ŠýóܱFI@b‡¦œ5å1¢Ú§ÇÅÁ¾Ó–5Oƒ ©ºßVçg¤lÆ]3uG{«éˆ|¯X‹.eQ…h²T¹WÇÕÌ3äO²)€¼º  ñäˆM?¯§Ý‚² K¤€‚}œ•¾O ¾¯ß^è1é †USÝb.éGÈÐj}!× ³bQjžîõh!Ï ¹ªÏË+±ªÆ=BÌ{Ô\A5¶¨MûÓ˜Þæx‰2^;µ ~¸,ä@ixA¶´ÚÕÏ£¡ ,¥@X¤‡ «ÏrÓô÷ÔÀz 4±Ÿ£Â[«øãþ5¡‚¬‚Š…šˆt-ɾ÷ál³ð¡@)oÓrºà +›ïÝÓÈa^¢-ð¾}ÊŠQýeëÜ]¢ÜÝÑâñ;÷(¯·Æ€ +™˜¸x×ù2ø¢§±ŒEʈ&½%]œ¼ä Z0ôg°óƒ¶J»x†8_”FBÎ{„YöZˆ‡ž8¾.´Ìã):lO­¢’^p¼ÿû ^T;‘ŠIK +:Â*0ΩŅô'°Û"͉„(èÌãp +Á@³ +ˆÛ’ÿ¤vZù‘á„áN>`{ŸÔÇÒä¨D=BÑãQ@ÿfvÓºßÃ_ôPxD;a%Ú íªòÜÿx}œ¨xy p=÷½#æeðÈ$MÔÙUóKºèÐŽOì+èÇÏâÛ¯r‘Ömg¸lŒWL;ï¬dËë 1à`ó`ý·yÿ;{¬-Û²¼ºAØÑÙœŒ"÷•¯ª_UP —#9¢püTª2ò¢u°x|ñ‚Æ Zêpiè:è@÷}»Þþž *}88öåTAYËáÕ¡•ZÊT_`ÛTñ†´»v8˜/ÉNþÖ²>ÙVáa=jrÞ‚ „’ýåÖ¾dŸ0¡°ÎÚ^çµ[Ç9PТIǬÖvÇyå‚ýß)DÂ~‚†D…·>"!Ù2 °§{Å©ÐBÝŸJÇ¥IÍôX]ó’í“÷~ìì. ~UÆ_dÿs¿ÿ¦dÅ¿©ž·Êaç#s.EQE‰aëWý.q­êzP.»ý× +ƒù©'öI׿ö›´¦ýà MÎ’!†Þ.“ýÊÓ¯,lx°YD,OHì%ý½So +O£µÙ¾î®çqoߧ•rEuA/,Ù}{¥GÎy”Ãx°¼¦.'°ãà°æ›¢—Å€G(O–À‘Ü«±¥˜áŠ¾ø³7œY2­öÆÎÕ»¨@ûE} +òâ(y‹Qˆ¢Å\³8Ejô©p9¼¬jg4HЇ†ËüK—fclI–*Ãõ‹D0ܶT“A¿zÆ´$(,ûÁ G9f­g| ðÀ)^Ù51æmËïŸEˆi£×˸¤õÂL$o~ï'zqIr@ä6«©±#þñœ}Y6Ë÷o¬MäXòŽPXÖ«Ä}S¾Þ +œ`Öx›ýÌ’ÈÔ<^)FZ£øˆ·½˜ßÌÜK“/1Ÿ(AS&»ãrŽ.¿²7Ñ%îÿˆ« Ÿ¯¤ôÂVûÂCÌÆ=(<âBQvç‰û5iù«©ÊYiôÀ·Å±úÚO ÈBÛ~©/SÄÃŽKÓ4²–t´+f/Aƒ•z*>ŽQJg¯ ü‹þ\| zÃwõ¤áo:àwLVQ:]ÈÁ̗œ¾vÑžòD©áS›Åçô)Ž–Äλ=!*Dºy(;íÒ®û±’ ¼Ç«"”èhú•»Ôç~Ìsø°XÐ~) féђƺòTŸÅóϤÌf#3´@½^q^Xç#w{ßJˆqïUԆ݄›µz)³ìŠ°†Ïuåfr”%:\úts¦?BÏÌL®éþ˜ñ¤ö˜¶iL°¢ ¿ÎªT÷¹˜úoÿ—¿ÉoZ~¹r€ ¸Î)ÚºbÄ¿_âù')·èO4Õ=eÑúïòCÄ«#µµOXÁ¾W 'M:ʼn"<Æ™¶d°EM$P ì/u”FÒ×Û%}I“z-Ø2¿k1äÕ†#Vš5Š -X—å|«¦° 5¶[¬ñt©(˜¸Þ”@û³٧ѣ'üòr ¿¼€+ò€ê}5›b/.‘ÖNi«G¾F`s¼K 0Z€ÖgÔFoš9ÄÅ&׈XåAëc?Ø'…°¬ Ì$šºe1!ì"’´iìUËb¦¨x{½ý4X'w„pÆ¥*vùEíâF_7G¯+é$\⬌¦tè" ܈´xˆÛ`nv?§¤:rkÐ"èÁƒ- ì, ­Á:P2$’*†Ü‘˜ÆOÝÛ×ç(‰V§ì©nþÌ·Qd•Ø¶ä«C3C쟿 C¼Œ¦ýÉ¥ŽÚÕ"‘Ô¾ÎO1aGXx”½í}Îù! gD ÜC„fA$ÅÇŽb/è!hâ^hÀØ5*;`7–ç¡ß%ñ˜T쥩XÔVø{Ê,&úú‡ò“°3‰sعڹÆÞÒŽs%Öm,Qä{5˜m&ݤƕh'‘Î-¸×˜þi‰iQfÈ-]Ãk\sû|ÌíOóÓ(Ö!¢V?ÓÀÄ ¹Mž§æ¹î ]ÿÒâ=ŒÉ”ö”1Êu<}W®ù°f¥cAÖòÔn=€Ó&§+˜ÌpO"—³EU&ß^?÷ùÂb‡ÛT¶R-ƒDxT¢ ÒD¢“÷—ÎMÀ.nUÛ¿¬e»-…øN±.ÌWÖ©@£ÃÄø6å‹x ô,08͵‡‡`k xx¯‘ò »XúÈ …Øí=ú?~¿Ó?ÉG,êä("¤•¹ÃLà‰âE`*šòœ•,+f?ZYÆéôrp糎þ%õýÓ€#**×Ä&®¤“6'~€‘BZußg„V©=Ø×羈›^/š7åGû„hç‚@‚1‰;up¹Ð¤åÉWÄÃD%@¸ú +6q‡ºSDË÷eªŸ¯ú:8.é.ùc•­f¹¢í‘=O¨ @H‰€(-cà þ}©¿ä®¼R(îùIU=]]*9Ñ ¶+‘ýð)$<`3´jœ¡ÞZ$#~Ò{~¯nâ°–ÍVi Cƒ/+dL¼3Q†ÙR¯$8z´Ç™êÎ?æ?à"w»¨""ç‹Ô *Öm€· "L§k”T¢EMcI™ ã1CY[ó«%ÚŒ ó«C)@x?R9—Q ¬W²Õ ãxÈ^#¹1cÆS£‰¦a.¥J£Œ¤çéóõÀ© (DüÌC.Å””Rá@æøð6±l·h¶Ž31NÌx wEBÓˆ¤ÅèK&#ÓMâtwrð¾`¯ç¼­xí4Gp²,OODºg¬±6]€¤0›QØé9ÝÎS9 K°ŸVØ)Ñ0SO®^\—æ_§&¥wEÞër +üÕ„“µ$(,¯Õç"A_øC2F/GxmGDó€@æICaþ…ó-J—ßöº@¬#{&fÅ—?3&¸SÚÅd0Íð‰kíix à=-À'Ñ8ÅsÜZJ3liü‚á^ª•yœË$éâ'æŽd³fÏæ-Ö’ø.ÌÝ»Aw»ÍtiGgt™§Á¿)G„‡¬ZÜÍÖÉé9 ¼,ÓZåm>HÌX¦éãÂlîåú<dd6“Ý%c)»¬(dR§9é$Ó-æG6Ìnä›ö¥ç Ÿ}“A…Ü£D=J Õiú´’/Z4ÇNý Ù´c¿¾Ò£Ž´ÑN5¥çF·öJ5í™@ï3¶ð¦KazÅ–ÿ‹tÎb¼,üÔèÁb)ò>¤§ÙÚä¥dó+$D A^¾–?¢èpål—F<˜‰ûŒ–Lé´Ï€ ŒˆpNÍسÕ… øj+æ´ªÆy/x@]ª¢{`½ƒ +›ºÀâ>r8– +ŒD‹îðƒˆðËö5…Q*x¢!A.®DÁ YWv*¢Ð‡Ü¯f ½³€£ï}Užè3.€Õcçqëlß¾ó ‘X‡.=j®©Ÿµ&À»=TÖ=ÐaÛ«ˆ=÷ ,¢O0ÍÏy5hß³§èz–ɉ>åÌbŽJo宦L4jͤs•°Éý6† Ì5^W‘kÁÔ²¥%8nS¼ÛÃ놲FéqwrÔýÿ郮vk‘´ ­Å?/ýW ÆBö€b*Ø…–Ü.D;\܈.*³üLçŸ6ì%í®Ûy¤øt·åp’x°ÜàVêLœ~)Þ¢Ž•‰°}Âç2íçÖ¹cÍ ¯àÀˆÐÁ­î¤%ý +¸¦ —W*t@èI¦z`i¬ @®ÑIØe?ž§¡wˆ0ÏÑN@b‘a5\éËUØAcG—Õ-‡8Z,L'1É¥žµå,ºJ/áŒñÌ€=Dfy@nsšãCµüuTÈGX¸†¬K¢}•.¤b–l•/fдßtÌ_W/A×J’aa©ù;¨…kñkò‡!,“IG*·ÛÞ¢ÛþÄ +µ—j:ÿÚä‘­ƒ Äôˆßu.mª·]¬.,erÀ)±S–ÔiEMÄ-óz¦ˆìHVBg@‡L_€µÕ½‰p5zà°#M¡îå XeOÇÌ[Ö`Í*ý‚~l!Mµ‡½¾¬ËùGcD„z09to£,l®ùL]8ÑûWn@ÉP%h÷b³Bý&Þ¬nXdx ý8/úsôÕö‚‚è¥P-;×8 N‘|!X7ÀÙ6kxA(y«e@‹]`,º{À¤Cu}ºy âó7µéÇݤQbX-´Šcþ@qå\ .¼çquOˆû×ð¯.`?|GõqÓQE£ Þ ßÕø»nAÃð RÜDàÆWÔ mhè4_ó 9QÂÆ0{¯Ó+$¯óBh‡U«>ßÆ>ü³:â½ ’MLîà6˜Kè”ïôªÖ·w© y{Ü0Ø$ –Š¿$Ö`+ÝîŠåÊï¦GòN¥çUš-–àç:¹PE¹|`ß+XŠc˜FA×"L€?Í¥m§ú[!}~È×zF}êQÀ1&3Ž¡‹ü7ÿ&ðÓʵᑠ +žJ…lQP¿¨í 5ë{œV§òvÔj½ƒýž Sø{¹ªêeÝh7DígdÑUy©`æ[ BPœ€ -›)c†¥³-8ÌTlQÏ/‡$´5ÿZ«˜"r¾ ‰ôe°¯–Œ»D°CªQ ëÊ|Ö×c Âz¿vóXa ÖpKÙPpVHl:SÍû$ö}€‰~"‘Ï©8x)šêCa;+c‡÷¯¶ ÁJA ”wÚæë¼Ò)tù!£ê\Å«iE‰w=ÐqÚZýíÙú‰GUµªâ룺§0r±bHKÕTM=X6@J¡½°^•ˆ–B¹s4´fØäitX=ô;ÐVÚ_É–¼+ÙÀ+íà#9°”sY?òi×ÌÍ·¼¢µH Ⱪ¡\å/Ïⶢ9¯5­@Î-úïÍ÷ß³±ÿïÿ¢ÁÍ_y¢ßpŽ‰ÿdÿó‰‹k4xXWóðLŠðŸ:¬'Ö¼­;jYX}A-’2ÑÆ;ýpµX÷†Èó)¼]²ºÃI2Jž‘LO÷k a ²”jÂÌSµÏ$!ÆBU÷bŸ¶¾¶Âø/-…·öšÜD3êÞëfk\xÍÐb&è5!Æ8`*tåžn‹ËK™ƒ#¾;<Ö=éžZ{ í©5sœnÄ6 +yvÿþÜzè +ñCO}0dú;7½ŒYãÅÒí|fgAö€5¿i·ÄNx&çžÑZdB­± ï­ Õ# ?N.%¦ÁÐ {Ó/ÏVD-ƒçGïÙN¥bÑpm¯NxB°×æ‰0ö˜p©ƒ RøÓ\ 'P:,û’½aY’Z2†w**ëÉYœã˜ièÐ0‰¥¢ [<[|7T¨0ÐéŠ:‰Šs™˜ªñÁòï÷½-8wÓûi"Á¤aé;¯ÐŸî£PüÄ ¸Ñk=<‹jâ˜Õ›Œ¯ƒÅ:„0ˆqCùãœëwòq0ÇjPà5cý^@•~$­Ÿ¢dKÙη`%œ¿ÇW£¼³uÒ\¾÷39X¦X“ÀA@x˜jØ„ãÍì+ËË1}ûåi€iy€ä’¼v8Ðê瀙ú>°ß9ÕÍ_ZGÙŸ—R+«@Ú¥xi«­eh¾ä8­X ã,W>©h8ˆÚ½ž²‰OW€ÈÐçßÓ—SèÇÁzì‚‹X¨ÌúNpüôôßv€1¤¨`Úé;íõEÊQ*º*ì›^1§£ì‘3’ÌÞë@±YT¼ý`y`‚ìßT@ŒùŽþmê6óë@ì™a¦i ú«O¥tví([Òlϧ6G‹yÉÚ?ô ­,=ªX¯ÒE;Õ¥Ù ²ë¡Ž°¤$Ý8À‡4÷ŠY¢¼P@U WÌq©MÿêÊû¯æ¥Þaºäç ÷Á–4+`yê4´ñØ™A¾â\öŽêm&#|ÓÍ¡r WësÓvšV_)–;€+SMÁû ð˜pjáSÍ;qPmœN=48ÉÓ©|yO­y|Õ(Ò>Q"ÈGš…[Ʊ#JA­X­À‡õr……„fûã{Xšó¹{v OÊ~TtõœUTFð=­k%&ÅùËÎÀ²^Ÿ§à¥Ó‘ÅD v…FY帇 ,®µ’U^ñ¢Ý ìƒR½»…á¨-9Éó)¾¶´)4x"ž‘®B`E/l:Z*‡!NÂåÕk¡Y†e¬^Ú3éèüO´Ž(Y#p†‚{Ö?8ç,Tßþ #ë—ßsƒ‡ìÏ÷¦¥†Vb!öòÇ…ÉŠÊ +°ÞÃîn¼zéÜ'Zåz‘†êJ‹°‚H%AhÆѶ¬-çòÕ”‡VKTÖ‘$Á +¼A—·­/3›!à6Gi)ȦÖëCTÏìr€æOçIÝù(Xßž‹h ŠAëÈ„QÔÐÏçlÑ+|ç;”²è8õc*G˜ü;ÂÌ$½ï‘žöÓЀönä-JƳŒ´µÄÁª0‚×ÿ¾¡ðq˜ey¨íöÞ0‡ÿƒ–ÿET;Mý¤¡W‚k'—´]1>¸)T»wDBJDÐL×™5˜ªÔ@ä|^µ¢~j ”Á¨JI÷”6É̼ÓHƒ÷J¢ ç ÊbŠ‚ }éÁÚ¬Œóm¹+P9çK]Å$ìiŠ8|Y² ßlO¥‡S/·M/Xf§dp9¬ú¨Y/ËA›º„û{•Ñ¿Ög¬?Mú~@dbà‘“;U»U)ݤ½ï–‚zˆ7t›¾'š+Jÿ:ØO?{O÷ ±Ke€æëPmÅF;.WjB>ãVj÷›iýô-âO§~*™Írߣd%¦p°5éñß’ 3½»l÷{í°è Û¥8¥k|”UÂLì ´´² €úoÀ«ùùtš]ç™GƼH!±±‡cVP¤åQ‘OEº5ö°¥¶c­m*<Üe€wn_h©¢Ùeºu¢t)¢F›÷ï6Bë–2Àª^8E‘ÁêQƒ\Åv${k†L«Û‘qmzëQÜï"ƒZ—«P“ ’½è³ÂÒÞ 1ì”ÊF` Õ{ò?~;Gú=·íRwß Á%*Q'[®`‡ Ú-÷³¥|ZWƒ……gË,ÇYõCßì(Ücƒ2Ÿsƒƒ¸'QT•Ó™R«°;CÝ Ä'æ…BhÞRâö0ÿs;è·É»®ýŠ|D1 Ýû“åæWÚÐp‘Å ÞÍ€98ƒ‘/©vÍz¿²gMÔ PÄ–@³î‰—J'«œ%<Å2zfY +2+žß]´ö¾ÑPÓƒw9Eý óœëxyÖ(Œô|9¨;wwÞ`z°Ùë§úAé’´±°’(óåBܾ߳H×sÓIÄRx E[ *,“!QÅT1{Ì€aQ1ú:Pîú?AÆ­ó  >vó%*>H9/l–‘þC.-ªÝþË^PçyKøëß`¯¨Ïs̘•Ø-Gbw–—Ø¿©~ºè/Ê+E`•j·¤¦¸&åèÒçËvºòû÷ox„;- ¢zk0ÉFG­üпϟ4#=+öKŽh_KÖdš{¬€¢]ëÏ£–}œt@†h c \<ØóAA„z=UW-’;¦õ|Ѩ4»vÖë[òMP:r¿ÊÅ} +ÁÍ}IºO8Õ<“pR;pÜœgüéàRí5ûU1<ù¡©®r.ÞËÂèX^A"+´¾¤æ³šrS¸ÔÇ)ÿ) L7^ š¬iÔAÏÖiµã#O)TG€½ÏNKÙç`"s Ì_w®Q@uŒxºðbÝ_ñ¤7b+j¼™ +Õ"˜ NMYZDÁ«» +Æ?ðAS?À‰òppx›kÓã•ôRï¯ô?éíýÕŽøü×AÚïúçÖLGÌù`ô€cNY’(?}ð7²Õ­ß| +Sг Øg­bÅ+Ü«ñ²>ØïK,”ó€'î1 úÊ!ît¢ê>ÑŽJcP0ع&}94^ù8ppA©¬·ïQ”Ñ›^ÒÕÁ7–oŽ“+Û—fƒv5÷óASÓB´Uz9Hð:n£M eËÔµ¿Ù3ÿbiÁdClïûï iíwCßä9‹fK±h†™ endstream endobj 77 0 obj <>stream +l?¶éŠbôpEÑq•=¸%üÔf1h¦è>ÜqíT%<“[è€(ÿ™^g![ŽKss‰RüTó;Aúµ^³$=ñ0foG¾zÙ ÷dhHØ‹›çÆuÈÑRò› ±Ef&%6Ôhè:梹ڈƒ¹yìEÌÈöæ)Qªž±M›#èœÅÑÅQ y†?é…ÿïGìX|·ºÕx ùìNô¼‚W¬Ì>Ôe9ÓO|”©!Ó{ÄwÓögÜN”{’,Ú2–#º£zˆè/ >-¬)žC"\ÚR>,¥³À8ü•ÑS=FOP{Äé¨ÁwðòŠ°ÒÉg/ªÍ*~#)$Ì(‡¶>¸L4ÙÝÅÞ2)Îf6„ðò ÀzQc9Îþåì}c·¾öªŸo>>5!m/õT"³DiHˆ<°’‘EH#”d%yk{ñÉW «†“ŽAù±ñ$hÌs +è¤Î1#B¡#扰vÑBÅLjq¯tÜëv”Ò²R§’Ô)Ú+Ö ,ÞRlvDµëú³óëjÙ(; Ð5Bûñ…{œGþKPµÈ $Ú¼“•öÙþÞ©†< Þ.a2¤  +ÊËåê¨^q/¦÷3øš‚ï30ìªVz~P­f·îF +ÖaPÌ6æY¢ö³Sº>-š˜L IK© P©Jw¡ìy`mŠAw +ö<ì¸÷44mä=TðÈÎ ÊÌúºÀb«Kké\*|ü‘*ô]„²ÝÀVZMW%.p5z!ž m;o) +ß1½S(ó–E†ºÊcû…ÎœŠÜ†÷dJÜÉsÛëÜø¾¨d¸ÈuêSŠËªQEÇíÊ®T +|{ãX$ò~DÀb‘ÈÅtôB¹Õ#”H®iÖÍ‚_(¡Nk@E„€¼Œéu–ý)Pv øOÍ*Èß2ÂBöhÑ­ÂI"Ñ'²t«¨ÇvöQâ~üR£EW¢ƒ‹Mî¾Âpu´k: °ºr ¯ºì0¼æíüMž²®¨p‰u* ú¬.ìÁÝÃ…ˆŸ€îNq÷OÂøåî`5‘¶p'AšÄ zõã!=1©Sæb†0½Ä>Dþ)ž*/59öÁ° Úþ›{|ªITȺkGšŸ8`¿m×¹¤{v½K§\Î"ýuŸegG/ga¯«Ç F»Ù"–î- ·Ý½MAalQ+Su+Ûì®÷@À™–&©úK0âãSrT NL{™ÒL$çj>§®‘¬tgEßãï;¬‡1¼wNAêŠÏ@Ê_aÎ,ÙT`챕óg¢¹ÞÚäÛÁõžŒ‹m$xÌ“d°&T¼ÏC£ˆ=õGJ‘¯Y ídŸ^)Š’¼>ž>9ežfõÛ߯Øë¡þúØ u‡¬ñ¸”Æè´Œ‹–bç"ˆ{ÐõÑ(ìëþiŸpïRÑÕ²Õ ]¸,KŒZ±›}‚£pÁFüÉeyGïÇÆñ+ôˆŽÿ¦[åøÂŒ#±ûMœ!GE3›o?­j‰nöÞ)ó=tÄøfÝíònÆ&®}FÄm;™ÅÇÇÑ'_GákTźXˆ%Ïg„ãž÷ý øÀ4Î×jñµFh³èÙD飆üʈ½EÉü £ñ:€íÂ& £ ©}ü0yê¡ò¦<òƒŸÙÖ€èÉQ[Z\•ìT ­îÒÌ™ïe±ˆk£~! +™Î<æÔTȬ°ÃÀ¹$¥â»eªu:}Î~3{Ã×Ùú1`„ç6tB2ö¢¬O_Ñ7¸ÿ®J Xâ=™ýycnØÞK¡¼?BKYVGk Ì>P©q"òÓ¯< tóâ +CÜ-ø0ž%,_\2ÇùwÚšÄT”…~2åZCÙ¡ŸÅ]¤T8„%6ÄeÏÑFc[úíùpR8¦ÒNV~êóïO¬s·1öÓÁ+ÞE*IõÙvAˆBïŽ(çQÎñúûëÍÒj-A­l_‚s¡àÀ¾7%‰Í¡’à M\D„rsnª„(¿3iÊ´]=¨^xu\“:Dq—¾=ŸSB…S½®Y!Ù°bwÃÖ#u}pD˧ýêÂW!]>Þ/"Ô°‹[q2ê=]9§ËØÔU çÇ‚×Îhq³ýC´Hùæï3~BŒ¥IŽ÷ôò2S·V¯\¯ÕE‚ +ìîoAìˆGx´lnðj!¬ˆF9;Ä>β°žCö,%D‘D¨FBɈ܆JÐkLÔŠN£ÛÉ4ýz¹K_×]dGŽ¼ xÅôæ«ŽÄ%‰I} Y¸ŸÍ`Úm1Œ£½¯/ÝÞ›a<äßçíw¯ÓßgÀŸ¦‰ʇwŒŠ·ªU?´Ãv áûÁÂY²`$ù s¾—AªÏ¡œ=þÂòk¼ÂÔÇ›†jW'/`µ©›m}CB´˜˜¦d®é¶„ð nÍA;¢ kÇ°D’æujÈð 0Ûïô7ÀÜ©^t ^;¢u*.6r +Ï øMÊç7‡.ÔǺ×/‰ë÷ƒ+døÊE¼±™‚U„6ºbâ. ­¿ÄÆgÅò ß )„{ÀI0v¡þ µË<† ‡‰\7÷ïñ&Ç›§¥èâLþ7çZO¸éLòT[ %JK9{–Äm)–ÊV‹”¡]^Á§á¢n‰‹%Œiÿ _‹f>˜D ÍäûœPå9§‰j’ÌkÀP›¬ Å‡öÇÐ#%<ýŽp^kš¡Lñ¡L•呈u2‡V‚Œ Uø}Ngƒ€³{8`²ãfyoYÑr­A{§âi¹ŠÁÇ^™)*ëôßö¬ñдq;Ø:¢¹–“èÕÒ´£Ùó +‰Ô~0Y±º¯k>Dkê/ëÀÒ+¬#0^húîœ,¬È +³!R‹xf¡‹“¼¢Â-lwö;°‡Ä`bP/yïÐjéÑ+߯ÄLNDÔÞa¢˜t# +c!Ø|íœgœ (>Ž>ħ\¤!s?)Y§÷°GˆR˜(A…l_ÙÈÅëÃÓé&>9ƒB½ßŠÌŽ€¥bÄÙìíŒjg²lé@U휽¢Û @%ÓgIÜpЖô©Ú§c½/ƒÖ)^üʪ"™íZéÖÞ| ÷Þ²±„¼>C9‡æúéhhTVxJ„;Ñ¥ç3¢ðûùmˆó"ÕÂ8•”OÄ@ÍwÄ—¾Ìy¿×T/*ÔŸËÛøtË7ŸBö†Ñ¶ßàꨱ ‹f"¿)@á vv‚(ŸPÒ…Q•î"ŠÛ Á_¢„Hd¹b5Θ‚€$A¶žCyù]Rôû¤mD ®²#ê:ˆ¢d'Q¼€aJ”èHÈW3¾p£U¥»ZŽãHºIΚïÃs¦>n +ˆçå§Ý9÷e'GN@ú|EtžÚ$Õp(ÕZ5•.ÜVõÎQ¬&p/ûMD§ä=’ËU)ÿŒB‚ _\PúT*xxâäóïüA9¥vȃ¢ZUW¡1|öÄhy ˆ1VÂÀv?„I åã,¦VŒ¬'|Ôò=Ã?|ønèÞƒ *ÑïÍ%áTÝùpe‡12æÔ|!‘EXõ‚ˆØËÅña­´‰[¬9‚+Y” F‰ÜQSHŽ™jUšÇ• OµAhìCVm8;îE=>N-/3ÐZ1BA+ÊIø˜Ô¦MÛ"‚®©8ÁîðÜ͸¡•Q½)›7jeæq˜–1‹–¨"(V?›cu#ð; boã»ì=”¥­Y¡B”´ T‹UL'Ö¢&Äp|ДØã\QŽÅË3|Ü1!Ûã(\ÉÒ¬UMö÷¯´DR²;¦ÃþÍyš +={m~¸Ó;¡a#À:º³YJ^šš¥$3Ü\ĨZÉLzÅf;˜ò‘í ÌN¿U Ä93&¦ 2&$ˆ~;óºùxðäˆýµ—†Þ¬´öë·_} +Ð-25Ä›Hd¦k*kN ‡†½/ÚÝ’ƒpîÕJÞž¡2$ÖIÔît„ÅÈcûÿpl/XÅcA÷½{lIJÎ_\5PLäDTȘDLÄ‘òY§Ž·Ób‡#Q”´ŒR%vG­¬Þ2s+e„V"‚Ž ûå2b¿‹c K¨ñ®h滿KºÞœ{Zp^‡#Wi„8¯ 4©u))“Ö™hL±Š°JB4šAëäSÃïíYêîÌ<¡¥Å ¾‡ËŸ7 ãÀÑÌ )Î|¼o4Ô‚p™MÁWe=€Ù ?Š× pµ²™U­w Ê.ÿÙWÝ«ôRÚ>G³¼ìi@Ÿ‚ç,™9~0ùÍúfÃz@rYz‰ ¨è¢žÑëôÊMòQ¾Y +W|rÕßç%FéƒT²˜Œ8"væcÏa[£1îuÀj¬é^¨‰§ß·2G‚¿ãŠ¬~)Å jOd$¹G†%Hò¹ÿÖ+òËy¥š ´æ_¨Lé#X (åüã‰j 8"VÇ+OÄ(ÂîÈ9£“$\ñ³çÂ@ҢЃBýSŽ _ jÖí³p0óÌ@õȳƒ”Få€ìÌQÓe`/Q²3Æ –ØC9¾¡„?ó+¼çUnÚ³ðß=%ö!ƒ–‡½±=0À±”]a™ˆÌ£+õ6Êgl'õ± öᲦÁh%à~9¿9 ¡’ØNäçBT‘pá QÇ[o*¸–ìÒÙÙ¥iM=ä&ÃzìÙ¨qÀíÈhE/„_æ‡óÆ»˜’ )W0ÿÞBˆ~*¹—ÕCš¬Q‚“h©‡QU´?9Böãl[vÄ5åN!ÙGˆ„;F-?-=‡3™eU2'ž uç‹g¯ËÙN<›&«55lAѶ°Æ<(CY½ÎÅMÖš½%$9nϳaa”§pí"„’§8 +ø…x¬6`¨íË']aó¨ÐÞ†!Àg†Ã‘8A +癿G±7O bsYæÑäº't;¦b|(m¶XúJuqD{ü3"~SýÄŸ}•$%ë›ópi¦ŒÙ¯bþ…©8Ȩ€ŒªÒ-9¼ëŠÃxŸŸÈSA´‘F$®Fጩ½ž²=©ø9ïiQL¡N€f6ŠH²¢yºÇ{13(îK ˆs(Mlïu”«x÷p°™lÚy]è³ß‹ÐÎbß¾_4 +X¦4EÑ(# ù…/À4ˆà¹5Uu©M,jRñE÷ÈÅ tOiãdRLÿƒ~#BýãZçªQˆD +o]Û‡ávÉŠAÑiðQ4ÖàAâæ}¯ôõ„x-áy +$Ü™šEªTVj)5« ;mCr¶òÕºS +:Їnßœ<•Åž‚¦%ƒ|!–‰¡{Aì3@0]!ãžë7QÈŠC˜„b©_=VRröCÝ·Íu$ І:l ÓÍŠ~#o˧Z´‹¥ÛNÉtÇÁ´ä ôH–°¿Ñù}¤TÑC¡J{,X ût:ì±h6D÷¯Xl/+{ æþ‚è_[èÝíµ„¶š§¬WÅÓˆ~³ —h†ä¨±±¥ÙéoZÕîIæ(¦EñbG!qšk®Ì »0*qäÉ{©XË6iq8iŒ¸wÐ`.,TÊ(*iô‹¯¿¹ìð}8˜Äì5–¨ÔKD…ÛpÙÞÞ±³£ýŽìGÁ8S]YºÛ¡E9ÀŽ62QUããE¾¶öËhaŒ^ø +d}ňT«¨oGÚœ#9Ûöð§B8ëý)`‘ZW0>L~g(Rã³Ê»Î®‰·˜šò3by˜åèêðô› ÑÝt@Þ*É–¥j¾%P|R§NG‰…Ÿ¡-À‰%6™í+.àPeŸHP׃—&®ô?ºò>{šÜ«½¶ÑDHúÙ×é„ Ì®t-Q›®¯P îÑÓÝcqÊ^ö‰ …ipš”%wĈm‰bŒ58ÿALº1œ+›g¹Çó–ÒóãÀ=êNñ5w2§/s…Èàðç¢B.xe^åÓ®®[âK +ÕŽV‹¾Î­`‘Òyau¬¦È¤UfÛpIKƒ°2•ºn“ýtIU +áþ8­²HÕÌò¡R ªÎÊc«ÊøL:ˆ–&l?JÈÕBd…|êºìêw'AK庬pˆR³´{= åDØ·6≕–)ÊöàÌqTo‘ðiÛ¿®“ò5X¯a°>g|z?#? WÀ«ÇH`Lýü·¯ŠGÖé5¤ìD ÓaÓ\³@Öo¤\±Í¹Ó +±ßf^¢%h‹½ý7ª9Îדøù 4O´PëQûAS™ ^¥€†Þ©*|¥o4_ ÷xð:îŽ0Ûß×çy’“øÕŽ&–… EjoMÁ~Ù€œÏXå»®x{Øk<Ç;ˆóì“EAS×B† ©J5¤À4mg‹¸ßM| +Î +…V(:ƒŸDv‚{úJÇ>"üI8ÐS°oÌ·ù8 ¿xöK¬‚yk[¥NZæ7àš]úý{úü\?Ga5d:½_~4¬z…{Pæ2ˆšPJLƒíþ6¸Ê3÷ý¸—Aö{ í¼'«Pï'¶×ÕPT̃RE|ôŠÐ”Æ>¯½×Gm†éÛ”‚–Lshÿ¢6T×&½i Ú`–"¿t}FÜ¡6Ø|i¥À;ÿy|´vò@¹ËÛQ`a°·Øãk©þ¹³=Œˆ7ù·~*¬©¼ëR{ž3-ðÙ¨Æ`RÌ»l„/7ö¶å(d3³%'ÂV%Z6`G‰±òÑéÅ@Ÿ¼™GðÉ}÷<ƒmߪó®›ü×a»R¿ù0y[}öB-Òs6ô´*h.}q<Œöë}i°ŸA¨`)úŒã¿‚iW:)Ì–˜˜# ÙïÝðWb×´(f1¿÷"Ø-¸NBW¯§ )Ä +‰*fñE›+ÇQÞý&bFï¼Ñ¼ä#ª’hù¥$æ‰/ûH y,Zý(í”n¤Ýìi»£]¸{¸V¶¯ï÷ÕŒÚ`:À½Q®ÝSt¦\›\æ«ôoþÌžj¿7î©Z½%Î÷($ì}&ˆñáâàÛ9UWqr¡•?ß¿tà\»––¸Þ"âŽuéâ@º«¦\ç©Ó:“·6 'ë'ãŽÕ'ö¬ÀQÆ +¡tH]ýô!V%£Ÿ›}D¡kñãh4¡Ãü’íñ™©å™ pk­˜ïè)¨¦):ðZdifDáçâ¤s?ÕÏ‚‚DZ†>X1y‚ßgXFÀ 0âú§v-0˜%5™;êì<ä 1¯í•ä%Ÿ–·.‹ñfU½IšªT°:’Àÿ÷ˆXÄ–í2™ýV}{žç¼M™­†ñöRízêpð±òá´*tZ_Ùë[T;Qµi½HVEÿw±w‹By+X¸…]·?i/¬ä|õñGïÕð±>Ïå®ËífnÈÇž(2–Žy*Zv@Ì@z숦ŸŽóÕpø÷#ëx¿›¹××ycI(옺¦¨¾•I~çÅă+«e¶f”‡PJáîúݼ 6b*.ˆ;õczJ’nI`ð%s<þG¢ûG@m=œèØ9¥¨"½”§bëóMjgU¡nÚÍ7ÏüˆÊaÓØÑ" B¥‡ C·D4X÷OÁˆ,¿¼ðNÑÀQëקªÒ$«Á|-7Ôð('Ü?@¸ÃÂ<ÇóÒ­²ÌZ Ûþ¨Úœ‹Ä€>”†íÔV0Å)–u5IçbÜjÀßÖZû@–mOk3¾$]¼ZÇgÄŸnKžæ„ 7ŸÏ(Êëô£÷k¯/#&û^TÕ•ÿˆøfmü ÚGƒöýáKKÏ}§Õ8‚ï…@Ûª†Àÿ‚žÙ l㊾‡n©— \{´­ž ‰Ž²¾Œîí J­M-j ™î¿ª¶ÓžÁfæGC–ºàb×j†,×PеS¥¡s±g•ýT-!©àÔì#1·úl¯ÿb)Å΢8hjßOi΄ÚȾ³î=a$²'Âô‰Bu,ð*lͲÐ]0W·fÄA1*ïêAÅý,"(”Áö·ÞIð{½-",¼‘ô¼p×y¯ÄÖ¨-°—0?m¬òOœ§x¢ƒë‹GÌ~ךþÞ¨ÜuKr{”g#ô^iø8”[ÚÛóTsz àˆÚ‘ž.ê'1,vBÆánþÅÒ#]1œ)®¨!Áº0Ñj«sÑ>¹èßJ—aUÏÚñØXˆko7éy¥Óe£Ì®@ ›²°‘6ÿªÞ/ +š¬j=«zÇßɈ¨êCÁØ­ÕrS6ÂY‚º¿ÉŠ/Ï ê èä{~ë —áâK”ri°„£Áï„­°é€ÆªÅãa!œd-ÆuÊo†ß]ŸÈßã:ÐbúÒÅnIÝègr#Ï“ÝÏ`µkètN_]©UmïÁAÛ©ûí§OÆË'*Ë|LR͈ª4NR¾ºê'VŠ¡¼ºlm, V Õ>*b²Žåï+|0\FÒGÔÇ=ðp +³Âè $'–ÏhĈ6GA–PWä¬û± S‡NíÿOm§õ‡YÝ +ÔˆÚÙ¡áÐ4\c[ø(0%DÆY‘Õ€2êÞ4Å +…¸vD3p“ÊÙe qG5ªóD ЂE'ƒxêDdV#î•oZ§μÅæPW€ÊÛ7ÛëJÝv¬‚ù|ŸìÇÝÛàB~³o¦ó~‚aZ¤Ý±÷”ýœw*ÔÂ}ØW‘_®n<EÏó™J?_ªZ¥W¬!g›=v¥iÄ£o'¢ +§úD¨Ò8ÈF›ú³x¢ +¥½1.èuïDÛÊ­§€ÆìˆLsگ£У<¯%A;16ˆ¡@PŒ„)òÂI˜ È'L†_Â×>Э/r a%·[¯G`¢¸˜~‰f(ûNWá[;‹Ý«e¢ù«x&ð“ë^ØæEÖÞƒ•Àv¢+™ã‰CâŽCQÿ¾Cy©ØÝ&9:3ï¢$ŸÄ0~~jÏ“DløXÕÖŸ+0Âèš~ ˜ƒv[¢XܾFÇOQc…‹O“²O3"Á_šPŠ¦íÞÏÀŸMM yš1…fjñóë®ï›AK$AöegEˆ‘A; # Lˆ8¤T»‡›¨Ö:ÇYD8A_ãu•Hc@5²4OëzD«ÁvziÌTÀC‰o[„(AéoG°Èïjhû«[_W²pĤŠ™§<=†Æ8$ˆÙ#zSFqËŒibd3L£ ÅÞ¹~Ä´ðž¶}œ†4qÐ$ ø*4o¤÷tWøˆp´ù¾¿Q+RV‹>½Ÿï;Ï÷ÝùÖEdç{qÊ´è‰íì‘ öÁŒú3âOgÛeÂó§ÿq`Q€ø&<{"¤ø;¤†ô Žl‰L@™(!ãQŒÇú€'À¥î<0%Þˆš–thÎSï-êáí»ˆ@³õ£yHñŸQtÈ÷ Â1šB ÿgÏnŠ¬Û™}±TBþ˜)´;CËP4rã3 +MÝ™\»«Új«£«ˆ7Š@«‘y¦JFU#œÎt¢«_WŠÕ!¯Q©d©á>j3ì®Ð 6„YöCìž¼»j¾ [4#V(§ëH°o{@3V -–ŠL"tŽ]e753 +ú iÌÒD†iW ‘ÛU~(’8ï©ðþ¤¨–C+›åŒK#Øï@øýØyS©pßQuæ6DüédMXìºÚSä7ç)ö’XþÔý¨¬YÖ¹r~±Ó‹SÙüæX .~?B¶Ðe€úäÄ,#Òþ`½y›¬Lú)Ëò~ûxM(0V„ 8ïg¦žsI›¯ñ%)¢í™– ©´MW¦¸×-îu½]v¸pS«Õƾ™  "W_7vP©%@ŽžÆÙ„2±‘JP u%Bó½PÌاë\Ôêa$“ça®!‚´?pê=pêÔ3 ˜Ì'¢8Ÿ@œ&z¸œ¢˜tëwiPÒy¥ð*RE6 ?¢‘ØÛsX¤ x¡7±uÝ«Zû&©Rï +UÜ£Vü•ÁItD»s%Ýjì Óâ€ëCis¿W0£èÑ Gl‰÷ˆuÍ)f¿ˆúÔoÎs.òSâŠÂ§íß²n[Th÷]d€–xs©™Ý2}áy{¾BàúJPöž–IËð}Ô9áˆOÉ¢nÅY_A½z²åKŸšŸæ‘gš…`î…^pD¥L½Û9ÝX& +5]qêT{Œã÷Чæô*ðÉN”?Õç›%°‡9´R H›ø1Ÿ#`ßegSWfå3ªHþ.RdÍ›Ùme¿¾%˜O€‰y*Ô{ùA(rðƒö“‹ˆüÂÔQû‚cÅ€Yç ÜZˆ%îGŒ4õ'J,ðŽ@K€¨0zˆ‚ÜÅži½.4Ðìýž-hj`3²ðú¤n¡D6·Žh.P¥@ExöïUcÆEÞJy†dÿEž¢œ%§” 4¥â=£ÐÐøÑÐÜå]ê¿Ö@Gû›J¥õ…=ýù`¥*äÂÞ“&‚}<ÓÊe?ÓYSÀ#biù÷*T !íÕäÛóŒCú›EIh¾Ÿˆª¬šy‘Šp˜€F¼ÏJmê(PØBê¿gæ¿=]mtÙ‚qz"ý4ØtsÁ¬tÈ^äõ@.¡ ³2Üh ƒvÒE­üýïÑFiQÐÐã8Ñǧgù4éŠÙ¼v’qò‘ÏV^-ëöéóþ3Hׂýý•˜%GöÉt±èmðÕ€"/m¤Xq̪§%Ðõ]˜¨9ó ó’RtŸ¿ºS×îÛV4ypùÛˆ¿‹ ”õÿÉ}—Œþë\ñYÞ*èŒLIvá;sÆ;ýp™(1Ä,çs†QE~7Rœ‡ +?=ª6DH|Bvôxñ¤(Ðln5ÑQïöá™åBf‘[ ¹Øÿ”vðk\ÉÁº¹¿`»ñ îîk‘Ã],Æ*JÎzÊbß9.Ò–ya¬Ú<3ʉmï÷Úß=Ðd*úkDPw­¨CQÈtàÙÏs%ô:c_›¾®T{:hHž¨àÂËóàŒCDuTék><Ðis@ÈéÓ‚Ó´ +%Ÿs4¦oÙÛ¡)³×b:$ËÉ;PäÀ?È tˤz|¶E—“µºL´c(f¯â+öçOÀ®›ôe<@ÆàíADí5Â=ýür”2 ^;â(FXÛšDFÕ> ­!8yÚØb°J „MXDò¦õ½Ôhÿ1þ*’lETâhäL€j•¤”É8©7Ý—2fïÁìäÖ¢‹öãTuø¸ßYqP Ø2°éAQ•:,ö/æK#ÓúÕF–ÎAYS|-+O@ú™"‚Õµh¬b„h=rÝÒOb.p,á·±;›–ïj;N€PO ¨Ó DÈrþ€Su"Å3ÐúlagÐp÷+5ï–v9ìWÚå\w¯™±O 8W +t‚m,Ëò®ŸØ‘'Š $…=¥}gX­0T¾ Ô¢€PÓ¥@\|ÓÌKû-¶ý=q€¥š†Öb–ål#[VÛ"ŒA #ÛJgÌ›·íô?(RèØbÜËÏ,Lû¨Õaè†57ÂjIbûþ½P£ö„E¬Ø£ [“ŽMPËÛ…m5M¢›d(j€Äà§bDñºÔ^ûŒjÈ;` +‹j®’Hýò­¸ ²Ù6‡î+ ^Dä.}Iö¯ oÏÞÏÖ¸›)"¤fªÔ5¹U¦|‹SPí&"hM2ÖëB#0W»ìÜ—˜×“µ@‘-‘×P,€9ì/ÚÉZC!˜'oö°Ÿ¼MIT‚RISÕ·r»_-ÞQ=ÆQTÍÚ/v$àÐÔEwé¼Ú‚^¼¯@ºwúj&\Úß5-JT'I˜)Ö3êପþÌYadF½+±hþ@CÁõ}c«0¼ÎÂÔPSF¶eŸ/)àÉvËÝBí¸¨5ÂÍ- œ!™YÁ<ÞwJž¸VxÃ$GVÄ@gJ*õBe ýŠ=`ó™wQS¦Q¾§¾¼ÔÂÀq“þ]cÚ‚O†ÁÌ<'xû< ôî²ÕO” iÕF‡ATÖ ¢ÔáôýC]{œ¸JDÖBÌØáy !C9.äOÝñýŠ½Ã"9.˜ë|´š?Ãóê|){tú(õ*n=Z(;³(‰E ÁQ1ãC³¶ÕŒÎ'À@ 6çØý0ÔTXR1ÊR¯ÎW9®ZhLº§ I)Œ˜ž(8[îÝ–˜{IÈK¸%¼½Hw ?Ð-#iÝ ÷7‚f×É÷Â:HTˆ¢Ò—ÔûꞇœˆÜ!¡š$Š|Á:H„&ŒDøº¤CÝx]ioàŒ¢ì@ÛO‡qëq¥ó=É 49~ÉΨ†ãŸÛ"hÒï•¿xÖ‰´åÁ +ˆ cœZBSÒÎý¦”2›,ÏC_Ó½^¥+ˆÒ8m,Èün‹™ÀŠgäA7'g;;+i_Ô IÞ§]6nLvX«D¥êÐyˆz3žvRŠ .@KP€”0µ$Š»48¨ˆôõªˆ*¤\0e@‘Uv6铼=›28«3ƒÏç^ißÏaM*`4À& í¸¼©ÓMY‰(€ôÌtµ×‰Ø.Òn +e%›*6…MDÅjéev~Q5”rÜ~X- i(*-HCáb%¬FÈ*Œ¤' WÂ'È9‹jË¢óMà8­ôÀÅ#¶†0̼ςâTi@Ë”^é\H@eo{„^E÷‹”ÝVq +Ïcjðå¶pkºõj_Ò îà#^EŠðöËÑ °ŽËØ·*@-F?sD KËœÓ3RøçòÊ/Wmåüш±=E7Á®8‰ìGËä¬ +¦‹Ãoæ4¿ç¦†½=.ÓEh3?§(²ÐØ‹îf±„V4àÐ3 +%Ö¡§úñ ~´ý²Ä~öá(ð(ÆÄcCI/¤¨ÛpL/a*§—ÖäŽÂ§ »-¤•ˆ +~Æ€$"ýy#5øm©ŸvŽ½¸ç0O÷=À´«Y™ïŠÍLp (Ñá[ê|ÞGTV—¯„  +' Bo=ìÚÙ캢Ó:f-f¾§«‡*]=Ä@_À^!;¢}®hí-[°ï˜*PkP`ln½äÀ‰K’°ªÄH¾Û Lb¸ + Íæ’Q±¨<ôc_¤ýÐå€ù {šÇíœJ䥧 :¡8ñ<áòSÈçU2龻ꊉ@0*UIøÐ +ç6á=’‡µ«‡¾ŒM’ ÿú+e…§ø_Ó×ÁTj¥AE½Óè½2®YêcŠPŽ¼W¥¥0dp5…XB%öž>VKp98;ÈäÁìÑ÷•ÕÊ,ƒëS ôæ¥ADw¢NŒÕj”>žKTâ¥9²P z<̺>‚¸›—Þĺ!ä äß7Ä{dŸ:à˜0ÓZå^ˆš$}RæÍ¥‰X€{rRª²jÖ‚0\¦„*4ß1ÞcÊ-¾‚û3^ã²kö¨µ3ñôœoMÉ6“ßÛ;¦Ç^‚M^–:]êF›(Ñ" ÒçƉŒŽJ\œþê#ñVø@Æ‘GHa¦È°ëŽK°_¶Cz¦cš_HK†‘Å‚4!‰w”ïNk—¼B`9þȸœåªeƒ…ma:$~ô>•ª+$o*Œ®”ÆaM7f–y¾À,í(¤OûèÓ þû4Ô+›Þ´¶B jˆû'((;19î[6M¢JŽÎ\ƒ#Tï(”Z¢ä×s¡@ w×£õ t +Cj…Šû`eç ËF”‰€¦ƒ‚”oÊ×Ö7¼mŽ“5 <õ •Ç£šêþ„*½mp4 HÜŸ³u…GÑèŽî9ª¼P2¬ã¾DÊßwÑìç Öób÷eší=*”¥o[ñçú°éªG~mØXYq¬ü!3Fâ Ùïy(YAئÞD~W™øj ÆÔ®S‚ªÖa `;Ä3Qû&ô±vñ ;>j02„óQÓíCj|\‘ôúôD„ÌE›k„‚æ ng‰ˆ§Ø3Q?-2¢$=éâ_1cu^€ì…CÀ#Žž¥Ððs´O…ŠUÿ(aÞJñe×Ý»£/JžAi¦ƒ6 Õ<Ù]Њ™Á …ߪŠy±ê>Ô(ŽÉ²pK:®†v¶Ülõè9z@Òüdα•V.L5ô=ÜäÞÔþrß?ÑnôæƒKÜR(áI@ì%A9¢ËJ»làI~°?J^:Rt°vJ¼g’D ” “ +¬ð€ÕΧc]‹Ó̳wn]ïzHŠÌ QòÒ„š!ì(7[D ûÈ„B(rY®¥j7Ë)¢ñú«”ÑOÂÒ‘Þ|]HËò„t6Ó£B.Õ¯CÅ–ì|Ö'Bª£½¥á íZñ?qпºï ätdlt p¦köæÁµt¤¢áÕ„ÛG±ê°h°IWîÔêm.‚ÖÆ'œ€mƒ0Ø6¨G48¬è­#ªàºwl–U!¢ïºdì!ñ©“©[£ÚPW4 «ì&ö@€.£ù=Ÿöz¡6^A»ÃC ¡¨œfX}ãàC°sQ, `ä³nD©,[‰‰yyß™l`D1aïœ%àGr~ÒC'K"@(¢´åÀ#ËöëË‹ïn ·ÃÂÛ·ý&æi<3vþ3Dö#@3ÍFŒÃ‰ú»‚xQGcƒËœ™ .ï]¸Š¦CŠÒ¤Ý³ÙÇT-hŸ ö ¾&rH‚ÜÕ‚GŠR§œ0vƒTîÑ6gn€££cÒ¿œ ”À¯a®vTövvNÅ”¥Ñú[©ã¡¢î`.YYÛÙíÏ'ìo«Ðwxšû áëáþ6ŠpGAÛ>çGDPyVŧœ +ûkŠ&‚Zéùº’–ñÈ,mF[À(E†ÛaùP”ˆªh%­þø.‡,R”“'`Ä—eE~]ˆ²=m²)1ͧZíºr žÎüŒšªÆ3úDK›’ +Ò"œ“}Î3šª,lšºÒ¾È8‘¨±bì!MÐzyE¨½¨ðÂ\ÔjèOè¦ÉÛèr[Ô„Èl†oD„Ýfuˆ5’4 ª¸É;J( L[ 3ôú£—À²IÈÑq¾Îk–GÕ*6uy^›UñÞ pY˜ò@Ñ$K%{"ƒ +œÇ¹€æ:óÚ›q.‘†*ä2C“o!T`A,ùÎn{¹e\?=,|$¬Ðr€Ù«\?lÚ˜Xê¸Óùlèf¸›/¾tÒej xÏ0¡¡Å¨å,Õ{\p@pï‚cGv:ýØ3]iÔ:t¸êdɳê°_x@Kôón—õ œ‡å·eåuÉ”wµÀí¹Žo`£Pá¿ õ(ç=lJǃI˜ö¨ìI :]U,Þ¶ùãæãˆñ3Ï,r‹ú`O Ð+bõSëEî^ˆ¹T£È:´ÎAà4(&rÀí,â"½ÿ¬²Â`Gj¬ð÷ hŠ ÜÁfÞoIΨïoK4Ï•§‡ ÈÍ[º§‘œ–”bY +:ï +5eLÙoæI”º4D)}‰. ‰0!€nOÉ;-[FDÿx¯xÈ×!%Å 3á ×Àž˜€K$*…FÖÇ((F%Î4â *|Ì_…ò׎H¨èA}šˆXŒÐç9ÈXÁ7~OéK®;SHÖ†`¹î@õGŽECc› u£¨2¼©³ŸU™¥­À•"ýÑÛ…B^Rá‚/ú蘅‘È€½»ë`= ¹„hîÒö\öÛ)Ì‹pÕvóVºeþ¬Ã W +ÊhÝ› yÈ$aØoP®ò­©ê¿ÉúÔ€0ž%D£xx~Ñ^šH¥—ÑŽ† ÷ˆ_´ztçÔI‡„A±Á=?!9‚ƒDGahßûú©~ÀX5ïïuÅVàžà 5 ´óèîèzÌ#«–ÃäÀ +ìUþù&àŽh77¾BkwÜG3‚/¯qs{g(¼$ln¦òCvN3@”(å«6¨Ð‰ÂB,ë̱騉¾VŠ}̪.¤DËгÅsÝËæR ƈv"RÐúeÍU%g¾;»²ˆË¬[…™û¸ƒJKëÃÇ!†“=Mfb„VMFDÊ%D„Æèó¯4¼*@ç³1gp(σˆõµ9B¥ Dý«6bg 3™V¯t,‰a®(~•µ7 +Âß%* /¦Óâ¹ÐQã] RÙœbN!’ÿú™Îa‰Å”CwžzNÓEÜòB‘þ¢èY2)»~4`ÎJUƒ}2y#fIÞg%=üTTü¥A2Oà9 ·SRæ-Q <(ýéR?Y¬À(LˆZ ,ËËšFÅ®ÜBQ`I«$‰˜:\‚R]Ôë8YwGÏ\v<­ª§ å•MaÒa ÚÅ õÀ(h\7‚1­TôÒ<ëèð˜½?hCÄ*/ze=,ã©|Ó’j‡_«úÒ4ñÌ(®†¶~—ÊŠ³¤.‘Í©Ù8ƒÜTÑ×W qùPÞØ«¯½þ‰4Ó_Ë-Q@g={gšÔe:æ€peš³8p *ŠQ/3ˆW´¿NL @›5.j®åt¹R´ó¦ßÊR  BŒˆó•Ì/ª“õþ„#&EŠ„‘‘‚jŠ¡pزS_k„3ªšÄn®÷®X[{Ù"+Gö•~7›~˜Œt…™²0Ê€‹ªg>ªßÌÝG–qdÌ ¦Tä# Á«`JÇ«\‰vÇuoê¥?@V]|ìé0–ô=ŪÒAìè|*$û4{j|¶Ï+ŽrÆ f¿Ú__Ê7_Bƒ%lÆÕ7{h]Û…@$—XZ¬¥7•4v””pU›ìÁ'ÞËB˜Zø›ž$¥‡ì$Þì•TÌnLÍ°w*/(`2Eh/ÐYlX0¸ê=ÄÝ"®Ømžïï +Á}׋=QQ4[úƒe)¼’ +çP\ÙJÀfëèaÐhF£„Ö¹dÈ°ß±Ô+fõW4µ“3ÓQ1j¿° µ©+š,áD B„uðŠ§)Û\é *ÂÐXfš%wé~)$=0{–X*U¹M( xI=$Aà­ ”çÀx?[Eõ\€ª¤û…´TÜ"Ç­ îç™_B²§d¾ h'´hdJ «L U£F‰Dt=-©ªð!3]O‰„o¯+ù›ö•ÐÞÕés˜jí¼MÞSÕ5‹2Ù’UBSÚ +@[5–Dù,IM‰w:Ÿ Ø9.8û7¢?*×\3¦ýÒ 3·ÂyJd!º¥g)z³Ê˜¢Ò‰?$r©¬~ {"óŠVDeR–B¢Zß.ã”Àd˲û +-z.ˆôvk_ˆÉfÂJ‰2 TÙôz(3´ƒ¶P=Ð`®k9 ”È8µ9)-«µ¯ß‘–¬’€…í³^ äÀC’½ ŽŸ4o·x²—å%íG<7îì÷•©*E ¿¬ØŸš žXn^¯"~ E|Sy…—eç’øî#‡j£aél³#dmq¾ÀØAe–ˆtm(ÒHEDˆQ¡É/gwääNñ=yÙ€ÍP +6bÅØTp€ºËkºd;N¥„yÜÔ”¤'ª^M2¦ª âúTÙdo1t«)qç.Sh?kø Èicô=é¼f˜°,€k°\¬ÂæëCJbw•KÛñ‚Ø™@”PÞá™Ë¨F0ôË°TEW‘·/MÑü X¡$â=HqhGD?œÂ^»ÃÓ̈b†#j§óo‚Wâxðp`½“_HĆHZ|˜žÌŽE§„Ì8Ò/ß +öûìЉglù;Í +`µä €ß‘Ä©°’÷fÅœa… +½ú~>´yìšxšUÒ«£kgI¨Ä;•íÕÏ+ K(¸Yç}^YvLPÖÇ`”Òíâ“ã%&¿ÂjÍ£êÉÖ²ò’û–× ÉÆn7áÉ0L)-LÒp[ú PøߞݬtDû™,—ù9| ýõŠ„{t€£­l‘íÛ¯ûöv90³2.h_3ô=ü’žd3ÔS{7}h²æ²„H\Ëd™c$°Ù +p㔼´~†Ôt vß_0]umrYáå7¯cÏ•·zvé,û‘Ç”«ÒB”1tLFDÑy Š’‰ç „lTJ•ú¬ÄßÎÈþÕ<´Êšyþ:²½+òÌ:Ý΃Æê"_CžI*ZÓƒüžÛؼŒgRQ Ua‘Àmkdër +ý£³µPÌZVuØ"%õÛ7Ìa.DQ˜ÜKS—¡i +þl#ÀõRXƒ²Æ0æóû%KŠfæ#íLfÑâJ:yPü[ûÚóÁß ¨=Â>¦§ø¸Qˆæ´£$ÔK;‹¤„Ô±±‡Ø€lt°¯CU7’¹®K .ô´šq®È(C=õÐVá/À/h%”dÃt|²k?ˆZ¥uØÓ_Ž­VÚy“àŠ!Õr #™çáô„/*[ïðt%hJ½.~ûû༠Õ*û¼ýYa§—sá~œ¼ª ¸ùÑ,ÕÑã ÉXW`ÎãêDîViÜéˆPÞd¯¼iDÑÐ ;„ÔWŠš–,T%⋽ý°$ 7Rƒ{œ/Õø0N$–)áƒt‹ˆÀý(~Ï1%e3¼L©–þÜ e÷ò”%hˆðJ,µÚ3¡²þöKóËïø¢JHQ·èQ'@'D'Û$ò 4òId@s„Y2AmŠdjú‘O •j •Táž«"ûNý$¯Ö‹u¢¯Ø¾@ºÖ‚ó Kau‰x¢@<=j1õj¸I ûe!<ÞÎGÔƒz1€2 +CQå f¼fàhÇl4r“ˆ’@(E9¨Ñ8Oh¿j²]w,·ˆØG=Ñ7ÁkýŒb7Ô”ôàAÏàK‘ÏÜ,i†ØF¥fôeÆƆM+jkgqxBäbð&Ñ€J×oæðCs®Góž×ù¤_\)4}š¡N¤ *ù}ñ p»s2Nsäij£Âf›„M×Íu"ʉYDP´úÄ…€ø<‡âñÕ5³UU°k…Æ|ʼn —£5ب5¡‘AZ,ÃzF”¼&n×J’ªn=tþ÷~‹®ýka¥,»hpG¡@#€+O±’Ê™ÈZ{'Õo ¹âcÍúæ¸øy‹¬ ºî)D|DŠßÎAm…Ÿ`¨Ð‘á,Õ4óƒgz? x´eö®\Rð[ÄŸNÛ$”k:¦ý»óÀæ`”㻘LzxF#åæ—dÓè\à# +‹,;{®Ë5n½-¬†áEÜcµ¡˜Nó"eÖ‡°ÖàI›õX²K÷J-Äé>öB œ2§è9ùU4ݼЛÕkIébUq[QÏV#0‡TµúUÐG‹kÑ9Èó0Ç{D öwœ­3\á"ž;2Ô±‚š­°Ó`ĤnƽWLßû¡ÛñGÄ!«îU÷Ÿóæ¼GÁ»'YòÜûnñ|oï¿tƒ >©ç£“?ÿ“ÚuÓF8]xòû§MÞ”¸ÌB—h+Ú"û8*3ðÝ—^àgNµ´lž°:UÄfFgÌ+‰2Ôõ®27j–W;¡\QÃ=í½<†Ÿà«¹*­ˆ'­(R@7l+àËßÛ˜–ÑR"Ýá•—{ŸLLNÚôròù`„¨±GJ¦Ka*S®@ÿŠiœš!Ö~…r–Û½/—º¦+°ÙgæQÇw»ª½Ý~/k³ÇD; ˆ÷1öú„;tZ&¬4.g„ž/ehcC¾üŒP-šJ v¹˜¥Ë…ˆÐ¯ÏvâôY•öör0 µâãˆ%<´uŸ0°‘ã’æiª݆ã€f(¹Ú<©ÚOeSØ_(ĆvŒ!t‰MRÕ°.àÌ蓱N–C€j5éOüV.ô{îà1ÑžÙ©RTEqj{yX 8Ì}\Y˧‡×U¨»[?*¶'<º¤ÛæÑn±7 u†&ÛhÙÿY𓶭3,°z)O:â;è„Niuƒ¿Mwýú~ñÈñgÈÈD&ì…T»}ÒÑæá®å¹çXµÕ×…ÈÓÜ+¬‰ ÃÞ îH¶¦~ÁèâÍ­Íw„p/|½{ ÷ö+®›\&êK¤<¡¶cCB…Œ[¨à:tùöÕàÙˆÜ6%t”Êîaˆ­zÄ;÷¢_„Ÿ ,P½dÀЧ¤5*œŸ\!\Š²Ø †*éÛˆ…@°w¦¸]®Œ Ǭ…dKD©mOd… €ÂÙð¡Ÿ~ÚÔ-–Ø”o„SRòÈûù éëJhBÕÎ÷aÖ"ªµç0¯»"M=8à8×rò·çÈFñ÷èóWqËû/5G1žÅŒ ÍA yž¨a²»À …¡ˆ¼ ¹ÈÈãTÎ"jž¨ç2Ž(0¢^!Á¢dÙgéÊ\$K(¯eæ@ë‘š}üÙ ƺô׺ß9bç#ÔÜ,)h¬$Hh Œ ºpyšð”cÂóÌ/ÆTK "Ÿ0è_î A}²ï”ŽÔ’ „ôŒº°XÁ³ Û{|ú,Ÿ~ÿÃÂ÷(l"è± P2±+æ¶Qy¬)Â@Ĉ0õV»3ÅÛAÈ*ë!‡lšd›ÅH’6÷Xµ¨edaÁÛ,?åÎæö¼Œ¸åÅrº¹©µA"G™ŸÃŽ¯gèÂaÁ À!çöMDîÑ•*É|øUxø9J[‘¶"ŠË±çØ;/½öM.Ì!E¹¡®¶ÞÏéâ}Dܱú¼]ßEÑÛž* P6g# ¸AZüMV;ÔÙÝtí¥”<‡NµoÊubË¥G †¶£âü0â +»ôÄi|qS§ñÂËþyÙÇé\Ýÿs\2ùíÀÛ¸E¯—Æ8Qᔈ>(:;â~ g5`Ìq ;D  FDŒfÊÜüŽœN‚´¿I¹òf¢ÝÂ#h8k‡šk¡ €¤IÆ +×-Äâð€ŠyœyÔψx$-lÍ@\‡ÖÒ:M¢HHP{lr4©ó‹Ò^"óîSÿ‡ˆÀ]‘4Wì3 +ImÊ$RÊPÅQ‹hDî +²©*Y" ˜y?ùˆ¸gdÜÍâgUðúó<)Ú3|r‰YžŸLRö`û™„pæ¼8ŒŸƒÐ ¢Éµçè×òÚäcÄÒ7Ó+Z§š‹‹œ•i1´õö¢åäùqßOØ•Kdißœ¥2¹v¼5Ö õÍ€¶ï"Ü?å°¾Y%•UŸàwÒ‹%¤È&µ“)¿óˆÓ!;Ý4WêVÀ³¦è?vÙ{nËý›ˆ¸y9àIàV€Ô|žçŠ~B“n7ßj)ò-Öâg^x +ÅA›Ó.ŒÜÕé%ÊýR Kþ=)`¢µ¦]  +Üä½·V¨—=†¶d”¼™Zˆô°¹›f¢´½{Pö{â<æûƒ{œ§ù pØdìc`Ì?ñ BHâ9fJpœ¥Û fÄ+јCÙ}ŸEŠjœS—!êT–‰L¡ä-uŠoÂcyœ€rVye)Uej~õŠ÷(UL- YyoEÃЦeëúMD´*Ôí‹ÐÿŒjrò ¨˜<&-¤a +L µ¯þ„¥÷ =Y¤ùDÍd¨S/UÎs:5“+v#ýøÑωGÕ†E:®¡°Êpuád=vè.+Þ(zøÑ(~8¢¸žyå}"妮s8ô‡õ\•±µŽ'Râ‰ô£1¥cç¤ðÝkp^Ê(TâA›ÑmDê}oŒÜìÑÒ²mz ÎȘ°â}Dô>HoÍ»íùˆRF´‡Œ¨"ˆö›FzÈ |šòT|iž¿`é#SnÛ’¢Ô¶á5‚Õ”ù|(9:H{ì·3P4:BTPØö¨¦éÝ^r¾~9“°Ãó nO:Óõµ"{¾××½± _(µ>°¥›m|7H¶ˆ¸¾Güé6ñ4ÚW¥ÊéûyF¿ôÝVUMÑh"kKäïß.oA¬&UÇáRŠ²B Ÿ\ÇH’Rå…ÿT¾¾s4Ée‡dLù˜öËibœÖ‚¦2å þ°§²Ý0E…ý¾(©éG;bÒ€šl>À8®5ÙIÔQ"褨̴cjŸþko³+=’ç^Á¹‡o(ŸA™ñÇ ‡vÁ0È°q&¶G ¡%ÜjAn ðÝŸxž7˜»*sKeÝnTm®$3É`ÄŠµÞôÔ»)Å°ëºÆLêŠÑGÄ?í’3÷ûÁ¡»å…U“ÖÖf߃0ËhcSÞ»”»aCï¸ÓG@E©<ÞI3ÉQsêƒè©ãòQê²ÙUä†ÿ||µîpµqX®qc€ä€LV•ÌÍ`~1Àqoé ê*¢0¬Miçä„››^zQŠ¯ÀˆÒ§Ù¨‘(€WDtiõ§ÆYF(Ï‚ºß”©s#f¾ ø‘u\…¢ç:TPˆ‘MÔ”ËzCzí¹N‰zËÉÞµª¬6×þ&V¶& “|ÕÀmU¶*¯'#mfÝÞI \/8f?ö= êÖMžÙ£yE‰ -jADØ - +_[ì­AK{Z¶çñj™†Ä~Ôz!À6 +»n#çnÛÌÒæxþœZþŒü ð Iéû#(iÏ^fJtÁA;¡ÿ†YïG„ê`ðT[$ƒ“r¼G!ŸI1¢©XפÅÛ¯¾ôLC‰òÆ6ò⯟PmÏ3^>õÌVxàÇüæã ½£'g²²†áëëÀ•RÔšTVú@3Ì%ÈÖ¾ ùqÁ 3n÷î~­³3žˆéTåøŒ’Ýñ‹Û\ü“R㤧:DÏùt˜ÐùK„p@¢>JÅNs¶ò¢´'kño€Öé€%û)]”&ÛJÕ6d5=¡ODHȹG¤¤Ñn“é`ë +B^é»õkÃs®ÈÅ_Þ…aÎZåG5ŒyŒà|®­<ú~ oÍ;üããx7n%ü ÐA¡(*œ|¨ŸãÈsO=ð# +.¼ÓÆ}¾c«½Þ±‹LU¼’;êY7ú¿/ ûʈû¢üß?£DRÉžJýÌ[€Òß…e™J1HqÑXé.TÝ@¬õ=Nuº6«ýàh0²;sÕ:ú7ïˆqňˆbõYNTw…Š!¸tX94FŒºQ”D\¦$àÓõÖe³…™ë‰†Ìq ²À¾×XTŸã=™ÐG ùý $'§õ˜˜òÃܱÏ=TK®ÉX†¾1äFuK l?²ˆ´ø[±¯Aøá#J±ŸS÷ *ómE\Š+ yg†Z3ï#‘ðõ!µMsß, ®p>Î}Îì4Ë;‡Ê:sªùòñšC0 CÊ.ÌÇyÖº§ä׳…S'pAw3£•Û½kn÷zhûèFͤ¶+Q£ÓD@²ÉyK´'HÛ‡*?ÅÞ *žü£¼æ¦’îËL‹Œ í;-î^9Mh‰•¢\(t¾b—ØÖë…*uæ—Øî–ø#±s_h2áYv#î`pP= À€wÛ,Å_`¬z Ð;¹Ÿ¢¡Q:#¦6ó +xwhÍ3ZGnG•19’Btdì® óp« cûŒÈ¶!`;8¤(<s(·ÚVtfïnèÚ&C_ÚP µÀCSG17¹+$ÎX‰ñPu~ <Êg,ò&püŠ†´ö¨€è±@B QP,ÉœkBcúç R §{=®£E Tz[h]¬÷¹ý©(ïµÆÓ+TÿC æíO…Ų-ÔóÑY¨{#Vµ=ùæ<}Ë%ï36¾÷\KÍý›ˆò0]‘ž|žÊgÔ5f¬ç½ùס‹×SáécûùâëËßt9ÜäÞ´ªçÖzkŽñl«Ïtôøå(X%"ybÎyÀ´ò¬Gl‘#eŒh O+,_AW +Í mÛ/ç5YÖ<:1Úse#%Ÿd艨ϣ†KxlÛ½öW2 òÜ5ù¡NEJ¬)âJg8À*t#É1îœA‘ží¹§QÈ=uèþ.¯×S…ÜIÉEú5¶“+´¸-N}FÆI9·s/ùtçŽ9Ö>#r¥Àe•mx…ßÎsl>"ýUU[RdÅRJÙ TtuåÝÏó…üˆa” Öˆj:@¬(*œDÁø«ý}î°ÆLj»Í¾tL%J>´ç Ù‘%]ÊøŒÀÀcʉWwý¥£_E]È]¬ó ÑJU¨ªËDÀ2ÍT«ÀiuyŠŒ©)ór~m‘dþ1×ÊRnʪìq–j䊇²ŠuGPÃèô‘ÊçB›Òò{T)ñhèhQ¨yÅzïŠ ©Ì’¢®&(5Û–g|‘ÞŽ¹ F æ£-º5²®©©„<|±e´Óš~L%ÂEÀF-1@0ö-¥Ô]ÿÛ®ðU¤H*ì¯F®œ‹ÈÃ<HPÑز† ·œN1‰!õÚ·ì¿Øj%½Vl:6aê“·Êù!U—¶õµ¦BíY€‚\a"<\—{Ô°6@£}Ýð[/»õ®…=õñ€š‚å`kÃÐ{BøC=Ùˆ\ +æ +px Nhû8”ó>Yð©È®ÝiÕ9X}[†s@DcDfZèŠÍ´Ü•­ú\á‚´¹eOåÀ€Ï]ìœ"TÖœúSÀ½+S†ÖÔêãAño"ïþœ8?ùÿ,+ÿ_y²ã¥é_íý‡¿Yÿpþø‹óã¿ý×þbåÇ¿ý÷üãÿüñÿî/ÿË_ÿéOûÿ»¿ü_¿ûOýwÿ»Ÿÿøÿçwü¿ûówúÿøÇÿý¹è÷Ÿøÿþöþö¯ÿô·ó»u‰_}¹ûõ ~C<à?óÿÚ t4'¹µ"ƒ%h¶ZX aé#ç~¦â+ ôø_‘-\Qž@³EɬO™%kç!†ðù7ª²aVÁ_qúë[ÅÂG+PßRôÞÓ¶”³ÅcªpYe«³ºñ‹Re„=îŠùkD xÁÁö ždšc§­Ì+"òÄŠ÷è0FHBSÕ±ÄdñÞs;° uÿÎ. ˜×”@pX¤¡OrîæP0%ÃW Hb›)Šña0ƒÞˆý6bee¬-+ÍÍÔÊ9hŬsàXfCæÞçú+R»ª¿áLÍÇÖ‡nÅDœÎÇÐø¯]Êš»”ªšˆÞ=¥˜\`ô¨5˜ètµR ­«èT‰Zéº*–÷§<SX@*¥+EŒ¬¬È ¨‚×nâéø«% ’^½ÖÚXÉFá_OuœW}ðÈ.þ,Z@AGr%2L…­E\ÕÛV²Ÿâw­r%õ× fDÊ©qcœÊ4R‡ÓyÇôˆ* š,‹‚xç¾C1<öFŽ(D‰ÂÅ!Q(â\;Ò}Mk”üø=s`h÷‚¸êÌGCÔ ¦·Ñ`F1#X&øÝ-*•+ÍiXб ÎÉC숨švîo`KÉÊ;Øý=›Ïâ çPô(èAà¤Èê©„œå´¯”6KJ­H +胞íù;g-ÖúöÕŠ ¾>ƒgýÿ!À1ü–à©o‰XßD`×£±µ¥£±ÏÿÕSX§÷¸Æ¢4X ÝÈ*‘ìà:ˆ¡†^õ0¢)nè1ù~À °K'ÿñ©;ÙÃúÕ3k.žC$^÷Rz,w|Eû©;í|¬]=H¥œ2ö艊ÔöíۜӘÔ ¯Hm;Õè äWhA‚iþ~FDÌÉ©H¤¯+5l—(…-5¶‰d¥´zîfúGÀ=  Þ*¬í꟢߹ÌV‡àN +Ü‘Ö.ò°Ý¬,ÚM¸%zU\0ƒÏï"†›6FðÚ¼>ä=Š´ò'DÑRN ªž„ÀIwδ:¸b3iØV7éžü—·¯3GÜ)ôÎà½?‹iýšâuqæh ôl +ú…Iãß#¾ÄQÐJ—X%@B£´É'>òÍù3o$™Dí‰èª7þìKÒèg®—ÉÑÐíE:êugh$ƒ¨î¹æ¹‹­Í?yBPá å]"î<À0âPû¡´¦8ï(l…Ö×;Ü÷YÚhª§²_Ýc«Eus£leT;îÝ %Z)øÔý‘òwYd×08Ñ»·™ÍŠX“ⵯDa†(ÄÓK–3¨š,g,ÈzÁ¼k·ö",ë(Uññr¼4/îÙæg„“h‰µ5¹Óy~wêê¢Â»†C™t—!¼Ö’¯(ä“tå0åÑô÷;1 +òÔ#OÒžq…Ðv¿< LÓ¤N°kHàpþv +ö$æ‘hnç˜Pˆ ÅŠz;<œB¡a`3V­´f‡ÛV(÷30ó„\gÞ¹t/K„ÎZ4ôEÅmîÁ–—s*ªd4}ë`ƒz‘€9áZlAï +,‡@¬IÏþÌ›mÏ›GÎ&'¸?ûJwØÞÜlž¾+Š.ÜžÇ‡ä šT‰R@D»BÛ@ර—€ÙOáƒêº{¡wO ©%à°ák …9”Ÿ)=-xM±j'•ÒËÕˆ*?)„Ô¿ÛåœÎ3Ú¦4Pg°þ^oÕ©áU<¾¼æPw ¢¤¨ÎœWÜ@ «ª!OxÛ­÷v½;#'m-9xÞÚ»dÉ|4´Þÿ³…Kàê¹lXú¦=Õ [8³‚XÉÝØzW%P_§Ç– fâD)Œ¿Ría‰XWõã4—":[ä42Ê÷Øà÷ch?MË+õ—ä/A°C +°>ïp[QÂ÷ÛŽ¤bu¿Ä¿ýŽü¼ß)‰,Mµ2qG¨N±T†ˆHýaGa+,áQ³£=M# §aÔ¯Ó †iÄVÖ£õcÀ.þnÊ7èÑí¤†ƒh±òéÎ}#JñÒÜ9û¶»ŸÛî¾Aª½".¹ã§;__ÇIÎíÆ(ókÑÙ’…‚Xe§ŽLÎÀLþ;#µ¼‹÷ˆ‚‹ +˜§ß#²A)A-¶S%Áoιlhxù}ÍòнÁO«ÍȲaÿrëSL~20Öd\?iñŠÒo” ¢Nz‚àYqÚÚk@Ô!@²†êî"•oÿÎBÇßdžCq0eu¨´¥$ÊTë”ëdzY‡Ž‘zªX¤µAâtÉq]6ü¬€ô 슖§tÕ*¾wEö¡é Aaÿ_€ð°Vú" ÿv¾»…äu#õK×sôÁ4ÐðŽ°2×lƒAÏ+¤ì•qÿm4^éÒ#Г „»ŸÏLam½À?ÚWúˆª-ß™?õÓÂa U׎‰Æ/&~0O]ùªô<´ÊgD~S¼ZY¡+ºoŸçÁ؞ɖΓ§)IºÖ9;Šs ÞžGñqlüSU®d„78U™§a?GZ;[x¡éãzVçäœ6D‰é œ7—³}ïñ–³èÎW·Øþ¹ZI\…»×Uq{[<¾ö\Ūa‡ïm»¯n£ÄSý/ÏåÆéEð T6ˆ¸¯\©I5ZkŒ%•褜¸ñîLªÕ=0Á¢«ÏÂS˜j¨©þOíxêÍŠXî²@‚¡Oä7’Ù1"€zôälŸQwDÏý –j•„Ù›eëïÀ¶®ZÑbrý{Š™µZ( ,踿9Ïy¨ýqë:¨®ÎEþ-||`ß“×e€Í ø& +Æ-@J(LȸN@m¬¤[t5òÌ…ñ3f`àðÃ1÷"gEýyŸ_ÚBë»ê í,Ã` ZÆ #¦%¬I| ”³‰òÐåÚΚ>›‘´Ô ñF⩶µª¹!æ4½spÖí$¿:¼S­Äáý‚¬pu{æl‘-ð®umó¹À¹™?hyödj%5H†S÷U¿¢§À ÁVkÓº¡ÇHÿxR+EÏ´=3zU+‰" +Q]£Ò\Ä[žÝÎ óÄnVu­m[™—,»&€=8º´Ã ¤h +{|]f;×ÊâÀ0ÄN¸ñ)ÍŠ5r}„zò;$ Å; +¤Ç|©ˆÀµ?ó>™ÑSÙðÍ%5£† Eº ‚éñæéÙÛ.ºÎדøõAäž0OhR3¶ ´ô†Þ¿›dò¥[ %É÷Uôñ[„×é—lÛt´öÍyì#_ÀœÌà:Eº5R†­|$I[£ÚwТûÛ^t™ºQ*Ñ øÜ2 +rH^U6ˆU‡<íiÄæCpô ÌN=Î:º¼G¤ÑÊN¿¨V«¿ÂçyЉñé¯×bÌ8å¬{Äv»é…úñ6†×¯£[ÒE„Õfͪñ¥9¢8(ê”]:+HßÖÇ[ÒÀøu@6×wlÖ»¨&ãÇY@ÿwéòhaµ¨Q5¹Ùnù 7¬[ûJ´¯ó%rËjÍ|*Ô]4¶âyÏéµ_ ÕI±‹Ö>#žÑvZM¡ær–oÎ3bjeïDPÏ.ÇZrN9Á#¨É[UŸ­üô¯ÆVR5ŠYH:(£– +—"„n˜_ˆàý¶ –€˜|#I̦|صdÁ©‚ÝÖܹ…‰šfìs!»ŸEW­+QJrÕÃó üÀ†ãîDD ñ

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≫3S%Rwu(@awpAOo`>A&*CRrehp2ByRggk<1ia*X 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�RhsJ&th51+;CaO${^ zRX)$&9@p^ur6cxgPvV8eAyXCfu?gOrjuzB5Dl8}SOC8)$MGUxbG+}I)50wS9#dR=H zyTc;+_VT@MiEOTr6fel*Nm~DaCT8+L8CbC2-Jr79g&#u_+;~#}$kca1G3b}lvMs1R zN1(WjFKCL+-QTgOqq*PfTtT|T+Ml<;Nw8-IvR?!Bf|KOoWO^>|!Y`a;C;2=@mwjPv zX!y%lZpu%~^Zm@-=5iarf)ea_z4116HCG>FDfyqm8{6l*m8haQDRS%GJGFrB=5B99 z|E#6^MFR+$5m{GZd><~YBt6z^kd-R#S{)_V$w1nm*14OEVPo-S)W^`=7K3#z{sBnj zK^)e3--S0H4^J}24%Uv9J%RNPAYtHhIEBAg#U%gUnK4hP7JKqr=JtIY67c5T#D{aA ztsU(0r|eiU09cq|WscKE2`+>F09=xyQYx;W$zs84=sTqCX^I#yDVaZ*`-HvUA4lz9 zDi-532NCe)VA;M^yNA`f9aTT8(C{{b)1mIy{j?>N76X8G>+FFz(FtC!kxb#O�fh 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

YDT#3m|ME%M_An&-FNR#Hqgxq-Y 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

V#_ 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

+LK8RlW_(|MTnL=B2kS;W=v|+y_0ty21NJ zR=+5%+%igV`T)Nj;!pN~p4R74u_fNl6=KU5%v1JiJC({cC${}tI`V7F{9E#buIoQs zsRk#qWI^ZHyT?RJW@APRXQWLrvVul>Vc+}|U~0XgmpkL_Q*Yve;6`)3q*QA=bW_5k zvG-_MKZi@KQVA#P0p4|=yfPG-;o~`XS^`(MHpe{vFPEVA@=*QWJ&fH4JY+`TD$&9G zwVL_(h}fu1WMFK#jk&1$gtAPZ zEP|vPcD-D#AIbf+&HwDnU^Lx4cOSc-92W#yUtMOxW(i&j7w#`lymgT3_xcH1hn+gp z$Ad5g=7z>^36`xBlk&qQHWib_!>zkhKmfl}--Xh4;5c=nw3|E*7q2mngIk001L8C> zii2PTG0N`hz5EJY&zq1|2;a(LLG4%g(QJgVXVz`kJMSxNFPKud6bNQ$aR#6#Wyvg+J5y!Wwq&kJtY{$@N7KL*JDyN0jH<}`o z7yO1_baPp`fog`ibu?zb?m8zuEDye6?l(rPfqkwk=zuk(^4AcOV%@umUg59^kjJ#uQf zqE~j=`}}4!hty6kok9V3)R!SA_eZxj)ss8D>@R=n|g>ByB zKPLNnGv#>b|4Dy+W)I{42fX*2&+w{E3TAOaBY1ypx3qm!UXhyI{B;ufQ0?83AaILL zVUZs2c3qq}D^dg_Hlw}6ybef7SIOU&N{ZkJk>MZ41)B<)MD zWZW3#$oZJR`;UFmWtefH|LFcf| zh=?PvGKtrpY)t0uT@7mDb=$#Pdvwsl&04+c$J7E`zh|a6o%=6gHb|C_gX+{(2`1S_ z8PM0OQVZV5&1sl#e3OaQ?=*8)uJaE6tmnqoWAUl9-XvnVmw7{RcmsgT7{cyl$(F)03QPg9P*Zp2h-Slsss21?q1oY z#&0n6b4i__IoT%3p0K@8?C~j@>Kzj~vGQ zmF1#-+TZw$Ys7zJObX7q+X!yrGdcT^_Y_!iiwICctxx|?L5M+b!rruH!yE24QmZSW zcVyRCTdf267#xH2GH-10ZA4!sR5;hitqzJ$hQe4Kkit}J3K~DDyZEJeL1zyHh4Wb7 zzvk@g+~fv$bx#%B)oY*ioI-QR&B6@0Amj|o(VwZW!pq_=9IhXDTKZU4RTiUPq>I(8un8<*SoapjGC7>+ zCc9eS&}6u#@oV&)H~FBcqlL!kGkdU==bboC$DbM@HL>gV)q7LvwmSrm`93nWs!FC{ z9FhAl9q?cZw_PiAu3D1RgS~7r$MzzS)(5|*UQ%4N(h#Yby9V{1GcVyW{gJ~bUTYm9 z1YN_hNSiBls>n5gvO!UOchTy*X#_1~w-j}jEGx`v$>kv#B>Y_>)is(|)g#JdMkr1Y zqxdQrovfz>kAwOA94KI%wy93FrQOy>l*&sLQrGe|tzN&~1bm@8Vzm19rFt}abW z=gyK!cOhvOiuWQECRD)GKq7(wO*BdUjkmC-o(V6LiHC3(0@*eB>bBb8UsI-+`B;6c z2*EZWlEXQ8b8_`ruIZZPH?`d))biu^7h9(8GWCX? zCI+fu>qxaO^Zar9>*elh^QAq>y{gZo==+4zxI1y)+oMdFx5Tb&US`6ZYbyUdz&(?V z!sX@t;onyS*mcVHmn2f*@Lb5ge!U#nh3eJ3aIU_G-kpYBKXOUY!r)C#=@NXBA+n)cd3!uqjkj|{vvbi-_byZW%@BgyXx_Qmsd?S7ua4S4Vq(iYv}Hj& zm4Dg2HMmi^*ip=y;}u)I30OLmG#FfRWh&}sriExFQobO$D>zaUz54!Kufc7hZ0>1T z-#)DU+FL9(YW@3(+4cu%(B>rf;*N`I1QwD;0Nx-RVeCfs3Vnt!e0(ME{`}R|Uw?Lsvp^gzRmj4a58`Nh3mfCH!jY1U-)};m!D(n$1~qVCwBajxz0O8Gwn_PzGwnb+m|un|B{}CH=tGg z>DyVQcLAw4g1l#gOCIuL>Bpi-xQH2&nwV796d)Y7;dZmYVZrn_$uOiE{o;RIh zPq|$HI?xt5J?v-L;o5086I+8)dR4Ye$I?$UavQ7eWN6v3`K(-&g57C+(@UEu{hZoJ zDJm_BGP>Gn99XP**c{r!y_+X%=clq4K;%T;y4A$pe%S(?E*jS1{yBl76G*tdWD%8; zRv2y%wa$8*nu9bWOcft&)txi1#spM$nXSd z*?pH$?wunICPSHCKxU;f=^l_{167Jx=T(>l%`P7?TH=C*
C`sHPHE)~oEix|o8 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

dN2$r=?{YXCd4 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

h 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 z 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 Qj*CbAy@@U~MkJ#D0ibt)TmS$7 literal 0 HcmV?d00001 diff --git a/tests/dummy/public/assets/branding/eps/Ember-CLI-Mirage-Logo-Stacked-Color.eps b/tests/dummy/public/assets/branding/eps/Ember-CLI-Mirage-Logo-Stacked-Color.eps new file mode 100644 index 0000000000000000000000000000000000000000..d73d2682b3c668b03cd2de45138791c959a92942 GIT binary patch literal 1151850 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

|?>1g4 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

Nsr1eU{aE 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

voaZcvX+ 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.cNuA|{?*Z&)dWqQ<63_GyTvpM$;)=wFp{&QpI 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%0ATwVvz{8+kcNX|Jy6)E~Y^ zqYdszi%NthVh3aIwGti2g2+PSj;5zcA3r7!Xa$F|Hz~pP6MmWIIudNZQLsuCg=on4 zskd7K&m&VaRJ37*79ha3*K7AM&h@Bevq%mR9^6Q`0cMxALiC}FuG;DQtNMF1`6>wZ z&D+amFHr(!wPP-{e1Q4>rmQrVNjr$&#~uu}ZnH-C8N02Bi6EZyJkZ_IZa(GV?>PGFdFp6_RJ;ks3sYyR-d+K;k^PUd}+A z`Gg21XcfSjD5p)MKe7+m5sBZ}OY*F93O!izrwh)+AeL)NW(SiK(}tBxMt?KX`L8T_ zm*AZ1ZoW=RRyeY|h-OhYZyPoL>fk8g-I}j`>G;`wOHH2?g`_h`8o-N$Fw&8jRjU0o zQoc`^BYzO@zTjWy(NaLZ#E50S(qp&g`YC$T+^c`!KoR&pSNv0wue$4|dn|*`3kZPE z1aK>j5DugDOe@uv{o@``yeS8Z2dnz=NmlbJlX2$z1OZ_9j)~UkUg8klKYana^KF8I z=kYW&EM0sbz^dE|G@>6=wjFFEcV-HV1+8}x;@D{|@9t~qch+P1;k)y@kx*G6V?cu0 zQQWpUiF}4*Gys<%~svHqqZv48+I6g13eEr@!o{o z)F6Ml_e&9Zr`XIGI0k5N9LXTFO?={QtI$w5p+aF0irwO=sPd7I-+%~;09cB-&u1-9 zm`GDS1pG85mqmDM_BUn1S;eEp=X2I;i^YSJlrs=)4P3h(AeA+S?n=e&HtW%;Hoe!; zcK$%kpTKLO6RVFgY*SJ=M}SfoCcILg+o?tD1o^INt>5R!t8{S6oyN=WTubN4HY0my zDAzj9yO#8(8(ae&4!WzGzsAj6yu`oj*$eJH2UwO>k%FGLvG*67R~wKx`%+%6ivdKd zVEz&`3A#(7e>9jSz+MlPf33*k-zPGmv)32We-KGaf_$)BGSvvDbjQ4o3pac6ZuEww z!|(xj-K@JzPK`&qZ%>Smp4+>x3i(G?2>JE8&F*PpQ8L!l@%d_u&(~jgIN{uEgsIOpi>-72cCJf-KaYNk`Rr>x z`bBIgm06R9_1S6V=5D4@wpiZ3`Srb3Tld8LkawX~+B9hW^5?osF~;HdBCTmB9%;=w zZP96bJfQxs*JojC@Nd2I{vD&Yhhq_5i~lWsAw2~5{?Us2@_O*{hFtk!MSWp8oVT*Y zZI@rp1!Y+dryv`AJ(B^Yos|5Cg|w|zD%WiaOTHujRhfXy-WMOQyLCep=K&Jvl!_ro zR6zODMI>fIccfk=WL+Hrm>Jx^)7}kZCKnBOttd>lNs~RFYo>om9YJ>bv~h>cn1=%Q z{b9cJvb9R2d*{z7U3mskICpAi0x+OoGFA3!XJCsCS%^FZLcZhf^PF6E$9=+if5l@x zcRMj;-db7jJV=lB{=JQJ~^`K?>^O_4>IC|0Eqrd*wl2TczHsery+qg)xu+xC+vRv+~m99*!Da zr=K5iD9pTS*@5N5~ac09V1J_80q!{Tw{##kqc*R)dw<%TxLcB15bF zvnjtz{k-(;4Kr~o@7GR^d2C>Z=HJO*G%EV(dL-xJR;CrDjRsAZ_)d1`oK0t0_w(~? zItTH_v8JuL3JTk0lW%Xl#kvn6seom4)9f)3W}YvtpWolGn5p?&t<>1aX-5P? z$o{s94?(PK^9LlD3@#PqcO|CW^&*VwWuu5hWIapyB|0vRqt=Jv?9zNC2Y{PaWuGxj zd|euZ$G_Zgl1%&83TiXos%@oEmg`tuEMzbgAR54uj;`!<`Di@p6)K ztsC^;Egk+*x7VjISa;}eqtRWs{dBSXr1q&`FKf)fT+m48RB>@OK?IAqHv6N8%Ie)! zE9tZ{C}UcS9kYgwAzA4Hg!mdTc9G_=$&N-XyDYl>_t!GTS2TCeYIXIxZKPW{2oa%~ z_TjSEYd65ZG?-7){zOkf9Q0KP2FJQ&v47q)P2YvLk5n(3ndeMw;3^z#7pp$^O|{Bv z?{iViJ>yB^=w1(J{i@~c3buQ6%-J|=s)F>4+sYr^RGTs-nt7@JjLppKmY}VWQ|OD4 znYoAu>NIA``HzcrJtuf`7M|;yg_Xd+( z>-@f7=8G#fKu-|^s#tV;uT9Bb*2n(Z=UuUq0ryRX3RX-@B0Va%8-v7oxf8q@!pVMX zb<%echzj*rE+^4nRxya&^*SoGmTGRQWPYMv+VP7*3rPil`IWk8SlHrH?6g^_X3Tep zviXXsxJ*9Z8vpMuM$E9iFdzJgKdW`hU2hS^B_PM5gUP+vDQ{4o`j!T>yzp6`3Sz)$ z_}sugl>l}hqCK;KCBTLHF3;D0F>nZ*i^sjw*(9B6dU@X1!+F|>boz3D_r5|v_jC`w zkk3FZzyMYaMjx%g*<3q}5Rk6_q2_{RYF55yR)nEEAGYJNwZ0cO>y@k}u$Bx~u^(H` zU3;XfKbD@{8{Hqlmfr{2Gq?$5<_fv-1yY+CSUQ0UU+xwAC#>$ZUO))n>B zQeB8-c4m&-6DIhvS#5{TQJm#j6g7<-Nk;s79u8{#njW-}Nd zLhhoexd$DY+R$wSB`549Qqgr-FC5AY==lKVoO0~z*(m{tG9gbv>B^S*J2IEE9-zBa z?Y?}W?fT!aIx9b4-7uf?eWa^5?t2`9v@KOKzf`Ykz`ate)P=`;aI4B>E5LH)9Q&#T z+8hv2n!|E^KI_mcJoj39jeI;g7aoIp;!Vz_TW38jkyGxg7ltM)jtI7PX?g?|-Bc|W z!l5~#+RY-22c!YqUXz)CtAW+-%+=*``SKufEMpzh3IdRSx0e*Bw4VvpmvZ@9)yDUA zUOe9ZW)~aD4zJ3y_tn~({E<#rwO-l9C@e@Y*8UY<$!=q+!@6F1%4-O8d%D7*XlQ|z zk25-U4y)xUTwM_LLUpI_`<(QHyV?mx)H`$17lsmYd66Do_}$81yn3^7KDzT&Vdyx9 z`g{0B_!|d^(r;c*XBM*>)1%b6wqU;RONToqPt)@W)&%~@65Hz{hFN^q>X<#9Vpm#w z-9b21F<#xSswLu&Ncb}!+0QaW4trYC&+PrcvGa}T4k!CazTsR_Yo|WARZq&EoI04= z@QEF_^QzzsGr!s(3nAABs;6g^KXJp6im}+}h8JLhrSmmCbNDHVu zyvp3X>>{hHQ@e#)@O|)Br#u{w^BgKZKNqczq(8<&@VN&$p~1O}GfDeBbM+p#wyo?V@HwyB%M64!ZiTb`7gFxx=w$?@ zMFg`|ap3{o0VRSC{OrDcp<_;@n~g;1HlEv&QA5~SjUI{kB1E3TX?>O-@znJS2BJQ4 zr2SO!Z=?@%$(-iCax;bXdp6BhMgPgwdAgLE3|ylT$l?_3g$1@}#3;Z}YX<38#`1Ovl(g**5p0(olR?H*#<6v63zh z91HTRWIPSM`7W_*Vqd>U7?)qcymDAVzqiu%+pv(GG2_q4L2$4O=~(aeF7V-eRUR+I z_MRGja<^w;^Lr1Vx6~9rk8iL3I2PxxwR>7OoGvWL<<#Q5sFi>`Ri*5vcgHf!nlMm} zFWr$+PUB_jtRLnzy~o2?rju7t*IBNG$5}IflaDjf-=PD7i^|}xzLdNG1OzIMgE&Ygs-19*xo974|0izzHu|S zJYMGJ&qFUS$$?8<&UZA|R)KukV^<}U0;m%82&FtjRVo%tUCdjy>m7=o?isgbY8K+5 zrh+t>A*P#d^SETY{x+e^Fre`tiiz`H8N@&1@Fo z{%sl`Thep%C9LF6S`mB>9RaP&EwL~bUsm1u76gA~DVob)VGHu_0r8~^)qt_M?Q%7^ z)}n6cd;l<1+?lg@htcAn0)V`r@Md7#iZ89+lsVma{*nblu-n*htfA<#LDp ziK6mYl8d)y!I_*KZZt182n3hB*}d4F_6=$C$Q7N^zr#c9i&vz3BTD` zG?%z@X(r7Y3F`R6)c5bbL6Ey#rfy+kyP`rQ?_F-W3c}T|k&NpWoR;9SIgKSR1=Ox# z&Y97QnDN0eS6I#dEH3zVsV8)otgQa&$;=@$&QGOs2k!5X2C=ce?)jkK8XEQ2+ZO|h z-TZ#mX0?1Ix2)WIJLPk39>OXge3S3*Z^|`)W|1T<8au;^5$k+d2#N6dcGTXGQ)qv3 z?@QQFtlm}mGHo84vZ(hN?8$ofxnZ&&0REYnv1Ch|d>Y&8qu76q+E+Clg>z1947y+V zy}SZm3;w2`j$9*ixi9F+SFoHq0e(<@eYqfCR6A}8olA357u7n-_SsZ90)$$kNOuGnS6GVh`D-s}*f!7v zZS?2$%X&SxaBmS!5*BkkQKbn#S>5VELo*Rkt*9L^Jga^Xyn51Tl`Z!Wkhy-2a}h8{ z%h9u>H}qNDgE|?Sn~ILU7rw`=pB(w^GOejpZyu+5$7lCWmQ*A@0mqluL5STW%q>)z z3@CR%b+QhhN!z=)Sv;@T(rv>e{l950ZI5R46v-ycC(T<>t-t^6CcGMVZ~xIw$7j}0 zxX`Xv5%nGpxaPO${ME3HW593=CKm2vL&W-g%il0?Fk7bnCNC6GuJZMymsl2b9WnTb z{3l~-Z_v3F_$mZtefjFa1|Tzg-wJjh!ON<>D(7?2~V2a0hYb>(oka$E#JVlv6S{7{BS2|E~*o ze#sfV^v9m)bXMK579!wKKkqW^_hxMp zw#PP}QbjE9wJn|~_R&1i+taDK0WlOa1W`{=h6+}ZUw_<7Gmfs$7JBvD?%Cx&-Mt{C z5C#u3%tL`2+j#Uoy$enY!XT-Y^74>6 zb^K1YY6V9c-Y;qT_Beo(cbQR@&E!{DoI&hQ$6?yH`z=34`!@}K4&BsgypJDbru^CG zjgB2Dn%Dbww5uU~p@4J?9-_8^D@MM02|9JQP5Vho-jFqUmw?&pd333_U>~{Ox9M&! zbRDkNCCLX{IQ{Yyc#!xde>rOpV-`o7FY1X$M+?<4!4e{3+zTibEV zocS`k+;qi8vmeq^G_l^P^2FZdcvR1bNwNhPbyT1zzd3YD@hgT1MJ5ScLv&yIk4bj&DKx zN@%!d$JhlbrL2o5u61ks>o5K3dl^05@}E91EkC>GDa-oao7e)qzVreH=a6h){z|JU zy(e53p*Mq9_$%$6N2)8g#S7g(Z{4}j88*Ps`5SNE=%=xs4><)sF#=YrLS9?NaUK7R zX`n1#je(GdD$42?KMwma=tE?+DQH5;#8VQzgQLWL`+k0~y4dKxog z)?0Rw7e6~^>7=j(SsmIi+{1$%3>0g%TD)M-JX(oDJ)829k>07onxWidM>Bw32DK%& z5R0wjP!!(Pu^{U-GDqgi+b~QBEz+-FchQV1+iP2{=(1LBB8OE(LPJtSVV z*FC2Q77h6A=custN$c`BfsL>~kq_v`Trc9=a!;c6oj7z3TbK0b9Sius(@<= z_5?|6$f!Bzu_KQFvQ!~I*0tbUW^V*|lMD8q}NWzJqSdgRH+%iySC1`m@Rm*rC_?w^#sepDrnZV%>g zS|%VyF16&@N^l#qCTY8v8Mfvvk-p(er1&jFL3sG;PCA}mt7BY7u0!!piuaj|VyEn$ z74C>X{4X_@d)NOmz}>!hOkN8k8k;sv0$IddD&?9%!A=T=Slo+ z9?0>>EjQ1&&r4!?Ktl7lu&jO~_H(-0YG~I%TPv=w28b*p`1ayc&+qKP^zyg*{=IH_ z^UL&_$J=u8t->d{(rYYgpN+YgtDN#;l@}15F5}}HTd1mx7j?{S5LEZ<4v?(eX-~!B zBKfkCX$-i(RvpyAb3$facbzKVkG0y^VDib&t}VGUPv7(Enjj0E71YW7`1qY|`mT*z z6qaB0I$ff7|3P^D<5Ein=Rm+D^oH5)=8ivt{Q`gA#2Q>(%3^dj$ntytC_`H>Dr&1x-e`RTDR>Edyt!?KAk!kEek)nEe z-BjJ&y~-{jIYLLLZnwB>cAZTa>yJa`tr?(umy%WnyH^0hl`1}&nQdMj8hcEuk7%R# zBX_rLo8x*|6(v}X8Y$ef^!w89#V?yZKMXgJas~d7(J~<%4psP!ba*MZ3h1bF43Zh> z{ho2kT8pqy7+2xs=Xy1PoG!|*VryajX|@kxsy8SgbLYMkGu^8PfCP4|$;0ltWgQ38 zC@ai2E%k6NPwhGZzc#mD<6n|^8{qv_`wtM>{La16X<=8yZhLb^wIZn05@Ed@?t?}a zU;PVPw##AIcji>#ima>28s9-ESe=TH?OD-)%6gb-r64QvTR2;iR+bu$` zc-Iqm8x0_mmmSjN`8 zb`sgb1+sPj{(*+4g}#QAn?83G8DvDG?H&)*gIY;QopC>3(R+WnPJ54(0|7>jP?B^r z=w77<&ApOkykfoctz%8)$?tRw=H-S}aRY4kKt(Ul47-;^ZJnnDfap(k$VBd9;i#PL zYrpsY{Oj=EXn&a$YhRF>poLGxoaa_pi9F2v9s6$;fK~wj0mCP~Z&COx$=AYip8#0k z$CJmsBg_Jtk=&8uaC{#tA93YNwO*l6TD{9leOkk$S6wSMnnL5`d$Q7dUnbIUH6)H@ z+$M`B+nQ&3K}^>iOh<8~we0s_Qrg^bkDH>KOFt2Xn%bRB%vXyg@G;*gp#2o^6vb*y zolX_45$T248*7gfjKpw`>avhxdfIc0e19SYCQg;oqW+p2sPG&ygUbshSL!<30pUUu z;Eg)dp1tU|#pT!O+Vv7OEtj|ZQTJJ&(2%DU^dew`Or7z*`+0T{j(TkUQFtDOZ4a_~ z{SZT|?EoN4++}@=xg7z~Y1Rew9P@vhk>v20EVY|i<^ACW|Ba2a+{V-PWtDw~U&ZO*|PbzVj2>O9J)UOSjY@w(v zWl*PICbj<0YAE@?-QQI$Z*cI%xkTJPWA~-2=x4TxfxjeC^IwZiO7UHK%%ObWOt*Cc z-UE@pvwWE6k?4B{^F!}NwwlF5w_8WL1X7R-B6IEjbEIbDnDv}i{K%h{l6_8+LcAyg z$20Z6#=5r*671ZbyveFgDFrvDOo#Q8KZazMttTM!OWU_uZ?`p`W-|K#08?zAOzTXPrRSzb zLNXq77VwshO}?nmq&-iaFL==eX(a9YP+XmpGMYOR`q;9PUfsptBi_x@^pb&+CI##6 z8-Oea^~%ZjNuIqSd#v#qxqEw{_mhU(%9StqV+kmtk2mX$Sh)Q+IvHrWP9+~`;)7IBRf ziO4nX+Pb>mwNuUvKyxLgo;wRxY|+~gB<&U&ldV&I>0ktDVx?bLaudOsNZ_`$5FLN(hRJwWFqVAyzhp;@&X|;)_%{lEPVZ1%8r2RVF=d$azVMHA{qdRU&iQ{fLZO|`iY<| zK}NQ(Mc>_JyvE9qV+KJL-kjr4VQZJ<)$yXgJ-fYc9dbBeT@Q`-eBQ=wri{7@yeN|Xa+^*ny#l&B?-l#M`Ls<47wvei>Hgem2 zo^+^g{2TTawkQ>#OB%y+_;4?cLg4e3O+D-t_QZ4BA%*DE85m@hZCS-EC8BAIqhRe@ z4k$nr37ey(9+~&DoAM;$>FJ1qR z87S@+o#OlrJcIkNTV2$#ppCZXvp&bJOIu*mH@V8Z>P#2`H|gGYd*eo1Bz+&2hv#Ne z2=xz={oY?H3arB;Ul-0(W6|m2uLy>wOmn5+|-r{v;_UWDVK9wTI%pd z2U~M-Q#jRc_qooDI_=8eXV|+z2}I5x+bWQWUK{5$vR2Qz>wvr9g=qR84}Ji4cqa#G z`M_Ojmmz{y)lF&IuS(Ys;SLEEZ-M4&S1rfqL32rubeV2L2;BMj?G838(f+tV7`pZX ze|wPM^*PmD4dL1v9kh+1AAJ6K#Q~@aO6l2g#OK<`(NVvmGiJquS`Odev7h@*(?@+G z`Jhp>c=;0+Umwn|k!8Uf>(`vjq#i;R2=iwTtdP*=|11y^UXb|lH}W3$kx5Yj=%0|r z^__zQejKbkr{Y%MfVO$$UIO`boNw;*lK%<=RyjN^_>3*RZe@!_?jgV6md?Bg;aQcc zF)a=+e16-SF;%U-m9x?m8}e)W_Yxu_nn#oecjGxfg%^dx`Lw>7r3T-y}%0 z#w+zX8durWfQd2ulm>=E;FXSjZo!(oR_)mBqnFsp&Cg~_eAT-f=arKU`!(Nu+7QCv z&8l!tYIE7afzPOv%+2&0tZtWkVNb=&$6y94b0aX~0I4-~- z%$1&ad0azNi1w@nU{%YA0ig!10c@;>C1XB0bh!~TOX}lI;h@5o95~wn8&U}g+WyH2 z%Ck&uNzyJQ+PC5cDIS6%!vCsqc^&9&_1!l&= zIhM~q5D?E1AEdfK)?i4QB}vC<co}AK`!p1 zoi6K-A$B%zB?YVD?X@FTt*jvSjvL^Gzi<<9H=zsnet9!A>7`n=R4yLFAhr7aSz&dw z_IN->nCo3LwiT=I7Kfpy8MxwmvLjRAWW_trjtMo^=I6Mym3^$l2`HX zXwdqj%TcqF3WdUc;H2(ok9{8nWf;NW2@TGjZ$gkMyCqiI@lKY?@ zaY|cNY+@~-@n2cHQCTIoiHpjq_P4*e#I{JXht@$G$X8Qp zgCobP|Ni3sP!~7$cAc)R(yZ0%^|jUfO6=j1n}yf`@zW_outsZ7>) zi}Q9pZkB}826WWz^Q(FPK4#buF&&G__hD_n95pZJ+$wh{BC4~j#xvNyiTPQbUL;P8 zw(rBQh15R%<8)rY8z3fsO8MELqqgd;sxkl}!S=9i#Z9C>P2agCx<7o1+N7`*VXTR< zzpl}kMT1W+muD)$OAL}0yHz0kVtk{qm?oJ&VTBawGNtQ<$0CnhSoh zeSi0@(XORT`!?#XMlVAen{;fn{jmlx5z_A_W&6Ep;$3m69)S?*d==4So?TyIF=FWQ z2MVf-4ixKl7rzN(b~iczH{47Lmu8{cSejj0F4UAWayz9Mn!yxn9)S3C(%iO|0CzA7 z?x%)6^{?0^uT2FuCRcB`2bC^I;n(E$q`oZKt`~0?pqzDPeFe9Zn)Wg%5Z9$;Y}oN8 z>k7(A(*|;{@CQF7#_RefgX}7GoF?l{6zU>9(KZl&Fl26&xoOjtRG;r?q4F4-uB!^T zVfy(;|3i<(t^9*(eAroS7mJr=FP>C#kdk+^fYu|@e7BCS0D&>fD&%}=Z^|k3^r$s2 zB#Xu+t8cr!U1F1280LJS4(1or!#yn*`kTXKAkL~5d4Y^T9O@(wM%t zK7B6O?s0^5TE@9dtz8`j-$hZ&%Rd$T``d6nMu7asj%IE^E~3f(7{Fp2MH+03azpO< z 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 S6yDi_4D@vMb6Mw<&;$Shd=0?> literal 0 HcmV?d00001 diff --git a/tests/dummy/public/assets/branding/png/Ember-CLI-Mirage-Logo-Stacked-Black.png b/tests/dummy/public/assets/branding/png/Ember-CLI-Mirage-Logo-Stacked-Black.png new file mode 100644 index 0000000000000000000000000000000000000000..df47580724fb4d199e01f06c205cf83113597801 GIT binary patch literal 54006 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 z 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 z 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
    vgI+kIm_oe=g53)jE_6&?)$cVVB)E06) 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 KEqP)d^8Wyf^C39^ literal 0 HcmV?d00001 diff --git a/tests/dummy/public/assets/branding/svg/Ember-CLI-Mirage-Logo-Horiz-Black.svg b/tests/dummy/public/assets/branding/svg/Ember-CLI-Mirage-Logo-Horiz-Black.svg new file mode 100644 index 000000000..01db46789 --- /dev/null +++ b/tests/dummy/public/assets/branding/svg/Ember-CLI-Mirage-Logo-Horiz-Black.svg @@ -0,0 +1,49 @@ + + + + + + diff --git a/tests/dummy/public/assets/branding/svg/Ember-CLI-Mirage-Logo-Horiz-Color.svg b/tests/dummy/public/assets/branding/svg/Ember-CLI-Mirage-Logo-Horiz-Color.svg new file mode 100644 index 000000000..3c3ac1503 --- /dev/null +++ b/tests/dummy/public/assets/branding/svg/Ember-CLI-Mirage-Logo-Horiz-Color.svg @@ -0,0 +1,58 @@ + + + + + + + + diff --git a/tests/dummy/public/assets/branding/svg/Ember-CLI-Mirage-Logo-Stacked-Black.svg b/tests/dummy/public/assets/branding/svg/Ember-CLI-Mirage-Logo-Stacked-Black.svg new file mode 100644 index 000000000..83049612b --- /dev/null +++ b/tests/dummy/public/assets/branding/svg/Ember-CLI-Mirage-Logo-Stacked-Black.svg @@ -0,0 +1,51 @@ + + + + + + diff --git a/tests/dummy/public/assets/branding/svg/Ember-CLI-Mirage-Logo-Stacked-Color.svg b/tests/dummy/public/assets/branding/svg/Ember-CLI-Mirage-Logo-Stacked-Color.svg new file mode 100644 index 000000000..0d70d7202 --- /dev/null +++ b/tests/dummy/public/assets/branding/svg/Ember-CLI-Mirage-Logo-Stacked-Color.svg @@ -0,0 +1,55 @@ + + + + + + + + diff --git a/tests/dummy/public/assets/favicon.sketch b/tests/dummy/public/assets/favicon.sketch new file mode 100644 index 0000000000000000000000000000000000000000..b5e8d548ca806c444fc08b698875b794e23115df GIT binary patch literal 118245 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 r5i#$x(_J9YM9rz+?VoG@u+OI<5IefGW=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + dependencies: + string-width "^2.0.0" + ansi-escapes@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" @@ -257,11 +333,17 @@ ansi-styles@^3.0.0, ansi-styles@^3.1.0, ansi-styles@^3.2.0: dependencies: color-convert "^1.9.0" +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + dependencies: + color-convert "^1.9.0" + ansicolors@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" -any-promise@^1.0.0, any-promise@^1.3.0: +any-promise@^1.0.0, any-promise@^1.1.0, any-promise@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" @@ -272,12 +354,27 @@ anymatch@^1.3.0: micromatch "^2.1.5" normalize-path "^2.0.0" +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + aot-test-generators@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/aot-test-generators/-/aot-test-generators-0.1.0.tgz#43f0f615f97cb298d7919c1b0b4e6b7310b03cd0" dependencies: jsesc "^2.5.0" +applause@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/applause/-/applause-1.2.2.tgz#a8468579e81f67397bb5634c29953bedcd0f56c0" + dependencies: + cson-parser "^1.1.0" + js-yaml "^3.3.0" + lodash "^3.10.0" + aproba@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -295,6 +392,12 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@~1.0.2: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + dependencies: + sprintf-js "~1.0.2" + arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" @@ -357,10 +460,14 @@ arraybuffer.slice@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" -arrify@^1.0.0: +arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" +asn1@0.1.11: + version "0.1.11" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.1.11.tgz#559be18376d08a4ec4dbe80877d27818639b2df7" + asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" @@ -369,6 +476,10 @@ assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" +assert-plus@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.1.5.tgz#ee74009413002d84cec7219c6ac811812e723160" + assert-plus@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" @@ -401,6 +512,10 @@ async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" +async-foreach@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" @@ -412,7 +527,7 @@ async-promise-queue@^1.0.3: async "^2.4.1" debug "^2.6.8" -async@^1.4.0, async@^1.5.2: +async@^1.4.0, async@^1.5.0, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -426,6 +541,10 @@ async@~0.2.9: version "0.2.10" resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" +async@~0.9.0: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -434,6 +553,21 @@ atob@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d" +autoprefixer@^7.0.0: + version "7.2.6" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.2.6.tgz#256672f86f7c735da849c4f07d008abb056067dc" + dependencies: + browserslist "^2.11.3" + caniuse-lite "^1.0.30000805" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^6.0.17" + postcss-value-parser "^3.2.3" + +aws-sign2@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.5.0.tgz#c57103f7a17fc037f02d7c2e64b602ea223f7d63" + aws-sign2@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" @@ -446,6 +580,10 @@ aws4@^1.2.1, aws4@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" +aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -478,6 +616,30 @@ babel-core@^6.14.0, babel-core@^6.26.0: slash "^1.0.0" source-map "^0.5.6" +babel-core@^6.24.1: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + babel-eslint@^8.2.6: version "8.2.6" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.6.tgz#6270d0c73205628067c0f7ae1693a9e797acefd9" @@ -489,6 +651,19 @@ babel-eslint@^8.2.6: eslint-scope "3.7.1" eslint-visitor-keys "^1.0.0" +babel-generator@6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.6" + trim-right "^1.0.1" + babel-generator@^6.26.0: version "6.26.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" @@ -627,6 +802,12 @@ babel-plugin-debug-macros@^0.2.0-beta.6: dependencies: semver "^5.3.0" +babel-plugin-ember-modules-api-polyfill@^1.4.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-1.6.0.tgz#abd1afa4237b3121cb51222f9bf3283cad8990aa" + dependencies: + ember-rfc176-data "^0.2.0" + babel-plugin-ember-modules-api-polyfill@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.3.0.tgz#0c01f359658cfb9c797f705af6b09f6220205ae0" @@ -651,6 +832,10 @@ babel-plugin-htmlbars-inline-precompile@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.2.3.tgz#cd365e278af409bfa6be7704c4354beee742446b" +babel-plugin-htmlbars-inline-precompile@^0.2.5: + version "0.2.6" + resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.2.6.tgz#c00b8a3f4b32ca04bf0f0d5169fcef3b5a66d69d" + babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" @@ -683,7 +868,7 @@ babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-block-scoping@^6.23.0: +babel-plugin-transform-es2015-block-scoping@^6.23.0, babel-plugin-transform-es2015-block-scoping@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" dependencies: @@ -967,7 +1152,7 @@ babel-template@^6.24.1, babel-template@^6.26.0: babylon "^6.18.0" lodash "^4.17.4" -babel-traverse@^6.24.1, babel-traverse@^6.26.0: +babel-traverse@6.26.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" dependencies: @@ -998,14 +1183,14 @@ babel6-plugin-strip-heimdall@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/babel6-plugin-strip-heimdall/-/babel6-plugin-strip-heimdall-6.0.1.tgz#35f80eddec1f7fffdc009811dfbd46d9965072b6" +babylon@6.18.0, babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + babylon@7.0.0-beta.44: version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - backbone@^1.1.2: version "1.3.3" resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.3.3.tgz#4cc80ea7cb1631ac474889ce40f2f8bc683b2999" @@ -1058,6 +1243,10 @@ better-assert@~1.0.0: dependencies: callsite "1.0.0" +bignumber.js@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-2.4.0.tgz#838a992da9f9d737e0f4b2db0be62bb09dd0c5e8" + binary-extensions@^1.0.0: version "1.11.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" @@ -1080,10 +1269,18 @@ block-stream@*: dependencies: inherits "~2.0.0" -bluebird@^3.1.1, bluebird@^3.4.6: +bluebird@^3.1.1, bluebird@^3.3.5, bluebird@^3.4.6: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" +bmp-js@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.0.1.tgz#5ad0147099d13a9f38aa7b99af1d6e78666ed37f" + +bmp-js@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.0.3.tgz#64113e9c7cf1202b376ed607bf30626ebe57b18a" + body-parser@1.18.2: version "1.18.2" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" @@ -1108,6 +1305,16 @@ body@^5.1.0: raw-body "~1.1.0" safe-json-parse "~1.0.1" +boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + +boom@0.4.x: + version "0.4.2" + resolved "https://registry.yarnpkg.com/boom/-/boom-0.4.2.tgz#7a636e9ded4efcefb19cef4947a3c67dfaee911b" + dependencies: + hoek "0.9.x" + boom@2.x.x: version "2.10.1" resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" @@ -1140,6 +1347,25 @@ bower-endpoint-parser@0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz#00b565adbfab6f2d35addde977e97962acbcb3f6" +boxen@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + +brace-expansion@^1.0.0: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + brace-expansion@^1.1.7: version "1.1.8" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" @@ -1171,6 +1397,21 @@ braces@^2.3.0: split-string "^3.0.2" to-regex "^3.0.1" +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + broccoli-asset-rev@^2.4.5: version "2.6.0" resolved "https://registry.yarnpkg.com/broccoli-asset-rev/-/broccoli-asset-rev-2.6.0.tgz#0633fc3a0b2ba0c2c1d56fa9feb7b331fc83be6d" @@ -1187,6 +1428,14 @@ broccoli-asset-rewrite@^1.1.0: dependencies: broccoli-filter "^1.2.3" +broccoli-autoprefixer@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/broccoli-autoprefixer/-/broccoli-autoprefixer-5.0.0.tgz#68c9f3bfdfff9df2d39e46545b9cf9d4443d6a16" + dependencies: + autoprefixer "^7.0.0" + broccoli-persistent-filter "^1.1.6" + postcss "^6.0.1" + broccoli-babel-transpiler@^6.0.0, broccoli-babel-transpiler@^6.1.2: version "6.1.4" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.1.4.tgz#8be8074c42abf2e17ff79b2d2a21df5c51143c82" @@ -1217,6 +1466,14 @@ broccoli-babel-transpiler@^6.4.5: rsvp "^4.8.2" workerpool "^2.3.0" +broccoli-bridge@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/broccoli-bridge/-/broccoli-bridge-1.0.0.tgz#6223fd64b62062c31333539f0f3c42d0acd92fb1" + dependencies: + broccoli-plugin "^1.3.0" + fs-extra "^7.0.0" + symlink-or-copy "^1.2.0" + broccoli-brocfile-loader@^0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/broccoli-brocfile-loader/-/broccoli-brocfile-loader-0.18.0.tgz#2e86021c805c34ffc8d29a2fb721cf273e819e4b" @@ -1234,7 +1491,7 @@ broccoli-builder@^0.18.8: rsvp "^3.0.17" silent-error "^1.0.1" -broccoli-caching-writer@^2.2.0: +broccoli-caching-writer@^2.2.0, broccoli-caching-writer@^2.2.1: version "2.3.1" resolved "https://registry.yarnpkg.com/broccoli-caching-writer/-/broccoli-caching-writer-2.3.1.tgz#b93cf58f9264f003075868db05774f4e7f25bd07" dependencies: @@ -1308,6 +1565,15 @@ broccoli-debug@^0.6.1, broccoli-debug@^0.6.2, broccoli-debug@^0.6.3, broccoli-de symlink-or-copy "^1.1.8" tree-sync "^1.2.2" +broccoli-favicon@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/broccoli-favicon/-/broccoli-favicon-1.0.0.tgz#c770a5aa16032fbaf1b5c9c033f71b9cc5a5cb51" + dependencies: + bluebird "^3.3.5" + broccoli-caching-writer "^2.2.1" + favicons "^4.7.1" + lodash "^4.10.0" + broccoli-file-creator@^1.0.0, broccoli-file-creator@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/broccoli-file-creator/-/broccoli-file-creator-1.1.1.tgz#1b35b67d215abdfadd8d49eeb69493c39e6c3450" @@ -1319,6 +1585,19 @@ broccoli-file-creator@^1.0.0, broccoli-file-creator@^1.1.1: rsvp "~3.0.6" symlink-or-copy "^1.0.1" +broccoli-filter@^0.1.11: + version "0.1.14" + resolved "https://registry.yarnpkg.com/broccoli-filter/-/broccoli-filter-0.1.14.tgz#23cae3891ff9ebb7b4d7db00c6dcf03535daf7ad" + dependencies: + broccoli-kitchen-sink-helpers "^0.2.6" + broccoli-writer "^0.1.1" + mkdirp "^0.3.5" + promise-map-series "^0.2.1" + quick-temp "^0.1.2" + rsvp "^3.0.16" + symlink-or-copy "^1.0.1" + walk-sync "^0.1.3" + broccoli-filter@^1.2.2, broccoli-filter@^1.2.3: version "1.2.4" resolved "https://registry.yarnpkg.com/broccoli-filter/-/broccoli-filter-1.2.4.tgz#409afb94b9a3a6da9fac8134e91e205f40cc7330" @@ -1333,11 +1612,32 @@ broccoli-filter@^1.2.2, broccoli-filter@^1.2.3: symlink-or-copy "^1.0.1" walk-sync "^0.3.1" +broccoli-filter@^1.2.4: + version "1.3.0" + resolved "https://registry.yarnpkg.com/broccoli-filter/-/broccoli-filter-1.3.0.tgz#71e3a8e32a17f309e12261919c5b1006d6766de6" + dependencies: + broccoli-kitchen-sink-helpers "^0.3.1" + broccoli-plugin "^1.0.0" + copy-dereference "^1.0.0" + debug "^2.2.0" + mkdirp "^0.5.1" + promise-map-series "^0.2.1" + rsvp "^3.0.18" + symlink-or-copy "^1.0.1" + walk-sync "^0.3.1" + +broccoli-flatiron@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/broccoli-flatiron/-/broccoli-flatiron-0.1.3.tgz#fc7bd8faf7db429ed7199933aa2ec7ef84a8d943" + dependencies: + broccoli-plugin "^1.3.0" + mkdirp "^0.5.1" + broccoli-funnel-reducer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/broccoli-funnel-reducer/-/broccoli-funnel-reducer-1.0.0.tgz#11365b2a785aec9b17972a36df87eef24c5cc0ea" -broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.2, broccoli-funnel@^1.1.0: +broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.2, broccoli-funnel@^1.1.0, broccoli-funnel@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-1.2.0.tgz#cddc3afc5ff1685a8023488fff74ce6fb5a51296" dependencies: @@ -1374,7 +1674,7 @@ broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-kitchen-sink-helpers@^0.2.5, broccoli-kitchen-sink-helpers@~0.2.0: +broccoli-kitchen-sink-helpers@^0.2.0, broccoli-kitchen-sink-helpers@^0.2.5, broccoli-kitchen-sink-helpers@^0.2.6, broccoli-kitchen-sink-helpers@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz#a5e0986ed8d76fb5984b68c3f0450d3a96e36ecc" dependencies: @@ -1431,7 +1731,7 @@ broccoli-node-info@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-1.1.0.tgz#3aa2e31e07e5bdb516dd25214f7c45ba1c459412" -broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.4.0, broccoli-persistent-filter@^1.4.3: +broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.2.0, broccoli-persistent-filter@^1.4.0, broccoli-persistent-filter@^1.4.2, broccoli-persistent-filter@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.3.tgz#3511bc52fc53740cda51621f58a28152d9911bc1" dependencies: @@ -1467,6 +1767,57 @@ broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli rimraf "^2.3.4" symlink-or-copy "^1.1.8" +broccoli-replace@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/broccoli-replace/-/broccoli-replace-0.12.0.tgz#36460a984c45c61731638c53068b0ab12ea8fdb7" + dependencies: + applause "1.2.2" + broccoli-persistent-filter "^1.2.0" + minimatch "^3.0.0" + +broccoli-rollup@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/broccoli-rollup/-/broccoli-rollup-1.3.0.tgz#43a0a7798555bab54217009eb470a4ff5a056df0" + dependencies: + broccoli-plugin "^1.2.1" + es6-map "^0.1.4" + fs-extra "^0.30.0" + fs-tree-diff "^0.5.2" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + md5-hex "^1.3.0" + node-modules-path "^1.0.1" + rollup "^0.41.4" + symlink-or-copy "^1.1.8" + walk-sync "^0.3.1" + +broccoli-rollup@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/broccoli-rollup/-/broccoli-rollup-2.1.1.tgz#0b77dc4b7560a53e998ea85f3b56772612d4988d" + dependencies: + "@types/node" "^9.6.0" + amd-name-resolver "^1.2.0" + broccoli-plugin "^1.2.1" + fs-tree-diff "^0.5.2" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + magic-string "^0.24.0" + node-modules-path "^1.0.1" + rollup "^0.57.1" + symlink-or-copy "^1.1.8" + walk-sync "^0.3.1" + +broccoli-sass-source-maps@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/broccoli-sass-source-maps/-/broccoli-sass-source-maps-2.2.0.tgz#1f1a0794136152b096188638b59b42b17a4bdc68" + dependencies: + broccoli-caching-writer "^3.0.3" + include-path-searcher "^0.1.0" + mkdirp "^0.3.5" + node-sass "^4.7.2" + object-assign "^2.0.0" + rsvp "^3.0.6" + broccoli-slow-trees@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-2.0.0.tgz#9741afe992787add64aec7f7c8211dfcc058278d" @@ -1491,6 +1842,14 @@ broccoli-sri-hash@^2.1.0: sri-toolbox "^0.2.0" symlink-or-copy "^1.0.1" +broccoli-static-compiler@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/broccoli-static-compiler/-/broccoli-static-compiler-0.1.4.tgz#713d18f08eb3131530575a0c5ad2951bba10af41" + dependencies: + broccoli-kitchen-sink-helpers "^0.2.0" + broccoli-writer "^0.1.1" + mkdirp "^0.3.5" + broccoli-stew@^1.2.0, broccoli-stew@^1.3.3, broccoli-stew@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-1.5.0.tgz#d7af8c18511dce510e49d308a62e5977f461883c" @@ -1510,6 +1869,25 @@ broccoli-stew@^1.2.0, broccoli-stew@^1.3.3, broccoli-stew@^1.5.0: symlink-or-copy "^1.1.8" walk-sync "^0.3.0" +broccoli-stew@^1.4.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-1.6.0.tgz#01f6d92806ed6679ddbe48d405066a0e164dfbef" + dependencies: + broccoli-debug "^0.6.1" + broccoli-funnel "^2.0.0" + broccoli-merge-trees "^2.0.0" + broccoli-persistent-filter "^1.1.6" + broccoli-plugin "^1.3.0" + chalk "^2.4.1" + debug "^3.1.0" + ensure-posix-path "^1.0.1" + fs-extra "^5.0.0" + minimatch "^3.0.4" + resolve "^1.8.1" + rsvp "^4.8.3" + symlink-or-copy "^1.2.0" + walk-sync "^0.3.0" + broccoli-string-replace@^0.1.1, broccoli-string-replace@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/broccoli-string-replace/-/broccoli-string-replace-0.1.2.tgz#1ed92f85680af8d503023925e754e4e33676b91f" @@ -1517,6 +1895,44 @@ broccoli-string-replace@^0.1.1, broccoli-string-replace@^0.1.2: broccoli-persistent-filter "^1.1.5" minimatch "^3.0.3" +broccoli-style-manifest@^1.4.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/broccoli-style-manifest/-/broccoli-style-manifest-1.5.2.tgz#249accc81a75b83fb581cd8c2d16a51a4989664d" + dependencies: + broccoli-caching-writer "^3.0.3" + fs-tree-diff "^0.5.6" + md5 "^2.2.1" + rsvp "^4.8.2" + walk-sync "^0.3.1" + +broccoli-svg-optimizer@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/broccoli-svg-optimizer/-/broccoli-svg-optimizer-1.1.0.tgz#5d6e03310298c7a1d22d373508beedc6258590cc" + dependencies: + broccoli-persistent-filter "^1.2.0" + json-stable-stringify "^1.0.1" + lodash "^4.17.10" + rsvp "^4.8.2" + svgo "0.6.6" + +broccoli-symbolizer@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/broccoli-symbolizer/-/broccoli-symbolizer-0.6.0.tgz#1ece00fba329f19ab42d920350a5f2014f8d0b52" + dependencies: + broccoli-concat "^3.2.2" + broccoli-persistent-filter "^1.2.0" + cheerio "^0.22.0" + json-stable-stringify "^1.0.1" + lodash "^4.17.10" + +broccoli-templater@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/broccoli-templater/-/broccoli-templater-1.0.0.tgz#7c054aacf596d1868d1a44291f9ec7b907d30ecf" + dependencies: + broccoli-filter "^0.1.11" + broccoli-stew "^1.2.0" + lodash.template "^3.3.2" + broccoli-test-helper@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/broccoli-test-helper/-/broccoli-test-helper-1.3.0.tgz#ba673418b3963b2cc466be66092a5928700c827f" @@ -1548,7 +1964,7 @@ broccoli-unwatched-tree@^0.1.1: dependencies: broccoli-source "^1.1.0" -broccoli-writer@~0.1.1: +broccoli-writer@^0.1.1, broccoli-writer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/broccoli-writer/-/broccoli-writer-0.1.1.tgz#d4d71aa8f2afbc67a3866b91a2da79084b96ab2d" dependencies: @@ -1583,7 +1999,7 @@ browser-stdout@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" -browserslist@^2.1.2: +browserslist@^2.1.2, browserslist@^2.11.3: version "2.11.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" dependencies: @@ -1603,6 +2019,25 @@ bser@^2.0.0: dependencies: node-int64 "^0.4.0" +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + +buffer-alloc@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-equal@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + buffer-from@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" @@ -1637,7 +2072,7 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -calculate-cache-key-for-tree@^1.0.0: +calculate-cache-key-for-tree@^1.0.0, calculate-cache-key-for-tree@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-1.1.0.tgz#0c3e42c9c134f3c9de5358c0f16793627ea976d6" dependencies: @@ -1668,10 +2103,18 @@ camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" -camelcase@^2.0.0: +camelcase@^2.0.0, camelcase@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + +camelcase@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + can-symlink@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/can-symlink/-/can-symlink-1.0.0.tgz#97b607d8a84bb6c6e228b902d864ecb594b9d219" @@ -1682,6 +2125,10 @@ caniuse-lite@^1.0.30000792: version "1.0.30000803" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000803.tgz#9939c37149d38d5f4540430490d240c03106a0f5" +caniuse-lite@^1.0.30000805: + version "1.0.30000878" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000878.tgz#c644c39588dd42d3498e952234c372e5a40a4123" + caniuse-lite@^1.0.30000844: version "1.0.30000865" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25" @@ -1692,6 +2139,10 @@ capture-exit@^1.1.0: dependencies: rsvp "^3.3.3" +capture-stack-trace@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" + cardinal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-1.0.0.tgz#50e21c1b0aa37729f9377def196b5a9cec932ee9" @@ -1757,10 +2208,22 @@ chalk@^2.3.0: escape-string-regexp "^1.0.5" supports-color "^5.2.0" +chalk@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" +charenc@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + charm@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/charm/-/charm-1.0.2.tgz#8add367153a6d9a581331052c4090991da995e35" @@ -1771,12 +2234,55 @@ check-error@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" -chokidar@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" +cheerio@0.20.0: + version "0.20.0" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.20.0.tgz#5c710f2bab95653272842ba01c6ea61b3545ec35" dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "~3.8.1" + lodash "^4.1.0" + optionalDependencies: + jsdom "^7.0.2" + +cheerio@0.22.0, cheerio@^0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash.assignin "^4.0.9" + lodash.bind "^4.1.4" + lodash.defaults "^4.0.1" + lodash.filter "^4.4.0" + lodash.flatten "^4.2.0" + lodash.foreach "^4.3.0" + lodash.map "^4.4.0" + lodash.merge "^4.4.0" + lodash.pick "^4.2.1" + lodash.reduce "^4.4.0" + lodash.reject "^4.4.0" + lodash.some "^4.4.0" + +cheerio@^0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.19.0.tgz#772e7015f2ee29965096d71ea4175b75ab354925" + dependencies: + css-select "~1.0.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "~3.8.1" + lodash "^3.2.0" + +chokidar@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" glob-parent "^2.0.0" inherits "^2.0.1" is-binary-path "^1.0.0" @@ -1786,10 +2292,43 @@ chokidar@1.7.0: optionalDependencies: fsevents "^1.0.0" +chokidar@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" + dependencies: + anymatch "^2.0.0" + async-each "^1.0.0" + braces "^2.3.0" + glob-parent "^3.1.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + lodash.debounce "^4.0.8" + normalize-path "^2.1.1" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + upath "^1.0.5" + optionalDependencies: + fsevents "^1.2.2" + +chownr@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" + +ci-info@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.4.0.tgz#4841d53cad49f11b827b648ebde27a6e189b412f" + circular-json@^0.3.1: version "0.3.3" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" +clap@^1.0.9: + version "1.2.3" + resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" + dependencies: + chalk "^1.1.3" + class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -1818,6 +2357,10 @@ clean-css@^3.4.5: commander "2.8.x" source-map "0.4.x" +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + cli-cursor@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" @@ -1853,6 +2396,14 @@ cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" +clipboard@^1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-1.7.1.tgz#360d6d6946e99a7a1fef395e42ba92b5e9b5a16b" + dependencies: + good-listener "^1.2.2" + select "^1.1.2" + tiny-emitter "^2.0.0" + cliui@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" @@ -1861,6 +2412,22 @@ cliui@^2.1.0: right-align "^0.1.1" wordwrap "0.0.2" +cliui@^3.0.3, cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +clone-stats@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" + +clone@^1.0.0, clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + clone@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" @@ -1869,10 +2436,20 @@ co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" +coa@~1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" + dependencies: + q "^1.1.2" + code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" +coffee-script@^1.10.0: + version "1.12.7" + resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.7.tgz#c05dae0cb79591d05b3070a8433a98c9a89ccc53" + collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -1886,6 +2463,10 @@ color-convert@^1.9.0: dependencies: color-name "^1.1.1" +color-logger@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/color-logger/-/color-logger-0.0.3.tgz#d9b22dd1d973e166b18bf313f9f481bba4df2018" + color-name@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" @@ -1894,16 +2475,28 @@ colors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" -colors@^1.1.2: +colors@^1.1.2, colors@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" +combined-stream@1.0.6, combined-stream@~1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + dependencies: + delayed-stream "~1.0.0" + combined-stream@^1.0.5, combined-stream@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" dependencies: delayed-stream "~1.0.0" +combined-stream@~0.0.4: + version "0.0.7" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-0.0.7.tgz#0137e657baa5a7541c57ac37ac5fc07d73b4dc1f" + dependencies: + delayed-stream "0.0.5" + commander@2.12.2: version "2.12.2" resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555" @@ -1920,6 +2513,10 @@ commander@2.9.0: dependencies: graceful-readlink ">= 1.0.0" +commander@^2.11.0: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + commander@^2.5.0: version "2.16.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" @@ -1932,6 +2529,10 @@ commander@~2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" +comment-regex@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/comment-regex/-/comment-regex-1.0.1.tgz#e070d2c4db33231955d0979d27c918fcb6f93565" + common-tags@^1.4.0: version "1.7.2" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.7.2.tgz#24d9768c63d253a56ecff93845b44b4df1d52771" @@ -1976,6 +2577,15 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" +concat-stream@1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + concat-stream@^1.4.7, concat-stream@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" @@ -2065,11 +2675,17 @@ core-js@^2.4.0, core-js@^2.5.0: version "2.5.3" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" +core-object@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/core-object/-/core-object-2.0.6.tgz#60134b9c40ff69b27bc15e82db945e4df782961b" + dependencies: + chalk "^1.1.3" + core-object@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/core-object/-/core-object-1.1.0.tgz#86d63918733cf9da1a5aae729e62c0a88e66ad0a" -core-object@^2.0.6: +core-object@^2.0.0, core-object@^2.0.6: version "2.1.1" resolved "https://registry.yarnpkg.com/core-object/-/core-object-2.1.1.tgz#4b7a5f1edefcb1e6d0dcb58eab1b9f90bfc666a8" dependencies: @@ -2094,6 +2710,19 @@ cpr@^2.0.0: mkdirp "~0.5.1" rimraf "^2.5.4" +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + dependencies: + capture-stack-trace "^1.0.0" + +cross-spawn@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -2102,6 +2731,16 @@ cross-spawn@^5.0.1, cross-spawn@^5.1.0: shebang-command "^1.2.0" which "^1.2.9" +crypt@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + +cryptiles@0.2.x: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-0.2.2.tgz#ed91ff1f17ad13d3748288594f8a48a0d26f325c" + dependencies: + boom "0.4.x" + cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" @@ -2118,11 +2757,54 @@ crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" +cson-parser@^1.1.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/cson-parser/-/cson-parser-1.3.5.tgz#7ec675e039145533bf2a6a856073f1599d9c2d24" + dependencies: + coffee-script "^1.10.0" + +css-select@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.0.0.tgz#b1121ca51848dd264e2244d058cee254deeb44b0" + dependencies: + boolbase "~1.0.0" + css-what "1.0" + domutils "1.4" + nth-check "~1.0.0" + +css-select@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-what@1.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-1.0.0.tgz#d7cc2df45180666f99d2b14462639469e00f736c" + +css-what@2.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" + +csso@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-2.0.0.tgz#178b43a44621221c27756086f531e02f42900ee8" + dependencies: + clap "^1.0.9" + source-map "^0.5.3" + cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": version "0.3.2" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" -"cssstyle@>= 0.2.37 < 0.3.0": +"cssom@>= 0.3.0 < 0.4.0": + version "0.3.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.4.tgz#8cd52e8a3acfd68d3aed38ee0a640177d2f9d797" + +"cssstyle@>= 0.2.29 < 0.3.0", "cssstyle@>= 0.2.37 < 0.3.0": version "0.2.37" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" dependencies: @@ -2134,13 +2816,23 @@ cssstyle@^1.0.0: dependencies: cssom "0.3.x" +ctype@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/ctype/-/ctype-0.5.3.tgz#82c18c2461f74114ef16c135224ad0b9144ca12f" + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" dependencies: array-find-index "^1.0.1" -dag-map@^2.0.2: +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + dependencies: + es5-ext "^0.10.9" + +dag-map@^2.0.1, dag-map@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/dag-map/-/dag-map-2.0.2.tgz#9714b472de82a1843de2fba9b6876938cab44c68" @@ -2158,7 +2850,13 @@ data-urls@^1.0.0: whatwg-mimetype "^2.0.0" whatwg-url "^6.4.0" -debug@2.2.0: +date-time@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/date-time/-/date-time-2.1.0.tgz#0286d1b4c769633b3ca13e1e62558d2dbdc2eba2" + dependencies: + time-zone "^1.0.0" + +debug@2.2.0, debug@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" dependencies: @@ -2176,7 +2874,7 @@ debug@2.6.8: dependencies: ms "2.0.0" -debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.4.0, debug@^2.6.8, debug@~2.6.7: +debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.4.0, debug@^2.6.8, debug@^2.6.9, debug@~2.6.7: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: @@ -2188,7 +2886,7 @@ debug@^3.0.0, debug@^3.1.0: dependencies: ms "2.0.0" -decamelize@^1.0.0, decamelize@^1.1.2: +decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -2202,6 +2900,10 @@ deep-eql@^3.0.0: dependencies: type-detect "^4.0.0" +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + deep-extend@~0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" @@ -2222,6 +2924,17 @@ define-property@^1.0.0: dependencies: is-descriptor "^1.0.0" +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + del@^2.0.2: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" @@ -2234,10 +2947,18 @@ del@^2.0.2: pinkie-promise "^2.0.0" rimraf "^2.2.8" +delayed-stream@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-0.0.5.tgz#d4b1f43a93e8296dfe02694f4680bc37a313c73f" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" +delegate@^3.1.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" + delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" @@ -2246,7 +2967,7 @@ depd@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" -depd@~1.1.1: +depd@~1.1.1, depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -2288,18 +3009,81 @@ doctrine@^2.1.0: dependencies: esutils "^2.0.2" +dom-serializer@0, dom-serializer@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + dependencies: + domelementtype "~1.1.1" + entities "~1.1.1" + +dom-walk@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" + +domelementtype@1, domelementtype@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" + +domelementtype@~1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" + domexception@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" dependencies: webidl-conversions "^4.0.2" +domhandler@2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" + dependencies: + domelementtype "1" + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + dependencies: + domelementtype "1" + +domutils@1.4: + version "1.4.3" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.4.3.tgz#0865513796c6b306031850e175516baf80b72a6f" + dependencies: + domelementtype "1" + +domutils@1.5, domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^1.5.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + dependencies: + dom-serializer "0" + domelementtype "1" + dot-prop@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" dependencies: is-obj "^1.0.0" +dotenv@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-1.2.0.tgz#7cd73e16e07f057c8072147a5bc3a8677f0ab5c6" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + +duplexer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" @@ -2328,6 +3112,84 @@ ember-ajax@^3.0.0: dependencies: ember-cli-babel "^6.0.0" +ember-app-scheduler@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/ember-app-scheduler/-/ember-app-scheduler-1.0.4.tgz#2d75cc645c18a0f5b0febaf8de37e6ca4059f4ed" + dependencies: + ember-cli-babel "^6.3.0" + +ember-cli-addon-docs-esdoc@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs-esdoc/-/ember-cli-addon-docs-esdoc-0.2.1.tgz#fcb2f1792f1bd4d6a5df8205f7b6e555abbcd1b9" + dependencies: + broccoli-caching-writer "^3.0.3" + ember-cli-babel "^6.6.0" + esdoc pzuraq/esdoc#015a342 + esdoc-accessor-plugin "^1.0.0" + esdoc-ecmascript-proposal-plugin "^1.0.0" + fs-extra "^5.0.0" + json-api-serializer "^1.11.0" + lodash "^4.17.5" + tmp "^0.0.33" + walk-sync "^0.3.2" + +ember-cli-addon-docs@ember-learn/ember-cli-addon-docs#a61d13b9e95c7a303c9f888772d7909441e8ed6b: + version "0.5.2" + resolved "https://codeload.github.com/ember-learn/ember-cli-addon-docs/tar.gz/a61d13b9e95c7a303c9f888772d7909441e8ed6b" + dependencies: + "@glimmer/syntax" "^0.30.5" + broccoli-bridge "^1.0.0" + broccoli-caching-writer "^3.0.3" + broccoli-filter "^1.2.4" + broccoli-funnel "^2.0.1" + broccoli-merge-trees "^2.0.0" + broccoli-persistent-filter "^1.4.3" + broccoli-plugin "^1.3.0" + broccoli-source "^1.1.0" + broccoli-stew "^1.5.0" + ember-cli-autoprefixer "^0.8.1" + ember-cli-babel "^6.11.0" + ember-cli-clipboard "^0.8.1" + ember-cli-htmlbars "^2.0.3" + ember-cli-htmlbars-inline-precompile "^1.0.2" + ember-cli-sass "7.1.3" + ember-cli-string-helpers "^1.7.0" + ember-cli-tailwind "^0.4.1" + ember-code-snippet "^2.2.0" + ember-component-css "^0.3.5" + ember-concurrency "^0.8.16" + ember-data "^2.18.0" + ember-fetch "^4.0.2" + ember-fetch-adapter "^0.4.2" + ember-href-to "^1.15.1" + ember-keyboard "^3.0.0" + ember-modal-dialog "2.4.3" + ember-responsive "^3.0.0-beta.1" + ember-router-scroll "^0.7.1" + ember-svg-jar "^1.2.1" + ember-tether "^1.0.0-beta.2" + ember-truth-helpers "^2.0.0" + execa "^0.9.0" + fs-extra "^5.0.0" + git-repo-info "^1.4.1" + highlightjs "^9.10.0" + hosted-git-info "^2.5.0" + html-entities "^1.2.1" + inflected "^2.0.3" + jsdom "^11.11.0" + json-api-serializer "^1.11.0" + liquid-fire "^0.29.1" + lodash "^4.17.5" + lunr "^2.1.5" + marked "^0.3.12" + parse-git-config "^1.1.1" + quick-temp "^0.1.8" + resolve "^1.5.0" + semver "^5.5.0" + striptags "^3.1.1" + walk-sync "^0.3.2" + yuidocjs "^0.10.2" + ember-cli-addon-tests@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/ember-cli-addon-tests/-/ember-cli-addon-tests-0.7.1.tgz#6959c4cce1a9d16a4852465e2b2bed4bf26b46ec" @@ -2353,6 +3215,13 @@ ember-cli-app-version@^2.0.0: ember-cli-babel "^6.8.0" git-repo-version "0.4.1" +ember-cli-autoprefixer@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/ember-cli-autoprefixer/-/ember-cli-autoprefixer-0.8.1.tgz#071dd9574451057b03dcc03b71f5bd9cb07ef332" + dependencies: + broccoli-autoprefixer "^5.0.0" + lodash "^4.0.0" + ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2, ember-cli-babel@^6.9.0: version "6.11.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.11.0.tgz#79cb184bac3c05bfe181ddc306bac100ab1f9493" @@ -2371,7 +3240,7 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-version-checker "^2.1.0" semver "^5.4.1" -ember-cli-babel@^6.7.2: +ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.12.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.7.2: version "6.16.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.16.0.tgz#623b4a2764ece72b65f1572fc8aeb5714a450228" dependencies: @@ -2399,6 +3268,16 @@ ember-cli-broccoli-sane-watcher@^2.0.4: rsvp "^3.0.18" sane "^1.1.1" +ember-cli-clipboard@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/ember-cli-clipboard/-/ember-cli-clipboard-0.8.1.tgz#59f8eb6ba471a7668dff592fcebb7b06014240dd" + dependencies: + broccoli-funnel "^1.1.0" + clipboard "^1.7.1" + ember-cli-babel "^6.8.0" + ember-cli-htmlbars "^2.0.2" + fastboot-transform "0.1.1" + ember-cli-dependency-checker@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-2.1.0.tgz#9d66286a7c778e94733eaf21320d129c4fd0dd64" @@ -2408,6 +3287,57 @@ ember-cli-dependency-checker@^2.0.0: resolve "^1.5.0" semver "^5.3.0" +ember-cli-deploy-build@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ember-cli-deploy-build/-/ember-cli-deploy-build-1.1.1.tgz#de515b04536a569f42626ef28aea139f32ef00e8" + dependencies: + chalk "^1.0.0" + ember-cli-deploy-plugin "^0.2.1" + glob "^7.1.1" + rsvp "^3.5.0" + +ember-cli-deploy-git-ci@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ember-cli-deploy-git-ci/-/ember-cli-deploy-git-ci-1.0.1.tgz#846b046f82196538cc6eea2aa5d410c9111f76f4" + dependencies: + ember-cli-deploy-plugin "^0.2.9" + execa "^0.7.0" + fs-extra "^4.0.0" + +ember-cli-deploy-git@^1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/ember-cli-deploy-git/-/ember-cli-deploy-git-1.3.3.tgz#7fdd035ad93af4016d1eecbc0a5bac35ae7da60f" + dependencies: + ember-cli-babel "^6.11.0" + ember-cli-deploy-plugin "^0.2.9" + fs-extra "^5.0.0" + rsvp "^4.8.1" + +ember-cli-deploy-plugin@^0.2.1, ember-cli-deploy-plugin@^0.2.9: + version "0.2.9" + resolved "https://registry.yarnpkg.com/ember-cli-deploy-plugin/-/ember-cli-deploy-plugin-0.2.9.tgz#a3d395b8adad7ef68d8bacdd0b0f4a61bcf9e651" + dependencies: + chalk "^1.0.0" + core-object "2.0.6" + lodash.clonedeep "^4.5.0" + +ember-cli-deploy-progress@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ember-cli-deploy-progress/-/ember-cli-deploy-progress-1.3.0.tgz#18663deed25b4d5397476332f25eed3c3fdf225a" + +ember-cli-deploy@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ember-cli-deploy/-/ember-cli-deploy-1.0.2.tgz#9ab39188c882b57937418db5b3da6fc65b16b916" + dependencies: + chalk "^1.1.3" + core-object "^2.0.0" + dag-map "^2.0.1" + dotenv "^1.2.0" + ember-cli-deploy-progress "^1.3.0" + lodash "^4.0.0" + rsvp "^3.3.3" + silent-error "^1.0.0" + ember-cli-eslint@^4.2.1: version "4.2.3" resolved "https://registry.yarnpkg.com/ember-cli-eslint/-/ember-cli-eslint-4.2.3.tgz#2844d3f5e8184f19b2d7132ba99eb0b370b55598" @@ -2438,6 +3368,15 @@ ember-cli-fastboot@^1.1.4-beta.1: md5-hex "^2.0.0" silent-error "^1.0.0" +ember-cli-favicon@^1.0.0-beta.4: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-favicon/-/ember-cli-favicon-1.0.0.tgz#2f6781e939acf33b368841645e076bfd77061c34" + dependencies: + broccoli-favicon "1.0.0" + broccoli-merge-trees "^2.0.0" + broccoli-replace "^0.12.0" + ember-cli-babel "^6.8.2" + ember-cli-get-component-path-option@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-get-component-path-option/-/ember-cli-get-component-path-option-1.0.0.tgz#0d7b595559e2f9050abed804f1d8eff1b08bc771" @@ -2456,6 +3395,16 @@ ember-cli-htmlbars-inline-precompile@^1.0.0: heimdalljs-logger "^0.1.7" silent-error "^1.1.0" +ember-cli-htmlbars-inline-precompile@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-1.0.3.tgz#332ff96c06fc522965162f1090d78a615379c3c2" + dependencies: + babel-plugin-htmlbars-inline-precompile "^0.2.5" + ember-cli-version-checker "^2.1.2" + hash-for-dep "^1.2.3" + heimdalljs-logger "^0.1.9" + silent-error "^1.1.0" + ember-cli-htmlbars@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.3.tgz#e116e1500dba12f29c94b05b9ec90f52cb8bb042" @@ -2465,6 +3414,15 @@ ember-cli-htmlbars@^2.0.1: json-stable-stringify "^1.0.0" strip-bom "^3.0.0" +ember-cli-htmlbars@^2.0.2, ember-cli-htmlbars@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.4.tgz#0bcda483f14271663c38756e1fd1cb89da6a50cf" + dependencies: + broccoli-persistent-filter "^1.4.3" + hash-for-dep "^1.2.3" + json-stable-stringify "^1.0.0" + strip-bom "^3.0.0" + ember-cli-inject-live-reload@^1.4.1: version "1.7.0" resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-1.7.0.tgz#af94336e015336127dfb98080ad442bb233e37ed" @@ -2514,6 +3472,17 @@ ember-cli-node-assets@^0.1.4: lodash "^4.5.1" resolve "^1.1.7" +ember-cli-node-assets@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/ember-cli-node-assets/-/ember-cli-node-assets-0.2.2.tgz#d2d55626e7cc6619f882d7fe55751f9266022708" + dependencies: + broccoli-funnel "^1.0.1" + broccoli-merge-trees "^1.1.1" + broccoli-source "^1.1.0" + debug "^2.2.0" + lodash "^4.5.1" + resolve "^1.1.7" + ember-cli-normalize-entity-name@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-normalize-entity-name/-/ember-cli-normalize-entity-name-1.0.0.tgz#0b14f7bcbc599aa117b5fddc81e4fd03c4bad5b7" @@ -2558,6 +3527,15 @@ ember-cli-release@^0.2.9: semver "^4.3.1" silent-error "^1.0.0" +ember-cli-sass@7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/ember-cli-sass/-/ember-cli-sass-7.1.3.tgz#d4a418d68bb513c40270b88576bd2cf07301fdf2" + dependencies: + broccoli-funnel "^1.0.0" + broccoli-merge-trees "^1.1.0" + broccoli-sass-source-maps "^2.1.0" + ember-cli-version-checker "^1.0.2" + ember-cli-shims@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/ember-cli-shims/-/ember-cli-shims-1.2.0.tgz#0f53aff0aab80b5f29da3a9731bac56169dd941f" @@ -2574,13 +3552,38 @@ ember-cli-sri@^2.1.0: dependencies: broccoli-sri-hash "^2.1.0" +ember-cli-string-helpers@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/ember-cli-string-helpers/-/ember-cli-string-helpers-1.9.0.tgz#2c1605bc5768ff58cecd2fa1bd0d13d81e47f3d3" + dependencies: + broccoli-funnel "^1.0.1" + ember-cli-babel "^6.6.0" + ember-cli-string-utils@^1.0.0, ember-cli-string-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz#39b677fc2805f55173735376fcef278eaa4452a1" -ember-cli-test-info@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ember-cli-test-info/-/ember-cli-test-info-1.0.0.tgz#ed4e960f249e97523cf891e4aed2072ce84577b4" +ember-cli-tailwind@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/ember-cli-tailwind/-/ember-cli-tailwind-0.4.1.tgz#1d453a23ffdfe47072f0b927c88d33e8db89fa80" + dependencies: + broccoli-plugin "^1.3.0" + broccoli-rollup "^2.0.0" + ember-cli-babel "^6.6.0" + ember-cli-clipboard "^0.8.1" + ember-cli-htmlbars "^2.0.1" + ember-cli-string-utils "^1.1.0" + ember-composable-helpers "^2.1.0" + ember-truth-helpers "^2.0.0" + fs-extra "^5.0.0" + jsdom "^11.6.2" + postcss "^6.0.20" + postcss-easy-import "^3.0.0" + tailwindcss "^0.4.1" + +ember-cli-test-info@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-test-info/-/ember-cli-test-info-1.0.0.tgz#ed4e960f249e97523cf891e4aed2072ce84577b4" dependencies: ember-cli-string-utils "^1.0.0" @@ -2603,7 +3606,7 @@ ember-cli-valid-component-name@^1.0.0: dependencies: silent-error "^1.0.0" -ember-cli-version-checker@^1.1.4: +ember-cli-version-checker@^1.0.2, ember-cli-version-checker@^1.1.4: version "1.3.1" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz#0bc2d134c830142da64bf9627a0eded10b61ae72" dependencies: @@ -2712,6 +3715,93 @@ ember-cli@~2.18.2: walk-sync "^0.3.0" yam "0.0.22" +ember-code-snippet@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/ember-code-snippet/-/ember-code-snippet-2.2.2.tgz#2327e105c9101cb02437873c70297bcb365e474a" + dependencies: + broccoli-flatiron "^0.1.3" + broccoli-merge-trees "^1.0.0" + broccoli-static-compiler "^0.1.4" + broccoli-writer "^0.1.1" + es6-promise "^1.0.0" + glob "^4.0.4" + +ember-component-css@^0.3.5: + version "0.3.7" + resolved "https://registry.yarnpkg.com/ember-component-css/-/ember-component-css-0.3.7.tgz#bde1a8db53116cca1a134aaf6379b2b259b79799" + dependencies: + broccoli-concat "^3.2.2" + broccoli-funnel "^2.0.1" + broccoli-merge-trees "^2.0.0" + broccoli-persistent-filter "^1.4.2" + broccoli-plugin "^1.3.0" + broccoli-style-manifest "^1.4.0" + ember-cli-babel "^6.6.0" + ember-getowner-polyfill "^2.0.1" + fs-tree-diff "^0.5.6" + md5 "^2.2.1" + postcss "^6.0.8" + postcss-less "^1.1.0" + postcss-scss "^1.0.2" + postcss-selector-namespace "^1.4.1" + rsvp "^4.0.1" + walk-sync "^0.3.2" + +ember-composable-helpers@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-2.1.0.tgz#71f75ab2de1c696d21939b5f9dcc62eaf2c947e5" + dependencies: + broccoli-funnel "^1.0.1" + ember-cli-babel "^6.6.0" + +ember-concurrency@^0.8.16: + version "0.8.19" + resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-0.8.19.tgz#71b9c175ba077865310029cb4bdb880e17d5155e" + dependencies: + babel-core "^6.24.1" + ember-cli-babel "^6.8.2" + ember-maybe-import-regenerator "^0.1.5" + +ember-copy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-copy/-/ember-copy-1.0.0.tgz#426554ba6cf65920f31d24d0a3ca2cb1be16e4aa" + dependencies: + ember-cli-babel "^6.6.0" + +ember-data@^2.18.0: + version "2.18.4" + resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-2.18.4.tgz#fa4162666769b930c0cc1ee6564dade3dba8d690" + dependencies: + amd-name-resolver "0.0.7" + babel-plugin-ember-modules-api-polyfill "^1.4.2" + babel-plugin-feature-flags "^0.3.1" + babel-plugin-filter-imports "^0.3.1" + babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel6-plugin-strip-class-callcheck "^6.0.0" + babel6-plugin-strip-heimdall "^6.0.1" + broccoli-babel-transpiler "^6.0.0" + broccoli-debug "^0.6.2" + broccoli-file-creator "^1.0.0" + broccoli-funnel "^1.2.0" + broccoli-merge-trees "^2.0.0" + broccoli-rollup "^1.2.0" + calculate-cache-key-for-tree "^1.1.0" + chalk "^1.1.1" + ember-cli-babel "^6.8.2" + ember-cli-path-utils "^1.0.0" + ember-cli-string-utils "^1.0.0" + ember-cli-test-info "^1.0.0" + ember-cli-version-checker "^2.1.0" + ember-inflector "^2.0.0" + ember-runtime-enumerable-includes-polyfill "^2.0.0" + exists-sync "0.0.3" + git-repo-info "^1.1.2" + heimdalljs "^0.3.0" + inflection "^1.8.0" + npm-git-info "^1.0.0" + semver "^5.1.0" + silent-error "^1.0.0" + ember-data@~2.13.0: version "2.13.2" resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-2.13.2.tgz#151c93ad5152885d4ca50b1942d7c66e15865c74" @@ -2750,6 +3840,12 @@ ember-export-application-global@^2.0.0: dependencies: ember-cli-babel "^6.0.0-beta.7" +ember-factory-for-polyfill@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/ember-factory-for-polyfill/-/ember-factory-for-polyfill-1.3.1.tgz#b446ed64916d293c847a4955240eb2c993b86eae" + dependencies: + ember-cli-version-checker "^2.1.0" + ember-fastboot-addon-tests@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/ember-fastboot-addon-tests/-/ember-fastboot-addon-tests-0.4.0.tgz#05f89f2cc4bd53d6abd6d952bbdde7c8af03a6f7" @@ -2767,6 +3863,25 @@ ember-fastboot-addon-tests@^0.4.0: request "^2.74.0" rsvp "^3.3.1" +ember-fetch-adapter@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/ember-fetch-adapter/-/ember-fetch-adapter-0.4.3.tgz#c3d2da83ff87f829ab347b841a3201b3cc7e1eb4" + dependencies: + ember-cli-babel "^6.12.0" + +ember-fetch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-4.0.2.tgz#865ca90d8aa63b9ebe5bce709aeaa44b35668b5a" + dependencies: + abortcontroller-polyfill "^1.1.9" + broccoli-concat "^3.2.2" + broccoli-merge-trees "^2.0.0" + broccoli-stew "^1.4.2" + broccoli-templater "^1.0.0" + ember-cli-babel "^6.8.2" + node-fetch "^2.0.0-alpha.9" + yetch "^0.0.1" + ember-get-config@^0.2.2: version "0.2.4" resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.2.4.tgz#118492a2a03d73e46004ed777928942021fe1ecd" @@ -2774,12 +3889,45 @@ ember-get-config@^0.2.2: broccoli-file-creator "^1.1.1" ember-cli-babel "^6.3.0" +ember-getowner-polyfill@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ember-getowner-polyfill/-/ember-getowner-polyfill-2.2.0.tgz#38e7dccbcac69d5ec694000329ec0b2be651d2b2" + dependencies: + ember-cli-version-checker "^2.1.0" + ember-factory-for-polyfill "^1.3.1" + +ember-hash-helper-polyfill@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ember-hash-helper-polyfill/-/ember-hash-helper-polyfill-0.2.1.tgz#73b074d8e2f7183d2e68c3df77e951097afa907c" + dependencies: + ember-cli-babel "^6.8.2" + ember-cli-version-checker "^2.1.0" + +ember-href-to@^1.15.1: + version "1.15.1" + resolved "https://registry.yarnpkg.com/ember-href-to/-/ember-href-to-1.15.1.tgz#1ba20ec201245c7cae7e2aa3eec50eb2aa25b729" + dependencies: + ember-cli-babel "^6.8.2" + ember-router-service-polyfill "^1.0.2" + +ember-ignore-children-helper@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ember-ignore-children-helper/-/ember-ignore-children-helper-1.0.1.tgz#f7c4aa17afb9c5685e1d4dcdb61c7b138ca7cdc3" + dependencies: + ember-cli-babel "^6.8.2" + ember-inflector@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-2.1.0.tgz#afcb92d022a4eab58f08ff4578eafc3a1de2d09b" dependencies: ember-cli-babel "^6.0.0" +ember-keyboard@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/ember-keyboard/-/ember-keyboard-3.0.2.tgz#839ab5c32a6b3d3ce0b735728c1e1bc362107464" + dependencies: + ember-cli-babel "^6.6.0" + ember-load-initializers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-1.0.0.tgz#4919eaf06f6dfeca7e134633d8c05a6c9921e6e7" @@ -2797,6 +3945,25 @@ ember-lodash@^4.17.3: ember-cli-babel "^6.10.0" lodash-es "^4.17.4" +ember-maybe-import-regenerator@^0.1.5: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ember-maybe-import-regenerator/-/ember-maybe-import-regenerator-0.1.6.tgz#35d41828afa6d6a59bc0da3ce47f34c573d776ca" + dependencies: + broccoli-funnel "^1.0.1" + broccoli-merge-trees "^1.0.0" + ember-cli-babel "^6.0.0-beta.4" + regenerator-runtime "^0.9.5" + +ember-modal-dialog@2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/ember-modal-dialog/-/ember-modal-dialog-2.4.3.tgz#8e254185e95dae6ccf46987822a095acf42561b1" + dependencies: + ember-cli-babel "^6.8.2" + ember-cli-htmlbars "^2.0.1" + ember-cli-version-checker "^2.1.0" + ember-ignore-children-helper "^1.0.0" + ember-wormhole "^0.5.1" + ember-qunit@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-3.3.1.tgz#8d68ef30cfd6f2acbf1d0f4e368439642e726903" @@ -2821,7 +3988,13 @@ ember-resolver@^4.0.0: ember-cli-version-checker "^2.0.0" resolve "^1.3.3" -ember-rfc176-data@^0.2.7: +ember-responsive@^3.0.0-beta.1: + version "3.0.0-beta.3" + resolved "https://registry.yarnpkg.com/ember-responsive/-/ember-responsive-3.0.0-beta.3.tgz#63f4f5cad179399e40cd6a591bb2677c4cc0a874" + dependencies: + ember-cli-babel "^6.6.0" + +ember-rfc176-data@^0.2.0, ember-rfc176-data@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.2.7.tgz#bd355bc9b473e08096b518784170a23388bc973b" @@ -2835,6 +4008,20 @@ ember-router-generator@^1.0.0, ember-router-generator@^1.2.2, ember-router-gener dependencies: recast "^0.11.3" +ember-router-scroll@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ember-router-scroll/-/ember-router-scroll-0.7.1.tgz#0fc4b9be116ef97ce974938104cc766f4e56a127" + dependencies: + ember-app-scheduler "^1.0.1" + ember-cli-babel "^6.6.0" + ember-getowner-polyfill "^2.0.1" + +ember-router-service-polyfill@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ember-router-service-polyfill/-/ember-router-service-polyfill-1.0.3.tgz#506d7fbd7179951410b7ffe8db171540601d88b1" + dependencies: + ember-cli-babel "^6.8.2" + ember-runtime-enumerable-includes-polyfill@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-runtime-enumerable-includes-polyfill/-/ember-runtime-enumerable-includes-polyfill-2.1.0.tgz#dc6d4a028471e4acc350dfd2a149874fb20913f5" @@ -2861,6 +4048,37 @@ ember-source@~2.18.0: jquery "^3.2.1" resolve "^1.3.3" +ember-svg-jar@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ember-svg-jar/-/ember-svg-jar-1.2.1.tgz#a6f2c2404eec72aaa819b66407cec0ebe72be99b" + dependencies: + broccoli-caching-writer "^3.0.3" + broccoli-funnel "^2.0.1" + broccoli-merge-trees "^2.0.0" + broccoli-string-replace "^0.1.2" + broccoli-svg-optimizer "1.1.0" + broccoli-symbolizer "^0.6.0" + cheerio "^0.22.0" + ember-cli-babel "^6.6.0" + ember-copy "^1.0.0" + lodash "^4.13.1" + mkdirp "^0.5.1" + path-posix "^1.0.0" + +ember-tether@^1.0.0-beta.2: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-tether/-/ember-tether-1.0.0.tgz#6117ea7351927887cb74fa5d46097dd300280c2d" + dependencies: + ember-cli-babel "^6.6.0" + ember-cli-node-assets "^0.2.2" + tether "^1.4.0" + +ember-truth-helpers@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ember-truth-helpers/-/ember-truth-helpers-2.1.0.tgz#d4dab4eee7945aa2388126485977baeb33ca0798" + dependencies: + ember-cli-babel "^6.6.0" + ember-try-config@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ember-try-config/-/ember-try-config-2.2.0.tgz#6be0af6c71949813e02ac793564fddbf8336b807" @@ -2887,7 +4105,14 @@ ember-try@^0.2.15: rsvp "^3.0.17" semver "^5.1.0" -encodeurl@~1.0.1: +ember-wormhole@^0.5.1: + version "0.5.4" + resolved "https://registry.yarnpkg.com/ember-wormhole/-/ember-wormhole-0.5.4.tgz#968e80f093494f4aed266e750afa63919c61383d" + dependencies: + ember-cli-babel "^6.10.0" + ember-cli-htmlbars "^2.0.1" + +encodeurl@~1.0.1, encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -2940,7 +4165,11 @@ ensure-posix-path@^1.0.0, ensure-posix-path@^1.0.1, ensure-posix-path@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.0.2.tgz#a65b3e42d0b71cfc585eb774f9943c8d9b91b0c2" -entities@~1.1.1: +entities@1.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" + +entities@^1.1.1, entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" @@ -2957,7 +4186,63 @@ error@^7.0.0: string-template "~0.2.1" xtend "~4.0.0" -escape-html@~1.0.3: +es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.46" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572" + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.1" + next-tick "1" + +es6-iterator@~2.0.1, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-map@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-set "~0.1.5" + es6-symbol "~3.1.1" + event-emitter "~0.3.5" + +es6-promise@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-1.0.0.tgz#f90d3629faa7c26166ae4df77c89bacdeb8dca7f" + +es6-promise@^3.0.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + +es6-promise@^4.0.3: + version "4.2.4" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" + +es6-set@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-symbol "3.1.1" + event-emitter "~0.3.5" + +es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + dependencies: + d "1" + es5-ext "~0.10.14" + +escape-html@1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -2987,6 +4272,30 @@ escodegen@^1.9.1: optionalDependencies: source-map "~0.6.1" +esdoc-accessor-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-accessor-plugin/-/esdoc-accessor-plugin-1.0.0.tgz#791ba4872e6c403515ce749b1348d6f0293ad9eb" + +esdoc-ecmascript-proposal-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-ecmascript-proposal-plugin/-/esdoc-ecmascript-proposal-plugin-1.0.0.tgz#390dc5656ba8a2830e39dba3570d79138df2ffd9" + +esdoc@pzuraq/esdoc#015a342: + version "1.0.4" + resolved "https://codeload.github.com/pzuraq/esdoc/tar.gz/015a3426b2e53b2b0270a9c00133780db3f1d144" + dependencies: + babel-generator "6.26.0" + babel-traverse "6.26.0" + babylon "6.18.0" + cheerio "0.22.0" + color-logger "0.0.3" + escape-html "1.0.3" + fs-extra "1.0.0" + ice-cap "0.0.4" + marked "0.3.6" + minimist "1.2.0" + taffydb "2.7.2" + eslint-plugin-ember-suave@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-plugin-ember-suave/-/eslint-plugin-ember-suave-1.0.0.tgz#ea7d232a126562dcd8b1ee3aa2700ac3b626e514" @@ -3070,6 +4379,10 @@ espree@^3.5.2: acorn "^5.4.0" acorn-jsx "^3.0.0" +esprima@^2.6.0: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + esprima@^3.1.3, esprima@~3.1.0: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" @@ -3099,6 +4412,10 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" +estree-walker@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.2.tgz#d3850be7529c9580d815600b53126515e146dd39" + esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -3107,6 +4424,25 @@ etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" +event-emitter@~0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + dependencies: + d "1" + es5-ext "~0.10.14" + +event-stream@~3.3.0: + version "3.3.4" + resolved "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + eventemitter3@1.x.x: version "1.2.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" @@ -3129,6 +4465,18 @@ exec-sh@^0.2.0: dependencies: merge "^1.1.3" +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + execa@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" @@ -3153,6 +4501,10 @@ execa@^0.9.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +exif-parser@^0.1.9: + version "0.1.12" + resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922" + exists-stat@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/exists-stat/-/exists-stat-1.0.0.tgz#0660e3525a2e89d9e446129440c272edfa24b529" @@ -3244,13 +4596,48 @@ express@^4.10.7, express@^4.12.3: utils-merge "1.0.1" vary "~1.1.2" +express@^4.13.1: + version "4.16.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" + dependencies: + accepts "~1.3.5" + array-flatten "1.1.1" + body-parser "1.18.2" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.1" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.3" + qs "6.5.1" + range-parser "~1.2.0" + safe-buffer "5.1.1" + send "0.16.2" + serve-static "1.13.2" + setprototypeof "1.1.0" + statuses "~1.4.0" + type-is "~1.6.16" + utils-merge "1.0.1" + vary "~1.1.2" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" dependencies: is-extendable "^0.1.0" -extend-shallow@^3.0.0: +extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" dependencies: @@ -3261,6 +4648,10 @@ extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + external-editor@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-1.1.1.tgz#12d7b0db850f7ff7e7081baf4005700060c4600b" @@ -3283,7 +4674,7 @@ extglob@^0.3.1: dependencies: is-extglob "^1.0.0" -extglob@^2.0.2: +extglob@^2.0.2, extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" dependencies: @@ -3296,6 +4687,15 @@ extglob@^2.0.2: snapdragon "^0.8.1" to-regex "^3.0.1" +extract-zip@^1.6.5: + version "1.6.7" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" + dependencies: + concat-stream "1.6.2" + debug "2.6.9" + mkdirp "0.5.1" + yauzl "2.4.1" + extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -3352,6 +4752,12 @@ fastboot-express-middleware@^1.1.0: fastboot "^1.2.0" request "^2.81.0" +fastboot-transform@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/fastboot-transform/-/fastboot-transform-0.1.1.tgz#de55550d85644ec94cb11264c2ba883e3ea3b255" + dependencies: + broccoli-stew "^1.5.0" + fastboot-transform@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/fastboot-transform/-/fastboot-transform-0.1.3.tgz#7dea0b117594afd8772baa6c9b0919644e7f7dcd" @@ -3372,6 +4778,29 @@ fastboot@^1.1.4-beta.1, fastboot@^1.2.0: simple-dom "^1.0.0" source-map-support "^0.5.0" +favicons@^4.7.1: + version "4.8.6" + resolved "https://registry.yarnpkg.com/favicons/-/favicons-4.8.6.tgz#a2b13800ab3fec2715bc8f27fa841d038d4761e2" + dependencies: + async "^1.5.0" + cheerio "^0.19.0" + clone "^1.0.2" + colors "^1.1.2" + harmony-reflect "^1.4.2" + image-size "^0.4.0" + jimp "^0.2.13" + jsontoxml "0.0.11" + merge-defaults "^0.2.1" + mkdirp "^0.5.1" + node-rest-client "^1.5.1" + require-directory "^2.1.1" + svg2png "~3.0.1" + through2 "^2.0.0" + tinycolor2 "^1.1.2" + to-ico "^1.1.2" + underscore "^1.8.3" + vinyl "^1.1.0" + faye-websocket@~0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" @@ -3384,6 +4813,12 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" +fd-slicer@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + dependencies: + pend "~1.2.0" + figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -3397,6 +4832,10 @@ file-entry-cache@^2.0.0: flat-cache "^1.2.1" object-assign "^4.0.1" +file-type@^3.1.0, file-type@^3.8.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" + filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" @@ -3436,6 +4875,18 @@ finalhandler@1.1.0: statuses "~1.3.1" unpipe "~1.0.0" +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.4.0" + unpipe "~1.0.0" + find-index@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-index/-/find-index-1.1.0.tgz#53007c79cd30040d6816d79458e8837d5c5705ef" @@ -3506,6 +4957,12 @@ flat-cache@^1.2.1: graceful-fs "^4.1.2" write "^0.2.1" +for-each@^0.3.2: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + dependencies: + is-callable "^1.1.3" + for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -3516,10 +4973,22 @@ for-own@^0.1.4: dependencies: for-in "^1.0.1" +forever-agent@~0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.5.2.tgz#6d0e09c4921f94a27f63d3b49c5feff1ea4c5130" + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" +form-data@~0.1.0: + version "0.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-0.1.4.tgz#91abd788aba9702b1aabfa8bc01031a2ac9e3b12" + dependencies: + async "~0.9.0" + combined-stream "~0.0.4" + mime "~1.2.11" + form-data@~2.1.1: version "2.1.4" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" @@ -3536,6 +5005,14 @@ form-data@~2.3.1: combined-stream "^1.0.5" mime-types "^2.1.12" +form-data@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + dependencies: + asynckit "^0.4.0" + combined-stream "1.0.6" + mime-types "^2.1.12" + forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" @@ -3550,10 +5027,29 @@ fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" +from2@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +from@~0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + fs-exists-sync@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" +fs-extra@1.0.0, fs-extra@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + fs-extra@^0.24.0: version "0.24.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.24.0.tgz#d4e4342a96675cb7846633a6099249332b539952" @@ -3583,14 +5079,6 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - fs-extra@^2.0.0: version "2.1.2" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz#046c70163cef9aad46b0e4a7fa467fb22d71de35" @@ -3614,9 +5102,31 @@ fs-extra@^4.0.0, fs-extra@^4.0.2: jsonfile "^4.0.0" universalify "^0.1.0" -fs-promise@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/fs-promise/-/fs-promise-2.0.3.tgz#f64e4f854bcf689aa8bddcba268916db3db46854" +fs-extra@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.0.tgz#8cc3f47ce07ef7b3593a11b9fb245f7e34c041d6" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + dependencies: + minipass "^2.2.1" + +fs-promise@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fs-promise/-/fs-promise-2.0.3.tgz#f64e4f854bcf689aa8bddcba268916db3db46854" dependencies: any-promise "^1.3.0" fs-extra "^2.0.0" @@ -3643,6 +5153,13 @@ fsevents@^1.0.0, fsevents@^1.1.1: nan "^2.3.0" node-pre-gyp "^0.6.39" +fsevents@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + fstream-ignore@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" @@ -3664,6 +5181,10 @@ functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" +gather-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gather-stream/-/gather-stream-1.0.0.tgz#b33994af457a8115700d410f317733cbe7a0904b" + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -3677,10 +5198,20 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +gaze@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + dependencies: + globule "^1.0.0" + get-caller-file@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + get-func-name@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" @@ -3689,6 +5220,13 @@ get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" +get-stream@^2.0.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -3703,6 +5241,14 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +git-config-path@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/git-config-path/-/git-config-path-1.0.1.tgz#6d33f7ed63db0d0e118131503bab3aca47d54664" + dependencies: + extend-shallow "^2.0.1" + fs-exists-sync "^0.1.0" + homedir-polyfill "^1.0.0" + git-repo-info@^1.1.2, git-repo-info@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-1.4.1.tgz#2a072823254aaf62fcf0766007d7b6651bd41943" @@ -3736,6 +5282,13 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + glob@7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" @@ -3747,6 +5300,15 @@ glob@7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^4.0.4: + version "4.5.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "^2.0.1" + once "^1.3.0" + glob@^5.0.10: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" @@ -3757,7 +5319,17 @@ glob@^5.0.10: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.3, glob@^7.0.4, glob@^7.0.5, glob@^7.1.2: +glob@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.0.4, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: @@ -3768,6 +5340,12 @@ glob@^7.0.3, glob@^7.0.4, glob@^7.0.5, glob@^7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" +global-dirs@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + dependencies: + ini "^1.3.4" + global-modules@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" @@ -3802,6 +5380,13 @@ global-prefix@^1.0.1: is-windows "^1.0.1" which "^1.2.14" +global@~4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" + dependencies: + min-document "^2.19.0" + process "~0.5.1" + globals@^11.0.1: version "11.3.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.3.0.tgz#e04fdb7b9796d8adac9c8f64c14837b2313378b0" @@ -3825,6 +5410,46 @@ globby@^5.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globule@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" + dependencies: + glob "~7.1.1" + lodash "~4.17.10" + minimatch "~3.0.2" + +good-listener@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" + dependencies: + delegate "^3.1.2" + +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -3841,7 +5466,7 @@ growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" -handlebars@^4.0.4: +handlebars@^4.0.4, handlebars@^4.0.6: version "4.0.11" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" dependencies: @@ -3873,6 +5498,17 @@ har-validator@~5.0.3: ajv "^5.1.0" har-schema "^2.0.0" +har-validator@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29" + dependencies: + ajv "^5.3.0" + har-schema "^2.0.0" + +harmony-reflect@^1.4.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.0.tgz#9c28a77386ec225f7b5d370f9861ba09c4eea58f" + has-ansi@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" @@ -3953,6 +5589,22 @@ hash-for-dep@^1.0.2, hash-for-dep@^1.2.3: heimdalljs-logger "^0.1.7" resolve "^1.4.0" +hasha@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1" + dependencies: + is-stream "^1.0.1" + pinkie-promise "^2.0.0" + +hawk@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-1.1.1.tgz#87cd491f9b46e4e2aeaca335416766885d2d1ed9" + dependencies: + boom "0.4.x" + cryptiles "0.2.x" + hoek "0.9.x" + sntp "0.2.x" + hawk@3.1.3, hawk@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" @@ -3993,18 +5645,39 @@ heimdalljs-logger@^0.1.7: debug "^2.2.0" heimdalljs "^0.2.0" +heimdalljs-logger@^0.1.9: + version "0.1.10" + resolved "https://registry.yarnpkg.com/heimdalljs-logger/-/heimdalljs-logger-0.1.10.tgz#90cad58aabb1590a3c7e640ddc6a4cd3a43faaf7" + dependencies: + debug "^2.2.0" + heimdalljs "^0.2.6" + heimdalljs@^0.2.0, heimdalljs@^0.2.1, heimdalljs@^0.2.3: version "0.2.5" resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.2.5.tgz#6aa54308eee793b642cff9cf94781445f37730ac" dependencies: rsvp "~3.2.1" +heimdalljs@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.2.6.tgz#b0eebabc412813aeb9542f9cc622cb58dbdcd9fe" + dependencies: + rsvp "~3.2.1" + heimdalljs@^0.3.0: version "0.3.3" resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.3.3.tgz#e92d2c6f77fd46d5bf50b610d28ad31755054d0b" dependencies: rsvp "~3.2.1" +highlightjs@^9.10.0: + version "9.10.0" + resolved "https://registry.yarnpkg.com/highlightjs/-/highlightjs-9.10.0.tgz#fca9b78ddaa3b1abca89d6c3ee105ad270a80190" + +hoek@0.9.x: + version "0.9.1" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-0.9.1.tgz#3d322462badf07716ea7eb85baf88079cddce505" + hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" @@ -4036,6 +5709,31 @@ html-encoding-sniffer@^1.0.1, html-encoding-sniffer@^1.0.2: dependencies: whatwg-encoding "^1.0.1" +html-entities@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + +htmlparser2@^3.9.1: + version "3.9.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" + dependencies: + domelementtype "^1.3.0" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^2.0.2" + +htmlparser2@~3.8.1: + version "3.8.3" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068" + dependencies: + domelementtype "1" + domhandler "2.3" + domutils "1.5" + entities "1.0" + readable-stream "1.1" + http-errors@1.6.2, http-errors@~1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" @@ -4056,6 +5754,14 @@ http-proxy@^1.13.1, http-proxy@^1.9.0: eventemitter3 "1.x.x" requires-port "1.x.x" +http-signature@~0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-0.10.1.tgz#4fbdac132559aa8323121e540779c0a012b27e66" + dependencies: + asn1 "0.1.11" + assert-plus "^0.1.5" + ctype "0.5.3" + http-signature@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" @@ -4072,18 +5778,61 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +ice-cap@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/ice-cap/-/ice-cap-0.0.4.tgz#8a6d31ab4cac8d4b56de4fa946df3352561b6e18" + dependencies: + cheerio "0.20.0" + color-logger "0.0.3" + iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@~0.4.13: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" +iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + dependencies: + minimatch "^3.0.4" + ignore@^3.3.3, ignore@^3.3.6: version "3.3.7" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" +image-size@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.4.0.tgz#d4b4e1f61952e4cbc1cea9a6b0c915fecb707510" + +image-size@^0.5.0: + version "0.5.5" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" +in-publish@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" + +include-path-searcher@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/include-path-searcher/-/include-path-searcher-0.1.0.tgz#c0cf2ddfa164fb2eae07bc7ca43a7f191cb4d7bd" + indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" @@ -4094,6 +5843,10 @@ indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" +inflected@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inflected/-/inflected-2.0.4.tgz#323770961ccbe992a98ea930512e9a82d3d3ef77" + inflection@^1.12.0, inflection@^1.7.0, inflection@^1.7.1, inflection@^1.8.0: version "1.12.0" resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" @@ -4161,6 +5914,13 @@ inquirer@^3.0.6: strip-ansi "^4.0.0" through "^2.3.6" +into-stream@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" + dependencies: + from2 "^2.1.1" + p-is-promise "^1.1.0" + invariant@^2.2.0: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -4173,10 +5933,22 @@ invariant@^2.2.2: dependencies: loose-envify "^1.0.0" +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +ip-regex@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" + ipaddr.js@1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" +ipaddr.js@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" + is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -4199,7 +5971,7 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" -is-buffer@^1.1.5: +is-buffer@^1.1.5, is-buffer@~1.1.1: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -4209,6 +5981,16 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" +is-callable@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + +is-ci@^1.0.10: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.0.tgz#3f4a08d6303a09882cef3f0fb97439c5f5ce2d53" + dependencies: + ci-info "^1.3.0" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -4229,7 +6011,7 @@ is-descriptor@^0.1.0: is-data-descriptor "^0.1.4" kind-of "^5.0.0" -is-descriptor@^1.0.0: +is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" dependencies: @@ -4261,7 +6043,7 @@ is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" -is-extglob@^2.1.0: +is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -4281,6 +6063,10 @@ is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" +is-function@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" + is-git-url@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-git-url/-/is-git-url-1.0.0.tgz#53f684cd143285b52c3244b4e6f28253527af66b" @@ -4297,6 +6083,23 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" +is-glob@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + dependencies: + is-extglob "^2.1.1" + +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" @@ -4353,11 +6156,25 @@ is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + +is-reference@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.1.0.tgz#50e6ef3f64c361e2c53c0416cdc9420037f2685b" + dependencies: + "@types/estree" "0.0.38" + is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" -is-stream@^1.0.1, is-stream@^1.1.0: +is-retry-allowed@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + +is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -4383,6 +6200,10 @@ is-windows@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.1.tgz#310db70f742d259a16a369202b51af84233310d9" +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -4395,6 +6216,12 @@ isbinaryfile@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" +isemail@3.x.x: + version "3.1.3" + resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.1.3.tgz#64f37fc113579ea12523165c3ebe3a71a56ce571" + dependencies: + punycode "2.x.x" + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -4421,6 +6248,43 @@ istextorbinary@2.1.0: editions "^1.1.1" textextensions "1 || 2" +jimp@^0.2.13, jimp@^0.2.21: + version "0.2.28" + resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.2.28.tgz#dd529a937190f42957a7937d1acc3a7762996ea2" + dependencies: + bignumber.js "^2.1.0" + bmp-js "0.0.3" + es6-promise "^3.0.2" + exif-parser "^0.1.9" + file-type "^3.1.0" + jpeg-js "^0.2.0" + load-bmfont "^1.2.3" + mime "^1.3.4" + mkdirp "0.5.1" + pixelmatch "^4.0.0" + pngjs "^3.0.0" + read-chunk "^1.0.1" + request "^2.65.0" + stream-to-buffer "^0.1.0" + tinycolor2 "^1.1.2" + url-regex "^3.0.0" + +joi@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-12.0.0.tgz#46f55e68f4d9628f01bbb695902c8b307ad8d33a" + dependencies: + hoek "4.x.x" + isemail "3.x.x" + topo "2.x.x" + +jpeg-js@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.1.2.tgz#135b992c0575c985cfa0f494a3227ed238583ece" + +jpeg-js@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.2.0.tgz#53e448ec9d263e683266467e9442d2c5a2ef5482" + jquery-deferred@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/jquery-deferred/-/jquery-deferred-0.3.1.tgz#596eca1caaff54f61b110962b23cafea74c35355" @@ -4429,6 +6293,10 @@ jquery@^3.1.0, jquery@^3.2.1: version "3.3.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" +js-base64@^2.1.8, js-base64@^2.1.9: + version "2.4.8" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.8.tgz#57a9b130888f956834aa40c5b165ba59c758f033" + js-reporters@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/js-reporters/-/js-reporters-1.2.1.tgz#f88c608e324a3373a95bcc45ad305e5c979c459b" @@ -4444,11 +6312,25 @@ js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.6.1, js-yaml@^3.9.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^3.3.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@~3.6.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" + dependencies: + argparse "^1.0.7" + esprima "^2.6.0" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" -jsdom@^11.12.0: +jsdom@^11.11.0, jsdom@^11.12.0, jsdom@^11.6.2: version "11.12.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" dependencies: @@ -4479,6 +6361,26 @@ jsdom@^11.12.0: ws "^5.2.0" xml-name-validator "^3.0.0" +jsdom@^7.0.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-7.2.2.tgz#40b402770c2bda23469096bee91ab675e3b1fc6e" + dependencies: + abab "^1.0.0" + acorn "^2.4.0" + acorn-globals "^1.0.4" + cssom ">= 0.3.0 < 0.4.0" + cssstyle ">= 0.2.29 < 0.3.0" + escodegen "^1.6.1" + nwmatcher ">= 1.3.7 < 2.0.0" + parse5 "^1.5.1" + request "^2.55.0" + sax "^1.1.4" + symbol-tree ">= 3.1.0 < 4.0.0" + tough-cookie "^2.2.0" + webidl-conversions "^2.0.0" + whatwg-url-compat "~0.6.5" + xml-name-validator ">= 2.0.1 < 3.0.0" + jsdom@^9.5.0: version "9.12.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" @@ -4519,6 +6421,17 @@ jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" +json-api-serializer@^1.11.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/json-api-serializer/-/json-api-serializer-1.13.0.tgz#cab7239736e72abee4658b1c8915edc290f5a9e9" + dependencies: + into-stream "^3.1.0" + joi "^12.0.0" + lodash "^4.5.1" + stream-to-array "^2.3.0" + through2 "^2.0.3" + unique-stream "^2.2.1" + json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" @@ -4537,7 +6450,7 @@ json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: dependencies: jsonify "~0.0.0" -json-stringify-safe@~5.0.1: +json-stringify-safe@~5.0.0, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -4571,6 +6484,10 @@ jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" +jsontoxml@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/jsontoxml/-/jsontoxml-0.0.11.tgz#373ab5b2070be3737a5fb3e32fd1b7b81870caa4" + jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -4580,6 +6497,10 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +kew@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -4606,6 +6527,12 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + dependencies: + package-json "^4.0.0" + lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" @@ -4616,6 +6543,12 @@ lazy-cache@^2.0.2: dependencies: set-getter "^0.1.0" +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + leek@0.0.24: version "0.0.24" resolved "https://registry.yarnpkg.com/leek/-/leek-0.0.24.tgz#e400e57f0e60d8ef2bd4d068dc428a54345dbcda" @@ -4641,10 +6574,44 @@ linkify-it@^2.0.0: dependencies: uc.micro "^1.0.1" +linkify-it@~1.2.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-1.2.4.tgz#0773526c317c8fd13bd534ee1d180ff88abf881a" + dependencies: + uc.micro "^1.0.1" + +liquid-fire@^0.29.1: + version "0.29.5" + resolved "https://registry.yarnpkg.com/liquid-fire/-/liquid-fire-0.29.5.tgz#da8e3158e3f96c34a8cf371b90b8ae941ea8960d" + dependencies: + broccoli-funnel "^1.0.1" + broccoli-merge-trees "^1.0.0" + broccoli-stew "^1.4.2" + ember-cli-babel "^6.6.0" + ember-cli-htmlbars "^2.0.1" + ember-cli-version-checker "^2.0.0" + ember-copy "^1.0.0" + ember-getowner-polyfill "^2.0.1" + ember-hash-helper-polyfill "^0.2.0" + match-media "^0.2.0" + velocity-animate "^1.5.1" + livereload-js@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.3.0.tgz#c3ab22e8aaf5bf3505d80d098cbad67726548c9a" +load-bmfont@^1.2.3: + version "1.3.1" + resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.3.1.tgz#0e7933f66543409882127b0d0fbad7a66d5a7869" + dependencies: + buffer-equal "0.0.1" + mime "^1.3.4" + parse-bmfont-ascii "^1.0.3" + parse-bmfont-binary "^1.0.5" + parse-bmfont-xml "^1.1.4" + xhr "^2.0.1" + xtend "^4.0.0" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -4659,6 +6626,10 @@ loader.js@^4.2.3: version "4.6.0" resolved "https://registry.yarnpkg.com/loader.js/-/loader.js-4.6.0.tgz#b965663ddbe2d80da482454cb865efe496e93e22" +locate-character@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/locate-character/-/locate-character-2.0.5.tgz#f2d2614d49820ecb3c92d80d193b8db755f74c0f" + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -4726,6 +6697,14 @@ lodash._baseflatten@^3.0.0: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" +lodash._basetostring@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" + +lodash._basevalues@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" + lodash._bindcallback@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" @@ -4772,14 +6751,14 @@ lodash._objecttypes@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.3.0.tgz#6a3ea3987dd6eeb8021b2d5c9c303549cc2bae1e" +lodash._reinterpolate@^3.0.0, lodash._reinterpolate@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + lodash._reinterpolate@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.3.0.tgz#03ee9d85c0e55cbd590d71608a295bdda51128ec" -lodash._reinterpolate@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - lodash._renative@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._renative/-/lodash._renative-2.3.0.tgz#77d8edd4ced26dd5971f9e15a5f772e4e317fbd3" @@ -4791,6 +6770,10 @@ lodash._reunescapedhtml@~2.3.0: lodash._htmlescapes "~2.3.0" lodash.keys "~2.3.0" +lodash._root@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + lodash._setbinddata@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._setbinddata/-/lodash._setbinddata-2.3.0.tgz#e5610490acd13277d59858d95b5f2727f1508f04" @@ -4816,10 +6799,18 @@ lodash.assign@^3.2.0: lodash._createassigner "^3.0.0" lodash.keys "^3.0.0" -lodash.assignin@^4.1.0: +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + +lodash.assignin@^4.0.9, lodash.assignin@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" +lodash.bind@^4.1.4: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" + lodash.bind@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-2.3.0.tgz#c2a8e18b68e5ecc152e2b168266116fea5b016cc" @@ -4832,7 +6823,7 @@ lodash.castarray@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" -lodash.clonedeep@^4.4.1: +lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.4.1, lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -4850,6 +6841,14 @@ lodash.debounce@^3.1.1: dependencies: lodash._getnative "^3.0.0" +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + +lodash.defaults@^4.0.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + lodash.defaults@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.3.0.tgz#a832b001f138f3bb9721c2819a2a7cc5ae21ed25" @@ -4861,6 +6860,12 @@ lodash.defaultsdeep@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.0.tgz#bec1024f85b1bd96cbea405b23c14ad6443a6f81" +lodash.escape@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" + dependencies: + lodash._root "^3.0.0" + lodash.escape@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.3.0.tgz#844c38c58f844e1362ebe96726159b62cf5f2a58" @@ -4869,6 +6874,10 @@ lodash.escape@~2.3.0: lodash._reunescapedhtml "~2.3.0" lodash.keys "~2.3.0" +lodash.filter@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" + lodash.find@^4.5.1: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" @@ -4880,6 +6889,14 @@ lodash.flatten@^3.0.2: lodash._baseflatten "^3.0.0" lodash._isiterateecall "^3.0.0" +lodash.flatten@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + +lodash.foreach@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" + lodash.foreach@~2.3.x: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-2.3.0.tgz#083404c91e846ee77245fdf9d76519c68b2af168" @@ -4933,10 +6950,18 @@ lodash.keys@~2.3.0: lodash._shimkeys "~2.3.0" lodash.isobject "~2.3.0" +lodash.map@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" + lodash.merge@^4.3.0, lodash.merge@^4.4.0, lodash.merge@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" +lodash.mergewith@^4.6.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" + lodash.noop@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.noop/-/lodash.noop-2.3.0.tgz#3059d628d51bbf937cd2a0b6fc3a7f212a669c2c" @@ -4945,9 +6970,25 @@ lodash.omit@^4.1.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" -lodash.restparam@^3.0.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" +lodash.pick@^4.2.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + +lodash.reduce@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" + +lodash.reject@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash.some@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" lodash.sortby@^4.7.0: version "4.7.0" @@ -4959,6 +7000,20 @@ lodash.support@~2.3.0: dependencies: lodash._renative "~2.3.0" +lodash.template@^3.3.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" + dependencies: + lodash._basecopy "^3.0.0" + lodash._basetostring "^3.0.0" + lodash._basevalues "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + lodash.keys "^3.0.0" + lodash.restparam "^3.0.0" + lodash.templatesettings "^3.0.0" + lodash.template@^4.2.5: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" @@ -4978,6 +7033,13 @@ lodash.template@~2.3.x: lodash.templatesettings "~2.3.0" lodash.values "~2.3.0" +lodash.templatesettings@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + lodash.templatesettings@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" @@ -5009,7 +7071,7 @@ lodash@3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.8.0.tgz#376eb98bdcd9382a9365c33c4cb8250de1325b91" -lodash@^3.10.1: +lodash@^3.10.0, lodash@^3.10.1, lodash@^3.2.0: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" @@ -5017,10 +7079,14 @@ lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.5.1, lod version "4.17.5" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" -lodash@^4.13.1, lodash@^4.2.0: +lodash@^4.1.0, lodash@^4.10.0, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.5, lodash@^4.2.0, lodash@~4.17.10: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" +lodash@~2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e" + log-symbols@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" @@ -5048,6 +7114,10 @@ lower-case@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" +lowercase-keys@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + lru-cache@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" @@ -5055,6 +7125,16 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" +lunr@^2.1.5: + version "2.3.2" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.2.tgz#7164301092b2d7ab664573156f686df5c25c4185" + +magic-string@^0.24.0: + version "0.24.1" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.24.1.tgz#7e38e5f126cae9f15e71f0cf8e450818ca7d5a8f" + dependencies: + sourcemap-codec "^1.4.1" + make-array@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/make-array/-/make-array-0.1.2.tgz#335e36ebb0c5a43154d21213a1ecaeae2a1bb3ef" @@ -5079,6 +7159,10 @@ map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -5095,6 +7179,16 @@ markdown-it-terminal@0.1.0: lodash.merge "^4.6.0" markdown-it "^8.3.1" +markdown-it@^4.3.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-4.4.0.tgz#3df373dbea587a9a7fef3e56311b68908f75c414" + dependencies: + argparse "~1.0.2" + entities "~1.1.1" + linkify-it "~1.2.0" + mdurl "~1.0.0" + uc.micro "^1.0.0" + markdown-it@^8.3.0, markdown-it@^8.3.1: version "8.4.0" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.0.tgz#e2400881bf171f7018ed1bd9da441dac8af6306d" @@ -5105,12 +7199,30 @@ markdown-it@^8.3.0, markdown-it@^8.3.1: mdurl "^1.0.1" uc.micro "^1.0.3" +marked@0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" + +marked@^0.3.12: + version "0.3.19" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790" + +match-media@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/match-media/-/match-media-0.2.0.tgz#ea4e09742e7253cc7d7e1599ba627e0fa29fbc50" + matcher-collection@^1.0.0, matcher-collection@^1.0.4, matcher-collection@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.0.5.tgz#2ee095438372cb8884f058234138c05c644ec339" dependencies: minimatch "^3.0.2" +md5-hex@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-1.3.0.tgz#d2c4afe983c4370662179b8cad145219135046c4" + dependencies: + md5-o-matic "^0.1.1" + md5-hex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-2.0.0.tgz#d0588e9f1c74954492ecd24ac0ac6ce997d92e33" @@ -5121,7 +7233,19 @@ md5-o-matic@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" -mdurl@^1.0.1: +md5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" + dependencies: + charenc "~0.0.1" + crypt "~0.0.1" + is-buffer "~1.1.1" + +mdn-links@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/mdn-links/-/mdn-links-0.1.0.tgz#e24c83b97cb4c5886cc39f2f780705fbfe273aa5" + +mdurl@^1.0.1, mdurl@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" @@ -5135,7 +7259,7 @@ memory-streams@^0.1.0: dependencies: readable-stream "~1.0.2" -meow@^3.4.0: +meow@^3.4.0, meow@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" dependencies: @@ -5150,6 +7274,12 @@ meow@^3.4.0: redent "^1.0.0" trim-newlines "^1.0.0" +merge-defaults@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/merge-defaults/-/merge-defaults-0.2.1.tgz#dd42248eb96bb6a51521724321c72ff9583dde80" + dependencies: + lodash "~2.4.1" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -5173,7 +7303,7 @@ methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" -micromatch@^2.1.5, micromatch@^2.3.7: +micromatch@^2.1.5, micromatch@^2.3.11, micromatch@^2.3.7: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" dependencies: @@ -5209,6 +7339,24 @@ micromatch@^3.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + "mime-db@>= 1.30.0 < 2": version "1.32.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.32.0.tgz#485b3848b01a3cda5f968b4882c0771e58e09414" @@ -5217,35 +7365,65 @@ mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" +mime-db@~1.35.0: + version "1.35.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47" + mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7: version "2.1.17" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" dependencies: mime-db "~1.30.0" +mime-types@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-1.0.2.tgz#995ae1392ab8affcbfcb2641dd054e943c0d5dce" + +mime-types@~2.1.18, mime-types@~2.1.19: + version "2.1.19" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0" + dependencies: + mime-db "~1.35.0" + mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" -mime@^1.2.11: +mime@^1.2.11, mime@^1.3.4: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" +mime@~1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10" + mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + dependencies: + dom-walk "^0.1.0" + +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: brace-expansion "^1.1.7" +minimatch@^2.0.1: + version "2.0.10" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" + dependencies: + brace-expansion "^1.0.0" + minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: +minimist@1.2.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -5253,6 +7431,19 @@ minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" +minipass@^2.2.1, minipass@^2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957" + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" + dependencies: + minipass "^2.2.1" + mixin-deep@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.0.tgz#47a8732ba97799457c8c1eca28f95132d7e8150a" @@ -5266,6 +7457,10 @@ mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdi dependencies: minimist "0.0.8" +mkdirp@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" + mktemp@^0.4.0, mktemp@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/mktemp/-/mktemp-0.4.0.tgz#6d0515611c8a8c84e484aa2000129b98e981ff0b" @@ -5351,6 +7546,10 @@ najax@^1.0.2: lodash.defaultsdeep "^4.6.0" qs "^6.2.0" +nan@^2.10.0, nan@^2.9.2: + version "2.10.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + nan@^2.3.0: version "2.8.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" @@ -5371,14 +7570,42 @@ nanomatch@^1.2.5: snapdragon "^0.8.1" to-regex "^3.0.1" +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" +needle@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.2.tgz#1120ca4c41f2fcc6976fd28a8968afe239929418" + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" +next-tick@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + no-case@^2.2.0: version "2.3.2" resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" @@ -5392,11 +7619,32 @@ node-fetch@^1.3.3: encoding "^0.1.11" is-stream "^1.0.1" +node-fetch@^2.0.0-alpha.9: + version "2.2.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.2.0.tgz#4ee79bde909262f9775f731e3656d0db55ced5b5" + +node-gyp@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "^2.87.0" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" -node-modules-path@^1.0.0: +node-modules-path@^1.0.0, node-modules-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/node-modules-path/-/node-modules-path-1.0.1.tgz#40096b08ce7ad0ea14680863af449c7c75a5d1c8" @@ -5409,6 +7657,21 @@ node-notifier@^5.0.1: shellwords "^0.1.1" which "^1.3.0" +node-pre-gyp@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + node-pre-gyp@^0.6.39: version "0.6.39" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" @@ -5425,7 +7688,57 @@ node-pre-gyp@^0.6.39: tar "^2.2.1" tar-pack "^3.4.0" -nopt@^3.0.3, nopt@^3.0.6: +node-rest-client@^1.5.1: + version "1.8.0" + resolved "https://registry.yarnpkg.com/node-rest-client/-/node-rest-client-1.8.0.tgz#8d3c566b817e27394cb7273783a41caefe3e5955" + dependencies: + debug "~2.2.0" + xml2js ">=0.2.4" + +node-sass@^4.7.2: + version "4.9.3" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.3.tgz#f407cf3d66f78308bb1e346b24fa428703196224" + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^3.0.0" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + in-publish "^2.0.0" + lodash.assign "^4.2.0" + lodash.clonedeep "^4.3.2" + lodash.mergewith "^4.6.0" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.10.0" + node-gyp "^3.8.0" + npmlog "^4.0.0" + request "2.87.0" + sass-graph "^2.2.4" + stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" + +node-uuid@~1.4.0: + version "1.4.8" + resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" + +nodemon@^1.11.0: + version "1.18.3" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.18.3.tgz#46e681ee0dd1b590562e03019b4c5df234f906f9" + dependencies: + chokidar "^2.0.2" + debug "^3.1.0" + ignore-by-default "^1.0.1" + minimatch "^3.0.4" + pstree.remy "^1.1.0" + semver "^5.5.0" + supports-color "^5.2.0" + touch "^3.1.0" + undefsafe "^2.0.2" + update-notifier "^2.3.0" + +"nopt@2 || 3", nopt@^3.0.3, nopt@^3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" dependencies: @@ -5438,6 +7751,12 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + dependencies: + abbrev "1" + normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" @@ -5447,12 +7766,20 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.0, normalize-path@^2.0.1: +normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" dependencies: remove-trailing-separator "^1.0.1" +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + +npm-bundled@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" + npm-git-info@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/npm-git-info/-/npm-git-info-1.0.3.tgz#a933c42ec321e80d3646e0d6e844afe94630e1d5" @@ -5466,13 +7793,20 @@ npm-package-arg@^6.0.0: semver "^5.4.1" validate-npm-package-name "^3.0.0" +npm-packlist@^1.1.6: + version "1.1.11" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de" + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" dependencies: path-key "^2.0.0" -npmlog@^4.0.0, npmlog@^4.0.2: +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" dependencies: @@ -5481,10 +7815,24 @@ npmlog@^4.0.0, npmlog@^4.0.2: gauge "~2.7.3" set-blocking "~2.0.0" +nth-check@~1.0.0, nth-check@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" + dependencies: + boolbase "~1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" +"nwmatcher@>= 1.3.7 < 2.0.0": + version "1.4.4" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" + "nwmatcher@>= 1.3.9 < 2.0.0": version "1.4.3" resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c" @@ -5493,18 +7841,30 @@ nwsapi@^2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.7.tgz#6fc54c254621f10cac5225b76e81c74120139b78" +oauth-sign@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.3.0.tgz#cb540f93bb2b22a7d5941691a288d60e8ea9386e" + oauth-sign@~0.8.1, oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + object-assign@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" -object-assign@4.1.1, object-assign@^4.0.1, object-assign@^4.1.0: +object-assign@4.1.1, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" +object-assign@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" + object-component@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" @@ -5597,6 +7957,12 @@ os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + os-shim@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" @@ -5605,6 +7971,13 @@ os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" +osenv@0: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + osenv@^0.1.3, osenv@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" @@ -5616,6 +7989,10 @@ p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" +p-is-promise@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" + p-limit@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" @@ -5632,6 +8009,39 @@ p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +parse-bmfont-ascii@^1.0.3: + version "1.0.6" + resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285" + +parse-bmfont-binary@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz#d038b476d3e9dd9db1e11a0b0e53a22792b69006" + +parse-bmfont-xml@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz#015319797e3e12f9e739c4d513872cd2fa35f389" + dependencies: + xml-parse-from-string "^1.0.0" + xml2js "^0.4.5" + +parse-git-config@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/parse-git-config/-/parse-git-config-1.1.1.tgz#d3a9984317132f57398712bba438e129590ddf8c" + dependencies: + extend-shallow "^2.0.1" + fs-exists-sync "^0.1.0" + git-config-path "^1.0.1" + ini "^1.3.4" + parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" @@ -5641,16 +8051,33 @@ parse-glob@^3.0.4: is-extglob "^1.0.0" is-glob "^2.0.0" +parse-headers@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.1.tgz#6ae83a7aa25a9d9b700acc28698cd1f1ed7e9536" + dependencies: + for-each "^0.3.2" + trim "0.0.1" + parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" dependencies: error-ex "^1.2.0" +parse-ms@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" + parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" +parse-png@^1.0.0, parse-png@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/parse-png/-/parse-png-1.1.2.tgz#f5c2ad7c7993490986020a284c19aee459711ff2" + dependencies: + pngjs "^3.2.0" + parse5@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" @@ -5691,6 +8118,10 @@ passwd-user@^1.2.1: dependencies: exec-file-sync "^2.0.0" +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" @@ -5737,6 +8168,31 @@ pathval@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + dependencies: + through "~2.3" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + +perfectionist@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/perfectionist/-/perfectionist-2.4.0.tgz#c147ad3714e126467f1764129ee72df861d47ea0" + dependencies: + comment-regex "^1.0.0" + defined "^1.0.0" + minimist "^1.2.0" + postcss "^5.0.8" + postcss-scss "^0.3.0" + postcss-value-parser "^3.3.0" + read-file-stdin "^0.2.0" + string.prototype.repeat "^0.2.0" + vendors "^1.0.0" + write-file-stdout "0.0.2" + performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" @@ -5745,7 +8201,21 @@ performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" -pify@^2.0.0: +phantomjs-prebuilt@^2.1.10: + version "2.1.16" + resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz#efd212a4a3966d3647684ea8ba788549be2aefef" + dependencies: + es6-promise "^4.0.3" + extract-zip "^1.6.5" + fs-extra "^1.0.0" + hasha "^2.2.0" + kew "^0.7.0" + progress "^1.1.8" + request "^2.81.0" + request-progress "^2.0.1" + which "^1.2.10" + +pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -5763,14 +8233,24 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" +pixelmatch@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854" + dependencies: + pngjs "^3.0.0" + pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" -pn@^1.1.0: +pn@^1.0.0, pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" +pngjs@^3.0.0, pngjs@^3.2.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.3.3.tgz#85173703bde3edac8998757b96e5821d0966a21b" + portfinder@^1.0.7: version "1.0.13" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" @@ -5783,10 +8263,91 @@ posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" +postcss-easy-import@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-easy-import/-/postcss-easy-import-3.0.0.tgz#8eaaf5ae59566083d0cae98735dfd803e3ab194d" + dependencies: + globby "^6.1.0" + is-glob "^4.0.0" + lodash "^4.17.4" + object-assign "^4.0.1" + pify "^3.0.0" + postcss "^6.0.11" + postcss-import "^10.0.0" + resolve "^1.1.7" + +postcss-functions@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-functions/-/postcss-functions-3.0.0.tgz#0e94d01444700a481de20de4d55fb2640564250e" + dependencies: + glob "^7.1.2" + object-assign "^4.1.1" + postcss "^6.0.9" + postcss-value-parser "^3.3.0" + +postcss-import@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-10.0.0.tgz#4c85c97b099136cc5ea0240dc1dfdbfde4e2ebbe" + dependencies: + object-assign "^4.0.1" + postcss "^6.0.1" + postcss-value-parser "^3.2.3" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-less@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-1.1.5.tgz#a6f0ce180cf3797eeee1d4adc0e9e6d6db665609" + dependencies: + postcss "^5.2.16" + +postcss-scss@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-0.3.1.tgz#65c610d8e2a7ee0e62b1835b71b8870734816e4b" + dependencies: + postcss "^5.2.4" + +postcss-scss@^1.0.2: + version "1.0.6" + resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-1.0.6.tgz#ab903f3bb20161bc177896462293a53d4bff5f7a" + dependencies: + postcss "^6.0.23" + +postcss-selector-namespace@^1.4.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/postcss-selector-namespace/-/postcss-selector-namespace-1.5.0.tgz#62335de8f1992eae989d1be33ba2298156ab458b" + dependencies: + postcss "^6.0.14" + +postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" + +postcss@^5.0.8, postcss@^5.2.16, postcss@^5.2.4: + version "5.2.18" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" + dependencies: + chalk "^1.1.3" + js-base64 "^2.1.9" + source-map "^0.5.6" + supports-color "^3.2.3" + +postcss@^6.0.1, postcss@^6.0.11, postcss@^6.0.14, postcss@^6.0.17, postcss@^6.0.20, postcss@^6.0.23, postcss@^6.0.8, postcss@^6.0.9: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" @@ -5798,11 +8359,17 @@ pretender@^1.6.1: fake-xml-http-request "^1.6.0" route-recognizer "^0.3.3" +pretty-ms@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-3.2.0.tgz#87a8feaf27fc18414d75441467d411d6e6098a25" + dependencies: + parse-ms "^1.0.0" + printf@^0.2.3: version "0.2.5" resolved "https://registry.yarnpkg.com/printf/-/printf-0.2.5.tgz#c438ca2ca33e3927671db4ab69c0e52f936a4f0f" -private@^0.1.6, private@^0.1.7, private@~0.1.5: +private@^0.1.6, private@^0.1.7, private@^0.1.8, private@~0.1.5: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -5810,12 +8377,24 @@ 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" +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + process-relative-require@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/process-relative-require/-/process-relative-require-1.0.0.tgz#1590dfcf5b8f2983ba53e398446b68240b4cc68a" dependencies: node-modules-path "^1.0.0" +process@~0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" + +progress@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + progress@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" @@ -5833,6 +8412,19 @@ proxy-addr@~2.0.2: forwarded "~0.1.2" ipaddr.js "1.5.2" +proxy-addr@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.8.0" + +ps-tree@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014" + dependencies: + event-stream "~3.3.0" + pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -5841,22 +8433,36 @@ psl@^1.1.24: version "1.1.28" resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.28.tgz#4fb6ceb08a1e2214d4fd4de0ca22dae13740bc7b" +pstree.remy@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.0.tgz#f2af27265bd3e5b32bbfcc10e80bac55ba78688b" + dependencies: + ps-tree "^1.1.0" + +punycode@2.x.x, punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" qs@6.5.1, qs@^6.4.0, qs@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" -qs@^6.2.0: +qs@^6.2.0, qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" +qs@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-1.0.2.tgz#50a93e2b5af6691c31bcea5dae78ee6ea1903768" + qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" @@ -5916,6 +8522,15 @@ raw-body@~1.1.0: bytes "1" string_decoder "0.10" +rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + rc@^1.1.7: version "1.2.5" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd" @@ -5925,6 +8540,22 @@ rc@^1.1.7: minimist "^1.2.0" strip-json-comments "~2.0.1" +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + dependencies: + pify "^2.3.0" + +read-chunk@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-1.0.1.tgz#5f68cab307e663f19993527d9b589cace4661194" + +read-file-stdin@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/read-file-stdin/-/read-file-stdin-0.2.1.tgz#25eccff3a153b6809afacb23ee15387db9e0ee61" + dependencies: + gather-stream "^1.0.0" + read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" @@ -5940,6 +8571,15 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" +readable-stream@1.1: + version "1.1.13" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + readable-stream@^2, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" @@ -5952,6 +8592,18 @@ readable-stream@^2, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-str string_decoder "~1.0.3" util-deprecate "~1.0.1" +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.1.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + readable-stream@~1.0.2: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" @@ -6004,6 +8656,10 @@ regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" +regenerator-runtime@^0.9.5: + version "0.9.6" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz#d33eb95d0d2001a4be39659707c51b0cb71ce029" + regenerator-transform@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" @@ -6024,6 +8680,13 @@ regex-not@^1.0.0: dependencies: extend-shallow "^2.0.1" +regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" @@ -6032,6 +8695,19 @@ regexpu-core@^2.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" +registry-auth-token@^3.0.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + dependencies: + rc "^1.0.1" + regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" @@ -6060,6 +8736,16 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" +replace-ext@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" + +request-progress@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08" + dependencies: + throttleit "^1.0.0" + request-promise-core@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" @@ -6101,9 +8787,9 @@ request@2.81.0: tunnel-agent "^0.6.0" uuid "^3.0.0" -request@^2.74.0, request@^2.79.0: - version "2.83.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" +request@2.87.0, request@^2.81.0, request@^2.87.0: + version "2.87.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" dependencies: aws-sign2 "~0.7.0" aws4 "^1.6.0" @@ -6113,7 +8799,6 @@ request@^2.74.0, request@^2.79.0: forever-agent "~0.6.1" form-data "~2.3.1" har-validator "~5.0.3" - hawk "~6.0.2" http-signature "~1.2.0" is-typedarray "~1.0.0" isstream "~0.1.2" @@ -6123,14 +8808,38 @@ request@^2.74.0, request@^2.79.0: performance-now "^2.1.0" qs "~6.5.1" safe-buffer "^5.1.1" - stringstream "~0.0.5" tough-cookie "~2.3.3" tunnel-agent "^0.6.0" uuid "^3.1.0" -request@^2.81.0, request@^2.87.0: - version "2.87.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" +request@^2.55.0, request@^2.65.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +request@^2.74.0, request@^2.79.0: + version "2.83.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" dependencies: aws-sign2 "~0.7.0" aws4 "^1.6.0" @@ -6140,6 +8849,7 @@ request@^2.81.0, request@^2.87.0: forever-agent "~0.6.1" form-data "~2.3.1" har-validator "~5.0.3" + hawk "~6.0.2" http-signature "~1.2.0" is-typedarray "~1.0.0" isstream "~0.1.2" @@ -6149,16 +8859,48 @@ request@^2.81.0, request@^2.87.0: performance-now "^2.1.0" qs "~6.5.1" safe-buffer "^5.1.1" + stringstream "~0.0.5" tough-cookie "~2.3.3" tunnel-agent "^0.6.0" uuid "^3.1.0" +request@~2.40.0: + version "2.40.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.40.0.tgz#4dd670f696f1e6e842e66b4b5e839301ab9beb67" + dependencies: + forever-agent "~0.5.0" + json-stringify-safe "~5.0.0" + mime-types "~1.0.1" + node-uuid "~1.4.0" + qs "~1.0.0" + optionalDependencies: + aws-sign2 "~0.5.0" + form-data "~0.1.0" + hawk "1.1.1" + http-signature "~0.10.0" + oauth-sign "~0.3.0" + stringstream "~0.0.4" + tough-cookie ">=0.12.0" + tunnel-agent "~0.4.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + require-folder-tree@^1.4.5: version "1.4.5" resolved "https://registry.yarnpkg.com/require-folder-tree/-/require-folder-tree-1.4.5.tgz#dfe553cbab98cc88e1c56a3f2f358f06ef85bcb0" dependencies: lodash "3.8.0" +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +require-relative@^0.8.7: + version "0.8.7" + resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" + require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" @@ -6174,6 +8916,17 @@ requires-port@1.x.x: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" +resize-img@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/resize-img/-/resize-img-1.1.2.tgz#fad650faf3ef2c53ea63112bc272d95e9d92550e" + dependencies: + bmp-js "0.0.1" + file-type "^3.8.0" + get-stream "^2.0.0" + jimp "^0.2.21" + jpeg-js "^0.1.1" + parse-png "^1.1.1" + resolve-dir@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" @@ -6202,6 +8955,12 @@ resolve@1.5.0, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.0, resolve@^1.3.3, r dependencies: path-parse "^1.0.5" +resolve@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" + dependencies: + path-parse "^1.0.5" + restore-cursor@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" @@ -6216,13 +8975,17 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + 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" -rimraf@2, rimraf@^2.2.8, rimraf@^2.3.2, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.1, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1: +rimraf@2, rimraf@^2.2.8, rimraf@^2.3.2, rimraf@^2.3.4, rimraf@^2.4.1, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.1, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: @@ -6232,6 +8995,35 @@ rimraf@~2.2.6: version "2.2.8" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" +rollup-pluginutils@^2.0.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.3.1.tgz#760d185ccc237dedc12d7ae48c6bcd127b4892d0" + dependencies: + estree-walker "^0.5.2" + micromatch "^2.3.11" + +rollup@^0.41.4: + version "0.41.6" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.41.6.tgz#e0d05497877a398c104d816d2733a718a7a94e2a" + dependencies: + source-map-support "^0.4.0" + +rollup@^0.57.1: + version "0.57.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.57.1.tgz#0bb28be6151d253f67cf4a00fea48fb823c74027" + dependencies: + "@types/acorn" "^4.0.3" + acorn "^5.5.3" + acorn-dynamic-import "^3.0.0" + date-time "^2.1.0" + is-reference "^1.1.0" + locate-character "^2.0.5" + pretty-ms "^3.1.0" + require-relative "^0.8.7" + rollup-pluginutils "^2.0.1" + signal-exit "^3.0.2" + sourcemap-codec "^1.4.1" + route-recognizer@^0.2.3: version "0.2.10" resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.2.10.tgz#024b2283c2e68d13a7c7f5173a5924645e8902df" @@ -6244,14 +9036,14 @@ rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0. version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" +rsvp@^4.0.1, rsvp@^4.8.1, rsvp@^4.8.2, rsvp@^4.8.3: + version "4.8.3" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.3.tgz#25d4b9fdd0f95e216eb5884d9b3767d3fbfbe2cd" + rsvp@^4.6.1, rsvp@^4.7.0: version "4.8.1" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.1.tgz#168addb3963222de37ee351b70e3876bdb2ac285" -rsvp@^4.8.2: - version "4.8.3" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.3.tgz#25d4b9fdd0f95e216eb5884d9b3767d3fbfbe2cd" - rsvp@~3.0.6: version "3.0.21" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.0.21.tgz#49c588fe18ef293bcd0ab9f4e6756e6ac433359f" @@ -6284,10 +9076,24 @@ safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, s version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" +safe-buffer@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + safe-json-parse@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + sane@^1.1.1, sane@^1.4.1: version "1.7.0" resolved "https://registry.yarnpkg.com/sane/-/sane-1.7.0.tgz#b3579bccb45c94cf20355cc81124990dfd346e30" @@ -6314,10 +9120,36 @@ sane@^2.2.0: optionalDependencies: fsevents "^1.1.1" -sax@^1.2.1, sax@^1.2.4: +sass-graph@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^7.0.0" + +sax@>=0.6.0, sax@^1.1.4, sax@^1.2.1, sax@^1.2.4, sax@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + +select@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + dependencies: + semver "^5.0.3" + "semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.1.1, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" @@ -6326,6 +9158,14 @@ semver@^4.3.1: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" +semver@^5.0.3: + version "5.5.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" + +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + send@0.16.1: version "0.16.1" resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" @@ -6344,6 +9184,24 @@ send@0.16.1: range-parser "~1.2.0" statuses "~1.3.1" +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + serve-static@1.13.1: version "1.13.1" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" @@ -6353,7 +9211,16 @@ serve-static@1.13.1: parseurl "~1.3.2" send "0.16.1" -set-blocking@~2.0.0: +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + +set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -6425,6 +9292,10 @@ simple-dom@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/simple-dom/-/simple-dom-1.3.0.tgz#8473e0d34e340544b061410dba3faf4f1b7aa282" +simple-html-tokenizer@^0.4.1: + version "0.4.3" + resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.4.3.tgz#9b00b766e30058b4bb377c0d4f97566a13ab1be1" + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" @@ -6468,6 +9339,12 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^2.0.0" +sntp@0.2.x: + version "0.2.4" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-0.2.4.tgz#fb885f18b0f3aad189f824862536bceeec750900" + dependencies: + hoek "0.9.x" + sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" @@ -6544,7 +9421,7 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.4.15: +source-map-support@^0.4.0, source-map-support@^0.4.15: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" dependencies: @@ -6571,11 +9448,11 @@ source-map@0.4.x, source-map@^0.4.2, source-map@^0.4.4: dependencies: amdefine ">=0.0.4" -source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.1, source-map@~0.5.6: +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.1, source-map@~0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" -source-map@^0.6.0, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -6585,6 +9462,10 @@ source-map@~0.1.x: dependencies: amdefine ">=0.0.4" +sourcemap-codec@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.1.tgz#c8fd92d91889e902a07aee392bdd2c5863958ba2" + sourcemap-validator@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/sourcemap-validator/-/sourcemap-validator-1.0.6.tgz#abd2f1ecdae6a3c46c2c96c5f256705b2147c9c0" @@ -6629,6 +9510,12 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + dependencies: + through "2" + sprintf-js@^1.0.3: version "1.1.1" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c" @@ -6662,7 +9549,7 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.3.1 < 2": +"statuses@>= 1.3.1 < 2", statuses@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" @@ -6670,10 +9557,38 @@ statuses@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" +stdout-stream@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" + dependencies: + readable-stream "^2.0.1" + stealthy-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + dependencies: + duplexer "~0.1.1" + +stream-to-array@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/stream-to-array/-/stream-to-array-2.3.0.tgz#bbf6b39f5f43ec30bc71babcb37557acecf34353" + dependencies: + any-promise "^1.1.0" + +stream-to-buffer@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz#26799d903ab2025c9bd550ac47171b00f8dd80a9" + dependencies: + stream-to "~0.2.0" + +stream-to@~0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stream-to/-/stream-to-0.2.2.tgz#84306098d85fdb990b9fa300b1b3ccf55e8ef01d" + string-template@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" @@ -6693,6 +9608,10 @@ string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string.prototype.repeat@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-0.2.0.tgz#aba36de08dcee6a5a337d49b2ea1da1b28fc0ecf" + string_decoder@0.10, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -6703,6 +9622,12 @@ string_decoder@~1.0.3: dependencies: safe-buffer "~5.1.0" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + dependencies: + safe-buffer "~5.1.0" + stringstream@~0.0.4, stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -6749,6 +9674,10 @@ strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" +striptags@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/striptags/-/striptags-3.1.1.tgz#c8c3e7fdd6fb4bb3a32a3b752e5b5e3e38093ebd" + styled_string@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/styled_string/-/styled_string-0.0.1.tgz#d22782bd81295459bc4f1df18c4bad8e94dd124a" @@ -6773,6 +9702,12 @@ supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" +supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + supports-color@^4.0.0: version "4.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" @@ -6785,7 +9720,33 @@ supports-color@^5.2.0: dependencies: has-flag "^3.0.0" -symbol-tree@^3.2.1, symbol-tree@^3.2.2: +supports-color@^5.3.0, supports-color@^5.4.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + dependencies: + has-flag "^3.0.0" + +svg2png@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/svg2png/-/svg2png-3.0.1.tgz#a2644d68b0231ac00af431aa163714ff17106447" + dependencies: + phantomjs-prebuilt "^2.1.10" + pn "^1.0.0" + yargs "^3.31.0" + +svgo@0.6.6: + version "0.6.6" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.6.6.tgz#b340889036f20f9b447543077d0f5573ed044c08" + dependencies: + coa "~1.0.1" + colors "~1.1.2" + csso "~2.0.0" + js-yaml "~3.6.0" + mkdirp "~0.5.1" + sax "~1.2.1" + whet.extend "~0.9.9" + +"symbol-tree@>= 3.1.0 < 4.0.0", symbol-tree@^3.2.1, symbol-tree@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" @@ -6793,6 +9754,10 @@ symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.3, symlink- version "1.1.8" resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.1.8.tgz#cabe61e0010c1c023c173b25ee5108b37f4b4aa3" +symlink-or-copy@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.2.0.tgz#5d49108e2ab824a34069b68974486c290020b393" + table@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" @@ -6804,6 +9769,22 @@ table@^4.0.1: slice-ansi "1.0.0" string-width "^2.1.1" +taffydb@2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.7.2.tgz#7bf8106a5c1a48251b3e3bc0a0e1732489fd0dc8" + +tailwindcss@^0.4.1: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-0.4.3.tgz#f197e6139f7b1e8a07feb05f01c4ef7d57ec090f" + dependencies: + commander "^2.11.0" + fs-extra "^4.0.2" + lodash "^4.17.4" + nodemon "^1.11.0" + perfectionist "^2.4.0" + postcss "^6.0.9" + postcss-functions "^3.0.0" + tap-parser@^5.1.0: version "5.4.0" resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-5.4.0.tgz#6907e89725d7b7fa6ae41ee2c464c3db43188aec" @@ -6826,7 +9807,7 @@ tar-pack@^3.4.0: tar "^2.2.1" uid-number "^0.0.6" -tar@^2.2.1: +tar@^2.0.0, tar@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" dependencies: @@ -6834,6 +9815,18 @@ tar@^2.2.1: fstream "^1.0.2" inherits "2" +tar@^4: + version "4.4.6" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" + dependencies: + chownr "^1.0.1" + fs-minipass "^1.2.5" + minipass "^2.3.3" + minizlib "^1.1.0" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + temp@0.8.3, temp@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" @@ -6841,6 +9834,12 @@ temp@0.8.3, temp@^0.8.3: os-tmpdir "^1.0.0" rimraf "~2.2.6" +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + dependencies: + execa "^0.7.0" + testem@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/testem/-/testem-2.0.0.tgz#b05c96200c7ac98bae998d71c94c0c5345907d13" @@ -6873,6 +9872,10 @@ testem@^2.0.0: tap-parser "^5.1.0" xmldom "^0.1.19" +tether@^1.4.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/tether/-/tether-1.4.4.tgz#9dc6eb2b3e601da2098fd264e7f7a8b264de1125" + text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -6893,10 +9896,40 @@ thenify-all@^1.0.0, thenify-all@^1.6.0: dependencies: any-promise "^1.0.0" -through@^2.3.6, through@^2.3.8: +throttleit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" + +through2-filter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" + dependencies: + through2 "~2.0.0" + xtend "~4.0.0" + +through2@^2.0.0, through2@^2.0.3, through2@~2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +through@2, through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.1: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" +time-zone@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d" + +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + +tiny-emitter@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.0.2.tgz#82d27468aca5ade8e5fd1e6d22b57dd43ebdfb7c" + tiny-lr@^1.0.3: version "1.1.0" resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.1.0.tgz#a373bce2a4b58cef9a64433360ba593155f4cd45" @@ -6908,6 +9941,10 @@ tiny-lr@^1.0.3: object-assign "^4.1.0" qs "^6.4.0" +tinycolor2@^1.1.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8" + tmp@0.0.28: version "0.0.28" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" @@ -6948,6 +9985,16 @@ to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" +to-ico@^1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/to-ico/-/to-ico-1.1.5.tgz#1d32da5f2c90922edee6b686d610c54527b5a8d5" + dependencies: + arrify "^1.0.1" + buffer-alloc "^1.1.0" + image-size "^0.5.0" + parse-png "^1.0.0" + resize-img "^1.1.0" + to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -6969,7 +10016,28 @@ to-regex@^3.0.1: extend-shallow "^2.0.1" regex-not "^1.0.0" -tough-cookie@>=2.3.3, tough-cookie@^2.3.4: +to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +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" + +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + dependencies: + nopt "~1.0.10" + +tough-cookie@>=0.12.0, tough-cookie@>=2.3.3, tough-cookie@^2.2.0, tough-cookie@^2.3.4, tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" dependencies: @@ -6988,7 +10056,7 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" -tr46@~0.0.3: +tr46@~0.0.1, tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -7010,12 +10078,26 @@ trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + +"true-case-path@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz#7ec91130924766c7f573be3020c34f8fdfd00d62" + dependencies: + glob "^6.0.4" + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" dependencies: safe-buffer "^5.0.1" +tunnel-agent@~0.4.0: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" @@ -7037,11 +10119,18 @@ type-is@~1.6.15: media-typer "0.3.0" mime-types "~2.1.15" +type-is@~1.6.16: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.18" + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -uc.micro@^1.0.1, uc.micro@^1.0.3: +uc.micro@^1.0.0, uc.micro@^1.0.1, uc.micro@^1.0.3: version "1.0.5" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376" @@ -7073,6 +10162,12 @@ ultron@1.0.x: version "1.0.2" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" +undefsafe@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76" + dependencies: + debug "^2.2.0" + underscore.string@^3.2.2, underscore.string@~3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db" @@ -7084,6 +10179,10 @@ underscore@>=1.8.3: version "1.8.3" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" +underscore@^1.8.3: + version "1.9.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" + union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" @@ -7093,6 +10192,13 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^0.4.3" +unique-stream@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" + dependencies: + json-stable-stringify "^1.0.0" + through2-filter "^2.0.0" + unique-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" @@ -7120,10 +10226,45 @@ untildify@^2.1.0: dependencies: os-homedir "^1.0.0" +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + +upath@^1.0.5: + version "1.1.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" + +update-notifier@^2.3.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-ci "^1.0.10" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + dependencies: + prepend-http "^1.0.1" + +url-regex@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-3.2.0.tgz#dbad1e0c9e29e105dd0b1f09f6862f7fdb482724" + dependencies: + ip-regex "^1.0.1" + use@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8" @@ -7162,6 +10303,10 @@ uuid@^3.0.0, uuid@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" +uuid@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + validate-npm-package-license@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" @@ -7179,6 +10324,14 @@ vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" +velocity-animate@^1.5.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/velocity-animate/-/velocity-animate-1.5.2.tgz#5a351d75fca2a92756f5c3867548b873f6c32105" + +vendors@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" + verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -7187,6 +10340,14 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +vinyl@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + w3c-hr-time@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" @@ -7200,6 +10361,10 @@ walk-sync@0.3.2, walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" +walk-sync@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.1.3.tgz#8a07261a00bda6cfb1be25e9f100fad57546f583" + walk-sync@^0.2.5, walk-sync@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.2.7.tgz#b49be4ee6867657aeb736978b56a29d10fa39969" @@ -7224,6 +10389,10 @@ watch@~0.18.0: exec-sh "^0.2.0" minimist "^1.2.0" +webidl-conversions@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-2.0.1.tgz#3bf8258f7d318c7443c36f2e169402a1a6703506" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -7253,6 +10422,12 @@ whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" +whatwg-url-compat@~0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz#00898111af689bb097541cd5a45ca6c8798445bf" + dependencies: + tr46 "~0.0.1" + whatwg-url@^4.3.0: version "4.8.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" @@ -7268,6 +10443,20 @@ whatwg-url@^6.4.0, whatwg-url@^6.4.1: tr46 "^1.0.1" webidl-conversions "^4.0.2" +whet.extend@~0.9.9: + version "0.9.9" + resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + +which@1, which@^1.2.10: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + dependencies: + isexe "^2.0.0" + which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" @@ -7280,10 +10469,20 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2" +widest-line@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.0.tgz#0142a4e8a243f8882c0233aa0e0281aa76152273" + dependencies: + string-width "^2.1.1" + window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" +window-size@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" + wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" @@ -7302,6 +10501,13 @@ workerpool@^2.3.0: dependencies: object-assign "4.1.1" +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -7314,6 +10520,10 @@ write-file-atomic@^2.0.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" +write-file-stdout@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/write-file-stdout/-/write-file-stdout-0.0.2.tgz#c252d7c7c5b1b402897630e3453c7bfe690d9ca1" + write@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" @@ -7341,7 +10551,16 @@ xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" -xml-name-validator@^2.0.1: +xhr@^2.0.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.5.0.tgz#bed8d1676d5ca36108667692b74b316c496e49dd" + dependencies: + global "~4.3.0" + is-function "^1.0.1" + parse-headers "^2.0.0" + xtend "^4.0.0" + +"xml-name-validator@>= 2.0.1 < 3.0.0", xml-name-validator@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" @@ -7349,6 +10568,21 @@ xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" +xml-parse-from-string@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28" + +xml2js@>=0.2.4, xml2js@^0.4.5: + version "0.4.19" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" + dependencies: + sax ">=0.6.0" + xmlbuilder "~9.0.1" + +xmlbuilder@~9.0.1: + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + xmldom@^0.1.19: version "0.1.27" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" @@ -7357,14 +10591,22 @@ xmlhttprequest-ssl@1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" -xtend@^4.0.0, xtend@~4.0.0: +xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" +y18n@^3.2.0, y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" + yam@0.0.22: version "0.0.22" resolved "https://registry.yarnpkg.com/yam/-/yam-0.0.22.tgz#38a76cb79a19284d9206ed49031e359a1340bd06" @@ -7372,6 +10614,42 @@ yam@0.0.22: fs-extra "^0.30.0" lodash.merge "^4.4.0" +yargs-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + dependencies: + camelcase "^3.0.0" + +yargs@^3.31.0: + version "3.32.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" + dependencies: + camelcase "^2.0.1" + cliui "^3.0.3" + decamelize "^1.1.1" + os-locale "^1.4.0" + string-width "^1.0.1" + window-size "^0.1.4" + y18n "^3.2.0" + +yargs@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.0" + yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" @@ -7381,6 +10659,34 @@ yargs@~3.10.0: decamelize "^1.0.0" window-size "0.1.0" +yauzl@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" + dependencies: + fd-slicer "~1.0.1" + yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + +yetch@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/yetch/-/yetch-0.0.1.tgz#76f1729b2c2c667e23c3c2da90472a4897eca004" + +yui@^3.18.1: + version "3.18.1" + resolved "https://registry.yarnpkg.com/yui/-/yui-3.18.1.tgz#e000269ec0a7b6fbc741cbb8fcbd0e65117b014c" + dependencies: + request "~2.40.0" + +yuidocjs@^0.10.2: + version "0.10.2" + resolved "https://registry.yarnpkg.com/yuidocjs/-/yuidocjs-0.10.2.tgz#33924967ce619024cd70ef694e267d2f988f73f6" + dependencies: + express "^4.13.1" + graceful-fs "^4.1.2" + markdown-it "^4.3.0" + mdn-links "^0.1.0" + minimatch "^3.0.2" + rimraf "^2.4.1" + yui "^3.18.1" From 636f99f28aabab623efcbff187461941b71bc8b4 Mon Sep 17 00:00:00 2001 From: Luke Melia Date: Wed, 5 Sep 2018 00:32:07 -0400 Subject: [PATCH 218/879] Loosen ember-inflector constraint to include 3.0.0 --- package.json | 2 +- yarn.lock | 26 +++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index ad1190429..c9fc54004 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "ember-cli-babel": "^6.8.2", "ember-cli-node-assets": "^0.1.4", "ember-get-config": "^0.2.2", - "ember-inflector": "^2.0.0", + "ember-inflector": "^2.0.0||^3.0.0", "ember-lodash": "^4.17.3", "fake-xml-http-request": "^1.4.0", "faker": "^3.0.0", diff --git a/yarn.lock b/yarn.lock index d86a60245..7d4cf180a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1202,7 +1202,7 @@ broccoli-babel-transpiler@^6.0.0, broccoli-babel-transpiler@^6.1.2: rsvp "^3.5.0" workerpool "^2.3.0" -broccoli-babel-transpiler@^6.4.5: +broccoli-babel-transpiler@^6.4.5, broccoli-babel-transpiler@^6.5.0: version "6.5.0" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.5.0.tgz#aa501a227b298a99742fdd0309b1eaad7124bba0" dependencies: @@ -2371,6 +2371,24 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-version-checker "^2.1.0" semver "^5.4.1" +ember-cli-babel@^6.6.0: + version "6.17.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.17.0.tgz#1f3e8ed9f4e2338caef6bc2c3d08d3c9928d0ddd" + dependencies: + amd-name-resolver "1.2.0" + babel-plugin-debug-macros "^0.2.0-beta.6" + babel-plugin-ember-modules-api-polyfill "^2.3.2" + babel-plugin-transform-es2015-modules-amd "^6.24.0" + babel-polyfill "^6.26.0" + babel-preset-env "^1.7.0" + broccoli-babel-transpiler "^6.5.0" + broccoli-debug "^0.6.4" + broccoli-funnel "^2.0.0" + broccoli-source "^1.1.0" + clone "^2.0.0" + ember-cli-version-checker "^2.1.2" + semver "^5.5.0" + ember-cli-babel@^6.7.2: version "6.16.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.16.0.tgz#623b4a2764ece72b65f1572fc8aeb5714a450228" @@ -2780,6 +2798,12 @@ ember-inflector@^2.0.0: dependencies: ember-cli-babel "^6.0.0" +ember-inflector@^2.0.0||^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-3.0.0.tgz#7e1ee8aaa0fa773ba0905d8b7c0786354d890ee1" + dependencies: + ember-cli-babel "^6.6.0" + ember-load-initializers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-1.0.0.tgz#4919eaf06f6dfeca7e134633d8c05a6c9921e6e7" From c5faa4e8db45226419ba86f6c1e7403d680f255b Mon Sep 17 00:00:00 2001 From: Ibraheem Abdul-Malik Date: Mon, 17 Sep 2018 22:11:36 -0700 Subject: [PATCH 219/879] Update Slack to Discord --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 269e2e209..ebeb7abe2 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ For feature requests, visit our [Canny board](https://ember-cli-mirage.canny.io/ Having trouble? -- **Join #ec-mirage** on the Ember Community Slack +- **Join #ec-mirage** on the [Ember Community Discord server](https://discord.gg/zT3asNS) - **Open an issue**, and if possible reproduce it using the [Mirage Boilerplate Twiddle](https://ember-twiddle.com/ec3a4c625c43e7a38f3c6c0c1b8232ec?openFiles=twiddle.json%2C). ## Contributing From 4201723e07403d71f605d9c09a19dbf7adaf2706 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 18 Sep 2018 20:37:18 -0400 Subject: [PATCH 220/879] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c9fc54004..cc9efeb27 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "ember-cli-babel": "^6.8.2", "ember-cli-node-assets": "^0.1.4", "ember-get-config": "^0.2.2", - "ember-inflector": "^2.0.0||^3.0.0", + "ember-inflector": "^2.0.0 || ^3.0.0", "ember-lodash": "^4.17.3", "fake-xml-http-request": "^1.4.0", "faker": "^3.0.0", From 2bf05e69817a8472ac70623b4237762ba702b164 Mon Sep 17 00:00:00 2001 From: Robert Barbey Date: Fri, 21 Sep 2018 11:09:48 +0200 Subject: [PATCH 221/879] Updated link to shorthands Link to shorthands documentation was still pointing to older version v0.3.x. --- blueprints/ember-cli-mirage/files/__root__/config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blueprints/ember-cli-mirage/files/__root__/config.js b/blueprints/ember-cli-mirage/files/__root__/config.js index f9c077fcd..fba83ae2c 100644 --- a/blueprints/ember-cli-mirage/files/__root__/config.js +++ b/blueprints/ember-cli-mirage/files/__root__/config.js @@ -21,6 +21,6 @@ export default function() { this.put('/posts/:id'); // or this.patch this.del('/posts/:id'); - http://www.ember-cli-mirage.com/docs/v0.3.x/shorthands/ + http://www.ember-cli-mirage.com/docs/v0.4.x/shorthands/ */ } From 3d023adbd70a022c01a8d0c1bc0025900325da2d Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 28 Sep 2018 22:13:54 -0400 Subject: [PATCH 222/879] Upgrade addon docs --- config/addon-docs.js | 67 +-- package.json | 8 +- tests/dummy/config/environment.js | 2 + yarn.lock | 779 ++++++++++++------------------ 4 files changed, 318 insertions(+), 538 deletions(-) diff --git a/config/addon-docs.js b/config/addon-docs.js index 6feb2fd90..28590a13d 100644 --- a/config/addon-docs.js +++ b/config/addon-docs.js @@ -4,69 +4,6 @@ const AddonDocsConfig = require('ember-cli-addon-docs/lib/config'); module.exports = class extends AddonDocsConfig { - /* - Return a boolean indicating whether or not the current deploy should - actually run. The `info` parameter contains details about the most recent - git commit. Note that you can also access any configured environment - variables via `process.ENV`. - - info.branch => the current branch or `null` if not on a branch - info.sha => the current sha - info.abbreviatedSha => the first 10 chars of the current sha - info.tag => the tag for the current sha or `null` if none exists - info.committer => the committer for the current sha - info.committerDate => the commit date for the current sha - info.author => the author for the current sha - info.authorDate => the authored date for the current sha - info.commitMessage => the commit message for the current sha - - Note that CI providers typically check out a specific commit hash rather - than a named branch, so `info.branch` may not be available in CI builds. - */ - shouldDeploy(info) { - /* - For example, you might configure your CI builds to execute `ember deploy` - at the end of each successful run, but you may only want to actually - deploy builds on the `master` branch with the default ember-try scenario. - To accomplish that on Travis, you could write: - - return process.env.TRAVIS_BRANCH === 'master' - && process.env.EMBER_TRY_SCENARIO == 'ember-default'; - */ - return super.shouldDeploy(info); - } - - /* - Return a string indicating a subdirectory in the gh-pages branch you want - to deploy to, or nothing to deploy to the root. This hook receives the same - info object as `shouldDeploy` above. - */ - deployDirectory(info) { - /* - For example, to deploy a permalink-able copy of your docs site any time - you tag a release, you could write: - - return info.tag ? `tags/${info.tag}` : 'master'; - */ - return super.deployDirectory(info); - } - - /* - By default, the folder returned by `deployDirectory()` above will be - emptied out before a new revision of the docs application is written there. - - To retain certain files across deploys, return an array of file paths or - globs, relative to the deploy directory, indicating files/directories that - should not be removed before deploying. - */ - preservedPaths(info) { - /* - For example, if you had static JSON in your gh-pages branch powering - something like a blog UI that you want to manage separately from your - app deploys, you might write: - - return ['blog-posts/*.json', ...super.preservedPaths(info)]; - */ - return super.preservedPaths(info); - } + // See https://ember-learn.github.io/ember-cli-addon-docs/docs/deploying + // for details on configuration you can override here. }; diff --git a/package.json b/package.json index 99e7e89ba..d3e1a097d 100644 --- a/package.json +++ b/package.json @@ -58,13 +58,13 @@ "chai": "^4.1.0", "ember-ajax": "^3.0.0", "ember-cli": "~2.18.2", - "ember-cli-addon-docs": "ember-learn/ember-cli-addon-docs#a61d13b9e95c7a303c9f888772d7909441e8ed6b", + "ember-cli-addon-docs": "ember-learn/ember-cli-addon-docs#6b11d814f2ed39b0670a49f324d385c2dfad9a99", "ember-cli-addon-docs-esdoc": "^0.2.1", "ember-cli-app-version": "^2.0.0", "ember-cli-dependency-checker": "^2.0.0", - "ember-cli-deploy": "^1.0.1", - "ember-cli-deploy-build": "^1.1.0", - "ember-cli-deploy-git": "^1.3.0", + "ember-cli-deploy": "^1.0.2", + "ember-cli-deploy-build": "^1.1.1", + "ember-cli-deploy-git": "^1.3.3", "ember-cli-deploy-git-ci": "^1.0.1", "ember-cli-eslint": "^4.2.1", "ember-cli-fastboot": "^1.1.4-beta.1", diff --git a/tests/dummy/config/environment.js b/tests/dummy/config/environment.js index 3d1b2d75c..f7d62f698 100644 --- a/tests/dummy/config/environment.js +++ b/tests/dummy/config/environment.js @@ -45,6 +45,8 @@ module.exports = function(environment) { } if (environment === 'production') { + // Allow ember-cli-addon-docs to update the rootURL in compiled assets + ENV.rootURL = 'ADDON_DOCS_ROOT_URL'; // here you can enable a production-specific feature } diff --git a/yarn.lock b/yarn.lock index f396e3b54..cd6ff47a6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -78,6 +78,13 @@ lodash "^4.2.0" to-fast-properties "^2.0.0" +"@ember/ordered-set@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@ember/ordered-set/-/ordered-set-2.0.0.tgz#54f34aba3a1fb75b7c2912a39ab41a4a2e9d266d" + dependencies: + ember-cli-babel "^6.16.0" + ember-compatibility-helpers "^1.0.0" + "@ember/test-helpers@^0.7.17": version "0.7.17" resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-0.7.17.tgz#17ff5f1d005d8b6331585e99013d66626a8d8068" @@ -222,6 +229,10 @@ acorn@^5.0.0, acorn@^5.5.3: version "5.7.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" +acorn@^5.2.1: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + acorn@^5.4.0: version "5.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.4.1.tgz#fdc58d9d17f4a4e98d102ded826a9b9759125102" @@ -293,12 +304,6 @@ amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" -ansi-align@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" - dependencies: - string-width "^2.0.0" - ansi-escapes@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" @@ -802,12 +807,6 @@ babel-plugin-debug-macros@^0.2.0-beta.6: dependencies: semver "^5.3.0" -babel-plugin-ember-modules-api-polyfill@^1.4.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-1.6.0.tgz#abd1afa4237b3121cb51222f9bf3283cad8990aa" - dependencies: - ember-rfc176-data "^0.2.0" - babel-plugin-ember-modules-api-polyfill@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.3.0.tgz#0c01f359658cfb9c797f705af6b09f6220205ae0" @@ -820,6 +819,12 @@ babel-plugin-ember-modules-api-polyfill@^2.3.2: dependencies: ember-rfc176-data "^0.3.0" +babel-plugin-ember-modules-api-polyfill@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.5.0.tgz#860aab9fecbf38c10d1fe0779c6979a854fff154" + dependencies: + ember-rfc176-data "^0.3.5" + babel-plugin-feature-flags@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/babel-plugin-feature-flags/-/babel-plugin-feature-flags-0.3.1.tgz#9c827cf9a4eb9a19f725ccb239e85cab02036fc1" @@ -868,7 +873,7 @@ babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-block-scoping@^6.23.0, babel-plugin-transform-es2015-block-scoping@^6.24.1: +babel-plugin-transform-es2015-block-scoping@^6.23.0, babel-plugin-transform-es2015-block-scoping@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" dependencies: @@ -1347,18 +1352,6 @@ bower-endpoint-parser@0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz#00b565adbfab6f2d35addde977e97962acbcb3f6" -boxen@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" - dependencies: - ansi-align "^2.0.0" - camelcase "^4.0.0" - chalk "^2.0.1" - cli-boxes "^1.0.0" - string-width "^2.0.0" - term-size "^1.2.0" - widest-line "^2.0.0" - brace-expansion@^1.0.0: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1451,7 +1444,7 @@ broccoli-babel-transpiler@^6.0.0, broccoli-babel-transpiler@^6.1.2: rsvp "^3.5.0" workerpool "^2.3.0" -broccoli-babel-transpiler@^6.4.5: +broccoli-babel-transpiler@^6.4.5, broccoli-babel-transpiler@^6.5.0: version "6.5.0" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.5.0.tgz#aa501a227b298a99742fdd0309b1eaad7124bba0" dependencies: @@ -1585,6 +1578,13 @@ broccoli-file-creator@^1.0.0, broccoli-file-creator@^1.1.1: rsvp "~3.0.6" symlink-or-copy "^1.0.1" +broccoli-file-creator@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/broccoli-file-creator/-/broccoli-file-creator-2.1.1.tgz#7351dd2496c762cfce7736ce9b49e3fce0c7b7db" + dependencies: + broccoli-plugin "^1.1.0" + mkdirp "^0.5.1" + broccoli-filter@^0.1.11: version "0.1.14" resolved "https://registry.yarnpkg.com/broccoli-filter/-/broccoli-filter-0.1.14.tgz#23cae3891ff9ebb7b4d7db00c6dcf03535daf7ad" @@ -1637,7 +1637,7 @@ broccoli-funnel-reducer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/broccoli-funnel-reducer/-/broccoli-funnel-reducer-1.0.0.tgz#11365b2a785aec9b17972a36df87eef24c5cc0ea" -broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.2, broccoli-funnel@^1.1.0, broccoli-funnel@^1.2.0: +broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.2, broccoli-funnel@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-1.2.0.tgz#cddc3afc5ff1685a8023488fff74ce6fb5a51296" dependencies: @@ -1720,6 +1720,13 @@ broccoli-merge-trees@^2.0.0: broccoli-plugin "^1.3.0" merge-trees "^1.0.1" +broccoli-merge-trees@^3.0.0, broccoli-merge-trees@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-3.0.1.tgz#545dfe9f695cec43372b3ee7e63c7203713ea554" + dependencies: + broccoli-plugin "^1.3.0" + merge-trees "^2.0.0" + broccoli-middleware@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/broccoli-middleware/-/broccoli-middleware-1.0.0.tgz#92f4e1fb9a791ea986245a7077f35cc648dab097" @@ -1775,23 +1782,7 @@ broccoli-replace@^0.12.0: broccoli-persistent-filter "^1.2.0" minimatch "^3.0.0" -broccoli-rollup@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/broccoli-rollup/-/broccoli-rollup-1.3.0.tgz#43a0a7798555bab54217009eb470a4ff5a056df0" - dependencies: - broccoli-plugin "^1.2.1" - es6-map "^0.1.4" - fs-extra "^0.30.0" - fs-tree-diff "^0.5.2" - heimdalljs "^0.2.1" - heimdalljs-logger "^0.1.7" - md5-hex "^1.3.0" - node-modules-path "^1.0.1" - rollup "^0.41.4" - symlink-or-copy "^1.1.8" - walk-sync "^0.3.1" - -broccoli-rollup@^2.0.0: +broccoli-rollup@^2.0.0, broccoli-rollup@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/broccoli-rollup/-/broccoli-rollup-2.1.1.tgz#0b77dc4b7560a53e998ea85f3b56772612d4988d" dependencies: @@ -1888,6 +1879,25 @@ broccoli-stew@^1.4.2: symlink-or-copy "^1.2.0" walk-sync "^0.3.0" +broccoli-stew@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-2.0.0.tgz#68f3d94f13b4a79aa15d582703574fb4c3215e50" + dependencies: + broccoli-debug "^0.6.1" + broccoli-funnel "^2.0.0" + broccoli-merge-trees "^3.0.0" + broccoli-persistent-filter "^1.1.6" + broccoli-plugin "^1.3.0" + chalk "^2.4.1" + debug "^3.1.0" + ensure-posix-path "^1.0.1" + fs-extra "^6.0.1" + minimatch "^3.0.4" + resolve "^1.8.1" + rsvp "^4.8.3" + symlink-or-copy "^1.2.0" + walk-sync "^0.3.0" + broccoli-string-replace@^0.1.1, broccoli-string-replace@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/broccoli-string-replace/-/broccoli-string-replace-0.1.2.tgz#1ed92f85680af8d503023925e754e4e33676b91f" @@ -1895,7 +1905,7 @@ broccoli-string-replace@^0.1.1, broccoli-string-replace@^0.1.2: broccoli-persistent-filter "^1.1.5" minimatch "^3.0.3" -broccoli-style-manifest@^1.4.0: +broccoli-style-manifest@^1.5.0: version "1.5.2" resolved "https://registry.yarnpkg.com/broccoli-style-manifest/-/broccoli-style-manifest-1.5.2.tgz#249accc81a75b83fb581cd8c2d16a51a4989664d" dependencies: @@ -2046,6 +2056,10 @@ builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" +builtin-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-2.0.0.tgz#60b7ef5ae6546bd7deefa74b08b62a43a232648e" + builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" @@ -2092,6 +2106,10 @@ callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" +camelcase-css@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-1.0.1.tgz#157c4238265f5cf94a1dffde86446552cbf3f705" + camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" @@ -2111,10 +2129,6 @@ camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" -camelcase@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - can-symlink@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/can-symlink/-/can-symlink-1.0.0.tgz#97b607d8a84bb6c6e228b902d864ecb594b9d219" @@ -2139,10 +2153,6 @@ capture-exit@^1.1.0: dependencies: rsvp "^3.3.3" -capture-stack-trace@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" - cardinal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-1.0.0.tgz#50e21c1b0aa37729f9377def196b5a9cec932ee9" @@ -2292,7 +2302,7 @@ chokidar@1.7.0: optionalDependencies: fsevents "^1.0.0" -chokidar@^2.0.2: +chokidar@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" dependencies: @@ -2312,12 +2322,8 @@ chokidar@^2.0.2: fsevents "^1.2.2" chownr@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" - -ci-info@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.4.0.tgz#4841d53cad49f11b827b648ebde27a6e189b412f" + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" circular-json@^0.3.1: version "0.3.3" @@ -2357,9 +2363,9 @@ clean-css@^3.4.5: commander "2.8.x" source-map "0.4.x" -cli-boxes@^1.0.0: +clean-up-path@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + resolved "https://registry.yarnpkg.com/clean-up-path/-/clean-up-path-1.0.0.tgz#de9e8196519912e749c9eaf67c13d64fac72a3e5" cli-cursor@^1.0.1: version "1.0.2" @@ -2710,12 +2716,6 @@ cpr@^2.0.0: mkdirp "~0.5.1" rimraf "^2.5.4" -create-error-class@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" - dependencies: - capture-stack-trace "^1.0.0" - cross-spawn@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" @@ -2789,6 +2789,10 @@ css-what@2.1: version "2.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + csso@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/csso/-/csso-2.0.0.tgz#178b43a44621221c27756086f531e02f42900ee8" @@ -2826,12 +2830,6 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" -d@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" - dependencies: - es5-ext "^0.10.9" - dag-map@^2.0.1, dag-map@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/dag-map/-/dag-map-2.0.2.tgz#9714b472de82a1843de2fba9b6876938cab44c68" @@ -3066,7 +3064,7 @@ domutils@^1.5.1: dom-serializer "0" domelementtype "1" -dot-prop@^4.1.0: +dot-prop@^4.1.0, dot-prop@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" dependencies: @@ -3076,14 +3074,6 @@ dotenv@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-1.2.0.tgz#7cd73e16e07f057c8072147a5bc3a8677f0ab5c6" -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - -duplexer@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" - ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" @@ -3133,13 +3123,14 @@ ember-cli-addon-docs-esdoc@^0.2.1: tmp "^0.0.33" walk-sync "^0.3.2" -ember-cli-addon-docs@ember-learn/ember-cli-addon-docs#a61d13b9e95c7a303c9f888772d7909441e8ed6b: - version "0.5.2" - resolved "https://codeload.github.com/ember-learn/ember-cli-addon-docs/tar.gz/a61d13b9e95c7a303c9f888772d7909441e8ed6b" +ember-cli-addon-docs@ember-learn/ember-cli-addon-docs#6b11d814f2ed39b0670a49f324d385c2dfad9a99: + version "0.5.3" + resolved "https://codeload.github.com/ember-learn/ember-cli-addon-docs/tar.gz/6b11d814f2ed39b0670a49f324d385c2dfad9a99" dependencies: "@glimmer/syntax" "^0.30.5" broccoli-bridge "^1.0.0" broccoli-caching-writer "^3.0.3" + broccoli-debug "^0.6.4" broccoli-filter "^1.2.4" broccoli-funnel "^2.0.1" broccoli-merge-trees "^2.0.0" @@ -3152,13 +3143,13 @@ ember-cli-addon-docs@ember-learn/ember-cli-addon-docs#a61d13b9e95c7a303c9f888772 ember-cli-clipboard "^0.8.1" ember-cli-htmlbars "^2.0.3" ember-cli-htmlbars-inline-precompile "^1.0.2" - ember-cli-sass "7.1.3" + ember-cli-sass "7.1.7" ember-cli-string-helpers "^1.7.0" - ember-cli-tailwind "^0.4.1" + ember-cli-tailwind "^0.6.2" ember-code-snippet "^2.2.0" - ember-component-css "^0.3.5" + ember-component-css "0.6.5" ember-concurrency "^0.8.16" - ember-data "^2.18.0" + ember-data "2.x - 3.x" ember-fetch "^4.0.2" ember-fetch-adapter "^0.4.2" ember-href-to "^1.15.1" @@ -3181,10 +3172,11 @@ ember-cli-addon-docs@ember-learn/ember-cli-addon-docs#a61d13b9e95c7a303c9f888772 liquid-fire "^0.29.1" lodash "^4.17.5" lunr "^2.1.5" - marked "^0.3.12" + marked "^0.5.0" parse-git-config "^1.1.1" quick-temp "^0.1.8" resolve "^1.5.0" + sass "^1.13.2" semver "^5.5.0" striptags "^3.1.1" walk-sync "^0.3.2" @@ -3258,6 +3250,24 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.12.0, ember-cli-babel@^6.6.0, ember-cli-version-checker "^2.1.2" semver "^5.5.0" +ember-cli-babel@^6.16.0: + version "6.17.2" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.17.2.tgz#f0d53d2fb95e70c15d8db84760d045f88f458f69" + dependencies: + amd-name-resolver "1.2.0" + babel-plugin-debug-macros "^0.2.0-beta.6" + babel-plugin-ember-modules-api-polyfill "^2.5.0" + babel-plugin-transform-es2015-modules-amd "^6.24.0" + babel-polyfill "^6.26.0" + babel-preset-env "^1.7.0" + broccoli-babel-transpiler "^6.5.0" + broccoli-debug "^0.6.4" + broccoli-funnel "^2.0.0" + broccoli-source "^1.1.0" + clone "^2.0.0" + ember-cli-version-checker "^2.1.2" + semver "^5.5.0" + ember-cli-broccoli-sane-watcher@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.0.4.tgz#f43f42f75b7509c212fb926cd9aea86ae19264c6" @@ -3287,7 +3297,7 @@ ember-cli-dependency-checker@^2.0.0: resolve "^1.5.0" semver "^5.3.0" -ember-cli-deploy-build@^1.1.0: +ember-cli-deploy-build@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ember-cli-deploy-build/-/ember-cli-deploy-build-1.1.1.tgz#de515b04536a569f42626ef28aea139f32ef00e8" dependencies: @@ -3304,7 +3314,7 @@ ember-cli-deploy-git-ci@^1.0.1: execa "^0.7.0" fs-extra "^4.0.0" -ember-cli-deploy-git@^1.3.0: +ember-cli-deploy-git@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/ember-cli-deploy-git/-/ember-cli-deploy-git-1.3.3.tgz#7fdd035ad93af4016d1eecbc0a5bac35ae7da60f" dependencies: @@ -3325,7 +3335,7 @@ ember-cli-deploy-progress@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/ember-cli-deploy-progress/-/ember-cli-deploy-progress-1.3.0.tgz#18663deed25b4d5397476332f25eed3c3fdf225a" -ember-cli-deploy@^1.0.1: +ember-cli-deploy@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/ember-cli-deploy/-/ember-cli-deploy-1.0.2.tgz#9ab39188c882b57937418db5b3da6fc65b16b916" dependencies: @@ -3527,14 +3537,14 @@ ember-cli-release@^0.2.9: semver "^4.3.1" silent-error "^1.0.0" -ember-cli-sass@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/ember-cli-sass/-/ember-cli-sass-7.1.3.tgz#d4a418d68bb513c40270b88576bd2cf07301fdf2" +ember-cli-sass@7.1.7: + version "7.1.7" + resolved "http://registry.npmjs.org/ember-cli-sass/-/ember-cli-sass-7.1.7.tgz#66899134788ec8d2406a45f5346d4db47a2aa012" dependencies: broccoli-funnel "^1.0.0" broccoli-merge-trees "^1.1.0" broccoli-sass-source-maps "^2.1.0" - ember-cli-version-checker "^1.0.2" + ember-cli-version-checker "^2.1.0" ember-cli-shims@^1.2.0: version "1.2.0" @@ -3563,12 +3573,15 @@ ember-cli-string-utils@^1.0.0, ember-cli-string-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz#39b677fc2805f55173735376fcef278eaa4452a1" -ember-cli-tailwind@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/ember-cli-tailwind/-/ember-cli-tailwind-0.4.1.tgz#1d453a23ffdfe47072f0b927c88d33e8db89fa80" +ember-cli-tailwind@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/ember-cli-tailwind/-/ember-cli-tailwind-0.6.2.tgz#bbedc92df4978bd22e6065029fc178b3d3e7d3bb" dependencies: + broccoli-funnel "^2.0.1" + broccoli-merge-trees "^3.0.1" broccoli-plugin "^1.3.0" broccoli-rollup "^2.0.0" + broccoli-stew "^2.0.0" ember-cli-babel "^6.6.0" ember-cli-clipboard "^0.8.1" ember-cli-htmlbars "^2.0.1" @@ -3576,10 +3589,11 @@ ember-cli-tailwind@^0.4.1: ember-composable-helpers "^2.1.0" ember-truth-helpers "^2.0.0" fs-extra "^5.0.0" - jsdom "^11.6.2" postcss "^6.0.20" postcss-easy-import "^3.0.0" - tailwindcss "^0.4.1" + rollup-plugin-commonjs "^8.3.0" + rollup-plugin-node-resolve "^3.3.0" + tailwindcss "^0.6.1" ember-cli-test-info@^1.0.0: version "1.0.0" @@ -3606,7 +3620,7 @@ ember-cli-valid-component-name@^1.0.0: dependencies: silent-error "^1.0.0" -ember-cli-version-checker@^1.0.2, ember-cli-version-checker@^1.1.4: +ember-cli-version-checker@^1.1.4: version "1.3.1" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz#0bc2d134c830142da64bf9627a0eded10b61ae72" dependencies: @@ -3619,7 +3633,7 @@ ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0: resolve "^1.3.3" semver "^5.3.0" -ember-cli-version-checker@^2.1.2: +ember-cli-version-checker@^2.1.1, ember-cli-version-checker@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.1.2.tgz#305ce102390c66e4e0f1432dea9dc5c7c19fed98" dependencies: @@ -3726,25 +3740,33 @@ ember-code-snippet@^2.2.0: es6-promise "^1.0.0" glob "^4.0.4" -ember-component-css@^0.3.5: - version "0.3.7" - resolved "https://registry.yarnpkg.com/ember-component-css/-/ember-component-css-0.3.7.tgz#bde1a8db53116cca1a134aaf6379b2b259b79799" +ember-compatibility-helpers@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.0.2.tgz#a7eb8969747d063720fe44658af5448589b437ba" + dependencies: + babel-plugin-debug-macros "^0.1.11" + ember-cli-version-checker "^2.1.1" + semver "^5.4.1" + +ember-component-css@0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/ember-component-css/-/ember-component-css-0.6.5.tgz#b07a7e53e224f8b254a1ad3ce2f848afb87e3617" dependencies: broccoli-concat "^3.2.2" broccoli-funnel "^2.0.1" - broccoli-merge-trees "^2.0.0" + broccoli-merge-trees "^3.0.0" broccoli-persistent-filter "^1.4.2" broccoli-plugin "^1.3.0" - broccoli-style-manifest "^1.4.0" - ember-cli-babel "^6.6.0" - ember-getowner-polyfill "^2.0.1" + broccoli-style-manifest "^1.5.0" + ember-cli-babel "^6.11.0" + ember-getowner-polyfill "^2.2.0" fs-tree-diff "^0.5.6" md5 "^2.2.1" - postcss "^6.0.8" - postcss-less "^1.1.0" - postcss-scss "^1.0.2" - postcss-selector-namespace "^1.4.1" - rsvp "^4.0.1" + postcss "^6.0.19" + postcss-less "^1.1.3" + postcss-scss "^1.0.3" + postcss-selector-namespace "^1.5.0" + rsvp "^4.8.1" walk-sync "^0.3.2" ember-composable-helpers@^2.1.0: @@ -3768,39 +3790,36 @@ ember-copy@^1.0.0: dependencies: ember-cli-babel "^6.6.0" -ember-data@^2.18.0: - version "2.18.4" - resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-2.18.4.tgz#fa4162666769b930c0cc1ee6564dade3dba8d690" +"ember-data@2.x - 3.x": + version "3.4.2" + resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.4.2.tgz#675cc4f1be8df1f5c0bfe4191afa6986377721c0" dependencies: - amd-name-resolver "0.0.7" - babel-plugin-ember-modules-api-polyfill "^1.4.2" + "@ember/ordered-set" "^2.0.0" babel-plugin-feature-flags "^0.3.1" babel-plugin-filter-imports "^0.3.1" - babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel-plugin-transform-es2015-block-scoping "^6.26.0" babel6-plugin-strip-class-callcheck "^6.0.0" babel6-plugin-strip-heimdall "^6.0.1" - broccoli-babel-transpiler "^6.0.0" - broccoli-debug "^0.6.2" - broccoli-file-creator "^1.0.0" - broccoli-funnel "^1.2.0" - broccoli-merge-trees "^2.0.0" - broccoli-rollup "^1.2.0" + broccoli-debug "^0.6.4" + broccoli-file-creator "^2.1.1" + broccoli-funnel "^2.0.1" + broccoli-merge-trees "^3.0.0" + broccoli-rollup "^2.1.1" calculate-cache-key-for-tree "^1.1.0" - chalk "^1.1.1" - ember-cli-babel "^6.8.2" + chalk "^2.4.1" + ember-cli-babel "^6.16.0" ember-cli-path-utils "^1.0.0" - ember-cli-string-utils "^1.0.0" + ember-cli-string-utils "^1.1.0" ember-cli-test-info "^1.0.0" - ember-cli-version-checker "^2.1.0" - ember-inflector "^2.0.0" - ember-runtime-enumerable-includes-polyfill "^2.0.0" - exists-sync "0.0.3" - git-repo-info "^1.1.2" + ember-cli-version-checker "^2.1.2" + ember-inflector "^3.0.0" + git-repo-info "^2.0.0" heimdalljs "^0.3.0" - inflection "^1.8.0" - npm-git-info "^1.0.0" - semver "^5.1.0" - silent-error "^1.0.0" + inflection "^1.12.0" + npm-git-info "^1.0.3" + resolve "^1.8.1" + semver "^5.5.0" + silent-error "^1.1.0" ember-data@~2.13.0: version "2.13.2" @@ -3889,7 +3908,7 @@ ember-get-config@^0.2.2: broccoli-file-creator "^1.1.1" ember-cli-babel "^6.3.0" -ember-getowner-polyfill@^2.0.1: +ember-getowner-polyfill@^2.0.1, ember-getowner-polyfill@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ember-getowner-polyfill/-/ember-getowner-polyfill-2.2.0.tgz#38e7dccbcac69d5ec694000329ec0b2be651d2b2" dependencies: @@ -3922,6 +3941,12 @@ ember-inflector@^2.0.0: dependencies: ember-cli-babel "^6.0.0" +ember-inflector@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-3.0.0.tgz#7e1ee8aaa0fa773ba0905d8b7c0786354d890ee1" + dependencies: + ember-cli-babel "^6.6.0" + ember-keyboard@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/ember-keyboard/-/ember-keyboard-3.0.2.tgz#839ab5c32a6b3d3ce0b735728c1e1bc362107464" @@ -3994,7 +4019,7 @@ ember-responsive@^3.0.0-beta.1: dependencies: ember-cli-babel "^6.6.0" -ember-rfc176-data@^0.2.0, ember-rfc176-data@^0.2.7: +ember-rfc176-data@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.2.7.tgz#bd355bc9b473e08096b518784170a23388bc973b" @@ -4002,6 +4027,10 @@ ember-rfc176-data@^0.3.0, ember-rfc176-data@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.1.tgz#6a5a4b8b82ec3af34f3010965fa96b936ca94519" +ember-rfc176-data@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.5.tgz#f630e550572c81a5e5c7220f864c0f06eee9e977" + ember-router-generator@^1.0.0, ember-router-generator@^1.2.2, ember-router-generator@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-1.2.3.tgz#8ed2ca86ff323363120fc14278191e9e8f1315ee" @@ -4186,33 +4215,6 @@ error@^7.0.0: string-template "~0.2.1" xtend "~4.0.0" -es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.46" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572" - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.1" - next-tick "1" - -es6-iterator@~2.0.1, es6-iterator@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-map@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-set "~0.1.5" - es6-symbol "~3.1.1" - event-emitter "~0.3.5" - es6-promise@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-1.0.0.tgz#f90d3629faa7c26166ae4df77c89bacdeb8dca7f" @@ -4225,23 +4227,6 @@ es6-promise@^4.0.3: version "4.2.4" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" -es6-set@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-symbol "3.1.1" - event-emitter "~0.3.5" - -es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" - dependencies: - d "1" - es5-ext "~0.10.14" - escape-html@1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -4412,7 +4397,7 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" -estree-walker@^0.5.2: +estree-walker@^0.5.0, estree-walker@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.2.tgz#d3850be7529c9580d815600b53126515e146dd39" @@ -4424,25 +4409,6 @@ etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" -event-emitter@~0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - dependencies: - d "1" - es5-ext "~0.10.14" - -event-stream@~3.3.0: - version "3.3.4" - resolved "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" - dependencies: - duplexer "~0.1.1" - from "~0" - map-stream "~0.1.0" - pause-stream "0.0.11" - split "0.3" - stream-combiner "~0.0.4" - through "~2.3.1" - eventemitter3@1.x.x: version "1.2.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" @@ -5034,10 +5000,6 @@ from2@^2.1.1: inherits "^2.0.1" readable-stream "^2.0.0" -from@~0: - version "0.1.7" - resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" - fs-exists-sync@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" @@ -5110,6 +5072,14 @@ fs-extra@^5.0.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.1.tgz#8abc128f7946e310135ddc93b98bddb410e7a34b" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.0.tgz#8cc3f47ce07ef7b3593a11b9fb245f7e34c041d6" @@ -5142,6 +5112,16 @@ fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5 path-posix "^1.0.0" symlink-or-copy "^1.1.8" +fs-updater@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/fs-updater/-/fs-updater-1.0.4.tgz#2329980f99ae9176e9a0e84f7637538a182ce63b" + dependencies: + can-symlink "^1.0.0" + clean-up-path "^1.0.0" + heimdalljs "^0.2.5" + heimdalljs-logger "^0.1.9" + rimraf "^2.6.2" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -5253,6 +5233,10 @@ git-repo-info@^1.1.2, git-repo-info@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-1.4.1.tgz#2a072823254aaf62fcf0766007d7b6651bd41943" +git-repo-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-2.0.0.tgz#2e7a68ba3d0253e8e885c4138f922e6561de59bb" + git-repo-info@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-1.2.0.tgz#43d8513e04a24dd441330a2f7c6655a709fdbaf2" @@ -5340,12 +5324,6 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.4, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, gl once "^1.3.0" path-is-absolute "^1.0.0" -global-dirs@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" - dependencies: - ini "^1.3.4" - global-modules@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" @@ -5434,22 +5412,6 @@ good-listener@^1.2.2: dependencies: delegate "^3.1.2" -got@^6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" - dependencies: - create-error-class "^3.0.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - unzip-response "^2.0.1" - url-parse-lax "^1.0.0" - graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -5658,7 +5620,7 @@ heimdalljs@^0.2.0, heimdalljs@^0.2.1, heimdalljs@^0.2.3: dependencies: rsvp "~3.2.1" -heimdalljs@^0.2.6: +heimdalljs@^0.2.5, heimdalljs@^0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.2.6.tgz#b0eebabc412813aeb9542f9cc622cb58dbdcd9fe" dependencies: @@ -5795,10 +5757,6 @@ iconv-lite@^0.4.4: dependencies: safer-buffer ">= 2.1.2 < 3" -ignore-by-default@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - ignore-walk@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" @@ -5817,10 +5775,6 @@ image-size@^0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -5839,6 +5793,10 @@ indent-string@^2.1.0: dependencies: repeating "^2.0.0" +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" @@ -5985,12 +5943,6 @@ is-callable@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" -is-ci@^1.0.10: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.0.tgz#3f4a08d6303a09882cef3f0fb97439c5f5ce2d53" - dependencies: - ci-info "^1.3.0" - is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -6089,16 +6041,9 @@ is-glob@^4.0.0: dependencies: is-extglob "^2.1.1" -is-installed-globally@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" - dependencies: - global-dirs "^0.1.0" - is-path-inside "^1.0.0" - -is-npm@^1.0.0: +is-module@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" is-number@^2.1.0: version "2.1.0" @@ -6156,10 +6101,6 @@ is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" -is-redirect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - is-reference@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.1.0.tgz#50e6ef3f64c361e2c53c0416cdc9420037f2685b" @@ -6170,11 +6111,7 @@ is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" -is-retry-allowed@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" - -is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: +is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -6330,7 +6267,7 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" -jsdom@^11.11.0, jsdom@^11.12.0, jsdom@^11.6.2: +jsdom@^11.11.0, jsdom@^11.12.0: version "11.12.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" dependencies: @@ -6527,12 +6464,6 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" -latest-version@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" - dependencies: - package-json "^4.0.0" - lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" @@ -7114,10 +7045,6 @@ lower-case@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" -lowercase-keys@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - lru-cache@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" @@ -7129,6 +7056,12 @@ lunr@^2.1.5: version "2.3.2" resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.2.tgz#7164301092b2d7ab664573156f686df5c25c4185" +magic-string@^0.22.4: + version "0.22.5" + resolved "http://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e" + dependencies: + vlq "^0.2.2" + magic-string@^0.24.0: version "0.24.1" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.24.1.tgz#7e38e5f126cae9f15e71f0cf8e450818ca7d5a8f" @@ -7159,10 +7092,6 @@ map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" -map-stream@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" - map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -7203,9 +7132,9 @@ marked@0.3.6: version "0.3.6" resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" -marked@^0.3.12: - version "0.3.19" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790" +marked@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.5.1.tgz#062f43b88b02ee80901e8e8d8e6a620ddb3aa752" match-media@^0.2.0: version "0.2.0" @@ -7217,12 +7146,6 @@ matcher-collection@^1.0.0, matcher-collection@^1.0.4, matcher-collection@^1.0.5: dependencies: minimatch "^3.0.2" -md5-hex@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-1.3.0.tgz#d2c4afe983c4370662179b8cad145219135046c4" - dependencies: - md5-o-matic "^0.1.1" - md5-hex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-2.0.0.tgz#d0588e9f1c74954492ecd24ac0ac6ce997d92e33" @@ -7295,6 +7218,13 @@ merge-trees@^1.0.1: rimraf "^2.4.3" symlink-or-copy "^1.0.0" +merge-trees@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-trees/-/merge-trees-2.0.0.tgz#a560d796e566c5d9b2c40472a2967cca48d85161" + dependencies: + fs-updater "^1.0.4" + heimdalljs "^0.2.5" + merge@^1.1.3, merge@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" @@ -7546,7 +7476,7 @@ najax@^1.0.2: lodash.defaultsdeep "^4.6.0" qs "^6.2.0" -nan@^2.10.0, nan@^2.9.2: +nan@^2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" @@ -7554,6 +7484,10 @@ nan@^2.3.0: version "2.8.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" +nan@^2.9.2: + version "2.11.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.0.tgz#574e360e4d954ab16966ec102c0c049fd961a099" + nanomatch@^1.2.5: version "1.2.7" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.7.tgz#53cd4aa109ff68b7f869591fdc9d10daeeea3e79" @@ -7591,8 +7525,8 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" needle@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.2.tgz#1120ca4c41f2fcc6976fd28a8968afe239929418" + version "2.2.4" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" dependencies: debug "^2.1.2" iconv-lite "^0.4.4" @@ -7602,10 +7536,6 @@ negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" -next-tick@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - no-case@^2.2.0: version "2.3.2" resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" @@ -7723,21 +7653,6 @@ node-uuid@~1.4.0: version "1.4.8" resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" -nodemon@^1.11.0: - version "1.18.3" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.18.3.tgz#46e681ee0dd1b590562e03019b4c5df234f906f9" - dependencies: - chokidar "^2.0.2" - debug "^3.1.0" - ignore-by-default "^1.0.1" - minimatch "^3.0.4" - pstree.remy "^1.1.0" - semver "^5.5.0" - supports-color "^5.2.0" - touch "^3.1.0" - undefsafe "^2.0.2" - update-notifier "^2.3.0" - "nopt@2 || 3", nopt@^3.0.3, nopt@^3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" @@ -7751,12 +7666,6 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" -nopt@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" - dependencies: - abbrev "1" - normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" @@ -7780,7 +7689,7 @@ npm-bundled@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" -npm-git-info@^1.0.0: +npm-git-info@^1.0.0, npm-git-info@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/npm-git-info/-/npm-git-info-1.0.3.tgz#a933c42ec321e80d3646e0d6e844afe94630e1d5" @@ -8009,15 +7918,6 @@ p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" -package-json@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" - dependencies: - got "^6.7.1" - registry-auth-token "^3.0.1" - registry-url "^3.0.3" - semver "^5.1.0" - parse-bmfont-ascii@^1.0.3: version "1.0.6" resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285" @@ -8168,12 +8068,6 @@ pathval@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" -pause-stream@0.0.11: - version "0.0.11" - resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" - dependencies: - through "~2.3" - pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" @@ -8295,30 +8189,52 @@ postcss-import@^10.0.0: read-cache "^1.0.0" resolve "^1.1.7" -postcss-less@^1.1.0: +postcss-js@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-1.0.1.tgz#ffaf29226e399ea74b5dce02cab1729d7addbc7b" + dependencies: + camelcase-css "^1.0.1" + postcss "^6.0.11" + +postcss-less@^1.1.3: version "1.1.5" - resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-1.1.5.tgz#a6f0ce180cf3797eeee1d4adc0e9e6d6db665609" + resolved "http://registry.npmjs.org/postcss-less/-/postcss-less-1.1.5.tgz#a6f0ce180cf3797eeee1d4adc0e9e6d6db665609" dependencies: postcss "^5.2.16" +postcss-nested@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-3.0.0.tgz#cde40bd07a078565f3df72e2dc2665871c724852" + dependencies: + postcss "^6.0.14" + postcss-selector-parser "^3.1.1" + postcss-scss@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-0.3.1.tgz#65c610d8e2a7ee0e62b1835b71b8870734816e4b" dependencies: postcss "^5.2.4" -postcss-scss@^1.0.2: +postcss-scss@^1.0.3: version "1.0.6" resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-1.0.6.tgz#ab903f3bb20161bc177896462293a53d4bff5f7a" dependencies: postcss "^6.0.23" -postcss-selector-namespace@^1.4.1: +postcss-selector-namespace@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/postcss-selector-namespace/-/postcss-selector-namespace-1.5.0.tgz#62335de8f1992eae989d1be33ba2298156ab458b" dependencies: postcss "^6.0.14" +postcss-selector-parser@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865" + dependencies: + dot-prop "^4.1.1" + indexes-of "^1.0.1" + uniq "^1.0.1" + postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" @@ -8332,7 +8248,7 @@ postcss@^5.0.8, postcss@^5.2.16, postcss@^5.2.4: source-map "^0.5.6" supports-color "^3.2.3" -postcss@^6.0.1, postcss@^6.0.11, postcss@^6.0.14, postcss@^6.0.17, postcss@^6.0.20, postcss@^6.0.23, postcss@^6.0.8, postcss@^6.0.9: +postcss@^6.0.1, postcss@^6.0.11, postcss@^6.0.14, postcss@^6.0.17, postcss@^6.0.19, postcss@^6.0.20, postcss@^6.0.23, postcss@^6.0.9: version "6.0.23" resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" dependencies: @@ -8344,10 +8260,6 @@ prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" -prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" @@ -8419,12 +8331,6 @@ proxy-addr@~2.0.3: forwarded "~0.1.2" ipaddr.js "1.8.0" -ps-tree@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014" - dependencies: - event-stream "~3.3.0" - pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -8433,12 +8339,6 @@ psl@^1.1.24: version "1.1.28" resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.28.tgz#4fb6ceb08a1e2214d4fd4de0ca22dae13740bc7b" -pstree.remy@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.0.tgz#f2af27265bd3e5b32bbfcc10e80bac55ba78688b" - dependencies: - ps-tree "^1.1.0" - punycode@2.x.x, punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -8522,20 +8422,20 @@ raw-body@~1.1.0: bytes "1" string_decoder "0.10" -rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" +rc@^1.1.7: + version "1.2.5" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd" dependencies: - deep-extend "^0.6.0" + deep-extend "~0.4.0" ini "~1.3.0" minimist "^1.2.0" strip-json-comments "~2.0.1" -rc@^1.1.7: - version "1.2.5" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd" +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" dependencies: - deep-extend "~0.4.0" + deep-extend "^0.6.0" ini "~1.3.0" minimist "^1.2.0" strip-json-comments "~2.0.1" @@ -8695,19 +8595,6 @@ regexpu-core@^2.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" -registry-auth-token@^3.0.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" - dependencies: - rc "^1.1.6" - safe-buffer "^5.0.1" - -registry-url@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" - dependencies: - rc "^1.0.1" - regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" @@ -8985,7 +8872,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.3.2, rimraf@^2.3.4, rimraf@^2.4.1, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.1, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1: +rimraf@2, rimraf@^2.2.8, rimraf@^2.3.2, rimraf@^2.3.4, rimraf@^2.4.1, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.1, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: @@ -8995,6 +8882,24 @@ rimraf@~2.2.6: version "2.2.8" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" +rollup-plugin-commonjs@^8.3.0: + version "8.4.1" + resolved "http://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.4.1.tgz#5c9cea2b2c3de322f5fbccd147e07ed5e502d7a0" + dependencies: + acorn "^5.2.1" + estree-walker "^0.5.0" + magic-string "^0.22.4" + resolve "^1.4.0" + rollup-pluginutils "^2.0.1" + +rollup-plugin-node-resolve@^3.3.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.4.0.tgz#908585eda12e393caac7498715a01e08606abc89" + dependencies: + builtin-modules "^2.0.0" + is-module "^1.0.0" + resolve "^1.1.6" + rollup-pluginutils@^2.0.1: version "2.3.1" resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.3.1.tgz#760d185ccc237dedc12d7ae48c6bcd127b4892d0" @@ -9002,12 +8907,6 @@ rollup-pluginutils@^2.0.1: estree-walker "^0.5.2" micromatch "^2.3.11" -rollup@^0.41.4: - version "0.41.6" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.41.6.tgz#e0d05497877a398c104d816d2733a718a7a94e2a" - dependencies: - source-map-support "^0.4.0" - rollup@^0.57.1: version "0.57.1" resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.57.1.tgz#0bb28be6151d253f67cf4a00fea48fb823c74027" @@ -9036,14 +8935,14 @@ rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0. version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" -rsvp@^4.0.1, rsvp@^4.8.1, rsvp@^4.8.2, rsvp@^4.8.3: - version "4.8.3" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.3.tgz#25d4b9fdd0f95e216eb5884d9b3767d3fbfbe2cd" - rsvp@^4.6.1, rsvp@^4.7.0: version "4.8.1" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.1.tgz#168addb3963222de37ee351b70e3876bdb2ac285" +rsvp@^4.8.1, rsvp@^4.8.2, rsvp@^4.8.3: + version "4.8.3" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.3.tgz#25d4b9fdd0f95e216eb5884d9b3767d3fbfbe2cd" + rsvp@~3.0.6: version "3.0.21" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.0.21.tgz#49c588fe18ef293bcd0ab9f4e6756e6ac433359f" @@ -9129,6 +9028,12 @@ sass-graph@^2.2.4: scss-tokenizer "^0.2.3" yargs "^7.0.0" +sass@^1.13.2: + version "1.14.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.14.1.tgz#6f7b083b880104caa19e45841cdb0889d9bdadbf" + dependencies: + chokidar "^2.0.0" + sax@>=0.6.0, sax@^1.1.4, sax@^1.2.1, sax@^1.2.4, sax@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -9144,12 +9049,6 @@ select@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" -semver-diff@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" - dependencies: - semver "^5.0.3" - "semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.1.1, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" @@ -9158,10 +9057,6 @@ semver@^4.3.1: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" -semver@^5.0.3: - version "5.5.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" - semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -9421,7 +9316,7 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.4.0, source-map-support@^0.4.15: +source-map-support@^0.4.15: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" dependencies: @@ -9510,12 +9405,6 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -split@0.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" - dependencies: - through "2" - sprintf-js@^1.0.3: version "1.1.1" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c" @@ -9567,12 +9456,6 @@ stealthy-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" -stream-combiner@~0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" - dependencies: - duplexer "~0.1.1" - stream-to-array@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/stream-to-array/-/stream-to-array-2.3.0.tgz#bbf6b39f5f43ec30bc71babcb37557acecf34353" @@ -9773,17 +9656,20 @@ taffydb@2.7.2: version "2.7.2" resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.7.2.tgz#7bf8106a5c1a48251b3e3bc0a0e1732489fd0dc8" -tailwindcss@^0.4.1: - version "0.4.3" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-0.4.3.tgz#f197e6139f7b1e8a07feb05f01c4ef7d57ec090f" +tailwindcss@^0.6.1: + version "0.6.6" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-0.6.6.tgz#a8c8a8bf7d230c8bc10031672923d84af29cd34d" dependencies: commander "^2.11.0" + css.escape "^1.5.1" fs-extra "^4.0.2" - lodash "^4.17.4" - nodemon "^1.11.0" + lodash "^4.17.5" perfectionist "^2.4.0" postcss "^6.0.9" postcss-functions "^3.0.0" + postcss-js "^1.0.1" + postcss-nested "^3.0.0" + postcss-selector-parser "^3.1.1" tap-parser@^5.1.0: version "5.4.0" @@ -9834,12 +9720,6 @@ temp@0.8.3, temp@^0.8.3: os-tmpdir "^1.0.0" rimraf "~2.2.6" -term-size@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" - dependencies: - execa "^0.7.0" - testem@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/testem/-/testem-2.0.0.tgz#b05c96200c7ac98bae998d71c94c0c5345907d13" @@ -9914,7 +9794,7 @@ through2@^2.0.0, through2@^2.0.3, through2@~2.0.0: readable-stream "^2.1.5" xtend "~4.0.1" -through@2, through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.1: +through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -9922,10 +9802,6 @@ time-zone@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d" -timed-out@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - tiny-emitter@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.0.2.tgz#82d27468aca5ade8e5fd1e6d22b57dd43ebdfb7c" @@ -10031,12 +9907,6 @@ topo@2.x.x: dependencies: hoek "4.x.x" -touch@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" - dependencies: - nopt "~1.0.10" - tough-cookie@>=0.12.0, tough-cookie@>=2.3.3, tough-cookie@^2.2.0, tough-cookie@^2.3.4, tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" @@ -10162,12 +10032,6 @@ ultron@1.0.x: version "1.0.2" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" -undefsafe@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76" - dependencies: - debug "^2.2.0" - underscore.string@^3.2.2, underscore.string@~3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db" @@ -10192,6 +10056,10 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^0.4.3" +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + unique-stream@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" @@ -10226,39 +10094,14 @@ untildify@^2.1.0: dependencies: os-homedir "^1.0.0" -unzip-response@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" - upath@^1.0.5: version "1.1.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" -update-notifier@^2.3.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" - dependencies: - boxen "^1.2.1" - chalk "^2.0.1" - configstore "^3.0.0" - import-lazy "^2.1.0" - is-ci "^1.0.10" - is-installed-globally "^0.1.0" - is-npm "^1.0.0" - latest-version "^3.0.0" - semver-diff "^2.0.0" - xdg-basedir "^3.0.0" - urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - dependencies: - prepend-http "^1.0.1" - url-regex@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-3.2.0.tgz#dbad1e0c9e29e105dd0b1f09f6862f7fdb482724" @@ -10348,6 +10191,10 @@ vinyl@^1.1.0: clone-stats "^0.0.1" replace-ext "0.0.1" +vlq@^0.2.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" + w3c-hr-time@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" @@ -10469,12 +10316,6 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2" -widest-line@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.0.tgz#0142a4e8a243f8882c0233aa0e0281aa76152273" - dependencies: - string-width "^2.1.1" - window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" From f91858a5cd5fb5723eeecdaa0f08512726a69e40 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 28 Sep 2018 23:02:25 -0400 Subject: [PATCH 223/879] Tweaks --- config/addon-docs.js | 3 +++ package.json | 2 +- tests/dummy/app/templates/docs.hbs | 2 +- tests/dummy/app/templates/index.hbs | 5 +---- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/config/addon-docs.js b/config/addon-docs.js index 28590a13d..cb7d809e8 100644 --- a/config/addon-docs.js +++ b/config/addon-docs.js @@ -6,4 +6,7 @@ const AddonDocsConfig = require('ember-cli-addon-docs/lib/config'); module.exports = class extends AddonDocsConfig { // See https://ember-learn.github.io/ember-cli-addon-docs/docs/deploying // for details on configuration you can override here. + + brand: 'blue' + }; diff --git a/package.json b/package.json index d3e1a097d..822a2c9aa 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ember-cli-mirage", "version": "0.4.9", - "description": "A client-side HTTP server to develop, test and demo your Ember app", + "description": "A client-side server to help you build, test and demo your Ember app", "keywords": [ "ember-addon", "pretender", diff --git a/tests/dummy/app/templates/docs.hbs b/tests/dummy/app/templates/docs.hbs index 1cdfcfde7..3ef7e6e63 100644 --- a/tests/dummy/app/templates/docs.hbs +++ b/tests/dummy/app/templates/docs.hbs @@ -2,7 +2,7 @@ {{#viewer.nav as |nav|}} {{nav.section 'Getting started'}} - {{nav.item 'Overview' 'docs.getting-started'}} + {{nav.item 'Overview' 'docs.getting-started.index'}} {{nav.item 'Installation' 'docs.getting-started.installation'}} {{nav.item 'Quickstart' 'docs.getting-started.quickstart'}} {{nav.item 'Upgrading' 'docs.getting-started.upgrading'}} diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index fb1bd92f9..446b711e6 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -1,4 +1 @@ -{{docs-hero - logo='ember-cli' - strongHeading='Mirage' - byline='A client-side server to help you build, test and demo your app'}} +{{docs-hero}} From 07207165df0ae93f513e9328affbfd6bcb0b53a6 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 28 Sep 2018 23:20:50 -0400 Subject: [PATCH 224/879] Hm. --- addon/assert.js | 4 ++++ addon/association.js | 3 +++ addon/db.js | 4 +++- addon/index.js | 7 +++++++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/addon/assert.js b/addon/assert.js index 48d705dc2..6bab2e443 100644 --- a/addon/assert.js +++ b/addon/assert.js @@ -9,6 +9,9 @@ let errorProps = [ 'stack' ]; +/** + @hide +*/ export default function assert(bool, text) { if (typeof bool === 'string' && !text) { throw new MirageError(bool); @@ -21,6 +24,7 @@ export default function assert(bool, text) { /** @public + @hide Copied from ember-metal/error */ export function MirageError() { diff --git a/addon/association.js b/addon/association.js index 20248bfbf..656bee16d 100644 --- a/addon/association.js +++ b/addon/association.js @@ -1,3 +1,6 @@ +/** + @hide +*/ let association = function(...traitsAndOverrides) { let __isAssociation__ = true; diff --git a/addon/db.js b/addon/db.js index e7f40494f..a3eaf9179 100644 --- a/addon/db.js +++ b/addon/db.js @@ -25,8 +25,10 @@ class Db { } /** + * Foo, bar baz. + * * @method loadData - * @param data + * @param {Object} data - Data to load * @public */ loadData(data) { diff --git a/addon/index.js b/addon/index.js index bed7f9d23..e465ca412 100644 --- a/addon/index.js +++ b/addon/index.js @@ -13,9 +13,16 @@ import HasMany from './orm/associations/has-many'; import BelongsTo from './orm/associations/belongs-to'; import IdentityManager from './identity-manager'; +/** + @hide +*/ function hasMany(...args) { return new HasMany(...args); } + +/** + @hide +*/ function belongsTo(...args) { return new BelongsTo(...args); } From 33d2f30ac05dfac8b1518a36b7d8203d1e130f3e Mon Sep 17 00:00:00 2001 From: James Herdman Date: Sun, 30 Sep 2018 12:25:37 -0400 Subject: [PATCH 225/879] Update yarn.lock Yarn v1.10 is out, and it's adding "integrity" stanzas everywhere. Let's update this to make things a little less messy for everyone. --- yarn.lock | 1124 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1124 insertions(+) diff --git a/yarn.lock b/yarn.lock index d86a60245..e51edaf11 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,12 +5,14 @@ "@babel/code-frame@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" + integrity sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g== dependencies: "@babel/highlight" "7.0.0-beta.44" "@babel/generator@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" + integrity sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ== dependencies: "@babel/types" "7.0.0-beta.44" jsesc "^2.5.1" @@ -21,6 +23,7 @@ "@babel/helper-function-name@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" + integrity sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg== dependencies: "@babel/helper-get-function-arity" "7.0.0-beta.44" "@babel/template" "7.0.0-beta.44" @@ -29,18 +32,21 @@ "@babel/helper-get-function-arity@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" + integrity sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw== dependencies: "@babel/types" "7.0.0-beta.44" "@babel/helper-split-export-declaration@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" + integrity sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA== dependencies: "@babel/types" "7.0.0-beta.44" "@babel/highlight@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" + integrity sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ== dependencies: chalk "^2.0.0" esutils "^2.0.2" @@ -49,6 +55,7 @@ "@babel/template@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" + integrity sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng== dependencies: "@babel/code-frame" "7.0.0-beta.44" "@babel/types" "7.0.0-beta.44" @@ -58,6 +65,7 @@ "@babel/traverse@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" + integrity sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA== dependencies: "@babel/code-frame" "7.0.0-beta.44" "@babel/generator" "7.0.0-beta.44" @@ -73,6 +81,7 @@ "@babel/types@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" + integrity sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ== dependencies: esutils "^2.0.2" lodash "^4.2.0" @@ -81,6 +90,7 @@ "@ember/test-helpers@^0.7.17": version "0.7.17" resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-0.7.17.tgz#17ff5f1d005d8b6331585e99013d66626a8d8068" + integrity sha512-pLz4FV8IGty+9CEGttEl6clLiQkap4w7T0So8lbCb4XO38OxGfjhfz8uKpI+UH6fgaTeboh8myixqOdfXvklfA== dependencies: broccoli-funnel "^2.0.1" ember-cli-babel "^6.10.0" @@ -89,28 +99,34 @@ "@glimmer/di@^0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@glimmer/di/-/di-0.2.0.tgz#73bfd4a6ee4148a80bf092e8a5d29bcac9d4ce7e" + integrity sha1-c7/Upu5BSKgL8JLopdKbysnUzn4= "@glimmer/resolver@^0.4.1": version "0.4.2" resolved "https://registry.yarnpkg.com/@glimmer/resolver/-/resolver-0.4.2.tgz#60c9b492e90bc3956ac82b3134649bd337e1651c" + integrity sha512-OYOSn2qKPMWRTrInu4W7Ilx2q4+mFfeKS8o8SCWdGN6q/9LnRUvN3vfiAEEfpgoMSvEr8TSGw6/b2WSLWoYAAA== dependencies: "@glimmer/di" "^0.2.0" abab@^1.0.3, abab@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" + integrity sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4= abab@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" + integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== accepts@1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + integrity sha1-w8p0NJOGSMPg2cHjKN1otiLChMo= dependencies: mime-types "~2.1.11" negotiator "0.6.1" @@ -118,6 +134,7 @@ accepts@1.3.3: accepts@~1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" + integrity sha1-hiRnWMfdbSGmR0/whKR0DsBesh8= dependencies: mime-types "~2.1.16" negotiator "0.6.1" @@ -125,40 +142,48 @@ accepts@~1.3.4: acorn-globals@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" + integrity sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8= dependencies: acorn "^4.0.4" acorn-globals@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" + integrity sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ== dependencies: acorn "^5.0.0" acorn-jsx@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= dependencies: acorn "^3.0.4" acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= acorn@^4.0.4: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= acorn@^5.0.0, acorn@^5.5.3: version "5.7.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" + integrity sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ== acorn@^5.4.0: version "5.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.4.1.tgz#fdc58d9d17f4a4e98d102ded826a9b9759125102" + integrity sha512-XLmq3H/BVvW6/GbxKryGxWORz1ebilSsUDlyC27bXhWGWAZWkGwS6FLHjOlwFXNFoWFQEO/Df4u0YYd0K3BQgQ== active-model-adapter@^2.0.3: version "2.2.0" resolved "https://registry.yarnpkg.com/active-model-adapter/-/active-model-adapter-2.2.0.tgz#6885d6968574809f17f398c499b688a921c30f91" + integrity sha512-hflmeFKGiKXZtqPJ5pGbjUOCCIDWi2aFC7Q4htNi+FbLvI+8lBqjpDxiHgL82HmDF/CVVZGFQ2y0MROTxgC58g== dependencies: ember-cli-babel "^6.8.2" ember-inflector "^2.0.0" @@ -166,14 +191,17 @@ active-model-adapter@^2.0.3: after@0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/after/-/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" + integrity sha1-q11PuIP1loFtNRX495HAr0ht1ic= ajv-keywords@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" + integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= ajv@^4.9.1: version "4.11.8" resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + integrity sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY= dependencies: co "^4.6.0" json-stable-stringify "^1.0.1" @@ -181,6 +209,7 @@ ajv@^4.9.1: ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= dependencies: co "^4.6.0" fast-deep-equal "^1.0.0" @@ -190,6 +219,7 @@ ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: 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" + integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= dependencies: kind-of "^3.0.2" longest "^1.0.1" @@ -198,76 +228,92 @@ align-text@^0.1.1, align-text@^0.1.3: amd-name-resolver@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-0.0.5.tgz#76962dac876ed3311b05d29c6a58c14e1ef3304b" + integrity sha1-dpYtrIdu0zEbBdKcaljBTh7zMEs= dependencies: ensure-posix-path "^1.0.1" amd-name-resolver@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-0.0.7.tgz#814301adfe8a2f109f6e84d5e935196efb669615" + integrity sha1-gUMBrf6KLxCfboTV6TUZbvtmlhU= dependencies: ensure-posix-path "^1.0.1" amd-name-resolver@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.0.0.tgz#0e593b28d6fa3326ab1798107edaea961046e8d8" + integrity sha1-Dlk7KNb6MyarF5gQftrqlhBG6Ng= dependencies: ensure-posix-path "^1.0.1" amd-name-resolver@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.2.0.tgz#fc41b3848824b557313897d71f8d5a0184fbe679" + integrity sha512-hlSTWGS1t6/xq5YCed7YALg7tKZL3rkl7UwEZ/eCIkn8JxmM6fU6Qs/1hwtjQqfuYxlffuUcgYEm0f5xP4YKaA== dependencies: ensure-posix-path "^1.0.1" amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= ansi-escapes@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + integrity sha1-06ioOzGapneTZisT52HHkRQiMG4= ansi-escapes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" + integrity sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ== ansi-regex@^0.2.0, ansi-regex@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" + integrity sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk= ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= ansi-styles@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" + integrity sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94= ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= ansi-styles@^3.0.0, ansi-styles@^3.1.0, ansi-styles@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" + integrity sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug== dependencies: color-convert "^1.9.0" ansicolors@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" + integrity sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8= any-promise@^1.0.0, any-promise@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= anymatch@^1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== dependencies: micromatch "^2.1.5" normalize-path "^2.0.0" @@ -275,16 +321,19 @@ anymatch@^1.3.0: aot-test-generators@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/aot-test-generators/-/aot-test-generators-0.1.0.tgz#43f0f615f97cb298d7919c1b0b4e6b7310b03cd0" + integrity sha1-Q/D2Ffl8spjXkZwbC05rcxCwPNA= dependencies: jsesc "^2.5.0" aproba@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== are-we-there-yet@~1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + integrity sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0= dependencies: delegates "^1.0.0" readable-stream "^2.0.6" @@ -292,102 +341,125 @@ are-we-there-yet@~1.1.2: argparse@^1.0.7: version "1.0.9" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + integrity sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY= dependencies: sprintf-js "~1.0.2" arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= dependencies: arr-flatten "^1.0.1" arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= array-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= array-to-error@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/array-to-error/-/array-to-error-1.1.1.tgz#d68812926d14097a205579a667eeaf1856a44c07" + integrity sha1-1ogSkm0UCXogVXmmZ+6vGFakTAc= dependencies: array-to-sentence "^1.1.0" array-to-sentence@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/array-to-sentence/-/array-to-sentence-1.1.0.tgz#c804956dafa53232495b205a9452753a258d39fc" + integrity sha1-yASVba+lMjJJWyBalFJ1OiWNOfw= array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= dependencies: array-uniq "^1.0.1" array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= arraybuffer.slice@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" + integrity sha1-8zshWfBTKj8xB6JywMz70a0peco= arrify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + integrity sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y= assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= assert-plus@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + integrity sha1-104bh+ev/A24qttwIfP+SBAasjQ= assertion-error@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= ast-types@0.9.6: version "0.9.6" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" + integrity sha1-ECyenpAF0+fjgpvwxPok7oYu6bk= async-disk-cache@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/async-disk-cache/-/async-disk-cache-1.3.3.tgz#6040486660b370e4051cd9fa9fee275e1fae3728" + integrity sha512-GyaWSbDAZCltxSobtj1m1ptXa0+zSdjWs3sM4IqnvhoRwMDHW5786sXQ1RiXbR3ZGuQe6NXMB4N0vUmW163cew== dependencies: debug "^2.1.3" heimdalljs "^0.2.3" @@ -400,14 +472,17 @@ async-disk-cache@^1.2.1: async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + integrity sha1-GdOGodntxufByF04iu28xW0zYC0= async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== async-promise-queue@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/async-promise-queue/-/async-promise-queue-1.0.4.tgz#308baafbc74aff66a0bb6e7f4a18d4fe8434440c" + integrity sha512-GQ5X3DT+TefYuFPHdvIPXFTlKnh39U7dwtl+aUBGeKjMea9nBpv3c91DXgeyBQmY07vQ97f3Sr9XHqkamEameQ== dependencies: async "^2.4.1" debug "^2.6.8" @@ -415,40 +490,49 @@ async-promise-queue@^1.0.3: async@^1.4.0, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= async@^2.4.1: version "2.6.0" resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" + integrity sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw== dependencies: lodash "^4.14.0" async@~0.2.9: version "0.2.10" resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= atob@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d" + integrity sha1-GcenYEc3dEaPILLS0DNyrX1Mv10= aws-sign2@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + integrity sha1-FDQt0428yU0OW4fXY81jYSwOeU8= aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.2.1, aws4@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + integrity sha1-g+9cqGCysy5KDe7e6MdxudtXRx4= babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= dependencies: chalk "^1.1.3" esutils "^2.0.2" @@ -457,6 +541,7 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: babel-core@^6.14.0, babel-core@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" + integrity sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g= dependencies: babel-code-frame "^6.26.0" babel-generator "^6.26.0" @@ -481,6 +566,7 @@ babel-core@^6.14.0, babel-core@^6.26.0: babel-eslint@^8.2.6: version "8.2.6" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.6.tgz#6270d0c73205628067c0f7ae1693a9e797acefd9" + integrity sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA== dependencies: "@babel/code-frame" "7.0.0-beta.44" "@babel/traverse" "7.0.0-beta.44" @@ -492,6 +578,7 @@ babel-eslint@^8.2.6: babel-generator@^6.26.0: version "6.26.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== dependencies: babel-messages "^6.23.0" babel-runtime "^6.26.0" @@ -505,6 +592,7 @@ babel-generator@^6.26.0: babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= dependencies: babel-helper-explode-assignable-expression "^6.24.1" babel-runtime "^6.22.0" @@ -513,6 +601,7 @@ babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: babel-helper-call-delegate@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= dependencies: babel-helper-hoist-variables "^6.24.1" babel-runtime "^6.22.0" @@ -522,6 +611,7 @@ babel-helper-call-delegate@^6.24.1: babel-helper-define-map@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.26.0" @@ -531,6 +621,7 @@ babel-helper-define-map@^6.24.1: babel-helper-explode-assignable-expression@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= dependencies: babel-runtime "^6.22.0" babel-traverse "^6.24.1" @@ -539,6 +630,7 @@ babel-helper-explode-assignable-expression@^6.24.1: babel-helper-function-name@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= dependencies: babel-helper-get-function-arity "^6.24.1" babel-runtime "^6.22.0" @@ -549,6 +641,7 @@ babel-helper-function-name@^6.24.1: babel-helper-get-function-arity@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -556,6 +649,7 @@ babel-helper-get-function-arity@^6.24.1: babel-helper-hoist-variables@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -563,6 +657,7 @@ babel-helper-hoist-variables@^6.24.1: babel-helper-optimise-call-expression@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -570,6 +665,7 @@ babel-helper-optimise-call-expression@^6.24.1: babel-helper-regex@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= dependencies: babel-runtime "^6.26.0" babel-types "^6.26.0" @@ -578,6 +674,7 @@ babel-helper-regex@^6.24.1: babel-helper-remap-async-to-generator@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.22.0" @@ -588,6 +685,7 @@ babel-helper-remap-async-to-generator@^6.24.1: babel-helper-replace-supers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= dependencies: babel-helper-optimise-call-expression "^6.24.1" babel-messages "^6.23.0" @@ -599,6 +697,7 @@ babel-helper-replace-supers@^6.24.1: babel-helpers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= dependencies: babel-runtime "^6.22.0" babel-template "^6.24.1" @@ -606,66 +705,79 @@ babel-helpers@^6.24.1: babel-messages@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= dependencies: babel-runtime "^6.22.0" babel-plugin-check-es2015-constants@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= dependencies: babel-runtime "^6.22.0" babel-plugin-debug-macros@^0.1.10, babel-plugin-debug-macros@^0.1.11: version "0.1.11" resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.1.11.tgz#6c562bf561fccd406ce14ab04f42c218cf956605" + integrity sha512-hZw5qNNGAR02Y+yBUrtsnJHh8OXavkayPRqKGAXnIm4t5rWVpj3ArwsC7TWdpZsBguQvHAeyTxZ7s23yY60HHg== dependencies: semver "^5.3.0" babel-plugin-debug-macros@^0.2.0-beta.6: version "0.2.0-beta.6" resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.2.0-beta.6.tgz#ecdf6e408d5c863ab21740d7ad7f43f027d2f912" + integrity sha1-7N9uQI1chjqyF0DXrX9D8CfS+RI= dependencies: semver "^5.3.0" babel-plugin-ember-modules-api-polyfill@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.3.0.tgz#0c01f359658cfb9c797f705af6b09f6220205ae0" + integrity sha512-cv5ZimF5X52uW7Ul83UUxtsFZE6rZYkMv6qWnAeiDLT1/KtpVrTkJpwzDlvJ/FhKJZ43ih4GbFbhuhBKKT7vIw== dependencies: ember-rfc176-data "^0.3.0" babel-plugin-ember-modules-api-polyfill@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.3.2.tgz#56ea34bea963498d070a2b7dc2ce18a92c434093" + integrity sha512-mi9gaYasj2Bd6FYD1XCvuU1RL3n4DPn+VdOORyC2nqrvK50cLHkPaq/NdsqfxtZ0WNCIigrwnTHXU3XZI80tPg== dependencies: ember-rfc176-data "^0.3.0" babel-plugin-feature-flags@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/babel-plugin-feature-flags/-/babel-plugin-feature-flags-0.3.1.tgz#9c827cf9a4eb9a19f725ccb239e85cab02036fc1" + integrity sha1-nIJ8+aTrmhn3JcyyOehcqwIDb8E= babel-plugin-filter-imports@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-0.3.1.tgz#e7859b56886b175dd2616425d277b219e209ea8b" + integrity sha1-54WbVohrF13SYWQl0neyGeIJ6os= babel-plugin-htmlbars-inline-precompile@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.2.3.tgz#cd365e278af409bfa6be7704c4354beee742446b" + integrity sha1-zTZeJ4r0Cb+mvncExDVL7udCRGs= babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= babel-plugin-syntax-exponentiation-operator@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= babel-plugin-syntax-trailing-function-commas@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= babel-plugin-transform-async-to-generator@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= dependencies: babel-helper-remap-async-to-generator "^6.24.1" babel-plugin-syntax-async-functions "^6.8.0" @@ -674,18 +786,21 @@ babel-plugin-transform-async-to-generator@^6.22.0: babel-plugin-transform-es2015-arrow-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoping@^6.23.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= dependencies: babel-runtime "^6.26.0" babel-template "^6.26.0" @@ -696,6 +811,7 @@ babel-plugin-transform-es2015-block-scoping@^6.23.0: babel-plugin-transform-es2015-classes@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= dependencies: babel-helper-define-map "^6.24.1" babel-helper-function-name "^6.24.1" @@ -710,6 +826,7 @@ babel-plugin-transform-es2015-classes@^6.23.0: babel-plugin-transform-es2015-computed-properties@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= dependencies: babel-runtime "^6.22.0" babel-template "^6.24.1" @@ -717,12 +834,14 @@ babel-plugin-transform-es2015-computed-properties@^6.22.0: babel-plugin-transform-es2015-destructuring@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-duplicate-keys@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -730,12 +849,14 @@ babel-plugin-transform-es2015-duplicate-keys@^6.22.0: babel-plugin-transform-es2015-for-of@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-function-name@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.22.0" @@ -744,12 +865,14 @@ babel-plugin-transform-es2015-function-name@^6.22.0: babel-plugin-transform-es2015-literals@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= dependencies: babel-plugin-transform-es2015-modules-commonjs "^6.24.1" babel-runtime "^6.22.0" @@ -758,6 +881,7 @@ babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015 babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" + integrity sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo= dependencies: babel-plugin-transform-strict-mode "^6.24.1" babel-runtime "^6.26.0" @@ -767,6 +891,7 @@ babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-e babel-plugin-transform-es2015-modules-systemjs@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= dependencies: babel-helper-hoist-variables "^6.24.1" babel-runtime "^6.22.0" @@ -775,6 +900,7 @@ babel-plugin-transform-es2015-modules-systemjs@^6.23.0: babel-plugin-transform-es2015-modules-umd@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= dependencies: babel-plugin-transform-es2015-modules-amd "^6.24.1" babel-runtime "^6.22.0" @@ -783,6 +909,7 @@ babel-plugin-transform-es2015-modules-umd@^6.23.0: babel-plugin-transform-es2015-object-super@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= dependencies: babel-helper-replace-supers "^6.24.1" babel-runtime "^6.22.0" @@ -790,6 +917,7 @@ babel-plugin-transform-es2015-object-super@^6.22.0: babel-plugin-transform-es2015-parameters@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= dependencies: babel-helper-call-delegate "^6.24.1" babel-helper-get-function-arity "^6.24.1" @@ -801,6 +929,7 @@ babel-plugin-transform-es2015-parameters@^6.23.0: babel-plugin-transform-es2015-shorthand-properties@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -808,12 +937,14 @@ babel-plugin-transform-es2015-shorthand-properties@^6.22.0: babel-plugin-transform-es2015-spread@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-sticky-regex@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= dependencies: babel-helper-regex "^6.24.1" babel-runtime "^6.22.0" @@ -822,18 +953,21 @@ babel-plugin-transform-es2015-sticky-regex@^6.22.0: babel-plugin-transform-es2015-template-literals@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-typeof-symbol@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-unicode-regex@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= dependencies: babel-helper-regex "^6.24.1" babel-runtime "^6.22.0" @@ -842,6 +976,7 @@ babel-plugin-transform-es2015-unicode-regex@^6.22.0: babel-plugin-transform-exponentiation-operator@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= dependencies: babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" babel-plugin-syntax-exponentiation-operator "^6.8.0" @@ -850,12 +985,14 @@ babel-plugin-transform-exponentiation-operator@^6.22.0: babel-plugin-transform-regenerator@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= dependencies: regenerator-transform "^0.10.0" babel-plugin-transform-strict-mode@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -863,6 +1000,7 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-polyfill@^6.16.0, babel-polyfill@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= dependencies: babel-runtime "^6.26.0" core-js "^2.5.0" @@ -871,6 +1009,7 @@ babel-polyfill@^6.16.0, babel-polyfill@^6.26.0: babel-preset-env@^1.5.1: version "1.6.1" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" + integrity sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA== dependencies: babel-plugin-check-es2015-constants "^6.22.0" babel-plugin-syntax-trailing-function-commas "^6.22.0" @@ -906,6 +1045,7 @@ babel-preset-env@^1.5.1: babel-preset-env@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" + integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== dependencies: babel-plugin-check-es2015-constants "^6.22.0" babel-plugin-syntax-trailing-function-commas "^6.22.0" @@ -941,6 +1081,7 @@ babel-preset-env@^1.7.0: babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= dependencies: babel-core "^6.26.0" babel-runtime "^6.26.0" @@ -953,6 +1094,7 @@ babel-register@^6.26.0: babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= dependencies: core-js "^2.4.0" regenerator-runtime "^0.11.0" @@ -960,6 +1102,7 @@ babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: babel-template@^6.24.1, babel-template@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= dependencies: babel-runtime "^6.26.0" babel-traverse "^6.26.0" @@ -970,6 +1113,7 @@ babel-template@^6.24.1, babel-template@^6.26.0: babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= dependencies: babel-code-frame "^6.26.0" babel-messages "^6.23.0" @@ -984,6 +1128,7 @@ babel-traverse@^6.24.1, babel-traverse@^6.26.0: babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= dependencies: babel-runtime "^6.26.0" esutils "^2.0.2" @@ -993,44 +1138,54 @@ babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: babel6-plugin-strip-class-callcheck@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/babel6-plugin-strip-class-callcheck/-/babel6-plugin-strip-class-callcheck-6.0.0.tgz#de841c1abebbd39f78de0affb2c9a52ee228fddf" + integrity sha1-3oQcGr6705943gr/ssmlLuIo/d8= babel6-plugin-strip-heimdall@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/babel6-plugin-strip-heimdall/-/babel6-plugin-strip-heimdall-6.0.1.tgz#35f80eddec1f7fffdc009811dfbd46d9965072b6" + integrity sha1-NfgO3ewff//cAJgR371G2ZZQcrY= babylon@7.0.0-beta.44: version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" + integrity sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g== babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== backbone@^1.1.2: version "1.3.3" resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.3.3.tgz#4cc80ea7cb1631ac474889ce40f2f8bc683b2999" + integrity sha1-TMgOp8sWMaxHSInOQPL4vGg7KZk= dependencies: underscore ">=1.8.3" backo2@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= base64-arraybuffer@0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= base64id@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-0.1.0.tgz#02ce0fdeee0cef4f40080e1e73e834f0b1bfce3f" + integrity sha1-As4P3u4M709ACA4ec+g08LG/zj8= base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== dependencies: cache-base "^1.0.1" class-utils "^0.3.5" @@ -1043,50 +1198,60 @@ base@^0.11.1: basic-auth@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.0.tgz#015db3f353e02e56377755f962742e8981e7bbba" + integrity sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o= dependencies: safe-buffer "5.1.1" bcrypt-pbkdf@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + integrity sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40= dependencies: tweetnacl "^0.14.3" better-assert@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= dependencies: callsite "1.0.0" binary-extensions@^1.0.0: version "1.11.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" + integrity sha1-RqoXUftqL5PuXmibsQh9SxTGwgU= "binaryextensions@1 || 2": version "2.1.1" resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.1.tgz#3209a51ca4a4ad541a3b8d3d6a6d5b83a2485935" + integrity sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA== blank-object@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/blank-object/-/blank-object-1.0.2.tgz#f990793fbe9a8c8dd013fb3219420bec81d5f4b9" + integrity sha1-+ZB5P76ajI3QE/syGUIL7IHV9Lk= blob@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" + integrity sha1-vPEwUspURj8w+fx+lbmkdjCpSSE= block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= dependencies: inherits "~2.0.0" bluebird@^3.1.1, bluebird@^3.4.6: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" + integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== body-parser@1.18.2: version "1.18.2" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" + integrity sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ= dependencies: bytes "3.0.0" content-type "~1.0.4" @@ -1102,6 +1267,7 @@ body-parser@1.18.2: body@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/body/-/body-5.1.0.tgz#e4ba0ce410a46936323367609ecb4e6553125069" + integrity sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk= dependencies: continuable-cache "^0.3.1" error "^7.0.0" @@ -1111,24 +1277,28 @@ body@^5.1.0: boom@2.x.x: version "2.10.1" resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + integrity sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8= dependencies: hoek "2.x.x" boom@4.x.x: version "4.3.1" resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" + integrity sha1-T4owBctKfjiJ90kDD9JbluAdLjE= dependencies: hoek "4.x.x" boom@5.x.x: version "5.2.0" resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + integrity sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw== dependencies: hoek "4.x.x" bower-config@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/bower-config/-/bower-config-1.4.1.tgz#85fd9df367c2b8dbbd0caa4c5f2bad40cd84c2cc" + integrity sha1-hf2d82fCuNu9DKpMXyutQM2Ewsw= dependencies: graceful-fs "^4.1.3" mout "^1.0.0" @@ -1139,10 +1309,12 @@ bower-config@^1.3.0: bower-endpoint-parser@0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz#00b565adbfab6f2d35addde977e97962acbcb3f6" + integrity sha1-ALVlrb+rby01rd3pd+l5Yqy8s/Y= brace-expansion@^1.1.7: version "1.1.8" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + integrity sha1-wHshHHyVLsH479Uad+8NHTmQopI= dependencies: balanced-match "^1.0.0" concat-map "0.0.1" @@ -1150,6 +1322,7 @@ brace-expansion@^1.1.7: braces@^1.8.2: version "1.8.5" resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= dependencies: expand-range "^1.8.1" preserve "^0.2.0" @@ -1158,6 +1331,7 @@ braces@^1.8.2: braces@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.0.tgz#a46941cb5fb492156b3d6a656e06c35364e3e66e" + integrity sha512-P4O8UQRdGiMLWSizsApmXVQDBS6KCt7dSexgLKBmH5Hr1CZq7vsnscFh8oR1sP1ab1Zj0uCHCEzZeV6SfUf3rA== dependencies: arr-flatten "^1.1.0" array-unique "^0.3.2" @@ -1174,6 +1348,7 @@ braces@^2.3.0: broccoli-asset-rev@^2.4.5: version "2.6.0" resolved "https://registry.yarnpkg.com/broccoli-asset-rev/-/broccoli-asset-rev-2.6.0.tgz#0633fc3a0b2ba0c2c1d56fa9feb7b331fc83be6d" + integrity sha1-BjP8OgsroMLB1W+p/rezMfyDvm0= dependencies: broccoli-asset-rewrite "^1.1.0" broccoli-filter "^1.2.2" @@ -1184,12 +1359,14 @@ broccoli-asset-rev@^2.4.5: broccoli-asset-rewrite@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-asset-rewrite/-/broccoli-asset-rewrite-1.1.0.tgz#77a5da56157aa318c59113245e8bafb4617f8830" + integrity sha1-d6XaVhV6oxjFkRMkXouvtGF/iDA= dependencies: broccoli-filter "^1.2.3" broccoli-babel-transpiler@^6.0.0, broccoli-babel-transpiler@^6.1.2: version "6.1.4" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.1.4.tgz#8be8074c42abf2e17ff79b2d2a21df5c51143c82" + integrity sha512-h63g7iOBWdxj0GuZw8kNsyaD1T9weKsY3I+gp3rOefozbHwUesJ43vzLy0jj3t/rbiP2czcJAlyHS48EcRil8Q== dependencies: babel-core "^6.14.0" broccoli-funnel "^1.0.0" @@ -1205,6 +1382,7 @@ broccoli-babel-transpiler@^6.0.0, broccoli-babel-transpiler@^6.1.2: broccoli-babel-transpiler@^6.4.5: version "6.5.0" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.5.0.tgz#aa501a227b298a99742fdd0309b1eaad7124bba0" + integrity sha512-c5OLGY40Sdmv6rP230Jt8yoK49BHfOw1LXiDMu9EC9k2U6sqlpNRK78SzvByQ8IzKtBYUfeWCxeZHcvW+gH7VQ== dependencies: babel-core "^6.26.0" broccoli-funnel "^2.0.1" @@ -1220,12 +1398,14 @@ broccoli-babel-transpiler@^6.4.5: broccoli-brocfile-loader@^0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/broccoli-brocfile-loader/-/broccoli-brocfile-loader-0.18.0.tgz#2e86021c805c34ffc8d29a2fb721cf273e819e4b" + integrity sha1-LoYCHIBcNP/I0povtyHPJz6Bnks= dependencies: findup-sync "^0.4.2" broccoli-builder@^0.18.8: version "0.18.11" resolved "https://registry.yarnpkg.com/broccoli-builder/-/broccoli-builder-0.18.11.tgz#a42393c7b10bb0380df255a616307945f5e26efb" + integrity sha512-4Qa3uTev+adLRTEv2zO1M5dXSFCgywo8bCMxJ8vmas8q+dAIstc1eKnnymJgpejyuEJQAjgdhO1zxMQCrt03Ew== dependencies: heimdalljs "^0.2.0" promise-map-series "^0.2.1" @@ -1237,6 +1417,7 @@ broccoli-builder@^0.18.8: broccoli-caching-writer@^2.2.0: version "2.3.1" resolved "https://registry.yarnpkg.com/broccoli-caching-writer/-/broccoli-caching-writer-2.3.1.tgz#b93cf58f9264f003075868db05774f4e7f25bd07" + integrity sha1-uTz1j5Jk8AMHWGjbBXdPTn8lvQc= dependencies: broccoli-kitchen-sink-helpers "^0.2.5" broccoli-plugin "1.1.0" @@ -1248,6 +1429,7 @@ broccoli-caching-writer@^2.2.0: broccoli-caching-writer@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/broccoli-caching-writer/-/broccoli-caching-writer-3.0.3.tgz#0bd2c96a9738d6a6ab590f07ba35c5157d7db476" + integrity sha1-C9LJapc41qarWQ8HujXFFX19tHY= dependencies: broccoli-kitchen-sink-helpers "^0.3.1" broccoli-plugin "^1.2.1" @@ -1259,6 +1441,7 @@ broccoli-caching-writer@^3.0.3: broccoli-clean-css@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-clean-css/-/broccoli-clean-css-1.1.0.tgz#9db143d9af7e0ae79c26e3ac5a9bb2d720ea19fa" + integrity sha1-nbFD2a9+CuecJuOsWpuy1yDqGfo= dependencies: broccoli-persistent-filter "^1.1.6" clean-css-promise "^0.1.0" @@ -1268,6 +1451,7 @@ broccoli-clean-css@^1.1.0: broccoli-concat@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.2.2.tgz#86ffdc52606eb590ba9f6b894c5ec7a016f5b7b9" + integrity sha1-hv/cUmButZC6n2uJTF7HoBb1t7k= dependencies: broccoli-kitchen-sink-helpers "^0.3.1" broccoli-plugin "^1.3.0" @@ -1285,12 +1469,14 @@ broccoli-concat@^3.2.2: broccoli-config-loader@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/broccoli-config-loader/-/broccoli-config-loader-1.0.1.tgz#d10aaf8ebc0cb45c1da5baa82720e1d88d28c80a" + integrity sha512-MDKYQ50rxhn+g17DYdfzfEM9DjTuSGu42Db37A8TQHQe8geYEcUZ4SQqZRgzdAI3aRQNlA1yBHJfOeGmOjhLIg== dependencies: broccoli-caching-writer "^3.0.3" broccoli-config-replace@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/broccoli-config-replace/-/broccoli-config-replace-1.1.2.tgz#6ea879d92a5bad634d11329b51fc5f4aafda9c00" + integrity sha1-bqh52SpbrWNNETKbUfxfSq/anAA= dependencies: broccoli-kitchen-sink-helpers "^0.3.1" broccoli-plugin "^1.2.0" @@ -1300,6 +1486,7 @@ broccoli-config-replace@^1.1.2: broccoli-debug@^0.6.1, broccoli-debug@^0.6.2, broccoli-debug@^0.6.3, broccoli-debug@^0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.4.tgz#986eb3d2005e00e3bb91f9d0a10ab137210cd150" + integrity sha512-CixMUndBqTljCc26i6ubhBrGbAWXpWBsGJFce6ZOr76Tul2Ev1xxM0tmf7OjSzdYhkr5BrPd/CNbR9VMPi+NBg== dependencies: broccoli-plugin "^1.2.1" fs-tree-diff "^0.5.2" @@ -1311,6 +1498,7 @@ broccoli-debug@^0.6.1, broccoli-debug@^0.6.2, broccoli-debug@^0.6.3, broccoli-de broccoli-file-creator@^1.0.0, broccoli-file-creator@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/broccoli-file-creator/-/broccoli-file-creator-1.1.1.tgz#1b35b67d215abdfadd8d49eeb69493c39e6c3450" + integrity sha1-GzW2fSFavfrdjUnutpSTw55sNFA= dependencies: broccoli-kitchen-sink-helpers "~0.2.0" broccoli-plugin "^1.1.0" @@ -1322,6 +1510,7 @@ broccoli-file-creator@^1.0.0, broccoli-file-creator@^1.1.1: broccoli-filter@^1.2.2, broccoli-filter@^1.2.3: version "1.2.4" resolved "https://registry.yarnpkg.com/broccoli-filter/-/broccoli-filter-1.2.4.tgz#409afb94b9a3a6da9fac8134e91e205f40cc7330" + integrity sha1-QJr7lLmjptqfrIE06R4gX0DMczA= dependencies: broccoli-kitchen-sink-helpers "^0.3.1" broccoli-plugin "^1.0.0" @@ -1336,10 +1525,12 @@ broccoli-filter@^1.2.2, broccoli-filter@^1.2.3: broccoli-funnel-reducer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/broccoli-funnel-reducer/-/broccoli-funnel-reducer-1.0.0.tgz#11365b2a785aec9b17972a36df87eef24c5cc0ea" + integrity sha1-ETZbKnha7JsXlyo234fu8kxcwOo= broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.2, broccoli-funnel@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-1.2.0.tgz#cddc3afc5ff1685a8023488fff74ce6fb5a51296" + integrity sha1-zdw6/F/xaFqAI0iP/3TOb7WlEpY= dependencies: array-equal "^1.0.0" blank-object "^1.0.1" @@ -1359,6 +1550,7 @@ broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.2, broccoli broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-2.0.1.tgz#6823c73b675ef78fffa7ab800f083e768b51d449" + integrity sha512-C8Lnp9TVsSSiZMGEF16C0dCiNg2oJqUKwuZ1K4kVC6qRPG/2Cj/rtB5kRCC9qEbwqhX71bDbfHROx0L3J7zXQg== dependencies: array-equal "^1.0.0" blank-object "^1.0.1" @@ -1377,6 +1569,7 @@ broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1: broccoli-kitchen-sink-helpers@^0.2.5, broccoli-kitchen-sink-helpers@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz#a5e0986ed8d76fb5984b68c3f0450d3a96e36ecc" + integrity sha1-peCYbtjXb7WYS2jD8EUNOpbjbsw= dependencies: glob "^5.0.10" mkdirp "^0.5.1" @@ -1384,6 +1577,7 @@ broccoli-kitchen-sink-helpers@^0.2.5, broccoli-kitchen-sink-helpers@~0.2.0: broccoli-kitchen-sink-helpers@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.3.1.tgz#77c7c18194b9664163ec4fcee2793444926e0c06" + integrity sha1-d8fBgZS5ZkFj7E/O4nk0RJJuDAY= dependencies: glob "^5.0.10" mkdirp "^0.5.1" @@ -1391,6 +1585,7 @@ broccoli-kitchen-sink-helpers@^0.3.1: broccoli-lint-eslint@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/broccoli-lint-eslint/-/broccoli-lint-eslint-4.2.1.tgz#f780dc083a7357a9746a9cfa8f76feb092777477" + integrity sha512-Jvm06UvuMPa5gEH+9/Sb+QpoIodDAYzbyIUEqxniPCdA6JJooa91hQDCTJc32RUV46JNMcLhb3Dl55BdA8v5mw== dependencies: aot-test-generators "^0.1.0" broccoli-concat "^3.2.2" @@ -1403,6 +1598,7 @@ broccoli-lint-eslint@^4.2.1: broccoli-merge-trees@^1.0.0, broccoli-merge-trees@^1.1.0, broccoli-merge-trees@^1.1.1: version "1.2.4" resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-1.2.4.tgz#a001519bb5067f06589d91afa2942445a2d0fdb5" + integrity sha1-oAFRm7UGfwZYnZGvopQkRaLQ/bU= dependencies: broccoli-plugin "^1.3.0" can-symlink "^1.0.0" @@ -1416,6 +1612,7 @@ broccoli-merge-trees@^1.0.0, broccoli-merge-trees@^1.1.0, broccoli-merge-trees@^ broccoli-merge-trees@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-2.0.0.tgz#10aea46dd5cebcc8b8f7d5a54f0a84a4f0bb90b9" + integrity sha1-EK6kbdXOvMi499WlTwqEpPC7kLk= dependencies: broccoli-plugin "^1.3.0" merge-trees "^1.0.1" @@ -1423,6 +1620,7 @@ broccoli-merge-trees@^2.0.0: broccoli-middleware@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/broccoli-middleware/-/broccoli-middleware-1.0.0.tgz#92f4e1fb9a791ea986245a7077f35cc648dab097" + integrity sha1-kvTh+5p5HqmGJFpwd/NcxkjasJc= dependencies: handlebars "^4.0.4" mime "^1.2.11" @@ -1430,10 +1628,12 @@ broccoli-middleware@^1.0.0: broccoli-node-info@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-1.1.0.tgz#3aa2e31e07e5bdb516dd25214f7c45ba1c459412" + integrity sha1-OqLjHgflvbUW3SUhT3xFuhxFlBI= broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.4.0, broccoli-persistent-filter@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.3.tgz#3511bc52fc53740cda51621f58a28152d9911bc1" + integrity sha512-JwNLDvvXJlhUmr+CHcbVhCyp33NbCIAITjQZmJY9e8QzANXh3jpFWlhSFvkWghwKA8rTAKcXkW12agtiZjxr4g== dependencies: async-disk-cache "^1.2.1" async-promise-queue "^1.0.3" @@ -1452,6 +1652,7 @@ broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-p broccoli-plugin@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.1.0.tgz#73e2cfa05f8ea1e3fc1420c40c3d9e7dc724bf02" + integrity sha1-c+LPoF+OoeP8FCDEDD2efcckvwI= dependencies: promise-map-series "^0.2.1" quick-temp "^0.1.3" @@ -1461,6 +1662,7 @@ broccoli-plugin@1.1.0: broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli-plugin@^1.2.1, broccoli-plugin@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.0.tgz#bee704a8e42da08cb58e513aaa436efb7f0ef1ee" + integrity sha1-vucEqOQtoIy1jlE6qkNu+38O8e4= dependencies: promise-map-series "^0.2.1" quick-temp "^0.1.3" @@ -1470,20 +1672,24 @@ broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli broccoli-slow-trees@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-2.0.0.tgz#9741afe992787add64aec7f7c8211dfcc058278d" + integrity sha1-l0Gv6ZJ4et1krsf3yCEd/MBYJ40= broccoli-slow-trees@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-3.0.1.tgz#9bf2a9e2f8eb3ed3a3f2abdde988da437ccdc9b4" + integrity sha1-m/Kp4vjrPtOj8qvd6YjaQ3zNybQ= dependencies: heimdalljs "^0.2.1" broccoli-source@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-source/-/broccoli-source-1.1.0.tgz#54f0e82c8b73f46580cbbc4f578f0b32fca8f809" + integrity sha1-VPDoLItz9GWAy7xPV48LMvyo+Ak= broccoli-sri-hash@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/broccoli-sri-hash/-/broccoli-sri-hash-2.1.2.tgz#bc69905ed7a381ad325cc0d02ded071328ebf3f3" + integrity sha1-vGmQXtejga0yXMDQLe0HEyjr8/M= dependencies: broccoli-caching-writer "^2.2.0" mkdirp "^0.5.1" @@ -1494,6 +1700,7 @@ broccoli-sri-hash@^2.1.0: broccoli-stew@^1.2.0, broccoli-stew@^1.3.3, broccoli-stew@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-1.5.0.tgz#d7af8c18511dce510e49d308a62e5977f461883c" + integrity sha1-16+MGFEdzlEOSdMIpi5Zd/RhiDw= dependencies: broccoli-debug "^0.6.1" broccoli-funnel "^1.0.1" @@ -1513,6 +1720,7 @@ broccoli-stew@^1.2.0, broccoli-stew@^1.3.3, broccoli-stew@^1.5.0: broccoli-string-replace@^0.1.1, broccoli-string-replace@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/broccoli-string-replace/-/broccoli-string-replace-0.1.2.tgz#1ed92f85680af8d503023925e754e4e33676b91f" + integrity sha1-HtkvhWgK+NUDAjkl51Tk4zZ2uR8= dependencies: broccoli-persistent-filter "^1.1.5" minimatch "^3.0.3" @@ -1520,6 +1728,7 @@ broccoli-string-replace@^0.1.1, broccoli-string-replace@^0.1.2: broccoli-test-helper@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/broccoli-test-helper/-/broccoli-test-helper-1.3.0.tgz#ba673418b3963b2cc466be66092a5928700c827f" + integrity sha512-IhFjcETHOSDAXY8afLLcihdXbAgcQ2b3lp9nZ5saYzoXJvt/1RMUlCm8JxKKPU7aHqpNXMVaj5lm4Is+4xh/qA== dependencies: broccoli "^1.1.0" fixturify "^0.3.2" @@ -1531,6 +1740,7 @@ broccoli-test-helper@^1.3.0: broccoli-uglify-sourcemap@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/broccoli-uglify-sourcemap/-/broccoli-uglify-sourcemap-2.0.2.tgz#f4a73112f1f56b46043e2e89cba5ce7762cddeb3" + integrity sha512-Fe+qUlPC4gHG7ojQOaRSRrCbrI2niYNAfrZqLkPEXHCi8UtwEqMHBAK6AZylN7ve/0CkGNSxKhCm7ELeeJRI+A== dependencies: broccoli-plugin "^1.2.1" debug "^3.1.0" @@ -1545,12 +1755,14 @@ broccoli-uglify-sourcemap@^2.0.0: broccoli-unwatched-tree@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/broccoli-unwatched-tree/-/broccoli-unwatched-tree-0.1.3.tgz#ab0fb820f613845bf67a803baad820f68b1e3aae" + integrity sha1-qw+4IPYThFv2eoA7qtgg9oseOq4= dependencies: broccoli-source "^1.1.0" broccoli-writer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/broccoli-writer/-/broccoli-writer-0.1.1.tgz#d4d71aa8f2afbc67a3866b91a2da79084b96ab2d" + integrity sha1-1NcaqPKvvGejhmuRotp5CEuWqy0= dependencies: quick-temp "^0.1.0" rsvp "^3.0.6" @@ -1558,6 +1770,7 @@ broccoli-writer@~0.1.1: broccoli@^1.1.0: version "1.1.4" resolved "https://registry.yarnpkg.com/broccoli/-/broccoli-1.1.4.tgz#b023b028b866f447ed14341007961efd03f7251c" + integrity sha1-sCOwKLhm9EftFDQQB5Ye/QP3JRw= dependencies: broccoli-node-info "1.1.0" broccoli-slow-trees "2.0.0" @@ -1578,14 +1791,17 @@ broccoli@^1.1.0: browser-process-hrtime@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" + integrity sha1-Ql1opY00R/AqBKqJQYf86K+Le44= browser-stdout@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + integrity sha1-81HTKWnTL6XXpVZxVCY9korjvR8= browserslist@^2.1.2: version "2.11.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" + integrity sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA== dependencies: caniuse-lite "^1.0.30000792" electron-to-chromium "^1.3.30" @@ -1593,6 +1809,7 @@ browserslist@^2.1.2: browserslist@^3.2.6: version "3.2.8" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== dependencies: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" @@ -1600,32 +1817,39 @@ browserslist@^3.2.6: bser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + integrity sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk= dependencies: node-int64 "^0.4.0" buffer-from@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" + integrity sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ== builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= bytes@1: version "1.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8" + integrity sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g= bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== dependencies: collection-visit "^1.0.0" component-emitter "^1.2.1" @@ -1640,26 +1864,31 @@ cache-base@^1.0.1: calculate-cache-key-for-tree@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-1.1.0.tgz#0c3e42c9c134f3c9de5358c0f16793627ea976d6" + integrity sha1-DD5CycE088neU1jA8WeTYn6pdtY= dependencies: json-stable-stringify "^1.0.1" caller-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= dependencies: callsites "^0.2.0" callsite@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= dependencies: camelcase "^2.0.0" map-obj "^1.0.0" @@ -1667,34 +1896,41 @@ camelcase-keys@^2.0.0: camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= can-symlink@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/can-symlink/-/can-symlink-1.0.0.tgz#97b607d8a84bb6c6e228b902d864ecb594b9d219" + integrity sha1-l7YH2KhLtsbiKLkC2GTstZS50hk= dependencies: tmp "0.0.28" caniuse-lite@^1.0.30000792: version "1.0.30000803" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000803.tgz#9939c37149d38d5f4540430490d240c03106a0f5" + integrity sha512-AoROHIFLv2iv5CG4nonOfT9ZCQ3JTN0GyEn8LG2sPb2Wc5cIyX/UwLYP0pnVajVF3LWH+mrO/DXBzmte0BK9cQ== caniuse-lite@^1.0.30000844: version "1.0.30000865" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25" + integrity sha512-vs79o1mOSKRGv/1pSkp4EXgl4ZviWeYReXw60XfacPU64uQWZwJT6vZNmxRF9O+6zu71sJwMxLK5JXxbzuVrLw== capture-exit@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" + integrity sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28= dependencies: rsvp "^3.3.3" cardinal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-1.0.0.tgz#50e21c1b0aa37729f9377def196b5a9cec932ee9" + integrity sha1-UOIcGwqjdyn5N33vGWtanOyTLuk= dependencies: ansicolors "~0.2.1" redeyed "~1.0.0" @@ -1702,10 +1938,12 @@ cardinal@^1.0.0: caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= center-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= dependencies: align-text "^0.1.3" lazy-cache "^1.0.3" @@ -1713,6 +1951,7 @@ center-align@^0.1.1: chai@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" + integrity sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw= dependencies: assertion-error "^1.0.1" check-error "^1.0.1" @@ -1724,6 +1963,7 @@ chai@^4.1.0: chalk@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" + integrity sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ= dependencies: ansi-styles "^1.1.0" escape-string-regexp "^1.0.0" @@ -1734,6 +1974,7 @@ chalk@^0.5.1: chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -1744,6 +1985,7 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" + integrity sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q== dependencies: ansi-styles "^3.1.0" escape-string-regexp "^1.0.5" @@ -1752,6 +1994,7 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: chalk@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796" + integrity sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g== dependencies: ansi-styles "^3.2.0" escape-string-regexp "^1.0.5" @@ -1760,20 +2003,24 @@ chalk@^2.3.0: chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= charm@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/charm/-/charm-1.0.2.tgz#8add367153a6d9a581331052c4090991da995e35" + integrity sha1-it02cVOm2aWBMxBSxAkJkdqZXjU= dependencies: inherits "^2.0.1" check-error@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= chokidar@1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= dependencies: anymatch "^1.3.0" async-each "^1.0.0" @@ -1789,10 +2036,12 @@ chokidar@1.7.0: circular-json@^0.3.1: version "0.3.3" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== dependencies: arr-union "^3.1.0" define-property "^0.2.5" @@ -1802,10 +2051,12 @@ class-utils@^0.3.5: clean-base-url@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clean-base-url/-/clean-base-url-1.0.0.tgz#c901cf0a20b972435b0eccd52d056824a4351b7b" + integrity sha1-yQHPCiC5ckNbDszVLQVoJKQ1G3s= clean-css-promise@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/clean-css-promise/-/clean-css-promise-0.1.1.tgz#43f3d2c8dfcb2bf071481252cd9b76433c08eecb" + integrity sha1-Q/PSyN/LK/BxSBJSzZt2QzwI7ss= dependencies: array-to-error "^1.0.0" clean-css "^3.4.5" @@ -1814,6 +2065,7 @@ clean-css-promise@^0.1.0: clean-css@^3.4.5: version "3.4.28" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.4.28.tgz#bf1945e82fc808f55695e6ddeaec01400efd03ff" + integrity sha1-vxlF6C/ICPVWlebd6uwBQA79A/8= dependencies: commander "2.8.x" source-map "0.4.x" @@ -1821,22 +2073,26 @@ clean-css@^3.4.5: cli-cursor@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc= dependencies: restore-cursor "^1.0.1" cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= dependencies: restore-cursor "^2.0.0" cli-spinners@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.1.0.tgz#f1847b168844d917a671eb9d147e3df497c90d06" + integrity sha1-8YR7FohE2RemceudFH499JfJDQY= cli-table2@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/cli-table2/-/cli-table2-0.2.0.tgz#2d1ef7f218a0e786e214540562d4bd177fe32d97" + integrity sha1-LR738hig54biFFQFYtS9F3/jLZc= dependencies: lodash "^3.10.1" string-width "^1.0.1" @@ -1846,16 +2102,19 @@ cli-table2@^0.2.0: cli-table@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + integrity sha1-9TsFJmqLGguTSz0IIebi3FkUriM= dependencies: colors "1.0.3" cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= cliui@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= dependencies: center-align "^0.1.1" right-align "^0.1.1" @@ -1864,18 +2123,22 @@ cliui@^2.1.0: clone@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" + integrity sha1-0hfR6WERjjrJpLi7oyhVU79kfNs= co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= dependencies: map-visit "^1.0.0" object-visit "^1.0.0" @@ -1883,86 +2146,104 @@ collection-visit@^1.0.0: color-convert@^1.9.0: version "1.9.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" + integrity sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ== dependencies: color-name "^1.1.1" color-name@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= colors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= colors@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= combined-stream@^1.0.5, combined-stream@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + integrity sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk= dependencies: delayed-stream "~1.0.0" commander@2.12.2: version "2.12.2" resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555" + integrity sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA== commander@2.8.x: version "2.8.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" + integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ= dependencies: graceful-readlink ">= 1.0.0" commander@2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q= dependencies: graceful-readlink ">= 1.0.0" commander@^2.5.0: version "2.16.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" + integrity sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew== commander@^2.6.0: version "2.14.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.0.tgz#7b25325963e6aace20d3a9285b09379b0c2208b5" + integrity sha512-okPpdvdJr6mUGi2XzupC+irQxzwGLVaBzacFC14hjLv8NColXEsxsU+QaeuSSXpQUak5g2K0vQ7WjA1e8svczg== commander@~2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== common-tags@^1.4.0: version "1.7.2" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.7.2.tgz#24d9768c63d253a56ecff93845b44b4df1d52771" + integrity sha512-joj9ZlUOjCrwdbmiLqafeUSgkUM74NqhLsZtSqDmhKudaIY197zTrb8JMl31fMnCUuxwFT23eC/oWvrZzDLRJQ== dependencies: babel-runtime "^6.26.0" component-bind@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= component-emitter@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" + integrity sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM= component-emitter@1.2.1, component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= component-inherit@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= compressible@~2.0.11: version "2.0.12" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.12.tgz#c59a5c99db76767e9876500e271ef63b3493bd66" + integrity sha1-xZpcmdt2dn6YdlAOJx72OzSTvWY= dependencies: mime-db ">= 1.30.0 < 2" compression@^1.4.4: version "1.7.1" resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.1.tgz#eff2603efc2e22cf86f35d2eb93589f9875373db" + integrity sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s= dependencies: accepts "~1.3.4" bytes "3.0.0" @@ -1975,10 +2256,12 @@ compression@^1.4.4: concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= concat-stream@^1.4.7, concat-stream@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + integrity sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc= dependencies: inherits "^2.0.3" readable-stream "^2.2.2" @@ -1987,6 +2270,7 @@ concat-stream@^1.4.7, concat-stream@^1.6.0: configstore@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" + integrity sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw== dependencies: dot-prop "^4.1.0" graceful-fs "^4.1.2" @@ -1998,6 +2282,7 @@ configstore@^3.0.0: connect@^3.3.3: version "3.6.6" resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" + integrity sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ= dependencies: debug "2.6.9" finalhandler "1.1.0" @@ -2007,10 +2292,12 @@ connect@^3.3.3: console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= console-ui@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/console-ui/-/console-ui-2.1.0.tgz#e1d5279d27621a75123d7d594f9fa59f866ea3e3" + integrity sha512-/FqFHRwYVjjdeLd/1lhRsyoPCMtDMREJfPU6WCN9LMxPWu3++Cr2wN1uIZfbefVwr59is4UBd6Z2vaJRzTyPWQ== dependencies: chalk "^2.1.0" inquirer "^2" @@ -2022,72 +2309,88 @@ console-ui@^2.0.0: consolidate@^0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.14.5.tgz#5a25047bc76f73072667c8cb52c989888f494c63" + integrity sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM= dependencies: bluebird "^3.1.1" content-disposition@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= content-type-parser@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" + integrity sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ== content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== continuable-cache@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f" + integrity sha1-vXJ6f67XfnH/OYWskzUakSczrQ8= convert-source-map@^1.5.0, convert-source-map@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + integrity sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU= cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= cookie@0.3.1, cookie@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= copy-dereference@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/copy-dereference/-/copy-dereference-1.0.0.tgz#6b131865420fd81b413ba994b44d3655311152b6" + integrity sha1-axMYZUIP2BtBO6mUtE02VTERUrY= copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js@^2.4.0, core-js@^2.5.0: version "2.5.3" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" + integrity sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4= core-object@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/core-object/-/core-object-1.1.0.tgz#86d63918733cf9da1a5aae729e62c0a88e66ad0a" + integrity sha1-htY5GHM8+doaWq5ynmLAqI5mrQo= core-object@^2.0.6: version "2.1.1" resolved "https://registry.yarnpkg.com/core-object/-/core-object-2.1.1.tgz#4b7a5f1edefcb1e6d0dcb58eab1b9f90bfc666a8" + integrity sha1-S3pfHt78sebQ3LWOqxufkL/GZqg= dependencies: chalk "^1.1.3" core-object@^3.1.3: version "3.1.5" resolved "https://registry.yarnpkg.com/core-object/-/core-object-3.1.5.tgz#fa627b87502adc98045e44678e9a8ec3b9c0d2a9" + integrity sha512-sA2/4+/PZ/KV6CKgjrVrrUVBKCkdDO02CUlQ0YKTQoYUwPYNOtOAcWlbYhd5v/1JqYaA6oZ4sDlOU4ppVw6Wbg== dependencies: chalk "^2.0.0" core-util-is@1.0.2, 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" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= cpr@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cpr/-/cpr-2.2.0.tgz#2dc6c87dfb78012489cdd994227628c320e9a17b" + integrity sha512-q8UoWzIT9rslJKb3Y5CcByzR2zX7GBkVcoU6jJx02d/BgbE7zJ8Aix74i7bw3iYk58TrgXhmB2XB0aGaBd7oZA== dependencies: graceful-fs "^4.1.5" minimist "^1.2.0" @@ -2097,6 +2400,7 @@ cpr@^2.0.0: cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= dependencies: lru-cache "^4.0.1" shebang-command "^1.2.0" @@ -2105,54 +2409,64 @@ cross-spawn@^5.0.1, cross-spawn@^5.1.0: cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + integrity sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g= dependencies: boom "2.x.x" cryptiles@3.x.x: version "3.1.2" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" + integrity sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4= dependencies: boom "5.x.x" crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": version "0.3.2" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + integrity sha1-uANhcMefB6kP8vFuIihAJ6JDhIs= "cssstyle@>= 0.2.37 < 0.3.0": version "0.2.37" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + integrity sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ= dependencies: cssom "0.3.x" cssstyle@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.0.0.tgz#79b16d51ec5591faec60e688891f15d2a5705129" + integrity sha512-Bpuh47j2mRMY60X90mXaJAEtJwxvA2roZzbgwAXYhMbmwmakdRr4Cq9L5SkleKJNLOKqHIa2YWyOXDX3VgggSQ== dependencies: cssom "0.3.x" currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= dependencies: array-find-index "^1.0.1" dag-map@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/dag-map/-/dag-map-2.0.2.tgz#9714b472de82a1843de2fba9b6876938cab44c68" + integrity sha1-lxS0ct6CoYQ94vuptodpOMq0TGg= dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= dependencies: assert-plus "^1.0.0" data-urls@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f" + integrity sha512-ai40PPQR0Fn1lD2PPie79CibnlMN2AYiDhwFX/rZHVsxbs5kNJSjegqXIprhouGXlRdEnfybva7kqRGnB6mypA== dependencies: abab "^1.0.4" whatwg-mimetype "^2.0.0" @@ -2161,70 +2475,83 @@ data-urls@^1.0.0: debug@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + integrity sha1-+HBX6ZWxofauaklgZkE3vFbwOdo= dependencies: ms "0.7.1" debug@2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" + integrity sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w= dependencies: ms "0.7.2" debug@2.6.8: version "2.6.8" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + integrity sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw= dependencies: ms "2.0.0" debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.4.0, debug@^2.6.8, debug@~2.6.7: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" debug@^3.0.0, debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" decamelize@^1.0.0, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= deep-eql@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== dependencies: type-detect "^4.0.0" deep-extend@~0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + integrity sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8= deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= dependencies: is-descriptor "^1.0.0" del@^2.0.2: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= dependencies: globby "^5.0.0" is-path-cwd "^1.0.0" @@ -2237,100 +2564,121 @@ del@^2.0.2: delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= depd@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + integrity sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k= depd@~1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= detect-file@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" + integrity sha1-STXe39lIhkjgBrASlWbpOGcR6mM= dependencies: fs-exists-sync "^0.1.0" detect-file@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= dependencies: repeating "^2.0.0" detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= diff@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + integrity sha1-yc45Okt8vQsFinJck98pkCeGj/k= diff@^3.2.0: version "3.4.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" + integrity sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA== doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" domexception@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== dependencies: webidl-conversions "^4.0.2" dot-prop@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== dependencies: is-obj "^1.0.0" ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + integrity sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU= dependencies: jsbn "~0.1.0" editions@^1.1.1: version "1.3.4" resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" + integrity sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg== ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= electron-to-chromium@^1.3.30: version "1.3.32" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.32.tgz#11d0684c0840e003c4be8928f8ac5f35dbc2b4e6" + integrity sha1-EdBoTAhA4APEvoko+KxfNdvCtOY= electron-to-chromium@^1.3.47: version "1.3.52" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0" + integrity sha1-0tnxJwuko7lnuDHEDvcftNmrXOA= ember-ajax@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-3.0.0.tgz#8f21e9da0c1d433cf879aa855fce464d517e9ab5" + integrity sha1-jyHp2gwdQzz4eaqFX85GTVF+mrU= dependencies: ember-cli-babel "^6.0.0" ember-cli-addon-tests@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/ember-cli-addon-tests/-/ember-cli-addon-tests-0.7.1.tgz#6959c4cce1a9d16a4852465e2b2bed4bf26b46ec" + integrity sha1-aVnEzOGp0WpIUkZeKyvtS/JrRuw= dependencies: chalk "^2.0.1" cpr "^2.0.0" @@ -2349,6 +2697,7 @@ ember-cli-addon-tests@^0.7.0: ember-cli-app-version@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-cli-app-version/-/ember-cli-app-version-2.1.0.tgz#149101d4fd0d97875e12ec5e61ff105f508e5e2d" + integrity sha1-FJEB1P0Nl4deEuxeYf8QX1COXi0= dependencies: ember-cli-babel "^6.8.0" git-repo-version "0.4.1" @@ -2356,6 +2705,7 @@ ember-cli-app-version@^2.0.0: ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2, ember-cli-babel@^6.9.0: version "6.11.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.11.0.tgz#79cb184bac3c05bfe181ddc306bac100ab1f9493" + integrity sha512-lHQyl30lbAsMmMq2it1GO85HKrqr2gMpK5CFxmOgTJ3moBqOGMKsdV3Z0qXWpgh8Asy7pB9AACMShdgfQvSGPg== dependencies: amd-name-resolver "0.0.7" babel-plugin-debug-macros "^0.1.11" @@ -2374,6 +2724,7 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-babel@^6.7.2: version "6.16.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.16.0.tgz#623b4a2764ece72b65f1572fc8aeb5714a450228" + integrity sha512-rzWkVdKVk2KSbQ81TxmLli+LWdBEqF+FHE83rUQXVOV4FguJDtP1w2AW08f8QjuztbnQ5+VUGCb7H0dL8UwOVw== dependencies: amd-name-resolver "1.2.0" babel-plugin-debug-macros "^0.2.0-beta.6" @@ -2392,6 +2743,7 @@ ember-cli-babel@^6.7.2: ember-cli-broccoli-sane-watcher@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.0.4.tgz#f43f42f75b7509c212fb926cd9aea86ae19264c6" + integrity sha1-9D9C91t1CcIS+5Js2a6oauGSZMY= dependencies: broccoli-slow-trees "^3.0.1" heimdalljs "^0.2.1" @@ -2402,6 +2754,7 @@ ember-cli-broccoli-sane-watcher@^2.0.4: ember-cli-dependency-checker@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-2.1.0.tgz#9d66286a7c778e94733eaf21320d129c4fd0dd64" + integrity sha1-nWYoanx3jpRzPq8hMg0SnE/Q3WQ= dependencies: chalk "^1.1.3" is-git-url "^1.0.0" @@ -2411,6 +2764,7 @@ ember-cli-dependency-checker@^2.0.0: ember-cli-eslint@^4.2.1: version "4.2.3" resolved "https://registry.yarnpkg.com/ember-cli-eslint/-/ember-cli-eslint-4.2.3.tgz#2844d3f5e8184f19b2d7132ba99eb0b370b55598" + integrity sha512-1fqRz9QVLTT790Zr07aDFmAprZ1vVsaBGJOGQgDEFmBpogq8BeaQopaxogWFp748hol8nGC4QP5tbzhVD6KQHw== dependencies: broccoli-lint-eslint "^4.2.1" ember-cli-version-checker "^2.1.0" @@ -2420,6 +2774,7 @@ ember-cli-eslint@^4.2.1: ember-cli-fastboot@^1.1.4-beta.1: version "1.1.4-beta.1" resolved "https://registry.yarnpkg.com/ember-cli-fastboot/-/ember-cli-fastboot-1.1.4-beta.1.tgz#7063df36e62b92fd0f60c9a23dd03b5b57aec3fe" + integrity sha512-Jx9txTOGX0wgbg3d6N5oy2PSI9FI31tg4KiMY5vtXL3GuEi0S+HLCvh/w+INy+Ka3WLFcjutCdow23VL4gzDoQ== dependencies: broccoli-concat "^3.2.2" broccoli-funnel "^2.0.0" @@ -2441,14 +2796,17 @@ ember-cli-fastboot@^1.1.4-beta.1: ember-cli-get-component-path-option@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-get-component-path-option/-/ember-cli-get-component-path-option-1.0.0.tgz#0d7b595559e2f9050abed804f1d8eff1b08bc771" + integrity sha1-DXtZVVni+QUKvtgE8djv8bCLx3E= ember-cli-get-dependency-depth@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-get-dependency-depth/-/ember-cli-get-dependency-depth-1.0.0.tgz#e0afecf82a2d52f00f28ab468295281aec368d11" + integrity sha1-4K/s+CotUvAPKKtGgpUoGuw2jRE= ember-cli-htmlbars-inline-precompile@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-1.0.2.tgz#5b544f664d5d9911f08cd979c5f70d8cb0ca2add" + integrity sha1-W1RPZk1dmRHwjNl5xfcNjLDKKt0= dependencies: babel-plugin-htmlbars-inline-precompile "^0.2.3" ember-cli-version-checker "^2.0.0" @@ -2459,6 +2817,7 @@ ember-cli-htmlbars-inline-precompile@^1.0.0: ember-cli-htmlbars@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.3.tgz#e116e1500dba12f29c94b05b9ec90f52cb8bb042" + integrity sha512-oyWtJebOwxAqWZwMc0NKFJ8FJdxVixM7zl0FaXq1vTAG6bOgnU7yAhXEASlaO5f+PptZueZfOpdpvRwZW/Gk1A== dependencies: broccoli-persistent-filter "^1.0.3" hash-for-dep "^1.0.2" @@ -2468,14 +2827,17 @@ ember-cli-htmlbars@^2.0.1: ember-cli-inject-live-reload@^1.4.1: version "1.7.0" resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-1.7.0.tgz#af94336e015336127dfb98080ad442bb233e37ed" + integrity sha512-+0zOwJlf4iR5NcvyeU7E7xU1qDfniP/+mXfNTfAEhHO2eE9sjQvasKV84O1sIIyLk2LMIjFPbGt7uv5fQcIGwg== ember-cli-is-package-missing@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-is-package-missing/-/ember-cli-is-package-missing-1.0.0.tgz#6e6184cafb92635dd93ca6c946b104292d4e3390" + integrity sha1-bmGEyvuSY13ZPKbJRrEEKS1OM5A= ember-cli-legacy-blueprints@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/ember-cli-legacy-blueprints/-/ember-cli-legacy-blueprints-0.2.1.tgz#480f37cb83f1eda2d46bbc7d07c59ea2e8ce9b84" + integrity sha1-SA83y4Px7aLUa7x9B8WeoujOm4Q= dependencies: chalk "^2.3.0" ember-cli-get-component-path-option "^1.0.0" @@ -2498,14 +2860,17 @@ ember-cli-legacy-blueprints@^0.2.0: ember-cli-lodash-subset@2.0.1, ember-cli-lodash-subset@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-2.0.1.tgz#20cb68a790fe0fde2488ddfd8efbb7df6fe766f2" + integrity sha1-IMtop5D+D94kiN39jvu332/nZvI= ember-cli-lodash-subset@^1.0.7: version "1.0.12" resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-1.0.12.tgz#af2e77eba5dcb0d77f3308d3a6fd7d3450f6e537" + integrity sha1-ry5366XcsNd/MwjTpv19NFD25Tc= ember-cli-node-assets@^0.1.4: version "0.1.6" resolved "https://registry.yarnpkg.com/ember-cli-node-assets/-/ember-cli-node-assets-0.1.6.tgz#6488a2949048c801ad6d9e33753c7bce32fc1146" + integrity sha1-ZIiilJBIyAGtbZ4zdTx7zjL8EUY= dependencies: broccoli-funnel "^1.0.1" broccoli-merge-trees "^1.1.1" @@ -2517,16 +2882,19 @@ ember-cli-node-assets@^0.1.4: ember-cli-normalize-entity-name@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-normalize-entity-name/-/ember-cli-normalize-entity-name-1.0.0.tgz#0b14f7bcbc599aa117b5fddc81e4fd03c4bad5b7" + integrity sha1-CxT3vLxZmqEXtf3cgeT9A8S61bc= dependencies: silent-error "^1.0.0" ember-cli-path-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-path-utils/-/ember-cli-path-utils-1.0.0.tgz#4e39af8b55301cddc5017739b77a804fba2071ed" + integrity sha1-Tjmvi1UwHN3FAXc5t3qAT7ogce0= ember-cli-preprocess-registry@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/ember-cli-preprocess-registry/-/ember-cli-preprocess-registry-3.1.1.tgz#38456c21c4d2b64945850cf9ec68db6ba769288a" + integrity sha1-OEVsIcTStklFhQz57Gjba6dpKIo= dependencies: broccoli-clean-css "^1.1.0" broccoli-funnel "^1.0.0" @@ -2540,6 +2908,7 @@ ember-cli-preprocess-registry@^3.1.0: ember-cli-qunit@^4.1.1: version "4.3.1" resolved "https://registry.yarnpkg.com/ember-cli-qunit/-/ember-cli-qunit-4.3.1.tgz#fcbf3585392299b27de26e57d0cf9f9049a76181" + integrity sha1-/L81hTkimbJ94m5X0M+fkEmnYYE= dependencies: ember-cli-babel "^6.11.0" ember-qunit "^3.3.1" @@ -2547,6 +2916,7 @@ ember-cli-qunit@^4.1.1: ember-cli-release@^0.2.9: version "0.2.9" resolved "https://registry.yarnpkg.com/ember-cli-release/-/ember-cli-release-0.2.9.tgz#5e8de3d034c65597933748023058470ec1231adb" + integrity sha1-Xo3j0DTGVZeTN0gCMFhHDsEjGts= dependencies: chalk "^1.0.0" git-tools "^0.1.4" @@ -2561,6 +2931,7 @@ ember-cli-release@^0.2.9: ember-cli-shims@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/ember-cli-shims/-/ember-cli-shims-1.2.0.tgz#0f53aff0aab80b5f29da3a9731bac56169dd941f" + integrity sha1-D1Ov8Kq4C18p2jqXMbrFYWndlB8= dependencies: broccoli-file-creator "^1.1.1" broccoli-merge-trees "^2.0.0" @@ -2571,28 +2942,33 @@ ember-cli-shims@^1.2.0: ember-cli-sri@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ember-cli-sri/-/ember-cli-sri-2.1.1.tgz#971620934a4b9183cf7923cc03e178b83aa907fd" + integrity sha1-lxYgk0pLkYPPeSPMA+F4uDqpB/0= dependencies: broccoli-sri-hash "^2.1.0" ember-cli-string-utils@^1.0.0, ember-cli-string-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz#39b677fc2805f55173735376fcef278eaa4452a1" + integrity sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE= ember-cli-test-info@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-test-info/-/ember-cli-test-info-1.0.0.tgz#ed4e960f249e97523cf891e4aed2072ce84577b4" + integrity sha1-7U6WDySel1I8+JHkrtIHLOhFd7Q= dependencies: ember-cli-string-utils "^1.0.0" ember-cli-test-loader@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ember-cli-test-loader/-/ember-cli-test-loader-2.2.0.tgz#3fb8d5d1357e4460d3f0a092f5375e71b6f7c243" + integrity sha512-mlSXX9SciIRwGkFTX6XGyJYp4ry6oCFZRxh5jJ7VH8UXLTNx2ZACtDTwaWtNhYrWXgKyiDUvmD8enD56aePWRA== dependencies: ember-cli-babel "^6.8.1" ember-cli-uglify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ember-cli-uglify/-/ember-cli-uglify-2.0.0.tgz#b096727d7d1718acc9bfe5d1bc81ce26cafdf6ca" + integrity sha1-sJZyfX0XGKzJv+XRvIHOJsr99so= dependencies: broccoli-uglify-sourcemap "^2.0.0" lodash.defaultsdeep "^4.6.0" @@ -2600,18 +2976,21 @@ ember-cli-uglify@^2.0.0: ember-cli-valid-component-name@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-valid-component-name/-/ember-cli-valid-component-name-1.0.0.tgz#71550ce387e0233065f30b30b1510aa2dfbe87ef" + integrity sha1-cVUM44fgIzBl8wswsVEKot++h+8= dependencies: silent-error "^1.0.0" ember-cli-version-checker@^1.1.4: version "1.3.1" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz#0bc2d134c830142da64bf9627a0eded10b61ae72" + integrity sha1-C8LRNMgwFC2mS/lieg7e0QthrnI= dependencies: semver "^5.3.0" ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.1.0.tgz#fc79a56032f3717cf844ada7cbdec1a06fedb604" + integrity sha512-ssiNyVTp+PphroFum8guHX9py4xU1PCxkRYgb25NxumgjpKTPjhkgTfpRRKXlIQe+/wVMmhf+Uv6w9vSLZKWKQ== dependencies: resolve "^1.3.3" semver "^5.3.0" @@ -2619,6 +2998,7 @@ ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0: ember-cli-version-checker@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.1.2.tgz#305ce102390c66e4e0f1432dea9dc5c7c19fed98" + integrity sha512-sjkHGr4IGXnO3EUcY21380Xo9Qf6bC8HWH4D62bVnrQop/8uha5XgMQRoAflMCeH6suMrezQL287JUoYc2smEw== dependencies: resolve "^1.3.3" semver "^5.3.0" @@ -2626,6 +3006,7 @@ ember-cli-version-checker@^2.1.2: ember-cli@~2.18.2: version "2.18.2" resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-2.18.2.tgz#bb15313a15139a85248a86d203643f918ba40f57" + integrity sha1-uxUxOhUTmoUkiobSA2Q/kYukD1c= dependencies: amd-name-resolver "1.0.0" babel-plugin-transform-es2015-modules-amd "^6.24.0" @@ -2715,6 +3096,7 @@ ember-cli@~2.18.2: ember-data@~2.13.0: version "2.13.2" resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-2.13.2.tgz#151c93ad5152885d4ca50b1942d7c66e15865c74" + integrity sha1-FRyTrVFSiF1MpQsZQtfGbhWGXHQ= dependencies: amd-name-resolver "0.0.5" babel-plugin-feature-flags "^0.3.1" @@ -2743,16 +3125,19 @@ ember-data@~2.13.0: ember-disable-prototype-extensions@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/ember-disable-prototype-extensions/-/ember-disable-prototype-extensions-1.1.3.tgz#1969135217654b5e278f9fe2d9d4e49b5720329e" + integrity sha1-GWkTUhdlS14nj5/i2dTkm1cgMp4= ember-export-application-global@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ember-export-application-global/-/ember-export-application-global-2.0.0.tgz#8d6d7619ac8a1a3f8c43003549eb21ebed685bd2" + integrity sha1-jW12GayKGj+MQwA1Sesh6+1oW9I= dependencies: ember-cli-babel "^6.0.0-beta.7" ember-fastboot-addon-tests@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/ember-fastboot-addon-tests/-/ember-fastboot-addon-tests-0.4.0.tgz#05f89f2cc4bd53d6abd6d952bbdde7c8af03a6f7" + integrity sha1-BfifLMS9U9ar1tlSu93nyK8Dpvc= dependencies: chalk "^1.1.3" core-object "^2.0.6" @@ -2770,6 +3155,7 @@ ember-fastboot-addon-tests@^0.4.0: ember-get-config@^0.2.2: version "0.2.4" resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.2.4.tgz#118492a2a03d73e46004ed777928942021fe1ecd" + integrity sha1-EYSSoqA9c+RgBO13eSiUICH+Hs0= dependencies: broccoli-file-creator "^1.1.1" ember-cli-babel "^6.3.0" @@ -2777,18 +3163,21 @@ ember-get-config@^0.2.2: ember-inflector@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-2.1.0.tgz#afcb92d022a4eab58f08ff4578eafc3a1de2d09b" + integrity sha512-o7X+MdPuMgH6GGP8JsZ6mr+WYiCcymzjPLr0ct2IUw4lh1EwVtmePuY6fBLuWmyQE1nJq4smDyNoOCE74n3f7g== dependencies: ember-cli-babel "^6.0.0" ember-load-initializers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-1.0.0.tgz#4919eaf06f6dfeca7e134633d8c05a6c9921e6e7" + integrity sha1-SRnq8G9t/sp+E0Yz2MBabJkh5uc= dependencies: ember-cli-babel "^6.0.0-beta.7" ember-lodash@^4.17.3: version "4.18.0" resolved "https://registry.yarnpkg.com/ember-lodash/-/ember-lodash-4.18.0.tgz#45de700d6a4f68f1cd62888d90b50aa6477b9a83" + integrity sha1-Rd5wDWpPaPHNYoiNkLUKpkd7moM= dependencies: broccoli-debug "^0.6.1" broccoli-funnel "^2.0.1" @@ -2800,6 +3189,7 @@ ember-lodash@^4.17.3: ember-qunit@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-3.3.1.tgz#8d68ef30cfd6f2acbf1d0f4e368439642e726903" + integrity sha512-ZRQCDitCx4aLKKIvQEIfeFKHAWOkqwT4xg2E0fAbP4yptCJKPz/pCf0G0suW6YFpx7zI3qsbXKVZMeOGbqbmfw== dependencies: "@ember/test-helpers" "^0.7.17" broccoli-funnel "^2.0.1" @@ -2812,6 +3202,7 @@ ember-qunit@^3.3.1: ember-resolver@^4.0.0: version "4.5.0" resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-4.5.0.tgz#9248bf534dfc197fafe3118fff538d436078bf99" + integrity sha512-BX8yvFWIbrh1IVZmpIY/14WUb7nD8tQzT5s0aUG/Nwq2LVqD/uNAEPcsq0XS2gLvKawwDQEQN30ptcvJApQBhA== dependencies: "@glimmer/resolver" "^0.4.1" babel-plugin-debug-macros "^0.1.10" @@ -2824,20 +3215,24 @@ ember-resolver@^4.0.0: ember-rfc176-data@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.2.7.tgz#bd355bc9b473e08096b518784170a23388bc973b" + integrity sha512-pJE2w+sI22UDsYmudI4nCp3WcImpUzXwe9qHfpOcEu3yM/HD1nGpDRt6kZD0KUnDmqkLeik/nYyzEwN/NU6xxA== ember-rfc176-data@^0.3.0, ember-rfc176-data@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.1.tgz#6a5a4b8b82ec3af34f3010965fa96b936ca94519" + integrity sha512-u+W5rUvYO7xyKJjiPuCM7bIAvFyPwPTJ66fOZz1xuCv3AyReI9Oev5oOADOO6YJZk+vEn0xWiZ9N6zSf8WU7Fg== ember-router-generator@^1.0.0, ember-router-generator@^1.2.2, ember-router-generator@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-1.2.3.tgz#8ed2ca86ff323363120fc14278191e9e8f1315ee" + integrity sha1-jtLKhv8yM2MSD8FCeBkeno8TFe4= dependencies: recast "^0.11.3" ember-runtime-enumerable-includes-polyfill@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-runtime-enumerable-includes-polyfill/-/ember-runtime-enumerable-includes-polyfill-2.1.0.tgz#dc6d4a028471e4acc350dfd2a149874fb20913f5" + integrity sha512-au18iI8VbEDYn3jLFZzETnKN5ciPgCUxMRucEP3jkq7qZ6sE0FVKpWMPY/h9tTND3VOBJt6fgPpEBJoJVCUudg== dependencies: ember-cli-babel "^6.9.0" ember-cli-version-checker "^2.1.0" @@ -2845,6 +3240,7 @@ ember-runtime-enumerable-includes-polyfill@^2.0.0: ember-source@~2.18.0: version "2.18.1" resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-2.18.1.tgz#bc02fc809f9e9b68d63e790aa3fac16bc6242bd5" + integrity sha1-vAL8gJ+em2jWPnkKo/rBa8YkK9U= dependencies: broccoli-funnel "^2.0.1" broccoli-merge-trees "^2.0.0" @@ -2864,6 +3260,7 @@ ember-source@~2.18.0: ember-try-config@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ember-try-config/-/ember-try-config-2.2.0.tgz#6be0af6c71949813e02ac793564fddbf8336b807" + integrity sha1-a+CvbHGUmBPgKseTVk/dv4M2uAc= dependencies: lodash "^4.6.1" node-fetch "^1.3.3" @@ -2873,6 +3270,7 @@ ember-try-config@^2.2.0: ember-try@^0.2.15: version "0.2.23" resolved "https://registry.yarnpkg.com/ember-try/-/ember-try-0.2.23.tgz#39b57141b4907541d0ac8b503d211e6946b08718" + integrity sha512-kmVNsSFFafGinFhERMox3SXHoU+V1td1538SbhpslPtf7S2BZYr7JdAwOCIRoRtpcWeNdYgdQGzJZxNvUc8aLg== dependencies: chalk "^1.0.0" cli-table2 "^0.2.0" @@ -2890,16 +3288,19 @@ ember-try@^0.2.15: encodeurl@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= encoding@^0.1.11: version "0.1.12" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= dependencies: iconv-lite "~0.4.13" engine.io-client@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.0.tgz#7b730e4127414087596d9be3c88d2bc5fdb6cf5c" + integrity sha1-e3MOQSdBQIdZbZvjyI0rxf22z1w= dependencies: component-emitter "1.2.1" component-inherit "0.0.3" @@ -2917,6 +3318,7 @@ engine.io-client@1.8.0: engine.io-parser@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.1.tgz#9554f1ae33107d6fbd170ca5466d2f833f6a07cf" + integrity sha1-lVTxrjMQfW+9FwylRm0vgz9qB88= dependencies: after "0.8.1" arraybuffer.slice "0.0.6" @@ -2928,6 +3330,7 @@ engine.io-parser@1.3.1: engine.io@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.0.tgz#3eeb5f264cb75dbbec1baaea26d61f5a4eace2aa" + integrity sha1-PutfJky3XbvsG6rqJtYfWk6s4qo= dependencies: accepts "1.3.3" base64id "0.1.0" @@ -2939,20 +3342,24 @@ engine.io@1.8.0: ensure-posix-path@^1.0.0, ensure-posix-path@^1.0.1, ensure-posix-path@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.0.2.tgz#a65b3e42d0b71cfc585eb774f9943c8d9b91b0c2" + integrity sha1-pls+QtC3HPxYXrd0+ZQ8jZuRsMI= entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + integrity sha1-blwtClYhtdra7O+AuQ7ftc13cvA= error-ex@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + integrity sha1-+FWobOYa3E6GIcPNoh56dhLDqNw= dependencies: is-arrayish "^0.2.1" error@^7.0.0: version "7.0.2" resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02" + integrity sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI= dependencies: string-template "~0.2.1" xtend "~4.0.0" @@ -2960,14 +3367,17 @@ error@^7.0.0: escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= escape-string-regexp@1.0.5, escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escodegen@^1.6.1: version "1.9.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852" + integrity sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw== dependencies: esprima "^3.1.3" estraverse "^4.2.0" @@ -2979,6 +3389,7 @@ escodegen@^1.6.1: escodegen@^1.9.1: version "1.11.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" + integrity sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw== dependencies: esprima "^3.1.3" estraverse "^4.2.0" @@ -2990,12 +3401,14 @@ escodegen@^1.9.1: eslint-plugin-ember-suave@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-plugin-ember-suave/-/eslint-plugin-ember-suave-1.0.0.tgz#ea7d232a126562dcd8b1ee3aa2700ac3b626e514" + integrity sha1-6n0jKhJlYtzYse46onAKw7Ym5RQ= dependencies: requireindex "~1.1.0" eslint-plugin-ember@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-5.0.3.tgz#9f5e2048ab3ddc1548d4d17bf318cf1bb5cf37f1" + integrity sha512-wPq2N96YQR2/Ob2LfuLQV8BEotHXxiFcuBiHikN8P+2VGzxBeuydafXy/pExuTsU2RHfPiSgyBHavKGy1DYdrQ== dependencies: ember-rfc176-data "^0.2.7" require-folder-tree "^1.4.5" @@ -3004,6 +3417,7 @@ eslint-plugin-ember@^5.0.0: eslint-plugin-node@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-6.0.1.tgz#bf19642298064379315d7a4b2a75937376fa05e4" + integrity sha512-Q/Cc2sW1OAISDS+Ji6lZS2KV4b7ueA/WydVWd1BECTQwVvfQy5JAi3glhINoKzoMnfnuRgNP+ZWKrGAbp3QDxw== dependencies: ignore "^3.3.6" minimatch "^3.0.4" @@ -3013,6 +3427,7 @@ eslint-plugin-node@^6.0.1: eslint-scope@3.7.1, eslint-scope@^3.7.1: version "3.7.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug= dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" @@ -3020,10 +3435,12 @@ eslint-scope@3.7.1, eslint-scope@^3.7.1: eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== eslint@^4.0.0: version "4.17.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.17.0.tgz#dc24bb51ede48df629be7031c71d9dc0ee4f3ddf" + integrity sha512-AyxBUCANU/o/xC0ijGMKavo5Ls3oK6xykiOITlMdjFjrKOsqLrA7Nf5cnrDgcKrHzBirclAZt63XO7YZlVUPwA== dependencies: ajv "^5.3.0" babel-code-frame "^6.22.0" @@ -3066,6 +3483,7 @@ eslint@^4.0.0: espree@^3.5.2: version "3.5.3" resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.3.tgz#931e0af64e7fbbed26b050a29daad1fc64799fa6" + integrity sha512-Zy3tAJDORxQZLl2baguiRU1syPERAIg0L+JB2MWorORgTu/CplzvxS9WWA7Xh4+Q+eOQihNs/1o1Xep8cvCxWQ== dependencies: acorn "^5.4.0" acorn-jsx "^3.0.0" @@ -3073,24 +3491,29 @@ espree@^3.5.2: esprima@^3.1.3, esprima@~3.1.0: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= esprima@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + integrity sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw== esprima@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.0.0.tgz#53cf247acda77313e551c3aa2e73342d3fb4f7d9" + integrity sha1-U88kes2ncxPlUcOqLnM0LT+099k= esquery@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" + integrity sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo= dependencies: estraverse "^4.0.0" esrecurse@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" + integrity sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM= dependencies: estraverse "^4.1.0" object-assign "^4.0.1" @@ -3098,26 +3521,32 @@ esrecurse@^4.1.0: estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= eventemitter3@1.x.x: version "1.2.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" + integrity sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg= events-to-array@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/events-to-array/-/events-to-array-1.1.2.tgz#2d41f563e1fe400ed4962fe1a4d5c6a7539df7f6" + integrity sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y= exec-file-sync@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/exec-file-sync/-/exec-file-sync-2.0.2.tgz#58d441db46e40de6d1f30de5be022785bd89e328" + integrity sha1-WNRB20bkDebR8w3lvgInhb2J4yg= dependencies: is-obj "^1.0.0" object-assign "^4.0.1" @@ -3126,12 +3555,14 @@ exec-file-sync@^2.0.0: exec-sh@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" + integrity sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg== dependencies: merge "^1.1.3" execa@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" + integrity sha1-2NdrvBtVIX7RkP1t1J08d07PyNo= dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" @@ -3144,6 +3575,7 @@ execa@^0.8.0: execa@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.9.0.tgz#adb7ce62cf985071f60580deb4a88b9e34712d01" + integrity sha512-BbUMBiX4hqiHZUA5+JujIjNb6TyAlp2D5KLheMjMluwOuzcnylDL4AxZYLLn1n2AGB49eSWwyKvvEQoRpnAtmA== dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" @@ -3156,32 +3588,39 @@ execa@^0.9.0: exists-stat@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/exists-stat/-/exists-stat-1.0.0.tgz#0660e3525a2e89d9e446129440c272edfa24b529" + integrity sha1-BmDjUlouidnkRhKUQMJy7foktSk= exists-sync@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.3.tgz#b910000bedbb113b378b82f5f5a7638107622dcf" + integrity sha1-uRAAC+27ETs3i4L19adjgQdiLc8= exists-sync@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.4.tgz#9744c2c428cc03b01060db454d4b12f0ef3c8879" + integrity sha1-l0TCxCjMA7AQYNtFTUsS8O88iHk= exit-hook@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g= exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= dependencies: is-posix-bracket "^0.1.0" expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= dependencies: debug "^2.3.3" define-property "^0.2.5" @@ -3194,24 +3633,28 @@ expand-brackets@^2.1.4: expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= dependencies: fill-range "^2.1.0" expand-tilde@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" + integrity sha1-C4HrqJflo9MdHD0QL48BRB5VlEk= dependencies: os-homedir "^1.0.1" expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= dependencies: homedir-polyfill "^1.0.1" express@^4.10.7, express@^4.12.3: version "4.16.2" resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" + integrity sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w= dependencies: accepts "~1.3.4" array-flatten "1.1.1" @@ -3247,12 +3690,14 @@ express@^4.10.7, express@^4.12.3: extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" @@ -3260,10 +3705,12 @@ extend-shallow@^3.0.0: extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + integrity sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ= external-editor@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-1.1.1.tgz#12d7b0db850f7ff7e7081baf4005700060c4600b" + integrity sha1-Etew24UPf/fnCBuvQAVwAGDEYAs= dependencies: extend "^3.0.0" spawn-sync "^1.0.15" @@ -3272,6 +3719,7 @@ external-editor@^1.1.0: external-editor@^2.0.4: version "2.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" + integrity sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA== dependencies: chardet "^0.4.0" iconv-lite "^0.4.17" @@ -3280,12 +3728,14 @@ external-editor@^2.0.4: extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= dependencies: is-extglob "^1.0.0" extglob@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== dependencies: array-unique "^0.3.2" define-property "^1.0.0" @@ -3299,40 +3749,49 @@ extglob@^2.0.2: extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= extsprintf@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= fake-xml-http-request@^1.4.0, fake-xml-http-request@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-1.6.0.tgz#bd0ac79ae3e2660098282048a12c730a6f64d550" + integrity sha512-99XPwwSg89BfzPuv4XCpZxn3EbauMCgAQCxq9MzrvS6DFD73OON6AnUTicL4A0HZtYMBwCZBWVnRqGjZDgQkTg== faker@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/faker/-/faker-3.1.0.tgz#0f908faf4e6ec02524e54a57e432c5c013e08c9f" + integrity sha1-D5CPr05uwCUk5UpX5DLFwBPgjJ8= fast-deep-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + integrity sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8= fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fast-ordered-set@^1.0.0, fast-ordered-set@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/fast-ordered-set/-/fast-ordered-set-1.0.3.tgz#3fbb36634f7be79e4f7edbdb4a357dee25d184eb" + integrity sha1-P7s2Y097555PftvbSjV97iXRhOs= dependencies: blank-object "^1.0.1" fast-sourcemap-concat@^1.0.1: version "1.2.3" resolved "https://registry.yarnpkg.com/fast-sourcemap-concat/-/fast-sourcemap-concat-1.2.3.tgz#22f14e92d739e37920334376ec8433bf675eaa04" + integrity sha1-IvFOktc543kgM0N27IQzv2deqgQ= dependencies: chalk "^0.5.1" fs-extra "^0.30.0" @@ -3347,6 +3806,7 @@ fast-sourcemap-concat@^1.0.1: fastboot-express-middleware@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/fastboot-express-middleware/-/fastboot-express-middleware-1.2.0.tgz#3f32fb21d8d01ad7c0c7d876b278601665ea17fa" + integrity sha1-PzL7IdjQGtfAx9h2snhgFmXqF/o= dependencies: chalk "^2.0.1" fastboot "^1.2.0" @@ -3355,6 +3815,7 @@ fastboot-express-middleware@^1.1.0: fastboot-transform@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/fastboot-transform/-/fastboot-transform-0.1.3.tgz#7dea0b117594afd8772baa6c9b0919644e7f7dcd" + integrity sha512-6otygPIJw1ARp1jJb+6KVO56iKBjhO+5x59RSC9qiZTbZRrv+HZAuP00KD3s+nWMvcFDemtdkugki9DNFTTwCQ== dependencies: broccoli-stew "^1.5.0" convert-source-map "^1.5.1" @@ -3362,6 +3823,7 @@ fastboot-transform@^0.1.2: fastboot@^1.1.4-beta.1, fastboot@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-1.2.0.tgz#35c5747db1943d082f2ba619226d16cd7281e946" + integrity sha1-NcV0fbGUPQgvK6YZIm0WzXKB6UY= dependencies: chalk "^2.0.1" cookie "^0.3.1" @@ -3375,24 +3837,28 @@ fastboot@^1.1.4-beta.1, fastboot@^1.2.0: faye-websocket@~0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= dependencies: websocket-driver ">=0.5.1" fb-watchman@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= dependencies: bser "^2.0.0" figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= dependencies: escape-string-regexp "^1.0.5" file-entry-cache@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= dependencies: flat-cache "^1.2.1" object-assign "^4.0.1" @@ -3400,14 +3866,17 @@ file-entry-cache@^2.0.0: filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= filesize@^3.1.3: version "3.6.0" resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.0.tgz#22d079615624bb6fd3c04026120628a41b3f4efa" + integrity sha512-g5OWtoZWcPI56js1DFhIEqyG9tnu/7sG3foHwgS9KGYFMfsYguI3E+PRVCmtmE96VajQIEMRU2OhN+ME589Gdw== fill-range@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + integrity sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM= dependencies: is-number "^2.1.0" isobject "^2.0.0" @@ -3418,6 +3887,7 @@ fill-range@^2.1.0: fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" @@ -3427,6 +3897,7 @@ fill-range@^4.0.0: finalhandler@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" + integrity sha1-zgtoVbRYU+eRsvzGgARtiCU91/U= dependencies: debug "2.6.9" encodeurl "~1.0.1" @@ -3439,10 +3910,12 @@ finalhandler@1.1.0: find-index@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-index/-/find-index-1.1.0.tgz#53007c79cd30040d6816d79458e8837d5c5705ef" + integrity sha1-UwB8ec0wBA1oFteUWOiDfVxXBe8= find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= dependencies: path-exists "^2.0.0" pinkie-promise "^2.0.0" @@ -3450,12 +3923,14 @@ find-up@^1.0.0: find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= dependencies: locate-path "^2.0.0" findup-sync@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" + integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= dependencies: detect-file "^1.0.0" is-glob "^3.1.0" @@ -3465,6 +3940,7 @@ findup-sync@2.0.0: findup-sync@^0.4.2: version "0.4.3" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" + integrity sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI= dependencies: detect-file "^0.1.0" is-glob "^2.0.1" @@ -3474,6 +3950,7 @@ findup-sync@^0.4.2: findup-sync@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-1.0.0.tgz#6f7e4b57b6ee3a4037b4414eaedea3f58f71e0ec" + integrity sha1-b35LV7buOkA3tEFOrt6j9Y9x4Ow= dependencies: detect-file "^0.1.0" is-glob "^2.0.1" @@ -3483,6 +3960,7 @@ findup-sync@^1.0.0: fireworm@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/fireworm/-/fireworm-0.7.1.tgz#ccf20f7941f108883fcddb99383dbe6e1861c758" + integrity sha1-zPIPeUHxCIg/zduZOD2+bhhhx1g= dependencies: async "~0.2.9" is-type "0.0.1" @@ -3493,6 +3971,7 @@ fireworm@^0.7.0: fixturify@^0.3.2: version "0.3.4" resolved "https://registry.yarnpkg.com/fixturify/-/fixturify-0.3.4.tgz#c676de404a7f8ee8e64d0b76118e62ec95ab7b25" + integrity sha512-Gx+KSB25b6gMc4bf7UFRTA85uE0iZR+RYur0JHh6dg4AGBh0EksOv4FCHyM7XpGmiJO7Bc7oV7vxENQBT+2WEQ== dependencies: fs-extra "^0.30.0" matcher-collection "^1.0.4" @@ -3500,6 +3979,7 @@ fixturify@^0.3.2: flat-cache@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + integrity sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE= dependencies: circular-json "^0.3.1" del "^2.0.2" @@ -3509,20 +3989,24 @@ flat-cache@^1.2.1: for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= for-own@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= dependencies: for-in "^1.0.1" forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= form-data@~2.1.1: version "2.1.4" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + integrity sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE= dependencies: asynckit "^0.4.0" combined-stream "^1.0.5" @@ -3531,6 +4015,7 @@ form-data@~2.1.1: form-data@~2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" + integrity sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8= dependencies: asynckit "^0.4.0" combined-stream "^1.0.5" @@ -3539,24 +4024,29 @@ form-data@~2.3.1: forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= dependencies: map-cache "^0.2.2" fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= fs-exists-sync@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" + integrity sha1-mC1ok6+RjnLQjeyehnP/K1qNat0= fs-extra@^0.24.0: version "0.24.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.24.0.tgz#d4e4342a96675cb7846633a6099249332b539952" + integrity sha1-1OQ0KpZnXLeEZjOmCZJJMytTmVI= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -3566,6 +4056,7 @@ fs-extra@^0.24.0: fs-extra@^0.26.0: version "0.26.7" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" + integrity sha1-muH92UiXeY7at20JGM9C0MMYT6k= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -3576,6 +4067,7 @@ fs-extra@^0.26.0: fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -3586,6 +4078,7 @@ fs-extra@^0.30.0: fs-extra@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" + integrity sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -3594,6 +4087,7 @@ fs-extra@^1.0.0: fs-extra@^2.0.0: version "2.1.2" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz#046c70163cef9aad46b0e4a7fa467fb22d71de35" + integrity sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -3601,6 +4095,7 @@ fs-extra@^2.0.0: fs-extra@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" + integrity sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE= dependencies: graceful-fs "^4.1.2" jsonfile "^3.0.0" @@ -3609,6 +4104,7 @@ fs-extra@^3.0.0: fs-extra@^4.0.0, fs-extra@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" @@ -3617,6 +4113,7 @@ fs-extra@^4.0.0, fs-extra@^4.0.2: fs-promise@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/fs-promise/-/fs-promise-2.0.3.tgz#f64e4f854bcf689aa8bddcba268916db3db46854" + integrity sha1-9k5PhUvPaJqovdy6JokW2z20aFQ= dependencies: any-promise "^1.3.0" fs-extra "^2.0.0" @@ -3626,6 +4123,7 @@ fs-promise@^2.0.0: fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.7.tgz#315e2b098d5fe7f622880ac965b1b051868ac871" + integrity sha512-dJwDX6NBH7IfdfFjZAdHCZ6fIKc8LwR7kzqUhYRFJuX4g9ctG/7cuqJuwegGQsyLEykp6Z4krq+yIFMQlt7d9Q== dependencies: heimdalljs-logger "^0.1.7" object-assign "^4.1.0" @@ -3635,10 +4133,12 @@ fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5 fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.0.0, fsevents@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" + integrity sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q== dependencies: nan "^2.3.0" node-pre-gyp "^0.6.39" @@ -3646,6 +4146,7 @@ fsevents@^1.0.0, fsevents@^1.1.1: fstream-ignore@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + integrity sha1-nDHa40dnAY/h0kmyTa2mfQktoQU= dependencies: fstream "^1.0.0" inherits "2" @@ -3654,6 +4155,7 @@ fstream-ignore@^1.0.5: fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: version "1.0.11" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE= dependencies: graceful-fs "^4.1.2" inherits "~2.0.0" @@ -3663,10 +4165,12 @@ fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -3680,52 +4184,63 @@ gauge@~2.7.3: get-caller-file@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + integrity sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U= get-func-name@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= dependencies: assert-plus "^1.0.0" git-repo-info@^1.1.2, git-repo-info@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-1.4.1.tgz#2a072823254aaf62fcf0766007d7b6651bd41943" + integrity sha1-KgcoIyVKr2L88HZgB9e2ZRvUGUM= git-repo-info@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-1.2.0.tgz#43d8513e04a24dd441330a2f7c6655a709fdbaf2" + integrity sha1-Q9hRPgSiTdRBMwovfGZVpwn9uvI= git-repo-version@0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/git-repo-version/-/git-repo-version-0.4.1.tgz#75fab9a0a4ec8470755b0eea7fdaa6f9d41453bf" + integrity sha1-dfq5oKTshHB1Ww7qf9qm+dQUU78= dependencies: git-repo-info "~1.2.0" git-tools@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/git-tools/-/git-tools-0.1.4.tgz#5e43e59443b8a5dedb39dba663da49e79f943978" + integrity sha1-XkPllEO4pd7bOdumY9pJ55+UOXg= dependencies: spawnback "~1.0.0" glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= dependencies: glob-parent "^2.0.0" is-glob "^2.0.0" @@ -3733,12 +4248,14 @@ glob-base@^0.3.0: glob-parent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= dependencies: is-glob "^2.0.0" glob@7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + integrity sha1-gFIR3wT6rxxjo2ADBs31reULLsg= dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3750,6 +4267,7 @@ glob@7.1.1: glob@^5.0.10: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= dependencies: inflight "^1.0.4" inherits "2" @@ -3760,6 +4278,7 @@ glob@^5.0.10: glob@^7.0.3, glob@^7.0.4, glob@^7.0.5, glob@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3771,6 +4290,7 @@ glob@^7.0.3, glob@^7.0.4, glob@^7.0.5, glob@^7.1.2: global-modules@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" + integrity sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0= dependencies: global-prefix "^0.1.4" is-windows "^0.2.0" @@ -3778,6 +4298,7 @@ global-modules@^0.2.3: global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== dependencies: global-prefix "^1.0.1" is-windows "^1.0.1" @@ -3786,6 +4307,7 @@ global-modules@^1.0.0: global-prefix@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" + integrity sha1-jTvGuNo8qBEqFg2NSW/wRiv+948= dependencies: homedir-polyfill "^1.0.0" ini "^1.3.4" @@ -3795,6 +4317,7 @@ global-prefix@^0.1.4: global-prefix@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= dependencies: expand-tilde "^2.0.2" homedir-polyfill "^1.0.1" @@ -3805,18 +4328,22 @@ global-prefix@^1.0.1: globals@^11.0.1: version "11.3.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.3.0.tgz#e04fdb7b9796d8adac9c8f64c14837b2313378b0" + integrity sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw== globals@^11.1.0: version "11.7.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" + integrity sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg== globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== globby@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0= dependencies: array-union "^1.0.1" arrify "^1.0.0" @@ -3828,22 +4355,27 @@ globby@^5.0.0: graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= "graceful-readlink@>= 1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= growl@1.9.2: version "1.9.2" resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + integrity sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8= growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= handlebars@^4.0.4: version "4.0.11" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" + integrity sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw= dependencies: async "^1.4.0" optimist "^0.6.1" @@ -3854,14 +4386,17 @@ handlebars@^4.0.4: har-schema@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + integrity sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4= har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= har-validator@~4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + integrity sha1-M0gdDxu/9gDdID11gSpqX7oALio= dependencies: ajv "^4.9.1" har-schema "^1.0.5" @@ -3869,6 +4404,7 @@ har-validator@~4.2.1: har-validator@~5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + integrity sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0= dependencies: ajv "^5.1.0" har-schema "^2.0.0" @@ -3876,50 +4412,60 @@ har-validator@~5.0.3: has-ansi@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" + integrity sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4= dependencies: ansi-regex "^0.2.0" has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= dependencies: ansi-regex "^2.0.0" has-binary@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.6.tgz#25326f39cfa4f616ad8787894e3af2cfbc7b6e10" + integrity sha1-JTJvOc+k9hath4eJTjryz7x7bhA= dependencies: isarray "0.0.1" has-binary@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" + integrity sha1-aOYesWIQyVRaClzOBqhzkS/h5ow= dependencies: isarray "0.0.1" has-cors@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= has-flag@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= dependencies: get-value "^2.0.3" has-values "^0.1.4" @@ -3928,6 +4474,7 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= dependencies: get-value "^2.0.6" has-values "^1.0.0" @@ -3936,10 +4483,12 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= dependencies: is-number "^3.0.0" kind-of "^4.0.0" @@ -3947,6 +4496,7 @@ has-values@^1.0.0: hash-for-dep@^1.0.2, hash-for-dep@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.2.3.tgz#5ec69fca32c23523972d52acb5bb65ffc3664cab" + integrity sha512-NE//rDaCFpWHViw30YM78OAGBShU+g4dnUGY3UWGyEzPOGYg/ptOjk32nEc+bC1xz+RfK5UIs6lOL6eQdrV4Ow== dependencies: broccoli-kitchen-sink-helpers "^0.3.1" heimdalljs "^0.2.3" @@ -3956,6 +4506,7 @@ hash-for-dep@^1.0.2, hash-for-dep@^1.2.3: hawk@3.1.3, hawk@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + integrity sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ= dependencies: boom "2.x.x" cryptiles "2.x.x" @@ -3965,6 +4516,7 @@ hawk@3.1.3, hawk@~3.1.3: hawk@~6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + integrity sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ== dependencies: boom "4.x.x" cryptiles "3.x.x" @@ -3974,10 +4526,12 @@ hawk@~6.0.2: he@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= heimdalljs-fs-monitor@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/heimdalljs-fs-monitor/-/heimdalljs-fs-monitor-0.1.0.tgz#d404a65688c6714c485469ed3495da4853440272" + integrity sha1-1ASmVojGcUxIVGntNJXaSFNEAnI= dependencies: heimdalljs "^0.2.0" heimdalljs-logger "^0.1.7" @@ -3985,10 +4539,12 @@ heimdalljs-fs-monitor@^0.1.0: heimdalljs-graph@^0.3.1: version "0.3.4" resolved "https://registry.yarnpkg.com/heimdalljs-graph/-/heimdalljs-graph-0.3.4.tgz#0bd75797beeaa20b0ed59017aed3b2d95312acee" + integrity sha512-2DXgPIxdatgtBOjlh5qeVeHIGMTC2V9ujEvUhVJBVOVwqnU41g1OuGaRugLi6rvk0E+u1koYkfPeptybV8ZJ4g== heimdalljs-logger@^0.1.7: version "0.1.9" resolved "https://registry.yarnpkg.com/heimdalljs-logger/-/heimdalljs-logger-0.1.9.tgz#d76ada4e45b7bb6f786fc9c010a68eb2e2faf176" + integrity sha1-12raTkW3u294b8nAEKaOsuL68XY= dependencies: debug "^2.2.0" heimdalljs "^0.2.0" @@ -3996,26 +4552,31 @@ heimdalljs-logger@^0.1.7: heimdalljs@^0.2.0, heimdalljs@^0.2.1, heimdalljs@^0.2.3: version "0.2.5" resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.2.5.tgz#6aa54308eee793b642cff9cf94781445f37730ac" + integrity sha1-aqVDCO7nk7ZCz/nPlHgURfN3MKw= dependencies: rsvp "~3.2.1" heimdalljs@^0.3.0: version "0.3.3" resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.3.3.tgz#e92d2c6f77fd46d5bf50b610d28ad31755054d0b" + integrity sha1-6S0sb3f9RtW/ULYQ0orTF1UFTQs= dependencies: rsvp "~3.2.1" hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + integrity sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0= hoek@4.x.x: version "4.2.0" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" + integrity sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ== home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.1" @@ -4023,22 +4584,26 @@ home-or-tmp@^2.0.0: homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" + integrity sha1-TCu8inWJmP7r9e1oWA921GdotLw= dependencies: parse-passwd "^1.0.0" hosted-git-info@^2.1.4, hosted-git-info@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" + integrity sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg== html-encoding-sniffer@^1.0.1, html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== dependencies: whatwg-encoding "^1.0.1" http-errors@1.6.2, http-errors@~1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" + integrity sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY= dependencies: depd "1.1.1" inherits "2.0.3" @@ -4048,10 +4613,12 @@ http-errors@1.6.2, http-errors@~1.6.2: http-parser-js@>=0.4.0: version "0.4.10" resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" + integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= http-proxy@^1.13.1, http-proxy@^1.9.0: version "1.16.2" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" + integrity sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I= dependencies: eventemitter3 "1.x.x" requires-port "1.x.x" @@ -4059,6 +4626,7 @@ http-proxy@^1.13.1, http-proxy@^1.9.0: http-signature@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + integrity sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8= dependencies: assert-plus "^0.2.0" jsprim "^1.2.2" @@ -4067,6 +4635,7 @@ http-signature@~1.1.0: http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= dependencies: assert-plus "^1.0.0" jsprim "^1.2.2" @@ -4075,32 +4644,39 @@ http-signature@~1.2.0: iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@~0.4.13: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + integrity sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ== ignore@^3.3.3, ignore@^3.3.6: version "3.3.7" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" + integrity sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA== imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= dependencies: repeating "^2.0.0" indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= inflection@^1.12.0, inflection@^1.7.0, inflection@^1.7.1, inflection@^1.8.0: version "1.12.0" resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" + integrity sha1-ogCTVlbW9fa8TcdQLhrstwMihBY= inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" @@ -4108,14 +4684,17 @@ inflight@^1.0.4: inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== inline-source-map-comment@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/inline-source-map-comment/-/inline-source-map-comment-1.0.5.tgz#50a8a44c2a790dfac441b5c94eccd5462635faf6" + integrity sha1-UKikTCp5DfrEQbXJTszVRiY1+vY= dependencies: chalk "^1.0.0" get-stdin "^4.0.1" @@ -4126,6 +4705,7 @@ inline-source-map-comment@^1.0.5: inquirer@^2: version "2.0.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-2.0.0.tgz#e1351687b90d150ca403ceaa3cefb1e3065bef4b" + integrity sha1-4TUWh7kNFQykA86qPO+x4wZb70s= dependencies: ansi-escapes "^1.1.0" chalk "^1.0.0" @@ -4145,6 +4725,7 @@ inquirer@^2: inquirer@^3.0.6: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== dependencies: ansi-escapes "^3.0.0" chalk "^2.0.0" @@ -4164,66 +4745,78 @@ inquirer@^3.0.6: invariant@^2.2.0: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" invariant@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + integrity sha1-nh9WrArNtr8wMwbzOL47IErmA2A= dependencies: loose-envify "^1.0.0" ipaddr.js@1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" + integrity sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A= is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= dependencies: kind-of "^3.0.2" is-accessor-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== dependencies: kind-of "^6.0.0" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= dependencies: binary-extensions "^1.0.0" is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-builtin-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= dependencies: builtin-modules "^1.0.0" is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= dependencies: kind-of "^3.0.2" is-data-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== dependencies: kind-of "^6.0.0" is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== dependencies: is-accessor-descriptor "^0.1.6" is-data-descriptor "^0.1.4" @@ -4232,6 +4825,7 @@ is-descriptor@^0.1.0: is-descriptor@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== dependencies: is-accessor-descriptor "^1.0.0" is-data-descriptor "^1.0.0" @@ -4240,182 +4834,220 @@ is-descriptor@^1.0.0: is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= is-equal-shallow@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= dependencies: is-primitive "^2.0.0" is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= is-extendable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== dependencies: is-plain-object "^2.0.4" is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= is-extglob@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-finite@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= is-git-url@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-git-url/-/is-git-url-1.0.0.tgz#53f684cd143285b52c3244b4e6f28253527af66b" + integrity sha1-U/aEzRQyhbUsMkS05vKCU1J69ms= is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= dependencies: is-extglob "^1.0.0" is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= dependencies: is-extglob "^2.1.0" is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= dependencies: kind-of "^3.0.2" is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= is-odd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-1.0.0.tgz#3b8a932eb028b3775c39bb09e91767accdb69088" + integrity sha1-O4qTLrAos3dcObsJ6RdnrM22kIg= dependencies: is-number "^3.0.0" is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= is-path-in-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + integrity sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw= dependencies: is-path-inside "^1.0.0" is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= dependencies: path-is-inside "^1.0.1" is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= is-type@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/is-type/-/is-type-0.0.1.tgz#f651d85c365d44955d14a51d8d7061f3f6b4779c" + integrity sha1-9lHYXDZdRJVdFKUdjXBh8/a0d5w= dependencies: core-util-is "~1.0.0" is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= is-windows@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" + integrity sha1-3hqm1j6indJIc3tp8f+LgALSEIw= is-windows@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.1.tgz#310db70f742d259a16a369202b51af84233310d9" + integrity sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk= isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isbinaryfile@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" + integrity sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE= isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= istextorbinary@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.1.0.tgz#dbed2a6f51be2f7475b68f89465811141b758874" + integrity sha1-2+0qb1G+L3R1to+JRlgRFBt1iHQ= dependencies: binaryextensions "1 || 2" editions "^1.1.1" @@ -4424,22 +5056,27 @@ istextorbinary@2.1.0: jquery-deferred@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/jquery-deferred/-/jquery-deferred-0.3.1.tgz#596eca1caaff54f61b110962b23cafea74c35355" + integrity sha1-WW7KHKr/VPYbEQlisjyv6nTDU1U= jquery@^3.1.0, jquery@^3.2.1: version "3.3.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" + integrity sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg== js-reporters@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/js-reporters/-/js-reporters-1.2.1.tgz#f88c608e324a3373a95bcc45ad305e5c979c459b" + integrity sha1-+IxgjjJKM3OpW8xFrTBeXJecRZs= js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.6.1, js-yaml@^3.9.1: version "3.10.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" + integrity sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -4447,10 +5084,12 @@ js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.6.1, js-yaml@^3.9.1: jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= jsdom@^11.12.0: version "11.12.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== dependencies: abab "^2.0.0" acorn "^5.5.3" @@ -4482,6 +5121,7 @@ jsdom@^11.12.0: jsdom@^9.5.0: version "9.12.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" + integrity sha1-6MVG//ywbADUgzyoRBD+1/igl9Q= dependencies: abab "^1.0.3" acorn "^4.0.4" @@ -4506,74 +5146,90 @@ jsdom@^9.5.0: jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= jsesc@^2.5.0, jsesc@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" + integrity sha1-5CGiqOINawgZ3yiQj3glJrlt0f4= jsesc@~0.3.x: version "0.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.3.0.tgz#1bf5ee63b4539fe2e26d0c1e99c240b97a457972" + integrity sha1-G/XuY7RTn+LibQwemcJAuXpFeXI= jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= dependencies: jsonify "~0.0.0" json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= json3@3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= optionalDependencies: graceful-fs "^4.1.6" jsonfile@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + integrity sha1-pezG9l9T9mLEQVx2daAzHQmS7GY= optionalDependencies: graceful-fs "^4.1.6" jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= optionalDependencies: graceful-fs "^4.1.6" jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= dependencies: assert-plus "1.0.0" extsprintf "1.3.0" @@ -4583,42 +5239,50 @@ jsprim@^1.2.2: kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= dependencies: is-buffer "^1.1.5" kind-of@^5.0.0, kind-of@^5.0.2: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= optionalDependencies: graceful-fs "^4.1.9" lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= lazy-cache@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" + integrity sha1-uRkKT5EzVGlIQIWfio9whNiCImQ= dependencies: set-getter "^0.1.0" leek@0.0.24: version "0.0.24" resolved "https://registry.yarnpkg.com/leek/-/leek-0.0.24.tgz#e400e57f0e60d8ef2bd4d068dc428a54345dbcda" + integrity sha1-5ADlfw5g2O8r1NBo3EKKVDRdvNo= dependencies: debug "^2.1.0" lodash.assign "^3.2.0" @@ -4627,10 +5291,12 @@ leek@0.0.24: left-pad@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" @@ -4638,16 +5304,19 @@ levn@^0.3.0, levn@~0.3.0: linkify-it@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.0.3.tgz#d94a4648f9b1c179d64fa97291268bdb6ce9434f" + integrity sha1-2UpGSPmxwXnWT6lykSaL22zpQ08= dependencies: uc.micro "^1.0.1" livereload-js@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.3.0.tgz#c3ab22e8aaf5bf3505d80d098cbad67726548c9a" + integrity sha512-j1R0/FeGa64Y+NmqfZhyoVRzcFlOZ8sNlKzHjh4VvLULFACZhn68XrX5DFg2FhMvSMJmROuFxRSa560ECWKBMg== load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" @@ -4658,10 +5327,12 @@ load-json-file@^1.0.0: loader.js@^4.2.3: version "4.6.0" resolved "https://registry.yarnpkg.com/loader.js/-/loader.js-4.6.0.tgz#b965663ddbe2d80da482454cb865efe496e93e22" + integrity sha512-NjAnzMq/BM2VlXA9er0Nx1Runocgi+hEU53ENhCtTx82GX6/l9NXwfIqg81om6QvmhUlv2zH+4R+N+wOoeXytQ== locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= dependencies: p-locate "^2.0.0" path-exists "^3.0.0" @@ -4669,10 +5340,12 @@ locate-path@^2.0.0: lodash-es@^4.17.4: version "4.17.5" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.5.tgz#9fc6e737b1c4d151d8f9cae2247305d552ce748f" + integrity sha512-Ez3ONp3TK9gX1HYKp6IhetcVybD+2F+Yp6GS9dfH8ue6EOCEzQtQEh4K0FYWBP9qLv+lzeQAYXw+3ySfxyZqkw== lodash._baseassign@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + integrity sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4= dependencies: lodash._basecopy "^3.0.0" lodash.keys "^3.0.0" @@ -4680,6 +5353,7 @@ lodash._baseassign@^3.0.0: lodash._basebind@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._basebind/-/lodash._basebind-2.3.0.tgz#2b5bc452a0e106143b21869f233bdb587417d248" + integrity sha1-K1vEUqDhBhQ7IYafIzvbWHQX0kg= dependencies: lodash._basecreate "~2.3.0" lodash._setbinddata "~2.3.0" @@ -4688,14 +5362,17 @@ lodash._basebind@~2.3.0: lodash._basecopy@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY= lodash._basecreate@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" + integrity sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE= lodash._basecreate@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-2.3.0.tgz#9b88a86a4dcff7b7f3c61d83a2fcfc0671ec9de0" + integrity sha1-m4ioak3P97fzxh2Dovz8BnHsneA= dependencies: lodash._renative "~2.3.0" lodash.isobject "~2.3.0" @@ -4704,6 +5381,7 @@ lodash._basecreate@~2.3.0: lodash._basecreatecallback@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._basecreatecallback/-/lodash._basecreatecallback-2.3.0.tgz#37b2ab17591a339e988db3259fcd46019d7ac362" + integrity sha1-N7KrF1kaM56YjbMln81GAZ16w2I= dependencies: lodash._setbinddata "~2.3.0" lodash.bind "~2.3.0" @@ -4713,6 +5391,7 @@ lodash._basecreatecallback@~2.3.0: lodash._basecreatewrapper@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.3.0.tgz#aa0c61ad96044c3933376131483a9759c3651247" + integrity sha1-qgxhrZYETDkzN2ExSDqXWcNlEkc= dependencies: lodash._basecreate "~2.3.0" lodash._setbinddata "~2.3.0" @@ -4722,6 +5401,7 @@ lodash._basecreatewrapper@~2.3.0: lodash._baseflatten@^3.0.0: version "3.1.4" resolved "https://registry.yarnpkg.com/lodash._baseflatten/-/lodash._baseflatten-3.1.4.tgz#0770ff80131af6e34f3b511796a7ba5214e65ff7" + integrity sha1-B3D/gBMa9uNPO1EXlqe6UhTmX/c= dependencies: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" @@ -4729,10 +5409,12 @@ lodash._baseflatten@^3.0.0: lodash._bindcallback@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4= lodash._createassigner@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" + integrity sha1-g4pbri/aymOsIt7o4Z+k5taXCxE= dependencies: lodash._bindcallback "^3.0.0" lodash._isiterateecall "^3.0.0" @@ -4741,6 +5423,7 @@ lodash._createassigner@^3.0.0: lodash._createwrapper@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._createwrapper/-/lodash._createwrapper-2.3.0.tgz#d1aae1102dadf440e8e06fc133a6edd7fe146075" + integrity sha1-0arhEC2t9EDo4G/BM6bt1/4UYHU= dependencies: lodash._basebind "~2.3.0" lodash._basecreatewrapper "~2.3.0" @@ -4749,44 +5432,54 @@ lodash._createwrapper@~2.3.0: lodash._escapehtmlchar@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.3.0.tgz#d03da6bd82eedf38dc0a5b503d740ecd0e894592" + integrity sha1-0D2mvYLu3zjcCltQPXQOzQ6JRZI= dependencies: lodash._htmlescapes "~2.3.0" lodash._escapestringchar@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.3.0.tgz#cce73ae60fc6da55d2bf8a0679c23ca2bab149fc" + integrity sha1-zOc65g/G2lXSv4oGecI8orqxSfw= lodash._getnative@^3.0.0: version "3.9.1" resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= lodash._htmlescapes@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.3.0.tgz#1ca98863cadf1fa1d82c84f35f31e40556a04f3a" + integrity sha1-HKmIY8rfH6HYLITzXzHkBVagTzo= lodash._isiterateecall@^3.0.0: version "3.0.9" resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + integrity sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw= lodash._objecttypes@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.3.0.tgz#6a3ea3987dd6eeb8021b2d5c9c303549cc2bae1e" + integrity sha1-aj6jmH3W7rgCGy1cnDA1Scwrrh4= lodash._reinterpolate@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.3.0.tgz#03ee9d85c0e55cbd590d71608a295bdda51128ec" + integrity sha1-A+6dhcDlXL1ZDXFgiilb3aURKOw= lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= lodash._renative@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._renative/-/lodash._renative-2.3.0.tgz#77d8edd4ced26dd5971f9e15a5f772e4e317fbd3" + integrity sha1-d9jt1M7SbdWXH54Vpfdy5OMX+9M= lodash._reunescapedhtml@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.3.0.tgz#db920b55ac7f3ff825939aceb9ba2c231713d24d" + integrity sha1-25ILVax/P/glk5rOubosIxcT0k0= dependencies: lodash._htmlescapes "~2.3.0" lodash.keys "~2.3.0" @@ -4794,6 +5487,7 @@ lodash._reunescapedhtml@~2.3.0: lodash._setbinddata@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._setbinddata/-/lodash._setbinddata-2.3.0.tgz#e5610490acd13277d59858d95b5f2727f1508f04" + integrity sha1-5WEEkKzRMnfVmFjZW18nJ/FQjwQ= dependencies: lodash._renative "~2.3.0" lodash.noop "~2.3.0" @@ -4801,16 +5495,19 @@ lodash._setbinddata@~2.3.0: lodash._shimkeys@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.3.0.tgz#611f93149e3e6c721096b48769ef29537ada8ba9" + integrity sha1-YR+TFJ4+bHIQlrSHae8pU3rai6k= dependencies: lodash._objecttypes "~2.3.0" lodash._slice@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._slice/-/lodash._slice-2.3.0.tgz#147198132859972e4680ca29a5992c855669aa5c" + integrity sha1-FHGYEyhZly5GgMoppZkshVZpqlw= lodash.assign@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" + integrity sha1-POnwI0tLIiPilrj6CsH+6OvKZPo= dependencies: lodash._baseassign "^3.0.0" lodash._createassigner "^3.0.0" @@ -4819,10 +5516,12 @@ lodash.assign@^3.2.0: lodash.assignin@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" + integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI= lodash.bind@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-2.3.0.tgz#c2a8e18b68e5ecc152e2b168266116fea5b016cc" + integrity sha1-wqjhi2jl7MFS4rFoJmEW/qWwFsw= dependencies: lodash._createwrapper "~2.3.0" lodash._renative "~2.3.0" @@ -4831,14 +5530,17 @@ lodash.bind@~2.3.0: lodash.castarray@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" + integrity sha1-wCUTUV4wna3dTCTGDP3c9ZdtkRU= lodash.clonedeep@^4.4.1: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= lodash.create@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" + integrity sha1-1/KEnw29p+BGgruM1yqwIkYd6+c= dependencies: lodash._baseassign "^3.0.0" lodash._basecreate "^3.0.0" @@ -4847,12 +5549,14 @@ lodash.create@3.1.1: lodash.debounce@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-3.1.1.tgz#812211c378a94cc29d5aa4e3346cf0bfce3a7df5" + integrity sha1-gSIRw3ipTMKdWqTjNGzwv846ffU= dependencies: lodash._getnative "^3.0.0" lodash.defaults@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.3.0.tgz#a832b001f138f3bb9721c2819a2a7cc5ae21ed25" + integrity sha1-qDKwAfE487uXIcKBmip8xa4h7SU= dependencies: lodash._objecttypes "~2.3.0" lodash.keys "~2.3.0" @@ -4860,10 +5564,12 @@ lodash.defaults@~2.3.0: lodash.defaultsdeep@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.0.tgz#bec1024f85b1bd96cbea405b23c14ad6443a6f81" + integrity sha1-vsECT4WxvZbL6kBbI8FK1kQ6b4E= lodash.escape@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.3.0.tgz#844c38c58f844e1362ebe96726159b62cf5f2a58" + integrity sha1-hEw4xY+EThNi6+lnJhWbYs9fKlg= dependencies: lodash._escapehtmlchar "~2.3.0" lodash._reunescapedhtml "~2.3.0" @@ -4872,10 +5578,12 @@ lodash.escape@~2.3.0: lodash.find@^4.5.1: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" + integrity sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E= lodash.flatten@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-3.0.2.tgz#de1cf57758f8f4479319d35c3e9cc60c4501938c" + integrity sha1-3hz1d1j49EeTGdNcPpzGDEUBk4w= dependencies: lodash._baseflatten "^3.0.0" lodash._isiterateecall "^3.0.0" @@ -4883,6 +5591,7 @@ lodash.flatten@^3.0.2: lodash.foreach@~2.3.x: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-2.3.0.tgz#083404c91e846ee77245fdf9d76519c68b2af168" + integrity sha1-CDQEyR6EbudyRf3512UZxosq8Wg= dependencies: lodash._basecreatecallback "~2.3.0" lodash.forown "~2.3.0" @@ -4890,6 +5599,7 @@ lodash.foreach@~2.3.x: lodash.forown@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.forown/-/lodash.forown-2.3.0.tgz#24fb4aaf800d45fc2dc60bfec3ce04c836a3ad7f" + integrity sha1-JPtKr4ANRfwtxgv+w84EyDajrX8= dependencies: lodash._basecreatecallback "~2.3.0" lodash._objecttypes "~2.3.0" @@ -4898,28 +5608,34 @@ lodash.forown@~2.3.0: lodash.identity@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.identity/-/lodash.identity-2.3.0.tgz#6b01a210c9485355c2a913b48b6711219a173ded" + integrity sha1-awGiEMlIU1XCqRO0i2cRIZoXPe0= lodash.isarguments@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= lodash.isarray@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U= lodash.isfunction@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-2.3.0.tgz#6b2973e47a647cf12e70d676aea13643706e5267" + integrity sha1-aylz5HpkfPEucNZ2rqE2Q3BuUmc= lodash.isobject@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.3.0.tgz#2e16d3fc583da9831968953f2d8e6d73434f6799" + integrity sha1-LhbT/Fg9qYMZaJU/LY5tc0NPZ5k= dependencies: lodash._objecttypes "~2.3.0" lodash.keys@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + integrity sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo= dependencies: lodash._getnative "^3.0.0" lodash.isarguments "^3.0.0" @@ -4928,6 +5644,7 @@ lodash.keys@^3.0.0: lodash.keys@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.3.0.tgz#b350f4f92caa9f45a4a2ecf018454cf2f28ae253" + integrity sha1-s1D0+Syqn0WkouzwGEVM8vKK4lM= dependencies: lodash._renative "~2.3.0" lodash._shimkeys "~2.3.0" @@ -4936,32 +5653,39 @@ lodash.keys@~2.3.0: lodash.merge@^4.3.0, lodash.merge@^4.4.0, lodash.merge@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" + integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== lodash.noop@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.noop/-/lodash.noop-2.3.0.tgz#3059d628d51bbf937cd2a0b6fc3a7f212a669c2c" + integrity sha1-MFnWKNUbv5N80qC2/Dp/ISpmnCw= lodash.omit@^4.1.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" + integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA= lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= lodash.support@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.support/-/lodash.support-2.3.0.tgz#7eaf038af4f0d6aab776b44aa6dcfc80334c9bfd" + integrity sha1-fq8DivTw1qq3drRKptz8gDNMm/0= dependencies: lodash._renative "~2.3.0" lodash.template@^4.2.5: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" + integrity sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A= dependencies: lodash._reinterpolate "~3.0.0" lodash.templatesettings "^4.0.0" @@ -4969,6 +5693,7 @@ lodash.template@^4.2.5: lodash.template@~2.3.x: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.3.0.tgz#4e3e29c433b4cfea675ec835e6f12391c61fd22b" + integrity sha1-Tj4pxDO0z+pnXsg15vEjkcYf0is= dependencies: lodash._escapestringchar "~2.3.0" lodash._reinterpolate "~2.3.0" @@ -4981,12 +5706,14 @@ lodash.template@~2.3.x: lodash.templatesettings@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" + integrity sha1-K01OlbpEDZFf8IvImeRVNmZxMxY= dependencies: lodash._reinterpolate "~3.0.0" lodash.templatesettings@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.3.0.tgz#303d132c342710040d5a18efaa2d572fd03f8cdc" + integrity sha1-MD0TLDQnEAQNWhjvqi1XL9A/jNw= dependencies: lodash._reinterpolate "~2.3.0" lodash.escape "~2.3.0" @@ -4994,52 +5721,63 @@ lodash.templatesettings@~2.3.0: lodash.uniq@^4.2.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= lodash.uniqby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" + integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI= lodash.values@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.3.0.tgz#ca96fbe60a20b0b0ec2ba2ba5fc6a765bd14a3ba" + integrity sha1-ypb75gogsLDsK6K6X8anZb0Uo7o= dependencies: lodash.keys "~2.3.0" lodash@3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.8.0.tgz#376eb98bdcd9382a9365c33c4cb8250de1325b91" + integrity sha1-N265i9zZOCqTZcM8TLglDeEyW5E= lodash@^3.10.1: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1: version "4.17.5" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" + integrity sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw== lodash@^4.13.1, lodash@^4.2.0: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== log-symbols@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== dependencies: chalk "^2.0.1" longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= loose-envify@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + integrity sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg= dependencies: js-tokens "^3.0.0" loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= dependencies: currently-unhandled "^0.4.1" signal-exit "^3.0.0" @@ -5047,10 +5785,12 @@ loud-rejection@^1.0.0: lower-case@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= lru-cache@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + integrity sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew== dependencies: pseudomap "^1.0.2" yallist "^2.1.2" @@ -5058,36 +5798,43 @@ lru-cache@^4.0.1: make-array@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/make-array/-/make-array-0.1.2.tgz#335e36ebb0c5a43154d21213a1ecaeae2a1bb3ef" + integrity sha1-M14267DFpDFU0hIToeyuriobs+8= make-dir@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51" + integrity sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA== dependencies: pify "^3.0.0" makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= dependencies: tmpl "1.0.x" map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= dependencies: object-visit "^1.0.0" markdown-it-terminal@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/markdown-it-terminal/-/markdown-it-terminal-0.1.0.tgz#545abd8dd01c3d62353bfcea71db580b51d22bd9" + integrity sha1-VFq9jdAcPWI1O/zqcdtYC1HSK9k= dependencies: ansi-styles "^3.0.0" cardinal "^1.0.0" @@ -5098,6 +5845,7 @@ markdown-it-terminal@0.1.0: markdown-it@^8.3.0, markdown-it@^8.3.1: version "8.4.0" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.0.tgz#e2400881bf171f7018ed1bd9da441dac8af6306d" + integrity sha512-tNuOCCfunY5v5uhcO2AUMArvKAyKMygX8tfup/JrgnsDqcCATQsAExBq7o5Ml9iMmO82bk6jYNLj6khcrl0JGA== dependencies: argparse "^1.0.7" entities "~1.1.1" @@ -5108,36 +5856,43 @@ markdown-it@^8.3.0, markdown-it@^8.3.1: matcher-collection@^1.0.0, matcher-collection@^1.0.4, matcher-collection@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.0.5.tgz#2ee095438372cb8884f058234138c05c644ec339" + integrity sha512-nUCmzKipcJEwYsBVAFh5P+d7JBuhJaW1xs85Hara9xuMLqtCVUrW6DSC0JVIkluxEH2W45nPBM/wjHtBXa/tYA== dependencies: minimatch "^3.0.2" md5-hex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-2.0.0.tgz#d0588e9f1c74954492ecd24ac0ac6ce997d92e33" + integrity sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM= dependencies: md5-o-matic "^0.1.1" md5-o-matic@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" + integrity sha1-givM1l4RfFFPqxdrJZRdVBAKA8M= mdurl@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= memory-streams@^0.1.0: version "0.1.3" resolved "https://registry.yarnpkg.com/memory-streams/-/memory-streams-0.1.3.tgz#d9b0017b4b87f1d92f55f2745c9caacb1dc93ceb" + integrity sha512-qVQ/CjkMyMInPaaRMrwWNDvf6boRZXaT/DbQeMYcCWuXPEBf1v8qChOc9OlEVQp2uOvRXa1Qu30fLmKhY6NipA== dependencies: readable-stream "~1.0.2" meow@^3.4.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= dependencies: camelcase-keys "^2.0.0" decamelize "^1.1.2" @@ -5153,10 +5908,12 @@ meow@^3.4.0: merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= merge-trees@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-trees/-/merge-trees-1.0.1.tgz#ccbe674569787f9def17fd46e6525f5700bbd23e" + integrity sha1-zL5nRWl4f53vF/1G5lJfVwC70j4= dependencies: can-symlink "^1.0.0" fs-tree-diff "^0.5.4" @@ -5168,14 +5925,17 @@ merge-trees@^1.0.1: merge@^1.1.3, merge@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + integrity sha1-dTHjnUlJwoGma4xabgJl6LBYlNo= methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= micromatch@^2.1.5, micromatch@^2.3.7: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= dependencies: arr-diff "^2.0.0" array-unique "^0.2.1" @@ -5194,6 +5954,7 @@ micromatch@^2.1.5, micromatch@^2.3.7: micromatch@^3.0.4: version "3.1.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.5.tgz#d05e168c206472dfbca985bfef4f57797b4cd4ba" + integrity sha512-ykttrLPQrz1PUJcXjwsTUjGoPJ64StIGNE2lGVD1c9CuguJ+L7/navsE8IcDNndOoCMvYV0qc/exfVbMHkUhvA== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -5212,50 +5973,61 @@ micromatch@^3.0.4: "mime-db@>= 1.30.0 < 2": version "1.32.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.32.0.tgz#485b3848b01a3cda5f968b4882c0771e58e09414" + integrity sha512-+ZWo/xZN40Tt6S+HyakUxnSOgff+JEdaneLWIm0Z6LmpCn5DMcZntLyUY5c/rTDog28LhXLKOUZKoTxTCAdBVw== mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" + integrity sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE= mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7: version "2.1.17" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" + integrity sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo= dependencies: mime-db "~1.30.0" mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== mime@^1.2.11: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== "minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= mixin-deep@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.0.tgz#47a8732ba97799457c8c1eca28f95132d7e8150a" + integrity sha512-dgaCvoh6i1nosAUBKb0l0pfJ78K8+S9fluyIR2YvAeUD/QuMahnFnF3xYty5eYXMjhGSsB0DsW6A0uAZyetoAg== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" @@ -5263,16 +6035,19 @@ mixin-deep@^1.2.0: mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" mktemp@^0.4.0, mktemp@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/mktemp/-/mktemp-0.4.0.tgz#6d0515611c8a8c84e484aa2000129b98e981ff0b" + integrity sha1-bQUVYRyKjITkhKogABKbmOmB/ws= mocha@^3.0.2, mocha@^3.4.2: version "3.5.3" resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.5.3.tgz#1e0480fe36d2da5858d1eb6acc38418b26eaa20d" + integrity sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg== dependencies: browser-stdout "1.3.0" commander "2.9.0" @@ -5290,16 +6065,19 @@ mocha@^3.0.2, mocha@^3.4.2: moment-timezone@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.3.1.tgz#3ef47856b02d53b718a10a5ec2023aa299e07bf5" + integrity sha1-PvR4VrAtU7cYoQpewgI6opnge/U= dependencies: moment ">= 2.6.0" "moment@>= 2.6.0": version "2.20.1" resolved "https://registry.yarnpkg.com/moment/-/moment-2.20.1.tgz#d6eb1a46cbcc14a2b2f9434112c1ff8907f313fd" + integrity sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg== morgan@^1.8.1: version "1.9.0" resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.0.tgz#d01fa6c65859b76fcf31b3cb53a3821a311d8051" + integrity sha1-0B+mxlhZt2/PMbPLU6OCGjEdgFE= dependencies: basic-auth "~2.0.0" debug "2.6.9" @@ -5310,34 +6088,42 @@ morgan@^1.8.1: mout@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mout/-/mout-1.1.0.tgz#0b29d41e6a80fa9e2d4a5be9d602e1d9d02177f6" + integrity sha512-XsP0vf4As6BfqglxZqbqQ8SR6KQot2AgxvR0gG+WtUkf90vUXchMOZQtPf/Hml1rEffJupqL/tIrU6EYhsUQjw== ms@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + integrity sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg= ms@0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + integrity sha1-riXPJRKziFodldfwN4aNhDESR2U= ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= mustache@^2.2.1: version "2.3.0" resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.0.tgz#4028f7778b17708a489930a6e52ac3bca0da41d0" + integrity sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA= mute-stream@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" + integrity sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s= mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= mz@^2.6.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== dependencies: any-promise "^1.0.0" object-assign "^4.0.1" @@ -5346,6 +6132,7 @@ mz@^2.6.0: najax@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/najax/-/najax-1.0.3.tgz#11145f4d910446ea661d8ab7fcef53f6ad164ae5" + integrity sha1-ERRfTZEERupmHYq3/O9T9q0WSuU= dependencies: jquery-deferred "^0.3.0" lodash.defaultsdeep "^4.6.0" @@ -5354,10 +6141,12 @@ najax@^1.0.2: nan@^2.3.0: version "2.8.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" + integrity sha1-7XFfP+neArV6XmJS2QqWZ14fCFo= nanomatch@^1.2.5: version "1.2.7" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.7.tgz#53cd4aa109ff68b7f869591fdc9d10daeeea3e79" + integrity sha512-/5ldsnyurvEw7wNpxLFgjVvBLMta43niEYOy0CJ4ntcYSbx6bugRUTQeFb4BR/WanEL1o3aQgHuVLHQaB6tOqg== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -5374,20 +6163,24 @@ nanomatch@^1.2.5: natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= no-case@^2.2.0: version "2.3.2" resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== dependencies: lower-case "^1.1.1" node-fetch@^1.3.3: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== dependencies: encoding "^0.1.11" is-stream "^1.0.1" @@ -5395,14 +6188,17 @@ node-fetch@^1.3.3: node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= node-modules-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/node-modules-path/-/node-modules-path-1.0.1.tgz#40096b08ce7ad0ea14680863af449c7c75a5d1c8" + integrity sha1-QAlrCM560OoUaAhjr0ScfHWl0cg= node-notifier@^5.0.1: version "5.2.1" resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" + integrity sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg== dependencies: growly "^1.3.0" semver "^5.4.1" @@ -5412,6 +6208,7 @@ node-notifier@^5.0.1: node-pre-gyp@^0.6.39: version "0.6.39" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" + integrity sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ== dependencies: detect-libc "^1.0.2" hawk "3.1.3" @@ -5428,12 +6225,14 @@ node-pre-gyp@^0.6.39: nopt@^3.0.3, nopt@^3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= dependencies: abbrev "1" nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= dependencies: abbrev "1" osenv "^0.1.4" @@ -5441,6 +6240,7 @@ nopt@^4.0.1: normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== dependencies: hosted-git-info "^2.1.4" is-builtin-module "^1.0.0" @@ -5450,16 +6250,19 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: normalize-path@^2.0.0, normalize-path@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" npm-git-info@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/npm-git-info/-/npm-git-info-1.0.3.tgz#a933c42ec321e80d3646e0d6e844afe94630e1d5" + integrity sha1-qTPELsMh6A02RuDW6ESv6UYw4dU= npm-package-arg@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.0.0.tgz#8cce04b49d3f9faec3f56b0fe5f4391aeb9d2fac" + integrity sha512-hwC7g81KLgRmchv9ol6f3Fx4Yyc9ARX5X5niDHVILgpuvf08JRIgOZcEfpFXli3BgESoTrkauqorXm6UbvSgSg== dependencies: hosted-git-info "^2.5.0" osenv "^0.1.4" @@ -5469,12 +6272,14 @@ npm-package-arg@^6.0.0: npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= dependencies: path-key "^2.0.0" npmlog@^4.0.0, npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" @@ -5484,34 +6289,42 @@ npmlog@^4.0.0, npmlog@^4.0.2: number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= "nwmatcher@>= 1.3.9 < 2.0.0": version "1.4.3" resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c" + integrity sha512-IKdSTiDWCarf2JTS5e9e2+5tPZGdkRJ79XjYV0pzK8Q9BpsFyBq1RGKxzs7Q8UBushGw7m6TzVKz6fcY99iSWw== nwsapi@^2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.7.tgz#6fc54c254621f10cac5225b76e81c74120139b78" + integrity sha512-VZXniaaaORAXGCNsvUNefsKRQYk8zCzQZ57jalgrpHcU70OrAzKAiN/3plYtH/VPRmZeYyUzQiYfKzcMXC1g5Q== oauth-sign@~0.8.1, oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM= object-assign@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + integrity sha1-ejs9DpgGPUP0wD8uiubNUahog6A= object-assign@4.1.1, object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object-component@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" @@ -5520,12 +6333,14 @@ object-copy@^0.1.0: object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= dependencies: isobject "^3.0.0" object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= dependencies: for-own "^0.1.4" is-extendable "^0.1.1" @@ -5533,38 +6348,45 @@ object.omit@^2.0.0: object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= dependencies: isobject "^3.0.1" on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= dependencies: ee-first "1.1.1" on-headers@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + integrity sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c= once@^1.3.0, once@^1.3.3: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" onetime@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k= onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= dependencies: mimic-fn "^1.0.0" optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= dependencies: minimist "~0.0.1" wordwrap "~0.0.2" @@ -5572,6 +6394,7 @@ optimist@^0.6.1: optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= dependencies: deep-is "~0.1.3" fast-levenshtein "~2.0.4" @@ -5583,10 +6406,12 @@ optionator@^0.8.1, optionator@^0.8.2: options@>=0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" + integrity sha1-7CLTEoBrtT5zF3Pnza788cZDEo8= ora@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ora/-/ora-1.4.0.tgz#884458215b3a5d4097592285f93321bb7a79e2e5" + integrity sha512-iMK1DOQxzzh2MBlVsU42G80mnrvUhqsMh74phHtDlrcTZPK0pH6o7l7DRshK+0YsxDyEuaOkziVdvM3T0QTzpw== dependencies: chalk "^2.1.0" cli-cursor "^2.1.0" @@ -5596,18 +6421,22 @@ ora@^1.3.0: os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= os-shim@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" + integrity sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc= os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= osenv@^0.1.3, osenv@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + integrity sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ= dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" @@ -5615,26 +6444,31 @@ osenv@^0.1.3, osenv@^0.1.4: p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= p-limit@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" + integrity sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng== dependencies: p-try "^1.0.0" p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= dependencies: p-limit "^1.1.0" p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= dependencies: glob-base "^0.3.0" is-dotfile "^1.0.0" @@ -5644,90 +6478,109 @@ parse-glob@^3.0.4: parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= dependencies: error-ex "^1.2.0" parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= parse5@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== parse5@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" + integrity sha1-m387DeMr543CQBsXVzzK8Pb1nZQ= parsejson@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab" + integrity sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs= dependencies: better-assert "~1.0.0" parseqs@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= dependencies: better-assert "~1.0.0" parseuri@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= dependencies: better-assert "~1.0.0" parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= passwd-user@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/passwd-user/-/passwd-user-1.2.1.tgz#a01a5dc639ef007dc56364b8178569080ad3a7b8" + integrity sha1-oBpdxjnvAH3FY2S4F4VpCArTp7g= dependencies: exec-file-sync "^2.0.0" path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= dependencies: pinkie-promise "^2.0.0" path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= path-key@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + integrity sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME= path-posix@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/path-posix/-/path-posix-1.0.0.tgz#06b26113f56beab042545a23bfa88003ccac260f" + integrity sha1-BrJhE/Vr6rBCVFojv6iAA8ysJg8= path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= dependencies: graceful-fs "^4.1.2" pify "^2.0.0" @@ -5736,44 +6589,54 @@ path-type@^1.0.0: pathval@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" + integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + integrity sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU= performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== portfinder@^1.0.7: version "1.0.13" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" + integrity sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek= dependencies: async "^1.5.2" debug "^2.2.0" @@ -5782,18 +6645,22 @@ portfinder@^1.0.7: posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= pretender@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/pretender/-/pretender-1.6.1.tgz#77d1e42ac8c6b298f5cd43534a87645df035db8c" + integrity sha1-d9HkKsjGspj1zUNTSodkXfA124w= dependencies: fake-xml-http-request "^1.6.0" route-recognizer "^0.3.3" @@ -5801,34 +6668,41 @@ pretender@^1.6.1: printf@^0.2.3: version "0.2.5" resolved "https://registry.yarnpkg.com/printf/-/printf-0.2.5.tgz#c438ca2ca33e3927671db4ab69c0e52f936a4f0f" + integrity sha1-xDjKLKM+OSdnHbSracDlL5NqTw8= private@^0.1.6, private@^0.1.7, private@~0.1.5: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== 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" + integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= process-relative-require@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/process-relative-require/-/process-relative-require-1.0.0.tgz#1590dfcf5b8f2983ba53e398446b68240b4cc68a" + integrity sha1-FZDfz1uPKYO6U+OYRGtoJAtMxoo= dependencies: node-modules-path "^1.0.0" progress@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + integrity sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8= promise-map-series@^0.2.1: version "0.2.3" resolved "https://registry.yarnpkg.com/promise-map-series/-/promise-map-series-0.2.3.tgz#c2d377afc93253f6bd03dbb77755eb88ab20a847" + integrity sha1-wtN3r8kyU/a9A9u3d1XriKsgqEc= dependencies: rsvp "^3.0.14" proxy-addr@~2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec" + integrity sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew= dependencies: forwarded "~0.1.2" ipaddr.js "1.5.2" @@ -5836,34 +6710,42 @@ proxy-addr@~2.0.2: pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= psl@^1.1.24: version "1.1.28" resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.28.tgz#4fb6ceb08a1e2214d4fd4de0ca22dae13740bc7b" + integrity sha512-+AqO1Ae+N/4r7Rvchrdm432afjT9hqJRyBN3DQv9At0tPz4hIFSGKbq64fN9dVoCow4oggIIax5/iONx0r9hZw== punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== qs@6.5.1, qs@^6.4.0, qs@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + integrity sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A== qs@^6.2.0: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + integrity sha1-E+JtKK1rD/qpExLNO/cI7TUecjM= quick-temp@^0.1.0, quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quick-temp@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/quick-temp/-/quick-temp-0.1.8.tgz#bab02a242ab8fb0dd758a3c9776b32f9a5d94408" + integrity sha1-urAqJCq4+w3XWKPJd2sy+aXZRAg= dependencies: mktemp "~0.4.0" rimraf "^2.5.4" @@ -5872,6 +6754,7 @@ quick-temp@^0.1.0, quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quic qunit-dom@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-0.5.0.tgz#b08db6f919656e0589ebf8bd85bc313febb454d8" + integrity sha1-sI22+RllbgWJ6/i9hbwxP+u0VNg= dependencies: broccoli-funnel "^2.0.0" broccoli-merge-trees "^2.0.0" @@ -5879,6 +6762,7 @@ qunit-dom@^0.5.0: qunit@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.5.0.tgz#64cbe30a1193ef02edc5b278efcdf1d0bae96b22" + integrity sha512-GVvRr8ISFMs4SkTWFsaUzMBs7QEuiXVT4orlFgyHkmeXO1ijlDkhW6ecPri4urXiE4BUXEULJAtFlV1MWgg4Uw== dependencies: chokidar "1.7.0" commander "2.12.2" @@ -5892,6 +6776,7 @@ qunit@^2.5.0: randomatic@^1.1.3: version "1.1.7" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" + integrity sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how== dependencies: is-number "^3.0.0" kind-of "^4.0.0" @@ -5899,10 +6784,12 @@ randomatic@^1.1.3: range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= raw-body@2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" + integrity sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k= dependencies: bytes "3.0.0" http-errors "1.6.2" @@ -5912,6 +6799,7 @@ raw-body@2.3.2: raw-body@~1.1.0: version "1.1.7" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.1.7.tgz#1d027c2bfa116acc6623bca8f00016572a87d425" + integrity sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU= dependencies: bytes "1" string_decoder "0.10" @@ -5919,6 +6807,7 @@ raw-body@~1.1.0: rc@^1.1.7: version "1.2.5" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd" + integrity sha1-J1zWh/bjs2zHVrqibf7oCnkDAf0= dependencies: deep-extend "~0.4.0" ini "~1.3.0" @@ -5928,6 +6817,7 @@ rc@^1.1.7: read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= dependencies: find-up "^1.0.0" read-pkg "^1.0.0" @@ -5935,6 +6825,7 @@ read-pkg-up@^1.0.1: read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= dependencies: load-json-file "^1.0.0" normalize-package-data "^2.3.2" @@ -5943,6 +6834,7 @@ read-pkg@^1.0.0: readable-stream@^2, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" + integrity sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -5955,6 +6847,7 @@ readable-stream@^2, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-str readable-stream@~1.0.2: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= dependencies: core-util-is "~1.0.0" inherits "~2.0.1" @@ -5964,6 +6857,7 @@ readable-stream@~1.0.2: readdirp@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + integrity sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg= dependencies: graceful-fs "^4.1.2" minimatch "^3.0.2" @@ -5973,6 +6867,7 @@ readdirp@^2.0.0: recast@^0.11.3: version "0.11.23" resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" + integrity sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM= dependencies: ast-types "0.9.6" esprima "~3.1.0" @@ -5982,6 +6877,7 @@ recast@^0.11.3: redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= dependencies: indent-string "^2.1.0" strip-indent "^1.0.1" @@ -5989,24 +6885,29 @@ redent@^1.0.0: redeyed@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-1.0.1.tgz#e96c193b40c0816b00aec842698e61185e55498a" + integrity sha1-6WwZO0DAgWsArshCaY5hGF5VSYo= dependencies: esprima "~3.0.0" regenerate@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" + integrity sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg== regenerator-runtime@^0.10.5: version "0.10.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-transform@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== dependencies: babel-runtime "^6.18.0" babel-types "^6.19.0" @@ -6015,18 +6916,21 @@ regenerator-transform@^0.10.0: regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== dependencies: is-equal-shallow "^0.1.3" regex-not@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.0.tgz#42f83e39771622df826b02af176525d6a5f157f9" + integrity sha1-Qvg+OXcWIt+CawKvF2Ul1qXxV/k= dependencies: extend-shallow "^2.0.1" regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= dependencies: regenerate "^1.2.1" regjsgen "^0.2.0" @@ -6035,40 +6939,48 @@ regexpu-core@^2.0.0: regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= regjsparser@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= dependencies: jsesc "~0.5.0" remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + integrity sha1-7wiaF40Ug7quTZPrmLT55OEdmQo= repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= dependencies: is-finite "^1.0.0" request-promise-core@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" + integrity sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY= dependencies: lodash "^4.13.1" request-promise-native@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" + integrity sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU= dependencies: request-promise-core "1.1.1" stealthy-require "^1.1.0" @@ -6077,6 +6989,7 @@ request-promise-native@^1.0.5: request@2.81.0: version "2.81.0" resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + integrity sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA= dependencies: aws-sign2 "~0.6.0" aws4 "^1.2.1" @@ -6104,6 +7017,7 @@ request@2.81.0: request@^2.74.0, request@^2.79.0: version "2.83.0" resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" + integrity sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw== dependencies: aws-sign2 "~0.7.0" aws4 "^1.6.0" @@ -6131,6 +7045,7 @@ request@^2.74.0, request@^2.79.0: request@^2.81.0, request@^2.87.0: version "2.87.0" resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" + integrity sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw== dependencies: aws-sign2 "~0.7.0" aws4 "^1.6.0" @@ -6156,12 +7071,14 @@ request@^2.81.0, request@^2.87.0: require-folder-tree@^1.4.5: version "1.4.5" resolved "https://registry.yarnpkg.com/require-folder-tree/-/require-folder-tree-1.4.5.tgz#dfe553cbab98cc88e1c56a3f2f358f06ef85bcb0" + integrity sha1-3+VTy6uYzIjhxWo/LzWPBu+FvLA= dependencies: lodash "3.8.0" require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= dependencies: caller-path "^0.1.0" resolve-from "^1.0.0" @@ -6169,14 +7086,17 @@ require-uncached@^1.0.3: requireindex@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162" + integrity sha1-5UBLgVV+91225JxacgBIk/4D4WI= requires-port@1.x.x: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= resolve-dir@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" + integrity sha1-shklmlYC+sXFxJatiUpujMQwJh4= dependencies: expand-tilde "^1.2.2" global-modules "^0.2.3" @@ -6184,6 +7104,7 @@ resolve-dir@^0.1.0: resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= dependencies: expand-tilde "^2.0.0" global-modules "^1.0.0" @@ -6191,20 +7112,24 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1: resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= resolve@1.5.0, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.0, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" + integrity sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw== dependencies: path-parse "^1.0.5" restore-cursor@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + integrity sha1-NGYfRohjJ/7SmRR5FSJS35LapUE= dependencies: exit-hook "^1.0.0" onetime "^1.0.0" @@ -6212,6 +7137,7 @@ restore-cursor@^1.0.1: restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= dependencies: onetime "^2.0.0" signal-exit "^3.0.2" @@ -6219,78 +7145,95 @@ restore-cursor@^2.0.0: right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= dependencies: align-text "^0.1.1" rimraf@2, rimraf@^2.2.8, rimraf@^2.3.2, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.1, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== dependencies: glob "^7.0.5" rimraf@~2.2.6: version "2.2.8" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= route-recognizer@^0.2.3: version "0.2.10" resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.2.10.tgz#024b2283c2e68d13a7c7f5173a5924645e8902df" + integrity sha1-Aksig8LmjROnx/UXOlkkZF6JAt8= route-recognizer@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.3.tgz#1d365e27fa6995e091675f7dc940a8c00353bd29" + integrity sha1-HTZeJ/ppleCRZ199yUCowANTvSk= rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.2.1, rsvp@^3.3.1, rsvp@^3.3.3, rsvp@^3.5.0: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" + integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== rsvp@^4.6.1, rsvp@^4.7.0: version "4.8.1" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.1.tgz#168addb3963222de37ee351b70e3876bdb2ac285" + integrity sha512-c9tShmZbQ5nLVVVl3Fuhk1NExJlXfAMIEz7a8GC570X8XhNQNZPFAdjOeMmJEN3SLYOOb2OprS576P/QO4QouA== rsvp@^4.8.2: version "4.8.3" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.3.tgz#25d4b9fdd0f95e216eb5884d9b3767d3fbfbe2cd" + integrity sha512-/OlbK31XtkPnLD2ktmZXj4g/v6q1boTDr6/3lFuDTgxVsrA3h7PH5eYyAxIvDMjRHr/DoOlzNicqDwBEo9xU7g== rsvp@~3.0.6: version "3.0.21" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.0.21.tgz#49c588fe18ef293bcd0ab9f4e6756e6ac433359f" + integrity sha1-ScWI/hjvKTvNCrn05nVuasQzNZ8= rsvp@~3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.2.1.tgz#07cb4a5df25add9e826ebc67dcc9fd89db27d84a" + integrity sha1-B8tKXfJa3Z6Cbrxn3Mn9idsn2Eo= run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= dependencies: is-promise "^2.1.0" rx-lite-aggregates@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= dependencies: rx-lite "*" rx-lite@*, rx-lite@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= rx@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== safe-json-parse@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" + integrity sha1-PnZyPjjf3aE8mx0poeB//uSzC1c= sane@^1.1.1, sane@^1.4.1: version "1.7.0" resolved "https://registry.yarnpkg.com/sane/-/sane-1.7.0.tgz#b3579bccb45c94cf20355cc81124990dfd346e30" + integrity sha1-s1ebzLRclM8gNVzIESSZDf00bjA= dependencies: anymatch "^1.3.0" exec-sh "^0.2.0" @@ -6303,6 +7246,7 @@ sane@^1.1.1, sane@^1.4.1: sane@^2.2.0: version "2.4.1" resolved "https://registry.yarnpkg.com/sane/-/sane-2.4.1.tgz#29f991208cf28636720efdc584293e7fd66663a5" + integrity sha512-fW9svvNd81XzHDZyis9/tEY1bZikDGryy8Hi1BErPyNPYv47CdLseUN+tI5FBHWXEENRtj1SWtX/jBnggLaP0w== dependencies: anymatch "^1.3.0" exec-sh "^0.2.0" @@ -6317,18 +7261,22 @@ sane@^2.2.0: sax@^1.2.1, sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== "semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.1.1, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== semver@^4.3.1: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= send@0.16.1: version "0.16.1" resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" + integrity sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A== dependencies: debug "2.6.9" depd "~1.1.1" @@ -6347,6 +7295,7 @@ send@0.16.1: serve-static@1.13.1: version "1.13.1" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" + integrity sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ== dependencies: encodeurl "~1.0.1" escape-html "~1.0.3" @@ -6356,20 +7305,24 @@ serve-static@1.13.1: set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= set-getter@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376" + integrity sha1-12nBgsnVpR9AkUXy+6guXoboA3Y= dependencies: to-object-path "^0.3.0" set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= set-value@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -6379,6 +7332,7 @@ set-value@^0.4.3: set-value@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -6388,62 +7342,75 @@ set-value@^2.0.0: setprototypeof@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + integrity sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ= setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= dependencies: shebang-regex "^1.0.0" shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= shelljs@^0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.2.6.tgz#90492d72ffcc8159976baba62fb0f6884f0c3378" + integrity sha1-kEktcv/MgVmXa6umL7D2iE8MM3g= shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= silent-error@^1.0.0, silent-error@^1.0.1, silent-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/silent-error/-/silent-error-1.1.0.tgz#2209706f1c850a9f1d10d0d840918b46f26e1bc9" + integrity sha1-IglwbxyFCp8dENDYQJGLRvJuG8k= dependencies: debug "^2.2.0" simple-dom@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/simple-dom/-/simple-dom-1.3.0.tgz#8473e0d34e340544b061410dba3faf4f1b7aa282" + integrity sha512-RVjr6e80FFGDqDJZeQd4EMwoDLatn4Jy2SfuXecrP1IgG4ZAqkGSokE8LNV5i0kzWR2IM0e257xGN9JS8lxm0Q== slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= slice-ansi@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== dependencies: is-fullwidth-code-point "^2.0.0" snake-case@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f" + integrity sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8= dependencies: no-case "^2.2.0" snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: define-property "^1.0.0" isobject "^3.0.0" @@ -6452,12 +7419,14 @@ snapdragon-node@^2.0.1: snapdragon-util@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== dependencies: kind-of "^3.2.0" snapdragon@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.1.tgz#e12b5487faded3e3dea0ac91e9400bf75b401370" + integrity sha1-4StUh/re0+PeoKyR6UAL91tAE3A= dependencies: base "^0.11.1" debug "^2.2.0" @@ -6471,18 +7440,21 @@ snapdragon@^0.8.1: sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + integrity sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg= dependencies: hoek "2.x.x" sntp@2.x.x: version "2.1.0" resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" + integrity sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg== dependencies: hoek "4.x.x" socket.io-adapter@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" + integrity sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s= dependencies: debug "2.3.3" socket.io-parser "2.3.1" @@ -6490,6 +7462,7 @@ socket.io-adapter@0.5.0: socket.io-client@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.6.0.tgz#5b668f4f771304dfeed179064708386fa6717853" + integrity sha1-W2aPT3cTBN/u0XkGRwg4b6ZxeFM= dependencies: backo2 "1.0.2" component-bind "1.0.0" @@ -6506,6 +7479,7 @@ socket.io-client@1.6.0: socket.io-parser@2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0" + integrity sha1-3VMgJRA85Clpcya+/WQAX8/ltKA= dependencies: component-emitter "1.1.2" debug "2.2.0" @@ -6515,6 +7489,7 @@ socket.io-parser@2.3.1: socket.io@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.6.0.tgz#3e40d932637e6bd923981b25caf7c53e83b6e2e1" + integrity sha1-PkDZMmN+a9kjmBslyvfFPoO24uE= dependencies: debug "2.3.3" engine.io "1.8.0" @@ -6527,16 +7502,19 @@ socket.io@1.6.0: sort-object-keys@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.2.tgz#d3a6c48dc2ac97e6bc94367696e03f6d09d37952" + integrity sha1-06bEjcKsl+a8lDZ2luA/bQnTeVI= sort-package-json@^1.4.0: version "1.7.1" resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.7.1.tgz#f2e5fbffe8420cc1bb04485f4509f05e73b4c0f2" + integrity sha1-8uX7/+hCDMG7BEhfRQnwXnO0wPI= dependencies: sort-object-keys "^1.1.1" source-map-resolve@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" + integrity sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A== dependencies: atob "^2.0.0" decode-uri-component "^0.2.0" @@ -6547,12 +7525,14 @@ source-map-resolve@^0.5.0: source-map-support@^0.4.15: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== dependencies: source-map "^0.5.6" source-map-support@^0.5.0: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" + integrity sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -6560,34 +7540,41 @@ source-map-support@^0.5.0: source-map-url@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" + integrity sha1-fsrxO1e80J2opAxdJp2zN5nUqvk= source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= source-map@0.4.x, source-map@^0.4.2, source-map@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha1-66T12pwNyZneaAMti092FzZSA2s= dependencies: amdefine ">=0.0.4" source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.1, source-map@~0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= source-map@^0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@~0.1.x: version "0.1.43" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y= dependencies: amdefine ">=0.0.4" sourcemap-validator@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/sourcemap-validator/-/sourcemap-validator-1.0.6.tgz#abd2f1ecdae6a3c46c2c96c5f256705b2147c9c0" + integrity sha1-q9Lx7Nrmo8RsLJbF8lZwWyFHycA= dependencies: jsesc "~0.3.x" lodash.foreach "~2.3.x" @@ -6597,10 +7584,12 @@ sourcemap-validator@^1.0.5: spawn-args@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/spawn-args/-/spawn-args-0.2.0.tgz#fb7d0bd1d70fd4316bd9e3dec389e65f9d6361bb" + integrity sha1-+30L0dcP1DFr2ePew4nmX51jYbs= spawn-sync@^1.0.11, spawn-sync@^1.0.15: version "1.0.15" resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" + integrity sha1-sAeZVX63+wyDdsKdROih6mfldHY= dependencies: concat-stream "^1.4.7" os-shim "^0.1.2" @@ -6608,42 +7597,51 @@ spawn-sync@^1.0.11, spawn-sync@^1.0.15: spawnback@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/spawnback/-/spawnback-1.0.0.tgz#f73662f7e54d95367eca74d6426c677dd7ea686f" + integrity sha1-9zZi9+VNlTZ+ynTWQmxnfdfqaG8= spdx-correct@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + integrity sha1-SzBz2TP/UfORLwOsVRlJikFQ20A= dependencies: spdx-license-ids "^1.0.2" spdx-expression-parse@~1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + integrity sha1-m98vIOH0DtRH++JzJmGR/O1RYmw= spdx-license-ids@^1.0.2: version "1.2.2" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + integrity sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc= split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== dependencies: extend-shallow "^3.0.0" sprintf-js@^1.0.3: version "1.1.1" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c" + integrity sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw= sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sri-toolbox@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/sri-toolbox/-/sri-toolbox-0.2.0.tgz#a7fea5c3fde55e675cf1c8c06f3ebb5c2935835e" + integrity sha1-p/6lw/3lXmdc8cjAbz67XCk1g14= sshpk@^1.7.0: version "1.13.1" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + integrity sha1-US322mKHFEMW3EwY/hzx2UBzm+M= dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -6658,6 +7656,7 @@ sshpk@^1.7.0: static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= dependencies: define-property "^0.2.5" object-copy "^0.1.0" @@ -6665,22 +7664,27 @@ static-extend@^0.1.1: "statuses@>= 1.3.1 < 2": version "1.4.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== statuses@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= stealthy-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= string-template@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" + integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0= string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" @@ -6689,6 +7693,7 @@ string-width@^1.0.1, string-width@^1.0.2: string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" @@ -6696,106 +7701,127 @@ string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: string_decoder@0.10, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= string_decoder@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + integrity sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ== dependencies: safe-buffer "~5.1.0" stringstream@~0.0.4, stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + integrity sha1-TkhM1N5aC7vuGORjB3EKioFiGHg= strip-ansi@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" + integrity sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA= dependencies: ansi-regex "^0.2.1" strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= dependencies: ansi-regex "^3.0.0" strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= dependencies: is-utf8 "^0.2.0" strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= dependencies: get-stdin "^4.0.1" strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= styled_string@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/styled_string/-/styled_string-0.0.1.tgz#d22782bd81295459bc4f1df18c4bad8e94dd124a" + integrity sha1-0ieCvYEpVFm8Tx3xjEutjpTdEko= sum-up@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/sum-up/-/sum-up-1.0.3.tgz#1c661f667057f63bcb7875aa1438bc162525156e" + integrity sha1-HGYfZnBX9jvLeHWqFDi8FiUlFW4= dependencies: chalk "^1.0.0" supports-color@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + integrity sha1-cqJiiU2dQIuVbKBf83su2KbiotU= dependencies: has-flag "^1.0.0" supports-color@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" + integrity sha1-2S3iaU6z9nMjlz1649i1W0wiGQo= supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= supports-color@^4.0.0: version "4.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" + integrity sha1-vnoN5ITexcXN34s9WRJQRJEvY1s= dependencies: has-flag "^2.0.0" supports-color@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.2.0.tgz#b0d5333b1184dd3666cbe5aa0b45c5ac7ac17a4a" + integrity sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q== dependencies: has-flag "^3.0.0" symbol-tree@^3.2.1, symbol-tree@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.3, symlink-or-copy@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.1.8.tgz#cabe61e0010c1c023c173b25ee5108b37f4b4aa3" + integrity sha1-yr5h4AEMHAI8Fzsl7lEIs39LSqM= table@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" + integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA== dependencies: ajv "^5.2.3" ajv-keywords "^2.1.0" @@ -6807,6 +7833,7 @@ table@^4.0.1: tap-parser@^5.1.0: version "5.4.0" resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-5.4.0.tgz#6907e89725d7b7fa6ae41ee2c464c3db43188aec" + integrity sha512-BIsIaGqv7uTQgTW1KLTMNPSEQf4zDDPgYOBRdgOfuB+JFOLRBfEu6cLa/KvMvmqggu1FKXDfitjLwsq4827RvA== dependencies: events-to-array "^1.0.1" js-yaml "^3.2.7" @@ -6816,6 +7843,7 @@ tap-parser@^5.1.0: tar-pack@^3.4.0: version "3.4.1" resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" + integrity sha512-PPRybI9+jM5tjtCbN2cxmmRU7YmqT3Zv/UDy48tAh2XRkLa9bAORtSWLkVc13+GJF+cdTh1yEnHEk3cpTaL5Kg== dependencies: debug "^2.2.0" fstream "^1.0.10" @@ -6829,6 +7857,7 @@ tar-pack@^3.4.0: tar@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + integrity sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE= dependencies: block-stream "*" fstream "^1.0.2" @@ -6837,6 +7866,7 @@ tar@^2.2.1: temp@0.8.3, temp@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" + integrity sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k= dependencies: os-tmpdir "^1.0.0" rimraf "~2.2.6" @@ -6844,6 +7874,7 @@ temp@0.8.3, temp@^0.8.3: testem@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/testem/-/testem-2.0.0.tgz#b05c96200c7ac98bae998d71c94c0c5345907d13" + integrity sha1-sFyWIAx6yYuumY1xyUwMU0WQfRM= dependencies: backbone "^1.1.2" bluebird "^3.4.6" @@ -6876,30 +7907,36 @@ testem@^2.0.0: text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= "textextensions@1 || 2": version "2.2.0" resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.2.0.tgz#38ac676151285b658654581987a0ce1a4490d286" + integrity sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA== thenify-all@^1.0.0, thenify-all@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= dependencies: thenify ">= 3.1.0 < 4" "thenify@>= 3.1.0 < 4": version "3.3.0" resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" + integrity sha1-5p44obq+lpsBCCB5eLn2K4hgSDk= dependencies: any-promise "^1.0.0" through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= tiny-lr@^1.0.3: version "1.1.0" resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.1.0.tgz#a373bce2a4b58cef9a64433360ba593155f4cd45" + integrity sha512-f4X68a6KHcCx/XJcZUKAa92APjY9EHxuGOzRFmPRjf+fOp1E7fi4dGJaHMxvRBxwZrHrIvn/AwkFaDS7O1WZDQ== dependencies: body "^5.1.0" debug "~2.6.7" @@ -6911,52 +7948,62 @@ tiny-lr@^1.0.3: tmp@0.0.28: version "0.0.28" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" + integrity sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA= dependencies: os-tmpdir "~1.0.1" tmp@0.0.31: version "0.0.31" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" + integrity sha1-jzirlDjhcxXl29izZX6L+yd65Kc= dependencies: os-tmpdir "~1.0.1" tmp@^0.0.29: version "0.0.29" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" + integrity sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA= dependencies: os-tmpdir "~1.0.1" tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= to-array@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= dependencies: is-number "^3.0.0" repeat-string "^1.6.1" @@ -6964,6 +8011,7 @@ to-regex-range@^2.1.0: to-regex@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.1.tgz#15358bee4a2c83bd76377ba1dc049d0f18837aae" + integrity sha1-FTWL7kosg712N3uh3ASdDxiDeq4= dependencies: define-property "^0.2.5" extend-shallow "^2.0.1" @@ -6972,6 +8020,7 @@ to-regex@^3.0.1: tough-cookie@>=2.3.3, tough-cookie@^2.3.4: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== dependencies: psl "^1.1.24" punycode "^1.4.1" @@ -6979,22 +8028,26 @@ tough-cookie@>=2.3.3, tough-cookie@^2.3.4: tough-cookie@^2.3.2, tough-cookie@~2.3.0, tough-cookie@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" + integrity sha1-C2GKVWW23qkL80JdBNVe3EdadWE= dependencies: punycode "^1.4.1" tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= dependencies: punycode "^2.1.0" tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= tree-sync@^1.2.1, tree-sync@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-sync/-/tree-sync-1.2.2.tgz#2cf76b8589f59ffedb58db5a3ac7cb013d0158b7" + integrity sha1-LPdrhYn1n/7bWNtaOsfLAT0BWLc= dependencies: debug "^2.2.0" fs-tree-diff "^0.5.6" @@ -7005,34 +8058,41 @@ tree-sync@^1.2.1, tree-sync@^1.2.2: trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= dependencies: prelude-ls "~1.1.2" type-detect@^4.0.0: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== type-is@~1.6.15: version "1.6.15" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" + integrity sha1-yrEPtJCeRByChC6v4a1kbIGARBA= dependencies: media-typer "0.3.0" mime-types "~2.1.15" @@ -7040,14 +8100,17 @@ type-is@~1.6.15: typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= uc.micro@^1.0.1, uc.micro@^1.0.3: version "1.0.5" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376" + integrity sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg== uglify-es@^3.1.3: version "3.3.9" resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" + integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== dependencies: commander "~2.13.0" source-map "~0.6.1" @@ -7055,6 +8118,7 @@ uglify-es@^3.1.3: uglify-js@^2.6: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= dependencies: source-map "~0.5.1" yargs "~3.10.0" @@ -7064,18 +8128,22 @@ uglify-js@^2.6: 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" + integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= uid-number@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= ultron@1.0.x: version "1.0.2" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" + integrity sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po= underscore.string@^3.2.2, underscore.string@~3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db" + integrity sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s= dependencies: sprintf-js "^1.0.3" util-deprecate "^1.0.2" @@ -7083,10 +8151,12 @@ underscore.string@^3.2.2, underscore.string@~3.3.4: underscore@>=1.8.3: version "1.8.3" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" + integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI= union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= dependencies: arr-union "^3.1.0" get-value "^2.0.6" @@ -7096,20 +8166,24 @@ union-value@^1.0.0: unique-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= dependencies: crypto-random-string "^1.0.0" universalify@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + integrity sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc= unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= dependencies: has-value "^0.3.1" isobject "^3.0.0" @@ -7117,16 +8191,19 @@ unset-value@^1.0.0: untildify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/untildify/-/untildify-2.1.0.tgz#17eb2807987f76952e9c0485fc311d06a826a2e0" + integrity sha1-F+soB5h/dpUunASF/DEdBqgmouA= dependencies: os-homedir "^1.0.0" urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= use@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8" + integrity sha1-riig1y+TvyJCKhii43mZMRLeyOg= dependencies: define-property "^0.2.5" isobject "^3.0.0" @@ -7135,6 +8212,7 @@ use@^2.0.0: user-info@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/user-info/-/user-info-1.0.0.tgz#81c82b7ed63e674c2475667653413b3c76fde239" + integrity sha1-gcgrftY+Z0wkdWZ2U0E7PHb94jk= dependencies: os-homedir "^1.0.1" passwd-user "^1.2.1" @@ -7143,28 +8221,34 @@ user-info@^1.0.0: username-sync@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/username-sync/-/username-sync-1.0.1.tgz#1cde87eefcf94b8822984d938ba2b797426dae1f" + integrity sha1-HN6H7vz5S4gimE2Ti6K3l0Jtrh8= username@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/username/-/username-1.0.1.tgz#e1f72295e3e58e06f002c6327ce06897a99cd67f" + integrity sha1-4fcilePljgbwAsYyfOBol6mc1n8= dependencies: meow "^3.4.0" util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= uuid@^3.0.0, uuid@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" + integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA== validate-npm-package-license@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + integrity sha1-KAS6vnEq0zeUWaz74kdGqywwP7w= dependencies: spdx-correct "~1.0.0" spdx-expression-parse "~1.0.0" @@ -7172,16 +8256,19 @@ validate-npm-package-license@^3.0.1: validate-npm-package-name@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= dependencies: builtins "^1.0.3" vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" @@ -7190,12 +8277,14 @@ verror@1.10.0: w3c-hr-time@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= dependencies: browser-process-hrtime "^0.1.2" walk-sync@0.3.2, walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.2.tgz#4827280afc42d0e035367c4a4e31eeac0d136f75" + integrity sha512-FMB5VqpLqOCcqrzA9okZFc0wq0Qbmdm396qJxvQZhDpyu0W95G9JCmp74tx7iyYnyOcBtUuKJsgIKAqjozvmmQ== dependencies: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" @@ -7203,6 +8292,7 @@ walk-sync@0.3.2, walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2: walk-sync@^0.2.5, walk-sync@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.2.7.tgz#b49be4ee6867657aeb736978b56a29d10fa39969" + integrity sha1-tJvk7mhnZXrrc2l4tWop0Q+jmWk= dependencies: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" @@ -7210,16 +8300,19 @@ walk-sync@^0.2.5, walk-sync@^0.2.7: walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= dependencies: makeerror "1.0.x" watch@~0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" + integrity sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw= watch@~0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" + integrity sha1-KAlUdsbffJDJYxOJkMClQj60uYY= dependencies: exec-sh "^0.2.0" minimist "^1.2.0" @@ -7227,14 +8320,17 @@ watch@~0.18.0: webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= webidl-conversions@^4.0.0, webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== websocket-driver@>=0.5.1: version "0.7.0" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" + integrity sha1-DK+dLXVdk67gSdS90NP+LMoqJOs= dependencies: http-parser-js ">=0.4.0" websocket-extensions ">=0.1.1" @@ -7242,20 +8338,24 @@ websocket-driver@>=0.5.1: websocket-extensions@>=0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" + integrity sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw== dependencies: iconv-lite "0.4.19" whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" + integrity sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew== whatwg-url@^4.3.0: version "4.8.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" + integrity sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA= dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" @@ -7263,6 +8363,7 @@ whatwg-url@^4.3.0: whatwg-url@^6.4.0, whatwg-url@^6.4.1: version "6.5.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== dependencies: lodash.sortby "^4.7.0" tr46 "^1.0.1" @@ -7271,44 +8372,53 @@ whatwg-url@^6.4.0, whatwg-url@^6.4.1: which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + integrity sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg== dependencies: isexe "^2.0.0" wide-align@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + integrity sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w== dependencies: string-width "^1.0.2" window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= workerpool@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-2.3.0.tgz#86c5cbe946b55e7dc9d12b1936c8801a6e2d744d" + integrity sha512-JP5DpviEV84zDmz13QnD4FfRjZBjnTOYY2O4pGgxtlqLh47WOzQFHm8o17TE5OSfcDoKC6vHSrN4yPju93DW0Q== dependencies: object-assign "4.1.1" wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= write-file-atomic@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA== dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" @@ -7317,12 +8427,14 @@ write-file-atomic@^2.0.0: write@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= dependencies: mkdirp "^0.5.1" ws@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018" + integrity sha1-CC3bbGQehdS7RR8D1S8G6r2x8Bg= dependencies: options ">=0.0.5" ultron "1.0.x" @@ -7330,44 +8442,54 @@ ws@1.1.1: ws@^5.2.0: version "5.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== dependencies: async-limiter "~1.0.0" wtf-8@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" + integrity sha1-OS2LotDxw00e4tYw8V0O+2jhBIo= xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= xml-name-validator@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + integrity sha1-TYuPHszTQZqjYgYb7O9RXh5VljU= xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== xmldom@^0.1.19: version "0.1.27" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" + integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= xmlhttprequest-ssl@1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" + integrity sha1-GFqIjATspGw+QHDZn3tJ3jUomS0= xtend@^4.0.0, xtend@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= yam@0.0.22: version "0.0.22" resolved "https://registry.yarnpkg.com/yam/-/yam-0.0.22.tgz#38a76cb79a19284d9206ed49031e359a1340bd06" + integrity sha1-OKdst5oZKE2SBu1JAx41mhNAvQY= dependencies: fs-extra "^0.30.0" lodash.merge "^4.4.0" @@ -7375,6 +8497,7 @@ yam@0.0.22: yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= dependencies: camelcase "^1.0.2" cliui "^2.1.0" @@ -7384,3 +8507,4 @@ yargs@~3.10.0: yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= From 75e20040e9bc53332236e4aed2c5fad959aade49 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sun, 30 Sep 2018 14:08:04 -0400 Subject: [PATCH 226/879] Hide a bunch of stuff --- addon-test-support/setup-mirage.js | 17 ++++++------ addon/db.js | 1 + addon/ember-data.js | 3 +++ addon/factory.js | 3 +++ addon/get-rfc232-test-context.js | 10 ++++--- addon/identity-manager.js | 1 + .../ember-cli-mirage-autostart.js | 18 +++++++------ addon/orm/associations/association.js | 3 +++ addon/orm/associations/belongs-to.js | 1 + addon/orm/associations/has-many.js | 1 + addon/route-handler.js | 3 +++ addon/route-handlers/base.js | 3 +++ addon/route-handlers/function.js | 3 +++ addon/route-handlers/object.js | 3 +++ addon/route-handlers/shorthands/base.js | 3 +++ addon/route-handlers/shorthands/delete.js | 3 +++ addon/route-handlers/shorthands/get.js | 3 +++ addon/route-handlers/shorthands/head.js | 3 +++ addon/route-handlers/shorthands/post.js | 3 +++ addon/route-handlers/shorthands/put.js | 3 +++ addon/serializer-registry.js | 3 +++ addon/serializers/json-api-serializer.js | 13 ++++++++++ addon/server.js | 8 ++++++ addon/start-mirage.js | 26 ++++++++++--------- addon/trait.js | 3 +++ addon/utils/ember-data.js | 6 +++++ addon/utils/extend.js | 3 +++ addon/utils/is-association.js | 3 +++ addon/utils/normalize-name.js | 9 +++++++ addon/utils/read-modules.js | 4 ++- addon/utils/reference-sort.js | 3 +++ addon/utils/uuid.js | 4 ++- config/addon-docs.js | 2 +- tests/dummy/app/templates/docs.hbs | 4 +-- 34 files changed, 142 insertions(+), 37 deletions(-) diff --git a/addon-test-support/setup-mirage.js b/addon-test-support/setup-mirage.js index 59ce995de..ec43fa620 100644 --- a/addon-test-support/setup-mirage.js +++ b/addon-test-support/setup-mirage.js @@ -1,14 +1,15 @@ import startMirage from 'ember-cli-mirage/start-mirage'; import { settled } from '@ember/test-helpers'; -// -// Used to set up mirage for a test. Must be called after one of the -// `ember-qunit` `setup*Test()` methods. It starts the server and sets -// `this.server` to point to it, and shuts the server down when the test -// finishes. -// -// NOTE: the `hooks = self` is for mocha support -// +/** + Used to set up mirage for a test. Must be called after one of the + `ember-qunit` `setup*Test()` methods. It starts the server and sets + `this.server` to point to it, and shuts the server down when the test + finishes. + + NOTE: the `hooks = self` is for mocha support + @hide +*/ export default function setupMirage(hooks = self) { hooks.beforeEach(function() { if (!this.owner) { diff --git a/addon/db.js b/addon/db.js index a3eaf9179..dab73b8ef 100644 --- a/addon/db.js +++ b/addon/db.js @@ -11,6 +11,7 @@ import _cloneDeep from 'lodash/cloneDeep'; @class Db @constructor @public + @hide */ class Db { diff --git a/addon/ember-data.js b/addon/ember-data.js index 5a60efbf2..6be94eee1 100644 --- a/addon/ember-data.js +++ b/addon/ember-data.js @@ -19,6 +19,7 @@ let DsModels, Models; * * @method getDsModels * @private + * @hide * @return {Object} models */ export function getDsModels() { @@ -57,6 +58,7 @@ export function getDsModels() { * * @method getModels * @private + * @hide * @return {Object} models */ export function getModels() { @@ -92,6 +94,7 @@ export function getModels() { * @private * @param {String} name * @return {Model} + * @hide */ export function modelFor(name) { let models = getModels(); diff --git a/addon/factory.js b/addon/factory.js index 81ea1fa7f..8fe4d590b 100644 --- a/addon/factory.js +++ b/addon/factory.js @@ -139,4 +139,7 @@ function sortAttrs(attrs, sequence) { return referenceSort(refs); } +/** + * @hide +*/ export default Factory; diff --git a/addon/get-rfc232-test-context.js b/addon/get-rfc232-test-context.js index 52c4c07d7..d11fddcda 100644 --- a/addon/get-rfc232-test-context.js +++ b/addon/get-rfc232-test-context.js @@ -1,9 +1,11 @@ import require from 'require'; -// -// Helper to get our rfc232/rfc268 test context object, or null if we're not in -// such a test. -// +/** + Helper to get our rfc232/rfc268 test context object, or null if we're not in + such a test. + + @hide +*/ export default function getRfc232TestContext() { // Support older versions of `ember-qunit` that don't have // `@ember/test-helpers` (and therefore cannot possibly be running an diff --git a/addon/identity-manager.js b/addon/identity-manager.js index 4fb3c6278..76ae9f84d 100644 --- a/addon/identity-manager.js +++ b/addon/identity-manager.js @@ -8,6 +8,7 @@ function isNumber(n) { * @class IdentityManager * @constructor * @public + * @hide */ class IdentityManager { diff --git a/addon/instance-initializers/ember-cli-mirage-autostart.js b/addon/instance-initializers/ember-cli-mirage-autostart.js index ad518d9fd..fc6c1d650 100644 --- a/addon/instance-initializers/ember-cli-mirage-autostart.js +++ b/addon/instance-initializers/ember-cli-mirage-autostart.js @@ -14,14 +14,16 @@ const MirageShutdown = EmberObject.extend({ } }); -// -// If we are running an rfc232/rfc268 test then we want to support the -// `autostart` configuration option, which auto-starts mirage before the test -// runs and shuts it down afterwards, and also sets `this.server` on the test -// context so the tests don't need to use the global `server`. We do this in an -// instance initializer because initializers only run once per test run, not -// before and after each test. -// +/** + If we are running an rfc232/rfc268 test then we want to support the + `autostart` configuration option, which auto-starts mirage before the test + runs and shuts it down afterwards, and also sets `this.server` on the test + context so the tests don't need to use the global `server`. We do this in an + instance initializer because initializers only run once per test run, not + before and after each test. + + @hide +*/ export function initialize(appInstance) { let testContext = getRfc232TestContext(); if (testContext) { diff --git a/addon/orm/associations/association.js b/addon/orm/associations/association.js index be3bac2c6..ba0476325 100644 --- a/addon/orm/associations/association.js +++ b/addon/orm/associations/association.js @@ -1,5 +1,8 @@ import { camelize, singularize, dasherize } from 'ember-cli-mirage/utils/inflector'; +/** + @hide +*/ export default class Association { constructor(modelName, opts) { diff --git a/addon/orm/associations/belongs-to.js b/addon/orm/associations/belongs-to.js index 8a123ff2d..106b3e28e 100644 --- a/addon/orm/associations/belongs-to.js +++ b/addon/orm/associations/belongs-to.js @@ -11,6 +11,7 @@ import assert from 'ember-cli-mirage/assert'; * @extends Association * @constructor * @public + * @hide */ export default class BelongsTo extends Association { diff --git a/addon/orm/associations/has-many.js b/addon/orm/associations/has-many.js index f57576e52..d82dfdb50 100644 --- a/addon/orm/associations/has-many.js +++ b/addon/orm/associations/has-many.js @@ -12,6 +12,7 @@ import assert from 'ember-cli-mirage/assert'; * @extends Association * @constructor * @public + * @hide */ export default class HasMany extends Association { diff --git a/addon/route-handler.js b/addon/route-handler.js index ab65fa14a..1eaf7d39a 100644 --- a/addon/route-handler.js +++ b/addon/route-handler.js @@ -42,6 +42,9 @@ function createHandler({ verb, schema, serializerOrRegistry, path, rawHandler, o return handler; } +/** + * @hide + */ export default class RouteHandler { constructor({ schema, verb, rawHandler, customizedCode, options, path, serializerOrRegistry }) { diff --git a/addon/route-handlers/base.js b/addon/route-handlers/base.js index 56849d6cb..b9ac81e00 100644 --- a/addon/route-handlers/base.js +++ b/addon/route-handlers/base.js @@ -3,6 +3,9 @@ import { camelize, singularize, dasherize } from 'ember-cli-mirage/utils/inflect const PATH_VAR_REGEXP = /^:/; +/** + @hide +*/ export default class BaseRouteHandler { getModelClassFromPath(fullPath) { diff --git a/addon/route-handlers/function.js b/addon/route-handlers/function.js index adec306c5..39a2994f5 100644 --- a/addon/route-handlers/function.js +++ b/addon/route-handlers/function.js @@ -1,5 +1,8 @@ import BaseRouteHandler from './base'; +/** + * @hide + */ export default class FunctionRouteHandler extends BaseRouteHandler { constructor(schema, serializerOrRegistry, userFunction, path) { diff --git a/addon/route-handlers/object.js b/addon/route-handlers/object.js index 726179897..2377f50a4 100644 --- a/addon/route-handlers/object.js +++ b/addon/route-handlers/object.js @@ -1,3 +1,6 @@ +/** + * @hide + */ export default class ObjectRouteHandler { constructor(schema, serializerOrRegistry, object) { diff --git a/addon/route-handlers/shorthands/base.js b/addon/route-handlers/shorthands/base.js index 99a35bd28..36259d7b0 100644 --- a/addon/route-handlers/shorthands/base.js +++ b/addon/route-handlers/shorthands/base.js @@ -1,6 +1,9 @@ import { toCollectionName } from 'ember-cli-mirage/utils/normalize-name'; import BaseRouteHandler from '../base'; +/** + @hide +*/ export default class BaseShorthandRouteHandler extends BaseRouteHandler { constructor(schema, serializerOrRegistry, shorthand, path, options = {}) { diff --git a/addon/route-handlers/shorthands/delete.js b/addon/route-handlers/shorthands/delete.js index b38eb8475..00d9d1a9e 100644 --- a/addon/route-handlers/shorthands/delete.js +++ b/addon/route-handlers/shorthands/delete.js @@ -2,6 +2,9 @@ import assert from 'ember-cli-mirage/assert'; import BaseShorthandRouteHandler from './base'; import { pluralize, camelize } from 'ember-cli-mirage/utils/inflector'; +/** + * @hide + */ export default class DeleteShorthandRouteHandler extends BaseShorthandRouteHandler { /* diff --git a/addon/route-handlers/shorthands/get.js b/addon/route-handlers/shorthands/get.js index 403e31f80..bc264f7c9 100644 --- a/addon/route-handlers/shorthands/get.js +++ b/addon/route-handlers/shorthands/get.js @@ -3,6 +3,9 @@ import BaseShorthandRouteHandler from './base'; import { Response } from 'ember-cli-mirage'; import { singularize, camelize } from 'ember-cli-mirage/utils/inflector'; +/** + * @hide + */ export default class GetShorthandRouteHandler extends BaseShorthandRouteHandler { /* diff --git a/addon/route-handlers/shorthands/head.js b/addon/route-handlers/shorthands/head.js index 82724ba20..b894f4933 100644 --- a/addon/route-handlers/shorthands/head.js +++ b/addon/route-handlers/shorthands/head.js @@ -3,6 +3,9 @@ import BaseShorthandRouteHandler from './base'; import { Response } from 'ember-cli-mirage'; import { camelize } from 'ember-cli-mirage/utils/inflector'; +/** + * @hide + */ export default class HeadShorthandRouteHandler extends BaseShorthandRouteHandler { /* diff --git a/addon/route-handlers/shorthands/post.js b/addon/route-handlers/shorthands/post.js index 1ce91599d..6a904801d 100644 --- a/addon/route-handlers/shorthands/post.js +++ b/addon/route-handlers/shorthands/post.js @@ -2,6 +2,9 @@ import assert from 'ember-cli-mirage/assert'; import BaseShorthandRouteHandler from './base'; import { camelize } from 'ember-cli-mirage/utils/inflector'; +/** + * @hide + */ export default class PostShorthandRouteHandler extends BaseShorthandRouteHandler { /* diff --git a/addon/route-handlers/shorthands/put.js b/addon/route-handlers/shorthands/put.js index ea0084fd0..7bf1461cc 100644 --- a/addon/route-handlers/shorthands/put.js +++ b/addon/route-handlers/shorthands/put.js @@ -2,6 +2,9 @@ import assert from 'ember-cli-mirage/assert'; import BaseShorthandRouteHandler from './base'; import { camelize } from 'ember-cli-mirage/utils/inflector'; +/** + * @hide + */ export default class PutShorthandRouteHandler extends BaseShorthandRouteHandler { /* diff --git a/addon/serializer-registry.js b/addon/serializer-registry.js index d9f7e17a2..2ae885f39 100644 --- a/addon/serializer-registry.js +++ b/addon/serializer-registry.js @@ -8,6 +8,9 @@ import assert from './assert'; import _assign from 'lodash/assign'; +/** + * @hide + */ export default class SerializerRegistry { constructor(schema, serializerMap = {}) { diff --git a/addon/serializers/json-api-serializer.js b/addon/serializers/json-api-serializer.js index 4fd545e01..47cb57309 100644 --- a/addon/serializers/json-api-serializer.js +++ b/addon/serializers/json-api-serializer.js @@ -4,8 +4,21 @@ import _get from 'lodash/get'; import _ from 'lodash'; import assert from 'ember-cli-mirage/assert'; +/** + The JSONAPISerializer. + + @class JSONAPISerializer + @constructor + @public + @hide + */ const JSONAPISerializer = Serializer.extend({ + /** + Do something. + @property keyForModel + @public + */ keyForModel(modelName) { return dasherize(modelName); }, diff --git a/addon/server.js b/addon/server.js index 1d9e99ade..a67d23596 100644 --- a/addon/server.js +++ b/addon/server.js @@ -81,10 +81,17 @@ const defaultRouteOptions = { timing: undefined }; +/** + @hide +*/ const defaultPassthroughs = [ 'http://localhost:0/chromecheckurl', // mobile chrome 'http://localhost:30820/socket.io' // electron ]; + +/** + @hide +*/ export { defaultPassthroughs }; /** @@ -144,6 +151,7 @@ function extractRouteArguments(args) { @class Server @public + @hide */ export default class Server { diff --git a/addon/start-mirage.js b/addon/start-mirage.js index 5078ef6be..3d3fd5e2f 100644 --- a/addon/start-mirage.js +++ b/addon/start-mirage.js @@ -3,18 +3,20 @@ import readModules from 'ember-cli-mirage/utils/read-modules'; import Server from 'ember-cli-mirage/server'; import _assign from 'lodash/assign'; -// -// Helper to start mirage. This should not be called directly. In rfc232/rfc268 -// tests, use `setupMirage()` or the `autoboot` option in the addon config -// in the environment. In legacy tests that call `startMirage` directly, this -// should be called via the `startMirage` method exported from -// `/initializers/ember-cli-mirage`. -// -// This is intended to be called with only the `owner` argument (which would be -// `this.owner` in an rfc232/rfc268 test, or the application instance if called -// from an instance initializer). However, to support the legacy initializer, it -// can instead accept a hash of the environment and config objects. -// +/** + Helper to start mirage. This should not be called directly. In rfc232/rfc268 + tests, use `setupMirage()` or the `autoboot` option in the addon config + in the environment. In legacy tests that call `startMirage` directly, this + should be called via the `startMirage` method exported from + `/initializers/ember-cli-mirage`. + + This is intended to be called with only the `owner` argument (which would be + `this.owner` in an rfc232/rfc268 test, or the application instance if called + from an instance initializer). However, to support the legacy initializer, it + can instead accept a hash of the environment and config objects. + + @hide +*/ export default function startMirage(owner, { env, baseConfig, testConfig } = {}) { if (!env || !baseConfig) { if (!owner) { diff --git a/addon/trait.js b/addon/trait.js index f45505ae8..415cd3c88 100644 --- a/addon/trait.js +++ b/addon/trait.js @@ -6,4 +6,7 @@ let trait = function(extension) { }; }; +/** + @hide +*/ export default trait; diff --git a/addon/utils/ember-data.js b/addon/utils/ember-data.js index 6882ddf34..a7a36355a 100644 --- a/addon/utils/ember-data.js +++ b/addon/utils/ember-data.js @@ -7,8 +7,14 @@ function _hasEmberData() { return !!_find(Object.keys(requirejs.entries), (e) => !!e.match(matchRegex)); } +/** + @hide +*/ export const hasEmberData = _hasEmberData(); +/** + @hide +*/ export function isDsModel(m) { return m && typeof m.eachRelationship === 'function'; } diff --git a/addon/utils/extend.js b/addon/utils/extend.js index 178fe9771..75a03016d 100644 --- a/addon/utils/extend.js +++ b/addon/utils/extend.js @@ -1,6 +1,9 @@ import _assign from 'lodash/assign'; import _has from 'lodash/has'; +/** + @hide +*/ export default function extend(protoProps, staticProps) { let Parent = this; diff --git a/addon/utils/is-association.js b/addon/utils/is-association.js index 880a3855b..3f1079547 100644 --- a/addon/utils/is-association.js +++ b/addon/utils/is-association.js @@ -1,5 +1,8 @@ import _isPlainObject from 'lodash/isPlainObject'; +/** + @hide +*/ export default function(object) { return _isPlainObject(object) && object.__isAssociation__ === true; } diff --git a/addon/utils/normalize-name.js b/addon/utils/normalize-name.js index 2cd4c9e87..fecc85d07 100644 --- a/addon/utils/normalize-name.js +++ b/addon/utils/normalize-name.js @@ -5,15 +5,24 @@ import { dasherize } from 'ember-cli-mirage/utils/inflector'; +/** + @hide +*/ export function toCollectionName(type) { let modelName = dasherize(type); return camelize(pluralize(modelName)); } +/** + @hide +*/ export function toInternalCollectionName(type) { return `_${toCollectionName(type)}`; } +/** + @hide +*/ export function toModelName(type) { let modelName = dasherize(type); return singularize(modelName); diff --git a/addon/utils/read-modules.js b/addon/utils/read-modules.js index 68978bae3..2d4105342 100644 --- a/addon/utils/read-modules.js +++ b/addon/utils/read-modules.js @@ -7,10 +7,12 @@ import _camelCase from 'lodash/camelCase'; import { pluralize } from 'ember-cli-mirage/utils/inflector'; import require from 'require'; -/* +/** This function looks through all files that have been loaded by Ember CLI and finds the ones under /mirage/[factories, fixtures, scenarios, models]/, and exports a hash containing the names of the files as keys and the data as values. + + @hide */ export default function(prefix) { let modules = ['factories', 'fixtures', 'scenarios', 'models', 'serializers', 'identity-managers']; diff --git a/addon/utils/reference-sort.js b/addon/utils/reference-sort.js index 00f45247f..93b3627d4 100644 --- a/addon/utils/reference-sort.js +++ b/addon/utils/reference-sort.js @@ -2,6 +2,9 @@ import _uniq from 'lodash/uniq'; import _flatten from 'lodash/flatten'; +/** + @hide +*/ export default function(edges) { let nodes = _uniq(_flatten(edges)); let cursor = nodes.length; diff --git a/addon/utils/uuid.js b/addon/utils/uuid.js index a806f792f..a6baea541 100644 --- a/addon/utils/uuid.js +++ b/addon/utils/uuid.js @@ -1,5 +1,7 @@ -/* +/** UUID generator + + @hide */ export default function() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { diff --git a/config/addon-docs.js b/config/addon-docs.js index cb7d809e8..3f3b4a13f 100644 --- a/config/addon-docs.js +++ b/config/addon-docs.js @@ -7,6 +7,6 @@ module.exports = class extends AddonDocsConfig { // See https://ember-learn.github.io/ember-cli-addon-docs/docs/deploying // for details on configuration you can override here. - brand: 'blue' + // brand: 'blue' }; diff --git a/tests/dummy/app/templates/docs.hbs b/tests/dummy/app/templates/docs.hbs index 3ef7e6e63..80a563d19 100644 --- a/tests/dummy/app/templates/docs.hbs +++ b/tests/dummy/app/templates/docs.hbs @@ -12,9 +12,9 @@ {{nav.item 'Seeding your database' 'docs.writing-your-server.seeding-your-database'}} {{nav.item 'Acceptance testing' 'docs.writing-your-server.acceptance-testing'}} - {{nav.section 'Examples'}} + {{!-- {{nav.section 'Examples'}} {{nav.item '1: Belongs to (no inverse)' 'docs.examples.1-belongs-to'}} - {{nav.item '2: Has many (no inverse)' 'docs.examples.2-has-many'}} + {{nav.item '2: Has many (no inverse)' 'docs.examples.2-has-many'}} --}} {{/viewer.nav}} {{#viewer.main}} From 4227077ba2e7698df92b370aa3db21bc02984186 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sun, 30 Sep 2018 14:22:57 -0400 Subject: [PATCH 227/879] Add cookbook sections --- tests/dummy/app/router.js | 5 ++++ tests/dummy/app/templates/docs.hbs | 4 +++ .../docs/cookbook/manually-starting-mirage.md | 25 +++++++++++++++++++ .../cookbook/simulating-cookie-responses.md | 25 +++++++++++++++++++ 4 files changed, 59 insertions(+) create mode 100644 tests/dummy/app/templates/docs/cookbook/manually-starting-mirage.md create mode 100644 tests/dummy/app/templates/docs/cookbook/simulating-cookie-responses.md diff --git a/tests/dummy/app/router.js b/tests/dummy/app/router.js index 01b4a5258..fb30fe719 100644 --- a/tests/dummy/app/router.js +++ b/tests/dummy/app/router.js @@ -21,6 +21,11 @@ Router.map(function() { this.route('acceptance-testing'); }); + this.route('cookbook', function() { + this.route('manually-starting-mirage'); + this.route('simulating-cookie-responses'); + }); + this.route('examples', function() { this.route('1-belongs-to'); this.route('2-has-many'); diff --git a/tests/dummy/app/templates/docs.hbs b/tests/dummy/app/templates/docs.hbs index 80a563d19..660aa32e9 100644 --- a/tests/dummy/app/templates/docs.hbs +++ b/tests/dummy/app/templates/docs.hbs @@ -12,6 +12,10 @@ {{nav.item 'Seeding your database' 'docs.writing-your-server.seeding-your-database'}} {{nav.item 'Acceptance testing' 'docs.writing-your-server.acceptance-testing'}} + {{nav.section 'Cookbook'}} + {{nav.item 'Manually starting Mirage' 'docs.cookbook.manually-starting-mirage'}} + {{nav.item 'Simulating cookie responses' 'docs.cookbook.simulating-cookie-responses'}} + {{!-- {{nav.section 'Examples'}} {{nav.item '1: Belongs to (no inverse)' 'docs.examples.1-belongs-to'}} {{nav.item '2: Has many (no inverse)' 'docs.examples.2-has-many'}} --}} diff --git a/tests/dummy/app/templates/docs/cookbook/manually-starting-mirage.md b/tests/dummy/app/templates/docs/cookbook/manually-starting-mirage.md new file mode 100644 index 000000000..bb1e85448 --- /dev/null +++ b/tests/dummy/app/templates/docs/cookbook/manually-starting-mirage.md @@ -0,0 +1,25 @@ +# Manually starting Mirage + +Mirage currently starts automatically (when not disabled in your application config) **in acceptance tests only**. This is because Mirage's server boots up in an Ember initializer. + +You can still start a Mirage server **for your integration and unit tests** with the following workaround: + +```js +// tests/integration/components/your-test.js +import { startMirage } from 'yourapp/initializers/ember-cli-mirage'; + +moduleForComponent('your-component', 'Integration | Component | your component', { + integration: true, + beforeEach() { + this.server = startMirage(); + }, + afterEach() { + this.server.shutdown(); + } +}); +``` + +Some notes: + +* In an Ember addon, you'll need to change the import path to `dummy/initializers/ember-cli-mirage`. +* The Mirage configuration of `urlPrefix` and `namespace` may require to be adapted when used with integration or unit tests. diff --git a/tests/dummy/app/templates/docs/cookbook/simulating-cookie-responses.md b/tests/dummy/app/templates/docs/cookbook/simulating-cookie-responses.md new file mode 100644 index 000000000..d044d8329 --- /dev/null +++ b/tests/dummy/app/templates/docs/cookbook/simulating-cookie-responses.md @@ -0,0 +1,25 @@ +# Simulating cookie responses + +Although Mirage allows setting headers in a response, the +XMLHttpRequest spec explicitly +[forbids access](http://www.w3.org/TR/XMLHttpRequest/#the-getresponseheader()-method) +to `Set-Cookie` and `Set-Cookie2` headers. As a result Mirage +responses cannot set cookies via headers. + +However, you can simulate receiving cookies from an ajax +call at the browser level by setting them in a route +function handler: + +```javascript +this.post('/users/login', ({ users }) => { + // log in for 24 hours + let now = new Date(); + let cookieExpiration = new Date(now.getTime() + (24 * 3600 * 1000)); + document.cookie=`remember_me=cookie-content-here; domain=.dev-domain; path=/; expires=${cookieExpiration.toUTCString()};`; + + return users.find(1); +}); +``` + +Your Ember client code will now have access to any cookies set +using `document.cookie`. From 2420acae97dd28145fb2a80e232e5fb6426a0909 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sun, 30 Sep 2018 15:04:13 -0400 Subject: [PATCH 228/879] Documenting server --- addon/server.js | 155 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 106 insertions(+), 49 deletions(-) diff --git a/addon/server.js b/addon/server.js index a67d23596..0aa601f61 100644 --- a/addon/server.js +++ b/addon/server.js @@ -151,68 +151,79 @@ function extractRouteArguments(args) { @class Server @public - @hide */ export default class Server { - /** - * Build the new server object. - * - * @constructor - * @public - */ constructor(options = {}) { this.config(options); } - /** - Set the base namespace used for all routes defined with `get`, `post`, `put` or `del`. + config(config = {}) { + let didOverrideConfig = (config.environment && (this.environment && (this.environment !== config.environment))); + assert(!didOverrideConfig, + 'You cannot modify Mirage\'s environment once the server is created'); + this.environment = config.environment || 'development'; - For example, + this._config = config; - ```js - // app/mirage/config.js - export default function() { + /** + Set the number of milliseconds for the the Server's response time. - this.namespace = '/api'; + By default there's a 400ms delay during development, and 0 delay in testing (so your tests run fast). - // this route will handle the URL '/api/contacts' - this.get('/contacts', 'contacts'); - }; - ``` + ```js + // app/mirage/config.js + export default function() { + this.timing = 400; // default + }; + ``` - Note that only routes defined after `this.namespace` are affected. This is useful if you have a few one-off routes that you don't want under your namespace: + To set the timing for individual routes, see the `timing` option for route handlers. - ```js - // app/mirage/config.js - export default function() { + @property timing + @type Number + @public + */ + this.timing = this.timing || config.timing || 400; - // this route handles /auth - this.get('/auth', function() { ...}); + /** + Set the base namespace used for all routes defined with `get`, `post`, `put` or `del`. - this.namespace = '/api'; - // this route will handle the URL '/api/contacts' - this.get('/contacts', 'contacts'); - }; - ``` + For example, - If your Ember app is loaded from the filesystem vs. a server (e.g. via Cordova or Electron vs. `ember s` or `https://yourhost.com/`), you will need to explicitly define a namespace. Likely values are `/` (if requests are made with relative paths) or `https://yourhost.com/api/...` (if requests are made to a defined server). + ```js + // app/mirage/config.js + export default function() { + this.namespace = '/api'; - For a sample implementation leveraging a configured API host & namespace, check out [this issue comment](https://github.com/samselikoff/ember-cli-mirage/issues/497#issuecomment-183458721) + // this route will handle the URL '/api/contacts' + this.get('/contacts', 'contacts'); + }; + ``` - @property namespace - @type String - @public - */ - config(config = {}) { - let didOverrideConfig = (config.environment && (this.environment && (this.environment !== config.environment))); - assert(!didOverrideConfig, - 'You cannot modify Mirage\'s environment once the server is created'); - this.environment = config.environment || 'development'; + Note that only routes defined after `this.namespace` are affected. This is useful if you have a few one-off routes that you don't want under your namespace: - this._config = config; + ```js + // app/mirage/config.js + export default function() { - this.timing = this.timing || config.timing || 400; + // this route handles /auth + this.get('/auth', function() { ...}); + + this.namespace = '/api'; + // this route will handle the URL '/api/contacts' + this.get('/contacts', 'contacts'); + }; + ``` + + If your Ember app is loaded from the filesystem vs. a server (e.g. via Cordova or Electron vs. `ember s` or `https://yourhost.com/`), you will need to explicitly define a namespace. Likely values are `/` (if requests are made with relative paths) or `https://yourhost.com/api/...` (if requests are made to a defined server). + + For a sample implementation leveraging a configured API host & namespace, check out [this issue comment](https://github.com/samselikoff/ember-cli-mirage/issues/497#issuecomment-183458721). + + @property namespace + @type String + @public + */ this.namespace = this.namespace || config.namespace || ''; this.urlPrefix = this.urlPrefix || config.urlPrefix || ''; this.trackRequests = config.trackRequests; @@ -286,14 +297,51 @@ export default class Server { } /** - * Determines if the server should log. - * - * @method shouldLog - * @return The value of this.logging if defined, or false if in the testing environment, - * true otherwise. - * @public - */ + Determines if the server should log. + + @method shouldLog + @return The value of this.logging if defined, or false if in the testing environment, + true otherwise. + @public + @hide + */ shouldLog() { + + /** + Set to `true` or `false` to explicitly specify logging behavior. + + By default, server responses are logged in non-testing environments. Logging is disabled by default in testing, so as not to clutter CI test runner output. + + For example, to enable logging in tests, write the following: + + ```js + test('I can view all users', function() { + server.logging = true; + server.create('user'); + + visit('/users'); + // ... + }); + ``` + + You can also write a custom log message, using the [Pretender server's](#pretender) `handledRequest` hook. See [Mirage's default implementation](https://github.com/samselikoff/ember-cli-mirage/blob/2c31ad15a46e90b357a83b6896c6774fa42c6488/addon/server.js#L25) for an example. + + To override, + + ```js + // mirage/config.js + export default function() { + this.pretender.handledRequest = function(verb, path, request) { + let { responseText } = request; + // log request and response data + } + } + ``` + + @property logging + @return {Boolean} + @public + */ return typeof this.logging !== 'undefined' ? this.logging : !this.isTest(); } @@ -395,6 +443,7 @@ export default class Server { * @method factoryFor * @param {String} type * @private + * @hide */ factoryFor(type) { let camelizedType = camelize(type); @@ -550,6 +599,7 @@ export default class Server { /** * * @private + * @hide */ _defineRouteHandlerHelpers() { [['get'], ['post'], ['put'], ['delete', 'del'], ['patch'], ['head'], ['options']].forEach(([verb, alias]) => { @@ -600,6 +650,7 @@ export default class Server { /** * * @private + * @hide */ _hasModulesOfType(modules, type) { let modulesOfType = modules[type]; @@ -611,6 +662,7 @@ export default class Server { * configured options (`urlPrefix` and `namespace`). * * @private + * @hide */ _getFullPath(path) { path = path[0] === '/' ? path.slice(1) : path; @@ -696,6 +748,7 @@ export default class Server { /** * * @private + * @hide */ _configureDefaultPassthroughs() { defaultPassthroughs.forEach((passthroughUrl) => { @@ -706,6 +759,7 @@ export default class Server { /** * * @private + * @hide */ _validateCreateType(type) { let modelExists = (this.schema && this.schema.modelFor(camelize(type))); @@ -718,6 +772,7 @@ export default class Server { /** * * @private + * @hide */ _validateTraits(traits, factory, type) { traits.forEach((traitName) => { @@ -730,6 +785,7 @@ export default class Server { /** * * @private + * @hide */ _mergeExtensions(attrs, traits, overrides) { let allExtensions = traits.map((traitName) => { @@ -744,6 +800,7 @@ export default class Server { /** * * @private + * @hide */ _mapAssociationsFromAttributes(modelName, attributes, overrides = {}) { Object.keys(attributes || {}).filter((attr) => { From 481bd3f7d907d32cfc0dd7999f2fd8dbbcfde1f0 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 1 Oct 2018 07:36:28 -0400 Subject: [PATCH 229/879] Writing more docs --- addon/orm/collection.js | 268 ++++++++++------- addon/server.js | 271 +++++++++++++----- tests/dummy/app/router.js | 4 + tests/dummy/app/templates/docs.hbs | 9 +- .../docs/advanced/environment-options.md | 73 +++++ 5 files changed, 450 insertions(+), 175 deletions(-) create mode 100644 tests/dummy/app/templates/docs/advanced/environment-options.md diff --git a/addon/orm/collection.js b/addon/orm/collection.js index d4f1f98ea..0cc12f7ab 100644 --- a/addon/orm/collection.js +++ b/addon/orm/collection.js @@ -22,53 +22,61 @@ export default class Collection { 'You must pass a `modelName` into a Collection' ); + /** + The dasherized model name this Collection represents. + + ```js + let posts = user.blogPosts; + + posts.modelName; // "blog-post" + ``` + + The model name is separate from the actual models, since Collections can be empty. + + @property modelName + @type {String} + @public + */ this.modelName = modelName; - this.models = models; - } - /** - The dasherized model name of models in this collection. + /** + The underlying plain JavaScript array of Models in this Collection. - ``` - let posts = author.blogPosts.all(); + ```js + posts.models // [ post:1, post:2, ... ] + ``` - posts.modelName; // "blog-post" - ``` - @property modelName - @public - */ - // get modelName() { - // return this.modelName; - // } + While Collections have many array-ish methods like `filter` and `sort`, it + can be useful to work with the plain array if you want to work with methods + like `map`, or use the `[]` accessor. - /** - The underlying plain JavaScript array of models in this Collection. Often - used in assertions during testing. + For example, in testing you might want to assert against a model from the + collection: - ```js - let newPost = user.posts.models[0].title; + ```js + let newPost = user.posts.models[0].title; - assert.equal(newPost, "My first post"); - ``` + assert.equal(newPost, "My first post"); + ``` - @property models - @public - */ - // get models() { - // return this.models; - // } + @property models + @type {Array} + @public + */ + this.models = models; + } /** - The number of models in the collection. + The number of models in the collection. - ```js - user.posts.length; // 2 - ``` + ```js + user.posts.length; // 2 + ``` - @property length - @type Number - @public - */ + @property length + @type {Integer} + @public + */ get length() { return this.models.length; } @@ -77,7 +85,7 @@ export default class Collection { Updates each model in the collection, and immediately persists all changes to the db. ```js - let posts = author.blogPosts.all(); + let posts = user.blogPosts; posts.update('published', true); // the db was updated for all posts ``` @@ -94,30 +102,11 @@ export default class Collection { return this; } - /** - Destroys the db record for all models in the collection. - - ```js - let posts = author.blogPosts.all(); - - posts.destroy(); // all posts removed from db - ``` - - @method destroy - @return this - @public - */ - destroy() { - _invokeMap(this.models, 'destroy'); - - return this; - } - /** Saves all models in the collection. ```js - let posts = author.blogPosts.all(); + let posts = user.blogPosts; posts.models[0].published = true; @@ -135,12 +124,20 @@ export default class Collection { } /** - Reloads each model in the collection. + Reloads each model in the collection. - @method reload - @return this - @public - */ + ```js + let posts = author.blogPosts; + + // ... + + posts.reload(); // reloads data for each post from the db + ``` + + @method reload + @return this + @public + */ reload() { _invokeMap(this.models, 'reload'); @@ -148,17 +145,40 @@ export default class Collection { } /** - Adds a model to this collection. + Destroys the db record for all models in the collection. - ```js - user.posts.add(newPost); - ``` + ```js + let posts = user.blogPosts; - @method add - @param model - @return this - @public - */ + posts.destroy(); // all posts removed from db + ``` + + @method destroy + @return this + @public + */ + destroy() { + _invokeMap(this.models, 'destroy'); + + return this; + } + + /** + Adds a model to this collection. + + ```js + posts.length; // 1 + + posts.add(newPost); + + posts.length; // 2 + ``` + + @method add + @param {Model} model + @return this + @public + */ add(model) { this.models.push(model); @@ -166,12 +186,23 @@ export default class Collection { } /** - Removes a model to this collection + Removes a model from this collection. - @method remove - @return this - @public - */ + ```js + posts.length; // 5 + + let firstPost = posts.models[0]; + posts.remove(firstPost); + posts.save(); + + posts.length; // 4 + ``` + + @method remove + @param {Model} model + @return this + @public + */ remove(model) { let [ match ] = this.models.filter(m => m.toString() === model.toString()); if (match) { @@ -183,22 +214,46 @@ export default class Collection { } /** - Checks if the collection includes the model + Checks if the Collection includes the given model. - @method includes - @return boolean - @public - */ + ```js + posts.includes(newPost); + ``` + + Works by checking if the given model name and id exists in the Collection, + making it a bit more flexible than strict object equality. + + ```js + let post = server.create('post'); + let programming = server.create('tag', { text: 'Programming' }); + + visit(`/posts/${post.id}`); + click('.tag-selector'); + click('.tag:contains(Programming)'); + + post.reload(); + assert.ok(post.tags.includes(programming)); + ``` + + @method includes + @return {Boolean} + @public + */ includes(model) { return this.models.filter(m => m.toString() === model.toString()).length > 0; } /** - @method filter - @param f - @return {Collection} - @public - */ + Returns a new Collection with its models filtered according to the provided [callback function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter). + + ```js + let publishedPosts = user.posts.filter(post => post.isPublished); + ``` + @method filter + @param {Function} f + @return {Collection} + @public + */ filter(f) { let filteredModels = this.models.filter(f); @@ -209,15 +264,13 @@ export default class Collection { Returns a new Collection with its models sorted according to the provided [compare function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Parameters). ```js - let posts = author.blogPosts.all(); - - let postsByTitleAsc = posts.sort((a, b) => { + let postsByTitleAsc = user.posts.sort((a, b) => { return b.title < a.title; }); ``` @method sort - @param f + @param {Function} f @return {Collection} @public */ @@ -228,12 +281,18 @@ export default class Collection { } /** - @method slice - @param {Integer} begin - @param {Integer} end - @return {Collection} - @public - */ + Returns a new Collection with a subset of its models selected from `begin` to `end`. + + ```js + let firstThreePosts = user.posts.slice(0, 3); + ``` + + @method slice + @param {Integer} begin + @param {Integer} end + @return {Collection} + @public + */ slice(...args) { let slicedModels = this.models.slice(...args); @@ -241,10 +300,17 @@ export default class Collection { } /** - @method mergeCollection - @param collection - @return this - @public + Modifies the Collection by merging the models from another collection. + + ```js + user.posts.mergeCollection(newPosts); + user.posts.save(); + ``` + + @method mergeCollection + @param {Collection} collection + @return this + @public */ mergeCollection(collection) { this.models = this.models.concat(collection.models); @@ -255,6 +321,10 @@ export default class Collection { /** Simple string representation of the collection and id. + ```js + user.posts.toString(); // collection:post(post:1,post:4) + ``` + @method toString @return {String} @public diff --git a/addon/server.js b/addon/server.js index 0aa601f61..ca6cd2441 100644 --- a/addon/server.js +++ b/addon/server.js @@ -166,26 +166,6 @@ export default class Server { this._config = config; - /** - Set the number of milliseconds for the the Server's response time. - - By default there's a 400ms delay during development, and 0 delay in testing (so your tests run fast). - - ```js - // app/mirage/config.js - export default function() { - this.timing = 400; // default - }; - ``` - - To set the timing for individual routes, see the `timing` option for route handlers. - - @property timing - @type Number - @public - */ - this.timing = this.timing || config.timing || 400; - /** Set the base namespace used for all routes defined with `get`, `post`, `put` or `del`. @@ -225,7 +205,96 @@ export default class Server { @public */ this.namespace = this.namespace || config.namespace || ''; + + /** + Sets a string to prefix all route handler URLs with. + + Useful if your Ember app makes API requests to a different port. + + ```js + // app/mirage/config.js + export default function() { + this.prefix = 'http://localhost:8080' + }; + ``` + */ this.urlPrefix = this.urlPrefix || config.urlPrefix || ''; + + /** + Set the number of milliseconds for the the Server's response time. + + By default there's a 400ms delay during development, and 0 delay in testing (so your tests run fast). + + ```js + // app/mirage/config.js + export default function() { + this.timing = 400; // default + }; + ``` + + To set the timing for individual routes, see the `timing` option for route handlers. + + @property timing + @type Number + @public + */ + this.timing = this.timing || config.timing || 400; + + /** + Set to `true` or `false` to explicitly specify logging behavior. + + By default, server responses are logged in non-testing environments. Logging is disabled by default in testing, so as not to clutter CI test runner output. + + For example, to enable logging in tests, write the following: + + ```js + test('I can view all users', function() { + server.logging = true; + server.create('user'); + + visit('/users'); + // ... + }); + ``` + + You can also write a custom log message, using the [Pretender server's](#pretender) `handledRequest` hook. See [Mirage's default implementation](https://github.com/samselikoff/ember-cli-mirage/blob/2c31ad15a46e90b357a83b6896c6774fa42c6488/addon/server.js#L25) for an example. + + To override, + + ```js + // mirage/config.js + export default function() { + this.pretender.handledRequest = function(verb, path, request) { + let { responseText } = request; + // log request and response data + } + } + ``` + + @property logging + @return {Boolean} + @public + */ + this.logging = undefined; + + /** + Export a named `testConfig` function to define routes that only apply in your test environment: + + ```js + // mirage/config.js + export default function() { + // normal config, shared across development + testing + } + + export function testConfig() { + // test-only config, does not apply to development + } + ``` + + This could be useful if you'd like to use Mirage in testing, but generally proxy to an actual API during development. As you develop, your frontend may be ahead of your API, in which case you'd work with the routes in the default config, and write your tests. Then, once your API implements the new endpoints, you can move the routes to your testConfig, so your tests still run, but Mirage doesn't interfere during development. + */ + this.testConfig = undefined; + this.trackRequests = config.trackRequests; this._defineRouteHandlerHelpers(); @@ -255,8 +324,29 @@ export default class Server { let hasDefaultScenario = config.scenarios && config.scenarios.hasOwnProperty('default'); let didOverridePretenderConfig = (config.trackRequests !== undefined) && this.pretender; - assert(!didOverridePretenderConfig, - 'You cannot modify Pretender\'s request tracking once the server is created'); + assert( + !didOverridePretenderConfig, + 'You cannot modify Pretender\'s request tracking once the server is created' + ); + + /** + Mirage uses [pretender.js](https://github.com/trek/pretender) as its xhttp interceptor. In your Mirage config, `this.pretender` refers to the actual Pretender instance, so any config options that work there will work here as well. + + ```js + // app/mirage/config.js + export default function() { + this.pretender.handledRequest = (verb, path, request) => { + console.log(`Your server responded to ${path}`); + } + }; + ``` + + Refer to [Pretender's docs](https://github.com/pretenderjs/pretender) if you want to change any options on your Pretender instance. + + @property pretender + @return {Object} The Pretender instance + @public + */ this.pretender = this.pretender || config.pretender || createPretender(this); if (config.baseConfig) { @@ -291,6 +381,7 @@ export default class Server { * @method isTest * @return {Boolean} True if the environment is 'test', false otherwise. * @public + * @hide */ isTest() { return this.environment === 'test'; @@ -307,41 +398,6 @@ export default class Server { */ shouldLog() { - /** - Set to `true` or `false` to explicitly specify logging behavior. - - By default, server responses are logged in non-testing environments. Logging is disabled by default in testing, so as not to clutter CI test runner output. - - For example, to enable logging in tests, write the following: - - ```js - test('I can view all users', function() { - server.logging = true; - server.create('user'); - - visit('/users'); - // ... - }); - ``` - - You can also write a custom log message, using the [Pretender server's](#pretender) `handledRequest` hook. See [Mirage's default implementation](https://github.com/samselikoff/ember-cli-mirage/blob/2c31ad15a46e90b357a83b6896c6774fa42c6488/addon/server.js#L25) for an example. - - To override, - - ```js - // mirage/config.js - export default function() { - this.pretender.handledRequest = function(verb, path, request) { - let { responseText } = request; - // log request and response data - } - } - ``` - - @property logging - @return {Boolean} - @public - */ return typeof this.logging !== 'undefined' ? this.logging : !this.isTest(); } @@ -351,6 +407,7 @@ export default class Server { * @method shouldTrackRequests * @return The value of this.trackRequests if defined, false otherwise. * @public + * @hide */ shouldTrackRequests() { return Boolean(this.trackRequests); @@ -363,6 +420,7 @@ export default class Server { * @method loadConfig * @param {Object} config The configuration to load. * @public + * @hide */ loadConfig(config) { config.call(this); @@ -370,14 +428,55 @@ export default class Server { } /** - * Whitelist requests to the specified paths and allow them to pass through - * your Mirage server to the actual network layer. - * - * @method passthrough - * @param {String} [...paths] Any numer of paths to whitelist - * @param {Array} options Unused - * @public - */ + By default, if your Ember app makes a request that is not defined in your server config, Mirage will throw an error. You can use `passthrough` to whitelist requests, and allow them to pass through your Mirage server to the actual network layer. + +

    + + To ignore paths on your current host (as well as configured `namespace`), use a leading `/`: + + ```js + this.passthrough('/addresses'); + ``` + + You can also pass a list of paths, or call `passthrough` multiple times: + + ```js + this.passthrough('/addresses', '/contacts'); + this.passthrough('/something'); + this.passthrough('/else'); + ``` + + These lines will allow all HTTP verbs to pass through. If you want only certain verbs to pass through, pass an array as the last argument with the specified verbs: + + ```js + this.passthrough('/addresses', ['post']); + this.passthrough('/contacts', '/photos', ['get']); + ``` + + If you want all requests on the current domain to pass through, simply invoke the method with no arguments: + + ```js + this.passthrough(); + ``` + + Note again that the current namespace (i.e. any `namespace` property defined above this call) will be applied. + + You can also allow other-origin hosts to passthrough. If you use a fully-qualified domain name, the `namespace` property will be ignored. Use two * wildcards to match all requests under a path: + + ```js + this.passthrough('http://api.foo.bar/**'); + this.passthrough('http://api.twitter.com/v1/cards/**'); + ``` + + In versions of Pretender prior to 0.12, `passthrough` only worked with jQuery >= 2.x. As long as you're on Pretender@0.12 or higher, you should be all set. + + @method passthrough + @param {String} [...paths] Any numer of paths to whitelist + @param {Array} options Unused + @public + */ passthrough(...paths) { let verbs = ['get', 'post', 'put', 'delete', 'patch', 'options', 'head']; let lastArg = paths[paths.length - 1]; @@ -398,12 +497,41 @@ export default class Server { } /** - * Load the all or only the specified fixtures into Mirage's database. - * - * @method loadFixtures - * @param {String} [...args] The name of the fixture to load. - * @public - */ + By default, all the data files under `/fixtures` will be loaded during testing if you don't have factories defined, and during development if you don't have `/scenarios/default.js` defined. You can use `loadFixtures()` to also load fixture files in either of these environments, in addition to using factories to seed your database. + + `server.loadFixtures()` loads all the files, and `server.loadFixtures(file1, file2...)` loads selective fixture files. + + For example, in a test you may want to start out with all your fixture data loaded: + + ```js + test('I can view the photos', function() { + server.loadFixtures(); + server.createList('photo', 10); + + visit('/'); + + andThen(() => { + equal( find('img').length, 10 ); + }); + }); + ``` + + or in development, you may want to load a few reference fixture files, and use factories to define the rest of your data: + + ```js + // scenarios/default.js + export default function(server) { + server.loadFixtures('countries', 'states'); + + let author = server.create('author'); + server.createList('post', 10, {author_id: author.id}); + } + ``` + + @method loadFixtures + @param {String} [...args] The name of the fixture to load. + @public + */ loadFixtures(...args) { let { fixtures } = this._config; if (args.length) { @@ -424,6 +552,7 @@ export default class Server { * @method loadFactories * @param {Object} factoryMap * @public + * @hide */ loadFactories(factoryMap = {}) { // Store a reference to the factories diff --git a/tests/dummy/app/router.js b/tests/dummy/app/router.js index fb30fe719..1c1582ac4 100644 --- a/tests/dummy/app/router.js +++ b/tests/dummy/app/router.js @@ -26,6 +26,10 @@ Router.map(function() { this.route('simulating-cookie-responses'); }); + this.route('advanced', function() { + this.route('environment-options'); + }); + this.route('examples', function() { this.route('1-belongs-to'); this.route('2-has-many'); diff --git a/tests/dummy/app/templates/docs.hbs b/tests/dummy/app/templates/docs.hbs index 660aa32e9..31c79bc5e 100644 --- a/tests/dummy/app/templates/docs.hbs +++ b/tests/dummy/app/templates/docs.hbs @@ -16,17 +16,16 @@ {{nav.item 'Manually starting Mirage' 'docs.cookbook.manually-starting-mirage'}} {{nav.item 'Simulating cookie responses' 'docs.cookbook.simulating-cookie-responses'}} + {{nav.section 'Advanced'}} + {{nav.item 'Environment configuration' 'docs.advanced.environment-options'}} + {{!-- {{nav.section 'Examples'}} {{nav.item '1: Belongs to (no inverse)' 'docs.examples.1-belongs-to'}} {{nav.item '2: Has many (no inverse)' 'docs.examples.2-has-many'}} --}} {{/viewer.nav}} {{#viewer.main}} -
    -
    - {{outlet}} -
    -
    + {{outlet}} {{/viewer.main}} {{/docs-viewer}} diff --git a/tests/dummy/app/templates/docs/advanced/environment-options.md b/tests/dummy/app/templates/docs/advanced/environment-options.md new file mode 100644 index 000000000..cff190997 --- /dev/null +++ b/tests/dummy/app/templates/docs/advanced/environment-options.md @@ -0,0 +1,73 @@ +# Environment options + +Set these options via the `ENV['ember-cli-mirage']` variable in your `config/environment.js` file: + +```js +// config/environment.js +... +if (environment === 'production') { + ENV['ember-cli-mirage'] = { + enabled: true + }; +} +``` + +## enabled + +By default, your Mirage server will run in test mode, and in development mode as long as the `--proxy` option isn't passed. To change this default behavior, set `enabled` to either true or false in your ENV config. + +For example, to enable in production (e.g. to share a working prototype before your server is ready): + +```js +// config/environment.js +... +if (environment === 'production') { + ENV['ember-cli-mirage'] = { + enabled: true + }; +} +``` + +To disable in development, + +```js +// config/environment.js +... +if (environment === 'development') { + ENV['ember-cli-mirage'] = { + enabled: false + }; +} +``` + +## excludeFilesFromBuild + +Defaults to `false`. + +By default, Mirage's files are included in your Ember app's build in non-production environments. This is in case you want to use Mirage via `ember serve` by visiting `/tests`, since that's an app with a build-time environment of `development` but a run-time environment of `test`. + +You can explicilty exclude Mirage's files from your Ember app's build by setting `excludeFilesFromBuild` to `true`. + +## useDefaultPassthroughs + +Defaults to `true`. + +If true, Mirage will add some default passthrough routes to your server. Currently we add a single route + +- http://localhost:0/chromecheckurl + +which is used by iOS for URL verification. + +## directory + +Configure which directory contains your Mirage server definition. The default directory is `/mirage` (from the root of your project). + +For example, to have your server definition under `/app/mirage`, + +```js +// config/environment.js +... +ENV['ember-cli-mirage'] = { + directory: 'app/mirage' +}; +``` From ca100b6323a2acad8edafccd36d90f97a1b89dd8 Mon Sep 17 00:00:00 2001 From: James Herdman Date: Mon, 8 Oct 2018 10:16:48 -0400 Subject: [PATCH 230/879] Support Pretender 2 This change does not, like originally intended, make Pretender a peer dependency. There's a lot of work and debate being done here, so in the mean time let's unlock `fetch` support in Mirage. Dependency changes ------------------ * pretender 1.6 => 2.1. I've locked at 2.1.0 until pretenderjs/pretender#235 is resolved. This will require code changes on our end, and thus I don't want this sliding from underneath us and causing unnecessary weeping and gnashing of teeth. * Add xg-wang/whatwg-fetch. Required for the upgrade. * fake-xml-http-request 1.4.0 => 2.0.0. Required for the upgrade. * route-recognizer 0.2.3 => 0.3.4. Required for the upgrade. * ember-cli-node-assets 0.1.4 => 0.2.2. Because why not! I'm kneed deep in this stuff, so I may as well keep this up to date. --- index.js | 45 +++++++++++++++++++++++++---------- package.json | 11 +++++---- yarn.lock | 67 ++++++++++++++++++++++++++++++---------------------- 3 files changed, 77 insertions(+), 46 deletions(-) diff --git a/index.js b/index.js index e91459257..7d7bac65a 100644 --- a/index.js +++ b/index.js @@ -11,13 +11,23 @@ module.exports = { options: { nodeAssets: { + '@xg-wang/whatwg-fetch': npmAsset({ + import: ['dist/fetch.umd.js'] + }), 'route-recognizer': npmAsset({ - path: 'dist/route-recognizer.js', - sourceMap: 'dist/route-recognizer.js.map' + srcDir: 'dist', + import: ['route-recognizer.js'], + vendor: ['route-recognizer.js.map'] + }), + 'fake-xml-http-request': npmAsset({ + import: ['fake_xml_http_request.js'] }), - 'fake-xml-http-request': npmAsset('fake_xml_http_request.js'), - 'pretender': npmAsset('pretender.js'), - 'faker': npmAsset('build/build/faker.js') + 'pretender': npmAsset({ + import: ['pretender.js'] + }), + 'faker': npmAsset({ + import: ['build/build/faker.js'] + }) } }, @@ -144,15 +154,24 @@ module.exports = { } }; -function npmAsset(filePath) { +function npmAsset(options = {}) { + let defaultOptions = { + // guard against usage in FastBoot 1.0, where process.env.EMBER_CLI_FASTBOOT is not available + _processTree(input) { + return map(input, content => `if (typeof FastBoot !== 'undefined') { ${content} }`); + } + }; + + let assetOptions = Object.assign(defaultOptions, options); + return function() { - return { - enabled: this._shouldIncludeFiles(), - import: [filePath], - // guard against usage in FastBoot 1.0, where process.env.EMBER_CLI_FASTBOOT is not available - _processTree(input) { - return map(input, content => `if (typeof FastBoot !== 'undefined') { ${content} }`); + let finalOptions = Object.assign( + assetOptions, + { + enabled: this._shouldIncludeFiles() } - }; + ); + + return finalOptions; }; } diff --git a/package.json b/package.json index ad1190429..a723c4e05 100644 --- a/package.json +++ b/package.json @@ -34,21 +34,22 @@ "prepare": "./scripts/link.sh" }, "dependencies": { + "@xg-wang/whatwg-fetch": "^3.0.0", "broccoli-funnel": "^1.0.2", "broccoli-merge-trees": "^1.1.0", - "broccoli-string-replace": "^0.1.2", "broccoli-stew": "^1.5.0", + "broccoli-string-replace": "^0.1.2", "chalk": "^1.1.1", "ember-cli-babel": "^6.8.2", - "ember-cli-node-assets": "^0.1.4", + "ember-cli-node-assets": "^0.2.2", "ember-get-config": "^0.2.2", "ember-inflector": "^2.0.0", "ember-lodash": "^4.17.3", - "fake-xml-http-request": "^1.4.0", + "fake-xml-http-request": "^2.0.0", "faker": "^3.0.0", "jsdom": "^11.12.0", - "pretender": "^1.6.1", - "route-recognizer": "^0.2.3" + "pretender": "2.1.0", + "route-recognizer": "^0.3.4" }, "devDependencies": { "active-model-adapter": "^2.0.3", diff --git a/yarn.lock b/yarn.lock index e51edaf11..f733fdbc6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -108,6 +108,11 @@ dependencies: "@glimmer/di" "^0.2.0" +"@xg-wang/whatwg-fetch@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@xg-wang/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#f7b222c012a238e7d6e89ed3d72a1e0edb58453d" + integrity sha512-ULtqA6L75RLzTNW68IiOja0XYv4Ebc3OGMzfia1xxSEMpD0mk/pMvkQX0vbCFyQmKc5xGp80Ms2WiSlXLh8hbA== + abab@^1.0.3, abab@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" @@ -1752,13 +1757,6 @@ broccoli-uglify-sourcemap@^2.0.0: uglify-es "^3.1.3" walk-sync "^0.3.2" -broccoli-unwatched-tree@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/broccoli-unwatched-tree/-/broccoli-unwatched-tree-0.1.3.tgz#ab0fb820f613845bf67a803baad820f68b1e3aae" - integrity sha1-qw+4IPYThFv2eoA7qtgg9oseOq4= - dependencies: - broccoli-source "^1.1.0" - broccoli-writer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/broccoli-writer/-/broccoli-writer-0.1.1.tgz#d4d71aa8f2afbc67a3866b91a2da79084b96ab2d" @@ -2867,14 +2865,14 @@ ember-cli-lodash-subset@^1.0.7: resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-1.0.12.tgz#af2e77eba5dcb0d77f3308d3a6fd7d3450f6e537" integrity sha1-ry5366XcsNd/MwjTpv19NFD25Tc= -ember-cli-node-assets@^0.1.4: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ember-cli-node-assets/-/ember-cli-node-assets-0.1.6.tgz#6488a2949048c801ad6d9e33753c7bce32fc1146" - integrity sha1-ZIiilJBIyAGtbZ4zdTx7zjL8EUY= +ember-cli-node-assets@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/ember-cli-node-assets/-/ember-cli-node-assets-0.2.2.tgz#d2d55626e7cc6619f882d7fe55751f9266022708" + integrity sha1-0tVWJufMZhn4gtf+VXUfkmYCJwg= dependencies: broccoli-funnel "^1.0.1" broccoli-merge-trees "^1.1.1" - broccoli-unwatched-tree "^0.1.1" + broccoli-source "^1.1.0" debug "^2.2.0" lodash "^4.5.1" resolve "^1.1.7" @@ -3756,10 +3754,10 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -fake-xml-http-request@^1.4.0, fake-xml-http-request@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-1.6.0.tgz#bd0ac79ae3e2660098282048a12c730a6f64d550" - integrity sha512-99XPwwSg89BfzPuv4XCpZxn3EbauMCgAQCxq9MzrvS6DFD73OON6AnUTicL4A0HZtYMBwCZBWVnRqGjZDgQkTg== +fake-xml-http-request@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-2.0.0.tgz#41a92f0ca539477700cb1dafd2df251d55dac8ff" + integrity sha512-UjNnynb6eLAB0lyh2PlTEkjRJORnNsVF1hbzU+PQv89/cyBV9GDRCy7JAcLQgeCLYT+3kaumWWZKEJvbaK74eQ== faker@^3.0.0: version "3.1.0" @@ -5745,7 +5743,7 @@ lodash@^3.10.1: resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= -lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1: +lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.6.1: version "4.17.5" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" integrity sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw== @@ -5755,6 +5753,11 @@ lodash@^4.13.1, lodash@^4.2.0: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== +lodash@^4.5.1: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + log-symbols@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" @@ -6657,12 +6660,13 @@ preserve@^0.2.0: resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= -pretender@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/pretender/-/pretender-1.6.1.tgz#77d1e42ac8c6b298f5cd43534a87645df035db8c" - integrity sha1-d9HkKsjGspj1zUNTSodkXfA124w= +pretender@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pretender/-/pretender-2.1.0.tgz#cd75bff9624e996bcfadbd7dbd023ca1f4f3033a" + integrity sha512-GG1ZtA2yjorrSf9x3DR4Pv5228s/H92itSnIAxRx2wsmz549BsuIuJN+jPJgj0p+tCJBfBlmVgJLFG6t64M+EA== dependencies: - fake-xml-http-request "^1.6.0" + "@xg-wang/whatwg-fetch" "^3.0.0" + fake-xml-http-request "^2.0.0" route-recognizer "^0.3.3" printf@^0.2.3: @@ -7119,13 +7123,20 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.5.0, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.0, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0: +resolve@1.5.0, resolve@^1.1.6, resolve@^1.3.0, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" integrity sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw== dependencies: path-parse "^1.0.5" +resolve@^1.1.7: + version "1.8.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" + integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== + dependencies: + path-parse "^1.0.5" + restore-cursor@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" @@ -7161,16 +7172,16 @@ rimraf@~2.2.6: resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= -route-recognizer@^0.2.3: - version "0.2.10" - resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.2.10.tgz#024b2283c2e68d13a7c7f5173a5924645e8902df" - integrity sha1-Aksig8LmjROnx/UXOlkkZF6JAt8= - route-recognizer@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.3.tgz#1d365e27fa6995e091675f7dc940a8c00353bd29" integrity sha1-HTZeJ/ppleCRZ199yUCowANTvSk= +route-recognizer@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.4.tgz#39ab1ffbce1c59e6d2bdca416f0932611e4f3ca3" + integrity sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g== + rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.2.1, rsvp@^3.3.1, rsvp@^3.3.3, rsvp@^3.5.0: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" From 9237fe60d7a734eb1a8a7667484dd693fb6d1095 Mon Sep 17 00:00:00 2001 From: James Herdman Date: Mon, 8 Oct 2018 21:04:31 -0400 Subject: [PATCH 231/879] Expand `.npmignore` Below results are from `npm publish --dry-run`: Before ------ ``` npm notice === Tarball Details === npm notice name: ember-cli-mirage npm notice version: 0.4.9 npm notice package size: 255.3 kB npm notice unpacked size: 865.4 kB npm notice shasum: e359b3345fa75c80a876f4ed20ddfa8a19ad1106 npm notice integrity: sha512-l7uJ/QaW6Vwun[...]4b7gMwpKArLWw== npm notice total files: 74 ``` After ----- ``` npm notice === Tarball Details === npm notice name: ember-cli-mirage npm notice version: 0.4.9 npm notice package size: 44.1 kB npm notice unpacked size: 183.7 kB npm notice shasum: b949a6b4f2dd4556ae5aa9da68db77f5204e7ffd npm notice integrity: sha512-BQQOSeAEQRNYS[...]VlIbAu5BLGwfA== npm notice total files: 70 ``` Insert high five emoji. --- .npmignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.npmignore b/.npmignore index eb85fce1d..73c447ef1 100644 --- a/.npmignore +++ b/.npmignore @@ -1,6 +1,7 @@ /bower_components /config/ember-try.js /dist +/scripts /tests /tmp **/.gitkeep @@ -14,6 +15,7 @@ bower.json ember-cli-build.js testem.js +yarn.lock # ember-try .node_modules.ember-try/ From e519ca119b2d7ae2902ca59fa90d73b816d106ce Mon Sep 17 00:00:00 2001 From: James Herdman Date: Mon, 8 Oct 2018 21:05:48 -0400 Subject: [PATCH 232/879] Remove Dead `.jshintrc` File Final stats for the package: ``` npm notice === Tarball Details === npm notice name: ember-cli-mirage npm notice version: 0.4.9 npm notice package size: 44.0 kB npm notice unpacked size: 183.7 kB npm notice shasum: d42e6082d728fc2d8cbafa7600c863849eb4857c npm notice integrity: sha512-GgGNVMXXg9ZWq[...]Ei50rC/B9Qp2Q== npm notice total files: 69 ``` --- blueprints/.jshintrc | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 blueprints/.jshintrc diff --git a/blueprints/.jshintrc b/blueprints/.jshintrc deleted file mode 100644 index 33f4f6f4b..000000000 --- a/blueprints/.jshintrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "predef": [ - "console" - ], - "strict": false -} From a6da2ac0156a1cb0f10cc4a0d6ad539f4f1dd80c Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 14 Nov 2018 06:52:09 -0500 Subject: [PATCH 233/879] Writin' docs --- addon/db-collection.js | 238 +++++++---- addon/db.js | 67 ++- addon/orm/model.js | 44 +- addon/orm/schema.js | 222 +++++++--- tests/dummy/app/router.js | 3 + tests/dummy/app/templates/docs.hbs | 9 +- .../app/templates/docs/advanced/factories.md | 401 ++++++++++++++++++ .../app/templates/docs/advanced/fixtures.md | 44 ++ .../templates/docs/advanced/route-handlers.md | 252 +++++++++++ 9 files changed, 1105 insertions(+), 175 deletions(-) create mode 100644 tests/dummy/app/templates/docs/advanced/factories.md create mode 100644 tests/dummy/app/templates/docs/advanced/fixtures.md create mode 100644 tests/dummy/app/templates/docs/advanced/route-handlers.md diff --git a/addon/db-collection.js b/addon/db-collection.js index 691d477be..df7af033c 100644 --- a/addon/db-collection.js +++ b/addon/db-collection.js @@ -12,18 +12,20 @@ function duplicate(data) { } /** - The collection attached to the database object. + Mirage's `Db` has many `DbCollections`, which are equivalent to tables from traditional databases. They store specific types of data, for example `users` and `posts`. - For example if you had the following data file named `mirage/fixtures/contacts.js` + `DbCollections` have names, like `users`, which you use to access the collection from the `Db` object. - ``` + Suppose you had a `user` model defined, and the following data had been inserted into your database (either through factories or fixtures): + + ```js export default [ - {id: 1, name: 'Zelda'}, - {id: 2, name: 'Link'} + { id: 1, name: 'Zelda' }, + { id: 2, name: 'Link' } ]; ``` - then `db.contacts` would return this array. + Then `db.contacts` would return this array. @class DbCollection @constructor @@ -45,6 +47,7 @@ class DbCollection { * Returns a copy of the data, to prevent inadvertent data manipulation. * @method all * @public + * @hide */ all() { return duplicate(this._records); @@ -56,17 +59,17 @@ class DbCollection { ```js // Insert a single record - let link = db.users.insert({name: 'Link', age: 173}); + let link = db.users.insert({ name: 'Link', age: 173 }); - link; // {id: 1, name: 'Link', age: 137} + link; // { id: 1, name: 'Link', age: 173 } // Insert an array let users = db.users.insert([ - {name: 'Zelda', age: 142}, - {name: 'Epona', age: 58}, + { name: 'Zelda', age: 142 }, + { name: 'Epona', age: 58 }, ]); - users; // [{id: 2, name: 'Zelda', age: 142}, {id: 3, name: 'Epona', age: 58}] + users; // [ { id: 2, name: 'Zelda', age: 142 }, { id: 3, name: 'Epona', age: 58 } ] ``` @method insert @@ -84,13 +87,21 @@ class DbCollection { } /** - * Returns a single record from the `collection` if `ids` is a single - * id, or an array of records if `ids` is an array of ids. Note - * each id can be an int or a string, but integer ids as strings - * (e.g. the string “1â€) will be treated as integers. - * @method find - * @param ids - * @public + Returns a single record from the `collection` if `ids` is a single + id, or an array of records if `ids` is an array of ids. Note + each id can be an int or a string, but integer ids as strings + (e.g. the string “1â€) will be treated as integers. + + ```js + // Given users = [{id: 1, name: 'Link'}, {id: 2, name: 'Zelda'}] + + db.users.find(1); // {id: 1, name: 'Link'} + db.users.find([1, 2]); // [{id: 1, name: 'Link'}, {id: 2, name: 'Zelda'}] + ``` + + @method find + @param ids + @public */ find(ids) { if (Array.isArray(ids)) { @@ -111,12 +122,18 @@ class DbCollection { } /** - * Returns the first model from `collection` that matches the - * key-value pairs in the `query` object. Note that a string - * comparison is used. `query` is a POJO. - * @method find - * @param query - * @public + Returns the first model from `collection` that matches the + key-value pairs in the `query` object. Note that a string + comparison is used. `query` is a POJO. + + ```js + // Given users = [ { id: 1, name: 'Link' }, { id: 2, name: 'Zelda' } ] + db.users.findBy({ name: 'Link' }); // { id: 1, name: 'Link' } + ``` + + @method find + @param query + @public */ findBy(query) { let record = this._findRecordBy(query); @@ -129,25 +146,64 @@ class DbCollection { } /** - * Returns an array of models from `collection` that match the - * key-value pairs in the `query` object. Note that a string - * comparison is used. `query` is a POJO. - * @method where - * @param query - * @public + Returns an array of models from `collection` that match the + key-value pairs in the `query` object. Note that a string + comparison is used. `query` is a POJO. + + ```js + // Given users = [ { id: 1, name: 'Link' }, { id: 2, name: 'Zelda' } ] + + db.users.where({ name: 'Zelda' }); // [ { id: 2, name: 'Zelda' } ] + ``` + + @method where + @param query + @public */ where(query) { return this._findRecordsWhere(query).map(duplicate); } /** - * Finds the first record matching the provided query in - * `collection`, or creates a new record using a merge of the - * `query` and optional `attributesForCreate`. - * @method firstOrCreate - * @param query - * @param attributesForCreate - * @public + Finds the first record matching the provided _query_ in + `collection`, or creates a new record using a merge of the + `query` and optional `attributesForCreate`. + + Often times you may have a pattern like the following in your API stub: + + ```js + // Given users = [ + // { id: 1, name: 'Link' }, + // { id: 2, name: 'Zelda' } + // ] + + // Create Link if he doesn't yet exist + let records = db.users.where({ name: 'Link' }); + let record; + + if (records.length > 0) { + record = records[0]; + } else { + record = db.users.insert({ name: 'Link' }); + } + ``` + + You can now replace this with the following: + + ```js + let record = db.users.firstOrCreate({ name: 'Link' }); + ``` + + An extended example using *attributesForCreate*: + + ```js + let record = db.users.firstOrCreate({ name: 'Link' }, { evil: false }); + ``` + + @method firstOrCreate + @param query + @param attributesForCreate + @public */ firstOrCreate(query, attributesForCreate = {}) { let queryResult = this.where(query); @@ -164,19 +220,29 @@ class DbCollection { } /** - * Updates one or more records in collection. - * If attrs is the only arg present, updates all records - * in the collection according to the key-value pairs in attrs. - * If target is present, restricts updates to those that - * match target. If target is a number or string, finds a - * single record whose id is target to update. If target is - * a POJO, queries collection for records that match the - * key-value pairs in target, and updates their attrs. - * Returns the updated record or records. - * @method update - * @param target - * @param attrs - * @public + Updates one or more records in the collection. + + If *attrs* is the only arg present, updates all records in the collection according to the key-value pairs in *attrs*. + + If *target* is present, restricts updates to those that match *target*. If *target* is a number or string, finds a single record whose id is *target* to update. If *target* is a POJO, queries *collection* for records that match the key-value pairs in *target*, and updates their *attrs*. + + Returns the updated record or records. + + ```js + // Given users = [ + // {id: 1, name: 'Link'}, + // {id: 2, name: 'Zelda'} + // ] + + db.users.update({name: 'Ganon'}); // db.users = [{id: 1, name: 'Ganon'}, {id: 2, name: 'Ganon'}] + db.users.update(1, {name: 'Young Link'}); // db.users = [{id: 1, name: 'Young Link'}, {id: 2, name: 'Zelda'}] + db.users.update({name: 'Link'}, {name: 'Epona'}); // db.users = [{id: 1, name: 'Epona'}, {id: 2, name: 'Zelda'}] + ``` + + @method update + @param target + @param attrs + @public */ update(target, attrs) { let records; @@ -228,16 +294,24 @@ class DbCollection { } /** - * Removes one or more records in `collection`. - * If `target` is undefined, removes all records. - * If `target` is a number or string, removes a - * single record using `target` as id. If `target` is - * a POJO, queries `collection` for records that - * match the key-value pairs in `target`, and - * removes them from the collection. - * @method remove - * @param target - * @public + Removes one or more records in *collection*. + + If *target* is undefined, removes all records. If *target* is a number or string, removes a single record using *target* as id. If *target* is a POJO, queries *collection* for records that match the key-value pairs in *target*, and removes them from the collection. + + ```js + // Given users = [ + // {id: 1, name: 'Link'}, + // {id: 2, name: 'Zelda'} + // ] + + db.users.remove(); // db.users = [] + db.users.remove(1); // db.users = [{id: 2, name: 'Zelda'}] + db.users.remove({name: 'Zelda'}); // db.users = [{id: 1, name: 'Link'}] + ``` + + @method remove + @param target + @public */ remove(target) { let records; @@ -275,9 +349,10 @@ class DbCollection { */ /** - * @method _findRecord - * @param id - * @private + @method _findRecord + @param id + @private + @hide */ _findRecord(id) { id = id.toString(); @@ -288,27 +363,30 @@ class DbCollection { } /** - * @method _findRecordBy - * @param query - * @private + @method _findRecordBy + @param query + @private + @hide */ _findRecordBy(query) { return this._findRecordsWhere(query)[0]; } /** - * @method _findRecords - * @param ids - * @private + @method _findRecords + @param ids + @private + @hide */ _findRecords(ids) { return ids.map(this._findRecord, this); } /** - * @method _findRecordsWhere - * @param query - * @private + @method _findRecordsWhere + @param query + @private + @hide */ _findRecordsWhere(query) { let records = this._records; @@ -327,9 +405,10 @@ class DbCollection { } /** - * @method _insertRecord - * @param data - * @private + @method _insertRecord + @param data + @private + @hide */ _insertRecord(data) { let attrs = duplicate(data); @@ -348,10 +427,11 @@ class DbCollection { } /** - * @method _updateRecord - * @param record - * @param attrs - * @private + @method _updateRecord + @param record + @param attrs + @private + @hide */ _updateRecord(record, attrs) { let targetId = (attrs && attrs.hasOwnProperty('id')) ? attrs.id.toString() : null; diff --git a/addon/db.js b/addon/db.js index dab73b8ef..5fd3a933b 100644 --- a/addon/db.js +++ b/addon/db.js @@ -8,10 +8,15 @@ import _cloneDeep from 'lodash/cloneDeep'; Access the db from your route handlers via `schema.db`. + You can access individual DbCollections by using `schema.db.name`: + + ```js + schema.db.users // would return, e.g., [ { id: 1, name: 'Yehuda' }, { id: 2, name: 'Tom '} ] + ``` + @class Db @constructor @public - @hide */ class Db { @@ -26,11 +31,24 @@ class Db { } /** - * Foo, bar baz. - * - * @method loadData - * @param {Object} data - Data to load - * @public + Loads an object of data into Mirage's database. + + The keys of the object correspond to the DbCollections, and the values are arrays of records. + + ```js + server.db.loadData({ + users: [ + { name: 'Yehuda' }, + { name: 'Tom' } + ] + }); + ``` + + As with `db.collection.insert`, IDs will automatically be created for records that don't have them. + + @method loadData + @param {Object} data - Data to load + @public */ loadData(data) { for (let key in data) { @@ -39,8 +57,14 @@ class Db { } /** - * @method dump - * @public + Logs out the contents of the Db. + + ```js + server.db.dump() // { users: [ name: 'Yehuda', ... + ``` + + @method dump + @public */ dump() { return this._collections.reduce((data, collection) => { @@ -51,7 +75,7 @@ class Db { } /** - Add an empty collection named name to your database. Typically you won’t need to do this yourself, since collections are automatically created for any models you have defined. + Add an empty collection named _name_ to your database. Typically you won’t need to do this yourself, since collections are automatically created for any models you have defined. @method createCollection @param name @@ -108,34 +132,39 @@ class Db { } /** - * @method createCollections - * @param ...collections - * @public + @method createCollections + @param ...collections + @public + @hide */ createCollections(...collections) { collections.forEach((c) => this.createCollection(c)); } /** - * @method emptyData - * @public + Removes all data from Mirage's database. + + @method emptyData + @public */ emptyData() { this._collections.forEach((c) => c.remove()); } /** - * @method identityManagerFor - * @param name - * @public + @method identityManagerFor + @param name + @public + @hide */ identityManagerFor(name) { return this._identityManagers[singularize(name)] || this._identityManagers.application || IdentityManager; } /** - * @method registerIdentityManagers - * @public + @method registerIdentityManagers + @public + @hide */ registerIdentityManagers(identityManagers) { this._identityManagers = identityManagers || {}; diff --git a/addon/orm/model.js b/addon/orm/model.js index c216e6fae..580574055 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -9,20 +9,46 @@ import _values from 'lodash/values'; import _compact from 'lodash/compact'; import _assign from 'lodash/assign'; -/* - The Model class. Notes: +/** + Models wrap your database and allow you to define relationships. - - We need to pass in modelName, because models are created with - .extend and anonymous functions, so you cannot use - reflection to find the name of the constructor. -*/ + As a clarifying point, Mirage model instances only exist within Mirage's server, and are not shared directly with your Ember app. The only way to get Mirage models into your Ember app is via an API call. This means you should never create a Mirage model and, for example, pass it directly into an Ember component. They solely exist to help you manage the data and relationships in your fake backend. + + If you're using Ember Data and version 0.3.3. of Mirage or later, your Mirage model definitions (with relationships) will be detected and auto-generated for you, so you don't need to define the files yourself. If you're not, you can define models by adding files under `/models` or using the provided generator: + + ``` + ember g mirage-model blog-post + ``` + + This would create the following file: + + ```js + // mirage/models/blog-post.js + import { Model } from 'ember-cli-mirage'; + + export default Model; + ``` + + **Class vs. instance methods** -/* - Constructor -*/ + The methods documented below apply to _instances_ of models, but you'll typically use the `Schema` to access the model _class_, which can be used to find or create instances. + + You can find the Class methods documented under the `Schema` API docs. + + @class Model + @constructor + @public + */ class Model { // TODO: schema and modelName now set statically at registration, need to remove + /* + Notes: + + - We need to pass in modelName, because models are created with + .extend and anonymous functions, so you cannot use + reflection to find the name of the constructor. + */ constructor(schema, modelName, attrs, fks) { assert(schema, 'A model requires a schema'); assert(modelName, 'A model requires a modelName'); diff --git a/addon/orm/schema.js b/addon/orm/schema.js index b18e38e1b..7b4a840ef 100644 --- a/addon/orm/schema.js +++ b/addon/orm/schema.js @@ -8,15 +8,40 @@ import _includes from 'lodash/includes'; import assert from '../assert'; /** - * @class Schema - * @constructor - * @public + The primary use of the `Schema` class is to use it to find Models and Collectiosn via the `Model` class methods. + + The `Schema` is most often accessed via the first parameter to a route handler: + + ```js + this.get('posts', schema => { + return schema.posts.where({ isAdmin: false }); + }); + ``` + + It is also available from the `.schema` property of a `server` instance: + + ```js + server.schema.users.create({ name: 'Yehuda' }); + ``` + + To work with the Model or Collection returned from one of the methods below, refer to the instance methods in the API docs for the `Model` and `Collection` classes. + + @class Schema + @constructor + @public */ export default class Schema { constructor(db, modelsMap = {}) { assert(db, 'A schema requires a db'); + /** + Returns Mirage's database. See the `Db` docs for the db's API. + + @property db + @type {Object} + @public + */ this.db = db; this._registry = {}; this._dependentAssociations = { polymorphic: [] }; @@ -25,9 +50,10 @@ export default class Schema { } /** - * @method registerModels - * @param hash - * @public + @method registerModels + @param hash + @public + @hide */ registerModels(hash = {}) { _forIn(hash, (model, key) => { @@ -36,10 +62,11 @@ export default class Schema { } /** - * @method registerModel - * @param type - * @param ModelClass - * @public + @method registerModel + @param type + @param ModelClass + @public + @hide */ registerModel(type, ModelClass) { let camelizedModelName = camelize(type); @@ -115,38 +142,64 @@ export default class Schema { } /** - * @method modelFor - * @param type - * @public + @method modelFor + @param type + @public + @hide */ modelFor(type) { return this._registry[type]; } /** - * @method new - * @param type - * @param attrs - * @public + Create a new unsaved model instance with attributes *attrs*. + + ```js + let post = blogPosts.new({ title: 'Lorem ipsum' }); + post.title; // Lorem ipsum + post.id; // null + post.isNew(); // true + ``` + + @method new + @param type + @param attrs + @public */ new(type, attrs) { return this._instantiateModel(dasherize(type), attrs); } /** - * @method create - * @param type - * @param attrs - * @public + Create a new model instance with attributes *attrs*, and insert it into the database. + + ```js + let post = blogPosts.create({title: 'Lorem ipsum'}); + post.title; // Lorem ipsum + post.id; // 1 + post.isNew(); // false + ``` + + @method create + @param type + @param attrs + @public */ create(type, attrs) { return this.new(type, attrs).save(); } /** - * @method all - * @param type - * @public + Return all models in the database. + + ```js + let posts = blogPosts.all(); + // [post:1, post:2, ...] + ``` + + @method all + @param type + @public */ all(type) { let collection = this._collectionForType(type); @@ -155,19 +208,28 @@ export default class Schema { } /** - * @method none - * @param type - * @public + Return an empty collection of type `type`. + + @method none + @param type + @public */ none(type) { return this._hydrate([], dasherize(type)); } /** - * @method find - * @param type - * @param ids - * @public + Return one or many models in the database by id. + + ```js + let post = blogPosts.find(1); + let posts = blogPosts.find([1, 3, 4]); + ``` + + @method find + @param type + @param ids + @public */ find(type, ids) { let collection = this._collectionForType(type); @@ -184,10 +246,16 @@ export default class Schema { } /** - * @method findBy - * @param type - * @param attributeName - * @public + Returns the first model in the database that matches the key-value pairs in the `query` object. Note that a string comparison is used. + + ```js + let post = blogPosts.findBy({ published: true }); + ``` + + @method findBy + @param type + @param attributeName + @public */ findBy(type, query) { let collection = this._collectionForType(type); @@ -197,10 +265,16 @@ export default class Schema { } /** - * @method where - * @param type - * @param query - * @public + Return an array of models in the database matching the key-value pairs in *query*. Note that a string comparison is used. + + ```js + let posts = blogPosts.where({ published: true }); + ``` + + @method where + @param type + @param query + @public */ where(type, query) { let collection = this._collectionForType(type); @@ -210,9 +284,15 @@ export default class Schema { } /** - * @method first - * @param type - * @public + Returns the first model in the database. + + ```js + let post = blogPosts.first(); + ``` + + @method first + @param type + @public */ first(type) { let collection = this._collectionForType(type); @@ -221,6 +301,12 @@ export default class Schema { return this._hydrate(record, dasherize(type)); } + /** + @method modelClassFor + @param modelName + @public + @hide + */ modelClassFor(modelName) { let model = this._registry[camelize(modelName)]; @@ -280,9 +366,10 @@ export default class Schema { */ /** - * @method _collectionForType - * @param type - * @private + @method _collectionForType + @param type + @private + @hide */ _collectionForType(type) { let collection = toCollectionName(type); @@ -295,10 +382,11 @@ export default class Schema { } /** - * @method _addForeignKeyToRegistry - * @param type - * @param fk - * @private + @method _addForeignKeyToRegistry + @param type + @param fk + @private + @hide */ _addForeignKeyToRegistry(type, fk) { this._registry[type] = this._registry[type] || { class: null, foreignKeys: [] }; @@ -310,10 +398,11 @@ export default class Schema { } /** - * @method _instantiateModel - * @param modelName - * @param attrs - * @private + @method _instantiateModel + @param modelName + @param attrs + @private + @hide */ _instantiateModel(modelName, attrs) { let ModelClass = this._modelFor(modelName); @@ -323,31 +412,34 @@ export default class Schema { } /** - * @method _modelFor - * @param modelName - * @private + @method _modelFor + @param modelName + @private + @hide */ _modelFor(modelName) { return this._registry[camelize(modelName)].class; } /** - * @method _foreignKeysFor - * @param modelName - * @private + @method _foreignKeysFor + @param modelName + @private + @hide */ _foreignKeysFor(modelName) { return this._registry[camelize(modelName)].foreignKeys; } /** - * Takes a record and returns a model, or an array of records - * and returns a collection. + Takes a record and returns a model, or an array of records + and returns a collection. * - * @method _hydrate - * @param records - * @param modelName - * @private + @method _hydrate + @param records + @param modelName + @private + @hide */ _hydrate(records, modelName) { if (Array.isArray(records)) { diff --git a/tests/dummy/app/router.js b/tests/dummy/app/router.js index 1c1582ac4..10fb4dbb0 100644 --- a/tests/dummy/app/router.js +++ b/tests/dummy/app/router.js @@ -27,6 +27,9 @@ Router.map(function() { }); this.route('advanced', function() { + this.route('route-handlers'); + this.route('factories'); + this.route('fixtures'); this.route('environment-options'); }); diff --git a/tests/dummy/app/templates/docs.hbs b/tests/dummy/app/templates/docs.hbs index 31c79bc5e..98ea61918 100644 --- a/tests/dummy/app/templates/docs.hbs +++ b/tests/dummy/app/templates/docs.hbs @@ -12,13 +12,16 @@ {{nav.item 'Seeding your database' 'docs.writing-your-server.seeding-your-database'}} {{nav.item 'Acceptance testing' 'docs.writing-your-server.acceptance-testing'}} + {{nav.section 'Advanced'}} + {{nav.item 'Route handlers' 'docs.advanced.route-handlers'}} + {{nav.item 'Factories' 'docs.advanced.factories'}} + {{nav.item 'Fixtures' 'docs.advanced.fixtures'}} + {{nav.item 'Environment configuration' 'docs.advanced.environment-options'}} + {{nav.section 'Cookbook'}} {{nav.item 'Manually starting Mirage' 'docs.cookbook.manually-starting-mirage'}} {{nav.item 'Simulating cookie responses' 'docs.cookbook.simulating-cookie-responses'}} - {{nav.section 'Advanced'}} - {{nav.item 'Environment configuration' 'docs.advanced.environment-options'}} - {{!-- {{nav.section 'Examples'}} {{nav.item '1: Belongs to (no inverse)' 'docs.examples.1-belongs-to'}} {{nav.item '2: Has many (no inverse)' 'docs.examples.2-has-many'}} --}} diff --git a/tests/dummy/app/templates/docs/advanced/factories.md b/tests/dummy/app/templates/docs/advanced/factories.md new file mode 100644 index 000000000..cf440819e --- /dev/null +++ b/tests/dummy/app/templates/docs/advanced/factories.md @@ -0,0 +1,401 @@ +# Factories + +Factories are used to seed your database, either during development or within tests. Whenever you generate an object via a factory, it will automatically get added to the database, and thus get an autogenerated `id`. + +You define factories by using the `ember g mirage-factory [name]` command, or creating files under the `mirage/factories` directory. The name of the factory is determined by the filename. + +Factories have attributes, and you create objects from factory definitions using the `server.create` and `server.createList` methods. + +## Defining factories + +Attributes can be static (strings, numbers or booleans) or dynamic (a function). Here's a factory with some static attributes: + +```js +// mirage/factories/user.js +import { Factory } from 'ember-cli-mirage'; + +export default Factory.extend({ + name: 'Link', + age: 563, + evil: false, +}); +``` + +Functions receive the sequence number *i* as an argument, which is useful to create dynamic attributes: + +```js +// mirage/factories/user.js +import { Factory } from 'ember-cli-mirage'; + +export default Factory.extend({ + name(i) { + return 'User ' + i + } +}); +``` + +The first user generated (per test) would have a name of `User 0`, the second a name of `User 1`, and so on. + + + +Finally, you can also reference attributes from within a dynamic attribute via `this`: + +```js +// mirage/factories/contact.js +import { Factory } from 'ember-cli-mirage'; + +export default Factory.extend({ + + age: 18, + + isAdmin(i) { + return this.age > 30; + } + +}); +``` + +This even works with other dynamic attributes: + +```js +// mirage/factories/contact.js +import { Factory } from 'ember-cli-mirage'; + +export default Factory.extend({ + + email(i) { + return `email${i}@acme.com`; + }, + + isAdmin(i) { + return this.email === 'email1@acme.com'; + } + +}); +``` + +You'll get an error if you create an invalid cycle of dynamic attributes. + +You can also customize the objects created by your factory using the +`afterCreate()` hook. This hook fires after the object is built (so all the +attributes you've defined will be populated) but before that object is returned. + + +The `afterCreate()` method is given two arguments: the newly created object, and +a reference to the server. This makes it useful if you want your factory-created +objects to be aware of the rest of the state of your Mirage database, or build +relationships (as we'll see in a moment): + +```js +// mirage/factories/contact.js +import { Factory, faker } from 'ember-cli-mirage'; + +export default Factory.extend({ + + isAdmin: faker.random.boolean, + + afterCreate(contact, server) { + // Only allow a max of 5 admins to be created + if (server.schema.contacts.where({ isAdmin: true }).models.length >= 5) { + contact.update({ isAdmin: false }); + } + } + +}); +``` + +--- + +You should define the attributes of your factory as the "base case" for your objects, and override them within your tests. We'll discuss how do to this in the Creating Objects section. + +## Factories and relationships + +When building objects using factories, you may want to create related objects automatically. To build related objects for `belongsTo` relationships, you can use `association` helper. + +Start with defining relationships in your models so that they can be introspected for the details like relationship name: + +``` js +// mirage/models/article.js +import { Model, belongsTo } from 'ember-cli-mirage'; + +export default Model.extend({ + author: belongsTo() +}); +``` + +``` js +// mirage/models/author.js +import { Model } from 'ember-cli-mirage'; + +export default Model.extend(); +``` + +And simply indicate which attributes are `association`s: + +``` js +// mirage/factories/article.js +import { Factory, association } from 'ember-cli-mirage'; + +export default Factory.extend({ + title: 'ember-cli-mirage rockzzz', + author: association() +}); +``` + +You can also pass a list of traits and overrides as arguments to `association` helper: + +``` js +// mirage/factories/author.js +import { Factory, trait } from 'ember-cli-mirage'; + +export default Factory.extend({ + withNames: trait({ + firstName: 'Yehuda', + lastName: 'Katz' + }) +}); +``` + +``` js +// mirage/factories/article.js +import { Factory, association } from 'ember-cli-mirage'; + +export default Factory.extend({ + title: 'ember-cli-mirage rockzzz', + author: association('withNames', { lastName: 'Dale' }) +}); +``` + +You can also use the `afterCreate()` hook (for both `hasMany` and `belongsTo` relationships): + +```js +// mirage/factories/author.js +import { Factory, faker } from 'ember-cli-mirage'; + +export default Factory.extend({ + firstName: faker.name.firstName, + afterCreate(author, server) { + server.create('post', { author }); + } +}); +``` + +Because the `afterCreate()` hook is called with the newly created object and a reference to the server, you can construct complex object graphs to associate with your newly created object. + +## Traits + +Factory traits make it easy to group related attributes: + +```js +// mirage/factories/post.js +import { Factory, trait } from 'ember-cli-mirage'; + +export default Factory.extend({ + title: 'Lorem ipsum', + + published: trait({ + isPublished: true, + publishedAt: '2010-01-01 10:00:00' + }) +}); +``` + +You can pass anything into `trait` that you can into the base factory. + +To use a trait, pass the trait name in as string argument to `server.create`: + +``` js +server.create('post', 'published'); +``` + +You can also compose multiple traits together: + +```js +// mirage/factories/post.js +import { Factory, trait } from 'ember-cli-mirage'; + +export default Factory.extend({ + title: 'Lorem ipsum', + + published: trait({ + isPublished: true, + publishedAt: '2010-01-01 10:00:00' + }), + + official: trait({ + isOfficial: true + }) +}); + +// Use +let officialPost = server.create('post', 'official'); +let officialPublishedPost = server.create('post', 'official', 'published'); +``` + +As always, you can pass in an `attrs` hash as the last argument for attribute overrides: + +```js +server.create('post', 'published', { title: 'My first post' }); +``` + +When combined with the `afterCreate()` hook, traits simplify the process of setting up related object graphs. Here we create 10 posts each having 3 associated comments: + +``` js +// mirage/factories/post.js +import { Factory, trait } from 'ember-cli-mirage'; + +export default Factory.extend({ + title: 'Lorem ipsum', + + published: trait({ + isPublished: true, + publishedAt: '2010-01-01 10:00:00' + }), + + withComments: trait({ + afterCreate(post, server) { + server.createList('comment', 3, { post }); + } + }) +}); + +// Use +server.createList('post', 10, 'withComments'); +``` + +Traits improve your test suite by pulling unnecessary knowledge about data setup out of your tests. If you're writing a test module to verify the behavior of a comment box on a blog post page, each test will need a post to exist as part of its setup. If a post requires a user, and that user requires a session and perhaps a subscription, you don't want to repeat this knowledge in each of your comment tests. Instead, create a trait that has meaning within your domain - say, a published post - to simplify the data setup needed to write each of your comment tests. This leads to a more concise, expressive test suite, which will help future developers who come into your codebase better understand the expected behavior of your application. + +## Using Faker.js + +The [Faker.js](https://github.com/marak/Faker.js/) library is included with Mirage, and its methods work nicely with factory definitions: + +```js +// mirage/factories/user.js +import { Factory, faker } from 'ember-cli-mirage'; + +export default Factory.extend({ + firstName() { + return faker.name.firstName(); + }, + lastName() { + return faker.name.lastName(); + }, + avatar() { + return faker.internet.avatar(); + } +}); +``` + +We've also added two methods on the `faker` namespace, `list.cycle` and `list.random`, which are useful if you have a set of data you want your factories to iterate through: + +```js +// mirage/factories/subject.js +import { Factory, faker } from 'ember-cli-mirage'; + +export default Factory.extend({ + name: faker.list.cycle('Economics', 'Philosophy', 'English', 'History', 'Mathematics'), + students: faker.list.random(100, 200, 300, 400, 500) +}); +``` + +`cycle` loops through the data in order, while `random` chooses a random element from the list each time an object is created. + +View [Faker's docs](https://github.com/marak/Faker.js/) for the full faker API. + +## Extending factories + +You can extend factories: + +```js +// mirage/factories/human.js +import { Factory } from 'ember-cli-mirage'; + +export default Factory.extend({ + species: 'homo sapiens' +}); + +// mirage/factories/man.js +import Human from './human'; + +export default Human.extend({ + gender: 'male' +}); +``` + +## Creating objects + +Once you've defined a factory for a model, you can generate data for that model using `server.create` and `server.createList`, either from within `mirage/scenarios/default.js` for development, or from within your acceptance tests. + +
    # server.create(type [, attrs]) + +Generates a single model of type *type*, inserts it into the database (giving it an id), and returns the data that was +added. + +```js +test("I can view a contact's details", function() { + var contact = server.create('contact'); + + visit('/contacts/' + contact.id); + + andThen(() => { + equal( find('h1').text(), 'The contact is Link'); + }); +}); +``` + +You can override the attributes from the factory definition with a +hash passed in as the second parameter. For example, if we had this factory + +```js +export default Factory.extend({ + name: 'Link' +}); +``` + +we could override the name like this: + +```js +test("I can view the contacts", function() { + server.create('contact', {name: 'Zelda'}); + + visit('/'); + + andThen(() => { + equal( find('p').text(), 'Zelda' ); + }); +}); +``` + +# server.createList(type, amount [, attrs]) + +Creates *amount* models of type *type*, optionally overriding the attributes from the factory with *attrs*. + +Returns the array of records that were added to the database. + +Here's an example from a test: + +```js +test("I can view the contacts", function() { + server.createList('contact', 5); + var youngContacts = server.createList('contact', 5, {age: 15}); + + visit('/'); + + andThen(function() { + equal(currentRouteName(), 'index'); + equal( find('p').length, 10 ); + }); +}); +``` + +And one from setting up your development database: + +```js +// mirage/scenarios/default.js +export default function(server) { + var contact = server.create('contact'); + server.createList('address', 5, {contactId: contact.id}); +} +``` diff --git a/tests/dummy/app/templates/docs/advanced/fixtures.md b/tests/dummy/app/templates/docs/advanced/fixtures.md new file mode 100644 index 000000000..bf0288f56 --- /dev/null +++ b/tests/dummy/app/templates/docs/advanced/fixtures.md @@ -0,0 +1,44 @@ +# Fixtures + +Fixtures are data files that can be used to seed your database, either during development or within tests. In general Mirage recommends using factories over fixtures, though there are times where fixtures are suitable. + +To add data to a database table `countries`, for instance, first create the file `mirage/fixtures/countries.js`: + +```js +// mirage/fixtures/countries.js +export default [ + {id: 1, name: 'United States'}, + {id: 2, name: 'Canada'}, + {id: 3, name: 'Mexido'}, + ... +]; +``` + +Fixture filenames are always plural, and export arrays of POJOs. + +To load this fixture file into our database during development, we can use the `loadFixtures` API in our `scenarios/default.js` file: + +```js +// mirage/scenarios/default.js +export default function(server) { + server.loadFixtures('countries'); +} +``` + +We can also call `server.loadFixtures()` (with no arguments) to have all defined fixture files loaded into the database. + +Similarly, we can call `loadFixtures` from within a test to load this data into our database: + +```js +test('I can see the countries', function() { + server.loadFixtures('countries'); + + visit('/'); + + andThen(function() { + equal( find('select.countries option').length, 100 ); + }); +}); +``` + +See the `server.loadFixtures` API docs for more information. diff --git a/tests/dummy/app/templates/docs/advanced/route-handlers.md b/tests/dummy/app/templates/docs/advanced/route-handlers.md new file mode 100644 index 000000000..4f926c7c5 --- /dev/null +++ b/tests/dummy/app/templates/docs/advanced/route-handlers.md @@ -0,0 +1,252 @@ +# Route handlers + +You define route handlers using the verb methods (`get`, `post`, `put`/`patch`, and `del`). All handlers have the following signature: + +```js +this.verb(path, handler[, responseCode, options={}]); +``` + +There are three types of route handlers: [shorthand](#shorthands), [object](#object-handler), and [function](#function-handler). + +The status code for all three types defaults to the following, based on the verb being used for the route: + + - GET is 200 + - PUT/PATCH is 204 + - POST is 201 + - DEL is 204 + +PUT/PATCH and POST change to 200 if there is a response body. + +The optional `options` hash passed as the last parameter has `timing` and `coalesce` options. + +# options.timing + +Set the timing parameter of the response for this particular route. Default is a 400ms delay during development and 0 delay in testing (so your tests run fast). + +Note you can set a [global timing parameter](../configuration/#timing) for all routes. Individual timing parameters override the global setting. + +Example: + +```js +this.post('/users', { timing: 1500 }); + +this.get('/complex_query', () => { + return [1, 2, 3, 4, 5]; +}, { timing: 3000 }); +``` + +# options.coalesce + +This option only affects the [*Array of Objects* version of the GET shorthand](../shorthands/#get-shorthands). It is ignored by all other route handlers. + + +## Shorthands + +```js +this.verb(path, shorthand[, responseCode]); +``` + +*shorthand* can either be a string, an array, or `undefined`, depending on which shorthand you're using. View [the reference](../shorthands) for all available shorthands. + +Examples: + +```js +this.get('/api/authors'); +this.put('/api/authors/:id'); +this.del('/posts/:id'); +``` + +## Object handler + +```js +this.verb(path, object[, responseCode]); +``` + +*object* is a POJO that's returned for this route. + +Example: + +```js +this.get('/api/authors/current', {id: 1, name: 'Link'}); +this.get('/some/secret', {message: 'unauthorized'}, 404); +``` + +## Function handler + +Write a custom function to handle this route. + +```js +this.verb(path, (schema, request) => { + // your code +}[, responseCode]); +``` + +The function handler you define takes two parameters, **schema** (your Mirage server's ORM) and **request** (the Pretender request object). Consult [the schema's API](../schema) for how to interact with your models (or the database directly) and [Pretender's docs](https://github.com/trek/pretender) for more info on the request object. + +If the data returned from your handler is a JavaScript object or array, it will be stringified and sent as the response body of your request: + +```js +this.get('/api/events', () => { + let events = []; + + for (var i = 0; i < 100; i++) { + events.push({ + id: i, + value: Math.random() * 100 + }); + }; + + return events; // will be JSON.stringified by Mirage +}); +``` + +Returning a Model or Collection (from `schema`) lets you take advantage of the serializer layer. + +```js +this.get('/api/users/:id', ({ users }, request) => { + return users.find(request.params.id); +}); +``` + +This handler returns a User model, which will pass through the UserSerializer if one exists, or the ApplicationSerializer otherwise. + +You can also return an instance of `Response` to dynamically set headers and the status code: +```js +import Response from 'ember-cli-mirage/response'; +``` +```js +this.post('/api/messages', (schema, request) => { + var params = JSON.parse(request.requestBody); + + if (!params.title) { + return new Response(422, {some: 'header', 'Content-Type': 'application/json'}, { + errors: [{ + status: 422, + title: 'email is invalid', + description: 'email cannot be blank' + }] + }); + } else { + return schema.messages.create(params); + } +}); +``` + +If you return a string, it will not be `JSON.stringified`, so you can return responses other than JSON. + +You may optionally return a promise resolving to any of the above, e.g.: + +```js +this.get('/users', () => { + return new Promise(resolve => { + resolve(new Response(200, { 'Content-Type': 'text/csv' }, 'firstname,lastname\nbob,dylan')); + }); +}); +``` + + +### Helpers + +The following helpers are available in your function handlers. + +# this.serialize(modelOrCollection[, serializerName]) + +This helper returns the serialized JSON for the given *modelOrCollection*. It's useful if you want to do some final munging on the serialized JSON before returning it. + +```js +this.get('/api/authors', function({ authors }) { + let json = this.serialize(authors.all()); + + json.meta = { page: 1 }; + + return json; +}); +``` + +By default this method uses the named serializer for the given Model or Collection. You can pass in a specific serializer via `serializerName`: + +```js +this.get('/api/authors', function({ authors }) { + let json = this.serialize(authors.all(), 'sparse-author'); + + json.meta = { page: 1 }; + + return json; +}); +``` + +# this.normalizedRequestAttrs() + +This helper will return the body of a request in a normalized form, suitable for working with and creating records. + +For example, if your Ember app makes a POST request with this data + +``` +POST /users + +{ + data: { + type: 'users', + attributes: { + 'first-name': 'Conan', + 'middle-name': 'the', + 'last-name': 'Barbarian' + }, + relationships: { + team: { + data: { + type: 'teams', + id: 1 + } + } + } + } +} +``` + +then `normalizedRequestAttrs()` could be used like this + +```js +this.post('/users', function(schema, request) { + let attrs = this.normalizedRequestAttrs(); + /* + attrs = { + firstName: 'Conan', + middleName: 'the', + lastName: 'Barbarian', + teamId: '1' + } + */ + return schema.users.create(attrs); +}); +``` + +Note that attribute keys were camelCased, and the `team` foreign key was extracted. This is because a `user` owns the `team` foreign key; if another relationship were included in the request but the `user` did not own its foreign key, it would not have been extracted. + +Note that this helper method leverages your serializer's `normalize` function. In the example above, it's assumed that the app was using the `JSONAPISerializer`, which comes with the `#normalize` method already written. If you're not using one of the bundled serializers, you'll need to implement `#normalize` and have it return a JSON:API document to take advantage of this method. + +Additionally, you'll need to use a full `function` here, as opposed to an ES6 arrow function (e.g `() => { ... }`). This is because `normalizeRequestAttrs` requires the `this` context from the function handler, and an arrow function would bind this from the outer scope. + +## External origins + +You can use Mirage to simulate other-origin requests. By default, a route like + +```js +this.get('/contacts', ...) +``` + +will hit the same origin that's serving your Ember app. To handle a different origin, use the fully qualified domain name: + +```js +this.get('http://api.twitter.com/v1', ...) +``` + +If your entire Ember app uses an external (other-origin) API, you can globally configure the domain via `urlPrefix`: + +```js +// mirage/config.js +this.urlPrefix = 'https://my.api.com'; + +// This route will handle requests to https://my.api.com/contacts +this.get('/contacts', ...) +``` From d97afec83997b9e67f6f214805ee548f457568a2 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 14 Nov 2018 07:36:52 -0500 Subject: [PATCH 234/879] Serializer docs --- addon/serializer.js | 746 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 631 insertions(+), 115 deletions(-) diff --git a/addon/serializer.js b/addon/serializer.js index 8ac1dcf6c..48ac55be9 100644 --- a/addon/serializer.js +++ b/addon/serializer.js @@ -12,34 +12,352 @@ import _assign from 'lodash/assign'; import _get from 'lodash/get'; import _ from 'lodash'; +/** + Serializers are responsible for formatting your route handler's response. + + The application serializer (`/mirage/serializers/application.js`) will apply to every response. To make specific customizations, define per-model serializers (e.g. `/mirage/serializers/blog-post.js`). + + Any Model or Collection returned from a route handler will pass through the serializer layer. Highest priority will be given to a model-specific serializer, then the application serializer, then the default serializer. + + Mirage ships with three named serializers: + + - **JSONAPISerializer**, to simulate JSON:API compliant servers: + + ```js + // mirage/serializers/application.js + import { JSONAPISerializer } from 'ember-cli-mirage'; + + export default JSONAPISerializer; + ``` + + - **ActiveModelSerializer**, to fake Rails backends that use AMS-style responses: + + ```js + // mirage/serializers/application.js + import { ActiveModelSerializer } from 'ember-cli-mirage'; + + export default ActiveModelSerializer; + ``` + + - **RestSerializer**, to fake backends that match Ember Data's RestSerializer expected response format: + + ```js + // mirage/serializers/application.js + import { RestSerializer } from 'ember-cli-mirage'; + + export default RestSerializer; + ``` + + Additionally, Mirage has a basic Serializer class which you can customize using the hooks documented below: + + ```js + // mirage/serializers/application.js + import { Serializer } from 'ember-cli-mirage'; + + export default Serializer; + ``` + + When writing model-specific serializers, remember to extend from your application serializer: + + ```js + // mirage/serializers/blog-post.js + import ApplicationSerializer from './application'; + + export default ApplicationSerializer.extend({ + include: ['comments'] + }); + ``` + + @class Serializer + @constructor + @public +*/ class Serializer { constructor(registry, type, request = {}) { this.registry = registry; this.type = type; this.request = request; + + /** + Use this property on a model serializer to whitelist attributes that will be used in your JSON payload. + + For example, if you had a `blog-post` model in your database that looked like + + ``` + { + id: 1, + title: 'Lorem ipsum', + createdAt: '2014-01-01 10:00:00', + updatedAt: '2014-01-03 11:42:12' + } + ``` + + and you just wanted `id` and `title`, you could write + + ```js + // mirage/serializers/blog-post.js + + export default Serializer.extend({ + attrs: ['id', 'title'] + }); + ``` + + and the payload would look like + + ``` + { + id: 1, + title: 'Lorem ipsum' + } + ``` + + @property attrs + @public + */ + this.attrs = undefined; + + /** + Use this property on a model serializer to specify related models you'd like to include in your JSON payload. (These can be considered default server-side includes.) + + For example, if you had an `author` with many `blog-post`s: + + ```js + // mirage/models/author.js + export default Model.extend({ + blogPosts: hasMany() + }); + ``` + + and you wanted to sideload these, specify so in the `include` key: + + ```js + // mirage/serializers/author.js + export default Serializer.extend({ + include: ['blogPosts'] + }); + ``` + + Now a response to a request for an author would look like this: + + ``` + GET /authors/1 + + { + author: { + id: 1, + name: 'Link', + blogPostIds: [1, 2] + }, + blogPosts: [ + {id: 1, authorId: 1, title: 'Lorem'}, + {id: 2, authorId: 1, title: 'Ipsum'} + ] + } + ``` + + You can also define `include` as a function so it can be determined dynamically: + + ```js + // mirage/serializers/author.js + export default Serializer.extend({ + include: function(request) { + if (request.queryParams.posts) { + return ['blogPosts']; + } else { + return []; + } + } + }); + ``` + + **Query param includes for JSONAPISerializer** + + The JSONAPISerializer supports the use of `include` query parameter to return compound documents out of the box. + + For versions of Ember Data before 2.5, you'll need to add `'ds-finder-include': true` to your app FEATURES object: + + ```js + // config/environment.js + var ENV = { + EmberENV: { + FEATURES: { + 'ds-finder-include': true + } + } + }; + ``` + + To tell Mirage to sideload blogPosts when we find all authors we can do the following: + + ```js + // routes/authors.js + export default Ember.Route.extend({ + model() { + return this.store.findAll('author', { include: 'blogPosts' }); + } + } + ``` + + The above will make a GET request to `/api/authors?include=blogPosts`, and then the appropriate Mirage route handler will be invoked. When it comes time to serialize the response, the JSONAPISerializer will inspect the query params of the request, see that the blogPosts relationship is present, and then proceed as if this relationship was specified directly in the include: [] array on the serializer itself. + + Note that, in accordance with the spec, Mirage gives precedence to an ?include query param over a default include: [] array that you might have specified directly on the serializer. Default includes will still be in effect, however, if a request does not have an ?include query param. + + @property include + @public + */ + this.include = undefined; + + /** + Set whether your JSON response should have a root key in it. + + *Doesn't apply to JSONAPISerializer.* + + Defaults to true, so a request for an author looks like: + + ``` + GET /authors/1 + + { + author: { + id: 1, + name: 'Link' + } + } + ``` + + Setting `root` to false disables this: + + ```js + // mirage/serializers/application.js + export default Serializer.extend({ + root: false + }); + ``` + + Now the response looks like: + + ``` + GET /authors/1 + + { + id: 1, + name: 'Link' + } + ``` + + @property root + @public + */ + this.root = undefined; + + /** + Set whether related models should be embedded or sideloaded. + + *Doesn't apply to JSONAPISerializer.* + + By default this false, so relationships are sideloaded: + + ``` + GET /authors/1 + + { + author: { + id: 1, + name: 'Link', + blogPostIds: [1, 2] + }, + blogPosts: [ + { id: 1, authorId: 1, title: 'Lorem' }, + { id: 2, authorId: 1, title: 'Ipsum' } + ] + } + ``` + + Setting `embed` to true will embed related records: + + ```js + // mirage/serializers/application.js + export default Serializer.extend({ + embed: true + }); + ``` + + Now the response looks like: + + ``` + GET /authors/1 + + { + author: { + id: 1, + name: 'Link', + blogPosts: [ + { id: 1, authorId: 1, title: 'Lorem' }, + { id: 2, authorId: 1, title: 'Ipsum' } + ] + } + } + ``` + */ + this.embed = undefined; + + /** + Use this to define how your serializer handles serializing relationship keys. It can take one of three values: + + - `included`, which is the default, will serialize the ids of a relationship if that relationship is included (sideloaded) along with the model or collection in the response + - `always` will always serialize the ids of all relationships for the model or collection in the response + - `never` will never serialize the ids of relationships for the model or collection in the response + + _Note: this feature was added in 0.2.2._ + + @property serializeIds + @public + */ + this.serializeIds = undefined; } /** - * Override this method to implement your own custom - * serialize function. `primaryResource` is whatever was returned - * from your route handler, and request is the Pretender - * request object. Returns a plain JavaScript object or - * array, which Mirage uses as the response data to your - * Ember app’s XHR request. You can also override this method, - * call super, and manipulate the data before Mirage responds - * with it. This is a great place to add metadata, or for - * one-off operations that don’t fit neatly into any of - * Mirage’s other abstractions. - * @method serialize - * @param response - * @param request - * @public + Override this method to implement your own custom serialize function. *response* is whatever was returned from your route handler, and *request* is the Pretender request object. + + Returns a plain JavaScript object or array, which Mirage uses as the response data to your Ember app's XHR request. + + You can also override this method, call super, and manipulate the data before Mirage responds with it. This is a great place to add metadata, or for one-off operations that don't fit neatly into any of Mirage's other abstractions: + + ```js + serialize(object, request) { + // This is how to call super, as Mirage borrows [Backbone's implementation of extend](http://backbonejs.org/#Model-extend) + let json = Serializer.prototype.serialize.apply(this, arguments); + + // Add metadata, sort parts of the response, etc. + + return json; + } + ``` + + @param primaryResource + @param request + @return { Object } the json response */ serialize(primaryResource /* , request */) { return this.buildPayload(primaryResource); } + /** + This method is used by the POST and PUT shorthands. These shorthands expect a valid JSON:API document as part of the request, so that they know how to create or update the appropriate resouce. The *normalize* method allows you to transform your request body into a JSON:API document, which lets you take advantage of the shorthands when you otherwise may not be able to. + + Note that this method is a noop if you're using JSON:API already, since request payloads sent along with POST and PUT requests will already be in the correct format. + + Take a look at the included [ActiveModelSerializer's normalize method](https://github.com/samselikoff/ember-cli-mirage/blob/master/addon/serializers/active-model-serializer.js#L22) for an example. + + @method normalize + @param json + @public + */ + normalize(json) { + return json; + } + buildPayload(primaryResource, toInclude, didSerialize, json) { if (!primaryResource && _isEmpty(toInclude)) { return json; @@ -207,23 +525,98 @@ class Serializer { } /** - * Used to define a custom key when serializing a - * primary model of modelName `modelName`. - * @method keyForModel - * @param modelName - * @public + Used to define a custom key when serializing a primary model of modelName *modelName*. For example, the default Serializer will return something like the following: + + ``` + GET /blogPosts/1 + + { + blogPost: { + id: 1, + title: 'Lorem ipsum' + } + } + ``` + + If your API uses hyphenated keys, you could overwrite `keyForModel`: + + ```js + // serializers/application.js + export default Serializer.extend({ + keyForModel(modelName) { + return Ember.String.dasherize(modelName); + } + }); + ``` + + Now the response will look like + + ``` + { + 'blog-post': { + id: 1, + title: 'Lorem ipsum' + } + } + ``` + + @method keyForModel + @param modelName + @public */ keyForModel(modelName) { return camelize(modelName); } /** - * Used to customize the key when serializing a primary - * collection. By default this pluralizes the return - * value of `keyForModel`. - * @method keyForCollection - * @param modelName - * @public + Used to customize the key when serializing a primary collection. By default this pluralizes the return value of `keyForModel`. + + For example, by default the following request may look like: + + ``` + GET /blogPosts + + { + blogPosts: [ + { + id: 1, + title: 'Lorem ipsum' + }, + ... + ] + } + ``` + + If your API hyphenates keys, you could overwrite `keyForCollection`: + + ```js + // serializers/application.js + const { dasherize, pluralize } = Ember.String; + + export default Serializer.extend({ + keyForCollection(modelName) { + return pluralize(dasherize(modelName)); + } + }); + ``` + + Now the response would look like: + + ``` + { + 'blog-posts': [ + { + id: 1, + title: 'Lorem ipsum' + }, + ... + ] + } + ``` + + @method keyForCollection + @param modelName + @public */ keyForCollection(modelName) { return pluralize(this.keyForModel(modelName)); @@ -264,9 +657,10 @@ class Serializer { } /** - * @method _attrsForModel - * @param model - * @private + @method _attrsForModel + @param model + @private + @hide */ _attrsForModel(model) { let attrs = {}; @@ -287,10 +681,11 @@ class Serializer { } /** - * @method _maybeAddAssociationIds - * @param model - * @param attrs - * @private + @method _maybeAddAssociationIds + @param model + @param attrs + @private + @hide */ _maybeAddAssociationIds(model, attrs) { let newHash = _assign({}, attrs); @@ -338,73 +733,152 @@ class Serializer { } /** - * Used to customize how a model’s attribute is - * formatted in your JSON payload. - * @method keyForAttribute - * @param attr - * @public + Used to customize how a model's attribute is formatted in your JSON payload. + + By default, model attributes are camelCase: + + ``` + GET /authors/1 + + { + author: { + firstName: 'Link', + lastName: 'The WoodElf' + } + } + ``` + + If your API expects snake case, you could write the following: + + ```js + // serializers/application.js + const { underscore } = Ember.String; + + export default Serializer.extend({ + keyForAttribute(attr) { + return underscore(attr); + } + }); + ``` + + Now the response would look like: + + ``` + { + author: { + first_name: 'Link', + last_name: 'The WoodElf' + } + } + ``` + + @method keyForAttribute + @param attr + @public */ keyForAttribute(attr) { return attr; } /** - * Use this hook to format the key for collections - * related to this model. - * - * For example, if you're serializing an author that - * side loads many `blogPosts`, you would get `blogPost` - * as an argument, and whatever you return would - * end up as the collection key in your JSON: - * - * keyForRelationship(type) { - * return dasherize(type); - * } - * - * { - * author: {...}, - * 'blog-posts': [...] - * } - * @method keyForRelationship - * @param modelName - * @public + Use this hook to format the key for collections related to this model. *modelName* is the named parameter for the relationship. + + For example, if you're serializing an `author` that + sideloads many `blogPosts`, the default response will look like: + + ``` + { + author: {...}, + blogPosts: [...] + } + ``` + + Overwrite `keyForRelationship` to format this key: + + ```js + // serializers/application.js + const { underscore } = Ember.String; + + export default Serializer.extend({ + keyForRelationship(modelName) { + return underscore(modelName); + } + }); + ``` + + Now the response will look like this: + + ``` + { + author: {...}, + blog_posts: [...] + } + ``` + + @method keyForRelationship + @param modelName + @public */ keyForRelationship(modelName) { return camelize(pluralize(modelName)); } /** - * @method keyForEmbeddedRelationship - * @param attributeName - * @public + Like `keyForRelationship`, but for embedded relationships. + + @method keyForEmbeddedRelationship + @param attributeName + @public */ keyForEmbeddedRelationship(attributeName) { return camelize(attributeName); } /** - * Use this hook to format the key for relationship ids - * in this model's JSON representation. - * - * For example, if you're serializing an author that - * side loads many `blogPosts`, you would get `blogPost` - * as an argument, and whatever you return would - * end up as part of the `author` JSON: - * - * keyForRelationshipIds(type) { - * return dasherize(type) + '-ids'; - * } - * - * { - * author: { - * ..., - * 'blog-post-ids': [1, 2, 3] - * }, - * 'blog-posts': [...] - * } - * @method keyForRelationshipIds - * @param modelName - * @public + Use this hook to format the key for relationship ids + in this model's JSON representation. + + For example, if you're serializing an `author` that + sideloads many `blogPosts`, your `author` JSON would include a `blogPostIds` key: + + ``` + { + author: { + id: 1, + blogPostIds: [1, 2, 3] + }, + blogPosts: [...] + } + ``` + + Overwrite `keyForRelationshipIds` to format this key: + + ```js + // serializers/application.js + const { underscore } = Ember.String; + + export default Serializer.extend({ + keyForRelationshipIds(relationship) { + return underscore(relationship) + '_ids'; + } + }); + ``` + + Now the response will look like: + + ``` + { + author: { + id: 1, + blog_post_ids: [1, 2, 3] + }, + blogPosts: [...] + } + ``` + + @method keyForRelationshipIds + @param modelName + @public */ keyForRelationshipIds(relationshipName) { return `${singularize(camelize(relationshipName))}Ids`; @@ -423,58 +897,92 @@ class Serializer { } /** - * This method is used by the POST and PUT shorthands. These shorthands - * expect a valid JSON:API document as part of the request, so that - * they know how to create or update the appropriate resouce. The normalize - * method allows you to transform your request body into a JSON:API - * document, which lets you take advantage of the shorthands when you - * otherwise may not be able to. - * - * Note that this method is a noop if you’re using JSON:API already, - * since request payloads sent along with POST and PUT requests will - * already be in the correct format. - * @method normalize - * @param json - * @public - */ - normalize(json) { - return json; + This hook is only available on the JSONAPISerializer. + + Use this hook to override the generated `type` for the JSON:API resource object. By default, `type` will be the plural and dasherized form of the model name. + + For example, if you wanted singularized types: + + ```js + export default JSONAPISerializer.extend({ + typeKeyForModel(model) { + return dasherize(singularize(model.modelName)); + } + }); + ``` + + @method typeKeyForModel + @param model + */ + typeKeyForModel(model) { + } + + /** + This hook is only available on the JSONAPISerializer. + + Use this hook to add top-level `links` data to JSON:API resource objects. The argument is the model being serialized. + + ```js + // serializers/author.js + import { JSONAPISerializer } from 'ember-cli-mirage'; + + export default JSONAPISerializer.extend({ + + links(author) { + return { + 'posts': { + related: `/api/authors/${author.id}/posts` + } + }; + } + + }); + ``` + + @method links + @param model + */ + links(model) { } /** - * @method isModel - * @param object - * @return {Boolean} - * @public + @method isModel + @param object + @return {Boolean} + @public + @hide */ isModel(object) { return object instanceof Model; } /** - * @method isCollection - * @param object - * @return {Boolean} - * @public + @method isCollection + @param object + @return {Boolean} + @public + @hide */ isCollection(object) { return (object instanceof Collection) || (object instanceof PolymorphicCollection); } /** - * @method isModelOrCollection - * @param object - * @return {Boolean} - * @public + @method isModelOrCollection + @param object + @return {Boolean} + @public + @hide */ isModelOrCollection(object) { return this.isModel(object) || this.isCollection(object); } /** - * @method serializerFor - * @param type - * @public + @method serializerFor + @param type + @public + @hide */ serializerFor(type) { return this.registry.serializerFor(type); @@ -484,14 +992,22 @@ class Serializer { return _isFunction(this.include) ? this.include(this.request) : this.include; } + /** + Foo bar. + + @property schema + @public + @hide + */ get schema() { return this.registry.schema; } /** - * @method _formatAttributeKeys - * @param attrs - * @private + @method _formatAttributeKeys + @param attrs + @private + @hide */ _formatAttributeKeys(attrs) { let formattedAttrs = {}; From 993343ef7c890447d66ead9d3cf81c4ab4cb47a7 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 14 Nov 2018 08:53:01 -0500 Subject: [PATCH 235/879] More docage --- addon/orm/collection.js | 2 + addon/orm/model.js | 328 ++++++++++++------ addon/orm/polymorphic-collection.js | 1 + addon/response.js | 13 + addon/server.js | 105 +++++- tests/dummy/app/router.js | 2 + tests/dummy/app/templates/docs.hbs | 2 + .../docs/advanced/defining-relationships.md | 161 +++++++++ .../app/templates/docs/advanced/factories.md | 2 +- .../app/templates/docs/advanced/shorthands.md | 201 +++++++++++ 10 files changed, 706 insertions(+), 111 deletions(-) create mode 100644 tests/dummy/app/templates/docs/advanced/defining-relationships.md create mode 100644 tests/dummy/app/templates/docs/advanced/shorthands.md diff --git a/addon/orm/collection.js b/addon/orm/collection.js index 0cc12f7ab..cc2f4d9d9 100644 --- a/addon/orm/collection.js +++ b/addon/orm/collection.js @@ -11,6 +11,8 @@ import _invokeMap from 'lodash/invokeMap'; let posts = schema.blogPosts.where({ published: true }); ``` + Note that there is also a `PolymorphicCollection` class that is identical to `Collection`, except it can contain a heterogeneous array of models. Thus, it has no `modelName` property. This lets serializers and other parts of the system interact with it differently. + @class Collection @constructor @public diff --git a/addon/orm/model.js b/addon/orm/model.js index 580574055..7b5b55412 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -12,7 +12,7 @@ import _assign from 'lodash/assign'; /** Models wrap your database and allow you to define relationships. - As a clarifying point, Mirage model instances only exist within Mirage's server, and are not shared directly with your Ember app. The only way to get Mirage models into your Ember app is via an API call. This means you should never create a Mirage model and, for example, pass it directly into an Ember component. They solely exist to help you manage the data and relationships in your fake backend. + As a clarifying point, Mirage model instances only exist within Mirage's server, and are not shared directly with your Ember app. The only way to get Mirage models into your Ember app is via an API call. This means you should never create a Mirage model and, for example, pass it directly into an Ember component. They exist solely to help you manage the data and relationships in your fake backend. If you're using Ember Data and version 0.3.3. of Mirage or later, your Mirage model definitions (with relationships) will be detected and auto-generated for you, so you don't need to define the files yourself. If you're not, you can define models by adding files under `/models` or using the provided generator: @@ -35,6 +35,37 @@ import _assign from 'lodash/assign'; You can find the Class methods documented under the `Schema` API docs. + **Accessing properties and relationships** + + You can access properites (fields) and relationships directly off of models. + + ```js + user.name; // 'Sam' + user.team; // Team model + user.teamId; // Team id (foreign key) + ``` + + Mirage Models are schemaless in their attributes, but their relationship schema is known. + + For example, + + ```js + let user = schema.users.create(); + user.attrs // { } + user.name // undefined + + let user = schema.users.create({ name: 'Sam' }); + user.attrs // { name: 'Sam' } + user.name // 'Sam' + ``` + + However, if a `user` has a `posts` relationships defined, + + ```js + let user = schema.users.create(); + user.posts // returns an empty Posts Collection + ``` + @class Model @constructor @public @@ -56,6 +87,22 @@ class Model { this.schema = schema; this.modelName = modelName; this.fks = fks || []; + + /** + Returns the attributes of your model. + + ```js + let post = schema.blogPosts.find(1); + post.attrs; // {id: 1, title: 'Lorem Ipsum', publishedAt: '2012-01-01 10:00:00'} + ``` + + Note that you can also access individual attributes directly off a model, e.g. `post.title`. + + @property attrs + @public + */ + this.attrs = undefined; + attrs = attrs || {}; this._setupAttrs(attrs); @@ -65,10 +112,22 @@ class Model { } /** - * Creates or saves the model. - * @method save - * @return this - * @public + Create or saves the model. + + ```js + let post = blogPosts.new({ title: 'Lorem ipsum' }); + post.id; // null + + post.save(); + post.id; // 1 + + post.title = 'Hipster ipsum'; // db has not been updated + post.save(); // ...now the db is updated + ``` + + @method save + @return this + @public */ save() { let collection = toInternalCollectionName(this.modelName); @@ -92,12 +151,22 @@ class Model { } /** - * Update the record in the db. - * @method update - * @param {String} key - * @param {String} val - * @return this - * @public + Updates the record in the db. + + ```js + let post = blogPosts.find(1); + post.update('title', 'Hipster ipsum'); // the db was updated + post.update({ + title: 'Lorem ipsum', + created_at: 'before it was cool' + }); + ``` + + @method update + @param {String} key + @param {String} val + @return this + @public */ update(key, val) { let attrs; @@ -124,9 +193,15 @@ class Model { } /** - * Destroys the db record - * @method destroy - * @public + Destroys the db record. + + ```js + let post = blogPosts.find(1); + post.destroy(); // removed from the db + ``` + + @method destroy + @public */ destroy() { if (this.isSaved()) { @@ -138,15 +213,21 @@ class Model { } /** - * Boolean, true if the model has not been persisted yet to the db. - * - * Originally this method simply checked if the model had an id; however, - * we let people create models with pre-specified ids. So, we have to - * check whether the record is in the actual databse or not. - * - * @method isNew - * @return {Boolean} - * @public + Boolean, true if the model has not been persisted yet to the db. + + ```js + let post = blogPosts.new({title: 'Lorem ipsum'}); + post.isNew(); // true + post.id; // null + + post.save(); // true + post.isNew(); // false + post.id; // 1 + ``` + + @method isNew + @return {Boolean} + @public */ isNew() { let hasDbRecord = false; @@ -165,20 +246,33 @@ class Model { } /** - * Boolean, opposite of `isNew` - * @method isSaved - * @return {Boolean} - * @public + Boolean, opposite of `isNew` + + @method isSaved + @return {Boolean} + @public */ isSaved() { return !this.isNew(); } /** - * Reload a model’s data from the database. - * @method reload - * @return this - * @public + Reload a model's data from the database. + + ```js + let post = blogPosts.find(1); + post.attrs; // {id: 1, title: 'Lorem ipsum'} + + post.title = 'Hipster ipsum'; + post.title; // 'Hipster ipsum'; + + post.reload(); // true + post.title; // 'Lorem ipsum' + ``` + + @method reload + @return this + @public */ reload() { if (this.id) { @@ -205,21 +299,22 @@ class Model { } /** - * Returns the association for the given key - * - * @method associationFor - * @param key - * @public + Returns the association for the given key + + @method associationFor + @param key + @public + @hide */ associationFor(key) { return this.schema.associationsFor(this.modelName)[key]; } /** - * Returns this model's inverse association for the given - * model-type-association pair, if it exists. - * - * Example: + Returns this model's inverse association for the given + model-type-association pair, if it exists. + + Example: post: Model.extend({ comments: hasMany() @@ -248,22 +343,23 @@ class Model { `post.comments` or `picture.comments`? Instead we need to ask each model if it has an inverse for a given association. post.inverseFor(commentable) is no longer ambiguous. - * - * - * @method hasInverseFor - * @param {String} modelName The model name of the class we're scanning - * @param {ORM/Association} association - * @return {ORM/Association} - * @public + + @method hasInverseFor + @param {String} modelName The model name of the class we're scanning + @param {ORM/Association} association + @return {ORM/Association} + @public + @hide */ inverseFor(association) { return this._explicitInverseFor(association) || this._implicitInverseFor(association); } /** - * Finds the inverse for an association that explicity defines it's inverse - * - * @private + Finds the inverse for an association that explicity defines it's inverse + + @private + @hide */ _explicitInverseFor(association) { this._checkForMultipleExplicitInverses(association); @@ -286,12 +382,13 @@ class Model { } /** - * Ensures multiple explicit inverses don't exist on the current model - * for the given association. - * - * TODO: move this to compile-time check - * - * @private + Ensures multiple explicit inverses don't exist on the current model + for the given association. + + TODO: move this to compile-time check + + @private + @hide */ _checkForMultipleExplicitInverses(association) { let associations = this.schema.associationsFor(this.modelName); @@ -309,10 +406,11 @@ class Model { } /** - * Finds if there is an inverse for an association that does not - * explicitly define one. - * - * @private + Finds if there is an inverse for an association that does not + explicitly define one. + + @private + @hide */ _implicitInverseFor(association) { let associations = this.schema.associationsFor(this.modelName); @@ -338,24 +436,26 @@ class Model { } /** - * Returns whether this model has an inverse association for the given - * model-type-association pair. - * - * @method hasInverseFor - * @param {String} modelName - * @param {ORM/Association} association - * @return {Boolean} - * @public + Returns whether this model has an inverse association for the given + model-type-association pair. + + @method hasInverseFor + @param {String} modelName + @param {ORM/Association} association + @return {Boolean} + @public + @hide */ hasInverseFor(association) { return !!this.inverseFor(association); } /** - * Used to check if models match each other. If models are saved, we check model type - * and id, since they could have other non-persisted properties that are different. - * - * @public + Used to check if models match each other. If models are saved, we check model type + and id, since they could have other non-persisted properties that are different. + + @public + @hide */ alreadyAssociatedWith(model, association) { let { key } = association; @@ -410,17 +510,21 @@ class Model { } } + /** + @hide + */ get isSaving() { return this.schema.isSaving[this.toString()]; } // Private /** - * model.attrs represents the persistable attributes, i.e. your db - * table fields. - * @method _setupAttrs - * @param attrs - * @private + model.attrs represents the persistable attributes, i.e. your db + table fields. + @method _setupAttrs + @param attrs + @private + @hide */ _setupAttrs(attrs) { this._validateAttrs(attrs); @@ -449,10 +553,11 @@ class Model { } /** - * Define getter/setter for a plain attribute - * @method _definePlainAttribute - * @param attr - * @private + Define getter/setter for a plain attribute + @method _definePlainAttribute + @param attr + @private + @hide */ _definePlainAttribute(attr) { @@ -480,14 +585,15 @@ class Model { } /** - * Foreign keys get set on attrs directly (to avoid potential recursion), but - * model references use the setter. + Foreign keys get set on attrs directly (to avoid potential recursion), but + model references use the setter. * - * We validate foreign keys during instantiation. + We validate foreign keys during instantiation. * - * @method _setupRelationships - * @param attrs - * @private + @method _setupRelationships + @param attrs + @private + @hide */ _setupRelationships(attrs) { let foreignKeysHash = Object.keys(attrs).reduce((memo, attr) => { @@ -518,8 +624,9 @@ class Model { } /** - * @method _validateAttrs - * @private + @method _validateAttrs + @private + @hide */ _validateAttrs(attrs) { // Verify attrs passed in for associations are actually associations @@ -571,12 +678,13 @@ class Model { } /** - * Originally we validated this via association.setId method, but it triggered - * recursion. That method is designed for updating an existing model's ID so - * this method is needed during instantiation. + Originally we validated this via association.setId method, but it triggered + recursion. That method is designed for updating an existing model's ID so + this method is needed during instantiation. * - * @method _validateForeignKeyExistsInDatabase - * @private + @method _validateForeignKeyExistsInDatabase + @private + @hide */ _validateForeignKeyExistsInDatabase(foreignKeyName, foreignKeys) { if (Array.isArray(foreignKeys)) { @@ -615,10 +723,11 @@ class Model { } /** - * Update associated children when saving a collection + Update associated children when saving a collection * - * @method _saveAssociations - * @private + @method _saveAssociations + @private + @hide */ _saveAssociations() { this._saveBelongsToAssociations(); @@ -863,11 +972,17 @@ class Model { } /** - * Simple string representation of the model and id. - * @method toString - * @return {String} - * @public - */ + Simple string representation of the model and id. + + ```js + let post = blogPosts.find(1); + post.toString(); // "model:blogPost:1" + ``` + + @method toString + @return {String} + @public + */ toString() { let idLabel = this.id ? `(${this.id})` : ''; @@ -875,11 +990,12 @@ class Model { } /** - * Checks the equality of this model and the passed-in model + Checks the equality of this model and the passed-in model * - * @method equals - * @return boolean - * @public + @method equals + @return boolean + @public + @hide */ equals(model) { return this.toString() === model.toString(); diff --git a/addon/orm/polymorphic-collection.js b/addon/orm/polymorphic-collection.js index 495f09389..6bc5a2156 100644 --- a/addon/orm/polymorphic-collection.js +++ b/addon/orm/polymorphic-collection.js @@ -12,6 +12,7 @@ import _isEqual from 'lodash/isEqual'; * @class PolymorphicCollection * @constructor * @public + * @hide */ export default class PolymorphicCollection { constructor(models = []) { diff --git a/addon/response.js b/addon/response.js index 63c59bf6c..2927229ef 100644 --- a/addon/response.js +++ b/addon/response.js @@ -1,3 +1,16 @@ +/** + You can use this class when you want more control over your route handlers response. + + Pass the `code`, `headers` and `data` into the constructor and return an instance from any route handler. + + ```js + import { Response } from 'ember-cli-mirage'; + + this.get('/users', () => { + return new Response(400, { some: 'header' }, { errors: [ 'name cannot be blank'] }); + }); + ``` +*/ export default class Response { constructor(code, headers = {}, data = '') { diff --git a/addon/server.js b/addon/server.js index ca6cd2441..6f37fcfcb 100644 --- a/addon/server.js +++ b/addon/server.js @@ -156,6 +156,22 @@ export default class Server { constructor(options = {}) { this.config(options); + + /** + Returns the Mirage Db instance. + + @property db + @return Db + */ + this.db = undefined; + + /** + Returns the Mirage Schema (ORM) instance. + + @property schema + @return Schema + */ + this.schema = undefined; } config(config = {}) { @@ -622,7 +638,51 @@ export default class Server { return list; } - create(type, ...options) { + /** + Generates a single model of type *type*, inserts it into the database (giving it an id), and returns the data that was + added. + + ```js + test("I can view a contact's details", function() { + var contact = server.create('contact'); + + visit('/contacts/' + contact.id); + + andThen(() => { + equal( find('h1').text(), 'The contact is Link'); + }); + }); + ``` + + You can override the attributes from the factory definition with a + hash passed in as the second parameter. For example, if we had this factory + + ```js + export default Factory.extend({ + name: 'Link' + }); + ``` + + we could override the name like this: + + ```js + test("I can view the contacts", function() { + server.create('contact', {name: 'Zelda'}); + + visit('/'); + + andThen(() => { + equal( find('p').text(), 'Zelda' ); + }); + }); + ``` + + @method create + @param type + @param traitsAndOverrides + @public + */ + create(type, ...traitsAndOverrides) { assert( this._validateCreateType(type), `You called server.create('${type}') but no model or factory was found. Make sure you're using the singularized version of your model.` @@ -630,9 +690,9 @@ export default class Server { // When there is a Model defined, we should return an instance // of it instead of returning the bare attributes. - let traits = options.filter((arg) => arg && typeof arg === 'string'); - let overrides = _find(options, (arg) => _isPlainObject(arg)); - let collectionFromCreateList = _find(options, (arg) => arg && Array.isArray(arg)); + let traits = traitsAndOverrides.filter((arg) => arg && typeof arg === 'string'); + let overrides = _find(traitsAndOverrides, (arg) => _isPlainObject(arg)); + let collectionFromCreateList = _find(traitsAndOverrides, (arg) => arg && Array.isArray(arg)); let attrs = this.build(type, ...traits, overrides); let modelOrRecord; @@ -666,6 +726,43 @@ export default class Server { return modelOrRecord; } + /** + Creates *amount* models of type *type*, optionally overriding the attributes from the factory with *attrs*. + + Returns the array of records that were added to the database. + + Here's an example from a test: + + ```js + test("I can view the contacts", function() { + server.createList('contact', 5); + var youngContacts = server.createList('contact', 5, {age: 15}); + + visit('/'); + + andThen(function() { + equal(currentRouteName(), 'index'); + equal( find('p').length, 10 ); + }); + }); + ``` + + And one from setting up your development database: + + ```js + // mirage/scenarios/default.js + export default function(server) { + var contact = server.create('contact'); + server.createList('address', 5, {contactId: contact.id}); + } + ``` + + @method createList + @param type + @param amount + @param traitsAndOverrides + @public + */ createList(type, amount, ...traitsAndOverrides) { assert( this._validateCreateType(type), diff --git a/tests/dummy/app/router.js b/tests/dummy/app/router.js index 10fb4dbb0..154f9c861 100644 --- a/tests/dummy/app/router.js +++ b/tests/dummy/app/router.js @@ -28,9 +28,11 @@ Router.map(function() { this.route('advanced', function() { this.route('route-handlers'); + this.route('defining-relationships'); this.route('factories'); this.route('fixtures'); this.route('environment-options'); + this.route('shorthands'); }); this.route('examples', function() { diff --git a/tests/dummy/app/templates/docs.hbs b/tests/dummy/app/templates/docs.hbs index 98ea61918..91527f17f 100644 --- a/tests/dummy/app/templates/docs.hbs +++ b/tests/dummy/app/templates/docs.hbs @@ -14,6 +14,8 @@ {{nav.section 'Advanced'}} {{nav.item 'Route handlers' 'docs.advanced.route-handlers'}} + {{nav.item 'Shorthands' 'docs.advanced.shorthands'}} + {{nav.item 'Defining relationships' 'docs.advanced.defining-relationships'}} {{nav.item 'Factories' 'docs.advanced.factories'}} {{nav.item 'Fixtures' 'docs.advanced.fixtures'}} {{nav.item 'Environment configuration' 'docs.advanced.environment-options'}} diff --git a/tests/dummy/app/templates/docs/advanced/defining-relationships.md b/tests/dummy/app/templates/docs/advanced/defining-relationships.md new file mode 100644 index 000000000..ad6c68adf --- /dev/null +++ b/tests/dummy/app/templates/docs/advanced/defining-relationships.md @@ -0,0 +1,161 @@ +# Defining relationships + +In modern versions of Mirage (0.3.3 and later), Mirage's relationships are inferred from your Ember Data schema. + +If you are not using Ember Data or are on an older version of Mirage, you can manually define Mirage's Models so that you can take advantage of its many features that rely on the ORM, like Serializers and Factories. + +To define associations, use the `belongsTo` and `hasMany` helpers. Each helper adds some dynamic methods to your model. + +*belongsTo* + +```js +// mirage/models/blog-post.js +import { Model, belongsTo } from 'ember-cli-mirage'; + +export default Model.extend({ + author: belongsTo() +}); +``` + +This adds an `authorId` property to your `blogPost` model, as well as some methods for working with the associated `author` model: + +```js +blogPost.authorId; // 1 +blogPost.authorId = 2; // updates the relationship +blogPost.author; // Author instance +blogPost.author = anotherAuthor; +blogPost.newAuthor(attrs); // new unsaved author +blogPost.createAuthor(attrs); // new saved author (updates blogPost.authorId in memory only) +``` +Note that when a child calls `child.createParent`, the new parent is immediately saved to the `db`, but the child's foreign key is updated *on this instance only*, and is not immediately persisted to the database. + +In other words, `blogPost.createAuthor` will create a new `author` record, insert it into the `db`, and update the `blogPost.authorId` in memory, but if you were to fetch the `blogPost` from the `db` again, the relationship would not be persisted. + +To persist the new foreign key, you would call `blogPost.save()` after creating the new author. + +*hasMany* + +```js +// mirage/models/blog-post.js +import { Model, hasMany } from 'ember-cli-mirage'; + +export default Model.extend({ + comments: hasMany() +}); +``` + +This adds a `commentIds` property to the `blogPost` model, as well as some methods for working with the associated `comments` collection: + +```js +blogPost.commentIds; // [1, 2, 3] +blogPost.commentIds = [2, 3]; // updates the relationship +blogPost.comments; // array of related comments +blogPost.comments = [comment1, comment2]; // updates the relationship +blogPost.newComment(attrs); // new unsaved comment +blogPost.createComment(attrs); // new saved comment (comment.blogPostId is set) +``` + +### Association options + +*modelName* + +If your associations model has a different name than the association itself, you can specify the `modelName` on the association. + +For example, + +```js +// mirage/models/blog-post.js +import { Model, belongsTo, hasMany } from 'ember-cli-mirage'; + +export default Model.extend({ + author: belongsTo('user'), + comments: hasMany('annotation') +}); +``` + +would add all the named `author` and `comment` methods as listed above, but use `user` and `annotation` models for the actual relationships. + +*inverse* + +Sometimes a `hasMany` relationship can point to a model with multiple associations of the same type. You can use the `inverse` option to specify which property on the related model is the inverse of the given relationship: + +```js +// app/models/talk.js +export default Model.extend({ + primaryEvent: belongsTo('event'), + secondaryEvent: belongsTo('event'), +}); + +// app/models/event.js +export default Model.extend({ + talks: hasMany('talk', { inverse: 'primaryEvent' }), +}); +``` + +*polymorphic* + +You can specify whether an association is a polymorphic association by passing `{ polymorphic: true }` as an option. + +For example, say you have a `Comment` that can belong to a `BlogPost` or a `Picture`. Here's how the model definitions would look: + +```js +// app/models/comment.js +export default Model.extend({ + commentable: belongsTo({ polymorphic: true }) +}); + +// app/models/blog-post.js +export default Model.extend({ + comments: hasMany() +}); + +// app/models/picture.js +export default Model.extend({ + comments: hasMany() +}); +``` + +Note that `commentable` doesn't need a type (there's no validation done on which types of models can exist on that association). + +Polymorphic associations have slightly different method signatures for their foreign keys and build/create methods. + +```js +let comment = schema.comments.create({ text: "foo" }); + +comment.buildCommentable('post', { title: 'Lorem Ipsum' }); +comment.createCommentable('post', { title: 'Lorem Ipsum' }); + +// getter +comment.commentableId; // { id: 1, type: 'blog-post' } + +// setter +comment.commentableId = { id: 2, type: 'picture' }; +``` + +Has-many asssociations can also be polymorphic: + +```js +// app/models/user.js +export default Model.extend({ + things: hasMany({ polymorphic: true }) +}); + +// app/models/car.js +export default Model.extend({ +}); + +// app/models/watch.js +export default Model.extend({ +}); + +let user = schema.users.create({ name: "Sam" }); + +user.buildThing('car', { attrs }); +user.createThing('watch', { attrs }); + +// getter +user.thingIds; // [ { id: 1, type: 'car' }, { id: 3, type: 'watch' }, ... ] + +// setter +user.thingIds = [ { id: 2, type: 'watch' }, ... ]; +``` diff --git a/tests/dummy/app/templates/docs/advanced/factories.md b/tests/dummy/app/templates/docs/advanced/factories.md index cf440819e..38738a5ab 100644 --- a/tests/dummy/app/templates/docs/advanced/factories.md +++ b/tests/dummy/app/templates/docs/advanced/factories.md @@ -110,7 +110,7 @@ export default Factory.extend({ You should define the attributes of your factory as the "base case" for your objects, and override them within your tests. We'll discuss how do to this in the Creating Objects section. -## Factories and relationships +## Working with relationships When building objects using factories, you may want to create related objects automatically. To build related objects for `belongsTo` relationships, you can use `association` helper. diff --git a/tests/dummy/app/templates/docs/advanced/shorthands.md b/tests/dummy/app/templates/docs/advanced/shorthands.md new file mode 100644 index 000000000..9178d6c02 --- /dev/null +++ b/tests/dummy/app/templates/docs/advanced/shorthands.md @@ -0,0 +1,201 @@ +# Shorthand reference + +A *shorthand* is a simple way to define a route handler for common API scenarios. Here's a reference of each shorthand, along with the raw route handler that the shorthand represents. + +In Mirage 0.1, shorthands responded with objects and arrays directly from the database. In 0.2, shorthands return Models and Collections, meaning you can customize the format of the response in the [serializer layer](../serializers). + +Shorthands use default status codes, based on the HTTP verb: + + - GET, PUT and DEL are 200 + - POST is 201 + +## GET shorthands + +*Collection* + +```js +// shorthand +this.get('/contacts'); // finds type by singularizing url +this.get('/contacts', 'users'); // optionally specify the collection as second param + +// equivalent +this.get('/contacts', ({ contacts }) => { + return contacts.all(); // users in the second case +}); +``` + +*Model* + +``` +// shorthand +this.get('/contacts/:id'); // finds type by singularizing url +this.get('/contacts/:id', 'user'); // optionally specify the type as second param + +// equivalent +this.get('/contacts/:id', ({ contacts }, request) => { + let id = request.params.id; + + return contacts.find(id); // users in the second case +}); +``` + +*Array of Models* + +For example, `GET /contacts?ids=1,3` + +```js +// shorthand +this.get('/contacts', { coalesce: true }); +this.get('/contacts', 'users', { coalesce: true }); + +// equivalent +this.get('/contacts', ({ contacts }, request) => { + let ids = request.queryParams.ids; + + return contacts.find(ids); // users in the second case +}); +``` + +--- + +*Note: there used to be a *Single record with related records *shorthand. You should now use serializers and relationships to solve this problem.* + +## POST shorthands + +*Creating a resource* + +```js +// shorthand +this.post('/contacts'); // finds type by singularizing url +this.post('/contacts', 'user'); // optionally specify the type as second param + +// equivalent +this.post('/contacts', function({ contacts }, request) { + let attrs = this.normalizedRequestAttrs(); + + return contacts.create(attrs); +}); +``` + +For this POST shorthand to work, Mirage needs to know the format of the JSON payload your Ember app sends along with the request, so that it can insert the appropriate data into the database. See [the note on normalize](../serializers/#normalizejson) in the Serializer docs for more information. + +## PUT shorthands + +*Update a resource* + +```js +// shorthand +this.put('/contacts/:id'); // finds type by singularizing url +this.put('/contacts/:id', 'user'); // optionally specify the type as second param + +// equivalent +this.put('/contacts/:id', function({ contacts }, request) { + let id = request.params.id; + let attrs = this.normalizedRequestAttrs(); + + return contacts.find(id).update(attrs); +}); +``` + +For this PUT shorthand to work, Mirage needs to know the format of the JSON payload your Ember app sends along with the request, so that it can insert the appropriate data into the database. See the note on normalize in the Serializer docs for more information. + +## DELETE shorthands + +*Remove a resource* + +```js +// shorthand +this.del('/contacts/:id'); // finds type by singularizing url +this.del('/contacts/:id', 'user'); // optionally specify the type as second param + +// equivalent +this.del('/contacts/:id', ({ contacts }, request) => { + let id = request.params.id; + + contacts.find(id).destroy(); +}); +``` + +*Remove a resource and related models* + +To use this shorthand, make sure you have the appropriate `hasMany`/`belongsTo` relationships defined on your models. + +```js +// shorthand +this.del('/contacts/:id', ['contact', 'addresses']); + +// equivalent +this.del('/contacts/:id', ({ contacts }, request) => { + let id = request.params.id; + let contact = contacts.find(id); + + contact.addresses.destroy(); + contact.destroy(); +}); +``` + +## Resource helper + +For handling generic CRUD, you can use *resource* helper which will take care of defining all shorthands. The following examples are equivalent: + +```js +// shorthand +this.resource('contacts'); // available in 0.2.2+ + +// equivalent +this.get('/contacts'); +this.get('/contacts/:id'); +this.post('/contacts'); +this.put('/contacts/:id'); +this.patch('/contacts/:id'); +this.del('/contacts/:id'); +``` + +You can also whitelist which route handlers will be defined using *only* option: + +```js +// shorthand +this.resource('contacts', { only: ['index', 'show'] }); + +// equivalent +this.get('/contacts'); +this.get('/contacts/:id'); +``` + +or which route handlers shouldn't be defined using *except* option: + +```js +// shorthand +this.resource('contacts', { except: ['update'] }); + +// equivalent +this.get('/contacts'); +this.get('/contacts/:id'); +this.post('/contacts'); +this.del('/contacts/:id'); +``` + +If your route path and collection names do not match, you can define a relative or absolute path using the *path* option: + +```js +// shorthand +this.resource('blog-posts', { path: '/posts' }); + +// equivalent +this.get('/posts', 'blog-posts'); +this.get('/posts/:id', 'blog-posts'); +this.post('/posts', 'blog-posts'); +this.put('/posts/:id', 'blog-posts'); +this.patch('/posts/:id', 'blog-posts'); +this.del('/posts/:id', 'blog-posts'); +``` + +Here is the full reference of actions' names you can pass to *only* / *except* options and the shorthands they stand for: + +| Action | Shorthand | +|:-------|:---------------------------------------------| +| index | `this.get('/contacts')` | +| show | `this.get('/contacts/:id')` | +| create | `this.post('/contacts')` | +| update | `this.patch('contacts/:id')` (or `this.put`) | +| delete | `this.del('/contacts/:id')` | From 1770d3f7e1774d7bada9eb40a25d880b487715c9 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 14 Nov 2018 11:38:14 -0500 Subject: [PATCH 236/879] Migrate contacts acceptance test to test-app --- addon/serializer.js | 2 +- addon/server.js | 8 +-- test-apps/basic-app/app/components/.gitkeep | 0 test-apps/basic-app/app/controllers/.gitkeep | 0 test-apps/basic-app/app/helpers/.gitkeep | 0 test-apps/basic-app/app/models/.gitkeep | 0 test-apps/basic-app/app/models/user.js | 13 ++++ .../app/pods/application/template.hbs | 3 + .../app/pods/crud-demo-error/template.hbs | 5 ++ .../app/pods/crud-demo/controller.js | 29 ++++++++ .../basic-app/app/pods/crud-demo/route.js | 12 ++++ .../basic-app/app/pods/crud-demo/template.hbs | 42 ++++++++++++ .../module-count/controller.js} | 0 .../module-count/template.hbs} | 2 - test-apps/basic-app/app/router.js | 2 + test-apps/basic-app/app/routes/.gitkeep | 0 .../app/templates/components/.gitkeep | 0 test-apps/basic-app/config/environment.js | 1 + .../fastboot-tests/included-files-test.js | 8 +-- test-apps/basic-app/mirage/config.js | 3 + .../basic-app/mirage/scenarios/default.js | 7 ++ .../mirage/serializers/application.js | 3 + test-apps/basic-app/testem.js | 1 - .../basic-app/tests/acceptance/users-test.js | 67 +++++++++++++++++++ tests/acceptance/contact-test.js | 29 -------- tests/acceptance/contacts-test.js | 44 ------------ 26 files changed, 196 insertions(+), 85 deletions(-) delete mode 100644 test-apps/basic-app/app/components/.gitkeep delete mode 100644 test-apps/basic-app/app/controllers/.gitkeep delete mode 100644 test-apps/basic-app/app/helpers/.gitkeep delete mode 100644 test-apps/basic-app/app/models/.gitkeep create mode 100644 test-apps/basic-app/app/models/user.js create mode 100644 test-apps/basic-app/app/pods/application/template.hbs create mode 100644 test-apps/basic-app/app/pods/crud-demo-error/template.hbs create mode 100644 test-apps/basic-app/app/pods/crud-demo/controller.js create mode 100644 test-apps/basic-app/app/pods/crud-demo/route.js create mode 100644 test-apps/basic-app/app/pods/crud-demo/template.hbs rename test-apps/basic-app/app/{controllers/application.js => pods/module-count/controller.js} (100%) rename test-apps/basic-app/app/{templates/application.hbs => pods/module-count/template.hbs} (89%) delete mode 100644 test-apps/basic-app/app/routes/.gitkeep delete mode 100644 test-apps/basic-app/app/templates/components/.gitkeep create mode 100644 test-apps/basic-app/mirage/scenarios/default.js create mode 100644 test-apps/basic-app/mirage/serializers/application.js create mode 100644 test-apps/basic-app/tests/acceptance/users-test.js delete mode 100644 tests/acceptance/contact-test.js delete mode 100644 tests/acceptance/contacts-test.js diff --git a/addon/serializer.js b/addon/serializer.js index 48ac55be9..ad6c6417a 100644 --- a/addon/serializer.js +++ b/addon/serializer.js @@ -206,7 +206,7 @@ class Serializer { @property include @public */ - this.include = undefined; + this.include = []; /** Set whether your JSON response should have a root key in it. diff --git a/addon/server.js b/addon/server.js index 6f37fcfcb..c175928f6 100644 --- a/addon/server.js +++ b/addon/server.js @@ -163,7 +163,7 @@ export default class Server { @property db @return Db */ - this.db = undefined; + this.db = this.db || undefined; /** Returns the Mirage Schema (ORM) instance. @@ -171,7 +171,7 @@ export default class Server { @property schema @return Schema */ - this.schema = undefined; + this.schema = this.schema || undefined; } config(config = {}) { @@ -291,7 +291,7 @@ export default class Server { @return {Boolean} @public */ - this.logging = undefined; + this.logging = this.logging || undefined; /** Export a named `testConfig` function to define routes that only apply in your test environment: @@ -309,7 +309,7 @@ export default class Server { This could be useful if you'd like to use Mirage in testing, but generally proxy to an actual API during development. As you develop, your frontend may be ahead of your API, in which case you'd work with the routes in the default config, and write your tests. Then, once your API implements the new endpoints, you can move the routes to your testConfig, so your tests still run, but Mirage doesn't interfere during development. */ - this.testConfig = undefined; + this.testConfig = this.testConfig || undefined; this.trackRequests = config.trackRequests; diff --git a/test-apps/basic-app/app/components/.gitkeep b/test-apps/basic-app/app/components/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/test-apps/basic-app/app/controllers/.gitkeep b/test-apps/basic-app/app/controllers/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/test-apps/basic-app/app/helpers/.gitkeep b/test-apps/basic-app/app/helpers/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/test-apps/basic-app/app/models/.gitkeep b/test-apps/basic-app/app/models/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/test-apps/basic-app/app/models/user.js b/test-apps/basic-app/app/models/user.js new file mode 100644 index 000000000..bd55604ba --- /dev/null +++ b/test-apps/basic-app/app/models/user.js @@ -0,0 +1,13 @@ +// import DS from 'ember-data'; +// +// const { Model, attr } = DS; +import attr from 'ember-data/attr'; +import Model from 'ember-data/model'; + +export default Model.extend({ + + name: attr('string'), + age: attr('number'), + email: attr('string') + +}); diff --git a/test-apps/basic-app/app/pods/application/template.hbs b/test-apps/basic-app/app/pods/application/template.hbs new file mode 100644 index 000000000..b6a8aa972 --- /dev/null +++ b/test-apps/basic-app/app/pods/application/template.hbs @@ -0,0 +1,3 @@ +

    Mirage - test app

    + +{{outlet}} diff --git a/test-apps/basic-app/app/pods/crud-demo-error/template.hbs b/test-apps/basic-app/app/pods/crud-demo-error/template.hbs new file mode 100644 index 000000000..0454883f4 --- /dev/null +++ b/test-apps/basic-app/app/pods/crud-demo-error/template.hbs @@ -0,0 +1,5 @@ +

    WHOOPS

    + +

    + {{model.errors.firstObject}} +

    diff --git a/test-apps/basic-app/app/pods/crud-demo/controller.js b/test-apps/basic-app/app/pods/crud-demo/controller.js new file mode 100644 index 000000000..e87f8af82 --- /dev/null +++ b/test-apps/basic-app/app/pods/crud-demo/controller.js @@ -0,0 +1,29 @@ +import Controller from '@ember/controller'; +import { inject as service } from '@ember/service'; + +export default Controller.extend({ + + store: service(), + + actions: { + createUser() { + let name = this.get('newName'); + + this.get('store') + .createRecord('user', { name }) + .save() + .then(() => { + this.set('newName', ''); + }); + }, + + updateUser(user) { + user.save(); + }, + + deleteUser(user) { + user.destroyRecord(); + } + } + +}); diff --git a/test-apps/basic-app/app/pods/crud-demo/route.js b/test-apps/basic-app/app/pods/crud-demo/route.js new file mode 100644 index 000000000..f67295e61 --- /dev/null +++ b/test-apps/basic-app/app/pods/crud-demo/route.js @@ -0,0 +1,12 @@ +import Route from '@ember/routing/route'; + +export default Route.extend({ + + model() { + return this.store.findAll('user'); + }, + + actions: { + } + +}); diff --git a/test-apps/basic-app/app/pods/crud-demo/template.hbs b/test-apps/basic-app/app/pods/crud-demo/template.hbs new file mode 100644 index 000000000..7e052ef79 --- /dev/null +++ b/test-apps/basic-app/app/pods/crud-demo/template.hbs @@ -0,0 +1,42 @@ +{{#if error}} + +

    + There was an error: {{error}} +

    + +{{else}} + + {{#each model as |user|}} +
    +
    + {{input value=user.name}} + + + + {{#if user.isSaving}} + Saving... + {{else if user.id}} + Saved + {{/if}} + +
    +
    + {{/each}} + +{{/if}} + +
    + +
    +
    +
    + {{input value=newName placeholder='Name'}} +
    + +
    + +
    +
    +
    diff --git a/test-apps/basic-app/app/controllers/application.js b/test-apps/basic-app/app/pods/module-count/controller.js similarity index 100% rename from test-apps/basic-app/app/controllers/application.js rename to test-apps/basic-app/app/pods/module-count/controller.js diff --git a/test-apps/basic-app/app/templates/application.hbs b/test-apps/basic-app/app/pods/module-count/template.hbs similarity index 89% rename from test-apps/basic-app/app/templates/application.hbs rename to test-apps/basic-app/app/pods/module-count/template.hbs index 14ccd024c..719d77ed1 100644 --- a/test-apps/basic-app/app/templates/application.hbs +++ b/test-apps/basic-app/app/pods/module-count/template.hbs @@ -1,5 +1,3 @@ -

    Welcome to Ember

    -

    Environment: diff --git a/test-apps/basic-app/app/router.js b/test-apps/basic-app/app/router.js index d0bb00952..d21c8aad9 100644 --- a/test-apps/basic-app/app/router.js +++ b/test-apps/basic-app/app/router.js @@ -7,6 +7,8 @@ const Router = EmberRouter.extend({ }); Router.map(function() { + this.route('module-count'); + this.route('crud-demo'); }); export default Router; diff --git a/test-apps/basic-app/app/routes/.gitkeep b/test-apps/basic-app/app/routes/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/test-apps/basic-app/app/templates/components/.gitkeep b/test-apps/basic-app/app/templates/components/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/test-apps/basic-app/config/environment.js b/test-apps/basic-app/config/environment.js index 07f245faa..de90a5d26 100644 --- a/test-apps/basic-app/config/environment.js +++ b/test-apps/basic-app/config/environment.js @@ -3,6 +3,7 @@ module.exports = function(environment) { let ENV = { modulePrefix: 'basic-app', + podModulePrefix: 'basic-app/pods', environment, rootURL: '/', locationType: 'auto', diff --git a/test-apps/basic-app/fastboot-tests/included-files-test.js b/test-apps/basic-app/fastboot-tests/included-files-test.js index f4e1a6acf..848e1ba83 100644 --- a/test-apps/basic-app/fastboot-tests/included-files-test.js +++ b/test-apps/basic-app/fastboot-tests/included-files-test.js @@ -23,7 +23,7 @@ qModule('basic-app | fastboot | included files', function(hooks) { resilient: false }); - let page = await fastboot.visit('/'); + let page = await fastboot.visit('/module-count'); let html = await page.html(); assert.equal(findTextFromHtml(html, '[data-test-id="environment"]'), 'development'); @@ -42,7 +42,7 @@ qModule('basic-app | fastboot | included files', function(hooks) { resilient: false }); - let page = await fastboot.visit('/'); + let page = await fastboot.visit('/module-count'); let html = await page.html(); assert.equal(findTextFromHtml(html, '[data-test-id="environment"]'), 'test'); @@ -56,7 +56,7 @@ qModule('basic-app | fastboot | included files', function(hooks) { distPath: 'dist', resilient: false }); - let page = await fastboot.visit('/'); + let page = await fastboot.visit('/module-count'); let html = await page.html(); assert.equal(findTextFromHtml(html, '[data-test-id="environment"]'), 'production'); @@ -75,7 +75,7 @@ qModule('basic-app | fastboot | included files', function(hooks) { distPath: 'dist', resilient: false }); - let page = await fastboot.visit('/'); + let page = await fastboot.visit('/module-count'); let html = await page.html(); assert.equal(findTextFromHtml(html, '[data-test-id="environment"]'), 'production'); diff --git a/test-apps/basic-app/mirage/config.js b/test-apps/basic-app/mirage/config.js index ab35aa45a..daa9f452d 100644 --- a/test-apps/basic-app/mirage/config.js +++ b/test-apps/basic-app/mirage/config.js @@ -1,2 +1,5 @@ export default function() { + + this.resource('user'); + } diff --git a/test-apps/basic-app/mirage/scenarios/default.js b/test-apps/basic-app/mirage/scenarios/default.js new file mode 100644 index 000000000..0cd90b408 --- /dev/null +++ b/test-apps/basic-app/mirage/scenarios/default.js @@ -0,0 +1,7 @@ +export default function(server) { + + server.create('user', { name: 'Yehuda' }); + server.create('user', { name: 'Tom' }); + server.create('user', { name: 'Leah' }); + +} diff --git a/test-apps/basic-app/mirage/serializers/application.js b/test-apps/basic-app/mirage/serializers/application.js new file mode 100644 index 000000000..9ebd0e296 --- /dev/null +++ b/test-apps/basic-app/mirage/serializers/application.js @@ -0,0 +1,3 @@ +import { JSONAPISerializer } from 'ember-cli-mirage'; + +export default JSONAPISerializer; diff --git a/test-apps/basic-app/testem.js b/test-apps/basic-app/testem.js index d1755a4ea..3a29d4059 100644 --- a/test-apps/basic-app/testem.js +++ b/test-apps/basic-app/testem.js @@ -5,7 +5,6 @@ module.exports = { 'Chrome' ], launch_in_dev: [ - 'Chrome' ], browser_args: { Chrome: { diff --git a/test-apps/basic-app/tests/acceptance/users-test.js b/test-apps/basic-app/tests/acceptance/users-test.js new file mode 100644 index 000000000..6d588e094 --- /dev/null +++ b/test-apps/basic-app/tests/acceptance/users-test.js @@ -0,0 +1,67 @@ +import { test } from 'qunit'; +import moduleForAcceptance from 'basic-app/tests/helpers/module-for-acceptance'; + +moduleForAcceptance('Acceptance | Crud demo'); + +test('I can view the users', function(assert) { + server.createList('user', 3); + + visit('/crud-demo'); + + andThen(function() { + assert.equal(find('[data-test-id="user"]').length, 3); + }); +}); + +test('I can create a new user', function(assert) { + server.create('user', 1); + + visit('/crud-demo'); + fillIn('input', 'Ganon'); + click('button:contains(Create)'); + + andThen(function() { + assert.equal(find('[data-test-id="user"]').length, 2); + assert.ok(server.db.users.length, 2); + }); +}); + +test('I can update a user', function(assert) { + let user = server.create('user', { name: 'Yehuda' }); + + visit('/crud-demo'); + fillIn('[data-test-id="user"] input', 'Katz'); + click('button:contains(Save)'); + + andThen(function() { + user.reload(); + + assert.equal(find('[data-test-id="user"] input').val(), 'Katz'); + assert.ok(user.name, 'Katz'); + }); +}); + +test('I can delete a user', function(assert) { + server.create('user', { name: 'Yehuda' }); + + visit('/crud-demo'); + click('button:contains(Delete)'); + + andThen(function() { + assert.equal(find('[data-test-id="user"]').length, 0); + assert.equal(server.db.users.length, 0); + }); +}); + +test('If the server errors on GET /users, the error template shows', function(assert) { + server.get('/users', { + errors: [ 'improper auth' ] + }, 404); + + visit('/crud-demo'); + + andThen(function() { + assert.ok(find(':contains(improper auth)').length); + assert.equal(currentRouteName(), 'crud-demo_error'); + }); +}); diff --git a/tests/acceptance/contact-test.js b/tests/acceptance/contact-test.js deleted file mode 100644 index ded258ee5..000000000 --- a/tests/acceptance/contact-test.js +++ /dev/null @@ -1,29 +0,0 @@ -import {test} from 'qunit'; -import moduleForAcceptance from '../helpers/module-for-acceptance'; - -let contact; - -moduleForAcceptance('Acceptance | Contact', { - beforeEach() { - contact = server.create('contact'); - } -}); - -test('I can view a contact', function(assert) { - visit(`${contact.id}`); - - andThen(function() { - assert.equal(currentRouteName(), 'contact'); - assert.equal(find('p:first').text(), `The contact is ${contact.name}`); - }); -}); - -test('I can delete a contact', function(assert) { - visit(`${contact.id}`); - click('button:contains(Delete)'); - - andThen(function() { - assert.equal(currentRouteName(), 'contacts'); - assert.equal(find('p').length, 0); - }); -}); diff --git a/tests/acceptance/contacts-test.js b/tests/acceptance/contacts-test.js deleted file mode 100644 index abf303288..000000000 --- a/tests/acceptance/contacts-test.js +++ /dev/null @@ -1,44 +0,0 @@ -import {test} from 'qunit'; -import moduleForAcceptance from '../helpers/module-for-acceptance'; - -let contacts; - -moduleForAcceptance('Acceptance | Contacts', { - beforeEach() { - contacts = server.createList('contact', 2); - } -}); - -test('I can view the contacts', function(assert) { - visit('/'); - - andThen(function() { - assert.equal(currentRouteName(), 'contacts'); - assert.equal(find('p').length, 2); - assert.equal(find('p:first').text(), contacts[0].name); - }); -}); - -test('I can create a new contact', function(assert) { - visit('/'); - fillIn('input', 'Ganon'); - click('button:contains(Create)'); - - andThen(function() { - assert.equal(currentRouteName(), 'contacts'); - assert.equal(find('p').length, 3); - assert.equal(find('p:last').text(), 'Ganon'); - }); -}); - -test('If the server errors on /contacts, the first error message should show', function(assert) { - server.get('/contacts', { - errors: ['improper auth'] - }, 404); - - visit('/'); - - andThen(function() { - assert.equal(find('.error span').text(), 'improper auth'); - }); -}); From 7db2732f30c4f42e2b15b1dcfc54e7e0769e1242 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 14 Nov 2018 15:24:30 -0500 Subject: [PATCH 237/879] Integration tests passing again --- addon/serializer.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/addon/serializer.js b/addon/serializer.js index ad6c6417a..dda2616ae 100644 --- a/addon/serializer.js +++ b/addon/serializer.js @@ -115,7 +115,7 @@ class Serializer { @property attrs @public */ - this.attrs = undefined; + this.attrs = this.attrs || undefined; // this is just here so I can add the doc comment. Better way? /** Use this property on a model serializer to specify related models you'd like to include in your JSON payload. (These can be considered default server-side includes.) @@ -206,7 +206,7 @@ class Serializer { @property include @public */ - this.include = []; + this.include = this.include || []; // this is just here so I can add the doc comment. Better way? /** Set whether your JSON response should have a root key in it. @@ -249,7 +249,7 @@ class Serializer { @property root @public */ - this.root = undefined; + this.root = this.root || undefined; // this is just here so I can add the doc comment. Better way? /** Set whether related models should be embedded or sideloaded. @@ -300,7 +300,7 @@ class Serializer { } ``` */ - this.embed = undefined; + this.embed = this.embed || undefined; // this is just here so I can add the doc comment. Better way? /** Use this to define how your serializer handles serializing relationship keys. It can take one of three values: @@ -314,7 +314,7 @@ class Serializer { @property serializeIds @public */ - this.serializeIds = undefined; + this.serializeIds = this.serializeIds || undefined; // this is just here so I can add the doc comment. Better way? } /** @@ -943,6 +943,7 @@ class Serializer { @param model */ links(model) { + return {}; } /** From 8b297974aa4af6b313a374716c623cc549888eec Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 14 Nov 2018 15:58:48 -0500 Subject: [PATCH 238/879] Cleaning up old acceptance tests --- tests/acceptance/custom-handlers-test.js | 68 --------------- tests/acceptance/edit-test.js | 18 ---- .../route-handlers/function-handler-test.js | 87 +++++++++++++++++-- 3 files changed, 78 insertions(+), 95 deletions(-) delete mode 100644 tests/acceptance/custom-handlers-test.js delete mode 100644 tests/acceptance/edit-test.js diff --git a/tests/acceptance/custom-handlers-test.js b/tests/acceptance/custom-handlers-test.js deleted file mode 100644 index c736f0950..000000000 --- a/tests/acceptance/custom-handlers-test.js +++ /dev/null @@ -1,68 +0,0 @@ -import $ from 'jquery'; -import moduleForAcceptance from '../helpers/module-for-acceptance'; -import { test } from 'qunit'; - -const { ajax } = $; - -let appStore, rex; - -moduleForAcceptance('Acceptance | Custom handlers', { - beforeEach() { - appStore = this.application.__container__.lookup('service:store'); - rex = server.create('pet', { name: 'Rex', alive: true }); - server.create('pet', { name: 'Toby', alive: false }); - server.create('pet', { name: 'Sam', alive: false }); - server.create('pet', { name: 'Andy', alive: true }); - } -}); - -test('You can customize the response by passing a handler function that returns the desired body', function(assert) { - let done = assert.async(); - appStore.findAll('pet').then(function(pets) { - assert.deepEqual(pets.mapBy('name'), ['Rex', 'Andy']); - }).finally(done); -}); - -test('You can customize the response code of a custom handler passing the code as 3rd argument', function(assert) { - let done = assert.async(); - let request = ajax({ - url: `/api/pets/${rex.id}`, - method: 'delete' - }); - - request.then(function(response, statusText, jqXHR) { - assert.equal(jqXHR.status, 200, 'The status code is 200 instead od 204'); - done(); - }); -}); - -test('You can can programatically returns a tailored response by returning a Mirage.Response', function(assert) { - let done = assert.async(); - let request = ajax({ - url: '/api/pets', - method: 'post', - data: JSON.stringify({ pet: { alive: true } }) - }); - - request.then(function() { /* noop */ }, function(response) { - assert.equal(response.status, 422, 'The status code is 422'); - assert.equal(response.responseText, '{"errors":{"name":["can\'t be blank"]}}', 'The response body is correct'); - assert.equal(response.getResponseHeader('some'), 'header', 'The response contains the custom header'); - done(); - }); -}); - -test('returning a non-blank response from a custom handler whose default status is 204 changes the status to 200', function(assert) { - let done = assert.async(); - let request = ajax({ - url: `/api/pets/${rex.id}`, - method: 'put', - data: JSON.stringify({ pet: { id: rex.id, name: 'The Rex', alive: true } }) - }); - - request.then(function(response, statusText, jqXHR) { - assert.equal(jqXHR.status, 200, 'The status code is 200 instead of 204'); - assert.deepEqual(response, { id: '1', name: 'The Rex', alive: true }, 'The response is correct'); - done(); - }); -}); diff --git a/tests/acceptance/edit-test.js b/tests/acceptance/edit-test.js deleted file mode 100644 index bfbf7885c..000000000 --- a/tests/acceptance/edit-test.js +++ /dev/null @@ -1,18 +0,0 @@ -import {test} from 'qunit'; -import moduleForAcceptance from '../helpers/module-for-acceptance'; - -moduleForAcceptance('Acceptance | Edit'); - -test('I can edit a contact', function(assert) { - let contact = server.create('contact'); - - visit(`/${contact.id}`); - click('button:contains(Edit)'); - fillIn('input', 'Shiek'); - click('button:contains(Save)'); - - andThen(function() { - assert.equal(currentRouteName(), 'contact'); - assert.equal(find('p:first').text(), 'The contact is Shiek'); - }); -}); diff --git a/tests/integration/route-handlers/function-handler-test.js b/tests/integration/route-handlers/function-handler-test.js index 661e03f3d..dbfa36a33 100644 --- a/tests/integration/route-handlers/function-handler-test.js +++ b/tests/integration/route-handlers/function-handler-test.js @@ -1,5 +1,7 @@ import { module, test } from 'qunit'; import { Promise } from 'rsvp'; +import $ from 'jquery'; +const { ajax } = $; import { Model, Collection, Serializer } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; @@ -105,11 +107,67 @@ module('Integration | Route handlers | Function handler', function(hooks) { assert.equal(data, ''); }); - test('#serialize uses the default serializer on a model', function(assert) { + test('function can customize the reponse code via the 3rd argument', async function(assert) { + assert.expect(1); + this.schema.users.create({ name: 'Sam' }); + + this.server.get('/users/1', schema => { + return schema.users.first(); + }, 304); + + let request = await promiseAjax({ method: 'GET', url: '/users/1' }); + assert.equal(request.xhr.status, 304); + }); + + test('function can return an instance of Response', async function(assert) { + let done = assert.async(); + assert.expect(2); + + this.server.get('/users', schema => { + return new Response(422, { some: 'header' }, { some: 'data' }); + }); + + try { + await ajax({ url: '/users' }); + } catch(request) { + assert.equal(request.status, 422); + assert.deepEqual(request.responseJSON, { some: 'data' }); + } finally { + done(); + } + }); + + test('returning a non-blank response from a custom handler whose default status is 204 changes the status to 200', async function(assert) { + let done = assert.async(); + assert.expect(2); + + this.server.put('/users', () => { + return { some: 'data' }; + }); + + try { + let request = await promiseAjax({ + url: `/users`, + method: 'PUT', + data: JSON.stringify({ request: 'data' }) + }); + + assert.equal(request.xhr.status, 200, 'The status code is 200 instead of 204'); + assert.deepEqual(request.data, { some: 'data' }, 'The response is correct'); + } finally { + done(); + } + }); + + test('#serialize uses the default serializer on a model', async function(assert) { + let done = assert.async(); this.schema.users.create({ name: 'Sam' }); - let user = this.schema.users.first(); - let json = this.functionHandler.serialize(user); + this.server.get('/some-request', function(schema) { + return this.serialize(schema.users.first()); + }); + + let json = await ajax({ url: '/some-request' }); assert.deepEqual(json, { user: { @@ -117,27 +175,37 @@ module('Integration | Route handlers | Function handler', function(hooks) { name: 'Sam' } }); + done(); }); - test('#serialize uses the default serializer on a collection', function(assert) { + test('#serialize uses the default serializer on a collection', async function(assert) { + let done = assert.async(); this.schema.users.create({ name: 'Sam' }); - let users = this.schema.users.all(); - let json = this.functionHandler.serialize(users); + this.server.get('/some-request', function(schema) { + return this.serialize(schema.users.all()); + }); + + let json = await ajax({ url: '/some-request' }); assert.deepEqual(json, { users: [ { id: '1', name: 'Sam' } ] }); + done(); }); - test('#serialize takes an optional serializer type', function(assert) { + test('#serialize takes an optional serializer type', async function(assert) { + let done = assert.async(); this.schema.users.create({ name: 'Sam', tall: true, evil: false }); this.schema.users.create({ name: 'Ganondorf', tall: true, evil: true }); - let users = this.schema.users.all(); - let json = this.functionHandler.serialize(users, 'sparse-user'); + this.server.get('/some-request', function(schema) { + return this.serialize(schema.users.all(), 'sparse-user'); + }); + + let json = await ajax({ url: '/some-request' }); assert.deepEqual(json, { users: [ @@ -145,6 +213,7 @@ module('Integration | Route handlers | Function handler', function(hooks) { { id: '2', name: 'Ganondorf', tall: true } ] }); + done(); }); test('#serialize throws an error when trying to specify a serializer that doesnt exist', function(assert) { From bb9e115d1b896603fa4f7f10a88fd4239d741b35 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 14 Nov 2018 16:32:57 -0500 Subject: [PATCH 239/879] Move request tracking test to test-app --- .../tests/acceptance/request-tracking-test.js | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) rename tests/acceptance/enable-request-tracking-test.js => test-apps/basic-app/tests/acceptance/request-tracking-test.js (84%) diff --git a/tests/acceptance/enable-request-tracking-test.js b/test-apps/basic-app/tests/acceptance/request-tracking-test.js similarity index 84% rename from tests/acceptance/enable-request-tracking-test.js rename to test-apps/basic-app/tests/acceptance/request-tracking-test.js index 67727ed82..d245eaf7d 100644 --- a/tests/acceptance/enable-request-tracking-test.js +++ b/test-apps/basic-app/tests/acceptance/request-tracking-test.js @@ -1,12 +1,12 @@ import { run } from '@ember/runloop'; import {module, test} from 'qunit'; import startApp from '../helpers/start-app'; -import ENV from 'dummy/config/environment'; +import ENV from 'basic-app/config/environment'; import promiseAjax from '../helpers/promise-ajax'; let App; -module('Acceptance: Enabling request tracking', { +module('Acceptance | Enabling request tracking', { afterEach() { server.shutdown(); run(App, 'destroy'); @@ -17,10 +17,9 @@ module('Acceptance: Enabling request tracking', { test('Request tracking defaults to false', async function(assert) { App = startApp(); - server.get('/contacts'); await promiseAjax({ method: 'GET', - url: '/api/contacts' + url: '/users' }); assert.equal(server.pretender.handledRequests.length, 0, 'request tracking should be false by default'); @@ -30,10 +29,9 @@ test('Request tracking treats undefined config as false', async function(assert) ENV['ember-cli-mirage'] = { trackRequests: undefined }; App = startApp(); - server.get('/contacts'); await promiseAjax({ method: 'GET', - url: '/api/contacts' + url: '/users' }); assert.equal(server.pretender.handledRequests.length, 0, 'request tracking should be false when undefined in config'); @@ -43,10 +41,9 @@ test('Request tracking can be set to true in config', async function(assert) { ENV['ember-cli-mirage'] = { trackRequests: true }; App = startApp(); - server.get('/contacts'); await promiseAjax({ method: 'GET', - url: '/api/contacts' + url: '/users' }); assert.equal(server.pretender.handledRequests.length, 1, 'request tracking can be turned on in config and track requests'); From e89a9e6edda5d3cff72b3ab99673b7f3e106bdff Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 14 Nov 2018 16:48:18 -0500 Subject: [PATCH 240/879] Moving more tests to basic-app --- test-apps/basic-app/app/models/book.js | 5 ++ test-apps/basic-app/app/models/user.js | 3 - test-apps/basic-app/mirage/factories/user.js | 4 ++ .../basic-app/mirage/fixtures/countries.js | 3 + test-apps/basic-app/mirage/fixtures/users.js | 5 ++ .../mirage/identity-managers/book.js | 57 +++++++++++++++++++ .../{users-test.js => crud-demo-test.js} | 0 .../tests/acceptance/fixtures-test.js | 20 +++++++ .../tests/acceptance/identity-manager-test.js | 10 ++++ tests/acceptance/fixtures-test.js | 37 ------------ tests/acceptance/friends-test.js | 52 ----------------- tests/acceptance/identity-manager-test.js | 9 --- 12 files changed, 104 insertions(+), 101 deletions(-) create mode 100644 test-apps/basic-app/app/models/book.js create mode 100644 test-apps/basic-app/mirage/factories/user.js create mode 100644 test-apps/basic-app/mirage/fixtures/countries.js create mode 100644 test-apps/basic-app/mirage/fixtures/users.js create mode 100644 test-apps/basic-app/mirage/identity-managers/book.js rename test-apps/basic-app/tests/acceptance/{users-test.js => crud-demo-test.js} (100%) create mode 100644 test-apps/basic-app/tests/acceptance/fixtures-test.js create mode 100644 test-apps/basic-app/tests/acceptance/identity-manager-test.js delete mode 100644 tests/acceptance/fixtures-test.js delete mode 100644 tests/acceptance/friends-test.js delete mode 100644 tests/acceptance/identity-manager-test.js diff --git a/test-apps/basic-app/app/models/book.js b/test-apps/basic-app/app/models/book.js new file mode 100644 index 000000000..8aae571f3 --- /dev/null +++ b/test-apps/basic-app/app/models/book.js @@ -0,0 +1,5 @@ +import Model from 'ember-data/model'; + +export default Model.extend({ + +}); diff --git a/test-apps/basic-app/app/models/user.js b/test-apps/basic-app/app/models/user.js index bd55604ba..7e1af21ae 100644 --- a/test-apps/basic-app/app/models/user.js +++ b/test-apps/basic-app/app/models/user.js @@ -1,6 +1,3 @@ -// import DS from 'ember-data'; -// -// const { Model, attr } = DS; import attr from 'ember-data/attr'; import Model from 'ember-data/model'; diff --git a/test-apps/basic-app/mirage/factories/user.js b/test-apps/basic-app/mirage/factories/user.js new file mode 100644 index 000000000..85018979d --- /dev/null +++ b/test-apps/basic-app/mirage/factories/user.js @@ -0,0 +1,4 @@ +import { Factory } from 'ember-cli-mirage'; + +export default Factory.extend({ +}); diff --git a/test-apps/basic-app/mirage/fixtures/countries.js b/test-apps/basic-app/mirage/fixtures/countries.js new file mode 100644 index 000000000..f9b995d1a --- /dev/null +++ b/test-apps/basic-app/mirage/fixtures/countries.js @@ -0,0 +1,3 @@ +export default [ + { name: 'United State' } +]; diff --git a/test-apps/basic-app/mirage/fixtures/users.js b/test-apps/basic-app/mirage/fixtures/users.js new file mode 100644 index 000000000..0148a57fa --- /dev/null +++ b/test-apps/basic-app/mirage/fixtures/users.js @@ -0,0 +1,5 @@ +export default [ + + { id: 1, name: 'Sam' } + +]; diff --git a/test-apps/basic-app/mirage/identity-managers/book.js b/test-apps/basic-app/mirage/identity-managers/book.js new file mode 100644 index 000000000..76f1564ad --- /dev/null +++ b/test-apps/basic-app/mirage/identity-managers/book.js @@ -0,0 +1,57 @@ +export default class { + constructor() { + this.reset(); + } + + /** + * Returns an unique identifier. + * + * @method fetch + * @return {String} Unique identifier + * @public + */ + fetch() { + let alphabet = 'abcdefghijklmnopqrstuvwxyz'; + let id; + + if (this._nextId >= alphabet.length) { + throw new Error(`IdentityManager used for testing only supports ${alphabet.length} ids.`); + } + id = alphabet[this._nextId % alphabet.length]; + this._ids[id] = true; + this._nextId = this._nextid + 1; + return id; + } + + /** + * Register an identifier. + * Must throw if identifier is already used. + * + * @method set + * @param {String|Number} id + * @public + */ + set(id) { + if (typeof this._ids[id] !== 'undefined') { + throw new Error(`Id {id} is already used.`); + } + + this._ids[id] = true; + + let int = parseInt(id, 16); + if (!isNaN(int) && int > this._nextid) { + this._nextId = int; + } + } + + /** + * Reset identity manager. + * + * @method reset + * @public + */ + reset() { + this._nextId = 0; + this._ids = {}; + } +} diff --git a/test-apps/basic-app/tests/acceptance/users-test.js b/test-apps/basic-app/tests/acceptance/crud-demo-test.js similarity index 100% rename from test-apps/basic-app/tests/acceptance/users-test.js rename to test-apps/basic-app/tests/acceptance/crud-demo-test.js diff --git a/test-apps/basic-app/tests/acceptance/fixtures-test.js b/test-apps/basic-app/tests/acceptance/fixtures-test.js new file mode 100644 index 000000000..5cb5a111b --- /dev/null +++ b/test-apps/basic-app/tests/acceptance/fixtures-test.js @@ -0,0 +1,20 @@ +import moduleForAcceptance from '../helpers/module-for-acceptance'; +import { test } from 'qunit'; + +moduleForAcceptance('Acceptance | Fixtures'); + +test('I can use fixtures', async function(assert) { + server.loadFixtures(); + + await visit('/crud-demo'); + + assert.equal(find('[data-test-id="user"]').length, 1); +}); + +test('I can use fixtures with the filename api', async function(assert) { + server.loadFixtures('countries'); + + await visit('/crud-demo'); + + assert.equal(find('[data-test-id="user"]').length, 0); +}); diff --git a/test-apps/basic-app/tests/acceptance/identity-manager-test.js b/test-apps/basic-app/tests/acceptance/identity-manager-test.js new file mode 100644 index 000000000..f05004f59 --- /dev/null +++ b/test-apps/basic-app/tests/acceptance/identity-manager-test.js @@ -0,0 +1,10 @@ +import { test } from 'qunit'; +import moduleForAcceptance from '../../tests/helpers/module-for-acceptance'; + +moduleForAcceptance('Acceptance | Identity manager'); + +test('custom identity managers work', function(assert) { + let book = server.create('book'); + + assert.equal(book.id, 'a'); +}); diff --git a/tests/acceptance/fixtures-test.js b/tests/acceptance/fixtures-test.js deleted file mode 100644 index a5be14c68..000000000 --- a/tests/acceptance/fixtures-test.js +++ /dev/null @@ -1,37 +0,0 @@ -import moduleForAcceptance from '../helpers/module-for-acceptance'; -import { test } from 'qunit'; - -moduleForAcceptance('Acceptance | Fixtures', { - beforeEach() { - this.store = this.application.__container__.lookup('service:store'); - } -}); - -test('I can use fixtures', function(assert) { - server.loadFixtures(); - - visit(`/word-smiths/1`); - - andThen(() => { - let wordSmithsInStore = this.store.peekAll('word-smith'); - let blogPostsInStore = this.store.peekAll('blog-post'); - - assert.equal(wordSmithsInStore.get('length'), 1); - assert.equal(blogPostsInStore.get('length'), 3); - }); -}); - -test('I can use fixtures with the filename api', function(assert) { - server.loadFixtures('word-smiths', 'blog-posts'); - - visit(`/word-smiths/1`); - - andThen(() => { - let wordSmithsInStore = this.store.peekAll('word-smith'); - let blogPostsInStore = this.store.peekAll('blog-post'); - - assert.equal(wordSmithsInStore.get('length'), 1); - assert.equal(blogPostsInStore.get('length'), 3); - }); -}); - diff --git a/tests/acceptance/friends-test.js b/tests/acceptance/friends-test.js deleted file mode 100644 index a7080c69c..000000000 --- a/tests/acceptance/friends-test.js +++ /dev/null @@ -1,52 +0,0 @@ -import {test} from 'qunit'; -import moduleForAcceptance from '../helpers/module-for-acceptance'; - -moduleForAcceptance('Acceptance | Friends'); - -test('I can view the friends', function(assert) { - let friend = server.create('friend'); - let youngFriend = server.create('friend', { name: 'Tommy', age: 10 }); - - visit('/friends'); - - andThen(function() { - assert.equal(currentRouteName(), 'friends'); - assert.equal(find('p').length, 2); - assert.equal(friend.isYoung, false); - assert.equal(youngFriend.isYoung, true); - - assert.ok(find('p:first').text().match(friend.name)); - assert.ok(find('p:first').text().match(friend.age)); - assert.ok(find('p:last').text().match('Tommy')); - assert.ok(find('p:last').text().match(10)); - }); -}); - -test('I can view the selected friends', function(assert) { - server.create('friend', { name: 'Jane', age: 30 }); - server.create('friend', { name: 'Tommy', age: 10 }); - server.create('friend', { name: 'Bob', age: 28 }); - - visit('/close-friends'); - - andThen(function() { - assert.equal(currentRouteName(), 'close-friends'); - assert.equal(find('p').length, 2); - - assert.ok(find('p:first').text().match('Jane')); - assert.ok(find('p:first').text().match(30)); - assert.ok(find('p:last').text().match('Bob')); - assert.ok(find('p:last').text().match(28)); - }); -}); - -test('I can view a friend that was configured only for test mode', function(assert) { - let friend = server.create('friend', { name: 'The Dude' }); - - visit(`/friends/${friend.id}`); - - andThen(function() { - assert.equal(currentRouteName(), 'friend'); - assert.ok(find('h2.friend-name').text().match('The Dude')); - }); -}); diff --git a/tests/acceptance/identity-manager-test.js b/tests/acceptance/identity-manager-test.js deleted file mode 100644 index 2070bb4af..000000000 --- a/tests/acceptance/identity-manager-test.js +++ /dev/null @@ -1,9 +0,0 @@ -import { test } from 'qunit'; -import moduleForAcceptance from '../../tests/helpers/module-for-acceptance'; - -moduleForAcceptance('Acceptance | identity manager'); - -test('uses custom identity manager', function(assert) { - let author = server.create('author'); - assert.equal(author.id, 'a'); -}); From 7bf76cd3d4a678a3c1187ee18ea160f7f933dbd6 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 14 Nov 2018 16:53:31 -0500 Subject: [PATCH 241/879] Move legacy start mirage test --- test-apps/basic-app/package.json | 3 +- .../acceptance/legacy-start-mirage-test.js | 59 + yarn.lock | 1563 +++++++++++++++++ 3 files changed, 1624 insertions(+), 1 deletion(-) create mode 100644 test-apps/basic-app/tests/acceptance/legacy-start-mirage-test.js diff --git a/test-apps/basic-app/package.json b/test-apps/basic-app/package.json index 8a3d2afb3..1f7884612 100644 --- a/test-apps/basic-app/package.json +++ b/test-apps/basic-app/package.json @@ -42,7 +42,8 @@ "fastboot": "*", "jsdom": "*", "loader.js": "*", - "qunit": "*" + "qunit": "*", + "qunit-dom": "*" }, "engines": { "node": ">= 8.*" diff --git a/test-apps/basic-app/tests/acceptance/legacy-start-mirage-test.js b/test-apps/basic-app/tests/acceptance/legacy-start-mirage-test.js new file mode 100644 index 000000000..5f6152c16 --- /dev/null +++ b/test-apps/basic-app/tests/acceptance/legacy-start-mirage-test.js @@ -0,0 +1,59 @@ +import {module, test} from 'qunit'; +import startApp from '../helpers/start-app'; +import destroyApp from '../helpers/destroy-app'; +import { startMirage } from 'basic-app/initializers/ember-cli-mirage'; +import ENV from 'basic-app/config/environment'; + +module('Acceptance | Starting mirage (legacy)', function(hooks) { + let app, oldEnv, addonConfig; + + hooks.beforeEach(function() { + oldEnv = ENV['ember-cli-mirage']; + ENV['ember-cli-mirage'] = addonConfig = {}; + }); + + hooks.afterEach(function() { + destroyApp(app); + ENV['ember-cli-mirage'] = oldEnv; + }); + + test('The server starts automatically when configured with enabled undefined', async function(assert) { + app = startApp(); + + assert.ok(window.server, 'There is a server after starting'); + + window.server.create('user'); + await window.visit('/crud-demo'); + + assert.equal(window.currentRouteName(), 'crud-demo'); + assert.dom('[data-test-id="user"]').exists(); + }); + + test('The server starts automatically when configured with { enabled: true }', async function(assert) { + addonConfig.enabled = true; + app = startApp(); + + assert.ok(window.server, 'There is a server after starting'); + + window.server.create('user'); + await window.visit('/crud-demo'); + + assert.equal(window.currentRouteName(), 'crud-demo'); + assert.dom('[data-test-id="user"]').exists(); + }); + + test('The server can be started manually when configured with { enabled: false }', async function(assert) { + addonConfig.enabled = false; + app = startApp(); + + assert.equal(window.server, undefined, 'There is no server at first'); + startMirage(); + assert.ok(window.server, 'There is a server after starting'); + + window.server.create('user'); + await window.visit('/crud-demo'); + + assert.equal(window.currentRouteName(), 'crud-demo'); + assert.dom('[data-test-id="user"]').exists(); + }); +}); diff --git a/yarn.lock b/yarn.lock index cd6ff47a6..347f92014 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,12 +5,14 @@ "@babel/code-frame@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" + integrity sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g== dependencies: "@babel/highlight" "7.0.0-beta.44" "@babel/generator@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" + integrity sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ== dependencies: "@babel/types" "7.0.0-beta.44" jsesc "^2.5.1" @@ -21,6 +23,7 @@ "@babel/helper-function-name@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" + integrity sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg== dependencies: "@babel/helper-get-function-arity" "7.0.0-beta.44" "@babel/template" "7.0.0-beta.44" @@ -29,18 +32,21 @@ "@babel/helper-get-function-arity@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" + integrity sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw== dependencies: "@babel/types" "7.0.0-beta.44" "@babel/helper-split-export-declaration@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" + integrity sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA== dependencies: "@babel/types" "7.0.0-beta.44" "@babel/highlight@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" + integrity sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ== dependencies: chalk "^2.0.0" esutils "^2.0.2" @@ -49,6 +55,7 @@ "@babel/template@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" + integrity sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng== dependencies: "@babel/code-frame" "7.0.0-beta.44" "@babel/types" "7.0.0-beta.44" @@ -58,6 +65,7 @@ "@babel/traverse@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" + integrity sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA== dependencies: "@babel/code-frame" "7.0.0-beta.44" "@babel/generator" "7.0.0-beta.44" @@ -73,6 +81,7 @@ "@babel/types@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" + integrity sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ== dependencies: esutils "^2.0.2" lodash "^4.2.0" @@ -81,6 +90,7 @@ "@ember/ordered-set@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@ember/ordered-set/-/ordered-set-2.0.0.tgz#54f34aba3a1fb75b7c2912a39ab41a4a2e9d266d" + integrity sha512-DeEINHAJ9JGyrjpRcRh7V7hsdmfmidQsFt4ZxcUywytXm48zPUNKJQ2f5PygjPcqg880PUwqYH2+1YXHtokLyA== dependencies: ember-cli-babel "^6.16.0" ember-compatibility-helpers "^1.0.0" @@ -88,6 +98,7 @@ "@ember/test-helpers@^0.7.17": version "0.7.17" resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-0.7.17.tgz#17ff5f1d005d8b6331585e99013d66626a8d8068" + integrity sha512-pLz4FV8IGty+9CEGttEl6clLiQkap4w7T0So8lbCb4XO38OxGfjhfz8uKpI+UH6fgaTeboh8myixqOdfXvklfA== dependencies: broccoli-funnel "^2.0.1" ember-cli-babel "^6.10.0" @@ -96,22 +107,26 @@ "@glimmer/di@^0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@glimmer/di/-/di-0.2.0.tgz#73bfd4a6ee4148a80bf092e8a5d29bcac9d4ce7e" + integrity sha1-c7/Upu5BSKgL8JLopdKbysnUzn4= "@glimmer/interfaces@^0.30.5": version "0.30.5" resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.30.5.tgz#9fd391ff4b9e4b29cf56495a2c3f5f660e45497a" + integrity sha512-jdpGwuWydGMIdDkVpuwhJhH2LWBQpAnau+8u53esLw03W8XJlgLIC6nuugSHvlJzw7M5msVuBP9vbKi+NceqIg== dependencies: "@glimmer/wire-format" "^0.30.5" "@glimmer/resolver@^0.4.1": version "0.4.2" resolved "https://registry.yarnpkg.com/@glimmer/resolver/-/resolver-0.4.2.tgz#60c9b492e90bc3956ac82b3134649bd337e1651c" + integrity sha512-OYOSn2qKPMWRTrInu4W7Ilx2q4+mFfeKS8o8SCWdGN6q/9LnRUvN3vfiAEEfpgoMSvEr8TSGw6/b2WSLWoYAAA== dependencies: "@glimmer/di" "^0.2.0" "@glimmer/syntax@^0.30.5": version "0.30.5" resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.30.5.tgz#763a631fccdb5ee2468269becd215752fc2361cc" + integrity sha512-AVaYO8AfsbZ7UVwtyaIaSoCMcRtM94O+98JrP8abcVnNhbnDYunKiptMAQOMsSCJMO7wEbKCeVHDsRVbcKG7fQ== dependencies: "@glimmer/interfaces" "^0.30.5" "@glimmer/util" "^0.30.5" @@ -121,50 +136,61 @@ "@glimmer/util@^0.30.5": version "0.30.5" resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.30.5.tgz#97f3dcd4029f713c503371e1608e129a833a70e1" + integrity sha512-hknvHrof+tq7Gj4C4Xbs/GBuqbf68d5hRfqyHk6zBWMYBiCyr5dRS48/kPiNEdclm3eZGbbl1L+eoj0ioz9GiA== "@glimmer/wire-format@^0.30.5": version "0.30.5" resolved "https://registry.yarnpkg.com/@glimmer/wire-format/-/wire-format-0.30.5.tgz#17d79a320b931950ac03887733e56ecc7bbd0a06" + integrity sha512-bnMQtgla2ae0sx4DAvK57qPwCuJ71bWpM0hBY42BSgs1KTW08IHBNeGhWX2ClK3lUP+XhabWGyQ9xi/diQ06tQ== dependencies: "@glimmer/util" "^0.30.5" "@types/acorn@^4.0.3": version "4.0.3" resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.3.tgz#d1f3e738dde52536f9aad3d3380d14e448820afd" + integrity sha512-gou/kWQkGPMZjdCKNZGDpqxLm9+ErG/pFZKPX4tvCjr0Xf4FCYYX3nAsu7aDVKJV3KUe27+mvqqyWT/9VZoM/A== dependencies: "@types/estree" "*" "@types/estree@*": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/estree@0.0.38": version "0.0.38" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.38.tgz#c1be40aa933723c608820a99a373a16d215a1ca2" + integrity sha512-F/v7t1LwS4vnXuPooJQGBRKRGIoxWUTmA4VHfqjOccFsNDThD5bfUNpITive6s352O7o384wcpEaDV8rHCehDA== "@types/node@^9.6.0": version "9.6.28" resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.28.tgz#198927ce0786106ec2a7c8652d46d5f8b87bfc5f" + integrity sha512-LMSOxMKNJ8tGqUVs8lSIT8RGo1XGWYada/ZU2QZcbcD6AW9futXDE99tfQA0K6DK60GXcwplsGGK5KABRmI5GA== abab@^1.0.0, abab@^1.0.3, abab@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" + integrity sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4= abab@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" + integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== abortcontroller-polyfill@^1.1.9: version "1.1.9" resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.1.9.tgz#9fefe359fda2e9e0932dc85e6106453ac393b2da" + integrity sha512-omvG7zOHIs3BphdH62Kh3xy8nlftAsTyp7PDa9EmC3Jz9pa6sZFYk7UhNgu9Y4sIBhj6jF0RgeFZYvPnsP5sBw== accepts@1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + integrity sha1-w8p0NJOGSMPg2cHjKN1otiLChMo= dependencies: mime-types "~2.1.11" negotiator "0.6.1" @@ -172,6 +198,7 @@ accepts@1.3.3: accepts@~1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" + integrity sha1-hiRnWMfdbSGmR0/whKR0DsBesh8= dependencies: mime-types "~2.1.16" negotiator "0.6.1" @@ -179,6 +206,7 @@ accepts@~1.3.4: accepts@~1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= dependencies: mime-types "~2.1.18" negotiator "0.6.1" @@ -186,60 +214,72 @@ accepts@~1.3.5: acorn-dynamic-import@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" + integrity sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg== dependencies: acorn "^5.0.0" acorn-globals@^1.0.4: version "1.0.9" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-1.0.9.tgz#55bb5e98691507b74579d0513413217c380c54cf" + integrity sha1-VbtemGkVB7dFedBRNBMhfDgMVM8= dependencies: acorn "^2.1.0" acorn-globals@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" + integrity sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8= dependencies: acorn "^4.0.4" acorn-globals@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" + integrity sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ== dependencies: acorn "^5.0.0" acorn-jsx@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= dependencies: acorn "^3.0.4" acorn@^2.1.0, acorn@^2.4.0: version "2.7.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7" + integrity sha1-q259nYhqrKiwhbwzEreaGYQz8Oc= acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= acorn@^4.0.4: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= acorn@^5.0.0, acorn@^5.5.3: version "5.7.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" + integrity sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ== acorn@^5.2.1: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== acorn@^5.4.0: version "5.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.4.1.tgz#fdc58d9d17f4a4e98d102ded826a9b9759125102" + integrity sha512-XLmq3H/BVvW6/GbxKryGxWORz1ebilSsUDlyC27bXhWGWAZWkGwS6FLHjOlwFXNFoWFQEO/Df4u0YYd0K3BQgQ== active-model-adapter@^2.0.3: version "2.2.0" resolved "https://registry.yarnpkg.com/active-model-adapter/-/active-model-adapter-2.2.0.tgz#6885d6968574809f17f398c499b688a921c30f91" + integrity sha512-hflmeFKGiKXZtqPJ5pGbjUOCCIDWi2aFC7Q4htNi+FbLvI+8lBqjpDxiHgL82HmDF/CVVZGFQ2y0MROTxgC58g== dependencies: ember-cli-babel "^6.8.2" ember-inflector "^2.0.0" @@ -247,14 +287,17 @@ active-model-adapter@^2.0.3: after@0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/after/-/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" + integrity sha1-q11PuIP1loFtNRX495HAr0ht1ic= ajv-keywords@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" + integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= ajv@^4.9.1: version "4.11.8" resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + integrity sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY= dependencies: co "^4.6.0" json-stable-stringify "^1.0.1" @@ -262,6 +305,7 @@ ajv@^4.9.1: ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= dependencies: co "^4.6.0" fast-deep-equal "^1.0.0" @@ -271,6 +315,7 @@ ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: 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" + integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= dependencies: kind-of "^3.0.2" longest "^1.0.1" @@ -279,82 +324,99 @@ align-text@^0.1.1, align-text@^0.1.3: amd-name-resolver@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-0.0.5.tgz#76962dac876ed3311b05d29c6a58c14e1ef3304b" + integrity sha1-dpYtrIdu0zEbBdKcaljBTh7zMEs= dependencies: ensure-posix-path "^1.0.1" amd-name-resolver@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-0.0.7.tgz#814301adfe8a2f109f6e84d5e935196efb669615" + integrity sha1-gUMBrf6KLxCfboTV6TUZbvtmlhU= dependencies: ensure-posix-path "^1.0.1" amd-name-resolver@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.0.0.tgz#0e593b28d6fa3326ab1798107edaea961046e8d8" + integrity sha1-Dlk7KNb6MyarF5gQftrqlhBG6Ng= dependencies: ensure-posix-path "^1.0.1" amd-name-resolver@1.2.0, amd-name-resolver@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.2.0.tgz#fc41b3848824b557313897d71f8d5a0184fbe679" + integrity sha512-hlSTWGS1t6/xq5YCed7YALg7tKZL3rkl7UwEZ/eCIkn8JxmM6fU6Qs/1hwtjQqfuYxlffuUcgYEm0f5xP4YKaA== dependencies: ensure-posix-path "^1.0.1" amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= ansi-escapes@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + integrity sha1-06ioOzGapneTZisT52HHkRQiMG4= ansi-escapes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" + integrity sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ== ansi-regex@^0.2.0, ansi-regex@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" + integrity sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk= ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= ansi-styles@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" + integrity sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94= ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= ansi-styles@^3.0.0, ansi-styles@^3.1.0, ansi-styles@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" + integrity sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug== dependencies: color-convert "^1.9.0" ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansicolors@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" + integrity sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8= any-promise@^1.0.0, any-promise@^1.1.0, any-promise@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= anymatch@^1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== dependencies: micromatch "^2.1.5" normalize-path "^2.0.0" @@ -362,6 +424,7 @@ anymatch@^1.3.0: anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== dependencies: micromatch "^3.1.4" normalize-path "^2.1.1" @@ -369,12 +432,14 @@ anymatch@^2.0.0: aot-test-generators@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/aot-test-generators/-/aot-test-generators-0.1.0.tgz#43f0f615f97cb298d7919c1b0b4e6b7310b03cd0" + integrity sha1-Q/D2Ffl8spjXkZwbC05rcxCwPNA= dependencies: jsesc "^2.5.0" applause@1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/applause/-/applause-1.2.2.tgz#a8468579e81f67397bb5634c29953bedcd0f56c0" + integrity sha1-qEaFeegfZzl7tWNMKZU77c0PVsA= dependencies: cson-parser "^1.1.0" js-yaml "^3.3.0" @@ -383,10 +448,12 @@ applause@1.2.2: aproba@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== are-we-there-yet@~1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + integrity sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0= dependencies: delegates "^1.0.0" readable-stream "^2.0.6" @@ -394,116 +461,142 @@ are-we-there-yet@~1.1.2: argparse@^1.0.7: version "1.0.9" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + integrity sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY= dependencies: sprintf-js "~1.0.2" argparse@~1.0.2: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= dependencies: arr-flatten "^1.0.1" arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= array-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= array-to-error@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/array-to-error/-/array-to-error-1.1.1.tgz#d68812926d14097a205579a667eeaf1856a44c07" + integrity sha1-1ogSkm0UCXogVXmmZ+6vGFakTAc= dependencies: array-to-sentence "^1.1.0" array-to-sentence@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/array-to-sentence/-/array-to-sentence-1.1.0.tgz#c804956dafa53232495b205a9452753a258d39fc" + integrity sha1-yASVba+lMjJJWyBalFJ1OiWNOfw= array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= dependencies: array-uniq "^1.0.1" array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= arraybuffer.slice@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" + integrity sha1-8zshWfBTKj8xB6JywMz70a0peco= arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= asn1@0.1.11: version "0.1.11" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.1.11.tgz#559be18376d08a4ec4dbe80877d27818639b2df7" + integrity sha1-VZvhg3bQik7E2+gId9J4GGObLfc= asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + integrity sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y= assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= assert-plus@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.1.5.tgz#ee74009413002d84cec7219c6ac811812e723160" + integrity sha1-7nQAlBMALYTOxyGcasgRgS5yMWA= assert-plus@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + integrity sha1-104bh+ev/A24qttwIfP+SBAasjQ= assertion-error@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= ast-types@0.9.6: version "0.9.6" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" + integrity sha1-ECyenpAF0+fjgpvwxPok7oYu6bk= async-disk-cache@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/async-disk-cache/-/async-disk-cache-1.3.3.tgz#6040486660b370e4051cd9fa9fee275e1fae3728" + integrity sha512-GyaWSbDAZCltxSobtj1m1ptXa0+zSdjWs3sM4IqnvhoRwMDHW5786sXQ1RiXbR3ZGuQe6NXMB4N0vUmW163cew== dependencies: debug "^2.1.3" heimdalljs "^0.2.3" @@ -516,18 +609,22 @@ async-disk-cache@^1.2.1: async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + integrity sha1-GdOGodntxufByF04iu28xW0zYC0= async-foreach@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== async-promise-queue@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/async-promise-queue/-/async-promise-queue-1.0.4.tgz#308baafbc74aff66a0bb6e7f4a18d4fe8434440c" + integrity sha512-GQ5X3DT+TefYuFPHdvIPXFTlKnh39U7dwtl+aUBGeKjMea9nBpv3c91DXgeyBQmY07vQ97f3Sr9XHqkamEameQ== dependencies: async "^2.4.1" debug "^2.6.8" @@ -535,32 +632,39 @@ async-promise-queue@^1.0.3: async@^1.4.0, async@^1.5.0, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= async@^2.4.1: version "2.6.0" resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" + integrity sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw== dependencies: lodash "^4.14.0" async@~0.2.9: version "0.2.10" resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= async@~0.9.0: version "0.9.2" resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= atob@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d" + integrity sha1-GcenYEc3dEaPILLS0DNyrX1Mv10= autoprefixer@^7.0.0: version "7.2.6" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.2.6.tgz#256672f86f7c735da849c4f07d008abb056067dc" + integrity sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ== dependencies: browserslist "^2.11.3" caniuse-lite "^1.0.30000805" @@ -572,26 +676,32 @@ autoprefixer@^7.0.0: aws-sign2@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.5.0.tgz#c57103f7a17fc037f02d7c2e64b602ea223f7d63" + integrity sha1-xXED96F/wDfwLXwuZLYC6iI/fWM= aws-sign2@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + integrity sha1-FDQt0428yU0OW4fXY81jYSwOeU8= aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.2.1, aws4@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + integrity sha1-g+9cqGCysy5KDe7e6MdxudtXRx4= aws4@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= dependencies: chalk "^1.1.3" esutils "^2.0.2" @@ -600,6 +710,7 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: babel-core@^6.14.0, babel-core@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" + integrity sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g= dependencies: babel-code-frame "^6.26.0" babel-generator "^6.26.0" @@ -624,6 +735,7 @@ babel-core@^6.14.0, babel-core@^6.26.0: babel-core@^6.24.1: version "6.26.3" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== dependencies: babel-code-frame "^6.26.0" babel-generator "^6.26.0" @@ -648,6 +760,7 @@ babel-core@^6.24.1: babel-eslint@^8.2.6: version "8.2.6" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.6.tgz#6270d0c73205628067c0f7ae1693a9e797acefd9" + integrity sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA== dependencies: "@babel/code-frame" "7.0.0-beta.44" "@babel/traverse" "7.0.0-beta.44" @@ -659,6 +772,7 @@ babel-eslint@^8.2.6: babel-generator@6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" + integrity sha1-rBriAHC3n248odMmlhMFN3TyDcU= dependencies: babel-messages "^6.23.0" babel-runtime "^6.26.0" @@ -672,6 +786,7 @@ babel-generator@6.26.0: babel-generator@^6.26.0: version "6.26.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== dependencies: babel-messages "^6.23.0" babel-runtime "^6.26.0" @@ -685,6 +800,7 @@ babel-generator@^6.26.0: babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= dependencies: babel-helper-explode-assignable-expression "^6.24.1" babel-runtime "^6.22.0" @@ -693,6 +809,7 @@ babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: babel-helper-call-delegate@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= dependencies: babel-helper-hoist-variables "^6.24.1" babel-runtime "^6.22.0" @@ -702,6 +819,7 @@ babel-helper-call-delegate@^6.24.1: babel-helper-define-map@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.26.0" @@ -711,6 +829,7 @@ babel-helper-define-map@^6.24.1: babel-helper-explode-assignable-expression@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= dependencies: babel-runtime "^6.22.0" babel-traverse "^6.24.1" @@ -719,6 +838,7 @@ babel-helper-explode-assignable-expression@^6.24.1: babel-helper-function-name@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= dependencies: babel-helper-get-function-arity "^6.24.1" babel-runtime "^6.22.0" @@ -729,6 +849,7 @@ babel-helper-function-name@^6.24.1: babel-helper-get-function-arity@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -736,6 +857,7 @@ babel-helper-get-function-arity@^6.24.1: babel-helper-hoist-variables@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -743,6 +865,7 @@ babel-helper-hoist-variables@^6.24.1: babel-helper-optimise-call-expression@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -750,6 +873,7 @@ babel-helper-optimise-call-expression@^6.24.1: babel-helper-regex@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= dependencies: babel-runtime "^6.26.0" babel-types "^6.26.0" @@ -758,6 +882,7 @@ babel-helper-regex@^6.24.1: babel-helper-remap-async-to-generator@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.22.0" @@ -768,6 +893,7 @@ babel-helper-remap-async-to-generator@^6.24.1: babel-helper-replace-supers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= dependencies: babel-helper-optimise-call-expression "^6.24.1" babel-messages "^6.23.0" @@ -779,6 +905,7 @@ babel-helper-replace-supers@^6.24.1: babel-helpers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= dependencies: babel-runtime "^6.22.0" babel-template "^6.24.1" @@ -786,76 +913,91 @@ babel-helpers@^6.24.1: babel-messages@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= dependencies: babel-runtime "^6.22.0" babel-plugin-check-es2015-constants@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= dependencies: babel-runtime "^6.22.0" babel-plugin-debug-macros@^0.1.10, babel-plugin-debug-macros@^0.1.11: version "0.1.11" resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.1.11.tgz#6c562bf561fccd406ce14ab04f42c218cf956605" + integrity sha512-hZw5qNNGAR02Y+yBUrtsnJHh8OXavkayPRqKGAXnIm4t5rWVpj3ArwsC7TWdpZsBguQvHAeyTxZ7s23yY60HHg== dependencies: semver "^5.3.0" babel-plugin-debug-macros@^0.2.0-beta.6: version "0.2.0-beta.6" resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.2.0-beta.6.tgz#ecdf6e408d5c863ab21740d7ad7f43f027d2f912" + integrity sha1-7N9uQI1chjqyF0DXrX9D8CfS+RI= dependencies: semver "^5.3.0" babel-plugin-ember-modules-api-polyfill@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.3.0.tgz#0c01f359658cfb9c797f705af6b09f6220205ae0" + integrity sha512-cv5ZimF5X52uW7Ul83UUxtsFZE6rZYkMv6qWnAeiDLT1/KtpVrTkJpwzDlvJ/FhKJZ43ih4GbFbhuhBKKT7vIw== dependencies: ember-rfc176-data "^0.3.0" babel-plugin-ember-modules-api-polyfill@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.3.2.tgz#56ea34bea963498d070a2b7dc2ce18a92c434093" + integrity sha512-mi9gaYasj2Bd6FYD1XCvuU1RL3n4DPn+VdOORyC2nqrvK50cLHkPaq/NdsqfxtZ0WNCIigrwnTHXU3XZI80tPg== dependencies: ember-rfc176-data "^0.3.0" babel-plugin-ember-modules-api-polyfill@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.5.0.tgz#860aab9fecbf38c10d1fe0779c6979a854fff154" + integrity sha512-o1rOgWFHR0IRBjC9Dvqc2V4MKE2UvdMv/fD/c5GUMAkS6DlTjQV54iMH9sdQ3TGfXPukPKBIOpoSoH/hdfGiMg== dependencies: ember-rfc176-data "^0.3.5" babel-plugin-feature-flags@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/babel-plugin-feature-flags/-/babel-plugin-feature-flags-0.3.1.tgz#9c827cf9a4eb9a19f725ccb239e85cab02036fc1" + integrity sha1-nIJ8+aTrmhn3JcyyOehcqwIDb8E= babel-plugin-filter-imports@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-0.3.1.tgz#e7859b56886b175dd2616425d277b219e209ea8b" + integrity sha1-54WbVohrF13SYWQl0neyGeIJ6os= babel-plugin-htmlbars-inline-precompile@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.2.3.tgz#cd365e278af409bfa6be7704c4354beee742446b" + integrity sha1-zTZeJ4r0Cb+mvncExDVL7udCRGs= babel-plugin-htmlbars-inline-precompile@^0.2.5: version "0.2.6" resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.2.6.tgz#c00b8a3f4b32ca04bf0f0d5169fcef3b5a66d69d" + integrity sha512-H4H75TKGUFij8ukwEYWEERAgrUf16R8NSK1uDPe3QwxT8mnE1K8+/s6DVjUqbM5Pv6lSIcE4XufXdlSX+DTB6g== babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= babel-plugin-syntax-exponentiation-operator@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= babel-plugin-syntax-trailing-function-commas@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= babel-plugin-transform-async-to-generator@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= dependencies: babel-helper-remap-async-to-generator "^6.24.1" babel-plugin-syntax-async-functions "^6.8.0" @@ -864,18 +1006,21 @@ babel-plugin-transform-async-to-generator@^6.22.0: babel-plugin-transform-es2015-arrow-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoping@^6.23.0, babel-plugin-transform-es2015-block-scoping@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= dependencies: babel-runtime "^6.26.0" babel-template "^6.26.0" @@ -886,6 +1031,7 @@ babel-plugin-transform-es2015-block-scoping@^6.23.0, babel-plugin-transform-es20 babel-plugin-transform-es2015-classes@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= dependencies: babel-helper-define-map "^6.24.1" babel-helper-function-name "^6.24.1" @@ -900,6 +1046,7 @@ babel-plugin-transform-es2015-classes@^6.23.0: babel-plugin-transform-es2015-computed-properties@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= dependencies: babel-runtime "^6.22.0" babel-template "^6.24.1" @@ -907,12 +1054,14 @@ babel-plugin-transform-es2015-computed-properties@^6.22.0: babel-plugin-transform-es2015-destructuring@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-duplicate-keys@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -920,12 +1069,14 @@ babel-plugin-transform-es2015-duplicate-keys@^6.22.0: babel-plugin-transform-es2015-for-of@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-function-name@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.22.0" @@ -934,12 +1085,14 @@ babel-plugin-transform-es2015-function-name@^6.22.0: babel-plugin-transform-es2015-literals@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= dependencies: babel-plugin-transform-es2015-modules-commonjs "^6.24.1" babel-runtime "^6.22.0" @@ -948,6 +1101,7 @@ babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015 babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" + integrity sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo= dependencies: babel-plugin-transform-strict-mode "^6.24.1" babel-runtime "^6.26.0" @@ -957,6 +1111,7 @@ babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-e babel-plugin-transform-es2015-modules-systemjs@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= dependencies: babel-helper-hoist-variables "^6.24.1" babel-runtime "^6.22.0" @@ -965,6 +1120,7 @@ babel-plugin-transform-es2015-modules-systemjs@^6.23.0: babel-plugin-transform-es2015-modules-umd@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= dependencies: babel-plugin-transform-es2015-modules-amd "^6.24.1" babel-runtime "^6.22.0" @@ -973,6 +1129,7 @@ babel-plugin-transform-es2015-modules-umd@^6.23.0: babel-plugin-transform-es2015-object-super@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= dependencies: babel-helper-replace-supers "^6.24.1" babel-runtime "^6.22.0" @@ -980,6 +1137,7 @@ babel-plugin-transform-es2015-object-super@^6.22.0: babel-plugin-transform-es2015-parameters@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= dependencies: babel-helper-call-delegate "^6.24.1" babel-helper-get-function-arity "^6.24.1" @@ -991,6 +1149,7 @@ babel-plugin-transform-es2015-parameters@^6.23.0: babel-plugin-transform-es2015-shorthand-properties@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -998,12 +1157,14 @@ babel-plugin-transform-es2015-shorthand-properties@^6.22.0: babel-plugin-transform-es2015-spread@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-sticky-regex@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= dependencies: babel-helper-regex "^6.24.1" babel-runtime "^6.22.0" @@ -1012,18 +1173,21 @@ babel-plugin-transform-es2015-sticky-regex@^6.22.0: babel-plugin-transform-es2015-template-literals@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-typeof-symbol@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-unicode-regex@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= dependencies: babel-helper-regex "^6.24.1" babel-runtime "^6.22.0" @@ -1032,6 +1196,7 @@ babel-plugin-transform-es2015-unicode-regex@^6.22.0: babel-plugin-transform-exponentiation-operator@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= dependencies: babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" babel-plugin-syntax-exponentiation-operator "^6.8.0" @@ -1040,12 +1205,14 @@ babel-plugin-transform-exponentiation-operator@^6.22.0: babel-plugin-transform-regenerator@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= dependencies: regenerator-transform "^0.10.0" babel-plugin-transform-strict-mode@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -1053,6 +1220,7 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-polyfill@^6.16.0, babel-polyfill@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= dependencies: babel-runtime "^6.26.0" core-js "^2.5.0" @@ -1061,6 +1229,7 @@ babel-polyfill@^6.16.0, babel-polyfill@^6.26.0: babel-preset-env@^1.5.1: version "1.6.1" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" + integrity sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA== dependencies: babel-plugin-check-es2015-constants "^6.22.0" babel-plugin-syntax-trailing-function-commas "^6.22.0" @@ -1096,6 +1265,7 @@ babel-preset-env@^1.5.1: babel-preset-env@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" + integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== dependencies: babel-plugin-check-es2015-constants "^6.22.0" babel-plugin-syntax-trailing-function-commas "^6.22.0" @@ -1131,6 +1301,7 @@ babel-preset-env@^1.7.0: babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= dependencies: babel-core "^6.26.0" babel-runtime "^6.26.0" @@ -1143,6 +1314,7 @@ babel-register@^6.26.0: babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= dependencies: core-js "^2.4.0" regenerator-runtime "^0.11.0" @@ -1150,6 +1322,7 @@ babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: babel-template@^6.24.1, babel-template@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= dependencies: babel-runtime "^6.26.0" babel-traverse "^6.26.0" @@ -1160,6 +1333,7 @@ babel-template@^6.24.1, babel-template@^6.26.0: babel-traverse@6.26.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= dependencies: babel-code-frame "^6.26.0" babel-messages "^6.23.0" @@ -1174,6 +1348,7 @@ babel-traverse@6.26.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= dependencies: babel-runtime "^6.26.0" esutils "^2.0.2" @@ -1183,44 +1358,54 @@ babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: babel6-plugin-strip-class-callcheck@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/babel6-plugin-strip-class-callcheck/-/babel6-plugin-strip-class-callcheck-6.0.0.tgz#de841c1abebbd39f78de0affb2c9a52ee228fddf" + integrity sha1-3oQcGr6705943gr/ssmlLuIo/d8= babel6-plugin-strip-heimdall@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/babel6-plugin-strip-heimdall/-/babel6-plugin-strip-heimdall-6.0.1.tgz#35f80eddec1f7fffdc009811dfbd46d9965072b6" + integrity sha1-NfgO3ewff//cAJgR371G2ZZQcrY= babylon@6.18.0, babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== babylon@7.0.0-beta.44: version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" + integrity sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g== backbone@^1.1.2: version "1.3.3" resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.3.3.tgz#4cc80ea7cb1631ac474889ce40f2f8bc683b2999" + integrity sha1-TMgOp8sWMaxHSInOQPL4vGg7KZk= dependencies: underscore ">=1.8.3" backo2@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= base64-arraybuffer@0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= base64id@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-0.1.0.tgz#02ce0fdeee0cef4f40080e1e73e834f0b1bfce3f" + integrity sha1-As4P3u4M709ACA4ec+g08LG/zj8= base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== dependencies: cache-base "^1.0.1" class-utils "^0.3.5" @@ -1233,62 +1418,75 @@ base@^0.11.1: basic-auth@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.0.tgz#015db3f353e02e56377755f962742e8981e7bbba" + integrity sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o= dependencies: safe-buffer "5.1.1" bcrypt-pbkdf@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + integrity sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40= dependencies: tweetnacl "^0.14.3" better-assert@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= dependencies: callsite "1.0.0" bignumber.js@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-2.4.0.tgz#838a992da9f9d737e0f4b2db0be62bb09dd0c5e8" + integrity sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg= binary-extensions@^1.0.0: version "1.11.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" + integrity sha1-RqoXUftqL5PuXmibsQh9SxTGwgU= "binaryextensions@1 || 2": version "2.1.1" resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.1.tgz#3209a51ca4a4ad541a3b8d3d6a6d5b83a2485935" + integrity sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA== blank-object@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/blank-object/-/blank-object-1.0.2.tgz#f990793fbe9a8c8dd013fb3219420bec81d5f4b9" + integrity sha1-+ZB5P76ajI3QE/syGUIL7IHV9Lk= blob@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" + integrity sha1-vPEwUspURj8w+fx+lbmkdjCpSSE= block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= dependencies: inherits "~2.0.0" bluebird@^3.1.1, bluebird@^3.3.5, bluebird@^3.4.6: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" + integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== bmp-js@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.0.1.tgz#5ad0147099d13a9f38aa7b99af1d6e78666ed37f" + integrity sha1-WtAUcJnROp84qnuZrx1ueGZu038= bmp-js@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.0.3.tgz#64113e9c7cf1202b376ed607bf30626ebe57b18a" + integrity sha1-ZBE+nHzxICs3btYHvzBibr5XsYo= body-parser@1.18.2: version "1.18.2" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" + integrity sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ= dependencies: bytes "3.0.0" content-type "~1.0.4" @@ -1304,6 +1502,7 @@ body-parser@1.18.2: body@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/body/-/body-5.1.0.tgz#e4ba0ce410a46936323367609ecb4e6553125069" + integrity sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk= dependencies: continuable-cache "^0.3.1" error "^7.0.0" @@ -1313,34 +1512,40 @@ body@^5.1.0: boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= boom@0.4.x: version "0.4.2" resolved "https://registry.yarnpkg.com/boom/-/boom-0.4.2.tgz#7a636e9ded4efcefb19cef4947a3c67dfaee911b" + integrity sha1-emNune1O/O+xnO9JR6PGffrukRs= dependencies: hoek "0.9.x" boom@2.x.x: version "2.10.1" resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + integrity sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8= dependencies: hoek "2.x.x" boom@4.x.x: version "4.3.1" resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" + integrity sha1-T4owBctKfjiJ90kDD9JbluAdLjE= dependencies: hoek "4.x.x" boom@5.x.x: version "5.2.0" resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + integrity sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw== dependencies: hoek "4.x.x" bower-config@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/bower-config/-/bower-config-1.4.1.tgz#85fd9df367c2b8dbbd0caa4c5f2bad40cd84c2cc" + integrity sha1-hf2d82fCuNu9DKpMXyutQM2Ewsw= dependencies: graceful-fs "^4.1.3" mout "^1.0.0" @@ -1351,10 +1556,12 @@ bower-config@^1.3.0: bower-endpoint-parser@0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz#00b565adbfab6f2d35addde977e97962acbcb3f6" + integrity sha1-ALVlrb+rby01rd3pd+l5Yqy8s/Y= brace-expansion@^1.0.0: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" @@ -1362,6 +1569,7 @@ brace-expansion@^1.0.0: brace-expansion@^1.1.7: version "1.1.8" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + integrity sha1-wHshHHyVLsH479Uad+8NHTmQopI= dependencies: balanced-match "^1.0.0" concat-map "0.0.1" @@ -1369,6 +1577,7 @@ brace-expansion@^1.1.7: braces@^1.8.2: version "1.8.5" resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= dependencies: expand-range "^1.8.1" preserve "^0.2.0" @@ -1377,6 +1586,7 @@ braces@^1.8.2: braces@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.0.tgz#a46941cb5fb492156b3d6a656e06c35364e3e66e" + integrity sha512-P4O8UQRdGiMLWSizsApmXVQDBS6KCt7dSexgLKBmH5Hr1CZq7vsnscFh8oR1sP1ab1Zj0uCHCEzZeV6SfUf3rA== dependencies: arr-flatten "^1.1.0" array-unique "^0.3.2" @@ -1393,6 +1603,7 @@ braces@^2.3.0: braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== dependencies: arr-flatten "^1.1.0" array-unique "^0.3.2" @@ -1408,6 +1619,7 @@ braces@^2.3.1: broccoli-asset-rev@^2.4.5: version "2.6.0" resolved "https://registry.yarnpkg.com/broccoli-asset-rev/-/broccoli-asset-rev-2.6.0.tgz#0633fc3a0b2ba0c2c1d56fa9feb7b331fc83be6d" + integrity sha1-BjP8OgsroMLB1W+p/rezMfyDvm0= dependencies: broccoli-asset-rewrite "^1.1.0" broccoli-filter "^1.2.2" @@ -1418,12 +1630,14 @@ broccoli-asset-rev@^2.4.5: broccoli-asset-rewrite@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-asset-rewrite/-/broccoli-asset-rewrite-1.1.0.tgz#77a5da56157aa318c59113245e8bafb4617f8830" + integrity sha1-d6XaVhV6oxjFkRMkXouvtGF/iDA= dependencies: broccoli-filter "^1.2.3" broccoli-autoprefixer@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/broccoli-autoprefixer/-/broccoli-autoprefixer-5.0.0.tgz#68c9f3bfdfff9df2d39e46545b9cf9d4443d6a16" + integrity sha1-aMnzv9//nfLTnkZUW5z51EQ9ahY= dependencies: autoprefixer "^7.0.0" broccoli-persistent-filter "^1.1.6" @@ -1432,6 +1646,7 @@ broccoli-autoprefixer@^5.0.0: broccoli-babel-transpiler@^6.0.0, broccoli-babel-transpiler@^6.1.2: version "6.1.4" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.1.4.tgz#8be8074c42abf2e17ff79b2d2a21df5c51143c82" + integrity sha512-h63g7iOBWdxj0GuZw8kNsyaD1T9weKsY3I+gp3rOefozbHwUesJ43vzLy0jj3t/rbiP2czcJAlyHS48EcRil8Q== dependencies: babel-core "^6.14.0" broccoli-funnel "^1.0.0" @@ -1447,6 +1662,7 @@ broccoli-babel-transpiler@^6.0.0, broccoli-babel-transpiler@^6.1.2: broccoli-babel-transpiler@^6.4.5, broccoli-babel-transpiler@^6.5.0: version "6.5.0" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.5.0.tgz#aa501a227b298a99742fdd0309b1eaad7124bba0" + integrity sha512-c5OLGY40Sdmv6rP230Jt8yoK49BHfOw1LXiDMu9EC9k2U6sqlpNRK78SzvByQ8IzKtBYUfeWCxeZHcvW+gH7VQ== dependencies: babel-core "^6.26.0" broccoli-funnel "^2.0.1" @@ -1462,6 +1678,7 @@ broccoli-babel-transpiler@^6.4.5, broccoli-babel-transpiler@^6.5.0: broccoli-bridge@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/broccoli-bridge/-/broccoli-bridge-1.0.0.tgz#6223fd64b62062c31333539f0f3c42d0acd92fb1" + integrity sha1-YiP9ZLYgYsMTM1OfDzxC0KzZL7E= dependencies: broccoli-plugin "^1.3.0" fs-extra "^7.0.0" @@ -1470,12 +1687,14 @@ broccoli-bridge@^1.0.0: broccoli-brocfile-loader@^0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/broccoli-brocfile-loader/-/broccoli-brocfile-loader-0.18.0.tgz#2e86021c805c34ffc8d29a2fb721cf273e819e4b" + integrity sha1-LoYCHIBcNP/I0povtyHPJz6Bnks= dependencies: findup-sync "^0.4.2" broccoli-builder@^0.18.8: version "0.18.11" resolved "https://registry.yarnpkg.com/broccoli-builder/-/broccoli-builder-0.18.11.tgz#a42393c7b10bb0380df255a616307945f5e26efb" + integrity sha512-4Qa3uTev+adLRTEv2zO1M5dXSFCgywo8bCMxJ8vmas8q+dAIstc1eKnnymJgpejyuEJQAjgdhO1zxMQCrt03Ew== dependencies: heimdalljs "^0.2.0" promise-map-series "^0.2.1" @@ -1487,6 +1706,7 @@ broccoli-builder@^0.18.8: broccoli-caching-writer@^2.2.0, broccoli-caching-writer@^2.2.1: version "2.3.1" resolved "https://registry.yarnpkg.com/broccoli-caching-writer/-/broccoli-caching-writer-2.3.1.tgz#b93cf58f9264f003075868db05774f4e7f25bd07" + integrity sha1-uTz1j5Jk8AMHWGjbBXdPTn8lvQc= dependencies: broccoli-kitchen-sink-helpers "^0.2.5" broccoli-plugin "1.1.0" @@ -1498,6 +1718,7 @@ broccoli-caching-writer@^2.2.0, broccoli-caching-writer@^2.2.1: broccoli-caching-writer@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/broccoli-caching-writer/-/broccoli-caching-writer-3.0.3.tgz#0bd2c96a9738d6a6ab590f07ba35c5157d7db476" + integrity sha1-C9LJapc41qarWQ8HujXFFX19tHY= dependencies: broccoli-kitchen-sink-helpers "^0.3.1" broccoli-plugin "^1.2.1" @@ -1509,6 +1730,7 @@ broccoli-caching-writer@^3.0.3: broccoli-clean-css@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-clean-css/-/broccoli-clean-css-1.1.0.tgz#9db143d9af7e0ae79c26e3ac5a9bb2d720ea19fa" + integrity sha1-nbFD2a9+CuecJuOsWpuy1yDqGfo= dependencies: broccoli-persistent-filter "^1.1.6" clean-css-promise "^0.1.0" @@ -1518,6 +1740,7 @@ broccoli-clean-css@^1.1.0: broccoli-concat@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.2.2.tgz#86ffdc52606eb590ba9f6b894c5ec7a016f5b7b9" + integrity sha1-hv/cUmButZC6n2uJTF7HoBb1t7k= dependencies: broccoli-kitchen-sink-helpers "^0.3.1" broccoli-plugin "^1.3.0" @@ -1535,12 +1758,14 @@ broccoli-concat@^3.2.2: broccoli-config-loader@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/broccoli-config-loader/-/broccoli-config-loader-1.0.1.tgz#d10aaf8ebc0cb45c1da5baa82720e1d88d28c80a" + integrity sha512-MDKYQ50rxhn+g17DYdfzfEM9DjTuSGu42Db37A8TQHQe8geYEcUZ4SQqZRgzdAI3aRQNlA1yBHJfOeGmOjhLIg== dependencies: broccoli-caching-writer "^3.0.3" broccoli-config-replace@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/broccoli-config-replace/-/broccoli-config-replace-1.1.2.tgz#6ea879d92a5bad634d11329b51fc5f4aafda9c00" + integrity sha1-bqh52SpbrWNNETKbUfxfSq/anAA= dependencies: broccoli-kitchen-sink-helpers "^0.3.1" broccoli-plugin "^1.2.0" @@ -1550,6 +1775,7 @@ broccoli-config-replace@^1.1.2: broccoli-debug@^0.6.1, broccoli-debug@^0.6.2, broccoli-debug@^0.6.3, broccoli-debug@^0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.4.tgz#986eb3d2005e00e3bb91f9d0a10ab137210cd150" + integrity sha512-CixMUndBqTljCc26i6ubhBrGbAWXpWBsGJFce6ZOr76Tul2Ev1xxM0tmf7OjSzdYhkr5BrPd/CNbR9VMPi+NBg== dependencies: broccoli-plugin "^1.2.1" fs-tree-diff "^0.5.2" @@ -1561,6 +1787,7 @@ broccoli-debug@^0.6.1, broccoli-debug@^0.6.2, broccoli-debug@^0.6.3, broccoli-de broccoli-favicon@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/broccoli-favicon/-/broccoli-favicon-1.0.0.tgz#c770a5aa16032fbaf1b5c9c033f71b9cc5a5cb51" + integrity sha1-x3ClqhYDL7rxtcnAM/cbnMWly1E= dependencies: bluebird "^3.3.5" broccoli-caching-writer "^2.2.1" @@ -1570,6 +1797,7 @@ broccoli-favicon@1.0.0: broccoli-file-creator@^1.0.0, broccoli-file-creator@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/broccoli-file-creator/-/broccoli-file-creator-1.1.1.tgz#1b35b67d215abdfadd8d49eeb69493c39e6c3450" + integrity sha1-GzW2fSFavfrdjUnutpSTw55sNFA= dependencies: broccoli-kitchen-sink-helpers "~0.2.0" broccoli-plugin "^1.1.0" @@ -1581,6 +1809,7 @@ broccoli-file-creator@^1.0.0, broccoli-file-creator@^1.1.1: broccoli-file-creator@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/broccoli-file-creator/-/broccoli-file-creator-2.1.1.tgz#7351dd2496c762cfce7736ce9b49e3fce0c7b7db" + integrity sha512-YpjOExWr92C5vhnK0kmD81kM7U09kdIRZk9w4ZDCDHuHXW+VE/x6AGEOQQW3loBQQ6Jk+k+TSm8dESy4uZsnjw== dependencies: broccoli-plugin "^1.1.0" mkdirp "^0.5.1" @@ -1588,6 +1817,7 @@ broccoli-file-creator@^2.1.1: broccoli-filter@^0.1.11: version "0.1.14" resolved "https://registry.yarnpkg.com/broccoli-filter/-/broccoli-filter-0.1.14.tgz#23cae3891ff9ebb7b4d7db00c6dcf03535daf7ad" + integrity sha1-I8rjiR/567e019sAxtzwNTXa960= dependencies: broccoli-kitchen-sink-helpers "^0.2.6" broccoli-writer "^0.1.1" @@ -1601,6 +1831,7 @@ broccoli-filter@^0.1.11: broccoli-filter@^1.2.2, broccoli-filter@^1.2.3: version "1.2.4" resolved "https://registry.yarnpkg.com/broccoli-filter/-/broccoli-filter-1.2.4.tgz#409afb94b9a3a6da9fac8134e91e205f40cc7330" + integrity sha1-QJr7lLmjptqfrIE06R4gX0DMczA= dependencies: broccoli-kitchen-sink-helpers "^0.3.1" broccoli-plugin "^1.0.0" @@ -1615,6 +1846,7 @@ broccoli-filter@^1.2.2, broccoli-filter@^1.2.3: broccoli-filter@^1.2.4: version "1.3.0" resolved "https://registry.yarnpkg.com/broccoli-filter/-/broccoli-filter-1.3.0.tgz#71e3a8e32a17f309e12261919c5b1006d6766de6" + integrity sha512-VXJXw7eBfG82CFxaBDjYmyN7V72D4In2zwLVQJd/h3mBfF3CMdRTsv2L20lmRTtCv1sAHcB+LgMso90e/KYiLw== dependencies: broccoli-kitchen-sink-helpers "^0.3.1" broccoli-plugin "^1.0.0" @@ -1629,6 +1861,7 @@ broccoli-filter@^1.2.4: broccoli-flatiron@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/broccoli-flatiron/-/broccoli-flatiron-0.1.3.tgz#fc7bd8faf7db429ed7199933aa2ec7ef84a8d943" + integrity sha512-dD/4ck+LKOLTBzFlxP2zX7fhWt1TFMVR/88b9/wd8LkAHUyAzWs1vBah94ObSvajYGZ7ic+XvMXw+OhmvdlYoQ== dependencies: broccoli-plugin "^1.3.0" mkdirp "^0.5.1" @@ -1636,10 +1869,12 @@ broccoli-flatiron@^0.1.3: broccoli-funnel-reducer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/broccoli-funnel-reducer/-/broccoli-funnel-reducer-1.0.0.tgz#11365b2a785aec9b17972a36df87eef24c5cc0ea" + integrity sha1-ETZbKnha7JsXlyo234fu8kxcwOo= broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.2, broccoli-funnel@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-1.2.0.tgz#cddc3afc5ff1685a8023488fff74ce6fb5a51296" + integrity sha1-zdw6/F/xaFqAI0iP/3TOb7WlEpY= dependencies: array-equal "^1.0.0" blank-object "^1.0.1" @@ -1659,6 +1894,7 @@ broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.2, broccoli broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-2.0.1.tgz#6823c73b675ef78fffa7ab800f083e768b51d449" + integrity sha512-C8Lnp9TVsSSiZMGEF16C0dCiNg2oJqUKwuZ1K4kVC6qRPG/2Cj/rtB5kRCC9qEbwqhX71bDbfHROx0L3J7zXQg== dependencies: array-equal "^1.0.0" blank-object "^1.0.1" @@ -1677,6 +1913,7 @@ broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1: broccoli-kitchen-sink-helpers@^0.2.0, broccoli-kitchen-sink-helpers@^0.2.5, broccoli-kitchen-sink-helpers@^0.2.6, broccoli-kitchen-sink-helpers@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz#a5e0986ed8d76fb5984b68c3f0450d3a96e36ecc" + integrity sha1-peCYbtjXb7WYS2jD8EUNOpbjbsw= dependencies: glob "^5.0.10" mkdirp "^0.5.1" @@ -1684,6 +1921,7 @@ broccoli-kitchen-sink-helpers@^0.2.0, broccoli-kitchen-sink-helpers@^0.2.5, broc broccoli-kitchen-sink-helpers@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.3.1.tgz#77c7c18194b9664163ec4fcee2793444926e0c06" + integrity sha1-d8fBgZS5ZkFj7E/O4nk0RJJuDAY= dependencies: glob "^5.0.10" mkdirp "^0.5.1" @@ -1691,6 +1929,7 @@ broccoli-kitchen-sink-helpers@^0.3.1: broccoli-lint-eslint@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/broccoli-lint-eslint/-/broccoli-lint-eslint-4.2.1.tgz#f780dc083a7357a9746a9cfa8f76feb092777477" + integrity sha512-Jvm06UvuMPa5gEH+9/Sb+QpoIodDAYzbyIUEqxniPCdA6JJooa91hQDCTJc32RUV46JNMcLhb3Dl55BdA8v5mw== dependencies: aot-test-generators "^0.1.0" broccoli-concat "^3.2.2" @@ -1703,6 +1942,7 @@ broccoli-lint-eslint@^4.2.1: broccoli-merge-trees@^1.0.0, broccoli-merge-trees@^1.1.0, broccoli-merge-trees@^1.1.1: version "1.2.4" resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-1.2.4.tgz#a001519bb5067f06589d91afa2942445a2d0fdb5" + integrity sha1-oAFRm7UGfwZYnZGvopQkRaLQ/bU= dependencies: broccoli-plugin "^1.3.0" can-symlink "^1.0.0" @@ -1716,6 +1956,7 @@ broccoli-merge-trees@^1.0.0, broccoli-merge-trees@^1.1.0, broccoli-merge-trees@^ broccoli-merge-trees@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-2.0.0.tgz#10aea46dd5cebcc8b8f7d5a54f0a84a4f0bb90b9" + integrity sha1-EK6kbdXOvMi499WlTwqEpPC7kLk= dependencies: broccoli-plugin "^1.3.0" merge-trees "^1.0.1" @@ -1723,6 +1964,7 @@ broccoli-merge-trees@^2.0.0: broccoli-merge-trees@^3.0.0, broccoli-merge-trees@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-3.0.1.tgz#545dfe9f695cec43372b3ee7e63c7203713ea554" + integrity sha512-EFPBLbCoyCLdjJx0lxn+acWXK/GAZesXokS4OsF7HuB+WdnV76HVJPdfwp9TaXaUkrtb7eU+ymh9tY9wOGQjMQ== dependencies: broccoli-plugin "^1.3.0" merge-trees "^2.0.0" @@ -1730,6 +1972,7 @@ broccoli-merge-trees@^3.0.0, broccoli-merge-trees@^3.0.1: broccoli-middleware@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/broccoli-middleware/-/broccoli-middleware-1.0.0.tgz#92f4e1fb9a791ea986245a7077f35cc648dab097" + integrity sha1-kvTh+5p5HqmGJFpwd/NcxkjasJc= dependencies: handlebars "^4.0.4" mime "^1.2.11" @@ -1737,10 +1980,12 @@ broccoli-middleware@^1.0.0: broccoli-node-info@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-1.1.0.tgz#3aa2e31e07e5bdb516dd25214f7c45ba1c459412" + integrity sha1-OqLjHgflvbUW3SUhT3xFuhxFlBI= broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.2.0, broccoli-persistent-filter@^1.4.0, broccoli-persistent-filter@^1.4.2, broccoli-persistent-filter@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.3.tgz#3511bc52fc53740cda51621f58a28152d9911bc1" + integrity sha512-JwNLDvvXJlhUmr+CHcbVhCyp33NbCIAITjQZmJY9e8QzANXh3jpFWlhSFvkWghwKA8rTAKcXkW12agtiZjxr4g== dependencies: async-disk-cache "^1.2.1" async-promise-queue "^1.0.3" @@ -1759,6 +2004,7 @@ broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-p broccoli-plugin@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.1.0.tgz#73e2cfa05f8ea1e3fc1420c40c3d9e7dc724bf02" + integrity sha1-c+LPoF+OoeP8FCDEDD2efcckvwI= dependencies: promise-map-series "^0.2.1" quick-temp "^0.1.3" @@ -1768,6 +2014,7 @@ broccoli-plugin@1.1.0: broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli-plugin@^1.2.1, broccoli-plugin@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.0.tgz#bee704a8e42da08cb58e513aaa436efb7f0ef1ee" + integrity sha1-vucEqOQtoIy1jlE6qkNu+38O8e4= dependencies: promise-map-series "^0.2.1" quick-temp "^0.1.3" @@ -1777,6 +2024,7 @@ broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli broccoli-replace@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/broccoli-replace/-/broccoli-replace-0.12.0.tgz#36460a984c45c61731638c53068b0ab12ea8fdb7" + integrity sha1-NkYKmExFxhcxY4xTBosKsS6o/bc= dependencies: applause "1.2.2" broccoli-persistent-filter "^1.2.0" @@ -1785,6 +2033,7 @@ broccoli-replace@^0.12.0: broccoli-rollup@^2.0.0, broccoli-rollup@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/broccoli-rollup/-/broccoli-rollup-2.1.1.tgz#0b77dc4b7560a53e998ea85f3b56772612d4988d" + integrity sha512-aky/Ovg5DbsrsJEx2QCXxHLA6ZR+9u1TNVTf85soP4gL8CjGGKQ/JU8R3BZ2ntkWzo6/83RCKzX6O+nlNKR5MQ== dependencies: "@types/node" "^9.6.0" amd-name-resolver "^1.2.0" @@ -1801,6 +2050,7 @@ broccoli-rollup@^2.0.0, broccoli-rollup@^2.1.1: broccoli-sass-source-maps@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/broccoli-sass-source-maps/-/broccoli-sass-source-maps-2.2.0.tgz#1f1a0794136152b096188638b59b42b17a4bdc68" + integrity sha512-X1yTOGQcjQxYebP+hjeAI286x63VZ0WfgFxqHsr4eimgNNL2TPxkJKKgOaDKJ3nE8pszbJWgHrWpEVXuwgsUzw== dependencies: broccoli-caching-writer "^3.0.3" include-path-searcher "^0.1.0" @@ -1812,20 +2062,24 @@ broccoli-sass-source-maps@^2.1.0: broccoli-slow-trees@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-2.0.0.tgz#9741afe992787add64aec7f7c8211dfcc058278d" + integrity sha1-l0Gv6ZJ4et1krsf3yCEd/MBYJ40= broccoli-slow-trees@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-3.0.1.tgz#9bf2a9e2f8eb3ed3a3f2abdde988da437ccdc9b4" + integrity sha1-m/Kp4vjrPtOj8qvd6YjaQ3zNybQ= dependencies: heimdalljs "^0.2.1" broccoli-source@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-source/-/broccoli-source-1.1.0.tgz#54f0e82c8b73f46580cbbc4f578f0b32fca8f809" + integrity sha1-VPDoLItz9GWAy7xPV48LMvyo+Ak= broccoli-sri-hash@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/broccoli-sri-hash/-/broccoli-sri-hash-2.1.2.tgz#bc69905ed7a381ad325cc0d02ded071328ebf3f3" + integrity sha1-vGmQXtejga0yXMDQLe0HEyjr8/M= dependencies: broccoli-caching-writer "^2.2.0" mkdirp "^0.5.1" @@ -1836,6 +2090,7 @@ broccoli-sri-hash@^2.1.0: broccoli-static-compiler@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/broccoli-static-compiler/-/broccoli-static-compiler-0.1.4.tgz#713d18f08eb3131530575a0c5ad2951bba10af41" + integrity sha1-cT0Y8I6zExUwV1oMWtKVG7oQr0E= dependencies: broccoli-kitchen-sink-helpers "^0.2.0" broccoli-writer "^0.1.1" @@ -1844,6 +2099,7 @@ broccoli-static-compiler@^0.1.4: broccoli-stew@^1.2.0, broccoli-stew@^1.3.3, broccoli-stew@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-1.5.0.tgz#d7af8c18511dce510e49d308a62e5977f461883c" + integrity sha1-16+MGFEdzlEOSdMIpi5Zd/RhiDw= dependencies: broccoli-debug "^0.6.1" broccoli-funnel "^1.0.1" @@ -1863,6 +2119,7 @@ broccoli-stew@^1.2.0, broccoli-stew@^1.3.3, broccoli-stew@^1.5.0: broccoli-stew@^1.4.2: version "1.6.0" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-1.6.0.tgz#01f6d92806ed6679ddbe48d405066a0e164dfbef" + integrity sha512-sUwCJNnYH4Na690By5xcEMAZqKgquUQnMAEuIiL3Z2k63mSw9Xg+7Ew4wCrFrMmXMcLpWjZDOm6Yqnq268N+ZQ== dependencies: broccoli-debug "^0.6.1" broccoli-funnel "^2.0.0" @@ -1882,6 +2139,7 @@ broccoli-stew@^1.4.2: broccoli-stew@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-2.0.0.tgz#68f3d94f13b4a79aa15d582703574fb4c3215e50" + integrity sha512-9dtyFlWEYHI36e4wXNTo6JReCaCssx+Jq1GpkTQZaJA/2buJn+HeGzguoYPdR2VKNb3vX13fpWJFQP0TAwa7WA== dependencies: broccoli-debug "^0.6.1" broccoli-funnel "^2.0.0" @@ -1901,6 +2159,7 @@ broccoli-stew@^2.0.0: broccoli-string-replace@^0.1.1, broccoli-string-replace@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/broccoli-string-replace/-/broccoli-string-replace-0.1.2.tgz#1ed92f85680af8d503023925e754e4e33676b91f" + integrity sha1-HtkvhWgK+NUDAjkl51Tk4zZ2uR8= dependencies: broccoli-persistent-filter "^1.1.5" minimatch "^3.0.3" @@ -1908,6 +2167,7 @@ broccoli-string-replace@^0.1.1, broccoli-string-replace@^0.1.2: broccoli-style-manifest@^1.5.0: version "1.5.2" resolved "https://registry.yarnpkg.com/broccoli-style-manifest/-/broccoli-style-manifest-1.5.2.tgz#249accc81a75b83fb581cd8c2d16a51a4989664d" + integrity sha512-68IUg6TAD/hBBsg2/MYTQpdpzBpkg6vLAbHvlcebgS3AckkKvZCSC7XXlgnCHJ5xj0L/LPbS8VOzSjpz8IiYow== dependencies: broccoli-caching-writer "^3.0.3" fs-tree-diff "^0.5.6" @@ -1918,6 +2178,7 @@ broccoli-style-manifest@^1.5.0: broccoli-svg-optimizer@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-svg-optimizer/-/broccoli-svg-optimizer-1.1.0.tgz#5d6e03310298c7a1d22d373508beedc6258590cc" + integrity sha512-cFwZLK4xHreyTPRl1D2yVHnba5UhiS0EE7j42z05Q22aPFOmRrpMIJNiBnrfaPBmskpQYseZLnOYdwWP8Pj6Dw== dependencies: broccoli-persistent-filter "^1.2.0" json-stable-stringify "^1.0.1" @@ -1928,6 +2189,7 @@ broccoli-svg-optimizer@1.1.0: broccoli-symbolizer@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/broccoli-symbolizer/-/broccoli-symbolizer-0.6.0.tgz#1ece00fba329f19ab42d920350a5f2014f8d0b52" + integrity sha512-ZwVDX+kkJ7/TXdhl2ChRZARNAeBiru1+53HHafN5UcnpIzJaE+CbyuSQdxEtnIakSKIZtgI/J6uJIffGDgft3g== dependencies: broccoli-concat "^3.2.2" broccoli-persistent-filter "^1.2.0" @@ -1938,6 +2200,7 @@ broccoli-symbolizer@^0.6.0: broccoli-templater@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/broccoli-templater/-/broccoli-templater-1.0.0.tgz#7c054aacf596d1868d1a44291f9ec7b907d30ecf" + integrity sha1-fAVKrPWW0YaNGkQpH57HuQfTDs8= dependencies: broccoli-filter "^0.1.11" broccoli-stew "^1.2.0" @@ -1946,6 +2209,7 @@ broccoli-templater@^1.0.0: broccoli-test-helper@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/broccoli-test-helper/-/broccoli-test-helper-1.3.0.tgz#ba673418b3963b2cc466be66092a5928700c827f" + integrity sha512-IhFjcETHOSDAXY8afLLcihdXbAgcQ2b3lp9nZ5saYzoXJvt/1RMUlCm8JxKKPU7aHqpNXMVaj5lm4Is+4xh/qA== dependencies: broccoli "^1.1.0" fixturify "^0.3.2" @@ -1957,6 +2221,7 @@ broccoli-test-helper@^1.3.0: broccoli-uglify-sourcemap@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/broccoli-uglify-sourcemap/-/broccoli-uglify-sourcemap-2.0.2.tgz#f4a73112f1f56b46043e2e89cba5ce7762cddeb3" + integrity sha512-Fe+qUlPC4gHG7ojQOaRSRrCbrI2niYNAfrZqLkPEXHCi8UtwEqMHBAK6AZylN7ve/0CkGNSxKhCm7ELeeJRI+A== dependencies: broccoli-plugin "^1.2.1" debug "^3.1.0" @@ -1971,12 +2236,14 @@ broccoli-uglify-sourcemap@^2.0.0: broccoli-unwatched-tree@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/broccoli-unwatched-tree/-/broccoli-unwatched-tree-0.1.3.tgz#ab0fb820f613845bf67a803baad820f68b1e3aae" + integrity sha1-qw+4IPYThFv2eoA7qtgg9oseOq4= dependencies: broccoli-source "^1.1.0" broccoli-writer@^0.1.1, broccoli-writer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/broccoli-writer/-/broccoli-writer-0.1.1.tgz#d4d71aa8f2afbc67a3866b91a2da79084b96ab2d" + integrity sha1-1NcaqPKvvGejhmuRotp5CEuWqy0= dependencies: quick-temp "^0.1.0" rsvp "^3.0.6" @@ -1984,6 +2251,7 @@ broccoli-writer@^0.1.1, broccoli-writer@~0.1.1: broccoli@^1.1.0: version "1.1.4" resolved "https://registry.yarnpkg.com/broccoli/-/broccoli-1.1.4.tgz#b023b028b866f447ed14341007961efd03f7251c" + integrity sha1-sCOwKLhm9EftFDQQB5Ye/QP3JRw= dependencies: broccoli-node-info "1.1.0" broccoli-slow-trees "2.0.0" @@ -2004,14 +2272,17 @@ broccoli@^1.1.0: browser-process-hrtime@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" + integrity sha1-Ql1opY00R/AqBKqJQYf86K+Le44= browser-stdout@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + integrity sha1-81HTKWnTL6XXpVZxVCY9korjvR8= browserslist@^2.1.2, browserslist@^2.11.3: version "2.11.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" + integrity sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA== dependencies: caniuse-lite "^1.0.30000792" electron-to-chromium "^1.3.30" @@ -2019,6 +2290,7 @@ browserslist@^2.1.2, browserslist@^2.11.3: browserslist@^3.2.6: version "3.2.8" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== dependencies: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" @@ -2026,16 +2298,19 @@ browserslist@^3.2.6: bser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + integrity sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk= dependencies: node-int64 "^0.4.0" buffer-alloc-unsafe@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== buffer-alloc@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== dependencies: buffer-alloc-unsafe "^1.1.0" buffer-fill "^1.0.0" @@ -2043,38 +2318,47 @@ buffer-alloc@^1.1.0: buffer-equal@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" + integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs= buffer-fill@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= buffer-from@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" + integrity sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ== builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= builtin-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-2.0.0.tgz#60b7ef5ae6546bd7deefa74b08b62a43a232648e" + integrity sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg== builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= bytes@1: version "1.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8" + integrity sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g= bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== dependencies: collection-visit "^1.0.0" component-emitter "^1.2.1" @@ -2089,30 +2373,36 @@ cache-base@^1.0.1: calculate-cache-key-for-tree@^1.0.0, calculate-cache-key-for-tree@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-1.1.0.tgz#0c3e42c9c134f3c9de5358c0f16793627ea976d6" + integrity sha1-DD5CycE088neU1jA8WeTYn6pdtY= dependencies: json-stable-stringify "^1.0.1" caller-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= dependencies: callsites "^0.2.0" callsite@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= camelcase-css@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-1.0.1.tgz#157c4238265f5cf94a1dffde86446552cbf3f705" + integrity sha1-FXxCOCZfXPlKHf/ehkRlUsvz9wU= camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= dependencies: camelcase "^2.0.0" map-obj "^1.0.0" @@ -2120,42 +2410,51 @@ camelcase-keys@^2.0.0: camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= camelcase@^2.0.0, camelcase@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= can-symlink@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/can-symlink/-/can-symlink-1.0.0.tgz#97b607d8a84bb6c6e228b902d864ecb594b9d219" + integrity sha1-l7YH2KhLtsbiKLkC2GTstZS50hk= dependencies: tmp "0.0.28" caniuse-lite@^1.0.30000792: version "1.0.30000803" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000803.tgz#9939c37149d38d5f4540430490d240c03106a0f5" + integrity sha512-AoROHIFLv2iv5CG4nonOfT9ZCQ3JTN0GyEn8LG2sPb2Wc5cIyX/UwLYP0pnVajVF3LWH+mrO/DXBzmte0BK9cQ== caniuse-lite@^1.0.30000805: version "1.0.30000878" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000878.tgz#c644c39588dd42d3498e952234c372e5a40a4123" + integrity sha512-/dCGTdLCnjVJno1mFRn7Y6eit3AYaeFzSrMQHCoK0LEQaWl5snuLex1Ky4b8/Qu2ig5NgTX4cJx65hH9546puA== caniuse-lite@^1.0.30000844: version "1.0.30000865" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25" + integrity sha512-vs79o1mOSKRGv/1pSkp4EXgl4ZviWeYReXw60XfacPU64uQWZwJT6vZNmxRF9O+6zu71sJwMxLK5JXxbzuVrLw== capture-exit@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" + integrity sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28= dependencies: rsvp "^3.3.3" cardinal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-1.0.0.tgz#50e21c1b0aa37729f9377def196b5a9cec932ee9" + integrity sha1-UOIcGwqjdyn5N33vGWtanOyTLuk= dependencies: ansicolors "~0.2.1" redeyed "~1.0.0" @@ -2163,10 +2462,12 @@ cardinal@^1.0.0: caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= center-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= dependencies: align-text "^0.1.3" lazy-cache "^1.0.3" @@ -2174,6 +2475,7 @@ center-align@^0.1.1: chai@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" + integrity sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw= dependencies: assertion-error "^1.0.1" check-error "^1.0.1" @@ -2185,6 +2487,7 @@ chai@^4.1.0: chalk@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" + integrity sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ= dependencies: ansi-styles "^1.1.0" escape-string-regexp "^1.0.0" @@ -2195,6 +2498,7 @@ chalk@^0.5.1: chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -2205,6 +2509,7 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" + integrity sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q== dependencies: ansi-styles "^3.1.0" escape-string-regexp "^1.0.5" @@ -2213,6 +2518,7 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: chalk@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796" + integrity sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g== dependencies: ansi-styles "^3.2.0" escape-string-regexp "^1.0.5" @@ -2221,6 +2527,7 @@ chalk@^2.3.0: chalk@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" @@ -2229,24 +2536,29 @@ chalk@^2.4.1: chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= charenc@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= charm@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/charm/-/charm-1.0.2.tgz#8add367153a6d9a581331052c4090991da995e35" + integrity sha1-it02cVOm2aWBMxBSxAkJkdqZXjU= dependencies: inherits "^2.0.1" check-error@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= cheerio@0.20.0: version "0.20.0" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.20.0.tgz#5c710f2bab95653272842ba01c6ea61b3545ec35" + integrity sha1-XHEPK6uVZTJyhCugHG6mGzVF7DU= dependencies: css-select "~1.2.0" dom-serializer "~0.1.0" @@ -2259,6 +2571,7 @@ cheerio@0.20.0: cheerio@0.22.0, cheerio@^0.22.0: version "0.22.0" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" + integrity sha1-qbqoYKP5tZWmuBsahocxIe06Jp4= dependencies: css-select "~1.2.0" dom-serializer "~0.1.0" @@ -2280,6 +2593,7 @@ cheerio@0.22.0, cheerio@^0.22.0: cheerio@^0.19.0: version "0.19.0" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.19.0.tgz#772e7015f2ee29965096d71ea4175b75ab354925" + integrity sha1-dy5wFfLuKZZQltcepBdbdas1SSU= dependencies: css-select "~1.0.0" dom-serializer "~0.1.0" @@ -2290,6 +2604,7 @@ cheerio@^0.19.0: chokidar@1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= dependencies: anymatch "^1.3.0" async-each "^1.0.0" @@ -2305,6 +2620,7 @@ chokidar@1.7.0: chokidar@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" + integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== dependencies: anymatch "^2.0.0" async-each "^1.0.0" @@ -2324,20 +2640,24 @@ chokidar@^2.0.0: chownr@^1.0.1: version "1.1.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== circular-json@^0.3.1: version "0.3.3" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== clap@^1.0.9: version "1.2.3" resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" + integrity sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA== dependencies: chalk "^1.1.3" class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== dependencies: arr-union "^3.1.0" define-property "^0.2.5" @@ -2347,10 +2667,12 @@ class-utils@^0.3.5: clean-base-url@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clean-base-url/-/clean-base-url-1.0.0.tgz#c901cf0a20b972435b0eccd52d056824a4351b7b" + integrity sha1-yQHPCiC5ckNbDszVLQVoJKQ1G3s= clean-css-promise@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/clean-css-promise/-/clean-css-promise-0.1.1.tgz#43f3d2c8dfcb2bf071481252cd9b76433c08eecb" + integrity sha1-Q/PSyN/LK/BxSBJSzZt2QzwI7ss= dependencies: array-to-error "^1.0.0" clean-css "^3.4.5" @@ -2359,6 +2681,7 @@ clean-css-promise@^0.1.0: clean-css@^3.4.5: version "3.4.28" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.4.28.tgz#bf1945e82fc808f55695e6ddeaec01400efd03ff" + integrity sha1-vxlF6C/ICPVWlebd6uwBQA79A/8= dependencies: commander "2.8.x" source-map "0.4.x" @@ -2366,26 +2689,31 @@ clean-css@^3.4.5: clean-up-path@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clean-up-path/-/clean-up-path-1.0.0.tgz#de9e8196519912e749c9eaf67c13d64fac72a3e5" + integrity sha512-PHGlEF0Z6976qQyN6gM7kKH6EH0RdfZcc8V+QhFe36eRxV0SMH5OUBZG7Bxa9YcreNzyNbK63cGiZxdSZgosRw== cli-cursor@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc= dependencies: restore-cursor "^1.0.1" cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= dependencies: restore-cursor "^2.0.0" cli-spinners@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.1.0.tgz#f1847b168844d917a671eb9d147e3df497c90d06" + integrity sha1-8YR7FohE2RemceudFH499JfJDQY= cli-table2@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/cli-table2/-/cli-table2-0.2.0.tgz#2d1ef7f218a0e786e214540562d4bd177fe32d97" + integrity sha1-LR738hig54biFFQFYtS9F3/jLZc= dependencies: lodash "^3.10.1" string-width "^1.0.1" @@ -2395,16 +2723,19 @@ cli-table2@^0.2.0: cli-table@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + integrity sha1-9TsFJmqLGguTSz0IIebi3FkUriM= dependencies: colors "1.0.3" cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= clipboard@^1.7.1: version "1.7.1" resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-1.7.1.tgz#360d6d6946e99a7a1fef395e42ba92b5e9b5a16b" + integrity sha1-Ng1taUbpmnof7zleQrqStem1oWs= dependencies: good-listener "^1.2.2" select "^1.1.2" @@ -2413,6 +2744,7 @@ clipboard@^1.7.1: cliui@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= dependencies: center-align "^0.1.1" right-align "^0.1.1" @@ -2421,6 +2753,7 @@ cliui@^2.1.0: cliui@^3.0.3, cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -2429,36 +2762,44 @@ cliui@^3.0.3, cliui@^3.2.0: clone-stats@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" + integrity sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE= clone@^1.0.0, clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= clone@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" + integrity sha1-0hfR6WERjjrJpLi7oyhVU79kfNs= co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= coa@~1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" + integrity sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0= dependencies: q "^1.1.2" code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= coffee-script@^1.10.0: version "1.12.7" resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.7.tgz#c05dae0cb79591d05b3070a8433a98c9a89ccc53" + integrity sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw== collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= dependencies: map-visit "^1.0.0" object-visit "^1.0.0" @@ -2466,110 +2807,133 @@ collection-visit@^1.0.0: color-convert@^1.9.0: version "1.9.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" + integrity sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ== dependencies: color-name "^1.1.1" color-logger@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/color-logger/-/color-logger-0.0.3.tgz#d9b22dd1d973e166b18bf313f9f481bba4df2018" + integrity sha1-2bIt0dlz4Waxi/MT+fSBu6TfIBg= color-name@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= colors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= colors@^1.1.2, colors@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= combined-stream@1.0.6, combined-stream@~1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + integrity sha1-cj599ugBrFYTETp+RFqbactjKBg= dependencies: delayed-stream "~1.0.0" combined-stream@^1.0.5, combined-stream@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + integrity sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk= dependencies: delayed-stream "~1.0.0" combined-stream@~0.0.4: version "0.0.7" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-0.0.7.tgz#0137e657baa5a7541c57ac37ac5fc07d73b4dc1f" + integrity sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8= dependencies: delayed-stream "0.0.5" commander@2.12.2: version "2.12.2" resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555" + integrity sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA== commander@2.8.x: version "2.8.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" + integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ= dependencies: graceful-readlink ">= 1.0.0" commander@2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q= dependencies: graceful-readlink ">= 1.0.0" commander@^2.11.0: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== commander@^2.5.0: version "2.16.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" + integrity sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew== commander@^2.6.0: version "2.14.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.0.tgz#7b25325963e6aace20d3a9285b09379b0c2208b5" + integrity sha512-okPpdvdJr6mUGi2XzupC+irQxzwGLVaBzacFC14hjLv8NColXEsxsU+QaeuSSXpQUak5g2K0vQ7WjA1e8svczg== commander@~2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== comment-regex@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/comment-regex/-/comment-regex-1.0.1.tgz#e070d2c4db33231955d0979d27c918fcb6f93565" + integrity sha512-IWlN//Yfby92tOIje7J18HkNmWRR7JESA/BK8W7wqY/akITpU5B0JQWnbTjCfdChSrDNb0DrdA9jfAxiiBXyiQ== common-tags@^1.4.0: version "1.7.2" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.7.2.tgz#24d9768c63d253a56ecff93845b44b4df1d52771" + integrity sha512-joj9ZlUOjCrwdbmiLqafeUSgkUM74NqhLsZtSqDmhKudaIY197zTrb8JMl31fMnCUuxwFT23eC/oWvrZzDLRJQ== dependencies: babel-runtime "^6.26.0" component-bind@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= component-emitter@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" + integrity sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM= component-emitter@1.2.1, component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= component-inherit@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= compressible@~2.0.11: version "2.0.12" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.12.tgz#c59a5c99db76767e9876500e271ef63b3493bd66" + integrity sha1-xZpcmdt2dn6YdlAOJx72OzSTvWY= dependencies: mime-db ">= 1.30.0 < 2" compression@^1.4.4: version "1.7.1" resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.1.tgz#eff2603efc2e22cf86f35d2eb93589f9875373db" + integrity sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s= dependencies: accepts "~1.3.4" bytes "3.0.0" @@ -2582,10 +2946,12 @@ compression@^1.4.4: concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= concat-stream@1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== dependencies: buffer-from "^1.0.0" inherits "^2.0.3" @@ -2595,6 +2961,7 @@ concat-stream@1.6.2: concat-stream@^1.4.7, concat-stream@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + integrity sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc= dependencies: inherits "^2.0.3" readable-stream "^2.2.2" @@ -2603,6 +2970,7 @@ concat-stream@^1.4.7, concat-stream@^1.6.0: configstore@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" + integrity sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw== dependencies: dot-prop "^4.1.0" graceful-fs "^4.1.2" @@ -2614,6 +2982,7 @@ configstore@^3.0.0: connect@^3.3.3: version "3.6.6" resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" + integrity sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ= dependencies: debug "2.6.9" finalhandler "1.1.0" @@ -2623,10 +2992,12 @@ connect@^3.3.3: console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= console-ui@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/console-ui/-/console-ui-2.1.0.tgz#e1d5279d27621a75123d7d594f9fa59f866ea3e3" + integrity sha512-/FqFHRwYVjjdeLd/1lhRsyoPCMtDMREJfPU6WCN9LMxPWu3++Cr2wN1uIZfbefVwr59is4UBd6Z2vaJRzTyPWQ== dependencies: chalk "^2.1.0" inquirer "^2" @@ -2638,78 +3009,95 @@ console-ui@^2.0.0: consolidate@^0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.14.5.tgz#5a25047bc76f73072667c8cb52c989888f494c63" + integrity sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM= dependencies: bluebird "^3.1.1" content-disposition@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= content-type-parser@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" + integrity sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ== content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== continuable-cache@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f" + integrity sha1-vXJ6f67XfnH/OYWskzUakSczrQ8= convert-source-map@^1.5.0, convert-source-map@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + integrity sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU= cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= cookie@0.3.1, cookie@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= copy-dereference@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/copy-dereference/-/copy-dereference-1.0.0.tgz#6b131865420fd81b413ba994b44d3655311152b6" + integrity sha1-axMYZUIP2BtBO6mUtE02VTERUrY= copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js@^2.4.0, core-js@^2.5.0: version "2.5.3" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" + integrity sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4= core-object@2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/core-object/-/core-object-2.0.6.tgz#60134b9c40ff69b27bc15e82db945e4df782961b" + integrity sha1-YBNLnED/abJ7wV6C25ReTfeClhs= dependencies: chalk "^1.1.3" core-object@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/core-object/-/core-object-1.1.0.tgz#86d63918733cf9da1a5aae729e62c0a88e66ad0a" + integrity sha1-htY5GHM8+doaWq5ynmLAqI5mrQo= core-object@^2.0.0, core-object@^2.0.6: version "2.1.1" resolved "https://registry.yarnpkg.com/core-object/-/core-object-2.1.1.tgz#4b7a5f1edefcb1e6d0dcb58eab1b9f90bfc666a8" + integrity sha1-S3pfHt78sebQ3LWOqxufkL/GZqg= dependencies: chalk "^1.1.3" core-object@^3.1.3: version "3.1.5" resolved "https://registry.yarnpkg.com/core-object/-/core-object-3.1.5.tgz#fa627b87502adc98045e44678e9a8ec3b9c0d2a9" + integrity sha512-sA2/4+/PZ/KV6CKgjrVrrUVBKCkdDO02CUlQ0YKTQoYUwPYNOtOAcWlbYhd5v/1JqYaA6oZ4sDlOU4ppVw6Wbg== dependencies: chalk "^2.0.0" core-util-is@1.0.2, 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" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= cpr@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cpr/-/cpr-2.2.0.tgz#2dc6c87dfb78012489cdd994227628c320e9a17b" + integrity sha512-q8UoWzIT9rslJKb3Y5CcByzR2zX7GBkVcoU6jJx02d/BgbE7zJ8Aix74i7bw3iYk58TrgXhmB2XB0aGaBd7oZA== dependencies: graceful-fs "^4.1.5" minimist "^1.2.0" @@ -2719,6 +3107,7 @@ cpr@^2.0.0: cross-spawn@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= dependencies: lru-cache "^4.0.1" which "^1.2.9" @@ -2726,6 +3115,7 @@ cross-spawn@^3.0.0: cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= dependencies: lru-cache "^4.0.1" shebang-command "^1.2.0" @@ -2734,38 +3124,45 @@ cross-spawn@^5.0.1, cross-spawn@^5.1.0: crypt@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= cryptiles@0.2.x: version "0.2.2" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-0.2.2.tgz#ed91ff1f17ad13d3748288594f8a48a0d26f325c" + integrity sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw= dependencies: boom "0.4.x" cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + integrity sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g= dependencies: boom "2.x.x" cryptiles@3.x.x: version "3.1.2" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" + integrity sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4= dependencies: boom "5.x.x" crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= cson-parser@^1.1.0: version "1.3.5" resolved "https://registry.yarnpkg.com/cson-parser/-/cson-parser-1.3.5.tgz#7ec675e039145533bf2a6a856073f1599d9c2d24" + integrity sha1-fsZ14DkUVTO/KmqFYHPxWZ2cLSQ= dependencies: coffee-script "^1.10.0" css-select@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.0.0.tgz#b1121ca51848dd264e2244d058cee254deeb44b0" + integrity sha1-sRIcpRhI3SZOIkTQWM7iVN7rRLA= dependencies: boolbase "~1.0.0" css-what "1.0" @@ -2775,6 +3172,7 @@ css-select@~1.0.0: css-select@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= dependencies: boolbase "~1.0.0" css-what "2.1" @@ -2784,18 +3182,22 @@ css-select@~1.2.0: css-what@1.0: version "1.0.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-1.0.0.tgz#d7cc2df45180666f99d2b14462639469e00f736c" + integrity sha1-18wt9FGAZm+Z0rFEYmOUaeAPc2w= css-what@2.1: version "2.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" + integrity sha1-lGfQMsOM+u+58teVASUwYvh/ob0= css.escape@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= csso@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/csso/-/csso-2.0.0.tgz#178b43a44621221c27756086f531e02f42900ee8" + integrity sha1-F4tDpEYhIhwndWCG9THgL0KQDug= dependencies: clap "^1.0.9" source-map "^0.5.3" @@ -2803,46 +3205,55 @@ csso@~2.0.0: cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": version "0.3.2" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + integrity sha1-uANhcMefB6kP8vFuIihAJ6JDhIs= "cssom@>= 0.3.0 < 0.4.0": version "0.3.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.4.tgz#8cd52e8a3acfd68d3aed38ee0a640177d2f9d797" + integrity sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog== "cssstyle@>= 0.2.29 < 0.3.0", "cssstyle@>= 0.2.37 < 0.3.0": version "0.2.37" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + integrity sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ= dependencies: cssom "0.3.x" cssstyle@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.0.0.tgz#79b16d51ec5591faec60e688891f15d2a5705129" + integrity sha512-Bpuh47j2mRMY60X90mXaJAEtJwxvA2roZzbgwAXYhMbmwmakdRr4Cq9L5SkleKJNLOKqHIa2YWyOXDX3VgggSQ== dependencies: cssom "0.3.x" ctype@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/ctype/-/ctype-0.5.3.tgz#82c18c2461f74114ef16c135224ad0b9144ca12f" + integrity sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8= currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= dependencies: array-find-index "^1.0.1" dag-map@^2.0.1, dag-map@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/dag-map/-/dag-map-2.0.2.tgz#9714b472de82a1843de2fba9b6876938cab44c68" + integrity sha1-lxS0ct6CoYQ94vuptodpOMq0TGg= dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= dependencies: assert-plus "^1.0.0" data-urls@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f" + integrity sha512-ai40PPQR0Fn1lD2PPie79CibnlMN2AYiDhwFX/rZHVsxbs5kNJSjegqXIprhouGXlRdEnfybva7kqRGnB6mypA== dependencies: abab "^1.0.4" whatwg-mimetype "^2.0.0" @@ -2851,80 +3262,95 @@ data-urls@^1.0.0: date-time@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/date-time/-/date-time-2.1.0.tgz#0286d1b4c769633b3ca13e1e62558d2dbdc2eba2" + integrity sha512-/9+C44X7lot0IeiyfgJmETtRMhBidBYM2QFFIkGa0U1k+hSyY87Nw7PY3eDqpvCBm7I3WCSfPeZskW/YYq6m4g== dependencies: time-zone "^1.0.0" debug@2.2.0, debug@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + integrity sha1-+HBX6ZWxofauaklgZkE3vFbwOdo= dependencies: ms "0.7.1" debug@2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" + integrity sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w= dependencies: ms "0.7.2" debug@2.6.8: version "2.6.8" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + integrity sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw= dependencies: ms "2.0.0" debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.4.0, debug@^2.6.8, debug@^2.6.9, debug@~2.6.7: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" debug@^3.0.0, debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= deep-eql@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== dependencies: type-detect "^4.0.0" deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-extend@~0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + integrity sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8= deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= dependencies: is-descriptor "^1.0.0" define-property@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== dependencies: is-descriptor "^1.0.2" isobject "^3.0.1" @@ -2932,10 +3358,12 @@ define-property@^2.0.2: defined@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= del@^2.0.2: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= dependencies: globby "^5.0.0" is-path-cwd "^1.0.0" @@ -2948,68 +3376,83 @@ del@^2.0.2: delayed-stream@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-0.0.5.tgz#d4b1f43a93e8296dfe02694f4680bc37a313c73f" + integrity sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8= delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= delegate@^3.1.2: version "3.2.0" resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" + integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= depd@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + integrity sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k= depd@~1.1.1, depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= detect-file@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" + integrity sha1-STXe39lIhkjgBrASlWbpOGcR6mM= dependencies: fs-exists-sync "^0.1.0" detect-file@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= dependencies: repeating "^2.0.0" detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= diff@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + integrity sha1-yc45Okt8vQsFinJck98pkCeGj/k= diff@^3.2.0: version "3.4.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" + integrity sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA== doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" dom-serializer@0, dom-serializer@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + integrity sha1-BzxpdUbOB4DOI75KKOKT5AvDDII= dependencies: domelementtype "~1.1.1" entities "~1.1.1" @@ -3017,42 +3460,50 @@ dom-serializer@0, dom-serializer@~0.1.0: dom-walk@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" + integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg= domelementtype@1, domelementtype@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" + integrity sha1-sXrtguirWeUt2cGbF1bg/BhyBMI= domelementtype@~1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" + integrity sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs= domexception@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== dependencies: webidl-conversions "^4.0.2" domhandler@2.3: version "2.3.0" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" + integrity sha1-LeWaCCLVAn+r/28DLCsloqir5zg= dependencies: domelementtype "1" domhandler@^2.3.0: version "2.4.2" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== dependencies: domelementtype "1" domutils@1.4: version "1.4.3" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.4.3.tgz#0865513796c6b306031850e175516baf80b72a6f" + integrity sha1-CGVRN5bGswYDGFDhdVFrr4C3Km8= dependencies: domelementtype "1" domutils@1.5, domutils@1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= dependencies: dom-serializer "0" domelementtype "1" @@ -3060,6 +3511,7 @@ domutils@1.5, domutils@1.5.1: domutils@^1.5.1: version "1.7.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== dependencies: dom-serializer "0" domelementtype "1" @@ -3067,50 +3519,60 @@ domutils@^1.5.1: dot-prop@^4.1.0, dot-prop@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== dependencies: is-obj "^1.0.0" dotenv@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-1.2.0.tgz#7cd73e16e07f057c8072147a5bc3a8677f0ab5c6" + integrity sha1-fNc+FuB/BXyAchR6W8OoZ38KtcY= ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + integrity sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU= dependencies: jsbn "~0.1.0" editions@^1.1.1: version "1.3.4" resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" + integrity sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg== ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= electron-to-chromium@^1.3.30: version "1.3.32" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.32.tgz#11d0684c0840e003c4be8928f8ac5f35dbc2b4e6" + integrity sha1-EdBoTAhA4APEvoko+KxfNdvCtOY= electron-to-chromium@^1.3.47: version "1.3.52" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0" + integrity sha1-0tnxJwuko7lnuDHEDvcftNmrXOA= ember-ajax@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-3.0.0.tgz#8f21e9da0c1d433cf879aa855fce464d517e9ab5" + integrity sha1-jyHp2gwdQzz4eaqFX85GTVF+mrU= dependencies: ember-cli-babel "^6.0.0" ember-app-scheduler@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/ember-app-scheduler/-/ember-app-scheduler-1.0.4.tgz#2d75cc645c18a0f5b0febaf8de37e6ca4059f4ed" + integrity sha512-0rqIegUhT2oxMUivxg/PHXTKaqjHxg/SKhqSbXqMxusyHhKduOjFeEzf6sU6zr1XwXt8cTg361NYMOON+0r3kw== dependencies: ember-cli-babel "^6.3.0" ember-cli-addon-docs-esdoc@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ember-cli-addon-docs-esdoc/-/ember-cli-addon-docs-esdoc-0.2.1.tgz#fcb2f1792f1bd4d6a5df8205f7b6e555abbcd1b9" + integrity sha512-iDPMhxB68whOV4veW89TAOFBPU4g2ysP9y+Jn1Ic0+37N7LqOULas/FF4KxbhB+dUr5V5pW3txULeeLVcx5kYQ== dependencies: broccoli-caching-writer "^3.0.3" ember-cli-babel "^6.6.0" @@ -3185,6 +3647,7 @@ ember-cli-addon-docs@ember-learn/ember-cli-addon-docs#6b11d814f2ed39b0670a49f324 ember-cli-addon-tests@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/ember-cli-addon-tests/-/ember-cli-addon-tests-0.7.1.tgz#6959c4cce1a9d16a4852465e2b2bed4bf26b46ec" + integrity sha1-aVnEzOGp0WpIUkZeKyvtS/JrRuw= dependencies: chalk "^2.0.1" cpr "^2.0.0" @@ -3203,6 +3666,7 @@ ember-cli-addon-tests@^0.7.0: ember-cli-app-version@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-cli-app-version/-/ember-cli-app-version-2.1.0.tgz#149101d4fd0d97875e12ec5e61ff105f508e5e2d" + integrity sha1-FJEB1P0Nl4deEuxeYf8QX1COXi0= dependencies: ember-cli-babel "^6.8.0" git-repo-version "0.4.1" @@ -3210,6 +3674,7 @@ ember-cli-app-version@^2.0.0: ember-cli-autoprefixer@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/ember-cli-autoprefixer/-/ember-cli-autoprefixer-0.8.1.tgz#071dd9574451057b03dcc03b71f5bd9cb07ef332" + integrity sha1-Bx3ZV0RRBXsD3MA7cfW9nLB+8zI= dependencies: broccoli-autoprefixer "^5.0.0" lodash "^4.0.0" @@ -3217,6 +3682,7 @@ ember-cli-autoprefixer@^0.8.1: ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2, ember-cli-babel@^6.9.0: version "6.11.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.11.0.tgz#79cb184bac3c05bfe181ddc306bac100ab1f9493" + integrity sha512-lHQyl30lbAsMmMq2it1GO85HKrqr2gMpK5CFxmOgTJ3moBqOGMKsdV3Z0qXWpgh8Asy7pB9AACMShdgfQvSGPg== dependencies: amd-name-resolver "0.0.7" babel-plugin-debug-macros "^0.1.11" @@ -3235,6 +3701,7 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.12.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.7.2: version "6.16.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.16.0.tgz#623b4a2764ece72b65f1572fc8aeb5714a450228" + integrity sha512-rzWkVdKVk2KSbQ81TxmLli+LWdBEqF+FHE83rUQXVOV4FguJDtP1w2AW08f8QjuztbnQ5+VUGCb7H0dL8UwOVw== dependencies: amd-name-resolver "1.2.0" babel-plugin-debug-macros "^0.2.0-beta.6" @@ -3253,6 +3720,7 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.12.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.16.0: version "6.17.2" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.17.2.tgz#f0d53d2fb95e70c15d8db84760d045f88f458f69" + integrity sha512-9KcCvF1PcelEFTSiJ/Ld20tfuW9acMkwHC/xINLsmwqJVDbm3oEqWtiFDZ5ebaC278O5I0GqNJWJLYNoWMNZ8g== dependencies: amd-name-resolver "1.2.0" babel-plugin-debug-macros "^0.2.0-beta.6" @@ -3271,6 +3739,7 @@ ember-cli-babel@^6.16.0: ember-cli-broccoli-sane-watcher@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.0.4.tgz#f43f42f75b7509c212fb926cd9aea86ae19264c6" + integrity sha1-9D9C91t1CcIS+5Js2a6oauGSZMY= dependencies: broccoli-slow-trees "^3.0.1" heimdalljs "^0.2.1" @@ -3281,6 +3750,7 @@ ember-cli-broccoli-sane-watcher@^2.0.4: ember-cli-clipboard@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/ember-cli-clipboard/-/ember-cli-clipboard-0.8.1.tgz#59f8eb6ba471a7668dff592fcebb7b06014240dd" + integrity sha1-Wfjra6Rxp2aN/1kvzrt7BgFCQN0= dependencies: broccoli-funnel "^1.1.0" clipboard "^1.7.1" @@ -3291,6 +3761,7 @@ ember-cli-clipboard@^0.8.1: ember-cli-dependency-checker@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-2.1.0.tgz#9d66286a7c778e94733eaf21320d129c4fd0dd64" + integrity sha1-nWYoanx3jpRzPq8hMg0SnE/Q3WQ= dependencies: chalk "^1.1.3" is-git-url "^1.0.0" @@ -3300,6 +3771,7 @@ ember-cli-dependency-checker@^2.0.0: ember-cli-deploy-build@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ember-cli-deploy-build/-/ember-cli-deploy-build-1.1.1.tgz#de515b04536a569f42626ef28aea139f32ef00e8" + integrity sha512-q6Svm9PhEO2t5bCjsHfwkm36Cdou1eTdzvw00dU/nAHnysmai7sIqEzT7k20zawjGws7CgttZzMz6Oek5TOZ1w== dependencies: chalk "^1.0.0" ember-cli-deploy-plugin "^0.2.1" @@ -3309,6 +3781,7 @@ ember-cli-deploy-build@^1.1.1: ember-cli-deploy-git-ci@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/ember-cli-deploy-git-ci/-/ember-cli-deploy-git-ci-1.0.1.tgz#846b046f82196538cc6eea2aa5d410c9111f76f4" + integrity sha512-F5lbie3T6vBCHYSCi7yT6KC+4dlM/BkeOv+6oPra0a2Px4q2J3Rv4Yuh8aailOVVRE+2iRyVFM57ijB8QBb9WA== dependencies: ember-cli-deploy-plugin "^0.2.9" execa "^0.7.0" @@ -3317,6 +3790,7 @@ ember-cli-deploy-git-ci@^1.0.1: ember-cli-deploy-git@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/ember-cli-deploy-git/-/ember-cli-deploy-git-1.3.3.tgz#7fdd035ad93af4016d1eecbc0a5bac35ae7da60f" + integrity sha512-skwu+ROq38SuWqcrTh0e/iTCLWOdeANMz2PcnSIiPUcOocVCZUX0FbV4YmQ9Wn6yavzg7VTKrZPxN1YA9eHwYg== dependencies: ember-cli-babel "^6.11.0" ember-cli-deploy-plugin "^0.2.9" @@ -3326,6 +3800,7 @@ ember-cli-deploy-git@^1.3.3: ember-cli-deploy-plugin@^0.2.1, ember-cli-deploy-plugin@^0.2.9: version "0.2.9" resolved "https://registry.yarnpkg.com/ember-cli-deploy-plugin/-/ember-cli-deploy-plugin-0.2.9.tgz#a3d395b8adad7ef68d8bacdd0b0f4a61bcf9e651" + integrity sha1-o9OVuK2tfvaNi6zdCw9KYbz55lE= dependencies: chalk "^1.0.0" core-object "2.0.6" @@ -3334,10 +3809,12 @@ ember-cli-deploy-plugin@^0.2.1, ember-cli-deploy-plugin@^0.2.9: ember-cli-deploy-progress@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/ember-cli-deploy-progress/-/ember-cli-deploy-progress-1.3.0.tgz#18663deed25b4d5397476332f25eed3c3fdf225a" + integrity sha1-GGY97tJbTVOXR2My8l7tPD/fIlo= ember-cli-deploy@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/ember-cli-deploy/-/ember-cli-deploy-1.0.2.tgz#9ab39188c882b57937418db5b3da6fc65b16b916" + integrity sha1-mrORiMiCtXk3QY21s9pvxlsWuRY= dependencies: chalk "^1.1.3" core-object "^2.0.0" @@ -3351,6 +3828,7 @@ ember-cli-deploy@^1.0.2: ember-cli-eslint@^4.2.1: version "4.2.3" resolved "https://registry.yarnpkg.com/ember-cli-eslint/-/ember-cli-eslint-4.2.3.tgz#2844d3f5e8184f19b2d7132ba99eb0b370b55598" + integrity sha512-1fqRz9QVLTT790Zr07aDFmAprZ1vVsaBGJOGQgDEFmBpogq8BeaQopaxogWFp748hol8nGC4QP5tbzhVD6KQHw== dependencies: broccoli-lint-eslint "^4.2.1" ember-cli-version-checker "^2.1.0" @@ -3360,6 +3838,7 @@ ember-cli-eslint@^4.2.1: ember-cli-fastboot@^1.1.4-beta.1: version "1.1.4-beta.1" resolved "https://registry.yarnpkg.com/ember-cli-fastboot/-/ember-cli-fastboot-1.1.4-beta.1.tgz#7063df36e62b92fd0f60c9a23dd03b5b57aec3fe" + integrity sha512-Jx9txTOGX0wgbg3d6N5oy2PSI9FI31tg4KiMY5vtXL3GuEi0S+HLCvh/w+INy+Ka3WLFcjutCdow23VL4gzDoQ== dependencies: broccoli-concat "^3.2.2" broccoli-funnel "^2.0.0" @@ -3381,6 +3860,7 @@ ember-cli-fastboot@^1.1.4-beta.1: ember-cli-favicon@^1.0.0-beta.4: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-favicon/-/ember-cli-favicon-1.0.0.tgz#2f6781e939acf33b368841645e076bfd77061c34" + integrity sha512-zPaO/hgpj0WYbwqlfcMDuP5evezSoUrrHOELfGmSe5G9Eo01Eh2k0O2k8lxDM4o6BpVz3Vw/ph0C4G9DfrKm6Q== dependencies: broccoli-favicon "1.0.0" broccoli-merge-trees "^2.0.0" @@ -3390,14 +3870,17 @@ ember-cli-favicon@^1.0.0-beta.4: ember-cli-get-component-path-option@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-get-component-path-option/-/ember-cli-get-component-path-option-1.0.0.tgz#0d7b595559e2f9050abed804f1d8eff1b08bc771" + integrity sha1-DXtZVVni+QUKvtgE8djv8bCLx3E= ember-cli-get-dependency-depth@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-get-dependency-depth/-/ember-cli-get-dependency-depth-1.0.0.tgz#e0afecf82a2d52f00f28ab468295281aec368d11" + integrity sha1-4K/s+CotUvAPKKtGgpUoGuw2jRE= ember-cli-htmlbars-inline-precompile@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-1.0.2.tgz#5b544f664d5d9911f08cd979c5f70d8cb0ca2add" + integrity sha1-W1RPZk1dmRHwjNl5xfcNjLDKKt0= dependencies: babel-plugin-htmlbars-inline-precompile "^0.2.3" ember-cli-version-checker "^2.0.0" @@ -3408,6 +3891,7 @@ ember-cli-htmlbars-inline-precompile@^1.0.0: ember-cli-htmlbars-inline-precompile@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-1.0.3.tgz#332ff96c06fc522965162f1090d78a615379c3c2" + integrity sha1-My/5bAb8UillFi8QkNeKYVN5w8I= dependencies: babel-plugin-htmlbars-inline-precompile "^0.2.5" ember-cli-version-checker "^2.1.2" @@ -3418,6 +3902,7 @@ ember-cli-htmlbars-inline-precompile@^1.0.2: ember-cli-htmlbars@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.3.tgz#e116e1500dba12f29c94b05b9ec90f52cb8bb042" + integrity sha512-oyWtJebOwxAqWZwMc0NKFJ8FJdxVixM7zl0FaXq1vTAG6bOgnU7yAhXEASlaO5f+PptZueZfOpdpvRwZW/Gk1A== dependencies: broccoli-persistent-filter "^1.0.3" hash-for-dep "^1.0.2" @@ -3427,6 +3912,7 @@ ember-cli-htmlbars@^2.0.1: ember-cli-htmlbars@^2.0.2, ember-cli-htmlbars@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.4.tgz#0bcda483f14271663c38756e1fd1cb89da6a50cf" + integrity sha512-WSGODKKG65M/Q7QcLflmxnJKMA32JqFLyX0a5ghMRDWRqvUVkKWSZDbjJsNsCw/OCeBbPWQLQWq0wtpCnTTjwA== dependencies: broccoli-persistent-filter "^1.4.3" hash-for-dep "^1.2.3" @@ -3436,14 +3922,17 @@ ember-cli-htmlbars@^2.0.2, ember-cli-htmlbars@^2.0.3: ember-cli-inject-live-reload@^1.4.1: version "1.7.0" resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-1.7.0.tgz#af94336e015336127dfb98080ad442bb233e37ed" + integrity sha512-+0zOwJlf4iR5NcvyeU7E7xU1qDfniP/+mXfNTfAEhHO2eE9sjQvasKV84O1sIIyLk2LMIjFPbGt7uv5fQcIGwg== ember-cli-is-package-missing@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-is-package-missing/-/ember-cli-is-package-missing-1.0.0.tgz#6e6184cafb92635dd93ca6c946b104292d4e3390" + integrity sha1-bmGEyvuSY13ZPKbJRrEEKS1OM5A= ember-cli-legacy-blueprints@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/ember-cli-legacy-blueprints/-/ember-cli-legacy-blueprints-0.2.1.tgz#480f37cb83f1eda2d46bbc7d07c59ea2e8ce9b84" + integrity sha1-SA83y4Px7aLUa7x9B8WeoujOm4Q= dependencies: chalk "^2.3.0" ember-cli-get-component-path-option "^1.0.0" @@ -3466,14 +3955,17 @@ ember-cli-legacy-blueprints@^0.2.0: ember-cli-lodash-subset@2.0.1, ember-cli-lodash-subset@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-2.0.1.tgz#20cb68a790fe0fde2488ddfd8efbb7df6fe766f2" + integrity sha1-IMtop5D+D94kiN39jvu332/nZvI= ember-cli-lodash-subset@^1.0.7: version "1.0.12" resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-1.0.12.tgz#af2e77eba5dcb0d77f3308d3a6fd7d3450f6e537" + integrity sha1-ry5366XcsNd/MwjTpv19NFD25Tc= ember-cli-node-assets@^0.1.4: version "0.1.6" resolved "https://registry.yarnpkg.com/ember-cli-node-assets/-/ember-cli-node-assets-0.1.6.tgz#6488a2949048c801ad6d9e33753c7bce32fc1146" + integrity sha1-ZIiilJBIyAGtbZ4zdTx7zjL8EUY= dependencies: broccoli-funnel "^1.0.1" broccoli-merge-trees "^1.1.1" @@ -3485,6 +3977,7 @@ ember-cli-node-assets@^0.1.4: ember-cli-node-assets@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/ember-cli-node-assets/-/ember-cli-node-assets-0.2.2.tgz#d2d55626e7cc6619f882d7fe55751f9266022708" + integrity sha1-0tVWJufMZhn4gtf+VXUfkmYCJwg= dependencies: broccoli-funnel "^1.0.1" broccoli-merge-trees "^1.1.1" @@ -3496,16 +3989,19 @@ ember-cli-node-assets@^0.2.2: ember-cli-normalize-entity-name@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-normalize-entity-name/-/ember-cli-normalize-entity-name-1.0.0.tgz#0b14f7bcbc599aa117b5fddc81e4fd03c4bad5b7" + integrity sha1-CxT3vLxZmqEXtf3cgeT9A8S61bc= dependencies: silent-error "^1.0.0" ember-cli-path-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-path-utils/-/ember-cli-path-utils-1.0.0.tgz#4e39af8b55301cddc5017739b77a804fba2071ed" + integrity sha1-Tjmvi1UwHN3FAXc5t3qAT7ogce0= ember-cli-preprocess-registry@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/ember-cli-preprocess-registry/-/ember-cli-preprocess-registry-3.1.1.tgz#38456c21c4d2b64945850cf9ec68db6ba769288a" + integrity sha1-OEVsIcTStklFhQz57Gjba6dpKIo= dependencies: broccoli-clean-css "^1.1.0" broccoli-funnel "^1.0.0" @@ -3519,6 +4015,7 @@ ember-cli-preprocess-registry@^3.1.0: ember-cli-qunit@^4.1.1: version "4.3.1" resolved "https://registry.yarnpkg.com/ember-cli-qunit/-/ember-cli-qunit-4.3.1.tgz#fcbf3585392299b27de26e57d0cf9f9049a76181" + integrity sha1-/L81hTkimbJ94m5X0M+fkEmnYYE= dependencies: ember-cli-babel "^6.11.0" ember-qunit "^3.3.1" @@ -3526,6 +4023,7 @@ ember-cli-qunit@^4.1.1: ember-cli-release@^0.2.9: version "0.2.9" resolved "https://registry.yarnpkg.com/ember-cli-release/-/ember-cli-release-0.2.9.tgz#5e8de3d034c65597933748023058470ec1231adb" + integrity sha1-Xo3j0DTGVZeTN0gCMFhHDsEjGts= dependencies: chalk "^1.0.0" git-tools "^0.1.4" @@ -3540,6 +4038,7 @@ ember-cli-release@^0.2.9: ember-cli-sass@7.1.7: version "7.1.7" resolved "http://registry.npmjs.org/ember-cli-sass/-/ember-cli-sass-7.1.7.tgz#66899134788ec8d2406a45f5346d4db47a2aa012" + integrity sha512-pbqj4/O9WtXQFeFSJkt04yozePl7ksa39veSDIZwPMCAgGnfD0MEXFrn6spprN2YSrFZM0GsUtk/jwYh8x+Qow== dependencies: broccoli-funnel "^1.0.0" broccoli-merge-trees "^1.1.0" @@ -3549,6 +4048,7 @@ ember-cli-sass@7.1.7: ember-cli-shims@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/ember-cli-shims/-/ember-cli-shims-1.2.0.tgz#0f53aff0aab80b5f29da3a9731bac56169dd941f" + integrity sha1-D1Ov8Kq4C18p2jqXMbrFYWndlB8= dependencies: broccoli-file-creator "^1.1.1" broccoli-merge-trees "^2.0.0" @@ -3559,12 +4059,14 @@ ember-cli-shims@^1.2.0: ember-cli-sri@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ember-cli-sri/-/ember-cli-sri-2.1.1.tgz#971620934a4b9183cf7923cc03e178b83aa907fd" + integrity sha1-lxYgk0pLkYPPeSPMA+F4uDqpB/0= dependencies: broccoli-sri-hash "^2.1.0" ember-cli-string-helpers@^1.7.0: version "1.9.0" resolved "https://registry.yarnpkg.com/ember-cli-string-helpers/-/ember-cli-string-helpers-1.9.0.tgz#2c1605bc5768ff58cecd2fa1bd0d13d81e47f3d3" + integrity sha1-LBYFvFdo/1jOzS+hvQ0T2B5H89M= dependencies: broccoli-funnel "^1.0.1" ember-cli-babel "^6.6.0" @@ -3572,10 +4074,12 @@ ember-cli-string-helpers@^1.7.0: ember-cli-string-utils@^1.0.0, ember-cli-string-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz#39b677fc2805f55173735376fcef278eaa4452a1" + integrity sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE= ember-cli-tailwind@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/ember-cli-tailwind/-/ember-cli-tailwind-0.6.2.tgz#bbedc92df4978bd22e6065029fc178b3d3e7d3bb" + integrity sha512-RAtpnGTTyOy0xWWY/JkNy8rI48rWRV1Nzikis5vs/E1L3tWHSEBquwfq2+h7oUpZK3n5uhVPLcp/JAfnyLkztg== dependencies: broccoli-funnel "^2.0.1" broccoli-merge-trees "^3.0.1" @@ -3598,18 +4102,21 @@ ember-cli-tailwind@^0.6.2: ember-cli-test-info@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-test-info/-/ember-cli-test-info-1.0.0.tgz#ed4e960f249e97523cf891e4aed2072ce84577b4" + integrity sha1-7U6WDySel1I8+JHkrtIHLOhFd7Q= dependencies: ember-cli-string-utils "^1.0.0" ember-cli-test-loader@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ember-cli-test-loader/-/ember-cli-test-loader-2.2.0.tgz#3fb8d5d1357e4460d3f0a092f5375e71b6f7c243" + integrity sha512-mlSXX9SciIRwGkFTX6XGyJYp4ry6oCFZRxh5jJ7VH8UXLTNx2ZACtDTwaWtNhYrWXgKyiDUvmD8enD56aePWRA== dependencies: ember-cli-babel "^6.8.1" ember-cli-uglify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ember-cli-uglify/-/ember-cli-uglify-2.0.0.tgz#b096727d7d1718acc9bfe5d1bc81ce26cafdf6ca" + integrity sha1-sJZyfX0XGKzJv+XRvIHOJsr99so= dependencies: broccoli-uglify-sourcemap "^2.0.0" lodash.defaultsdeep "^4.6.0" @@ -3617,18 +4124,21 @@ ember-cli-uglify@^2.0.0: ember-cli-valid-component-name@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-valid-component-name/-/ember-cli-valid-component-name-1.0.0.tgz#71550ce387e0233065f30b30b1510aa2dfbe87ef" + integrity sha1-cVUM44fgIzBl8wswsVEKot++h+8= dependencies: silent-error "^1.0.0" ember-cli-version-checker@^1.1.4: version "1.3.1" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz#0bc2d134c830142da64bf9627a0eded10b61ae72" + integrity sha1-C8LRNMgwFC2mS/lieg7e0QthrnI= dependencies: semver "^5.3.0" ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.1.0.tgz#fc79a56032f3717cf844ada7cbdec1a06fedb604" + integrity sha512-ssiNyVTp+PphroFum8guHX9py4xU1PCxkRYgb25NxumgjpKTPjhkgTfpRRKXlIQe+/wVMmhf+Uv6w9vSLZKWKQ== dependencies: resolve "^1.3.3" semver "^5.3.0" @@ -3636,6 +4146,7 @@ ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0: ember-cli-version-checker@^2.1.1, ember-cli-version-checker@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.1.2.tgz#305ce102390c66e4e0f1432dea9dc5c7c19fed98" + integrity sha512-sjkHGr4IGXnO3EUcY21380Xo9Qf6bC8HWH4D62bVnrQop/8uha5XgMQRoAflMCeH6suMrezQL287JUoYc2smEw== dependencies: resolve "^1.3.3" semver "^5.3.0" @@ -3643,6 +4154,7 @@ ember-cli-version-checker@^2.1.1, ember-cli-version-checker@^2.1.2: ember-cli@~2.18.2: version "2.18.2" resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-2.18.2.tgz#bb15313a15139a85248a86d203643f918ba40f57" + integrity sha1-uxUxOhUTmoUkiobSA2Q/kYukD1c= dependencies: amd-name-resolver "1.0.0" babel-plugin-transform-es2015-modules-amd "^6.24.0" @@ -3732,6 +4244,7 @@ ember-cli@~2.18.2: ember-code-snippet@^2.2.0: version "2.2.2" resolved "https://registry.yarnpkg.com/ember-code-snippet/-/ember-code-snippet-2.2.2.tgz#2327e105c9101cb02437873c70297bcb365e474a" + integrity sha512-FYp7kfZCVOSEMjW2VvNh9DO9yQDw2kg/mxVMjyZBRTwyg4mhrS5vQFa2+Xoy1fko1L4DRcQoNCTa4OnshExwaA== dependencies: broccoli-flatiron "^0.1.3" broccoli-merge-trees "^1.0.0" @@ -3743,6 +4256,7 @@ ember-code-snippet@^2.2.0: ember-compatibility-helpers@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.0.2.tgz#a7eb8969747d063720fe44658af5448589b437ba" + integrity sha512-pN1ezLiAM+uIKI4/BMp2hIBi6LQKxOedxKcu2mHDK+HEYuhlwki8Y2YwFSwb1w3c2YhesbkwaAJx/dvNHQGq5g== dependencies: babel-plugin-debug-macros "^0.1.11" ember-cli-version-checker "^2.1.1" @@ -3751,6 +4265,7 @@ ember-compatibility-helpers@^1.0.0: ember-component-css@0.6.5: version "0.6.5" resolved "https://registry.yarnpkg.com/ember-component-css/-/ember-component-css-0.6.5.tgz#b07a7e53e224f8b254a1ad3ce2f848afb87e3617" + integrity sha512-tY5Wl/qB8W2FTn6CoDCH0FxLjV3jrMOWH9ema9CAIWWsO8HUuGlAqn3KkjPETPYdSwOa47NevZIp+dBpehMLww== dependencies: broccoli-concat "^3.2.2" broccoli-funnel "^2.0.1" @@ -3772,6 +4287,7 @@ ember-component-css@0.6.5: ember-composable-helpers@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-2.1.0.tgz#71f75ab2de1c696d21939b5f9dcc62eaf2c947e5" + integrity sha512-H6KCyB/BzjR18MxQFcQQR5MDRmawCmCCZKHQTEpAwhs5wCDhnMMLUGINan+sY4NRPrStfpUlMoGg9fsksN2wJA== dependencies: broccoli-funnel "^1.0.1" ember-cli-babel "^6.6.0" @@ -3779,6 +4295,7 @@ ember-composable-helpers@^2.1.0: ember-concurrency@^0.8.16: version "0.8.19" resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-0.8.19.tgz#71b9c175ba077865310029cb4bdb880e17d5155e" + integrity sha1-cbnBdboHeGUxACnLS9uIDhfVFV4= dependencies: babel-core "^6.24.1" ember-cli-babel "^6.8.2" @@ -3787,12 +4304,14 @@ ember-concurrency@^0.8.16: ember-copy@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-copy/-/ember-copy-1.0.0.tgz#426554ba6cf65920f31d24d0a3ca2cb1be16e4aa" + integrity sha512-aiZNAvOmdemHdvZNn0b5b/0d9g3JFpcOsrDgfhYEbfd7SzE0b69YiaVK2y3wjqfjuuiA54vOllGN4pjSzECNSw== dependencies: ember-cli-babel "^6.6.0" "ember-data@2.x - 3.x": version "3.4.2" resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.4.2.tgz#675cc4f1be8df1f5c0bfe4191afa6986377721c0" + integrity sha512-YYvNDNJ0ySiLED7xUxsR3TdRycCKQ7Avy5QIFc7PajDUODppZBqye1XCfJFDSZQ0sjs5w19mKntOVwsVdQGXIw== dependencies: "@ember/ordered-set" "^2.0.0" babel-plugin-feature-flags "^0.3.1" @@ -3824,6 +4343,7 @@ ember-copy@^1.0.0: ember-data@~2.13.0: version "2.13.2" resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-2.13.2.tgz#151c93ad5152885d4ca50b1942d7c66e15865c74" + integrity sha1-FRyTrVFSiF1MpQsZQtfGbhWGXHQ= dependencies: amd-name-resolver "0.0.5" babel-plugin-feature-flags "^0.3.1" @@ -3852,22 +4372,26 @@ ember-data@~2.13.0: ember-disable-prototype-extensions@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/ember-disable-prototype-extensions/-/ember-disable-prototype-extensions-1.1.3.tgz#1969135217654b5e278f9fe2d9d4e49b5720329e" + integrity sha1-GWkTUhdlS14nj5/i2dTkm1cgMp4= ember-export-application-global@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ember-export-application-global/-/ember-export-application-global-2.0.0.tgz#8d6d7619ac8a1a3f8c43003549eb21ebed685bd2" + integrity sha1-jW12GayKGj+MQwA1Sesh6+1oW9I= dependencies: ember-cli-babel "^6.0.0-beta.7" ember-factory-for-polyfill@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/ember-factory-for-polyfill/-/ember-factory-for-polyfill-1.3.1.tgz#b446ed64916d293c847a4955240eb2c993b86eae" + integrity sha512-y3iG2iCzH96lZMTWQw6LWNLAfOmDC4pXKbZP6FxG8lt7GGaNFkZjwsf+Z5GAe7kxfD7UG4lVkF7x37K82rySGA== dependencies: ember-cli-version-checker "^2.1.0" ember-fastboot-addon-tests@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/ember-fastboot-addon-tests/-/ember-fastboot-addon-tests-0.4.0.tgz#05f89f2cc4bd53d6abd6d952bbdde7c8af03a6f7" + integrity sha1-BfifLMS9U9ar1tlSu93nyK8Dpvc= dependencies: chalk "^1.1.3" core-object "^2.0.6" @@ -3885,12 +4409,14 @@ ember-fastboot-addon-tests@^0.4.0: ember-fetch-adapter@^0.4.2: version "0.4.3" resolved "https://registry.yarnpkg.com/ember-fetch-adapter/-/ember-fetch-adapter-0.4.3.tgz#c3d2da83ff87f829ab347b841a3201b3cc7e1eb4" + integrity sha1-w9Lag/+H+CmrNHuEGjIBs8x+HrQ= dependencies: ember-cli-babel "^6.12.0" ember-fetch@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-4.0.2.tgz#865ca90d8aa63b9ebe5bce709aeaa44b35668b5a" + integrity sha512-kP7OWvd3uEnfnSXZCrKEstheQrleIbqqbrpjCzDU/I4uvuVVnJJUqZRz6triDABqQPwPkHwRjZpZqsuDsKKRNw== dependencies: abortcontroller-polyfill "^1.1.9" broccoli-concat "^3.2.2" @@ -3904,6 +4430,7 @@ ember-fetch@^4.0.2: ember-get-config@^0.2.2: version "0.2.4" resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.2.4.tgz#118492a2a03d73e46004ed777928942021fe1ecd" + integrity sha1-EYSSoqA9c+RgBO13eSiUICH+Hs0= dependencies: broccoli-file-creator "^1.1.1" ember-cli-babel "^6.3.0" @@ -3911,6 +4438,7 @@ ember-get-config@^0.2.2: ember-getowner-polyfill@^2.0.1, ember-getowner-polyfill@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ember-getowner-polyfill/-/ember-getowner-polyfill-2.2.0.tgz#38e7dccbcac69d5ec694000329ec0b2be651d2b2" + integrity sha512-rwGMJgbGzxIAiWYjdpAh04Abvt0s3HuS/VjHzUFhVyVg2pzAuz45B9AzOxYXzkp88vFC7FPaiA4kE8NxNk4A4Q== dependencies: ember-cli-version-checker "^2.1.0" ember-factory-for-polyfill "^1.3.1" @@ -3918,6 +4446,7 @@ ember-getowner-polyfill@^2.0.1, ember-getowner-polyfill@^2.2.0: ember-hash-helper-polyfill@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/ember-hash-helper-polyfill/-/ember-hash-helper-polyfill-0.2.1.tgz#73b074d8e2f7183d2e68c3df77e951097afa907c" + integrity sha512-bEiKQeWGjswH1ykVY1zXabambolEPDwQCPuYOgUoRyEV4JFR9h91s3c8PNNy2pjoYBLkIYuCk4F4POJJLmDPjw== dependencies: ember-cli-babel "^6.8.2" ember-cli-version-checker "^2.1.0" @@ -3925,6 +4454,7 @@ ember-hash-helper-polyfill@^0.2.0: ember-href-to@^1.15.1: version "1.15.1" resolved "https://registry.yarnpkg.com/ember-href-to/-/ember-href-to-1.15.1.tgz#1ba20ec201245c7cae7e2aa3eec50eb2aa25b729" + integrity sha1-G6IOwgEkXHyufiqj7sUOsqoltyk= dependencies: ember-cli-babel "^6.8.2" ember-router-service-polyfill "^1.0.2" @@ -3932,36 +4462,42 @@ ember-href-to@^1.15.1: ember-ignore-children-helper@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ember-ignore-children-helper/-/ember-ignore-children-helper-1.0.1.tgz#f7c4aa17afb9c5685e1d4dcdb61c7b138ca7cdc3" + integrity sha512-AgKkrvd1/hIBWdLn42gITlweVsALUGPYF9fMpQ2IDqp7QnRmtO8ocRbZEmMddPDWY9Xu7W5qO2f35rbD7OSpYw== dependencies: ember-cli-babel "^6.8.2" ember-inflector@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-2.1.0.tgz#afcb92d022a4eab58f08ff4578eafc3a1de2d09b" + integrity sha512-o7X+MdPuMgH6GGP8JsZ6mr+WYiCcymzjPLr0ct2IUw4lh1EwVtmePuY6fBLuWmyQE1nJq4smDyNoOCE74n3f7g== dependencies: ember-cli-babel "^6.0.0" ember-inflector@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-3.0.0.tgz#7e1ee8aaa0fa773ba0905d8b7c0786354d890ee1" + integrity sha512-tLWfYolZAkLnkTvvBkjizy4Wmj8yI8wqHZFK+leh0iScHiC3r1Yh5C4qO+OMGiBTMLwfTy+YqVoE/Nu3hGNkcA== dependencies: ember-cli-babel "^6.6.0" ember-keyboard@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/ember-keyboard/-/ember-keyboard-3.0.2.tgz#839ab5c32a6b3d3ce0b735728c1e1bc362107464" + integrity sha512-6P+icQPlSxKsR0jxfuCTFKMX55Ekh7EwYl39bTpaiPFYtrhlDLjPp+ibS0oYuas9l1V+fTOXH3OV7e0/grGSZQ== dependencies: ember-cli-babel "^6.6.0" ember-load-initializers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-1.0.0.tgz#4919eaf06f6dfeca7e134633d8c05a6c9921e6e7" + integrity sha1-SRnq8G9t/sp+E0Yz2MBabJkh5uc= dependencies: ember-cli-babel "^6.0.0-beta.7" ember-lodash@^4.17.3: version "4.18.0" resolved "https://registry.yarnpkg.com/ember-lodash/-/ember-lodash-4.18.0.tgz#45de700d6a4f68f1cd62888d90b50aa6477b9a83" + integrity sha1-Rd5wDWpPaPHNYoiNkLUKpkd7moM= dependencies: broccoli-debug "^0.6.1" broccoli-funnel "^2.0.1" @@ -3973,6 +4509,7 @@ ember-lodash@^4.17.3: ember-maybe-import-regenerator@^0.1.5: version "0.1.6" resolved "https://registry.yarnpkg.com/ember-maybe-import-regenerator/-/ember-maybe-import-regenerator-0.1.6.tgz#35d41828afa6d6a59bc0da3ce47f34c573d776ca" + integrity sha1-NdQYKK+m1qWbwNo85H80xXPXdso= dependencies: broccoli-funnel "^1.0.1" broccoli-merge-trees "^1.0.0" @@ -3982,6 +4519,7 @@ ember-maybe-import-regenerator@^0.1.5: ember-modal-dialog@2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/ember-modal-dialog/-/ember-modal-dialog-2.4.3.tgz#8e254185e95dae6ccf46987822a095acf42561b1" + integrity sha1-jiVBheldrmzPRph4IqCVrPQlYbE= dependencies: ember-cli-babel "^6.8.2" ember-cli-htmlbars "^2.0.1" @@ -3992,6 +4530,7 @@ ember-modal-dialog@2.4.3: ember-qunit@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-3.3.1.tgz#8d68ef30cfd6f2acbf1d0f4e368439642e726903" + integrity sha512-ZRQCDitCx4aLKKIvQEIfeFKHAWOkqwT4xg2E0fAbP4yptCJKPz/pCf0G0suW6YFpx7zI3qsbXKVZMeOGbqbmfw== dependencies: "@ember/test-helpers" "^0.7.17" broccoli-funnel "^2.0.1" @@ -4004,6 +4543,7 @@ ember-qunit@^3.3.1: ember-resolver@^4.0.0: version "4.5.0" resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-4.5.0.tgz#9248bf534dfc197fafe3118fff538d436078bf99" + integrity sha512-BX8yvFWIbrh1IVZmpIY/14WUb7nD8tQzT5s0aUG/Nwq2LVqD/uNAEPcsq0XS2gLvKawwDQEQN30ptcvJApQBhA== dependencies: "@glimmer/resolver" "^0.4.1" babel-plugin-debug-macros "^0.1.10" @@ -4016,30 +4556,36 @@ ember-resolver@^4.0.0: ember-responsive@^3.0.0-beta.1: version "3.0.0-beta.3" resolved "https://registry.yarnpkg.com/ember-responsive/-/ember-responsive-3.0.0-beta.3.tgz#63f4f5cad179399e40cd6a591bb2677c4cc0a874" + integrity sha512-C7E0C/hKy5BT5tjHxzyLItc7Bq/Ci/IoUucQ1OQts81Uxq0SG4srjbfO0ZlDq6nbV7xxe9xdPMPD5tPHii8W2w== dependencies: ember-cli-babel "^6.6.0" ember-rfc176-data@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.2.7.tgz#bd355bc9b473e08096b518784170a23388bc973b" + integrity sha512-pJE2w+sI22UDsYmudI4nCp3WcImpUzXwe9qHfpOcEu3yM/HD1nGpDRt6kZD0KUnDmqkLeik/nYyzEwN/NU6xxA== ember-rfc176-data@^0.3.0, ember-rfc176-data@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.1.tgz#6a5a4b8b82ec3af34f3010965fa96b936ca94519" + integrity sha512-u+W5rUvYO7xyKJjiPuCM7bIAvFyPwPTJ66fOZz1xuCv3AyReI9Oev5oOADOO6YJZk+vEn0xWiZ9N6zSf8WU7Fg== ember-rfc176-data@^0.3.5: version "0.3.5" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.5.tgz#f630e550572c81a5e5c7220f864c0f06eee9e977" + integrity sha512-5NfL1iTkIQDYs16/IZ7/jWCEglNsUrigLelBkBMsNcib9T3XzQwmhhVTjoSsk66s57LmWJ1bQu+2c1CAyYCV7A== ember-router-generator@^1.0.0, ember-router-generator@^1.2.2, ember-router-generator@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-1.2.3.tgz#8ed2ca86ff323363120fc14278191e9e8f1315ee" + integrity sha1-jtLKhv8yM2MSD8FCeBkeno8TFe4= dependencies: recast "^0.11.3" ember-router-scroll@^0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/ember-router-scroll/-/ember-router-scroll-0.7.1.tgz#0fc4b9be116ef97ce974938104cc766f4e56a127" + integrity sha1-D8S5vhFu+XzpdJOBBMx2b05WoSc= dependencies: ember-app-scheduler "^1.0.1" ember-cli-babel "^6.6.0" @@ -4048,12 +4594,14 @@ ember-router-scroll@^0.7.1: ember-router-service-polyfill@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/ember-router-service-polyfill/-/ember-router-service-polyfill-1.0.3.tgz#506d7fbd7179951410b7ffe8db171540601d88b1" + integrity sha1-UG1/vXF5lRQQt//o2xcVQGAdiLE= dependencies: ember-cli-babel "^6.8.2" ember-runtime-enumerable-includes-polyfill@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-runtime-enumerable-includes-polyfill/-/ember-runtime-enumerable-includes-polyfill-2.1.0.tgz#dc6d4a028471e4acc350dfd2a149874fb20913f5" + integrity sha512-au18iI8VbEDYn3jLFZzETnKN5ciPgCUxMRucEP3jkq7qZ6sE0FVKpWMPY/h9tTND3VOBJt6fgPpEBJoJVCUudg== dependencies: ember-cli-babel "^6.9.0" ember-cli-version-checker "^2.1.0" @@ -4061,6 +4609,7 @@ ember-runtime-enumerable-includes-polyfill@^2.0.0: ember-source@~2.18.0: version "2.18.1" resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-2.18.1.tgz#bc02fc809f9e9b68d63e790aa3fac16bc6242bd5" + integrity sha1-vAL8gJ+em2jWPnkKo/rBa8YkK9U= dependencies: broccoli-funnel "^2.0.1" broccoli-merge-trees "^2.0.0" @@ -4080,6 +4629,7 @@ ember-source@~2.18.0: ember-svg-jar@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ember-svg-jar/-/ember-svg-jar-1.2.1.tgz#a6f2c2404eec72aaa819b66407cec0ebe72be99b" + integrity sha512-gGYUBwTRav/6ygcPCjJu8MIVguMSO6w5prpcoEfG+20+JyMQqritTWpwZTkRb5gov6bgOoJBUzpNEKZGm9glXA== dependencies: broccoli-caching-writer "^3.0.3" broccoli-funnel "^2.0.1" @@ -4097,6 +4647,7 @@ ember-svg-jar@^1.2.1: ember-tether@^1.0.0-beta.2: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-tether/-/ember-tether-1.0.0.tgz#6117ea7351927887cb74fa5d46097dd300280c2d" + integrity sha1-YRfqc1GSeIfLdPpdRgl90wAoDC0= dependencies: ember-cli-babel "^6.6.0" ember-cli-node-assets "^0.2.2" @@ -4105,12 +4656,14 @@ ember-tether@^1.0.0-beta.2: ember-truth-helpers@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-truth-helpers/-/ember-truth-helpers-2.1.0.tgz#d4dab4eee7945aa2388126485977baeb33ca0798" + integrity sha512-BQlU8aTNl1XHKTYZ243r66yqtR9JU7XKWQcmMA+vkqfkE/c9WWQ9hQZM8YABihCmbyxzzZsngvldokmeX5GhAw== dependencies: ember-cli-babel "^6.6.0" ember-try-config@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ember-try-config/-/ember-try-config-2.2.0.tgz#6be0af6c71949813e02ac793564fddbf8336b807" + integrity sha1-a+CvbHGUmBPgKseTVk/dv4M2uAc= dependencies: lodash "^4.6.1" node-fetch "^1.3.3" @@ -4120,6 +4673,7 @@ ember-try-config@^2.2.0: ember-try@^0.2.15: version "0.2.23" resolved "https://registry.yarnpkg.com/ember-try/-/ember-try-0.2.23.tgz#39b57141b4907541d0ac8b503d211e6946b08718" + integrity sha512-kmVNsSFFafGinFhERMox3SXHoU+V1td1538SbhpslPtf7S2BZYr7JdAwOCIRoRtpcWeNdYgdQGzJZxNvUc8aLg== dependencies: chalk "^1.0.0" cli-table2 "^0.2.0" @@ -4137,6 +4691,7 @@ ember-try@^0.2.15: ember-wormhole@^0.5.1: version "0.5.4" resolved "https://registry.yarnpkg.com/ember-wormhole/-/ember-wormhole-0.5.4.tgz#968e80f093494f4aed266e750afa63919c61383d" + integrity sha1-lo6A8JNJT0rtJm51CvpjkZxhOD0= dependencies: ember-cli-babel "^6.10.0" ember-cli-htmlbars "^2.0.1" @@ -4144,16 +4699,19 @@ ember-wormhole@^0.5.1: encodeurl@~1.0.1, encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= encoding@^0.1.11: version "0.1.12" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= dependencies: iconv-lite "~0.4.13" engine.io-client@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.0.tgz#7b730e4127414087596d9be3c88d2bc5fdb6cf5c" + integrity sha1-e3MOQSdBQIdZbZvjyI0rxf22z1w= dependencies: component-emitter "1.2.1" component-inherit "0.0.3" @@ -4171,6 +4729,7 @@ engine.io-client@1.8.0: engine.io-parser@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.1.tgz#9554f1ae33107d6fbd170ca5466d2f833f6a07cf" + integrity sha1-lVTxrjMQfW+9FwylRm0vgz9qB88= dependencies: after "0.8.1" arraybuffer.slice "0.0.6" @@ -4182,6 +4741,7 @@ engine.io-parser@1.3.1: engine.io@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.0.tgz#3eeb5f264cb75dbbec1baaea26d61f5a4eace2aa" + integrity sha1-PutfJky3XbvsG6rqJtYfWk6s4qo= dependencies: accepts "1.3.3" base64id "0.1.0" @@ -4193,24 +4753,29 @@ engine.io@1.8.0: ensure-posix-path@^1.0.0, ensure-posix-path@^1.0.1, ensure-posix-path@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.0.2.tgz#a65b3e42d0b71cfc585eb774f9943c8d9b91b0c2" + integrity sha1-pls+QtC3HPxYXrd0+ZQ8jZuRsMI= entities@1.0: version "1.0.0" resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" + integrity sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY= entities@^1.1.1, entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + integrity sha1-blwtClYhtdra7O+AuQ7ftc13cvA= error-ex@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + integrity sha1-+FWobOYa3E6GIcPNoh56dhLDqNw= dependencies: is-arrayish "^0.2.1" error@^7.0.0: version "7.0.2" resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02" + integrity sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI= dependencies: string-template "~0.2.1" xtend "~4.0.0" @@ -4218,26 +4783,32 @@ error@^7.0.0: es6-promise@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-1.0.0.tgz#f90d3629faa7c26166ae4df77c89bacdeb8dca7f" + integrity sha1-+Q02KfqnwmFmrk33fIm6zeuNyn8= es6-promise@^3.0.2: version "3.3.1" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + integrity sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM= es6-promise@^4.0.3: version "4.2.4" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" + integrity sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ== escape-html@1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= escape-string-regexp@1.0.5, escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escodegen@^1.6.1: version "1.9.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852" + integrity sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw== dependencies: esprima "^3.1.3" estraverse "^4.2.0" @@ -4249,6 +4820,7 @@ escodegen@^1.6.1: escodegen@^1.9.1: version "1.11.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" + integrity sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw== dependencies: esprima "^3.1.3" estraverse "^4.2.0" @@ -4260,10 +4832,12 @@ escodegen@^1.9.1: esdoc-accessor-plugin@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/esdoc-accessor-plugin/-/esdoc-accessor-plugin-1.0.0.tgz#791ba4872e6c403515ce749b1348d6f0293ad9eb" + integrity sha1-eRukhy5sQDUVznSbE0jW8Ck62es= esdoc-ecmascript-proposal-plugin@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/esdoc-ecmascript-proposal-plugin/-/esdoc-ecmascript-proposal-plugin-1.0.0.tgz#390dc5656ba8a2830e39dba3570d79138df2ffd9" + integrity sha1-OQ3FZWuoooMOOdujVw15E43y/9k= esdoc@pzuraq/esdoc#015a342: version "1.0.4" @@ -4284,12 +4858,14 @@ esdoc@pzuraq/esdoc#015a342: eslint-plugin-ember-suave@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-plugin-ember-suave/-/eslint-plugin-ember-suave-1.0.0.tgz#ea7d232a126562dcd8b1ee3aa2700ac3b626e514" + integrity sha1-6n0jKhJlYtzYse46onAKw7Ym5RQ= dependencies: requireindex "~1.1.0" eslint-plugin-ember@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-5.0.3.tgz#9f5e2048ab3ddc1548d4d17bf318cf1bb5cf37f1" + integrity sha512-wPq2N96YQR2/Ob2LfuLQV8BEotHXxiFcuBiHikN8P+2VGzxBeuydafXy/pExuTsU2RHfPiSgyBHavKGy1DYdrQ== dependencies: ember-rfc176-data "^0.2.7" require-folder-tree "^1.4.5" @@ -4298,6 +4874,7 @@ eslint-plugin-ember@^5.0.0: eslint-plugin-node@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-6.0.1.tgz#bf19642298064379315d7a4b2a75937376fa05e4" + integrity sha512-Q/Cc2sW1OAISDS+Ji6lZS2KV4b7ueA/WydVWd1BECTQwVvfQy5JAi3glhINoKzoMnfnuRgNP+ZWKrGAbp3QDxw== dependencies: ignore "^3.3.6" minimatch "^3.0.4" @@ -4307,6 +4884,7 @@ eslint-plugin-node@^6.0.1: eslint-scope@3.7.1, eslint-scope@^3.7.1: version "3.7.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug= dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" @@ -4314,10 +4892,12 @@ eslint-scope@3.7.1, eslint-scope@^3.7.1: eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== eslint@^4.0.0: version "4.17.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.17.0.tgz#dc24bb51ede48df629be7031c71d9dc0ee4f3ddf" + integrity sha512-AyxBUCANU/o/xC0ijGMKavo5Ls3oK6xykiOITlMdjFjrKOsqLrA7Nf5cnrDgcKrHzBirclAZt63XO7YZlVUPwA== dependencies: ajv "^5.3.0" babel-code-frame "^6.22.0" @@ -4360,6 +4940,7 @@ eslint@^4.0.0: espree@^3.5.2: version "3.5.3" resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.3.tgz#931e0af64e7fbbed26b050a29daad1fc64799fa6" + integrity sha512-Zy3tAJDORxQZLl2baguiRU1syPERAIg0L+JB2MWorORgTu/CplzvxS9WWA7Xh4+Q+eOQihNs/1o1Xep8cvCxWQ== dependencies: acorn "^5.4.0" acorn-jsx "^3.0.0" @@ -4367,28 +4948,34 @@ espree@^3.5.2: esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= esprima@^3.1.3, esprima@~3.1.0: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= esprima@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + integrity sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw== esprima@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.0.0.tgz#53cf247acda77313e551c3aa2e73342d3fb4f7d9" + integrity sha1-U88kes2ncxPlUcOqLnM0LT+099k= esquery@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" + integrity sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo= dependencies: estraverse "^4.0.0" esrecurse@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" + integrity sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM= dependencies: estraverse "^4.1.0" object-assign "^4.0.1" @@ -4396,30 +4983,37 @@ esrecurse@^4.1.0: estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= estree-walker@^0.5.0, estree-walker@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.2.tgz#d3850be7529c9580d815600b53126515e146dd39" + integrity sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig== esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= eventemitter3@1.x.x: version "1.2.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" + integrity sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg= events-to-array@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/events-to-array/-/events-to-array-1.1.2.tgz#2d41f563e1fe400ed4962fe1a4d5c6a7539df7f6" + integrity sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y= exec-file-sync@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/exec-file-sync/-/exec-file-sync-2.0.2.tgz#58d441db46e40de6d1f30de5be022785bd89e328" + integrity sha1-WNRB20bkDebR8w3lvgInhb2J4yg= dependencies: is-obj "^1.0.0" object-assign "^4.0.1" @@ -4428,12 +5022,14 @@ exec-file-sync@^2.0.0: exec-sh@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" + integrity sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg== dependencies: merge "^1.1.3" execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" @@ -4446,6 +5042,7 @@ execa@^0.7.0: execa@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" + integrity sha1-2NdrvBtVIX7RkP1t1J08d07PyNo= dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" @@ -4458,6 +5055,7 @@ execa@^0.8.0: execa@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.9.0.tgz#adb7ce62cf985071f60580deb4a88b9e34712d01" + integrity sha512-BbUMBiX4hqiHZUA5+JujIjNb6TyAlp2D5KLheMjMluwOuzcnylDL4AxZYLLn1n2AGB49eSWwyKvvEQoRpnAtmA== dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" @@ -4470,36 +5068,44 @@ execa@^0.9.0: exif-parser@^0.1.9: version "0.1.12" resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922" + integrity sha1-WKnS1ywCwfbwKg70qRZicrd2CSI= exists-stat@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/exists-stat/-/exists-stat-1.0.0.tgz#0660e3525a2e89d9e446129440c272edfa24b529" + integrity sha1-BmDjUlouidnkRhKUQMJy7foktSk= exists-sync@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.3.tgz#b910000bedbb113b378b82f5f5a7638107622dcf" + integrity sha1-uRAAC+27ETs3i4L19adjgQdiLc8= exists-sync@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.4.tgz#9744c2c428cc03b01060db454d4b12f0ef3c8879" + integrity sha1-l0TCxCjMA7AQYNtFTUsS8O88iHk= exit-hook@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g= exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= dependencies: is-posix-bracket "^0.1.0" expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= dependencies: debug "^2.3.3" define-property "^0.2.5" @@ -4512,24 +5118,28 @@ expand-brackets@^2.1.4: expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= dependencies: fill-range "^2.1.0" expand-tilde@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" + integrity sha1-C4HrqJflo9MdHD0QL48BRB5VlEk= dependencies: os-homedir "^1.0.1" expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= dependencies: homedir-polyfill "^1.0.1" express@^4.10.7, express@^4.12.3: version "4.16.2" resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" + integrity sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w= dependencies: accepts "~1.3.4" array-flatten "1.1.1" @@ -4565,6 +5175,7 @@ express@^4.10.7, express@^4.12.3: express@^4.13.1: version "4.16.3" resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" + integrity sha1-avilAjUNsyRuzEvs9rWjTSL37VM= dependencies: accepts "~1.3.5" array-flatten "1.1.1" @@ -4600,12 +5211,14 @@ express@^4.13.1: extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" @@ -4613,14 +5226,17 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + integrity sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ= extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== external-editor@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-1.1.1.tgz#12d7b0db850f7ff7e7081baf4005700060c4600b" + integrity sha1-Etew24UPf/fnCBuvQAVwAGDEYAs= dependencies: extend "^3.0.0" spawn-sync "^1.0.15" @@ -4629,6 +5245,7 @@ external-editor@^1.1.0: external-editor@^2.0.4: version "2.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" + integrity sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA== dependencies: chardet "^0.4.0" iconv-lite "^0.4.17" @@ -4637,12 +5254,14 @@ external-editor@^2.0.4: extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= dependencies: is-extglob "^1.0.0" extglob@^2.0.2, extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== dependencies: array-unique "^0.3.2" define-property "^1.0.0" @@ -4656,6 +5275,7 @@ extglob@^2.0.2, extglob@^2.0.4: extract-zip@^1.6.5: version "1.6.7" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" + integrity sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k= dependencies: concat-stream "1.6.2" debug "2.6.9" @@ -4665,40 +5285,49 @@ extract-zip@^1.6.5: extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= extsprintf@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= fake-xml-http-request@^1.4.0, fake-xml-http-request@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-1.6.0.tgz#bd0ac79ae3e2660098282048a12c730a6f64d550" + integrity sha512-99XPwwSg89BfzPuv4XCpZxn3EbauMCgAQCxq9MzrvS6DFD73OON6AnUTicL4A0HZtYMBwCZBWVnRqGjZDgQkTg== faker@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/faker/-/faker-3.1.0.tgz#0f908faf4e6ec02524e54a57e432c5c013e08c9f" + integrity sha1-D5CPr05uwCUk5UpX5DLFwBPgjJ8= fast-deep-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + integrity sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8= fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fast-ordered-set@^1.0.0, fast-ordered-set@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/fast-ordered-set/-/fast-ordered-set-1.0.3.tgz#3fbb36634f7be79e4f7edbdb4a357dee25d184eb" + integrity sha1-P7s2Y097555PftvbSjV97iXRhOs= dependencies: blank-object "^1.0.1" fast-sourcemap-concat@^1.0.1: version "1.2.3" resolved "https://registry.yarnpkg.com/fast-sourcemap-concat/-/fast-sourcemap-concat-1.2.3.tgz#22f14e92d739e37920334376ec8433bf675eaa04" + integrity sha1-IvFOktc543kgM0N27IQzv2deqgQ= dependencies: chalk "^0.5.1" fs-extra "^0.30.0" @@ -4713,6 +5342,7 @@ fast-sourcemap-concat@^1.0.1: fastboot-express-middleware@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/fastboot-express-middleware/-/fastboot-express-middleware-1.2.0.tgz#3f32fb21d8d01ad7c0c7d876b278601665ea17fa" + integrity sha1-PzL7IdjQGtfAx9h2snhgFmXqF/o= dependencies: chalk "^2.0.1" fastboot "^1.2.0" @@ -4721,12 +5351,14 @@ fastboot-express-middleware@^1.1.0: fastboot-transform@0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/fastboot-transform/-/fastboot-transform-0.1.1.tgz#de55550d85644ec94cb11264c2ba883e3ea3b255" + integrity sha512-aY3wh4kFCYOZWZM88f2svB9OL8UNpqBtOQxV3hHxjeRncQUKLD81I2GXayIFaGEQiS8g34awXfq46WZv8uIHvQ== dependencies: broccoli-stew "^1.5.0" fastboot-transform@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/fastboot-transform/-/fastboot-transform-0.1.3.tgz#7dea0b117594afd8772baa6c9b0919644e7f7dcd" + integrity sha512-6otygPIJw1ARp1jJb+6KVO56iKBjhO+5x59RSC9qiZTbZRrv+HZAuP00KD3s+nWMvcFDemtdkugki9DNFTTwCQ== dependencies: broccoli-stew "^1.5.0" convert-source-map "^1.5.1" @@ -4734,6 +5366,7 @@ fastboot-transform@^0.1.2: fastboot@^1.1.4-beta.1, fastboot@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-1.2.0.tgz#35c5747db1943d082f2ba619226d16cd7281e946" + integrity sha1-NcV0fbGUPQgvK6YZIm0WzXKB6UY= dependencies: chalk "^2.0.1" cookie "^0.3.1" @@ -4747,6 +5380,7 @@ fastboot@^1.1.4-beta.1, fastboot@^1.2.0: favicons@^4.7.1: version "4.8.6" resolved "https://registry.yarnpkg.com/favicons/-/favicons-4.8.6.tgz#a2b13800ab3fec2715bc8f27fa841d038d4761e2" + integrity sha1-orE4AKs/7CcVvI8n+oQdA41HYeI= dependencies: async "^1.5.0" cheerio "^0.19.0" @@ -4770,30 +5404,35 @@ favicons@^4.7.1: faye-websocket@~0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= dependencies: websocket-driver ">=0.5.1" fb-watchman@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= dependencies: bser "^2.0.0" fd-slicer@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + integrity sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU= dependencies: pend "~1.2.0" figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= dependencies: escape-string-regexp "^1.0.5" file-entry-cache@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= dependencies: flat-cache "^1.2.1" object-assign "^4.0.1" @@ -4801,18 +5440,22 @@ file-entry-cache@^2.0.0: file-type@^3.1.0, file-type@^3.8.0: version "3.9.0" resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" + integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek= filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= filesize@^3.1.3: version "3.6.0" resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.0.tgz#22d079615624bb6fd3c04026120628a41b3f4efa" + integrity sha512-g5OWtoZWcPI56js1DFhIEqyG9tnu/7sG3foHwgS9KGYFMfsYguI3E+PRVCmtmE96VajQIEMRU2OhN+ME589Gdw== fill-range@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + integrity sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM= dependencies: is-number "^2.1.0" isobject "^2.0.0" @@ -4823,6 +5466,7 @@ fill-range@^2.1.0: fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" @@ -4832,6 +5476,7 @@ fill-range@^4.0.0: finalhandler@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" + integrity sha1-zgtoVbRYU+eRsvzGgARtiCU91/U= dependencies: debug "2.6.9" encodeurl "~1.0.1" @@ -4844,6 +5489,7 @@ finalhandler@1.1.0: finalhandler@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== dependencies: debug "2.6.9" encodeurl "~1.0.2" @@ -4856,10 +5502,12 @@ finalhandler@1.1.1: find-index@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-index/-/find-index-1.1.0.tgz#53007c79cd30040d6816d79458e8837d5c5705ef" + integrity sha1-UwB8ec0wBA1oFteUWOiDfVxXBe8= find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= dependencies: path-exists "^2.0.0" pinkie-promise "^2.0.0" @@ -4867,12 +5515,14 @@ find-up@^1.0.0: find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= dependencies: locate-path "^2.0.0" findup-sync@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" + integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= dependencies: detect-file "^1.0.0" is-glob "^3.1.0" @@ -4882,6 +5532,7 @@ findup-sync@2.0.0: findup-sync@^0.4.2: version "0.4.3" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" + integrity sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI= dependencies: detect-file "^0.1.0" is-glob "^2.0.1" @@ -4891,6 +5542,7 @@ findup-sync@^0.4.2: findup-sync@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-1.0.0.tgz#6f7e4b57b6ee3a4037b4414eaedea3f58f71e0ec" + integrity sha1-b35LV7buOkA3tEFOrt6j9Y9x4Ow= dependencies: detect-file "^0.1.0" is-glob "^2.0.1" @@ -4900,6 +5552,7 @@ findup-sync@^1.0.0: fireworm@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/fireworm/-/fireworm-0.7.1.tgz#ccf20f7941f108883fcddb99383dbe6e1861c758" + integrity sha1-zPIPeUHxCIg/zduZOD2+bhhhx1g= dependencies: async "~0.2.9" is-type "0.0.1" @@ -4910,6 +5563,7 @@ fireworm@^0.7.0: fixturify@^0.3.2: version "0.3.4" resolved "https://registry.yarnpkg.com/fixturify/-/fixturify-0.3.4.tgz#c676de404a7f8ee8e64d0b76118e62ec95ab7b25" + integrity sha512-Gx+KSB25b6gMc4bf7UFRTA85uE0iZR+RYur0JHh6dg4AGBh0EksOv4FCHyM7XpGmiJO7Bc7oV7vxENQBT+2WEQ== dependencies: fs-extra "^0.30.0" matcher-collection "^1.0.4" @@ -4917,6 +5571,7 @@ fixturify@^0.3.2: flat-cache@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + integrity sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE= dependencies: circular-json "^0.3.1" del "^2.0.2" @@ -4926,30 +5581,36 @@ flat-cache@^1.2.1: for-each@^0.3.2: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: is-callable "^1.1.3" for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= for-own@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= dependencies: for-in "^1.0.1" forever-agent@~0.5.0: version "0.5.2" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.5.2.tgz#6d0e09c4921f94a27f63d3b49c5feff1ea4c5130" + integrity sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA= forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= form-data@~0.1.0: version "0.1.4" resolved "https://registry.yarnpkg.com/form-data/-/form-data-0.1.4.tgz#91abd788aba9702b1aabfa8bc01031a2ac9e3b12" + integrity sha1-kavXiKupcCsaq/qLwBAxoqyeOxI= dependencies: async "~0.9.0" combined-stream "~0.0.4" @@ -4958,6 +5619,7 @@ form-data@~0.1.0: form-data@~2.1.1: version "2.1.4" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + integrity sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE= dependencies: asynckit "^0.4.0" combined-stream "^1.0.5" @@ -4966,6 +5628,7 @@ form-data@~2.1.1: form-data@~2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" + integrity sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8= dependencies: asynckit "^0.4.0" combined-stream "^1.0.5" @@ -4974,6 +5637,7 @@ form-data@~2.3.1: form-data@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + integrity sha1-SXBJi+YEwgwAXU9cI67NIda0kJk= dependencies: asynckit "^0.4.0" combined-stream "1.0.6" @@ -4982,20 +5646,24 @@ form-data@~2.3.2: forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= dependencies: map-cache "^0.2.2" fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= from2@^2.1.1: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= dependencies: inherits "^2.0.1" readable-stream "^2.0.0" @@ -5003,10 +5671,12 @@ from2@^2.1.1: fs-exists-sync@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" + integrity sha1-mC1ok6+RjnLQjeyehnP/K1qNat0= fs-extra@1.0.0, fs-extra@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" + integrity sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -5015,6 +5685,7 @@ fs-extra@1.0.0, fs-extra@^1.0.0: fs-extra@^0.24.0: version "0.24.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.24.0.tgz#d4e4342a96675cb7846633a6099249332b539952" + integrity sha1-1OQ0KpZnXLeEZjOmCZJJMytTmVI= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -5024,6 +5695,7 @@ fs-extra@^0.24.0: fs-extra@^0.26.0: version "0.26.7" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" + integrity sha1-muH92UiXeY7at20JGM9C0MMYT6k= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -5034,6 +5706,7 @@ fs-extra@^0.26.0: fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -5044,6 +5717,7 @@ fs-extra@^0.30.0: fs-extra@^2.0.0: version "2.1.2" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz#046c70163cef9aad46b0e4a7fa467fb22d71de35" + integrity sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -5051,6 +5725,7 @@ fs-extra@^2.0.0: fs-extra@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" + integrity sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE= dependencies: graceful-fs "^4.1.2" jsonfile "^3.0.0" @@ -5059,6 +5734,7 @@ fs-extra@^3.0.0: fs-extra@^4.0.0, fs-extra@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" @@ -5067,6 +5743,7 @@ fs-extra@^4.0.0, fs-extra@^4.0.2: fs-extra@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" + integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ== dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" @@ -5075,6 +5752,7 @@ fs-extra@^5.0.0: fs-extra@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.1.tgz#8abc128f7946e310135ddc93b98bddb410e7a34b" + integrity sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA== dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" @@ -5083,6 +5761,7 @@ fs-extra@^6.0.1: fs-extra@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.0.tgz#8cc3f47ce07ef7b3593a11b9fb245f7e34c041d6" + integrity sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ== dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" @@ -5091,12 +5770,14 @@ fs-extra@^7.0.0: fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== dependencies: minipass "^2.2.1" fs-promise@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/fs-promise/-/fs-promise-2.0.3.tgz#f64e4f854bcf689aa8bddcba268916db3db46854" + integrity sha1-9k5PhUvPaJqovdy6JokW2z20aFQ= dependencies: any-promise "^1.3.0" fs-extra "^2.0.0" @@ -5106,6 +5787,7 @@ fs-promise@^2.0.0: fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.7.tgz#315e2b098d5fe7f622880ac965b1b051868ac871" + integrity sha512-dJwDX6NBH7IfdfFjZAdHCZ6fIKc8LwR7kzqUhYRFJuX4g9ctG/7cuqJuwegGQsyLEykp6Z4krq+yIFMQlt7d9Q== dependencies: heimdalljs-logger "^0.1.7" object-assign "^4.1.0" @@ -5115,6 +5797,7 @@ fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5 fs-updater@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/fs-updater/-/fs-updater-1.0.4.tgz#2329980f99ae9176e9a0e84f7637538a182ce63b" + integrity sha512-0pJX4mJF/qLsNEwTct8CdnnRdagfb+LmjRPJ8sO+nCnAZLW0cTmz4rTgU25n+RvTuWSITiLKrGVJceJPBIPlKg== dependencies: can-symlink "^1.0.0" clean-up-path "^1.0.0" @@ -5125,10 +5808,12 @@ fs-updater@^1.0.4: fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.0.0, fsevents@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" + integrity sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q== dependencies: nan "^2.3.0" node-pre-gyp "^0.6.39" @@ -5136,6 +5821,7 @@ fsevents@^1.0.0, fsevents@^1.1.1: fsevents@^1.2.2: version "1.2.4" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" + integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg== dependencies: nan "^2.9.2" node-pre-gyp "^0.10.0" @@ -5143,6 +5829,7 @@ fsevents@^1.2.2: fstream-ignore@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + integrity sha1-nDHa40dnAY/h0kmyTa2mfQktoQU= dependencies: fstream "^1.0.0" inherits "2" @@ -5151,6 +5838,7 @@ fstream-ignore@^1.0.5: fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: version "1.0.11" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE= dependencies: graceful-fs "^4.1.2" inherits "~2.0.0" @@ -5160,14 +5848,17 @@ fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= gather-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/gather-stream/-/gather-stream-1.0.0.tgz#b33994af457a8115700d410f317733cbe7a0904b" + integrity sha1-szmUr0V6gRVwDUEPMXczy+egkEs= gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -5181,28 +5872,34 @@ gauge@~2.7.3: gaze@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== dependencies: globule "^1.0.0" get-caller-file@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + integrity sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U= get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== get-func-name@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= get-stream@^2.0.0: version "2.3.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" + integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4= dependencies: object-assign "^4.0.1" pinkie-promise "^2.0.0" @@ -5210,20 +5907,24 @@ get-stream@^2.0.0: get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= dependencies: assert-plus "^1.0.0" git-config-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/git-config-path/-/git-config-path-1.0.1.tgz#6d33f7ed63db0d0e118131503bab3aca47d54664" + integrity sha1-bTP37WPbDQ4RgTFQO6s6ykfVRmQ= dependencies: extend-shallow "^2.0.1" fs-exists-sync "^0.1.0" @@ -5232,30 +5933,36 @@ git-config-path@^1.0.1: git-repo-info@^1.1.2, git-repo-info@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-1.4.1.tgz#2a072823254aaf62fcf0766007d7b6651bd41943" + integrity sha1-KgcoIyVKr2L88HZgB9e2ZRvUGUM= git-repo-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-2.0.0.tgz#2e7a68ba3d0253e8e885c4138f922e6561de59bb" + integrity sha512-5wiwo0Pert7y8YtAC6Gym+ekeKojBospUEaQIPjK/djKvmONk7ZDpM986Q2OP5LEuwlmOom9Ji0XsGe78EFBeQ== git-repo-info@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-1.2.0.tgz#43d8513e04a24dd441330a2f7c6655a709fdbaf2" + integrity sha1-Q9hRPgSiTdRBMwovfGZVpwn9uvI= git-repo-version@0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/git-repo-version/-/git-repo-version-0.4.1.tgz#75fab9a0a4ec8470755b0eea7fdaa6f9d41453bf" + integrity sha1-dfq5oKTshHB1Ww7qf9qm+dQUU78= dependencies: git-repo-info "~1.2.0" git-tools@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/git-tools/-/git-tools-0.1.4.tgz#5e43e59443b8a5dedb39dba663da49e79f943978" + integrity sha1-XkPllEO4pd7bOdumY9pJ55+UOXg= dependencies: spawnback "~1.0.0" glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= dependencies: glob-parent "^2.0.0" is-glob "^2.0.0" @@ -5263,12 +5970,14 @@ glob-base@^0.3.0: glob-parent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= dependencies: is-glob "^2.0.0" glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= dependencies: is-glob "^3.1.0" path-dirname "^1.0.0" @@ -5276,6 +5985,7 @@ glob-parent@^3.1.0: glob@7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + integrity sha1-gFIR3wT6rxxjo2ADBs31reULLsg= dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -5287,6 +5997,7 @@ glob@7.1.1: glob@^4.0.4: version "4.5.3" resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" + integrity sha1-xstz0yJsHv7wTePFbQEvAzd+4V8= dependencies: inflight "^1.0.4" inherits "2" @@ -5296,6 +6007,7 @@ glob@^4.0.4: glob@^5.0.10: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= dependencies: inflight "^1.0.4" inherits "2" @@ -5306,6 +6018,7 @@ glob@^5.0.10: glob@^6.0.4: version "6.0.4" resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" + integrity sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI= dependencies: inflight "^1.0.4" inherits "2" @@ -5316,6 +6029,7 @@ glob@^6.0.4: glob@^7.0.0, glob@^7.0.3, glob@^7.0.4, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -5327,6 +6041,7 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.4, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, gl global-modules@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" + integrity sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0= dependencies: global-prefix "^0.1.4" is-windows "^0.2.0" @@ -5334,6 +6049,7 @@ global-modules@^0.2.3: global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== dependencies: global-prefix "^1.0.1" is-windows "^1.0.1" @@ -5342,6 +6058,7 @@ global-modules@^1.0.0: global-prefix@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" + integrity sha1-jTvGuNo8qBEqFg2NSW/wRiv+948= dependencies: homedir-polyfill "^1.0.0" ini "^1.3.4" @@ -5351,6 +6068,7 @@ global-prefix@^0.1.4: global-prefix@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= dependencies: expand-tilde "^2.0.2" homedir-polyfill "^1.0.1" @@ -5361,6 +6079,7 @@ global-prefix@^1.0.1: global@~4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" + integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8= dependencies: min-document "^2.19.0" process "~0.5.1" @@ -5368,18 +6087,22 @@ global@~4.3.0: globals@^11.0.1: version "11.3.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.3.0.tgz#e04fdb7b9796d8adac9c8f64c14837b2313378b0" + integrity sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw== globals@^11.1.0: version "11.7.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" + integrity sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg== globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== globby@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0= dependencies: array-union "^1.0.1" arrify "^1.0.0" @@ -5391,6 +6114,7 @@ globby@^5.0.0: globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= dependencies: array-union "^1.0.1" glob "^7.0.3" @@ -5401,6 +6125,7 @@ globby@^6.1.0: globule@^1.0.0: version "1.2.1" resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" + integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ== dependencies: glob "~7.1.1" lodash "~4.17.10" @@ -5409,28 +6134,34 @@ globule@^1.0.0: good-listener@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" + integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA= dependencies: delegate "^3.1.2" graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= "graceful-readlink@>= 1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= growl@1.9.2: version "1.9.2" resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + integrity sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8= growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= handlebars@^4.0.4, handlebars@^4.0.6: version "4.0.11" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" + integrity sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw= dependencies: async "^1.4.0" optimist "^0.6.1" @@ -5441,14 +6172,17 @@ handlebars@^4.0.4, handlebars@^4.0.6: har-schema@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + integrity sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4= har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= har-validator@~4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + integrity sha1-M0gdDxu/9gDdID11gSpqX7oALio= dependencies: ajv "^4.9.1" har-schema "^1.0.5" @@ -5456,6 +6190,7 @@ har-validator@~4.2.1: har-validator@~5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + integrity sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0= dependencies: ajv "^5.1.0" har-schema "^2.0.0" @@ -5463,6 +6198,7 @@ har-validator@~5.0.3: har-validator@~5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29" + integrity sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA== dependencies: ajv "^5.3.0" har-schema "^2.0.0" @@ -5470,54 +6206,65 @@ har-validator@~5.1.0: harmony-reflect@^1.4.2: version "1.6.0" resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.0.tgz#9c28a77386ec225f7b5d370f9861ba09c4eea58f" + integrity sha512-0kZ1XcoelFOLEjEtvWAZyq/1S55eDSieWEJwme311MNVNcRpvjlr2zA66kBV6WAB8C1XI1p1cXCnFPqd1BxlPg== has-ansi@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" + integrity sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4= dependencies: ansi-regex "^0.2.0" has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= dependencies: ansi-regex "^2.0.0" has-binary@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.6.tgz#25326f39cfa4f616ad8787894e3af2cfbc7b6e10" + integrity sha1-JTJvOc+k9hath4eJTjryz7x7bhA= dependencies: isarray "0.0.1" has-binary@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" + integrity sha1-aOYesWIQyVRaClzOBqhzkS/h5ow= dependencies: isarray "0.0.1" has-cors@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= has-flag@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= dependencies: get-value "^2.0.3" has-values "^0.1.4" @@ -5526,6 +6273,7 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= dependencies: get-value "^2.0.6" has-values "^1.0.0" @@ -5534,10 +6282,12 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= dependencies: is-number "^3.0.0" kind-of "^4.0.0" @@ -5545,6 +6295,7 @@ has-values@^1.0.0: hash-for-dep@^1.0.2, hash-for-dep@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.2.3.tgz#5ec69fca32c23523972d52acb5bb65ffc3664cab" + integrity sha512-NE//rDaCFpWHViw30YM78OAGBShU+g4dnUGY3UWGyEzPOGYg/ptOjk32nEc+bC1xz+RfK5UIs6lOL6eQdrV4Ow== dependencies: broccoli-kitchen-sink-helpers "^0.3.1" heimdalljs "^0.2.3" @@ -5554,6 +6305,7 @@ hash-for-dep@^1.0.2, hash-for-dep@^1.2.3: hasha@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1" + integrity sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE= dependencies: is-stream "^1.0.1" pinkie-promise "^2.0.0" @@ -5561,6 +6313,7 @@ hasha@^2.2.0: hawk@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/hawk/-/hawk-1.1.1.tgz#87cd491f9b46e4e2aeaca335416766885d2d1ed9" + integrity sha1-h81JH5tG5OKurKM1QWdmiF0tHtk= dependencies: boom "0.4.x" cryptiles "0.2.x" @@ -5570,6 +6323,7 @@ hawk@1.1.1: hawk@3.1.3, hawk@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + integrity sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ= dependencies: boom "2.x.x" cryptiles "2.x.x" @@ -5579,6 +6333,7 @@ hawk@3.1.3, hawk@~3.1.3: hawk@~6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + integrity sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ== dependencies: boom "4.x.x" cryptiles "3.x.x" @@ -5588,10 +6343,12 @@ hawk@~6.0.2: he@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= heimdalljs-fs-monitor@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/heimdalljs-fs-monitor/-/heimdalljs-fs-monitor-0.1.0.tgz#d404a65688c6714c485469ed3495da4853440272" + integrity sha1-1ASmVojGcUxIVGntNJXaSFNEAnI= dependencies: heimdalljs "^0.2.0" heimdalljs-logger "^0.1.7" @@ -5599,10 +6356,12 @@ heimdalljs-fs-monitor@^0.1.0: heimdalljs-graph@^0.3.1: version "0.3.4" resolved "https://registry.yarnpkg.com/heimdalljs-graph/-/heimdalljs-graph-0.3.4.tgz#0bd75797beeaa20b0ed59017aed3b2d95312acee" + integrity sha512-2DXgPIxdatgtBOjlh5qeVeHIGMTC2V9ujEvUhVJBVOVwqnU41g1OuGaRugLi6rvk0E+u1koYkfPeptybV8ZJ4g== heimdalljs-logger@^0.1.7: version "0.1.9" resolved "https://registry.yarnpkg.com/heimdalljs-logger/-/heimdalljs-logger-0.1.9.tgz#d76ada4e45b7bb6f786fc9c010a68eb2e2faf176" + integrity sha1-12raTkW3u294b8nAEKaOsuL68XY= dependencies: debug "^2.2.0" heimdalljs "^0.2.0" @@ -5610,6 +6369,7 @@ heimdalljs-logger@^0.1.7: heimdalljs-logger@^0.1.9: version "0.1.10" resolved "https://registry.yarnpkg.com/heimdalljs-logger/-/heimdalljs-logger-0.1.10.tgz#90cad58aabb1590a3c7e640ddc6a4cd3a43faaf7" + integrity sha512-pO++cJbhIufVI/fmB/u2Yty3KJD0TqNPecehFae0/eps0hkZ3b4Zc/PezUMOpYuHFQbA7FxHZxa305EhmjLj4g== dependencies: debug "^2.2.0" heimdalljs "^0.2.6" @@ -5617,40 +6377,48 @@ heimdalljs-logger@^0.1.9: heimdalljs@^0.2.0, heimdalljs@^0.2.1, heimdalljs@^0.2.3: version "0.2.5" resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.2.5.tgz#6aa54308eee793b642cff9cf94781445f37730ac" + integrity sha1-aqVDCO7nk7ZCz/nPlHgURfN3MKw= dependencies: rsvp "~3.2.1" heimdalljs@^0.2.5, heimdalljs@^0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.2.6.tgz#b0eebabc412813aeb9542f9cc622cb58dbdcd9fe" + integrity sha512-o9bd30+5vLBvBtzCPwwGqpry2+n0Hi6H1+qwt6y+0kwRHGGF8TFIhJPmnuM0xO97zaKrDZMwO/V56fAnn8m/tA== dependencies: rsvp "~3.2.1" heimdalljs@^0.3.0: version "0.3.3" resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.3.3.tgz#e92d2c6f77fd46d5bf50b610d28ad31755054d0b" + integrity sha1-6S0sb3f9RtW/ULYQ0orTF1UFTQs= dependencies: rsvp "~3.2.1" highlightjs@^9.10.0: version "9.10.0" resolved "https://registry.yarnpkg.com/highlightjs/-/highlightjs-9.10.0.tgz#fca9b78ddaa3b1abca89d6c3ee105ad270a80190" + integrity sha1-/Km3jdqjsavKidbD7hBa0nCoAZA= hoek@0.9.x: version "0.9.1" resolved "https://registry.yarnpkg.com/hoek/-/hoek-0.9.1.tgz#3d322462badf07716ea7eb85baf88079cddce505" + integrity sha1-PTIkYrrfB3Fup+uFuviAec3c5QU= hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + integrity sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0= hoek@4.x.x: version "4.2.0" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" + integrity sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ== home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.1" @@ -5658,26 +6426,31 @@ home-or-tmp@^2.0.0: homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" + integrity sha1-TCu8inWJmP7r9e1oWA921GdotLw= dependencies: parse-passwd "^1.0.0" hosted-git-info@^2.1.4, hosted-git-info@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" + integrity sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg== html-encoding-sniffer@^1.0.1, html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== dependencies: whatwg-encoding "^1.0.1" html-entities@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= htmlparser2@^3.9.1: version "3.9.2" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" + integrity sha1-G9+HrMoPP55T+k/M6w9LTLsAszg= dependencies: domelementtype "^1.3.0" domhandler "^2.3.0" @@ -5689,6 +6462,7 @@ htmlparser2@^3.9.1: htmlparser2@~3.8.1: version "3.8.3" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068" + integrity sha1-mWwosZFRaovoZQGn15dX5ccMEGg= dependencies: domelementtype "1" domhandler "2.3" @@ -5699,6 +6473,7 @@ htmlparser2@~3.8.1: http-errors@1.6.2, http-errors@~1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" + integrity sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY= dependencies: depd "1.1.1" inherits "2.0.3" @@ -5708,10 +6483,12 @@ http-errors@1.6.2, http-errors@~1.6.2: http-parser-js@>=0.4.0: version "0.4.10" resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" + integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= http-proxy@^1.13.1, http-proxy@^1.9.0: version "1.16.2" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" + integrity sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I= dependencies: eventemitter3 "1.x.x" requires-port "1.x.x" @@ -5719,6 +6496,7 @@ http-proxy@^1.13.1, http-proxy@^1.9.0: http-signature@~0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-0.10.1.tgz#4fbdac132559aa8323121e540779c0a012b27e66" + integrity sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY= dependencies: asn1 "0.1.11" assert-plus "^0.1.5" @@ -5727,6 +6505,7 @@ http-signature@~0.10.0: http-signature@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + integrity sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8= dependencies: assert-plus "^0.2.0" jsprim "^1.2.2" @@ -5735,6 +6514,7 @@ http-signature@~1.1.0: http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= dependencies: assert-plus "^1.0.0" jsprim "^1.2.2" @@ -5743,6 +6523,7 @@ http-signature@~1.2.0: ice-cap@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/ice-cap/-/ice-cap-0.0.4.tgz#8a6d31ab4cac8d4b56de4fa946df3352561b6e18" + integrity sha1-im0xq0ysjUtW3k+pRt8zUlYbbhg= dependencies: cheerio "0.20.0" color-logger "0.0.3" @@ -5750,68 +6531,83 @@ ice-cap@0.0.4: iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@~0.4.13: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + integrity sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ== iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" ignore-walk@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== dependencies: minimatch "^3.0.4" ignore@^3.3.3, ignore@^3.3.6: version "3.3.7" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" + integrity sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA== image-size@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.4.0.tgz#d4b4e1f61952e4cbc1cea9a6b0c915fecb707510" + integrity sha1-1LTh9hlS5MvBzqmmsMkV/stwdRA= image-size@^0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= in-publish@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" + integrity sha1-4g/146KvwmkDILbcVSaCqcf631E= include-path-searcher@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/include-path-searcher/-/include-path-searcher-0.1.0.tgz#c0cf2ddfa164fb2eae07bc7ca43a7f191cb4d7bd" + integrity sha1-wM8t36Fk+y6uB7x8pDp/GRy0170= indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= dependencies: repeating "^2.0.0" indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= inflected@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inflected/-/inflected-2.0.4.tgz#323770961ccbe992a98ea930512e9a82d3d3ef77" + integrity sha512-HQPzFLTTUvwfeUH6RAGjD8cHS069mBqXG5n4qaxX7sJXBhVQrsGgF+0ZJGkSuN6a8pcUWB/GXStta11kKi/WvA== inflection@^1.12.0, inflection@^1.7.0, inflection@^1.7.1, inflection@^1.8.0: version "1.12.0" resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" + integrity sha1-ogCTVlbW9fa8TcdQLhrstwMihBY= inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" @@ -5819,14 +6615,17 @@ inflight@^1.0.4: inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== inline-source-map-comment@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/inline-source-map-comment/-/inline-source-map-comment-1.0.5.tgz#50a8a44c2a790dfac441b5c94eccd5462635faf6" + integrity sha1-UKikTCp5DfrEQbXJTszVRiY1+vY= dependencies: chalk "^1.0.0" get-stdin "^4.0.1" @@ -5837,6 +6636,7 @@ inline-source-map-comment@^1.0.5: inquirer@^2: version "2.0.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-2.0.0.tgz#e1351687b90d150ca403ceaa3cefb1e3065bef4b" + integrity sha1-4TUWh7kNFQykA86qPO+x4wZb70s= dependencies: ansi-escapes "^1.1.0" chalk "^1.0.0" @@ -5856,6 +6656,7 @@ inquirer@^2: inquirer@^3.0.6: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== dependencies: ansi-escapes "^3.0.0" chalk "^2.0.0" @@ -5875,6 +6676,7 @@ inquirer@^3.0.6: into-stream@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" + integrity sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY= dependencies: from2 "^2.1.1" p-is-promise "^1.1.0" @@ -5882,82 +6684,98 @@ into-stream@^3.1.0: invariant@^2.2.0: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" invariant@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + integrity sha1-nh9WrArNtr8wMwbzOL47IErmA2A= dependencies: loose-envify "^1.0.0" invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= ip-regex@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" + integrity sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0= ipaddr.js@1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" + integrity sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A= ipaddr.js@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" + integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= dependencies: kind-of "^3.0.2" is-accessor-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== dependencies: kind-of "^6.0.0" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= dependencies: binary-extensions "^1.0.0" is-buffer@^1.1.5, is-buffer@~1.1.1: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-builtin-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= dependencies: builtin-modules "^1.0.0" is-callable@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= dependencies: kind-of "^3.0.2" is-data-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== dependencies: kind-of "^6.0.0" is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== dependencies: is-accessor-descriptor "^0.1.6" is-data-descriptor "^0.1.4" @@ -5966,6 +6784,7 @@ is-descriptor@^0.1.0: is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== dependencies: is-accessor-descriptor "^1.0.0" is-data-descriptor "^1.0.0" @@ -5974,212 +6793,256 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= is-equal-shallow@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= dependencies: is-primitive "^2.0.0" is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= is-extendable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== dependencies: is-plain-object "^2.0.4" is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-finite@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= is-function@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" + integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU= is-git-url@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-git-url/-/is-git-url-1.0.0.tgz#53f684cd143285b52c3244b4e6f28253527af66b" + integrity sha1-U/aEzRQyhbUsMkS05vKCU1J69ms= is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= dependencies: is-extglob "^1.0.0" is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= dependencies: is-extglob "^2.1.0" is-glob@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A= dependencies: is-extglob "^2.1.1" is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= dependencies: kind-of "^3.0.2" is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= is-odd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-1.0.0.tgz#3b8a932eb028b3775c39bb09e91767accdb69088" + integrity sha1-O4qTLrAos3dcObsJ6RdnrM22kIg= dependencies: is-number "^3.0.0" is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= is-path-in-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + integrity sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw= dependencies: is-path-inside "^1.0.0" is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= dependencies: path-is-inside "^1.0.1" is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= is-reference@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.1.0.tgz#50e6ef3f64c361e2c53c0416cdc9420037f2685b" + integrity sha512-h37O/IX4efe56o9k41II1ECMqKwtqHa7/12dLDEzJIFux2x15an4WCDb0/eKdmUgRpLJ3bR0DrzDc7vOrVgRDw== dependencies: "@types/estree" "0.0.38" is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= is-type@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/is-type/-/is-type-0.0.1.tgz#f651d85c365d44955d14a51d8d7061f3f6b4779c" + integrity sha1-9lHYXDZdRJVdFKUdjXBh8/a0d5w= dependencies: core-util-is "~1.0.0" is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= is-windows@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" + integrity sha1-3hqm1j6indJIc3tp8f+LgALSEIw= is-windows@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.1.tgz#310db70f742d259a16a369202b51af84233310d9" + integrity sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk= is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isbinaryfile@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" + integrity sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE= isemail@3.x.x: version "3.1.3" resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.1.3.tgz#64f37fc113579ea12523165c3ebe3a71a56ce571" + integrity sha512-5xbsG5wYADIcB+mfLsd+nst1V/D+I7EU7LEZPo2GOIMu4JzfcRs5yQoypP4avA7QtUqgxYLKBYNv4IdzBmbhdw== dependencies: punycode "2.x.x" isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= istextorbinary@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.1.0.tgz#dbed2a6f51be2f7475b68f89465811141b758874" + integrity sha1-2+0qb1G+L3R1to+JRlgRFBt1iHQ= dependencies: binaryextensions "1 || 2" editions "^1.1.1" @@ -6188,6 +7051,7 @@ istextorbinary@2.1.0: jimp@^0.2.13, jimp@^0.2.21: version "0.2.28" resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.2.28.tgz#dd529a937190f42957a7937d1acc3a7762996ea2" + integrity sha1-3VKak3GQ9ClXp5N9Gsw6d2KZbqI= dependencies: bignumber.js "^2.1.0" bmp-js "0.0.3" @@ -6209,6 +7073,7 @@ jimp@^0.2.13, jimp@^0.2.21: joi@^12.0.0: version "12.0.0" resolved "https://registry.yarnpkg.com/joi/-/joi-12.0.0.tgz#46f55e68f4d9628f01bbb695902c8b307ad8d33a" + integrity sha512-z0FNlV4NGgjQN1fdtHYXf5kmgludM65fG/JlXzU6+rwkt9U5UWuXVYnXa2FpK0u6+qBuCmrm5byPNuiiddAHvQ== dependencies: hoek "4.x.x" isemail "3.x.x" @@ -6217,34 +7082,42 @@ joi@^12.0.0: jpeg-js@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.1.2.tgz#135b992c0575c985cfa0f494a3227ed238583ece" + integrity sha1-E1uZLAV1yYXPoPSUoyJ+0jhYPs4= jpeg-js@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.2.0.tgz#53e448ec9d263e683266467e9442d2c5a2ef5482" + integrity sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII= jquery-deferred@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/jquery-deferred/-/jquery-deferred-0.3.1.tgz#596eca1caaff54f61b110962b23cafea74c35355" + integrity sha1-WW7KHKr/VPYbEQlisjyv6nTDU1U= jquery@^3.1.0, jquery@^3.2.1: version "3.3.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" + integrity sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg== js-base64@^2.1.8, js-base64@^2.1.9: version "2.4.8" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.8.tgz#57a9b130888f956834aa40c5b165ba59c758f033" + integrity sha512-hm2nYpDrwoO/OzBhdcqs/XGT6XjSuSSCVEpia+Kl2J6x4CYt5hISlVL/AYU1khoDXv0AQVgxtdJySb9gjAn56Q== js-reporters@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/js-reporters/-/js-reporters-1.2.1.tgz#f88c608e324a3373a95bcc45ad305e5c979c459b" + integrity sha1-+IxgjjJKM3OpW8xFrTBeXJecRZs= js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.6.1, js-yaml@^3.9.1: version "3.10.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" + integrity sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -6252,6 +7125,7 @@ js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.6.1, js-yaml@^3.9.1: js-yaml@^3.3.0: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" + integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -6259,6 +7133,7 @@ js-yaml@^3.3.0: js-yaml@~3.6.0: version "3.6.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" + integrity sha1-bl/mfYsgXOTSL60Ft3geja3MSzA= dependencies: argparse "^1.0.7" esprima "^2.6.0" @@ -6266,10 +7141,12 @@ js-yaml@~3.6.0: jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= jsdom@^11.11.0, jsdom@^11.12.0: version "11.12.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== dependencies: abab "^2.0.0" acorn "^5.5.3" @@ -6301,6 +7178,7 @@ jsdom@^11.11.0, jsdom@^11.12.0: jsdom@^7.0.2: version "7.2.2" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-7.2.2.tgz#40b402770c2bda23469096bee91ab675e3b1fc6e" + integrity sha1-QLQCdwwr2iNGkJa+6Rq2deOx/G4= dependencies: abab "^1.0.0" acorn "^2.4.0" @@ -6321,6 +7199,7 @@ jsdom@^7.0.2: jsdom@^9.5.0: version "9.12.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" + integrity sha1-6MVG//ywbADUgzyoRBD+1/igl9Q= dependencies: abab "^1.0.3" acorn "^4.0.4" @@ -6345,22 +7224,27 @@ jsdom@^9.5.0: jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= jsesc@^2.5.0, jsesc@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" + integrity sha1-5CGiqOINawgZ3yiQj3glJrlt0f4= jsesc@~0.3.x: version "0.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.3.0.tgz#1bf5ee63b4539fe2e26d0c1e99c240b97a457972" + integrity sha1-G/XuY7RTn+LibQwemcJAuXpFeXI= jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= json-api-serializer@^1.11.0: version "1.13.0" resolved "https://registry.yarnpkg.com/json-api-serializer/-/json-api-serializer-1.13.0.tgz#cab7239736e72abee4658b1c8915edc290f5a9e9" + integrity sha512-h5XKsQsLhN6zKLzYKFMyCuQWQZXa6Ozk4GC4svZfh8BkxdwBHidQ+zn41pHlnntexAujY/PcO+hjH92IEvGf0A== dependencies: into-stream "^3.1.0" joi "^12.0.0" @@ -6372,62 +7256,75 @@ json-api-serializer@^1.11.0: json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= dependencies: jsonify "~0.0.0" json-stringify-safe@~5.0.0, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= json3@3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= optionalDependencies: graceful-fs "^4.1.6" jsonfile@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + integrity sha1-pezG9l9T9mLEQVx2daAzHQmS7GY= optionalDependencies: graceful-fs "^4.1.6" jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= optionalDependencies: graceful-fs "^4.1.6" jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= jsontoxml@0.0.11: version "0.0.11" resolved "https://registry.yarnpkg.com/jsontoxml/-/jsontoxml-0.0.11.tgz#373ab5b2070be3737a5fb3e32fd1b7b81870caa4" + integrity sha1-Nzq1sgcL43N6X7PjL9G3uBhwyqQ= jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= dependencies: assert-plus "1.0.0" extsprintf "1.3.0" @@ -6437,52 +7334,62 @@ jsprim@^1.2.2: kew@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" + integrity sha1-edk9LTM2PW/dKXCzNdkUGtWR15s= kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= dependencies: is-buffer "^1.1.5" kind-of@^5.0.0, kind-of@^5.0.2: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= optionalDependencies: graceful-fs "^4.1.9" lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= lazy-cache@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" + integrity sha1-uRkKT5EzVGlIQIWfio9whNiCImQ= dependencies: set-getter "^0.1.0" lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= dependencies: invert-kv "^1.0.0" leek@0.0.24: version "0.0.24" resolved "https://registry.yarnpkg.com/leek/-/leek-0.0.24.tgz#e400e57f0e60d8ef2bd4d068dc428a54345dbcda" + integrity sha1-5ADlfw5g2O8r1NBo3EKKVDRdvNo= dependencies: debug "^2.1.0" lodash.assign "^3.2.0" @@ -6491,10 +7398,12 @@ leek@0.0.24: left-pad@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" @@ -6502,18 +7411,21 @@ levn@^0.3.0, levn@~0.3.0: linkify-it@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.0.3.tgz#d94a4648f9b1c179d64fa97291268bdb6ce9434f" + integrity sha1-2UpGSPmxwXnWT6lykSaL22zpQ08= dependencies: uc.micro "^1.0.1" linkify-it@~1.2.0: version "1.2.4" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-1.2.4.tgz#0773526c317c8fd13bd534ee1d180ff88abf881a" + integrity sha1-B3NSbDF8j9E71TTuHRgP+Iq/iBo= dependencies: uc.micro "^1.0.1" liquid-fire@^0.29.1: version "0.29.5" resolved "https://registry.yarnpkg.com/liquid-fire/-/liquid-fire-0.29.5.tgz#da8e3158e3f96c34a8cf371b90b8ae941ea8960d" + integrity sha512-h+KxMaCvavkAfL5duNc5tQikrZxzbGVvUdmBU9mjkInUQQKvTjpD1DwphRKk6qWRRuDY9HT2ecY0Hf6/gMXkJA== dependencies: broccoli-funnel "^1.0.1" broccoli-merge-trees "^1.0.0" @@ -6530,10 +7442,12 @@ liquid-fire@^0.29.1: livereload-js@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.3.0.tgz#c3ab22e8aaf5bf3505d80d098cbad67726548c9a" + integrity sha512-j1R0/FeGa64Y+NmqfZhyoVRzcFlOZ8sNlKzHjh4VvLULFACZhn68XrX5DFg2FhMvSMJmROuFxRSa560ECWKBMg== load-bmfont@^1.2.3: version "1.3.1" resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.3.1.tgz#0e7933f66543409882127b0d0fbad7a66d5a7869" + integrity sha512-lQkEawgez06lM2iw1vQEEOtVLJXyMzFcUqbwWMrB0g6zwhdUs/+e0KNd1zEJ7OFBbMVz0tbzQyjgjtTB47+PBg== dependencies: buffer-equal "0.0.1" mime "^1.3.4" @@ -6546,6 +7460,7 @@ load-bmfont@^1.2.3: load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" @@ -6556,14 +7471,17 @@ load-json-file@^1.0.0: loader.js@^4.2.3: version "4.6.0" resolved "https://registry.yarnpkg.com/loader.js/-/loader.js-4.6.0.tgz#b965663ddbe2d80da482454cb865efe496e93e22" + integrity sha512-NjAnzMq/BM2VlXA9er0Nx1Runocgi+hEU53ENhCtTx82GX6/l9NXwfIqg81om6QvmhUlv2zH+4R+N+wOoeXytQ== locate-character@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/locate-character/-/locate-character-2.0.5.tgz#f2d2614d49820ecb3c92d80d193b8db755f74c0f" + integrity sha512-n2GmejDXtOPBAZdIiEFy5dJ5N38xBCXLNOtw2WpB9kGh6pnrEuKlwYI+Tkpofc4wDtVXHtoAOJaMRlYG/oYaxg== locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= dependencies: p-locate "^2.0.0" path-exists "^3.0.0" @@ -6571,10 +7489,12 @@ locate-path@^2.0.0: lodash-es@^4.17.4: version "4.17.5" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.5.tgz#9fc6e737b1c4d151d8f9cae2247305d552ce748f" + integrity sha512-Ez3ONp3TK9gX1HYKp6IhetcVybD+2F+Yp6GS9dfH8ue6EOCEzQtQEh4K0FYWBP9qLv+lzeQAYXw+3ySfxyZqkw== lodash._baseassign@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + integrity sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4= dependencies: lodash._basecopy "^3.0.0" lodash.keys "^3.0.0" @@ -6582,6 +7502,7 @@ lodash._baseassign@^3.0.0: lodash._basebind@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._basebind/-/lodash._basebind-2.3.0.tgz#2b5bc452a0e106143b21869f233bdb587417d248" + integrity sha1-K1vEUqDhBhQ7IYafIzvbWHQX0kg= dependencies: lodash._basecreate "~2.3.0" lodash._setbinddata "~2.3.0" @@ -6590,14 +7511,17 @@ lodash._basebind@~2.3.0: lodash._basecopy@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY= lodash._basecreate@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" + integrity sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE= lodash._basecreate@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-2.3.0.tgz#9b88a86a4dcff7b7f3c61d83a2fcfc0671ec9de0" + integrity sha1-m4ioak3P97fzxh2Dovz8BnHsneA= dependencies: lodash._renative "~2.3.0" lodash.isobject "~2.3.0" @@ -6606,6 +7530,7 @@ lodash._basecreate@~2.3.0: lodash._basecreatecallback@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._basecreatecallback/-/lodash._basecreatecallback-2.3.0.tgz#37b2ab17591a339e988db3259fcd46019d7ac362" + integrity sha1-N7KrF1kaM56YjbMln81GAZ16w2I= dependencies: lodash._setbinddata "~2.3.0" lodash.bind "~2.3.0" @@ -6615,6 +7540,7 @@ lodash._basecreatecallback@~2.3.0: lodash._basecreatewrapper@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.3.0.tgz#aa0c61ad96044c3933376131483a9759c3651247" + integrity sha1-qgxhrZYETDkzN2ExSDqXWcNlEkc= dependencies: lodash._basecreate "~2.3.0" lodash._setbinddata "~2.3.0" @@ -6624,6 +7550,7 @@ lodash._basecreatewrapper@~2.3.0: lodash._baseflatten@^3.0.0: version "3.1.4" resolved "https://registry.yarnpkg.com/lodash._baseflatten/-/lodash._baseflatten-3.1.4.tgz#0770ff80131af6e34f3b511796a7ba5214e65ff7" + integrity sha1-B3D/gBMa9uNPO1EXlqe6UhTmX/c= dependencies: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" @@ -6631,18 +7558,22 @@ lodash._baseflatten@^3.0.0: lodash._basetostring@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" + integrity sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U= lodash._basevalues@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" + integrity sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc= lodash._bindcallback@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4= lodash._createassigner@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" + integrity sha1-g4pbri/aymOsIt7o4Z+k5taXCxE= dependencies: lodash._bindcallback "^3.0.0" lodash._isiterateecall "^3.0.0" @@ -6651,6 +7582,7 @@ lodash._createassigner@^3.0.0: lodash._createwrapper@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._createwrapper/-/lodash._createwrapper-2.3.0.tgz#d1aae1102dadf440e8e06fc133a6edd7fe146075" + integrity sha1-0arhEC2t9EDo4G/BM6bt1/4UYHU= dependencies: lodash._basebind "~2.3.0" lodash._basecreatewrapper "~2.3.0" @@ -6659,44 +7591,54 @@ lodash._createwrapper@~2.3.0: lodash._escapehtmlchar@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.3.0.tgz#d03da6bd82eedf38dc0a5b503d740ecd0e894592" + integrity sha1-0D2mvYLu3zjcCltQPXQOzQ6JRZI= dependencies: lodash._htmlescapes "~2.3.0" lodash._escapestringchar@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.3.0.tgz#cce73ae60fc6da55d2bf8a0679c23ca2bab149fc" + integrity sha1-zOc65g/G2lXSv4oGecI8orqxSfw= lodash._getnative@^3.0.0: version "3.9.1" resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= lodash._htmlescapes@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.3.0.tgz#1ca98863cadf1fa1d82c84f35f31e40556a04f3a" + integrity sha1-HKmIY8rfH6HYLITzXzHkBVagTzo= lodash._isiterateecall@^3.0.0: version "3.0.9" resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + integrity sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw= lodash._objecttypes@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.3.0.tgz#6a3ea3987dd6eeb8021b2d5c9c303549cc2bae1e" + integrity sha1-aj6jmH3W7rgCGy1cnDA1Scwrrh4= lodash._reinterpolate@^3.0.0, lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= lodash._reinterpolate@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.3.0.tgz#03ee9d85c0e55cbd590d71608a295bdda51128ec" + integrity sha1-A+6dhcDlXL1ZDXFgiilb3aURKOw= lodash._renative@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._renative/-/lodash._renative-2.3.0.tgz#77d8edd4ced26dd5971f9e15a5f772e4e317fbd3" + integrity sha1-d9jt1M7SbdWXH54Vpfdy5OMX+9M= lodash._reunescapedhtml@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.3.0.tgz#db920b55ac7f3ff825939aceb9ba2c231713d24d" + integrity sha1-25ILVax/P/glk5rOubosIxcT0k0= dependencies: lodash._htmlescapes "~2.3.0" lodash.keys "~2.3.0" @@ -6704,10 +7646,12 @@ lodash._reunescapedhtml@~2.3.0: lodash._root@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + integrity sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI= lodash._setbinddata@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._setbinddata/-/lodash._setbinddata-2.3.0.tgz#e5610490acd13277d59858d95b5f2727f1508f04" + integrity sha1-5WEEkKzRMnfVmFjZW18nJ/FQjwQ= dependencies: lodash._renative "~2.3.0" lodash.noop "~2.3.0" @@ -6715,16 +7659,19 @@ lodash._setbinddata@~2.3.0: lodash._shimkeys@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.3.0.tgz#611f93149e3e6c721096b48769ef29537ada8ba9" + integrity sha1-YR+TFJ4+bHIQlrSHae8pU3rai6k= dependencies: lodash._objecttypes "~2.3.0" lodash._slice@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._slice/-/lodash._slice-2.3.0.tgz#147198132859972e4680ca29a5992c855669aa5c" + integrity sha1-FHGYEyhZly5GgMoppZkshVZpqlw= lodash.assign@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" + integrity sha1-POnwI0tLIiPilrj6CsH+6OvKZPo= dependencies: lodash._baseassign "^3.0.0" lodash._createassigner "^3.0.0" @@ -6733,18 +7680,22 @@ lodash.assign@^3.2.0: lodash.assign@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= lodash.assignin@^4.0.9, lodash.assignin@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" + integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI= lodash.bind@^4.1.4: version "4.2.1" resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" + integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU= lodash.bind@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-2.3.0.tgz#c2a8e18b68e5ecc152e2b168266116fea5b016cc" + integrity sha1-wqjhi2jl7MFS4rFoJmEW/qWwFsw= dependencies: lodash._createwrapper "~2.3.0" lodash._renative "~2.3.0" @@ -6753,14 +7704,17 @@ lodash.bind@~2.3.0: lodash.castarray@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" + integrity sha1-wCUTUV4wna3dTCTGDP3c9ZdtkRU= lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.4.1, lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= lodash.create@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" + integrity sha1-1/KEnw29p+BGgruM1yqwIkYd6+c= dependencies: lodash._baseassign "^3.0.0" lodash._basecreate "^3.0.0" @@ -6769,20 +7723,24 @@ lodash.create@3.1.1: lodash.debounce@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-3.1.1.tgz#812211c378a94cc29d5aa4e3346cf0bfce3a7df5" + integrity sha1-gSIRw3ipTMKdWqTjNGzwv846ffU= dependencies: lodash._getnative "^3.0.0" lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= lodash.defaults@^4.0.1: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= lodash.defaults@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.3.0.tgz#a832b001f138f3bb9721c2819a2a7cc5ae21ed25" + integrity sha1-qDKwAfE487uXIcKBmip8xa4h7SU= dependencies: lodash._objecttypes "~2.3.0" lodash.keys "~2.3.0" @@ -6790,16 +7748,19 @@ lodash.defaults@~2.3.0: lodash.defaultsdeep@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.0.tgz#bec1024f85b1bd96cbea405b23c14ad6443a6f81" + integrity sha1-vsECT4WxvZbL6kBbI8FK1kQ6b4E= lodash.escape@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" + integrity sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg= dependencies: lodash._root "^3.0.0" lodash.escape@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.3.0.tgz#844c38c58f844e1362ebe96726159b62cf5f2a58" + integrity sha1-hEw4xY+EThNi6+lnJhWbYs9fKlg= dependencies: lodash._escapehtmlchar "~2.3.0" lodash._reunescapedhtml "~2.3.0" @@ -6808,14 +7769,17 @@ lodash.escape@~2.3.0: lodash.filter@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" + integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4= lodash.find@^4.5.1: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" + integrity sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E= lodash.flatten@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-3.0.2.tgz#de1cf57758f8f4479319d35c3e9cc60c4501938c" + integrity sha1-3hz1d1j49EeTGdNcPpzGDEUBk4w= dependencies: lodash._baseflatten "^3.0.0" lodash._isiterateecall "^3.0.0" @@ -6823,14 +7787,17 @@ lodash.flatten@^3.0.2: lodash.flatten@^4.2.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= lodash.foreach@^4.3.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" + integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= lodash.foreach@~2.3.x: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-2.3.0.tgz#083404c91e846ee77245fdf9d76519c68b2af168" + integrity sha1-CDQEyR6EbudyRf3512UZxosq8Wg= dependencies: lodash._basecreatecallback "~2.3.0" lodash.forown "~2.3.0" @@ -6838,6 +7805,7 @@ lodash.foreach@~2.3.x: lodash.forown@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.forown/-/lodash.forown-2.3.0.tgz#24fb4aaf800d45fc2dc60bfec3ce04c836a3ad7f" + integrity sha1-JPtKr4ANRfwtxgv+w84EyDajrX8= dependencies: lodash._basecreatecallback "~2.3.0" lodash._objecttypes "~2.3.0" @@ -6846,28 +7814,34 @@ lodash.forown@~2.3.0: lodash.identity@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.identity/-/lodash.identity-2.3.0.tgz#6b01a210c9485355c2a913b48b6711219a173ded" + integrity sha1-awGiEMlIU1XCqRO0i2cRIZoXPe0= lodash.isarguments@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= lodash.isarray@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U= lodash.isfunction@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-2.3.0.tgz#6b2973e47a647cf12e70d676aea13643706e5267" + integrity sha1-aylz5HpkfPEucNZ2rqE2Q3BuUmc= lodash.isobject@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.3.0.tgz#2e16d3fc583da9831968953f2d8e6d73434f6799" + integrity sha1-LhbT/Fg9qYMZaJU/LY5tc0NPZ5k= dependencies: lodash._objecttypes "~2.3.0" lodash.keys@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + integrity sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo= dependencies: lodash._getnative "^3.0.0" lodash.isarguments "^3.0.0" @@ -6876,6 +7850,7 @@ lodash.keys@^3.0.0: lodash.keys@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.3.0.tgz#b350f4f92caa9f45a4a2ecf018454cf2f28ae253" + integrity sha1-s1D0+Syqn0WkouzwGEVM8vKK4lM= dependencies: lodash._renative "~2.3.0" lodash._shimkeys "~2.3.0" @@ -6884,56 +7859,69 @@ lodash.keys@~2.3.0: lodash.map@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" + integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= lodash.merge@^4.3.0, lodash.merge@^4.4.0, lodash.merge@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" + integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== lodash.mergewith@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" + integrity sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ== lodash.noop@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.noop/-/lodash.noop-2.3.0.tgz#3059d628d51bbf937cd2a0b6fc3a7f212a669c2c" + integrity sha1-MFnWKNUbv5N80qC2/Dp/ISpmnCw= lodash.omit@^4.1.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" + integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA= lodash.pick@^4.2.1: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= lodash.reduce@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" + integrity sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs= lodash.reject@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" + integrity sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU= lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= lodash.some@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" + integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= lodash.support@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.support/-/lodash.support-2.3.0.tgz#7eaf038af4f0d6aab776b44aa6dcfc80334c9bfd" + integrity sha1-fq8DivTw1qq3drRKptz8gDNMm/0= dependencies: lodash._renative "~2.3.0" lodash.template@^3.3.2: version "3.6.2" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" + integrity sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8= dependencies: lodash._basecopy "^3.0.0" lodash._basetostring "^3.0.0" @@ -6948,6 +7936,7 @@ lodash.template@^3.3.2: lodash.template@^4.2.5: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" + integrity sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A= dependencies: lodash._reinterpolate "~3.0.0" lodash.templatesettings "^4.0.0" @@ -6955,6 +7944,7 @@ lodash.template@^4.2.5: lodash.template@~2.3.x: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.3.0.tgz#4e3e29c433b4cfea675ec835e6f12391c61fd22b" + integrity sha1-Tj4pxDO0z+pnXsg15vEjkcYf0is= dependencies: lodash._escapestringchar "~2.3.0" lodash._reinterpolate "~2.3.0" @@ -6967,6 +7957,7 @@ lodash.template@~2.3.x: lodash.templatesettings@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" + integrity sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU= dependencies: lodash._reinterpolate "^3.0.0" lodash.escape "^3.0.0" @@ -6974,12 +7965,14 @@ lodash.templatesettings@^3.0.0: lodash.templatesettings@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" + integrity sha1-K01OlbpEDZFf8IvImeRVNmZxMxY= dependencies: lodash._reinterpolate "~3.0.0" lodash.templatesettings@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.3.0.tgz#303d132c342710040d5a18efaa2d572fd03f8cdc" + integrity sha1-MD0TLDQnEAQNWhjvqi1XL9A/jNw= dependencies: lodash._reinterpolate "~2.3.0" lodash.escape "~2.3.0" @@ -6987,56 +7980,68 @@ lodash.templatesettings@~2.3.0: lodash.uniq@^4.2.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= lodash.uniqby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" + integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI= lodash.values@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.3.0.tgz#ca96fbe60a20b0b0ec2ba2ba5fc6a765bd14a3ba" + integrity sha1-ypb75gogsLDsK6K6X8anZb0Uo7o= dependencies: lodash.keys "~2.3.0" lodash@3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.8.0.tgz#376eb98bdcd9382a9365c33c4cb8250de1325b91" + integrity sha1-N265i9zZOCqTZcM8TLglDeEyW5E= lodash@^3.10.0, lodash@^3.10.1, lodash@^3.2.0: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1: version "4.17.5" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" + integrity sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw== lodash@^4.1.0, lodash@^4.10.0, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.5, lodash@^4.2.0, lodash@~4.17.10: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== lodash@~2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e" + integrity sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4= log-symbols@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== dependencies: chalk "^2.0.1" longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= loose-envify@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + integrity sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg= dependencies: js-tokens "^3.0.0" loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= dependencies: currently-unhandled "^0.4.1" signal-exit "^3.0.0" @@ -7044,10 +8049,12 @@ loud-rejection@^1.0.0: lower-case@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= lru-cache@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + integrity sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew== dependencies: pseudomap "^1.0.2" yallist "^2.1.2" @@ -7055,52 +8062,62 @@ lru-cache@^4.0.1: lunr@^2.1.5: version "2.3.2" resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.2.tgz#7164301092b2d7ab664573156f686df5c25c4185" + integrity sha512-3wO9shK+cBcJ260ibDtw3JGY+xE0so0y90Dt5YY4e+VmhZO8z8l4cwdau09Fiud0nZHdSgNsIKFHUy3MbXm00A== magic-string@^0.22.4: version "0.22.5" resolved "http://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e" + integrity sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w== dependencies: vlq "^0.2.2" magic-string@^0.24.0: version "0.24.1" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.24.1.tgz#7e38e5f126cae9f15e71f0cf8e450818ca7d5a8f" + integrity sha512-YBfNxbJiixMzxW40XqJEIldzHyh5f7CZKalo1uZffevyrPEX8Qgo9s0dmcORLHdV47UyvJg8/zD+6hQG3qvJrA== dependencies: sourcemap-codec "^1.4.1" make-array@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/make-array/-/make-array-0.1.2.tgz#335e36ebb0c5a43154d21213a1ecaeae2a1bb3ef" + integrity sha1-M14267DFpDFU0hIToeyuriobs+8= make-dir@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51" + integrity sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA== dependencies: pify "^3.0.0" makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= dependencies: tmpl "1.0.x" map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= dependencies: object-visit "^1.0.0" markdown-it-terminal@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/markdown-it-terminal/-/markdown-it-terminal-0.1.0.tgz#545abd8dd01c3d62353bfcea71db580b51d22bd9" + integrity sha1-VFq9jdAcPWI1O/zqcdtYC1HSK9k= dependencies: ansi-styles "^3.0.0" cardinal "^1.0.0" @@ -7111,6 +8128,7 @@ markdown-it-terminal@0.1.0: markdown-it@^4.3.0: version "4.4.0" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-4.4.0.tgz#3df373dbea587a9a7fef3e56311b68908f75c414" + integrity sha1-PfNz2+pYepp/7z5WMRtokI91xBQ= dependencies: argparse "~1.0.2" entities "~1.1.1" @@ -7121,6 +8139,7 @@ markdown-it@^4.3.0: markdown-it@^8.3.0, markdown-it@^8.3.1: version "8.4.0" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.0.tgz#e2400881bf171f7018ed1bd9da441dac8af6306d" + integrity sha512-tNuOCCfunY5v5uhcO2AUMArvKAyKMygX8tfup/JrgnsDqcCATQsAExBq7o5Ml9iMmO82bk6jYNLj6khcrl0JGA== dependencies: argparse "^1.0.7" entities "~1.1.1" @@ -7131,34 +8150,41 @@ markdown-it@^8.3.0, markdown-it@^8.3.1: marked@0.3.6: version "0.3.6" resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" + integrity sha1-ssbGGPzOzk74bE/Gy4p8v1rtqNc= marked@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/marked/-/marked-0.5.1.tgz#062f43b88b02ee80901e8e8d8e6a620ddb3aa752" + integrity sha512-iUkBZegCZou4AdwbKTwSW/lNDcz5OuRSl3qdcl31Ia0B2QPG0Jn+tKblh/9/eP9/6+4h27vpoh8wel/vQOV0vw== match-media@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/match-media/-/match-media-0.2.0.tgz#ea4e09742e7253cc7d7e1599ba627e0fa29fbc50" + integrity sha1-6k4JdC5yU8x9fhWZumJ+D6KfvFA= matcher-collection@^1.0.0, matcher-collection@^1.0.4, matcher-collection@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.0.5.tgz#2ee095438372cb8884f058234138c05c644ec339" + integrity sha512-nUCmzKipcJEwYsBVAFh5P+d7JBuhJaW1xs85Hara9xuMLqtCVUrW6DSC0JVIkluxEH2W45nPBM/wjHtBXa/tYA== dependencies: minimatch "^3.0.2" md5-hex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-2.0.0.tgz#d0588e9f1c74954492ecd24ac0ac6ce997d92e33" + integrity sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM= dependencies: md5-o-matic "^0.1.1" md5-o-matic@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" + integrity sha1-givM1l4RfFFPqxdrJZRdVBAKA8M= md5@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" + integrity sha1-U6s41f48iJG6RlMp6iP6wFQBJvk= dependencies: charenc "~0.0.1" crypt "~0.0.1" @@ -7167,24 +8193,29 @@ md5@^2.2.1: mdn-links@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/mdn-links/-/mdn-links-0.1.0.tgz#e24c83b97cb4c5886cc39f2f780705fbfe273aa5" + integrity sha1-4kyDuXy0xYhsw58veAcF+/4nOqU= mdurl@^1.0.1, mdurl@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= memory-streams@^0.1.0: version "0.1.3" resolved "https://registry.yarnpkg.com/memory-streams/-/memory-streams-0.1.3.tgz#d9b0017b4b87f1d92f55f2745c9caacb1dc93ceb" + integrity sha512-qVQ/CjkMyMInPaaRMrwWNDvf6boRZXaT/DbQeMYcCWuXPEBf1v8qChOc9OlEVQp2uOvRXa1Qu30fLmKhY6NipA== dependencies: readable-stream "~1.0.2" meow@^3.4.0, meow@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= dependencies: camelcase-keys "^2.0.0" decamelize "^1.1.2" @@ -7200,16 +8231,19 @@ meow@^3.4.0, meow@^3.7.0: merge-defaults@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/merge-defaults/-/merge-defaults-0.2.1.tgz#dd42248eb96bb6a51521724321c72ff9583dde80" + integrity sha1-3UIkjrlrtqUVIXJDIccv+Vg93oA= dependencies: lodash "~2.4.1" merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= merge-trees@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-trees/-/merge-trees-1.0.1.tgz#ccbe674569787f9def17fd46e6525f5700bbd23e" + integrity sha1-zL5nRWl4f53vF/1G5lJfVwC70j4= dependencies: can-symlink "^1.0.0" fs-tree-diff "^0.5.4" @@ -7221,6 +8255,7 @@ merge-trees@^1.0.1: merge-trees@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-trees/-/merge-trees-2.0.0.tgz#a560d796e566c5d9b2c40472a2967cca48d85161" + integrity sha512-5xBbmqYBalWqmhYm51XlohhkmVOua3VAUrrWh8t9iOkaLpS6ifqm/UVuUjQCeDVJ9Vx3g2l6ihfkbLSTeKsHbw== dependencies: fs-updater "^1.0.4" heimdalljs "^0.2.5" @@ -7228,14 +8263,17 @@ merge-trees@^2.0.0: merge@^1.1.3, merge@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + integrity sha1-dTHjnUlJwoGma4xabgJl6LBYlNo= methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= micromatch@^2.1.5, micromatch@^2.3.11, micromatch@^2.3.7: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= dependencies: arr-diff "^2.0.0" array-unique "^0.2.1" @@ -7254,6 +8292,7 @@ micromatch@^2.1.5, micromatch@^2.3.11, micromatch@^2.3.7: micromatch@^3.0.4: version "3.1.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.5.tgz#d05e168c206472dfbca985bfef4f57797b4cd4ba" + integrity sha512-ykttrLPQrz1PUJcXjwsTUjGoPJ64StIGNE2lGVD1c9CuguJ+L7/navsE8IcDNndOoCMvYV0qc/exfVbMHkUhvA== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -7272,6 +8311,7 @@ micromatch@^3.0.4: micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -7290,80 +8330,97 @@ micromatch@^3.1.4: "mime-db@>= 1.30.0 < 2": version "1.32.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.32.0.tgz#485b3848b01a3cda5f968b4882c0771e58e09414" + integrity sha512-+ZWo/xZN40Tt6S+HyakUxnSOgff+JEdaneLWIm0Z6LmpCn5DMcZntLyUY5c/rTDog28LhXLKOUZKoTxTCAdBVw== mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" + integrity sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE= mime-db@~1.35.0: version "1.35.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47" + integrity sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg== mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7: version "2.1.17" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" + integrity sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo= dependencies: mime-db "~1.30.0" mime-types@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-1.0.2.tgz#995ae1392ab8affcbfcb2641dd054e943c0d5dce" + integrity sha1-mVrhOSq4r/y/yyZB3QVOlDwNXc4= mime-types@~2.1.18, mime-types@~2.1.19: version "2.1.19" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0" + integrity sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw== dependencies: mime-db "~1.35.0" mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== mime@^1.2.11, mime@^1.3.4: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mime@~1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10" + integrity sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA= mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== min-document@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= dependencies: dom-walk "^0.1.0" "minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimatch@^2.0.1: version "2.0.10" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" + integrity sha1-jQh8OcazjAAbl/ynzm0OHoCvusc= dependencies: brace-expansion "^1.0.0" minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= minimist@1.2.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= minipass@^2.2.1, minipass@^2.3.3: version "2.3.4" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957" + integrity sha512-mlouk1OHlaUE8Odt1drMtG1bAJA4ZA6B/ehysgV0LUIrDHdKgo1KorZq3pK0b/7Z7LJIQ12MNM6aC+Tn6lUZ5w== dependencies: safe-buffer "^5.1.2" yallist "^3.0.0" @@ -7371,12 +8428,14 @@ minipass@^2.2.1, minipass@^2.3.3: minizlib@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" + integrity sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA== dependencies: minipass "^2.2.1" mixin-deep@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.0.tgz#47a8732ba97799457c8c1eca28f95132d7e8150a" + integrity sha512-dgaCvoh6i1nosAUBKb0l0pfJ78K8+S9fluyIR2YvAeUD/QuMahnFnF3xYty5eYXMjhGSsB0DsW6A0uAZyetoAg== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" @@ -7384,20 +8443,24 @@ mixin-deep@^1.2.0: mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" mkdirp@^0.3.5: version "0.3.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" + integrity sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc= mktemp@^0.4.0, mktemp@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/mktemp/-/mktemp-0.4.0.tgz#6d0515611c8a8c84e484aa2000129b98e981ff0b" + integrity sha1-bQUVYRyKjITkhKogABKbmOmB/ws= mocha@^3.0.2, mocha@^3.4.2: version "3.5.3" resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.5.3.tgz#1e0480fe36d2da5858d1eb6acc38418b26eaa20d" + integrity sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg== dependencies: browser-stdout "1.3.0" commander "2.9.0" @@ -7415,16 +8478,19 @@ mocha@^3.0.2, mocha@^3.4.2: moment-timezone@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.3.1.tgz#3ef47856b02d53b718a10a5ec2023aa299e07bf5" + integrity sha1-PvR4VrAtU7cYoQpewgI6opnge/U= dependencies: moment ">= 2.6.0" "moment@>= 2.6.0": version "2.20.1" resolved "https://registry.yarnpkg.com/moment/-/moment-2.20.1.tgz#d6eb1a46cbcc14a2b2f9434112c1ff8907f313fd" + integrity sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg== morgan@^1.8.1: version "1.9.0" resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.0.tgz#d01fa6c65859b76fcf31b3cb53a3821a311d8051" + integrity sha1-0B+mxlhZt2/PMbPLU6OCGjEdgFE= dependencies: basic-auth "~2.0.0" debug "2.6.9" @@ -7435,34 +8501,42 @@ morgan@^1.8.1: mout@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mout/-/mout-1.1.0.tgz#0b29d41e6a80fa9e2d4a5be9d602e1d9d02177f6" + integrity sha512-XsP0vf4As6BfqglxZqbqQ8SR6KQot2AgxvR0gG+WtUkf90vUXchMOZQtPf/Hml1rEffJupqL/tIrU6EYhsUQjw== ms@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + integrity sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg= ms@0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + integrity sha1-riXPJRKziFodldfwN4aNhDESR2U= ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= mustache@^2.2.1: version "2.3.0" resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.0.tgz#4028f7778b17708a489930a6e52ac3bca0da41d0" + integrity sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA= mute-stream@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" + integrity sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s= mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= mz@^2.6.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== dependencies: any-promise "^1.0.0" object-assign "^4.0.1" @@ -7471,6 +8545,7 @@ mz@^2.6.0: najax@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/najax/-/najax-1.0.3.tgz#11145f4d910446ea661d8ab7fcef53f6ad164ae5" + integrity sha1-ERRfTZEERupmHYq3/O9T9q0WSuU= dependencies: jquery-deferred "^0.3.0" lodash.defaultsdeep "^4.6.0" @@ -7479,18 +8554,22 @@ najax@^1.0.2: nan@^2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + integrity sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA== nan@^2.3.0: version "2.8.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" + integrity sha1-7XFfP+neArV6XmJS2QqWZ14fCFo= nan@^2.9.2: version "2.11.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.0.tgz#574e360e4d954ab16966ec102c0c049fd961a099" + integrity sha512-F4miItu2rGnV2ySkXOQoA8FKz/SR2Q2sWP0sbTxNxz/tuokeC8WxOhPMcwi0qIyGtVn/rrSeLbvVkznqCdwYnw== nanomatch@^1.2.5: version "1.2.7" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.7.tgz#53cd4aa109ff68b7f869591fdc9d10daeeea3e79" + integrity sha512-/5ldsnyurvEw7wNpxLFgjVvBLMta43niEYOy0CJ4ntcYSbx6bugRUTQeFb4BR/WanEL1o3aQgHuVLHQaB6tOqg== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -7507,6 +8586,7 @@ nanomatch@^1.2.5: nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -7523,10 +8603,12 @@ nanomatch@^1.2.9: natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= needle@^2.2.1: version "2.2.4" resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" + integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== dependencies: debug "^2.1.2" iconv-lite "^0.4.4" @@ -7535,16 +8617,19 @@ needle@^2.2.1: negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= no-case@^2.2.0: version "2.3.2" resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== dependencies: lower-case "^1.1.1" node-fetch@^1.3.3: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== dependencies: encoding "^0.1.11" is-stream "^1.0.1" @@ -7552,10 +8637,12 @@ node-fetch@^1.3.3: node-fetch@^2.0.0-alpha.9: version "2.2.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.2.0.tgz#4ee79bde909262f9775f731e3656d0db55ced5b5" + integrity sha512-OayFWziIxiHY8bCUyLX6sTpDH8Jsbp4FfYd1j1f7vZyfgkcOnAyM4oQR16f8a0s7Gl/viMGRey8eScYk4V4EZA== node-gyp@^3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== dependencies: fstream "^1.0.0" glob "^7.0.3" @@ -7573,14 +8660,17 @@ node-gyp@^3.8.0: node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= node-modules-path@^1.0.0, node-modules-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/node-modules-path/-/node-modules-path-1.0.1.tgz#40096b08ce7ad0ea14680863af449c7c75a5d1c8" + integrity sha1-QAlrCM560OoUaAhjr0ScfHWl0cg= node-notifier@^5.0.1: version "5.2.1" resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" + integrity sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg== dependencies: growly "^1.3.0" semver "^5.4.1" @@ -7590,6 +8680,7 @@ node-notifier@^5.0.1: node-pre-gyp@^0.10.0: version "0.10.3" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" + integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" @@ -7605,6 +8696,7 @@ node-pre-gyp@^0.10.0: node-pre-gyp@^0.6.39: version "0.6.39" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" + integrity sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ== dependencies: detect-libc "^1.0.2" hawk "3.1.3" @@ -7621,6 +8713,7 @@ node-pre-gyp@^0.6.39: node-rest-client@^1.5.1: version "1.8.0" resolved "https://registry.yarnpkg.com/node-rest-client/-/node-rest-client-1.8.0.tgz#8d3c566b817e27394cb7273783a41caefe3e5955" + integrity sha1-jTxWa4F+JzlMtyc3g6Qcrv4+WVU= dependencies: debug "~2.2.0" xml2js ">=0.2.4" @@ -7628,6 +8721,7 @@ node-rest-client@^1.5.1: node-sass@^4.7.2: version "4.9.3" resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.3.tgz#f407cf3d66f78308bb1e346b24fa428703196224" + integrity sha512-XzXyGjO+84wxyH7fV6IwBOTrEBe2f0a6SBze9QWWYR/cL74AcQUks2AsqcCZenl/Fp/JVbuEaLpgrLtocwBUww== dependencies: async-foreach "^0.1.3" chalk "^1.1.1" @@ -7652,16 +8746,19 @@ node-sass@^4.7.2: node-uuid@~1.4.0: version "1.4.8" resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" + integrity sha1-sEDrCSOWivq/jTL7HxfxFn/auQc= "nopt@2 || 3", nopt@^3.0.3, nopt@^3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= dependencies: abbrev "1" nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= dependencies: abbrev "1" osenv "^0.1.4" @@ -7669,6 +8766,7 @@ nopt@^4.0.1: normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== dependencies: hosted-git-info "^2.1.4" is-builtin-module "^1.0.0" @@ -7678,24 +8776,29 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= npm-bundled@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" + integrity sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g== npm-git-info@^1.0.0, npm-git-info@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/npm-git-info/-/npm-git-info-1.0.3.tgz#a933c42ec321e80d3646e0d6e844afe94630e1d5" + integrity sha1-qTPELsMh6A02RuDW6ESv6UYw4dU= npm-package-arg@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.0.0.tgz#8cce04b49d3f9faec3f56b0fe5f4391aeb9d2fac" + integrity sha512-hwC7g81KLgRmchv9ol6f3Fx4Yyc9ARX5X5niDHVILgpuvf08JRIgOZcEfpFXli3BgESoTrkauqorXm6UbvSgSg== dependencies: hosted-git-info "^2.5.0" osenv "^0.1.4" @@ -7705,6 +8808,7 @@ npm-package-arg@^6.0.0: npm-packlist@^1.1.6: version "1.1.11" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de" + integrity sha512-CxKlZ24urLkJk+9kCm48RTQ7L4hsmgSVzEk0TLGPzzyuFxD7VNgy5Sl24tOLMzQv773a/NeJ1ce1DKeacqffEA== dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -7712,12 +8816,14 @@ npm-packlist@^1.1.6: npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= dependencies: path-key "^2.0.0" "npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" @@ -7727,60 +8833,74 @@ npm-run-path@^2.0.0: nth-check@~1.0.0, nth-check@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" + integrity sha1-mSms32KPwsQQmN6rgqxYDPFJquQ= dependencies: boolbase "~1.0.0" num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= "nwmatcher@>= 1.3.7 < 2.0.0": version "1.4.4" resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" + integrity sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ== "nwmatcher@>= 1.3.9 < 2.0.0": version "1.4.3" resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c" + integrity sha512-IKdSTiDWCarf2JTS5e9e2+5tPZGdkRJ79XjYV0pzK8Q9BpsFyBq1RGKxzs7Q8UBushGw7m6TzVKz6fcY99iSWw== nwsapi@^2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.7.tgz#6fc54c254621f10cac5225b76e81c74120139b78" + integrity sha512-VZXniaaaORAXGCNsvUNefsKRQYk8zCzQZ57jalgrpHcU70OrAzKAiN/3plYtH/VPRmZeYyUzQiYfKzcMXC1g5Q== oauth-sign@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.3.0.tgz#cb540f93bb2b22a7d5941691a288d60e8ea9386e" + integrity sha1-y1QPk7srIqfVlBaRoojWDo6pOG4= oauth-sign@~0.8.1, oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM= oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== object-assign@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + integrity sha1-ejs9DpgGPUP0wD8uiubNUahog6A= object-assign@4.1.1, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object-assign@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" + integrity sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo= object-component@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" @@ -7789,12 +8909,14 @@ object-copy@^0.1.0: object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= dependencies: isobject "^3.0.0" object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= dependencies: for-own "^0.1.4" is-extendable "^0.1.1" @@ -7802,38 +8924,45 @@ object.omit@^2.0.0: object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= dependencies: isobject "^3.0.1" on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= dependencies: ee-first "1.1.1" on-headers@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + integrity sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c= once@^1.3.0, once@^1.3.3: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" onetime@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k= onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= dependencies: mimic-fn "^1.0.0" optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= dependencies: minimist "~0.0.1" wordwrap "~0.0.2" @@ -7841,6 +8970,7 @@ optimist@^0.6.1: optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= dependencies: deep-is "~0.1.3" fast-levenshtein "~2.0.4" @@ -7852,10 +8982,12 @@ optionator@^0.8.1, optionator@^0.8.2: options@>=0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" + integrity sha1-7CLTEoBrtT5zF3Pnza788cZDEo8= ora@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ora/-/ora-1.4.0.tgz#884458215b3a5d4097592285f93321bb7a79e2e5" + integrity sha512-iMK1DOQxzzh2MBlVsU42G80mnrvUhqsMh74phHtDlrcTZPK0pH6o7l7DRshK+0YsxDyEuaOkziVdvM3T0QTzpw== dependencies: chalk "^2.1.0" cli-cursor "^2.1.0" @@ -7865,24 +8997,29 @@ ora@^1.3.0: os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= os-locale@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= dependencies: lcid "^1.0.0" os-shim@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" + integrity sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc= os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= osenv@0: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" @@ -7890,6 +9027,7 @@ osenv@0: osenv@^0.1.3, osenv@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + integrity sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ= dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" @@ -7897,38 +9035,46 @@ osenv@^0.1.3, osenv@^0.1.4: p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= p-is-promise@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" + integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4= p-limit@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" + integrity sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng== dependencies: p-try "^1.0.0" p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= dependencies: p-limit "^1.1.0" p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= parse-bmfont-ascii@^1.0.3: version "1.0.6" resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285" + integrity sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU= parse-bmfont-binary@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz#d038b476d3e9dd9db1e11a0b0e53a22792b69006" + integrity sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY= parse-bmfont-xml@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz#015319797e3e12f9e739c4d513872cd2fa35f389" + integrity sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ== dependencies: xml-parse-from-string "^1.0.0" xml2js "^0.4.5" @@ -7936,6 +9082,7 @@ parse-bmfont-xml@^1.1.4: parse-git-config@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/parse-git-config/-/parse-git-config-1.1.1.tgz#d3a9984317132f57398712bba438e129590ddf8c" + integrity sha1-06mYQxcTL1c5hxK7pDjhKVkN34w= dependencies: extend-shallow "^2.0.1" fs-exists-sync "^0.1.0" @@ -7945,6 +9092,7 @@ parse-git-config@^1.1.1: parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= dependencies: glob-base "^0.3.0" is-dotfile "^1.0.0" @@ -7954,6 +9102,7 @@ parse-glob@^3.0.4: parse-headers@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.1.tgz#6ae83a7aa25a9d9b700acc28698cd1f1ed7e9536" + integrity sha1-aug6eqJanZtwCswoaYzR8e1+lTY= dependencies: for-each "^0.3.2" trim "0.0.1" @@ -7961,104 +9110,126 @@ parse-headers@^2.0.0: parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= dependencies: error-ex "^1.2.0" parse-ms@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" + integrity sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0= parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= parse-png@^1.0.0, parse-png@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/parse-png/-/parse-png-1.1.2.tgz#f5c2ad7c7993490986020a284c19aee459711ff2" + integrity sha1-9cKtfHmTSQmGAgooTBmu5FlxH/I= dependencies: pngjs "^3.2.0" parse5@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== parse5@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" + integrity sha1-m387DeMr543CQBsXVzzK8Pb1nZQ= parsejson@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab" + integrity sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs= dependencies: better-assert "~1.0.0" parseqs@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= dependencies: better-assert "~1.0.0" parseuri@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= dependencies: better-assert "~1.0.0" parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= passwd-user@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/passwd-user/-/passwd-user-1.2.1.tgz#a01a5dc639ef007dc56364b8178569080ad3a7b8" + integrity sha1-oBpdxjnvAH3FY2S4F4VpCArTp7g= dependencies: exec-file-sync "^2.0.0" path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= dependencies: pinkie-promise "^2.0.0" path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= path-key@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + integrity sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME= path-posix@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/path-posix/-/path-posix-1.0.0.tgz#06b26113f56beab042545a23bfa88003ccac260f" + integrity sha1-BrJhE/Vr6rBCVFojv6iAA8ysJg8= path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= dependencies: graceful-fs "^4.1.2" pify "^2.0.0" @@ -8067,14 +9238,17 @@ path-type@^1.0.0: pathval@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" + integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= perfectionist@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/perfectionist/-/perfectionist-2.4.0.tgz#c147ad3714e126467f1764129ee72df861d47ea0" + integrity sha1-wUetNxThJkZ/F2QSnuct+GHUfqA= dependencies: comment-regex "^1.0.0" defined "^1.0.0" @@ -8090,14 +9264,17 @@ perfectionist@^2.4.0: performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + integrity sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU= performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= phantomjs-prebuilt@^2.1.10: version "2.1.16" resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz#efd212a4a3966d3647684ea8ba788549be2aefef" + integrity sha1-79ISpKOWbTZHaE6ouniFSb4q7+8= dependencies: es6-promise "^4.0.3" extract-zip "^1.6.5" @@ -8112,42 +9289,51 @@ phantomjs-prebuilt@^2.1.10: pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= pixelmatch@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854" + integrity sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ= dependencies: pngjs "^3.0.0" pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== pn@^1.0.0, pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== pngjs@^3.0.0, pngjs@^3.2.0: version "3.3.3" resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.3.3.tgz#85173703bde3edac8998757b96e5821d0966a21b" + integrity sha512-1n3Z4p3IOxArEs1VRXnZ/RXdfEniAUS9jb68g58FIXMNkPJeZd+Qh4Uq7/e0LVxAQGos1eIUrqrt4FpjdnEd+Q== portfinder@^1.0.7: version "1.0.13" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" + integrity sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek= dependencies: async "^1.5.2" debug "^2.2.0" @@ -8156,10 +9342,12 @@ portfinder@^1.0.7: posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= postcss-easy-import@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-easy-import/-/postcss-easy-import-3.0.0.tgz#8eaaf5ae59566083d0cae98735dfd803e3ab194d" + integrity sha512-cfNsear/v8xlkl9v5Wm8y4Do/puiDQTFF+WX2Fo++h7oKt1fKWVVW/5Ca8hslYDQWnjndrg813cA23Pt1jsYdg== dependencies: globby "^6.1.0" is-glob "^4.0.0" @@ -8173,6 +9361,7 @@ postcss-easy-import@^3.0.0: postcss-functions@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-functions/-/postcss-functions-3.0.0.tgz#0e94d01444700a481de20de4d55fb2640564250e" + integrity sha1-DpTQFERwCkgd4g3k1V+yZAVkJQ4= dependencies: glob "^7.1.2" object-assign "^4.1.1" @@ -8182,6 +9371,7 @@ postcss-functions@^3.0.0: postcss-import@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-10.0.0.tgz#4c85c97b099136cc5ea0240dc1dfdbfde4e2ebbe" + integrity sha1-TIXJewmRNsxeoCQNwd/b/eTi674= dependencies: object-assign "^4.0.1" postcss "^6.0.1" @@ -8192,6 +9382,7 @@ postcss-import@^10.0.0: postcss-js@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-1.0.1.tgz#ffaf29226e399ea74b5dce02cab1729d7addbc7b" + integrity sha512-smhUUMF5o5W1ZCQSyh5A3lNOXFLdNrxqyhWbLsGolZH2AgVmlyhxhYbIixfsdKE6r1vG5i7O40DPcvEvE1mvjw== dependencies: camelcase-css "^1.0.1" postcss "^6.0.11" @@ -8199,12 +9390,14 @@ postcss-js@^1.0.1: postcss-less@^1.1.3: version "1.1.5" resolved "http://registry.npmjs.org/postcss-less/-/postcss-less-1.1.5.tgz#a6f0ce180cf3797eeee1d4adc0e9e6d6db665609" + integrity sha512-QQIiIqgEjNnquc0d4b6HDOSFZxbFQoy4MPpli2lSLpKhMyBkKwwca2HFqu4xzxlKID/F2fxSOowwtKpgczhF7A== dependencies: postcss "^5.2.16" postcss-nested@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-3.0.0.tgz#cde40bd07a078565f3df72e2dc2665871c724852" + integrity sha512-1xxmLHSfubuUi6xZZ0zLsNoiKfk3BWQj6fkNMaBJC529wKKLcdeCxXt6KJmDLva+trNyQNwEaE/ZWMA7cve1fA== dependencies: postcss "^6.0.14" postcss-selector-parser "^3.1.1" @@ -8212,24 +9405,28 @@ postcss-nested@^3.0.0: postcss-scss@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-0.3.1.tgz#65c610d8e2a7ee0e62b1835b71b8870734816e4b" + integrity sha1-ZcYQ2OKn7g5isYNbcbiHBzSBbks= dependencies: postcss "^5.2.4" postcss-scss@^1.0.3: version "1.0.6" resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-1.0.6.tgz#ab903f3bb20161bc177896462293a53d4bff5f7a" + integrity sha512-4EFYGHcEw+H3E06PT/pQQri06u/1VIIPjeJQaM8skB80vZuXMhp4cSNV5azmdNkontnOID/XYWEvEEELLFB1ww== dependencies: postcss "^6.0.23" postcss-selector-namespace@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/postcss-selector-namespace/-/postcss-selector-namespace-1.5.0.tgz#62335de8f1992eae989d1be33ba2298156ab458b" + integrity sha512-tQmqzuqOyH4sCwr+yRmnIKPzNQy1tIVvEZMR9qd82npDJ2X5KwMoeFFjCdupJ00eqMrCYj58wWvSwwZDA3kTmA== dependencies: postcss "^6.0.14" postcss-selector-parser@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865" + integrity sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU= dependencies: dot-prop "^4.1.1" indexes-of "^1.0.1" @@ -8238,10 +9435,12 @@ postcss-selector-parser@^3.1.1: postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" + integrity sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU= postcss@^5.0.8, postcss@^5.2.16, postcss@^5.2.4: version "5.2.18" resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" + integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg== dependencies: chalk "^1.1.3" js-base64 "^2.1.9" @@ -8251,6 +9450,7 @@ postcss@^5.0.8, postcss@^5.2.16, postcss@^5.2.4: postcss@^6.0.1, postcss@^6.0.11, postcss@^6.0.14, postcss@^6.0.17, postcss@^6.0.19, postcss@^6.0.20, postcss@^6.0.23, postcss@^6.0.9: version "6.0.23" resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== dependencies: chalk "^2.4.1" source-map "^0.6.1" @@ -8259,14 +9459,17 @@ postcss@^6.0.1, postcss@^6.0.11, postcss@^6.0.14, postcss@^6.0.17, postcss@^6.0. prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= pretender@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/pretender/-/pretender-1.6.1.tgz#77d1e42ac8c6b298f5cd43534a87645df035db8c" + integrity sha1-d9HkKsjGspj1zUNTSodkXfA124w= dependencies: fake-xml-http-request "^1.6.0" route-recognizer "^0.3.3" @@ -8274,52 +9477,63 @@ pretender@^1.6.1: pretty-ms@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-3.2.0.tgz#87a8feaf27fc18414d75441467d411d6e6098a25" + integrity sha512-ZypexbfVUGTFxb0v+m1bUyy92DHe5SyYlnyY0msyms5zd3RwyvNgyxZZsXXgoyzlxjx5MiqtXUdhUfvQbe0A2Q== dependencies: parse-ms "^1.0.0" printf@^0.2.3: version "0.2.5" resolved "https://registry.yarnpkg.com/printf/-/printf-0.2.5.tgz#c438ca2ca33e3927671db4ab69c0e52f936a4f0f" + integrity sha1-xDjKLKM+OSdnHbSracDlL5NqTw8= private@^0.1.6, private@^0.1.7, private@^0.1.8, private@~0.1.5: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== 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" + integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== process-relative-require@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/process-relative-require/-/process-relative-require-1.0.0.tgz#1590dfcf5b8f2983ba53e398446b68240b4cc68a" + integrity sha1-FZDfz1uPKYO6U+OYRGtoJAtMxoo= dependencies: node-modules-path "^1.0.0" process@~0.5.1: version "0.5.2" resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" + integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8= progress@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + integrity sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74= progress@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + integrity sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8= promise-map-series@^0.2.1: version "0.2.3" resolved "https://registry.yarnpkg.com/promise-map-series/-/promise-map-series-0.2.3.tgz#c2d377afc93253f6bd03dbb77755eb88ab20a847" + integrity sha1-wtN3r8kyU/a9A9u3d1XriKsgqEc= dependencies: rsvp "^3.0.14" proxy-addr@~2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec" + integrity sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew= dependencies: forwarded "~0.1.2" ipaddr.js "1.5.2" @@ -8327,6 +9541,7 @@ proxy-addr@~2.0.2: proxy-addr@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" + integrity sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA== dependencies: forwarded "~0.1.2" ipaddr.js "1.8.0" @@ -8334,42 +9549,52 @@ proxy-addr@~2.0.3: pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= psl@^1.1.24: version "1.1.28" resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.28.tgz#4fb6ceb08a1e2214d4fd4de0ca22dae13740bc7b" + integrity sha512-+AqO1Ae+N/4r7Rvchrdm432afjT9hqJRyBN3DQv9At0tPz4hIFSGKbq64fN9dVoCow4oggIIax5/iONx0r9hZw== punycode@2.x.x, punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= qs@6.5.1, qs@^6.4.0, qs@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + integrity sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A== qs@^6.2.0, qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== qs@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/qs/-/qs-1.0.2.tgz#50a93e2b5af6691c31bcea5dae78ee6ea1903768" + integrity sha1-UKk+K1r2aRwxvOpdrnjubqGQN2g= qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + integrity sha1-E+JtKK1rD/qpExLNO/cI7TUecjM= quick-temp@^0.1.0, quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quick-temp@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/quick-temp/-/quick-temp-0.1.8.tgz#bab02a242ab8fb0dd758a3c9776b32f9a5d94408" + integrity sha1-urAqJCq4+w3XWKPJd2sy+aXZRAg= dependencies: mktemp "~0.4.0" rimraf "^2.5.4" @@ -8378,6 +9603,7 @@ quick-temp@^0.1.0, quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quic qunit-dom@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-0.5.0.tgz#b08db6f919656e0589ebf8bd85bc313febb454d8" + integrity sha1-sI22+RllbgWJ6/i9hbwxP+u0VNg= dependencies: broccoli-funnel "^2.0.0" broccoli-merge-trees "^2.0.0" @@ -8385,6 +9611,7 @@ qunit-dom@^0.5.0: qunit@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.5.0.tgz#64cbe30a1193ef02edc5b278efcdf1d0bae96b22" + integrity sha512-GVvRr8ISFMs4SkTWFsaUzMBs7QEuiXVT4orlFgyHkmeXO1ijlDkhW6ecPri4urXiE4BUXEULJAtFlV1MWgg4Uw== dependencies: chokidar "1.7.0" commander "2.12.2" @@ -8398,6 +9625,7 @@ qunit@^2.5.0: randomatic@^1.1.3: version "1.1.7" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" + integrity sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how== dependencies: is-number "^3.0.0" kind-of "^4.0.0" @@ -8405,10 +9633,12 @@ randomatic@^1.1.3: range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= raw-body@2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" + integrity sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k= dependencies: bytes "3.0.0" http-errors "1.6.2" @@ -8418,6 +9648,7 @@ raw-body@2.3.2: raw-body@~1.1.0: version "1.1.7" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.1.7.tgz#1d027c2bfa116acc6623bca8f00016572a87d425" + integrity sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU= dependencies: bytes "1" string_decoder "0.10" @@ -8425,6 +9656,7 @@ raw-body@~1.1.0: rc@^1.1.7: version "1.2.5" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd" + integrity sha1-J1zWh/bjs2zHVrqibf7oCnkDAf0= dependencies: deep-extend "~0.4.0" ini "~1.3.0" @@ -8434,6 +9666,7 @@ rc@^1.1.7: rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: deep-extend "^0.6.0" ini "~1.3.0" @@ -8443,22 +9676,26 @@ rc@^1.2.7: read-cache@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= dependencies: pify "^2.3.0" read-chunk@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-1.0.1.tgz#5f68cab307e663f19993527d9b589cace4661194" + integrity sha1-X2jKswfmY/GZk1J9m1icrORmEZQ= read-file-stdin@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/read-file-stdin/-/read-file-stdin-0.2.1.tgz#25eccff3a153b6809afacb23ee15387db9e0ee61" + integrity sha1-JezP86FTtoCa+ssj7hU4fbng7mE= dependencies: gather-stream "^1.0.0" read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= dependencies: find-up "^1.0.0" read-pkg "^1.0.0" @@ -8466,6 +9703,7 @@ read-pkg-up@^1.0.1: read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= dependencies: load-json-file "^1.0.0" normalize-package-data "^2.3.2" @@ -8474,6 +9712,7 @@ read-pkg@^1.0.0: readable-stream@1.1: version "1.1.13" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" + integrity sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4= dependencies: core-util-is "~1.0.0" inherits "~2.0.1" @@ -8483,6 +9722,7 @@ readable-stream@1.1: readable-stream@^2, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" + integrity sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -8495,6 +9735,7 @@ readable-stream@^2, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-str readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.1.5: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -8507,6 +9748,7 @@ readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.1.5: readable-stream@~1.0.2: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= dependencies: core-util-is "~1.0.0" inherits "~2.0.1" @@ -8516,6 +9758,7 @@ readable-stream@~1.0.2: readdirp@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + integrity sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg= dependencies: graceful-fs "^4.1.2" minimatch "^3.0.2" @@ -8525,6 +9768,7 @@ readdirp@^2.0.0: recast@^0.11.3: version "0.11.23" resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" + integrity sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM= dependencies: ast-types "0.9.6" esprima "~3.1.0" @@ -8534,6 +9778,7 @@ recast@^0.11.3: redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= dependencies: indent-string "^2.1.0" strip-indent "^1.0.1" @@ -8541,28 +9786,34 @@ redent@^1.0.0: redeyed@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-1.0.1.tgz#e96c193b40c0816b00aec842698e61185e55498a" + integrity sha1-6WwZO0DAgWsArshCaY5hGF5VSYo= dependencies: esprima "~3.0.0" regenerate@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" + integrity sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg== regenerator-runtime@^0.10.5: version "0.10.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-runtime@^0.9.5: version "0.9.6" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz#d33eb95d0d2001a4be39659707c51b0cb71ce029" + integrity sha1-0z65XQ0gAaS+OWWXB8UbDLcc4Ck= regenerator-transform@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== dependencies: babel-runtime "^6.18.0" babel-types "^6.19.0" @@ -8571,18 +9822,21 @@ regenerator-transform@^0.10.0: regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== dependencies: is-equal-shallow "^0.1.3" regex-not@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.0.tgz#42f83e39771622df826b02af176525d6a5f157f9" + integrity sha1-Qvg+OXcWIt+CawKvF2Ul1qXxV/k= dependencies: extend-shallow "^2.0.1" regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== dependencies: extend-shallow "^3.0.2" safe-regex "^1.1.0" @@ -8590,6 +9844,7 @@ regex-not@^1.0.2: regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= dependencies: regenerate "^1.2.1" regjsgen "^0.2.0" @@ -8598,50 +9853,60 @@ regexpu-core@^2.0.0: regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= regjsparser@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= dependencies: jsesc "~0.5.0" remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + integrity sha1-7wiaF40Ug7quTZPrmLT55OEdmQo= repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= dependencies: is-finite "^1.0.0" replace-ext@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" + integrity sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ= request-progress@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08" + integrity sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg= dependencies: throttleit "^1.0.0" request-promise-core@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" + integrity sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY= dependencies: lodash "^4.13.1" request-promise-native@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" + integrity sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU= dependencies: request-promise-core "1.1.1" stealthy-require "^1.1.0" @@ -8650,6 +9915,7 @@ request-promise-native@^1.0.5: request@2.81.0: version "2.81.0" resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + integrity sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA= dependencies: aws-sign2 "~0.6.0" aws4 "^1.2.1" @@ -8677,6 +9943,7 @@ request@2.81.0: request@2.87.0, request@^2.81.0, request@^2.87.0: version "2.87.0" resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" + integrity sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw== dependencies: aws-sign2 "~0.7.0" aws4 "^1.6.0" @@ -8702,6 +9969,7 @@ request@2.87.0, request@^2.81.0, request@^2.87.0: request@^2.55.0, request@^2.65.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -8727,6 +9995,7 @@ request@^2.55.0, request@^2.65.0: request@^2.74.0, request@^2.79.0: version "2.83.0" resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" + integrity sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw== dependencies: aws-sign2 "~0.7.0" aws4 "^1.6.0" @@ -8754,6 +10023,7 @@ request@^2.74.0, request@^2.79.0: request@~2.40.0: version "2.40.0" resolved "https://registry.yarnpkg.com/request/-/request-2.40.0.tgz#4dd670f696f1e6e842e66b4b5e839301ab9beb67" + integrity sha1-TdZw9pbx5uhC5mtLXoOTAaub62c= dependencies: forever-agent "~0.5.0" json-stringify-safe "~5.0.0" @@ -8773,24 +10043,29 @@ request@~2.40.0: require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= require-folder-tree@^1.4.5: version "1.4.5" resolved "https://registry.yarnpkg.com/require-folder-tree/-/require-folder-tree-1.4.5.tgz#dfe553cbab98cc88e1c56a3f2f358f06ef85bcb0" + integrity sha1-3+VTy6uYzIjhxWo/LzWPBu+FvLA= dependencies: lodash "3.8.0" require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= require-relative@^0.8.7: version "0.8.7" resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" + integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4= require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= dependencies: caller-path "^0.1.0" resolve-from "^1.0.0" @@ -8798,14 +10073,17 @@ require-uncached@^1.0.3: requireindex@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162" + integrity sha1-5UBLgVV+91225JxacgBIk/4D4WI= requires-port@1.x.x: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= resize-img@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/resize-img/-/resize-img-1.1.2.tgz#fad650faf3ef2c53ea63112bc272d95e9d92550e" + integrity sha1-+tZQ+vPvLFPqYxErwnLZXp2SVQ4= dependencies: bmp-js "0.0.1" file-type "^3.8.0" @@ -8817,6 +10095,7 @@ resize-img@^1.1.0: resolve-dir@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" + integrity sha1-shklmlYC+sXFxJatiUpujMQwJh4= dependencies: expand-tilde "^1.2.2" global-modules "^0.2.3" @@ -8824,6 +10103,7 @@ resolve-dir@^0.1.0: resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= dependencies: expand-tilde "^2.0.0" global-modules "^1.0.0" @@ -8831,26 +10111,31 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1: resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= resolve@1.5.0, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.0, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" + integrity sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw== dependencies: path-parse "^1.0.5" resolve@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" + integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== dependencies: path-parse "^1.0.5" restore-cursor@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + integrity sha1-NGYfRohjJ/7SmRR5FSJS35LapUE= dependencies: exit-hook "^1.0.0" onetime "^1.0.0" @@ -8858,6 +10143,7 @@ restore-cursor@^1.0.1: restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= dependencies: onetime "^2.0.0" signal-exit "^3.0.2" @@ -8865,26 +10151,31 @@ restore-cursor@^2.0.0: ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= dependencies: align-text "^0.1.1" rimraf@2, rimraf@^2.2.8, rimraf@^2.3.2, rimraf@^2.3.4, rimraf@^2.4.1, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.1, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== dependencies: glob "^7.0.5" rimraf@~2.2.6: version "2.2.8" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= rollup-plugin-commonjs@^8.3.0: version "8.4.1" resolved "http://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.4.1.tgz#5c9cea2b2c3de322f5fbccd147e07ed5e502d7a0" + integrity sha512-mg+WuD+jlwoo8bJtW3Mvx7Tz6TsIdMsdhuvCnDMoyjh0oxsVgsjB/N0X984RJCWwc5IIiqNVJhXeeITcc73++A== dependencies: acorn "^5.2.1" estree-walker "^0.5.0" @@ -8895,6 +10186,7 @@ rollup-plugin-commonjs@^8.3.0: rollup-plugin-node-resolve@^3.3.0: version "3.4.0" resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.4.0.tgz#908585eda12e393caac7498715a01e08606abc89" + integrity sha512-PJcd85dxfSBWih84ozRtBkB731OjXk0KnzN0oGp7WOWcarAFkVa71cV5hTJg2qpVsV2U8EUwrzHP3tvy9vS3qg== dependencies: builtin-modules "^2.0.0" is-module "^1.0.0" @@ -8903,6 +10195,7 @@ rollup-plugin-node-resolve@^3.3.0: rollup-pluginutils@^2.0.1: version "2.3.1" resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.3.1.tgz#760d185ccc237dedc12d7ae48c6bcd127b4892d0" + integrity sha512-JZS8aJMHEHhqmY2QVPMXwKP6lsD1ShkrcGYjhAIvqKKdXQyPHw/9NF0tl3On/xOJ4ACkxfeG7AF+chfCN1NpBg== dependencies: estree-walker "^0.5.2" micromatch "^2.3.11" @@ -8910,6 +10203,7 @@ rollup-pluginutils@^2.0.1: rollup@^0.57.1: version "0.57.1" resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.57.1.tgz#0bb28be6151d253f67cf4a00fea48fb823c74027" + integrity sha512-I18GBqP0qJoJC1K1osYjreqA8VAKovxuI3I81RSk0Dmr4TgloI0tAULjZaox8OsJ+n7XRrhH6i0G2By/pj1LCA== dependencies: "@types/acorn" "^4.0.3" acorn "^5.5.3" @@ -8926,76 +10220,93 @@ rollup@^0.57.1: route-recognizer@^0.2.3: version "0.2.10" resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.2.10.tgz#024b2283c2e68d13a7c7f5173a5924645e8902df" + integrity sha1-Aksig8LmjROnx/UXOlkkZF6JAt8= route-recognizer@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.3.tgz#1d365e27fa6995e091675f7dc940a8c00353bd29" + integrity sha1-HTZeJ/ppleCRZ199yUCowANTvSk= rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.2.1, rsvp@^3.3.1, rsvp@^3.3.3, rsvp@^3.5.0: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" + integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== rsvp@^4.6.1, rsvp@^4.7.0: version "4.8.1" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.1.tgz#168addb3963222de37ee351b70e3876bdb2ac285" + integrity sha512-c9tShmZbQ5nLVVVl3Fuhk1NExJlXfAMIEz7a8GC570X8XhNQNZPFAdjOeMmJEN3SLYOOb2OprS576P/QO4QouA== rsvp@^4.8.1, rsvp@^4.8.2, rsvp@^4.8.3: version "4.8.3" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.3.tgz#25d4b9fdd0f95e216eb5884d9b3767d3fbfbe2cd" + integrity sha512-/OlbK31XtkPnLD2ktmZXj4g/v6q1boTDr6/3lFuDTgxVsrA3h7PH5eYyAxIvDMjRHr/DoOlzNicqDwBEo9xU7g== rsvp@~3.0.6: version "3.0.21" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.0.21.tgz#49c588fe18ef293bcd0ab9f4e6756e6ac433359f" + integrity sha1-ScWI/hjvKTvNCrn05nVuasQzNZ8= rsvp@~3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.2.1.tgz#07cb4a5df25add9e826ebc67dcc9fd89db27d84a" + integrity sha1-B8tKXfJa3Z6Cbrxn3Mn9idsn2Eo= run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= dependencies: is-promise "^2.1.0" rx-lite-aggregates@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= dependencies: rx-lite "*" rx-lite@*, rx-lite@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= rx@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== safe-buffer@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-json-parse@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" + integrity sha1-PnZyPjjf3aE8mx0poeB//uSzC1c= safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= dependencies: ret "~0.1.10" "safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sane@^1.1.1, sane@^1.4.1: version "1.7.0" resolved "https://registry.yarnpkg.com/sane/-/sane-1.7.0.tgz#b3579bccb45c94cf20355cc81124990dfd346e30" + integrity sha1-s1ebzLRclM8gNVzIESSZDf00bjA= dependencies: anymatch "^1.3.0" exec-sh "^0.2.0" @@ -9008,6 +10319,7 @@ sane@^1.1.1, sane@^1.4.1: sane@^2.2.0: version "2.4.1" resolved "https://registry.yarnpkg.com/sane/-/sane-2.4.1.tgz#29f991208cf28636720efdc584293e7fd66663a5" + integrity sha512-fW9svvNd81XzHDZyis9/tEY1bZikDGryy8Hi1BErPyNPYv47CdLseUN+tI5FBHWXEENRtj1SWtX/jBnggLaP0w== dependencies: anymatch "^1.3.0" exec-sh "^0.2.0" @@ -9022,6 +10334,7 @@ sane@^2.2.0: sass-graph@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" + integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k= dependencies: glob "^7.0.0" lodash "^4.0.0" @@ -9031,16 +10344,19 @@ sass-graph@^2.2.4: sass@^1.13.2: version "1.14.1" resolved "https://registry.yarnpkg.com/sass/-/sass-1.14.1.tgz#6f7b083b880104caa19e45841cdb0889d9bdadbf" + integrity sha512-XjTTos0ocxN4R2vdOoo083PXUt1XZkOO+ynAl4auomOSAbLr4/aGg19cSpR7w90nUtP6cIRysytboJRUGfw03A== dependencies: chokidar "^2.0.0" sax@>=0.6.0, sax@^1.1.4, sax@^1.2.1, sax@^1.2.4, sax@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== scss-tokenizer@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= dependencies: js-base64 "^2.1.8" source-map "^0.4.2" @@ -9048,22 +10364,27 @@ scss-tokenizer@^0.2.3: select@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" + integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= "semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.1.1, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== semver@^4.3.1: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= send@0.16.1: version "0.16.1" resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" + integrity sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A== dependencies: debug "2.6.9" depd "~1.1.1" @@ -9082,6 +10403,7 @@ send@0.16.1: send@0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== dependencies: debug "2.6.9" depd "~1.1.2" @@ -9100,6 +10422,7 @@ send@0.16.2: serve-static@1.13.1: version "1.13.1" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" + integrity sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ== dependencies: encodeurl "~1.0.1" escape-html "~1.0.3" @@ -9109,6 +10432,7 @@ serve-static@1.13.1: serve-static@1.13.2: version "1.13.2" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" @@ -9118,20 +10442,24 @@ serve-static@1.13.2: set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= set-getter@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376" + integrity sha1-12nBgsnVpR9AkUXy+6guXoboA3Y= dependencies: to-object-path "^0.3.0" set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= set-value@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -9141,6 +10469,7 @@ set-value@^0.4.3: set-value@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -9150,66 +10479,80 @@ set-value@^2.0.0: setprototypeof@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + integrity sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ= setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= dependencies: shebang-regex "^1.0.0" shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= shelljs@^0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.2.6.tgz#90492d72ffcc8159976baba62fb0f6884f0c3378" + integrity sha1-kEktcv/MgVmXa6umL7D2iE8MM3g= shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= silent-error@^1.0.0, silent-error@^1.0.1, silent-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/silent-error/-/silent-error-1.1.0.tgz#2209706f1c850a9f1d10d0d840918b46f26e1bc9" + integrity sha1-IglwbxyFCp8dENDYQJGLRvJuG8k= dependencies: debug "^2.2.0" simple-dom@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/simple-dom/-/simple-dom-1.3.0.tgz#8473e0d34e340544b061410dba3faf4f1b7aa282" + integrity sha512-RVjr6e80FFGDqDJZeQd4EMwoDLatn4Jy2SfuXecrP1IgG4ZAqkGSokE8LNV5i0kzWR2IM0e257xGN9JS8lxm0Q== simple-html-tokenizer@^0.4.1: version "0.4.3" resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.4.3.tgz#9b00b766e30058b4bb377c0d4f97566a13ab1be1" + integrity sha512-OpUzgR+P/Qsu6ztZehr4PxvTbV4sDW91hAqc2tnz4fjuFTqErWIUdUMbnzX+19F4IEpSSfa0vCAz5xJSs0LpPw== slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= slice-ansi@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== dependencies: is-fullwidth-code-point "^2.0.0" snake-case@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f" + integrity sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8= dependencies: no-case "^2.2.0" snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: define-property "^1.0.0" isobject "^3.0.0" @@ -9218,12 +10561,14 @@ snapdragon-node@^2.0.1: snapdragon-util@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== dependencies: kind-of "^3.2.0" snapdragon@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.1.tgz#e12b5487faded3e3dea0ac91e9400bf75b401370" + integrity sha1-4StUh/re0+PeoKyR6UAL91tAE3A= dependencies: base "^0.11.1" debug "^2.2.0" @@ -9237,24 +10582,28 @@ snapdragon@^0.8.1: sntp@0.2.x: version "0.2.4" resolved "https://registry.yarnpkg.com/sntp/-/sntp-0.2.4.tgz#fb885f18b0f3aad189f824862536bceeec750900" + integrity sha1-+4hfGLDzqtGJ+CSGJTa87ux1CQA= dependencies: hoek "0.9.x" sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + integrity sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg= dependencies: hoek "2.x.x" sntp@2.x.x: version "2.1.0" resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" + integrity sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg== dependencies: hoek "4.x.x" socket.io-adapter@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" + integrity sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s= dependencies: debug "2.3.3" socket.io-parser "2.3.1" @@ -9262,6 +10611,7 @@ socket.io-adapter@0.5.0: socket.io-client@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.6.0.tgz#5b668f4f771304dfeed179064708386fa6717853" + integrity sha1-W2aPT3cTBN/u0XkGRwg4b6ZxeFM= dependencies: backo2 "1.0.2" component-bind "1.0.0" @@ -9278,6 +10628,7 @@ socket.io-client@1.6.0: socket.io-parser@2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0" + integrity sha1-3VMgJRA85Clpcya+/WQAX8/ltKA= dependencies: component-emitter "1.1.2" debug "2.2.0" @@ -9287,6 +10638,7 @@ socket.io-parser@2.3.1: socket.io@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.6.0.tgz#3e40d932637e6bd923981b25caf7c53e83b6e2e1" + integrity sha1-PkDZMmN+a9kjmBslyvfFPoO24uE= dependencies: debug "2.3.3" engine.io "1.8.0" @@ -9299,16 +10651,19 @@ socket.io@1.6.0: sort-object-keys@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.2.tgz#d3a6c48dc2ac97e6bc94367696e03f6d09d37952" + integrity sha1-06bEjcKsl+a8lDZ2luA/bQnTeVI= sort-package-json@^1.4.0: version "1.7.1" resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.7.1.tgz#f2e5fbffe8420cc1bb04485f4509f05e73b4c0f2" + integrity sha1-8uX7/+hCDMG7BEhfRQnwXnO0wPI= dependencies: sort-object-keys "^1.1.1" source-map-resolve@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" + integrity sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A== dependencies: atob "^2.0.0" decode-uri-component "^0.2.0" @@ -9319,12 +10674,14 @@ source-map-resolve@^0.5.0: source-map-support@^0.4.15: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== dependencies: source-map "^0.5.6" source-map-support@^0.5.0: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" + integrity sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -9332,38 +10689,46 @@ source-map-support@^0.5.0: source-map-url@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" + integrity sha1-fsrxO1e80J2opAxdJp2zN5nUqvk= source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= source-map@0.4.x, source-map@^0.4.2, source-map@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha1-66T12pwNyZneaAMti092FzZSA2s= dependencies: amdefine ">=0.0.4" source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.1, source-map@~0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@~0.1.x: version "0.1.43" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y= dependencies: amdefine ">=0.0.4" sourcemap-codec@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.1.tgz#c8fd92d91889e902a07aee392bdd2c5863958ba2" + integrity sha512-hX1eNBNuilj8yfFnECh0DzLgwKpBLMIvmhgEhixXNui8lMLBInTI8Kyxt++RwJnMNu7cAUo635L2+N1TxMJCzA== sourcemap-validator@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/sourcemap-validator/-/sourcemap-validator-1.0.6.tgz#abd2f1ecdae6a3c46c2c96c5f256705b2147c9c0" + integrity sha1-q9Lx7Nrmo8RsLJbF8lZwWyFHycA= dependencies: jsesc "~0.3.x" lodash.foreach "~2.3.x" @@ -9373,10 +10738,12 @@ sourcemap-validator@^1.0.5: spawn-args@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/spawn-args/-/spawn-args-0.2.0.tgz#fb7d0bd1d70fd4316bd9e3dec389e65f9d6361bb" + integrity sha1-+30L0dcP1DFr2ePew4nmX51jYbs= spawn-sync@^1.0.11, spawn-sync@^1.0.15: version "1.0.15" resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" + integrity sha1-sAeZVX63+wyDdsKdROih6mfldHY= dependencies: concat-stream "^1.4.7" os-shim "^0.1.2" @@ -9384,42 +10751,51 @@ spawn-sync@^1.0.11, spawn-sync@^1.0.15: spawnback@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/spawnback/-/spawnback-1.0.0.tgz#f73662f7e54d95367eca74d6426c677dd7ea686f" + integrity sha1-9zZi9+VNlTZ+ynTWQmxnfdfqaG8= spdx-correct@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + integrity sha1-SzBz2TP/UfORLwOsVRlJikFQ20A= dependencies: spdx-license-ids "^1.0.2" spdx-expression-parse@~1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + integrity sha1-m98vIOH0DtRH++JzJmGR/O1RYmw= spdx-license-ids@^1.0.2: version "1.2.2" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + integrity sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc= split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== dependencies: extend-shallow "^3.0.0" sprintf-js@^1.0.3: version "1.1.1" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c" + integrity sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw= sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sri-toolbox@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/sri-toolbox/-/sri-toolbox-0.2.0.tgz#a7fea5c3fde55e675cf1c8c06f3ebb5c2935835e" + integrity sha1-p/6lw/3lXmdc8cjAbz67XCk1g14= sshpk@^1.7.0: version "1.13.1" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + integrity sha1-US322mKHFEMW3EwY/hzx2UBzm+M= dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -9434,6 +10810,7 @@ sshpk@^1.7.0: static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= dependencies: define-property "^0.2.5" object-copy "^0.1.0" @@ -9441,44 +10818,53 @@ static-extend@^0.1.1: "statuses@>= 1.3.1 < 2", statuses@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== statuses@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= stdout-stream@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" + integrity sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s= dependencies: readable-stream "^2.0.1" stealthy-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= stream-to-array@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/stream-to-array/-/stream-to-array-2.3.0.tgz#bbf6b39f5f43ec30bc71babcb37557acecf34353" + integrity sha1-u/azn19D7DC8cbq8s3VXrOzzQ1M= dependencies: any-promise "^1.1.0" stream-to-buffer@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz#26799d903ab2025c9bd550ac47171b00f8dd80a9" + integrity sha1-JnmdkDqyAlyb1VCsRxcbAPjdgKk= dependencies: stream-to "~0.2.0" stream-to@~0.2.0: version "0.2.2" resolved "https://registry.yarnpkg.com/stream-to/-/stream-to-0.2.2.tgz#84306098d85fdb990b9fa300b1b3ccf55e8ef01d" + integrity sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0= string-template@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" + integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0= string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" @@ -9487,6 +10873,7 @@ string-width@^1.0.1, string-width@^1.0.2: string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" @@ -9494,124 +10881,148 @@ string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: string.prototype.repeat@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-0.2.0.tgz#aba36de08dcee6a5a337d49b2ea1da1b28fc0ecf" + integrity sha1-q6Nt4I3O5qWjN9SbLqHaGyj8Ds8= string_decoder@0.10, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= string_decoder@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + integrity sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ== dependencies: safe-buffer "~5.1.0" string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" stringstream@~0.0.4, stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + integrity sha1-TkhM1N5aC7vuGORjB3EKioFiGHg= strip-ansi@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" + integrity sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA= dependencies: ansi-regex "^0.2.1" strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= dependencies: ansi-regex "^3.0.0" strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= dependencies: is-utf8 "^0.2.0" strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= dependencies: get-stdin "^4.0.1" strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= striptags@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/striptags/-/striptags-3.1.1.tgz#c8c3e7fdd6fb4bb3a32a3b752e5b5e3e38093ebd" + integrity sha1-yMPn/db7S7OjKjt1LltePjgJPr0= styled_string@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/styled_string/-/styled_string-0.0.1.tgz#d22782bd81295459bc4f1df18c4bad8e94dd124a" + integrity sha1-0ieCvYEpVFm8Tx3xjEutjpTdEko= sum-up@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/sum-up/-/sum-up-1.0.3.tgz#1c661f667057f63bcb7875aa1438bc162525156e" + integrity sha1-HGYfZnBX9jvLeHWqFDi8FiUlFW4= dependencies: chalk "^1.0.0" supports-color@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + integrity sha1-cqJiiU2dQIuVbKBf83su2KbiotU= dependencies: has-flag "^1.0.0" supports-color@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" + integrity sha1-2S3iaU6z9nMjlz1649i1W0wiGQo= supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= supports-color@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= dependencies: has-flag "^1.0.0" supports-color@^4.0.0: version "4.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" + integrity sha1-vnoN5ITexcXN34s9WRJQRJEvY1s= dependencies: has-flag "^2.0.0" supports-color@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.2.0.tgz#b0d5333b1184dd3666cbe5aa0b45c5ac7ac17a4a" + integrity sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q== dependencies: has-flag "^3.0.0" supports-color@^5.3.0, supports-color@^5.4.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" svg2png@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/svg2png/-/svg2png-3.0.1.tgz#a2644d68b0231ac00af431aa163714ff17106447" + integrity sha1-omRNaLAjGsAK9DGqFjcU/xcQZEc= dependencies: phantomjs-prebuilt "^2.1.10" pn "^1.0.0" @@ -9620,6 +11031,7 @@ svg2png@~3.0.1: svgo@0.6.6: version "0.6.6" resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.6.6.tgz#b340889036f20f9b447543077d0f5573ed044c08" + integrity sha1-s0CIkDbyD5tEdUMHfQ9Vc+0ETAg= dependencies: coa "~1.0.1" colors "~1.1.2" @@ -9632,18 +11044,22 @@ svgo@0.6.6: "symbol-tree@>= 3.1.0 < 4.0.0", symbol-tree@^3.2.1, symbol-tree@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.3, symlink-or-copy@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.1.8.tgz#cabe61e0010c1c023c173b25ee5108b37f4b4aa3" + integrity sha1-yr5h4AEMHAI8Fzsl7lEIs39LSqM= symlink-or-copy@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.2.0.tgz#5d49108e2ab824a34069b68974486c290020b393" + integrity sha512-W31+GLiBmU/ZR02Ii0mVZICuNEN9daZ63xZMPDsYgPgNjMtg+atqLEGI7PPI936jYSQZxoLb/63xos8Adrx4Eg== table@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" + integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA== dependencies: ajv "^5.2.3" ajv-keywords "^2.1.0" @@ -9655,10 +11071,12 @@ table@^4.0.1: taffydb@2.7.2: version "2.7.2" resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.7.2.tgz#7bf8106a5c1a48251b3e3bc0a0e1732489fd0dc8" + integrity sha1-e/gQalwaSCUbPjvAoOFzJIn9Dcg= tailwindcss@^0.6.1: version "0.6.6" resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-0.6.6.tgz#a8c8a8bf7d230c8bc10031672923d84af29cd34d" + integrity sha512-g6xb7kcPIom85K7ak16AUBrwN3tPdhrQoKJ7Jl7OJ3zBOQNHthquZ1/q+0V6fj9jsC66jrDCQxn72DIjK4aYgg== dependencies: commander "^2.11.0" css.escape "^1.5.1" @@ -9674,6 +11092,7 @@ tailwindcss@^0.6.1: tap-parser@^5.1.0: version "5.4.0" resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-5.4.0.tgz#6907e89725d7b7fa6ae41ee2c464c3db43188aec" + integrity sha512-BIsIaGqv7uTQgTW1KLTMNPSEQf4zDDPgYOBRdgOfuB+JFOLRBfEu6cLa/KvMvmqggu1FKXDfitjLwsq4827RvA== dependencies: events-to-array "^1.0.1" js-yaml "^3.2.7" @@ -9683,6 +11102,7 @@ tap-parser@^5.1.0: tar-pack@^3.4.0: version "3.4.1" resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" + integrity sha512-PPRybI9+jM5tjtCbN2cxmmRU7YmqT3Zv/UDy48tAh2XRkLa9bAORtSWLkVc13+GJF+cdTh1yEnHEk3cpTaL5Kg== dependencies: debug "^2.2.0" fstream "^1.0.10" @@ -9696,6 +11116,7 @@ tar-pack@^3.4.0: tar@^2.0.0, tar@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + integrity sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE= dependencies: block-stream "*" fstream "^1.0.2" @@ -9704,6 +11125,7 @@ tar@^2.0.0, tar@^2.2.1: tar@^4: version "4.4.6" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" + integrity sha512-tMkTnh9EdzxyfW+6GK6fCahagXsnYk6kE6S9Gr9pjVdys769+laCTbodXDhPAjzVtEBazRgP0gYqOjnk9dQzLg== dependencies: chownr "^1.0.1" fs-minipass "^1.2.5" @@ -9716,6 +11138,7 @@ tar@^4: temp@0.8.3, temp@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" + integrity sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k= dependencies: os-tmpdir "^1.0.0" rimraf "~2.2.6" @@ -9723,6 +11146,7 @@ temp@0.8.3, temp@^0.8.3: testem@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/testem/-/testem-2.0.0.tgz#b05c96200c7ac98bae998d71c94c0c5345907d13" + integrity sha1-sFyWIAx6yYuumY1xyUwMU0WQfRM= dependencies: backbone "^1.1.2" bluebird "^3.4.6" @@ -9755,34 +11179,41 @@ testem@^2.0.0: tether@^1.4.0: version "1.4.4" resolved "https://registry.yarnpkg.com/tether/-/tether-1.4.4.tgz#9dc6eb2b3e601da2098fd264e7f7a8b264de1125" + integrity sha512-bagKeRRo3vEynHnO3GB7/jB3Q4YIf0mN7gXM/nR0wZvNHkPrwmZemg1w0C32JZP0prHZUwxGwoX5CdA7tuIDEw== text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= "textextensions@1 || 2": version "2.2.0" resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.2.0.tgz#38ac676151285b658654581987a0ce1a4490d286" + integrity sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA== thenify-all@^1.0.0, thenify-all@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= dependencies: thenify ">= 3.1.0 < 4" "thenify@>= 3.1.0 < 4": version "3.3.0" resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" + integrity sha1-5p44obq+lpsBCCB5eLn2K4hgSDk= dependencies: any-promise "^1.0.0" throttleit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" + integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw= through2-filter@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" + integrity sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw= dependencies: through2 "~2.0.0" xtend "~4.0.0" @@ -9790,6 +11221,7 @@ through2-filter@^2.0.0: through2@^2.0.0, through2@^2.0.3, through2@~2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + integrity sha1-AARWmzfHx0ujnEPzzteNGtlBQL4= dependencies: readable-stream "^2.1.5" xtend "~4.0.1" @@ -9797,18 +11229,22 @@ through2@^2.0.0, through2@^2.0.3, through2@~2.0.0: through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= time-zone@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d" + integrity sha1-mcW/VZWJZq9tBtg73zgA3IL67F0= tiny-emitter@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.0.2.tgz#82d27468aca5ade8e5fd1e6d22b57dd43ebdfb7c" + integrity sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow== tiny-lr@^1.0.3: version "1.1.0" resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.1.0.tgz#a373bce2a4b58cef9a64433360ba593155f4cd45" + integrity sha512-f4X68a6KHcCx/XJcZUKAa92APjY9EHxuGOzRFmPRjf+fOp1E7fi4dGJaHMxvRBxwZrHrIvn/AwkFaDS7O1WZDQ== dependencies: body "^5.1.0" debug "~2.6.7" @@ -9820,50 +11256,60 @@ tiny-lr@^1.0.3: tinycolor2@^1.1.2: version "1.4.1" resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8" + integrity sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g= tmp@0.0.28: version "0.0.28" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" + integrity sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA= dependencies: os-tmpdir "~1.0.1" tmp@0.0.31: version "0.0.31" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" + integrity sha1-jzirlDjhcxXl29izZX6L+yd65Kc= dependencies: os-tmpdir "~1.0.1" tmp@^0.0.29: version "0.0.29" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" + integrity sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA= dependencies: os-tmpdir "~1.0.1" tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= to-array@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= to-ico@^1.1.2: version "1.1.5" resolved "https://registry.yarnpkg.com/to-ico/-/to-ico-1.1.5.tgz#1d32da5f2c90922edee6b686d610c54527b5a8d5" + integrity sha512-5kIh7m7bkIlqIESEZkL8gAMMzucXKfPe3hX2FoDY5HEAfD9OJU+Qh9b6Enp74w0qRcxVT5ejss66PHKqc3AVkg== dependencies: arrify "^1.0.1" buffer-alloc "^1.1.0" @@ -9874,12 +11320,14 @@ to-ico@^1.1.2: to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= dependencies: is-number "^3.0.0" repeat-string "^1.6.1" @@ -9887,6 +11335,7 @@ to-regex-range@^2.1.0: to-regex@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.1.tgz#15358bee4a2c83bd76377ba1dc049d0f18837aae" + integrity sha1-FTWL7kosg712N3uh3ASdDxiDeq4= dependencies: define-property "^0.2.5" extend-shallow "^2.0.1" @@ -9895,6 +11344,7 @@ to-regex@^3.0.1: to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== dependencies: define-property "^2.0.2" extend-shallow "^3.0.2" @@ -9904,12 +11354,14 @@ to-regex@^3.0.2: topo@2.x.x: version "2.0.2" resolved "https://registry.yarnpkg.com/topo/-/topo-2.0.2.tgz#cd5615752539057c0dc0491a621c3bc6fbe1d182" + integrity sha1-zVYVdSU5BXwNwEkaYhw7xvvh0YI= dependencies: hoek "4.x.x" tough-cookie@>=0.12.0, tough-cookie@>=2.3.3, tough-cookie@^2.2.0, tough-cookie@^2.3.4, tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== dependencies: psl "^1.1.24" punycode "^1.4.1" @@ -9917,22 +11369,26 @@ tough-cookie@>=0.12.0, tough-cookie@>=2.3.3, tough-cookie@^2.2.0, tough-cookie@^ tough-cookie@^2.3.2, tough-cookie@~2.3.0, tough-cookie@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" + integrity sha1-C2GKVWW23qkL80JdBNVe3EdadWE= dependencies: punycode "^1.4.1" tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= dependencies: punycode "^2.1.0" tr46@~0.0.1, tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= tree-sync@^1.2.1, tree-sync@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-sync/-/tree-sync-1.2.2.tgz#2cf76b8589f59ffedb58db5a3ac7cb013d0158b7" + integrity sha1-LPdrhYn1n/7bWNtaOsfLAT0BWLc= dependencies: debug "^2.2.0" fs-tree-diff "^0.5.6" @@ -9943,48 +11399,58 @@ tree-sync@^1.2.1, tree-sync@^1.2.2: trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= trim@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= "true-case-path@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz#7ec91130924766c7f573be3020c34f8fdfd00d62" + integrity sha1-fskRMJJHZsf1c74wIMNPj9/QDWI= dependencies: glob "^6.0.4" tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= dependencies: safe-buffer "^5.0.1" tunnel-agent@~0.4.0: version "0.4.3" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + integrity sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us= tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= dependencies: prelude-ls "~1.1.2" type-detect@^4.0.0: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== type-is@~1.6.15: version "1.6.15" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" + integrity sha1-yrEPtJCeRByChC6v4a1kbIGARBA= dependencies: media-typer "0.3.0" mime-types "~2.1.15" @@ -9992,6 +11458,7 @@ type-is@~1.6.15: type-is@~1.6.16: version "1.6.16" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== dependencies: media-typer "0.3.0" mime-types "~2.1.18" @@ -9999,14 +11466,17 @@ type-is@~1.6.16: typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= uc.micro@^1.0.0, uc.micro@^1.0.1, uc.micro@^1.0.3: version "1.0.5" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376" + integrity sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg== uglify-es@^3.1.3: version "3.3.9" resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" + integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== dependencies: commander "~2.13.0" source-map "~0.6.1" @@ -10014,6 +11484,7 @@ uglify-es@^3.1.3: uglify-js@^2.6: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= dependencies: source-map "~0.5.1" yargs "~3.10.0" @@ -10023,18 +11494,22 @@ uglify-js@^2.6: 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" + integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= uid-number@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= ultron@1.0.x: version "1.0.2" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" + integrity sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po= underscore.string@^3.2.2, underscore.string@~3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db" + integrity sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s= dependencies: sprintf-js "^1.0.3" util-deprecate "^1.0.2" @@ -10042,14 +11517,17 @@ underscore.string@^3.2.2, underscore.string@~3.3.4: underscore@>=1.8.3: version "1.8.3" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" + integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI= underscore@^1.8.3: version "1.9.1" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" + integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= dependencies: arr-union "^3.1.0" get-value "^2.0.6" @@ -10059,10 +11537,12 @@ union-value@^1.0.0: uniq@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= unique-stream@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" + integrity sha1-WqADz76Uxf+GbE59ZouxxNuts2k= dependencies: json-stable-stringify "^1.0.0" through2-filter "^2.0.0" @@ -10070,20 +11550,24 @@ unique-stream@^2.2.1: unique-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= dependencies: crypto-random-string "^1.0.0" universalify@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + integrity sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc= unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= dependencies: has-value "^0.3.1" isobject "^3.0.0" @@ -10091,26 +11575,31 @@ unset-value@^1.0.0: untildify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/untildify/-/untildify-2.1.0.tgz#17eb2807987f76952e9c0485fc311d06a826a2e0" + integrity sha1-F+soB5h/dpUunASF/DEdBqgmouA= dependencies: os-homedir "^1.0.0" upath@^1.0.5: version "1.1.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" + integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw== urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= url-regex@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-3.2.0.tgz#dbad1e0c9e29e105dd0b1f09f6862f7fdb482724" + integrity sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ= dependencies: ip-regex "^1.0.1" use@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8" + integrity sha1-riig1y+TvyJCKhii43mZMRLeyOg= dependencies: define-property "^0.2.5" isobject "^3.0.0" @@ -10119,6 +11608,7 @@ use@^2.0.0: user-info@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/user-info/-/user-info-1.0.0.tgz#81c82b7ed63e674c2475667653413b3c76fde239" + integrity sha1-gcgrftY+Z0wkdWZ2U0E7PHb94jk= dependencies: os-homedir "^1.0.1" passwd-user "^1.2.1" @@ -10127,32 +11617,39 @@ user-info@^1.0.0: username-sync@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/username-sync/-/username-sync-1.0.1.tgz#1cde87eefcf94b8822984d938ba2b797426dae1f" + integrity sha1-HN6H7vz5S4gimE2Ti6K3l0Jtrh8= username@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/username/-/username-1.0.1.tgz#e1f72295e3e58e06f002c6327ce06897a99cd67f" + integrity sha1-4fcilePljgbwAsYyfOBol6mc1n8= dependencies: meow "^3.4.0" util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= uuid@^3.0.0, uuid@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" + integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA== uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== validate-npm-package-license@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + integrity sha1-KAS6vnEq0zeUWaz74kdGqywwP7w= dependencies: spdx-correct "~1.0.0" spdx-expression-parse "~1.0.0" @@ -10160,24 +11657,29 @@ validate-npm-package-license@^3.0.1: validate-npm-package-name@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= dependencies: builtins "^1.0.3" vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= velocity-animate@^1.5.1: version "1.5.2" resolved "https://registry.yarnpkg.com/velocity-animate/-/velocity-animate-1.5.2.tgz#5a351d75fca2a92756f5c3867548b873f6c32105" + integrity sha512-m6EXlCAMetKztO1ppBhGU1/1MR3IiEevO6ESq6rcrSQ3Q77xYSW13jkfXW88o4xMrkXJhy/U7j4wFR/twMB0Eg== vendors@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" + integrity sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ== verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" @@ -10186,6 +11688,7 @@ verror@1.10.0: vinyl@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" + integrity sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ= dependencies: clone "^1.0.0" clone-stats "^0.0.1" @@ -10194,16 +11697,19 @@ vinyl@^1.1.0: vlq@^0.2.2: version "0.2.3" resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" + integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== w3c-hr-time@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= dependencies: browser-process-hrtime "^0.1.2" walk-sync@0.3.2, walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.2.tgz#4827280afc42d0e035367c4a4e31eeac0d136f75" + integrity sha512-FMB5VqpLqOCcqrzA9okZFc0wq0Qbmdm396qJxvQZhDpyu0W95G9JCmp74tx7iyYnyOcBtUuKJsgIKAqjozvmmQ== dependencies: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" @@ -10211,10 +11717,12 @@ walk-sync@0.3.2, walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2: walk-sync@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.1.3.tgz#8a07261a00bda6cfb1be25e9f100fad57546f583" + integrity sha1-igcmGgC9ps+xviXp8QD61XVG9YM= walk-sync@^0.2.5, walk-sync@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.2.7.tgz#b49be4ee6867657aeb736978b56a29d10fa39969" + integrity sha1-tJvk7mhnZXrrc2l4tWop0Q+jmWk= dependencies: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" @@ -10222,16 +11730,19 @@ walk-sync@^0.2.5, walk-sync@^0.2.7: walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= dependencies: makeerror "1.0.x" watch@~0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" + integrity sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw= watch@~0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" + integrity sha1-KAlUdsbffJDJYxOJkMClQj60uYY= dependencies: exec-sh "^0.2.0" minimist "^1.2.0" @@ -10239,18 +11750,22 @@ watch@~0.18.0: webidl-conversions@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-2.0.1.tgz#3bf8258f7d318c7443c36f2e169402a1a6703506" + integrity sha1-O/glj30xjHRDw28uFpQCoaZwNQY= webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= webidl-conversions@^4.0.0, webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== websocket-driver@>=0.5.1: version "0.7.0" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" + integrity sha1-DK+dLXVdk67gSdS90NP+LMoqJOs= dependencies: http-parser-js ">=0.4.0" websocket-extensions ">=0.1.1" @@ -10258,26 +11773,31 @@ websocket-driver@>=0.5.1: websocket-extensions@>=0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" + integrity sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw== dependencies: iconv-lite "0.4.19" whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" + integrity sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew== whatwg-url-compat@~0.6.5: version "0.6.5" resolved "https://registry.yarnpkg.com/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz#00898111af689bb097541cd5a45ca6c8798445bf" + integrity sha1-AImBEa9om7CXVBzVpFymyHmERb8= dependencies: tr46 "~0.0.1" whatwg-url@^4.3.0: version "4.8.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" + integrity sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA= dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" @@ -10285,6 +11805,7 @@ whatwg-url@^4.3.0: whatwg-url@^6.4.0, whatwg-url@^6.4.1: version "6.5.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== dependencies: lodash.sortby "^4.7.0" tr46 "^1.0.1" @@ -10293,58 +11814,70 @@ whatwg-url@^6.4.0, whatwg-url@^6.4.1: whet.extend@~0.9.9: version "0.9.9" resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" + integrity sha1-+HfVv2SMl+WqVC+twW1qJZucEaE= which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= which@1, which@^1.2.10: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + integrity sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg== dependencies: isexe "^2.0.0" wide-align@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + integrity sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w== dependencies: string-width "^1.0.2" window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= window-size@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" + integrity sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY= wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= workerpool@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-2.3.0.tgz#86c5cbe946b55e7dc9d12b1936c8801a6e2d744d" + integrity sha512-JP5DpviEV84zDmz13QnD4FfRjZBjnTOYY2O4pGgxtlqLh47WOzQFHm8o17TE5OSfcDoKC6vHSrN4yPju93DW0Q== dependencies: object-assign "4.1.1" wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -10352,10 +11885,12 @@ wrap-ansi@^2.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= write-file-atomic@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA== dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" @@ -10364,16 +11899,19 @@ write-file-atomic@^2.0.0: write-file-stdout@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/write-file-stdout/-/write-file-stdout-0.0.2.tgz#c252d7c7c5b1b402897630e3453c7bfe690d9ca1" + integrity sha1-wlLXx8WxtAKJdjDjRTx7/mkNnKE= write@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= dependencies: mkdirp "^0.5.1" ws@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018" + integrity sha1-CC3bbGQehdS7RR8D1S8G6r2x8Bg= dependencies: options ">=0.0.5" ultron "1.0.x" @@ -10381,20 +11919,24 @@ ws@1.1.1: ws@^5.2.0: version "5.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== dependencies: async-limiter "~1.0.0" wtf-8@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" + integrity sha1-OS2LotDxw00e4tYw8V0O+2jhBIo= xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= xhr@^2.0.1: version "2.5.0" resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.5.0.tgz#bed8d1676d5ca36108667692b74b316c496e49dd" + integrity sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ== dependencies: global "~4.3.0" is-function "^1.0.1" @@ -10404,18 +11946,22 @@ xhr@^2.0.1: "xml-name-validator@>= 2.0.1 < 3.0.0", xml-name-validator@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + integrity sha1-TYuPHszTQZqjYgYb7O9RXh5VljU= xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== xml-parse-from-string@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28" + integrity sha1-qQKekp09vN7RafPG4oI42VpdWig= xml2js@>=0.2.4, xml2js@^0.4.5: version "0.4.19" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" + integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== dependencies: sax ">=0.6.0" xmlbuilder "~9.0.1" @@ -10423,34 +11969,42 @@ xml2js@>=0.2.4, xml2js@^0.4.5: xmlbuilder@~9.0.1: version "9.0.7" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= xmldom@^0.1.19: version "0.1.27" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" + integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= xmlhttprequest-ssl@1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" + integrity sha1-GFqIjATspGw+QHDZn3tJ3jUomS0= xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= y18n@^3.2.0, y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= yallist@^3.0.0, yallist@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" + integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k= yam@0.0.22: version "0.0.22" resolved "https://registry.yarnpkg.com/yam/-/yam-0.0.22.tgz#38a76cb79a19284d9206ed49031e359a1340bd06" + integrity sha1-OKdst5oZKE2SBu1JAx41mhNAvQY= dependencies: fs-extra "^0.30.0" lodash.merge "^4.4.0" @@ -10458,12 +12012,14 @@ yam@0.0.22: yargs-parser@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= dependencies: camelcase "^3.0.0" yargs@^3.31.0: version "3.32.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" + integrity sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU= dependencies: camelcase "^2.0.1" cliui "^3.0.3" @@ -10476,6 +12032,7 @@ yargs@^3.31.0: yargs@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= dependencies: camelcase "^3.0.0" cliui "^3.2.0" @@ -10494,6 +12051,7 @@ yargs@^7.0.0: yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= dependencies: camelcase "^1.0.2" cliui "^2.1.0" @@ -10503,26 +12061,31 @@ yargs@~3.10.0: yauzl@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" + integrity sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU= dependencies: fd-slicer "~1.0.1" yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= yetch@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/yetch/-/yetch-0.0.1.tgz#76f1729b2c2c667e23c3c2da90472a4897eca004" + integrity sha512-Zl5SG98t7zLphqFAFsgXeyQF6i7MvsErop0Kb6CSyjQLR5qNXcvvwwBDKuF4X2m9/HWXgmHX/HPaZuMU1isXaQ== yui@^3.18.1: version "3.18.1" resolved "https://registry.yarnpkg.com/yui/-/yui-3.18.1.tgz#e000269ec0a7b6fbc741cbb8fcbd0e65117b014c" + integrity sha1-4AAmnsCntvvHQcu4/L0OZRF7AUw= dependencies: request "~2.40.0" yuidocjs@^0.10.2: version "0.10.2" resolved "https://registry.yarnpkg.com/yuidocjs/-/yuidocjs-0.10.2.tgz#33924967ce619024cd70ef694e267d2f988f73f6" + integrity sha1-M5JJZ85hkCTNcO9pTiZ9L5iPc/Y= dependencies: express "^4.13.1" graceful-fs "^4.1.2" From 0f6c9b7ed37e3922db44197319fc258c7750ef80 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 14 Nov 2018 17:01:04 -0500 Subject: [PATCH 242/879] Last acceptance test to basic-app --- .../tests}/acceptance/start-mirage-test.js | 28 ++++----- tests/acceptance/legacy-start-mirage-test.js | 59 ------------------- tests/acceptance/pets-test.js | 33 ----------- tests/acceptance/serializers-test.js | 23 -------- 4 files changed, 14 insertions(+), 129 deletions(-) rename {tests => test-apps/basic-app/tests}/acceptance/start-mirage-test.js (75%) delete mode 100644 tests/acceptance/legacy-start-mirage-test.js delete mode 100644 tests/acceptance/pets-test.js delete mode 100644 tests/acceptance/serializers-test.js diff --git a/tests/acceptance/start-mirage-test.js b/test-apps/basic-app/tests/acceptance/start-mirage-test.js similarity index 75% rename from tests/acceptance/start-mirage-test.js rename to test-apps/basic-app/tests/acceptance/start-mirage-test.js index e018625f2..548592381 100644 --- a/tests/acceptance/start-mirage-test.js +++ b/test-apps/basic-app/tests/acceptance/start-mirage-test.js @@ -4,7 +4,7 @@ import {setupTest} from 'ember-qunit'; import {visit, currentRouteName} from '@ember/test-helpers'; import startMirage from 'ember-cli-mirage/start-mirage'; import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; -import ENV from 'dummy/config/environment'; +import ENV from 'basic-app/config/environment'; let module; if (Ember.VERSION === '1.13.13') { @@ -13,7 +13,7 @@ if (Ember.VERSION === '1.13.13') { module = qunitModule; } -module('Acceptance: Starting mirage', function(hooks) { +module('Acceptance | Starting mirage', function(hooks) { let oldEnv, addonConfig, dynamicAfterEach; hooks.beforeEach(function() { @@ -45,11 +45,11 @@ module('Acceptance: Starting mirage', function(hooks) { assert.ok(window.server, 'There is a global server after starting'); dynamicAfterEach = () => server.shutdown(); - let contact = server.create('contact'); - await visit('/1'); + server.create('user'); + await visit('/crud-demo'); - assert.equal(currentRouteName(), 'contact'); - assert.dom('p').hasText(`The contact is ${contact.name}`, 'The manually started server works'); + assert.equal(currentRouteName(), 'crud-demo'); + assert.dom('[data-test-id="user"]').exists(); }); module('setupMirage()', function(hooks) { @@ -63,11 +63,11 @@ module('Acceptance: Starting mirage', function(hooks) { assert.notOk(window.server, 'The global server is gone'); }; - let contact = this.server.create('contact'); - await visit('/1'); + server.create('user'); + await visit('/crud-demo'); - assert.equal(currentRouteName(), 'contact'); - assert.dom('p').hasText(`The contact is ${contact.name}`, 'The manually started server works'); + assert.equal(currentRouteName(), 'crud-demo'); + assert.dom('[data-test-id="user"]').exists(); }); }); }); @@ -87,11 +87,11 @@ module('Acceptance: Starting mirage', function(hooks) { assert.notOk(window.server, 'The global server is gone'); }; - let contact = this.server.create('contact'); - await visit('/1'); + server.create('user'); + await visit('/crud-demo'); - assert.equal(currentRouteName(), 'contact'); - assert.dom('p').hasText(`The contact is ${contact.name}`, 'The manually started server works'); + assert.equal(currentRouteName(), 'crud-demo'); + assert.dom('[data-test-id="user"]').exists(); }); }); }); diff --git a/tests/acceptance/legacy-start-mirage-test.js b/tests/acceptance/legacy-start-mirage-test.js deleted file mode 100644 index eb9b7f064..000000000 --- a/tests/acceptance/legacy-start-mirage-test.js +++ /dev/null @@ -1,59 +0,0 @@ -import {module, test} from 'qunit'; -import startApp from '../helpers/start-app'; -import destroyApp from '../helpers/destroy-app'; -import { startMirage } from 'dummy/initializers/ember-cli-mirage'; -import ENV from 'dummy/config/environment'; - -module('Acceptance: Starting mirage (legacy)', function(hooks) { - let app, oldEnv, addonConfig; - - hooks.beforeEach(function() { - oldEnv = ENV['ember-cli-mirage']; - ENV['ember-cli-mirage'] = addonConfig = {}; - }); - - hooks.afterEach(function() { - destroyApp(app); - ENV['ember-cli-mirage'] = oldEnv; - }); - - test('The server starts automatically when configured with enabled undefined', async function(assert) { - app = startApp(); - - assert.ok(window.server, 'There is a server after starting'); - - let contact = window.server.create('contact'); - await window.visit('/1'); - - assert.equal(window.currentRouteName(), 'contact'); - assert.dom('p').hasText(`The contact is ${contact.name}`, 'The automatically started server works'); - }); - - test('The server starts automatically when configured with { enabled: true }', async function(assert) { - addonConfig.enabled = true; - app = startApp(); - - assert.ok(window.server, 'There is a server after starting'); - - let contact = window.server.create('contact'); - await window.visit('/1'); - - assert.equal(window.currentRouteName(), 'contact'); - assert.dom('p').hasText(`The contact is ${contact.name}`, 'The automatically started server works'); - }); - - test('The server can be started manually when configured with { enabled: false }', async function(assert) { - addonConfig.enabled = false; - app = startApp(); - - assert.equal(window.server, undefined, 'There is no server at first'); - startMirage(); - assert.ok(window.server, 'There is a server after starting'); - - let contact = window.server.create('contact'); - await window.visit('/1'); - - assert.equal(window.currentRouteName(), 'contact'); - assert.dom('p').hasText(`The contact is ${contact.name}`, 'The manually started server works'); - }); -}); diff --git a/tests/acceptance/pets-test.js b/tests/acceptance/pets-test.js deleted file mode 100644 index 930549a93..000000000 --- a/tests/acceptance/pets-test.js +++ /dev/null @@ -1,33 +0,0 @@ -import {test} from 'qunit'; -import moduleForAcceptance from '../helpers/module-for-acceptance'; - -let pets; - -moduleForAcceptance('Acceptance | Pets', { - beforeEach() { - pets = server.createList('pet', 3); - } -}); - -test('I can view the pets', function(assert) { - visit('/pets'); - - andThen(function() { - assert.equal(currentRouteName(), 'pets'); - assert.equal(find('li').length, 3); - assert.equal(find('li:first .name').text().trim(), pets[0].name); - }); -}); - -test('I can create a new pet', function(assert) { - visit('/pets'); - - fillIn('input', 'Brownie'); - click('button:contains(create)'); - - andThen(function() { - assert.equal(currentRouteName(), 'pets'); - assert.equal(find('li').length, 4); - assert.equal(find('li:last .name').text(), 'Brownie'); - }); -}); diff --git a/tests/acceptance/serializers-test.js b/tests/acceptance/serializers-test.js deleted file mode 100644 index ecc93082d..000000000 --- a/tests/acceptance/serializers-test.js +++ /dev/null @@ -1,23 +0,0 @@ -import moduleForAcceptance from '../helpers/module-for-acceptance'; -import { test } from 'qunit'; - -moduleForAcceptance('Acceptance | Serializers', { - beforeEach() { - this.store = this.application.__container__.lookup('service:store'); - } -}); - -test('Serializers can provide default includes', function(assert) { - let wordSmith = server.create('word-smith'); - server.createList('blog-post', 3, { wordSmithId: wordSmith.id }); - - visit(`/word-smiths/${wordSmith.id}`); - - andThen(() => { - let wordSmithsInStore = this.store.peekAll('word-smith'); - let blogPostsInStore = this.store.peekAll('blog-post'); - - assert.equal(wordSmithsInStore.get('length'), 1); - assert.equal(blogPostsInStore.get('length'), 3); - }); -}); From 6a1702341fa1ee2eef733b1c095706b1e27ef9fb Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 14 Nov 2018 17:33:24 -0500 Subject: [PATCH 243/879] Tests passing --- tests/dummy/mirage/config.js | 42 ------------------------------------ 1 file changed, 42 deletions(-) diff --git a/tests/dummy/mirage/config.js b/tests/dummy/mirage/config.js index 81b0f015f..551590834 100644 --- a/tests/dummy/mirage/config.js +++ b/tests/dummy/mirage/config.js @@ -1,47 +1,5 @@ -import { isBlank } from '@ember/utils'; - -import Mirage from 'ember-cli-mirage'; - export default function() { this.passthrough(); - // this.namespace = '/api'; - // - // // Contacts - // this.get('/contacts'); - // // this.get('/contacts', ['contacts', 'addresses']); - // this.get('/contacts/:id'); - // this.post('/contacts'); - // this.put('/contacts/:id'); - // this.del('/contacts/:id'); - // - // // Friends - // this.get('/friends', { coalesce: true }); - // - // // Pets - // this.get('/pets', function({ db }) { - // return { pets: db.pets.filter((pet) => pet.alive) }; - // }); - // - // this.post('/pets', function({ db }, req) { - // let { pet } = JSON.parse(req.requestBody); - // if (isBlank(pet.name)) { - // let body = { errors: { name: ["can't be blank"] } }; - // return new Mirage.Response(422, { some: 'header' }, body); - // } else { - // return { pet: db.pets.insert(pet) }; - // } - // }); - // - // this.put('/pets/:id', function({ db }, req) { - // let { pet } = JSON.parse(req.requestBody); - // db.pets.update(pet.id, pet); - // return pet; - // }); - // - // this.delete('/pets/:id', function() { }, 200); - // - // this.get('/word-smiths/:id'); - } export function testConfig() { From a711b9d97b8b1af416de92e33e4cd305bfe1878a Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 15 Nov 2018 09:37:49 -0500 Subject: [PATCH 244/879] Move Ember Data test to basic-app --- test-apps/basic-app/app/models/book.js | 3 + test-apps/basic-app/app/models/tag.js | 5 ++ .../basic-app/app/models/things/watch.js | 5 ++ test-apps/basic-app/app/models/user.js | 5 +- .../tests/acceptance/ember-data-test.js | 72 +++++++++++++++++++ tests/dummy/app/adapters/word-smith.js | 5 -- tests/dummy/app/helpers/.gitkeep | 0 tests/dummy/app/models/address.js | 10 --- tests/dummy/app/models/blog-post.js | 11 --- tests/dummy/app/models/contact.js | 11 --- tests/dummy/app/models/friend.js | 8 --- tests/dummy/app/models/pet.js | 8 --- tests/dummy/app/models/pet/dog.js | 3 - tests/dummy/app/models/state.js | 7 -- tests/dummy/app/models/word-smith.js | 11 --- tests/dummy/app/routes/application.js | 28 -------- tests/dummy/app/routes/close-friends.js | 14 ---- tests/dummy/app/routes/contacts.js | 22 ------ tests/dummy/app/routes/friends.js | 9 --- tests/dummy/app/routes/pets.js | 28 -------- tests/dummy/app/serializers/blog-post.js | 5 -- tests/dummy/app/serializers/word-smith.js | 5 -- tests/dummy/mirage/config.js | 4 -- tests/dummy/mirage/factories/address.js | 4 -- tests/dummy/mirage/factories/blog-post.js | 9 --- tests/dummy/mirage/factories/contact.js | 17 ----- tests/dummy/mirage/factories/friend.js | 7 -- tests/dummy/mirage/factories/pet.js | 11 --- tests/dummy/mirage/factories/word-smith.js | 9 --- tests/dummy/mirage/fixtures/addresses.js | 12 ---- tests/dummy/mirage/fixtures/blog-posts.js | 17 ----- tests/dummy/mirage/fixtures/contacts.js | 15 ---- tests/dummy/mirage/fixtures/friends.js | 14 ---- tests/dummy/mirage/fixtures/word-smiths.js | 7 -- .../dummy/mirage/identity-managers/author.js | 57 --------------- tests/dummy/mirage/models/author.js | 5 -- tests/dummy/mirage/models/blog-post.js | 7 -- tests/dummy/mirage/models/contact.js | 4 -- tests/dummy/mirage/models/friend.js | 4 -- tests/dummy/mirage/models/word-smith.js | 7 -- tests/dummy/mirage/scenarios/default.js | 15 ---- tests/dummy/mirage/serializers/application.js | 4 +- tests/dummy/mirage/serializers/blog-post.js | 5 -- tests/dummy/mirage/serializers/word-smith.js | 6 -- tests/integration/ember-data-test.js | 72 ------------------- 45 files changed, 91 insertions(+), 496 deletions(-) create mode 100644 test-apps/basic-app/app/models/tag.js create mode 100644 test-apps/basic-app/app/models/things/watch.js create mode 100644 test-apps/basic-app/tests/acceptance/ember-data-test.js delete mode 100644 tests/dummy/app/adapters/word-smith.js delete mode 100644 tests/dummy/app/helpers/.gitkeep delete mode 100644 tests/dummy/app/models/address.js delete mode 100644 tests/dummy/app/models/blog-post.js delete mode 100644 tests/dummy/app/models/contact.js delete mode 100644 tests/dummy/app/models/friend.js delete mode 100644 tests/dummy/app/models/pet.js delete mode 100644 tests/dummy/app/models/pet/dog.js delete mode 100644 tests/dummy/app/models/state.js delete mode 100644 tests/dummy/app/models/word-smith.js delete mode 100644 tests/dummy/app/routes/application.js delete mode 100644 tests/dummy/app/routes/close-friends.js delete mode 100644 tests/dummy/app/routes/contacts.js delete mode 100644 tests/dummy/app/routes/friends.js delete mode 100644 tests/dummy/app/routes/pets.js delete mode 100644 tests/dummy/app/serializers/blog-post.js delete mode 100644 tests/dummy/app/serializers/word-smith.js delete mode 100644 tests/dummy/mirage/factories/address.js delete mode 100644 tests/dummy/mirage/factories/blog-post.js delete mode 100644 tests/dummy/mirage/factories/contact.js delete mode 100644 tests/dummy/mirage/factories/friend.js delete mode 100644 tests/dummy/mirage/factories/pet.js delete mode 100644 tests/dummy/mirage/factories/word-smith.js delete mode 100644 tests/dummy/mirage/fixtures/addresses.js delete mode 100644 tests/dummy/mirage/fixtures/blog-posts.js delete mode 100644 tests/dummy/mirage/fixtures/contacts.js delete mode 100644 tests/dummy/mirage/fixtures/friends.js delete mode 100644 tests/dummy/mirage/fixtures/word-smiths.js delete mode 100644 tests/dummy/mirage/identity-managers/author.js delete mode 100644 tests/dummy/mirage/models/author.js delete mode 100644 tests/dummy/mirage/models/blog-post.js delete mode 100644 tests/dummy/mirage/models/contact.js delete mode 100644 tests/dummy/mirage/models/friend.js delete mode 100644 tests/dummy/mirage/models/word-smith.js delete mode 100644 tests/dummy/mirage/serializers/blog-post.js delete mode 100644 tests/dummy/mirage/serializers/word-smith.js delete mode 100644 tests/integration/ember-data-test.js diff --git a/test-apps/basic-app/app/models/book.js b/test-apps/basic-app/app/models/book.js index 8aae571f3..64a6f13d1 100644 --- a/test-apps/basic-app/app/models/book.js +++ b/test-apps/basic-app/app/models/book.js @@ -1,5 +1,8 @@ import Model from 'ember-data/model'; +import { belongsTo } from 'ember-data/relationships'; export default Model.extend({ + user: belongsTo() + }); diff --git a/test-apps/basic-app/app/models/tag.js b/test-apps/basic-app/app/models/tag.js new file mode 100644 index 000000000..8aae571f3 --- /dev/null +++ b/test-apps/basic-app/app/models/tag.js @@ -0,0 +1,5 @@ +import Model from 'ember-data/model'; + +export default Model.extend({ + +}); diff --git a/test-apps/basic-app/app/models/things/watch.js b/test-apps/basic-app/app/models/things/watch.js new file mode 100644 index 000000000..8aae571f3 --- /dev/null +++ b/test-apps/basic-app/app/models/things/watch.js @@ -0,0 +1,5 @@ +import Model from 'ember-data/model'; + +export default Model.extend({ + +}); diff --git a/test-apps/basic-app/app/models/user.js b/test-apps/basic-app/app/models/user.js index 7e1af21ae..ac53b753c 100644 --- a/test-apps/basic-app/app/models/user.js +++ b/test-apps/basic-app/app/models/user.js @@ -1,10 +1,13 @@ import attr from 'ember-data/attr'; import Model from 'ember-data/model'; +import { hasMany } from 'ember-data/relationships'; export default Model.extend({ name: attr('string'), age: attr('number'), - email: attr('string') + email: attr('string'), + + books: hasMany() }); diff --git a/test-apps/basic-app/tests/acceptance/ember-data-test.js b/test-apps/basic-app/tests/acceptance/ember-data-test.js new file mode 100644 index 000000000..c70fb0482 --- /dev/null +++ b/test-apps/basic-app/tests/acceptance/ember-data-test.js @@ -0,0 +1,72 @@ +import { module, test } from 'qunit'; +import Server from 'ember-cli-mirage/server'; +import { Model } from 'ember-cli-mirage'; +import { modelFor } from 'ember-cli-mirage/ember-data'; + +const CustomTag = Model.extend(); +CustomTag.__isCustom__ = true; + +module('Acceptance | Ember Data', function(hooks) { + hooks.beforeEach(function() { + this.server = new Server({ + environment: 'development', + discoverEmberDataModels: true, + scenarios: { + default() {} + }, + models: { + // Friend exists in dummy/app/models. We want to make sure pre-defined + // models take precedence + tag: CustomTag, + foo: Model.extend() + }, + factories: {} + }); + }); + + hooks.afterEach(function() { + this.server.shutdown(); + }); + + test(`Ember data models were generated and loaded`, function(assert) { + let { schema } = this.server; + let registry = schema._registry; + + assert.ok(registry.foo, 'Mirage model Foo has been registered'); + assert.ok(registry.book, 'EmberData model Book has been registered'); + assert.ok(registry.user, 'EmberData model User has been registered'); + assert.equal(registry.user.foreignKeys.length, 1, 'EmberData model User has the correct relationships'); + assert.equal(registry.book.foreignKeys.length, 1, 'EmberData model User has the correct relationships'); + assert.equal(registry.user.foreignKeys[0], 'bookIds', 'EmberData model User has the correct relationships'); + assert.equal(registry.book.foreignKeys[0], 'userId', 'EmberData model Book has the correct relationships'); + }); + + test(`It works with nested models`, function(assert) { + let { schema } = this.server; + let registry = schema._registry; + + assert.ok(registry['things/watch'], 'Model things/watch has been registered'); + }); + + test(`Defined Mirage models take precedence over autogenerated ones`, function(assert) { + let { schema } = this.server; + let registry = schema._registry; + + assert.ok(registry.tag, 'Model Tag has been registered'); + assert.ok(registry.tag.class.__isCustom__, 'Model Tag is not the autogenerated one'); + }); + + test(`Auto generated models can be extended via modelFor`, function(assert) { + let { schema } = this.server; + let registry = schema._registry; + + assert.ok(registry.book, 'Ember data model Book has been registered'); + assert.ok(modelFor('book'), 'Ember data model Book is found'); + assert.equal(typeof modelFor('book').extend, 'function', 'Ember data model Book can be extended'); + }); + + test(`modelFor is only for auto generated models`, function(assert) { + assert.notOk(modelFor('tag').__isCustom__, 'Tag model is not the pre defined one'); + assert.throws(() => modelFor('foo'), /Model of type 'foo' does not exist/, 'Pre defined mirage models cannot be found via modelFor'); + }); +}); diff --git a/tests/dummy/app/adapters/word-smith.js b/tests/dummy/app/adapters/word-smith.js deleted file mode 100644 index b37ab130e..000000000 --- a/tests/dummy/app/adapters/word-smith.js +++ /dev/null @@ -1,5 +0,0 @@ -import JSONAPIAdapter from 'ember-data/adapters/json-api'; - -export default JSONAPIAdapter.extend({ - namespace: 'api' -}); diff --git a/tests/dummy/app/helpers/.gitkeep b/tests/dummy/app/helpers/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/tests/dummy/app/models/address.js b/tests/dummy/app/models/address.js deleted file mode 100644 index c9d395559..000000000 --- a/tests/dummy/app/models/address.js +++ /dev/null @@ -1,10 +0,0 @@ -import DS from 'ember-data'; - -const { Model, attr, belongsTo } = DS; - -export default Model.extend({ - street: attr('string'), - - contact: belongsTo('contact'), - province: belongsTo('state') -}); diff --git a/tests/dummy/app/models/blog-post.js b/tests/dummy/app/models/blog-post.js deleted file mode 100644 index 4e619aea4..000000000 --- a/tests/dummy/app/models/blog-post.js +++ /dev/null @@ -1,11 +0,0 @@ -import DS from 'ember-data'; - -const { Model, attr, belongsTo } = DS; - -export default Model.extend({ - - title: attr(), - - wordSmith: belongsTo() - -}); diff --git a/tests/dummy/app/models/contact.js b/tests/dummy/app/models/contact.js deleted file mode 100644 index 8eaa01c07..000000000 --- a/tests/dummy/app/models/contact.js +++ /dev/null @@ -1,11 +0,0 @@ -import DS from 'ember-data'; - -const { Model, attr, belongsTo } = DS; - -export default Model.extend({ - name: attr('string'), - age: attr('number'), - email: attr('string'), - - address: belongsTo('address') -}); diff --git a/tests/dummy/app/models/friend.js b/tests/dummy/app/models/friend.js deleted file mode 100644 index 1294cbdbf..000000000 --- a/tests/dummy/app/models/friend.js +++ /dev/null @@ -1,8 +0,0 @@ -import DS from 'ember-data'; -import Contact from './contact'; - -const { attr } = DS; - -export default Contact.extend({ - isYoung: attr('boolean') -}); diff --git a/tests/dummy/app/models/pet.js b/tests/dummy/app/models/pet.js deleted file mode 100644 index b0fbb379b..000000000 --- a/tests/dummy/app/models/pet.js +++ /dev/null @@ -1,8 +0,0 @@ -import DS from 'ember-data'; - -const { Model, attr } = DS; - -export default Model.extend({ - name: attr('string'), - alive: attr('boolean') -}); diff --git a/tests/dummy/app/models/pet/dog.js b/tests/dummy/app/models/pet/dog.js deleted file mode 100644 index 418056b01..000000000 --- a/tests/dummy/app/models/pet/dog.js +++ /dev/null @@ -1,3 +0,0 @@ -import Pet from '../pet'; - -export default Pet.extend({}); diff --git a/tests/dummy/app/models/state.js b/tests/dummy/app/models/state.js deleted file mode 100644 index 17ecd8d9f..000000000 --- a/tests/dummy/app/models/state.js +++ /dev/null @@ -1,7 +0,0 @@ -import DS from 'ember-data'; - -const { Model, hasMany } = DS; - -export default Model.extend({ - addresses: hasMany('address') -}); diff --git a/tests/dummy/app/models/word-smith.js b/tests/dummy/app/models/word-smith.js deleted file mode 100644 index 228563fb0..000000000 --- a/tests/dummy/app/models/word-smith.js +++ /dev/null @@ -1,11 +0,0 @@ -import DS from 'ember-data'; - -const { Model, attr, hasMany } = DS; - -export default Model.extend({ - - name: attr(), - - blogPosts: hasMany() - -}); diff --git a/tests/dummy/app/routes/application.js b/tests/dummy/app/routes/application.js deleted file mode 100644 index 6fc59dccc..000000000 --- a/tests/dummy/app/routes/application.js +++ /dev/null @@ -1,28 +0,0 @@ -import Route from '@ember/routing/route'; - -export default Route.extend({ - - actions: { - createContact() { - let controller = this.controllerFor('contacts'); - let name = controller.get('newName'); - let newContact = this.store.createRecord('contact', { name }); - controller.set('newName', ''); - - return newContact.save(); - }, - - saveContact(contact) { - return contact.save().then((contact) => { - this.transitionTo('contact', contact); - }); - }, - - deleteContact(contact) { - return contact.destroyRecord().then(() => { - this.transitionTo('contacts'); - }); - } - } - -}); diff --git a/tests/dummy/app/routes/close-friends.js b/tests/dummy/app/routes/close-friends.js deleted file mode 100644 index d5c06fb08..000000000 --- a/tests/dummy/app/routes/close-friends.js +++ /dev/null @@ -1,14 +0,0 @@ -import Route from '@ember/routing/route'; - -export default Route.extend({ - - model() { - let store = this.get('store'); - return store.query('friend', { ids: [1, 3] }).then(function() { - // I request 2 friends and then return all friends to be sure no other friend - // was loaded into the store. - return store.peekAll('friend'); - }); - } - -}); diff --git a/tests/dummy/app/routes/contacts.js b/tests/dummy/app/routes/contacts.js deleted file mode 100644 index 511f32bf1..000000000 --- a/tests/dummy/app/routes/contacts.js +++ /dev/null @@ -1,22 +0,0 @@ -import Route from '@ember/routing/route'; - -export default Route.extend({ - - model() { - return this.store.findAll('contact') - .catch((reason) => { - let errorMsg = reason.responseJSON ? reason.responseJSON.errors[0] : reason.errors[0]; - - this.set('error', errorMsg); - }); - }, - - setupController(controller, model) { - if (this.get('error')) { - controller.set('error', this.get('error')); - } else { - controller.set('model', model); - } - } - -}); diff --git a/tests/dummy/app/routes/friends.js b/tests/dummy/app/routes/friends.js deleted file mode 100644 index e307d1a46..000000000 --- a/tests/dummy/app/routes/friends.js +++ /dev/null @@ -1,9 +0,0 @@ -import Route from '@ember/routing/route'; - -export default Route.extend({ - - model() { - return this.store.findAll('friend'); - } - -}); diff --git a/tests/dummy/app/routes/pets.js b/tests/dummy/app/routes/pets.js deleted file mode 100644 index 7f7ee9955..000000000 --- a/tests/dummy/app/routes/pets.js +++ /dev/null @@ -1,28 +0,0 @@ -import Route from '@ember/routing/route'; - -export default Route.extend({ - - actions: { - createPet() { - let controller = this.controllerFor('pets'); - let name = controller.get('petName'); - controller.set('petName', ''); - this.store.createRecord('pet', { name, alive: true }); - } - }, - - setupController(controller, model) { - if (this.get('error')) { - controller.set('error', this.get('error')); - } else { - controller.set('model', model); - } - }, - - model() { - return this.store.findAll('pet').catch((reason) => { - let errorMsg = reason.responseJSON ? reason.responseJSON.errors[0] : reason.errors[0]; - this.set('error', errorMsg); - }); - } -}); diff --git a/tests/dummy/app/serializers/blog-post.js b/tests/dummy/app/serializers/blog-post.js deleted file mode 100644 index 724140afc..000000000 --- a/tests/dummy/app/serializers/blog-post.js +++ /dev/null @@ -1,5 +0,0 @@ -import DS from 'ember-data'; - -const { JSONAPISerializer } = DS; - -export default JSONAPISerializer; diff --git a/tests/dummy/app/serializers/word-smith.js b/tests/dummy/app/serializers/word-smith.js deleted file mode 100644 index 724140afc..000000000 --- a/tests/dummy/app/serializers/word-smith.js +++ /dev/null @@ -1,5 +0,0 @@ -import DS from 'ember-data'; - -const { JSONAPISerializer } = DS; - -export default JSONAPISerializer; diff --git a/tests/dummy/mirage/config.js b/tests/dummy/mirage/config.js index 551590834..8daf5ec05 100644 --- a/tests/dummy/mirage/config.js +++ b/tests/dummy/mirage/config.js @@ -1,7 +1,3 @@ export default function() { - this.passthrough(); -} -export function testConfig() { - this.get('/friends/:id'); } diff --git a/tests/dummy/mirage/factories/address.js b/tests/dummy/mirage/factories/address.js deleted file mode 100644 index cf5aa2026..000000000 --- a/tests/dummy/mirage/factories/address.js +++ /dev/null @@ -1,4 +0,0 @@ -import Mirage from 'ember-cli-mirage'; - -export default Mirage.Factory.extend({ -}); diff --git a/tests/dummy/mirage/factories/blog-post.js b/tests/dummy/mirage/factories/blog-post.js deleted file mode 100644 index 6da02d311..000000000 --- a/tests/dummy/mirage/factories/blog-post.js +++ /dev/null @@ -1,9 +0,0 @@ -import { Factory, faker } from 'ember-cli-mirage'; - -export default Factory.extend({ - - title() { - return faker.lorem.sentence(); - } - -}); diff --git a/tests/dummy/mirage/factories/contact.js b/tests/dummy/mirage/factories/contact.js deleted file mode 100644 index 6bae0bd01..000000000 --- a/tests/dummy/mirage/factories/contact.js +++ /dev/null @@ -1,17 +0,0 @@ -import Mirage from 'ember-cli-mirage'; -import { faker } from 'ember-cli-mirage'; - -export default Mirage.Factory.extend({ - title: faker.list.cycle('Duke', 'Developer', 'Artist'), - name: faker.name.firstName, - age: 20, - - email(i) { - return `person${i}@test.com`; - }, - - admin() { - return this.age > 30; - } - -}); diff --git a/tests/dummy/mirage/factories/friend.js b/tests/dummy/mirage/factories/friend.js deleted file mode 100644 index 6c8671285..000000000 --- a/tests/dummy/mirage/factories/friend.js +++ /dev/null @@ -1,7 +0,0 @@ -import ContactFactory from './contact'; - -export default ContactFactory.extend({ - isYoung() { - return this.age < 18; - } -}); diff --git a/tests/dummy/mirage/factories/pet.js b/tests/dummy/mirage/factories/pet.js deleted file mode 100644 index b2e4db09b..000000000 --- a/tests/dummy/mirage/factories/pet.js +++ /dev/null @@ -1,11 +0,0 @@ -import Mirage from 'ember-cli-mirage'; - -const names = ['Rex', 'Toby', 'Sam', 'Andy', 'Lassie', 'Annibal', 'Spark']; - -export default Mirage.Factory.extend({ - alive: true, - - name(i) { - return names[i % names.length]; - } -}); diff --git a/tests/dummy/mirage/factories/word-smith.js b/tests/dummy/mirage/factories/word-smith.js deleted file mode 100644 index cc4192d93..000000000 --- a/tests/dummy/mirage/factories/word-smith.js +++ /dev/null @@ -1,9 +0,0 @@ -import { Factory, faker } from 'ember-cli-mirage'; - -export default Factory.extend({ - - name() { - return `${faker.name.firstName()} ${faker.name.lastName()}`; - } - -}); diff --git a/tests/dummy/mirage/fixtures/addresses.js b/tests/dummy/mirage/fixtures/addresses.js deleted file mode 100644 index dd39016b5..000000000 --- a/tests/dummy/mirage/fixtures/addresses.js +++ /dev/null @@ -1,12 +0,0 @@ -export default [ - { - id: 1, - name: '123 Hyrule Way', - contact_id: 1 - }, - { - id: 2, - name: 'Mount Doom', - contact_id: 2 - } -]; diff --git a/tests/dummy/mirage/fixtures/blog-posts.js b/tests/dummy/mirage/fixtures/blog-posts.js deleted file mode 100644 index d7659a9d4..000000000 --- a/tests/dummy/mirage/fixtures/blog-posts.js +++ /dev/null @@ -1,17 +0,0 @@ -export default [ - { - id: 1, - title: 'Lorem', - wordSmithId: 1 - }, - { - id: 2, - title: 'Ipsum', - wordSmithId: 1 - }, - { - id: 3, - title: 'Dolor', - wordSmithId: 1 - } -]; diff --git a/tests/dummy/mirage/fixtures/contacts.js b/tests/dummy/mirage/fixtures/contacts.js deleted file mode 100644 index f8dc28fc4..000000000 --- a/tests/dummy/mirage/fixtures/contacts.js +++ /dev/null @@ -1,15 +0,0 @@ -export default [ - { - id: 1, - name: 'Joe', - address_ids: [1] - }, - { - id: 2, - name: 'Bob' - }, - { - id: 3, - name: 'Susan' - } -]; diff --git a/tests/dummy/mirage/fixtures/friends.js b/tests/dummy/mirage/fixtures/friends.js deleted file mode 100644 index 57342b277..000000000 --- a/tests/dummy/mirage/fixtures/friends.js +++ /dev/null @@ -1,14 +0,0 @@ -export default [ - { - id: 1, - name: 'Joe', - age: 10, - isYoung: true - }, - { - id: 2, - name: 'Bob', - age: 80, - isYoung: false - } -]; diff --git a/tests/dummy/mirage/fixtures/word-smiths.js b/tests/dummy/mirage/fixtures/word-smiths.js deleted file mode 100644 index 5e694af26..000000000 --- a/tests/dummy/mirage/fixtures/word-smiths.js +++ /dev/null @@ -1,7 +0,0 @@ -export default [ - { - id: 1, - name: 'Link', - blogPostIds: [1, 2, 3] - } -]; diff --git a/tests/dummy/mirage/identity-managers/author.js b/tests/dummy/mirage/identity-managers/author.js deleted file mode 100644 index 76f1564ad..000000000 --- a/tests/dummy/mirage/identity-managers/author.js +++ /dev/null @@ -1,57 +0,0 @@ -export default class { - constructor() { - this.reset(); - } - - /** - * Returns an unique identifier. - * - * @method fetch - * @return {String} Unique identifier - * @public - */ - fetch() { - let alphabet = 'abcdefghijklmnopqrstuvwxyz'; - let id; - - if (this._nextId >= alphabet.length) { - throw new Error(`IdentityManager used for testing only supports ${alphabet.length} ids.`); - } - id = alphabet[this._nextId % alphabet.length]; - this._ids[id] = true; - this._nextId = this._nextid + 1; - return id; - } - - /** - * Register an identifier. - * Must throw if identifier is already used. - * - * @method set - * @param {String|Number} id - * @public - */ - set(id) { - if (typeof this._ids[id] !== 'undefined') { - throw new Error(`Id {id} is already used.`); - } - - this._ids[id] = true; - - let int = parseInt(id, 16); - if (!isNaN(int) && int > this._nextid) { - this._nextId = int; - } - } - - /** - * Reset identity manager. - * - * @method reset - * @public - */ - reset() { - this._nextId = 0; - this._ids = {}; - } -} diff --git a/tests/dummy/mirage/models/author.js b/tests/dummy/mirage/models/author.js deleted file mode 100644 index 3cc484b7a..000000000 --- a/tests/dummy/mirage/models/author.js +++ /dev/null @@ -1,5 +0,0 @@ -import { Model } from 'ember-cli-mirage'; - -export default Model.extend({ - -}); diff --git a/tests/dummy/mirage/models/blog-post.js b/tests/dummy/mirage/models/blog-post.js deleted file mode 100644 index 6dec5c357..000000000 --- a/tests/dummy/mirage/models/blog-post.js +++ /dev/null @@ -1,7 +0,0 @@ -import { Model, belongsTo } from 'ember-cli-mirage'; - -export default Model.extend({ - - wordSmith: belongsTo() - -}); diff --git a/tests/dummy/mirage/models/contact.js b/tests/dummy/mirage/models/contact.js deleted file mode 100644 index 1486a7240..000000000 --- a/tests/dummy/mirage/models/contact.js +++ /dev/null @@ -1,4 +0,0 @@ -import { Model } from 'ember-cli-mirage'; - -export default Model.extend({ -}); diff --git a/tests/dummy/mirage/models/friend.js b/tests/dummy/mirage/models/friend.js deleted file mode 100644 index 1486a7240..000000000 --- a/tests/dummy/mirage/models/friend.js +++ /dev/null @@ -1,4 +0,0 @@ -import { Model } from 'ember-cli-mirage'; - -export default Model.extend({ -}); diff --git a/tests/dummy/mirage/models/word-smith.js b/tests/dummy/mirage/models/word-smith.js deleted file mode 100644 index 954ddc28f..000000000 --- a/tests/dummy/mirage/models/word-smith.js +++ /dev/null @@ -1,7 +0,0 @@ -import { Model, hasMany } from 'ember-cli-mirage'; - -export default Model.extend({ - - blogPosts: hasMany() - -}); diff --git a/tests/dummy/mirage/scenarios/default.js b/tests/dummy/mirage/scenarios/default.js index c3933552f..1b5dd13ef 100644 --- a/tests/dummy/mirage/scenarios/default.js +++ b/tests/dummy/mirage/scenarios/default.js @@ -1,17 +1,2 @@ export default function(server) { - let joe = server.create('contact', { name: 'Joe' }); - server.create('address', { name: '123 Hyrule Way', contact_id: joe.id }); - - let bob = server.create('contact', { name: 'Bob' }); - server.create('address', { name: 'Mount Doom', contact_id: bob.id }); - server.create('contact', { name: 'Susan' }); - - server.create('friend', { name: 'Joe', age: 10, isYoung: true }); - server.create('friend', { name: 'Bob', age: 80, isYoung: false }); - - server.create('pet', { name: 'Pinky', alive: true }); - server.create('pet', { name: 'Bobby', alive: true }); - server.create('pet', { name: 'Brownie', alive: true }); - - server.create('pet', { name: 'Cactus', alive: false }); } diff --git a/tests/dummy/mirage/serializers/application.js b/tests/dummy/mirage/serializers/application.js index e2785094a..9ebd0e296 100644 --- a/tests/dummy/mirage/serializers/application.js +++ b/tests/dummy/mirage/serializers/application.js @@ -1,3 +1,3 @@ -import ActiveModelSerializer from 'ember-cli-mirage/serializers/active-model-serializer'; +import { JSONAPISerializer } from 'ember-cli-mirage'; -export default ActiveModelSerializer; +export default JSONAPISerializer; diff --git a/tests/dummy/mirage/serializers/blog-post.js b/tests/dummy/mirage/serializers/blog-post.js deleted file mode 100644 index cb65bfbb8..000000000 --- a/tests/dummy/mirage/serializers/blog-post.js +++ /dev/null @@ -1,5 +0,0 @@ -import { JSONAPISerializer } from 'ember-cli-mirage'; - -export default JSONAPISerializer.extend({ -}); - diff --git a/tests/dummy/mirage/serializers/word-smith.js b/tests/dummy/mirage/serializers/word-smith.js deleted file mode 100644 index b3d65d7a1..000000000 --- a/tests/dummy/mirage/serializers/word-smith.js +++ /dev/null @@ -1,6 +0,0 @@ -import { JSONAPISerializer } from 'ember-cli-mirage'; - -export default JSONAPISerializer.extend({ - include: ['blogPosts'] -}); - diff --git a/tests/integration/ember-data-test.js b/tests/integration/ember-data-test.js deleted file mode 100644 index 8b33ec4f5..000000000 --- a/tests/integration/ember-data-test.js +++ /dev/null @@ -1,72 +0,0 @@ -import { module, test } from 'qunit'; -import Server from 'ember-cli-mirage/server'; -import { Model } from 'ember-cli-mirage'; -import { modelFor } from 'ember-cli-mirage/ember-data'; - -const CustomFriend = Model.extend(); -CustomFriend.__isCustom__ = true; - -module('Integration | Ember Data', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'development', - discoverEmberDataModels: true, - scenarios: { - default() {} - }, - models: { - // Friend exists in dummy/app/models. We want to make sure pre-defined - // models take precedence - friend: CustomFriend, - foo: Model.extend() - }, - factories: {} - }); - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test(`Ember data models were generated and loaded`, function(assert) { - let { schema } = this.server; - let registry = schema._registry; - - assert.ok(registry.foo, 'Pre defined model Foo has been registered'); - assert.ok(registry.address, 'Ember data model Address has been registered'); - assert.ok(registry.contact, 'Ember data model Contact has been registered'); - assert.ok(registry.user, 'Ember data model User has been registered'); - assert.equal(registry.address.foreignKeys.length, 2, 'Ember data model Address has the correct relationships'); - assert.equal(registry.address.foreignKeys[0], 'contactId', 'Ember data model Address has the correct relationships'); - assert.equal(registry.address.foreignKeys[1], 'provinceId', 'Ember data model Address has the correct relationships'); - }); - - test(`It works with nested models`, function(assert) { - let { schema } = this.server; - let registry = schema._registry; - - assert.ok(registry['pet/dog'], 'Model pet/dog has been registered'); - }); - - test(`Defined mirage models take precedence over autogenerated ones`, function(assert) { - let { schema } = this.server; - let registry = schema._registry; - - assert.ok(registry.friend, 'Model Friend has been registered'); - assert.ok(registry.friend.class.__isCustom__, 'Model Friend is not the autogenerated one'); - }); - - test(`Auto generated models can be extended via modelFor`, function(assert) { - let { schema } = this.server; - let registry = schema._registry; - - assert.ok(registry.address, 'Ember data model Address has been registered'); - assert.ok(modelFor('address'), 'Ember data model Address is found'); - assert.equal(typeof modelFor('address').extend, 'function', 'Ember data model Address can be extended'); - }); - - test(`modelFor is only for auto generated models`, function(assert) { - assert.notOk(modelFor('friend').__isCustom__, 'Friend model is not the pre defined one'); - assert.throws(() => modelFor('foo'), () => true, 'Pre defined mirage models cannot be found via modelFor'); - }); -}); From 28f275338a392348f6830b630d3a9d63e5d42f59 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 15 Nov 2018 10:08:19 -0500 Subject: [PATCH 245/879] Clean up dummy app --- .../application/controller.js} | 0 .../application/template.hbs} | 0 .../defining-relationships/template.md} | 0 .../advanced/environment-options/template.md} | 0 .../docs/advanced/factories/template.md} | 0 .../docs/advanced/fixtures/template.md} | 0 .../docs/advanced/route-handlers/template.md} | 0 .../docs/advanced/shorthands/template.md} | 0 .../manually-starting-mirage/template.md} | 0 .../simulating-cookie-responses/template.md} | 0 .../docs/getting-started/index/template.md} | 0 .../getting-started/installation/template.md} | 0 .../getting-started/quickstart/template.md} | 0 .../docs/getting-started/upgrading/template.md} | 0 .../docs.hbs => pods/docs/template.hbs} | 0 .../acceptance-testing/template.md} | 0 .../defining-routes/template.md} | 0 .../seeding-your-database/template.md} | 0 .../index.hbs => pods/index/template.hbs} | 0 .../not-found/template.hbs} | 0 tests/dummy/app/pods/user/model.js | 4 ---- .../app/templates/{components => }/.gitkeep | 0 tests/dummy/app/templates/close-friends.hbs | 3 --- tests/dummy/app/templates/contact.hbs | 13 ------------- tests/dummy/app/templates/contacts.hbs | 17 ----------------- tests/dummy/app/templates/edit.hbs | 6 ------ tests/dummy/app/templates/friend.hbs | 1 - tests/dummy/app/templates/friends.hbs | 3 --- tests/dummy/app/templates/pets.hbs | 11 ----------- tests/dummy/mirage/config.js | 2 +- .../index-named-imports-test.js | 0 31 files changed, 1 insertion(+), 59 deletions(-) rename tests/dummy/app/{controllers/application.js => pods/application/controller.js} (100%) rename tests/dummy/app/{templates/application.hbs => pods/application/template.hbs} (100%) rename tests/dummy/app/{templates/docs/advanced/defining-relationships.md => pods/docs/advanced/defining-relationships/template.md} (100%) rename tests/dummy/app/{templates/docs/advanced/environment-options.md => pods/docs/advanced/environment-options/template.md} (100%) rename tests/dummy/app/{templates/docs/advanced/factories.md => pods/docs/advanced/factories/template.md} (100%) rename tests/dummy/app/{templates/docs/advanced/fixtures.md => pods/docs/advanced/fixtures/template.md} (100%) rename tests/dummy/app/{templates/docs/advanced/route-handlers.md => pods/docs/advanced/route-handlers/template.md} (100%) rename tests/dummy/app/{templates/docs/advanced/shorthands.md => pods/docs/advanced/shorthands/template.md} (100%) rename tests/dummy/app/{templates/docs/cookbook/manually-starting-mirage.md => pods/docs/cookbook/manually-starting-mirage/template.md} (100%) rename tests/dummy/app/{templates/docs/cookbook/simulating-cookie-responses.md => pods/docs/cookbook/simulating-cookie-responses/template.md} (100%) rename tests/dummy/app/{templates/docs/getting-started/index.md => pods/docs/getting-started/index/template.md} (100%) rename tests/dummy/app/{templates/docs/getting-started/installation.md => pods/docs/getting-started/installation/template.md} (100%) rename tests/dummy/app/{templates/docs/getting-started/quickstart.md => pods/docs/getting-started/quickstart/template.md} (100%) rename tests/dummy/app/{templates/docs/getting-started/upgrading.md => pods/docs/getting-started/upgrading/template.md} (100%) rename tests/dummy/app/{templates/docs.hbs => pods/docs/template.hbs} (100%) rename tests/dummy/app/{templates/docs/writing-your-server/acceptance-testing.md => pods/docs/writing-your-server/acceptance-testing/template.md} (100%) rename tests/dummy/app/{templates/docs/writing-your-server/defining-routes.md => pods/docs/writing-your-server/defining-routes/template.md} (100%) rename tests/dummy/app/{templates/docs/writing-your-server/seeding-your-database.md => pods/docs/writing-your-server/seeding-your-database/template.md} (100%) rename tests/dummy/app/{templates/index.hbs => pods/index/template.hbs} (100%) rename tests/dummy/app/{templates/not-found.hbs => pods/not-found/template.hbs} (100%) delete mode 100644 tests/dummy/app/pods/user/model.js rename tests/dummy/app/templates/{components => }/.gitkeep (100%) delete mode 100644 tests/dummy/app/templates/close-friends.hbs delete mode 100644 tests/dummy/app/templates/contact.hbs delete mode 100644 tests/dummy/app/templates/contacts.hbs delete mode 100644 tests/dummy/app/templates/edit.hbs delete mode 100644 tests/dummy/app/templates/friend.hbs delete mode 100644 tests/dummy/app/templates/friends.hbs delete mode 100644 tests/dummy/app/templates/pets.hbs rename tests/{ => integration}/index-named-imports-test.js (100%) diff --git a/tests/dummy/app/controllers/application.js b/tests/dummy/app/pods/application/controller.js similarity index 100% rename from tests/dummy/app/controllers/application.js rename to tests/dummy/app/pods/application/controller.js diff --git a/tests/dummy/app/templates/application.hbs b/tests/dummy/app/pods/application/template.hbs similarity index 100% rename from tests/dummy/app/templates/application.hbs rename to tests/dummy/app/pods/application/template.hbs diff --git a/tests/dummy/app/templates/docs/advanced/defining-relationships.md b/tests/dummy/app/pods/docs/advanced/defining-relationships/template.md similarity index 100% rename from tests/dummy/app/templates/docs/advanced/defining-relationships.md rename to tests/dummy/app/pods/docs/advanced/defining-relationships/template.md diff --git a/tests/dummy/app/templates/docs/advanced/environment-options.md b/tests/dummy/app/pods/docs/advanced/environment-options/template.md similarity index 100% rename from tests/dummy/app/templates/docs/advanced/environment-options.md rename to tests/dummy/app/pods/docs/advanced/environment-options/template.md diff --git a/tests/dummy/app/templates/docs/advanced/factories.md b/tests/dummy/app/pods/docs/advanced/factories/template.md similarity index 100% rename from tests/dummy/app/templates/docs/advanced/factories.md rename to tests/dummy/app/pods/docs/advanced/factories/template.md diff --git a/tests/dummy/app/templates/docs/advanced/fixtures.md b/tests/dummy/app/pods/docs/advanced/fixtures/template.md similarity index 100% rename from tests/dummy/app/templates/docs/advanced/fixtures.md rename to tests/dummy/app/pods/docs/advanced/fixtures/template.md diff --git a/tests/dummy/app/templates/docs/advanced/route-handlers.md b/tests/dummy/app/pods/docs/advanced/route-handlers/template.md similarity index 100% rename from tests/dummy/app/templates/docs/advanced/route-handlers.md rename to tests/dummy/app/pods/docs/advanced/route-handlers/template.md diff --git a/tests/dummy/app/templates/docs/advanced/shorthands.md b/tests/dummy/app/pods/docs/advanced/shorthands/template.md similarity index 100% rename from tests/dummy/app/templates/docs/advanced/shorthands.md rename to tests/dummy/app/pods/docs/advanced/shorthands/template.md diff --git a/tests/dummy/app/templates/docs/cookbook/manually-starting-mirage.md b/tests/dummy/app/pods/docs/cookbook/manually-starting-mirage/template.md similarity index 100% rename from tests/dummy/app/templates/docs/cookbook/manually-starting-mirage.md rename to tests/dummy/app/pods/docs/cookbook/manually-starting-mirage/template.md diff --git a/tests/dummy/app/templates/docs/cookbook/simulating-cookie-responses.md b/tests/dummy/app/pods/docs/cookbook/simulating-cookie-responses/template.md similarity index 100% rename from tests/dummy/app/templates/docs/cookbook/simulating-cookie-responses.md rename to tests/dummy/app/pods/docs/cookbook/simulating-cookie-responses/template.md diff --git a/tests/dummy/app/templates/docs/getting-started/index.md b/tests/dummy/app/pods/docs/getting-started/index/template.md similarity index 100% rename from tests/dummy/app/templates/docs/getting-started/index.md rename to tests/dummy/app/pods/docs/getting-started/index/template.md diff --git a/tests/dummy/app/templates/docs/getting-started/installation.md b/tests/dummy/app/pods/docs/getting-started/installation/template.md similarity index 100% rename from tests/dummy/app/templates/docs/getting-started/installation.md rename to tests/dummy/app/pods/docs/getting-started/installation/template.md diff --git a/tests/dummy/app/templates/docs/getting-started/quickstart.md b/tests/dummy/app/pods/docs/getting-started/quickstart/template.md similarity index 100% rename from tests/dummy/app/templates/docs/getting-started/quickstart.md rename to tests/dummy/app/pods/docs/getting-started/quickstart/template.md diff --git a/tests/dummy/app/templates/docs/getting-started/upgrading.md b/tests/dummy/app/pods/docs/getting-started/upgrading/template.md similarity index 100% rename from tests/dummy/app/templates/docs/getting-started/upgrading.md rename to tests/dummy/app/pods/docs/getting-started/upgrading/template.md diff --git a/tests/dummy/app/templates/docs.hbs b/tests/dummy/app/pods/docs/template.hbs similarity index 100% rename from tests/dummy/app/templates/docs.hbs rename to tests/dummy/app/pods/docs/template.hbs diff --git a/tests/dummy/app/templates/docs/writing-your-server/acceptance-testing.md b/tests/dummy/app/pods/docs/writing-your-server/acceptance-testing/template.md similarity index 100% rename from tests/dummy/app/templates/docs/writing-your-server/acceptance-testing.md rename to tests/dummy/app/pods/docs/writing-your-server/acceptance-testing/template.md diff --git a/tests/dummy/app/templates/docs/writing-your-server/defining-routes.md b/tests/dummy/app/pods/docs/writing-your-server/defining-routes/template.md similarity index 100% rename from tests/dummy/app/templates/docs/writing-your-server/defining-routes.md rename to tests/dummy/app/pods/docs/writing-your-server/defining-routes/template.md diff --git a/tests/dummy/app/templates/docs/writing-your-server/seeding-your-database.md b/tests/dummy/app/pods/docs/writing-your-server/seeding-your-database/template.md similarity index 100% rename from tests/dummy/app/templates/docs/writing-your-server/seeding-your-database.md rename to tests/dummy/app/pods/docs/writing-your-server/seeding-your-database/template.md diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/pods/index/template.hbs similarity index 100% rename from tests/dummy/app/templates/index.hbs rename to tests/dummy/app/pods/index/template.hbs diff --git a/tests/dummy/app/templates/not-found.hbs b/tests/dummy/app/pods/not-found/template.hbs similarity index 100% rename from tests/dummy/app/templates/not-found.hbs rename to tests/dummy/app/pods/not-found/template.hbs diff --git a/tests/dummy/app/pods/user/model.js b/tests/dummy/app/pods/user/model.js deleted file mode 100644 index 7b5f4284f..000000000 --- a/tests/dummy/app/pods/user/model.js +++ /dev/null @@ -1,4 +0,0 @@ -import DS from 'ember-data'; - -export default DS.Model.extend({ -}); diff --git a/tests/dummy/app/templates/components/.gitkeep b/tests/dummy/app/templates/.gitkeep similarity index 100% rename from tests/dummy/app/templates/components/.gitkeep rename to tests/dummy/app/templates/.gitkeep diff --git a/tests/dummy/app/templates/close-friends.hbs b/tests/dummy/app/templates/close-friends.hbs deleted file mode 100644 index 0b214ef65..000000000 --- a/tests/dummy/app/templates/close-friends.hbs +++ /dev/null @@ -1,3 +0,0 @@ -{{#each model as |friend|}} -

    {{friend.name}} is your {{friend.age}}-year-old friend.

    -{{/each}} diff --git a/tests/dummy/app/templates/contact.hbs b/tests/dummy/app/templates/contact.hbs deleted file mode 100644 index a90a2cbee..000000000 --- a/tests/dummy/app/templates/contact.hbs +++ /dev/null @@ -1,13 +0,0 @@ -{{link-to 'Back home' 'contacts'}} - -

    The contact is {{model.name}}

    - -
    - {{#link-to 'edit' model}} - - {{/link-to}} -
    - -
    - -
    diff --git a/tests/dummy/app/templates/contacts.hbs b/tests/dummy/app/templates/contacts.hbs deleted file mode 100644 index ef7c2d9d9..000000000 --- a/tests/dummy/app/templates/contacts.hbs +++ /dev/null @@ -1,17 +0,0 @@ -{{#if error}} -

    There was an error: {{error}}

    -{{else}} - {{#each model as |contact|}} -

    {{link-to contact.name 'contact' contact}}

    - {{/each}} -{{/if}} - -
    - -
    -
    {{input value=newName placeholder='Name'}}
    - -
    - -
    -
    diff --git a/tests/dummy/app/templates/edit.hbs b/tests/dummy/app/templates/edit.hbs deleted file mode 100644 index 757d7a289..000000000 --- a/tests/dummy/app/templates/edit.hbs +++ /dev/null @@ -1,6 +0,0 @@ -
    - {{input value=model.name}} -
    - -{{link-to 'Cancel' 'contact' model}} - diff --git a/tests/dummy/app/templates/friend.hbs b/tests/dummy/app/templates/friend.hbs deleted file mode 100644 index 911ecc752..000000000 --- a/tests/dummy/app/templates/friend.hbs +++ /dev/null @@ -1 +0,0 @@ -

    {{model.name}}

    diff --git a/tests/dummy/app/templates/friends.hbs b/tests/dummy/app/templates/friends.hbs deleted file mode 100644 index 0b214ef65..000000000 --- a/tests/dummy/app/templates/friends.hbs +++ /dev/null @@ -1,3 +0,0 @@ -{{#each model as |friend|}} -

    {{friend.name}} is your {{friend.age}}-year-old friend.

    -{{/each}} diff --git a/tests/dummy/app/templates/pets.hbs b/tests/dummy/app/templates/pets.hbs deleted file mode 100644 index 0a6d37868..000000000 --- a/tests/dummy/app/templates/pets.hbs +++ /dev/null @@ -1,11 +0,0 @@ -{{#if error}} -

    There was an error: {{error}}

    -{{else}} -
      - {{#each model as |pet|}} -
    • {{pet.name}} / alive: {{pet.alive}}
    • - {{/each}} - {{input value=petName}} - -
    -{{/if}} diff --git a/tests/dummy/mirage/config.js b/tests/dummy/mirage/config.js index 8daf5ec05..f1c6b95ee 100644 --- a/tests/dummy/mirage/config.js +++ b/tests/dummy/mirage/config.js @@ -1,3 +1,3 @@ export default function() { - + this.passthrough(); } diff --git a/tests/index-named-imports-test.js b/tests/integration/index-named-imports-test.js similarity index 100% rename from tests/index-named-imports-test.js rename to tests/integration/index-named-imports-test.js From a635e93bc2aaafc4ffd5b87e0482870b7df731ec Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 15 Nov 2018 17:58:20 -0500 Subject: [PATCH 246/879] Update ISSUE_TEMPLATE.md --- ISSUE_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index 9609a88d9..5bf9b07be 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -2,7 +2,7 @@ If possible, please use the Mirage Boilerplate Twiddle to demonstrate your issue or bug: -- Open the Mirage Boilerplate Twiddle: https://ember-twiddle.com/eedfd390d8394d54d5bfd0ed988a5d0f?openFiles=templates.application.hbs%2C +- Open the Mirage Boilerplate Twiddle: https://ember-twiddle.com/eedfd390d8394d54d5bfd0ed988a5d0f?openFiles=twiddle.json%2C - Click File > Copy Twiddle - Reproduce your issue - Click File > Save to Github Gist From 4e821fd1a8570a345dd473bd161c2580ef135c98 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 15 Nov 2018 17:59:07 -0500 Subject: [PATCH 247/879] Update ISSUE_TEMPLATE.md --- ISSUE_TEMPLATE.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index 5bf9b07be..5acaf74e8 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -2,8 +2,14 @@ If possible, please use the Mirage Boilerplate Twiddle to demonstrate your issue or bug: -- Open the Mirage Boilerplate Twiddle: https://ember-twiddle.com/eedfd390d8394d54d5bfd0ed988a5d0f?openFiles=twiddle.json%2C -- Click File > Copy Twiddle -- Reproduce your issue -- Click File > Save to Github Gist -- Include the URL to your Twiddle in your issue +1. Open the Mirage Boilerplate Twiddle: + +https://ember-twiddle.com/eedfd390d8394d54d5bfd0ed988a5d0f?openFiles=twiddle.json%2C + +2. Click File > Copy Twiddle + +3. Reproduce your issue + +4.Click File > Save to Github Gist + +5. Include the URL to your Twiddle in your issue From 161072adb5d0d0775f5500e8e46fc7587af0d80f Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 15 Nov 2018 17:59:23 -0500 Subject: [PATCH 248/879] Update ISSUE_TEMPLATE.md --- ISSUE_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index 5acaf74e8..8608755d5 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -4,7 +4,7 @@ If possible, please use the Mirage Boilerplate Twiddle to demonstrate your issue 1. Open the Mirage Boilerplate Twiddle: -https://ember-twiddle.com/eedfd390d8394d54d5bfd0ed988a5d0f?openFiles=twiddle.json%2C + https://ember-twiddle.com/eedfd390d8394d54d5bfd0ed988a5d0f?openFiles=twiddle.json%2C 2. Click File > Copy Twiddle From 1b76b392cf055e3ded4e3dd3ea68a49ee3f438de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82?= Date: Sat, 3 Nov 2018 12:43:43 +0100 Subject: [PATCH 249/879] nested included relationships normalization - failing test --- ...22-relationship-path-normalization-test.js | 31 +- yarn.lock | 1128 +---------------- 2 files changed, 24 insertions(+), 1135 deletions(-) diff --git a/tests/integration/server/regressions/1322-relationship-path-normalization-test.js b/tests/integration/server/regressions/1322-relationship-path-normalization-test.js index fdcb169ad..70207a3b3 100644 --- a/tests/integration/server/regressions/1322-relationship-path-normalization-test.js +++ b/tests/integration/server/regressions/1322-relationship-path-normalization-test.js @@ -2,6 +2,7 @@ import { module, test } from 'qunit'; import { Model, hasMany, belongsTo, JSONAPISerializer } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; import promiseAjax from 'dummy/tests/helpers/promise-ajax'; +import { underscore } from 'ember-cli-mirage/utils/inflector'; module('Integration | Server | Regressions | 1322 Relationship Path Normalization Test', function(hooks) { hooks.beforeEach(function() { @@ -9,20 +10,20 @@ module('Integration | Server | Regressions | 1322 Relationship Path Normalizatio environment: 'test', models: { happyUser: Model.extend({ - happyLicenses: hasMany() + happyLicenses: hasMany(), + happyAvatar: belongsTo() }), happyLicense: Model.extend({ happyUser: belongsTo() + }), + happyAvatar: Model.extend({ + happyUser: belongsTo() }) }, serializers: { application: JSONAPISerializer.extend({ keyForRelationship(relationshipName) { - if (relationshipName === 'happyUser') { - return 'happy_user'; - } else { - return JSONAPISerializer.prototype.keyForRelationship.apply(this, arguments); - } + return underscore(relationshipName); } }) }, @@ -37,14 +38,15 @@ module('Integration | Server | Regressions | 1322 Relationship Path Normalizatio }); test('it works', async function(assert) { - let user1 = this.server.create('happy-user'); + let avatar1 = this.server.create('happy-avatar'); + let user1 = this.server.create('happy-user', { happyAvatar: avatar1 }); this.server.create('happy-license', { happyUser: user1 }); assert.expect(2); let response = await promiseAjax({ method: 'GET', - url: '/happy-licenses/1?include=happy_user' + url: '/happy-licenses/1?include=happy_user.happy_avatar' }); let json = response.data; @@ -65,6 +67,19 @@ module('Integration | Server | Regressions | 1322 Relationship Path Normalizatio { id: user1.id, type: 'happy-users', + attributes: {}, + relationships: { + 'happy_avatar': { + data: { + id: avatar1.id, + type: 'happy-avatars' + } + } + } + }, + { + id: avatar1.id, + type: 'happy-avatars', attributes: {} } ]); diff --git a/yarn.lock b/yarn.lock index 1f9629beb..be781d6f8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,14 +5,12 @@ "@babel/code-frame@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" - integrity sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g== dependencies: "@babel/highlight" "7.0.0-beta.44" "@babel/generator@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" - integrity sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ== dependencies: "@babel/types" "7.0.0-beta.44" jsesc "^2.5.1" @@ -23,7 +21,6 @@ "@babel/helper-function-name@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" - integrity sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg== dependencies: "@babel/helper-get-function-arity" "7.0.0-beta.44" "@babel/template" "7.0.0-beta.44" @@ -32,21 +29,18 @@ "@babel/helper-get-function-arity@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" - integrity sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw== dependencies: "@babel/types" "7.0.0-beta.44" "@babel/helper-split-export-declaration@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" - integrity sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA== dependencies: "@babel/types" "7.0.0-beta.44" "@babel/highlight@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" - integrity sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ== dependencies: chalk "^2.0.0" esutils "^2.0.2" @@ -55,7 +49,6 @@ "@babel/template@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" - integrity sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng== dependencies: "@babel/code-frame" "7.0.0-beta.44" "@babel/types" "7.0.0-beta.44" @@ -65,7 +58,6 @@ "@babel/traverse@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" - integrity sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA== dependencies: "@babel/code-frame" "7.0.0-beta.44" "@babel/generator" "7.0.0-beta.44" @@ -81,7 +73,6 @@ "@babel/types@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" - integrity sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ== dependencies: esutils "^2.0.2" lodash "^4.2.0" @@ -90,7 +81,6 @@ "@ember/test-helpers@^0.7.17": version "0.7.17" resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-0.7.17.tgz#17ff5f1d005d8b6331585e99013d66626a8d8068" - integrity sha512-pLz4FV8IGty+9CEGttEl6clLiQkap4w7T0So8lbCb4XO38OxGfjhfz8uKpI+UH6fgaTeboh8myixqOdfXvklfA== dependencies: broccoli-funnel "^2.0.1" ember-cli-babel "^6.10.0" @@ -99,39 +89,32 @@ "@glimmer/di@^0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@glimmer/di/-/di-0.2.0.tgz#73bfd4a6ee4148a80bf092e8a5d29bcac9d4ce7e" - integrity sha1-c7/Upu5BSKgL8JLopdKbysnUzn4= "@glimmer/resolver@^0.4.1": version "0.4.2" resolved "https://registry.yarnpkg.com/@glimmer/resolver/-/resolver-0.4.2.tgz#60c9b492e90bc3956ac82b3134649bd337e1651c" - integrity sha512-OYOSn2qKPMWRTrInu4W7Ilx2q4+mFfeKS8o8SCWdGN6q/9LnRUvN3vfiAEEfpgoMSvEr8TSGw6/b2WSLWoYAAA== dependencies: "@glimmer/di" "^0.2.0" "@xg-wang/whatwg-fetch@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@xg-wang/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#f7b222c012a238e7d6e89ed3d72a1e0edb58453d" - integrity sha512-ULtqA6L75RLzTNW68IiOja0XYv4Ebc3OGMzfia1xxSEMpD0mk/pMvkQX0vbCFyQmKc5xGp80Ms2WiSlXLh8hbA== abab@^1.0.3, abab@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" - integrity sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4= abab@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" - integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== accepts@1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" - integrity sha1-w8p0NJOGSMPg2cHjKN1otiLChMo= dependencies: mime-types "~2.1.11" negotiator "0.6.1" @@ -139,7 +122,6 @@ accepts@1.3.3: accepts@~1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" - integrity sha1-hiRnWMfdbSGmR0/whKR0DsBesh8= dependencies: mime-types "~2.1.16" negotiator "0.6.1" @@ -147,48 +129,40 @@ accepts@~1.3.4: acorn-globals@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" - integrity sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8= dependencies: acorn "^4.0.4" acorn-globals@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" - integrity sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ== dependencies: acorn "^5.0.0" acorn-jsx@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" - integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= dependencies: acorn "^3.0.4" acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= acorn@^4.0.4: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" - integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= acorn@^5.0.0, acorn@^5.5.3: version "5.7.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" - integrity sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ== acorn@^5.4.0: version "5.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.4.1.tgz#fdc58d9d17f4a4e98d102ded826a9b9759125102" - integrity sha512-XLmq3H/BVvW6/GbxKryGxWORz1ebilSsUDlyC27bXhWGWAZWkGwS6FLHjOlwFXNFoWFQEO/Df4u0YYd0K3BQgQ== active-model-adapter@^2.0.3: version "2.2.0" resolved "https://registry.yarnpkg.com/active-model-adapter/-/active-model-adapter-2.2.0.tgz#6885d6968574809f17f398c499b688a921c30f91" - integrity sha512-hflmeFKGiKXZtqPJ5pGbjUOCCIDWi2aFC7Q4htNi+FbLvI+8lBqjpDxiHgL82HmDF/CVVZGFQ2y0MROTxgC58g== dependencies: ember-cli-babel "^6.8.2" ember-inflector "^2.0.0" @@ -196,17 +170,14 @@ active-model-adapter@^2.0.3: after@0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/after/-/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" - integrity sha1-q11PuIP1loFtNRX495HAr0ht1ic= ajv-keywords@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" - integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= ajv@^4.9.1: version "4.11.8" resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - integrity sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY= dependencies: co "^4.6.0" json-stable-stringify "^1.0.1" @@ -214,7 +185,6 @@ ajv@^4.9.1: ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= dependencies: co "^4.6.0" fast-deep-equal "^1.0.0" @@ -224,7 +194,6 @@ ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: 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" - integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= dependencies: kind-of "^3.0.2" longest "^1.0.1" @@ -233,92 +202,76 @@ align-text@^0.1.1, align-text@^0.1.3: amd-name-resolver@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-0.0.5.tgz#76962dac876ed3311b05d29c6a58c14e1ef3304b" - integrity sha1-dpYtrIdu0zEbBdKcaljBTh7zMEs= dependencies: ensure-posix-path "^1.0.1" amd-name-resolver@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-0.0.7.tgz#814301adfe8a2f109f6e84d5e935196efb669615" - integrity sha1-gUMBrf6KLxCfboTV6TUZbvtmlhU= dependencies: ensure-posix-path "^1.0.1" amd-name-resolver@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.0.0.tgz#0e593b28d6fa3326ab1798107edaea961046e8d8" - integrity sha1-Dlk7KNb6MyarF5gQftrqlhBG6Ng= dependencies: ensure-posix-path "^1.0.1" amd-name-resolver@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.2.0.tgz#fc41b3848824b557313897d71f8d5a0184fbe679" - integrity sha512-hlSTWGS1t6/xq5YCed7YALg7tKZL3rkl7UwEZ/eCIkn8JxmM6fU6Qs/1hwtjQqfuYxlffuUcgYEm0f5xP4YKaA== dependencies: ensure-posix-path "^1.0.1" amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= ansi-escapes@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" - integrity sha1-06ioOzGapneTZisT52HHkRQiMG4= ansi-escapes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" - integrity sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ== ansi-regex@^0.2.0, ansi-regex@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" - integrity sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk= ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= ansi-styles@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" - integrity sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94= ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= ansi-styles@^3.0.0, ansi-styles@^3.1.0, ansi-styles@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" - integrity sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug== dependencies: color-convert "^1.9.0" ansicolors@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" - integrity sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8= any-promise@^1.0.0, any-promise@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= anymatch@^1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== dependencies: micromatch "^2.1.5" normalize-path "^2.0.0" @@ -326,19 +279,16 @@ anymatch@^1.3.0: aot-test-generators@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/aot-test-generators/-/aot-test-generators-0.1.0.tgz#43f0f615f97cb298d7919c1b0b4e6b7310b03cd0" - integrity sha1-Q/D2Ffl8spjXkZwbC05rcxCwPNA= dependencies: jsesc "^2.5.0" aproba@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== are-we-there-yet@~1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" - integrity sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0= dependencies: delegates "^1.0.0" readable-stream "^2.0.6" @@ -346,125 +296,102 @@ are-we-there-yet@~1.1.2: argparse@^1.0.7: version "1.0.9" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" - integrity sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY= dependencies: sprintf-js "~1.0.2" arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= dependencies: arr-flatten "^1.0.1" arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= array-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" - integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= array-to-error@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/array-to-error/-/array-to-error-1.1.1.tgz#d68812926d14097a205579a667eeaf1856a44c07" - integrity sha1-1ogSkm0UCXogVXmmZ+6vGFakTAc= dependencies: array-to-sentence "^1.1.0" array-to-sentence@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/array-to-sentence/-/array-to-sentence-1.1.0.tgz#c804956dafa53232495b205a9452753a258d39fc" - integrity sha1-yASVba+lMjJJWyBalFJ1OiWNOfw= array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= dependencies: array-uniq "^1.0.1" array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= arraybuffer.slice@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" - integrity sha1-8zshWfBTKj8xB6JywMz70a0peco= arrify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" - integrity sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y= assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= assert-plus@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" - integrity sha1-104bh+ev/A24qttwIfP+SBAasjQ= assertion-error@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= ast-types@0.9.6: version "0.9.6" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" - integrity sha1-ECyenpAF0+fjgpvwxPok7oYu6bk= async-disk-cache@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/async-disk-cache/-/async-disk-cache-1.3.3.tgz#6040486660b370e4051cd9fa9fee275e1fae3728" - integrity sha512-GyaWSbDAZCltxSobtj1m1ptXa0+zSdjWs3sM4IqnvhoRwMDHW5786sXQ1RiXbR3ZGuQe6NXMB4N0vUmW163cew== dependencies: debug "^2.1.3" heimdalljs "^0.2.3" @@ -477,17 +404,14 @@ async-disk-cache@^1.2.1: async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - integrity sha1-GdOGodntxufByF04iu28xW0zYC0= async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" - integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== async-promise-queue@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/async-promise-queue/-/async-promise-queue-1.0.4.tgz#308baafbc74aff66a0bb6e7f4a18d4fe8434440c" - integrity sha512-GQ5X3DT+TefYuFPHdvIPXFTlKnh39U7dwtl+aUBGeKjMea9nBpv3c91DXgeyBQmY07vQ97f3Sr9XHqkamEameQ== dependencies: async "^2.4.1" debug "^2.6.8" @@ -495,49 +419,40 @@ async-promise-queue@^1.0.3: async@^1.4.0, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= async@^2.4.1: version "2.6.0" resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" - integrity sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw== dependencies: lodash "^4.14.0" async@~0.2.9: version "0.2.10" resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" - integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= atob@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d" - integrity sha1-GcenYEc3dEaPILLS0DNyrX1Mv10= aws-sign2@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - integrity sha1-FDQt0428yU0OW4fXY81jYSwOeU8= aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.2.1, aws4@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" - integrity sha1-g+9cqGCysy5KDe7e6MdxudtXRx4= babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= dependencies: chalk "^1.1.3" esutils "^2.0.2" @@ -546,7 +461,6 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: babel-core@^6.14.0, babel-core@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" - integrity sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g= dependencies: babel-code-frame "^6.26.0" babel-generator "^6.26.0" @@ -571,7 +485,6 @@ babel-core@^6.14.0, babel-core@^6.26.0: babel-eslint@^8.2.6: version "8.2.6" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.6.tgz#6270d0c73205628067c0f7ae1693a9e797acefd9" - integrity sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA== dependencies: "@babel/code-frame" "7.0.0-beta.44" "@babel/traverse" "7.0.0-beta.44" @@ -583,7 +496,6 @@ babel-eslint@^8.2.6: babel-generator@^6.26.0: version "6.26.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== dependencies: babel-messages "^6.23.0" babel-runtime "^6.26.0" @@ -597,7 +509,6 @@ babel-generator@^6.26.0: babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= dependencies: babel-helper-explode-assignable-expression "^6.24.1" babel-runtime "^6.22.0" @@ -606,7 +517,6 @@ babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: babel-helper-call-delegate@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= dependencies: babel-helper-hoist-variables "^6.24.1" babel-runtime "^6.22.0" @@ -616,7 +526,6 @@ babel-helper-call-delegate@^6.24.1: babel-helper-define-map@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.26.0" @@ -626,7 +535,6 @@ babel-helper-define-map@^6.24.1: babel-helper-explode-assignable-expression@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= dependencies: babel-runtime "^6.22.0" babel-traverse "^6.24.1" @@ -635,7 +543,6 @@ babel-helper-explode-assignable-expression@^6.24.1: babel-helper-function-name@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= dependencies: babel-helper-get-function-arity "^6.24.1" babel-runtime "^6.22.0" @@ -646,7 +553,6 @@ babel-helper-function-name@^6.24.1: babel-helper-get-function-arity@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -654,7 +560,6 @@ babel-helper-get-function-arity@^6.24.1: babel-helper-hoist-variables@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -662,7 +567,6 @@ babel-helper-hoist-variables@^6.24.1: babel-helper-optimise-call-expression@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -670,7 +574,6 @@ babel-helper-optimise-call-expression@^6.24.1: babel-helper-regex@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= dependencies: babel-runtime "^6.26.0" babel-types "^6.26.0" @@ -679,7 +582,6 @@ babel-helper-regex@^6.24.1: babel-helper-remap-async-to-generator@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.22.0" @@ -690,7 +592,6 @@ babel-helper-remap-async-to-generator@^6.24.1: babel-helper-replace-supers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= dependencies: babel-helper-optimise-call-expression "^6.24.1" babel-messages "^6.23.0" @@ -702,7 +603,6 @@ babel-helper-replace-supers@^6.24.1: babel-helpers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= dependencies: babel-runtime "^6.22.0" babel-template "^6.24.1" @@ -710,79 +610,66 @@ babel-helpers@^6.24.1: babel-messages@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= dependencies: babel-runtime "^6.22.0" babel-plugin-check-es2015-constants@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= dependencies: babel-runtime "^6.22.0" babel-plugin-debug-macros@^0.1.10, babel-plugin-debug-macros@^0.1.11: version "0.1.11" resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.1.11.tgz#6c562bf561fccd406ce14ab04f42c218cf956605" - integrity sha512-hZw5qNNGAR02Y+yBUrtsnJHh8OXavkayPRqKGAXnIm4t5rWVpj3ArwsC7TWdpZsBguQvHAeyTxZ7s23yY60HHg== dependencies: semver "^5.3.0" babel-plugin-debug-macros@^0.2.0-beta.6: version "0.2.0-beta.6" resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.2.0-beta.6.tgz#ecdf6e408d5c863ab21740d7ad7f43f027d2f912" - integrity sha1-7N9uQI1chjqyF0DXrX9D8CfS+RI= dependencies: semver "^5.3.0" babel-plugin-ember-modules-api-polyfill@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.3.0.tgz#0c01f359658cfb9c797f705af6b09f6220205ae0" - integrity sha512-cv5ZimF5X52uW7Ul83UUxtsFZE6rZYkMv6qWnAeiDLT1/KtpVrTkJpwzDlvJ/FhKJZ43ih4GbFbhuhBKKT7vIw== dependencies: ember-rfc176-data "^0.3.0" babel-plugin-ember-modules-api-polyfill@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.3.2.tgz#56ea34bea963498d070a2b7dc2ce18a92c434093" - integrity sha512-mi9gaYasj2Bd6FYD1XCvuU1RL3n4DPn+VdOORyC2nqrvK50cLHkPaq/NdsqfxtZ0WNCIigrwnTHXU3XZI80tPg== dependencies: ember-rfc176-data "^0.3.0" babel-plugin-feature-flags@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/babel-plugin-feature-flags/-/babel-plugin-feature-flags-0.3.1.tgz#9c827cf9a4eb9a19f725ccb239e85cab02036fc1" - integrity sha1-nIJ8+aTrmhn3JcyyOehcqwIDb8E= babel-plugin-filter-imports@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-0.3.1.tgz#e7859b56886b175dd2616425d277b219e209ea8b" - integrity sha1-54WbVohrF13SYWQl0neyGeIJ6os= babel-plugin-htmlbars-inline-precompile@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.2.3.tgz#cd365e278af409bfa6be7704c4354beee742446b" - integrity sha1-zTZeJ4r0Cb+mvncExDVL7udCRGs= babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= babel-plugin-syntax-exponentiation-operator@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= babel-plugin-syntax-trailing-function-commas@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= babel-plugin-transform-async-to-generator@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= dependencies: babel-helper-remap-async-to-generator "^6.24.1" babel-plugin-syntax-async-functions "^6.8.0" @@ -791,21 +678,18 @@ babel-plugin-transform-async-to-generator@^6.22.0: babel-plugin-transform-es2015-arrow-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoping@^6.23.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= dependencies: babel-runtime "^6.26.0" babel-template "^6.26.0" @@ -816,7 +700,6 @@ babel-plugin-transform-es2015-block-scoping@^6.23.0: babel-plugin-transform-es2015-classes@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= dependencies: babel-helper-define-map "^6.24.1" babel-helper-function-name "^6.24.1" @@ -831,7 +714,6 @@ babel-plugin-transform-es2015-classes@^6.23.0: babel-plugin-transform-es2015-computed-properties@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= dependencies: babel-runtime "^6.22.0" babel-template "^6.24.1" @@ -839,14 +721,12 @@ babel-plugin-transform-es2015-computed-properties@^6.22.0: babel-plugin-transform-es2015-destructuring@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-duplicate-keys@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -854,14 +734,12 @@ babel-plugin-transform-es2015-duplicate-keys@^6.22.0: babel-plugin-transform-es2015-for-of@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-function-name@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.22.0" @@ -870,14 +748,12 @@ babel-plugin-transform-es2015-function-name@^6.22.0: babel-plugin-transform-es2015-literals@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= dependencies: babel-plugin-transform-es2015-modules-commonjs "^6.24.1" babel-runtime "^6.22.0" @@ -886,7 +762,6 @@ babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015 babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" - integrity sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo= dependencies: babel-plugin-transform-strict-mode "^6.24.1" babel-runtime "^6.26.0" @@ -896,7 +771,6 @@ babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-e babel-plugin-transform-es2015-modules-systemjs@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= dependencies: babel-helper-hoist-variables "^6.24.1" babel-runtime "^6.22.0" @@ -905,7 +779,6 @@ babel-plugin-transform-es2015-modules-systemjs@^6.23.0: babel-plugin-transform-es2015-modules-umd@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= dependencies: babel-plugin-transform-es2015-modules-amd "^6.24.1" babel-runtime "^6.22.0" @@ -914,7 +787,6 @@ babel-plugin-transform-es2015-modules-umd@^6.23.0: babel-plugin-transform-es2015-object-super@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= dependencies: babel-helper-replace-supers "^6.24.1" babel-runtime "^6.22.0" @@ -922,7 +794,6 @@ babel-plugin-transform-es2015-object-super@^6.22.0: babel-plugin-transform-es2015-parameters@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= dependencies: babel-helper-call-delegate "^6.24.1" babel-helper-get-function-arity "^6.24.1" @@ -934,7 +805,6 @@ babel-plugin-transform-es2015-parameters@^6.23.0: babel-plugin-transform-es2015-shorthand-properties@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -942,14 +812,12 @@ babel-plugin-transform-es2015-shorthand-properties@^6.22.0: babel-plugin-transform-es2015-spread@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-sticky-regex@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= dependencies: babel-helper-regex "^6.24.1" babel-runtime "^6.22.0" @@ -958,21 +826,18 @@ babel-plugin-transform-es2015-sticky-regex@^6.22.0: babel-plugin-transform-es2015-template-literals@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-typeof-symbol@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-unicode-regex@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= dependencies: babel-helper-regex "^6.24.1" babel-runtime "^6.22.0" @@ -981,7 +846,6 @@ babel-plugin-transform-es2015-unicode-regex@^6.22.0: babel-plugin-transform-exponentiation-operator@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= dependencies: babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" babel-plugin-syntax-exponentiation-operator "^6.8.0" @@ -990,14 +854,12 @@ babel-plugin-transform-exponentiation-operator@^6.22.0: babel-plugin-transform-regenerator@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= dependencies: regenerator-transform "^0.10.0" babel-plugin-transform-strict-mode@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -1005,7 +867,6 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-polyfill@^6.16.0, babel-polyfill@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" - integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= dependencies: babel-runtime "^6.26.0" core-js "^2.5.0" @@ -1014,7 +875,6 @@ babel-polyfill@^6.16.0, babel-polyfill@^6.26.0: babel-preset-env@^1.5.1: version "1.6.1" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" - integrity sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA== dependencies: babel-plugin-check-es2015-constants "^6.22.0" babel-plugin-syntax-trailing-function-commas "^6.22.0" @@ -1050,7 +910,6 @@ babel-preset-env@^1.5.1: babel-preset-env@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" - integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== dependencies: babel-plugin-check-es2015-constants "^6.22.0" babel-plugin-syntax-trailing-function-commas "^6.22.0" @@ -1086,7 +945,6 @@ babel-preset-env@^1.7.0: babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= dependencies: babel-core "^6.26.0" babel-runtime "^6.26.0" @@ -1099,7 +957,6 @@ babel-register@^6.26.0: babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= dependencies: core-js "^2.4.0" regenerator-runtime "^0.11.0" @@ -1107,7 +964,6 @@ babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: babel-template@^6.24.1, babel-template@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= dependencies: babel-runtime "^6.26.0" babel-traverse "^6.26.0" @@ -1118,7 +974,6 @@ babel-template@^6.24.1, babel-template@^6.26.0: babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= dependencies: babel-code-frame "^6.26.0" babel-messages "^6.23.0" @@ -1133,7 +988,6 @@ babel-traverse@^6.24.1, babel-traverse@^6.26.0: babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= dependencies: babel-runtime "^6.26.0" esutils "^2.0.2" @@ -1143,54 +997,44 @@ babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: babel6-plugin-strip-class-callcheck@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/babel6-plugin-strip-class-callcheck/-/babel6-plugin-strip-class-callcheck-6.0.0.tgz#de841c1abebbd39f78de0affb2c9a52ee228fddf" - integrity sha1-3oQcGr6705943gr/ssmlLuIo/d8= babel6-plugin-strip-heimdall@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/babel6-plugin-strip-heimdall/-/babel6-plugin-strip-heimdall-6.0.1.tgz#35f80eddec1f7fffdc009811dfbd46d9965072b6" - integrity sha1-NfgO3ewff//cAJgR371G2ZZQcrY= babylon@7.0.0-beta.44: version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" - integrity sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g== babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== backbone@^1.1.2: version "1.3.3" resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.3.3.tgz#4cc80ea7cb1631ac474889ce40f2f8bc683b2999" - integrity sha1-TMgOp8sWMaxHSInOQPL4vGg7KZk= dependencies: underscore ">=1.8.3" backo2@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" - integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= base64-arraybuffer@0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" - integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= base64id@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-0.1.0.tgz#02ce0fdeee0cef4f40080e1e73e834f0b1bfce3f" - integrity sha1-As4P3u4M709ACA4ec+g08LG/zj8= base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== dependencies: cache-base "^1.0.1" class-utils "^0.3.5" @@ -1203,60 +1047,50 @@ base@^0.11.1: basic-auth@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.0.tgz#015db3f353e02e56377755f962742e8981e7bbba" - integrity sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o= dependencies: safe-buffer "5.1.1" bcrypt-pbkdf@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" - integrity sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40= dependencies: tweetnacl "^0.14.3" better-assert@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" - integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= dependencies: callsite "1.0.0" binary-extensions@^1.0.0: version "1.11.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" - integrity sha1-RqoXUftqL5PuXmibsQh9SxTGwgU= "binaryextensions@1 || 2": version "2.1.1" resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.1.tgz#3209a51ca4a4ad541a3b8d3d6a6d5b83a2485935" - integrity sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA== blank-object@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/blank-object/-/blank-object-1.0.2.tgz#f990793fbe9a8c8dd013fb3219420bec81d5f4b9" - integrity sha1-+ZB5P76ajI3QE/syGUIL7IHV9Lk= blob@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" - integrity sha1-vPEwUspURj8w+fx+lbmkdjCpSSE= block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= dependencies: inherits "~2.0.0" bluebird@^3.1.1, bluebird@^3.4.6: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" - integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== body-parser@1.18.2: version "1.18.2" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" - integrity sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ= dependencies: bytes "3.0.0" content-type "~1.0.4" @@ -1272,7 +1106,6 @@ body-parser@1.18.2: body@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/body/-/body-5.1.0.tgz#e4ba0ce410a46936323367609ecb4e6553125069" - integrity sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk= dependencies: continuable-cache "^0.3.1" error "^7.0.0" @@ -1282,28 +1115,24 @@ body@^5.1.0: boom@2.x.x: version "2.10.1" resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - integrity sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8= dependencies: hoek "2.x.x" boom@4.x.x: version "4.3.1" resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" - integrity sha1-T4owBctKfjiJ90kDD9JbluAdLjE= dependencies: hoek "4.x.x" boom@5.x.x: version "5.2.0" resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" - integrity sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw== dependencies: hoek "4.x.x" bower-config@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/bower-config/-/bower-config-1.4.1.tgz#85fd9df367c2b8dbbd0caa4c5f2bad40cd84c2cc" - integrity sha1-hf2d82fCuNu9DKpMXyutQM2Ewsw= dependencies: graceful-fs "^4.1.3" mout "^1.0.0" @@ -1314,12 +1143,10 @@ bower-config@^1.3.0: bower-endpoint-parser@0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz#00b565adbfab6f2d35addde977e97962acbcb3f6" - integrity sha1-ALVlrb+rby01rd3pd+l5Yqy8s/Y= brace-expansion@^1.1.7: version "1.1.8" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" - integrity sha1-wHshHHyVLsH479Uad+8NHTmQopI= dependencies: balanced-match "^1.0.0" concat-map "0.0.1" @@ -1327,7 +1154,6 @@ brace-expansion@^1.1.7: braces@^1.8.2: version "1.8.5" resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= dependencies: expand-range "^1.8.1" preserve "^0.2.0" @@ -1336,7 +1162,6 @@ braces@^1.8.2: braces@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.0.tgz#a46941cb5fb492156b3d6a656e06c35364e3e66e" - integrity sha512-P4O8UQRdGiMLWSizsApmXVQDBS6KCt7dSexgLKBmH5Hr1CZq7vsnscFh8oR1sP1ab1Zj0uCHCEzZeV6SfUf3rA== dependencies: arr-flatten "^1.1.0" array-unique "^0.3.2" @@ -1353,7 +1178,6 @@ braces@^2.3.0: broccoli-asset-rev@^2.4.5: version "2.6.0" resolved "https://registry.yarnpkg.com/broccoli-asset-rev/-/broccoli-asset-rev-2.6.0.tgz#0633fc3a0b2ba0c2c1d56fa9feb7b331fc83be6d" - integrity sha1-BjP8OgsroMLB1W+p/rezMfyDvm0= dependencies: broccoli-asset-rewrite "^1.1.0" broccoli-filter "^1.2.2" @@ -1364,14 +1188,12 @@ broccoli-asset-rev@^2.4.5: broccoli-asset-rewrite@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-asset-rewrite/-/broccoli-asset-rewrite-1.1.0.tgz#77a5da56157aa318c59113245e8bafb4617f8830" - integrity sha1-d6XaVhV6oxjFkRMkXouvtGF/iDA= dependencies: broccoli-filter "^1.2.3" broccoli-babel-transpiler@^6.0.0, broccoli-babel-transpiler@^6.1.2: version "6.1.4" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.1.4.tgz#8be8074c42abf2e17ff79b2d2a21df5c51143c82" - integrity sha512-h63g7iOBWdxj0GuZw8kNsyaD1T9weKsY3I+gp3rOefozbHwUesJ43vzLy0jj3t/rbiP2czcJAlyHS48EcRil8Q== dependencies: babel-core "^6.14.0" broccoli-funnel "^1.0.0" @@ -1387,7 +1209,6 @@ broccoli-babel-transpiler@^6.0.0, broccoli-babel-transpiler@^6.1.2: broccoli-babel-transpiler@^6.4.5, broccoli-babel-transpiler@^6.5.0: version "6.5.0" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.5.0.tgz#aa501a227b298a99742fdd0309b1eaad7124bba0" - integrity sha512-c5OLGY40Sdmv6rP230Jt8yoK49BHfOw1LXiDMu9EC9k2U6sqlpNRK78SzvByQ8IzKtBYUfeWCxeZHcvW+gH7VQ== dependencies: babel-core "^6.26.0" broccoli-funnel "^2.0.1" @@ -1403,14 +1224,12 @@ broccoli-babel-transpiler@^6.4.5, broccoli-babel-transpiler@^6.5.0: broccoli-brocfile-loader@^0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/broccoli-brocfile-loader/-/broccoli-brocfile-loader-0.18.0.tgz#2e86021c805c34ffc8d29a2fb721cf273e819e4b" - integrity sha1-LoYCHIBcNP/I0povtyHPJz6Bnks= dependencies: findup-sync "^0.4.2" broccoli-builder@^0.18.8: version "0.18.11" resolved "https://registry.yarnpkg.com/broccoli-builder/-/broccoli-builder-0.18.11.tgz#a42393c7b10bb0380df255a616307945f5e26efb" - integrity sha512-4Qa3uTev+adLRTEv2zO1M5dXSFCgywo8bCMxJ8vmas8q+dAIstc1eKnnymJgpejyuEJQAjgdhO1zxMQCrt03Ew== dependencies: heimdalljs "^0.2.0" promise-map-series "^0.2.1" @@ -1422,7 +1241,6 @@ broccoli-builder@^0.18.8: broccoli-caching-writer@^2.2.0: version "2.3.1" resolved "https://registry.yarnpkg.com/broccoli-caching-writer/-/broccoli-caching-writer-2.3.1.tgz#b93cf58f9264f003075868db05774f4e7f25bd07" - integrity sha1-uTz1j5Jk8AMHWGjbBXdPTn8lvQc= dependencies: broccoli-kitchen-sink-helpers "^0.2.5" broccoli-plugin "1.1.0" @@ -1434,7 +1252,6 @@ broccoli-caching-writer@^2.2.0: broccoli-caching-writer@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/broccoli-caching-writer/-/broccoli-caching-writer-3.0.3.tgz#0bd2c96a9738d6a6ab590f07ba35c5157d7db476" - integrity sha1-C9LJapc41qarWQ8HujXFFX19tHY= dependencies: broccoli-kitchen-sink-helpers "^0.3.1" broccoli-plugin "^1.2.1" @@ -1446,7 +1263,6 @@ broccoli-caching-writer@^3.0.3: broccoli-clean-css@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-clean-css/-/broccoli-clean-css-1.1.0.tgz#9db143d9af7e0ae79c26e3ac5a9bb2d720ea19fa" - integrity sha1-nbFD2a9+CuecJuOsWpuy1yDqGfo= dependencies: broccoli-persistent-filter "^1.1.6" clean-css-promise "^0.1.0" @@ -1456,7 +1272,6 @@ broccoli-clean-css@^1.1.0: broccoli-concat@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.2.2.tgz#86ffdc52606eb590ba9f6b894c5ec7a016f5b7b9" - integrity sha1-hv/cUmButZC6n2uJTF7HoBb1t7k= dependencies: broccoli-kitchen-sink-helpers "^0.3.1" broccoli-plugin "^1.3.0" @@ -1474,14 +1289,12 @@ broccoli-concat@^3.2.2: broccoli-config-loader@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/broccoli-config-loader/-/broccoli-config-loader-1.0.1.tgz#d10aaf8ebc0cb45c1da5baa82720e1d88d28c80a" - integrity sha512-MDKYQ50rxhn+g17DYdfzfEM9DjTuSGu42Db37A8TQHQe8geYEcUZ4SQqZRgzdAI3aRQNlA1yBHJfOeGmOjhLIg== dependencies: broccoli-caching-writer "^3.0.3" broccoli-config-replace@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/broccoli-config-replace/-/broccoli-config-replace-1.1.2.tgz#6ea879d92a5bad634d11329b51fc5f4aafda9c00" - integrity sha1-bqh52SpbrWNNETKbUfxfSq/anAA= dependencies: broccoli-kitchen-sink-helpers "^0.3.1" broccoli-plugin "^1.2.0" @@ -1491,7 +1304,6 @@ broccoli-config-replace@^1.1.2: broccoli-debug@^0.6.1, broccoli-debug@^0.6.2, broccoli-debug@^0.6.3, broccoli-debug@^0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.4.tgz#986eb3d2005e00e3bb91f9d0a10ab137210cd150" - integrity sha512-CixMUndBqTljCc26i6ubhBrGbAWXpWBsGJFce6ZOr76Tul2Ev1xxM0tmf7OjSzdYhkr5BrPd/CNbR9VMPi+NBg== dependencies: broccoli-plugin "^1.2.1" fs-tree-diff "^0.5.2" @@ -1503,7 +1315,6 @@ broccoli-debug@^0.6.1, broccoli-debug@^0.6.2, broccoli-debug@^0.6.3, broccoli-de broccoli-file-creator@^1.0.0, broccoli-file-creator@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/broccoli-file-creator/-/broccoli-file-creator-1.1.1.tgz#1b35b67d215abdfadd8d49eeb69493c39e6c3450" - integrity sha1-GzW2fSFavfrdjUnutpSTw55sNFA= dependencies: broccoli-kitchen-sink-helpers "~0.2.0" broccoli-plugin "^1.1.0" @@ -1515,7 +1326,6 @@ broccoli-file-creator@^1.0.0, broccoli-file-creator@^1.1.1: broccoli-filter@^1.2.2, broccoli-filter@^1.2.3: version "1.2.4" resolved "https://registry.yarnpkg.com/broccoli-filter/-/broccoli-filter-1.2.4.tgz#409afb94b9a3a6da9fac8134e91e205f40cc7330" - integrity sha1-QJr7lLmjptqfrIE06R4gX0DMczA= dependencies: broccoli-kitchen-sink-helpers "^0.3.1" broccoli-plugin "^1.0.0" @@ -1530,12 +1340,10 @@ broccoli-filter@^1.2.2, broccoli-filter@^1.2.3: broccoli-funnel-reducer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/broccoli-funnel-reducer/-/broccoli-funnel-reducer-1.0.0.tgz#11365b2a785aec9b17972a36df87eef24c5cc0ea" - integrity sha1-ETZbKnha7JsXlyo234fu8kxcwOo= broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.2, broccoli-funnel@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-1.2.0.tgz#cddc3afc5ff1685a8023488fff74ce6fb5a51296" - integrity sha1-zdw6/F/xaFqAI0iP/3TOb7WlEpY= dependencies: array-equal "^1.0.0" blank-object "^1.0.1" @@ -1555,7 +1363,6 @@ broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.2, broccoli broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-2.0.1.tgz#6823c73b675ef78fffa7ab800f083e768b51d449" - integrity sha512-C8Lnp9TVsSSiZMGEF16C0dCiNg2oJqUKwuZ1K4kVC6qRPG/2Cj/rtB5kRCC9qEbwqhX71bDbfHROx0L3J7zXQg== dependencies: array-equal "^1.0.0" blank-object "^1.0.1" @@ -1574,7 +1381,6 @@ broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1: broccoli-kitchen-sink-helpers@^0.2.5, broccoli-kitchen-sink-helpers@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz#a5e0986ed8d76fb5984b68c3f0450d3a96e36ecc" - integrity sha1-peCYbtjXb7WYS2jD8EUNOpbjbsw= dependencies: glob "^5.0.10" mkdirp "^0.5.1" @@ -1582,7 +1388,6 @@ broccoli-kitchen-sink-helpers@^0.2.5, broccoli-kitchen-sink-helpers@~0.2.0: broccoli-kitchen-sink-helpers@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.3.1.tgz#77c7c18194b9664163ec4fcee2793444926e0c06" - integrity sha1-d8fBgZS5ZkFj7E/O4nk0RJJuDAY= dependencies: glob "^5.0.10" mkdirp "^0.5.1" @@ -1590,7 +1395,6 @@ broccoli-kitchen-sink-helpers@^0.3.1: broccoli-lint-eslint@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/broccoli-lint-eslint/-/broccoli-lint-eslint-4.2.1.tgz#f780dc083a7357a9746a9cfa8f76feb092777477" - integrity sha512-Jvm06UvuMPa5gEH+9/Sb+QpoIodDAYzbyIUEqxniPCdA6JJooa91hQDCTJc32RUV46JNMcLhb3Dl55BdA8v5mw== dependencies: aot-test-generators "^0.1.0" broccoli-concat "^3.2.2" @@ -1603,7 +1407,6 @@ broccoli-lint-eslint@^4.2.1: broccoli-merge-trees@^1.0.0, broccoli-merge-trees@^1.1.0, broccoli-merge-trees@^1.1.1: version "1.2.4" resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-1.2.4.tgz#a001519bb5067f06589d91afa2942445a2d0fdb5" - integrity sha1-oAFRm7UGfwZYnZGvopQkRaLQ/bU= dependencies: broccoli-plugin "^1.3.0" can-symlink "^1.0.0" @@ -1617,7 +1420,6 @@ broccoli-merge-trees@^1.0.0, broccoli-merge-trees@^1.1.0, broccoli-merge-trees@^ broccoli-merge-trees@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-2.0.0.tgz#10aea46dd5cebcc8b8f7d5a54f0a84a4f0bb90b9" - integrity sha1-EK6kbdXOvMi499WlTwqEpPC7kLk= dependencies: broccoli-plugin "^1.3.0" merge-trees "^1.0.1" @@ -1625,7 +1427,6 @@ broccoli-merge-trees@^2.0.0: broccoli-middleware@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/broccoli-middleware/-/broccoli-middleware-1.0.0.tgz#92f4e1fb9a791ea986245a7077f35cc648dab097" - integrity sha1-kvTh+5p5HqmGJFpwd/NcxkjasJc= dependencies: handlebars "^4.0.4" mime "^1.2.11" @@ -1633,12 +1434,10 @@ broccoli-middleware@^1.0.0: broccoli-node-info@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-1.1.0.tgz#3aa2e31e07e5bdb516dd25214f7c45ba1c459412" - integrity sha1-OqLjHgflvbUW3SUhT3xFuhxFlBI= broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.4.0, broccoli-persistent-filter@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.3.tgz#3511bc52fc53740cda51621f58a28152d9911bc1" - integrity sha512-JwNLDvvXJlhUmr+CHcbVhCyp33NbCIAITjQZmJY9e8QzANXh3jpFWlhSFvkWghwKA8rTAKcXkW12agtiZjxr4g== dependencies: async-disk-cache "^1.2.1" async-promise-queue "^1.0.3" @@ -1657,7 +1456,6 @@ broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-p broccoli-plugin@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.1.0.tgz#73e2cfa05f8ea1e3fc1420c40c3d9e7dc724bf02" - integrity sha1-c+LPoF+OoeP8FCDEDD2efcckvwI= dependencies: promise-map-series "^0.2.1" quick-temp "^0.1.3" @@ -1667,7 +1465,6 @@ broccoli-plugin@1.1.0: broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli-plugin@^1.2.1, broccoli-plugin@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.0.tgz#bee704a8e42da08cb58e513aaa436efb7f0ef1ee" - integrity sha1-vucEqOQtoIy1jlE6qkNu+38O8e4= dependencies: promise-map-series "^0.2.1" quick-temp "^0.1.3" @@ -1677,24 +1474,20 @@ broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli broccoli-slow-trees@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-2.0.0.tgz#9741afe992787add64aec7f7c8211dfcc058278d" - integrity sha1-l0Gv6ZJ4et1krsf3yCEd/MBYJ40= broccoli-slow-trees@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-3.0.1.tgz#9bf2a9e2f8eb3ed3a3f2abdde988da437ccdc9b4" - integrity sha1-m/Kp4vjrPtOj8qvd6YjaQ3zNybQ= dependencies: heimdalljs "^0.2.1" broccoli-source@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-source/-/broccoli-source-1.1.0.tgz#54f0e82c8b73f46580cbbc4f578f0b32fca8f809" - integrity sha1-VPDoLItz9GWAy7xPV48LMvyo+Ak= broccoli-sri-hash@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/broccoli-sri-hash/-/broccoli-sri-hash-2.1.2.tgz#bc69905ed7a381ad325cc0d02ded071328ebf3f3" - integrity sha1-vGmQXtejga0yXMDQLe0HEyjr8/M= dependencies: broccoli-caching-writer "^2.2.0" mkdirp "^0.5.1" @@ -1705,7 +1498,6 @@ broccoli-sri-hash@^2.1.0: broccoli-stew@^1.2.0, broccoli-stew@^1.3.3, broccoli-stew@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-1.5.0.tgz#d7af8c18511dce510e49d308a62e5977f461883c" - integrity sha1-16+MGFEdzlEOSdMIpi5Zd/RhiDw= dependencies: broccoli-debug "^0.6.1" broccoli-funnel "^1.0.1" @@ -1725,7 +1517,6 @@ broccoli-stew@^1.2.0, broccoli-stew@^1.3.3, broccoli-stew@^1.5.0: broccoli-string-replace@^0.1.1, broccoli-string-replace@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/broccoli-string-replace/-/broccoli-string-replace-0.1.2.tgz#1ed92f85680af8d503023925e754e4e33676b91f" - integrity sha1-HtkvhWgK+NUDAjkl51Tk4zZ2uR8= dependencies: broccoli-persistent-filter "^1.1.5" minimatch "^3.0.3" @@ -1733,7 +1524,6 @@ broccoli-string-replace@^0.1.1, broccoli-string-replace@^0.1.2: broccoli-test-helper@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/broccoli-test-helper/-/broccoli-test-helper-1.3.0.tgz#ba673418b3963b2cc466be66092a5928700c827f" - integrity sha512-IhFjcETHOSDAXY8afLLcihdXbAgcQ2b3lp9nZ5saYzoXJvt/1RMUlCm8JxKKPU7aHqpNXMVaj5lm4Is+4xh/qA== dependencies: broccoli "^1.1.0" fixturify "^0.3.2" @@ -1745,7 +1535,6 @@ broccoli-test-helper@^1.3.0: broccoli-uglify-sourcemap@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/broccoli-uglify-sourcemap/-/broccoli-uglify-sourcemap-2.0.2.tgz#f4a73112f1f56b46043e2e89cba5ce7762cddeb3" - integrity sha512-Fe+qUlPC4gHG7ojQOaRSRrCbrI2niYNAfrZqLkPEXHCi8UtwEqMHBAK6AZylN7ve/0CkGNSxKhCm7ELeeJRI+A== dependencies: broccoli-plugin "^1.2.1" debug "^3.1.0" @@ -1760,7 +1549,6 @@ broccoli-uglify-sourcemap@^2.0.0: broccoli-writer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/broccoli-writer/-/broccoli-writer-0.1.1.tgz#d4d71aa8f2afbc67a3866b91a2da79084b96ab2d" - integrity sha1-1NcaqPKvvGejhmuRotp5CEuWqy0= dependencies: quick-temp "^0.1.0" rsvp "^3.0.6" @@ -1768,7 +1556,6 @@ broccoli-writer@~0.1.1: broccoli@^1.1.0: version "1.1.4" resolved "https://registry.yarnpkg.com/broccoli/-/broccoli-1.1.4.tgz#b023b028b866f447ed14341007961efd03f7251c" - integrity sha1-sCOwKLhm9EftFDQQB5Ye/QP3JRw= dependencies: broccoli-node-info "1.1.0" broccoli-slow-trees "2.0.0" @@ -1789,17 +1576,14 @@ broccoli@^1.1.0: browser-process-hrtime@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" - integrity sha1-Ql1opY00R/AqBKqJQYf86K+Le44= browser-stdout@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" - integrity sha1-81HTKWnTL6XXpVZxVCY9korjvR8= browserslist@^2.1.2: version "2.11.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" - integrity sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA== dependencies: caniuse-lite "^1.0.30000792" electron-to-chromium "^1.3.30" @@ -1807,7 +1591,6 @@ browserslist@^2.1.2: browserslist@^3.2.6: version "3.2.8" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" - integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== dependencies: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" @@ -1815,39 +1598,32 @@ browserslist@^3.2.6: bser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" - integrity sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk= dependencies: node-int64 "^0.4.0" buffer-from@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" - integrity sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ== builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" - integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= bytes@1: version "1.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8" - integrity sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g= bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== dependencies: collection-visit "^1.0.0" component-emitter "^1.2.1" @@ -1862,31 +1638,26 @@ cache-base@^1.0.1: calculate-cache-key-for-tree@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-1.1.0.tgz#0c3e42c9c134f3c9de5358c0f16793627ea976d6" - integrity sha1-DD5CycE088neU1jA8WeTYn6pdtY= dependencies: json-stable-stringify "^1.0.1" caller-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= dependencies: callsites "^0.2.0" callsite@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" - integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= dependencies: camelcase "^2.0.0" map-obj "^1.0.0" @@ -1894,41 +1665,34 @@ camelcase-keys@^2.0.0: camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= can-symlink@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/can-symlink/-/can-symlink-1.0.0.tgz#97b607d8a84bb6c6e228b902d864ecb594b9d219" - integrity sha1-l7YH2KhLtsbiKLkC2GTstZS50hk= dependencies: tmp "0.0.28" caniuse-lite@^1.0.30000792: version "1.0.30000803" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000803.tgz#9939c37149d38d5f4540430490d240c03106a0f5" - integrity sha512-AoROHIFLv2iv5CG4nonOfT9ZCQ3JTN0GyEn8LG2sPb2Wc5cIyX/UwLYP0pnVajVF3LWH+mrO/DXBzmte0BK9cQ== caniuse-lite@^1.0.30000844: version "1.0.30000865" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25" - integrity sha512-vs79o1mOSKRGv/1pSkp4EXgl4ZviWeYReXw60XfacPU64uQWZwJT6vZNmxRF9O+6zu71sJwMxLK5JXxbzuVrLw== capture-exit@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" - integrity sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28= dependencies: rsvp "^3.3.3" cardinal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-1.0.0.tgz#50e21c1b0aa37729f9377def196b5a9cec932ee9" - integrity sha1-UOIcGwqjdyn5N33vGWtanOyTLuk= dependencies: ansicolors "~0.2.1" redeyed "~1.0.0" @@ -1936,12 +1700,10 @@ cardinal@^1.0.0: caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= center-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= dependencies: align-text "^0.1.3" lazy-cache "^1.0.3" @@ -1949,7 +1711,6 @@ center-align@^0.1.1: chai@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" - integrity sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw= dependencies: assertion-error "^1.0.1" check-error "^1.0.1" @@ -1961,7 +1722,6 @@ chai@^4.1.0: chalk@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" - integrity sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ= dependencies: ansi-styles "^1.1.0" escape-string-regexp "^1.0.0" @@ -1972,7 +1732,6 @@ chalk@^0.5.1: chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -1983,7 +1742,6 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" - integrity sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q== dependencies: ansi-styles "^3.1.0" escape-string-regexp "^1.0.5" @@ -1992,7 +1750,6 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: chalk@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796" - integrity sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g== dependencies: ansi-styles "^3.2.0" escape-string-regexp "^1.0.5" @@ -2001,24 +1758,20 @@ chalk@^2.3.0: chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" - integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= charm@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/charm/-/charm-1.0.2.tgz#8add367153a6d9a581331052c4090991da995e35" - integrity sha1-it02cVOm2aWBMxBSxAkJkdqZXjU= dependencies: inherits "^2.0.1" check-error@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= chokidar@1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= dependencies: anymatch "^1.3.0" async-each "^1.0.0" @@ -2034,12 +1787,10 @@ chokidar@1.7.0: circular-json@^0.3.1: version "0.3.3" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== dependencies: arr-union "^3.1.0" define-property "^0.2.5" @@ -2049,12 +1800,10 @@ class-utils@^0.3.5: clean-base-url@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clean-base-url/-/clean-base-url-1.0.0.tgz#c901cf0a20b972435b0eccd52d056824a4351b7b" - integrity sha1-yQHPCiC5ckNbDszVLQVoJKQ1G3s= clean-css-promise@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/clean-css-promise/-/clean-css-promise-0.1.1.tgz#43f3d2c8dfcb2bf071481252cd9b76433c08eecb" - integrity sha1-Q/PSyN/LK/BxSBJSzZt2QzwI7ss= dependencies: array-to-error "^1.0.0" clean-css "^3.4.5" @@ -2063,7 +1812,6 @@ clean-css-promise@^0.1.0: clean-css@^3.4.5: version "3.4.28" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.4.28.tgz#bf1945e82fc808f55695e6ddeaec01400efd03ff" - integrity sha1-vxlF6C/ICPVWlebd6uwBQA79A/8= dependencies: commander "2.8.x" source-map "0.4.x" @@ -2071,26 +1819,22 @@ clean-css@^3.4.5: cli-cursor@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" - integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc= dependencies: restore-cursor "^1.0.1" cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= dependencies: restore-cursor "^2.0.0" cli-spinners@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.1.0.tgz#f1847b168844d917a671eb9d147e3df497c90d06" - integrity sha1-8YR7FohE2RemceudFH499JfJDQY= cli-table2@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/cli-table2/-/cli-table2-0.2.0.tgz#2d1ef7f218a0e786e214540562d4bd177fe32d97" - integrity sha1-LR738hig54biFFQFYtS9F3/jLZc= dependencies: lodash "^3.10.1" string-width "^1.0.1" @@ -2100,19 +1844,16 @@ cli-table2@^0.2.0: cli-table@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" - integrity sha1-9TsFJmqLGguTSz0IIebi3FkUriM= dependencies: colors "1.0.3" cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= cliui@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= dependencies: center-align "^0.1.1" right-align "^0.1.1" @@ -2121,22 +1862,18 @@ cliui@^2.1.0: clone@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" - integrity sha1-0hfR6WERjjrJpLi7oyhVU79kfNs= co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= dependencies: map-visit "^1.0.0" object-visit "^1.0.0" @@ -2144,104 +1881,86 @@ collection-visit@^1.0.0: color-convert@^1.9.0: version "1.9.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" - integrity sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ== dependencies: color-name "^1.1.1" color-name@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= colors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" - integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= colors@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" - integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= combined-stream@^1.0.5, combined-stream@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" - integrity sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk= dependencies: delayed-stream "~1.0.0" commander@2.12.2: version "2.12.2" resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555" - integrity sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA== commander@2.8.x: version "2.8.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" - integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ= dependencies: graceful-readlink ">= 1.0.0" commander@2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" - integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q= dependencies: graceful-readlink ">= 1.0.0" commander@^2.5.0: version "2.16.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" - integrity sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew== commander@^2.6.0: version "2.14.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.0.tgz#7b25325963e6aace20d3a9285b09379b0c2208b5" - integrity sha512-okPpdvdJr6mUGi2XzupC+irQxzwGLVaBzacFC14hjLv8NColXEsxsU+QaeuSSXpQUak5g2K0vQ7WjA1e8svczg== commander@~2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" - integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== common-tags@^1.4.0: version "1.7.2" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.7.2.tgz#24d9768c63d253a56ecff93845b44b4df1d52771" - integrity sha512-joj9ZlUOjCrwdbmiLqafeUSgkUM74NqhLsZtSqDmhKudaIY197zTrb8JMl31fMnCUuxwFT23eC/oWvrZzDLRJQ== dependencies: babel-runtime "^6.26.0" component-bind@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" - integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= component-emitter@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" - integrity sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM= component-emitter@1.2.1, component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= component-inherit@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" - integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= compressible@~2.0.11: version "2.0.12" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.12.tgz#c59a5c99db76767e9876500e271ef63b3493bd66" - integrity sha1-xZpcmdt2dn6YdlAOJx72OzSTvWY= dependencies: mime-db ">= 1.30.0 < 2" compression@^1.4.4: version "1.7.1" resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.1.tgz#eff2603efc2e22cf86f35d2eb93589f9875373db" - integrity sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s= dependencies: accepts "~1.3.4" bytes "3.0.0" @@ -2254,12 +1973,10 @@ compression@^1.4.4: concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= concat-stream@^1.4.7, concat-stream@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" - integrity sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc= dependencies: inherits "^2.0.3" readable-stream "^2.2.2" @@ -2268,7 +1985,6 @@ concat-stream@^1.4.7, concat-stream@^1.6.0: configstore@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" - integrity sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw== dependencies: dot-prop "^4.1.0" graceful-fs "^4.1.2" @@ -2280,7 +1996,6 @@ configstore@^3.0.0: connect@^3.3.3: version "3.6.6" resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" - integrity sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ= dependencies: debug "2.6.9" finalhandler "1.1.0" @@ -2290,12 +2005,10 @@ connect@^3.3.3: console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= console-ui@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/console-ui/-/console-ui-2.1.0.tgz#e1d5279d27621a75123d7d594f9fa59f866ea3e3" - integrity sha512-/FqFHRwYVjjdeLd/1lhRsyoPCMtDMREJfPU6WCN9LMxPWu3++Cr2wN1uIZfbefVwr59is4UBd6Z2vaJRzTyPWQ== dependencies: chalk "^2.1.0" inquirer "^2" @@ -2307,88 +2020,72 @@ console-ui@^2.0.0: consolidate@^0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.14.5.tgz#5a25047bc76f73072667c8cb52c989888f494c63" - integrity sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM= dependencies: bluebird "^3.1.1" content-disposition@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" - integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= content-type-parser@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" - integrity sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ== content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== continuable-cache@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f" - integrity sha1-vXJ6f67XfnH/OYWskzUakSczrQ8= convert-source-map@^1.5.0, convert-source-map@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" - integrity sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU= cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= cookie@0.3.1, cookie@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" - integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= copy-dereference@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/copy-dereference/-/copy-dereference-1.0.0.tgz#6b131865420fd81b413ba994b44d3655311152b6" - integrity sha1-axMYZUIP2BtBO6mUtE02VTERUrY= copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js@^2.4.0, core-js@^2.5.0: version "2.5.3" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" - integrity sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4= core-object@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/core-object/-/core-object-1.1.0.tgz#86d63918733cf9da1a5aae729e62c0a88e66ad0a" - integrity sha1-htY5GHM8+doaWq5ynmLAqI5mrQo= core-object@^2.0.6: version "2.1.1" resolved "https://registry.yarnpkg.com/core-object/-/core-object-2.1.1.tgz#4b7a5f1edefcb1e6d0dcb58eab1b9f90bfc666a8" - integrity sha1-S3pfHt78sebQ3LWOqxufkL/GZqg= dependencies: chalk "^1.1.3" core-object@^3.1.3: version "3.1.5" resolved "https://registry.yarnpkg.com/core-object/-/core-object-3.1.5.tgz#fa627b87502adc98045e44678e9a8ec3b9c0d2a9" - integrity sha512-sA2/4+/PZ/KV6CKgjrVrrUVBKCkdDO02CUlQ0YKTQoYUwPYNOtOAcWlbYhd5v/1JqYaA6oZ4sDlOU4ppVw6Wbg== dependencies: chalk "^2.0.0" core-util-is@1.0.2, 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" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= cpr@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cpr/-/cpr-2.2.0.tgz#2dc6c87dfb78012489cdd994227628c320e9a17b" - integrity sha512-q8UoWzIT9rslJKb3Y5CcByzR2zX7GBkVcoU6jJx02d/BgbE7zJ8Aix74i7bw3iYk58TrgXhmB2XB0aGaBd7oZA== dependencies: graceful-fs "^4.1.5" minimist "^1.2.0" @@ -2398,7 +2095,6 @@ cpr@^2.0.0: cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= dependencies: lru-cache "^4.0.1" shebang-command "^1.2.0" @@ -2407,64 +2103,54 @@ cross-spawn@^5.0.1, cross-spawn@^5.1.0: cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - integrity sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g= dependencies: boom "2.x.x" cryptiles@3.x.x: version "3.1.2" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" - integrity sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4= dependencies: boom "5.x.x" crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": version "0.3.2" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" - integrity sha1-uANhcMefB6kP8vFuIihAJ6JDhIs= "cssstyle@>= 0.2.37 < 0.3.0": version "0.2.37" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" - integrity sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ= dependencies: cssom "0.3.x" cssstyle@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.0.0.tgz#79b16d51ec5591faec60e688891f15d2a5705129" - integrity sha512-Bpuh47j2mRMY60X90mXaJAEtJwxvA2roZzbgwAXYhMbmwmakdRr4Cq9L5SkleKJNLOKqHIa2YWyOXDX3VgggSQ== dependencies: cssom "0.3.x" currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= dependencies: array-find-index "^1.0.1" dag-map@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/dag-map/-/dag-map-2.0.2.tgz#9714b472de82a1843de2fba9b6876938cab44c68" - integrity sha1-lxS0ct6CoYQ94vuptodpOMq0TGg= dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= dependencies: assert-plus "^1.0.0" data-urls@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f" - integrity sha512-ai40PPQR0Fn1lD2PPie79CibnlMN2AYiDhwFX/rZHVsxbs5kNJSjegqXIprhouGXlRdEnfybva7kqRGnB6mypA== dependencies: abab "^1.0.4" whatwg-mimetype "^2.0.0" @@ -2473,83 +2159,70 @@ data-urls@^1.0.0: debug@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" - integrity sha1-+HBX6ZWxofauaklgZkE3vFbwOdo= dependencies: ms "0.7.1" debug@2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" - integrity sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w= dependencies: ms "0.7.2" debug@2.6.8: version "2.6.8" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" - integrity sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw= dependencies: ms "2.0.0" debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.4.0, debug@^2.6.8, debug@~2.6.7: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" debug@^3.0.0, debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" decamelize@^1.0.0, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= deep-eql@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== dependencies: type-detect "^4.0.0" deep-extend@~0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" - integrity sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8= deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= dependencies: is-descriptor "^1.0.0" del@^2.0.2: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= dependencies: globby "^5.0.0" is-path-cwd "^1.0.0" @@ -2562,121 +2235,100 @@ del@^2.0.2: delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= depd@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" - integrity sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k= depd@~1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= detect-file@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" - integrity sha1-STXe39lIhkjgBrASlWbpOGcR6mM= dependencies: fs-exists-sync "^0.1.0" detect-file@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= dependencies: repeating "^2.0.0" detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= diff@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" - integrity sha1-yc45Okt8vQsFinJck98pkCeGj/k= diff@^3.2.0: version "3.4.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" - integrity sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA== doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" domexception@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" - integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== dependencies: webidl-conversions "^4.0.2" dot-prop@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" - integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== dependencies: is-obj "^1.0.0" ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" - integrity sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU= dependencies: jsbn "~0.1.0" editions@^1.1.1: version "1.3.4" resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" - integrity sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg== ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= electron-to-chromium@^1.3.30: version "1.3.32" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.32.tgz#11d0684c0840e003c4be8928f8ac5f35dbc2b4e6" - integrity sha1-EdBoTAhA4APEvoko+KxfNdvCtOY= electron-to-chromium@^1.3.47: version "1.3.52" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0" - integrity sha1-0tnxJwuko7lnuDHEDvcftNmrXOA= ember-ajax@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-3.0.0.tgz#8f21e9da0c1d433cf879aa855fce464d517e9ab5" - integrity sha1-jyHp2gwdQzz4eaqFX85GTVF+mrU= dependencies: ember-cli-babel "^6.0.0" ember-cli-addon-tests@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/ember-cli-addon-tests/-/ember-cli-addon-tests-0.7.1.tgz#6959c4cce1a9d16a4852465e2b2bed4bf26b46ec" - integrity sha1-aVnEzOGp0WpIUkZeKyvtS/JrRuw= dependencies: chalk "^2.0.1" cpr "^2.0.0" @@ -2695,7 +2347,6 @@ ember-cli-addon-tests@^0.7.0: ember-cli-app-version@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-cli-app-version/-/ember-cli-app-version-2.1.0.tgz#149101d4fd0d97875e12ec5e61ff105f508e5e2d" - integrity sha1-FJEB1P0Nl4deEuxeYf8QX1COXi0= dependencies: ember-cli-babel "^6.8.0" git-repo-version "0.4.1" @@ -2703,7 +2354,6 @@ ember-cli-app-version@^2.0.0: ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2, ember-cli-babel@^6.9.0: version "6.11.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.11.0.tgz#79cb184bac3c05bfe181ddc306bac100ab1f9493" - integrity sha512-lHQyl30lbAsMmMq2it1GO85HKrqr2gMpK5CFxmOgTJ3moBqOGMKsdV3Z0qXWpgh8Asy7pB9AACMShdgfQvSGPg== dependencies: amd-name-resolver "0.0.7" babel-plugin-debug-macros "^0.1.11" @@ -2740,7 +2390,6 @@ ember-cli-babel@^6.6.0: ember-cli-babel@^6.7.2: version "6.16.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.16.0.tgz#623b4a2764ece72b65f1572fc8aeb5714a450228" - integrity sha512-rzWkVdKVk2KSbQ81TxmLli+LWdBEqF+FHE83rUQXVOV4FguJDtP1w2AW08f8QjuztbnQ5+VUGCb7H0dL8UwOVw== dependencies: amd-name-resolver "1.2.0" babel-plugin-debug-macros "^0.2.0-beta.6" @@ -2759,7 +2408,6 @@ ember-cli-babel@^6.7.2: ember-cli-broccoli-sane-watcher@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.0.4.tgz#f43f42f75b7509c212fb926cd9aea86ae19264c6" - integrity sha1-9D9C91t1CcIS+5Js2a6oauGSZMY= dependencies: broccoli-slow-trees "^3.0.1" heimdalljs "^0.2.1" @@ -2770,7 +2418,6 @@ ember-cli-broccoli-sane-watcher@^2.0.4: ember-cli-dependency-checker@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-2.1.0.tgz#9d66286a7c778e94733eaf21320d129c4fd0dd64" - integrity sha1-nWYoanx3jpRzPq8hMg0SnE/Q3WQ= dependencies: chalk "^1.1.3" is-git-url "^1.0.0" @@ -2780,7 +2427,6 @@ ember-cli-dependency-checker@^2.0.0: ember-cli-eslint@^4.2.1: version "4.2.3" resolved "https://registry.yarnpkg.com/ember-cli-eslint/-/ember-cli-eslint-4.2.3.tgz#2844d3f5e8184f19b2d7132ba99eb0b370b55598" - integrity sha512-1fqRz9QVLTT790Zr07aDFmAprZ1vVsaBGJOGQgDEFmBpogq8BeaQopaxogWFp748hol8nGC4QP5tbzhVD6KQHw== dependencies: broccoli-lint-eslint "^4.2.1" ember-cli-version-checker "^2.1.0" @@ -2790,7 +2436,6 @@ ember-cli-eslint@^4.2.1: ember-cli-fastboot@^1.1.4-beta.1: version "1.1.4-beta.1" resolved "https://registry.yarnpkg.com/ember-cli-fastboot/-/ember-cli-fastboot-1.1.4-beta.1.tgz#7063df36e62b92fd0f60c9a23dd03b5b57aec3fe" - integrity sha512-Jx9txTOGX0wgbg3d6N5oy2PSI9FI31tg4KiMY5vtXL3GuEi0S+HLCvh/w+INy+Ka3WLFcjutCdow23VL4gzDoQ== dependencies: broccoli-concat "^3.2.2" broccoli-funnel "^2.0.0" @@ -2812,17 +2457,14 @@ ember-cli-fastboot@^1.1.4-beta.1: ember-cli-get-component-path-option@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-get-component-path-option/-/ember-cli-get-component-path-option-1.0.0.tgz#0d7b595559e2f9050abed804f1d8eff1b08bc771" - integrity sha1-DXtZVVni+QUKvtgE8djv8bCLx3E= ember-cli-get-dependency-depth@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-get-dependency-depth/-/ember-cli-get-dependency-depth-1.0.0.tgz#e0afecf82a2d52f00f28ab468295281aec368d11" - integrity sha1-4K/s+CotUvAPKKtGgpUoGuw2jRE= ember-cli-htmlbars-inline-precompile@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-1.0.2.tgz#5b544f664d5d9911f08cd979c5f70d8cb0ca2add" - integrity sha1-W1RPZk1dmRHwjNl5xfcNjLDKKt0= dependencies: babel-plugin-htmlbars-inline-precompile "^0.2.3" ember-cli-version-checker "^2.0.0" @@ -2833,7 +2475,6 @@ ember-cli-htmlbars-inline-precompile@^1.0.0: ember-cli-htmlbars@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.3.tgz#e116e1500dba12f29c94b05b9ec90f52cb8bb042" - integrity sha512-oyWtJebOwxAqWZwMc0NKFJ8FJdxVixM7zl0FaXq1vTAG6bOgnU7yAhXEASlaO5f+PptZueZfOpdpvRwZW/Gk1A== dependencies: broccoli-persistent-filter "^1.0.3" hash-for-dep "^1.0.2" @@ -2843,17 +2484,14 @@ ember-cli-htmlbars@^2.0.1: ember-cli-inject-live-reload@^1.4.1: version "1.7.0" resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-1.7.0.tgz#af94336e015336127dfb98080ad442bb233e37ed" - integrity sha512-+0zOwJlf4iR5NcvyeU7E7xU1qDfniP/+mXfNTfAEhHO2eE9sjQvasKV84O1sIIyLk2LMIjFPbGt7uv5fQcIGwg== ember-cli-is-package-missing@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-is-package-missing/-/ember-cli-is-package-missing-1.0.0.tgz#6e6184cafb92635dd93ca6c946b104292d4e3390" - integrity sha1-bmGEyvuSY13ZPKbJRrEEKS1OM5A= ember-cli-legacy-blueprints@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/ember-cli-legacy-blueprints/-/ember-cli-legacy-blueprints-0.2.1.tgz#480f37cb83f1eda2d46bbc7d07c59ea2e8ce9b84" - integrity sha1-SA83y4Px7aLUa7x9B8WeoujOm4Q= dependencies: chalk "^2.3.0" ember-cli-get-component-path-option "^1.0.0" @@ -2876,17 +2514,14 @@ ember-cli-legacy-blueprints@^0.2.0: ember-cli-lodash-subset@2.0.1, ember-cli-lodash-subset@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-2.0.1.tgz#20cb68a790fe0fde2488ddfd8efbb7df6fe766f2" - integrity sha1-IMtop5D+D94kiN39jvu332/nZvI= ember-cli-lodash-subset@^1.0.7: version "1.0.12" resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-1.0.12.tgz#af2e77eba5dcb0d77f3308d3a6fd7d3450f6e537" - integrity sha1-ry5366XcsNd/MwjTpv19NFD25Tc= ember-cli-node-assets@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/ember-cli-node-assets/-/ember-cli-node-assets-0.2.2.tgz#d2d55626e7cc6619f882d7fe55751f9266022708" - integrity sha1-0tVWJufMZhn4gtf+VXUfkmYCJwg= dependencies: broccoli-funnel "^1.0.1" broccoli-merge-trees "^1.1.1" @@ -2898,19 +2533,16 @@ ember-cli-node-assets@^0.2.2: ember-cli-normalize-entity-name@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-normalize-entity-name/-/ember-cli-normalize-entity-name-1.0.0.tgz#0b14f7bcbc599aa117b5fddc81e4fd03c4bad5b7" - integrity sha1-CxT3vLxZmqEXtf3cgeT9A8S61bc= dependencies: silent-error "^1.0.0" ember-cli-path-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-path-utils/-/ember-cli-path-utils-1.0.0.tgz#4e39af8b55301cddc5017739b77a804fba2071ed" - integrity sha1-Tjmvi1UwHN3FAXc5t3qAT7ogce0= ember-cli-preprocess-registry@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/ember-cli-preprocess-registry/-/ember-cli-preprocess-registry-3.1.1.tgz#38456c21c4d2b64945850cf9ec68db6ba769288a" - integrity sha1-OEVsIcTStklFhQz57Gjba6dpKIo= dependencies: broccoli-clean-css "^1.1.0" broccoli-funnel "^1.0.0" @@ -2924,7 +2556,6 @@ ember-cli-preprocess-registry@^3.1.0: ember-cli-qunit@^4.1.1: version "4.3.1" resolved "https://registry.yarnpkg.com/ember-cli-qunit/-/ember-cli-qunit-4.3.1.tgz#fcbf3585392299b27de26e57d0cf9f9049a76181" - integrity sha1-/L81hTkimbJ94m5X0M+fkEmnYYE= dependencies: ember-cli-babel "^6.11.0" ember-qunit "^3.3.1" @@ -2932,7 +2563,6 @@ ember-cli-qunit@^4.1.1: ember-cli-release@^0.2.9: version "0.2.9" resolved "https://registry.yarnpkg.com/ember-cli-release/-/ember-cli-release-0.2.9.tgz#5e8de3d034c65597933748023058470ec1231adb" - integrity sha1-Xo3j0DTGVZeTN0gCMFhHDsEjGts= dependencies: chalk "^1.0.0" git-tools "^0.1.4" @@ -2947,7 +2577,6 @@ ember-cli-release@^0.2.9: ember-cli-shims@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/ember-cli-shims/-/ember-cli-shims-1.2.0.tgz#0f53aff0aab80b5f29da3a9731bac56169dd941f" - integrity sha1-D1Ov8Kq4C18p2jqXMbrFYWndlB8= dependencies: broccoli-file-creator "^1.1.1" broccoli-merge-trees "^2.0.0" @@ -2958,33 +2587,28 @@ ember-cli-shims@^1.2.0: ember-cli-sri@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ember-cli-sri/-/ember-cli-sri-2.1.1.tgz#971620934a4b9183cf7923cc03e178b83aa907fd" - integrity sha1-lxYgk0pLkYPPeSPMA+F4uDqpB/0= dependencies: broccoli-sri-hash "^2.1.0" ember-cli-string-utils@^1.0.0, ember-cli-string-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz#39b677fc2805f55173735376fcef278eaa4452a1" - integrity sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE= ember-cli-test-info@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-test-info/-/ember-cli-test-info-1.0.0.tgz#ed4e960f249e97523cf891e4aed2072ce84577b4" - integrity sha1-7U6WDySel1I8+JHkrtIHLOhFd7Q= dependencies: ember-cli-string-utils "^1.0.0" ember-cli-test-loader@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ember-cli-test-loader/-/ember-cli-test-loader-2.2.0.tgz#3fb8d5d1357e4460d3f0a092f5375e71b6f7c243" - integrity sha512-mlSXX9SciIRwGkFTX6XGyJYp4ry6oCFZRxh5jJ7VH8UXLTNx2ZACtDTwaWtNhYrWXgKyiDUvmD8enD56aePWRA== dependencies: ember-cli-babel "^6.8.1" ember-cli-uglify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ember-cli-uglify/-/ember-cli-uglify-2.0.0.tgz#b096727d7d1718acc9bfe5d1bc81ce26cafdf6ca" - integrity sha1-sJZyfX0XGKzJv+XRvIHOJsr99so= dependencies: broccoli-uglify-sourcemap "^2.0.0" lodash.defaultsdeep "^4.6.0" @@ -2992,21 +2616,18 @@ ember-cli-uglify@^2.0.0: ember-cli-valid-component-name@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-valid-component-name/-/ember-cli-valid-component-name-1.0.0.tgz#71550ce387e0233065f30b30b1510aa2dfbe87ef" - integrity sha1-cVUM44fgIzBl8wswsVEKot++h+8= dependencies: silent-error "^1.0.0" ember-cli-version-checker@^1.1.4: version "1.3.1" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz#0bc2d134c830142da64bf9627a0eded10b61ae72" - integrity sha1-C8LRNMgwFC2mS/lieg7e0QthrnI= dependencies: semver "^5.3.0" ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.1.0.tgz#fc79a56032f3717cf844ada7cbdec1a06fedb604" - integrity sha512-ssiNyVTp+PphroFum8guHX9py4xU1PCxkRYgb25NxumgjpKTPjhkgTfpRRKXlIQe+/wVMmhf+Uv6w9vSLZKWKQ== dependencies: resolve "^1.3.3" semver "^5.3.0" @@ -3014,7 +2635,6 @@ ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0: ember-cli-version-checker@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.1.2.tgz#305ce102390c66e4e0f1432dea9dc5c7c19fed98" - integrity sha512-sjkHGr4IGXnO3EUcY21380Xo9Qf6bC8HWH4D62bVnrQop/8uha5XgMQRoAflMCeH6suMrezQL287JUoYc2smEw== dependencies: resolve "^1.3.3" semver "^5.3.0" @@ -3022,7 +2642,6 @@ ember-cli-version-checker@^2.1.2: ember-cli@~2.18.2: version "2.18.2" resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-2.18.2.tgz#bb15313a15139a85248a86d203643f918ba40f57" - integrity sha1-uxUxOhUTmoUkiobSA2Q/kYukD1c= dependencies: amd-name-resolver "1.0.0" babel-plugin-transform-es2015-modules-amd "^6.24.0" @@ -3112,7 +2731,6 @@ ember-cli@~2.18.2: ember-data@~2.13.0: version "2.13.2" resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-2.13.2.tgz#151c93ad5152885d4ca50b1942d7c66e15865c74" - integrity sha1-FRyTrVFSiF1MpQsZQtfGbhWGXHQ= dependencies: amd-name-resolver "0.0.5" babel-plugin-feature-flags "^0.3.1" @@ -3141,19 +2759,16 @@ ember-data@~2.13.0: ember-disable-prototype-extensions@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/ember-disable-prototype-extensions/-/ember-disable-prototype-extensions-1.1.3.tgz#1969135217654b5e278f9fe2d9d4e49b5720329e" - integrity sha1-GWkTUhdlS14nj5/i2dTkm1cgMp4= ember-export-application-global@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ember-export-application-global/-/ember-export-application-global-2.0.0.tgz#8d6d7619ac8a1a3f8c43003549eb21ebed685bd2" - integrity sha1-jW12GayKGj+MQwA1Sesh6+1oW9I= dependencies: ember-cli-babel "^6.0.0-beta.7" ember-fastboot-addon-tests@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/ember-fastboot-addon-tests/-/ember-fastboot-addon-tests-0.4.0.tgz#05f89f2cc4bd53d6abd6d952bbdde7c8af03a6f7" - integrity sha1-BfifLMS9U9ar1tlSu93nyK8Dpvc= dependencies: chalk "^1.1.3" core-object "^2.0.6" @@ -3171,7 +2786,6 @@ ember-fastboot-addon-tests@^0.4.0: ember-get-config@^0.2.2: version "0.2.4" resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.2.4.tgz#118492a2a03d73e46004ed777928942021fe1ecd" - integrity sha1-EYSSoqA9c+RgBO13eSiUICH+Hs0= dependencies: broccoli-file-creator "^1.1.1" ember-cli-babel "^6.3.0" @@ -3179,11 +2793,10 @@ ember-get-config@^0.2.2: ember-inflector@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-2.1.0.tgz#afcb92d022a4eab58f08ff4578eafc3a1de2d09b" - integrity sha512-o7X+MdPuMgH6GGP8JsZ6mr+WYiCcymzjPLr0ct2IUw4lh1EwVtmePuY6fBLuWmyQE1nJq4smDyNoOCE74n3f7g== dependencies: ember-cli-babel "^6.0.0" -ember-inflector@^2.0.0||^3.0.0: +"ember-inflector@^2.0.0 || ^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-3.0.0.tgz#7e1ee8aaa0fa773ba0905d8b7c0786354d890ee1" dependencies: @@ -3192,14 +2805,12 @@ ember-inflector@^2.0.0||^3.0.0: ember-load-initializers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-1.0.0.tgz#4919eaf06f6dfeca7e134633d8c05a6c9921e6e7" - integrity sha1-SRnq8G9t/sp+E0Yz2MBabJkh5uc= dependencies: ember-cli-babel "^6.0.0-beta.7" ember-lodash@^4.17.3: version "4.18.0" resolved "https://registry.yarnpkg.com/ember-lodash/-/ember-lodash-4.18.0.tgz#45de700d6a4f68f1cd62888d90b50aa6477b9a83" - integrity sha1-Rd5wDWpPaPHNYoiNkLUKpkd7moM= dependencies: broccoli-debug "^0.6.1" broccoli-funnel "^2.0.1" @@ -3211,7 +2822,6 @@ ember-lodash@^4.17.3: ember-qunit@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-3.3.1.tgz#8d68ef30cfd6f2acbf1d0f4e368439642e726903" - integrity sha512-ZRQCDitCx4aLKKIvQEIfeFKHAWOkqwT4xg2E0fAbP4yptCJKPz/pCf0G0suW6YFpx7zI3qsbXKVZMeOGbqbmfw== dependencies: "@ember/test-helpers" "^0.7.17" broccoli-funnel "^2.0.1" @@ -3224,7 +2834,6 @@ ember-qunit@^3.3.1: ember-resolver@^4.0.0: version "4.5.0" resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-4.5.0.tgz#9248bf534dfc197fafe3118fff538d436078bf99" - integrity sha512-BX8yvFWIbrh1IVZmpIY/14WUb7nD8tQzT5s0aUG/Nwq2LVqD/uNAEPcsq0XS2gLvKawwDQEQN30ptcvJApQBhA== dependencies: "@glimmer/resolver" "^0.4.1" babel-plugin-debug-macros "^0.1.10" @@ -3237,24 +2846,20 @@ ember-resolver@^4.0.0: ember-rfc176-data@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.2.7.tgz#bd355bc9b473e08096b518784170a23388bc973b" - integrity sha512-pJE2w+sI22UDsYmudI4nCp3WcImpUzXwe9qHfpOcEu3yM/HD1nGpDRt6kZD0KUnDmqkLeik/nYyzEwN/NU6xxA== ember-rfc176-data@^0.3.0, ember-rfc176-data@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.1.tgz#6a5a4b8b82ec3af34f3010965fa96b936ca94519" - integrity sha512-u+W5rUvYO7xyKJjiPuCM7bIAvFyPwPTJ66fOZz1xuCv3AyReI9Oev5oOADOO6YJZk+vEn0xWiZ9N6zSf8WU7Fg== ember-router-generator@^1.0.0, ember-router-generator@^1.2.2, ember-router-generator@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-1.2.3.tgz#8ed2ca86ff323363120fc14278191e9e8f1315ee" - integrity sha1-jtLKhv8yM2MSD8FCeBkeno8TFe4= dependencies: recast "^0.11.3" ember-runtime-enumerable-includes-polyfill@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-runtime-enumerable-includes-polyfill/-/ember-runtime-enumerable-includes-polyfill-2.1.0.tgz#dc6d4a028471e4acc350dfd2a149874fb20913f5" - integrity sha512-au18iI8VbEDYn3jLFZzETnKN5ciPgCUxMRucEP3jkq7qZ6sE0FVKpWMPY/h9tTND3VOBJt6fgPpEBJoJVCUudg== dependencies: ember-cli-babel "^6.9.0" ember-cli-version-checker "^2.1.0" @@ -3262,7 +2867,6 @@ ember-runtime-enumerable-includes-polyfill@^2.0.0: ember-source@~2.18.0: version "2.18.1" resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-2.18.1.tgz#bc02fc809f9e9b68d63e790aa3fac16bc6242bd5" - integrity sha1-vAL8gJ+em2jWPnkKo/rBa8YkK9U= dependencies: broccoli-funnel "^2.0.1" broccoli-merge-trees "^2.0.0" @@ -3282,7 +2886,6 @@ ember-source@~2.18.0: ember-try-config@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ember-try-config/-/ember-try-config-2.2.0.tgz#6be0af6c71949813e02ac793564fddbf8336b807" - integrity sha1-a+CvbHGUmBPgKseTVk/dv4M2uAc= dependencies: lodash "^4.6.1" node-fetch "^1.3.3" @@ -3292,7 +2895,6 @@ ember-try-config@^2.2.0: ember-try@^0.2.15: version "0.2.23" resolved "https://registry.yarnpkg.com/ember-try/-/ember-try-0.2.23.tgz#39b57141b4907541d0ac8b503d211e6946b08718" - integrity sha512-kmVNsSFFafGinFhERMox3SXHoU+V1td1538SbhpslPtf7S2BZYr7JdAwOCIRoRtpcWeNdYgdQGzJZxNvUc8aLg== dependencies: chalk "^1.0.0" cli-table2 "^0.2.0" @@ -3310,19 +2912,16 @@ ember-try@^0.2.15: encodeurl@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= encoding@^0.1.11: version "0.1.12" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= dependencies: iconv-lite "~0.4.13" engine.io-client@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.0.tgz#7b730e4127414087596d9be3c88d2bc5fdb6cf5c" - integrity sha1-e3MOQSdBQIdZbZvjyI0rxf22z1w= dependencies: component-emitter "1.2.1" component-inherit "0.0.3" @@ -3340,7 +2939,6 @@ engine.io-client@1.8.0: engine.io-parser@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.1.tgz#9554f1ae33107d6fbd170ca5466d2f833f6a07cf" - integrity sha1-lVTxrjMQfW+9FwylRm0vgz9qB88= dependencies: after "0.8.1" arraybuffer.slice "0.0.6" @@ -3352,7 +2950,6 @@ engine.io-parser@1.3.1: engine.io@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.0.tgz#3eeb5f264cb75dbbec1baaea26d61f5a4eace2aa" - integrity sha1-PutfJky3XbvsG6rqJtYfWk6s4qo= dependencies: accepts "1.3.3" base64id "0.1.0" @@ -3364,24 +2961,20 @@ engine.io@1.8.0: ensure-posix-path@^1.0.0, ensure-posix-path@^1.0.1, ensure-posix-path@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.0.2.tgz#a65b3e42d0b71cfc585eb774f9943c8d9b91b0c2" - integrity sha1-pls+QtC3HPxYXrd0+ZQ8jZuRsMI= entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" - integrity sha1-blwtClYhtdra7O+AuQ7ftc13cvA= error-ex@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" - integrity sha1-+FWobOYa3E6GIcPNoh56dhLDqNw= dependencies: is-arrayish "^0.2.1" error@^7.0.0: version "7.0.2" resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02" - integrity sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI= dependencies: string-template "~0.2.1" xtend "~4.0.0" @@ -3389,17 +2982,14 @@ error@^7.0.0: escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= escape-string-regexp@1.0.5, escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escodegen@^1.6.1: version "1.9.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852" - integrity sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw== dependencies: esprima "^3.1.3" estraverse "^4.2.0" @@ -3411,7 +3001,6 @@ escodegen@^1.6.1: escodegen@^1.9.1: version "1.11.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" - integrity sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw== dependencies: esprima "^3.1.3" estraverse "^4.2.0" @@ -3423,14 +3012,12 @@ escodegen@^1.9.1: eslint-plugin-ember-suave@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-plugin-ember-suave/-/eslint-plugin-ember-suave-1.0.0.tgz#ea7d232a126562dcd8b1ee3aa2700ac3b626e514" - integrity sha1-6n0jKhJlYtzYse46onAKw7Ym5RQ= dependencies: requireindex "~1.1.0" eslint-plugin-ember@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-5.0.3.tgz#9f5e2048ab3ddc1548d4d17bf318cf1bb5cf37f1" - integrity sha512-wPq2N96YQR2/Ob2LfuLQV8BEotHXxiFcuBiHikN8P+2VGzxBeuydafXy/pExuTsU2RHfPiSgyBHavKGy1DYdrQ== dependencies: ember-rfc176-data "^0.2.7" require-folder-tree "^1.4.5" @@ -3439,7 +3026,6 @@ eslint-plugin-ember@^5.0.0: eslint-plugin-node@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-6.0.1.tgz#bf19642298064379315d7a4b2a75937376fa05e4" - integrity sha512-Q/Cc2sW1OAISDS+Ji6lZS2KV4b7ueA/WydVWd1BECTQwVvfQy5JAi3glhINoKzoMnfnuRgNP+ZWKrGAbp3QDxw== dependencies: ignore "^3.3.6" minimatch "^3.0.4" @@ -3449,7 +3035,6 @@ eslint-plugin-node@^6.0.1: eslint-scope@3.7.1, eslint-scope@^3.7.1: version "3.7.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" - integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug= dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" @@ -3457,12 +3042,10 @@ eslint-scope@3.7.1, eslint-scope@^3.7.1: eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" - integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== eslint@^4.0.0: version "4.17.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.17.0.tgz#dc24bb51ede48df629be7031c71d9dc0ee4f3ddf" - integrity sha512-AyxBUCANU/o/xC0ijGMKavo5Ls3oK6xykiOITlMdjFjrKOsqLrA7Nf5cnrDgcKrHzBirclAZt63XO7YZlVUPwA== dependencies: ajv "^5.3.0" babel-code-frame "^6.22.0" @@ -3505,7 +3088,6 @@ eslint@^4.0.0: espree@^3.5.2: version "3.5.3" resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.3.tgz#931e0af64e7fbbed26b050a29daad1fc64799fa6" - integrity sha512-Zy3tAJDORxQZLl2baguiRU1syPERAIg0L+JB2MWorORgTu/CplzvxS9WWA7Xh4+Q+eOQihNs/1o1Xep8cvCxWQ== dependencies: acorn "^5.4.0" acorn-jsx "^3.0.0" @@ -3513,29 +3095,24 @@ espree@^3.5.2: esprima@^3.1.3, esprima@~3.1.0: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= esprima@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" - integrity sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw== esprima@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.0.0.tgz#53cf247acda77313e551c3aa2e73342d3fb4f7d9" - integrity sha1-U88kes2ncxPlUcOqLnM0LT+099k= esquery@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" - integrity sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo= dependencies: estraverse "^4.0.0" esrecurse@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" - integrity sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM= dependencies: estraverse "^4.1.0" object-assign "^4.0.1" @@ -3543,32 +3120,26 @@ esrecurse@^4.1.0: estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= eventemitter3@1.x.x: version "1.2.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" - integrity sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg= events-to-array@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/events-to-array/-/events-to-array-1.1.2.tgz#2d41f563e1fe400ed4962fe1a4d5c6a7539df7f6" - integrity sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y= exec-file-sync@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/exec-file-sync/-/exec-file-sync-2.0.2.tgz#58d441db46e40de6d1f30de5be022785bd89e328" - integrity sha1-WNRB20bkDebR8w3lvgInhb2J4yg= dependencies: is-obj "^1.0.0" object-assign "^4.0.1" @@ -3577,14 +3148,12 @@ exec-file-sync@^2.0.0: exec-sh@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" - integrity sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg== dependencies: merge "^1.1.3" execa@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" - integrity sha1-2NdrvBtVIX7RkP1t1J08d07PyNo= dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" @@ -3597,7 +3166,6 @@ execa@^0.8.0: execa@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.9.0.tgz#adb7ce62cf985071f60580deb4a88b9e34712d01" - integrity sha512-BbUMBiX4hqiHZUA5+JujIjNb6TyAlp2D5KLheMjMluwOuzcnylDL4AxZYLLn1n2AGB49eSWwyKvvEQoRpnAtmA== dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" @@ -3610,39 +3178,32 @@ execa@^0.9.0: exists-stat@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/exists-stat/-/exists-stat-1.0.0.tgz#0660e3525a2e89d9e446129440c272edfa24b529" - integrity sha1-BmDjUlouidnkRhKUQMJy7foktSk= exists-sync@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.3.tgz#b910000bedbb113b378b82f5f5a7638107622dcf" - integrity sha1-uRAAC+27ETs3i4L19adjgQdiLc8= exists-sync@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.4.tgz#9744c2c428cc03b01060db454d4b12f0ef3c8879" - integrity sha1-l0TCxCjMA7AQYNtFTUsS8O88iHk= exit-hook@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" - integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g= exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= dependencies: is-posix-bracket "^0.1.0" expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= dependencies: debug "^2.3.3" define-property "^0.2.5" @@ -3655,28 +3216,24 @@ expand-brackets@^2.1.4: expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= dependencies: fill-range "^2.1.0" expand-tilde@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" - integrity sha1-C4HrqJflo9MdHD0QL48BRB5VlEk= dependencies: os-homedir "^1.0.1" expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= dependencies: homedir-polyfill "^1.0.1" express@^4.10.7, express@^4.12.3: version "4.16.2" resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" - integrity sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w= dependencies: accepts "~1.3.4" array-flatten "1.1.1" @@ -3712,14 +3269,12 @@ express@^4.10.7, express@^4.12.3: extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" @@ -3727,12 +3282,10 @@ extend-shallow@^3.0.0: extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" - integrity sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ= external-editor@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-1.1.1.tgz#12d7b0db850f7ff7e7081baf4005700060c4600b" - integrity sha1-Etew24UPf/fnCBuvQAVwAGDEYAs= dependencies: extend "^3.0.0" spawn-sync "^1.0.15" @@ -3741,7 +3294,6 @@ external-editor@^1.1.0: external-editor@^2.0.4: version "2.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" - integrity sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA== dependencies: chardet "^0.4.0" iconv-lite "^0.4.17" @@ -3750,14 +3302,12 @@ external-editor@^2.0.4: extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= dependencies: is-extglob "^1.0.0" extglob@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== dependencies: array-unique "^0.3.2" define-property "^1.0.0" @@ -3771,49 +3321,40 @@ extglob@^2.0.2: extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= extsprintf@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= fake-xml-http-request@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-2.0.0.tgz#41a92f0ca539477700cb1dafd2df251d55dac8ff" - integrity sha512-UjNnynb6eLAB0lyh2PlTEkjRJORnNsVF1hbzU+PQv89/cyBV9GDRCy7JAcLQgeCLYT+3kaumWWZKEJvbaK74eQ== faker@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/faker/-/faker-3.1.0.tgz#0f908faf4e6ec02524e54a57e432c5c013e08c9f" - integrity sha1-D5CPr05uwCUk5UpX5DLFwBPgjJ8= fast-deep-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" - integrity sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8= fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fast-ordered-set@^1.0.0, fast-ordered-set@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/fast-ordered-set/-/fast-ordered-set-1.0.3.tgz#3fbb36634f7be79e4f7edbdb4a357dee25d184eb" - integrity sha1-P7s2Y097555PftvbSjV97iXRhOs= dependencies: blank-object "^1.0.1" fast-sourcemap-concat@^1.0.1: version "1.2.3" resolved "https://registry.yarnpkg.com/fast-sourcemap-concat/-/fast-sourcemap-concat-1.2.3.tgz#22f14e92d739e37920334376ec8433bf675eaa04" - integrity sha1-IvFOktc543kgM0N27IQzv2deqgQ= dependencies: chalk "^0.5.1" fs-extra "^0.30.0" @@ -3828,7 +3369,6 @@ fast-sourcemap-concat@^1.0.1: fastboot-express-middleware@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/fastboot-express-middleware/-/fastboot-express-middleware-1.2.0.tgz#3f32fb21d8d01ad7c0c7d876b278601665ea17fa" - integrity sha1-PzL7IdjQGtfAx9h2snhgFmXqF/o= dependencies: chalk "^2.0.1" fastboot "^1.2.0" @@ -3837,7 +3377,6 @@ fastboot-express-middleware@^1.1.0: fastboot-transform@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/fastboot-transform/-/fastboot-transform-0.1.3.tgz#7dea0b117594afd8772baa6c9b0919644e7f7dcd" - integrity sha512-6otygPIJw1ARp1jJb+6KVO56iKBjhO+5x59RSC9qiZTbZRrv+HZAuP00KD3s+nWMvcFDemtdkugki9DNFTTwCQ== dependencies: broccoli-stew "^1.5.0" convert-source-map "^1.5.1" @@ -3845,7 +3384,6 @@ fastboot-transform@^0.1.2: fastboot@^1.1.4-beta.1, fastboot@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-1.2.0.tgz#35c5747db1943d082f2ba619226d16cd7281e946" - integrity sha1-NcV0fbGUPQgvK6YZIm0WzXKB6UY= dependencies: chalk "^2.0.1" cookie "^0.3.1" @@ -3859,28 +3397,24 @@ fastboot@^1.1.4-beta.1, fastboot@^1.2.0: faye-websocket@~0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" - integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= dependencies: websocket-driver ">=0.5.1" fb-watchman@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" - integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= dependencies: bser "^2.0.0" figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= dependencies: escape-string-regexp "^1.0.5" file-entry-cache@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" - integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= dependencies: flat-cache "^1.2.1" object-assign "^4.0.1" @@ -3888,17 +3422,14 @@ file-entry-cache@^2.0.0: filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= filesize@^3.1.3: version "3.6.0" resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.0.tgz#22d079615624bb6fd3c04026120628a41b3f4efa" - integrity sha512-g5OWtoZWcPI56js1DFhIEqyG9tnu/7sG3foHwgS9KGYFMfsYguI3E+PRVCmtmE96VajQIEMRU2OhN+ME589Gdw== fill-range@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" - integrity sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM= dependencies: is-number "^2.1.0" isobject "^2.0.0" @@ -3909,7 +3440,6 @@ fill-range@^2.1.0: fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" @@ -3919,7 +3449,6 @@ fill-range@^4.0.0: finalhandler@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" - integrity sha1-zgtoVbRYU+eRsvzGgARtiCU91/U= dependencies: debug "2.6.9" encodeurl "~1.0.1" @@ -3932,12 +3461,10 @@ finalhandler@1.1.0: find-index@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-index/-/find-index-1.1.0.tgz#53007c79cd30040d6816d79458e8837d5c5705ef" - integrity sha1-UwB8ec0wBA1oFteUWOiDfVxXBe8= find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= dependencies: path-exists "^2.0.0" pinkie-promise "^2.0.0" @@ -3945,14 +3472,12 @@ find-up@^1.0.0: find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= dependencies: locate-path "^2.0.0" findup-sync@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" - integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= dependencies: detect-file "^1.0.0" is-glob "^3.1.0" @@ -3962,7 +3487,6 @@ findup-sync@2.0.0: findup-sync@^0.4.2: version "0.4.3" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" - integrity sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI= dependencies: detect-file "^0.1.0" is-glob "^2.0.1" @@ -3972,7 +3496,6 @@ findup-sync@^0.4.2: findup-sync@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-1.0.0.tgz#6f7e4b57b6ee3a4037b4414eaedea3f58f71e0ec" - integrity sha1-b35LV7buOkA3tEFOrt6j9Y9x4Ow= dependencies: detect-file "^0.1.0" is-glob "^2.0.1" @@ -3982,7 +3505,6 @@ findup-sync@^1.0.0: fireworm@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/fireworm/-/fireworm-0.7.1.tgz#ccf20f7941f108883fcddb99383dbe6e1861c758" - integrity sha1-zPIPeUHxCIg/zduZOD2+bhhhx1g= dependencies: async "~0.2.9" is-type "0.0.1" @@ -3993,7 +3515,6 @@ fireworm@^0.7.0: fixturify@^0.3.2: version "0.3.4" resolved "https://registry.yarnpkg.com/fixturify/-/fixturify-0.3.4.tgz#c676de404a7f8ee8e64d0b76118e62ec95ab7b25" - integrity sha512-Gx+KSB25b6gMc4bf7UFRTA85uE0iZR+RYur0JHh6dg4AGBh0EksOv4FCHyM7XpGmiJO7Bc7oV7vxENQBT+2WEQ== dependencies: fs-extra "^0.30.0" matcher-collection "^1.0.4" @@ -4001,7 +3522,6 @@ fixturify@^0.3.2: flat-cache@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" - integrity sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE= dependencies: circular-json "^0.3.1" del "^2.0.2" @@ -4011,24 +3531,20 @@ flat-cache@^1.2.1: for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= for-own@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= dependencies: for-in "^1.0.1" forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= form-data@~2.1.1: version "2.1.4" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" - integrity sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE= dependencies: asynckit "^0.4.0" combined-stream "^1.0.5" @@ -4037,7 +3553,6 @@ form-data@~2.1.1: form-data@~2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" - integrity sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8= dependencies: asynckit "^0.4.0" combined-stream "^1.0.5" @@ -4046,29 +3561,24 @@ form-data@~2.3.1: forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= dependencies: map-cache "^0.2.2" fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= fs-exists-sync@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" - integrity sha1-mC1ok6+RjnLQjeyehnP/K1qNat0= fs-extra@^0.24.0: version "0.24.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.24.0.tgz#d4e4342a96675cb7846633a6099249332b539952" - integrity sha1-1OQ0KpZnXLeEZjOmCZJJMytTmVI= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -4078,7 +3588,6 @@ fs-extra@^0.24.0: fs-extra@^0.26.0: version "0.26.7" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" - integrity sha1-muH92UiXeY7at20JGM9C0MMYT6k= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -4089,7 +3598,6 @@ fs-extra@^0.26.0: fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -4100,7 +3608,6 @@ fs-extra@^0.30.0: fs-extra@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" - integrity sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -4109,7 +3616,6 @@ fs-extra@^1.0.0: fs-extra@^2.0.0: version "2.1.2" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz#046c70163cef9aad46b0e4a7fa467fb22d71de35" - integrity sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -4117,7 +3623,6 @@ fs-extra@^2.0.0: fs-extra@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" - integrity sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE= dependencies: graceful-fs "^4.1.2" jsonfile "^3.0.0" @@ -4126,7 +3631,6 @@ fs-extra@^3.0.0: fs-extra@^4.0.0, fs-extra@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" - integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" @@ -4135,7 +3639,6 @@ fs-extra@^4.0.0, fs-extra@^4.0.2: fs-promise@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/fs-promise/-/fs-promise-2.0.3.tgz#f64e4f854bcf689aa8bddcba268916db3db46854" - integrity sha1-9k5PhUvPaJqovdy6JokW2z20aFQ= dependencies: any-promise "^1.3.0" fs-extra "^2.0.0" @@ -4145,7 +3648,6 @@ fs-promise@^2.0.0: fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.7.tgz#315e2b098d5fe7f622880ac965b1b051868ac871" - integrity sha512-dJwDX6NBH7IfdfFjZAdHCZ6fIKc8LwR7kzqUhYRFJuX4g9ctG/7cuqJuwegGQsyLEykp6Z4krq+yIFMQlt7d9Q== dependencies: heimdalljs-logger "^0.1.7" object-assign "^4.1.0" @@ -4155,12 +3657,10 @@ fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5 fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.0.0, fsevents@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" - integrity sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q== dependencies: nan "^2.3.0" node-pre-gyp "^0.6.39" @@ -4168,7 +3668,6 @@ fsevents@^1.0.0, fsevents@^1.1.1: fstream-ignore@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" - integrity sha1-nDHa40dnAY/h0kmyTa2mfQktoQU= dependencies: fstream "^1.0.0" inherits "2" @@ -4177,7 +3676,6 @@ fstream-ignore@^1.0.5: fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: version "1.0.11" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" - integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE= dependencies: graceful-fs "^4.1.2" inherits "~2.0.0" @@ -4187,12 +3685,10 @@ fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -4206,63 +3702,52 @@ gauge@~2.7.3: get-caller-file@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" - integrity sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U= get-func-name@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= dependencies: assert-plus "^1.0.0" git-repo-info@^1.1.2, git-repo-info@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-1.4.1.tgz#2a072823254aaf62fcf0766007d7b6651bd41943" - integrity sha1-KgcoIyVKr2L88HZgB9e2ZRvUGUM= git-repo-info@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-1.2.0.tgz#43d8513e04a24dd441330a2f7c6655a709fdbaf2" - integrity sha1-Q9hRPgSiTdRBMwovfGZVpwn9uvI= git-repo-version@0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/git-repo-version/-/git-repo-version-0.4.1.tgz#75fab9a0a4ec8470755b0eea7fdaa6f9d41453bf" - integrity sha1-dfq5oKTshHB1Ww7qf9qm+dQUU78= dependencies: git-repo-info "~1.2.0" git-tools@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/git-tools/-/git-tools-0.1.4.tgz#5e43e59443b8a5dedb39dba663da49e79f943978" - integrity sha1-XkPllEO4pd7bOdumY9pJ55+UOXg= dependencies: spawnback "~1.0.0" glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= dependencies: glob-parent "^2.0.0" is-glob "^2.0.0" @@ -4270,14 +3755,12 @@ glob-base@^0.3.0: glob-parent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= dependencies: is-glob "^2.0.0" glob@7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" - integrity sha1-gFIR3wT6rxxjo2ADBs31reULLsg= dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -4289,7 +3772,6 @@ glob@7.1.1: glob@^5.0.10: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= dependencies: inflight "^1.0.4" inherits "2" @@ -4300,7 +3782,6 @@ glob@^5.0.10: glob@^7.0.3, glob@^7.0.4, glob@^7.0.5, glob@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -4312,7 +3793,6 @@ glob@^7.0.3, glob@^7.0.4, glob@^7.0.5, glob@^7.1.2: global-modules@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" - integrity sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0= dependencies: global-prefix "^0.1.4" is-windows "^0.2.0" @@ -4320,7 +3800,6 @@ global-modules@^0.2.3: global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== dependencies: global-prefix "^1.0.1" is-windows "^1.0.1" @@ -4329,7 +3808,6 @@ global-modules@^1.0.0: global-prefix@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" - integrity sha1-jTvGuNo8qBEqFg2NSW/wRiv+948= dependencies: homedir-polyfill "^1.0.0" ini "^1.3.4" @@ -4339,7 +3817,6 @@ global-prefix@^0.1.4: global-prefix@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= dependencies: expand-tilde "^2.0.2" homedir-polyfill "^1.0.1" @@ -4350,22 +3827,18 @@ global-prefix@^1.0.1: globals@^11.0.1: version "11.3.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.3.0.tgz#e04fdb7b9796d8adac9c8f64c14837b2313378b0" - integrity sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw== globals@^11.1.0: version "11.7.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" - integrity sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg== globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== globby@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0= dependencies: array-union "^1.0.1" arrify "^1.0.0" @@ -4377,27 +3850,22 @@ globby@^5.0.0: graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= "graceful-readlink@>= 1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" - integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= growl@1.9.2: version "1.9.2" resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" - integrity sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8= growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= handlebars@^4.0.4: version "4.0.11" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" - integrity sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw= dependencies: async "^1.4.0" optimist "^0.6.1" @@ -4408,17 +3876,14 @@ handlebars@^4.0.4: har-schema@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" - integrity sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4= har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= har-validator@~4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" - integrity sha1-M0gdDxu/9gDdID11gSpqX7oALio= dependencies: ajv "^4.9.1" har-schema "^1.0.5" @@ -4426,7 +3891,6 @@ har-validator@~4.2.1: har-validator@~5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" - integrity sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0= dependencies: ajv "^5.1.0" har-schema "^2.0.0" @@ -4434,60 +3898,50 @@ har-validator@~5.0.3: has-ansi@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" - integrity sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4= dependencies: ansi-regex "^0.2.0" has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= dependencies: ansi-regex "^2.0.0" has-binary@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.6.tgz#25326f39cfa4f616ad8787894e3af2cfbc7b6e10" - integrity sha1-JTJvOc+k9hath4eJTjryz7x7bhA= dependencies: isarray "0.0.1" has-binary@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" - integrity sha1-aOYesWIQyVRaClzOBqhzkS/h5ow= dependencies: isarray "0.0.1" has-cors@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" - integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= has-flag@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= dependencies: get-value "^2.0.3" has-values "^0.1.4" @@ -4496,7 +3950,6 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= dependencies: get-value "^2.0.6" has-values "^1.0.0" @@ -4505,12 +3958,10 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= dependencies: is-number "^3.0.0" kind-of "^4.0.0" @@ -4518,7 +3969,6 @@ has-values@^1.0.0: hash-for-dep@^1.0.2, hash-for-dep@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.2.3.tgz#5ec69fca32c23523972d52acb5bb65ffc3664cab" - integrity sha512-NE//rDaCFpWHViw30YM78OAGBShU+g4dnUGY3UWGyEzPOGYg/ptOjk32nEc+bC1xz+RfK5UIs6lOL6eQdrV4Ow== dependencies: broccoli-kitchen-sink-helpers "^0.3.1" heimdalljs "^0.2.3" @@ -4528,7 +3978,6 @@ hash-for-dep@^1.0.2, hash-for-dep@^1.2.3: hawk@3.1.3, hawk@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - integrity sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ= dependencies: boom "2.x.x" cryptiles "2.x.x" @@ -4538,7 +3987,6 @@ hawk@3.1.3, hawk@~3.1.3: hawk@~6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" - integrity sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ== dependencies: boom "4.x.x" cryptiles "3.x.x" @@ -4548,12 +3996,10 @@ hawk@~6.0.2: he@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" - integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= heimdalljs-fs-monitor@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/heimdalljs-fs-monitor/-/heimdalljs-fs-monitor-0.1.0.tgz#d404a65688c6714c485469ed3495da4853440272" - integrity sha1-1ASmVojGcUxIVGntNJXaSFNEAnI= dependencies: heimdalljs "^0.2.0" heimdalljs-logger "^0.1.7" @@ -4561,12 +4007,10 @@ heimdalljs-fs-monitor@^0.1.0: heimdalljs-graph@^0.3.1: version "0.3.4" resolved "https://registry.yarnpkg.com/heimdalljs-graph/-/heimdalljs-graph-0.3.4.tgz#0bd75797beeaa20b0ed59017aed3b2d95312acee" - integrity sha512-2DXgPIxdatgtBOjlh5qeVeHIGMTC2V9ujEvUhVJBVOVwqnU41g1OuGaRugLi6rvk0E+u1koYkfPeptybV8ZJ4g== heimdalljs-logger@^0.1.7: version "0.1.9" resolved "https://registry.yarnpkg.com/heimdalljs-logger/-/heimdalljs-logger-0.1.9.tgz#d76ada4e45b7bb6f786fc9c010a68eb2e2faf176" - integrity sha1-12raTkW3u294b8nAEKaOsuL68XY= dependencies: debug "^2.2.0" heimdalljs "^0.2.0" @@ -4574,31 +4018,26 @@ heimdalljs-logger@^0.1.7: heimdalljs@^0.2.0, heimdalljs@^0.2.1, heimdalljs@^0.2.3: version "0.2.5" resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.2.5.tgz#6aa54308eee793b642cff9cf94781445f37730ac" - integrity sha1-aqVDCO7nk7ZCz/nPlHgURfN3MKw= dependencies: rsvp "~3.2.1" heimdalljs@^0.3.0: version "0.3.3" resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.3.3.tgz#e92d2c6f77fd46d5bf50b610d28ad31755054d0b" - integrity sha1-6S0sb3f9RtW/ULYQ0orTF1UFTQs= dependencies: rsvp "~3.2.1" hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - integrity sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0= hoek@4.x.x: version "4.2.0" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" - integrity sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ== home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.1" @@ -4606,26 +4045,22 @@ home-or-tmp@^2.0.0: homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" - integrity sha1-TCu8inWJmP7r9e1oWA921GdotLw= dependencies: parse-passwd "^1.0.0" hosted-git-info@^2.1.4, hosted-git-info@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" - integrity sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg== html-encoding-sniffer@^1.0.1, html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== dependencies: whatwg-encoding "^1.0.1" http-errors@1.6.2, http-errors@~1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" - integrity sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY= dependencies: depd "1.1.1" inherits "2.0.3" @@ -4635,12 +4070,10 @@ http-errors@1.6.2, http-errors@~1.6.2: http-parser-js@>=0.4.0: version "0.4.10" resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" - integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= http-proxy@^1.13.1, http-proxy@^1.9.0: version "1.16.2" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" - integrity sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I= dependencies: eventemitter3 "1.x.x" requires-port "1.x.x" @@ -4648,7 +4081,6 @@ http-proxy@^1.13.1, http-proxy@^1.9.0: http-signature@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - integrity sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8= dependencies: assert-plus "^0.2.0" jsprim "^1.2.2" @@ -4657,7 +4089,6 @@ http-signature@~1.1.0: http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= dependencies: assert-plus "^1.0.0" jsprim "^1.2.2" @@ -4666,39 +4097,32 @@ http-signature@~1.2.0: iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@~0.4.13: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" - integrity sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ== ignore@^3.3.3, ignore@^3.3.6: version "3.3.7" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" - integrity sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA== imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= dependencies: repeating "^2.0.0" indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= inflection@^1.12.0, inflection@^1.7.0, inflection@^1.7.1, inflection@^1.8.0: version "1.12.0" resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" - integrity sha1-ogCTVlbW9fa8TcdQLhrstwMihBY= inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" @@ -4706,17 +4130,14 @@ inflight@^1.0.4: inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== inline-source-map-comment@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/inline-source-map-comment/-/inline-source-map-comment-1.0.5.tgz#50a8a44c2a790dfac441b5c94eccd5462635faf6" - integrity sha1-UKikTCp5DfrEQbXJTszVRiY1+vY= dependencies: chalk "^1.0.0" get-stdin "^4.0.1" @@ -4727,7 +4148,6 @@ inline-source-map-comment@^1.0.5: inquirer@^2: version "2.0.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-2.0.0.tgz#e1351687b90d150ca403ceaa3cefb1e3065bef4b" - integrity sha1-4TUWh7kNFQykA86qPO+x4wZb70s= dependencies: ansi-escapes "^1.1.0" chalk "^1.0.0" @@ -4747,7 +4167,6 @@ inquirer@^2: inquirer@^3.0.6: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" - integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== dependencies: ansi-escapes "^3.0.0" chalk "^2.0.0" @@ -4767,78 +4186,66 @@ inquirer@^3.0.6: invariant@^2.2.0: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" invariant@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" - integrity sha1-nh9WrArNtr8wMwbzOL47IErmA2A= dependencies: loose-envify "^1.0.0" ipaddr.js@1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" - integrity sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A= is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= dependencies: kind-of "^3.0.2" is-accessor-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== dependencies: kind-of "^6.0.0" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= dependencies: binary-extensions "^1.0.0" is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-builtin-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= dependencies: builtin-modules "^1.0.0" is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= dependencies: kind-of "^3.0.2" is-data-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== dependencies: kind-of "^6.0.0" is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== dependencies: is-accessor-descriptor "^0.1.6" is-data-descriptor "^0.1.4" @@ -4847,7 +4254,6 @@ is-descriptor@^0.1.0: is-descriptor@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== dependencies: is-accessor-descriptor "^1.0.0" is-data-descriptor "^1.0.0" @@ -4856,220 +4262,182 @@ is-descriptor@^1.0.0: is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= is-equal-shallow@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= dependencies: is-primitive "^2.0.0" is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= is-extendable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== dependencies: is-plain-object "^2.0.4" is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= is-extglob@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-finite@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= is-git-url@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-git-url/-/is-git-url-1.0.0.tgz#53f684cd143285b52c3244b4e6f28253527af66b" - integrity sha1-U/aEzRQyhbUsMkS05vKCU1J69ms= is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= dependencies: is-extglob "^1.0.0" is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= dependencies: is-extglob "^2.1.0" is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= dependencies: kind-of "^3.0.2" is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= is-odd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-1.0.0.tgz#3b8a932eb028b3775c39bb09e91767accdb69088" - integrity sha1-O4qTLrAos3dcObsJ6RdnrM22kIg= dependencies: is-number "^3.0.0" is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= is-path-in-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" - integrity sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw= dependencies: is-path-inside "^1.0.0" is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= dependencies: path-is-inside "^1.0.1" is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= is-type@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/is-type/-/is-type-0.0.1.tgz#f651d85c365d44955d14a51d8d7061f3f6b4779c" - integrity sha1-9lHYXDZdRJVdFKUdjXBh8/a0d5w= dependencies: core-util-is "~1.0.0" is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= is-windows@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" - integrity sha1-3hqm1j6indJIc3tp8f+LgALSEIw= is-windows@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.1.tgz#310db70f742d259a16a369202b51af84233310d9" - integrity sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk= isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isbinaryfile@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" - integrity sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE= isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= istextorbinary@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.1.0.tgz#dbed2a6f51be2f7475b68f89465811141b758874" - integrity sha1-2+0qb1G+L3R1to+JRlgRFBt1iHQ= dependencies: binaryextensions "1 || 2" editions "^1.1.1" @@ -5078,27 +4446,22 @@ istextorbinary@2.1.0: jquery-deferred@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/jquery-deferred/-/jquery-deferred-0.3.1.tgz#596eca1caaff54f61b110962b23cafea74c35355" - integrity sha1-WW7KHKr/VPYbEQlisjyv6nTDU1U= jquery@^3.1.0, jquery@^3.2.1: version "3.3.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" - integrity sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg== js-reporters@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/js-reporters/-/js-reporters-1.2.1.tgz#f88c608e324a3373a95bcc45ad305e5c979c459b" - integrity sha1-+IxgjjJKM3OpW8xFrTBeXJecRZs= js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.6.1, js-yaml@^3.9.1: version "3.10.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" - integrity sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -5106,12 +4469,10 @@ js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.6.1, js-yaml@^3.9.1: jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= jsdom@^11.12.0: version "11.12.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" - integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== dependencies: abab "^2.0.0" acorn "^5.5.3" @@ -5143,7 +4504,6 @@ jsdom@^11.12.0: jsdom@^9.5.0: version "9.12.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" - integrity sha1-6MVG//ywbADUgzyoRBD+1/igl9Q= dependencies: abab "^1.0.3" acorn "^4.0.4" @@ -5168,90 +4528,74 @@ jsdom@^9.5.0: jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= jsesc@^2.5.0, jsesc@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" - integrity sha1-5CGiqOINawgZ3yiQj3glJrlt0f4= jsesc@~0.3.x: version "0.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.3.0.tgz#1bf5ee63b4539fe2e26d0c1e99c240b97a457972" - integrity sha1-G/XuY7RTn+LibQwemcJAuXpFeXI= jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= dependencies: jsonify "~0.0.0" json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= json3@3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" - integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= optionalDependencies: graceful-fs "^4.1.6" jsonfile@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" - integrity sha1-pezG9l9T9mLEQVx2daAzHQmS7GY= optionalDependencies: graceful-fs "^4.1.6" jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= optionalDependencies: graceful-fs "^4.1.6" jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= dependencies: assert-plus "1.0.0" extsprintf "1.3.0" @@ -5261,50 +4605,42 @@ jsprim@^1.2.2: kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= dependencies: is-buffer "^1.1.5" kind-of@^5.0.0, kind-of@^5.0.2: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= optionalDependencies: graceful-fs "^4.1.9" lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= lazy-cache@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" - integrity sha1-uRkKT5EzVGlIQIWfio9whNiCImQ= dependencies: set-getter "^0.1.0" leek@0.0.24: version "0.0.24" resolved "https://registry.yarnpkg.com/leek/-/leek-0.0.24.tgz#e400e57f0e60d8ef2bd4d068dc428a54345dbcda" - integrity sha1-5ADlfw5g2O8r1NBo3EKKVDRdvNo= dependencies: debug "^2.1.0" lodash.assign "^3.2.0" @@ -5313,12 +4649,10 @@ leek@0.0.24: left-pad@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" - integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" @@ -5326,19 +4660,16 @@ levn@^0.3.0, levn@~0.3.0: linkify-it@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.0.3.tgz#d94a4648f9b1c179d64fa97291268bdb6ce9434f" - integrity sha1-2UpGSPmxwXnWT6lykSaL22zpQ08= dependencies: uc.micro "^1.0.1" livereload-js@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.3.0.tgz#c3ab22e8aaf5bf3505d80d098cbad67726548c9a" - integrity sha512-j1R0/FeGa64Y+NmqfZhyoVRzcFlOZ8sNlKzHjh4VvLULFACZhn68XrX5DFg2FhMvSMJmROuFxRSa560ECWKBMg== load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" @@ -5349,12 +4680,10 @@ load-json-file@^1.0.0: loader.js@^4.2.3: version "4.6.0" resolved "https://registry.yarnpkg.com/loader.js/-/loader.js-4.6.0.tgz#b965663ddbe2d80da482454cb865efe496e93e22" - integrity sha512-NjAnzMq/BM2VlXA9er0Nx1Runocgi+hEU53ENhCtTx82GX6/l9NXwfIqg81om6QvmhUlv2zH+4R+N+wOoeXytQ== locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= dependencies: p-locate "^2.0.0" path-exists "^3.0.0" @@ -5362,12 +4691,10 @@ locate-path@^2.0.0: lodash-es@^4.17.4: version "4.17.5" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.5.tgz#9fc6e737b1c4d151d8f9cae2247305d552ce748f" - integrity sha512-Ez3ONp3TK9gX1HYKp6IhetcVybD+2F+Yp6GS9dfH8ue6EOCEzQtQEh4K0FYWBP9qLv+lzeQAYXw+3ySfxyZqkw== lodash._baseassign@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" - integrity sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4= dependencies: lodash._basecopy "^3.0.0" lodash.keys "^3.0.0" @@ -5375,7 +4702,6 @@ lodash._baseassign@^3.0.0: lodash._basebind@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._basebind/-/lodash._basebind-2.3.0.tgz#2b5bc452a0e106143b21869f233bdb587417d248" - integrity sha1-K1vEUqDhBhQ7IYafIzvbWHQX0kg= dependencies: lodash._basecreate "~2.3.0" lodash._setbinddata "~2.3.0" @@ -5384,17 +4710,14 @@ lodash._basebind@~2.3.0: lodash._basecopy@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" - integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY= lodash._basecreate@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" - integrity sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE= lodash._basecreate@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-2.3.0.tgz#9b88a86a4dcff7b7f3c61d83a2fcfc0671ec9de0" - integrity sha1-m4ioak3P97fzxh2Dovz8BnHsneA= dependencies: lodash._renative "~2.3.0" lodash.isobject "~2.3.0" @@ -5403,7 +4726,6 @@ lodash._basecreate@~2.3.0: lodash._basecreatecallback@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._basecreatecallback/-/lodash._basecreatecallback-2.3.0.tgz#37b2ab17591a339e988db3259fcd46019d7ac362" - integrity sha1-N7KrF1kaM56YjbMln81GAZ16w2I= dependencies: lodash._setbinddata "~2.3.0" lodash.bind "~2.3.0" @@ -5413,7 +4735,6 @@ lodash._basecreatecallback@~2.3.0: lodash._basecreatewrapper@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.3.0.tgz#aa0c61ad96044c3933376131483a9759c3651247" - integrity sha1-qgxhrZYETDkzN2ExSDqXWcNlEkc= dependencies: lodash._basecreate "~2.3.0" lodash._setbinddata "~2.3.0" @@ -5423,7 +4744,6 @@ lodash._basecreatewrapper@~2.3.0: lodash._baseflatten@^3.0.0: version "3.1.4" resolved "https://registry.yarnpkg.com/lodash._baseflatten/-/lodash._baseflatten-3.1.4.tgz#0770ff80131af6e34f3b511796a7ba5214e65ff7" - integrity sha1-B3D/gBMa9uNPO1EXlqe6UhTmX/c= dependencies: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" @@ -5431,12 +4751,10 @@ lodash._baseflatten@^3.0.0: lodash._bindcallback@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" - integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4= lodash._createassigner@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" - integrity sha1-g4pbri/aymOsIt7o4Z+k5taXCxE= dependencies: lodash._bindcallback "^3.0.0" lodash._isiterateecall "^3.0.0" @@ -5445,7 +4763,6 @@ lodash._createassigner@^3.0.0: lodash._createwrapper@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._createwrapper/-/lodash._createwrapper-2.3.0.tgz#d1aae1102dadf440e8e06fc133a6edd7fe146075" - integrity sha1-0arhEC2t9EDo4G/BM6bt1/4UYHU= dependencies: lodash._basebind "~2.3.0" lodash._basecreatewrapper "~2.3.0" @@ -5454,54 +4771,44 @@ lodash._createwrapper@~2.3.0: lodash._escapehtmlchar@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.3.0.tgz#d03da6bd82eedf38dc0a5b503d740ecd0e894592" - integrity sha1-0D2mvYLu3zjcCltQPXQOzQ6JRZI= dependencies: lodash._htmlescapes "~2.3.0" lodash._escapestringchar@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.3.0.tgz#cce73ae60fc6da55d2bf8a0679c23ca2bab149fc" - integrity sha1-zOc65g/G2lXSv4oGecI8orqxSfw= lodash._getnative@^3.0.0: version "3.9.1" resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= lodash._htmlescapes@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.3.0.tgz#1ca98863cadf1fa1d82c84f35f31e40556a04f3a" - integrity sha1-HKmIY8rfH6HYLITzXzHkBVagTzo= lodash._isiterateecall@^3.0.0: version "3.0.9" resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" - integrity sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw= lodash._objecttypes@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.3.0.tgz#6a3ea3987dd6eeb8021b2d5c9c303549cc2bae1e" - integrity sha1-aj6jmH3W7rgCGy1cnDA1Scwrrh4= lodash._reinterpolate@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.3.0.tgz#03ee9d85c0e55cbd590d71608a295bdda51128ec" - integrity sha1-A+6dhcDlXL1ZDXFgiilb3aURKOw= lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= lodash._renative@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._renative/-/lodash._renative-2.3.0.tgz#77d8edd4ced26dd5971f9e15a5f772e4e317fbd3" - integrity sha1-d9jt1M7SbdWXH54Vpfdy5OMX+9M= lodash._reunescapedhtml@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.3.0.tgz#db920b55ac7f3ff825939aceb9ba2c231713d24d" - integrity sha1-25ILVax/P/glk5rOubosIxcT0k0= dependencies: lodash._htmlescapes "~2.3.0" lodash.keys "~2.3.0" @@ -5509,7 +4816,6 @@ lodash._reunescapedhtml@~2.3.0: lodash._setbinddata@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._setbinddata/-/lodash._setbinddata-2.3.0.tgz#e5610490acd13277d59858d95b5f2727f1508f04" - integrity sha1-5WEEkKzRMnfVmFjZW18nJ/FQjwQ= dependencies: lodash._renative "~2.3.0" lodash.noop "~2.3.0" @@ -5517,19 +4823,16 @@ lodash._setbinddata@~2.3.0: lodash._shimkeys@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.3.0.tgz#611f93149e3e6c721096b48769ef29537ada8ba9" - integrity sha1-YR+TFJ4+bHIQlrSHae8pU3rai6k= dependencies: lodash._objecttypes "~2.3.0" lodash._slice@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._slice/-/lodash._slice-2.3.0.tgz#147198132859972e4680ca29a5992c855669aa5c" - integrity sha1-FHGYEyhZly5GgMoppZkshVZpqlw= lodash.assign@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" - integrity sha1-POnwI0tLIiPilrj6CsH+6OvKZPo= dependencies: lodash._baseassign "^3.0.0" lodash._createassigner "^3.0.0" @@ -5538,12 +4841,10 @@ lodash.assign@^3.2.0: lodash.assignin@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" - integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI= lodash.bind@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-2.3.0.tgz#c2a8e18b68e5ecc152e2b168266116fea5b016cc" - integrity sha1-wqjhi2jl7MFS4rFoJmEW/qWwFsw= dependencies: lodash._createwrapper "~2.3.0" lodash._renative "~2.3.0" @@ -5552,17 +4853,14 @@ lodash.bind@~2.3.0: lodash.castarray@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" - integrity sha1-wCUTUV4wna3dTCTGDP3c9ZdtkRU= lodash.clonedeep@^4.4.1: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= lodash.create@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" - integrity sha1-1/KEnw29p+BGgruM1yqwIkYd6+c= dependencies: lodash._baseassign "^3.0.0" lodash._basecreate "^3.0.0" @@ -5571,14 +4869,12 @@ lodash.create@3.1.1: lodash.debounce@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-3.1.1.tgz#812211c378a94cc29d5aa4e3346cf0bfce3a7df5" - integrity sha1-gSIRw3ipTMKdWqTjNGzwv846ffU= dependencies: lodash._getnative "^3.0.0" lodash.defaults@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.3.0.tgz#a832b001f138f3bb9721c2819a2a7cc5ae21ed25" - integrity sha1-qDKwAfE487uXIcKBmip8xa4h7SU= dependencies: lodash._objecttypes "~2.3.0" lodash.keys "~2.3.0" @@ -5586,12 +4882,10 @@ lodash.defaults@~2.3.0: lodash.defaultsdeep@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.0.tgz#bec1024f85b1bd96cbea405b23c14ad6443a6f81" - integrity sha1-vsECT4WxvZbL6kBbI8FK1kQ6b4E= lodash.escape@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.3.0.tgz#844c38c58f844e1362ebe96726159b62cf5f2a58" - integrity sha1-hEw4xY+EThNi6+lnJhWbYs9fKlg= dependencies: lodash._escapehtmlchar "~2.3.0" lodash._reunescapedhtml "~2.3.0" @@ -5600,12 +4894,10 @@ lodash.escape@~2.3.0: lodash.find@^4.5.1: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" - integrity sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E= lodash.flatten@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-3.0.2.tgz#de1cf57758f8f4479319d35c3e9cc60c4501938c" - integrity sha1-3hz1d1j49EeTGdNcPpzGDEUBk4w= dependencies: lodash._baseflatten "^3.0.0" lodash._isiterateecall "^3.0.0" @@ -5613,7 +4905,6 @@ lodash.flatten@^3.0.2: lodash.foreach@~2.3.x: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-2.3.0.tgz#083404c91e846ee77245fdf9d76519c68b2af168" - integrity sha1-CDQEyR6EbudyRf3512UZxosq8Wg= dependencies: lodash._basecreatecallback "~2.3.0" lodash.forown "~2.3.0" @@ -5621,7 +4912,6 @@ lodash.foreach@~2.3.x: lodash.forown@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.forown/-/lodash.forown-2.3.0.tgz#24fb4aaf800d45fc2dc60bfec3ce04c836a3ad7f" - integrity sha1-JPtKr4ANRfwtxgv+w84EyDajrX8= dependencies: lodash._basecreatecallback "~2.3.0" lodash._objecttypes "~2.3.0" @@ -5630,34 +4920,28 @@ lodash.forown@~2.3.0: lodash.identity@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.identity/-/lodash.identity-2.3.0.tgz#6b01a210c9485355c2a913b48b6711219a173ded" - integrity sha1-awGiEMlIU1XCqRO0i2cRIZoXPe0= lodash.isarguments@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" - integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= lodash.isarray@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" - integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U= lodash.isfunction@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-2.3.0.tgz#6b2973e47a647cf12e70d676aea13643706e5267" - integrity sha1-aylz5HpkfPEucNZ2rqE2Q3BuUmc= lodash.isobject@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.3.0.tgz#2e16d3fc583da9831968953f2d8e6d73434f6799" - integrity sha1-LhbT/Fg9qYMZaJU/LY5tc0NPZ5k= dependencies: lodash._objecttypes "~2.3.0" lodash.keys@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" - integrity sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo= dependencies: lodash._getnative "^3.0.0" lodash.isarguments "^3.0.0" @@ -5666,7 +4950,6 @@ lodash.keys@^3.0.0: lodash.keys@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.3.0.tgz#b350f4f92caa9f45a4a2ecf018454cf2f28ae253" - integrity sha1-s1D0+Syqn0WkouzwGEVM8vKK4lM= dependencies: lodash._renative "~2.3.0" lodash._shimkeys "~2.3.0" @@ -5675,39 +4958,32 @@ lodash.keys@~2.3.0: lodash.merge@^4.3.0, lodash.merge@^4.4.0, lodash.merge@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" - integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== lodash.noop@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.noop/-/lodash.noop-2.3.0.tgz#3059d628d51bbf937cd2a0b6fc3a7f212a669c2c" - integrity sha1-MFnWKNUbv5N80qC2/Dp/ISpmnCw= lodash.omit@^4.1.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" - integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA= lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= lodash.support@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.support/-/lodash.support-2.3.0.tgz#7eaf038af4f0d6aab776b44aa6dcfc80334c9bfd" - integrity sha1-fq8DivTw1qq3drRKptz8gDNMm/0= dependencies: lodash._renative "~2.3.0" lodash.template@^4.2.5: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" - integrity sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A= dependencies: lodash._reinterpolate "~3.0.0" lodash.templatesettings "^4.0.0" @@ -5715,7 +4991,6 @@ lodash.template@^4.2.5: lodash.template@~2.3.x: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.3.0.tgz#4e3e29c433b4cfea675ec835e6f12391c61fd22b" - integrity sha1-Tj4pxDO0z+pnXsg15vEjkcYf0is= dependencies: lodash._escapestringchar "~2.3.0" lodash._reinterpolate "~2.3.0" @@ -5728,14 +5003,12 @@ lodash.template@~2.3.x: lodash.templatesettings@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" - integrity sha1-K01OlbpEDZFf8IvImeRVNmZxMxY= dependencies: lodash._reinterpolate "~3.0.0" lodash.templatesettings@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.3.0.tgz#303d132c342710040d5a18efaa2d572fd03f8cdc" - integrity sha1-MD0TLDQnEAQNWhjvqi1XL9A/jNw= dependencies: lodash._reinterpolate "~2.3.0" lodash.escape "~2.3.0" @@ -5743,68 +5016,56 @@ lodash.templatesettings@~2.3.0: lodash.uniq@^4.2.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= lodash.uniqby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" - integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI= lodash.values@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.3.0.tgz#ca96fbe60a20b0b0ec2ba2ba5fc6a765bd14a3ba" - integrity sha1-ypb75gogsLDsK6K6X8anZb0Uo7o= dependencies: lodash.keys "~2.3.0" lodash@3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.8.0.tgz#376eb98bdcd9382a9365c33c4cb8250de1325b91" - integrity sha1-N265i9zZOCqTZcM8TLglDeEyW5E= lodash@^3.10.1: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" - integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.6.1: version "4.17.5" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" - integrity sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw== lodash@^4.13.1, lodash@^4.2.0: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" - integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== lodash@^4.5.1: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== log-symbols@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== dependencies: chalk "^2.0.1" longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= loose-envify@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" - integrity sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg= dependencies: js-tokens "^3.0.0" loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= dependencies: currently-unhandled "^0.4.1" signal-exit "^3.0.0" @@ -5812,12 +5073,10 @@ loud-rejection@^1.0.0: lower-case@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" - integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= lru-cache@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" - integrity sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew== dependencies: pseudomap "^1.0.2" yallist "^2.1.2" @@ -5825,43 +5084,36 @@ lru-cache@^4.0.1: make-array@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/make-array/-/make-array-0.1.2.tgz#335e36ebb0c5a43154d21213a1ecaeae2a1bb3ef" - integrity sha1-M14267DFpDFU0hIToeyuriobs+8= make-dir@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51" - integrity sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA== dependencies: pify "^3.0.0" makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= dependencies: tmpl "1.0.x" map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= dependencies: object-visit "^1.0.0" markdown-it-terminal@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/markdown-it-terminal/-/markdown-it-terminal-0.1.0.tgz#545abd8dd01c3d62353bfcea71db580b51d22bd9" - integrity sha1-VFq9jdAcPWI1O/zqcdtYC1HSK9k= dependencies: ansi-styles "^3.0.0" cardinal "^1.0.0" @@ -5872,7 +5124,6 @@ markdown-it-terminal@0.1.0: markdown-it@^8.3.0, markdown-it@^8.3.1: version "8.4.0" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.0.tgz#e2400881bf171f7018ed1bd9da441dac8af6306d" - integrity sha512-tNuOCCfunY5v5uhcO2AUMArvKAyKMygX8tfup/JrgnsDqcCATQsAExBq7o5Ml9iMmO82bk6jYNLj6khcrl0JGA== dependencies: argparse "^1.0.7" entities "~1.1.1" @@ -5883,43 +5134,36 @@ markdown-it@^8.3.0, markdown-it@^8.3.1: matcher-collection@^1.0.0, matcher-collection@^1.0.4, matcher-collection@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.0.5.tgz#2ee095438372cb8884f058234138c05c644ec339" - integrity sha512-nUCmzKipcJEwYsBVAFh5P+d7JBuhJaW1xs85Hara9xuMLqtCVUrW6DSC0JVIkluxEH2W45nPBM/wjHtBXa/tYA== dependencies: minimatch "^3.0.2" md5-hex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-2.0.0.tgz#d0588e9f1c74954492ecd24ac0ac6ce997d92e33" - integrity sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM= dependencies: md5-o-matic "^0.1.1" md5-o-matic@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" - integrity sha1-givM1l4RfFFPqxdrJZRdVBAKA8M= mdurl@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= memory-streams@^0.1.0: version "0.1.3" resolved "https://registry.yarnpkg.com/memory-streams/-/memory-streams-0.1.3.tgz#d9b0017b4b87f1d92f55f2745c9caacb1dc93ceb" - integrity sha512-qVQ/CjkMyMInPaaRMrwWNDvf6boRZXaT/DbQeMYcCWuXPEBf1v8qChOc9OlEVQp2uOvRXa1Qu30fLmKhY6NipA== dependencies: readable-stream "~1.0.2" meow@^3.4.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= dependencies: camelcase-keys "^2.0.0" decamelize "^1.1.2" @@ -5935,12 +5179,10 @@ meow@^3.4.0: merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= merge-trees@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-trees/-/merge-trees-1.0.1.tgz#ccbe674569787f9def17fd46e6525f5700bbd23e" - integrity sha1-zL5nRWl4f53vF/1G5lJfVwC70j4= dependencies: can-symlink "^1.0.0" fs-tree-diff "^0.5.4" @@ -5952,17 +5194,14 @@ merge-trees@^1.0.1: merge@^1.1.3, merge@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" - integrity sha1-dTHjnUlJwoGma4xabgJl6LBYlNo= methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= micromatch@^2.1.5, micromatch@^2.3.7: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= dependencies: arr-diff "^2.0.0" array-unique "^0.2.1" @@ -5981,7 +5220,6 @@ micromatch@^2.1.5, micromatch@^2.3.7: micromatch@^3.0.4: version "3.1.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.5.tgz#d05e168c206472dfbca985bfef4f57797b4cd4ba" - integrity sha512-ykttrLPQrz1PUJcXjwsTUjGoPJ64StIGNE2lGVD1c9CuguJ+L7/navsE8IcDNndOoCMvYV0qc/exfVbMHkUhvA== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -6000,61 +5238,50 @@ micromatch@^3.0.4: "mime-db@>= 1.30.0 < 2": version "1.32.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.32.0.tgz#485b3848b01a3cda5f968b4882c0771e58e09414" - integrity sha512-+ZWo/xZN40Tt6S+HyakUxnSOgff+JEdaneLWIm0Z6LmpCn5DMcZntLyUY5c/rTDog28LhXLKOUZKoTxTCAdBVw== mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" - integrity sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE= mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7: version "2.1.17" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" - integrity sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo= dependencies: mime-db "~1.30.0" mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" - integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== mime@^1.2.11: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== "minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= mixin-deep@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.0.tgz#47a8732ba97799457c8c1eca28f95132d7e8150a" - integrity sha512-dgaCvoh6i1nosAUBKb0l0pfJ78K8+S9fluyIR2YvAeUD/QuMahnFnF3xYty5eYXMjhGSsB0DsW6A0uAZyetoAg== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" @@ -6062,19 +5289,16 @@ mixin-deep@^1.2.0: mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" mktemp@^0.4.0, mktemp@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/mktemp/-/mktemp-0.4.0.tgz#6d0515611c8a8c84e484aa2000129b98e981ff0b" - integrity sha1-bQUVYRyKjITkhKogABKbmOmB/ws= mocha@^3.0.2, mocha@^3.4.2: version "3.5.3" resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.5.3.tgz#1e0480fe36d2da5858d1eb6acc38418b26eaa20d" - integrity sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg== dependencies: browser-stdout "1.3.0" commander "2.9.0" @@ -6092,19 +5316,16 @@ mocha@^3.0.2, mocha@^3.4.2: moment-timezone@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.3.1.tgz#3ef47856b02d53b718a10a5ec2023aa299e07bf5" - integrity sha1-PvR4VrAtU7cYoQpewgI6opnge/U= dependencies: moment ">= 2.6.0" "moment@>= 2.6.0": version "2.20.1" resolved "https://registry.yarnpkg.com/moment/-/moment-2.20.1.tgz#d6eb1a46cbcc14a2b2f9434112c1ff8907f313fd" - integrity sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg== morgan@^1.8.1: version "1.9.0" resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.0.tgz#d01fa6c65859b76fcf31b3cb53a3821a311d8051" - integrity sha1-0B+mxlhZt2/PMbPLU6OCGjEdgFE= dependencies: basic-auth "~2.0.0" debug "2.6.9" @@ -6115,42 +5336,34 @@ morgan@^1.8.1: mout@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mout/-/mout-1.1.0.tgz#0b29d41e6a80fa9e2d4a5be9d602e1d9d02177f6" - integrity sha512-XsP0vf4As6BfqglxZqbqQ8SR6KQot2AgxvR0gG+WtUkf90vUXchMOZQtPf/Hml1rEffJupqL/tIrU6EYhsUQjw== ms@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" - integrity sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg= ms@0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" - integrity sha1-riXPJRKziFodldfwN4aNhDESR2U= ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= mustache@^2.2.1: version "2.3.0" resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.0.tgz#4028f7778b17708a489930a6e52ac3bca0da41d0" - integrity sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA= mute-stream@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" - integrity sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s= mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= mz@^2.6.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== dependencies: any-promise "^1.0.0" object-assign "^4.0.1" @@ -6159,7 +5372,6 @@ mz@^2.6.0: najax@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/najax/-/najax-1.0.3.tgz#11145f4d910446ea661d8ab7fcef53f6ad164ae5" - integrity sha1-ERRfTZEERupmHYq3/O9T9q0WSuU= dependencies: jquery-deferred "^0.3.0" lodash.defaultsdeep "^4.6.0" @@ -6168,12 +5380,10 @@ najax@^1.0.2: nan@^2.3.0: version "2.8.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" - integrity sha1-7XFfP+neArV6XmJS2QqWZ14fCFo= nanomatch@^1.2.5: version "1.2.7" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.7.tgz#53cd4aa109ff68b7f869591fdc9d10daeeea3e79" - integrity sha512-/5ldsnyurvEw7wNpxLFgjVvBLMta43niEYOy0CJ4ntcYSbx6bugRUTQeFb4BR/WanEL1o3aQgHuVLHQaB6tOqg== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -6190,24 +5400,20 @@ nanomatch@^1.2.5: natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" - integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= no-case@^2.2.0: version "2.3.2" resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" - integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== dependencies: lower-case "^1.1.1" node-fetch@^1.3.3: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== dependencies: encoding "^0.1.11" is-stream "^1.0.1" @@ -6215,17 +5421,14 @@ node-fetch@^1.3.3: node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= node-modules-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/node-modules-path/-/node-modules-path-1.0.1.tgz#40096b08ce7ad0ea14680863af449c7c75a5d1c8" - integrity sha1-QAlrCM560OoUaAhjr0ScfHWl0cg= node-notifier@^5.0.1: version "5.2.1" resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" - integrity sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg== dependencies: growly "^1.3.0" semver "^5.4.1" @@ -6235,7 +5438,6 @@ node-notifier@^5.0.1: node-pre-gyp@^0.6.39: version "0.6.39" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" - integrity sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ== dependencies: detect-libc "^1.0.2" hawk "3.1.3" @@ -6252,14 +5454,12 @@ node-pre-gyp@^0.6.39: nopt@^3.0.3, nopt@^3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= dependencies: abbrev "1" nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= dependencies: abbrev "1" osenv "^0.1.4" @@ -6267,7 +5467,6 @@ nopt@^4.0.1: normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" - integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== dependencies: hosted-git-info "^2.1.4" is-builtin-module "^1.0.0" @@ -6277,19 +5476,16 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: normalize-path@^2.0.0, normalize-path@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" npm-git-info@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/npm-git-info/-/npm-git-info-1.0.3.tgz#a933c42ec321e80d3646e0d6e844afe94630e1d5" - integrity sha1-qTPELsMh6A02RuDW6ESv6UYw4dU= npm-package-arg@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.0.0.tgz#8cce04b49d3f9faec3f56b0fe5f4391aeb9d2fac" - integrity sha512-hwC7g81KLgRmchv9ol6f3Fx4Yyc9ARX5X5niDHVILgpuvf08JRIgOZcEfpFXli3BgESoTrkauqorXm6UbvSgSg== dependencies: hosted-git-info "^2.5.0" osenv "^0.1.4" @@ -6299,14 +5495,12 @@ npm-package-arg@^6.0.0: npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= dependencies: path-key "^2.0.0" npmlog@^4.0.0, npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" @@ -6316,42 +5510,34 @@ npmlog@^4.0.0, npmlog@^4.0.2: number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= "nwmatcher@>= 1.3.9 < 2.0.0": version "1.4.3" resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c" - integrity sha512-IKdSTiDWCarf2JTS5e9e2+5tPZGdkRJ79XjYV0pzK8Q9BpsFyBq1RGKxzs7Q8UBushGw7m6TzVKz6fcY99iSWw== nwsapi@^2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.7.tgz#6fc54c254621f10cac5225b76e81c74120139b78" - integrity sha512-VZXniaaaORAXGCNsvUNefsKRQYk8zCzQZ57jalgrpHcU70OrAzKAiN/3plYtH/VPRmZeYyUzQiYfKzcMXC1g5Q== oauth-sign@~0.8.1, oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM= object-assign@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" - integrity sha1-ejs9DpgGPUP0wD8uiubNUahog6A= object-assign@4.1.1, object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object-component@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" - integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" @@ -6360,14 +5546,12 @@ object-copy@^0.1.0: object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= dependencies: isobject "^3.0.0" object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= dependencies: for-own "^0.1.4" is-extendable "^0.1.1" @@ -6375,45 +5559,38 @@ object.omit@^2.0.0: object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= dependencies: isobject "^3.0.1" on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= dependencies: ee-first "1.1.1" on-headers@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" - integrity sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c= once@^1.3.0, once@^1.3.3: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" onetime@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" - integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k= onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= dependencies: mimic-fn "^1.0.0" optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= dependencies: minimist "~0.0.1" wordwrap "~0.0.2" @@ -6421,7 +5598,6 @@ optimist@^0.6.1: optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= dependencies: deep-is "~0.1.3" fast-levenshtein "~2.0.4" @@ -6433,12 +5609,10 @@ optionator@^0.8.1, optionator@^0.8.2: options@>=0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" - integrity sha1-7CLTEoBrtT5zF3Pnza788cZDEo8= ora@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ora/-/ora-1.4.0.tgz#884458215b3a5d4097592285f93321bb7a79e2e5" - integrity sha512-iMK1DOQxzzh2MBlVsU42G80mnrvUhqsMh74phHtDlrcTZPK0pH6o7l7DRshK+0YsxDyEuaOkziVdvM3T0QTzpw== dependencies: chalk "^2.1.0" cli-cursor "^2.1.0" @@ -6448,22 +5622,18 @@ ora@^1.3.0: os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= os-shim@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" - integrity sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc= os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= osenv@^0.1.3, osenv@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" - integrity sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ= dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" @@ -6471,31 +5641,26 @@ osenv@^0.1.3, osenv@^0.1.4: p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= p-limit@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" - integrity sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng== dependencies: p-try "^1.0.0" p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= dependencies: p-limit "^1.1.0" p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= dependencies: glob-base "^0.3.0" is-dotfile "^1.0.0" @@ -6505,109 +5670,90 @@ parse-glob@^3.0.4: parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= dependencies: error-ex "^1.2.0" parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= parse5@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" - integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== parse5@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" - integrity sha1-m387DeMr543CQBsXVzzK8Pb1nZQ= parsejson@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab" - integrity sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs= dependencies: better-assert "~1.0.0" parseqs@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" - integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= dependencies: better-assert "~1.0.0" parseuri@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" - integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= dependencies: better-assert "~1.0.0" parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" - integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= passwd-user@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/passwd-user/-/passwd-user-1.2.1.tgz#a01a5dc639ef007dc56364b8178569080ad3a7b8" - integrity sha1-oBpdxjnvAH3FY2S4F4VpCArTp7g= dependencies: exec-file-sync "^2.0.0" path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= dependencies: pinkie-promise "^2.0.0" path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= path-key@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" - integrity sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME= path-posix@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/path-posix/-/path-posix-1.0.0.tgz#06b26113f56beab042545a23bfa88003ccac260f" - integrity sha1-BrJhE/Vr6rBCVFojv6iAA8ysJg8= path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= dependencies: graceful-fs "^4.1.2" pify "^2.0.0" @@ -6616,54 +5762,44 @@ path-type@^1.0.0: pathval@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" - integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" - integrity sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU= performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" - integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== portfinder@^1.0.7: version "1.0.13" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" - integrity sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek= dependencies: async "^1.5.2" debug "^2.2.0" @@ -6672,22 +5808,18 @@ portfinder@^1.0.7: posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= pretender@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/pretender/-/pretender-2.1.0.tgz#cd75bff9624e996bcfadbd7dbd023ca1f4f3033a" - integrity sha512-GG1ZtA2yjorrSf9x3DR4Pv5228s/H92itSnIAxRx2wsmz549BsuIuJN+jPJgj0p+tCJBfBlmVgJLFG6t64M+EA== dependencies: "@xg-wang/whatwg-fetch" "^3.0.0" fake-xml-http-request "^2.0.0" @@ -6696,41 +5828,34 @@ pretender@2.1.0: printf@^0.2.3: version "0.2.5" resolved "https://registry.yarnpkg.com/printf/-/printf-0.2.5.tgz#c438ca2ca33e3927671db4ab69c0e52f936a4f0f" - integrity sha1-xDjKLKM+OSdnHbSracDlL5NqTw8= private@^0.1.6, private@^0.1.7, private@~0.1.5: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== 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" - integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= process-relative-require@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/process-relative-require/-/process-relative-require-1.0.0.tgz#1590dfcf5b8f2983ba53e398446b68240b4cc68a" - integrity sha1-FZDfz1uPKYO6U+OYRGtoJAtMxoo= dependencies: node-modules-path "^1.0.0" progress@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" - integrity sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8= promise-map-series@^0.2.1: version "0.2.3" resolved "https://registry.yarnpkg.com/promise-map-series/-/promise-map-series-0.2.3.tgz#c2d377afc93253f6bd03dbb77755eb88ab20a847" - integrity sha1-wtN3r8kyU/a9A9u3d1XriKsgqEc= dependencies: rsvp "^3.0.14" proxy-addr@~2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec" - integrity sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew= dependencies: forwarded "~0.1.2" ipaddr.js "1.5.2" @@ -6738,42 +5863,34 @@ proxy-addr@~2.0.2: pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= psl@^1.1.24: version "1.1.28" resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.28.tgz#4fb6ceb08a1e2214d4fd4de0ca22dae13740bc7b" - integrity sha512-+AqO1Ae+N/4r7Rvchrdm432afjT9hqJRyBN3DQv9At0tPz4hIFSGKbq64fN9dVoCow4oggIIax5/iONx0r9hZw== punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== qs@6.5.1, qs@^6.4.0, qs@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" - integrity sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A== qs@^6.2.0: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - integrity sha1-E+JtKK1rD/qpExLNO/cI7TUecjM= quick-temp@^0.1.0, quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quick-temp@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/quick-temp/-/quick-temp-0.1.8.tgz#bab02a242ab8fb0dd758a3c9776b32f9a5d94408" - integrity sha1-urAqJCq4+w3XWKPJd2sy+aXZRAg= dependencies: mktemp "~0.4.0" rimraf "^2.5.4" @@ -6782,7 +5899,6 @@ quick-temp@^0.1.0, quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quic qunit-dom@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-0.5.0.tgz#b08db6f919656e0589ebf8bd85bc313febb454d8" - integrity sha1-sI22+RllbgWJ6/i9hbwxP+u0VNg= dependencies: broccoli-funnel "^2.0.0" broccoli-merge-trees "^2.0.0" @@ -6790,7 +5906,6 @@ qunit-dom@^0.5.0: qunit@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.5.0.tgz#64cbe30a1193ef02edc5b278efcdf1d0bae96b22" - integrity sha512-GVvRr8ISFMs4SkTWFsaUzMBs7QEuiXVT4orlFgyHkmeXO1ijlDkhW6ecPri4urXiE4BUXEULJAtFlV1MWgg4Uw== dependencies: chokidar "1.7.0" commander "2.12.2" @@ -6804,7 +5919,6 @@ qunit@^2.5.0: randomatic@^1.1.3: version "1.1.7" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" - integrity sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how== dependencies: is-number "^3.0.0" kind-of "^4.0.0" @@ -6812,12 +5926,10 @@ randomatic@^1.1.3: range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= raw-body@2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" - integrity sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k= dependencies: bytes "3.0.0" http-errors "1.6.2" @@ -6827,7 +5939,6 @@ raw-body@2.3.2: raw-body@~1.1.0: version "1.1.7" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.1.7.tgz#1d027c2bfa116acc6623bca8f00016572a87d425" - integrity sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU= dependencies: bytes "1" string_decoder "0.10" @@ -6835,7 +5946,6 @@ raw-body@~1.1.0: rc@^1.1.7: version "1.2.5" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd" - integrity sha1-J1zWh/bjs2zHVrqibf7oCnkDAf0= dependencies: deep-extend "~0.4.0" ini "~1.3.0" @@ -6845,7 +5955,6 @@ rc@^1.1.7: read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= dependencies: find-up "^1.0.0" read-pkg "^1.0.0" @@ -6853,7 +5962,6 @@ read-pkg-up@^1.0.1: read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= dependencies: load-json-file "^1.0.0" normalize-package-data "^2.3.2" @@ -6862,7 +5970,6 @@ read-pkg@^1.0.0: readable-stream@^2, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" - integrity sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -6875,7 +5982,6 @@ readable-stream@^2, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-str readable-stream@~1.0.2: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= dependencies: core-util-is "~1.0.0" inherits "~2.0.1" @@ -6885,7 +5991,6 @@ readable-stream@~1.0.2: readdirp@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" - integrity sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg= dependencies: graceful-fs "^4.1.2" minimatch "^3.0.2" @@ -6895,7 +6000,6 @@ readdirp@^2.0.0: recast@^0.11.3: version "0.11.23" resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" - integrity sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM= dependencies: ast-types "0.9.6" esprima "~3.1.0" @@ -6905,7 +6009,6 @@ recast@^0.11.3: redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= dependencies: indent-string "^2.1.0" strip-indent "^1.0.1" @@ -6913,29 +6016,24 @@ redent@^1.0.0: redeyed@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-1.0.1.tgz#e96c193b40c0816b00aec842698e61185e55498a" - integrity sha1-6WwZO0DAgWsArshCaY5hGF5VSYo= dependencies: esprima "~3.0.0" regenerate@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" - integrity sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg== regenerator-runtime@^0.10.5: version "0.10.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" - integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-transform@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== dependencies: babel-runtime "^6.18.0" babel-types "^6.19.0" @@ -6944,21 +6042,18 @@ regenerator-transform@^0.10.0: regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== dependencies: is-equal-shallow "^0.1.3" regex-not@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.0.tgz#42f83e39771622df826b02af176525d6a5f157f9" - integrity sha1-Qvg+OXcWIt+CawKvF2Ul1qXxV/k= dependencies: extend-shallow "^2.0.1" regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= dependencies: regenerate "^1.2.1" regjsgen "^0.2.0" @@ -6967,48 +6062,40 @@ regexpu-core@^2.0.0: regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= regjsparser@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= dependencies: jsesc "~0.5.0" remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" - integrity sha1-7wiaF40Ug7quTZPrmLT55OEdmQo= repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= dependencies: is-finite "^1.0.0" request-promise-core@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" - integrity sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY= dependencies: lodash "^4.13.1" request-promise-native@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" - integrity sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU= dependencies: request-promise-core "1.1.1" stealthy-require "^1.1.0" @@ -7017,7 +6104,6 @@ request-promise-native@^1.0.5: request@2.81.0: version "2.81.0" resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" - integrity sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA= dependencies: aws-sign2 "~0.6.0" aws4 "^1.2.1" @@ -7045,7 +6131,6 @@ request@2.81.0: request@^2.74.0, request@^2.79.0: version "2.83.0" resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" - integrity sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw== dependencies: aws-sign2 "~0.7.0" aws4 "^1.6.0" @@ -7073,7 +6158,6 @@ request@^2.74.0, request@^2.79.0: request@^2.81.0, request@^2.87.0: version "2.87.0" resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" - integrity sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw== dependencies: aws-sign2 "~0.7.0" aws4 "^1.6.0" @@ -7099,14 +6183,12 @@ request@^2.81.0, request@^2.87.0: require-folder-tree@^1.4.5: version "1.4.5" resolved "https://registry.yarnpkg.com/require-folder-tree/-/require-folder-tree-1.4.5.tgz#dfe553cbab98cc88e1c56a3f2f358f06ef85bcb0" - integrity sha1-3+VTy6uYzIjhxWo/LzWPBu+FvLA= dependencies: lodash "3.8.0" require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= dependencies: caller-path "^0.1.0" resolve-from "^1.0.0" @@ -7114,17 +6196,14 @@ require-uncached@^1.0.3: requireindex@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162" - integrity sha1-5UBLgVV+91225JxacgBIk/4D4WI= requires-port@1.x.x: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= resolve-dir@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" - integrity sha1-shklmlYC+sXFxJatiUpujMQwJh4= dependencies: expand-tilde "^1.2.2" global-modules "^0.2.3" @@ -7132,7 +6211,6 @@ resolve-dir@^0.1.0: resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= dependencies: expand-tilde "^2.0.0" global-modules "^1.0.0" @@ -7140,31 +6218,26 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1: resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= resolve@1.5.0, resolve@^1.1.6, resolve@^1.3.0, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" - integrity sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw== dependencies: path-parse "^1.0.5" resolve@^1.1.7: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" - integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== dependencies: path-parse "^1.0.5" restore-cursor@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" - integrity sha1-NGYfRohjJ/7SmRR5FSJS35LapUE= dependencies: exit-hook "^1.0.0" onetime "^1.0.0" @@ -7172,7 +6245,6 @@ restore-cursor@^1.0.1: restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= dependencies: onetime "^2.0.0" signal-exit "^3.0.2" @@ -7180,95 +6252,78 @@ restore-cursor@^2.0.0: right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= dependencies: align-text "^0.1.1" rimraf@2, rimraf@^2.2.8, rimraf@^2.3.2, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.1, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== dependencies: glob "^7.0.5" rimraf@~2.2.6: version "2.2.8" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" - integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= route-recognizer@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.3.tgz#1d365e27fa6995e091675f7dc940a8c00353bd29" - integrity sha1-HTZeJ/ppleCRZ199yUCowANTvSk= route-recognizer@^0.3.4: version "0.3.4" resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.4.tgz#39ab1ffbce1c59e6d2bdca416f0932611e4f3ca3" - integrity sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g== rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.2.1, rsvp@^3.3.1, rsvp@^3.3.3, rsvp@^3.5.0: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" - integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== rsvp@^4.6.1, rsvp@^4.7.0: version "4.8.1" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.1.tgz#168addb3963222de37ee351b70e3876bdb2ac285" - integrity sha512-c9tShmZbQ5nLVVVl3Fuhk1NExJlXfAMIEz7a8GC570X8XhNQNZPFAdjOeMmJEN3SLYOOb2OprS576P/QO4QouA== rsvp@^4.8.2: version "4.8.3" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.3.tgz#25d4b9fdd0f95e216eb5884d9b3767d3fbfbe2cd" - integrity sha512-/OlbK31XtkPnLD2ktmZXj4g/v6q1boTDr6/3lFuDTgxVsrA3h7PH5eYyAxIvDMjRHr/DoOlzNicqDwBEo9xU7g== rsvp@~3.0.6: version "3.0.21" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.0.21.tgz#49c588fe18ef293bcd0ab9f4e6756e6ac433359f" - integrity sha1-ScWI/hjvKTvNCrn05nVuasQzNZ8= rsvp@~3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.2.1.tgz#07cb4a5df25add9e826ebc67dcc9fd89db27d84a" - integrity sha1-B8tKXfJa3Z6Cbrxn3Mn9idsn2Eo= run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= dependencies: is-promise "^2.1.0" rx-lite-aggregates@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" - integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= dependencies: rx-lite "*" rx-lite@*, rx-lite@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" - integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= rx@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" - integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" - integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== safe-json-parse@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" - integrity sha1-PnZyPjjf3aE8mx0poeB//uSzC1c= sane@^1.1.1, sane@^1.4.1: version "1.7.0" resolved "https://registry.yarnpkg.com/sane/-/sane-1.7.0.tgz#b3579bccb45c94cf20355cc81124990dfd346e30" - integrity sha1-s1ebzLRclM8gNVzIESSZDf00bjA= dependencies: anymatch "^1.3.0" exec-sh "^0.2.0" @@ -7281,7 +6336,6 @@ sane@^1.1.1, sane@^1.4.1: sane@^2.2.0: version "2.4.1" resolved "https://registry.yarnpkg.com/sane/-/sane-2.4.1.tgz#29f991208cf28636720efdc584293e7fd66663a5" - integrity sha512-fW9svvNd81XzHDZyis9/tEY1bZikDGryy8Hi1BErPyNPYv47CdLseUN+tI5FBHWXEENRtj1SWtX/jBnggLaP0w== dependencies: anymatch "^1.3.0" exec-sh "^0.2.0" @@ -7296,22 +6350,18 @@ sane@^2.2.0: sax@^1.2.1, sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== "semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.1.1, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" - integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== semver@^4.3.1: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" - integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= send@0.16.1: version "0.16.1" resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" - integrity sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A== dependencies: debug "2.6.9" depd "~1.1.1" @@ -7330,7 +6380,6 @@ send@0.16.1: serve-static@1.13.1: version "1.13.1" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" - integrity sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ== dependencies: encodeurl "~1.0.1" escape-html "~1.0.3" @@ -7340,24 +6389,20 @@ serve-static@1.13.1: set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= set-getter@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376" - integrity sha1-12nBgsnVpR9AkUXy+6guXoboA3Y= dependencies: to-object-path "^0.3.0" set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= set-value@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -7367,7 +6412,6 @@ set-value@^0.4.3: set-value@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -7377,75 +6421,62 @@ set-value@^2.0.0: setprototypeof@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" - integrity sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ= setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= dependencies: shebang-regex "^1.0.0" shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= shelljs@^0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.2.6.tgz#90492d72ffcc8159976baba62fb0f6884f0c3378" - integrity sha1-kEktcv/MgVmXa6umL7D2iE8MM3g= shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= silent-error@^1.0.0, silent-error@^1.0.1, silent-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/silent-error/-/silent-error-1.1.0.tgz#2209706f1c850a9f1d10d0d840918b46f26e1bc9" - integrity sha1-IglwbxyFCp8dENDYQJGLRvJuG8k= dependencies: debug "^2.2.0" simple-dom@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/simple-dom/-/simple-dom-1.3.0.tgz#8473e0d34e340544b061410dba3faf4f1b7aa282" - integrity sha512-RVjr6e80FFGDqDJZeQd4EMwoDLatn4Jy2SfuXecrP1IgG4ZAqkGSokE8LNV5i0kzWR2IM0e257xGN9JS8lxm0Q== slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= slice-ansi@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" - integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== dependencies: is-fullwidth-code-point "^2.0.0" snake-case@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f" - integrity sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8= dependencies: no-case "^2.2.0" snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: define-property "^1.0.0" isobject "^3.0.0" @@ -7454,14 +6485,12 @@ snapdragon-node@^2.0.1: snapdragon-util@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== dependencies: kind-of "^3.2.0" snapdragon@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.1.tgz#e12b5487faded3e3dea0ac91e9400bf75b401370" - integrity sha1-4StUh/re0+PeoKyR6UAL91tAE3A= dependencies: base "^0.11.1" debug "^2.2.0" @@ -7475,21 +6504,18 @@ snapdragon@^0.8.1: sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - integrity sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg= dependencies: hoek "2.x.x" sntp@2.x.x: version "2.1.0" resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" - integrity sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg== dependencies: hoek "4.x.x" socket.io-adapter@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" - integrity sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s= dependencies: debug "2.3.3" socket.io-parser "2.3.1" @@ -7497,7 +6523,6 @@ socket.io-adapter@0.5.0: socket.io-client@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.6.0.tgz#5b668f4f771304dfeed179064708386fa6717853" - integrity sha1-W2aPT3cTBN/u0XkGRwg4b6ZxeFM= dependencies: backo2 "1.0.2" component-bind "1.0.0" @@ -7514,7 +6539,6 @@ socket.io-client@1.6.0: socket.io-parser@2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0" - integrity sha1-3VMgJRA85Clpcya+/WQAX8/ltKA= dependencies: component-emitter "1.1.2" debug "2.2.0" @@ -7524,7 +6548,6 @@ socket.io-parser@2.3.1: socket.io@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.6.0.tgz#3e40d932637e6bd923981b25caf7c53e83b6e2e1" - integrity sha1-PkDZMmN+a9kjmBslyvfFPoO24uE= dependencies: debug "2.3.3" engine.io "1.8.0" @@ -7537,19 +6560,16 @@ socket.io@1.6.0: sort-object-keys@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.2.tgz#d3a6c48dc2ac97e6bc94367696e03f6d09d37952" - integrity sha1-06bEjcKsl+a8lDZ2luA/bQnTeVI= sort-package-json@^1.4.0: version "1.7.1" resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.7.1.tgz#f2e5fbffe8420cc1bb04485f4509f05e73b4c0f2" - integrity sha1-8uX7/+hCDMG7BEhfRQnwXnO0wPI= dependencies: sort-object-keys "^1.1.1" source-map-resolve@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" - integrity sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A== dependencies: atob "^2.0.0" decode-uri-component "^0.2.0" @@ -7560,14 +6580,12 @@ source-map-resolve@^0.5.0: source-map-support@^0.4.15: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== dependencies: source-map "^0.5.6" source-map-support@^0.5.0: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" - integrity sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -7575,41 +6593,34 @@ source-map-support@^0.5.0: source-map-url@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" - integrity sha1-fsrxO1e80J2opAxdJp2zN5nUqvk= source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= source-map@0.4.x, source-map@^0.4.2, source-map@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - integrity sha1-66T12pwNyZneaAMti092FzZSA2s= dependencies: amdefine ">=0.0.4" source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.1, source-map@~0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= source-map@^0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@~0.1.x: version "0.1.43" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" - integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y= dependencies: amdefine ">=0.0.4" sourcemap-validator@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/sourcemap-validator/-/sourcemap-validator-1.0.6.tgz#abd2f1ecdae6a3c46c2c96c5f256705b2147c9c0" - integrity sha1-q9Lx7Nrmo8RsLJbF8lZwWyFHycA= dependencies: jsesc "~0.3.x" lodash.foreach "~2.3.x" @@ -7619,12 +6630,10 @@ sourcemap-validator@^1.0.5: spawn-args@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/spawn-args/-/spawn-args-0.2.0.tgz#fb7d0bd1d70fd4316bd9e3dec389e65f9d6361bb" - integrity sha1-+30L0dcP1DFr2ePew4nmX51jYbs= spawn-sync@^1.0.11, spawn-sync@^1.0.15: version "1.0.15" resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" - integrity sha1-sAeZVX63+wyDdsKdROih6mfldHY= dependencies: concat-stream "^1.4.7" os-shim "^0.1.2" @@ -7632,51 +6641,42 @@ spawn-sync@^1.0.11, spawn-sync@^1.0.15: spawnback@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/spawnback/-/spawnback-1.0.0.tgz#f73662f7e54d95367eca74d6426c677dd7ea686f" - integrity sha1-9zZi9+VNlTZ+ynTWQmxnfdfqaG8= spdx-correct@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" - integrity sha1-SzBz2TP/UfORLwOsVRlJikFQ20A= dependencies: spdx-license-ids "^1.0.2" spdx-expression-parse@~1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" - integrity sha1-m98vIOH0DtRH++JzJmGR/O1RYmw= spdx-license-ids@^1.0.2: version "1.2.2" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" - integrity sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc= split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== dependencies: extend-shallow "^3.0.0" sprintf-js@^1.0.3: version "1.1.1" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c" - integrity sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw= sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sri-toolbox@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/sri-toolbox/-/sri-toolbox-0.2.0.tgz#a7fea5c3fde55e675cf1c8c06f3ebb5c2935835e" - integrity sha1-p/6lw/3lXmdc8cjAbz67XCk1g14= sshpk@^1.7.0: version "1.13.1" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" - integrity sha1-US322mKHFEMW3EwY/hzx2UBzm+M= dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -7691,7 +6691,6 @@ sshpk@^1.7.0: static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= dependencies: define-property "^0.2.5" object-copy "^0.1.0" @@ -7699,27 +6698,22 @@ static-extend@^0.1.1: "statuses@>= 1.3.1 < 2": version "1.4.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" - integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== statuses@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" - integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= stealthy-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= string-template@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" - integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0= string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" @@ -7728,7 +6722,6 @@ string-width@^1.0.1, string-width@^1.0.2: string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" @@ -7736,127 +6729,106 @@ string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: string_decoder@0.10, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= string_decoder@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" - integrity sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ== dependencies: safe-buffer "~5.1.0" stringstream@~0.0.4, stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" - integrity sha1-TkhM1N5aC7vuGORjB3EKioFiGHg= strip-ansi@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" - integrity sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA= dependencies: ansi-regex "^0.2.1" strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= dependencies: ansi-regex "^3.0.0" strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= dependencies: is-utf8 "^0.2.0" strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= dependencies: get-stdin "^4.0.1" strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= styled_string@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/styled_string/-/styled_string-0.0.1.tgz#d22782bd81295459bc4f1df18c4bad8e94dd124a" - integrity sha1-0ieCvYEpVFm8Tx3xjEutjpTdEko= sum-up@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/sum-up/-/sum-up-1.0.3.tgz#1c661f667057f63bcb7875aa1438bc162525156e" - integrity sha1-HGYfZnBX9jvLeHWqFDi8FiUlFW4= dependencies: chalk "^1.0.0" supports-color@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" - integrity sha1-cqJiiU2dQIuVbKBf83su2KbiotU= dependencies: has-flag "^1.0.0" supports-color@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" - integrity sha1-2S3iaU6z9nMjlz1649i1W0wiGQo= supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= supports-color@^4.0.0: version "4.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" - integrity sha1-vnoN5ITexcXN34s9WRJQRJEvY1s= dependencies: has-flag "^2.0.0" supports-color@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.2.0.tgz#b0d5333b1184dd3666cbe5aa0b45c5ac7ac17a4a" - integrity sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q== dependencies: has-flag "^3.0.0" symbol-tree@^3.2.1, symbol-tree@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" - integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.3, symlink-or-copy@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.1.8.tgz#cabe61e0010c1c023c173b25ee5108b37f4b4aa3" - integrity sha1-yr5h4AEMHAI8Fzsl7lEIs39LSqM= table@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" - integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA== dependencies: ajv "^5.2.3" ajv-keywords "^2.1.0" @@ -7868,7 +6840,6 @@ table@^4.0.1: tap-parser@^5.1.0: version "5.4.0" resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-5.4.0.tgz#6907e89725d7b7fa6ae41ee2c464c3db43188aec" - integrity sha512-BIsIaGqv7uTQgTW1KLTMNPSEQf4zDDPgYOBRdgOfuB+JFOLRBfEu6cLa/KvMvmqggu1FKXDfitjLwsq4827RvA== dependencies: events-to-array "^1.0.1" js-yaml "^3.2.7" @@ -7878,7 +6849,6 @@ tap-parser@^5.1.0: tar-pack@^3.4.0: version "3.4.1" resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" - integrity sha512-PPRybI9+jM5tjtCbN2cxmmRU7YmqT3Zv/UDy48tAh2XRkLa9bAORtSWLkVc13+GJF+cdTh1yEnHEk3cpTaL5Kg== dependencies: debug "^2.2.0" fstream "^1.0.10" @@ -7892,7 +6862,6 @@ tar-pack@^3.4.0: tar@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" - integrity sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE= dependencies: block-stream "*" fstream "^1.0.2" @@ -7901,7 +6870,6 @@ tar@^2.2.1: temp@0.8.3, temp@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" - integrity sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k= dependencies: os-tmpdir "^1.0.0" rimraf "~2.2.6" @@ -7909,7 +6877,6 @@ temp@0.8.3, temp@^0.8.3: testem@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/testem/-/testem-2.0.0.tgz#b05c96200c7ac98bae998d71c94c0c5345907d13" - integrity sha1-sFyWIAx6yYuumY1xyUwMU0WQfRM= dependencies: backbone "^1.1.2" bluebird "^3.4.6" @@ -7942,36 +6909,30 @@ testem@^2.0.0: text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= "textextensions@1 || 2": version "2.2.0" resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.2.0.tgz#38ac676151285b658654581987a0ce1a4490d286" - integrity sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA== thenify-all@^1.0.0, thenify-all@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= dependencies: thenify ">= 3.1.0 < 4" "thenify@>= 3.1.0 < 4": version "3.3.0" resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" - integrity sha1-5p44obq+lpsBCCB5eLn2K4hgSDk= dependencies: any-promise "^1.0.0" through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= tiny-lr@^1.0.3: version "1.1.0" resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.1.0.tgz#a373bce2a4b58cef9a64433360ba593155f4cd45" - integrity sha512-f4X68a6KHcCx/XJcZUKAa92APjY9EHxuGOzRFmPRjf+fOp1E7fi4dGJaHMxvRBxwZrHrIvn/AwkFaDS7O1WZDQ== dependencies: body "^5.1.0" debug "~2.6.7" @@ -7983,62 +6944,52 @@ tiny-lr@^1.0.3: tmp@0.0.28: version "0.0.28" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" - integrity sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA= dependencies: os-tmpdir "~1.0.1" tmp@0.0.31: version "0.0.31" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" - integrity sha1-jzirlDjhcxXl29izZX6L+yd65Kc= dependencies: os-tmpdir "~1.0.1" tmp@^0.0.29: version "0.0.29" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" - integrity sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA= dependencies: os-tmpdir "~1.0.1" tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= to-array@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" - integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= dependencies: is-number "^3.0.0" repeat-string "^1.6.1" @@ -8046,7 +6997,6 @@ to-regex-range@^2.1.0: to-regex@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.1.tgz#15358bee4a2c83bd76377ba1dc049d0f18837aae" - integrity sha1-FTWL7kosg712N3uh3ASdDxiDeq4= dependencies: define-property "^0.2.5" extend-shallow "^2.0.1" @@ -8055,7 +7005,6 @@ to-regex@^3.0.1: tough-cookie@>=2.3.3, tough-cookie@^2.3.4: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== dependencies: psl "^1.1.24" punycode "^1.4.1" @@ -8063,26 +7012,22 @@ tough-cookie@>=2.3.3, tough-cookie@^2.3.4: tough-cookie@^2.3.2, tough-cookie@~2.3.0, tough-cookie@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" - integrity sha1-C2GKVWW23qkL80JdBNVe3EdadWE= dependencies: punycode "^1.4.1" tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= dependencies: punycode "^2.1.0" tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= tree-sync@^1.2.1, tree-sync@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-sync/-/tree-sync-1.2.2.tgz#2cf76b8589f59ffedb58db5a3ac7cb013d0158b7" - integrity sha1-LPdrhYn1n/7bWNtaOsfLAT0BWLc= dependencies: debug "^2.2.0" fs-tree-diff "^0.5.6" @@ -8093,41 +7038,34 @@ tree-sync@^1.2.1, tree-sync@^1.2.2: trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= dependencies: prelude-ls "~1.1.2" type-detect@^4.0.0: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== type-is@~1.6.15: version "1.6.15" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" - integrity sha1-yrEPtJCeRByChC6v4a1kbIGARBA= dependencies: media-typer "0.3.0" mime-types "~2.1.15" @@ -8135,17 +7073,14 @@ type-is@~1.6.15: typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= uc.micro@^1.0.1, uc.micro@^1.0.3: version "1.0.5" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376" - integrity sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg== uglify-es@^3.1.3: version "3.3.9" resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" - integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== dependencies: commander "~2.13.0" source-map "~0.6.1" @@ -8153,7 +7088,6 @@ uglify-es@^3.1.3: uglify-js@^2.6: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" - integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= dependencies: source-map "~0.5.1" yargs "~3.10.0" @@ -8163,22 +7097,18 @@ uglify-js@^2.6: 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" - integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= uid-number@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= ultron@1.0.x: version "1.0.2" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" - integrity sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po= underscore.string@^3.2.2, underscore.string@~3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db" - integrity sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s= dependencies: sprintf-js "^1.0.3" util-deprecate "^1.0.2" @@ -8186,12 +7116,10 @@ underscore.string@^3.2.2, underscore.string@~3.3.4: underscore@>=1.8.3: version "1.8.3" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" - integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI= union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= dependencies: arr-union "^3.1.0" get-value "^2.0.6" @@ -8201,24 +7129,20 @@ union-value@^1.0.0: unique-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= dependencies: crypto-random-string "^1.0.0" universalify@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" - integrity sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc= unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= dependencies: has-value "^0.3.1" isobject "^3.0.0" @@ -8226,19 +7150,16 @@ unset-value@^1.0.0: untildify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/untildify/-/untildify-2.1.0.tgz#17eb2807987f76952e9c0485fc311d06a826a2e0" - integrity sha1-F+soB5h/dpUunASF/DEdBqgmouA= dependencies: os-homedir "^1.0.0" urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= use@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8" - integrity sha1-riig1y+TvyJCKhii43mZMRLeyOg= dependencies: define-property "^0.2.5" isobject "^3.0.0" @@ -8247,7 +7168,6 @@ use@^2.0.0: user-info@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/user-info/-/user-info-1.0.0.tgz#81c82b7ed63e674c2475667653413b3c76fde239" - integrity sha1-gcgrftY+Z0wkdWZ2U0E7PHb94jk= dependencies: os-homedir "^1.0.1" passwd-user "^1.2.1" @@ -8256,34 +7176,28 @@ user-info@^1.0.0: username-sync@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/username-sync/-/username-sync-1.0.1.tgz#1cde87eefcf94b8822984d938ba2b797426dae1f" - integrity sha1-HN6H7vz5S4gimE2Ti6K3l0Jtrh8= username@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/username/-/username-1.0.1.tgz#e1f72295e3e58e06f002c6327ce06897a99cd67f" - integrity sha1-4fcilePljgbwAsYyfOBol6mc1n8= dependencies: meow "^3.4.0" util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= uuid@^3.0.0, uuid@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" - integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA== validate-npm-package-license@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" - integrity sha1-KAS6vnEq0zeUWaz74kdGqywwP7w= dependencies: spdx-correct "~1.0.0" spdx-expression-parse "~1.0.0" @@ -8291,19 +7205,16 @@ validate-npm-package-license@^3.0.1: validate-npm-package-name@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" - integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= dependencies: builtins "^1.0.3" vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" @@ -8312,14 +7223,12 @@ verror@1.10.0: w3c-hr-time@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" - integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= dependencies: browser-process-hrtime "^0.1.2" walk-sync@0.3.2, walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.2.tgz#4827280afc42d0e035367c4a4e31eeac0d136f75" - integrity sha512-FMB5VqpLqOCcqrzA9okZFc0wq0Qbmdm396qJxvQZhDpyu0W95G9JCmp74tx7iyYnyOcBtUuKJsgIKAqjozvmmQ== dependencies: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" @@ -8327,7 +7236,6 @@ walk-sync@0.3.2, walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2: walk-sync@^0.2.5, walk-sync@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.2.7.tgz#b49be4ee6867657aeb736978b56a29d10fa39969" - integrity sha1-tJvk7mhnZXrrc2l4tWop0Q+jmWk= dependencies: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" @@ -8335,19 +7243,16 @@ walk-sync@^0.2.5, walk-sync@^0.2.7: walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= dependencies: makeerror "1.0.x" watch@~0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" - integrity sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw= watch@~0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" - integrity sha1-KAlUdsbffJDJYxOJkMClQj60uYY= dependencies: exec-sh "^0.2.0" minimist "^1.2.0" @@ -8355,17 +7260,14 @@ watch@~0.18.0: webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= webidl-conversions@^4.0.0, webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== websocket-driver@>=0.5.1: version "0.7.0" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" - integrity sha1-DK+dLXVdk67gSdS90NP+LMoqJOs= dependencies: http-parser-js ">=0.4.0" websocket-extensions ">=0.1.1" @@ -8373,24 +7275,20 @@ websocket-driver@>=0.5.1: websocket-extensions@>=0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" - integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" - integrity sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw== dependencies: iconv-lite "0.4.19" whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" - integrity sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew== whatwg-url@^4.3.0: version "4.8.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" - integrity sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA= dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" @@ -8398,7 +7296,6 @@ whatwg-url@^4.3.0: whatwg-url@^6.4.0, whatwg-url@^6.4.1: version "6.5.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" - integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== dependencies: lodash.sortby "^4.7.0" tr46 "^1.0.1" @@ -8407,53 +7304,44 @@ whatwg-url@^6.4.0, whatwg-url@^6.4.1: which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" - integrity sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg== dependencies: isexe "^2.0.0" wide-align@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" - integrity sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w== dependencies: string-width "^1.0.2" window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= workerpool@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-2.3.0.tgz#86c5cbe946b55e7dc9d12b1936c8801a6e2d744d" - integrity sha512-JP5DpviEV84zDmz13QnD4FfRjZBjnTOYY2O4pGgxtlqLh47WOzQFHm8o17TE5OSfcDoKC6vHSrN4yPju93DW0Q== dependencies: object-assign "4.1.1" wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= write-file-atomic@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" - integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA== dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" @@ -8462,14 +7350,12 @@ write-file-atomic@^2.0.0: write@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" - integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= dependencies: mkdirp "^0.5.1" ws@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018" - integrity sha1-CC3bbGQehdS7RR8D1S8G6r2x8Bg= dependencies: options ">=0.0.5" ultron "1.0.x" @@ -8477,54 +7363,44 @@ ws@1.1.1: ws@^5.2.0: version "5.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" - integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== dependencies: async-limiter "~1.0.0" wtf-8@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" - integrity sha1-OS2LotDxw00e4tYw8V0O+2jhBIo= xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" - integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= xml-name-validator@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" - integrity sha1-TYuPHszTQZqjYgYb7O9RXh5VljU= xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== xmldom@^0.1.19: version "0.1.27" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" - integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= xmlhttprequest-ssl@1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" - integrity sha1-GFqIjATspGw+QHDZn3tJ3jUomS0= xtend@^4.0.0, xtend@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= yam@0.0.22: version "0.0.22" resolved "https://registry.yarnpkg.com/yam/-/yam-0.0.22.tgz#38a76cb79a19284d9206ed49031e359a1340bd06" - integrity sha1-OKdst5oZKE2SBu1JAx41mhNAvQY= dependencies: fs-extra "^0.30.0" lodash.merge "^4.4.0" @@ -8532,7 +7408,6 @@ yam@0.0.22: yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= dependencies: camelcase "^1.0.2" cliui "^2.1.0" @@ -8542,4 +7417,3 @@ yargs@~3.10.0: yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" - integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= From 16ace156b45a8ee2ec6dd748dd0a177a9adc1a58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82?= Date: Sat, 3 Nov 2018 12:49:25 +0100 Subject: [PATCH 250/879] nested included relationships - dasherize include param --- addon/serializers/json-api-serializer.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/addon/serializers/json-api-serializer.js b/addon/serializers/json-api-serializer.js index 4fd545e01..2a59bbafd 100644 --- a/addon/serializers/json-api-serializer.js +++ b/addon/serializers/json-api-serializer.js @@ -210,8 +210,8 @@ const JSONAPISerializer = Serializer.extend({ graphResource = graph.data[graphKey]; // Check includes - } else if (graph.included[dasherize(pluralize(model.modelName))]) { - graphResource = graph.included[dasherize(pluralize(model.modelName))][graphKey]; + } else if (graph.included[pluralize(model.modelName)]) { + graphResource = graph.included[pluralize(model.modelName)][graphKey]; } // If the model's in the graph, check if relationshipKey should be included @@ -265,9 +265,9 @@ const JSONAPISerializer = Serializer.extend({ .forEach(includesPath => { // includesPath is post.comments, for example graph.data[graphKey].relationships = graph.data[graphKey].relationships || {}; - let relationshipKeys = includesPath.split('.'); + let relationshipKeys = includesPath.split('.').map(dasherize); let relationshipKey = relationshipKeys[0]; - let graphRelationshipKey = dasherize(relationshipKey); + let graphRelationshipKey = relationshipKey; let normalizedRelationshipKey = camelize(relationshipKey); let hasAssociation = model.associationKeys.includes(normalizedRelationshipKey); @@ -299,7 +299,7 @@ const JSONAPISerializer = Serializer.extend({ let models = this.isCollection(resource) ? resource.models : [ resource ]; models.forEach(model => { - let collectionName = dasherize(pluralize(model.modelName)); + let collectionName = pluralize(model.modelName); graph.included[collectionName] = graph.included[collectionName] || {}; this._addModelToRequestedIncludesGraph(graph, model, relationshipNames); @@ -307,7 +307,7 @@ const JSONAPISerializer = Serializer.extend({ }, _addModelToRequestedIncludesGraph(graph, model, relationshipNames) { - let collectionName = dasherize(pluralize(model.modelName)); + let collectionName = pluralize(model.modelName); let resourceKey = this._graphKeyForModel(model); graph.included[collectionName][resourceKey] = graph.included[collectionName][resourceKey] || {}; From b1dd4ae6827d39982fa46bceddfeb5ab20c9c35c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82?= Date: Fri, 16 Nov 2018 16:17:04 +0100 Subject: [PATCH 251/879] bring back integrity keys in yarn.lock --- yarn.lock | 1127 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1127 insertions(+) diff --git a/yarn.lock b/yarn.lock index be781d6f8..1f41f76ea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,12 +5,14 @@ "@babel/code-frame@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" + integrity sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g== dependencies: "@babel/highlight" "7.0.0-beta.44" "@babel/generator@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" + integrity sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ== dependencies: "@babel/types" "7.0.0-beta.44" jsesc "^2.5.1" @@ -21,6 +23,7 @@ "@babel/helper-function-name@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" + integrity sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg== dependencies: "@babel/helper-get-function-arity" "7.0.0-beta.44" "@babel/template" "7.0.0-beta.44" @@ -29,18 +32,21 @@ "@babel/helper-get-function-arity@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" + integrity sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw== dependencies: "@babel/types" "7.0.0-beta.44" "@babel/helper-split-export-declaration@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" + integrity sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA== dependencies: "@babel/types" "7.0.0-beta.44" "@babel/highlight@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" + integrity sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ== dependencies: chalk "^2.0.0" esutils "^2.0.2" @@ -49,6 +55,7 @@ "@babel/template@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" + integrity sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng== dependencies: "@babel/code-frame" "7.0.0-beta.44" "@babel/types" "7.0.0-beta.44" @@ -58,6 +65,7 @@ "@babel/traverse@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" + integrity sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA== dependencies: "@babel/code-frame" "7.0.0-beta.44" "@babel/generator" "7.0.0-beta.44" @@ -73,6 +81,7 @@ "@babel/types@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" + integrity sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ== dependencies: esutils "^2.0.2" lodash "^4.2.0" @@ -81,6 +90,7 @@ "@ember/test-helpers@^0.7.17": version "0.7.17" resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-0.7.17.tgz#17ff5f1d005d8b6331585e99013d66626a8d8068" + integrity sha512-pLz4FV8IGty+9CEGttEl6clLiQkap4w7T0So8lbCb4XO38OxGfjhfz8uKpI+UH6fgaTeboh8myixqOdfXvklfA== dependencies: broccoli-funnel "^2.0.1" ember-cli-babel "^6.10.0" @@ -89,32 +99,39 @@ "@glimmer/di@^0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@glimmer/di/-/di-0.2.0.tgz#73bfd4a6ee4148a80bf092e8a5d29bcac9d4ce7e" + integrity sha1-c7/Upu5BSKgL8JLopdKbysnUzn4= "@glimmer/resolver@^0.4.1": version "0.4.2" resolved "https://registry.yarnpkg.com/@glimmer/resolver/-/resolver-0.4.2.tgz#60c9b492e90bc3956ac82b3134649bd337e1651c" + integrity sha512-OYOSn2qKPMWRTrInu4W7Ilx2q4+mFfeKS8o8SCWdGN6q/9LnRUvN3vfiAEEfpgoMSvEr8TSGw6/b2WSLWoYAAA== dependencies: "@glimmer/di" "^0.2.0" "@xg-wang/whatwg-fetch@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@xg-wang/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#f7b222c012a238e7d6e89ed3d72a1e0edb58453d" + integrity sha512-ULtqA6L75RLzTNW68IiOja0XYv4Ebc3OGMzfia1xxSEMpD0mk/pMvkQX0vbCFyQmKc5xGp80Ms2WiSlXLh8hbA== abab@^1.0.3, abab@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" + integrity sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4= abab@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" + integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== accepts@1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + integrity sha1-w8p0NJOGSMPg2cHjKN1otiLChMo= dependencies: mime-types "~2.1.11" negotiator "0.6.1" @@ -122,6 +139,7 @@ accepts@1.3.3: accepts@~1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" + integrity sha1-hiRnWMfdbSGmR0/whKR0DsBesh8= dependencies: mime-types "~2.1.16" negotiator "0.6.1" @@ -129,40 +147,48 @@ accepts@~1.3.4: acorn-globals@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" + integrity sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8= dependencies: acorn "^4.0.4" acorn-globals@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" + integrity sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ== dependencies: acorn "^5.0.0" acorn-jsx@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= dependencies: acorn "^3.0.4" acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= acorn@^4.0.4: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= acorn@^5.0.0, acorn@^5.5.3: version "5.7.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" + integrity sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ== acorn@^5.4.0: version "5.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.4.1.tgz#fdc58d9d17f4a4e98d102ded826a9b9759125102" + integrity sha512-XLmq3H/BVvW6/GbxKryGxWORz1ebilSsUDlyC27bXhWGWAZWkGwS6FLHjOlwFXNFoWFQEO/Df4u0YYd0K3BQgQ== active-model-adapter@^2.0.3: version "2.2.0" resolved "https://registry.yarnpkg.com/active-model-adapter/-/active-model-adapter-2.2.0.tgz#6885d6968574809f17f398c499b688a921c30f91" + integrity sha512-hflmeFKGiKXZtqPJ5pGbjUOCCIDWi2aFC7Q4htNi+FbLvI+8lBqjpDxiHgL82HmDF/CVVZGFQ2y0MROTxgC58g== dependencies: ember-cli-babel "^6.8.2" ember-inflector "^2.0.0" @@ -170,14 +196,17 @@ active-model-adapter@^2.0.3: after@0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/after/-/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" + integrity sha1-q11PuIP1loFtNRX495HAr0ht1ic= ajv-keywords@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" + integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= ajv@^4.9.1: version "4.11.8" resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + integrity sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY= dependencies: co "^4.6.0" json-stable-stringify "^1.0.1" @@ -185,6 +214,7 @@ ajv@^4.9.1: ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= dependencies: co "^4.6.0" fast-deep-equal "^1.0.0" @@ -194,6 +224,7 @@ ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: 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" + integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= dependencies: kind-of "^3.0.2" longest "^1.0.1" @@ -202,76 +233,92 @@ align-text@^0.1.1, align-text@^0.1.3: amd-name-resolver@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-0.0.5.tgz#76962dac876ed3311b05d29c6a58c14e1ef3304b" + integrity sha1-dpYtrIdu0zEbBdKcaljBTh7zMEs= dependencies: ensure-posix-path "^1.0.1" amd-name-resolver@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-0.0.7.tgz#814301adfe8a2f109f6e84d5e935196efb669615" + integrity sha1-gUMBrf6KLxCfboTV6TUZbvtmlhU= dependencies: ensure-posix-path "^1.0.1" amd-name-resolver@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.0.0.tgz#0e593b28d6fa3326ab1798107edaea961046e8d8" + integrity sha1-Dlk7KNb6MyarF5gQftrqlhBG6Ng= dependencies: ensure-posix-path "^1.0.1" amd-name-resolver@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.2.0.tgz#fc41b3848824b557313897d71f8d5a0184fbe679" + integrity sha512-hlSTWGS1t6/xq5YCed7YALg7tKZL3rkl7UwEZ/eCIkn8JxmM6fU6Qs/1hwtjQqfuYxlffuUcgYEm0f5xP4YKaA== dependencies: ensure-posix-path "^1.0.1" amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= ansi-escapes@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + integrity sha1-06ioOzGapneTZisT52HHkRQiMG4= ansi-escapes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" + integrity sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ== ansi-regex@^0.2.0, ansi-regex@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" + integrity sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk= ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= ansi-styles@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" + integrity sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94= ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= ansi-styles@^3.0.0, ansi-styles@^3.1.0, ansi-styles@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" + integrity sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug== dependencies: color-convert "^1.9.0" ansicolors@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" + integrity sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8= any-promise@^1.0.0, any-promise@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= anymatch@^1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== dependencies: micromatch "^2.1.5" normalize-path "^2.0.0" @@ -279,16 +326,19 @@ anymatch@^1.3.0: aot-test-generators@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/aot-test-generators/-/aot-test-generators-0.1.0.tgz#43f0f615f97cb298d7919c1b0b4e6b7310b03cd0" + integrity sha1-Q/D2Ffl8spjXkZwbC05rcxCwPNA= dependencies: jsesc "^2.5.0" aproba@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== are-we-there-yet@~1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + integrity sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0= dependencies: delegates "^1.0.0" readable-stream "^2.0.6" @@ -296,102 +346,125 @@ are-we-there-yet@~1.1.2: argparse@^1.0.7: version "1.0.9" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + integrity sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY= dependencies: sprintf-js "~1.0.2" arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= dependencies: arr-flatten "^1.0.1" arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= array-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= array-to-error@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/array-to-error/-/array-to-error-1.1.1.tgz#d68812926d14097a205579a667eeaf1856a44c07" + integrity sha1-1ogSkm0UCXogVXmmZ+6vGFakTAc= dependencies: array-to-sentence "^1.1.0" array-to-sentence@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/array-to-sentence/-/array-to-sentence-1.1.0.tgz#c804956dafa53232495b205a9452753a258d39fc" + integrity sha1-yASVba+lMjJJWyBalFJ1OiWNOfw= array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= dependencies: array-uniq "^1.0.1" array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= arraybuffer.slice@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" + integrity sha1-8zshWfBTKj8xB6JywMz70a0peco= arrify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + integrity sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y= assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= assert-plus@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + integrity sha1-104bh+ev/A24qttwIfP+SBAasjQ= assertion-error@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= ast-types@0.9.6: version "0.9.6" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" + integrity sha1-ECyenpAF0+fjgpvwxPok7oYu6bk= async-disk-cache@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/async-disk-cache/-/async-disk-cache-1.3.3.tgz#6040486660b370e4051cd9fa9fee275e1fae3728" + integrity sha512-GyaWSbDAZCltxSobtj1m1ptXa0+zSdjWs3sM4IqnvhoRwMDHW5786sXQ1RiXbR3ZGuQe6NXMB4N0vUmW163cew== dependencies: debug "^2.1.3" heimdalljs "^0.2.3" @@ -404,14 +477,17 @@ async-disk-cache@^1.2.1: async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + integrity sha1-GdOGodntxufByF04iu28xW0zYC0= async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== async-promise-queue@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/async-promise-queue/-/async-promise-queue-1.0.4.tgz#308baafbc74aff66a0bb6e7f4a18d4fe8434440c" + integrity sha512-GQ5X3DT+TefYuFPHdvIPXFTlKnh39U7dwtl+aUBGeKjMea9nBpv3c91DXgeyBQmY07vQ97f3Sr9XHqkamEameQ== dependencies: async "^2.4.1" debug "^2.6.8" @@ -419,40 +495,49 @@ async-promise-queue@^1.0.3: async@^1.4.0, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= async@^2.4.1: version "2.6.0" resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" + integrity sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw== dependencies: lodash "^4.14.0" async@~0.2.9: version "0.2.10" resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= atob@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d" + integrity sha1-GcenYEc3dEaPILLS0DNyrX1Mv10= aws-sign2@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + integrity sha1-FDQt0428yU0OW4fXY81jYSwOeU8= aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.2.1, aws4@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + integrity sha1-g+9cqGCysy5KDe7e6MdxudtXRx4= babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= dependencies: chalk "^1.1.3" esutils "^2.0.2" @@ -461,6 +546,7 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: babel-core@^6.14.0, babel-core@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" + integrity sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g= dependencies: babel-code-frame "^6.26.0" babel-generator "^6.26.0" @@ -485,6 +571,7 @@ babel-core@^6.14.0, babel-core@^6.26.0: babel-eslint@^8.2.6: version "8.2.6" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.6.tgz#6270d0c73205628067c0f7ae1693a9e797acefd9" + integrity sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA== dependencies: "@babel/code-frame" "7.0.0-beta.44" "@babel/traverse" "7.0.0-beta.44" @@ -496,6 +583,7 @@ babel-eslint@^8.2.6: babel-generator@^6.26.0: version "6.26.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== dependencies: babel-messages "^6.23.0" babel-runtime "^6.26.0" @@ -509,6 +597,7 @@ babel-generator@^6.26.0: babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= dependencies: babel-helper-explode-assignable-expression "^6.24.1" babel-runtime "^6.22.0" @@ -517,6 +606,7 @@ babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: babel-helper-call-delegate@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= dependencies: babel-helper-hoist-variables "^6.24.1" babel-runtime "^6.22.0" @@ -526,6 +616,7 @@ babel-helper-call-delegate@^6.24.1: babel-helper-define-map@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.26.0" @@ -535,6 +626,7 @@ babel-helper-define-map@^6.24.1: babel-helper-explode-assignable-expression@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= dependencies: babel-runtime "^6.22.0" babel-traverse "^6.24.1" @@ -543,6 +635,7 @@ babel-helper-explode-assignable-expression@^6.24.1: babel-helper-function-name@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= dependencies: babel-helper-get-function-arity "^6.24.1" babel-runtime "^6.22.0" @@ -553,6 +646,7 @@ babel-helper-function-name@^6.24.1: babel-helper-get-function-arity@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -560,6 +654,7 @@ babel-helper-get-function-arity@^6.24.1: babel-helper-hoist-variables@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -567,6 +662,7 @@ babel-helper-hoist-variables@^6.24.1: babel-helper-optimise-call-expression@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -574,6 +670,7 @@ babel-helper-optimise-call-expression@^6.24.1: babel-helper-regex@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= dependencies: babel-runtime "^6.26.0" babel-types "^6.26.0" @@ -582,6 +679,7 @@ babel-helper-regex@^6.24.1: babel-helper-remap-async-to-generator@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.22.0" @@ -592,6 +690,7 @@ babel-helper-remap-async-to-generator@^6.24.1: babel-helper-replace-supers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= dependencies: babel-helper-optimise-call-expression "^6.24.1" babel-messages "^6.23.0" @@ -603,6 +702,7 @@ babel-helper-replace-supers@^6.24.1: babel-helpers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= dependencies: babel-runtime "^6.22.0" babel-template "^6.24.1" @@ -610,66 +710,79 @@ babel-helpers@^6.24.1: babel-messages@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= dependencies: babel-runtime "^6.22.0" babel-plugin-check-es2015-constants@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= dependencies: babel-runtime "^6.22.0" babel-plugin-debug-macros@^0.1.10, babel-plugin-debug-macros@^0.1.11: version "0.1.11" resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.1.11.tgz#6c562bf561fccd406ce14ab04f42c218cf956605" + integrity sha512-hZw5qNNGAR02Y+yBUrtsnJHh8OXavkayPRqKGAXnIm4t5rWVpj3ArwsC7TWdpZsBguQvHAeyTxZ7s23yY60HHg== dependencies: semver "^5.3.0" babel-plugin-debug-macros@^0.2.0-beta.6: version "0.2.0-beta.6" resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.2.0-beta.6.tgz#ecdf6e408d5c863ab21740d7ad7f43f027d2f912" + integrity sha1-7N9uQI1chjqyF0DXrX9D8CfS+RI= dependencies: semver "^5.3.0" babel-plugin-ember-modules-api-polyfill@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.3.0.tgz#0c01f359658cfb9c797f705af6b09f6220205ae0" + integrity sha512-cv5ZimF5X52uW7Ul83UUxtsFZE6rZYkMv6qWnAeiDLT1/KtpVrTkJpwzDlvJ/FhKJZ43ih4GbFbhuhBKKT7vIw== dependencies: ember-rfc176-data "^0.3.0" babel-plugin-ember-modules-api-polyfill@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.3.2.tgz#56ea34bea963498d070a2b7dc2ce18a92c434093" + integrity sha512-mi9gaYasj2Bd6FYD1XCvuU1RL3n4DPn+VdOORyC2nqrvK50cLHkPaq/NdsqfxtZ0WNCIigrwnTHXU3XZI80tPg== dependencies: ember-rfc176-data "^0.3.0" babel-plugin-feature-flags@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/babel-plugin-feature-flags/-/babel-plugin-feature-flags-0.3.1.tgz#9c827cf9a4eb9a19f725ccb239e85cab02036fc1" + integrity sha1-nIJ8+aTrmhn3JcyyOehcqwIDb8E= babel-plugin-filter-imports@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-0.3.1.tgz#e7859b56886b175dd2616425d277b219e209ea8b" + integrity sha1-54WbVohrF13SYWQl0neyGeIJ6os= babel-plugin-htmlbars-inline-precompile@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.2.3.tgz#cd365e278af409bfa6be7704c4354beee742446b" + integrity sha1-zTZeJ4r0Cb+mvncExDVL7udCRGs= babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= babel-plugin-syntax-exponentiation-operator@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= babel-plugin-syntax-trailing-function-commas@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= babel-plugin-transform-async-to-generator@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= dependencies: babel-helper-remap-async-to-generator "^6.24.1" babel-plugin-syntax-async-functions "^6.8.0" @@ -678,18 +791,21 @@ babel-plugin-transform-async-to-generator@^6.22.0: babel-plugin-transform-es2015-arrow-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoping@^6.23.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= dependencies: babel-runtime "^6.26.0" babel-template "^6.26.0" @@ -700,6 +816,7 @@ babel-plugin-transform-es2015-block-scoping@^6.23.0: babel-plugin-transform-es2015-classes@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= dependencies: babel-helper-define-map "^6.24.1" babel-helper-function-name "^6.24.1" @@ -714,6 +831,7 @@ babel-plugin-transform-es2015-classes@^6.23.0: babel-plugin-transform-es2015-computed-properties@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= dependencies: babel-runtime "^6.22.0" babel-template "^6.24.1" @@ -721,12 +839,14 @@ babel-plugin-transform-es2015-computed-properties@^6.22.0: babel-plugin-transform-es2015-destructuring@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-duplicate-keys@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -734,12 +854,14 @@ babel-plugin-transform-es2015-duplicate-keys@^6.22.0: babel-plugin-transform-es2015-for-of@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-function-name@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.22.0" @@ -748,12 +870,14 @@ babel-plugin-transform-es2015-function-name@^6.22.0: babel-plugin-transform-es2015-literals@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= dependencies: babel-plugin-transform-es2015-modules-commonjs "^6.24.1" babel-runtime "^6.22.0" @@ -762,6 +886,7 @@ babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015 babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" + integrity sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo= dependencies: babel-plugin-transform-strict-mode "^6.24.1" babel-runtime "^6.26.0" @@ -771,6 +896,7 @@ babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-e babel-plugin-transform-es2015-modules-systemjs@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= dependencies: babel-helper-hoist-variables "^6.24.1" babel-runtime "^6.22.0" @@ -779,6 +905,7 @@ babel-plugin-transform-es2015-modules-systemjs@^6.23.0: babel-plugin-transform-es2015-modules-umd@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= dependencies: babel-plugin-transform-es2015-modules-amd "^6.24.1" babel-runtime "^6.22.0" @@ -787,6 +914,7 @@ babel-plugin-transform-es2015-modules-umd@^6.23.0: babel-plugin-transform-es2015-object-super@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= dependencies: babel-helper-replace-supers "^6.24.1" babel-runtime "^6.22.0" @@ -794,6 +922,7 @@ babel-plugin-transform-es2015-object-super@^6.22.0: babel-plugin-transform-es2015-parameters@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= dependencies: babel-helper-call-delegate "^6.24.1" babel-helper-get-function-arity "^6.24.1" @@ -805,6 +934,7 @@ babel-plugin-transform-es2015-parameters@^6.23.0: babel-plugin-transform-es2015-shorthand-properties@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -812,12 +942,14 @@ babel-plugin-transform-es2015-shorthand-properties@^6.22.0: babel-plugin-transform-es2015-spread@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-sticky-regex@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= dependencies: babel-helper-regex "^6.24.1" babel-runtime "^6.22.0" @@ -826,18 +958,21 @@ babel-plugin-transform-es2015-sticky-regex@^6.22.0: babel-plugin-transform-es2015-template-literals@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-typeof-symbol@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-unicode-regex@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= dependencies: babel-helper-regex "^6.24.1" babel-runtime "^6.22.0" @@ -846,6 +981,7 @@ babel-plugin-transform-es2015-unicode-regex@^6.22.0: babel-plugin-transform-exponentiation-operator@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= dependencies: babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" babel-plugin-syntax-exponentiation-operator "^6.8.0" @@ -854,12 +990,14 @@ babel-plugin-transform-exponentiation-operator@^6.22.0: babel-plugin-transform-regenerator@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= dependencies: regenerator-transform "^0.10.0" babel-plugin-transform-strict-mode@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -867,6 +1005,7 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-polyfill@^6.16.0, babel-polyfill@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= dependencies: babel-runtime "^6.26.0" core-js "^2.5.0" @@ -875,6 +1014,7 @@ babel-polyfill@^6.16.0, babel-polyfill@^6.26.0: babel-preset-env@^1.5.1: version "1.6.1" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" + integrity sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA== dependencies: babel-plugin-check-es2015-constants "^6.22.0" babel-plugin-syntax-trailing-function-commas "^6.22.0" @@ -910,6 +1050,7 @@ babel-preset-env@^1.5.1: babel-preset-env@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" + integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== dependencies: babel-plugin-check-es2015-constants "^6.22.0" babel-plugin-syntax-trailing-function-commas "^6.22.0" @@ -945,6 +1086,7 @@ babel-preset-env@^1.7.0: babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= dependencies: babel-core "^6.26.0" babel-runtime "^6.26.0" @@ -957,6 +1099,7 @@ babel-register@^6.26.0: babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= dependencies: core-js "^2.4.0" regenerator-runtime "^0.11.0" @@ -964,6 +1107,7 @@ babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: babel-template@^6.24.1, babel-template@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= dependencies: babel-runtime "^6.26.0" babel-traverse "^6.26.0" @@ -974,6 +1118,7 @@ babel-template@^6.24.1, babel-template@^6.26.0: babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= dependencies: babel-code-frame "^6.26.0" babel-messages "^6.23.0" @@ -988,6 +1133,7 @@ babel-traverse@^6.24.1, babel-traverse@^6.26.0: babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= dependencies: babel-runtime "^6.26.0" esutils "^2.0.2" @@ -997,44 +1143,54 @@ babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: babel6-plugin-strip-class-callcheck@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/babel6-plugin-strip-class-callcheck/-/babel6-plugin-strip-class-callcheck-6.0.0.tgz#de841c1abebbd39f78de0affb2c9a52ee228fddf" + integrity sha1-3oQcGr6705943gr/ssmlLuIo/d8= babel6-plugin-strip-heimdall@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/babel6-plugin-strip-heimdall/-/babel6-plugin-strip-heimdall-6.0.1.tgz#35f80eddec1f7fffdc009811dfbd46d9965072b6" + integrity sha1-NfgO3ewff//cAJgR371G2ZZQcrY= babylon@7.0.0-beta.44: version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" + integrity sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g== babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== backbone@^1.1.2: version "1.3.3" resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.3.3.tgz#4cc80ea7cb1631ac474889ce40f2f8bc683b2999" + integrity sha1-TMgOp8sWMaxHSInOQPL4vGg7KZk= dependencies: underscore ">=1.8.3" backo2@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= base64-arraybuffer@0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= base64id@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-0.1.0.tgz#02ce0fdeee0cef4f40080e1e73e834f0b1bfce3f" + integrity sha1-As4P3u4M709ACA4ec+g08LG/zj8= base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== dependencies: cache-base "^1.0.1" class-utils "^0.3.5" @@ -1047,50 +1203,60 @@ base@^0.11.1: basic-auth@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.0.tgz#015db3f353e02e56377755f962742e8981e7bbba" + integrity sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o= dependencies: safe-buffer "5.1.1" bcrypt-pbkdf@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + integrity sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40= dependencies: tweetnacl "^0.14.3" better-assert@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= dependencies: callsite "1.0.0" binary-extensions@^1.0.0: version "1.11.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" + integrity sha1-RqoXUftqL5PuXmibsQh9SxTGwgU= "binaryextensions@1 || 2": version "2.1.1" resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.1.tgz#3209a51ca4a4ad541a3b8d3d6a6d5b83a2485935" + integrity sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA== blank-object@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/blank-object/-/blank-object-1.0.2.tgz#f990793fbe9a8c8dd013fb3219420bec81d5f4b9" + integrity sha1-+ZB5P76ajI3QE/syGUIL7IHV9Lk= blob@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" + integrity sha1-vPEwUspURj8w+fx+lbmkdjCpSSE= block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= dependencies: inherits "~2.0.0" bluebird@^3.1.1, bluebird@^3.4.6: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" + integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== body-parser@1.18.2: version "1.18.2" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" + integrity sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ= dependencies: bytes "3.0.0" content-type "~1.0.4" @@ -1106,6 +1272,7 @@ body-parser@1.18.2: body@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/body/-/body-5.1.0.tgz#e4ba0ce410a46936323367609ecb4e6553125069" + integrity sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk= dependencies: continuable-cache "^0.3.1" error "^7.0.0" @@ -1115,24 +1282,28 @@ body@^5.1.0: boom@2.x.x: version "2.10.1" resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + integrity sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8= dependencies: hoek "2.x.x" boom@4.x.x: version "4.3.1" resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" + integrity sha1-T4owBctKfjiJ90kDD9JbluAdLjE= dependencies: hoek "4.x.x" boom@5.x.x: version "5.2.0" resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + integrity sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw== dependencies: hoek "4.x.x" bower-config@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/bower-config/-/bower-config-1.4.1.tgz#85fd9df367c2b8dbbd0caa4c5f2bad40cd84c2cc" + integrity sha1-hf2d82fCuNu9DKpMXyutQM2Ewsw= dependencies: graceful-fs "^4.1.3" mout "^1.0.0" @@ -1143,10 +1314,12 @@ bower-config@^1.3.0: bower-endpoint-parser@0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz#00b565adbfab6f2d35addde977e97962acbcb3f6" + integrity sha1-ALVlrb+rby01rd3pd+l5Yqy8s/Y= brace-expansion@^1.1.7: version "1.1.8" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + integrity sha1-wHshHHyVLsH479Uad+8NHTmQopI= dependencies: balanced-match "^1.0.0" concat-map "0.0.1" @@ -1154,6 +1327,7 @@ brace-expansion@^1.1.7: braces@^1.8.2: version "1.8.5" resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= dependencies: expand-range "^1.8.1" preserve "^0.2.0" @@ -1162,6 +1336,7 @@ braces@^1.8.2: braces@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.0.tgz#a46941cb5fb492156b3d6a656e06c35364e3e66e" + integrity sha512-P4O8UQRdGiMLWSizsApmXVQDBS6KCt7dSexgLKBmH5Hr1CZq7vsnscFh8oR1sP1ab1Zj0uCHCEzZeV6SfUf3rA== dependencies: arr-flatten "^1.1.0" array-unique "^0.3.2" @@ -1178,6 +1353,7 @@ braces@^2.3.0: broccoli-asset-rev@^2.4.5: version "2.6.0" resolved "https://registry.yarnpkg.com/broccoli-asset-rev/-/broccoli-asset-rev-2.6.0.tgz#0633fc3a0b2ba0c2c1d56fa9feb7b331fc83be6d" + integrity sha1-BjP8OgsroMLB1W+p/rezMfyDvm0= dependencies: broccoli-asset-rewrite "^1.1.0" broccoli-filter "^1.2.2" @@ -1188,12 +1364,14 @@ broccoli-asset-rev@^2.4.5: broccoli-asset-rewrite@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-asset-rewrite/-/broccoli-asset-rewrite-1.1.0.tgz#77a5da56157aa318c59113245e8bafb4617f8830" + integrity sha1-d6XaVhV6oxjFkRMkXouvtGF/iDA= dependencies: broccoli-filter "^1.2.3" broccoli-babel-transpiler@^6.0.0, broccoli-babel-transpiler@^6.1.2: version "6.1.4" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.1.4.tgz#8be8074c42abf2e17ff79b2d2a21df5c51143c82" + integrity sha512-h63g7iOBWdxj0GuZw8kNsyaD1T9weKsY3I+gp3rOefozbHwUesJ43vzLy0jj3t/rbiP2czcJAlyHS48EcRil8Q== dependencies: babel-core "^6.14.0" broccoli-funnel "^1.0.0" @@ -1209,6 +1387,7 @@ broccoli-babel-transpiler@^6.0.0, broccoli-babel-transpiler@^6.1.2: broccoli-babel-transpiler@^6.4.5, broccoli-babel-transpiler@^6.5.0: version "6.5.0" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.5.0.tgz#aa501a227b298a99742fdd0309b1eaad7124bba0" + integrity sha512-c5OLGY40Sdmv6rP230Jt8yoK49BHfOw1LXiDMu9EC9k2U6sqlpNRK78SzvByQ8IzKtBYUfeWCxeZHcvW+gH7VQ== dependencies: babel-core "^6.26.0" broccoli-funnel "^2.0.1" @@ -1224,12 +1403,14 @@ broccoli-babel-transpiler@^6.4.5, broccoli-babel-transpiler@^6.5.0: broccoli-brocfile-loader@^0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/broccoli-brocfile-loader/-/broccoli-brocfile-loader-0.18.0.tgz#2e86021c805c34ffc8d29a2fb721cf273e819e4b" + integrity sha1-LoYCHIBcNP/I0povtyHPJz6Bnks= dependencies: findup-sync "^0.4.2" broccoli-builder@^0.18.8: version "0.18.11" resolved "https://registry.yarnpkg.com/broccoli-builder/-/broccoli-builder-0.18.11.tgz#a42393c7b10bb0380df255a616307945f5e26efb" + integrity sha512-4Qa3uTev+adLRTEv2zO1M5dXSFCgywo8bCMxJ8vmas8q+dAIstc1eKnnymJgpejyuEJQAjgdhO1zxMQCrt03Ew== dependencies: heimdalljs "^0.2.0" promise-map-series "^0.2.1" @@ -1241,6 +1422,7 @@ broccoli-builder@^0.18.8: broccoli-caching-writer@^2.2.0: version "2.3.1" resolved "https://registry.yarnpkg.com/broccoli-caching-writer/-/broccoli-caching-writer-2.3.1.tgz#b93cf58f9264f003075868db05774f4e7f25bd07" + integrity sha1-uTz1j5Jk8AMHWGjbBXdPTn8lvQc= dependencies: broccoli-kitchen-sink-helpers "^0.2.5" broccoli-plugin "1.1.0" @@ -1252,6 +1434,7 @@ broccoli-caching-writer@^2.2.0: broccoli-caching-writer@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/broccoli-caching-writer/-/broccoli-caching-writer-3.0.3.tgz#0bd2c96a9738d6a6ab590f07ba35c5157d7db476" + integrity sha1-C9LJapc41qarWQ8HujXFFX19tHY= dependencies: broccoli-kitchen-sink-helpers "^0.3.1" broccoli-plugin "^1.2.1" @@ -1263,6 +1446,7 @@ broccoli-caching-writer@^3.0.3: broccoli-clean-css@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-clean-css/-/broccoli-clean-css-1.1.0.tgz#9db143d9af7e0ae79c26e3ac5a9bb2d720ea19fa" + integrity sha1-nbFD2a9+CuecJuOsWpuy1yDqGfo= dependencies: broccoli-persistent-filter "^1.1.6" clean-css-promise "^0.1.0" @@ -1272,6 +1456,7 @@ broccoli-clean-css@^1.1.0: broccoli-concat@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.2.2.tgz#86ffdc52606eb590ba9f6b894c5ec7a016f5b7b9" + integrity sha1-hv/cUmButZC6n2uJTF7HoBb1t7k= dependencies: broccoli-kitchen-sink-helpers "^0.3.1" broccoli-plugin "^1.3.0" @@ -1289,12 +1474,14 @@ broccoli-concat@^3.2.2: broccoli-config-loader@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/broccoli-config-loader/-/broccoli-config-loader-1.0.1.tgz#d10aaf8ebc0cb45c1da5baa82720e1d88d28c80a" + integrity sha512-MDKYQ50rxhn+g17DYdfzfEM9DjTuSGu42Db37A8TQHQe8geYEcUZ4SQqZRgzdAI3aRQNlA1yBHJfOeGmOjhLIg== dependencies: broccoli-caching-writer "^3.0.3" broccoli-config-replace@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/broccoli-config-replace/-/broccoli-config-replace-1.1.2.tgz#6ea879d92a5bad634d11329b51fc5f4aafda9c00" + integrity sha1-bqh52SpbrWNNETKbUfxfSq/anAA= dependencies: broccoli-kitchen-sink-helpers "^0.3.1" broccoli-plugin "^1.2.0" @@ -1304,6 +1491,7 @@ broccoli-config-replace@^1.1.2: broccoli-debug@^0.6.1, broccoli-debug@^0.6.2, broccoli-debug@^0.6.3, broccoli-debug@^0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.4.tgz#986eb3d2005e00e3bb91f9d0a10ab137210cd150" + integrity sha512-CixMUndBqTljCc26i6ubhBrGbAWXpWBsGJFce6ZOr76Tul2Ev1xxM0tmf7OjSzdYhkr5BrPd/CNbR9VMPi+NBg== dependencies: broccoli-plugin "^1.2.1" fs-tree-diff "^0.5.2" @@ -1315,6 +1503,7 @@ broccoli-debug@^0.6.1, broccoli-debug@^0.6.2, broccoli-debug@^0.6.3, broccoli-de broccoli-file-creator@^1.0.0, broccoli-file-creator@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/broccoli-file-creator/-/broccoli-file-creator-1.1.1.tgz#1b35b67d215abdfadd8d49eeb69493c39e6c3450" + integrity sha1-GzW2fSFavfrdjUnutpSTw55sNFA= dependencies: broccoli-kitchen-sink-helpers "~0.2.0" broccoli-plugin "^1.1.0" @@ -1326,6 +1515,7 @@ broccoli-file-creator@^1.0.0, broccoli-file-creator@^1.1.1: broccoli-filter@^1.2.2, broccoli-filter@^1.2.3: version "1.2.4" resolved "https://registry.yarnpkg.com/broccoli-filter/-/broccoli-filter-1.2.4.tgz#409afb94b9a3a6da9fac8134e91e205f40cc7330" + integrity sha1-QJr7lLmjptqfrIE06R4gX0DMczA= dependencies: broccoli-kitchen-sink-helpers "^0.3.1" broccoli-plugin "^1.0.0" @@ -1340,10 +1530,12 @@ broccoli-filter@^1.2.2, broccoli-filter@^1.2.3: broccoli-funnel-reducer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/broccoli-funnel-reducer/-/broccoli-funnel-reducer-1.0.0.tgz#11365b2a785aec9b17972a36df87eef24c5cc0ea" + integrity sha1-ETZbKnha7JsXlyo234fu8kxcwOo= broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.2, broccoli-funnel@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-1.2.0.tgz#cddc3afc5ff1685a8023488fff74ce6fb5a51296" + integrity sha1-zdw6/F/xaFqAI0iP/3TOb7WlEpY= dependencies: array-equal "^1.0.0" blank-object "^1.0.1" @@ -1363,6 +1555,7 @@ broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.2, broccoli broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-2.0.1.tgz#6823c73b675ef78fffa7ab800f083e768b51d449" + integrity sha512-C8Lnp9TVsSSiZMGEF16C0dCiNg2oJqUKwuZ1K4kVC6qRPG/2Cj/rtB5kRCC9qEbwqhX71bDbfHROx0L3J7zXQg== dependencies: array-equal "^1.0.0" blank-object "^1.0.1" @@ -1381,6 +1574,7 @@ broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1: broccoli-kitchen-sink-helpers@^0.2.5, broccoli-kitchen-sink-helpers@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz#a5e0986ed8d76fb5984b68c3f0450d3a96e36ecc" + integrity sha1-peCYbtjXb7WYS2jD8EUNOpbjbsw= dependencies: glob "^5.0.10" mkdirp "^0.5.1" @@ -1388,6 +1582,7 @@ broccoli-kitchen-sink-helpers@^0.2.5, broccoli-kitchen-sink-helpers@~0.2.0: broccoli-kitchen-sink-helpers@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.3.1.tgz#77c7c18194b9664163ec4fcee2793444926e0c06" + integrity sha1-d8fBgZS5ZkFj7E/O4nk0RJJuDAY= dependencies: glob "^5.0.10" mkdirp "^0.5.1" @@ -1395,6 +1590,7 @@ broccoli-kitchen-sink-helpers@^0.3.1: broccoli-lint-eslint@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/broccoli-lint-eslint/-/broccoli-lint-eslint-4.2.1.tgz#f780dc083a7357a9746a9cfa8f76feb092777477" + integrity sha512-Jvm06UvuMPa5gEH+9/Sb+QpoIodDAYzbyIUEqxniPCdA6JJooa91hQDCTJc32RUV46JNMcLhb3Dl55BdA8v5mw== dependencies: aot-test-generators "^0.1.0" broccoli-concat "^3.2.2" @@ -1407,6 +1603,7 @@ broccoli-lint-eslint@^4.2.1: broccoli-merge-trees@^1.0.0, broccoli-merge-trees@^1.1.0, broccoli-merge-trees@^1.1.1: version "1.2.4" resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-1.2.4.tgz#a001519bb5067f06589d91afa2942445a2d0fdb5" + integrity sha1-oAFRm7UGfwZYnZGvopQkRaLQ/bU= dependencies: broccoli-plugin "^1.3.0" can-symlink "^1.0.0" @@ -1420,6 +1617,7 @@ broccoli-merge-trees@^1.0.0, broccoli-merge-trees@^1.1.0, broccoli-merge-trees@^ broccoli-merge-trees@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-2.0.0.tgz#10aea46dd5cebcc8b8f7d5a54f0a84a4f0bb90b9" + integrity sha1-EK6kbdXOvMi499WlTwqEpPC7kLk= dependencies: broccoli-plugin "^1.3.0" merge-trees "^1.0.1" @@ -1427,6 +1625,7 @@ broccoli-merge-trees@^2.0.0: broccoli-middleware@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/broccoli-middleware/-/broccoli-middleware-1.0.0.tgz#92f4e1fb9a791ea986245a7077f35cc648dab097" + integrity sha1-kvTh+5p5HqmGJFpwd/NcxkjasJc= dependencies: handlebars "^4.0.4" mime "^1.2.11" @@ -1434,10 +1633,12 @@ broccoli-middleware@^1.0.0: broccoli-node-info@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-1.1.0.tgz#3aa2e31e07e5bdb516dd25214f7c45ba1c459412" + integrity sha1-OqLjHgflvbUW3SUhT3xFuhxFlBI= broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.4.0, broccoli-persistent-filter@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.3.tgz#3511bc52fc53740cda51621f58a28152d9911bc1" + integrity sha512-JwNLDvvXJlhUmr+CHcbVhCyp33NbCIAITjQZmJY9e8QzANXh3jpFWlhSFvkWghwKA8rTAKcXkW12agtiZjxr4g== dependencies: async-disk-cache "^1.2.1" async-promise-queue "^1.0.3" @@ -1456,6 +1657,7 @@ broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-p broccoli-plugin@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.1.0.tgz#73e2cfa05f8ea1e3fc1420c40c3d9e7dc724bf02" + integrity sha1-c+LPoF+OoeP8FCDEDD2efcckvwI= dependencies: promise-map-series "^0.2.1" quick-temp "^0.1.3" @@ -1465,6 +1667,7 @@ broccoli-plugin@1.1.0: broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli-plugin@^1.2.1, broccoli-plugin@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.0.tgz#bee704a8e42da08cb58e513aaa436efb7f0ef1ee" + integrity sha1-vucEqOQtoIy1jlE6qkNu+38O8e4= dependencies: promise-map-series "^0.2.1" quick-temp "^0.1.3" @@ -1474,20 +1677,24 @@ broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli broccoli-slow-trees@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-2.0.0.tgz#9741afe992787add64aec7f7c8211dfcc058278d" + integrity sha1-l0Gv6ZJ4et1krsf3yCEd/MBYJ40= broccoli-slow-trees@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-3.0.1.tgz#9bf2a9e2f8eb3ed3a3f2abdde988da437ccdc9b4" + integrity sha1-m/Kp4vjrPtOj8qvd6YjaQ3zNybQ= dependencies: heimdalljs "^0.2.1" broccoli-source@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-source/-/broccoli-source-1.1.0.tgz#54f0e82c8b73f46580cbbc4f578f0b32fca8f809" + integrity sha1-VPDoLItz9GWAy7xPV48LMvyo+Ak= broccoli-sri-hash@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/broccoli-sri-hash/-/broccoli-sri-hash-2.1.2.tgz#bc69905ed7a381ad325cc0d02ded071328ebf3f3" + integrity sha1-vGmQXtejga0yXMDQLe0HEyjr8/M= dependencies: broccoli-caching-writer "^2.2.0" mkdirp "^0.5.1" @@ -1498,6 +1705,7 @@ broccoli-sri-hash@^2.1.0: broccoli-stew@^1.2.0, broccoli-stew@^1.3.3, broccoli-stew@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-1.5.0.tgz#d7af8c18511dce510e49d308a62e5977f461883c" + integrity sha1-16+MGFEdzlEOSdMIpi5Zd/RhiDw= dependencies: broccoli-debug "^0.6.1" broccoli-funnel "^1.0.1" @@ -1517,6 +1725,7 @@ broccoli-stew@^1.2.0, broccoli-stew@^1.3.3, broccoli-stew@^1.5.0: broccoli-string-replace@^0.1.1, broccoli-string-replace@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/broccoli-string-replace/-/broccoli-string-replace-0.1.2.tgz#1ed92f85680af8d503023925e754e4e33676b91f" + integrity sha1-HtkvhWgK+NUDAjkl51Tk4zZ2uR8= dependencies: broccoli-persistent-filter "^1.1.5" minimatch "^3.0.3" @@ -1524,6 +1733,7 @@ broccoli-string-replace@^0.1.1, broccoli-string-replace@^0.1.2: broccoli-test-helper@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/broccoli-test-helper/-/broccoli-test-helper-1.3.0.tgz#ba673418b3963b2cc466be66092a5928700c827f" + integrity sha512-IhFjcETHOSDAXY8afLLcihdXbAgcQ2b3lp9nZ5saYzoXJvt/1RMUlCm8JxKKPU7aHqpNXMVaj5lm4Is+4xh/qA== dependencies: broccoli "^1.1.0" fixturify "^0.3.2" @@ -1535,6 +1745,7 @@ broccoli-test-helper@^1.3.0: broccoli-uglify-sourcemap@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/broccoli-uglify-sourcemap/-/broccoli-uglify-sourcemap-2.0.2.tgz#f4a73112f1f56b46043e2e89cba5ce7762cddeb3" + integrity sha512-Fe+qUlPC4gHG7ojQOaRSRrCbrI2niYNAfrZqLkPEXHCi8UtwEqMHBAK6AZylN7ve/0CkGNSxKhCm7ELeeJRI+A== dependencies: broccoli-plugin "^1.2.1" debug "^3.1.0" @@ -1549,6 +1760,7 @@ broccoli-uglify-sourcemap@^2.0.0: broccoli-writer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/broccoli-writer/-/broccoli-writer-0.1.1.tgz#d4d71aa8f2afbc67a3866b91a2da79084b96ab2d" + integrity sha1-1NcaqPKvvGejhmuRotp5CEuWqy0= dependencies: quick-temp "^0.1.0" rsvp "^3.0.6" @@ -1556,6 +1768,7 @@ broccoli-writer@~0.1.1: broccoli@^1.1.0: version "1.1.4" resolved "https://registry.yarnpkg.com/broccoli/-/broccoli-1.1.4.tgz#b023b028b866f447ed14341007961efd03f7251c" + integrity sha1-sCOwKLhm9EftFDQQB5Ye/QP3JRw= dependencies: broccoli-node-info "1.1.0" broccoli-slow-trees "2.0.0" @@ -1576,14 +1789,17 @@ broccoli@^1.1.0: browser-process-hrtime@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" + integrity sha1-Ql1opY00R/AqBKqJQYf86K+Le44= browser-stdout@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + integrity sha1-81HTKWnTL6XXpVZxVCY9korjvR8= browserslist@^2.1.2: version "2.11.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" + integrity sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA== dependencies: caniuse-lite "^1.0.30000792" electron-to-chromium "^1.3.30" @@ -1591,6 +1807,7 @@ browserslist@^2.1.2: browserslist@^3.2.6: version "3.2.8" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== dependencies: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" @@ -1598,32 +1815,39 @@ browserslist@^3.2.6: bser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + integrity sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk= dependencies: node-int64 "^0.4.0" buffer-from@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" + integrity sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ== builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= bytes@1: version "1.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8" + integrity sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g= bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== dependencies: collection-visit "^1.0.0" component-emitter "^1.2.1" @@ -1638,26 +1862,31 @@ cache-base@^1.0.1: calculate-cache-key-for-tree@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-1.1.0.tgz#0c3e42c9c134f3c9de5358c0f16793627ea976d6" + integrity sha1-DD5CycE088neU1jA8WeTYn6pdtY= dependencies: json-stable-stringify "^1.0.1" caller-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= dependencies: callsites "^0.2.0" callsite@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= dependencies: camelcase "^2.0.0" map-obj "^1.0.0" @@ -1665,34 +1894,41 @@ camelcase-keys@^2.0.0: camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= can-symlink@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/can-symlink/-/can-symlink-1.0.0.tgz#97b607d8a84bb6c6e228b902d864ecb594b9d219" + integrity sha1-l7YH2KhLtsbiKLkC2GTstZS50hk= dependencies: tmp "0.0.28" caniuse-lite@^1.0.30000792: version "1.0.30000803" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000803.tgz#9939c37149d38d5f4540430490d240c03106a0f5" + integrity sha512-AoROHIFLv2iv5CG4nonOfT9ZCQ3JTN0GyEn8LG2sPb2Wc5cIyX/UwLYP0pnVajVF3LWH+mrO/DXBzmte0BK9cQ== caniuse-lite@^1.0.30000844: version "1.0.30000865" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25" + integrity sha512-vs79o1mOSKRGv/1pSkp4EXgl4ZviWeYReXw60XfacPU64uQWZwJT6vZNmxRF9O+6zu71sJwMxLK5JXxbzuVrLw== capture-exit@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" + integrity sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28= dependencies: rsvp "^3.3.3" cardinal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-1.0.0.tgz#50e21c1b0aa37729f9377def196b5a9cec932ee9" + integrity sha1-UOIcGwqjdyn5N33vGWtanOyTLuk= dependencies: ansicolors "~0.2.1" redeyed "~1.0.0" @@ -1700,10 +1936,12 @@ cardinal@^1.0.0: caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= center-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= dependencies: align-text "^0.1.3" lazy-cache "^1.0.3" @@ -1711,6 +1949,7 @@ center-align@^0.1.1: chai@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" + integrity sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw= dependencies: assertion-error "^1.0.1" check-error "^1.0.1" @@ -1722,6 +1961,7 @@ chai@^4.1.0: chalk@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" + integrity sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ= dependencies: ansi-styles "^1.1.0" escape-string-regexp "^1.0.0" @@ -1732,6 +1972,7 @@ chalk@^0.5.1: chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -1742,6 +1983,7 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" + integrity sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q== dependencies: ansi-styles "^3.1.0" escape-string-regexp "^1.0.5" @@ -1750,6 +1992,7 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: chalk@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796" + integrity sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g== dependencies: ansi-styles "^3.2.0" escape-string-regexp "^1.0.5" @@ -1758,20 +2001,24 @@ chalk@^2.3.0: chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= charm@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/charm/-/charm-1.0.2.tgz#8add367153a6d9a581331052c4090991da995e35" + integrity sha1-it02cVOm2aWBMxBSxAkJkdqZXjU= dependencies: inherits "^2.0.1" check-error@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= chokidar@1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= dependencies: anymatch "^1.3.0" async-each "^1.0.0" @@ -1787,10 +2034,12 @@ chokidar@1.7.0: circular-json@^0.3.1: version "0.3.3" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== dependencies: arr-union "^3.1.0" define-property "^0.2.5" @@ -1800,10 +2049,12 @@ class-utils@^0.3.5: clean-base-url@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clean-base-url/-/clean-base-url-1.0.0.tgz#c901cf0a20b972435b0eccd52d056824a4351b7b" + integrity sha1-yQHPCiC5ckNbDszVLQVoJKQ1G3s= clean-css-promise@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/clean-css-promise/-/clean-css-promise-0.1.1.tgz#43f3d2c8dfcb2bf071481252cd9b76433c08eecb" + integrity sha1-Q/PSyN/LK/BxSBJSzZt2QzwI7ss= dependencies: array-to-error "^1.0.0" clean-css "^3.4.5" @@ -1812,6 +2063,7 @@ clean-css-promise@^0.1.0: clean-css@^3.4.5: version "3.4.28" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.4.28.tgz#bf1945e82fc808f55695e6ddeaec01400efd03ff" + integrity sha1-vxlF6C/ICPVWlebd6uwBQA79A/8= dependencies: commander "2.8.x" source-map "0.4.x" @@ -1819,22 +2071,26 @@ clean-css@^3.4.5: cli-cursor@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc= dependencies: restore-cursor "^1.0.1" cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= dependencies: restore-cursor "^2.0.0" cli-spinners@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.1.0.tgz#f1847b168844d917a671eb9d147e3df497c90d06" + integrity sha1-8YR7FohE2RemceudFH499JfJDQY= cli-table2@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/cli-table2/-/cli-table2-0.2.0.tgz#2d1ef7f218a0e786e214540562d4bd177fe32d97" + integrity sha1-LR738hig54biFFQFYtS9F3/jLZc= dependencies: lodash "^3.10.1" string-width "^1.0.1" @@ -1844,16 +2100,19 @@ cli-table2@^0.2.0: cli-table@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + integrity sha1-9TsFJmqLGguTSz0IIebi3FkUriM= dependencies: colors "1.0.3" cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= cliui@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= dependencies: center-align "^0.1.1" right-align "^0.1.1" @@ -1862,18 +2121,22 @@ cliui@^2.1.0: clone@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" + integrity sha1-0hfR6WERjjrJpLi7oyhVU79kfNs= co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= dependencies: map-visit "^1.0.0" object-visit "^1.0.0" @@ -1881,86 +2144,104 @@ collection-visit@^1.0.0: color-convert@^1.9.0: version "1.9.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" + integrity sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ== dependencies: color-name "^1.1.1" color-name@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= colors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= colors@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= combined-stream@^1.0.5, combined-stream@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + integrity sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk= dependencies: delayed-stream "~1.0.0" commander@2.12.2: version "2.12.2" resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555" + integrity sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA== commander@2.8.x: version "2.8.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" + integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ= dependencies: graceful-readlink ">= 1.0.0" commander@2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q= dependencies: graceful-readlink ">= 1.0.0" commander@^2.5.0: version "2.16.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" + integrity sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew== commander@^2.6.0: version "2.14.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.0.tgz#7b25325963e6aace20d3a9285b09379b0c2208b5" + integrity sha512-okPpdvdJr6mUGi2XzupC+irQxzwGLVaBzacFC14hjLv8NColXEsxsU+QaeuSSXpQUak5g2K0vQ7WjA1e8svczg== commander@~2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== common-tags@^1.4.0: version "1.7.2" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.7.2.tgz#24d9768c63d253a56ecff93845b44b4df1d52771" + integrity sha512-joj9ZlUOjCrwdbmiLqafeUSgkUM74NqhLsZtSqDmhKudaIY197zTrb8JMl31fMnCUuxwFT23eC/oWvrZzDLRJQ== dependencies: babel-runtime "^6.26.0" component-bind@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= component-emitter@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" + integrity sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM= component-emitter@1.2.1, component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= component-inherit@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= compressible@~2.0.11: version "2.0.12" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.12.tgz#c59a5c99db76767e9876500e271ef63b3493bd66" + integrity sha1-xZpcmdt2dn6YdlAOJx72OzSTvWY= dependencies: mime-db ">= 1.30.0 < 2" compression@^1.4.4: version "1.7.1" resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.1.tgz#eff2603efc2e22cf86f35d2eb93589f9875373db" + integrity sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s= dependencies: accepts "~1.3.4" bytes "3.0.0" @@ -1973,10 +2254,12 @@ compression@^1.4.4: concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= concat-stream@^1.4.7, concat-stream@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + integrity sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc= dependencies: inherits "^2.0.3" readable-stream "^2.2.2" @@ -1985,6 +2268,7 @@ concat-stream@^1.4.7, concat-stream@^1.6.0: configstore@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" + integrity sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw== dependencies: dot-prop "^4.1.0" graceful-fs "^4.1.2" @@ -1996,6 +2280,7 @@ configstore@^3.0.0: connect@^3.3.3: version "3.6.6" resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" + integrity sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ= dependencies: debug "2.6.9" finalhandler "1.1.0" @@ -2005,10 +2290,12 @@ connect@^3.3.3: console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= console-ui@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/console-ui/-/console-ui-2.1.0.tgz#e1d5279d27621a75123d7d594f9fa59f866ea3e3" + integrity sha512-/FqFHRwYVjjdeLd/1lhRsyoPCMtDMREJfPU6WCN9LMxPWu3++Cr2wN1uIZfbefVwr59is4UBd6Z2vaJRzTyPWQ== dependencies: chalk "^2.1.0" inquirer "^2" @@ -2020,72 +2307,88 @@ console-ui@^2.0.0: consolidate@^0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.14.5.tgz#5a25047bc76f73072667c8cb52c989888f494c63" + integrity sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM= dependencies: bluebird "^3.1.1" content-disposition@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= content-type-parser@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" + integrity sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ== content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== continuable-cache@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f" + integrity sha1-vXJ6f67XfnH/OYWskzUakSczrQ8= convert-source-map@^1.5.0, convert-source-map@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + integrity sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU= cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= cookie@0.3.1, cookie@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= copy-dereference@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/copy-dereference/-/copy-dereference-1.0.0.tgz#6b131865420fd81b413ba994b44d3655311152b6" + integrity sha1-axMYZUIP2BtBO6mUtE02VTERUrY= copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js@^2.4.0, core-js@^2.5.0: version "2.5.3" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" + integrity sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4= core-object@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/core-object/-/core-object-1.1.0.tgz#86d63918733cf9da1a5aae729e62c0a88e66ad0a" + integrity sha1-htY5GHM8+doaWq5ynmLAqI5mrQo= core-object@^2.0.6: version "2.1.1" resolved "https://registry.yarnpkg.com/core-object/-/core-object-2.1.1.tgz#4b7a5f1edefcb1e6d0dcb58eab1b9f90bfc666a8" + integrity sha1-S3pfHt78sebQ3LWOqxufkL/GZqg= dependencies: chalk "^1.1.3" core-object@^3.1.3: version "3.1.5" resolved "https://registry.yarnpkg.com/core-object/-/core-object-3.1.5.tgz#fa627b87502adc98045e44678e9a8ec3b9c0d2a9" + integrity sha512-sA2/4+/PZ/KV6CKgjrVrrUVBKCkdDO02CUlQ0YKTQoYUwPYNOtOAcWlbYhd5v/1JqYaA6oZ4sDlOU4ppVw6Wbg== dependencies: chalk "^2.0.0" core-util-is@1.0.2, 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" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= cpr@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cpr/-/cpr-2.2.0.tgz#2dc6c87dfb78012489cdd994227628c320e9a17b" + integrity sha512-q8UoWzIT9rslJKb3Y5CcByzR2zX7GBkVcoU6jJx02d/BgbE7zJ8Aix74i7bw3iYk58TrgXhmB2XB0aGaBd7oZA== dependencies: graceful-fs "^4.1.5" minimist "^1.2.0" @@ -2095,6 +2398,7 @@ cpr@^2.0.0: cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= dependencies: lru-cache "^4.0.1" shebang-command "^1.2.0" @@ -2103,54 +2407,64 @@ cross-spawn@^5.0.1, cross-spawn@^5.1.0: cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + integrity sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g= dependencies: boom "2.x.x" cryptiles@3.x.x: version "3.1.2" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" + integrity sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4= dependencies: boom "5.x.x" crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": version "0.3.2" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + integrity sha1-uANhcMefB6kP8vFuIihAJ6JDhIs= "cssstyle@>= 0.2.37 < 0.3.0": version "0.2.37" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + integrity sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ= dependencies: cssom "0.3.x" cssstyle@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.0.0.tgz#79b16d51ec5591faec60e688891f15d2a5705129" + integrity sha512-Bpuh47j2mRMY60X90mXaJAEtJwxvA2roZzbgwAXYhMbmwmakdRr4Cq9L5SkleKJNLOKqHIa2YWyOXDX3VgggSQ== dependencies: cssom "0.3.x" currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= dependencies: array-find-index "^1.0.1" dag-map@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/dag-map/-/dag-map-2.0.2.tgz#9714b472de82a1843de2fba9b6876938cab44c68" + integrity sha1-lxS0ct6CoYQ94vuptodpOMq0TGg= dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= dependencies: assert-plus "^1.0.0" data-urls@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f" + integrity sha512-ai40PPQR0Fn1lD2PPie79CibnlMN2AYiDhwFX/rZHVsxbs5kNJSjegqXIprhouGXlRdEnfybva7kqRGnB6mypA== dependencies: abab "^1.0.4" whatwg-mimetype "^2.0.0" @@ -2159,70 +2473,83 @@ data-urls@^1.0.0: debug@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + integrity sha1-+HBX6ZWxofauaklgZkE3vFbwOdo= dependencies: ms "0.7.1" debug@2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" + integrity sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w= dependencies: ms "0.7.2" debug@2.6.8: version "2.6.8" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + integrity sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw= dependencies: ms "2.0.0" debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.4.0, debug@^2.6.8, debug@~2.6.7: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" debug@^3.0.0, debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" decamelize@^1.0.0, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= deep-eql@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== dependencies: type-detect "^4.0.0" deep-extend@~0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + integrity sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8= deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= dependencies: is-descriptor "^1.0.0" del@^2.0.2: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= dependencies: globby "^5.0.0" is-path-cwd "^1.0.0" @@ -2235,100 +2562,121 @@ del@^2.0.2: delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= depd@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + integrity sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k= depd@~1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= detect-file@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" + integrity sha1-STXe39lIhkjgBrASlWbpOGcR6mM= dependencies: fs-exists-sync "^0.1.0" detect-file@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= dependencies: repeating "^2.0.0" detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= diff@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + integrity sha1-yc45Okt8vQsFinJck98pkCeGj/k= diff@^3.2.0: version "3.4.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" + integrity sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA== doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" domexception@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== dependencies: webidl-conversions "^4.0.2" dot-prop@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== dependencies: is-obj "^1.0.0" ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + integrity sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU= dependencies: jsbn "~0.1.0" editions@^1.1.1: version "1.3.4" resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" + integrity sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg== ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= electron-to-chromium@^1.3.30: version "1.3.32" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.32.tgz#11d0684c0840e003c4be8928f8ac5f35dbc2b4e6" + integrity sha1-EdBoTAhA4APEvoko+KxfNdvCtOY= electron-to-chromium@^1.3.47: version "1.3.52" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0" + integrity sha1-0tnxJwuko7lnuDHEDvcftNmrXOA= ember-ajax@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-3.0.0.tgz#8f21e9da0c1d433cf879aa855fce464d517e9ab5" + integrity sha1-jyHp2gwdQzz4eaqFX85GTVF+mrU= dependencies: ember-cli-babel "^6.0.0" ember-cli-addon-tests@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/ember-cli-addon-tests/-/ember-cli-addon-tests-0.7.1.tgz#6959c4cce1a9d16a4852465e2b2bed4bf26b46ec" + integrity sha1-aVnEzOGp0WpIUkZeKyvtS/JrRuw= dependencies: chalk "^2.0.1" cpr "^2.0.0" @@ -2347,6 +2695,7 @@ ember-cli-addon-tests@^0.7.0: ember-cli-app-version@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-cli-app-version/-/ember-cli-app-version-2.1.0.tgz#149101d4fd0d97875e12ec5e61ff105f508e5e2d" + integrity sha1-FJEB1P0Nl4deEuxeYf8QX1COXi0= dependencies: ember-cli-babel "^6.8.0" git-repo-version "0.4.1" @@ -2354,6 +2703,7 @@ ember-cli-app-version@^2.0.0: ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2, ember-cli-babel@^6.9.0: version "6.11.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.11.0.tgz#79cb184bac3c05bfe181ddc306bac100ab1f9493" + integrity sha512-lHQyl30lbAsMmMq2it1GO85HKrqr2gMpK5CFxmOgTJ3moBqOGMKsdV3Z0qXWpgh8Asy7pB9AACMShdgfQvSGPg== dependencies: amd-name-resolver "0.0.7" babel-plugin-debug-macros "^0.1.11" @@ -2390,6 +2740,7 @@ ember-cli-babel@^6.6.0: ember-cli-babel@^6.7.2: version "6.16.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.16.0.tgz#623b4a2764ece72b65f1572fc8aeb5714a450228" + integrity sha512-rzWkVdKVk2KSbQ81TxmLli+LWdBEqF+FHE83rUQXVOV4FguJDtP1w2AW08f8QjuztbnQ5+VUGCb7H0dL8UwOVw== dependencies: amd-name-resolver "1.2.0" babel-plugin-debug-macros "^0.2.0-beta.6" @@ -2408,6 +2759,7 @@ ember-cli-babel@^6.7.2: ember-cli-broccoli-sane-watcher@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.0.4.tgz#f43f42f75b7509c212fb926cd9aea86ae19264c6" + integrity sha1-9D9C91t1CcIS+5Js2a6oauGSZMY= dependencies: broccoli-slow-trees "^3.0.1" heimdalljs "^0.2.1" @@ -2418,6 +2770,7 @@ ember-cli-broccoli-sane-watcher@^2.0.4: ember-cli-dependency-checker@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-2.1.0.tgz#9d66286a7c778e94733eaf21320d129c4fd0dd64" + integrity sha1-nWYoanx3jpRzPq8hMg0SnE/Q3WQ= dependencies: chalk "^1.1.3" is-git-url "^1.0.0" @@ -2427,6 +2780,7 @@ ember-cli-dependency-checker@^2.0.0: ember-cli-eslint@^4.2.1: version "4.2.3" resolved "https://registry.yarnpkg.com/ember-cli-eslint/-/ember-cli-eslint-4.2.3.tgz#2844d3f5e8184f19b2d7132ba99eb0b370b55598" + integrity sha512-1fqRz9QVLTT790Zr07aDFmAprZ1vVsaBGJOGQgDEFmBpogq8BeaQopaxogWFp748hol8nGC4QP5tbzhVD6KQHw== dependencies: broccoli-lint-eslint "^4.2.1" ember-cli-version-checker "^2.1.0" @@ -2436,6 +2790,7 @@ ember-cli-eslint@^4.2.1: ember-cli-fastboot@^1.1.4-beta.1: version "1.1.4-beta.1" resolved "https://registry.yarnpkg.com/ember-cli-fastboot/-/ember-cli-fastboot-1.1.4-beta.1.tgz#7063df36e62b92fd0f60c9a23dd03b5b57aec3fe" + integrity sha512-Jx9txTOGX0wgbg3d6N5oy2PSI9FI31tg4KiMY5vtXL3GuEi0S+HLCvh/w+INy+Ka3WLFcjutCdow23VL4gzDoQ== dependencies: broccoli-concat "^3.2.2" broccoli-funnel "^2.0.0" @@ -2457,14 +2812,17 @@ ember-cli-fastboot@^1.1.4-beta.1: ember-cli-get-component-path-option@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-get-component-path-option/-/ember-cli-get-component-path-option-1.0.0.tgz#0d7b595559e2f9050abed804f1d8eff1b08bc771" + integrity sha1-DXtZVVni+QUKvtgE8djv8bCLx3E= ember-cli-get-dependency-depth@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-get-dependency-depth/-/ember-cli-get-dependency-depth-1.0.0.tgz#e0afecf82a2d52f00f28ab468295281aec368d11" + integrity sha1-4K/s+CotUvAPKKtGgpUoGuw2jRE= ember-cli-htmlbars-inline-precompile@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-1.0.2.tgz#5b544f664d5d9911f08cd979c5f70d8cb0ca2add" + integrity sha1-W1RPZk1dmRHwjNl5xfcNjLDKKt0= dependencies: babel-plugin-htmlbars-inline-precompile "^0.2.3" ember-cli-version-checker "^2.0.0" @@ -2475,6 +2833,7 @@ ember-cli-htmlbars-inline-precompile@^1.0.0: ember-cli-htmlbars@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.3.tgz#e116e1500dba12f29c94b05b9ec90f52cb8bb042" + integrity sha512-oyWtJebOwxAqWZwMc0NKFJ8FJdxVixM7zl0FaXq1vTAG6bOgnU7yAhXEASlaO5f+PptZueZfOpdpvRwZW/Gk1A== dependencies: broccoli-persistent-filter "^1.0.3" hash-for-dep "^1.0.2" @@ -2484,14 +2843,17 @@ ember-cli-htmlbars@^2.0.1: ember-cli-inject-live-reload@^1.4.1: version "1.7.0" resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-1.7.0.tgz#af94336e015336127dfb98080ad442bb233e37ed" + integrity sha512-+0zOwJlf4iR5NcvyeU7E7xU1qDfniP/+mXfNTfAEhHO2eE9sjQvasKV84O1sIIyLk2LMIjFPbGt7uv5fQcIGwg== ember-cli-is-package-missing@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-is-package-missing/-/ember-cli-is-package-missing-1.0.0.tgz#6e6184cafb92635dd93ca6c946b104292d4e3390" + integrity sha1-bmGEyvuSY13ZPKbJRrEEKS1OM5A= ember-cli-legacy-blueprints@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/ember-cli-legacy-blueprints/-/ember-cli-legacy-blueprints-0.2.1.tgz#480f37cb83f1eda2d46bbc7d07c59ea2e8ce9b84" + integrity sha1-SA83y4Px7aLUa7x9B8WeoujOm4Q= dependencies: chalk "^2.3.0" ember-cli-get-component-path-option "^1.0.0" @@ -2514,14 +2876,17 @@ ember-cli-legacy-blueprints@^0.2.0: ember-cli-lodash-subset@2.0.1, ember-cli-lodash-subset@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-2.0.1.tgz#20cb68a790fe0fde2488ddfd8efbb7df6fe766f2" + integrity sha1-IMtop5D+D94kiN39jvu332/nZvI= ember-cli-lodash-subset@^1.0.7: version "1.0.12" resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-1.0.12.tgz#af2e77eba5dcb0d77f3308d3a6fd7d3450f6e537" + integrity sha1-ry5366XcsNd/MwjTpv19NFD25Tc= ember-cli-node-assets@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/ember-cli-node-assets/-/ember-cli-node-assets-0.2.2.tgz#d2d55626e7cc6619f882d7fe55751f9266022708" + integrity sha1-0tVWJufMZhn4gtf+VXUfkmYCJwg= dependencies: broccoli-funnel "^1.0.1" broccoli-merge-trees "^1.1.1" @@ -2533,16 +2898,19 @@ ember-cli-node-assets@^0.2.2: ember-cli-normalize-entity-name@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-normalize-entity-name/-/ember-cli-normalize-entity-name-1.0.0.tgz#0b14f7bcbc599aa117b5fddc81e4fd03c4bad5b7" + integrity sha1-CxT3vLxZmqEXtf3cgeT9A8S61bc= dependencies: silent-error "^1.0.0" ember-cli-path-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-path-utils/-/ember-cli-path-utils-1.0.0.tgz#4e39af8b55301cddc5017739b77a804fba2071ed" + integrity sha1-Tjmvi1UwHN3FAXc5t3qAT7ogce0= ember-cli-preprocess-registry@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/ember-cli-preprocess-registry/-/ember-cli-preprocess-registry-3.1.1.tgz#38456c21c4d2b64945850cf9ec68db6ba769288a" + integrity sha1-OEVsIcTStklFhQz57Gjba6dpKIo= dependencies: broccoli-clean-css "^1.1.0" broccoli-funnel "^1.0.0" @@ -2556,6 +2924,7 @@ ember-cli-preprocess-registry@^3.1.0: ember-cli-qunit@^4.1.1: version "4.3.1" resolved "https://registry.yarnpkg.com/ember-cli-qunit/-/ember-cli-qunit-4.3.1.tgz#fcbf3585392299b27de26e57d0cf9f9049a76181" + integrity sha1-/L81hTkimbJ94m5X0M+fkEmnYYE= dependencies: ember-cli-babel "^6.11.0" ember-qunit "^3.3.1" @@ -2563,6 +2932,7 @@ ember-cli-qunit@^4.1.1: ember-cli-release@^0.2.9: version "0.2.9" resolved "https://registry.yarnpkg.com/ember-cli-release/-/ember-cli-release-0.2.9.tgz#5e8de3d034c65597933748023058470ec1231adb" + integrity sha1-Xo3j0DTGVZeTN0gCMFhHDsEjGts= dependencies: chalk "^1.0.0" git-tools "^0.1.4" @@ -2577,6 +2947,7 @@ ember-cli-release@^0.2.9: ember-cli-shims@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/ember-cli-shims/-/ember-cli-shims-1.2.0.tgz#0f53aff0aab80b5f29da3a9731bac56169dd941f" + integrity sha1-D1Ov8Kq4C18p2jqXMbrFYWndlB8= dependencies: broccoli-file-creator "^1.1.1" broccoli-merge-trees "^2.0.0" @@ -2587,28 +2958,33 @@ ember-cli-shims@^1.2.0: ember-cli-sri@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ember-cli-sri/-/ember-cli-sri-2.1.1.tgz#971620934a4b9183cf7923cc03e178b83aa907fd" + integrity sha1-lxYgk0pLkYPPeSPMA+F4uDqpB/0= dependencies: broccoli-sri-hash "^2.1.0" ember-cli-string-utils@^1.0.0, ember-cli-string-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz#39b677fc2805f55173735376fcef278eaa4452a1" + integrity sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE= ember-cli-test-info@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-test-info/-/ember-cli-test-info-1.0.0.tgz#ed4e960f249e97523cf891e4aed2072ce84577b4" + integrity sha1-7U6WDySel1I8+JHkrtIHLOhFd7Q= dependencies: ember-cli-string-utils "^1.0.0" ember-cli-test-loader@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ember-cli-test-loader/-/ember-cli-test-loader-2.2.0.tgz#3fb8d5d1357e4460d3f0a092f5375e71b6f7c243" + integrity sha512-mlSXX9SciIRwGkFTX6XGyJYp4ry6oCFZRxh5jJ7VH8UXLTNx2ZACtDTwaWtNhYrWXgKyiDUvmD8enD56aePWRA== dependencies: ember-cli-babel "^6.8.1" ember-cli-uglify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ember-cli-uglify/-/ember-cli-uglify-2.0.0.tgz#b096727d7d1718acc9bfe5d1bc81ce26cafdf6ca" + integrity sha1-sJZyfX0XGKzJv+XRvIHOJsr99so= dependencies: broccoli-uglify-sourcemap "^2.0.0" lodash.defaultsdeep "^4.6.0" @@ -2616,18 +2992,21 @@ ember-cli-uglify@^2.0.0: ember-cli-valid-component-name@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-valid-component-name/-/ember-cli-valid-component-name-1.0.0.tgz#71550ce387e0233065f30b30b1510aa2dfbe87ef" + integrity sha1-cVUM44fgIzBl8wswsVEKot++h+8= dependencies: silent-error "^1.0.0" ember-cli-version-checker@^1.1.4: version "1.3.1" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz#0bc2d134c830142da64bf9627a0eded10b61ae72" + integrity sha1-C8LRNMgwFC2mS/lieg7e0QthrnI= dependencies: semver "^5.3.0" ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.1.0.tgz#fc79a56032f3717cf844ada7cbdec1a06fedb604" + integrity sha512-ssiNyVTp+PphroFum8guHX9py4xU1PCxkRYgb25NxumgjpKTPjhkgTfpRRKXlIQe+/wVMmhf+Uv6w9vSLZKWKQ== dependencies: resolve "^1.3.3" semver "^5.3.0" @@ -2635,6 +3014,7 @@ ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0: ember-cli-version-checker@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.1.2.tgz#305ce102390c66e4e0f1432dea9dc5c7c19fed98" + integrity sha512-sjkHGr4IGXnO3EUcY21380Xo9Qf6bC8HWH4D62bVnrQop/8uha5XgMQRoAflMCeH6suMrezQL287JUoYc2smEw== dependencies: resolve "^1.3.3" semver "^5.3.0" @@ -2642,6 +3022,7 @@ ember-cli-version-checker@^2.1.2: ember-cli@~2.18.2: version "2.18.2" resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-2.18.2.tgz#bb15313a15139a85248a86d203643f918ba40f57" + integrity sha1-uxUxOhUTmoUkiobSA2Q/kYukD1c= dependencies: amd-name-resolver "1.0.0" babel-plugin-transform-es2015-modules-amd "^6.24.0" @@ -2731,6 +3112,7 @@ ember-cli@~2.18.2: ember-data@~2.13.0: version "2.13.2" resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-2.13.2.tgz#151c93ad5152885d4ca50b1942d7c66e15865c74" + integrity sha1-FRyTrVFSiF1MpQsZQtfGbhWGXHQ= dependencies: amd-name-resolver "0.0.5" babel-plugin-feature-flags "^0.3.1" @@ -2759,16 +3141,19 @@ ember-data@~2.13.0: ember-disable-prototype-extensions@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/ember-disable-prototype-extensions/-/ember-disable-prototype-extensions-1.1.3.tgz#1969135217654b5e278f9fe2d9d4e49b5720329e" + integrity sha1-GWkTUhdlS14nj5/i2dTkm1cgMp4= ember-export-application-global@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ember-export-application-global/-/ember-export-application-global-2.0.0.tgz#8d6d7619ac8a1a3f8c43003549eb21ebed685bd2" + integrity sha1-jW12GayKGj+MQwA1Sesh6+1oW9I= dependencies: ember-cli-babel "^6.0.0-beta.7" ember-fastboot-addon-tests@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/ember-fastboot-addon-tests/-/ember-fastboot-addon-tests-0.4.0.tgz#05f89f2cc4bd53d6abd6d952bbdde7c8af03a6f7" + integrity sha1-BfifLMS9U9ar1tlSu93nyK8Dpvc= dependencies: chalk "^1.1.3" core-object "^2.0.6" @@ -2786,6 +3171,7 @@ ember-fastboot-addon-tests@^0.4.0: ember-get-config@^0.2.2: version "0.2.4" resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.2.4.tgz#118492a2a03d73e46004ed777928942021fe1ecd" + integrity sha1-EYSSoqA9c+RgBO13eSiUICH+Hs0= dependencies: broccoli-file-creator "^1.1.1" ember-cli-babel "^6.3.0" @@ -2793,24 +3179,28 @@ ember-get-config@^0.2.2: ember-inflector@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-2.1.0.tgz#afcb92d022a4eab58f08ff4578eafc3a1de2d09b" + integrity sha512-o7X+MdPuMgH6GGP8JsZ6mr+WYiCcymzjPLr0ct2IUw4lh1EwVtmePuY6fBLuWmyQE1nJq4smDyNoOCE74n3f7g== dependencies: ember-cli-babel "^6.0.0" "ember-inflector@^2.0.0 || ^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-3.0.0.tgz#7e1ee8aaa0fa773ba0905d8b7c0786354d890ee1" + integrity sha512-tLWfYolZAkLnkTvvBkjizy4Wmj8yI8wqHZFK+leh0iScHiC3r1Yh5C4qO+OMGiBTMLwfTy+YqVoE/Nu3hGNkcA== dependencies: ember-cli-babel "^6.6.0" ember-load-initializers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-1.0.0.tgz#4919eaf06f6dfeca7e134633d8c05a6c9921e6e7" + integrity sha1-SRnq8G9t/sp+E0Yz2MBabJkh5uc= dependencies: ember-cli-babel "^6.0.0-beta.7" ember-lodash@^4.17.3: version "4.18.0" resolved "https://registry.yarnpkg.com/ember-lodash/-/ember-lodash-4.18.0.tgz#45de700d6a4f68f1cd62888d90b50aa6477b9a83" + integrity sha1-Rd5wDWpPaPHNYoiNkLUKpkd7moM= dependencies: broccoli-debug "^0.6.1" broccoli-funnel "^2.0.1" @@ -2822,6 +3212,7 @@ ember-lodash@^4.17.3: ember-qunit@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-3.3.1.tgz#8d68ef30cfd6f2acbf1d0f4e368439642e726903" + integrity sha512-ZRQCDitCx4aLKKIvQEIfeFKHAWOkqwT4xg2E0fAbP4yptCJKPz/pCf0G0suW6YFpx7zI3qsbXKVZMeOGbqbmfw== dependencies: "@ember/test-helpers" "^0.7.17" broccoli-funnel "^2.0.1" @@ -2834,6 +3225,7 @@ ember-qunit@^3.3.1: ember-resolver@^4.0.0: version "4.5.0" resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-4.5.0.tgz#9248bf534dfc197fafe3118fff538d436078bf99" + integrity sha512-BX8yvFWIbrh1IVZmpIY/14WUb7nD8tQzT5s0aUG/Nwq2LVqD/uNAEPcsq0XS2gLvKawwDQEQN30ptcvJApQBhA== dependencies: "@glimmer/resolver" "^0.4.1" babel-plugin-debug-macros "^0.1.10" @@ -2846,20 +3238,24 @@ ember-resolver@^4.0.0: ember-rfc176-data@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.2.7.tgz#bd355bc9b473e08096b518784170a23388bc973b" + integrity sha512-pJE2w+sI22UDsYmudI4nCp3WcImpUzXwe9qHfpOcEu3yM/HD1nGpDRt6kZD0KUnDmqkLeik/nYyzEwN/NU6xxA== ember-rfc176-data@^0.3.0, ember-rfc176-data@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.1.tgz#6a5a4b8b82ec3af34f3010965fa96b936ca94519" + integrity sha512-u+W5rUvYO7xyKJjiPuCM7bIAvFyPwPTJ66fOZz1xuCv3AyReI9Oev5oOADOO6YJZk+vEn0xWiZ9N6zSf8WU7Fg== ember-router-generator@^1.0.0, ember-router-generator@^1.2.2, ember-router-generator@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-1.2.3.tgz#8ed2ca86ff323363120fc14278191e9e8f1315ee" + integrity sha1-jtLKhv8yM2MSD8FCeBkeno8TFe4= dependencies: recast "^0.11.3" ember-runtime-enumerable-includes-polyfill@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-runtime-enumerable-includes-polyfill/-/ember-runtime-enumerable-includes-polyfill-2.1.0.tgz#dc6d4a028471e4acc350dfd2a149874fb20913f5" + integrity sha512-au18iI8VbEDYn3jLFZzETnKN5ciPgCUxMRucEP3jkq7qZ6sE0FVKpWMPY/h9tTND3VOBJt6fgPpEBJoJVCUudg== dependencies: ember-cli-babel "^6.9.0" ember-cli-version-checker "^2.1.0" @@ -2867,6 +3263,7 @@ ember-runtime-enumerable-includes-polyfill@^2.0.0: ember-source@~2.18.0: version "2.18.1" resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-2.18.1.tgz#bc02fc809f9e9b68d63e790aa3fac16bc6242bd5" + integrity sha1-vAL8gJ+em2jWPnkKo/rBa8YkK9U= dependencies: broccoli-funnel "^2.0.1" broccoli-merge-trees "^2.0.0" @@ -2886,6 +3283,7 @@ ember-source@~2.18.0: ember-try-config@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ember-try-config/-/ember-try-config-2.2.0.tgz#6be0af6c71949813e02ac793564fddbf8336b807" + integrity sha1-a+CvbHGUmBPgKseTVk/dv4M2uAc= dependencies: lodash "^4.6.1" node-fetch "^1.3.3" @@ -2895,6 +3293,7 @@ ember-try-config@^2.2.0: ember-try@^0.2.15: version "0.2.23" resolved "https://registry.yarnpkg.com/ember-try/-/ember-try-0.2.23.tgz#39b57141b4907541d0ac8b503d211e6946b08718" + integrity sha512-kmVNsSFFafGinFhERMox3SXHoU+V1td1538SbhpslPtf7S2BZYr7JdAwOCIRoRtpcWeNdYgdQGzJZxNvUc8aLg== dependencies: chalk "^1.0.0" cli-table2 "^0.2.0" @@ -2912,16 +3311,19 @@ ember-try@^0.2.15: encodeurl@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= encoding@^0.1.11: version "0.1.12" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= dependencies: iconv-lite "~0.4.13" engine.io-client@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.0.tgz#7b730e4127414087596d9be3c88d2bc5fdb6cf5c" + integrity sha1-e3MOQSdBQIdZbZvjyI0rxf22z1w= dependencies: component-emitter "1.2.1" component-inherit "0.0.3" @@ -2939,6 +3341,7 @@ engine.io-client@1.8.0: engine.io-parser@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.1.tgz#9554f1ae33107d6fbd170ca5466d2f833f6a07cf" + integrity sha1-lVTxrjMQfW+9FwylRm0vgz9qB88= dependencies: after "0.8.1" arraybuffer.slice "0.0.6" @@ -2950,6 +3353,7 @@ engine.io-parser@1.3.1: engine.io@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.0.tgz#3eeb5f264cb75dbbec1baaea26d61f5a4eace2aa" + integrity sha1-PutfJky3XbvsG6rqJtYfWk6s4qo= dependencies: accepts "1.3.3" base64id "0.1.0" @@ -2961,20 +3365,24 @@ engine.io@1.8.0: ensure-posix-path@^1.0.0, ensure-posix-path@^1.0.1, ensure-posix-path@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.0.2.tgz#a65b3e42d0b71cfc585eb774f9943c8d9b91b0c2" + integrity sha1-pls+QtC3HPxYXrd0+ZQ8jZuRsMI= entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + integrity sha1-blwtClYhtdra7O+AuQ7ftc13cvA= error-ex@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + integrity sha1-+FWobOYa3E6GIcPNoh56dhLDqNw= dependencies: is-arrayish "^0.2.1" error@^7.0.0: version "7.0.2" resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02" + integrity sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI= dependencies: string-template "~0.2.1" xtend "~4.0.0" @@ -2982,14 +3390,17 @@ error@^7.0.0: escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= escape-string-regexp@1.0.5, escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escodegen@^1.6.1: version "1.9.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852" + integrity sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw== dependencies: esprima "^3.1.3" estraverse "^4.2.0" @@ -3001,6 +3412,7 @@ escodegen@^1.6.1: escodegen@^1.9.1: version "1.11.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" + integrity sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw== dependencies: esprima "^3.1.3" estraverse "^4.2.0" @@ -3012,12 +3424,14 @@ escodegen@^1.9.1: eslint-plugin-ember-suave@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-plugin-ember-suave/-/eslint-plugin-ember-suave-1.0.0.tgz#ea7d232a126562dcd8b1ee3aa2700ac3b626e514" + integrity sha1-6n0jKhJlYtzYse46onAKw7Ym5RQ= dependencies: requireindex "~1.1.0" eslint-plugin-ember@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-5.0.3.tgz#9f5e2048ab3ddc1548d4d17bf318cf1bb5cf37f1" + integrity sha512-wPq2N96YQR2/Ob2LfuLQV8BEotHXxiFcuBiHikN8P+2VGzxBeuydafXy/pExuTsU2RHfPiSgyBHavKGy1DYdrQ== dependencies: ember-rfc176-data "^0.2.7" require-folder-tree "^1.4.5" @@ -3026,6 +3440,7 @@ eslint-plugin-ember@^5.0.0: eslint-plugin-node@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-6.0.1.tgz#bf19642298064379315d7a4b2a75937376fa05e4" + integrity sha512-Q/Cc2sW1OAISDS+Ji6lZS2KV4b7ueA/WydVWd1BECTQwVvfQy5JAi3glhINoKzoMnfnuRgNP+ZWKrGAbp3QDxw== dependencies: ignore "^3.3.6" minimatch "^3.0.4" @@ -3035,6 +3450,7 @@ eslint-plugin-node@^6.0.1: eslint-scope@3.7.1, eslint-scope@^3.7.1: version "3.7.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug= dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" @@ -3042,10 +3458,12 @@ eslint-scope@3.7.1, eslint-scope@^3.7.1: eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== eslint@^4.0.0: version "4.17.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.17.0.tgz#dc24bb51ede48df629be7031c71d9dc0ee4f3ddf" + integrity sha512-AyxBUCANU/o/xC0ijGMKavo5Ls3oK6xykiOITlMdjFjrKOsqLrA7Nf5cnrDgcKrHzBirclAZt63XO7YZlVUPwA== dependencies: ajv "^5.3.0" babel-code-frame "^6.22.0" @@ -3088,6 +3506,7 @@ eslint@^4.0.0: espree@^3.5.2: version "3.5.3" resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.3.tgz#931e0af64e7fbbed26b050a29daad1fc64799fa6" + integrity sha512-Zy3tAJDORxQZLl2baguiRU1syPERAIg0L+JB2MWorORgTu/CplzvxS9WWA7Xh4+Q+eOQihNs/1o1Xep8cvCxWQ== dependencies: acorn "^5.4.0" acorn-jsx "^3.0.0" @@ -3095,24 +3514,29 @@ espree@^3.5.2: esprima@^3.1.3, esprima@~3.1.0: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= esprima@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + integrity sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw== esprima@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.0.0.tgz#53cf247acda77313e551c3aa2e73342d3fb4f7d9" + integrity sha1-U88kes2ncxPlUcOqLnM0LT+099k= esquery@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" + integrity sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo= dependencies: estraverse "^4.0.0" esrecurse@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" + integrity sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM= dependencies: estraverse "^4.1.0" object-assign "^4.0.1" @@ -3120,26 +3544,32 @@ esrecurse@^4.1.0: estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= eventemitter3@1.x.x: version "1.2.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" + integrity sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg= events-to-array@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/events-to-array/-/events-to-array-1.1.2.tgz#2d41f563e1fe400ed4962fe1a4d5c6a7539df7f6" + integrity sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y= exec-file-sync@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/exec-file-sync/-/exec-file-sync-2.0.2.tgz#58d441db46e40de6d1f30de5be022785bd89e328" + integrity sha1-WNRB20bkDebR8w3lvgInhb2J4yg= dependencies: is-obj "^1.0.0" object-assign "^4.0.1" @@ -3148,12 +3578,14 @@ exec-file-sync@^2.0.0: exec-sh@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" + integrity sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg== dependencies: merge "^1.1.3" execa@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" + integrity sha1-2NdrvBtVIX7RkP1t1J08d07PyNo= dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" @@ -3166,6 +3598,7 @@ execa@^0.8.0: execa@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.9.0.tgz#adb7ce62cf985071f60580deb4a88b9e34712d01" + integrity sha512-BbUMBiX4hqiHZUA5+JujIjNb6TyAlp2D5KLheMjMluwOuzcnylDL4AxZYLLn1n2AGB49eSWwyKvvEQoRpnAtmA== dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" @@ -3178,32 +3611,39 @@ execa@^0.9.0: exists-stat@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/exists-stat/-/exists-stat-1.0.0.tgz#0660e3525a2e89d9e446129440c272edfa24b529" + integrity sha1-BmDjUlouidnkRhKUQMJy7foktSk= exists-sync@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.3.tgz#b910000bedbb113b378b82f5f5a7638107622dcf" + integrity sha1-uRAAC+27ETs3i4L19adjgQdiLc8= exists-sync@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.4.tgz#9744c2c428cc03b01060db454d4b12f0ef3c8879" + integrity sha1-l0TCxCjMA7AQYNtFTUsS8O88iHk= exit-hook@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g= exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= dependencies: is-posix-bracket "^0.1.0" expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= dependencies: debug "^2.3.3" define-property "^0.2.5" @@ -3216,24 +3656,28 @@ expand-brackets@^2.1.4: expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= dependencies: fill-range "^2.1.0" expand-tilde@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" + integrity sha1-C4HrqJflo9MdHD0QL48BRB5VlEk= dependencies: os-homedir "^1.0.1" expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= dependencies: homedir-polyfill "^1.0.1" express@^4.10.7, express@^4.12.3: version "4.16.2" resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" + integrity sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w= dependencies: accepts "~1.3.4" array-flatten "1.1.1" @@ -3269,12 +3713,14 @@ express@^4.10.7, express@^4.12.3: extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" @@ -3282,10 +3728,12 @@ extend-shallow@^3.0.0: extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + integrity sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ= external-editor@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-1.1.1.tgz#12d7b0db850f7ff7e7081baf4005700060c4600b" + integrity sha1-Etew24UPf/fnCBuvQAVwAGDEYAs= dependencies: extend "^3.0.0" spawn-sync "^1.0.15" @@ -3294,6 +3742,7 @@ external-editor@^1.1.0: external-editor@^2.0.4: version "2.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" + integrity sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA== dependencies: chardet "^0.4.0" iconv-lite "^0.4.17" @@ -3302,12 +3751,14 @@ external-editor@^2.0.4: extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= dependencies: is-extglob "^1.0.0" extglob@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== dependencies: array-unique "^0.3.2" define-property "^1.0.0" @@ -3321,40 +3772,49 @@ extglob@^2.0.2: extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= extsprintf@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= fake-xml-http-request@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-2.0.0.tgz#41a92f0ca539477700cb1dafd2df251d55dac8ff" + integrity sha512-UjNnynb6eLAB0lyh2PlTEkjRJORnNsVF1hbzU+PQv89/cyBV9GDRCy7JAcLQgeCLYT+3kaumWWZKEJvbaK74eQ== faker@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/faker/-/faker-3.1.0.tgz#0f908faf4e6ec02524e54a57e432c5c013e08c9f" + integrity sha1-D5CPr05uwCUk5UpX5DLFwBPgjJ8= fast-deep-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + integrity sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8= fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fast-ordered-set@^1.0.0, fast-ordered-set@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/fast-ordered-set/-/fast-ordered-set-1.0.3.tgz#3fbb36634f7be79e4f7edbdb4a357dee25d184eb" + integrity sha1-P7s2Y097555PftvbSjV97iXRhOs= dependencies: blank-object "^1.0.1" fast-sourcemap-concat@^1.0.1: version "1.2.3" resolved "https://registry.yarnpkg.com/fast-sourcemap-concat/-/fast-sourcemap-concat-1.2.3.tgz#22f14e92d739e37920334376ec8433bf675eaa04" + integrity sha1-IvFOktc543kgM0N27IQzv2deqgQ= dependencies: chalk "^0.5.1" fs-extra "^0.30.0" @@ -3369,6 +3829,7 @@ fast-sourcemap-concat@^1.0.1: fastboot-express-middleware@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/fastboot-express-middleware/-/fastboot-express-middleware-1.2.0.tgz#3f32fb21d8d01ad7c0c7d876b278601665ea17fa" + integrity sha1-PzL7IdjQGtfAx9h2snhgFmXqF/o= dependencies: chalk "^2.0.1" fastboot "^1.2.0" @@ -3377,6 +3838,7 @@ fastboot-express-middleware@^1.1.0: fastboot-transform@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/fastboot-transform/-/fastboot-transform-0.1.3.tgz#7dea0b117594afd8772baa6c9b0919644e7f7dcd" + integrity sha512-6otygPIJw1ARp1jJb+6KVO56iKBjhO+5x59RSC9qiZTbZRrv+HZAuP00KD3s+nWMvcFDemtdkugki9DNFTTwCQ== dependencies: broccoli-stew "^1.5.0" convert-source-map "^1.5.1" @@ -3384,6 +3846,7 @@ fastboot-transform@^0.1.2: fastboot@^1.1.4-beta.1, fastboot@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-1.2.0.tgz#35c5747db1943d082f2ba619226d16cd7281e946" + integrity sha1-NcV0fbGUPQgvK6YZIm0WzXKB6UY= dependencies: chalk "^2.0.1" cookie "^0.3.1" @@ -3397,24 +3860,28 @@ fastboot@^1.1.4-beta.1, fastboot@^1.2.0: faye-websocket@~0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= dependencies: websocket-driver ">=0.5.1" fb-watchman@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= dependencies: bser "^2.0.0" figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= dependencies: escape-string-regexp "^1.0.5" file-entry-cache@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= dependencies: flat-cache "^1.2.1" object-assign "^4.0.1" @@ -3422,14 +3889,17 @@ file-entry-cache@^2.0.0: filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= filesize@^3.1.3: version "3.6.0" resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.0.tgz#22d079615624bb6fd3c04026120628a41b3f4efa" + integrity sha512-g5OWtoZWcPI56js1DFhIEqyG9tnu/7sG3foHwgS9KGYFMfsYguI3E+PRVCmtmE96VajQIEMRU2OhN+ME589Gdw== fill-range@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + integrity sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM= dependencies: is-number "^2.1.0" isobject "^2.0.0" @@ -3440,6 +3910,7 @@ fill-range@^2.1.0: fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" @@ -3449,6 +3920,7 @@ fill-range@^4.0.0: finalhandler@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" + integrity sha1-zgtoVbRYU+eRsvzGgARtiCU91/U= dependencies: debug "2.6.9" encodeurl "~1.0.1" @@ -3461,10 +3933,12 @@ finalhandler@1.1.0: find-index@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-index/-/find-index-1.1.0.tgz#53007c79cd30040d6816d79458e8837d5c5705ef" + integrity sha1-UwB8ec0wBA1oFteUWOiDfVxXBe8= find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= dependencies: path-exists "^2.0.0" pinkie-promise "^2.0.0" @@ -3472,12 +3946,14 @@ find-up@^1.0.0: find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= dependencies: locate-path "^2.0.0" findup-sync@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" + integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= dependencies: detect-file "^1.0.0" is-glob "^3.1.0" @@ -3487,6 +3963,7 @@ findup-sync@2.0.0: findup-sync@^0.4.2: version "0.4.3" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" + integrity sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI= dependencies: detect-file "^0.1.0" is-glob "^2.0.1" @@ -3496,6 +3973,7 @@ findup-sync@^0.4.2: findup-sync@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-1.0.0.tgz#6f7e4b57b6ee3a4037b4414eaedea3f58f71e0ec" + integrity sha1-b35LV7buOkA3tEFOrt6j9Y9x4Ow= dependencies: detect-file "^0.1.0" is-glob "^2.0.1" @@ -3505,6 +3983,7 @@ findup-sync@^1.0.0: fireworm@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/fireworm/-/fireworm-0.7.1.tgz#ccf20f7941f108883fcddb99383dbe6e1861c758" + integrity sha1-zPIPeUHxCIg/zduZOD2+bhhhx1g= dependencies: async "~0.2.9" is-type "0.0.1" @@ -3515,6 +3994,7 @@ fireworm@^0.7.0: fixturify@^0.3.2: version "0.3.4" resolved "https://registry.yarnpkg.com/fixturify/-/fixturify-0.3.4.tgz#c676de404a7f8ee8e64d0b76118e62ec95ab7b25" + integrity sha512-Gx+KSB25b6gMc4bf7UFRTA85uE0iZR+RYur0JHh6dg4AGBh0EksOv4FCHyM7XpGmiJO7Bc7oV7vxENQBT+2WEQ== dependencies: fs-extra "^0.30.0" matcher-collection "^1.0.4" @@ -3522,6 +4002,7 @@ fixturify@^0.3.2: flat-cache@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + integrity sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE= dependencies: circular-json "^0.3.1" del "^2.0.2" @@ -3531,20 +4012,24 @@ flat-cache@^1.2.1: for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= for-own@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= dependencies: for-in "^1.0.1" forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= form-data@~2.1.1: version "2.1.4" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + integrity sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE= dependencies: asynckit "^0.4.0" combined-stream "^1.0.5" @@ -3553,6 +4038,7 @@ form-data@~2.1.1: form-data@~2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" + integrity sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8= dependencies: asynckit "^0.4.0" combined-stream "^1.0.5" @@ -3561,24 +4047,29 @@ form-data@~2.3.1: forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= dependencies: map-cache "^0.2.2" fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= fs-exists-sync@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" + integrity sha1-mC1ok6+RjnLQjeyehnP/K1qNat0= fs-extra@^0.24.0: version "0.24.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.24.0.tgz#d4e4342a96675cb7846633a6099249332b539952" + integrity sha1-1OQ0KpZnXLeEZjOmCZJJMytTmVI= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -3588,6 +4079,7 @@ fs-extra@^0.24.0: fs-extra@^0.26.0: version "0.26.7" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" + integrity sha1-muH92UiXeY7at20JGM9C0MMYT6k= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -3598,6 +4090,7 @@ fs-extra@^0.26.0: fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -3608,6 +4101,7 @@ fs-extra@^0.30.0: fs-extra@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" + integrity sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -3616,6 +4110,7 @@ fs-extra@^1.0.0: fs-extra@^2.0.0: version "2.1.2" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz#046c70163cef9aad46b0e4a7fa467fb22d71de35" + integrity sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -3623,6 +4118,7 @@ fs-extra@^2.0.0: fs-extra@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" + integrity sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE= dependencies: graceful-fs "^4.1.2" jsonfile "^3.0.0" @@ -3631,6 +4127,7 @@ fs-extra@^3.0.0: fs-extra@^4.0.0, fs-extra@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" @@ -3639,6 +4136,7 @@ fs-extra@^4.0.0, fs-extra@^4.0.2: fs-promise@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/fs-promise/-/fs-promise-2.0.3.tgz#f64e4f854bcf689aa8bddcba268916db3db46854" + integrity sha1-9k5PhUvPaJqovdy6JokW2z20aFQ= dependencies: any-promise "^1.3.0" fs-extra "^2.0.0" @@ -3648,6 +4146,7 @@ fs-promise@^2.0.0: fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.7.tgz#315e2b098d5fe7f622880ac965b1b051868ac871" + integrity sha512-dJwDX6NBH7IfdfFjZAdHCZ6fIKc8LwR7kzqUhYRFJuX4g9ctG/7cuqJuwegGQsyLEykp6Z4krq+yIFMQlt7d9Q== dependencies: heimdalljs-logger "^0.1.7" object-assign "^4.1.0" @@ -3657,10 +4156,12 @@ fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5 fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.0.0, fsevents@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" + integrity sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q== dependencies: nan "^2.3.0" node-pre-gyp "^0.6.39" @@ -3668,6 +4169,7 @@ fsevents@^1.0.0, fsevents@^1.1.1: fstream-ignore@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + integrity sha1-nDHa40dnAY/h0kmyTa2mfQktoQU= dependencies: fstream "^1.0.0" inherits "2" @@ -3676,6 +4178,7 @@ fstream-ignore@^1.0.5: fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: version "1.0.11" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE= dependencies: graceful-fs "^4.1.2" inherits "~2.0.0" @@ -3685,10 +4188,12 @@ fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -3702,52 +4207,63 @@ gauge@~2.7.3: get-caller-file@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + integrity sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U= get-func-name@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= dependencies: assert-plus "^1.0.0" git-repo-info@^1.1.2, git-repo-info@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-1.4.1.tgz#2a072823254aaf62fcf0766007d7b6651bd41943" + integrity sha1-KgcoIyVKr2L88HZgB9e2ZRvUGUM= git-repo-info@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-1.2.0.tgz#43d8513e04a24dd441330a2f7c6655a709fdbaf2" + integrity sha1-Q9hRPgSiTdRBMwovfGZVpwn9uvI= git-repo-version@0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/git-repo-version/-/git-repo-version-0.4.1.tgz#75fab9a0a4ec8470755b0eea7fdaa6f9d41453bf" + integrity sha1-dfq5oKTshHB1Ww7qf9qm+dQUU78= dependencies: git-repo-info "~1.2.0" git-tools@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/git-tools/-/git-tools-0.1.4.tgz#5e43e59443b8a5dedb39dba663da49e79f943978" + integrity sha1-XkPllEO4pd7bOdumY9pJ55+UOXg= dependencies: spawnback "~1.0.0" glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= dependencies: glob-parent "^2.0.0" is-glob "^2.0.0" @@ -3755,12 +4271,14 @@ glob-base@^0.3.0: glob-parent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= dependencies: is-glob "^2.0.0" glob@7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + integrity sha1-gFIR3wT6rxxjo2ADBs31reULLsg= dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3772,6 +4290,7 @@ glob@7.1.1: glob@^5.0.10: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= dependencies: inflight "^1.0.4" inherits "2" @@ -3782,6 +4301,7 @@ glob@^5.0.10: glob@^7.0.3, glob@^7.0.4, glob@^7.0.5, glob@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3793,6 +4313,7 @@ glob@^7.0.3, glob@^7.0.4, glob@^7.0.5, glob@^7.1.2: global-modules@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" + integrity sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0= dependencies: global-prefix "^0.1.4" is-windows "^0.2.0" @@ -3800,6 +4321,7 @@ global-modules@^0.2.3: global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== dependencies: global-prefix "^1.0.1" is-windows "^1.0.1" @@ -3808,6 +4330,7 @@ global-modules@^1.0.0: global-prefix@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" + integrity sha1-jTvGuNo8qBEqFg2NSW/wRiv+948= dependencies: homedir-polyfill "^1.0.0" ini "^1.3.4" @@ -3817,6 +4340,7 @@ global-prefix@^0.1.4: global-prefix@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= dependencies: expand-tilde "^2.0.2" homedir-polyfill "^1.0.1" @@ -3827,18 +4351,22 @@ global-prefix@^1.0.1: globals@^11.0.1: version "11.3.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.3.0.tgz#e04fdb7b9796d8adac9c8f64c14837b2313378b0" + integrity sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw== globals@^11.1.0: version "11.7.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" + integrity sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg== globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== globby@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0= dependencies: array-union "^1.0.1" arrify "^1.0.0" @@ -3850,22 +4378,27 @@ globby@^5.0.0: graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= "graceful-readlink@>= 1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= growl@1.9.2: version "1.9.2" resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + integrity sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8= growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= handlebars@^4.0.4: version "4.0.11" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" + integrity sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw= dependencies: async "^1.4.0" optimist "^0.6.1" @@ -3876,14 +4409,17 @@ handlebars@^4.0.4: har-schema@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + integrity sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4= har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= har-validator@~4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + integrity sha1-M0gdDxu/9gDdID11gSpqX7oALio= dependencies: ajv "^4.9.1" har-schema "^1.0.5" @@ -3891,6 +4427,7 @@ har-validator@~4.2.1: har-validator@~5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + integrity sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0= dependencies: ajv "^5.1.0" har-schema "^2.0.0" @@ -3898,50 +4435,60 @@ har-validator@~5.0.3: has-ansi@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" + integrity sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4= dependencies: ansi-regex "^0.2.0" has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= dependencies: ansi-regex "^2.0.0" has-binary@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.6.tgz#25326f39cfa4f616ad8787894e3af2cfbc7b6e10" + integrity sha1-JTJvOc+k9hath4eJTjryz7x7bhA= dependencies: isarray "0.0.1" has-binary@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" + integrity sha1-aOYesWIQyVRaClzOBqhzkS/h5ow= dependencies: isarray "0.0.1" has-cors@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= has-flag@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= dependencies: get-value "^2.0.3" has-values "^0.1.4" @@ -3950,6 +4497,7 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= dependencies: get-value "^2.0.6" has-values "^1.0.0" @@ -3958,10 +4506,12 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= dependencies: is-number "^3.0.0" kind-of "^4.0.0" @@ -3969,6 +4519,7 @@ has-values@^1.0.0: hash-for-dep@^1.0.2, hash-for-dep@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.2.3.tgz#5ec69fca32c23523972d52acb5bb65ffc3664cab" + integrity sha512-NE//rDaCFpWHViw30YM78OAGBShU+g4dnUGY3UWGyEzPOGYg/ptOjk32nEc+bC1xz+RfK5UIs6lOL6eQdrV4Ow== dependencies: broccoli-kitchen-sink-helpers "^0.3.1" heimdalljs "^0.2.3" @@ -3978,6 +4529,7 @@ hash-for-dep@^1.0.2, hash-for-dep@^1.2.3: hawk@3.1.3, hawk@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + integrity sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ= dependencies: boom "2.x.x" cryptiles "2.x.x" @@ -3987,6 +4539,7 @@ hawk@3.1.3, hawk@~3.1.3: hawk@~6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + integrity sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ== dependencies: boom "4.x.x" cryptiles "3.x.x" @@ -3996,10 +4549,12 @@ hawk@~6.0.2: he@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= heimdalljs-fs-monitor@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/heimdalljs-fs-monitor/-/heimdalljs-fs-monitor-0.1.0.tgz#d404a65688c6714c485469ed3495da4853440272" + integrity sha1-1ASmVojGcUxIVGntNJXaSFNEAnI= dependencies: heimdalljs "^0.2.0" heimdalljs-logger "^0.1.7" @@ -4007,10 +4562,12 @@ heimdalljs-fs-monitor@^0.1.0: heimdalljs-graph@^0.3.1: version "0.3.4" resolved "https://registry.yarnpkg.com/heimdalljs-graph/-/heimdalljs-graph-0.3.4.tgz#0bd75797beeaa20b0ed59017aed3b2d95312acee" + integrity sha512-2DXgPIxdatgtBOjlh5qeVeHIGMTC2V9ujEvUhVJBVOVwqnU41g1OuGaRugLi6rvk0E+u1koYkfPeptybV8ZJ4g== heimdalljs-logger@^0.1.7: version "0.1.9" resolved "https://registry.yarnpkg.com/heimdalljs-logger/-/heimdalljs-logger-0.1.9.tgz#d76ada4e45b7bb6f786fc9c010a68eb2e2faf176" + integrity sha1-12raTkW3u294b8nAEKaOsuL68XY= dependencies: debug "^2.2.0" heimdalljs "^0.2.0" @@ -4018,26 +4575,31 @@ heimdalljs-logger@^0.1.7: heimdalljs@^0.2.0, heimdalljs@^0.2.1, heimdalljs@^0.2.3: version "0.2.5" resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.2.5.tgz#6aa54308eee793b642cff9cf94781445f37730ac" + integrity sha1-aqVDCO7nk7ZCz/nPlHgURfN3MKw= dependencies: rsvp "~3.2.1" heimdalljs@^0.3.0: version "0.3.3" resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.3.3.tgz#e92d2c6f77fd46d5bf50b610d28ad31755054d0b" + integrity sha1-6S0sb3f9RtW/ULYQ0orTF1UFTQs= dependencies: rsvp "~3.2.1" hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + integrity sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0= hoek@4.x.x: version "4.2.0" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" + integrity sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ== home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.1" @@ -4045,22 +4607,26 @@ home-or-tmp@^2.0.0: homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" + integrity sha1-TCu8inWJmP7r9e1oWA921GdotLw= dependencies: parse-passwd "^1.0.0" hosted-git-info@^2.1.4, hosted-git-info@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" + integrity sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg== html-encoding-sniffer@^1.0.1, html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== dependencies: whatwg-encoding "^1.0.1" http-errors@1.6.2, http-errors@~1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" + integrity sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY= dependencies: depd "1.1.1" inherits "2.0.3" @@ -4070,10 +4636,12 @@ http-errors@1.6.2, http-errors@~1.6.2: http-parser-js@>=0.4.0: version "0.4.10" resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" + integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= http-proxy@^1.13.1, http-proxy@^1.9.0: version "1.16.2" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" + integrity sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I= dependencies: eventemitter3 "1.x.x" requires-port "1.x.x" @@ -4081,6 +4649,7 @@ http-proxy@^1.13.1, http-proxy@^1.9.0: http-signature@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + integrity sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8= dependencies: assert-plus "^0.2.0" jsprim "^1.2.2" @@ -4089,6 +4658,7 @@ http-signature@~1.1.0: http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= dependencies: assert-plus "^1.0.0" jsprim "^1.2.2" @@ -4097,32 +4667,39 @@ http-signature@~1.2.0: iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@~0.4.13: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + integrity sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ== ignore@^3.3.3, ignore@^3.3.6: version "3.3.7" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" + integrity sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA== imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= dependencies: repeating "^2.0.0" indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= inflection@^1.12.0, inflection@^1.7.0, inflection@^1.7.1, inflection@^1.8.0: version "1.12.0" resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" + integrity sha1-ogCTVlbW9fa8TcdQLhrstwMihBY= inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" @@ -4130,14 +4707,17 @@ inflight@^1.0.4: inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== inline-source-map-comment@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/inline-source-map-comment/-/inline-source-map-comment-1.0.5.tgz#50a8a44c2a790dfac441b5c94eccd5462635faf6" + integrity sha1-UKikTCp5DfrEQbXJTszVRiY1+vY= dependencies: chalk "^1.0.0" get-stdin "^4.0.1" @@ -4148,6 +4728,7 @@ inline-source-map-comment@^1.0.5: inquirer@^2: version "2.0.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-2.0.0.tgz#e1351687b90d150ca403ceaa3cefb1e3065bef4b" + integrity sha1-4TUWh7kNFQykA86qPO+x4wZb70s= dependencies: ansi-escapes "^1.1.0" chalk "^1.0.0" @@ -4167,6 +4748,7 @@ inquirer@^2: inquirer@^3.0.6: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== dependencies: ansi-escapes "^3.0.0" chalk "^2.0.0" @@ -4186,66 +4768,78 @@ inquirer@^3.0.6: invariant@^2.2.0: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" invariant@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + integrity sha1-nh9WrArNtr8wMwbzOL47IErmA2A= dependencies: loose-envify "^1.0.0" ipaddr.js@1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" + integrity sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A= is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= dependencies: kind-of "^3.0.2" is-accessor-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== dependencies: kind-of "^6.0.0" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= dependencies: binary-extensions "^1.0.0" is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-builtin-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= dependencies: builtin-modules "^1.0.0" is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= dependencies: kind-of "^3.0.2" is-data-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== dependencies: kind-of "^6.0.0" is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== dependencies: is-accessor-descriptor "^0.1.6" is-data-descriptor "^0.1.4" @@ -4254,6 +4848,7 @@ is-descriptor@^0.1.0: is-descriptor@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== dependencies: is-accessor-descriptor "^1.0.0" is-data-descriptor "^1.0.0" @@ -4262,182 +4857,220 @@ is-descriptor@^1.0.0: is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= is-equal-shallow@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= dependencies: is-primitive "^2.0.0" is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= is-extendable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== dependencies: is-plain-object "^2.0.4" is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= is-extglob@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-finite@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= is-git-url@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-git-url/-/is-git-url-1.0.0.tgz#53f684cd143285b52c3244b4e6f28253527af66b" + integrity sha1-U/aEzRQyhbUsMkS05vKCU1J69ms= is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= dependencies: is-extglob "^1.0.0" is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= dependencies: is-extglob "^2.1.0" is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= dependencies: kind-of "^3.0.2" is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= is-odd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-1.0.0.tgz#3b8a932eb028b3775c39bb09e91767accdb69088" + integrity sha1-O4qTLrAos3dcObsJ6RdnrM22kIg= dependencies: is-number "^3.0.0" is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= is-path-in-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + integrity sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw= dependencies: is-path-inside "^1.0.0" is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= dependencies: path-is-inside "^1.0.1" is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= is-type@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/is-type/-/is-type-0.0.1.tgz#f651d85c365d44955d14a51d8d7061f3f6b4779c" + integrity sha1-9lHYXDZdRJVdFKUdjXBh8/a0d5w= dependencies: core-util-is "~1.0.0" is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= is-windows@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" + integrity sha1-3hqm1j6indJIc3tp8f+LgALSEIw= is-windows@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.1.tgz#310db70f742d259a16a369202b51af84233310d9" + integrity sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk= isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isbinaryfile@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" + integrity sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE= isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= istextorbinary@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.1.0.tgz#dbed2a6f51be2f7475b68f89465811141b758874" + integrity sha1-2+0qb1G+L3R1to+JRlgRFBt1iHQ= dependencies: binaryextensions "1 || 2" editions "^1.1.1" @@ -4446,22 +5079,27 @@ istextorbinary@2.1.0: jquery-deferred@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/jquery-deferred/-/jquery-deferred-0.3.1.tgz#596eca1caaff54f61b110962b23cafea74c35355" + integrity sha1-WW7KHKr/VPYbEQlisjyv6nTDU1U= jquery@^3.1.0, jquery@^3.2.1: version "3.3.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" + integrity sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg== js-reporters@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/js-reporters/-/js-reporters-1.2.1.tgz#f88c608e324a3373a95bcc45ad305e5c979c459b" + integrity sha1-+IxgjjJKM3OpW8xFrTBeXJecRZs= js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.6.1, js-yaml@^3.9.1: version "3.10.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" + integrity sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -4469,10 +5107,12 @@ js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.6.1, js-yaml@^3.9.1: jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= jsdom@^11.12.0: version "11.12.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== dependencies: abab "^2.0.0" acorn "^5.5.3" @@ -4504,6 +5144,7 @@ jsdom@^11.12.0: jsdom@^9.5.0: version "9.12.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" + integrity sha1-6MVG//ywbADUgzyoRBD+1/igl9Q= dependencies: abab "^1.0.3" acorn "^4.0.4" @@ -4528,74 +5169,90 @@ jsdom@^9.5.0: jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= jsesc@^2.5.0, jsesc@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" + integrity sha1-5CGiqOINawgZ3yiQj3glJrlt0f4= jsesc@~0.3.x: version "0.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.3.0.tgz#1bf5ee63b4539fe2e26d0c1e99c240b97a457972" + integrity sha1-G/XuY7RTn+LibQwemcJAuXpFeXI= jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= dependencies: jsonify "~0.0.0" json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= json3@3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= optionalDependencies: graceful-fs "^4.1.6" jsonfile@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + integrity sha1-pezG9l9T9mLEQVx2daAzHQmS7GY= optionalDependencies: graceful-fs "^4.1.6" jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= optionalDependencies: graceful-fs "^4.1.6" jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= dependencies: assert-plus "1.0.0" extsprintf "1.3.0" @@ -4605,42 +5262,50 @@ jsprim@^1.2.2: kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= dependencies: is-buffer "^1.1.5" kind-of@^5.0.0, kind-of@^5.0.2: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= optionalDependencies: graceful-fs "^4.1.9" lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= lazy-cache@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" + integrity sha1-uRkKT5EzVGlIQIWfio9whNiCImQ= dependencies: set-getter "^0.1.0" leek@0.0.24: version "0.0.24" resolved "https://registry.yarnpkg.com/leek/-/leek-0.0.24.tgz#e400e57f0e60d8ef2bd4d068dc428a54345dbcda" + integrity sha1-5ADlfw5g2O8r1NBo3EKKVDRdvNo= dependencies: debug "^2.1.0" lodash.assign "^3.2.0" @@ -4649,10 +5314,12 @@ leek@0.0.24: left-pad@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" @@ -4660,16 +5327,19 @@ levn@^0.3.0, levn@~0.3.0: linkify-it@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.0.3.tgz#d94a4648f9b1c179d64fa97291268bdb6ce9434f" + integrity sha1-2UpGSPmxwXnWT6lykSaL22zpQ08= dependencies: uc.micro "^1.0.1" livereload-js@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.3.0.tgz#c3ab22e8aaf5bf3505d80d098cbad67726548c9a" + integrity sha512-j1R0/FeGa64Y+NmqfZhyoVRzcFlOZ8sNlKzHjh4VvLULFACZhn68XrX5DFg2FhMvSMJmROuFxRSa560ECWKBMg== load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" @@ -4680,10 +5350,12 @@ load-json-file@^1.0.0: loader.js@^4.2.3: version "4.6.0" resolved "https://registry.yarnpkg.com/loader.js/-/loader.js-4.6.0.tgz#b965663ddbe2d80da482454cb865efe496e93e22" + integrity sha512-NjAnzMq/BM2VlXA9er0Nx1Runocgi+hEU53ENhCtTx82GX6/l9NXwfIqg81om6QvmhUlv2zH+4R+N+wOoeXytQ== locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= dependencies: p-locate "^2.0.0" path-exists "^3.0.0" @@ -4691,10 +5363,12 @@ locate-path@^2.0.0: lodash-es@^4.17.4: version "4.17.5" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.5.tgz#9fc6e737b1c4d151d8f9cae2247305d552ce748f" + integrity sha512-Ez3ONp3TK9gX1HYKp6IhetcVybD+2F+Yp6GS9dfH8ue6EOCEzQtQEh4K0FYWBP9qLv+lzeQAYXw+3ySfxyZqkw== lodash._baseassign@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + integrity sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4= dependencies: lodash._basecopy "^3.0.0" lodash.keys "^3.0.0" @@ -4702,6 +5376,7 @@ lodash._baseassign@^3.0.0: lodash._basebind@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._basebind/-/lodash._basebind-2.3.0.tgz#2b5bc452a0e106143b21869f233bdb587417d248" + integrity sha1-K1vEUqDhBhQ7IYafIzvbWHQX0kg= dependencies: lodash._basecreate "~2.3.0" lodash._setbinddata "~2.3.0" @@ -4710,14 +5385,17 @@ lodash._basebind@~2.3.0: lodash._basecopy@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY= lodash._basecreate@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" + integrity sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE= lodash._basecreate@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-2.3.0.tgz#9b88a86a4dcff7b7f3c61d83a2fcfc0671ec9de0" + integrity sha1-m4ioak3P97fzxh2Dovz8BnHsneA= dependencies: lodash._renative "~2.3.0" lodash.isobject "~2.3.0" @@ -4726,6 +5404,7 @@ lodash._basecreate@~2.3.0: lodash._basecreatecallback@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._basecreatecallback/-/lodash._basecreatecallback-2.3.0.tgz#37b2ab17591a339e988db3259fcd46019d7ac362" + integrity sha1-N7KrF1kaM56YjbMln81GAZ16w2I= dependencies: lodash._setbinddata "~2.3.0" lodash.bind "~2.3.0" @@ -4735,6 +5414,7 @@ lodash._basecreatecallback@~2.3.0: lodash._basecreatewrapper@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.3.0.tgz#aa0c61ad96044c3933376131483a9759c3651247" + integrity sha1-qgxhrZYETDkzN2ExSDqXWcNlEkc= dependencies: lodash._basecreate "~2.3.0" lodash._setbinddata "~2.3.0" @@ -4744,6 +5424,7 @@ lodash._basecreatewrapper@~2.3.0: lodash._baseflatten@^3.0.0: version "3.1.4" resolved "https://registry.yarnpkg.com/lodash._baseflatten/-/lodash._baseflatten-3.1.4.tgz#0770ff80131af6e34f3b511796a7ba5214e65ff7" + integrity sha1-B3D/gBMa9uNPO1EXlqe6UhTmX/c= dependencies: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" @@ -4751,10 +5432,12 @@ lodash._baseflatten@^3.0.0: lodash._bindcallback@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4= lodash._createassigner@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" + integrity sha1-g4pbri/aymOsIt7o4Z+k5taXCxE= dependencies: lodash._bindcallback "^3.0.0" lodash._isiterateecall "^3.0.0" @@ -4763,6 +5446,7 @@ lodash._createassigner@^3.0.0: lodash._createwrapper@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._createwrapper/-/lodash._createwrapper-2.3.0.tgz#d1aae1102dadf440e8e06fc133a6edd7fe146075" + integrity sha1-0arhEC2t9EDo4G/BM6bt1/4UYHU= dependencies: lodash._basebind "~2.3.0" lodash._basecreatewrapper "~2.3.0" @@ -4771,44 +5455,54 @@ lodash._createwrapper@~2.3.0: lodash._escapehtmlchar@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.3.0.tgz#d03da6bd82eedf38dc0a5b503d740ecd0e894592" + integrity sha1-0D2mvYLu3zjcCltQPXQOzQ6JRZI= dependencies: lodash._htmlescapes "~2.3.0" lodash._escapestringchar@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.3.0.tgz#cce73ae60fc6da55d2bf8a0679c23ca2bab149fc" + integrity sha1-zOc65g/G2lXSv4oGecI8orqxSfw= lodash._getnative@^3.0.0: version "3.9.1" resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= lodash._htmlescapes@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.3.0.tgz#1ca98863cadf1fa1d82c84f35f31e40556a04f3a" + integrity sha1-HKmIY8rfH6HYLITzXzHkBVagTzo= lodash._isiterateecall@^3.0.0: version "3.0.9" resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + integrity sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw= lodash._objecttypes@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.3.0.tgz#6a3ea3987dd6eeb8021b2d5c9c303549cc2bae1e" + integrity sha1-aj6jmH3W7rgCGy1cnDA1Scwrrh4= lodash._reinterpolate@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.3.0.tgz#03ee9d85c0e55cbd590d71608a295bdda51128ec" + integrity sha1-A+6dhcDlXL1ZDXFgiilb3aURKOw= lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= lodash._renative@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._renative/-/lodash._renative-2.3.0.tgz#77d8edd4ced26dd5971f9e15a5f772e4e317fbd3" + integrity sha1-d9jt1M7SbdWXH54Vpfdy5OMX+9M= lodash._reunescapedhtml@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.3.0.tgz#db920b55ac7f3ff825939aceb9ba2c231713d24d" + integrity sha1-25ILVax/P/glk5rOubosIxcT0k0= dependencies: lodash._htmlescapes "~2.3.0" lodash.keys "~2.3.0" @@ -4816,6 +5510,7 @@ lodash._reunescapedhtml@~2.3.0: lodash._setbinddata@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._setbinddata/-/lodash._setbinddata-2.3.0.tgz#e5610490acd13277d59858d95b5f2727f1508f04" + integrity sha1-5WEEkKzRMnfVmFjZW18nJ/FQjwQ= dependencies: lodash._renative "~2.3.0" lodash.noop "~2.3.0" @@ -4823,16 +5518,19 @@ lodash._setbinddata@~2.3.0: lodash._shimkeys@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.3.0.tgz#611f93149e3e6c721096b48769ef29537ada8ba9" + integrity sha1-YR+TFJ4+bHIQlrSHae8pU3rai6k= dependencies: lodash._objecttypes "~2.3.0" lodash._slice@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._slice/-/lodash._slice-2.3.0.tgz#147198132859972e4680ca29a5992c855669aa5c" + integrity sha1-FHGYEyhZly5GgMoppZkshVZpqlw= lodash.assign@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" + integrity sha1-POnwI0tLIiPilrj6CsH+6OvKZPo= dependencies: lodash._baseassign "^3.0.0" lodash._createassigner "^3.0.0" @@ -4841,10 +5539,12 @@ lodash.assign@^3.2.0: lodash.assignin@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" + integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI= lodash.bind@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-2.3.0.tgz#c2a8e18b68e5ecc152e2b168266116fea5b016cc" + integrity sha1-wqjhi2jl7MFS4rFoJmEW/qWwFsw= dependencies: lodash._createwrapper "~2.3.0" lodash._renative "~2.3.0" @@ -4853,14 +5553,17 @@ lodash.bind@~2.3.0: lodash.castarray@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" + integrity sha1-wCUTUV4wna3dTCTGDP3c9ZdtkRU= lodash.clonedeep@^4.4.1: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= lodash.create@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" + integrity sha1-1/KEnw29p+BGgruM1yqwIkYd6+c= dependencies: lodash._baseassign "^3.0.0" lodash._basecreate "^3.0.0" @@ -4869,12 +5572,14 @@ lodash.create@3.1.1: lodash.debounce@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-3.1.1.tgz#812211c378a94cc29d5aa4e3346cf0bfce3a7df5" + integrity sha1-gSIRw3ipTMKdWqTjNGzwv846ffU= dependencies: lodash._getnative "^3.0.0" lodash.defaults@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.3.0.tgz#a832b001f138f3bb9721c2819a2a7cc5ae21ed25" + integrity sha1-qDKwAfE487uXIcKBmip8xa4h7SU= dependencies: lodash._objecttypes "~2.3.0" lodash.keys "~2.3.0" @@ -4882,10 +5587,12 @@ lodash.defaults@~2.3.0: lodash.defaultsdeep@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.0.tgz#bec1024f85b1bd96cbea405b23c14ad6443a6f81" + integrity sha1-vsECT4WxvZbL6kBbI8FK1kQ6b4E= lodash.escape@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.3.0.tgz#844c38c58f844e1362ebe96726159b62cf5f2a58" + integrity sha1-hEw4xY+EThNi6+lnJhWbYs9fKlg= dependencies: lodash._escapehtmlchar "~2.3.0" lodash._reunescapedhtml "~2.3.0" @@ -4894,10 +5601,12 @@ lodash.escape@~2.3.0: lodash.find@^4.5.1: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" + integrity sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E= lodash.flatten@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-3.0.2.tgz#de1cf57758f8f4479319d35c3e9cc60c4501938c" + integrity sha1-3hz1d1j49EeTGdNcPpzGDEUBk4w= dependencies: lodash._baseflatten "^3.0.0" lodash._isiterateecall "^3.0.0" @@ -4905,6 +5614,7 @@ lodash.flatten@^3.0.2: lodash.foreach@~2.3.x: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-2.3.0.tgz#083404c91e846ee77245fdf9d76519c68b2af168" + integrity sha1-CDQEyR6EbudyRf3512UZxosq8Wg= dependencies: lodash._basecreatecallback "~2.3.0" lodash.forown "~2.3.0" @@ -4912,6 +5622,7 @@ lodash.foreach@~2.3.x: lodash.forown@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.forown/-/lodash.forown-2.3.0.tgz#24fb4aaf800d45fc2dc60bfec3ce04c836a3ad7f" + integrity sha1-JPtKr4ANRfwtxgv+w84EyDajrX8= dependencies: lodash._basecreatecallback "~2.3.0" lodash._objecttypes "~2.3.0" @@ -4920,28 +5631,34 @@ lodash.forown@~2.3.0: lodash.identity@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.identity/-/lodash.identity-2.3.0.tgz#6b01a210c9485355c2a913b48b6711219a173ded" + integrity sha1-awGiEMlIU1XCqRO0i2cRIZoXPe0= lodash.isarguments@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= lodash.isarray@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U= lodash.isfunction@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-2.3.0.tgz#6b2973e47a647cf12e70d676aea13643706e5267" + integrity sha1-aylz5HpkfPEucNZ2rqE2Q3BuUmc= lodash.isobject@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.3.0.tgz#2e16d3fc583da9831968953f2d8e6d73434f6799" + integrity sha1-LhbT/Fg9qYMZaJU/LY5tc0NPZ5k= dependencies: lodash._objecttypes "~2.3.0" lodash.keys@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + integrity sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo= dependencies: lodash._getnative "^3.0.0" lodash.isarguments "^3.0.0" @@ -4950,6 +5667,7 @@ lodash.keys@^3.0.0: lodash.keys@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.3.0.tgz#b350f4f92caa9f45a4a2ecf018454cf2f28ae253" + integrity sha1-s1D0+Syqn0WkouzwGEVM8vKK4lM= dependencies: lodash._renative "~2.3.0" lodash._shimkeys "~2.3.0" @@ -4958,32 +5676,39 @@ lodash.keys@~2.3.0: lodash.merge@^4.3.0, lodash.merge@^4.4.0, lodash.merge@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" + integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== lodash.noop@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.noop/-/lodash.noop-2.3.0.tgz#3059d628d51bbf937cd2a0b6fc3a7f212a669c2c" + integrity sha1-MFnWKNUbv5N80qC2/Dp/ISpmnCw= lodash.omit@^4.1.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" + integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA= lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= lodash.support@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.support/-/lodash.support-2.3.0.tgz#7eaf038af4f0d6aab776b44aa6dcfc80334c9bfd" + integrity sha1-fq8DivTw1qq3drRKptz8gDNMm/0= dependencies: lodash._renative "~2.3.0" lodash.template@^4.2.5: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" + integrity sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A= dependencies: lodash._reinterpolate "~3.0.0" lodash.templatesettings "^4.0.0" @@ -4991,6 +5716,7 @@ lodash.template@^4.2.5: lodash.template@~2.3.x: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.3.0.tgz#4e3e29c433b4cfea675ec835e6f12391c61fd22b" + integrity sha1-Tj4pxDO0z+pnXsg15vEjkcYf0is= dependencies: lodash._escapestringchar "~2.3.0" lodash._reinterpolate "~2.3.0" @@ -5003,12 +5729,14 @@ lodash.template@~2.3.x: lodash.templatesettings@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" + integrity sha1-K01OlbpEDZFf8IvImeRVNmZxMxY= dependencies: lodash._reinterpolate "~3.0.0" lodash.templatesettings@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.3.0.tgz#303d132c342710040d5a18efaa2d572fd03f8cdc" + integrity sha1-MD0TLDQnEAQNWhjvqi1XL9A/jNw= dependencies: lodash._reinterpolate "~2.3.0" lodash.escape "~2.3.0" @@ -5016,56 +5744,68 @@ lodash.templatesettings@~2.3.0: lodash.uniq@^4.2.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= lodash.uniqby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" + integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI= lodash.values@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.3.0.tgz#ca96fbe60a20b0b0ec2ba2ba5fc6a765bd14a3ba" + integrity sha1-ypb75gogsLDsK6K6X8anZb0Uo7o= dependencies: lodash.keys "~2.3.0" lodash@3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.8.0.tgz#376eb98bdcd9382a9365c33c4cb8250de1325b91" + integrity sha1-N265i9zZOCqTZcM8TLglDeEyW5E= lodash@^3.10.1: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.6.1: version "4.17.5" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" + integrity sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw== lodash@^4.13.1, lodash@^4.2.0: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== lodash@^4.5.1: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== log-symbols@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== dependencies: chalk "^2.0.1" longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= loose-envify@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + integrity sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg= dependencies: js-tokens "^3.0.0" loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= dependencies: currently-unhandled "^0.4.1" signal-exit "^3.0.0" @@ -5073,10 +5813,12 @@ loud-rejection@^1.0.0: lower-case@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= lru-cache@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + integrity sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew== dependencies: pseudomap "^1.0.2" yallist "^2.1.2" @@ -5084,36 +5826,43 @@ lru-cache@^4.0.1: make-array@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/make-array/-/make-array-0.1.2.tgz#335e36ebb0c5a43154d21213a1ecaeae2a1bb3ef" + integrity sha1-M14267DFpDFU0hIToeyuriobs+8= make-dir@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51" + integrity sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA== dependencies: pify "^3.0.0" makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= dependencies: tmpl "1.0.x" map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= dependencies: object-visit "^1.0.0" markdown-it-terminal@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/markdown-it-terminal/-/markdown-it-terminal-0.1.0.tgz#545abd8dd01c3d62353bfcea71db580b51d22bd9" + integrity sha1-VFq9jdAcPWI1O/zqcdtYC1HSK9k= dependencies: ansi-styles "^3.0.0" cardinal "^1.0.0" @@ -5124,6 +5873,7 @@ markdown-it-terminal@0.1.0: markdown-it@^8.3.0, markdown-it@^8.3.1: version "8.4.0" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.0.tgz#e2400881bf171f7018ed1bd9da441dac8af6306d" + integrity sha512-tNuOCCfunY5v5uhcO2AUMArvKAyKMygX8tfup/JrgnsDqcCATQsAExBq7o5Ml9iMmO82bk6jYNLj6khcrl0JGA== dependencies: argparse "^1.0.7" entities "~1.1.1" @@ -5134,36 +5884,43 @@ markdown-it@^8.3.0, markdown-it@^8.3.1: matcher-collection@^1.0.0, matcher-collection@^1.0.4, matcher-collection@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.0.5.tgz#2ee095438372cb8884f058234138c05c644ec339" + integrity sha512-nUCmzKipcJEwYsBVAFh5P+d7JBuhJaW1xs85Hara9xuMLqtCVUrW6DSC0JVIkluxEH2W45nPBM/wjHtBXa/tYA== dependencies: minimatch "^3.0.2" md5-hex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-2.0.0.tgz#d0588e9f1c74954492ecd24ac0ac6ce997d92e33" + integrity sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM= dependencies: md5-o-matic "^0.1.1" md5-o-matic@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" + integrity sha1-givM1l4RfFFPqxdrJZRdVBAKA8M= mdurl@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= memory-streams@^0.1.0: version "0.1.3" resolved "https://registry.yarnpkg.com/memory-streams/-/memory-streams-0.1.3.tgz#d9b0017b4b87f1d92f55f2745c9caacb1dc93ceb" + integrity sha512-qVQ/CjkMyMInPaaRMrwWNDvf6boRZXaT/DbQeMYcCWuXPEBf1v8qChOc9OlEVQp2uOvRXa1Qu30fLmKhY6NipA== dependencies: readable-stream "~1.0.2" meow@^3.4.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= dependencies: camelcase-keys "^2.0.0" decamelize "^1.1.2" @@ -5179,10 +5936,12 @@ meow@^3.4.0: merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= merge-trees@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-trees/-/merge-trees-1.0.1.tgz#ccbe674569787f9def17fd46e6525f5700bbd23e" + integrity sha1-zL5nRWl4f53vF/1G5lJfVwC70j4= dependencies: can-symlink "^1.0.0" fs-tree-diff "^0.5.4" @@ -5194,14 +5953,17 @@ merge-trees@^1.0.1: merge@^1.1.3, merge@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + integrity sha1-dTHjnUlJwoGma4xabgJl6LBYlNo= methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= micromatch@^2.1.5, micromatch@^2.3.7: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= dependencies: arr-diff "^2.0.0" array-unique "^0.2.1" @@ -5220,6 +5982,7 @@ micromatch@^2.1.5, micromatch@^2.3.7: micromatch@^3.0.4: version "3.1.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.5.tgz#d05e168c206472dfbca985bfef4f57797b4cd4ba" + integrity sha512-ykttrLPQrz1PUJcXjwsTUjGoPJ64StIGNE2lGVD1c9CuguJ+L7/navsE8IcDNndOoCMvYV0qc/exfVbMHkUhvA== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -5238,50 +6001,61 @@ micromatch@^3.0.4: "mime-db@>= 1.30.0 < 2": version "1.32.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.32.0.tgz#485b3848b01a3cda5f968b4882c0771e58e09414" + integrity sha512-+ZWo/xZN40Tt6S+HyakUxnSOgff+JEdaneLWIm0Z6LmpCn5DMcZntLyUY5c/rTDog28LhXLKOUZKoTxTCAdBVw== mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" + integrity sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE= mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7: version "2.1.17" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" + integrity sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo= dependencies: mime-db "~1.30.0" mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== mime@^1.2.11: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== "minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= mixin-deep@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.0.tgz#47a8732ba97799457c8c1eca28f95132d7e8150a" + integrity sha512-dgaCvoh6i1nosAUBKb0l0pfJ78K8+S9fluyIR2YvAeUD/QuMahnFnF3xYty5eYXMjhGSsB0DsW6A0uAZyetoAg== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" @@ -5289,16 +6063,19 @@ mixin-deep@^1.2.0: mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" mktemp@^0.4.0, mktemp@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/mktemp/-/mktemp-0.4.0.tgz#6d0515611c8a8c84e484aa2000129b98e981ff0b" + integrity sha1-bQUVYRyKjITkhKogABKbmOmB/ws= mocha@^3.0.2, mocha@^3.4.2: version "3.5.3" resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.5.3.tgz#1e0480fe36d2da5858d1eb6acc38418b26eaa20d" + integrity sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg== dependencies: browser-stdout "1.3.0" commander "2.9.0" @@ -5316,16 +6093,19 @@ mocha@^3.0.2, mocha@^3.4.2: moment-timezone@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.3.1.tgz#3ef47856b02d53b718a10a5ec2023aa299e07bf5" + integrity sha1-PvR4VrAtU7cYoQpewgI6opnge/U= dependencies: moment ">= 2.6.0" "moment@>= 2.6.0": version "2.20.1" resolved "https://registry.yarnpkg.com/moment/-/moment-2.20.1.tgz#d6eb1a46cbcc14a2b2f9434112c1ff8907f313fd" + integrity sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg== morgan@^1.8.1: version "1.9.0" resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.0.tgz#d01fa6c65859b76fcf31b3cb53a3821a311d8051" + integrity sha1-0B+mxlhZt2/PMbPLU6OCGjEdgFE= dependencies: basic-auth "~2.0.0" debug "2.6.9" @@ -5336,34 +6116,42 @@ morgan@^1.8.1: mout@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mout/-/mout-1.1.0.tgz#0b29d41e6a80fa9e2d4a5be9d602e1d9d02177f6" + integrity sha512-XsP0vf4As6BfqglxZqbqQ8SR6KQot2AgxvR0gG+WtUkf90vUXchMOZQtPf/Hml1rEffJupqL/tIrU6EYhsUQjw== ms@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + integrity sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg= ms@0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + integrity sha1-riXPJRKziFodldfwN4aNhDESR2U= ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= mustache@^2.2.1: version "2.3.0" resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.0.tgz#4028f7778b17708a489930a6e52ac3bca0da41d0" + integrity sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA= mute-stream@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" + integrity sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s= mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= mz@^2.6.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== dependencies: any-promise "^1.0.0" object-assign "^4.0.1" @@ -5372,6 +6160,7 @@ mz@^2.6.0: najax@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/najax/-/najax-1.0.3.tgz#11145f4d910446ea661d8ab7fcef53f6ad164ae5" + integrity sha1-ERRfTZEERupmHYq3/O9T9q0WSuU= dependencies: jquery-deferred "^0.3.0" lodash.defaultsdeep "^4.6.0" @@ -5380,10 +6169,12 @@ najax@^1.0.2: nan@^2.3.0: version "2.8.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" + integrity sha1-7XFfP+neArV6XmJS2QqWZ14fCFo= nanomatch@^1.2.5: version "1.2.7" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.7.tgz#53cd4aa109ff68b7f869591fdc9d10daeeea3e79" + integrity sha512-/5ldsnyurvEw7wNpxLFgjVvBLMta43niEYOy0CJ4ntcYSbx6bugRUTQeFb4BR/WanEL1o3aQgHuVLHQaB6tOqg== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -5400,20 +6191,24 @@ nanomatch@^1.2.5: natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= no-case@^2.2.0: version "2.3.2" resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== dependencies: lower-case "^1.1.1" node-fetch@^1.3.3: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== dependencies: encoding "^0.1.11" is-stream "^1.0.1" @@ -5421,14 +6216,17 @@ node-fetch@^1.3.3: node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= node-modules-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/node-modules-path/-/node-modules-path-1.0.1.tgz#40096b08ce7ad0ea14680863af449c7c75a5d1c8" + integrity sha1-QAlrCM560OoUaAhjr0ScfHWl0cg= node-notifier@^5.0.1: version "5.2.1" resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" + integrity sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg== dependencies: growly "^1.3.0" semver "^5.4.1" @@ -5438,6 +6236,7 @@ node-notifier@^5.0.1: node-pre-gyp@^0.6.39: version "0.6.39" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" + integrity sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ== dependencies: detect-libc "^1.0.2" hawk "3.1.3" @@ -5454,12 +6253,14 @@ node-pre-gyp@^0.6.39: nopt@^3.0.3, nopt@^3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= dependencies: abbrev "1" nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= dependencies: abbrev "1" osenv "^0.1.4" @@ -5467,6 +6268,7 @@ nopt@^4.0.1: normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== dependencies: hosted-git-info "^2.1.4" is-builtin-module "^1.0.0" @@ -5476,16 +6278,19 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: normalize-path@^2.0.0, normalize-path@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" npm-git-info@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/npm-git-info/-/npm-git-info-1.0.3.tgz#a933c42ec321e80d3646e0d6e844afe94630e1d5" + integrity sha1-qTPELsMh6A02RuDW6ESv6UYw4dU= npm-package-arg@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.0.0.tgz#8cce04b49d3f9faec3f56b0fe5f4391aeb9d2fac" + integrity sha512-hwC7g81KLgRmchv9ol6f3Fx4Yyc9ARX5X5niDHVILgpuvf08JRIgOZcEfpFXli3BgESoTrkauqorXm6UbvSgSg== dependencies: hosted-git-info "^2.5.0" osenv "^0.1.4" @@ -5495,12 +6300,14 @@ npm-package-arg@^6.0.0: npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= dependencies: path-key "^2.0.0" npmlog@^4.0.0, npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" @@ -5510,34 +6317,42 @@ npmlog@^4.0.0, npmlog@^4.0.2: number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= "nwmatcher@>= 1.3.9 < 2.0.0": version "1.4.3" resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c" + integrity sha512-IKdSTiDWCarf2JTS5e9e2+5tPZGdkRJ79XjYV0pzK8Q9BpsFyBq1RGKxzs7Q8UBushGw7m6TzVKz6fcY99iSWw== nwsapi@^2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.7.tgz#6fc54c254621f10cac5225b76e81c74120139b78" + integrity sha512-VZXniaaaORAXGCNsvUNefsKRQYk8zCzQZ57jalgrpHcU70OrAzKAiN/3plYtH/VPRmZeYyUzQiYfKzcMXC1g5Q== oauth-sign@~0.8.1, oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM= object-assign@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + integrity sha1-ejs9DpgGPUP0wD8uiubNUahog6A= object-assign@4.1.1, object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object-component@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" @@ -5546,12 +6361,14 @@ object-copy@^0.1.0: object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= dependencies: isobject "^3.0.0" object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= dependencies: for-own "^0.1.4" is-extendable "^0.1.1" @@ -5559,38 +6376,45 @@ object.omit@^2.0.0: object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= dependencies: isobject "^3.0.1" on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= dependencies: ee-first "1.1.1" on-headers@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + integrity sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c= once@^1.3.0, once@^1.3.3: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" onetime@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k= onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= dependencies: mimic-fn "^1.0.0" optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= dependencies: minimist "~0.0.1" wordwrap "~0.0.2" @@ -5598,6 +6422,7 @@ optimist@^0.6.1: optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= dependencies: deep-is "~0.1.3" fast-levenshtein "~2.0.4" @@ -5609,10 +6434,12 @@ optionator@^0.8.1, optionator@^0.8.2: options@>=0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" + integrity sha1-7CLTEoBrtT5zF3Pnza788cZDEo8= ora@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ora/-/ora-1.4.0.tgz#884458215b3a5d4097592285f93321bb7a79e2e5" + integrity sha512-iMK1DOQxzzh2MBlVsU42G80mnrvUhqsMh74phHtDlrcTZPK0pH6o7l7DRshK+0YsxDyEuaOkziVdvM3T0QTzpw== dependencies: chalk "^2.1.0" cli-cursor "^2.1.0" @@ -5622,18 +6449,22 @@ ora@^1.3.0: os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= os-shim@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" + integrity sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc= os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= osenv@^0.1.3, osenv@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + integrity sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ= dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" @@ -5641,26 +6472,31 @@ osenv@^0.1.3, osenv@^0.1.4: p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= p-limit@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" + integrity sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng== dependencies: p-try "^1.0.0" p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= dependencies: p-limit "^1.1.0" p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= dependencies: glob-base "^0.3.0" is-dotfile "^1.0.0" @@ -5670,90 +6506,109 @@ parse-glob@^3.0.4: parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= dependencies: error-ex "^1.2.0" parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= parse5@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== parse5@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" + integrity sha1-m387DeMr543CQBsXVzzK8Pb1nZQ= parsejson@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab" + integrity sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs= dependencies: better-assert "~1.0.0" parseqs@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= dependencies: better-assert "~1.0.0" parseuri@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= dependencies: better-assert "~1.0.0" parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= passwd-user@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/passwd-user/-/passwd-user-1.2.1.tgz#a01a5dc639ef007dc56364b8178569080ad3a7b8" + integrity sha1-oBpdxjnvAH3FY2S4F4VpCArTp7g= dependencies: exec-file-sync "^2.0.0" path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= dependencies: pinkie-promise "^2.0.0" path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= path-key@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + integrity sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME= path-posix@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/path-posix/-/path-posix-1.0.0.tgz#06b26113f56beab042545a23bfa88003ccac260f" + integrity sha1-BrJhE/Vr6rBCVFojv6iAA8ysJg8= path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= dependencies: graceful-fs "^4.1.2" pify "^2.0.0" @@ -5762,44 +6617,54 @@ path-type@^1.0.0: pathval@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" + integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + integrity sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU= performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== portfinder@^1.0.7: version "1.0.13" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" + integrity sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek= dependencies: async "^1.5.2" debug "^2.2.0" @@ -5808,18 +6673,22 @@ portfinder@^1.0.7: posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= pretender@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/pretender/-/pretender-2.1.0.tgz#cd75bff9624e996bcfadbd7dbd023ca1f4f3033a" + integrity sha512-GG1ZtA2yjorrSf9x3DR4Pv5228s/H92itSnIAxRx2wsmz549BsuIuJN+jPJgj0p+tCJBfBlmVgJLFG6t64M+EA== dependencies: "@xg-wang/whatwg-fetch" "^3.0.0" fake-xml-http-request "^2.0.0" @@ -5828,34 +6697,41 @@ pretender@2.1.0: printf@^0.2.3: version "0.2.5" resolved "https://registry.yarnpkg.com/printf/-/printf-0.2.5.tgz#c438ca2ca33e3927671db4ab69c0e52f936a4f0f" + integrity sha1-xDjKLKM+OSdnHbSracDlL5NqTw8= private@^0.1.6, private@^0.1.7, private@~0.1.5: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== 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" + integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= process-relative-require@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/process-relative-require/-/process-relative-require-1.0.0.tgz#1590dfcf5b8f2983ba53e398446b68240b4cc68a" + integrity sha1-FZDfz1uPKYO6U+OYRGtoJAtMxoo= dependencies: node-modules-path "^1.0.0" progress@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + integrity sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8= promise-map-series@^0.2.1: version "0.2.3" resolved "https://registry.yarnpkg.com/promise-map-series/-/promise-map-series-0.2.3.tgz#c2d377afc93253f6bd03dbb77755eb88ab20a847" + integrity sha1-wtN3r8kyU/a9A9u3d1XriKsgqEc= dependencies: rsvp "^3.0.14" proxy-addr@~2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec" + integrity sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew= dependencies: forwarded "~0.1.2" ipaddr.js "1.5.2" @@ -5863,34 +6739,42 @@ proxy-addr@~2.0.2: pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= psl@^1.1.24: version "1.1.28" resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.28.tgz#4fb6ceb08a1e2214d4fd4de0ca22dae13740bc7b" + integrity sha512-+AqO1Ae+N/4r7Rvchrdm432afjT9hqJRyBN3DQv9At0tPz4hIFSGKbq64fN9dVoCow4oggIIax5/iONx0r9hZw== punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== qs@6.5.1, qs@^6.4.0, qs@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + integrity sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A== qs@^6.2.0: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + integrity sha1-E+JtKK1rD/qpExLNO/cI7TUecjM= quick-temp@^0.1.0, quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quick-temp@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/quick-temp/-/quick-temp-0.1.8.tgz#bab02a242ab8fb0dd758a3c9776b32f9a5d94408" + integrity sha1-urAqJCq4+w3XWKPJd2sy+aXZRAg= dependencies: mktemp "~0.4.0" rimraf "^2.5.4" @@ -5899,6 +6783,7 @@ quick-temp@^0.1.0, quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quic qunit-dom@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-0.5.0.tgz#b08db6f919656e0589ebf8bd85bc313febb454d8" + integrity sha1-sI22+RllbgWJ6/i9hbwxP+u0VNg= dependencies: broccoli-funnel "^2.0.0" broccoli-merge-trees "^2.0.0" @@ -5906,6 +6791,7 @@ qunit-dom@^0.5.0: qunit@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.5.0.tgz#64cbe30a1193ef02edc5b278efcdf1d0bae96b22" + integrity sha512-GVvRr8ISFMs4SkTWFsaUzMBs7QEuiXVT4orlFgyHkmeXO1ijlDkhW6ecPri4urXiE4BUXEULJAtFlV1MWgg4Uw== dependencies: chokidar "1.7.0" commander "2.12.2" @@ -5919,6 +6805,7 @@ qunit@^2.5.0: randomatic@^1.1.3: version "1.1.7" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" + integrity sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how== dependencies: is-number "^3.0.0" kind-of "^4.0.0" @@ -5926,10 +6813,12 @@ randomatic@^1.1.3: range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= raw-body@2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" + integrity sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k= dependencies: bytes "3.0.0" http-errors "1.6.2" @@ -5939,6 +6828,7 @@ raw-body@2.3.2: raw-body@~1.1.0: version "1.1.7" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.1.7.tgz#1d027c2bfa116acc6623bca8f00016572a87d425" + integrity sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU= dependencies: bytes "1" string_decoder "0.10" @@ -5946,6 +6836,7 @@ raw-body@~1.1.0: rc@^1.1.7: version "1.2.5" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd" + integrity sha1-J1zWh/bjs2zHVrqibf7oCnkDAf0= dependencies: deep-extend "~0.4.0" ini "~1.3.0" @@ -5955,6 +6846,7 @@ rc@^1.1.7: read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= dependencies: find-up "^1.0.0" read-pkg "^1.0.0" @@ -5962,6 +6854,7 @@ read-pkg-up@^1.0.1: read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= dependencies: load-json-file "^1.0.0" normalize-package-data "^2.3.2" @@ -5970,6 +6863,7 @@ read-pkg@^1.0.0: readable-stream@^2, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" + integrity sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -5982,6 +6876,7 @@ readable-stream@^2, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-str readable-stream@~1.0.2: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= dependencies: core-util-is "~1.0.0" inherits "~2.0.1" @@ -5991,6 +6886,7 @@ readable-stream@~1.0.2: readdirp@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + integrity sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg= dependencies: graceful-fs "^4.1.2" minimatch "^3.0.2" @@ -6000,6 +6896,7 @@ readdirp@^2.0.0: recast@^0.11.3: version "0.11.23" resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" + integrity sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM= dependencies: ast-types "0.9.6" esprima "~3.1.0" @@ -6009,6 +6906,7 @@ recast@^0.11.3: redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= dependencies: indent-string "^2.1.0" strip-indent "^1.0.1" @@ -6016,24 +6914,29 @@ redent@^1.0.0: redeyed@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-1.0.1.tgz#e96c193b40c0816b00aec842698e61185e55498a" + integrity sha1-6WwZO0DAgWsArshCaY5hGF5VSYo= dependencies: esprima "~3.0.0" regenerate@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" + integrity sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg== regenerator-runtime@^0.10.5: version "0.10.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-transform@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== dependencies: babel-runtime "^6.18.0" babel-types "^6.19.0" @@ -6042,18 +6945,21 @@ regenerator-transform@^0.10.0: regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== dependencies: is-equal-shallow "^0.1.3" regex-not@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.0.tgz#42f83e39771622df826b02af176525d6a5f157f9" + integrity sha1-Qvg+OXcWIt+CawKvF2Ul1qXxV/k= dependencies: extend-shallow "^2.0.1" regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= dependencies: regenerate "^1.2.1" regjsgen "^0.2.0" @@ -6062,40 +6968,48 @@ regexpu-core@^2.0.0: regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= regjsparser@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= dependencies: jsesc "~0.5.0" remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + integrity sha1-7wiaF40Ug7quTZPrmLT55OEdmQo= repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= dependencies: is-finite "^1.0.0" request-promise-core@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" + integrity sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY= dependencies: lodash "^4.13.1" request-promise-native@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" + integrity sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU= dependencies: request-promise-core "1.1.1" stealthy-require "^1.1.0" @@ -6104,6 +7018,7 @@ request-promise-native@^1.0.5: request@2.81.0: version "2.81.0" resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + integrity sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA= dependencies: aws-sign2 "~0.6.0" aws4 "^1.2.1" @@ -6131,6 +7046,7 @@ request@2.81.0: request@^2.74.0, request@^2.79.0: version "2.83.0" resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" + integrity sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw== dependencies: aws-sign2 "~0.7.0" aws4 "^1.6.0" @@ -6158,6 +7074,7 @@ request@^2.74.0, request@^2.79.0: request@^2.81.0, request@^2.87.0: version "2.87.0" resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" + integrity sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw== dependencies: aws-sign2 "~0.7.0" aws4 "^1.6.0" @@ -6183,12 +7100,14 @@ request@^2.81.0, request@^2.87.0: require-folder-tree@^1.4.5: version "1.4.5" resolved "https://registry.yarnpkg.com/require-folder-tree/-/require-folder-tree-1.4.5.tgz#dfe553cbab98cc88e1c56a3f2f358f06ef85bcb0" + integrity sha1-3+VTy6uYzIjhxWo/LzWPBu+FvLA= dependencies: lodash "3.8.0" require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= dependencies: caller-path "^0.1.0" resolve-from "^1.0.0" @@ -6196,14 +7115,17 @@ require-uncached@^1.0.3: requireindex@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162" + integrity sha1-5UBLgVV+91225JxacgBIk/4D4WI= requires-port@1.x.x: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= resolve-dir@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" + integrity sha1-shklmlYC+sXFxJatiUpujMQwJh4= dependencies: expand-tilde "^1.2.2" global-modules "^0.2.3" @@ -6211,6 +7133,7 @@ resolve-dir@^0.1.0: resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= dependencies: expand-tilde "^2.0.0" global-modules "^1.0.0" @@ -6218,26 +7141,31 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1: resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= resolve@1.5.0, resolve@^1.1.6, resolve@^1.3.0, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" + integrity sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw== dependencies: path-parse "^1.0.5" resolve@^1.1.7: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" + integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== dependencies: path-parse "^1.0.5" restore-cursor@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + integrity sha1-NGYfRohjJ/7SmRR5FSJS35LapUE= dependencies: exit-hook "^1.0.0" onetime "^1.0.0" @@ -6245,6 +7173,7 @@ restore-cursor@^1.0.1: restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= dependencies: onetime "^2.0.0" signal-exit "^3.0.2" @@ -6252,78 +7181,95 @@ restore-cursor@^2.0.0: right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= dependencies: align-text "^0.1.1" rimraf@2, rimraf@^2.2.8, rimraf@^2.3.2, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.1, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== dependencies: glob "^7.0.5" rimraf@~2.2.6: version "2.2.8" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= route-recognizer@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.3.tgz#1d365e27fa6995e091675f7dc940a8c00353bd29" + integrity sha1-HTZeJ/ppleCRZ199yUCowANTvSk= route-recognizer@^0.3.4: version "0.3.4" resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.4.tgz#39ab1ffbce1c59e6d2bdca416f0932611e4f3ca3" + integrity sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g== rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.2.1, rsvp@^3.3.1, rsvp@^3.3.3, rsvp@^3.5.0: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" + integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== rsvp@^4.6.1, rsvp@^4.7.0: version "4.8.1" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.1.tgz#168addb3963222de37ee351b70e3876bdb2ac285" + integrity sha512-c9tShmZbQ5nLVVVl3Fuhk1NExJlXfAMIEz7a8GC570X8XhNQNZPFAdjOeMmJEN3SLYOOb2OprS576P/QO4QouA== rsvp@^4.8.2: version "4.8.3" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.3.tgz#25d4b9fdd0f95e216eb5884d9b3767d3fbfbe2cd" + integrity sha512-/OlbK31XtkPnLD2ktmZXj4g/v6q1boTDr6/3lFuDTgxVsrA3h7PH5eYyAxIvDMjRHr/DoOlzNicqDwBEo9xU7g== rsvp@~3.0.6: version "3.0.21" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.0.21.tgz#49c588fe18ef293bcd0ab9f4e6756e6ac433359f" + integrity sha1-ScWI/hjvKTvNCrn05nVuasQzNZ8= rsvp@~3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.2.1.tgz#07cb4a5df25add9e826ebc67dcc9fd89db27d84a" + integrity sha1-B8tKXfJa3Z6Cbrxn3Mn9idsn2Eo= run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= dependencies: is-promise "^2.1.0" rx-lite-aggregates@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= dependencies: rx-lite "*" rx-lite@*, rx-lite@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= rx@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== safe-json-parse@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" + integrity sha1-PnZyPjjf3aE8mx0poeB//uSzC1c= sane@^1.1.1, sane@^1.4.1: version "1.7.0" resolved "https://registry.yarnpkg.com/sane/-/sane-1.7.0.tgz#b3579bccb45c94cf20355cc81124990dfd346e30" + integrity sha1-s1ebzLRclM8gNVzIESSZDf00bjA= dependencies: anymatch "^1.3.0" exec-sh "^0.2.0" @@ -6336,6 +7282,7 @@ sane@^1.1.1, sane@^1.4.1: sane@^2.2.0: version "2.4.1" resolved "https://registry.yarnpkg.com/sane/-/sane-2.4.1.tgz#29f991208cf28636720efdc584293e7fd66663a5" + integrity sha512-fW9svvNd81XzHDZyis9/tEY1bZikDGryy8Hi1BErPyNPYv47CdLseUN+tI5FBHWXEENRtj1SWtX/jBnggLaP0w== dependencies: anymatch "^1.3.0" exec-sh "^0.2.0" @@ -6350,18 +7297,22 @@ sane@^2.2.0: sax@^1.2.1, sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== "semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.1.1, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== semver@^4.3.1: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= send@0.16.1: version "0.16.1" resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" + integrity sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A== dependencies: debug "2.6.9" depd "~1.1.1" @@ -6380,6 +7331,7 @@ send@0.16.1: serve-static@1.13.1: version "1.13.1" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" + integrity sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ== dependencies: encodeurl "~1.0.1" escape-html "~1.0.3" @@ -6389,20 +7341,24 @@ serve-static@1.13.1: set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= set-getter@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376" + integrity sha1-12nBgsnVpR9AkUXy+6guXoboA3Y= dependencies: to-object-path "^0.3.0" set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= set-value@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -6412,6 +7368,7 @@ set-value@^0.4.3: set-value@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -6421,62 +7378,75 @@ set-value@^2.0.0: setprototypeof@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + integrity sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ= setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= dependencies: shebang-regex "^1.0.0" shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= shelljs@^0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.2.6.tgz#90492d72ffcc8159976baba62fb0f6884f0c3378" + integrity sha1-kEktcv/MgVmXa6umL7D2iE8MM3g= shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= silent-error@^1.0.0, silent-error@^1.0.1, silent-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/silent-error/-/silent-error-1.1.0.tgz#2209706f1c850a9f1d10d0d840918b46f26e1bc9" + integrity sha1-IglwbxyFCp8dENDYQJGLRvJuG8k= dependencies: debug "^2.2.0" simple-dom@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/simple-dom/-/simple-dom-1.3.0.tgz#8473e0d34e340544b061410dba3faf4f1b7aa282" + integrity sha512-RVjr6e80FFGDqDJZeQd4EMwoDLatn4Jy2SfuXecrP1IgG4ZAqkGSokE8LNV5i0kzWR2IM0e257xGN9JS8lxm0Q== slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= slice-ansi@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== dependencies: is-fullwidth-code-point "^2.0.0" snake-case@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f" + integrity sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8= dependencies: no-case "^2.2.0" snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: define-property "^1.0.0" isobject "^3.0.0" @@ -6485,12 +7455,14 @@ snapdragon-node@^2.0.1: snapdragon-util@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== dependencies: kind-of "^3.2.0" snapdragon@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.1.tgz#e12b5487faded3e3dea0ac91e9400bf75b401370" + integrity sha1-4StUh/re0+PeoKyR6UAL91tAE3A= dependencies: base "^0.11.1" debug "^2.2.0" @@ -6504,18 +7476,21 @@ snapdragon@^0.8.1: sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + integrity sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg= dependencies: hoek "2.x.x" sntp@2.x.x: version "2.1.0" resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" + integrity sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg== dependencies: hoek "4.x.x" socket.io-adapter@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" + integrity sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s= dependencies: debug "2.3.3" socket.io-parser "2.3.1" @@ -6523,6 +7498,7 @@ socket.io-adapter@0.5.0: socket.io-client@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.6.0.tgz#5b668f4f771304dfeed179064708386fa6717853" + integrity sha1-W2aPT3cTBN/u0XkGRwg4b6ZxeFM= dependencies: backo2 "1.0.2" component-bind "1.0.0" @@ -6539,6 +7515,7 @@ socket.io-client@1.6.0: socket.io-parser@2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0" + integrity sha1-3VMgJRA85Clpcya+/WQAX8/ltKA= dependencies: component-emitter "1.1.2" debug "2.2.0" @@ -6548,6 +7525,7 @@ socket.io-parser@2.3.1: socket.io@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.6.0.tgz#3e40d932637e6bd923981b25caf7c53e83b6e2e1" + integrity sha1-PkDZMmN+a9kjmBslyvfFPoO24uE= dependencies: debug "2.3.3" engine.io "1.8.0" @@ -6560,16 +7538,19 @@ socket.io@1.6.0: sort-object-keys@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.2.tgz#d3a6c48dc2ac97e6bc94367696e03f6d09d37952" + integrity sha1-06bEjcKsl+a8lDZ2luA/bQnTeVI= sort-package-json@^1.4.0: version "1.7.1" resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.7.1.tgz#f2e5fbffe8420cc1bb04485f4509f05e73b4c0f2" + integrity sha1-8uX7/+hCDMG7BEhfRQnwXnO0wPI= dependencies: sort-object-keys "^1.1.1" source-map-resolve@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" + integrity sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A== dependencies: atob "^2.0.0" decode-uri-component "^0.2.0" @@ -6580,12 +7561,14 @@ source-map-resolve@^0.5.0: source-map-support@^0.4.15: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== dependencies: source-map "^0.5.6" source-map-support@^0.5.0: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" + integrity sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -6593,34 +7576,41 @@ source-map-support@^0.5.0: source-map-url@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" + integrity sha1-fsrxO1e80J2opAxdJp2zN5nUqvk= source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= source-map@0.4.x, source-map@^0.4.2, source-map@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha1-66T12pwNyZneaAMti092FzZSA2s= dependencies: amdefine ">=0.0.4" source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.1, source-map@~0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= source-map@^0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@~0.1.x: version "0.1.43" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y= dependencies: amdefine ">=0.0.4" sourcemap-validator@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/sourcemap-validator/-/sourcemap-validator-1.0.6.tgz#abd2f1ecdae6a3c46c2c96c5f256705b2147c9c0" + integrity sha1-q9Lx7Nrmo8RsLJbF8lZwWyFHycA= dependencies: jsesc "~0.3.x" lodash.foreach "~2.3.x" @@ -6630,10 +7620,12 @@ sourcemap-validator@^1.0.5: spawn-args@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/spawn-args/-/spawn-args-0.2.0.tgz#fb7d0bd1d70fd4316bd9e3dec389e65f9d6361bb" + integrity sha1-+30L0dcP1DFr2ePew4nmX51jYbs= spawn-sync@^1.0.11, spawn-sync@^1.0.15: version "1.0.15" resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" + integrity sha1-sAeZVX63+wyDdsKdROih6mfldHY= dependencies: concat-stream "^1.4.7" os-shim "^0.1.2" @@ -6641,42 +7633,51 @@ spawn-sync@^1.0.11, spawn-sync@^1.0.15: spawnback@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/spawnback/-/spawnback-1.0.0.tgz#f73662f7e54d95367eca74d6426c677dd7ea686f" + integrity sha1-9zZi9+VNlTZ+ynTWQmxnfdfqaG8= spdx-correct@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + integrity sha1-SzBz2TP/UfORLwOsVRlJikFQ20A= dependencies: spdx-license-ids "^1.0.2" spdx-expression-parse@~1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + integrity sha1-m98vIOH0DtRH++JzJmGR/O1RYmw= spdx-license-ids@^1.0.2: version "1.2.2" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + integrity sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc= split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== dependencies: extend-shallow "^3.0.0" sprintf-js@^1.0.3: version "1.1.1" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c" + integrity sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw= sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sri-toolbox@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/sri-toolbox/-/sri-toolbox-0.2.0.tgz#a7fea5c3fde55e675cf1c8c06f3ebb5c2935835e" + integrity sha1-p/6lw/3lXmdc8cjAbz67XCk1g14= sshpk@^1.7.0: version "1.13.1" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + integrity sha1-US322mKHFEMW3EwY/hzx2UBzm+M= dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -6691,6 +7692,7 @@ sshpk@^1.7.0: static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= dependencies: define-property "^0.2.5" object-copy "^0.1.0" @@ -6698,22 +7700,27 @@ static-extend@^0.1.1: "statuses@>= 1.3.1 < 2": version "1.4.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== statuses@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= stealthy-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= string-template@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" + integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0= string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" @@ -6722,6 +7729,7 @@ string-width@^1.0.1, string-width@^1.0.2: string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" @@ -6729,106 +7737,127 @@ string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: string_decoder@0.10, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= string_decoder@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + integrity sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ== dependencies: safe-buffer "~5.1.0" stringstream@~0.0.4, stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + integrity sha1-TkhM1N5aC7vuGORjB3EKioFiGHg= strip-ansi@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" + integrity sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA= dependencies: ansi-regex "^0.2.1" strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= dependencies: ansi-regex "^3.0.0" strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= dependencies: is-utf8 "^0.2.0" strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= dependencies: get-stdin "^4.0.1" strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= styled_string@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/styled_string/-/styled_string-0.0.1.tgz#d22782bd81295459bc4f1df18c4bad8e94dd124a" + integrity sha1-0ieCvYEpVFm8Tx3xjEutjpTdEko= sum-up@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/sum-up/-/sum-up-1.0.3.tgz#1c661f667057f63bcb7875aa1438bc162525156e" + integrity sha1-HGYfZnBX9jvLeHWqFDi8FiUlFW4= dependencies: chalk "^1.0.0" supports-color@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + integrity sha1-cqJiiU2dQIuVbKBf83su2KbiotU= dependencies: has-flag "^1.0.0" supports-color@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" + integrity sha1-2S3iaU6z9nMjlz1649i1W0wiGQo= supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= supports-color@^4.0.0: version "4.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" + integrity sha1-vnoN5ITexcXN34s9WRJQRJEvY1s= dependencies: has-flag "^2.0.0" supports-color@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.2.0.tgz#b0d5333b1184dd3666cbe5aa0b45c5ac7ac17a4a" + integrity sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q== dependencies: has-flag "^3.0.0" symbol-tree@^3.2.1, symbol-tree@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.3, symlink-or-copy@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.1.8.tgz#cabe61e0010c1c023c173b25ee5108b37f4b4aa3" + integrity sha1-yr5h4AEMHAI8Fzsl7lEIs39LSqM= table@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" + integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA== dependencies: ajv "^5.2.3" ajv-keywords "^2.1.0" @@ -6840,6 +7869,7 @@ table@^4.0.1: tap-parser@^5.1.0: version "5.4.0" resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-5.4.0.tgz#6907e89725d7b7fa6ae41ee2c464c3db43188aec" + integrity sha512-BIsIaGqv7uTQgTW1KLTMNPSEQf4zDDPgYOBRdgOfuB+JFOLRBfEu6cLa/KvMvmqggu1FKXDfitjLwsq4827RvA== dependencies: events-to-array "^1.0.1" js-yaml "^3.2.7" @@ -6849,6 +7879,7 @@ tap-parser@^5.1.0: tar-pack@^3.4.0: version "3.4.1" resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" + integrity sha512-PPRybI9+jM5tjtCbN2cxmmRU7YmqT3Zv/UDy48tAh2XRkLa9bAORtSWLkVc13+GJF+cdTh1yEnHEk3cpTaL5Kg== dependencies: debug "^2.2.0" fstream "^1.0.10" @@ -6862,6 +7893,7 @@ tar-pack@^3.4.0: tar@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + integrity sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE= dependencies: block-stream "*" fstream "^1.0.2" @@ -6870,6 +7902,7 @@ tar@^2.2.1: temp@0.8.3, temp@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" + integrity sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k= dependencies: os-tmpdir "^1.0.0" rimraf "~2.2.6" @@ -6877,6 +7910,7 @@ temp@0.8.3, temp@^0.8.3: testem@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/testem/-/testem-2.0.0.tgz#b05c96200c7ac98bae998d71c94c0c5345907d13" + integrity sha1-sFyWIAx6yYuumY1xyUwMU0WQfRM= dependencies: backbone "^1.1.2" bluebird "^3.4.6" @@ -6909,30 +7943,36 @@ testem@^2.0.0: text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= "textextensions@1 || 2": version "2.2.0" resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.2.0.tgz#38ac676151285b658654581987a0ce1a4490d286" + integrity sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA== thenify-all@^1.0.0, thenify-all@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= dependencies: thenify ">= 3.1.0 < 4" "thenify@>= 3.1.0 < 4": version "3.3.0" resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" + integrity sha1-5p44obq+lpsBCCB5eLn2K4hgSDk= dependencies: any-promise "^1.0.0" through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= tiny-lr@^1.0.3: version "1.1.0" resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.1.0.tgz#a373bce2a4b58cef9a64433360ba593155f4cd45" + integrity sha512-f4X68a6KHcCx/XJcZUKAa92APjY9EHxuGOzRFmPRjf+fOp1E7fi4dGJaHMxvRBxwZrHrIvn/AwkFaDS7O1WZDQ== dependencies: body "^5.1.0" debug "~2.6.7" @@ -6944,52 +7984,62 @@ tiny-lr@^1.0.3: tmp@0.0.28: version "0.0.28" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" + integrity sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA= dependencies: os-tmpdir "~1.0.1" tmp@0.0.31: version "0.0.31" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" + integrity sha1-jzirlDjhcxXl29izZX6L+yd65Kc= dependencies: os-tmpdir "~1.0.1" tmp@^0.0.29: version "0.0.29" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" + integrity sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA= dependencies: os-tmpdir "~1.0.1" tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= to-array@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= dependencies: is-number "^3.0.0" repeat-string "^1.6.1" @@ -6997,6 +8047,7 @@ to-regex-range@^2.1.0: to-regex@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.1.tgz#15358bee4a2c83bd76377ba1dc049d0f18837aae" + integrity sha1-FTWL7kosg712N3uh3ASdDxiDeq4= dependencies: define-property "^0.2.5" extend-shallow "^2.0.1" @@ -7005,6 +8056,7 @@ to-regex@^3.0.1: tough-cookie@>=2.3.3, tough-cookie@^2.3.4: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== dependencies: psl "^1.1.24" punycode "^1.4.1" @@ -7012,22 +8064,26 @@ tough-cookie@>=2.3.3, tough-cookie@^2.3.4: tough-cookie@^2.3.2, tough-cookie@~2.3.0, tough-cookie@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" + integrity sha1-C2GKVWW23qkL80JdBNVe3EdadWE= dependencies: punycode "^1.4.1" tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= dependencies: punycode "^2.1.0" tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= tree-sync@^1.2.1, tree-sync@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-sync/-/tree-sync-1.2.2.tgz#2cf76b8589f59ffedb58db5a3ac7cb013d0158b7" + integrity sha1-LPdrhYn1n/7bWNtaOsfLAT0BWLc= dependencies: debug "^2.2.0" fs-tree-diff "^0.5.6" @@ -7038,34 +8094,41 @@ tree-sync@^1.2.1, tree-sync@^1.2.2: trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= dependencies: prelude-ls "~1.1.2" type-detect@^4.0.0: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== type-is@~1.6.15: version "1.6.15" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" + integrity sha1-yrEPtJCeRByChC6v4a1kbIGARBA= dependencies: media-typer "0.3.0" mime-types "~2.1.15" @@ -7073,14 +8136,17 @@ type-is@~1.6.15: typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= uc.micro@^1.0.1, uc.micro@^1.0.3: version "1.0.5" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376" + integrity sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg== uglify-es@^3.1.3: version "3.3.9" resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" + integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== dependencies: commander "~2.13.0" source-map "~0.6.1" @@ -7088,6 +8154,7 @@ uglify-es@^3.1.3: uglify-js@^2.6: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= dependencies: source-map "~0.5.1" yargs "~3.10.0" @@ -7097,18 +8164,22 @@ uglify-js@^2.6: 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" + integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= uid-number@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= ultron@1.0.x: version "1.0.2" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" + integrity sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po= underscore.string@^3.2.2, underscore.string@~3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db" + integrity sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s= dependencies: sprintf-js "^1.0.3" util-deprecate "^1.0.2" @@ -7116,10 +8187,12 @@ underscore.string@^3.2.2, underscore.string@~3.3.4: underscore@>=1.8.3: version "1.8.3" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" + integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI= union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= dependencies: arr-union "^3.1.0" get-value "^2.0.6" @@ -7129,20 +8202,24 @@ union-value@^1.0.0: unique-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= dependencies: crypto-random-string "^1.0.0" universalify@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + integrity sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc= unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= dependencies: has-value "^0.3.1" isobject "^3.0.0" @@ -7150,16 +8227,19 @@ unset-value@^1.0.0: untildify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/untildify/-/untildify-2.1.0.tgz#17eb2807987f76952e9c0485fc311d06a826a2e0" + integrity sha1-F+soB5h/dpUunASF/DEdBqgmouA= dependencies: os-homedir "^1.0.0" urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= use@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8" + integrity sha1-riig1y+TvyJCKhii43mZMRLeyOg= dependencies: define-property "^0.2.5" isobject "^3.0.0" @@ -7168,6 +8248,7 @@ use@^2.0.0: user-info@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/user-info/-/user-info-1.0.0.tgz#81c82b7ed63e674c2475667653413b3c76fde239" + integrity sha1-gcgrftY+Z0wkdWZ2U0E7PHb94jk= dependencies: os-homedir "^1.0.1" passwd-user "^1.2.1" @@ -7176,28 +8257,34 @@ user-info@^1.0.0: username-sync@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/username-sync/-/username-sync-1.0.1.tgz#1cde87eefcf94b8822984d938ba2b797426dae1f" + integrity sha1-HN6H7vz5S4gimE2Ti6K3l0Jtrh8= username@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/username/-/username-1.0.1.tgz#e1f72295e3e58e06f002c6327ce06897a99cd67f" + integrity sha1-4fcilePljgbwAsYyfOBol6mc1n8= dependencies: meow "^3.4.0" util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= uuid@^3.0.0, uuid@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" + integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA== validate-npm-package-license@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + integrity sha1-KAS6vnEq0zeUWaz74kdGqywwP7w= dependencies: spdx-correct "~1.0.0" spdx-expression-parse "~1.0.0" @@ -7205,16 +8292,19 @@ validate-npm-package-license@^3.0.1: validate-npm-package-name@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= dependencies: builtins "^1.0.3" vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" @@ -7223,12 +8313,14 @@ verror@1.10.0: w3c-hr-time@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= dependencies: browser-process-hrtime "^0.1.2" walk-sync@0.3.2, walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.2.tgz#4827280afc42d0e035367c4a4e31eeac0d136f75" + integrity sha512-FMB5VqpLqOCcqrzA9okZFc0wq0Qbmdm396qJxvQZhDpyu0W95G9JCmp74tx7iyYnyOcBtUuKJsgIKAqjozvmmQ== dependencies: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" @@ -7236,6 +8328,7 @@ walk-sync@0.3.2, walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2: walk-sync@^0.2.5, walk-sync@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.2.7.tgz#b49be4ee6867657aeb736978b56a29d10fa39969" + integrity sha1-tJvk7mhnZXrrc2l4tWop0Q+jmWk= dependencies: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" @@ -7243,16 +8336,19 @@ walk-sync@^0.2.5, walk-sync@^0.2.7: walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= dependencies: makeerror "1.0.x" watch@~0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" + integrity sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw= watch@~0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" + integrity sha1-KAlUdsbffJDJYxOJkMClQj60uYY= dependencies: exec-sh "^0.2.0" minimist "^1.2.0" @@ -7260,14 +8356,17 @@ watch@~0.18.0: webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= webidl-conversions@^4.0.0, webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== websocket-driver@>=0.5.1: version "0.7.0" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" + integrity sha1-DK+dLXVdk67gSdS90NP+LMoqJOs= dependencies: http-parser-js ">=0.4.0" websocket-extensions ">=0.1.1" @@ -7275,20 +8374,24 @@ websocket-driver@>=0.5.1: websocket-extensions@>=0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" + integrity sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw== dependencies: iconv-lite "0.4.19" whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" + integrity sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew== whatwg-url@^4.3.0: version "4.8.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" + integrity sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA= dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" @@ -7296,6 +8399,7 @@ whatwg-url@^4.3.0: whatwg-url@^6.4.0, whatwg-url@^6.4.1: version "6.5.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== dependencies: lodash.sortby "^4.7.0" tr46 "^1.0.1" @@ -7304,44 +8408,53 @@ whatwg-url@^6.4.0, whatwg-url@^6.4.1: which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + integrity sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg== dependencies: isexe "^2.0.0" wide-align@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + integrity sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w== dependencies: string-width "^1.0.2" window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= workerpool@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-2.3.0.tgz#86c5cbe946b55e7dc9d12b1936c8801a6e2d744d" + integrity sha512-JP5DpviEV84zDmz13QnD4FfRjZBjnTOYY2O4pGgxtlqLh47WOzQFHm8o17TE5OSfcDoKC6vHSrN4yPju93DW0Q== dependencies: object-assign "4.1.1" wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= write-file-atomic@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA== dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" @@ -7350,12 +8463,14 @@ write-file-atomic@^2.0.0: write@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= dependencies: mkdirp "^0.5.1" ws@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018" + integrity sha1-CC3bbGQehdS7RR8D1S8G6r2x8Bg= dependencies: options ">=0.0.5" ultron "1.0.x" @@ -7363,44 +8478,54 @@ ws@1.1.1: ws@^5.2.0: version "5.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== dependencies: async-limiter "~1.0.0" wtf-8@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" + integrity sha1-OS2LotDxw00e4tYw8V0O+2jhBIo= xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= xml-name-validator@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + integrity sha1-TYuPHszTQZqjYgYb7O9RXh5VljU= xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== xmldom@^0.1.19: version "0.1.27" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" + integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= xmlhttprequest-ssl@1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" + integrity sha1-GFqIjATspGw+QHDZn3tJ3jUomS0= xtend@^4.0.0, xtend@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= yam@0.0.22: version "0.0.22" resolved "https://registry.yarnpkg.com/yam/-/yam-0.0.22.tgz#38a76cb79a19284d9206ed49031e359a1340bd06" + integrity sha1-OKdst5oZKE2SBu1JAx41mhNAvQY= dependencies: fs-extra "^0.30.0" lodash.merge "^4.4.0" @@ -7408,6 +8533,7 @@ yam@0.0.22: yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= dependencies: camelcase "^1.0.2" cliui "^2.1.0" @@ -7417,3 +8543,4 @@ yargs@~3.10.0: yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= From 41600082516518cdaec07e7811c5b7bb8da6a6cf Mon Sep 17 00:00:00 2001 From: "James C. Davis" Date: Mon, 19 Nov 2018 11:17:53 -0500 Subject: [PATCH 252/879] Use instanceof and overrides to distinguish associations (#1376) * Use instanceof and overrides to distinguish associations * Move identifier to BelongsTo and error if not overidden * Update association.js --- addon/orm/associations/association.js | 12 ++---------- addon/orm/associations/belongs-to.js | 4 ++++ addon/orm/associations/has-many.js | 4 ++++ addon/orm/model.js | 4 ++-- addon/route-handlers/base.js | 3 ++- addon/server.js | 5 +++-- 6 files changed, 17 insertions(+), 15 deletions(-) diff --git a/addon/orm/associations/association.js b/addon/orm/associations/association.js index be3bac2c6..04475c116 100644 --- a/addon/orm/associations/association.js +++ b/addon/orm/associations/association.js @@ -1,4 +1,4 @@ -import { camelize, singularize, dasherize } from 'ember-cli-mirage/utils/inflector'; +import { dasherize } from 'ember-cli-mirage/utils/inflector'; export default class Association { @@ -49,15 +49,7 @@ export default class Association { return this.opts.polymorphic; } - get isHasMany() { - return this.constructor.name === 'HasMany'; - } - - get isBelongsTo() { - return this.constructor.name === 'BelongsTo'; - } - get identifier() { - return this.isHasMany ? `${camelize(singularize(this.key))}Ids` : `${camelize(this.key)}Id`; + throw new Error('Subclasses of Association must implement a getter for identifier'); } } diff --git a/addon/orm/associations/belongs-to.js b/addon/orm/associations/belongs-to.js index 8a123ff2d..33afe1936 100644 --- a/addon/orm/associations/belongs-to.js +++ b/addon/orm/associations/belongs-to.js @@ -14,6 +14,10 @@ import assert from 'ember-cli-mirage/assert'; */ export default class BelongsTo extends Association { + get identifier() { + return `${camelize(this.key)}Id`; + } + /** * @method getForeignKeyArray * @return {Array} Array of camelized name of the model owning the association diff --git a/addon/orm/associations/has-many.js b/addon/orm/associations/has-many.js index f57576e52..1106f984c 100644 --- a/addon/orm/associations/has-many.js +++ b/addon/orm/associations/has-many.js @@ -15,6 +15,10 @@ import assert from 'ember-cli-mirage/assert'; */ export default class HasMany extends Association { + get identifier() { + return `${camelize(singularize(this.key))}Ids`; + } + /** * @method getForeignKeyArray * @return {Array} Array of camelized model name of associated objects diff --git a/addon/orm/model.js b/addon/orm/model.js index c216e6fae..13b7f6566 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -504,13 +504,13 @@ class Model { let association = this.associationFor(key); let isNull = value === null; - if (association.isHasMany) { + if (association instanceof HasMany) { let isCollection = value instanceof Collection || value instanceof PolymorphicCollection; let isArrayOfModels = Array.isArray(value) && value.every(item => item instanceof Model); assert(isCollection || isArrayOfModels || isNull, `You're trying to create a ${this.modelName} model and you passed in "${value}" under the ${key} key, but that key is a HasMany relationship. You must pass in a Collection, PolymorphicCollection, array of Models, or null.`); - } else if (association.isBelongsTo) { + } else if (association instanceof BelongsTo) { assert(value instanceof Model || isNull, `You're trying to create a ${this.modelName} model and you passed in "${value}" under the ${key} key, but that key is a BelongsTo relationship. You must pass in a Model or null.`); } }); diff --git a/addon/route-handlers/base.js b/addon/route-handlers/base.js index 56849d6cb..c3762440f 100644 --- a/addon/route-handlers/base.js +++ b/addon/route-handlers/base.js @@ -1,5 +1,6 @@ import assert from 'ember-cli-mirage/assert'; import { camelize, singularize, dasherize } from 'ember-cli-mirage/utils/inflector'; +import HasMany from '../orm/associations/has-many'; const PATH_VAR_REGEXP = /^:/; @@ -71,7 +72,7 @@ export default class BaseRouteHandler { if (association.isPolymorphic) { valueForRelationship = relationship.data; - } else if (association.isHasMany) { + } else if (association instanceof HasMany) { valueForRelationship = relationship.data && relationship.data.map(rel => rel.id); } else { diff --git a/addon/server.js b/addon/server.js index 5b2421b97..33cc4fc9f 100644 --- a/addon/server.js +++ b/addon/server.js @@ -12,6 +12,7 @@ import Schema from './orm/schema'; import assert from './assert'; import SerializerRegistry from './serializer-registry'; import RouteHandler from './route-handler'; +import BelongsTo from './orm/associations/belongs-to'; import _pick from 'lodash/pick'; import _assign from 'lodash/assign'; @@ -703,11 +704,11 @@ export default class Server { let modelClass = this.schema.modelClassFor(modelName); let association = modelClass.associationFor(attr); - assert(association && association.isBelongsTo, + assert(association && association instanceof BelongsTo, `You're using the \`association\` factory helper on the '${attr}' attribute of your ${modelName} factory, but that attribute is not a \`belongsTo\` association. Read the Factories docs for more information: http://www.ember-cli-mirage.com/docs/v0.3.x/factories/#factories-and-relationships` ); - let isSelfReferentialBelongsTo = association && association.isBelongsTo && association.modelName === modelName; + let isSelfReferentialBelongsTo = association && association instanceof BelongsTo && association.modelName === modelName; assert(!isSelfReferentialBelongsTo, `You're using the association() helper on your ${modelName} factory for ${attr}, which is a belongsTo self-referential relationship. You can't do this as it will lead to infinite recursion. You can move the helper inside of a trait and use it selectively.`); From 557180de580c2d2a9a811e34c9de7bf992398477 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 19 Nov 2018 11:59:28 -0500 Subject: [PATCH 253/879] [fixes #1379] Better avoid name collision with model._schema (#1404) --- addon/orm/model.js | 50 ++++++++++++++++++++++----------------------- addon/orm/schema.js | 2 +- yarn.lock | 1 + 3 files changed, 27 insertions(+), 26 deletions(-) diff --git a/addon/orm/model.js b/addon/orm/model.js index 13b7f6566..3cdc9daaf 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -27,7 +27,7 @@ class Model { assert(schema, 'A model requires a schema'); assert(modelName, 'A model requires a modelName'); - this.schema = schema; + this._schema = schema; this.modelName = modelName; this.fks = fks || []; attrs = attrs || {}; @@ -49,19 +49,19 @@ class Model { if (this.isNew()) { // Update the attrs with the db response - this.attrs = this.schema.db[collection].insert(this.attrs); + this.attrs = this._schema.db[collection].insert(this.attrs); // Ensure the id getter/setter is set this._definePlainAttribute('id'); } else { - this.schema.isSaving[this.toString()] = true; - this.schema.db[collection].update(this.attrs.id, this.attrs); + this._schema.isSaving[this.toString()] = true; + this._schema.db[collection].update(this.attrs.id, this.attrs); } this._saveAssociations(); - this.schema.isSaving[this.toString()] = false; + this._schema.isSaving[this.toString()] = false; return this; } @@ -107,7 +107,7 @@ class Model { this._disassociateFromDependents(); let collection = toInternalCollectionName(this.modelName); - this.schema.db[collection].remove(this.attrs.id); + this._schema.db[collection].remove(this.attrs.id); } } @@ -128,7 +128,7 @@ class Model { if (hasId) { let collectionName = toInternalCollectionName(this.modelName); - let record = this.schema.db[collectionName].find(this.attrs.id); + let record = this._schema.db[collectionName].find(this.attrs.id); if (record) { hasDbRecord = true; @@ -157,7 +157,7 @@ class Model { reload() { if (this.id) { let collection = toInternalCollectionName(this.modelName); - let attrs = this.schema.db[collection].find(this.id); + let attrs = this._schema.db[collection].find(this.id); Object.keys(attrs) .filter(function(attr) { @@ -186,7 +186,7 @@ class Model { * @public */ associationFor(key) { - return this.schema.associationsFor(this.modelName)[key]; + return this._schema.associationsFor(this.modelName)[key]; } /** @@ -242,7 +242,7 @@ class Model { _explicitInverseFor(association) { this._checkForMultipleExplicitInverses(association); - let associations = this.schema.associationsFor(this.modelName); + let associations = this._schema.associationsFor(this.modelName); let inverse = association.opts.inverse; let candidate = inverse ? associations[inverse] : null; let matchingPolymorphic = candidate && candidate.isPolymorphic; @@ -268,7 +268,7 @@ class Model { * @private */ _checkForMultipleExplicitInverses(association) { - let associations = this.schema.associationsFor(this.modelName); + let associations = this._schema.associationsFor(this.modelName); let matchingExplicitInverses = Object.keys(associations).filter(key => { let candidate = associations[key]; let modelMatches = association.ownerModelName === candidate.modelName; @@ -289,7 +289,7 @@ class Model { * @private */ _implicitInverseFor(association) { - let associations = this.schema.associationsFor(this.modelName); + let associations = this._schema.associationsFor(this.modelName); let modelName = association.ownerModelName; return _values(associations) @@ -385,7 +385,7 @@ class Model { } get isSaving() { - return this.schema.isSaving[this.toString()]; + return this._schema.isSaving[this.toString()]; } // Private @@ -561,11 +561,11 @@ class Model { let found; if (association.isPolymorphic) { found = foreignKeys.map(({ type, id }) => { - return this.schema.db[toInternalCollectionName(type)].find(id); + return this._schema.db[toInternalCollectionName(type)].find(id); }); found = _compact(found); } else { - found = this.schema.db[toInternalCollectionName(association.modelName)].find(foreignKeys); + found = this._schema.db[toInternalCollectionName(association.modelName)].find(foreignKeys); } let foreignKeyLabel = association.isPolymorphic ? foreignKeys.map(fk => `${fk.type}:${fk.id}`).join(',') : foreignKeys; @@ -578,9 +578,9 @@ class Model { let found; if (association.isPolymorphic) { - found = this.schema.db[toInternalCollectionName(foreignKeys.type)].find(foreignKeys.id); + found = this._schema.db[toInternalCollectionName(foreignKeys.type)].find(foreignKeys.id); } else { - found = this.schema.db[toInternalCollectionName(association.modelName)].find(foreignKeys); + found = this._schema.db[toInternalCollectionName(association.modelName)].find(foreignKeys); } let foreignKeyLabel = association.isPolymorphic ? `${foreignKeys.type}:${foreignKeys.id}` : foreignKeys; @@ -634,11 +634,11 @@ class Model { let models; if (association.isPolymorphic) { models = associateIds.map(({ type, id }) => { - return this.schema[toCollectionName(type)].find(id); + return this._schema[toCollectionName(type)].find(id); }); } else { // TODO: prob should initialize hasMany fks with [] - models = this.schema[toCollectionName(association.modelName)] + models = this._schema[toCollectionName(association.modelName)] .find(associateIds || []) .models; } @@ -683,10 +683,10 @@ class Model { if ((tempAssociation !== undefined) && associateId) { let associate; if (association.isPolymorphic) { - associate = this.schema[toCollectionName(associateId.type)] + associate = this._schema[toCollectionName(associateId.type)] .find(associateId.id); } else { - associate = this.schema[toCollectionName(association.modelName)] + associate = this._schema[toCollectionName(association.modelName)] .find(associateId); } @@ -701,7 +701,7 @@ class Model { // Find all other models that depend on me and update their foreign keys _disassociateFromDependents() { - this.schema.dependentAssociationsFor(this.modelName) + this._schema.dependentAssociationsFor(this.modelName) .forEach(association => { association.disassociateAllDependentsFromTarget(this); }); @@ -806,9 +806,9 @@ class Model { } else { newId = ownerId; } - this.schema.db[toInternalCollectionName(model.modelName)].update(model.id, { [inverseFk]: newId }); + this._schema.db[toInternalCollectionName(model.modelName)].update(model.id, { [inverseFk]: newId }); } else { - let inverseCollection = this.schema.db[toInternalCollectionName(model.modelName)]; + let inverseCollection = this._schema.db[toInternalCollectionName(model.modelName)]; let currentIdsForInverse = inverseCollection.find(model.id)[inverse.getForeignKey()] || []; let newIdsForInverse = _assign([], currentIdsForInverse); let newId, alreadyAssociatedWith; @@ -833,7 +833,7 @@ class Model { // Used to update data directly, since #save and #update can retrigger saves, // which can cause cycles with associations. _updateInDb(attrs) { - this.attrs = this.schema.db[toInternalCollectionName(this.modelName)].update(this.attrs.id, attrs); + this.attrs = this._schema.db[toInternalCollectionName(this.modelName)].update(this.attrs.id, attrs); } /** diff --git a/addon/orm/schema.js b/addon/orm/schema.js index b18e38e1b..7df97d1fa 100644 --- a/addon/orm/schema.js +++ b/addon/orm/schema.js @@ -54,7 +54,7 @@ export default class Schema { this._registry[camelizedModelName].class = ModelClass; // TODO: set here, remove from model#constructor - ModelClass.prototype.schema = this; + ModelClass.prototype._schema = this; ModelClass.prototype.modelName = modelName; // Set up associations ModelClass.prototype.hasManyAssociations = {}; // a registry of the model's hasMany associations. Key is key from model definition, value is association instance itself diff --git a/yarn.lock b/yarn.lock index 1f41f76ea..0bab09805 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2722,6 +2722,7 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-babel@^6.6.0: version "6.17.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.17.0.tgz#1f3e8ed9f4e2338caef6bc2c3d08d3c9928d0ddd" + integrity sha512-esI5tQ9lxCiYmZdRY1oB6KFvRxFAZQQEnFOUVYzeGJRaZOz/LIGR69jh9y4Rm0Ejm10OxoL8Js8vCnN5tMnUug== dependencies: amd-name-resolver "1.2.0" babel-plugin-debug-macros "^0.2.0-beta.6" From 4606c11ab8480698a6ed42e819b645967e3562f3 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 20 Nov 2018 08:33:48 -0500 Subject: [PATCH 254/879] [closes #1384] Adds optional modelName arg to normalizedRequestAttrs (#1406) --- addon/route-handlers/base.js | 1 + addon/route-handlers/function.js | 19 +- .../route-handlers/function-handler-test.js | 287 ++++++++++++++---- .../server/custom-function-handler-test.js | 97 ------ 4 files changed, 237 insertions(+), 167 deletions(-) delete mode 100644 tests/integration/server/custom-function-handler-test.js diff --git a/addon/route-handlers/base.js b/addon/route-handlers/base.js index c3762440f..11f7f745e 100644 --- a/addon/route-handlers/base.js +++ b/addon/route-handlers/base.js @@ -19,6 +19,7 @@ export default class BaseRouteHandler { } } let modelName = dasherize(camelize(singularize(lastPath))); + return modelName; } diff --git a/addon/route-handlers/function.js b/addon/route-handlers/function.js index adec306c5..356650b12 100644 --- a/addon/route-handlers/function.js +++ b/addon/route-handlers/function.js @@ -1,4 +1,5 @@ import BaseRouteHandler from './base'; +import assert from 'ember-cli-mirage/assert'; export default class FunctionRouteHandler extends BaseRouteHandler { @@ -30,19 +31,27 @@ export default class FunctionRouteHandler extends BaseRouteHandler { return serializer.serialize(response, this.request); } - normalizedRequestAttrs() { + normalizedRequestAttrs(modelName = null) { let { path, request, request: { requestHeaders } } = this; - - let modelName = this.getModelClassFromPath(path); + let attrs; if (/x-www-form-urlencoded/.test(requestHeaders['Content-Type'])) { - return this._getAttrsForFormRequest(request); + attrs = this._getAttrsForFormRequest(request); } else { - return this._getAttrsForRequest(request, modelName); + modelName = modelName || this.getModelClassFromPath(path); + + assert( + this.schema.modelFor(modelName), + `You're using a shorthand or the #normalizedRequestAttrs helper but the detected model of '${modelName}' does not exist. You might need to pass in the correct modelName as the first argument to #normalizedRequestAttrs.` + ); + + attrs = this._getAttrsForRequest(request, modelName); } + + return attrs; } } diff --git a/tests/integration/route-handlers/function-handler-test.js b/tests/integration/route-handlers/function-handler-test.js index 661e03f3d..457a24078 100644 --- a/tests/integration/route-handlers/function-handler-test.js +++ b/tests/integration/route-handlers/function-handler-test.js @@ -1,10 +1,8 @@ import { module, test } from 'qunit'; import { Promise } from 'rsvp'; -import { Model, Collection, Serializer } from 'ember-cli-mirage'; +import { Model, Collection, ActiveModelSerializer, Response } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; -import Response from 'ember-cli-mirage/response'; -import FunctionRouteHandler from 'ember-cli-mirage/route-handlers/function'; import _uniqBy from 'lodash/uniqBy'; import promiseAjax from '../../helpers/promise-ajax'; @@ -17,16 +15,14 @@ module('Integration | Route handlers | Function handler', function(hooks) { }) }, serializers: { - sparseUser: Serializer.extend({ + application: ActiveModelSerializer, + sparseUser: ActiveModelSerializer.extend({ attrs: ['id', 'name', 'tall'] }) } }); this.server.timing = 0; this.server.logging = false; - - this.functionHandler = new FunctionRouteHandler(this.server.schema, this.server.serializerOrRegistry); - this.schema = this.server.schema; }); hooks.afterEach(function() { @@ -64,7 +60,7 @@ module('Integration | Route handlers | Function handler', function(hooks) { assert.equal(data, 'firstname,lastname\nbob,dylon'); }); - test('function can return a promise with non-serializable content', async function(assert) { + test('it can return a promise with non-serializable content', async function(assert) { assert.expect(1); this.server.get('/users', function() { @@ -77,10 +73,10 @@ module('Integration | Route handlers | Function handler', function(hooks) { assert.equal(data, 'firstname,lastname\nbob,dylan'); }); - test('function can return a promise with serializable content', async function(assert) { + test('it can return a promise with serializable content', async function(assert) { assert.expect(1); - let user = this.schema.users.create({ name: 'Sam' }); + let user = this.server.create('user', { name: 'Sam' }); this.server.get('/users', function(schema) { return new Promise(resolve => { @@ -92,7 +88,7 @@ module('Integration | Route handlers | Function handler', function(hooks) { assert.deepEqual(data, { users: [ { id: user.id, name: 'Sam' } ] }); }); - test('function can return a promise with an empty string', async function(assert) { + test('it can return a promise with an empty string', async function(assert) { assert.expect(1); this.server.get('/users', function() { @@ -105,85 +101,246 @@ module('Integration | Route handlers | Function handler', function(hooks) { assert.equal(data, ''); }); - test('#serialize uses the default serializer on a model', function(assert) { - this.schema.users.create({ name: 'Sam' }); + test(`it can serialize a POJA of models`, async function(assert) { + assert.expect(1); - let user = this.schema.users.first(); - let json = this.functionHandler.serialize(user); + this.server.createList('user', 3); + this.server.get('/users', (schema) => { + return schema.users.all().models; + }); - assert.deepEqual(json, { - user: { - id: '1', - name: 'Sam' - } + let { data } = await promiseAjax({ + method: 'GET', + url: '/users' }); + + assert.deepEqual(data, [{ id: '1' }, { id: '2' }, { id: '3' }]); }); - test('#serialize uses the default serializer on a collection', function(assert) { - this.schema.users.create({ name: 'Sam' }); + test('#serialize uses the default serializer on a model', async function(assert) { + assert.expect(1); - let users = this.schema.users.all(); - let json = this.functionHandler.serialize(users); + this.server.create('user', { name: 'Sam' }); - assert.deepEqual(json, { - users: [ - { id: '1', name: 'Sam' } - ] + this.server.get('/users', function(schema) { + let user = this.schema.users.first(); + let json = this.serialize(user); + + assert.deepEqual(json, { + user: { + id: '1', + name: 'Sam' + } + }); + + return true; }); + + await promiseAjax({ method: 'GET', url: '/users' }); }); - test('#serialize takes an optional serializer type', function(assert) { - this.schema.users.create({ name: 'Sam', tall: true, evil: false }); - this.schema.users.create({ name: 'Ganondorf', tall: true, evil: true }); + test('#serialize uses the default serializer on a collection', async function(assert) { + assert.expect(1); + + this.server.create('user', { name: 'Sam' }); - let users = this.schema.users.all(); - let json = this.functionHandler.serialize(users, 'sparse-user'); + this.server.get('/users', function(schema) { + let users = this.schema.users.all(); + let json = this.serialize(users); + + assert.deepEqual(json, { + users: [ + { id: '1', name: 'Sam' } + ] + }); - assert.deepEqual(json, { - users: [ - { id: '1', name: 'Sam', tall: true }, - { id: '2', name: 'Ganondorf', tall: true } - ] + return true; }); + + await promiseAjax({ method: 'GET', url: '/users' }); }); - test('#serialize throws an error when trying to specify a serializer that doesnt exist', function(assert) { - this.schema.users.create({ name: 'Sam' }); + test('#serialize takes an optional serializer type', async function(assert) { + assert.expect(1); + + this.server.create('user', { name: 'Sam', tall: true, evil: false }); + this.server.create('user', { name: 'Ganondorf', tall: true, evil: true }); - let users = this.schema.users.all(); + this.server.get('/users', function(schema) { + let users = schema.users.all(); + let json = this.serialize(users, 'sparse-user'); + + assert.deepEqual(json, { + users: [ + { id: '1', name: 'Sam', tall: true }, + { id: '2', name: 'Ganondorf', tall: true } + ] + }); - assert.throws(function() { - this.functionHandler.serialize(users, 'foo-user'); - }, /that serializer doesn't exist/); + return true; + }); + + await promiseAjax({ method: 'GET', url: '/users' }); }); - test('#serialize noops on plain JS arrays', function(assert) { - this.server.schema.users.create({ name: 'Sam' }); - this.server.schema.users.create({ name: 'Sam' }); - this.server.schema.users.create({ name: 'Ganondorf' }); + test('#serialize throws an error when trying to specify a serializer that doesnt exist', async function(assert) { + assert.expect(1); + + this.server.create('user', { name: 'Sam' }); + + this.server.get('/users', function(schema) { + let users = schema.users.all(); - let users = this.schema.users.all().models; - let uniqueNames = _uniqBy(users, 'name'); - let serializedResponse = this.functionHandler.serialize(uniqueNames); + assert.throws(() => { + this.serialize(users, 'foo-user'); + }, /that serializer doesn't exist/); + }); - assert.deepEqual(serializedResponse, uniqueNames); + await promiseAjax({ method: 'GET', url: '/users' }); }); - test('#serialize on a Collection takes an optional serializer type', function(assert) { - this.server.schema.users.create({ name: 'Sam', tall: true, evil: false }); - this.server.schema.users.create({ name: 'Sam', tall: true, evil: false }); - this.server.schema.users.create({ name: 'Ganondorf', tall: true, evil: true }); + test('#serialize noops on plain JS arrays', async function(assert) { + assert.expect(1); - let users = this.schema.users.all().models; - let uniqueNames = _uniqBy(users, 'name'); - let collection = new Collection('user', uniqueNames); - let json = this.functionHandler.serialize(collection, 'sparse-user'); + this.server.create('user', { name: 'Sam' }); + this.server.create('user', { name: 'Ganondorf' }); + + this.server.get('/users', function(schema) { + let names = schema.users.all().models.map(user => user.name); + let json = this.serialize(names); + + assert.deepEqual(json, names); + }); + + await promiseAjax({ method: 'GET', url: '/users' }); + }); + + test('#serialize on a Collection takes an optional serializer type', async function(assert) { + assert.expect(1); + + this.server.create('user', { name: 'Sam', tall: true, evil: false }); + this.server.create('user', { name: 'Sam', tall: true, evil: false }); + this.server.create('user', { name: 'Ganondorf', tall: true, evil: true }); + + this.server.get('/users', function(schema) { + let users = schema.users.all().models; + let uniqueNames = _uniqBy(users, 'name'); + let collection = new Collection('user', uniqueNames); + let json = this.serialize(collection, 'sparse-user'); + + assert.deepEqual(json, { + users: [ + { id: '1', name: 'Sam', tall: true }, + { id: '3', name: 'Ganondorf', tall: true } + ] + }); + }); + + await promiseAjax({ method: 'GET', url: '/users' }); + }); + + test(`#normalizedRequestAttrs returns an object with the primary resource's attrs and belongsTo keys camelized`, async function(assert) { + assert.expect(1); + + this.server.post('/users', function() { + let attrs = this.normalizedRequestAttrs(); + + assert.deepEqual(attrs, { + firstName: 'Sam', + lastName: 'Selikoff', + teamId: 1 + }); + + return {}; + }); + + await promiseAjax({ + method: 'POST', + url: '/users', + contentType: 'application/json', + data: JSON.stringify({ + user: { + first_name: 'Sam', + last_name: 'Selikoff', + team_id: 1 + } + }) + }); + }); + + test(`#normalizedRequestAttrs shows a meaningful error message if it cannot infer the modelname from the URL`, async function(assert) { + assert.expect(1); + + this.server.post('/users/create', function() { + assert.throws(() => { + this.normalizedRequestAttrs(); + }, /the detected model of 'create' does not exist/); + + return {}; + }); + + await promiseAjax({ + method: 'POST', + url: '/users/create', + contentType: 'application/json', + data: JSON.stringify({ + user: { + first_name: 'Sam', + last_name: 'Selikoff', + team_id: 1 + } + }) + }); + }); + + test(`#normalizedRequestAttrs accepts an optional modelName if it cannot be inferred from the path `, async function(assert) { + assert.expect(1); + + this.server.post('/users/create', function() { + let attrs = this.normalizedRequestAttrs('user'); + + assert.deepEqual(attrs, { + firstName: 'Sam', + lastName: 'Selikoff', + teamId: 1 + }); + + return {}; + }); + + await promiseAjax({ + method: 'POST', + url: '/users/create', + contentType: 'application/json', + data: JSON.stringify({ + user: { + first_name: 'Sam', + last_name: 'Selikoff', + team_id: 1 + } + }) + }); + }); + + test(`#normalizedRequestAttrs parses a x-www-form-urlencoded request and returns a POJO`, async function(assert) { + assert.expect(1); + + this.server.post('/form-test', function() { + let attrs = this.normalizedRequestAttrs(); + + assert.deepEqual(attrs, { + name: 'Sam Selikoff', + company: 'TED', + email: 'sam.selikoff@gmail.com' + }, '#normalizedRequestAttrs successfully returned the parsed x-www-form-urlencoded request body'); + + return {}; + }); - assert.deepEqual(json, { - users: [ - { id: '1', name: 'Sam', tall: true }, - { id: '3', name: 'Ganondorf', tall: true } - ] + await promiseAjax({ + method: 'POST', + url: '/form-test', + data: 'name=Sam+Selikoff&company=TED&email=sam.selikoff@gmail.com' }); }); }); diff --git a/tests/integration/server/custom-function-handler-test.js b/tests/integration/server/custom-function-handler-test.js deleted file mode 100644 index 118309e9b..000000000 --- a/tests/integration/server/custom-function-handler-test.js +++ /dev/null @@ -1,97 +0,0 @@ -import { module, test } from 'qunit'; -import { Model, Factory, ActiveModelSerializer } from 'ember-cli-mirage'; -import Server from 'ember-cli-mirage/server'; -import promiseAjax from '../../helpers/promise-ajax'; - -module('Integration | Server | Custom function handler', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'test', - models: { - contact: Model - }, - factories: { - contact: Factory - }, - serializers: { - application: ActiveModelSerializer - } - }); - this.server.timing = 0; - this.server.logging = false; - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test(`a POJA of models defaults to responding with an array of each model's attrs`, async function(assert) { - assert.expect(1); - let { server } = this; - - server.createList('contact', 3); - server.get('/contacts', (schema) => { - return schema.contacts.all().models; - }); - - let { data } = await promiseAjax({ - method: 'GET', - url: '/contacts' - }); - - assert.deepEqual(data, [{ id: '1' }, { id: '2' }, { id: '3' }]); - }); - - test(`#normalizedRequestAttrs returns an object with the primary resource's attrs and belongsTo keys camelized`, async function(assert) { - assert.expect(1); - let { server } = this; - - server.post('/contacts', function() { - let attrs = this.normalizedRequestAttrs(); - - assert.deepEqual(attrs, { - firstName: 'Sam', - lastName: 'Selikoff', - teamId: 1 - }); - - return {}; - }); - - await promiseAjax({ - method: 'POST', - url: '/contacts', - contentType: 'application/json', - data: JSON.stringify({ - contact: { - first_name: 'Sam', - last_name: 'Selikoff', - team_id: 1 - } - }) - }); - }); - - test(`#normalizedRequestAttrs parses a x-www-form-urlencoded request and returns a POJO`, async function(assert) { - assert.expect(1); - let { server } = this; - - server.post('/form-test', function() { - let attrs = this.normalizedRequestAttrs(); - - assert.deepEqual(attrs, { - name: 'Sam Selikoff', - company: 'TED', - email: 'sam.selikoff@gmail.com' - }, '#normalizedRequestAttrs successfully returned the parsed x-www-form-urlencoded request body'); - - return {}; - }); - - await promiseAjax({ - method: 'POST', - url: '/form-test', - data: 'name=Sam+Selikoff&company=TED&email=sam.selikoff@gmail.com' - }); - }); -}); From 45df936dab2983afcbdbb748e834f465dc4eb17f Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 20 Nov 2018 12:00:50 -0500 Subject: [PATCH 255/879] Update ISSUE_TEMPLATE.md --- ISSUE_TEMPLATE.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index 8608755d5..1c12f1a45 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -1,15 +1,13 @@ > Is this a feature request? If so, please visit our [Canny board](https://ember-cli-mirage.canny.io/admin/board/feature-requests). -If possible, please use the Mirage Boilerplate Twiddle to demonstrate your issue or bug: +If possible, please use the Mirage Boilerplate CodeSandbox to demonstrate your issue or bug: -1. Open the Mirage Boilerplate Twiddle: +1. Open the Mirage Boilerplate CodeSandbox: - https://ember-twiddle.com/eedfd390d8394d54d5bfd0ed988a5d0f?openFiles=twiddle.json%2C + https://codesandbox.io/s/003o6pq34n -2. Click File > Copy Twiddle +2. Click Fork -3. Reproduce your issue +3. Reproduce your issue and save -4.Click File > Save to Github Gist - -5. Include the URL to your Twiddle in your issue +4. Include the URL to your Sandbox in your issue From 0afc574077fd557cfd7ef131db730e1064e73f9b Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 21 Nov 2018 11:49:12 -0500 Subject: [PATCH 256/879] [closes 1398] Fixes normalizedRequestAttrs header bug --- addon/route-handlers/function.js | 6 +++++- .../route-handlers/function-handler-test.js | 11 ++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/addon/route-handlers/function.js b/addon/route-handlers/function.js index 356650b12..4beded7cc 100644 --- a/addon/route-handlers/function.js +++ b/addon/route-handlers/function.js @@ -39,7 +39,11 @@ export default class FunctionRouteHandler extends BaseRouteHandler { } = this; let attrs; - if (/x-www-form-urlencoded/.test(requestHeaders['Content-Type'])) { + let lowerCaseHeaders = {}; + for (let header in requestHeaders) { + lowerCaseHeaders[header.toLowerCase()] = requestHeaders[header]; + } + if (/x-www-form-urlencoded/.test(lowerCaseHeaders['content-type'])) { attrs = this._getAttrsForFormRequest(request); } else { modelName = modelName || this.getModelClassFromPath(path); diff --git a/tests/integration/route-handlers/function-handler-test.js b/tests/integration/route-handlers/function-handler-test.js index 457a24078..d74d9a155 100644 --- a/tests/integration/route-handlers/function-handler-test.js +++ b/tests/integration/route-handlers/function-handler-test.js @@ -322,17 +322,22 @@ module('Integration | Route handlers | Function handler', function(hooks) { }); }); - test(`#normalizedRequestAttrs parses a x-www-form-urlencoded request and returns a POJO`, async function(assert) { + test(`#normalizedRequestAttrs works with a form encoded request that has a lower-case content-type (issue 1398)`, async function(assert) { assert.expect(1); this.server.post('/form-test', function() { - let attrs = this.normalizedRequestAttrs(); + // Easiest way I could figure out to change the capitalization of the Content-Type header. Tried + // to do this from the Ajax side but jquery kept capitalizing the header. + this.request.requestHeaders['content-type'] = this.request.requestHeaders['Content-Type']; + delete this.request.requestHeaders['Content-Type']; + + let attrs = this.normalizedRequestAttrs('user'); assert.deepEqual(attrs, { name: 'Sam Selikoff', company: 'TED', email: 'sam.selikoff@gmail.com' - }, '#normalizedRequestAttrs successfully returned the parsed x-www-form-urlencoded request body'); + }); return {}; }); From cd0e55df5ba9baddb911f3df1cbe50d1855bc224 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 21 Nov 2018 17:40:38 -0500 Subject: [PATCH 257/879] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ebeb7abe2..64ed8af87 100644 --- a/README.md +++ b/README.md @@ -18,9 +18,9 @@ ember install ember-cli-mirage ## Feature requests -I want to use Canny for feature requests, and keep GitHub issues to actionable items: bugs, and features that are currently being implemented. +Please open an issue and add a :+1: emoji reaction. We will use the number of reactions as votes to indicate community interest, which will in turn help us prioritize feature development. -For feature requests, visit our [Canny board](https://ember-cli-mirage.canny.io/admin/board/feature-requests). +You can view the most-upvoted feature requests with [this link](https://github.com/samselikoff/ember-cli-mirage/issues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc+label%3A%22Feature+%2F+Enhancement%22). ## Support From 8678c7a355af74d7a9472413f2791277378e2f27 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 21 Nov 2018 17:41:31 -0500 Subject: [PATCH 258/879] Update ISSUE_TEMPLATE.md --- ISSUE_TEMPLATE.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index 1c12f1a45..9c856825b 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -1,4 +1,8 @@ -> Is this a feature request? If so, please visit our [Canny board](https://ember-cli-mirage.canny.io/admin/board/feature-requests). +# Feature request + +If this is a feature request, add a 👠reaction to it. We use these to help us prioritize new feature development! + +# Bug or question If possible, please use the Mirage Boilerplate CodeSandbox to demonstrate your issue or bug: From 91b0634b668379d433681ddad0d89b8e469b39b6 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 21 Nov 2018 16:31:35 -0500 Subject: [PATCH 259/879] [closes #1403] Faster noop initializer when excluding Mirage --- .npmignore | 2 +- .travis.yml | 4 +- config/ember-try.js | 2 +- index.js | 34 +++++------ package.json | 4 +- scripts/link.sh | 10 ++-- scripts/test.sh | 3 +- .../01-basic-app}/.bin | 0 .../01-basic-app}/.editorconfig | 0 .../01-basic-app}/.ember-cli | 0 .../01-basic-app}/.eslintignore | 0 .../01-basic-app}/.eslintrc.js | 0 .../01-basic-app}/.gitignore | 0 .../01-basic-app}/.npmignore | 0 .../01-basic-app}/.travis.yml | 0 .../01-basic-app}/.watchmanconfig | 0 .../01-basic-app}/README.md | 0 .../01-basic-app}/app/app.js | 0 .../01-basic-app}/app/components/.gitkeep | 0 .../01-basic-app}/app/controllers/.gitkeep | 0 .../app/controllers/application.js | 0 .../01-basic-app}/app/helpers/.gitkeep | 0 .../01-basic-app}/app/index.html | 0 .../01-basic-app}/app/models/.gitkeep | 0 .../01-basic-app}/app/resolver.js | 0 .../01-basic-app}/app/router.js | 0 .../01-basic-app}/app/routes/.gitkeep | 0 .../01-basic-app}/app/styles/app.css | 0 .../app/templates/application.hbs | 0 .../app/templates/components/.gitkeep | 0 .../01-basic-app}/config/environment.js | 0 .../01-basic-app}/config/targets.js | 0 .../01-basic-app}/ember-cli-build.js | 0 .../fastboot-tests/included-files-test.js | 0 .../01-basic-app}/mirage/config.js | 0 .../01-basic-app}/package.json | 0 .../01-basic-app}/public/robots.txt | 0 .../01-basic-app}/testem.js | 0 .../tests/helpers/destroy-app.js | 0 .../tests/helpers/module-for-acceptance.js | 0 .../tests/helpers/promise-ajax.js | 0 .../01-basic-app}/tests/helpers/resolver.js | 0 .../01-basic-app}/tests/helpers/start-app.js | 0 .../01-basic-app}/tests/index.html | 0 .../01-basic-app}/tests/test-helper.js | 0 .../01-basic-app}/vendor/.gitkeep | 0 .../02-app-that-excludes-mirage/.bin | 1 + .../02-app-that-excludes-mirage/.editorconfig | 20 +++++++ .../02-app-that-excludes-mirage/.ember-cli | 9 +++ .../02-app-that-excludes-mirage/.eslintignore | 4 ++ .../02-app-that-excludes-mirage/.eslintrc.js | 2 + .../02-app-that-excludes-mirage/.gitignore | 23 ++++++++ .../02-app-that-excludes-mirage/.npmignore | 1 + .../02-app-that-excludes-mirage/.travis.yml | 29 ++++++++++ .../.watchmanconfig | 3 + .../02-app-that-excludes-mirage/README.md | 57 +++++++++++++++++++ .../02-app-that-excludes-mirage/app/app.js | 14 +++++ .../app/components/.gitkeep | 0 .../app/controllers/.gitkeep | 0 .../app/controllers/application.js | 22 +++++++ .../app/helpers/.gitkeep | 0 .../app/index.html | 25 ++++++++ .../app/initializers/my-initializer.js | 8 +++ .../app/models/.gitkeep | 0 .../app/resolver.js | 3 + .../02-app-that-excludes-mirage/app/router.js | 12 ++++ .../app/routes/.gitkeep | 0 .../app/services/wifi.js | 7 +++ .../app/styles/app.css | 0 .../app/templates/application.hbs | 5 ++ .../app/templates/components/.gitkeep | 0 .../config/environment.js | 54 ++++++++++++++++++ .../config/targets.js | 18 ++++++ .../ember-cli-build.js | 24 ++++++++ .../mirage/config.js | 2 + .../02-app-that-excludes-mirage/package.json | 50 ++++++++++++++++ .../public/robots.txt | 3 + .../02-app-that-excludes-mirage/testem.js | 24 ++++++++ .../acceptance/pre-mirage-initializer-test.js | 12 ++++ .../tests/helpers/destroy-app.js | 11 ++++ .../tests/helpers/module-for-acceptance.js | 21 +++++++ .../tests/helpers/promise-ajax.js | 9 +++ .../tests/helpers/resolver.js | 11 ++++ .../tests/helpers/start-app.js | 17 ++++++ .../tests/index.html | 33 +++++++++++ .../tests/test-helper.js | 8 +++ .../vendor/.gitkeep | 0 yarn.lock | 10 +++- 88 files changed, 579 insertions(+), 32 deletions(-) rename {test-apps/basic-app => test-projects/01-basic-app}/.bin (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/.editorconfig (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/.ember-cli (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/.eslintignore (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/.eslintrc.js (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/.gitignore (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/.npmignore (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/.travis.yml (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/.watchmanconfig (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/README.md (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/app/app.js (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/app/components/.gitkeep (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/app/controllers/.gitkeep (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/app/controllers/application.js (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/app/helpers/.gitkeep (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/app/index.html (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/app/models/.gitkeep (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/app/resolver.js (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/app/router.js (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/app/routes/.gitkeep (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/app/styles/app.css (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/app/templates/application.hbs (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/app/templates/components/.gitkeep (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/config/environment.js (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/config/targets.js (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/ember-cli-build.js (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/fastboot-tests/included-files-test.js (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/mirage/config.js (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/package.json (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/public/robots.txt (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/testem.js (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/tests/helpers/destroy-app.js (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/tests/helpers/module-for-acceptance.js (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/tests/helpers/promise-ajax.js (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/tests/helpers/resolver.js (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/tests/helpers/start-app.js (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/tests/index.html (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/tests/test-helper.js (100%) rename {test-apps/basic-app => test-projects/01-basic-app}/vendor/.gitkeep (100%) create mode 120000 test-projects/02-app-that-excludes-mirage/.bin create mode 100644 test-projects/02-app-that-excludes-mirage/.editorconfig create mode 100644 test-projects/02-app-that-excludes-mirage/.ember-cli create mode 100644 test-projects/02-app-that-excludes-mirage/.eslintignore create mode 100644 test-projects/02-app-that-excludes-mirage/.eslintrc.js create mode 100644 test-projects/02-app-that-excludes-mirage/.gitignore create mode 100644 test-projects/02-app-that-excludes-mirage/.npmignore create mode 100644 test-projects/02-app-that-excludes-mirage/.travis.yml create mode 100644 test-projects/02-app-that-excludes-mirage/.watchmanconfig create mode 100644 test-projects/02-app-that-excludes-mirage/README.md create mode 100644 test-projects/02-app-that-excludes-mirage/app/app.js create mode 100644 test-projects/02-app-that-excludes-mirage/app/components/.gitkeep create mode 100644 test-projects/02-app-that-excludes-mirage/app/controllers/.gitkeep create mode 100644 test-projects/02-app-that-excludes-mirage/app/controllers/application.js create mode 100644 test-projects/02-app-that-excludes-mirage/app/helpers/.gitkeep create mode 100644 test-projects/02-app-that-excludes-mirage/app/index.html create mode 100644 test-projects/02-app-that-excludes-mirage/app/initializers/my-initializer.js create mode 100644 test-projects/02-app-that-excludes-mirage/app/models/.gitkeep create mode 100644 test-projects/02-app-that-excludes-mirage/app/resolver.js create mode 100644 test-projects/02-app-that-excludes-mirage/app/router.js create mode 100644 test-projects/02-app-that-excludes-mirage/app/routes/.gitkeep create mode 100644 test-projects/02-app-that-excludes-mirage/app/services/wifi.js create mode 100644 test-projects/02-app-that-excludes-mirage/app/styles/app.css create mode 100644 test-projects/02-app-that-excludes-mirage/app/templates/application.hbs create mode 100644 test-projects/02-app-that-excludes-mirage/app/templates/components/.gitkeep create mode 100644 test-projects/02-app-that-excludes-mirage/config/environment.js create mode 100644 test-projects/02-app-that-excludes-mirage/config/targets.js create mode 100644 test-projects/02-app-that-excludes-mirage/ember-cli-build.js create mode 100644 test-projects/02-app-that-excludes-mirage/mirage/config.js create mode 100644 test-projects/02-app-that-excludes-mirage/package.json create mode 100644 test-projects/02-app-that-excludes-mirage/public/robots.txt create mode 100644 test-projects/02-app-that-excludes-mirage/testem.js create mode 100644 test-projects/02-app-that-excludes-mirage/tests/acceptance/pre-mirage-initializer-test.js create mode 100644 test-projects/02-app-that-excludes-mirage/tests/helpers/destroy-app.js create mode 100644 test-projects/02-app-that-excludes-mirage/tests/helpers/module-for-acceptance.js create mode 100644 test-projects/02-app-that-excludes-mirage/tests/helpers/promise-ajax.js create mode 100644 test-projects/02-app-that-excludes-mirage/tests/helpers/resolver.js create mode 100644 test-projects/02-app-that-excludes-mirage/tests/helpers/start-app.js create mode 100644 test-projects/02-app-that-excludes-mirage/tests/index.html create mode 100644 test-projects/02-app-that-excludes-mirage/tests/test-helper.js create mode 100644 test-projects/02-app-that-excludes-mirage/vendor/.gitkeep diff --git a/.npmignore b/.npmignore index 73c447ef1..bb44b66a8 100644 --- a/.npmignore +++ b/.npmignore @@ -26,4 +26,4 @@ package.json.ember-try /jekyll-tmp *.md -/test-apps +/test-projects diff --git a/.travis.yml b/.travis.yml index 187963471..d74a664aa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -33,13 +33,13 @@ jobs: script: yarn test:browser - env: NAME=node tests install: yarn install - script: yarn test:node + script: yarn test:test-projects - stage: floating dependencies env: NAME=browser tests script: yarn test:browser - env: NAME=node tests - script: yarn test:node + script: yarn test:test-projects - stage: versioned tests env: EMBER_TRY_SCENARIO=ember-lts-2.4 diff --git a/config/ember-try.js b/config/ember-try.js index 36e6f4caa..0cd04d429 100644 --- a/config/ember-try.js +++ b/config/ember-try.js @@ -121,7 +121,7 @@ module.exports = { }, { name: 'node-tests', - command: 'yarn run test:node', + command: 'yarn run test:test-projects', npm: { devDependencies: {} } diff --git a/index.js b/index.js index 7d7bac65a..717b436db 100644 --- a/index.js +++ b/index.js @@ -3,8 +3,7 @@ const path = require('path'); const mergeTrees = require('broccoli-merge-trees'); const Funnel = require('broccoli-funnel'); const map = require('broccoli-stew').map; -const rm = require('broccoli-stew').rm; -const replace = require('broccoli-string-replace'); +const writeFile = require('broccoli-file-creator'); module.exports = { name: 'ember-cli-mirage', @@ -77,25 +76,22 @@ module.exports = { }, treeFor(name) { - if (!this._shouldIncludeFiles()) { - if (name === 'app' || name === 'addon') { - // include a noop initializer even when mirage is excluded from the build - let initializerFileName = 'initializers/ember-cli-mirage.js'; - let tree = rm(this._super.treeFor.apply(this, arguments), (path) => path !== initializerFileName); - - return replace(tree, { - files: [initializerFileName], - patterns: [{ - match: /[\S\s]*/m, - replacement: 'export default {name: \'ember-cli-mirage\',initialize() {}};' - }] - }); - } - - return; + let tree; + let shouldIncludeFiles = this._shouldIncludeFiles(); + + if (!shouldIncludeFiles && name === 'app') { + // Include a noop initializer, even if Mirage is excluded from the build + tree = writeFile('initializers/ember-cli-mirage.js', ` + export default { + name: 'ember-cli-mirage', + initialize() {} + }; + `); + } else if (shouldIncludeFiles) { + tree = this._super.treeFor.apply(this, arguments); } - return this._super.treeFor.apply(this, arguments); + return tree; }, _lintMirageTree(mirageTree) { diff --git a/package.json b/package.json index aeb65ee4d..0501a87a3 100644 --- a/package.json +++ b/package.json @@ -30,15 +30,15 @@ "test": "./scripts/test.sh", "test:all": "ember try:each", "test:browser": "ember test --test-port=0", - "test:node": "cd test-apps/basic-app && yarn test:fastboot", + "test:test-projects": "./scripts/test.sh", "prepare": "./scripts/link.sh" }, "dependencies": { "@xg-wang/whatwg-fetch": "^3.0.0", + "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^1.0.2", "broccoli-merge-trees": "^1.1.0", "broccoli-stew": "^1.5.0", - "broccoli-string-replace": "^0.1.2", "chalk": "^1.1.1", "ember-cli-babel": "^6.8.2", "ember-cli-node-assets": "^0.2.2", diff --git a/scripts/link.sh b/scripts/link.sh index 4ef12dfeb..4f81212e8 100755 --- a/scripts/link.sh +++ b/scripts/link.sh @@ -5,17 +5,17 @@ set -e # Copied from https://github.com/ef4/ember-auto-import/blob/9e48e9ec9639ce05ca2a2688581ea41fdd627c5c/scripts/link-them.sh # All packages get a node_modules directory and a .bin link -for package in "basic-app"; do - mkdir -p ./test-apps/$package/node_modules - pushd ./test-apps/$package/node_modules > /dev/null +for package in "01-basic-app" "02-app-that-excludes-mirage"; do + mkdir -p ./test-projects/$package/node_modules + pushd ./test-projects/$package/node_modules > /dev/null rm -rf .bin ln -s ../../../node_modules/.bin .bin popd > /dev/null done # These packages get to depend on ember-cli-mirage -for package in "basic-app"; do - pushd ./test-apps/$package/node_modules > /dev/null +for package in "01-basic-app" "02-app-that-excludes-mirage"; do + pushd ./test-projects/$package/node_modules > /dev/null rm -rf ./ember-cli-mirage ln -s ../../.. ./ember-cli-mirage popd > /dev/null diff --git a/scripts/test.sh b/scripts/test.sh index 5141348a1..eec41819e 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -1,6 +1,7 @@ #!/bin/bash ./scripts/parallel --tag <` this repository +* `cd basic-app` +* `yarn install` + +## Running / Development + +* `ember serve` +* Visit your app at [http://localhost:4200](http://localhost:4200). +* Visit your tests at [http://localhost:4200/tests](http://localhost:4200/tests). + +### Code Generators + +Make use of the many generators for code, try `ember help generate` for more details + +### Running Tests + +* `ember test` +* `ember test --server` + +### Linting + +* `yarn lint:js` +* `yarn lint:js --fix` + +### Building + +* `ember build` (development) +* `ember build --environment production` (production) + +### Deploying + +Specify what it takes to deploy your app. + +## Further Reading / Useful Links + +* [ember.js](https://emberjs.com/) +* [ember-cli](https://ember-cli.com/) +* Development Browser Extensions + * [ember inspector for chrome](https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi) + * [ember inspector for firefox](https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/) diff --git a/test-projects/02-app-that-excludes-mirage/app/app.js b/test-projects/02-app-that-excludes-mirage/app/app.js new file mode 100644 index 000000000..b3b2bd677 --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/app/app.js @@ -0,0 +1,14 @@ +import Application from '@ember/application'; +import Resolver from './resolver'; +import loadInitializers from 'ember-load-initializers'; +import config from './config/environment'; + +const App = Application.extend({ + modulePrefix: config.modulePrefix, + podModulePrefix: config.podModulePrefix, + Resolver +}); + +loadInitializers(App, config.modulePrefix); + +export default App; diff --git a/test-projects/02-app-that-excludes-mirage/app/components/.gitkeep b/test-projects/02-app-that-excludes-mirage/app/components/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test-projects/02-app-that-excludes-mirage/app/controllers/.gitkeep b/test-projects/02-app-that-excludes-mirage/app/controllers/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test-projects/02-app-that-excludes-mirage/app/controllers/application.js b/test-projects/02-app-that-excludes-mirage/app/controllers/application.js new file mode 100644 index 000000000..ebf85aef1 --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/app/controllers/application.js @@ -0,0 +1,22 @@ +/* global requirejs */ +import Controller from '@ember/controller'; +import { computed } from '@ember/object'; +import ENV from 'basic-app/config/environment'; + +export default Controller.extend({ + + environment: ENV.environment, + + mirageModules: computed(function() { + return Object.keys(requirejs.entries) + .filter(key => key.match('^ember-cli-mirage')); + }), + + otherIncludedModules: computed(function() { + return Object.keys(requirejs.entries) + .filter(key => { + return key.match('^pretender') || key.match('^lodash') || key.match('initializers/ember-cli-mirage'); + }); + }) + +}); diff --git a/test-projects/02-app-that-excludes-mirage/app/helpers/.gitkeep b/test-projects/02-app-that-excludes-mirage/app/helpers/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test-projects/02-app-that-excludes-mirage/app/index.html b/test-projects/02-app-that-excludes-mirage/app/index.html new file mode 100644 index 000000000..326f147b5 --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/app/index.html @@ -0,0 +1,25 @@ + + + + + + BasicApp + + + + {{content-for "head"}} + + + + + {{content-for "head-footer"}} + + + {{content-for "body"}} + + + + + {{content-for "body-footer"}} + + diff --git a/test-projects/02-app-that-excludes-mirage/app/initializers/my-initializer.js b/test-projects/02-app-that-excludes-mirage/app/initializers/my-initializer.js new file mode 100644 index 000000000..2d492a2f0 --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/app/initializers/my-initializer.js @@ -0,0 +1,8 @@ +export function initialize(application) { + application.inject('controller', 'wifi', 'service:wifi'); +} + +export default { + initialize, + before: 'ember-cli-mirage' +}; diff --git a/test-projects/02-app-that-excludes-mirage/app/models/.gitkeep b/test-projects/02-app-that-excludes-mirage/app/models/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test-projects/02-app-that-excludes-mirage/app/resolver.js b/test-projects/02-app-that-excludes-mirage/app/resolver.js new file mode 100644 index 000000000..2fb563d6c --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/app/resolver.js @@ -0,0 +1,3 @@ +import Resolver from 'ember-resolver'; + +export default Resolver; diff --git a/test-projects/02-app-that-excludes-mirage/app/router.js b/test-projects/02-app-that-excludes-mirage/app/router.js new file mode 100644 index 000000000..d0bb00952 --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/app/router.js @@ -0,0 +1,12 @@ +import EmberRouter from '@ember/routing/router'; +import config from './config/environment'; + +const Router = EmberRouter.extend({ + location: config.locationType, + rootURL: config.rootURL +}); + +Router.map(function() { +}); + +export default Router; diff --git a/test-projects/02-app-that-excludes-mirage/app/routes/.gitkeep b/test-projects/02-app-that-excludes-mirage/app/routes/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test-projects/02-app-that-excludes-mirage/app/services/wifi.js b/test-projects/02-app-that-excludes-mirage/app/services/wifi.js new file mode 100644 index 000000000..d310336a5 --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/app/services/wifi.js @@ -0,0 +1,7 @@ +import Service from '@ember/service'; + +export default Service.extend({ + + isConnected: true + +}); diff --git a/test-projects/02-app-that-excludes-mirage/app/styles/app.css b/test-projects/02-app-that-excludes-mirage/app/styles/app.css new file mode 100644 index 000000000..e69de29bb diff --git a/test-projects/02-app-that-excludes-mirage/app/templates/application.hbs b/test-projects/02-app-that-excludes-mirage/app/templates/application.hbs new file mode 100644 index 000000000..d94ba08e5 --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/app/templates/application.hbs @@ -0,0 +1,5 @@ +

    Welcome to Ember

    + +{{#if wifi.isConnected}} +

    We ran the initializer

    +{{/if}} diff --git a/test-projects/02-app-that-excludes-mirage/app/templates/components/.gitkeep b/test-projects/02-app-that-excludes-mirage/app/templates/components/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test-projects/02-app-that-excludes-mirage/config/environment.js b/test-projects/02-app-that-excludes-mirage/config/environment.js new file mode 100644 index 000000000..2e369f75f --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/config/environment.js @@ -0,0 +1,54 @@ +'use strict'; + +module.exports = function(environment) { + let ENV = { + modulePrefix: 'basic-app', + environment, + rootURL: '/', + locationType: 'auto', + EmberENV: { + FEATURES: { + // Here you can enable experimental features on an ember canary build + // e.g. 'with-controller': true + }, + EXTEND_PROTOTYPES: { + // Prevent Ember Data from overriding Date.parse. + Date: false + } + }, + + APP: { + // Here you can pass flags/options to your application instance + // when it is created + }, + 'ember-cli-mirage': { + excludeFilesFromBuild: true + } + }; + + if (environment === 'development') { + // ENV.APP.LOG_RESOLVER = true; + // ENV.APP.LOG_ACTIVE_GENERATION = true; + // ENV.APP.LOG_TRANSITIONS = true; + // ENV.APP.LOG_TRANSITIONS_INTERNAL = true; + // ENV.APP.LOG_VIEW_LOOKUPS = true; + } + + if (environment === 'test') { + // Testem prefers this... + ENV.locationType = 'none'; + + // keep test console output quieter + ENV.APP.LOG_ACTIVE_GENERATION = false; + ENV.APP.LOG_VIEW_LOOKUPS = false; + + ENV.APP.rootElement = '#ember-testing'; + ENV.APP.autoboot = false; + } + + if (environment === 'production') { + // here you can enable a production-specific feature + } + + return ENV; +}; diff --git a/test-projects/02-app-that-excludes-mirage/config/targets.js b/test-projects/02-app-that-excludes-mirage/config/targets.js new file mode 100644 index 000000000..8ffae3636 --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/config/targets.js @@ -0,0 +1,18 @@ +'use strict'; + +const browsers = [ + 'last 1 Chrome versions', + 'last 1 Firefox versions', + 'last 1 Safari versions' +]; + +const isCI = !!process.env.CI; +const isProduction = process.env.EMBER_ENV === 'production'; + +if (isCI || isProduction) { + browsers.push('ie 11'); +} + +module.exports = { + browsers +}; diff --git a/test-projects/02-app-that-excludes-mirage/ember-cli-build.js b/test-projects/02-app-that-excludes-mirage/ember-cli-build.js new file mode 100644 index 000000000..d690a2531 --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/ember-cli-build.js @@ -0,0 +1,24 @@ +'use strict'; + +const EmberApp = require('ember-cli/lib/broccoli/ember-app'); + +module.exports = function(defaults) { + let app = new EmberApp(defaults, { + // Add options here + }); + + // Use `app.import` to add additional libraries to the generated + // output files. + // + // If you need to use different assets in different + // environments, specify an object as the first parameter. That + // object's keys should be the environment name and the values + // should be the asset to use in that environment. + // + // If the library that you are including contains AMD or ES6 + // modules that you would like to import into your application + // please specify an object with the list of modules as keys + // along with the exports of each module as its value. + + return app.toTree(); +}; diff --git a/test-projects/02-app-that-excludes-mirage/mirage/config.js b/test-projects/02-app-that-excludes-mirage/mirage/config.js new file mode 100644 index 000000000..ab35aa45a --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/mirage/config.js @@ -0,0 +1,2 @@ +export default function() { +} diff --git a/test-projects/02-app-that-excludes-mirage/package.json b/test-projects/02-app-that-excludes-mirage/package.json new file mode 100644 index 000000000..8a3d2afb3 --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/package.json @@ -0,0 +1,50 @@ +{ + "name": "basic-app", + "version": "0.0.0", + "private": true, + "description": "Small description for basic-app goes here", + "license": "MIT", + "author": "", + "directories": { + "doc": "doc", + "test": "tests" + }, + "repository": "", + "scripts": { + "build": "ember build", + "lint:js": "eslint ./*.js app blueprints config lib server tests", + "start": "ember serve", + "test": "ember test --test-port=0", + "test:fastboot": "qunit fastboot-tests/**/*.js" + }, + "devDependencies": { + "broccoli-asset-rev": "*", + "ember-ajax": "*", + "ember-cli": "*", + "ember-cli-babel": "*", + "ember-cli-dependency-checker": "*", + "ember-cli-eslint": "*", + "ember-cli-fastboot": "*", + "ember-cli-htmlbars": "*", + "ember-cli-htmlbars-inline-precompile": "*", + "ember-cli-inject-live-reload": "*", + "ember-cli-mirage": "*", + "ember-cli-qunit": "*", + "ember-cli-shims": "*", + "ember-cli-sri": "*", + "ember-cli-uglify": "*", + "ember-data": "*", + "ember-export-application-global": "*", + "ember-load-initializers": "*", + "ember-resolver": "*", + "ember-source": "*", + "eslint-plugin-ember": "*", + "fastboot": "*", + "jsdom": "*", + "loader.js": "*", + "qunit": "*" + }, + "engines": { + "node": ">= 8.*" + } +} diff --git a/test-projects/02-app-that-excludes-mirage/public/robots.txt b/test-projects/02-app-that-excludes-mirage/public/robots.txt new file mode 100644 index 000000000..f5916452e --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/public/robots.txt @@ -0,0 +1,3 @@ +# http://www.robotstxt.org +User-agent: * +Disallow: diff --git a/test-projects/02-app-that-excludes-mirage/testem.js b/test-projects/02-app-that-excludes-mirage/testem.js new file mode 100644 index 000000000..d1755a4ea --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/testem.js @@ -0,0 +1,24 @@ +module.exports = { + test_page: 'tests/index.html?hidepassed', + disable_watching: true, + launch_in_ci: [ + 'Chrome' + ], + launch_in_dev: [ + 'Chrome' + ], + browser_args: { + Chrome: { + mode: 'ci', + args: [ + // --no-sandbox is needed when running Chrome inside a container + process.env.TRAVIS ? '--no-sandbox' : null, + + '--disable-gpu', + '--headless', + '--remote-debugging-port=0', + '--window-size=1440,900' + ].filter(Boolean) + } + } +}; diff --git a/test-projects/02-app-that-excludes-mirage/tests/acceptance/pre-mirage-initializer-test.js b/test-projects/02-app-that-excludes-mirage/tests/acceptance/pre-mirage-initializer-test.js new file mode 100644 index 000000000..54d17aab5 --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/tests/acceptance/pre-mirage-initializer-test.js @@ -0,0 +1,12 @@ +import { test } from 'qunit'; +import moduleForAcceptance from 'basic-app/tests/helpers/module-for-acceptance'; + +moduleForAcceptance('Acceptance | noop initializer test'); + +test('visiting /noop-initializer-test', function(assert) { + visit('/'); + + andThen(function() { + assert.equal(find('p:contains(We ran the initializer)').length, 1); + }); +}); diff --git a/test-projects/02-app-that-excludes-mirage/tests/helpers/destroy-app.js b/test-projects/02-app-that-excludes-mirage/tests/helpers/destroy-app.js new file mode 100644 index 000000000..69d8f1d00 --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/tests/helpers/destroy-app.js @@ -0,0 +1,11 @@ +import { run } from '@ember/runloop'; + +export default function destroyApp(application) { + run(function() { + application.destroy(); + + if (window.server) { + server.shutdown(); + } + }); +} diff --git a/test-projects/02-app-that-excludes-mirage/tests/helpers/module-for-acceptance.js b/test-projects/02-app-that-excludes-mirage/tests/helpers/module-for-acceptance.js new file mode 100644 index 000000000..90a93bac2 --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/tests/helpers/module-for-acceptance.js @@ -0,0 +1,21 @@ +import { module } from 'qunit'; +import { resolve } from 'rsvp'; +import startApp from '../helpers/start-app'; +import destroyApp from '../helpers/destroy-app'; + +export default function(name, options = {}) { + module(name, { + beforeEach() { + this.application = startApp(); + + if (options.beforeEach) { + return options.beforeEach.apply(this, arguments); + } + }, + + afterEach() { + let afterEach = options.afterEach && options.afterEach.apply(this, arguments); + return resolve(afterEach).then(() => destroyApp(this.application)); + } + }); +} diff --git a/test-projects/02-app-that-excludes-mirage/tests/helpers/promise-ajax.js b/test-projects/02-app-that-excludes-mirage/tests/helpers/promise-ajax.js new file mode 100644 index 000000000..f84ad8631 --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/tests/helpers/promise-ajax.js @@ -0,0 +1,9 @@ +import { Promise } from 'rsvp'; + +export default (options) => { + return new Promise((resolve, reject) => { + $.ajax(options) + .done((data, status, xhr) => resolve({data, status, xhr})) + .fail((xhr, status, error) => reject({xhr, status, error})); + }); +}; diff --git a/test-projects/02-app-that-excludes-mirage/tests/helpers/resolver.js b/test-projects/02-app-that-excludes-mirage/tests/helpers/resolver.js new file mode 100644 index 000000000..b208d38d0 --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/tests/helpers/resolver.js @@ -0,0 +1,11 @@ +import Resolver from '../../resolver'; +import config from '../../config/environment'; + +const resolver = Resolver.create(); + +resolver.namespace = { + modulePrefix: config.modulePrefix, + podModulePrefix: config.podModulePrefix +}; + +export default resolver; diff --git a/test-projects/02-app-that-excludes-mirage/tests/helpers/start-app.js b/test-projects/02-app-that-excludes-mirage/tests/helpers/start-app.js new file mode 100644 index 000000000..99d35dcf4 --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/tests/helpers/start-app.js @@ -0,0 +1,17 @@ +import Application from '../../app'; +import config from '../../config/environment'; +import { merge } from '@ember/polyfills'; +import { run } from '@ember/runloop'; + +export default function startApp(attrs) { + let attributes = merge({}, config.APP); + attributes.autoboot = true; + attributes = merge(attributes, attrs); // use defaults, but you can override; + + return run(() => { + let application = Application.create(attributes); + application.setupForTesting(); + application.injectTestHelpers(); + return application; + }); +} diff --git a/test-projects/02-app-that-excludes-mirage/tests/index.html b/test-projects/02-app-that-excludes-mirage/tests/index.html new file mode 100644 index 000000000..008e6d610 --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/tests/index.html @@ -0,0 +1,33 @@ + + + + + + BasicApp Tests + + + + {{content-for "head"}} + {{content-for "test-head"}} + + + + + + {{content-for "head-footer"}} + {{content-for "test-head-footer"}} + + + {{content-for "body"}} + {{content-for "test-body"}} + + + + + + + + {{content-for "body-footer"}} + {{content-for "test-body-footer"}} + + diff --git a/test-projects/02-app-that-excludes-mirage/tests/test-helper.js b/test-projects/02-app-that-excludes-mirage/tests/test-helper.js new file mode 100644 index 000000000..0382a848d --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/tests/test-helper.js @@ -0,0 +1,8 @@ +import Application from '../app'; +import config from '../config/environment'; +import { setApplication } from '@ember/test-helpers'; +import { start } from 'ember-qunit'; + +setApplication(Application.create(config.APP)); + +start(); diff --git a/test-projects/02-app-that-excludes-mirage/vendor/.gitkeep b/test-projects/02-app-that-excludes-mirage/vendor/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/yarn.lock b/yarn.lock index 0bab09805..cd2ca661e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1512,6 +1512,14 @@ broccoli-file-creator@^1.0.0, broccoli-file-creator@^1.1.1: rsvp "~3.0.6" symlink-or-copy "^1.0.1" +broccoli-file-creator@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/broccoli-file-creator/-/broccoli-file-creator-2.1.1.tgz#7351dd2496c762cfce7736ce9b49e3fce0c7b7db" + integrity sha512-YpjOExWr92C5vhnK0kmD81kM7U09kdIRZk9w4ZDCDHuHXW+VE/x6AGEOQQW3loBQQ6Jk+k+TSm8dESy4uZsnjw== + dependencies: + broccoli-plugin "^1.1.0" + mkdirp "^0.5.1" + broccoli-filter@^1.2.2, broccoli-filter@^1.2.3: version "1.2.4" resolved "https://registry.yarnpkg.com/broccoli-filter/-/broccoli-filter-1.2.4.tgz#409afb94b9a3a6da9fac8134e91e205f40cc7330" @@ -1722,7 +1730,7 @@ broccoli-stew@^1.2.0, broccoli-stew@^1.3.3, broccoli-stew@^1.5.0: symlink-or-copy "^1.1.8" walk-sync "^0.3.0" -broccoli-string-replace@^0.1.1, broccoli-string-replace@^0.1.2: +broccoli-string-replace@^0.1.1: version "0.1.2" resolved "https://registry.npmjs.org/broccoli-string-replace/-/broccoli-string-replace-0.1.2.tgz#1ed92f85680af8d503023925e754e4e33676b91f" integrity sha1-HtkvhWgK+NUDAjkl51Tk4zZ2uR8= From 7b586409193dc32620d235735e46f942674ea82b Mon Sep 17 00:00:00 2001 From: John Griffin Date: Tue, 20 Nov 2018 17:08:22 -0500 Subject: [PATCH 260/879] Fix tests in IE11 --- .../integration/orm/has-many/3-reflexive/accessor-test.js | 4 ++-- tests/integration/orm/has-many/3-reflexive/new-test.js | 2 +- .../orm/has-many/4-named-reflexive/accessor-test.js | 4 ++-- .../integration/orm/has-many/4-named-reflexive/new-test.js | 2 +- .../5-named-reflexive-explicit-inverse/accessor-test.js | 4 ++-- .../5-named-reflexive-explicit-inverse/new-test.js | 2 +- .../orm/has-many/6-one-way-reflexive/accessor-test.js | 4 ++-- .../orm/has-many/6-one-way-reflexive/new-test.js | 2 +- .../has-many/7-named-one-way-reflexive/accessor-test.js | 4 ++-- .../orm/has-many/7-named-one-way-reflexive/new-test.js | 2 +- .../orm/has-many/8-many-to-many/accessor-test.js | 4 ++-- tests/integration/orm/has-many/8-many-to-many/new-test.js | 2 +- tests/integration/orm/mixed/1-one-to-many/accessor-test.js | 4 ++-- .../orm/mixed/1-one-to-many/instantiating-test.js | 2 +- tests/integration/orm/mixed/2-many-to-one/accessor-test.js | 7 ++++++- .../orm/mixed/3-one-to-many-polymorphic/accessor-test.js | 4 ++-- .../mixed/3-one-to-many-polymorphic/instantiating-test.js | 2 +- 17 files changed, 30 insertions(+), 25 deletions(-) diff --git a/tests/integration/orm/has-many/3-reflexive/accessor-test.js b/tests/integration/orm/has-many/3-reflexive/accessor-test.js index 3d28ae6c8..cc6310cc4 100644 --- a/tests/integration/orm/has-many/3-reflexive/accessor-test.js +++ b/tests/integration/orm/has-many/3-reflexive/accessor-test.js @@ -14,8 +14,8 @@ module('Integration | ORM | Has Many | Reflexive | accessor', function(hooks) { assert.equal(tag.tags.models.length, tags.length, 'the parent has the correct number of children'); assert.equal(tag.tagIds.length, tags.length, 'the parent has the correct number of children ids'); - tags.forEach((t, i) => { - assert.deepEqual(tag.tags.models[i], t, 'each child is in parent.children array'); + tags.forEach(t => { + assert.ok(tag.tags.includes(t)); if (t.isSaved()) { assert.ok(tag.tagIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); diff --git a/tests/integration/orm/has-many/3-reflexive/new-test.js b/tests/integration/orm/has-many/3-reflexive/new-test.js index 8ebc34b50..e24f9694e 100644 --- a/tests/integration/orm/has-many/3-reflexive/new-test.js +++ b/tests/integration/orm/has-many/3-reflexive/new-test.js @@ -14,7 +14,7 @@ module('Integration | ORM | Has Many | Reflexive | new', function(hooks) { }); assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagB.tags.models[0], tagA); + assert.ok(tagB.tags.includes(tagA)); }); test('the parent errors if the children ids don\'t exist', function(assert) { diff --git a/tests/integration/orm/has-many/4-named-reflexive/accessor-test.js b/tests/integration/orm/has-many/4-named-reflexive/accessor-test.js index 8b94106b3..13c66630f 100644 --- a/tests/integration/orm/has-many/4-named-reflexive/accessor-test.js +++ b/tests/integration/orm/has-many/4-named-reflexive/accessor-test.js @@ -14,8 +14,8 @@ module('Integration | ORM | Has Many | Named Reflexive | accessor', function(hoo assert.equal(tag.labels.models.length, tags.length, 'the parent has the correct number of children'); assert.equal(tag.labelIds.length, tags.length, 'the parent has the correct number of children ids'); - tags.forEach((t, i) => { - assert.deepEqual(tag.labels.models[i], t, 'each child is in parent.children array'); + tags.forEach(t => { + assert.ok(tag.labels.includes(t)); if (t.isSaved()) { assert.ok(tag.labelIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); diff --git a/tests/integration/orm/has-many/4-named-reflexive/new-test.js b/tests/integration/orm/has-many/4-named-reflexive/new-test.js index 6e82bf224..e5c89f2ba 100644 --- a/tests/integration/orm/has-many/4-named-reflexive/new-test.js +++ b/tests/integration/orm/has-many/4-named-reflexive/new-test.js @@ -14,7 +14,7 @@ module('Integration | ORM | Has Many | Named Reflexive | new', function(hooks) { }); assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagB.labels.models[0], tagA); + assert.ok(tagB.labels.includes(tagA)); }); test('the parent errors if the children ids don\'t exist', function(assert) { diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/accessor-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/accessor-test.js index 73727d22b..78c942fb1 100644 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/accessor-test.js +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/accessor-test.js @@ -14,8 +14,8 @@ module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | access assert.equal(tag.labels.models.length, tags.length, 'the parent has the correct number of children'); assert.equal(tag.labelIds.length, tags.length, 'the parent has the correct number of children ids'); - tags.forEach((t, i) => { - assert.deepEqual(tag.labels.models[i], t, 'each child is in parent.children array'); + tags.forEach(t => { + assert.ok(tag.labels.includes(t)); if (t.isSaved()) { assert.ok(tag.labelIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/new-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/new-test.js index 6c2fbc3e5..2f739901c 100644 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/new-test.js +++ b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/new-test.js @@ -14,7 +14,7 @@ module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | new', }); assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagB.labels.models[0], tagA); + assert.ok(tagB.labels.includes(tagA)); }); test('the parent errors if the children ids don\'t exist', function(assert) { diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/accessor-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/accessor-test.js index cef4f4597..295ce2a15 100644 --- a/tests/integration/orm/has-many/6-one-way-reflexive/accessor-test.js +++ b/tests/integration/orm/has-many/6-one-way-reflexive/accessor-test.js @@ -14,8 +14,8 @@ module('Integration | ORM | Has Many | One-Way Reflexive | accessor', function(h assert.equal(tag.tags.models.length, tags.length, 'the parent has the correct number of children'); assert.equal(tag.tagIds.length, tags.length, 'the parent has the correct number of children ids'); - tags.forEach((t, i) => { - assert.deepEqual(tag.tags.models[i], t, 'each child is in parent.children array'); + tags.forEach(t => { + assert.ok(tag.tags.includes(t)); if (t.isSaved()) { assert.ok(tag.tagIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/new-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/new-test.js index ada65b6e9..f0c1c7db1 100644 --- a/tests/integration/orm/has-many/6-one-way-reflexive/new-test.js +++ b/tests/integration/orm/has-many/6-one-way-reflexive/new-test.js @@ -14,7 +14,7 @@ module('Integration | ORM | Has Many | One-Way Reflexive | new', function(hooks) }); assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagB.tags.models[0], tagA); + assert.ok(tagB.tags.includes(tagA)); }); test('the parent errors if the children ids don\'t exist', function(assert) { diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/accessor-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/accessor-test.js index 0fa0ac9a9..d9d4cc3ce 100644 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/accessor-test.js +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/accessor-test.js @@ -14,8 +14,8 @@ module('Integration | ORM | Has Many | Named One-Way Reflexive | accessor', func assert.equal(tag.labels.models.length, tags.length, 'the parent has the correct number of children'); assert.equal(tag.labelIds.length, tags.length, 'the parent has the correct number of children ids'); - tags.forEach((t, i) => { - assert.deepEqual(tag.labels.models[i], t, 'each child is in parent.children array'); + tags.forEach(t => { + assert.ok(tag.labels.includes(t)); if (t.isSaved()) { assert.ok(tag.labelIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/new-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/new-test.js index 0958bec81..1472b13cb 100644 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/new-test.js +++ b/tests/integration/orm/has-many/7-named-one-way-reflexive/new-test.js @@ -14,7 +14,7 @@ module('Integration | ORM | Has Many | Named One-Way Reflexive | new', function( }); assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagB.labels.models[0], tagA); + assert.ok(tagB.labels.includes(tagA)); }); test('the parent errors if the children ids don\'t exist', function(assert) { diff --git a/tests/integration/orm/has-many/8-many-to-many/accessor-test.js b/tests/integration/orm/has-many/8-many-to-many/accessor-test.js index 092ab7d41..3f12c66c4 100644 --- a/tests/integration/orm/has-many/8-many-to-many/accessor-test.js +++ b/tests/integration/orm/has-many/8-many-to-many/accessor-test.js @@ -14,8 +14,8 @@ module('Integration | ORM | Has Many | Many to Many | accessor', function(hooks) assert.equal(order.products.models.length, products.length, 'the parent has the correct number of children'); assert.equal(order.productIds.length, products.length, 'the parent has the correct number of children ids'); - products.forEach((p, i) => { - assert.deepEqual(order.products.models[i], p, 'each child is in parent.children array'); + products.forEach(p => { + assert.ok(order.products.includes(p)); if (p.isSaved()) { assert.ok(order.productIds.indexOf(p.id) > -1, 'each saved child id is in parent.childrenIds array'); diff --git a/tests/integration/orm/has-many/8-many-to-many/new-test.js b/tests/integration/orm/has-many/8-many-to-many/new-test.js index 2cd917fe8..78ca6f8b1 100644 --- a/tests/integration/orm/has-many/8-many-to-many/new-test.js +++ b/tests/integration/orm/has-many/8-many-to-many/new-test.js @@ -14,7 +14,7 @@ module('Integration | ORM | Has Many | Many to Many | new', function(hooks) { }); assert.deepEqual(order.productIds, [ product.id ]); - assert.deepEqual(order.products.models[0], product); + assert.ok(order.products.includes(product)); }); test('the parent errors if the children ids don\'t exist', function(assert) { diff --git a/tests/integration/orm/mixed/1-one-to-many/accessor-test.js b/tests/integration/orm/mixed/1-one-to-many/accessor-test.js index 598de8f37..380476060 100644 --- a/tests/integration/orm/mixed/1-one-to-many/accessor-test.js +++ b/tests/integration/orm/mixed/1-one-to-many/accessor-test.js @@ -17,8 +17,8 @@ module('Integration | ORM | Mixed | One To Many | accessor', function(hooks) { assert.equal(user.posts.models.length, posts.length, 'the parent has the correct number of children'); assert.equal(user.postIds.length, posts.length, 'the parent has the correct number of children ids'); - posts.forEach((post, i) => { - assert.deepEqual(user.posts.models[i], posts[i], 'each child is in parent.children array'); + posts.forEach(post => { + assert.ok(user.posts.includes(post)); if (post.isSaved()) { assert.ok(user.postIds.indexOf(post.id) > -1, 'each saved child id is in parent.childrenIds array'); diff --git a/tests/integration/orm/mixed/1-one-to-many/instantiating-test.js b/tests/integration/orm/mixed/1-one-to-many/instantiating-test.js index ce4276f9c..337c271fe 100644 --- a/tests/integration/orm/mixed/1-one-to-many/instantiating-test.js +++ b/tests/integration/orm/mixed/1-one-to-many/instantiating-test.js @@ -14,7 +14,7 @@ module('Integration | ORM | Mixed | One To Many | instantiating', function(hooks }); assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.posts.models[0], post); + assert.ok(user.posts.includes(post)); }); test('the parent errors if the children ids don\'t exist', function(assert) { diff --git a/tests/integration/orm/mixed/2-many-to-one/accessor-test.js b/tests/integration/orm/mixed/2-many-to-one/accessor-test.js index 01f077bbd..d9cb8867c 100644 --- a/tests/integration/orm/mixed/2-many-to-one/accessor-test.js +++ b/tests/integration/orm/mixed/2-many-to-one/accessor-test.js @@ -14,7 +14,12 @@ module('Integration | ORM | Mixed | Many To One | accessor', function(hooks) { test(`the references of a ${state} are correct`, function(assert) { let [ post, user ] = this.helper[state](); - assert.deepEqual(post.user, user); + if (post.user) { + assert.ok(post.user.equals(user)); + } else { + assert.equal(post.user, null); + assert.equal(user, null); + } assert.equal(post.userId, user ? user.id : null); post.save(); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/accessor-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/accessor-test.js index a58958e44..35e958bb3 100644 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/accessor-test.js +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/accessor-test.js @@ -17,8 +17,8 @@ module('Integration | ORM | Mixed | One To Many Polymorphic | accessor', functio assert.equal(user.things.models.length, posts.length, 'the parent has the correct number of children'); assert.equal(user.thingIds.length, posts.length, 'the parent has the correct number of children ids'); - posts.forEach((post, i) => { - assert.deepEqual(user.things.models[i], posts[i], 'each child is in parent.children array'); + posts.forEach(post => { + assert.ok(user.things.includes(post)); if (post.isSaved()) { assert.ok(user.thingIds.find(obj => { diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/instantiating-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/instantiating-test.js index dc0591591..1a46fc912 100644 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/instantiating-test.js +++ b/tests/integration/orm/mixed/3-one-to-many-polymorphic/instantiating-test.js @@ -14,7 +14,7 @@ module('Integration | ORM | Mixed | One To Many Polymorphic | instantiating', fu }); assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.things.models[0], post); + assert.ok(user.things.includes(post)); }); test('the parent errors if the children ids don\'t exist', function(assert) { From f8eaad7b7ef416a40bead659be419d4e9f297752 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 24 Nov 2018 15:30:13 -0500 Subject: [PATCH 261/879] Adding blog --- package.json | 2 +- tests/dummy/app/pods/application/template.hbs | 6 +- .../template.md | 25 + .../2015-09-10-orm-not-ready-yet/template.md | 20 + .../2015-09-15-router-handler/template.md | 13 + .../2015-10-19-serializers-ready/template.md | 86 + .../template.md | 9 + .../template.md | 198 +++ .../template.md | 74 + .../2016-05-31-0-2-0-released/template.md | 32 + .../2017-01-09-0-3-0-beta-series/template.md | 175 +++ .../template.md | 91 ++ .../template.md | 80 + tests/dummy/app/pods/blog/index/controller.js | 63 + tests/dummy/app/pods/blog/index/template.hbs | 15 + tests/dummy/app/pods/blog/post/route.js | 9 + tests/dummy/app/pods/blog/post/template.hbs | 7 + tests/dummy/app/pods/blog/template.hbs | 7 + tests/dummy/app/router.js | 13 +- tests/dummy/app/styles/app.css | 70 + yarn.lock | 1385 ++++++++++++++--- 21 files changed, 2134 insertions(+), 246 deletions(-) create mode 100644 tests/dummy/app/pods/blog/data/2015-09-06-thoughts-on-model-attribute-formatting/template.md create mode 100644 tests/dummy/app/pods/blog/data/2015-09-10-orm-not-ready-yet/template.md create mode 100644 tests/dummy/app/pods/blog/data/2015-09-15-router-handler/template.md create mode 100644 tests/dummy/app/pods/blog/data/2015-10-19-serializers-ready/template.md create mode 100644 tests/dummy/app/pods/blog/data/2015-11-03-inside-ember-cli-mirage/template.md create mode 100644 tests/dummy/app/pods/blog/data/2016-01-03-0-2-0-beta-9-released/template.md create mode 100644 tests/dummy/app/pods/blog/data/2016-01-03-0-2-update-only-inject-schema/template.md create mode 100644 tests/dummy/app/pods/blog/data/2016-05-31-0-2-0-released/template.md create mode 100644 tests/dummy/app/pods/blog/data/2017-01-09-0-3-0-beta-series/template.md create mode 100644 tests/dummy/app/pods/blog/data/2017-06-05-polymorphic-associations-and-auto-discovery-of-ember-data-models/template.md create mode 100644 tests/dummy/app/pods/blog/data/2018-02-01-changing-mirages-default-linkage-data-behavior/template.md create mode 100644 tests/dummy/app/pods/blog/index/controller.js create mode 100644 tests/dummy/app/pods/blog/index/template.hbs create mode 100644 tests/dummy/app/pods/blog/post/route.js create mode 100644 tests/dummy/app/pods/blog/post/template.hbs create mode 100644 tests/dummy/app/pods/blog/template.hbs diff --git a/package.json b/package.json index 822a2c9aa..ccbf88c65 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "chai": "^4.1.0", "ember-ajax": "^3.0.0", "ember-cli": "~2.18.2", - "ember-cli-addon-docs": "ember-learn/ember-cli-addon-docs#6b11d814f2ed39b0670a49f324d385c2dfad9a99", + "ember-cli-addon-docs": "^0.6.1", "ember-cli-addon-docs-esdoc": "^0.2.1", "ember-cli-app-version": "^2.0.0", "ember-cli-dependency-checker": "^2.0.0", diff --git a/tests/dummy/app/pods/application/template.hbs b/tests/dummy/app/pods/application/template.hbs index 5633c6360..1584d99a6 100644 --- a/tests/dummy/app/pods/application/template.hbs +++ b/tests/dummy/app/pods/application/template.hbs @@ -1,4 +1,8 @@ -{{docs-header}} +{{#docs-header as |header|}} + {{#header.link 'blog'}} + Blog + {{/header.link}} +{{/docs-header}} {{outlet}} diff --git a/tests/dummy/app/pods/blog/data/2015-09-06-thoughts-on-model-attribute-formatting/template.md b/tests/dummy/app/pods/blog/data/2015-09-06-thoughts-on-model-attribute-formatting/template.md new file mode 100644 index 000000000..ee424b31f --- /dev/null +++ b/tests/dummy/app/pods/blog/data/2015-09-06-thoughts-on-model-attribute-formatting/template.md @@ -0,0 +1,25 @@ +# Thoughts on model attribute formatting + +permalink: /blog/2015/09/06/thoughts-on-model-attribute-formatting/ + +I ran into an interesting problem while working on the serializer layer. I was just wrapping up AMS-style responses and was going to start working on the JSON:API version, when a wrinkle came up: the formatting of attribute names, both on Mirage's model layer instances, and on the field names of Mirage's database. + +Currently, Mirage's database simply takes whatever POJO of attrs you give it, and sticks that in its db. So if you write + +```js +db.users.create({ first_name: 'Link' }) +``` + +then you'll end up with that POJO in the db, but if you use `first-name`, you'll get that instead. This was originally done to make things as simple as possible - your db fields matched your API responses, so fixtures would "just work", and accessing the data is as you'd expect based on your API. + +When I introduced the model layer, I added attr accessors that simply matched the keys in the db. But right now, it's a naive implementation that just wraps the db attrs. So, if you're working with a `user` model (e.g. in your route handler), you would either access `user.first_name` or `user['first-name']`, depending on how your database looked. + +It seems like attrs on models should be consistently camelCase. One would expect to write `user.firstName` on a JavaScript model. That's the convention. I *could* keep the model's attrs in the format of your API (i.e. whatever's in your db), so we'd have something like `user.first_name`. But, what happens when you switch your app over to JSON:API? Now, you have to rewrite all the custom parts of your Mirage server, since it's now `user['first-name']` in JSON:API. That's pretty crappy. Not to mention, the dynamic methods added by the model layer, like `user.createPost`, should probably be consistent across API formats. + +So, I think models should have camelCase attributes. That way you're always using camelCase, regardless of the format of your API - which makes sense, since you're writing a (mock) JavaScript server. + +This presents an interesting challenge. How should the db fields be formatted? There's three ways to create db data. Fixture files, factories, and using the ORM in a route handler (e.g. `schema.user.create(...)`). The latter two seem like they should be camelCase (again, you don't want to have to update all your factories if you change from AMS to JSON:API...you may have to update some parts of your routes). But fixtures should always "just work". + +This leads me to think there should be a part of the "serializer layer" that can deserialize an API payload and get the attrs for the model(s), or at least in some way standardize it. This would mean if you change your API, you'd be able to use new fixture files just by specifying your new serializer. Also, it'd make the shorthands more versatile - they could basically use your serializers to deserialize the payload, and then they'd be able to create/update/delete the appropriate models regardless of your API format. Right now, they are coupled to AMS-style responses. + +I'll have to think more about this, but right now this feels like the right move. diff --git a/tests/dummy/app/pods/blog/data/2015-09-10-orm-not-ready-yet/template.md b/tests/dummy/app/pods/blog/data/2015-09-10-orm-not-ready-yet/template.md new file mode 100644 index 000000000..9c208a4e1 --- /dev/null +++ b/tests/dummy/app/pods/blog/data/2015-09-10-orm-not-ready-yet/template.md @@ -0,0 +1,20 @@ +# The ORM is not ready, yet + +permalink: /blog/2015/09/10/orm-not-ready-yet/ + +I wanted to quickly note that, although [the models PR](https://github.com/samselikoff/ember-cli-mirage/pull/82) has been merged into master, it is not quite ready for use. To be really effective, Mirage also needs a serializer layer (in progress), and an update to the factory layer (to support associations and traits). + +My plan is to document all three of these features (models, serializers and updated factories) at once, since they all rely on the orm, and will all require you to write simple model definitions to take advantage of. + +Once you add a model definition, say by defining an `author` model + +```js +// mirage/models/author.js +export default Mirage.Model.extend({ + posts: Mirage.hasMany() +}); +``` + +then you opt into the orm. Now, routes will get a `schema` object injected instead of a `db` (the `db` will be accessible via `schema.db`), and shorthands and factories will leverage the `schema`, and you'll be able to use serializers as well. + +I've hit some snags writing serializers, and there's a lot of hidden complexity in this effort, but I'm hoping I can wrap this all up in the next few weeks. diff --git a/tests/dummy/app/pods/blog/data/2015-09-15-router-handler/template.md b/tests/dummy/app/pods/blog/data/2015-09-15-router-handler/template.md new file mode 100644 index 000000000..c5143fb57 --- /dev/null +++ b/tests/dummy/app/pods/blog/data/2015-09-15-router-handler/template.md @@ -0,0 +1,13 @@ +# Refactoring Server, adding a Route Handler object + +permalink: /blog/2015/09/15/router-handler/ + +Updating the shorthands to work with the serializer layer proved harder than I thought. Serializers made it clear that the shorthands were making assumptions about the shape of the JSON payload. Now that users will be able to use serializers to transform how their data looks going out, I'll also need a way for them to specify how the data looks coming in. This is similar to Ember Data's `normalize` function. + +If a user is using a PUT or POST shorthand, I'll need to first deserialize the payload into a standard format, so the shorthands know what to do with it. I'll use the JSON:API format for the standard; that way, if you're using JSON:API, `normalize` will be a no-op, and AMS-style responses will simply convert to JSON:API. + +This sounds a lot like Ember Data, and I've even considered using Ember Data for the data store/identity map portion of Mirage; but at this point, there are still too many unknowns. I'd rather get the rest of the main features incorporated + wait for the API to stabilize, before making such a big decision. + +Mirage's ORM has very different needs than Ember Data's: it's a synchronous in-memory store, and while ED also has a clientside store, it was designed around an async layer, incorporates Ember.Object for KVO, requires attr declarations, and much more. Mirage's orm uses `object.defineProperty` to keep things as lightweight as possible, so you'll be able to `user.createPost`, `user.posts = [1]`, `post.user = user` etc. in your routes. Adding the ceremony of `.get(), `.set()`, and `createRecord` everywhere would make Mirage feel like more of a burden, and I think it's important to try to keep things as slim and easy-to-use as possible, given that Mirage is designed for mocking. + +In any case, the shorthands were originally simple functions that were unit tested. Now that there's a bit more going on, I felt the need to refactor the server/controller code a bit. I also got around to slimming down the initializer, moving that code to the Server, and moving a lot of route-handling-related code from Server to a new RouteHandler class. My next step will be to turn the shorthand functions into RouteHandlers (probably subclasses), which will hopefully provide some direction on how the data will flow from request, through normalize, to the shorthands and out to a response. diff --git a/tests/dummy/app/pods/blog/data/2015-10-19-serializers-ready/template.md b/tests/dummy/app/pods/blog/data/2015-10-19-serializers-ready/template.md new file mode 100644 index 000000000..47436d416 --- /dev/null +++ b/tests/dummy/app/pods/blog/data/2015-10-19-serializers-ready/template.md @@ -0,0 +1,86 @@ +# Serializers are ready for testing + +permalink: /blog/2015/10/19/serializers-ready/ + +Yesterday I merged in the [JSON:API Serializer](https://github.com/samselikoff/ember-cli-mirage/commit/9927a7f7a2232ddf8df15e01991e538eefadee9c), which is the last piece of planned work I have for the serializer layer. That means it's ready to test! I'm sure there's plenty I haven't thought of yet, but I think it's time to get some people kicking the tires. + +For the brave, I'll be writing documentation this week about how to take advantage of the ORM and Serializer layer in your route handlers. Migration will be at your own pace: you should be able to switch over, keep old custom route handlers that access the db directly, and switch them over one at a time to use the new schema object - the ORM. Using a schema in your route handler lets you respond with a model or collection, which is the basis for your serializers knowing how to transform your response into an appropriately-formatted JSON payload. + +The docs should be landing soon. But, the code is already in master (since the entire ORM is opt-in) - so, for the *truly* brave, you can try this out right now, by doing something like the following: + +1. Upgrade to master ("samselikoff/ember-cli-mirage" in your package.json) +2. Define your models. For each model create a file under `mirage/models` that looks like the following: + + ```js + // mirage/models/post.js + import { Model } from 'ember-cli-mirage'; + + export default Model; + ``` + + Use the singular version of your model for the filename. + +3. Define your serializer. There are two named serializers, JSON:API and ActiveModelSerializer. You can customize these as well the basic Serializer that's also included. + + ```js + // mirage/serializers/application.js + import Serializer from 'ember-cli-mirage/serializers/json-api-serializer'; + + export default Serializer; + ``` + +4. Once you do the above, Mirage will now be using an ORM. This means your custom route handlers will no longer have the signature + + ```js + function(db, request) + ``` + + but rather + + ```js + function(schema, request) + ``` + + where schema is the ORM object. Fortunately, the db is available at schema.db. This means you can give your old route handlers access to the db by doing the following refactoring: + + ```diff + - this.get('/some/path', function(db, request), { + + this.get('/some/path', function({db}, request), { + // your custom route handler + }); + ``` + + Not bad, thanks to the magic of ES6 object destructuring! + + Additionally, the ORM standardizes the formatting of database attributes and collections. Previously, for example, the name of the database collection was based on the filename of your fixture or factory - so, you could have a collection called db.blog_posts. With the ORM, everything is camel-cased (we are writing JS, after all). So, this may necessitate some refactoring of your custom route handler code. + +Adding relationship support looks like this: + +```js +// mirage/models/author.js +import { Model, hasMany } from 'ember-cli-mirage'; + +export default Model.extend({ + posts: hasMany() +}); + +// mirage/models/post.js +import { Model, belongsTo } from 'ember-cli-mirage'; + +export default Model.extend({ + author: belongsTo() +}); + +// mirage/serializers/author.js +import ApplicationSerializer from './application'; + +export default ApplicationSerializer.extend({ + relationships: ['posts'] +}); +``` + +and now, the GET shorthands to /authors should return included posts! + +--- + +That's just a taste of what's to come! I want to reiterate this is very new and I basically don't suggest using it. But, if you're feeling adventurous, dive in! I would love to hear any feedback. If you do try it out, hit me up on Slack if you have questions. diff --git a/tests/dummy/app/pods/blog/data/2015-11-03-inside-ember-cli-mirage/template.md b/tests/dummy/app/pods/blog/data/2015-11-03-inside-ember-cli-mirage/template.md new file mode 100644 index 000000000..3f1a86990 --- /dev/null +++ b/tests/dummy/app/pods/blog/data/2015-11-03-inside-ember-cli-mirage/template.md @@ -0,0 +1,9 @@ +# Video: Inside Ember CLI Mirage + +permalink: /blog/2015/11/03/inside-ember-cli-mirage/ + +On October 10 I spoke at the Global Ember Meetup about why I built Mirage, and what's planned for the next version. Here's the video: + +
    + +
    diff --git a/tests/dummy/app/pods/blog/data/2016-01-03-0-2-0-beta-9-released/template.md b/tests/dummy/app/pods/blog/data/2016-01-03-0-2-0-beta-9-released/template.md new file mode 100644 index 000000000..ff9a0d982 --- /dev/null +++ b/tests/dummy/app/pods/blog/data/2016-01-03-0-2-0-beta-9-released/template.md @@ -0,0 +1,198 @@ +# Mirage 0.2.0-beta.9 released + +permalink: /blog/2016/01/03/0-2-0-beta.9-released/ + +Mirage v0.2.0-beta.9 has been released. Check out [the release notes](https://github.com/samselikoff/ember-cli-mirage/releases/tag/v0.2.0-beta.9) for the breaking changes and enhancements. + +## Update on a 0.2 stable release + +I wanted to jot down some of my recent thoughts while putting this release together. Pardon the rambling. + +Originally I had planned for beta.9 to be the last beta release before cutting 0.2. Since folks have started using the 0.2 beta series, however, pain points around data modeling have been cropping up. In particular, dealing with `has-one` and `many-to-many` associations is quite difficult with the current set of abstractions. + +My first thought was to ship 0.2 as is, and then work on adding helpers for `hasAndBelongsToMany` and `hasOne`. After some more thought & discussions with various users, I realized that the ORM's abstractions might be a touch off. Let me explain. + +Mirage's ORM was built to support features like JSON:API includes and the planned factory relationships. The ORM is a way to encode association information, since there was no good place to do this in `v0.1`. My approach was to largely mimic server-side frameworks like Rails, since they've already solved this problem. After all, your models already live on the backend in database tables, so why not use the same concepts? Tables with foreign keys are familiar to backend devs, so let's just emulate those concepts in Mirage. + +So, that's been the plan so far. The ORM has working `hasMany` and `belongsTo` associations, and those take care of many cases. The `manyToMany` case is interesting, though, because there's not necessarily a standard conventional way that all Ember developers or servers approach this problem. + +Take a simple `belongsTo`, like a `post` that belongs to an `author`. The `post` probably owns the foreign key, something like `author_id`. Persisting this relationship, then, is as simple as saving any other attribute on the `post`: + +``` +PUT /api/posts/1 + +{ + post: { + id: 1, + title: 'Hipster ipsum', + author_id: 24 + } +} +``` + +`author_id` is all that's needed to tell both Ember Data and the server about the new relationship. + +`hasMany` is where things start to get tricky. Let's assume we've also defined the inverse of the above relationship, so an `author` has many `posts`. If you updated an author with new posts, how would you persist those new relationships? + +As above, the foreign key on each `post` is all that's needed to tell both the frontend and the backend about the new relationship, so typically I would handle it like this: + +```js +post1.set('author', author); +post1.save(); + +post2.set('author', author); +post2.save(); +``` + +and so on. You can write code that batches these requests, but the point here is that this is pretty straightforward stuff. Persisting a relationship is just boring old CRUD on a resource. + +Interestingly, the [Ember Data guides](https://guides.emberjs.com/v2.5.0/models/relationships/#toc_creating-records) show code that suggests persisting a `hasMany` relationship by calling `save` on the parent, which looks something like this: + +```js +author.get('posts').pushObjects([post1, post3]); +author.save(); +``` + +Now, Ember Data can understand this, and in fact this is how some teams work. But what does the request/response look like? Maybe something like + +``` +PUT /authors/1 +{ + author: { + id: 1, + name: 'Frank', + post_ids: [1, 3] + } +} +``` + +This is a request to update a single `author` resource - but behind the scenes, is your backend actually updating the foreign keys on two different post records? If so, we've kind of moved out of the realm of doing boring CRUD on resources, because now our server is doing something different or more than what we asked of it: we asked it to update the `author:1` resource, and in reality it's updating two other `post` resources. Interestingly I've asked several folks in the community how they deal with this issue, and the response varies. + +The story gets even trickier with many-to-many relationships. Sometimes people model the join record in their Ember apps, sometimes they don't. If they don't, a PUT to an `author` resource could actually be *creating* multiple server resources behind the scenes, via a join table. + +This obviously has implications for Mirage, which works best with conventional server endpoints. A PUT to a resource updates that resource, and so on. But plenty of people write their servers this way, and it got me thinking: perhaps database tables and foreign keys are the wrong abstraction for Mirage to emulate. Perhaps transport of HTTP resources is a bit more generic and abstract than that. + +Take, for example, the following Ember Data model definitions: + +```js +// models/post.js +export default DS.Model.extend({ + + categories: DS.hasMany(); + +}); + +// models/category.js +export default DS.Model.extend({ + + name: DS.attr() + +}); +``` + +That is a perfectly valid and legitimate domain model. By looking at those two models, can you tell me which entity owns the foreign key? Nope. In fact, you don't even know if this is a one-to-many or many-to-many relationship. And yet, from the perspective of HTTP resources (including a valid implementation of a JSON:API server), this is totally valid. + +Here's the JSON:API response, for example: + +``` +GET /posts/1?include=categories + +{ + data: { + type: 'posts', + id: 1, + relationships: { + categories: [ + { + data: { + type: 'categories', + id: '2' + } + }, + { + data: { + type: 'categories', + id: '5' + } + } + ] + } + }, + included: [ + { + type: 'categories', + id: '2', + attributes: { + name: 'Economics' + } + }, + { + type: 'categories', + id: '5', + attributes: { + name: 'Programming' + } + } + ] +} +``` + +Totally valid, and also impossible to ascertain whether this is a one-to-many or many-to-many relationship. + +Basing Mirage's ORM on database tables and foreign keys makes some things really easy and familiar, but for these situations it's a pain. If your actual Ember app and your actual server can handle a request like + +``` +PUT /posts/1 +{ + post: { + id: 1, + tag_ids: [1, 4] + } +} +``` + +just fine, you shouldn't have to add extra logic or models to make your fake Mirage server work. + +The solution I have in mind for this problem is to replace the foreign key implementation with an associations map. This map will be a singleton that all models will have a reference to, and it will be used to persist model relationships. + +The external API of Mirage's ORM won't change. For example, say you had a `author` that has many `posts`: + +```js +// mirage/models/author.js +export default Model.extend({ + posts: hasMany() +}); + +// mirage/models/post.js +export default Model.extend({ +}); +``` + +Currently (in 0.2.0-beta.9), Mirage makes an assumption here that the `post` resource has an `author_id` foreign key. As we've just shown, this is potentially a false assumption. My previous plan was to write a `hasAndBelongsToMany` helper for many-to-many relationships. Then, if this relationship turned out to be a many-to-many, the user would need to do something like the following: + +```js +// mirage/models/author.js +export default Model.extend({ + posts: hasAndBelongsToMany() +}); +``` + +This would tell Mirage to transparently create a `author-post` join table, and deal with the persistence there. + +Again, this now feels like the wrong abstraction, and it also introduces concepts that aren't necessarily appropriate for the domain of the frontend. Instead, the original domain model with the `hasMany` declaration will add an `author.posts` key to the singleton associations map, where all the relationship data can be stored. This has an added benefit of simplifying Mirage's interface for creating relationships in factories and elsewhere, as now developers will be able to do things like + +```js +let author = server.create('author', { + categoryIds: [1, 3] +}); +``` + +in their tests, similar to what they're used to doing in Ember Data. We can also make Mirage's shorthands understand both forms of saving `hasMany` relationships, since the ids on the models will just be pointers to the associations map. Serializers can be used to customize which ids are sent along with the response. + +This change will also make it easier to ascertain all model information from an existing set of Ember Data models in the future. I'm confident the overall learning curve will be easier and resulting code will be cleaner. + +While this will take a bit more time to get right, I think it's important. I also feel like I have a better grasp of something important, namely that Mirage as an HTTP faking layer should not necessarily emulate various server abstractions, but rather focus on concepts that come from HTTP. It turns out that single-owner foreign keys is not one of those concepts, and therefore this abstraction does not belong in Mirage. + +I'll probably release 0.2, and work the associations map into a 0.3 release. Still thinking this through, though. + +My closing thought is that these HTTP concepts are crucial to understand if you're going to write an Ember app, and they can't just be left to the backend team. It's true that a frontend developer doesn't need to know that Rails has a `has_and_belongs_to_many` method that abstracts away join tables on many-to-many relationships; however, the developer does need to understand how her Ember app will retrieve and persist many-to-many relationships across the network. Domain modeling and HTTP transport is a central part of Ember development and unfortunately at the moment, many parts of it are still non-standard and unconventional. diff --git a/tests/dummy/app/pods/blog/data/2016-01-03-0-2-update-only-inject-schema/template.md b/tests/dummy/app/pods/blog/data/2016-01-03-0-2-update-only-inject-schema/template.md new file mode 100644 index 000000000..add783d40 --- /dev/null +++ b/tests/dummy/app/pods/blog/data/2016-01-03-0-2-update-only-inject-schema/template.md @@ -0,0 +1,74 @@ +# Mirage 0.2 update + +permalink: /blog/2016/01/03/0-2-update-only-inject-schema/ + +Here's a quick update on Mirage 0.2. + +When I started working on the ORM/Serializer layer, I knew we were going to need to bump Mirage to 0.2. However, I thought it was worth keeping the library completely backwards compatible. I wanted users to be able to update to 0.2 without breaking any of their existing route handlers. + +The more I learned while developing, the more I realized some of the assumptions I made in 0.1 were simply bad. For example, using the formatting of fixture files (including their names) to determine the format of JSON responses from mocked routes. + +Now that we have a proper ORM and serializer layer, I'd like the story for how to set up your mock server to be clear, especially to newcomers. + +In 0.1, route handlers receive the `db` as the first argument: + +```js +this.get('/users', (db, request) => { + return db.users; +}); +``` + +This made sense in a world where there was only a `db`, acting as a dumb data store, and all formatting decisions were left up to the user. + +Then, we added the ORM and Serializer. Originally, the idea was, if you defined your models - that is, if you opted in to Mirage's ORM - we'd inject a `schema` object instead of the comparatively dumb `db`: + +```js +this.get('/users', (schema, request) => { + return schema.user.all(); +}); +``` + +This returned a User Collection, which the Serializer layer knew how to serialize. + +This has been working well - but obviously, this is a breaking change for old route handlers. I also wanted people to be able to opt-in to the ORM layer, but still be able to dive into the raw `db` if they ever wanted to. `db` is an object that hangs directly off of `schema`, so you can always access it, even if you've opted in to the ORM: + +```js +this.get('/users', (schema, request) => { + return schema.db.users; +}); +``` + +This would bypass the model-specific serializers. + +ES6 destructring makes this even better: + +```js +this.get('/users', ({db}) => { + return db.users; +}); +``` + +Given this, I feel it's worth making the breaking change, and *only* injecting `schema` to route handlers. The upgrade path for existing route handlers should be a simple change: + +```diff +- this.get('/users', (db) => { ++ this.get('/users', ({db}) => { + return db.users; + }); +``` + +along with possibly specifying a default Application serializer. + +The main reason I want to make this change, is to simplify the story around how Mirage data gets set up. In 0.1, Mirage looked for defined fixtures and/or factories to set up its database. In traditional server frameworks (e.g. Rails), you have a `schema` file that specifies the schema of your db. Using a mixture of fixtures and factories is confusing and unnecessary. Further, factories should be seen as an extension of the models (db collections) they're creating, rather than their definitions. + +This is why going forward, the story for configuring Mirage will be a unified one: Models define your schema/database. So, new users will define models for each table/collection they want in their Mirage mock server. That sets up the database tables, and also gives the user a very easy starting point when they *do* want to opt into the relationship/serializer support. `server.create` will still use a factory if it exists, but if no factory exists, it will simply create an empty model. + +I'm confident this change will make Mirage simpler and more approachable. The downside is, existing users will need to define blank models for each collection they have. We'll have a generator, which will help some, but this could prove to be annoying. My hope is that having a single `/models` directory, while being able to delete empty factory and fixture files, will simplify things. Also, this paves the way for a planned future addon, `mirage-ember-data`. The purpose of this addon is to ascertain, at run-time, the server models and their relationships, based on a user's Ember Data models. This would eliminate the need to define models again, in Mirage-land. + +This addon is still a ways off, but this change - enforcing users to simply define their models as the single source of truth for their backend schema - paves the way. + +--- + +You can see all the open items left before we release 0.2.0 [here](https://github.com/samselikoff/ember-cli-mirage/issues?q=is%3Aopen+is%3Aissue+milestone%3A0.2.0). Bugs, Help Wanted and Good for New Contributors are great tags to look out for if you'd like to help push us towards release! + +If you have any thoughts or comments, tweet @samselikoff or [open an issue](https://github.com/samselikoff/ember-cli-mirage/issues). diff --git a/tests/dummy/app/pods/blog/data/2016-05-31-0-2-0-released/template.md b/tests/dummy/app/pods/blog/data/2016-05-31-0-2-0-released/template.md new file mode 100644 index 000000000..b03dc62c5 --- /dev/null +++ b/tests/dummy/app/pods/blog/data/2016-05-31-0-2-0-released/template.md @@ -0,0 +1,32 @@ +# Mirage 0.2.0 released + +permalink: /blog/2016/05/31/0-2-0-released/ + +Mirage v0.2.0 has been released! Check out [the release notes](https://github.com/samselikoff/ember-cli-mirage/releases/tag/v0.2.0-beta.9) for the breaking changes and enhancements from 0.2.0-beta.9. Also see [Adolfo's script](https://blog.abuiles.com/blog/2016/05/27/upgrading-to-mirage-v0-dot-2-0-beta-dot-9-with-jscodeshift/) to help with some of the breaking changes from `beta.7` to `beta.9`. + +If you're upgrading an app from 0.1.x to 0.2, be sure to read through [the 0.2.x docs](http://www.ember-cli-mirage.com/docs/v0.2.x/). When you're ready to upgrade, consult [the upgrade guide](http://www.ember-cli-mirage.com/docs/v0.2.x/upgrading/), and open an issue if the guide left something out. + +--- + +Even though there's more work I want to do to smooth out the API in a few places, it's time to get 0.2 released. Most (if not all) of the planned changes should be backwards compatible with 0.2, so users should start using 0.2 today. + +Next, I'm hoping to address two of the biggest pain points I saw during the beta series: + +1. **Creating object graphs in tests.** Currently, seeding Mirage with a graph of related data looks something like this: + + let author = server.create('author'); + let post1 = server.create('post', { author }); + server.createList('comment', 10, { post: post1 }); + + let post2 = server.create('post', { author }); + server.createList('comment', 5, { post: post2 }); + + Two features planned for the factory layer will help with this: an `afterCreate` hook, and `traits`. + +2. **Responding with has-one or many-to-many relationships in the Serializer.** Originally I was going to add a `hasAndBelongsToMany` helper to solve this, but now I think [ad hoc Serializer methods](https://github.com/samselikoff/ember-cli-mirage/issues/754) is a better short-term solution, and something I wanted to add anyway. Some folks are keen on getting this working, so hopefully it will land soon. + +--- + +Thanks to everyone who braved the beta series, you were crucial to all the iterations on the API, and to all the amazing contributors who helped push it through! + +Happy coding everyone! diff --git a/tests/dummy/app/pods/blog/data/2017-01-09-0-3-0-beta-series/template.md b/tests/dummy/app/pods/blog/data/2017-01-09-0-3-0-beta-series/template.md new file mode 100644 index 000000000..aa9915154 --- /dev/null +++ b/tests/dummy/app/pods/blog/data/2017-01-09-0-3-0-beta-series/template.md @@ -0,0 +1,175 @@ +# Mirage 0.3.0 beta series + +permalink: /blog/2017/01/09/0-3-0-beta-series/ + +I've started the beta series of Mirage v0.3.0. You can install the latest release (0.3.0-beta.4 as of this writing) with + +```sh +ember install ember-cli-mirage@beta +``` + +Recent updates to the ORM required some breaking changes, which is why I'm bumping Mirage's "major" version from 0.2 to 0.3. I'm hoping this is the last release series before landing a 1.0 final. + +- [Motivation](#motivation) +- [Usage](#usage) +- [Examples](#examples) +- [Roadmap](#roadmap) + +## Motivation + +The ORM that was added in 0.2 has proved useful, and recent factory enhancements (the `afterCreate` hook along with traits and associations) have really improved the ergonomics of creating complex object graphs. + +The biggest challenge since the 0.2 release has been the ORM's lack of support for several relationship types: + + - one-way + - one-to-one + - many-to-many + - reflexive + - polymorphic + +I went ahead with the 0.2.0 release anyway, because the serialization layer made working with JSON:API so much more pleasant. However, ever since the release users have been forced to write custom code in order to deal with these missing relationship types. + +When I began work on these missing types several months ago, I expected it to be relatively simple. Mirage's ORM was based off of ActiveRecord, and I felt I had a good understanding of the APIs that needed to be implemented. I started with one-to-one relationships, and nearly finished before I encountered a fundamental problem. + +In Rails, relationships are mapped on top of databases. Databases have fixed, known schemas, and ActiveRecord's APIs are designed to work with these known quantities. Questions like which records have foreign keys and whether two models are related via has-one or has-many are unambiguous, so ActiveRecord's API doesn't need to account for this. + +Modern HTTP APIs, however, are quite different. For example, take the following totally valid JSON:API response: + +```json +{ + "data": { + "id": "1", + "type": "authors", + "attributes": { + "name": "Martin Fowler" + }, + "relationships": { + "books": { + "data": [ + { + "id": "1", + "type": "books" + } + ] + } + } + }, + "included": [{ + "type": "books", + "id": "1", + "attributes": { + "title": "Refactoring: Improving the Design of Existing Code" + } + }] +} +``` + +We can see that an author `has many` books. But what about the relationship from books to authors? In the response it's ambiguous. We might assume it's many-to-one - but we could be wrong. Perhaps our app has the book _Refactoring_, which four authors. So the relationship between authors and book could turn out to be many-to-many. + +This is just one example of the ambiguity inherent in many HTTP responses. Trying to make assumptions about the underlying schema can make Mirage's abstractions even more complicated. In the 0.2 ORM, the `hasMany` and `belongsTo` helpers always assumed one side of the relationship was "belongs to", and added a foreign key to it. In the above example, this would mean books would get an `authorId` key. But with the need for many to many relationships, this turns out to be wrong. What to do? + +We could have kept the `authorId` as a default assumption, and then changed it when the user specified both sides. But what if the relationship turned out to be only one-way? You often come across this as well. Even if your backend has the relationship mapped out unambiguously, your API may choose to expose only one side. So, more assumptions like this give rise to even more indirection and unnecessary complexity. + +Further, keeping a foreign key on the belongs-to side at the database level but adding an ids array to the has-many side at the ORM level is an abstraction, and something else developers need to learn. Understanding Mirage's database structure is still useful for seeding test data and writing test assertions. And the abstractions needed to support all relationship types would be even more complex. + +Putting the `authorId` foreign key on a book when the user only ever needed an author to have many books (and therefore a `bookIds: []` array) turned out to be too confusing, and too much magic. If the user specifies that an author has many books, I decided that an author should simply get a `bookIds: []` array to manage the foreign keys — and nothing more. This decision automatically allows for relationships to be one-way only, and it also expands to support the other relationship types. In the event that there _is_ a bidirectional relationship, the keys would now need to be kept in sync on both sides - which is precisely what I've been working on, and is now handled in the 0.3 series. Further, giving models an `id` or `ids` property that corresponds directly to their relationships more closely matches Ember Data's approach. Overall, it feels like the right decision. + +## Usage + +The `hasMany` and `belongsTo` helpers are still present in 0.3, but they work a bit differently. + +Say we have the following models: + +```js +// mirage/models/author.js +import { Model, hasMany } from 'ember-cli-mirage'; + +export default Model.extend({ + + books: hasMany() + +}); +``` + +```js +// mirage/models/book.js +import { Model } from 'ember-cli-mirage'; + +export default Model.extend({ + +}); +``` + +The `hasMany` helper adds a `bookIds` array to each author model that it uses for bookkeeping. If we have an author instance + +```js +let author = schema.authors.find(1); +``` + +then the helper method `author.books` will use the `author.bookIds` property to find the related books. + +Creating related books updates the `ids` property + +```js +let steinbeck = schema.authors.create({ name: 'John Steinbeck' }); + +steinbeck.createBook({ title: 'Of Mice and Men' }); +steinbeck.createBook({ title: 'The Grapes of Wrath' }); + +steinbeck.bookIds; // [ 1, 2 ] +``` + +as does associating new books + +```js +let hemingway = schema.authors.create({ name: 'Ernest Hemingway' }); +let oldMan = schema.books.create({ title: 'The Old Man and the Sea' }); + +hemingway.books = [ oldMan ]; +hemingway.save(); + +hemingway.bookIds; // [ 3 ] +``` + +Notice that so far, _books themselves don't have any knowledge of this relationship_. This is the biggest change in the ORM. Before, the book would automatically get an `authorId`, and so this would be available in tests, and it would also be sent over in responses as a relationship on the book. But in the case of 0.3, the relationship helpers are one-way. Basically, it works more like Ember Data does. + +This means if you want a book to have an `authorId`, you'll need to also define the relationship on the book: + +```js +// mirage/models/book.js +import { Model, belongsTo } from 'ember-cli-mirage'; + +export default Model.extend({ + + author: belongsTo() + +}); +``` + +This helper will add an `authorId` to the book, and, like Ember Data, look for an implicit inverse on the `author`. If it can find one, the ORM will keep the ids on both sides of the relationship in sync. + +## Examples + +Here are some Twiddles showcasing various relationship configurations: + +- **[One-Way Has Many](https://ember-twiddle.com/802cd2f92e8c6c7280f42b054f393097?openFiles=mirage.config.js%2C)**. Notice how the author's keys are updated when you delete a book. +- **[One-Way Belongs To](https://ember-twiddle.com/24d6101792f2932e9c7edf5f0934b02c?openFiles=models.book.js%2C)**. Deleting the author will ensure existing book's keys are nulled out (i.e. they become orphans so that the database is kept consistent). +- **[One to Many](https://ember-twiddle.com/5031fb20898b277fa6aea8fe89571148?openFiles=templates.application.hbs%2C)**. The keys on both sides of the relationship are kept in sync. If you delete the author, the books become orphaned records with null keys. +- **[One to One](https://ember-twiddle.com/012bd753cb03c7ae375210d47b623ccb?openFiles=mirage.config.js%2C)**. Another bidirectional relationship with keys managed on both sides. +- **[Many to Many](https://ember-twiddle.com/104407460799f1c16c4c0dc88daf975a?openFiles=templates.application.hbs%2C)**. And another. + +## Roadmap + +Here are my plans for Mirage's next steps. First, after enough folks try out the beta series we can land 0.3. Then I'll be able to add polymorphic relationships, which will round out the ORM. + +At this point I'd like to move towards a 1.0 release, barring any glaring issues in the API. Mirage has been around for nearly two years and plenty of people are using it. It's past time we hit an official major version and lock down the API. + +After 1.0, I'd like to move forward on an Ember Data integration layer, which is now possible since Mirage's ORM is able to represent Ember Data's possible schemas. The layer would simply read in your application's Ember Data schema and reproduce it in-memory for Mirage's ORM to use. This would yield big ergonomic gains for users of the library, as you'd no longer need to duplicate your Ember Data models for Mirage, and also lower the learning curve for new users. + +There are several more features I want to move forward on now that the core API is stabilizing. Getting Mirage to be able to run in Node in an Express server would be great, since responses would be real HTTP responses, developers could use the network tab and more. + +My primary goal in 2017 is delegation. For too long my personal availability has been a bottleneck for Mirage's development. I am going to focus on finding contributors and planning instead of actual implementation. It should help move the library forward faster while getting more folks knowledgeable about the internals, while also freeing up my time to focus more on [my business](https://embermap.com/). + +If you'd like to help, join #ec-mirage on Ember's slack community and reach out! Also be sure to drop a message there or open an issue if you have any feedback on 0.3. + +I'm so happy to be part of such an awesome community and look forward to seeing you at SoEmber and EmberConf. Here's to an exciting 2017! diff --git a/tests/dummy/app/pods/blog/data/2017-06-05-polymorphic-associations-and-auto-discovery-of-ember-data-models/template.md b/tests/dummy/app/pods/blog/data/2017-06-05-polymorphic-associations-and-auto-discovery-of-ember-data-models/template.md new file mode 100644 index 000000000..171e6a14b --- /dev/null +++ b/tests/dummy/app/pods/blog/data/2017-06-05-polymorphic-associations-and-auto-discovery-of-ember-data-models/template.md @@ -0,0 +1,91 @@ +# Polymorphic associations and auto-discovery of Ember Data models + +permalink: /blog/2017/06/05/polymorphic-associations-and-auto-discovery-of-ember-data-models/ + +_Thanks to [Precision Nutrition](http://www.precisionnutrition.com/) for sponsoring some of Mirage's recent work!_ + +In the last few weeks there's been two important releases of Ember CLI Mirage. Version [0.3.2](https://github.com/samselikoff/ember-cli-mirage/releases/tag/v0.3.2) bought along auto-discovery of Ember Data models, and version [0.3.3](https://github.com/samselikoff/ember-cli-mirage/releases/tag/v0.3.3) (which I released over the weekend) added support for Polymorphic associations. + +Taken together, these two features greatly improve the ergonomics of the library. + +## Auto-discovery of Ember Data models + +In 0.3.2, [Offir Golan](https://twitter.com/Offir_Golan) shipped the auto-discovery feature. + +Models in Mirage are used by the ORM to set up collections and define relationships (associations). With this new feature, if you happen to be using Ember Data, Mirage will now auto-discover your Ember Data models (and their associations), and use those for its own schema. + +This is quite a convenient step, because if you're using Ember Data your Mirage models should match your Ember Data models anyway. Local files in `mirage/models` will "win" against auto-generated definitions, but once you delete your local files Mirage will fall back to Ember Data's schema. + +So, if you're using Ember Data, upgrade to the latest version of Mirage, nuke your `mirage/models` folder, and you never have to worry about running `ember g mirage-model` again! + +## Polymorphic associations + +Polymorphic associations were the last big missing piece of Mirage's ORM. Now, Mirage can represent any schema that Ember Data can. + +Reaching parity with Ember Data's flexible data-modeling story makes the auto-discovery feature that much more valuable. Now, no matter how you're using Ember Data, you should be able to rely on the autogenerated model classes. + +If you aren't using Ember Data, you can define has-many or belongs-to polymorphic associations on your own Mirage models: + +```js +// mirage/models/user.js +export default Model.extend({ + collectibles: hasMany({ polymorphic: true }) +}); + +// mirage/models/car.js +export default Model.extend({ + user: belongsTo() +}); + +// mirage/models/watch.js +export default Model.extend({ + user: belongsTo() +}); + +schema.users.create({ + collectibles: [ + schema.cars.create({ make: "Infiniti", model: "J30t" }), + schema.watches.create({ make: "Citizen", model: "Men's Chronograph" }), + ] +}); +``` + +Just like all other associations in Mirage's ORM, they can be one-way (null inverse), one-to-one, one-to-many or many-to-many. Check out [the docs on polymorphic associations](http://www.ember-cli-mirage.com/docs/v0.3.x/models/#association-options) for more details. + +## Upgrading + +These past few releases are all backwards-compatible with the 0.3.x series. If you're still on 0.2.x, be sure to check out the [upgrade guide](http://www.ember-cli-mirage.com/docs/v0.3.x/upgrading/) so you can get on the 0.3 series. + + + +## Roadmap + +Now that the majority of the work on the ORM is complete, there's a few things I'll be focusing on: + +- **Real network requests.** There's a PR that needs a bit of attention, but soon Mirage will have an option to boot in Ember CLI's Express server and send real HTTP responses back to your Ember app. This will enable several things: + + 1. You'll be able to use the network inspector to view your responses + 2. Mirage's database state will persist across page refreshes of your application, and + 3. You'll be able to test out features that depend on a real server, like verifying polling updates across two browser tabs + + Mirage will always be a tool focused on improving the development experience. Even though it will be able to run as a true node server, it will never make compromises to the developer experience in order to accommodate the needs of an actual production server. + +- **Landing a version 1.0.** I'm happy with Mirage's API and I'd like to land a version 1.0 soon. The only possible breaking change I'm considering at the moment has to do with the database API. + + Before the ORM you would interact with Mirage's db directly, doing things like `db.users` to fetch users and `db.users.insert` to insert new records. + + When designing this API I wanted `db.users` to return a JavaScript array but I also wanted `insert`, `update` and `destroy` to live off of this collection, e.g. `db.users.insert()`, `db.users.update()` and `db.users.destroy()`. + + Having `db.users` return the underlying database records made it way too easy to inadvertently mutate the database, so I made an early decision to have `db.users` return a copy of the records using `JSON.stringify`. This is quite costly in terms of performance and some users have hit limits when trying to seed their dummy data. + + Now that the primary interface to the database is `schema` (Mirage's ORM), the database's API isn't as important, and we could change `db.users` to `db.users.all()`. That way the other db methods (`db.insert`, `db.update` and `db.delete`) wouldn't incur the expensive cost of copying the database each time they ran. + + Other than that, I think we can lock down the API, ship 1.0 and move forward with prioritizing other features that are on the horizon. + +## How you can help + +Test your apps on 0.3.3 and report any issues that you run into, especially if your app has complex Ember Data schemas. + +And as always, if you'd like to contribute code or documentation to Mirage, jump on the #ec-mirage Slack channel and reach out. There's always more work to be done! :) diff --git a/tests/dummy/app/pods/blog/data/2018-02-01-changing-mirages-default-linkage-data-behavior/template.md b/tests/dummy/app/pods/blog/data/2018-02-01-changing-mirages-default-linkage-data-behavior/template.md new file mode 100644 index 000000000..85bfab901 --- /dev/null +++ b/tests/dummy/app/pods/blog/data/2018-02-01-changing-mirages-default-linkage-data-behavior/template.md @@ -0,0 +1,80 @@ +# Changing Mirage's default linkage data behavior in 0.4 to better conform to JSON:API's semantics + +permalink: /blog/2018/02/01/changing-mirages-default-linkage-data-behavior/ + +I wanted to write a quick post detailing a change that happened in Mirage's 0.4.0 release that I originally didn't signal as a breaking change, but that affected more apps than I realized. + +I have since added the following note about it to the [0.3 -> 0.4 upgrade guide]({{ site.baseurl }}{% link docs/v0.4.x/upgrading.md %}) +, and I'm reposting it here for more visibility. I think it's worth understanding, as the issue sheds light on the semantics around some of JSON:API's design decisions. + +Apologies if you upgraded to 0.4 and had to debug this yourself! + +--- + +There is one primary change in 0.4 that could break your 0.3 app. + +In 0.3.x, Mirage's JSONAPISerializer included all related foreign keys whenever serializing a model or collection, even if those relationships were not being `included` in the payload. + +This actually goes against JSON:API's design. Foreign keys in the payload are known as [Resource Linkage](http://jsonapi.org/format/#document-resource-object-linkage) and are intended to be used by API clients to link together all resources in a JSON:API compound document. In fact, most server-side JSON:API libraries do not automatically serialize all related foreign keys, and only return linkage data for related resources when they are being included in the current document. + +By including linkage data for every relationship in 0.3, it was easy to develop Ember apps that would work with Mirage but would behave differently when hooked up to a standard JSON:API server. Since Mirage always included linkage data, an Ember app might automatically be able to fetch related resources using the ids from that linkage data plus its knowledge about the API. For example, if a `post` came back like this: + +```js +// GET /posts/1 +{ + data: { + type: 'posts', + id: '1', + attributes: { ... }, + relationships: { + author: { + data: { + type: 'users', + id: '1' + } + } + } + } +} +``` + +and you forgot to `?include=author` in your GET request, Ember Data would potentially use the `user:1` foreign key and lazily fetch the `author` by making a request to `GET /authors/1`. This is problematic because + +1. This is not how foreign keys are intended to be used +2. It'd be better to see no data and fix the problem by going back up to your data-loading code and add `?include=author` to your GET request, or +3. If you do want your interface to lazily load the author, use resource `links` instead of the resource linkage `data`: + +```js +// GET /posts/1 +{ + data: { + type: 'posts', + id: '1', + attributes: { ... }, + relationships: { + author: { + links: { + related: '/api/users/1' + } + } + } + } +} +``` + +Resource links can be defined on Mirage serializers using the [links](http://www.ember-cli-mirage.com/docs/v0.3.x/serializers/#linksmodel) method (though `including` is likely the far more simpler and common approach to fetching related data). + +So, Mirage 0.4 changed this behavior and by default, the JSONAPISerializer only includes linkage data for relationships that are being included in the current payload (i.e. within the same compound document). + +This behavior is configurable via the `alwaysIncludeLinkageData` key on your JSONAPISerializers. It is set to `false` by default, but if you want to opt-in to 0.3 behavior and always include linkage data, set it to `true`: + +```js +// mirage/serializers/application.js +import { JSONAPISerializer } from 'ember-cli-mirage'; + +export default JSONAPISerializer.extend({ + alwaysIncludeLinkageData: true +}); +``` + +If you do this, I would recommend looking closely at how your real server behaves when serializing resources' relationships and whether it uses resource `links` or resource linkage `data`, and to update your Mirage code accordingly to give you the most faithful representation of your server. diff --git a/tests/dummy/app/pods/blog/index/controller.js b/tests/dummy/app/pods/blog/index/controller.js new file mode 100644 index 000000000..fb20ccd7c --- /dev/null +++ b/tests/dummy/app/pods/blog/index/controller.js @@ -0,0 +1,63 @@ +import Controller from '@ember/controller'; + +export default Controller.extend({ + + posts: [ + { + date: 'February 1, 2018', + title: `Changing Mirage's default linkage data behavior in 0.4 to better conform to JSON:API's semantics`, + slug: '2018-02-01-changing-mirages-default-linkage-data-behavior' + }, + { + date: 'June 5, 2017', + title: `Polymorphic associations and auto-discovery of Ember Data models`, + slug: '2017-06-05-polymorphic-associations-and-auto-discovery-of-ember-data-models' + }, + { + date: 'January 9, 2017', + title: `Mirage 0.3.0 beta series`, + slug: '2017-01-09-0-3-0-beta-series' + }, + { + date: 'May 31, 2016', + title: `Mirage 0.2.0 released`, + slug: '2016-05-31-0-2-0-released' + }, + { + date: 'May 13, 2016', + title: `Mirage 0.2.0-beta.9 released`, + slug: '2016-01-03-0-2-0-beta-9-released' + }, + { + date: 'January 3, 2016', + title: `Mirage 0.2 update`, + slug: '2016-01-03-0-2-update-only-inject-schema' + }, + { + date: 'November 3, 2015', + title: `Video: Inside Ember CLI Mirage`, + slug: '2015-11-03-inside-ember-cli-mirage' + }, + { + date: 'October 19, 2015', + title: `Serializers are ready for testing`, + slug: '2015-10-19-serializers-ready' + }, + { + date: 'September 15, 2015', + title: `Refactoring Server, adding a Route Handler object`, + slug: '2015-09-15-router-handler' + }, + { + date: 'September 10, 2015', + title: `The ORM is not ready, yet`, + slug: '2015-09-10-orm-not-ready-yet' + }, + { + date: 'September 6, 2015', + title: `Thoughts on model attribute formatting`, + slug: '2015-09-06-thoughts-on-model-attribute-formatting' + } + ] + +}); diff --git a/tests/dummy/app/pods/blog/index/template.hbs b/tests/dummy/app/pods/blog/index/template.hbs new file mode 100644 index 000000000..bba337560 --- /dev/null +++ b/tests/dummy/app/pods/blog/index/template.hbs @@ -0,0 +1,15 @@ +
    +

    Blog

    + + + {{#each posts as |post|}} +
    +

    {{post.date}}

    +

    + {{#link-to 'blog.post' post.slug}} + {{post.title}} + {{/link-to}} +

    +
    + {{/each}} +
    diff --git a/tests/dummy/app/pods/blog/post/route.js b/tests/dummy/app/pods/blog/post/route.js new file mode 100644 index 000000000..32ad087f6 --- /dev/null +++ b/tests/dummy/app/pods/blog/post/route.js @@ -0,0 +1,9 @@ +import Route from '@ember/routing/route'; + +export default Route.extend({ + + model(params) { + return params.post_slug; + } + +}); diff --git a/tests/dummy/app/pods/blog/post/template.hbs b/tests/dummy/app/pods/blog/post/template.hbs new file mode 100644 index 000000000..225d76efd --- /dev/null +++ b/tests/dummy/app/pods/blog/post/template.hbs @@ -0,0 +1,7 @@ +
    + {{#link-to 'blog' class='blog-detail__back-link'}} + ↠All posts + {{/link-to}} + + {{component (concat 'blog/data/' model)}} +
    diff --git a/tests/dummy/app/pods/blog/template.hbs b/tests/dummy/app/pods/blog/template.hbs new file mode 100644 index 000000000..9e19668ae --- /dev/null +++ b/tests/dummy/app/pods/blog/template.hbs @@ -0,0 +1,7 @@ +
    +
    +
    +
    + {{outlet}} +
    +
    diff --git a/tests/dummy/app/router.js b/tests/dummy/app/router.js index 154f9c861..500b725bb 100644 --- a/tests/dummy/app/router.js +++ b/tests/dummy/app/router.js @@ -45,16 +45,9 @@ Router.map(function() { }); }); - // this.route('contacts', { path: '/' }); - // this.route('contact', { path: '/:contact_id' }); - // this.route('edit', { path: '/:contact_id/edit' }); - // - // this.route('friends'); - // this.route('friend', { path: '/friends/:friend_id' }); - // this.route('close-friends'); - // this.route('pets'); - // - // this.route('word-smith', { path: '/word-smiths/:word_smith_id' }); + this.route('blog', function() { + this.route('post', { path: '/:post_slug' }); + }); this.route('not-found', { path: '/*path' }); }); diff --git a/tests/dummy/app/styles/app.css b/tests/dummy/app/styles/app.css index e69de29bb..40466ec3e 100644 --- a/tests/dummy/app/styles/app.css +++ b/tests/dummy/app/styles/app.css @@ -0,0 +1,70 @@ +.blog { + width: 100%; + margin-top: 3rem; + margin-bottom: 3rem; +} +@media (min-width: 768px) { + .blog { + display: flex; + } +} + +.blog__placeholder { + width: calc(((100% - 1400px) / 2) + 288px); + padding-left: calc((100% - 1400px) / 2); +} +.blog__content { + max-width: 869px; + padding-left: 1rem; + padding-right: 1rem; +} +@media (min-width: 768px) { + .blog__content { + padding-left: 2rem; + padding-right: 2rem; + } +} +@media (min-width: 992px) { + .blog__content { + padding-left: 5rem; + padding-right: 5rem; + } +} + +.blog-index h1 { + margin-bottom: 1.5rem; + color: rgb(61, 72, 82); + font-size: 2.25rem; + font-weight: 800; + line-height: 1.25; + text-decoration: none; +} + +.blog-index section { + margin: 30px 0; +} + +.blog-index h2 { + line-height: 1.25; +} +.blog-index h2 a { + color: rgb(61, 72, 82); + text-decoration: none; +} +.blog-index h2 a:hover { + text-decoration: underline; +} +.blog-index p { + color: #999; +} + +.blog-detail__back-link { + text-decoration: none; + color: #999; + display: block; + margin-bottom: 30px; +} + +.blog-detail__back-link:hover { + color: rgb(61, 72, 82); +} diff --git a/yarn.lock b/yarn.lock index 347f92014..3e70fc958 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,6 +9,33 @@ dependencies: "@babel/highlight" "7.0.0-beta.44" +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/core@^7.0.0": + version "7.1.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.1.6.tgz#3733cbee4317429bc87c62b29cf8587dba7baeb3" + integrity sha512-Hz6PJT6e44iUNpAn8AoyAs6B3bl60g7MJQaI0rZEar6ECzh6+srYO1xlIdssio34mPaUtAb1y+XlkkSJzok3yw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.1.6" + "@babel/helpers" "^7.1.5" + "@babel/parser" "^7.1.6" + "@babel/template" "^7.1.2" + "@babel/traverse" "^7.1.6" + "@babel/types" "^7.1.6" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.10" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/generator@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" @@ -20,6 +47,58 @@ source-map "^0.5.0" trim-right "^1.0.1" +"@babel/generator@^7.1.6": + version "7.1.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.1.6.tgz#001303cf87a5b9d093494a4bf251d7b5d03d3999" + integrity sha512-brwPBtVvdYdGxtenbQgfCdDPmtkmUBZPjUoK5SXJEBuHaA5BCubh9ly65fzXz7R6o5rA76Rs22ES8Z+HCc0YIQ== + dependencies: + "@babel/types" "^7.1.6" + jsesc "^2.5.1" + lodash "^4.17.10" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-call-delegate@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz#6a957f105f37755e8645343d3038a22e1449cc4a" + integrity sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ== + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-define-map@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c" + integrity sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.0.0" + lodash "^4.17.10" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + "@babel/helper-function-name@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" @@ -29,6 +108,15 @@ "@babel/template" "7.0.0-beta.44" "@babel/types" "7.0.0-beta.44" +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + "@babel/helper-get-function-arity@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" @@ -36,6 +124,94 @@ dependencies: "@babel/types" "7.0.0-beta.44" +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" + integrity sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.1.0.tgz#470d4f9676d9fad50b324cdcce5fbabbc3da5787" + integrity sha512-0JZRd2yhawo79Rcm4w0LwSMILFmFXjugG3yqf+P/UsKsRS1mJCmMwwlHDlMg7Avr9LrvSpp4ZSULO9r8jpCzcw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + lodash "^4.17.10" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0.tgz#2c1718923b57f9bbe64705ffe5640ac64d9bdb27" + integrity sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg== + dependencies: + lodash "^4.17.10" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.1.0.tgz#5fc31de522ec0ef0899dc9b3e7cf6a5dd655f362" + integrity sha512-BvcDWYZRWVuDeXTYZWxekQNO5D4kO55aArwZOTFXw6rlLQA8ZaDicJR1sO47h+HrnCiDFiww0fSPV0d713KBGQ== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + "@babel/helper-split-export-declaration@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" @@ -43,6 +219,32 @@ dependencies: "@babel/types" "7.0.0-beta.44" +"@babel/helper-split-export-declaration@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" + integrity sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-wrap-function@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.1.0.tgz#8cf54e9190706067f016af8f75cb3df829cc8c66" + integrity sha512-R6HU3dete+rwsdAfrOzTlE9Mcpk4RjU3aX3gi9grtmugQY0u79X7eogUvfXA5sI81Mfq1cn6AgxihfN33STjJA== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helpers@^7.1.5": + version "7.1.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.1.5.tgz#68bfc1895d685f2b8f1995e788dbfe1f6ccb1996" + integrity sha512-2jkcdL02ywNBry1YNFAH/fViq4fXG0vdckHqeJk+75fpQ2OH+Az6076tX/M0835zA45E0Cqa6pV5Kiv9YOqjEg== + dependencies: + "@babel/template" "^7.1.2" + "@babel/traverse" "^7.1.5" + "@babel/types" "^7.1.5" + "@babel/highlight@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" @@ -52,6 +254,360 @@ esutils "^2.0.2" js-tokens "^3.0.0" +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.2", "@babel/parser@^7.1.6": + version "7.1.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.6.tgz#16e97aca1ec1062324a01c5a6a7d0df8dd189854" + integrity sha512-dWP6LJm9nKT6ALaa+bnL247GHHMWir3vSlZ2+IHgHgktZQx0L3Uvq2uAWcuzIe+fujRsYWBW2q622C5UvGK9iQ== + +"@babel/plugin-proposal-async-generator-functions@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.1.0.tgz#41c1a702e10081456e23a7b74d891922dd1bb6ce" + integrity sha512-Fq803F3Jcxo20MXUSDdmZZXrPe6BWyGcWBPPNB/M7WaUYESKDeKMOGIxEzQOjGSmW/NWb6UaPZrtTB2ekhB/ew== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.0.0" + +"@babel/plugin-proposal-json-strings@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.0.0.tgz#3b4d7b5cf51e1f2e70f52351d28d44fc2970d01e" + integrity sha512-kfVdUkIAGJIVmHmtS/40i/fg/AGnw/rsZBCaapY5yjeO5RA9m165Xbw9KMOu2nqXP5dTFjEjHdfNdoVcHv133Q== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.0.0" + +"@babel/plugin-proposal-object-rest-spread@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0.tgz#9a17b547f64d0676b6c9cecd4edf74a82ab85e7e" + integrity sha512-14fhfoPcNu7itSen7Py1iGN0gEm87hX/B+8nZPqkdmANyyYWYMY2pjA3r8WXbWVKMzfnSNS0xY8GVS0IjXi/iw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0.tgz#b610d928fe551ff7117d42c8bb410eec312a6425" + integrity sha512-JPqAvLG1s13B/AuoBjdBYvn38RqW6n1TzrQO839/sIpqLpbnXKacsAgpZHzLD83Sm8SDXMkkrAvEnJ25+0yIpw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.0.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0.tgz#498b39cd72536cd7c4b26177d030226eba08cd33" + integrity sha512-tM3icA6GhC3ch2SkmSxv7J/hCWKISzwycub6eGsDrFDgukD4dZ/I+x81XgW0YslS6mzNuQ1Cbzh5osjIMgepPQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.2.0" + +"@babel/plugin-syntax-async-generators@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0.tgz#bf0891dcdbf59558359d0c626fdc9490e20bc13c" + integrity sha512-im7ged00ddGKAjcZgewXmp1vxSZQQywuQXe2B1A7kajjZmDeY/ekMPmWr9zJgveSaQH0k7BcGrojQhcK06l0zA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.0.0.tgz#0d259a68090e15b383ce3710e01d5b23f3770cbd" + integrity sha512-UlSfNydC+XLj4bw7ijpldc1uZ/HB84vw+U6BTuqMdIEmz/LDe63w/GHtpQMdXWdqQZFeAI9PjnHe/vDhwirhKA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0.tgz#37d8fbcaf216bd658ea1aebbeb8b75e88ebc549b" + integrity sha512-5A0n4p6bIiVe5OvQPxBnesezsgFJdHhSs3uFSvaPdMqtsovajLZ+G2vZyvNe10EzJBWWo3AcHGKhAFUxqwp2dw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0.tgz#886f72008b3a8b185977f7cb70713b45e51ee475" + integrity sha512-Wc+HVvwjcq5qBg1w5RG9o9RVzmCaAg/Vp0erHCKpAYV8La6I94o4GQAmFYNmkzoMO6gzoOSulpKeSSz6mPEoZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0.tgz#a6c14875848c68a3b4b3163a486535ef25c7e749" + integrity sha512-2EZDBl1WIO/q4DIkIp4s86sdp4ZifL51MoIviLY/gG/mLSuOIEg7J8o6mhbxOTvUJkaN50n+8u41FVsr5KLy/w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.1.0.tgz#109e036496c51dd65857e16acab3bafdf3c57811" + integrity sha512-rNmcmoQ78IrvNCIt/R9U+cixUHeYAzgusTFgIAv+wQb9HJU4szhpDD6e5GCACmj/JP5KxuCwM96bX3L9v4ZN/g== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0.tgz#482b3f75103927e37288b3b67b65f848e2aa0d07" + integrity sha512-AOBiyUp7vYTqz2Jibe1UaAWL0Hl9JUXEgjFvvvcSc9MVDItv46ViXFw2F7SVt1B5k+KWjl44eeXOAk3UDEaJjQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.1.5": + version "7.1.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.1.5.tgz#3e8e0bc9a5104519923302a24f748f72f2f61f37" + integrity sha512-jlYcDrz+5ayWC7mxgpn1Wj8zj0mmjCT2w0mPIMSwO926eXBRxpEgoN/uQVRBfjtr8ayjcmS+xk2G1jaP8JjMJQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.10" + +"@babel/plugin-transform-classes@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.1.0.tgz#ab3f8a564361800cbc8ab1ca6f21108038432249" + integrity sha512-rNaqoD+4OCBZjM7VaskladgqnZ1LO6o2UxuWSDzljzW21pN1KXkB7BstAVweZdxQkHAujps5QMNOTWesBciKFg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.1.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0.tgz#2fbb8900cd3e8258f2a2ede909b90e7556185e31" + integrity sha512-ubouZdChNAv4AAWAgU7QKbB93NU5sHwInEWfp+/OzJKA02E6Woh9RVoX4sZrbRwtybky/d7baTUqwFx+HgbvMA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.0.0": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.1.3.tgz#e69ff50ca01fac6cb72863c544e516c2b193012f" + integrity sha512-Mb9M4DGIOspH1ExHOUnn2UUXFOyVTiX84fXCd+6B5iWrQg/QMeeRmSwpZ9lnjYLSXtZwiw80ytVMr3zue0ucYw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0.tgz#73a24da69bc3c370251f43a3d048198546115e58" + integrity sha512-00THs8eJxOJUFVx1w8i1MBF4XH4PsAjKjQ1eqN/uCH3YKwP21GCKfrn6YZFZswbOk9+0cw1zGQPHVc1KBlSxig== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" + +"@babel/plugin-transform-duplicate-keys@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0.tgz#a0601e580991e7cace080e4cf919cfd58da74e86" + integrity sha512-w2vfPkMqRkdxx+C71ATLJG30PpwtTpW7DDdLqYt2acXU7YjztzeWW2Jk1T6hKqCLYCcEA5UQM/+xTAm+QCSnuQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.1.0.tgz#9c34c2ee7fd77e02779cfa37e403a2e1003ccc73" + integrity sha512-uZt9kD1Pp/JubkukOGQml9tqAeI8NkE98oZnHZ2qHRElmeKCodbTZgOEUtujSCSLhHSBWbzNiFSDIMC4/RBTLQ== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-for-of@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0.tgz#f2ba4eadb83bd17dc3c7e9b30f4707365e1c3e39" + integrity sha512-TlxKecN20X2tt2UEr2LNE6aqA0oPeMT1Y3cgz8k4Dn1j5ObT8M3nl9aA37LLklx0PBZKETC9ZAf9n/6SujTuXA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.1.0.tgz#29c5550d5c46208e7f730516d41eeddd4affadbb" + integrity sha512-VxOa1TMlFMtqPW2IDYZQaHsFrq/dDoIjgN098NowhexhZcz3UGlvPgZXuE1jEvNygyWyxRacqDpCZt+par1FNg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0.tgz#2aec1d29cdd24c407359c930cdd89e914ee8ff86" + integrity sha512-1NTDBWkeNXgpUcyoVFxbr9hS57EpZYXpje92zv0SUzjdu3enaRwF/l3cmyRnXLtIdyJASyiS6PtybK+CgKf7jA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.0.0", "@babel/plugin-transform-modules-amd@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.1.0.tgz#f9e0a7072c12e296079b5a59f408ff5b97bf86a8" + integrity sha512-wt8P+xQ85rrnGNr2x1iV3DW32W8zrB6ctuBkYBbf5/ZzJY99Ob4MFgsZDFgczNU76iy9PWsy4EuxOliDjdKw6A== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-commonjs@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.1.0.tgz#0a9d86451cbbfb29bd15186306897c67f6f9a05c" + integrity sha512-wtNwtMjn1XGwM0AXPspQgvmE6msSJP15CX2RVfpTSTNPLhKhaOjaIfBaVfj4iUZ/VrFSodcFedwtPg/NxwQlPA== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + +"@babel/plugin-transform-modules-systemjs@^7.0.0": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.1.3.tgz#2119a3e3db612fd74a19d88652efbfe9613a5db0" + integrity sha512-PvTxgjxQAq4pvVUZF3mD5gEtVDuId8NtWkJsZLEJZMZAW3TvgQl1pmydLLN1bM8huHFVVU43lf0uvjQj9FRkKw== + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-umd@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.1.0.tgz#a29a7d85d6f28c3561c33964442257cc6a21f2a8" + integrity sha512-enrRtn5TfRhMmbRwm7F8qOj0qEYByqUvTttPEGimcBH4CJHphjyK1Vg7sdU7JjeEmgSpM890IT/efS2nMHwYig== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-new-target@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" + integrity sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.1.0.tgz#b1ae194a054b826d8d4ba7ca91486d4ada0f91bb" + integrity sha512-/O02Je1CRTSk2SSJaq0xjwQ8hG4zhZGNjE8psTsSNPXyLRCODv7/PBozqT5AmQMzp7MI3ndvMhGdqp9c96tTEw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + +"@babel/plugin-transform-parameters@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.1.0.tgz#44f492f9d618c9124026e62301c296bf606a7aed" + integrity sha512-vHV7oxkEJ8IHxTfRr3hNGzV446GAb+0hgbA7o/0Jd76s+YzccdWuTU296FOCOl/xweU4t/Ya4g41yWz80RFCRw== + dependencies: + "@babel/helper-call-delegate" "^7.1.0" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-regenerator@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz#5b41686b4ed40bef874d7ed6a84bdd849c13e0c1" + integrity sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw== + dependencies: + regenerator-transform "^0.13.3" + +"@babel/plugin-transform-shorthand-properties@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0.tgz#85f8af592dcc07647541a0350e8c95c7bf419d15" + integrity sha512-g/99LI4vm5iOf5r1Gdxq5Xmu91zvjhEG5+yZDJW268AZELAu4J1EiFLnkSG3yuUsZyOipVOVUKoGPYwfsTymhw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0.tgz#93583ce48dd8c85e53f3a46056c856e4af30b49b" + integrity sha512-L702YFy2EvirrR4shTj0g2xQp7aNwZoWNCkNu2mcoU0uyzMl0XRwDSwzB/xp6DSUFiBmEXuyAyEN16LsgVqGGQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0.tgz#30a9d64ac2ab46eec087b8530535becd90e73366" + integrity sha512-LFUToxiyS/WD+XEWpkx/XJBrUXKewSZpzX68s+yEOtIbdnsRjpryDw9U06gYc6klYEij/+KQVRnD3nz3AoKmjw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0.tgz#084f1952efe5b153ddae69eb8945f882c7a97c65" + integrity sha512-vA6rkTCabRZu7Nbl9DfLZE1imj4tzdWcg5vtdQGvj+OH9itNNB6hxuRMHuIY8SGnEt1T9g5foqs9LnrHzsqEFg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0.tgz#4dcf1e52e943e5267b7313bff347fdbe0f81cec9" + integrity sha512-1r1X5DO78WnaAIvs5uC48t41LLckxsYklJrZjNKcevyz83sF2l4RHbw29qrCPr/6ksFsdfRpT/ZgxNWHXRnffg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0.tgz#c6780e5b1863a76fe792d90eded9fcd5b51d68fc" + integrity sha512-uJBrJhBOEa3D033P95nPHu3nbFwFE9ZgXsfEitzoIXIwqAZWk7uXcg06yFKXz9FSxBH5ucgU/cYdX0IV8ldHKw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" + +"@babel/polyfill@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.0.0.tgz#c8ff65c9ec3be6a1ba10113ebd40e8750fb90bff" + integrity sha512-dnrMRkyyr74CRelJwvgnnSUDh2ge2NCTyHVwpOdvRMHtJUyxLtMAfhBN3s64pY41zdw0kgiLPh6S20eb1NcX6Q== + dependencies: + core-js "^2.5.7" + regenerator-runtime "^0.11.1" + +"@babel/preset-env@^7.0.0": + version "7.1.6" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.1.6.tgz#a0bf4b96b6bfcf6e000afc5b72b4abe7cc13ae97" + integrity sha512-YIBfpJNQMBkb6MCkjz/A9J76SNCSuGVamOVBgoUkLzpJD/z8ghHi9I42LQ4pulVX68N/MmImz6ZTixt7Azgexw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.1.0" + "@babel/plugin-proposal-json-strings" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.0.0" + "@babel/plugin-syntax-async-generators" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^7.1.0" + "@babel/plugin-transform-block-scoped-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.1.5" + "@babel/plugin-transform-classes" "^7.1.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-dotall-regex" "^7.0.0" + "@babel/plugin-transform-duplicate-keys" "^7.0.0" + "@babel/plugin-transform-exponentiation-operator" "^7.1.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.1.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-modules-amd" "^7.1.0" + "@babel/plugin-transform-modules-commonjs" "^7.1.0" + "@babel/plugin-transform-modules-systemjs" "^7.0.0" + "@babel/plugin-transform-modules-umd" "^7.1.0" + "@babel/plugin-transform-new-target" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.1.0" + "@babel/plugin-transform-parameters" "^7.1.0" + "@babel/plugin-transform-regenerator" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + "@babel/plugin-transform-typeof-symbol" "^7.0.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + browserslist "^4.1.0" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.3.0" + "@babel/template@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" @@ -62,6 +618,15 @@ babylon "7.0.0-beta.44" lodash "^4.2.0" +"@babel/template@^7.1.0", "@babel/template@^7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.2.tgz#090484a574fef5a2d2d7726a674eceda5c5b5644" + integrity sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.1.2" + "@babel/types" "^7.1.2" + "@babel/traverse@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" @@ -78,6 +643,21 @@ invariant "^2.2.0" lodash "^4.2.0" +"@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.1.6": + version "7.1.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.6.tgz#c8db9963ab4ce5b894222435482bd8ea854b7b5c" + integrity sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.1.6" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/parser" "^7.1.6" + "@babel/types" "^7.1.6" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.10" + "@babel/types@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" @@ -87,6 +667,15 @@ lodash "^4.2.0" to-fast-properties "^2.0.0" +"@babel/types@^7.0.0", "@babel/types@^7.1.2", "@babel/types@^7.1.5", "@babel/types@^7.1.6": + version "7.1.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.6.tgz#0adb330c3a281348a190263aceb540e10f04bcce" + integrity sha512-DMiUzlY9DSjVsOylJssxLHSgj6tWM9PRFJOGW/RaOglVOK9nzTxoOMfTfRQXGUCUQ/HmlG2efwC+XqUEJ5ay4w== + dependencies: + esutils "^2.0.2" + lodash "^4.17.10" + to-fast-properties "^2.0.0" + "@ember/ordered-set@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@ember/ordered-set/-/ordered-set-2.0.0.tgz#54f34aba3a1fb75b7c2912a39ab41a4a2e9d266d" @@ -109,12 +698,12 @@ resolved "https://registry.yarnpkg.com/@glimmer/di/-/di-0.2.0.tgz#73bfd4a6ee4148a80bf092e8a5d29bcac9d4ce7e" integrity sha1-c7/Upu5BSKgL8JLopdKbysnUzn4= -"@glimmer/interfaces@^0.30.5": - version "0.30.5" - resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.30.5.tgz#9fd391ff4b9e4b29cf56495a2c3f5f660e45497a" - integrity sha512-jdpGwuWydGMIdDkVpuwhJhH2LWBQpAnau+8u53esLw03W8XJlgLIC6nuugSHvlJzw7M5msVuBP9vbKi+NceqIg== +"@glimmer/interfaces@^0.36.5": + version "0.36.5" + resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.36.5.tgz#b9ef4a6756745dc41927ab01d6c23cdf7ece4158" + integrity sha512-IhoGEP0Awe9bTOMcLF9dUgEV3xguI6m2vFer7SHYX1vuugthA6NEJb83hqUe9FqOd1cNxJE8nAsX0JInx8gn+A== dependencies: - "@glimmer/wire-format" "^0.30.5" + "@glimmer/wire-format" "^0.36.5" "@glimmer/resolver@^0.4.1": version "0.4.2" @@ -123,27 +712,27 @@ dependencies: "@glimmer/di" "^0.2.0" -"@glimmer/syntax@^0.30.5": - version "0.30.5" - resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.30.5.tgz#763a631fccdb5ee2468269becd215752fc2361cc" - integrity sha512-AVaYO8AfsbZ7UVwtyaIaSoCMcRtM94O+98JrP8abcVnNhbnDYunKiptMAQOMsSCJMO7wEbKCeVHDsRVbcKG7fQ== +"@glimmer/syntax@^0.36.4": + version "0.36.5" + resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.36.5.tgz#603099a0bf2019dc497e3b858eb6fc84abda805a" + integrity sha512-62BcnXtej4oBEMYSCBezSCOvlZ+1gLAJ/zVXwDgTmin56wKUL2bChScw332OeIL+brvcExAlwZ/hB1UoldMgwQ== dependencies: - "@glimmer/interfaces" "^0.30.5" - "@glimmer/util" "^0.30.5" + "@glimmer/interfaces" "^0.36.5" + "@glimmer/util" "^0.36.5" handlebars "^4.0.6" - simple-html-tokenizer "^0.4.1" + simple-html-tokenizer "^0.5.6" -"@glimmer/util@^0.30.5": - version "0.30.5" - resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.30.5.tgz#97f3dcd4029f713c503371e1608e129a833a70e1" - integrity sha512-hknvHrof+tq7Gj4C4Xbs/GBuqbf68d5hRfqyHk6zBWMYBiCyr5dRS48/kPiNEdclm3eZGbbl1L+eoj0ioz9GiA== +"@glimmer/util@^0.36.5": + version "0.36.5" + resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.36.5.tgz#829f393ef0bf791df5b287f104f0fd76e456182c" + integrity sha512-RcDsxxuKGnIc6Ro6wZGFMUZ/E8L3Rbcd5E5F2WOSa59RYHel146fhQtctGrpGxQUZwfxMEMs91GJIaKeukd84g== -"@glimmer/wire-format@^0.30.5": - version "0.30.5" - resolved "https://registry.yarnpkg.com/@glimmer/wire-format/-/wire-format-0.30.5.tgz#17d79a320b931950ac03887733e56ecc7bbd0a06" - integrity sha512-bnMQtgla2ae0sx4DAvK57qPwCuJ71bWpM0hBY42BSgs1KTW08IHBNeGhWX2ClK3lUP+XhabWGyQ9xi/diQ06tQ== +"@glimmer/wire-format@^0.36.5": + version "0.36.5" + resolved "https://registry.yarnpkg.com/@glimmer/wire-format/-/wire-format-0.36.5.tgz#6713c95fbdc23c2e4dcc946e16452ded5cc17447" + integrity sha512-wt+H4iNsGPkW/b/POP21DmTM4cYYYcDmaI54RkEgtMRoeBP6hyi7Y4awbRPMWal6QKIxFepMUY4vnbq345m00w== dependencies: - "@glimmer/util" "^0.30.5" + "@glimmer/util" "^0.36.5" "@types/acorn@^4.0.3": version "4.0.3" @@ -167,6 +756,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.28.tgz#198927ce0786106ec2a7c8652d46d5f8b87bfc5f" integrity sha512-LMSOxMKNJ8tGqUVs8lSIT8RGo1XGWYada/ZU2QZcbcD6AW9futXDE99tfQA0K6DK60GXcwplsGGK5KABRmI5GA== +"@xg-wang/whatwg-fetch@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@xg-wang/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#f7b222c012a238e7d6e89ed3d72a1e0edb58453d" + integrity sha512-ULtqA6L75RLzTNW68IiOja0XYv4Ebc3OGMzfia1xxSEMpD0mk/pMvkQX0vbCFyQmKc5xGp80Ms2WiSlXLh8hbA== + abab@^1.0.0, abab@^1.0.3, abab@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" @@ -732,7 +1326,7 @@ babel-core@^6.14.0, babel-core@^6.26.0: slash "^1.0.0" source-map "^0.5.6" -babel-core@^6.24.1: +babel-core@^6.24.1, babel-core@^6.26.3: version "6.26.3" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== @@ -979,6 +1573,17 @@ babel-plugin-htmlbars-inline-precompile@^0.2.5: resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.2.6.tgz#c00b8a3f4b32ca04bf0f0d5169fcef3b5a66d69d" integrity sha512-H4H75TKGUFij8ukwEYWEERAgrUf16R8NSK1uDPe3QwxT8mnE1K8+/s6DVjUqbM5Pv6lSIcE4XufXdlSX+DTB6g== +babel-plugin-module-resolver@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.1.1.tgz#881cf67e3d4b8400d5eaaefc1be44d2dc1fe404f" + integrity sha512-1Q77Al4ydp6nYApJ7sQ2fmgz30WuQgJZegIYuyOdbdpxenB/bSezQ3hDPsumIXGlUS4vUIv+EwFjzzXZNWtARw== + dependencies: + find-babel-config "^1.1.0" + glob "^7.1.2" + pkg-up "^2.0.0" + reselect "^3.0.1" + resolve "^1.4.0" + babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" @@ -989,6 +1594,11 @@ babel-plugin-syntax-exponentiation-operator@^6.8.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= + babel-plugin-syntax-trailing-function-commas@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" @@ -1202,6 +1812,14 @@ babel-plugin-transform-exponentiation-operator@^6.22.0: babel-plugin-syntax-exponentiation-operator "^6.8.0" babel-runtime "^6.22.0" +babel-plugin-transform-object-rest-spread@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + babel-plugin-transform-regenerator@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" @@ -1558,14 +2176,6 @@ bower-endpoint-parser@0.2.2: resolved "https://registry.yarnpkg.com/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz#00b565adbfab6f2d35addde977e97962acbcb3f6" integrity sha1-ALVlrb+rby01rd3pd+l5Yqy8s/Y= -brace-expansion@^1.0.0: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - brace-expansion@^1.1.7: version "1.1.8" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" @@ -1675,6 +2285,22 @@ broccoli-babel-transpiler@^6.4.5, broccoli-babel-transpiler@^6.5.0: rsvp "^4.8.2" workerpool "^2.3.0" +broccoli-babel-transpiler@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.1.0.tgz#82881100f402419deacf24fc977083993f89a109" + integrity sha512-pXB5CZXHKcfwvQwqPYzNVcHLUgPYhgz7929NxTSGMlwYmQ3tU+cl/ZxrEvTRVZLJ+WcMKcbzo9SvpoRV9PTumA== + dependencies: + "@babel/core" "^7.0.0" + broccoli-funnel "^2.0.1" + broccoli-merge-trees "^3.0.0" + broccoli-persistent-filter "^1.4.3" + clone "^2.1.2" + hash-for-dep "^1.2.3" + heimdalljs-logger "^0.1.9" + json-stable-stringify "^1.0.1" + rsvp "^4.8.3" + workerpool "^2.3.1" + broccoli-bridge@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/broccoli-bridge/-/broccoli-bridge-1.0.0.tgz#6223fd64b62062c31333539f0f3c42d0acd92fb1" @@ -1814,20 +2440,6 @@ broccoli-file-creator@^2.1.1: broccoli-plugin "^1.1.0" mkdirp "^0.5.1" -broccoli-filter@^0.1.11: - version "0.1.14" - resolved "https://registry.yarnpkg.com/broccoli-filter/-/broccoli-filter-0.1.14.tgz#23cae3891ff9ebb7b4d7db00c6dcf03535daf7ad" - integrity sha1-I8rjiR/567e019sAxtzwNTXa960= - dependencies: - broccoli-kitchen-sink-helpers "^0.2.6" - broccoli-writer "^0.1.1" - mkdirp "^0.3.5" - promise-map-series "^0.2.1" - quick-temp "^0.1.2" - rsvp "^3.0.16" - symlink-or-copy "^1.0.1" - walk-sync "^0.1.3" - broccoli-filter@^1.2.2, broccoli-filter@^1.2.3: version "1.2.4" resolved "https://registry.yarnpkg.com/broccoli-filter/-/broccoli-filter-1.2.4.tgz#409afb94b9a3a6da9fac8134e91e205f40cc7330" @@ -1910,7 +2522,7 @@ broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-kitchen-sink-helpers@^0.2.0, broccoli-kitchen-sink-helpers@^0.2.5, broccoli-kitchen-sink-helpers@^0.2.6, broccoli-kitchen-sink-helpers@~0.2.0: +broccoli-kitchen-sink-helpers@^0.2.0, broccoli-kitchen-sink-helpers@^0.2.5, broccoli-kitchen-sink-helpers@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz#a5e0986ed8d76fb5984b68c3f0450d3a96e36ecc" integrity sha1-peCYbtjXb7WYS2jD8EUNOpbjbsw= @@ -2001,6 +2613,25 @@ broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-p symlink-or-copy "^1.0.1" walk-sync "^0.3.1" +broccoli-persistent-filter@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.1.1.tgz#7bb2b1015baedf5cf58b5b2608495f3d78f81b12" + integrity sha512-2VCbLJqMg/AWJ6WTmv83X13a6DD3BS7Gngc932jrg1snVqsB8LJDyJh+Hd9v1tQ/vMA+4vbWgwk4tDmI/tAZWg== + dependencies: + async-disk-cache "^1.2.1" + async-promise-queue "^1.0.3" + broccoli-plugin "^1.0.0" + fs-tree-diff "^0.5.2" + hash-for-dep "^1.0.2" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + mkdirp "^0.5.1" + promise-map-series "^0.2.1" + rimraf "^2.6.1" + rsvp "^4.7.0" + symlink-or-copy "^1.0.1" + walk-sync "^0.3.1" + broccoli-plugin@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.1.0.tgz#73e2cfa05f8ea1e3fc1420c40c3d9e7dc724bf02" @@ -2021,6 +2652,16 @@ broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli rimraf "^2.3.4" symlink-or-copy "^1.1.8" +broccoli-plugin@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.1.tgz#a26315732fb99ed2d9fb58f12a1e14e986b4fabd" + integrity sha512-DW8XASZkmorp+q7J4EeDEZz+LoyKLAd2XZULXyD9l4m9/hAKV3vjHmB1kiUshcWAYMgTP1m2i4NnqCE/23h6AQ== + dependencies: + promise-map-series "^0.2.1" + quick-temp "^0.1.3" + rimraf "^2.3.4" + symlink-or-copy "^1.1.8" + broccoli-replace@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/broccoli-replace/-/broccoli-replace-0.12.0.tgz#36460a984c45c61731638c53068b0ab12ea8fdb7" @@ -2197,14 +2838,16 @@ broccoli-symbolizer@^0.6.0: json-stable-stringify "^1.0.1" lodash "^4.17.10" -broccoli-templater@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/broccoli-templater/-/broccoli-templater-1.0.0.tgz#7c054aacf596d1868d1a44291f9ec7b907d30ecf" - integrity sha1-fAVKrPWW0YaNGkQpH57HuQfTDs8= +broccoli-templater@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/broccoli-templater/-/broccoli-templater-2.0.2.tgz#285a892071c0b3ad5ebc275d9e8b3465e2d120d6" + integrity sha512-71KpNkc7WmbEokTQpGcbGzZjUIY1NSVa3GB++KFKAfx5SZPUozCOsBlSTwxcv8TLoCAqbBnsX5AQPgg6vJ2l9g== dependencies: - broccoli-filter "^0.1.11" - broccoli-stew "^1.2.0" - lodash.template "^3.3.2" + broccoli-plugin "^1.3.1" + fs-tree-diff "^0.5.9" + lodash.template "^4.4.0" + rimraf "^2.6.2" + walk-sync "^0.3.3" broccoli-test-helper@^1.3.0: version "1.3.0" @@ -2295,6 +2938,15 @@ browserslist@^3.2.6: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" +browserslist@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.3.4.tgz#4477b737db6a1b07077275b24791e680d4300425" + integrity sha512-u5iz+ijIMUlmV8blX82VGFrB9ecnUg5qEt55CMZ/YJEhha+d8qpBfOFuutJ6F/VKRXjZoD33b6uvarpPxcl3RA== + dependencies: + caniuse-lite "^1.0.30000899" + electron-to-chromium "^1.3.82" + node-releases "^1.0.1" + bser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" @@ -2444,6 +3096,11 @@ caniuse-lite@^1.0.30000844: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25" integrity sha512-vs79o1mOSKRGv/1pSkp4EXgl4ZviWeYReXw60XfacPU64uQWZwJT6vZNmxRF9O+6zu71sJwMxLK5JXxbzuVrLw== +caniuse-lite@^1.0.30000899: + version "1.0.30000910" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000910.tgz#755d5181d4b006e5a2b59b1ffa05d0a0470039f5" + integrity sha512-u/nxtHGAzCGZzIxt3dA/tpSPOcirBZFWKwz1EPz4aaupnBI2XR0Rbr74g0zc6Hzy41OEM4uMoZ38k56TpYAWjQ== + capture-exit@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" @@ -2741,6 +3398,15 @@ clipboard@^1.7.1: select "^1.1.2" tiny-emitter "^2.0.0" +clipboard@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.4.tgz#836dafd66cf0fea5d71ce5d5b0bf6e958009112d" + integrity sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ== + dependencies: + good-listener "^1.2.2" + select "^1.1.2" + tiny-emitter "^2.0.0" + cliui@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" @@ -2774,6 +3440,11 @@ clone@^2.0.0: resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" integrity sha1-0hfR6WERjjrJpLi7oyhVU79kfNs= +clone@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -3033,6 +3704,13 @@ continuable-cache@^0.3.1: resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f" integrity sha1-vXJ6f67XfnH/OYWskzUakSczrQ8= +convert-source-map@^1.1.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" + convert-source-map@^1.5.0, convert-source-map@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" @@ -3063,6 +3741,11 @@ core-js@^2.4.0, core-js@^2.5.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" integrity sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4= +core-js@^2.5.7: + version "2.5.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" + integrity sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw== + core-object@2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/core-object/-/core-object-2.0.6.tgz#60134b9c40ff69b27bc15e82db945e4df782961b" @@ -3121,6 +3804,17 @@ cross-spawn@^5.0.1, cross-spawn@^5.1.0: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + crypt@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" @@ -3301,6 +3995,13 @@ debug@^3.0.0, debug@^3.1.0: dependencies: ms "2.0.0" +debug@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" + integrity sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg== + dependencies: + ms "^2.1.1" + decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -3555,6 +4256,11 @@ electron-to-chromium@^1.3.47: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0" integrity sha1-0tnxJwuko7lnuDHEDvcftNmrXOA= +electron-to-chromium@^1.3.82: + version "1.3.84" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.84.tgz#2e55df59e818f150a9f61b53471ebf4f0feecc65" + integrity sha512-IYhbzJYOopiTaNWMBp7RjbecUBsbnbDneOP86f3qvS0G0xfzwNSvMJpTrvi5/Y1gU7tg2NAgeg8a8rCYvW9Whw== + ember-ajax@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-3.0.0.tgz#8f21e9da0c1d433cf879aa855fce464d517e9ab5" @@ -3569,6 +4275,14 @@ ember-app-scheduler@^1.0.1: dependencies: ember-cli-babel "^6.3.0" +ember-assign-polyfill@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/ember-assign-polyfill/-/ember-assign-polyfill-2.5.0.tgz#0dc7079addbdbad7984ba3f35d970cf07a73f704" + integrity sha512-oRGPg/jeo4SAIJX56PYUDcVcjcfkuZe6j9umkuSkjwuduMBQNtmyoC8qhcCBrn+qqrtAG6g3iSAdEu8DkUBIiQ== + dependencies: + ember-cli-babel "^6.6.0" + ember-cli-version-checker "^2.0.0" + ember-cli-addon-docs-esdoc@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ember-cli-addon-docs-esdoc/-/ember-cli-addon-docs-esdoc-0.2.1.tgz#fcb2f1792f1bd4d6a5df8205f7b6e555abbcd1b9" @@ -3585,63 +4299,64 @@ ember-cli-addon-docs-esdoc@^0.2.1: tmp "^0.0.33" walk-sync "^0.3.2" -ember-cli-addon-docs@ember-learn/ember-cli-addon-docs#6b11d814f2ed39b0670a49f324d385c2dfad9a99: - version "0.5.3" - resolved "https://codeload.github.com/ember-learn/ember-cli-addon-docs/tar.gz/6b11d814f2ed39b0670a49f324d385c2dfad9a99" +ember-cli-addon-docs@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.1.tgz#940e7ba6318cb60b9c6e783eb93ba52ee25d59ce" + integrity sha512-qaeLJM06RFaVFFQZUZOkQ9ezOMCMf27tu5gvphLjrQgLux4E0BfJsbSB+0hrx2YIbzaTirTtzXxVIJayakVNKQ== dependencies: - "@glimmer/syntax" "^0.30.5" + "@glimmer/syntax" "^0.36.4" broccoli-bridge "^1.0.0" broccoli-caching-writer "^3.0.3" broccoli-debug "^0.6.4" broccoli-filter "^1.2.4" broccoli-funnel "^2.0.1" - broccoli-merge-trees "^2.0.0" - broccoli-persistent-filter "^1.4.3" - broccoli-plugin "^1.3.0" + broccoli-merge-trees "^3.0.1" + broccoli-persistent-filter "^2.0.0" + broccoli-plugin "^1.3.1" broccoli-source "^1.1.0" - broccoli-stew "^1.5.0" + broccoli-stew "^2.0.0" ember-cli-autoprefixer "^0.8.1" - ember-cli-babel "^6.11.0" - ember-cli-clipboard "^0.8.1" - ember-cli-htmlbars "^2.0.3" - ember-cli-htmlbars-inline-precompile "^1.0.2" + ember-cli-babel "^6.16.0" + ember-cli-clipboard "^0.10.0" + ember-cli-htmlbars "^3.0.0" + ember-cli-htmlbars-inline-precompile "^1.0.3" ember-cli-sass "7.1.7" - ember-cli-string-helpers "^1.7.0" + ember-cli-string-helpers "^1.9.0" ember-cli-tailwind "^0.6.2" - ember-code-snippet "^2.2.0" + ember-code-snippet "^2.3.1" ember-component-css "0.6.5" - ember-concurrency "^0.8.16" + ember-concurrency "^0.8.21" ember-data "2.x - 3.x" - ember-fetch "^4.0.2" - ember-fetch-adapter "^0.4.2" + ember-fetch "^5.1.3" + ember-fetch-adapter "^0.4.3" ember-href-to "^1.15.1" - ember-keyboard "^3.0.0" + ember-keyboard "^4.0.0" ember-modal-dialog "2.4.3" ember-responsive "^3.0.0-beta.1" - ember-router-scroll "^0.7.1" - ember-svg-jar "^1.2.1" + ember-router-scroll "^1.0.0" + ember-svg-jar "^1.2.2" ember-tether "^1.0.0-beta.2" - ember-truth-helpers "^2.0.0" - execa "^0.9.0" - fs-extra "^5.0.0" - git-repo-info "^1.4.1" + ember-truth-helpers "^2.1.0" + execa "^1.0.0" + fs-extra "^7.0.0" + git-repo-info "^2.0.0" highlightjs "^9.10.0" - hosted-git-info "^2.5.0" + hosted-git-info "^2.7.1" html-entities "^1.2.1" inflected "^2.0.3" - jsdom "^11.11.0" - json-api-serializer "^1.11.0" - liquid-fire "^0.29.1" - lodash "^4.17.5" - lunr "^2.1.5" + jsdom "^11.12.0" + json-api-serializer "^1.13.0" + liquid-fire "^0.29.5" + lodash "^4.17.11" + lunr "^2.3.3" marked "^0.5.0" - parse-git-config "^1.1.1" + parse-git-config "^2.0.3" quick-temp "^0.1.8" - resolve "^1.5.0" - sass "^1.13.2" - semver "^5.5.0" + resolve "^1.8.1" + sass "^1.14.1" + semver "^5.5.1" striptags "^3.1.1" - walk-sync "^0.3.2" + walk-sync "^0.3.3" yuidocjs "^0.10.2" ember-cli-addon-tests@^0.7.0: @@ -3736,6 +4451,28 @@ ember-cli-babel@^6.16.0: ember-cli-version-checker "^2.1.2" semver "^5.5.0" +ember-cli-babel@^7.1.0: + version "7.1.3" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.1.3.tgz#a2a7374adb525369a3a205cedd54d8e0c3de3309" + integrity sha512-wkftzRiPiLTKAhBKphsJEH8gmJIspq04f03DUvoS2/bqrssF04hhQVRquF4EF0ZiNxKI8f4ka/puVOGeBuRWDg== + dependencies: + "@babel/core" "^7.0.0" + "@babel/plugin-transform-modules-amd" "^7.0.0" + "@babel/polyfill" "^7.0.0" + "@babel/preset-env" "^7.0.0" + amd-name-resolver "1.2.0" + babel-plugin-debug-macros "^0.2.0-beta.6" + babel-plugin-ember-modules-api-polyfill "^2.5.0" + babel-plugin-module-resolver "^3.1.1" + broccoli-babel-transpiler "^7.1.0" + broccoli-debug "^0.6.4" + broccoli-funnel "^2.0.1" + broccoli-source "^1.1.0" + clone "^2.1.2" + ember-cli-version-checker "^2.1.2" + ensure-posix-path "^1.0.2" + semver "^5.5.0" + ember-cli-broccoli-sane-watcher@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.0.4.tgz#f43f42f75b7509c212fb926cd9aea86ae19264c6" @@ -3747,6 +4484,17 @@ ember-cli-broccoli-sane-watcher@^2.0.4: rsvp "^3.0.18" sane "^1.1.1" +ember-cli-clipboard@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/ember-cli-clipboard/-/ember-cli-clipboard-0.10.0.tgz#7d194a68faa38a0d6fdf75a81249d0265e0aa56e" + integrity sha512-IPaBd6ChPu+DdYWDW7/+eR9vUZEJkLiY9R+JZnDheaiNZKD7vXeO1I9t5TT09U30Tjxo2QNyM0TXitlPvgZP5Q== + dependencies: + broccoli-funnel "^1.1.0" + clipboard "^2.0.0" + ember-cli-babel "^6.8.0" + ember-cli-htmlbars "^2.0.2" + fastboot-transform "0.1.1" + ember-cli-clipboard@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/ember-cli-clipboard/-/ember-cli-clipboard-0.8.1.tgz#59f8eb6ba471a7668dff592fcebb7b06014240dd" @@ -3888,10 +4636,10 @@ ember-cli-htmlbars-inline-precompile@^1.0.0: heimdalljs-logger "^0.1.7" silent-error "^1.1.0" -ember-cli-htmlbars-inline-precompile@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-1.0.3.tgz#332ff96c06fc522965162f1090d78a615379c3c2" - integrity sha1-My/5bAb8UillFi8QkNeKYVN5w8I= +ember-cli-htmlbars-inline-precompile@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-1.0.5.tgz#312e050c9e3dd301c55fb399fd706296cd0b1d6a" + integrity sha512-/CNEqPxroIcbY6qejrt704ZaghHLCntZKYLizFfJ2esirXoJx6fuYKBY1YyJ8GOgjfbHHKjBZuK4vFFJpkGqkQ== dependencies: babel-plugin-htmlbars-inline-precompile "^0.2.5" ember-cli-version-checker "^2.1.2" @@ -3909,7 +4657,7 @@ ember-cli-htmlbars@^2.0.1: json-stable-stringify "^1.0.0" strip-bom "^3.0.0" -ember-cli-htmlbars@^2.0.2, ember-cli-htmlbars@^2.0.3: +ember-cli-htmlbars@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.4.tgz#0bcda483f14271663c38756e1fd1cb89da6a50cf" integrity sha512-WSGODKKG65M/Q7QcLflmxnJKMA32JqFLyX0a5ghMRDWRqvUVkKWSZDbjJsNsCw/OCeBbPWQLQWq0wtpCnTTjwA== @@ -3919,6 +4667,16 @@ ember-cli-htmlbars@^2.0.2, ember-cli-htmlbars@^2.0.3: json-stable-stringify "^1.0.0" strip-bom "^3.0.0" +ember-cli-htmlbars@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-3.0.1.tgz#01e21f0fd05e0a6489154f26614b1041769e3e58" + integrity sha512-pyyB2s52vKTXDC5svU3IjU7GRLg2+5O81o9Ui0ZSiBS14US/bZl46H2dwcdSJAK+T+Za36ZkQM9eh1rNwOxfoA== + dependencies: + broccoli-persistent-filter "^1.4.3" + hash-for-dep "^1.2.3" + json-stable-stringify "^1.0.0" + strip-bom "^3.0.0" + ember-cli-inject-live-reload@^1.4.1: version "1.7.0" resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-1.7.0.tgz#af94336e015336127dfb98080ad442bb233e37ed" @@ -4063,10 +4821,10 @@ ember-cli-sri@^2.1.0: dependencies: broccoli-sri-hash "^2.1.0" -ember-cli-string-helpers@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/ember-cli-string-helpers/-/ember-cli-string-helpers-1.9.0.tgz#2c1605bc5768ff58cecd2fa1bd0d13d81e47f3d3" - integrity sha1-LBYFvFdo/1jOzS+hvQ0T2B5H89M= +ember-cli-string-helpers@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/ember-cli-string-helpers/-/ember-cli-string-helpers-1.10.0.tgz#6ee6c18d15759acb0905aa0153fe9e031a382fa4" + integrity sha512-z2eNT7BsTNSxp3qNrv7KAxjPwdLC1kIYCck9CERg0RM5vBGy2vK6ozZE3U6nWrtth1xO4PrYkgISwhSgN8NMeg== dependencies: broccoli-funnel "^1.0.1" ember-cli-babel "^6.6.0" @@ -4241,17 +4999,17 @@ ember-cli@~2.18.2: walk-sync "^0.3.0" yam "0.0.22" -ember-code-snippet@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/ember-code-snippet/-/ember-code-snippet-2.2.2.tgz#2327e105c9101cb02437873c70297bcb365e474a" - integrity sha512-FYp7kfZCVOSEMjW2VvNh9DO9yQDw2kg/mxVMjyZBRTwyg4mhrS5vQFa2+Xoy1fko1L4DRcQoNCTa4OnshExwaA== +ember-code-snippet@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/ember-code-snippet/-/ember-code-snippet-2.3.1.tgz#dd4b05d6fe9595c6cab532b70d70f9a442962046" + integrity sha512-vx6Oia5+fEw4kh0Jl6H3RPIJ9PFfAIHEjVza6FfEwZNdWlsXQbu+jff7KGBTw5oqEeXpXPd9L8Jbk0TgZw5f6w== dependencies: broccoli-flatiron "^0.1.3" broccoli-merge-trees "^1.0.0" broccoli-static-compiler "^0.1.4" broccoli-writer "^0.1.1" es6-promise "^1.0.0" - glob "^4.0.4" + glob "^7.1.3" ember-compatibility-helpers@^1.0.0: version "1.0.2" @@ -4292,10 +5050,10 @@ ember-composable-helpers@^2.1.0: broccoli-funnel "^1.0.1" ember-cli-babel "^6.6.0" -ember-concurrency@^0.8.16: - version "0.8.19" - resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-0.8.19.tgz#71b9c175ba077865310029cb4bdb880e17d5155e" - integrity sha1-cbnBdboHeGUxACnLS9uIDhfVFV4= +ember-concurrency@^0.8.21: + version "0.8.22" + resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-0.8.22.tgz#900e870aae486e1f5fcb168bbb4efba02561a5ad" + integrity sha512-njLqyjMxBf8fapIV8WPyG2gFbSCIQgMpk33uSs5Ih7HsfFAz60KwVo9sMVPBYAJwQmF8jFPm7Ph+mjkiQXHmmA== dependencies: babel-core "^6.24.1" ember-cli-babel "^6.8.2" @@ -4406,26 +5164,30 @@ ember-fastboot-addon-tests@^0.4.0: request "^2.74.0" rsvp "^3.3.1" -ember-fetch-adapter@^0.4.2: +ember-fetch-adapter@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/ember-fetch-adapter/-/ember-fetch-adapter-0.4.3.tgz#c3d2da83ff87f829ab347b841a3201b3cc7e1eb4" integrity sha1-w9Lag/+H+CmrNHuEGjIBs8x+HrQ= dependencies: ember-cli-babel "^6.12.0" -ember-fetch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-4.0.2.tgz#865ca90d8aa63b9ebe5bce709aeaa44b35668b5a" - integrity sha512-kP7OWvd3uEnfnSXZCrKEstheQrleIbqqbrpjCzDU/I4uvuVVnJJUqZRz6triDABqQPwPkHwRjZpZqsuDsKKRNw== +ember-fetch@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-5.1.3.tgz#f649c60d523bf1949125a4c497751df3b0c9f587" + integrity sha512-eQX54LpaQCS7IDuASNxArTVwkXIuwL9W4UZOLPyfEQJfmXd4IEx3mqoVlydBJJp2kjpuUZ1Wbd1XKC96ggY5gw== dependencies: + "@xg-wang/whatwg-fetch" "^3.0.0" abortcontroller-polyfill "^1.1.9" + babel-core "^6.26.3" + babel-preset-env "^1.7.0" broccoli-concat "^3.2.2" - broccoli-merge-trees "^2.0.0" - broccoli-stew "^1.4.2" - broccoli-templater "^1.0.0" + broccoli-merge-trees "^3.0.0" + broccoli-rollup "^2.1.1" + broccoli-stew "^2.0.0" + broccoli-templater "^2.0.1" ember-cli-babel "^6.8.2" node-fetch "^2.0.0-alpha.9" - yetch "^0.0.1" + rollup-plugin-babel "^3.0.7" ember-get-config@^0.2.2: version "0.2.4" @@ -4480,11 +5242,12 @@ ember-inflector@^3.0.0: dependencies: ember-cli-babel "^6.6.0" -ember-keyboard@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/ember-keyboard/-/ember-keyboard-3.0.2.tgz#839ab5c32a6b3d3ce0b735728c1e1bc362107464" - integrity sha512-6P+icQPlSxKsR0jxfuCTFKMX55Ekh7EwYl39bTpaiPFYtrhlDLjPp+ibS0oYuas9l1V+fTOXH3OV7e0/grGSZQ== +ember-keyboard@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ember-keyboard/-/ember-keyboard-4.0.0.tgz#63764ebf0fac8153977b04faa73ef1c11820800c" + integrity sha512-445XJXehcxzB/bPFWNhA0OO/m6pQ3sfipCGcjMGSU3erpOZSfM4kZ7uRFEUIf0Pz0tyHRQ9BoLq5RY7VBEXUWw== dependencies: + babel-plugin-transform-object-rest-spread "^6.26.0" ember-cli-babel "^6.6.0" ember-load-initializers@^1.0.0: @@ -4582,13 +5345,13 @@ ember-router-generator@^1.0.0, ember-router-generator@^1.2.2, ember-router-gener dependencies: recast "^0.11.3" -ember-router-scroll@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/ember-router-scroll/-/ember-router-scroll-0.7.1.tgz#0fc4b9be116ef97ce974938104cc766f4e56a127" - integrity sha1-D8S5vhFu+XzpdJOBBMx2b05WoSc= +ember-router-scroll@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ember-router-scroll/-/ember-router-scroll-1.0.1.tgz#07f57aae10a009d170928b9e62b85edd92c81e4e" + integrity sha512-bEQF9WTXwVkaGpAz6f+8nQOKvG2HH2if11ZoKpaDRVxQF5K+y6Pa/c7Y8TNZAELk3NJVFizH7m0OeNAY91DKFA== dependencies: ember-app-scheduler "^1.0.1" - ember-cli-babel "^6.6.0" + ember-cli-babel "^7.1.0" ember-getowner-polyfill "^2.0.1" ember-router-service-polyfill@^1.0.2: @@ -4626,10 +5389,10 @@ ember-source@~2.18.0: jquery "^3.2.1" resolve "^1.3.3" -ember-svg-jar@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ember-svg-jar/-/ember-svg-jar-1.2.1.tgz#a6f2c2404eec72aaa819b66407cec0ebe72be99b" - integrity sha512-gGYUBwTRav/6ygcPCjJu8MIVguMSO6w5prpcoEfG+20+JyMQqritTWpwZTkRb5gov6bgOoJBUzpNEKZGm9glXA== +ember-svg-jar@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ember-svg-jar/-/ember-svg-jar-1.2.2.tgz#065d9a462353dbf3b1b4f57fb653859bfbe52022" + integrity sha512-vIB/SyLdsp1PLuz0oPd56CD9U4yUYWv0ghhMlemVM8wwshgopztE0tDFjoIEZjhbZ7kNkLLUt69qMvyMjx5NPg== dependencies: broccoli-caching-writer "^3.0.3" broccoli-funnel "^2.0.1" @@ -4638,8 +5401,8 @@ ember-svg-jar@^1.2.1: broccoli-svg-optimizer "1.1.0" broccoli-symbolizer "^0.6.0" cheerio "^0.22.0" + ember-assign-polyfill "^2.5.0" ember-cli-babel "^6.6.0" - ember-copy "^1.0.0" lodash "^4.13.1" mkdirp "^0.5.1" path-posix "^1.0.0" @@ -4653,7 +5416,7 @@ ember-tether@^1.0.0-beta.2: ember-cli-node-assets "^0.2.2" tether "^1.4.0" -ember-truth-helpers@^2.0.0: +ember-truth-helpers@^2.0.0, ember-truth-helpers@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-truth-helpers/-/ember-truth-helpers-2.1.0.tgz#d4dab4eee7945aa2388126485977baeb33ca0798" integrity sha512-BQlU8aTNl1XHKTYZ243r66yqtR9JU7XKWQcmMA+vkqfkE/c9WWQ9hQZM8YABihCmbyxzzZsngvldokmeX5GhAw== @@ -4708,6 +5471,13 @@ encoding@^0.1.11: dependencies: iconv-lite "~0.4.13" +end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + dependencies: + once "^1.4.0" + engine.io-client@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.0.tgz#7b730e4127414087596d9be3c88d2bc5fdb6cf5c" @@ -4985,6 +5755,11 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= +estree-walker@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e" + integrity sha1-va/oCVOD2EFNXcLs9MkXO225QS4= + estree-walker@^0.5.0, estree-walker@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.2.tgz#d3850be7529c9580d815600b53126515e146dd39" @@ -5065,6 +5840,19 @@ execa@^0.9.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + exif-parser@^0.1.9: version "0.1.12" resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922" @@ -5499,6 +6287,14 @@ finalhandler@1.1.1: statuses "~1.4.0" unpipe "~1.0.0" +find-babel-config@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.1.0.tgz#acc01043a6749fec34429be6b64f542ebb5d6355" + integrity sha1-rMAQQ6Z0n+w0Qpvmtk9ULrtdY1U= + dependencies: + json5 "^0.5.1" + path-exists "^3.0.0" + find-index@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-index/-/find-index-1.1.0.tgz#53007c79cd30040d6816d79458e8837d5c5705ef" @@ -5794,6 +6590,16 @@ fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5 path-posix "^1.0.0" symlink-or-copy "^1.1.8" +fs-tree-diff@^0.5.9: + version "0.5.9" + resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.9.tgz#a4ec6182c2f5bd80b9b83c8e23e4522e6f5fd946" + integrity sha512-872G8ax0kHh01m9n/2KDzgYwouKza0Ad9iFltBpNykvROvf2AGtoOzPJgGx125aolGPER3JuC7uZFrQ7bG1AZw== + dependencies: + heimdalljs-logger "^0.1.7" + object-assign "^4.1.0" + path-posix "^1.0.0" + symlink-or-copy "^1.1.8" + fs-updater@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/fs-updater/-/fs-updater-1.0.4.tgz#2329980f99ae9176e9a0e84f7637538a182ce63b" @@ -5909,6 +6715,13 @@ get-stream@^3.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -5994,16 +6807,6 @@ glob@7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^4.0.4: - version "4.5.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" - integrity sha1-xstz0yJsHv7wTePFbQEvAzd+4V8= - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "^2.0.1" - once "^1.3.0" - glob@^5.0.10: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" @@ -6038,6 +6841,18 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.4, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, gl once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + global-modules@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" @@ -6435,6 +7250,11 @@ hosted-git-info@^2.1.4, hosted-git-info@^2.5.0: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" integrity sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg== +hosted-git-info@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== + html-encoding-sniffer@^1.0.1, html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" @@ -6617,7 +7437,7 @@ inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, i resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.4, ini@~1.3.0: +ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== @@ -7104,6 +7924,11 @@ js-base64@^2.1.8, js-base64@^2.1.9: resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.8.tgz#57a9b130888f956834aa40c5b165ba59c758f033" integrity sha512-hm2nYpDrwoO/OzBhdcqs/XGT6XjSuSSCVEpia+Kl2J6x4CYt5hISlVL/AYU1khoDXv0AQVgxtdJySb9gjAn56Q== +js-levenshtein@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.4.tgz#3a56e3cbf589ca0081eb22cd9ba0b1290a16d26e" + integrity sha512-PxfGzSs0ztShKrUYPIn5r0MtyAhYcCwmndozzpz8YObbPnD1jFxzlBGbRnX2mIu6Z13xN6+PTu05TQFnZFlzow== + js-reporters@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/js-reporters/-/js-reporters-1.2.1.tgz#f88c608e324a3373a95bcc45ad305e5c979c459b" @@ -7114,6 +7939,11 @@ js-tokens@^3.0.0, js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.6.1, js-yaml@^3.9.1: version "3.10.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" @@ -7143,7 +7973,7 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jsdom@^11.11.0, jsdom@^11.12.0: +jsdom@^11.12.0: version "11.12.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== @@ -7241,7 +8071,7 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -json-api-serializer@^1.11.0: +json-api-serializer@^1.11.0, json-api-serializer@^1.13.0: version "1.13.0" resolved "https://registry.yarnpkg.com/json-api-serializer/-/json-api-serializer-1.13.0.tgz#cab7239736e72abee4658b1c8915edc290f5a9e9" integrity sha512-h5XKsQsLhN6zKLzYKFMyCuQWQZXa6Ozk4GC4svZfh8BkxdwBHidQ+zn41pHlnntexAujY/PcO+hjH92IEvGf0A== @@ -7290,6 +8120,13 @@ json5@^0.5.1: resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= +json5@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" + integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + dependencies: + minimist "^1.2.0" + jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" @@ -7422,7 +8259,7 @@ linkify-it@~1.2.0: dependencies: uc.micro "^1.0.1" -liquid-fire@^0.29.1: +liquid-fire@^0.29.5: version "0.29.5" resolved "https://registry.yarnpkg.com/liquid-fire/-/liquid-fire-0.29.5.tgz#da8e3158e3f96c34a8cf371b90b8ae941ea8960d" integrity sha512-h+KxMaCvavkAfL5duNc5tQikrZxzbGVvUdmBU9mjkInUQQKvTjpD1DwphRKk6qWRRuDY9HT2ecY0Hf6/gMXkJA== @@ -7555,16 +8392,6 @@ lodash._baseflatten@^3.0.0: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" -lodash._basetostring@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" - integrity sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U= - -lodash._basevalues@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" - integrity sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc= - lodash._bindcallback@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" @@ -7620,16 +8447,16 @@ lodash._objecttypes@~2.3.0: resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.3.0.tgz#6a3ea3987dd6eeb8021b2d5c9c303549cc2bae1e" integrity sha1-aj6jmH3W7rgCGy1cnDA1Scwrrh4= -lodash._reinterpolate@^3.0.0, lodash._reinterpolate@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= - lodash._reinterpolate@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.3.0.tgz#03ee9d85c0e55cbd590d71608a295bdda51128ec" integrity sha1-A+6dhcDlXL1ZDXFgiilb3aURKOw= +lodash._reinterpolate@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + lodash._renative@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._renative/-/lodash._renative-2.3.0.tgz#77d8edd4ced26dd5971f9e15a5f772e4e317fbd3" @@ -7643,11 +8470,6 @@ lodash._reunescapedhtml@~2.3.0: lodash._htmlescapes "~2.3.0" lodash.keys "~2.3.0" -lodash._root@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" - integrity sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI= - lodash._setbinddata@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._setbinddata/-/lodash._setbinddata-2.3.0.tgz#e5610490acd13277d59858d95b5f2727f1508f04" @@ -7750,13 +8572,6 @@ lodash.defaultsdeep@^4.6.0: resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.0.tgz#bec1024f85b1bd96cbea405b23c14ad6443a6f81" integrity sha1-vsECT4WxvZbL6kBbI8FK1kQ6b4E= -lodash.escape@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" - integrity sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg= - dependencies: - lodash._root "^3.0.0" - lodash.escape@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.3.0.tgz#844c38c58f844e1362ebe96726159b62cf5f2a58" @@ -7918,22 +8733,7 @@ lodash.support@~2.3.0: dependencies: lodash._renative "~2.3.0" -lodash.template@^3.3.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" - integrity sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8= - dependencies: - lodash._basecopy "^3.0.0" - lodash._basetostring "^3.0.0" - lodash._basevalues "^3.0.0" - lodash._isiterateecall "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - lodash.keys "^3.0.0" - lodash.restparam "^3.0.0" - lodash.templatesettings "^3.0.0" - -lodash.template@^4.2.5: +lodash.template@^4.2.5, lodash.template@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" integrity sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A= @@ -7954,14 +8754,6 @@ lodash.template@~2.3.x: lodash.templatesettings "~2.3.0" lodash.values "~2.3.0" -lodash.templatesettings@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" - integrity sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU= - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - lodash.templatesettings@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" @@ -8014,6 +8806,11 @@ lodash@^4.1.0, lodash@^4.10.0, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.5, resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== +lodash@^4.17.11: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + lodash@~2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e" @@ -8059,10 +8856,10 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" -lunr@^2.1.5: - version "2.3.2" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.2.tgz#7164301092b2d7ab664573156f686df5c25c4185" - integrity sha512-3wO9shK+cBcJ260ibDtw3JGY+xE0so0y90Dt5YY4e+VmhZO8z8l4cwdau09Fiud0nZHdSgNsIKFHUy3MbXm00A== +lunr@^2.3.3: + version "2.3.5" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.5.tgz#7b510bad57e948dfb99a71fdff00c1bf9171bdda" + integrity sha512-EtnfmHsHJTr3u24sito9JctSxej5Ds0SgUD2Lm+qRHyLgM7BGesFlW14eNh1mil0fV5Muh8gf3dBBXzADlUlzQ== magic-string@^0.22.4: version "0.22.5" @@ -8395,13 +9192,6 @@ min-document@^2.19.0: dependencies: brace-expansion "^1.1.7" -minimatch@^2.0.1: - version "2.0.10" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" - integrity sha1-jQh8OcazjAAbl/ynzm0OHoCvusc= - dependencies: - brace-expansion "^1.0.0" - minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -8518,6 +9308,11 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + mustache@^2.2.1: version "2.3.0" resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.0.tgz#4028f7778b17708a489930a6e52ac3bca0da41d0" @@ -8619,6 +9414,11 @@ negotiator@0.6.1: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + no-case@^2.2.0: version "2.3.2" resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" @@ -8710,6 +9510,13 @@ node-pre-gyp@^0.6.39: tar "^2.2.1" tar-pack "^3.4.0" +node-releases@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.4.tgz#2d585de8c6c81d00017e063e7810a63889aa6756" + integrity sha512-GqRV9GcHw8JCRDaP/JoeNMNzEGzHAknMvIHqMb2VeTOmg1Cf9+ej8bkV12tHfzWHQMCkQ5zUFgwFUkfraynNCw== + dependencies: + semver "^5.3.0" + node-rest-client@^1.5.1: version "1.8.0" resolved "https://registry.yarnpkg.com/node-rest-client/-/node-rest-client-1.8.0.tgz#8d3c566b817e27394cb7273783a41caefe3e5955" @@ -8940,7 +9747,7 @@ on-headers@~1.0.1: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" integrity sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c= -once@^1.3.0, once@^1.3.3: +once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -9079,15 +9886,14 @@ parse-bmfont-xml@^1.1.4: xml-parse-from-string "^1.0.0" xml2js "^0.4.5" -parse-git-config@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/parse-git-config/-/parse-git-config-1.1.1.tgz#d3a9984317132f57398712bba438e129590ddf8c" - integrity sha1-06mYQxcTL1c5hxK7pDjhKVkN34w= +parse-git-config@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/parse-git-config/-/parse-git-config-2.0.3.tgz#6fb840d4a956e28b971c97b33a5deb73a6d5b6bb" + integrity sha512-Js7ueMZOVSZ3tP8C7E3KZiHv6QQl7lnJ+OkbxoaFazzSa2KyEHqApfGbU3XboUgUnq4ZuUmskUpYKTNx01fm5A== dependencies: - extend-shallow "^2.0.1" - fs-exists-sync "^0.1.0" + expand-tilde "^2.0.2" git-config-path "^1.0.1" - ini "^1.3.4" + ini "^1.3.5" parse-glob@^3.0.4: version "3.0.4" @@ -9206,7 +10012,7 @@ path-is-inside@^1.0.1, path-is-inside@^1.0.2: resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= -path-key@^2.0.0: +path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= @@ -9315,6 +10121,13 @@ pixelmatch@^4.0.0: dependencies: pngjs "^3.0.0" +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.0" + pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" @@ -9556,6 +10369,14 @@ psl@^1.1.24: resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.28.tgz#4fb6ceb08a1e2214d4fd4de0ca22dae13740bc7b" integrity sha512-+AqO1Ae+N/4r7Rvchrdm432afjT9hqJRyBN3DQv9At0tPz4hIFSGKbq64fN9dVoCow4oggIIax5/iONx0r9hZw== +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@2.x.x, punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -9790,17 +10611,29 @@ redeyed@~1.0.0: dependencies: esprima "~3.0.0" +regenerate-unicode-properties@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" + integrity sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw== + dependencies: + regenerate "^1.4.0" + regenerate@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" integrity sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg== +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + regenerator-runtime@^0.10.5: version "0.10.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= -regenerator-runtime@^0.11.0: +regenerator-runtime@^0.11.0, regenerator-runtime@^0.11.1: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== @@ -9819,6 +10652,13 @@ regenerator-transform@^0.10.0: babel-types "^6.19.0" private "^0.1.6" +regenerator-transform@^0.13.3: + version "0.13.3" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" + integrity sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA== + dependencies: + private "^0.1.6" + regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" @@ -9850,11 +10690,28 @@ regexpu-core@^2.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" +regexpu-core@^4.1.3, regexpu-core@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.2.0.tgz#a3744fa03806cffe146dea4421a3e73bdcc47b1d" + integrity sha512-Z835VSnJJ46CNBttalHD/dB+Sj2ezmY6Xp38npwU87peK6mqOzOpV8eYktdkLTEkzzD+JsTcxd84ozd8I14+rw== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^7.0.0" + regjsgen "^0.4.0" + regjsparser "^0.3.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.0.2" + regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= +regjsgen@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.4.0.tgz#c1eb4c89a209263f8717c782591523913ede2561" + integrity sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA== + regjsparser@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" @@ -9862,6 +10719,13 @@ regjsparser@^0.1.4: dependencies: jsesc "~0.5.0" +regjsparser@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.3.0.tgz#3c326da7fcfd69fa0d332575a41c8c0cdf588c96" + integrity sha512-zza72oZBBHzt64G7DxdqrOo/30bhHkwMUoT0WqfGu98XLd7N+1tsy5MJ96Bk4MD0y74n629RhmrGW6XlnLLwCA== + dependencies: + jsesc "~0.5.0" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -10080,6 +10944,11 @@ requires-port@1.x.x: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= +reselect@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147" + integrity sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc= + resize-img@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/resize-img/-/resize-img-1.1.2.tgz#fad650faf3ef2c53ea63112bc272d95e9d92550e" @@ -10125,7 +10994,7 @@ resolve@1.5.0, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.0, resolve@^1.3.3, r dependencies: path-parse "^1.0.5" -resolve@^1.8.1: +resolve@^1.3.2, resolve@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== @@ -10172,6 +11041,13 @@ rimraf@~2.2.6: resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= +rollup-plugin-babel@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-3.0.7.tgz#5b13611f1ab8922497e9d15197ae5d8a23fe3b1e" + integrity sha512-bVe2y0z/V5Ax1qU8NX/0idmzIwJPdUGu8Xx3vXH73h0yGjxfv2gkFI82MBVg49SlsFlLTBadBHb67zy4TWM3hA== + dependencies: + rollup-pluginutils "^1.5.0" + rollup-plugin-commonjs@^8.3.0: version "8.4.1" resolved "http://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.4.1.tgz#5c9cea2b2c3de322f5fbccd147e07ed5e502d7a0" @@ -10192,6 +11068,14 @@ rollup-plugin-node-resolve@^3.3.0: is-module "^1.0.0" resolve "^1.1.6" +rollup-pluginutils@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408" + integrity sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg= + dependencies: + estree-walker "^0.2.1" + minimatch "^3.0.2" + rollup-pluginutils@^2.0.1: version "2.3.1" resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.3.1.tgz#760d185ccc237dedc12d7ae48c6bcd127b4892d0" @@ -10341,10 +11225,10 @@ sass-graph@^2.2.4: scss-tokenizer "^0.2.3" yargs "^7.0.0" -sass@^1.13.2: - version "1.14.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.14.1.tgz#6f7b083b880104caa19e45841cdb0889d9bdadbf" - integrity sha512-XjTTos0ocxN4R2vdOoo083PXUt1XZkOO+ynAl4auomOSAbLr4/aGg19cSpR7w90nUtP6cIRysytboJRUGfw03A== +sass@^1.14.1: + version "1.15.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.15.1.tgz#25a03f6813413540210580b670628360c36267d3" + integrity sha512-WiDa5BsePB/rQEbh/Fv2pVDUCasxuRYjW7GsWx8Ld23LY61vx1VV5Mzf/7mu5kLWKMryMqo65fzYL34HgaM47w== dependencies: chokidar "^2.0.0" @@ -10376,6 +11260,11 @@ semver@^4.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= +semver@^5.5.1: + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== + semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -10525,10 +11414,10 @@ simple-dom@^1.0.0: resolved "https://registry.yarnpkg.com/simple-dom/-/simple-dom-1.3.0.tgz#8473e0d34e340544b061410dba3faf4f1b7aa282" integrity sha512-RVjr6e80FFGDqDJZeQd4EMwoDLatn4Jy2SfuXecrP1IgG4ZAqkGSokE8LNV5i0kzWR2IM0e257xGN9JS8lxm0Q== -simple-html-tokenizer@^0.4.1: - version "0.4.3" - resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.4.3.tgz#9b00b766e30058b4bb377c0d4f97566a13ab1be1" - integrity sha512-OpUzgR+P/Qsu6ztZehr4PxvTbV4sDW91hAqc2tnz4fjuFTqErWIUdUMbnzX+19F4IEpSSfa0vCAz5xJSs0LpPw== +simple-html-tokenizer@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.7.tgz#8eca336ecfbe2b3c6166cbb31b2682088de79f40" + integrity sha512-APW9iYbkJ5cijjX4Ljhf3VG8SwYPUJT5gZrwci/wieMabQxWFiV5VwsrP5c6GMRvXKEQMGkAB1d9dvW66dTqpg== slash@^1.0.0: version "1.0.0" @@ -11524,6 +12413,29 @@ underscore@^1.8.3: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" + integrity sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" + integrity sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg== + union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" @@ -11714,11 +12626,6 @@ walk-sync@0.3.2, walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" -walk-sync@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.1.3.tgz#8a07261a00bda6cfb1be25e9f100fad57546f583" - integrity sha1-igcmGgC9ps+xviXp8QD61XVG9YM= - walk-sync@^0.2.5, walk-sync@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.2.7.tgz#b49be4ee6867657aeb736978b56a29d10fa39969" @@ -11727,6 +12634,14 @@ walk-sync@^0.2.5, walk-sync@^0.2.7: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" +walk-sync@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.3.tgz#1e9f12cd4fe6e0e6d4a0715b5cc7e30711d43cd1" + integrity sha512-jQgTHmCazUngGqvHZFlr30u2VLKEKErBMLFe+fBl5mn4rh9aI/QVRog8PT1hv2vaOu4EBwigfmpRTyZrbnpRVA== + dependencies: + ensure-posix-path "^1.0.0" + matcher-collection "^1.0.0" + walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -11874,6 +12789,13 @@ workerpool@^2.3.0: dependencies: object-assign "4.1.1" +workerpool@^2.3.1: + version "2.3.3" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-2.3.3.tgz#49a70089bd55e890d68cc836a19419451d7c81d7" + integrity sha512-L1ovlYHp6UObYqElXXpbd214GgbEKDED0d3sj7pRdFXjNkb2+un/AUcCkceHizO0IVI6SOGGncrcjozruCkRgA== + dependencies: + object-assign "4.1.1" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -12070,11 +12992,6 @@ yeast@0.1.2: resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= -yetch@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/yetch/-/yetch-0.0.1.tgz#76f1729b2c2c667e23c3c2da90472a4897eca004" - integrity sha512-Zl5SG98t7zLphqFAFsgXeyQF6i7MvsErop0Kb6CSyjQLR5qNXcvvwwBDKuF4X2m9/HWXgmHX/HPaZuMU1isXaQ== - yui@^3.18.1: version "3.18.1" resolved "https://registry.yarnpkg.com/yui/-/yui-3.18.1.tgz#e000269ec0a7b6fbc741cbb8fcbd0e65117b014c" From 4f7802d83442a746b32c72d1cffdcc543d232b44 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sun, 25 Nov 2018 07:57:52 -0500 Subject: [PATCH 262/879] Add redirects --- .../template.md | 2 - .../2015-09-10-orm-not-ready-yet/template.md | 2 - .../2015-09-15-router-handler/template.md | 2 - .../2015-10-19-serializers-ready/template.md | 2 - .../template.md | 2 - .../template.md | 2 - .../template.md | 2 - .../2016-05-31-0-2-0-released/template.md | 2 - .../2017-01-09-0-3-0-beta-series/template.md | 2 - .../template.md | 2 - .../template.md | 2 - tests/dummy/app/pods/not-found/route.js | 61 +++++++++++++++++++ tests/dummy/app/router.js | 8 +++ 13 files changed, 69 insertions(+), 22 deletions(-) create mode 100644 tests/dummy/app/pods/not-found/route.js diff --git a/tests/dummy/app/pods/blog/data/2015-09-06-thoughts-on-model-attribute-formatting/template.md b/tests/dummy/app/pods/blog/data/2015-09-06-thoughts-on-model-attribute-formatting/template.md index ee424b31f..75b0a76e9 100644 --- a/tests/dummy/app/pods/blog/data/2015-09-06-thoughts-on-model-attribute-formatting/template.md +++ b/tests/dummy/app/pods/blog/data/2015-09-06-thoughts-on-model-attribute-formatting/template.md @@ -1,7 +1,5 @@ # Thoughts on model attribute formatting -permalink: /blog/2015/09/06/thoughts-on-model-attribute-formatting/ - I ran into an interesting problem while working on the serializer layer. I was just wrapping up AMS-style responses and was going to start working on the JSON:API version, when a wrinkle came up: the formatting of attribute names, both on Mirage's model layer instances, and on the field names of Mirage's database. Currently, Mirage's database simply takes whatever POJO of attrs you give it, and sticks that in its db. So if you write diff --git a/tests/dummy/app/pods/blog/data/2015-09-10-orm-not-ready-yet/template.md b/tests/dummy/app/pods/blog/data/2015-09-10-orm-not-ready-yet/template.md index 9c208a4e1..c5aac236d 100644 --- a/tests/dummy/app/pods/blog/data/2015-09-10-orm-not-ready-yet/template.md +++ b/tests/dummy/app/pods/blog/data/2015-09-10-orm-not-ready-yet/template.md @@ -1,7 +1,5 @@ # The ORM is not ready, yet -permalink: /blog/2015/09/10/orm-not-ready-yet/ - I wanted to quickly note that, although [the models PR](https://github.com/samselikoff/ember-cli-mirage/pull/82) has been merged into master, it is not quite ready for use. To be really effective, Mirage also needs a serializer layer (in progress), and an update to the factory layer (to support associations and traits). My plan is to document all three of these features (models, serializers and updated factories) at once, since they all rely on the orm, and will all require you to write simple model definitions to take advantage of. diff --git a/tests/dummy/app/pods/blog/data/2015-09-15-router-handler/template.md b/tests/dummy/app/pods/blog/data/2015-09-15-router-handler/template.md index c5143fb57..56971f67a 100644 --- a/tests/dummy/app/pods/blog/data/2015-09-15-router-handler/template.md +++ b/tests/dummy/app/pods/blog/data/2015-09-15-router-handler/template.md @@ -1,7 +1,5 @@ # Refactoring Server, adding a Route Handler object -permalink: /blog/2015/09/15/router-handler/ - Updating the shorthands to work with the serializer layer proved harder than I thought. Serializers made it clear that the shorthands were making assumptions about the shape of the JSON payload. Now that users will be able to use serializers to transform how their data looks going out, I'll also need a way for them to specify how the data looks coming in. This is similar to Ember Data's `normalize` function. If a user is using a PUT or POST shorthand, I'll need to first deserialize the payload into a standard format, so the shorthands know what to do with it. I'll use the JSON:API format for the standard; that way, if you're using JSON:API, `normalize` will be a no-op, and AMS-style responses will simply convert to JSON:API. diff --git a/tests/dummy/app/pods/blog/data/2015-10-19-serializers-ready/template.md b/tests/dummy/app/pods/blog/data/2015-10-19-serializers-ready/template.md index 47436d416..8bcc880f1 100644 --- a/tests/dummy/app/pods/blog/data/2015-10-19-serializers-ready/template.md +++ b/tests/dummy/app/pods/blog/data/2015-10-19-serializers-ready/template.md @@ -1,7 +1,5 @@ # Serializers are ready for testing -permalink: /blog/2015/10/19/serializers-ready/ - Yesterday I merged in the [JSON:API Serializer](https://github.com/samselikoff/ember-cli-mirage/commit/9927a7f7a2232ddf8df15e01991e538eefadee9c), which is the last piece of planned work I have for the serializer layer. That means it's ready to test! I'm sure there's plenty I haven't thought of yet, but I think it's time to get some people kicking the tires. For the brave, I'll be writing documentation this week about how to take advantage of the ORM and Serializer layer in your route handlers. Migration will be at your own pace: you should be able to switch over, keep old custom route handlers that access the db directly, and switch them over one at a time to use the new schema object - the ORM. Using a schema in your route handler lets you respond with a model or collection, which is the basis for your serializers knowing how to transform your response into an appropriately-formatted JSON payload. diff --git a/tests/dummy/app/pods/blog/data/2015-11-03-inside-ember-cli-mirage/template.md b/tests/dummy/app/pods/blog/data/2015-11-03-inside-ember-cli-mirage/template.md index 3f1a86990..646d04802 100644 --- a/tests/dummy/app/pods/blog/data/2015-11-03-inside-ember-cli-mirage/template.md +++ b/tests/dummy/app/pods/blog/data/2015-11-03-inside-ember-cli-mirage/template.md @@ -1,7 +1,5 @@ # Video: Inside Ember CLI Mirage -permalink: /blog/2015/11/03/inside-ember-cli-mirage/ - On October 10 I spoke at the Global Ember Meetup about why I built Mirage, and what's planned for the next version. Here's the video:
    diff --git a/tests/dummy/app/pods/blog/data/2016-01-03-0-2-0-beta-9-released/template.md b/tests/dummy/app/pods/blog/data/2016-01-03-0-2-0-beta-9-released/template.md index ff9a0d982..3d46a6bb9 100644 --- a/tests/dummy/app/pods/blog/data/2016-01-03-0-2-0-beta-9-released/template.md +++ b/tests/dummy/app/pods/blog/data/2016-01-03-0-2-0-beta-9-released/template.md @@ -1,7 +1,5 @@ # Mirage 0.2.0-beta.9 released -permalink: /blog/2016/01/03/0-2-0-beta.9-released/ - Mirage v0.2.0-beta.9 has been released. Check out [the release notes](https://github.com/samselikoff/ember-cli-mirage/releases/tag/v0.2.0-beta.9) for the breaking changes and enhancements. ## Update on a 0.2 stable release diff --git a/tests/dummy/app/pods/blog/data/2016-01-03-0-2-update-only-inject-schema/template.md b/tests/dummy/app/pods/blog/data/2016-01-03-0-2-update-only-inject-schema/template.md index add783d40..d1f366fe8 100644 --- a/tests/dummy/app/pods/blog/data/2016-01-03-0-2-update-only-inject-schema/template.md +++ b/tests/dummy/app/pods/blog/data/2016-01-03-0-2-update-only-inject-schema/template.md @@ -1,7 +1,5 @@ # Mirage 0.2 update -permalink: /blog/2016/01/03/0-2-update-only-inject-schema/ - Here's a quick update on Mirage 0.2. When I started working on the ORM/Serializer layer, I knew we were going to need to bump Mirage to 0.2. However, I thought it was worth keeping the library completely backwards compatible. I wanted users to be able to update to 0.2 without breaking any of their existing route handlers. diff --git a/tests/dummy/app/pods/blog/data/2016-05-31-0-2-0-released/template.md b/tests/dummy/app/pods/blog/data/2016-05-31-0-2-0-released/template.md index b03dc62c5..3547dc330 100644 --- a/tests/dummy/app/pods/blog/data/2016-05-31-0-2-0-released/template.md +++ b/tests/dummy/app/pods/blog/data/2016-05-31-0-2-0-released/template.md @@ -1,7 +1,5 @@ # Mirage 0.2.0 released -permalink: /blog/2016/05/31/0-2-0-released/ - Mirage v0.2.0 has been released! Check out [the release notes](https://github.com/samselikoff/ember-cli-mirage/releases/tag/v0.2.0-beta.9) for the breaking changes and enhancements from 0.2.0-beta.9. Also see [Adolfo's script](https://blog.abuiles.com/blog/2016/05/27/upgrading-to-mirage-v0-dot-2-0-beta-dot-9-with-jscodeshift/) to help with some of the breaking changes from `beta.7` to `beta.9`. If you're upgrading an app from 0.1.x to 0.2, be sure to read through [the 0.2.x docs](http://www.ember-cli-mirage.com/docs/v0.2.x/). When you're ready to upgrade, consult [the upgrade guide](http://www.ember-cli-mirage.com/docs/v0.2.x/upgrading/), and open an issue if the guide left something out. diff --git a/tests/dummy/app/pods/blog/data/2017-01-09-0-3-0-beta-series/template.md b/tests/dummy/app/pods/blog/data/2017-01-09-0-3-0-beta-series/template.md index aa9915154..bac9ca0a2 100644 --- a/tests/dummy/app/pods/blog/data/2017-01-09-0-3-0-beta-series/template.md +++ b/tests/dummy/app/pods/blog/data/2017-01-09-0-3-0-beta-series/template.md @@ -1,7 +1,5 @@ # Mirage 0.3.0 beta series -permalink: /blog/2017/01/09/0-3-0-beta-series/ - I've started the beta series of Mirage v0.3.0. You can install the latest release (0.3.0-beta.4 as of this writing) with ```sh diff --git a/tests/dummy/app/pods/blog/data/2017-06-05-polymorphic-associations-and-auto-discovery-of-ember-data-models/template.md b/tests/dummy/app/pods/blog/data/2017-06-05-polymorphic-associations-and-auto-discovery-of-ember-data-models/template.md index 171e6a14b..cab44ed82 100644 --- a/tests/dummy/app/pods/blog/data/2017-06-05-polymorphic-associations-and-auto-discovery-of-ember-data-models/template.md +++ b/tests/dummy/app/pods/blog/data/2017-06-05-polymorphic-associations-and-auto-discovery-of-ember-data-models/template.md @@ -1,7 +1,5 @@ # Polymorphic associations and auto-discovery of Ember Data models -permalink: /blog/2017/06/05/polymorphic-associations-and-auto-discovery-of-ember-data-models/ - _Thanks to [Precision Nutrition](http://www.precisionnutrition.com/) for sponsoring some of Mirage's recent work!_ In the last few weeks there's been two important releases of Ember CLI Mirage. Version [0.3.2](https://github.com/samselikoff/ember-cli-mirage/releases/tag/v0.3.2) bought along auto-discovery of Ember Data models, and version [0.3.3](https://github.com/samselikoff/ember-cli-mirage/releases/tag/v0.3.3) (which I released over the weekend) added support for Polymorphic associations. diff --git a/tests/dummy/app/pods/blog/data/2018-02-01-changing-mirages-default-linkage-data-behavior/template.md b/tests/dummy/app/pods/blog/data/2018-02-01-changing-mirages-default-linkage-data-behavior/template.md index 85bfab901..5741d4c05 100644 --- a/tests/dummy/app/pods/blog/data/2018-02-01-changing-mirages-default-linkage-data-behavior/template.md +++ b/tests/dummy/app/pods/blog/data/2018-02-01-changing-mirages-default-linkage-data-behavior/template.md @@ -1,7 +1,5 @@ # Changing Mirage's default linkage data behavior in 0.4 to better conform to JSON:API's semantics -permalink: /blog/2018/02/01/changing-mirages-default-linkage-data-behavior/ - I wanted to write a quick post detailing a change that happened in Mirage's 0.4.0 release that I originally didn't signal as a breaking change, but that affected more apps than I realized. I have since added the following note about it to the [0.3 -> 0.4 upgrade guide]({{ site.baseurl }}{% link docs/v0.4.x/upgrading.md %}) diff --git a/tests/dummy/app/pods/not-found/route.js b/tests/dummy/app/pods/not-found/route.js new file mode 100644 index 000000000..0f2ef1952 --- /dev/null +++ b/tests/dummy/app/pods/not-found/route.js @@ -0,0 +1,61 @@ +import Route from '@ember/routing/route'; + +export default Route.extend({ + + beforeModel() { + let { path } = this.paramsFor('not-found'); + + this.get('redirects').forEach(candidate => { + if (path === candidate.from || path === `${candidate.from}/`) { + this.transitionTo('blog.post', candidate.to.replace('blog/', '')); + } + }); + }, + + redirects: [ + { + from: 'blog/2018/02/01/changing-mirages-default-linkage-data-behavior', + to: 'blog/2018-02-01-changing-mirages-default-linkage-data-behavior' + }, + { + from: 'blog/2017/06/05/polymorphic-associations-and-auto-discovery-of-ember-data-models', + to: 'blog/2017-06-05-polymorphic-associations-and-auto-discovery-of-ember-data-models' + }, + { + from: 'blog/2017/01/09/0-3-0-beta-series', + to: 'blog/2017-01-09-0-3-0-beta-series' + }, + { + from: 'blog/2016/05/31/0-2-0-released', + to: 'blog/2016-05-31-0-2-0-released' + }, + { + from: 'blog/2016/01/03/0-2-0-beta.9-released', + to: 'blog/2016-01-03-0-2-0-beta-9-released' + }, + { + from: 'blog/2016/01/03/0-2-update-only-inject-schema', + to: 'blog/2016-01-03-0-2-update-only-inject-schema' + }, + { + from: 'blog/2015/11/03/inside-ember-cli-mirage', + to: 'blog/2015-11-03-inside-ember-cli-mirage' + }, + { + from: 'blog/2015/10/19/serializers-ready', + to: 'blog/2015-10-19-serializers-ready' + }, + { + from: 'blog/2015/09/15/router-handler', + to: 'blog/2015-09-15-router-handler' + }, + { + from: 'blog/2015/09/10/orm-not-ready-yet', + to: 'blog/2015-09-10-orm-not-ready-yet' + }, + { + from: 'blog/2015/09/06/thoughts-on-model-attribute-formatting', + to: 'blog/2015-09-06-thoughts-on-model-attribute-formatting' + } + ] +}); diff --git a/tests/dummy/app/router.js b/tests/dummy/app/router.js index 500b725bb..33656e189 100644 --- a/tests/dummy/app/router.js +++ b/tests/dummy/app/router.js @@ -46,6 +46,14 @@ Router.map(function() { }); this.route('blog', function() { + // this.route('old-post-year', { path: '/:post_year' }, function() { + // this.route('old-post-month', { path: '/:post_month' }, function() { + // this.route('old-post-day', { path: '/:post_day' }, function() { + // this.route('old-post-slug', { path: '/:post_slug' }); + // }); + // }); + // }); + this.route('post', { path: '/:post_slug' }); }); From 3b3b955d7d74764c169a40216569f5653b3401c8 Mon Sep 17 00:00:00 2001 From: Jeldrik Hanschke Date: Wed, 28 Nov 2018 21:06:02 +0100 Subject: [PATCH 263/879] add docs for identity managers --- .../advanced/identity-managers/template.md | 70 +++++++++++++++++++ tests/dummy/app/pods/docs/template.hbs | 1 + tests/dummy/app/router.js | 1 + 3 files changed, 72 insertions(+) create mode 100644 tests/dummy/app/pods/docs/advanced/identity-managers/template.md diff --git a/tests/dummy/app/pods/docs/advanced/identity-managers/template.md b/tests/dummy/app/pods/docs/advanced/identity-managers/template.md new file mode 100644 index 000000000..7d627b84d --- /dev/null +++ b/tests/dummy/app/pods/docs/advanced/identity-managers/template.md @@ -0,0 +1,70 @@ +# Identity managers + +By default Mirage uses auto incremental numbers starting with `1` as IDs for records. This could be customized by implementing *identity managers*. + +An identity manager is a class generating unique identifiers. You could provide a custom identity manager per application and per model. + +A custom identity manager must implement these methods: + +- `fetch`, which must return an identifier not used yet. +- `set`, which is called with an `id` of a record being insert in mirage's database. +- `reset`, which should reset database to initial state. + +Mirage provides a blueprint to generate custom identity managers: `ember generate mirage-identity-manager ` + +For example an identity manager mocking UUIDs would look like this: + +```js +import { v4 as getUuid } from "ember-uuid"; + +export default class { + constructor() { + this.ids = new Set(); + } + + /** + * Returns an unique identifier. + * + * @method fetch + * @param {Object} data Records attributes hash + * @return {String} Unique identifier + * @public + */ + fetch() { + let uuid = getUuid(); + while (this.ids.has(uuid)) { + uuid = getUuid(); + } + + this.ids.add(uuid); + + return uuid; + } + + /** + * Register an identifier. + * Must throw if identifier is already used. + * + * @method set + * @param {String|Number} id + * @public + */ + set(id) { + if (this.ids.has(id)) { + throw new Error(`ID ${id} is inuse.`); + } + + this.ids.add(id); + } + + /** + * Reset identity manager. + * + * @method reset + * @public + */ + reset() { + this.ids.clear(); + } +} +``` diff --git a/tests/dummy/app/pods/docs/template.hbs b/tests/dummy/app/pods/docs/template.hbs index 91527f17f..e3b2cf596 100644 --- a/tests/dummy/app/pods/docs/template.hbs +++ b/tests/dummy/app/pods/docs/template.hbs @@ -19,6 +19,7 @@ {{nav.item 'Factories' 'docs.advanced.factories'}} {{nav.item 'Fixtures' 'docs.advanced.fixtures'}} {{nav.item 'Environment configuration' 'docs.advanced.environment-options'}} + {{nav.item 'Identity managers' 'docs.advanced.identity-managers'}} {{nav.section 'Cookbook'}} {{nav.item 'Manually starting Mirage' 'docs.cookbook.manually-starting-mirage'}} diff --git a/tests/dummy/app/router.js b/tests/dummy/app/router.js index 33656e189..71d7d25a1 100644 --- a/tests/dummy/app/router.js +++ b/tests/dummy/app/router.js @@ -33,6 +33,7 @@ Router.map(function() { this.route('fixtures'); this.route('environment-options'); this.route('shorthands'); + this.route('identity-managers'); }); this.route('examples', function() { From 69b537159bcc304a908babefb384f086931e42de Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 30 Nov 2018 11:10:14 -0500 Subject: [PATCH 264/879] v0.4.10 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0501a87a3..63dbbc2f1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "0.4.9", + "version": "0.4.10", "description": "A client-side HTTP server to develop, test and demo your Ember app", "keywords": [ "ember-addon", From acf8ed019ae0235fd378dea683099cb18153ed08 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sat, 1 Dec 2018 16:04:33 +0100 Subject: [PATCH 265/879] TravisCI: Remove deprecated `sudo: false` option see https://blog.travis-ci.com/2018-11-19-required-linux-infrastructure-migration --- .travis.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index d74a664aa..5747d6a33 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,9 +3,6 @@ language: node_js node_js: - "8" -sudo: false -dist: trusty - addons: chrome: stable From ab746916783e70c5a2dd61cdd68504f15ac9f56f Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 24 Dec 2018 11:59:09 -0500 Subject: [PATCH 266/879] [closes #1370] Fix falsy responses --- addon/response.js | 37 ++++++++-- .../route-handlers/function-handler-test.js | 10 ++- .../server/custom-responses-test.js | 67 +++++++++++++++++++ .../server/falsy-responses-test.js | 65 ++++++++++++++++++ tests/unit/response-test.js | 2 +- 5 files changed, 170 insertions(+), 11 deletions(-) create mode 100644 tests/integration/server/custom-responses-test.js create mode 100644 tests/integration/server/falsy-responses-test.js diff --git a/addon/response.js b/addon/response.js index 63c59bf6c..a35d8a279 100644 --- a/addon/response.js +++ b/addon/response.js @@ -1,18 +1,41 @@ +import { warn } from '@ember/debug'; export default class Response { - constructor(code, headers = {}, data = '') { + constructor(code, headers = {}, data) { this.code = code; this.headers = headers; - this.data = data; - } - toRackResponse() { - let { headers } = this; + // Default data for "undefined 204" responses to empty string (no content) + if (code === 204) { + if (data !== undefined && data !== '') { + warn( + `Mirage: One of your route handlers is returning a custom + 204 Response that has data, but this is a violation of the HTTP spec + and could lead to unexpected behavior. 204 responses should have no + content (an empty string) as their body. [warning id: + ember-cli-mirage.warn-response-204-non-empty-payload]`, + false, + { id: 'ember-cli-mirage.warn-response-204-non-empty-payload' } + ); + } else { + this.data = ''; + } - if (this.data && !headers.hasOwnProperty('Content-Type')) { - headers['Content-Type'] = 'application/json'; + // Default data for "empty untyped" responses to empty JSON object + } else if ((data === undefined || data === '') && !this.headers.hasOwnProperty('Content-Type')) { + this.data = {}; + + } else { + this.data = data; } + // Default "untyped" responses to application/json + if (!this.headers.hasOwnProperty('Content-Type')) { + this.headers['Content-Type'] = 'application/json'; + } + } + + toRackResponse() { return [ this.code, this.headers, this.data ]; } diff --git a/tests/integration/route-handlers/function-handler-test.js b/tests/integration/route-handlers/function-handler-test.js index d74d9a155..df727a8e2 100644 --- a/tests/integration/route-handlers/function-handler-test.js +++ b/tests/integration/route-handlers/function-handler-test.js @@ -89,7 +89,7 @@ module('Integration | Route handlers | Function handler', function(hooks) { }); test('it can return a promise with an empty string', async function(assert) { - assert.expect(1); + assert.expect(4); this.server.get('/users', function() { return new Promise(resolve => { @@ -97,8 +97,12 @@ module('Integration | Route handlers | Function handler', function(hooks) { }); }); - let { data } = await promiseAjax({ method: 'GET', url: '/users' }); - assert.equal(data, ''); + let { data, xhr } = await promiseAjax({ method: 'GET', url: '/users' }); + + assert.deepEqual(data, ''); + assert.equal(xhr.responseText, ""); + assert.equal(xhr.status, 200); + assert.equal(xhr.getAllResponseHeaders().trim(), "Content-Type: text/csv"); }); test(`it can serialize a POJA of models`, async function(assert) { diff --git a/tests/integration/server/custom-responses-test.js b/tests/integration/server/custom-responses-test.js new file mode 100644 index 000000000..63debd954 --- /dev/null +++ b/tests/integration/server/custom-responses-test.js @@ -0,0 +1,67 @@ +import { module, test } from 'qunit'; +import Server from 'ember-cli-mirage/server'; +import promiseAjax from '../../helpers/promise-ajax'; +import { Response } from 'ember-cli-mirage'; + +module('Integration | Server | Custom responses', function(hooks) { + hooks.beforeEach(function() { + this.server = new Server({ + environment: 'test' + }); + this.server.timing = 0; + this.server.logging = false; + }); + + hooks.afterEach(function() { + this.server.shutdown(); + }); + + test('GET to an empty Response defaults to 200 and an empty json object', async function(assert) { + this.server.get('/example', function() { + return new Response(); + }); + + let { data, xhr } = await promiseAjax({ + method: 'GET', + url: '/example' + }); + + assert.deepEqual(data, {}); + assert.equal(xhr.responseText, "{}"); + assert.equal(xhr.status, 200); + assert.equal(xhr.getAllResponseHeaders().trim(), "Content-Type: application/json"); + }); + + test('GET to a 200 Response responds with an empty json object', async function(assert) { + this.server.get('/example', function() { + return new Response(200); + }); + + let { data, xhr } = await promiseAjax({ + method: 'GET', + url: '/example' + }); + + assert.deepEqual(data, {}); + assert.equal(xhr.responseText, "{}"); + assert.equal(xhr.status, 200); + assert.equal(xhr.getAllResponseHeaders().trim(), "Content-Type: application/json"); + }); + + test('a 204 Response responds with an empty body', async function(assert) { + this.server.post('/example', function() { + return new Response(204); + }); + + let { data, xhr } = await promiseAjax({ + method: 'POST', + url: '/example' + }); + + assert.deepEqual(data, undefined); + assert.equal(xhr.responseText, ''); + assert.equal(xhr.status, 204); + assert.equal(xhr.getAllResponseHeaders().trim(), "Content-Type: application/json"); + }); + +}); diff --git a/tests/integration/server/falsy-responses-test.js b/tests/integration/server/falsy-responses-test.js new file mode 100644 index 000000000..dc6d256a7 --- /dev/null +++ b/tests/integration/server/falsy-responses-test.js @@ -0,0 +1,65 @@ +import { module, test } from 'qunit'; +import Server from 'ember-cli-mirage/server'; +import promiseAjax from '../../helpers/promise-ajax'; + +module('Integration | Server | Falsy responses', function(hooks) { + hooks.beforeEach(function() { + this.server = new Server({ + environment: 'test' + }); + this.server.timing = 0; + this.server.logging = false; + }); + + hooks.afterEach(function() { + this.server.shutdown(); + }); + + test('undefined response returns an empty object', async function(assert) { + this.server.get('/example', function() { + return undefined; + }); + + let { data, xhr } = await promiseAjax({ + method: 'GET', + url: '/example' + }); + + assert.deepEqual(data, {}); + assert.equal(xhr.responseText, "{}"); + assert.equal(xhr.status, 200); + assert.equal(xhr.getAllResponseHeaders().trim(), "Content-Type: application/json"); + }); + + test('null response returns a JSON null', async function(assert) { + this.server.get('/example', function() { + return null; + }); + + let { data, xhr } = await promiseAjax({ + method: 'GET', + url: '/example' + }); + + assert.deepEqual(data, null); + assert.equal(xhr.responseText, "null"); + assert.equal(xhr.status, 200); + assert.equal(xhr.getAllResponseHeaders().trim(), "Content-Type: application/json"); + }); + + test('empty string response returns an empty object', async function(assert) { + this.server.get('/example', function() { + return ''; + }); + + let { data, xhr } = await promiseAjax({ + method: 'GET', + url: '/example' + }); + + assert.deepEqual(data, {}); + assert.equal(xhr.responseText, "{}"); + assert.equal(xhr.status, 200); + assert.equal(xhr.getAllResponseHeaders().trim(), "Content-Type: application/json"); + }); +}); diff --git a/tests/unit/response-test.js b/tests/unit/response-test.js index 4ac380417..74843b7c6 100644 --- a/tests/unit/response-test.js +++ b/tests/unit/response-test.js @@ -1,6 +1,6 @@ import Response from 'ember-cli-mirage/response'; -import {module, test} from 'qunit'; +import { module, test } from 'qunit'; module('Unit | Response', function() { test('it can be instantiated and return a rack response', function(assert) { From 3d3001454ee7f26b4e82b2ee012fe95c7d681f99 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sun, 6 Jan 2019 21:39:01 -0500 Subject: [PATCH 267/879] fix: revert 4.10 factory lookup behavior, add warning closes #1444 --- addon/server.js | 43 +++++-- .../server/create-and-create-list-test.js | 105 ++++++++++++++++-- 2 files changed, 125 insertions(+), 23 deletions(-) diff --git a/addon/server.js b/addon/server.js index 33cc4fc9f..346719d94 100644 --- a/addon/server.js +++ b/addon/server.js @@ -397,10 +397,11 @@ export default class Server { } create(type, ...options) { - assert( - this._validateCreateType(type), - `You called server.create('${type}') but no model or factory was found. Make sure you're using the singularized version of your model.` - ); + if (this._typeIsPluralForModel(type)) { + console.warn(`Mirage [deprecation]: You called server.create('${type}'), but server.create was intended to be used with the singularized version of the model. Please change this to server.create('${singularize(type)}'). This behavior will be removed in 1.0.`); + + type = singularize(type); + } // When there is a Model defined, we should return an instance // of it instead of returning the bare attributes. @@ -411,7 +412,7 @@ export default class Server { let attrs = this.build(type, ...traits, overrides); let modelOrRecord; - if (this.schema && this.schema.modelFor(camelize(type))) { + if (this.schema && this.schema[toCollectionName(type)]) { let modelClass = this.schema[toCollectionName(type)]; modelOrRecord = modelClass.create(attrs); @@ -426,7 +427,7 @@ export default class Server { collection = this.db[collectionName]; } - assert(collection, `You called server.create('${type}') but no model or factory was found. Make sure you're using the singularized version of your model.`); + assert(collection, `You called server.create('${type}') but no model or factory was found.`); modelOrRecord = collection.insert(attrs); } @@ -442,9 +443,15 @@ export default class Server { createList(type, amount, ...traitsAndOverrides) { assert( - this._validateCreateType(type), - `You called server.createList('${type}') but no model or factory was found. Make sure you're using the singularized version of your model.` + this._modelOrFactoryExistsForTypeOrCollectionName(type), + `You called server.createList('${type}') but no model or factory was found.` ); + + if (this._typeIsPluralForModel(type)) { + console.warn(`Mirage [deprecation]: You called server.createList('${type}'), but server.createList was intended to be used with the singularized version of the model. Please change this to server.createList('${singularize(type)}'). This behavior will be removed in 1.0.`); + + type = singularize(type); + } assert(_isInteger(amount), `second argument has to be an integer, you passed: ${typeof amount}`); let list = []; @@ -659,12 +666,26 @@ export default class Server { * * @private */ - _validateCreateType(type) { + _typeIsPluralForModel(typeOrCollectionName) { + let modelOrFactoryExists = this._modelOrFactoryExistsForTypeOrCollectionName(typeOrCollectionName); + let isPlural = typeOrCollectionName === pluralize(typeOrCollectionName); + let isUncountable = singularize(typeOrCollectionName) === pluralize(typeOrCollectionName); + + return isPlural && !isUncountable && modelOrFactoryExists; + } + + /** + * + * @private + */ + _modelOrFactoryExistsForTypeOrCollectionName(typeOrCollectionName) { + // Need this, since singular or plural can be passed in. Can assume singular (type) in 1.0. + let type = singularize(typeOrCollectionName); + let modelExists = (this.schema && this.schema.modelFor(camelize(type))); let dbCollectionExists = this.db[toInternalCollectionName(type)]; - let isSingular = type === singularize(type); - return isSingular && (modelExists || dbCollectionExists); + return modelExists || dbCollectionExists; } /** diff --git a/tests/integration/server/create-and-create-list-test.js b/tests/integration/server/create-and-create-list-test.js index 7a3f1bdc2..1094d0a63 100644 --- a/tests/integration/server/create-and-create-list-test.js +++ b/tests/integration/server/create-and-create-list-test.js @@ -1,7 +1,31 @@ import { module, test } from 'qunit'; import { Model, Factory, hasMany, belongsTo } from 'ember-cli-mirage'; +import Inflector from 'ember-inflector'; import Server from 'ember-cli-mirage/server'; +// eslint-disable-next-line no-console +let originalWarn = console.warn; + +function expectWarning(assert, warning) { + if (!warning) { + assert.ok(false, 'You must pass in a message when expecting a warning'); + } + + // eslint-disable-next-line no-console + console.warn = message => { + let re = new RegExp(warning.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')); + + assert.ok(re.test(message), 'the correct warning message was logged'); + }; +} + +function expectNoWarning(assert) { + // eslint-disable-next-line no-console + console.warn = () => { + assert.notOk(true, 'no warning should be logged'); + }; +} + module('Integration | Server | create and createList', function(hooks) { hooks.beforeEach(function() { this.Contact = Model.extend(); @@ -12,6 +36,7 @@ module('Integration | Server | create and createList', function(hooks) { this.Author = Model.extend({ posts: hasMany() }); + this.Data = Model.extend(); this.server = new Server({ environment: 'test', @@ -19,10 +44,13 @@ module('Integration | Server | create and createList', function(hooks) { contact: this.Contact, amazingContact: this.AmazingContact, post: this.Post, - author: this.Author + author: this.Author, + data: this.Data }, factories: { - contact: Factory, + contact: Factory.extend({ + name: 'Yehuda' + }), amazingContact: Factory } }); @@ -32,57 +60,104 @@ module('Integration | Server | create and createList', function(hooks) { hooks.afterEach(function() { this.server.shutdown(); + + // eslint-disable-next-line no-console + console.warn = originalWarn; }); test('create throws when passing in an undefined model', function(assert) { + expectNoWarning(assert); + assert.throws(() => { this.server.create('foo'); - }, /You called server.create\('foo'\) but no model or factory was found\. Make sure you're using the singularized version of your model\./); + }, /You called server.create\('foo'\) but no model or factory was found\./); }); - test('create throws when passing in a pluralized version of a model', function(assert) { - assert.throws(() => { - this.server.create('contacts'); - }, /You called server.create\('contacts'\) but no model or factory was found\. Make sure you're using the singularized version of your model\./); + test('create warns when passing in a pluralized version of a model', function(assert) { + assert.expect(3); + + expectWarning(assert, `server.create was intended to be used with the singularized version of the model`); + + let contact = this.server.create('contacts'); + + assert.ok(contact instanceof this.Contact, 'expected a Contact'); + assert.equal(contact.name, 'Yehuda', 'the factory is used'); }); test('create returns a Model if one is defined', function(assert) { + expectNoWarning(assert); + let contact = this.server.create('contact'); assert.ok(contact instanceof this.Contact, 'expected a Contact'); + assert.equal(contact.name, 'Yehuda', 'the factory is used'); + }); + + test('create returns a Model instance if the Model name is uncountable', function(assert) { + expectNoWarning(assert); + + Inflector.inflector.uncountable('data'); + let data = this.server.create('data'); + + assert.ok(data instanceof this.Data, 'expected a Data'); }); test('createList throws when passing in an undefined model', function(assert) { + expectNoWarning(assert); + assert.throws(() => { this.server.createList('foo', 1); - }, /You called server.createList\('foo'\) but no model or factory was found\. Make sure you're using the singularized version of your model\./); + }, /You called server.createList\('foo'\) but no model or factory was found\./); }); - test('createList throws when passing in a pluralized version of a model', function(assert) { - assert.throws(() => { - this.server.createList('contacts', 1); - }, /You called server.createList\('contacts'\) but no model or factory was found\. Make sure you're using the singularized version of your model\./); + test('createList warns when passing in a pluralized version of a model', function(assert) { + assert.expect(3); + + expectWarning(assert, `server.createList was intended to be used with the singularized version of the model`); + + let contacts = this.server.createList('contacts', 1); + + assert.ok(contacts[0] instanceof this.Contact, 'expected a Contact'); + assert.equal(contacts[0].name, 'Yehuda', 'the factory is used'); }); test('createList returns Models if one is defined', function(assert) { + expectNoWarning(); + let contacts = this.server.createList('contact', 1); assert.ok(contacts[0] instanceof this.Contact, 'expected a Contactl'); + assert.equal(contacts[0].name, 'Yehuda', 'the factory is used'); + }); + + test('createList returns Models if the model name is uncountable', function(assert) { + expectNoWarning(assert); + + Inflector.inflector.uncountable('data'); + let data = this.server.createList('data', 1); + + assert.ok(data[0] instanceof this.Data, 'expected a Data'); }); test('create returns a Model if one is defined, when using a compound name', function(assert) { + expectNoWarning(assert); + let contact = this.server.create('amazing-contact'); assert.ok(contact instanceof this.AmazingContact, 'expected an AmazingContact'); }); test('createList returns Models if one is defined, when using a compound name', function(assert) { + expectNoWarning(assert); + let contacts = this.server.createList('amazing-contact', 1); assert.ok(contacts[0] instanceof this.AmazingContact, 'expected an AmazingContact'); }); test('create falls back to a model if no factory is defined', function(assert) { + expectNoWarning(assert); + let post = this.server.create('post'); assert.ok(post instanceof this.Post); @@ -90,6 +165,8 @@ module('Integration | Server | create and createList', function(hooks) { }); test('createList falls back to a model if no factory is defined', function(assert) { + expectNoWarning(assert); + let posts = this.server.createList('post', 2); assert.ok(posts[0] instanceof this.Post); @@ -98,6 +175,8 @@ module('Integration | Server | create and createList', function(hooks) { }); test('create sets up the db correctly when passing in fks', function(assert) { + expectNoWarning(assert); + let author = server.create('author'); let post = this.server.create('post', { authorId: author.id @@ -110,6 +189,8 @@ module('Integration | Server | create and createList', function(hooks) { }); test('create sets up the db correctly when passing in models', function(assert) { + expectNoWarning(assert); + let author = server.create('author'); let post = this.server.create('post', { author From 8999b2410549aa812d96135e24f5d290711efa72 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 7 Jan 2019 09:47:19 -0500 Subject: [PATCH 268/879] fix: normalizedRequestAttrs takes a dasherized model name closes #1440 --- addon/orm/schema.js | 4 + addon/route-handlers/function.js | 13 +- .../route-handlers/function-handler-test.js | 355 ------------------ .../function-handler/basic-test.js | 121 ++++++ .../normalize-request-attrs-test.js | 207 ++++++++++ .../function-handler/serialize-test.js | 151 ++++++++ 6 files changed, 494 insertions(+), 357 deletions(-) delete mode 100644 tests/integration/route-handlers/function-handler-test.js create mode 100644 tests/integration/route-handlers/function-handler/basic-test.js create mode 100644 tests/integration/route-handlers/function-handler/normalize-request-attrs-test.js create mode 100644 tests/integration/route-handlers/function-handler/serialize-test.js diff --git a/addon/orm/schema.js b/addon/orm/schema.js index 7df97d1fa..244261a4e 100644 --- a/addon/orm/schema.js +++ b/addon/orm/schema.js @@ -275,6 +275,10 @@ export default class Schema { return _assign({}, modelClass.belongsToAssociations, modelClass.hasManyAssociations); } + hasModelForModelName(modelName) { + return this.modelFor(camelize(modelName)); + } + /* Private methods */ diff --git a/addon/route-handlers/function.js b/addon/route-handlers/function.js index 4beded7cc..b0853b14c 100644 --- a/addon/route-handlers/function.js +++ b/addon/route-handlers/function.js @@ -1,5 +1,6 @@ import BaseRouteHandler from './base'; import assert from 'ember-cli-mirage/assert'; +import { dasherize, camelize } from 'ember-cli-mirage/utils/inflector'; export default class FunctionRouteHandler extends BaseRouteHandler { @@ -46,10 +47,18 @@ export default class FunctionRouteHandler extends BaseRouteHandler { if (/x-www-form-urlencoded/.test(lowerCaseHeaders['content-type'])) { attrs = this._getAttrsForFormRequest(request); } else { - modelName = modelName || this.getModelClassFromPath(path); + if (modelName) { + if (dasherize(modelName) !== modelName) { + // eslint-disable-next-line no-console + console.warn(`Mirage [deprecation]: You called normalizedRequestAttrs('${modelName}'), but normalizedRequestAttrs was intended to be used with the dasherized version of the model type. Please change this to normalizedRequestAttrs('${dasherize(modelName)}'). This behavior will be removed in 1.0.`); + modelName = camelize(modelName); + } + } else { + modelName = this.getModelClassFromPath(path); + } assert( - this.schema.modelFor(modelName), + this.schema.hasModelForModelName(modelName), `You're using a shorthand or the #normalizedRequestAttrs helper but the detected model of '${modelName}' does not exist. You might need to pass in the correct modelName as the first argument to #normalizedRequestAttrs.` ); diff --git a/tests/integration/route-handlers/function-handler-test.js b/tests/integration/route-handlers/function-handler-test.js deleted file mode 100644 index df727a8e2..000000000 --- a/tests/integration/route-handlers/function-handler-test.js +++ /dev/null @@ -1,355 +0,0 @@ -import { module, test } from 'qunit'; -import { Promise } from 'rsvp'; - -import { Model, Collection, ActiveModelSerializer, Response } from 'ember-cli-mirage'; -import Server from 'ember-cli-mirage/server'; -import _uniqBy from 'lodash/uniqBy'; -import promiseAjax from '../../helpers/promise-ajax'; - -module('Integration | Route handlers | Function handler', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'development', - models: { - user: Model.extend({ - }) - }, - serializers: { - application: ActiveModelSerializer, - sparseUser: ActiveModelSerializer.extend({ - attrs: ['id', 'name', 'tall'] - }) - } - }); - this.server.timing = 0; - this.server.logging = false; - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('a meaningful error is thrown if a custom route handler throws an error', async function(assert) { - assert.expect(1); - - this.server.get('/users', function() { - throw 'I goofed'; - }); - - try { - await promiseAjax({ - method: 'GET', - url: '/users' - }); - } catch(e) { - assert.equal( - e.xhr.responseText, - 'Mirage: Your GET handler for the url /users threw an error: I goofed' - ); - } - }); - - test('mirage response string is not serialized to string', async function(assert) { - assert.expect(1); - - this.server.get('/users', function() { - return new Response(200, { 'Content-Type': 'text/csv' }, 'firstname,lastname\nbob,dylon'); - }); - - let { data } = await promiseAjax({ method: 'GET', url: '/users' }); - assert.equal(data, 'firstname,lastname\nbob,dylon'); - }); - - test('it can return a promise with non-serializable content', async function(assert) { - assert.expect(1); - - this.server.get('/users', function() { - return new Promise(resolve => { - resolve(new Response(200, { 'Content-Type': 'text/csv' }, 'firstname,lastname\nbob,dylan')); - }); - }); - - let { data } = await promiseAjax({ method: 'GET', url: '/users' }); - assert.equal(data, 'firstname,lastname\nbob,dylan'); - }); - - test('it can return a promise with serializable content', async function(assert) { - assert.expect(1); - - let user = this.server.create('user', { name: 'Sam' }); - - this.server.get('/users', function(schema) { - return new Promise(resolve => { - resolve(schema.users.all()); - }); - }); - - let { data } = await promiseAjax({ method: 'GET', url: '/users' }); - assert.deepEqual(data, { users: [ { id: user.id, name: 'Sam' } ] }); - }); - - test('it can return a promise with an empty string', async function(assert) { - assert.expect(4); - - this.server.get('/users', function() { - return new Promise(resolve => { - resolve(new Response(200, { 'Content-Type': 'text/csv' }, '')); - }); - }); - - let { data, xhr } = await promiseAjax({ method: 'GET', url: '/users' }); - - assert.deepEqual(data, ''); - assert.equal(xhr.responseText, ""); - assert.equal(xhr.status, 200); - assert.equal(xhr.getAllResponseHeaders().trim(), "Content-Type: text/csv"); - }); - - test(`it can serialize a POJA of models`, async function(assert) { - assert.expect(1); - - this.server.createList('user', 3); - this.server.get('/users', (schema) => { - return schema.users.all().models; - }); - - let { data } = await promiseAjax({ - method: 'GET', - url: '/users' - }); - - assert.deepEqual(data, [{ id: '1' }, { id: '2' }, { id: '3' }]); - }); - - test('#serialize uses the default serializer on a model', async function(assert) { - assert.expect(1); - - this.server.create('user', { name: 'Sam' }); - - this.server.get('/users', function(schema) { - let user = this.schema.users.first(); - let json = this.serialize(user); - - assert.deepEqual(json, { - user: { - id: '1', - name: 'Sam' - } - }); - - return true; - }); - - await promiseAjax({ method: 'GET', url: '/users' }); - }); - - test('#serialize uses the default serializer on a collection', async function(assert) { - assert.expect(1); - - this.server.create('user', { name: 'Sam' }); - - this.server.get('/users', function(schema) { - let users = this.schema.users.all(); - let json = this.serialize(users); - - assert.deepEqual(json, { - users: [ - { id: '1', name: 'Sam' } - ] - }); - - return true; - }); - - await promiseAjax({ method: 'GET', url: '/users' }); - }); - - test('#serialize takes an optional serializer type', async function(assert) { - assert.expect(1); - - this.server.create('user', { name: 'Sam', tall: true, evil: false }); - this.server.create('user', { name: 'Ganondorf', tall: true, evil: true }); - - this.server.get('/users', function(schema) { - let users = schema.users.all(); - let json = this.serialize(users, 'sparse-user'); - - assert.deepEqual(json, { - users: [ - { id: '1', name: 'Sam', tall: true }, - { id: '2', name: 'Ganondorf', tall: true } - ] - }); - - return true; - }); - - await promiseAjax({ method: 'GET', url: '/users' }); - }); - - test('#serialize throws an error when trying to specify a serializer that doesnt exist', async function(assert) { - assert.expect(1); - - this.server.create('user', { name: 'Sam' }); - - this.server.get('/users', function(schema) { - let users = schema.users.all(); - - assert.throws(() => { - this.serialize(users, 'foo-user'); - }, /that serializer doesn't exist/); - }); - - await promiseAjax({ method: 'GET', url: '/users' }); - }); - - test('#serialize noops on plain JS arrays', async function(assert) { - assert.expect(1); - - this.server.create('user', { name: 'Sam' }); - this.server.create('user', { name: 'Ganondorf' }); - - this.server.get('/users', function(schema) { - let names = schema.users.all().models.map(user => user.name); - let json = this.serialize(names); - - assert.deepEqual(json, names); - }); - - await promiseAjax({ method: 'GET', url: '/users' }); - }); - - test('#serialize on a Collection takes an optional serializer type', async function(assert) { - assert.expect(1); - - this.server.create('user', { name: 'Sam', tall: true, evil: false }); - this.server.create('user', { name: 'Sam', tall: true, evil: false }); - this.server.create('user', { name: 'Ganondorf', tall: true, evil: true }); - - this.server.get('/users', function(schema) { - let users = schema.users.all().models; - let uniqueNames = _uniqBy(users, 'name'); - let collection = new Collection('user', uniqueNames); - let json = this.serialize(collection, 'sparse-user'); - - assert.deepEqual(json, { - users: [ - { id: '1', name: 'Sam', tall: true }, - { id: '3', name: 'Ganondorf', tall: true } - ] - }); - }); - - await promiseAjax({ method: 'GET', url: '/users' }); - }); - - test(`#normalizedRequestAttrs returns an object with the primary resource's attrs and belongsTo keys camelized`, async function(assert) { - assert.expect(1); - - this.server.post('/users', function() { - let attrs = this.normalizedRequestAttrs(); - - assert.deepEqual(attrs, { - firstName: 'Sam', - lastName: 'Selikoff', - teamId: 1 - }); - - return {}; - }); - - await promiseAjax({ - method: 'POST', - url: '/users', - contentType: 'application/json', - data: JSON.stringify({ - user: { - first_name: 'Sam', - last_name: 'Selikoff', - team_id: 1 - } - }) - }); - }); - - test(`#normalizedRequestAttrs shows a meaningful error message if it cannot infer the modelname from the URL`, async function(assert) { - assert.expect(1); - - this.server.post('/users/create', function() { - assert.throws(() => { - this.normalizedRequestAttrs(); - }, /the detected model of 'create' does not exist/); - - return {}; - }); - - await promiseAjax({ - method: 'POST', - url: '/users/create', - contentType: 'application/json', - data: JSON.stringify({ - user: { - first_name: 'Sam', - last_name: 'Selikoff', - team_id: 1 - } - }) - }); - }); - - test(`#normalizedRequestAttrs accepts an optional modelName if it cannot be inferred from the path `, async function(assert) { - assert.expect(1); - - this.server.post('/users/create', function() { - let attrs = this.normalizedRequestAttrs('user'); - - assert.deepEqual(attrs, { - firstName: 'Sam', - lastName: 'Selikoff', - teamId: 1 - }); - - return {}; - }); - - await promiseAjax({ - method: 'POST', - url: '/users/create', - contentType: 'application/json', - data: JSON.stringify({ - user: { - first_name: 'Sam', - last_name: 'Selikoff', - team_id: 1 - } - }) - }); - }); - - test(`#normalizedRequestAttrs works with a form encoded request that has a lower-case content-type (issue 1398)`, async function(assert) { - assert.expect(1); - - this.server.post('/form-test', function() { - // Easiest way I could figure out to change the capitalization of the Content-Type header. Tried - // to do this from the Ajax side but jquery kept capitalizing the header. - this.request.requestHeaders['content-type'] = this.request.requestHeaders['Content-Type']; - delete this.request.requestHeaders['Content-Type']; - - let attrs = this.normalizedRequestAttrs('user'); - - assert.deepEqual(attrs, { - name: 'Sam Selikoff', - company: 'TED', - email: 'sam.selikoff@gmail.com' - }); - - return {}; - }); - - await promiseAjax({ - method: 'POST', - url: '/form-test', - data: 'name=Sam+Selikoff&company=TED&email=sam.selikoff@gmail.com' - }); - }); -}); diff --git a/tests/integration/route-handlers/function-handler/basic-test.js b/tests/integration/route-handlers/function-handler/basic-test.js new file mode 100644 index 000000000..2612324d7 --- /dev/null +++ b/tests/integration/route-handlers/function-handler/basic-test.js @@ -0,0 +1,121 @@ +import { module, test } from 'qunit'; +import { Promise } from 'rsvp'; +import { Model, ActiveModelSerializer, Response } from 'ember-cli-mirage'; +import Server from 'ember-cli-mirage/server'; +import promiseAjax from '../../../helpers/promise-ajax'; + +module('Integration | Route handlers | Function handler', function(hooks) { + hooks.beforeEach(function() { + this.server = new Server({ + environment: 'development', + models: { + user: Model.extend({ + }) + }, + serializers: { + application: ActiveModelSerializer, + sparseUser: ActiveModelSerializer.extend({ + attrs: ['id', 'name', 'tall'] + }) + } + }); + this.server.timing = 0; + this.server.logging = false; + }); + + hooks.afterEach(function() { + this.server.shutdown(); + }); + + test('a meaningful error is thrown if a custom route handler throws an error', async function(assert) { + assert.expect(1); + + this.server.get('/users', function() { + throw 'I goofed'; + }); + + try { + await promiseAjax({ + method: 'GET', + url: '/users' + }); + } catch(e) { + assert.equal( + e.xhr.responseText, + 'Mirage: Your GET handler for the url /users threw an error: I goofed' + ); + } + }); + + test('mirage response string is not serialized to string', async function(assert) { + assert.expect(1); + + this.server.get('/users', function() { + return new Response(200, { 'Content-Type': 'text/csv' }, 'firstname,lastname\nbob,dylon'); + }); + + let { data } = await promiseAjax({ method: 'GET', url: '/users' }); + assert.equal(data, 'firstname,lastname\nbob,dylon'); + }); + + test('it can return a promise with non-serializable content', async function(assert) { + assert.expect(1); + + this.server.get('/users', function() { + return new Promise(resolve => { + resolve(new Response(200, { 'Content-Type': 'text/csv' }, 'firstname,lastname\nbob,dylan')); + }); + }); + + let { data } = await promiseAjax({ method: 'GET', url: '/users' }); + assert.equal(data, 'firstname,lastname\nbob,dylan'); + }); + + test('it can return a promise with serializable content', async function(assert) { + assert.expect(1); + + let user = this.server.create('user', { name: 'Sam' }); + + this.server.get('/users', function(schema) { + return new Promise(resolve => { + resolve(schema.users.all()); + }); + }); + + let { data } = await promiseAjax({ method: 'GET', url: '/users' }); + assert.deepEqual(data, { users: [ { id: user.id, name: 'Sam' } ] }); + }); + + test('it can return a promise with an empty string', async function(assert) { + assert.expect(4); + + this.server.get('/users', function() { + return new Promise(resolve => { + resolve(new Response(200, { 'Content-Type': 'text/csv' }, '')); + }); + }); + + let { data, xhr } = await promiseAjax({ method: 'GET', url: '/users' }); + + assert.deepEqual(data, ''); + assert.equal(xhr.responseText, ""); + assert.equal(xhr.status, 200); + assert.equal(xhr.getAllResponseHeaders().trim(), "Content-Type: text/csv"); + }); + + test(`it can serialize a POJA of models`, async function(assert) { + assert.expect(1); + + this.server.createList('user', 3); + this.server.get('/users', (schema) => { + return schema.users.all().models; + }); + + let { data } = await promiseAjax({ + method: 'GET', + url: '/users' + }); + + assert.deepEqual(data, [{ id: '1' }, { id: '2' }, { id: '3' }]); + }); +}); diff --git a/tests/integration/route-handlers/function-handler/normalize-request-attrs-test.js b/tests/integration/route-handlers/function-handler/normalize-request-attrs-test.js new file mode 100644 index 000000000..411359b09 --- /dev/null +++ b/tests/integration/route-handlers/function-handler/normalize-request-attrs-test.js @@ -0,0 +1,207 @@ +import { module, test } from 'qunit'; +import { Model, ActiveModelSerializer } from 'ember-cli-mirage'; +import Server from 'ember-cli-mirage/server'; +import promiseAjax from '../../../helpers/promise-ajax'; + +// eslint-disable-next-line no-console +let originalWarn = console.warn; + +function expectWarning(assert, warning) { + if (!warning) { + assert.ok(false, 'You must pass in a message when expecting a warning'); + } + + // eslint-disable-next-line no-console + console.warn = message => { + let re = new RegExp(warning.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')); + + assert.ok(re.test(message), 'the correct warning message was logged'); + }; +} + +module('Integration | Route handlers | Function handler | #normalizedRequestAttrs', function(hooks) { + hooks.beforeEach(function() { + this.server = new Server({ + environment: 'development', + models: { + user: Model.extend({ + }), + fineComment: Model.extend({ + }) + }, + serializers: { + application: ActiveModelSerializer + } + }); + this.server.timing = 0; + this.server.logging = false; + }); + + hooks.afterEach(function() { + this.server.shutdown(); + + // eslint-disable-next-line no-console + console.warn = originalWarn; + }); + + test(`it returns an object with the primary resource's attrs and belongsTo keys camelized`, async function(assert) { + assert.expect(1); + + this.server.post('/users', function() { + let attrs = this.normalizedRequestAttrs(); + + assert.deepEqual(attrs, { + firstName: 'Sam', + lastName: 'Selikoff', + teamId: 1 + }); + + return {}; + }); + + await promiseAjax({ + method: 'POST', + url: '/users', + contentType: 'application/json', + data: JSON.stringify({ + user: { + first_name: 'Sam', + last_name: 'Selikoff', + team_id: 1 + } + }) + }); + }); + + test(`it works for compound names`, async function(assert) { + assert.expect(1); + + this.server.post('/fine-comments', function() { + let attrs = this.normalizedRequestAttrs(); + + assert.deepEqual(attrs, { + shortText: 'lorem ipsum' + }); + + return {}; + }); + + await promiseAjax({ + method: 'POST', + url: '/fine-comments', + contentType: 'application/json', + data: JSON.stringify({ + fine_comment: { + short_text: 'lorem ipsum' + } + }) + }); + }); + + test(`it shows a meaningful error message if it cannot infer the modelname from the URL`, async function(assert) { + assert.expect(1); + + this.server.post('/users/create', function() { + assert.throws(() => { + this.normalizedRequestAttrs(); + }, /the detected model of 'create' does not exist/); + + return {}; + }); + + await promiseAjax({ + method: 'POST', + url: '/users/create', + contentType: 'application/json', + data: JSON.stringify({ + user: { + first_name: 'Sam', + last_name: 'Selikoff', + team_id: 1 + } + }) + }); + }); + + test(`it accepts an optional modelName if it cannot be inferred from the path `, async function(assert) { + assert.expect(1); + + this.server.post('/users/create', function() { + let attrs = this.normalizedRequestAttrs('user'); + + assert.deepEqual(attrs, { + firstName: 'Sam', + lastName: 'Selikoff', + teamId: 1 + }); + + return {}; + }); + + await promiseAjax({ + method: 'POST', + url: '/users/create', + contentType: 'application/json', + data: JSON.stringify({ + user: { + first_name: 'Sam', + last_name: 'Selikoff', + team_id: 1 + } + }) + }); + }); + + test(`it warns if the optional parameter is camelized for a model with a compount name`, async function(assert) { + assert.expect(2); + expectWarning(assert, `but normalizedRequestAttrs was intended to be used with the dasherized version of the model type`); + + this.server.post('/fine-comments/create', function() { + let attrs = this.normalizedRequestAttrs('fineComment'); + + assert.deepEqual(attrs, { + shortText: 'lorem ipsum' + }); + + return {}; + }); + + await promiseAjax({ + method: 'POST', + url: '/fine-comments/create', + contentType: 'application/json', + data: JSON.stringify({ + user: { + short_text: 'lorem ipsum' + } + }) + }); + }); + + test(`it works with a form encoded request that has a lower-case content-type (issue 1398)`, async function(assert) { + assert.expect(1); + + this.server.post('/form-test', function() { + // Easiest way I could figure out to change the capitalization of the Content-Type header. Tried + // to do this from the Ajax side but jquery kept capitalizing the header. + this.request.requestHeaders['content-type'] = this.request.requestHeaders['Content-Type']; + delete this.request.requestHeaders['Content-Type']; + + let attrs = this.normalizedRequestAttrs('user'); + + assert.deepEqual(attrs, { + name: 'Sam Selikoff', + company: 'TED', + email: 'sam.selikoff@gmail.com' + }); + + return {}; + }); + + await promiseAjax({ + method: 'POST', + url: '/form-test', + data: 'name=Sam+Selikoff&company=TED&email=sam.selikoff@gmail.com' + }); + }); +}); diff --git a/tests/integration/route-handlers/function-handler/serialize-test.js b/tests/integration/route-handlers/function-handler/serialize-test.js new file mode 100644 index 000000000..ce8419dca --- /dev/null +++ b/tests/integration/route-handlers/function-handler/serialize-test.js @@ -0,0 +1,151 @@ +import { module, test } from 'qunit'; +import { Model, Collection, ActiveModelSerializer } from 'ember-cli-mirage'; +import Server from 'ember-cli-mirage/server'; +import _uniqBy from 'lodash/uniqBy'; +import promiseAjax from '../../../helpers/promise-ajax'; + +module('Integration | Route handlers | Function handler | #serialize', function(hooks) { + hooks.beforeEach(function() { + this.server = new Server({ + environment: 'development', + models: { + user: Model.extend({ + }) + }, + serializers: { + application: ActiveModelSerializer, + sparseUser: ActiveModelSerializer.extend({ + attrs: ['id', 'name', 'tall'] + }) + } + }); + this.server.timing = 0; + this.server.logging = false; + }); + + hooks.afterEach(function() { + this.server.shutdown(); + }); + + test('it uses the default serializer on a model', async function(assert) { + assert.expect(1); + + this.server.create('user', { name: 'Sam' }); + + this.server.get('/users', function(schema) { + let user = this.schema.users.first(); + let json = this.serialize(user); + + assert.deepEqual(json, { + user: { + id: '1', + name: 'Sam' + } + }); + + return true; + }); + + await promiseAjax({ method: 'GET', url: '/users' }); + }); + + test('it uses the default serializer on a collection', async function(assert) { + assert.expect(1); + + this.server.create('user', { name: 'Sam' }); + + this.server.get('/users', function(schema) { + let users = this.schema.users.all(); + let json = this.serialize(users); + + assert.deepEqual(json, { + users: [ + { id: '1', name: 'Sam' } + ] + }); + + return true; + }); + + await promiseAjax({ method: 'GET', url: '/users' }); + }); + + test('it takes an optional serializer type', async function(assert) { + assert.expect(1); + + this.server.create('user', { name: 'Sam', tall: true, evil: false }); + this.server.create('user', { name: 'Ganondorf', tall: true, evil: true }); + + this.server.get('/users', function(schema) { + let users = schema.users.all(); + let json = this.serialize(users, 'sparse-user'); + + assert.deepEqual(json, { + users: [ + { id: '1', name: 'Sam', tall: true }, + { id: '2', name: 'Ganondorf', tall: true } + ] + }); + + return true; + }); + + await promiseAjax({ method: 'GET', url: '/users' }); + }); + + test('it throws an error when trying to specify a serializer that doesnt exist', async function(assert) { + assert.expect(1); + + this.server.create('user', { name: 'Sam' }); + + this.server.get('/users', function(schema) { + let users = schema.users.all(); + + assert.throws(() => { + this.serialize(users, 'foo-user'); + }, /that serializer doesn't exist/); + }); + + await promiseAjax({ method: 'GET', url: '/users' }); + }); + + test('it noops on plain JS arrays', async function(assert) { + assert.expect(1); + + this.server.create('user', { name: 'Sam' }); + this.server.create('user', { name: 'Ganondorf' }); + + this.server.get('/users', function(schema) { + let names = schema.users.all().models.map(user => user.name); + let json = this.serialize(names); + + assert.deepEqual(json, names); + }); + + await promiseAjax({ method: 'GET', url: '/users' }); + }); + + test('it can take an optional serializer type on a Collection', async function(assert) { + assert.expect(1); + + this.server.create('user', { name: 'Sam', tall: true, evil: false }); + this.server.create('user', { name: 'Sam', tall: true, evil: false }); + this.server.create('user', { name: 'Ganondorf', tall: true, evil: true }); + + this.server.get('/users', function(schema) { + let users = schema.users.all().models; + let uniqueNames = _uniqBy(users, 'name'); + let collection = new Collection('user', uniqueNames); + let json = this.serialize(collection, 'sparse-user'); + + assert.deepEqual(json, { + users: [ + { id: '1', name: 'Sam', tall: true }, + { id: '3', name: 'Ganondorf', tall: true } + ] + }); + }); + + await promiseAjax({ method: 'GET', url: '/users' }); + }); +}); From 64599b621d3e63a0218038277c03aa6412ba37d6 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 7 Jan 2019 11:07:18 -0500 Subject: [PATCH 269/879] v0.4.11 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 63dbbc2f1..1c4dc42e1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "0.4.10", + "version": "0.4.11", "description": "A client-side HTTP server to develop, test and demo your Ember app", "keywords": [ "ember-addon", From 4c26ba6222ea4ce6dfa6bcecce1860373f621ccb Mon Sep 17 00:00:00 2001 From: Peter Wagenet Date: Mon, 7 Jan 2019 13:42:23 -0800 Subject: [PATCH 270/879] Improve automatic response type setting (#1454) Simplifies checking for blank response to merely change to 200 when the response type would have been a 204 and the response is not undefined or an empty string. This also matches the heuristic in the 204-non-empty-payload warning. --- addon/route-handler.js | 11 +++-------- tests/integration/server/falsy-responses-test.js | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/addon/route-handler.js b/addon/route-handler.js index ab65fa14a..d5a8709c3 100644 --- a/addon/route-handler.js +++ b/addon/route-handler.js @@ -1,4 +1,4 @@ -import { isBlank, typeOf } from '@ember/utils'; +import { typeOf } from '@ember/utils'; import { Promise } from 'rsvp'; import { MirageError } from 'ember-cli-mirage/assert'; @@ -11,12 +11,6 @@ import PutShorthandHandler from './route-handlers/shorthands/put'; import DeleteShorthandHandler from './route-handlers/shorthands/delete'; import HeadShorthandHandler from './route-handlers/shorthands/head'; -function isNotBlankResponse(response) { - return response - && !(typeOf(response) === 'object' && Object.keys(response).length === 0) - && (Array.isArray(response) || !isBlank(response)); -} - const DEFAULT_CODES = { get: 200, put: 204, post: 201, 'delete': 204 }; function createHandler({ verb, schema, serializerOrRegistry, path, rawHandler, options }) { @@ -111,7 +105,8 @@ export default class RouteHandler { code = this.customizedCode; } else { code = DEFAULT_CODES[this.verb]; - if (code === 204 && isNotBlankResponse(response)) { + // Returning any data for a 204 is invalid + if (code === 204 && response !== undefined && response !== '') { code = 200; } } diff --git a/tests/integration/server/falsy-responses-test.js b/tests/integration/server/falsy-responses-test.js index dc6d256a7..06a31ff2e 100644 --- a/tests/integration/server/falsy-responses-test.js +++ b/tests/integration/server/falsy-responses-test.js @@ -62,4 +62,20 @@ module('Integration | Server | Falsy responses', function(hooks) { assert.equal(xhr.status, 200); assert.equal(xhr.getAllResponseHeaders().trim(), "Content-Type: application/json"); }); + + test('empty object PUT response returns an empty object', async function(assert) { + this.server.put('/example', function() { + return {}; + }); + + let { data, xhr } = await promiseAjax({ + method: 'PUT', + url: '/example' + }); + + assert.deepEqual(data, {}); + assert.equal(xhr.responseText, "{}"); + assert.equal(xhr.status, 200); + assert.equal(xhr.getAllResponseHeaders().trim(), "Content-Type: application/json"); + }); }); From 22ffb2aedfe65bf95adb2f45832a4a841aa4022a Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 7 Jan 2019 16:43:02 -0500 Subject: [PATCH 271/879] v0.4.12 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1c4dc42e1..16802190e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "0.4.11", + "version": "0.4.12", "description": "A client-side HTTP server to develop, test and demo your Ember app", "keywords": [ "ember-addon", From ea72a1e5798d91962161b360baec463870921108 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 15 Jan 2019 16:51:44 -0500 Subject: [PATCH 272/879] Remove old test-apps folder --- test-apps/basic-app/node_modules/.bin | 1 - test-apps/basic-app/node_modules/ember-cli-mirage | 1 - 2 files changed, 2 deletions(-) delete mode 120000 test-apps/basic-app/node_modules/.bin delete mode 120000 test-apps/basic-app/node_modules/ember-cli-mirage diff --git a/test-apps/basic-app/node_modules/.bin b/test-apps/basic-app/node_modules/.bin deleted file mode 120000 index 1dedf1a6f..000000000 --- a/test-apps/basic-app/node_modules/.bin +++ /dev/null @@ -1 +0,0 @@ -../../../node_modules/.bin \ No newline at end of file diff --git a/test-apps/basic-app/node_modules/ember-cli-mirage b/test-apps/basic-app/node_modules/ember-cli-mirage deleted file mode 120000 index a8a4f8c21..000000000 --- a/test-apps/basic-app/node_modules/ember-cli-mirage +++ /dev/null @@ -1 +0,0 @@ -../../.. \ No newline at end of file From 8f310531a91de8a4836f39a8d5fab0b651d12e04 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 15 Jan 2019 16:53:47 -0500 Subject: [PATCH 273/879] Fix server error from merge --- addon/server.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addon/server.js b/addon/server.js index 851f8cb34..7f9799652 100644 --- a/addon/server.js +++ b/addon/server.js @@ -692,9 +692,9 @@ export default class Server { // When there is a Model defined, we should return an instance // of it instead of returning the bare attributes. - let traits = traitsAndOverrides.filter((arg) => arg && typeof arg === 'string'); - let overrides = _find(traitsAndOverrides, (arg) => _isPlainObject(arg)); - let collectionFromCreateList = _find(traitsAndOverrides, (arg) => arg && Array.isArray(arg)); + let traits = options.filter((arg) => arg && typeof arg === 'string'); + let overrides = _find(options, (arg) => _isPlainObject(arg)); + let collectionFromCreateList = _find(options, (arg) => arg && Array.isArray(arg)); let attrs = this.build(type, ...traits, overrides); let modelOrRecord; From e56d10f23443ccbe7c51dee90a5bb72c242d8150 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 15 Jan 2019 16:55:07 -0500 Subject: [PATCH 274/879] Hide new private method --- addon/server.js | 1 + 1 file changed, 1 insertion(+) diff --git a/addon/server.js b/addon/server.js index 7f9799652..5f32e0eaa 100644 --- a/addon/server.js +++ b/addon/server.js @@ -1006,6 +1006,7 @@ export default class Server { /** * * @private + * @hide */ _modelOrFactoryExistsForTypeOrCollectionName(typeOrCollectionName) { // Need this, since singular or plural can be passed in. Can assume singular (type) in 1.0. From 8ed08396e6d2d77c86dfc36a12f3edc228fedc4a Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 16 Jan 2019 07:21:38 -0500 Subject: [PATCH 275/879] Upgrade third-party deps * Bump forwards-compat packages * Remove babel-eslint * Remove broccoli-test-helpers * Remove ember-app-version * Remove ember cli release * Remove ember-fastboot-addon-tests * Remove mocha/chai * Upgrade qunit-dom * Bump broccoli libs, drop chalk * Upgrade jsdom --- .eslintrc.js | 1 - blueprints/ember-cli-mirage/index.js | 1 - package.json | 28 +- yarn.lock | 2516 +++++++++++++++++--------- 4 files changed, 1647 insertions(+), 899 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index b0ab1872c..62e5a2bc5 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,6 +1,5 @@ module.exports = { root: true, - parser: 'babel-eslint', parserOptions: { ecmaVersion: 2017, sourceType: 'module' diff --git a/blueprints/ember-cli-mirage/index.js b/blueprints/ember-cli-mirage/index.js index 6a86d33ea..467308226 100644 --- a/blueprints/ember-cli-mirage/index.js +++ b/blueprints/ember-cli-mirage/index.js @@ -4,7 +4,6 @@ var path = require('path'); var fs = require('fs'); -var chalk = require('chalk'); var EOL = require('os').EOL; module.exports = { diff --git a/package.json b/package.json index 16802190e..8be6a89df 100644 --- a/package.json +++ b/package.json @@ -36,45 +36,38 @@ "dependencies": { "@xg-wang/whatwg-fetch": "^3.0.0", "broccoli-file-creator": "^2.1.1", - "broccoli-funnel": "^1.0.2", - "broccoli-merge-trees": "^1.1.0", - "broccoli-stew": "^1.5.0", - "chalk": "^1.1.1", + "broccoli-funnel": "^2.0.1", + "broccoli-merge-trees": "^3.0.2", + "broccoli-stew": "^2.0.1", "ember-cli-babel": "^6.8.2", "ember-cli-node-assets": "^0.2.2", "ember-get-config": "^0.2.2", "ember-inflector": "^2.0.0 || ^3.0.0", - "ember-lodash": "^4.17.3", + "ember-lodash": "^4.19.4", "fake-xml-http-request": "^2.0.0", "faker": "^3.0.0", - "jsdom": "^11.12.0", - "pretender": "2.1.0", + "jsdom": "^13.1.0", + "pretender": "2.1.1", "route-recognizer": "^0.3.4" }, "devDependencies": { "active-model-adapter": "^2.0.3", - "babel-eslint": "^8.2.6", "broccoli-asset-rev": "^2.4.5", - "broccoli-test-helper": "^1.3.0", - "chai": "^4.1.0", "ember-ajax": "^3.0.0", "ember-cli": "~2.18.2", - "ember-cli-app-version": "^2.0.0", "ember-cli-dependency-checker": "^2.0.0", "ember-cli-eslint": "^4.2.1", "ember-cli-fastboot": "^1.1.4-beta.1", "ember-cli-htmlbars": "^2.0.1", "ember-cli-htmlbars-inline-precompile": "^1.0.0", "ember-cli-inject-live-reload": "^1.4.1", - "ember-cli-qunit": "^4.1.1", - "ember-cli-release": "^0.2.9", + "ember-cli-qunit": "^4.4.0", "ember-cli-shims": "^1.2.0", "ember-cli-sri": "^2.1.0", - "ember-cli-uglify": "^2.0.0", + "ember-cli-uglify": "^2.1.0", "ember-data": "~2.13.0", "ember-disable-prototype-extensions": "^1.1.2", "ember-export-application-global": "^2.0.0", - "ember-fastboot-addon-tests": "^0.4.0", "ember-load-initializers": "^1.0.0", "ember-resolver": "^4.0.0", "ember-source": "~2.18.0", @@ -82,9 +75,8 @@ "eslint-plugin-ember-suave": "^1.0.0", "eslint-plugin-node": "^6.0.1", "fastboot": "^1.2.0", - "loader.js": "^4.2.3", - "mocha": "^3.4.2", - "qunit-dom": "^0.5.0" + "loader.js": "^4.7.0", + "qunit-dom": "^0.8.4" }, "engines": { "node": "6.* || >= 7.*" diff --git a/yarn.lock b/yarn.lock index cd2ca661e..34d14881c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,98 +2,603 @@ # yarn lockfile v1 -"@babel/code-frame@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" - integrity sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g== - dependencies: - "@babel/highlight" "7.0.0-beta.44" +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/core@^7.0.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.2.2.tgz#07adba6dde27bb5ad8d8672f15fde3e08184a687" + integrity sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.2.2" + "@babel/helpers" "^7.2.0" + "@babel/parser" "^7.2.2" + "@babel/template" "^7.2.2" + "@babel/traverse" "^7.2.2" + "@babel/types" "^7.2.2" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.10" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" -"@babel/generator@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" - integrity sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ== +"@babel/generator@^7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.2.2.tgz#18c816c70962640eab42fe8cae5f3947a5c65ccc" + integrity sha512-I4o675J/iS8k+P38dvJ3IBGqObLXyQLTxtrR4u9cSUJOURvafeEWb/pFMOTwtNrmq73mJzyF6ueTbO1BtN0Zeg== dependencies: - "@babel/types" "7.0.0-beta.44" + "@babel/types" "^7.2.2" jsesc "^2.5.1" - lodash "^4.2.0" + lodash "^4.17.10" source-map "^0.5.0" trim-right "^1.0.1" -"@babel/helper-function-name@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" - integrity sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg== +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-call-delegate@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz#6a957f105f37755e8645343d3038a22e1449cc4a" + integrity sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ== + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-define-map@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c" + integrity sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.0.0" + lodash "^4.17.10" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" + integrity sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.1.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz#ab2f8e8d231409f8370c883d20c335190284b963" + integrity sha512-YRD7I6Wsv+IHuTPkAmAS4HhY0dkPobgLftHp0cRGZSdrRvmZY8rFvae/GVu3bD00qscuvK3WPHB3YdNpBXUqrA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/template" "^7.2.2" + "@babel/types" "^7.2.2" + lodash "^4.17.10" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0.tgz#2c1718923b57f9bbe64705ffe5640ac64d9bdb27" + integrity sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg== + dependencies: + lodash "^4.17.10" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.1.0": + version "7.2.3" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.2.3.tgz#19970020cf22677d62b3a689561dbd9644d8c5e5" + integrity sha512-GyieIznGUfPXPWu0yLS6U55Mz67AZD9cUk0BfirOWlPrXlBcan9Gz+vHGz+cPfuoweZSnPzPIm67VtQM0OWZbA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.2.3" + "@babel/types" "^7.0.0" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" + integrity sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag== dependencies: - "@babel/helper-get-function-arity" "7.0.0-beta.44" - "@babel/template" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" + "@babel/types" "^7.0.0" -"@babel/helper-get-function-arity@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" - integrity sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw== +"@babel/helper-wrap-function@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== dependencies: - "@babel/types" "7.0.0-beta.44" + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.2.0" -"@babel/helper-split-export-declaration@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" - integrity sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA== +"@babel/helpers@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.2.0.tgz#8335f3140f3144270dc63c4732a4f8b0a50b7a21" + integrity sha512-Fr07N+ea0dMcMN8nFpuK6dUIT7/ivt9yKQdEEnjVS83tG2pHwPi03gYmk/tyuwONnZ+sY+GFFPlWGgCtW1hF9A== dependencies: - "@babel/types" "7.0.0-beta.44" + "@babel/template" "^7.1.2" + "@babel/traverse" "^7.1.5" + "@babel/types" "^7.2.0" -"@babel/highlight@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" - integrity sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ== +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== dependencies: chalk "^2.0.0" esutils "^2.0.2" - js-tokens "^3.0.0" + js-tokens "^4.0.0" -"@babel/template@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" - integrity sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng== - dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" - lodash "^4.2.0" - -"@babel/traverse@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" - integrity sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA== - dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/generator" "7.0.0-beta.44" - "@babel/helper-function-name" "7.0.0-beta.44" - "@babel/helper-split-export-declaration" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" - debug "^3.1.0" +"@babel/parser@^7.2.2", "@babel/parser@^7.2.3": + version "7.2.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.2.3.tgz#32f5df65744b70888d17872ec106b02434ba1489" + integrity sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA== + +"@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" + integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + +"@babel/plugin-proposal-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" + integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.2.0.tgz#88f5fec3e7ad019014c97f7ee3c992f0adbf7fb8" + integrity sha512-1L5mWLSvR76XYUQJXkd/EEQgjq8HHRP6lQuZTTg0VA4tTGPpGemmCdAfQIz1rzEuWAm+ecP8PyyEm30jC1eQCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz#abe7281fe46c95ddc143a65e5358647792039520" + integrity sha512-LvRVYb7kikuOtIoUeWTkOxQEV1kYvL5B6U3iWEGCzPNRus1MzJweFqORTj+0jkxozkTSYNJozPOddxmqdqsRpw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.2.0" + +"@babel/plugin-syntax-async-generators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" + integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" + integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" + integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.2.0.tgz#68b8a438663e88519e65b776f8938f3445b1a2ff" + integrity sha512-CEHzg4g5UraReozI9D4fblBYABs7IM6UerAVG7EJVrTLC5keh00aEuLUT+O40+mJCEzaXkYfTCUKIyeDfMOFFQ== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" + integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.2.0.tgz#f17c49d91eedbcdf5dd50597d16f5f2f770132d4" + integrity sha512-vDTgf19ZEV6mx35yiPJe4fS02mPQUUcBNwWQSZFXSzTSbsJFQvHt7DqyS3LK8oOWALFOsJ+8bbqBgkirZteD5Q== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.10" + +"@babel/plugin-transform-classes@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz#6c90542f210ee975aa2aa8c8b5af7fa73a126953" + integrity sha512-gEZvgTy1VtcDOaQty1l10T3jQmJKlNVxLDCs+3rCVPr6nMkODLELxViq5X9l+rfxbie3XrfrMCYYY6eX3aOcOQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.1.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" + integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.2.0.tgz#e75269b4b7889ec3a332cd0d0c8cff8fed0dc6f3" + integrity sha512-coVO2Ayv7g0qdDbrNiadE4bU7lvCd9H539m2gMknyVjjMdwF/iCOM7R+E8PkntoqLkltO0rk+3axhpp/0v68VQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz#f0aabb93d120a8ac61e925ea0ba440812dbe0e49" + integrity sha512-sKxnyHfizweTgKZf7XsXu/CNupKhzijptfTM+bozonIuyVrLWVUvYjE2bhuSBML8VQeMxq4Mm63Q9qvcvUcciQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" + +"@babel/plugin-transform-duplicate-keys@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" + integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-for-of@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz#ab7468befa80f764bb03d3cb5eef8cc998e1cad9" + integrity sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz#f7930362829ff99a3174c39f0afcc024ef59731a" + integrity sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" + integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.0.0", "@babel/plugin-transform-modules-amd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" + integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-commonjs@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz#c4f1933f5991d5145e9cfad1dfd848ea1727f404" + integrity sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + +"@babel/plugin-transform-modules-systemjs@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.2.0.tgz#912bfe9e5ff982924c81d0937c92d24994bb9068" + integrity sha512-aYJwpAhoK9a+1+O625WIjvMY11wkB/ok0WClVwmeo3mCjcNRjt+/8gHWrB5i+00mUju0gWsBkQnPpdvQ7PImmQ== + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-umd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" + integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-new-target@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" + integrity sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" + integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + +"@babel/plugin-transform-parameters@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz#0d5ad15dc805e2ea866df4dd6682bfe76d1408c2" + integrity sha512-kB9+hhUidIgUoBQ0MsxMewhzr8i60nMa2KgeJKQWYrqQpqcBYtnpR+JgkadZVZoaEZ/eKu9mclFaVwhRpLNSzA== + dependencies: + "@babel/helper-call-delegate" "^7.1.0" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-regenerator@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz#5b41686b4ed40bef874d7ed6a84bdd849c13e0c1" + integrity sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw== + dependencies: + regenerator-transform "^0.13.3" + +"@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" + integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" + integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" + integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz#d87ed01b8eaac7a92473f608c97c089de2ba1e5b" + integrity sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" + integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz#4eb8db16f972f8abb5062c161b8b115546ade08b" + integrity sha512-m48Y0lMhrbXEJnVUaYly29jRXbQ3ksxPrS1Tg8t+MHqzXhtBYAvI51euOBaoAlZLPHsieY9XPVMf80a5x0cPcA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" + +"@babel/polyfill@^7.0.0": + version "7.2.5" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.2.5.tgz#6c54b964f71ad27edddc567d065e57e87ed7fa7d" + integrity sha512-8Y/t3MWThtMLYr0YNC/Q76tqN1w30+b0uQMeFUYauG2UGTR19zyUtFrAzT23zNtBxPp+LbE5E/nwV/q/r3y6ug== + dependencies: + core-js "^2.5.7" + regenerator-runtime "^0.12.0" + +"@babel/preset-env@^7.0.0": + version "7.2.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.2.3.tgz#948c8df4d4609c99c7e0130169f052ea6a7a8933" + integrity sha512-AuHzW7a9rbv5WXmvGaPX7wADxFkZIqKlbBh1dmZUQp4iwiPpkE/Qnrji6SC4UQCQzvWY/cpHET29eUhXS9cLPw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.2.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.2.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.2.0" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.2.0" + "@babel/plugin-transform-classes" "^7.2.0" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.2.0" + "@babel/plugin-transform-dotall-regex" "^7.2.0" + "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.2.0" + "@babel/plugin-transform-function-name" "^7.2.0" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.2.0" + "@babel/plugin-transform-modules-systemjs" "^7.2.0" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-new-target" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-parameters" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.2.0" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.2.0" + browserslist "^4.3.4" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.3.0" + +"@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" + integrity sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.2.2" + "@babel/types" "^7.2.2" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.2.2", "@babel/traverse@^7.2.3": + version "7.2.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.2.3.tgz#7ff50cefa9c7c0bd2d81231fdac122f3957748d8" + integrity sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.2.2" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/parser" "^7.2.3" + "@babel/types" "^7.2.2" + debug "^4.1.0" globals "^11.1.0" - invariant "^2.2.0" - lodash "^4.2.0" + lodash "^4.17.10" -"@babel/types@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" - integrity sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ== +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.2.2.tgz#44e10fc24e33af524488b716cdaee5360ea8ed1e" + integrity sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg== dependencies: esutils "^2.0.2" - lodash "^4.2.0" + lodash "^4.17.10" to-fast-properties "^2.0.0" -"@ember/test-helpers@^0.7.17": - version "0.7.17" - resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-0.7.17.tgz#17ff5f1d005d8b6331585e99013d66626a8d8068" - integrity sha512-pLz4FV8IGty+9CEGttEl6clLiQkap4w7T0So8lbCb4XO38OxGfjhfz8uKpI+UH6fgaTeboh8myixqOdfXvklfA== +"@ember/test-helpers@^0.7.26": + version "0.7.27" + resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-0.7.27.tgz#c622cabd0cbb95b34efc1e1b6274ab5a14edc138" + integrity sha512-AQESk0FTFxRY6GyZ8PharR4SC7Fju0rXqNkfNYIntAjzefZ8xEqEM4iXDj5h7gAvfx/8dA69AQ9+p7ubc+KvJg== dependencies: broccoli-funnel "^2.0.1" - ember-cli-babel "^6.10.0" + ember-assign-polyfill "~2.4.0" + ember-cli-babel "^6.12.0" ember-cli-htmlbars-inline-precompile "^1.0.0" "@glimmer/di@^0.2.0": @@ -113,11 +618,6 @@ resolved "https://registry.yarnpkg.com/@xg-wang/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#f7b222c012a238e7d6e89ed3d72a1e0edb58453d" integrity sha512-ULtqA6L75RLzTNW68IiOja0XYv4Ebc3OGMzfia1xxSEMpD0mk/pMvkQX0vbCFyQmKc5xGp80Ms2WiSlXLh8hbA== -abab@^1.0.3, abab@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" - integrity sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4= - abab@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" @@ -144,19 +644,13 @@ accepts@~1.3.4: mime-types "~2.1.16" negotiator "0.6.1" -acorn-globals@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" - integrity sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8= +acorn-globals@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.0.tgz#e3b6f8da3c1552a95ae627571f7dd6923bb54103" + integrity sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw== dependencies: - acorn "^4.0.4" - -acorn-globals@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" - integrity sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ== - dependencies: - acorn "^5.0.0" + acorn "^6.0.1" + acorn-walk "^6.0.1" acorn-jsx@^3.0.0: version "3.0.1" @@ -165,26 +659,26 @@ acorn-jsx@^3.0.0: dependencies: acorn "^3.0.4" +acorn-walk@^6.0.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" + integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== + acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= -acorn@^4.0.4: - version "4.0.13" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" - integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= - -acorn@^5.0.0, acorn@^5.5.3: - version "5.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" - integrity sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ== - acorn@^5.4.0: version "5.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.4.1.tgz#fdc58d9d17f4a4e98d102ded826a9b9759125102" integrity sha512-XLmq3H/BVvW6/GbxKryGxWORz1ebilSsUDlyC27bXhWGWAZWkGwS6FLHjOlwFXNFoWFQEO/Df4u0YYd0K3BQgQ== +acorn@^6.0.1, acorn@^6.0.4: + version "6.0.5" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.5.tgz#81730c0815f3f3b34d8efa95cb7430965f4d887a" + integrity sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg== + active-model-adapter@^2.0.3: version "2.2.0" resolved "https://registry.yarnpkg.com/active-model-adapter/-/active-model-adapter-2.2.0.tgz#6885d6968574809f17f398c499b688a921c30f91" @@ -221,6 +715,16 @@ ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" +ajv@^6.5.5: + version "6.7.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.7.0.tgz#e3ce7bb372d6577bb1839f1dfdfcbf5ad2948d96" + integrity sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + 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" @@ -258,6 +762,14 @@ amd-name-resolver@1.2.0: dependencies: ensure-posix-path "^1.0.1" +amd-name-resolver@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.3.1.tgz#ffe71c683c6e7191fc4ae1bb3aaed15abea135d9" + integrity sha512-26qTEWqZQ+cxSYygZ4Cf8tsjDBLceJahhtewxtKZA3SRa4PluuqYCuheemDQD+7Mf5B7sr+zhTDWAHDh02a1Dw== + dependencies: + ensure-posix-path "^1.0.1" + object-hash "^1.3.1" + amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" @@ -305,16 +817,18 @@ ansi-styles@^3.0.0, ansi-styles@^3.1.0, ansi-styles@^3.2.0: dependencies: color-convert "^1.9.0" +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + ansicolors@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" integrity sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8= -any-promise@^1.0.0, any-promise@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= - anymatch@^1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" @@ -323,6 +837,14 @@ anymatch@^1.3.0: micromatch "^2.1.5" normalize-path "^2.0.0" +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + aot-test-generators@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/aot-test-generators/-/aot-test-generators-0.1.0.tgz#43f0f615f97cb298d7919c1b0b4e6b7310b03cd0" @@ -446,11 +968,6 @@ assert-plus@^0.2.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" integrity sha1-104bh+ev/A24qttwIfP+SBAasjQ= -assertion-error@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -474,17 +991,12 @@ async-disk-cache@^1.2.1: rsvp "^3.0.18" username-sync "1.0.1" -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - integrity sha1-GdOGodntxufByF04iu28xW0zYC0= - async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== -async-promise-queue@^1.0.3: +async-promise-queue@^1.0.3, async-promise-queue@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/async-promise-queue/-/async-promise-queue-1.0.4.tgz#308baafbc74aff66a0bb6e7f4a18d4fe8434440c" integrity sha512-GQ5X3DT+TefYuFPHdvIPXFTlKnh39U7dwtl+aUBGeKjMea9nBpv3c91DXgeyBQmY07vQ97f3Sr9XHqkamEameQ== @@ -534,6 +1046,11 @@ aws4@^1.2.1, aws4@^1.6.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" integrity sha1-g+9cqGCysy5KDe7e6MdxudtXRx4= +aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -568,18 +1085,6 @@ babel-core@^6.14.0, babel-core@^6.26.0: slash "^1.0.0" source-map "^0.5.6" -babel-eslint@^8.2.6: - version "8.2.6" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.6.tgz#6270d0c73205628067c0f7ae1693a9e797acefd9" - integrity sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA== - dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/traverse" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" - eslint-scope "3.7.1" - eslint-visitor-keys "^1.0.0" - babel-generator@^6.26.0: version "6.26.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" @@ -749,6 +1254,13 @@ babel-plugin-ember-modules-api-polyfill@^2.3.2: dependencies: ember-rfc176-data "^0.3.0" +babel-plugin-ember-modules-api-polyfill@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.6.0.tgz#9524a65ef0c31ee82536a19c243fbaec1b977cbb" + integrity sha512-BSbLv3+ju1mcUUoPe7vPJgnGawrNxp6LfFBRHlNOKeMlQlml9Wo2MRRUrbpNDlmVc761xSKj8+cde7R0Lwpq7g== + dependencies: + ember-rfc176-data "^0.3.6" + babel-plugin-feature-flags@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/babel-plugin-feature-flags/-/babel-plugin-feature-flags-0.3.1.tgz#9c827cf9a4eb9a19f725ccb239e85cab02036fc1" @@ -764,6 +1276,17 @@ babel-plugin-htmlbars-inline-precompile@^0.2.3: resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.2.3.tgz#cd365e278af409bfa6be7704c4354beee742446b" integrity sha1-zTZeJ4r0Cb+mvncExDVL7udCRGs= +babel-plugin-module-resolver@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.1.1.tgz#881cf67e3d4b8400d5eaaefc1be44d2dc1fe404f" + integrity sha512-1Q77Al4ydp6nYApJ7sQ2fmgz30WuQgJZegIYuyOdbdpxenB/bSezQ3hDPsumIXGlUS4vUIv+EwFjzzXZNWtARw== + dependencies: + find-babel-config "^1.1.0" + glob "^7.1.2" + pkg-up "^2.0.0" + reselect "^3.0.1" + resolve "^1.4.0" + babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" @@ -1150,11 +1673,6 @@ babel6-plugin-strip-heimdall@^6.0.1: resolved "https://registry.yarnpkg.com/babel6-plugin-strip-heimdall/-/babel6-plugin-strip-heimdall-6.0.1.tgz#35f80eddec1f7fffdc009811dfbd46d9965072b6" integrity sha1-NfgO3ewff//cAJgR371G2ZZQcrY= -babylon@7.0.0-beta.44: - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" - integrity sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g== - babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" @@ -1221,11 +1739,6 @@ better-assert@~1.0.0: dependencies: callsite "1.0.0" -binary-extensions@^1.0.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" - integrity sha1-RqoXUftqL5PuXmibsQh9SxTGwgU= - "binaryextensions@1 || 2": version "2.1.1" resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.1.tgz#3209a51ca4a4ad541a3b8d3d6a6d5b83a2485935" @@ -1286,20 +1799,6 @@ boom@2.x.x: dependencies: hoek "2.x.x" -boom@4.x.x: - version "4.3.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" - integrity sha1-T4owBctKfjiJ90kDD9JbluAdLjE= - dependencies: - hoek "4.x.x" - -boom@5.x.x: - version "5.2.0" - resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" - integrity sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw== - dependencies: - hoek "4.x.x" - bower-config@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/bower-config/-/bower-config-1.4.1.tgz#85fd9df367c2b8dbbd0caa4c5f2bad40cd84c2cc" @@ -1317,9 +1816,9 @@ bower-endpoint-parser@0.2.2: integrity sha1-ALVlrb+rby01rd3pd+l5Yqy8s/Y= brace-expansion@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" - integrity sha1-wHshHHyVLsH479Uad+8NHTmQopI= + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" @@ -1350,6 +1849,22 @@ braces@^2.3.0: split-string "^3.0.2" to-regex "^3.0.1" +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + broccoli-asset-rev@^2.4.5: version "2.6.0" resolved "https://registry.yarnpkg.com/broccoli-asset-rev/-/broccoli-asset-rev-2.6.0.tgz#0633fc3a0b2ba0c2c1d56fa9feb7b331fc83be6d" @@ -1400,6 +1915,22 @@ broccoli-babel-transpiler@^6.4.5, broccoli-babel-transpiler@^6.5.0: rsvp "^4.8.2" workerpool "^2.3.0" +broccoli-babel-transpiler@^7.1.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.1.1.tgz#4202cd0653845083ee744fb4eaa4a2b50292f03f" + integrity sha512-iZE6yxDcEe4XSMEyqyyS+wtkNAsPUGJNleJoVu26Vt2Al8/GqRI5+wc7qquPb71I1W7AtqbkaqsgDFDqBoIYKw== + dependencies: + "@babel/core" "^7.0.0" + broccoli-funnel "^2.0.1" + broccoli-merge-trees "^3.0.0" + broccoli-persistent-filter "^1.4.3" + clone "^2.1.2" + hash-for-dep "^1.2.3" + heimdalljs-logger "^0.1.9" + json-stable-stringify "^1.0.1" + rsvp "^4.8.3" + workerpool "^2.3.1" + broccoli-brocfile-loader@^0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/broccoli-brocfile-loader/-/broccoli-brocfile-loader-0.18.0.tgz#2e86021c805c34ffc8d29a2fb721cf273e819e4b" @@ -1500,6 +2031,18 @@ broccoli-debug@^0.6.1, broccoli-debug@^0.6.2, broccoli-debug@^0.6.3, broccoli-de symlink-or-copy "^1.1.8" tree-sync "^1.2.2" +broccoli-debug@^0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.5.tgz#164a5cdafd8936e525e702bf8f91f39d758e2e78" + integrity sha512-RIVjHvNar9EMCLDW/FggxFRXqpjhncM/3qq87bn/y+/zR9tqEkHvTqbyOc4QnB97NO2m6342w4wGkemkaeOuWg== + dependencies: + broccoli-plugin "^1.2.1" + fs-tree-diff "^0.5.2" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + symlink-or-copy "^1.1.8" + tree-sync "^1.2.2" + broccoli-file-creator@^1.0.0, broccoli-file-creator@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/broccoli-file-creator/-/broccoli-file-creator-1.1.1.tgz#1b35b67d215abdfadd8d49eeb69493c39e6c3450" @@ -1540,7 +2083,7 @@ broccoli-funnel-reducer@^1.0.0: resolved "https://registry.yarnpkg.com/broccoli-funnel-reducer/-/broccoli-funnel-reducer-1.0.0.tgz#11365b2a785aec9b17972a36df87eef24c5cc0ea" integrity sha1-ETZbKnha7JsXlyo234fu8kxcwOo= -broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.2, broccoli-funnel@^1.1.0: +broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-1.2.0.tgz#cddc3afc5ff1685a8023488fff74ce6fb5a51296" integrity sha1-zdw6/F/xaFqAI0iP/3TOb7WlEpY= @@ -1608,7 +2151,7 @@ broccoli-lint-eslint@^4.2.1: lodash.defaultsdeep "^4.6.0" md5-hex "^2.0.0" -broccoli-merge-trees@^1.0.0, broccoli-merge-trees@^1.1.0, broccoli-merge-trees@^1.1.1: +broccoli-merge-trees@^1.0.0, broccoli-merge-trees@^1.1.1: version "1.2.4" resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-1.2.4.tgz#a001519bb5067f06589d91afa2942445a2d0fdb5" integrity sha1-oAFRm7UGfwZYnZGvopQkRaLQ/bU= @@ -1630,6 +2173,14 @@ broccoli-merge-trees@^2.0.0: broccoli-plugin "^1.3.0" merge-trees "^1.0.1" +broccoli-merge-trees@^3.0.0, broccoli-merge-trees@^3.0.1, broccoli-merge-trees@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-3.0.2.tgz#f33b451994225522b5c9bcf27d59decfd8ba537d" + integrity sha512-ZyPAwrOdlCddduFbsMyyFzJUrvW6b04pMvDiAQZrCwghlvgowJDY+EfoXn+eR1RRA5nmGHJ+B68T63VnpRiT1A== + dependencies: + broccoli-plugin "^1.3.0" + merge-trees "^2.0.0" + broccoli-middleware@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/broccoli-middleware/-/broccoli-middleware-1.0.0.tgz#92f4e1fb9a791ea986245a7077f35cc648dab097" @@ -1638,11 +2189,6 @@ broccoli-middleware@^1.0.0: handlebars "^4.0.4" mime "^1.2.11" -broccoli-node-info@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-1.1.0.tgz#3aa2e31e07e5bdb516dd25214f7c45ba1c459412" - integrity sha1-OqLjHgflvbUW3SUhT3xFuhxFlBI= - broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.4.0, broccoli-persistent-filter@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.3.tgz#3511bc52fc53740cda51621f58a28152d9911bc1" @@ -1662,6 +2208,25 @@ broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-p symlink-or-copy "^1.0.1" walk-sync "^0.3.1" +broccoli-persistent-filter@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.1.1.tgz#7bb2b1015baedf5cf58b5b2608495f3d78f81b12" + integrity sha512-2VCbLJqMg/AWJ6WTmv83X13a6DD3BS7Gngc932jrg1snVqsB8LJDyJh+Hd9v1tQ/vMA+4vbWgwk4tDmI/tAZWg== + dependencies: + async-disk-cache "^1.2.1" + async-promise-queue "^1.0.3" + broccoli-plugin "^1.0.0" + fs-tree-diff "^0.5.2" + hash-for-dep "^1.0.2" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + mkdirp "^0.5.1" + promise-map-series "^0.2.1" + rimraf "^2.6.1" + rsvp "^4.7.0" + symlink-or-copy "^1.0.1" + walk-sync "^0.3.1" + broccoli-plugin@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.1.0.tgz#73e2cfa05f8ea1e3fc1420c40c3d9e7dc724bf02" @@ -1672,7 +2237,7 @@ broccoli-plugin@1.1.0: rimraf "^2.3.4" symlink-or-copy "^1.0.1" -broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli-plugin@^1.2.1, broccoli-plugin@^1.3.0: +broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli-plugin@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.0.tgz#bee704a8e42da08cb58e513aaa436efb7f0ef1ee" integrity sha1-vucEqOQtoIy1jlE6qkNu+38O8e4= @@ -1682,10 +2247,15 @@ broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli rimraf "^2.3.4" symlink-or-copy "^1.1.8" -broccoli-slow-trees@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-2.0.0.tgz#9741afe992787add64aec7f7c8211dfcc058278d" - integrity sha1-l0Gv6ZJ4et1krsf3yCEd/MBYJ40= +broccoli-plugin@^1.3.0, broccoli-plugin@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.1.tgz#a26315732fb99ed2d9fb58f12a1e14e986b4fabd" + integrity sha512-DW8XASZkmorp+q7J4EeDEZz+LoyKLAd2XZULXyD9l4m9/hAKV3vjHmB1kiUshcWAYMgTP1m2i4NnqCE/23h6AQ== + dependencies: + promise-map-series "^0.2.1" + quick-temp "^0.1.3" + rimraf "^2.3.4" + symlink-or-copy "^1.1.8" broccoli-slow-trees@^3.0.1: version "3.0.1" @@ -1730,6 +2300,26 @@ broccoli-stew@^1.2.0, broccoli-stew@^1.3.3, broccoli-stew@^1.5.0: symlink-or-copy "^1.1.8" walk-sync "^0.3.0" +broccoli-stew@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-2.0.1.tgz#d0a507b79bf5fea9ff84032ae837dc48670ab1dc" + integrity sha512-EUzgkbYF4m8YVD2bkEa7OfYJ11V3dQ+yPuxdz/nFh8eMEn6dhOujtuSBnOWsvGDgsS9oqNZgx/MHJxI6Rr3AqQ== + dependencies: + broccoli-debug "^0.6.5" + broccoli-funnel "^2.0.0" + broccoli-merge-trees "^3.0.1" + broccoli-persistent-filter "^2.1.1" + broccoli-plugin "^1.3.1" + chalk "^2.4.1" + debug "^3.1.0" + ensure-posix-path "^1.0.1" + fs-extra "^6.0.1" + minimatch "^3.0.4" + resolve "^1.8.1" + rsvp "^4.8.4" + symlink-or-copy "^1.2.0" + walk-sync "^0.3.3" + broccoli-string-replace@^0.1.1: version "0.1.2" resolved "https://registry.npmjs.org/broccoli-string-replace/-/broccoli-string-replace-0.1.2.tgz#1ed92f85680af8d503023925e754e4e33676b91f" @@ -1738,23 +2328,12 @@ broccoli-string-replace@^0.1.1: broccoli-persistent-filter "^1.1.5" minimatch "^3.0.3" -broccoli-test-helper@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/broccoli-test-helper/-/broccoli-test-helper-1.3.0.tgz#ba673418b3963b2cc466be66092a5928700c827f" - integrity sha512-IhFjcETHOSDAXY8afLLcihdXbAgcQ2b3lp9nZ5saYzoXJvt/1RMUlCm8JxKKPU7aHqpNXMVaj5lm4Is+4xh/qA== - dependencies: - broccoli "^1.1.0" - fixturify "^0.3.2" - fs-tree-diff "^0.5.6" - mktemp "^0.4.0" - rimraf "^2.5.4" - walk-sync "^0.3.1" - -broccoli-uglify-sourcemap@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/broccoli-uglify-sourcemap/-/broccoli-uglify-sourcemap-2.0.2.tgz#f4a73112f1f56b46043e2e89cba5ce7762cddeb3" - integrity sha512-Fe+qUlPC4gHG7ojQOaRSRrCbrI2niYNAfrZqLkPEXHCi8UtwEqMHBAK6AZylN7ve/0CkGNSxKhCm7ELeeJRI+A== +broccoli-uglify-sourcemap@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/broccoli-uglify-sourcemap/-/broccoli-uglify-sourcemap-2.2.0.tgz#2ff49389bdf342a550c3596750ba2dde95a8f7d4" + integrity sha1-L/STib3zQqVQw1lnULot3pWo99Q= dependencies: + async-promise-queue "^1.0.4" broccoli-plugin "^1.2.1" debug "^3.1.0" lodash.defaultsdeep "^4.6.0" @@ -1762,8 +2341,9 @@ broccoli-uglify-sourcemap@^2.0.0: mkdirp "^0.5.0" source-map-url "^0.4.0" symlink-or-copy "^1.0.1" - uglify-es "^3.1.3" + terser "^3.7.5" walk-sync "^0.3.2" + workerpool "^2.3.0" broccoli-writer@~0.1.1: version "0.1.1" @@ -1773,37 +2353,11 @@ broccoli-writer@~0.1.1: quick-temp "^0.1.0" rsvp "^3.0.6" -broccoli@^1.1.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/broccoli/-/broccoli-1.1.4.tgz#b023b028b866f447ed14341007961efd03f7251c" - integrity sha1-sCOwKLhm9EftFDQQB5Ye/QP3JRw= - dependencies: - broccoli-node-info "1.1.0" - broccoli-slow-trees "2.0.0" - broccoli-source "^1.1.0" - commander "^2.5.0" - connect "^3.3.3" - copy-dereference "^1.0.0" - findup-sync "^1.0.0" - handlebars "^4.0.4" - heimdalljs-logger "^0.1.7" - mime "^1.2.11" - rimraf "^2.4.3" - rsvp "^3.5.0" - sane "^1.4.1" - tmp "0.0.31" - underscore.string "^3.2.2" - browser-process-hrtime@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" integrity sha1-Ql1opY00R/AqBKqJQYf86K+Le44= -browser-stdout@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" - integrity sha1-81HTKWnTL6XXpVZxVCY9korjvR8= - browserslist@^2.1.2: version "2.11.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" @@ -1820,6 +2374,15 @@ browserslist@^3.2.6: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" +browserslist@^4.3.4: + version "4.4.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.4.0.tgz#7050d1412cbfc5274aba609ed5e50359ca1a5fdf" + integrity sha512-tQkHS8VVxWbrjnNDXgt7/+SuPJ7qDvD0Y2e6bLtoQluR2SPvlmPUcfcU75L1KAalhqULlIFJlJ6BDfnYyJxJsw== + dependencies: + caniuse-lite "^1.0.30000928" + electron-to-chromium "^1.3.100" + node-releases "^1.1.3" + bser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" @@ -1926,7 +2489,12 @@ caniuse-lite@^1.0.30000844: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25" integrity sha512-vs79o1mOSKRGv/1pSkp4EXgl4ZviWeYReXw60XfacPU64uQWZwJT6vZNmxRF9O+6zu71sJwMxLK5JXxbzuVrLw== -capture-exit@^1.1.0: +caniuse-lite@^1.0.30000928: + version "1.0.30000928" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000928.tgz#805e828dc72b06498e3683a32e61c7507fd67b88" + integrity sha512-aSpMWRXL6ZXNnzm8hgE4QDLibG5pVJ2Ujzsuj3icazlIkxXkPXtL+BWnMx6FBkWmkZgBHGUxPZQvrbRw2ZTxhg== + +capture-exit@^1.1.0, capture-exit@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" integrity sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28= @@ -1954,18 +2522,6 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" -chai@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" - integrity sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw= - dependencies: - assertion-error "^1.0.1" - check-error "^1.0.1" - deep-eql "^3.0.0" - get-func-name "^2.0.0" - pathval "^1.0.0" - type-detect "^4.0.0" - chalk@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" @@ -2006,6 +2562,15 @@ chalk@^2.3.0: escape-string-regexp "^1.0.5" supports-color "^5.2.0" +chalk@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" @@ -2018,26 +2583,10 @@ charm@^1.0.0: dependencies: inherits "^2.0.1" -check-error@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= - -chokidar@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" +chownr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== circular-json@^0.3.1: version "0.3.3" @@ -2076,6 +2625,11 @@ clean-css@^3.4.5: commander "2.8.x" source-map "0.4.x" +clean-up-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clean-up-path/-/clean-up-path-1.0.0.tgz#de9e8196519912e749c9eaf67c13d64fac72a3e5" + integrity sha512-PHGlEF0Z6976qQyN6gM7kKH6EH0RdfZcc8V+QhFe36eRxV0SMH5OUBZG7Bxa9YcreNzyNbK63cGiZxdSZgosRw== + cli-cursor@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" @@ -2131,6 +2685,11 @@ clone@^2.0.0: resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" integrity sha1-0hfR6WERjjrJpLi7oyhVU79kfNs= +clone@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -2178,6 +2737,13 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" + integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== + dependencies: + delayed-stream "~1.0.0" + commander@2.12.2: version "2.12.2" resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555" @@ -2190,27 +2756,15 @@ commander@2.8.x: dependencies: graceful-readlink ">= 1.0.0" -commander@2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" - integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q= - dependencies: - graceful-readlink ">= 1.0.0" - -commander@^2.5.0: - version "2.16.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" - integrity sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew== - commander@^2.6.0: version "2.14.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.0.tgz#7b25325963e6aace20d3a9285b09379b0c2208b5" integrity sha512-okPpdvdJr6mUGi2XzupC+irQxzwGLVaBzacFC14hjLv8NColXEsxsU+QaeuSSXpQUak5g2K0vQ7WjA1e8svczg== -commander@~2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" - integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== +commander@~2.17.1: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== common-tags@^1.4.0: version "1.7.2" @@ -2285,16 +2839,6 @@ configstore@^3.0.0: write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" -connect@^3.3.3: - version "3.6.6" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" - integrity sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ= - dependencies: - debug "2.6.9" - finalhandler "1.1.0" - parseurl "~1.3.2" - utils-merge "1.0.1" - console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" @@ -2324,11 +2868,6 @@ content-disposition@0.5.2: resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= -content-type-parser@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" - integrity sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ== - content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" @@ -2339,6 +2878,13 @@ continuable-cache@^0.3.1: resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f" integrity sha1-vXJ6f67XfnH/OYWskzUakSczrQ8= +convert-source-map@^1.1.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" + convert-source-map@^1.5.0, convert-source-map@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" @@ -2369,17 +2915,15 @@ core-js@^2.4.0, core-js@^2.5.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" integrity sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4= -core-object@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/core-object/-/core-object-1.1.0.tgz#86d63918733cf9da1a5aae729e62c0a88e66ad0a" - integrity sha1-htY5GHM8+doaWq5ynmLAqI5mrQo= +core-js@^2.5.7: + version "2.6.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.2.tgz#267988d7268323b349e20b4588211655f0e83944" + integrity sha512-NdBPF/RVwPW6jr0NCILuyN9RiqLo2b1mddWHkUL+VnvcB7dzlnBJ1bXYntjpTGOgkZiiLWj2JxmOr7eGE3qK6g== -core-object@^2.0.6: - version "2.1.1" - resolved "https://registry.yarnpkg.com/core-object/-/core-object-2.1.1.tgz#4b7a5f1edefcb1e6d0dcb58eab1b9f90bfc666a8" - integrity sha1-S3pfHt78sebQ3LWOqxufkL/GZqg= - dependencies: - chalk "^1.1.3" +core-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/core-object/-/core-object-1.1.0.tgz#86d63918733cf9da1a5aae729e62c0a88e66ad0a" + integrity sha1-htY5GHM8+doaWq5ynmLAqI5mrQo= core-object@^3.1.3: version "3.1.5" @@ -2393,16 +2937,6 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cpr@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cpr/-/cpr-2.2.0.tgz#2dc6c87dfb78012489cdd994227628c320e9a17b" - integrity sha512-q8UoWzIT9rslJKb3Y5CcByzR2zX7GBkVcoU6jJx02d/BgbE7zJ8Aix74i7bw3iYk58TrgXhmB2XB0aGaBd7oZA== - dependencies: - graceful-fs "^4.1.5" - minimist "^1.2.0" - mkdirp "~0.5.1" - rimraf "^2.5.4" - cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -2419,34 +2953,25 @@ cryptiles@2.x.x: dependencies: boom "2.x.x" -cryptiles@3.x.x: - version "3.1.2" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" - integrity sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4= - dependencies: - boom "5.x.x" - crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= -cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": +cssom@0.3.x: version "0.3.2" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" integrity sha1-uANhcMefB6kP8vFuIihAJ6JDhIs= -"cssstyle@>= 0.2.37 < 0.3.0": - version "0.2.37" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" - integrity sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ= - dependencies: - cssom "0.3.x" +cssom@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.4.tgz#8cd52e8a3acfd68d3aed38ee0a640177d2f9d797" + integrity sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog== -cssstyle@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.0.0.tgz#79b16d51ec5591faec60e688891f15d2a5705129" - integrity sha512-Bpuh47j2mRMY60X90mXaJAEtJwxvA2roZzbgwAXYhMbmwmakdRr4Cq9L5SkleKJNLOKqHIa2YWyOXDX3VgggSQ== +cssstyle@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.1.1.tgz#18b038a9c44d65f7a8e428a653b9f6fe42faf5fb" + integrity sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog== dependencies: cssom "0.3.x" @@ -2469,14 +2994,14 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -data-urls@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f" - integrity sha512-ai40PPQR0Fn1lD2PPie79CibnlMN2AYiDhwFX/rZHVsxbs5kNJSjegqXIprhouGXlRdEnfybva7kqRGnB6mypA== +data-urls@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== dependencies: - abab "^1.0.4" - whatwg-mimetype "^2.0.0" - whatwg-url "^6.4.0" + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" debug@2.2.0: version "2.2.0" @@ -2492,14 +3017,7 @@ debug@2.3.3: dependencies: ms "0.7.2" -debug@2.6.8: - version "2.6.8" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" - integrity sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw= - dependencies: - ms "2.0.0" - -debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.4.0, debug@^2.6.8, debug@~2.6.7: +debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.4.0, debug@^2.6.8, debug@~2.6.7: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -2513,6 +3031,13 @@ debug@^3.0.0, debug@^3.1.0: dependencies: ms "2.0.0" +debug@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + decamelize@^1.0.0, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -2523,12 +3048,10 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= -deep-eql@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - dependencies: - type-detect "^4.0.0" +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-extend@~0.4.0: version "0.4.2" @@ -2554,6 +3077,14 @@ define-property@^1.0.0: dependencies: is-descriptor "^1.0.0" +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + del@^2.0.2: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" @@ -2616,11 +3147,6 @@ detect-libc@^1.0.2: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= -diff@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" - integrity sha1-yc45Okt8vQsFinJck98pkCeGj/k= - diff@^3.2.0: version "3.4.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" @@ -2664,6 +3190,11 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +electron-to-chromium@^1.3.100: + version "1.3.103" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.103.tgz#a695777efdbc419cad6cbb0e58458251302cd52f" + integrity sha512-tObPqGmY9X8MUM8i3MEimYmbnLLf05/QV5gPlkR8MQ3Uj8G8B2govE1U4cQcBYtv3ymck9Y8cIOu4waoiykMZQ== + electron-to-chromium@^1.3.30: version "1.3.32" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.32.tgz#11d0684c0840e003c4be8928f8ac5f35dbc2b4e6" @@ -2681,34 +3212,15 @@ ember-ajax@^3.0.0: dependencies: ember-cli-babel "^6.0.0" -ember-cli-addon-tests@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/ember-cli-addon-tests/-/ember-cli-addon-tests-0.7.1.tgz#6959c4cce1a9d16a4852465e2b2bed4bf26b46ec" - integrity sha1-aVnEzOGp0WpIUkZeKyvtS/JrRuw= - dependencies: - chalk "^2.0.1" - cpr "^2.0.0" - debug "^2.2.0" - exists-sync "0.0.4" - findup-sync "^1.0.0" - fs-extra "^3.0.0" - fs-promise "^2.0.0" - lodash "^4.0.0" - mkdirp "^0.5.1" - rsvp "^3.1.0" - semver "^5.3.0" - symlink-or-copy "^1.1.3" - temp "^0.8.3" - -ember-cli-app-version@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ember-cli-app-version/-/ember-cli-app-version-2.1.0.tgz#149101d4fd0d97875e12ec5e61ff105f508e5e2d" - integrity sha1-FJEB1P0Nl4deEuxeYf8QX1COXi0= +ember-assign-polyfill@~2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/ember-assign-polyfill/-/ember-assign-polyfill-2.4.0.tgz#acb00466f7d674b3e6b030acfe255b3b1f6472e1" + integrity sha512-0SnGQb9CenRqbZdIa1KFsEjT+1ijGWfAbCSaDbg5uVa5l6HPdppuTzOXK6sfEQMsd2nbrp27QWFy7W5VX6l4Ag== dependencies: - ember-cli-babel "^6.8.0" - git-repo-version "0.4.1" + ember-cli-babel "^6.6.0" + ember-cli-version-checker "^2.0.0" -ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2, ember-cli-babel@^6.9.0: +ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.11.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2, ember-cli-babel@^6.9.0: version "6.11.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.11.0.tgz#79cb184bac3c05bfe181ddc306bac100ab1f9493" integrity sha512-lHQyl30lbAsMmMq2it1GO85HKrqr2gMpK5CFxmOgTJ3moBqOGMKsdV3Z0qXWpgh8Asy7pB9AACMShdgfQvSGPg== @@ -2727,6 +3239,25 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-version-checker "^2.1.0" semver "^5.4.1" +ember-cli-babel@^6.12.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz#3f6435fd275172edeff2b634ee7b29ce74318957" + integrity sha512-7ceC8joNYxY2wES16iIBlbPSxwKDBhYwC8drU3ZEvuPDMwVv1KzxCNu1fvxyFEBWhwaRNTUxSCsEVoTd9nosGA== + dependencies: + amd-name-resolver "1.2.0" + babel-plugin-debug-macros "^0.2.0-beta.6" + babel-plugin-ember-modules-api-polyfill "^2.6.0" + babel-plugin-transform-es2015-modules-amd "^6.24.0" + babel-polyfill "^6.26.0" + babel-preset-env "^1.7.0" + broccoli-babel-transpiler "^6.5.0" + broccoli-debug "^0.6.4" + broccoli-funnel "^2.0.0" + broccoli-source "^1.1.0" + clone "^2.0.0" + ember-cli-version-checker "^2.1.2" + semver "^5.5.0" + ember-cli-babel@^6.6.0: version "6.17.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.17.0.tgz#1f3e8ed9f4e2338caef6bc2c3d08d3c9928d0ddd" @@ -2765,6 +3296,28 @@ ember-cli-babel@^6.7.2: ember-cli-version-checker "^2.1.2" semver "^5.5.0" +ember-cli-babel@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.2.0.tgz#5c5bd877fb73f6fb198c878d3127ba9e18e9b8a0" + integrity sha512-vwx/AgPD7P4ebgTFJMqFovbrSNCA02UMuItlR/Il16njYjgN9ZzjUqgYxaylN7k8RF88wdJq3jrtqyMS/oOq8A== + dependencies: + "@babel/core" "^7.0.0" + "@babel/plugin-transform-modules-amd" "^7.0.0" + "@babel/polyfill" "^7.0.0" + "@babel/preset-env" "^7.0.0" + amd-name-resolver "^1.2.1" + babel-plugin-debug-macros "^0.2.0-beta.6" + babel-plugin-ember-modules-api-polyfill "^2.6.0" + babel-plugin-module-resolver "^3.1.1" + broccoli-babel-transpiler "^7.1.0" + broccoli-debug "^0.6.4" + broccoli-funnel "^2.0.1" + broccoli-source "^1.1.0" + clone "^2.1.2" + ember-cli-version-checker "^2.1.2" + ensure-posix-path "^1.0.2" + semver "^5.5.0" + ember-cli-broccoli-sane-watcher@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.0.4.tgz#f43f42f75b7509c212fb926cd9aea86ae19264c6" @@ -2930,28 +3483,13 @@ ember-cli-preprocess-registry@^3.1.0: process-relative-require "^1.0.0" silent-error "^1.0.0" -ember-cli-qunit@^4.1.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ember-cli-qunit/-/ember-cli-qunit-4.3.1.tgz#fcbf3585392299b27de26e57d0cf9f9049a76181" - integrity sha1-/L81hTkimbJ94m5X0M+fkEmnYYE= +ember-cli-qunit@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/ember-cli-qunit/-/ember-cli-qunit-4.4.0.tgz#0edd7d651001d0d7ea200b9236a4733a5b7420f1" + integrity sha512-+gkx380AV4WXYjQeIuQi675STL9K12fHFtxs8B9u3EFbw45vJKrnYR4Vph3FujxhE/1pr/Je8kZEPAuezZAVLw== dependencies: ember-cli-babel "^6.11.0" - ember-qunit "^3.3.1" - -ember-cli-release@^0.2.9: - version "0.2.9" - resolved "https://registry.yarnpkg.com/ember-cli-release/-/ember-cli-release-0.2.9.tgz#5e8de3d034c65597933748023058470ec1231adb" - integrity sha1-Xo3j0DTGVZeTN0gCMFhHDsEjGts= - dependencies: - chalk "^1.0.0" - git-tools "^0.1.4" - make-array "^0.1.2" - merge "^1.2.0" - moment-timezone "^0.3.0" - nopt "^3.0.3" - rsvp "^3.0.17" - semver "^4.3.1" - silent-error "^1.0.0" + ember-qunit "^3.5.0" ember-cli-shims@^1.2.0: version "1.2.0" @@ -2990,12 +3528,12 @@ ember-cli-test-loader@^2.2.0: dependencies: ember-cli-babel "^6.8.1" -ember-cli-uglify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ember-cli-uglify/-/ember-cli-uglify-2.0.0.tgz#b096727d7d1718acc9bfe5d1bc81ce26cafdf6ca" - integrity sha1-sJZyfX0XGKzJv+XRvIHOJsr99so= +ember-cli-uglify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-uglify/-/ember-cli-uglify-2.1.0.tgz#4a0641fe4768d7ab7d4807aca9924cc77c544184" + integrity sha512-lDzdAUfhGx5AMBsgyR54ibENVp/LRQuHNWNaP2SDjkAXDyuYFgW0iXIAfGbxF6+nYaesJ9Tr9AKOfTPlwxZDSg== dependencies: - broccoli-uglify-sourcemap "^2.0.0" + broccoli-uglify-sourcemap "^2.1.1" lodash.defaultsdeep "^4.6.0" ember-cli-valid-component-name@^1.0.0: @@ -3159,24 +3697,6 @@ ember-export-application-global@^2.0.0: dependencies: ember-cli-babel "^6.0.0-beta.7" -ember-fastboot-addon-tests@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/ember-fastboot-addon-tests/-/ember-fastboot-addon-tests-0.4.0.tgz#05f89f2cc4bd53d6abd6d952bbdde7c8af03a6f7" - integrity sha1-BfifLMS9U9ar1tlSu93nyK8Dpvc= - dependencies: - chalk "^1.1.3" - core-object "^2.0.6" - debug "^2.2.0" - ember-cli-addon-tests "^0.7.0" - ember-cli-babel "^6.0.0" - ember-router-generator "^1.2.2" - fs-extra "^0.30.0" - jquery "^3.1.0" - jsdom "^9.5.0" - mocha "^3.0.2" - request "^2.74.0" - rsvp "^3.3.1" - ember-get-config@^0.2.2: version "0.2.4" resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.2.4.tgz#118492a2a03d73e46004ed777928942021fe1ecd" @@ -3206,30 +3726,30 @@ ember-load-initializers@^1.0.0: dependencies: ember-cli-babel "^6.0.0-beta.7" -ember-lodash@^4.17.3: - version "4.18.0" - resolved "https://registry.yarnpkg.com/ember-lodash/-/ember-lodash-4.18.0.tgz#45de700d6a4f68f1cd62888d90b50aa6477b9a83" - integrity sha1-Rd5wDWpPaPHNYoiNkLUKpkd7moM= +ember-lodash@^4.19.4: + version "4.19.4" + resolved "https://registry.yarnpkg.com/ember-lodash/-/ember-lodash-4.19.4.tgz#3e76e6cb04c9312c2158180bf16d7983aae05774" + integrity sha512-4O1YjFfFA1EL53XXxyjRwRRl1f1MahxON7dbPhe5Ex3f8lmuvB0fEc1U+kJ1IwefmUqeSyOBsYXG6L9ushOKQQ== dependencies: broccoli-debug "^0.6.1" broccoli-funnel "^2.0.1" - broccoli-merge-trees "^2.0.0" + broccoli-merge-trees "^3.0.0" broccoli-string-replace "^0.1.1" - ember-cli-babel "^6.10.0" + ember-cli-babel "^7.0.0" lodash-es "^4.17.4" -ember-qunit@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-3.3.1.tgz#8d68ef30cfd6f2acbf1d0f4e368439642e726903" - integrity sha512-ZRQCDitCx4aLKKIvQEIfeFKHAWOkqwT4xg2E0fAbP4yptCJKPz/pCf0G0suW6YFpx7zI3qsbXKVZMeOGbqbmfw== +ember-qunit@^3.5.0: + version "3.5.3" + resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-3.5.3.tgz#bfd0bff8298c78c77e870cca43fe0826e78a0d09" + integrity sha512-FmXsI1bGsZ5th25x4KEle2fLCVURTptsQODfBt+Pg8tk9rX7y79cqny91PrhtkhE+giZ8p029tnq94SdpJ4ojg== dependencies: - "@ember/test-helpers" "^0.7.17" + "@ember/test-helpers" "^0.7.26" broccoli-funnel "^2.0.1" broccoli-merge-trees "^2.0.0" common-tags "^1.4.0" - ember-cli-babel "^6.3.0" + ember-cli-babel "^6.8.2" ember-cli-test-loader "^2.2.0" - qunit "^2.5.0" + qunit "~2.6.0" ember-resolver@^4.0.0: version "4.5.0" @@ -3254,7 +3774,12 @@ ember-rfc176-data@^0.3.0, ember-rfc176-data@^0.3.1: resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.1.tgz#6a5a4b8b82ec3af34f3010965fa96b936ca94519" integrity sha512-u+W5rUvYO7xyKJjiPuCM7bIAvFyPwPTJ66fOZz1xuCv3AyReI9Oev5oOADOO6YJZk+vEn0xWiZ9N6zSf8WU7Fg== -ember-router-generator@^1.0.0, ember-router-generator@^1.2.2, ember-router-generator@^1.2.3: +ember-rfc176-data@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.6.tgz#7138db8dfccec39c9a832adfbd4c49d670028907" + integrity sha512-kPY94VCukPUPj+/6sZ9KvphD42KnpX2IS31p5z07OFVIviDogR0cQuld5c7Irzfgq7a0YACj0HlToROFn7dLYQ== + +ember-router-generator@^1.0.0, ember-router-generator@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-1.2.3.tgz#8ed2ca86ff323363120fc14278191e9e8f1315ee" integrity sha1-jtLKhv8yM2MSD8FCeBkeno8TFe4= @@ -3401,24 +3926,12 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escodegen@^1.6.1: - version "1.9.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852" - integrity sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw== - dependencies: - esprima "^3.1.3" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.5.6" - -escodegen@^1.9.1: +escodegen@^1.11.0: version "1.11.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" integrity sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw== @@ -3456,7 +3969,7 @@ eslint-plugin-node@^6.0.1: resolve "^1.3.3" semver "^5.4.1" -eslint-scope@3.7.1, eslint-scope@^3.7.1: +eslint-scope@^3.7.1: version "3.7.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug= @@ -3726,7 +4239,7 @@ extend-shallow@^2.0.1: dependencies: is-extendable "^0.1.0" -extend-shallow@^3.0.0: +extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= @@ -3739,6 +4252,11 @@ extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" integrity sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ= +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + external-editor@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-1.1.1.tgz#12d7b0db850f7ff7e7081baf4005700060c4600b" @@ -3764,7 +4282,7 @@ extglob@^0.3.1: dependencies: is-extglob "^1.0.0" -extglob@^2.0.2: +extglob@^2.0.2, extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== @@ -3803,6 +4321,11 @@ fast-deep-equal@^1.0.0: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" integrity sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8= +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" @@ -3939,6 +4462,14 @@ finalhandler@1.1.0: statuses "~1.3.1" unpipe "~1.0.0" +find-babel-config@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.1.0.tgz#acc01043a6749fec34429be6b64f542ebb5d6355" + integrity sha1-rMAQQ6Z0n+w0Qpvmtk9ULrtdY1U= + dependencies: + json5 "^0.5.1" + path-exists "^3.0.0" + find-index@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-index/-/find-index-1.1.0.tgz#53007c79cd30040d6816d79458e8837d5c5705ef" @@ -3979,16 +4510,6 @@ findup-sync@^0.4.2: micromatch "^2.3.7" resolve-dir "^0.1.0" -findup-sync@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-1.0.0.tgz#6f7e4b57b6ee3a4037b4414eaedea3f58f71e0ec" - integrity sha1-b35LV7buOkA3tEFOrt6j9Y9x4Ow= - dependencies: - detect-file "^0.1.0" - is-glob "^2.0.1" - micromatch "^2.3.7" - resolve-dir "^0.1.0" - fireworm@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/fireworm/-/fireworm-0.7.1.tgz#ccf20f7941f108883fcddb99383dbe6e1861c758" @@ -4000,14 +4521,6 @@ fireworm@^0.7.0: lodash.flatten "^3.0.2" minimatch "^3.0.2" -fixturify@^0.3.2: - version "0.3.4" - resolved "https://registry.yarnpkg.com/fixturify/-/fixturify-0.3.4.tgz#c676de404a7f8ee8e64d0b76118e62ec95ab7b25" - integrity sha512-Gx+KSB25b6gMc4bf7UFRTA85uE0iZR+RYur0JHh6dg4AGBh0EksOv4FCHyM7XpGmiJO7Bc7oV7vxENQBT+2WEQ== - dependencies: - fs-extra "^0.30.0" - matcher-collection "^1.0.4" - flat-cache@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" @@ -4053,6 +4566,15 @@ form-data@~2.3.1: combined-stream "^1.0.5" mime-types "^2.1.12" +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" @@ -4124,15 +4646,6 @@ fs-extra@^2.0.0: graceful-fs "^4.1.2" jsonfile "^2.1.0" -fs-extra@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" - integrity sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE= - dependencies: - graceful-fs "^4.1.2" - jsonfile "^3.0.0" - universalify "^0.1.0" - fs-extra@^4.0.0, fs-extra@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" @@ -4142,17 +4655,23 @@ fs-extra@^4.0.0, fs-extra@^4.0.2: jsonfile "^4.0.0" universalify "^0.1.0" -fs-promise@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/fs-promise/-/fs-promise-2.0.3.tgz#f64e4f854bcf689aa8bddcba268916db3db46854" - integrity sha1-9k5PhUvPaJqovdy6JokW2z20aFQ= +fs-extra@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.1.tgz#8abc128f7946e310135ddc93b98bddb410e7a34b" + integrity sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA== dependencies: - any-promise "^1.3.0" - fs-extra "^2.0.0" - mz "^2.6.0" - thenify-all "^1.6.0" + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== + dependencies: + minipass "^2.2.1" -fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6: +fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.7.tgz#315e2b098d5fe7f622880ac965b1b051868ac871" integrity sha512-dJwDX6NBH7IfdfFjZAdHCZ6fIKc8LwR7kzqUhYRFJuX4g9ctG/7cuqJuwegGQsyLEykp6Z4krq+yIFMQlt7d9Q== @@ -4162,12 +4681,33 @@ fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5 path-posix "^1.0.0" symlink-or-copy "^1.1.8" +fs-tree-diff@^0.5.3: + version "0.5.9" + resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.9.tgz#a4ec6182c2f5bd80b9b83c8e23e4522e6f5fd946" + integrity sha512-872G8ax0kHh01m9n/2KDzgYwouKza0Ad9iFltBpNykvROvf2AGtoOzPJgGx125aolGPER3JuC7uZFrQ7bG1AZw== + dependencies: + heimdalljs-logger "^0.1.7" + object-assign "^4.1.0" + path-posix "^1.0.0" + symlink-or-copy "^1.1.8" + +fs-updater@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/fs-updater/-/fs-updater-1.0.4.tgz#2329980f99ae9176e9a0e84f7637538a182ce63b" + integrity sha512-0pJX4mJF/qLsNEwTct8CdnnRdagfb+LmjRPJ8sO+nCnAZLW0cTmz4rTgU25n+RvTuWSITiLKrGVJceJPBIPlKg== + dependencies: + can-symlink "^1.0.0" + clean-up-path "^1.0.0" + heimdalljs "^0.2.5" + heimdalljs-logger "^0.1.9" + rimraf "^2.6.2" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.0.0, fsevents@^1.1.1: +fsevents@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" integrity sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q== @@ -4175,6 +4715,14 @@ fsevents@^1.0.0, fsevents@^1.1.1: nan "^2.3.0" node-pre-gyp "^0.6.39" +fsevents@^1.2.3: + version "1.2.6" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.6.tgz#d3a1864a71876a2eb9b244e3bd8f606eb09568c0" + integrity sha512-BalK54tfK0pMC0jQFb2oHn1nz7JNQD/2ex5pBnCHgBi2xG7VV0cAOGy2RS2VbCqUXx5/6obMrMcQTJ8yjcGzbg== + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + fstream-ignore@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" @@ -4218,11 +4766,6 @@ get-caller-file@^1.0.0: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" integrity sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U= -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= - get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" @@ -4250,25 +4793,6 @@ git-repo-info@^1.1.2, git-repo-info@^1.4.1: resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-1.4.1.tgz#2a072823254aaf62fcf0766007d7b6651bd41943" integrity sha1-KgcoIyVKr2L88HZgB9e2ZRvUGUM= -git-repo-info@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-1.2.0.tgz#43d8513e04a24dd441330a2f7c6655a709fdbaf2" - integrity sha1-Q9hRPgSiTdRBMwovfGZVpwn9uvI= - -git-repo-version@0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/git-repo-version/-/git-repo-version-0.4.1.tgz#75fab9a0a4ec8470755b0eea7fdaa6f9d41453bf" - integrity sha1-dfq5oKTshHB1Ww7qf9qm+dQUU78= - dependencies: - git-repo-info "~1.2.0" - -git-tools@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/git-tools/-/git-tools-0.1.4.tgz#5e43e59443b8a5dedb39dba663da49e79f943978" - integrity sha1-XkPllEO4pd7bOdumY9pJ55+UOXg= - dependencies: - spawnback "~1.0.0" - glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" @@ -4307,7 +4831,7 @@ glob@^5.0.10: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.3, glob@^7.0.4, glob@^7.0.5, glob@^7.1.2: +glob@^7.0.3, glob@^7.0.4, glob@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== @@ -4319,6 +4843,18 @@ glob@^7.0.3, glob@^7.0.4, glob@^7.0.5, glob@^7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.0.5, glob@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + global-modules@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" @@ -4384,7 +4920,7 @@ globby@^5.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= @@ -4394,11 +4930,6 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.5, resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= -growl@1.9.2: - version "1.9.2" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" - integrity sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8= - growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -4441,6 +4972,14 @@ har-validator@~5.0.3: ajv "^5.1.0" har-schema "^2.0.0" +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + has-ansi@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" @@ -4474,11 +5013,6 @@ has-cors@1.1.0: resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= - has-flag@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" @@ -4545,21 +5079,6 @@ hawk@3.1.3, hawk@~3.1.3: hoek "2.x.x" sntp "1.x.x" -hawk@~6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" - integrity sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ== - dependencies: - boom "4.x.x" - cryptiles "3.x.x" - hoek "4.x.x" - sntp "2.x.x" - -he@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" - integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= - heimdalljs-fs-monitor@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/heimdalljs-fs-monitor/-/heimdalljs-fs-monitor-0.1.0.tgz#d404a65688c6714c485469ed3495da4853440272" @@ -4573,15 +5092,22 @@ heimdalljs-graph@^0.3.1: resolved "https://registry.yarnpkg.com/heimdalljs-graph/-/heimdalljs-graph-0.3.4.tgz#0bd75797beeaa20b0ed59017aed3b2d95312acee" integrity sha512-2DXgPIxdatgtBOjlh5qeVeHIGMTC2V9ujEvUhVJBVOVwqnU41g1OuGaRugLi6rvk0E+u1koYkfPeptybV8ZJ4g== -heimdalljs-logger@^0.1.7: - version "0.1.9" - resolved "https://registry.yarnpkg.com/heimdalljs-logger/-/heimdalljs-logger-0.1.9.tgz#d76ada4e45b7bb6f786fc9c010a68eb2e2faf176" - integrity sha1-12raTkW3u294b8nAEKaOsuL68XY= +heimdalljs-logger@^0.1.7, heimdalljs-logger@^0.1.9: + version "0.1.10" + resolved "https://registry.yarnpkg.com/heimdalljs-logger/-/heimdalljs-logger-0.1.10.tgz#90cad58aabb1590a3c7e640ddc6a4cd3a43faaf7" + integrity sha512-pO++cJbhIufVI/fmB/u2Yty3KJD0TqNPecehFae0/eps0hkZ3b4Zc/PezUMOpYuHFQbA7FxHZxa305EhmjLj4g== dependencies: debug "^2.2.0" - heimdalljs "^0.2.0" + heimdalljs "^0.2.6" -heimdalljs@^0.2.0, heimdalljs@^0.2.1, heimdalljs@^0.2.3: +heimdalljs@^0.2.0, heimdalljs@^0.2.5, heimdalljs@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.2.6.tgz#b0eebabc412813aeb9542f9cc622cb58dbdcd9fe" + integrity sha512-o9bd30+5vLBvBtzCPwwGqpry2+n0Hi6H1+qwt6y+0kwRHGGF8TFIhJPmnuM0xO97zaKrDZMwO/V56fAnn8m/tA== + dependencies: + rsvp "~3.2.1" + +heimdalljs@^0.2.1, heimdalljs@^0.2.3: version "0.2.5" resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.2.5.tgz#6aa54308eee793b642cff9cf94781445f37730ac" integrity sha1-aqVDCO7nk7ZCz/nPlHgURfN3MKw= @@ -4600,11 +5126,6 @@ hoek@2.x.x: resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" integrity sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0= -hoek@4.x.x: - version "4.2.0" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" - integrity sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ== - home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" @@ -4625,7 +5146,7 @@ hosted-git-info@^2.1.4, hosted-git-info@^2.5.0: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" integrity sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg== -html-encoding-sniffer@^1.0.1, html-encoding-sniffer@^1.0.2: +html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== @@ -4678,6 +5199,20 @@ iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@~0.4.13: resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" integrity sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ== +iconv-lite@0.4.24, iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + dependencies: + minimatch "^3.0.4" + ignore@^3.3.3, ignore@^3.3.6: version "3.3.7" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" @@ -4774,13 +5309,6 @@ inquirer@^3.0.6: strip-ansi "^4.0.0" through "^2.3.6" -invariant@^2.2.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - invariant@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" @@ -4812,13 +5340,6 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -4854,7 +5375,7 @@ is-descriptor@^0.1.0: is-data-descriptor "^0.1.4" kind-of "^5.0.0" -is-descriptor@^1.0.0: +is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== @@ -5039,6 +5560,11 @@ is-windows@^1.0.1: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.1.tgz#310db70f742d259a16a369202b51af84233310d9" integrity sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk= +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -5090,11 +5616,16 @@ jquery-deferred@^0.3.0: resolved "https://registry.yarnpkg.com/jquery-deferred/-/jquery-deferred-0.3.1.tgz#596eca1caaff54f61b110962b23cafea74c35355" integrity sha1-WW7KHKr/VPYbEQlisjyv6nTDU1U= -jquery@^3.1.0, jquery@^3.2.1: +jquery@^3.2.1: version "3.3.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" integrity sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg== +js-levenshtein@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + js-reporters@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/js-reporters/-/js-reporters-1.2.1.tgz#f88c608e324a3373a95bcc45ad305e5c979c459b" @@ -5105,6 +5636,11 @@ js-tokens@^3.0.0, js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.6.1, js-yaml@^3.9.1: version "3.10.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" @@ -5118,63 +5654,38 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jsdom@^11.12.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" - integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== +jsdom@^13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-13.1.0.tgz#fa7356f0cc8111d0f1077cb7800d06f22f1d66c7" + integrity sha512-C2Kp0qNuopw0smXFaHeayvharqF3kkcNqlcIlSX71+3XrsOFwkEPLt/9f5JksMmaul2JZYIQuY+WTpqHpQQcLg== dependencies: abab "^2.0.0" - acorn "^5.5.3" - acorn-globals "^4.1.0" + acorn "^6.0.4" + acorn-globals "^4.3.0" array-equal "^1.0.0" - cssom ">= 0.3.2 < 0.4.0" - cssstyle "^1.0.0" - data-urls "^1.0.0" + cssom "^0.3.4" + cssstyle "^1.1.1" + data-urls "^1.1.0" domexception "^1.0.1" - escodegen "^1.9.1" + escodegen "^1.11.0" html-encoding-sniffer "^1.0.2" - left-pad "^1.3.0" - nwsapi "^2.0.7" - parse5 "4.0.0" + nwsapi "^2.0.9" + parse5 "5.1.0" pn "^1.1.0" - request "^2.87.0" + request "^2.88.0" request-promise-native "^1.0.5" - sax "^1.2.4" + saxes "^3.1.4" symbol-tree "^3.2.2" - tough-cookie "^2.3.4" + tough-cookie "^2.5.0" w3c-hr-time "^1.0.1" + w3c-xmlserializer "^1.0.1" webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.3" - whatwg-mimetype "^2.1.0" - whatwg-url "^6.4.1" - ws "^5.2.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^7.0.0" + ws "^6.1.2" xml-name-validator "^3.0.0" -jsdom@^9.5.0: - version "9.12.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" - integrity sha1-6MVG//ywbADUgzyoRBD+1/igl9Q= - dependencies: - abab "^1.0.3" - acorn "^4.0.4" - acorn-globals "^3.1.0" - array-equal "^1.0.0" - content-type-parser "^1.0.1" - cssom ">= 0.3.2 < 0.4.0" - cssstyle ">= 0.2.37 < 0.3.0" - escodegen "^1.6.1" - html-encoding-sniffer "^1.0.1" - nwmatcher ">= 1.3.9 < 2.0.0" - parse5 "^1.5.1" - request "^2.79.0" - sax "^1.2.1" - symbol-tree "^3.2.1" - tough-cookie "^2.3.2" - webidl-conversions "^4.0.0" - whatwg-encoding "^1.0.1" - whatwg-url "^4.3.0" - xml-name-validator "^2.0.1" - jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" @@ -5200,6 +5711,11 @@ json-schema-traverse@^0.3.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" @@ -5232,6 +5748,13 @@ json5@^0.5.1: resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= +json5@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" + integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + dependencies: + minimist "^1.2.0" + jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" @@ -5239,13 +5762,6 @@ jsonfile@^2.1.0: optionalDependencies: graceful-fs "^4.1.6" -jsonfile@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" - integrity sha1-pezG9l9T9mLEQVx2daAzHQmS7GY= - optionalDependencies: - graceful-fs "^4.1.6" - jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -5320,11 +5836,6 @@ leek@0.0.24: lodash.assign "^3.2.0" rsvp "^3.0.21" -left-pad@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" - integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== - levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -5356,10 +5867,10 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -loader.js@^4.2.3: - version "4.6.0" - resolved "https://registry.yarnpkg.com/loader.js/-/loader.js-4.6.0.tgz#b965663ddbe2d80da482454cb865efe496e93e22" - integrity sha512-NjAnzMq/BM2VlXA9er0Nx1Runocgi+hEU53ENhCtTx82GX6/l9NXwfIqg81om6QvmhUlv2zH+4R+N+wOoeXytQ== +loader.js@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/loader.js/-/loader.js-4.7.0.tgz#a1a52902001c83631efde9688b8ab3799325ef1f" + integrity sha512-9M2KvGT6duzGMgkOcTkWb+PR/Q2Oe54df/tLgHGVmFpAmtqJ553xJh6N63iFYI2yjo2PeJXbS5skHi/QpJq4vA== locate-path@^2.0.0: version "2.0.0" @@ -5396,11 +5907,6 @@ lodash._basecopy@^3.0.0: resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY= -lodash._basecreate@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" - integrity sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE= - lodash._basecreate@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-2.3.0.tgz#9b88a86a4dcff7b7f3c61d83a2fcfc0671ec9de0" @@ -5569,15 +6075,6 @@ lodash.clonedeep@^4.4.1: resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= -lodash.create@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" - integrity sha1-1/KEnw29p+BGgruM1yqwIkYd6+c= - dependencies: - lodash._baseassign "^3.0.0" - lodash._basecreate "^3.0.0" - lodash._isiterateecall "^3.0.0" - lodash.debounce@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-3.1.1.tgz#812211c378a94cc29d5aa4e3346cf0bfce3a7df5" @@ -5777,17 +6274,17 @@ lodash@^3.10.1: resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= -lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.6.1: - version "4.17.5" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" - integrity sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw== - -lodash@^4.13.1, lodash@^4.2.0: +lodash@^4.13.1: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== -lodash@^4.5.1: +lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.6.1: + version "4.17.5" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" + integrity sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw== + +lodash@^4.17.10, lodash@^4.5.1: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -5832,11 +6329,6 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" -make-array@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/make-array/-/make-array-0.1.2.tgz#335e36ebb0c5a43154d21213a1ecaeae2a1bb3ef" - integrity sha1-M14267DFpDFU0hIToeyuriobs+8= - make-dir@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51" @@ -5890,7 +6382,7 @@ markdown-it@^8.3.0, markdown-it@^8.3.1: mdurl "^1.0.1" uc.micro "^1.0.3" -matcher-collection@^1.0.0, matcher-collection@^1.0.4, matcher-collection@^1.0.5: +matcher-collection@^1.0.0, matcher-collection@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.0.5.tgz#2ee095438372cb8884f058234138c05c644ec339" integrity sha512-nUCmzKipcJEwYsBVAFh5P+d7JBuhJaW1xs85Hara9xuMLqtCVUrW6DSC0JVIkluxEH2W45nPBM/wjHtBXa/tYA== @@ -5959,7 +6451,15 @@ merge-trees@^1.0.1: rimraf "^2.4.3" symlink-or-copy "^1.0.0" -merge@^1.1.3, merge@^1.2.0: +merge-trees@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-trees/-/merge-trees-2.0.0.tgz#a560d796e566c5d9b2c40472a2967cca48d85161" + integrity sha512-5xBbmqYBalWqmhYm51XlohhkmVOua3VAUrrWh8t9iOkaLpS6ifqm/UVuUjQCeDVJ9Vx3g2l6ihfkbLSTeKsHbw== + dependencies: + fs-updater "^1.0.4" + heimdalljs "^0.2.5" + +merge@^1.1.3: version "1.2.0" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" integrity sha1-dTHjnUlJwoGma4xabgJl6LBYlNo= @@ -6000,12 +6500,31 @@ micromatch@^3.0.4: extend-shallow "^2.0.1" extglob "^2.0.2" fragment-cache "^0.2.1" - kind-of "^6.0.0" - nanomatch "^1.2.5" + kind-of "^6.0.0" + nanomatch "^1.2.5" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" object.pick "^1.3.0" regex-not "^1.0.0" snapdragon "^0.8.1" - to-regex "^3.0.1" + to-regex "^3.0.2" "mime-db@>= 1.30.0 < 2": version "1.32.0" @@ -6017,6 +6536,11 @@ mime-db@~1.30.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" integrity sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE= +mime-db@~1.37.0: + version "1.37.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" + integrity sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg== + mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7: version "2.1.17" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" @@ -6024,6 +6548,13 @@ mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.16, dependencies: mime-db "~1.30.0" +mime-types@~2.1.19: + version "2.1.21" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" + integrity sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg== + dependencies: + mime-db "~1.37.0" + mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" @@ -6061,6 +6592,21 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= +minipass@^2.2.1, minipass@^2.3.4: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== + dependencies: + minipass "^2.2.1" + mixin-deep@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.0.tgz#47a8732ba97799457c8c1eca28f95132d7e8150a" @@ -6069,48 +6615,18 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: +mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" -mktemp@^0.4.0, mktemp@~0.4.0: +mktemp@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/mktemp/-/mktemp-0.4.0.tgz#6d0515611c8a8c84e484aa2000129b98e981ff0b" integrity sha1-bQUVYRyKjITkhKogABKbmOmB/ws= -mocha@^3.0.2, mocha@^3.4.2: - version "3.5.3" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.5.3.tgz#1e0480fe36d2da5858d1eb6acc38418b26eaa20d" - integrity sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg== - dependencies: - browser-stdout "1.3.0" - commander "2.9.0" - debug "2.6.8" - diff "3.2.0" - escape-string-regexp "1.0.5" - glob "7.1.1" - growl "1.9.2" - he "1.1.1" - json3 "3.3.2" - lodash.create "3.1.1" - mkdirp "0.5.1" - supports-color "3.1.2" - -moment-timezone@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.3.1.tgz#3ef47856b02d53b718a10a5ec2023aa299e07bf5" - integrity sha1-PvR4VrAtU7cYoQpewgI6opnge/U= - dependencies: - moment ">= 2.6.0" - -"moment@>= 2.6.0": - version "2.20.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.20.1.tgz#d6eb1a46cbcc14a2b2f9434112c1ff8907f313fd" - integrity sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg== - morgan@^1.8.1: version "1.9.0" resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.0.tgz#d01fa6c65859b76fcf31b3cb53a3821a311d8051" @@ -6142,6 +6658,11 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + mustache@^2.2.1: version "2.3.0" resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.0.tgz#4028f7778b17708a489930a6e52ac3bca0da41d0" @@ -6157,15 +6678,6 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -mz@^2.6.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - najax@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/najax/-/najax-1.0.3.tgz#11145f4d910446ea661d8ab7fcef53f6ad164ae5" @@ -6180,6 +6692,11 @@ nan@^2.3.0: resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" integrity sha1-7XFfP+neArV6XmJS2QqWZ14fCFo= +nan@^2.9.2: + version "2.12.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" + integrity sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw== + nanomatch@^1.2.5: version "1.2.7" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.7.tgz#53cd4aa109ff68b7f869591fdc9d10daeeea3e79" @@ -6197,11 +6714,37 @@ nanomatch@^1.2.5: snapdragon "^0.8.1" to-regex "^3.0.1" +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +needle@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" + integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" @@ -6242,6 +6785,22 @@ node-notifier@^5.0.1: shellwords "^0.1.1" which "^1.3.0" +node-pre-gyp@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" + integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + node-pre-gyp@^0.6.39: version "0.6.39" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" @@ -6259,7 +6818,14 @@ node-pre-gyp@^0.6.39: tar "^2.2.1" tar-pack "^3.4.0" -nopt@^3.0.3, nopt@^3.0.6: +node-releases@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.3.tgz#aad9ce0dcb98129c753f772c0aa01360fb90fbd2" + integrity sha512-6VrvH7z6jqqNFY200kdB6HdzkgM96Oaj9v3dqGfgp6mF+cHmU4wyQKZ2/WPDRVoR0Jz9KqbamaBN0ZhdUaysUQ== + dependencies: + semver "^5.3.0" + +nopt@^3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= @@ -6284,13 +6850,18 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.0, normalize-path@^2.0.1: +normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" +npm-bundled@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" + integrity sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g== + npm-git-info@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/npm-git-info/-/npm-git-info-1.0.3.tgz#a933c42ec321e80d3646e0d6e844afe94630e1d5" @@ -6306,6 +6877,14 @@ npm-package-arg@^6.0.0: semver "^5.4.1" validate-npm-package-name "^3.0.0" +npm-packlist@^1.1.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.2.0.tgz#55a60e793e272f00862c7089274439a4cc31fc7f" + integrity sha512-7Mni4Z8Xkx0/oegoqlcao/JpPCPEMtUvsmB0q7mgvlMinykJLSRTYuFqoQLYgGY8biuxIeiHO+QNJKbCfljewQ== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -6328,21 +6907,21 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -"nwmatcher@>= 1.3.9 < 2.0.0": - version "1.4.3" - resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c" - integrity sha512-IKdSTiDWCarf2JTS5e9e2+5tPZGdkRJ79XjYV0pzK8Q9BpsFyBq1RGKxzs7Q8UBushGw7m6TzVKz6fcY99iSWw== - -nwsapi@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.7.tgz#6fc54c254621f10cac5225b76e81c74120139b78" - integrity sha512-VZXniaaaORAXGCNsvUNefsKRQYk8zCzQZ57jalgrpHcU70OrAzKAiN/3plYtH/VPRmZeYyUzQiYfKzcMXC1g5Q== +nwsapi@^2.0.9: + version "2.0.9" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.9.tgz#77ac0cdfdcad52b6a1151a84e73254edc33ed016" + integrity sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ== oauth-sign@~0.8.1, oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM= +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + object-assign@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" @@ -6367,6 +6946,11 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" +object-hash@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" + integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== + object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -6524,15 +7108,10 @@ parse-passwd@^1.0.0: resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= -parse5@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" - integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== - -parse5@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" - integrity sha1-m387DeMr543CQBsXVzzK8Pb1nZQ= +parse5@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" + integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== parsejson@0.0.3: version "0.0.3" @@ -6604,6 +7183,11 @@ path-parse@^1.0.5: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" integrity sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME= +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + path-posix@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/path-posix/-/path-posix-1.0.0.tgz#06b26113f56beab042545a23bfa88003ccac260f" @@ -6623,11 +7207,6 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -pathval@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" - integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= - performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" @@ -6660,6 +7239,13 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.0" + pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" @@ -6694,10 +7280,10 @@ preserve@^0.2.0: resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= -pretender@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/pretender/-/pretender-2.1.0.tgz#cd75bff9624e996bcfadbd7dbd023ca1f4f3033a" - integrity sha512-GG1ZtA2yjorrSf9x3DR4Pv5228s/H92itSnIAxRx2wsmz549BsuIuJN+jPJgj0p+tCJBfBlmVgJLFG6t64M+EA== +pretender@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pretender/-/pretender-2.1.1.tgz#5085f0a1272c31d5b57c488386f69e6ca207cb35" + integrity sha512-IkidsJzaroAanw3I43tKCFm2xCpurkQr9aPXv5/jpN+LfCwDaeI8rngVWtQZTx4qqbhc5zJspnLHJ4N/25KvDQ== dependencies: "@xg-wang/whatwg-fetch" "^3.0.0" fake-xml-http-request "^2.0.0" @@ -6755,12 +7341,17 @@ psl@^1.1.24: resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.28.tgz#4fb6ceb08a1e2214d4fd4de0ca22dae13740bc7b" integrity sha512-+AqO1Ae+N/4r7Rvchrdm432afjT9hqJRyBN3DQv9At0tPz4hIFSGKbq64fN9dVoCow4oggIIax5/iONx0r9hZw== +psl@^1.1.28: + version "1.1.31" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" + integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== + punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= -punycode@^2.1.0: +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== @@ -6770,7 +7361,7 @@ qs@6.5.1, qs@^6.4.0, qs@~6.5.1: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" integrity sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A== -qs@^6.2.0: +qs@^6.2.0, qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== @@ -6789,26 +7380,25 @@ quick-temp@^0.1.0, quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quic rimraf "^2.5.4" underscore.string "~3.3.4" -qunit-dom@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-0.5.0.tgz#b08db6f919656e0589ebf8bd85bc313febb454d8" - integrity sha1-sI22+RllbgWJ6/i9hbwxP+u0VNg= +qunit-dom@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-0.8.4.tgz#8b75a73040df1735280fc2fab4c6a1a7f518488b" + integrity sha512-Ab2wCPQP2G2XdbIwhlUHMp3ROHh4XnqmK0ogHlpxwVIv+cXbW3/L6F9ucCThAMkjqCaxwZQQR+LaUHaaMxDCmw== dependencies: broccoli-funnel "^2.0.0" - broccoli-merge-trees "^2.0.0" + broccoli-merge-trees "^3.0.1" -qunit@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.5.0.tgz#64cbe30a1193ef02edc5b278efcdf1d0bae96b22" - integrity sha512-GVvRr8ISFMs4SkTWFsaUzMBs7QEuiXVT4orlFgyHkmeXO1ijlDkhW6ecPri4urXiE4BUXEULJAtFlV1MWgg4Uw== +qunit@~2.6.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.6.2.tgz#551210c5cf857258a4fe39a7fe15d9e14dfef22c" + integrity sha512-PHbKulmd4rrDhFto7iHicIstDTX7oMRvAcI7loHstvU8J7AOGwzcchONmy+EG4KU8HDk0K90o7vO0GhlYyKlOg== dependencies: - chokidar "1.7.0" commander "2.12.2" exists-stat "1.0.0" findup-sync "2.0.0" js-reporters "1.2.1" resolve "1.5.0" - shelljs "^0.2.6" + sane "^2.5.2" walk-sync "0.3.2" randomatic@^1.1.3: @@ -6852,6 +7442,16 @@ rc@^1.1.7: minimist "^1.2.0" strip-json-comments "~2.0.1" +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" @@ -6869,7 +7469,7 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -readable-stream@^2, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2: +readable-stream@^2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" integrity sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ== @@ -6892,16 +7492,6 @@ readable-stream@~1.0.2: isarray "0.0.1" string_decoder "~0.10.x" -readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" - integrity sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg= - dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" - readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" - recast@^0.11.3: version "0.11.23" resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" @@ -6927,11 +7517,23 @@ redeyed@~1.0.0: dependencies: esprima "~3.0.0" +regenerate-unicode-properties@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" + integrity sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw== + dependencies: + regenerate "^1.4.0" + regenerate@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" integrity sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg== +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + regenerator-runtime@^0.10.5: version "0.10.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" @@ -6942,6 +7544,11 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== +regenerator-runtime@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" + integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== + regenerator-transform@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" @@ -6951,6 +7558,13 @@ regenerator-transform@^0.10.0: babel-types "^6.19.0" private "^0.1.6" +regenerator-transform@^0.13.3: + version "0.13.3" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" + integrity sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA== + dependencies: + private "^0.1.6" + regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" @@ -6965,6 +7579,14 @@ regex-not@^1.0.0: dependencies: extend-shallow "^2.0.1" +regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" @@ -6974,11 +7596,28 @@ regexpu-core@^2.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" +regexpu-core@^4.1.3, regexpu-core@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.4.0.tgz#8d43e0d1266883969720345e70c275ee0aec0d32" + integrity sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^7.0.0" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.0.2" + regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= +regjsgen@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" + integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== + regjsparser@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" @@ -6986,6 +7625,13 @@ regjsparser@^0.1.4: dependencies: jsesc "~0.5.0" +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== + dependencies: + jsesc "~0.5.0" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -7052,10 +7698,10 @@ request@2.81.0: tunnel-agent "^0.6.0" uuid "^3.0.0" -request@^2.74.0, request@^2.79.0: - version "2.83.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" - integrity sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw== +request@^2.81.0: + version "2.87.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" + integrity sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw== dependencies: aws-sign2 "~0.7.0" aws4 "^1.6.0" @@ -7065,7 +7711,6 @@ request@^2.74.0, request@^2.79.0: forever-agent "~0.6.1" form-data "~2.3.1" har-validator "~5.0.3" - hawk "~6.0.2" http-signature "~1.2.0" is-typedarray "~1.0.0" isstream "~0.1.2" @@ -7075,36 +7720,35 @@ request@^2.74.0, request@^2.79.0: performance-now "^2.1.0" qs "~6.5.1" safe-buffer "^5.1.1" - stringstream "~0.0.5" tough-cookie "~2.3.3" tunnel-agent "^0.6.0" uuid "^3.1.0" -request@^2.81.0, request@^2.87.0: - version "2.87.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" - integrity sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw== +request@^2.88.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== dependencies: aws-sign2 "~0.7.0" - aws4 "^1.6.0" + aws4 "^1.8.0" caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" + combined-stream "~1.0.6" + extend "~3.0.2" forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" + form-data "~2.3.2" + har-validator "~5.1.0" http-signature "~1.2.0" is-typedarray "~1.0.0" isstream "~0.1.2" json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" + mime-types "~2.1.19" + oauth-sign "~0.9.0" performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - tough-cookie "~2.3.3" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" tunnel-agent "^0.6.0" - uuid "^3.1.0" + uuid "^3.3.2" require-folder-tree@^1.4.5: version "1.4.5" @@ -7131,6 +7775,11 @@ requires-port@1.x.x: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= +reselect@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147" + integrity sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc= + resolve-dir@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" @@ -7171,6 +7820,13 @@ resolve@^1.1.7: dependencies: path-parse "^1.0.5" +resolve@^1.3.2, resolve@^1.8.1: + version "1.9.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.9.0.tgz#a14c6fdfa8f92a7df1d996cb7105fa744658ea06" + integrity sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ== + dependencies: + path-parse "^1.0.6" + restore-cursor@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" @@ -7187,6 +7843,11 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" @@ -7194,13 +7855,20 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.3.2, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.1, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1: +rimraf@2, rimraf@^2.2.8, rimraf@^2.3.2, rimraf@^2.4.4, rimraf@^2.5.1, rimraf@^2.5.3, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== dependencies: glob "^7.0.5" +rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.5.4, rimraf@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + rimraf@~2.2.6: version "2.2.8" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" @@ -7216,7 +7884,7 @@ route-recognizer@^0.3.4: resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.4.tgz#39ab1ffbce1c59e6d2bdca416f0932611e4f3ca3" integrity sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g== -rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.2.1, rsvp@^3.3.1, rsvp@^3.3.3, rsvp@^3.5.0: +rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.2.1, rsvp@^3.3.3, rsvp@^3.5.0: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== @@ -7231,6 +7899,11 @@ rsvp@^4.8.2: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.3.tgz#25d4b9fdd0f95e216eb5884d9b3767d3fbfbe2cd" integrity sha512-/OlbK31XtkPnLD2ktmZXj4g/v6q1boTDr6/3lFuDTgxVsrA3h7PH5eYyAxIvDMjRHr/DoOlzNicqDwBEo9xU7g== +rsvp@^4.8.3, rsvp@^4.8.4: + version "4.8.4" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911" + integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA== + rsvp@~3.0.6: version "3.0.21" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.0.21.tgz#49c588fe18ef293bcd0ab9f4e6756e6ac433359f" @@ -7270,12 +7943,29 @@ safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, s resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== +safe-buffer@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safe-json-parse@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" integrity sha1-PnZyPjjf3aE8mx0poeB//uSzC1c= -sane@^1.1.1, sane@^1.4.1: +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane@^1.1.1: version "1.7.0" resolved "https://registry.yarnpkg.com/sane/-/sane-1.7.0.tgz#b3579bccb45c94cf20355cc81124990dfd346e30" integrity sha1-s1ebzLRclM8gNVzIESSZDf00bjA= @@ -7303,21 +7993,39 @@ sane@^2.2.0: optionalDependencies: fsevents "^1.1.1" -sax@^1.2.1, sax@^1.2.4: +sane@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" + integrity sha1-tNwYYcIbQn6SlQej51HiosuKs/o= + dependencies: + anymatch "^2.0.0" + capture-exit "^1.2.0" + exec-sh "^0.2.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.18.0" + optionalDependencies: + fsevents "^1.2.3" + +sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +saxes@^3.1.4: + version "3.1.5" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.5.tgz#ecbba12c7ca99f87f70dbd14a6c57b2b5de8b298" + integrity sha512-2mgiX2VOarcQv8G40WdJ5QJniYdsPr0yGedkd98PqApodsS9DG29qyHl/X65OILm7Bapd1/zUUvTHVZwNLhXvQ== + dependencies: + xmlchars "^1.3.1" + "semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.1.1, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== -semver@^4.3.1: - version "4.3.6" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" - integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= - send@0.16.1: version "0.16.1" resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" @@ -7359,11 +8067,6 @@ set-getter@^0.1.0: dependencies: to-object-path "^0.3.0" -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= - set-value@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" @@ -7406,11 +8109,6 @@ shebang-regex@^1.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= -shelljs@^0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.2.6.tgz#90492d72ffcc8159976baba62fb0f6884f0c3378" - integrity sha1-kEktcv/MgVmXa6umL7D2iE8MM3g= - shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" @@ -7489,13 +8187,6 @@ sntp@1.x.x: dependencies: hoek "2.x.x" -sntp@2.x.x: - version "2.1.0" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" - integrity sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg== - dependencies: - hoek "4.x.x" - socket.io-adapter@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" @@ -7582,6 +8273,14 @@ source-map-support@^0.5.0: buffer-from "^1.0.0" source-map "^0.6.0" +source-map-support@~0.5.6: + version "0.5.10" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c" + integrity sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" @@ -7599,7 +8298,7 @@ source-map@0.4.x, source-map@^0.4.2, source-map@^0.4.4: dependencies: amdefine ">=0.0.4" -source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.1, source-map@~0.5.6: +source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.1: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -7639,11 +8338,6 @@ spawn-sync@^1.0.11, spawn-sync@^1.0.15: concat-stream "^1.4.7" os-shim "^0.1.2" -spawnback@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/spawnback/-/spawnback-1.0.0.tgz#f73662f7e54d95367eca74d6426c677dd7ea686f" - integrity sha1-9zZi9+VNlTZ+ynTWQmxnfdfqaG8= - spdx-correct@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" @@ -7669,9 +8363,9 @@ split-string@^3.0.1, split-string@^3.0.2: extend-shallow "^3.0.0" sprintf-js@^1.0.3: - version "1.1.1" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c" - integrity sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw= + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== sprintf-js@~1.0.2: version "1.0.3" @@ -7755,7 +8449,7 @@ string_decoder@~1.0.3: dependencies: safe-buffer "~5.1.0" -stringstream@~0.0.4, stringstream@~0.0.5: +stringstream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" integrity sha1-TkhM1N5aC7vuGORjB3EKioFiGHg= @@ -7822,13 +8516,6 @@ sum-up@^1.0.1: dependencies: chalk "^1.0.0" -supports-color@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" - integrity sha1-cqJiiU2dQIuVbKBf83su2KbiotU= - dependencies: - has-flag "^1.0.0" - supports-color@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" @@ -7853,12 +8540,24 @@ supports-color@^5.2.0: dependencies: has-flag "^3.0.0" -symbol-tree@^3.2.1, symbol-tree@^3.2.2: +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +symbol-tree@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= -symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.3, symlink-or-copy@^1.1.8: +symlink-or-copy@^1.0.0, symlink-or-copy@^1.1.8, symlink-or-copy@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.2.0.tgz#5d49108e2ab824a34069b68974486c290020b393" + integrity sha512-W31+GLiBmU/ZR02Ii0mVZICuNEN9daZ63xZMPDsYgPgNjMtg+atqLEGI7PPI936jYSQZxoLb/63xos8Adrx4Eg== + +symlink-or-copy@^1.0.1: version "1.1.8" resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.1.8.tgz#cabe61e0010c1c023c173b25ee5108b37f4b4aa3" integrity sha1-yr5h4AEMHAI8Fzsl7lEIs39LSqM= @@ -7908,7 +8607,20 @@ tar@^2.2.1: fstream "^1.0.2" inherits "2" -temp@0.8.3, temp@^0.8.3: +tar@^4: + version "4.4.8" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" + integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.3.4" + minizlib "^1.1.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + +temp@0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" integrity sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k= @@ -7916,6 +8628,15 @@ temp@0.8.3, temp@^0.8.3: os-tmpdir "^1.0.0" rimraf "~2.2.6" +terser@^3.7.5: + version "3.14.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-3.14.1.tgz#cc4764014af570bc79c79742358bd46926018a32" + integrity sha512-NSo3E99QDbYSMeJaEk9YW2lTg3qS9V0aKGlb+PlOrei1X02r1wSBHCNX/O+yeTRFSWPKPIGj6MqvvdqV4rnVGw== + dependencies: + commander "~2.17.1" + source-map "~0.6.1" + source-map-support "~0.5.6" + testem@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/testem/-/testem-2.0.0.tgz#b05c96200c7ac98bae998d71c94c0c5345907d13" @@ -7959,20 +8680,6 @@ text-table@~0.2.0: resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.2.0.tgz#38ac676151285b658654581987a0ce1a4490d286" integrity sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA== -thenify-all@^1.0.0, thenify-all@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.0" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" - integrity sha1-5p44obq+lpsBCCB5eLn2K4hgSDk= - dependencies: - any-promise "^1.0.0" - through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -7997,13 +8704,6 @@ tmp@0.0.28: dependencies: os-tmpdir "~1.0.1" -tmp@0.0.31: - version "0.0.31" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" - integrity sha1-jzirlDjhcxXl29izZX6L+yd65Kc= - dependencies: - os-tmpdir "~1.0.1" - tmp@^0.0.29: version "0.0.29" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" @@ -8062,7 +8762,17 @@ to-regex@^3.0.1: extend-shallow "^2.0.1" regex-not "^1.0.0" -tough-cookie@>=2.3.3, tough-cookie@^2.3.4: +to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +tough-cookie@>=2.3.3, tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== @@ -8070,7 +8780,15 @@ tough-cookie@>=2.3.3, tough-cookie@^2.3.4: psl "^1.1.24" punycode "^1.4.1" -tough-cookie@^2.3.2, tough-cookie@~2.3.0, tough-cookie@~2.3.3: +tough-cookie@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@~2.3.0, tough-cookie@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" integrity sha1-C2GKVWW23qkL80JdBNVe3EdadWE= @@ -8084,11 +8802,6 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= - tree-sync@^1.2.1, tree-sync@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-sync/-/tree-sync-1.2.2.tgz#2cf76b8589f59ffedb58db5a3ac7cb013d0158b7" @@ -8129,11 +8842,6 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@^4.0.0: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - type-is@~1.6.15: version "1.6.15" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" @@ -8152,14 +8860,6 @@ uc.micro@^1.0.1, uc.micro@^1.0.3: resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376" integrity sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg== -uglify-es@^3.1.3: - version "3.3.9" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" - integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== - dependencies: - commander "~2.13.0" - source-map "~0.6.1" - uglify-js@^2.6: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" @@ -8185,10 +8885,10 @@ ultron@1.0.x: resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" integrity sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po= -underscore.string@^3.2.2, underscore.string@~3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db" - integrity sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s= +underscore.string@~3.3.4: + version "3.3.5" + resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023" + integrity sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg== dependencies: sprintf-js "^1.0.3" util-deprecate "^1.0.2" @@ -8198,6 +8898,29 @@ underscore@>=1.8.3: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI= +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" + integrity sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" + integrity sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg== + union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" @@ -8240,6 +8963,13 @@ untildify@^2.1.0: dependencies: os-homedir "^1.0.0" +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" @@ -8290,6 +9020,11 @@ uuid@^3.0.0, uuid@^3.1.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA== +uuid@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + validate-npm-package-license@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" @@ -8326,7 +9061,16 @@ w3c-hr-time@^1.0.1: dependencies: browser-process-hrtime "^0.1.2" -walk-sync@0.3.2, walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2: +w3c-xmlserializer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.0.1.tgz#054cdcd359dc5d1f3ec9be4e272c756af4b21d39" + integrity sha512-XZGI1OH/OLQr/NaJhhPmzhngwcAnZDLytsvXnRmlYeRkmbb0I7sqFFA22erq4WQR0sUu17ZSQOAV9mFwCqKRNg== + dependencies: + domexception "^1.0.1" + webidl-conversions "^4.0.2" + xml-name-validator "^3.0.0" + +walk-sync@0.3.2, walk-sync@^0.3.0, walk-sync@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.2.tgz#4827280afc42d0e035367c4a4e31eeac0d136f75" integrity sha512-FMB5VqpLqOCcqrzA9okZFc0wq0Qbmdm396qJxvQZhDpyu0W95G9JCmp74tx7iyYnyOcBtUuKJsgIKAqjozvmmQ== @@ -8342,6 +9086,14 @@ walk-sync@^0.2.5, walk-sync@^0.2.7: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" +walk-sync@^0.3.1, walk-sync@^0.3.3: + version "0.3.4" + resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.4.tgz#cf78486cc567d3a96b5b2237c6108017a5ffb9a4" + integrity sha512-ttGcuHA/OBnN2pcM6johpYlEms7XpO5/fyKIr48541xXedan4roO8cS1Q2S/zbbjGH/BarYDAMeS2Mi9HE5Tig== + dependencies: + ensure-posix-path "^1.0.0" + matcher-collection "^1.0.0" + walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -8362,12 +9114,7 @@ watch@~0.18.0: exec-sh "^0.2.0" minimist "^1.2.0" -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - -webidl-conversions@^4.0.0, webidl-conversions@^4.0.2: +webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== @@ -8385,30 +9132,29 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: +whatwg-encoding@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" integrity sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw== dependencies: iconv-lite "0.4.19" -whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" - integrity sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew== - -whatwg-url@^4.3.0: - version "4.8.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" - integrity sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA= +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" + iconv-lite "0.4.24" -whatwg-url@^6.4.0, whatwg-url@^6.4.1: - version "6.5.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" - integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== +whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" + integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== dependencies: lodash.sortby "^4.7.0" tr46 "^1.0.1" @@ -8455,6 +9201,13 @@ workerpool@^2.3.0: dependencies: object-assign "4.1.1" +workerpool@^2.3.1: + version "2.3.3" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-2.3.3.tgz#49a70089bd55e890d68cc836a19419451d7c81d7" + integrity sha512-L1ovlYHp6UObYqElXXpbd214GgbEKDED0d3sj7pRdFXjNkb2+un/AUcCkceHizO0IVI6SOGGncrcjozruCkRgA== + dependencies: + object-assign "4.1.1" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -8484,10 +9237,10 @@ ws@1.1.1: options ">=0.0.5" ultron "1.0.x" -ws@^5.2.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" - integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== +ws@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.2.tgz#3cc7462e98792f0ac679424148903ded3b9c3ad8" + integrity sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw== dependencies: async-limiter "~1.0.0" @@ -8501,16 +9254,16 @@ xdg-basedir@^3.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= -xml-name-validator@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" - integrity sha1-TYuPHszTQZqjYgYb7O9RXh5VljU= - xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +xmlchars@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-1.3.1.tgz#1dda035f833dbb4f86a0c28eaa6ca769214793cf" + integrity sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw== + xmldom@^0.1.19: version "0.1.27" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" @@ -8531,6 +9284,11 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + yam@0.0.22: version "0.0.22" resolved "https://registry.yarnpkg.com/yam/-/yam-0.0.22.tgz#38a76cb79a19284d9206ed49031e359a1340bd06" From 4f9fa5761ee5e45d43e3ec6bf39bc850de4c1383 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 17 Jan 2019 08:05:36 -0500 Subject: [PATCH 276/879] Upgrade Ember CLI (#1456) * Upgrade Ember CLI and friends * Upgrade Ember CLI again * Run yarn install * Fixing up tests, update ember-data * Add jquery as devDep for tests * Fix Ember Data test * Fix template lint errors * Fix ESLint tests * Test project: Remove unused dep * Fix test project 01 tests * Test project 02 tests --- .eslintignore | 18 + .eslintrc.js | 12 +- .gitignore | 22 +- .npmignore | 40 +- .template-lintrc.js | 5 + .travis.yml | 22 +- config/ember-try.js | 195 +- package.json | 60 +- .../config/optional-features.json | 3 + test-projects/01-basic-app/package.json | 2 +- test-projects/01-basic-app/testem.js | 1 - .../tests/helpers/promise-ajax.js | 1 + .../config/optional-features.json | 3 + .../02-app-that-excludes-mirage/package.json | 2 +- .../tests/helpers/promise-ajax.js | 1 + testem.js | 11 +- tests/dummy/app/templates/contact.hbs | 6 +- tests/dummy/app/templates/contacts.hbs | 8 +- tests/dummy/app/templates/edit.hbs | 4 +- tests/dummy/app/templates/pets.hbs | 6 +- tests/dummy/config/optional-features.json | 3 + tests/dummy/config/targets.js | 22 +- tests/helpers/.gitkeep | 0 tests/helpers/promise-ajax.js | 1 + tests/integration/ember-data-test.js | 4 +- tests/integration/server-config-test.js | 3 +- yarn.lock | 3025 +++++++++++------ 27 files changed, 2198 insertions(+), 1282 deletions(-) create mode 100644 .eslintignore create mode 100644 .template-lintrc.js create mode 100644 test-projects/01-basic-app/config/optional-features.json create mode 100644 test-projects/02-app-that-excludes-mirage/config/optional-features.json create mode 100644 tests/dummy/config/optional-features.json create mode 100644 tests/helpers/.gitkeep diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..6437276cc --- /dev/null +++ b/.eslintignore @@ -0,0 +1,18 @@ +# unconventional js +/blueprints/*/files/ +/vendor/ + +# compiled output +/dist/ +/tmp/ + +# dependencies +/bower_components/ + +# misc +/coverage/ + +# ember-try +/.node_modules.ember-try/ +/bower.json.ember-try +/package.json.ember-try diff --git a/.eslintrc.js b/.eslintrc.js index 62e5a2bc5..9808338b4 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -28,23 +28,25 @@ module.exports = { }, globals: { faker: true, - server: true, - $: true + server: true }, overrides: [ // node files { files: [ + '.template-lintrc.js', + 'ember-cli-build.js', 'index.js', 'testem.js', - 'ember-cli-build.js', + 'blueprints/*/index.js', 'config/**/*.js', 'tests/dummy/config/**/*.js', 'fastboot-tests/**/*.js' ], excludedFiles: [ - 'app/**', 'addon/**', + 'addon-test-support/**', + 'app/**', 'tests/dummy/app/**' ], parserOptions: { @@ -61,7 +63,7 @@ module.exports = { }) }, - // test files + // test files. Can remove when we upgrade tests to new style. { files: ['tests/**/*.js'], excludedFiles: ['tests/dummy/**/*.js'], diff --git a/.gitignore b/.gitignore index c7f005ca1..622699b38 100644 --- a/.gitignore +++ b/.gitignore @@ -1,26 +1,26 @@ # See https://help.github.com/ignore-files/ for more about ignoring files. # compiled output -/dist -/tmp +/dist/ +/tmp/ # dependencies -/node_modules -/bower_components +/bower_components/ +/node_modules/ # misc /.sass-cache /connect.lock -/coverage/* +/coverage/ /libpeerconnection.log -npm-debug.log* -yarn-error.log -testem.log +/npm-debug.log* +/testem.log +/yarn-error.log # ember-try -.node_modules.ember-try/ -bower.json.ember-try -package.json.ember-try +/.node_modules.ember-try/ +/bower.json.ember-try +/package.json.ember-try # custom .floo diff --git a/.npmignore b/.npmignore index bb44b66a8..40f43e20f 100644 --- a/.npmignore +++ b/.npmignore @@ -1,26 +1,36 @@ -/bower_components +# compiled output +/dist/ +/tmp/ + +# dependencies +/bower_components/ + +# misc +/.bowerrc +/.editorconfig +/.ember-cli +/.eslintignore +/.eslintrc.js +/.gitignore +/.watchmanconfig +/.travis.yml +/bower.json /config/ember-try.js /dist /scripts -/tests /tmp **/.gitkeep -.bowerrc -.editorconfig -.ember-cli -.eslintrc.js -.gitignore -.watchmanconfig -.travis.yml bower.json -ember-cli-build.js -testem.js -yarn.lock +/ember-cli-build.js +/testem.js +/tests/ +/yarn.lock +.gitkeep # ember-try -.node_modules.ember-try/ -bower.json.ember-try -package.json.ember-try +/.node_modules.ember-try/ +/bower.json.ember-try +/package.json.ember-try /.sass-cache /jekyll-tmp diff --git a/.template-lintrc.js b/.template-lintrc.js new file mode 100644 index 000000000..b45e96ffd --- /dev/null +++ b/.template-lintrc.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = { + extends: 'recommended' +}; diff --git a/.travis.yml b/.travis.yml index 5747d6a33..7edfe3541 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,13 @@ --- language: node_js node_js: + # we recommend testing addons with the same minimum supported node version as Ember CLI + # so that your addon works for all apps - "8" +sudo: false +dist: trusty + addons: chrome: stable @@ -39,22 +44,12 @@ jobs: script: yarn test:test-projects - stage: versioned tests - env: EMBER_TRY_SCENARIO=ember-lts-2.4 - script: node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO --skip-cleanup - - env: EMBER_TRY_SCENARIO=ember-lts-2.8 - script: node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO --skip-cleanup - - env: EMBER_TRY_SCENARIO=ember-lts-2.12 - script: node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO --skip-cleanup - - env: EMBER_TRY_SCENARIO=ember-lts-2.16 - script: node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO --skip-cleanup + env: EMBER_TRY_SCENARIO=ember-lts-2.18 - env: EMBER_TRY_SCENARIO=ember-release - script: node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO --skip-cleanup - env: EMBER_TRY_SCENARIO=ember-beta - script: node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO --skip-cleanup - env: EMBER_TRY_SCENARIO=ember-canary - script: node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO --skip-cleanup - env: EMBER_TRY_SCENARIO=ember-default - script: node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO --skip-cleanup + - env: EMBER_TRY_SCENARIO=ember-default-with-jquery - stage: npm release install: skip @@ -71,3 +66,6 @@ jobs: allow_failures: - env: EMBER_TRY_SCENARIO=ember-beta - env: EMBER_TRY_SCENARIO=ember-canary + +script: + - node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO diff --git a/config/ember-try.js b/config/ember-try.js index 0cd04d429..20d17d9c7 100644 --- a/config/ember-try.js +++ b/config/ember-try.js @@ -1,137 +1,72 @@ -module.exports = { - useYarn: true, - scenarios: [ - { - name: 'ember-1.13', - bower: { - dependencies: { - 'ember': '~1.13.0' +'use strict'; + +const getChannelURL = require('ember-source-channel-url'); + +module.exports = function() { + return Promise.all([ + getChannelURL('release'), + getChannelURL('beta'), + getChannelURL('canary') + ]).then((urls) => { + return { + useYarn: true, + scenarios: [ + { + name: 'ember-lts-2.18', + env: { + EMBER_OPTIONAL_FEATURES: JSON.stringify({ 'jquery-integration': true }) + }, + npm: { + devDependencies: { + '@ember/jquery': '^0.5.1', + 'ember-source': '~2.18.0' + } + } }, - resolutions: { - 'ember': '~1.13.0' - } - }, - npm: { - devDependencies: { - 'ember-source': null - } - } - }, - { - name: 'ember-lts-2.4', - bower: { - dependencies: { - 'ember': 'components/ember#lts-2-4' + { + name: 'ember-release', + npm: { + devDependencies: { + 'ember-source': urls[0] + } + } }, - resolutions: { - 'ember': 'lts-2-4' - } - }, - npm: { - devDependencies: { - 'ember-source': null - } - } - }, - { - name: 'ember-lts-2.8', - bower: { - dependencies: { - 'ember': 'components/ember#lts-2-8' - }, - resolutions: { - 'ember': 'lts-2-8' - } - }, - npm: { - devDependencies: { - 'ember-source': null - } - } - }, - { - name: 'ember-lts-2.12', - npm: { - devDependencies: { - 'ember-source': '~2.12.0' - } - } - }, - { - name: 'ember-lts-2.16', - npm: { - devDependencies: { - 'ember-source': '~2.16.0' - } - } - }, - { - name: 'ember-release', - bower: { - dependencies: { - 'ember': 'components/ember#release' + { + name: 'ember-beta', + npm: { + devDependencies: { + 'ember-source': urls[1] + } + } }, - resolutions: { - 'ember': 'release' - } - }, - npm: { - devDependencies: { - 'ember-source': null - } - } - }, - { - name: 'ember-beta', - bower: { - dependencies: { - 'ember': 'components/ember#beta' + { + name: 'ember-canary', + npm: { + devDependencies: { + 'ember-source': urls[2] + } + } }, - resolutions: { - 'ember': 'beta' - } - }, - npm: { - devDependencies: { - 'ember-source': null - } - } - }, - { - name: 'ember-canary', - bower: { - dependencies: { - 'ember': 'components/ember#canary' + { + name: 'ember-default', + npm: { + devDependencies: {} + } }, - resolutions: { - 'ember': 'canary' - } - }, - npm: { - devDependencies: { - 'ember-source': null + { + name: 'ember-default-with-jquery', + env: { + EMBER_OPTIONAL_FEATURES: JSON.stringify({ + 'jquery-integration': true + }) + }, + npm: { + devDependencies: { + '@ember/jquery': '^0.5.1' + } + } } - } - }, - { - name: 'ember-default', - npm: { - devDependencies: {} - } - }, - { - name: 'node-tests', - command: 'yarn run test:test-projects', - npm: { - devDependencies: {} - } - }, - { - name: 'fastboot-tests', - command: 'ember fastboot:test', - npm: { - devDependencies: {} - } - } - ] + ] + }; + }); }; diff --git a/package.json b/package.json index 8be6a89df..3076a090a 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,9 @@ "server", "testing" ], - "homepage": "https://github.com/samselikoff/ember-cli-mirage", - "bugs": { - "url": "https://github.com/samselikoff/ember-cli-mirage/issues" + "repository": { + "type": "git", + "url": "https://github.com/samselikoff/ember-cli-mirage.git" }, "license": "MIT", "author": "Sam Selikoff", @@ -19,15 +19,16 @@ "doc": "doc", "test": "tests" }, - "repository": { - "type": "git", - "url": "https://github.com/samselikoff/ember-cli-mirage.git" + "homepage": "https://github.com/samselikoff/ember-cli-mirage", + "bugs": { + "url": "https://github.com/samselikoff/ember-cli-mirage/issues" }, "scripts": { "build": "ember build", - "lint:js": "eslint ./*.js addon addon-test-support app config lib server test-support tests", + "lint:hbs": "ember-template-lint .", + "lint:js": "eslint .", "start": "ember serve", - "test": "./scripts/test.sh", + "test": "ember test", "test:all": "ember try:each", "test:browser": "ember test --test-port=0", "test:test-projects": "./scripts/test.sh", @@ -39,7 +40,7 @@ "broccoli-funnel": "^2.0.1", "broccoli-merge-trees": "^3.0.2", "broccoli-stew": "^2.0.1", - "ember-cli-babel": "^6.8.2", + "ember-cli-babel": "^6.16.0", "ember-cli-node-assets": "^0.2.2", "ember-get-config": "^0.2.2", "ember-inflector": "^2.0.0 || ^3.0.0", @@ -51,35 +52,40 @@ "route-recognizer": "^0.3.4" }, "devDependencies": { + "@ember/jquery": "^0.5.2", + "@ember/optional-features": "^0.6.3", "active-model-adapter": "^2.0.3", - "broccoli-asset-rev": "^2.4.5", - "ember-ajax": "^3.0.0", - "ember-cli": "~2.18.2", - "ember-cli-dependency-checker": "^2.0.0", - "ember-cli-eslint": "^4.2.1", + "broccoli-asset-rev": "^2.7.0", + "ember-ajax": "^3.1.0", + "ember-cli": "~3.4.4", + "ember-cli-dependency-checker": "^3.0.0", + "ember-cli-eslint": "^4.2.3", "ember-cli-fastboot": "^1.1.4-beta.1", - "ember-cli-htmlbars": "^2.0.1", - "ember-cli-htmlbars-inline-precompile": "^1.0.0", - "ember-cli-inject-live-reload": "^1.4.1", + "ember-cli-htmlbars": "^3.0.0", + "ember-cli-htmlbars-inline-precompile": "^1.0.3", + "ember-cli-inject-live-reload": "^1.8.2", "ember-cli-qunit": "^4.4.0", - "ember-cli-shims": "^1.2.0", - "ember-cli-sri": "^2.1.0", + "ember-cli-sri": "^2.1.1", + "ember-cli-template-lint": "^1.0.0-beta.1", "ember-cli-uglify": "^2.1.0", - "ember-data": "~2.13.0", - "ember-disable-prototype-extensions": "^1.1.2", + "ember-data": "~3.4.4", + "ember-disable-prototype-extensions": "^1.1.3", "ember-export-application-global": "^2.0.0", - "ember-load-initializers": "^1.0.0", - "ember-resolver": "^4.0.0", - "ember-source": "~2.18.0", - "eslint-plugin-ember": "^5.0.0", + "ember-load-initializers": "^1.1.0", + "ember-maybe-import-regenerator": "^0.1.6", + "ember-resolver": "^5.0.1", + "ember-source": "~3.4.0", + "ember-source-channel-url": "^1.1.0", + "ember-try": "^1.0.0", + "eslint-plugin-ember": "^5.2.0", "eslint-plugin-ember-suave": "^1.0.0", - "eslint-plugin-node": "^6.0.1", + "eslint-plugin-node": "^7.0.1", "fastboot": "^1.2.0", "loader.js": "^4.7.0", "qunit-dom": "^0.8.4" }, "engines": { - "node": "6.* || >= 7.*" + "node": "6.* || 8.* || >= 10.*" }, "ember-addon": { "configPath": "tests/dummy/config", diff --git a/test-projects/01-basic-app/config/optional-features.json b/test-projects/01-basic-app/config/optional-features.json new file mode 100644 index 000000000..21f1dc719 --- /dev/null +++ b/test-projects/01-basic-app/config/optional-features.json @@ -0,0 +1,3 @@ +{ + "jquery-integration": true +} diff --git a/test-projects/01-basic-app/package.json b/test-projects/01-basic-app/package.json index 8a3d2afb3..56b4a96e9 100644 --- a/test-projects/01-basic-app/package.json +++ b/test-projects/01-basic-app/package.json @@ -18,6 +18,7 @@ "test:fastboot": "qunit fastboot-tests/**/*.js" }, "devDependencies": { + "@ember/jquery": "*", "broccoli-asset-rev": "*", "ember-ajax": "*", "ember-cli": "*", @@ -30,7 +31,6 @@ "ember-cli-inject-live-reload": "*", "ember-cli-mirage": "*", "ember-cli-qunit": "*", - "ember-cli-shims": "*", "ember-cli-sri": "*", "ember-cli-uglify": "*", "ember-data": "*", diff --git a/test-projects/01-basic-app/testem.js b/test-projects/01-basic-app/testem.js index d1755a4ea..3a29d4059 100644 --- a/test-projects/01-basic-app/testem.js +++ b/test-projects/01-basic-app/testem.js @@ -5,7 +5,6 @@ module.exports = { 'Chrome' ], launch_in_dev: [ - 'Chrome' ], browser_args: { Chrome: { diff --git a/test-projects/01-basic-app/tests/helpers/promise-ajax.js b/test-projects/01-basic-app/tests/helpers/promise-ajax.js index f84ad8631..38a09df02 100644 --- a/test-projects/01-basic-app/tests/helpers/promise-ajax.js +++ b/test-projects/01-basic-app/tests/helpers/promise-ajax.js @@ -1,4 +1,5 @@ import { Promise } from 'rsvp'; +import $ from 'jquery'; export default (options) => { return new Promise((resolve, reject) => { diff --git a/test-projects/02-app-that-excludes-mirage/config/optional-features.json b/test-projects/02-app-that-excludes-mirage/config/optional-features.json new file mode 100644 index 000000000..21f1dc719 --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/config/optional-features.json @@ -0,0 +1,3 @@ +{ + "jquery-integration": true +} diff --git a/test-projects/02-app-that-excludes-mirage/package.json b/test-projects/02-app-that-excludes-mirage/package.json index 8a3d2afb3..56b4a96e9 100644 --- a/test-projects/02-app-that-excludes-mirage/package.json +++ b/test-projects/02-app-that-excludes-mirage/package.json @@ -18,6 +18,7 @@ "test:fastboot": "qunit fastboot-tests/**/*.js" }, "devDependencies": { + "@ember/jquery": "*", "broccoli-asset-rev": "*", "ember-ajax": "*", "ember-cli": "*", @@ -30,7 +31,6 @@ "ember-cli-inject-live-reload": "*", "ember-cli-mirage": "*", "ember-cli-qunit": "*", - "ember-cli-shims": "*", "ember-cli-sri": "*", "ember-cli-uglify": "*", "ember-data": "*", diff --git a/test-projects/02-app-that-excludes-mirage/tests/helpers/promise-ajax.js b/test-projects/02-app-that-excludes-mirage/tests/helpers/promise-ajax.js index f84ad8631..38a09df02 100644 --- a/test-projects/02-app-that-excludes-mirage/tests/helpers/promise-ajax.js +++ b/test-projects/02-app-that-excludes-mirage/tests/helpers/promise-ajax.js @@ -1,4 +1,5 @@ import { Promise } from 'rsvp'; +import $ from 'jquery'; export default (options) => { return new Promise((resolve, reject) => { diff --git a/testem.js b/testem.js index 3a29d4059..1c23bbd73 100644 --- a/testem.js +++ b/testem.js @@ -8,13 +8,14 @@ module.exports = { ], browser_args: { Chrome: { - mode: 'ci', - args: [ + ci: [ // --no-sandbox is needed when running Chrome inside a container - process.env.TRAVIS ? '--no-sandbox' : null, - - '--disable-gpu', + process.env.CI ? '--no-sandbox' : null, '--headless', + '--disable-gpu', + '--disable-dev-shm-usage', + '--disable-software-rasterizer', + '--mute-audio', '--remote-debugging-port=0', '--window-size=1440,900' ].filter(Boolean) diff --git a/tests/dummy/app/templates/contact.hbs b/tests/dummy/app/templates/contact.hbs index a90a2cbee..77fce53f9 100644 --- a/tests/dummy/app/templates/contact.hbs +++ b/tests/dummy/app/templates/contact.hbs @@ -1,13 +1,13 @@ -{{link-to 'Back home' 'contacts'}} +{{link-to "Back home" "contacts"}}

    The contact is {{model.name}}

    - {{#link-to 'edit' model}} + {{#link-to "edit" model}} {{/link-to}}
    - +
    diff --git a/tests/dummy/app/templates/contacts.hbs b/tests/dummy/app/templates/contacts.hbs index ef7c2d9d9..5508a93df 100644 --- a/tests/dummy/app/templates/contacts.hbs +++ b/tests/dummy/app/templates/contacts.hbs @@ -1,17 +1,17 @@ {{#if error}} -

    There was an error: {{error}}

    +

    There was an error: {{error}}

    {{else}} {{#each model as |contact|}} -

    {{link-to contact.name 'contact' contact}}

    +

    {{link-to contact.name "contact" contact}}

    {{/each}} {{/if}}
    -
    {{input value=newName placeholder='Name'}}
    +
    {{input value=newName placeholder="Name"}}
    - +
    diff --git a/tests/dummy/app/templates/edit.hbs b/tests/dummy/app/templates/edit.hbs index 757d7a289..1e04b9b57 100644 --- a/tests/dummy/app/templates/edit.hbs +++ b/tests/dummy/app/templates/edit.hbs @@ -2,5 +2,5 @@ {{input value=model.name}}
    -{{link-to 'Cancel' 'contact' model}} - +{{link-to "Cancel" "contact" model}} + diff --git a/tests/dummy/app/templates/pets.hbs b/tests/dummy/app/templates/pets.hbs index 0a6d37868..e5c2c4991 100644 --- a/tests/dummy/app/templates/pets.hbs +++ b/tests/dummy/app/templates/pets.hbs @@ -1,11 +1,11 @@ {{#if error}} -

    There was an error: {{error}}

    +

    There was an error: {{error}}

    {{else}}
      {{#each model as |pet|}} -
    • {{pet.name}} / alive: {{pet.alive}}
    • +
    • {{pet.name}} / alive: {{pet.alive}}
    • {{/each}} {{input value=petName}} - +
    {{/if}} diff --git a/tests/dummy/config/optional-features.json b/tests/dummy/config/optional-features.json new file mode 100644 index 000000000..21f1dc719 --- /dev/null +++ b/tests/dummy/config/optional-features.json @@ -0,0 +1,3 @@ +{ + "jquery-integration": true +} diff --git a/tests/dummy/config/targets.js b/tests/dummy/config/targets.js index 082e68b51..8ffae3636 100644 --- a/tests/dummy/config/targets.js +++ b/tests/dummy/config/targets.js @@ -1,8 +1,18 @@ +'use strict'; + +const browsers = [ + 'last 1 Chrome versions', + 'last 1 Firefox versions', + 'last 1 Safari versions' +]; + +const isCI = !!process.env.CI; +const isProduction = process.env.EMBER_ENV === 'production'; + +if (isCI || isProduction) { + browsers.push('ie 11'); +} + module.exports = { - browsers: [ - 'ie 9', - 'last 1 Chrome versions', - 'last 1 Firefox versions', - 'last 1 Safari versions' - ] + browsers }; diff --git a/tests/helpers/.gitkeep b/tests/helpers/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/tests/helpers/promise-ajax.js b/tests/helpers/promise-ajax.js index f84ad8631..38a09df02 100644 --- a/tests/helpers/promise-ajax.js +++ b/tests/helpers/promise-ajax.js @@ -1,4 +1,5 @@ import { Promise } from 'rsvp'; +import $ from 'jquery'; export default (options) => { return new Promise((resolve, reject) => { diff --git a/tests/integration/ember-data-test.js b/tests/integration/ember-data-test.js index 8b33ec4f5..6d1b195d5 100644 --- a/tests/integration/ember-data-test.js +++ b/tests/integration/ember-data-test.js @@ -67,6 +67,8 @@ module('Integration | Ember Data', function(hooks) { test(`modelFor is only for auto generated models`, function(assert) { assert.notOk(modelFor('friend').__isCustom__, 'Friend model is not the pre defined one'); - assert.throws(() => modelFor('foo'), () => true, 'Pre defined mirage models cannot be found via modelFor'); + assert.throws(() => { + modelFor('foo'); + }, /Model of type 'foo' does not exist/); }); }); diff --git a/tests/integration/server-config-test.js b/tests/integration/server-config-test.js index 37459f30c..58ceb5b79 100644 --- a/tests/integration/server-config-test.js +++ b/tests/integration/server-config-test.js @@ -1,8 +1,9 @@ -import {module, test} from 'qunit'; +import { module, test } from 'qunit'; import { Model } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; import ActiveModelSerializer from 'ember-cli-mirage/serializers/active-model-serializer'; import RestSerializer from 'ember-cli-mirage/serializers/rest-serializer'; +import $ from 'jquery'; module('Integration | Server Config', function(hooks) { hooks.beforeEach(function() { diff --git a/yarn.lock b/yarn.lock index 34d14881c..45675b48a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -591,6 +591,38 @@ lodash "^4.17.10" to-fast-properties "^2.0.0" +"@ember/jquery@^0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@ember/jquery/-/jquery-0.5.2.tgz#fe312c03ada0022fa092d23f7cd7e2eb0374b53a" + integrity sha1-/jEsA62gAi+gktI/fNfi6wN0tTo= + dependencies: + broccoli-funnel "^2.0.1" + ember-cli-babel "^6.6.0" + jquery "^3.3.1" + resolve "^1.7.1" + +"@ember/optional-features@^0.6.3": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@ember/optional-features/-/optional-features-0.6.4.tgz#8199f853c1781234fcb1f05090cddd0b822bff69" + integrity sha512-nKmKxMk+Q/BGE8cmfq8KTHnYHVgrU3GHhy/eZ/OTj/fUvzXZhxaEVFOfAXssiOzV3FOQDJjznpbua2TEtHaQRw== + dependencies: + chalk "^2.3.0" + co "^4.6.0" + ember-cli-version-checker "^2.1.0" + glob "^7.1.2" + inquirer "^3.3.0" + mkdirp "^0.5.1" + silent-error "^1.1.0" + util.promisify "^1.0.0" + +"@ember/ordered-set@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@ember/ordered-set/-/ordered-set-2.0.3.tgz#2ac1ca73b3bd116063cae814898832ef434a57f9" + integrity sha512-F4yfVk6WMc4AUHxeZsC3CaKyTvO0qSZJy7WWHCFTlVDQw6vubn+FvnGdhzpN1F00EiXMI4Tv1tJdSquHcCnYrA== + dependencies: + ember-cli-babel "^6.16.0" + ember-compatibility-helpers "^1.1.1" + "@ember/test-helpers@^0.7.26": version "0.7.27" resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-0.7.27.tgz#c622cabd0cbb95b34efc1e1b6274ab5a14edc138" @@ -601,11 +633,29 @@ ember-cli-babel "^6.12.0" ember-cli-htmlbars-inline-precompile "^1.0.0" +"@glimmer/compiler@^0.38.0": + version "0.38.0" + resolved "https://registry.yarnpkg.com/@glimmer/compiler/-/compiler-0.38.0.tgz#fde12464feef3f3c82ef6a0cab1813074f34a5a4" + integrity sha512-qxQzeuRrD0qR3cJorz8GzhP6A1jgio/THLHj6nhdZu4Rv+Nch6ooQkqIK+6AzvaBknoOT7h+QCSTGJWMHG/jzQ== + dependencies: + "@glimmer/interfaces" "^0.38.0" + "@glimmer/syntax" "^0.38.0" + "@glimmer/util" "^0.38.0" + "@glimmer/wire-format" "^0.38.0" + "@glimmer/di@^0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@glimmer/di/-/di-0.2.0.tgz#73bfd4a6ee4148a80bf092e8a5d29bcac9d4ce7e" integrity sha1-c7/Upu5BSKgL8JLopdKbysnUzn4= +"@glimmer/interfaces@^0.38.0": + version "0.38.0" + resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.38.0.tgz#dea320d1c0b5bd210e4d1119da081993ce766171" + integrity sha512-5/STOfFFg7+4Plr2AhJfhMqOmtGv9k6YvQFEavM1+7UwlHyz+WCOQL+11t3ov4Ngn8X4apkq21gPblhsMdp/Nw== + dependencies: + "@glimmer/wire-format" "^0.38.0" + "@simple-dom/interface" "1.4.0" + "@glimmer/resolver@^0.4.1": version "0.4.2" resolved "https://registry.yarnpkg.com/@glimmer/resolver/-/resolver-0.4.2.tgz#60c9b492e90bc3956ac82b3134649bd337e1651c" @@ -613,6 +663,68 @@ dependencies: "@glimmer/di" "^0.2.0" +"@glimmer/syntax@^0.38.0": + version "0.38.0" + resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.38.0.tgz#5270839ecc3f6fff80c1cbfdad0d0c9413c84445" + integrity sha512-fAlQS0NioN/MW63AC/g6+AlIj4c3NjHDnUVeCQDy3WczV47YU42U/j4jNyDeTh5rAYp2vz/JRXeJ9RVc1NfUNw== + dependencies: + "@glimmer/interfaces" "^0.38.0" + "@glimmer/util" "^0.38.0" + handlebars "^4.0.6" + simple-html-tokenizer "^0.5.6" + +"@glimmer/util@^0.38.0": + version "0.38.0" + resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.38.0.tgz#c4b6817df8900ab29c4e26768b81315255d76b60" + integrity sha512-QIyh79A9soXVnamYJlGX6Be5NtBUQEIb8NrIk1JCrI7WTjJ/Z6tfXkhb4kRXjbxh2KMvEfOlBjjHZm1FLeOB/g== + +"@glimmer/wire-format@^0.38.0": + version "0.38.0" + resolved "https://registry.yarnpkg.com/@glimmer/wire-format/-/wire-format-0.38.0.tgz#db77a9b4867c84fd0fec7490ed0e481df769c47a" + integrity sha512-sxNpQ2V0q2rKuJA+ScJTyc0din/7yF+V6CD9F/BBmeP8Cah+SdHpziMIhvT8gwJCMj/ySUTWSy7l/yGSLObiVA== + dependencies: + "@glimmer/util" "^0.38.0" + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + +"@simple-dom/interface@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@simple-dom/interface/-/interface-1.4.0.tgz#e8feea579232017f89b0138e2726facda6fbb71f" + integrity sha512-l5qumKFWU0S+4ZzMaLXFU8tQZsicHEMEyAxI5kDFGhJsRqDwe0a7/iPA/GdxlGyDKseQQAgIz5kzU7eXTrlSpA== + +"@sindresorhus/is@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" + integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== + +"@types/acorn@^4.0.3": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.4.tgz#b3ee72dcd81d1daeea03fed67d7ca7c2574c313b" + integrity sha512-/qLQgGw/hzbpWpEiSrnNDqiVtw7J/wBEfWMWN8HPhOHUMINkL7ggOtj8VSyjfzXlNkoUbStomzKsLEATXcMSzg== + dependencies: + "@types/estree" "*" + +"@types/estree@*", "@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/node@^9.6.0": + version "9.6.41" + resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.41.tgz#e57c3152eb2e7ec748c733cebd0c095b437c5d37" + integrity sha512-sPZWEbFMz6qAy9SLY7jh5cgepmsiwqUUHjvEm8lpU6kug2hmmcyuTnwhoGw/GWpI5Npue4EqvsiQQI0eWjW/ZA== + "@xg-wang/whatwg-fetch@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@xg-wang/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#f7b222c012a238e7d6e89ed3d72a1e0edb58453d" @@ -628,14 +740,6 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -accepts@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" - integrity sha1-w8p0NJOGSMPg2cHjKN1otiLChMo= - dependencies: - mime-types "~2.1.11" - negotiator "0.6.1" - accepts@~1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" @@ -644,6 +748,21 @@ accepts@~1.3.4: mime-types "~2.1.16" negotiator "0.6.1" +accepts@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= + dependencies: + mime-types "~2.1.18" + negotiator "0.6.1" + +acorn-dynamic-import@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" + integrity sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg== + dependencies: + acorn "^5.0.0" + acorn-globals@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.0.tgz#e3b6f8da3c1552a95ae627571f7dd6923bb54103" @@ -669,6 +788,11 @@ acorn@^3.0.4: resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= +acorn@^5.0.0, acorn@^5.5.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + acorn@^5.4.0: version "5.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.4.1.tgz#fdc58d9d17f4a4e98d102ded826a9b9759125102" @@ -687,24 +811,16 @@ active-model-adapter@^2.0.3: ember-cli-babel "^6.8.2" ember-inflector "^2.0.0" -after@0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/after/-/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" - integrity sha1-q11PuIP1loFtNRX495HAr0ht1ic= +after@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= ajv-keywords@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= -ajv@^4.9.1: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - integrity sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY= - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" - ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" @@ -734,13 +850,6 @@ align-text@^0.1.1, align-text@^0.1.3: longest "^1.0.1" repeat-string "^1.5.2" -amd-name-resolver@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-0.0.5.tgz#76962dac876ed3311b05d29c6a58c14e1ef3304b" - integrity sha1-dpYtrIdu0zEbBdKcaljBTh7zMEs= - dependencies: - ensure-posix-path "^1.0.1" - amd-name-resolver@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-0.0.7.tgz#814301adfe8a2f109f6e84d5e935196efb669615" @@ -748,13 +857,6 @@ amd-name-resolver@0.0.7: dependencies: ensure-posix-path "^1.0.1" -amd-name-resolver@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.0.0.tgz#0e593b28d6fa3326ab1798107edaea961046e8d8" - integrity sha1-Dlk7KNb6MyarF5gQftrqlhBG6Ng= - dependencies: - ensure-posix-path "^1.0.1" - amd-name-resolver@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.2.0.tgz#fc41b3848824b557313897d71f8d5a0184fbe679" @@ -762,7 +864,7 @@ amd-name-resolver@1.2.0: dependencies: ensure-posix-path "^1.0.1" -amd-name-resolver@^1.2.1: +amd-name-resolver@^1.2.0, amd-name-resolver@^1.2.1: version "1.3.1" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.3.1.tgz#ffe71c683c6e7191fc4ae1bb3aaed15abea135d9" integrity sha512-26qTEWqZQ+cxSYygZ4Cf8tsjDBLceJahhtewxtKZA3SRa4PluuqYCuheemDQD+7Mf5B7sr+zhTDWAHDh02a1Dw== @@ -829,14 +931,6 @@ ansicolors@~0.2.1: resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" integrity sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8= -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== - dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" - anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -943,12 +1037,12 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -arraybuffer.slice@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" - integrity sha1-8zshWfBTKj8xB6JywMz70a0peco= +arraybuffer.slice@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" + integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== -arrify@^1.0.0: +arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= @@ -963,11 +1057,6 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" - integrity sha1-104bh+ev/A24qttwIfP+SBAasjQ= - assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -1016,6 +1105,13 @@ async@^2.4.1: dependencies: lodash "^4.14.0" +async@^2.5.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" + integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== + dependencies: + lodash "^4.17.10" + async@~0.2.9: version "0.2.10" resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" @@ -1031,17 +1127,12 @@ atob@^2.0.0: resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d" integrity sha1-GcenYEc3dEaPILLS0DNyrX1Mv10= -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - integrity sha1-FDQt0428yU0OW4fXY81jYSwOeU8= - aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= -aws4@^1.2.1, aws4@^1.6.0: +aws4@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" integrity sha1-g+9cqGCysy5KDe7e6MdxudtXRx4= @@ -1233,6 +1324,13 @@ babel-plugin-debug-macros@^0.1.10, babel-plugin-debug-macros@^0.1.11: dependencies: semver "^5.3.0" +babel-plugin-debug-macros@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.2.0.tgz#0120ac20ce06ccc57bf493b667cf24b85c28da7a" + integrity sha512-Wpmw4TbhR3Eq2t3W51eBAQSdKlr+uAyF0GI4GtPfMCD12Y4cIdpKC9l0RjNTH/P9isFypSqqewMPm7//fnZlNA== + dependencies: + semver "^5.3.0" + babel-plugin-debug-macros@^0.2.0-beta.6: version "0.2.0-beta.6" resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.2.0-beta.6.tgz#ecdf6e408d5c863ab21740d7ad7f43f027d2f912" @@ -1276,6 +1374,11 @@ babel-plugin-htmlbars-inline-precompile@^0.2.3: resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.2.3.tgz#cd365e278af409bfa6be7704c4354beee742446b" integrity sha1-zTZeJ4r0Cb+mvncExDVL7udCRGs= +babel-plugin-htmlbars-inline-precompile@^0.2.5: + version "0.2.6" + resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.2.6.tgz#c00b8a3f4b32ca04bf0f0d5169fcef3b5a66d69d" + integrity sha512-H4H75TKGUFij8ukwEYWEERAgrUf16R8NSK1uDPe3QwxT8mnE1K8+/s6DVjUqbM5Pv6lSIcE4XufXdlSX+DTB6g== + babel-plugin-module-resolver@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.1.1.tgz#881cf67e3d4b8400d5eaaefc1be44d2dc1fe404f" @@ -1325,7 +1428,7 @@ babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-block-scoping@^6.23.0: +babel-plugin-transform-es2015-block-scoping@^6.23.0, babel-plugin-transform-es2015-block-scoping@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= @@ -1700,10 +1803,15 @@ base64-arraybuffer@0.1.5: resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= -base64id@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-0.1.0.tgz#02ce0fdeee0cef4f40080e1e73e834f0b1bfce3f" - integrity sha1-As4P3u4M709ACA4ec+g08LG/zj8= +base64-js@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.2.tgz#024f0f72afa25b75f9c0ee73cd4f55ec1bed9784" + integrity sha1-Ak8Pcq+iW3X5wO5zzU9V7Bvtl4Q= + +base64id@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" + integrity sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY= base@^0.11.1: version "0.11.2" @@ -1749,17 +1857,10 @@ blank-object@^1.0.1: resolved "https://registry.yarnpkg.com/blank-object/-/blank-object-1.0.2.tgz#f990793fbe9a8c8dd013fb3219420bec81d5f4b9" integrity sha1-+ZB5P76ajI3QE/syGUIL7IHV9Lk= -blob@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" - integrity sha1-vPEwUspURj8w+fx+lbmkdjCpSSE= - -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= - dependencies: - inherits "~2.0.0" +blob@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" + integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== bluebird@^3.1.1, bluebird@^3.4.6: version "3.5.1" @@ -1782,6 +1883,22 @@ body-parser@1.18.2: raw-body "2.3.2" type-is "~1.6.15" +body-parser@1.18.3: + version "1.18.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" + integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "~1.6.3" + iconv-lite "0.4.23" + on-finished "~2.3.0" + qs "6.5.2" + raw-body "2.3.3" + type-is "~1.6.16" + body@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/body/-/body-5.1.0.tgz#e4ba0ce410a46936323367609ecb4e6553125069" @@ -1792,12 +1909,13 @@ body@^5.1.0: raw-body "~1.1.0" safe-json-parse "~1.0.1" -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - integrity sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8= +bops@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/bops/-/bops-0.0.3.tgz#c5cbf6fea8be7401ca5ea6d1679e6c4e8b407c79" + integrity sha1-xcv2/qi+dAHKXqbRZ55sTotAfHk= dependencies: - hoek "2.x.x" + base64-js "0.0.2" + to-utf8 "0.0.1" bower-config@^1.3.0: version "1.4.1" @@ -1865,13 +1983,22 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" -broccoli-asset-rev@^2.4.5: - version "2.6.0" - resolved "https://registry.yarnpkg.com/broccoli-asset-rev/-/broccoli-asset-rev-2.6.0.tgz#0633fc3a0b2ba0c2c1d56fa9feb7b331fc83be6d" - integrity sha1-BjP8OgsroMLB1W+p/rezMfyDvm0= +broccoli-amd-funnel@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/broccoli-amd-funnel/-/broccoli-amd-funnel-1.3.0.tgz#c4426b4fce976e44295bd74f34725f53bdeb08e3" + integrity sha512-QLjCWblDW//a/5/ivDikVPRHiA+d/1K45meHZA6lAlpHC1c216rcZQYpdlo9PiOJiI4T3tKqDaaM1CDeFDCoVQ== + dependencies: + broccoli-plugin "^1.3.0" + symlink-or-copy "^1.2.0" + +broccoli-asset-rev@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/broccoli-asset-rev/-/broccoli-asset-rev-2.7.0.tgz#c73da1d97c4180366fa442a87624ca1b7fb99161" + integrity sha512-GZ7gU3Qo6HMAUqDeh1q+4UVCQPJPjCyGcpIY5s9Qp58a244FT4nZSiy8qYkVC4LLIWTZt59G7jFFsUcj/13IPQ== dependencies: broccoli-asset-rewrite "^1.1.0" broccoli-filter "^1.2.2" + broccoli-persistent-filter "^1.4.3" json-stable-stringify "^1.0.0" minimatch "^3.0.4" rsvp "^3.0.6" @@ -1883,7 +2010,7 @@ broccoli-asset-rewrite@^1.1.0: dependencies: broccoli-filter "^1.2.3" -broccoli-babel-transpiler@^6.0.0, broccoli-babel-transpiler@^6.1.2: +broccoli-babel-transpiler@^6.1.2: version "6.1.4" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.1.4.tgz#8be8074c42abf2e17ff79b2d2a21df5c51143c82" integrity sha512-h63g7iOBWdxj0GuZw8kNsyaD1T9weKsY3I+gp3rOefozbHwUesJ43vzLy0jj3t/rbiP2czcJAlyHS48EcRil8Q== @@ -1931,18 +2058,12 @@ broccoli-babel-transpiler@^7.1.0: rsvp "^4.8.3" workerpool "^2.3.1" -broccoli-brocfile-loader@^0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/broccoli-brocfile-loader/-/broccoli-brocfile-loader-0.18.0.tgz#2e86021c805c34ffc8d29a2fb721cf273e819e4b" - integrity sha1-LoYCHIBcNP/I0povtyHPJz6Bnks= - dependencies: - findup-sync "^0.4.2" - -broccoli-builder@^0.18.8: - version "0.18.11" - resolved "https://registry.yarnpkg.com/broccoli-builder/-/broccoli-builder-0.18.11.tgz#a42393c7b10bb0380df255a616307945f5e26efb" - integrity sha512-4Qa3uTev+adLRTEv2zO1M5dXSFCgywo8bCMxJ8vmas8q+dAIstc1eKnnymJgpejyuEJQAjgdhO1zxMQCrt03Ew== +broccoli-builder@^0.18.14: + version "0.18.14" + resolved "https://registry.yarnpkg.com/broccoli-builder/-/broccoli-builder-0.18.14.tgz#4b79e2f844de11a4e1b816c3f49c6df4776c312d" + integrity sha1-S3ni+ETeEaThuBbD9Jxt9HdsMS0= dependencies: + broccoli-node-info "^1.1.0" heimdalljs "^0.2.0" promise-map-series "^0.2.1" quick-temp "^0.1.2" @@ -2002,7 +2123,25 @@ broccoli-concat@^3.2.2: lodash.uniq "^4.2.0" walk-sync "^0.3.1" -broccoli-config-loader@^1.0.0: +broccoli-concat@^3.5.1, broccoli-concat@^3.7.1: + version "3.7.3" + resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.7.3.tgz#0dca01311567ffb13180e6b4eb111824628e4885" + integrity sha512-2Ma9h81EJ0PRb9n4sW0i8KZlcnpTQfKxcj87zvi5DFe1fd8CTDEdseHDotK2beuA2l+LbgVPfd8EHaBJKm/Y8g== + dependencies: + broccoli-debug "^0.6.5" + broccoli-kitchen-sink-helpers "^0.3.1" + broccoli-plugin "^1.3.0" + ensure-posix-path "^1.0.2" + fast-sourcemap-concat "^1.4.0" + find-index "^1.1.0" + fs-extra "^4.0.3" + fs-tree-diff "^0.5.7" + lodash.merge "^4.3.1" + lodash.omit "^4.1.0" + lodash.uniq "^4.2.0" + walk-sync "^0.3.2" + +broccoli-config-loader@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/broccoli-config-loader/-/broccoli-config-loader-1.0.1.tgz#d10aaf8ebc0cb45c1da5baa82720e1d88d28c80a" integrity sha512-MDKYQ50rxhn+g17DYdfzfEM9DjTuSGu42Db37A8TQHQe8geYEcUZ4SQqZRgzdAI3aRQNlA1yBHJfOeGmOjhLIg== @@ -2019,7 +2158,7 @@ broccoli-config-replace@^1.1.2: debug "^2.2.0" fs-extra "^0.24.0" -broccoli-debug@^0.6.1, broccoli-debug@^0.6.2, broccoli-debug@^0.6.3, broccoli-debug@^0.6.4: +broccoli-debug@^0.6.1, broccoli-debug@^0.6.2, broccoli-debug@^0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.4.tgz#986eb3d2005e00e3bb91f9d0a10ab137210cd150" integrity sha512-CixMUndBqTljCc26i6ubhBrGbAWXpWBsGJFce6ZOr76Tul2Ev1xxM0tmf7OjSzdYhkr5BrPd/CNbR9VMPi+NBg== @@ -2043,7 +2182,7 @@ broccoli-debug@^0.6.5: symlink-or-copy "^1.1.8" tree-sync "^1.2.2" -broccoli-file-creator@^1.0.0, broccoli-file-creator@^1.1.1: +broccoli-file-creator@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/broccoli-file-creator/-/broccoli-file-creator-1.1.1.tgz#1b35b67d215abdfadd8d49eeb69493c39e6c3450" integrity sha1-GzW2fSFavfrdjUnutpSTw55sNFA= @@ -2083,7 +2222,7 @@ broccoli-funnel-reducer@^1.0.0: resolved "https://registry.yarnpkg.com/broccoli-funnel-reducer/-/broccoli-funnel-reducer-1.0.0.tgz#11365b2a785aec9b17972a36df87eef24c5cc0ea" integrity sha1-ETZbKnha7JsXlyo234fu8kxcwOo= -broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.1.0: +broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1: version "1.2.0" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-1.2.0.tgz#cddc3afc5ff1685a8023488fff74ce6fb5a51296" integrity sha1-zdw6/F/xaFqAI0iP/3TOb7WlEpY= @@ -2181,15 +2320,39 @@ broccoli-merge-trees@^3.0.0, broccoli-merge-trees@^3.0.1, broccoli-merge-trees@^ broccoli-plugin "^1.3.0" merge-trees "^2.0.0" -broccoli-middleware@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/broccoli-middleware/-/broccoli-middleware-1.0.0.tgz#92f4e1fb9a791ea986245a7077f35cc648dab097" - integrity sha1-kvTh+5p5HqmGJFpwd/NcxkjasJc= +broccoli-middleware@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/broccoli-middleware/-/broccoli-middleware-2.0.1.tgz#093314f13e52fad7fa8c4254a4e4a4560c857a65" + integrity sha512-V/K5uozcEH/XJ09ZAL8aJt/W2UwJU8I8fA2FAg3u9gzs5dQrehHDtgSoKS2QjPjurRC1GSiYLcsMp36sezaQQg== dependencies: handlebars "^4.0.4" - mime "^1.2.11" + mime-types "^2.1.18" + +broccoli-module-normalizer@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/broccoli-module-normalizer/-/broccoli-module-normalizer-1.3.0.tgz#f9982d9cbb776b4ed754161cc6547784d3eb19de" + integrity sha512-0idZCOtdVG6xXoQ36Psc1ApMCr3lW5DB+WEAOEwHcUoESIBHzwcRPQTxheGIjZ5o0hxpsRYAUH5x0ErtNezbrQ== + dependencies: + broccoli-plugin "^1.3.0" + merge-trees "^1.0.1" + rimraf "^2.6.2" + symlink-or-copy "^1.1.8" + +broccoli-module-unification-reexporter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/broccoli-module-unification-reexporter/-/broccoli-module-unification-reexporter-1.0.0.tgz#031909c5d3f159ec11d5f9e2346f2861db8acb3e" + integrity sha512-HTi9ua520M20aBZomaiBopsSt3yjL7J/paR3XPjieygK7+ShATBiZdn0B+ZPiniBi4I8JuMn1q0fNFUevtP//A== + dependencies: + broccoli-plugin "^1.3.0" + mkdirp "^0.5.1" + walk-sync "^0.3.2" + +broccoli-node-info@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-1.1.0.tgz#3aa2e31e07e5bdb516dd25214f7c45ba1c459412" + integrity sha1-OqLjHgflvbUW3SUhT3xFuhxFlBI= -broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.4.0, broccoli-persistent-filter@^1.4.3: +broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.4.0, broccoli-persistent-filter@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.3.tgz#3511bc52fc53740cda51621f58a28152d9911bc1" integrity sha512-JwNLDvvXJlhUmr+CHcbVhCyp33NbCIAITjQZmJY9e8QzANXh3jpFWlhSFvkWghwKA8rTAKcXkW12agtiZjxr4g== @@ -2257,6 +2420,23 @@ broccoli-plugin@^1.3.0, broccoli-plugin@^1.3.1: rimraf "^2.3.4" symlink-or-copy "^1.1.8" +broccoli-rollup@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/broccoli-rollup/-/broccoli-rollup-2.1.1.tgz#0b77dc4b7560a53e998ea85f3b56772612d4988d" + integrity sha512-aky/Ovg5DbsrsJEx2QCXxHLA6ZR+9u1TNVTf85soP4gL8CjGGKQ/JU8R3BZ2ntkWzo6/83RCKzX6O+nlNKR5MQ== + dependencies: + "@types/node" "^9.6.0" + amd-name-resolver "^1.2.0" + broccoli-plugin "^1.2.1" + fs-tree-diff "^0.5.2" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + magic-string "^0.24.0" + node-modules-path "^1.0.1" + rollup "^0.57.1" + symlink-or-copy "^1.1.8" + walk-sync "^0.3.1" + broccoli-slow-trees@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-3.0.1.tgz#9bf2a9e2f8eb3ed3a3f2abdde988da437ccdc9b4" @@ -2280,7 +2460,7 @@ broccoli-sri-hash@^2.1.0: sri-toolbox "^0.2.0" symlink-or-copy "^1.0.1" -broccoli-stew@^1.2.0, broccoli-stew@^1.3.3, broccoli-stew@^1.5.0: +broccoli-stew@^1.3.3, broccoli-stew@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-1.5.0.tgz#d7af8c18511dce510e49d308a62e5977f461883c" integrity sha1-16+MGFEdzlEOSdMIpi5Zd/RhiDw= @@ -2300,7 +2480,7 @@ broccoli-stew@^1.2.0, broccoli-stew@^1.3.3, broccoli-stew@^1.5.0: symlink-or-copy "^1.1.8" walk-sync "^0.3.0" -broccoli-stew@^2.0.1: +broccoli-stew@^2.0.0, broccoli-stew@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-2.0.1.tgz#d0a507b79bf5fea9ff84032ae837dc48670ab1dc" integrity sha512-EUzgkbYF4m8YVD2bkEa7OfYJ11V3dQ+yPuxdz/nFh8eMEn6dhOujtuSBnOWsvGDgsS9oqNZgx/MHJxI6Rr3AqQ== @@ -2390,6 +2570,24 @@ bser@^2.0.0: dependencies: node-int64 "^0.4.0" +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + buffer-from@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" @@ -2430,13 +2628,31 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -calculate-cache-key-for-tree@^1.0.0: +cacheable-request@^2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" + integrity sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0= + dependencies: + clone-response "1.0.2" + get-stream "3.0.0" + http-cache-semantics "3.8.1" + keyv "3.0.0" + lowercase-keys "1.0.0" + normalize-url "2.0.1" + responselike "1.0.2" + +calculate-cache-key-for-tree@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-1.1.0.tgz#0c3e42c9c134f3c9de5358c0f16793627ea976d6" integrity sha1-DD5CycE088neU1jA8WeTYn6pdtY= dependencies: json-stable-stringify "^1.0.1" +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + caller-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" @@ -2494,13 +2710,18 @@ caniuse-lite@^1.0.30000928: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000928.tgz#805e828dc72b06498e3683a32e61c7507fd67b88" integrity sha512-aSpMWRXL6ZXNnzm8hgE4QDLibG5pVJ2Ujzsuj3icazlIkxXkPXtL+BWnMx6FBkWmkZgBHGUxPZQvrbRw2ZTxhg== -capture-exit@^1.1.0, capture-exit@^1.2.0: +capture-exit@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" integrity sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28= dependencies: rsvp "^3.3.3" +capture-stack-trace@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" + integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== + cardinal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-1.0.0.tgz#50e21c1b0aa37729f9377def196b5a9cec932ee9" @@ -2533,7 +2754,7 @@ chalk@^0.5.1: strip-ansi "^0.3.0" supports-color "^0.2.0" -chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.0.0, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= @@ -2562,7 +2783,7 @@ chalk@^2.3.0: escape-string-regexp "^1.0.5" supports-color "^5.2.0" -chalk@^2.4.1: +chalk@^2.3.1, chalk@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2588,6 +2809,11 @@ chownr@^1.1.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== +ci-info@^1.1.3: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + circular-json@^0.3.1: version "0.3.3" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" @@ -2644,18 +2870,18 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" -cli-spinners@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.1.0.tgz#f1847b168844d917a671eb9d147e3df497c90d06" - integrity sha1-8YR7FohE2RemceudFH499JfJDQY= +cli-spinners@^1.1.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" + integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== -cli-table2@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/cli-table2/-/cli-table2-0.2.0.tgz#2d1ef7f218a0e786e214540562d4bd177fe32d97" - integrity sha1-LR738hig54biFFQFYtS9F3/jLZc= +cli-table3@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" + integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== dependencies: - lodash "^3.10.1" - string-width "^1.0.1" + object-assign "^4.1.0" + string-width "^2.1.1" optionalDependencies: colors "^1.1.2" @@ -2680,6 +2906,18 @@ cliui@^2.1.0: right-align "^0.1.1" wordwrap "0.0.2" +clone-response@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + clone@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" @@ -2778,11 +3016,6 @@ component-bind@1.0.0: resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= -component-emitter@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" - integrity sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM= - component-emitter@1.2.1, component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" @@ -2793,24 +3026,24 @@ component-inherit@0.0.3: resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= -compressible@~2.0.11: - version "2.0.12" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.12.tgz#c59a5c99db76767e9876500e271ef63b3493bd66" - integrity sha1-xZpcmdt2dn6YdlAOJx72OzSTvWY= +compressible@~2.0.14: + version "2.0.15" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.15.tgz#857a9ab0a7e5a07d8d837ed43fe2defff64fe212" + integrity sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw== dependencies: - mime-db ">= 1.30.0 < 2" + mime-db ">= 1.36.0 < 2" -compression@^1.4.4: - version "1.7.1" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.1.tgz#eff2603efc2e22cf86f35d2eb93589f9875373db" - integrity sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s= +compression@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" + integrity sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg== dependencies: - accepts "~1.3.4" + accepts "~1.3.5" bytes "3.0.0" - compressible "~2.0.11" + compressible "~2.0.14" debug "2.6.9" on-headers "~1.0.1" - safe-buffer "5.1.1" + safe-buffer "5.1.2" vary "~1.1.2" concat-map@0.0.1: @@ -2827,10 +3060,10 @@ concat-stream@^1.4.7, concat-stream@^1.6.0: readable-stream "^2.2.2" typedarray "^0.0.6" -configstore@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" - integrity sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw== +configstore@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-4.0.0.tgz#5933311e95d3687efb592c528b922d9262d227e7" + integrity sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ== dependencies: dot-prop "^4.1.0" graceful-fs "^4.1.2" @@ -2844,22 +3077,22 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -console-ui@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/console-ui/-/console-ui-2.1.0.tgz#e1d5279d27621a75123d7d594f9fa59f866ea3e3" - integrity sha512-/FqFHRwYVjjdeLd/1lhRsyoPCMtDMREJfPU6WCN9LMxPWu3++Cr2wN1uIZfbefVwr59is4UBd6Z2vaJRzTyPWQ== +console-ui@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/console-ui/-/console-ui-2.2.3.tgz#134b92e632f2c0088f78e52b20f1ca22a95b9a91" + integrity sha512-aZm49rntsv264Fw/DM56Z2ehLg1DDxrqof2jFcZOgC03S0nRGSYFIVPx5TbGssrgBhgCvGBY+9mmk0+t/nWXEA== dependencies: chalk "^2.1.0" inquirer "^2" json-stable-stringify "^1.0.1" - ora "^1.3.0" + ora "^2.0.0" through "^2.3.8" user-info "^1.0.0" -consolidate@^0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.14.5.tgz#5a25047bc76f73072667c8cb52c989888f494c63" - integrity sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM= +consolidate@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7" + integrity sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw== dependencies: bluebird "^3.1.1" @@ -2920,12 +3153,7 @@ core-js@^2.5.7: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.2.tgz#267988d7268323b349e20b4588211655f0e83944" integrity sha512-NdBPF/RVwPW6jr0NCILuyN9RiqLo2b1mddWHkUL+VnvcB7dzlnBJ1bXYntjpTGOgkZiiLWj2JxmOr7eGE3qK6g== -core-object@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/core-object/-/core-object-1.1.0.tgz#86d63918733cf9da1a5aae729e62c0a88e66ad0a" - integrity sha1-htY5GHM8+doaWq5ynmLAqI5mrQo= - -core-object@^3.1.3: +core-object@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/core-object/-/core-object-3.1.5.tgz#fa627b87502adc98045e44678e9a8ec3b9c0d2a9" integrity sha512-sA2/4+/PZ/KV6CKgjrVrrUVBKCkdDO02CUlQ0YKTQoYUwPYNOtOAcWlbYhd5v/1JqYaA6oZ4sDlOU4ppVw6Wbg== @@ -2937,7 +3165,14 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cross-spawn@^5.0.1, cross-spawn@^5.1.0: +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= + dependencies: + capture-stack-trace "^1.0.0" + +cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= @@ -2946,12 +3181,16 @@ cross-spawn@^5.0.1, cross-spawn@^5.1.0: shebang-command "^1.2.0" which "^1.2.9" -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - integrity sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g= +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== dependencies: - boom "2.x.x" + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" crypto-random-string@^1.0.0: version "1.0.0" @@ -3003,35 +3242,28 @@ data-urls@^1.1.0: whatwg-mimetype "^2.2.0" whatwg-url "^7.0.0" -debug@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" - integrity sha1-+HBX6ZWxofauaklgZkE3vFbwOdo= - dependencies: - ms "0.7.1" - -debug@2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" - integrity sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w= +date-time@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/date-time/-/date-time-2.1.0.tgz#0286d1b4c769633b3ca13e1e62558d2dbdc2eba2" + integrity sha512-/9+C44X7lot0IeiyfgJmETtRMhBidBYM2QFFIkGa0U1k+hSyY87Nw7PY3eDqpvCBm7I3WCSfPeZskW/YYq6m4g== dependencies: - ms "0.7.2" + time-zone "^1.0.0" -debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.4.0, debug@^2.6.8, debug@~2.6.7: +debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.4.0, debug@^2.6.8: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@^3.0.0, debug@^3.1.0: +debug@=3.1.0, debug@^3.0.0, debug@^3.1.0, debug@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" -debug@^4.1.0: +debug@^4.1.0, debug@~4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -3048,21 +3280,37 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-extend@~0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" - integrity sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8= - deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +define-properties@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" @@ -3113,7 +3361,7 @@ depd@1.1.1: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" integrity sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k= -depd@~1.1.1: +depd@~1.1.1, depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= @@ -3123,13 +3371,6 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detect-file@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" - integrity sha1-STXe39lIhkjgBrASlWbpOGcR6mM= - dependencies: - fs-exists-sync "^0.1.0" - detect-file@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" @@ -3142,15 +3383,28 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" +detect-indent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= + detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= -diff@^3.2.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" - integrity sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA== +diff@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +dir-glob@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== + dependencies: + arrify "^1.0.1" + path-type "^3.0.0" doctrine@^2.1.0: version "2.1.0" @@ -3173,6 +3427,16 @@ dot-prop@^4.1.0: dependencies: is-obj "^1.0.0" +duplex@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/duplex/-/duplex-1.0.0.tgz#6abc5c16ec17e4c578578727126700590d3a2dda" + integrity sha1-arxcFuwX5MV4V4cnEmcAWQ06Ldo= + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" @@ -3205,12 +3469,13 @@ electron-to-chromium@^1.3.47: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0" integrity sha1-0tnxJwuko7lnuDHEDvcftNmrXOA= -ember-ajax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-3.0.0.tgz#8f21e9da0c1d433cf879aa855fce464d517e9ab5" - integrity sha1-jyHp2gwdQzz4eaqFX85GTVF+mrU= +ember-ajax@^3.1.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-3.1.3.tgz#f51b8e3e36765575a2698c8660e377d4d6371642" + integrity sha512-C+BmWxXECGWuv7T17OHSQySpVuoCalmxI/NLUr+3eSlBeCD0xwI3mRRL1CbmAWXdyNwzK3je+lFCSuMaJu2miA== dependencies: - ember-cli-babel "^6.0.0" + ember-cli-babel "^6.16.0" + najax "^1.0.3" ember-assign-polyfill@~2.4.0: version "2.4.0" @@ -3220,7 +3485,7 @@ ember-assign-polyfill@~2.4.0: ember-cli-babel "^6.6.0" ember-cli-version-checker "^2.0.0" -ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.11.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2, ember-cli-babel@^6.9.0: +ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.11.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2: version "6.11.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.11.0.tgz#79cb184bac3c05bfe181ddc306bac100ab1f9493" integrity sha512-lHQyl30lbAsMmMq2it1GO85HKrqr2gMpK5CFxmOgTJ3moBqOGMKsdV3Z0qXWpgh8Asy7pB9AACMShdgfQvSGPg== @@ -3239,7 +3504,7 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.11.0, ember-cli-version-checker "^2.1.0" semver "^5.4.1" -ember-cli-babel@^6.12.0: +ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0: version "6.18.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz#3f6435fd275172edeff2b634ee7b29ce74318957" integrity sha512-7ceC8joNYxY2wES16iIBlbPSxwKDBhYwC8drU3ZEvuPDMwVv1KzxCNu1fvxyFEBWhwaRNTUxSCsEVoTd9nosGA== @@ -3318,28 +3583,29 @@ ember-cli-babel@^7.0.0: ensure-posix-path "^1.0.2" semver "^5.5.0" -ember-cli-broccoli-sane-watcher@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.0.4.tgz#f43f42f75b7509c212fb926cd9aea86ae19264c6" - integrity sha1-9D9C91t1CcIS+5Js2a6oauGSZMY= +ember-cli-broccoli-sane-watcher@^2.1.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.2.2.tgz#9bb1b04ddeb2c086aecd8693cbaeca1d88dc160c" + integrity sha512-9OLy8x3pdNKC/6xR00IjTL8XyiQU3rb2HLyQSAqHuaZpZcSTKkbAse2ERTsELSINoo/zi/W7qPP5vd5SsHsraw== dependencies: broccoli-slow-trees "^3.0.1" heimdalljs "^0.2.1" heimdalljs-logger "^0.1.7" rsvp "^3.0.18" - sane "^1.1.1" + sane "^2.4.1" -ember-cli-dependency-checker@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-2.1.0.tgz#9d66286a7c778e94733eaf21320d129c4fd0dd64" - integrity sha1-nWYoanx3jpRzPq8hMg0SnE/Q3WQ= +ember-cli-dependency-checker@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-3.1.0.tgz#b39c6b537a1457d77892edf5ddcfa025cd1401e2" + integrity sha512-Y/V2senOyIjQnZohYeZeXs59rWHI2m8KRF9IesMv1ypLRSc/h/QS6UX51wAyaZnxcgU6ljFXpqL5x38UxM3XzA== dependencies: - chalk "^1.1.3" + chalk "^2.3.0" + find-yarn-workspace-root "^1.1.0" is-git-url "^1.0.0" resolve "^1.5.0" semver "^5.3.0" -ember-cli-eslint@^4.2.1: +ember-cli-eslint@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/ember-cli-eslint/-/ember-cli-eslint-4.2.3.tgz#2844d3f5e8184f19b2d7132ba99eb0b370b55598" integrity sha512-1fqRz9QVLTT790Zr07aDFmAprZ1vVsaBGJOGQgDEFmBpogq8BeaQopaxogWFp748hol8nGC4QP5tbzhVD6KQHw== @@ -3376,11 +3642,6 @@ ember-cli-get-component-path-option@^1.0.0: resolved "https://registry.yarnpkg.com/ember-cli-get-component-path-option/-/ember-cli-get-component-path-option-1.0.0.tgz#0d7b595559e2f9050abed804f1d8eff1b08bc771" integrity sha1-DXtZVVni+QUKvtgE8djv8bCLx3E= -ember-cli-get-dependency-depth@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ember-cli-get-dependency-depth/-/ember-cli-get-dependency-depth-1.0.0.tgz#e0afecf82a2d52f00f28ab468295281aec368d11" - integrity sha1-4K/s+CotUvAPKKtGgpUoGuw2jRE= - ember-cli-htmlbars-inline-precompile@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-1.0.2.tgz#5b544f664d5d9911f08cd979c5f70d8cb0ca2add" @@ -3392,49 +3653,40 @@ ember-cli-htmlbars-inline-precompile@^1.0.0: heimdalljs-logger "^0.1.7" silent-error "^1.1.0" -ember-cli-htmlbars@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.3.tgz#e116e1500dba12f29c94b05b9ec90f52cb8bb042" - integrity sha512-oyWtJebOwxAqWZwMc0NKFJ8FJdxVixM7zl0FaXq1vTAG6bOgnU7yAhXEASlaO5f+PptZueZfOpdpvRwZW/Gk1A== +ember-cli-htmlbars-inline-precompile@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-1.0.5.tgz#312e050c9e3dd301c55fb399fd706296cd0b1d6a" + integrity sha512-/CNEqPxroIcbY6qejrt704ZaghHLCntZKYLizFfJ2esirXoJx6fuYKBY1YyJ8GOgjfbHHKjBZuK4vFFJpkGqkQ== dependencies: - broccoli-persistent-filter "^1.0.3" - hash-for-dep "^1.0.2" + babel-plugin-htmlbars-inline-precompile "^0.2.5" + ember-cli-version-checker "^2.1.2" + hash-for-dep "^1.2.3" + heimdalljs-logger "^0.1.9" + silent-error "^1.1.0" + +ember-cli-htmlbars@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-3.0.1.tgz#01e21f0fd05e0a6489154f26614b1041769e3e58" + integrity sha512-pyyB2s52vKTXDC5svU3IjU7GRLg2+5O81o9Ui0ZSiBS14US/bZl46H2dwcdSJAK+T+Za36ZkQM9eh1rNwOxfoA== + dependencies: + broccoli-persistent-filter "^1.4.3" + hash-for-dep "^1.2.3" json-stable-stringify "^1.0.0" strip-bom "^3.0.0" -ember-cli-inject-live-reload@^1.4.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-1.7.0.tgz#af94336e015336127dfb98080ad442bb233e37ed" - integrity sha512-+0zOwJlf4iR5NcvyeU7E7xU1qDfniP/+mXfNTfAEhHO2eE9sjQvasKV84O1sIIyLk2LMIjFPbGt7uv5fQcIGwg== +ember-cli-inject-live-reload@^1.8.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-1.10.2.tgz#43c59f7f1d1e717772da32e5e81d948fb9fe7c94" + integrity sha512-yFvZE4WFyWjzMJ6MTYIyjCXpcJNFMTaZP61JXITMkXhSkhuDkzMD/XfwR5+fr004TYcwrbNWpg1oGX5DbOgcaQ== + dependencies: + clean-base-url "^1.0.0" + ember-cli-version-checker "^2.1.2" ember-cli-is-package-missing@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-is-package-missing/-/ember-cli-is-package-missing-1.0.0.tgz#6e6184cafb92635dd93ca6c946b104292d4e3390" integrity sha1-bmGEyvuSY13ZPKbJRrEEKS1OM5A= -ember-cli-legacy-blueprints@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ember-cli-legacy-blueprints/-/ember-cli-legacy-blueprints-0.2.1.tgz#480f37cb83f1eda2d46bbc7d07c59ea2e8ce9b84" - integrity sha1-SA83y4Px7aLUa7x9B8WeoujOm4Q= - dependencies: - chalk "^2.3.0" - ember-cli-get-component-path-option "^1.0.0" - ember-cli-get-dependency-depth "^1.0.0" - ember-cli-is-package-missing "^1.0.0" - ember-cli-lodash-subset "^2.0.1" - ember-cli-normalize-entity-name "^1.0.0" - ember-cli-path-utils "^1.0.0" - ember-cli-string-utils "^1.0.0" - ember-cli-test-info "^1.0.0" - ember-cli-valid-component-name "^1.0.0" - ember-cli-version-checker "^2.1.0" - ember-router-generator "^1.0.0" - exists-sync "0.0.3" - fs-extra "^4.0.0" - inflection "^1.7.1" - rsvp "^4.7.0" - silent-error "^1.0.0" - ember-cli-lodash-subset@2.0.1, ember-cli-lodash-subset@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-2.0.1.tgz#20cb68a790fe0fde2488ddfd8efbb7df6fe766f2" @@ -3483,6 +3735,19 @@ ember-cli-preprocess-registry@^3.1.0: process-relative-require "^1.0.0" silent-error "^1.0.0" +ember-cli-preprocess-registry@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/ember-cli-preprocess-registry/-/ember-cli-preprocess-registry-3.1.2.tgz#083efb21fd922c021ceba9e08f4d9278249fc4db" + integrity sha512-YJfcDHMBEjtD505CIhM8dtu5FO2Ku+0OTs/0kdLlj9mhXlbzC+k0JAS5c/0AQ+Nh2f+qZZJ8G19ySdzWwTLSCQ== + dependencies: + broccoli-clean-css "^1.1.0" + broccoli-funnel "^1.0.0" + broccoli-merge-trees "^1.0.0" + debug "^2.2.0" + ember-cli-lodash-subset "^1.0.7" + process-relative-require "^1.0.0" + silent-error "^1.0.0" + ember-cli-qunit@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/ember-cli-qunit/-/ember-cli-qunit-4.4.0.tgz#0edd7d651001d0d7ea200b9236a4733a5b7420f1" @@ -3491,18 +3756,7 @@ ember-cli-qunit@^4.4.0: ember-cli-babel "^6.11.0" ember-qunit "^3.5.0" -ember-cli-shims@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ember-cli-shims/-/ember-cli-shims-1.2.0.tgz#0f53aff0aab80b5f29da3a9731bac56169dd941f" - integrity sha1-D1Ov8Kq4C18p2jqXMbrFYWndlB8= - dependencies: - broccoli-file-creator "^1.1.1" - broccoli-merge-trees "^2.0.0" - ember-cli-version-checker "^2.0.0" - ember-rfc176-data "^0.3.1" - silent-error "^1.0.1" - -ember-cli-sri@^2.1.0: +ember-cli-sri@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ember-cli-sri/-/ember-cli-sri-2.1.1.tgz#971620934a4b9183cf7923cc03e178b83aa907fd" integrity sha1-lxYgk0pLkYPPeSPMA+F4uDqpB/0= @@ -3514,6 +3768,23 @@ ember-cli-string-utils@^1.0.0, ember-cli-string-utils@^1.1.0: resolved "https://registry.yarnpkg.com/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz#39b677fc2805f55173735376fcef278eaa4452a1" integrity sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE= +ember-cli-template-lint@^1.0.0-beta.1: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/ember-cli-template-lint/-/ember-cli-template-lint-1.0.0-beta.2.tgz#0ebd2f8c1f9ca47f9ee3b42755d66262440c14f6" + integrity sha512-i37mJhz+dll7eP/Y3Yh8oLw5aRqfdnIiutqdLsrvTSLb4VphDXbujXCO8XravvZtGeGBVYKXGsjTxobbPXgsgw== + dependencies: + aot-test-generators "^0.1.0" + broccoli-concat "^3.7.1" + broccoli-persistent-filter "^1.4.3" + chalk "^2.4.1" + debug "^3.1.0" + ember-cli-version-checker "^2.1.2" + ember-template-lint "^1.0.0-beta.5" + json-stable-stringify "^1.0.1" + md5-hex "^2.0.0" + strip-ansi "^4.0.0" + walk-sync "^0.3.3" + ember-cli-test-info@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-test-info/-/ember-cli-test-info-1.0.0.tgz#ed4e960f249e97523cf891e4aed2072ce84577b4" @@ -3543,13 +3814,6 @@ ember-cli-valid-component-name@^1.0.0: dependencies: silent-error "^1.0.0" -ember-cli-version-checker@^1.1.4: - version "1.3.1" - resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz#0bc2d134c830142da64bf9627a0eded10b61ae72" - integrity sha1-C8LRNMgwFC2mS/lieg7e0QthrnI= - dependencies: - semver "^5.3.0" - ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.1.0.tgz#fc79a56032f3717cf844ada7cbdec1a06fedb604" @@ -3558,6 +3822,14 @@ ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0: resolve "^1.3.3" semver "^5.3.0" +ember-cli-version-checker@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.2.0.tgz#47771b731fe0962705e27c8199a9e3825709f3b3" + integrity sha512-G+KtYIVlSOWGcNaTFHk76xR4GdzDLzAS4uxZUKdASuFX0KJE43C6DaqL+y3VTpUFLI2FIkAS6HZ4I1YBi+S3hg== + dependencies: + resolve "^1.3.3" + semver "^5.3.0" + ember-cli-version-checker@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.1.2.tgz#305ce102390c66e4e0f1432dea9dc5c7c19fed98" @@ -3566,126 +3838,141 @@ ember-cli-version-checker@^2.1.2: resolve "^1.3.3" semver "^5.3.0" -ember-cli@~2.18.2: - version "2.18.2" - resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-2.18.2.tgz#bb15313a15139a85248a86d203643f918ba40f57" - integrity sha1-uxUxOhUTmoUkiobSA2Q/kYukD1c= +ember-cli@~3.4.4: + version "3.4.4" + resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.4.4.tgz#8d25b223b2ef3b863310099192da92ab1feeef6b" + integrity sha512-opbdqt9AbNRPr/amemwqi9ENbx/HcqcprxJAW/y8nZAV1gAku+xPY4WNBF6KuClVEKkddbNi4jITLU59rlJcDA== dependencies: - amd-name-resolver "1.0.0" - babel-plugin-transform-es2015-modules-amd "^6.24.0" + amd-name-resolver "^1.2.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" bower-config "^1.3.0" bower-endpoint-parser "0.2.2" - broccoli-babel-transpiler "^6.0.0" - broccoli-brocfile-loader "^0.18.0" - broccoli-builder "^0.18.8" - broccoli-concat "^3.2.2" - broccoli-config-loader "^1.0.0" + broccoli-amd-funnel "^1.3.0" + broccoli-babel-transpiler "^6.5.0" + broccoli-builder "^0.18.14" + broccoli-concat "^3.5.1" + broccoli-config-loader "^1.0.1" broccoli-config-replace "^1.1.2" - broccoli-debug "^0.6.3" - broccoli-funnel "^2.0.0" + broccoli-debug "^0.6.4" + broccoli-funnel "^2.0.1" broccoli-funnel-reducer "^1.0.0" - broccoli-merge-trees "^2.0.0" - broccoli-middleware "^1.0.0" + broccoli-merge-trees "^3.0.0" + broccoli-middleware "^2.0.1" + broccoli-module-normalizer "^1.3.0" + broccoli-module-unification-reexporter "^1.0.0" broccoli-source "^1.1.0" - broccoli-stew "^1.2.0" - calculate-cache-key-for-tree "^1.0.0" - capture-exit "^1.1.0" - chalk "^2.0.1" + broccoli-stew "^2.0.0" + calculate-cache-key-for-tree "^1.1.0" + capture-exit "^1.2.0" + chalk "^2.4.1" + ci-info "^1.1.3" clean-base-url "^1.0.0" - compression "^1.4.4" - configstore "^3.0.0" - console-ui "^2.0.0" - core-object "^3.1.3" + compression "^1.7.3" + configstore "^4.0.0" + console-ui "^2.2.2" + core-object "^3.1.5" dag-map "^2.0.2" - diff "^3.2.0" - ember-cli-broccoli-sane-watcher "^2.0.4" + diff "^3.5.0" + ember-cli-broccoli-sane-watcher "^2.1.1" ember-cli-is-package-missing "^1.0.0" - ember-cli-legacy-blueprints "^0.2.0" ember-cli-lodash-subset "^2.0.1" ember-cli-normalize-entity-name "^1.0.0" - ember-cli-preprocess-registry "^3.1.0" - ember-cli-string-utils "^1.0.0" - ember-try "^0.2.15" + ember-cli-preprocess-registry "^3.1.2" + ember-cli-string-utils "^1.1.0" ensure-posix-path "^1.0.2" - execa "^0.8.0" - exists-sync "0.0.4" + execa "^0.10.0" exit "^0.1.2" - express "^4.12.3" - filesize "^3.1.3" - find-up "^2.1.0" - fs-extra "^4.0.0" - fs-tree-diff "^0.5.2" + express "^4.16.3" + filesize "^3.6.1" + find-up "^3.0.0" + find-yarn-workspace-root "^1.1.0" + fixturify-project "^1.5.3" + fs-extra "^7.0.0" + fs-tree-diff "^0.5.7" get-caller-file "^1.0.0" - git-repo-info "^1.4.1" - glob "7.1.1" - heimdalljs "^0.2.3" - heimdalljs-fs-monitor "^0.1.0" - heimdalljs-graph "^0.3.1" - heimdalljs-logger "^0.1.7" - http-proxy "^1.9.0" - inflection "^1.7.0" + git-repo-info "^2.0.0" + glob "^7.1.2" + heimdalljs "^0.2.5" + heimdalljs-fs-monitor "^0.2.2" + heimdalljs-graph "^0.3.4" + heimdalljs-logger "^0.1.9" + http-proxy "^1.17.0" + inflection "^1.12.0" is-git-url "^1.0.0" - isbinaryfile "^3.0.0" - js-yaml "^3.6.1" + isbinaryfile "^3.0.3" + js-yaml "^3.12.0" json-stable-stringify "^1.0.1" leek "0.0.24" - lodash.template "^4.2.5" - markdown-it "^8.3.0" + lodash.template "^4.4.0" + markdown-it "^8.4.2" markdown-it-terminal "0.1.0" - minimatch "^3.0.0" - morgan "^1.8.1" - node-modules-path "^1.0.0" + minimatch "^3.0.4" + morgan "^1.9.0" + node-modules-path "^1.0.1" nopt "^3.0.6" - npm-package-arg "^6.0.0" - portfinder "^1.0.7" - promise-map-series "^0.2.1" + npm-package-arg "^6.1.0" + portfinder "^1.0.15" + promise-map-series "^0.2.3" quick-temp "^0.1.8" - resolve "^1.3.0" - rsvp "^4.7.0" - sane "^2.2.0" - semver "^5.1.1" - silent-error "^1.0.0" - sort-package-json "^1.4.0" - symlink-or-copy "^1.1.8" + resolve "^1.8.1" + rsvp "^4.8.3" + sane "^3.0.0" + semver "^5.5.0" + silent-error "^1.1.0" + sort-package-json "^1.15.0" + symlink-or-copy "^1.2.0" temp "0.8.3" - testem "^2.0.0" - tiny-lr "^1.0.3" - tree-sync "^1.2.1" - uuid "^3.0.0" + testem "^2.9.2" + tiny-lr "^1.1.1" + tree-sync "^1.2.2" + uuid "^3.3.2" validate-npm-package-name "^3.0.0" - walk-sync "^0.3.0" - yam "0.0.22" + walk-sync "^0.3.2" + watch-detector "^0.1.0" + yam "^0.0.24" -ember-data@~2.13.0: - version "2.13.2" - resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-2.13.2.tgz#151c93ad5152885d4ca50b1942d7c66e15865c74" - integrity sha1-FRyTrVFSiF1MpQsZQtfGbhWGXHQ= +ember-compatibility-helpers@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.1.2.tgz#ae0ee4a7a2858b5ffdf79b428c23aee85c47d93d" + integrity sha512-yN163MzERpotO8M0b+q+kXs4i3Nx6aIriiZHWv+yXQzr2TAtYlVwg9V7/3+jcurOa3oDEYDpN7y9UZ6q3mnoTg== dependencies: - amd-name-resolver "0.0.5" + babel-plugin-debug-macros "^0.2.0" + ember-cli-version-checker "^2.1.1" + semver "^5.4.1" + +ember-data@~3.4.4: + version "3.4.4" + resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.4.4.tgz#a201c2db1d7ca2cbe59a23ddf3cb96281fce216f" + integrity sha512-5DE1CxR1Eobue0y2WCkGSRUaOuE8ebktNElhcyPUcrksbnILxniPsKPVRq15X+5wLjaEb+XiscH68NLBGbjUvQ== + dependencies: + "@ember/ordered-set" "^2.0.0" babel-plugin-feature-flags "^0.3.1" babel-plugin-filter-imports "^0.3.1" + babel-plugin-transform-es2015-block-scoping "^6.26.0" babel6-plugin-strip-class-callcheck "^6.0.0" babel6-plugin-strip-heimdall "^6.0.1" - broccoli-babel-transpiler "^6.0.0" - broccoli-file-creator "^1.0.0" - broccoli-merge-trees "^1.0.0" - chalk "^1.1.1" - ember-cli-babel "^6.0.0-beta.7" + broccoli-debug "^0.6.4" + broccoli-file-creator "^2.1.1" + broccoli-funnel "^2.0.1" + broccoli-merge-trees "^3.0.0" + broccoli-rollup "^2.1.1" + calculate-cache-key-for-tree "^1.1.0" + chalk "^2.4.1" + ember-cli-babel "^6.16.0" ember-cli-path-utils "^1.0.0" - ember-cli-string-utils "^1.0.0" + ember-cli-string-utils "^1.1.0" ember-cli-test-info "^1.0.0" - ember-cli-version-checker "^1.1.4" - ember-inflector "^2.0.0" - ember-runtime-enumerable-includes-polyfill "^2.0.0" - exists-sync "0.0.3" - git-repo-info "^1.1.2" + ember-cli-version-checker "^2.1.2" + ember-inflector "^3.0.0" + git-repo-info "^2.0.0" heimdalljs "^0.3.0" - inflection "^1.8.0" - npm-git-info "^1.0.0" - semver "^5.1.0" - silent-error "^1.0.0" + inflection "^1.12.0" + npm-git-info "^1.0.3" + resolve "^1.8.1" + semver "^5.5.0" + silent-error "^1.1.0" -ember-disable-prototype-extensions@^1.1.2: +ember-disable-prototype-extensions@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/ember-disable-prototype-extensions/-/ember-disable-prototype-extensions-1.1.3.tgz#1969135217654b5e278f9fe2d9d4e49b5720329e" integrity sha1-GWkTUhdlS14nj5/i2dTkm1cgMp4= @@ -3712,19 +3999,19 @@ ember-inflector@^2.0.0: dependencies: ember-cli-babel "^6.0.0" -"ember-inflector@^2.0.0 || ^3.0.0": +"ember-inflector@^2.0.0 || ^3.0.0", ember-inflector@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-3.0.0.tgz#7e1ee8aaa0fa773ba0905d8b7c0786354d890ee1" integrity sha512-tLWfYolZAkLnkTvvBkjizy4Wmj8yI8wqHZFK+leh0iScHiC3r1Yh5C4qO+OMGiBTMLwfTy+YqVoE/Nu3hGNkcA== dependencies: ember-cli-babel "^6.6.0" -ember-load-initializers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-1.0.0.tgz#4919eaf06f6dfeca7e134633d8c05a6c9921e6e7" - integrity sha1-SRnq8G9t/sp+E0Yz2MBabJkh5uc= +ember-load-initializers@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-1.1.0.tgz#4edacc0f3a14d9f53d241ac3e5561804c8377978" + integrity sha512-WiciFi8IXOqjyJ65M4iBNIthqcy4uXXQq5n3WxeMMhvJVk5JNSd9hynNECNz3nqfEYuZQ9c04UWkmFIQXRfl4Q== dependencies: - ember-cli-babel "^6.0.0-beta.7" + ember-cli-babel "^6.6.0" ember-lodash@^4.19.4: version "4.19.4" @@ -3738,6 +4025,16 @@ ember-lodash@^4.19.4: ember-cli-babel "^7.0.0" lodash-es "^4.17.4" +ember-maybe-import-regenerator@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ember-maybe-import-regenerator/-/ember-maybe-import-regenerator-0.1.6.tgz#35d41828afa6d6a59bc0da3ce47f34c573d776ca" + integrity sha1-NdQYKK+m1qWbwNo85H80xXPXdso= + dependencies: + broccoli-funnel "^1.0.1" + broccoli-merge-trees "^1.0.0" + ember-cli-babel "^6.0.0-beta.4" + regenerator-runtime "^0.9.5" + ember-qunit@^3.5.0: version "3.5.3" resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-3.5.3.tgz#bfd0bff8298c78c77e870cca43fe0826e78a0d09" @@ -3751,150 +4048,162 @@ ember-qunit@^3.5.0: ember-cli-test-loader "^2.2.0" qunit "~2.6.0" -ember-resolver@^4.0.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-4.5.0.tgz#9248bf534dfc197fafe3118fff538d436078bf99" - integrity sha512-BX8yvFWIbrh1IVZmpIY/14WUb7nD8tQzT5s0aUG/Nwq2LVqD/uNAEPcsq0XS2gLvKawwDQEQN30ptcvJApQBhA== +ember-resolver@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-5.0.1.tgz#21740b92e1e4a65f94018de22aa1c73434dc3b2f" + integrity sha512-Svhs/eseIVQ6Yik+4mFpixT639FREZW2UkIYo7197bRuSL63tofKDMfE+gOXUSSudQlQSaFHFeKDr9oD+0C2GQ== dependencies: "@glimmer/resolver" "^0.4.1" babel-plugin-debug-macros "^0.1.10" - broccoli-funnel "^1.1.0" - broccoli-merge-trees "^2.0.0" + broccoli-funnel "^2.0.1" + broccoli-merge-trees "^3.0.0" ember-cli-babel "^6.8.1" ember-cli-version-checker "^2.0.0" resolve "^1.3.3" -ember-rfc176-data@^0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.2.7.tgz#bd355bc9b473e08096b518784170a23388bc973b" - integrity sha512-pJE2w+sI22UDsYmudI4nCp3WcImpUzXwe9qHfpOcEu3yM/HD1nGpDRt6kZD0KUnDmqkLeik/nYyzEwN/NU6xxA== - -ember-rfc176-data@^0.3.0, ember-rfc176-data@^0.3.1: +ember-rfc176-data@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.1.tgz#6a5a4b8b82ec3af34f3010965fa96b936ca94519" integrity sha512-u+W5rUvYO7xyKJjiPuCM7bIAvFyPwPTJ66fOZz1xuCv3AyReI9Oev5oOADOO6YJZk+vEn0xWiZ9N6zSf8WU7Fg== -ember-rfc176-data@^0.3.6: +ember-rfc176-data@^0.3.5, ember-rfc176-data@^0.3.6: version "0.3.6" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.6.tgz#7138db8dfccec39c9a832adfbd4c49d670028907" integrity sha512-kPY94VCukPUPj+/6sZ9KvphD42KnpX2IS31p5z07OFVIviDogR0cQuld5c7Irzfgq7a0YACj0HlToROFn7dLYQ== -ember-router-generator@^1.0.0, ember-router-generator@^1.2.3: +ember-router-generator@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-1.2.3.tgz#8ed2ca86ff323363120fc14278191e9e8f1315ee" integrity sha1-jtLKhv8yM2MSD8FCeBkeno8TFe4= dependencies: recast "^0.11.3" -ember-runtime-enumerable-includes-polyfill@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ember-runtime-enumerable-includes-polyfill/-/ember-runtime-enumerable-includes-polyfill-2.1.0.tgz#dc6d4a028471e4acc350dfd2a149874fb20913f5" - integrity sha512-au18iI8VbEDYn3jLFZzETnKN5ciPgCUxMRucEP3jkq7qZ6sE0FVKpWMPY/h9tTND3VOBJt6fgPpEBJoJVCUudg== +ember-source-channel-url@^1.0.1, ember-source-channel-url@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ember-source-channel-url/-/ember-source-channel-url-1.1.0.tgz#73de5cc6ebc25b2120e932ec1d8f82677bfaf6ef" + integrity sha512-y1RVXmyqrdX6zq9ZejpPt7ohKNGuLMBEKaOUyxFWcYAM5gvLuo6xFerwNmXEBbu4e3//GaoasjodXi6Cl+ddUQ== dependencies: - ember-cli-babel "^6.9.0" - ember-cli-version-checker "^2.1.0" + got "^8.0.1" -ember-source@~2.18.0: - version "2.18.1" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-2.18.1.tgz#bc02fc809f9e9b68d63e790aa3fac16bc6242bd5" - integrity sha1-vAL8gJ+em2jWPnkKo/rBa8YkK9U= +ember-source@~3.4.0: + version "3.4.7" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.4.7.tgz#c819337c62fcc6a10ca8aee28abc703c15a57d9e" + integrity sha512-+4yhFZHsjSucSd0bJGErJUly0kdkutMR06AWHLR0b0VRcdYUCbMcFlEvfc2g2B5YR0GY4enSy4gt7PZgYQOrQw== dependencies: broccoli-funnel "^2.0.1" broccoli-merge-trees "^2.0.0" + chalk "^2.3.0" ember-cli-get-component-path-option "^1.0.0" ember-cli-is-package-missing "^1.0.0" ember-cli-normalize-entity-name "^1.0.0" ember-cli-path-utils "^1.0.0" ember-cli-string-utils "^1.1.0" - ember-cli-test-info "^1.0.0" ember-cli-valid-component-name "^1.0.0" ember-cli-version-checker "^2.1.0" ember-router-generator "^1.2.3" inflection "^1.12.0" - jquery "^3.2.1" - resolve "^1.3.3" + jquery "^3.3.1" + resolve "^1.6.0" -ember-try-config@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ember-try-config/-/ember-try-config-2.2.0.tgz#6be0af6c71949813e02ac793564fddbf8336b807" - integrity sha1-a+CvbHGUmBPgKseTVk/dv4M2uAc= +ember-template-lint@^1.0.0-beta.5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-template-lint/-/ember-template-lint-1.0.0.tgz#fda969d69c4cfac443b58eb3852603cf58aef111" + integrity sha512-8hWUwKRXyLctmDs2v4Lz9Gwch6N7/+1YrdgrxjZmBBhkQ4tD+I0XtVbQFGFY+sIeMxSApam7DOkCT37n3imuYw== dependencies: + "@glimmer/compiler" "^0.38.0" + chalk "^2.0.0" + globby "^8.0.1" + minimatch "^3.0.4" + resolve "^1.1.3" + strip-bom "^3.0.0" + +ember-try-config@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-try-config/-/ember-try-config-3.0.0.tgz#012d8c90cae9eb624e2b62040bf7e76a1aa58edc" + integrity sha512-pNwHS29O1ACczkrxBKRtDY0TzTb7uPnA5eHEe+4NF6qpLK5FVnL3EtgZ8+yVYtnm1If5mZ07rIubw45vaSek7w== + dependencies: + ember-source-channel-url "^1.0.1" lodash "^4.6.1" - node-fetch "^1.3.3" - rsvp "^3.2.1" - semver "^5.1.0" + package-json "^4.0.1" + remote-git-tags "^2.0.0" + rsvp "^4.8.1" + semver "^5.5.0" -ember-try@^0.2.15: - version "0.2.23" - resolved "https://registry.yarnpkg.com/ember-try/-/ember-try-0.2.23.tgz#39b57141b4907541d0ac8b503d211e6946b08718" - integrity sha512-kmVNsSFFafGinFhERMox3SXHoU+V1td1538SbhpslPtf7S2BZYr7JdAwOCIRoRtpcWeNdYgdQGzJZxNvUc8aLg== +ember-try@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ember-try/-/ember-try-1.1.0.tgz#194d5843a79b5a9fc0e4c07445ebc18c08a91e78" + integrity sha512-NL1rKPz2LuyVEqwoNV+SQD4c2w1/A0rrdeT6jqTYqlt/P7y3+SWcsxyReBnImebaIu7Drtz6p9yiAsrJq5Chyg== dependencies: - chalk "^1.0.0" - cli-table2 "^0.2.0" - core-object "^1.1.0" - debug "^2.2.0" - ember-try-config "^2.2.0" + chalk "^2.3.0" + cli-table3 "^0.5.1" + core-object "^3.1.5" + debug "^3.1.0" + ember-try-config "^3.0.0" + execa "^1.0.0" extend "^3.0.0" - fs-extra "^0.26.0" + fs-extra "^5.0.0" promise-map-series "^0.2.1" resolve "^1.1.6" rimraf "^2.3.2" - rsvp "^3.0.17" - semver "^5.1.0" + rsvp "^4.7.0" + walk-sync "^0.3.3" -encodeurl@~1.0.1: +emit-function@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/emit-function/-/emit-function-0.0.2.tgz#e3a50b3d61be1bf8ca88b924bf713157a5bec124" + integrity sha1-46ULPWG+G/jKiLkkv3ExV6W+wSQ= + +encodeurl@~1.0.1, encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -encoding@^0.1.11: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= +end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== dependencies: - iconv-lite "~0.4.13" + once "^1.4.0" -engine.io-client@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.0.tgz#7b730e4127414087596d9be3c88d2bc5fdb6cf5c" - integrity sha1-e3MOQSdBQIdZbZvjyI0rxf22z1w= +engine.io-client@~3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.3.1.tgz#afedb4a07b2ea48b7190c3136bfea98fdd4f0f03" + integrity sha512-q66JBFuQcy7CSlfAz9L3jH+v7DTT3i6ZEadYcVj2pOs8/0uJHLxKX3WBkGTvULJMdz0tUCyJag0aKT/dpXL9BQ== dependencies: component-emitter "1.2.1" component-inherit "0.0.3" - debug "2.3.3" - engine.io-parser "1.3.1" + debug "~3.1.0" + engine.io-parser "~2.1.1" has-cors "1.1.0" indexof "0.0.1" - parsejson "0.0.3" parseqs "0.0.5" parseuri "0.0.5" - ws "1.1.1" - xmlhttprequest-ssl "1.5.3" + ws "~6.1.0" + xmlhttprequest-ssl "~1.5.4" yeast "0.1.2" -engine.io-parser@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.1.tgz#9554f1ae33107d6fbd170ca5466d2f833f6a07cf" - integrity sha1-lVTxrjMQfW+9FwylRm0vgz9qB88= +engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.3.tgz#757ab970fbf2dfb32c7b74b033216d5739ef79a6" + integrity sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA== dependencies: - after "0.8.1" - arraybuffer.slice "0.0.6" + after "0.8.2" + arraybuffer.slice "~0.0.7" base64-arraybuffer "0.1.5" - blob "0.0.4" - has-binary "0.1.6" - wtf-8 "1.0.0" + blob "0.0.5" + has-binary2 "~1.0.2" -engine.io@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.0.tgz#3eeb5f264cb75dbbec1baaea26d61f5a4eace2aa" - integrity sha1-PutfJky3XbvsG6rqJtYfWk6s4qo= +engine.io@~3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.3.2.tgz#18cbc8b6f36e9461c5c0f81df2b830de16058a59" + integrity sha512-AsaA9KG7cWPXWHp5FvHdDWY3AMWeZ8x+2pUVLcn71qE5AtAzgGbxuclOytygskw8XGmiQafTmnI9Bix3uihu2w== dependencies: - accepts "1.3.3" - base64id "0.1.0" + accepts "~1.3.4" + base64id "1.0.0" cookie "0.3.1" - debug "2.3.3" - engine.io-parser "1.3.1" - ws "1.1.1" + debug "~3.1.0" + engine.io-parser "~2.1.0" + ws "~6.1.0" ensure-posix-path@^1.0.0, ensure-posix-path@^1.0.1, ensure-posix-path@^1.0.2: version "1.0.2" @@ -3921,6 +4230,27 @@ error@^7.0.0: string-template "~0.2.1" xtend "~4.0.0" +es-abstract@^1.5.1: + version "1.13.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" + integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== + dependencies: + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-keys "^1.0.12" + +es-to-primitive@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -3950,24 +4280,33 @@ eslint-plugin-ember-suave@^1.0.0: dependencies: requireindex "~1.1.0" -eslint-plugin-ember@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-5.0.3.tgz#9f5e2048ab3ddc1548d4d17bf318cf1bb5cf37f1" - integrity sha512-wPq2N96YQR2/Ob2LfuLQV8BEotHXxiFcuBiHikN8P+2VGzxBeuydafXy/pExuTsU2RHfPiSgyBHavKGy1DYdrQ== +eslint-plugin-ember@^5.2.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-5.4.0.tgz#2980a4389119b37d0450fff8e82d59c9aab126d0" + integrity sha512-tYMuxUrTad4f7Dq9gY9GUs9lXwKY+fZklzCJ0JoYbzK2PwSfdrPInr2Y4tHornc9dzPvNbRxsn5b26PrWp2iZg== dependencies: - ember-rfc176-data "^0.2.7" - require-folder-tree "^1.4.5" + ember-rfc176-data "^0.3.5" snake-case "^2.1.0" -eslint-plugin-node@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-6.0.1.tgz#bf19642298064379315d7a4b2a75937376fa05e4" - integrity sha512-Q/Cc2sW1OAISDS+Ji6lZS2KV4b7ueA/WydVWd1BECTQwVvfQy5JAi3glhINoKzoMnfnuRgNP+ZWKrGAbp3QDxw== +eslint-plugin-es@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz#475f65bb20c993fc10e8c8fe77d1d60068072da6" + integrity sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw== + dependencies: + eslint-utils "^1.3.0" + regexpp "^2.0.1" + +eslint-plugin-node@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz#a6e054e50199b2edd85518b89b4e7b323c9f36db" + integrity sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw== dependencies: - ignore "^3.3.6" + eslint-plugin-es "^1.3.1" + eslint-utils "^1.3.1" + ignore "^4.0.2" minimatch "^3.0.4" - resolve "^1.3.3" - semver "^5.4.1" + resolve "^1.8.1" + semver "^5.5.0" eslint-scope@^3.7.1: version "3.7.1" @@ -3977,6 +4316,11 @@ eslint-scope@^3.7.1: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-utils@^1.3.0, eslint-utils@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" + integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q== + eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" @@ -4068,6 +4412,11 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= +estree-walker@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.2.tgz#d3850be7529c9580d815600b53126515e146dd39" + integrity sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig== + esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -4083,6 +4432,11 @@ eventemitter3@1.x.x: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" integrity sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg= +eventemitter3@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" + integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA== + events-to-array@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/events-to-array/-/events-to-array-1.1.2.tgz#2d41f563e1fe400ed4962fe1a4d5c6a7539df7f6" @@ -4104,12 +4458,12 @@ exec-sh@^0.2.0: dependencies: merge "^1.1.3" -execa@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" - integrity sha1-2NdrvBtVIX7RkP1t1J08d07PyNo= +execa@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== dependencies: - cross-spawn "^5.0.1" + cross-spawn "^6.0.0" get-stream "^3.0.0" is-stream "^1.1.0" npm-run-path "^2.0.0" @@ -4117,13 +4471,13 @@ execa@^0.8.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.9.0.tgz#adb7ce62cf985071f60580deb4a88b9e34712d01" - integrity sha512-BbUMBiX4hqiHZUA5+JujIjNb6TyAlp2D5KLheMjMluwOuzcnylDL4AxZYLLn1n2AGB49eSWwyKvvEQoRpnAtmA== +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" + cross-spawn "^6.0.0" + get-stream "^4.0.0" is-stream "^1.1.0" npm-run-path "^2.0.0" p-finally "^1.0.0" @@ -4182,13 +4536,6 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" -expand-tilde@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" - integrity sha1-C4HrqJflo9MdHD0QL48BRB5VlEk= - dependencies: - os-homedir "^1.0.1" - expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" @@ -4196,7 +4543,7 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" -express@^4.10.7, express@^4.12.3: +express@^4.10.7: version "4.16.2" resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" integrity sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w= @@ -4232,6 +4579,42 @@ express@^4.10.7, express@^4.12.3: utils-merge "1.0.1" vary "~1.1.2" +express@^4.16.3: + version "4.16.4" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" + integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== + dependencies: + accepts "~1.3.5" + array-flatten "1.1.1" + body-parser "1.18.3" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.1" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.4" + qs "6.5.2" + range-parser "~1.2.0" + safe-buffer "5.1.2" + send "0.16.2" + serve-static "1.13.2" + setprototypeof "1.1.0" + statuses "~1.4.0" + type-is "~1.6.16" + utils-merge "1.0.1" + vary "~1.1.2" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -4247,7 +4630,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: +extend@^3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" integrity sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ= @@ -4326,6 +4709,18 @@ fast-deep-equal@^2.0.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= +fast-glob@^2.0.2: + version "2.2.6" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.6.tgz#a5d5b697ec8deda468d85a74035290a025a95295" + integrity sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" @@ -4358,6 +4753,20 @@ fast-sourcemap-concat@^1.0.1: source-map-url "^0.3.0" sourcemap-validator "^1.0.5" +fast-sourcemap-concat@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/fast-sourcemap-concat/-/fast-sourcemap-concat-1.4.0.tgz#122c330d4a2afaff16ad143bc9674b87cd76c8ad" + integrity sha512-x90Wlx/2C83lfyg7h4oguTZN4MyaVfaiUSJQNpU+YEA0Odf9u659Opo44b0LfoVg9G/bOE++GdID/dkyja+XcA== + dependencies: + chalk "^2.0.0" + fs-extra "^5.0.0" + heimdalljs-logger "^0.1.9" + memory-streams "^0.1.3" + mkdirp "^0.5.0" + source-map "^0.4.2" + source-map-url "^0.3.0" + sourcemap-validator "^1.1.0" + fastboot-express-middleware@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/fastboot-express-middleware/-/fastboot-express-middleware-1.2.0.tgz#3f32fb21d8d01ad7c0c7d876b278601665ea17fa" @@ -4423,19 +4832,19 @@ filename-regex@^2.0.0: resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= -filesize@^3.1.3: - version "3.6.0" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.0.tgz#22d079615624bb6fd3c04026120628a41b3f4efa" - integrity sha512-g5OWtoZWcPI56js1DFhIEqyG9tnu/7sG3foHwgS9KGYFMfsYguI3E+PRVCmtmE96VajQIEMRU2OhN+ME589Gdw== +filesize@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" + integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== fill-range@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" - integrity sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM= + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== dependencies: is-number "^2.1.0" isobject "^2.0.0" - randomatic "^1.1.3" + randomatic "^3.0.0" repeat-element "^1.1.2" repeat-string "^1.5.2" @@ -4462,6 +4871,19 @@ finalhandler@1.1.0: statuses "~1.3.1" unpipe "~1.0.0" +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.4.0" + unpipe "~1.0.0" + find-babel-config@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.1.0.tgz#acc01043a6749fec34429be6b64f542ebb5d6355" @@ -4490,6 +4912,21 @@ find-up@^2.1.0: dependencies: locate-path "^2.0.0" +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-yarn-workspace-root@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db" + integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q== + dependencies: + fs-extra "^4.0.3" + micromatch "^3.1.4" + findup-sync@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" @@ -4500,16 +4937,6 @@ findup-sync@2.0.0: micromatch "^3.0.4" resolve-dir "^1.0.1" -findup-sync@^0.4.2: - version "0.4.3" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" - integrity sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI= - dependencies: - detect-file "^0.1.0" - is-glob "^2.0.1" - micromatch "^2.3.7" - resolve-dir "^0.1.0" - fireworm@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/fireworm/-/fireworm-0.7.1.tgz#ccf20f7941f108883fcddb99383dbe6e1861c758" @@ -4521,6 +4948,22 @@ fireworm@^0.7.0: lodash.flatten "^3.0.2" minimatch "^3.0.2" +fixturify-project@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/fixturify-project/-/fixturify-project-1.5.3.tgz#2ba4ffec59c1d79ae6638f818c0847eb974d179b" + integrity sha512-vgH+Uo+pC6jHg7mt+FDz+j08bKFugnP6guBWeumYllQDbvxT7NQ/sf6zO4nC0XKRRsSNWsOHkO0AppaHvwF69A== + dependencies: + fixturify "^0.3.4" + tmp "^0.0.33" + +fixturify@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/fixturify/-/fixturify-0.3.4.tgz#c676de404a7f8ee8e64d0b76118e62ec95ab7b25" + integrity sha512-Gx+KSB25b6gMc4bf7UFRTA85uE0iZR+RYur0JHh6dg4AGBh0EksOv4FCHyM7XpGmiJO7Bc7oV7vxENQBT+2WEQ== + dependencies: + fs-extra "^0.30.0" + matcher-collection "^1.0.4" + flat-cache@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" @@ -4531,6 +4974,13 @@ flat-cache@^1.2.1: graceful-fs "^4.1.2" write "^0.2.1" +follow-redirects@^1.0.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.6.1.tgz#514973c44b5757368bad8bddfe52f81f015c94cb" + integrity sha512-t2JCjbzxQpWvbhts3l6SH1DKzSrx8a+SsaVf4h6bG4kOXUuPYS/kg2Lr4gQSb7eemaHqJkOThF1BGyjlUkO1GQ== + dependencies: + debug "=3.1.0" + for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -4548,15 +4998,6 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@~2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" - integrity sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE= - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" - form-data@~2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" @@ -4592,10 +5033,13 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -fs-exists-sync@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" - integrity sha1-mC1ok6+RjnLQjeyehnP/K1qNat0= +from2@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" fs-extra@^0.24.0: version "0.24.0" @@ -4607,17 +5051,6 @@ fs-extra@^0.24.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@^0.26.0: - version "0.26.7" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" - integrity sha1-muH92UiXeY7at20JGM9C0MMYT6k= - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" @@ -4646,7 +5079,7 @@ fs-extra@^2.0.0: graceful-fs "^4.1.2" jsonfile "^2.1.0" -fs-extra@^4.0.0, fs-extra@^4.0.2: +fs-extra@^4.0.2, fs-extra@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== @@ -4655,6 +5088,15 @@ fs-extra@^4.0.0, fs-extra@^4.0.2: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" + integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.1.tgz#8abc128f7946e310135ddc93b98bddb410e7a34b" @@ -4664,6 +5106,15 @@ fs-extra@^6.0.1: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" @@ -4681,7 +5132,7 @@ fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6: path-posix "^1.0.0" symlink-or-copy "^1.1.8" -fs-tree-diff@^0.5.3: +fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.7: version "0.5.9" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.9.tgz#a4ec6182c2f5bd80b9b83c8e23e4522e6f5fd946" integrity sha512-872G8ax0kHh01m9n/2KDzgYwouKza0Ad9iFltBpNykvROvf2AGtoOzPJgGx125aolGPER3JuC7uZFrQ7bG1AZw== @@ -4707,14 +5158,6 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" - integrity sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q== - dependencies: - nan "^2.3.0" - node-pre-gyp "^0.6.39" - fsevents@^1.2.3: version "1.2.6" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.6.tgz#d3a1864a71876a2eb9b244e3bd8f606eb09568c0" @@ -4723,24 +5166,10 @@ fsevents@^1.2.3: nan "^2.9.2" node-pre-gyp "^0.10.0" -fstream-ignore@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" - integrity sha1-nDHa40dnAY/h0kmyTa2mfQktoQU= - dependencies: - fstream "^1.0.0" - inherits "2" - minimatch "^3.0.0" - -fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: - version "1.0.11" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" - integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE= - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== functional-red-black-tree@^1.0.1: version "1.0.1" @@ -4771,27 +5200,79 @@ get-stdin@^4.0.1: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= -get-stream@^3.0.0: +get-stream@3.0.0, get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +git-fetch-pack@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/git-fetch-pack/-/git-fetch-pack-0.1.1.tgz#7703a32cf0db80f060d2766a34ac00d02cebcdf5" + integrity sha1-dwOjLPDbgPBg0nZqNKwA0CzrzfU= + dependencies: + bops "0.0.3" + emit-function "0.0.2" + git-packed-ref-parse "0.0.0" + through "~2.2.7" + +git-packed-ref-parse@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/git-packed-ref-parse/-/git-packed-ref-parse-0.0.0.tgz#b85046931f3e4a65679b5de54af3a5d3df372646" + integrity sha1-uFBGkx8+SmVnm13lSvOl0983JkY= + dependencies: + line-stream "0.0.0" + through "~2.2.7" + +git-read-pkt-line@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/git-read-pkt-line/-/git-read-pkt-line-0.0.8.tgz#494037854ed57bd90cd55676540d86ab0cb36caa" + integrity sha1-SUA3hU7Ve9kM1VZ2VA2GqwyzbKo= + dependencies: + bops "0.0.3" + through "~2.2.7" + +git-repo-info@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-2.1.0.tgz#13d1f753c75bc2994432e65a71e35377ff563813" + integrity sha512-+kigfDB7j3W80f74BoOUX+lKOmf4pR3/i2Ww6baKTCPe2hD4FRdjhV3s4P5Dy0Tak1uY1891QhKoYNtnyX2VvA== + +git-transport-protocol@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/git-transport-protocol/-/git-transport-protocol-0.1.0.tgz#99f4dd6389b9161eded74a9e617d6ba5ed0a6c2c" + integrity sha1-mfTdY4m5Fh7e10qeYX1rpe0KbCw= dependencies: - assert-plus "^1.0.0" + duplex "~1.0.0" + emit-function "0.0.2" + git-read-pkt-line "0.0.8" + git-write-pkt-line "0.1.0" + through "~2.2.7" -git-repo-info@^1.1.2, git-repo-info@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-1.4.1.tgz#2a072823254aaf62fcf0766007d7b6651bd41943" - integrity sha1-KgcoIyVKr2L88HZgB9e2ZRvUGUM= +git-write-pkt-line@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/git-write-pkt-line/-/git-write-pkt-line-0.1.0.tgz#a84c1856c09011908389b2f06f911d91f6394694" + integrity sha1-qEwYVsCQEZCDibLwb5EdkfY5RpQ= + dependencies: + bops "0.0.3" + through "~2.2.7" glob-base@^0.3.0: version "0.3.0" @@ -4808,17 +5289,18 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" -glob@7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" - integrity sha1-gFIR3wT6rxxjo2ADBs31reULLsg= +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.2" - once "^1.3.0" - path-is-absolute "^1.0.0" + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= glob@^5.0.10: version "5.0.15" @@ -4855,14 +5337,6 @@ glob@^7.0.5, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -global-modules@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" - integrity sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0= - dependencies: - global-prefix "^0.1.4" - is-windows "^0.2.0" - global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -4872,16 +5346,6 @@ global-modules@^1.0.0: is-windows "^1.0.1" resolve-dir "^1.0.0" -global-prefix@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" - integrity sha1-jTvGuNo8qBEqFg2NSW/wRiv+948= - dependencies: - homedir-polyfill "^1.0.0" - ini "^1.3.4" - is-windows "^0.2.0" - which "^1.2.12" - global-prefix@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" @@ -4920,6 +5384,59 @@ globby@^5.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +globby@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" + integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== + dependencies: + array-union "^1.0.1" + dir-glob "2.0.0" + fast-glob "^2.0.2" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +got@^8.0.1: + version "8.3.2" + resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" + integrity sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw== + dependencies: + "@sindresorhus/is" "^0.7.0" + cacheable-request "^2.1.1" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + into-stream "^3.1.0" + is-retry-allowed "^1.1.0" + isurl "^1.0.0-alpha5" + lowercase-keys "^1.0.0" + mimic-response "^1.0.0" + p-cancelable "^0.4.0" + p-timeout "^2.0.1" + pify "^3.0.0" + safe-buffer "^5.1.1" + timed-out "^4.0.1" + url-parse-lax "^3.0.0" + url-to-options "^1.0.1" + graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -4946,24 +5463,22 @@ handlebars@^4.0.4: optionalDependencies: uglify-js "^2.6" -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" - integrity sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4= +handlebars@^4.0.6: + version "4.0.12" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" + integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA== + dependencies: + async "^2.5.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= -har-validator@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" - integrity sha1-M0gdDxu/9gDdID11gSpqX7oALio= - dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" - har-validator@~5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" @@ -4994,19 +5509,12 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" -has-binary@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.6.tgz#25326f39cfa4f616ad8787894e3af2cfbc7b6e10" - integrity sha1-JTJvOc+k9hath4eJTjryz7x7bhA= - dependencies: - isarray "0.0.1" - -has-binary@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" - integrity sha1-aOYesWIQyVRaClzOBqhzkS/h5ow= +has-binary2@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" + integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== dependencies: - isarray "0.0.1" + isarray "2.0.1" has-cors@1.1.0: version "1.1.0" @@ -5023,6 +5531,23 @@ has-flag@^3.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= +has-symbol-support-x@^1.4.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" + integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= + +has-to-string-tag-x@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" + integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== + dependencies: + has-symbol-support-x "^1.4.1" + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -5059,6 +5584,13 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" +has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + hash-for-dep@^1.0.2, hash-for-dep@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.2.3.tgz#5ec69fca32c23523972d52acb5bb65ffc3664cab" @@ -5069,28 +5601,18 @@ hash-for-dep@^1.0.2, hash-for-dep@^1.2.3: heimdalljs-logger "^0.1.7" resolve "^1.4.0" -hawk@3.1.3, hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - integrity sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ= - dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" - -heimdalljs-fs-monitor@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/heimdalljs-fs-monitor/-/heimdalljs-fs-monitor-0.1.0.tgz#d404a65688c6714c485469ed3495da4853440272" - integrity sha1-1ASmVojGcUxIVGntNJXaSFNEAnI= +heimdalljs-fs-monitor@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/heimdalljs-fs-monitor/-/heimdalljs-fs-monitor-0.2.2.tgz#a76d98f52dbf3aa1b7c20cebb0132e2f5eeb9204" + integrity sha512-R/VhkWs8tm4x+ekLIp+oieR8b3xYK0oFDumEraGnwNMixpiKwO3+Ms5MJzDP5W5Ui1+H/57nGW5L3lHbxi20GA== dependencies: - heimdalljs "^0.2.0" + heimdalljs "^0.2.3" heimdalljs-logger "^0.1.7" -heimdalljs-graph@^0.3.1: - version "0.3.4" - resolved "https://registry.yarnpkg.com/heimdalljs-graph/-/heimdalljs-graph-0.3.4.tgz#0bd75797beeaa20b0ed59017aed3b2d95312acee" - integrity sha512-2DXgPIxdatgtBOjlh5qeVeHIGMTC2V9ujEvUhVJBVOVwqnU41g1OuGaRugLi6rvk0E+u1koYkfPeptybV8ZJ4g== +heimdalljs-graph@^0.3.4: + version "0.3.5" + resolved "https://registry.yarnpkg.com/heimdalljs-graph/-/heimdalljs-graph-0.3.5.tgz#420fbbc8fc3aec5963ddbbf1a5fb47921c4a5927" + integrity sha512-szOy9WZUc7eUInEBQEsoa1G2d+oYHrn6ndZPf76eh8A9ID1zWUCEEsxP3F+CvQx9+EDrg1srdyLUmfVAr8EB4g== heimdalljs-logger@^0.1.7, heimdalljs-logger@^0.1.9: version "0.1.10" @@ -5121,11 +5643,6 @@ heimdalljs@^0.3.0: dependencies: rsvp "~3.2.1" -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - integrity sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0= - home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" @@ -5134,18 +5651,23 @@ home-or-tmp@^2.0.0: os-homedir "^1.0.0" os-tmpdir "^1.0.1" -homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: +homedir-polyfill@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" integrity sha1-TCu8inWJmP7r9e1oWA921GdotLw= dependencies: parse-passwd "^1.0.0" -hosted-git-info@^2.1.4, hosted-git-info@^2.5.0: +hosted-git-info@^2.1.4: version "2.5.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" integrity sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg== +hosted-git-info@^2.6.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== + html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" @@ -5153,6 +5675,11 @@ html-encoding-sniffer@^1.0.2: dependencies: whatwg-encoding "^1.0.1" +http-cache-semantics@3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" + integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== + http-errors@1.6.2, http-errors@~1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" @@ -5163,12 +5690,22 @@ http-errors@1.6.2, http-errors@~1.6.2: setprototypeof "1.0.3" statuses ">= 1.3.1 < 2" +http-errors@1.6.3, http-errors@~1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + http-parser-js@>=0.4.0: version "0.4.10" resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= -http-proxy@^1.13.1, http-proxy@^1.9.0: +http-proxy@^1.13.1: version "1.16.2" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" integrity sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I= @@ -5176,14 +5713,14 @@ http-proxy@^1.13.1, http-proxy@^1.9.0: eventemitter3 "1.x.x" requires-port "1.x.x" -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - integrity sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8= +http-proxy@^1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" + integrity sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g== dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" + eventemitter3 "^3.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" http-signature@~1.2.0: version "1.2.0" @@ -5194,11 +5731,18 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@~0.4.13: +iconv-lite@0.4.19, iconv-lite@^0.4.17: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" integrity sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ== +iconv-lite@0.4.23: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + iconv-lite@0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -5213,11 +5757,21 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -ignore@^3.3.3, ignore@^3.3.6: +ignore@^3.3.3: version "3.3.7" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" integrity sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA== +ignore@^3.3.5: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== + +ignore@^4.0.2: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -5235,7 +5789,7 @@ indexof@0.0.1: resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= -inflection@^1.12.0, inflection@^1.7.0, inflection@^1.7.1, inflection@^1.8.0: +inflection@^1.12.0: version "1.12.0" resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" integrity sha1-ogCTVlbW9fa8TcdQLhrstwMihBY= @@ -5248,7 +5802,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= @@ -5289,7 +5843,7 @@ inquirer@^2: strip-ansi "^3.0.0" through "^2.3.6" -inquirer@^3.0.6: +inquirer@^3.0.6, inquirer@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== @@ -5309,6 +5863,14 @@ inquirer@^3.0.6: strip-ansi "^4.0.0" through "^2.3.6" +into-stream@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" + integrity sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY= + dependencies: + from2 "^2.1.1" + p-is-promise "^1.1.0" + invariant@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" @@ -5321,6 +5883,11 @@ ipaddr.js@1.5.2: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" integrity sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A= +ipaddr.js@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" + integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= + is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -5352,6 +5919,11 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" +is-callable@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -5366,6 +5938,11 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" @@ -5413,7 +5990,7 @@ is-extglob@^1.0.0: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= -is-extglob@^2.1.0: +is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= @@ -5456,6 +6033,13 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" +is-glob@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A= + dependencies: + is-extglob "^2.1.1" + is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" @@ -5470,11 +6054,21 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= +is-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" + integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= + is-odd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-1.0.0.tgz#3b8a932eb028b3775c39bb09e91767accdb69088" @@ -5501,6 +6095,11 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -5523,16 +6122,47 @@ is-promise@^2.1.0: resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= + +is-reference@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.1.1.tgz#bf2cda150a877f04d48caaf8fd70c03d8bed5e2d" + integrity sha512-URlByVARcyP2E2GC7d3Ur702g3vqW391VKCHuF5Goo/M8IT97k4RU/+56OYImwDdX1J/V/VRxECE/wJqB0I2tg== + dependencies: + "@types/estree" "0.0.39" + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= + dependencies: + has "^1.0.1" + is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== -is-stream@^1.0.1, is-stream@^1.1.0: +is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= + +is-stream@^1.0.0, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + dependencies: + has-symbols "^1.0.0" + is-type@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/is-type/-/is-type-0.0.1.tgz#f651d85c365d44955d14a51d8d7061f3f6b4779c" @@ -5550,11 +6180,6 @@ is-utf8@^0.2.0: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= -is-windows@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" - integrity sha1-3hqm1j6indJIc3tp8f+LgALSEIw= - is-windows@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.1.tgz#310db70f742d259a16a369202b51af84233310d9" @@ -5575,10 +6200,17 @@ isarray@1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= -isbinaryfile@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" - integrity sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE= +isarray@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" + integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= + +isbinaryfile@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" + integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== + dependencies: + buffer-alloc "^1.2.0" isexe@^2.0.0: version "2.0.0" @@ -5611,12 +6243,20 @@ istextorbinary@2.1.0: editions "^1.1.1" textextensions "1 || 2" +isurl@^1.0.0-alpha5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" + integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== + dependencies: + has-to-string-tag-x "^1.2.0" + is-object "^1.0.1" + jquery-deferred@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/jquery-deferred/-/jquery-deferred-0.3.1.tgz#596eca1caaff54f61b110962b23cafea74c35355" integrity sha1-WW7KHKr/VPYbEQlisjyv6nTDU1U= -jquery@^3.2.1: +jquery@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" integrity sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg== @@ -5641,7 +6281,15 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.6.1, js-yaml@^3.9.1: +js-yaml@^3.12.0: + version "3.12.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.1.tgz#295c8632a18a23e054cf5c9d3cecafe678167600" + integrity sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.9.1: version "3.10.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" integrity sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA== @@ -5706,6 +6354,11 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" @@ -5738,11 +6391,6 @@ json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json3@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" - integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= - json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -5784,6 +6432,13 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +keyv@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373" + integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA== + dependencies: + json-buffer "3.0.0" + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -5844,6 +6499,13 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +line-stream@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/line-stream/-/line-stream-0.0.0.tgz#888b7cc7951c6a05ce4d696dd1e6b8262371bb45" + integrity sha1-iIt8x5UcagXOTWlt0ea4JiNxu0U= + dependencies: + through "~2.2.0" + linkify-it@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.0.3.tgz#d94a4648f9b1c179d64fa97291268bdb6ce9434f" @@ -5872,6 +6534,11 @@ loader.js@^4.7.0: resolved "https://registry.yarnpkg.com/loader.js/-/loader.js-4.7.0.tgz#a1a52902001c83631efde9688b8ab3799325ef1f" integrity sha512-9M2KvGT6duzGMgkOcTkWb+PR/Q2Oe54df/tLgHGVmFpAmtqJ553xJh6N63iFYI2yjo2PeJXbS5skHi/QpJq4vA== +locate-character@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/locate-character/-/locate-character-2.0.5.tgz#f2d2614d49820ecb3c92d80d193b8db755f74c0f" + integrity sha512-n2GmejDXtOPBAZdIiEFy5dJ5N38xBCXLNOtw2WpB9kGh6pnrEuKlwYI+Tkpofc4wDtVXHtoAOJaMRlYG/oYaxg== + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -5880,6 +6547,14 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + lodash-es@^4.17.4: version "4.17.5" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.5.tgz#9fc6e737b1c4d151d8f9cae2247305d552ce748f" @@ -6179,7 +6854,7 @@ lodash.keys@~2.3.0: lodash._shimkeys "~2.3.0" lodash.isobject "~2.3.0" -lodash.merge@^4.3.0, lodash.merge@^4.4.0, lodash.merge@^4.6.0: +lodash.merge@^4.3.0, lodash.merge@^4.3.1, lodash.merge@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== @@ -6211,7 +6886,7 @@ lodash.support@~2.3.0: dependencies: lodash._renative "~2.3.0" -lodash.template@^4.2.5: +lodash.template@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" integrity sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A= @@ -6264,16 +6939,6 @@ lodash.values@~2.3.0: dependencies: lodash.keys "~2.3.0" -lodash@3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.8.0.tgz#376eb98bdcd9382a9365c33c4cb8250de1325b91" - integrity sha1-N265i9zZOCqTZcM8TLglDeEyW5E= - -lodash@^3.10.1: - version "3.10.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" - integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= - lodash@^4.13.1: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" @@ -6289,7 +6954,7 @@ lodash@^4.17.10, lodash@^4.5.1: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== -log-symbols@^2.1.0: +log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== @@ -6321,6 +6986,16 @@ lower-case@^1.1.1: resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= +lowercase-keys@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY= + +lowercase-keys@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + lru-cache@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" @@ -6329,6 +7004,13 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" +magic-string@^0.24.0: + version "0.24.1" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.24.1.tgz#7e38e5f126cae9f15e71f0cf8e450818ca7d5a8f" + integrity sha512-YBfNxbJiixMzxW40XqJEIldzHyh5f7CZKalo1uZffevyrPEX8Qgo9s0dmcORLHdV47UyvJg8/zD+6hQG3qvJrA== + dependencies: + sourcemap-codec "^1.4.1" + make-dir@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51" @@ -6371,7 +7053,7 @@ markdown-it-terminal@0.1.0: lodash.merge "^4.6.0" markdown-it "^8.3.1" -markdown-it@^8.3.0, markdown-it@^8.3.1: +markdown-it@^8.3.1: version "8.4.0" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.0.tgz#e2400881bf171f7018ed1bd9da441dac8af6306d" integrity sha512-tNuOCCfunY5v5uhcO2AUMArvKAyKMygX8tfup/JrgnsDqcCATQsAExBq7o5Ml9iMmO82bk6jYNLj6khcrl0JGA== @@ -6382,13 +7064,29 @@ markdown-it@^8.3.0, markdown-it@^8.3.1: mdurl "^1.0.1" uc.micro "^1.0.3" -matcher-collection@^1.0.0, matcher-collection@^1.0.5: +markdown-it@^8.4.2: + version "8.4.2" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54" + integrity sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ== + dependencies: + argparse "^1.0.7" + entities "~1.1.1" + linkify-it "^2.0.0" + mdurl "^1.0.1" + uc.micro "^1.0.5" + +matcher-collection@^1.0.0, matcher-collection@^1.0.4, matcher-collection@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.0.5.tgz#2ee095438372cb8884f058234138c05c644ec339" integrity sha512-nUCmzKipcJEwYsBVAFh5P+d7JBuhJaW1xs85Hara9xuMLqtCVUrW6DSC0JVIkluxEH2W45nPBM/wjHtBXa/tYA== dependencies: minimatch "^3.0.2" +math-random@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" + integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== + md5-hex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-2.0.0.tgz#d0588e9f1c74954492ecd24ac0ac6ce997d92e33" @@ -6411,7 +7109,7 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -memory-streams@^0.1.0: +memory-streams@^0.1.0, memory-streams@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/memory-streams/-/memory-streams-0.1.3.tgz#d9b0017b4b87f1d92f55f2745c9caacb1dc93ceb" integrity sha512-qVQ/CjkMyMInPaaRMrwWNDvf6boRZXaT/DbQeMYcCWuXPEBf1v8qChOc9OlEVQp2uOvRXa1Qu30fLmKhY6NipA== @@ -6459,6 +7157,11 @@ merge-trees@^2.0.0: fs-updater "^1.0.4" heimdalljs "^0.2.5" +merge2@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" + integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== + merge@^1.1.3: version "1.2.0" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" @@ -6469,7 +7172,7 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^2.1.5, micromatch@^2.3.7: +micromatch@^2.3.11: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= @@ -6507,7 +7210,7 @@ micromatch@^3.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -micromatch@^3.1.4: +micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -6526,29 +7229,24 @@ micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -"mime-db@>= 1.30.0 < 2": - version "1.32.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.32.0.tgz#485b3848b01a3cda5f968b4882c0771e58e09414" - integrity sha512-+ZWo/xZN40Tt6S+HyakUxnSOgff+JEdaneLWIm0Z6LmpCn5DMcZntLyUY5c/rTDog28LhXLKOUZKoTxTCAdBVw== +"mime-db@>= 1.36.0 < 2", mime-db@~1.37.0: + version "1.37.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" + integrity sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg== mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" integrity sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE= -mime-db@~1.37.0: - version "1.37.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" - integrity sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg== - -mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7: +mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17: version "2.1.17" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" integrity sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo= dependencies: mime-db "~1.30.0" -mime-types@~2.1.19: +mime-types@^2.1.18, mime-types@~2.1.18, mime-types@~2.1.19: version "2.1.21" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" integrity sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg== @@ -6560,16 +7258,16 @@ mime@1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== -mime@^1.2.11: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + "minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -6592,7 +7290,7 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= -minipass@^2.2.1, minipass@^2.3.4: +minipass@^2.2.0, minipass@^2.2.1, minipass@^2.3.4: version "2.3.5" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== @@ -6615,7 +7313,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: +mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -6627,14 +7325,14 @@ mktemp@~0.4.0: resolved "https://registry.yarnpkg.com/mktemp/-/mktemp-0.4.0.tgz#6d0515611c8a8c84e484aa2000129b98e981ff0b" integrity sha1-bQUVYRyKjITkhKogABKbmOmB/ws= -morgan@^1.8.1: - version "1.9.0" - resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.0.tgz#d01fa6c65859b76fcf31b3cb53a3821a311d8051" - integrity sha1-0B+mxlhZt2/PMbPLU6OCGjEdgFE= +morgan@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59" + integrity sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA== dependencies: basic-auth "~2.0.0" debug "2.6.9" - depd "~1.1.1" + depd "~1.1.2" on-finished "~2.3.0" on-headers "~1.0.1" @@ -6643,16 +7341,6 @@ mout@^1.0.0: resolved "https://registry.yarnpkg.com/mout/-/mout-1.1.0.tgz#0b29d41e6a80fa9e2d4a5be9d602e1d9d02177f6" integrity sha512-XsP0vf4As6BfqglxZqbqQ8SR6KQot2AgxvR0gG+WtUkf90vUXchMOZQtPf/Hml1rEffJupqL/tIrU6EYhsUQjw== -ms@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" - integrity sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg= - -ms@0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" - integrity sha1-riXPJRKziFodldfwN4aNhDESR2U= - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -6663,10 +7351,10 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -mustache@^2.2.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.0.tgz#4028f7778b17708a489930a6e52ac3bca0da41d0" - integrity sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA= +mustache@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.0.1.tgz#873855f23aa8a95b150fb96d9836edbc5a1d248a" + integrity sha512-jFI/4UVRsRYdUbuDTKT7KzfOp7FiD5WzYmmwNwXyUVypC0xjoTL78Fqc0jHUPIvvGD+6DQSPHIt1NE7D1ArsqA== mute-stream@0.0.6: version "0.0.6" @@ -6687,10 +7375,14 @@ najax@^1.0.2: lodash.defaultsdeep "^4.6.0" qs "^6.2.0" -nan@^2.3.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" - integrity sha1-7XFfP+neArV6XmJS2QqWZ14fCFo= +najax@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/najax/-/najax-1.0.4.tgz#63fd8dbf15d18f24dc895b3a16fec66c136b8084" + integrity sha512-wsSacA+RkgY1wxRxXCT3tdqzmamEv9PLeoV/ub9SlLf2RngbPMSqc3A7H35XJDfURC0twMmZsnPdsYPkuuFSVg== + dependencies: + jquery-deferred "^0.3.0" + lodash.defaultsdeep "^4.6.0" + qs "^6.2.0" nan@^2.9.2: version "2.12.1" @@ -6750,6 +7442,11 @@ negotiator@0.6.1: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + no-case@^2.2.0: version "2.3.2" resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" @@ -6757,14 +7454,6 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" -node-fetch@^1.3.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -6775,6 +7464,11 @@ node-modules-path@^1.0.0: resolved "https://registry.yarnpkg.com/node-modules-path/-/node-modules-path-1.0.1.tgz#40096b08ce7ad0ea14680863af449c7c75a5d1c8" integrity sha1-QAlrCM560OoUaAhjr0ScfHWl0cg= +node-modules-path@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/node-modules-path/-/node-modules-path-1.0.2.tgz#e3acede9b7baf4bc336e3496b58e5b40d517056e" + integrity sha512-6Gbjq+d7uhkO7epaKi5DNgUJn7H0gEyA4Jg0Mo1uQOi3Rk50G83LtmhhFyw0LxnAFhtlspkiiw52ISP13qzcBg== + node-notifier@^5.0.1: version "5.2.1" resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" @@ -6801,23 +7495,6 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" -node-pre-gyp@^0.6.39: - version "0.6.39" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" - integrity sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ== - dependencies: - detect-libc "^1.0.2" - hawk "3.1.3" - mkdirp "^0.5.1" - nopt "^4.0.1" - npmlog "^4.0.2" - rc "^1.1.7" - request "2.81.0" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^2.2.1" - tar-pack "^3.4.0" - node-releases@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.3.tgz#aad9ce0dcb98129c753f772c0aa01360fb90fbd2" @@ -6850,31 +7527,40 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: +normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" +normalize-url@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" + integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw== + dependencies: + prepend-http "^2.0.0" + query-string "^5.0.1" + sort-keys "^2.0.0" + npm-bundled@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" integrity sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g== -npm-git-info@^1.0.0: +npm-git-info@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/npm-git-info/-/npm-git-info-1.0.3.tgz#a933c42ec321e80d3646e0d6e844afe94630e1d5" integrity sha1-qTPELsMh6A02RuDW6ESv6UYw4dU= -npm-package-arg@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.0.0.tgz#8cce04b49d3f9faec3f56b0fe5f4391aeb9d2fac" - integrity sha512-hwC7g81KLgRmchv9ol6f3Fx4Yyc9ARX5X5niDHVILgpuvf08JRIgOZcEfpFXli3BgESoTrkauqorXm6UbvSgSg== +npm-package-arg@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.0.tgz#15ae1e2758a5027efb4c250554b85a737db7fcc1" + integrity sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA== dependencies: - hosted-git-info "^2.5.0" - osenv "^0.1.4" - semver "^5.4.1" + hosted-git-info "^2.6.0" + osenv "^0.1.5" + semver "^5.5.0" validate-npm-package-name "^3.0.0" npm-packlist@^1.1.6: @@ -6912,7 +7598,7 @@ nwsapi@^2.0.9: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.9.tgz#77ac0cdfdcad52b6a1151a84e73254edc33ed016" integrity sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ== -oauth-sign@~0.8.1, oauth-sign@~0.8.2: +oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM= @@ -6922,11 +7608,6 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" - integrity sha1-ejs9DpgGPUP0wD8uiubNUahog6A= - object-assign@4.1.1, object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -6951,6 +7632,11 @@ object-hash@^1.3.1: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== +object-keys@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" + integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag== + object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -6958,6 +7644,14 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" @@ -6985,7 +7679,7 @@ on-headers@~1.0.1: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" integrity sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c= -once@^1.3.0, once@^1.3.3: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -7024,20 +7718,17 @@ optionator@^0.8.1, optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" -options@>=0.0.5: - version "0.0.6" - resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" - integrity sha1-7CLTEoBrtT5zF3Pnza788cZDEo8= - -ora@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-1.4.0.tgz#884458215b3a5d4097592285f93321bb7a79e2e5" - integrity sha512-iMK1DOQxzzh2MBlVsU42G80mnrvUhqsMh74phHtDlrcTZPK0pH6o7l7DRshK+0YsxDyEuaOkziVdvM3T0QTzpw== +ora@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-2.1.0.tgz#6caf2830eb924941861ec53a173799e008b51e5b" + integrity sha512-hNNlAd3gfv/iPmsNxYoAPLvxg7HuPozww7fFonMZvL84tP6Ox5igfk5j/+a9rtJJwqMgKK+JgWsAQik5o0HTLA== dependencies: - chalk "^2.1.0" + chalk "^2.3.1" cli-cursor "^2.1.0" - cli-spinners "^1.0.1" - log-symbols "^2.1.0" + cli-spinners "^1.1.0" + log-symbols "^2.2.0" + strip-ansi "^4.0.0" + wcwidth "^1.0.1" os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" @@ -7062,11 +7753,29 @@ osenv@^0.1.3, osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +osenv@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-cancelable@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" + integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ== + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-is-promise@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" + integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4= + p-limit@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" @@ -7074,6 +7783,13 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" +p-limit@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.1.0.tgz#1d5a0d20fb12707c758a655f6bbc4386b5930d68" + integrity sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g== + dependencies: + p-try "^2.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -7081,11 +7797,40 @@ p-locate@^2.0.0: dependencies: p-limit "^1.1.0" +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-timeout@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" + integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA== + dependencies: + p-finally "^1.0.0" + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= +p-try@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" + integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== + +package-json@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" @@ -7103,6 +7848,11 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" +parse-ms@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" + integrity sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0= + parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" @@ -7111,14 +7861,7 @@ parse-passwd@^1.0.0: parse5@5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" - integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== - -parsejson@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab" - integrity sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs= - dependencies: - better-assert "~1.0.0" + integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== parseqs@0.0.5: version "0.0.5" @@ -7151,6 +7894,11 @@ passwd-user@^1.2.1: dependencies: exec-file-sync "^2.0.0" +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" @@ -7173,7 +7921,7 @@ path-is-inside@^1.0.1, path-is-inside@^1.0.2: resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= -path-key@^2.0.0: +path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= @@ -7207,10 +7955,12 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" - integrity sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU= +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" performance-now@^2.1.0: version "2.1.0" @@ -7256,10 +8006,10 @@ pn@^1.1.0: resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== -portfinder@^1.0.7: - version "1.0.13" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" - integrity sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek= +portfinder@^1.0.15: + version "1.0.20" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a" + integrity sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw== dependencies: async "^1.5.2" debug "^2.2.0" @@ -7275,6 +8025,16 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" @@ -7289,10 +8049,17 @@ pretender@2.1.1: fake-xml-http-request "^2.0.0" route-recognizer "^0.3.3" -printf@^0.2.3: - version "0.2.5" - resolved "https://registry.yarnpkg.com/printf/-/printf-0.2.5.tgz#c438ca2ca33e3927671db4ab69c0e52f936a4f0f" - integrity sha1-xDjKLKM+OSdnHbSracDlL5NqTw8= +pretty-ms@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-3.2.0.tgz#87a8feaf27fc18414d75441467d411d6e6098a25" + integrity sha512-ZypexbfVUGTFxb0v+m1bUyy92DHe5SyYlnyY0msyms5zd3RwyvNgyxZZsXXgoyzlxjx5MiqtXUdhUfvQbe0A2Q== + dependencies: + parse-ms "^1.0.0" + +printf@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/printf/-/printf-0.5.1.tgz#e0466788260859ed153006dc6867f09ddf240cf3" + integrity sha512-UaE/jO0hNsrvPGQEb4LyNzcrJv9Z00tsreBduOSxMtrebvoUhxiEJ4YCHX8YHf6akwfKsC2Gyv5zv47UXhMiLg== private@^0.1.6, private@^0.1.7, private@~0.1.5: version "0.1.8" @@ -7304,6 +8071,11 @@ process-nextick-args@~1.0.6: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + process-relative-require@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/process-relative-require/-/process-relative-require-1.0.0.tgz#1590dfcf5b8f2983ba53e398446b68240b4cc68a" @@ -7316,7 +8088,7 @@ progress@^2.0.0: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" integrity sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8= -promise-map-series@^0.2.1: +promise-map-series@^0.2.1, promise-map-series@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/promise-map-series/-/promise-map-series-0.2.3.tgz#c2d377afc93253f6bd03dbb77755eb88ab20a847" integrity sha1-wtN3r8kyU/a9A9u3d1XriKsgqEc= @@ -7331,6 +8103,14 @@ proxy-addr@~2.0.2: forwarded "~0.1.2" ipaddr.js "1.5.2" +proxy-addr@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" + integrity sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.8.0" + pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -7346,6 +8126,14 @@ psl@^1.1.28: resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" @@ -7361,15 +8149,19 @@ qs@6.5.1, qs@^6.4.0, qs@~6.5.1: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" integrity sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A== -qs@^6.2.0, qs@~6.5.2: +qs@6.5.2, qs@^6.2.0, qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - integrity sha1-E+JtKK1rD/qpExLNO/cI7TUecjM= +query-string@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== + dependencies: + decode-uri-component "^0.2.0" + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" quick-temp@^0.1.0, quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quick-temp@^0.1.8: version "0.1.8" @@ -7401,13 +8193,14 @@ qunit@~2.6.0: sane "^2.5.2" walk-sync "0.3.2" -randomatic@^1.1.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" - integrity sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how== +randomatic@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" range-parser@~1.2.0: version "1.2.0" @@ -7424,6 +8217,16 @@ raw-body@2.3.2: iconv-lite "0.4.19" unpipe "1.0.0" +raw-body@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" + integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== + dependencies: + bytes "3.0.0" + http-errors "1.6.3" + iconv-lite "0.4.23" + unpipe "1.0.0" + raw-body@~1.1.0: version "1.1.7" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.1.7.tgz#1d027c2bfa116acc6623bca8f00016572a87d425" @@ -7432,17 +8235,7 @@ raw-body@~1.1.0: bytes "1" string_decoder "0.10" -rc@^1.1.7: - version "1.2.5" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd" - integrity sha1-J1zWh/bjs2zHVrqibf7oCnkDAf0= - dependencies: - deep-extend "~0.4.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -rc@^1.2.7: +rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -7469,7 +8262,20 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -readable-stream@^2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2: +readable-stream@^2.0.0: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^2.0.6, readable-stream@^2.2.2: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" integrity sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ== @@ -7549,6 +8355,11 @@ regenerator-runtime@^0.12.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== +regenerator-runtime@^0.9.5: + version "0.9.6" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz#d33eb95d0d2001a4be39659707c51b0cb71ce029" + integrity sha1-0z65XQ0gAaS+OWWXB8UbDLcc4Ck= + regenerator-transform@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" @@ -7587,6 +8398,11 @@ regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" @@ -7608,6 +8424,21 @@ regexpu-core@^4.1.3, regexpu-core@^4.2.0: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.0.2" +registry-auth-token@^3.0.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" + integrity sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ== + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= + dependencies: + rc "^1.0.1" + regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" @@ -7632,6 +8463,14 @@ regjsparser@^0.6.0: dependencies: jsesc "~0.5.0" +remote-git-tags@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/remote-git-tags/-/remote-git-tags-2.0.0.tgz#1152f39cf8b5268ae0e4307636ef741ec341664c" + integrity sha1-EVLznPi1Jorg5DB2Nu90HsNBZkw= + dependencies: + git-fetch-pack "^0.1.1" + git-transport-protocol "^0.1.0" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -7670,34 +8509,6 @@ request-promise-native@^1.0.5: stealthy-require "^1.1.0" tough-cookie ">=2.3.3" -request@2.81.0: - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" - integrity sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA= - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "^0.6.0" - uuid "^3.0.0" - request@^2.81.0: version "2.87.0" resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" @@ -7750,12 +8561,10 @@ request@^2.88.0: tunnel-agent "^0.6.0" uuid "^3.3.2" -require-folder-tree@^1.4.5: - version "1.4.5" - resolved "https://registry.yarnpkg.com/require-folder-tree/-/require-folder-tree-1.4.5.tgz#dfe553cbab98cc88e1c56a3f2f358f06ef85bcb0" - integrity sha1-3+VTy6uYzIjhxWo/LzWPBu+FvLA= - dependencies: - lodash "3.8.0" +require-relative@^0.8.7: + version "0.8.7" + resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" + integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4= require-uncached@^1.0.3: version "1.0.3" @@ -7770,7 +8579,7 @@ requireindex@~1.1.0: resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162" integrity sha1-5UBLgVV+91225JxacgBIk/4D4WI= -requires-port@1.x.x: +requires-port@1.x.x, requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= @@ -7780,14 +8589,6 @@ reselect@^3.0.1: resolved "https://registry.yarnpkg.com/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147" integrity sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc= -resolve-dir@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" - integrity sha1-shklmlYC+sXFxJatiUpujMQwJh4= - dependencies: - expand-tilde "^1.2.2" - global-modules "^0.2.3" - resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" @@ -7806,13 +8607,20 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.5.0, resolve@^1.1.6, resolve@^1.3.0, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0: +resolve@1.5.0, resolve@^1.1.6, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" integrity sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw== dependencies: path-parse "^1.0.5" +resolve@^1.1.3, resolve@^1.3.2, resolve@^1.6.0, resolve@^1.7.1, resolve@^1.8.1: + version "1.9.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.9.0.tgz#a14c6fdfa8f92a7df1d996cb7105fa744658ea06" + integrity sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ== + dependencies: + path-parse "^1.0.6" + resolve@^1.1.7: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" @@ -7820,12 +8628,12 @@ resolve@^1.1.7: dependencies: path-parse "^1.0.5" -resolve@^1.3.2, resolve@^1.8.1: - version "1.9.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.9.0.tgz#a14c6fdfa8f92a7df1d996cb7105fa744658ea06" - integrity sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ== +responselike@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= dependencies: - path-parse "^1.0.6" + lowercase-keys "^1.0.0" restore-cursor@^1.0.1: version "1.0.1" @@ -7855,7 +8663,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.3.2, rimraf@^2.4.4, rimraf@^2.5.1, rimraf@^2.5.3, rimraf@^2.6.1: +rimraf@^2.2.8, rimraf@^2.3.2, rimraf@^2.4.4, rimraf@^2.5.3, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== @@ -7874,6 +8682,31 @@ rimraf@~2.2.6: resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= +rollup-pluginutils@^2.0.1: + version "2.3.3" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.3.3.tgz#3aad9b1eb3e7fe8262820818840bf091e5ae6794" + integrity sha512-2XZwja7b6P5q4RZ5FhyX1+f46xi1Z3qBKigLRZ6VTZjwbN0K1IFGMlwm06Uu0Emcre2Z63l77nq/pzn+KxIEoA== + dependencies: + estree-walker "^0.5.2" + micromatch "^2.3.11" + +rollup@^0.57.1: + version "0.57.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.57.1.tgz#0bb28be6151d253f67cf4a00fea48fb823c74027" + integrity sha512-I18GBqP0qJoJC1K1osYjreqA8VAKovxuI3I81RSk0Dmr4TgloI0tAULjZaox8OsJ+n7XRrhH6i0G2By/pj1LCA== + dependencies: + "@types/acorn" "^4.0.3" + acorn "^5.5.3" + acorn-dynamic-import "^3.0.0" + date-time "^2.1.0" + is-reference "^1.1.0" + locate-character "^2.0.5" + pretty-ms "^3.1.0" + require-relative "^0.8.7" + rollup-pluginutils "^2.0.1" + signal-exit "^3.0.2" + sourcemap-codec "^1.4.1" + route-recognizer@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.3.tgz#1d365e27fa6995e091675f7dc940a8c00353bd29" @@ -7884,7 +8717,7 @@ route-recognizer@^0.3.4: resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.4.tgz#39ab1ffbce1c59e6d2bdca416f0932611e4f3ca3" integrity sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g== -rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.2.1, rsvp@^3.3.3, rsvp@^3.5.0: +rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.3.3, rsvp@^3.5.0: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== @@ -7894,16 +8727,16 @@ rsvp@^4.6.1, rsvp@^4.7.0: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.1.tgz#168addb3963222de37ee351b70e3876bdb2ac285" integrity sha512-c9tShmZbQ5nLVVVl3Fuhk1NExJlXfAMIEz7a8GC570X8XhNQNZPFAdjOeMmJEN3SLYOOb2OprS576P/QO4QouA== +rsvp@^4.8.1, rsvp@^4.8.3, rsvp@^4.8.4: + version "4.8.4" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911" + integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA== + rsvp@^4.8.2: version "4.8.3" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.3.tgz#25d4b9fdd0f95e216eb5884d9b3767d3fbfbe2cd" integrity sha512-/OlbK31XtkPnLD2ktmZXj4g/v6q1boTDr6/3lFuDTgxVsrA3h7PH5eYyAxIvDMjRHr/DoOlzNicqDwBEo9xU7g== -rsvp@^4.8.3, rsvp@^4.8.4: - version "4.8.4" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911" - integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA== - rsvp@~3.0.6: version "3.0.21" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.0.21.tgz#49c588fe18ef293bcd0ab9f4e6756e6ac433359f" @@ -7943,7 +8776,7 @@ safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, s resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== -safe-buffer@^5.1.2: +safe-buffer@5.1.2, safe-buffer@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -7965,42 +8798,31 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sane@^1.1.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-1.7.0.tgz#b3579bccb45c94cf20355cc81124990dfd346e30" - integrity sha1-s1ebzLRclM8gNVzIESSZDf00bjA= - dependencies: - anymatch "^1.3.0" - exec-sh "^0.2.0" - fb-watchman "^2.0.0" - minimatch "^3.0.2" - minimist "^1.1.1" - walker "~1.0.5" - watch "~0.10.0" - -sane@^2.2.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/sane/-/sane-2.4.1.tgz#29f991208cf28636720efdc584293e7fd66663a5" - integrity sha512-fW9svvNd81XzHDZyis9/tEY1bZikDGryy8Hi1BErPyNPYv47CdLseUN+tI5FBHWXEENRtj1SWtX/jBnggLaP0w== +sane@^2.4.1, sane@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" + integrity sha1-tNwYYcIbQn6SlQej51HiosuKs/o= dependencies: - anymatch "^1.3.0" + anymatch "^2.0.0" + capture-exit "^1.2.0" exec-sh "^0.2.0" fb-watchman "^2.0.0" - minimatch "^3.0.2" + micromatch "^3.1.4" minimist "^1.1.1" walker "~1.0.5" watch "~0.18.0" optionalDependencies: - fsevents "^1.1.1" + fsevents "^1.2.3" -sane@^2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" - integrity sha1-tNwYYcIbQn6SlQej51HiosuKs/o= +sane@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-3.1.0.tgz#995193b7dc1445ef1fe41ddfca2faf9f111854c6" + integrity sha512-G5GClRRxT1cELXfdAq7UKtUsv8q/ZC5k8lQGmjEm4HcAl3HzBy68iglyNCmw4+0tiXPCBZntslHlRhbnsSws+Q== dependencies: anymatch "^2.0.0" capture-exit "^1.2.0" exec-sh "^0.2.0" + execa "^1.0.0" fb-watchman "^2.0.0" micromatch "^3.1.4" minimist "^1.1.1" @@ -8021,7 +8843,7 @@ saxes@^3.1.4: dependencies: xmlchars "^1.3.1" -"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.1.1, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: +"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== @@ -8045,6 +8867,25 @@ send@0.16.1: range-parser "~1.2.0" statuses "~1.3.1" +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + serve-static@1.13.1: version "1.13.1" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" @@ -8055,6 +8896,16 @@ serve-static@1.13.1: parseurl "~1.3.2" send "0.16.1" +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -8131,6 +8982,11 @@ simple-dom@^1.0.0: resolved "https://registry.yarnpkg.com/simple-dom/-/simple-dom-1.3.0.tgz#8473e0d34e340544b061410dba3faf4f1b7aa282" integrity sha512-RVjr6e80FFGDqDJZeQd4EMwoDLatn4Jy2SfuXecrP1IgG4ZAqkGSokE8LNV5i0kzWR2IM0e257xGN9JS8lxm0Q== +simple-html-tokenizer@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.7.tgz#8eca336ecfbe2b3c6166cbb31b2682088de79f40" + integrity sha512-APW9iYbkJ5cijjX4Ljhf3VG8SwYPUJT5gZrwci/wieMabQxWFiV5VwsrP5c6GMRvXKEQMGkAB1d9dvW66dTqpg== + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" @@ -8180,72 +9036,71 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^2.0.0" -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - integrity sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg= - dependencies: - hoek "2.x.x" - -socket.io-adapter@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" - integrity sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s= - dependencies: - debug "2.3.3" - socket.io-parser "2.3.1" +socket.io-adapter@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" + integrity sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs= -socket.io-client@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.6.0.tgz#5b668f4f771304dfeed179064708386fa6717853" - integrity sha1-W2aPT3cTBN/u0XkGRwg4b6ZxeFM= +socket.io-client@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.2.0.tgz#84e73ee3c43d5020ccc1a258faeeb9aec2723af7" + integrity sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA== dependencies: backo2 "1.0.2" + base64-arraybuffer "0.1.5" component-bind "1.0.0" component-emitter "1.2.1" - debug "2.3.3" - engine.io-client "1.8.0" - has-binary "0.1.7" + debug "~3.1.0" + engine.io-client "~3.3.1" + has-binary2 "~1.0.2" + has-cors "1.1.0" indexof "0.0.1" object-component "0.0.3" + parseqs "0.0.5" parseuri "0.0.5" - socket.io-parser "2.3.1" + socket.io-parser "~3.3.0" to-array "0.1.4" -socket.io-parser@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0" - integrity sha1-3VMgJRA85Clpcya+/WQAX8/ltKA= +socket.io-parser@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.0.tgz#2b52a96a509fdf31440ba40fed6094c7d4f1262f" + integrity sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng== dependencies: - component-emitter "1.1.2" - debug "2.2.0" - isarray "0.0.1" - json3 "3.3.2" + component-emitter "1.2.1" + debug "~3.1.0" + isarray "2.0.1" -socket.io@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.6.0.tgz#3e40d932637e6bd923981b25caf7c53e83b6e2e1" - integrity sha1-PkDZMmN+a9kjmBslyvfFPoO24uE= - dependencies: - debug "2.3.3" - engine.io "1.8.0" - has-binary "0.1.7" - object-assign "4.1.0" - socket.io-adapter "0.5.0" - socket.io-client "1.6.0" - socket.io-parser "2.3.1" - -sort-object-keys@^1.1.1: +socket.io@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.2.0.tgz#f0f633161ef6712c972b307598ecd08c9b1b4d5b" + integrity sha512-wxXrIuZ8AILcn+f1B4ez4hJTPG24iNgxBBDaJfT6MsyOhVYiTXWexGoPkd87ktJG8kQEcL/NBvRi64+9k4Kc0w== + dependencies: + debug "~4.1.0" + engine.io "~3.3.1" + has-binary2 "~1.0.2" + socket.io-adapter "~1.1.0" + socket.io-client "2.2.0" + socket.io-parser "~3.3.0" + +sort-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" + integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= + dependencies: + is-plain-obj "^1.0.0" + +sort-object-keys@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.2.tgz#d3a6c48dc2ac97e6bc94367696e03f6d09d37952" integrity sha1-06bEjcKsl+a8lDZ2luA/bQnTeVI= -sort-package-json@^1.4.0: - version "1.7.1" - resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.7.1.tgz#f2e5fbffe8420cc1bb04485f4509f05e73b4c0f2" - integrity sha1-8uX7/+hCDMG7BEhfRQnwXnO0wPI= +sort-package-json@^1.15.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.17.1.tgz#ab8d7ba8c8e2bbe1805e0650829256f64191c203" + integrity sha512-IxcHMpJF2ksT2cTtY3scXErmxbpp79bA7nlToENHCn0ZhoX7fMJk97z9sHDyubRoKzbwzq4r6TZz9DHL5V0LXA== dependencies: - sort-object-keys "^1.1.1" + detect-indent "^5.0.0" + sort-object-keys "^1.1.2" source-map-resolve@^0.5.0: version "0.5.1" @@ -8303,7 +9158,7 @@ source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, sour resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.0, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -8315,6 +9170,11 @@ source-map@~0.1.x: dependencies: amdefine ">=0.0.4" +sourcemap-codec@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz#c63ea927c029dd6bd9a2b7fa03b3fec02ad56e9f" + integrity sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg== + sourcemap-validator@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/sourcemap-validator/-/sourcemap-validator-1.0.6.tgz#abd2f1ecdae6a3c46c2c96c5f256705b2147c9c0" @@ -8325,6 +9185,16 @@ sourcemap-validator@^1.0.5: lodash.template "~2.3.x" source-map "~0.1.x" +sourcemap-validator@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/sourcemap-validator/-/sourcemap-validator-1.1.0.tgz#00454547d1682186e1498a7208e022e8dfa8738f" + integrity sha512-Hmdu39KL+EoAAZ69OTk7RXXJdPRRizJvOZOWhCW9jLGfEQflCNPTlSoCXFPdKWFwwf0uzLcGR/fc7EP/PT8vRQ== + dependencies: + jsesc "~0.3.x" + lodash.foreach "~2.3.x" + lodash.template "~2.3.x" + source-map "~0.1.x" + spawn-args@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/spawn-args/-/spawn-args-0.2.0.tgz#fb7d0bd1d70fd4316bd9e3dec389e65f9d6361bb" @@ -8400,11 +9270,16 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.3.1 < 2": +"statuses@>= 1.3.1 < 2", statuses@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + statuses@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" @@ -8415,6 +9290,11 @@ stealthy-require@^1.1.0: resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + string-template@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" @@ -8449,10 +9329,12 @@ string_decoder@~1.0.3: dependencies: safe-buffer "~5.1.0" -stringstream@~0.0.4: - version "0.0.5" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" - integrity sha1-TkhM1N5aC7vuGORjB3EKioFiGHg= +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" strip-ansi@^0.3.0: version "0.3.0" @@ -8574,38 +9456,14 @@ table@^4.0.1: slice-ansi "1.0.0" string-width "^2.1.1" -tap-parser@^5.1.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-5.4.0.tgz#6907e89725d7b7fa6ae41ee2c464c3db43188aec" - integrity sha512-BIsIaGqv7uTQgTW1KLTMNPSEQf4zDDPgYOBRdgOfuB+JFOLRBfEu6cLa/KvMvmqggu1FKXDfitjLwsq4827RvA== +tap-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-7.0.0.tgz#54db35302fda2c2ccc21954ad3be22b2cba42721" + integrity sha512-05G8/LrzqOOFvZhhAk32wsGiPZ1lfUrl+iV7+OkKgfofZxiceZWMHkKmow71YsyVQ8IvGBP2EjcIjE5gL4l5lA== dependencies: events-to-array "^1.0.1" js-yaml "^3.2.7" - optionalDependencies: - readable-stream "^2" - -tar-pack@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" - integrity sha512-PPRybI9+jM5tjtCbN2cxmmRU7YmqT3Zv/UDy48tAh2XRkLa9bAORtSWLkVc13+GJF+cdTh1yEnHEk3cpTaL5Kg== - dependencies: - debug "^2.2.0" - fstream "^1.0.10" - fstream-ignore "^1.0.5" - once "^1.3.3" - readable-stream "^2.1.4" - rimraf "^2.5.1" - tar "^2.2.1" - uid-number "^0.0.6" - -tar@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" - integrity sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE= - dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" + minipass "^2.2.0" tar@^4: version "4.4.8" @@ -8637,17 +9495,17 @@ terser@^3.7.5: source-map "~0.6.1" source-map-support "~0.5.6" -testem@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/testem/-/testem-2.0.0.tgz#b05c96200c7ac98bae998d71c94c0c5345907d13" - integrity sha1-sFyWIAx6yYuumY1xyUwMU0WQfRM= +testem@^2.9.2: + version "2.14.0" + resolved "https://registry.yarnpkg.com/testem/-/testem-2.14.0.tgz#418a9a15843f68381659c6a486abb4ea48d06c29" + integrity sha512-tldpNPCzXfibmxOoTMGOfr8ztUiHf9292zSXCu7SitBx9dCK83k7vEoa77qJBS9t3RGCQCRF+GNMUuiFw//Mbw== dependencies: backbone "^1.1.2" bluebird "^3.4.6" charm "^1.0.0" commander "^2.6.0" - consolidate "^0.14.0" - execa "^0.9.0" + consolidate "^0.15.1" + execa "^1.0.0" express "^4.10.7" fireworm "^0.7.0" glob "^7.0.4" @@ -8659,15 +9517,16 @@ testem@^2.0.0: lodash.find "^4.5.1" lodash.uniqby "^4.7.0" mkdirp "^0.5.1" - mustache "^2.2.1" + mustache "^3.0.0" node-notifier "^5.0.1" npmlog "^4.0.0" - printf "^0.2.3" + printf "^0.5.1" rimraf "^2.4.4" - socket.io "1.6.0" + socket.io "^2.1.0" spawn-args "^0.2.0" styled_string "0.0.1" - tap-parser "^5.1.0" + tap-parser "^7.0.0" + tmp "0.0.33" xmldom "^0.1.19" text-table@~0.2.0: @@ -8685,13 +9544,28 @@ through@^2.3.6, through@^2.3.8: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -tiny-lr@^1.0.3: - version "1.1.0" - resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.1.0.tgz#a373bce2a4b58cef9a64433360ba593155f4cd45" - integrity sha512-f4X68a6KHcCx/XJcZUKAa92APjY9EHxuGOzRFmPRjf+fOp1E7fi4dGJaHMxvRBxwZrHrIvn/AwkFaDS7O1WZDQ== +through@~2.2.0, through@~2.2.7: + version "2.2.7" + resolved "https://registry.yarnpkg.com/through/-/through-2.2.7.tgz#6e8e21200191d4eb6a99f6f010df46aa1c6eb2bd" + integrity sha1-bo4hIAGR1OtqmfbwEN9Gqhxusr0= + +time-zone@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d" + integrity sha1-mcW/VZWJZq9tBtg73zgA3IL67F0= + +timed-out@^4.0.0, timed-out@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + +tiny-lr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.1.1.tgz#9fa547412f238fedb068ee295af8b682c98b2aab" + integrity sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA== dependencies: body "^5.1.0" - debug "~2.6.7" + debug "^3.1.0" faye-websocket "~0.10.0" livereload-js "^2.3.0" object-assign "^4.1.0" @@ -8704,6 +9578,13 @@ tmp@0.0.28: dependencies: os-tmpdir "~1.0.1" +tmp@0.0.33, tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + tmp@^0.0.29: version "0.0.29" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" @@ -8711,13 +9592,6 @@ tmp@^0.0.29: dependencies: os-tmpdir "~1.0.1" -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" @@ -8772,6 +9646,11 @@ to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" +to-utf8@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/to-utf8/-/to-utf8-0.0.1.tgz#d17aea72ff2fba39b9e43601be7b3ff72e089852" + integrity sha1-0Xrqcv8vujm55DYBvns/9y4ImFI= + tough-cookie@>=2.3.3, tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" @@ -8788,7 +9667,7 @@ tough-cookie@^2.5.0: psl "^1.1.28" punycode "^2.1.1" -tough-cookie@~2.3.0, tough-cookie@~2.3.3: +tough-cookie@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" integrity sha1-C2GKVWW23qkL80JdBNVe3EdadWE= @@ -8802,7 +9681,7 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" -tree-sync@^1.2.1, tree-sync@^1.2.2: +tree-sync@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-sync/-/tree-sync-1.2.2.tgz#2cf76b8589f59ffedb58db5a3ac7cb013d0158b7" integrity sha1-LPdrhYn1n/7bWNtaOsfLAT0BWLc= @@ -8850,12 +9729,20 @@ type-is@~1.6.15: media-typer "0.3.0" mime-types "~2.1.15" +type-is@~1.6.16: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.18" + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -uc.micro@^1.0.1, uc.micro@^1.0.3: +uc.micro@^1.0.1, uc.micro@^1.0.3, uc.micro@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376" integrity sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg== @@ -8870,21 +9757,19 @@ uglify-js@^2.6: optionalDependencies: uglify-to-browserify "~1.0.0" +uglify-js@^3.1.4: + version "3.4.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" + integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q== + dependencies: + commander "~2.17.1" + source-map "~0.6.1" + 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" integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= -uid-number@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= - -ultron@1.0.x: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" - integrity sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po= - underscore.string@~3.3.4: version "3.3.5" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023" @@ -8963,6 +9848,11 @@ untildify@^2.1.0: dependencies: os-homedir "^1.0.0" +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= + uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" @@ -8975,6 +9865,25 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + dependencies: + prepend-http "^1.0.1" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + dependencies: + prepend-http "^2.0.0" + +url-to-options@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" + integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= + use@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8" @@ -9010,12 +9919,20 @@ util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +util.promisify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.0.0, uuid@^3.1.0: +uuid@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA== @@ -9101,10 +10018,16 @@ walker@~1.0.5: dependencies: makeerror "1.0.x" -watch@~0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" - integrity sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw= +watch-detector@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/watch-detector/-/watch-detector-0.1.0.tgz#e37b410d149e2a8bf263a4f8b71e2f667633dbf8" + integrity sha512-vfzMMfpjQc88xjETwl2HuE6PjEuxCBeyC4bQmqrHrofdfYWi/4mEJklYbNgSzpqM9PxubsiPIrE5SZ1FDyiQ2w== + dependencies: + heimdalljs-logger "^0.1.9" + quick-temp "^0.1.8" + rsvp "^4.7.0" + semver "^5.4.1" + silent-error "^1.1.0" watch@~0.18.0: version "0.18.0" @@ -9114,6 +10037,13 @@ watch@~0.18.0: exec-sh "^0.2.0" minimist "^1.2.0" +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -9160,7 +10090,7 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" -which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0: +which@^1.2.14, which@^1.2.9, which@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" integrity sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg== @@ -9229,26 +10159,13 @@ write@^0.2.1: dependencies: mkdirp "^0.5.1" -ws@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018" - integrity sha1-CC3bbGQehdS7RR8D1S8G6r2x8Bg= - dependencies: - options ">=0.0.5" - ultron "1.0.x" - -ws@^6.1.2: +ws@^6.1.2, ws@~6.1.0: version "6.1.2" resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.2.tgz#3cc7462e98792f0ac679424148903ded3b9c3ad8" integrity sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw== dependencies: async-limiter "~1.0.0" -wtf-8@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" - integrity sha1-OS2LotDxw00e4tYw8V0O+2jhBIo= - xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" @@ -9269,10 +10186,10 @@ xmldom@^0.1.19: resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= -xmlhttprequest-ssl@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" - integrity sha1-GFqIjATspGw+QHDZn3tJ3jUomS0= +xmlhttprequest-ssl@~1.5.4: + version "1.5.5" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" + integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= xtend@^4.0.0, xtend@~4.0.0: version "4.0.1" @@ -9289,13 +10206,13 @@ yallist@^3.0.0, yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== -yam@0.0.22: - version "0.0.22" - resolved "https://registry.yarnpkg.com/yam/-/yam-0.0.22.tgz#38a76cb79a19284d9206ed49031e359a1340bd06" - integrity sha1-OKdst5oZKE2SBu1JAx41mhNAvQY= +yam@^0.0.24: + version "0.0.24" + resolved "https://registry.yarnpkg.com/yam/-/yam-0.0.24.tgz#11e9630444735f66a561d29221407de6d037cd95" + integrity sha512-llPF60oFLV8EQimNPR6+KorSaj59L32C4c1db4cr72GaWVWapnhTS2VZeK2K2xLyEOveWtRcNa+dLJBW7EfhYQ== dependencies: - fs-extra "^0.30.0" - lodash.merge "^4.4.0" + fs-extra "^4.0.2" + lodash.merge "^4.6.0" yargs@~3.10.0: version "3.10.0" From 38ea1174b97bc2c788806b4ddb64a69ad380c761 Mon Sep 17 00:00:00 2001 From: Dan Freeman Date: Wed, 16 Jan 2019 22:42:25 -0500 Subject: [PATCH 277/879] Allow native async functions as route handlers --- addon/route-handler.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addon/route-handler.js b/addon/route-handler.js index d5a8709c3..1ccb6ab1c 100644 --- a/addon/route-handler.js +++ b/addon/route-handler.js @@ -16,11 +16,11 @@ const DEFAULT_CODES = { get: 200, put: 204, post: 201, 'delete': 204 }; function createHandler({ verb, schema, serializerOrRegistry, path, rawHandler, options }) { let handler; let args = [schema, serializerOrRegistry, rawHandler, path, options]; - let type = typeOf(rawHandler); + let type = typeof rawHandler; if (type === 'function') { handler = new FunctionHandler(...args); - } else if (type === 'object') { + } else if (type === 'object' && rawHandler) { handler = new ObjectHandler(...args); } else if (verb === 'get') { handler = new GetShorthandHandler(...args); From 5576813d3eb2109e36e191c6bf8941d1d1d69669 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 19 Jan 2019 18:04:08 -0500 Subject: [PATCH 278/879] Docs site is hosted at the root --- config/addon-docs.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/addon-docs.js b/config/addon-docs.js index 3f3b4a13f..63e20bbbb 100644 --- a/config/addon-docs.js +++ b/config/addon-docs.js @@ -8,5 +8,8 @@ module.exports = class extends AddonDocsConfig { // for details on configuration you can override here. // brand: 'blue' + getRootURL() { + return ''; + } }; From f8d1165ac4a1336ef8bd1f1095d3a5555452b5e9 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 19 Jan 2019 18:24:20 -0500 Subject: [PATCH 279/879] Try new rootUrl --- config/addon-docs.js | 2 +- tests/dummy/public/CNAME | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 tests/dummy/public/CNAME diff --git a/config/addon-docs.js b/config/addon-docs.js index 63e20bbbb..de3cacad6 100644 --- a/config/addon-docs.js +++ b/config/addon-docs.js @@ -9,7 +9,7 @@ module.exports = class extends AddonDocsConfig { // brand: 'blue' getRootURL() { - return ''; + return '/'; } }; diff --git a/tests/dummy/public/CNAME b/tests/dummy/public/CNAME new file mode 100644 index 000000000..3b03bb29c --- /dev/null +++ b/tests/dummy/public/CNAME @@ -0,0 +1 @@ +www.ember-cli-mirage.com From 3c6fd35d645c7b0b1914f314515bbf38d16a9780 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 19 Jan 2019 20:01:23 -0500 Subject: [PATCH 280/879] Empty rootUrl --- config/addon-docs.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config/addon-docs.js b/config/addon-docs.js index de3cacad6..1e05adf7e 100644 --- a/config/addon-docs.js +++ b/config/addon-docs.js @@ -7,9 +7,8 @@ module.exports = class extends AddonDocsConfig { // See https://ember-learn.github.io/ember-cli-addon-docs/docs/deploying // for details on configuration you can override here. - // brand: 'blue' getRootURL() { - return '/'; + return ''; } }; From c2cbef012fcf7f3cfa9719e3537c1dc0e2068b67 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 19 Jan 2019 20:41:15 -0500 Subject: [PATCH 281/879] Add redirects to old docs sites --- tests/dummy/app/pods/application/route.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 tests/dummy/app/pods/application/route.js diff --git a/tests/dummy/app/pods/application/route.js b/tests/dummy/app/pods/application/route.js new file mode 100644 index 000000000..17bd10a4e --- /dev/null +++ b/tests/dummy/app/pods/application/route.js @@ -0,0 +1,22 @@ +import Route from '@ember/routing/route'; + +export default Route.extend({ + + beforeModel() { + let pathname = window.location.pathname; + [ + "v0.0.27", + "v0.0.28", + "v0.0.29", + "v0.1.x", + "v0.2.x", + "v0.3.x", + "v0.4.x" + ].forEach(version => { + if (pathname.match(`/docs/${version}`)) { + window.location = pathname.replace(`/docs/${version}`, `/versions/${version}`); + } + }); + } + +}); From 8a327bc813dd8260b7c9db80c61edee44ea1c9e3 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 19 Jan 2019 20:55:02 -0500 Subject: [PATCH 282/879] Try different redirect logic --- tests/dummy/app/pods/application/route.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/dummy/app/pods/application/route.js b/tests/dummy/app/pods/application/route.js index 17bd10a4e..75a055220 100644 --- a/tests/dummy/app/pods/application/route.js +++ b/tests/dummy/app/pods/application/route.js @@ -13,6 +13,8 @@ export default Route.extend({ "v0.3.x", "v0.4.x" ].forEach(version => { + console.log(version); + console.log(pathname); if (pathname.match(`/docs/${version}`)) { window.location = pathname.replace(`/docs/${version}`, `/versions/${version}`); } From 743d67f8e7faa59232ea70196bde6d7b2706b83d Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 19 Jan 2019 20:57:25 -0500 Subject: [PATCH 283/879] Remove logs --- tests/dummy/app/pods/application/route.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/dummy/app/pods/application/route.js b/tests/dummy/app/pods/application/route.js index 75a055220..17bd10a4e 100644 --- a/tests/dummy/app/pods/application/route.js +++ b/tests/dummy/app/pods/application/route.js @@ -13,8 +13,6 @@ export default Route.extend({ "v0.3.x", "v0.4.x" ].forEach(version => { - console.log(version); - console.log(pathname); if (pathname.match(`/docs/${version}`)) { window.location = pathname.replace(`/docs/${version}`, `/versions/${version}`); } From e053bdd35cba9ffc15d0f097ec9eae91569ffcf5 Mon Sep 17 00:00:00 2001 From: Carl Bennett Date: Mon, 21 Jan 2019 11:47:04 +1300 Subject: [PATCH 284/879] Set the dummy app's to 'EmberCLI Mirage' Now that the dummy app is being used as the actual website (!!!) I think it deserves a proper title. --- tests/dummy/app/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dummy/app/index.html b/tests/dummy/app/index.html index 00c5a7d61..c76347a77 100644 --- a/tests/dummy/app/index.html +++ b/tests/dummy/app/index.html @@ -3,7 +3,7 @@ <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <title>Dummy + EmberCLI Mirage From 0574fc14029d75ddf0ef8eaf9978e1df35b50d7b Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sun, 20 Jan 2019 19:42:47 -0500 Subject: [PATCH 285/879] Add simple homepage copy --- tests/dummy/app/pods/index/template.hbs | 29 +++++++++++++++++++++++++ tests/dummy/app/styles/app.css | 21 ++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/tests/dummy/app/pods/index/template.hbs b/tests/dummy/app/pods/index/template.hbs index 446b711e6..f655b7f32 100644 --- a/tests/dummy/app/pods/index/template.hbs +++ b/tests/dummy/app/pods/index/template.hbs @@ -1 +1,30 @@ {{docs-hero}} + +
    +
    +

    Productive

    +

    + Spend less time wiring up HTTP stubs, and get back to developing your app. +

    +
    + +
    +

    Test-worthy

    +

    + Use factories to define your server's state per test. Acceptance testing just got a whole lot easier. +

    +
    + +
    +

    Shareable

    +

    + Share a functional prototype of your app that runs entirely in the client – before writing a single line of your API. +

    +
    + +
    + {{#link-to 'docs' class="home__cta-link"}} + Read the docs + {{/link-to}} +
    +
    diff --git a/tests/dummy/app/styles/app.css b/tests/dummy/app/styles/app.css index 40466ec3e..0277dca96 100644 --- a/tests/dummy/app/styles/app.css +++ b/tests/dummy/app/styles/app.css @@ -1,3 +1,24 @@ +.home { + padding-left: 1rem; + padding-right: 1rem; + max-width: 600px; + margin: 4rem auto; +} +.home__section { + margin-bottom: 2.5rem; +} +.home__lead { + margin-top: 0.5rem; + font-size: 18px; + line-height: 1.5; +} +.home__cta { + padding: 3rem 0; +} +.home__cta-link { + color: #22292f; +} + .blog { width: 100%; margin-top: 3rem; From 603ca7fb879f7044f34750a38428ec5e3977e8bd Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 21 Jan 2019 22:08:16 -0500 Subject: [PATCH 286/879] Update ember-cli-addon-docs --- package.json | 2 +- tests/dummy/app/pods/index/template.hbs | 2 +- tests/dummy/app/styles/app.css | 4 + yarn.lock | 298 +++++++++++++++++------- 4 files changed, 219 insertions(+), 87 deletions(-) diff --git a/package.json b/package.json index e4deb320d..4448d17b9 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "babel-eslint": "^8.2.6", "broccoli-test-helper": "^1.3.0", "chai": "^4.1.0", - "ember-cli-addon-docs": "^0.6.1", + "ember-cli-addon-docs": "^0.6.2", "ember-cli-addon-docs-esdoc": "^0.2.1", "ember-cli-app-version": "^2.0.0", "ember-cli-deploy": "^1.0.2", diff --git a/tests/dummy/app/pods/index/template.hbs b/tests/dummy/app/pods/index/template.hbs index f655b7f32..718cadfb3 100644 --- a/tests/dummy/app/pods/index/template.hbs +++ b/tests/dummy/app/pods/index/template.hbs @@ -23,7 +23,7 @@
    - {{#link-to 'docs' class="home__cta-link"}} + {{#link-to "docs" class="home__cta-link"}} Read the docs {{/link-to}}
    diff --git a/tests/dummy/app/styles/app.css b/tests/dummy/app/styles/app.css index 0277dca96..a183e7bb8 100644 --- a/tests/dummy/app/styles/app.css +++ b/tests/dummy/app/styles/app.css @@ -1,3 +1,7 @@ +:root { + --brand-primary: #0e97ad; +} + .home { padding-left: 1rem; padding-right: 1rem; diff --git a/yarn.lock b/yarn.lock index 4f8482b57..88cae9cd9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -117,6 +117,13 @@ "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" +"@babel/helper-get-function-arity@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" + integrity sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw== + dependencies: + "@babel/types" "7.0.0-beta.44" + "@babel/helper-get-function-arity@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" @@ -601,6 +608,16 @@ js-levenshtein "^1.1.3" semver "^5.3.0" +"@babel/template@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" + integrity sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng== + dependencies: + "@babel/code-frame" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + babylon "7.0.0-beta.44" + lodash "^4.2.0" + "@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.2.2": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" @@ -842,10 +859,10 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -abortcontroller-polyfill@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.1.9.tgz#9fefe359fda2e9e0932dc85e6106453ac393b2da" - integrity sha512-omvG7zOHIs3BphdH62Kh3xy8nlftAsTyp7PDa9EmC3Jz9pa6sZFYk7UhNgu9Y4sIBhj6jF0RgeFZYvPnsP5sBw== +abortcontroller-polyfill@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.2.1.tgz#4e88847513a4ed691d5e4899d8b3a3af6f7d90ee" + integrity sha512-9jN7+BijYKWO8fxfcG7QZh7js6V+g3OjkxMRHfKWNjjs85048VY4cd27Uoe6yk55P66L/z7Dflu5+YEApgMzkA== accepts@~1.3.4: version "1.3.4" @@ -1055,6 +1072,14 @@ any-promise@^1.1.0: resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -1363,7 +1388,7 @@ babel-core@^6.14.0, babel-core@^6.26.0: slash "^1.0.0" source-map "^0.5.6" -babel-core@^6.24.1, babel-core@^6.26.3: +babel-core@^6.24.1: version "6.26.3" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== @@ -2135,6 +2160,13 @@ blob@0.0.5: resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= + dependencies: + inherits "~2.0.0" + bluebird@^3.1.1, bluebird@^3.3.5, bluebird@^3.4.6: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" @@ -2436,7 +2468,7 @@ broccoli-concat@^3.2.2: lodash.uniq "^4.2.0" walk-sync "^0.3.1" -broccoli-concat@^3.5.1, broccoli-concat@^3.7.1: +broccoli-concat@^3.5.1, broccoli-concat@^3.7.1, broccoli-concat@^3.7.3: version "3.7.3" resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.7.3.tgz#0dca01311567ffb13180e6b4eb111824628e4885" integrity sha512-2Ma9h81EJ0PRb9n4sW0i8KZlcnpTQfKxcj87zvi5DFe1fd8CTDEdseHDotK2beuA2l+LbgVPfd8EHaBJKm/Y8g== @@ -2698,7 +2730,26 @@ broccoli-node-info@1.1.0, broccoli-node-info@^1.1.0: resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-1.1.0.tgz#3aa2e31e07e5bdb516dd25214f7c45ba1c459412" integrity sha1-OqLjHgflvbUW3SUhT3xFuhxFlBI= -broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.2.0, broccoli-persistent-filter@^1.4.0, broccoli-persistent-filter@^1.4.2, broccoli-persistent-filter@^1.4.3: +broccoli-persistent-filter@^1.0.3: + version "1.4.6" + resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.6.tgz#80762d19000880a77da33c34373299c0f6a3e615" + integrity sha512-0RejLwoC95kv4kta8KAa+FmECJCK78Qgm8SRDEK7YyU0N9Cx6KpY3UCDy9WELl3mCXLN8TokNxc7/hp3lL4lfw== + dependencies: + async-disk-cache "^1.2.1" + async-promise-queue "^1.0.3" + broccoli-plugin "^1.0.0" + fs-tree-diff "^0.5.2" + hash-for-dep "^1.0.2" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + mkdirp "^0.5.1" + promise-map-series "^0.2.1" + rimraf "^2.6.1" + rsvp "^3.0.18" + symlink-or-copy "^1.0.1" + walk-sync "^0.3.1" + +broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.2.0, broccoli-persistent-filter@^1.4.0, broccoli-persistent-filter@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.3.tgz#3511bc52fc53740cda51621f58a28152d9911bc1" integrity sha512-JwNLDvvXJlhUmr+CHcbVhCyp33NbCIAITjQZmJY9e8QzANXh3jpFWlhSFvkWghwKA8rTAKcXkW12agtiZjxr4g== @@ -2909,7 +2960,7 @@ broccoli-string-replace@^0.1.1, broccoli-string-replace@^0.1.2: broccoli-persistent-filter "^1.1.5" minimatch "^3.0.3" -broccoli-style-manifest@^1.5.0: +broccoli-style-manifest@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/broccoli-style-manifest/-/broccoli-style-manifest-1.5.2.tgz#249accc81a75b83fb581cd8c2d16a51a4989664d" integrity sha512-68IUg6TAD/hBBsg2/MYTQpdpzBpkg6vLAbHvlcebgS3AckkKvZCSC7XXlgnCHJ5xj0L/LPbS8VOzSjpz8IiYow== @@ -3032,6 +3083,15 @@ browserslist@^3.2.6: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" +browserslist@^4.0.0: + version "4.4.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.4.1.tgz#42e828954b6b29a7a53e352277be429478a69062" + integrity sha512-pEBxEXg7JwaakBXjATYw/D1YZh4QUSCX/Mnd/wnqSRPPSi1U39iDhDoKGoBUcraKdxDlrYqJxSI5nNvD+dWP2A== + dependencies: + caniuse-lite "^1.0.30000929" + electron-to-chromium "^1.3.103" + node-releases "^1.1.3" + browserslist@^4.3.4: version "4.4.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.4.0.tgz#7050d1412cbfc5274aba609ed5e50359ca1a5fdf" @@ -3193,6 +3253,21 @@ can-symlink@^1.0.0: dependencies: tmp "0.0.28" +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000929: + version "1.0.30000929" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000929.tgz#7b391b781a9c3097ecc39ea053301aea8ea16317" + integrity sha512-n2w1gPQSsYyorSVYqPMqbSaz1w7o9ZC8VhOEGI9T5MfGDzp7sbopQxG6GaQmYsaq13Xfx/mkxJUWC1Dz3oZfzw== + caniuse-lite@^1.0.30000792: version "1.0.30000803" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000803.tgz#9939c37149d38d5f4540430490d240c03106a0f5" @@ -3298,7 +3373,7 @@ chalk@^2.3.0: escape-string-regexp "^1.0.5" supports-color "^5.2.0" -chalk@^2.3.1, chalk@^2.4.1: +chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -4344,7 +4419,7 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.100: +electron-to-chromium@^1.3.100, electron-to-chromium@^1.3.103: version "1.3.103" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.103.tgz#a695777efdbc419cad6cbb0e58458251302cd52f" integrity sha512-tObPqGmY9X8MUM8i3MEimYmbnLLf05/QV5gPlkR8MQ3Uj8G8B2govE1U4cQcBYtv3ymck9Y8cIOu4waoiykMZQ== @@ -4406,10 +4481,10 @@ ember-cli-addon-docs-esdoc@^0.2.1: tmp "^0.0.33" walk-sync "^0.3.2" -ember-cli-addon-docs@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.1.tgz#940e7ba6318cb60b9c6e783eb93ba52ee25d59ce" - integrity sha512-qaeLJM06RFaVFFQZUZOkQ9ezOMCMf27tu5gvphLjrQgLux4E0BfJsbSB+0hrx2YIbzaTirTtzXxVIJayakVNKQ== +ember-cli-addon-docs@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.2.tgz#048fcc0d91dc16904a74fbe2feadd3c49e7c91f5" + integrity sha512-s2uU5GKXn2THqSaKfz2S69uzZiXfGzBRSFPLyDGOB3vPKqaT4CTqxPW/9w0QWuaz1GhgE0tBighcnmhMcO+qxQ== dependencies: "@glimmer/syntax" "^0.36.4" broccoli-bridge "^1.0.0" @@ -4431,10 +4506,10 @@ ember-cli-addon-docs@^0.6.1: ember-cli-string-helpers "^1.9.0" ember-cli-tailwind "^0.6.2" ember-code-snippet "^2.3.1" - ember-component-css "0.6.5" + ember-component-css "^0.6.7" ember-concurrency "^0.8.21" ember-data "2.x - 3.x" - ember-fetch "^5.1.3" + ember-fetch "^6.2.0" ember-fetch-adapter "^0.4.3" ember-href-to "^1.15.1" ember-keyboard "^4.0.0" @@ -4577,7 +4652,7 @@ ember-cli-babel@^6.7.2: ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0: +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.4: version "7.2.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.2.0.tgz#5c5bd877fb73f6fb198c878d3127ba9e18e9b8a0" integrity sha512-vwx/AgPD7P4ebgTFJMqFovbrSNCA02UMuItlR/Il16njYjgN9ZzjUqgYxaylN7k8RF88wdJq3jrtqyMS/oOq8A== @@ -5155,27 +5230,29 @@ ember-compatibility-helpers@^1.1.1: ember-cli-version-checker "^2.1.1" semver "^5.4.1" -ember-component-css@0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/ember-component-css/-/ember-component-css-0.6.5.tgz#b07a7e53e224f8b254a1ad3ce2f848afb87e3617" - integrity sha512-tY5Wl/qB8W2FTn6CoDCH0FxLjV3jrMOWH9ema9CAIWWsO8HUuGlAqn3KkjPETPYdSwOa47NevZIp+dBpehMLww== +ember-component-css@^0.6.7: + version "0.6.7" + resolved "https://registry.yarnpkg.com/ember-component-css/-/ember-component-css-0.6.7.tgz#dbc6debe5c04a2c0fe8a5edc64303c7324b33945" + integrity sha512-nZbGVHr3TI5uBb6mGqAvB2QJo8VQcmXTLCy/PnJ/Lyq3sKZCjg5dQE66X+TcHPG3IWEMOmCe/1vaK4HPtE8gfA== dependencies: - broccoli-concat "^3.2.2" + broccoli-concat "^3.7.3" broccoli-funnel "^2.0.1" - broccoli-merge-trees "^3.0.0" - broccoli-persistent-filter "^1.4.2" - broccoli-plugin "^1.3.0" - broccoli-style-manifest "^1.5.0" - ember-cli-babel "^6.11.0" + broccoli-merge-trees "^3.0.2" + broccoli-persistent-filter "^2.1.1" + broccoli-plugin "^1.3.1" + broccoli-replace "^0.12.0" + broccoli-style-manifest "^1.5.2" + ember-cli-babel "^7.1.4" + ember-cli-version-checker "^2.1.2" ember-getowner-polyfill "^2.2.0" - fs-tree-diff "^0.5.6" + fs-tree-diff "^1.0.2" md5 "^2.2.1" - postcss "^6.0.19" - postcss-less "^1.1.3" - postcss-scss "^1.0.3" + postcss "^7.0.6" + postcss-less "^3.1.0" + postcss-scss "^2.0.0" postcss-selector-namespace "^1.5.0" - rsvp "^4.8.1" - walk-sync "^0.3.2" + rsvp "^4.8.4" + walk-sync "^1.0.1" ember-composable-helpers@^2.1.0: version "2.1.0" @@ -5291,23 +5368,23 @@ ember-fetch-adapter@^0.4.3: dependencies: ember-cli-babel "^6.12.0" -ember-fetch@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-5.1.3.tgz#f649c60d523bf1949125a4c497751df3b0c9f587" - integrity sha512-eQX54LpaQCS7IDuASNxArTVwkXIuwL9W4UZOLPyfEQJfmXd4IEx3mqoVlydBJJp2kjpuUZ1Wbd1XKC96ggY5gw== +ember-fetch@^6.2.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-6.4.0.tgz#806b2acfbda07f3b0dd48a9fcdbc575c5519611d" + integrity sha512-/GtJWQiUAAOX2HMGuLrWQMNWO9YRNH9+AiMzZYc5PrTHKdv+Ib5fciysz0+e97Dj9vyvF2mQa49mrosAPW9ziQ== dependencies: - "@xg-wang/whatwg-fetch" "^3.0.0" - abortcontroller-polyfill "^1.1.9" - babel-core "^6.26.3" - babel-preset-env "^1.7.0" + abortcontroller-polyfill "^1.2.1" broccoli-concat "^3.2.2" + broccoli-debug "^0.6.5" broccoli-merge-trees "^3.0.0" broccoli-rollup "^2.1.1" broccoli-stew "^2.0.0" broccoli-templater "^2.0.1" + calculate-cache-key-for-tree "^1.1.0" + caniuse-api "^3.0.0" ember-cli-babel "^6.8.2" - node-fetch "^2.0.0-alpha.9" - rollup-plugin-babel "^3.0.7" + node-fetch "^2.3.0" + whatwg-fetch "^3.0.0" ember-get-config@^0.2.2: version "0.2.4" @@ -5903,11 +5980,6 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= -estree-walker@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e" - integrity sha1-va/oCVOD2EFNXcLs9MkXO225QS4= - estree-walker@^0.5.0, estree-walker@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.2.tgz#d3850be7529c9580d815600b53126515e146dd39" @@ -6788,6 +6860,16 @@ fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.7, fs-tree-diff@^0.5.9: path-posix "^1.0.0" symlink-or-copy "^1.1.8" +fs-tree-diff@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-1.0.2.tgz#0e2931733a85b55feb3472c0b89a20b0c03ac0de" + integrity sha512-Zro2ACaPVDgVOx9+s5s5AfPlAD0kMJdbwGvTGF6KC1SjxjiGWxJvV4mUTDkFVSy3OUw2C/f1qpdjF81hGqSBAw== + dependencies: + heimdalljs-logger "^0.1.7" + object-assign "^4.1.0" + path-posix "^1.0.0" + symlink-or-copy "^1.1.8" + fs-updater@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/fs-updater/-/fs-updater-1.0.4.tgz#2329980f99ae9176e9a0e84f7637538a182ce63b" @@ -6820,7 +6902,7 @@ fsevents@^1.2.3: nan "^2.9.2" node-pre-gyp "^0.10.0" -fstream@^1.0.0: +fstream@^1.0.0, fstream@^1.0.2: version "1.0.11" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE= @@ -7087,6 +7169,16 @@ global-modules@^1.0.0: is-windows "^1.0.1" resolve-dir "^1.0.0" +global-prefix@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" + integrity sha1-jTvGuNo8qBEqFg2NSW/wRiv+948= + dependencies: + homedir-polyfill "^1.0.0" + ini "^1.3.4" + is-windows "^0.2.0" + which "^1.2.12" + global-prefix@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" @@ -7765,6 +7857,13 @@ into-stream@^3.1.0: from2 "^2.1.1" p-is-promise "^1.1.0" +invariant@^2.2.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + invariant@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" @@ -8101,6 +8200,11 @@ is-utf8@^0.2.0: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= +is-windows@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" + integrity sha1-3hqm1j6indJIc3tp8f+LgALSEIw= + is-windows@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.1.tgz#310db70f742d259a16a369202b51af84233310d9" @@ -9008,6 +9112,11 @@ lodash.map@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + lodash.merge@^4.3.0, lodash.merge@^4.3.1, lodash.merge@^4.4.0, lodash.merge@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" @@ -9101,7 +9210,7 @@ lodash.templatesettings@~2.3.0: lodash._reinterpolate "~2.3.0" lodash.escape "~2.3.0" -lodash.uniq@^4.2.0: +lodash.uniq@^4.2.0, lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= @@ -9133,7 +9242,7 @@ lodash@^4.1.0, lodash@^4.10.0, lodash@^4.13.1, lodash@^4.17.5, lodash@~4.17.10: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.5.1: +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.2.0, lodash@^4.5.1: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -9425,7 +9534,7 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^2.3.11, micromatch@^2.3.7: +micromatch@^2.1.5, micromatch@^2.3.11, micromatch@^2.3.7: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= @@ -9756,10 +9865,10 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" -node-fetch@^2.0.0-alpha.9: - version "2.2.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.2.0.tgz#4ee79bde909262f9775f731e3656d0db55ced5b5" - integrity sha512-OayFWziIxiHY8bCUyLX6sTpDH8Jsbp4FfYd1j1f7vZyfgkcOnAyM4oQR16f8a0s7Gl/viMGRey8eScYk4V4EZA== +node-fetch@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5" + integrity sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA== node-gyp@^3.8.0: version "3.8.0" @@ -9890,7 +9999,7 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.1, normalize-path@^2.1.1: +normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= @@ -10575,12 +10684,12 @@ postcss-js@^1.0.1: camelcase-css "^1.0.1" postcss "^6.0.11" -postcss-less@^1.1.3: - version "1.1.5" - resolved "http://registry.npmjs.org/postcss-less/-/postcss-less-1.1.5.tgz#a6f0ce180cf3797eeee1d4adc0e9e6d6db665609" - integrity sha512-QQIiIqgEjNnquc0d4b6HDOSFZxbFQoy4MPpli2lSLpKhMyBkKwwca2HFqu4xzxlKID/F2fxSOowwtKpgczhF7A== +postcss-less@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-3.1.1.tgz#87347038bf9cdec9c47722ecf97648bacd171cc3" + integrity sha512-yVa0hb03p7xj914Z4qDDA/PGwXYvCEfjJizWVYQvnEQr8SgJ098qejCvbCGk1dDYQpQEGKkvYHQCo66DwTocjg== dependencies: - postcss "^5.2.16" + postcss "^7.0.3" postcss-nested@^3.0.0: version "3.0.0" @@ -10597,12 +10706,12 @@ postcss-scss@^0.3.0: dependencies: postcss "^5.2.4" -postcss-scss@^1.0.3: - version "1.0.6" - resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-1.0.6.tgz#ab903f3bb20161bc177896462293a53d4bff5f7a" - integrity sha512-4EFYGHcEw+H3E06PT/pQQri06u/1VIIPjeJQaM8skB80vZuXMhp4cSNV5azmdNkontnOID/XYWEvEEELLFB1ww== +postcss-scss@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-2.0.0.tgz#248b0a28af77ea7b32b1011aba0f738bda27dea1" + integrity sha512-um9zdGKaDZirMm+kZFKKVsnKPF7zF7qBAtIfTSnZXD1jZ0JNZIxdB6TxQOjCnlSzLRInVl2v3YdBh/M881C4ug== dependencies: - postcss "^6.0.23" + postcss "^7.0.0" postcss-selector-namespace@^1.5.0: version "1.5.0" @@ -10625,7 +10734,7 @@ postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" integrity sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU= -postcss@^5.0.8, postcss@^5.2.16, postcss@^5.2.4: +postcss@^5.0.8, postcss@^5.2.4: version "5.2.18" resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg== @@ -10635,7 +10744,7 @@ postcss@^5.0.8, postcss@^5.2.16, postcss@^5.2.4: source-map "^0.5.6" supports-color "^3.2.3" -postcss@^6.0.1, postcss@^6.0.11, postcss@^6.0.14, postcss@^6.0.17, postcss@^6.0.19, postcss@^6.0.20, postcss@^6.0.23, postcss@^6.0.9: +postcss@^6.0.1, postcss@^6.0.11, postcss@^6.0.14, postcss@^6.0.17, postcss@^6.0.20, postcss@^6.0.9: version "6.0.23" resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== @@ -10644,6 +10753,15 @@ postcss@^6.0.1, postcss@^6.0.11, postcss@^6.0.14, postcss@^6.0.17, postcss@^6.0. source-map "^0.6.1" supports-color "^5.4.0" +postcss@^7.0.0, postcss@^7.0.3, postcss@^7.0.6: + version "7.0.13" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.13.tgz#42bf716413e8f1c786ab71dc6e722b3671b16708" + integrity sha512-h8SY6kQTd1wISHWjz+E6cswdhMuyBZRb16pSTv3W4zYZ3/YbyWeJdNUeOXB5IdZqE1U76OUEjjjqsC3z2f3hVg== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -11426,13 +11544,6 @@ rimraf@~2.2.6: resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= -rollup-plugin-babel@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-3.0.7.tgz#5b13611f1ab8922497e9d15197ae5d8a23fe3b1e" - integrity sha512-bVe2y0z/V5Ax1qU8NX/0idmzIwJPdUGu8Xx3vXH73h0yGjxfv2gkFI82MBVg49SlsFlLTBadBHb67zy4TWM3hA== - dependencies: - rollup-pluginutils "^1.5.0" - rollup-plugin-commonjs@^8.3.0: version "8.4.1" resolved "http://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.4.1.tgz#5c9cea2b2c3de322f5fbccd147e07ed5e502d7a0" @@ -11453,14 +11564,6 @@ rollup-plugin-node-resolve@^3.3.0: is-module "^1.0.0" resolve "^1.1.6" -rollup-pluginutils@^1.5.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408" - integrity sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg= - dependencies: - estree-walker "^0.2.1" - minimatch "^3.0.2" - rollup-pluginutils@^2.0.1: version "2.3.3" resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.3.3.tgz#3aad9b1eb3e7fe8262820818840bf091e5ae6794" @@ -12326,6 +12429,13 @@ supports-color@^5.3.0, supports-color@^5.4.0: dependencies: has-flag "^3.0.0" +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + svg2png@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/svg2png/-/svg2png-3.0.1.tgz#a2644d68b0231ac00af431aa163714ff17106447" @@ -13102,6 +13212,14 @@ walk-sync@^0.3.1, walk-sync@^0.3.3: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" +walk-sync@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-1.0.1.tgz#6f38270392e297e5fd7b51eec9241be4242557c8" + integrity sha512-4Fyvn+KDGOF90ugcpErAMsNEF7r9ogk4SCNHZFkvmP+kr1rMSjpLbq9aYbEnYsL4dvVduLBm95TIz8WmqRAAgg== + dependencies: + ensure-posix-path "^1.0.0" + matcher-collection "^1.0.0" + walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -13120,6 +13238,11 @@ watch-detector@^0.1.0: semver "^5.4.1" silent-error "^1.1.0" +watch@~0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" + integrity sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw= + watch@~0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" @@ -13172,6 +13295,11 @@ whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: dependencies: iconv-lite "0.4.24" +whatwg-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" + integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== + whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" @@ -13217,7 +13345,7 @@ which-module@^1.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= -which@1, which@^1.2.10: +which@1, which@^1.2.10, which@^1.2.12: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== From 20d9d84841ebbeb7672a313282b8a03a0bfe1338 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 23 Jan 2019 16:43:22 -0500 Subject: [PATCH 287/879] Fix: db doesn't automatically sort new records Closes #1461 --- addon/db-collection.js | 5 +---- tests/unit/db-test.js | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/addon/db-collection.js b/addon/db-collection.js index df7af033c..935d44c6a 100644 --- a/addon/db-collection.js +++ b/addon/db-collection.js @@ -1,7 +1,6 @@ import _assign from 'lodash/assign'; import _map from 'lodash/map'; import _isEqual from 'lodash/isEqual'; -import _sortBy from 'lodash/sortBy'; function duplicate(data) { if (Array.isArray(data)) { @@ -80,9 +79,7 @@ class DbCollection { if (!Array.isArray(data)) { return this._insertRecord(data); } else { - // Need to sort in order to ensure IDs inserted in the correct order - let sorted = _sortBy(data, 'id'); - return _map(sorted, (x) => this._insertRecord(x)); + return _map(data, attrs => this._insertRecord(attrs)); } } diff --git a/tests/unit/db-test.js b/tests/unit/db-test.js index 723d7f753..93bf754fc 100644 --- a/tests/unit/db-test.js +++ b/tests/unit/db-test.js @@ -187,7 +187,7 @@ module('Unit | Db #insert', function(hooks) { test('it does not add ids to array data if present', function(assert) { db.contacts.insert([{ id: 2, name: 'Link' }, { id: 1, name: 'Ganon' }]); - assert.deepEqual(db.contacts, [{ id: '1', name: 'Ganon' }, { id: '2', name: 'Link' }]); + assert.deepEqual(db.contacts, [{ id: '2', name: 'Link' }, { id: '1', name: 'Ganon' }]); }); test('it can insert a record with an id of 0', function(assert) { @@ -430,10 +430,10 @@ module('Unit | Db #update', function(hooks) { let actualContacts = db.contacts; let expectedContacts = [ - { id: '123-abc', name: 'Sam', evil: false }, { id: '1', name: 'Sam', evil: false }, { id: '2', name: 'Sam', evil: false }, - { id: '3', name: 'Sam', evil: false } + { id: '3', name: 'Sam', evil: false }, + { id: '123-abc', name: 'Sam', evil: false } ]; assert.deepEqual( @@ -472,10 +472,10 @@ module('Unit | Db #update', function(hooks) { db.contacts.update({ evil: false }, { name: 'Sam' }); assert.deepEqual(db.contacts, [ - { id: '123-abc', name: 'Sam', evil: false }, { id: '1', name: 'Sam', evil: false }, { id: '2', name: 'Sam', evil: false }, - { id: '3', name: 'Ganon', evil: true } + { id: '3', name: 'Ganon', evil: true }, + { id: '123-abc', name: 'Sam', evil: false } ]); }); @@ -487,18 +487,18 @@ module('Unit | Db #update', function(hooks) { test('updating a collection returns the updated records', function(assert) { let characters = db.contacts.update({ evil: true }); assert.deepEqual(characters, [ - { id: '123-abc', name: 'Epona', evil: true }, { id: '1', name: 'Link', evil: true }, - { id: '2', name: 'Zelda', evil: true } + { id: '2', name: 'Zelda', evil: true }, + { id: '123-abc', name: 'Epona', evil: true } ]); }); test('updating multiple records returns the updated records', function(assert) { let characters = db.contacts.update({ evil: false }, { evil: true }); assert.deepEqual(characters, [ - { id: '123-abc', name: 'Epona', evil: true }, { id: '1', name: 'Link', evil: true }, - { id: '2', name: 'Zelda', evil: true } + { id: '2', name: 'Zelda', evil: true }, + { id: '123-abc', name: 'Epona', evil: true } ]); }); @@ -537,9 +537,9 @@ module('Unit | Db #remove', function(hooks) { db.contacts.remove(1); assert.deepEqual(db.contacts, [ - { id: '123-abc', name: 'Epona', evil: false }, { id: '2', name: 'Zelda', evil: false }, - { id: '3', name: 'Ganon', evil: true } + { id: '3', name: 'Ganon', evil: true }, + { id: '123-abc', name: 'Epona', evil: false } ]); }); @@ -557,8 +557,8 @@ module('Unit | Db #remove', function(hooks) { db.contacts.remove([1, 2]); assert.deepEqual(db.contacts, [ - { id: '123-abc', name: 'Epona', evil: false }, - { id: '3', name: 'Ganon', evil: true } + { id: '3', name: 'Ganon', evil: true }, + { id: '123-abc', name: 'Epona', evil: false } ]); }); From 17e30fb94510d640584b2aa87432d1dfb1ce96f7 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 23 Jan 2019 17:12:53 -0500 Subject: [PATCH 288/879] doc: update normalizedRequestAttrs --- .../app/pods/docs/advanced/route-handlers/template.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tests/dummy/app/pods/docs/advanced/route-handlers/template.md b/tests/dummy/app/pods/docs/advanced/route-handlers/template.md index 4f926c7c5..893075afa 100644 --- a/tests/dummy/app/pods/docs/advanced/route-handlers/template.md +++ b/tests/dummy/app/pods/docs/advanced/route-handlers/template.md @@ -175,7 +175,7 @@ this.get('/api/authors', function({ authors }) { }); ``` -# this.normalizedRequestAttrs() +# this.normalizedRequestAttrs([ modelName ]) This helper will return the body of a request in a normalized form, suitable for working with and creating records. @@ -227,6 +227,15 @@ Note that this helper method leverages your serializer's `normalize` function. I Additionally, you'll need to use a full `function` here, as opposed to an ES6 arrow function (e.g `() => { ... }`). This is because `normalizeRequestAttrs` requires the `this` context from the function handler, and an arrow function would bind this from the outer scope. +`normalizedRequestAttrs()` relies on a `modelName` to work and attempts to automatically detect it based on the URL of the request. If you use conventional URLs – for example, PATCH /users/1 – the helper should work. If you are using something custom – for example, PATCH /users/edit/1 – you’ll need to provide the `modelName` to the helper: + +```js +this.patch('/users/edit/:id', function(schema, request) { + let attrs = this.normalizedRequestAttrs('user'); + ... +}); +``` + ## External origins You can use Mirage to simulate other-origin requests. By default, a route like From 044a831fd508e7e6984287a32671a1ecf65e223e Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 23 Jan 2019 17:14:33 -0500 Subject: [PATCH 289/879] doc: fix app/mirage references --- addon/server.js | 10 +++++----- .../writing-your-server/defining-routes/template.md | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/addon/server.js b/addon/server.js index 5f32e0eaa..ff4f19ab8 100644 --- a/addon/server.js +++ b/addon/server.js @@ -189,7 +189,7 @@ export default class Server { For example, ```js - // app/mirage/config.js + // mirage/config.js export default function() { this.namespace = '/api'; @@ -201,7 +201,7 @@ export default class Server { Note that only routes defined after `this.namespace` are affected. This is useful if you have a few one-off routes that you don't want under your namespace: ```js - // app/mirage/config.js + // mirage/config.js export default function() { // this route handles /auth @@ -229,7 +229,7 @@ export default class Server { Useful if your Ember app makes API requests to a different port. ```js - // app/mirage/config.js + // mirage/config.js export default function() { this.prefix = 'http://localhost:8080' }; @@ -243,7 +243,7 @@ export default class Server { By default there's a 400ms delay during development, and 0 delay in testing (so your tests run fast). ```js - // app/mirage/config.js + // mirage/config.js export default function() { this.timing = 400; // default }; @@ -350,7 +350,7 @@ export default class Server { Mirage uses [pretender.js](https://github.com/trek/pretender) as its xhttp interceptor. In your Mirage config, `this.pretender` refers to the actual Pretender instance, so any config options that work there will work here as well. ```js - // app/mirage/config.js + // mirage/config.js export default function() { this.pretender.handledRequest = (verb, path, request) => { console.log(`Your server responded to ${path}`); diff --git a/tests/dummy/app/pods/docs/writing-your-server/defining-routes/template.md b/tests/dummy/app/pods/docs/writing-your-server/defining-routes/template.md index b2e7d368b..280fcc975 100644 --- a/tests/dummy/app/pods/docs/writing-your-server/defining-routes/template.md +++ b/tests/dummy/app/pods/docs/writing-your-server/defining-routes/template.md @@ -335,7 +335,7 @@ Additionally, a header for `Content-Type` is set to `application/json`. You can customize both the response code and headers by returning a `Response` in your route handler: ```js -// app/mirage/config.js +// mirage/config.js import { Response } from 'ember-cli-mirage'; export default function() { From 3da8d67ff67b29533f1fa7eef186c79e7515c3b2 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 23 Jan 2019 17:16:49 -0500 Subject: [PATCH 290/879] docs: add note for prettier users --- .../docs/getting-started/installation/template.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/dummy/app/pods/docs/getting-started/installation/template.md b/tests/dummy/app/pods/docs/getting-started/installation/template.md index 4da240570..db04eba3c 100644 --- a/tests/dummy/app/pods/docs/getting-started/installation/template.md +++ b/tests/dummy/app/pods/docs/getting-started/installation/template.md @@ -9,3 +9,14 @@ ember install ember-cli-mirage Ember should install the addon and add a `/mirage` directory to the root of your project. Check out the [upgrade guide](../upgrading) if you're coming from Mirage 0.2.x. + +**Note for Prettier users** + +There's an Ember CLI bug that exposes itself when using Prettier + Mirage. A longer-term fix is in the works, but for now, if you're using Prettier and install Mirage, you can either + +- pin `eslint-plugin-prettier` to 2.6.0, or +- add the following to `.eslintignore`: + + ```sh + /mirage/mirage + ``` From ffc437c3c13405622b7c50cb6bd5cc615da62436 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 23 Jan 2019 17:21:08 -0500 Subject: [PATCH 291/879] docs: clarify how to override timing in tests --- .../docs/advanced/route-handlers/template.md | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/tests/dummy/app/pods/docs/advanced/route-handlers/template.md b/tests/dummy/app/pods/docs/advanced/route-handlers/template.md index 893075afa..8fd8177f7 100644 --- a/tests/dummy/app/pods/docs/advanced/route-handlers/template.md +++ b/tests/dummy/app/pods/docs/advanced/route-handlers/template.md @@ -23,7 +23,7 @@ The optional `options` hash passed as the last parameter has `timing` and `coale Set the timing parameter of the response for this particular route. Default is a 400ms delay during development and 0 delay in testing (so your tests run fast). -Note you can set a [global timing parameter](../configuration/#timing) for all routes. Individual timing parameters override the global setting. +Note you can set a [global timing parameter](/docs/api/modules/ember-cli-mirage/server~Server#timing) for all routes. Individual timing parameters override the global setting. Example: @@ -35,6 +35,34 @@ this.get('/complex_query', () => { }, { timing: 3000 }); ``` +If you want to add delays to a particular test's routes, you can override the timing for individual tests by putting the timing parameter in your test + +```js +test('Call this route with a delay', function() { + server.timing = 10000; + // ... +}); +``` + +Or for all tests in a particular module + +```js +module('Add delayed route calls to multiple tests', function() { + server.timing = 10000; + + test('It slowly calls a route', function() { + // ... + }); + + test ('It slow calls another route', function() { + // ... + }); +}); +``` + +Because the server is restarted after each test, you don't have to worry about this leaking into other tests. + + # options.coalesce This option only affects the [*Array of Objects* version of the GET shorthand](../shorthands/#get-shorthands). It is ignored by all other route handlers. From be23f538131228d1deeec1aedf9a2a51f0a7957f Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 23 Jan 2019 17:54:38 -0500 Subject: [PATCH 292/879] docs: clarify default server-side nested includes closes #1437 --- addon/serializer.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/addon/serializer.js b/addon/serializer.js index dda2616ae..b5eed7872 100644 --- a/addon/serializer.js +++ b/addon/serializer.js @@ -203,6 +203,21 @@ class Serializer { Note that, in accordance with the spec, Mirage gives precedence to an ?include query param over a default include: [] array that you might have specified directly on the serializer. Default includes will still be in effect, however, if a request does not have an ?include query param. + Also note that default includes specified with the `include: []` array can only take a single model; they cannot take dot-separated paths to nested relationships. + + If you'd like to set a default dot-separated (nested) include path for a resource, you have to do it at the route level by setting a default value for `request.queryParams`: + + ```js + this.get('/users', function(schema, request) => { + request.queryParams = request.queryParams || {}; + if (!request.queryParams.include) { + request.queryParams.include = 'blog-posts.comments'; + } + + // rest of route handler logic + }); + ``` + @property include @public */ From 848f5f0d08997b507bf7c612326c828fd5554027 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 24 Jan 2019 08:25:06 -0500 Subject: [PATCH 293/879] v0.4.13 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4448d17b9..6bcfcbbdd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "0.4.12", + "version": "0.4.13", "description": "A client-side server to help you build, test and demo your Ember app", "keywords": [ "ember-addon", From 2be17f6c1015cb1b469f93d5d879463d0ed6ad2e Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 25 Jan 2019 13:37:00 -0500 Subject: [PATCH 294/879] Add instructions for setting up Application Tests --- .../acceptance-testing/template.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/dummy/app/pods/docs/writing-your-server/acceptance-testing/template.md b/tests/dummy/app/pods/docs/writing-your-server/acceptance-testing/template.md index d1a8a3311..f69c02c96 100644 --- a/tests/dummy/app/pods/docs/writing-your-server/acceptance-testing/template.md +++ b/tests/dummy/app/pods/docs/writing-your-server/acceptance-testing/template.md @@ -4,6 +4,22 @@ Acceptance testing your Ember app typically involves verifying some user behavio Many of these tests rely on a given server state. In other words, you want to test that the user can view ten photos, *given that ten photo resources exist on the server* at the time the user boots up the app. +If you're using Application Tests (introduced in [Ember 3.0](https://emberjs.com/blog/2018/02/14/ember-3-0-released.html#toc_updates-to-the-testing-defaults)), add the `setupMirage` hook to the top of your test file: + +```diff + import { setupApplicationTest } from 'ember-qunit'; ++ import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; + + module('Acceptance | Homepage test', function(hooks) { + setupApplicationTest(hooks); ++ setupMirage(hooks); + + test('my first test', async function(assert) { + // test code + }); + }); +``` + Once you've defined your routes, use the `server` variable to define the initial server state directly in your tests: ```js From 9ea510587f69cbba0b78ee3a8d485b695a9f1162 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 29 Jan 2019 13:02:48 -0500 Subject: [PATCH 295/879] internal: jsdom is a dev dependency --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6bcfcbbdd..158e70155 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,6 @@ "ember-lodash": "^4.19.4", "fake-xml-http-request": "^2.0.0", "faker": "^3.0.0", - "jsdom": "^13.1.0", "pretender": "2.1.1", "route-recognizer": "^0.3.4" }, @@ -95,6 +94,7 @@ "eslint-plugin-ember-suave": "^1.0.0", "eslint-plugin-node": "^7.0.1", "fastboot": "^1.2.0", + "jsdom": "^13.1.0", "loader.js": "^4.7.0", "qunit-dom": "^0.8.4" }, From 33049c5db50b609054b146165ac00683f48630d0 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 29 Jan 2019 13:43:05 -0500 Subject: [PATCH 296/879] v0.4.14 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 158e70155..4a242924a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "0.4.13", + "version": "0.4.14", "description": "A client-side server to help you build, test and demo your Ember app", "keywords": [ "ember-addon", From 1752f55caf1dc819dd440830860a65485528c819 Mon Sep 17 00:00:00 2001 From: Alon Bukai Date: Sat, 2 Feb 2019 19:33:32 +0200 Subject: [PATCH 297/879] fix: shorthand link There is also an issue with: See the `serializer guide` to learn more. Not sure where it should point to --- .../dummy/app/pods/docs/getting-started/quickstart/template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dummy/app/pods/docs/getting-started/quickstart/template.md b/tests/dummy/app/pods/docs/getting-started/quickstart/template.md index ce5e65515..a08379982 100644 --- a/tests/dummy/app/pods/docs/getting-started/quickstart/template.md +++ b/tests/dummy/app/pods/docs/getting-started/quickstart/template.md @@ -250,7 +250,7 @@ Mirage ships with two named serializers, JSONAPISerializer and ActiveModelSerial ## Shorthands Mirage has *shorthands* to reduce the code needed for conventional API routes. For example, the route handler From 0bc26c23f7a7cd2395703551c36be876b820a617 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 2 Feb 2019 15:40:44 -0500 Subject: [PATCH 298/879] Use Ember Auto Import (#1476) Feat: Add auto-import, remove pretender shim --- index.js | 10 - package.json | 17 +- yarn.lock | 1208 ++++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 1180 insertions(+), 55 deletions(-) diff --git a/index.js b/index.js index 717b436db..7ba619027 100644 --- a/index.js +++ b/index.js @@ -21,9 +21,6 @@ module.exports = { 'fake-xml-http-request': npmAsset({ import: ['fake_xml_http_request.js'] }), - 'pretender': npmAsset({ - import: ['pretender.js'] - }), 'faker': npmAsset({ import: ['build/build/faker.js'] }) @@ -62,13 +59,6 @@ module.exports = { } else { this.mirageDirectory = path.join(this.app.project.root, '/mirage'); } - - if (this._shouldIncludeFiles()) { - app.import('vendor/ember-cli-mirage/pretender-shim.js', { - type: 'vendor', - exports: { 'pretender': ['default'] } - }); - } }, blueprintsPath() { diff --git a/package.json b/package.json index 4a242924a..95e0d3b1e 100644 --- a/package.json +++ b/package.json @@ -37,11 +37,12 @@ "dependencies": { "@xg-wang/whatwg-fetch": "^3.0.0", "broccoli-file-creator": "^2.1.1", - "broccoli-string-replace": "^0.1.2", - "chalk": "^1.1.1", "broccoli-funnel": "^2.0.1", "broccoli-merge-trees": "^3.0.2", "broccoli-stew": "^2.0.1", + "broccoli-string-replace": "^0.1.2", + "chalk": "^1.1.1", + "ember-auto-import": "^1.2.19", "ember-cli-babel": "^6.16.0", "ember-cli-node-assets": "^0.2.2", "ember-get-config": "^0.2.2", @@ -57,27 +58,27 @@ "@ember/optional-features": "^0.6.3", "active-model-adapter": "^2.0.3", "babel-eslint": "^8.2.6", + "broccoli-asset-rev": "^2.7.0", "broccoli-test-helper": "^1.3.0", "chai": "^4.1.0", + "ember-ajax": "^3.1.0", + "ember-cli": "~3.4.4", "ember-cli-addon-docs": "^0.6.2", "ember-cli-addon-docs-esdoc": "^0.2.1", "ember-cli-app-version": "^2.0.0", + "ember-cli-dependency-checker": "^3.0.0", "ember-cli-deploy": "^1.0.2", "ember-cli-deploy-build": "^1.1.1", "ember-cli-deploy-git": "^1.3.3", "ember-cli-deploy-git-ci": "^1.0.1", - "ember-cli-favicon": "^1.0.0-beta.4", - "ember-cli-release": "^0.2.9", - "broccoli-asset-rev": "^2.7.0", - "ember-ajax": "^3.1.0", - "ember-cli": "~3.4.4", - "ember-cli-dependency-checker": "^3.0.0", "ember-cli-eslint": "^4.2.3", "ember-cli-fastboot": "^1.1.4-beta.1", + "ember-cli-favicon": "^1.0.0-beta.4", "ember-cli-htmlbars": "^3.0.0", "ember-cli-htmlbars-inline-precompile": "^1.0.3", "ember-cli-inject-live-reload": "^1.8.2", "ember-cli-qunit": "^4.4.0", + "ember-cli-release": "^0.2.9", "ember-cli-sri": "^2.1.1", "ember-cli-template-lint": "^1.0.0-beta.1", "ember-cli-uglify": "^2.1.0", diff --git a/yarn.lock b/yarn.lock index 88cae9cd9..27b65fb6e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,7 +16,7 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@^7.0.0": +"@babel/core@^7.0.0", "@babel/core@^7.1.6": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.2.2.tgz#07adba6dde27bb5ad8d8672f15fde3e08184a687" integrity sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw== @@ -643,7 +643,7 @@ invariant "^2.2.0" lodash "^4.2.0" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.2.2", "@babel/traverse@^7.2.3": +"@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.1.6", "@babel/traverse@^7.2.2", "@babel/traverse@^7.2.3": version "7.2.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.2.3.tgz#7ff50cefa9c7c0bd2d81231fdac122f3957748d8" integrity sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw== @@ -676,6 +676,15 @@ lodash "^4.17.10" to-fast-properties "^2.0.0" +"@babel/types@^7.1.6": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.0.tgz#61dc0b336a93badc02bf5f69c4cd8e1353f2ffc0" + integrity sha512-QkFPw68QqWU1/RVPyBe8SO7lXbPfjtqAxRYQKpFpaB8yMq7X2qAqfwK5LKoQufEkSmO5NQ70O6Kc3Afk03RwXw== + dependencies: + esutils "^2.0.2" + lodash "^4.17.10" + to-fast-properties "^2.0.0" + "@ember/jquery@^0.5.2": version "0.5.2" resolved "https://registry.yarnpkg.com/@ember/jquery/-/jquery-0.5.2.tgz#fe312c03ada0022fa092d23f7cd7e2eb0374b53a" @@ -839,11 +848,164 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.41.tgz#e57c3152eb2e7ec748c733cebd0c095b437c5d37" integrity sha512-sPZWEbFMz6qAy9SLY7jh5cgepmsiwqUUHjvEm8lpU6kug2hmmcyuTnwhoGw/GWpI5Npue4EqvsiQQI0eWjW/ZA== +"@webassemblyjs/ast@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" + integrity sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA== + dependencies: + "@webassemblyjs/helper-module-context" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/wast-parser" "1.7.11" + +"@webassemblyjs/floating-point-hex-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz#a69f0af6502eb9a3c045555b1a6129d3d3f2e313" + integrity sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg== + +"@webassemblyjs/helper-api-error@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz#c7b6bb8105f84039511a2b39ce494f193818a32a" + integrity sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg== + +"@webassemblyjs/helper-buffer@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz#3122d48dcc6c9456ed982debe16c8f37101df39b" + integrity sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w== + +"@webassemblyjs/helper-code-frame@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz#cf8f106e746662a0da29bdef635fcd3d1248364b" + integrity sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw== + dependencies: + "@webassemblyjs/wast-printer" "1.7.11" + +"@webassemblyjs/helper-fsm@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz#df38882a624080d03f7503f93e3f17ac5ac01181" + integrity sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A== + +"@webassemblyjs/helper-module-context@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz#d874d722e51e62ac202476935d649c802fa0e209" + integrity sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg== + +"@webassemblyjs/helper-wasm-bytecode@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz#dd9a1e817f1c2eb105b4cf1013093cb9f3c9cb06" + integrity sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ== + +"@webassemblyjs/helper-wasm-section@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz#9c9ac41ecf9fbcfffc96f6d2675e2de33811e68a" + integrity sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + +"@webassemblyjs/ieee754@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz#c95839eb63757a31880aaec7b6512d4191ac640b" + integrity sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.11.tgz#d7267a1ee9c4594fd3f7e37298818ec65687db63" + integrity sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw== + dependencies: + "@xtuc/long" "4.2.1" + +"@webassemblyjs/utf8@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.11.tgz#06d7218ea9fdc94a6793aa92208160db3d26ee82" + integrity sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA== + +"@webassemblyjs/wasm-edit@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz#8c74ca474d4f951d01dbae9bd70814ee22a82005" + integrity sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/helper-wasm-section" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + "@webassemblyjs/wasm-opt" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" + "@webassemblyjs/wast-printer" "1.7.11" + +"@webassemblyjs/wasm-gen@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz#9bbba942f22375686a6fb759afcd7ac9c45da1a8" + integrity sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/ieee754" "1.7.11" + "@webassemblyjs/leb128" "1.7.11" + "@webassemblyjs/utf8" "1.7.11" + +"@webassemblyjs/wasm-opt@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz#b331e8e7cef8f8e2f007d42c3a36a0580a7d6ca7" + integrity sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" + +"@webassemblyjs/wasm-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz#6e3d20fa6a3519f6b084ef9391ad58211efb0a1a" + integrity sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-api-error" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/ieee754" "1.7.11" + "@webassemblyjs/leb128" "1.7.11" + "@webassemblyjs/utf8" "1.7.11" + +"@webassemblyjs/wast-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz#25bd117562ca8c002720ff8116ef9072d9ca869c" + integrity sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/floating-point-hex-parser" "1.7.11" + "@webassemblyjs/helper-api-error" "1.7.11" + "@webassemblyjs/helper-code-frame" "1.7.11" + "@webassemblyjs/helper-fsm" "1.7.11" + "@xtuc/long" "4.2.1" + +"@webassemblyjs/wast-printer@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz#c4245b6de242cb50a2cc950174fdbf65c78d7813" + integrity sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/wast-parser" "1.7.11" + "@xtuc/long" "4.2.1" + "@xg-wang/whatwg-fetch@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@xg-wang/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#f7b222c012a238e7d6e89ed3d72a1e0edb58453d" integrity sha512-ULtqA6L75RLzTNW68IiOja0XYv4Ebc3OGMzfia1xxSEMpD0mk/pMvkQX0vbCFyQmKc5xGp80Ms2WiSlXLh8hbA== +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" + integrity sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g== + abab@^1.0.0, abab@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" @@ -887,6 +1049,11 @@ acorn-dynamic-import@^3.0.0: dependencies: acorn "^5.0.0" +acorn-dynamic-import@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" + integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== + acorn-globals@^1.0.4: version "1.0.9" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-1.0.9.tgz#55bb5e98691507b74579d0513413217c380c54cf" @@ -939,6 +1106,11 @@ acorn@^6.0.1, acorn@^6.0.4: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.5.tgz#81730c0815f3f3b34d8efa95cb7430965f4d887a" integrity sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg== +acorn@^6.0.5: + version "6.0.6" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.6.tgz#cd75181670d5b99bdb1b1c993941d3a239ab1f56" + integrity sha512-5M3G/A4uBSMIlfJ+h9W125vJvPFH/zirISsW5qfxF5YzEvXJCtolLoQvM5yZft0DvMcUrPGKPOlgEu55I6iUtA== + active-model-adapter@^2.0.3: version "2.2.0" resolved "https://registry.yarnpkg.com/active-model-adapter/-/active-model-adapter-2.2.0.tgz#6885d6968574809f17f398c499b688a921c30f91" @@ -952,11 +1124,21 @@ after@0.8.2: resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + ajv-keywords@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= +ajv-keywords@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.3.0.tgz#cb6499da9b83177af8bc1732b2f0a1a1a3aacf8c" + integrity sha512-CMzN9S62ZOO4sA/mJZIO4S++ZM7KFWzH3PPWkveLhy4OZ9i1/VatgwWMD46w/XbGCBy7Ye0gCk+Za6mmyfKK7g== + ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" @@ -967,7 +1149,7 @@ ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" -ajv@^6.5.5: +ajv@^6.1.0, ajv@^6.5.5: version "6.7.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.7.0.tgz#e3ce7bb372d6577bb1839f1dfdfcbf5ad2948d96" integrity sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg== @@ -1104,7 +1286,7 @@ applause@1.2.2: js-yaml "^3.3.0" lodash "^3.10.0" -aproba@^1.0.3: +aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== @@ -1212,6 +1394,15 @@ arrify@^1.0.0, arrify@^1.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + asn1@0.1.11: version "0.1.11" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.1.11.tgz#559be18376d08a4ec4dbe80877d27818639b2df7" @@ -1232,6 +1423,13 @@ assert-plus@^0.1.5: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.1.5.tgz#ee74009413002d84cec7219c6ac811812e723160" integrity sha1-7nQAlBMALYTOxyGcasgRgS5yMWA= +assert@^1.1.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= + dependencies: + util "0.10.3" + assertion-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" @@ -1388,7 +1586,7 @@ babel-core@^6.14.0, babel-core@^6.26.0: slash "^1.0.0" source-map "^0.5.6" -babel-core@^6.24.1: +babel-core@^6.24.1, babel-core@^6.26.3: version "6.26.3" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== @@ -1665,6 +1863,11 @@ babel-plugin-syntax-async-functions@^6.8.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= +babel-plugin-syntax-dynamic-import@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" + integrity sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo= + babel-plugin-syntax-exponentiation-operator@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" @@ -2096,6 +2299,11 @@ base64-js@0.0.2: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.2.tgz#024f0f72afa25b75f9c0ee73cd4f55ec1bed9784" integrity sha1-Ak8Pcq+iW3X5wO5zzU9V7Bvtl4Q= +base64-js@^1.0.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== + base64id@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" @@ -2135,6 +2343,11 @@ better-assert@~1.0.0: dependencies: callsite "1.0.0" +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + bignumber.js@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-2.4.0.tgz#838a992da9f9d737e0f4b2db0be62bb09dd0c5e8" @@ -2172,6 +2385,11 @@ bluebird@^3.1.1, bluebird@^3.3.5, bluebird@^3.4.6: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== +bluebird@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" + integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== + bmp-js@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.0.1.tgz#5ad0147099d13a9f38aa7b99af1d6e78666ed37f" @@ -2182,6 +2400,11 @@ bmp-js@0.0.3: resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.0.3.tgz#64113e9c7cf1202b376ed607bf30626ebe57b18a" integrity sha1-ZBE+nHzxICs3btYHvzBibr5XsYo= +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + body-parser@1.18.2: version "1.18.2" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" @@ -3062,11 +3285,75 @@ broccoli@^1.1.0: tmp "0.0.31" underscore.string "^3.2.2" +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + browser-process-hrtime@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" integrity sha1-Ql1opY00R/AqBKqJQYf86K+Le44= +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + browserslist@^2.1.2, browserslist@^2.11.3: version "2.11.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" @@ -3136,6 +3423,20 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" integrity sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ== +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -3146,6 +3447,11 @@ builtin-modules@^2.0.0: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-2.0.0.tgz#60b7ef5ae6546bd7deefa74b08b62a43a232648e" integrity sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg== +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" @@ -3161,6 +3467,26 @@ bytes@3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= +cacache@^11.0.2: + version "11.3.2" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa" + integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg== + dependencies: + bluebird "^3.5.3" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.3" + graceful-fs "^4.1.15" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -3450,7 +3776,7 @@ cheerio@^0.19.0: htmlparser2 "~3.8.1" lodash "^3.2.0" -chokidar@^2.0.0: +chokidar@^2.0.0, chokidar@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== @@ -3475,11 +3801,26 @@ chownr@^1.1.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== +chrome-trace-event@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" + integrity sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A== + dependencies: + tslib "^1.9.0" + ci-info@^1.1.3: version "1.6.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + circular-json@^0.3.1: version "0.3.3" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" @@ -3750,6 +4091,11 @@ common-tags@^1.4.0: dependencies: babel-runtime "^6.26.0" +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + component-bind@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" @@ -3790,7 +4136,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@1.6.2: +concat-stream@1.6.2, concat-stream@^1.5.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -3831,6 +4177,13 @@ connect@^3.3.3: parseurl "~1.3.2" utils-merge "1.0.1" +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= + dependencies: + date-now "^0.1.4" + console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" @@ -3855,6 +4208,11 @@ consolidate@^0.15.1: dependencies: bluebird "^3.1.1" +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + content-disposition@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" @@ -3892,6 +4250,18 @@ cookie@0.3.1, cookie@^0.3.1: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + copy-dereference@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/copy-dereference/-/copy-dereference-1.0.0.tgz#6b131865420fd81b413ba994b44d3655311152b6" @@ -3938,6 +4308,14 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + create-error-class@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" @@ -3945,6 +4323,29 @@ create-error-class@^3.0.0: dependencies: capture-stack-trace "^1.0.0" +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + cross-spawn@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" @@ -3985,6 +4386,23 @@ cryptiles@0.2.x: dependencies: boom "0.4.x" +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" @@ -4076,6 +4494,11 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" +cyclist@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= + dag-map@^2.0.1, dag-map@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/dag-map/-/dag-map-2.0.2.tgz#9714b472de82a1843de2fba9b6876938cab44c68" @@ -4106,6 +4529,11 @@ data-urls@^1.1.0: whatwg-mimetype "^2.2.0" whatwg-url "^7.0.0" +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= + date-time@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/date-time/-/date-time-2.1.0.tgz#0286d1b4c769633b3ca13e1e62558d2dbdc2eba2" @@ -4259,6 +4687,14 @@ depd@~1.1.1, depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" @@ -4298,6 +4734,15 @@ diff@^3.5.0: resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + dir-glob@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" @@ -4326,6 +4771,11 @@ dom-walk@^0.1.0: resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg= +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + domelementtype@1, domelementtype@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" @@ -4402,6 +4852,16 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.1.tgz#b1a7a29c4abfd639585efaecce80d666b1e34125" + integrity sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" @@ -4434,6 +4894,19 @@ electron-to-chromium@^1.3.47: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0" integrity sha1-0tnxJwuko7lnuDHEDvcftNmrXOA= +elliptic@^6.0.0: + version "6.4.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" + integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + ember-ajax@^3.1.0: version "3.1.3" resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-3.1.3.tgz#f51b8e3e36765575a2698c8660e377d4d6371642" @@ -4465,6 +4938,36 @@ ember-assign-polyfill@~2.4.0: ember-cli-babel "^6.6.0" ember-cli-version-checker "^2.0.0" +ember-auto-import@^1.2.19: + version "1.2.19" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.2.19.tgz#69a2da0d2c16ab88989c51381c415214e85d1af3" + integrity sha512-OT7I3zrIAv/rbbYJFZNqfJi/2HpAscjOWOaBPPUj8VkUnY26HlLO6mSzDIkoUOaTAEWiy2GzjenHGj6b9rivxw== + dependencies: + "@babel/core" "^7.1.6" + "@babel/traverse" "^7.1.6" + "@babel/types" "^7.1.6" + babel-core "^6.26.3" + babel-plugin-syntax-dynamic-import "^6.18.0" + babel-template "^6.26.0" + babylon "^6.18.0" + broccoli-debug "^0.6.4" + broccoli-plugin "^1.3.0" + debug "^3.1.0" + ember-cli-babel "^6.6.0" + enhanced-resolve "^4.0.0" + fs-extra "^6.0.1" + fs-tree-diff "^0.5.7" + handlebars "^4.0.11" + js-string-escape "^1.0.1" + lodash "^4.17.10" + mkdirp "^0.5.1" + pkg-up "^2.0.0" + resolve "^1.7.1" + rimraf "^2.6.2" + symlink-or-copy "^1.2.0" + walk-sync "^0.3.3" + webpack "^4.12.0" + ember-cli-addon-docs-esdoc@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ember-cli-addon-docs-esdoc/-/ember-cli-addon-docs-esdoc-0.2.1.tgz#fcb2f1792f1bd4d6a5df8205f7b6e555abbcd1b9" @@ -5670,12 +6173,17 @@ emit-function@0.0.2: resolved "https://registry.yarnpkg.com/emit-function/-/emit-function-0.0.2.tgz#e3a50b3d61be1bf8ca88b924bf713157a5bec124" integrity sha1-46ULPWG+G/jKiLkkv3ExV6W+wSQ= +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + encodeurl@~1.0.1, encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -end-of-stream@^1.1.0: +end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== @@ -5722,6 +6230,15 @@ engine.io@~3.3.1: engine.io-parser "~2.1.0" ws "~6.1.0" +enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + ensure-posix-path@^1.0.0, ensure-posix-path@^1.0.1, ensure-posix-path@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.0.2.tgz#a65b3e42d0b71cfc585eb774f9943c8d9b91b0c2" @@ -5737,6 +6254,13 @@ entities@^1.1.1, entities@~1.1.1: resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" integrity sha1-blwtClYhtdra7O+AuQ7ftc13cvA= +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + error-ex@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" @@ -5879,6 +6403,14 @@ eslint-scope@3.7.1, eslint-scope@^3.7.1: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-scope@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" + integrity sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + eslint-utils@^1.3.0, eslint-utils@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" @@ -6010,6 +6542,19 @@ events-to-array@^1.0.1: resolved "https://registry.yarnpkg.com/events-to-array/-/events-to-array-1.1.2.tgz#2d41f563e1fe400ed4962fe1a4d5c6a7539df7f6" integrity sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y= +events@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" + integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + exec-file-sync@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/exec-file-sync/-/exec-file-sync-2.0.2.tgz#58d441db46e40de6d1f30de5be022785bd89e328" @@ -6489,6 +7034,11 @@ fd-slicer@~1.0.1: dependencies: pend "~1.2.0" +figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -6574,6 +7124,15 @@ find-babel-config@^1.1.0: json5 "^0.5.1" path-exists "^3.0.0" +find-cache-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d" + integrity sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA== + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^3.0.0" + find-index@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-index/-/find-index-1.1.0.tgz#53007c79cd30040d6816d79458e8837d5c5705ef" @@ -6666,6 +7225,14 @@ flat-cache@^1.2.1: graceful-fs "^4.1.2" write "^0.2.1" +flush-write-stream@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" + integrity sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw== + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.4" + follow-redirects@^1.0.0: version "1.6.1" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.6.1.tgz#514973c44b5757368bad8bddfe52f81f015c94cb" @@ -6746,7 +7313,7 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -from2@^2.1.1: +from2@^2.1.0, from2@^2.1.1: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= @@ -6881,6 +7448,16 @@ fs-updater@^1.0.4: heimdalljs-logger "^0.1.9" rimraf "^2.6.2" +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -7310,6 +7887,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= +graceful-fs@^4.1.15: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== + "graceful-readlink@>= 1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" @@ -7320,6 +7902,17 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= +handlebars@^4.0.11, handlebars@^4.0.6: + version "4.0.12" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" + integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA== + dependencies: + async "^2.5.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + handlebars@^4.0.4: version "4.0.11" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" @@ -7331,17 +7924,6 @@ handlebars@^4.0.4: optionalDependencies: uglify-js "^2.6" -handlebars@^4.0.6: - version "4.0.12" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" - integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA== - dependencies: - async "^2.5.0" - optimist "^0.6.1" - source-map "^0.6.1" - optionalDependencies: - uglify-js "^3.1.4" - har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -7469,6 +8051,14 @@ has@^1.0.1, has@^1.0.3: dependencies: function-bind "^1.1.1" +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + hash-for-dep@^1.0.2, hash-for-dep@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.2.3.tgz#5ec69fca32c23523972d52acb5bb65ffc3664cab" @@ -7479,6 +8069,14 @@ hash-for-dep@^1.0.2, hash-for-dep@^1.2.3: heimdalljs-logger "^0.1.7" resolve "^1.4.0" +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + hasha@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1" @@ -7544,6 +8142,15 @@ highlightjs@^9.10.0: resolved "https://registry.yarnpkg.com/highlightjs/-/highlightjs-9.10.0.tgz#fca9b78ddaa3b1abca89d6c3ee105ad270a80190" integrity sha1-/Km3jdqjsavKidbD7hBa0nCoAZA= +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + hoek@0.9.x: version "0.9.1" resolved "https://registry.yarnpkg.com/hoek/-/hoek-0.9.1.tgz#3d322462badf07716ea7eb85baf88079cddce505" @@ -7679,6 +8286,11 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + ice-cap@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/ice-cap/-/ice-cap-0.0.4.tgz#8a6d31ab4cac8d4b56de4fa946df3352561b6e18" @@ -7706,6 +8318,16 @@ iconv-lite@0.4.24, iconv-lite@^0.4.4: dependencies: safer-buffer ">= 2.1.2 < 3" +ieee754@^1.1.4: + version "1.1.12" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" + integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + ignore-walk@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" @@ -7793,6 +8415,11 @@ inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, i resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" @@ -8220,7 +8847,7 @@ isarray@0.0.1: resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= -isarray@1.0.0, isarray@~1.0.0: +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= @@ -8349,6 +8976,11 @@ js-reporters@1.2.1: resolved "https://registry.yarnpkg.com/js-reporters/-/js-reporters-1.2.1.tgz#f88c608e324a3373a95bcc45ad305e5c979c459b" integrity sha1-+IxgjjJKM3OpW8xFrTBeXJecRZs= +js-string-escape@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" + integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= + js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" @@ -8518,6 +9150,11 @@ json-buffer@3.0.0: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" @@ -8555,6 +9192,13 @@ json5@^0.5.1: resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + json5@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" @@ -8747,6 +9391,20 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" +loader-runner@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + loader.js@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/loader.js/-/loader.js-4.7.0.tgz#a1a52902001c83631efde9688b8ab3799325ef1f" @@ -9302,6 +9960,13 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + lunr@^2.3.3: version "2.3.5" resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.5.tgz#7b510bad57e948dfb99a71fdff00c1bf9171bdda" @@ -9440,6 +10105,15 @@ md5-o-matic@^0.1.1: resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" integrity sha1-givM1l4RfFFPqxdrJZRdVBAKA8M= +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + md5@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" @@ -9464,6 +10138,14 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +memory-fs@^0.4.0, memory-fs@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + memory-streams@^0.1.0, memory-streams@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/memory-streams/-/memory-streams-0.1.3.tgz#d9b0017b4b87f1d92f55f2745c9caacb1dc93ceb" @@ -9572,7 +10254,7 @@ micromatch@^3.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -micromatch@^3.1.10, micromatch@^3.1.4: +micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -9591,6 +10273,14 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + "mime-db@>= 1.36.0 < 2", mime-db@~1.37.0: version "1.37.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" @@ -9652,6 +10342,16 @@ min-document@^2.19.0: dependencies: dom-walk "^0.1.0" +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + "minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -9689,6 +10389,22 @@ minizlib@^1.1.1: dependencies: minipass "^2.2.1" +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + mixin-deep@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.0.tgz#47a8732ba97799457c8c1eca28f95132d7e8150a" @@ -9697,7 +10413,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: +mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -9742,6 +10458,18 @@ mout@^1.0.0: resolved "https://registry.yarnpkg.com/mout/-/mout-1.1.0.tgz#0b29d41e6a80fa9e2d4a5be9d602e1d9d02177f6" integrity sha512-XsP0vf4As6BfqglxZqbqQ8SR6KQot2AgxvR0gG+WtUkf90vUXchMOZQtPf/Hml1rEffJupqL/tIrU6EYhsUQjw== +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + ms@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" @@ -9853,6 +10581,11 @@ negotiator@0.6.1: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= +neo-async@^2.5.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" + integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -9893,6 +10626,35 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= +node-libs-browser@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77" + integrity sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.0" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "0.0.4" + node-modules-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/node-modules-path/-/node-modules-path-1.0.1.tgz#40096b08ce7ad0ea14680863af449c7c75a5d1c8" @@ -10239,6 +11001,11 @@ ora@^2.0.0: strip-ansi "^4.0.0" wcwidth "^1.0.1" +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -10347,6 +11114,32 @@ package-json@^4.0.1: registry-url "^3.0.3" semver "^5.1.0" +pako@~1.0.5: + version "1.0.8" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.8.tgz#6844890aab9c635af868ad5fecc62e8acbba3ea4" + integrity sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA== + +parallel-transform@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY= + dependencies: + cyclist "~0.2.2" + inherits "^2.0.3" + readable-stream "^2.1.5" + +parse-asn1@^5.0.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.3.tgz#1600c6cc0727365d68b97f3aa78939e735a75204" + integrity sha512-VrPoetlz7B/FqjBLD2f5wBVZvsZVLnRUrxVLfRYhGXCODa/NWE4p3Wp+6+aV3ZPL3KM7/OZmxDIwwijD7yuucg== + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + parse-bmfont-ascii@^1.0.3: version "1.0.6" resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285" @@ -10462,6 +11255,11 @@ passwd-user@^1.2.1: dependencies: exec-file-sync "^2.0.0" +path-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= + path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" @@ -10535,6 +11333,17 @@ pathval@^1.1.0: resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= +pbkdf2@^3.0.3: + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" @@ -10605,6 +11414,13 @@ pixelmatch@^4.0.0: dependencies: pngjs "^3.0.0" +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" @@ -10825,6 +11641,11 @@ process-relative-require@^1.0.0: dependencies: node-modules-path "^1.0.0" +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + process@~0.5.1: version "0.5.2" resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" @@ -10840,6 +11661,11 @@ progress@^2.0.0: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" integrity sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8= +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + promise-map-series@^0.2.1, promise-map-series@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/promise-map-series/-/promise-map-series-0.2.3.tgz#c2d377afc93253f6bd03dbb77755eb88ab20a847" @@ -10863,6 +11689,11 @@ proxy-addr@~2.0.3, proxy-addr@~2.0.4: forwarded "~0.1.2" ipaddr.js "1.8.0" +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -10878,6 +11709,26 @@ psl@^1.1.28: resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -10886,12 +11737,26 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + punycode@2.x.x, punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -punycode@^1.4.1: +punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= @@ -10925,6 +11790,16 @@ query-string@^5.0.1: object-assign "^4.1.0" strict-uri-encode "^1.0.0" +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + quick-temp@^0.1.0, quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quick-temp@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/quick-temp/-/quick-temp-0.1.8.tgz#bab02a242ab8fb0dd758a3c9776b32f9a5d94408" @@ -10964,6 +11839,21 @@ randomatic@^3.0.0: kind-of "^6.0.0" math-random "^1.0.1" +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" + integrity sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" @@ -11043,17 +11933,7 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -readable-stream@1.1: - version "1.1.13" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" - integrity sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.1.5: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.4, readable-stream@^2.1.5, readable-stream@^2.3.3, readable-stream@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -11066,6 +11946,16 @@ readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.1.5: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@1.1: + version "1.1.13" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" + integrity sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" @@ -11544,6 +12434,14 @@ rimraf@~2.2.6: resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + rollup-plugin-commonjs@^8.3.0: version "8.4.1" resolved "http://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.4.1.tgz#5c9cea2b2c3de322f5fbccd147e07ed5e502d7a0" @@ -11636,6 +12534,13 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + rx-lite-aggregates@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" @@ -11658,7 +12563,7 @@ safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, s resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== -safe-buffer@5.1.2, safe-buffer@^5.1.2: +safe-buffer@5.1.2, safe-buffer@^5.1.0, safe-buffer@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -11755,6 +12660,23 @@ saxes@^3.1.4: dependencies: xmlchars "^1.3.1" +schema-utils@^0.4.4: + version "0.4.7" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" + integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + scss-tokenizer@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" @@ -11826,6 +12748,11 @@ send@0.16.2: range-parser "~1.2.0" statuses "~1.4.0" +serialize-javascript@^1.4.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.6.1.tgz#4d1f697ec49429a847ca6f442a2a755126c4d879" + integrity sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw== + serve-static@1.13.1: version "1.13.1" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" @@ -11878,6 +12805,11 @@ set-value@^2.0.0: is-plain-object "^2.0.3" split-string "^3.0.1" +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + setprototypeof@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" @@ -11888,6 +12820,14 @@ setprototypeof@1.1.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -12049,6 +12989,11 @@ sort-package-json@^1.15.0: detect-indent "^5.0.0" sort-object-keys "^1.1.2" +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + source-map-resolve@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" @@ -12214,6 +13159,13 @@ sshpk@^1.7.0: jsbn "~0.1.0" tweetnacl "~0.14.0" +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -12249,6 +13201,38 @@ stealthy-require@^1.1.0: resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= + stream-to-array@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/stream-to-array/-/stream-to-array-2.3.0.tgz#bbf6b39f5f43ec30bc71babcb37557acecf34353" @@ -12305,6 +13289,13 @@ string_decoder@0.10, string_decoder@~0.10.x: resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= +string_decoder@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" + integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== + dependencies: + safe-buffer "~5.1.0" + string_decoder@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" @@ -12515,6 +13506,11 @@ tap-parser@^7.0.0: js-yaml "^3.2.7" minipass "^2.2.0" +tapable@^1.0.0, tapable@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e" + integrity sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA== + tar@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" @@ -12545,7 +13541,21 @@ temp@0.8.3: os-tmpdir "^1.0.0" rimraf "~2.2.6" -terser@^3.7.5: +terser-webpack-plugin@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.1.tgz#7545da9ae5f4f9ae6a0ac961eb46f5e7c845cc26" + integrity sha512-GGSt+gbT0oKcMDmPx4SRSfJPE1XaN3kQRWG4ghxKQw9cn5G9x6aCKSsgYdvyM0na9NJ4Drv0RG6jbBByZ5CMjw== + dependencies: + cacache "^11.0.2" + find-cache-dir "^2.0.0" + schema-utils "^1.0.0" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + terser "^3.8.1" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" + +terser@^3.7.5, terser@^3.8.1: version "3.14.1" resolved "https://registry.yarnpkg.com/terser/-/terser-3.14.1.tgz#cc4764014af570bc79c79742358bd46926018a32" integrity sha512-NSo3E99QDbYSMeJaEk9YW2lTg3qS9V0aKGlb+PlOrei1X02r1wSBHCNX/O+yeTRFSWPKPIGj6MqvvdqV4rnVGw== @@ -12644,6 +13654,13 @@ timed-out@^4.0.0, timed-out@^4.0.1: resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= +timers-browserify@^2.0.4: + version "2.0.10" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" + integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg== + dependencies: + setimmediate "^1.0.4" + tiny-emitter@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.0.2.tgz#82d27468aca5ade8e5fd1e6d22b57dd43ebdfb7c" @@ -12704,6 +13721,11 @@ to-array@0.1.4: resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" @@ -12839,6 +13861,16 @@ trim@0.0.1: dependencies: glob "^6.0.4" +tslib@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -12973,6 +14005,20 @@ uniq@^1.0.1: resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" + integrity sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg== + dependencies: + imurmurhash "^0.1.4" + unique-stream@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" @@ -13061,6 +14107,14 @@ url-to-options@^1.0.1: resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + use@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8" @@ -13104,6 +14158,20 @@ util.promisify@^1.0.0: define-properties "^1.1.2" object.getownpropertydescriptors "^2.0.3" +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -13172,6 +14240,13 @@ vlq@^0.2.2: resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== +vm-browserify@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= + dependencies: + indexof "0.0.1" + w3c-hr-time@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" @@ -13251,6 +14326,15 @@ watch@~0.18.0: exec-sh "^0.2.0" minimist "^1.2.0" +watchpack@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== + dependencies: + chokidar "^2.0.2" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" @@ -13268,6 +14352,44 @@ webidl-conversions@^4.0.2: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== +webpack-sources@^1.1.0, webpack-sources@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" + integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.12.0: + version "4.29.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.29.0.tgz#f2cfef83f7ae404ba889ff5d43efd285ca26e750" + integrity sha512-pxdGG0keDBtamE1mNvT5zyBdx+7wkh6mh7uzMOo/uRQ/fhsdj5FXkh/j5mapzs060forql1oXqXN9HJGju+y7w== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-module-context" "1.7.11" + "@webassemblyjs/wasm-edit" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" + acorn "^6.0.5" + acorn-dynamic-import "^4.0.0" + ajv "^6.1.0" + ajv-keywords "^3.1.0" + chrome-trace-event "^1.0.0" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.0" + json-parse-better-errors "^1.0.2" + loader-runner "^2.3.0" + loader-utils "^1.1.0" + memory-fs "~0.4.1" + micromatch "^3.1.8" + mkdirp "~0.5.0" + neo-async "^2.5.0" + node-libs-browser "^2.0.0" + schema-utils "^0.4.4" + tapable "^1.1.0" + terser-webpack-plugin "^1.1.0" + watchpack "^1.5.0" + webpack-sources "^1.3.0" + websocket-driver@>=0.5.1: version "0.7.0" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" @@ -13391,6 +14513,13 @@ wordwrap@~1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= +worker-farm@^1.5.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" + integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ== + dependencies: + errno "~0.1.7" + workerpool@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-2.3.0.tgz#86c5cbe946b55e7dc9d12b1936c8801a6e2d744d" @@ -13521,6 +14650,11 @@ y18n@^3.2.0, y18n@^3.2.1: resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" From 8cd7ee46d98d10d5333d61dc65bf68e9092d068e Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 2 Feb 2019 10:19:17 -0500 Subject: [PATCH 299/879] internal: test for app excluding mirage --- .../app/templates/application.hbs | 14 ++++++++++++++ .../02-app-that-excludes-mirage/package.json | 3 ++- .../tests/acceptance/modules-test.js | 13 +++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 test-projects/02-app-that-excludes-mirage/tests/acceptance/modules-test.js diff --git a/test-projects/02-app-that-excludes-mirage/app/templates/application.hbs b/test-projects/02-app-that-excludes-mirage/app/templates/application.hbs index d94ba08e5..4641b1a20 100644 --- a/test-projects/02-app-that-excludes-mirage/app/templates/application.hbs +++ b/test-projects/02-app-that-excludes-mirage/app/templates/application.hbs @@ -3,3 +3,17 @@ {{#if wifi.isConnected}}

    We ran the initializer

    {{/if}} + +

    + Mirage modules in project: + + {{mirageModules.length}} + +

    + +

    + Other modules in project: + + {{otherIncludedModules.length}} + +

    diff --git a/test-projects/02-app-that-excludes-mirage/package.json b/test-projects/02-app-that-excludes-mirage/package.json index 56b4a96e9..0e6ec44fe 100644 --- a/test-projects/02-app-that-excludes-mirage/package.json +++ b/test-projects/02-app-that-excludes-mirage/package.json @@ -42,7 +42,8 @@ "fastboot": "*", "jsdom": "*", "loader.js": "*", - "qunit": "*" + "qunit": "*", + "qunit-dom": "*" }, "engines": { "node": ">= 8.*" diff --git a/test-projects/02-app-that-excludes-mirage/tests/acceptance/modules-test.js b/test-projects/02-app-that-excludes-mirage/tests/acceptance/modules-test.js new file mode 100644 index 000000000..5974b8c45 --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/tests/acceptance/modules-test.js @@ -0,0 +1,13 @@ +import { test } from 'qunit'; +import moduleForAcceptance from 'basic-app/tests/helpers/module-for-acceptance'; + +moduleForAcceptance('Acceptance | modules'); + +test('only 1 module (the no-op initializer) is included in the build', function(assert) { + visit('/'); + + andThen(function() { + assert.dom('[data-test-id="mirage-module-count"]').hasText('0'); + assert.dom('[data-test-id="other-module-count"]').hasText('1'); + }); +}); From 4e26e0da93647bd05f7521d04e73ae55b6ac7ad4 Mon Sep 17 00:00:00 2001 From: simonihmig Date: Tue, 5 Feb 2019 21:12:48 +0100 Subject: [PATCH 300/879] Omit default Content-Type header for 204 responses As a 204 response has no response body, a Content-Type is basically meaningless. It doesn't seem to be a violation of any spec to have one AFAICT, but as it is optional and does not make sense here, it seems better to not add it automatically. --- addon/response.js | 2 +- tests/integration/server/custom-responses-test.js | 2 +- tests/unit/response-test.js | 14 ++++++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/addon/response.js b/addon/response.js index 08216881c..1cb5139ea 100644 --- a/addon/response.js +++ b/addon/response.js @@ -44,7 +44,7 @@ export default class Response { } // Default "untyped" responses to application/json - if (!this.headers.hasOwnProperty('Content-Type')) { + if (code !== 204 && !this.headers.hasOwnProperty('Content-Type')) { this.headers['Content-Type'] = 'application/json'; } } diff --git a/tests/integration/server/custom-responses-test.js b/tests/integration/server/custom-responses-test.js index 63debd954..7c1556d16 100644 --- a/tests/integration/server/custom-responses-test.js +++ b/tests/integration/server/custom-responses-test.js @@ -61,7 +61,7 @@ module('Integration | Server | Custom responses', function(hooks) { assert.deepEqual(data, undefined); assert.equal(xhr.responseText, ''); assert.equal(xhr.status, 204); - assert.equal(xhr.getAllResponseHeaders().trim(), "Content-Type: application/json"); + assert.equal(xhr.getAllResponseHeaders().trim(), ''); }); }); diff --git a/tests/unit/response-test.js b/tests/unit/response-test.js index 74843b7c6..63fd4e277 100644 --- a/tests/unit/response-test.js +++ b/tests/unit/response-test.js @@ -16,4 +16,18 @@ module('Unit | Response', function() { assert.ok(response); assert.ok(response.toRackResponse()); }); + + test('it adds Content-Type by default', function(assert) { + let response = new Response(200, {}, {}); + + assert.ok(response); + assert.equal(response.headers['Content-Type'], 'application/json'); + }); + + test('it does not add Content-Type for a 204 response', function(assert) { + let response = new Response(204); + + assert.ok(response); + assert.notOk(response.headers['Content-Type']); + }); }); From d7db04ab4cba4ad5d5f36c846e32cf6ce9a4e4d5 Mon Sep 17 00:00:00 2001 From: Christopher Gammie Date: Tue, 5 Feb 2019 15:08:29 +0000 Subject: [PATCH 301/879] Fix prefix example code Believe this needs to be `this.urlPrefix` instead of the existing `this.prefix`. --- addon/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addon/server.js b/addon/server.js index ff4f19ab8..649e3ea74 100644 --- a/addon/server.js +++ b/addon/server.js @@ -231,7 +231,7 @@ export default class Server { ```js // mirage/config.js export default function() { - this.prefix = 'http://localhost:8080' + this.urlPrefix = 'http://localhost:8080' }; ``` */ From 14da4227fb2518407ffb5df55b4e695815ad2bc6 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 6 Feb 2019 17:29:00 -0500 Subject: [PATCH 302/879] Add back in old 3->4 upgrade notes --- .../getting-started/upgrading/template.md | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/tests/dummy/app/pods/docs/getting-started/upgrading/template.md b/tests/dummy/app/pods/docs/getting-started/upgrading/template.md index 953eef0ab..60179ed2b 100644 --- a/tests/dummy/app/pods/docs/getting-started/upgrading/template.md +++ b/tests/dummy/app/pods/docs/getting-started/upgrading/template.md @@ -19,6 +19,77 @@ You can view Mirage's full Changelog here: [https://github.com/samselikoff/ember-cli-mirage/blob/master/CHANGELOG.md](https://github.com/samselikoff/ember-cli-mirage/blob/master/CHANGELOG.md) +## 0.3.x > 0.4 Upgrade guide + +There is one primary change in 0.4 that could break your 0.3 app. + +In 0.3.x, Mirage's JSONAPISerializer included all related foreign keys whenever serializing a model or collection, even if those relationships were not being `included` in the payload. + +This actually goes against JSON:API's design. Foreign keys in the payload are known as [Resource Linkage](http://jsonapi.org/format/#document-resource-object-linkage) and are intended to be used by API clients to link together all resources in a JSON:API compound document. In fact, most server-side JSON:API libraries do not automatically serialize all related foreign keys, and only return linkage data for related resources when they are being included in the current document. + +By including linkage data for every relationship in 0.3, it was easy to develop Ember apps that would work with Mirage but would behave differently when hooked up to a standard JSON:API server. Since Mirage always included linkage data, an Ember app might automatically be able to fetch related resources using the ids from that linkage data plus its knowledge about the API. For example, if a `post` came back like this: + +```js +// GET /posts/1 +{ + data: { + type: 'posts', + id: '1', + attributes: { ... }, + relationships: { + author: { + data: { + type: 'users', + id: '1' + } + } + } + } +} +``` + +and you forgot to `?include=author` in your GET request, Ember Data would potentially use the `user:1` foreign key and lazily fetch the `author` by making a request to `GET /authors/1`. This is problematic because + +1. This is not how foreign keys are intended to be used +2. It'd be better to see no data and fix the problem by going back up to your data-loading code and add `?include=author` to your GET request, or +3. If you do want your interface to lazily load the author, use resource `links` instead of the resource linkage `data`: + +```js +// GET /posts/1 +{ + data: { + type: 'posts', + id: '1', + attributes: { ... }, + relationships: { + author: { + links: { + related: '/api/users/1' + } + } + } + } +} +``` + +Resource links can be defined on Mirage serializers using the [links](http://www.ember-cli-mirage.com/docs/v0.3.x/serializers/#linksmodel) method (though `including` is likely the far more simpler and common approach to fetching related data). + +So, Mirage 0.4 changed this behavior and by default, the JSONAPISerializer only includes linkage data for relationships that are being included in the current payload (i.e. within the same compound document). + +This behavior is configurable via the `alwaysIncludeLinkageData` key on your JSONAPISerializers. It is set to `false` by default, but if you want to opt-in to 0.3 behavior and always include linkage data, set it to `true`: + +```js +// mirage/serializers/application.js +import { JSONAPISerializer } from 'ember-cli-mirage'; + +export default JSONAPISerializer.extend({ + alwaysIncludeLinkageData: true +}); +``` + +If you do this, I would recommend looking closely at how your real server behaves when serializing resources' relationships and whether it uses resource `links` or resource linkage `data`, and to update your Mirage code accordingly to give you the most faithful representation of your server. + + ## 0.2.x > 0.3 Upgrade guide The main change from 0.2.x to 0.3.x is that relationships are now one-way. This better matches the semantics of both Ember Data and common HTTP transfer protocols like JSON:API. From 152f1926626bd6f502985154a28ec824b13cfc35 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 1 Feb 2019 18:29:27 -0500 Subject: [PATCH 303/879] Gh issues for blog --- .template-lintrc.js | 5 +- package.json | 5 + tests/dummy/app/adapters/post.js | 114 ++++++++++ tests/dummy/app/models/comment.js | 18 ++ tests/dummy/app/models/post.js | 36 ++++ tests/dummy/app/models/user.js | 9 + .../template.md | 23 -- .../2015-09-10-orm-not-ready-yet/template.md | 18 -- .../2015-09-15-router-handler/template.md | 11 - .../2015-10-19-serializers-ready/template.md | 84 -------- .../template.md | 7 - .../template.md | 196 ------------------ .../template.md | 72 ------- .../2016-05-31-0-2-0-released/template.md | 30 --- .../2017-01-09-0-3-0-beta-series/template.md | 173 ---------------- .../template.md | 89 -------- .../template.md | 78 ------- tests/dummy/app/pods/blog/detail/route.js | 17 ++ tests/dummy/app/pods/blog/detail/template.hbs | 52 +++++ tests/dummy/app/pods/blog/error/template.hbs | 5 + tests/dummy/app/pods/blog/index/controller.js | 114 +++++----- .../app/pods/blog/{post => index}/route.js | 4 +- tests/dummy/app/pods/blog/index/template.hbs | 9 +- tests/dummy/app/pods/blog/post/template.hbs | 7 - tests/dummy/app/pods/not-found/route.js | 87 +++++--- tests/dummy/app/router.js | 2 +- tests/dummy/app/serializers/post.js | 4 + tests/dummy/app/styles/app.css | 61 +++++- tests/dummy/app/utils/render-markdown.js | 84 ++++++++ tests/dummy/mirage/config.js | 7 + yarn.lock | 72 ++++++- 31 files changed, 609 insertions(+), 884 deletions(-) create mode 100644 tests/dummy/app/adapters/post.js create mode 100644 tests/dummy/app/models/comment.js create mode 100644 tests/dummy/app/models/post.js create mode 100644 tests/dummy/app/models/user.js delete mode 100644 tests/dummy/app/pods/blog/data/2015-09-06-thoughts-on-model-attribute-formatting/template.md delete mode 100644 tests/dummy/app/pods/blog/data/2015-09-10-orm-not-ready-yet/template.md delete mode 100644 tests/dummy/app/pods/blog/data/2015-09-15-router-handler/template.md delete mode 100644 tests/dummy/app/pods/blog/data/2015-10-19-serializers-ready/template.md delete mode 100644 tests/dummy/app/pods/blog/data/2015-11-03-inside-ember-cli-mirage/template.md delete mode 100644 tests/dummy/app/pods/blog/data/2016-01-03-0-2-0-beta-9-released/template.md delete mode 100644 tests/dummy/app/pods/blog/data/2016-01-03-0-2-update-only-inject-schema/template.md delete mode 100644 tests/dummy/app/pods/blog/data/2016-05-31-0-2-0-released/template.md delete mode 100644 tests/dummy/app/pods/blog/data/2017-01-09-0-3-0-beta-series/template.md delete mode 100644 tests/dummy/app/pods/blog/data/2017-06-05-polymorphic-associations-and-auto-discovery-of-ember-data-models/template.md delete mode 100644 tests/dummy/app/pods/blog/data/2018-02-01-changing-mirages-default-linkage-data-behavior/template.md create mode 100644 tests/dummy/app/pods/blog/detail/route.js create mode 100644 tests/dummy/app/pods/blog/detail/template.hbs create mode 100644 tests/dummy/app/pods/blog/error/template.hbs rename tests/dummy/app/pods/blog/{post => index}/route.js (61%) delete mode 100644 tests/dummy/app/pods/blog/post/template.hbs create mode 100644 tests/dummy/app/serializers/post.js create mode 100644 tests/dummy/app/utils/render-markdown.js diff --git a/.template-lintrc.js b/.template-lintrc.js index b45e96ffd..3da23f5d6 100644 --- a/.template-lintrc.js +++ b/.template-lintrc.js @@ -1,5 +1,8 @@ 'use strict'; module.exports = { - extends: 'recommended' + extends: 'recommended', + rules: { + 'block-indentation': false + } }; diff --git a/package.json b/package.json index 95e0d3b1e..4cde04852 100644 --- a/package.json +++ b/package.json @@ -77,16 +77,19 @@ "ember-cli-htmlbars": "^3.0.0", "ember-cli-htmlbars-inline-precompile": "^1.0.3", "ember-cli-inject-live-reload": "^1.8.2", + "ember-cli-moment-shim": "^3.7.1", "ember-cli-qunit": "^4.4.0", "ember-cli-release": "^0.2.9", "ember-cli-sri": "^2.1.1", "ember-cli-template-lint": "^1.0.0-beta.1", "ember-cli-uglify": "^2.1.0", + "ember-composable-helpers": "^2.1.0", "ember-data": "~3.4.4", "ember-disable-prototype-extensions": "^1.1.3", "ember-export-application-global": "^2.0.0", "ember-load-initializers": "^1.1.0", "ember-maybe-import-regenerator": "^0.1.6", + "ember-moment": "^7.8.1", "ember-resolver": "^5.0.1", "ember-source": "~3.4.0", "ember-source-channel-url": "^1.1.0", @@ -95,8 +98,10 @@ "eslint-plugin-ember-suave": "^1.0.0", "eslint-plugin-node": "^7.0.1", "fastboot": "^1.2.0", + "js-yaml": "^3.12.1", "jsdom": "^13.1.0", "loader.js": "^4.7.0", + "marked": "^0.6.0", "qunit-dom": "^0.8.4" }, "engines": { diff --git a/tests/dummy/app/adapters/post.js b/tests/dummy/app/adapters/post.js new file mode 100644 index 000000000..12009ccf0 --- /dev/null +++ b/tests/dummy/app/adapters/post.js @@ -0,0 +1,114 @@ +import $ from 'jquery'; +import { Promise } from 'rsvp'; +import DS from 'ember-data'; + +const BASE_URL = 'https://api.github.com/repos/samselikoff/ember-cli-mirage'; + +export default DS.JSONAPIAdapter.extend({ + + findRecord(store, type, id, snapshot) { + let url = `${BASE_URL}/issues/${id}`; + + return new Promise((resolve, reject) => { + $.getJSON(url).then(json => { + let jsonApiDocument = { + data: { + id, + type: 'posts', + attributes: { + title: json.title, + body: json.body, + 'issue-url': json.html_url + }, + relationships: { + comments: { + links: { + related: json.comments_url + } + } + } + } + }; + + resolve(jsonApiDocument); + }, jqXHR => { + reject(jqXHR); + }); + }); + }, + + findAll(store, type) { + let url = `${BASE_URL}/issues?state=closed&labels=Blog%20post`; + + return new Promise((resolve, reject) => { + $.getJSON(url).then(json => { + this.hasLoadedAllPosts = true; + + let jsonApiDocument = { + data: json.map(obj => ({ + id: obj.number, + type: 'posts', + attributes: { + title: obj.title, + body: obj.body, + 'issue-url': obj.html_url + } + })) + }; + + resolve(jsonApiDocument); + }, jqXHR => { + reject(jqXHR); + }); + }); + }, + + shouldReloadAll(store, snapshotArray) { + return !this.hasLoadedAllPosts; + }, + + findHasMany(store, snapshot, url, relationship) { + return new Promise((resolve, reject) => { + $.getJSON(url).then(json => { + let jsonApiDocument = { data: [], included: [] }; + let includedUserHash = {}; + + json.forEach(obj => { + jsonApiDocument.data.push({ + id: obj.id, + type: 'comments', + attributes: { + body: obj.body, + permalink: obj.html_url, + 'created-at': obj.created_at + }, + relationships: { + user: { + data: { type: 'users', id: obj.user.id } + } + } + }); + + includedUserHash[obj.user.id] = obj.user; + }); + + Object.keys(includedUserHash).forEach(key => { + let user = includedUserHash[key]; + jsonApiDocument.included.push({ + type: 'users', + id: user.id, + attributes: { + 'avatar-url': user.avatar_url, + 'profile-url': user.html_url, + username: user.login + } + }); + }); + + resolve(jsonApiDocument); + }, jqXHR => { + reject(jqXHR); + }); + }); + } +}); diff --git a/tests/dummy/app/models/comment.js b/tests/dummy/app/models/comment.js new file mode 100644 index 000000000..49c54adf6 --- /dev/null +++ b/tests/dummy/app/models/comment.js @@ -0,0 +1,18 @@ +import DS from 'ember-data'; +import renderMarkdown from 'dummy/utils/render-markdown'; +import { htmlSafe } from '@ember/string'; +import { computed } from '@ember/object'; + +export default DS.Model.extend({ + + user: DS.belongsTo(), + + body: DS.attr(), + permalink: DS.attr(), + createdAt: DS.attr(), + + htmlBody: computed('body', function() { + return htmlSafe(renderMarkdown(this.body)); + }) + +}); diff --git a/tests/dummy/app/models/post.js b/tests/dummy/app/models/post.js new file mode 100644 index 000000000..20205203d --- /dev/null +++ b/tests/dummy/app/models/post.js @@ -0,0 +1,36 @@ +import DS from 'ember-data'; +import { computed } from '@ember/object'; +import yaml from 'js-yaml'; +import renderMarkdown from 'dummy/utils/render-markdown'; +import { htmlSafe } from '@ember/string'; + +export default DS.Model.extend({ + + comments: DS.hasMany(), + + title: DS.attr(), + body: DS.attr(), + issueUrl: DS.attr(), + + htmlBody: computed('body', function() { + return htmlSafe(renderMarkdown(this.body)); + }), + + meta: computed('body', function() { + let lines = this.body.split('\n').map(line => line.trim()); + let firstLine = lines[0]; + + if (firstLine === ''); + let metaLines = lines.slice(1, lastIndex); + let meta = yaml.safeLoad(`${metaLines.join('\n')}`); + + return meta; + } + }), + + slugAndId: computed('slug', 'id', function() { + return `${this.meta.slug}-${this.id}`; + }) + +}); diff --git a/tests/dummy/app/models/user.js b/tests/dummy/app/models/user.js new file mode 100644 index 000000000..200ac6111 --- /dev/null +++ b/tests/dummy/app/models/user.js @@ -0,0 +1,9 @@ +import DS from 'ember-data'; + +export default DS.Model.extend({ + + avatarUrl: DS.attr(), + profileUrl: DS.attr(), + username: DS.attr() + +}); diff --git a/tests/dummy/app/pods/blog/data/2015-09-06-thoughts-on-model-attribute-formatting/template.md b/tests/dummy/app/pods/blog/data/2015-09-06-thoughts-on-model-attribute-formatting/template.md deleted file mode 100644 index 75b0a76e9..000000000 --- a/tests/dummy/app/pods/blog/data/2015-09-06-thoughts-on-model-attribute-formatting/template.md +++ /dev/null @@ -1,23 +0,0 @@ -# Thoughts on model attribute formatting - -I ran into an interesting problem while working on the serializer layer. I was just wrapping up AMS-style responses and was going to start working on the JSON:API version, when a wrinkle came up: the formatting of attribute names, both on Mirage's model layer instances, and on the field names of Mirage's database. - -Currently, Mirage's database simply takes whatever POJO of attrs you give it, and sticks that in its db. So if you write - -```js -db.users.create({ first_name: 'Link' }) -``` - -then you'll end up with that POJO in the db, but if you use `first-name`, you'll get that instead. This was originally done to make things as simple as possible - your db fields matched your API responses, so fixtures would "just work", and accessing the data is as you'd expect based on your API. - -When I introduced the model layer, I added attr accessors that simply matched the keys in the db. But right now, it's a naive implementation that just wraps the db attrs. So, if you're working with a `user` model (e.g. in your route handler), you would either access `user.first_name` or `user['first-name']`, depending on how your database looked. - -It seems like attrs on models should be consistently camelCase. One would expect to write `user.firstName` on a JavaScript model. That's the convention. I *could* keep the model's attrs in the format of your API (i.e. whatever's in your db), so we'd have something like `user.first_name`. But, what happens when you switch your app over to JSON:API? Now, you have to rewrite all the custom parts of your Mirage server, since it's now `user['first-name']` in JSON:API. That's pretty crappy. Not to mention, the dynamic methods added by the model layer, like `user.createPost`, should probably be consistent across API formats. - -So, I think models should have camelCase attributes. That way you're always using camelCase, regardless of the format of your API - which makes sense, since you're writing a (mock) JavaScript server. - -This presents an interesting challenge. How should the db fields be formatted? There's three ways to create db data. Fixture files, factories, and using the ORM in a route handler (e.g. `schema.user.create(...)`). The latter two seem like they should be camelCase (again, you don't want to have to update all your factories if you change from AMS to JSON:API...you may have to update some parts of your routes). But fixtures should always "just work". - -This leads me to think there should be a part of the "serializer layer" that can deserialize an API payload and get the attrs for the model(s), or at least in some way standardize it. This would mean if you change your API, you'd be able to use new fixture files just by specifying your new serializer. Also, it'd make the shorthands more versatile - they could basically use your serializers to deserialize the payload, and then they'd be able to create/update/delete the appropriate models regardless of your API format. Right now, they are coupled to AMS-style responses. - -I'll have to think more about this, but right now this feels like the right move. diff --git a/tests/dummy/app/pods/blog/data/2015-09-10-orm-not-ready-yet/template.md b/tests/dummy/app/pods/blog/data/2015-09-10-orm-not-ready-yet/template.md deleted file mode 100644 index c5aac236d..000000000 --- a/tests/dummy/app/pods/blog/data/2015-09-10-orm-not-ready-yet/template.md +++ /dev/null @@ -1,18 +0,0 @@ -# The ORM is not ready, yet - -I wanted to quickly note that, although [the models PR](https://github.com/samselikoff/ember-cli-mirage/pull/82) has been merged into master, it is not quite ready for use. To be really effective, Mirage also needs a serializer layer (in progress), and an update to the factory layer (to support associations and traits). - -My plan is to document all three of these features (models, serializers and updated factories) at once, since they all rely on the orm, and will all require you to write simple model definitions to take advantage of. - -Once you add a model definition, say by defining an `author` model - -```js -// mirage/models/author.js -export default Mirage.Model.extend({ - posts: Mirage.hasMany() -}); -``` - -then you opt into the orm. Now, routes will get a `schema` object injected instead of a `db` (the `db` will be accessible via `schema.db`), and shorthands and factories will leverage the `schema`, and you'll be able to use serializers as well. - -I've hit some snags writing serializers, and there's a lot of hidden complexity in this effort, but I'm hoping I can wrap this all up in the next few weeks. diff --git a/tests/dummy/app/pods/blog/data/2015-09-15-router-handler/template.md b/tests/dummy/app/pods/blog/data/2015-09-15-router-handler/template.md deleted file mode 100644 index 56971f67a..000000000 --- a/tests/dummy/app/pods/blog/data/2015-09-15-router-handler/template.md +++ /dev/null @@ -1,11 +0,0 @@ -# Refactoring Server, adding a Route Handler object - -Updating the shorthands to work with the serializer layer proved harder than I thought. Serializers made it clear that the shorthands were making assumptions about the shape of the JSON payload. Now that users will be able to use serializers to transform how their data looks going out, I'll also need a way for them to specify how the data looks coming in. This is similar to Ember Data's `normalize` function. - -If a user is using a PUT or POST shorthand, I'll need to first deserialize the payload into a standard format, so the shorthands know what to do with it. I'll use the JSON:API format for the standard; that way, if you're using JSON:API, `normalize` will be a no-op, and AMS-style responses will simply convert to JSON:API. - -This sounds a lot like Ember Data, and I've even considered using Ember Data for the data store/identity map portion of Mirage; but at this point, there are still too many unknowns. I'd rather get the rest of the main features incorporated + wait for the API to stabilize, before making such a big decision. - -Mirage's ORM has very different needs than Ember Data's: it's a synchronous in-memory store, and while ED also has a clientside store, it was designed around an async layer, incorporates Ember.Object for KVO, requires attr declarations, and much more. Mirage's orm uses `object.defineProperty` to keep things as lightweight as possible, so you'll be able to `user.createPost`, `user.posts = [1]`, `post.user = user` etc. in your routes. Adding the ceremony of `.get(), `.set()`, and `createRecord` everywhere would make Mirage feel like more of a burden, and I think it's important to try to keep things as slim and easy-to-use as possible, given that Mirage is designed for mocking. - -In any case, the shorthands were originally simple functions that were unit tested. Now that there's a bit more going on, I felt the need to refactor the server/controller code a bit. I also got around to slimming down the initializer, moving that code to the Server, and moving a lot of route-handling-related code from Server to a new RouteHandler class. My next step will be to turn the shorthand functions into RouteHandlers (probably subclasses), which will hopefully provide some direction on how the data will flow from request, through normalize, to the shorthands and out to a response. diff --git a/tests/dummy/app/pods/blog/data/2015-10-19-serializers-ready/template.md b/tests/dummy/app/pods/blog/data/2015-10-19-serializers-ready/template.md deleted file mode 100644 index 8bcc880f1..000000000 --- a/tests/dummy/app/pods/blog/data/2015-10-19-serializers-ready/template.md +++ /dev/null @@ -1,84 +0,0 @@ -# Serializers are ready for testing - -Yesterday I merged in the [JSON:API Serializer](https://github.com/samselikoff/ember-cli-mirage/commit/9927a7f7a2232ddf8df15e01991e538eefadee9c), which is the last piece of planned work I have for the serializer layer. That means it's ready to test! I'm sure there's plenty I haven't thought of yet, but I think it's time to get some people kicking the tires. - -For the brave, I'll be writing documentation this week about how to take advantage of the ORM and Serializer layer in your route handlers. Migration will be at your own pace: you should be able to switch over, keep old custom route handlers that access the db directly, and switch them over one at a time to use the new schema object - the ORM. Using a schema in your route handler lets you respond with a model or collection, which is the basis for your serializers knowing how to transform your response into an appropriately-formatted JSON payload. - -The docs should be landing soon. But, the code is already in master (since the entire ORM is opt-in) - so, for the *truly* brave, you can try this out right now, by doing something like the following: - -1. Upgrade to master ("samselikoff/ember-cli-mirage" in your package.json) -2. Define your models. For each model create a file under `mirage/models` that looks like the following: - - ```js - // mirage/models/post.js - import { Model } from 'ember-cli-mirage'; - - export default Model; - ``` - - Use the singular version of your model for the filename. - -3. Define your serializer. There are two named serializers, JSON:API and ActiveModelSerializer. You can customize these as well the basic Serializer that's also included. - - ```js - // mirage/serializers/application.js - import Serializer from 'ember-cli-mirage/serializers/json-api-serializer'; - - export default Serializer; - ``` - -4. Once you do the above, Mirage will now be using an ORM. This means your custom route handlers will no longer have the signature - - ```js - function(db, request) - ``` - - but rather - - ```js - function(schema, request) - ``` - - where schema is the ORM object. Fortunately, the db is available at schema.db. This means you can give your old route handlers access to the db by doing the following refactoring: - - ```diff - - this.get('/some/path', function(db, request), { - + this.get('/some/path', function({db}, request), { - // your custom route handler - }); - ``` - - Not bad, thanks to the magic of ES6 object destructuring! - - Additionally, the ORM standardizes the formatting of database attributes and collections. Previously, for example, the name of the database collection was based on the filename of your fixture or factory - so, you could have a collection called db.blog_posts. With the ORM, everything is camel-cased (we are writing JS, after all). So, this may necessitate some refactoring of your custom route handler code. - -Adding relationship support looks like this: - -```js -// mirage/models/author.js -import { Model, hasMany } from 'ember-cli-mirage'; - -export default Model.extend({ - posts: hasMany() -}); - -// mirage/models/post.js -import { Model, belongsTo } from 'ember-cli-mirage'; - -export default Model.extend({ - author: belongsTo() -}); - -// mirage/serializers/author.js -import ApplicationSerializer from './application'; - -export default ApplicationSerializer.extend({ - relationships: ['posts'] -}); -``` - -and now, the GET shorthands to /authors should return included posts! - ---- - -That's just a taste of what's to come! I want to reiterate this is very new and I basically don't suggest using it. But, if you're feeling adventurous, dive in! I would love to hear any feedback. If you do try it out, hit me up on Slack if you have questions. diff --git a/tests/dummy/app/pods/blog/data/2015-11-03-inside-ember-cli-mirage/template.md b/tests/dummy/app/pods/blog/data/2015-11-03-inside-ember-cli-mirage/template.md deleted file mode 100644 index 646d04802..000000000 --- a/tests/dummy/app/pods/blog/data/2015-11-03-inside-ember-cli-mirage/template.md +++ /dev/null @@ -1,7 +0,0 @@ -# Video: Inside Ember CLI Mirage - -On October 10 I spoke at the Global Ember Meetup about why I built Mirage, and what's planned for the next version. Here's the video: - -
    - -
    diff --git a/tests/dummy/app/pods/blog/data/2016-01-03-0-2-0-beta-9-released/template.md b/tests/dummy/app/pods/blog/data/2016-01-03-0-2-0-beta-9-released/template.md deleted file mode 100644 index 3d46a6bb9..000000000 --- a/tests/dummy/app/pods/blog/data/2016-01-03-0-2-0-beta-9-released/template.md +++ /dev/null @@ -1,196 +0,0 @@ -# Mirage 0.2.0-beta.9 released - -Mirage v0.2.0-beta.9 has been released. Check out [the release notes](https://github.com/samselikoff/ember-cli-mirage/releases/tag/v0.2.0-beta.9) for the breaking changes and enhancements. - -## Update on a 0.2 stable release - -I wanted to jot down some of my recent thoughts while putting this release together. Pardon the rambling. - -Originally I had planned for beta.9 to be the last beta release before cutting 0.2. Since folks have started using the 0.2 beta series, however, pain points around data modeling have been cropping up. In particular, dealing with `has-one` and `many-to-many` associations is quite difficult with the current set of abstractions. - -My first thought was to ship 0.2 as is, and then work on adding helpers for `hasAndBelongsToMany` and `hasOne`. After some more thought & discussions with various users, I realized that the ORM's abstractions might be a touch off. Let me explain. - -Mirage's ORM was built to support features like JSON:API includes and the planned factory relationships. The ORM is a way to encode association information, since there was no good place to do this in `v0.1`. My approach was to largely mimic server-side frameworks like Rails, since they've already solved this problem. After all, your models already live on the backend in database tables, so why not use the same concepts? Tables with foreign keys are familiar to backend devs, so let's just emulate those concepts in Mirage. - -So, that's been the plan so far. The ORM has working `hasMany` and `belongsTo` associations, and those take care of many cases. The `manyToMany` case is interesting, though, because there's not necessarily a standard conventional way that all Ember developers or servers approach this problem. - -Take a simple `belongsTo`, like a `post` that belongs to an `author`. The `post` probably owns the foreign key, something like `author_id`. Persisting this relationship, then, is as simple as saving any other attribute on the `post`: - -``` -PUT /api/posts/1 - -{ - post: { - id: 1, - title: 'Hipster ipsum', - author_id: 24 - } -} -``` - -`author_id` is all that's needed to tell both Ember Data and the server about the new relationship. - -`hasMany` is where things start to get tricky. Let's assume we've also defined the inverse of the above relationship, so an `author` has many `posts`. If you updated an author with new posts, how would you persist those new relationships? - -As above, the foreign key on each `post` is all that's needed to tell both the frontend and the backend about the new relationship, so typically I would handle it like this: - -```js -post1.set('author', author); -post1.save(); - -post2.set('author', author); -post2.save(); -``` - -and so on. You can write code that batches these requests, but the point here is that this is pretty straightforward stuff. Persisting a relationship is just boring old CRUD on a resource. - -Interestingly, the [Ember Data guides](https://guides.emberjs.com/v2.5.0/models/relationships/#toc_creating-records) show code that suggests persisting a `hasMany` relationship by calling `save` on the parent, which looks something like this: - -```js -author.get('posts').pushObjects([post1, post3]); -author.save(); -``` - -Now, Ember Data can understand this, and in fact this is how some teams work. But what does the request/response look like? Maybe something like - -``` -PUT /authors/1 -{ - author: { - id: 1, - name: 'Frank', - post_ids: [1, 3] - } -} -``` - -This is a request to update a single `author` resource - but behind the scenes, is your backend actually updating the foreign keys on two different post records? If so, we've kind of moved out of the realm of doing boring CRUD on resources, because now our server is doing something different or more than what we asked of it: we asked it to update the `author:1` resource, and in reality it's updating two other `post` resources. Interestingly I've asked several folks in the community how they deal with this issue, and the response varies. - -The story gets even trickier with many-to-many relationships. Sometimes people model the join record in their Ember apps, sometimes they don't. If they don't, a PUT to an `author` resource could actually be *creating* multiple server resources behind the scenes, via a join table. - -This obviously has implications for Mirage, which works best with conventional server endpoints. A PUT to a resource updates that resource, and so on. But plenty of people write their servers this way, and it got me thinking: perhaps database tables and foreign keys are the wrong abstraction for Mirage to emulate. Perhaps transport of HTTP resources is a bit more generic and abstract than that. - -Take, for example, the following Ember Data model definitions: - -```js -// models/post.js -export default DS.Model.extend({ - - categories: DS.hasMany(); - -}); - -// models/category.js -export default DS.Model.extend({ - - name: DS.attr() - -}); -``` - -That is a perfectly valid and legitimate domain model. By looking at those two models, can you tell me which entity owns the foreign key? Nope. In fact, you don't even know if this is a one-to-many or many-to-many relationship. And yet, from the perspective of HTTP resources (including a valid implementation of a JSON:API server), this is totally valid. - -Here's the JSON:API response, for example: - -``` -GET /posts/1?include=categories - -{ - data: { - type: 'posts', - id: 1, - relationships: { - categories: [ - { - data: { - type: 'categories', - id: '2' - } - }, - { - data: { - type: 'categories', - id: '5' - } - } - ] - } - }, - included: [ - { - type: 'categories', - id: '2', - attributes: { - name: 'Economics' - } - }, - { - type: 'categories', - id: '5', - attributes: { - name: 'Programming' - } - } - ] -} -``` - -Totally valid, and also impossible to ascertain whether this is a one-to-many or many-to-many relationship. - -Basing Mirage's ORM on database tables and foreign keys makes some things really easy and familiar, but for these situations it's a pain. If your actual Ember app and your actual server can handle a request like - -``` -PUT /posts/1 -{ - post: { - id: 1, - tag_ids: [1, 4] - } -} -``` - -just fine, you shouldn't have to add extra logic or models to make your fake Mirage server work. - -The solution I have in mind for this problem is to replace the foreign key implementation with an associations map. This map will be a singleton that all models will have a reference to, and it will be used to persist model relationships. - -The external API of Mirage's ORM won't change. For example, say you had a `author` that has many `posts`: - -```js -// mirage/models/author.js -export default Model.extend({ - posts: hasMany() -}); - -// mirage/models/post.js -export default Model.extend({ -}); -``` - -Currently (in 0.2.0-beta.9), Mirage makes an assumption here that the `post` resource has an `author_id` foreign key. As we've just shown, this is potentially a false assumption. My previous plan was to write a `hasAndBelongsToMany` helper for many-to-many relationships. Then, if this relationship turned out to be a many-to-many, the user would need to do something like the following: - -```js -// mirage/models/author.js -export default Model.extend({ - posts: hasAndBelongsToMany() -}); -``` - -This would tell Mirage to transparently create a `author-post` join table, and deal with the persistence there. - -Again, this now feels like the wrong abstraction, and it also introduces concepts that aren't necessarily appropriate for the domain of the frontend. Instead, the original domain model with the `hasMany` declaration will add an `author.posts` key to the singleton associations map, where all the relationship data can be stored. This has an added benefit of simplifying Mirage's interface for creating relationships in factories and elsewhere, as now developers will be able to do things like - -```js -let author = server.create('author', { - categoryIds: [1, 3] -}); -``` - -in their tests, similar to what they're used to doing in Ember Data. We can also make Mirage's shorthands understand both forms of saving `hasMany` relationships, since the ids on the models will just be pointers to the associations map. Serializers can be used to customize which ids are sent along with the response. - -This change will also make it easier to ascertain all model information from an existing set of Ember Data models in the future. I'm confident the overall learning curve will be easier and resulting code will be cleaner. - -While this will take a bit more time to get right, I think it's important. I also feel like I have a better grasp of something important, namely that Mirage as an HTTP faking layer should not necessarily emulate various server abstractions, but rather focus on concepts that come from HTTP. It turns out that single-owner foreign keys is not one of those concepts, and therefore this abstraction does not belong in Mirage. - -I'll probably release 0.2, and work the associations map into a 0.3 release. Still thinking this through, though. - -My closing thought is that these HTTP concepts are crucial to understand if you're going to write an Ember app, and they can't just be left to the backend team. It's true that a frontend developer doesn't need to know that Rails has a `has_and_belongs_to_many` method that abstracts away join tables on many-to-many relationships; however, the developer does need to understand how her Ember app will retrieve and persist many-to-many relationships across the network. Domain modeling and HTTP transport is a central part of Ember development and unfortunately at the moment, many parts of it are still non-standard and unconventional. diff --git a/tests/dummy/app/pods/blog/data/2016-01-03-0-2-update-only-inject-schema/template.md b/tests/dummy/app/pods/blog/data/2016-01-03-0-2-update-only-inject-schema/template.md deleted file mode 100644 index d1f366fe8..000000000 --- a/tests/dummy/app/pods/blog/data/2016-01-03-0-2-update-only-inject-schema/template.md +++ /dev/null @@ -1,72 +0,0 @@ -# Mirage 0.2 update - -Here's a quick update on Mirage 0.2. - -When I started working on the ORM/Serializer layer, I knew we were going to need to bump Mirage to 0.2. However, I thought it was worth keeping the library completely backwards compatible. I wanted users to be able to update to 0.2 without breaking any of their existing route handlers. - -The more I learned while developing, the more I realized some of the assumptions I made in 0.1 were simply bad. For example, using the formatting of fixture files (including their names) to determine the format of JSON responses from mocked routes. - -Now that we have a proper ORM and serializer layer, I'd like the story for how to set up your mock server to be clear, especially to newcomers. - -In 0.1, route handlers receive the `db` as the first argument: - -```js -this.get('/users', (db, request) => { - return db.users; -}); -``` - -This made sense in a world where there was only a `db`, acting as a dumb data store, and all formatting decisions were left up to the user. - -Then, we added the ORM and Serializer. Originally, the idea was, if you defined your models - that is, if you opted in to Mirage's ORM - we'd inject a `schema` object instead of the comparatively dumb `db`: - -```js -this.get('/users', (schema, request) => { - return schema.user.all(); -}); -``` - -This returned a User Collection, which the Serializer layer knew how to serialize. - -This has been working well - but obviously, this is a breaking change for old route handlers. I also wanted people to be able to opt-in to the ORM layer, but still be able to dive into the raw `db` if they ever wanted to. `db` is an object that hangs directly off of `schema`, so you can always access it, even if you've opted in to the ORM: - -```js -this.get('/users', (schema, request) => { - return schema.db.users; -}); -``` - -This would bypass the model-specific serializers. - -ES6 destructring makes this even better: - -```js -this.get('/users', ({db}) => { - return db.users; -}); -``` - -Given this, I feel it's worth making the breaking change, and *only* injecting `schema` to route handlers. The upgrade path for existing route handlers should be a simple change: - -```diff -- this.get('/users', (db) => { -+ this.get('/users', ({db}) => { - return db.users; - }); -``` - -along with possibly specifying a default Application serializer. - -The main reason I want to make this change, is to simplify the story around how Mirage data gets set up. In 0.1, Mirage looked for defined fixtures and/or factories to set up its database. In traditional server frameworks (e.g. Rails), you have a `schema` file that specifies the schema of your db. Using a mixture of fixtures and factories is confusing and unnecessary. Further, factories should be seen as an extension of the models (db collections) they're creating, rather than their definitions. - -This is why going forward, the story for configuring Mirage will be a unified one: Models define your schema/database. So, new users will define models for each table/collection they want in their Mirage mock server. That sets up the database tables, and also gives the user a very easy starting point when they *do* want to opt into the relationship/serializer support. `server.create` will still use a factory if it exists, but if no factory exists, it will simply create an empty model. - -I'm confident this change will make Mirage simpler and more approachable. The downside is, existing users will need to define blank models for each collection they have. We'll have a generator, which will help some, but this could prove to be annoying. My hope is that having a single `/models` directory, while being able to delete empty factory and fixture files, will simplify things. Also, this paves the way for a planned future addon, `mirage-ember-data`. The purpose of this addon is to ascertain, at run-time, the server models and their relationships, based on a user's Ember Data models. This would eliminate the need to define models again, in Mirage-land. - -This addon is still a ways off, but this change - enforcing users to simply define their models as the single source of truth for their backend schema - paves the way. - ---- - -You can see all the open items left before we release 0.2.0 [here](https://github.com/samselikoff/ember-cli-mirage/issues?q=is%3Aopen+is%3Aissue+milestone%3A0.2.0). Bugs, Help Wanted and Good for New Contributors are great tags to look out for if you'd like to help push us towards release! - -If you have any thoughts or comments, tweet @samselikoff or [open an issue](https://github.com/samselikoff/ember-cli-mirage/issues). diff --git a/tests/dummy/app/pods/blog/data/2016-05-31-0-2-0-released/template.md b/tests/dummy/app/pods/blog/data/2016-05-31-0-2-0-released/template.md deleted file mode 100644 index 3547dc330..000000000 --- a/tests/dummy/app/pods/blog/data/2016-05-31-0-2-0-released/template.md +++ /dev/null @@ -1,30 +0,0 @@ -# Mirage 0.2.0 released - -Mirage v0.2.0 has been released! Check out [the release notes](https://github.com/samselikoff/ember-cli-mirage/releases/tag/v0.2.0-beta.9) for the breaking changes and enhancements from 0.2.0-beta.9. Also see [Adolfo's script](https://blog.abuiles.com/blog/2016/05/27/upgrading-to-mirage-v0-dot-2-0-beta-dot-9-with-jscodeshift/) to help with some of the breaking changes from `beta.7` to `beta.9`. - -If you're upgrading an app from 0.1.x to 0.2, be sure to read through [the 0.2.x docs](http://www.ember-cli-mirage.com/docs/v0.2.x/). When you're ready to upgrade, consult [the upgrade guide](http://www.ember-cli-mirage.com/docs/v0.2.x/upgrading/), and open an issue if the guide left something out. - ---- - -Even though there's more work I want to do to smooth out the API in a few places, it's time to get 0.2 released. Most (if not all) of the planned changes should be backwards compatible with 0.2, so users should start using 0.2 today. - -Next, I'm hoping to address two of the biggest pain points I saw during the beta series: - -1. **Creating object graphs in tests.** Currently, seeding Mirage with a graph of related data looks something like this: - - let author = server.create('author'); - let post1 = server.create('post', { author }); - server.createList('comment', 10, { post: post1 }); - - let post2 = server.create('post', { author }); - server.createList('comment', 5, { post: post2 }); - - Two features planned for the factory layer will help with this: an `afterCreate` hook, and `traits`. - -2. **Responding with has-one or many-to-many relationships in the Serializer.** Originally I was going to add a `hasAndBelongsToMany` helper to solve this, but now I think [ad hoc Serializer methods](https://github.com/samselikoff/ember-cli-mirage/issues/754) is a better short-term solution, and something I wanted to add anyway. Some folks are keen on getting this working, so hopefully it will land soon. - ---- - -Thanks to everyone who braved the beta series, you were crucial to all the iterations on the API, and to all the amazing contributors who helped push it through! - -Happy coding everyone! diff --git a/tests/dummy/app/pods/blog/data/2017-01-09-0-3-0-beta-series/template.md b/tests/dummy/app/pods/blog/data/2017-01-09-0-3-0-beta-series/template.md deleted file mode 100644 index bac9ca0a2..000000000 --- a/tests/dummy/app/pods/blog/data/2017-01-09-0-3-0-beta-series/template.md +++ /dev/null @@ -1,173 +0,0 @@ -# Mirage 0.3.0 beta series - -I've started the beta series of Mirage v0.3.0. You can install the latest release (0.3.0-beta.4 as of this writing) with - -```sh -ember install ember-cli-mirage@beta -``` - -Recent updates to the ORM required some breaking changes, which is why I'm bumping Mirage's "major" version from 0.2 to 0.3. I'm hoping this is the last release series before landing a 1.0 final. - -- [Motivation](#motivation) -- [Usage](#usage) -- [Examples](#examples) -- [Roadmap](#roadmap) - -## Motivation - -The ORM that was added in 0.2 has proved useful, and recent factory enhancements (the `afterCreate` hook along with traits and associations) have really improved the ergonomics of creating complex object graphs. - -The biggest challenge since the 0.2 release has been the ORM's lack of support for several relationship types: - - - one-way - - one-to-one - - many-to-many - - reflexive - - polymorphic - -I went ahead with the 0.2.0 release anyway, because the serialization layer made working with JSON:API so much more pleasant. However, ever since the release users have been forced to write custom code in order to deal with these missing relationship types. - -When I began work on these missing types several months ago, I expected it to be relatively simple. Mirage's ORM was based off of ActiveRecord, and I felt I had a good understanding of the APIs that needed to be implemented. I started with one-to-one relationships, and nearly finished before I encountered a fundamental problem. - -In Rails, relationships are mapped on top of databases. Databases have fixed, known schemas, and ActiveRecord's APIs are designed to work with these known quantities. Questions like which records have foreign keys and whether two models are related via has-one or has-many are unambiguous, so ActiveRecord's API doesn't need to account for this. - -Modern HTTP APIs, however, are quite different. For example, take the following totally valid JSON:API response: - -```json -{ - "data": { - "id": "1", - "type": "authors", - "attributes": { - "name": "Martin Fowler" - }, - "relationships": { - "books": { - "data": [ - { - "id": "1", - "type": "books" - } - ] - } - } - }, - "included": [{ - "type": "books", - "id": "1", - "attributes": { - "title": "Refactoring: Improving the Design of Existing Code" - } - }] -} -``` - -We can see that an author `has many` books. But what about the relationship from books to authors? In the response it's ambiguous. We might assume it's many-to-one - but we could be wrong. Perhaps our app has the book _Refactoring_, which four authors. So the relationship between authors and book could turn out to be many-to-many. - -This is just one example of the ambiguity inherent in many HTTP responses. Trying to make assumptions about the underlying schema can make Mirage's abstractions even more complicated. In the 0.2 ORM, the `hasMany` and `belongsTo` helpers always assumed one side of the relationship was "belongs to", and added a foreign key to it. In the above example, this would mean books would get an `authorId` key. But with the need for many to many relationships, this turns out to be wrong. What to do? - -We could have kept the `authorId` as a default assumption, and then changed it when the user specified both sides. But what if the relationship turned out to be only one-way? You often come across this as well. Even if your backend has the relationship mapped out unambiguously, your API may choose to expose only one side. So, more assumptions like this give rise to even more indirection and unnecessary complexity. - -Further, keeping a foreign key on the belongs-to side at the database level but adding an ids array to the has-many side at the ORM level is an abstraction, and something else developers need to learn. Understanding Mirage's database structure is still useful for seeding test data and writing test assertions. And the abstractions needed to support all relationship types would be even more complex. - -Putting the `authorId` foreign key on a book when the user only ever needed an author to have many books (and therefore a `bookIds: []` array) turned out to be too confusing, and too much magic. If the user specifies that an author has many books, I decided that an author should simply get a `bookIds: []` array to manage the foreign keys — and nothing more. This decision automatically allows for relationships to be one-way only, and it also expands to support the other relationship types. In the event that there _is_ a bidirectional relationship, the keys would now need to be kept in sync on both sides - which is precisely what I've been working on, and is now handled in the 0.3 series. Further, giving models an `id` or `ids` property that corresponds directly to their relationships more closely matches Ember Data's approach. Overall, it feels like the right decision. - -## Usage - -The `hasMany` and `belongsTo` helpers are still present in 0.3, but they work a bit differently. - -Say we have the following models: - -```js -// mirage/models/author.js -import { Model, hasMany } from 'ember-cli-mirage'; - -export default Model.extend({ - - books: hasMany() - -}); -``` - -```js -// mirage/models/book.js -import { Model } from 'ember-cli-mirage'; - -export default Model.extend({ - -}); -``` - -The `hasMany` helper adds a `bookIds` array to each author model that it uses for bookkeeping. If we have an author instance - -```js -let author = schema.authors.find(1); -``` - -then the helper method `author.books` will use the `author.bookIds` property to find the related books. - -Creating related books updates the `ids` property - -```js -let steinbeck = schema.authors.create({ name: 'John Steinbeck' }); - -steinbeck.createBook({ title: 'Of Mice and Men' }); -steinbeck.createBook({ title: 'The Grapes of Wrath' }); - -steinbeck.bookIds; // [ 1, 2 ] -``` - -as does associating new books - -```js -let hemingway = schema.authors.create({ name: 'Ernest Hemingway' }); -let oldMan = schema.books.create({ title: 'The Old Man and the Sea' }); - -hemingway.books = [ oldMan ]; -hemingway.save(); - -hemingway.bookIds; // [ 3 ] -``` - -Notice that so far, _books themselves don't have any knowledge of this relationship_. This is the biggest change in the ORM. Before, the book would automatically get an `authorId`, and so this would be available in tests, and it would also be sent over in responses as a relationship on the book. But in the case of 0.3, the relationship helpers are one-way. Basically, it works more like Ember Data does. - -This means if you want a book to have an `authorId`, you'll need to also define the relationship on the book: - -```js -// mirage/models/book.js -import { Model, belongsTo } from 'ember-cli-mirage'; - -export default Model.extend({ - - author: belongsTo() - -}); -``` - -This helper will add an `authorId` to the book, and, like Ember Data, look for an implicit inverse on the `author`. If it can find one, the ORM will keep the ids on both sides of the relationship in sync. - -## Examples - -Here are some Twiddles showcasing various relationship configurations: - -- **[One-Way Has Many](https://ember-twiddle.com/802cd2f92e8c6c7280f42b054f393097?openFiles=mirage.config.js%2C)**. Notice how the author's keys are updated when you delete a book. -- **[One-Way Belongs To](https://ember-twiddle.com/24d6101792f2932e9c7edf5f0934b02c?openFiles=models.book.js%2C)**. Deleting the author will ensure existing book's keys are nulled out (i.e. they become orphans so that the database is kept consistent). -- **[One to Many](https://ember-twiddle.com/5031fb20898b277fa6aea8fe89571148?openFiles=templates.application.hbs%2C)**. The keys on both sides of the relationship are kept in sync. If you delete the author, the books become orphaned records with null keys. -- **[One to One](https://ember-twiddle.com/012bd753cb03c7ae375210d47b623ccb?openFiles=mirage.config.js%2C)**. Another bidirectional relationship with keys managed on both sides. -- **[Many to Many](https://ember-twiddle.com/104407460799f1c16c4c0dc88daf975a?openFiles=templates.application.hbs%2C)**. And another. - -## Roadmap - -Here are my plans for Mirage's next steps. First, after enough folks try out the beta series we can land 0.3. Then I'll be able to add polymorphic relationships, which will round out the ORM. - -At this point I'd like to move towards a 1.0 release, barring any glaring issues in the API. Mirage has been around for nearly two years and plenty of people are using it. It's past time we hit an official major version and lock down the API. - -After 1.0, I'd like to move forward on an Ember Data integration layer, which is now possible since Mirage's ORM is able to represent Ember Data's possible schemas. The layer would simply read in your application's Ember Data schema and reproduce it in-memory for Mirage's ORM to use. This would yield big ergonomic gains for users of the library, as you'd no longer need to duplicate your Ember Data models for Mirage, and also lower the learning curve for new users. - -There are several more features I want to move forward on now that the core API is stabilizing. Getting Mirage to be able to run in Node in an Express server would be great, since responses would be real HTTP responses, developers could use the network tab and more. - -My primary goal in 2017 is delegation. For too long my personal availability has been a bottleneck for Mirage's development. I am going to focus on finding contributors and planning instead of actual implementation. It should help move the library forward faster while getting more folks knowledgeable about the internals, while also freeing up my time to focus more on [my business](https://embermap.com/). - -If you'd like to help, join #ec-mirage on Ember's slack community and reach out! Also be sure to drop a message there or open an issue if you have any feedback on 0.3. - -I'm so happy to be part of such an awesome community and look forward to seeing you at SoEmber and EmberConf. Here's to an exciting 2017! diff --git a/tests/dummy/app/pods/blog/data/2017-06-05-polymorphic-associations-and-auto-discovery-of-ember-data-models/template.md b/tests/dummy/app/pods/blog/data/2017-06-05-polymorphic-associations-and-auto-discovery-of-ember-data-models/template.md deleted file mode 100644 index cab44ed82..000000000 --- a/tests/dummy/app/pods/blog/data/2017-06-05-polymorphic-associations-and-auto-discovery-of-ember-data-models/template.md +++ /dev/null @@ -1,89 +0,0 @@ -# Polymorphic associations and auto-discovery of Ember Data models - -_Thanks to [Precision Nutrition](http://www.precisionnutrition.com/) for sponsoring some of Mirage's recent work!_ - -In the last few weeks there's been two important releases of Ember CLI Mirage. Version [0.3.2](https://github.com/samselikoff/ember-cli-mirage/releases/tag/v0.3.2) bought along auto-discovery of Ember Data models, and version [0.3.3](https://github.com/samselikoff/ember-cli-mirage/releases/tag/v0.3.3) (which I released over the weekend) added support for Polymorphic associations. - -Taken together, these two features greatly improve the ergonomics of the library. - -## Auto-discovery of Ember Data models - -In 0.3.2, [Offir Golan](https://twitter.com/Offir_Golan) shipped the auto-discovery feature. - -Models in Mirage are used by the ORM to set up collections and define relationships (associations). With this new feature, if you happen to be using Ember Data, Mirage will now auto-discover your Ember Data models (and their associations), and use those for its own schema. - -This is quite a convenient step, because if you're using Ember Data your Mirage models should match your Ember Data models anyway. Local files in `mirage/models` will "win" against auto-generated definitions, but once you delete your local files Mirage will fall back to Ember Data's schema. - -So, if you're using Ember Data, upgrade to the latest version of Mirage, nuke your `mirage/models` folder, and you never have to worry about running `ember g mirage-model` again! - -## Polymorphic associations - -Polymorphic associations were the last big missing piece of Mirage's ORM. Now, Mirage can represent any schema that Ember Data can. - -Reaching parity with Ember Data's flexible data-modeling story makes the auto-discovery feature that much more valuable. Now, no matter how you're using Ember Data, you should be able to rely on the autogenerated model classes. - -If you aren't using Ember Data, you can define has-many or belongs-to polymorphic associations on your own Mirage models: - -```js -// mirage/models/user.js -export default Model.extend({ - collectibles: hasMany({ polymorphic: true }) -}); - -// mirage/models/car.js -export default Model.extend({ - user: belongsTo() -}); - -// mirage/models/watch.js -export default Model.extend({ - user: belongsTo() -}); - -schema.users.create({ - collectibles: [ - schema.cars.create({ make: "Infiniti", model: "J30t" }), - schema.watches.create({ make: "Citizen", model: "Men's Chronograph" }), - ] -}); -``` - -Just like all other associations in Mirage's ORM, they can be one-way (null inverse), one-to-one, one-to-many or many-to-many. Check out [the docs on polymorphic associations](http://www.ember-cli-mirage.com/docs/v0.3.x/models/#association-options) for more details. - -## Upgrading - -These past few releases are all backwards-compatible with the 0.3.x series. If you're still on 0.2.x, be sure to check out the [upgrade guide](http://www.ember-cli-mirage.com/docs/v0.3.x/upgrading/) so you can get on the 0.3 series. - - - -## Roadmap - -Now that the majority of the work on the ORM is complete, there's a few things I'll be focusing on: - -- **Real network requests.** There's a PR that needs a bit of attention, but soon Mirage will have an option to boot in Ember CLI's Express server and send real HTTP responses back to your Ember app. This will enable several things: - - 1. You'll be able to use the network inspector to view your responses - 2. Mirage's database state will persist across page refreshes of your application, and - 3. You'll be able to test out features that depend on a real server, like verifying polling updates across two browser tabs - - Mirage will always be a tool focused on improving the development experience. Even though it will be able to run as a true node server, it will never make compromises to the developer experience in order to accommodate the needs of an actual production server. - -- **Landing a version 1.0.** I'm happy with Mirage's API and I'd like to land a version 1.0 soon. The only possible breaking change I'm considering at the moment has to do with the database API. - - Before the ORM you would interact with Mirage's db directly, doing things like `db.users` to fetch users and `db.users.insert` to insert new records. - - When designing this API I wanted `db.users` to return a JavaScript array but I also wanted `insert`, `update` and `destroy` to live off of this collection, e.g. `db.users.insert()`, `db.users.update()` and `db.users.destroy()`. - - Having `db.users` return the underlying database records made it way too easy to inadvertently mutate the database, so I made an early decision to have `db.users` return a copy of the records using `JSON.stringify`. This is quite costly in terms of performance and some users have hit limits when trying to seed their dummy data. - - Now that the primary interface to the database is `schema` (Mirage's ORM), the database's API isn't as important, and we could change `db.users` to `db.users.all()`. That way the other db methods (`db.insert`, `db.update` and `db.delete`) wouldn't incur the expensive cost of copying the database each time they ran. - - Other than that, I think we can lock down the API, ship 1.0 and move forward with prioritizing other features that are on the horizon. - -## How you can help - -Test your apps on 0.3.3 and report any issues that you run into, especially if your app has complex Ember Data schemas. - -And as always, if you'd like to contribute code or documentation to Mirage, jump on the #ec-mirage Slack channel and reach out. There's always more work to be done! :) diff --git a/tests/dummy/app/pods/blog/data/2018-02-01-changing-mirages-default-linkage-data-behavior/template.md b/tests/dummy/app/pods/blog/data/2018-02-01-changing-mirages-default-linkage-data-behavior/template.md deleted file mode 100644 index 5741d4c05..000000000 --- a/tests/dummy/app/pods/blog/data/2018-02-01-changing-mirages-default-linkage-data-behavior/template.md +++ /dev/null @@ -1,78 +0,0 @@ -# Changing Mirage's default linkage data behavior in 0.4 to better conform to JSON:API's semantics - -I wanted to write a quick post detailing a change that happened in Mirage's 0.4.0 release that I originally didn't signal as a breaking change, but that affected more apps than I realized. - -I have since added the following note about it to the [0.3 -> 0.4 upgrade guide]({{ site.baseurl }}{% link docs/v0.4.x/upgrading.md %}) -, and I'm reposting it here for more visibility. I think it's worth understanding, as the issue sheds light on the semantics around some of JSON:API's design decisions. - -Apologies if you upgraded to 0.4 and had to debug this yourself! - ---- - -There is one primary change in 0.4 that could break your 0.3 app. - -In 0.3.x, Mirage's JSONAPISerializer included all related foreign keys whenever serializing a model or collection, even if those relationships were not being `included` in the payload. - -This actually goes against JSON:API's design. Foreign keys in the payload are known as [Resource Linkage](http://jsonapi.org/format/#document-resource-object-linkage) and are intended to be used by API clients to link together all resources in a JSON:API compound document. In fact, most server-side JSON:API libraries do not automatically serialize all related foreign keys, and only return linkage data for related resources when they are being included in the current document. - -By including linkage data for every relationship in 0.3, it was easy to develop Ember apps that would work with Mirage but would behave differently when hooked up to a standard JSON:API server. Since Mirage always included linkage data, an Ember app might automatically be able to fetch related resources using the ids from that linkage data plus its knowledge about the API. For example, if a `post` came back like this: - -```js -// GET /posts/1 -{ - data: { - type: 'posts', - id: '1', - attributes: { ... }, - relationships: { - author: { - data: { - type: 'users', - id: '1' - } - } - } - } -} -``` - -and you forgot to `?include=author` in your GET request, Ember Data would potentially use the `user:1` foreign key and lazily fetch the `author` by making a request to `GET /authors/1`. This is problematic because - -1. This is not how foreign keys are intended to be used -2. It'd be better to see no data and fix the problem by going back up to your data-loading code and add `?include=author` to your GET request, or -3. If you do want your interface to lazily load the author, use resource `links` instead of the resource linkage `data`: - -```js -// GET /posts/1 -{ - data: { - type: 'posts', - id: '1', - attributes: { ... }, - relationships: { - author: { - links: { - related: '/api/users/1' - } - } - } - } -} -``` - -Resource links can be defined on Mirage serializers using the [links](http://www.ember-cli-mirage.com/docs/v0.3.x/serializers/#linksmodel) method (though `including` is likely the far more simpler and common approach to fetching related data). - -So, Mirage 0.4 changed this behavior and by default, the JSONAPISerializer only includes linkage data for relationships that are being included in the current payload (i.e. within the same compound document). - -This behavior is configurable via the `alwaysIncludeLinkageData` key on your JSONAPISerializers. It is set to `false` by default, but if you want to opt-in to 0.3 behavior and always include linkage data, set it to `true`: - -```js -// mirage/serializers/application.js -import { JSONAPISerializer } from 'ember-cli-mirage'; - -export default JSONAPISerializer.extend({ - alwaysIncludeLinkageData: true -}); -``` - -If you do this, I would recommend looking closely at how your real server behaves when serializing resources' relationships and whether it uses resource `links` or resource linkage `data`, and to update your Mirage code accordingly to give you the most faithful representation of your server. diff --git a/tests/dummy/app/pods/blog/detail/route.js b/tests/dummy/app/pods/blog/detail/route.js new file mode 100644 index 000000000..c1183a674 --- /dev/null +++ b/tests/dummy/app/pods/blog/detail/route.js @@ -0,0 +1,17 @@ +import Route from '@ember/routing/route'; + +export default Route.extend({ + + model({ post_slug_and_id }) { + let matches = post_slug_and_id.match(/\d+$/); + if (!matches) { + let path = document.location.pathname.replace(/^\/|\/$/g, ''); + this.transitionTo('not-found', path); + } + + let postId = matches[0]; + + return this.store.findRecord('post', postId); + } + +}); diff --git a/tests/dummy/app/pods/blog/detail/template.hbs b/tests/dummy/app/pods/blog/detail/template.hbs new file mode 100644 index 000000000..27cdbea6a --- /dev/null +++ b/tests/dummy/app/pods/blog/detail/template.hbs @@ -0,0 +1,52 @@ +{{!-- docs-md is a private class. Can switch once we expose AddonDocs styles publicly. --}} +
    + {{#link-to "blog" class="blog-detail__back-link"}} + ↠All posts + {{/link-to}} + +
    + + +

    + {{model.title}} +

    + + {{model.htmlBody}} +
    + +
    + +
    +

    Comments

    + + {{#each model.comments as |comment|}} +
    + + profile + + + +
    + {{/each}} + + +
    +
    diff --git a/tests/dummy/app/pods/blog/error/template.hbs b/tests/dummy/app/pods/blog/error/template.hbs new file mode 100644 index 000000000..a8661c285 --- /dev/null +++ b/tests/dummy/app/pods/blog/error/template.hbs @@ -0,0 +1,5 @@ +

    We're sorry...

    + +

    + {{model.responseJSON.message}} +

    diff --git a/tests/dummy/app/pods/blog/index/controller.js b/tests/dummy/app/pods/blog/index/controller.js index fb20ccd7c..d895eb337 100644 --- a/tests/dummy/app/pods/blog/index/controller.js +++ b/tests/dummy/app/pods/blog/index/controller.js @@ -2,62 +2,62 @@ import Controller from '@ember/controller'; export default Controller.extend({ - posts: [ - { - date: 'February 1, 2018', - title: `Changing Mirage's default linkage data behavior in 0.4 to better conform to JSON:API's semantics`, - slug: '2018-02-01-changing-mirages-default-linkage-data-behavior' - }, - { - date: 'June 5, 2017', - title: `Polymorphic associations and auto-discovery of Ember Data models`, - slug: '2017-06-05-polymorphic-associations-and-auto-discovery-of-ember-data-models' - }, - { - date: 'January 9, 2017', - title: `Mirage 0.3.0 beta series`, - slug: '2017-01-09-0-3-0-beta-series' - }, - { - date: 'May 31, 2016', - title: `Mirage 0.2.0 released`, - slug: '2016-05-31-0-2-0-released' - }, - { - date: 'May 13, 2016', - title: `Mirage 0.2.0-beta.9 released`, - slug: '2016-01-03-0-2-0-beta-9-released' - }, - { - date: 'January 3, 2016', - title: `Mirage 0.2 update`, - slug: '2016-01-03-0-2-update-only-inject-schema' - }, - { - date: 'November 3, 2015', - title: `Video: Inside Ember CLI Mirage`, - slug: '2015-11-03-inside-ember-cli-mirage' - }, - { - date: 'October 19, 2015', - title: `Serializers are ready for testing`, - slug: '2015-10-19-serializers-ready' - }, - { - date: 'September 15, 2015', - title: `Refactoring Server, adding a Route Handler object`, - slug: '2015-09-15-router-handler' - }, - { - date: 'September 10, 2015', - title: `The ORM is not ready, yet`, - slug: '2015-09-10-orm-not-ready-yet' - }, - { - date: 'September 6, 2015', - title: `Thoughts on model attribute formatting`, - slug: '2015-09-06-thoughts-on-model-attribute-formatting' - } - ] + // posts: [ + // { + // date: 'February 1, 2018', + // title: `Changing Mirage's default linkage data behavior in 0.4 to better conform to JSON:API's semantics`, + // slug: '2018-02-01-changing-mirages-default-linkage-data-behavior' + // }, + // { + // date: 'June 5, 2017', + // title: `Polymorphic associations and auto-discovery of Ember Data models`, + // slug: '2017-06-05-polymorphic-associations-and-auto-discovery-of-ember-data-models' + // }, + // { + // date: 'January 9, 2017', + // title: `Mirage 0.3.0 beta series`, + // slug: '2017-01-09-0-3-0-beta-series' + // }, + // { + // date: 'May 31, 2016', + // title: `Mirage 0.2.0 released`, + // slug: '2016-05-31-0-2-0-released' + // }, + // { + // date: 'May 13, 2016', + // title: `Mirage 0.2.0-beta.9 released`, + // slug: '2016-01-03-0-2-0-beta-9-released' + // }, + // { + // date: 'January 3, 2016', + // title: `Mirage 0.2 update`, + // slug: '2016-01-03-0-2-update-only-inject-schema' + // }, + // { + // date: 'November 3, 2015', + // title: `Video: Inside Ember CLI Mirage`, + // slug: '2015-11-03-inside-ember-cli-mirage' + // }, + // { + // date: 'October 19, 2015', + // title: `Serializers are ready for testing`, + // slug: '2015-10-19-serializers-ready' + // }, + // { + // date: 'September 15, 2015', + // title: `Refactoring Server, adding a Route Handler object`, + // slug: '2015-09-15-router-handler' + // }, + // { + // date: 'September 10, 2015', + // title: `The ORM is not ready, yet`, + // slug: '2015-09-10-orm-not-ready-yet' + // }, + // { + // date: 'September 6, 2015', + // title: `Thoughts on model attribute formatting`, + // slug: '2015-09-06-thoughts-on-model-attribute-formatting' + // } + // ] }); diff --git a/tests/dummy/app/pods/blog/post/route.js b/tests/dummy/app/pods/blog/index/route.js similarity index 61% rename from tests/dummy/app/pods/blog/post/route.js rename to tests/dummy/app/pods/blog/index/route.js index 32ad087f6..beec6be3b 100644 --- a/tests/dummy/app/pods/blog/post/route.js +++ b/tests/dummy/app/pods/blog/index/route.js @@ -2,8 +2,8 @@ import Route from '@ember/routing/route'; export default Route.extend({ - model(params) { - return params.post_slug; + model() { + return this.store.findAll('post'); } }); diff --git a/tests/dummy/app/pods/blog/index/template.hbs b/tests/dummy/app/pods/blog/index/template.hbs index 6b6af2e86..b81dfbc49 100644 --- a/tests/dummy/app/pods/blog/index/template.hbs +++ b/tests/dummy/app/pods/blog/index/template.hbs @@ -1,12 +1,13 @@

    Blog

    - - {{#each posts as |post|}} + {{#each (sort-by "meta.publishedAt:desc" model) as |post|}}
    -

    {{post.date}}

    +

    - {{#link-to "blog.post" post.slug}} + {{#link-to "blog.detail" post.slugAndId}} {{post.title}} {{/link-to}}

    diff --git a/tests/dummy/app/pods/blog/post/template.hbs b/tests/dummy/app/pods/blog/post/template.hbs deleted file mode 100644 index bc0d19058..000000000 --- a/tests/dummy/app/pods/blog/post/template.hbs +++ /dev/null @@ -1,7 +0,0 @@ -
    - {{#link-to "blog" class="blog-detail__back-link"}} - ↠All posts - {{/link-to}} - - {{component (concat "blog/data/" model)}} -
    diff --git a/tests/dummy/app/pods/not-found/route.js b/tests/dummy/app/pods/not-found/route.js index 0f2ef1952..b968ef67b 100644 --- a/tests/dummy/app/pods/not-found/route.js +++ b/tests/dummy/app/pods/not-found/route.js @@ -5,57 +5,92 @@ export default Route.extend({ beforeModel() { let { path } = this.paramsFor('not-found'); - this.get('redirects').forEach(candidate => { - if (path === candidate.from || path === `${candidate.from}/`) { - this.transitionTo('blog.post', candidate.to.replace('blog/', '')); - } + this.redirects.forEach(redirect => { + redirect.from.forEach(candidate => { + if (path === candidate || path === `${candidate}/`) { + this.transitionTo('blog.detail', redirect.to.replace('blog/', '')); + } + }); }); }, redirects: [ { - from: 'blog/2018/02/01/changing-mirages-default-linkage-data-behavior', - to: 'blog/2018-02-01-changing-mirages-default-linkage-data-behavior' + from: [ + 'blog/2018/02/01/changing-mirages-default-linkage-data-behavior', + 'blog/2018-02-01-changing-mirages-default-linkage-data-behavior' + ], + to: 'blog/changing-mirages-default-linkage-data-behavior-1475' }, { - from: 'blog/2017/06/05/polymorphic-associations-and-auto-discovery-of-ember-data-models', - to: 'blog/2017-06-05-polymorphic-associations-and-auto-discovery-of-ember-data-models' + from: [ + 'blog/2017/06/05/polymorphic-associations-and-auto-discovery-of-ember-data-models', + 'blog/2017-06-05-polymorphic-associations-and-auto-discovery-of-ember-data-models' + ], + to: 'blog/polymorphic-associations-and-auto-discovery-of-ember-data-models-1483' }, { - from: 'blog/2017/01/09/0-3-0-beta-series', - to: 'blog/2017-01-09-0-3-0-beta-series' + from: [ + 'blog/2017/01/09/0-3-0-beta-series', + 'blog/2017-01-09-0-3-0-beta-series' + ], + to: 'blog/0-3-0-beta-series-1484' }, { - from: 'blog/2016/05/31/0-2-0-released', - to: 'blog/2016-05-31-0-2-0-released' + from: [ + 'blog/2016/05/31/0-2-0-released', + 'blog/2016-05-31-0-2-0-released' + ], + to: 'blog/0-2-0-released-1485' }, { - from: 'blog/2016/01/03/0-2-0-beta.9-released', - to: 'blog/2016-01-03-0-2-0-beta-9-released' + from: [ + 'blog/2016/01/03/0-2-0-beta.9-released', + 'blog/2016-01-03-0-2-0-beta-9-released' + ], + to: 'blog/0-2-0-beta-9-released-1486' }, { - from: 'blog/2016/01/03/0-2-update-only-inject-schema', - to: 'blog/2016-01-03-0-2-update-only-inject-schema' + from: [ + 'blog/2016/01/03/0-2-update-only-inject-schema', + 'blog/2016-01-03-0-2-update-only-inject-schema' + ], + to: 'blog/0-2-update-only-inject-schema-1487' }, { - from: 'blog/2015/11/03/inside-ember-cli-mirage', - to: 'blog/2015-11-03-inside-ember-cli-mirage' + from: [ + 'blog/2015/11/03/inside-ember-cli-mirage', + 'blog/2015-11-03-inside-ember-cli-mirage' + ], + to: 'blog/inside-ember-cli-mirage-1488' }, { - from: 'blog/2015/10/19/serializers-ready', - to: 'blog/2015-10-19-serializers-ready' + from: [ + 'blog/2015/10/19/serializers-ready', + 'blog/2015-10-19-serializers-ready' + ], + to: 'blog/serializers-ready-1489' }, { - from: 'blog/2015/09/15/router-handler', - to: 'blog/2015-09-15-router-handler' + from: [ + 'blog/2015/09/15/router-handler', + 'blog/2015-09-15-router-handler' + ], + to: 'blog/router-handler-1490' }, { - from: 'blog/2015/09/10/orm-not-ready-yet', - to: 'blog/2015-09-10-orm-not-ready-yet' + from: [ + 'blog/2015/09/10/orm-not-ready-yet', + 'blog/2015-09-10-orm-not-ready-yet' + ], + to: 'blog/orm-not-ready-yet-1491' }, { - from: 'blog/2015/09/06/thoughts-on-model-attribute-formatting', - to: 'blog/2015-09-06-thoughts-on-model-attribute-formatting' + from: [ + 'blog/2015/09/06/thoughts-on-model-attribute-formatting', + 'blog/2015-09-06-thoughts-on-model-attribute-formatting' + ], + to: 'blog/thoughts-on-model-attribute-formatting-1492' } ] }); diff --git a/tests/dummy/app/router.js b/tests/dummy/app/router.js index 71d7d25a1..57f97a5c2 100644 --- a/tests/dummy/app/router.js +++ b/tests/dummy/app/router.js @@ -55,7 +55,7 @@ Router.map(function() { // }); // }); - this.route('post', { path: '/:post_slug' }); + this.route('detail', { path: '/:post_slug_and_id' }); }); this.route('not-found', { path: '/*path' }); diff --git a/tests/dummy/app/serializers/post.js b/tests/dummy/app/serializers/post.js new file mode 100644 index 000000000..74689dcb5 --- /dev/null +++ b/tests/dummy/app/serializers/post.js @@ -0,0 +1,4 @@ +import DS from 'ember-data'; + +export default DS.JSONAPISerializer.extend({ +}); diff --git a/tests/dummy/app/styles/app.css b/tests/dummy/app/styles/app.css index a183e7bb8..a949c5482 100644 --- a/tests/dummy/app/styles/app.css +++ b/tests/dummy/app/styles/app.css @@ -75,17 +75,26 @@ .blog-index h2 a { color: rgb(61, 72, 82); text-decoration: none; + /* font-weight: 800; + font-size: 28px; */ } .blog-index h2 a:hover { text-decoration: underline; } .blog-index p { - color: #999; + color: #8795A1; } +.blog-detail time, +.blog-index time { + color: #8795A1; + text-transform: uppercase; + font-size: 14px; + font-weight: 500; +} .blog-detail__back-link { text-decoration: none; - color: #999; + color: #8795A1; display: block; margin-bottom: 30px; } @@ -93,3 +102,51 @@ .blog-detail__back-link:hover { color: rgb(61, 72, 82); } + +.blog-detail__hr { + border-width: 1px; + margin: 3rem 0; +} +.blog-detail__comments { + margin-bottom: 6rem; +} + +.blog-detail__comment { + display: flex; + padding-top: 2rem; +} + +.blog-detail__comment-avatar { + border-radius: 4px; + width: 48px; + height: 48px; + margin-right: 2rem; +} + +.blog-detail__comment-body { + /* padding-lef */ +} +.blog-detail__comment-info { + color: #8795A1; + font-size: 14px; +} +.blog-detail__comment-permalink { + color: #8795A1; + text-decoration: none; +} +.blog-detail__comment-permalink:hover { + color: #3d4852; +} +.blog-detail__username-link { + color: #3d4852; + font-weight: 600; + text-decoration: none; +} +.blog-detail__comments-github-byline { + margin-top: 2rem; + font-style: italic; + color: #8795A1; +} +.blog-detail__comments-github-link { + color: #8795A1; +} diff --git a/tests/dummy/app/utils/render-markdown.js b/tests/dummy/app/utils/render-markdown.js new file mode 100644 index 000000000..aabd4cca6 --- /dev/null +++ b/tests/dummy/app/utils/render-markdown.js @@ -0,0 +1,84 @@ +import marked from 'marked'; + +/* + TODO: This is copied from AddonDocs. Need to make an importable + renderMarkdown function from AD that brings along highlighting. +*/ +class AddonDocsRenderer extends marked.Renderer { + constructor(config) { + super(); + this.config = config || {}; + } + + codespan() { + return this._processCode(super.codespan.apply(this, arguments)); + } + + code() { + let code = this._processCode(super.code.apply(this, arguments)); + return code.replace(/^
    /, '
    ');
    +  }
    +
    +  // Unescape markdown escaping in general, since it can interfere with
    +  // Handlebars templating
    +  text() {
    +    let text = super.text.apply(this, arguments);
    +    if (this.config.targetHandlebars) {
    +      text = text
    +        .replace(/&/g, '&')
    +        .replace(/</g, '<')
    +        .replace(/>/g, '>')
    +        .replace(/"|"/g, '"')
    +        .replace(/'|'/g, '\'');
    +    }
    +    return text;
    +  }
    +
    +  // Escape curlies in code spans/blocks to avoid treating them as Handlebars
    +  _processCode(string) {
    +    if (this.config.targetHandlebars) {
    +      string = this._escapeCurlies(string);
    +    }
    +
    +    return string;
    +  }
    +
    +  _escapeCurlies(string) {
    +    return string
    +      .replace(/{{/g, '{{')
    +      .replace(/}}/g, '}}');
    +  }
    +
    +  heading(text, level) {
    +    let id = text.toLowerCase().replace(/<\/?.*?>/g, '').replace(/[^\w]+/g, '-');
    +    let inner = level === 1 ? text : `${text}`;
    +
    +    return `
    +      ${inner}
    +    `;
    +  }
    +
    +  hr() {
    +    return `
    `; + } + + blockquote(text) { + return `
    ${text}
    `; + } + + link(href, title, text) { + let titleAttribute = title ? `title="${title}"` : ''; + return `${text}`; + } +} + +let renderer = new AddonDocsRenderer(); + +marked.setOptions({ + renderer, + headerIds: false +}); + +export default function(source) { + return source ? marked(source) : source; +} diff --git a/tests/dummy/mirage/config.js b/tests/dummy/mirage/config.js index f1c6b95ee..8f079ff6b 100644 --- a/tests/dummy/mirage/config.js +++ b/tests/dummy/mirage/config.js @@ -1,3 +1,10 @@ export default function() { + // + // { + // "message": "API rate limit exceeded for 72.229.126.12. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)", + // "documentation_url": "https://developer.github.com/v3/#rate-limiting" + // } + this.passthrough(); + this.passthrough('https://api.github.com/*'); } diff --git a/yarn.lock b/yarn.lock index 27b65fb6e..b946f00e5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3362,7 +3362,7 @@ browserslist@^2.1.2, browserslist@^2.11.3: caniuse-lite "^1.0.30000792" electron-to-chromium "^1.3.30" -browserslist@^3.2.6: +browserslist@^3.1.1, browserslist@^3.2.6: version "3.2.8" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== @@ -5399,6 +5399,11 @@ ember-cli-htmlbars@^3.0.0: json-stable-stringify "^1.0.0" strip-bom "^3.0.0" +ember-cli-import-polyfill@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/ember-cli-import-polyfill/-/ember-cli-import-polyfill-0.2.0.tgz#c1a08a8affb45c97b675926272fe78cf4ca166f2" + integrity sha1-waCKiv+0XJe2dZJicv54z0yhZvI= + ember-cli-inject-live-reload@^1.8.2: version "1.10.2" resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-1.10.2.tgz#43c59f7f1d1e717772da32e5e81d948fb9fe7c94" @@ -5422,6 +5427,22 @@ ember-cli-lodash-subset@^1.0.7: resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-1.0.12.tgz#af2e77eba5dcb0d77f3308d3a6fd7d3450f6e537" integrity sha1-ry5366XcsNd/MwjTpv19NFD25Tc= +ember-cli-moment-shim@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/ember-cli-moment-shim/-/ember-cli-moment-shim-3.7.1.tgz#3ad691c5027c1f38a4890fe47d74b5224cc98e32" + integrity sha512-U3HHuEU7sXQ78v25ifmIa9w4nQPQ7vK/LZ2bt18pN3aKNvIDYiLe/MDeXGmqfFIq3OfruKG+CF+7dOLqxuzSlQ== + dependencies: + broccoli-funnel "^2.0.0" + broccoli-merge-trees "^2.0.0" + broccoli-source "^1.1.0" + broccoli-stew "^1.5.0" + chalk "^1.1.3" + ember-cli-babel "^6.6.0" + ember-cli-import-polyfill "^0.2.0" + lodash.defaults "^4.2.0" + moment "^2.19.3" + moment-timezone "^0.5.13" + ember-cli-node-assets@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/ember-cli-node-assets/-/ember-cli-node-assets-0.2.2.tgz#d2d55626e7cc6619f882d7fe55751f9266022708" @@ -5969,6 +5990,16 @@ ember-lodash@^4.19.4: ember-cli-babel "^7.0.0" lodash-es "^4.17.4" +ember-macro-helpers@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ember-macro-helpers/-/ember-macro-helpers-2.1.0.tgz#e8eeff5704da4d2d071cc6446cd29c3b9b4c0f6d" + integrity sha512-VmXIXUhbMWNqtpQr81EC9Ud/1/rR8+ggiteThapxenD4OssJs7gn5i/ZJU4RopODma69/rfJTmaSlOC+/OxRSg== + dependencies: + ember-cli-babel "^7.0.0" + ember-cli-string-utils "^1.1.0" + ember-cli-test-info "^1.0.0" + ember-weakmap "^3.0.0" + ember-maybe-import-regenerator@^0.1.5, ember-maybe-import-regenerator@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ember-maybe-import-regenerator/-/ember-maybe-import-regenerator-0.1.6.tgz#35d41828afa6d6a59bc0da3ce47f34c573d776ca" @@ -5990,6 +6021,15 @@ ember-modal-dialog@2.4.3: ember-ignore-children-helper "^1.0.0" ember-wormhole "^0.5.1" +ember-moment@^7.8.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/ember-moment/-/ember-moment-7.8.1.tgz#6f77cf941d1a92e231b2f4b810e113b2fae50c5f" + integrity sha512-qEMWvJYOGGgyusUE9b+2wU7uWUG8aHkzdE6NBtGjaX5NU8SeByQkH8RkA+QKZonWQH3JncdbG6UBqRO1Ng3DYA== + dependencies: + ember-cli-babel "^6.7.2" + ember-getowner-polyfill "^2.2.0" + ember-macro-helpers "^2.1.0" + ember-qunit@^3.5.0: version "3.5.3" resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-3.5.3.tgz#bfd0bff8298c78c77e870cca43fe0826e78a0d09" @@ -6160,6 +6200,15 @@ ember-try@^1.0.0: rsvp "^4.7.0" walk-sync "^0.3.3" +ember-weakmap@^3.0.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/ember-weakmap/-/ember-weakmap-3.3.1.tgz#5188b035f5bfb17397067ea635300ae4e1205e11" + integrity sha512-pClKGFyByX03R2Y9ZogXHWXreeHzFZcuZj8EOOqj7fVYx0QDNiXBWo+jGhTl/pINlvjw4Z6fMFHlItrq1tZFxA== + dependencies: + browserslist "^3.1.1" + debug "^3.1.0" + ember-cli-babel "^6.6.0" + ember-wormhole@^0.5.1: version "0.5.4" resolved "https://registry.yarnpkg.com/ember-wormhole/-/ember-wormhole-0.5.4.tgz#968e80f093494f4aed266e750afa63919c61383d" @@ -8991,7 +9040,7 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.12.0: +js-yaml@^3.12.0, js-yaml@^3.12.1: version "3.12.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.1.tgz#295c8632a18a23e054cf5c9d3cecafe678167600" integrity sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA== @@ -9648,7 +9697,7 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= -lodash.defaults@^4.0.1: +lodash.defaults@^4.0.1, lodash.defaults@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= @@ -10076,6 +10125,11 @@ marked@^0.5.0: resolved "https://registry.yarnpkg.com/marked/-/marked-0.5.1.tgz#062f43b88b02ee80901e8e8d8e6a620ddb3aa752" integrity sha512-iUkBZegCZou4AdwbKTwSW/lNDcz5OuRSl3qdcl31Ia0B2QPG0Jn+tKblh/9/eP9/6+4h27vpoh8wel/vQOV0vw== +marked@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.6.0.tgz#a18d01cfdcf8d15c3c455b71c8329e5e0f01faa1" + integrity sha512-HduzIW2xApSXKXJSpCipSxKyvMbwRRa/TwMbepmlZziKdH8548WSoDP4SxzulEKjlo8BE39l+2fwJZuRKOln6g== + match-media@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/match-media/-/match-media-0.2.0.tgz#ea4e09742e7253cc7d7e1599ba627e0fa29fbc50" @@ -10437,11 +10491,23 @@ moment-timezone@^0.3.0: dependencies: moment ">= 2.6.0" +moment-timezone@^0.5.13: + version "0.5.23" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.23.tgz#7cbb00db2c14c71b19303cb47b0fb0a6d8651463" + integrity sha512-WHFH85DkCfiNMDX5D3X7hpNH3/PUhjTGcD0U1SgfBGZxJ3qUmJh5FdvaFjcClxOvB3rzdfj4oRffbI38jEnC1w== + dependencies: + moment ">= 2.9.0" + "moment@>= 2.6.0": version "2.23.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.23.0.tgz#759ea491ac97d54bac5ad776996e2a58cc1bc225" integrity sha512-3IE39bHVqFbWWaPOMHZF98Q9c3LDKGTmypMiTM2QygGXXElkFWIH7GxfmlwmY2vwa+wmNsoYZmG2iusf1ZjJoA== +"moment@>= 2.9.0", moment@^2.19.3: + version "2.24.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" + integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== + morgan@^1.9.0: version "1.9.1" resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59" From 3261343880ee64f1a39f70fce28ab6e563d951ad Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 7 Feb 2019 08:45:09 -0500 Subject: [PATCH 304/879] docs: comments styling tweak --- tests/dummy/app/pods/blog/detail/template.hbs | 2 +- tests/dummy/app/styles/app.css | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/dummy/app/pods/blog/detail/template.hbs b/tests/dummy/app/pods/blog/detail/template.hbs index 27cdbea6a..c9ba0bc06 100644 --- a/tests/dummy/app/pods/blog/detail/template.hbs +++ b/tests/dummy/app/pods/blog/detail/template.hbs @@ -23,7 +23,7 @@ {{#each model.comments as |comment|}}
    - + profile diff --git a/tests/dummy/app/styles/app.css b/tests/dummy/app/styles/app.css index a949c5482..fa171bcea 100644 --- a/tests/dummy/app/styles/app.css +++ b/tests/dummy/app/styles/app.css @@ -116,6 +116,9 @@ padding-top: 2rem; } +.blog-detail__comment-profile-link { + flex-shrink: 0; +} .blog-detail__comment-avatar { border-radius: 4px; width: 48px; From a9e822f8901a6bcdbb334125ede27891ac585cca Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 7 Feb 2019 09:52:25 -0500 Subject: [PATCH 305/879] fix: reflexive relationships can be self-referential --- addon/orm/model.js | 7 ++ .../_helper.js | 72 +++++++++++++++++++ .../accessor-test.js | 28 ++++++++ .../association-create-test.js | 26 +++++++ .../association-new-test.js | 31 ++++++++ .../association-set-id-test.js | 54 ++++++++++++++ .../association-set-test.js | 43 +++++++++++ 7 files changed, 261 insertions(+) create mode 100644 tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/_helper.js create mode 100644 tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/accessor-test.js create mode 100644 tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-create-test.js create mode 100644 tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-new-test.js create mode 100644 tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-set-id-test.js create mode 100644 tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-set-test.js diff --git a/addon/orm/model.js b/addon/orm/model.js index ae4d73845..7db524caf 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -875,8 +875,15 @@ class Model { } else { + // Clearing the association if (tempAssociate === null) { this._updateInDb({ [fk]: null }); + + // Self-referential + } else if (this.equals(tempAssociate)) { + this._updateInDb({ [fk]: this.id }); + + // Non-self-referential } else if (!tempAssociate.isSaving) { tempAssociate.save(); diff --git a/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/_helper.js b/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/_helper.js new file mode 100644 index 000000000..183d52b5c --- /dev/null +++ b/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/_helper.js @@ -0,0 +1,72 @@ +import { Model, belongsTo } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +/* + A model with a belongsTo association can be in six states + with respect to its association. This helper class + returns a child (and its association) in these various states. + + The return value is an array of the form + + [ child, parent ] + + where the parent may be undefined. +*/ +export default class BelongsToHelper { + + constructor() { + this.db = new Db(); + + this.schema = new Schema(this.db, { + user: Model.extend({ + representative: belongsTo('user', { inverse: null }) + }) + }); + } + + savedChildNoParent() { + let link = this.db.users.insert({ name: 'Link' }); + + return [ this.schema.users.find(link.id), undefined ]; + } + + savedChildSavedParent() { + let linkDbRecord = this.db.users.insert({ name: 'Link' }); + this.db.users.update(linkDbRecord.id, { representativeId: linkDbRecord.id }); + + let link = this.schema.users.find(linkDbRecord.id); + + return [ link, link ]; + } + + newChildNoParent() { + return [ this.schema.users.new({ name: 'Link' }), undefined ]; + } + + newChildNewParent() { + let link = this.schema.users.new({ name: 'Link' }); + link.representative = link; + + return [ link, link ]; + } + + // Just a saved unassociated parent. + // savedParent() { + // let insertedParent = this.db.users.insert({ name: 'Bob' }); + // + // return this.schema.users.find(insertedParent.id); + // } + // + // newParent() { + // return this.schema.users.new({ name: 'Bob' }); + // } + +} + +export const states = [ + 'savedChildNoParent', + 'savedChildSavedParent', + 'newChildNoParent', + 'newChildNewParent' +]; diff --git a/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/accessor-test.js b/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/accessor-test.js new file mode 100644 index 000000000..4200794bc --- /dev/null +++ b/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/accessor-test.js @@ -0,0 +1,28 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named one-way reflexive self referential | accessor', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); + + /* + The reference to a belongs-to association is correct, for all states + */ + states.forEach((state) => { + + test(`the references of a ${state} are correct`, function(assert) { + let [ user, representative ] = this.helper[state](); + + // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison + if (representative) { + assert.deepEqual(user.representative.attrs, representative.attrs, 'the model reference is correct'); + assert.equal(user.representativeId, representative.id, 'the modelId reference is correct'); + } else { + assert.deepEqual(user.representative, null, 'the model reference is correct'); + assert.equal(user.representativeId, null, 'the modelId reference is correct'); + } + }); + + }); +}); diff --git a/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-create-test.js b/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-create-test.js new file mode 100644 index 000000000..03cbadfe1 --- /dev/null +++ b/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-create-test.js @@ -0,0 +1,26 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named one-way reflexive self referential | association #create', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); + + /* + The model can create a belongs-to association, for all states + */ + states.forEach((state) => { + + test(`a ${state} can create an associated parent`, function(assert) { + let [ user ] = this.helper[state](); + + let ganon = user.createRepresentative({ name: 'Ganon' }); + + assert.ok(ganon.id, 'the parent was persisted'); + assert.deepEqual(user.representative.attrs, ganon.attrs); + assert.equal(user.representativeId, ganon.id); + assert.equal(this.helper.schema.users.find(user.id).representativeId, ganon.id, 'the user was persisted'); + }); + + }); +}); diff --git a/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-new-test.js b/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-new-test.js new file mode 100644 index 000000000..7dd2d2e24 --- /dev/null +++ b/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-new-test.js @@ -0,0 +1,31 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named one-way reflexive self referential | association #new', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); + + /* + The model can make a new unsaved belongs-to association, for all states + */ + + states.forEach((state) => { + + test(`a ${state} can build a new associated parent`, function(assert) { + let [ user ] = this.helper[state](); + + let ganon = user.newRepresentative({ name: 'Ganon' }); + + assert.ok(!ganon.id, 'the parent was not persisted'); + assert.deepEqual(user.representative, ganon); + assert.equal(user.representativeId, null); + + user.save(); + + assert.ok(ganon.id, 'saving the child persists the parent'); + assert.equal(user.representativeId, ganon.id, 'the childs fk was updated'); + }); + + }); +}); diff --git a/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-set-id-test.js b/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-set-id-test.js new file mode 100644 index 000000000..b470f865a --- /dev/null +++ b/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-set-id-test.js @@ -0,0 +1,54 @@ +import Helper from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named one-way reflexive self referential | association #setId', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); + + /* + The model can update its association via parentId, for all states + */ + + [ + 'savedChildNoParent', + 'savedChildSavedParent' + ].forEach((state) => { + + test(`a ${state} can update its association to itself via parentId`, function(assert) { + let [ user ] = this.helper[state](); + + user.representativeId = user.id; + + assert.equal(user.representativeId, user.id); + assert.deepEqual(user.representative.attrs, user.attrs); + + user.save(); + + assert.equal(user.representativeId, user.id); + assert.deepEqual(user.representative.attrs, user.attrs); + }); + + }); + + [ + 'savedChildSavedParent', + 'newChildNewParent' + ].forEach((state) => { + + test(`a ${state} can clear its association via a null parentId`, function(assert) { + let [ user ] = this.helper[state](); + + user.representativeId = null; + + assert.equal(user.representativeId, null); + assert.equal(user.representative, null); + + user.save(); + + assert.equal(user.representativeId, null); + assert.equal(user.representative, null); + }); + + }); +}); diff --git a/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-set-test.js b/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-set-test.js new file mode 100644 index 000000000..4fb814992 --- /dev/null +++ b/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-set-test.js @@ -0,0 +1,43 @@ +import Helper, { states } from './_helper'; +import { module, test } from 'qunit'; + +module('Integration | ORM | Belongs To | Named one-way reflexive self referential | association #set', function(hooks) { + hooks.beforeEach(function() { + this.helper = new Helper(); + }); + + /* + The model can update its association via parent, for all states + */ + states.forEach((state) => { + + test(`a ${state} can update its association to itself`, function(assert) { + let [ user ] = this.helper[state](); + + user.representative = user; + + assert.equal(user.representativeId, user.id); + assert.deepEqual(user.representative.attrs, user.attrs); + + user.save(); + + assert.equal(user.representativeId, user.id); + assert.deepEqual(user.representative.attrs, user.attrs); + }); + + test(`a ${state} can update its association to a null parent`, function(assert) { + let [ user ] = this.helper[state](); + + user.representative = null; + + assert.equal(user.representativeId, null); + assert.deepEqual(user.representative, null); + + user.save(); + + assert.equal(user.representativeId, null); + assert.deepEqual(user.representative, null); + }); + + }); +}); From 1e32d94499e6053e913c85764534a8057643e855 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 7 Feb 2019 10:13:17 -0500 Subject: [PATCH 306/879] docs: upgrade addon docs --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 4cde04852..9cbf7b432 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "chai": "^4.1.0", "ember-ajax": "^3.1.0", "ember-cli": "~3.4.4", - "ember-cli-addon-docs": "^0.6.2", + "ember-cli-addon-docs": "^0.6.3", "ember-cli-addon-docs-esdoc": "^0.2.1", "ember-cli-app-version": "^2.0.0", "ember-cli-dependency-checker": "^3.0.0", diff --git a/yarn.lock b/yarn.lock index b946f00e5..c049616b0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4984,10 +4984,10 @@ ember-cli-addon-docs-esdoc@^0.2.1: tmp "^0.0.33" walk-sync "^0.3.2" -ember-cli-addon-docs@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.2.tgz#048fcc0d91dc16904a74fbe2feadd3c49e7c91f5" - integrity sha512-s2uU5GKXn2THqSaKfz2S69uzZiXfGzBRSFPLyDGOB3vPKqaT4CTqxPW/9w0QWuaz1GhgE0tBighcnmhMcO+qxQ== +ember-cli-addon-docs@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.3.tgz#c7d01d9ed542956643630fd1fdea8ff2639ac66e" + integrity sha512-e8kfFxeBiSNEGjgEB418Cto4tyuUZ+8Z5j05tNHwrEBo0L8qRHQ6cmdkbWgFiekfEd69kPl/m9fdSSZ9CQkN1w== dependencies: "@glimmer/syntax" "^0.36.4" broccoli-bridge "^1.0.0" From 833a8aa00df5918b07d0574a28a0adc41d5ac2e6 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 8 Feb 2019 19:07:00 -0500 Subject: [PATCH 307/879] Docs: explain how to override transitive dependencies closes #1498 --- .../cookbook/overriding-dependencies/template.md | 15 +++++++++++++++ tests/dummy/app/pods/docs/template.hbs | 1 + tests/dummy/app/router.js | 1 + 3 files changed, 17 insertions(+) create mode 100644 tests/dummy/app/pods/docs/cookbook/overriding-dependencies/template.md diff --git a/tests/dummy/app/pods/docs/cookbook/overriding-dependencies/template.md b/tests/dummy/app/pods/docs/cookbook/overriding-dependencies/template.md new file mode 100644 index 000000000..69a0f34f2 --- /dev/null +++ b/tests/dummy/app/pods/docs/cookbook/overriding-dependencies/template.md @@ -0,0 +1,15 @@ +# Overriding dependencies + +Mirage has several dependencies it relies on to function, including [Pretender.js](https://github.com/pretenderjs/pretender), a [fetch polyfill](https://github.com/github/fetch), and others. + +If you find yourself in a situation where you need specific features from any of these dependencies, but the version currently bundled with Mirage does not have those features, you have a few options: + +1. Submit a PR to Mirage upgrading its version of that dependency, and wait until that PR gets merged. + +2. Add the version of the dependency you want to your own project's `package.json` file, and use [yarn resolutions](https://yarnpkg.com/lang/en/docs/selective-version-resolutions/) to ensure that only that version of the dependency ends up in your build. + + If you do this, be aware that Mirage may not function properly if it relies on an API that changed between its bundled version and the version you specified. The only way to know for sure is to test your application using the new bundle. + +--- + +If you'd like to read more about the general problem of overriding transitive dependencies, check out {{#docs-link 'blog.detail' 'how-to-reliably-override-npm-dependencies-1497'}}this blog post{{/docs-link}}. diff --git a/tests/dummy/app/pods/docs/template.hbs b/tests/dummy/app/pods/docs/template.hbs index ffc5f56f5..2676642b1 100644 --- a/tests/dummy/app/pods/docs/template.hbs +++ b/tests/dummy/app/pods/docs/template.hbs @@ -24,6 +24,7 @@ {{nav.section "Cookbook"}} {{nav.item "Manually starting Mirage" "docs.cookbook.manually-starting-mirage"}} {{nav.item "Simulating cookie responses" "docs.cookbook.simulating-cookie-responses"}} + {{nav.item "Overriding dependencies" "docs.cookbook.overriding-dependencies"}} {{!-- {{nav.section "Examples"}} {{nav.item "1: Belongs to (no inverse)" "docs.examples.1-belongs-to"}} diff --git a/tests/dummy/app/router.js b/tests/dummy/app/router.js index 57f97a5c2..70d3cd327 100644 --- a/tests/dummy/app/router.js +++ b/tests/dummy/app/router.js @@ -24,6 +24,7 @@ Router.map(function() { this.route('cookbook', function() { this.route('manually-starting-mirage'); this.route('simulating-cookie-responses'); + this.route('overriding-dependencies'); }); this.route('advanced', function() { From 0a3e01c57af8fbda6524a14f1532009900dd984e Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 12 Feb 2019 17:46:37 -0500 Subject: [PATCH 308/879] Use compileMarkdown function from AddonDocs --- package.json | 2 +- tests/dummy/app/models/comment.js | 4 +- tests/dummy/app/models/post.js | 4 +- tests/dummy/app/pods/blog/index/controller.js | 63 ----------- tests/dummy/app/utils/render-markdown.js | 84 -------------- yarn.lock | 105 ++++++++++++++---- 6 files changed, 90 insertions(+), 172 deletions(-) delete mode 100644 tests/dummy/app/pods/blog/index/controller.js delete mode 100644 tests/dummy/app/utils/render-markdown.js diff --git a/package.json b/package.json index 9cbf7b432..df088542b 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "chai": "^4.1.0", "ember-ajax": "^3.1.0", "ember-cli": "~3.4.4", - "ember-cli-addon-docs": "^0.6.3", + "ember-cli-addon-docs": "^0.6.4", "ember-cli-addon-docs-esdoc": "^0.2.1", "ember-cli-app-version": "^2.0.0", "ember-cli-dependency-checker": "^3.0.0", diff --git a/tests/dummy/app/models/comment.js b/tests/dummy/app/models/comment.js index 49c54adf6..7e72569c8 100644 --- a/tests/dummy/app/models/comment.js +++ b/tests/dummy/app/models/comment.js @@ -1,5 +1,5 @@ import DS from 'ember-data'; -import renderMarkdown from 'dummy/utils/render-markdown'; +import compileMarkdown from 'ember-cli-addon-docs/utils/compile-markdown'; import { htmlSafe } from '@ember/string'; import { computed } from '@ember/object'; @@ -12,7 +12,7 @@ export default DS.Model.extend({ createdAt: DS.attr(), htmlBody: computed('body', function() { - return htmlSafe(renderMarkdown(this.body)); + return htmlSafe(compileMarkdown(this.body)); }) }); diff --git a/tests/dummy/app/models/post.js b/tests/dummy/app/models/post.js index 20205203d..53ff97d0e 100644 --- a/tests/dummy/app/models/post.js +++ b/tests/dummy/app/models/post.js @@ -1,7 +1,7 @@ import DS from 'ember-data'; import { computed } from '@ember/object'; import yaml from 'js-yaml'; -import renderMarkdown from 'dummy/utils/render-markdown'; +import compileMarkdown from 'ember-cli-addon-docs/utils/compile-markdown'; import { htmlSafe } from '@ember/string'; export default DS.Model.extend({ @@ -13,7 +13,7 @@ export default DS.Model.extend({ issueUrl: DS.attr(), htmlBody: computed('body', function() { - return htmlSafe(renderMarkdown(this.body)); + return htmlSafe(compileMarkdown(this.body)); }), meta: computed('body', function() { diff --git a/tests/dummy/app/pods/blog/index/controller.js b/tests/dummy/app/pods/blog/index/controller.js deleted file mode 100644 index d895eb337..000000000 --- a/tests/dummy/app/pods/blog/index/controller.js +++ /dev/null @@ -1,63 +0,0 @@ -import Controller from '@ember/controller'; - -export default Controller.extend({ - - // posts: [ - // { - // date: 'February 1, 2018', - // title: `Changing Mirage's default linkage data behavior in 0.4 to better conform to JSON:API's semantics`, - // slug: '2018-02-01-changing-mirages-default-linkage-data-behavior' - // }, - // { - // date: 'June 5, 2017', - // title: `Polymorphic associations and auto-discovery of Ember Data models`, - // slug: '2017-06-05-polymorphic-associations-and-auto-discovery-of-ember-data-models' - // }, - // { - // date: 'January 9, 2017', - // title: `Mirage 0.3.0 beta series`, - // slug: '2017-01-09-0-3-0-beta-series' - // }, - // { - // date: 'May 31, 2016', - // title: `Mirage 0.2.0 released`, - // slug: '2016-05-31-0-2-0-released' - // }, - // { - // date: 'May 13, 2016', - // title: `Mirage 0.2.0-beta.9 released`, - // slug: '2016-01-03-0-2-0-beta-9-released' - // }, - // { - // date: 'January 3, 2016', - // title: `Mirage 0.2 update`, - // slug: '2016-01-03-0-2-update-only-inject-schema' - // }, - // { - // date: 'November 3, 2015', - // title: `Video: Inside Ember CLI Mirage`, - // slug: '2015-11-03-inside-ember-cli-mirage' - // }, - // { - // date: 'October 19, 2015', - // title: `Serializers are ready for testing`, - // slug: '2015-10-19-serializers-ready' - // }, - // { - // date: 'September 15, 2015', - // title: `Refactoring Server, adding a Route Handler object`, - // slug: '2015-09-15-router-handler' - // }, - // { - // date: 'September 10, 2015', - // title: `The ORM is not ready, yet`, - // slug: '2015-09-10-orm-not-ready-yet' - // }, - // { - // date: 'September 6, 2015', - // title: `Thoughts on model attribute formatting`, - // slug: '2015-09-06-thoughts-on-model-attribute-formatting' - // } - // ] - -}); diff --git a/tests/dummy/app/utils/render-markdown.js b/tests/dummy/app/utils/render-markdown.js deleted file mode 100644 index aabd4cca6..000000000 --- a/tests/dummy/app/utils/render-markdown.js +++ /dev/null @@ -1,84 +0,0 @@ -import marked from 'marked'; - -/* - TODO: This is copied from AddonDocs. Need to make an importable - renderMarkdown function from AD that brings along highlighting. -*/ -class AddonDocsRenderer extends marked.Renderer { - constructor(config) { - super(); - this.config = config || {}; - } - - codespan() { - return this._processCode(super.codespan.apply(this, arguments)); - } - - code() { - let code = this._processCode(super.code.apply(this, arguments)); - return code.replace(/^
    /, '
    ');
    -  }
    -
    -  // Unescape markdown escaping in general, since it can interfere with
    -  // Handlebars templating
    -  text() {
    -    let text = super.text.apply(this, arguments);
    -    if (this.config.targetHandlebars) {
    -      text = text
    -        .replace(/&/g, '&')
    -        .replace(/</g, '<')
    -        .replace(/>/g, '>')
    -        .replace(/"|"/g, '"')
    -        .replace(/'|'/g, '\'');
    -    }
    -    return text;
    -  }
    -
    -  // Escape curlies in code spans/blocks to avoid treating them as Handlebars
    -  _processCode(string) {
    -    if (this.config.targetHandlebars) {
    -      string = this._escapeCurlies(string);
    -    }
    -
    -    return string;
    -  }
    -
    -  _escapeCurlies(string) {
    -    return string
    -      .replace(/{{/g, '{{')
    -      .replace(/}}/g, '}}');
    -  }
    -
    -  heading(text, level) {
    -    let id = text.toLowerCase().replace(/<\/?.*?>/g, '').replace(/[^\w]+/g, '-');
    -    let inner = level === 1 ? text : `${text}`;
    -
    -    return `
    -      ${inner}
    -    `;
    -  }
    -
    -  hr() {
    -    return `
    `; - } - - blockquote(text) { - return `
    ${text}
    `; - } - - link(href, title, text) { - let titleAttribute = title ? `title="${title}"` : ''; - return `${text}`; - } -} - -let renderer = new AddonDocsRenderer(); - -marked.setOptions({ - renderer, - headerIds: false -}); - -export default function(source) { - return source ? marked(source) : source; -} diff --git a/yarn.lock b/yarn.lock index c049616b0..c8e1cf00c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -507,6 +507,16 @@ dependencies: regenerator-transform "^0.13.3" +"@babel/plugin-transform-runtime@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.2.0.tgz#566bc43f7d0aedc880eaddbd29168d0f248966ea" + integrity sha512-jIgkljDdq4RYDnJyQsiWbdvGeei/0MOTtSHKO/rfbd/mXBxNpdlulMx49L0HQ4pug1fXannxoqCI+fYSle9eSw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + resolve "^1.8.1" + semver "^5.5.1" + "@babel/plugin-transform-shorthand-properties@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" @@ -608,6 +618,13 @@ js-levenshtein "^1.1.3" semver "^5.3.0" +"@babel/runtime@^7.2.0": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.3.1.tgz#574b03e8e8a9898eaf4a872a92ea20b7846f6f2a" + integrity sha512-7jGW8ppV0ant637pIqAcFfQDDH1orEPGJb8aXfUozuCU3QqX7rX4DA8iwrbPrR1hcH0FTTHz47yQnk+bl5xHQA== + dependencies: + regenerator-runtime "^0.12.0" + "@babel/template@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" @@ -2617,6 +2634,23 @@ broccoli-babel-transpiler@^7.1.0: rsvp "^4.8.3" workerpool "^2.3.1" +broccoli-babel-transpiler@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.1.2.tgz#fb5d6f8b9a805627ac3f2914ac9d86e82ca2413b" + integrity sha512-rljx86xgZJ2BjWt+xCSVfvyt3ONpCdMMXzMpeeVpAGdBHj3bqQICdPHZDAbzn1vKY/LIPsJZftvdxql1jiLGzw== + dependencies: + "@babel/core" "^7.0.0" + "@babel/polyfill" "^7.0.0" + broccoli-funnel "^2.0.1" + broccoli-merge-trees "^3.0.0" + broccoli-persistent-filter "^1.4.3" + clone "^2.1.2" + hash-for-dep "^1.2.3" + heimdalljs-logger "^0.1.9" + json-stable-stringify "^1.0.1" + rsvp "^4.8.3" + workerpool "^2.3.1" + broccoli-bridge@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/broccoli-bridge/-/broccoli-bridge-1.0.0.tgz#6223fd64b62062c31333539f0f3c42d0acd92fb1" @@ -4984,10 +5018,10 @@ ember-cli-addon-docs-esdoc@^0.2.1: tmp "^0.0.33" walk-sync "^0.3.2" -ember-cli-addon-docs@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.3.tgz#c7d01d9ed542956643630fd1fdea8ff2639ac66e" - integrity sha512-e8kfFxeBiSNEGjgEB418Cto4tyuUZ+8Z5j05tNHwrEBo0L8qRHQ6cmdkbWgFiekfEd69kPl/m9fdSSZ9CQkN1w== +ember-cli-addon-docs@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.4.tgz#96dee16cadea442f21b97ec79dd4fc50694379d7" + integrity sha512-MnGPRe2UnymvEojCY/5y01zr/1Ime9rX/X6sNvt8TYmQa1VkEcKW1/+H3nbjOQ7P7Sx9SVxL6duKWwzY3tYF/A== dependencies: "@glimmer/syntax" "^0.36.4" broccoli-bridge "^1.0.0" @@ -5000,15 +5034,16 @@ ember-cli-addon-docs@^0.6.3: broccoli-plugin "^1.3.1" broccoli-source "^1.1.0" broccoli-stew "^2.0.0" + ember-auto-import "^1.2.19" ember-cli-autoprefixer "^0.8.1" ember-cli-babel "^6.16.0" - ember-cli-clipboard "^0.10.0" + ember-cli-clipboard "^0.11.1" ember-cli-htmlbars "^3.0.0" ember-cli-htmlbars-inline-precompile "^1.0.3" ember-cli-sass "7.1.7" ember-cli-string-helpers "^1.9.0" ember-cli-tailwind "^0.6.2" - ember-code-snippet "^2.3.1" + ember-code-snippet "^2.4.0" ember-component-css "^0.6.7" ember-concurrency "^0.8.21" ember-data "2.x - 3.x" @@ -5022,10 +5057,11 @@ ember-cli-addon-docs@^0.6.3: ember-svg-jar "^1.2.2" ember-tether "^1.0.0-beta.2" ember-truth-helpers "^2.1.0" + esm "^3.2.4" execa "^1.0.0" fs-extra "^7.0.0" git-repo-info "^2.0.0" - highlightjs "^9.10.0" + highlight.js "^9.14.2" hosted-git-info "^2.7.1" html-entities "^1.2.1" inflected "^2.0.3" @@ -5199,6 +5235,30 @@ ember-cli-babel@^7.1.0: ensure-posix-path "^1.0.2" semver "^5.5.0" +ember-cli-babel@^7.1.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.4.2.tgz#9d7daa165b509e41f6dc3bb443ae32072f766aa2" + integrity sha512-5PJOkQ3B3Cvef2nQVPuZSPA6ckwiED3qF4cqzu7jcKhZ0Fy2TwPqABVbiPBJ46NujAsMZrjverVRST74Q25GqQ== + dependencies: + "@babel/core" "^7.0.0" + "@babel/plugin-transform-modules-amd" "^7.0.0" + "@babel/plugin-transform-runtime" "^7.2.0" + "@babel/polyfill" "^7.0.0" + "@babel/preset-env" "^7.0.0" + "@babel/runtime" "^7.2.0" + amd-name-resolver "^1.2.1" + babel-plugin-debug-macros "^0.2.0-beta.6" + babel-plugin-ember-modules-api-polyfill "^2.6.0" + babel-plugin-module-resolver "^3.1.1" + broccoli-babel-transpiler "^7.1.2" + broccoli-debug "^0.6.4" + broccoli-funnel "^2.0.1" + broccoli-source "^1.1.0" + clone "^2.1.2" + ember-cli-version-checker "^2.1.2" + ensure-posix-path "^1.0.2" + semver "^5.5.0" + ember-cli-broccoli-sane-watcher@^2.1.1: version "2.2.2" resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.2.2.tgz#9bb1b04ddeb2c086aecd8693cbaeca1d88dc160c" @@ -5210,14 +5270,14 @@ ember-cli-broccoli-sane-watcher@^2.1.1: rsvp "^3.0.18" sane "^2.4.1" -ember-cli-clipboard@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/ember-cli-clipboard/-/ember-cli-clipboard-0.10.0.tgz#7d194a68faa38a0d6fdf75a81249d0265e0aa56e" - integrity sha512-IPaBd6ChPu+DdYWDW7/+eR9vUZEJkLiY9R+JZnDheaiNZKD7vXeO1I9t5TT09U30Tjxo2QNyM0TXitlPvgZP5Q== +ember-cli-clipboard@^0.11.1: + version "0.11.1" + resolved "https://registry.yarnpkg.com/ember-cli-clipboard/-/ember-cli-clipboard-0.11.1.tgz#caa6aaae498f12922102555d6825ad81ad843d2a" + integrity sha512-LAsrFpaOV8mgyI4MLR6R2BJFbzW8ac3GZkTKmAH+V5LeyidK/Inr4yZpY5nff/jKlQFT6E4991Z9mzldfKJZcg== dependencies: broccoli-funnel "^1.1.0" clipboard "^2.0.0" - ember-cli-babel "^6.8.0" + ember-cli-babel "^7.1.2" ember-cli-htmlbars "^2.0.2" fastboot-transform "0.1.1" @@ -5733,10 +5793,10 @@ ember-cli@~3.4.4: watch-detector "^0.1.0" yam "^0.0.24" -ember-code-snippet@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/ember-code-snippet/-/ember-code-snippet-2.3.1.tgz#dd4b05d6fe9595c6cab532b70d70f9a442962046" - integrity sha512-vx6Oia5+fEw4kh0Jl6H3RPIJ9PFfAIHEjVza6FfEwZNdWlsXQbu+jff7KGBTw5oqEeXpXPd9L8Jbk0TgZw5f6w== +ember-code-snippet@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/ember-code-snippet/-/ember-code-snippet-2.4.0.tgz#3ed901ee0c6458019b67733e923056d5b9f74bc2" + integrity sha512-MLnUxsbxoW1njWYrIRB0T0AbH8Ng2IJTUMXSmR/40z4Hnu6ykC7sCFJyzxcmdIj6IVPmOcFN7WpOMEfPWjKmIQ== dependencies: broccoli-flatiron "^0.1.3" broccoli-merge-trees "^1.0.0" @@ -6513,6 +6573,11 @@ eslint@^4.0.0: table "^4.0.1" text-table "~0.2.0" +esm@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.4.tgz#0b728b5d6043061bf552197407bf2c630717812b" + integrity sha512-wOuWtQCkkwD1WKQN/k3RsyGSSN+AmiUzdKftn8vaC+uV9JesYmQlODJxgXaaRz0LaaFIlUxZaUu5NPiUAjKAAA== + espree@^3.5.2: version "3.5.3" resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.3.tgz#931e0af64e7fbbed26b050a29daad1fc64799fa6" @@ -8186,10 +8251,10 @@ heimdalljs@^0.3.0: dependencies: rsvp "~3.2.1" -highlightjs@^9.10.0: - version "9.10.0" - resolved "https://registry.yarnpkg.com/highlightjs/-/highlightjs-9.10.0.tgz#fca9b78ddaa3b1abca89d6c3ee105ad270a80190" - integrity sha1-/Km3jdqjsavKidbD7hBa0nCoAZA= +highlight.js@^9.14.2: + version "9.14.2" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.14.2.tgz#efbfb22dc701406e4da406056ef8c2b70ebe5b26" + integrity sha512-Nc6YNECYpxyJABGYJAyw7dBAYbXEuIzwzkqoJnwbc1nIpCiN+3ioYf0XrBnLiyyG0JLuJhpPtt2iTSbXiKLoyA== hmac-drbg@^1.0.0: version "1.0.1" From f8fd534859d9f9ea60525906320cef8f43511ad7 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 16 Feb 2019 17:48:14 -0500 Subject: [PATCH 309/879] cleanup identity manager test --- tests/integration/db/identity-manager-test.js | 40 ++++++++----------- 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/tests/integration/db/identity-manager-test.js b/tests/integration/db/identity-manager-test.js index 66da77d96..5cfbfcf19 100644 --- a/tests/integration/db/identity-manager-test.js +++ b/tests/integration/db/identity-manager-test.js @@ -22,18 +22,12 @@ const CustomIdentityManager = class { } }; -module('Integration | Server | Factory creation', function(hooks) { - hooks.beforeEach(function() { - this.Post = Model.extend({ - author: belongsTo() - }); - this.Author = Model.extend({ - posts: hasMany() - }); - this.Comment = Model.extend({ - post: belongsTo() - }); +module('Integration | Db | Identity manager', function(hooks) { + hooks.afterEach(function() { + this.server.shutdown(); + }); + test('it uses identity managers defined by config', function(assert) { this.server = new Server({ environment: 'test', identityManagers: { @@ -41,20 +35,18 @@ module('Integration | Server | Factory creation', function(hooks) { author: CustomIdentityManager }, models: { - author: this.Author, - comment: this.Comment, - post: this.Post + author: Model.extend({ + posts: hasMany() + }), + comment: Model.extend({ + post: belongsTo() + }), + post: Model.extend({ + author: belongsTo() + }) } }); - this.server.timing = 0; - this.server.logging = false; - }); - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('it uses identity managers defined by config', function(assert) { let author = server.create('author'); let comment = server.create('comment'); let post = server.create('post'); @@ -75,7 +67,7 @@ module('Integration | Server | Factory creation', function(hooks) { assert.deepEqual(data, dataForRecord); } }; - let serverForTest = new Server({ + this.server = new Server({ environment: 'test', identityManagers: { application: IdentityManagerForTest @@ -84,6 +76,6 @@ module('Integration | Server | Factory creation', function(hooks) { foo: Model.extend() } }); - serverForTest.create('foo', dataForRecord); + this.server.create('foo', dataForRecord); }); }); From dcab27a7bb775e1d6afda90cf8c2c9e81b9d1fd1 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 16 Feb 2019 17:21:21 -0500 Subject: [PATCH 310/879] Remove ember-lodash --- package.json | 2 +- yarn.lock | 19 +------------------ 2 files changed, 2 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index df088542b..deb12d2e7 100644 --- a/package.json +++ b/package.json @@ -47,9 +47,9 @@ "ember-cli-node-assets": "^0.2.2", "ember-get-config": "^0.2.2", "ember-inflector": "^2.0.0 || ^3.0.0", - "ember-lodash": "^4.19.4", "fake-xml-http-request": "^2.0.0", "faker": "^3.0.0", + "lodash": "^4.17.11", "pretender": "2.1.1", "route-recognizer": "^0.3.4" }, diff --git a/yarn.lock b/yarn.lock index c8e1cf00c..28b1356ca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3209,7 +3209,7 @@ broccoli-stew@^2.0.0, broccoli-stew@^2.0.1: symlink-or-copy "^1.2.0" walk-sync "^0.3.3" -broccoli-string-replace@^0.1.1, broccoli-string-replace@^0.1.2: +broccoli-string-replace@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/broccoli-string-replace/-/broccoli-string-replace-0.1.2.tgz#1ed92f85680af8d503023925e754e4e33676b91f" integrity sha1-HtkvhWgK+NUDAjkl51Tk4zZ2uR8= @@ -6038,18 +6038,6 @@ ember-load-initializers@^1.1.0: dependencies: ember-cli-babel "^6.6.0" -ember-lodash@^4.19.4: - version "4.19.4" - resolved "https://registry.yarnpkg.com/ember-lodash/-/ember-lodash-4.19.4.tgz#3e76e6cb04c9312c2158180bf16d7983aae05774" - integrity sha512-4O1YjFfFA1EL53XXxyjRwRRl1f1MahxON7dbPhe5Ex3f8lmuvB0fEc1U+kJ1IwefmUqeSyOBsYXG6L9ushOKQQ== - dependencies: - broccoli-debug "^0.6.1" - broccoli-funnel "^2.0.1" - broccoli-merge-trees "^3.0.0" - broccoli-string-replace "^0.1.1" - ember-cli-babel "^7.0.0" - lodash-es "^4.17.4" - ember-macro-helpers@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-macro-helpers/-/ember-macro-helpers-2.1.0.tgz#e8eeff5704da4d2d071cc6446cd29c3b9b4c0f6d" @@ -9545,11 +9533,6 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" -lodash-es@^4.17.4: - version "4.17.5" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.5.tgz#9fc6e737b1c4d151d8f9cae2247305d552ce748f" - integrity sha512-Ez3ONp3TK9gX1HYKp6IhetcVybD+2F+Yp6GS9dfH8ue6EOCEzQtQEh4K0FYWBP9qLv+lzeQAYXw+3ySfxyZqkw== - lodash._baseassign@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" From ec4465b40befd94560799d104d20e1ef6c54ea15 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sun, 17 Feb 2019 08:58:13 -0500 Subject: [PATCH 311/879] cleanup duplicate server instances in server test --- addon/server.js | 2 +- .../serializers/rest-serializer-test.js | 19 +-- tests/unit/server-test.js | 114 +++++++++--------- 3 files changed, 67 insertions(+), 68 deletions(-) diff --git a/addon/server.js b/addon/server.js index 649e3ea74..cdb2233a5 100644 --- a/addon/server.js +++ b/addon/server.js @@ -179,7 +179,7 @@ export default class Server { let didOverrideConfig = (config.environment && (this.environment && (this.environment !== config.environment))); assert(!didOverrideConfig, 'You cannot modify Mirage\'s environment once the server is created'); - this.environment = config.environment || 'development'; + this.environment = config.environment || this.environment || 'development'; this._config = config; diff --git a/tests/integration/serializers/rest-serializer-test.js b/tests/integration/serializers/rest-serializer-test.js index 5966fff2e..673c69a39 100644 --- a/tests/integration/serializers/rest-serializer-test.js +++ b/tests/integration/serializers/rest-serializer-test.js @@ -3,9 +3,12 @@ import Server from 'ember-cli-mirage/server'; import { Model, hasMany, belongsTo, RestSerializer } from 'ember-cli-mirage'; module('Integration | Serializer | RestSerializer', function(hooks) { + hooks.afterEach(function() { + this.server.shutdown(); + }); test('it sideloads associations and camel-cases relationships and attributes correctly for a model', function(assert) { - let server = new Server({ + this.server = new Server({ environment: 'test', models: { wordSmith: Model.extend({ @@ -27,13 +30,13 @@ module('Integration | Serializer | RestSerializer', function(hooks) { } }); - let link = server.create('word-smith', { name: 'Link', age: 123 }); + let link = this.server.create('word-smith', { name: 'Link', age: 123 }); link.createBlogPost({ title: 'Lorem' }); link.createBlogPost({ title: 'Ipsum' }); - server.create('word-smith', { name: 'Zelda', age: 230 }); + this.server.create('word-smith', { name: 'Zelda', age: 230 }); - let result = server.serializerOrRegistry.serialize(link); + let result = this.server.serializerOrRegistry.serialize(link); assert.deepEqual(result, { wordSmith: { @@ -57,7 +60,7 @@ module('Integration | Serializer | RestSerializer', function(hooks) { }); test('it works for has-many polymorphic associations', function(assert) { - let server = new Server({ + this.server = new Server({ environment: 'test', models: { wordSmith: Model.extend({ @@ -70,14 +73,14 @@ module('Integration | Serializer | RestSerializer', function(hooks) { } }); - let post = server.create('blog-post', { title: 'Post 1' }); - let link = server.create('word-smith', { + let post = this.server.create('blog-post', { title: 'Post 1' }); + let link = this.server.create('word-smith', { name: 'Link', age: 123, posts: [ post ] }); - let result = server.serializerOrRegistry.serialize(link); + let result = this.server.serializerOrRegistry.serialize(link); assert.deepEqual(result, { wordSmith: { diff --git a/tests/unit/server-test.js b/tests/unit/server-test.js index 03fe0bc1e..775f84fae 100644 --- a/tests/unit/server-test.js +++ b/tests/unit/server-test.js @@ -520,6 +520,8 @@ module('Unit | Server #create', function() { assert.deepEqual(anotherArticle.attrs, { title: 'Lorem ipsum', id: '2', authorId: '2', awesomeCategoryId: '2' }); assert.equal(server.db.authors.length, 2); assert.equal(server.db.categories.length, 2); + + server.shutdown(); }); test('create allows to create objects with associations with traits and overrides for associations', function(assert) { @@ -562,6 +564,8 @@ module('Unit | Server #create', function() { server.db.categories[0], { name: 'splendid software', id: '1', isPublished: true, publishedAt: '2016-01-01 12:00:00' } ); + + server.shutdown(); }); test('create does not create (extra) models on associations when they are passed in as overrides', function(assert) { @@ -593,6 +597,8 @@ module('Unit | Server #create', function() { server.create('child', { name: 'Dan', mother }); assert.equal(server.db.mothers.length, 1); + + server.shutdown(); }); }); @@ -1015,8 +1021,7 @@ module('Unit | Server #build', function(hooks) { }) }); - let server = new Server({ - environment: 'test', + this.server.config({ factories: { article: ArticleFactory, category: CategoryFactory @@ -1030,95 +1035,86 @@ module('Unit | Server #build', function(hooks) { } }); - let article = server.build('article', 'withCategory'); + let article = this.server.build('article', 'withCategory'); assert.deepEqual(article, { title: 'Lorem ipsum', categoryId: '1' }); - assert.equal(server.db.categories.length, 1); + assert.equal(this.server.db.categories.length, 1); assert.deepEqual( - server.db.categories[0], + this.server.db.categories[0], { name: 'splendid software', id: '1', isPublished: true, publishedAt: '2016-01-01 12:00:00' } ); }); test('build throws errors when using trait that is not defined and distinquishes between traits and non-traits', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', + this.server.config({ + factories: { + article: Factory.extend({ + title: 'Lorem ipsum', - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), + published: trait({ + isPublished: true, + publishedAt: '2010-01-01 10:00:00' + }), - private: { - someAttr: 'value' + private: { + someAttr: 'value' + } + }) } }); - this.server.loadFactories({ - article: ArticleFactory - }); - assert.throws(() => { this.server.build('article', 'private'); }, /'private' trait is not registered in 'article' factory/); }); test('build does not build objects and throws error if model is not registered and association helper is used', function(assert) { - let CategoryFactory = Factory.extend({ - name: 'splendid software', - - published: trait({ - isPublished: true, - publishedAt: '2014-01-01 10:00:00' - }) - }); - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', + this.server.config({ + factories: { + article: Factory.extend({ + title: 'Lorem ipsum', - withCategory: trait({ - category: association('published', { publishedAt: '2016-01-01 12:00:00' }) - }) - }); + withCategory: trait({ + category: association('published', { publishedAt: '2016-01-01 12:00:00' }) + }) + }), + category: Factory.extend({ + name: 'splendid software', - let server = new Server({ - environment: 'test', - factories: { - article: ArticleFactory, - category: CategoryFactory + published: trait({ + isPublished: true, + publishedAt: '2014-01-01 10:00:00' + }) + }) }, models: { - category: Model.extend({ - }) + category: Model.extend() } }); assert.throws(() => { - server.build('article', 'withCategory'); + this.server.build('article', 'withCategory'); }, /Model not registered: article/); }); test('build does not build objects and throws error if model for given association is not registered', function(assert) { - let CategoryFactory = Factory.extend({ - name: 'splendid software', - - published: trait({ - isPublished: true, - publishedAt: '2014-01-01 10:00:00' - }) - }); - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', + this.server.config({ + factories: { + article: Factory.extend({ + title: 'Lorem ipsum', - withCategory: trait({ - category: association('published', { publishedAt: '2016-01-01 12:00:00' }) - }) - }); + withCategory: trait({ + category: association('published', { publishedAt: '2016-01-01 12:00:00' }) + }) + }), + category: Factory.extend({ + name: 'splendid software', - let server = new Server({ - environment: 'test', - factories: { - article: ArticleFactory, - category: CategoryFactory + published: trait({ + isPublished: true, + publishedAt: '2014-01-01 10:00:00' + }) + }) }, models: { article: Model.extend() @@ -1126,7 +1122,7 @@ module('Unit | Server #build', function(hooks) { }); assert.throws(() => { - server.build('article', 'withCategory'); + this.server.build('article', 'withCategory'); }, /You're using the `association` factory helper on the 'category' attribute of your article factory/); }); }); From a22c64a95039d08a4a1f5878c8065e044a28c709 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Wed, 20 Feb 2019 12:55:48 +0000 Subject: [PATCH 312/879] build(deps): [security] bump atob from 2.0.3 to 2.1.2 Bumps [atob](https://github.com/coolaj86/node-browser-compat) from 2.0.3 to 2.1.2. **This update includes security fixes.** - [Release notes](https://github.com/coolaj86/node-browser-compat/releases) - [Commits](https://github.com/coolaj86/node-browser-compat/commits) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 28b1356ca..5226ed7c8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1533,9 +1533,9 @@ asynckit@^0.4.0: integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= atob@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d" - integrity sha1-GcenYEc3dEaPILLS0DNyrX1Mv10= + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== autoprefixer@^7.0.0: version "7.2.6" From 4c762b0808c6f3692f1f21985d4446b37589e959 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Wed, 20 Feb 2019 12:58:37 +0000 Subject: [PATCH 313/879] build(deps): [security] bump extend from 3.0.1 to 3.0.2 Bumps [extend](https://github.com/justmoon/node-extend) from 3.0.1 to 3.0.2. **This update includes security fixes.** - [Release notes](https://github.com/justmoon/node-extend/releases) - [Changelog](https://github.com/justmoon/node-extend/blob/master/CHANGELOG.md) - [Commits](https://github.com/justmoon/node-extend/compare/v3.0.1...v3.0.2) Signed-off-by: dependabot[bot] --- yarn.lock | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index 28b1356ca..131deea8b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6906,12 +6906,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@~3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" - integrity sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ= - -extend@~3.0.2: +extend@^3.0.0, extend@~3.0.1, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== From c654d4e9b00dc29ac19fee18dbf62727e0905f1a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Wed, 20 Feb 2019 12:59:31 +0000 Subject: [PATCH 314/879] build(deps): [security] bump handlebars from 4.0.11 to 4.1.0 Bumps [handlebars](https://github.com/wycats/handlebars.js) from 4.0.11 to 4.1.0. **This update includes security fixes.** - [Release notes](https://github.com/wycats/handlebars.js/releases) - [Changelog](https://github.com/wycats/handlebars.js/blob/master/release-notes.md) - [Commits](https://github.com/wycats/handlebars.js/compare/v4.0.11...v4.1.0) Signed-off-by: dependabot[bot] --- yarn.lock | 110 ++++-------------------------------------------------- 1 file changed, 8 insertions(+), 102 deletions(-) diff --git a/yarn.lock b/yarn.lock index 28b1356ca..8b12582ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1176,15 +1176,6 @@ ajv@^6.1.0, ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -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" - integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - amd-name-resolver@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-0.0.7.tgz#814301adfe8a2f109f6e84d5e935196efb669615" @@ -1498,7 +1489,7 @@ async-promise-queue@^1.0.3, async-promise-queue@^1.0.4: async "^2.4.1" debug "^2.6.8" -async@^1.4.0, async@^1.5.0, async@^1.5.2: +async@^1.5.0, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= @@ -3591,11 +3582,6 @@ camelcase-keys@^2.0.0: camelcase "^2.0.0" map-obj "^1.0.0" -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= - camelcase@^2.0.0, camelcase@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" @@ -3673,14 +3659,6 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - chai@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" @@ -3963,15 +3941,6 @@ clipboard@^2.0.0: select "^1.1.2" tiny-emitter "^2.0.0" -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - cliui@^3.0.3, cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" @@ -4603,7 +4572,7 @@ debug@~2.2.0: dependencies: ms "0.7.1" -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: +decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -8004,10 +7973,10 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -handlebars@^4.0.11, handlebars@^4.0.6: - version "4.0.12" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" - integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA== +handlebars@^4.0.11, handlebars@^4.0.4, handlebars@^4.0.6: + version "4.1.0" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.0.tgz#0d6a6f34ff1f63cecec8423aa4169827bf787c3a" + integrity sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w== dependencies: async "^2.5.0" optimist "^0.6.1" @@ -8015,17 +7984,6 @@ handlebars@^4.0.11, handlebars@^4.0.6: optionalDependencies: uglify-js "^3.1.4" -handlebars@^4.0.4: - version "4.0.11" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" - integrity sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw= - dependencies: - async "^1.4.0" - optimist "^0.6.1" - source-map "^0.4.4" - optionalDependencies: - uglify-js "^2.6" - har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -9385,11 +9343,6 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= - lazy-cache@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" @@ -10014,11 +9967,6 @@ log-symbols@^2.2.0: dependencies: chalk "^2.0.1" -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= - loose-envify@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" @@ -12522,13 +12470,6 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= - dependencies: - align-text "^0.1.1" - rimraf@2, rimraf@^2.2.8, rimraf@^2.3.2, rimraf@^2.4.1, rimraf@^2.4.4, rimraf@^2.5.3, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" @@ -13152,14 +13093,14 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@0.4.x, source-map@^0.4.2, source-map@^0.4.4: +source-map@0.4.x, source-map@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" integrity sha1-66T12pwNyZneaAMti092FzZSA2s= dependencies: amdefine ">=0.0.4" -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.1: +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -14040,16 +13981,6 @@ uc.micro@^1.0.0, uc.micro@^1.0.1, uc.micro@^1.0.3, uc.micro@^1.0.5: resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376" integrity sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg== -uglify-js@^2.6: - version "2.8.29" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" - integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= - dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" - uglify-js@^3.1.4: version "3.4.9" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" @@ -14058,11 +13989,6 @@ uglify-js@^3.1.4: commander "~2.17.1" source-map "~0.6.1" -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" - integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= - underscore.string@^3.2.2, underscore.string@~3.3.4: version "3.3.5" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023" @@ -14602,21 +14528,11 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2" -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= - window-size@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" integrity sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY= -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= - wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" @@ -14826,16 +14742,6 @@ yargs@^7.0.0: y18n "^3.2.1" yargs-parser "^5.0.0" -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" - yauzl@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" From efe85825ed00a18eee9edc05516ce764355f4678 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Wed, 20 Feb 2019 13:01:23 +0000 Subject: [PATCH 315/879] build(deps): [security] bump merge from 1.2.0 to 1.2.1 Bumps [merge](https://github.com/yeikos/js.merge) from 1.2.0 to 1.2.1. **This update includes security fixes.** - [Release notes](https://github.com/yeikos/js.merge/releases) - [Commits](https://github.com/yeikos/js.merge/compare/v1.2.0...v1.2.1) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 28b1356ca..9c6a72d09 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10309,9 +10309,9 @@ merge2@^1.2.3: integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== merge@^1.1.3, merge@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" - integrity sha1-dTHjnUlJwoGma4xabgJl6LBYlNo= + version "1.2.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" + integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== methods@~1.1.2: version "1.1.2" From f3a91fa34aab891c7ddaf5ddbe20358b1b6d7786 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Wed, 20 Feb 2019 13:03:04 +0000 Subject: [PATCH 316/879] build(deps): [security] bump mixin-deep from 1.3.0 to 1.3.1 Bumps [mixin-deep](https://github.com/jonschlinkert/mixin-deep) from 1.3.0 to 1.3.1. **This update includes security fixes.** - [Release notes](https://github.com/jonschlinkert/mixin-deep/releases) - [Commits](https://github.com/jonschlinkert/mixin-deep/compare/1.3.0...1.3.1) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 28b1356ca..0131c9e92 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10508,9 +10508,9 @@ mississippi@^3.0.0: through2 "^2.0.0" mixin-deep@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.0.tgz#47a8732ba97799457c8c1eca28f95132d7e8150a" - integrity sha512-dgaCvoh6i1nosAUBKb0l0pfJ78K8+S9fluyIR2YvAeUD/QuMahnFnF3xYty5eYXMjhGSsB0DsW6A0uAZyetoAg== + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" From af0d7f6a75564777a247028eab29634787f86f6d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Wed, 20 Feb 2019 13:04:31 +0000 Subject: [PATCH 317/879] build(deps): [security] bump sshpk from 1.13.1 to 1.16.1 Bumps [sshpk](https://github.com/joyent/node-sshpk) from 1.13.1 to 1.16.1. **This update includes security fixes.** - [Release notes](https://github.com/joyent/node-sshpk/releases) - [Commits](https://github.com/joyent/node-sshpk/compare/v1.13.1...v1.16.1) Signed-off-by: dependabot[bot] --- yarn.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/yarn.lock b/yarn.lock index 28b1356ca..99d1ee993 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12694,7 +12694,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -13259,18 +13259,18 @@ sri-toolbox@^0.2.0: integrity sha1-p/6lw/3lXmdc8cjAbz67XCk1g14= sshpk@^1.7.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" - integrity sha1-US322mKHFEMW3EwY/hzx2UBzm+M= + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" ecc-jsbn "~0.1.1" + getpass "^0.1.1" jsbn "~0.1.0" + safer-buffer "^2.0.2" tweetnacl "~0.14.0" ssri@^6.0.1: From b97914bdcd7eb5f2d4ee1cda8243932ffaec56bd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Wed, 20 Feb 2019 13:05:03 +0000 Subject: [PATCH 318/879] build(deps): [security] bump stringstream from 0.0.5 to 0.0.6 Bumps [stringstream](https://github.com/mhart/StringStream) from 0.0.5 to 0.0.6. **This update includes security fixes.** - [Release notes](https://github.com/mhart/StringStream/releases) - [Commits](https://github.com/mhart/StringStream/compare/v0.0.5...v0.0.6) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 28b1356ca..a602cc398 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13425,9 +13425,9 @@ string_decoder@~1.1.1: safe-buffer "~5.1.0" stringstream@~0.0.4: - version "0.0.5" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" - integrity sha1-TkhM1N5aC7vuGORjB3EKioFiGHg= + version "0.0.6" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72" + integrity sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA== strip-ansi@^0.3.0: version "0.3.0" From bf4ac5a8a7245c32c8a502bfcaf4bff5f3a30880 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 20 Feb 2019 17:06:52 -0500 Subject: [PATCH 319/879] v0.4.15 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index deb12d2e7..751907cd7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "0.4.14", + "version": "0.4.15", "description": "A client-side server to help you build, test and demo your Ember app", "keywords": [ "ember-addon", From 60250a0f35043f428ef98a99a4e7a3853d8a3fd4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 21 Feb 2019 10:36:49 +0000 Subject: [PATCH 320/879] build(deps-dev): bump ember-cli-inject-live-reload from 1.10.2 to 2.0.1 Bumps [ember-cli-inject-live-reload](https://github.com/rwjblue/ember-cli-inject-live-reload) from 1.10.2 to 2.0.1. - [Release notes](https://github.com/rwjblue/ember-cli-inject-live-reload/releases) - [Changelog](https://github.com/ember-cli/ember-cli-inject-live-reload/blob/master/CHANGELOG.md) - [Commits](https://github.com/rwjblue/ember-cli-inject-live-reload/compare/v1.10.2...v2.0.1) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 26 +++++--------------------- 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index 751907cd7..aca5124bf 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "ember-cli-favicon": "^1.0.0-beta.4", "ember-cli-htmlbars": "^3.0.0", "ember-cli-htmlbars-inline-precompile": "^1.0.3", - "ember-cli-inject-live-reload": "^1.8.2", + "ember-cli-inject-live-reload": "^2.0.1", "ember-cli-moment-shim": "^3.7.1", "ember-cli-qunit": "^4.4.0", "ember-cli-release": "^0.2.9", diff --git a/yarn.lock b/yarn.lock index a1279308d..66eebf64e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5433,10 +5433,10 @@ ember-cli-import-polyfill@^0.2.0: resolved "https://registry.yarnpkg.com/ember-cli-import-polyfill/-/ember-cli-import-polyfill-0.2.0.tgz#c1a08a8affb45c97b675926272fe78cf4ca166f2" integrity sha1-waCKiv+0XJe2dZJicv54z0yhZvI= -ember-cli-inject-live-reload@^1.8.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-1.10.2.tgz#43c59f7f1d1e717772da32e5e81d948fb9fe7c94" - integrity sha512-yFvZE4WFyWjzMJ6MTYIyjCXpcJNFMTaZP61JXITMkXhSkhuDkzMD/XfwR5+fr004TYcwrbNWpg1oGX5DbOgcaQ== +ember-cli-inject-live-reload@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-2.0.1.tgz#1bf3a6ea1747bceddc9f62f7ca8575de6b53ddaf" + integrity sha512-vrW/3KSrku+Prqmp7ZkpCxYkabnLrTHDEvV9B1yphTP++dhiV7n7Dv9NrmyubkoF3Inm0xrbbhB5mScvvuTQSg== dependencies: clean-base-url "^1.0.0" ember-cli-version-checker "^2.1.2" @@ -5645,15 +5645,7 @@ ember-cli-valid-component-name@^1.0.0: dependencies: silent-error "^1.0.0" -ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.1.0.tgz#fc79a56032f3717cf844ada7cbdec1a06fedb604" - integrity sha512-ssiNyVTp+PphroFum8guHX9py4xU1PCxkRYgb25NxumgjpKTPjhkgTfpRRKXlIQe+/wVMmhf+Uv6w9vSLZKWKQ== - dependencies: - resolve "^1.3.3" - semver "^5.3.0" - -ember-cli-version-checker@^2.1.1: +ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0, ember-cli-version-checker@^2.1.1, ember-cli-version-checker@^2.1.2: version "2.2.0" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.2.0.tgz#47771b731fe0962705e27c8199a9e3825709f3b3" integrity sha512-G+KtYIVlSOWGcNaTFHk76xR4GdzDLzAS4uxZUKdASuFX0KJE43C6DaqL+y3VTpUFLI2FIkAS6HZ4I1YBi+S3hg== @@ -5661,14 +5653,6 @@ ember-cli-version-checker@^2.1.1: resolve "^1.3.3" semver "^5.3.0" -ember-cli-version-checker@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.1.2.tgz#305ce102390c66e4e0f1432dea9dc5c7c19fed98" - integrity sha512-sjkHGr4IGXnO3EUcY21380Xo9Qf6bC8HWH4D62bVnrQop/8uha5XgMQRoAflMCeH6suMrezQL287JUoYc2smEw== - dependencies: - resolve "^1.3.3" - semver "^5.3.0" - ember-cli@~3.4.4: version "3.4.4" resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.4.4.tgz#8d25b223b2ef3b863310099192da92ab1feeef6b" From 83a0557353ad274f6c430e45bc1864e30cce2d14 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 21 Feb 2019 10:37:24 +0000 Subject: [PATCH 321/879] build(deps): bump broccoli-funnel from 2.0.1 to 2.0.2 Bumps [broccoli-funnel](https://github.com/broccolijs/broccoli-funnel) from 2.0.1 to 2.0.2. - [Release notes](https://github.com/broccolijs/broccoli-funnel/releases) - [Changelog](https://github.com/broccolijs/broccoli-funnel/blob/master/CHANGELOG.md) - [Commits](https://github.com/broccolijs/broccoli-funnel/compare/v2.0.1...v2.0.2) Signed-off-by: dependabot[bot] --- yarn.lock | 61 ++++++++++--------------------------------------------- 1 file changed, 11 insertions(+), 50 deletions(-) diff --git a/yarn.lock b/yarn.lock index a1279308d..f90884c1b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2869,9 +2869,9 @@ broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.1.0: walk-sync "^0.3.1" broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-2.0.1.tgz#6823c73b675ef78fffa7ab800f083e768b51d449" - integrity sha512-C8Lnp9TVsSSiZMGEF16C0dCiNg2oJqUKwuZ1K4kVC6qRPG/2Cj/rtB5kRCC9qEbwqhX71bDbfHROx0L3J7zXQg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-2.0.2.tgz#0edf629569bc10bd02cc525f74b9a38e71366a75" + integrity sha512-/vDTqtv7ipjEZQOVqO4vGDVAOZyuYzQ/EgGoyewfOgh1M7IQAToBKZI0oAQPgMBeFPPlIbfMuAngk+ohPBuaHQ== dependencies: array-equal "^1.0.0" blank-object "^1.0.1" @@ -3045,17 +3045,7 @@ broccoli-plugin@1.1.0: rimraf "^2.3.4" symlink-or-copy "^1.0.1" -broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli-plugin@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.0.tgz#bee704a8e42da08cb58e513aaa436efb7f0ef1ee" - integrity sha1-vucEqOQtoIy1jlE6qkNu+38O8e4= - dependencies: - promise-map-series "^0.2.1" - quick-temp "^0.1.3" - rimraf "^2.3.4" - symlink-or-copy "^1.1.8" - -broccoli-plugin@^1.3.0, broccoli-plugin@^1.3.1: +broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli-plugin@^1.2.1, broccoli-plugin@^1.3.0, broccoli-plugin@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.1.tgz#a26315732fb99ed2d9fb58f12a1e14e986b4fabd" integrity sha512-DW8XASZkmorp+q7J4EeDEZz+LoyKLAd2XZULXyD9l4m9/hAKV3vjHmB1kiUshcWAYMgTP1m2i4NnqCE/23h6AQ== @@ -7473,17 +7463,7 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.2.1" -fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.7.tgz#315e2b098d5fe7f622880ac965b1b051868ac871" - integrity sha512-dJwDX6NBH7IfdfFjZAdHCZ6fIKc8LwR7kzqUhYRFJuX4g9ctG/7cuqJuwegGQsyLEykp6Z4krq+yIFMQlt7d9Q== - dependencies: - heimdalljs-logger "^0.1.7" - object-assign "^4.1.0" - path-posix "^1.0.0" - symlink-or-copy "^1.1.8" - -fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.7, fs-tree-diff@^0.5.9: +fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6, fs-tree-diff@^0.5.7, fs-tree-diff@^0.5.9: version "0.5.9" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.9.tgz#a4ec6182c2f5bd80b9b83c8e23e4522e6f5fd946" integrity sha512-872G8ax0kHh01m9n/2KDzgYwouKza0Ad9iFltBpNykvROvf2AGtoOzPJgGx125aolGPER3JuC7uZFrQ7bG1AZw== @@ -7783,7 +7763,7 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.5, glob@^7.1.3: +glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -8171,20 +8151,13 @@ heimdalljs-logger@^0.1.7, heimdalljs-logger@^0.1.9: debug "^2.2.0" heimdalljs "^0.2.6" -heimdalljs@^0.2.0, heimdalljs@^0.2.5, heimdalljs@^0.2.6: +heimdalljs@^0.2.0, heimdalljs@^0.2.1, heimdalljs@^0.2.3, heimdalljs@^0.2.5, heimdalljs@^0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.2.6.tgz#b0eebabc412813aeb9542f9cc622cb58dbdcd9fe" integrity sha512-o9bd30+5vLBvBtzCPwwGqpry2+n0Hi6H1+qwt6y+0kwRHGGF8TFIhJPmnuM0xO97zaKrDZMwO/V56fAnn8m/tA== dependencies: rsvp "~3.2.1" -heimdalljs@^0.2.1, heimdalljs@^0.2.3: - version "0.2.5" - resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.2.5.tgz#6aa54308eee793b642cff9cf94781445f37730ac" - integrity sha1-aqVDCO7nk7ZCz/nPlHgURfN3MKw= - dependencies: - rsvp "~3.2.1" - heimdalljs@^0.3.0: version "0.3.3" resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.3.3.tgz#e92d2c6f77fd46d5bf50b610d28ad31755054d0b" @@ -12465,14 +12438,7 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -rimraf@2, rimraf@^2.2.8, rimraf@^2.3.2, rimraf@^2.4.1, rimraf@^2.4.4, rimraf@^2.5.3, rimraf@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== - dependencies: - glob "^7.0.5" - -rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.5.4, rimraf@^2.6.2: +rimraf@2, rimraf@^2.2.8, rimraf@^2.3.2, rimraf@^2.3.4, rimraf@^2.4.1, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -13504,16 +13470,11 @@ svgo@0.6.6: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= -symlink-or-copy@^1.0.0, symlink-or-copy@^1.1.8, symlink-or-copy@^1.2.0: +symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.8, symlink-or-copy@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.2.0.tgz#5d49108e2ab824a34069b68974486c290020b393" integrity sha512-W31+GLiBmU/ZR02Ii0mVZICuNEN9daZ63xZMPDsYgPgNjMtg+atqLEGI7PPI936jYSQZxoLb/63xos8Adrx4Eg== -symlink-or-copy@^1.0.1: - version "1.1.8" - resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.1.8.tgz#cabe61e0010c1c023c173b25ee5108b37f4b4aa3" - integrity sha1-yr5h4AEMHAI8Fzsl7lEIs39LSqM= - table@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" @@ -14298,7 +14259,7 @@ w3c-xmlserializer@^1.0.1: webidl-conversions "^4.0.2" xml-name-validator "^3.0.0" -walk-sync@0.3.2, walk-sync@^0.3.0, walk-sync@^0.3.2: +walk-sync@0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.2.tgz#4827280afc42d0e035367c4a4e31eeac0d136f75" integrity sha512-FMB5VqpLqOCcqrzA9okZFc0wq0Qbmdm396qJxvQZhDpyu0W95G9JCmp74tx7iyYnyOcBtUuKJsgIKAqjozvmmQ== @@ -14314,7 +14275,7 @@ walk-sync@^0.2.5, walk-sync@^0.2.7: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" -walk-sync@^0.3.1, walk-sync@^0.3.3: +walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2, walk-sync@^0.3.3: version "0.3.4" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.4.tgz#cf78486cc567d3a96b5b2237c6108017a5ffb9a4" integrity sha512-ttGcuHA/OBnN2pcM6johpYlEms7XpO5/fyKIr48541xXedan4roO8cS1Q2S/zbbjGH/BarYDAMeS2Mi9HE5Tig== From 4756c2826f7d224ad4d6c5135c377cba26b9644b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 21 Feb 2019 12:42:09 +0000 Subject: [PATCH 322/879] build(deps-dev): bump @ember/optional-features from 0.6.4 to 0.7.0 Bumps [@ember/optional-features](https://github.com/emberjs/ember-optional-features) from 0.6.4 to 0.7.0. - [Release notes](https://github.com/emberjs/ember-optional-features/releases) - [Commits](https://github.com/emberjs/ember-optional-features/compare/v0.6.4...v0.7.0) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 81 ++++++---------------------------------------------- 2 files changed, 9 insertions(+), 74 deletions(-) diff --git a/package.json b/package.json index 751907cd7..a7ce95984 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ }, "devDependencies": { "@ember/jquery": "^0.5.2", - "@ember/optional-features": "^0.6.3", + "@ember/optional-features": "^0.7.0", "active-model-adapter": "^2.0.3", "babel-eslint": "^8.2.6", "broccoli-asset-rev": "^2.7.0", diff --git a/yarn.lock b/yarn.lock index f90884c1b..ab705772e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -712,10 +712,10 @@ jquery "^3.3.1" resolve "^1.7.1" -"@ember/optional-features@^0.6.3": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@ember/optional-features/-/optional-features-0.6.4.tgz#8199f853c1781234fcb1f05090cddd0b822bff69" - integrity sha512-nKmKxMk+Q/BGE8cmfq8KTHnYHVgrU3GHhy/eZ/OTj/fUvzXZhxaEVFOfAXssiOzV3FOQDJjznpbua2TEtHaQRw== +"@ember/optional-features@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@ember/optional-features/-/optional-features-0.7.0.tgz#f65a858007020ddfb8342f586112750c32abd2d9" + integrity sha512-qLXvL/Kq/COb43oQmCrKx7Fy8k1XJDI2RlgbCnZHH26AGVgJT/sZugx1A2AIxKdamtl/Mi+rQSjGIuscSjqjDw== dependencies: chalk "^2.3.0" co "^4.6.0" @@ -1238,7 +1238,7 @@ ansi-styles@^2.2.1: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= -ansi-styles@^3.0.0, ansi-styles@^3.1.0, ansi-styles@^3.2.0: +ansi-styles@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" integrity sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug== @@ -3683,25 +3683,7 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" - integrity sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q== - dependencies: - ansi-styles "^3.1.0" - escape-string-regexp "^1.0.5" - supports-color "^4.0.0" - -chalk@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796" - integrity sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g== - dependencies: - ansi-styles "^3.2.0" - escape-string-regexp "^1.0.5" - supports-color "^5.2.0" - -chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -5635,15 +5617,7 @@ ember-cli-valid-component-name@^1.0.0: dependencies: silent-error "^1.0.0" -ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.1.0.tgz#fc79a56032f3717cf844ada7cbdec1a06fedb604" - integrity sha512-ssiNyVTp+PphroFum8guHX9py4xU1PCxkRYgb25NxumgjpKTPjhkgTfpRRKXlIQe+/wVMmhf+Uv6w9vSLZKWKQ== - dependencies: - resolve "^1.3.3" - semver "^5.3.0" - -ember-cli-version-checker@^2.1.1: +ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0, ember-cli-version-checker@^2.1.1, ember-cli-version-checker@^2.1.2: version "2.2.0" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.2.0.tgz#47771b731fe0962705e27c8199a9e3825709f3b3" integrity sha512-G+KtYIVlSOWGcNaTFHk76xR4GdzDLzAS4uxZUKdASuFX0KJE43C6DaqL+y3VTpUFLI2FIkAS6HZ4I1YBi+S3hg== @@ -5651,14 +5625,6 @@ ember-cli-version-checker@^2.1.1: resolve "^1.3.3" semver "^5.3.0" -ember-cli-version-checker@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.1.2.tgz#305ce102390c66e4e0f1432dea9dc5c7c19fed98" - integrity sha512-sjkHGr4IGXnO3EUcY21380Xo9Qf6bC8HWH4D62bVnrQop/8uha5XgMQRoAflMCeH6suMrezQL287JUoYc2smEw== - dependencies: - resolve "^1.3.3" - semver "^5.3.0" - ember-cli@~3.4.4: version "3.4.4" resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.4.4.tgz#8d25b223b2ef3b863310099192da92ab1feeef6b" @@ -7751,19 +7717,7 @@ glob@^6.0.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.3: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -8016,11 +7970,6 @@ has-flag@^1.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -13415,20 +13364,6 @@ supports-color@^3.2.3: dependencies: has-flag "^1.0.0" -supports-color@^4.0.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" - integrity sha1-vnoN5ITexcXN34s9WRJQRJEvY1s= - dependencies: - has-flag "^2.0.0" - -supports-color@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.2.0.tgz#b0d5333b1184dd3666cbe5aa0b45c5ac7ac17a4a" - integrity sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q== - dependencies: - has-flag "^3.0.0" - supports-color@^5.3.0, supports-color@^5.4.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" From 0d93eac11afe6fd15a6f0ea292f4ee4168799599 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 21 Feb 2019 13:38:23 -0500 Subject: [PATCH 323/879] feat: `normalizeIds` serializer property defaults to true (#1519) BREAKING CHANGE: This applies to the ActiveModelSerializer and RestSerializer. The `normalize` property on serializers helps Mirage's shorthands work by transforming differently formatted payloads into JSON:API documents. These documents are then used by Mirage to update the database accordingly. There was a gap in the default `normalize` method for a long time, in that it didn't take REST payloads that included foreign keys and looked like ```js let payload = { contact: { id: 1, name: 'Link', address: 1 } }; ``` and turn that `address` key into a proper JSON:API relationship: ```js data: { type: 'contacts', id: 1, attributes: { name: 'Link' }, relationships: { address: { data: { type: 'address', id: 1 } } } } ``` We added this feature a while ago, and it's controlled with the `normalizeIds` property on the ActiveModelSerializer and RESTSerializer. (We did this so the feature wouldn't be a breaking change.) We're now making `true` the default, which should be the behavior everyone desires (assuming they're using shorthands). This is technically a breaking change, though it's unlikely to affect most people. --- addon/serializers/active-model-serializer.js | 2 +- tests/unit/serializers/active-model-serializer-test.js | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/addon/serializers/active-model-serializer.js b/addon/serializers/active-model-serializer.js index fed75e79e..b0c1894b1 100644 --- a/addon/serializers/active-model-serializer.js +++ b/addon/serializers/active-model-serializer.js @@ -3,7 +3,7 @@ import { underscore, pluralize, dasherize, singularize, camelize } from '../util export default Serializer.extend({ serializeIds: 'always', - normalizeIds: false, + normalizeIds: true, keyForModel(type) { return underscore(type); diff --git a/tests/unit/serializers/active-model-serializer-test.js b/tests/unit/serializers/active-model-serializer-test.js index 19e913a2a..a0ff00a37 100644 --- a/tests/unit/serializers/active-model-serializer-test.js +++ b/tests/unit/serializers/active-model-serializer-test.js @@ -90,6 +90,12 @@ module('Unit | Serializers | ActiveModelSerializer', function(hooks) { assert.strictEqual(this.serializer.getCoalescedIds(request), undefined); }); + test('normalizeIds defaults to true', function(assert) { + let serializer = new ActiveModelSerializer(); + + assert.equal(serializer.normalizeIds, true); + }); + test('normalize works with normalizeIds set to true', function(assert) { this.serializer.normalizeIds = true; let payload = { From af36d9e19c1554d94e9270b10ab690faaa01c74a Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 21 Feb 2019 16:22:49 -0500 Subject: [PATCH 324/879] drop deprecated forms of create, createList and normalizedRequestAttrs (#1525) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BREAKING CHANGE: There are several places in Mirage's APIs that were intended to be used with singularized versions of model names, but just so happened to work if a non-singularized version was passed in. This behavior was discovered during a refactor, and the non-singularized versions were maintained to avoid breaking apps. Now that we're moving to 1.0, we're removing this deprecated/unintentional behavior. - `server.create` and `server.createList` were coded to take a singularized model name, e.g. `server.create('user')`. It just so happens that `server.create('users')` also works. That pluralized version is now removed from Mirage. If you're running the latest 0.x version you should see a deprecation message letting you know where to change it. Otherwise, it should be a pretty mechanic change from things like `server.create('users')` to `serer.create('user')`. Note this also applies to `server.createList` – the correct form is `server.createList('user', 3)`, and the pluralized form `server.createList('users', 3)` is now unsupported. - `this.normalizedRequestAttrs` in a route handler optionally takes a modelName as an argument. This is if your URLs are non-standard and Mirage cannot guess the modelName from the URL path. In this case, you can call `this.normalizedRequestAttrs('blog-post')` to tell Mirage to expect the payload to be for a `blog-post` model. This API was intended to be used with dasherized names, because that's how compound model names are specified throughout Mirage when they are represented as strings. It just so happened that `this.normalizedRequestAttrs('blogPost')` also worked, by chance, until a refactor. So, that behavior was kept but now is being removed. The correct usage is `this.normalizedRequestAttrs('blog-post')`. Using the camelized version of the model name is no longer supported. If either of these changes cause a ton of refactoring pain, we can try to marshal some resources to help write a codemod. Please open an issue if that's the case! --- addon/route-handlers/function.js | 8 +--- addon/server.js | 36 +++++++------- package.json | 1 + tests/helpers/reg-exp-from-string.js | 5 ++ .../normalize-request-attrs-test.js | 35 +++----------- .../server/create-and-create-list-test.js | 47 +++++++------------ 6 files changed, 46 insertions(+), 86 deletions(-) create mode 100644 tests/helpers/reg-exp-from-string.js diff --git a/addon/route-handlers/function.js b/addon/route-handlers/function.js index 60ac791dd..167cd5859 100644 --- a/addon/route-handlers/function.js +++ b/addon/route-handlers/function.js @@ -1,6 +1,6 @@ import BaseRouteHandler from './base'; import assert from 'ember-cli-mirage/assert'; -import { dasherize, camelize } from 'ember-cli-mirage/utils/inflector'; +import { dasherize } from 'ember-cli-mirage/utils/inflector'; /** * @hide @@ -51,11 +51,7 @@ export default class FunctionRouteHandler extends BaseRouteHandler { attrs = this._getAttrsForFormRequest(request); } else { if (modelName) { - if (dasherize(modelName) !== modelName) { - // eslint-disable-next-line no-console - console.warn(`Mirage [deprecation]: You called normalizedRequestAttrs('${modelName}'), but normalizedRequestAttrs was intended to be used with the dasherized version of the model type. Please change this to normalizedRequestAttrs('${dasherize(modelName)}'). This behavior will be removed in 1.0.`); - modelName = camelize(modelName); - } + assert(dasherize(modelName) === modelName, `You called normalizedRequestAttrs('${modelName}'), but normalizedRequestAttrs was intended to be used with the dasherized version of the model type. Please change this to normalizedRequestAttrs('${dasherize(modelName)}').`); } else { modelName = this.getModelClassFromPath(path); } diff --git a/addon/server.js b/addon/server.js index cdb2233a5..1cb19bcea 100644 --- a/addon/server.js +++ b/addon/server.js @@ -679,16 +679,12 @@ export default class Server { ``` @method create - @param type + @param type the singularized type of the model @param traitsAndOverrides @public */ create(type, ...options) { - if (this._typeIsPluralForModel(type)) { - console.warn(`Mirage [deprecation]: You called server.create('${type}'), but server.create was intended to be used with the singularized version of the model. Please change this to server.create('${singularize(type)}'). This behavior will be removed in 1.0.`); - - type = singularize(type); - } + assert(this._modelOrFactoryExistsForType(type), `You called server.create('${type}') but no model or factory was found. Make sure you're passing in the singularized version of the model or factory name.`); // When there is a Model defined, we should return an instance // of it instead of returning the bare attributes. @@ -766,16 +762,7 @@ export default class Server { @public */ createList(type, amount, ...traitsAndOverrides) { - assert( - this._modelOrFactoryExistsForTypeOrCollectionName(type), - `You called server.createList('${type}') but no model or factory was found.` - ); - - if (this._typeIsPluralForModel(type)) { - console.warn(`Mirage [deprecation]: You called server.createList('${type}'), but server.createList was intended to be used with the singularized version of the model. Please change this to server.createList('${singularize(type)}'). This behavior will be removed in 1.0.`); - - type = singularize(type); - } + assert(this._modelOrFactoryExistsForType(type), `You called server.createList('${type}') but no model or factory was found. Make sure you're passing in the singularized version of the model or factory name.`); assert(_isInteger(amount), `second argument has to be an integer, you passed: ${typeof amount}`); let list = []; @@ -1008,13 +995,22 @@ export default class Server { * @private * @hide */ - _modelOrFactoryExistsForTypeOrCollectionName(typeOrCollectionName) { - // Need this, since singular or plural can be passed in. Can assume singular (type) in 1.0. - let type = singularize(typeOrCollectionName); - + _modelOrFactoryExistsForType(type) { let modelExists = (this.schema && this.schema.modelFor(camelize(type))); let dbCollectionExists = this.db[toInternalCollectionName(type)]; + return (modelExists || dbCollectionExists) && !this._typeIsPluralForModel(type); + } + + /** + * + * @private + * @hide + */ + _modelOrFactoryExistsForTypeOrCollectionName(typeOrCollectionName) { + let modelExists = (this.schema && this.schema.modelFor(camelize(typeOrCollectionName))); + let dbCollectionExists = this.db[toInternalCollectionName(typeOrCollectionName)]; + return modelExists || dbCollectionExists; } diff --git a/package.json b/package.json index 751907cd7..90bfb779a 100644 --- a/package.json +++ b/package.json @@ -94,6 +94,7 @@ "ember-source": "~3.4.0", "ember-source-channel-url": "^1.1.0", "ember-try": "^1.0.0", + "escape-string-regexp": "^1.0.5", "eslint-plugin-ember": "^5.2.0", "eslint-plugin-ember-suave": "^1.0.0", "eslint-plugin-node": "^7.0.1", diff --git a/tests/helpers/reg-exp-from-string.js b/tests/helpers/reg-exp-from-string.js new file mode 100644 index 000000000..76251297d --- /dev/null +++ b/tests/helpers/reg-exp-from-string.js @@ -0,0 +1,5 @@ +import escape from 'escape-string-regexp'; + +export default function(str) { + return new RegExp(escape(str)); +} diff --git a/tests/integration/route-handlers/function-handler/normalize-request-attrs-test.js b/tests/integration/route-handlers/function-handler/normalize-request-attrs-test.js index 411359b09..e69d1fe7b 100644 --- a/tests/integration/route-handlers/function-handler/normalize-request-attrs-test.js +++ b/tests/integration/route-handlers/function-handler/normalize-request-attrs-test.js @@ -2,22 +2,7 @@ import { module, test } from 'qunit'; import { Model, ActiveModelSerializer } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; import promiseAjax from '../../../helpers/promise-ajax'; - -// eslint-disable-next-line no-console -let originalWarn = console.warn; - -function expectWarning(assert, warning) { - if (!warning) { - assert.ok(false, 'You must pass in a message when expecting a warning'); - } - - // eslint-disable-next-line no-console - console.warn = message => { - let re = new RegExp(warning.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')); - - assert.ok(re.test(message), 'the correct warning message was logged'); - }; -} +import regExpFromString from '../../../helpers/reg-exp-from-string'; module('Integration | Route handlers | Function handler | #normalizedRequestAttrs', function(hooks) { hooks.beforeEach(function() { @@ -39,9 +24,6 @@ module('Integration | Route handlers | Function handler | #normalizedRequestAttr hooks.afterEach(function() { this.server.shutdown(); - - // eslint-disable-next-line no-console - console.warn = originalWarn; }); test(`it returns an object with the primary resource's attrs and belongsTo keys camelized`, async function(assert) { @@ -152,18 +134,13 @@ module('Integration | Route handlers | Function handler | #normalizedRequestAttr }); }); - test(`it warns if the optional parameter is camelized for a model with a compount name`, async function(assert) { - assert.expect(2); - expectWarning(assert, `but normalizedRequestAttrs was intended to be used with the dasherized version of the model type`); + test(`it errors if the optional parameter is camelized for a model with a compount name`, async function(assert) { + assert.expect(1); this.server.post('/fine-comments/create', function() { - let attrs = this.normalizedRequestAttrs('fineComment'); - - assert.deepEqual(attrs, { - shortText: 'lorem ipsum' - }); - - return {}; + assert.throws(() => { + this.normalizedRequestAttrs('fineComment'); + }, regExpFromString(`You called normalizedRequestAttrs('fineComment'), but normalizedRequestAttrs was intended to be used with the dasherized version of the model type. Please change this to normalizedRequestAttrs('fine-comment')`)); }); await promiseAjax({ diff --git a/tests/integration/server/create-and-create-list-test.js b/tests/integration/server/create-and-create-list-test.js index 1094d0a63..38327f311 100644 --- a/tests/integration/server/create-and-create-list-test.js +++ b/tests/integration/server/create-and-create-list-test.js @@ -2,23 +2,12 @@ import { module, test } from 'qunit'; import { Model, Factory, hasMany, belongsTo } from 'ember-cli-mirage'; import Inflector from 'ember-inflector'; import Server from 'ember-cli-mirage/server'; +// import escape from 'escape-string-regexp'; +import regExpFromString from '../../helpers/reg-exp-from-string'; // eslint-disable-next-line no-console let originalWarn = console.warn; -function expectWarning(assert, warning) { - if (!warning) { - assert.ok(false, 'You must pass in a message when expecting a warning'); - } - - // eslint-disable-next-line no-console - console.warn = message => { - let re = new RegExp(warning.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')); - - assert.ok(re.test(message), 'the correct warning message was logged'); - }; -} - function expectNoWarning(assert) { // eslint-disable-next-line no-console console.warn = () => { @@ -70,18 +59,16 @@ module('Integration | Server | create and createList', function(hooks) { assert.throws(() => { this.server.create('foo'); - }, /You called server.create\('foo'\) but no model or factory was found\./); + }, regExpFromString(`You called server.create('foo') but no model or factory was found.`)); }); - test('create warns when passing in a pluralized version of a model', function(assert) { - assert.expect(3); - - expectWarning(assert, `server.create was intended to be used with the singularized version of the model`); - - let contact = this.server.create('contacts'); + // This used to be deprecated behavior, but now it errors. So we test it separately from the nonsense test above. + test('create throws when passing in a pluralized version of a model', function(assert) { + assert.expect(1); - assert.ok(contact instanceof this.Contact, 'expected a Contact'); - assert.equal(contact.name, 'Yehuda', 'the factory is used'); + assert.throws(() => { + this.server.create('contacts'); + }, regExpFromString(`You called server.create('contacts') but no model or factory was found. Make sure you're passing in the singularized version of the model or factory name`)); }); test('create returns a Model if one is defined', function(assert) { @@ -107,18 +94,16 @@ module('Integration | Server | create and createList', function(hooks) { assert.throws(() => { this.server.createList('foo', 1); - }, /You called server.createList\('foo'\) but no model or factory was found\./); + }, regExpFromString(`You called server.createList('foo') but no model or factory was found.`)); }); - test('createList warns when passing in a pluralized version of a model', function(assert) { - assert.expect(3); - - expectWarning(assert, `server.createList was intended to be used with the singularized version of the model`); + // This used to be deprecated behavior, but now it errors. So we test it separately from the nonsense test above. + test('createList throws when passing in a pluralized version of a model', function(assert) { + assert.expect(1); - let contacts = this.server.createList('contacts', 1); - - assert.ok(contacts[0] instanceof this.Contact, 'expected a Contact'); - assert.equal(contacts[0].name, 'Yehuda', 'the factory is used'); + assert.throws(() => { + this.server.createList('contacts', 1); + }, regExpFromString(`You called server.createList('contacts') but no model or factory was found. Make sure you're passing in the singularized version of the model or factory name.`)); }); test('createList returns Models if one is defined', function(assert) { From 9e6d1c702242bf2274f496c8a67ebbda7f8487cc Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 21 Feb 2019 16:56:34 -0500 Subject: [PATCH 325/879] delete skipped tests (#1526) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These tests have been skipped for 3 years 🙃 I think someone spiked ad-hoc serializer-level relationships, but we definitely never got that feature in. Removing these for now! --- .../base/associations/many-to-many-test.js | 78 --------- .../associations/many-to-many-test.js | 155 ------------------ 2 files changed, 233 deletions(-) delete mode 100644 tests/integration/serializers/base/associations/many-to-many-test.js delete mode 100644 tests/integration/serializers/json-api-serializer/associations/many-to-many-test.js diff --git a/tests/integration/serializers/base/associations/many-to-many-test.js b/tests/integration/serializers/base/associations/many-to-many-test.js deleted file mode 100644 index bc2db6fe0..000000000 --- a/tests/integration/serializers/base/associations/many-to-many-test.js +++ /dev/null @@ -1,78 +0,0 @@ -import { module, skip } from 'qunit'; -import { Collection, Model, hasMany, belongsTo, Serializer } from 'ember-cli-mirage'; -import Db from 'ember-cli-mirage/db'; -import Schema from 'ember-cli-mirage/orm/schema'; -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; - -module('Integration | Serializers | Base | Associations | Many To Many', function(hooks) { - hooks.beforeEach(function() { - let db = new Db(); - - let schema = new Schema(db, { - contact: Model.extend({ - addresses: hasMany(), - contactAddresses: hasMany() - }), - address: Model.extend({ - contacts: hasMany(), - contactAddresses: hasMany() - }), - contactAddress: Model.extend({ - contact: belongsTo(), - address: belongsTo() - }) - }); - - let registry = new SerializerRegistry(schema, { - contact: Serializer.extend({ - include: ['addresses'], - addresses(model) { - let models = model.contactAddresses.models.map((ca) => ca.address); - return new Collection('address', models); - } - }), - address: Serializer.extend({ - include: ['contacts'], - contacts(model) { - let models = model.contactAddresses.models.map((ca) => ca.contact); - return new Collection('contact', models); - } - }) - }); - - let mario = schema.contacts.create({ name: 'Mario' }); - let newYork = schema.addresses.create({ street: 'Some New York Street' }); - let mushroomKingdom = schema.addresses.create({ street: 'Some Mushroom Kingdom Street' }); - - schema.contactAddresses.create({ contact: mario, address: newYork }); - schema.contactAddresses.create({ contact: mario, address: mushroomKingdom }); - - this.schema = schema; - this.registry = registry; - }); - - skip(`it serializes manyToMany if properly configured to passthrough`, function(assert) { - let contact = this.schema.contacts.find(1); - let result = this.registry.serialize(contact); - - assert.deepEqual(result, { - addresses: [{ - contactId: null, // side-effect of having a HasMany on the contactAddress side of things - contactIds: ['1'], - id: '1', - street: 'Some New York Street' - }, { - contactId: null, - contactIds: ['1'], - id: '2', - street: 'Some Mushroom Kingdom Street' - }], - contact: { - addressId: null, // side-effect of having a HasMany on the contactAddress side of things - addressIds: ['1', '2'], - id: '1', - name: 'Mario' - } - }); - }); -}); diff --git a/tests/integration/serializers/json-api-serializer/associations/many-to-many-test.js b/tests/integration/serializers/json-api-serializer/associations/many-to-many-test.js deleted file mode 100644 index e6a89fa71..000000000 --- a/tests/integration/serializers/json-api-serializer/associations/many-to-many-test.js +++ /dev/null @@ -1,155 +0,0 @@ -import { module, skip } from 'qunit'; -import { Collection, Model, hasMany, belongsTo, JSONAPISerializer } from 'ember-cli-mirage'; -import Db from 'ember-cli-mirage/db'; -import Schema from 'ember-cli-mirage/orm/schema'; -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; - -module('Integration | Serializers | JSON API Serializer | Associations | Many To Many', function(hooks) { - hooks.beforeEach(function() { - let db = new Db(); - - let schema = new Schema(db, { - contact: Model.extend({ - addresses: hasMany(), - contactAddresses: hasMany() - }), - address: Model.extend({ - contacts: hasMany(), - contactAddresses: hasMany() - }), - contactAddress: Model.extend({ - contact: belongsTo(), - address: belongsTo() - }) - }); - - let mario = schema.contacts.create({ name: 'Mario' }); - let newYork = schema.addresses.create({ street: 'Some New York Street' }); - let mushroomKingdom = schema.addresses.create({ street: 'Some Mushroom Kingdom Street' }); - - schema.contactAddresses.create({ contact: mario, address: newYork }); - schema.contactAddresses.create({ contact: mario, address: mushroomKingdom }); - - this.schema = schema; - }); - - skip(`it serializes manyToMany if properly configured to passthrough `, function(assert) { - let contactSerializer = JSONAPISerializer.extend({ - addresses(model) { - let models = model.contactAddresses.models.map((ca) => ca.address); - return new Collection('address', models); - } - }); - - let addressSerializer = JSONAPISerializer.extend({ - contacts(model) { - let models = model.contactAddresses.models.map((ca) => ca.contact); - return new Collection('contact', models); - } - }); - - let registry = new SerializerRegistry(this.schema, { - address: addressSerializer, - contact: contactSerializer - }); - - let contact = this.schema.contacts.find(1); - let result = registry.serialize(contact); - - assert.deepEqual(result, { - data: { - id: '1', - type: 'contacts', - attributes: { - name: 'Mario' - }, - relationships: { - addresses: { - data: [ - { id: '1', type: 'addresses' }, - { id: '2', type: 'addresses' } - ] - }, - 'contact-addresses': { - data: [ - { id: '1', type: 'contact-addresses' }, - { id: '2', type: 'contact-addresses' } - ] - } - } - } - }); - }); - - skip(`it sideloads manyToMany if properly configured to passthrough and include`, function(assert) { - let contactSerializer = JSONAPISerializer.extend({ - include: ['addresses'], - addresses(model) { - let models = model.contactAddresses.models.map((ca) => ca.address); - return new Collection('address', models); - } - }); - - let addressSerializer = JSONAPISerializer.extend({ - include: ['contacts'], - contacts(model) { - let models = model.contactAddresses.models.map((ca) => ca.contact); - return new Collection('contact', models); - } - }); - - let registry = new SerializerRegistry(this.schema, { - address: addressSerializer, - contact: contactSerializer - }); - - let contact = this.schema.contacts.find(1); - let result = registry.serialize(contact); - - let { data, included } = result; - - assert.deepEqual(data, { - id: '1', - type: 'contacts', - attributes: { - name: 'Mario' - }, - relationships: { - addresses: { - data: [ - { id: '1', type: 'addresses' }, - { id: '2', type: 'addresses' } - ] - }, - 'contact-addresses': { - data: [ - { id: '1', type: 'contact-addresses' }, - { id: '2', type: 'contact-addresses' } - ] - } - } - }); - - assert.deepEqual(included, [{ - id: '1', - type: 'addresses', - attributes: { - street: 'Some New York Street' - }, - relationships: { - contacts: { data: [{ id: '1', type: 'contacts' }] }, - 'contact-addresses': { data: [{ id: '1', type: 'contact-addresses' }] } - } - }, { - id: '2', - type: 'addresses', - attributes: { - street: 'Some Mushroom Kingdom Street' - }, - relationships: { - contacts: { data: [{ id: '1', type: 'contacts' }] }, - 'contact-addresses': { data: [{ id: '2', type: 'contact-addresses' }] } - } - }]); - }); -}); From 55bd32072eb352ae8f1e60d90275ed0822a787f5 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 21 Feb 2019 18:20:40 -0500 Subject: [PATCH 326/879] Remove faker.js (#1527) --- .eslintrc.js | 1 - addon/faker.js | 27 ------ addon/index.js | 2 - index.js | 3 - package.json | 2 +- test-projects/01-basic-app/ember-cli-build.js | 4 +- .../01-basic-app/mirage/factories/user.js | 6 ++ test-projects/01-basic-app/package.json | 4 +- .../tests/acceptance/faker-test.js | 15 +++ .../pods/docs/advanced/factories/template.md | 42 ++++---- .../getting-started/quickstart/template.md | 16 ++- .../getting-started/upgrading/template.md | 97 +++++++++++++++++-- .../seeding-your-database/template.md | 13 ++- tests/integration/index-named-imports-test.js | 5 - tests/performance/faker-factory-test.js | 38 -------- tests/unit/faker-test.js | 34 ------- yarn.lock | 8 +- 17 files changed, 155 insertions(+), 162 deletions(-) delete mode 100644 addon/faker.js create mode 100644 test-projects/01-basic-app/tests/acceptance/faker-test.js delete mode 100644 tests/performance/faker-factory-test.js delete mode 100644 tests/unit/faker-test.js diff --git a/.eslintrc.js b/.eslintrc.js index 9808338b4..d1a7ce938 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -27,7 +27,6 @@ module.exports = { 'no-unused-vars': ['error', { 'args': 'none' }] }, globals: { - faker: true, server: true }, overrides: [ diff --git a/addon/faker.js b/addon/faker.js deleted file mode 100644 index 321dc8fc5..000000000 --- a/addon/faker.js +++ /dev/null @@ -1,27 +0,0 @@ -let list = { - random() { - let items = arguments.length > 0 ? arguments : []; - - return function() { - return faker.random.arrayElement(items); - }; - }, - - cycle() { - let items = arguments.length > 0 ? arguments : []; - - return function(i) { - return items[i % items.length]; - }; - } -}; - -faker.list = list; - -faker.random.number.range = function(min, max) { - return function(/* i */) { - return Math.random() * (max - min) + min; - }; -}; - -export default faker; diff --git a/addon/index.js b/addon/index.js index e465ca412..e0e7ac440 100644 --- a/addon/index.js +++ b/addon/index.js @@ -2,7 +2,6 @@ import Factory from './factory'; import trait from './trait'; import association from './association'; import Response from './response'; -import faker from './faker'; import Model from './orm/model'; import Collection from './orm/collection'; import Serializer from './serializer'; @@ -32,7 +31,6 @@ export { trait, association, Response, - faker, Model, Collection, Serializer, diff --git a/index.js b/index.js index 7ba619027..06e9c8a82 100644 --- a/index.js +++ b/index.js @@ -20,9 +20,6 @@ module.exports = { }), 'fake-xml-http-request': npmAsset({ import: ['fake_xml_http_request.js'] - }), - 'faker': npmAsset({ - import: ['build/build/faker.js'] }) } }, diff --git a/package.json b/package.json index 90bfb779a..f1bf8770a 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,6 @@ "ember-get-config": "^0.2.2", "ember-inflector": "^2.0.0 || ^3.0.0", "fake-xml-http-request": "^2.0.0", - "faker": "^3.0.0", "lodash": "^4.17.11", "pretender": "2.1.1", "route-recognizer": "^0.3.4" @@ -98,6 +97,7 @@ "eslint-plugin-ember": "^5.2.0", "eslint-plugin-ember-suave": "^1.0.0", "eslint-plugin-node": "^7.0.1", + "faker": "^4.1.0", "fastboot": "^1.2.0", "js-yaml": "^3.12.1", "jsdom": "^13.1.0", diff --git a/test-projects/01-basic-app/ember-cli-build.js b/test-projects/01-basic-app/ember-cli-build.js index d690a2531..3095129d6 100644 --- a/test-projects/01-basic-app/ember-cli-build.js +++ b/test-projects/01-basic-app/ember-cli-build.js @@ -4,7 +4,9 @@ const EmberApp = require('ember-cli/lib/broccoli/ember-app'); module.exports = function(defaults) { let app = new EmberApp(defaults, { - // Add options here + autoImport: { + exclude: ['qunit'] + } }); // Use `app.import` to add additional libraries to the generated diff --git a/test-projects/01-basic-app/mirage/factories/user.js b/test-projects/01-basic-app/mirage/factories/user.js index 85018979d..6a59ee9d2 100644 --- a/test-projects/01-basic-app/mirage/factories/user.js +++ b/test-projects/01-basic-app/mirage/factories/user.js @@ -1,4 +1,10 @@ import { Factory } from 'ember-cli-mirage'; +import faker from 'faker'; export default Factory.extend({ + + age() { + return faker.random.number({ min: 32, max: 32 }); + } + }); diff --git a/test-projects/01-basic-app/package.json b/test-projects/01-basic-app/package.json index 0e6ec44fe..ee3f282c8 100644 --- a/test-projects/01-basic-app/package.json +++ b/test-projects/01-basic-app/package.json @@ -21,6 +21,7 @@ "@ember/jquery": "*", "broccoli-asset-rev": "*", "ember-ajax": "*", + "ember-auto-import": "*", "ember-cli": "*", "ember-cli-babel": "*", "ember-cli-dependency-checker": "*", @@ -43,7 +44,8 @@ "jsdom": "*", "loader.js": "*", "qunit": "*", - "qunit-dom": "*" + "qunit-dom": "*", + "faker": "*" }, "engines": { "node": ">= 8.*" diff --git a/test-projects/01-basic-app/tests/acceptance/faker-test.js b/test-projects/01-basic-app/tests/acceptance/faker-test.js new file mode 100644 index 000000000..4a2189730 --- /dev/null +++ b/test-projects/01-basic-app/tests/acceptance/faker-test.js @@ -0,0 +1,15 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; + +module('Acceptance | Faker', function(hooks) { + setupTest(hooks); + setupMirage(hooks); + + test('it works', function(assert) { + let user = this.server.create('user'); + + assert.equal(user.age, 32); + }); + +}); diff --git a/tests/dummy/app/pods/docs/advanced/factories/template.md b/tests/dummy/app/pods/docs/advanced/factories/template.md index 38738a5ab..b1abc4d70 100644 --- a/tests/dummy/app/pods/docs/advanced/factories/template.md +++ b/tests/dummy/app/pods/docs/advanced/factories/template.md @@ -90,11 +90,13 @@ relationships (as we'll see in a moment): ```js // mirage/factories/contact.js -import { Factory, faker } from 'ember-cli-mirage'; +import { Factory } from 'ember-cli-mirage'; export default Factory.extend({ - isAdmin: faker.random.boolean, + isAdmin(i) { + return Math.random() > 0.5; + }, afterCreate(contact, server) { // Only allow a max of 5 admins to be created @@ -172,10 +174,13 @@ You can also use the `afterCreate()` hook (for both `hasMany` and `belongsTo` re ```js // mirage/factories/author.js -import { Factory, faker } from 'ember-cli-mirage'; +import { Factory } from 'ember-cli-mirage'; export default Factory.extend({ - firstName: faker.name.firstName, + firstName(i) { + return `Author ${i}`; + }, + afterCreate(author, server) { server.create('post', { author }); } @@ -269,11 +274,21 @@ Traits improve your test suite by pulling unnecessary knowledge about data setup ## Using Faker.js -The [Faker.js](https://github.com/marak/Faker.js/) library is included with Mirage, and its methods work nicely with factory definitions: +The [Faker.js](https://github.com/marak/Faker.js/) library pairs nicely with with Mirage factories. It used to be directly included with Mirage, since import npm libraries was a hassle, but with the advent of [Ember Auto Import](https://github.com/ef4/ember-auto-import/issues) it is easier than ever for apps and addons to include it on their own. + +To use Faker, make sure your app or addon has Auto Import installed, then install `faker` from npm: + +```sh +ember install ember-auto-import +yarn add -D faker +``` + +Now you can use Faker's methods in your Mirage factories: ```js // mirage/factories/user.js -import { Factory, faker } from 'ember-cli-mirage'; +import { Factory } from 'ember-cli-mirage'; +import faker from 'faker'; export default Factory.extend({ firstName() { @@ -288,21 +303,8 @@ export default Factory.extend({ }); ``` -We've also added two methods on the `faker` namespace, `list.cycle` and `list.random`, which are useful if you have a set of data you want your factories to iterate through: - -```js -// mirage/factories/subject.js -import { Factory, faker } from 'ember-cli-mirage'; - -export default Factory.extend({ - name: faker.list.cycle('Economics', 'Philosophy', 'English', 'History', 'Mathematics'), - students: faker.list.random(100, 200, 300, 400, 500) -}); -``` - -`cycle` loops through the data in order, while `random` chooses a random element from the list each time an object is created. +You of course can use alternatives to Faker, like [Chance.js](https://chancejs.com/), in a similar way. -View [Faker's docs](https://github.com/marak/Faker.js/) for the full faker API. ## Extending factories diff --git a/tests/dummy/app/pods/docs/getting-started/quickstart/template.md b/tests/dummy/app/pods/docs/getting-started/quickstart/template.md index a08379982..05f095daa 100644 --- a/tests/dummy/app/pods/docs/getting-started/quickstart/template.md +++ b/tests/dummy/app/pods/docs/getting-started/quickstart/template.md @@ -79,11 +79,11 @@ Let's create a factory for our author with $ ember g mirage-factory author ``` -Mirage also includes the Faker.js library. Let's use this in the Factory and add some properties to it: +We can then define some properties on our Factory. They can be simple types like Booleans, Strings or Numbers, or functions that return dynamic data: ```js // mirage/factories/author.js -import { Factory, faker } from 'ember-cli-mirage'; +import { Factory } from 'ember-cli-mirage'; export default Factory.extend({ @@ -93,10 +93,8 @@ export default Factory.extend({ age: 28, - admin: false, - - avatar() { - return faker.internet.avatar(); + admin() { + return Math.random() > 0.5; } }); @@ -108,14 +106,12 @@ This factory creates objects like [{ name: 'Person 1', age: 28, - admin: false, - avatar: 'https://s3.amazonaws.com/uifaces/faces/twitter/bergmartin/128.jpg' + admin: false }, { name: 'Person 2', age: 28, - admin: false, - avatar: 'https://s3.amazonaws.com/uifaces/faces/twitter/nemanjaivanovic/128.jpg' + admin: true }] ``` diff --git a/tests/dummy/app/pods/docs/getting-started/upgrading/template.md b/tests/dummy/app/pods/docs/getting-started/upgrading/template.md index 60179ed2b..10f19890d 100644 --- a/tests/dummy/app/pods/docs/getting-started/upgrading/template.md +++ b/tests/dummy/app/pods/docs/getting-started/upgrading/template.md @@ -5,21 +5,102 @@ To install a new version of Mirage, run ```sh -npm install ember-cli-mirage@X.X.X --save-dev +yarn install -D ember-cli-mirage@X.X.X ember g ember-cli-mirage ``` The `ember g ember-cli-mirage` command ensures all of Mirage's Bower dependencies are added to your project. It runs during `ember install`, and it's always a good idea to run it when upgrading. -Use `ember-cli-mirage@beta` to get the latest beta. ## Changelog -You can view Mirage's full Changelog here: +You can view all of Mirage's release notes on [our Releases page](https://github.com/samselikoff/ember-cli-mirage/releases). -[https://github.com/samselikoff/ember-cli-mirage/blob/master/CHANGELOG.md](https://github.com/samselikoff/ember-cli-mirage/blob/master/CHANGELOG.md) +## 0.4.x → 1.0 Upgrade guide -## 0.3.x > 0.4 Upgrade guide +A few breaking changes were made in the 1.0 release. + +**Faker.js** + +When Mirage was first released, including npm libraries into Ember CLI apps was difficult. You needed to generate a vendor shim and call `app.import` in order to use the library in your application code. + +Because of all this ceremony, it was common for addons to do that work for you, and bundle related packages. This is exactly what Mirage did for [Faker.js](https://github.com/Marak/faker.js), a useful library to have alongside your Mirage factory definitions. + +There's a few problems with this, most notably that users _had_ to use the version of Faker that was bundled with Mirage. It was frustrating not being able to take advantage of new Faker features until Mirage upgraded its bundled version. + +Now, thanks to [Ember Auto Import](https://github.com/ef4/ember-auto-import), this is no longer the case. Using dependencies directly from npm is painless – just `yarn/npm install` them and `import` them directly from your ES6 classes. Thanks to Auto Import, all that ceremony is taken care of for you. + +This also means that users can easily manage their project's version of Faker (and other similar dependencies) independently of the version of Mirage they're using. + +For this reason, in 1.0 we are no longer bundling Faker.js with Mirage. This is a breaking change. + +Here are the steps you'll need to take to fix this: + +1. Install Ember Auto Import (if it's not already installed) + + ```sh + ember install ember-auto-import + ``` + +2. Install Faker.js directly from npm: + + ```sh + yarn add -D faker + + # or npm install --save-dev faker + ``` + +3. Change all imports of `faker` from the `ember-cli-packge` to import directly from `faker`: + + ```diff + - import { Factory, faker } from 'ember-cli-mirage'; + + import { Factory } from 'ember-cli-mirage'; + + import faker from 'faker'; + ``` + +[There is a codemod](https://github.com/caseywatts/ember-cli-mirage-faker-codemod) that will do this for you, thanks to the gracious work of [Casey Watts](https://github.com/caseywatts). + +Additionally, when I originally bundled Faker, I monkey-patched it with some methods that I thought would be "useful" additions. I thought this was a good idea at the time... it wasn't. 🙈 + +You can look at [the module from v0.4.15](https://github.com/samselikoff/ember-cli-mirage/blob/v0.4.15/addon/faker.js) to see that we added the `faker.list.random`, `faker.list.cycle` and `faker.random.number.range` methods, so if you use these methods too, you'll need to refactor them. + +Fortunately, two of them have been added to recent versions of Faker, and one can be replaced with some simple JS: + +For `faker.list.random`, use `faker.random.arrayElement`: + +```diff + countries() { +- return faker.list.random([ 'United States of America', 'Canada', 'Mexico' ]); ++ return faker.random.arrayElement([ 'United States of America', 'Canada', 'Mexico' ]); + } +``` + +For `faker.list.cycle`, use the remainder (modulo) operator: + +```diff + countries(i) { +- return faker.list.cycle([ 'United States of America', 'Canada', 'Mexico' ]); + ++ let countries = [ 'United States of America', 'Canada', 'Mexico' ]; ++ ++ return countries[i % countries.length]; + } +``` + +For `faker.random.number.range`, use `faker.random.number` with min and max options: + +```diff + age() { +- return faker.random.number.range(18, 65); ++ return faker.random.number({ min: 18, max: 65 }); + } +``` + +After that, you should be on your own with respect to Faker! Thanks to Auto Import, you can change versions, or even try out other libraries like [Chance.js](https://chancejs.com/), and rest easy knowing Mirage is a big slimmer and one less thing is beyond your control. + + + +## 0.3.x → 0.4 Upgrade guide There is one primary change in 0.4 that could break your 0.3 app. @@ -90,7 +171,7 @@ export default JSONAPISerializer.extend({ If you do this, I would recommend looking closely at how your real server behaves when serializing resources' relationships and whether it uses resource `links` or resource linkage `data`, and to update your Mirage code accordingly to give you the most faithful representation of your server. -## 0.2.x > 0.3 Upgrade guide +## 0.2.x → 0.3 Upgrade guide The main change from 0.2.x to 0.3.x is that relationships are now one-way. This better matches the semantics of both Ember Data and common HTTP transfer protocols like JSON:API. @@ -144,7 +225,7 @@ Conceptually this change should be straightforward, as its making existing impli For more information on the motivation behind change, please read the [0-3 beta series release blog post](http://www.ember-cli-mirage.com/blog/2017/01/09/0-3-0-beta-series/). -## 0.1.x > 0.2 Upgrade guide +## 0.1.x → 0.2 Upgrade guide If you're upgrading your Mirage server from v0.1.x to v0.2.x, here's what you need to know: @@ -272,4 +353,4 @@ If you're upgrading your Mirage server from v0.1.x to v0.2.x, here's what you ne --- -You can always view the [full changelog](https://github.com/samselikoff/ember-cli-mirage/blob/master/CHANGELOG.md) to see everything that's changed. If you think this guide missed a critical part of the upgrade path, please [open an issue](https://github.com/samselikoff/ember-cli-mirage/issues/new) or [help improve it](https://github.com/samselikoff/ember-cli-mirage/edit/gh-pages/docs/v0.3.x/upgrading.md)! +You can always view the [full changelog](https://github.com/samselikoff/ember-cli-mirage/blob/master/CHANGELOG.md) to see everything that's changed. If you think this guide missed a critical part of the upgrade path, please [open an issue](https://github.com/samselikoff/ember-cli-mirage/issues/new)! diff --git a/tests/dummy/app/pods/docs/writing-your-server/seeding-your-database/template.md b/tests/dummy/app/pods/docs/writing-your-server/seeding-your-database/template.md index 23da0062a..db5211136 100644 --- a/tests/dummy/app/pods/docs/writing-your-server/seeding-your-database/template.md +++ b/tests/dummy/app/pods/docs/writing-your-server/seeding-your-database/template.md @@ -45,26 +45,25 @@ Each time this factory is used to create an object, it will have an autogenerate and so on. - - -Mirage also includes the Faker.js library, which pairs nicely with your factories to make your data more realistic: +Mirage also pairs great with the Faker.js library, which makes it easy to create more realistic looking data: ```js // mirage/factories/author.js -import { Factory, faker } from 'ember-cli-mirage'; +import { Factory } from 'ember-cli-mirage'; +import faker from 'faker'; export default Factory.extend({ firstName() { return faker.name.firstName(); }, + lastName() { return faker.name.lastName(); }, + age() { // list method added by Mirage - return faker.list.random(18, 20, 28, 32, 45, 60)(); + return faker.random.number({ min: 18, max: 65 }); }, }); ``` diff --git a/tests/integration/index-named-imports-test.js b/tests/integration/index-named-imports-test.js index d95c8291e..d02bfff37 100644 --- a/tests/integration/index-named-imports-test.js +++ b/tests/integration/index-named-imports-test.js @@ -2,7 +2,6 @@ import { test } from 'qunit'; import { Factory, Response, - faker, Model, Serializer, ActiveModelSerializer, @@ -20,10 +19,6 @@ test('Response is present in named exports from ember-cli-mirage', function(asse assert.ok(Response); }); -test('faker is present in named exports from ember-cli-mirage', function(assert) { - assert.ok(faker); -}); - test('Model is present in named exports from ember-cli-mirage', function(assert) { assert.ok(Model); }); diff --git a/tests/performance/faker-factory-test.js b/tests/performance/faker-factory-test.js deleted file mode 100644 index b2df725da..000000000 --- a/tests/performance/faker-factory-test.js +++ /dev/null @@ -1,38 +0,0 @@ -import { module } from 'qunit'; -import { Model, Factory, faker } from 'ember-cli-mirage'; -import Server from 'ember-cli-mirage/server'; -import { perfTest } from './utils'; - -module('Performance | Factory | Faker', { - beforeEach() { - this.Car = Model.extend(); - this.CarFactory = Factory.extend({ - make: faker.commerce.product, - model: () => `${faker.list.random('a', 'b', 'c', 'x')}${faker.random.number({ min: 1, max: 15 }) * 100}`, - year: () => faker.random.number({ min: 1980, max: 2017 }) - }); - - this.server = new Server({ - environment: 'test', - models: { - car: this.Car - }, - factories: { - car: this.CarFactory - } - }); - this.server.timing = 0; - this.server.logging = false; - }, - afterEach() { - this.server.shutdown(); - } -}); - -const carMaker = (count) => { - server.createList('car', count); -}; - -perfTest(50, 'models', carMaker); -perfTest(500, 'models', carMaker); -perfTest(5000, 'models', carMaker); diff --git a/tests/unit/faker-test.js b/tests/unit/faker-test.js deleted file mode 100644 index 39fea2728..000000000 --- a/tests/unit/faker-test.js +++ /dev/null @@ -1,34 +0,0 @@ -import faker from 'ember-cli-mirage/faker'; - -import {module, test} from 'qunit'; - -module('Unit | Faker', function() { - test('#cycle - returns a function', function(assert) { - let callback = faker.list.cycle('first', 'second'); - assert.ok(typeof callback === 'function', 'result is a function'); - }); - - test('#cycle - cycles the passed data', function(assert) { - let callback = faker.list.cycle('first', 'second', 'third'); - - assert.equal(callback(0), 'first', 'return the first result for sequence 0'); - assert.equal(callback(1), 'second', 'return the first result for sequence 1'); - assert.equal(callback(2), 'third', 'return the first result for sequence 2'); - assert.equal(callback(3), 'first', 'return the first result for sequence 3'); - }); - - test('#random - returns random element from a list', function(assert) { - let callback = faker.list.random('first', 'second', 'third'); - - assert.notEqual(['first', 'second', 'third'].indexOf(callback()), -1, 'returns random value'); - }); - - test('#range - creates a random number in a range', function(assert) { - let min = 0; - let max = 10; - - let callback = faker.random.number.range(min, max); - assert.equal(callback() >= min, true, 'result is higher or equal than low value'); - assert.equal(callback() <= max, true, 'result is lower or equal than high value'); - }); -}); diff --git a/yarn.lock b/yarn.lock index f90884c1b..65cacc7d0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6934,10 +6934,10 @@ fake-xml-http-request@^2.0.0: resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-2.0.0.tgz#41a92f0ca539477700cb1dafd2df251d55dac8ff" integrity sha512-UjNnynb6eLAB0lyh2PlTEkjRJORnNsVF1hbzU+PQv89/cyBV9GDRCy7JAcLQgeCLYT+3kaumWWZKEJvbaK74eQ== -faker@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/faker/-/faker-3.1.0.tgz#0f908faf4e6ec02524e54a57e432c5c013e08c9f" - integrity sha1-D5CPr05uwCUk5UpX5DLFwBPgjJ8= +faker@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/faker/-/faker-4.1.0.tgz#1e45bbbecc6774b3c195fad2835109c6d748cc3f" + integrity sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8= fast-deep-equal@^1.0.0: version "1.0.0" From 18dbf1ab0f10cc49b396b8345aed23f5da58f271 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 21 Feb 2019 23:23:23 +0000 Subject: [PATCH 327/879] build(deps-dev): bump ember-ajax from 3.1.3 to 4.0.2 Bumps [ember-ajax](https://github.com/ember-cli/ember-ajax) from 3.1.3 to 4.0.2. - [Release notes](https://github.com/ember-cli/ember-ajax/releases) - [Changelog](https://github.com/ember-cli/ember-ajax/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-ajax/compare/v3.1.3...v4.0.2) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 288 ++++++--------------------------------------------- 2 files changed, 30 insertions(+), 260 deletions(-) diff --git a/package.json b/package.json index f1bf8770a..3ecc42f40 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "broccoli-asset-rev": "^2.7.0", "broccoli-test-helper": "^1.3.0", "chai": "^4.1.0", - "ember-ajax": "^3.1.0", + "ember-ajax": "^4.0.2", "ember-cli": "~3.4.4", "ember-cli-addon-docs": "^0.6.4", "ember-cli-addon-docs-esdoc": "^0.2.1", diff --git a/yarn.lock b/yarn.lock index 65cacc7d0..c024a606b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1176,13 +1176,6 @@ ajv@^6.1.0, ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -amd-name-resolver@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-0.0.7.tgz#814301adfe8a2f109f6e84d5e935196efb669615" - integrity sha1-gUMBrf6KLxCfboTV6TUZbvtmlhU= - dependencies: - ensure-posix-path "^1.0.1" - amd-name-resolver@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.2.0.tgz#fc41b3848824b557313897d71f8d5a0184fbe679" @@ -1569,10 +1562,10 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.14.0, babel-core@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" - integrity sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g= +babel-core@^6.24.1, babel-core@^6.26.3: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== dependencies: babel-code-frame "^6.26.0" babel-generator "^6.26.0" @@ -1584,20 +1577,20 @@ babel-core@^6.14.0, babel-core@^6.26.0: babel-traverse "^6.26.0" babel-types "^6.26.0" babylon "^6.18.0" - convert-source-map "^1.5.0" - debug "^2.6.8" + convert-source-map "^1.5.1" + debug "^2.6.9" json5 "^0.5.1" lodash "^4.17.4" minimatch "^3.0.4" path-is-absolute "^1.0.1" - private "^0.1.7" + private "^0.1.8" slash "^1.0.0" - source-map "^0.5.6" + source-map "^0.5.7" -babel-core@^6.24.1, babel-core@^6.26.3: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== +babel-core@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" + integrity sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g= dependencies: babel-code-frame "^6.26.0" babel-generator "^6.26.0" @@ -1609,15 +1602,15 @@ babel-core@^6.24.1, babel-core@^6.26.3: babel-traverse "^6.26.0" babel-types "^6.26.0" babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" + convert-source-map "^1.5.0" + debug "^2.6.8" json5 "^0.5.1" lodash "^4.17.4" minimatch "^3.0.4" path-is-absolute "^1.0.1" - private "^0.1.8" + private "^0.1.7" slash "^1.0.0" - source-map "^0.5.7" + source-map "^0.5.6" babel-eslint@^8.2.6: version "8.2.6" @@ -1786,7 +1779,7 @@ babel-plugin-check-es2015-constants@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-debug-macros@^0.1.10, babel-plugin-debug-macros@^0.1.11: +babel-plugin-debug-macros@^0.1.10: version "0.1.11" resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.1.11.tgz#6c562bf561fccd406ce14ab04f42c218cf956605" integrity sha512-hZw5qNNGAR02Y+yBUrtsnJHh8OXavkayPRqKGAXnIm4t5rWVpj3ArwsC7TWdpZsBguQvHAeyTxZ7s23yY60HHg== @@ -1807,27 +1800,6 @@ babel-plugin-debug-macros@^0.2.0-beta.6: dependencies: semver "^5.3.0" -babel-plugin-ember-modules-api-polyfill@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.3.0.tgz#0c01f359658cfb9c797f705af6b09f6220205ae0" - integrity sha512-cv5ZimF5X52uW7Ul83UUxtsFZE6rZYkMv6qWnAeiDLT1/KtpVrTkJpwzDlvJ/FhKJZ43ih4GbFbhuhBKKT7vIw== - dependencies: - ember-rfc176-data "^0.3.0" - -babel-plugin-ember-modules-api-polyfill@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.3.2.tgz#56ea34bea963498d070a2b7dc2ce18a92c434093" - integrity sha512-mi9gaYasj2Bd6FYD1XCvuU1RL3n4DPn+VdOORyC2nqrvK50cLHkPaq/NdsqfxtZ0WNCIigrwnTHXU3XZI80tPg== - dependencies: - ember-rfc176-data "^0.3.0" - -babel-plugin-ember-modules-api-polyfill@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.5.0.tgz#860aab9fecbf38c10d1fe0779c6979a854fff154" - integrity sha512-o1rOgWFHR0IRBjC9Dvqc2V4MKE2UvdMv/fD/c5GUMAkS6DlTjQV54iMH9sdQ3TGfXPukPKBIOpoSoH/hdfGiMg== - dependencies: - ember-rfc176-data "^0.3.5" - babel-plugin-ember-modules-api-polyfill@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.6.0.tgz#9524a65ef0c31ee82536a19c243fbaec1b977cbb" @@ -2122,7 +2094,7 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-polyfill@^6.16.0, babel-polyfill@^6.26.0: +babel-polyfill@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= @@ -2131,42 +2103,6 @@ babel-polyfill@^6.16.0, babel-polyfill@^6.26.0: core-js "^2.5.0" regenerator-runtime "^0.10.5" -babel-preset-env@^1.5.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" - integrity sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA== - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^2.1.2" - invariant "^2.2.2" - semver "^5.3.0" - babel-preset-env@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" @@ -2577,23 +2513,7 @@ broccoli-autoprefixer@^5.0.0: broccoli-persistent-filter "^1.1.6" postcss "^6.0.1" -broccoli-babel-transpiler@^6.1.2: - version "6.1.4" - resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.1.4.tgz#8be8074c42abf2e17ff79b2d2a21df5c51143c82" - integrity sha512-h63g7iOBWdxj0GuZw8kNsyaD1T9weKsY3I+gp3rOefozbHwUesJ43vzLy0jj3t/rbiP2czcJAlyHS48EcRil8Q== - dependencies: - babel-core "^6.14.0" - broccoli-funnel "^1.0.0" - broccoli-merge-trees "^1.0.0" - broccoli-persistent-filter "^1.4.0" - clone "^2.0.0" - hash-for-dep "^1.0.2" - heimdalljs-logger "^0.1.7" - json-stable-stringify "^1.0.0" - rsvp "^3.5.0" - workerpool "^2.3.0" - -broccoli-babel-transpiler@^6.4.5, broccoli-babel-transpiler@^6.5.0: +broccoli-babel-transpiler@^6.5.0: version "6.5.0" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.5.0.tgz#aa501a227b298a99742fdd0309b1eaad7124bba0" integrity sha512-c5OLGY40Sdmv6rP230Jt8yoK49BHfOw1LXiDMu9EC9k2U6sqlpNRK78SzvByQ8IzKtBYUfeWCxeZHcvW+gH7VQ== @@ -2609,22 +2529,6 @@ broccoli-babel-transpiler@^6.4.5, broccoli-babel-transpiler@^6.5.0: rsvp "^4.8.2" workerpool "^2.3.0" -broccoli-babel-transpiler@^7.1.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.1.1.tgz#4202cd0653845083ee744fb4eaa4a2b50292f03f" - integrity sha512-iZE6yxDcEe4XSMEyqyyS+wtkNAsPUGJNleJoVu26Vt2Al8/GqRI5+wc7qquPb71I1W7AtqbkaqsgDFDqBoIYKw== - dependencies: - "@babel/core" "^7.0.0" - broccoli-funnel "^2.0.1" - broccoli-merge-trees "^3.0.0" - broccoli-persistent-filter "^1.4.3" - clone "^2.1.2" - hash-for-dep "^1.2.3" - heimdalljs-logger "^0.1.9" - json-stable-stringify "^1.0.1" - rsvp "^4.8.3" - workerpool "^2.3.1" - broccoli-babel-transpiler@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.1.2.tgz#fb5d6f8b9a805627ac3f2914ac9d86e82ca2413b" @@ -2751,7 +2655,7 @@ broccoli-config-replace@^1.1.2: debug "^2.2.0" fs-extra "^0.24.0" -broccoli-debug@^0.6.1, broccoli-debug@^0.6.2, broccoli-debug@^0.6.4: +broccoli-debug@^0.6.1, broccoli-debug@^0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.4.tgz#986eb3d2005e00e3bb91f9d0a10ab137210cd150" integrity sha512-CixMUndBqTljCc26i6ubhBrGbAWXpWBsGJFce6ZOr76Tul2Ev1xxM0tmf7OjSzdYhkr5BrPd/CNbR9VMPi+NBg== @@ -2997,7 +2901,7 @@ broccoli-persistent-filter@^1.0.3: symlink-or-copy "^1.0.1" walk-sync "^0.3.1" -broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.2.0, broccoli-persistent-filter@^1.4.0, broccoli-persistent-filter@^1.4.3: +broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.2.0, broccoli-persistent-filter@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.3.tgz#3511bc52fc53740cda51621f58a28152d9911bc1" integrity sha512-JwNLDvvXJlhUmr+CHcbVhCyp33NbCIAITjQZmJY9e8QzANXh3jpFWlhSFvkWghwKA8rTAKcXkW12agtiZjxr4g== @@ -3369,7 +3273,7 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^2.1.2, browserslist@^2.11.3: +browserslist@^2.11.3: version "2.11.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" integrity sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA== @@ -4900,10 +4804,10 @@ elliptic@^6.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" -ember-ajax@^3.1.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-3.1.3.tgz#f51b8e3e36765575a2698c8660e377d4d6371642" - integrity sha512-C+BmWxXECGWuv7T17OHSQySpVuoCalmxI/NLUr+3eSlBeCD0xwI3mRRL1CbmAWXdyNwzK3je+lFCSuMaJu2miA== +ember-ajax@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-4.0.2.tgz#ce86d52c24289657e0a230140b06a52fe453d655" + integrity sha512-YeeeAQizQc5ioCeraxFo30y3W6mmUxmndF0ShI/Wvwfe8IhVw40jL42itaUHbo2CxKsNRZzQ8x3re65dGM0CrA== dependencies: ember-cli-babel "^6.16.0" najax "^1.0.3" @@ -5055,26 +4959,7 @@ ember-cli-autoprefixer@^0.8.1: broccoli-autoprefixer "^5.0.0" lodash "^4.0.0" -ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2: - version "6.11.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.11.0.tgz#79cb184bac3c05bfe181ddc306bac100ab1f9493" - integrity sha512-lHQyl30lbAsMmMq2it1GO85HKrqr2gMpK5CFxmOgTJ3moBqOGMKsdV3Z0qXWpgh8Asy7pB9AACMShdgfQvSGPg== - dependencies: - amd-name-resolver "0.0.7" - babel-plugin-debug-macros "^0.1.11" - babel-plugin-ember-modules-api-polyfill "^2.3.0" - babel-plugin-transform-es2015-modules-amd "^6.24.0" - babel-polyfill "^6.16.0" - babel-preset-env "^1.5.1" - broccoli-babel-transpiler "^6.1.2" - broccoli-debug "^0.6.2" - broccoli-funnel "^1.0.0" - broccoli-source "^1.1.0" - clone "^2.0.0" - ember-cli-version-checker "^2.1.0" - semver "^5.4.1" - -ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.12.0: +ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.7.2, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2: version "6.18.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz#3f6435fd275172edeff2b634ee7b29ce74318957" integrity sha512-7ceC8joNYxY2wES16iIBlbPSxwKDBhYwC8drU3ZEvuPDMwVv1KzxCNu1fvxyFEBWhwaRNTUxSCsEVoTd9nosGA== @@ -5093,108 +4978,7 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.12.0: ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^6.16.0: - version "6.17.2" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.17.2.tgz#f0d53d2fb95e70c15d8db84760d045f88f458f69" - integrity sha512-9KcCvF1PcelEFTSiJ/Ld20tfuW9acMkwHC/xINLsmwqJVDbm3oEqWtiFDZ5ebaC278O5I0GqNJWJLYNoWMNZ8g== - dependencies: - amd-name-resolver "1.2.0" - babel-plugin-debug-macros "^0.2.0-beta.6" - babel-plugin-ember-modules-api-polyfill "^2.5.0" - babel-plugin-transform-es2015-modules-amd "^6.24.0" - babel-polyfill "^6.26.0" - babel-preset-env "^1.7.0" - broccoli-babel-transpiler "^6.5.0" - broccoli-debug "^0.6.4" - broccoli-funnel "^2.0.0" - broccoli-source "^1.1.0" - clone "^2.0.0" - ember-cli-version-checker "^2.1.2" - semver "^5.5.0" - -ember-cli-babel@^6.6.0: - version "6.17.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.17.0.tgz#1f3e8ed9f4e2338caef6bc2c3d08d3c9928d0ddd" - integrity sha512-esI5tQ9lxCiYmZdRY1oB6KFvRxFAZQQEnFOUVYzeGJRaZOz/LIGR69jh9y4Rm0Ejm10OxoL8Js8vCnN5tMnUug== - dependencies: - amd-name-resolver "1.2.0" - babel-plugin-debug-macros "^0.2.0-beta.6" - babel-plugin-ember-modules-api-polyfill "^2.3.2" - babel-plugin-transform-es2015-modules-amd "^6.24.0" - babel-polyfill "^6.26.0" - babel-preset-env "^1.7.0" - broccoli-babel-transpiler "^6.5.0" - broccoli-debug "^0.6.4" - broccoli-funnel "^2.0.0" - broccoli-source "^1.1.0" - clone "^2.0.0" - ember-cli-version-checker "^2.1.2" - semver "^5.5.0" - -ember-cli-babel@^6.7.2: - version "6.16.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.16.0.tgz#623b4a2764ece72b65f1572fc8aeb5714a450228" - integrity sha512-rzWkVdKVk2KSbQ81TxmLli+LWdBEqF+FHE83rUQXVOV4FguJDtP1w2AW08f8QjuztbnQ5+VUGCb7H0dL8UwOVw== - dependencies: - amd-name-resolver "1.2.0" - babel-plugin-debug-macros "^0.2.0-beta.6" - babel-plugin-ember-modules-api-polyfill "^2.3.2" - babel-plugin-transform-es2015-modules-amd "^6.24.0" - babel-polyfill "^6.26.0" - babel-preset-env "^1.7.0" - broccoli-babel-transpiler "^6.4.5" - broccoli-debug "^0.6.4" - broccoli-funnel "^2.0.0" - broccoli-source "^1.1.0" - clone "^2.0.0" - ember-cli-version-checker "^2.1.2" - semver "^5.5.0" - -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.4: - version "7.2.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.2.0.tgz#5c5bd877fb73f6fb198c878d3127ba9e18e9b8a0" - integrity sha512-vwx/AgPD7P4ebgTFJMqFovbrSNCA02UMuItlR/Il16njYjgN9ZzjUqgYxaylN7k8RF88wdJq3jrtqyMS/oOq8A== - dependencies: - "@babel/core" "^7.0.0" - "@babel/plugin-transform-modules-amd" "^7.0.0" - "@babel/polyfill" "^7.0.0" - "@babel/preset-env" "^7.0.0" - amd-name-resolver "^1.2.1" - babel-plugin-debug-macros "^0.2.0-beta.6" - babel-plugin-ember-modules-api-polyfill "^2.6.0" - babel-plugin-module-resolver "^3.1.1" - broccoli-babel-transpiler "^7.1.0" - broccoli-debug "^0.6.4" - broccoli-funnel "^2.0.1" - broccoli-source "^1.1.0" - clone "^2.1.2" - ember-cli-version-checker "^2.1.2" - ensure-posix-path "^1.0.2" - semver "^5.5.0" - -ember-cli-babel@^7.1.0: - version "7.1.3" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.1.3.tgz#a2a7374adb525369a3a205cedd54d8e0c3de3309" - integrity sha512-wkftzRiPiLTKAhBKphsJEH8gmJIspq04f03DUvoS2/bqrssF04hhQVRquF4EF0ZiNxKI8f4ka/puVOGeBuRWDg== - dependencies: - "@babel/core" "^7.0.0" - "@babel/plugin-transform-modules-amd" "^7.0.0" - "@babel/polyfill" "^7.0.0" - "@babel/preset-env" "^7.0.0" - amd-name-resolver "1.2.0" - babel-plugin-debug-macros "^0.2.0-beta.6" - babel-plugin-ember-modules-api-polyfill "^2.5.0" - babel-plugin-module-resolver "^3.1.1" - broccoli-babel-transpiler "^7.1.0" - broccoli-debug "^0.6.4" - broccoli-funnel "^2.0.1" - broccoli-source "^1.1.0" - clone "^2.1.2" - ember-cli-version-checker "^2.1.2" - ensure-posix-path "^1.0.2" - semver "^5.5.0" - -ember-cli-babel@^7.1.2: +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.4: version "7.4.2" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.4.2.tgz#9d7daa165b509e41f6dc3bb443ae32072f766aa2" integrity sha512-5PJOkQ3B3Cvef2nQVPuZSPA6ckwiED3qF4cqzu7jcKhZ0Fy2TwPqABVbiPBJ46NujAsMZrjverVRST74Q25GqQ== @@ -6070,11 +5854,6 @@ ember-responsive@^3.0.0-beta.1: dependencies: ember-cli-babel "^6.6.0" -ember-rfc176-data@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.1.tgz#6a5a4b8b82ec3af34f3010965fa96b936ca94519" - integrity sha512-u+W5rUvYO7xyKJjiPuCM7bIAvFyPwPTJ66fOZz1xuCv3AyReI9Oev5oOADOO6YJZk+vEn0xWiZ9N6zSf8WU7Fg== - ember-rfc176-data@^0.3.5, ember-rfc176-data@^0.3.6: version "0.3.6" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.6.tgz#7138db8dfccec39c9a832adfbd4c49d670028907" @@ -10530,16 +10309,7 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -najax@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/najax/-/najax-1.0.3.tgz#11145f4d910446ea661d8ab7fcef53f6ad164ae5" - integrity sha1-ERRfTZEERupmHYq3/O9T9q0WSuU= - dependencies: - jquery-deferred "^0.3.0" - lodash.defaultsdeep "^4.6.0" - qs "^6.2.0" - -najax@^1.0.3: +najax@^1.0.2, najax@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/najax/-/najax-1.0.4.tgz#63fd8dbf15d18f24dc895b3a16fec66c136b8084" integrity sha512-wsSacA+RkgY1wxRxXCT3tdqzmamEv9PLeoV/ub9SlLf2RngbPMSqc3A7H35XJDfURC0twMmZsnPdsYPkuuFSVg== From b4ffe155f00d0e99d05c1f090dfaf827430ca118 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 21 Feb 2019 23:24:25 +0000 Subject: [PATCH 328/879] build(deps-dev): bump eslint-plugin-node from 7.0.1 to 8.0.1 Bumps [eslint-plugin-node](https://github.com/mysticatea/eslint-plugin-node) from 7.0.1 to 8.0.1. - [Release notes](https://github.com/mysticatea/eslint-plugin-node/releases) - [Commits](https://github.com/mysticatea/eslint-plugin-node/compare/v7.0.1...v8.0.1) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 49 ++++++++++++++++--------------------------------- 2 files changed, 17 insertions(+), 34 deletions(-) diff --git a/package.json b/package.json index f1bf8770a..eab791bdd 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "escape-string-regexp": "^1.0.5", "eslint-plugin-ember": "^5.2.0", "eslint-plugin-ember-suave": "^1.0.0", - "eslint-plugin-node": "^7.0.1", + "eslint-plugin-node": "^8.0.1", "faker": "^4.1.0", "fastboot": "^1.2.0", "js-yaml": "^3.12.1", diff --git a/yarn.lock b/yarn.lock index 65cacc7d0..8b3534f0f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6439,14 +6439,14 @@ eslint-plugin-es@^1.3.1: eslint-utils "^1.3.0" regexpp "^2.0.1" -eslint-plugin-node@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz#a6e054e50199b2edd85518b89b4e7b323c9f36db" - integrity sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw== +eslint-plugin-node@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-8.0.1.tgz#55ae3560022863d141fa7a11799532340a685964" + integrity sha512-ZjOjbjEi6jd82rIpFSgagv4CHWzG9xsQAVp1ZPlhRnnYxcTgENUVBvhYmkQ7GvT1QFijUSo69RaiOJKhMu6i8w== dependencies: eslint-plugin-es "^1.3.1" eslint-utils "^1.3.1" - ignore "^4.0.2" + ignore "^5.0.2" minimatch "^3.0.4" resolve "^1.8.1" semver "^5.5.0" @@ -8363,20 +8363,15 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -ignore@^3.3.3: - version "3.3.7" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" - integrity sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA== - -ignore@^3.3.5: +ignore@^3.3.3, ignore@^3.3.5: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== -ignore@^4.0.2: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +ignore@^5.0.2: + version "5.0.5" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.0.5.tgz#c663c548d6ce186fb33616a8ccb5d46e56bdbbf9" + integrity sha512-kOC8IUb8HSDMVcYrDVezCxpJkzSQWTAzf3olpKM6o9rM5zpojx23O0Fl8Wr4+qJ6ZbPEHqf1fdwev/DS7v7pmA== image-size@^0.4.0: version "0.4.0" @@ -12389,27 +12384,20 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.5.0, resolve@^1.1.6, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0: +resolve@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" integrity sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw== dependencies: path-parse "^1.0.5" -resolve@^1.1.3, resolve@^1.3.2, resolve@^1.6.0, resolve@^1.7.1, resolve@^1.8.1: +resolve@^1.1.3, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.7.1, resolve@^1.8.1: version "1.9.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.9.0.tgz#a14c6fdfa8f92a7df1d996cb7105fa744658ea06" integrity sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ== dependencies: path-parse "^1.0.6" -resolve@^1.1.7: - version "1.8.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" - integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== - dependencies: - path-parse "^1.0.5" - responselike@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -12706,21 +12694,16 @@ select@^1.1.2: resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= -"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" - integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== +"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1: + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== semver@^4.3.1: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= -semver@^5.5.1: - version "5.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" - integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== - semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" From 27336f010b74f4385bf59ba7499c0e1100c27563 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 22 Feb 2019 10:26:29 +0000 Subject: [PATCH 329/879] build(deps-dev): bump ember-cli-app-version from 2.1.0 to 3.2.0 Bumps [ember-cli-app-version](https://github.com/embersherpa/ember-cli-app-version) from 2.1.0 to 3.2.0. - [Release notes](https://github.com/embersherpa/ember-cli-app-version/releases) - [Commits](https://github.com/embersherpa/ember-cli-app-version/commits/v3.2.0) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 301 +++++++-------------------------------------------- 2 files changed, 41 insertions(+), 262 deletions(-) diff --git a/package.json b/package.json index f1bf8770a..743fedf9a 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "ember-cli": "~3.4.4", "ember-cli-addon-docs": "^0.6.4", "ember-cli-addon-docs-esdoc": "^0.2.1", - "ember-cli-app-version": "^2.0.0", + "ember-cli-app-version": "^3.2.0", "ember-cli-dependency-checker": "^3.0.0", "ember-cli-deploy": "^1.0.2", "ember-cli-deploy-build": "^1.1.1", diff --git a/yarn.lock b/yarn.lock index 65cacc7d0..6b7fac0d7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1176,13 +1176,6 @@ ajv@^6.1.0, ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -amd-name-resolver@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-0.0.7.tgz#814301adfe8a2f109f6e84d5e935196efb669615" - integrity sha1-gUMBrf6KLxCfboTV6TUZbvtmlhU= - dependencies: - ensure-posix-path "^1.0.1" - amd-name-resolver@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.2.0.tgz#fc41b3848824b557313897d71f8d5a0184fbe679" @@ -1569,10 +1562,10 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.14.0, babel-core@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" - integrity sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g= +babel-core@^6.24.1, babel-core@^6.26.3: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== dependencies: babel-code-frame "^6.26.0" babel-generator "^6.26.0" @@ -1584,20 +1577,20 @@ babel-core@^6.14.0, babel-core@^6.26.0: babel-traverse "^6.26.0" babel-types "^6.26.0" babylon "^6.18.0" - convert-source-map "^1.5.0" - debug "^2.6.8" + convert-source-map "^1.5.1" + debug "^2.6.9" json5 "^0.5.1" lodash "^4.17.4" minimatch "^3.0.4" path-is-absolute "^1.0.1" - private "^0.1.7" + private "^0.1.8" slash "^1.0.0" - source-map "^0.5.6" + source-map "^0.5.7" -babel-core@^6.24.1, babel-core@^6.26.3: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== +babel-core@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" + integrity sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g= dependencies: babel-code-frame "^6.26.0" babel-generator "^6.26.0" @@ -1609,15 +1602,15 @@ babel-core@^6.24.1, babel-core@^6.26.3: babel-traverse "^6.26.0" babel-types "^6.26.0" babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" + convert-source-map "^1.5.0" + debug "^2.6.8" json5 "^0.5.1" lodash "^4.17.4" minimatch "^3.0.4" path-is-absolute "^1.0.1" - private "^0.1.8" + private "^0.1.7" slash "^1.0.0" - source-map "^0.5.7" + source-map "^0.5.6" babel-eslint@^8.2.6: version "8.2.6" @@ -1786,7 +1779,7 @@ babel-plugin-check-es2015-constants@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-debug-macros@^0.1.10, babel-plugin-debug-macros@^0.1.11: +babel-plugin-debug-macros@^0.1.10: version "0.1.11" resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.1.11.tgz#6c562bf561fccd406ce14ab04f42c218cf956605" integrity sha512-hZw5qNNGAR02Y+yBUrtsnJHh8OXavkayPRqKGAXnIm4t5rWVpj3ArwsC7TWdpZsBguQvHAeyTxZ7s23yY60HHg== @@ -1807,27 +1800,6 @@ babel-plugin-debug-macros@^0.2.0-beta.6: dependencies: semver "^5.3.0" -babel-plugin-ember-modules-api-polyfill@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.3.0.tgz#0c01f359658cfb9c797f705af6b09f6220205ae0" - integrity sha512-cv5ZimF5X52uW7Ul83UUxtsFZE6rZYkMv6qWnAeiDLT1/KtpVrTkJpwzDlvJ/FhKJZ43ih4GbFbhuhBKKT7vIw== - dependencies: - ember-rfc176-data "^0.3.0" - -babel-plugin-ember-modules-api-polyfill@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.3.2.tgz#56ea34bea963498d070a2b7dc2ce18a92c434093" - integrity sha512-mi9gaYasj2Bd6FYD1XCvuU1RL3n4DPn+VdOORyC2nqrvK50cLHkPaq/NdsqfxtZ0WNCIigrwnTHXU3XZI80tPg== - dependencies: - ember-rfc176-data "^0.3.0" - -babel-plugin-ember-modules-api-polyfill@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.5.0.tgz#860aab9fecbf38c10d1fe0779c6979a854fff154" - integrity sha512-o1rOgWFHR0IRBjC9Dvqc2V4MKE2UvdMv/fD/c5GUMAkS6DlTjQV54iMH9sdQ3TGfXPukPKBIOpoSoH/hdfGiMg== - dependencies: - ember-rfc176-data "^0.3.5" - babel-plugin-ember-modules-api-polyfill@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.6.0.tgz#9524a65ef0c31ee82536a19c243fbaec1b977cbb" @@ -2122,7 +2094,7 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-polyfill@^6.16.0, babel-polyfill@^6.26.0: +babel-polyfill@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= @@ -2131,42 +2103,6 @@ babel-polyfill@^6.16.0, babel-polyfill@^6.26.0: core-js "^2.5.0" regenerator-runtime "^0.10.5" -babel-preset-env@^1.5.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" - integrity sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA== - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^2.1.2" - invariant "^2.2.2" - semver "^5.3.0" - babel-preset-env@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" @@ -2577,23 +2513,7 @@ broccoli-autoprefixer@^5.0.0: broccoli-persistent-filter "^1.1.6" postcss "^6.0.1" -broccoli-babel-transpiler@^6.1.2: - version "6.1.4" - resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.1.4.tgz#8be8074c42abf2e17ff79b2d2a21df5c51143c82" - integrity sha512-h63g7iOBWdxj0GuZw8kNsyaD1T9weKsY3I+gp3rOefozbHwUesJ43vzLy0jj3t/rbiP2czcJAlyHS48EcRil8Q== - dependencies: - babel-core "^6.14.0" - broccoli-funnel "^1.0.0" - broccoli-merge-trees "^1.0.0" - broccoli-persistent-filter "^1.4.0" - clone "^2.0.0" - hash-for-dep "^1.0.2" - heimdalljs-logger "^0.1.7" - json-stable-stringify "^1.0.0" - rsvp "^3.5.0" - workerpool "^2.3.0" - -broccoli-babel-transpiler@^6.4.5, broccoli-babel-transpiler@^6.5.0: +broccoli-babel-transpiler@^6.5.0: version "6.5.0" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.5.0.tgz#aa501a227b298a99742fdd0309b1eaad7124bba0" integrity sha512-c5OLGY40Sdmv6rP230Jt8yoK49BHfOw1LXiDMu9EC9k2U6sqlpNRK78SzvByQ8IzKtBYUfeWCxeZHcvW+gH7VQ== @@ -2609,22 +2529,6 @@ broccoli-babel-transpiler@^6.4.5, broccoli-babel-transpiler@^6.5.0: rsvp "^4.8.2" workerpool "^2.3.0" -broccoli-babel-transpiler@^7.1.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.1.1.tgz#4202cd0653845083ee744fb4eaa4a2b50292f03f" - integrity sha512-iZE6yxDcEe4XSMEyqyyS+wtkNAsPUGJNleJoVu26Vt2Al8/GqRI5+wc7qquPb71I1W7AtqbkaqsgDFDqBoIYKw== - dependencies: - "@babel/core" "^7.0.0" - broccoli-funnel "^2.0.1" - broccoli-merge-trees "^3.0.0" - broccoli-persistent-filter "^1.4.3" - clone "^2.1.2" - hash-for-dep "^1.2.3" - heimdalljs-logger "^0.1.9" - json-stable-stringify "^1.0.1" - rsvp "^4.8.3" - workerpool "^2.3.1" - broccoli-babel-transpiler@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.1.2.tgz#fb5d6f8b9a805627ac3f2914ac9d86e82ca2413b" @@ -2751,7 +2655,7 @@ broccoli-config-replace@^1.1.2: debug "^2.2.0" fs-extra "^0.24.0" -broccoli-debug@^0.6.1, broccoli-debug@^0.6.2, broccoli-debug@^0.6.4: +broccoli-debug@^0.6.1, broccoli-debug@^0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.4.tgz#986eb3d2005e00e3bb91f9d0a10ab137210cd150" integrity sha512-CixMUndBqTljCc26i6ubhBrGbAWXpWBsGJFce6ZOr76Tul2Ev1xxM0tmf7OjSzdYhkr5BrPd/CNbR9VMPi+NBg== @@ -2997,7 +2901,7 @@ broccoli-persistent-filter@^1.0.3: symlink-or-copy "^1.0.1" walk-sync "^0.3.1" -broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.2.0, broccoli-persistent-filter@^1.4.0, broccoli-persistent-filter@^1.4.3: +broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.2.0, broccoli-persistent-filter@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.3.tgz#3511bc52fc53740cda51621f58a28152d9911bc1" integrity sha512-JwNLDvvXJlhUmr+CHcbVhCyp33NbCIAITjQZmJY9e8QzANXh3jpFWlhSFvkWghwKA8rTAKcXkW12agtiZjxr4g== @@ -3369,7 +3273,7 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^2.1.2, browserslist@^2.11.3: +browserslist@^2.11.3: version "2.11.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" integrity sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA== @@ -5039,13 +4943,13 @@ ember-cli-addon-docs@^0.6.4: walk-sync "^0.3.3" yuidocjs "^0.10.2" -ember-cli-app-version@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ember-cli-app-version/-/ember-cli-app-version-2.1.0.tgz#149101d4fd0d97875e12ec5e61ff105f508e5e2d" - integrity sha1-FJEB1P0Nl4deEuxeYf8QX1COXi0= +ember-cli-app-version@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ember-cli-app-version/-/ember-cli-app-version-3.2.0.tgz#7b9ad0e1b63ae0518648356ee24c703e922bc26e" + integrity sha512-fHWOJElSw8JL03FNCHrT0RdWhGpWEQ4VQ10unEwwhVZ+OANNcOLz8O2dA3D5iuB4bb0fMLwjEwYZGM62+TBs1Q== dependencies: - ember-cli-babel "^6.8.0" - git-repo-version "0.4.1" + ember-cli-babel "^6.12.0" + git-repo-version "^1.0.2" ember-cli-autoprefixer@^0.8.1: version "0.8.1" @@ -5055,26 +4959,7 @@ ember-cli-autoprefixer@^0.8.1: broccoli-autoprefixer "^5.0.0" lodash "^4.0.0" -ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2: - version "6.11.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.11.0.tgz#79cb184bac3c05bfe181ddc306bac100ab1f9493" - integrity sha512-lHQyl30lbAsMmMq2it1GO85HKrqr2gMpK5CFxmOgTJ3moBqOGMKsdV3Z0qXWpgh8Asy7pB9AACMShdgfQvSGPg== - dependencies: - amd-name-resolver "0.0.7" - babel-plugin-debug-macros "^0.1.11" - babel-plugin-ember-modules-api-polyfill "^2.3.0" - babel-plugin-transform-es2015-modules-amd "^6.24.0" - babel-polyfill "^6.16.0" - babel-preset-env "^1.5.1" - broccoli-babel-transpiler "^6.1.2" - broccoli-debug "^0.6.2" - broccoli-funnel "^1.0.0" - broccoli-source "^1.1.0" - clone "^2.0.0" - ember-cli-version-checker "^2.1.0" - semver "^5.4.1" - -ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.12.0: +ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.7.2, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2: version "6.18.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz#3f6435fd275172edeff2b634ee7b29ce74318957" integrity sha512-7ceC8joNYxY2wES16iIBlbPSxwKDBhYwC8drU3ZEvuPDMwVv1KzxCNu1fvxyFEBWhwaRNTUxSCsEVoTd9nosGA== @@ -5093,108 +4978,7 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.12.0: ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^6.16.0: - version "6.17.2" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.17.2.tgz#f0d53d2fb95e70c15d8db84760d045f88f458f69" - integrity sha512-9KcCvF1PcelEFTSiJ/Ld20tfuW9acMkwHC/xINLsmwqJVDbm3oEqWtiFDZ5ebaC278O5I0GqNJWJLYNoWMNZ8g== - dependencies: - amd-name-resolver "1.2.0" - babel-plugin-debug-macros "^0.2.0-beta.6" - babel-plugin-ember-modules-api-polyfill "^2.5.0" - babel-plugin-transform-es2015-modules-amd "^6.24.0" - babel-polyfill "^6.26.0" - babel-preset-env "^1.7.0" - broccoli-babel-transpiler "^6.5.0" - broccoli-debug "^0.6.4" - broccoli-funnel "^2.0.0" - broccoli-source "^1.1.0" - clone "^2.0.0" - ember-cli-version-checker "^2.1.2" - semver "^5.5.0" - -ember-cli-babel@^6.6.0: - version "6.17.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.17.0.tgz#1f3e8ed9f4e2338caef6bc2c3d08d3c9928d0ddd" - integrity sha512-esI5tQ9lxCiYmZdRY1oB6KFvRxFAZQQEnFOUVYzeGJRaZOz/LIGR69jh9y4Rm0Ejm10OxoL8Js8vCnN5tMnUug== - dependencies: - amd-name-resolver "1.2.0" - babel-plugin-debug-macros "^0.2.0-beta.6" - babel-plugin-ember-modules-api-polyfill "^2.3.2" - babel-plugin-transform-es2015-modules-amd "^6.24.0" - babel-polyfill "^6.26.0" - babel-preset-env "^1.7.0" - broccoli-babel-transpiler "^6.5.0" - broccoli-debug "^0.6.4" - broccoli-funnel "^2.0.0" - broccoli-source "^1.1.0" - clone "^2.0.0" - ember-cli-version-checker "^2.1.2" - semver "^5.5.0" - -ember-cli-babel@^6.7.2: - version "6.16.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.16.0.tgz#623b4a2764ece72b65f1572fc8aeb5714a450228" - integrity sha512-rzWkVdKVk2KSbQ81TxmLli+LWdBEqF+FHE83rUQXVOV4FguJDtP1w2AW08f8QjuztbnQ5+VUGCb7H0dL8UwOVw== - dependencies: - amd-name-resolver "1.2.0" - babel-plugin-debug-macros "^0.2.0-beta.6" - babel-plugin-ember-modules-api-polyfill "^2.3.2" - babel-plugin-transform-es2015-modules-amd "^6.24.0" - babel-polyfill "^6.26.0" - babel-preset-env "^1.7.0" - broccoli-babel-transpiler "^6.4.5" - broccoli-debug "^0.6.4" - broccoli-funnel "^2.0.0" - broccoli-source "^1.1.0" - clone "^2.0.0" - ember-cli-version-checker "^2.1.2" - semver "^5.5.0" - -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.4: - version "7.2.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.2.0.tgz#5c5bd877fb73f6fb198c878d3127ba9e18e9b8a0" - integrity sha512-vwx/AgPD7P4ebgTFJMqFovbrSNCA02UMuItlR/Il16njYjgN9ZzjUqgYxaylN7k8RF88wdJq3jrtqyMS/oOq8A== - dependencies: - "@babel/core" "^7.0.0" - "@babel/plugin-transform-modules-amd" "^7.0.0" - "@babel/polyfill" "^7.0.0" - "@babel/preset-env" "^7.0.0" - amd-name-resolver "^1.2.1" - babel-plugin-debug-macros "^0.2.0-beta.6" - babel-plugin-ember-modules-api-polyfill "^2.6.0" - babel-plugin-module-resolver "^3.1.1" - broccoli-babel-transpiler "^7.1.0" - broccoli-debug "^0.6.4" - broccoli-funnel "^2.0.1" - broccoli-source "^1.1.0" - clone "^2.1.2" - ember-cli-version-checker "^2.1.2" - ensure-posix-path "^1.0.2" - semver "^5.5.0" - -ember-cli-babel@^7.1.0: - version "7.1.3" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.1.3.tgz#a2a7374adb525369a3a205cedd54d8e0c3de3309" - integrity sha512-wkftzRiPiLTKAhBKphsJEH8gmJIspq04f03DUvoS2/bqrssF04hhQVRquF4EF0ZiNxKI8f4ka/puVOGeBuRWDg== - dependencies: - "@babel/core" "^7.0.0" - "@babel/plugin-transform-modules-amd" "^7.0.0" - "@babel/polyfill" "^7.0.0" - "@babel/preset-env" "^7.0.0" - amd-name-resolver "1.2.0" - babel-plugin-debug-macros "^0.2.0-beta.6" - babel-plugin-ember-modules-api-polyfill "^2.5.0" - babel-plugin-module-resolver "^3.1.1" - broccoli-babel-transpiler "^7.1.0" - broccoli-debug "^0.6.4" - broccoli-funnel "^2.0.1" - broccoli-source "^1.1.0" - clone "^2.1.2" - ember-cli-version-checker "^2.1.2" - ensure-posix-path "^1.0.2" - semver "^5.5.0" - -ember-cli-babel@^7.1.2: +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.4: version "7.4.2" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.4.2.tgz#9d7daa165b509e41f6dc3bb443ae32072f766aa2" integrity sha512-5PJOkQ3B3Cvef2nQVPuZSPA6ckwiED3qF4cqzu7jcKhZ0Fy2TwPqABVbiPBJ46NujAsMZrjverVRST74Q25GqQ== @@ -6070,11 +5854,6 @@ ember-responsive@^3.0.0-beta.1: dependencies: ember-cli-babel "^6.6.0" -ember-rfc176-data@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.1.tgz#6a5a4b8b82ec3af34f3010965fa96b936ca94519" - integrity sha512-u+W5rUvYO7xyKJjiPuCM7bIAvFyPwPTJ66fOZz1xuCv3AyReI9Oev5oOADOO6YJZk+vEn0xWiZ9N6zSf8WU7Fg== - ember-rfc176-data@^0.3.5, ember-rfc176-data@^0.3.6: version "0.3.6" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.6.tgz#7138db8dfccec39c9a832adfbd4c49d670028907" @@ -7658,22 +7437,22 @@ git-read-pkt-line@0.0.8: bops "0.0.3" through "~2.2.7" +git-repo-info@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-1.4.1.tgz#2a072823254aaf62fcf0766007d7b6651bd41943" + integrity sha1-KgcoIyVKr2L88HZgB9e2ZRvUGUM= + git-repo-info@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-2.1.0.tgz#13d1f753c75bc2994432e65a71e35377ff563813" integrity sha512-+kigfDB7j3W80f74BoOUX+lKOmf4pR3/i2Ww6baKTCPe2hD4FRdjhV3s4P5Dy0Tak1uY1891QhKoYNtnyX2VvA== -git-repo-info@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-1.2.0.tgz#43d8513e04a24dd441330a2f7c6655a709fdbaf2" - integrity sha1-Q9hRPgSiTdRBMwovfGZVpwn9uvI= - -git-repo-version@0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/git-repo-version/-/git-repo-version-0.4.1.tgz#75fab9a0a4ec8470755b0eea7fdaa6f9d41453bf" - integrity sha1-dfq5oKTshHB1Ww7qf9qm+dQUU78= +git-repo-version@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/git-repo-version/-/git-repo-version-1.0.2.tgz#2c8e9bee5d970cafc0dd58480f9dc56d9afe8e4f" + integrity sha512-OPtwtHx9E8/rTMcWT+BU6GNj6Kq/O40bHJZaZAGy+pN2RXGmeKcfr0ix4M+SQuFY8vl5L/wfPSGOAtvUT/e3Qg== dependencies: - git-repo-info "~1.2.0" + git-repo-info "^1.4.1" git-tools@^0.1.4: version "0.1.4" From 71e2ffadb82361dd432ba8fb9621f90dbc6c540f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 22 Feb 2019 13:43:45 +0000 Subject: [PATCH 330/879] build(deps-dev): bump broccoli-test-helper from 1.3.0 to 2.0.0 Bumps [broccoli-test-helper](https://github.com/broccolijs/broccoli-test-helper) from 1.3.0 to 2.0.0. - [Release notes](https://github.com/broccolijs/broccoli-test-helper/releases) - [Commits](https://github.com/broccolijs/broccoli-test-helper/compare/v1.3.0...v2.0.0) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 226 ++++++++++++++++++++++----------------------------- 2 files changed, 96 insertions(+), 132 deletions(-) diff --git a/package.json b/package.json index d819b161d..1933e0326 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "active-model-adapter": "^2.0.3", "babel-eslint": "^8.2.6", "broccoli-asset-rev": "^2.7.0", - "broccoli-test-helper": "^1.3.0", + "broccoli-test-helper": "^2.0.0", "chai": "^4.1.0", "ember-ajax": "^4.0.2", "ember-cli": "~3.4.4", diff --git a/yarn.lock b/yarn.lock index 8ff266912..b97feac0b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -865,6 +865,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.41.tgz#e57c3152eb2e7ec748c733cebd0c095b437c5d37" integrity sha512-sPZWEbFMz6qAy9SLY7jh5cgepmsiwqUUHjvEm8lpU6kug2hmmcyuTnwhoGw/GWpI5Npue4EqvsiQQI0eWjW/ZA== +"@types/tmp@^0.0.33": + version "0.0.33" + resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.0.33.tgz#1073c4bc824754ae3d10cfab88ab0237ba964e4d" + integrity sha1-EHPEvIJHVK49EM+riKsCN7qWTk0= + "@webassemblyjs/ast@1.7.11": version "1.7.11" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" @@ -1255,14 +1260,6 @@ any-promise@^1.1.0: resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== - dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" - anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -2997,11 +2994,6 @@ broccoli-sass-source-maps@^2.1.0: object-assign "^2.0.0" rsvp "^3.0.6" -broccoli-slow-trees@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-2.0.0.tgz#9741afe992787add64aec7f7c8211dfcc058278d" - integrity sha1-l0Gv6ZJ4et1krsf3yCEd/MBYJ40= - broccoli-slow-trees@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-3.0.1.tgz#9bf2a9e2f8eb3ed3a3f2abdde988da437ccdc9b4" @@ -3146,17 +3138,17 @@ broccoli-templater@^2.0.1: rimraf "^2.6.2" walk-sync "^0.3.3" -broccoli-test-helper@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/broccoli-test-helper/-/broccoli-test-helper-1.3.0.tgz#ba673418b3963b2cc466be66092a5928700c827f" - integrity sha512-IhFjcETHOSDAXY8afLLcihdXbAgcQ2b3lp9nZ5saYzoXJvt/1RMUlCm8JxKKPU7aHqpNXMVaj5lm4Is+4xh/qA== +broccoli-test-helper@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/broccoli-test-helper/-/broccoli-test-helper-2.0.0.tgz#1cfbb76f7e856ad8df96d55ee2f5e0dddddf5d4f" + integrity sha512-TKwh8dBT+RcxKEG+vAoaRRhZsCMwZIHPZbCzBNCA0nUi1aoFB/LVosqwMC6H9Ipe06FxY5hpQxDLFbnBMdUPsA== dependencies: - broccoli "^1.1.0" + "@types/tmp" "^0.0.33" + broccoli "^2.0.0" fixturify "^0.3.2" - fs-tree-diff "^0.5.6" - mktemp "^0.4.0" - rimraf "^2.5.4" - walk-sync "^0.3.1" + fs-tree-diff "^0.5.9" + tmp "^0.0.33" + walk-sync "^0.3.3" broccoli-uglify-sourcemap@^2.1.1: version "2.2.0" @@ -3183,26 +3175,29 @@ broccoli-writer@^0.1.1, broccoli-writer@~0.1.1: quick-temp "^0.1.0" rsvp "^3.0.6" -broccoli@^1.1.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/broccoli/-/broccoli-1.1.4.tgz#b023b028b866f447ed14341007961efd03f7251c" - integrity sha1-sCOwKLhm9EftFDQQB5Ye/QP3JRw= +broccoli@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/broccoli/-/broccoli-2.0.1.tgz#3611d643bf4b2666b565dc24cc5307fc80f62bf6" + integrity sha512-ipHuKVjO8jPJE3DKFHLXlj8DcsbGH8OQ1DlHaAWfuQya1qe6lgEi1+kyeKWCccaJlEtEq40EQ50Eiq2M0hxOfQ== dependencies: broccoli-node-info "1.1.0" - broccoli-slow-trees "2.0.0" + broccoli-slow-trees "^3.0.1" broccoli-source "^1.1.0" - commander "^2.5.0" - connect "^3.3.3" - copy-dereference "^1.0.0" - findup-sync "^1.0.0" - handlebars "^4.0.4" - heimdalljs-logger "^0.1.7" - mime "^1.2.11" - rimraf "^2.4.3" - rsvp "^3.5.0" - sane "^1.4.1" - tmp "0.0.31" + commander "^2.15.1" + connect "^3.6.6" + findup-sync "^2.0.0" + handlebars "^4.0.11" + heimdalljs "^0.2.5" + heimdalljs-logger "^0.1.9" + mime-types "^2.1.19" + promise.prototype.finally "^3.1.0" + resolve-path "^1.4.0" + rimraf "^2.6.2" + sane "^4.0.0" + tmp "0.0.33" + tree-sync "^1.2.2" underscore.string "^3.2.2" + watch-detector "^0.1.0" brorand@^1.0.1: version "1.1.0" @@ -3948,10 +3943,10 @@ commander@^2.11.0, commander@~2.17.1: resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== -commander@^2.5.0: - version "2.16.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" - integrity sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew== +commander@^2.15.1: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== commander@^2.6.0: version "2.14.0" @@ -4046,7 +4041,7 @@ configstore@^4.0.0: write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" -connect@^3.3.3: +connect@^3.6.6: version "3.6.6" resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" integrity sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ= @@ -4579,13 +4574,6 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detect-file@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" - integrity sha1-STXe39lIhkjgBrASlWbpOGcR6mM= - dependencies: - fs-exists-sync "^0.1.0" - detect-file@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" @@ -6077,7 +6065,7 @@ error@^7.0.0: string-template "~0.2.1" xtend "~4.0.0" -es-abstract@^1.5.1: +es-abstract@^1.5.1, es-abstract@^1.9.0: version "1.13.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== @@ -6377,6 +6365,11 @@ exec-sh@^0.2.0: dependencies: merge "^1.1.3" +exec-sh@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" + integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg== + execa@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" @@ -6473,13 +6466,6 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" -expand-tilde@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" - integrity sha1-C4HrqJflo9MdHD0QL48BRB5VlEk= - dependencies: - os-homedir "^1.0.1" - expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" @@ -6969,7 +6955,7 @@ find-yarn-workspace-root@^1.1.0: fs-extra "^4.0.3" micromatch "^3.1.4" -findup-sync@2.0.0: +findup-sync@2.0.0, findup-sync@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= @@ -6979,16 +6965,6 @@ findup-sync@2.0.0: micromatch "^3.0.4" resolve-dir "^1.0.1" -findup-sync@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-1.0.0.tgz#6f7e4b57b6ee3a4037b4414eaedea3f58f71e0ec" - integrity sha1-b35LV7buOkA3tEFOrt6j9Y9x4Ow= - dependencies: - detect-file "^0.1.0" - is-glob "^2.0.1" - micromatch "^2.3.7" - resolve-dir "^0.1.0" - fireworm@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/fireworm/-/fireworm-0.7.1.tgz#ccf20f7941f108883fcddb99383dbe6e1861c758" @@ -7508,14 +7484,6 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, gl once "^1.3.0" path-is-absolute "^1.0.0" -global-modules@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" - integrity sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0= - dependencies: - global-prefix "^0.1.4" - is-windows "^0.2.0" - global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -7525,16 +7493,6 @@ global-modules@^1.0.0: is-windows "^1.0.1" resolve-dir "^1.0.0" -global-prefix@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" - integrity sha1-jTvGuNo8qBEqFg2NSW/wRiv+948= - dependencies: - homedir-polyfill "^1.0.0" - ini "^1.3.4" - is-windows "^0.2.0" - which "^1.2.12" - global-prefix@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" @@ -8578,11 +8536,6 @@ is-utf8@^0.2.0: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= -is-windows@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" - integrity sha1-3hqm1j6indJIc3tp8f+LgALSEIw= - is-windows@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.1.tgz#310db70f742d259a16a369202b51af84233310d9" @@ -9957,7 +9910,7 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^2.1.5, micromatch@^2.3.11, micromatch@^2.3.7: +micromatch@^2.3.11: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= @@ -10032,6 +9985,11 @@ mime-db@~1.30.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" integrity sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE= +mime-db@~1.38.0: + version "1.38.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad" + integrity sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg== + mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17: version "2.1.17" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" @@ -10046,6 +10004,13 @@ mime-types@^2.1.18, mime-types@~2.1.18, mime-types@~2.1.19: dependencies: mime-db "~1.37.0" +mime-types@^2.1.19: + version "2.1.22" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.22.tgz#fe6b355a190926ab7698c9a0556a11199b2199bd" + integrity sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog== + dependencies: + mime-db "~1.38.0" + mime-types@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-1.0.2.tgz#995ae1392ab8affcbfcb2641dd054e943c0d5dce" @@ -10056,7 +10021,7 @@ mime@1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== -mime@^1.2.11, mime@^1.3.4: +mime@^1.3.4: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== @@ -10166,7 +10131,7 @@ mkdirp@^0.3.5: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" integrity sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc= -mktemp@^0.4.0, mktemp@~0.4.0: +mktemp@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/mktemp/-/mktemp-0.4.0.tgz#6d0515611c8a8c84e484aa2000129b98e981ff0b" integrity sha1-bQUVYRyKjITkhKogABKbmOmB/ws= @@ -10505,7 +10470,7 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: +normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= @@ -11021,7 +10986,7 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +path-is-absolute@1.0.1, path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= @@ -11417,6 +11382,15 @@ promise-map-series@^0.2.1, promise-map-series@^0.2.3: dependencies: rsvp "^3.0.14" +promise.prototype.finally@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.0.tgz#66f161b1643636e50e7cf201dc1b84a857f3864e" + integrity sha512-7p/K2f6dI+dM8yjRQEGrTQs5hTQixUAdOGpMEA3+pVxpX5oHKRSKAXyLw9Q9HUWDTdwtoo39dSHGQtN90HcEwQ== + dependencies: + define-properties "^1.1.2" + es-abstract "^1.9.0" + function-bind "^1.1.1" + proxy-addr@~2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec" @@ -12077,14 +12051,6 @@ resize-img@^1.1.0: jpeg-js "^0.1.1" parse-png "^1.1.1" -resolve-dir@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" - integrity sha1-shklmlYC+sXFxJatiUpujMQwJh4= - dependencies: - expand-tilde "^1.2.2" - global-modules "^0.2.3" - resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" @@ -12098,6 +12064,14 @@ resolve-from@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= +resolve-path@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7" + integrity sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc= + dependencies: + http-errors "~1.6.2" + path-is-absolute "1.0.1" + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -12308,19 +12282,6 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sane@^1.4.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-1.7.0.tgz#b3579bccb45c94cf20355cc81124990dfd346e30" - integrity sha1-s1ebzLRclM8gNVzIESSZDf00bjA= - dependencies: - anymatch "^1.3.0" - exec-sh "^0.2.0" - fb-watchman "^2.0.0" - minimatch "^3.0.2" - minimist "^1.1.1" - walker "~1.0.5" - watch "~0.10.0" - sane@^2.4.1, sane@^2.5.2: version "2.5.2" resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" @@ -12354,6 +12315,21 @@ sane@^3.0.0: optionalDependencies: fsevents "^1.2.3" +sane@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.0.2.tgz#5bd4a3f1268fd7a921a2dc657047de635c8f8f25" + integrity sha512-/3STCUfNSgMVpoREJc1i6ajKFlYZ5OflzZTOhlqPLa+01Ey+QR9iGZK7K5/qIRsQbEDCvqEJH/PL7yZywmnWsA== + dependencies: + anymatch "^2.0.0" + capture-exit "^1.2.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.18.0" + sass-graph@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" @@ -13389,13 +13365,6 @@ tmp@0.0.28: dependencies: os-tmpdir "~1.0.1" -tmp@0.0.31: - version "0.0.31" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" - integrity sha1-jzirlDjhcxXl29izZX6L+yd65Kc= - dependencies: - os-tmpdir "~1.0.1" - tmp@0.0.33, tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -13997,11 +13966,6 @@ watch-detector@^0.1.0: semver "^5.4.1" silent-error "^1.1.0" -watch@~0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" - integrity sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw= - watch@~0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" @@ -14151,7 +14115,7 @@ which-module@^1.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= -which@1, which@^1.2.10, which@^1.2.12: +which@1, which@^1.2.10: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== From d6ad8ea2d9a6002c5229b94ec5f1c0649ec3892e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 22 Feb 2019 13:57:56 +0000 Subject: [PATCH 331/879] build(deps-dev): bump ember-data from 3.4.4 to 3.7.0 Bumps [ember-data](https://github.com/emberjs/data) from 3.4.4 to 3.7.0. - [Release notes](https://github.com/emberjs/data/releases) - [Changelog](https://github.com/emberjs/data/blob/v3.7.0/CHANGELOG.md) - [Commits](https://github.com/emberjs/data/compare/v3.4.4...v3.7.0) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 103 +++++++++++++++++---------------------------------- 2 files changed, 36 insertions(+), 69 deletions(-) diff --git a/package.json b/package.json index d819b161d..de71bdc33 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "ember-cli-template-lint": "^1.0.0-beta.1", "ember-cli-uglify": "^2.1.0", "ember-composable-helpers": "^2.1.0", - "ember-data": "~3.4.4", + "ember-data": "~3.7.0", "ember-disable-prototype-extensions": "^1.1.3", "ember-export-application-global": "^2.0.0", "ember-load-initializers": "^1.1.0", diff --git a/yarn.lock b/yarn.lock index 8ff266912..56645c520 100644 --- a/yarn.lock +++ b/yarn.lock @@ -693,6 +693,15 @@ lodash "^4.17.10" to-fast-properties "^2.0.0" +"@babel/types@^7.1.5": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.3.tgz#6c44d1cdac2a7625b624216657d5bc6c107ab436" + integrity sha512-2tACZ80Wg09UnPg5uGAOUvvInaqLk3l/IAhQzlxLQOIXacr6bMsra5SH6AWw/hIDRCSbCdHP2KzSOD+cT7TzMQ== + dependencies: + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" + "@babel/types@^7.1.6": version "7.3.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.0.tgz#61dc0b336a93badc02bf5f69c4cd8e1353f2ffc0" @@ -726,7 +735,7 @@ silent-error "^1.1.0" util.promisify "^1.0.0" -"@ember/ordered-set@^2.0.0": +"@ember/ordered-set@^2.0.3": version "2.0.3" resolved "https://registry.yarnpkg.com/@ember/ordered-set/-/ordered-set-2.0.3.tgz#2ac1ca73b3bd116063cae814898832ef434a57f9" integrity sha512-F4yfVk6WMc4AUHxeZsC3CaKyTvO0qSZJy7WWHCFTlVDQw6vubn+FvnGdhzpN1F00EiXMI4Tv1tJdSquHcCnYrA== @@ -1812,10 +1821,13 @@ babel-plugin-feature-flags@^0.3.1: resolved "https://registry.yarnpkg.com/babel-plugin-feature-flags/-/babel-plugin-feature-flags-0.3.1.tgz#9c827cf9a4eb9a19f725ccb239e85cab02036fc1" integrity sha1-nIJ8+aTrmhn3JcyyOehcqwIDb8E= -babel-plugin-filter-imports@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-0.3.1.tgz#e7859b56886b175dd2616425d277b219e209ea8b" - integrity sha1-54WbVohrF13SYWQl0neyGeIJ6os= +babel-plugin-filter-imports@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-2.0.4.tgz#9209b708ed3b228349c4e6f660358bf02685e803" + integrity sha512-Ra4VylqMFsmTJCUeLRJ/OP2ZqO0cCJQK2HKihNTnoKP4f8IhxHKL4EkbmfkwGjXCeDyXd0xQ6UTK8Nd+h9V/SQ== + dependencies: + "@babel/types" "^7.1.5" + lodash "^4.17.11" babel-plugin-htmlbars-inline-precompile@^0.2.3: version "0.2.3" @@ -1886,7 +1898,7 @@ babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-block-scoping@^6.23.0, babel-plugin-transform-es2015-block-scoping@^6.26.0: +babel-plugin-transform-es2015-block-scoping@^6.23.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= @@ -2655,19 +2667,7 @@ broccoli-config-replace@^1.1.2: debug "^2.2.0" fs-extra "^0.24.0" -broccoli-debug@^0.6.1, broccoli-debug@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.4.tgz#986eb3d2005e00e3bb91f9d0a10ab137210cd150" - integrity sha512-CixMUndBqTljCc26i6ubhBrGbAWXpWBsGJFce6ZOr76Tul2Ev1xxM0tmf7OjSzdYhkr5BrPd/CNbR9VMPi+NBg== - dependencies: - broccoli-plugin "^1.2.1" - fs-tree-diff "^0.5.2" - heimdalljs "^0.2.1" - heimdalljs-logger "^0.1.7" - symlink-or-copy "^1.1.8" - tree-sync "^1.2.2" - -broccoli-debug@^0.6.5: +broccoli-debug@^0.6.1, broccoli-debug@^0.6.4, broccoli-debug@^0.6.5: version "0.6.5" resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.5.tgz#164a5cdafd8936e525e702bf8f91f39d758e2e78" integrity sha512-RIVjHvNar9EMCLDW/FggxFRXqpjhncM/3qq87bn/y+/zR9tqEkHvTqbyOc4QnB97NO2m6342w4wGkemkaeOuWg== @@ -5571,57 +5571,24 @@ ember-copy@^1.0.0: dependencies: ember-cli-babel "^6.6.0" -"ember-data@2.x - 3.x": - version "3.4.2" - resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.4.2.tgz#675cc4f1be8df1f5c0bfe4191afa6986377721c0" - integrity sha512-YYvNDNJ0ySiLED7xUxsR3TdRycCKQ7Avy5QIFc7PajDUODppZBqye1XCfJFDSZQ0sjs5w19mKntOVwsVdQGXIw== - dependencies: - "@ember/ordered-set" "^2.0.0" - babel-plugin-feature-flags "^0.3.1" - babel-plugin-filter-imports "^0.3.1" - babel-plugin-transform-es2015-block-scoping "^6.26.0" - babel6-plugin-strip-class-callcheck "^6.0.0" - babel6-plugin-strip-heimdall "^6.0.1" - broccoli-debug "^0.6.4" - broccoli-file-creator "^2.1.1" - broccoli-funnel "^2.0.1" - broccoli-merge-trees "^3.0.0" - broccoli-rollup "^2.1.1" - calculate-cache-key-for-tree "^1.1.0" - chalk "^2.4.1" - ember-cli-babel "^6.16.0" - ember-cli-path-utils "^1.0.0" - ember-cli-string-utils "^1.1.0" - ember-cli-test-info "^1.0.0" - ember-cli-version-checker "^2.1.2" - ember-inflector "^3.0.0" - git-repo-info "^2.0.0" - heimdalljs "^0.3.0" - inflection "^1.12.0" - npm-git-info "^1.0.3" - resolve "^1.8.1" - semver "^5.5.0" - silent-error "^1.1.0" - -ember-data@~3.4.4: - version "3.4.4" - resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.4.4.tgz#a201c2db1d7ca2cbe59a23ddf3cb96281fce216f" - integrity sha512-5DE1CxR1Eobue0y2WCkGSRUaOuE8ebktNElhcyPUcrksbnILxniPsKPVRq15X+5wLjaEb+XiscH68NLBGbjUvQ== +"ember-data@2.x - 3.x", ember-data@~3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.7.0.tgz#87e3a5f3fde994cd7f0b1c6d53f0c8df2f9c3449" + integrity sha512-d3wJIpIclNArapJ5A+gMjNJdDc/8kv5OD3LE5Zad9EJzzZPyaPj51wYsjG7jETJIG+AhBSmAHS5j4GY7/25W0g== dependencies: - "@ember/ordered-set" "^2.0.0" + "@ember/ordered-set" "^2.0.3" babel-plugin-feature-flags "^0.3.1" - babel-plugin-filter-imports "^0.3.1" - babel-plugin-transform-es2015-block-scoping "^6.26.0" + babel-plugin-filter-imports "^2.0.3" babel6-plugin-strip-class-callcheck "^6.0.0" babel6-plugin-strip-heimdall "^6.0.1" - broccoli-debug "^0.6.4" + broccoli-debug "^0.6.5" broccoli-file-creator "^2.1.1" broccoli-funnel "^2.0.1" - broccoli-merge-trees "^3.0.0" + broccoli-merge-trees "^3.0.1" broccoli-rollup "^2.1.1" calculate-cache-key-for-tree "^1.1.0" chalk "^2.4.1" - ember-cli-babel "^6.16.0" + ember-cli-babel "^7.1.2" ember-cli-path-utils "^1.0.0" ember-cli-string-utils "^1.1.0" ember-cli-test-info "^1.0.0" @@ -5632,8 +5599,8 @@ ember-data@~3.4.4: inflection "^1.12.0" npm-git-info "^1.0.3" resolve "^1.8.1" - semver "^5.5.0" - silent-error "^1.1.0" + semver "^5.6.0" + silent-error "^1.1.1" ember-disable-prototype-extensions@^1.1.3: version "1.1.3" @@ -12413,7 +12380,7 @@ select@^1.1.2: resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= -"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1: +"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== @@ -12568,10 +12535,10 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -silent-error@^1.0.0, silent-error@^1.0.1, silent-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/silent-error/-/silent-error-1.1.0.tgz#2209706f1c850a9f1d10d0d840918b46f26e1bc9" - integrity sha1-IglwbxyFCp8dENDYQJGLRvJuG8k= +silent-error@^1.0.0, silent-error@^1.0.1, silent-error@^1.1.0, silent-error@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/silent-error/-/silent-error-1.1.1.tgz#f72af5b0d73682a2ba1778b7e32cd8aa7c2d8662" + integrity sha512-n4iEKyNcg4v6/jpb3c0/iyH2G1nzUNl7Gpqtn/mHIJK9S/q/7MCfoO4rwVOoO59qPFIc0hVHvMbiOJ0NdtxKKw== dependencies: debug "^2.2.0" From 9d4b39245a963ce2622f38f2be080555c51efe1e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 25 Feb 2019 10:25:32 +0000 Subject: [PATCH 332/879] build(deps-dev): bump marked from 0.6.0 to 0.6.1 Bumps [marked](https://github.com/markedjs/marked) from 0.6.0 to 0.6.1. - [Release notes](https://github.com/markedjs/marked/releases) - [Commits](https://github.com/markedjs/marked/compare/v0.6.0...v0.6.1) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 218136e38..73f82d86b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9733,9 +9733,9 @@ marked@^0.5.0: integrity sha512-iUkBZegCZou4AdwbKTwSW/lNDcz5OuRSl3qdcl31Ia0B2QPG0Jn+tKblh/9/eP9/6+4h27vpoh8wel/vQOV0vw== marked@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.6.0.tgz#a18d01cfdcf8d15c3c455b71c8329e5e0f01faa1" - integrity sha512-HduzIW2xApSXKXJSpCipSxKyvMbwRRa/TwMbepmlZziKdH8548WSoDP4SxzulEKjlo8BE39l+2fwJZuRKOln6g== + version "0.6.1" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.6.1.tgz#a63addde477bca9613028de4b2bc3629e53a0562" + integrity sha512-+H0L3ibcWhAZE02SKMqmvYsErLo4EAVJxu5h3bHBBDvvjeWXtl92rGUSBYHL2++5Y+RSNgl8dYOAXcYe7lp1fA== match-media@^0.2.0: version "0.2.0" From 31d4c5c655080f63a8293c10767fa953f5760fcb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 25 Feb 2019 10:26:16 +0000 Subject: [PATCH 333/879] build(deps-dev): bump ember-resolver from 5.0.1 to 5.1.3 Bumps [ember-resolver](https://github.com/ember-cli/ember-resolver) from 5.0.1 to 5.1.3. - [Release notes](https://github.com/ember-cli/ember-resolver/releases) - [Changelog](https://github.com/ember-cli/ember-resolver/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-resolver/compare/v5.0.1...v5.1.3) Signed-off-by: dependabot[bot] --- yarn.lock | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/yarn.lock b/yarn.lock index 218136e38..db772b55a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1792,20 +1792,13 @@ babel-plugin-debug-macros@^0.1.10: dependencies: semver "^5.3.0" -babel-plugin-debug-macros@^0.2.0: +babel-plugin-debug-macros@^0.2.0, babel-plugin-debug-macros@^0.2.0-beta.6: version "0.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.2.0.tgz#0120ac20ce06ccc57bf493b667cf24b85c28da7a" integrity sha512-Wpmw4TbhR3Eq2t3W51eBAQSdKlr+uAyF0GI4GtPfMCD12Y4cIdpKC9l0RjNTH/P9isFypSqqewMPm7//fnZlNA== dependencies: semver "^5.3.0" -babel-plugin-debug-macros@^0.2.0-beta.6: - version "0.2.0-beta.6" - resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.2.0-beta.6.tgz#ecdf6e408d5c863ab21740d7ad7f43f027d2f912" - integrity sha1-7N9uQI1chjqyF0DXrX9D8CfS+RI= - dependencies: - semver "^5.3.0" - babel-plugin-ember-modules-api-polyfill@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.6.0.tgz#9524a65ef0c31ee82536a19c243fbaec1b977cbb" @@ -2769,7 +2762,7 @@ broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.1.0: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1: +broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1, broccoli-funnel@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-2.0.2.tgz#0edf629569bc10bd02cc525f74b9a38e71366a75" integrity sha512-/vDTqtv7ipjEZQOVqO4vGDVAOZyuYzQ/EgGoyewfOgh1M7IQAToBKZI0oAQPgMBeFPPlIbfMuAngk+ohPBuaHQ== @@ -5397,6 +5390,14 @@ ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0, ember-cli-ve resolve "^1.3.3" semver "^5.3.0" +ember-cli-version-checker@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-3.0.1.tgz#2d084d2b261374582c68edb658a7df3a10112749" + integrity sha512-hX2tGrFVt8PyaiWclZr8XFNUPSnA+Ax4bMifDIVVtYY8RQZG8LZf9AGyTj4XImkBBWBtgKyOeQ0ovg3kgos4JA== + dependencies: + resolve "^1.9.0" + semver "^5.6.0" + ember-cli@~3.4.4: version "3.4.4" resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.4.4.tgz#8d25b223b2ef3b863310099192da92ab1feeef6b" @@ -5756,17 +5757,17 @@ ember-qunit@^3.5.0: qunit "~2.6.0" ember-resolver@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-5.0.1.tgz#21740b92e1e4a65f94018de22aa1c73434dc3b2f" - integrity sha512-Svhs/eseIVQ6Yik+4mFpixT639FREZW2UkIYo7197bRuSL63tofKDMfE+gOXUSSudQlQSaFHFeKDr9oD+0C2GQ== + version "5.1.3" + resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-5.1.3.tgz#d2a5a856d53911552c022649cdc7b0408a7908ae" + integrity sha512-ud7Sw8R3hcGnGSvom96p56zdLEqEgVQEAo4HySJjBP0n7JT1lWSvLb7JrJwAZ7d9g1c2tm5ZlxBPUDwQrwMOuQ== dependencies: "@glimmer/resolver" "^0.4.1" babel-plugin-debug-macros "^0.1.10" - broccoli-funnel "^2.0.1" + broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.0" - ember-cli-babel "^6.8.1" - ember-cli-version-checker "^2.0.0" - resolve "^1.3.3" + ember-cli-babel "^6.16.0" + ember-cli-version-checker "^3.0.0" + resolve "^1.10.0" ember-responsive@^3.0.0-beta.1: version "3.0.0-beta.3" @@ -12051,10 +12052,10 @@ resolve@1.5.0: dependencies: path-parse "^1.0.5" -resolve@^1.1.3, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.7.1, resolve@^1.8.1: - version "1.9.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.9.0.tgz#a14c6fdfa8f92a7df1d996cb7105fa744658ea06" - integrity sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ== +resolve@^1.1.3, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.7.1, resolve@^1.8.1, resolve@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" + integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== dependencies: path-parse "^1.0.6" From 5fdfa2b8a50cb4089479ad7f592f847aca96fc5b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 26 Feb 2019 10:31:35 +0000 Subject: [PATCH 334/879] build(deps): bump ember-auto-import from 1.2.19 to 1.2.21 Bumps [ember-auto-import](https://github.com/ef4/ember-auto-import) from 1.2.19 to 1.2.21. - [Release notes](https://github.com/ef4/ember-auto-import/releases) - [Changelog](https://github.com/ef4/ember-auto-import/blob/master/CHANGELOG.md) - [Commits](https://github.com/ef4/ember-auto-import/compare/v1.2.19...v1.2.21) Signed-off-by: dependabot[bot] --- yarn.lock | 112 +++++++++++++++--------------------------------------- 1 file changed, 30 insertions(+), 82 deletions(-) diff --git a/yarn.lock b/yarn.lock index 65f394cb5..4bb4b198d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -684,16 +684,7 @@ lodash "^4.2.0" to-fast-properties "^2.0.0" -"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.2.2.tgz#44e10fc24e33af524488b716cdaee5360ea8ed1e" - integrity sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg== - dependencies: - esutils "^2.0.2" - lodash "^4.17.10" - to-fast-properties "^2.0.0" - -"@babel/types@^7.1.5": +"@babel/types@^7.0.0", "@babel/types@^7.1.5", "@babel/types@^7.1.6", "@babel/types@^7.2.0", "@babel/types@^7.2.2": version "7.3.3" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.3.tgz#6c44d1cdac2a7625b624216657d5bc6c107ab436" integrity sha512-2tACZ80Wg09UnPg5uGAOUvvInaqLk3l/IAhQzlxLQOIXacr6bMsra5SH6AWw/hIDRCSbCdHP2KzSOD+cT7TzMQ== @@ -702,15 +693,6 @@ lodash "^4.17.11" to-fast-properties "^2.0.0" -"@babel/types@^7.1.6": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.0.tgz#61dc0b336a93badc02bf5f69c4cd8e1353f2ffc0" - integrity sha512-QkFPw68QqWU1/RVPyBe8SO7lXbPfjtqAxRYQKpFpaB8yMq7X2qAqfwK5LKoQufEkSmO5NQ70O6Kc3Afk03RwXw== - dependencies: - esutils "^2.0.2" - lodash "^4.17.10" - to-fast-properties "^2.0.0" - "@ember/jquery@^0.5.2": version "0.5.2" resolved "https://registry.yarnpkg.com/@ember/jquery/-/jquery-0.5.2.tgz#fe312c03ada0022fa092d23f7cd7e2eb0374b53a" @@ -1080,11 +1062,6 @@ acorn-dynamic-import@^3.0.0: dependencies: acorn "^5.0.0" -acorn-dynamic-import@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" - integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== - acorn-globals@^1.0.4: version "1.0.9" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-1.0.9.tgz#55bb5e98691507b74579d0513413217c380c54cf" @@ -1122,7 +1099,7 @@ acorn@^3.0.4: resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= -acorn@^5.0.0, acorn@^5.2.1, acorn@^5.5.3: +acorn@^5.0.0, acorn@^5.2.1, acorn@^5.5.3, acorn@^5.6.2: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== @@ -1137,11 +1114,6 @@ acorn@^6.0.1, acorn@^6.0.4: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.5.tgz#81730c0815f3f3b34d8efa95cb7430965f4d887a" integrity sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg== -acorn@^6.0.5: - version "6.0.6" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.6.tgz#cd75181670d5b99bdb1b1c993941d3a239ab1f56" - integrity sha512-5M3G/A4uBSMIlfJ+h9W125vJvPFH/zirISsW5qfxF5YzEvXJCtolLoQvM5yZft0DvMcUrPGKPOlgEu55I6iUtA== - active-model-adapter@^2.0.3: version "2.2.0" resolved "https://registry.yarnpkg.com/active-model-adapter/-/active-model-adapter-2.2.0.tgz#6885d6968574809f17f398c499b688a921c30f91" @@ -1568,7 +1540,7 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.24.1, babel-core@^6.26.3: +babel-core@^6.24.1, babel-core@^6.26.0, babel-core@^6.26.3: version "6.26.3" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== @@ -1593,31 +1565,6 @@ babel-core@^6.24.1, babel-core@^6.26.3: slash "^1.0.0" source-map "^0.5.7" -babel-core@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" - integrity sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g= - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.0" - debug "^2.6.8" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.7" - slash "^1.0.0" - source-map "^0.5.6" - babel-eslint@^8.2.6: version "8.2.6" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.6.tgz#6270d0c73205628067c0f7ae1693a9e797acefd9" @@ -4102,7 +4049,7 @@ convert-source-map@^1.1.0: dependencies: safe-buffer "~5.1.1" -convert-source-map@^1.5.0, convert-source-map@^1.5.1: +convert-source-map@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" integrity sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU= @@ -4799,9 +4746,9 @@ ember-assign-polyfill@~2.4.0: ember-cli-version-checker "^2.0.0" ember-auto-import@^1.2.19: - version "1.2.19" - resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.2.19.tgz#69a2da0d2c16ab88989c51381c415214e85d1af3" - integrity sha512-OT7I3zrIAv/rbbYJFZNqfJi/2HpAscjOWOaBPPUj8VkUnY26HlLO6mSzDIkoUOaTAEWiy2GzjenHGj6b9rivxw== + version "1.2.21" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.2.21.tgz#e02ded183844faba66c3f2af97028ef35175b837" + integrity sha512-coHnqO3mRnlj/JAQSQBEqzX2wL8rH5YrfEJMzk1102X9MdSX1CWeaUYBcyjvI/pG8fHUhv+4VsD6rQuhTUyZUQ== dependencies: "@babel/core" "^7.1.6" "@babel/traverse" "^7.1.6" @@ -4816,8 +4763,8 @@ ember-auto-import@^1.2.19: ember-cli-babel "^6.6.0" enhanced-resolve "^4.0.0" fs-extra "^6.0.1" - fs-tree-diff "^0.5.7" - handlebars "^4.0.11" + fs-tree-diff "^1.0.0" + handlebars "~4.0.13" js-string-escape "^1.0.1" lodash "^4.17.10" mkdirp "^0.5.1" @@ -4826,7 +4773,7 @@ ember-auto-import@^1.2.19: rimraf "^2.6.2" symlink-or-copy "^1.2.0" walk-sync "^0.3.3" - webpack "^4.12.0" + webpack "~4.28" ember-cli-addon-docs-esdoc@^0.2.1: version "0.2.1" @@ -7162,7 +7109,7 @@ fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5 path-posix "^1.0.0" symlink-or-copy "^1.1.8" -fs-tree-diff@^1.0.2: +fs-tree-diff@^1.0.0, fs-tree-diff@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-1.0.2.tgz#0e2931733a85b55feb3472c0b89a20b0c03ac0de" integrity sha512-Zro2ACaPVDgVOx9+s5s5AfPlAD0kMJdbwGvTGF6KC1SjxjiGWxJvV4mUTDkFVSy3OUw2C/f1qpdjF81hGqSBAw== @@ -7618,6 +7565,17 @@ handlebars@^4.0.11, handlebars@^4.0.4, handlebars@^4.0.6: optionalDependencies: uglify-js "^3.1.4" +handlebars@~4.0.13: + version "4.0.13" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.13.tgz#89fc17bf26f46fd7f6f99d341d92efaae64f997d" + integrity sha512-uydY0jy4Z3wy/iGXsi64UtLD4t1fFJe16c/NFxsYE4WdQis8ZCzOXUZaPQNG0e5bgtLQV41QTfqBindhEjnpyQ== + dependencies: + async "^2.5.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -9552,17 +9510,7 @@ lodash@^3.10.0, lodash@^3.2.0: resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= -lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.6.1: - version "4.17.5" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" - integrity sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw== - -lodash@^4.1.0, lodash@^4.10.0, lodash@^4.13.1, lodash@^4.17.5, lodash@~4.17.10: - version "4.17.10" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" - integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== - -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.2.0, lodash@^4.5.1: +lodash@^4.0.0, lodash@^4.1.0, lodash@^4.10.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1, lodash@~4.17.10: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -11296,7 +11244,7 @@ printf@^0.5.1: resolved "https://registry.yarnpkg.com/printf/-/printf-0.5.1.tgz#e0466788260859ed153006dc6867f09ddf240cf3" integrity sha512-UaE/jO0hNsrvPGQEb4LyNzcrJv9Z00tsreBduOSxMtrebvoUhxiEJ4YCHX8YHf6akwfKsC2Gyv5zv47UXhMiLg== -private@^0.1.6, private@^0.1.7, private@^0.1.8, private@~0.1.5: +private@^0.1.6, private@^0.1.8, private@~0.1.5: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== @@ -13976,17 +13924,17 @@ webpack-sources@^1.1.0, webpack-sources@^1.3.0: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@^4.12.0: - version "4.29.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.29.0.tgz#f2cfef83f7ae404ba889ff5d43efd285ca26e750" - integrity sha512-pxdGG0keDBtamE1mNvT5zyBdx+7wkh6mh7uzMOo/uRQ/fhsdj5FXkh/j5mapzs060forql1oXqXN9HJGju+y7w== +webpack@~4.28: + version "4.28.4" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.28.4.tgz#1ddae6c89887d7efb752adf0c3cd32b9b07eacd0" + integrity sha512-NxjD61WsK/a3JIdwWjtIpimmvE6UrRi3yG54/74Hk9rwNj5FPkA4DJCf1z4ByDWLkvZhTZE+P3C/eh6UD5lDcw== dependencies: "@webassemblyjs/ast" "1.7.11" "@webassemblyjs/helper-module-context" "1.7.11" "@webassemblyjs/wasm-edit" "1.7.11" "@webassemblyjs/wasm-parser" "1.7.11" - acorn "^6.0.5" - acorn-dynamic-import "^4.0.0" + acorn "^5.6.2" + acorn-dynamic-import "^3.0.0" ajv "^6.1.0" ajv-keywords "^3.1.0" chrome-trace-event "^1.0.0" From ec4d7b14df7a9db1fd2c576bfe1cfbb348d039b8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Wed, 27 Feb 2019 11:05:30 -0500 Subject: [PATCH 335/879] build(deps-dev): bump ember-cli-htmlbars-inline-precompile (#1531) Bumps [ember-cli-htmlbars-inline-precompile](https://github.com/ember-cli/ember-cli-htmlbars-inline-precompile) from 1.0.5 to 2.1.0. - [Release notes](https://github.com/ember-cli/ember-cli-htmlbars-inline-precompile/releases) - [Changelog](https://github.com/ember-cli/ember-cli-htmlbars-inline-precompile/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-cli-htmlbars-inline-precompile/compare/v1.0.5...v2.1.0) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 34 +++++++++++++++++----------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 769f35a12..87034ade6 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "ember-cli-fastboot": "^1.1.4-beta.1", "ember-cli-favicon": "^1.0.0-beta.4", "ember-cli-htmlbars": "^3.0.0", - "ember-cli-htmlbars-inline-precompile": "^1.0.3", + "ember-cli-htmlbars-inline-precompile": "^2.1.0", "ember-cli-inject-live-reload": "^2.0.1", "ember-cli-moment-shim": "^3.7.1", "ember-cli-qunit": "^4.4.0", diff --git a/yarn.lock b/yarn.lock index 4bb4b198d..d3631b2e4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1766,16 +1766,16 @@ babel-plugin-filter-imports@^2.0.3: "@babel/types" "^7.1.5" lodash "^4.17.11" -babel-plugin-htmlbars-inline-precompile@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.2.3.tgz#cd365e278af409bfa6be7704c4354beee742446b" - integrity sha1-zTZeJ4r0Cb+mvncExDVL7udCRGs= - babel-plugin-htmlbars-inline-precompile@^0.2.5: version "0.2.6" resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.2.6.tgz#c00b8a3f4b32ca04bf0f0d5169fcef3b5a66d69d" integrity sha512-H4H75TKGUFij8ukwEYWEERAgrUf16R8NSK1uDPe3QwxT8mnE1K8+/s6DVjUqbM5Pv6lSIcE4XufXdlSX+DTB6g== +babel-plugin-htmlbars-inline-precompile@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-1.0.0.tgz#a9d2f6eaad8a3f3d361602de593a8cbef8179c22" + integrity sha512-4jvKEHR1bAX03hBDZ94IXsYCj3bwk9vYsn6ux6JZNL2U5pvzCWjqyrGahfsGNrhERyxw8IqcirOi9Q6WCo3dkQ== + babel-plugin-module-resolver@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.1.1.tgz#881cf67e3d4b8400d5eaaefc1be44d2dc1fe404f" @@ -5060,18 +5060,7 @@ ember-cli-get-component-path-option@^1.0.0: resolved "https://registry.yarnpkg.com/ember-cli-get-component-path-option/-/ember-cli-get-component-path-option-1.0.0.tgz#0d7b595559e2f9050abed804f1d8eff1b08bc771" integrity sha1-DXtZVVni+QUKvtgE8djv8bCLx3E= -ember-cli-htmlbars-inline-precompile@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-1.0.2.tgz#5b544f664d5d9911f08cd979c5f70d8cb0ca2add" - integrity sha1-W1RPZk1dmRHwjNl5xfcNjLDKKt0= - dependencies: - babel-plugin-htmlbars-inline-precompile "^0.2.3" - ember-cli-version-checker "^2.0.0" - hash-for-dep "^1.0.2" - heimdalljs-logger "^0.1.7" - silent-error "^1.1.0" - -ember-cli-htmlbars-inline-precompile@^1.0.3: +ember-cli-htmlbars-inline-precompile@^1.0.0, ember-cli-htmlbars-inline-precompile@^1.0.3: version "1.0.5" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-1.0.5.tgz#312e050c9e3dd301c55fb399fd706296cd0b1d6a" integrity sha512-/CNEqPxroIcbY6qejrt704ZaghHLCntZKYLizFfJ2esirXoJx6fuYKBY1YyJ8GOgjfbHHKjBZuK4vFFJpkGqkQ== @@ -5082,6 +5071,17 @@ ember-cli-htmlbars-inline-precompile@^1.0.3: heimdalljs-logger "^0.1.9" silent-error "^1.1.0" +ember-cli-htmlbars-inline-precompile@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-2.1.0.tgz#61b91ff1879d44ae504cadb46fb1f2604995ae08" + integrity sha512-BylIHduwQkncPhnj0ZyorBuljXbTzLgRo6kuHf1W+IHFxThFl2xG+r87BVwsqx4Mn9MTgW9SE0XWjwBJcSWd6Q== + dependencies: + babel-plugin-htmlbars-inline-precompile "^1.0.0" + ember-cli-version-checker "^2.1.2" + hash-for-dep "^1.2.3" + heimdalljs-logger "^0.1.9" + silent-error "^1.1.0" + ember-cli-htmlbars@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.3.tgz#e116e1500dba12f29c94b05b9ec90f52cb8bb042" From 3ac93f23be90dee7b216dae8d890f4838f5e0894 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Wed, 27 Feb 2019 11:10:20 -0500 Subject: [PATCH 336/879] build(deps-dev): bump broccoli-asset-rev from 2.7.0 to 3.0.0 (#1528) Bumps [broccoli-asset-rev](https://github.com/rickharrison/broccoli-asset-rev) from 2.7.0 to 3.0.0. - [Release notes](https://github.com/rickharrison/broccoli-asset-rev/releases) - [Commits](https://github.com/rickharrison/broccoli-asset-rev/commits) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 68 ++++++++++------------------------------------------ 2 files changed, 13 insertions(+), 57 deletions(-) diff --git a/package.json b/package.json index 87034ade6..3cc374d19 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "@ember/optional-features": "^0.7.0", "active-model-adapter": "^2.0.3", "babel-eslint": "^8.2.6", - "broccoli-asset-rev": "^2.7.0", + "broccoli-asset-rev": "^3.0.0", "broccoli-test-helper": "^2.0.0", "chai": "^4.1.0", "ember-ajax": "^4.0.2", diff --git a/yarn.lock b/yarn.lock index d3631b2e4..3fb095743 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2434,22 +2434,22 @@ broccoli-amd-funnel@^1.3.0: broccoli-plugin "^1.3.0" symlink-or-copy "^1.2.0" -broccoli-asset-rev@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/broccoli-asset-rev/-/broccoli-asset-rev-2.7.0.tgz#c73da1d97c4180366fa442a87624ca1b7fb99161" - integrity sha512-GZ7gU3Qo6HMAUqDeh1q+4UVCQPJPjCyGcpIY5s9Qp58a244FT4nZSiy8qYkVC4LLIWTZt59G7jFFsUcj/13IPQ== +broccoli-asset-rev@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/broccoli-asset-rev/-/broccoli-asset-rev-3.0.0.tgz#65a28c8a062d6ee2cffd91ed2a8309e0f8253ac6" + integrity sha512-gAHQZnwvtl74tGevUqGuWoyOdJUdMMv0TjGSMzbdyGImr9fZcnM6xmggDA8bUawrMto9NFi00ZtNUgA4dQiUBw== dependencies: - broccoli-asset-rewrite "^1.1.0" + broccoli-asset-rewrite "^2.0.0" broccoli-filter "^1.2.2" broccoli-persistent-filter "^1.4.3" json-stable-stringify "^1.0.0" minimatch "^3.0.4" rsvp "^3.0.6" -broccoli-asset-rewrite@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/broccoli-asset-rewrite/-/broccoli-asset-rewrite-1.1.0.tgz#77a5da56157aa318c59113245e8bafb4617f8830" - integrity sha1-d6XaVhV6oxjFkRMkXouvtGF/iDA= +broccoli-asset-rewrite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/broccoli-asset-rewrite/-/broccoli-asset-rewrite-2.0.0.tgz#603c4a52d4c8987a2f681254436923ac0a9c94ab" + integrity sha512-dqhxdQpooNi7LHe8J9Jdxp6o3YPFWl4vQmint6zrsn2sVbOo+wpyiX3erUSt0IBtjNkAxqJjuvS375o2cLBHTA== dependencies: broccoli-filter "^1.2.3" @@ -2646,22 +2646,7 @@ broccoli-file-creator@^2.1.1: broccoli-plugin "^1.1.0" mkdirp "^0.5.1" -broccoli-filter@^1.2.2, broccoli-filter@^1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/broccoli-filter/-/broccoli-filter-1.2.4.tgz#409afb94b9a3a6da9fac8134e91e205f40cc7330" - integrity sha1-QJr7lLmjptqfrIE06R4gX0DMczA= - dependencies: - broccoli-kitchen-sink-helpers "^0.3.1" - broccoli-plugin "^1.0.0" - copy-dereference "^1.0.0" - debug "^2.2.0" - mkdirp "^0.5.1" - promise-map-series "^0.2.1" - rsvp "^3.0.18" - symlink-or-copy "^1.0.1" - walk-sync "^0.3.1" - -broccoli-filter@^1.2.4: +broccoli-filter@^1.2.2, broccoli-filter@^1.2.3, broccoli-filter@^1.2.4: version "1.3.0" resolved "https://registry.yarnpkg.com/broccoli-filter/-/broccoli-filter-1.3.0.tgz#71e3a8e32a17f309e12261919c5b1006d6766de6" integrity sha512-VXJXw7eBfG82CFxaBDjYmyN7V72D4In2zwLVQJd/h3mBfF3CMdRTsv2L20lmRTtCv1sAHcB+LgMso90e/KYiLw== @@ -2819,7 +2804,7 @@ broccoli-node-info@1.1.0, broccoli-node-info@^1.1.0: resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-1.1.0.tgz#3aa2e31e07e5bdb516dd25214f7c45ba1c459412" integrity sha1-OqLjHgflvbUW3SUhT3xFuhxFlBI= -broccoli-persistent-filter@^1.0.3: +broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.2.0, broccoli-persistent-filter@^1.4.3: version "1.4.6" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.6.tgz#80762d19000880a77da33c34373299c0f6a3e615" integrity sha512-0RejLwoC95kv4kta8KAa+FmECJCK78Qgm8SRDEK7YyU0N9Cx6KpY3UCDy9WELl3mCXLN8TokNxc7/hp3lL4lfw== @@ -2838,25 +2823,6 @@ broccoli-persistent-filter@^1.0.3: symlink-or-copy "^1.0.1" walk-sync "^0.3.1" -broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.2.0, broccoli-persistent-filter@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.3.tgz#3511bc52fc53740cda51621f58a28152d9911bc1" - integrity sha512-JwNLDvvXJlhUmr+CHcbVhCyp33NbCIAITjQZmJY9e8QzANXh3jpFWlhSFvkWghwKA8rTAKcXkW12agtiZjxr4g== - dependencies: - async-disk-cache "^1.2.1" - async-promise-queue "^1.0.3" - broccoli-plugin "^1.0.0" - fs-tree-diff "^0.5.2" - hash-for-dep "^1.0.2" - heimdalljs "^0.2.1" - heimdalljs-logger "^0.1.7" - mkdirp "^0.5.1" - promise-map-series "^0.2.1" - rimraf "^2.6.1" - rsvp "^3.0.18" - symlink-or-copy "^1.0.1" - walk-sync "^0.3.1" - broccoli-persistent-filter@^2.0.0, broccoli-persistent-filter@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.1.1.tgz#7bb2b1015baedf5cf58b5b2608495f3d78f81b12" @@ -12115,21 +12081,11 @@ rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0. resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== -rsvp@^4.6.1, rsvp@^4.7.0: - version "4.8.1" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.1.tgz#168addb3963222de37ee351b70e3876bdb2ac285" - integrity sha512-c9tShmZbQ5nLVVVl3Fuhk1NExJlXfAMIEz7a8GC570X8XhNQNZPFAdjOeMmJEN3SLYOOb2OprS576P/QO4QouA== - -rsvp@^4.8.1, rsvp@^4.8.3, rsvp@^4.8.4: +rsvp@^4.6.1, rsvp@^4.7.0, rsvp@^4.8.1, rsvp@^4.8.2, rsvp@^4.8.3, rsvp@^4.8.4: version "4.8.4" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911" integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA== -rsvp@^4.8.2: - version "4.8.3" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.3.tgz#25d4b9fdd0f95e216eb5884d9b3767d3fbfbe2cd" - integrity sha512-/OlbK31XtkPnLD2ktmZXj4g/v6q1boTDr6/3lFuDTgxVsrA3h7PH5eYyAxIvDMjRHr/DoOlzNicqDwBEo9xU7g== - rsvp@~3.0.6: version "3.0.21" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.0.21.tgz#49c588fe18ef293bcd0ab9f4e6756e6ac433359f" From 8743add3fa2dc97c74a1a599e2db6e16af386694 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 28 Feb 2019 08:29:26 -0500 Subject: [PATCH 337/879] build(deps-dev): bump ember-cli-fastboot from 1.1.4-beta.1 to 2.0.4 (#1533) Bumps [ember-cli-fastboot](https://github.com/ember-fastboot/ember-cli-fastboot) from 1.1.4-beta.1 to 2.0.4. - [Release notes](https://github.com/ember-fastboot/ember-cli-fastboot/releases) - [Changelog](https://github.com/ember-fastboot/ember-cli-fastboot/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-fastboot/ember-cli-fastboot/compare/v1.1.4-beta.1...v2.0.4) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 190 ++++++++++++--------------------------------------- 2 files changed, 45 insertions(+), 147 deletions(-) diff --git a/package.json b/package.json index 3cc374d19..ceb9f80fc 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "ember-cli-deploy-git": "^1.3.3", "ember-cli-deploy-git-ci": "^1.0.1", "ember-cli-eslint": "^4.2.3", - "ember-cli-fastboot": "^1.1.4-beta.1", + "ember-cli-fastboot": "^2.0.4", "ember-cli-favicon": "^1.0.0-beta.4", "ember-cli-htmlbars": "^3.0.0", "ember-cli-htmlbars-inline-precompile": "^2.1.0", diff --git a/yarn.lock b/yarn.lock index 3fb095743..f51adcfc3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1192,11 +1192,6 @@ ansi-escapes@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" integrity sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ== -ansi-regex@^0.2.0, ansi-regex@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" - integrity sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk= - ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -1207,11 +1202,6 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-styles@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" - integrity sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94= - ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -2551,25 +2541,7 @@ broccoli-clean-css@^1.1.0: inline-source-map-comment "^1.0.5" json-stable-stringify "^1.0.0" -broccoli-concat@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.2.2.tgz#86ffdc52606eb590ba9f6b894c5ec7a016f5b7b9" - integrity sha1-hv/cUmButZC6n2uJTF7HoBb1t7k= - dependencies: - broccoli-kitchen-sink-helpers "^0.3.1" - broccoli-plugin "^1.3.0" - broccoli-stew "^1.3.3" - ensure-posix-path "^1.0.2" - fast-sourcemap-concat "^1.0.1" - find-index "^1.1.0" - fs-extra "^1.0.0" - fs-tree-diff "^0.5.6" - lodash.merge "^4.3.0" - lodash.omit "^4.1.0" - lodash.uniq "^4.2.0" - walk-sync "^0.3.1" - -broccoli-concat@^3.5.1, broccoli-concat@^3.7.1, broccoli-concat@^3.7.3: +broccoli-concat@^3.2.2, broccoli-concat@^3.5.1, broccoli-concat@^3.7.1, broccoli-concat@^3.7.3: version "3.7.3" resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.7.3.tgz#0dca01311567ffb13180e6b4eb111824628e4885" integrity sha512-2Ma9h81EJ0PRb9n4sW0i8KZlcnpTQfKxcj87zvi5DFe1fd8CTDEdseHDotK2beuA2l+LbgVPfd8EHaBJKm/Y8g== @@ -2932,26 +2904,6 @@ broccoli-static-compiler@^0.1.4: broccoli-writer "^0.1.1" mkdirp "^0.3.5" -broccoli-stew@^1.3.3, broccoli-stew@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-1.5.0.tgz#d7af8c18511dce510e49d308a62e5977f461883c" - integrity sha1-16+MGFEdzlEOSdMIpi5Zd/RhiDw= - dependencies: - broccoli-debug "^0.6.1" - broccoli-funnel "^1.0.1" - broccoli-merge-trees "^1.0.0" - broccoli-persistent-filter "^1.1.6" - broccoli-plugin "^1.3.0" - chalk "^1.1.3" - debug "^2.4.0" - ensure-posix-path "^1.0.1" - fs-extra "^2.0.0" - minimatch "^3.0.2" - resolve "^1.1.6" - rsvp "^3.0.16" - symlink-or-copy "^1.1.8" - walk-sync "^0.3.0" - broccoli-stew@^1.4.2: version "1.6.0" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-1.6.0.tgz#01f6d92806ed6679ddbe48d405066a0e164dfbef" @@ -2972,6 +2924,26 @@ broccoli-stew@^1.4.2: symlink-or-copy "^1.2.0" walk-sync "^0.3.0" +broccoli-stew@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-1.5.0.tgz#d7af8c18511dce510e49d308a62e5977f461883c" + integrity sha1-16+MGFEdzlEOSdMIpi5Zd/RhiDw= + dependencies: + broccoli-debug "^0.6.1" + broccoli-funnel "^1.0.1" + broccoli-merge-trees "^1.0.0" + broccoli-persistent-filter "^1.1.6" + broccoli-plugin "^1.3.0" + chalk "^1.1.3" + debug "^2.4.0" + ensure-posix-path "^1.0.1" + fs-extra "^2.0.0" + minimatch "^3.0.2" + resolve "^1.1.6" + rsvp "^3.0.16" + symlink-or-copy "^1.1.8" + walk-sync "^0.3.0" + broccoli-stew@^2.0.0, broccoli-stew@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-2.0.1.tgz#d0a507b79bf5fea9ff84032ae837dc48670ab1dc" @@ -3466,17 +3438,6 @@ chai@^4.1.0: pathval "^1.1.0" type-detect "^4.0.5" -chalk@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" - integrity sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ= - dependencies: - ansi-styles "^1.1.0" - escape-string-regexp "^1.0.0" - has-ansi "^0.1.0" - strip-ansi "^0.3.0" - supports-color "^0.2.0" - chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -4989,27 +4950,27 @@ ember-cli-eslint@^4.2.3: rsvp "^4.6.1" walk-sync "^0.3.0" -ember-cli-fastboot@^1.1.4-beta.1: - version "1.1.4-beta.1" - resolved "https://registry.yarnpkg.com/ember-cli-fastboot/-/ember-cli-fastboot-1.1.4-beta.1.tgz#7063df36e62b92fd0f60c9a23dd03b5b57aec3fe" - integrity sha512-Jx9txTOGX0wgbg3d6N5oy2PSI9FI31tg4KiMY5vtXL3GuEi0S+HLCvh/w+INy+Ka3WLFcjutCdow23VL4gzDoQ== +ember-cli-fastboot@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/ember-cli-fastboot/-/ember-cli-fastboot-2.0.4.tgz#2aa4ecc87671f04078e3e1cb48684677bb2f26c5" + integrity sha512-5FYPXxcFIDdQFaXCcXAvv6Z4HwoNkqmoLRQRh/iMm/ajCJVuEWjbjaPuy+Cs0sAVuPYiJ1VVVkZDOieAhNNIrQ== dependencies: - broccoli-concat "^3.2.2" - broccoli-funnel "^2.0.0" - broccoli-merge-trees "^2.0.0" - broccoli-plugin "^1.2.1" - chalk "^2.0.1" - ember-cli-babel "^6.7.2" + broccoli-concat "^3.7.1" + broccoli-funnel "^2.0.1" + broccoli-merge-trees "^3.0.1" + broccoli-plugin "^1.3.1" + chalk "^2.4.1" + ember-cli-babel "^7.1.0" ember-cli-lodash-subset "2.0.1" - ember-cli-preprocess-registry "^3.1.0" - ember-cli-version-checker "^2.1.0" - fastboot "^1.1.4-beta.1" - fastboot-express-middleware "^1.1.0" - fastboot-transform "^0.1.2" - fs-extra "^4.0.2" + ember-cli-preprocess-registry "^3.1.2" + ember-cli-version-checker "^3.0.0" + fastboot "^1.2.0" + fastboot-express-middleware "^1.2.0" + fastboot-transform "^0.1.3" + fs-extra "^7.0.0" json-stable-stringify "^1.0.1" md5-hex "^2.0.0" - silent-error "^1.0.0" + silent-error "^1.1.0" ember-cli-favicon@^1.0.0-beta.4: version "1.0.0" @@ -5146,20 +5107,6 @@ ember-cli-path-utils@^1.0.0: resolved "https://registry.yarnpkg.com/ember-cli-path-utils/-/ember-cli-path-utils-1.0.0.tgz#4e39af8b55301cddc5017739b77a804fba2071ed" integrity sha1-Tjmvi1UwHN3FAXc5t3qAT7ogce0= -ember-cli-preprocess-registry@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/ember-cli-preprocess-registry/-/ember-cli-preprocess-registry-3.1.1.tgz#38456c21c4d2b64945850cf9ec68db6ba769288a" - integrity sha1-OEVsIcTStklFhQz57Gjba6dpKIo= - dependencies: - broccoli-clean-css "^1.1.0" - broccoli-funnel "^1.0.0" - broccoli-merge-trees "^1.0.0" - debug "^2.2.0" - ember-cli-lodash-subset "^1.0.7" - exists-sync "0.0.3" - process-relative-require "^1.0.0" - silent-error "^1.0.0" - ember-cli-preprocess-registry@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/ember-cli-preprocess-registry/-/ember-cli-preprocess-registry-3.1.2.tgz#083efb21fd922c021ceba9e08f4d9278249fc4db" @@ -5987,7 +5934,7 @@ escape-html@1.0.3, escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= @@ -6300,11 +6247,6 @@ exists-stat@1.0.0: resolved "https://registry.yarnpkg.com/exists-stat/-/exists-stat-1.0.0.tgz#0660e3525a2e89d9e446129440c272edfa24b529" integrity sha1-BmDjUlouidnkRhKUQMJy7foktSk= -exists-sync@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.3.tgz#b910000bedbb113b378b82f5f5a7638107622dcf" - integrity sha1-uRAAC+27ETs3i4L19adjgQdiLc8= - exists-sync@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.4.tgz#9744c2c428cc03b01060db454d4b12f0ef3c8879" @@ -6590,21 +6532,6 @@ fast-ordered-set@^1.0.0, fast-ordered-set@^1.0.2: dependencies: blank-object "^1.0.1" -fast-sourcemap-concat@^1.0.1: - version "1.2.3" - resolved "https://registry.yarnpkg.com/fast-sourcemap-concat/-/fast-sourcemap-concat-1.2.3.tgz#22f14e92d739e37920334376ec8433bf675eaa04" - integrity sha1-IvFOktc543kgM0N27IQzv2deqgQ= - dependencies: - chalk "^0.5.1" - fs-extra "^0.30.0" - heimdalljs-logger "^0.1.7" - memory-streams "^0.1.0" - mkdirp "^0.5.0" - rsvp "^3.0.14" - source-map "^0.4.2" - source-map-url "^0.3.0" - sourcemap-validator "^1.0.5" - fast-sourcemap-concat@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/fast-sourcemap-concat/-/fast-sourcemap-concat-1.4.0.tgz#122c330d4a2afaff16ad143bc9674b87cd76c8ad" @@ -6619,7 +6546,7 @@ fast-sourcemap-concat@^1.4.0: source-map-url "^0.3.0" sourcemap-validator "^1.1.0" -fastboot-express-middleware@^1.1.0: +fastboot-express-middleware@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/fastboot-express-middleware/-/fastboot-express-middleware-1.2.0.tgz#3f32fb21d8d01ad7c0c7d876b278601665ea17fa" integrity sha1-PzL7IdjQGtfAx9h2snhgFmXqF/o= @@ -6635,7 +6562,7 @@ fastboot-transform@0.1.1: dependencies: broccoli-stew "^1.5.0" -fastboot-transform@^0.1.2: +fastboot-transform@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/fastboot-transform/-/fastboot-transform-0.1.3.tgz#7dea0b117594afd8772baa6c9b0919644e7f7dcd" integrity sha512-6otygPIJw1ARp1jJb+6KVO56iKBjhO+5x59RSC9qiZTbZRrv+HZAuP00KD3s+nWMvcFDemtdkugki9DNFTTwCQ== @@ -6643,7 +6570,7 @@ fastboot-transform@^0.1.2: broccoli-stew "^1.5.0" convert-source-map "^1.5.1" -fastboot@^1.1.4-beta.1, fastboot@^1.2.0: +fastboot@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-1.2.0.tgz#35c5747db1943d082f2ba619226d16cd7281e946" integrity sha1-NcV0fbGUPQgvK6YZIm0WzXKB6UY= @@ -7568,13 +7495,6 @@ harmony-reflect@^1.4.2: resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.0.tgz#9c28a77386ec225f7b5d370f9861ba09c4eea58f" integrity sha512-0kZ1XcoelFOLEjEtvWAZyq/1S55eDSieWEJwme311MNVNcRpvjlr2zA66kBV6WAB8C1XI1p1cXCnFPqd1BxlPg== -has-ansi@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" - integrity sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4= - dependencies: - ansi-regex "^0.2.0" - has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -9361,7 +9281,7 @@ lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -lodash.merge@^4.3.0, lodash.merge@^4.3.1, lodash.merge@^4.4.0, lodash.merge@^4.6.0: +lodash.merge@^4.3.1, lodash.merge@^4.4.0, lodash.merge@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== @@ -9722,7 +9642,7 @@ memory-fs@^0.4.0, memory-fs@~0.4.1: errno "^0.1.3" readable-stream "^2.0.1" -memory-streams@^0.1.0, memory-streams@^0.1.3: +memory-streams@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/memory-streams/-/memory-streams-0.1.3.tgz#d9b0017b4b87f1d92f55f2745c9caacb1dc93ceb" integrity sha512-qVQ/CjkMyMInPaaRMrwWNDvf6boRZXaT/DbQeMYcCWuXPEBf1v8qChOc9OlEVQp2uOvRXa1Qu30fLmKhY6NipA== @@ -12633,16 +12553,6 @@ sourcemap-codec@^1.4.1: resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz#c63ea927c029dd6bd9a2b7fa03b3fec02ad56e9f" integrity sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg== -sourcemap-validator@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/sourcemap-validator/-/sourcemap-validator-1.0.6.tgz#abd2f1ecdae6a3c46c2c96c5f256705b2147c9c0" - integrity sha1-q9Lx7Nrmo8RsLJbF8lZwWyFHycA= - dependencies: - jsesc "~0.3.x" - lodash.foreach "~2.3.x" - lodash.template "~2.3.x" - source-map "~0.1.x" - sourcemap-validator@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/sourcemap-validator/-/sourcemap-validator-1.1.0.tgz#00454547d1682186e1498a7208e022e8dfa8738f" @@ -12881,13 +12791,6 @@ stringstream@~0.0.4: resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72" integrity sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA== -strip-ansi@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" - integrity sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA= - dependencies: - ansi-regex "^0.2.1" - strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -12948,11 +12851,6 @@ sum-up@^1.0.1: dependencies: chalk "^1.0.0" -supports-color@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" - integrity sha1-2S3iaU6z9nMjlz1649i1W0wiGQo= - supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" From 88e826fffc14165be4683d5d90618fca8c65bb00 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 28 Feb 2019 08:30:58 -0500 Subject: [PATCH 338/879] build(deps-dev): bump ember-load-initializers from 1.1.0 to 2.0.0 (#1534) Bumps [ember-load-initializers](https://github.com/ember-cli/ember-load-initializers) from 1.1.0 to 2.0.0. - [Release notes](https://github.com/ember-cli/ember-load-initializers/releases) - [Changelog](https://github.com/ember-cli/ember-load-initializers/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-load-initializers/compare/v1.1.0...v2.0.0) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index ceb9f80fc..e008afcd7 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "ember-data": "~3.7.0", "ember-disable-prototype-extensions": "^1.1.3", "ember-export-application-global": "^2.0.0", - "ember-load-initializers": "^1.1.0", + "ember-load-initializers": "^2.0.0", "ember-maybe-import-regenerator": "^0.1.6", "ember-moment": "^7.8.1", "ember-resolver": "^5.0.1", diff --git a/yarn.lock b/yarn.lock index f51adcfc3..6fc40222b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5556,12 +5556,12 @@ ember-keyboard@^4.0.0: babel-plugin-transform-object-rest-spread "^6.26.0" ember-cli-babel "^6.6.0" -ember-load-initializers@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-1.1.0.tgz#4edacc0f3a14d9f53d241ac3e5561804c8377978" - integrity sha512-WiciFi8IXOqjyJ65M4iBNIthqcy4uXXQq5n3WxeMMhvJVk5JNSd9hynNECNz3nqfEYuZQ9c04UWkmFIQXRfl4Q== +ember-load-initializers@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-2.0.0.tgz#d4b3108dd14edb0f9dc3735553cc96dadd8a80cb" + integrity sha512-GQ0x7jGcPovmIFsLQO0dFERHCjkFNAWeuVErXHR466oPHvi479in/WtSJK707pmr3GA5QXXRJy6U8fAdJeJcxA== dependencies: - ember-cli-babel "^6.6.0" + ember-cli-babel "^7.0.0" ember-macro-helpers@^2.1.0: version "2.1.0" From 565637e55d09345d2b3909a3bcfcc26a1c8bc29c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 28 Feb 2019 08:37:06 -0500 Subject: [PATCH 339/879] build(deps-dev): bump babel-eslint from 8.2.6 to 9.0.0 (#1537) Bumps [babel-eslint](https://github.com/babel/babel-eslint) from 8.2.6 to 9.0.0. - [Release notes](https://github.com/babel/babel-eslint/releases) - [Commits](https://github.com/babel/babel-eslint/compare/v8.2.6...v9.0.0) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 158 ++++++++++++--------------------------------------- 2 files changed, 37 insertions(+), 123 deletions(-) diff --git a/package.json b/package.json index e008afcd7..9c6816e6f 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "@ember/jquery": "^0.5.2", "@ember/optional-features": "^0.7.0", "active-model-adapter": "^2.0.3", - "babel-eslint": "^8.2.6", + "babel-eslint": "^9.0.0", "broccoli-asset-rev": "^3.0.0", "broccoli-test-helper": "^2.0.0", "chai": "^4.1.0", diff --git a/yarn.lock b/yarn.lock index 6fc40222b..aef6c924d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,13 +2,6 @@ # yarn lockfile v1 -"@babel/code-frame@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" - integrity sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g== - dependencies: - "@babel/highlight" "7.0.0-beta.44" - "@babel/code-frame@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" @@ -36,17 +29,6 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" - integrity sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ== - dependencies: - "@babel/types" "7.0.0-beta.44" - jsesc "^2.5.1" - lodash "^4.2.0" - source-map "^0.5.0" - trim-right "^1.0.1" - "@babel/generator@^7.2.2": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.2.2.tgz#18c816c70962640eab42fe8cae5f3947a5c65ccc" @@ -58,6 +40,17 @@ source-map "^0.5.0" trim-right "^1.0.1" +"@babel/generator@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.4.tgz#9aa48c1989257877a9d971296e5b73bfe72e446e" + integrity sha512-8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg== + dependencies: + "@babel/types" "^7.3.4" + jsesc "^2.5.1" + lodash "^4.17.11" + source-map "^0.5.0" + trim-right "^1.0.1" + "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" @@ -99,15 +92,6 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-function-name@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" - integrity sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg== - dependencies: - "@babel/helper-get-function-arity" "7.0.0-beta.44" - "@babel/template" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - "@babel/helper-function-name@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" @@ -117,13 +101,6 @@ "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-get-function-arity@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" - integrity sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw== - dependencies: - "@babel/types" "7.0.0-beta.44" - "@babel/helper-get-function-arity@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" @@ -212,13 +189,6 @@ "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-split-export-declaration@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" - integrity sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA== - dependencies: - "@babel/types" "7.0.0-beta.44" - "@babel/helper-split-export-declaration@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" @@ -245,15 +215,6 @@ "@babel/traverse" "^7.1.5" "@babel/types" "^7.2.0" -"@babel/highlight@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" - integrity sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ== - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^3.0.0" - "@babel/highlight@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" @@ -263,10 +224,10 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.2.2", "@babel/parser@^7.2.3": - version "7.2.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.2.3.tgz#32f5df65744b70888d17872ec106b02434ba1489" - integrity sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA== +"@babel/parser@^7.0.0", "@babel/parser@^7.2.2", "@babel/parser@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.4.tgz#a43357e4bbf4b92a437fb9e465c192848287f27c" + integrity sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ== "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" @@ -625,16 +586,6 @@ dependencies: regenerator-runtime "^0.12.0" -"@babel/template@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" - integrity sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng== - dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" - lodash "^4.2.0" - "@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.2.2": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" @@ -644,50 +595,25 @@ "@babel/parser" "^7.2.2" "@babel/types" "^7.2.2" -"@babel/traverse@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" - integrity sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA== - dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/generator" "7.0.0-beta.44" - "@babel/helper-function-name" "7.0.0-beta.44" - "@babel/helper-split-export-declaration" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" - debug "^3.1.0" - globals "^11.1.0" - invariant "^2.2.0" - lodash "^4.2.0" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.1.6", "@babel/traverse@^7.2.2", "@babel/traverse@^7.2.3": - version "7.2.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.2.3.tgz#7ff50cefa9c7c0bd2d81231fdac122f3957748d8" - integrity sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw== +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.1.6", "@babel/traverse@^7.2.2", "@babel/traverse@^7.2.3": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.3.4.tgz#1330aab72234f8dea091b08c4f8b9d05c7119e06" + integrity sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.2.2" + "@babel/generator" "^7.3.4" "@babel/helper-function-name" "^7.1.0" "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/parser" "^7.2.3" - "@babel/types" "^7.2.2" + "@babel/parser" "^7.3.4" + "@babel/types" "^7.3.4" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.10" - -"@babel/types@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" - integrity sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ== - dependencies: - esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^2.0.0" + lodash "^4.17.11" -"@babel/types@^7.0.0", "@babel/types@^7.1.5", "@babel/types@^7.1.6", "@babel/types@^7.2.0", "@babel/types@^7.2.2": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.3.tgz#6c44d1cdac2a7625b624216657d5bc6c107ab436" - integrity sha512-2tACZ80Wg09UnPg5uGAOUvvInaqLk3l/IAhQzlxLQOIXacr6bMsra5SH6AWw/hIDRCSbCdHP2KzSOD+cT7TzMQ== +"@babel/types@^7.0.0", "@babel/types@^7.1.5", "@babel/types@^7.1.6", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.4.tgz#bf482eaeaffb367a28abbf9357a94963235d90ed" + integrity sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ== dependencies: esutils "^2.0.2" lodash "^4.17.11" @@ -1555,15 +1481,15 @@ babel-core@^6.24.1, babel-core@^6.26.0, babel-core@^6.26.3: slash "^1.0.0" source-map "^0.5.7" -babel-eslint@^8.2.6: - version "8.2.6" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.6.tgz#6270d0c73205628067c0f7ae1693a9e797acefd9" - integrity sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA== +babel-eslint@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-9.0.0.tgz#7d9445f81ed9f60aff38115f838970df9f2b6220" + integrity sha512-itv1MwE3TMbY0QtNfeL7wzak1mV47Uy+n6HtSOO4Xd7rvmO+tsGQSgyOEEgo6Y2vHZKZphaoelNeSVj4vkLA1g== dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/traverse" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" eslint-scope "3.7.1" eslint-visitor-keys "^1.0.0" @@ -2150,11 +2076,6 @@ babylon@6.18.0, babylon@^6.18.0: resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== -babylon@7.0.0-beta.44: - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" - integrity sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g== - backbone@^1.1.2: version "1.3.3" resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.3.3.tgz#4cc80ea7cb1631ac474889ce40f2f8bc683b2999" @@ -8005,13 +7926,6 @@ into-stream@^3.1.0: from2 "^2.1.1" p-is-promise "^1.1.0" -invariant@^2.2.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - invariant@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" @@ -9396,7 +9310,7 @@ lodash@^3.10.0, lodash@^3.2.0: resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= -lodash@^4.0.0, lodash@^4.1.0, lodash@^4.10.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1, lodash@~4.17.10: +lodash@^4.0.0, lodash@^4.1.0, lodash@^4.10.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1, lodash@~4.17.10: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== From b56543e7ac0b959c9a3460bb99195df141342198 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 28 Feb 2019 08:42:32 -0500 Subject: [PATCH 340/879] build(deps-dev): bump eslint-plugin-ember from 5.4.0 to 6.2.0 (#1540) Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 5.4.0 to 6.2.0. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v5.4.0...v6.2.0) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 9c6816e6f..d2e931021 100644 --- a/package.json +++ b/package.json @@ -94,7 +94,7 @@ "ember-source-channel-url": "^1.1.0", "ember-try": "^1.0.0", "escape-string-regexp": "^1.0.5", - "eslint-plugin-ember": "^5.2.0", + "eslint-plugin-ember": "^6.2.0", "eslint-plugin-ember-suave": "^1.0.0", "eslint-plugin-node": "^8.0.1", "faker": "^4.1.0", diff --git a/yarn.lock b/yarn.lock index aef6c924d..5a26e2732 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5905,10 +5905,10 @@ eslint-plugin-ember-suave@^1.0.0: dependencies: requireindex "~1.1.0" -eslint-plugin-ember@^5.2.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-5.4.0.tgz#2980a4389119b37d0450fff8e82d59c9aab126d0" - integrity sha512-tYMuxUrTad4f7Dq9gY9GUs9lXwKY+fZklzCJ0JoYbzK2PwSfdrPInr2Y4tHornc9dzPvNbRxsn5b26PrWp2iZg== +eslint-plugin-ember@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-6.2.0.tgz#658c24be2435da337b597c924a16aa31d69a1a40" + integrity sha512-WKNmTBxvQRr+f1RZ7S+env9BxH18a8uLyqli6Gg6oh5/gl5NChHKe5iGdwv0bC6yUlkocFJkQYheIC25L3npKw== dependencies: ember-rfc176-data "^0.3.5" snake-case "^2.1.0" From 755212de5b7151c22bdd5dd438dcfd7debe28b72 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 28 Feb 2019 10:06:05 -0500 Subject: [PATCH 341/879] build(deps): bump ember-cli-babel from 6.18.0 to 7.5.0 (#1535) Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 6.18.0 to 7.5.0. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v6.18.0...v7.5.0) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 43 +++++++++++++++++++++++++------------------ 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index d2e931021..9a78b69b2 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "broccoli-string-replace": "^0.1.2", "chalk": "^1.1.1", "ember-auto-import": "^1.2.19", - "ember-cli-babel": "^6.16.0", + "ember-cli-babel": "^7.5.0", "ember-cli-node-assets": "^0.2.2", "ember-get-config": "^0.2.2", "ember-inflector": "^2.0.0 || ^3.0.0", diff --git a/yarn.lock b/yarn.lock index 5a26e2732..8f9e2414e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1662,12 +1662,19 @@ babel-plugin-debug-macros@^0.2.0, babel-plugin-debug-macros@^0.2.0-beta.6: dependencies: semver "^5.3.0" -babel-plugin-ember-modules-api-polyfill@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.6.0.tgz#9524a65ef0c31ee82536a19c243fbaec1b977cbb" - integrity sha512-BSbLv3+ju1mcUUoPe7vPJgnGawrNxp6LfFBRHlNOKeMlQlml9Wo2MRRUrbpNDlmVc761xSKj8+cde7R0Lwpq7g== +babel-plugin-debug-macros@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.3.0.tgz#7a025944faef0777804ef3518c54e8b040197397" + integrity sha512-D6qYBI/3+FvcKVnRnH6FBUwXPp/5o/jnJNVFKqVaZpYAWx88+R8jNNyaEX7iQFs7UfCib6rcY/9+ICR4jhjFCQ== + dependencies: + semver "^5.3.0" + +babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-polyfill@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.7.0.tgz#dcd6a9999da0d47d8c9185362bda6244ca525f4a" + integrity sha512-+QXPqmRngp13d7nKWrBcL6iIixpuyMNq107XV1dKvsvAO5BGFQ0mSk7Dl6/OgG+z2F1KquxkFfdXYBwbREQI6A== dependencies: - ember-rfc176-data "^0.3.6" + ember-rfc176-data "^0.3.7" babel-plugin-feature-flags@^0.3.1: version "0.3.1" @@ -3626,12 +3633,7 @@ clone@^1.0.0, clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= -clone@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" - integrity sha1-0hfR6WERjjrJpLi7oyhVU79kfNs= - -clone@^2.1.2: +clone@^2.0.0, clone@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= @@ -4736,10 +4738,10 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.4: - version "7.4.2" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.4.2.tgz#9d7daa165b509e41f6dc3bb443ae32072f766aa2" - integrity sha512-5PJOkQ3B3Cvef2nQVPuZSPA6ckwiED3qF4cqzu7jcKhZ0Fy2TwPqABVbiPBJ46NujAsMZrjverVRST74Q25GqQ== +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.4, ember-cli-babel@^7.5.0: + version "7.5.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.5.0.tgz#af654dcef23630391d2efe85aaa3bdf8b6ca17b7" + integrity sha512-wWXqPPQNRxCtEHvYaLBNiIVgCVCy8YqZ0tM8Dpql1D5nGnPDbaK073sS1vlOYBP7xe5Ab2nXhvQkFwUxFacJ2g== dependencies: "@babel/core" "^7.0.0" "@babel/plugin-transform-modules-amd" "^7.0.0" @@ -4748,8 +4750,8 @@ ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cl "@babel/preset-env" "^7.0.0" "@babel/runtime" "^7.2.0" amd-name-resolver "^1.2.1" - babel-plugin-debug-macros "^0.2.0-beta.6" - babel-plugin-ember-modules-api-polyfill "^2.6.0" + babel-plugin-debug-macros "^0.3.0" + babel-plugin-ember-modules-api-polyfill "^2.7.0" babel-plugin-module-resolver "^3.1.1" broccoli-babel-transpiler "^7.1.2" broccoli-debug "^0.6.4" @@ -5557,11 +5559,16 @@ ember-responsive@^3.0.0-beta.1: dependencies: ember-cli-babel "^6.6.0" -ember-rfc176-data@^0.3.5, ember-rfc176-data@^0.3.6: +ember-rfc176-data@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.6.tgz#7138db8dfccec39c9a832adfbd4c49d670028907" integrity sha512-kPY94VCukPUPj+/6sZ9KvphD42KnpX2IS31p5z07OFVIviDogR0cQuld5c7Irzfgq7a0YACj0HlToROFn7dLYQ== +ember-rfc176-data@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.7.tgz#ecff7d74987d09296d3703343fed934515a4be33" + integrity sha512-AbTlD+q7sfyrD4diZqE7r9Y9/Je+HntVn7TlpHAe+nP5BNXxUXJIfDs5w5e3MxPcMs6Dz/yY90YfW8h1oKEvGg== + ember-router-generator@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-1.2.3.tgz#8ed2ca86ff323363120fc14278191e9e8f1315ee" From 38e29bedb99809afc062e1b2b64f3a38de87697e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 28 Feb 2019 10:06:18 -0500 Subject: [PATCH 342/879] build(deps-dev): bump fastboot from 1.2.0 to 2.0.1 (#1538) Bumps [fastboot](https://github.com/ember-fastboot/fastboot) from 1.2.0 to 2.0.1. - [Release notes](https://github.com/ember-fastboot/fastboot/releases) - [Changelog](https://github.com/ember-fastboot/fastboot/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-fastboot/fastboot/compare/v1.2.0...v2.0.1) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 68 ++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 54 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index 9a78b69b2..0efacfbe3 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "eslint-plugin-ember-suave": "^1.0.0", "eslint-plugin-node": "^8.0.1", "faker": "^4.1.0", - "fastboot": "^1.2.0", + "fastboot": "^2.0.1", "js-yaml": "^3.12.1", "jsdom": "^13.1.0", "loader.js": "^4.7.0", diff --git a/yarn.lock b/yarn.lock index 8f9e2414e..61ec5825e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -755,11 +755,37 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== -"@simple-dom/interface@1.4.0": +"@simple-dom/document@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@simple-dom/document/-/document-1.4.0.tgz#af60855f957f284d436983798ef1006cca1a1678" + integrity sha512-/RUeVH4kuD3rzo5/91+h4Z1meLSLP66eXqpVAw/4aZmYozkeqUkMprq0znL4psX/adEed5cBgiNJcfMz/eKZLg== + dependencies: + "@simple-dom/interface" "^1.4.0" + +"@simple-dom/interface@1.4.0", "@simple-dom/interface@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@simple-dom/interface/-/interface-1.4.0.tgz#e8feea579232017f89b0138e2726facda6fbb71f" integrity sha512-l5qumKFWU0S+4ZzMaLXFU8tQZsicHEMEyAxI5kDFGhJsRqDwe0a7/iPA/GdxlGyDKseQQAgIz5kzU7eXTrlSpA== +"@simple-dom/parser@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@simple-dom/parser/-/parser-1.4.0.tgz#b1fee1a23f48a37d6bdd98f5242db0cab5b67abc" + integrity sha512-TNjDkOehueRIKr1df416qk9ELj+qWuVVJNIT25y1aZg3pQvxv4UPGrgaDFte7dsWBTbF3V8NYPNQ5FDUZQ8Wlg== + dependencies: + "@simple-dom/interface" "^1.4.0" + +"@simple-dom/serializer@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@simple-dom/serializer/-/serializer-1.4.0.tgz#98470f357f418d72b1a1ec78d68191e60aefe215" + integrity sha512-mI1yRahsVs8atXLiQksineDsFEFqeG7RHwnnBTDOK6inbzl4tZQgjR+Z7edjgIJq5j5RhZvwPI6EuCji9B3eQw== + dependencies: + "@simple-dom/interface" "^1.4.0" + +"@simple-dom/void-map@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@simple-dom/void-map/-/void-map-1.4.0.tgz#f15f07568fe1076740407266aa5e6eac249bc78c" + integrity sha512-VDhLEyVCbuhOBBgHol9ShzIv9O8UCzdXeH4FoXu2DOcu/nnvTjLTck+BgXsCLv5ynDiUdoqsREEVFnoyPpFKVw== + "@sindresorhus/is@^0.7.0": version "0.7.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" @@ -6512,6 +6538,20 @@ fastboot@^1.2.0: simple-dom "^1.0.0" source-map-support "^0.5.0" +fastboot@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-2.0.1.tgz#f8fc0d14379e69a250045708f58268c98943f115" + integrity sha512-NH6viW7oo8oDbWXqQ1aJNP5ey3gPYKIVBCX9ByqGxdPISXo5iOEKblyijN+HrPpbidPdQx8PNqHH8mtqo9rY/g== + dependencies: + chalk "^2.0.1" + cookie "^0.3.1" + debug "^4.1.0" + najax "^1.0.3" + resolve "^1.8.1" + rsvp "^4.8.0" + simple-dom "^1.4.0" + source-map-support "^0.5.0" + favicons@^4.7.1: version "4.8.6" resolved "https://registry.yarnpkg.com/favicons/-/favicons-4.8.6.tgz#a2b13800ab3fec2715bc8f27fa841d038d4761e2" @@ -11922,7 +11962,7 @@ rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0. resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== -rsvp@^4.6.1, rsvp@^4.7.0, rsvp@^4.8.1, rsvp@^4.8.2, rsvp@^4.8.3, rsvp@^4.8.4: +rsvp@^4.6.1, rsvp@^4.7.0, rsvp@^4.8.0, rsvp@^4.8.1, rsvp@^4.8.2, rsvp@^4.8.3, rsvp@^4.8.4: version "4.8.4" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911" integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA== @@ -12264,10 +12304,16 @@ silent-error@^1.0.0, silent-error@^1.0.1, silent-error@^1.1.0, silent-error@^1.1 dependencies: debug "^2.2.0" -simple-dom@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/simple-dom/-/simple-dom-1.3.0.tgz#8473e0d34e340544b061410dba3faf4f1b7aa282" - integrity sha512-RVjr6e80FFGDqDJZeQd4EMwoDLatn4Jy2SfuXecrP1IgG4ZAqkGSokE8LNV5i0kzWR2IM0e257xGN9JS8lxm0Q== +simple-dom@^1.0.0, simple-dom@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/simple-dom/-/simple-dom-1.4.0.tgz#78ad1f41b8b70d16f82b7e0d458441c9262565b7" + integrity sha512-TnBPkmOyjdaOqyBMb4ick+n8c0Xv9Iwg1PykFV7hz9Se3UCiacTbRb+25cPmvozFNJLBUNvUzX/KsPfXF14ivA== + dependencies: + "@simple-dom/document" "^1.4.0" + "@simple-dom/interface" "^1.4.0" + "@simple-dom/parser" "^1.4.0" + "@simple-dom/serializer" "^1.4.0" + "@simple-dom/void-map" "^1.4.0" simple-html-tokenizer@^0.5.6: version "0.5.7" @@ -12419,15 +12465,7 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" -source-map-support@^0.5.0: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" - integrity sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@~0.5.6: +source-map-support@^0.5.0, source-map-support@~0.5.6: version "0.5.10" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c" integrity sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ== From 58b029a38cff6e60605da0b73074a3c78df2525b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 28 Feb 2019 13:05:56 -0500 Subject: [PATCH 343/879] build(deps-dev): bump ember-cli-favicon from 1.0.0 to 2.0.0 (#1541) Bumps [ember-cli-favicon](https://github.com/davewasmer/ember-cli-favicon) from 1.0.0 to 2.0.0. - [Release notes](https://github.com/davewasmer/ember-cli-favicon/releases) - [Changelog](https://github.com/davewasmer/ember-cli-favicon/blob/master/CHANGELOG.md) - [Commits](https://github.com/davewasmer/ember-cli-favicon/compare/v1.0.0...v2.0.0) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 849 +++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 655 insertions(+), 196 deletions(-) diff --git a/package.json b/package.json index 0efacfbe3..e343eaac2 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "ember-cli-deploy-git-ci": "^1.0.1", "ember-cli-eslint": "^4.2.3", "ember-cli-fastboot": "^2.0.4", - "ember-cli-favicon": "^1.0.0-beta.4", + "ember-cli-favicon": "^2.0.0", "ember-cli-htmlbars": "^3.0.0", "ember-cli-htmlbars-inline-precompile": "^2.1.0", "ember-cli-inject-live-reload": "^2.0.1", diff --git a/yarn.lock b/yarn.lock index 61ec5825e..28100babf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29,6 +29,26 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/core@^7.3.3": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.3.4.tgz#921a5a13746c21e32445bf0798680e9d11a6530b" + integrity sha512-jRsuseXBo9pN197KnDwhhaaBzyZr2oIcLHHTt2oDdQrej5Qp57dCCJafWx5ivU8/alEYDpssYqv1MUqcxwQlrA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.3.4" + "@babel/helpers" "^7.2.0" + "@babel/parser" "^7.3.4" + "@babel/template" "^7.2.2" + "@babel/traverse" "^7.3.4" + "@babel/types" "^7.3.4" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.11" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/generator@^7.2.2": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.2.2.tgz#18c816c70962640eab42fe8cae5f3947a5c65ccc" @@ -595,7 +615,7 @@ "@babel/parser" "^7.2.2" "@babel/types" "^7.2.2" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.1.6", "@babel/traverse@^7.2.2", "@babel/traverse@^7.2.3": +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.1.6", "@babel/traverse@^7.2.2", "@babel/traverse@^7.2.3", "@babel/traverse@^7.3.4": version "7.3.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.3.4.tgz#1330aab72234f8dea091b08c4f8b9d05c7119e06" integrity sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ== @@ -742,6 +762,258 @@ dependencies: "@glimmer/util" "^0.38.0" +"@jimp/bmp@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.4.0.tgz#9eae4b61fb82a34a529cd1f02423f5efe93a8951" + integrity sha512-3OGpqdQ2/ILjH4s7wxjGQPcaCs4MGpKk/1z907Uxy6lkm2A3miR4djVju4vkXqwobHadlxsB6UR0zt7jmP2nUg== + dependencies: + "@jimp/utils" "^0.4.0" + bmp-js "^0.1.0" + core-js "^2.5.7" + +"@jimp/core@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/core/-/core-0.4.0.tgz#db6b063fd9f6d0f292d9eecffc3a9e07dbc8b7e7" + integrity sha512-kuMIoV9WQg9ILYhvbRcGU5iYoU1LLFm7a9Nq1OPdJUxN71+u+lRCgyPY159ogwD7GKbDO2R8aySilmRMT5J6Bg== + dependencies: + "@jimp/utils" "^0.4.0" + any-base "^1.1.0" + buffer "^5.2.0" + core-js "^2.5.7" + exif-parser "^0.1.12" + file-type "^9.0.0" + load-bmfont "^1.3.1" + mkdirp "0.5.1" + phin "^2.9.1" + pixelmatch "^4.0.2" + tinycolor2 "^1.4.1" + +"@jimp/custom@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/custom/-/custom-0.4.0.tgz#c0b801aea1413c2b827ba299523cbc2d0932197d" + integrity sha512-r4tz7VGuv4jRRQefoAIPi74oNAkOX0mNieeeUkwrfJmza3uO0mZKXM5oP0tOqe7PdJK53FAwuwSQLGEjHNvdTw== + dependencies: + "@jimp/core" "^0.4.0" + core-js "^2.5.7" + +"@jimp/gif@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/gif/-/gif-0.4.0.tgz#69ed6022587f72eab4d22ba1388bdf43649c64e5" + integrity sha512-R2VG1Ec+cRODXnxo5LGqWxcK2QCdeVPuZm96NZsKc7IBDMVkWfZGW2SDUYuNHiPfMad1MYJbkioffaSjTWwXIQ== + dependencies: + "@jimp/utils" "^0.4.0" + core-js "^2.5.7" + omggif "^1.0.9" + +"@jimp/jpeg@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/jpeg/-/jpeg-0.4.0.tgz#66bab17638c834e21d21ca2c4f41e1f9e6f5ae1d" + integrity sha512-nO3ZfUEh+Q2BD1rT5ZB8EkQ1z0VDFTnSsetBd1+D5mOijXcRH8FypdZuE6Q6293C11h69UCEzht/X/JcijNutQ== + dependencies: + "@jimp/utils" "^0.4.0" + core-js "^2.5.7" + jpeg-js "^0.3.4" + +"@jimp/plugin-blit@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-blit/-/plugin-blit-0.4.0.tgz#a4ac8709a640faea25d41ec1f54e0635f6e59adf" + integrity sha512-UjKv3Crd6F2P7OvIZ/Q/N70x/wiSq5DaWm5Zz/ooKYekz9xDQe7FAVnHuo3fGQJdvALwu613Z67kI78BDEUd4Q== + dependencies: + "@jimp/utils" "^0.4.0" + core-js "^2.5.7" + +"@jimp/plugin-blur@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-blur/-/plugin-blur-0.4.0.tgz#a869910080a2a43ddd7f4c191b4dca93ed36feba" + integrity sha512-ek6LuRhkrPwpOPE+WxGsVPFo2EFrUp7mMlmFDEFZxX+hZ4vmPMAE4rpAbnMYz6K/fUS70wccnb4UKMN35kZY/g== + dependencies: + "@jimp/utils" "^0.4.0" + core-js "^2.5.7" + +"@jimp/plugin-color@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-color/-/plugin-color-0.4.0.tgz#91904918942c0cc038dd62c088936ae9488b51fb" + integrity sha512-C41+M7DWOL2xcGfasxYK+LSQdQiy3ltA8s2aYFI5HzfYER8xJcVBLngbBYwYgrLaf6c3pDn5+9IVqVv6woTeGw== + dependencies: + "@jimp/utils" "^0.4.0" + core-js "^2.5.7" + tinycolor2 "^1.4.1" + +"@jimp/plugin-contain@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-contain/-/plugin-contain-0.4.0.tgz#f1db0d955e021cbb065bc459ccfb867db3c7ed19" + integrity sha512-etjptNMr/IwP641QGRYaU01MqF8UE7Cd/OC5XmhXRgUWbDLH9c9r48pk05k3ZGh2mLX83bXK/8tBlkXd+R7h9w== + dependencies: + "@jimp/utils" "^0.4.0" + core-js "^2.5.7" + +"@jimp/plugin-cover@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-cover/-/plugin-cover-0.4.0.tgz#80db9bd7616351cc22d9b8dc34cb2825662dc6df" + integrity sha512-MpHUlJqzRJCTuaPYr5o+afn3DtD/yV9z1sTceOfyH51CQQ07w2yCVIzOlevUhsIIjHzFV/pyZ3y2QFKBueY1ew== + dependencies: + "@jimp/utils" "^0.4.0" + core-js "^2.5.7" + +"@jimp/plugin-crop@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-crop/-/plugin-crop-0.4.0.tgz#fe636da06d35d0d95e5bcc47fcc3af3a9baa185a" + integrity sha512-120k1tcalhchkLRcauGhWuNWskPHPUD1xND/CMghHeL4HBTi6ybsppzPN7nQkaYYyhfuygRbkQIiqHYQHT5AyA== + dependencies: + "@jimp/utils" "^0.4.0" + core-js "^2.5.7" + +"@jimp/plugin-displace@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-displace/-/plugin-displace-0.4.0.tgz#f6a07cc786f034930987477db8b2aa1eacfb4f3d" + integrity sha512-yJHOG2jZ/NZee2XPLy94wmHn5hLNND2Di7DxlWXMiwIhTcgrtbg8sI+uszp4iP25xbPt1T7oXFJOtszr+Juyaw== + dependencies: + "@jimp/utils" "^0.4.0" + core-js "^2.5.7" + +"@jimp/plugin-dither@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-dither/-/plugin-dither-0.4.0.tgz#92114cb4e0bd7a8cac8e2eb4e33e81e3c196be16" + integrity sha512-YkruLTDpIQuF/a78ejrRCEtdMFwJxZ0NxqcX2JBpenOwZOnhOSkgYZMkU0K2+ezbCdrPPuWhDDDVsqzc5BYBEQ== + dependencies: + "@jimp/utils" "^0.4.0" + core-js "^2.5.7" + +"@jimp/plugin-flip@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-flip/-/plugin-flip-0.4.0.tgz#314cb6e89f8b778843d7c50d4114576ca81587a2" + integrity sha512-pE2Jo6b/lCC2Te9gapM2qVBk6L/qALwT2UKS7LE3G7juMIetJenm2dqkIX+ukuyjQolxh2DB4KoSFMMFQR+gHw== + dependencies: + "@jimp/utils" "^0.4.0" + core-js "^2.5.7" + +"@jimp/plugin-gaussian@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.4.0.tgz#5b31cb253367342811d91bb7db2c7fd31fb37198" + integrity sha512-6KGX6N6nxXsD/KbjazPRcwR0SQP80qUUEWUFXq95D7hCuYSGpvSDga9VgEpYsJ8V6lt8sQzzSt7ZKbTm5wklPA== + dependencies: + "@jimp/utils" "^0.4.0" + core-js "^2.5.7" + +"@jimp/plugin-invert@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-invert/-/plugin-invert-0.4.0.tgz#b490b6c758394cfd73555837968db2d94e41afa8" + integrity sha512-X9Zm+uZP6wEpWrnCkLkgbFTDsQAafTByIy7OR0ooKV92hz84jLx96psgFmZAG7OOA8Z1U0AjlV/YLZF8Ydjj9Q== + dependencies: + "@jimp/utils" "^0.4.0" + core-js "^2.5.7" + +"@jimp/plugin-mask@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-mask/-/plugin-mask-0.4.0.tgz#22323b24ce6dadaadfe8c07958d349a5eac27f46" + integrity sha512-D/qA3zVILYlnHsa0DuZYuNmsDWZEbQkNwCQHEGzv836ExO0KVz4wUTn4KmAqJccoKaGLyor3EHms5qAv4TVvRQ== + dependencies: + "@jimp/utils" "^0.4.0" + core-js "^2.5.7" + +"@jimp/plugin-normalize@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-normalize/-/plugin-normalize-0.4.0.tgz#84370b3dd65181b95c25d5e0388aa9dd9abffff7" + integrity sha512-t/XPehq5JNsATBgTh66sHlaVLL8+eYarZeXiVAXNsmrql924byyURoS1k9p1qRlYNYZEMM3d0wxBQerWFfPtsg== + dependencies: + "@jimp/utils" "^0.4.0" + core-js "^2.5.7" + +"@jimp/plugin-print@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-print/-/plugin-print-0.4.0.tgz#a1c2bd77e425a9a676c20cb6c202cd42d4a1ec64" + integrity sha512-6e1rmR2zACUSFwmS74ERrZGz/NI5Jp75LLy/7V6vARCxa1JcvWgu6qdTIDC4lPRQp7yty+PU4pcLX/E/mxkVYw== + dependencies: + "@jimp/utils" "^0.4.0" + core-js "^2.5.7" + load-bmfont "^1.4.0" + +"@jimp/plugin-resize@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-resize/-/plugin-resize-0.4.0.tgz#755fc8404928ae2f7598786b25b79caa17402496" + integrity sha512-mHe8xo2t6b7Jb1GCItc+475pjS6t5N+5NI3Si8M8Dj0oPxdA3b08qRdVWgcNDq4v0CjW9+ueN7i5NLm/IksbRw== + dependencies: + "@jimp/utils" "^0.4.0" + core-js "^2.5.7" + +"@jimp/plugin-rotate@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-rotate/-/plugin-rotate-0.4.0.tgz#27faa1aef76767464d15f5501a549b604f8c4ccb" + integrity sha512-GUOxQB8X+K9hNfwi/7DeVIsRzkNyeHXH9SHWl4aI3AUVIt/09HmQfE/UTmNKCTToT36k7urtCxUKzppRc2SV0A== + dependencies: + "@jimp/utils" "^0.4.0" + core-js "^2.5.7" + +"@jimp/plugin-scale@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-scale/-/plugin-scale-0.4.0.tgz#0bbaf2ff305a43669d1bace61396657438ada818" + integrity sha512-f5BAB0W0q/EGfU/yJee79MFNbZLBrxrNrijWF3Jo9/BARw4r/ZJBbTrSG3sderFBS2Lvu3BuC5NbBCXvG3U9LQ== + dependencies: + "@jimp/utils" "^0.4.0" + core-js "^2.5.7" + +"@jimp/plugins@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/plugins/-/plugins-0.4.0.tgz#a0c155b8b800fd8841ccadb73d701c84b2969d2f" + integrity sha512-VFY0a+tKTFVrAg87q7MmXZ213An5mab5RMQmXU0UL5pQrE0XyyqODjuwgeuoATem9OeHzUYi1LxLLRihRPqZgA== + dependencies: + "@jimp/plugin-blit" "^0.4.0" + "@jimp/plugin-blur" "^0.4.0" + "@jimp/plugin-color" "^0.4.0" + "@jimp/plugin-contain" "^0.4.0" + "@jimp/plugin-cover" "^0.4.0" + "@jimp/plugin-crop" "^0.4.0" + "@jimp/plugin-displace" "^0.4.0" + "@jimp/plugin-dither" "^0.4.0" + "@jimp/plugin-flip" "^0.4.0" + "@jimp/plugin-gaussian" "^0.4.0" + "@jimp/plugin-invert" "^0.4.0" + "@jimp/plugin-mask" "^0.4.0" + "@jimp/plugin-normalize" "^0.4.0" + "@jimp/plugin-print" "^0.4.0" + "@jimp/plugin-resize" "^0.4.0" + "@jimp/plugin-rotate" "^0.4.0" + "@jimp/plugin-scale" "^0.4.0" + core-js "^2.5.7" + timm "^1.6.1" + +"@jimp/png@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/png/-/png-0.4.0.tgz#11cd89fb842d76ba6b6aa97466118baf52aceb62" + integrity sha512-B1WHwYYh6gz39PhEeoe+/L093BmjHsB3igiCicvWP1BMGteT4B1IC6bmrbDSAWpFqS/HiRnv0yxwG6UsJN51CQ== + dependencies: + "@jimp/utils" "^0.4.0" + core-js "^2.5.7" + pngjs "^3.3.3" + +"@jimp/tiff@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/tiff/-/tiff-0.4.0.tgz#aa1f34f608437ca7378c4cf71a55932ef6f37fc4" + integrity sha512-9ybdOkoiXBpSl/VEze7E9eXl+ye9xRfvACRBfbCXoDbYKj6yt9Gzwp1eaIVmiTJ3OaLsWFCYhUlPPZ8zfb7Ogw== + dependencies: + core-js "^2.5.7" + utif "^2.0.1" + +"@jimp/types@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/types/-/types-0.4.0.tgz#246bd4727fd81474ff51fc87a1bbf0ab6add9a74" + integrity sha512-U8lhyCP93x1DntZVn94hWc4NHwqQlvg1/8fFSGqyUiZ6mbmqB5pS2EYJT8g8sDkCrp3abOnCHCGmAAsaFDFlBw== + dependencies: + "@jimp/bmp" "^0.4.0" + "@jimp/gif" "^0.4.0" + "@jimp/jpeg" "^0.4.0" + "@jimp/png" "^0.4.0" + "@jimp/tiff" "^0.4.0" + core-js "^2.5.7" + timm "^1.6.1" + +"@jimp/utils@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@jimp/utils/-/utils-0.4.0.tgz#e54d04d883231c993d3d27f33701dd09d32fc3b9" + integrity sha512-0/cRubStqlPL/n8OLrYhVJ5joSdXTEbPPyxvUOFzTPeUcEHmB+EdqNcCc4I6Lk3g6A5SKfW1GK/uIgpKXFwiWA== + dependencies: + core-js "^2.5.7" + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -803,6 +1075,16 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== +"@types/minimatch@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@*": + version "11.9.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.9.5.tgz#011eece9d3f839a806b63973e228f85967b79ed3" + integrity sha512-vVjM0SVzgaOUpflq4GYBvCpozes8OgIIS5gVXVka+OfK3hvnkC1i93U8WiY2OtNE4XUWyyy/86Kf6e0IHTQw1Q== + "@types/node@^9.6.0": version "9.6.41" resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.41.tgz#e57c3152eb2e7ec748c733cebd0c095b437c5d37" @@ -1178,6 +1460,11 @@ ansicolors@~0.2.1: resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" integrity sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8= +any-base@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe" + integrity sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg== + any-promise@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" @@ -1402,7 +1689,7 @@ async-promise-queue@^1.0.3, async-promise-queue@^1.0.4: async "^2.4.1" debug "^2.6.8" -async@^1.5.0, async@^1.5.2: +async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= @@ -1695,7 +1982,7 @@ babel-plugin-debug-macros@^0.3.0: dependencies: semver "^5.3.0" -babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-polyfill@^2.7.0: +babel-plugin-ember-modules-api-polyfill@^2.5.0, babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-polyfill@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.7.0.tgz#dcd6a9999da0d47d8c9185362bda6244ca525f4a" integrity sha512-+QXPqmRngp13d7nKWrBcL6iIixpuyMNq107XV1dKvsvAO5BGFQ0mSk7Dl6/OgG+z2F1KquxkFfdXYBwbREQI6A== @@ -2217,7 +2504,7 @@ block-stream@*: dependencies: inherits "~2.0.0" -bluebird@^3.1.1, bluebird@^3.3.5, bluebird@^3.4.6: +bluebird@^3.1.1, bluebird@^3.4.6: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== @@ -2237,6 +2524,11 @@ bmp-js@0.0.3: resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.0.3.tgz#64113e9c7cf1202b376ed607bf30626ebe57b18a" integrity sha1-ZBE+nHzxICs3btYHvzBibr5XsYo= +bmp-js@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233" + integrity sha1-4Fpj95amwf8l9Hcex62twUjAcjM= + bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" @@ -2422,6 +2714,23 @@ broccoli-babel-transpiler@^6.5.0: rsvp "^4.8.2" workerpool "^2.3.0" +broccoli-babel-transpiler@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.2.0.tgz#5c0d694c4055106abb385e2d3d88936d35b7cb18" + integrity sha512-lkP9dNFfK810CRHHWsNl9rjyYqcXH3qg0kArnA6tV9Owx3nlZm3Eyr0cGo6sMUQCNLH+2oKrRjOdUGSc6Um6Cw== + dependencies: + "@babel/core" "^7.3.3" + "@babel/polyfill" "^7.0.0" + broccoli-funnel "^2.0.2" + broccoli-merge-trees "^3.0.2" + broccoli-persistent-filter "^2.2.1" + clone "^2.1.2" + hash-for-dep "^1.4.7" + heimdalljs-logger "^0.1.9" + json-stable-stringify "^1.0.1" + rsvp "^4.8.4" + workerpool "^3.1.1" + broccoli-babel-transpiler@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.1.2.tgz#fb5d6f8b9a805627ac3f2914ac9d86e82ca2413b" @@ -2461,19 +2770,7 @@ broccoli-builder@^0.18.14: rsvp "^3.0.17" silent-error "^1.0.1" -broccoli-caching-writer@^2.2.0, broccoli-caching-writer@^2.2.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/broccoli-caching-writer/-/broccoli-caching-writer-2.3.1.tgz#b93cf58f9264f003075868db05774f4e7f25bd07" - integrity sha1-uTz1j5Jk8AMHWGjbBXdPTn8lvQc= - dependencies: - broccoli-kitchen-sink-helpers "^0.2.5" - broccoli-plugin "1.1.0" - debug "^2.1.1" - rimraf "^2.2.8" - rsvp "^3.0.17" - walk-sync "^0.2.5" - -broccoli-caching-writer@^3.0.3: +broccoli-caching-writer@3.0.3, broccoli-caching-writer@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/broccoli-caching-writer/-/broccoli-caching-writer-3.0.3.tgz#0bd2c96a9738d6a6ab590f07ba35c5157d7db476" integrity sha1-C9LJapc41qarWQ8HujXFFX19tHY= @@ -2485,6 +2782,18 @@ broccoli-caching-writer@^3.0.3: rsvp "^3.0.17" walk-sync "^0.3.0" +broccoli-caching-writer@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/broccoli-caching-writer/-/broccoli-caching-writer-2.3.1.tgz#b93cf58f9264f003075868db05774f4e7f25bd07" + integrity sha1-uTz1j5Jk8AMHWGjbBXdPTn8lvQc= + dependencies: + broccoli-kitchen-sink-helpers "^0.2.5" + broccoli-plugin "1.1.0" + debug "^2.1.1" + rimraf "^2.2.8" + rsvp "^3.0.17" + walk-sync "^0.2.5" + broccoli-clean-css@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-clean-css/-/broccoli-clean-css-1.1.0.tgz#9db143d9af7e0ae79c26e3ac5a9bb2d720ea19fa" @@ -2542,15 +2851,16 @@ broccoli-debug@^0.6.1, broccoli-debug@^0.6.4, broccoli-debug@^0.6.5: symlink-or-copy "^1.1.8" tree-sync "^1.2.2" -broccoli-favicon@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/broccoli-favicon/-/broccoli-favicon-1.0.0.tgz#c770a5aa16032fbaf1b5c9c033f71b9cc5a5cb51" - integrity sha1-x3ClqhYDL7rxtcnAM/cbnMWly1E= +broccoli-favicon@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/broccoli-favicon/-/broccoli-favicon-2.0.0.tgz#970c652f36a84cc66139f00a9966a8bd0d9a7250" + integrity sha512-pjMIty6WInNin9jDDCB9X9ng3RWjFXkLcln6kZgGuVYz3m8kXOiqq8G6Gv2Q6oCVgj43FyhFy3/R0WmGwyLocQ== dependencies: - bluebird "^3.3.5" - broccoli-caching-writer "^2.2.1" - favicons "^4.7.1" - lodash "^4.10.0" + broccoli-caching-writer "3.0.3" + favicons "~5.2.0" + heimdalljs-logger "~0.1.10" + himalaya "1.1.0" + lodash.merge "~4.6.1" broccoli-file-creator@^1.1.1: version "1.1.1" @@ -2668,6 +2978,14 @@ broccoli-lint-eslint@^4.2.1: lodash.defaultsdeep "^4.6.0" md5-hex "^2.0.0" +broccoli-merge-trees@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-3.0.1.tgz#545dfe9f695cec43372b3ee7e63c7203713ea554" + integrity sha512-EFPBLbCoyCLdjJx0lxn+acWXK/GAZesXokS4OsF7HuB+WdnV76HVJPdfwp9TaXaUkrtb7eU+ymh9tY9wOGQjMQ== + dependencies: + broccoli-plugin "^1.3.0" + merge-trees "^2.0.0" + broccoli-merge-trees@^1.0.0, broccoli-merge-trees@^1.1.0, broccoli-merge-trees@^1.1.1: version "1.2.4" resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-1.2.4.tgz#a001519bb5067f06589d91afa2942445a2d0fdb5" @@ -2768,6 +3086,25 @@ broccoli-persistent-filter@^2.0.0, broccoli-persistent-filter@^2.1.1: symlink-or-copy "^1.0.1" walk-sync "^0.3.1" +broccoli-persistent-filter@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.2.1.tgz#d2a911ec02ebbbcfb382242c517159cb7a9c10d7" + integrity sha512-07rUlzzhsyrly4Waq/eMK/fhWcN3g0txirzx4EKqQ9pF4w+XXI/oRPibRyHRa5NL6DfNGC54fPFRwMYHjjm5nw== + dependencies: + async-disk-cache "^1.2.1" + async-promise-queue "^1.0.3" + broccoli-plugin "^1.0.0" + fs-tree-diff "^1.0.2" + hash-for-dep "^1.0.2" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + mkdirp "^0.5.1" + promise-map-series "^0.2.1" + rimraf "^2.6.1" + rsvp "^4.7.0" + symlink-or-copy "^1.0.1" + walk-sync "^1.0.0" + broccoli-plugin@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.1.0.tgz#73e2cfa05f8ea1e3fc1420c40c3d9e7dc724bf02" @@ -2788,7 +3125,7 @@ broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli rimraf "^2.3.4" symlink-or-copy "^1.1.8" -broccoli-replace@^0.12.0: +broccoli-replace@0.12.0, broccoli-replace@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/broccoli-replace/-/broccoli-replace-0.12.0.tgz#36460a984c45c61731638c53068b0ab12ea8fdb7" integrity sha1-NkYKmExFxhcxY4xTBosKsS6o/bc= @@ -3183,6 +3520,14 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" +buffer@^5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" + integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -3303,7 +3648,7 @@ camelcase-keys@^2.0.0: camelcase "^2.0.0" map-obj "^1.0.0" -camelcase@^2.0.0, camelcase@^2.0.1: +camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= @@ -3469,16 +3814,17 @@ cheerio@0.22.0, cheerio@^0.22.0: lodash.reject "^4.4.0" lodash.some "^4.4.0" -cheerio@^0.19.0: - version "0.19.0" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.19.0.tgz#772e7015f2ee29965096d71ea4175b75ab354925" - integrity sha1-dy5wFfLuKZZQltcepBdbdas1SSU= +cheerio@^1.0.0-rc.2: + version "1.0.0-rc.2" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db" + integrity sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs= dependencies: - css-select "~1.0.0" + css-select "~1.2.0" dom-serializer "~0.1.0" entities "~1.1.1" - htmlparser2 "~3.8.1" - lodash "^3.2.0" + htmlparser2 "^3.9.1" + lodash "^4.15.0" + parse5 "^3.0.1" chokidar@^2.0.0, chokidar@^2.0.2: version "2.0.4" @@ -3633,7 +3979,7 @@ clipboard@^2.0.0: select "^1.1.2" tiny-emitter "^2.0.0" -cliui@^3.0.3, cliui@^3.2.0: +cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= @@ -3642,6 +3988,11 @@ cliui@^3.0.3, cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" +clone-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" + integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= + clone-response@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" @@ -3649,21 +4000,30 @@ clone-response@1.0.2: dependencies: mimic-response "^1.0.0" -clone-stats@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" - integrity sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE= +clone-stats@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" + integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= -clone@^1.0.0, clone@^1.0.2: +clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= -clone@^2.0.0, clone@^2.1.2: +clone@^2.0.0, clone@^2.1.1, clone@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= +cloneable-readable@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.2.tgz#d591dee4a8f8bc15da43ce97dceeba13d43e2a65" + integrity sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg== + dependencies: + inherits "^2.0.1" + process-nextick-args "^2.0.0" + readable-stream "^2.3.5" + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -3721,6 +4081,11 @@ colors@^1.1.2, colors@~1.1.2: resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= +colors@^1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" + integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== + combined-stream@^1.0.5, combined-stream@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" @@ -4105,16 +4470,6 @@ cson-parser@^1.1.0: dependencies: coffee-script "^1.10.0" -css-select@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.0.0.tgz#b1121ca51848dd264e2244d058cee254deeb44b0" - integrity sha1-sRIcpRhI3SZOIkTQWM7iVN7rRLA= - dependencies: - boolbase "~1.0.0" - css-what "1.0" - domutils "1.4" - nth-check "~1.0.0" - css-select@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" @@ -4125,11 +4480,6 @@ css-select@~1.2.0: domutils "1.5.1" nth-check "~1.0.1" -css-what@1.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-1.0.0.tgz#d7cc2df45180666f99d2b14462639469e00f736c" - integrity sha1-18wt9FGAZm+Z0rFEYmOUaeAPc2w= - css-what@2.1: version "2.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" @@ -4252,13 +4602,6 @@ debug@^4.1.0, debug@~4.1.0: dependencies: ms "^2.1.1" -debug@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" - integrity sha1-+HBX6ZWxofauaklgZkE3vFbwOdo= - dependencies: - ms "0.7.1" - decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -4490,13 +4833,6 @@ domhandler@^2.3.0: dependencies: domelementtype "1" -domutils@1.4: - version "1.4.3" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.4.3.tgz#0865513796c6b306031850e175516baf80b72a6f" - integrity sha1-CGVRN5bGswYDGFDhdVFrr4C3Km8= - dependencies: - domelementtype "1" - domutils@1.5, domutils@1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" @@ -4745,6 +5081,28 @@ ember-cli-autoprefixer@^0.8.1: broccoli-autoprefixer "^5.0.0" lodash "^4.0.0" +ember-cli-babel@7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.1.3.tgz#a2a7374adb525369a3a205cedd54d8e0c3de3309" + integrity sha512-wkftzRiPiLTKAhBKphsJEH8gmJIspq04f03DUvoS2/bqrssF04hhQVRquF4EF0ZiNxKI8f4ka/puVOGeBuRWDg== + dependencies: + "@babel/core" "^7.0.0" + "@babel/plugin-transform-modules-amd" "^7.0.0" + "@babel/polyfill" "^7.0.0" + "@babel/preset-env" "^7.0.0" + amd-name-resolver "1.2.0" + babel-plugin-debug-macros "^0.2.0-beta.6" + babel-plugin-ember-modules-api-polyfill "^2.5.0" + babel-plugin-module-resolver "^3.1.1" + broccoli-babel-transpiler "^7.1.0" + broccoli-debug "^0.6.4" + broccoli-funnel "^2.0.1" + broccoli-source "^1.1.0" + clone "^2.1.2" + ember-cli-version-checker "^2.1.2" + ensure-posix-path "^1.0.2" + semver "^5.5.0" + ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.7.2, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2: version "6.18.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz#3f6435fd275172edeff2b634ee7b29ce74318957" @@ -4921,15 +5279,16 @@ ember-cli-fastboot@^2.0.4: md5-hex "^2.0.0" silent-error "^1.1.0" -ember-cli-favicon@^1.0.0-beta.4: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ember-cli-favicon/-/ember-cli-favicon-1.0.0.tgz#2f6781e939acf33b368841645e076bfd77061c34" - integrity sha512-zPaO/hgpj0WYbwqlfcMDuP5evezSoUrrHOELfGmSe5G9Eo01Eh2k0O2k8lxDM4o6BpVz3Vw/ph0C4G9DfrKm6Q== +ember-cli-favicon@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-favicon/-/ember-cli-favicon-2.0.0.tgz#11f2b72c68dba1906fcff9be7af899c86338f484" + integrity sha512-E8wiIj/+/ptTtA4FMSsKqpld2ptYmV+nbbpVgm1jNq6PF5PsqxZASvugLVhvSLScSZWuGe+UqGTpWDLqnGthag== dependencies: - broccoli-favicon "1.0.0" - broccoli-merge-trees "^2.0.0" - broccoli-replace "^0.12.0" - ember-cli-babel "^6.8.2" + broccoli-favicon "~2.0.0" + broccoli-merge-trees "3.0.1" + broccoli-replace "0.12.0" + ember-cli-babel "7.1.3" + lodash.merge "~4.6.1" ember-cli-get-component-path-option@^1.0.0: version "1.0.0" @@ -5815,6 +6174,11 @@ ensure-posix-path@^1.0.0, ensure-posix-path@^1.0.1, ensure-posix-path@^1.0.2: resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.0.2.tgz#a65b3e42d0b71cfc585eb774f9943c8d9b91b0c2" integrity sha1-pls+QtC3HPxYXrd0+ZQ8jZuRsMI= +ensure-posix-path@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.1.1.tgz#3c62bdb19fa4681544289edb2b382adc029179ce" + integrity sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw== + entities@1.0: version "1.0.0" resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" @@ -6191,7 +6555,7 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -exif-parser@^0.1.9: +exif-parser@^0.1.12, exif-parser@^0.1.9: version "0.1.12" resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922" integrity sha1-WKnS1ywCwfbwKg70qRZicrd2CSI= @@ -6552,29 +6916,27 @@ fastboot@^2.0.1: simple-dom "^1.4.0" source-map-support "^0.5.0" -favicons@^4.7.1: - version "4.8.6" - resolved "https://registry.yarnpkg.com/favicons/-/favicons-4.8.6.tgz#a2b13800ab3fec2715bc8f27fa841d038d4761e2" - integrity sha1-orE4AKs/7CcVvI8n+oQdA41HYeI= +favicons@~5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/favicons/-/favicons-5.2.0.tgz#5032a2dc7fa19c49db735d274a2b2f23b7fa13cd" + integrity sha512-oRrPg1oJXImFpcS+WJCyYMZ0bKT471R9l0zHsLMdsApMvU9+UCMSbVH2/EdY/1ZqJ0mzzbs1j2pL9Oc2KB25zA== dependencies: - async "^1.5.0" - cheerio "^0.19.0" - clone "^1.0.2" - colors "^1.1.2" - harmony-reflect "^1.4.2" - image-size "^0.4.0" - jimp "^0.2.13" - jsontoxml "0.0.11" - merge-defaults "^0.2.1" - mkdirp "^0.5.1" - node-rest-client "^1.5.1" + "@babel/polyfill" "^7.0.0" + cheerio "^1.0.0-rc.2" + clone "^2.1.2" + colors "^1.3.2" + core-js "^2.5.7" + image-size "^0.6.3" + jimp "^0.4.0" + jsontoxml "^1.0.0" + lodash.defaultsdeep "^4.6.0" require-directory "^2.1.1" - svg2png "~3.0.1" - through2 "^2.0.0" - tinycolor2 "^1.1.2" - to-ico "^1.1.2" - underscore "^1.8.3" - vinyl "^1.1.0" + svg2png "^4.1.1" + through2 "^2.0.3" + tinycolor2 "^1.4.1" + to-ico "^1.1.5" + util.promisify "^1.0.0" + vinyl "^2.2.0" faye-websocket@~0.10.0: version "0.10.0" @@ -6622,6 +6984,16 @@ file-type@^3.1.0, file-type@^3.8.0: resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek= +file-type@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-9.0.0.tgz#a68d5ad07f486414dfb2c8866f73161946714a18" + integrity sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw== + +file-url@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/file-url/-/file-url-2.0.2.tgz#e951784d79095127d3713029ab063f40818ca2ae" + integrity sha1-6VF4TXkJUSfTcTApqwY/QIGMoq4= + filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" @@ -7458,11 +7830,6 @@ har-validator@~5.1.0: ajv "^6.5.5" har-schema "^2.0.0" -harmony-reflect@^1.4.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.0.tgz#9c28a77386ec225f7b5d370f9861ba09c4eea58f" - integrity sha512-0kZ1XcoelFOLEjEtvWAZyq/1S55eDSieWEJwme311MNVNcRpvjlr2zA66kBV6WAB8C1XI1p1cXCnFPqd1BxlPg== - has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -7570,6 +7937,17 @@ hash-for-dep@^1.0.2, hash-for-dep@^1.2.3: heimdalljs-logger "^0.1.7" resolve "^1.4.0" +hash-for-dep@^1.4.7: + version "1.4.7" + resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.4.7.tgz#ea6f9d8e2f9e784fc48ca60c40ea886bdb41aa54" + integrity sha512-nz0Ttg6U7vx8Ec4ai4niocpJYD76fm9L1n/d2dIt4lH+s0T+TPgwaxgYkQ3S3R7ZxDyiNedYwRtdzqL29FQyTw== + dependencies: + broccoli-kitchen-sink-helpers "^0.3.1" + heimdalljs "^0.2.3" + heimdalljs-logger "^0.1.7" + path-root "^0.1.1" + resolve "^1.4.0" + hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" @@ -7609,7 +7987,7 @@ heimdalljs-graph@^0.3.4: resolved "https://registry.yarnpkg.com/heimdalljs-graph/-/heimdalljs-graph-0.3.5.tgz#420fbbc8fc3aec5963ddbbf1a5fb47921c4a5927" integrity sha512-szOy9WZUc7eUInEBQEsoa1G2d+oYHrn6ndZPf76eh8A9ID1zWUCEEsxP3F+CvQx9+EDrg1srdyLUmfVAr8EB4g== -heimdalljs-logger@^0.1.7, heimdalljs-logger@^0.1.9: +heimdalljs-logger@^0.1.7, heimdalljs-logger@^0.1.9, heimdalljs-logger@~0.1.10: version "0.1.10" resolved "https://registry.yarnpkg.com/heimdalljs-logger/-/heimdalljs-logger-0.1.10.tgz#90cad58aabb1590a3c7e640ddc6a4cd3a43faaf7" integrity sha512-pO++cJbhIufVI/fmB/u2Yty3KJD0TqNPecehFae0/eps0hkZ3b4Zc/PezUMOpYuHFQbA7FxHZxa305EhmjLj4g== @@ -7636,6 +8014,11 @@ highlight.js@^9.14.2: resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.14.2.tgz#efbfb22dc701406e4da406056ef8c2b70ebe5b26" integrity sha512-Nc6YNECYpxyJABGYJAyw7dBAYbXEuIzwzkqoJnwbc1nIpCiN+3ioYf0XrBnLiyyG0JLuJhpPtt2iTSbXiKLoyA== +himalaya@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/himalaya/-/himalaya-1.1.0.tgz#31724ae9d35714cd7c6f4be94888953f3604606a" + integrity sha512-LLase1dHCRMel68/HZTFft0N0wti0epHr3nNY7ynpLbyZpmrKMQ8YIpiOV77TM97cNpC8Wb2n6f66IRggwdWPw== + hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -7839,16 +8222,16 @@ ignore@^5.0.2: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.0.5.tgz#c663c548d6ce186fb33616a8ccb5d46e56bdbbf9" integrity sha512-kOC8IUb8HSDMVcYrDVezCxpJkzSQWTAzf3olpKM6o9rM5zpojx23O0Fl8Wr4+qJ6ZbPEHqf1fdwev/DS7v7pmA== -image-size@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.4.0.tgz#d4b4e1f61952e4cbc1cea9a6b0c915fecb707510" - integrity sha1-1LTh9hlS5MvBzqmmsMkV/stwdRA= - image-size@^0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= +image-size@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2" + integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -8387,7 +8770,7 @@ isurl@^1.0.0-alpha5: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" -jimp@^0.2.13, jimp@^0.2.21: +jimp@^0.2.21: version "0.2.28" resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.2.28.tgz#dd529a937190f42957a7937d1acc3a7762996ea2" integrity sha1-3VKak3GQ9ClXp5N9Gsw6d2KZbqI= @@ -8409,6 +8792,17 @@ jimp@^0.2.13, jimp@^0.2.21: tinycolor2 "^1.1.2" url-regex "^3.0.0" +jimp@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.4.0.tgz#19c9bb2d104e468a86f81962a99363f6f7b3be47" + integrity sha512-Ed0ouCiOt9QdrYxTKpsal+T+REphlFeG6zpR0cXU3l8pvA/BeAfKTaMQ91e/zGSZHEjbcbRZ2V9zgOYqa8Av6g== + dependencies: + "@babel/polyfill" "^7.0.0" + "@jimp/custom" "^0.4.0" + "@jimp/plugins" "^0.4.0" + "@jimp/types" "^0.4.0" + core-js "^2.5.7" + joi@^12.0.0: version "12.0.0" resolved "https://registry.yarnpkg.com/joi/-/joi-12.0.0.tgz#46f55e68f4d9628f01bbb695902c8b307ad8d33a" @@ -8428,6 +8822,11 @@ jpeg-js@^0.2.0: resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.2.0.tgz#53e448ec9d263e683266467e9442d2c5a2ef5482" integrity sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII= +jpeg-js@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.3.4.tgz#dc2ba501ee3d58b7bb893c5d1fab47294917e7e7" + integrity sha512-6IzjQxvnlT8UlklNmDXIJMWxijULjqGrzgqc0OG7YadZdvm7KPQ1j0ehmQQHckgEWOfgpptzcnWgESovxudpTA== + jquery-deferred@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/jquery-deferred/-/jquery-deferred-0.3.1.tgz#596eca1caaff54f61b110962b23cafea74c35355" @@ -8702,10 +9101,10 @@ jsonify@~0.0.0: resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= -jsontoxml@0.0.11: - version "0.0.11" - resolved "https://registry.yarnpkg.com/jsontoxml/-/jsontoxml-0.0.11.tgz#373ab5b2070be3737a5fb3e32fd1b7b81870caa4" - integrity sha1-Nzq1sgcL43N6X7PjL9G3uBhwyqQ= +jsontoxml@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/jsontoxml/-/jsontoxml-1.0.1.tgz#07fff7f6bfbfa1097d779aec7f041b5046075e70" + integrity sha512-dtKGq0K8EWQBRqcAaePSgKR4Hyjfsz/LkurHSV3Cxk4H+h2fWDeaN2jzABz+ZmOJylgXS7FGeWmbZ6jgYUMdJQ== jsprim@^1.2.2: version "1.4.1" @@ -8852,6 +9251,20 @@ load-bmfont@^1.2.3: xhr "^2.0.1" xtend "^4.0.0" +load-bmfont@^1.3.1, load-bmfont@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.0.tgz#75f17070b14a8c785fe7f5bee2e6fd4f98093b6b" + integrity sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g== + dependencies: + buffer-equal "0.0.1" + mime "^1.3.4" + parse-bmfont-ascii "^1.0.3" + parse-bmfont-binary "^1.0.5" + parse-bmfont-xml "^1.1.4" + phin "^2.9.1" + xhr "^2.0.1" + xtend "^4.0.0" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -9242,7 +9655,7 @@ lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -lodash.merge@^4.3.1, lodash.merge@^4.4.0, lodash.merge@^4.6.0: +lodash.merge@^4.3.1, lodash.merge@^4.4.0, lodash.merge@^4.6.0, lodash.merge@~4.6.1: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== @@ -9352,21 +9765,16 @@ lodash.values@~2.3.0: dependencies: lodash.keys "~2.3.0" -lodash@^3.10.0, lodash@^3.2.0: +lodash@^3.10.0: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= -lodash@^4.0.0, lodash@^4.1.0, lodash@^4.10.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1, lodash@~4.17.10: +lodash@^4.0.0, lodash@^4.1.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1, lodash@~4.17.10: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== -lodash@~2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e" - integrity sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4= - log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" @@ -9545,6 +9953,13 @@ matcher-collection@^1.0.0, matcher-collection@^1.0.4, matcher-collection@^1.0.5: dependencies: minimatch "^3.0.2" +matcher-collection@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.1.2.tgz#1076f506f10ca85897b53d14ef54f90a5c426838" + integrity sha512-YQ/teqaOIIfUHedRam08PB3NK7Mjct6BvzRnJmpGDm8uFXpNr1sbY4yuflI5JcEs6COpYA0FpRQhSDBf1tT95g== + dependencies: + minimatch "^3.0.2" + math-random@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" @@ -9626,13 +10041,6 @@ meow@^3.4.0, meow@^3.7.0: redent "^1.0.0" trim-newlines "^1.0.0" -merge-defaults@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/merge-defaults/-/merge-defaults-0.2.1.tgz#dd42248eb96bb6a51521724321c72ff9583dde80" - integrity sha1-3UIkjrlrtqUVIXJDIccv+Vg93oA= - dependencies: - lodash "~2.4.1" - merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -9951,11 +10359,6 @@ move-concurrently@^1.0.1: rimraf "^2.5.4" run-queue "^1.0.3" -ms@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" - integrity sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg= - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -10170,14 +10573,6 @@ node-releases@^1.1.3: dependencies: semver "^5.3.0" -node-rest-client@^1.5.1: - version "1.8.0" - resolved "https://registry.yarnpkg.com/node-rest-client/-/node-rest-client-1.8.0.tgz#8d3c566b817e27394cb7273783a41caefe3e5955" - integrity sha1-jTxWa4F+JzlMtyc3g6Qcrv4+WVU= - dependencies: - debug "~2.2.0" - xml2js ">=0.2.4" - node-sass@^4.7.2: version "4.9.3" resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.3.tgz#f407cf3d66f78308bb1e346b24fa428703196224" @@ -10299,7 +10694,7 @@ npm-run-path@^2.0.0: gauge "~2.7.3" set-blocking "~2.0.0" -nth-check@~1.0.0, nth-check@~1.0.1: +nth-check@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" integrity sha1-mSms32KPwsQQmN6rgqxYDPFJquQ= @@ -10410,6 +10805,11 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" +omggif@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.9.tgz#dcb7024dacd50c52b4d303f04802c91c057c765f" + integrity sha1-3LcCTazVDFK00wPwSALJHAV8dl8= + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -10586,7 +10986,7 @@ package-json@^4.0.1: registry-url "^3.0.3" semver "^5.1.0" -pako@~1.0.5: +pako@^1.0.5, pako@~1.0.5: version "1.0.8" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.8.tgz#6844890aab9c635af868ad5fecc62e8acbba3ea4" integrity sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA== @@ -10696,6 +11096,13 @@ parse5@^1.5.1: resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" integrity sha1-m387DeMr543CQBsXVzzK8Pb1nZQ= +parse5@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" + integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== + dependencies: + "@types/node" "*" + parseqs@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" @@ -10779,6 +11186,18 @@ path-posix@^1.0.0: resolved "https://registry.yarnpkg.com/path-posix/-/path-posix-1.0.0.tgz#06b26113f56beab042545a23bfa88003ccac260f" integrity sha1-BrJhE/Vr6rBCVFojv6iAA8ysJg8= +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0= + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc= + dependencies: + path-root-regex "^0.1.0" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -10842,7 +11261,7 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -phantomjs-prebuilt@^2.1.10: +phantomjs-prebuilt@^2.1.14: version "2.1.16" resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz#efd212a4a3966d3647684ea8ba788549be2aefef" integrity sha1-79ISpKOWbTZHaE6ouniFSb4q7+8= @@ -10857,6 +11276,11 @@ phantomjs-prebuilt@^2.1.10: request-progress "^2.0.1" which "^1.2.10" +phin@^2.9.1: + version "2.9.3" + resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c" + integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== + pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -10879,7 +11303,7 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pixelmatch@^4.0.0: +pixelmatch@^4.0.0, pixelmatch@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854" integrity sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ= @@ -10910,7 +11334,7 @@ pn@^1.0.0, pn@^1.1.0: resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== -pngjs@^3.0.0, pngjs@^3.2.0: +pngjs@^3.0.0, pngjs@^3.2.0, pngjs@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.3.3.tgz#85173703bde3edac8998757b96e5821d0966a21b" integrity sha512-1n3Z4p3IOxArEs1VRXnZ/RXdfEniAUS9jb68g58FIXMNkPJeZd+Qh4Uq7/e0LVxAQGos1eIUrqrt4FpjdnEd+Q== @@ -11096,16 +11520,16 @@ private@^0.1.6, private@^0.1.8, private@~0.1.5: resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== +process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + 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" integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= -process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== - process-relative-require@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/process-relative-require/-/process-relative-require-1.0.0.tgz#1590dfcf5b8f2983ba53e398446b68240b4cc68a" @@ -11414,7 +11838,7 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.4, readable-stream@^2.1.5, readable-stream@^2.3.3, readable-stream@^2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.4, readable-stream@^2.1.5, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -11664,10 +12088,10 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -replace-ext@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" - integrity sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ= +replace-ext@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= request-progress@^2.0.1: version "2.0.1" @@ -12836,14 +13260,15 @@ supports-color@^6.1.0: dependencies: has-flag "^3.0.0" -svg2png@~3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/svg2png/-/svg2png-3.0.1.tgz#a2644d68b0231ac00af431aa163714ff17106447" - integrity sha1-omRNaLAjGsAK9DGqFjcU/xcQZEc= +svg2png@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/svg2png/-/svg2png-4.1.1.tgz#6b9e0398aa418778b6436e127a2fb7f00d499c28" + integrity sha1-a54DmKpBh3i2Q24Sei+38A1JnCg= dependencies: - phantomjs-prebuilt "^2.1.10" + file-url "^2.0.0" + phantomjs-prebuilt "^2.1.14" pn "^1.0.0" - yargs "^3.31.0" + yargs "^6.5.0" svgo@0.6.6: version "0.6.6" @@ -13065,6 +13490,11 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" +timm@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/timm/-/timm-1.6.1.tgz#5f8aafc932248c76caf2c6af60542a32d3c30701" + integrity sha512-hqDTYi/bWuDxL2i6T3v6nrvkAQ/1Bc060GSkVEQZp02zTSTB4CHSKsOkliequCftQaNRcjRqUZmpGWs5FfhrNg== + tiny-emitter@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.0.2.tgz#82d27468aca5ade8e5fd1e6d22b57dd43ebdfb7c" @@ -13082,7 +13512,7 @@ tiny-lr@^1.1.1: object-assign "^4.1.0" qs "^6.4.0" -tinycolor2@^1.1.2: +tinycolor2@^1.1.2, tinycolor2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8" integrity sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g= @@ -13133,7 +13563,7 @@ to-fast-properties@^2.0.0: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= -to-ico@^1.1.2: +to-ico@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/to-ico/-/to-ico-1.1.5.tgz#1d32da5f2c90922edee6b686d610c54527b5a8d5" integrity sha512-5kIh7m7bkIlqIESEZkL8gAMMzucXKfPe3hX2FoDY5HEAfD9OJU+Qh9b6Enp74w0qRcxVT5ejss66PHKqc3AVkg== @@ -13344,11 +13774,6 @@ underscore@>=1.8.3: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI= -underscore@^1.8.3: - version "1.9.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" - integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== - unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -13527,6 +13952,13 @@ username@^1.0.1: dependencies: meow "^3.4.0" +utif@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/utif/-/utif-2.0.1.tgz#9e1582d9bbd20011a6588548ed3266298e711759" + integrity sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg== + dependencies: + pako "^1.0.5" + util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -13608,14 +14040,17 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -vinyl@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" - integrity sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ= +vinyl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86" + integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg== dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" + clone "^2.1.1" + clone-buffer "^1.0.0" + clone-stats "^1.0.0" + cloneable-readable "^1.0.0" + remove-trailing-separator "^1.0.1" + replace-ext "^1.0.0" vlq@^0.2.2: version "0.2.3" @@ -13669,6 +14104,15 @@ walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2, walk-sync@^0.3.3: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" +walk-sync@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-1.1.3.tgz#3b7b6468f068b5eba2278c931c57db3d39092969" + integrity sha512-23ivbET0Q/389y3EHpiIgxx881AS2mwdXA7iBqUDNSymoTPYb2jWlF3gkuuAP1iLgdNXmiHw/kZ/wZwrELU6Ag== + dependencies: + "@types/minimatch" "^3.0.3" + ensure-posix-path "^1.1.0" + matcher-collection "^1.1.1" + walk-sync@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-1.0.1.tgz#6f38270392e297e5fd7b51eec9241be4242557c8" @@ -13865,11 +14309,6 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2" -window-size@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" - integrity sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY= - wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" @@ -13901,6 +14340,13 @@ workerpool@^2.3.1: dependencies: object-assign "4.1.1" +workerpool@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-3.1.1.tgz#9decea76b73c2f91de1b5bec1019f8a474b3a620" + integrity sha512-VzYD/kM3Gk9L7GR0LtrcyiZA8+h8Fse503aq4WkYwRBXreHTixVEcqKLjiFS6gM0fyaEt0pjSLf1ANGQXM27cg== + dependencies: + object-assign "4.1.1" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -13979,7 +14425,7 @@ xml-parse-from-string@^1.0.0: resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28" integrity sha1-qQKekp09vN7RafPG4oI42VpdWig= -xml2js@>=0.2.4, xml2js@^0.4.5: +xml2js@^0.4.5: version "0.4.19" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== @@ -14012,7 +14458,7 @@ xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= -y18n@^3.2.0, y18n@^3.2.1: +y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= @@ -14040,6 +14486,13 @@ yam@^0.0.24: fs-extra "^4.0.2" lodash.merge "^4.6.0" +yargs-parser@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" + integrity sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw= + dependencies: + camelcase "^3.0.0" + yargs-parser@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" @@ -14047,18 +14500,24 @@ yargs-parser@^5.0.0: dependencies: camelcase "^3.0.0" -yargs@^3.31.0: - version "3.32.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" - integrity sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU= +yargs@^6.5.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" + integrity sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg= dependencies: - camelcase "^2.0.1" - cliui "^3.0.3" + camelcase "^3.0.0" + cliui "^3.2.0" decamelize "^1.1.1" + get-caller-file "^1.0.1" os-locale "^1.4.0" - string-width "^1.0.1" - window-size "^0.1.4" - y18n "^3.2.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^4.2.0" yargs@^7.0.0: version "7.1.0" From d8c1e8b7781fa4adad557701068276bc74965fe0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 28 Feb 2019 13:10:32 -0500 Subject: [PATCH 344/879] build(deps): bump chalk from 1.1.3 to 2.4.2 (#1542) Bumps [chalk](https://github.com/chalk/chalk) from 1.1.3 to 2.4.2. - [Release notes](https://github.com/chalk/chalk/releases) - [Commits](https://github.com/chalk/chalk/compare/v1.1.3...v2.4.2) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 9 +-------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index e343eaac2..eadc73197 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "broccoli-merge-trees": "^3.0.2", "broccoli-stew": "^2.0.1", "broccoli-string-replace": "^0.1.2", - "chalk": "^1.1.1", + "chalk": "^2.4.2", "ember-auto-import": "^1.2.19", "ember-cli-babel": "^7.5.0", "ember-cli-node-assets": "^0.2.2", diff --git a/yarn.lock b/yarn.lock index 28100babf..64aec7074 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1441,14 +1441,7 @@ ansi-styles@^2.2.1: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= -ansi-styles@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" - integrity sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^3.2.1: +ansi-styles@^3.0.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== From fea6571a07e07d4e9615d5a0e3d053f675a068a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 1 Mar 2019 10:20:48 +0000 Subject: [PATCH 345/879] build(deps-dev): bump js-yaml from 3.12.1 to 3.12.2 Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 3.12.1 to 3.12.2. - [Release notes](https://github.com/nodeca/js-yaml/releases) - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/3.12.1...3.12.2) Signed-off-by: dependabot[bot] --- yarn.lock | 33 +++++---------------------------- 1 file changed, 5 insertions(+), 28 deletions(-) diff --git a/yarn.lock b/yarn.lock index 64aec7074..d03b33457 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1500,14 +1500,7 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" -argparse@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" - integrity sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY= - dependencies: - sprintf-js "~1.0.2" - -argparse@~1.0.2: +argparse@^1.0.7, argparse@~1.0.2: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== @@ -8860,26 +8853,10 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.12.0, js-yaml@^3.12.1: - version "3.12.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.1.tgz#295c8632a18a23e054cf5c9d3cecafe678167600" - integrity sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.9.1: - version "3.10.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" - integrity sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^3.3.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" - integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== +js-yaml@^3.12.0, js-yaml@^3.12.1, js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.3.0, js-yaml@^3.9.1: + version "3.12.2" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.2.tgz#ef1d067c5a9d9cb65bd72f285b5d8105c77f14fc" + integrity sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q== dependencies: argparse "^1.0.7" esprima "^4.0.0" From 3e1aa93c856c7ddd1e7567bb0d83316696a1d180 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 1 Mar 2019 10:21:03 +0000 Subject: [PATCH 346/879] build(deps-dev): bump ember-composable-helpers from 2.1.0 to 2.2.0 Bumps [ember-composable-helpers](https://github.com/DockYard/ember-composable-helpers) from 2.1.0 to 2.2.0. - [Release notes](https://github.com/DockYard/ember-composable-helpers/releases) - [Commits](https://github.com/DockYard/ember-composable-helpers/compare/v2.1.0...v2.2.0) Signed-off-by: dependabot[bot] --- yarn.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index 64aec7074..50cc088a4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5698,12 +5698,12 @@ ember-component-css@^0.6.7: walk-sync "^1.0.1" ember-composable-helpers@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-2.1.0.tgz#71f75ab2de1c696d21939b5f9dcc62eaf2c947e5" - integrity sha512-H6KCyB/BzjR18MxQFcQQR5MDRmawCmCCZKHQTEpAwhs5wCDhnMMLUGINan+sY4NRPrStfpUlMoGg9fsksN2wJA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-2.2.0.tgz#a03984eaddf65ee08cb9ff554a24b0d671651af3" + integrity sha512-VWFYfxPLkgmEoL5aplh8dEwzAhmERfPzIGZeb+O7PhT0of5SYtJeOJFbIIXV2NkVHcDothwUu3IEALsWBsES8A== dependencies: broccoli-funnel "^1.0.1" - ember-cli-babel "^6.6.0" + ember-cli-babel "^7.1.0" ember-concurrency@^0.8.21: version "0.8.22" From e3ccd79aaf88c58b2d3dbe67cd49bf90b527e8d1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 1 Mar 2019 10:21:37 +0000 Subject: [PATCH 347/879] build(deps-dev): bump jsdom from 13.1.0 to 13.2.0 Bumps [jsdom](https://github.com/jsdom/jsdom) from 13.1.0 to 13.2.0. - [Release notes](https://github.com/jsdom/jsdom/releases) - [Changelog](https://github.com/jsdom/jsdom/blob/master/Changelog.md) - [Commits](https://github.com/jsdom/jsdom/compare/13.1.0...13.2.0) Signed-off-by: dependabot[bot] --- yarn.lock | 90 +++++++++++++++++-------------------------------------- 1 file changed, 27 insertions(+), 63 deletions(-) diff --git a/yarn.lock b/yarn.lock index 64aec7074..b52a2f356 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1253,7 +1253,7 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" integrity sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g== -abab@^1.0.0, abab@^1.0.4: +abab@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" integrity sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4= @@ -1333,16 +1333,11 @@ acorn@^3.0.4: resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= -acorn@^5.0.0, acorn@^5.2.1, acorn@^5.5.3, acorn@^5.6.2: +acorn@^5.0.0, acorn@^5.2.1, acorn@^5.4.0, acorn@^5.5.3, acorn@^5.6.2: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== -acorn@^5.4.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.4.1.tgz#fdc58d9d17f4a4e98d102ded826a9b9759125102" - integrity sha512-XLmq3H/BVvW6/GbxKryGxWORz1ebilSsUDlyC27bXhWGWAZWkGwS6FLHjOlwFXNFoWFQEO/Df4u0YYd0K3BQgQ== - acorn@^6.0.1, acorn@^6.0.4: version "6.0.5" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.5.tgz#81730c0815f3f3b34d8efa95cb7430965f4d887a" @@ -4491,12 +4486,7 @@ csso@~2.0.0: clap "^1.0.9" source-map "^0.5.3" -cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": - version "0.3.2" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" - integrity sha1-uANhcMefB6kP8vFuIihAJ6JDhIs= - -"cssom@>= 0.3.0 < 0.4.0", cssom@^0.3.4: +cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0", "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4: version "0.3.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.4.tgz#8cd52e8a3acfd68d3aed38ee0a640177d2f9d797" integrity sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog== @@ -4544,16 +4534,7 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -data-urls@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f" - integrity sha512-ai40PPQR0Fn1lD2PPie79CibnlMN2AYiDhwFX/rZHVsxbs5kNJSjegqXIprhouGXlRdEnfybva7kqRGnB6mypA== - dependencies: - abab "^1.0.4" - whatwg-mimetype "^2.0.0" - whatwg-url "^6.4.0" - -data-urls@^1.1.0: +data-urls@^1.0.0, data-urls@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== @@ -8930,9 +8911,9 @@ jsdom@^11.12.0: xml-name-validator "^3.0.0" jsdom@^13.1.0: - version "13.1.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-13.1.0.tgz#fa7356f0cc8111d0f1077cb7800d06f22f1d66c7" - integrity sha512-C2Kp0qNuopw0smXFaHeayvharqF3kkcNqlcIlSX71+3XrsOFwkEPLt/9f5JksMmaul2JZYIQuY+WTpqHpQQcLg== + version "13.2.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-13.2.0.tgz#b1a0dbdadc255435262be8ea3723d2dba0d7eb3a" + integrity sha512-cG1NtMWO9hWpqRNRR3dSvEQa8bFI6iLlqU2x4kwX51FQjp0qus8T9aBaAO6iGp3DeBrhdwuKxckknohkmfvsFw== dependencies: abab "^2.0.0" acorn "^6.0.4" @@ -8949,7 +8930,7 @@ jsdom@^13.1.0: pn "^1.1.0" request "^2.88.0" request-promise-native "^1.0.5" - saxes "^3.1.4" + saxes "^3.1.5" symbol-tree "^3.2.2" tough-cookie "^2.5.0" w3c-hr-time "^1.0.1" @@ -10709,12 +10690,7 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" integrity sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ== -nwsapi@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.7.tgz#6fc54c254621f10cac5225b76e81c74120139b78" - integrity sha512-VZXniaaaORAXGCNsvUNefsKRQYk8zCzQZ57jalgrpHcU70OrAzKAiN/3plYtH/VPRmZeYyUzQiYfKzcMXC1g5Q== - -nwsapi@^2.0.9: +nwsapi@^2.0.7, nwsapi@^2.0.9: version "2.0.9" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.9.tgz#77ac0cdfdcad52b6a1151a84e73254edc33ed016" integrity sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ== @@ -12109,7 +12085,7 @@ request-promise-native@^1.0.5: stealthy-require "^1.1.0" tough-cookie ">=2.3.3" -request@2.87.0, request@^2.81.0, request@^2.87.0: +request@2.87.0: version "2.87.0" resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" integrity sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw== @@ -12135,7 +12111,7 @@ request@2.87.0, request@^2.81.0, request@^2.87.0: tunnel-agent "^0.6.0" uuid "^3.1.0" -request@^2.55.0, request@^2.65.0, request@^2.88.0: +request@^2.55.0, request@^2.65.0, request@^2.81.0, request@^2.87.0, request@^2.88.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== @@ -12522,10 +12498,10 @@ sax@>=0.6.0, sax@^1.1.4, sax@^1.2.4, sax@~1.2.1: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -saxes@^3.1.4: - version "3.1.5" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.5.tgz#ecbba12c7ca99f87f70dbd14a6c57b2b5de8b298" - integrity sha512-2mgiX2VOarcQv8G40WdJ5QJniYdsPr0yGedkd98PqApodsS9DG29qyHl/X65OILm7Bapd1/zUUvTHVZwNLhXvQ== +saxes@^3.1.5: + version "3.1.9" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.9.tgz#c1c197cd54956d88c09f960254b999e192d7058b" + integrity sha512-FZeKhJglhJHk7eWG5YM0z46VHmI3KJpMBAQm3xa9meDvd+wevB5GuBB0wc0exPInZiBBHqi00DbS8AcvCGCFMw== dependencies: xmlchars "^1.3.1" @@ -13613,15 +13589,7 @@ topo@2.x.x: dependencies: hoek "4.x.x" -tough-cookie@>=0.12.0, tough-cookie@>=2.3.3, tough-cookie@^2.2.0, tough-cookie@^2.3.4, tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== - dependencies: - psl "^1.1.24" - punycode "^1.4.1" - -tough-cookie@^2.5.0: +tough-cookie@>=0.12.0, tough-cookie@>=2.3.3, tough-cookie@^2.2.0, tough-cookie@^2.3.4, tough-cookie@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== @@ -13636,6 +13604,14 @@ tough-cookie@~2.3.3: dependencies: punycode "^1.4.1" +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" @@ -14217,14 +14193,7 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== -whatwg-encoding@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" - integrity sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw== - dependencies: - iconv-lite "0.4.19" - -whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== @@ -14236,12 +14205,7 @@ whatwg-fetch@^3.0.0: resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== -whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" - integrity sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew== - -whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== @@ -14253,7 +14217,7 @@ whatwg-url-compat@~0.6.5: dependencies: tr46 "~0.0.1" -whatwg-url@^6.4.0, whatwg-url@^6.4.1: +whatwg-url@^6.4.1: version "6.5.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== From 5f7258ea799399c8b7daa03bd1d983200b893f1c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 1 Mar 2019 11:49:48 -0500 Subject: [PATCH 348/879] build(deps-dev): bump ember-data from 3.7.0 to 3.8.0 (#1543) Bumps [ember-data](https://github.com/emberjs/data) from 3.7.0 to 3.8.0. - [Release notes](https://github.com/emberjs/data/releases) - [Changelog](https://github.com/emberjs/data/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/data/compare/v3.7.0...v3.8.0) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 129 ++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 114 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index eadc73197..a6fbbb2a1 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "ember-cli-template-lint": "^1.0.0-beta.1", "ember-cli-uglify": "^2.1.0", "ember-composable-helpers": "^2.1.0", - "ember-data": "~3.7.0", + "ember-data": "~3.8.0", "ember-disable-prototype-extensions": "^1.1.3", "ember-export-application-global": "^2.0.0", "ember-load-initializers": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index 02e4cd586..3892df1bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -95,6 +95,18 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" +"@babel/helper-create-class-features-plugin@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.3.4.tgz#092711a7a3ad8ea34de3e541644c2ce6af1f6f0c" + integrity sha512-uFpzw6L2omjibjxa8VGZsJUPL5wJH0zzGKpoz0ccBkzIa6C8kWNUbiBmQ0rgOKWlHJ6qzmfa6lTiGchiV8SC+g== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.3.4" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/helper-define-map@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c" @@ -201,6 +213,16 @@ "@babel/traverse" "^7.2.3" "@babel/types" "^7.0.0" +"@babel/helper-replace-supers@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.3.4.tgz#a795208e9b911a6eeb08e5891faacf06e7013e13" + integrity sha512-pvObL9WVf2ADs+ePg0jrqlhHoxRXlOa+SHRHzAXIz2xkYuOHfGl+fKxPMaS4Fq+uje8JQPobnertBBvyrWnQ1A== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.3.4" + "@babel/types" "^7.3.4" + "@babel/helper-simple-access@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" @@ -258,6 +280,14 @@ "@babel/helper-remap-async-to-generator" "^7.1.0" "@babel/plugin-syntax-async-generators" "^7.2.0" +"@babel/plugin-proposal-class-properties@^7.1.0": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.3.4.tgz#410f5173b3dc45939f9ab30ca26684d72901405e" + integrity sha512-lUf8D3HLs4yYlAo8zjuneLvfxN7qfKv1Yzbj5vjqaqMJxgJA3Ipwp4VUJ+OrOdz53Wbww6ahwB8UhB2HQyLotA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.3.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-json-strings@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" @@ -319,6 +349,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-typescript@^7.2.0": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz#a7cc3f66119a9f7ebe2de5383cce193473d65991" + integrity sha512-dGwbSMA1YhVS8+31CnPR7LB4pcbrzcV99wQzby4uAfrkZPYZlQ7ImwdpzLqi6Z6IL02b8IAL379CaMwo0x5Lag== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-arrow-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" @@ -535,6 +572,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-typescript@^7.1.0": + version "7.3.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.3.2.tgz#59a7227163e55738842f043d9e5bd7c040447d96" + integrity sha512-Pvco0x0ZSCnexJnshMfaibQ5hnK8aUHSvjCQhC1JR8eeg+iBwt0AtCO7gWxJ358zZevuf9wPSO5rv+WJcbHPXQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-typescript" "^7.2.0" + "@babel/plugin-transform-unicode-regex@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz#4eb8db16f972f8abb5062c161b8b115546ade08b" @@ -696,6 +741,11 @@ resolved "https://registry.yarnpkg.com/@glimmer/di/-/di-0.2.0.tgz#73bfd4a6ee4148a80bf092e8a5d29bcac9d4ce7e" integrity sha1-c7/Upu5BSKgL8JLopdKbysnUzn4= +"@glimmer/env@^0.1.7": + version "0.1.7" + resolved "https://registry.yarnpkg.com/@glimmer/env/-/env-0.1.7.tgz#fd2d2b55a9029c6b37a6c935e8c8871ae70dfa07" + integrity sha1-/S0rVakCnGs3psk16MiHGucN+gc= + "@glimmer/interfaces@^0.36.5": version "0.36.5" resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.36.5.tgz#b9ef4a6756745dc41927ab01d6c23cdf7ece4158" @@ -1443,6 +1493,13 @@ ansi-styles@^3.0.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +ansi-to-html@^0.6.6: + version "0.6.10" + resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.10.tgz#412114353bac2589a034db7ec5b371b8ba771131" + integrity sha512-znsY3gvsk4CiApWu1yVYF8Nx5Vy0FEe8B0YwyxdbCdErJu5lfKlRHB2twtUjR+dxR4WewTk2OP8XqTmWYnImOg== + dependencies: + entities "^1.1.1" + ansicolors@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" @@ -1975,7 +2032,7 @@ babel-plugin-feature-flags@^0.3.1: resolved "https://registry.yarnpkg.com/babel-plugin-feature-flags/-/babel-plugin-feature-flags-0.3.1.tgz#9c827cf9a4eb9a19f725ccb239e85cab02036fc1" integrity sha1-nIJ8+aTrmhn3JcyyOehcqwIDb8E= -babel-plugin-filter-imports@^2.0.3: +babel-plugin-filter-imports@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-2.0.4.tgz#9209b708ed3b228349c4e6f660358bf02685e803" integrity sha512-Ra4VylqMFsmTJCUeLRJ/OP2ZqO0cCJQK2HKihNTnoKP4f8IhxHKL4EkbmfkwGjXCeDyXd0xQ6UTK8Nd+h9V/SQ== @@ -4562,7 +4619,7 @@ debug@=3.1.0, debug@^3.0.0, debug@^3.1.0, debug@~3.1.0: dependencies: ms "2.0.0" -debug@^4.1.0, debug@~4.1.0: +debug@^4.0.0, debug@^4.1.0, debug@~4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -5048,6 +5105,11 @@ ember-cli-autoprefixer@^0.8.1: broccoli-autoprefixer "^5.0.0" lodash "^4.0.0" +ember-cli-babel-plugin-helpers@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.0.2.tgz#d4bec0f32febc530e621ea8d66d3365727cb5e6c" + integrity sha512-tTWmHiIvadgtu0i+Zlb5Jnue69qO6dtACcddkRhhV+m9NfAr+2XNoTKRSeGL8QyRDhfWeo4rsK9dqPrU4PQ+8g== + ember-cli-babel@7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.1.3.tgz#a2a7374adb525369a3a205cedd54d8e0c3de3309" @@ -5502,6 +5564,24 @@ ember-cli-test-loader@^2.2.0: dependencies: ember-cli-babel "^6.8.1" +ember-cli-typescript@^2.0.0-beta.2: + version "2.0.0-rc.2" + resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-2.0.0-rc.2.tgz#d8253097279ed292c20e739ee72f8fb994dbb6b7" + integrity sha512-u4mhdt/R0ip5s1H93aXtGJ/tnZ/3LsIOhKmaPylvlAVW/HtgPk+j/9sFHT4YmFUKMWPP2gXExtDkYNbz81XWzw== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.1.0" + "@babel/plugin-transform-typescript" "^7.1.0" + ansi-to-html "^0.6.6" + debug "^4.0.0" + ember-cli-babel-plugin-helpers "^1.0.0" + execa "^1.0.0" + fs-extra "^7.0.0" + resolve "^1.5.0" + rsvp "^4.8.1" + semver "^5.5.1" + stagehand "^1.0.0" + walk-sync "^1.0.0" + ember-cli-uglify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-cli-uglify/-/ember-cli-uglify-2.1.0.tgz#4a0641fe4768d7ab7d4807aca9924cc77c544184" @@ -5525,12 +5605,12 @@ ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0, ember-cli-ve resolve "^1.3.3" semver "^5.3.0" -ember-cli-version-checker@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-3.0.1.tgz#2d084d2b261374582c68edb658a7df3a10112749" - integrity sha512-hX2tGrFVt8PyaiWclZr8XFNUPSnA+Ax4bMifDIVVtYY8RQZG8LZf9AGyTj4XImkBBWBtgKyOeQ0ovg3kgos4JA== +ember-cli-version-checker@^3.0.0, ember-cli-version-checker@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-3.1.0.tgz#b18c91f1ed19dfac8b12c42ed40bba9b751f68e2" + integrity sha512-ZYr6fpddV6nbfLKbyH4tJUXeZq+FLZkYBvzhbOn0SVCeEy+Zh/cIyCnccBYg8VzmRuSGU2HgPOiKFdiStDf9WQ== dependencies: - resolve "^1.9.0" + resolve-package-path "^1.0.6" semver "^5.6.0" ember-cli@~3.4.4: @@ -5695,28 +5775,30 @@ ember-copy@^1.0.0: dependencies: ember-cli-babel "^6.6.0" -"ember-data@2.x - 3.x", ember-data@~3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.7.0.tgz#87e3a5f3fde994cd7f0b1c6d53f0c8df2f9c3449" - integrity sha512-d3wJIpIclNArapJ5A+gMjNJdDc/8kv5OD3LE5Zad9EJzzZPyaPj51wYsjG7jETJIG+AhBSmAHS5j4GY7/25W0g== +"ember-data@2.x - 3.x", ember-data@~3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.8.0.tgz#05b4d48ab3d612824862b037c4159ce2578fd688" + integrity sha512-NIM26FN5F/GRWeeAsJo1id5IDtucLZ169mHYB5cdNFlXM0Bx+ELnr322oI+/wQKDnM8LCCVbJBo+e0UE8+dtNQ== dependencies: "@ember/ordered-set" "^2.0.3" + "@glimmer/env" "^0.1.7" babel-plugin-feature-flags "^0.3.1" - babel-plugin-filter-imports "^2.0.3" + babel-plugin-filter-imports "^2.0.4" babel6-plugin-strip-class-callcheck "^6.0.0" babel6-plugin-strip-heimdall "^6.0.1" broccoli-debug "^0.6.5" broccoli-file-creator "^2.1.1" broccoli-funnel "^2.0.1" - broccoli-merge-trees "^3.0.1" + broccoli-merge-trees "^3.0.2" broccoli-rollup "^2.1.1" calculate-cache-key-for-tree "^1.1.0" chalk "^2.4.1" - ember-cli-babel "^7.1.2" + ember-cli-babel "^7.1.4" ember-cli-path-utils "^1.0.0" ember-cli-string-utils "^1.1.0" ember-cli-test-info "^1.0.0" - ember-cli-version-checker "^2.1.2" + ember-cli-typescript "^2.0.0-beta.2" + ember-cli-version-checker "^3.0.1" ember-inflector "^3.0.0" git-repo-info "^2.0.0" heimdalljs "^0.3.0" @@ -12197,6 +12279,14 @@ resolve-from@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= +resolve-package-path@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-1.0.7.tgz#8a0be5165a95bb056580129a422ca89bf4dcae02" + integrity sha512-a9WCtYh41TQVAT/PBF32GdkpoGi9IG8chSHaMkBz6+IdK5C4aPhuWWfS7wuO8nhG+N988xWHdM2teHBhPZ3Ucg== + dependencies: + path-root "^0.1.1" + resolve "^1.10.0" + resolve-path@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7" @@ -12217,7 +12307,7 @@ resolve@1.5.0: dependencies: path-parse "^1.0.5" -resolve@^1.1.3, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.7.1, resolve@^1.8.1, resolve@^1.9.0: +resolve@^1.1.3, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.7.1, resolve@^1.8.1: version "1.10.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== @@ -12971,6 +13061,13 @@ ssri@^6.0.1: dependencies: figgy-pudding "^3.5.1" +stagehand@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stagehand/-/stagehand-1.0.0.tgz#79515e2ad3a02c63f8720c7df9b6077ae14276d9" + integrity sha512-zrXl0QixAtSHFyN1iv04xOBgplbT4HgC8T7g+q8ESZbDNi5uZbMtxLukFVXPJ5Nl7zCYvYcrT3Mj24WYCH93hw== + dependencies: + debug "^4.1.0" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" From 14152173b149d85bc6cea3c5f51e0438ebde4cf1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 4 Mar 2019 10:23:06 +0000 Subject: [PATCH 349/879] build(deps-dev): bump ember-cli-addon-docs from 0.6.4 to 0.6.5 Bumps [ember-cli-addon-docs](https://github.com/ember-learn/ember-cli-addon-docs) from 0.6.4 to 0.6.5. - [Release notes](https://github.com/ember-learn/ember-cli-addon-docs/releases) - [Changelog](https://github.com/ember-learn/ember-cli-addon-docs/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-learn/ember-cli-addon-docs/compare/v0.6.4...v0.6.5) Signed-off-by: dependabot[bot] --- yarn.lock | 122 ++++++++++++------------------------------------------ 1 file changed, 26 insertions(+), 96 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3892df1bd..768aed492 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3086,7 +3086,7 @@ broccoli-node-info@1.1.0, broccoli-node-info@^1.1.0: resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-1.1.0.tgz#3aa2e31e07e5bdb516dd25214f7c45ba1c459412" integrity sha1-OqLjHgflvbUW3SUhT3xFuhxFlBI= -broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.2.0, broccoli-persistent-filter@^1.4.3: +broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.2.0, broccoli-persistent-filter@^1.4.3: version "1.4.6" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.6.tgz#80762d19000880a77da33c34373299c0f6a3e615" integrity sha512-0RejLwoC95kv4kta8KAa+FmECJCK78Qgm8SRDEK7YyU0N9Cx6KpY3UCDy9WELl3mCXLN8TokNxc7/hp3lL4lfw== @@ -3105,26 +3105,7 @@ broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-p symlink-or-copy "^1.0.1" walk-sync "^0.3.1" -broccoli-persistent-filter@^2.0.0, broccoli-persistent-filter@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.1.1.tgz#7bb2b1015baedf5cf58b5b2608495f3d78f81b12" - integrity sha512-2VCbLJqMg/AWJ6WTmv83X13a6DD3BS7Gngc932jrg1snVqsB8LJDyJh+Hd9v1tQ/vMA+4vbWgwk4tDmI/tAZWg== - dependencies: - async-disk-cache "^1.2.1" - async-promise-queue "^1.0.3" - broccoli-plugin "^1.0.0" - fs-tree-diff "^0.5.2" - hash-for-dep "^1.0.2" - heimdalljs "^0.2.1" - heimdalljs-logger "^0.1.7" - mkdirp "^0.5.1" - promise-map-series "^0.2.1" - rimraf "^2.6.1" - rsvp "^4.7.0" - symlink-or-copy "^1.0.1" - walk-sync "^0.3.1" - -broccoli-persistent-filter@^2.2.1: +broccoli-persistent-filter@^2.0.0, broccoli-persistent-filter@^2.1.1, broccoli-persistent-filter@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.2.1.tgz#d2a911ec02ebbbcfb382242c517159cb7a9c10d7" integrity sha512-07rUlzzhsyrly4Waq/eMK/fhWcN3g0txirzx4EKqQ9pF4w+XXI/oRPibRyHRa5NL6DfNGC54fPFRwMYHjjm5nw== @@ -3233,7 +3214,7 @@ broccoli-static-compiler@^0.1.4: broccoli-writer "^0.1.1" mkdirp "^0.3.5" -broccoli-stew@^1.4.2: +broccoli-stew@^1.4.2, broccoli-stew@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-1.6.0.tgz#01f6d92806ed6679ddbe48d405066a0e164dfbef" integrity sha512-sUwCJNnYH4Na690By5xcEMAZqKgquUQnMAEuIiL3Z2k63mSw9Xg+7Ew4wCrFrMmXMcLpWjZDOm6Yqnq268N+ZQ== @@ -3253,26 +3234,6 @@ broccoli-stew@^1.4.2: symlink-or-copy "^1.2.0" walk-sync "^0.3.0" -broccoli-stew@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-1.5.0.tgz#d7af8c18511dce510e49d308a62e5977f461883c" - integrity sha1-16+MGFEdzlEOSdMIpi5Zd/RhiDw= - dependencies: - broccoli-debug "^0.6.1" - broccoli-funnel "^1.0.1" - broccoli-merge-trees "^1.0.0" - broccoli-persistent-filter "^1.1.6" - broccoli-plugin "^1.3.0" - chalk "^1.1.3" - debug "^2.4.0" - ensure-posix-path "^1.0.1" - fs-extra "^2.0.0" - minimatch "^3.0.2" - resolve "^1.1.6" - rsvp "^3.0.16" - symlink-or-copy "^1.1.8" - walk-sync "^0.3.0" - broccoli-stew@^2.0.0, broccoli-stew@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-2.0.1.tgz#d0a507b79bf5fea9ff84032ae837dc48670ab1dc" @@ -4605,7 +4566,7 @@ date-time@^2.1.0: dependencies: time-zone "^1.0.0" -debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.4.0, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -5028,9 +4989,9 @@ ember-cli-addon-docs-esdoc@^0.2.1: walk-sync "^0.3.2" ember-cli-addon-docs@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.4.tgz#96dee16cadea442f21b97ec79dd4fc50694379d7" - integrity sha512-MnGPRe2UnymvEojCY/5y01zr/1Ime9rX/X6sNvt8TYmQa1VkEcKW1/+H3nbjOQ7P7Sx9SVxL6duKWwzY3tYF/A== + version "0.6.5" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.5.tgz#ff7abd9ab800625edebb2233858149cb314c1425" + integrity sha512-0hCInAwNAayYk6ZQVJ14gnQwRELAL0oAvdpBbr+YmuBBWxdZJpcLsby0s8M+9Bjne+yoGZlhZ5hSuJjvUQgDjw== dependencies: "@glimmer/syntax" "^0.36.4" broccoli-bridge "^1.0.0" @@ -5060,7 +5021,7 @@ ember-cli-addon-docs@^0.6.4: ember-fetch-adapter "^0.4.3" ember-href-to "^1.15.1" ember-keyboard "^4.0.0" - ember-modal-dialog "2.4.3" + ember-modal-dialog "3.0.0-beta.3" ember-responsive "^3.0.0-beta.1" ember-router-scroll "^1.0.0" ember-svg-jar "^1.2.2" @@ -5151,7 +5112,7 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.4, ember-cli-babel@^7.5.0: +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.5.0: version "7.5.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.5.0.tgz#af654dcef23630391d2efe85aaa3bdf8b6ca17b7" integrity sha512-wWXqPPQNRxCtEHvYaLBNiIVgCVCy8YqZ0tM8Dpql1D5nGnPDbaK073sS1vlOYBP7xe5Ab2nXhvQkFwUxFacJ2g== @@ -5346,17 +5307,7 @@ ember-cli-htmlbars-inline-precompile@^2.1.0: heimdalljs-logger "^0.1.9" silent-error "^1.1.0" -ember-cli-htmlbars@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.3.tgz#e116e1500dba12f29c94b05b9ec90f52cb8bb042" - integrity sha512-oyWtJebOwxAqWZwMc0NKFJ8FJdxVixM7zl0FaXq1vTAG6bOgnU7yAhXEASlaO5f+PptZueZfOpdpvRwZW/Gk1A== - dependencies: - broccoli-persistent-filter "^1.0.3" - hash-for-dep "^1.0.2" - json-stable-stringify "^1.0.0" - strip-bom "^3.0.0" - -ember-cli-htmlbars@^2.0.2: +ember-cli-htmlbars@^2.0.1, ember-cli-htmlbars@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.4.tgz#0bcda483f14271663c38756e1fd1cb89da6a50cf" integrity sha512-WSGODKKG65M/Q7QcLflmxnJKMA32JqFLyX0a5ghMRDWRqvUVkKWSZDbjJsNsCw/OCeBbPWQLQWq0wtpCnTTjwA== @@ -5884,7 +5835,7 @@ ember-href-to@^1.15.1: ember-cli-babel "^6.8.2" ember-router-service-polyfill "^1.0.2" -ember-ignore-children-helper@^1.0.0: +ember-ignore-children-helper@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/ember-ignore-children-helper/-/ember-ignore-children-helper-1.0.1.tgz#f7c4aa17afb9c5685e1d4dcdb61c7b138ca7cdc3" integrity sha512-AgKkrvd1/hIBWdLn42gITlweVsALUGPYF9fMpQ2IDqp7QnRmtO8ocRbZEmMddPDWY9Xu7W5qO2f35rbD7OSpYw== @@ -5940,16 +5891,16 @@ ember-maybe-import-regenerator@^0.1.5, ember-maybe-import-regenerator@^0.1.6: ember-cli-babel "^6.0.0-beta.4" regenerator-runtime "^0.9.5" -ember-modal-dialog@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/ember-modal-dialog/-/ember-modal-dialog-2.4.3.tgz#8e254185e95dae6ccf46987822a095acf42561b1" - integrity sha1-jiVBheldrmzPRph4IqCVrPQlYbE= +ember-modal-dialog@3.0.0-beta.3: + version "3.0.0-beta.3" + resolved "https://registry.yarnpkg.com/ember-modal-dialog/-/ember-modal-dialog-3.0.0-beta.3.tgz#8ba00c1a228d62d837f63dc7ce964e48f25d1326" + integrity sha512-R9vo3KftPmNJK89rIipKvoTEvTC3tMEtM4Yhy2gyMX3yrFCcNPlnTXTRyTePUtSVxPNq9lNT1n0YWMBT1xoJxg== dependencies: - ember-cli-babel "^6.8.2" - ember-cli-htmlbars "^2.0.1" + ember-cli-babel "^7.1.3" + ember-cli-htmlbars "^3.0.0" ember-cli-version-checker "^2.1.0" - ember-ignore-children-helper "^1.0.0" - ember-wormhole "^0.5.1" + ember-ignore-children-helper "^1.0.1" + ember-wormhole "^0.5.5" ember-moment@^7.8.1: version "7.8.1" @@ -6139,10 +6090,10 @@ ember-weakmap@^3.0.0: debug "^3.1.0" ember-cli-babel "^6.6.0" -ember-wormhole@^0.5.1: - version "0.5.4" - resolved "https://registry.yarnpkg.com/ember-wormhole/-/ember-wormhole-0.5.4.tgz#968e80f093494f4aed266e750afa63919c61383d" - integrity sha1-lo6A8JNJT0rtJm51CvpjkZxhOD0= +ember-wormhole@^0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/ember-wormhole/-/ember-wormhole-0.5.5.tgz#db417ff748cb21e574cd5f233889897bc27096cb" + integrity sha512-z8l3gpoKmRA2BnTwvnYRk4jKVcETKHpddsD6kpS+EJ4EfyugadFS3zUqBmRDuJhFbNP8BVBLXlbbATj+Rk1Kgg== dependencies: ember-cli-babel "^6.10.0" ember-cli-htmlbars "^2.0.1" @@ -7330,14 +7281,6 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz#046c70163cef9aad46b0e4a7fa467fb22d71de35" - integrity sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU= - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - fs-extra@^4.0.0, fs-extra@^4.0.2, fs-extra@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" @@ -8102,12 +8045,7 @@ homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: dependencies: parse-passwd "^1.0.0" -hosted-git-info@^2.1.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" - integrity sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg== - -hosted-git-info@^2.6.0, hosted-git-info@^2.7.1: +hosted-git-info@^2.1.4, hosted-git-info@^2.6.0, hosted-git-info@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== @@ -12417,7 +12355,7 @@ route-recognizer@^0.3.4: resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.4.tgz#39ab1ffbce1c59e6d2bdca416f0932611e4f3ca3" integrity sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g== -rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.3.3, rsvp@^3.5.0: +rsvp@^3.0.14, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.3.3, rsvp@^3.5.0: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== @@ -14147,7 +14085,7 @@ walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2, walk-sync@^0.3.3: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" -walk-sync@^1.0.0: +walk-sync@^1.0.0, walk-sync@^1.0.1: version "1.1.3" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-1.1.3.tgz#3b7b6468f068b5eba2278c931c57db3d39092969" integrity sha512-23ivbET0Q/389y3EHpiIgxx881AS2mwdXA7iBqUDNSymoTPYb2jWlF3gkuuAP1iLgdNXmiHw/kZ/wZwrELU6Ag== @@ -14156,14 +14094,6 @@ walk-sync@^1.0.0: ensure-posix-path "^1.1.0" matcher-collection "^1.1.1" -walk-sync@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-1.0.1.tgz#6f38270392e297e5fd7b51eec9241be4242557c8" - integrity sha512-4Fyvn+KDGOF90ugcpErAMsNEF7r9ogk4SCNHZFkvmP+kr1rMSjpLbq9aYbEnYsL4dvVduLBm95TIz8WmqRAAgg== - dependencies: - ensure-posix-path "^1.0.0" - matcher-collection "^1.0.0" - walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" From 22caa525420d9d55e7ea927309f7c7bd1c9b4c37 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 4 Mar 2019 10:33:39 -0500 Subject: [PATCH 350/879] Add deploy step to Travis --- .travis.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.travis.yml b/.travis.yml index 7edfe3541..28e5f294e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -50,6 +50,12 @@ jobs: - env: EMBER_TRY_SCENARIO=ember-canary - env: EMBER_TRY_SCENARIO=ember-default - env: EMBER_TRY_SCENARIO=ember-default-with-jquery + + - stage: deploy + if: (branch = master OR tag IS present) AND type = push + env: NAME=deploy + script: node_modules/.bin/ember deploy production + - stage: npm release install: skip From d27e58c8269e915e8d1f340731be1ab18e5c4b87 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 4 Mar 2019 15:51:28 -0500 Subject: [PATCH 351/879] Try to get autodeploys working... --- config/deploy.js | 59 +++++++++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/config/deploy.js b/config/deploy.js index 41cc6aa94..941da9562 100644 --- a/config/deploy.js +++ b/config/deploy.js @@ -1,28 +1,31 @@ -/* jshint node: true */ - -module.exports = function(deployTarget) { - var ENV = { - build: {} - // include other plugin configuration that applies to all deploy targets here - }; - - if (deployTarget === 'development') { - ENV.build.environment = 'development'; - // configure other plugins for development deploy target here - } - - if (deployTarget === 'staging') { - ENV.build.environment = 'production'; - // configure other plugins for staging deploy target here - } - - if (deployTarget === 'production') { - ENV.build.environment = 'production'; - // configure other plugins for production deploy target here - } - - // Note: if you need to build some configuration asynchronously, you can return - // a promise that resolves with the ENV object instead of returning the - // ENV object synchronously. - return ENV; -}; +/* eslint-env node */ +'use strict'; + +module.exports = function(deployTarget) { + let ENV = { + build: {}, + git: { + repo: 'git@github.com:samselikoff/ember-cli-mirage.git' + } + }; + + if (deployTarget === 'development') { + ENV.build.environment = 'development'; + // configure other plugins for development deploy target here + } + + if (deployTarget === 'staging') { + ENV.build.environment = 'production'; + // configure other plugins for staging deploy target here + } + + if (deployTarget === 'production') { + ENV.build.environment = 'production'; + // configure other plugins for production deploy target here + } + + // Note: if you need to build some configuration asynchronously, you can return + // a promise that resolves with the ENV object instead of returning the + // ENV object synchronously. + return ENV; +}; From cdc628a1dca2fa9c9de5b861db68b97ab0fb98fc Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 4 Mar 2019 15:57:53 -0500 Subject: [PATCH 352/879] Lolmaus issue 1386 route handler stack trace (#1550) * Pass a stack trace for route handler errors, fixes #1386 * Better logging for errors in request handlers --- addon/assert.js | 26 +- addon/route-handler.js | 9 +- .../route-handlers/function-handler-test.js | 258 ------------------ .../function-handler/basic-test.js | 11 +- 4 files changed, 32 insertions(+), 272 deletions(-) delete mode 100644 tests/integration/route-handlers/function-handler-test.js diff --git a/addon/assert.js b/addon/assert.js index 6bab2e443..8a5e58140 100644 --- a/addon/assert.js +++ b/addon/assert.js @@ -1,3 +1,5 @@ +import Ember from 'ember'; + /* eslint no-console: 0 */ let errorProps = [ 'description', @@ -27,8 +29,12 @@ export default function assert(bool, text) { @hide Copied from ember-metal/error */ -export function MirageError() { - let tmp = Error.apply(this, arguments); +export function MirageError(message, stack) { + let tmp = Error(message); + + if (stack) { + tmp.stack = stack; + } for (let idx = 0; idx < errorProps.length; idx++) { let prop = errorProps[idx]; @@ -45,3 +51,19 @@ export function MirageError() { } MirageError.prototype = Object.create(Error.prototype); + +export const logger = { + errors: [], + + get messages() { + return this.errors; + }, + + error(message) { + if (Ember.testing) { + this.errors.push(message); + } else { + console.error(message); + } + } +}; diff --git a/addon/route-handler.js b/addon/route-handler.js index 91940f334..ba5c2891c 100644 --- a/addon/route-handler.js +++ b/addon/route-handler.js @@ -1,7 +1,5 @@ -import { typeOf } from '@ember/utils'; import { Promise } from 'rsvp'; - -import { MirageError } from 'ember-cli-mirage/assert'; +import { MirageError, logger } from 'ember-cli-mirage/assert'; import Response from './response'; import FunctionHandler from './route-handlers/function'; import ObjectHandler from './route-handlers/object'; @@ -75,10 +73,9 @@ export default class RouteHandler { throw e; } else { - let message = (typeOf(e) === 'string') ? e : e.message; - let error = new MirageError(`Your ${request.method} handler for the url ${request.url} threw an error: ${message}`); + logger.error(`Mirage: Your ${request.method} handler for the url ${request.url} threw an error:\n\n${e.stack || e}`); - result = new Response(500, {}, error.message); + result = new Response(500, {}, e.message || e); } } diff --git a/tests/integration/route-handlers/function-handler-test.js b/tests/integration/route-handlers/function-handler-test.js deleted file mode 100644 index dbfa36a33..000000000 --- a/tests/integration/route-handlers/function-handler-test.js +++ /dev/null @@ -1,258 +0,0 @@ -import { module, test } from 'qunit'; -import { Promise } from 'rsvp'; -import $ from 'jquery'; -const { ajax } = $; - -import { Model, Collection, Serializer } from 'ember-cli-mirage'; -import Server from 'ember-cli-mirage/server'; -import Response from 'ember-cli-mirage/response'; -import FunctionRouteHandler from 'ember-cli-mirage/route-handlers/function'; -import _uniqBy from 'lodash/uniqBy'; -import promiseAjax from '../../helpers/promise-ajax'; - -module('Integration | Route handlers | Function handler', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'development', - models: { - user: Model.extend({ - }) - }, - serializers: { - sparseUser: Serializer.extend({ - attrs: ['id', 'name', 'tall'] - }) - } - }); - this.server.timing = 0; - this.server.logging = false; - - this.functionHandler = new FunctionRouteHandler(this.server.schema, this.server.serializerOrRegistry); - this.schema = this.server.schema; - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('a meaningful error is thrown if a custom route handler throws an error', async function(assert) { - assert.expect(1); - - this.server.get('/users', function() { - throw 'I goofed'; - }); - - try { - await promiseAjax({ - method: 'GET', - url: '/users' - }); - } catch(e) { - assert.equal( - e.xhr.responseText, - 'Mirage: Your GET handler for the url /users threw an error: I goofed' - ); - } - }); - - test('mirage response string is not serialized to string', async function(assert) { - assert.expect(1); - - this.server.get('/users', function() { - return new Response(200, { 'Content-Type': 'text/csv' }, 'firstname,lastname\nbob,dylon'); - }); - - let { data } = await promiseAjax({ method: 'GET', url: '/users' }); - assert.equal(data, 'firstname,lastname\nbob,dylon'); - }); - - test('function can return a promise with non-serializable content', async function(assert) { - assert.expect(1); - - this.server.get('/users', function() { - return new Promise(resolve => { - resolve(new Response(200, { 'Content-Type': 'text/csv' }, 'firstname,lastname\nbob,dylan')); - }); - }); - - let { data } = await promiseAjax({ method: 'GET', url: '/users' }); - assert.equal(data, 'firstname,lastname\nbob,dylan'); - }); - - test('function can return a promise with serializable content', async function(assert) { - assert.expect(1); - - let user = this.schema.users.create({ name: 'Sam' }); - - this.server.get('/users', function(schema) { - return new Promise(resolve => { - resolve(schema.users.all()); - }); - }); - - let { data } = await promiseAjax({ method: 'GET', url: '/users' }); - assert.deepEqual(data, { users: [ { id: user.id, name: 'Sam' } ] }); - }); - - test('function can return a promise with an empty string', async function(assert) { - assert.expect(1); - - this.server.get('/users', function() { - return new Promise(resolve => { - resolve(new Response(200, { 'Content-Type': 'text/csv' }, '')); - }); - }); - - let { data } = await promiseAjax({ method: 'GET', url: '/users' }); - assert.equal(data, ''); - }); - - test('function can customize the reponse code via the 3rd argument', async function(assert) { - assert.expect(1); - this.schema.users.create({ name: 'Sam' }); - - this.server.get('/users/1', schema => { - return schema.users.first(); - }, 304); - - let request = await promiseAjax({ method: 'GET', url: '/users/1' }); - assert.equal(request.xhr.status, 304); - }); - - test('function can return an instance of Response', async function(assert) { - let done = assert.async(); - assert.expect(2); - - this.server.get('/users', schema => { - return new Response(422, { some: 'header' }, { some: 'data' }); - }); - - try { - await ajax({ url: '/users' }); - } catch(request) { - assert.equal(request.status, 422); - assert.deepEqual(request.responseJSON, { some: 'data' }); - } finally { - done(); - } - }); - - test('returning a non-blank response from a custom handler whose default status is 204 changes the status to 200', async function(assert) { - let done = assert.async(); - assert.expect(2); - - this.server.put('/users', () => { - return { some: 'data' }; - }); - - try { - let request = await promiseAjax({ - url: `/users`, - method: 'PUT', - data: JSON.stringify({ request: 'data' }) - }); - - assert.equal(request.xhr.status, 200, 'The status code is 200 instead of 204'); - assert.deepEqual(request.data, { some: 'data' }, 'The response is correct'); - } finally { - done(); - } - }); - - test('#serialize uses the default serializer on a model', async function(assert) { - let done = assert.async(); - this.schema.users.create({ name: 'Sam' }); - - this.server.get('/some-request', function(schema) { - return this.serialize(schema.users.first()); - }); - - let json = await ajax({ url: '/some-request' }); - - assert.deepEqual(json, { - user: { - id: '1', - name: 'Sam' - } - }); - done(); - }); - - test('#serialize uses the default serializer on a collection', async function(assert) { - let done = assert.async(); - this.schema.users.create({ name: 'Sam' }); - - this.server.get('/some-request', function(schema) { - return this.serialize(schema.users.all()); - }); - - let json = await ajax({ url: '/some-request' }); - - assert.deepEqual(json, { - users: [ - { id: '1', name: 'Sam' } - ] - }); - done(); - }); - - test('#serialize takes an optional serializer type', async function(assert) { - let done = assert.async(); - this.schema.users.create({ name: 'Sam', tall: true, evil: false }); - this.schema.users.create({ name: 'Ganondorf', tall: true, evil: true }); - - this.server.get('/some-request', function(schema) { - return this.serialize(schema.users.all(), 'sparse-user'); - }); - - let json = await ajax({ url: '/some-request' }); - - assert.deepEqual(json, { - users: [ - { id: '1', name: 'Sam', tall: true }, - { id: '2', name: 'Ganondorf', tall: true } - ] - }); - done(); - }); - - test('#serialize throws an error when trying to specify a serializer that doesnt exist', function(assert) { - this.schema.users.create({ name: 'Sam' }); - - let users = this.schema.users.all(); - - assert.throws(function() { - this.functionHandler.serialize(users, 'foo-user'); - }, /that serializer doesn't exist/); - }); - - test('#serialize noops on plain JS arrays', function(assert) { - this.server.schema.users.create({ name: 'Sam' }); - this.server.schema.users.create({ name: 'Sam' }); - this.server.schema.users.create({ name: 'Ganondorf' }); - - let users = this.schema.users.all().models; - let uniqueNames = _uniqBy(users, 'name'); - let serializedResponse = this.functionHandler.serialize(uniqueNames); - - assert.deepEqual(serializedResponse, uniqueNames); - }); - - test('#serialize on a Collection takes an optional serializer type', function(assert) { - this.server.schema.users.create({ name: 'Sam', tall: true, evil: false }); - this.server.schema.users.create({ name: 'Sam', tall: true, evil: false }); - this.server.schema.users.create({ name: 'Ganondorf', tall: true, evil: true }); - - let users = this.schema.users.all().models; - let uniqueNames = _uniqBy(users, 'name'); - let collection = new Collection('user', uniqueNames); - let json = this.functionHandler.serialize(collection, 'sparse-user'); - - assert.deepEqual(json, { - users: [ - { id: '1', name: 'Sam', tall: true }, - { id: '3', name: 'Ganondorf', tall: true } - ] - }); - }); -}); diff --git a/tests/integration/route-handlers/function-handler/basic-test.js b/tests/integration/route-handlers/function-handler/basic-test.js index 2612324d7..12c08f813 100644 --- a/tests/integration/route-handlers/function-handler/basic-test.js +++ b/tests/integration/route-handlers/function-handler/basic-test.js @@ -3,6 +3,7 @@ import { Promise } from 'rsvp'; import { Model, ActiveModelSerializer, Response } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; import promiseAjax from '../../../helpers/promise-ajax'; +import { logger } from 'ember-cli-mirage/assert'; module('Integration | Route handlers | Function handler', function(hooks) { hooks.beforeEach(function() { @@ -28,8 +29,6 @@ module('Integration | Route handlers | Function handler', function(hooks) { }); test('a meaningful error is thrown if a custom route handler throws an error', async function(assert) { - assert.expect(1); - this.server.get('/users', function() { throw 'I goofed'; }); @@ -40,10 +39,10 @@ module('Integration | Route handlers | Function handler', function(hooks) { url: '/users' }); } catch(e) { - assert.equal( - e.xhr.responseText, - 'Mirage: Your GET handler for the url /users threw an error: I goofed' - ); + assert.equal(e.xhr.responseText, 'I goofed'); + assert.equal(logger.messages.length, 1); + assert.ok(logger.messages[0].match(`Mirage: Your GET handler for the url /users threw an error:`)); + assert.ok(logger.messages[0].match(`I goofed`)); } }); From c54ba8b893411cf359bc45c7ff50ee23bc8a52aa Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 5 Mar 2019 05:50:17 -0500 Subject: [PATCH 353/879] Sets sudo to true I've been having trouble getting Travis to autodeploy. I have it set up with a private key that was created without a passphrase, but Travis keeps asking for one. Trying sudo: true because that's the setting I see on AddonDocs. (Note: Storefront has sudo: false but has auto deploys working correctly.) --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 28e5f294e..7c3720cc7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ node_js: # so that your addon works for all apps - "8" -sudo: false +sudo: true dist: trusty addons: From ce0ee4dbc895f1698b433b3e209c1c4f788d29c7 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 5 Mar 2019 07:47:45 -0500 Subject: [PATCH 354/879] Makes travis sudo false Not needed - turns out my ssh key was OPENSSH instead of RSA, which was the problem --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7c3720cc7..28e5f294e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ node_js: # so that your addon works for all apps - "8" -sudo: true +sudo: false dist: trusty addons: From d48cd76bf5c4cd0273a9b1d264057129f075f36d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Wed, 6 Mar 2019 05:55:17 -0500 Subject: [PATCH 355/879] build(deps-dev): bump ember-ajax from 4.0.2 to 5.0.0 (#1551) Bumps [ember-ajax](https://github.com/ember-cli/ember-ajax) from 4.0.2 to 5.0.0. - [Release notes](https://github.com/ember-cli/ember-ajax/releases) - [Changelog](https://github.com/ember-cli/ember-ajax/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-ajax/compare/v4.0.2...v5.0.0) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index a6fbbb2a1..9273f8332 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "broccoli-asset-rev": "^3.0.0", "broccoli-test-helper": "^2.0.0", "chai": "^4.1.0", - "ember-ajax": "^4.0.2", + "ember-ajax": "^5.0.0", "ember-cli": "~3.4.4", "ember-cli-addon-docs": "^0.6.4", "ember-cli-addon-docs-esdoc": "^0.2.1", diff --git a/yarn.lock b/yarn.lock index 768aed492..fee768eef 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4911,12 +4911,12 @@ elliptic@^6.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" -ember-ajax@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-4.0.2.tgz#ce86d52c24289657e0a230140b06a52fe453d655" - integrity sha512-YeeeAQizQc5ioCeraxFo30y3W6mmUxmndF0ShI/Wvwfe8IhVw40jL42itaUHbo2CxKsNRZzQ8x3re65dGM0CrA== +ember-ajax@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-5.0.0.tgz#404b17c93194ab37aff86b7b8607d8edab93c9ec" + integrity sha512-Pet0S5VuiO7PDOwyTIF28VHdR7BpugL+jp+6PxNHRQvAq3SkKmVnXN0W06rnOgicH3xX29S46fx7czkKOGB3gA== dependencies: - ember-cli-babel "^6.16.0" + ember-cli-babel "^7.5.0" najax "^1.0.3" ember-app-scheduler@^1.0.1: From aa5ad8874eee6d718da653504feb1c55f09c6c07 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 11 Mar 2019 10:40:51 +0000 Subject: [PATCH 356/879] build(deps-dev): bump ember-cli-addon-docs from 0.6.5 to 0.6.6 Bumps [ember-cli-addon-docs](https://github.com/ember-learn/ember-cli-addon-docs) from 0.6.5 to 0.6.6. - [Release notes](https://github.com/ember-learn/ember-cli-addon-docs/releases) - [Changelog](https://github.com/ember-learn/ember-cli-addon-docs/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-learn/ember-cli-addon-docs/compare/v0.6.5...v0.6.6) Signed-off-by: dependabot[bot] --- yarn.lock | 357 +++++++----------------------------------------------- 1 file changed, 46 insertions(+), 311 deletions(-) diff --git a/yarn.lock b/yarn.lock index fee768eef..9d7548bc6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1421,7 +1421,7 @@ ajv-keywords@^3.1.0: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.3.0.tgz#cb6499da9b83177af8bc1732b2f0a1a1a3aacf8c" integrity sha512-CMzN9S62ZOO4sA/mJZIO4S++ZM7KFWzH3PPWkveLhy4OZ9i1/VatgwWMD46w/XbGCBy7Ye0gCk+Za6mmyfKK7g== -ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: +ajv@^5.2.3, ajv@^5.3.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= @@ -1709,11 +1709,6 @@ async-each@^1.0.0: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" integrity sha1-GdOGodntxufByF04iu28xW0zYC0= -async-foreach@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" - integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= - async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" @@ -1788,11 +1783,6 @@ aws-sign2@~0.7.0: resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= -aws4@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" - integrity sha1-g+9cqGCysy5KDe7e6MdxudtXRx4= - aws4@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" @@ -2535,13 +2525,6 @@ blob@0.0.5: resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= - dependencies: - inherits "~2.0.0" - bluebird@^3.1.1, bluebird@^3.4.6: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" @@ -3024,7 +3007,7 @@ broccoli-merge-trees@3.0.1: broccoli-plugin "^1.3.0" merge-trees "^2.0.0" -broccoli-merge-trees@^1.0.0, broccoli-merge-trees@^1.1.0, broccoli-merge-trees@^1.1.1: +broccoli-merge-trees@^1.0.0, broccoli-merge-trees@^1.1.1: version "1.2.4" resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-1.2.4.tgz#a001519bb5067f06589d91afa2942445a2d0fdb5" integrity sha1-oAFRm7UGfwZYnZGvopQkRaLQ/bU= @@ -3170,15 +3153,14 @@ broccoli-rollup@^2.0.0, broccoli-rollup@^2.1.1: symlink-or-copy "^1.1.8" walk-sync "^0.3.1" -broccoli-sass-source-maps@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/broccoli-sass-source-maps/-/broccoli-sass-source-maps-2.2.0.tgz#1f1a0794136152b096188638b59b42b17a4bdc68" - integrity sha512-X1yTOGQcjQxYebP+hjeAI286x63VZ0WfgFxqHsr4eimgNNL2TPxkJKKgOaDKJ3nE8pszbJWgHrWpEVXuwgsUzw== +broccoli-sass-source-maps@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/broccoli-sass-source-maps/-/broccoli-sass-source-maps-4.0.0.tgz#1ee4c10a810b10955b0502e28f85ab672f5961a2" + integrity sha512-Bjgg0Q626pPwiPU+Sk7jJNjblPEwhceuTzMPw2F5XY+FzdTBMYQKuJYlJ4x2DdsubE95e3rVQeSZ68jA13Nhzg== dependencies: broccoli-caching-writer "^3.0.3" include-path-searcher "^0.1.0" mkdirp "^0.3.5" - node-sass "^4.7.2" object-assign "^2.0.0" rsvp "^3.0.6" @@ -3736,7 +3718,7 @@ chai@^4.1.0: pathval "^1.1.0" type-detect "^4.0.5" -chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.0.0, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= @@ -4085,13 +4067,6 @@ colors@^1.3.2: resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" - integrity sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk= - dependencies: - delayed-stream "~1.0.0" - combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" @@ -4400,14 +4375,6 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-spawn@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" - integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= - dependencies: - lru-cache "^4.0.1" - which "^1.2.9" - cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -4989,9 +4956,9 @@ ember-cli-addon-docs-esdoc@^0.2.1: walk-sync "^0.3.2" ember-cli-addon-docs@^0.6.4: - version "0.6.5" - resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.5.tgz#ff7abd9ab800625edebb2233858149cb314c1425" - integrity sha512-0hCInAwNAayYk6ZQVJ14gnQwRELAL0oAvdpBbr+YmuBBWxdZJpcLsby0s8M+9Bjne+yoGZlhZ5hSuJjvUQgDjw== + version "0.6.6" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.6.tgz#4679296a5f15d701a0f938549874a10116764ce8" + integrity sha512-aU4FM/y2xjlr3C/67lmB8AaWE8svF8FL4yLA8r8WKOnsPMKAGuyVioMdg5fRTU0mjtC6jXUUPWTLGxD94PrSYg== dependencies: "@glimmer/syntax" "^0.36.4" broccoli-bridge "^1.0.0" @@ -5010,7 +4977,7 @@ ember-cli-addon-docs@^0.6.4: ember-cli-clipboard "^0.11.1" ember-cli-htmlbars "^3.0.0" ember-cli-htmlbars-inline-precompile "^1.0.3" - ember-cli-sass "7.1.7" + ember-cli-sass "10.0.0" ember-cli-string-helpers "^1.9.0" ember-cli-tailwind "^0.6.2" ember-code-snippet "^2.4.0" @@ -5044,7 +5011,7 @@ ember-cli-addon-docs@^0.6.4: parse-git-config "^2.0.3" quick-temp "^0.1.8" resolve "^1.8.1" - sass "^1.14.1" + sass "^1.17.0" semver "^5.5.1" striptags "^3.1.1" walk-sync "^0.3.3" @@ -5431,14 +5398,14 @@ ember-cli-release@^0.2.9: semver "^4.3.1" silent-error "^1.0.0" -ember-cli-sass@7.1.7: - version "7.1.7" - resolved "http://registry.npmjs.org/ember-cli-sass/-/ember-cli-sass-7.1.7.tgz#66899134788ec8d2406a45f5346d4db47a2aa012" - integrity sha512-pbqj4/O9WtXQFeFSJkt04yozePl7ksa39veSDIZwPMCAgGnfD0MEXFrn6spprN2YSrFZM0GsUtk/jwYh8x+Qow== +ember-cli-sass@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-sass/-/ember-cli-sass-10.0.0.tgz#700094ebaf348896111756c2644f1e444b05323c" + integrity sha512-gAMh3sHRExk/gOpbJ+OKKLPd8vCT8Bs8UU0cdNwBUOVwQ0UJ3iKyQY6GS1bMMXYtiyK2ieUPsrDGf14LUcC7bw== dependencies: - broccoli-funnel "^1.0.0" - broccoli-merge-trees "^1.1.0" - broccoli-sass-source-maps "^2.1.0" + broccoli-funnel "^2.0.1" + broccoli-merge-trees "^3.0.1" + broccoli-sass-source-maps "^4.0.0" ember-cli-version-checker "^2.1.0" ember-cli-sri@^2.1.1: @@ -6737,7 +6704,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@~3.0.1, extend@~3.0.2: +extend@^3.0.0, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -7203,15 +7170,6 @@ form-data@~0.1.0: combined-stream "~0.0.4" mime "~1.2.11" -form-data@~2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" - integrity sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8= - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" - form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -7386,16 +7344,6 @@ fsevents@^1.2.3: nan "^2.9.2" node-pre-gyp "^0.10.0" -fstream@^1.0.0, fstream@^1.0.2: - version "1.0.11" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" - integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE= - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -7425,13 +7373,6 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -gaze@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" - integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== - dependencies: - globule "^1.0.0" - get-caller-file@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" @@ -7601,18 +7542,7 @@ glob@^5.0.10: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" - integrity sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI= - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.0.0, glob@^7.0.3, glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: +glob@^7.0.3, glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -7703,15 +7633,6 @@ globby@^8.0.1: pify "^3.0.0" slash "^1.0.0" -globule@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" - integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ== - dependencies: - glob "~7.1.1" - lodash "~4.17.10" - minimatch "~3.0.2" - good-listener@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" @@ -7806,14 +7727,6 @@ har-schema@^2.0.0: resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= -har-validator@~5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" - integrity sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0= - dependencies: - ajv "^5.1.0" - har-schema "^2.0.0" - har-validator@~5.1.0: version "5.1.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" @@ -8224,11 +8137,6 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -in-publish@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" - integrity sha1-4g/146KvwmkDILbcVSaCqcf631E= - include-path-searcher@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/include-path-searcher/-/include-path-searcher-0.1.0.tgz#c0cf2ddfa164fb2eae07bc7ca43a7f191cb4d7bd" @@ -8269,7 +8177,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= @@ -8824,7 +8732,7 @@ jquery@^3.3.1: resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" integrity sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg== -js-base64@^2.1.8, js-base64@^2.1.9: +js-base64@^2.1.9: version "2.4.8" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.8.tgz#57a9b130888f956834aa40c5b165ba59c758f033" integrity sha512-hm2nYpDrwoO/OzBhdcqs/XGT6XjSuSSCVEpia+Kl2J6x4CYt5hISlVL/AYU1khoDXv0AQVgxtdJySb9gjAn56Q== @@ -9453,11 +9361,6 @@ lodash.assign@^3.2.0: lodash._createassigner "^3.0.0" lodash.keys "^3.0.0" -lodash.assign@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= - lodash.assignin@^4.0.9, lodash.assignin@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" @@ -9482,7 +9385,7 @@ lodash.castarray@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" integrity sha1-wCUTUV4wna3dTCTGDP3c9ZdtkRU= -lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.4.1, lodash.clonedeep@^4.5.0: +lodash.clonedeep@^4.4.1, lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= @@ -9631,11 +9534,6 @@ lodash.merge@^4.3.1, lodash.merge@^4.4.0, lodash.merge@^4.6.0, lodash.merge@~4.6 resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== -lodash.mergewith@^4.6.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" - integrity sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ== - lodash.noop@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.noop/-/lodash.noop-2.3.0.tgz#3059d628d51bbf937cd2a0b6fc3a7f212a669c2c" @@ -9741,7 +9639,7 @@ lodash@^3.10.0: resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= -lodash@^4.0.0, lodash@^4.1.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1, lodash@~4.17.10: +lodash@^4.0.0, lodash@^4.1.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -9996,7 +9894,7 @@ memory-streams@^0.1.3: dependencies: readable-stream "~1.0.2" -meow@^3.4.0, meow@^3.7.0: +meow@^3.4.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= @@ -10132,7 +10030,7 @@ mime-db@~1.38.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad" integrity sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg== -mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17: +mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16: version "2.1.17" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" integrity sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo= @@ -10200,7 +10098,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -10261,7 +10159,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -10364,11 +10262,6 @@ najax@^1.0.2, najax@^1.0.3: lodash.defaultsdeep "^4.6.0" qs "^6.2.0" -nan@^2.10.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" - integrity sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA== - nan@^2.9.2: version "2.11.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.0.tgz#574e360e4d954ab16966ec102c0c049fd961a099" @@ -10449,24 +10342,6 @@ node-fetch@^2.3.0: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5" integrity sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA== -node-gyp@^3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" - integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== - dependencies: - fstream "^1.0.0" - glob "^7.0.3" - graceful-fs "^4.1.2" - mkdirp "^0.5.0" - nopt "2 || 3" - npmlog "0 || 1 || 2 || 3 || 4" - osenv "0" - request "^2.87.0" - rimraf "2" - semver "~5.3.0" - tar "^2.0.0" - which "1" - node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -10544,37 +10419,12 @@ node-releases@^1.1.3: dependencies: semver "^5.3.0" -node-sass@^4.7.2: - version "4.9.3" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.3.tgz#f407cf3d66f78308bb1e346b24fa428703196224" - integrity sha512-XzXyGjO+84wxyH7fV6IwBOTrEBe2f0a6SBze9QWWYR/cL74AcQUks2AsqcCZenl/Fp/JVbuEaLpgrLtocwBUww== - dependencies: - async-foreach "^0.1.3" - chalk "^1.1.1" - cross-spawn "^3.0.0" - gaze "^1.0.0" - get-stdin "^4.0.1" - glob "^7.0.3" - in-publish "^2.0.0" - lodash.assign "^4.2.0" - lodash.clonedeep "^4.3.2" - lodash.mergewith "^4.6.0" - meow "^3.7.0" - mkdirp "^0.5.1" - nan "^2.10.0" - node-gyp "^3.8.0" - npmlog "^4.0.0" - request "2.87.0" - sass-graph "^2.2.4" - stdout-stream "^1.4.0" - "true-case-path" "^1.0.2" - node-uuid@~1.4.0: version "1.4.8" resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" integrity sha1-sEDrCSOWivq/jTL7HxfxFn/auQc= -"nopt@2 || 3", nopt@^3.0.3, nopt@^3.0.6: +nopt@^3.0.3, nopt@^3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= @@ -10655,7 +10505,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: +npmlog@^4.0.0, npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -10697,11 +10547,6 @@ oauth-sign@~0.3.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.3.0.tgz#cb540f93bb2b22a7d5941691a288d60e8ea9386e" integrity sha1-y1QPk7srIqfVlBaRoojWDo6pOG4= -oauth-sign@~0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM= - oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" @@ -10866,14 +10711,6 @@ os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@0, osenv@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - osenv@^0.1.3, osenv@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" @@ -10882,6 +10719,14 @@ osenv@^0.1.3, osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +osenv@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + p-cancelable@^0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" @@ -11637,7 +11482,7 @@ q@^1.1.2: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qs@6.5.1, qs@^6.4.0, qs@~6.5.1: +qs@6.5.1, qs@^6.4.0: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" integrity sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A== @@ -12082,32 +11927,6 @@ request-promise-native@^1.0.5: stealthy-require "^1.1.0" tough-cookie ">=2.3.3" -request@2.87.0: - version "2.87.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" - integrity sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.6.0" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" - forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" - performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - tough-cookie "~2.3.3" - tunnel-agent "^0.6.0" - uuid "^3.1.0" - request@^2.55.0, request@^2.65.0, request@^2.81.0, request@^2.87.0, request@^2.88.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" @@ -12280,7 +12099,7 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -rimraf@2, rimraf@^2.2.8, rimraf@^2.3.2, rimraf@^2.3.4, rimraf@^2.4.1, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: +rimraf@^2.2.8, rimraf@^2.3.2, rimraf@^2.3.4, rimraf@^2.4.1, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -12481,20 +12300,10 @@ sane@^4.0.0: walker "~1.0.5" watch "~0.18.0" -sass-graph@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" - integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k= - dependencies: - glob "^7.0.0" - lodash "^4.0.0" - scss-tokenizer "^0.2.3" - yargs "^7.0.0" - -sass@^1.14.1: - version "1.15.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.15.1.tgz#25a03f6813413540210580b670628360c36267d3" - integrity sha512-WiDa5BsePB/rQEbh/Fv2pVDUCasxuRYjW7GsWx8Ld23LY61vx1VV5Mzf/7mu5kLWKMryMqo65fzYL34HgaM47w== +sass@^1.17.0: + version "1.17.2" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.17.2.tgz#b5a28f2f13c6a219f28084c03623bb2c8d176323" + integrity sha512-TBNcwSIEXpXAIaFxQnWbHzhciwPKpHRprQ+1ww+g9eHCiY3PINJs6vQTu+LcBt1vIhrtQGRFIoxJO39TfLrptA== dependencies: chokidar "^2.0.0" @@ -12527,14 +12336,6 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -scss-tokenizer@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" - integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= - dependencies: - js-base64 "^2.1.8" - source-map "^0.4.2" - select@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" @@ -12550,11 +12351,6 @@ semver@^4.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= -semver@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= - send@0.16.1: version "0.16.1" resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" @@ -13029,13 +12825,6 @@ statuses@~1.3.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= -stdout-stream@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" - integrity sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s= - dependencies: - readable-stream "^2.0.1" - stealthy-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" @@ -13321,15 +13110,6 @@ tapable@^1.0.0, tapable@^1.1.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e" integrity sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA== -tar@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" - integrity sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE= - dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" - tar@^4: version "4.4.8" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" @@ -13609,13 +13389,6 @@ tough-cookie@>=0.12.0, tough-cookie@>=2.3.3, tough-cookie@^2.2.0, tough-cookie@^ psl "^1.1.28" punycode "^2.1.1" -tough-cookie@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" - integrity sha1-C2GKVWW23qkL80JdBNVe3EdadWE= - dependencies: - punycode "^1.4.1" - tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" @@ -13662,13 +13435,6 @@ trim@0.0.1: resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= -"true-case-path@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz#7ec91130924766c7f573be3020c34f8fdfd00d62" - integrity sha1-fskRMJJHZsf1c74wIMNPj9/QDWI= - dependencies: - glob "^6.0.4" - tslib@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" @@ -13972,11 +13738,6 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" - integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA== - uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" @@ -14249,7 +14010,7 @@ which-module@^1.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= -which@1, which@^1.2.10: +which@^1.2.10: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -14454,13 +14215,6 @@ yargs-parser@^4.2.0: dependencies: camelcase "^3.0.0" -yargs-parser@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" - integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= - dependencies: - camelcase "^3.0.0" - yargs@^6.5.0: version "6.6.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" @@ -14480,25 +14234,6 @@ yargs@^6.5.0: y18n "^3.2.1" yargs-parser "^4.2.0" -yargs@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" - integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= - dependencies: - camelcase "^3.0.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.2" - which-module "^1.0.0" - y18n "^3.2.1" - yargs-parser "^5.0.0" - yauzl@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" From 7d116be1554a1dcadff1204cc538b71ac0582970 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 11 Mar 2019 08:01:29 -0400 Subject: [PATCH 357/879] build(deps-dev): bump ember-source from 3.4.7 to 3.8.0 (#1547) (#1510) Bumps [ember-source](https://github.com/emberjs/ember.js) from 3.4.7 to 3.8.0. - [Release notes](https://github.com/emberjs/ember.js/releases) - [Changelog](https://github.com/emberjs/ember.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember.js/compare/v3.4.7...v3.8.0) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 16 +++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 9273f8332..a489c0f38 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "route-recognizer": "^0.3.4" }, "devDependencies": { - "@ember/jquery": "^0.5.2", + "@ember/jquery": "^0.6.0", "@ember/optional-features": "^0.7.0", "active-model-adapter": "^2.0.3", "babel-eslint": "^9.0.0", diff --git a/yarn.lock b/yarn.lock index 9d7548bc6..c0dfcb464 100644 --- a/yarn.lock +++ b/yarn.lock @@ -684,15 +684,17 @@ lodash "^4.17.11" to-fast-properties "^2.0.0" -"@ember/jquery@^0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@ember/jquery/-/jquery-0.5.2.tgz#fe312c03ada0022fa092d23f7cd7e2eb0374b53a" - integrity sha1-/jEsA62gAi+gktI/fNfi6wN0tTo= +"@ember/jquery@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@ember/jquery/-/jquery-0.6.0.tgz#5fe9d39b15c9d47fe495302b2a6176059a6267cd" + integrity sha512-O81+JslKE7bsV+5wrhXEmBU1Bpte2u9bm6MLIoRYePvWDo50l7llDW1RM38l1KkeSj/s7iXTsviZ4uunhIcKow== dependencies: broccoli-funnel "^2.0.1" - ember-cli-babel "^6.6.0" + broccoli-merge-trees "^3.0.2" + ember-cli-babel "^7.4.0" + ember-cli-version-checker "^3.0.0" jquery "^3.3.1" - resolve "^1.7.1" + resolve "^1.10.0" "@ember/optional-features@^0.7.0": version "0.7.0" @@ -5079,7 +5081,7 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.5.0: +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.4.0, ember-cli-babel@^7.5.0: version "7.5.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.5.0.tgz#af654dcef23630391d2efe85aaa3bdf8b6ca17b7" integrity sha512-wWXqPPQNRxCtEHvYaLBNiIVgCVCy8YqZ0tM8Dpql1D5nGnPDbaK073sS1vlOYBP7xe5Ab2nXhvQkFwUxFacJ2g== From c56919f0c1f31b7ffcfc2b7401162f042503ca0b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 11 Mar 2019 08:01:50 -0400 Subject: [PATCH 358/879] build(deps-dev): bump jsdom from 13.2.0 to 14.0.0 (#1553) Bumps [jsdom](https://github.com/jsdom/jsdom) from 13.2.0 to 14.0.0. - [Release notes](https://github.com/jsdom/jsdom/releases) - [Changelog](https://github.com/jsdom/jsdom/blob/master/Changelog.md) - [Commits](https://github.com/jsdom/jsdom/compare/13.2.0...14.0.0) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index a489c0f38..d6ad97e87 100644 --- a/package.json +++ b/package.json @@ -100,7 +100,7 @@ "faker": "^4.1.0", "fastboot": "^2.0.1", "js-yaml": "^3.12.1", - "jsdom": "^13.1.0", + "jsdom": "^14.0.0", "loader.js": "^4.7.0", "marked": "^0.6.0", "qunit-dom": "^0.8.4" diff --git a/yarn.lock b/yarn.lock index c0dfcb464..39f1a037d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8817,10 +8817,10 @@ jsdom@^11.12.0: ws "^5.2.0" xml-name-validator "^3.0.0" -jsdom@^13.1.0: - version "13.2.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-13.2.0.tgz#b1a0dbdadc255435262be8ea3723d2dba0d7eb3a" - integrity sha512-cG1NtMWO9hWpqRNRR3dSvEQa8bFI6iLlqU2x4kwX51FQjp0qus8T9aBaAO6iGp3DeBrhdwuKxckknohkmfvsFw== +jsdom@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-14.0.0.tgz#c7f1441ebcc57902d08d5fb2f6ba2baf746da7c6" + integrity sha512-/VkyPmdtbwqpJSkwDx3YyJ3U1oawYNB/h5z8vTUZGAzjtu2OHTeFRfnJqyMHsJ5Cyes23trOmvUpM1GfHH1leA== dependencies: abab "^2.0.0" acorn "^6.0.4" From 5979a3931f6b61b3cee7273a12df892b4c0e7d47 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 11 Mar 2019 08:03:06 -0400 Subject: [PATCH 359/879] Keep these focused on test-projects We already test browser in another travis job --- scripts/test.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/test.sh b/scripts/test.sh index eec41819e..b74ba5b33 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -1,7 +1,6 @@ #!/bin/bash ./scripts/parallel --tag < Date: Wed, 13 Mar 2019 10:25:56 +0000 Subject: [PATCH 360/879] build(deps-dev): bump ember-cli-addon-docs from 0.6.6 to 0.6.7 Bumps [ember-cli-addon-docs](https://github.com/ember-learn/ember-cli-addon-docs) from 0.6.6 to 0.6.7. - [Release notes](https://github.com/ember-learn/ember-cli-addon-docs/releases) - [Changelog](https://github.com/ember-learn/ember-cli-addon-docs/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-learn/ember-cli-addon-docs/compare/v0.6.6...v0.6.7) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 39f1a037d..3d30283af 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4958,9 +4958,9 @@ ember-cli-addon-docs-esdoc@^0.2.1: walk-sync "^0.3.2" ember-cli-addon-docs@^0.6.4: - version "0.6.6" - resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.6.tgz#4679296a5f15d701a0f938549874a10116764ce8" - integrity sha512-aU4FM/y2xjlr3C/67lmB8AaWE8svF8FL4yLA8r8WKOnsPMKAGuyVioMdg5fRTU0mjtC6jXUUPWTLGxD94PrSYg== + version "0.6.7" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.7.tgz#26854c9e60cf35c5d6fbe2e849c4450df7ecf03a" + integrity sha512-XpgqZ5Ty3sxDto5hxSowc6rxwxoYsDXE2ny7N8bSVQQ/Uihp4BUjA/ztkIkkfXnU5dqp89S4nBlumJf5NmJQeg== dependencies: "@glimmer/syntax" "^0.36.4" broccoli-bridge "^1.0.0" From 367f93336c853cd2d77f75f374a27fbca85c0110 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 15 Mar 2019 10:24:05 +0000 Subject: [PATCH 361/879] build(deps): bump broccoli-stew from 2.0.1 to 2.1.0 Bumps [broccoli-stew](https://github.com/stefanpenner/broccoli-stew) from 2.0.1 to 2.1.0. - [Release notes](https://github.com/stefanpenner/broccoli-stew/releases) - [Commits](https://github.com/stefanpenner/broccoli-stew/compare/v2.0.1...v2.1.0) Signed-off-by: dependabot[bot] --- yarn.lock | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3d30283af..08372b7c5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3219,9 +3219,9 @@ broccoli-stew@^1.4.2, broccoli-stew@^1.5.0: walk-sync "^0.3.0" broccoli-stew@^2.0.0, broccoli-stew@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-2.0.1.tgz#d0a507b79bf5fea9ff84032ae837dc48670ab1dc" - integrity sha512-EUzgkbYF4m8YVD2bkEa7OfYJ11V3dQ+yPuxdz/nFh8eMEn6dhOujtuSBnOWsvGDgsS9oqNZgx/MHJxI6Rr3AqQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-2.1.0.tgz#ba73add17fda3b9b01d8cfb343a8b613b7136a0a" + integrity sha512-tgCkuTWYl4uf7k7ib2D79KFEj2hCgnTUNPMnrCoAha0/4bywcNccmaZVWtL9Ex37yX5h5eAbnM/ak2ULoMwSSw== dependencies: broccoli-debug "^0.6.5" broccoli-funnel "^2.0.0" @@ -6138,12 +6138,7 @@ enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: memory-fs "^0.4.0" tapable "^1.0.0" -ensure-posix-path@^1.0.0, ensure-posix-path@^1.0.1, ensure-posix-path@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.0.2.tgz#a65b3e42d0b71cfc585eb774f9943c8d9b91b0c2" - integrity sha1-pls+QtC3HPxYXrd0+ZQ8jZuRsMI= - -ensure-posix-path@^1.1.0: +ensure-posix-path@^1.0.0, ensure-posix-path@^1.0.1, ensure-posix-path@^1.0.2, ensure-posix-path@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.1.1.tgz#3c62bdb19fa4681544289edb2b382adc029179ce" integrity sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw== From 65e94ad73a2649becf2fe63fe09c7828552048cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 15 Mar 2019 10:24:40 +0000 Subject: [PATCH 362/879] build(deps): bump ember-cli-babel from 7.5.0 to 7.6.0 Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 7.5.0 to 7.6.0. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v7.5.0...v7.6.0) Signed-off-by: dependabot[bot] --- yarn.lock | 94 ++++++++++--------------------------------------------- 1 file changed, 17 insertions(+), 77 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3d30283af..cde83f88b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,27 +9,7 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@^7.0.0", "@babel/core@^7.1.6": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.2.2.tgz#07adba6dde27bb5ad8d8672f15fde3e08184a687" - integrity sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.2.2" - "@babel/helpers" "^7.2.0" - "@babel/parser" "^7.2.2" - "@babel/template" "^7.2.2" - "@babel/traverse" "^7.2.2" - "@babel/types" "^7.2.2" - convert-source-map "^1.1.0" - debug "^4.1.0" - json5 "^2.1.0" - lodash "^4.17.10" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.3.3": +"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.3.3": version "7.3.4" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.3.4.tgz#921a5a13746c21e32445bf0798680e9d11a6530b" integrity sha512-jRsuseXBo9pN197KnDwhhaaBzyZr2oIcLHHTt2oDdQrej5Qp57dCCJafWx5ivU8/alEYDpssYqv1MUqcxwQlrA== @@ -49,17 +29,6 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.2.2": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.2.2.tgz#18c816c70962640eab42fe8cae5f3947a5c65ccc" - integrity sha512-I4o675J/iS8k+P38dvJ3IBGqObLXyQLTxtrR4u9cSUJOURvafeEWb/pFMOTwtNrmq73mJzyF6ueTbO1BtN0Zeg== - dependencies: - "@babel/types" "^7.2.2" - jsesc "^2.5.1" - lodash "^4.17.10" - source-map "^0.5.0" - trim-right "^1.0.1" - "@babel/generator@^7.3.4": version "7.3.4" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.4.tgz#9aa48c1989257877a9d971296e5b73bfe72e446e" @@ -660,7 +629,7 @@ "@babel/parser" "^7.2.2" "@babel/types" "^7.2.2" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.1.6", "@babel/traverse@^7.2.2", "@babel/traverse@^7.2.3", "@babel/traverse@^7.3.4": +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.1.6", "@babel/traverse@^7.2.3", "@babel/traverse@^7.3.4": version "7.3.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.3.4.tgz#1330aab72234f8dea091b08c4f8b9d05c7119e06" integrity sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ== @@ -2012,12 +1981,12 @@ babel-plugin-debug-macros@^0.3.0: dependencies: semver "^5.3.0" -babel-plugin-ember-modules-api-polyfill@^2.5.0, babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-polyfill@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.7.0.tgz#dcd6a9999da0d47d8c9185362bda6244ca525f4a" - integrity sha512-+QXPqmRngp13d7nKWrBcL6iIixpuyMNq107XV1dKvsvAO5BGFQ0mSk7Dl6/OgG+z2F1KquxkFfdXYBwbREQI6A== +babel-plugin-ember-modules-api-polyfill@^2.5.0, babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-polyfill@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.8.0.tgz#70244800f750bf1c9f380910c1b2eed1db80ab4a" + integrity sha512-3dlBH92qx8so2pRoks73+gwnuX97d0ajirOr96GwTZMnZxFzVR02c/PQbKWBcxpPqoL8CJSE2onuWM8PWezhOQ== dependencies: - ember-rfc176-data "^0.3.7" + ember-rfc176-data "^0.3.8" babel-plugin-feature-flags@^0.3.1: version "0.3.1" @@ -2737,7 +2706,7 @@ broccoli-babel-transpiler@^6.5.0: rsvp "^4.8.2" workerpool "^2.3.0" -broccoli-babel-transpiler@^7.1.0: +broccoli-babel-transpiler@^7.1.0, broccoli-babel-transpiler@^7.1.2: version "7.2.0" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.2.0.tgz#5c0d694c4055106abb385e2d3d88936d35b7cb18" integrity sha512-lkP9dNFfK810CRHHWsNl9rjyYqcXH3qg0kArnA6tV9Owx3nlZm3Eyr0cGo6sMUQCNLH+2oKrRjOdUGSc6Um6Cw== @@ -2754,23 +2723,6 @@ broccoli-babel-transpiler@^7.1.0: rsvp "^4.8.4" workerpool "^3.1.1" -broccoli-babel-transpiler@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.1.2.tgz#fb5d6f8b9a805627ac3f2914ac9d86e82ca2413b" - integrity sha512-rljx86xgZJ2BjWt+xCSVfvyt3ONpCdMMXzMpeeVpAGdBHj3bqQICdPHZDAbzn1vKY/LIPsJZftvdxql1jiLGzw== - dependencies: - "@babel/core" "^7.0.0" - "@babel/polyfill" "^7.0.0" - broccoli-funnel "^2.0.1" - broccoli-merge-trees "^3.0.0" - broccoli-persistent-filter "^1.4.3" - clone "^2.1.2" - hash-for-dep "^1.2.3" - heimdalljs-logger "^0.1.9" - json-stable-stringify "^1.0.1" - rsvp "^4.8.3" - workerpool "^2.3.1" - broccoli-bridge@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/broccoli-bridge/-/broccoli-bridge-1.0.0.tgz#6223fd64b62062c31333539f0f3c42d0acd92fb1" @@ -5082,9 +5034,9 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be semver "^5.5.0" ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.4.0, ember-cli-babel@^7.5.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.5.0.tgz#af654dcef23630391d2efe85aaa3bdf8b6ca17b7" - integrity sha512-wWXqPPQNRxCtEHvYaLBNiIVgCVCy8YqZ0tM8Dpql1D5nGnPDbaK073sS1vlOYBP7xe5Ab2nXhvQkFwUxFacJ2g== + version "7.6.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.6.0.tgz#2e7f1df888fb62eb54d170defce4b6c536e8dfd3" + integrity sha512-2m400ZW9c4EE343g/j1U7beJgjJezTdDCgXM2koHdhpLlZB1Kz7iQw8S+t8gzXGwSGXlf7C7v0RHxP1/bo8frA== dependencies: "@babel/core" "^7.0.0" "@babel/plugin-transform-modules-amd" "^7.0.0" @@ -5094,7 +5046,7 @@ ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cl "@babel/runtime" "^7.2.0" amd-name-resolver "^1.2.1" babel-plugin-debug-macros "^0.3.0" - babel-plugin-ember-modules-api-polyfill "^2.7.0" + babel-plugin-ember-modules-api-polyfill "^2.8.0" babel-plugin-module-resolver "^3.1.1" broccoli-babel-transpiler "^7.1.2" broccoli-debug "^0.6.4" @@ -5918,10 +5870,10 @@ ember-rfc176-data@^0.3.5: resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.6.tgz#7138db8dfccec39c9a832adfbd4c49d670028907" integrity sha512-kPY94VCukPUPj+/6sZ9KvphD42KnpX2IS31p5z07OFVIviDogR0cQuld5c7Irzfgq7a0YACj0HlToROFn7dLYQ== -ember-rfc176-data@^0.3.7: - version "0.3.7" - resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.7.tgz#ecff7d74987d09296d3703343fed934515a4be33" - integrity sha512-AbTlD+q7sfyrD4diZqE7r9Y9/Je+HntVn7TlpHAe+nP5BNXxUXJIfDs5w5e3MxPcMs6Dz/yY90YfW8h1oKEvGg== +ember-rfc176-data@^0.3.8: + version "0.3.8" + resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.8.tgz#d46bbef9a0d57c803217b258cfd2e90d8e191848" + integrity sha512-SQup3iG7SDLZNuf7nMMx5BC5truO8AYKRi80gApeQ07NsbuXV4LH75i5eOaxF0i8l9+H1tzv34kGe6rEh0C1NQ== ember-router-generator@^1.2.3: version "1.2.3" @@ -6138,12 +6090,7 @@ enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: memory-fs "^0.4.0" tapable "^1.0.0" -ensure-posix-path@^1.0.0, ensure-posix-path@^1.0.1, ensure-posix-path@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.0.2.tgz#a65b3e42d0b71cfc585eb774f9943c8d9b91b0c2" - integrity sha1-pls+QtC3HPxYXrd0+ZQ8jZuRsMI= - -ensure-posix-path@^1.1.0: +ensure-posix-path@^1.0.0, ensure-posix-path@^1.0.1, ensure-posix-path@^1.0.2, ensure-posix-path@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.1.1.tgz#3c62bdb19fa4681544289edb2b382adc029179ce" integrity sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw== @@ -14057,13 +14004,6 @@ workerpool@^2.3.0: dependencies: object-assign "4.1.1" -workerpool@^2.3.1: - version "2.3.3" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-2.3.3.tgz#49a70089bd55e890d68cc836a19419451d7c81d7" - integrity sha512-L1ovlYHp6UObYqElXXpbd214GgbEKDED0d3sj7pRdFXjNkb2+un/AUcCkceHizO0IVI6SOGGncrcjozruCkRgA== - dependencies: - object-assign "4.1.1" - workerpool@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-3.1.1.tgz#9decea76b73c2f91de1b5bec1019f8a474b3a620" From 966eacfe108fab544a7114520552d1454bb1252d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Wed, 20 Mar 2019 10:35:48 +0000 Subject: [PATCH 363/879] build(deps-dev): bump eslint-plugin-ember from 6.2.0 to 6.3.0 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 6.2.0 to 6.3.0. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v6.2.0...v6.3.0) Signed-off-by: dependabot[bot] --- yarn.lock | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index c4f0040da..d200c5a7d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5865,11 +5865,6 @@ ember-responsive@^3.0.0-beta.1: dependencies: ember-cli-babel "^6.6.0" -ember-rfc176-data@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.6.tgz#7138db8dfccec39c9a832adfbd4c49d670028907" - integrity sha512-kPY94VCukPUPj+/6sZ9KvphD42KnpX2IS31p5z07OFVIviDogR0cQuld5c7Irzfgq7a0YACj0HlToROFn7dLYQ== - ember-rfc176-data@^0.3.8: version "0.3.8" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.8.tgz#d46bbef9a0d57c803217b258cfd2e90d8e191848" @@ -6219,11 +6214,11 @@ eslint-plugin-ember-suave@^1.0.0: requireindex "~1.1.0" eslint-plugin-ember@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-6.2.0.tgz#658c24be2435da337b597c924a16aa31d69a1a40" - integrity sha512-WKNmTBxvQRr+f1RZ7S+env9BxH18a8uLyqli6Gg6oh5/gl5NChHKe5iGdwv0bC6yUlkocFJkQYheIC25L3npKw== + version "6.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-6.3.0.tgz#92512711deb440dfac62a52a2c15b1f91ee0f23a" + integrity sha512-jXTPtrhEQg41A5u2rwsuh1m9R5e8qTCY04Pi6rXEZ/c3KUSRkYlIKA+GDLR1qy/JcgAR2X8Y8Xvec8imDK6b4A== dependencies: - ember-rfc176-data "^0.3.5" + ember-rfc176-data "^0.3.8" snake-case "^2.1.0" eslint-plugin-es@^1.3.1: From bace44249fe8cccb2da1e9e6671a02d857263d49 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 21 Mar 2019 10:29:19 +0000 Subject: [PATCH 364/879] build(deps-dev): bump js-yaml from 3.12.2 to 3.13.0 Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 3.12.2 to 3.13.0. - [Release notes](https://github.com/nodeca/js-yaml/releases) - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/3.12.2...3.13.0) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index d200c5a7d..1e97d9a5b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8707,9 +8707,9 @@ js-tokens@^4.0.0: integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.12.0, js-yaml@^3.12.1, js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.3.0, js-yaml@^3.9.1: - version "3.12.2" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.2.tgz#ef1d067c5a9d9cb65bd72f285b5d8105c77f14fc" - integrity sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q== + version "3.13.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.0.tgz#38ee7178ac0eea2c97ff6d96fff4b18c7d8cf98e" + integrity sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ== dependencies: argparse "^1.0.7" esprima "^4.0.0" From eb689e3ac6d80b89f8c682c2c963a03d37c86407 Mon Sep 17 00:00:00 2001 From: Nino Annighofer Date: Wed, 27 Mar 2019 23:02:04 +0000 Subject: [PATCH 365/879] Fix internal link to Schema docs (#1559) The current link leads to a "Not found" page. --- tests/dummy/app/pods/docs/advanced/route-handlers/template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dummy/app/pods/docs/advanced/route-handlers/template.md b/tests/dummy/app/pods/docs/advanced/route-handlers/template.md index 8fd8177f7..12f616cf8 100644 --- a/tests/dummy/app/pods/docs/advanced/route-handlers/template.md +++ b/tests/dummy/app/pods/docs/advanced/route-handlers/template.md @@ -109,7 +109,7 @@ this.verb(path, (schema, request) => { }[, responseCode]); ``` -The function handler you define takes two parameters, **schema** (your Mirage server's ORM) and **request** (the Pretender request object). Consult [the schema's API](../schema) for how to interact with your models (or the database directly) and [Pretender's docs](https://github.com/trek/pretender) for more info on the request object. +The function handler you define takes two parameters, **schema** (your Mirage server's ORM) and **request** (the Pretender request object). Consult [the schema's API](/docs/api/modules/ember-cli-mirage/orm/schema~Schema) for how to interact with your models (or the database directly) and [Pretender's docs](https://github.com/trek/pretender) for more info on the request object. If the data returned from your handler is a JavaScript object or array, it will be stringified and sent as the response body of your request: From 100b82773a74a169ddd625f3953267bd869ea453 Mon Sep 17 00:00:00 2001 From: Edward Faulkner Date: Wed, 27 Mar 2019 19:30:15 -0400 Subject: [PATCH 366/879] save over 500KB with one weird trick (#1561) --- addon/serializer.js | 31 +++++++++++++----------- addon/serializers/json-api-serializer.js | 15 ++++++------ 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/addon/serializer.js b/addon/serializer.js index b5eed7872..d06625ea7 100644 --- a/addon/serializer.js +++ b/addon/serializer.js @@ -10,7 +10,9 @@ import _isEmpty from 'lodash/isEmpty'; import _includes from 'lodash/includes'; import _assign from 'lodash/assign'; import _get from 'lodash/get'; -import _ from 'lodash'; +import _flatten from 'lodash/flatten'; +import _compact from 'lodash/compact'; +import _uniqBy from 'lodash/uniqBy'; /** Serializers are responsible for formatting your route handler's response. @@ -473,19 +475,20 @@ class Serializer { return [hash, []]; } else { - let addToIncludes = _(serializer.getKeysForIncluded()) - .map((key) => { - if (this.isCollection(resource)) { - return resource.models.map((m) => m[key]); - } else { - return resource[key]; - } - }) - .flatten() - .compact() - .uniqBy(m => m.toString()) - .value(); - + let addToIncludes = _uniqBy( + _compact( + _flatten( + serializer.getKeysForIncluded().map(key => { + if (this.isCollection(resource)) { + return resource.models.map(m => m[key]); + } else { + return resource[key]; + } + }) + ) + ), + m => m.toString() + ); return [hash, addToIncludes]; } } diff --git a/addon/serializers/json-api-serializer.js b/addon/serializers/json-api-serializer.js index 9640c5022..ce8376a2b 100644 --- a/addon/serializers/json-api-serializer.js +++ b/addon/serializers/json-api-serializer.js @@ -1,7 +1,10 @@ import Serializer from '../serializer'; import { dasherize, pluralize, camelize } from '../utils/inflector'; import _get from 'lodash/get'; -import _ from 'lodash'; +import _flatten from 'lodash/flatten'; +import _compact from 'lodash/compact'; +import _uniqBy from 'lodash/uniqBy'; +import _isEmpty from 'lodash/isEmpty'; import assert from 'ember-cli-mirage/assert'; /** @@ -95,11 +98,7 @@ const JSONAPISerializer = Serializer.extend({ includes.push(newIncludes); }); - return _(includes) - .flatten() - .compact() - .uniqBy(m => m.toString()) - .value(); + return _uniqBy(_compact(_flatten(includes)), m => m.toString()); }, getIncludesForResourceAndPath(resource, ...names) { @@ -182,14 +181,14 @@ const JSONAPISerializer = Serializer.extend({ relationshipHash.data = data; } - if (!_.isEmpty(relationshipHash)) { + if (!_isEmpty(relationshipHash)) { relationships[relationshipKey] = relationshipHash; } return relationships; }, {}); - if (!_.isEmpty(relationships)) { + if (!_isEmpty(relationships)) { hash.relationships = relationships; } From 4bbd167e5fe4ec0fd1aeaacb453101b5ec2586ea Mon Sep 17 00:00:00 2001 From: Edward Faulkner Date: Wed, 27 Mar 2019 19:31:42 -0400 Subject: [PATCH 367/879] Remove duplicated dependencies (#1562) These are dependencies of pretender. They stopped being necessary when mirage switched to loading pretender via ember-auto-import. When consumed that way, pretender already does the right thing and includes its own dependencies automatically. --- index.js | 16 ---------------- package.json | 6 +----- yarn.lock | 5 ----- 3 files changed, 1 insertion(+), 26 deletions(-) diff --git a/index.js b/index.js index 06e9c8a82..f8b54fdad 100644 --- a/index.js +++ b/index.js @@ -8,22 +8,6 @@ const writeFile = require('broccoli-file-creator'); module.exports = { name: 'ember-cli-mirage', - options: { - nodeAssets: { - '@xg-wang/whatwg-fetch': npmAsset({ - import: ['dist/fetch.umd.js'] - }), - 'route-recognizer': npmAsset({ - srcDir: 'dist', - import: ['route-recognizer.js'], - vendor: ['route-recognizer.js.map'] - }), - 'fake-xml-http-request': npmAsset({ - import: ['fake_xml_http_request.js'] - }) - } - }, - included() { let app; diff --git a/package.json b/package.json index d6ad97e87..707470b2f 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,6 @@ "prepare": "./scripts/link.sh" }, "dependencies": { - "@xg-wang/whatwg-fetch": "^3.0.0", "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^2.0.1", "broccoli-merge-trees": "^3.0.2", @@ -44,13 +43,10 @@ "chalk": "^2.4.2", "ember-auto-import": "^1.2.19", "ember-cli-babel": "^7.5.0", - "ember-cli-node-assets": "^0.2.2", "ember-get-config": "^0.2.2", "ember-inflector": "^2.0.0 || ^3.0.0", - "fake-xml-http-request": "^2.0.0", "lodash": "^4.17.11", - "pretender": "2.1.1", - "route-recognizer": "^0.3.4" + "pretender": "2.1.1" }, "devDependencies": { "@ember/jquery": "^0.6.0", diff --git a/yarn.lock b/yarn.lock index 1e97d9a5b..66b29a663 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12113,11 +12113,6 @@ route-recognizer@^0.3.3: resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.3.tgz#1d365e27fa6995e091675f7dc940a8c00353bd29" integrity sha1-HTZeJ/ppleCRZ199yUCowANTvSk= -route-recognizer@^0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.4.tgz#39ab1ffbce1c59e6d2bdca416f0932611e4f3ca3" - integrity sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g== - rsvp@^3.0.14, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.3.3, rsvp@^3.5.0: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" From 70cf7beb10ca3e1de6e9e842898a4e13205ce72c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 29 Mar 2019 10:55:00 +0000 Subject: [PATCH 368/879] build(deps): bump ember-cli-babel from 7.6.0 to 7.7.3 Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 7.6.0 to 7.7.3. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v7.6.0...v7.7.3) Signed-off-by: dependabot[bot] --- yarn.lock | 114 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 90 insertions(+), 24 deletions(-) diff --git a/yarn.lock b/yarn.lock index 66b29a663..ebfea0b21 100644 --- a/yarn.lock +++ b/yarn.lock @@ -40,6 +40,17 @@ source-map "^0.5.0" trim-right "^1.0.1" +"@babel/generator@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.0.tgz#c230e79589ae7a729fd4631b9ded4dc220418196" + integrity sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ== + dependencies: + "@babel/types" "^7.4.0" + jsesc "^2.5.1" + lodash "^4.17.11" + source-map "^0.5.0" + trim-right "^1.0.1" + "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" @@ -64,17 +75,17 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-create-class-features-plugin@^7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.3.4.tgz#092711a7a3ad8ea34de3e541644c2ce6af1f6f0c" - integrity sha512-uFpzw6L2omjibjxa8VGZsJUPL5wJH0zzGKpoz0ccBkzIa6C8kWNUbiBmQ0rgOKWlHJ6qzmfa6lTiGchiV8SC+g== +"@babel/helper-create-class-features-plugin@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.0.tgz#30fd090e059d021995c1762a5b76798fa0b51d82" + integrity sha512-2K8NohdOT7P6Vyp23QH4w2IleP8yG3UJsbRKwA4YP6H8fErcLkFuuEEqbF2/BYBKSNci/FWJiqm6R3VhM/QHgw== dependencies: "@babel/helper-function-name" "^7.1.0" "@babel/helper-member-expression-to-functions" "^7.0.0" "@babel/helper-optimise-call-expression" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.3.4" - "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/helper-replace-supers" "^7.4.0" + "@babel/helper-split-export-declaration" "^7.4.0" "@babel/helper-define-map@^7.1.0": version "7.1.0" @@ -182,15 +193,15 @@ "@babel/traverse" "^7.2.3" "@babel/types" "^7.0.0" -"@babel/helper-replace-supers@^7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.3.4.tgz#a795208e9b911a6eeb08e5891faacf06e7013e13" - integrity sha512-pvObL9WVf2ADs+ePg0jrqlhHoxRXlOa+SHRHzAXIz2xkYuOHfGl+fKxPMaS4Fq+uje8JQPobnertBBvyrWnQ1A== +"@babel/helper-replace-supers@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.0.tgz#4f56adb6aedcd449d2da9399c2dcf0545463b64c" + integrity sha512-PVwCVnWWAgnal+kJ+ZSAphzyl58XrFeSKSAJRiqg5QToTsjL+Xu1f9+RJ+d+Q0aPhPfBGaYfkox66k86thxNSg== dependencies: "@babel/helper-member-expression-to-functions" "^7.0.0" "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.3.4" - "@babel/types" "^7.3.4" + "@babel/traverse" "^7.4.0" + "@babel/types" "^7.4.0" "@babel/helper-simple-access@^7.1.0": version "7.1.0" @@ -207,6 +218,13 @@ dependencies: "@babel/types" "^7.0.0" +"@babel/helper-split-export-declaration@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz#571bfd52701f492920d63b7f735030e9a3e10b55" + integrity sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw== + dependencies: + "@babel/types" "^7.4.0" + "@babel/helper-wrap-function@^7.1.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" @@ -240,6 +258,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.4.tgz#a43357e4bbf4b92a437fb9e465c192848287f27c" integrity sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ== +"@babel/parser@^7.4.0": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.2.tgz#b4521a400cb5a871eab3890787b4bc1326d38d91" + integrity sha512-9fJTDipQFvlfSVdD/JBtkiY0br9BtfvW2R8wo6CX/Ej2eMuV0gWPk1M67Mt3eggQvBqYW1FCEk8BN7WvGm/g5g== + "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" @@ -249,13 +272,22 @@ "@babel/helper-remap-async-to-generator" "^7.1.0" "@babel/plugin-syntax-async-generators" "^7.2.0" -"@babel/plugin-proposal-class-properties@^7.1.0": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.3.4.tgz#410f5173b3dc45939f9ab30ca26684d72901405e" - integrity sha512-lUf8D3HLs4yYlAo8zjuneLvfxN7qfKv1Yzbj5vjqaqMJxgJA3Ipwp4VUJ+OrOdz53Wbww6ahwB8UhB2HQyLotA== +"@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.3.4": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.0.tgz#d70db61a2f1fd79de927eea91f6411c964e084b8" + integrity sha512-t2ECPNOXsIeK1JxJNKmgbzQtoG27KIlVE61vTqX0DKR9E9sZlVVxWUtEW9D5FlZ8b8j7SBNCHY47GgPKCKlpPg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.4.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-proposal-decorators@^7.3.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.0.tgz#8e1bfd83efa54a5f662033afcc2b8e701f4bb3a9" + integrity sha512-d08TLmXeK/XbgCo7ZeZ+JaeZDtDai/2ctapTRsWWkkmy7G/cqz8DQN/HlWG7RR4YmfXxmExsbU3SuCjlM7AtUg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.3.4" + "@babel/helper-create-class-features-plugin" "^7.4.0" "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-decorators" "^7.2.0" "@babel/plugin-proposal-json-strings@^7.2.0": version "7.2.0" @@ -297,6 +329,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-decorators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz#c50b1b957dcc69e4b1127b65e1c33eef61570c1b" + integrity sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" @@ -644,6 +683,21 @@ globals "^11.1.0" lodash "^4.17.11" +"@babel/traverse@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.0.tgz#14006967dd1d2b3494cdd650c686db9daf0ddada" + integrity sha512-/DtIHKfyg2bBKnIN+BItaIlEg5pjAnzHOIQe5w+rHAw/rg9g0V7T4rqPX8BJPfW11kt3koyjAnTNwCzb28Y1PA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.0" + "@babel/parser" "^7.4.0" + "@babel/types" "^7.4.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" + "@babel/types@^7.0.0", "@babel/types@^7.1.5", "@babel/types@^7.1.6", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.4": version "7.3.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.4.tgz#bf482eaeaffb367a28abbf9357a94963235d90ed" @@ -653,6 +707,15 @@ lodash "^4.17.11" to-fast-properties "^2.0.0" +"@babel/types@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.0.tgz#670724f77d24cce6cc7d8cf64599d511d164894c" + integrity sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA== + dependencies: + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" + "@ember/jquery@^0.6.0": version "0.6.0" resolved "https://registry.yarnpkg.com/@ember/jquery/-/jquery-0.6.0.tgz#5fe9d39b15c9d47fe495302b2a6176059a6267cd" @@ -4987,10 +5050,10 @@ ember-cli-autoprefixer@^0.8.1: broccoli-autoprefixer "^5.0.0" lodash "^4.0.0" -ember-cli-babel-plugin-helpers@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.0.2.tgz#d4bec0f32febc530e621ea8d66d3365727cb5e6c" - integrity sha512-tTWmHiIvadgtu0i+Zlb5Jnue69qO6dtACcddkRhhV+m9NfAr+2XNoTKRSeGL8QyRDhfWeo4rsK9dqPrU4PQ+8g== +ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.0.tgz#de3baedd093163b6c2461f95964888c1676325ac" + integrity sha512-Zr4my8Xn+CzO0gIuFNXji0eTRml5AxZUTDQz/wsNJ5AJAtyFWCY4QtKdoELNNbiCVGt1lq5yLiwTm4scGKu6xA== ember-cli-babel@7.1.3: version "7.1.3" @@ -5034,11 +5097,13 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be semver "^5.5.0" ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.4.0, ember-cli-babel@^7.5.0: - version "7.6.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.6.0.tgz#2e7f1df888fb62eb54d170defce4b6c536e8dfd3" - integrity sha512-2m400ZW9c4EE343g/j1U7beJgjJezTdDCgXM2koHdhpLlZB1Kz7iQw8S+t8gzXGwSGXlf7C7v0RHxP1/bo8frA== + version "7.7.3" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.7.3.tgz#f94709f6727583d18685ca6773a995877b87b8a0" + integrity sha512-/LWwyKIoSlZQ7k52P+6agC7AhcOBqPJ5C2u27qXHVVxKvCtg6ahNuRk/KmfZmV4zkuw4EjTZxfJE1PzpFyHkXg== dependencies: "@babel/core" "^7.0.0" + "@babel/plugin-proposal-class-properties" "^7.3.4" + "@babel/plugin-proposal-decorators" "^7.3.0" "@babel/plugin-transform-modules-amd" "^7.0.0" "@babel/plugin-transform-runtime" "^7.2.0" "@babel/polyfill" "^7.0.0" @@ -5053,6 +5118,7 @@ ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cl broccoli-funnel "^2.0.1" broccoli-source "^1.1.0" clone "^2.1.2" + ember-cli-babel-plugin-helpers "^1.1.0" ember-cli-version-checker "^2.1.2" ensure-posix-path "^1.0.2" semver "^5.5.0" From 5ae5c3695f873d9687896fcdc708a6e9f48ec060 Mon Sep 17 00:00:00 2001 From: Nino Annighofer Date: Sat, 30 Mar 2019 17:14:41 +0000 Subject: [PATCH 369/879] Document keyForForeignKey method (#1568) --- addon/serializer.js | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/addon/serializer.js b/addon/serializer.js index d06625ea7..30bdabd34 100644 --- a/addon/serializer.js +++ b/addon/serializer.js @@ -902,6 +902,51 @@ class Serializer { return `${singularize(camelize(relationshipName))}Ids`; } + /** + Like `keyForRelationshipIds`, but for `belongsTo` relationships. + + For example, if you're serializing a `blogPost` that sideloads one `author`, + your `blogPost` JSON would include a `authorId` key: + + ``` + { + blogPost: { + id: 1, + authorId: 1 + }, + author: ... + } + ``` + + Overwrite `keyForForeignKey` to format this key: + + ```js + // serializers/application.js + const { underscore } = Ember.String; + + export default Serializer.extend({ + keyForForeignKey(relationshipName) { + return underscore(relationshipName) + '_id'; + } + }); + ``` + + Now the response will look like: + + ``` + { + blogPost: { + id: 1, + author_id: 1 + }, + author: ... + } + ``` + + @method keyForForeignKey + @param relationshipName + @public + */ keyForForeignKey(relationshipName) { return `${camelize(relationshipName)}Id`; } From 70eed4ff1898cc4d8e3191ebd110400e19810d52 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Wed, 3 Apr 2019 06:43:51 -0400 Subject: [PATCH 370/879] build(deps-dev): bump ember-source from 3.4.7 to 3.9.0 (#1570) Bumps [ember-source](https://github.com/emberjs/ember.js) from 3.4.7 to 3.9.0. - [Release notes](https://github.com/emberjs/ember.js/releases) - [Changelog](https://github.com/emberjs/ember.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember.js/compare/v3.4.7...v3.9.0) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 31 ++++++++++++------------------- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index 707470b2f..f576c4199 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "ember-maybe-import-regenerator": "^0.1.6", "ember-moment": "^7.8.1", "ember-resolver": "^5.0.1", - "ember-source": "~3.4.0", + "ember-source": "~3.9.0", "ember-source-channel-url": "^1.1.0", "ember-try": "^1.0.0", "escape-string-regexp": "^1.0.5", diff --git a/yarn.lock b/yarn.lock index ebfea0b21..359dca289 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5096,7 +5096,7 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.4.0, ember-cli-babel@^7.5.0: +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.4.0, ember-cli-babel@^7.4.2, ember-cli-babel@^7.5.0: version "7.7.3" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.7.3.tgz#f94709f6727583d18685ca6773a995877b87b8a0" integrity sha512-/LWwyKIoSlZQ7k52P+6agC7AhcOBqPJ5C2u27qXHVVxKvCtg6ahNuRk/KmfZmV4zkuw4EjTZxfJE1PzpFyHkXg== @@ -5528,13 +5528,6 @@ ember-cli-uglify@^2.1.0: broccoli-uglify-sourcemap "^2.1.1" lodash.defaultsdeep "^4.6.0" -ember-cli-valid-component-name@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ember-cli-valid-component-name/-/ember-cli-valid-component-name-1.0.0.tgz#71550ce387e0233065f30b30b1510aa2dfbe87ef" - integrity sha1-cVUM44fgIzBl8wswsVEKot++h+8= - dependencies: - silent-error "^1.0.0" - ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0, ember-cli-version-checker@^2.1.1, ember-cli-version-checker@^2.1.2: version "2.2.0" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.2.0.tgz#47771b731fe0962705e27c8199a9e3825709f3b3" @@ -5966,25 +5959,25 @@ ember-source-channel-url@^1.0.1, ember-source-channel-url@^1.1.0: dependencies: got "^8.0.1" -ember-source@~3.4.0: - version "3.4.7" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.4.7.tgz#c819337c62fcc6a10ca8aee28abc703c15a57d9e" - integrity sha512-+4yhFZHsjSucSd0bJGErJUly0kdkutMR06AWHLR0b0VRcdYUCbMcFlEvfc2g2B5YR0GY4enSy4gt7PZgYQOrQw== +ember-source@~3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.9.0.tgz#cab72c07c30d8313e1cae3ef9a68c0a3d7d1b7de" + integrity sha512-VHeovle0+ZBnIbEcuNcIl1+HfActbplkJBMcaXAj/sCp46ayNPHB0zl+0ix74j+MOTiu8GEXZ6GHaqgwGmhvMw== dependencies: - broccoli-funnel "^2.0.1" - broccoli-merge-trees "^2.0.0" - chalk "^2.3.0" + broccoli-funnel "^2.0.2" + broccoli-merge-trees "^3.0.2" + chalk "^2.4.2" + ember-cli-babel "^7.4.2" ember-cli-get-component-path-option "^1.0.0" ember-cli-is-package-missing "^1.0.0" ember-cli-normalize-entity-name "^1.0.0" ember-cli-path-utils "^1.0.0" ember-cli-string-utils "^1.1.0" - ember-cli-valid-component-name "^1.0.0" - ember-cli-version-checker "^2.1.0" + ember-cli-version-checker "^3.0.1" ember-router-generator "^1.2.3" inflection "^1.12.0" jquery "^3.3.1" - resolve "^1.6.0" + resolve "^1.10.0" ember-svg-jar@^1.2.2: version "1.2.2" @@ -12074,7 +12067,7 @@ resolve@1.5.0: dependencies: path-parse "^1.0.5" -resolve@^1.1.3, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.7.1, resolve@^1.8.1: +resolve@^1.1.3, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: version "1.10.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== From 49621c7acc5a20f7bdccf5e74b3f1c27f378877e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 4 Apr 2019 10:44:51 +0000 Subject: [PATCH 371/879] build(deps-dev): bump ember-cli-addon-docs from 0.6.7 to 0.6.8 Bumps [ember-cli-addon-docs](https://github.com/ember-learn/ember-cli-addon-docs) from 0.6.7 to 0.6.8. - [Release notes](https://github.com/ember-learn/ember-cli-addon-docs/releases) - [Changelog](https://github.com/ember-learn/ember-cli-addon-docs/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-learn/ember-cli-addon-docs/compare/v0.6.7...v0.6.8) Signed-off-by: dependabot[bot] --- yarn.lock | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index 359dca289..48078654a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4973,9 +4973,9 @@ ember-cli-addon-docs-esdoc@^0.2.1: walk-sync "^0.3.2" ember-cli-addon-docs@^0.6.4: - version "0.6.7" - resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.7.tgz#26854c9e60cf35c5d6fbe2e849c4450df7ecf03a" - integrity sha512-XpgqZ5Ty3sxDto5hxSowc6rxwxoYsDXE2ny7N8bSVQQ/Uihp4BUjA/ztkIkkfXnU5dqp89S4nBlumJf5NmJQeg== + version "0.6.8" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.8.tgz#ec3ebee8ef2a4f78109a28ce3c63a0623480016d" + integrity sha512-Lf7luk36PX4ljAQhbRJidcYWB4/Mf/2EWmMTt8gyRx8con39dVjMI/gzBtRGayVeyN2ZFJw9uqfud0p+d28Ntw== dependencies: "@glimmer/syntax" "^0.36.4" broccoli-bridge "^1.0.0" @@ -4999,7 +4999,7 @@ ember-cli-addon-docs@^0.6.4: ember-cli-tailwind "^0.6.2" ember-code-snippet "^2.4.0" ember-component-css "^0.6.7" - ember-concurrency "^0.8.21" + ember-concurrency "^0.9.0" ember-data "2.x - 3.x" ember-fetch "^6.2.0" ember-fetch-adapter "^0.4.3" @@ -5658,6 +5658,15 @@ ember-compatibility-helpers@^1.1.1: ember-cli-version-checker "^2.1.1" semver "^5.4.1" +ember-compatibility-helpers@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.2.0.tgz#feee16c5e9ef1b1f1e53903b241740ad4b01097e" + integrity sha512-pUW4MzJdcaQtwGsErYmitFRs0rlCYBAnunVzlFFUBr4xhjlCjgHJo0b53gFnhTgenNM3d3/NqLarzRhDTjXRTg== + dependencies: + babel-plugin-debug-macros "^0.2.0" + ember-cli-version-checker "^2.1.1" + semver "^5.4.1" + ember-component-css@^0.6.7: version "0.6.7" resolved "https://registry.yarnpkg.com/ember-component-css/-/ember-component-css-0.6.7.tgz#dbc6debe5c04a2c0fe8a5edc64303c7324b33945" @@ -5690,13 +5699,14 @@ ember-composable-helpers@^2.1.0: broccoli-funnel "^1.0.1" ember-cli-babel "^7.1.0" -ember-concurrency@^0.8.21: - version "0.8.22" - resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-0.8.22.tgz#900e870aae486e1f5fcb168bbb4efba02561a5ad" - integrity sha512-njLqyjMxBf8fapIV8WPyG2gFbSCIQgMpk33uSs5Ih7HsfFAz60KwVo9sMVPBYAJwQmF8jFPm7Ph+mjkiQXHmmA== +ember-concurrency@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-0.9.0.tgz#0016652ff780fb665842e7f47815ee0601122ea1" + integrity sha512-JDjvwSlZBUQwv1+qUj6YUqXXe0Y0/to4ppUTNXQ1EEiEAopkHJXQUn0ZcFOiQpEinrYp34Vg6+lUNskoJFL2Vg== dependencies: babel-core "^6.24.1" ember-cli-babel "^6.8.2" + ember-compatibility-helpers "^1.2.0" ember-maybe-import-regenerator "^0.1.5" ember-copy@^1.0.0: From 2326aa7f17fe78b8d8a1199c2061b413a0476581 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 8 Apr 2019 10:38:47 +0000 Subject: [PATCH 372/879] build(deps-dev): bump js-yaml from 3.13.0 to 3.13.1 Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 3.13.0 to 3.13.1. - [Release notes](https://github.com/nodeca/js-yaml/releases) - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/3.13.0...3.13.1) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 48078654a..7b4258c88 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8776,9 +8776,9 @@ js-tokens@^4.0.0: integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.12.0, js-yaml@^3.12.1, js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.3.0, js-yaml@^3.9.1: - version "3.13.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.0.tgz#38ee7178ac0eea2c97ff6d96fff4b18c7d8cf98e" - integrity sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ== + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== dependencies: argparse "^1.0.7" esprima "^4.0.0" From 9b8ae2ddd29b42dc05c92a5102af77344eca7d94 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 8 Apr 2019 10:39:36 +0000 Subject: [PATCH 373/879] build(deps-dev): bump marked from 0.6.1 to 0.6.2 Bumps [marked](https://github.com/markedjs/marked) from 0.6.1 to 0.6.2. - [Release notes](https://github.com/markedjs/marked/releases) - [Commits](https://github.com/markedjs/marked/compare/v0.6.1...v0.6.2) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 48078654a..76f522fd2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9819,9 +9819,9 @@ marked@^0.5.0: integrity sha512-iUkBZegCZou4AdwbKTwSW/lNDcz5OuRSl3qdcl31Ia0B2QPG0Jn+tKblh/9/eP9/6+4h27vpoh8wel/vQOV0vw== marked@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.6.1.tgz#a63addde477bca9613028de4b2bc3629e53a0562" - integrity sha512-+H0L3ibcWhAZE02SKMqmvYsErLo4EAVJxu5h3bHBBDvvjeWXtl92rGUSBYHL2++5Y+RSNgl8dYOAXcYe7lp1fA== + version "0.6.2" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.6.2.tgz#c574be8b545a8b48641456ca1dbe0e37b6dccc1a" + integrity sha512-LqxwVH3P/rqKX4EKGz7+c2G9r98WeM/SW34ybhgNGhUQNKtf1GmmSkJ6cDGJ/t6tiyae49qRkpyTw2B9HOrgUA== match-media@^0.2.0: version "0.2.0" From 8986e1087b1ecf929fb3588025b82e3bcaec5ee0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Wed, 10 Apr 2019 10:38:23 +0000 Subject: [PATCH 374/879] build(deps-dev): bump ember-source from 3.9.0 to 3.9.1 Bumps [ember-source](https://github.com/emberjs/ember.js) from 3.9.0 to 3.9.1. - [Release notes](https://github.com/emberjs/ember.js/releases) - [Changelog](https://github.com/emberjs/ember.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember.js/compare/v3.9.0...v3.9.1) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 5828e61f5..2718ab9fe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5970,9 +5970,9 @@ ember-source-channel-url@^1.0.1, ember-source-channel-url@^1.1.0: got "^8.0.1" ember-source@~3.9.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.9.0.tgz#cab72c07c30d8313e1cae3ef9a68c0a3d7d1b7de" - integrity sha512-VHeovle0+ZBnIbEcuNcIl1+HfActbplkJBMcaXAj/sCp46ayNPHB0zl+0ix74j+MOTiu8GEXZ6GHaqgwGmhvMw== + version "3.9.1" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.9.1.tgz#e6c7b08f823f9a55e448af1cc439266cabc3e65e" + integrity sha512-0rfP1m3KbfylKNnxk4ZWy0jqwqIWGm5rb7ZZFn4zazVJFI6gEmratWadXfzwEgqG2ukRcW9F8frEk0utuaAnMg== dependencies: broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.2" From 079e4084fc63d4d663126309761927b0c1d4ffd3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Wed, 10 Apr 2019 10:38:49 +0000 Subject: [PATCH 375/879] build(deps-dev): bump ember-cli-addon-docs from 0.6.8 to 0.6.9 Bumps [ember-cli-addon-docs](https://github.com/ember-learn/ember-cli-addon-docs) from 0.6.8 to 0.6.9. - [Release notes](https://github.com/ember-learn/ember-cli-addon-docs/releases) - [Changelog](https://github.com/ember-learn/ember-cli-addon-docs/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-learn/ember-cli-addon-docs/compare/v0.6.8...v0.6.9) Signed-off-by: dependabot[bot] --- yarn.lock | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 5828e61f5..3193b812d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4973,9 +4973,9 @@ ember-cli-addon-docs-esdoc@^0.2.1: walk-sync "^0.3.2" ember-cli-addon-docs@^0.6.4: - version "0.6.8" - resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.8.tgz#ec3ebee8ef2a4f78109a28ce3c63a0623480016d" - integrity sha512-Lf7luk36PX4ljAQhbRJidcYWB4/Mf/2EWmMTt8gyRx8con39dVjMI/gzBtRGayVeyN2ZFJw9uqfud0p+d28Ntw== + version "0.6.9" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.9.tgz#343b9d57f2e0c24a6d2b262948d339df93eda4b0" + integrity sha512-xnxJW/BjHVzokmwHIAitvBbSvYR8q0EgrVq0Vaw2v6g1KtqV5jDAuwsSLvcj+s4Ikxg8t9WsoX0Rpv0Ws+tMTQ== dependencies: "@glimmer/syntax" "^0.36.4" broccoli-bridge "^1.0.0" @@ -4988,6 +4988,7 @@ ember-cli-addon-docs@^0.6.4: broccoli-plugin "^1.3.1" broccoli-source "^1.1.0" broccoli-stew "^2.0.0" + chalk "^2.4.2" ember-auto-import "^1.2.19" ember-cli-autoprefixer "^0.8.1" ember-cli-babel "^6.16.0" @@ -4996,6 +4997,7 @@ ember-cli-addon-docs@^0.6.4: ember-cli-htmlbars-inline-precompile "^1.0.3" ember-cli-sass "10.0.0" ember-cli-string-helpers "^1.9.0" + ember-cli-string-utils "^1.1.0" ember-cli-tailwind "^0.6.2" ember-code-snippet "^2.4.0" ember-component-css "^0.6.7" @@ -5007,6 +5009,7 @@ ember-cli-addon-docs@^0.6.4: ember-keyboard "^4.0.0" ember-modal-dialog "3.0.0-beta.3" ember-responsive "^3.0.0-beta.1" + ember-router-generator "^1.2.3" ember-router-scroll "^1.0.0" ember-svg-jar "^1.2.2" ember-tether "^1.0.0-beta.2" @@ -5025,6 +5028,7 @@ ember-cli-addon-docs@^0.6.4: lodash "^4.17.11" lunr "^2.3.3" marked "^0.5.0" + pad-start "^1.0.2" parse-git-config "^2.0.3" quick-temp "^0.1.8" resolve "^1.8.1" @@ -10810,6 +10814,11 @@ package-json@^4.0.1: registry-url "^3.0.3" semver "^5.1.0" +pad-start@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pad-start/-/pad-start-1.0.2.tgz#23e5bab3e96446b62816cff6f150975f040d1b14" + integrity sha1-I+W6s+lkRrYoFs/28VCXXwQNGxQ= + pako@^1.0.5, pako@~1.0.5: version "1.0.8" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.8.tgz#6844890aab9c635af868ad5fecc62e8acbba3ea4" From 54199fcc0830cfd24a20cf97c74e4f8059520472 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Wed, 10 Apr 2019 10:39:26 +0000 Subject: [PATCH 376/879] build(deps-dev): bump ember-cli-template-lint Bumps [ember-cli-template-lint](https://github.com/ember-template-lint/ember-cli-template-lint) from 1.0.0-beta.2 to 1.0.0-beta.3. - [Release notes](https://github.com/ember-template-lint/ember-cli-template-lint/releases) - [Changelog](https://github.com/ember-template-lint/ember-cli-template-lint/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-template-lint/ember-cli-template-lint/compare/v1.0.0-beta.2...v1.0.0-beta.3) Signed-off-by: dependabot[bot] --- yarn.lock | 129 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 89 insertions(+), 40 deletions(-) diff --git a/yarn.lock b/yarn.lock index 5828e61f5..18a4ea05b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1159,7 +1159,21 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -"@types/minimatch@^3.0.3": +"@types/events@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + +"@types/glob@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + +"@types/minimatch@*", "@types/minimatch@^3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== @@ -1642,7 +1656,7 @@ array-to-sentence@^1.1.0: resolved "https://registry.yarnpkg.com/array-to-sentence/-/array-to-sentence-1.1.0.tgz#c804956dafa53232495b205a9452753a258d39fc" integrity sha1-yASVba+lMjJJWyBalFJ1OiWNOfw= -array-union@^1.0.1: +array-union@^1.0.1, array-union@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= @@ -3105,16 +3119,16 @@ broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-p symlink-or-copy "^1.0.1" walk-sync "^0.3.1" -broccoli-persistent-filter@^2.0.0, broccoli-persistent-filter@^2.1.1, broccoli-persistent-filter@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.2.1.tgz#d2a911ec02ebbbcfb382242c517159cb7a9c10d7" - integrity sha512-07rUlzzhsyrly4Waq/eMK/fhWcN3g0txirzx4EKqQ9pF4w+XXI/oRPibRyHRa5NL6DfNGC54fPFRwMYHjjm5nw== +broccoli-persistent-filter@^2.0.0, broccoli-persistent-filter@^2.1.0, broccoli-persistent-filter@^2.1.1, broccoli-persistent-filter@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.2.2.tgz#e0180e75ede5dd05d4c702f24f6c049e93fba915" + integrity sha512-PW12RD1yY+x5SASUADuUMJce+dVSmjBO3pV1rLNHmT1C31rp1P++TvX7AgUObFmGhL7qlwviSdhMbBkY1v3G2w== dependencies: async-disk-cache "^1.2.1" async-promise-queue "^1.0.3" broccoli-plugin "^1.0.0" fs-tree-diff "^1.0.2" - hash-for-dep "^1.0.2" + hash-for-dep "^1.5.0" heimdalljs "^0.2.1" heimdalljs-logger "^0.1.7" mkdirp "^0.5.1" @@ -4564,7 +4578,7 @@ debug@=3.1.0, debug@^3.0.0, debug@^3.1.0, debug@~3.1.0: dependencies: ms "2.0.0" -debug@^4.0.0, debug@^4.1.0, debug@~4.1.0: +debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@~4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -4738,12 +4752,11 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" -dir-glob@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" - integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== +dir-glob@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== dependencies: - arrify "^1.0.1" path-type "^3.0.0" doctrine@^2.1.0: @@ -5472,21 +5485,21 @@ ember-cli-tailwind@^0.6.2: tailwindcss "^0.6.1" ember-cli-template-lint@^1.0.0-beta.1: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/ember-cli-template-lint/-/ember-cli-template-lint-1.0.0-beta.2.tgz#0ebd2f8c1f9ca47f9ee3b42755d66262440c14f6" - integrity sha512-i37mJhz+dll7eP/Y3Yh8oLw5aRqfdnIiutqdLsrvTSLb4VphDXbujXCO8XravvZtGeGBVYKXGsjTxobbPXgsgw== + version "1.0.0-beta.3" + resolved "https://registry.yarnpkg.com/ember-cli-template-lint/-/ember-cli-template-lint-1.0.0-beta.3.tgz#48f2fa43e7ad0172685fa171e5acd4d75b873792" + integrity sha512-ivrvYih+cx7VUlyyMQBmk61Ki+gT5axfppWrk6fSvHaoxHZadXU3zRJMT5DPkeRaayRu0y1dls4wqfrUhzQ1PA== dependencies: aot-test-generators "^0.1.0" broccoli-concat "^3.7.1" - broccoli-persistent-filter "^1.4.3" + broccoli-persistent-filter "^2.1.0" chalk "^2.4.1" - debug "^3.1.0" - ember-cli-version-checker "^2.1.2" - ember-template-lint "^1.0.0-beta.5" + debug "^4.0.1" + ember-cli-version-checker "^3.0.1" + ember-template-lint "^1.1.0" json-stable-stringify "^1.0.1" md5-hex "^2.0.0" strip-ansi "^4.0.0" - walk-sync "^0.3.3" + walk-sync "^1.1.3" ember-cli-test-info@^1.0.0: version "1.0.0" @@ -6007,14 +6020,14 @@ ember-svg-jar@^1.2.2: mkdirp "^0.5.1" path-posix "^1.0.0" -ember-template-lint@^1.0.0-beta.5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ember-template-lint/-/ember-template-lint-1.0.0.tgz#fda969d69c4cfac443b58eb3852603cf58aef111" - integrity sha512-8hWUwKRXyLctmDs2v4Lz9Gwch6N7/+1YrdgrxjZmBBhkQ4tD+I0XtVbQFGFY+sIeMxSApam7DOkCT37n3imuYw== +ember-template-lint@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ember-template-lint/-/ember-template-lint-1.1.0.tgz#312e101728452bf082f54cbe429ed9b52273ba64" + integrity sha512-DPEWdjaNVIC58wJqeJStvQzk2gyKN5/u6dJfDKQ7mRJaouoLP1hZjSZwwpyO9bj10E9/3OJZnLmx1jjJ9/nqWA== dependencies: "@glimmer/compiler" "^0.38.0" chalk "^2.0.0" - globby "^8.0.1" + globby "^9.0.0" minimatch "^3.0.4" resolve "^1.1.3" strip-bom "^3.0.0" @@ -6801,7 +6814,7 @@ fast-deep-equal@^2.0.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= -fast-glob@^2.0.2: +fast-glob@^2.2.6: version "2.2.6" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.6.tgz#a5d5b697ec8deda468d85a74035290a025a95295" integrity sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w== @@ -7633,18 +7646,19 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" -globby@^8.0.1: - version "8.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" - integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== +globby@^9.0.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" + integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== dependencies: - array-union "^1.0.1" - dir-glob "2.0.0" - fast-glob "^2.0.2" - glob "^7.1.2" - ignore "^3.3.5" - pify "^3.0.0" - slash "^1.0.0" + "@types/glob" "^7.1.1" + array-union "^1.0.2" + dir-glob "^2.2.2" + fast-glob "^2.2.6" + glob "^7.1.3" + ignore "^4.0.3" + pify "^4.0.1" + slash "^2.0.0" good-listener@^1.2.2: version "1.2.2" @@ -7866,6 +7880,18 @@ hash-for-dep@^1.4.7: path-root "^0.1.1" resolve "^1.4.0" +hash-for-dep@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.5.1.tgz#497754b39bee2f1c4ade4521bfd2af0a7c1196e3" + integrity sha512-/dQ/A2cl7FBPI2pO0CANkvuuVi/IFS5oTyJ0PsOb6jW6WbVW1js5qJXMJTNbWHXBIPdFTWFbabjB+mE0d+gelw== + dependencies: + broccoli-kitchen-sink-helpers "^0.3.1" + heimdalljs "^0.2.3" + heimdalljs-logger "^0.1.7" + path-root "^0.1.1" + resolve "^1.10.0" + resolve-package-path "^1.0.11" + hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" @@ -8125,11 +8151,16 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -ignore@^3.3.3, ignore@^3.3.5: +ignore@^3.3.3: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== +ignore@^4.0.3: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + ignore@^5.0.2: version "5.0.5" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.0.5.tgz#c663c548d6ce186fb33616a8ccb5d46e56bdbbf9" @@ -11115,6 +11146,11 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" @@ -12049,6 +12085,14 @@ resolve-from@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= +resolve-package-path@^1.0.11: + version "1.2.6" + resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-1.2.6.tgz#48f5d69a5b3a0ea68f7b9c7398459dd4125807c7" + integrity sha512-He6cGWU74tJ6wLYSKrbvWOfIXf2tUu5RcBWqX/2K9Ju00CncF5WRdCOJQisqCtaULcqIqpLvMtz8ZjfpwlBwqg== + dependencies: + path-root "^0.1.1" + resolve "^1.10.0" + resolve-package-path@^1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-1.0.7.tgz#8a0be5165a95bb056580129a422ca89bf4dcae02" @@ -12527,6 +12571,11 @@ slash@^1.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + slice-ansi@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" @@ -13854,7 +13903,7 @@ walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2, walk-sync@^0.3.3: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" -walk-sync@^1.0.0, walk-sync@^1.0.1: +walk-sync@^1.0.0, walk-sync@^1.0.1, walk-sync@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-1.1.3.tgz#3b7b6468f068b5eba2278c931c57db3d39092969" integrity sha512-23ivbET0Q/389y3EHpiIgxx881AS2mwdXA7iBqUDNSymoTPYb2jWlF3gkuuAP1iLgdNXmiHw/kZ/wZwrELU6Ag== From 7b62b3e5c3e0620a11c7c9ebb1e2bf8436ddf5f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 12 Apr 2019 10:48:21 +0000 Subject: [PATCH 377/879] build(deps-dev): bump ember-cli-addon-docs from 0.6.9 to 0.6.10 Bumps [ember-cli-addon-docs](https://github.com/ember-learn/ember-cli-addon-docs) from 0.6.9 to 0.6.10. - [Release notes](https://github.com/ember-learn/ember-cli-addon-docs/releases) - [Changelog](https://github.com/ember-learn/ember-cli-addon-docs/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-learn/ember-cli-addon-docs/compare/v0.6.9...v0.6.10) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index af4a073cb..e44e95fa2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4986,9 +4986,9 @@ ember-cli-addon-docs-esdoc@^0.2.1: walk-sync "^0.3.2" ember-cli-addon-docs@^0.6.4: - version "0.6.9" - resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.9.tgz#343b9d57f2e0c24a6d2b262948d339df93eda4b0" - integrity sha512-xnxJW/BjHVzokmwHIAitvBbSvYR8q0EgrVq0Vaw2v6g1KtqV5jDAuwsSLvcj+s4Ikxg8t9WsoX0Rpv0Ws+tMTQ== + version "0.6.10" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.10.tgz#8a69607e96586826e46e69f6f9878def9af5a07e" + integrity sha512-IJSBx/yXHQQ6tmQjKnM7DLbThOoGOTBgzQogGD8kmHh+dZXdkI350uSGqYo1/sD2OJg89vdEY9eW30kOYZUflQ== dependencies: "@glimmer/syntax" "^0.36.4" broccoli-bridge "^1.0.0" From ae39c90a41e0d80ff86da920ef66875bc92f58dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gast=C3=B3n=20I=2E=20Silva?= Date: Sat, 13 Apr 2019 10:21:36 -0700 Subject: [PATCH 378/879] remove pretender shim (#1503) --- package.json | 2 +- vendor/ember-cli-mirage/pretender-shim.js | 9 --------- yarn.lock | 15 +++++---------- 3 files changed, 6 insertions(+), 20 deletions(-) delete mode 100644 vendor/ember-cli-mirage/pretender-shim.js diff --git a/package.json b/package.json index f576c4199..aa9f9f751 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "ember-get-config": "^0.2.2", "ember-inflector": "^2.0.0 || ^3.0.0", "lodash": "^4.17.11", - "pretender": "2.1.1" + "pretender": "3.0.1" }, "devDependencies": { "@ember/jquery": "^0.6.0", diff --git a/vendor/ember-cli-mirage/pretender-shim.js b/vendor/ember-cli-mirage/pretender-shim.js deleted file mode 100644 index b67c94306..000000000 --- a/vendor/ember-cli-mirage/pretender-shim.js +++ /dev/null @@ -1,9 +0,0 @@ -/* globals Pretender */ - -define('pretender', [], function() { - "use strict"; - - return { - 'default': Pretender - }; -}); diff --git a/yarn.lock b/yarn.lock index e44e95fa2..a6238ccc5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1336,11 +1336,6 @@ "@webassemblyjs/wast-parser" "1.7.11" "@xtuc/long" "4.2.1" -"@xg-wang/whatwg-fetch@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@xg-wang/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#f7b222c012a238e7d6e89ed3d72a1e0edb58453d" - integrity sha512-ULtqA6L75RLzTNW68IiOja0XYv4Ebc3OGMzfia1xxSEMpD0mk/pMvkQX0vbCFyQmKc5xGp80Ms2WiSlXLh8hbA== - "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -11363,14 +11358,14 @@ preserve@^0.2.0: resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= -pretender@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/pretender/-/pretender-2.1.1.tgz#5085f0a1272c31d5b57c488386f69e6ca207cb35" - integrity sha512-IkidsJzaroAanw3I43tKCFm2xCpurkQr9aPXv5/jpN+LfCwDaeI8rngVWtQZTx4qqbhc5zJspnLHJ4N/25KvDQ== +pretender@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.0.1.tgz#817ac43faa3330aa17646968a115f232de10b2ca" + integrity sha512-NO5qK7vJls4uz1NxVKuAY6/aHLOVvchGAvrPWCRHRKpCLquBWQjk3CVx195Hs5yUdcQ4e3OlpUijmOzFzzOmWQ== dependencies: - "@xg-wang/whatwg-fetch" "^3.0.0" fake-xml-http-request "^2.0.0" route-recognizer "^0.3.3" + whatwg-fetch "^3.0.0" pretty-ms@^3.1.0: version "3.2.0" From da705ce8a12950d264f951c6cbe32a68045194a0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 15 Apr 2019 11:05:05 -0400 Subject: [PATCH 379/879] build(deps-dev): bump ember-cli-uglify from 2.1.0 to 3.0.0 (#1583) Bumps [ember-cli-uglify](https://github.com/ember-cli/ember-cli-uglify) from 2.1.0 to 3.0.0. - [Release notes](https://github.com/ember-cli/ember-cli-uglify/releases) - [Changelog](https://github.com/ember-cli/ember-cli-uglify/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-cli-uglify/compare/v2.1.0...v3.0.0) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 129 ++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 114 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index aa9f9f751..2cefc435f 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "ember-cli-release": "^0.2.9", "ember-cli-sri": "^2.1.1", "ember-cli-template-lint": "^1.0.0-beta.1", - "ember-cli-uglify": "^2.1.0", + "ember-cli-uglify": "^3.0.0", "ember-composable-helpers": "^2.1.0", "ember-data": "~3.8.0", "ember-disable-prototype-extensions": "^1.1.3", diff --git a/yarn.lock b/yarn.lock index a6238ccc5..3dcd3b891 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29,6 +29,26 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/core@^7.3.4": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.3.tgz#198d6d3af4567be3989550d97e068de94503074f" + integrity sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.0" + "@babel/helpers" "^7.4.3" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.11" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/generator@^7.3.4": version "7.3.4" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.4.tgz#9aa48c1989257877a9d971296e5b73bfe72e446e" @@ -244,6 +264,15 @@ "@babel/traverse" "^7.1.5" "@babel/types" "^7.2.0" +"@babel/helpers@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.3.tgz#7b1d354363494b31cb9a2417ae86af32b7853a3b" + integrity sha512-BMh7X0oZqb36CfyhvtbSmcWc3GXocfxv3yNsAEuM0l+fAqSO22rQrUpijr3oE/10jCTrB6/0b9kzmG4VetCj8Q== + dependencies: + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + "@babel/highlight@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" @@ -263,6 +292,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.2.tgz#b4521a400cb5a871eab3890787b4bc1326d38d91" integrity sha512-9fJTDipQFvlfSVdD/JBtkiY0br9BtfvW2R8wo6CX/Ej2eMuV0gWPk1M67Mt3eggQvBqYW1FCEk8BN7WvGm/g5g== +"@babel/parser@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.3.tgz#eb3ac80f64aa101c907d4ce5406360fe75b7895b" + integrity sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ== + "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" @@ -668,6 +702,15 @@ "@babel/parser" "^7.2.2" "@babel/types" "^7.2.2" +"@babel/template@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.0.tgz#12474e9c077bae585c5d835a95c0b0b790c25c8b" + integrity sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.4.0" + "@babel/types" "^7.4.0" + "@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.1.6", "@babel/traverse@^7.2.3", "@babel/traverse@^7.3.4": version "7.3.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.3.4.tgz#1330aab72234f8dea091b08c4f8b9d05c7119e06" @@ -698,6 +741,21 @@ globals "^11.1.0" lodash "^4.17.11" +"@babel/traverse@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.3.tgz#1a01f078fc575d589ff30c0f71bf3c3d9ccbad84" + integrity sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/types" "^7.4.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" + "@babel/types@^7.0.0", "@babel/types@^7.1.5", "@babel/types@^7.1.6", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.4": version "7.3.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.4.tgz#bf482eaeaffb367a28abbf9357a94963235d90ed" @@ -3326,22 +3384,22 @@ broccoli-test-helper@^2.0.0: tmp "^0.0.33" walk-sync "^0.3.3" -broccoli-uglify-sourcemap@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/broccoli-uglify-sourcemap/-/broccoli-uglify-sourcemap-2.2.0.tgz#2ff49389bdf342a550c3596750ba2dde95a8f7d4" - integrity sha1-L/STib3zQqVQw1lnULot3pWo99Q= +broccoli-uglify-sourcemap@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/broccoli-uglify-sourcemap/-/broccoli-uglify-sourcemap-3.1.0.tgz#424abcb2c1c70fd1857165c5f191d59a37ee33ff" + integrity sha512-8urQlRfoL6TDP65EylZgbqTwYkSMuZkWE+bwYgC+GMhncSb6bCc0zHn4AGaC+1DRaAsEjb8uyhtYnKCil4NRPA== dependencies: async-promise-queue "^1.0.4" broccoli-plugin "^1.2.1" - debug "^3.1.0" + debug "^4.1.0" lodash.defaultsdeep "^4.6.0" - matcher-collection "^1.0.5" + matcher-collection "^2.0.0" mkdirp "^0.5.0" source-map-url "^0.4.0" symlink-or-copy "^1.0.1" - terser "^3.7.5" - walk-sync "^0.3.2" - workerpool "^2.3.0" + terser "^3.17.0" + walk-sync "^1.1.3" + workerpool "^3.1.2" broccoli-writer@^0.1.1, broccoli-writer@~0.1.1: version "0.1.1" @@ -4129,6 +4187,11 @@ commander@^2.15.1: resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== +commander@^2.19.0: + version "2.20.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" + integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== + commander@^2.6.0: version "2.14.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.0.tgz#7b25325963e6aace20d3a9285b09379b0c2208b5" @@ -5532,12 +5595,12 @@ ember-cli-typescript@^2.0.0-beta.2: stagehand "^1.0.0" walk-sync "^1.0.0" -ember-cli-uglify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ember-cli-uglify/-/ember-cli-uglify-2.1.0.tgz#4a0641fe4768d7ab7d4807aca9924cc77c544184" - integrity sha512-lDzdAUfhGx5AMBsgyR54ibENVp/LRQuHNWNaP2SDjkAXDyuYFgW0iXIAfGbxF6+nYaesJ9Tr9AKOfTPlwxZDSg== +ember-cli-uglify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-uglify/-/ember-cli-uglify-3.0.0.tgz#8819665b2cc5fe70e3ba9fe7a94645209bc42fd6" + integrity sha512-n3QxdBfAgBdb2Cnso82Kt/nxm3ppIjnYWM8uhOEhF1aYxNXfM7AJrc+yiqTCDUR61Db8aCpHfAMvChz3kyme7g== dependencies: - broccoli-uglify-sourcemap "^2.1.1" + broccoli-uglify-sourcemap "^3.1.0" lodash.defaultsdeep "^4.6.0" ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0, ember-cli-version-checker@^2.1.1, ember-cli-version-checker@^2.1.2: @@ -9858,7 +9921,7 @@ match-media@^0.2.0: resolved "https://registry.yarnpkg.com/match-media/-/match-media-0.2.0.tgz#ea4e09742e7253cc7d7e1599ba627e0fa29fbc50" integrity sha1-6k4JdC5yU8x9fhWZumJ+D6KfvFA= -matcher-collection@^1.0.0, matcher-collection@^1.0.4, matcher-collection@^1.0.5: +matcher-collection@^1.0.0, matcher-collection@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.0.5.tgz#2ee095438372cb8884f058234138c05c644ec339" integrity sha512-nUCmzKipcJEwYsBVAFh5P+d7JBuhJaW1xs85Hara9xuMLqtCVUrW6DSC0JVIkluxEH2W45nPBM/wjHtBXa/tYA== @@ -9872,6 +9935,14 @@ matcher-collection@^1.1.1: dependencies: minimatch "^3.0.2" +matcher-collection@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-2.0.0.tgz#470ae263c793e897b3f1e72c695016b7aea355c4" + integrity sha512-wSi4BgQGTFfBN5J+pIaS78rEKk4qIkjrw+NfJYdHsd2cRVIQsbDi3BZtNAXTFA2WHvlbS9kLGtTjv3cPJKuRSw== + dependencies: + "@types/minimatch" "^3.0.3" + minimatch "^3.0.2" + math-random@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" @@ -12728,6 +12799,14 @@ source-map-support@^0.5.0, source-map-support@~0.5.6: buffer-from "^1.0.0" source-map "^0.6.0" +source-map-support@~0.5.10: + version "0.5.12" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" + integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" @@ -13206,7 +13285,16 @@ terser-webpack-plugin@^1.1.0: webpack-sources "^1.1.0" worker-farm "^1.5.2" -terser@^3.7.5, terser@^3.8.1: +terser@^3.17.0: + version "3.17.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2" + integrity sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ== + dependencies: + commander "^2.19.0" + source-map "~0.6.1" + source-map-support "~0.5.10" + +terser@^3.8.1: version "3.14.1" resolved "https://registry.yarnpkg.com/terser/-/terser-3.14.1.tgz#cc4764014af570bc79c79742358bd46926018a32" integrity sha512-NSo3E99QDbYSMeJaEk9YW2lTg3qS9V0aKGlb+PlOrei1X02r1wSBHCNX/O+yeTRFSWPKPIGj6MqvvdqV4rnVGw== @@ -14123,6 +14211,15 @@ workerpool@^3.1.1: dependencies: object-assign "4.1.1" +workerpool@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-3.1.2.tgz#b34e79243647decb174b7481ab5b351dc565c426" + integrity sha512-WJFA0dGqIK7qj7xPTqciWBH5DlJQzoPjsANvc3Y4hNB0SScT+Emjvt0jPPkDBUjBNngX1q9hHgt1Gfwytu6pug== + dependencies: + "@babel/core" "^7.3.4" + object-assign "4.1.1" + rsvp "^4.8.4" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" From c789af2af4535bc5830074fca5031bcc811f7b60 Mon Sep 17 00:00:00 2001 From: Franco Barbeite Date: Tue, 16 Apr 2019 14:33:22 -0400 Subject: [PATCH 380/879] Add Fastboot notice to docs (#1578) * Add Fastboot notice to docs --- .../docs/getting-started/installation/template.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/dummy/app/pods/docs/getting-started/installation/template.md b/tests/dummy/app/pods/docs/getting-started/installation/template.md index db04eba3c..8c094f30b 100644 --- a/tests/dummy/app/pods/docs/getting-started/installation/template.md +++ b/tests/dummy/app/pods/docs/getting-started/installation/template.md @@ -20,3 +20,18 @@ There's an Ember CLI bug that exposes itself when using Prettier + Mirage. A lon ```sh /mirage/mirage ``` + +**Note for FastBoot users** + +You might expect Mirage to serve network requests made by your FastBoot app, but because Mirage runs only in the browser, it currently disables itself if your app is being served by FastBoot. + +[FastBoot support](https://github.com/samselikoff/ember-cli-mirage/issues/1411) is a highly requested feature we are working on. In the meantime, you'll need to develop your FastBoot pages against a local server. + +You can always bypass FastBoot page generation locally by running + +```sh +FASTBOOT_DISABLED=true ember serve +``` +Mirage will then run in the browser as expected, and you can develop your client app as normal. + + From 405d78a4da3ae8065b4b84e156b1cb32f909b0ea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Wed, 17 Apr 2019 08:00:05 -0400 Subject: [PATCH 381/879] build(deps-dev): bump escape-string-regexp from 1.0.5 to 2.0.0 (#1584) Bumps [escape-string-regexp](https://github.com/sindresorhus/escape-string-regexp) from 1.0.5 to 2.0.0. - [Release notes](https://github.com/sindresorhus/escape-string-regexp/releases) - [Commits](https://github.com/sindresorhus/escape-string-regexp/compare/v1.0.5...v2.0.0) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 2cefc435f..0576f53f2 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,7 @@ "ember-source": "~3.9.0", "ember-source-channel-url": "^1.1.0", "ember-try": "^1.0.0", - "escape-string-regexp": "^1.0.5", + "escape-string-regexp": "^2.0.0", "eslint-plugin-ember": "^6.2.0", "eslint-plugin-ember-suave": "^1.0.0", "eslint-plugin-node": "^8.0.1", diff --git a/yarn.lock b/yarn.lock index 3dcd3b891..ef671a386 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6312,6 +6312,11 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + escodegen@^1.11.0, escodegen@^1.6.1, escodegen@^1.9.1: version "1.11.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" From ea53b9ab5f9ccc25ec1fc72f0cdca14a0018e7a7 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 17 Apr 2019 10:01:51 -0400 Subject: [PATCH 382/879] Update template.md --- .../dummy/app/pods/docs/getting-started/quickstart/template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dummy/app/pods/docs/getting-started/quickstart/template.md b/tests/dummy/app/pods/docs/getting-started/quickstart/template.md index 05f095daa..d7884354f 100644 --- a/tests/dummy/app/pods/docs/getting-started/quickstart/template.md +++ b/tests/dummy/app/pods/docs/getting-started/quickstart/template.md @@ -241,7 +241,7 @@ With the above config, a GET to `/authors/1` would return something like */ ``` -Mirage ships with two named serializers, JSONAPISerializer and ActiveModelSerializer, to save you the trouble of writing this custom code yourself. See the [serializer guide](../serializers) to learn more. +Mirage ships with two named serializers, JSONAPISerializer and ActiveModelSerializer, to save you the trouble of writing this custom code yourself. See the [serializer guide](./api/modules/ember-cli-mirage/serializer~Serializer) to learn more. ## Shorthands From 902ee46754e00eec00a0da10b775ac8a5c0851ca Mon Sep 17 00:00:00 2001 From: Jamie White Date: Wed, 17 Apr 2019 15:02:30 +0100 Subject: [PATCH 383/879] Fix a tiny typo in the inline docs for Schema (#1587) --- addon/orm/schema.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addon/orm/schema.js b/addon/orm/schema.js index 5fdfedbfa..0faa90b10 100644 --- a/addon/orm/schema.js +++ b/addon/orm/schema.js @@ -8,7 +8,7 @@ import _includes from 'lodash/includes'; import assert from '../assert'; /** - The primary use of the `Schema` class is to use it to find Models and Collectiosn via the `Model` class methods. + The primary use of the `Schema` class is to use it to find Models and Collections via the `Model` class methods. The `Schema` is most often accessed via the first parameter to a route handler: From d8162424b15dd32753d453bdb797384314e006a8 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 17 Apr 2019 10:03:13 -0400 Subject: [PATCH 384/879] Resolves or rejects all promises, removes extra logging (#1586) Many promises were being swallowed because I think I originally wrote this code when I didn't understand promises. I always had the extra console.log lines because I couldn't figure out how to get the error messages to consistently show up. Now that all promises in the request-response cycle are always being either resolved or rejected, we can rely on upstream tooling to properly display error messages (both in dev and in testing). The console.log noise was also problematic when testing errors or in some of our recent work getting Mirage to run in express. If anybody starts using these changes and feel it obfuscates Mirage's error messaging too much please let me know. I'm still not 100% satisfied with the state of error handling in many code paths in modern Ember app development and not sure the best way to reliably and consistently show a simple message to the user. --- addon/assert.js | 3 - addon/route-handler.js | 55 +++++++++---------- addon/server.js | 14 ++--- .../function-handler/basic-test.js | 22 ++++---- .../normalize-request-attrs-test.js | 45 +++++---------- .../function-handler/serialize-test.js | 12 ++-- 6 files changed, 63 insertions(+), 88 deletions(-) diff --git a/addon/assert.js b/addon/assert.js index 8a5e58140..dac61d35c 100644 --- a/addon/assert.js +++ b/addon/assert.js @@ -45,9 +45,6 @@ export function MirageError(message, stack) { this[prop] = tmp[prop]; } } - - console.error(this.message); - console.error(this); } MirageError.prototype = Object.create(Error.prototype); diff --git a/addon/route-handler.js b/addon/route-handler.js index ba5c2891c..c74489efa 100644 --- a/addon/route-handler.js +++ b/addon/route-handler.js @@ -1,5 +1,5 @@ import { Promise } from 'rsvp'; -import { MirageError, logger } from 'ember-cli-mirage/assert'; +import { MirageError } from 'ember-cli-mirage/assert'; import Response from './response'; import FunctionHandler from './route-handlers/function'; import ObjectHandler from './route-handlers/object'; @@ -47,13 +47,11 @@ export default class RouteHandler { } handle(request) { - return new Promise(resolve => { - this._getMirageResponseForRequest(request).then(mirageResponse => { - this.serialize(mirageResponse, request).then(serializedMirageResponse => { - resolve(serializedMirageResponse.toRackResponse()); - }); + return this._getMirageResponseForRequest(request) + .then(mirageResponse => this.serialize(mirageResponse, request)) + .then(serializedMirageResponse => { + return serializedMirageResponse.toRackResponse(); }); - }); } _getMirageResponseForRequest(request) { @@ -70,12 +68,15 @@ export default class RouteHandler { result = this.handler.handle(request); } catch(e) { if (e instanceof MirageError) { - throw e; + result = new Response(500, {}, e); } else { - logger.error(`Mirage: Your ${request.method} handler for the url ${request.url} threw an error:\n\n${e.stack || e}`); + let message = e.message || e; - result = new Response(500, {}, e.message || e); + result = new Response(500, {}, { + message, + stack: `Mirage: Your ${request.method} handler for the url ${request.url} threw an error:\n\n${e.stack || e}` + }); } } @@ -85,17 +86,18 @@ export default class RouteHandler { _toMirageResponse(result) { let mirageResponse; - return new Promise(resolve => { - Promise.resolve(result).then(response => { - if (response instanceof Response) { - mirageResponse = result; - } else { - let code = this._getCodeForResponse(response); - mirageResponse = new Response(code, {}, response); - } - resolve(mirageResponse); - }); - + return new Promise((resolve, reject) => { + Promise.resolve(result) + .then(response => { + if (response instanceof Response) { + mirageResponse = result; + } else { + let code = this._getCodeForResponse(response); + mirageResponse = new Response(code, {}, response); + } + resolve(mirageResponse); + }) + .catch(reject); }); } @@ -113,12 +115,9 @@ export default class RouteHandler { return code; } - serialize(mirageResponsePromise, request) { - return new Promise(resolve => { - Promise.resolve(mirageResponsePromise).then(mirageResponse => { - mirageResponse.data = this.serializerOrRegistry.serialize(mirageResponse.data, request); - resolve(mirageResponse); - }); - }); + serialize(mirageResponse, request) { + mirageResponse.data = this.serializerOrRegistry.serialize(mirageResponse.data, request); + + return mirageResponse; } } diff --git a/addon/server.js b/addon/server.js index 1cb19bcea..a52a1d37b 100644 --- a/addon/server.js +++ b/addon/server.js @@ -1,6 +1,5 @@ /* eslint no-console: 0 */ -import { Promise } from 'rsvp'; import { singularize, pluralize, camelize } from './utils/inflector'; import { toCollectionName, toInternalCollectionName } from 'ember-cli-mirage/utils/normalize-name'; import { getModels } from './ember-data'; @@ -68,10 +67,7 @@ function createPretender(server) { this.unhandledRequest = function(verb, path) { path = decodeURI(path); assert( - `Your Ember app tried to ${verb} '${path}', - but there was no route defined to handle this request. - Define a route that matches this path in your - mirage/config.js file. Did you forget to add your namespace?` + `Your Ember app tried to ${verb} '${path}', but there was no route defined to handle this request. Define a route that matches this path in your mirage/config.js file. Did you forget to add your namespace?` ); }; }, { trackRequests: server.shouldTrackRequests() }); @@ -857,12 +853,12 @@ export default class Server { return this.pretender[verb]( fullPath, (request) => { - return new Promise(resolve => { - Promise.resolve(routeHandler.handle(request)).then(mirageResponse => { + return routeHandler.handle(request) + .then(mirageResponse => { let [ code, headers, response ] = mirageResponse; - resolve([ code, headers, this._serialize(response) ]); + + return [ code, headers, this._serialize(response) ]; }); - }); }, timing ); diff --git a/tests/integration/route-handlers/function-handler/basic-test.js b/tests/integration/route-handlers/function-handler/basic-test.js index 12c08f813..f11e4ff2d 100644 --- a/tests/integration/route-handlers/function-handler/basic-test.js +++ b/tests/integration/route-handlers/function-handler/basic-test.js @@ -3,7 +3,6 @@ import { Promise } from 'rsvp'; import { Model, ActiveModelSerializer, Response } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; import promiseAjax from '../../../helpers/promise-ajax'; -import { logger } from 'ember-cli-mirage/assert'; module('Integration | Route handlers | Function handler', function(hooks) { hooks.beforeEach(function() { @@ -33,17 +32,16 @@ module('Integration | Route handlers | Function handler', function(hooks) { throw 'I goofed'; }); - try { - await promiseAjax({ - method: 'GET', - url: '/users' - }); - } catch(e) { - assert.equal(e.xhr.responseText, 'I goofed'); - assert.equal(logger.messages.length, 1); - assert.ok(logger.messages[0].match(`Mirage: Your GET handler for the url /users threw an error:`)); - assert.ok(logger.messages[0].match(`I goofed`)); - } + assert.rejects( + promiseAjax({ method: 'GET', url: '/users' }), + function(ajaxError) { + let text = ajaxError.xhr.responseText; + let line1 = text.indexOf(`Mirage: Your GET handler for the url /users threw an error`) > 0; + let line2 = text.indexOf(`I goofed`) > 0; + + return line1 && line2; + } + ); }); test('mirage response string is not serialized to string', async function(assert) { diff --git a/tests/integration/route-handlers/function-handler/normalize-request-attrs-test.js b/tests/integration/route-handlers/function-handler/normalize-request-attrs-test.js index e69d1fe7b..0c0158218 100644 --- a/tests/integration/route-handlers/function-handler/normalize-request-attrs-test.js +++ b/tests/integration/route-handlers/function-handler/normalize-request-attrs-test.js @@ -2,7 +2,6 @@ import { module, test } from 'qunit'; import { Model, ActiveModelSerializer } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; import promiseAjax from '../../../helpers/promise-ajax'; -import regExpFromString from '../../../helpers/reg-exp-from-string'; module('Integration | Route handlers | Function handler | #normalizedRequestAttrs', function(hooks) { hooks.beforeEach(function() { @@ -84,25 +83,15 @@ module('Integration | Route handlers | Function handler | #normalizedRequestAttr assert.expect(1); this.server.post('/users/create', function() { - assert.throws(() => { - this.normalizedRequestAttrs(); - }, /the detected model of 'create' does not exist/); - - return {}; + this.normalizedRequestAttrs(); }); - await promiseAjax({ - method: 'POST', - url: '/users/create', - contentType: 'application/json', - data: JSON.stringify({ - user: { - first_name: 'Sam', - last_name: 'Selikoff', - team_id: 1 - } - }) - }); + assert.rejects( + promiseAjax({ method: 'POST', url: '/users/create' }), + function(ajaxError) { + return ajaxError.xhr.responseText.indexOf(`the detected model of 'create' does not exist`) > -1; + } + ); }); test(`it accepts an optional modelName if it cannot be inferred from the path `, async function(assert) { @@ -138,21 +127,15 @@ module('Integration | Route handlers | Function handler | #normalizedRequestAttr assert.expect(1); this.server.post('/fine-comments/create', function() { - assert.throws(() => { - this.normalizedRequestAttrs('fineComment'); - }, regExpFromString(`You called normalizedRequestAttrs('fineComment'), but normalizedRequestAttrs was intended to be used with the dasherized version of the model type. Please change this to normalizedRequestAttrs('fine-comment')`)); + this.normalizedRequestAttrs('fineComment'); }); - await promiseAjax({ - method: 'POST', - url: '/fine-comments/create', - contentType: 'application/json', - data: JSON.stringify({ - user: { - short_text: 'lorem ipsum' - } - }) - }); + assert.rejects( + promiseAjax({ method: 'POST', url: '/fine-comments/create' }), + function(ajaxError) { + return ajaxError.xhr.responseText.indexOf(`You called normalizedRequestAttrs('fineComment'), but normalizedRequestAttrs was intended to be used with the dasherized version of the model type. Please change this to normalizedRequestAttrs('fine-comment')`) > 0; + } + ); }); test(`it works with a form encoded request that has a lower-case content-type (issue 1398)`, async function(assert) { diff --git a/tests/integration/route-handlers/function-handler/serialize-test.js b/tests/integration/route-handlers/function-handler/serialize-test.js index ce8419dca..9bea8f3f0 100644 --- a/tests/integration/route-handlers/function-handler/serialize-test.js +++ b/tests/integration/route-handlers/function-handler/serialize-test.js @@ -97,16 +97,18 @@ module('Integration | Route handlers | Function handler | #serialize', function( assert.expect(1); this.server.create('user', { name: 'Sam' }); - this.server.get('/users', function(schema) { let users = schema.users.all(); - assert.throws(() => { - this.serialize(users, 'foo-user'); - }, /that serializer doesn't exist/); + this.serialize(users, 'foo-user'); }); - await promiseAjax({ method: 'GET', url: '/users' }); + assert.rejects( + promiseAjax({ method: 'GET', url: '/users' }), + function(ajaxError) { + return ajaxError.xhr.responseText.indexOf(`that serializer doesn't exist`) > 0; + } + ); }); test('it noops on plain JS arrays', async function(assert) { From 626aa3e72bec96e684f83ea445b68069746c97ef Mon Sep 17 00:00:00 2001 From: Jean-Philippe Roy Date: Wed, 17 Apr 2019 17:56:37 -0400 Subject: [PATCH 385/879] Tests coverage for Schema.first() and Schema.findBy() (#1589) * Add tests for Schema.first and Schema.findBy on empty schemas. * Remove `bower i` from CONTRIBUTING since no bower.json file exists --- CONTRIBUTING.md | 10 +++++----- addon/orm/schema.js | 4 ++++ tests/unit/schema-test.js | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 677d8587b..00d0162bc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -18,20 +18,20 @@ To make more substantial changes, you'll want to be able to write locally. The d git clone git@github.com:[your-name]/ember-cli-mirage.git cd ember-cli-mirage ``` - + 2. Checkout the `gh-pages` branch: ``` git checkout gh-pages ``` - + 3. Start the Jekyll build: ``` bundle install bundle exec jekyll serve --watch --baseurl '' ``` - + You should be able to visit `localhost:4000` and see the docs site running locally. Now checkout a new branch, make your changes, and submit a PR! @@ -45,7 +45,7 @@ To help out with Mirage development, first pull down the project locally and ver git clone git@github.com:[your-name]/ember-cli-mirage.git cd ember-cli-mirage ``` - + 2. Ensure `node` is installed. I use version 4.2.x, the LTS release. - Ensure `npm` is installed 3. Ensure `ember-cli` is installed: `npm install -g ember-cli` @@ -53,7 +53,7 @@ To help out with Mirage development, first pull down the project locally and ver 5. Install dependencies and run the tests: ``` - npm i && bower i + npm i ember test ``` diff --git a/addon/orm/schema.js b/addon/orm/schema.js index 0faa90b10..aaaaf82e1 100644 --- a/addon/orm/schema.js +++ b/addon/orm/schema.js @@ -252,6 +252,8 @@ export default class Schema { let post = blogPosts.findBy({ published: true }); ``` + N.B. This will return `null` if the schema doesn't have any matching record. + @method findBy @param type @param attributeName @@ -290,6 +292,8 @@ export default class Schema { let post = blogPosts.first(); ``` + N.B. This will return `null` if the schema doesn't contain any records. + @method first @param type @public diff --git a/tests/unit/schema-test.js b/tests/unit/schema-test.js index e79edcd07..dba92642d 100644 --- a/tests/unit/schema-test.js +++ b/tests/unit/schema-test.js @@ -33,4 +33,37 @@ module('Unit | Schema', function() { assert.deepEqual(schema.modelFor('article').foreignKeys, ['authorId']); assert.deepEqual(schema.modelFor('author').foreignKeys, []); }); + + test('`first()` returns null when nothing is found', function(assert) { + assert.expect(2); + + let db = new Db(); + let schema = new Schema(db); + + let authorModel = Model.extend({}); + schema.registerModel('author', authorModel); + + assert.equal(schema.first('author'), null); + + let record = schema.create('author', { id: 1, name: 'Mary Roach' }); + + assert.deepEqual(schema.first('author'), record); + }); + + test('`findBy()` returns null when nothing is found', function(assert) { + assert.expect(3); + + let db = new Db(); + let schema = new Schema(db); + + let authorModel = Model.extend({}); + schema.registerModel('author', authorModel); + + assert.deepEqual(schema.findBy('author', { name: 'Mary Roach' }), null); + + let record = schema.create('author', { id: 1, name: 'Mary Roach' }); + + assert.deepEqual(schema.findBy('author', { name: 'Mary Roach' }), record); + assert.equal(schema.findBy('author', { name: 'Charles Dickens' }), null); + }); }); From 3df9ae92d0bb133ff7f74f4d3129b0c5539bb8dd Mon Sep 17 00:00:00 2001 From: Luke Melia Date: Wed, 17 Apr 2019 17:57:23 -0400 Subject: [PATCH 386/879] Adds overridable shouldIncludeLinkageData method to JsonApiSerializer (#1590) - allows for per-relationship inclusion of linkage data - use this when alwaysIncludeLinkageData is not granular enough Example: ```js export default JSONAPISerializer.extend({ shouldIncludeLinkageData(relationshipKey, model) { if (relationshipKey === 'author' || relationshipKey === 'ghostWriter') { return true; } return false; } }) ``` @mattmcmanus & @lukemelia --- addon/serializers/json-api-serializer.js | 6 +- .../associations/collection-test.js | 45 ++++++++++++ .../associations/model-test.js | 73 +++++++++++++++++++ 3 files changed, 123 insertions(+), 1 deletion(-) diff --git a/addon/serializers/json-api-serializer.js b/addon/serializers/json-api-serializer.js index ce8376a2b..8b4e1433f 100644 --- a/addon/serializers/json-api-serializer.js +++ b/addon/serializers/json-api-serializer.js @@ -163,7 +163,7 @@ const JSONAPISerializer = Serializer.extend({ relationshipHash.links = links[key]; } - if (this.alwaysIncludeLinkageData || this._relationshipIsIncludedForModel(key, model)) { + if (this.alwaysIncludeLinkageData || this.shouldIncludeLinkageData(key, model) || this._relationshipIsIncludedForModel(key, model)) { let data = null; if (this.isModel(relationship)) { data = { @@ -372,6 +372,10 @@ const JSONAPISerializer = Serializer.extend({ return ids.split(','); } return ids; + }, + + shouldIncludeLinkageData(relationshipKey, model) { + return false; } }); diff --git a/tests/integration/serializers/json-api-serializer/associations/collection-test.js b/tests/integration/serializers/json-api-serializer/associations/collection-test.js index 47cf84066..7f877e70b 100644 --- a/tests/integration/serializers/json-api-serializer/associations/collection-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/collection-test.js @@ -90,6 +90,51 @@ module('Integration | Serializers | JSON API Serializer | Associations | Collect }); }); + test(`when shouldIncludeLinkageData returns true for a relationship, it contains linkage data for that relationship on all of the collection, regardless of includes`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer.extend({ + shouldIncludeLinkageData(relationshipKey, model) { + if (relationshipKey == 'posts') { + return true; + } + } + }) + }); + this.schema.wordSmiths.create({ firstName: 'Link', age: 123 }); + this.schema.wordSmiths.create({ firstName: 'Zelda', age: 456 }); + + let collection = this.schema.wordSmiths.all(); + let result = registry.serialize(collection); + + assert.deepEqual(result, { + data: [{ + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link', + age: 123 + }, + relationships: { + 'posts': { + data: [] + } + } + }, { + type: 'word-smiths', + id: '2', + attributes: { + 'first-name': 'Zelda', + age: 456 + }, + relationships: { + 'posts': { + data: [] + } + } + }] + }); + }); + test(`it includes linkage data for a has-many relationship that's being included`, function(assert) { let registry = new SerializerRegistry(this.schema, { application: JSONAPISerializer, diff --git a/tests/integration/serializers/json-api-serializer/associations/model-test.js b/tests/integration/serializers/json-api-serializer/associations/model-test.js index bb81975ab..3f975bd79 100644 --- a/tests/integration/serializers/json-api-serializer/associations/model-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/model-test.js @@ -77,6 +77,79 @@ module('Integration | Serializers | JSON API Serializer | Associations | Model', }); }); + test(`when shouldIncludeLinkageData returns true for a certain belongsTo relationship, it contains linkage data for that relationship, regardless of includes`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer.extend({ + shouldIncludeLinkageData(relationshipKey, model) { + if (relationshipKey === 'wordSmith') { + return true; + } + } + }) + }); + let link = this.schema.wordSmiths.create({ + firstName: 'Link', + age: 123 + }); + let post = link.createBlogPost({ title: 'Lorem ipsum' }); + + let result = registry.serialize(post); + assert.deepEqual(result, { + data: { + type: 'blog-posts', + id: '1', + attributes: { + 'title': 'Lorem ipsum' + }, + relationships: { + 'word-smith': { + data: { + type: 'word-smiths', + id: '1' + } + } + } + } + }); + }); + + test(`when shouldIncludeLinkageData returns true for a certain hasMany relationship, it contains linkage data for that relationship, regardless of includes`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + wordSmith: JSONAPISerializer.extend({ + shouldIncludeLinkageData(relationshipKey, model) { + if (relationshipKey === 'blogPosts') { + return true; + } + } + }) + }); + + let link = this.schema.wordSmiths.create({ firstName: 'Link' }); + link.createBlogPost({ title: 'Lorem' }); + link.createBlogPost({ title: 'Ipsum' }); + + let result = registry.serialize(link); + + assert.deepEqual(result, { + data: { + type: 'word-smiths', + id: '1', + attributes: { + 'first-name': 'Link' + }, + relationships: { + 'blog-posts': { + data: [ + { type: 'blog-posts', id: '1' }, + { type: 'blog-posts', id: '2' } + ] + } + } + } + }); + }); + test(`it includes linkage data for a has-many relationship that's being included`, function(assert) { let registry = new SerializerRegistry(this.schema, { application: JSONAPISerializer, From df5b8890dd97d52e91b6d7b486e54c2a7157d895 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 19 Apr 2019 10:37:16 +0000 Subject: [PATCH 387/879] build(deps): bump ember-auto-import from 1.2.21 to 1.3.0 Bumps [ember-auto-import](https://github.com/ef4/ember-auto-import) from 1.2.21 to 1.3.0. - [Release notes](https://github.com/ef4/ember-auto-import/releases) - [Changelog](https://github.com/ef4/ember-auto-import/blob/master/CHANGELOG.md) - [Commits](https://github.com/ef4/ember-auto-import/commits) Signed-off-by: dependabot[bot] --- yarn.lock | 95 +++++-------------------------------------------------- 1 file changed, 8 insertions(+), 87 deletions(-) diff --git a/yarn.lock b/yarn.lock index ef671a386..ff4397188 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,27 +9,7 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.3.3": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.3.4.tgz#921a5a13746c21e32445bf0798680e9d11a6530b" - integrity sha512-jRsuseXBo9pN197KnDwhhaaBzyZr2oIcLHHTt2oDdQrej5Qp57dCCJafWx5ivU8/alEYDpssYqv1MUqcxwQlrA== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.3.4" - "@babel/helpers" "^7.2.0" - "@babel/parser" "^7.3.4" - "@babel/template" "^7.2.2" - "@babel/traverse" "^7.3.4" - "@babel/types" "^7.3.4" - convert-source-map "^1.1.0" - debug "^4.1.0" - json5 "^2.1.0" - lodash "^4.17.11" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.3.4": +"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.3.3", "@babel/core@^7.3.4": version "7.4.3" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.3.tgz#198d6d3af4567be3989550d97e068de94503074f" integrity sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA== @@ -49,17 +29,6 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.4.tgz#9aa48c1989257877a9d971296e5b73bfe72e446e" - integrity sha512-8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg== - dependencies: - "@babel/types" "^7.3.4" - jsesc "^2.5.1" - lodash "^4.17.11" - source-map "^0.5.0" - trim-right "^1.0.1" - "@babel/generator@^7.4.0": version "7.4.0" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.0.tgz#c230e79589ae7a729fd4631b9ded4dc220418196" @@ -255,15 +224,6 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.2.0" -"@babel/helpers@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.2.0.tgz#8335f3140f3144270dc63c4732a4f8b0a50b7a21" - integrity sha512-Fr07N+ea0dMcMN8nFpuK6dUIT7/ivt9yKQdEEnjVS83tG2pHwPi03gYmk/tyuwONnZ+sY+GFFPlWGgCtW1hF9A== - dependencies: - "@babel/template" "^7.1.2" - "@babel/traverse" "^7.1.5" - "@babel/types" "^7.2.0" - "@babel/helpers@^7.4.3": version "7.4.3" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.3.tgz#7b1d354363494b31cb9a2417ae86af32b7853a3b" @@ -282,7 +242,7 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.2.2", "@babel/parser@^7.3.4": +"@babel/parser@^7.0.0", "@babel/parser@^7.2.2": version "7.3.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.4.tgz#a43357e4bbf4b92a437fb9e465c192848287f27c" integrity sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ== @@ -693,7 +653,7 @@ dependencies: regenerator-runtime "^0.12.0" -"@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.2.2": +"@babel/template@^7.1.0", "@babel/template@^7.2.2": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" integrity sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g== @@ -711,37 +671,7 @@ "@babel/parser" "^7.4.0" "@babel/types" "^7.4.0" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.1.6", "@babel/traverse@^7.2.3", "@babel/traverse@^7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.3.4.tgz#1330aab72234f8dea091b08c4f8b9d05c7119e06" - integrity sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.3.4" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/parser" "^7.3.4" - "@babel/types" "^7.3.4" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.11" - -"@babel/traverse@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.0.tgz#14006967dd1d2b3494cdd650c686db9daf0ddada" - integrity sha512-/DtIHKfyg2bBKnIN+BItaIlEg5pjAnzHOIQe5w+rHAw/rg9g0V7T4rqPX8BJPfW11kt3koyjAnTNwCzb28Y1PA== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.4.0" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.0" - "@babel/parser" "^7.4.0" - "@babel/types" "^7.4.0" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.11" - -"@babel/traverse@^7.4.3": +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.2.3", "@babel/traverse@^7.4.0", "@babel/traverse@^7.4.3": version "7.4.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.3.tgz#1a01f078fc575d589ff30c0f71bf3c3d9ccbad84" integrity sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ== @@ -756,16 +686,7 @@ globals "^11.1.0" lodash "^4.17.11" -"@babel/types@^7.0.0", "@babel/types@^7.1.5", "@babel/types@^7.1.6", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.4.tgz#bf482eaeaffb367a28abbf9357a94963235d90ed" - integrity sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ== - dependencies: - esutils "^2.0.2" - lodash "^4.17.11" - to-fast-properties "^2.0.0" - -"@babel/types@^7.4.0": +"@babel/types@^7.0.0", "@babel/types@^7.1.5", "@babel/types@^7.1.6", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.4.0": version "7.4.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.0.tgz#670724f77d24cce6cc7d8cf64599d511d164894c" integrity sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA== @@ -4998,9 +4919,9 @@ ember-assign-polyfill@~2.4.0: ember-cli-version-checker "^2.0.0" ember-auto-import@^1.2.19: - version "1.2.21" - resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.2.21.tgz#e02ded183844faba66c3f2af97028ef35175b837" - integrity sha512-coHnqO3mRnlj/JAQSQBEqzX2wL8rH5YrfEJMzk1102X9MdSX1CWeaUYBcyjvI/pG8fHUhv+4VsD6rQuhTUyZUQ== + version "1.3.0" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.3.0.tgz#0d0988790e60847315f9bba758299226a3ba75c6" + integrity sha512-Fiw0lVSdARFI6/ewq7zDPmfC6+Ss+qIV6Xp0iwhlJOPa6HP1KpNodPXBnmzppMdnGMsnT72YdMgPbVXsyWMu8A== dependencies: "@babel/core" "^7.1.6" "@babel/traverse" "^7.1.6" From 61e5d7e3074d09943e6dce7691d012c2467935e3 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 20 Apr 2019 15:02:03 -0400 Subject: [PATCH 388/879] remove unused npmAsset (#1593) --- index.js | 23 ----------------------- package.json | 1 - yarn.lock | 2 +- 3 files changed, 1 insertion(+), 25 deletions(-) diff --git a/index.js b/index.js index f8b54fdad..dab938280 100644 --- a/index.js +++ b/index.js @@ -2,7 +2,6 @@ const path = require('path'); const mergeTrees = require('broccoli-merge-trees'); const Funnel = require('broccoli-funnel'); -const map = require('broccoli-stew').map; const writeFile = require('broccoli-file-creator'); module.exports = { @@ -120,25 +119,3 @@ module.exports = { return enabledInProd || (environment && environment !== 'production' && explicitExcludeFiles !== true); } }; - -function npmAsset(options = {}) { - let defaultOptions = { - // guard against usage in FastBoot 1.0, where process.env.EMBER_CLI_FASTBOOT is not available - _processTree(input) { - return map(input, content => `if (typeof FastBoot !== 'undefined') { ${content} }`); - } - }; - - let assetOptions = Object.assign(defaultOptions, options); - - return function() { - let finalOptions = Object.assign( - assetOptions, - { - enabled: this._shouldIncludeFiles() - } - ); - - return finalOptions; - }; -} diff --git a/package.json b/package.json index 0576f53f2..b728f873e 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,6 @@ "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^2.0.1", "broccoli-merge-trees": "^3.0.2", - "broccoli-stew": "^2.0.1", "broccoli-string-replace": "^0.1.2", "chalk": "^2.4.2", "ember-auto-import": "^1.2.19", diff --git a/yarn.lock b/yarn.lock index ff4397188..4c05b8e14 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3221,7 +3221,7 @@ broccoli-stew@^1.4.2, broccoli-stew@^1.5.0: symlink-or-copy "^1.2.0" walk-sync "^0.3.0" -broccoli-stew@^2.0.0, broccoli-stew@^2.0.1: +broccoli-stew@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-2.1.0.tgz#ba73add17fda3b9b01d8cfb343a8b613b7136a0a" integrity sha512-tgCkuTWYl4uf7k7ib2D79KFEj2hCgnTUNPMnrCoAha0/4bywcNccmaZVWtL9Ex37yX5h5eAbnM/ak2ULoMwSSw== From 41f436dd39ff11ea7f4415f999a239c20d36706a Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sun, 21 Apr 2019 14:26:10 -0400 Subject: [PATCH 389/879] Fix shorthands link --- .../dummy/app/pods/docs/getting-started/quickstart/template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dummy/app/pods/docs/getting-started/quickstart/template.md b/tests/dummy/app/pods/docs/getting-started/quickstart/template.md index d7884354f..80936c064 100644 --- a/tests/dummy/app/pods/docs/getting-started/quickstart/template.md +++ b/tests/dummy/app/pods/docs/getting-started/quickstart/template.md @@ -246,7 +246,7 @@ Mirage ships with two named serializers, JSONAPISerializer and ActiveModelSerial ## Shorthands Mirage has *shorthands* to reduce the code needed for conventional API routes. For example, the route handler From 497e7d23d44bfe01be1cb35d80f480546d496cdd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 22 Apr 2019 10:35:21 +0000 Subject: [PATCH 390/879] build(deps-dev): bump eslint-plugin-ember from 6.3.0 to 6.4.1 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 6.3.0 to 6.4.1. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v6.3.0...v6.4.1) Signed-off-by: dependabot[bot] --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4c05b8e14..d975d1d3c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5930,10 +5930,10 @@ ember-responsive@^3.0.0-beta.1: dependencies: ember-cli-babel "^6.6.0" -ember-rfc176-data@^0.3.8: - version "0.3.8" - resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.8.tgz#d46bbef9a0d57c803217b258cfd2e90d8e191848" - integrity sha512-SQup3iG7SDLZNuf7nMMx5BC5truO8AYKRi80gApeQ07NsbuXV4LH75i5eOaxF0i8l9+H1tzv34kGe6rEh0C1NQ== +ember-rfc176-data@^0.3.8, ember-rfc176-data@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.9.tgz#44b6e051ead6c044ea87bd551f402e2cf89a7e3d" + integrity sha512-EiTo5YQS0Duy0xp9gCP8ekzv9vxirNi7MnIB4zWs+thtWp/mEKgf5mkiiLU2+oo8C5DuavVHhoPQDmyxh8Io1Q== ember-router-generator@^1.2.3: version "1.2.3" @@ -6284,11 +6284,11 @@ eslint-plugin-ember-suave@^1.0.0: requireindex "~1.1.0" eslint-plugin-ember@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-6.3.0.tgz#92512711deb440dfac62a52a2c15b1f91ee0f23a" - integrity sha512-jXTPtrhEQg41A5u2rwsuh1m9R5e8qTCY04Pi6rXEZ/c3KUSRkYlIKA+GDLR1qy/JcgAR2X8Y8Xvec8imDK6b4A== + version "6.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-6.4.1.tgz#9b6fc99bbd86b4f43e9098a5c07c446eb2e64a08" + integrity sha512-eNzB3t/S4tR+4OhOucufIWs1UUzftxYrk97L7yErz5ETVXht6nEenV7T9FXt+wB2OBMWnlHvCeaSyhhaAR1DBw== dependencies: - ember-rfc176-data "^0.3.8" + ember-rfc176-data "^0.3.9" snake-case "^2.1.0" eslint-plugin-es@^1.3.1: From efa5e2a9a0361f2e196b150f0e86d5cbcaeacf13 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 22 Apr 2019 09:57:49 -0400 Subject: [PATCH 391/879] Document and cleanup JSONAPISerializer (#1595) - Make it an ES6 class and share `extends` from base `Serializer` class --- addon/assert.js | 3 + addon/serializers/json-api-serializer.js | 241 +++++++++++++++++++---- 2 files changed, 211 insertions(+), 33 deletions(-) diff --git a/addon/assert.js b/addon/assert.js index dac61d35c..4342d2644 100644 --- a/addon/assert.js +++ b/addon/assert.js @@ -49,6 +49,9 @@ export function MirageError(message, stack) { MirageError.prototype = Object.create(Error.prototype); +/** + @hide +*/ export const logger = { errors: [], diff --git a/addon/serializers/json-api-serializer.js b/addon/serializers/json-api-serializer.js index 8b4e1433f..5ea7ebf9b 100644 --- a/addon/serializers/json-api-serializer.js +++ b/addon/serializers/json-api-serializer.js @@ -8,35 +8,171 @@ import _isEmpty from 'lodash/isEmpty'; import assert from 'ember-cli-mirage/assert'; /** - The JSONAPISerializer. + The JSONAPISerializer. Subclass of Serializer. + + Please use + + ```js + import { JSONAPISerializer } from 'ember-cli-mirage'; + ``` + + instead of the full import path below. @class JSONAPISerializer @constructor @public - @hide */ -const JSONAPISerializer = Serializer.extend({ +class JSONAPISerializer extends Serializer { - /** - Do something. - @property keyForModel - @public - */ + constructor() { + super(...arguments); + + /** + By default, JSON:API's linkage data is only added for relationships that are being included in the current request. + + That means given an `author` model with a `posts` relationship, a GET request to /authors/1 would return a JSON:API document with an empty `relationships` hash: + + ```js + { + data: { + type: 'authors', + id: '1', + attributes: { ... } + } + } + ``` + + but a request to GET /authors/1?include=posts would have linkage data added (in addition to the included resources): + + ```js + { + data: { + type: 'authors', + id: '1', + attributes: { ... }, + relationships: { + data: [ + { type: 'posts', id: '1' }, + { type: 'posts', id: '2' }, + { type: 'posts', id: '3' } + ] + } + }, + included: [ ... ] + } + ``` + + To add the linkage data for all relationships, you could set `alwaysIncludeLinkageData` to `true`: + + ```js + // mirage/serializers/application.js + import { JSONAPISerializer } from 'ember-cli-mirage'; + + export default JSONAPISerializer.extend({ + alwaysIncludeLinkageData: true + }); + ``` + + Then, a GET to /authors/1 would respond with + + ```js + { + data: { + type: 'authors', + id: '1', + attributes: { ... }, + relationships: { + posts: { + data: [ + { type: 'posts', id: '1' }, + { type: 'posts', id: '2' }, + { type: 'posts', id: '3' } + ] + } + } + } + } + ``` + + even though the related `posts` are not included in the same document. + + You can also use the `links` method (on the Serializer base class) to add relationship links (which will always be added regardless of the relationship is being included document), or you could use `shouldIncludeLinkageData` for more granular control. + + For more background on the behavior of this API, see [this blog post](http://www.ember-cli-mirage.com/blog/changing-mirages-default-linkage-data-behavior-1475). + + @property alwaysIncludeLinkageData + @type {Boolean} + @public + */ + this.alwaysIncludeLinkageData = this.alwaysIncludeLinkageData || undefined; // this is just here so I can add the doc comment. Better way? + } + + // Don't think this is used? keyForModel(modelName) { return dasherize(modelName); - }, + } + // Don't think this is used? keyForCollection(modelName) { return dasherize(modelName); - }, + } + + /** + Used to customize the key for an attribute. By default, compound attribute names are dasherized. + For example, the JSON:API document for a `post` model with a `commentCount` attribute would be: + + ```js + { + data: { + id: 1, + type: 'posts', + attributes: { + 'comment-count': 28 + } + } + } + ``` + + @method keyForAttribute + @param {String} attr + @return {String} + @public + */ keyForAttribute(attr) { return dasherize(attr); - }, + } + /** + Used to customize the key for a relationships. By default, compound relationship names are dasherized. + + For example, the JSON:API document for an `author` model with a `blogPosts` relationship would be: + + ```js + { + data: { + id: 1, + type: 'author', + attributes: { + ... + }, + relationships: { + 'blog-posts': { + ... + } + } + } + } + ``` + + @method keyForAttribute + @param {String} key + @return {String} + @public + */ keyForRelationship(key) { return dasherize(key); - }, + } getHashForPrimaryResource(resource) { this._createRequestedIncludesGraph(resource); @@ -46,7 +182,7 @@ const JSONAPISerializer = Serializer.extend({ let addToIncludes = this.getAddToIncludesForResource(resource); return [ hashWithRoot, addToIncludes ]; - }, + } getHashForIncludedResource(resource) { let serializer = this.serializerFor(resource.modelName); @@ -59,7 +195,7 @@ const JSONAPISerializer = Serializer.extend({ } return [ hashWithRoot, addToIncludes ]; - }, + } getHashForResource(resource) { let hash; @@ -71,7 +207,7 @@ const JSONAPISerializer = Serializer.extend({ } return hash; - }, + } /* Returns a flat unique list of resources that need to be added to includes @@ -87,7 +223,7 @@ const JSONAPISerializer = Serializer.extend({ } return this.getAddToIncludesForResourceAndPaths(resource, relationshipPaths); - }, + } getAddToIncludesForResourceAndPaths(resource, relationshipPaths) { let includes = []; @@ -99,7 +235,7 @@ const JSONAPISerializer = Serializer.extend({ }); return _uniqBy(_compact(_flatten(includes)), m => m.toString()); - }, + } getIncludesForResourceAndPath(resource, ...names) { let nameForCurrentResource = camelize(names.shift()); @@ -136,7 +272,7 @@ const JSONAPISerializer = Serializer.extend({ } return includes; - }, + } _getResourceObjectForModel(model) { let attrs = this._attrsForModel(model, true); @@ -149,7 +285,7 @@ const JSONAPISerializer = Serializer.extend({ }; return this._maybeAddRelationshipsToResourceObjectForModel(hash, model); - }, + } _maybeAddRelationshipsToResourceObjectForModel(hash, model) { let relationships = model.associationKeys.reduce((relationships, key) => { @@ -193,7 +329,7 @@ const JSONAPISerializer = Serializer.extend({ } return hash; - }, + } hasLinksForRelationship(model, relationshipKey) { let serializer = this.serializerFor(model.modelName); @@ -203,7 +339,7 @@ const JSONAPISerializer = Serializer.extend({ return links[relationshipKey] != null; } - }, + } /* This code (and a lot of this serializer) need to be re-worked according to @@ -234,7 +370,7 @@ const JSONAPISerializer = Serializer.extend({ return relationshipPaths.includes(relationshipKey); } - }, + } /* This is needed for _relationshipIsIncludedForModel - see the note there for @@ -266,7 +402,7 @@ const JSONAPISerializer = Serializer.extend({ // Hack :/ Need to think of a better palce to put this if // refactoring json:api serializer. this.request._includesGraph = graph; - }, + } _addPrimaryModelToRequestedIncludesGraph(graph, model) { if (this.hasQueryParamIncludes()) { @@ -303,7 +439,7 @@ const JSONAPISerializer = Serializer.extend({ } }); } - }, + } _addResourceToRequestedIncludesGraph(graph, resource, relationshipNames) { graph.included = graph.included || {}; @@ -316,7 +452,7 @@ const JSONAPISerializer = Serializer.extend({ this._addModelToRequestedIncludesGraph(graph, model, relationshipNames); }); - }, + } _addModelToRequestedIncludesGraph(graph, model, relationshipNames) { let collectionName = pluralize(model.modelName); @@ -326,7 +462,7 @@ const JSONAPISerializer = Serializer.extend({ if (relationshipNames.length) { this._addResourceRelationshipsToRequestedIncludesGraph(graph, collectionName, resourceKey, model, relationshipNames); } - }, + } /* Lot of the same logic here from _addPrimaryModelToRequestedIncludesGraph, could refactor & share @@ -348,23 +484,42 @@ const JSONAPISerializer = Serializer.extend({ if (relationship) { this._addResourceToRequestedIncludesGraph(graph, relationship, relationshipNames.slice(1)); } - }, + } _graphKeyForModel(model) { return `${model.modelName}:${model.id}`; - }, + } getQueryParamIncludes() { return (_get(this, 'request.queryParams.include')); - }, + } hasQueryParamIncludes() { return !!this.getQueryParamIncludes(); - }, + } + + /** + Used to customize the `type` field of the document. By default, pluralizes and dasherizes the model's `modelName`. + + For example, the JSON:API document for a `blogPost` model would be: + ```js + { + data: { + id: 1, + type: 'blog-posts' + } + } + ``` + + @method typeKeyForModel + @param {Model} model + @return {String} + @public + */ typeKeyForModel(model) { return dasherize(pluralize(model.modelName)); - }, + } getCoalescedIds(request) { let ids = request.queryParams && request.queryParams['filter[id]']; @@ -372,12 +527,32 @@ const JSONAPISerializer = Serializer.extend({ return ids.split(','); } return ids; - }, + } + + /** + Allows for per-relationship inclusion of linkage data. Use this when `alwaysIncludeLinkageData` is not granular enough. + + ```js + export default JSONAPISerializer.extend({ + shouldIncludeLinkageData(relationshipKey, model) { + if (relationshipKey === 'author' || relationshipKey === 'ghostWriter') { + return true; + } + return false; + } + }); + ``` + @method shouldIncludeLinkageData + @param {String} relationshipKey + @param {Model} model + @return {Boolean} + @public + */ shouldIncludeLinkageData(relationshipKey, model) { return false; } -}); +} JSONAPISerializer.prototype.alwaysIncludeLinkageData = false; From 2c1b64862f94e77363236fc019021bdcb8a8fc37 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 23 Apr 2019 16:14:28 +0000 Subject: [PATCH 392/879] build(deps): [security] bump jquery from 3.3.1 to 3.4.0 Bumps [jquery](https://github.com/jquery/jquery) from 3.3.1 to 3.4.0. **This update includes security fixes.** - [Release notes](https://github.com/jquery/jquery/releases) - [Commits](https://github.com/jquery/jquery/compare/3.3.1...3.4.0) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index d975d1d3c..6887486fe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8760,9 +8760,9 @@ jquery-deferred@^0.3.0: integrity sha1-WW7KHKr/VPYbEQlisjyv6nTDU1U= jquery@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" - integrity sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg== + version "3.4.0" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.0.tgz#8de513fa0fa4b2c7d2e48a530e26f0596936efdf" + integrity sha512-ggRCXln9zEqv6OqAGXFEcshF5dSBvCkzj6Gm2gzuR5fWawaX8t7cxKVkkygKODrDAzKdoYw3l/e3pm3vlT4IbQ== js-base64@^2.1.9: version "2.4.8" From e98d61bdea233f3a772b8bfac7863aa676d4bf8e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 23 Apr 2019 18:05:28 -0400 Subject: [PATCH 393/879] build(deps-dev): bump jsdom from 14.0.0 to 15.0.0 (#1597) Bumps [jsdom](https://github.com/jsdom/jsdom) from 14.0.0 to 15.0.0. - [Release notes](https://github.com/jsdom/jsdom/releases) - [Changelog](https://github.com/jsdom/jsdom/blob/master/Changelog.md) - [Commits](https://github.com/jsdom/jsdom/compare/14.0.0...15.0.0) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 32 ++++++++++++++++---------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index b728f873e..d4296c06f 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,7 @@ "faker": "^4.1.0", "fastboot": "^2.0.1", "js-yaml": "^3.12.1", - "jsdom": "^14.0.0", + "jsdom": "^15.0.0", "loader.js": "^4.7.0", "marked": "^0.6.0", "qunit-dom": "^0.8.4" diff --git a/yarn.lock b/yarn.lock index 6887486fe..c7c98c7fb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8847,10 +8847,10 @@ jsdom@^11.12.0: ws "^5.2.0" xml-name-validator "^3.0.0" -jsdom@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-14.0.0.tgz#c7f1441ebcc57902d08d5fb2f6ba2baf746da7c6" - integrity sha512-/VkyPmdtbwqpJSkwDx3YyJ3U1oawYNB/h5z8vTUZGAzjtu2OHTeFRfnJqyMHsJ5Cyes23trOmvUpM1GfHH1leA== +jsdom@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.0.0.tgz#60cf177d79c7fa1a498453c9e2534f57e65d151f" + integrity sha512-rJnHm7CHyIj4tDyz9VaCt0f0P0nEh/wEmMfwp9mMixy+L/r8OW/BNcgmIlfZuBBnVQS3eRBpvd/qM3R7vr7e3A== dependencies: abab "^2.0.0" acorn "^6.0.4" @@ -8862,16 +8862,16 @@ jsdom@^14.0.0: domexception "^1.0.1" escodegen "^1.11.0" html-encoding-sniffer "^1.0.2" - nwsapi "^2.0.9" + nwsapi "^2.1.3" parse5 "5.1.0" pn "^1.1.0" request "^2.88.0" request-promise-native "^1.0.5" - saxes "^3.1.5" + saxes "^3.1.9" symbol-tree "^3.2.2" tough-cookie "^2.5.0" w3c-hr-time "^1.0.1" - w3c-xmlserializer "^1.0.1" + w3c-xmlserializer "^1.1.2" webidl-conversions "^4.0.2" whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" @@ -10577,10 +10577,10 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" integrity sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ== -nwsapi@^2.0.7, nwsapi@^2.0.9: - version "2.0.9" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.9.tgz#77ac0cdfdcad52b6a1151a84e73254edc33ed016" - integrity sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ== +nwsapi@^2.0.7, nwsapi@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.3.tgz#25f3a5cec26c654f7376df6659cdf84b99df9558" + integrity sha512-RowAaJGEgYXEZfQ7tvvdtAQUKPyTR6T6wNu0fwlNsGQYr/h3yQc6oI8WnVZh3Y/Sylwc+dtAlvPqfFZjhTyk3A== oauth-sign@~0.3.0: version "0.3.0" @@ -12365,7 +12365,7 @@ sax@>=0.6.0, sax@^1.1.4, sax@^1.2.4, sax@~1.2.1: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -saxes@^3.1.5: +saxes@^3.1.9: version "3.1.9" resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.9.tgz#c1c197cd54956d88c09f960254b999e192d7058b" integrity sha512-FZeKhJglhJHk7eWG5YM0z46VHmI3KJpMBAQm3xa9meDvd+wevB5GuBB0wc0exPInZiBBHqi00DbS8AcvCGCFMw== @@ -13888,10 +13888,10 @@ w3c-hr-time@^1.0.1: dependencies: browser-process-hrtime "^0.1.2" -w3c-xmlserializer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.0.1.tgz#054cdcd359dc5d1f3ec9be4e272c756af4b21d39" - integrity sha512-XZGI1OH/OLQr/NaJhhPmzhngwcAnZDLytsvXnRmlYeRkmbb0I7sqFFA22erq4WQR0sUu17ZSQOAV9mFwCqKRNg== +w3c-xmlserializer@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" + integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== dependencies: domexception "^1.0.1" webidl-conversions "^4.0.2" From 75c458da6a04525c303accb3d7632bef6383bdbb Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 23 Apr 2019 18:46:06 -0400 Subject: [PATCH 394/879] Update upgrade guide --- .../dummy/app/pods/docs/getting-started/upgrading/template.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/dummy/app/pods/docs/getting-started/upgrading/template.md b/tests/dummy/app/pods/docs/getting-started/upgrading/template.md index 10f19890d..7834a8d30 100644 --- a/tests/dummy/app/pods/docs/getting-started/upgrading/template.md +++ b/tests/dummy/app/pods/docs/getting-started/upgrading/template.md @@ -58,7 +58,7 @@ Here are the steps you'll need to take to fix this: + import faker from 'faker'; ``` -[There is a codemod](https://github.com/caseywatts/ember-cli-mirage-faker-codemod) that will do this for you, thanks to the gracious work of [Casey Watts](https://github.com/caseywatts). +[There is a codemod](https://github.com/samselikoff/ember-cli-mirage-faker-codemod/tree/update-transform) that will do this for you, thanks to the gracious work of [Casey Watts](https://github.com/caseywatts). Additionally, when I originally bundled Faker, I monkey-patched it with some methods that I thought would be "useful" additions. I thought this was a good idea at the time... it wasn't. 🙈 @@ -96,7 +96,7 @@ For `faker.random.number.range`, use `faker.random.number` with min and max opti } ``` -After that, you should be on your own with respect to Faker! Thanks to Auto Import, you can change versions, or even try out other libraries like [Chance.js](https://chancejs.com/), and rest easy knowing Mirage is a big slimmer and one less thing is beyond your control. +After that, you should be on your own with respect to Faker! Thanks to Auto Import, you can change versions, or even try out other libraries like [Chance.js](https://chancejs.com/), and rest easy knowing Mirage is a bit slimmer and one less thing is beyond your control. From d34784201bfe1e5c2e7c331e7c5c54e26d8aa152 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 23 Apr 2019 19:30:08 -0400 Subject: [PATCH 395/879] Document polymorphic hooks (#1600) --- addon/serializer.js | 70 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 3 deletions(-) diff --git a/addon/serializer.js b/addon/serializer.js index 30bdabd34..f205b6d90 100644 --- a/addon/serializer.js +++ b/addon/serializer.js @@ -853,11 +853,11 @@ class Serializer { } /** - Use this hook to format the key for relationship ids + Use this hook to format the key for the IDS of a `hasMany` relationship in this model's JSON representation. For example, if you're serializing an `author` that - sideloads many `blogPosts`, your `author` JSON would include a `blogPostIds` key: + sideloads many `blogPosts`, by default your `author` JSON would include a `blogPostIds` key: ``` { @@ -933,7 +933,7 @@ class Serializer { Now the response will look like: - ``` + ```js { blogPost: { id: 1, @@ -951,10 +951,74 @@ class Serializer { return `${camelize(relationshipName)}Id`; } + /** + Polymorphic relationships are represented with type-id pairs. + + Given the following model + + ```js + // mirage/models/comment.js + export default Mirage.Model.extend({ + commentable: belongsTo({ polymorphic: true }) + }); + ``` + + the default Serializer would produce + + ```js + { + comment: { + id: 1, + commentableType: 'post', + commentableId: '1' + } + } + ``` + + This hook controls how the `id` field (`commentableId` in the above example) + is serialized. By default it camelizes the relationship and adds `Id` as a suffix. + + @method keyForPolymorphicForeignKeyId + @param {String} relationshipName + @return {String} + @public + */ keyForPolymorphicForeignKeyId(relationshipName) { return `${camelize(relationshipName)}Id`; } + /** + Polymorphic relationships are represented with type-id pairs. + + Given the following model + + ```js + // mirage/models/comment.js + export default Mirage.Model.extend({ + commentable: belongsTo({ polymorphic: true }) + }); + ``` + + the default Serializer would produce + + ```js + { + comment: { + id: 1, + commentableType: 'post', + commentableId: '1' + } + } + ``` + + This hook controls how the `type` field (`commentableType` in the above example) + is serialized. By default it camelizes the relationship and adds `Type` as a suffix. + + @method keyForPolymorphicForeignKeyType + @param {String} relationshipName + @return {String} + @public + */ keyForPolymorphicForeignKeyType(relationshipName) { return `${camelize(relationshipName)}Type`; } From 6bd967a224f8be8408c3eee0d6e8d2d8f5c21082 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 24 Apr 2019 02:11:03 -0400 Subject: [PATCH 396/879] Update template.md --- .../dummy/app/pods/docs/getting-started/upgrading/template.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/dummy/app/pods/docs/getting-started/upgrading/template.md b/tests/dummy/app/pods/docs/getting-started/upgrading/template.md index 7834a8d30..39621726a 100644 --- a/tests/dummy/app/pods/docs/getting-started/upgrading/template.md +++ b/tests/dummy/app/pods/docs/getting-started/upgrading/template.md @@ -6,11 +6,8 @@ To install a new version of Mirage, run ```sh yarn install -D ember-cli-mirage@X.X.X -ember g ember-cli-mirage ``` -The `ember g ember-cli-mirage` command ensures all of Mirage's Bower dependencies are added to your project. It runs during `ember install`, and it's always a good idea to run it when upgrading. - ## Changelog From c8384bb31e59aac9d058aa3d007708f09bd1a290 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 24 Apr 2019 11:13:58 -0400 Subject: [PATCH 397/879] v1.0.0-beta.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d4296c06f..ddc55c186 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "0.4.15", + "version": "1.0.0-beta.1", "description": "A client-side server to help you build, test and demo your Ember app", "keywords": [ "ember-addon", From 092c6b3a8a7cfa7d65d131cce27b6d4b46d7cc60 Mon Sep 17 00:00:00 2001 From: jelhan Date: Wed, 24 Apr 2019 22:37:30 +0200 Subject: [PATCH 398/879] do not whitelist global server in blueprint (#1601) --- blueprints/ember-cli-mirage/index.js | 27 +-------------------------- 1 file changed, 1 insertion(+), 26 deletions(-) diff --git a/blueprints/ember-cli-mirage/index.js b/blueprints/ember-cli-mirage/index.js index 467308226..1f2f64c5a 100644 --- a/blueprints/ember-cli-mirage/index.js +++ b/blueprints/ember-cli-mirage/index.js @@ -28,27 +28,6 @@ module.exports = { }; }, - insertServerIntoESLintrc: function() { - // Insert server to globals declaration in eslintrc file. - // If globals declaration is not present insert it. - var text = ' server: true,'; - var after = 'globals: {\n'; - - return this.insertIntoFile('.eslintrc.js', text, { after: after }).then(() => { - text = ' globals: {\n server: true,\n },'; - after = 'module.exports = {\n'; - - return this.insertIntoFile('.eslintrc.js', text, { after: after }); - }); - }, - - insertServerIntoJSHintrc: function() { - var text = ' "server",'; - var after = '"predef": [\n'; - - return this.insertIntoFile('.jshintrc', text, { after: after }); - }, - insertShutdownIntoDestroyApp: function() { if (fs.existsSync('tests/helpers/destroy-app.js')) { var shutdownText = ' if (window.server) {\n window.server.shutdown();\n }'; @@ -59,10 +38,6 @@ module.exports = { }, afterInstall: function() { - return this.insertServerIntoESLintrc().then(() => { - return this.insertServerIntoJSHintrc().then(() => { - return this.insertShutdownIntoDestroyApp(); - }); - }); + return this.insertShutdownIntoDestroyApp(); } }; From 8f449bd2b7246b8599ea2f9e7bb07bd73a4ec3ad Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 25 Apr 2019 10:32:35 +0000 Subject: [PATCH 399/879] build(deps-dev): bump ember-composable-helpers from 2.2.0 to 2.3.1 Bumps [ember-composable-helpers](https://github.com/DockYard/ember-composable-helpers) from 2.2.0 to 2.3.1. - [Release notes](https://github.com/DockYard/ember-composable-helpers/releases) - [Commits](https://github.com/DockYard/ember-composable-helpers/compare/v2.2.0...v2.3.1) Signed-off-by: dependabot[bot] --- yarn.lock | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index c7c98c7fb..cb2876ae5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2936,6 +2936,25 @@ broccoli-funnel-reducer@^1.0.0: resolved "https://registry.yarnpkg.com/broccoli-funnel-reducer/-/broccoli-funnel-reducer-1.0.0.tgz#11365b2a785aec9b17972a36df87eef24c5cc0ea" integrity sha1-ETZbKnha7JsXlyo234fu8kxcwOo= +broccoli-funnel@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-2.0.1.tgz#6823c73b675ef78fffa7ab800f083e768b51d449" + integrity sha512-C8Lnp9TVsSSiZMGEF16C0dCiNg2oJqUKwuZ1K4kVC6qRPG/2Cj/rtB5kRCC9qEbwqhX71bDbfHROx0L3J7zXQg== + dependencies: + array-equal "^1.0.0" + blank-object "^1.0.1" + broccoli-plugin "^1.3.0" + debug "^2.2.0" + fast-ordered-set "^1.0.0" + fs-tree-diff "^0.5.3" + heimdalljs "^0.2.0" + minimatch "^3.0.0" + mkdirp "^0.5.0" + path-posix "^1.0.0" + rimraf "^2.4.3" + symlink-or-copy "^1.0.0" + walk-sync "^0.3.1" + broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-1.2.0.tgz#cddc3afc5ff1685a8023488fff74ce6fb5a51296" @@ -5688,12 +5707,14 @@ ember-component-css@^0.6.7: walk-sync "^1.0.1" ember-composable-helpers@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-2.2.0.tgz#a03984eaddf65ee08cb9ff554a24b0d671651af3" - integrity sha512-VWFYfxPLkgmEoL5aplh8dEwzAhmERfPzIGZeb+O7PhT0of5SYtJeOJFbIIXV2NkVHcDothwUu3IEALsWBsES8A== + version "2.3.1" + resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-2.3.1.tgz#db98ad8b55d053e2ac216b9da091c9e7a3b9f453" + integrity sha512-Eltj5yt2CtHhBMrdsjKQTP1zFyfEXQ5/v85ObV2zh0eIJZa1t/gImHN+GIHHuJ+9xOrCUAy60/2TJZjadpoPBQ== dependencies: - broccoli-funnel "^1.0.1" + "@babel/core" "^7.0.0" + broccoli-funnel "2.0.1" ember-cli-babel "^7.1.0" + resolve "^1.10.0" ember-concurrency@^0.9.0: version "0.9.0" From 48fc7ac949d21504a2f365fad5070188bca25342 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 26 Apr 2019 10:26:49 +0000 Subject: [PATCH 400/879] build(deps-dev): bump qunit-dom from 0.8.4 to 0.8.5 Bumps [qunit-dom](https://github.com/simplabs/qunit-dom) from 0.8.4 to 0.8.5. - [Release notes](https://github.com/simplabs/qunit-dom/releases) - [Changelog](https://github.com/simplabs/qunit-dom/blob/master/CHANGELOG.md) - [Commits](https://github.com/simplabs/qunit-dom/compare/v0.8.4...v0.8.5) Signed-off-by: dependabot[bot] --- yarn.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index cb2876ae5..c07fc6e3c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11597,11 +11597,11 @@ quick-temp@^0.1.0, quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quic underscore.string "~3.3.4" qunit-dom@^0.8.4: - version "0.8.4" - resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-0.8.4.tgz#8b75a73040df1735280fc2fab4c6a1a7f518488b" - integrity sha512-Ab2wCPQP2G2XdbIwhlUHMp3ROHh4XnqmK0ogHlpxwVIv+cXbW3/L6F9ucCThAMkjqCaxwZQQR+LaUHaaMxDCmw== + version "0.8.5" + resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-0.8.5.tgz#34b7cffb338e631c39955b21bdbe4d774090124e" + integrity sha512-I4GSy22ESUkoZYDSYsqFJoMvqhpmgd2iCYlrN7aWLEOdmumUkao3qz24/qVNZd1PAnoOQA78FefzNPRHePFx1A== dependencies: - broccoli-funnel "^2.0.0" + broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.1" qunit@~2.6.0: From dba760709057adaa1cafd5cf2823169d85ff8e76 Mon Sep 17 00:00:00 2001 From: jelhan Date: Thu, 2 May 2019 23:51:56 +0200 Subject: [PATCH 401/879] feat: export setupMirage from test-support directly (#1605) --- addon-test-support/index.js | 2 ++ test-projects/01-basic-app/tests/acceptance/faker-test.js | 2 +- .../01-basic-app/tests/acceptance/start-mirage-test.js | 2 +- .../docs/writing-your-server/acceptance-testing/template.md | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 addon-test-support/index.js diff --git a/addon-test-support/index.js b/addon-test-support/index.js new file mode 100644 index 000000000..c4b76b828 --- /dev/null +++ b/addon-test-support/index.js @@ -0,0 +1,2 @@ +import setupMirage from './setup-mirage'; +export { setupMirage }; diff --git a/test-projects/01-basic-app/tests/acceptance/faker-test.js b/test-projects/01-basic-app/tests/acceptance/faker-test.js index 4a2189730..485301a13 100644 --- a/test-projects/01-basic-app/tests/acceptance/faker-test.js +++ b/test-projects/01-basic-app/tests/acceptance/faker-test.js @@ -1,6 +1,6 @@ import { module, test } from 'qunit'; import { setupTest } from 'ember-qunit'; -import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; +import { setupMirage } from 'ember-cli-mirage/test-support'; module('Acceptance | Faker', function(hooks) { setupTest(hooks); diff --git a/test-projects/01-basic-app/tests/acceptance/start-mirage-test.js b/test-projects/01-basic-app/tests/acceptance/start-mirage-test.js index 548592381..83258e215 100644 --- a/test-projects/01-basic-app/tests/acceptance/start-mirage-test.js +++ b/test-projects/01-basic-app/tests/acceptance/start-mirage-test.js @@ -3,7 +3,7 @@ import {module as qunitModule, test} from 'qunit'; import {setupTest} from 'ember-qunit'; import {visit, currentRouteName} from '@ember/test-helpers'; import startMirage from 'ember-cli-mirage/start-mirage'; -import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; +import { setupMirage } from 'ember-cli-mirage/test-support'; import ENV from 'basic-app/config/environment'; let module; diff --git a/tests/dummy/app/pods/docs/writing-your-server/acceptance-testing/template.md b/tests/dummy/app/pods/docs/writing-your-server/acceptance-testing/template.md index f69c02c96..c1d158626 100644 --- a/tests/dummy/app/pods/docs/writing-your-server/acceptance-testing/template.md +++ b/tests/dummy/app/pods/docs/writing-your-server/acceptance-testing/template.md @@ -8,7 +8,7 @@ If you're using Application Tests (introduced in [Ember 3.0](https://emberjs.com ```diff import { setupApplicationTest } from 'ember-qunit'; -+ import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; ++ import { setupMirage } from 'ember-cli-mirage/test-support'; module('Acceptance | Homepage test', function(hooks) { setupApplicationTest(hooks); From 1159d39ba98f718c9cf7c95ced33c041284be92a Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 8 May 2019 17:32:26 -0400 Subject: [PATCH 402/879] feat: adds findOrCreateBy to schema (#1611) --- addon/orm/schema.js | 36 ++++++++++-- .../integration/orm/find-or-create-by-test.js | 55 +++++++++++++++++++ 2 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 tests/integration/orm/find-or-create-by-test.js diff --git a/addon/orm/schema.js b/addon/orm/schema.js index aaaaf82e1..8b3a5e26b 100644 --- a/addon/orm/schema.js +++ b/addon/orm/schema.js @@ -133,6 +133,7 @@ export default class Schema { all: (attrs) => this.all(camelizedModelName, attrs), find: (attrs) => this.find(camelizedModelName, attrs), findBy: (attrs) => this.findBy(camelizedModelName, attrs), + findOrCreateBy: (attrs) => this.findOrCreateBy(camelizedModelName, attrs), where: (attrs) => this.where(camelizedModelName, attrs), none: (attrs) => this.none(camelizedModelName, attrs), first: (attrs) => this.first(camelizedModelName, attrs) @@ -246,7 +247,7 @@ export default class Schema { } /** - Returns the first model in the database that matches the key-value pairs in the `query` object. Note that a string comparison is used. + Returns the first model in the database that matches the key-value pairs in `attrs`. Note that a string comparison is used. ```js let post = blogPosts.findBy({ published: true }); @@ -261,9 +262,36 @@ export default class Schema { */ findBy(type, query) { let collection = this._collectionForType(type); - let records = collection.findBy(query); + let record = collection.findBy(query); - return this._hydrate(records, dasherize(type)); + return this._hydrate(record, dasherize(type)); + } + + /** + Returns the first model in the database that matches the key-value pairs in `attrs`, or creates a record with the attributes if one is not found. + + ```js + // Find the first published blog post, or create a new one. + let post = blogPosts.findBy({ published: true }); + ``` + + @method findOrCreateBy + @param type + @param attributeName + @public + */ + findOrCreateBy(type, attrs) { + let collection = this._collectionForType(type); + let record = collection.findBy(attrs); + let model; + + if (!record) { + model = this.create(type, attrs); + } else { + model = this._hydrate(record, dasherize(type)); + } + + return model; } /** @@ -300,7 +328,7 @@ export default class Schema { */ first(type) { let collection = this._collectionForType(type); - let [record] = collection; + let record = collection[0]; return this._hydrate(record, dasherize(type)); } diff --git a/tests/integration/orm/find-or-create-by-test.js b/tests/integration/orm/find-or-create-by-test.js new file mode 100644 index 000000000..6658f87b7 --- /dev/null +++ b/tests/integration/orm/find-or-create-by-test.js @@ -0,0 +1,55 @@ +import Schema from 'ember-cli-mirage/orm/schema'; +import Model from 'ember-cli-mirage/orm/model'; +import Db from 'ember-cli-mirage/db'; +import {module, test} from 'qunit'; + +module('Integration | ORM | #findOrCreateBy', function(hooks) { + hooks.beforeEach(function() { + let db = new Db({ users: [ + { id: 1, name: 'Link', good: true }, + { id: 2, name: 'Zelda', good: true }, + { id: 3, name: 'Ganon', good: false } + ] }); + + this.User = Model.extend(); + + this.schema = new Schema(db, { + user: this.User + }); + }); + + test('it returns the first model that matches the attrs', function(assert) { + let user = this.schema.users.findOrCreateBy({ good: true }); + + assert.ok(user instanceof this.User); + assert.deepEqual(user.attrs, { id: '1', name: 'Link', good: true }); + }); + + test('it creates a model if no existing model with the attrs is found', function(assert) { + assert.equal(this.schema.db.users.length, 3); + + let newUser = this.schema.users.findOrCreateBy({ name: 'Link', good: false }); + + assert.equal(this.schema.db.users.length, 4); + assert.ok(newUser instanceof this.User); + assert.deepEqual(newUser.attrs, { id: '4', name: 'Link', good: false }); + }); + + // test('it returns models that match using a query function', function(assert) { + // let users = schema.users.where(function(rec) { + // return !rec.good; + // }); + // + // assert.ok(users instanceof Collection, 'it returns a collection'); + // assert.equal(users.models.length, 1); + // assert.ok(users.models[0] instanceof User); + // assert.deepEqual(users.models[0].attrs, { id: '3', name: 'Ganon', good: false }); + // }); + + // test('it returns an empty collection if no models match a query', function(assert) { + // let users = schema.users.where({ name: 'Link', good: false }); + // + // assert.ok(users instanceof Collection, 'it returns a collection'); + // assert.equal(users.models.length, 0); + // }); +}); From 41422055dc884410a0b468ef9e336446d193c8cf Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 8 May 2019 17:32:44 -0400 Subject: [PATCH 403/879] v1.0.0-beta.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ddc55c186..4a06700ae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "1.0.0-beta.1", + "version": "1.0.0-beta.2", "description": "A client-side server to help you build, test and demo your Ember app", "keywords": [ "ember-addon", From cae3a9913265062798293f183de2ef451dd82626 Mon Sep 17 00:00:00 2001 From: Jason Barry Date: Fri, 10 May 2019 21:53:40 -0400 Subject: [PATCH 404/879] Docs: Fix where the docs reference wrong method (#1615) --- addon/orm/schema.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addon/orm/schema.js b/addon/orm/schema.js index 8b3a5e26b..c662e05bf 100644 --- a/addon/orm/schema.js +++ b/addon/orm/schema.js @@ -272,7 +272,7 @@ export default class Schema { ```js // Find the first published blog post, or create a new one. - let post = blogPosts.findBy({ published: true }); + let post = blogPosts.findOrCreateBy({ published: true }); ``` @method findOrCreateBy From 28d364ce3eb4219932ad0a3cf5af0424c909c9c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Sun, 12 May 2019 20:51:24 -0400 Subject: [PATCH 405/879] build(deps-dev): bump eslint-plugin-node from 8.0.1 to 9.0.1 (#1608) Bumps [eslint-plugin-node](https://github.com/mysticatea/eslint-plugin-node) from 8.0.1 to 9.0.1. - [Release notes](https://github.com/mysticatea/eslint-plugin-node/releases) - [Commits](https://github.com/mysticatea/eslint-plugin-node/compare/v8.0.1...v9.0.1) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 39 ++++++++++++++++++++++----------------- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 4a06700ae..c01527020 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,7 @@ "escape-string-regexp": "^2.0.0", "eslint-plugin-ember": "^6.2.0", "eslint-plugin-ember-suave": "^1.0.0", - "eslint-plugin-node": "^8.0.1", + "eslint-plugin-node": "^9.0.1", "faker": "^4.1.0", "fastboot": "^2.0.1", "js-yaml": "^3.12.1", diff --git a/yarn.lock b/yarn.lock index c07fc6e3c..97fa98e85 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6312,7 +6312,7 @@ eslint-plugin-ember@^6.2.0: ember-rfc176-data "^0.3.9" snake-case "^2.1.0" -eslint-plugin-es@^1.3.1: +eslint-plugin-es@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz#475f65bb20c993fc10e8c8fe77d1d60068072da6" integrity sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw== @@ -6320,17 +6320,17 @@ eslint-plugin-es@^1.3.1: eslint-utils "^1.3.0" regexpp "^2.0.1" -eslint-plugin-node@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-8.0.1.tgz#55ae3560022863d141fa7a11799532340a685964" - integrity sha512-ZjOjbjEi6jd82rIpFSgagv4CHWzG9xsQAVp1ZPlhRnnYxcTgENUVBvhYmkQ7GvT1QFijUSo69RaiOJKhMu6i8w== +eslint-plugin-node@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-9.0.1.tgz#93e44626fa62bcb6efea528cee9687663dc03b62" + integrity sha512-fljT5Uyy3lkJzuqhxrYanLSsvaILs9I7CmQ31atTtZ0DoIzRbbvInBh4cQ1CrthFHInHYBQxfPmPt6KLHXNXdw== dependencies: - eslint-plugin-es "^1.3.1" + eslint-plugin-es "^1.4.0" eslint-utils "^1.3.1" - ignore "^5.0.2" + ignore "^5.1.1" minimatch "^3.0.4" - resolve "^1.8.1" - semver "^5.5.0" + resolve "^1.10.1" + semver "^6.0.0" eslint-scope@3.7.1, eslint-scope@^3.7.1: version "3.7.1" @@ -8170,10 +8170,10 @@ ignore@^4.0.3: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.0.2: - version "5.0.5" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.0.5.tgz#c663c548d6ce186fb33616a8ccb5d46e56bdbbf9" - integrity sha512-kOC8IUb8HSDMVcYrDVezCxpJkzSQWTAzf3olpKM6o9rM5zpojx23O0Fl8Wr4+qJ6ZbPEHqf1fdwev/DS7v7pmA== +ignore@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.1.tgz#2fc6b8f518aff48fef65a7f348ed85632448e4a5" + integrity sha512-DWjnQIFLenVrwyRCKZT+7a7/U4Cqgar4WG8V++K3hw+lrW1hc/SIwdiGmtxKCVACmHULTuGeBbHJmbwW7/sAvA== image-size@^0.5.0: version "0.5.5" @@ -12143,10 +12143,10 @@ resolve@1.5.0: dependencies: path-parse "^1.0.5" -resolve@^1.1.3, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: - version "1.10.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" - integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== +resolve@^1.1.3, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.1.tgz#664842ac960795bbe758221cdccda61fb64b5f18" + integrity sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA== dependencies: path-parse "^1.0.6" @@ -12425,6 +12425,11 @@ semver@^4.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= +semver@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.0.0.tgz#05e359ee571e5ad7ed641a6eec1e547ba52dea65" + integrity sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ== + send@0.16.1: version "0.16.1" resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" From 14dc6e26508062f8b95060492f369a0b873a6ad1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Sun, 12 May 2019 20:52:03 -0400 Subject: [PATCH 406/879] build(deps-dev): bump ember-data from 3.8.0 to 3.9.3 (#1614) Bumps [ember-data](https://github.com/emberjs/data) from 3.8.0 to 3.9.3. - [Release notes](https://github.com/emberjs/data/releases) - [Changelog](https://github.com/emberjs/data/blob/v3.9.3/CHANGELOG.md) - [Commits](https://github.com/emberjs/data/compare/v3.8.0...v3.9.3) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 55 ++++++++++++++++++++++++++-------------------------- 2 files changed, 28 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index c01527020..97971e49d 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "ember-cli-template-lint": "^1.0.0-beta.1", "ember-cli-uglify": "^3.0.0", "ember-composable-helpers": "^2.1.0", - "ember-data": "~3.8.0", + "ember-data": "~3.9.3", "ember-disable-prototype-extensions": "^1.1.3", "ember-export-application-global": "^2.0.0", "ember-load-initializers": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index 97fa98e85..4d2e24437 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3611,10 +3611,10 @@ cacheable-request@^2.1.1: normalize-url "2.0.1" responselike "1.0.2" -calculate-cache-key-for-tree@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-1.1.0.tgz#0c3e42c9c134f3c9de5358c0f16793627ea976d6" - integrity sha1-DD5CycE088neU1jA8WeTYn6pdtY= +calculate-cache-key-for-tree@^1.1.0, calculate-cache-key-for-tree@^1.2.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-1.2.3.tgz#5a5e4fcfa2d374a63e47fe967593f179e8282825" + integrity sha512-PPQorvdNw8K8k7UftCeradwOmKDSDJs8wcqYTtJPEt3fHbZyK8QsorybJA+lOmk0dgE61vX6R+5Kd3W9h4EMGg== dependencies: json-stable-stringify "^1.0.1" @@ -5111,7 +5111,7 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.4.0, ember-cli-babel@^7.4.2, ember-cli-babel@^7.5.0: +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.4.0, ember-cli-babel@^7.4.2, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: version "7.7.3" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.7.3.tgz#f94709f6727583d18685ca6773a995877b87b8a0" integrity sha512-/LWwyKIoSlZQ7k52P+6agC7AhcOBqPJ5C2u27qXHVVxKvCtg6ahNuRk/KmfZmV4zkuw4EjTZxfJE1PzpFyHkXg== @@ -5517,10 +5517,10 @@ ember-cli-test-loader@^2.2.0: dependencies: ember-cli-babel "^6.8.1" -ember-cli-typescript@^2.0.0-beta.2: - version "2.0.0-rc.2" - resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-2.0.0-rc.2.tgz#d8253097279ed292c20e739ee72f8fb994dbb6b7" - integrity sha512-u4mhdt/R0ip5s1H93aXtGJ/tnZ/3LsIOhKmaPylvlAVW/HtgPk+j/9sFHT4YmFUKMWPP2gXExtDkYNbz81XWzw== +ember-cli-typescript@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-2.0.1.tgz#9c46729213b9e1d13f5c3ff8421d772134aa889e" + integrity sha512-xwSEQOUNM621Wt+XJWpbLhBIeqC/dM1lDS+oZQ2nSjxp4MLZkpKuiVBqdbBWcURbvv8ghoVQPfy8wYU4JIFkLA== dependencies: "@babel/plugin-proposal-class-properties" "^7.1.0" "@babel/plugin-transform-typescript" "^7.1.0" @@ -5531,7 +5531,7 @@ ember-cli-typescript@^2.0.0-beta.2: fs-extra "^7.0.0" resolve "^1.5.0" rsvp "^4.8.1" - semver "^5.5.1" + semver "^6.0.0" stagehand "^1.0.0" walk-sync "^1.0.0" @@ -5551,12 +5551,12 @@ ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0, ember-cli-ve resolve "^1.3.3" semver "^5.3.0" -ember-cli-version-checker@^3.0.0, ember-cli-version-checker@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-3.1.0.tgz#b18c91f1ed19dfac8b12c42ed40bba9b751f68e2" - integrity sha512-ZYr6fpddV6nbfLKbyH4tJUXeZq+FLZkYBvzhbOn0SVCeEy+Zh/cIyCnccBYg8VzmRuSGU2HgPOiKFdiStDf9WQ== +ember-cli-version-checker@^3.0.0, ember-cli-version-checker@^3.0.1, ember-cli-version-checker@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-3.1.3.tgz#7c9b4f5ff30fdebcd480b1c06c4de43bb51c522c" + integrity sha512-PZNSvpzwWgv68hcXxyjREpj3WWb81A7rtYNQq1lLEgrWIchF8ApKJjWP3NBpHjaatwILkZAV8klair5WFlXAKg== dependencies: - resolve-package-path "^1.0.6" + resolve-package-path "^1.2.6" semver "^5.6.0" ember-cli@~3.4.4: @@ -5733,10 +5733,10 @@ ember-copy@^1.0.0: dependencies: ember-cli-babel "^6.6.0" -"ember-data@2.x - 3.x", ember-data@~3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.8.0.tgz#05b4d48ab3d612824862b037c4159ce2578fd688" - integrity sha512-NIM26FN5F/GRWeeAsJo1id5IDtucLZ169mHYB5cdNFlXM0Bx+ELnr322oI+/wQKDnM8LCCVbJBo+e0UE8+dtNQ== +"ember-data@2.x - 3.x", ember-data@~3.9.3: + version "3.9.3" + resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.9.3.tgz#6338ef6a13d30c5d9da56f2bc02bf7f832636b9f" + integrity sha512-t1qfuZeLeUYkhtR4V5FmhKoIkxXwT38CuRTEgyNXHeoMlDeRyj5TR06uPDIVEHJ4T3oOihx0dGZBQM4GKVrY5w== dependencies: "@ember/ordered-set" "^2.0.3" "@glimmer/env" "^0.1.7" @@ -5749,21 +5749,20 @@ ember-copy@^1.0.0: broccoli-funnel "^2.0.1" broccoli-merge-trees "^3.0.2" broccoli-rollup "^2.1.1" - calculate-cache-key-for-tree "^1.1.0" + calculate-cache-key-for-tree "^1.2.0" chalk "^2.4.1" - ember-cli-babel "^7.1.4" + ember-cli-babel "^7.7.3" ember-cli-path-utils "^1.0.0" ember-cli-string-utils "^1.1.0" ember-cli-test-info "^1.0.0" - ember-cli-typescript "^2.0.0-beta.2" - ember-cli-version-checker "^3.0.1" + ember-cli-typescript "^2.0.0" + ember-cli-version-checker "^3.1.3" ember-inflector "^3.0.0" git-repo-info "^2.0.0" heimdalljs "^0.3.0" inflection "^1.12.0" npm-git-info "^1.0.3" resolve "^1.8.1" - semver "^5.6.0" silent-error "^1.1.1" ember-disable-prototype-extensions@^1.1.3: @@ -12115,10 +12114,10 @@ resolve-package-path@^1.0.11: path-root "^0.1.1" resolve "^1.10.0" -resolve-package-path@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-1.0.7.tgz#8a0be5165a95bb056580129a422ca89bf4dcae02" - integrity sha512-a9WCtYh41TQVAT/PBF32GdkpoGi9IG8chSHaMkBz6+IdK5C4aPhuWWfS7wuO8nhG+N988xWHdM2teHBhPZ3Ucg== +resolve-package-path@^1.2.6: + version "1.2.7" + resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-1.2.7.tgz#2a7bc37ad96865e239330e3102c31322847e652e" + integrity sha512-fVEKHGeK85bGbVFuwO9o1aU0n3vqQGrezPc51JGu9UTXpFQfWq5qCeKxyaRUSvephs+06c5j5rPq/dzHGEo8+Q== dependencies: path-root "^0.1.1" resolve "^1.10.0" From 49677bb5e1b1b3608423dd63eb1ce77825207c58 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 13 May 2019 11:02:49 +0000 Subject: [PATCH 407/879] build(deps-dev): bump jsdom from 15.0.0 to 15.1.0 Bumps [jsdom](https://github.com/jsdom/jsdom) from 15.0.0 to 15.1.0. - [Release notes](https://github.com/jsdom/jsdom/releases) - [Changelog](https://github.com/jsdom/jsdom/blob/master/Changelog.md) - [Commits](https://github.com/jsdom/jsdom/compare/15.0.0...15.1.0) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4d2e24437..a419e2991 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8868,9 +8868,9 @@ jsdom@^11.12.0: xml-name-validator "^3.0.0" jsdom@^15.0.0: - version "15.0.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.0.0.tgz#60cf177d79c7fa1a498453c9e2534f57e65d151f" - integrity sha512-rJnHm7CHyIj4tDyz9VaCt0f0P0nEh/wEmMfwp9mMixy+L/r8OW/BNcgmIlfZuBBnVQS3eRBpvd/qM3R7vr7e3A== + version "15.1.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.1.0.tgz#80c5f0dd69466742ab1194f15d301bdd01417596" + integrity sha512-QEmc2XIkNfCK3KRfa9ljMJjC4kAGdVgRrs/pCBsQG/QoKz0B42+C58f6TdAmhq/rw494eFCoLHxX6+hWuxb96Q== dependencies: abab "^2.0.0" acorn "^6.0.4" From b190d14388f79e3e2f0692dafc8da50d1eb1e8f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 14 May 2019 10:44:48 +0000 Subject: [PATCH 408/879] build(deps-dev): bump ember-cli-favicon from 2.0.0 to 2.1.0 Bumps [ember-cli-favicon](https://github.com/davewasmer/ember-cli-favicon) from 2.0.0 to 2.1.0. - [Release notes](https://github.com/davewasmer/ember-cli-favicon/releases) - [Changelog](https://github.com/davewasmer/ember-cli-favicon/blob/master/CHANGELOG.md) - [Commits](https://github.com/davewasmer/ember-cli-favicon/compare/v2.0.0...v2.1.0) Signed-off-by: dependabot[bot] --- yarn.lock | 427 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 222 insertions(+), 205 deletions(-) diff --git a/yarn.lock b/yarn.lock index a419e2991..a49ca939f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -825,21 +825,21 @@ dependencies: "@glimmer/util" "^0.38.0" -"@jimp/bmp@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.4.0.tgz#9eae4b61fb82a34a529cd1f02423f5efe93a8951" - integrity sha512-3OGpqdQ2/ILjH4s7wxjGQPcaCs4MGpKk/1z907Uxy6lkm2A3miR4djVju4vkXqwobHadlxsB6UR0zt7jmP2nUg== +"@jimp/bmp@^0.5.4": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.5.4.tgz#b7b375aa774f26154912569864d5466e71333ef1" + integrity sha512-P/ezH1FuoM3FwS0Dm2ZGkph4x5/rPBzFLEZor7KQkmGUnYEIEG4o0BUcAWFmJOp2HgzbT6O2SfrpJNBOcVACzQ== dependencies: - "@jimp/utils" "^0.4.0" + "@jimp/utils" "^0.5.0" bmp-js "^0.1.0" core-js "^2.5.7" -"@jimp/core@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/core/-/core-0.4.0.tgz#db6b063fd9f6d0f292d9eecffc3a9e07dbc8b7e7" - integrity sha512-kuMIoV9WQg9ILYhvbRcGU5iYoU1LLFm7a9Nq1OPdJUxN71+u+lRCgyPY159ogwD7GKbDO2R8aySilmRMT5J6Bg== +"@jimp/core@^0.5.4": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@jimp/core/-/core-0.5.4.tgz#69d2d9eef1a6a9d62127171e2688cf21bc0ee77c" + integrity sha512-n3uvHy2ndUKItmbhnRO8xmU8J6KR+v6CQxO9sbeUDpSc3VXc1PkqrA8ZsCVFCjnDFcGBXL+MJeCTyQzq5W9Crw== dependencies: - "@jimp/utils" "^0.4.0" + "@jimp/utils" "^0.5.0" any-base "^1.1.0" buffer "^5.2.0" core-js "^2.5.7" @@ -851,229 +851,229 @@ pixelmatch "^4.0.2" tinycolor2 "^1.4.1" -"@jimp/custom@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/custom/-/custom-0.4.0.tgz#c0b801aea1413c2b827ba299523cbc2d0932197d" - integrity sha512-r4tz7VGuv4jRRQefoAIPi74oNAkOX0mNieeeUkwrfJmza3uO0mZKXM5oP0tOqe7PdJK53FAwuwSQLGEjHNvdTw== +"@jimp/custom@^0.5.4": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@jimp/custom/-/custom-0.5.4.tgz#393338efbf15d158ecf6639cb1b196c70411fddd" + integrity sha512-tLfyJoyouDl2J3RPFGfDzTtE+4S8ljqJUmLzy/cmx1n7+xS5TpLPdPskp7UaeAfNTqdF4CNAm94KYoxTZdj2mg== dependencies: - "@jimp/core" "^0.4.0" + "@jimp/core" "^0.5.4" core-js "^2.5.7" -"@jimp/gif@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/gif/-/gif-0.4.0.tgz#69ed6022587f72eab4d22ba1388bdf43649c64e5" - integrity sha512-R2VG1Ec+cRODXnxo5LGqWxcK2QCdeVPuZm96NZsKc7IBDMVkWfZGW2SDUYuNHiPfMad1MYJbkioffaSjTWwXIQ== +"@jimp/gif@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@jimp/gif/-/gif-0.5.0.tgz#7543870b3d744c9758da76ca43fac4ee48fd6a00" + integrity sha512-HVB4c7b8r/yCpjhCjVNPRFLuujTav5UPmcQcFJjU6aIxmne6e29rAjRJEv3UMamHDGSu/96PzOsPZBO5U+ZGww== dependencies: - "@jimp/utils" "^0.4.0" + "@jimp/utils" "^0.5.0" core-js "^2.5.7" omggif "^1.0.9" -"@jimp/jpeg@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/jpeg/-/jpeg-0.4.0.tgz#66bab17638c834e21d21ca2c4f41e1f9e6f5ae1d" - integrity sha512-nO3ZfUEh+Q2BD1rT5ZB8EkQ1z0VDFTnSsetBd1+D5mOijXcRH8FypdZuE6Q6293C11h69UCEzht/X/JcijNutQ== +"@jimp/jpeg@^0.5.4": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@jimp/jpeg/-/jpeg-0.5.4.tgz#ff52669f801e9d82041ba6322ee781c344e75241" + integrity sha512-YaPWm+YSGCThNE/jLMckM3Qs6uaMxd/VsHOnEaqu5tGA4GFbfVaWHjKqkNGAFuiNV+HdgKlNcCOF3of+elvzqQ== dependencies: - "@jimp/utils" "^0.4.0" + "@jimp/utils" "^0.5.0" core-js "^2.5.7" jpeg-js "^0.3.4" -"@jimp/plugin-blit@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-blit/-/plugin-blit-0.4.0.tgz#a4ac8709a640faea25d41ec1f54e0635f6e59adf" - integrity sha512-UjKv3Crd6F2P7OvIZ/Q/N70x/wiSq5DaWm5Zz/ooKYekz9xDQe7FAVnHuo3fGQJdvALwu613Z67kI78BDEUd4Q== +"@jimp/plugin-blit@^0.5.4": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@jimp/plugin-blit/-/plugin-blit-0.5.4.tgz#8c4f46e00c0a4ca9d5c592713de7575528485e59" + integrity sha512-WqDYOugv76hF1wnKy7+xPGf9PUbcm9vPW28/jHWn1hjbb2GnusJ2fVEFad76J/1SPfhrQ2Uebf2QCWJuLmOqZg== dependencies: - "@jimp/utils" "^0.4.0" + "@jimp/utils" "^0.5.0" core-js "^2.5.7" -"@jimp/plugin-blur@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-blur/-/plugin-blur-0.4.0.tgz#a869910080a2a43ddd7f4c191b4dca93ed36feba" - integrity sha512-ek6LuRhkrPwpOPE+WxGsVPFo2EFrUp7mMlmFDEFZxX+hZ4vmPMAE4rpAbnMYz6K/fUS70wccnb4UKMN35kZY/g== +"@jimp/plugin-blur@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-blur/-/plugin-blur-0.5.0.tgz#c8222bdae8eb4cc86613c0adbcb26a92829739a2" + integrity sha512-5k0PXCA1RTJdITL7yMAyZ5tGQjKLHqFvwdXj/PCoBo5PuMyr0x6qfxmQEySixGk/ZHdDxMi80vYxHdKHjNNgjg== dependencies: - "@jimp/utils" "^0.4.0" + "@jimp/utils" "^0.5.0" core-js "^2.5.7" -"@jimp/plugin-color@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-color/-/plugin-color-0.4.0.tgz#91904918942c0cc038dd62c088936ae9488b51fb" - integrity sha512-C41+M7DWOL2xcGfasxYK+LSQdQiy3ltA8s2aYFI5HzfYER8xJcVBLngbBYwYgrLaf6c3pDn5+9IVqVv6woTeGw== +"@jimp/plugin-color@^0.5.5": + version "0.5.5" + resolved "https://registry.yarnpkg.com/@jimp/plugin-color/-/plugin-color-0.5.5.tgz#68f9652d5065d3380a9967911a7e529325d230d6" + integrity sha512-hWeOqNCmLguGYLhSvBrpfCvlijsMEVaLZAOod62s1rzWnujozyKOzm2eZe+W3To6mHbp5RGJNVrIwHBWMab4ug== dependencies: - "@jimp/utils" "^0.4.0" + "@jimp/utils" "^0.5.0" core-js "^2.5.7" tinycolor2 "^1.4.1" -"@jimp/plugin-contain@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-contain/-/plugin-contain-0.4.0.tgz#f1db0d955e021cbb065bc459ccfb867db3c7ed19" - integrity sha512-etjptNMr/IwP641QGRYaU01MqF8UE7Cd/OC5XmhXRgUWbDLH9c9r48pk05k3ZGh2mLX83bXK/8tBlkXd+R7h9w== +"@jimp/plugin-contain@^0.5.4": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@jimp/plugin-contain/-/plugin-contain-0.5.4.tgz#1dc258db36d50e23400e0644b7f2694fd74fbf60" + integrity sha512-8YJh4FI3S69unri0nJsWeqVLeVGA77N2R0Ws16iSuCCD/5UnWd9FeWRrSbKuidBG6TdMBaG2KUqSYZeHeH9GOQ== dependencies: - "@jimp/utils" "^0.4.0" + "@jimp/utils" "^0.5.0" core-js "^2.5.7" -"@jimp/plugin-cover@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-cover/-/plugin-cover-0.4.0.tgz#80db9bd7616351cc22d9b8dc34cb2825662dc6df" - integrity sha512-MpHUlJqzRJCTuaPYr5o+afn3DtD/yV9z1sTceOfyH51CQQ07w2yCVIzOlevUhsIIjHzFV/pyZ3y2QFKBueY1ew== +"@jimp/plugin-cover@^0.5.4": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@jimp/plugin-cover/-/plugin-cover-0.5.4.tgz#a086243b151db9eef09e657fbe8bc3ef8683662e" + integrity sha512-2Rur7b44WiDDgizUI2M2uYWc1RmfhU5KjKS1xXruobjQ0tXkf5xlrPXSushq0hB6Ne0Ss6wv0+/6eQ8WeGHU2w== dependencies: - "@jimp/utils" "^0.4.0" + "@jimp/utils" "^0.5.0" core-js "^2.5.7" -"@jimp/plugin-crop@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-crop/-/plugin-crop-0.4.0.tgz#fe636da06d35d0d95e5bcc47fcc3af3a9baa185a" - integrity sha512-120k1tcalhchkLRcauGhWuNWskPHPUD1xND/CMghHeL4HBTi6ybsppzPN7nQkaYYyhfuygRbkQIiqHYQHT5AyA== +"@jimp/plugin-crop@^0.5.4": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@jimp/plugin-crop/-/plugin-crop-0.5.4.tgz#124cf52aa07e36c7a33f39e2e86e78166c300ca7" + integrity sha512-6t0rqn4VazquGk48tO6hFBrQ+nkvC+A1RnR6UM/m8ZtG2/yjpwF0MXcpgJI1Fb+a4Ug7BY1fu2GPcZOhnAVK/g== dependencies: - "@jimp/utils" "^0.4.0" + "@jimp/utils" "^0.5.0" core-js "^2.5.7" -"@jimp/plugin-displace@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-displace/-/plugin-displace-0.4.0.tgz#f6a07cc786f034930987477db8b2aa1eacfb4f3d" - integrity sha512-yJHOG2jZ/NZee2XPLy94wmHn5hLNND2Di7DxlWXMiwIhTcgrtbg8sI+uszp4iP25xbPt1T7oXFJOtszr+Juyaw== +"@jimp/plugin-displace@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-displace/-/plugin-displace-0.5.0.tgz#cb75d8588bdee45c1bdb1bec2323705d0e53d060" + integrity sha512-Bec7SQvnmKia4hOXEDjeNVx7vo/1bWqjuV6NO8xbNQcAO3gaCl91c9FjMDhsfAVb0Ou6imhbIuFPrLxorXsecQ== dependencies: - "@jimp/utils" "^0.4.0" + "@jimp/utils" "^0.5.0" core-js "^2.5.7" -"@jimp/plugin-dither@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-dither/-/plugin-dither-0.4.0.tgz#92114cb4e0bd7a8cac8e2eb4e33e81e3c196be16" - integrity sha512-YkruLTDpIQuF/a78ejrRCEtdMFwJxZ0NxqcX2JBpenOwZOnhOSkgYZMkU0K2+ezbCdrPPuWhDDDVsqzc5BYBEQ== +"@jimp/plugin-dither@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-dither/-/plugin-dither-0.5.0.tgz#0f1f6b7dcd5aba8f908bbd4b60685fc29cc6a3ed" + integrity sha512-We2WJQsD/Lm8oqBFp/vUv9/5r2avyenL+wNNu/s2b1HqA5O4sPGrjHy9K6vIov0NroQGCQ3bNznLkTmjiHKBcg== dependencies: - "@jimp/utils" "^0.4.0" + "@jimp/utils" "^0.5.0" core-js "^2.5.7" -"@jimp/plugin-flip@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-flip/-/plugin-flip-0.4.0.tgz#314cb6e89f8b778843d7c50d4114576ca81587a2" - integrity sha512-pE2Jo6b/lCC2Te9gapM2qVBk6L/qALwT2UKS7LE3G7juMIetJenm2dqkIX+ukuyjQolxh2DB4KoSFMMFQR+gHw== +"@jimp/plugin-flip@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-flip/-/plugin-flip-0.5.0.tgz#4a973c9c4bdc6dbcc7da66204a2bb2b12feb9381" + integrity sha512-D/ehBQxLMNR7oNd80KXo4tnSET5zEm5mR70khYOTtTlfti/DlLp3qOdjPOzfLyAdqO7Ly4qCaXrIsnia+pfPrA== dependencies: - "@jimp/utils" "^0.4.0" + "@jimp/utils" "^0.5.0" core-js "^2.5.7" -"@jimp/plugin-gaussian@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.4.0.tgz#5b31cb253367342811d91bb7db2c7fd31fb37198" - integrity sha512-6KGX6N6nxXsD/KbjazPRcwR0SQP80qUUEWUFXq95D7hCuYSGpvSDga9VgEpYsJ8V6lt8sQzzSt7ZKbTm5wklPA== +"@jimp/plugin-gaussian@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.5.0.tgz#02c9f07516108e01ba0f2938289b08e6e865c2c9" + integrity sha512-Ln4kgxblv0/YzLBDb/J8DYPLhDzKH87Y8yHh5UKv3H+LPKnLaEG3L4iKTE9ivvdocnjmrtTFMYcWv2ERSPeHcg== dependencies: - "@jimp/utils" "^0.4.0" + "@jimp/utils" "^0.5.0" core-js "^2.5.7" -"@jimp/plugin-invert@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-invert/-/plugin-invert-0.4.0.tgz#b490b6c758394cfd73555837968db2d94e41afa8" - integrity sha512-X9Zm+uZP6wEpWrnCkLkgbFTDsQAafTByIy7OR0ooKV92hz84jLx96psgFmZAG7OOA8Z1U0AjlV/YLZF8Ydjj9Q== +"@jimp/plugin-invert@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-invert/-/plugin-invert-0.5.0.tgz#4496d2d67ab498c8fa3e89c4b6dd5892e7f14b9b" + integrity sha512-/vyKeIi3T7puf+8ruWovTjzDC585EnTwJ+lGOOUYiNPsdn4JDFe1B3xd+Ayv9aCQbXDIlPElZaM9vd/+wqDiIQ== dependencies: - "@jimp/utils" "^0.4.0" + "@jimp/utils" "^0.5.0" core-js "^2.5.7" -"@jimp/plugin-mask@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-mask/-/plugin-mask-0.4.0.tgz#22323b24ce6dadaadfe8c07958d349a5eac27f46" - integrity sha512-D/qA3zVILYlnHsa0DuZYuNmsDWZEbQkNwCQHEGzv836ExO0KVz4wUTn4KmAqJccoKaGLyor3EHms5qAv4TVvRQ== +"@jimp/plugin-mask@^0.5.4": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@jimp/plugin-mask/-/plugin-mask-0.5.4.tgz#ac4c2625e328818da1443c92bcb9cabb537c74ba" + integrity sha512-mUJ04pCrUWaJGXPjgoVbzhIQB8cVobj2ZEFlGO3BEAjyylYMrdJlNlsER8dd7UuJ2L/a4ocWtFDdsnuicnBghQ== dependencies: - "@jimp/utils" "^0.4.0" + "@jimp/utils" "^0.5.0" core-js "^2.5.7" -"@jimp/plugin-normalize@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-normalize/-/plugin-normalize-0.4.0.tgz#84370b3dd65181b95c25d5e0388aa9dd9abffff7" - integrity sha512-t/XPehq5JNsATBgTh66sHlaVLL8+eYarZeXiVAXNsmrql924byyURoS1k9p1qRlYNYZEMM3d0wxBQerWFfPtsg== +"@jimp/plugin-normalize@^0.5.4": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@jimp/plugin-normalize/-/plugin-normalize-0.5.4.tgz#d60aeb637bcaecadf654c9621e291d6eed12fa19" + integrity sha512-Q5W0oEz9wxsjuhvHAJynI/OqXZcmqEAuRONQId7Aw5ulCXSOg9C4y2a67EO7aZAt55T+zMVxI9UpVUpzVvO6hw== dependencies: - "@jimp/utils" "^0.4.0" + "@jimp/utils" "^0.5.0" core-js "^2.5.7" -"@jimp/plugin-print@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-print/-/plugin-print-0.4.0.tgz#a1c2bd77e425a9a676c20cb6c202cd42d4a1ec64" - integrity sha512-6e1rmR2zACUSFwmS74ERrZGz/NI5Jp75LLy/7V6vARCxa1JcvWgu6qdTIDC4lPRQp7yty+PU4pcLX/E/mxkVYw== +"@jimp/plugin-print@^0.5.4": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@jimp/plugin-print/-/plugin-print-0.5.4.tgz#00524a7424a4e12a17764d349485dd1120a43728" + integrity sha512-DOZr5TY9WyMWFBD37oz7KpTEBVioFIHQF/gH5b3O5jjFyj4JPMkw7k3kVBve9lIrzIYrvLqe0wH59vyAwpeEFg== dependencies: - "@jimp/utils" "^0.4.0" + "@jimp/utils" "^0.5.0" core-js "^2.5.7" load-bmfont "^1.4.0" -"@jimp/plugin-resize@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-resize/-/plugin-resize-0.4.0.tgz#755fc8404928ae2f7598786b25b79caa17402496" - integrity sha512-mHe8xo2t6b7Jb1GCItc+475pjS6t5N+5NI3Si8M8Dj0oPxdA3b08qRdVWgcNDq4v0CjW9+ueN7i5NLm/IksbRw== +"@jimp/plugin-resize@^0.5.4": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@jimp/plugin-resize/-/plugin-resize-0.5.4.tgz#c9b2c4949ee080df3fa2ca587539e2ce8588b8af" + integrity sha512-lXNprNAT0QY1D1vG/1x6urUTlWuZe2dfL29P81ApW2Yfcio471+oqo45moX5FLS0q24xU600g7cHGf2/TzqSfA== dependencies: - "@jimp/utils" "^0.4.0" + "@jimp/utils" "^0.5.0" core-js "^2.5.7" -"@jimp/plugin-rotate@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-rotate/-/plugin-rotate-0.4.0.tgz#27faa1aef76767464d15f5501a549b604f8c4ccb" - integrity sha512-GUOxQB8X+K9hNfwi/7DeVIsRzkNyeHXH9SHWl4aI3AUVIt/09HmQfE/UTmNKCTToT36k7urtCxUKzppRc2SV0A== +"@jimp/plugin-rotate@^0.5.4": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@jimp/plugin-rotate/-/plugin-rotate-0.5.4.tgz#6c4c560779bc3ebf291db9a5095158d32a2a4af3" + integrity sha512-SIdUpMc8clObMchy8TnjgHgcXEQM992z5KavgiuOnCuBlsmSHtE3MrXTOyMW0Dn3gqapV9Y5vygrLm/BVtCCsg== dependencies: - "@jimp/utils" "^0.4.0" + "@jimp/utils" "^0.5.0" core-js "^2.5.7" -"@jimp/plugin-scale@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-scale/-/plugin-scale-0.4.0.tgz#0bbaf2ff305a43669d1bace61396657438ada818" - integrity sha512-f5BAB0W0q/EGfU/yJee79MFNbZLBrxrNrijWF3Jo9/BARw4r/ZJBbTrSG3sderFBS2Lvu3BuC5NbBCXvG3U9LQ== +"@jimp/plugin-scale@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-scale/-/plugin-scale-0.5.0.tgz#095f937e5a4887481b3074f5cd6a144d8f4f815e" + integrity sha512-5InIOr3cNtrS5aQ/uaosNf28qLLc0InpNGKFmGFTv8oqZqLch6PtDTjDBZ1GGWsPdA/ljy4Qyy7mJO1QBmgQeQ== dependencies: - "@jimp/utils" "^0.4.0" + "@jimp/utils" "^0.5.0" core-js "^2.5.7" -"@jimp/plugins@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/plugins/-/plugins-0.4.0.tgz#a0c155b8b800fd8841ccadb73d701c84b2969d2f" - integrity sha512-VFY0a+tKTFVrAg87q7MmXZ213An5mab5RMQmXU0UL5pQrE0XyyqODjuwgeuoATem9OeHzUYi1LxLLRihRPqZgA== - dependencies: - "@jimp/plugin-blit" "^0.4.0" - "@jimp/plugin-blur" "^0.4.0" - "@jimp/plugin-color" "^0.4.0" - "@jimp/plugin-contain" "^0.4.0" - "@jimp/plugin-cover" "^0.4.0" - "@jimp/plugin-crop" "^0.4.0" - "@jimp/plugin-displace" "^0.4.0" - "@jimp/plugin-dither" "^0.4.0" - "@jimp/plugin-flip" "^0.4.0" - "@jimp/plugin-gaussian" "^0.4.0" - "@jimp/plugin-invert" "^0.4.0" - "@jimp/plugin-mask" "^0.4.0" - "@jimp/plugin-normalize" "^0.4.0" - "@jimp/plugin-print" "^0.4.0" - "@jimp/plugin-resize" "^0.4.0" - "@jimp/plugin-rotate" "^0.4.0" - "@jimp/plugin-scale" "^0.4.0" +"@jimp/plugins@^0.5.5": + version "0.5.5" + resolved "https://registry.yarnpkg.com/@jimp/plugins/-/plugins-0.5.5.tgz#e97fa368d69ad7718d5a2a9b6ffa8e6cc1e4264d" + integrity sha512-9oF6LbSM/K7YkFCcxaPaD8NUkL/ZY8vT8NIGfQ/NpX+tKQtcsLHcRavHpUC+M1xXShv/QGx9OdBV/jgiu82QYg== + dependencies: + "@jimp/plugin-blit" "^0.5.4" + "@jimp/plugin-blur" "^0.5.0" + "@jimp/plugin-color" "^0.5.5" + "@jimp/plugin-contain" "^0.5.4" + "@jimp/plugin-cover" "^0.5.4" + "@jimp/plugin-crop" "^0.5.4" + "@jimp/plugin-displace" "^0.5.0" + "@jimp/plugin-dither" "^0.5.0" + "@jimp/plugin-flip" "^0.5.0" + "@jimp/plugin-gaussian" "^0.5.0" + "@jimp/plugin-invert" "^0.5.0" + "@jimp/plugin-mask" "^0.5.4" + "@jimp/plugin-normalize" "^0.5.4" + "@jimp/plugin-print" "^0.5.4" + "@jimp/plugin-resize" "^0.5.4" + "@jimp/plugin-rotate" "^0.5.4" + "@jimp/plugin-scale" "^0.5.0" core-js "^2.5.7" timm "^1.6.1" -"@jimp/png@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/png/-/png-0.4.0.tgz#11cd89fb842d76ba6b6aa97466118baf52aceb62" - integrity sha512-B1WHwYYh6gz39PhEeoe+/L093BmjHsB3igiCicvWP1BMGteT4B1IC6bmrbDSAWpFqS/HiRnv0yxwG6UsJN51CQ== +"@jimp/png@^0.5.4": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@jimp/png/-/png-0.5.4.tgz#4ed02435ab8ac219b618e9578dfd60626b3b5dd4" + integrity sha512-J2NU7368zihF1HUZdmpXsL/Hhyf+I3ubmK+6Uz3Uoyvtk1VS7dO3L0io6fJQutfWmPZ4bvu6Ry022oHjbi6QCA== dependencies: - "@jimp/utils" "^0.4.0" + "@jimp/utils" "^0.5.0" core-js "^2.5.7" pngjs "^3.3.3" -"@jimp/tiff@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/tiff/-/tiff-0.4.0.tgz#aa1f34f608437ca7378c4cf71a55932ef6f37fc4" - integrity sha512-9ybdOkoiXBpSl/VEze7E9eXl+ye9xRfvACRBfbCXoDbYKj6yt9Gzwp1eaIVmiTJ3OaLsWFCYhUlPPZ8zfb7Ogw== +"@jimp/tiff@^0.5.4": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@jimp/tiff/-/tiff-0.5.4.tgz#ce5370283eba390ff32b6fd86b9259d7cf3e2315" + integrity sha512-hr7Zq3eWjAZ+itSwuAObIWMRNv7oHVM3xuEDC2ouP7HfE7woBtyhCyfA7u12KlgtM57gKWeogXqTlewRGVzx6g== dependencies: core-js "^2.5.7" utif "^2.0.1" -"@jimp/types@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/types/-/types-0.4.0.tgz#246bd4727fd81474ff51fc87a1bbf0ab6add9a74" - integrity sha512-U8lhyCP93x1DntZVn94hWc4NHwqQlvg1/8fFSGqyUiZ6mbmqB5pS2EYJT8g8sDkCrp3abOnCHCGmAAsaFDFlBw== - dependencies: - "@jimp/bmp" "^0.4.0" - "@jimp/gif" "^0.4.0" - "@jimp/jpeg" "^0.4.0" - "@jimp/png" "^0.4.0" - "@jimp/tiff" "^0.4.0" +"@jimp/types@^0.5.4": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@jimp/types/-/types-0.5.4.tgz#c312e415ec9c4a35770e89b9eee424a96be60ab8" + integrity sha512-nbZXM6TsdpnYHIBd8ZuoxGpvmxc2SqiggY30/bhOP/VJQoDBzm2v/20Ywz5M0snpIK2SdYG52eZPNjfjqUP39w== + dependencies: + "@jimp/bmp" "^0.5.4" + "@jimp/gif" "^0.5.0" + "@jimp/jpeg" "^0.5.4" + "@jimp/png" "^0.5.4" + "@jimp/tiff" "^0.5.4" core-js "^2.5.7" timm "^1.6.1" -"@jimp/utils@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@jimp/utils/-/utils-0.4.0.tgz#e54d04d883231c993d3d27f33701dd09d32fc3b9" - integrity sha512-0/cRubStqlPL/n8OLrYhVJ5joSdXTEbPPyxvUOFzTPeUcEHmB+EdqNcCc4I6Lk3g6A5SKfW1GK/uIgpKXFwiWA== +"@jimp/utils@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@jimp/utils/-/utils-0.5.0.tgz#ecb33259c75238053d6c7706a3e91f657dbabf91" + integrity sha512-7H9RFVU+Li2XmEko0GGyzy7m7JjSc7qa+m8l3fUzYg2GtwASApjKF/LSG2AUQCUmDKFLdfIEVjxvKvZUJFEmpw== dependencies: core-js "^2.5.7" @@ -2032,13 +2032,20 @@ babel-plugin-debug-macros@^0.3.0: dependencies: semver "^5.3.0" -babel-plugin-ember-modules-api-polyfill@^2.5.0, babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-polyfill@^2.8.0: +babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-polyfill@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.8.0.tgz#70244800f750bf1c9f380910c1b2eed1db80ab4a" integrity sha512-3dlBH92qx8so2pRoks73+gwnuX97d0ajirOr96GwTZMnZxFzVR02c/PQbKWBcxpPqoL8CJSE2onuWM8PWezhOQ== dependencies: ember-rfc176-data "^0.3.8" +babel-plugin-ember-modules-api-polyfill@^2.7.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.9.0.tgz#8503e7b4192aeb336b00265e6235258ff6b754aa" + integrity sha512-c03h50291phJ2gQxo/aIOvFQE2c6glql1A7uagE3XbPXpKVAJOUxtVDjvWG6UAB6BC5ynsJfMWvY0w4TPRKIHQ== + dependencies: + ember-rfc176-data "^0.3.9" + babel-plugin-feature-flags@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/babel-plugin-feature-flags/-/babel-plugin-feature-flags-0.3.1.tgz#9c827cf9a4eb9a19f725ccb239e85cab02036fc1" @@ -2757,7 +2764,7 @@ broccoli-babel-transpiler@^6.5.0: rsvp "^4.8.2" workerpool "^2.3.0" -broccoli-babel-transpiler@^7.1.0, broccoli-babel-transpiler@^7.1.2: +broccoli-babel-transpiler@^7.1.2: version "7.2.0" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.2.0.tgz#5c0d694c4055106abb385e2d3d88936d35b7cb18" integrity sha512-lkP9dNFfK810CRHHWsNl9rjyYqcXH3qg0kArnA6tV9Owx3nlZm3Eyr0cGo6sMUQCNLH+2oKrRjOdUGSc6Um6Cw== @@ -2877,13 +2884,13 @@ broccoli-debug@^0.6.1, broccoli-debug@^0.6.4, broccoli-debug@^0.6.5: symlink-or-copy "^1.1.8" tree-sync "^1.2.2" -broccoli-favicon@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/broccoli-favicon/-/broccoli-favicon-2.0.0.tgz#970c652f36a84cc66139f00a9966a8bd0d9a7250" - integrity sha512-pjMIty6WInNin9jDDCB9X9ng3RWjFXkLcln6kZgGuVYz3m8kXOiqq8G6Gv2Q6oCVgj43FyhFy3/R0WmGwyLocQ== +broccoli-favicon@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/broccoli-favicon/-/broccoli-favicon-2.1.0.tgz#d33ff792b32fc23c1dd5aaf53797cdd30fe9ef5e" + integrity sha512-J52Nx4ASfWbEkVwRoQ6NPWij7Id3QP/WskVn4hHbOPUOcjUGcfyDZrfOR6Y8U8tzCDT6KhpRP4SR7pjrmPWuOg== dependencies: broccoli-caching-writer "3.0.3" - favicons "~5.2.0" + favicons "^5.3.0" heimdalljs-logger "~0.1.10" himalaya "1.1.0" lodash.merge "~4.6.1" @@ -3023,10 +3030,10 @@ broccoli-lint-eslint@^4.2.1: lodash.defaultsdeep "^4.6.0" md5-hex "^2.0.0" -broccoli-merge-trees@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-3.0.1.tgz#545dfe9f695cec43372b3ee7e63c7203713ea554" - integrity sha512-EFPBLbCoyCLdjJx0lxn+acWXK/GAZesXokS4OsF7HuB+WdnV76HVJPdfwp9TaXaUkrtb7eU+ymh9tY9wOGQjMQ== +broccoli-merge-trees@3.0.2, broccoli-merge-trees@^3.0.0, broccoli-merge-trees@^3.0.1, broccoli-merge-trees@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-3.0.2.tgz#f33b451994225522b5c9bcf27d59decfd8ba537d" + integrity sha512-ZyPAwrOdlCddduFbsMyyFzJUrvW6b04pMvDiAQZrCwghlvgowJDY+EfoXn+eR1RRA5nmGHJ+B68T63VnpRiT1A== dependencies: broccoli-plugin "^1.3.0" merge-trees "^2.0.0" @@ -3053,14 +3060,6 @@ broccoli-merge-trees@^2.0.0: broccoli-plugin "^1.3.0" merge-trees "^1.0.1" -broccoli-merge-trees@^3.0.0, broccoli-merge-trees@^3.0.1, broccoli-merge-trees@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-3.0.2.tgz#f33b451994225522b5c9bcf27d59decfd8ba537d" - integrity sha512-ZyPAwrOdlCddduFbsMyyFzJUrvW6b04pMvDiAQZrCwghlvgowJDY+EfoXn+eR1RRA5nmGHJ+B68T63VnpRiT1A== - dependencies: - broccoli-plugin "^1.3.0" - merge-trees "^2.0.0" - broccoli-middleware@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/broccoli-middleware/-/broccoli-middleware-2.0.1.tgz#093314f13e52fad7fa8c4254a4e4a4560c857a65" @@ -5070,20 +5069,22 @@ ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.0: resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.0.tgz#de3baedd093163b6c2461f95964888c1676325ac" integrity sha512-Zr4my8Xn+CzO0gIuFNXji0eTRml5AxZUTDQz/wsNJ5AJAtyFWCY4QtKdoELNNbiCVGt1lq5yLiwTm4scGKu6xA== -ember-cli-babel@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.1.3.tgz#a2a7374adb525369a3a205cedd54d8e0c3de3309" - integrity sha512-wkftzRiPiLTKAhBKphsJEH8gmJIspq04f03DUvoS2/bqrssF04hhQVRquF4EF0ZiNxKI8f4ka/puVOGeBuRWDg== +ember-cli-babel@7.5.0: + version "7.5.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.5.0.tgz#af654dcef23630391d2efe85aaa3bdf8b6ca17b7" + integrity sha512-wWXqPPQNRxCtEHvYaLBNiIVgCVCy8YqZ0tM8Dpql1D5nGnPDbaK073sS1vlOYBP7xe5Ab2nXhvQkFwUxFacJ2g== dependencies: "@babel/core" "^7.0.0" "@babel/plugin-transform-modules-amd" "^7.0.0" + "@babel/plugin-transform-runtime" "^7.2.0" "@babel/polyfill" "^7.0.0" "@babel/preset-env" "^7.0.0" - amd-name-resolver "1.2.0" - babel-plugin-debug-macros "^0.2.0-beta.6" - babel-plugin-ember-modules-api-polyfill "^2.5.0" + "@babel/runtime" "^7.2.0" + amd-name-resolver "^1.2.1" + babel-plugin-debug-macros "^0.3.0" + babel-plugin-ember-modules-api-polyfill "^2.7.0" babel-plugin-module-resolver "^3.1.1" - broccoli-babel-transpiler "^7.1.0" + broccoli-babel-transpiler "^7.1.2" broccoli-debug "^0.6.4" broccoli-funnel "^2.0.1" broccoli-source "^1.1.0" @@ -5272,14 +5273,14 @@ ember-cli-fastboot@^2.0.4: silent-error "^1.1.0" ember-cli-favicon@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ember-cli-favicon/-/ember-cli-favicon-2.0.0.tgz#11f2b72c68dba1906fcff9be7af899c86338f484" - integrity sha512-E8wiIj/+/ptTtA4FMSsKqpld2ptYmV+nbbpVgm1jNq6PF5PsqxZASvugLVhvSLScSZWuGe+UqGTpWDLqnGthag== + version "2.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-favicon/-/ember-cli-favicon-2.1.0.tgz#90ae95a9d507c71d688c70d37df03e243cc2ca0a" + integrity sha512-6mHE6NeZHtm3rxQzKoLvHQangSbx58jnNkRWOXFiyAHggOTZIiFg638PIiYbOi1wozZ0hi+4qD37yWWdI9hiZQ== dependencies: - broccoli-favicon "~2.0.0" - broccoli-merge-trees "3.0.1" + broccoli-favicon "~2.1.0" + broccoli-merge-trees "3.0.2" broccoli-replace "0.12.0" - ember-cli-babel "7.1.3" + ember-cli-babel "7.5.0" lodash.merge "~4.6.1" ember-cli-get-component-path-option@^1.0.0: @@ -6917,10 +6918,10 @@ fastboot@^2.0.1: simple-dom "^1.4.0" source-map-support "^0.5.0" -favicons@~5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/favicons/-/favicons-5.2.0.tgz#5032a2dc7fa19c49db735d274a2b2f23b7fa13cd" - integrity sha512-oRrPg1oJXImFpcS+WJCyYMZ0bKT471R9l0zHsLMdsApMvU9+UCMSbVH2/EdY/1ZqJ0mzzbs1j2pL9Oc2KB25zA== +favicons@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/favicons/-/favicons-5.3.0.tgz#ba4f826f147718ccf7e312f6f7ae23881ad1dfa6" + integrity sha512-0uU+QToJ790J4X9ACR7AyNCxjoLsChC5mIm3P1TbVYrLlW3MQ6sv6DIxFpEyhnx7CzUP8ww7hpizWAel3Hr4Yw== dependencies: "@babel/polyfill" "^7.0.0" cheerio "^1.0.0-rc.2" @@ -6928,12 +6929,12 @@ favicons@~5.2.0: colors "^1.3.2" core-js "^2.5.7" image-size "^0.6.3" - jimp "^0.4.0" - jsontoxml "^1.0.0" + jimp "^0.5.6" + jsontoxml "^1.0.1" lodash.defaultsdeep "^4.6.0" require-directory "^2.1.1" svg2png "^4.1.1" - through2 "^2.0.3" + through2 "^3.0.0" tinycolor2 "^1.4.1" to-ico "^1.1.5" util.promisify "^1.0.0" @@ -8739,15 +8740,15 @@ jimp@^0.2.21: tinycolor2 "^1.1.2" url-regex "^3.0.0" -jimp@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.4.0.tgz#19c9bb2d104e468a86f81962a99363f6f7b3be47" - integrity sha512-Ed0ouCiOt9QdrYxTKpsal+T+REphlFeG6zpR0cXU3l8pvA/BeAfKTaMQ91e/zGSZHEjbcbRZ2V9zgOYqa8Av6g== +jimp@^0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.5.6.tgz#dd114decd060927ae439f2e0980df619c179f912" + integrity sha512-H0nHTu6KgAgQzDxa38ew2dXbnRzKm1w5uEyhMIxqwCQVjwgarOjjkV/avbNLxfxRHAFaNp4rGIc/qm8P+uhX9A== dependencies: "@babel/polyfill" "^7.0.0" - "@jimp/custom" "^0.4.0" - "@jimp/plugins" "^0.4.0" - "@jimp/types" "^0.4.0" + "@jimp/custom" "^0.5.4" + "@jimp/plugins" "^0.5.5" + "@jimp/types" "^0.5.4" core-js "^2.5.7" joi@^12.0.0: @@ -9032,7 +9033,7 @@ jsonify@~0.0.0: resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= -jsontoxml@^1.0.0: +jsontoxml@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/jsontoxml/-/jsontoxml-1.0.1.tgz#07fff7f6bfbfa1097d779aec7f041b5046075e70" integrity sha512-dtKGq0K8EWQBRqcAaePSgKR4Hyjfsz/LkurHSV3Cxk4H+h2fWDeaN2jzABz+ZmOJylgXS7FGeWmbZ6jgYUMdJQ== @@ -11742,6 +11743,15 @@ readable-stream@1.1: isarray "0.0.1" string_decoder "~0.10.x" +"readable-stream@2 || 3": + version "3.3.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.3.0.tgz#cb8011aad002eb717bf040291feba8569c986fb9" + integrity sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" @@ -13009,7 +13019,7 @@ string_decoder@0.10, string_decoder@~0.10.x: resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= -string_decoder@^1.0.0: +string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== @@ -13324,6 +13334,13 @@ through2@^2.0.0, through2@^2.0.3, through2@~2.0.0: readable-stream "^2.1.5" xtend "~4.0.1" +through2@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" + integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== + dependencies: + readable-stream "2 || 3" + through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -13806,7 +13823,7 @@ utif@^2.0.1: dependencies: pako "^1.0.5" -util-deprecate@^1.0.2, util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= From 97afc6912acfca39d59cd5bfbaa3153533b177ec Mon Sep 17 00:00:00 2001 From: Buck Doyle Date: Tue, 14 May 2019 08:59:30 -0500 Subject: [PATCH 409/879] fix: updating model w/two same-model relationships Co-authored-by: Buck Doyle For a model that has two inverse one-to-many relationships that point to the same model class, there was a bug where calling update on both at the same time ```js post.update({ author: user, editor: user }); ``` would fail, whereas updating each relationship individually would work. This is because the temporary model reference for the second relationship became stale after the first one was saved. See #1613. --- addon/orm/model.js | 21 ++++ ...-with-same-target-model-update-bug-test.js | 34 ++++++ ...-with-same-target-model-update-bug-test.js | 103 ++++++++++++++++++ 3 files changed, 158 insertions(+) create mode 100644 tests/integration/orm/mixed/regressions/1613-two-bidirectional-many-to-many-with-same-target-model-update-bug-test.js create mode 100644 tests/integration/server/regressions/1613-two-bidirectional-many-to-many-with-same-target-model-update-bug-test.js diff --git a/addon/orm/model.js b/addon/orm/model.js index 7db524caf..84429ed5c 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -885,7 +885,10 @@ class Model { // Non-self-referential } else if (!tempAssociate.isSaving) { + + // Save the tempAssociate and update the local reference tempAssociate.save(); + this._syncTempAssociations(tempAssociate); let fkValue; if (association.isPolymorphic) { @@ -978,6 +981,24 @@ class Model { this.attrs = this._schema.db[toInternalCollectionName(this.modelName)].update(this.attrs.id, attrs); } + /* + Super gnarly: after we save this tempAssociate, we we need to through + all other tempAssociates for a reference to this same model, and + update it. Otherwise those other references are stale, which could + cause a bug when they are subsequently saved. + + This only works for belongsTo right now, should add hasMany logic to it. + + See issue #1613: https://github.com/samselikoff/ember-cli-mirage/pull/1613 + */ + _syncTempAssociations(tempAssociate) { + Object.keys(this._tempAssociations).forEach(key => { + if (this._tempAssociations[key] && this._tempAssociations[key].toString() === tempAssociate.toString()) { + this._tempAssociations[key] = tempAssociate; + } + }); + } + /** Simple string representation of the model and id. diff --git a/tests/integration/orm/mixed/regressions/1613-two-bidirectional-many-to-many-with-same-target-model-update-bug-test.js b/tests/integration/orm/mixed/regressions/1613-two-bidirectional-many-to-many-with-same-target-model-update-bug-test.js new file mode 100644 index 000000000..2798b7b73 --- /dev/null +++ b/tests/integration/orm/mixed/regressions/1613-two-bidirectional-many-to-many-with-same-target-model-update-bug-test.js @@ -0,0 +1,34 @@ +import { module, test } from 'qunit'; +import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; +import Schema from 'ember-cli-mirage/orm/schema'; +import Db from 'ember-cli-mirage/db'; + +module('Integration | ORM | Mixed | Regressions | 1613 Two bidirectional one-to-many relationships with same target model update ids bug', function(hooks) { + hooks.beforeEach(function() { + this.db = new Db(); + + this.schema = new Schema(this.db, { + user: Model.extend({ + authoredPosts: hasMany('post', { inverse: 'author' }), + editedPosts: hasMany('post', { inverse: 'editor' }) + }), + post: Model.extend({ + author: belongsTo('user', { inverse: 'authoredPosts' }), + editor: belongsTo('user', { inverse: 'editedPosts' }) + }) + }); + }); + + test(`it works, and all inverses are correctly updated`, function(assert) { + let user = this.schema.users.create(); + let post = this.schema.posts.create(); + + post.update({ + authorId: user.id, + editorId: user.id + }); + + assert.deepEqual(this.db.posts.find(1), { id: '1', authorId: '1', editorId: '1' }); + assert.deepEqual(this.db.users.find(1), { id: '1', authoredPostIds: [ '1' ], editedPostIds: [ '1' ] }); + }); +}); diff --git a/tests/integration/server/regressions/1613-two-bidirectional-many-to-many-with-same-target-model-update-bug-test.js b/tests/integration/server/regressions/1613-two-bidirectional-many-to-many-with-same-target-model-update-bug-test.js new file mode 100644 index 000000000..26712351b --- /dev/null +++ b/tests/integration/server/regressions/1613-two-bidirectional-many-to-many-with-same-target-model-update-bug-test.js @@ -0,0 +1,103 @@ +import { module, test } from 'qunit'; +import { Model, hasMany, belongsTo, JSONAPISerializer } from 'ember-cli-mirage'; +import Server from 'ember-cli-mirage/server'; +import promiseAjax from 'dummy/tests/helpers/promise-ajax'; + +module('Integration | Server | Regressions | 1613 Two bidirectional many-to-many with same target model update bug', function(hooks) { + hooks.beforeEach(function() { + this.server = new Server({ + environment: 'test', + models: { + user: Model.extend({ + authoredPosts: hasMany('post', { inverse: 'author' }), + editedPosts: hasMany('post', { inverse: 'editor' }) + }), + post: Model.extend({ + author: belongsTo('user', { inverse: 'authoredPosts' }), + editor: belongsTo('user', { inverse: 'editedPosts' }) + }) + }, + serializers: { + application: JSONAPISerializer.extend(), + user: JSONAPISerializer.extend({ + alwaysIncludeLinkageData: true + }) + }, + baseConfig() { + this.resource('posts'); + this.resource('users'); + } + }); + }); + + hooks.afterEach(function() { + this.server.shutdown(); + }); + + test('it stores both relationships', async function(assert) { + let post = this.server.create('post'); + let user = this.server.create('user'); + + assert.expect(1); + + await promiseAjax({ + method: 'PATCH', + url: `/posts/${post.id}`, + contentType: 'application/vnd.api+json', + data: JSON.stringify({ + data: { + id: post.id, + attributes: {}, + relationships: { + author: { + data: { + type: 'users', + id: user.id + } + }, + editor: { + data: { + type: 'users', + id: user.id + } + } + }, + type: 'posts' + } + }) + }); + + let response = await promiseAjax({ + method: 'GET', + url: `/users/${user.id}` + }); + + let json = response.data; + + assert.deepEqual(json.data, + { + "attributes": {}, + "id": "1", + "relationships": { + "authored-posts": { + "data": [ + { + "id": "1", + "type": "posts" + } + ] + }, + "edited-posts": { + "data": [ + { + "id": "1", + "type": "posts" + } + ] + } + }, + "type": "users" + }); + }); + +}); From 0a49ce019e1e1ad987bdc999288cdb1197cb45f7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 14 May 2019 10:05:55 -0400 Subject: [PATCH 410/879] build(deps-dev): bump ember-data from 3.9.3 to 3.10.0 (#1618) Bumps [ember-data](https://github.com/emberjs/data) from 3.9.3 to 3.10.0. - [Release notes](https://github.com/emberjs/data/releases) - [Changelog](https://github.com/emberjs/data/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/data/compare/v3.9.3...v3.10.0) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 97971e49d..4655ffd33 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "ember-cli-template-lint": "^1.0.0-beta.1", "ember-cli-uglify": "^3.0.0", "ember-composable-helpers": "^2.1.0", - "ember-data": "~3.9.3", + "ember-data": "~3.10.0", "ember-disable-prototype-extensions": "^1.1.3", "ember-export-application-global": "^2.0.0", "ember-load-initializers": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index a49ca939f..0e73cfbb3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5734,10 +5734,10 @@ ember-copy@^1.0.0: dependencies: ember-cli-babel "^6.6.0" -"ember-data@2.x - 3.x", ember-data@~3.9.3: - version "3.9.3" - resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.9.3.tgz#6338ef6a13d30c5d9da56f2bc02bf7f832636b9f" - integrity sha512-t1qfuZeLeUYkhtR4V5FmhKoIkxXwT38CuRTEgyNXHeoMlDeRyj5TR06uPDIVEHJ4T3oOihx0dGZBQM4GKVrY5w== +"ember-data@2.x - 3.x", ember-data@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.10.0.tgz#b5f53a445ba1ee37890ec672b3dc3f869d8b3992" + integrity sha512-QqKJ5/Co2wGBnD5FSUiO1tbhsjjiRS5uJUwD2vRa0suwNv5E9f+5S6Yww6O0B2z5nDRzRheBFZ7iRjbshQhWDg== dependencies: "@ember/ordered-set" "^2.0.3" "@glimmer/env" "^0.1.7" From 68abbf5c9b3cb379edfb76dc505db5dda242ba9e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 14 May 2019 10:06:12 -0400 Subject: [PATCH 411/879] build(deps-dev): bump ember-source from 3.9.1 to 3.10.0 (#1619) Bumps [ember-source](https://github.com/emberjs/ember.js) from 3.9.1 to 3.10.0. - [Release notes](https://github.com/emberjs/ember.js/releases) - [Changelog](https://github.com/emberjs/ember.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember.js/compare/v3.9.1...v3.10.0) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 4655ffd33..173277b54 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "ember-maybe-import-regenerator": "^0.1.6", "ember-moment": "^7.8.1", "ember-resolver": "^5.0.1", - "ember-source": "~3.9.0", + "ember-source": "~3.10.0", "ember-source-channel-url": "^1.1.0", "ember-try": "^1.0.0", "escape-string-regexp": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index 0e73cfbb3..ff7bb76bb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5112,7 +5112,7 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.4.0, ember-cli-babel@^7.4.2, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.4.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.0, ember-cli-babel@^7.7.3: version "7.7.3" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.7.3.tgz#f94709f6727583d18685ca6773a995877b87b8a0" integrity sha512-/LWwyKIoSlZQ7k52P+6agC7AhcOBqPJ5C2u27qXHVVxKvCtg6ahNuRk/KmfZmV4zkuw4EjTZxfJE1PzpFyHkXg== @@ -5986,21 +5986,21 @@ ember-source-channel-url@^1.0.1, ember-source-channel-url@^1.1.0: dependencies: got "^8.0.1" -ember-source@~3.9.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.9.1.tgz#e6c7b08f823f9a55e448af1cc439266cabc3e65e" - integrity sha512-0rfP1m3KbfylKNnxk4ZWy0jqwqIWGm5rb7ZZFn4zazVJFI6gEmratWadXfzwEgqG2ukRcW9F8frEk0utuaAnMg== +ember-source@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.10.0.tgz#c423f494d573d418bf843d605ea79c21a14ca863" + integrity sha512-qHI+1y1gcfHO44+Ld3ty9565UsqlmimfOLe/Ra3jA4Z9h6vJNOdIzr4Bws7by/8kiBqjO1RM+TVe19zglivwoQ== dependencies: broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.2" chalk "^2.4.2" - ember-cli-babel "^7.4.2" + ember-cli-babel "^7.7.0" ember-cli-get-component-path-option "^1.0.0" ember-cli-is-package-missing "^1.0.0" ember-cli-normalize-entity-name "^1.0.0" ember-cli-path-utils "^1.0.0" ember-cli-string-utils "^1.1.0" - ember-cli-version-checker "^3.0.1" + ember-cli-version-checker "^3.1.3" ember-router-generator "^1.2.3" inflection "^1.12.0" jquery "^3.3.1" From f0bdb544ba6598ae154fec119e73eda1778cf96a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 16 May 2019 11:12:53 +0000 Subject: [PATCH 412/879] build(deps-dev): bump ember-try from 1.1.0 to 1.2.1 Bumps [ember-try](https://github.com/ember-cli/ember-try) from 1.1.0 to 1.2.1. - [Release notes](https://github.com/ember-cli/ember-try/releases) - [Changelog](https://github.com/ember-cli/ember-try/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-try/compare/v1.1.0...v1.2.1) Signed-off-by: dependabot[bot] --- yarn.lock | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/yarn.lock b/yarn.lock index ff7bb76bb..045151c16 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4575,7 +4575,7 @@ debug@=3.1.0, debug@^3.0.0, debug@^3.1.0, debug@~3.1.0: dependencies: ms "2.0.0" -debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@~4.1.0: +debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -6065,23 +6065,23 @@ ember-try-config@^3.0.0: semver "^5.5.0" ember-try@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ember-try/-/ember-try-1.1.0.tgz#194d5843a79b5a9fc0e4c07445ebc18c08a91e78" - integrity sha512-NL1rKPz2LuyVEqwoNV+SQD4c2w1/A0rrdeT6jqTYqlt/P7y3+SWcsxyReBnImebaIu7Drtz6p9yiAsrJq5Chyg== + version "1.2.1" + resolved "https://registry.yarnpkg.com/ember-try/-/ember-try-1.2.1.tgz#4118521ec3658ebeed542b426020939935bd0f26" + integrity sha512-/10g+5bvGNBoN3uN+MMGxidUj4bw0ne453aphjeFf4T/ZF1UoFTPZ8JV+g4XhdVL49zAoeTOLpsbwV0D1M+X6w== dependencies: - chalk "^2.3.0" + chalk "^2.4.2" cli-table3 "^0.5.1" core-object "^3.1.5" - debug "^3.1.0" + debug "^4.1.1" ember-try-config "^3.0.0" execa "^1.0.0" extend "^3.0.0" fs-extra "^5.0.0" promise-map-series "^0.2.1" - resolve "^1.1.6" - rimraf "^2.3.2" + resolve "^1.10.1" + rimraf "^2.6.3" rsvp "^4.7.0" - walk-sync "^0.3.3" + walk-sync "^1.1.3" ember-weakmap@^3.0.0: version "3.3.1" @@ -12187,7 +12187,7 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -rimraf@^2.2.8, rimraf@^2.3.2, rimraf@^2.3.4, rimraf@^2.4.1, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: +rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.1, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== From 4e2b6ae1eadb6232a750669aa209218970dd8438 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 17 May 2019 07:15:53 -0400 Subject: [PATCH 413/879] Docs updates (#1621) --- addon/identity-manager.js | 85 ++- addon/orm/associations/association.js | 186 ++++- addon/serializer.js | 50 -- addon/serializers/json-api-serializer.js | 33 +- .../defining-relationships/template.md | 161 ---- .../pods/docs/advanced/factories/template.md | 403 ---------- .../pods/docs/advanced/fixtures/template.md | 44 -- .../advanced/identity-managers/template.md | 70 -- .../docs/advanced/mocking-guids/template.md | 55 ++ .../docs/advanced/route-handlers/template.md | 289 -------- .../pods/docs/advanced/shorthands/template.md | 201 ----- .../simulating-cookie-responses/template.md | 6 +- .../manually-starting-mirage/template.md | 25 - .../overriding-dependencies/template.md | 15 - .../pods/docs/data-layer/database/template.md | 62 ++ .../docs/data-layer/factories/template.md | 700 ++++++++++++++++++ .../pods/docs/data-layer/fixtures/template.md | 193 +++++ .../app/pods/docs/data-layer/orm/template.md | 403 ++++++++++ .../docs/data-layer/serializers/template.md | 255 +++++++ .../docs/examples/1-belongs-to/controller.js | 44 -- .../docs/examples/1-belongs-to/template.md | 15 - .../docs/examples/2-has-many/controller.js | 44 -- .../pods/docs/examples/2-has-many/template.md | 15 - .../app/pods/docs/examples/index/template.md | 5 - .../docs/getting-started/index/template.md | 20 - .../getting-started/installation/template.md | 8 +- .../docs/getting-started/overview/template.md | 426 +++++++++++ .../getting-started/quickstart/template.md | 302 -------- .../{upgrading => upgrade-guide}/template.md | 13 +- .../what-is-mirage/template.md | 38 + tests/dummy/app/pods/docs/index/route.js | 9 + .../docs/route-handlers/functions/template.md | 277 +++++++ .../route-handlers/shorthands/template.md | 239 ++++++ tests/dummy/app/pods/docs/template.hbs | 50 +- .../testing/acceptance-testing/template.md | 186 +++++ .../integration-and-unit-testing/template.md | 281 +++++++ .../acceptance-testing/template.md | 176 ----- .../defining-routes/template.md | 367 --------- .../seeding-your-database/template.md | 220 ------ tests/dummy/app/router.js | 51 +- 40 files changed, 3447 insertions(+), 2575 deletions(-) delete mode 100644 tests/dummy/app/pods/docs/advanced/defining-relationships/template.md delete mode 100644 tests/dummy/app/pods/docs/advanced/factories/template.md delete mode 100644 tests/dummy/app/pods/docs/advanced/fixtures/template.md delete mode 100644 tests/dummy/app/pods/docs/advanced/identity-managers/template.md create mode 100644 tests/dummy/app/pods/docs/advanced/mocking-guids/template.md delete mode 100644 tests/dummy/app/pods/docs/advanced/route-handlers/template.md delete mode 100644 tests/dummy/app/pods/docs/advanced/shorthands/template.md rename tests/dummy/app/pods/docs/{cookbook => advanced}/simulating-cookie-responses/template.md (90%) delete mode 100644 tests/dummy/app/pods/docs/cookbook/manually-starting-mirage/template.md delete mode 100644 tests/dummy/app/pods/docs/cookbook/overriding-dependencies/template.md create mode 100644 tests/dummy/app/pods/docs/data-layer/database/template.md create mode 100644 tests/dummy/app/pods/docs/data-layer/factories/template.md create mode 100644 tests/dummy/app/pods/docs/data-layer/fixtures/template.md create mode 100644 tests/dummy/app/pods/docs/data-layer/orm/template.md create mode 100644 tests/dummy/app/pods/docs/data-layer/serializers/template.md delete mode 100644 tests/dummy/app/pods/docs/examples/1-belongs-to/controller.js delete mode 100644 tests/dummy/app/pods/docs/examples/1-belongs-to/template.md delete mode 100644 tests/dummy/app/pods/docs/examples/2-has-many/controller.js delete mode 100644 tests/dummy/app/pods/docs/examples/2-has-many/template.md delete mode 100644 tests/dummy/app/pods/docs/examples/index/template.md delete mode 100644 tests/dummy/app/pods/docs/getting-started/index/template.md create mode 100644 tests/dummy/app/pods/docs/getting-started/overview/template.md delete mode 100644 tests/dummy/app/pods/docs/getting-started/quickstart/template.md rename tests/dummy/app/pods/docs/getting-started/{upgrading => upgrade-guide}/template.md (98%) create mode 100644 tests/dummy/app/pods/docs/getting-started/what-is-mirage/template.md create mode 100644 tests/dummy/app/pods/docs/index/route.js create mode 100644 tests/dummy/app/pods/docs/route-handlers/functions/template.md create mode 100644 tests/dummy/app/pods/docs/route-handlers/shorthands/template.md create mode 100644 tests/dummy/app/pods/docs/testing/acceptance-testing/template.md create mode 100644 tests/dummy/app/pods/docs/testing/integration-and-unit-testing/template.md delete mode 100644 tests/dummy/app/pods/docs/writing-your-server/acceptance-testing/template.md delete mode 100644 tests/dummy/app/pods/docs/writing-your-server/defining-routes/template.md delete mode 100644 tests/dummy/app/pods/docs/writing-your-server/seeding-your-database/template.md diff --git a/addon/identity-manager.js b/addon/identity-manager.js index 76ae9f84d..090253348 100644 --- a/addon/identity-manager.js +++ b/addon/identity-manager.js @@ -3,13 +3,28 @@ function isNumber(n) { } /** - * IdentityManager for a DbCollection - * - * @class IdentityManager - * @constructor - * @public - * @hide - */ + By default Mirage uses autoincrementing numbers starting with `1` as IDs for records. This can be customized by implementing one or more IdentityManagers for your application. + + An IdentityManager is a class that's responsible for generating unique identifiers. You can define a custom identity manager for your entire application, as well as on a per-model basis. + + A custom IdentityManager must implement these methods: + + - `fetch`, which must return an identifier not yet used + - `set`, which is called with an `id` of a record being insert into Mirage's database + - `reset`, which should reset database to initial state + + Mirage provides a blueprint to generate custom IdentityManagers: + + ``` + ember generate mirage-identity-manager + ``` + + Check out the advanced guide on Mocking UUIDs to see a complete example of a custom IdentityManager. + + @class IdentityManager + @constructor + @public +*/ class IdentityManager { constructor() { @@ -18,34 +33,40 @@ class IdentityManager { } /** - * @method get - * @private - */ + @method get + @hide + @private + */ get() { return this._nextId; } /** - * @method set - * @param {String|Number} n - * @public - */ - set(n) { - if (this._ids[n]) { - throw new Error(`Attempting to use the ID ${n}, but it's already been used`); + Registers `uniqueIdentifier` as used. + + This method should throw is `uniqueIdentifier` has already been taken. + + @method set + @param {String|Number} uniqueIdentifier + @public + */ + set(uniqueIdentifier) { + if (this._ids[uniqueIdentifier]) { + throw new Error(`Attempting to use the ID ${uniqueIdentifier}, but it's already been used`); } - if (isNumber(n) && +n >= this._nextId) { - this._nextId = +n + 1; + if (isNumber(uniqueIdentifier) && +uniqueIdentifier >= this._nextId) { + this._nextId = +uniqueIdentifier + 1; } - this._ids[n] = true; + this._ids[uniqueIdentifier] = true; } /** - * @method inc - * @private - */ + @method inc + @hide + @private + */ inc() { let nextValue = this.get() + 1; @@ -55,10 +76,12 @@ class IdentityManager { } /** - * @method fetch - * @return {String} Unique identifier - * @public - */ + Returns the next unique identifier. + + @method fetch + @return {String} Unique identifier + @public + */ fetch() { let id = this.get(); @@ -70,9 +93,11 @@ class IdentityManager { } /** - * @method reset - * @public - */ + Resets the identity manager, marking all unique identifiers as available. + + @method reset + @public + */ reset() { this._nextId = 1; this._ids = {}; diff --git a/addon/orm/associations/association.js b/addon/orm/associations/association.js index c0fc344ec..939f8ddd2 100644 --- a/addon/orm/associations/association.js +++ b/addon/orm/associations/association.js @@ -1,7 +1,169 @@ import { dasherize } from 'ember-cli-mirage/utils/inflector'; /** - @hide + To define associations on your models, use the `belongsTo` and `hasMany` helpers. Each helper adds some dynamic methods to your model. + + If you're using Ember Data, you don't need to define these relationships, as they will be inferred from your Ember Data schema automatically. + + ## Association types + + ### belongsTo + + ```js + // mirage/models/blog-post.js + import { Model, belongsTo } from 'ember-cli-mirage'; + + export default Model.extend({ + author: belongsTo() + }); + ``` + + This adds an `authorId` property to your `blogPost` model, as well as some methods for working with the associated `author` model: + + ```js + blogPost.authorId; // 1 + blogPost.authorId = 2; // updates the relationship + blogPost.author; // Author instance + blogPost.author = anotherAuthor; + blogPost.newAuthor(attrs); // new unsaved author + blogPost.createAuthor(attrs); // new saved author (updates blogPost.authorId in memory only) + ``` + Note that when a child calls `child.createParent`, the new parent is immediately saved to the `db`, but the child's foreign key is updated *on this instance only*, and is not immediately persisted to the database. + + In other words, `blogPost.createAuthor` will create a new `author` record, insert it into the `db`, and update the `blogPost.authorId` in memory, but if you were to fetch the `blogPost` from the `db` again, the relationship would not be persisted. + + To persist the new foreign key, you would call `blogPost.save()` after creating the new author. + + ### hasMany + + ```js + // mirage/models/blog-post.js + import { Model, hasMany } from 'ember-cli-mirage'; + + export default Model.extend({ + comments: hasMany() + }); + ``` + + This adds a `commentIds` property to the `blogPost` model, as well as some methods for working with the associated `comments` collection: + + ```js + blogPost.commentIds; // [1, 2, 3] + blogPost.commentIds = [2, 3]; // updates the relationship + blogPost.comments; // array of related comments + blogPost.comments = [comment1, comment2]; // updates the relationship + blogPost.newComment(attrs); // new unsaved comment + blogPost.createComment(attrs); // new saved comment (comment.blogPostId is set) + ``` + + ## Association options + + ### modelName + + If your associations model has a different name than the association itself, you can specify the `modelName` on the association. + + For example, + + ```js + // mirage/models/blog-post.js + import { Model, belongsTo, hasMany } from 'ember-cli-mirage'; + + export default Model.extend({ + author: belongsTo('user'), + comments: hasMany('annotation') + }); + ``` + + would add all the named `author` and `comment` methods as listed above, but use `user` and `annotation` models for the actual relationships. + + ### inverse + + Sometimes a `hasMany` relationship can point to a model with multiple associations of the same type. You can use the `inverse` option to specify which property on the related model is the inverse of the given relationship: + + ```js + // app/models/talk.js + export default Model.extend({ + primaryEvent: belongsTo('event'), + secondaryEvent: belongsTo('event'), + }); + + // app/models/event.js + export default Model.extend({ + talks: hasMany('talk', { inverse: 'primaryEvent' }), + }); + ``` + + ### polymorphic + + You can specify whether an association is a polymorphic association by passing `{ polymorphic: true }` as an option. + + For example, say you have a `Comment` that can belong to a `BlogPost` or a `Picture`. Here's how the model definitions would look: + + ```js + // app/models/comment.js + export default Model.extend({ + commentable: belongsTo({ polymorphic: true }) + }); + + // app/models/blog-post.js + export default Model.extend({ + comments: hasMany() + }); + + // app/models/picture.js + export default Model.extend({ + comments: hasMany() + }); + ``` + + Note that `commentable` doesn't need a type (there's no validation done on which types of models can exist on that association). + + Polymorphic associations have slightly different method signatures for their foreign keys and build/create methods. + + ```js + let comment = schema.comments.create({ text: "foo" }); + + comment.buildCommentable('post', { title: 'Lorem Ipsum' }); + comment.createCommentable('post', { title: 'Lorem Ipsum' }); + + // getter + comment.commentableId; // { id: 1, type: 'blog-post' } + + // setter + comment.commentableId = { id: 2, type: 'picture' }; + ``` + + Has-many asssociations can also be polymorphic: + + ```js + // app/models/user.js + export default Model.extend({ + things: hasMany({ polymorphic: true }) + }); + + // app/models/car.js + export default Model.extend({ + }); + + // app/models/watch.js + export default Model.extend({ + }); + + let user = schema.users.create({ name: "Sam" }); + + user.buildThing('car', { attrs }); + user.createThing('watch', { attrs }); + + // getter + user.thingIds; // [ { id: 1, type: 'car' }, { id: 3, type: 'watch' }, ... ] + + // setter + user.thingIds = [ { id: 2, type: 'watch' }, ... ]; + ``` + + @class Association + @constructor + @public */ export default class Association { @@ -25,21 +187,22 @@ export default class Association { } /** - * A setter for schema, since we don't have a reference at constuction time. - * - * @method setSchema - * @public + A setter for schema, since we don't have a reference at constuction time. + + @method setSchema + @public + @hide */ setSchema(schema) { this.schema = schema; } /** - * Returns true if the association is reflexive. - * - * @method isReflexive - * @return {Boolean} - * @public + Returns true if the association is reflexive. + + @method isReflexive + @return {Boolean} + @public */ isReflexive() { let isExplicitReflexive = !!(this.modelName === this.ownerModelName && this.opts.inverse); @@ -52,6 +215,9 @@ export default class Association { return this.opts.polymorphic; } + /** + @hide + */ get identifier() { throw new Error('Subclasses of Association must implement a getter for identifier'); } diff --git a/addon/serializer.js b/addon/serializer.js index f205b6d90..d75d13548 100644 --- a/addon/serializer.js +++ b/addon/serializer.js @@ -1023,56 +1023,6 @@ class Serializer { return `${camelize(relationshipName)}Type`; } - /** - This hook is only available on the JSONAPISerializer. - - Use this hook to override the generated `type` for the JSON:API resource object. By default, `type` will be the plural and dasherized form of the model name. - - For example, if you wanted singularized types: - - ```js - export default JSONAPISerializer.extend({ - typeKeyForModel(model) { - return dasherize(singularize(model.modelName)); - } - }); - ``` - - @method typeKeyForModel - @param model - */ - typeKeyForModel(model) { - } - - /** - This hook is only available on the JSONAPISerializer. - - Use this hook to add top-level `links` data to JSON:API resource objects. The argument is the model being serialized. - - ```js - // serializers/author.js - import { JSONAPISerializer } from 'ember-cli-mirage'; - - export default JSONAPISerializer.extend({ - - links(author) { - return { - 'posts': { - related: `/api/authors/${author.id}/posts` - } - }; - } - - }); - ``` - - @method links - @param model - */ - links(model) { - return {}; - } - /** @method isModel @param object diff --git a/addon/serializers/json-api-serializer.js b/addon/serializers/json-api-serializer.js index 5ea7ebf9b..fe0d7677d 100644 --- a/addon/serializers/json-api-serializer.js +++ b/addon/serializers/json-api-serializer.js @@ -174,6 +174,32 @@ class JSONAPISerializer extends Serializer { return dasherize(key); } + /** + Use this hook to add top-level `links` data to JSON:API resource objects. The argument is the model being serialized. + + ```js + // serializers/author.js + import { JSONAPISerializer } from 'ember-cli-mirage'; + + export default JSONAPISerializer.extend({ + + links(author) { + return { + 'posts': { + related: `/api/authors/${author.id}/posts` + } + }; + } + + }); + ``` + + @method links + @param model + */ + links() { + } + getHashForPrimaryResource(resource) { this._createRequestedIncludesGraph(resource); @@ -333,12 +359,9 @@ class JSONAPISerializer extends Serializer { hasLinksForRelationship(model, relationshipKey) { let serializer = this.serializerFor(model.modelName); - let links; - if (serializer.links) { - links = serializer.links(model); + let links = serializer.links(model); - return links[relationshipKey] != null; - } + return links && links[relationshipKey] != null; } /* diff --git a/tests/dummy/app/pods/docs/advanced/defining-relationships/template.md b/tests/dummy/app/pods/docs/advanced/defining-relationships/template.md deleted file mode 100644 index ad6c68adf..000000000 --- a/tests/dummy/app/pods/docs/advanced/defining-relationships/template.md +++ /dev/null @@ -1,161 +0,0 @@ -# Defining relationships - -In modern versions of Mirage (0.3.3 and later), Mirage's relationships are inferred from your Ember Data schema. - -If you are not using Ember Data or are on an older version of Mirage, you can manually define Mirage's Models so that you can take advantage of its many features that rely on the ORM, like Serializers and Factories. - -To define associations, use the `belongsTo` and `hasMany` helpers. Each helper adds some dynamic methods to your model. - -*belongsTo* - -```js -// mirage/models/blog-post.js -import { Model, belongsTo } from 'ember-cli-mirage'; - -export default Model.extend({ - author: belongsTo() -}); -``` - -This adds an `authorId` property to your `blogPost` model, as well as some methods for working with the associated `author` model: - -```js -blogPost.authorId; // 1 -blogPost.authorId = 2; // updates the relationship -blogPost.author; // Author instance -blogPost.author = anotherAuthor; -blogPost.newAuthor(attrs); // new unsaved author -blogPost.createAuthor(attrs); // new saved author (updates blogPost.authorId in memory only) -``` -Note that when a child calls `child.createParent`, the new parent is immediately saved to the `db`, but the child's foreign key is updated *on this instance only*, and is not immediately persisted to the database. - -In other words, `blogPost.createAuthor` will create a new `author` record, insert it into the `db`, and update the `blogPost.authorId` in memory, but if you were to fetch the `blogPost` from the `db` again, the relationship would not be persisted. - -To persist the new foreign key, you would call `blogPost.save()` after creating the new author. - -*hasMany* - -```js -// mirage/models/blog-post.js -import { Model, hasMany } from 'ember-cli-mirage'; - -export default Model.extend({ - comments: hasMany() -}); -``` - -This adds a `commentIds` property to the `blogPost` model, as well as some methods for working with the associated `comments` collection: - -```js -blogPost.commentIds; // [1, 2, 3] -blogPost.commentIds = [2, 3]; // updates the relationship -blogPost.comments; // array of related comments -blogPost.comments = [comment1, comment2]; // updates the relationship -blogPost.newComment(attrs); // new unsaved comment -blogPost.createComment(attrs); // new saved comment (comment.blogPostId is set) -``` - -### Association options - -*modelName* - -If your associations model has a different name than the association itself, you can specify the `modelName` on the association. - -For example, - -```js -// mirage/models/blog-post.js -import { Model, belongsTo, hasMany } from 'ember-cli-mirage'; - -export default Model.extend({ - author: belongsTo('user'), - comments: hasMany('annotation') -}); -``` - -would add all the named `author` and `comment` methods as listed above, but use `user` and `annotation` models for the actual relationships. - -*inverse* - -Sometimes a `hasMany` relationship can point to a model with multiple associations of the same type. You can use the `inverse` option to specify which property on the related model is the inverse of the given relationship: - -```js -// app/models/talk.js -export default Model.extend({ - primaryEvent: belongsTo('event'), - secondaryEvent: belongsTo('event'), -}); - -// app/models/event.js -export default Model.extend({ - talks: hasMany('talk', { inverse: 'primaryEvent' }), -}); -``` - -*polymorphic* - -You can specify whether an association is a polymorphic association by passing `{ polymorphic: true }` as an option. - -For example, say you have a `Comment` that can belong to a `BlogPost` or a `Picture`. Here's how the model definitions would look: - -```js -// app/models/comment.js -export default Model.extend({ - commentable: belongsTo({ polymorphic: true }) -}); - -// app/models/blog-post.js -export default Model.extend({ - comments: hasMany() -}); - -// app/models/picture.js -export default Model.extend({ - comments: hasMany() -}); -``` - -Note that `commentable` doesn't need a type (there's no validation done on which types of models can exist on that association). - -Polymorphic associations have slightly different method signatures for their foreign keys and build/create methods. - -```js -let comment = schema.comments.create({ text: "foo" }); - -comment.buildCommentable('post', { title: 'Lorem Ipsum' }); -comment.createCommentable('post', { title: 'Lorem Ipsum' }); - -// getter -comment.commentableId; // { id: 1, type: 'blog-post' } - -// setter -comment.commentableId = { id: 2, type: 'picture' }; -``` - -Has-many asssociations can also be polymorphic: - -```js -// app/models/user.js -export default Model.extend({ - things: hasMany({ polymorphic: true }) -}); - -// app/models/car.js -export default Model.extend({ -}); - -// app/models/watch.js -export default Model.extend({ -}); - -let user = schema.users.create({ name: "Sam" }); - -user.buildThing('car', { attrs }); -user.createThing('watch', { attrs }); - -// getter -user.thingIds; // [ { id: 1, type: 'car' }, { id: 3, type: 'watch' }, ... ] - -// setter -user.thingIds = [ { id: 2, type: 'watch' }, ... ]; -``` diff --git a/tests/dummy/app/pods/docs/advanced/factories/template.md b/tests/dummy/app/pods/docs/advanced/factories/template.md deleted file mode 100644 index b1abc4d70..000000000 --- a/tests/dummy/app/pods/docs/advanced/factories/template.md +++ /dev/null @@ -1,403 +0,0 @@ -# Factories - -Factories are used to seed your database, either during development or within tests. Whenever you generate an object via a factory, it will automatically get added to the database, and thus get an autogenerated `id`. - -You define factories by using the `ember g mirage-factory [name]` command, or creating files under the `mirage/factories` directory. The name of the factory is determined by the filename. - -Factories have attributes, and you create objects from factory definitions using the `server.create` and `server.createList` methods. - -## Defining factories - -Attributes can be static (strings, numbers or booleans) or dynamic (a function). Here's a factory with some static attributes: - -```js -// mirage/factories/user.js -import { Factory } from 'ember-cli-mirage'; - -export default Factory.extend({ - name: 'Link', - age: 563, - evil: false, -}); -``` - -Functions receive the sequence number *i* as an argument, which is useful to create dynamic attributes: - -```js -// mirage/factories/user.js -import { Factory } from 'ember-cli-mirage'; - -export default Factory.extend({ - name(i) { - return 'User ' + i - } -}); -``` - -The first user generated (per test) would have a name of `User 0`, the second a name of `User 1`, and so on. - - - -Finally, you can also reference attributes from within a dynamic attribute via `this`: - -```js -// mirage/factories/contact.js -import { Factory } from 'ember-cli-mirage'; - -export default Factory.extend({ - - age: 18, - - isAdmin(i) { - return this.age > 30; - } - -}); -``` - -This even works with other dynamic attributes: - -```js -// mirage/factories/contact.js -import { Factory } from 'ember-cli-mirage'; - -export default Factory.extend({ - - email(i) { - return `email${i}@acme.com`; - }, - - isAdmin(i) { - return this.email === 'email1@acme.com'; - } - -}); -``` - -You'll get an error if you create an invalid cycle of dynamic attributes. - -You can also customize the objects created by your factory using the -`afterCreate()` hook. This hook fires after the object is built (so all the -attributes you've defined will be populated) but before that object is returned. - - -The `afterCreate()` method is given two arguments: the newly created object, and -a reference to the server. This makes it useful if you want your factory-created -objects to be aware of the rest of the state of your Mirage database, or build -relationships (as we'll see in a moment): - -```js -// mirage/factories/contact.js -import { Factory } from 'ember-cli-mirage'; - -export default Factory.extend({ - - isAdmin(i) { - return Math.random() > 0.5; - }, - - afterCreate(contact, server) { - // Only allow a max of 5 admins to be created - if (server.schema.contacts.where({ isAdmin: true }).models.length >= 5) { - contact.update({ isAdmin: false }); - } - } - -}); -``` - ---- - -You should define the attributes of your factory as the "base case" for your objects, and override them within your tests. We'll discuss how do to this in the Creating Objects section. - -## Working with relationships - -When building objects using factories, you may want to create related objects automatically. To build related objects for `belongsTo` relationships, you can use `association` helper. - -Start with defining relationships in your models so that they can be introspected for the details like relationship name: - -``` js -// mirage/models/article.js -import { Model, belongsTo } from 'ember-cli-mirage'; - -export default Model.extend({ - author: belongsTo() -}); -``` - -``` js -// mirage/models/author.js -import { Model } from 'ember-cli-mirage'; - -export default Model.extend(); -``` - -And simply indicate which attributes are `association`s: - -``` js -// mirage/factories/article.js -import { Factory, association } from 'ember-cli-mirage'; - -export default Factory.extend({ - title: 'ember-cli-mirage rockzzz', - author: association() -}); -``` - -You can also pass a list of traits and overrides as arguments to `association` helper: - -``` js -// mirage/factories/author.js -import { Factory, trait } from 'ember-cli-mirage'; - -export default Factory.extend({ - withNames: trait({ - firstName: 'Yehuda', - lastName: 'Katz' - }) -}); -``` - -``` js -// mirage/factories/article.js -import { Factory, association } from 'ember-cli-mirage'; - -export default Factory.extend({ - title: 'ember-cli-mirage rockzzz', - author: association('withNames', { lastName: 'Dale' }) -}); -``` - -You can also use the `afterCreate()` hook (for both `hasMany` and `belongsTo` relationships): - -```js -// mirage/factories/author.js -import { Factory } from 'ember-cli-mirage'; - -export default Factory.extend({ - firstName(i) { - return `Author ${i}`; - }, - - afterCreate(author, server) { - server.create('post', { author }); - } -}); -``` - -Because the `afterCreate()` hook is called with the newly created object and a reference to the server, you can construct complex object graphs to associate with your newly created object. - -## Traits - -Factory traits make it easy to group related attributes: - -```js -// mirage/factories/post.js -import { Factory, trait } from 'ember-cli-mirage'; - -export default Factory.extend({ - title: 'Lorem ipsum', - - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }) -}); -``` - -You can pass anything into `trait` that you can into the base factory. - -To use a trait, pass the trait name in as string argument to `server.create`: - -``` js -server.create('post', 'published'); -``` - -You can also compose multiple traits together: - -```js -// mirage/factories/post.js -import { Factory, trait } from 'ember-cli-mirage'; - -export default Factory.extend({ - title: 'Lorem ipsum', - - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), - - official: trait({ - isOfficial: true - }) -}); - -// Use -let officialPost = server.create('post', 'official'); -let officialPublishedPost = server.create('post', 'official', 'published'); -``` - -As always, you can pass in an `attrs` hash as the last argument for attribute overrides: - -```js -server.create('post', 'published', { title: 'My first post' }); -``` - -When combined with the `afterCreate()` hook, traits simplify the process of setting up related object graphs. Here we create 10 posts each having 3 associated comments: - -``` js -// mirage/factories/post.js -import { Factory, trait } from 'ember-cli-mirage'; - -export default Factory.extend({ - title: 'Lorem ipsum', - - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), - - withComments: trait({ - afterCreate(post, server) { - server.createList('comment', 3, { post }); - } - }) -}); - -// Use -server.createList('post', 10, 'withComments'); -``` - -Traits improve your test suite by pulling unnecessary knowledge about data setup out of your tests. If you're writing a test module to verify the behavior of a comment box on a blog post page, each test will need a post to exist as part of its setup. If a post requires a user, and that user requires a session and perhaps a subscription, you don't want to repeat this knowledge in each of your comment tests. Instead, create a trait that has meaning within your domain - say, a published post - to simplify the data setup needed to write each of your comment tests. This leads to a more concise, expressive test suite, which will help future developers who come into your codebase better understand the expected behavior of your application. - -## Using Faker.js - -The [Faker.js](https://github.com/marak/Faker.js/) library pairs nicely with with Mirage factories. It used to be directly included with Mirage, since import npm libraries was a hassle, but with the advent of [Ember Auto Import](https://github.com/ef4/ember-auto-import/issues) it is easier than ever for apps and addons to include it on their own. - -To use Faker, make sure your app or addon has Auto Import installed, then install `faker` from npm: - -```sh -ember install ember-auto-import -yarn add -D faker -``` - -Now you can use Faker's methods in your Mirage factories: - -```js -// mirage/factories/user.js -import { Factory } from 'ember-cli-mirage'; -import faker from 'faker'; - -export default Factory.extend({ - firstName() { - return faker.name.firstName(); - }, - lastName() { - return faker.name.lastName(); - }, - avatar() { - return faker.internet.avatar(); - } -}); -``` - -You of course can use alternatives to Faker, like [Chance.js](https://chancejs.com/), in a similar way. - - -## Extending factories - -You can extend factories: - -```js -// mirage/factories/human.js -import { Factory } from 'ember-cli-mirage'; - -export default Factory.extend({ - species: 'homo sapiens' -}); - -// mirage/factories/man.js -import Human from './human'; - -export default Human.extend({ - gender: 'male' -}); -``` - -## Creating objects - -Once you've defined a factory for a model, you can generate data for that model using `server.create` and `server.createList`, either from within `mirage/scenarios/default.js` for development, or from within your acceptance tests. - -# server.create(type [, attrs]) - -Generates a single model of type *type*, inserts it into the database (giving it an id), and returns the data that was -added. - -```js -test("I can view a contact's details", function() { - var contact = server.create('contact'); - - visit('/contacts/' + contact.id); - - andThen(() => { - equal( find('h1').text(), 'The contact is Link'); - }); -}); -``` - -You can override the attributes from the factory definition with a -hash passed in as the second parameter. For example, if we had this factory - -```js -export default Factory.extend({ - name: 'Link' -}); -``` - -we could override the name like this: - -```js -test("I can view the contacts", function() { - server.create('contact', {name: 'Zelda'}); - - visit('/'); - - andThen(() => { - equal( find('p').text(), 'Zelda' ); - }); -}); -``` - -# server.createList(type, amount [, attrs]) - -Creates *amount* models of type *type*, optionally overriding the attributes from the factory with *attrs*. - -Returns the array of records that were added to the database. - -Here's an example from a test: - -```js -test("I can view the contacts", function() { - server.createList('contact', 5); - var youngContacts = server.createList('contact', 5, {age: 15}); - - visit('/'); - - andThen(function() { - equal(currentRouteName(), 'index'); - equal( find('p').length, 10 ); - }); -}); -``` - -And one from setting up your development database: - -```js -// mirage/scenarios/default.js -export default function(server) { - var contact = server.create('contact'); - server.createList('address', 5, {contactId: contact.id}); -} -``` diff --git a/tests/dummy/app/pods/docs/advanced/fixtures/template.md b/tests/dummy/app/pods/docs/advanced/fixtures/template.md deleted file mode 100644 index bf0288f56..000000000 --- a/tests/dummy/app/pods/docs/advanced/fixtures/template.md +++ /dev/null @@ -1,44 +0,0 @@ -# Fixtures - -Fixtures are data files that can be used to seed your database, either during development or within tests. In general Mirage recommends using factories over fixtures, though there are times where fixtures are suitable. - -To add data to a database table `countries`, for instance, first create the file `mirage/fixtures/countries.js`: - -```js -// mirage/fixtures/countries.js -export default [ - {id: 1, name: 'United States'}, - {id: 2, name: 'Canada'}, - {id: 3, name: 'Mexido'}, - ... -]; -``` - -Fixture filenames are always plural, and export arrays of POJOs. - -To load this fixture file into our database during development, we can use the `loadFixtures` API in our `scenarios/default.js` file: - -```js -// mirage/scenarios/default.js -export default function(server) { - server.loadFixtures('countries'); -} -``` - -We can also call `server.loadFixtures()` (with no arguments) to have all defined fixture files loaded into the database. - -Similarly, we can call `loadFixtures` from within a test to load this data into our database: - -```js -test('I can see the countries', function() { - server.loadFixtures('countries'); - - visit('/'); - - andThen(function() { - equal( find('select.countries option').length, 100 ); - }); -}); -``` - -See the `server.loadFixtures` API docs for more information. diff --git a/tests/dummy/app/pods/docs/advanced/identity-managers/template.md b/tests/dummy/app/pods/docs/advanced/identity-managers/template.md deleted file mode 100644 index 7d627b84d..000000000 --- a/tests/dummy/app/pods/docs/advanced/identity-managers/template.md +++ /dev/null @@ -1,70 +0,0 @@ -# Identity managers - -By default Mirage uses auto incremental numbers starting with `1` as IDs for records. This could be customized by implementing *identity managers*. - -An identity manager is a class generating unique identifiers. You could provide a custom identity manager per application and per model. - -A custom identity manager must implement these methods: - -- `fetch`, which must return an identifier not used yet. -- `set`, which is called with an `id` of a record being insert in mirage's database. -- `reset`, which should reset database to initial state. - -Mirage provides a blueprint to generate custom identity managers: `ember generate mirage-identity-manager ` - -For example an identity manager mocking UUIDs would look like this: - -```js -import { v4 as getUuid } from "ember-uuid"; - -export default class { - constructor() { - this.ids = new Set(); - } - - /** - * Returns an unique identifier. - * - * @method fetch - * @param {Object} data Records attributes hash - * @return {String} Unique identifier - * @public - */ - fetch() { - let uuid = getUuid(); - while (this.ids.has(uuid)) { - uuid = getUuid(); - } - - this.ids.add(uuid); - - return uuid; - } - - /** - * Register an identifier. - * Must throw if identifier is already used. - * - * @method set - * @param {String|Number} id - * @public - */ - set(id) { - if (this.ids.has(id)) { - throw new Error(`ID ${id} is inuse.`); - } - - this.ids.add(id); - } - - /** - * Reset identity manager. - * - * @method reset - * @public - */ - reset() { - this.ids.clear(); - } -} -``` diff --git a/tests/dummy/app/pods/docs/advanced/mocking-guids/template.md b/tests/dummy/app/pods/docs/advanced/mocking-guids/template.md new file mode 100644 index 000000000..0618fcb2a --- /dev/null +++ b/tests/dummy/app/pods/docs/advanced/mocking-guids/template.md @@ -0,0 +1,55 @@ +# Mocking GUIDs + +Some applications use GUIDs (or UUIDs) instead of auto-incrementing integers as identifiers for their models. + +Mirage supports the ability to overwrite how its database assigns IDs to new records via the `IdentityManager` class. You can generate model-specific managers or an application-wide manager to customize how your database behaves. + +To generate a new identity manager, use the blueprint: + +``` +ember generate mirage-identity-manager +``` + +A custom identity manager must implement these methods: + +- `fetch`, which must return an identifier not used yet. +- `set`, which is called with an `id` of a record being insert in mirage's database. +- `reset`, which should reset database to initial state. + +Here's an example implementation for an identity manager that mocks GUIDs: + +```js +import { v4 as getUuid } from "ember-uuid"; + +export default class { + constructor() { + this.ids = new Set(); + } + + // Returns a new unused unique identifier. + fetch() { + let uuid = getUuid(); + while (this.ids.has(uuid)) { + uuid = getUuid(); + } + + this.ids.add(uuid); + + return uuid; + } + + // Registers an identifier as used. Must throw if identifier is already used. + set(id) { + if (this.ids.has(id)) { + throw new Error(`ID ${id} has already been used.`); + } + + this.ids.add(id); + } + + // Resets all used identifiers to unused. + reset() { + this.ids.clear(); + } +} +``` diff --git a/tests/dummy/app/pods/docs/advanced/route-handlers/template.md b/tests/dummy/app/pods/docs/advanced/route-handlers/template.md deleted file mode 100644 index 12f616cf8..000000000 --- a/tests/dummy/app/pods/docs/advanced/route-handlers/template.md +++ /dev/null @@ -1,289 +0,0 @@ -# Route handlers - -You define route handlers using the verb methods (`get`, `post`, `put`/`patch`, and `del`). All handlers have the following signature: - -```js -this.verb(path, handler[, responseCode, options={}]); -``` - -There are three types of route handlers: [shorthand](#shorthands), [object](#object-handler), and [function](#function-handler). - -The status code for all three types defaults to the following, based on the verb being used for the route: - - - GET is 200 - - PUT/PATCH is 204 - - POST is 201 - - DEL is 204 - -PUT/PATCH and POST change to 200 if there is a response body. - -The optional `options` hash passed as the last parameter has `timing` and `coalesce` options. - -# options.timing - -Set the timing parameter of the response for this particular route. Default is a 400ms delay during development and 0 delay in testing (so your tests run fast). - -Note you can set a [global timing parameter](/docs/api/modules/ember-cli-mirage/server~Server#timing) for all routes. Individual timing parameters override the global setting. - -Example: - -```js -this.post('/users', { timing: 1500 }); - -this.get('/complex_query', () => { - return [1, 2, 3, 4, 5]; -}, { timing: 3000 }); -``` - -If you want to add delays to a particular test's routes, you can override the timing for individual tests by putting the timing parameter in your test - -```js -test('Call this route with a delay', function() { - server.timing = 10000; - // ... -}); -``` - -Or for all tests in a particular module - -```js -module('Add delayed route calls to multiple tests', function() { - server.timing = 10000; - - test('It slowly calls a route', function() { - // ... - }); - - test ('It slow calls another route', function() { - // ... - }); -}); -``` - -Because the server is restarted after each test, you don't have to worry about this leaking into other tests. - - -# options.coalesce - -This option only affects the [*Array of Objects* version of the GET shorthand](../shorthands/#get-shorthands). It is ignored by all other route handlers. - - -## Shorthands - -```js -this.verb(path, shorthand[, responseCode]); -``` - -*shorthand* can either be a string, an array, or `undefined`, depending on which shorthand you're using. View [the reference](../shorthands) for all available shorthands. - -Examples: - -```js -this.get('/api/authors'); -this.put('/api/authors/:id'); -this.del('/posts/:id'); -``` - -## Object handler - -```js -this.verb(path, object[, responseCode]); -``` - -*object* is a POJO that's returned for this route. - -Example: - -```js -this.get('/api/authors/current', {id: 1, name: 'Link'}); -this.get('/some/secret', {message: 'unauthorized'}, 404); -``` - -## Function handler - -Write a custom function to handle this route. - -```js -this.verb(path, (schema, request) => { - // your code -}[, responseCode]); -``` - -The function handler you define takes two parameters, **schema** (your Mirage server's ORM) and **request** (the Pretender request object). Consult [the schema's API](/docs/api/modules/ember-cli-mirage/orm/schema~Schema) for how to interact with your models (or the database directly) and [Pretender's docs](https://github.com/trek/pretender) for more info on the request object. - -If the data returned from your handler is a JavaScript object or array, it will be stringified and sent as the response body of your request: - -```js -this.get('/api/events', () => { - let events = []; - - for (var i = 0; i < 100; i++) { - events.push({ - id: i, - value: Math.random() * 100 - }); - }; - - return events; // will be JSON.stringified by Mirage -}); -``` - -Returning a Model or Collection (from `schema`) lets you take advantage of the serializer layer. - -```js -this.get('/api/users/:id', ({ users }, request) => { - return users.find(request.params.id); -}); -``` - -This handler returns a User model, which will pass through the UserSerializer if one exists, or the ApplicationSerializer otherwise. - -You can also return an instance of `Response` to dynamically set headers and the status code: -```js -import Response from 'ember-cli-mirage/response'; -``` -```js -this.post('/api/messages', (schema, request) => { - var params = JSON.parse(request.requestBody); - - if (!params.title) { - return new Response(422, {some: 'header', 'Content-Type': 'application/json'}, { - errors: [{ - status: 422, - title: 'email is invalid', - description: 'email cannot be blank' - }] - }); - } else { - return schema.messages.create(params); - } -}); -``` - -If you return a string, it will not be `JSON.stringified`, so you can return responses other than JSON. - -You may optionally return a promise resolving to any of the above, e.g.: - -```js -this.get('/users', () => { - return new Promise(resolve => { - resolve(new Response(200, { 'Content-Type': 'text/csv' }, 'firstname,lastname\nbob,dylan')); - }); -}); -``` - - -### Helpers - -The following helpers are available in your function handlers. - -# this.serialize(modelOrCollection[, serializerName]) - -This helper returns the serialized JSON for the given *modelOrCollection*. It's useful if you want to do some final munging on the serialized JSON before returning it. - -```js -this.get('/api/authors', function({ authors }) { - let json = this.serialize(authors.all()); - - json.meta = { page: 1 }; - - return json; -}); -``` - -By default this method uses the named serializer for the given Model or Collection. You can pass in a specific serializer via `serializerName`: - -```js -this.get('/api/authors', function({ authors }) { - let json = this.serialize(authors.all(), 'sparse-author'); - - json.meta = { page: 1 }; - - return json; -}); -``` - -# this.normalizedRequestAttrs([ modelName ]) - -This helper will return the body of a request in a normalized form, suitable for working with and creating records. - -For example, if your Ember app makes a POST request with this data - -``` -POST /users - -{ - data: { - type: 'users', - attributes: { - 'first-name': 'Conan', - 'middle-name': 'the', - 'last-name': 'Barbarian' - }, - relationships: { - team: { - data: { - type: 'teams', - id: 1 - } - } - } - } -} -``` - -then `normalizedRequestAttrs()` could be used like this - -```js -this.post('/users', function(schema, request) { - let attrs = this.normalizedRequestAttrs(); - /* - attrs = { - firstName: 'Conan', - middleName: 'the', - lastName: 'Barbarian', - teamId: '1' - } - */ - return schema.users.create(attrs); -}); -``` - -Note that attribute keys were camelCased, and the `team` foreign key was extracted. This is because a `user` owns the `team` foreign key; if another relationship were included in the request but the `user` did not own its foreign key, it would not have been extracted. - -Note that this helper method leverages your serializer's `normalize` function. In the example above, it's assumed that the app was using the `JSONAPISerializer`, which comes with the `#normalize` method already written. If you're not using one of the bundled serializers, you'll need to implement `#normalize` and have it return a JSON:API document to take advantage of this method. - -Additionally, you'll need to use a full `function` here, as opposed to an ES6 arrow function (e.g `() => { ... }`). This is because `normalizeRequestAttrs` requires the `this` context from the function handler, and an arrow function would bind this from the outer scope. - -`normalizedRequestAttrs()` relies on a `modelName` to work and attempts to automatically detect it based on the URL of the request. If you use conventional URLs – for example, PATCH /users/1 – the helper should work. If you are using something custom – for example, PATCH /users/edit/1 – you’ll need to provide the `modelName` to the helper: - -```js -this.patch('/users/edit/:id', function(schema, request) { - let attrs = this.normalizedRequestAttrs('user'); - ... -}); -``` - -## External origins - -You can use Mirage to simulate other-origin requests. By default, a route like - -```js -this.get('/contacts', ...) -``` - -will hit the same origin that's serving your Ember app. To handle a different origin, use the fully qualified domain name: - -```js -this.get('http://api.twitter.com/v1', ...) -``` - -If your entire Ember app uses an external (other-origin) API, you can globally configure the domain via `urlPrefix`: - -```js -// mirage/config.js -this.urlPrefix = 'https://my.api.com'; - -// This route will handle requests to https://my.api.com/contacts -this.get('/contacts', ...) -``` diff --git a/tests/dummy/app/pods/docs/advanced/shorthands/template.md b/tests/dummy/app/pods/docs/advanced/shorthands/template.md deleted file mode 100644 index 9178d6c02..000000000 --- a/tests/dummy/app/pods/docs/advanced/shorthands/template.md +++ /dev/null @@ -1,201 +0,0 @@ -# Shorthand reference - -A *shorthand* is a simple way to define a route handler for common API scenarios. Here's a reference of each shorthand, along with the raw route handler that the shorthand represents. - -In Mirage 0.1, shorthands responded with objects and arrays directly from the database. In 0.2, shorthands return Models and Collections, meaning you can customize the format of the response in the [serializer layer](../serializers). - -Shorthands use default status codes, based on the HTTP verb: - - - GET, PUT and DEL are 200 - - POST is 201 - -## GET shorthands - -*Collection* - -```js -// shorthand -this.get('/contacts'); // finds type by singularizing url -this.get('/contacts', 'users'); // optionally specify the collection as second param - -// equivalent -this.get('/contacts', ({ contacts }) => { - return contacts.all(); // users in the second case -}); -``` - -*Model* - -``` -// shorthand -this.get('/contacts/:id'); // finds type by singularizing url -this.get('/contacts/:id', 'user'); // optionally specify the type as second param - -// equivalent -this.get('/contacts/:id', ({ contacts }, request) => { - let id = request.params.id; - - return contacts.find(id); // users in the second case -}); -``` - -*Array of Models* - -For example, `GET /contacts?ids=1,3` - -```js -// shorthand -this.get('/contacts', { coalesce: true }); -this.get('/contacts', 'users', { coalesce: true }); - -// equivalent -this.get('/contacts', ({ contacts }, request) => { - let ids = request.queryParams.ids; - - return contacts.find(ids); // users in the second case -}); -``` - ---- - -*Note: there used to be a *Single record with related records *shorthand. You should now use serializers and relationships to solve this problem.* - -## POST shorthands - -*Creating a resource* - -```js -// shorthand -this.post('/contacts'); // finds type by singularizing url -this.post('/contacts', 'user'); // optionally specify the type as second param - -// equivalent -this.post('/contacts', function({ contacts }, request) { - let attrs = this.normalizedRequestAttrs(); - - return contacts.create(attrs); -}); -``` - -For this POST shorthand to work, Mirage needs to know the format of the JSON payload your Ember app sends along with the request, so that it can insert the appropriate data into the database. See [the note on normalize](../serializers/#normalizejson) in the Serializer docs for more information. - -## PUT shorthands - -*Update a resource* - -```js -// shorthand -this.put('/contacts/:id'); // finds type by singularizing url -this.put('/contacts/:id', 'user'); // optionally specify the type as second param - -// equivalent -this.put('/contacts/:id', function({ contacts }, request) { - let id = request.params.id; - let attrs = this.normalizedRequestAttrs(); - - return contacts.find(id).update(attrs); -}); -``` - -For this PUT shorthand to work, Mirage needs to know the format of the JSON payload your Ember app sends along with the request, so that it can insert the appropriate data into the database. See the note on normalize in the Serializer docs for more information. - -## DELETE shorthands - -*Remove a resource* - -```js -// shorthand -this.del('/contacts/:id'); // finds type by singularizing url -this.del('/contacts/:id', 'user'); // optionally specify the type as second param - -// equivalent -this.del('/contacts/:id', ({ contacts }, request) => { - let id = request.params.id; - - contacts.find(id).destroy(); -}); -``` - -*Remove a resource and related models* - -To use this shorthand, make sure you have the appropriate `hasMany`/`belongsTo` relationships defined on your models. - -```js -// shorthand -this.del('/contacts/:id', ['contact', 'addresses']); - -// equivalent -this.del('/contacts/:id', ({ contacts }, request) => { - let id = request.params.id; - let contact = contacts.find(id); - - contact.addresses.destroy(); - contact.destroy(); -}); -``` - -## Resource helper - -For handling generic CRUD, you can use *resource* helper which will take care of defining all shorthands. The following examples are equivalent: - -```js -// shorthand -this.resource('contacts'); // available in 0.2.2+ - -// equivalent -this.get('/contacts'); -this.get('/contacts/:id'); -this.post('/contacts'); -this.put('/contacts/:id'); -this.patch('/contacts/:id'); -this.del('/contacts/:id'); -``` - -You can also whitelist which route handlers will be defined using *only* option: - -```js -// shorthand -this.resource('contacts', { only: ['index', 'show'] }); - -// equivalent -this.get('/contacts'); -this.get('/contacts/:id'); -``` - -or which route handlers shouldn't be defined using *except* option: - -```js -// shorthand -this.resource('contacts', { except: ['update'] }); - -// equivalent -this.get('/contacts'); -this.get('/contacts/:id'); -this.post('/contacts'); -this.del('/contacts/:id'); -``` - -If your route path and collection names do not match, you can define a relative or absolute path using the *path* option: - -```js -// shorthand -this.resource('blog-posts', { path: '/posts' }); - -// equivalent -this.get('/posts', 'blog-posts'); -this.get('/posts/:id', 'blog-posts'); -this.post('/posts', 'blog-posts'); -this.put('/posts/:id', 'blog-posts'); -this.patch('/posts/:id', 'blog-posts'); -this.del('/posts/:id', 'blog-posts'); -``` - -Here is the full reference of actions' names you can pass to *only* / *except* options and the shorthands they stand for: - -| Action | Shorthand | -|:-------|:---------------------------------------------| -| index | `this.get('/contacts')` | -| show | `this.get('/contacts/:id')` | -| create | `this.post('/contacts')` | -| update | `this.patch('contacts/:id')` (or `this.put`) | -| delete | `this.del('/contacts/:id')` | diff --git a/tests/dummy/app/pods/docs/cookbook/simulating-cookie-responses/template.md b/tests/dummy/app/pods/docs/advanced/simulating-cookie-responses/template.md similarity index 90% rename from tests/dummy/app/pods/docs/cookbook/simulating-cookie-responses/template.md rename to tests/dummy/app/pods/docs/advanced/simulating-cookie-responses/template.md index d044d8329..a4687381b 100644 --- a/tests/dummy/app/pods/docs/cookbook/simulating-cookie-responses/template.md +++ b/tests/dummy/app/pods/docs/advanced/simulating-cookie-responses/template.md @@ -10,14 +10,14 @@ However, you can simulate receiving cookies from an ajax call at the browser level by setting them in a route function handler: -```javascript -this.post('/users/login', ({ users }) => { +```js +this.post('/users/login', schema => { // log in for 24 hours let now = new Date(); let cookieExpiration = new Date(now.getTime() + (24 * 3600 * 1000)); document.cookie=`remember_me=cookie-content-here; domain=.dev-domain; path=/; expires=${cookieExpiration.toUTCString()};`; - return users.find(1); + return schema.users.find(1); }); ``` diff --git a/tests/dummy/app/pods/docs/cookbook/manually-starting-mirage/template.md b/tests/dummy/app/pods/docs/cookbook/manually-starting-mirage/template.md deleted file mode 100644 index bb1e85448..000000000 --- a/tests/dummy/app/pods/docs/cookbook/manually-starting-mirage/template.md +++ /dev/null @@ -1,25 +0,0 @@ -# Manually starting Mirage - -Mirage currently starts automatically (when not disabled in your application config) **in acceptance tests only**. This is because Mirage's server boots up in an Ember initializer. - -You can still start a Mirage server **for your integration and unit tests** with the following workaround: - -```js -// tests/integration/components/your-test.js -import { startMirage } from 'yourapp/initializers/ember-cli-mirage'; - -moduleForComponent('your-component', 'Integration | Component | your component', { - integration: true, - beforeEach() { - this.server = startMirage(); - }, - afterEach() { - this.server.shutdown(); - } -}); -``` - -Some notes: - -* In an Ember addon, you'll need to change the import path to `dummy/initializers/ember-cli-mirage`. -* The Mirage configuration of `urlPrefix` and `namespace` may require to be adapted when used with integration or unit tests. diff --git a/tests/dummy/app/pods/docs/cookbook/overriding-dependencies/template.md b/tests/dummy/app/pods/docs/cookbook/overriding-dependencies/template.md deleted file mode 100644 index 69a0f34f2..000000000 --- a/tests/dummy/app/pods/docs/cookbook/overriding-dependencies/template.md +++ /dev/null @@ -1,15 +0,0 @@ -# Overriding dependencies - -Mirage has several dependencies it relies on to function, including [Pretender.js](https://github.com/pretenderjs/pretender), a [fetch polyfill](https://github.com/github/fetch), and others. - -If you find yourself in a situation where you need specific features from any of these dependencies, but the version currently bundled with Mirage does not have those features, you have a few options: - -1. Submit a PR to Mirage upgrading its version of that dependency, and wait until that PR gets merged. - -2. Add the version of the dependency you want to your own project's `package.json` file, and use [yarn resolutions](https://yarnpkg.com/lang/en/docs/selective-version-resolutions/) to ensure that only that version of the dependency ends up in your build. - - If you do this, be aware that Mirage may not function properly if it relies on an API that changed between its bundled version and the version you specified. The only way to know for sure is to test your application using the new bundle. - ---- - -If you'd like to read more about the general problem of overriding transitive dependencies, check out {{#docs-link 'blog.detail' 'how-to-reliably-override-npm-dependencies-1497'}}this blog post{{/docs-link}}. diff --git a/tests/dummy/app/pods/docs/data-layer/database/template.md b/tests/dummy/app/pods/docs/data-layer/database/template.md new file mode 100644 index 000000000..1253ee0c3 --- /dev/null +++ b/tests/dummy/app/pods/docs/data-layer/database/template.md @@ -0,0 +1,62 @@ +# The Database + +At the core of Mirage's data layer is a simple in-memory database. This database stores all of Mirage's initial state, and then your route handlers access and modify that state as you use your application. + +The database is what allows Mirage to mimic a production server, giving you the ability to write complete dynamic features in your Ember app. + +Most of your Mirage code will not access the database directly, but rather will interact with it through Mirage's ORM. We'll cover the ORM in the next section of these guides. + +However, it's good to know that whether or not you use the ORM, you can always interact with the database directly. + +For example, you could seed it with some data in `scenarios/default.js` + +```js +// scenarios/default.js +export default function(server) { + server.db.loadData({ + movies: [ + { title: 'Interstellar' }, + { title: 'Inception' }, + { title: 'Dunkirk' }, + ] + }); +} +``` + +and then can access it in your route handlers using the `schema` argument: + +```js +this.get('/movies', (schema, request) => { + return schema.db.movies; +}); +``` + +This route handler would then respond with the data you loaded: + +```js +[ + { id: '1', title: 'Interstellar' }, + { id: '2', title: 'Inception' }, + { id: '3', title: 'Dunkirk' } +] +``` + +Note that each record has an `id` field, since the database assigns all new records an auto-incrementing ID. + +The most common place you'll use the database directly is in your tests, where you can access it via `this.server.db`. It can be useful to assert against the state of Mirage's database to verify that your Ember app's network requests are sending over the correct data. + +```js +// tests/movie-test.js +test('I can create a movie', async function(assert) { + await visit('/movies/new'); + await fillIn('.title', 'The Dark Knight'); + await click('.submit'); + + assert.dom('h2').includesText('New movie saved!'); + assert.equal(this.server.db.movies[0].title, 'The Dark Knight'); +}); +``` + +You can view the rest of the Database APIs in the {{docs-link 'Db' 'docs.api.item' 'modules/ember-cli-mirage/db-collection~DbCollection'}} and {{docs-link 'DbCollection' 'docs.api.item' 'modules/ember-cli-mirage/db~Db'}} API reference. + +Next, we'll learn about Mirage's ORM. diff --git a/tests/dummy/app/pods/docs/data-layer/factories/template.md b/tests/dummy/app/pods/docs/data-layer/factories/template.md new file mode 100644 index 000000000..76b131196 --- /dev/null +++ b/tests/dummy/app/pods/docs/data-layer/factories/template.md @@ -0,0 +1,700 @@ +# Factories + +One of the main benefits of using Mirage is the ability to quickly put your server into different states. + +For example, you might be developing a feature and want to see how the UI renders for both a logged-in user and an anonymous user. This is the kind of thing that's a pain when using a real backend server, but with Mirage it's as simple as flipping a JavaScript variable and live-reloading your Ember app. + +**Factories** are classes that help you organize your data-creation logic, making it easier to define different server states during development or within tests. + +Let's see how they work. + +## Defining factories + +### Your first factory + +Say we have a `Movie` model defined in Mirage. (Remember, if you're using Ember Data you won't have this file on disk. The Model definition will be automatically generated for you.) + +```js +// mirage/models/movie.js +import { Model } from 'ember-cli-mirage'; + +export default Model.extend({ +}); +``` + +To seed Mirage's database with some movies so you can start developing your app, use the `server.create` method in the `scenarios/default.js` file: + +```js +// mirage/scenarios/default.js +export default function(server) { + + server.create('movie'); + +} +``` + +`server.create` takes the singular hyphenated form of your model's class name as its first argument. + +Because we have no Factory defined for a `Movie`, `server.create('movie')` will just create an empty record and insert it into the database: + +```js +// server.db.dump(); +{ + movies: [ + { id: '1' } + ] +} +``` + +Not a very interesting record. + +However, we can pass attributes of our own as the second argument to `server.create`: + +```js +// mirage/scenarios/default.js +export default function(server) { + + server.create('movie', { + title: 'Interstellar', + releaseDate: '10/26/2014', + genre: 'Sci-Fi' + }); + +} +``` + +Now our database looks like this + +```js +{ + movies: [ + { + id: '1', + title: 'Interstellar', + releaseDate: '10/26/2014', + genre: 'Sci-Fi' + } + ] +} +``` + +and we'll actually be able to develop our UI against realistic data. + +This is a great way to start, but it can be cumbersome to manually define every attribute (and relationship) when working on data-driven applications. It would be nice if we had a way to dynamically generate some of these attributes. + +Fortunately, that's exactly what Factories let us do! + +Let's generate a Factory for our movie using + +``` +ember g mirage-factory movie +``` + +which creates this file: + +```js +// mirage/factories/movie.js +import { Factory } from 'ember-cli-mirage'; + +export default Factory.extend({ +}); +``` + +Right now the Factory is empty. Let's define a property on it: + +```js +// mirage/factories/movie.js +import { Factory } from 'ember-cli-mirage'; + +export default Factory.extend({ + + title: 'Movie title' + +}); +``` + +Now `server.create('movie')` will use the properties from this factory. The inserted record will look like this: + +```js +{ + movies: [ + { id: '1', title: 'Movie title' } + ] +} +``` + +We can also make this property a function. + +```js +// mirage/factories/movie.js +import { Factory } from 'ember-cli-mirage'; + +export default Factory.extend({ + + title(i) { + return `Movie ${i}`; + } + +}); +``` + +`i` is an incrementing index that lets us make our factory attributes more dynamic. + +If we use the `server.createList` method, we can quickly generate five movies + +```js +server.createList('movie', 5); +``` + +and with the above factory definition, our database will look like this: + +```js +{ + movies: [ + { id: '1', title: 'Movie 1' }, + { id: '2', title: 'Movie 2' }, + { id: '3', title: 'Movie 3' }, + { id: '4', title: 'Movie 4' }, + { id: '5', title: 'Movie 5' } + ] +} +``` + +Let's add some more properties to our factory: + +```js +// mirage/factories/movie.js +import { Factory } from 'ember-cli-mirage'; +import faker from 'faker'; + +export default Factory.extend({ + + title(i) { + return `Movie ${i}`; + }, + + releaseDate() { + return faker.date.past().toLocaleDateString(); + }, + + genre(i) { + let genres = [ 'Sci-Fi', 'Drama', 'Comedy' ]; + + return genres[i % genres.length]; + } + +}); +``` + +Here we've installed the [Faker.js](https://github.com/marak/Faker.js/) library to help us generate random dates. + +Now `server.createList('movie', 5)` gives us this data: + +```js +{ + movies: [ + { id: '1', title: 'Movie 1', releaseDate: '5/14/2018', genre: 'Sci-Fi' }, + { id: '2', title: 'Movie 2', releaseDate: '2/22/2019', genre: 'Drama' }, + { id: '3', title: 'Movie 3', releaseDate: '6/2/2018', genre: 'Comedy' }, + { id: '4', title: 'Movie 4', releaseDate: '7/29/2018', genre: 'Sci-Fi' }, + { id: '5', title: 'Movie 5', releaseDate: '6/30/2018', genre: 'Drama' }, + ] +} +``` + +As you can see, Factories let us rapidly generate different scenarios for our dynamic server data. + + +### Attribute overrides + +Factories are great for defining the "base case" of your models, but there's plenty of times where you'll want to override attributes from your factory with specific values. + +The last argument to `create` and `createList` accepts a POJO of attributes that will override anything from your factory. + +```js +// Using only the base factory +server.create('movie'); +// gives us this object: +{ id: '1', title: 'Movie 1', releaseDate: '01/01/2000' } + +// Passing in specific values to override certain attributes +server.create('movie', { title: 'Interstellar' }); +// gives us this object: +{ id: '2', title: 'Interstellar', releaseDate: '01/01/2000' } +``` + +Think of your factory attributes as a reasonable "base case" for your models, and then override them in development and testing scenarios as you have need for specific values. + + +### Dependent attributes + +Attributes can depend on other attributes via `this` from within a function. This can be useful for quickly generating things like usernames from names: + +```js +// mirage/factories/user.js +import { Factory } from 'ember-cli-mirage'; +import faker from 'faker'; + +export default Factory.extend({ + + name() { + return faker.name.findName(); + }, + + username() { + return this.name.replace(' ', '').toLowerCase(); + } + +}); +``` + +Calling `server.createList('user', 3)` with this factory would generate this data: + +```js +[ + { id: '1', name: 'Retha Donnelly', username: 'rethadonnelly' } + { id: '2', name: 'Crystal Schaefer', username: 'crystalschaefer' } + { id: '3', name: 'Jerome Schoen', username: 'jeromeschoen' } +] +``` + + +### Relationships + +In the same way that you use the ORM to create relational data, as this example from the _Creating and editing related data_ section of the {{docs-link 'ORM guide' 'docs.data-layer.orm'}} illustrates + +```js +let nolan = schema.people.create({ name: 'Christopher Nolan' }); + +schema.movies.create({ + director: nolan, + title: 'Interstellar', +}); +``` + +you can also create relational data with your factories: + +```js +let nolan = server.create('director', { name: 'Christopher Nolan' }); + +server.create('movie', { + director: nolan, + title: 'Interstellar' +}); +``` + +`nolan` is a model instance, which is why we can just pass it in as an attribute override when creating the Interstellar movie. + +This also works when using `createList`: + +```js +server.create('actor', { + movies: server.createList('movie', 3) +}); +``` + +In this way you use factories to help you quickly create graphs of relational data: + +```js +server.createList('user', 5).forEach(user => { + server.createList('post', 10, { user }).forEach(post => { + server.createList('comment', 5, { post }); + }); +}); +``` + +This code generates 5 users, each of which has 10 posts with each post having 5 comments. Assuming these relationships are defined in your models, all the foreign keys would be set correctly in Mirage's database. + + +### The afterCreate hook + +In many cases, setting up relationships manually (as shown in the previous section) is perfectly fine. However there are times where it makes more sense to have base case relationships set up for you automatically. + +Enter `afterCreate`. It's a hook that's called after a model has been created using the factory's base attributes. This hook lets you perform additional logic on your newly-created models before they're returned from `create` and `createList`. + +Let's see how it works. + +Say you have these two models in your app: + +```js +// mirage/models/user.js +export default Model.extend({ +}); + +// mirage/models/post.js +export default Model.extend({ + post: belongsTo() +}); +``` + +Let's further suppose that in your app, it is never valid to create a post without an associated user. + +You can use `afterCreate` to enforce this behavior: + +```js +// mirage/factories/post.js +export default Factory.extend({ + + afterCreate(post, server) { + post.update({ + user: server.create('user') + }); + } + +}); +``` + +The first argument to `afterCreate` is the object that was just created (in this case the `post`), and the second is a reference to the Mirage server instance, so that you can invoke other factories or inspect any other server state needed to customize your newly-created object. + +In this example we're immediately creating a user for this post. That way elsewhere in your app (say a test), you could just create a post + +```js +server.create('post'); +``` + +and you'd be working with a valid record, since that post would have an associated user. + +Now, there's one problem with the way we've implemented this so far. Our `afterCreate` hook updates the post's user _regardless if that post already had a user associated with it_. + +That means that this code + +```js +let tomster = server.create('user', 'Tomster'); +server.createList('post', 10, { user: tomster }); +``` + +would not work as we expect, since the attribute overrides while the object is being created, but the logic in `afterCreate` runs _after_ the post has been created. Thus, this post would be associated with the newly created post from the hook, rather than Tomster. + +To fix this, we can update our `afterCreate` hook to first check if the newly created post already has a user associated with it. Only if it doesn't will we create a new one and update the relationship. + +```js +// mirage/factories/post.js +export default Factory.extend({ + + afterCreate(post, server) { + if (!post.user) { + post.update({ + user: server.create('user') + }); + } + } + +}); +``` + +Now callers can pass in specific users + +```js +server.createList('post', 10, { user: tomster }); +``` + +or omit specifying a user if the details of that user aren't important + +```js +server.create('post'); +``` + +and in both cases they'll end up with a valid record. + +`afterCreate` can also be used to create `hasMany` associations, as well as apply any other relevant creation logic. + + +### Traits + +Traits are an important feature of factories that make it easy to group related attributes. Define them by importing `trait` and adding a new key to your factory. + +For example, here we define a trait named `published` on our post factory: + +```js +// mirage/factories/post.js +import { Factory, trait } from 'ember-cli-mirage'; + +export default Factory.extend({ + title: 'Lorem ipsum', + + published: trait({ + isPublished: true, + publishedAt: '2010-01-01 10:00:00' + }) +}); +``` + +You can pass anything into `trait` that you can into the base factory. + +We can use our new trait by passing in the name of the trait as a string argument to `create` or `createList`: + +```js +server.create('post', 'published'); +server.createList('post', 3, 'published'); +``` + +The created posts will have all the base attributes, as well as everything under the `published` trait. + +You can also compose multiple traits together: + +```js +// mirage/factories/post.js +import { Factory, trait } from 'ember-cli-mirage'; + +export default Factory.extend({ + title: 'Lorem ipsum', + + published: trait({ + isPublished: true, + publishedAt: '2010-01-01 10:00:00' + }), + + official: trait({ + isOfficial: true + }) +}); +``` + +We can pass our new traits into `create` or `createList` in any order: + +```js +let officialPost = server.create('post', 'official'); +let officialPublishedPost = server.create('post', 'official', 'published'); +``` + +If multiple traits set the same attribute, the last trait wins. + +As always, you can pass in an object of attribute overrides as the last argument: + +```js +server.create('post', 'published', { title: 'My first post' }); +``` + +When combined with the `afterCreate()` hook, traits simplify the process of setting up related object graphs. + +Here we define a `withComments` trait that creates 3 comments for a newly created post: + +``` js +// mirage/factories/user.js +import { Factory, trait } from 'ember-cli-mirage'; + +export default Factory.extend({ + name: 'Lorem ipsum', + + withComments: trait({ + afterCreate(post, server) { + server.createList('comment', 3, { post }); + } + }) +}); +``` + +We can use this trait to quickly make 10 posts with 3 comments each: + +```js +server.createList('post', 10, 'withComments'); +``` + +Combining traits with the `afterCreate` hook is one of the most powerful features of Mirage factories. Effective use of this technique will dramatically simplify the process of creating different graphs of relational data for your app. + + +### The association helper + +The `association()` helper provides some sugar for creating `belongsTo` relationships. + +As we saw earlier, given a `Post` that `belongsTo` a `User`, we were able to use the `afterCreate` hook to pre-wire that relationship: + +```js +// mirage/factories/post.js +import { Factory } from 'ember-cli-mirage'; + +export default Factory.extend({ + + afterCreate(post, server) { + if (!post.user) { + post.update({ + user: server('user') + }); + } + } + +}); +``` + +The `association()` helper effectively replaces this code: + +```js +// mirage/factories/post.js +import { Factory, association } from 'ember-cli-mirage'; + +export default Factory.extend({ + + user: association() + +}); +``` + +This should help reduce some of the boilerplate in your factory definitions. + +You can also use `association()` within traits + +```js +// mirage/factories/post.js +import { Factory, association, trait } from 'ember-cli-mirage'; + +export default Factory.extend({ + + withUser: trait({ + user: association() + }) + +}); +``` + +and it also accepts additional traits and overrides for the related model's factory: + +```js +// mirage/factories/post.js +import { Factory, association, trait } from 'ember-cli-mirage'; + +export default Factory.extend({ + + withUser: trait({ + user: association('admin', { role: 'editor' }) + }) + +}); +``` + +There is no equivalent helper for `hasMany` relationships, so you can continue to use the `afterCreate` hook to seed those relationships. + + +## Using factories + +### In development + +To use your factories to seed your development database, call `server.create` and `server.createList` in your `scenarios/default.js` file: + +```js +// mirage/scenarios/default.js +export default function(server) { + server.createList('movie', 10); +} +``` + +There's no explicit API for switching scenarios in development, but you can just use JavaScript modules to split things up. + +For example, you could create a new file for each scenario that contains some seeding logic + +```js +// mirage/scenarios/admin.js +export default function(server) { + server.create('user', { isAdmin: true }); +} +``` + +...export all scenarios as an object from an `index.js` file + +```js +// mirage/scenarios/index.js +import anonymous from './anonymous'; +import subscriber from './subscriber'; +import admin from './admin'; + +export default scenarios = { + anonymous, + subscriber, + admin +} +``` + +...and then import that object into `default.js`. + +Now you can quickly switch your development state by changing a single variable: + +```js +// mirage/scenarios/default.js +import scenarios from './index'; + +// Choose one +const state = + // 'anonymous' + // 'subscriber' + 'admin' +; +export default function(server) { + scenarios[state](server); +} +``` + +This can be handy while developing your app or sharing the different states of a new feature with your team. + + +### In testing + +When running your app in the `test` environment, your entire Mirage server is loaded, _except_ for your `scenarios/default.js` file. + +That means each test starts out with a clean database, giving you the opportunity to set up only the state needed for that test. It also keeps your development scenarios isolated from your tests, so that you don't inadvertently break your test suite while tweaking your development scenario. + +To seed Mirage's database within a test, use `this.server` to access the `create` and `createList` methods: + +```js +test('I can see the movies on the homepage', async function(assert) { + this.server.createList('movie', 5); + + await visit('/'); + + assert.dom('li.movie').exists({ length: 5 }); +}); +``` + +In this test, we start our Mirage server out with 5 movies. Then we boot up the Ember app and visit the `/` route, and finally assert that those movies show up in our UI. + +When we write another test, the database will start out empty so that none of Mirage's state leaks across tests. + +You can read more about testing with Mirage in the [Testing]() section of these guides. + + +## Factory best practices + +In general, it's best to define a model's base factory using only the attributes and relationships that comprise the minimal valid state for that model. You can then use `afterCreate` and traits to define other common states that contain valid, related changes on top of the base case. + +This advice goes a long way towards keeping your test suite maintainable. + +If you don't use traits and `afterCreate`, your tests will become bogged down in irrelevant details related to setting up the data needed for that test. + +```js +test('I can see the title of a post', async function(assert) { + let session = server.create('session'); + let user = server.create('user', { session }); + server.create('post', { + user, + title: 'My first post', + slug: 'my-first-post' + }); + + await visit('/post/my-first-post'); + + assert.dom('h1').hasText('My first post'); +}); +``` + +This test is only concerned with asserting the title of a post gets rendered to the screen, but it has lots of boilerplate code that's only there to get the post in a valid state. + +If we used `afterCreate` instead, the developer writing this test could simply create a post with a specified `title` and `slug`, since those are the only details relevant to the test: + +```js +test('I can see the title of a post', async function(assert) { + server.create('post', { + title: 'My first post', + slug: 'my-first-post' + }); + + await visit('/post/my-first-post'); + + assert.dom('h1').hasText('My first post'); +}); +``` + +`afterCreate` could take care of setting up the session and user in valid states, and associating the user with the post, so that the test can stay concise and focused on what it's actually testing. + +Effective use of traits and `afterCreate` keeps your test suite less brittle and more robust to changes in your data layer, since tests only declare the bare minimum setup logic needed to verify their assertions. + +--- + +Up next, we'll take a look at how to use Fixtures as an alternative way to seed your database. diff --git a/tests/dummy/app/pods/docs/data-layer/fixtures/template.md b/tests/dummy/app/pods/docs/data-layer/fixtures/template.md new file mode 100644 index 000000000..485021f71 --- /dev/null +++ b/tests/dummy/app/pods/docs/data-layer/fixtures/template.md @@ -0,0 +1,193 @@ +# Fixtures + +Mirage also lets you use flat fixture files to seed your database with data. + +In general, we recommend using factories for most situations, since they tend to keep your mock data more maintainable. But there are certainly times where fixture data makes sense. + +Fixtures are nothing more than a conventional file-based way to accomplish the following: + +```js +// mirage/scenarios/default.js +export default function(server) { + server.db.loadData({ + countries: [ + { id: 1, name: 'China' }, + { id: 2, name: 'India' }, + { id: 3, name: 'United States' } + ] + }); +} +``` + +Let's see how we can do the same thing using fixtures. + + +## Basic usage + +We'll start by generating a fixture file for our `Country` model: + +``` +ember g mirage-fixture countries +``` + +Fixture filenames should be the dasherized plural form of the model class. + +We can now add some data to our fixture file: + +```js +// mirage/fixtures/countries.js +export default [ + { id: 1, name: 'China', largestCity: 'Shanghai' }, + { id: 2, name: 'India', largestCity: 'Mumbai' }, + { id: 3, name: 'United States', largestCity: 'New York City' }, + { id: 4, name: 'Indonesia', largestCity: 'Jakarta' }, + { id: 5, name: 'Pakistan', largestCity: 'Karachi' }, + { id: 6, name: 'Brazil', largestCity: 'São Paulo' }, + { id: 7, name: 'Nigeria', largestCity: 'Lagos' }, + { id: 8, name: 'Bangladesh', largestCity: 'Dhaka' }, + { id: 9, name: 'Russia', largestCity: 'Moscow' }, + { id: 10, name: 'Mexico', largestCity: 'Mexico City' }, +]; +``` + +Because this data will be read directly into Mirage's database, we want to use camelCase for all multi-word attributes. (Mirage uses the camelCasing convention to avoid configuration for things like identifying foreign keys.) + +Don't worry if your production API format doesn't use camelCase. We'll be able to customize Mirage's API format in the Serializer layer. + +To load our new fixture file into the database during development, we can call `server.loadFixtures` in our `scenarios/default.js` file: + +```js +// mirage/scenarios/default.js +export default function(server) { + server.loadFixtures(); +} +``` + +If we have multiple fixtures defined, `server.loadFixtures()` will load every file. You can load files selectively by passing in an argument list of fixture names to `loadFixtures`: + +```js +// mirage/scenarios/default.js +export default function(server) { + server.loadFixtures('countries', 'cities'); // only load the countries and cities fixtures +} +``` + +Just like with factories, fixtures will be ignored during tests. If you want to load fixture data in a test, you can call `this.server.loadFixtures`: + +```js +test('I can see the countries', async function(assert) { + this.server.loadFixtures('countries'); + + await visit('/'); + + assert.dom('option.country').exists({ length: 100 }); +}); +``` + +## Relationships + +There's no special API for creating relationships using fixtures – you just need to understand how Mirage uses foreign keys to wire up relationships. + +Let's say we had these models: + +```js +// mirage/models/user.js +export default Model.extend({ +}); + +// mirage/models/post.js +export default Model.extend({ + author: belongsTo('user') +}); +``` + +Using the ORM we can create two related models: + +```js +let chris = schema.users.create({ name: 'Chris Garrett' }); + +schema.posts.create({ + author: chris, + title: 'Coming Soon in Ember Octane' +}); +``` + +If we take a look at Mirage's database after this, we'll see this data: + +```js +// server.db.dump() +{ + users: [ + { id: '1', name: 'Chris Garrett' } + ], + posts: [ + { id: '1', authorId: '1', title: 'Coming Soon in Ember Octane' } + ] +} +``` + +As you can see, Mirage added an `authorId` foreign key to the post. The convention for belongsTo foreign keys is + +```js +`${relationshipName}Id` +``` + +In this case, a post gets an `authorId`, even though that relationship points to a `User` model. The relationship name is always used rather than the model name, because models can have multiple relationships that point to the same type of model. + +Looking at the database dump above, if you wanted to recreate the same relationship graph using only fixture files, your files would look something like this: + +```js +// mirage/fixtures/users.js +export default [ + { id: '1', name: 'Chris Garrett' } +]; + +// mirage/fixtures/posts.js +export default [ + { id: '1', authorId: '1', title: 'Coming Soon in Ember Octane' } +]; +``` + +Once these fixtures are loaded into Mirage, all the ORM methods, Shorthands and Serializers would work as expected. + +If this happens to be a bi-directional relationship + +```diff + // mirage/models/user.js + export default Model.extend({ ++ posts: hasMany() + }); + + // mirage/models/post.js + export default Model.extend({ + author: belongsTo('user') + }); +``` + +then Mirage will add an array of foreign keys on the new hasMany association: + +```js +// mirage/fixtures/users.js +export default [ + { id: '1', postIds: [ '1' ], name: 'Chris Garrett' } +]; + +// mirage/fixtures/posts.js +export default [ + { id: '1', authorId: '1', title: 'Coming Soon in Ember Octane' } +]; +``` + +The convention for hasMany relationship foreign keys is + +```js +`${singularize(relationshipName)}Ids` +``` + +All associations have their own keys, because Mirage supports arbitrary one-way relationships. If two associations are inverses of each other, as in the above case, Mirage will keep the keys on each model in sync provided you use the ORM methods. + +As you can see, maintaining foreign keys and keeping them in sync across fixture files can get a little messy, which is why Mirage recommends using factories for most of your data creation. + +Still, fixtures can be quite useful in certain situations, so they're a good tool to have in your toolbox. + +--- diff --git a/tests/dummy/app/pods/docs/data-layer/orm/template.md b/tests/dummy/app/pods/docs/data-layer/orm/template.md new file mode 100644 index 000000000..b57560993 --- /dev/null +++ b/tests/dummy/app/pods/docs/data-layer/orm/template.md @@ -0,0 +1,403 @@ +# The ORM + +Mirage originally shipped with just a database as its data layer. While helpful, users still had to write a lot of code to reproduce their modern, complex backends. In particular, dealing with relationships was a big pain point. + +The solution was to add an Object Relational Mapper, or ORM, to Mirage. + +Let's see how an ORM allows Mirage to do more of the heavy lifting for you. + + +## Motivation + +Consider a database that looks like this: + +```js +db.dump(); + +// Result +{ + movies: [ + { id: '1', title: 'Interstellar' }, + { id: '2', title: 'Inception' }, + { id: '3', title: 'Dunkirk' } + ] +} +``` + +The first problem you'll encounter when writing a route handler is how to transform this raw data into the format your Ember app expects – that is, how to match the format of your production API. + +Let's say your backend uses [the JSON:API spec](https://jsonapi.org/). Your response to a GET request for `/api/movies/1` should look something like this: + +```js +// GET /api/movies/1 +{ + data: { + id: '1', + type: 'movies', + attributes: { + title: 'Interstellar' + } + } +} +``` + +Not a huge deal – we could just write this formatting logic directly in our route handler: + +```js +this.get('/movies/:id', (schema, request) => { + let movie = schema.db.movies.find(request.params.id); + + return { + data: { + id: movie.id, + type: 'movies', + attributes: { + title: movie.title + } + } + }; +}); +``` + +This works. But let's say our `Movie` model had a few more attributes: + +```js +{ + id: '1', + title: 'Interstellar', + releaseDate: 'October 26, 2014', + genre: 'Sci-Fi' +} +``` + +Now our route handler needs to be more clever, and make sure all properties other than `id` end up in the `attributes` hash: + +```js +this.get('/movies/:id', (schema, request) => { + let movie = schema.db.movies.find(request.params.id); + let movieJSON = { + data: { + id: movie.id, + type: 'movies', + attributes: { } + } + }; + Object.keys(movie) + .filter(key => key !=== 'id') + .forEach(key => { + movieJSON[key] = movie[key]; + }); + + return movieJSON; +}); +``` + +As you can see, things get complicated pretty fast. + +What if we add relationships to the mix? Let's say a `Movie` has a relationship to a `director`, and it stores that relationship using a `directorId` foreign key: + +```js +{ + id: '1', + title: 'Interstellar', + releaseDate: 'October 26, 2014', + genre: 'Sci-Fi', + directorId: '23' +} +``` + +The expected HTTP response for this model now looks like this + +```js +{ + data: { + id: '1', + type: 'movies', + attributes: { + title: 'Interstellar' + }, + relationships: { + directors: { + data: { type: 'people', id: '23' } + } + } + } +} +``` + +meaning our route handlers need to get even more complex. In particular, they need a robust way to differentiate between a model's attributes (like `title`) and its relationship keys (like `directorId`). + +These sorts of problems turn out to be common enough that we can solve them generally, provided Mirage is aware of your application's models and their relationships. + + +## Problems solved by the ORM + +When Mirage knows about your application's domain, it can shoulder the responsibility for the low-level bookkeeping work needed to properly implement your mock server. + +Let's take a look at some examples of how it does this. + + +### Separation of formatting logic + +To start, we can tell Mirage about our application's schema by defining Mirage models. These models get registered with the ORM and tell Mirage about the shape of your data. + +Let's define a `Movie` model. + +```js +// mirage/models/movie.js +import { Model } from 'ember-cli-mirage'; + +export default Model.extend({ +}); +``` + +Mirage models are _schemaless in attributes_, in that they don't require you to define plain attributes like `title` and `releaseDate`. So, the above model definition works regardless of what attributes your `Movie` model has. + +If you're using Ember Data, Mirage's ORM will automatically register your Ember Data models for you at run time, so you don't have to duplicate your domain information in two places. + +With the `Movie` model defined, we can update our route handler to use the ORM to respond with a Mirage model instance: + +```js +this.get('/movies/:id', (schema, request) => { + let id = request.params.id; + + return schema.movies.find(id); +}); +``` + +The `schema` argument is how you interact with the ORM. + +By returning an instance of a Mirage model from a route handler instead of a plain JavaScript object, we can now take advantage of Mirage's Serializer layer. Serializers work by turning Models and Collections into formatted JSON responses. + +Mirage ships with a JSONAPISerializer out of the box, so assuming it's defined as your Application serializer + +```js +// mirage/serializers/application.js +import { JSONAPISerializer } from 'ember-cli-mirage'; + +export default JSONAPISerializer.extend({ +}); +``` + +this route handler will now respond with the payload we expect: + +```js +{ + data: { + id: '1', + type: 'movies', + attributes: { + title: 'Interstellar', + releaseDate: 'October 26, 2014', + genre: 'Sci-Fi' + } + } +} +``` + +The ORM is already helping us keep our route handlers tidy by delegating the work of transforming our models into JSON to the Serializer layer. + +But it gets even more powerful when we add relationships to the mix. + + +### Fetching related data + +Let's say our `Movie` has a belongs-to relationship with a `director`: + +```js +// mirage/models/movie.js +import { Model, belongsTo } from 'ember-cli-mirage'; + +export default Model.extend({ + + director: belongsTo('person') + +}); +``` + +The `director` is an instance of a `Person` model: + +```js +// mirage/models/person.js +import { Model } from 'ember-cli-mirage'; + +export default Model.extend({ +}); +``` + +Again, if you're using Ember Data, both the models and relationships will be automatically generated for you. No need to create this file. + +Without changing anything about our route handler or serializer, we can now fetch a graph of data by using JSON:API includes. + +The following request + +``` +GET /api/movies/1?include=director +``` + +will now generate this response: + +```js +{ + data: { + id: '1', + type: 'movies', + attributes: { + title: 'Interstellar', + releaseDate: 'October 26, 2014', + genre: 'Sci-Fi' + }, + relationships: { + director: { + data: { type: 'people', id: '1' } + } + } + }, + included: [ + { + id: '1', + type: 'people', + attributes: { + name: 'Christopher Nolan' + } + } + ] +} +``` + +The JSONAPISerializer is able to inspect the ORM so that it can put all models, attributes and relationships in the right place. Our route handler doesn't need to change at all. + +In fact, the route handler we wrote is the same as the default behavior of the Shorthand, meaning we can just switch to using that: + +```diff +- this.get('/movies/:id', (schema, request) => { +- let id = request.params.id; + +- return schema.movies.find(id); +- }); ++ this.get('/movies/:id'); +``` + +This is another example of how the ORM helps various parts of Mirage, like Shorthands and Serializers, work together to simplify your server definition. + + +### Creating and editing related data + +The ORM also makes creating and editing related data easier than if you only worked with the raw database records. + +For instance, to create a `Movie` and `Person` with a relationship using only the database, you'd need to do something like this: + +```js +server.db.loadData({ + people: [ + { + id: '1', + name: 'Christopher Nolan' + } + ], + movies: [ + { + id: '1', + title: 'Interstellar', + releaseDate: 'October 26, 2014', + genre: 'Sci-Fi', + directorId: '1' + } + ] +}); +``` + +Note the `directorId` foreign key on the `Movies` record must match the `id` on the associated `People` record. + +Managing raw database data like this quickly gets unwieldy, especially as relationships change over time. + +Using the ORM via `server.schema`, we can create this graph without managing any IDs: + +```js +let nolan = schema.people.create({ name: 'Christopher Nolan' }); + +schema.movies.create({ + director: nolan, + title: 'Interstellar', + releaseDate: 'October 26, 2014', + genre: 'Sci-Fi' +}); +``` + +Passing in the model instance `nolan` as the `director` attribute when creating the movie is enough for all the keys to be properly set up. + +The ORM also keeps foreign keys in sync as relationships are edited. Given the database + +```js +{ + movies: [ + { + id: '1', + title: 'Star Wars: The Rise of Skywalker', + directorId: '2' + } + ], + people: [ + { + id: '2', + name: 'Rian Johnson' + }, + { + id: '3', + name: 'J.J. Abrams' + } + ] +} +``` + +we could update the movie's director like this: + +```js +let episode9 = schema.movies.findBy({ + title: 'Star Wars: The Rise of Skywalker' +}); + +episode9.update({ + director: schema.people.findBy({ name: 'J.J. Abrams' }); +}); +``` + +The new database would look like this: + +```js +{ + movies: [ + { + id: '1', + title: 'Star Wars: The Rise of Skywalker', + directorId: '3' + } + ], + people: [ + { + id: '2', + name: 'Rian Johnson' + }, + { + id: '3', + name: 'J.J. Abrams' + } + ] +} +``` + +Note how the `directorId` was changed in the database, even though we only ever worked with model instances. + +Importantly, this also holds true for more complex relationships, like one-to-many or many-to-many relationships that have an inverse. + +The ORM allows Mirage to abstract all this bookkeeping away from your code, and even gives Shorthands enough power to respect arbitrary updates to complex relationship graphs. + +--- + +These are some of the main problems addressed by Mirage's ORM. Generally, when Mirage knows about your application's models and their relationships, it can take on more of the responsibility of configuring your mock server. + +Be sure to check out the {{docs-link 'Schema' 'docs.api.item' 'modules/ember-cli-mirage/orm/schema~Schema'}}, {{docs-link 'Model' 'docs.api.item' 'modules/ember-cli-mirage/orm/model~Model'}} and {{docs-link 'Collection' 'docs.api.item' 'modules/ember-cli-mirage/orm/collection~Collection'}} API docs to learn about all the available ORM methods, as well as the {{docs-link 'Association' 'docs.api.item' 'modules/ember-cli-mirage/orm/associations/association~Association'}} docs to see what methods are added by belongsTo and hasMany relationships. + +We'll also cover Serializers in these guides, where you'll learn how to customize the serialized forms of your models and collections to match your production API. + +Next, let's take a look at Factories, which also leverage the ORM to make it easy to create the relational data needed to put your server in a variety of states. diff --git a/tests/dummy/app/pods/docs/data-layer/serializers/template.md b/tests/dummy/app/pods/docs/data-layer/serializers/template.md new file mode 100644 index 000000000..81e2354e8 --- /dev/null +++ b/tests/dummy/app/pods/docs/data-layer/serializers/template.md @@ -0,0 +1,255 @@ +# Serializers + +A serializer is an object responsible for transforming a Model or Collection that's returned from your route handlers + +```js +this.get('movies/:id', (schema, request) => { + return schema.movies.find(request.params.id); +}); +``` + +into a formatted JSON payload + +```js +// GET /movies/1 + +{ + data: { + id: '1', + type: 'movies';, + attributes: { + title: 'Interstellar' + } + } +} +``` + +suitable for consumption by your Ember app. + +Serializers are the last main part of Mirage's architecture that interacts with the Data Layer, because producing a well-formatted JSON response often involves traversing the relationship graph of your models. + +Let's see how they work. + + +## Choosing which serializer to use + +The first step in working with Mirage's serializers is to choose which included serializer to start with, which in turn depends on what JSON format your backend uses to serve data to your Ember app. + +The JSON payload above is an example of an API that follows [the JSON:API spec](https://jsonapi.org/). You'll see it used a lot in the Ember ecosystem, because it's the default API format expected by Ember Data. It also solves a lot of problems that exist in other formats that are less well-defined. + +If you are starting a new app, it's recommended that you choose a JSON:API implementation for your backend, as that format will give you the smoothest experience with the rest of the Ember ecosystem. However, plenty of Ember apps are built that don't use JSON:API. + +If your app does use JSON:API, Mirage ships with a `JSONAPISerializer` that will do the heavy lifting for you. + +Mirage also ships with two other named serializers, `ActiveModelSerializer` and `RestSerializer`, that match two other popular backend formats. + +If your backend uses a different format, you'll need to choose the closest one and customize it to match your production format. We'll talk about that later in this guide. + + +## Defining serializers + +Once you've selected the appropriate serializer, define your default application-wide serializer by exporting it from `/mirage/serializers/application.js`: + +```js +// mirage/serializers/application.js +import { JSONAPISerializer } from 'ember-cli-mirage'; + +export default JSONAPISerializer.extend({ +}); +``` + +This specifies the serializer to use for each Model and Collection in your system. + +If you need to customize a serializer for a particular model type, you can define model-specific serializers that take precedence over your application serializer. + +Let's use Mirage's generator to create a `Movie` serializer: + +``` +ember g mirage-serializer movie +``` + +This creates the file + +```js +import ApplicationSerializer from './application'; + +export default ApplicationSerializer.extend({ +}); +``` + +which follows the best practice of model-specific serializers extending from your Application serializer. + +You can now customize the behavior of how `Movie` models and collections are serialized into JSON. + + +## Customizing serializers + +When it comes to customizing your application's serializers, you'll mostly be tweaking Mirage's defaults. + +For example, if your Ember app expects attribute names to be PascalCase + +```js +// GET /movies/1 + +{ + Id: '1', + ReleaseDate: 'Interstellar' +} +``` + +you might override the Serializer's `keyForAttribute` method: + +```js +import { Serializer } from 'ember-cli-mirage'; +import { classify } from '@ember/string'; + +export default Serializer.extend({ + + keyForAttribute(attr) { + return classify(attr); + } + +}); +``` + +See the API docs for each serializer to learn more about all the customization hooks available. + + +## Relationships + +Relationships are another important aspect of Serializers, as backends have many different ways of dealing with relationships. + +For example, the `JSONAPISerializer` respects query param includes + +``` +GET /movies/1?include=cast-members +``` + +out of the box. But sometimes Ember apps expect a resource payload to have all their relationship IDs defined, regardless if the request used query param includes. + +There's an option on `JSONAPISerializer` that enables this: + +```js +import { JSONAPISerializer } from 'ember-cli-mirage'; + +export default JSONAPISerializer.extend({ + + alwaysIncludeLinkageData: true + +}); +``` + +Now, a GET request to `/movies/1` would respond with this payload: + +```js +{ + data: { + id: '1', + type: 'movies';, + attributes: { + title: 'Interstellar' + }, + relationships: { + 'cast-members': { + data: [ + { type: 'people', id: '1' }, + { type: 'people', id: '2' }, + { type: 'people', id: '3' }, + ] + } + } + } +} +``` + +The Ember app could now use these ids to subsequently fetch the related cast members. + +Other times, an Ember app expects to get a link to fetch related data. The `JSONAPISerializer` also has a hook for this: + +```js +// mirage/serializers/movie.js +import ApplicationSerializer from './application'; + +export default ApplicationSerializer.extend({ + + links(movie) { + return { + 'cast-members': { + related: `/api/movies/${movie.id}/cast-members` + } + }; + } + +}); +``` + +Now a GET request to `/movies/1` would respond with this payload: + +```js +{ + data: { + id: '1', + type: 'movies';, + attributes: { + title: 'Interstellar' + }, + relationships: { + 'cast-members': { + links: { + related: `/api/movies/1/cast-members` + } + } + } + } +} +``` + +The other serializers also have mechanisms controlling how related data can be loaded. Be sure to check out the API docs for all the details. + + +## Working with serialized JSON + +While most route handlers should return a Model or Collection instance, and leave the serialization logic up to the Serializer, sometimes it can be convenient to perform some final serialization logic directly in your route handler. + +You can use the `this.serialize` helper method to do this. + +```js +// mirage/config.js +this.get('/movies', (schema, request) => { + let movies = schema.movies.all(); + let json = this.serialize(movies); + + json.meta.size = movies.length; + + return json; +}); +``` + +The `serialize` helper will use the typical lookup logic to first check for a model-specific serializer, and then fall back to the default Application serializer. + +You can also use a specific serializer if you have a special case by passing in the name of the serialize as a second argument: + +```js +// mirage/config.js +this.get('/movies', (schema, request) => { + let movies = schema.movies.all(); + let json = this.serialize(movies, 'movie-with-relationship'); + + json.meta.size = movies.length; + + return json; +}); +``` + +This route handler would use the `mirage/serializers/movie-with-relationship.js` serializer to transform the collection of movies into a `json` payload, which is then modified and then finally returned from the route handler. + + +--- + +In general, you should not need to write much code dealing with Mirage serializers. Even if your backend doesn't adhere to one of the predefined formats, you should be able to use the provided hooks to implement an ApplicationSerializer that works for the majority of your models. + +The more conventional your backend API is, the less code you'll need to write – not only in Mirage, but also in other parts of your Ember application! + +Be sure to check out the {{docs-link 'Serializer' 'docs.api.item' 'modules/ember-cli-mirage/serializer~Serializer#keyForAttribute'}} and {{docs-link 'JSONAPISerializer' 'docs.api.item' 'modules/ember-cli-mirage/serializers/json-api-serializer~JSONAPISerializer'}} docs to learn about all the hooks available to customize your serializer layer. + +Now that we've covered the ins and outs of Mirage's data layer, we're ready to see how we can use Mirage to effectively test our Ember application. diff --git a/tests/dummy/app/pods/docs/examples/1-belongs-to/controller.js b/tests/dummy/app/pods/docs/examples/1-belongs-to/controller.js deleted file mode 100644 index 47f22b687..000000000 --- a/tests/dummy/app/pods/docs/examples/1-belongs-to/controller.js +++ /dev/null @@ -1,44 +0,0 @@ -import Controller from '@ember/controller'; -import Server from 'ember-cli-mirage/server'; -import { Model, belongsTo } from 'ember-cli-mirage'; -import { computed } from '@ember/object'; - -export default Controller.extend({ - - init() { - this._super(...arguments); - - let server = new Server({ - pretender: true, - models: { - // BEGIN-SNIPPET 1-belongs-to-schema - author: Model.extend(), - - book: Model.extend({ - author: belongsTo() - }) - // END-SNIPPET - } - }); - - // BEGIN-SNIPPET 1-belongs-to - let author = server.create('author', { - name: 'Neal Stephenson' - }); - - server.create('book', { - author, - title: 'Cryptonomicon' - }); - // END-SNIPPET - - this.set('server', server); - }, - - dbDump: computed('server', function() { - let json = this.get('server').db.dump(); - - return JSON.stringify(json, null, 2); - }) - -}); diff --git a/tests/dummy/app/pods/docs/examples/1-belongs-to/template.md b/tests/dummy/app/pods/docs/examples/1-belongs-to/template.md deleted file mode 100644 index 0e447cb80..000000000 --- a/tests/dummy/app/pods/docs/examples/1-belongs-to/template.md +++ /dev/null @@ -1,15 +0,0 @@ -# Belongs to (no inverse) - -## Schema - -{{docs-snippet name='1-belongs-to-schema'}} - -## Setup - -{{docs-snippet name='1-belongs-to'}} - -## Database - -
    -{{{dbDump}}}
    -
    diff --git a/tests/dummy/app/pods/docs/examples/2-has-many/controller.js b/tests/dummy/app/pods/docs/examples/2-has-many/controller.js deleted file mode 100644 index bd7207c7f..000000000 --- a/tests/dummy/app/pods/docs/examples/2-has-many/controller.js +++ /dev/null @@ -1,44 +0,0 @@ -import Controller from '@ember/controller'; -import Server from 'ember-cli-mirage/server'; -import { Model, hasMany } from 'ember-cli-mirage'; -import { computed } from '@ember/object'; - -export default Controller.extend({ - - init() { - this._super(...arguments); - - let server = new Server({ - pretender: true, - models: { - // BEGIN-SNIPPET 2-has-many-schema - author: Model.extend({ - books: hasMany() - }), - - book: Model.extend() - // END-SNIPPET - } - }); - - // BEGIN-SNIPPET 2-has-many - let book = server.create('book', { - title: 'Cryptonomicon' - }); - - server.create('author', { - name: 'Neal Stephenson', - books: [ book ] - }); - // END-SNIPPET - - this.set('server', server); - }, - - dbDump: computed('server', function() { - let json = this.get('server').db.dump(); - - return JSON.stringify(json, null, 2); - }) - -}); diff --git a/tests/dummy/app/pods/docs/examples/2-has-many/template.md b/tests/dummy/app/pods/docs/examples/2-has-many/template.md deleted file mode 100644 index 21eb1c65c..000000000 --- a/tests/dummy/app/pods/docs/examples/2-has-many/template.md +++ /dev/null @@ -1,15 +0,0 @@ -# Has many (no inverse) - -## Schema - -{{docs-snippet name='2-has-many-schema'}} - -## Setup - -{{docs-snippet name='2-has-many'}} - -## Database - -
    -{{{dbDump}}}
    -
    diff --git a/tests/dummy/app/pods/docs/examples/index/template.md b/tests/dummy/app/pods/docs/examples/index/template.md deleted file mode 100644 index 0065595c2..000000000 --- a/tests/dummy/app/pods/docs/examples/index/template.md +++ /dev/null @@ -1,5 +0,0 @@ -# Examples - -Here are some examples of different data scenarios you can set up using Mirage. - -If you are trying to set up a similar scenario in your own app, use `server.db.dump()` to inspect the database after you have created some data, and ensure the foreign keys match what is expected, using the examples as a reference. diff --git a/tests/dummy/app/pods/docs/getting-started/index/template.md b/tests/dummy/app/pods/docs/getting-started/index/template.md deleted file mode 100644 index 6b72cd11a..000000000 --- a/tests/dummy/app/pods/docs/getting-started/index/template.md +++ /dev/null @@ -1,20 +0,0 @@ -# Overview - -Nearly all Ember apps interact with an API. When you reach the point during development where you need to work with dynamic server data, you have a few options: - - 1. Proxy your app's HTTP requests to a local or hosted version of your actual backend, if it exists - 2. Use a library like [Pretender](https://github.com/trek/pretender) or [jQuery mockjax](https://github.com/jakerella/jquery-mockjax) to write a custom script that intercepts your requests in the client - 3. Use Ember CLI's HTTP mocks - -Option 1 can work if you already have the API, but often that isn't the case. And even if it is, development and testing often requires server state that differs from the live API. Option 2 is flexible, but requires you to start from scratch in each project, leaving it up to you to enforce conventions across your apps. Option 3 has a bit more structure, but requires a node server to be running, and doesn't allow you to use your fake server in a CI environment. - -Mirage was built to solve these problems. It's a fake server that runs in the client, and can be used in both development and testing. It brings along enough conventions to quickly get you up and running. - -Mirage borrows concepts from typical backend systems like - - - **routes** - - a **database** and **models**, for storing data and defining relationships - - **factories** and **fixtures**, for stubbing data - - **serializers**, for formatting responses - -Once you define your server, developing and testing your Ember app is a breeze. Read on to learn more! diff --git a/tests/dummy/app/pods/docs/getting-started/installation/template.md b/tests/dummy/app/pods/docs/getting-started/installation/template.md index 8c094f30b..25b713839 100644 --- a/tests/dummy/app/pods/docs/getting-started/installation/template.md +++ b/tests/dummy/app/pods/docs/getting-started/installation/template.md @@ -8,9 +8,9 @@ ember install ember-cli-mirage Ember should install the addon and add a `/mirage` directory to the root of your project. -Check out the [upgrade guide](../upgrading) if you're coming from Mirage 0.2.x. +Check out the {{docs-link 'upgrade guide' 'docs.getting-started.upgrade-guide'}} if you're coming from a previous version of Mirage. -**Note for Prettier users** +## Note for Prettier users There's an Ember CLI bug that exposes itself when using Prettier + Mirage. A longer-term fix is in the works, but for now, if you're using Prettier and install Mirage, you can either @@ -21,7 +21,7 @@ There's an Ember CLI bug that exposes itself when using Prettier + Mirage. A lon /mirage/mirage ``` -**Note for FastBoot users** +## Note for FastBoot users You might expect Mirage to serve network requests made by your FastBoot app, but because Mirage runs only in the browser, it currently disables itself if your app is being served by FastBoot. @@ -33,5 +33,3 @@ You can always bypass FastBoot page generation locally by running FASTBOOT_DISABLED=true ember serve ``` Mirage will then run in the browser as expected, and you can develop your client app as normal. - - diff --git a/tests/dummy/app/pods/docs/getting-started/overview/template.md b/tests/dummy/app/pods/docs/getting-started/overview/template.md new file mode 100644 index 000000000..e3d0608b5 --- /dev/null +++ b/tests/dummy/app/pods/docs/getting-started/overview/template.md @@ -0,0 +1,426 @@ +# Overview + +Mirage lets you simulate API responses by writing **route handlers**. + +The simplest example of a route handler is a function that returns an object: + +```js +// mirage/config.js +export default function() { + this.namespace = 'api'; + + this.get('/movies', () => { + return { + data: [ + { id: 1, type: 'movies', attributes: { name: 'Interstellar' } }, + { id: 2, type: 'movies', attributes: { name: 'Inception' } }, + { id: 3, type: 'movies', attributes: { name: 'Dunkirk' } }, + ] + }; + }); + +} +``` + +Now whenever your Ember app makes a GET request to `/api/movies`, Mirage will respond with this data. + +## Dynamic data + +This works, and is a common way to simulate HTTP responses - but hard-coded responses like this have a few problems: + + - *They're inflexible*. What if you want to change the data for this route in your tests? + - *They contain formatting logic*. Logic that's concerned with the shape of your JSON payload (e.g. the `data` and `attributes` keys) is now duplicated across all your route handlers. + - *They're too basic.* Inevitably, when your Mirage server needs to deal with more complex things like relationships, these simple ad hoc responses start to break down. + +Mirage provides a **data layer** that lets you write more powerful server implementations. Let's see how it works by replacing our basic stub data above. + +### Creating a model + +First, we'll need to tell Mirage that we have a dynamic `Movie` model. + +If you're using Ember Data and you already have a `Movie` model defined, you can skip this step! Mirage will automatically generate its models from your Ember Data definitions, so you won't have any files in the `mirage/models` directory. + +If you're not using Ember Data, you can use the `mirage-model` generator to create a model from the command line: + +```bash +$ ember g mirage-model movie +``` + +This generates the following file: + +```js +// mirage/models/movie.js +import { Model } from 'ember-cli-mirage'; + +export default Model.extend({ +}); +``` + +### Writing a dynamic route handler + +Models let our route handlers take advantage of Mirage's _in-memory database_. The database makes our route handlers dynamic, so we can change the data that's returned without having to rewrite the handler. + +Let's update our route handler to be dynamic: + +```js +this.get('/movies', (schema, request) => { + return schema.movies.all(); +}); +``` + +The `schema` argument lets us access our new `Movie` model. This route will now respond with all the authors in Mirage's database at the time of the request. We can therefore change the data this route responds with by only changing what records are in Mirage's database, instead of having to write a different version of the handler for each scenario we want to simulate. + + +### Seeding the database + +Right now, if we sent a request to our new handler above, the response would look something like this: + +```js +// GET /api/movies +data: [ +] +``` + +That's because Mirage's database is empty. + +To actually seed our database with fake data, we'll use *factories*. Factories are objects that make it easy to generate realistic-looking data for your Mirage server. Think of them as blueprints for your models. + +Let's create a factory for our author with + +```sh +$ ember g mirage-factory movie +``` + +We can then define some properties on our Factory. They can be simple types like Booleans, Strings or Numbers, or functions that return dynamic data: + +```js +// mirage/factories/movie.js +import { Factory } from 'ember-cli-mirage'; + +export default Factory.extend({ + + title(i) { + return `Movie ${i}`; // Movie 1, Movie 2, etc. + }, + + year() { + let min = 1950; + let max = 2019; + + return Math.floor(Math.random() * (max - min + 1)) + min; + }, + + rating: "PG-13" + +}); +``` + +This factory creates objects like + +```js +[ + { + title: 'Movie 1', + year: 1992, + rating: "PG-13" + }, + { + title: 'Movie 2', + year: 2008, + rating: "PG-13" + }, + // ... +] +``` + +and so on, which will automatically be inserted into the `movies` database table. The database will assign each record an `id`, and now we can interact with this data in our route handlers. + +To actually use our new factory definition, we can call the `server.create` and `server.createList` methods. + +To seed our development database, use the function in the `scenarios/default.js` file: + +```js +// mirage/scenarios/default.js +export default function(server) { + + server.createList('movie', 10); + +}; +``` + +Now when our Ember app makes a GET request to `/api/movies` using the route handler above, we'll see something that looks like this: + +```js +// GET /api/movies +data: [ + { + id: 1, + type: "movies", + attributes: { + title: "Movie 1", + year: 1992, + rating: "PG-13" + } + }, + { + id: 2, + type: "movies", + attributes: { + title: "Movie 2", + year: 2008, + rating: "PG-13" + } + }, + // ... +] +``` + +As we can see, this response is now influenced by the run-time state of our database. + +In acceptance tests, `scenarios/default.js` is ignored, and instead you can use `this.server` to setup your database in the state needed for the test: + +```js +// tests/acceptance/movies-test.js +import { setupApplicationTest } from 'ember-qunit'; +import { setupMirage } from 'ember-cli-mirage/test-support'; + +module('Acceptance | Homepage test', function(hooks) { + setupApplicationTest(hooks); + setupMirage(hooks); + + test("I can view the movies", async function(assert) { + this.server.createList("movie", 3); + + await visit("/home"); + + assert.dom("[data-test-id='movie-row']").exists({ count: 3 }); + }); +}); +``` + +You can also pass attribute overrides directly to `create` or `createList`: + +```js +test("I can view the movie title", async function(assert) { + let movie = this.server.create('movie', { title: "Interstellar" }); + + await visit(`/movies/${movie.id}`); + + assert.dom('h1').includesText("Interstellar"); +}); +``` + +You now have a simple way to set up your Mirage server's initial data, both during development and on a per-test basis. + +## Associations + +Dealing with associations is always tricky, and faking endpoints that deal with associations is no exception. Fortunately, Mirage ships with an ORM to help keep your route handlers clean. + +Let's say your movie has many cast-members. You can declare this relationship in your model: + +```js +// mirage/models/movie.js +import { Model, hasMany } from 'ember-cli-mirage'; + +export default Model.extend({ + castMembers: hasMany() +}); + +// mirage/models/cast-member.js +import { Model, belongsTo } from 'ember-cli-mirage'; + +export default Model.extend({ + movie: belongsTo() +}); +``` + +Now Mirage knows about the relationship between these two models, which can be useful when writing route handlers: + +```js +this.get('/movies/:id/cast-members', (schema, request) => { + let movie = schema.movies.find(request.params.id); + + return movie.castMembers; +}); +``` + +and when creating graphs of related data: + +```js +test("I can see a movie's cast members", async function(assert) { + server.create('movie', { + title: 'Interstellar', + castMembers: [ + server.create('cast-member', { name: 'Matthew McConaughey' }), + server.create('cast-member', { name: 'Anne Hathaway' }), + server.create('cast-member', { name: 'Jessica Chastain' }) + ] + }); + + await visit('/'); + + assert.dom('li.cast-member').exists({ count: 3 }); +}); +``` + +Mirage uses foreign keys to keep track of these related models for you, so you don't have to worry about any messy bookkeeping details while your Ember app reads and writes new relationships to Mirage's database. + + +## Serializers + +Mirage is designed for you to be able to completely replicate your production server. + +So far, we've seen that Mirage's default payloads are formatted using the [JSON:API](https://jsonapi.org) spec. This spec produces payloads that look like this: + +```js +// GET /movies/1 +{ + data: { + id: 1, + type: 'movies', + attributes: { + title: 'Interstellar' + } + } +} +``` + +New Ember apps using Ember Data work well with the JSON:API format, but of course, not every backend uses JSON:API. + +For example, your API responses might look more like this: + +```js +// GET /movies/1 +{ + movies: { + id: 1, + title: 'Interstellar' + } +} +``` + +This is why Mirage _serializers_ exist. Serializers let you customize the formatting logic of your responses, without having to change your route handlers, models, relationships, or any other part of your Mirage setup. + +Mirage ships with a few named serializers that match popular backend formats. You can also extend from the base class and use formatting hooks to match your own backend: + +```js +// mirage/serializers/application.js +import { Serializer } from 'ember-cli-mirage'; + +export default Serializer.extend({ + keyForAttribute(attr) { + return dasherize(attr); + }, + + keyForRelationship(attr) { + return dasherize(attr); + } +}); +``` + +Mirage's serializer layer is also aware of your relationships, which helps when faking endpoints that sideload or embed related data: + +```js +// mirage/serializers/movie.js +import { Serializer } from 'ember-cli-mirage'; + +export default Serializer.extend({ + include: [ 'crewMembers' ] +}); + +// mirage/config.js +export default function() { + this.get('/movies/:id', (schema, request) => { + return schema.movies.find(request.params.id); + }); +} +``` + +With the above config, a GET to `/movies/1` would return automatically include related crew members: + +```js +{ + movie: { + id: 1, + title: 'Interstellar' + }, + 'crew-members': [ + { + id: 1, + 'movie-id': 1, + name: 'Matthew McConaughey' + }, + { + id: 1, + 'movie-id': 1, + name: 'Anne Hathaway' + }, + ... + ] +} +``` + +Mirage ships with two named serializers, JSONAPISerializer and ActiveModelSerializer, to save you the trouble of writing this custom code yourself. See the [serializer guide](../api/modules/ember-cli-mirage/serializer~Serializer) to learn more. + +## Shorthands + +Mirage has *shorthands* to reduce the code needed for conventional API routes. For example, the route handler + +```js +this.get('/authors', (schema, request) => { + return schema.authors.all(); +}); +``` + +can be written as + +```js +this.get('/authors'); +``` + +There are also shorthands for `post`, `patch` (or `put`), and `del` methods. Here's a full set of resourceful routes for an `author` resource: + +```js +this.get('/authors'); +this.get('/authors/:id'); +this.post('/authors'); +this.patch('/authors/:id'); +this.del('/authors/:id'); +``` + +Shorthands make writing your server definition concise, so use them whenever possible. When mocking a new route, you should always start with a Shorthand, and then drop down to a function route handler when you need more control. + + +## Passthrough + +Mirage is a great tool to use even if you're working on an existing app, or if you don't want to fake your entire API. By default, Mirage throws an error if your Ember app makes a request that doesn't have a corresponding route handler defined. To avoid this, tell Mirage to let unhandled requests pass through: + +```js +// mirage/config.js +this.passthrough(); +``` + +Now you can develop as you normally would, for example against an existing API. + +When it comes time to build a new feature, you don't have to wait for the API to be updated. Just define the new route that you need + +```js +// mirage/config.js +this.get('/comments'); + +this.passthrough(); +``` + +and you can fully develop and test the feature. In this way you can build up your fake server piece by piece - adding some solid acceptance tests along the way. + +--- + +That should be enough to get you started! + +The rest of the docs are organized by Mirage's higher-level concepts: + + - **Route handlers** contain the logic around what run-time data Mirage uses to respond to requests. + + - The **Data layer** is how Mirage stores and tracks changes to your data over time. + +Keep reading to learn more! diff --git a/tests/dummy/app/pods/docs/getting-started/quickstart/template.md b/tests/dummy/app/pods/docs/getting-started/quickstart/template.md deleted file mode 100644 index 80936c064..000000000 --- a/tests/dummy/app/pods/docs/getting-started/quickstart/template.md +++ /dev/null @@ -1,302 +0,0 @@ -# Quickstart - -Mirage is all about simulating your API server. You define *route handlers* to respond to your Ember app's AJAX requests. - -Here's a simple example of a handler: - -```js -// mirage/config.js -export default function() { - this.namespace = 'api'; - - this.get('/authors', () => { - return { - authors: [ - {id: 1, name: 'Zelda'}, - {id: 2, name: 'Link'}, - {id: 3, name: 'Epona'}, - ] - }; - }); - -} -``` - -Now whenever your Ember app makes a GET request to `/api/authors`, Mirage will respond with this data. - -## Dynamic data - -This works, and is a common way to simulate HTTP responses - but hard-coded responses like this have a few problems: - - - *They're inflexible*. What if you want to change this route's response data in your tests? - - *They contain formatting logic*. Logic that formats the shape of your JSON payload (e.g., including the root `authors` key) is now duplicated across all your route handlers. - - *They're too basic.* Inevitably, when your fake server needs to deal with more complex things like relationships, these simple ad hoc responses start to break down. - -Mirage provides primitives that let you write a more flexible server implementation. Let's see how they work by replacing our basic stub data above. - -First, create an `author` model by running the following in your terminal: - -```bash -$ ember g mirage-model author -``` - -This generates the following file: - -```js -// mirage/models/author.js -import { Model } from 'ember-cli-mirage'; - -export default Model.extend({ -}); -``` - -The model will create an `authors` table in Mirage's *in-memory database*. The database makes our route handlers dynamic—we can change the returned data without rewriting the handler. In this way, we can share the same route definitions in both development and testing, while still having control over their response data. - -Let's update our route handler to be dynamic: - -```js -// mirage/config.js -this.namespace = 'api'; - -this.get('/authors', (schema, request) => { - return schema.authors.all(); -}); -``` - -Now this route will respond with all the authors in Mirage's database at the time of the request. If we want to change the data this route responds with, we simply need to change the data in the database. - -## Creating data - - - -To actually seed our database with fake data, we'll use *factories*. Factories are objects that dynamically generate data - think of them as blueprints for your models. - -Let's create a factory for our author with - -```sh -$ ember g mirage-factory author -``` - -We can then define some properties on our Factory. They can be simple types like Booleans, Strings or Numbers, or functions that return dynamic data: - -```js -// mirage/factories/author.js -import { Factory } from 'ember-cli-mirage'; - -export default Factory.extend({ - - name(i) { - return `Person ${i}`; - }, - - age: 28, - - admin() { - return Math.random() > 0.5; - } - -}); -``` - -This factory creates objects like - -```javascript -[{ - name: 'Person 1', - age: 28, - admin: false -}, -{ - name: 'Person 2', - age: 28, - admin: true -}] -``` - -and so on, which will automatically be inserted into the `authors` database table. The database will assign each record an `id`, and now we can interact with this data in our route handlers. - -To use our new factory, we can call the `server.create` and `server.createList` methods in development: - -```js -// mirage/scenarios/default.js -export default function(server) { - - server.createList('author', 10); - -}; -``` - -and in acceptance tests: - -```js -// tests/acceptance/authors-test.js -test("I can view the authors", function() { - let authors = server.createList('author', 3); - - visit('/authors'); - - andThen(() => { - equal(find('li').length, 3); - equal(find('li:first').text(), authors[0].name); - }); -}); -``` - -You now have a simple way to set up your fake server's initial data, both during development and on a per-test basis. - -## Associations and serializers - -Dealing with associations is always tricky, and faking endpoints that deal with associations is no exception. Fortunately, Mirage ships with an ORM to help keep your routes clean. - -Let's say your author has many blog-posts. You can declare this relationship in your model: - -```js -// mirage/models/author.js -import { Model, hasMany } from 'ember-cli-mirage'; - -export default Model.extend({ - blogPosts: hasMany() -}); - -// mirage/models/blog-post.js -import { Model, belongsTo } from 'ember-cli-mirage'; - -export default Model.extend({ - author: belongsTo() -}); -``` - -Now Mirage knows about the relationship between these two models, which can be useful when writing route handlers: - -```js -this.get('/authors/:id/blog-posts', (schema, request) => { - let author = schema.authors.find(request.params.id); - - return author.blogPosts; -}); -``` - -and when creating graphs of related data: - -```js -test('I can see the posts on the homepage', function(assert) { - let author = server.create('author'); - server.createList('post', 10, { author }); - - visit('/'); - - andThen(() => { - assert.expect(find('li').length, 10); - }); -}); -``` - -Mirage's serializer layer is also aware of your relationships, which helps when faking endpoints that sideload or embed related data. Models and Collections that are returned from a route handler pass through the serializer layer, where you can customize which attributes and associations to include, as well as override other formatting options: - -```js -// mirage/serializers/application.js -import { Serializer } from 'ember-cli-mirage'; - -export default Serializer.extend({ - keyForAttribute(attr) { - return dasherize(attr); - }, - - keyForRelationship(attr) { - return dasherize(attr); - }, -}); - -// mirage/serializers/author.js -import { Serializer } from 'ember-cli-mirage'; - -export default Serializer.extend({ - include: ['blogPosts'] -}); - -// mirage/config.js -export default function() { - this.get('/authors/:id', (schema, request) => { - return schema.authors.find(request.params.id); - }); -} -``` - -With the above config, a GET to `/authors/1` would return something like - -``` -/* -{ - author: { - id: 1, - 'first-name': 'Zelda' - }, - 'blog-posts': [ - {id: 1, 'author-id': 1, title: 'Lorem ipsum'}, - ... - ] -} -*/ -``` - -Mirage ships with two named serializers, JSONAPISerializer and ActiveModelSerializer, to save you the trouble of writing this custom code yourself. See the [serializer guide](./api/modules/ember-cli-mirage/serializer~Serializer) to learn more. - -## Shorthands - - - -Mirage has *shorthands* to reduce the code needed for conventional API routes. For example, the route handler - -```js -this.get('/authors', (schema, request) => { - return schema.authors.all(); -}); -``` - -can be written as - -```js -this.get('/authors'); -``` - -There are also shorthands for `put` (or `patch`), `post` and `del` methods. Here's a full set of resourceful routes for an `author` resource: - -```js -this.get('/authors'); -this.get('/authors/:id'); -this.post('/authors'); -this.put('/authors/:id'); // or this.patch -this.del('/authors/:id'); -``` - -Shorthands make writing your server definition concise, so you should use them whenever possible. You can always fall back to a custom function when you need more control. - -## Passthrough - -Mirage is a great tool to use even if you're working on an existing app, or if you don't want to fake your entire API. By default, Mirage throws an error if your Ember app makes a request that doesn't have a corresponding route handler defined. To avoid this, tell Mirage to let unhandled requests pass through: - -```js -// mirage/config.js -this.passthrough(); -``` - -Now you can develop as you normally would, for example against an existing API. - -When it comes time to build a new feature, you don't have to wait for the API to be updated. Just define the new route that you need - -```js -// mirage/config.js -this.get('/comments'); - -this.passthrough(); -``` - -and you can fully develop and test the feature. In this way you can build up your fake server piece by piece - adding some solid acceptance tests along the way. - ---- - -That should be enough to get you started! Keep reading to learn more. diff --git a/tests/dummy/app/pods/docs/getting-started/upgrading/template.md b/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md similarity index 98% rename from tests/dummy/app/pods/docs/getting-started/upgrading/template.md rename to tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md index 39621726a..35d92c503 100644 --- a/tests/dummy/app/pods/docs/getting-started/upgrading/template.md +++ b/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md @@ -1,15 +1,18 @@ -# Upgrading +# Upgrade guide -## Updating your version of Mirage - -To install a new version of Mirage, run +If you're upgrading from an existing version of Mirage, you can run the following: ```sh +# Using npm +npm install -D ember-cli-mirage@X.X.X + +# Using yarn yarn install -D ember-cli-mirage@X.X.X ``` -## Changelog + +## Full Changelog You can view all of Mirage's release notes on [our Releases page](https://github.com/samselikoff/ember-cli-mirage/releases). diff --git a/tests/dummy/app/pods/docs/getting-started/what-is-mirage/template.md b/tests/dummy/app/pods/docs/getting-started/what-is-mirage/template.md new file mode 100644 index 000000000..55962b2e2 --- /dev/null +++ b/tests/dummy/app/pods/docs/getting-started/what-is-mirage/template.md @@ -0,0 +1,38 @@ +# What is Mirage? + +Mirage is a JavaScript library that lets frontend developers mock out backend APIs. + +Unlike other mocking libraries, Mirage makes it easy to reproduce dynamic scenarios that are typically only possible when using a true production server. + +Equipped with a Mirage server, a frontend developer can build, test, and even share a complete working Ember application without having to use or configure any backend services. + +## Why? + +Mirage was originally built to bring conventions to some home-grown HTTP mocking code that was getting unwieldy. It ended up proving most useful when it enabled frontend developers to work on their apps without having to rely on any local or staging backend services as part of their normal development workflow. + +Since then, Mirage has focused on making it as easy as possible for Ember developers to maintain a mock server alongside their codebase. + +## How it works + +Mirage runs in the browser. It uses [Pretender.js](https://github.com/pretenderjs/pretender) to intercept and respond to any network requests your Ember app makes, letting you build your app as if it were talking to a real server. + +In this way, you can develop and test your app against various server states without having to modify any application code. + +In addition to intercepting HTTP requests, Mirage provides a mock database and helper functions that make it easy to simulate dynamic backend services. + +Mirage borrows concepts from server-side frameworks like + + - **routes** to handle HTTP requests + - a **database** and **models** for storing data and defining relationships + - **factories** and **fixtures** for stubbing data, and + - **serializers** for formatting HTTP responses + +to make it easy to simulate production server behavior. + +## Alternatives + +These other libraries solve similar problems to Mirage and might be a better fit for your needs: + +- [Polly.js](https://netflix.github.io/pollyjs/#/), a library for recording and replaying HTTP interactions +- [Pretender.js](https://github.com/pretenderjs/pretender), the low-level HTTP interceptor powering Mirage +- [Ember Data Factory Guy](https://github.com/danielspaniel/ember-data-factory-guy), factories for Ember apps powered by Ember Data diff --git a/tests/dummy/app/pods/docs/index/route.js b/tests/dummy/app/pods/docs/index/route.js new file mode 100644 index 000000000..462e9fd12 --- /dev/null +++ b/tests/dummy/app/pods/docs/index/route.js @@ -0,0 +1,9 @@ +import Route from '@ember/routing/route'; + +export default Route.extend({ + + beforeModel() { + this.transitionTo('docs.getting-started.what-is-mirage'); + } + +}); diff --git a/tests/dummy/app/pods/docs/route-handlers/functions/template.md b/tests/dummy/app/pods/docs/route-handlers/functions/template.md new file mode 100644 index 000000000..2ceba654a --- /dev/null +++ b/tests/dummy/app/pods/docs/route-handlers/functions/template.md @@ -0,0 +1,277 @@ +# Functions + +Function handlers are the most flexible way to write route handlers in Mirage. + +To define new function handlers, use the `get`, `post`, `patch` (or `put`) and `del` methods. Here's an example: + +```js +// mirage/config.js +this.get('/movies', () => { + return [ 'Interstellar', 'Inception', 'Dunkirk' ]; +}); +``` + +Now when your Ember app makes a GET request to `/movies`, it will receive this data. + +Each verb method has the same signature. The first argument is the path (URL) and the second is the actual function handler that returns the response. + +```js +this.get('/movies', () => { ... }); +this.post('/movies', () => { ... }); +this.patch('/movies/:id', () => { ... }); +this.del('/movies/:id', () => { ... }); +``` + + +## Timing + +The last argument to a route handler is an options object you can use to adjust the timing. Use this to delay the response of a particular route and see how your Ember app behaves when communicating with a slow network. + +```js +// mirage/config.js +this.get('/movies', () => { + return [ 'Interstellar', 'Inception', 'Dunkirk' ]; +}, { timing: 4000 }); +``` + +The default delay is 50ms during development, and 0 during testing (so your tests run fast). + +You can also set a global timing parameter for all routes. Individual timing parameters override the global setting. + +```js +// mirage/config.js +export default function() { + this.namespace = 'api'; + this.timing = 2000; + + this.get('/movies', () => { + return [ 'Interstellar', 'Inception', 'Dunkirk' ]; + }); + + this.get('/complex-query', () => { + return [1, 2, 3, 4, 5]; + }, { timing: 3000 }); +} +``` + +If you want to add delays to a test, you can override the timing for individual tests by putting the timing parameter in your test + +```js +test('this route works with a delay', function() { + server.timing = 10000; + + // ... +}); +``` + +Because the server is reset after each test, this option won't leak into the rest of your suite. + + +## Accessing the data layer + +Route handlers receive `schema` as their first parameter, which lets them access Mirage's data layer: + +```js +this.get('/movies', (schema) => { + return schema.movies.all(); +}); +``` + +Most of your route handlers will interact with the data layer in some way. + +The second parameter is the `request` object, which contains information about the request your Ember app made. For example, you can access dynamic URL segments from it: + +```js +this.get('/movies/:id', (schema, request) => { + let id = request.params.id; + + return schema.movies.find(id); +}); +``` + +You can also access the request body, for example to handle a POST or PATCH request that contains data sent over by the Ember app: + +```js +this.post('/movies', (schema, request) => { + let title = JSON.parse(request.requestBody).title; + + return schema.movies.create({ title }); +}); +``` + +The `normalizedRequestAttrs` helper (documented below) provides some sugar for working with the request data. + + +## Dynamic paths and query params + +The request object that's injected into your route handlers contains any dynamic route segments and query params. + +To define a route that has a dynamic segment, use colon syntax (`:segment`) in your path. The dynamic piece will be available via `request.params.[segment]`: + +```js +this.get('/authors/:id', (schema, request) => { + let id = request.params.id; + + return schema.authors.find(id); +}) +``` + +Query params from the request can also be accessed via `request.queryParams.[param]`. + + +## Helpers + +There are several helpers available when writing function route handlers. + +### serialize + +This helper returns the JSON for the given Model or Collection after passing it through the Serializer layer. It's useful if you want to do some final munging on the serialized JSON before returning it. + +```js +this.get('/movies', (schema) => { + let movies = schema.movies.all(); + let json = this.serialize(movies); + + json.meta = { page: 1 }; + + return json; +}); +``` + +By default this method uses the named serializer for the given Model or Collection. You can pass in a specific serializer name as the second argument: + +```js +this.get('/movies', (schema) => { + let movies = schema.movies.all(); + let json = this.serialize(movies, 'sparse-movie'); + + json.meta = { page: 1 }; + + return json; +}); +``` + +### normalizedRequestAttrs + +This helper returns the body of a request in a normalized form, suitable for working with and creating records. + +For example, if your Ember app makes a POST request with this data + +```js +// POST /users + +{ + data: { + type: 'users', + attributes: { + 'first-name': 'Conan', + 'middle-name': 'the', + 'last-name': 'Barbarian' + }, + relationships: { + team: { + data: { + type: 'teams', + id: 1 + } + } + } + } +} +``` + +then `normalizedRequestAttrs()` could be used like this + +```js +this.post('/users', function(schema, request) { + let attrs = this.normalizedRequestAttrs(); + /* + attrs = { + firstName: 'Conan', + middleName: 'the', + lastName: 'Barbarian', + teamId: '1' + } + */ + return schema.users.create(attrs); +}); +``` + +Note that attribute keys were camelCased, and the `team` foreign key was extracted. This is because a `user` owns the `team` foreign key; if another relationship were included in the request but the `user` did not own its foreign key, it would not have been extracted. + +This helper method leverages your serializer's `normalize` method. In the example above, it's assumed that the app was using the `JSONAPISerializer`, which comes with the `#normalize` method already written. If you're not using one of the bundled serializers, you'll need to implement `#normalize` and have it return a JSON:API document to take advantage of this method. + +Additionally, you'll need to use a full `function` here, as opposed to an ES6 arrow function (e.g `() => { ... }`). This is because `normalizedRequestAttrs` requires the `this` context from the function handler, and an arrow function would bind this from the outer scope. + +`normalizedRequestAttrs()` relies on a `modelName` to work and attempts to automatically detect it based on the URL of the request. If you use conventional URLs – for example, PATCH /users/1 – the helper should work. If you are using something custom – for example, PATCH /users/edit/1 – you’ll need to provide the `modelName` to the helper as the first argument: + +```js +this.patch('/users/edit/:id', function(schema, request) { + let attrs = this.normalizedRequestAttrs('user'); + // ... +}); +``` + + +## Status codes and headers + +By default, Mirage sets the HTTP status code of a response based on the verb being used for the route: + + - GET is 200 + - PATCH/PUT is 204 + - POST is 201 + - DEL is 204 + +PATCH/PUT and POST change to 200 if there is a response body. + +Additionally, a header for `Content-Type` is set to `application/json`. + +You can customize both the response code and headers by returning an instance of the `Response` class in your route handler: + +```js +// mirage/config.js +import { Response } from 'ember-cli-mirage'; + +export default function() { + this.post('/authors', function(schema, request) { + let attrs = JSON.parse(request.requestBody).author; + + if (attrs.name) { + return schema.authors.create(attrs); + } else { + return new Response(400, { some: 'header' }, { errors: ['name cannot be blank'] }); + } + }); +} +``` + + +## External origins + +You can use Mirage to simulate other-origin requests. By default, a route like + +```js +this.get('/contacts', ...) +``` + +will hit the same origin that's serving your Ember app. To handle a different origin, use a fully qualified domain name: + +```js +this.get('http://api.twitter.com/v1', ...) +``` + +If your entire Ember app uses an external (other-origin) API, you can globally configure the domain via `urlPrefix`: + +```js +// mirage/config.js +this.urlPrefix = 'https://my.api.com'; + +// This route will handle requests to https://my.api.com/contacts +this.get('/contacts', ...) +``` + +--- + +That's it on writing low-level function route handlers! + +Function route handlers are flexible, but also cumbersome to write out for every endpoint. If you're working with an API that's conventional enough, hopefully you'll be writing fewer function route handlers and more Shorthands, which we'll discuss in the next section. diff --git a/tests/dummy/app/pods/docs/route-handlers/shorthands/template.md b/tests/dummy/app/pods/docs/route-handlers/shorthands/template.md new file mode 100644 index 000000000..80c4223cd --- /dev/null +++ b/tests/dummy/app/pods/docs/route-handlers/shorthands/template.md @@ -0,0 +1,239 @@ +# Shorthands + +APIs have become more standardized, so Mirage has the concept of *Shorthands* to deal with common scenarios. Shorthands can replace many of your custom route handlers, dramatically simplifying your server definition. + +For example, this function route handler + +```js +this.get('/movies', (schema, request) => { + return schema.movies.all(); +}); +``` + +is pretty standard: it responds to a URL path with a collection of the same name. + +The Shorthand form of this is + +```js +this.get('/movies'); +``` + +This is a complete route handler. It infers the model name from the last part of the URL, and returns the corresponding collection. + +Returning a single movie by ID is just as easy: + +```js +this.get('/movies/:id'); +``` + +There are also Shorthands for creating and editing data. For example, this function route handler creates a new movie: + +```js +this.post('/movies', (schema, request) => { + let attrs = JSON.parse(request.requestBody).movie; + + return schema.movies.create(attrs); +}); +``` + +It's also pretty standard: it creates a new model using the attributes from the request payload. The equivalent Shorthand is + +```js +this.post('/movies'); +``` + +See the full list of available Shorthands below. Shorthands use default status codes based on the HTTP verb: + + - GET, PATCH/PUT and DEL are 200 + - POST is 201 + +## GET Shorthands + +Fetching a collection: + +```js +// Shorthand +this.get('/contacts'); // finds type by singularizing url +this.get('/contacts', 'users'); // optionally specify the collection as second param + +// equivalent +this.get('/contacts', (schema) => { + return schema.contacts.all(); // users in the second case +}); +``` + +Fetching a model: + +```js +// Shorthand +this.get('/contacts/:id'); // finds type by singularizing url +this.get('/contacts/:id', 'user'); // optionally specify the type as second param + +// equivalent +this.get('/contacts/:id', (schema, request) => { + let id = request.params.id; + + return schema.contacts.find(id); // users in the second case +}); +``` + +Fetching multiple models by ID (for example, `GET /contacts?ids=1,3`): + +```js +// Shorthand +this.get('/contacts', { coalesce: true }); +this.get('/contacts', 'users', { coalesce: true }); + +// equivalent +this.get('/contacts', ({ contacts }, request) => { + let ids = request.queryParams.ids; + + return contacts.find(ids); // users in the second case +}); +``` + + +## POST Shorthands + +Creating a resource: + +```js +// Shorthand +this.post('/contacts'); // finds type by singularizing url +this.post('/contacts', 'user'); // optionally specify the type as second param + +// equivalent +this.post('/contacts', function(schema, request) { + let attrs = this.normalizedRequestAttrs(); + + return schema.contacts.create(attrs); +}); +``` + +For this POST shorthand to work, Mirage needs to know the format of the JSON payload your Ember app sends along with the request, so that it can insert the appropriate data into the database. See [the note on normalize](../serializers/#normalizejson) in the Serializer docs for more information. + +## PATCH/PUT Shorthands + +Updating a resource: + +```js +// Shorthand (these also work with this.put) +this.patch('/contacts/:id'); // finds type by singularizing url +this.patch('/contacts/:id', 'user'); // optionally specify the type as second param + +// equivalent +this.patch('/contacts/:id', function(schema, request) { + let id = request.params.id; + let attrs = this.normalizedRequestAttrs(); + + return schema.contacts.find(id).update(attrs); +}); +``` + +For this PATCH shorthand to work, Mirage needs to know the format of the JSON payload your Ember app sends along with the request, so that it can insert the appropriate data into the database. See the note on normalize in the Serializer docs for more information. + +## DELETE Shorthands + +Destroying a resource: + +```js +// Shorthand +this.del('/contacts/:id'); // finds type by singularizing url +this.del('/contacts/:id', 'user'); // optionally specify the type as second param + +// equivalent +this.del('/contacts/:id', (schema, request) => { + let id = request.params.id; + + schema.contacts.find(id).destroy(); +}); +``` + +Destroying a resource and related models: + +```js +// Shorthand +this.del('/contacts/:id', ['contact', 'addresses']); + +// equivalent +this.del('/contacts/:id', ({ contacts }, request) => { + let id = request.params.id; + let contact = contacts.find(id); + + contact.addresses.destroy(); + contact.destroy(); +}); +``` + +To use this Shorthand, you must have the appropriate `hasMany`/`belongsTo` relationships defined in your data layer. + + +## Resource helper + +The _resource_ helper lets you define multiple Shorthands for a given resource: + +```js +// Resource helper usage +this.resource('contacts'); + +// Shorthands defined +this.get('/contacts'); +this.get('/contacts/:id'); +this.post('/contacts'); +this.patch('/contacts/:id'); // and this.put('/contacts/:id') +this.del('/contacts/:id'); +``` + +You can also whitelist which Shorthands will be defined using the _only_ option: + +```js +this.resource('contacts', { only: [ 'index', 'show' ] }); + +// Shorthands defined +this.get('/contacts'); +this.get('/contacts/:id'); +``` + +or which route handlers shouldn't be defined using _except_ option: + +```js +this.resource('contacts', { except: [ 'update' ] }); + +// Shorthands defined +this.get('/contacts'); +this.get('/contacts/:id'); +this.post('/contacts'); +this.del('/contacts/:id'); +``` + +If your route path and collection names do not match, you can define a relative or absolute path using the _path_ option: + +```js +this.resource('blog-posts', { path: '/posts' }); + +// Shorthands defined +this.get('/posts', 'blog-posts'); +this.get('/posts/:id', 'blog-posts'); +this.post('/posts', 'blog-posts'); +this.put('/posts/:id', 'blog-posts'); +this.patch('/posts/:id', 'blog-posts'); +this.del('/posts/:id', 'blog-posts'); +``` + +Here is the full reference of the actions' names you can pass to the _only_ / _except_ options and the Shorthands they stand for: + +``` +Action | Shorthand +------------------------------ +index | this.get('/contacts') +show | this.get('/contacts/:id') +create | this.post('/contacts') +update | this.patch('contacts/:id') (or this.put) +delete | this.del('/contacts/:id') +``` + +--- + +Shorthands are a key part of staying productive in your frontend codebase, but they only work so well because Mirage has a Data Layer that's aware of your application's domain model. + +We'll cover how it works in the next few sections of the docs. diff --git a/tests/dummy/app/pods/docs/template.hbs b/tests/dummy/app/pods/docs/template.hbs index 2676642b1..48c67bd5c 100644 --- a/tests/dummy/app/pods/docs/template.hbs +++ b/tests/dummy/app/pods/docs/template.hbs @@ -2,33 +2,43 @@ {{#viewer.nav as |nav|}} {{nav.section "Getting started"}} - {{nav.item "Overview" "docs.getting-started.index"}} + {{nav.item "What is Mirage?" "docs.getting-started.what-is-mirage"}} {{nav.item "Installation" "docs.getting-started.installation"}} - {{nav.item "Quickstart" "docs.getting-started.quickstart"}} - {{nav.item "Upgrading" "docs.getting-started.upgrading"}} + {{nav.item "Upgrade guide" "docs.getting-started.upgrade-guide"}} + {{nav.item "Overview" "docs.getting-started.overview"}} + + + {{nav.section "Route handlers"}} + {{nav.item "Functions" "docs.route-handlers.functions"}} + {{nav.item "Shorthands" "docs.route-handlers.shorthands"}} + + {{nav.section "Data layer"}} + {{nav.item "The Database" "docs.data-layer.database"}} + {{nav.item "The ORM" "docs.data-layer.orm"}} + {{nav.item "Factories" "docs.data-layer.factories"}} + {{nav.item "Fixtures" "docs.data-layer.fixtures"}} + {{nav.item "Serializers" "docs.data-layer.serializers"}} + + {{nav.section "Testing"}} + {{nav.item "Acceptance testing" "docs.testing.acceptance-testing"}} + {{nav.item "Integration and unit testing" "docs.testing.integration-and-unit-testing"}} + + {{nav.section "Advanced"}} + {{nav.item "Environment options" "docs.advanced.environment-options"}} + {{nav.item "Simulating cookie responses" "docs.advanced.simulating-cookie-responses"}} + {{nav.item "Mocking GUIDs" "docs.advanced.mocking-guids"}} + + {{!-- + + {{nav.section "Serializers"}} + {{nav.item "Links" "index"}} {{nav.section "Writing your server"}} {{nav.item "Defining routes" "docs.writing-your-server.defining-routes"}} {{nav.item "Seeding your database" "docs.writing-your-server.seeding-your-database"}} {{nav.item "Acceptance testing" "docs.writing-your-server.acceptance-testing"}} + --}} - {{nav.section "Advanced"}} - {{nav.item "Route handlers" "docs.advanced.route-handlers"}} - {{nav.item "Shorthands" "docs.advanced.shorthands"}} - {{nav.item "Defining relationships" "docs.advanced.defining-relationships"}} - {{nav.item "Factories" "docs.advanced.factories"}} - {{nav.item "Fixtures" "docs.advanced.fixtures"}} - {{nav.item "Environment configuration" "docs.advanced.environment-options"}} - {{nav.item "Identity managers" "docs.advanced.identity-managers"}} - - {{nav.section "Cookbook"}} - {{nav.item "Manually starting Mirage" "docs.cookbook.manually-starting-mirage"}} - {{nav.item "Simulating cookie responses" "docs.cookbook.simulating-cookie-responses"}} - {{nav.item "Overriding dependencies" "docs.cookbook.overriding-dependencies"}} - - {{!-- {{nav.section "Examples"}} - {{nav.item "1: Belongs to (no inverse)" "docs.examples.1-belongs-to"}} - {{nav.item "2: Has many (no inverse)" "docs.examples.2-has-many"}} --}} {{/viewer.nav}} {{#viewer.main}} diff --git a/tests/dummy/app/pods/docs/testing/acceptance-testing/template.md b/tests/dummy/app/pods/docs/testing/acceptance-testing/template.md new file mode 100644 index 000000000..d12e673b6 --- /dev/null +++ b/tests/dummy/app/pods/docs/testing/acceptance-testing/template.md @@ -0,0 +1,186 @@ +# Acceptance testing + +Acceptance testing your Ember app involves verifying some user behavior. For example, you may want to test that the user can view a list of movies on your app's homepage. + +Many of these tests rely on a given server state. In other words, you want to test that, _given ten movie resources exist on the server_ at the time the user boots up the app, when the user visits the homepage they see a list of 10 movies. + +Mirage was originally built specifically for these sorts of high-level tests. Let's see how it works. + +Assuming you're using Application Tests (introduced in [Ember 3.0](https://emberjs.com/blog/2018/02/14/ember-3-0-released.html#toc_updates-to-the-testing-defaults)), add the `setupMirage` hook to the top of your test file: + +```diff + import { setupApplicationTest } from 'ember-qunit'; ++ import { setupMirage } from 'ember-cli-mirage/test-support'; + + + module('Acceptance | Homepage test', function(hooks) { + setupApplicationTest(hooks); ++ setupMirage(hooks); + + test('my first test', async function(assert) { + // test code + }); + }); +``` + +(Pre-3.0 style tests will automatically boot Mirage via an initializer.) + +Now we can run your Ember app's test suite with `ember t -s`. + +In the test environment, Mirage will load all your route handlers from `mirage/config.js`, but it will ignore your seed data from `mirage/scenarios/default.js`. That means each test starts off with a clean database state. + +Within each test, you can use your factories to define your initial server state: + +```js +test('I can view the movies', async function(assert) { + this.server.createList('movie', 10); + + await visit('/'); + + assert.dom('li.movie').exists({ count: 10 }); +}); +``` + +After each test, Mirage's server will be reset, so none of this state will leak across tests. + + +## Keeping your tests focused + +Factories are important in keeping code that's relevant to a test as close to that test as possible. In the example above, we wanted to verify that the user would see ten movies, given those movies existed on the server. So, the `server.createList('movie', 10)` call was directly in the test. + +Say we wanted to test that when the user visits a details route for a movie titled "Interstellar," they would see that title in an `

    ` tag. One way to accomplish this would be to update the movie factory itself: + +```js +// mirage/factories/movie.js +import Mirage from 'ember-cli-mirage'; + +export default Mirage.Factory.extend({ + title: 'Interstellar' +}); +``` + +The problem with this approach is that this change is very specific to this test. + +Suppose another test needed to verify something different about movies with different titles. Changing the factory to suit that case would break this test. + +For this reason, you should use `create` and `createList` to override specific attributes of your model. This will keep code relevant to your test near your test, without making the rest of your test suite brittle. + +```js +test('I can view the movies', async function(assert) { + this.server.createList('movie', 10); + + await visit('/'); + + assert.dom('li.movie').exists({ count: 10 }); +}); + +test("I see the movies's title on the detail route", await function(assert) { + let movie = this.server.create('movie', + title: 'Interstellar' + }); + + await visit(`/movies/${movie.id}`); + + assert.dom('h1').hasText('Interstellar'); +}); +``` + + +## Arrange, Act, Assert + +Mirage recommends using the [Arrange, Act, Assert approach](https://github.com/testdouble/contributing-tests/wiki/Arrange-Act-Assert) to write tests. You'll sometimes hear this pattern referred to as **AAA testing** ("triple-A testing"). + +You can see this structure in our test from above: + +```js +test('I can view the movies', async function(assert) { + // ARRANGE + this.server.createList('movie', 10); + + // ACT + await visit('/'); + + // ASSERT + assert.dom('li.movie').exists({ count: 10 }); +}); +``` + +There are of course times where it makes sense to break this rule (for example to add some extra assertions near the beginning or middle of a test), but in general you should strive to follow the pattern. + + +## Asserting a server call was made in a test + +Often you'll write tests against your application's UI, which will verify that the proper data from Mirage was returned. However, because Mirage gives you a full client-side server, you can gain more confidence from your tests by asserting against Mirage's server state, in addition to testing your Ember app's UI. + +There are two general approaches to this. First, you can assert directly against Mirage's database: + +```js +test("I can change the lesson's title", async function(assert) { + this.server.create('lesson', { title: 'My First Lesson' }) + + await visit('/'); + await click('.Edit') + await fillIn('input', 'Updated lesson'); + await click('.Save'); + + // Assert against our app's UI + assert.dom('h1').hasText('Updated lesson'); + + // Also check that the data was "persisted" to our backend + assert.equal(this.server.db.lessons[0].title, 'Updated lesson'); +}); +``` + +This gives you some extra confidence that your Ember app is sending over the data you expect. + +The next strategy is to temporarily override the server route that's relevant to your test, and assert against the actual request that your Ember app sent: + +```js +test("I can change the lesson's title", async function(assert) { + assert.expect(1); + let done = assert.async(); + + this.server.create('lesson', {title: 'My First Lesson'}) + + this.server.put('/lessons/:id', (schema, request) => { + let params = JSON.parse(request.requestBody); + + // Here, we're asserting the params Mirage received are in the format you expect + assert.deepEqual(params, {...}); + done(); + }); + + await visit('/'); + await click('.Edit') + await fillIn('input', 'Updated lesson'); + await click('.Save'); +}); +``` + +Note that here, we're overwriting any route handler you may defined for PUT to `/lessons/:id` in your `config.js` file, but only for this test. After this test, your Mirage server will be reset, and all the routes from `config.js` will be reloaded. + + +## Testing errors + +To test how your Ember app responds to a server error, overwrite a route handler within a test: + +```js +test('the user sees an error if the save attempt fails', async function(assert) { + this.server.post('/questions', () => ({ + errors: [ 'The database went on vacation' ] + }), 500); + + await visit('/'); + await click('.new'); + await fillIn('input', 'New question'); + await click('.save'); + + assert.dom('h2').hasText('The database went on vacation'); +}); +``` + +This route handler definition is only in effect for the duration of this test, so as soon as it's over any handler you have defined for POST to `/questions` in your `config.js` file will be used again. + +--- + +Those are the basics of Acceptance Testing with Mirage! Next let's talk about Integration and Unit tests. diff --git a/tests/dummy/app/pods/docs/testing/integration-and-unit-testing/template.md b/tests/dummy/app/pods/docs/testing/integration-and-unit-testing/template.md new file mode 100644 index 000000000..0a7723fcc --- /dev/null +++ b/tests/dummy/app/pods/docs/testing/integration-and-unit-testing/template.md @@ -0,0 +1,281 @@ +# Integration and unit testing + +While Mirage was originally designed for acceptance testing, it also works great when writing integration and unit tests. + +Let's say you have a data-fetching component, and you want to write a [rendering test](https://guides.emberjs.com/release/testing/#toc_rendering-tests) to verify its behavior. + +You can import and use the `setupMirage` function directly in your rendering test, and use Mirage just like you would in an acceptance test. + +```js +import { module } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { setupMirage } from 'ember-cli-mirage/test-support'; + +module('Integration | Component | FindRecord', function(hooks) { + setupRenderingTest(hooks); + setupMirage(hooks); + + test('it can fetch records', async function(assert) { + this.server.create('movie', { title: 'Interstellar' }); + + await render(hbs` + +

    {{model.title}}

    +
    + `); + + assert.equal(this.element.textContent, 'Interstellar'); + }); +}); +``` + +If you want to define some new logic for your Mirage route handlers instead of using the global ones defined in your `mirage/config.js` file, you can use `this.server` to setup new routes. + + +```js +import { module } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { setupMirage } from 'ember-cli-mirage/test-support'; + +module('Integration | Component | FindRecord', function(hooks) { + setupRenderingTest(hooks); + setupMirage(hooks); + + test('it renders an error state', async function(assert) { + this.server.get( + '/movies/:id', + () => ({ errors: [ 'Something went wrong' ]}), + 500 + ); + + await render(hbs` + + {{#if error}} +

    Whoops!

    + {{/if}} +
    + `); + + assert.equal(this.element.textContent, 'Whoops!'); + }); +}); +``` + +## Creating Ember Data models on the client with Mirage + +Something that can be a bit confusing is when you need to write a test against Ember Data models, and you reach for Mirage to help you create some. + +For example, let's say we were writing a rendering test to verify the behavior of our `` component: + +```js +module('Integration | Component | ArticleForm', function(hooks) { + setupRenderingTest(hooks); + setupMirage(hooks); + + test('it can edit an article', async function(assert) { + // get the article + + await render(hbs` + + `); + + await fillIn('input', 'New title'); + await click('.save'); + + // assert the model was saved + }); +}); +``` + +How might we test this? + +It might be tempting to use Mirage's `server.create`, since you probably already have factories defined: + +```js +module('Integration | Component | ArticleForm', function(hooks) { + setupRenderingTest(hooks); + setupMirage(hooks); + + test('it can edit an article', async function(assert) { + // 🔴 Don't do this + let article = this.server.create('article', { + title: 'Old title' + }); + this.set('article', article); + + await render(hbs` + + `); + + await fillIn('input', 'New title'); + await click('.save'); + + // assert the model was saved + }); +}); +``` + +But you shouldn't do this. + +Even though Mirage pulls its initial schema from your Ember Data models, Mirage models don't actually know anything about your Ember app. + +Mirage models exist solely in your "backend", and are only useful in helping you create your mock server definition. + +The only way data gets from Mirage to your Ember app is via an HTTP request – which is also true for your production server. + +So, in the same way that you wouldn't create a model in your server-side framework and pass it directly into an Ember component, you should also not pass a Mirage model directly into an Ember component. + +```js +// 🔴 Don't do this +// `article` is a Mirage model. It should never be consumed directly by Ember code. +let article = this.server.create('article'); +this.set('article', article); + +await render(hbs` + +`); +``` + +So, how might we get an article materialized into Ember Data's store so we can test this component, while still leveraging our Mirage factory definitions? + +Right now, there is no first-class API for this, but one is in the works. In the meantime, there are two common ways to accomplish this. + +### Using findRecord and findAll + +The first approach is to lookup Ember Data's store, and use it to find the record (just like your Ember application's routes do): + +```js +import { module } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { setupMirage } from 'ember-cli-mirage/test-support'; +import { click, fillIn } from '@ember/test-helpers'; + +module('Integration | Component | ArticleForm', function(hooks) { + setupRenderingTest(hooks); + setupMirage(hooks); + + test('it can edit an article', async function(assert) { + // ✅ Option 1: Use the store to find the record + let serverArticle = this.server.create('article', { + title: 'Old title' + }); + let store = this.owner.lookup('service:store'); + let article = await store.findRecord('article', serverArticle.id); + this.set('article', article); + + await render(hbs` + + `); + + await fillIn('input', 'New title'); + await click('.save'); + + // assert the model was saved + }); +}); +``` + +### Writing a helper to push Mirage's database + +The second approach is to make a helper that serializers Mirage's database into JSON and pushes that JSON into your Ember Data store. + +The actual logic might depend on the configuration of your Mirage server, but if you're following all of Mirage's conventions it should look roughly like this: + +```js +// your-app/tests/helpers/push-mirage-into-store.js +import { getContext } from '@ember/test-helpers'; +import { run } from '@ember/runloop'; + +export default function() { + let context = getContext(); + let store = context.owner.lookup('service:store'); + + Object.keys(context.server.schema) + .filter(key => context.server.schema[key].all !== undefined) // Get the resources + .forEach(resource => { + let models = context.server.schema[resource].all(); + let modelName = models.modelName; + let serializer = context.server.serializerOrRegistry.serializerFor(modelName); + + let originalAlwaysIncludeLinkageData = serializer.alwaysIncludeLinkageData; + serializer.alwaysIncludeLinkageData = true; + + let json = serializer.serialize(models); + + serializer.alwaysIncludeLinkageData = originalAlwaysIncludeLinkageData; + + run(() => { + store.pushPayload(json); + }); + }); +} +``` + +Now in your test, call your helper to seed Ember Data's store, and then use `peekRecord` to materialize and work with Ember Data records: + +```js +import { module } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { setupMirage } from 'ember-cli-mirage/test-support'; +import { click, fillIn } from '@ember/test-helpers'; +import pushMirageIntoStore from 'YOUR-APP/tests/helpers/push-mirage-into-store'; + +module('Integration | Component | ArticleForm', function(hooks) { + setupRenderingTest(hooks); + setupMirage(hooks); + + test('it can edit an article', async function(assert) { + // ✅ Option 2: Use the store to find the record + let serverArticle = this.server.create('article', { + title: 'Old title' + }); + pushMirageIntoStore(); + let store = this.owner.lookup('service:store'); + let article = store.peekRecord('article', serverArticle.id); + this.set('article', article); + + await render(hbs` + + `); + + await fillIn('input', 'New title'); + await click('.save'); + + // assert the model was saved + }); +}); +``` + +Something like `pushMirageIntoStore` will probably make its way into Mirage at some point. + +### Asserting against Mirage + +As far as your assertions, you can assert against the UI, as well as against Mirage's database state if you expect changes to be made on the server. + +```js +test('it can edit an article', async function(assert) { + let serverArticle = this.server.create('article', { + title: 'Old title' + }); + pushMirageIntoStore(); + let store = this.owner.lookup('service:store'); + let article = store.peekRecord('article', serverArticle.id); + this.set('article', article); + + await render(hbs` + + `); + + await fillIn('input', 'New title'); + await click('.save'); + + assert.equal(this.element.textContent.trim(), 'Saved!'); + assert.equal(serverArticle.reload().title, 'New title'); +}); +``` + +--- + +Now that you've seen how to use `setupMirage` outside of an acceptance test, you can use it in any kind of test where it makes sense to run your Mirage server! + +And with that, you've completed the main portion of the guides! Read on to see some advanced use cases and configuration options, or head over to the API docs to see how to use Mirage's various classes. diff --git a/tests/dummy/app/pods/docs/writing-your-server/acceptance-testing/template.md b/tests/dummy/app/pods/docs/writing-your-server/acceptance-testing/template.md deleted file mode 100644 index c1d158626..000000000 --- a/tests/dummy/app/pods/docs/writing-your-server/acceptance-testing/template.md +++ /dev/null @@ -1,176 +0,0 @@ -# Acceptance testing - -Acceptance testing your Ember app typically involves verifying some user behavior. For example, you may want to test that the user can view the photos on your app's index route. - -Many of these tests rely on a given server state. In other words, you want to test that the user can view ten photos, *given that ten photo resources exist on the server* at the time the user boots up the app. - -If you're using Application Tests (introduced in [Ember 3.0](https://emberjs.com/blog/2018/02/14/ember-3-0-released.html#toc_updates-to-the-testing-defaults)), add the `setupMirage` hook to the top of your test file: - -```diff - import { setupApplicationTest } from 'ember-qunit'; -+ import { setupMirage } from 'ember-cli-mirage/test-support'; - - module('Acceptance | Homepage test', function(hooks) { - setupApplicationTest(hooks); -+ setupMirage(hooks); - - test('my first test', async function(assert) { - // test code - }); - }); -``` - -Once you've defined your routes, use the `server` variable to define the initial server state directly in your tests: - -```js -test('I can view the photos', assert => { - server.createList('photo', 10); - - visit('/'); - - andThen(function() { - assert.equal( find('img').length, 10 ); - }); -}); -``` - -`server.createList` uses the `photo` factory to generate 10 database records. This way, Mirage's database is populated when the Ember app boots and makes an AJAX request to fetch the photos data. - -Mirage's server will be reset after each test, so each test starts out with a clean database state. - -## Keeping your tests focused - -The purpose of factories is to put code that's relevant to a test as close to that test as possible. In the example above, we wanted to verify that the user would see ten photos, given those photos existed on the server. So, the `server.createList('photo', 10)` call was directly in the test. - -Say we wanted to test that when the user visits a details route for a photo titled "Sunset over Hyrule," they would see that title in an `

    ` tag. One way to accomplish this would be to update the photo factory itself: - -```js -// mirage/factories/photo.js -import Mirage from 'ember-cli-mirage'; - -export default Mirage.Factory.extend({ - title: 'Sunset over Hyrule' -}); -``` - -The problem with this approach is that the desired change is very specific to this test. Suppose another test wanted to verify photos with different titles were displayed. Changing the factory to suit that case would break this test. - -For this reason, `create` and `createList` allow you to override specific attributes that your factory has defined. This lets us keep relevant code near our tests, without making them brittle. - -To override attributes, simply pass in an object as the last argument to `create` or `createList` with the attributes you want to override. Here's what this may look like for the photos example. - -First, let's make our factory more generic: - -```js -// mirage/factories/photo.js -import Mirage from 'ember-cli-mirage'; - -export default Mirage.Factory.extend({ - title(i) { - // Photo 1, Photo 2 etc. - return `Photo ${i}`; - } -}); -``` - -Now, we can write our tests, overriding the factory-generated attributes where appropriate: - -```js -test("I can view the photos", assert => { - server.createList('photo', 10); - - visit('/'); - - andThen(() => { - assert.equal( find('img').length, 10 ); - }); -}); - -test("I see the photo's title on a detail route", assert => { - let photo = server.create('photo', {title: 'Sunset over Hyrule'}); - - visit('/' + photo.id); - - andThen(() => { - assert.equal( find('h1:contains(Sunset over Hyrule)').length, 1 ); - }); -}); -``` - -We override `title` in the second test since it's relevant there, but we stick with the factory-generated defaults for the first test. - -## Asserting a server call was made in a test - -Often you'll write tests against your application's UI, which will verify that the proper data from Mirage was returned. However, because Mirage gives you a full client-side server, you can gain more confidence from your tests by asserting against Mirage's server state, in addition to testing your Ember app's UI. - -There are two general approaches to this. First, you can assert directly against Mirage's database: - -```js -test("I can change the lesson's title", assert => { - server.create('lesson', {title: 'My First Lesson'}) - - visit('/'); - click('.Edit') - fillIn('input', 'Updated lesson'); - click('.Save'); - - andThen(() => { - // Assert against our app's UI - assert.equal( find('h1:contains(Updated lesson)').length, 1 ); - - // Also check that the data was "persisted" to our backend - assert.equal( server.db.lessons[0].title, 'Updated lesson'); - }); -}); -``` - -The next strategy is to temporarily override the server route that's relevant to your test, and assert against the actual request that your Ember app sent: - -```js -test("I can change the lesson's title", function(assert) { - assert.expect(1); - let done = assert.async(); - - server.create('lesson', {title: 'My First Lesson'}) - - server.put('/lessons/:id', (schema, request) => { - let params = JSON.parse(request.requestBody); - - // Here, we're asserting the params Mirage received are in the format you expect - assert.deepEqual(params, {...}); - done(); - }); - - visit('/'); - click('.Edit') - fillIn('input', 'Updated lesson'); - click('.Save'); -}); -``` - -Note that here, we're overwriting any route handler you may defined for PUT to `/lessons/:id` in your `config.js` file, but only for this test. After this test, your Mirage server will be reset, and all the routes from `config.js` will be used. - -## Testing errors - -To test how your Ember app responds to a server error, overwrite a route handler within a test: - -```js -test('the user sees an error if the save attempt fails', function(assert) { - server.post('/questions', {errors: ['There was an error']}, 500); - - visit('/'); - click('.new'); - fillIn('input', 'New question'); - click('.save'); - - andThen(() => { - assert.equals(find('p:contains(There was an error)').length, 1); - }); -}); -``` - -This route handler definition is only in effect for the duration of this test, so as soon as it's over any handler you have defined for POST to `/questions` in your `config.js` file will be used again. - ---- - -You should now know enough to fake your production API and test your app using Mirage! diff --git a/tests/dummy/app/pods/docs/writing-your-server/defining-routes/template.md b/tests/dummy/app/pods/docs/writing-your-server/defining-routes/template.md deleted file mode 100644 index 280fcc975..000000000 --- a/tests/dummy/app/pods/docs/writing-your-server/defining-routes/template.md +++ /dev/null @@ -1,367 +0,0 @@ -# Defining routes - -To define routes for your server, use the `get`, `post`, `put` (or `patch`) and `del` methods. Here's an example: - -```js -// mirage/config.js -this.get('/authors', () => { - return ['Link', 'Zelda', 'Epona']; -}); -``` - -Now when your Ember app makes a GET request to `/authors`, it will receive this data. - -Each verb method has the same signature. The first argument is the path (URL) and the second is the actual function handler that returns the response: - -

    this.verb( path, handler )

    - -Here are some more examples: - -```js -this.get('/users/current', () => { - return { - name: 'Zelda', - email: 'z@hyrule.org' - }; -}); - -this.get('/events', () => { - let events = []; - for (let i = 1; i < 1000; i++) { - events.push({id: i, value: Math.random()}); - }; - - return events; -}); -``` - - -## Working with Models - -In the examples above, we wrote the response data directly in the route. Instead of doing this, Mirage provides a simple in-memory database you can use to make your routes more versatile. - -In previous versions of Mirage, you interacted with the database directly in your route handlers. Models were introduced as a wrapper around the database to provide better means for dealing with associations and formatting responses, which we'll get to shortly. For now, it's enough to know that models are the primary way you interact with Mirage's database. - -So, let's first define an `author` model. We can do this from the command line: - -```sh -ember g mirage-model author -``` - -This gives us the file - -```js -// mirage/models/author.js -import { Model } from 'ember-cli-mirage'; - -export default Model; -``` - -which sets up our database (at run-time) with an `authors` table. Now we can rewrite our route handler to use the model. - -A `schema` object is injected into each route handler as the first parameter, which is how we access our models. Let's use it to make this route dynamic: - -```js -// mirage/config.js -this.get('/authors', (schema) => { - return schema.authors.all(); -}); -``` - - - -Now, Mirage will respond to this route with all the `author` models in its database. - -You can also create, update and delete models from your route handlers. A `request` object is injected as the second parameter, which contains any data that was sent along with the request. - -Let's say your Ember app creates an author by sending a POST request with the following payload: - -``` -{ - author: { - name: 'Link', - age: 123 - } -} -``` - -We can use this data to create a new `author` model: - -```js -this.post('/authors', (schema, request) => { - const attrs = JSON.parse(request.requestBody).author; - - return schema.authors.create(attrs); -}); -``` - -This handler creates a new author, inserts it into the database (which assigns it an `id`), and responds with that record. - - - -As long as all your Mirage routes read from and write to the database, user interactions will persist during a single session. This lets users interact with your app as if it were wired up to a real server. - - -## Dynamic paths and query params - -The request object that's injected into your route handlers contains any dynamic route segments and query params. - -To define a route that has a dynamic segment, use colon syntax (`:segment`) in your path. The dynamic piece will be available via `request.params.[segment]`: - -```js -this.get('/authors/:id', (schema, request) => { - var id = request.params.id; - - return schema.authors.find(id); -}) -``` - -Query params from the request can also be accessed via `request.queryParams.[param]`. - -Mirage uses Pretender.js to intercept HTTP requests, so check out [its docs](https://github.com/trek/pretender) to see the full API for the request object. - - -## Using shorthands - -APIs have become more standardized, so Mirage has the concept of *shorthands* to deal with common scenarios. These shorthands can replace many of your custom route handlers, dramatically simplifying your server definition. - -For example, the route handler we wrote above to handle a GET request to `/authors` - -```js -this.get('/authors', (schema, request) => { - return schema.authors.all(); -}); -``` - -is pretty standard: it responds with a named collection. The shorthand form of this is - -```js -this.get('/authors'); -``` - -which infers the collection name from the last part of the URL. Returning a single author by id is just as easy: - -```js -this.get('/authors/:id'); -``` - -Similarly, we wrote a route handler by hand to deal with creating an author - -```js -this.post('/authors', (schema, request) => { - const attrs = JSON.parse(request.requestBody).author; - - return schema.authors.create(attrs); -}); -``` - -which is also pretty standard: it creates a new model using the attributes from the request payload. The equivalent shorthand is - -```js -this.post('/authors'); -``` - -View the [full reference](../shorthands) to see all available shorthands. - - -## Formatting your response with Serializers - -When you return a model or a collection from a route handler, Mirage *serializes* it into a JSON payload, and then responds to your Ember app with that payload. It uses an object called a Serializer to do this, which you can customize. Having a single object that's responsible for this formatting logic helps keep your route handlers simple. In particular, a bit of customization in the serializer layer often lets you use shorthands when you otherwise wouldn't be able to. - -Mirage ships with three named serializers, JsonApiSerializer (used to implement [JSON:API](http://jsonapi.org/)), ActiveModelSerializer (used to simulate Rails servers using ActiveModel::Serializers) and RestSerializer (use to match Ember Data’s RestSerializer expected response format). You should use these if your app's backend will be built to conform to either standard. - -Additionally, there's a basic Serializer class that you can use and customize. By default, it takes all the attributes of your model, and returns them under a root key of the model type. Suppose you had the following author in your database: - -``` -{ - id: 1, - firstName: 'Keyser', - lastName: 'Soze' - age: 145 -} -``` - -and you had this route - -```js -this.get('/authors/:id'); -``` - -The response would look like this: - -``` -GET /authors/1 - -{ - author: { - id: 1, - firstName: 'Keyser', - lastName: 'Soze', - age: 145 - } -} -``` - -Remember, your Mirage server should mimic your backend server. Let's say your backend server returns dasherized object keys instead of camel cased. You can customize the response by extending the base Serializer and overwriting `keyForAttribute`: - -```js -// mirage/serializers/application.js -import { Serializer } from 'ember-cli-mirage'; -import Ember from 'ember'; - -const { dasherize } = Ember.String; - -export default Serializer.extend({ - - keyForAttribute(key) { - return dasherize(key); - } - -}); -``` - -Now, without having to edit your route handler, the response would look like this: - -``` -GET /authors/1 - -{ - author: { - id: 1, - 'first-name': 'Keyser', - 'last-name': 'Soze', - age: 145 - } -} -``` - -Just like in Ember, the `serializers/application.js` file will apply to all your responses. You can also create per-model serializers, for example to include only some attributes: - -```js -// mirage/serializers/author.js -import ApplicationSerializer from './application'; - -export default ApplicationSerializer.extend({ - - attributes: ['firstName'] - -}); -``` - -View the [full Serializer API](../serializers) to learn more about customizing your responses. - - -## Associations - -You can define associations between your models, which makes dealing with related data easier. For example, let's say an author has many posts, and when you delete an author your server also deletes all the related posts. - -We can define the relationship on our author model: - -```js -// mirage/models/author.js -import { Model, hasMany } from 'ember-cli-mirage'; - -export default Model.extend({ - posts: hasMany() -}); -``` - -`hasMany` tells Mirage to manage a `postIds: []` array on our author model. Now, our route handler for deleting an author looks like this: - -```js -this.del('/authors/:id', (schema, request) => { - let author = schema.authors.find(request.params.id); - - author.posts.delete(); - author.delete(); -}); -``` - -A response with DELETE's default status code of 200 would then be returned. - -Associations are also useful in combination with serializers. With the relationship defined above on our `author` model, we can use a shorthand and a custom serializer to sideload an author's related posts: - -```js -// mirage/config.js -this.get('/authors/:id'); - -// mirage/serializers/author.js -import { Serializer } from 'ember-cli-mirage'; - -export default Serializer.extend({ - include: ['posts'] -}); -``` - -Now a request for an author responds with the following: - -``` -GET /authors/1 - -{ - author: { - id: 1, - name: 'Link' - }, - posts: [ - {id: 1, authorId: 1, title: "The Beauty of Hyrule"}, - {id: 2, authorId: 1, title: "Really, I'm an Elf!"}, - {id: 3, authorId: 1, title: "Ganondorf is my Father"} - ] -} -``` - - - -Mirage's database uses camelCase for all model attributes, including foreign keys (e.g. `authorId` in the example above), but you can customize the format that gets sent in the response by overwriting your serializer's `keyForRelatedCollection`. See [the serializer guide](../serializers) for more details. - - -## Dynamic status codes and HTTP headers - -By default, Mirage sets the HTTP code of a response based on the verb being used: - - - `get`, `put` and `del` are 200 - - `post` is 201 - - -Additionally, a header for `Content-Type` is set to `application/json`. - -You can customize both the response code and headers by returning a `Response` in your route handler: - -```js -// mirage/config.js -import { Response } from 'ember-cli-mirage'; - -export default function() { - this.post('/authors', function(schema, request) { - let attrs = JSON.parse(request.requestBody).author; - - if (attrs.name) { - return schema.authors.create(attrs); - } else { - return new Response(400, {some: 'header'}, {errors: ['name cannot be blank']}); - } - }); -} -``` - - -## Fully qualified URLs - -Route handlers for paths without a domain (e.g. `this.get('/authors')`) work for requests that target the current domain. To simulate other-origin requests, specify the fully qualified URL for your route handler: - -```js -this.get('https://api.github.com/users/samselikoff/events', () => { - return []; -}); -``` - ---- - -That's the essentials of defining your routes. Next, you'll learn how to seed your database with some starting data, both in development and within tests. diff --git a/tests/dummy/app/pods/docs/writing-your-server/seeding-your-database/template.md b/tests/dummy/app/pods/docs/writing-your-server/seeding-your-database/template.md deleted file mode 100644 index db5211136..000000000 --- a/tests/dummy/app/pods/docs/writing-your-server/seeding-your-database/template.md +++ /dev/null @@ -1,220 +0,0 @@ -# Seeding your database - -Once you've defined your server's routes, you'll probably want to seed your database with some initial data. You can use factories or fixtures, or both. - -In general Mirage recommends that you use factories, for a few reasons: - - - they're versatile and give you more control over data creation - - they make your tests more intention-revealing - - they're easier to maintain and change - -First, we'll look at using factories. - -## Defining factories - -If you've never used factories before, think of them as a way to make database records for your models. You define factories by creating files under the `/mirage/factories` directory. The name of the factory, which you reference in your tests, is determined by the filename. - -Factories have attributes which can be strings, numbers, booleans or functions. Let's define a factory for our `author` model: - -```sh -ember g mirage-factory author -``` - -This creates a factory file for us. Let's add some attributes: - -```js -// mirage/factories/author.js -import { Factory } from 'ember-cli-mirage'; - -export default Factory.extend({ - name(i) { - return `Author ${i}`; - }, - age: 20, - admin: false -}); -``` - -Functions take one parameter, the sequence number of the object being created. This lets you create records with dynamic attributes. - -Each time this factory is used to create an object, it will have an autogenerated `id` assigned to it, since it will be inserted into the database. So, the objects created from the example factory above will look like - - {id: 0, name: "Author 0", age: 20, admin: false} - {id: 1, name: "Author 1", age: 20, admin: false} - {id: 2, name: "Author 2", age: 20, admin: false} - -and so on. - -Mirage also pairs great with the Faker.js library, which makes it easy to create more realistic looking data: - -```js -// mirage/factories/author.js -import { Factory } from 'ember-cli-mirage'; -import faker from 'faker'; - -export default Factory.extend({ - firstName() { - return faker.name.firstName(); - }, - - lastName() { - return faker.name.lastName(); - }, - - age() { - // list method added by Mirage - return faker.random.number({ min: 18, max: 65 }); - }, -}); -``` - -Once you've defined your factories, you can use them to seed your database via the `server.create` and `server.createList` methods. - -## Using factories in development - -To seed your database in development, use the `mirage/scenarios/default.js` file that was created for you when you installed Mirage. A simple scenario may look like this: - -```js -// mirage/scenarios/default.js -export default function(server) { - server.createList('blog-post', 10); - - let author = server.create('author', {name: 'Zelda'}); - server.createList('blog-post', 20, { author }); -} -``` - -Note that this scenario will be ignored during testing. This is so you can change your development data without affecting your tests. - -## Using factories in testing - -During acceptance testing, Mirage's initializer is run when your Ember app starts up, and you'll have access to a `server` variable within each test. Each test will start with a clean database, so you can use `create` and `createList` to define your data on a per-test basis: - -```js -test('I can view the authors', function() { - server.createList('author', 3); - - visit('/contacts'); - - andThen(function() { - equal( find('p').length, 3 ); - }); -}); -``` - -## Using scenarios in testing - -If you want to run the same scenario in your tests that runs in development, you can import a scenario and run your server through it: - -```js -import defaultScenario from '../../mirage/scenarios/default'; - -test('I can view the authors', function() { - defaultScenario(server); - - visit('/contacts'); - - andThen(function() { - equal( find('p').length, 3 ); - }); -}); -``` - -Learn more about acceptance testing in the [next section](../acceptance-testing). - -## Overriding factory attributes - -`create` and `createList` use the attributes you've defined on your factory to create the model; however, it's often convenient to override these attributes at the time of creation. - -To override attributes, pass in an object as the last argument to `create` or `createList` with the attributes you want to override. For instance, if we had the following factory definition - -```js -// mirage/factories/author.js -import { Factory } from 'ember-cli-mirage'; - -export default Factory.extend({ - age: 20, - admin: false -}); -``` - -then by default authors created from this factory would have an `admin` attribute of `false` and an `age` of 20: - -```js -let author = server.create('author'); -author.admin // false -author.age // 20 -``` - -If we wanted to make an admin, we could do the following: - -```js -let author = server.create('author', { admin: true }); -author.admin // true -author.age // 20 -``` - -We can also override multiple attributes: - -```js -let author = server.create('author', { admin: true, age: 30 }); -author.admin // true -author.age // 30 -``` - -## Relationships with factories - -You can also create related data with factories. Assuming you have the relationships defined on your models, you can pass in related data as an override: - -```js -let author = server.create('author'); -server.createList('post', 10, { author }); -``` - -Now that the foreign keys are set up, your models, shorthand routes and serializers should work as expected. - - ---- - - -## Fixtures - -You can also choose to use fixtures instead of (or in addition to) factories. If you've never used fixtures before, think of a fixture file as a database table. To add data to your `authors` table, for instance, create the file `/mirage/fixtures/authors.js`: - -```js -// /mirage/fixtures/authors.js -export default [ - {id: 1, firstName: 'Link'}, - {id: 2, firstName: 'Zelda'}, - {id: 3, firstName: 'Epona'} -]; -``` - -Fixture filenames are always plural, and export arrays of POJOs. During development, this data will be added to Mirage's database and will be available in route handlers via `db.authors`. - -Use the `server.loadFixtures()` API to load some or all of your fixture files in development (by calling it from `scenario/default.js`) or from within a test. [See the guide](../configuration/#loadFixtures) for more info. - -## Relationships with fixtures - -To create related data, you'll need to manage the foreign keys yourself. Let's look at an example. - -Suppose an `author` has many `blogPosts`, and each `blogPost` belongs to an `author`. Your fixture data may look like this: - -```js -// /mirage/fixtures/authors.js -export default [ - { id: 1, firstName: 'Link', blogPostIds: [ 1, 2 ] }, - { id: 2, firstName: 'Zelda', blogPostIds: [ 3 ] } -]; - -// /mirage/fixtures/blog-posts.js -export default [ - { id: 1, title: 'Lorem', authorId: 1 }, - { id: 2, title: 'Ipsum', authorId: 1 }, - { id: 3, title: 'Dolor', authorId: 2 } -]; -``` - ---- - -You should now know how to seed your database with data, both during development and testing! Let's wrap up with a look at how to use your shiny new client-side server to write some acceptance tests for your Ember app. diff --git a/tests/dummy/app/router.js b/tests/dummy/app/router.js index 70d3cd327..8b12581ac 100644 --- a/tests/dummy/app/router.js +++ b/tests/dummy/app/router.js @@ -8,38 +8,35 @@ const Router = AddonDocsRouter.extend({ Router.map(function() { docsRoute(this, function() { - this.route('getting-started', { path: '/' }, function() { - this.route('overview'); + this.route('getting-started', function() { + this.route('what-is-mirage'); this.route('installation'); - this.route('quickstart'); - this.route('upgrading'); - }); - - this.route('writing-your-server', function() { - this.route('defining-routes'); - this.route('seeding-your-database'); - this.route('acceptance-testing'); + this.route('upgrade-guide'); + this.route('overview'); }); - this.route('cookbook', function() { - this.route('manually-starting-mirage'); - this.route('simulating-cookie-responses'); - this.route('overriding-dependencies'); + this.route('route-handlers', function() { + this.route('functions'); + this.route('shorthands'); }); - this.route('advanced', function() { - this.route('route-handlers'); - this.route('defining-relationships'); + this.route('data-layer', function() { + this.route('database'); + this.route('orm'); this.route('factories'); this.route('fixtures'); - this.route('environment-options'); - this.route('shorthands'); - this.route('identity-managers'); + this.route('serializers'); + }); + + this.route('testing', function() { + this.route('acceptance-testing'); + this.route('integration-and-unit-testing'); }); - this.route('examples', function() { - this.route('1-belongs-to'); - this.route('2-has-many'); + this.route('advanced', function() { + this.route('environment-options'); + this.route('simulating-cookie-responses'); + this.route('mocking-guids'); }); this.route('api', function() { @@ -48,14 +45,6 @@ Router.map(function() { }); this.route('blog', function() { - // this.route('old-post-year', { path: '/:post_year' }, function() { - // this.route('old-post-month', { path: '/:post_month' }, function() { - // this.route('old-post-day', { path: '/:post_day' }, function() { - // this.route('old-post-slug', { path: '/:post_slug' }); - // }); - // }); - // }); - this.route('detail', { path: '/:post_slug_and_id' }); }); From 3783d555b814da50949606afbc67967a9fd91910 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 17 May 2019 08:26:10 -0400 Subject: [PATCH 414/879] build(deps-dev): bump ember-source-channel-url from 1.1.0 to 2.0.1 (#1623) Bumps [ember-source-channel-url](https://github.com/rwjblue/ember-source-channel-url) from 1.1.0 to 2.0.1. - [Release notes](https://github.com/rwjblue/ember-source-channel-url/releases) - [Commits](https://github.com/rwjblue/ember-source-channel-url/compare/v1.1.0...v2.0.1) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 173277b54..bf40b7e13 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "ember-moment": "^7.8.1", "ember-resolver": "^5.0.1", "ember-source": "~3.10.0", - "ember-source-channel-url": "^1.1.0", + "ember-source-channel-url": "^2.0.1", "ember-try": "^1.0.0", "escape-string-regexp": "^2.0.0", "eslint-plugin-ember": "^6.2.0", diff --git a/yarn.lock b/yarn.lock index 045151c16..dfae44b99 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5979,13 +5979,20 @@ ember-router-service-polyfill@^1.0.2: dependencies: ember-cli-babel "^6.8.2" -ember-source-channel-url@^1.0.1, ember-source-channel-url@^1.1.0: +ember-source-channel-url@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/ember-source-channel-url/-/ember-source-channel-url-1.1.0.tgz#73de5cc6ebc25b2120e932ec1d8f82677bfaf6ef" integrity sha512-y1RVXmyqrdX6zq9ZejpPt7ohKNGuLMBEKaOUyxFWcYAM5gvLuo6xFerwNmXEBbu4e3//GaoasjodXi6Cl+ddUQ== dependencies: got "^8.0.1" +ember-source-channel-url@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ember-source-channel-url/-/ember-source-channel-url-2.0.1.tgz#18b88f8a00b7746e7a456b3551abb3aea18729cc" + integrity sha512-YlLUHW9gNvxEaohIj5exykoTZb4xj9ZRTcR4J3svv9S8rjAHJUnHmqC5Fd9onCs+NGxHo7KwR/fDwsfadbDu5Q== + dependencies: + got "^8.0.1" + ember-source@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.10.0.tgz#c423f494d573d418bf843d605ea79c21a14ca863" From d11b9336584a03c0855f472370b2add8dcd99308 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 17 May 2019 08:56:48 -0400 Subject: [PATCH 415/879] docs: Add note about using scenarios in testing --- .../docs/data-layer/factories/template.md | 2 +- .../testing/acceptance-testing/template.md | 57 +++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/tests/dummy/app/pods/docs/data-layer/factories/template.md b/tests/dummy/app/pods/docs/data-layer/factories/template.md index 76b131196..5e91ef3f9 100644 --- a/tests/dummy/app/pods/docs/data-layer/factories/template.md +++ b/tests/dummy/app/pods/docs/data-layer/factories/template.md @@ -647,7 +647,7 @@ In this test, we start our Mirage server out with 5 movies. Then we boot up the When we write another test, the database will start out empty so that none of Mirage's state leaks across tests. -You can read more about testing with Mirage in the [Testing]() section of these guides. +You can read more about testing with Mirage in the {{docs-link 'Testing' 'docs.testing.acceptance-testing'}} section of these guides. ## Factory best practices diff --git a/tests/dummy/app/pods/docs/testing/acceptance-testing/template.md b/tests/dummy/app/pods/docs/testing/acceptance-testing/template.md index d12e673b6..49c8ee700 100644 --- a/tests/dummy/app/pods/docs/testing/acceptance-testing/template.md +++ b/tests/dummy/app/pods/docs/testing/acceptance-testing/template.md @@ -181,6 +181,63 @@ test('the user sees an error if the save attempt fails', async function(assert) This route handler definition is only in effect for the duration of this test, so as soon as it's over any handler you have defined for POST to `/questions` in your `config.js` file will be used again. + +## Using scenarios in testing + +Typically you should reserve the `scenarios/default.js` file for development, so changes to it don't affect the rest of your test suite. That's why Mirage doesn't autoload this module during tests. + +If you'd like to load your development scenario in your tests, you can always directly import that module and run your test server through it: + +```js +import defaultScenario from '../../mirage/scenarios/default'; + +test('I can view the authors', async function(assert) { + defaultScenario(server); + + await visit('/contacts'); + + assert.dom('p').exists({ count: 3 }); +}); +``` + +It might be more clear to move the shared logic to a new module + +```js +// scenarios/shared.js +export default function(server) { + server.loadFixtures('country'); + + server.createList('event', 10); +}); +``` + +...load it in your default scenario + +```js +// scenarios/default.js +import sharedScenario from './shared': +export default function(server) { + sharedScenario(server); + + server.createList('speaker', 3); + // ... +}); +``` + +...and then also load it in your tests (or even a common test setup function): + +```js +import sharedScenario from '../../mirage/scenarios/shared'; + +test('I can view the authors', async function(assert) { + sharedScenario(server); + + // ... +}); +``` + +This same sort of pattern will work for Integration and Unit tests as well. + --- Those are the basics of Acceptance Testing with Mirage! Next let's talk about Integration and Unit tests. From 9fb587e93b8b646a946a786bdd65b390bf66a3e0 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 17 May 2019 09:29:37 -0400 Subject: [PATCH 416/879] docs: Add guide on inflector customization --- .../customizing-the-inflector/template.md | 64 +++++++++++++++++++ tests/dummy/app/pods/docs/template.hbs | 11 +--- tests/dummy/app/router.js | 1 + 3 files changed, 66 insertions(+), 10 deletions(-) create mode 100644 tests/dummy/app/pods/docs/advanced/customizing-the-inflector/template.md diff --git a/tests/dummy/app/pods/docs/advanced/customizing-the-inflector/template.md b/tests/dummy/app/pods/docs/advanced/customizing-the-inflector/template.md new file mode 100644 index 000000000..66dfbdc03 --- /dev/null +++ b/tests/dummy/app/pods/docs/advanced/customizing-the-inflector/template.md @@ -0,0 +1,64 @@ +# Customizing the inflector + +When using Ember Data, you'll sometimes find yourself needing to customize the inflection rules used by your models. + +For example, say you had an `Advice` model. By default, Ember's inflector pluralizes this as "advices" + +```js +import { pluralize } from 'ember-inflector'; + +pluralize("advice"); // advices +``` + +Ember Data uses these inflection rules for things like building its conventional URLs: + +```Js +this.store.findAll('advice'); + +// GET /api/advices +``` + +Mirage also relies on the inflector for its conventions. For example, the resource Shorthand + +```js +// mirage/config.js +this.resource('advice'); +``` + +might use inflection rules to try to look up the "advices" collection or database table. + +[The guides](https://guides.emberjs.com/release/models/customizing-adapters/#toc_pluralization-customization) document the best way to configure these inflection rules. At the time of this writing, here's how you'd configure the inflector to treat "advice" as an uncountable word (i.e. a word with no plural form): + +```js +// app/initializers/custom-inflector-rules.js +import Inflector from 'ember-inflector'; + +export function initialize(/* application */) { + const inflector = Inflector.inflector; + + // Tell the inflector that the plural of "advice" is "advice" + inflector.uncountable('advice'); +} + +export default { + name: 'custom-inflector-rules', + initialize +}; +``` + +As long as you follow this approach, Mirage should respect your custom inflector rules. + +With the above rule, + +```Js +this.store.findAll('advice'); +``` + +would now result in a `GET` request to `/api/advice`, and + +```js +// mirage/config.js +this.resource('advice'); +``` + +would respond correctly to that request, as well as correctly handle all other operations to the `Advice` resource. diff --git a/tests/dummy/app/pods/docs/template.hbs b/tests/dummy/app/pods/docs/template.hbs index 48c67bd5c..77db9938a 100644 --- a/tests/dummy/app/pods/docs/template.hbs +++ b/tests/dummy/app/pods/docs/template.hbs @@ -27,17 +27,8 @@ {{nav.item "Environment options" "docs.advanced.environment-options"}} {{nav.item "Simulating cookie responses" "docs.advanced.simulating-cookie-responses"}} {{nav.item "Mocking GUIDs" "docs.advanced.mocking-guids"}} + {{nav.item "Customizing the inflector" "docs.advanced.customizing-the-inflector"}} - {{!-- - - {{nav.section "Serializers"}} - {{nav.item "Links" "index"}} - - {{nav.section "Writing your server"}} - {{nav.item "Defining routes" "docs.writing-your-server.defining-routes"}} - {{nav.item "Seeding your database" "docs.writing-your-server.seeding-your-database"}} - {{nav.item "Acceptance testing" "docs.writing-your-server.acceptance-testing"}} - --}} {{/viewer.nav}} diff --git a/tests/dummy/app/router.js b/tests/dummy/app/router.js index 8b12581ac..0b81780cd 100644 --- a/tests/dummy/app/router.js +++ b/tests/dummy/app/router.js @@ -37,6 +37,7 @@ Router.map(function() { this.route('environment-options'); this.route('simulating-cookie-responses'); this.route('mocking-guids'); + this.route('customizing-the-inflector'); }); this.route('api', function() { From 4269db9638db7e955ae85b4ad4e8d7f48c5a3dba Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 17 May 2019 09:31:04 -0400 Subject: [PATCH 417/879] fix typo --- .../docs/advanced/customizing-the-inflector/template.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/dummy/app/pods/docs/advanced/customizing-the-inflector/template.md b/tests/dummy/app/pods/docs/advanced/customizing-the-inflector/template.md index 66dfbdc03..cdf88d4a2 100644 --- a/tests/dummy/app/pods/docs/advanced/customizing-the-inflector/template.md +++ b/tests/dummy/app/pods/docs/advanced/customizing-the-inflector/template.md @@ -10,14 +10,14 @@ import { pluralize } from 'ember-inflector'; pluralize("advice"); // advices ``` -Ember Data uses these inflection rules for things like building its conventional URLs: +Ember Data uses these inflection rules for things like building its conventional URLs. For example, ```Js this.store.findAll('advice'); - -// GET /api/advices ``` +would result in a GET request to `/api/advices`. + Mirage also relies on the inflector for its conventions. For example, the resource Shorthand ```js From e67d6d632d1dc75ac54d27815eb3f92fe8efe8b9 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 17 May 2019 09:33:41 -0400 Subject: [PATCH 418/879] docs: tweak testing scenarios --- .../testing/acceptance-testing/template.md | 27 +++++++------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/tests/dummy/app/pods/docs/testing/acceptance-testing/template.md b/tests/dummy/app/pods/docs/testing/acceptance-testing/template.md index 49c8ee700..16c72cf80 100644 --- a/tests/dummy/app/pods/docs/testing/acceptance-testing/template.md +++ b/tests/dummy/app/pods/docs/testing/acceptance-testing/template.md @@ -186,21 +186,11 @@ This route handler definition is only in effect for the duration of this test, s Typically you should reserve the `scenarios/default.js` file for development, so changes to it don't affect the rest of your test suite. That's why Mirage doesn't autoload this module during tests. -If you'd like to load your development scenario in your tests, you can always directly import that module and run your test server through it: +If there's some logic you'd like to share between your development scenario and your tests, you can always make a new module under `scenarios` and import it in both places. -```js -import defaultScenario from '../../mirage/scenarios/default'; - -test('I can view the authors', async function(assert) { - defaultScenario(server); - - await visit('/contacts'); - - assert.dom('p').exists({ count: 3 }); -}); -``` +you'd like to load your development scenario in your tests, you can always directly import that module and run your test server through it: -It might be more clear to move the shared logic to a new module +Create the module ```js // scenarios/shared.js @@ -214,13 +204,14 @@ export default function(server) { ...load it in your default scenario ```js -// scenarios/default.js -import sharedScenario from './shared': -export default function(server) { +import sharedScenario from '../../mirage/scenarios/shared'; + +test('I can view the authors', async function(assert) { sharedScenario(server); - server.createList('speaker', 3); - // ... + await visit('/contacts'); + + assert.dom('p').exists({ count: 3 }); }); ``` From bab1082647f5870fc50933f562c2ff916006a531 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 17 May 2019 10:01:41 -0400 Subject: [PATCH 419/879] v1.0.0-beta.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bf40b7e13..2092b82fc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "1.0.0-beta.2", + "version": "1.0.0-beta.3", "description": "A client-side server to help you build, test and demo your Ember app", "keywords": [ "ember-addon", From af164c9a9231e3b68fb7163fc2e6b509f483f30a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 20 May 2019 10:46:17 +0000 Subject: [PATCH 420/879] build(deps-dev): bump ember-cli-addon-docs from 0.6.10 to 0.6.11 Bumps [ember-cli-addon-docs](https://github.com/ember-learn/ember-cli-addon-docs) from 0.6.10 to 0.6.11. - [Release notes](https://github.com/ember-learn/ember-cli-addon-docs/releases) - [Changelog](https://github.com/ember-learn/ember-cli-addon-docs/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-learn/ember-cli-addon-docs/compare/v0.6.10...v0.6.11) Signed-off-by: dependabot[bot] --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index dfae44b99..8f6a9e76d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4983,9 +4983,9 @@ ember-cli-addon-docs-esdoc@^0.2.1: walk-sync "^0.3.2" ember-cli-addon-docs@^0.6.4: - version "0.6.10" - resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.10.tgz#8a69607e96586826e46e69f6f9878def9af5a07e" - integrity sha512-IJSBx/yXHQQ6tmQjKnM7DLbThOoGOTBgzQogGD8kmHh+dZXdkI350uSGqYo1/sD2OJg89vdEY9eW30kOYZUflQ== + version "0.6.11" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.11.tgz#a4b3c800aeb7ab83ea768e71845db7221b890a85" + integrity sha512-yu46/ExuZd2+DI6c9XVc7cNHKYKgAlpBtQnNNKdR5vdNofQmIUOyxy7GV7t/P/rT5p62nx5LxWVY8XYd8QXH0w== dependencies: "@glimmer/syntax" "^0.36.4" broccoli-bridge "^1.0.0" @@ -5018,7 +5018,7 @@ ember-cli-addon-docs@^0.6.4: ember-href-to "^1.15.1" ember-keyboard "^4.0.0" ember-modal-dialog "3.0.0-beta.3" - ember-responsive "^3.0.0-beta.1" + ember-responsive "^3.0.0" ember-router-generator "^1.2.3" ember-router-scroll "^1.0.0" ember-svg-jar "^1.2.2" @@ -5944,10 +5944,10 @@ ember-resolver@^5.0.1: ember-cli-version-checker "^3.0.0" resolve "^1.10.0" -ember-responsive@^3.0.0-beta.1: - version "3.0.0-beta.3" - resolved "https://registry.yarnpkg.com/ember-responsive/-/ember-responsive-3.0.0-beta.3.tgz#63f4f5cad179399e40cd6a591bb2677c4cc0a874" - integrity sha512-C7E0C/hKy5BT5tjHxzyLItc7Bq/Ci/IoUucQ1OQts81Uxq0SG4srjbfO0ZlDq6nbV7xxe9xdPMPD5tPHii8W2w== +ember-responsive@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-responsive/-/ember-responsive-3.0.0.tgz#03791da324299a8c8cb461e541a5e1aeca887881" + integrity sha512-5JQ+REBu37M7NNDJOnTjzp5eQzg4cX7VtPcD19V3nBcntRuDwf7N6TndLxmw4Kt3JXuzQL4PkDE2SgVKuNTdWQ== dependencies: ember-cli-babel "^6.6.0" From b2ab1c06cfefac6e1869a40d038889b0f44984c8 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 21 May 2019 08:55:35 -0400 Subject: [PATCH 421/879] Update CONTRIBUTING.md --- CONTRIBUTING.md | 54 +++++++++++++++---------------------------------- 1 file changed, 16 insertions(+), 38 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 00d0162bc..fc5adf027 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,53 +8,31 @@ It's best to ask a question with an attached Twiddle that demonstrates your bug/ ## Docs development -If you're just making a change to a single page in the docs, you can simply use GitHub's interface. Find the relevant doc and click "Edit". +The documentation site is built using [Ember CLI AddonDocs](https://ember-learn.github.io/ember-cli-addon-docs/), which means it is the Ember app located in the `tests/dummy` folder of this addon. -To make more substantial changes, you'll want to be able to write locally. The docs are a [Jekyll](https://jekyllrb.com/) site. Once you have Ruby, Bundler and Jekyll installed, +If you're just making a change to a single page in the docs, look for the "Edit this page" link at the bottom of that page. Click on that and propose your edits. -1. Fork `ember-cli-mirage` on GitHub, then create a local clone of your fork: +To make more substantial changes, you'll want to be able to develop the docs site locally. To run an AddonDocs site, - ``` - git clone git@github.com:[your-name]/ember-cli-mirage.git - cd ember-cli-mirage - ``` +```shell +git clone git@github.com:samselikoff/ember-cli-mirage.git +cd ember-cli-mirage +yarn install # (or npm install) +ember s +``` -2. Checkout the `gh-pages` branch: - - ``` - git checkout gh-pages - ``` - -3. Start the Jekyll build: - - ``` - bundle install - bundle exec jekyll serve --watch --baseurl '' - ``` - -You should be able to visit `localhost:4000` and see the docs site running locally. Now checkout a new branch, make your changes, and submit a PR! +You should be able to visit `localhost:4200` and see the docs site running locally. Now checkout a new branch, make your changes, and submit a PR! ## Mirage development To help out with Mirage development, first pull down the project locally and verify that all tests on `master` are passing. -1. Fork `ember-cli-mirage`, then create a local clone of your fork: - - ``` - git clone git@github.com:[your-name]/ember-cli-mirage.git - cd ember-cli-mirage - ``` - -2. Ensure `node` is installed. I use version 4.2.x, the LTS release. - - Ensure `npm` is installed -3. Ensure `ember-cli` is installed: `npm install -g ember-cli` -4. Ensure `phantomjs` v2.x is installed. -5. Install dependencies and run the tests: - - ``` - npm i - ember test - ``` +``` +git clone git@github.com:[your-name]/ember-cli-mirage.git +cd ember-cli-mirage +yarn install # (or npm install) +ember test +``` If all tests pass, you should be all set. Checkout a new branch to start developing, then submit a PR when you're ready! From fc3ba8ba410d7d953050a5d2eb70d7db38ea4db1 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 22 May 2019 13:02:59 -0400 Subject: [PATCH 422/879] docs: Add assertions guide to testing (#1626) Closes #1625 --- .../advanced/environment-options/template.md | 22 ++++ tests/dummy/app/pods/docs/template.hbs | 7 +- .../template.md | 52 +-------- .../pods/docs/testing/assertions/template.md | 104 ++++++++++++++++++ .../template.md | 30 +---- tests/dummy/app/router.js | 5 +- tests/dummy/app/templates/contact.hbs | 13 --- tests/dummy/app/templates/contacts.hbs | 17 --- tests/dummy/app/templates/edit.hbs | 6 - tests/dummy/app/templates/pets.hbs | 11 -- 10 files changed, 135 insertions(+), 132 deletions(-) rename tests/dummy/app/pods/docs/testing/{acceptance-testing => acceptance-tests}/template.md (75%) create mode 100644 tests/dummy/app/pods/docs/testing/assertions/template.md rename tests/dummy/app/pods/docs/testing/{integration-and-unit-testing => integration-and-unit-tests}/template.md (89%) delete mode 100644 tests/dummy/app/templates/contact.hbs delete mode 100644 tests/dummy/app/templates/contacts.hbs delete mode 100644 tests/dummy/app/templates/edit.hbs delete mode 100644 tests/dummy/app/templates/pets.hbs diff --git a/tests/dummy/app/pods/docs/advanced/environment-options/template.md b/tests/dummy/app/pods/docs/advanced/environment-options/template.md index cff190997..440643dad 100644 --- a/tests/dummy/app/pods/docs/advanced/environment-options/template.md +++ b/tests/dummy/app/pods/docs/advanced/environment-options/template.md @@ -40,6 +40,28 @@ if (environment === 'development') { } ``` +## trackRequests + +Defaults to `false`. + +A boolean that controls whether [Pretender's `trackedRequests` feature](https://github.com/pretenderjs/pretender#tracking-requests) is enabled. By default it is disabled to avoid memory issues during long development sessions. + +To enable, set to `true`, for example in testing environments: + +```js +// config/environment.js +module.exports = function(environment) { + if (environment === 'test') { + ENV['ember-cli-mirage'] = { + trackRequests: true + }; + } +} +``` + +This feature is useful for asserting against HTTP requests and responses during tests. See the "Asserting against handled requests and responses" section of the {{docs-link 'Assertions guide' 'docs.testing.assertions'}} to learn more. + + ## excludeFilesFromBuild Defaults to `false`. diff --git a/tests/dummy/app/pods/docs/template.hbs b/tests/dummy/app/pods/docs/template.hbs index 77db9938a..6f937956e 100644 --- a/tests/dummy/app/pods/docs/template.hbs +++ b/tests/dummy/app/pods/docs/template.hbs @@ -7,7 +7,6 @@ {{nav.item "Upgrade guide" "docs.getting-started.upgrade-guide"}} {{nav.item "Overview" "docs.getting-started.overview"}} - {{nav.section "Route handlers"}} {{nav.item "Functions" "docs.route-handlers.functions"}} {{nav.item "Shorthands" "docs.route-handlers.shorthands"}} @@ -20,8 +19,9 @@ {{nav.item "Serializers" "docs.data-layer.serializers"}} {{nav.section "Testing"}} - {{nav.item "Acceptance testing" "docs.testing.acceptance-testing"}} - {{nav.item "Integration and unit testing" "docs.testing.integration-and-unit-testing"}} + {{nav.item "Acceptance tests" "docs.testing.acceptance-tests"}} + {{nav.item "Integration and unit tests" "docs.testing.integration-and-unit-tests"}} + {{nav.item "Assertions" "docs.testing.assertions"}} {{nav.section "Advanced"}} {{nav.item "Environment options" "docs.advanced.environment-options"}} @@ -29,7 +29,6 @@ {{nav.item "Mocking GUIDs" "docs.advanced.mocking-guids"}} {{nav.item "Customizing the inflector" "docs.advanced.customizing-the-inflector"}} - {{/viewer.nav}} {{#viewer.main}} diff --git a/tests/dummy/app/pods/docs/testing/acceptance-testing/template.md b/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md similarity index 75% rename from tests/dummy/app/pods/docs/testing/acceptance-testing/template.md rename to tests/dummy/app/pods/docs/testing/acceptance-tests/template.md index 16c72cf80..b51e8b043 100644 --- a/tests/dummy/app/pods/docs/testing/acceptance-testing/template.md +++ b/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md @@ -1,4 +1,4 @@ -# Acceptance testing +# Acceptance tests Acceptance testing your Ember app involves verifying some user behavior. For example, you may want to test that the user can view a list of movies on your app's homepage. @@ -108,56 +108,6 @@ test('I can view the movies', async function(assert) { There are of course times where it makes sense to break this rule (for example to add some extra assertions near the beginning or middle of a test), but in general you should strive to follow the pattern. -## Asserting a server call was made in a test - -Often you'll write tests against your application's UI, which will verify that the proper data from Mirage was returned. However, because Mirage gives you a full client-side server, you can gain more confidence from your tests by asserting against Mirage's server state, in addition to testing your Ember app's UI. - -There are two general approaches to this. First, you can assert directly against Mirage's database: - -```js -test("I can change the lesson's title", async function(assert) { - this.server.create('lesson', { title: 'My First Lesson' }) - - await visit('/'); - await click('.Edit') - await fillIn('input', 'Updated lesson'); - await click('.Save'); - - // Assert against our app's UI - assert.dom('h1').hasText('Updated lesson'); - - // Also check that the data was "persisted" to our backend - assert.equal(this.server.db.lessons[0].title, 'Updated lesson'); -}); -``` - -This gives you some extra confidence that your Ember app is sending over the data you expect. - -The next strategy is to temporarily override the server route that's relevant to your test, and assert against the actual request that your Ember app sent: - -```js -test("I can change the lesson's title", async function(assert) { - assert.expect(1); - let done = assert.async(); - - this.server.create('lesson', {title: 'My First Lesson'}) - - this.server.put('/lessons/:id', (schema, request) => { - let params = JSON.parse(request.requestBody); - - // Here, we're asserting the params Mirage received are in the format you expect - assert.deepEqual(params, {...}); - done(); - }); - - await visit('/'); - await click('.Edit') - await fillIn('input', 'Updated lesson'); - await click('.Save'); -}); -``` - -Note that here, we're overwriting any route handler you may defined for PUT to `/lessons/:id` in your `config.js` file, but only for this test. After this test, your Mirage server will be reset, and all the routes from `config.js` will be reloaded. ## Testing errors diff --git a/tests/dummy/app/pods/docs/testing/assertions/template.md b/tests/dummy/app/pods/docs/testing/assertions/template.md new file mode 100644 index 000000000..74823ffb6 --- /dev/null +++ b/tests/dummy/app/pods/docs/testing/assertions/template.md @@ -0,0 +1,104 @@ +# Assertions + +Most of your tests will assert against your Ember app's UI. After visiting a route and interacting with the app, and after Mirage handles any requests, you'll assert that your UI is in the state you expect it to be. + +But sometimes even if your UI looks consistent, your app may have a bug on account of sending the wrong data to your server. + +To address this class of issues, you can assert against the state of your Mirage server within your tests, right alongside your UI assertions. This will give you more confidence that your Ember app is sending over the correct data to your backend. + + +## Asserting against Mirage's database + +The simplest way to assert that your Ember app is sending over the correct data to your backend is to assert against Mirage's database. If the correct data makes it there, you'll have confidence not only that the JSON payloads from your Ember app are correct, but that your Mirage route handlers are behaving as you expect. + +Here's an example: + +```js +test("I can change the lesson's title", async function(assert) { + this.server.create('lesson', { title: 'My First Lesson' }) + + await visit('/'); + await click('.Edit') + await fillIn('input', 'Updated lesson'); + await click('.Save'); + + // Assert against our app's UI + assert.dom('h1').hasText('Updated lesson'); + + // Also check that the data was "persisted" to our backend + assert.equal(this.server.db.lessons[0].title, 'Updated lesson'); +}); +``` + +This is a great way to gain some extra confidence that your Ember app is sending over the data you expect. + + +## Asserting against Mirage Models + +It can also be useful to assert against Mirage's ORM models, to verify things like updates to your model's relationships: + +```js +test('I can add a tag to a post', async function(assert) { + let programming = this.server.create('tag', { name: 'Programming' }); + let post = this.server.create('post'); + + await visit(`/posts/${post.id}/edit`); + await select('.tags', 'Programming'); + await click('.save'); + + assert.dom().includesText('Saved!'); + assert.equal(post.reload().tagIds.includes(programming.id)); +}); +``` + +The `reload` method on Mirage models will rehydrate them with any new database data since they were instantiated, allowing you to verify that your route handler logic worked as expected. + +Asserting against models is basically another way to verify Mirage's database data is correct. + + +## Asserting against handled requests and responses + +You can also assert against the actual HTTP requests and responses that are made during your test. + +To do this, first enable [Pretender's `trackedRequests` feature](https://github.com/pretenderjs/pretender#tracking-requests) by enabling the `trackRequests` environment option: + +```js +// config/environment.js +module.exports = function(environment) { + if (environment === 'test') { + ENV['ember-cli-mirage'] = { + trackRequests: true + }; + } +} +``` + +This feature is disabled by default to avoid memory issues during long development sessions. + +Now Mirage will track every request (along with the associated response) and make them available to you via `server.pretender.handledRequests`. That way you can assert against requests in that array at the end of your test. + +```js +test("I can filter the table", async function(assert) { + this.server.createList('movie', 5, { genre: 'Sci-Fi' }); + this.server.createList('movie', 3, { genre: 'Drama' }); + + await visit('/'); + await select('.genre', 'Sci-Fi'); + + // Assert against our app's UI + assert.dom('tr').exists({ count: 5 }); + + // Also assert against the HTTP request count & query + let requests = server.pretender.handledRequests; + assert.equal(requests.length, 1); + assert.deepEqual(requests[0].queryParams, { 'filter[genre]': 'Sci-Fi' }); +}); +``` + +In general we recommend asserting against Mirage's database and your UI, as the specifics of your app's HTTP requests should be considered implementation details of the behavior you're actually interested in verifying. But there's certainly valid reasons to drop down and assert against HTTP data. + + + +--- + +And with that, you've completed the main portion of the guides! Read on to see some advanced use cases and configuration options, or head over to the API docs to see how to use Mirage's various classes. diff --git a/tests/dummy/app/pods/docs/testing/integration-and-unit-testing/template.md b/tests/dummy/app/pods/docs/testing/integration-and-unit-tests/template.md similarity index 89% rename from tests/dummy/app/pods/docs/testing/integration-and-unit-testing/template.md rename to tests/dummy/app/pods/docs/testing/integration-and-unit-tests/template.md index 0a7723fcc..9e4b90cc0 100644 --- a/tests/dummy/app/pods/docs/testing/integration-and-unit-testing/template.md +++ b/tests/dummy/app/pods/docs/testing/integration-and-unit-tests/template.md @@ -1,4 +1,4 @@ -# Integration and unit testing +# Integration and unit tests While Mirage was originally designed for acceptance testing, it also works great when writing integration and unit tests. @@ -248,34 +248,8 @@ module('Integration | Component | ArticleForm', function(hooks) { Something like `pushMirageIntoStore` will probably make its way into Mirage at some point. -### Asserting against Mirage - -As far as your assertions, you can assert against the UI, as well as against Mirage's database state if you expect changes to be made on the server. - -```js -test('it can edit an article', async function(assert) { - let serverArticle = this.server.create('article', { - title: 'Old title' - }); - pushMirageIntoStore(); - let store = this.owner.lookup('service:store'); - let article = store.peekRecord('article', serverArticle.id); - this.set('article', article); - - await render(hbs` - - `); - - await fillIn('input', 'New title'); - await click('.save'); - - assert.equal(this.element.textContent.trim(), 'Saved!'); - assert.equal(serverArticle.reload().title, 'New title'); -}); -``` - --- Now that you've seen how to use `setupMirage` outside of an acceptance test, you can use it in any kind of test where it makes sense to run your Mirage server! -And with that, you've completed the main portion of the guides! Read on to see some advanced use cases and configuration options, or head over to the API docs to see how to use Mirage's various classes. +Next, we discuss some ways you can go about asserting against your Mirage mock server. diff --git a/tests/dummy/app/router.js b/tests/dummy/app/router.js index 0b81780cd..ffe3c5623 100644 --- a/tests/dummy/app/router.js +++ b/tests/dummy/app/router.js @@ -29,8 +29,9 @@ Router.map(function() { }); this.route('testing', function() { - this.route('acceptance-testing'); - this.route('integration-and-unit-testing'); + this.route('acceptance-tests'); + this.route('integration-and-unit-tests'); + this.route('assertions'); }); this.route('advanced', function() { diff --git a/tests/dummy/app/templates/contact.hbs b/tests/dummy/app/templates/contact.hbs deleted file mode 100644 index 77fce53f9..000000000 --- a/tests/dummy/app/templates/contact.hbs +++ /dev/null @@ -1,13 +0,0 @@ -{{link-to "Back home" "contacts"}} - -

    The contact is {{model.name}}

    - -
    - {{#link-to "edit" model}} - - {{/link-to}} -
    - -
    - -
    diff --git a/tests/dummy/app/templates/contacts.hbs b/tests/dummy/app/templates/contacts.hbs deleted file mode 100644 index 5508a93df..000000000 --- a/tests/dummy/app/templates/contacts.hbs +++ /dev/null @@ -1,17 +0,0 @@ -{{#if error}} -

    There was an error: {{error}}

    -{{else}} - {{#each model as |contact|}} -

    {{link-to contact.name "contact" contact}}

    - {{/each}} -{{/if}} - -
    - -
    -
    {{input value=newName placeholder="Name"}}
    - -
    - -
    -
    diff --git a/tests/dummy/app/templates/edit.hbs b/tests/dummy/app/templates/edit.hbs deleted file mode 100644 index 1e04b9b57..000000000 --- a/tests/dummy/app/templates/edit.hbs +++ /dev/null @@ -1,6 +0,0 @@ -
    - {{input value=model.name}} -
    - -{{link-to "Cancel" "contact" model}} - diff --git a/tests/dummy/app/templates/pets.hbs b/tests/dummy/app/templates/pets.hbs deleted file mode 100644 index e5c2c4991..000000000 --- a/tests/dummy/app/templates/pets.hbs +++ /dev/null @@ -1,11 +0,0 @@ -{{#if error}} -

    There was an error: {{error}}

    -{{else}} -
      - {{#each model as |pet|}} -
    • {{pet.name}} / alive: {{pet.alive}}
    • - {{/each}} - {{input value=petName}} - -
    -{{/if}} From b68c9d1f1e9ebefc60530bac2a4e0fe4a60294a7 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 22 May 2019 13:10:31 -0400 Subject: [PATCH 423/879] Roll in upgrade guide docs --- .../getting-started/upgrade-guide/template.md | 84 ++++++++++++++++++- 1 file changed, 81 insertions(+), 3 deletions(-) diff --git a/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md b/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md index 35d92c503..539fcf9db 100644 --- a/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md +++ b/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md @@ -16,11 +16,12 @@ yarn install -D ember-cli-mirage@X.X.X You can view all of Mirage's release notes on [our Releases page](https://github.com/samselikoff/ember-cli-mirage/releases). -## 0.4.x → 1.0 Upgrade guide -A few breaking changes were made in the 1.0 release. +## 1.0 Upgrade guide -**Faker.js** +There were a few breaking changes made in the 1.0 release. + +### 1. Remove Faker.js When Mirage was first released, including npm libraries into Ember CLI apps was difficult. You needed to generate a vendor shim and call `app.import` in order to use the library in your application code. @@ -98,6 +99,83 @@ For `faker.random.number.range`, use `faker.random.number` with min and max opti After that, you should be on your own with respect to Faker! Thanks to Auto Import, you can change versions, or even try out other libraries like [Chance.js](https://chancejs.com/), and rest easy knowing Mirage is a bit slimmer and one less thing is beyond your control. +### 2. New import for setupMirage + +Please use the new named import for the setupMirage test helper. The old one still works for now but is not robust to us refactoring the internal file location. The named export is also more aligned with the rest of the ecosystem. + +```js +// Before +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; + +// After +import { setupMirage } from 'ember-cli-mirage/test-support'; +``` + +### 3. Remove deprecated forms of `create`, `createList` and `normalizedRequestAttrs` + +There are several places in Mirage's APIs that were intended to be used with singularized versions of model names, but just so happened to work if a non-singularized version was passed in. + +This behavior was discovered during a refactor, and the non-singularized versions were maintained to avoid breaking apps. Now that we're moving to 1.0, we're removing this deprecated/unintentional behavior. + +- `server.create` and `server.createList` were coded to take a singularized model name, e.g. `server.create('user')`. It just so happens that `server.create('users')` also works. That pluralized version is now removed from Mirage. + + If you're running the latest 0.x version you should see a deprecation message letting you know where to change it. Otherwise, it should be a pretty mechanic change from things like `server.create('users')` to `server.create('user')`. + + Note this also applies to `server.createList` – the correct form is `server.createList('user', 3)`, and the pluralized form `server.createList('users', 3)` is now unsupported. + +- `this.normalizedRequestAttrs` in a route handler optionally takes a modelName as an argument. This is if your URLs are non-standard and Mirage cannot guess the modelName from the URL path. + + In this case, you can call `this.normalizedRequestAttrs('blog-post')` to tell Mirage to expect the payload to be for a `blog-post` model. + + This API was intended to be used with dasherized names, because that's how compound model names are specified throughout Mirage when they are represented as strings. + + It just so happened that `this.normalizedRequestAttrs('blogPost')` also worked, by chance, until a refactor. So, that behavior was kept but now is being removed. + + The correct usage is `this.normalizedRequestAttrs('blog-post')`. Using the camelized version of the model name is no longer supported. + +If either of these changes cause a ton of refactoring pain, we can try to marshal some resources to help write a codemod. Please open an issue if that's the case! + +### 4. The `normalizeIds` serializer property now defaults to true + +This applies to the ActiveModelSerializer and RestSerializer. + +The `normalize` property on serializers helps Mirage's shorthands work by transforming differently formatted payloads into JSON:API documents. These documents are then used by Mirage to update the database accordingly. + +There was a gap in the default `normalize` method for a long time, in that it didn't take REST payloads that included foreign keys and looked like + +```js +let payload = { + contact: { + id: 1, + name: 'Link', + address: 1 + } +}; +``` + +and turn that `address` key into a proper JSON:API relationship: + +```js +data: { + type: 'contacts', + id: 1, + attributes: { + name: 'Link' + }, + relationships: { + address: { + data: { + type: 'address', + id: 1 + } + } + } +} +``` + +We added this feature a while ago, and it's controlled with the `normalizeIds` property on the ActiveModelSerializer and RESTSerializer. (We did this so the feature wouldn't be a breaking change.) + +We're now making `true` the default, which should be the behavior everyone desires (assuming they're using shorthands). This is technically a breaking change, though it's unlikely to affect most people. ## 0.3.x → 0.4 Upgrade guide From cf90e92842ea5cff23f2a71093af7e3cee89f75f Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 22 May 2019 14:10:50 -0400 Subject: [PATCH 424/879] v1.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2092b82fc..6b57eefbb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "1.0.0-beta.3", + "version": "1.0.0", "description": "A client-side server to help you build, test and demo your Ember app", "keywords": [ "ember-addon", From 20ddcabe95533972f9ee5212844625c08aaf2986 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 23 May 2019 10:48:03 +0000 Subject: [PATCH 425/879] build(deps-dev): bump ember-cli-dependency-checker from 3.1.0 to 3.2.0 Bumps [ember-cli-dependency-checker](https://github.com/quaertym/ember-cli-dependency-checker) from 3.1.0 to 3.2.0. - [Release notes](https://github.com/quaertym/ember-cli-dependency-checker/releases) - [Commits](https://github.com/quaertym/ember-cli-dependency-checker/compare/v3.1.0...v3.2.0) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 8f6a9e76d..d0ea988b8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5173,9 +5173,9 @@ ember-cli-clipboard@^0.8.1: fastboot-transform "0.1.1" ember-cli-dependency-checker@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-3.1.0.tgz#b39c6b537a1457d77892edf5ddcfa025cd1401e2" - integrity sha512-Y/V2senOyIjQnZohYeZeXs59rWHI2m8KRF9IesMv1ypLRSc/h/QS6UX51wAyaZnxcgU6ljFXpqL5x38UxM3XzA== + version "3.2.0" + resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-3.2.0.tgz#9202ad9e14d6fda33cffc22a11c343c2a8885330" + integrity sha512-dkSmcJ/jY/2ms/S6ph2jXSfOW5VfOpLfg5DFEbra0SaMNgYkNDFF1o0U4OdTsG37L5h/AXWNuVtnOa4TMabz9Q== dependencies: chalk "^2.3.0" find-yarn-workspace-root "^1.1.0" From 3bd464c30e7c04efb18118c33226b9e7e1479b57 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 23 May 2019 10:48:36 +0000 Subject: [PATCH 426/879] build(deps-dev): bump ember-cli-addon-docs from 0.6.11 to 0.6.12 Bumps [ember-cli-addon-docs](https://github.com/ember-learn/ember-cli-addon-docs) from 0.6.11 to 0.6.12. - [Release notes](https://github.com/ember-learn/ember-cli-addon-docs/releases) - [Changelog](https://github.com/ember-learn/ember-cli-addon-docs/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-learn/ember-cli-addon-docs/compare/v0.6.11...v0.6.12) Signed-off-by: dependabot[bot] --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index 8f6a9e76d..08ae21f92 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4983,9 +4983,9 @@ ember-cli-addon-docs-esdoc@^0.2.1: walk-sync "^0.3.2" ember-cli-addon-docs@^0.6.4: - version "0.6.11" - resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.11.tgz#a4b3c800aeb7ab83ea768e71845db7221b890a85" - integrity sha512-yu46/ExuZd2+DI6c9XVc7cNHKYKgAlpBtQnNNKdR5vdNofQmIUOyxy7GV7t/P/rT5p62nx5LxWVY8XYd8QXH0w== + version "0.6.12" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.12.tgz#5dcd5c2fd527720e90a43f6aa241c59e2e69568e" + integrity sha512-uBGW7b3BvvTrVyZSdHSysFQj8ONjKnN7GL09OpH2DBcpNVv9Pi8NT8M7hb/BdXzPe5tirqMtpjCKHZaRIt6DVA== dependencies: "@glimmer/syntax" "^0.36.4" broccoli-bridge "^1.0.0" @@ -5018,7 +5018,7 @@ ember-cli-addon-docs@^0.6.4: ember-href-to "^1.15.1" ember-keyboard "^4.0.0" ember-modal-dialog "3.0.0-beta.3" - ember-responsive "^3.0.0" + ember-responsive "^3.0.1" ember-router-generator "^1.2.3" ember-router-scroll "^1.0.0" ember-svg-jar "^1.2.2" @@ -5944,10 +5944,10 @@ ember-resolver@^5.0.1: ember-cli-version-checker "^3.0.0" resolve "^1.10.0" -ember-responsive@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ember-responsive/-/ember-responsive-3.0.0.tgz#03791da324299a8c8cb461e541a5e1aeca887881" - integrity sha512-5JQ+REBu37M7NNDJOnTjzp5eQzg4cX7VtPcD19V3nBcntRuDwf7N6TndLxmw4Kt3JXuzQL4PkDE2SgVKuNTdWQ== +ember-responsive@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ember-responsive/-/ember-responsive-3.0.1.tgz#52eac29ff9ab57e4912f65354056aee1f132c63c" + integrity sha512-diHQ09KL1SNM0jOwW6iGailh0MhcbdBP5JIQc/jiIijYm/pNe0LRGnnYvM3FK5RQ6XeDg87rLx0shLyCy0HpTg== dependencies: ember-cli-babel "^6.6.0" From 6cdfc6f7b703de79cc4caef85a12919739bd0a46 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 23 May 2019 10:49:10 +0000 Subject: [PATCH 427/879] build(deps-dev): bump eslint-plugin-node from 9.0.1 to 9.1.0 Bumps [eslint-plugin-node](https://github.com/mysticatea/eslint-plugin-node) from 9.0.1 to 9.1.0. - [Release notes](https://github.com/mysticatea/eslint-plugin-node/releases) - [Commits](https://github.com/mysticatea/eslint-plugin-node/compare/v9.0.1...v9.1.0) Signed-off-by: dependabot[bot] --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index 8f6a9e76d..db13e39f2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6328,16 +6328,16 @@ eslint-plugin-es@^1.4.0: regexpp "^2.0.1" eslint-plugin-node@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-9.0.1.tgz#93e44626fa62bcb6efea528cee9687663dc03b62" - integrity sha512-fljT5Uyy3lkJzuqhxrYanLSsvaILs9I7CmQ31atTtZ0DoIzRbbvInBh4cQ1CrthFHInHYBQxfPmPt6KLHXNXdw== + version "9.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-9.1.0.tgz#f2fd88509a31ec69db6e9606d76dabc5adc1b91a" + integrity sha512-ZwQYGm6EoV2cfLpE1wxJWsfnKUIXfM/KM09/TlorkukgCAwmkgajEJnPCmyzoFPQQkmvo5DrW/nyKutNIw36Mw== dependencies: eslint-plugin-es "^1.4.0" eslint-utils "^1.3.1" ignore "^5.1.1" minimatch "^3.0.4" resolve "^1.10.1" - semver "^6.0.0" + semver "^6.1.0" eslint-scope@3.7.1, eslint-scope@^3.7.1: version "3.7.1" @@ -12441,10 +12441,10 @@ semver@^4.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= -semver@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.0.0.tgz#05e359ee571e5ad7ed641a6eec1e547ba52dea65" - integrity sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ== +semver@^6.0.0, semver@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.0.tgz#e95dc415d45ecf03f2f9f83b264a6b11f49c0cca" + integrity sha512-kCqEOOHoBcFs/2Ccuk4Xarm/KiWRSLEX9CAZF8xkJ6ZPlIoTZ8V5f7J16vYLJqDbR7KrxTJpR2lqjIEm2Qx9cQ== send@0.16.1: version "0.16.1" From 19f66b559dacbd4355741fd85f39944a002a6d2e Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Thu, 23 May 2019 14:21:49 +0100 Subject: [PATCH 428/879] Try to get RestSerializer import working - not successful --- addon/index.js | 2 +- package.json | 1 + .../01-basic-app/tests/acceptance/ember-data-test.js | 4 ++-- tests/integration/route-handlers/get-shorthand-test.js | 2 +- tests/integration/serializers/rest-serializer-test.js | 3 ++- tests/integration/server-config-test.js | 2 +- .../server/shorthands/rest-serializer-sanity-test.js | 3 ++- tests/unit/serializers/rest-serializer-test.js | 2 +- 8 files changed, 11 insertions(+), 8 deletions(-) diff --git a/addon/index.js b/addon/index.js index e0e7ac440..405d3dd58 100644 --- a/addon/index.js +++ b/addon/index.js @@ -7,10 +7,10 @@ import Collection from './orm/collection'; import Serializer from './serializer'; import ActiveModelSerializer from './serializers/active-model-serializer'; import JSONAPISerializer from './serializers/json-api-serializer'; -import RestSerializer from './serializers/rest-serializer'; import HasMany from './orm/associations/has-many'; import BelongsTo from './orm/associations/belongs-to'; import IdentityManager from './identity-manager'; +import { RestSerializer } from '@miragejs/server'; /** @hide diff --git a/package.json b/package.json index 2092b82fc..97da42ed3 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "prepare": "./scripts/link.sh" }, "dependencies": { + "@miragejs/server": "^2.0.0-beta.4", "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^2.0.1", "broccoli-merge-trees": "^3.0.2", diff --git a/test-projects/01-basic-app/tests/acceptance/ember-data-test.js b/test-projects/01-basic-app/tests/acceptance/ember-data-test.js index c70fb0482..c29cf7f8d 100644 --- a/test-projects/01-basic-app/tests/acceptance/ember-data-test.js +++ b/test-projects/01-basic-app/tests/acceptance/ember-data-test.js @@ -1,6 +1,6 @@ import { module, test } from 'qunit'; -import Server from 'ember-cli-mirage/server'; -import { Model } from 'ember-cli-mirage'; +import Server from '@miragejs/server'; +import { Model } from '@miragejs/server'; import { modelFor } from 'ember-cli-mirage/ember-data'; const CustomTag = Model.extend(); diff --git a/tests/integration/route-handlers/get-shorthand-test.js b/tests/integration/route-handlers/get-shorthand-test.js index 29b3d1eb7..cb9bc7925 100644 --- a/tests/integration/route-handlers/get-shorthand-test.js +++ b/tests/integration/route-handlers/get-shorthand-test.js @@ -4,9 +4,9 @@ import { hasMany, belongsTo, JSONAPISerializer, - RestSerializer, Response } from 'ember-cli-mirage'; +import { RestSerializer } from '@miragejs/server'; import Collection from 'ember-cli-mirage/orm/collection'; import Server from 'ember-cli-mirage/server'; import GetShorthandRouteHandler from 'ember-cli-mirage/route-handlers/shorthands/get'; diff --git a/tests/integration/serializers/rest-serializer-test.js b/tests/integration/serializers/rest-serializer-test.js index 673c69a39..048eecfc4 100644 --- a/tests/integration/serializers/rest-serializer-test.js +++ b/tests/integration/serializers/rest-serializer-test.js @@ -1,6 +1,7 @@ import { module, test } from 'qunit'; import Server from 'ember-cli-mirage/server'; -import { Model, hasMany, belongsTo, RestSerializer } from 'ember-cli-mirage'; +import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; +import { RestSerializer } from '@miragejs/server'; module('Integration | Serializer | RestSerializer', function(hooks) { hooks.afterEach(function() { diff --git a/tests/integration/server-config-test.js b/tests/integration/server-config-test.js index 58ceb5b79..f23c11bc1 100644 --- a/tests/integration/server-config-test.js +++ b/tests/integration/server-config-test.js @@ -2,7 +2,7 @@ import { module, test } from 'qunit'; import { Model } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; import ActiveModelSerializer from 'ember-cli-mirage/serializers/active-model-serializer'; -import RestSerializer from 'ember-cli-mirage/serializers/rest-serializer'; +import { RestSerializer } from '@miragejs/server'; import $ from 'jquery'; module('Integration | Server Config', function(hooks) { diff --git a/tests/integration/server/shorthands/rest-serializer-sanity-test.js b/tests/integration/server/shorthands/rest-serializer-sanity-test.js index 7030010ca..4286f16e6 100644 --- a/tests/integration/server/shorthands/rest-serializer-sanity-test.js +++ b/tests/integration/server/shorthands/rest-serializer-sanity-test.js @@ -1,5 +1,6 @@ import { module, test } from 'qunit'; -import { Model, hasMany, belongsTo, RestSerializer } from 'ember-cli-mirage'; +import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; +import { RestSerializer } from '@miragejs/server'; import Server from 'ember-cli-mirage/server'; import promiseAjax from '../../../helpers/promise-ajax'; diff --git a/tests/unit/serializers/rest-serializer-test.js b/tests/unit/serializers/rest-serializer-test.js index c7294c44c..ec19b9293 100644 --- a/tests/unit/serializers/rest-serializer-test.js +++ b/tests/unit/serializers/rest-serializer-test.js @@ -1,4 +1,4 @@ -import RestSerializer from 'ember-cli-mirage/serializers/rest-serializer'; +import { RestSerializer } from '@miragejs/server'; import { module, test } from 'qunit'; import { Model } from 'ember-cli-mirage'; From 0538e7eab52f78136386e8d34ff1f5722f50f9ff Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Thu, 23 May 2019 15:43:11 +0100 Subject: [PATCH 429/879] Only try to import RestSerializer from @miragejs/server --- test-projects/01-basic-app/tests/acceptance/ember-data-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-projects/01-basic-app/tests/acceptance/ember-data-test.js b/test-projects/01-basic-app/tests/acceptance/ember-data-test.js index c29cf7f8d..2e9aafa29 100644 --- a/test-projects/01-basic-app/tests/acceptance/ember-data-test.js +++ b/test-projects/01-basic-app/tests/acceptance/ember-data-test.js @@ -1,5 +1,5 @@ import { module, test } from 'qunit'; -import Server from '@miragejs/server'; +import Server from 'ember-cli-mirage/server'; import { Model } from '@miragejs/server'; import { modelFor } from 'ember-cli-mirage/ember-data'; From 8f0c3afa13686614a3cfcb63ca2f4aaf2b02fcb7 Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Thu, 23 May 2019 16:27:55 +0100 Subject: [PATCH 430/879] Revert changes on tests to try to use RestSerializer Serializers are not as simple as they look like --- test-projects/01-basic-app/tests/acceptance/ember-data-test.js | 2 +- tests/integration/route-handlers/get-shorthand-test.js | 2 +- tests/integration/serializers/rest-serializer-test.js | 3 +-- tests/integration/server-config-test.js | 2 +- .../server/shorthands/rest-serializer-sanity-test.js | 3 +-- tests/unit/serializers/rest-serializer-test.js | 2 +- 6 files changed, 6 insertions(+), 8 deletions(-) diff --git a/test-projects/01-basic-app/tests/acceptance/ember-data-test.js b/test-projects/01-basic-app/tests/acceptance/ember-data-test.js index 2e9aafa29..c70fb0482 100644 --- a/test-projects/01-basic-app/tests/acceptance/ember-data-test.js +++ b/test-projects/01-basic-app/tests/acceptance/ember-data-test.js @@ -1,6 +1,6 @@ import { module, test } from 'qunit'; import Server from 'ember-cli-mirage/server'; -import { Model } from '@miragejs/server'; +import { Model } from 'ember-cli-mirage'; import { modelFor } from 'ember-cli-mirage/ember-data'; const CustomTag = Model.extend(); diff --git a/tests/integration/route-handlers/get-shorthand-test.js b/tests/integration/route-handlers/get-shorthand-test.js index cb9bc7925..29b3d1eb7 100644 --- a/tests/integration/route-handlers/get-shorthand-test.js +++ b/tests/integration/route-handlers/get-shorthand-test.js @@ -4,9 +4,9 @@ import { hasMany, belongsTo, JSONAPISerializer, + RestSerializer, Response } from 'ember-cli-mirage'; -import { RestSerializer } from '@miragejs/server'; import Collection from 'ember-cli-mirage/orm/collection'; import Server from 'ember-cli-mirage/server'; import GetShorthandRouteHandler from 'ember-cli-mirage/route-handlers/shorthands/get'; diff --git a/tests/integration/serializers/rest-serializer-test.js b/tests/integration/serializers/rest-serializer-test.js index 048eecfc4..673c69a39 100644 --- a/tests/integration/serializers/rest-serializer-test.js +++ b/tests/integration/serializers/rest-serializer-test.js @@ -1,7 +1,6 @@ import { module, test } from 'qunit'; import Server from 'ember-cli-mirage/server'; -import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; -import { RestSerializer } from '@miragejs/server'; +import { Model, hasMany, belongsTo, RestSerializer } from 'ember-cli-mirage'; module('Integration | Serializer | RestSerializer', function(hooks) { hooks.afterEach(function() { diff --git a/tests/integration/server-config-test.js b/tests/integration/server-config-test.js index f23c11bc1..58ceb5b79 100644 --- a/tests/integration/server-config-test.js +++ b/tests/integration/server-config-test.js @@ -2,7 +2,7 @@ import { module, test } from 'qunit'; import { Model } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; import ActiveModelSerializer from 'ember-cli-mirage/serializers/active-model-serializer'; -import { RestSerializer } from '@miragejs/server'; +import RestSerializer from 'ember-cli-mirage/serializers/rest-serializer'; import $ from 'jquery'; module('Integration | Server Config', function(hooks) { diff --git a/tests/integration/server/shorthands/rest-serializer-sanity-test.js b/tests/integration/server/shorthands/rest-serializer-sanity-test.js index 4286f16e6..7030010ca 100644 --- a/tests/integration/server/shorthands/rest-serializer-sanity-test.js +++ b/tests/integration/server/shorthands/rest-serializer-sanity-test.js @@ -1,6 +1,5 @@ import { module, test } from 'qunit'; -import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; -import { RestSerializer } from '@miragejs/server'; +import { Model, hasMany, belongsTo, RestSerializer } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; import promiseAjax from '../../../helpers/promise-ajax'; diff --git a/tests/unit/serializers/rest-serializer-test.js b/tests/unit/serializers/rest-serializer-test.js index ec19b9293..c7294c44c 100644 --- a/tests/unit/serializers/rest-serializer-test.js +++ b/tests/unit/serializers/rest-serializer-test.js @@ -1,4 +1,4 @@ -import { RestSerializer } from '@miragejs/server'; +import RestSerializer from 'ember-cli-mirage/serializers/rest-serializer'; import { module, test } from 'qunit'; import { Model } from 'ember-cli-mirage'; From b69fa19b62c82153dec8232428e885e192351383 Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 23 May 2019 17:54:02 +0200 Subject: [PATCH 431/879] docs: link to new docs (#1627) --- README.md | 2 +- addon/orm/schema.js | 2 +- addon/route-handlers/base.js | 4 ++-- blueprints/ember-cli-mirage/files/__root__/config.js | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 64ed8af87..e7876d3cc 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ A client-side server to develop, test and prototype your Ember CLI app. -[View the docs here.](http://www.ember-cli-mirage.com/) +[View the docs here.](https://www.ember-cli-mirage.com/) ---- diff --git a/addon/orm/schema.js b/addon/orm/schema.js index c662e05bf..26a6dc6d7 100644 --- a/addon/orm/schema.js +++ b/addon/orm/schema.js @@ -108,7 +108,7 @@ export default class Schema { !_includes(fksAddedFromThisModel[fkHolder], fk), `Your '${type}' model definition has multiple possible inverse relationships of type '${fkHolder}'. - Please read the associations guide and specify explicit inverses: http://www.ember-cli-mirage.com/docs/v0.3.x/models/#associations` + Please read the associations guide and specify explicit inverses: https://www.ember-cli-mirage.com/docs/api/modules/ember-cli-mirage/orm/associations/association~Association` ); fksAddedFromThisModel[fkHolder].push(fk); diff --git a/addon/route-handlers/base.js b/addon/route-handlers/base.js index 9e77be384..10fa4d47e 100644 --- a/addon/route-handlers/base.js +++ b/addon/route-handlers/base.js @@ -51,7 +51,7 @@ export default class BaseRouteHandler { assert( json.data && (json.data.attributes || json.data.type || json.data.relationships), - `You're using a shorthand or #normalizedRequestAttrs, but your serializer's normalize function did not return a valid JSON:API document. http://www.ember-cli-mirage.com/docs/v0.3.x/serializers/#normalizejson` + `You're using a shorthand or #normalizedRequestAttrs, but your serializer's normalize function did not return a valid JSON:API document. https://www.ember-cli-mirage.com/docs/api/modules/ember-cli-mirage/serializer~Serializer#normalize` ); if (json.data.attributes) { @@ -70,7 +70,7 @@ export default class BaseRouteHandler { assert( association, - `You're passing the relationship '${relationshipName}' to the '${modelName}' model via a ${request.method} to '${request.url}', but you did not define the '${relationshipName}' association on the '${modelName}' model. http://www.ember-cli-mirage.com/docs/v0.4.x/models/#associations` + `You're passing the relationship '${relationshipName}' to the '${modelName}' model via a ${request.method} to '${request.url}', but you did not define the '${relationshipName}' association on the '${modelName}' model. https://www.ember-cli-mirage.com/docs/api/modules/ember-cli-mirage/orm/associations/association~Association` ); if (association.isPolymorphic) { diff --git a/blueprints/ember-cli-mirage/files/__root__/config.js b/blueprints/ember-cli-mirage/files/__root__/config.js index fba83ae2c..c2cd26a9d 100644 --- a/blueprints/ember-cli-mirage/files/__root__/config.js +++ b/blueprints/ember-cli-mirage/files/__root__/config.js @@ -21,6 +21,6 @@ export default function() { this.put('/posts/:id'); // or this.patch this.del('/posts/:id'); - http://www.ember-cli-mirage.com/docs/v0.4.x/shorthands/ + https://www.ember-cli-mirage.com/docs/route-handlers/shorthands */ } From 0ebf99c66526e5222e81bf693064e2562ca8bbfe Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Thu, 23 May 2019 17:32:00 +0100 Subject: [PATCH 432/879] Migrate Response and trair to @miragejs/server --- addon/index.js | 5 +- addon/response.js | 56 ------------------- addon/route-handler.js | 2 +- addon/route-handlers/shorthands/get.js | 2 +- addon/route-handlers/shorthands/head.js | 2 +- addon/trait.js | 12 ---- .../function-handler/basic-test.js | 3 +- .../server/custom-responses-test.js | 2 +- tests/unit/response-test.js | 2 +- yarn.lock | 48 +++++++++++++++- 10 files changed, 54 insertions(+), 80 deletions(-) delete mode 100644 addon/response.js delete mode 100644 addon/trait.js diff --git a/addon/index.js b/addon/index.js index 405d3dd58..f96c6fddd 100644 --- a/addon/index.js +++ b/addon/index.js @@ -1,16 +1,15 @@ import Factory from './factory'; -import trait from './trait'; import association from './association'; -import Response from './response'; import Model from './orm/model'; import Collection from './orm/collection'; import Serializer from './serializer'; import ActiveModelSerializer from './serializers/active-model-serializer'; import JSONAPISerializer from './serializers/json-api-serializer'; +import RestSerializer from './serializers/rest-serializer'; import HasMany from './orm/associations/has-many'; import BelongsTo from './orm/associations/belongs-to'; import IdentityManager from './identity-manager'; -import { RestSerializer } from '@miragejs/server'; +import { Response, trait } from '@miragejs/server'; /** @hide diff --git a/addon/response.js b/addon/response.js deleted file mode 100644 index 1cb5139ea..000000000 --- a/addon/response.js +++ /dev/null @@ -1,56 +0,0 @@ -import { warn } from '@ember/debug'; - -/** - You can use this class when you want more control over your route handlers response. - - Pass the `code`, `headers` and `data` into the constructor and return an instance from any route handler. - - ```js - import { Response } from 'ember-cli-mirage'; - - this.get('/users', () => { - return new Response(400, { some: 'header' }, { errors: [ 'name cannot be blank'] }); - }); - ``` -*/ -export default class Response { - - constructor(code, headers = {}, data) { - this.code = code; - this.headers = headers; - - // Default data for "undefined 204" responses to empty string (no content) - if (code === 204) { - if (data !== undefined && data !== '') { - warn( - `Mirage: One of your route handlers is returning a custom - 204 Response that has data, but this is a violation of the HTTP spec - and could lead to unexpected behavior. 204 responses should have no - content (an empty string) as their body. [warning id: - ember-cli-mirage.warn-response-204-non-empty-payload]`, - false, - { id: 'ember-cli-mirage.warn-response-204-non-empty-payload' } - ); - } else { - this.data = ''; - } - - // Default data for "empty untyped" responses to empty JSON object - } else if ((data === undefined || data === '') && !this.headers.hasOwnProperty('Content-Type')) { - this.data = {}; - - } else { - this.data = data; - } - - // Default "untyped" responses to application/json - if (code !== 204 && !this.headers.hasOwnProperty('Content-Type')) { - this.headers['Content-Type'] = 'application/json'; - } - } - - toRackResponse() { - return [ this.code, this.headers, this.data ]; - } - -} diff --git a/addon/route-handler.js b/addon/route-handler.js index c74489efa..26af5ca7b 100644 --- a/addon/route-handler.js +++ b/addon/route-handler.js @@ -1,6 +1,6 @@ import { Promise } from 'rsvp'; import { MirageError } from 'ember-cli-mirage/assert'; -import Response from './response'; +import { Response } from '@miragejs/server'; import FunctionHandler from './route-handlers/function'; import ObjectHandler from './route-handlers/object'; import GetShorthandHandler from './route-handlers/shorthands/get'; diff --git a/addon/route-handlers/shorthands/get.js b/addon/route-handlers/shorthands/get.js index bc264f7c9..b1f780525 100644 --- a/addon/route-handlers/shorthands/get.js +++ b/addon/route-handlers/shorthands/get.js @@ -1,6 +1,6 @@ import assert from 'ember-cli-mirage/assert'; import BaseShorthandRouteHandler from './base'; -import { Response } from 'ember-cli-mirage'; +import { Response } from '@miragejs/server'; import { singularize, camelize } from 'ember-cli-mirage/utils/inflector'; /** diff --git a/addon/route-handlers/shorthands/head.js b/addon/route-handlers/shorthands/head.js index b894f4933..05963299e 100644 --- a/addon/route-handlers/shorthands/head.js +++ b/addon/route-handlers/shorthands/head.js @@ -1,6 +1,6 @@ import assert from 'ember-cli-mirage/assert'; import BaseShorthandRouteHandler from './base'; -import { Response } from 'ember-cli-mirage'; +import { Response } from '@miragejs/server'; import { camelize } from 'ember-cli-mirage/utils/inflector'; /** diff --git a/addon/trait.js b/addon/trait.js deleted file mode 100644 index 415cd3c88..000000000 --- a/addon/trait.js +++ /dev/null @@ -1,12 +0,0 @@ -let trait = function(extension) { - let __isTrait__ = true; - return { - extension, - __isTrait__ - }; -}; - -/** - @hide -*/ -export default trait; diff --git a/tests/integration/route-handlers/function-handler/basic-test.js b/tests/integration/route-handlers/function-handler/basic-test.js index f11e4ff2d..59c14bfd6 100644 --- a/tests/integration/route-handlers/function-handler/basic-test.js +++ b/tests/integration/route-handlers/function-handler/basic-test.js @@ -1,6 +1,7 @@ import { module, test } from 'qunit'; import { Promise } from 'rsvp'; -import { Model, ActiveModelSerializer, Response } from 'ember-cli-mirage'; +import { Model, ActiveModelSerializer } from 'ember-cli-mirage'; +import { Response } from '@miragejs/server'; import Server from 'ember-cli-mirage/server'; import promiseAjax from '../../../helpers/promise-ajax'; diff --git a/tests/integration/server/custom-responses-test.js b/tests/integration/server/custom-responses-test.js index 7c1556d16..6ba2f204e 100644 --- a/tests/integration/server/custom-responses-test.js +++ b/tests/integration/server/custom-responses-test.js @@ -1,7 +1,7 @@ import { module, test } from 'qunit'; import Server from 'ember-cli-mirage/server'; import promiseAjax from '../../helpers/promise-ajax'; -import { Response } from 'ember-cli-mirage'; +import { Response } from '@miragejs/server'; module('Integration | Server | Custom responses', function(hooks) { hooks.beforeEach(function() { diff --git a/tests/unit/response-test.js b/tests/unit/response-test.js index 63fd4e277..0218d817b 100644 --- a/tests/unit/response-test.js +++ b/tests/unit/response-test.js @@ -1,4 +1,4 @@ -import Response from 'ember-cli-mirage/response'; +import { Response } from '@miragejs/server'; import { module, test } from 'qunit'; diff --git a/yarn.lock b/yarn.lock index 8f6a9e76d..27899b853 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1077,6 +1077,29 @@ dependencies: core-js "^2.5.7" +"@miragejs/server@^2.0.0-beta.4": + version "2.0.0-beta.4" + resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-2.0.0-beta.4.tgz#b4a13232737abfeffd219fab200f970ea2f82761" + integrity sha512-4MgGkFRemcZRXBUCJzqiIhgWOE+wJrK+RF50R1Oh0HFKNl21RGurn57tICtJilOHY1e2C2yvoQaNHoRUoVmqAQ== + dependencies: + "@xg-wang/whatwg-fetch" "^3.0.0" + broccoli-file-creator "^2.1.1" + broccoli-funnel "^2.0.1" + broccoli-merge-trees "^3.0.2" + broccoli-stew "^2.0.1" + broccoli-string-replace "^0.1.2" + chalk "^1.1.1" + ember-auto-import "^1.2.19" + ember-cli-babel "^6.16.0" + ember-cli-node-assets "^0.2.2" + ember-get-config "^0.2.2" + ember-inflector "^2.0.0 || ^3.0.0" + fake-xml-http-request "^2.0.0" + inflected "^2.0.4" + lodash "^4.17.11" + pretender "2.1.1" + route-recognizer "^0.3.4" + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -1315,6 +1338,11 @@ "@webassemblyjs/wast-parser" "1.7.11" "@xtuc/long" "4.2.1" +"@xg-wang/whatwg-fetch@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@xg-wang/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#f7b222c012a238e7d6e89ed3d72a1e0edb58453d" + integrity sha512-ULtqA6L75RLzTNW68IiOja0XYv4Ebc3OGMzfia1xxSEMpD0mk/pMvkQX0vbCFyQmKc5xGp80Ms2WiSlXLh8hbA== + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -3239,7 +3267,7 @@ broccoli-stew@^1.4.2, broccoli-stew@^1.5.0: symlink-or-copy "^1.2.0" walk-sync "^0.3.0" -broccoli-stew@^2.0.0: +broccoli-stew@^2.0.0, broccoli-stew@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-2.1.0.tgz#ba73add17fda3b9b01d8cfb343a8b613b7136a0a" integrity sha512-tgCkuTWYl4uf7k7ib2D79KFEj2hCgnTUNPMnrCoAha0/4bywcNccmaZVWtL9Ex37yX5h5eAbnM/ak2ULoMwSSw== @@ -3741,7 +3769,7 @@ chai@^4.1.0: pathval "^1.1.0" type-detect "^4.0.5" -chalk@^1.0.0, chalk@^1.1.3: +chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= @@ -8219,7 +8247,7 @@ indexof@0.0.1: resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= -inflected@^2.0.3: +inflected@^2.0.3, inflected@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inflected/-/inflected-2.0.4.tgz#323770961ccbe992a98ea930512e9a82d3d3ef77" integrity sha512-HQPzFLTTUvwfeUH6RAGjD8cHS069mBqXG5n4qaxX7sJXBhVQrsGgF+0ZJGkSuN6a8pcUWB/GXStta11kKi/WvA== @@ -11383,6 +11411,15 @@ preserve@^0.2.0: resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= +pretender@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pretender/-/pretender-2.1.1.tgz#5085f0a1272c31d5b57c488386f69e6ca207cb35" + integrity sha512-IkidsJzaroAanw3I43tKCFm2xCpurkQr9aPXv5/jpN+LfCwDaeI8rngVWtQZTx4qqbhc5zJspnLHJ4N/25KvDQ== + dependencies: + "@xg-wang/whatwg-fetch" "^3.0.0" + fake-xml-http-request "^2.0.0" + route-recognizer "^0.3.3" + pretender@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.0.1.tgz#817ac43faa3330aa17646968a115f232de10b2ca" @@ -12264,6 +12301,11 @@ route-recognizer@^0.3.3: resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.3.tgz#1d365e27fa6995e091675f7dc940a8c00353bd29" integrity sha1-HTZeJ/ppleCRZ199yUCowANTvSk= +route-recognizer@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.4.tgz#39ab1ffbce1c59e6d2bdca416f0932611e4f3ca3" + integrity sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g== + rsvp@^3.0.14, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.3.3, rsvp@^3.5.0: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" From a3671dcc45e9416b31cf93d25367bfd69e284082 Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Thu, 23 May 2019 17:40:33 +0100 Subject: [PATCH 433/879] Migrate Factory to @miragejs/server --- addon/index.js | 3 +-- .../files/__root__/factories/__name__.js | 2 +- test-projects/01-basic-app/mirage/factories/user.js | 2 +- .../app/pods/docs/data-layer/factories/template.md | 12 ++++++------ .../pods/docs/getting-started/overview/template.md | 2 +- .../docs/getting-started/upgrade-guide/template.md | 4 ++-- tests/integration/database-test.js | 4 ++-- tests/integration/factories/after-create-test.js | 3 ++- tests/integration/factories/helpers-test.js | 3 ++- tests/integration/index-named-imports-test.js | 2 +- tests/integration/server-with-orm-test.js | 3 ++- .../server/create-and-create-list-test.js | 3 ++- tests/performance/simple-factory-test.js | 3 ++- 13 files changed, 25 insertions(+), 21 deletions(-) diff --git a/addon/index.js b/addon/index.js index f96c6fddd..44fe2b14d 100644 --- a/addon/index.js +++ b/addon/index.js @@ -1,4 +1,3 @@ -import Factory from './factory'; import association from './association'; import Model from './orm/model'; import Collection from './orm/collection'; @@ -9,7 +8,7 @@ import RestSerializer from './serializers/rest-serializer'; import HasMany from './orm/associations/has-many'; import BelongsTo from './orm/associations/belongs-to'; import IdentityManager from './identity-manager'; -import { Response, trait } from '@miragejs/server'; +import { Factory, Response, trait } from '@miragejs/server'; /** @hide diff --git a/blueprints/mirage-factory/files/__root__/factories/__name__.js b/blueprints/mirage-factory/files/__root__/factories/__name__.js index 85018979d..77aafabac 100644 --- a/blueprints/mirage-factory/files/__root__/factories/__name__.js +++ b/blueprints/mirage-factory/files/__root__/factories/__name__.js @@ -1,4 +1,4 @@ -import { Factory } from 'ember-cli-mirage'; +import { Factory } from '@miragejs/server'; export default Factory.extend({ }); diff --git a/test-projects/01-basic-app/mirage/factories/user.js b/test-projects/01-basic-app/mirage/factories/user.js index 6a59ee9d2..cb9b4cb04 100644 --- a/test-projects/01-basic-app/mirage/factories/user.js +++ b/test-projects/01-basic-app/mirage/factories/user.js @@ -1,4 +1,4 @@ -import { Factory } from 'ember-cli-mirage'; +import { Factory } from '@miragejs/server'; import faker from 'faker'; export default Factory.extend({ diff --git a/tests/dummy/app/pods/docs/data-layer/factories/template.md b/tests/dummy/app/pods/docs/data-layer/factories/template.md index 5e91ef3f9..54a7a254e 100644 --- a/tests/dummy/app/pods/docs/data-layer/factories/template.md +++ b/tests/dummy/app/pods/docs/data-layer/factories/template.md @@ -94,7 +94,7 @@ which creates this file: ```js // mirage/factories/movie.js -import { Factory } from 'ember-cli-mirage'; +import { Factory } from '@miragejs/server'; export default Factory.extend({ }); @@ -104,7 +104,7 @@ Right now the Factory is empty. Let's define a property on it: ```js // mirage/factories/movie.js -import { Factory } from 'ember-cli-mirage'; +import { Factory } from '@miragejs/server'; export default Factory.extend({ @@ -127,7 +127,7 @@ We can also make this property a function. ```js // mirage/factories/movie.js -import { Factory } from 'ember-cli-mirage'; +import { Factory } from '@miragejs/server'; export default Factory.extend({ @@ -164,7 +164,7 @@ Let's add some more properties to our factory: ```js // mirage/factories/movie.js -import { Factory } from 'ember-cli-mirage'; +import { Factory } from '@miragejs/server'; import faker from 'faker'; export default Factory.extend({ @@ -232,7 +232,7 @@ Attributes can depend on other attributes via `this` from within a function. Thi ```js // mirage/factories/user.js -import { Factory } from 'ember-cli-mirage'; +import { Factory } from '@miragejs/server'; import faker from 'faker'; export default Factory.extend({ @@ -501,7 +501,7 @@ As we saw earlier, given a `Post` that `belongsTo` a `User`, we were able to use ```js // mirage/factories/post.js -import { Factory } from 'ember-cli-mirage'; +import { Factory } from '@miragejs/server'; export default Factory.extend({ diff --git a/tests/dummy/app/pods/docs/getting-started/overview/template.md b/tests/dummy/app/pods/docs/getting-started/overview/template.md index e3d0608b5..34b2c8429 100644 --- a/tests/dummy/app/pods/docs/getting-started/overview/template.md +++ b/tests/dummy/app/pods/docs/getting-started/overview/template.md @@ -95,7 +95,7 @@ We can then define some properties on our Factory. They can be simple types like ```js // mirage/factories/movie.js -import { Factory } from 'ember-cli-mirage'; +import { Factory } from '@miragejs/server'; export default Factory.extend({ diff --git a/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md b/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md index 35d92c503..0e3dab1c8 100644 --- a/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md +++ b/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md @@ -54,7 +54,7 @@ Here are the steps you'll need to take to fix this: ```diff - import { Factory, faker } from 'ember-cli-mirage'; - + import { Factory } from 'ember-cli-mirage'; + + import { Factory } from '@miragejs/server'; + import faker from 'faker'; ``` @@ -82,7 +82,7 @@ For `faker.list.cycle`, use the remainder (modulo) operator: - return faker.list.cycle([ 'United States of America', 'Canada', 'Mexico' ]); + let countries = [ 'United States of America', 'Canada', 'Mexico' ]; -+ ++ + return countries[i % countries.length]; } ``` diff --git a/tests/integration/database-test.js b/tests/integration/database-test.js index 3c947a280..d57be2658 100644 --- a/tests/integration/database-test.js +++ b/tests/integration/database-test.js @@ -1,6 +1,7 @@ import {module, test} from 'qunit'; import Server from 'ember-cli-mirage/server'; -import { Model, Factory } from 'ember-cli-mirage'; +import { Model } from 'ember-cli-mirage'; +import { Factory } from '@miragejs/server'; module('Integration | Database', function(hooks) { hooks.beforeEach(function() { @@ -37,4 +38,3 @@ module('Integration | Database', function(hooks) { assert.deepEqual(authors.map((a) => a.id), ['1', '2']); }); }); - diff --git a/tests/integration/factories/after-create-test.js b/tests/integration/factories/after-create-test.js index 3536974d8..3e372dbb8 100644 --- a/tests/integration/factories/after-create-test.js +++ b/tests/integration/factories/after-create-test.js @@ -1,5 +1,6 @@ import { module, test } from 'qunit'; -import { Model, Factory, belongsTo } from 'ember-cli-mirage'; +import { Model, belongsTo } from 'ember-cli-mirage'; +import { Factory } from '@miragejs/server'; import Server from 'ember-cli-mirage/server'; module('Integration | Server | Factories | afterCreate', function(hooks) { diff --git a/tests/integration/factories/helpers-test.js b/tests/integration/factories/helpers-test.js index d78e15031..758b5e91d 100644 --- a/tests/integration/factories/helpers-test.js +++ b/tests/integration/factories/helpers-test.js @@ -1,5 +1,6 @@ import { module, test } from 'qunit'; -import { Model, Factory, belongsTo, hasMany, trait, association } from 'ember-cli-mirage'; +import { Model, belongsTo, hasMany, trait, association } from 'ember-cli-mirage'; +import { Factory } from '@miragejs/server'; import Server from 'ember-cli-mirage/server'; module('Integration | Server | Factories | helpers', function(hooks) { diff --git a/tests/integration/index-named-imports-test.js b/tests/integration/index-named-imports-test.js index d02bfff37..202e3fe0c 100644 --- a/tests/integration/index-named-imports-test.js +++ b/tests/integration/index-named-imports-test.js @@ -1,6 +1,5 @@ import { test } from 'qunit'; import { - Factory, Response, Model, Serializer, @@ -10,6 +9,7 @@ import { belongsTo, IdentityManager } from 'ember-cli-mirage'; +import { Factory } from '@miragejs/server'; test('Factory is present in named exports from ember-cli-mirage', function(assert) { assert.ok(Factory); diff --git a/tests/integration/server-with-orm-test.js b/tests/integration/server-with-orm-test.js index 5d63690e4..de5a0db2b 100644 --- a/tests/integration/server-with-orm-test.js +++ b/tests/integration/server-with-orm-test.js @@ -1,5 +1,6 @@ import {module, test} from 'qunit'; -import { Model, Factory } from 'ember-cli-mirage'; +import { Model } from 'ember-cli-mirage'; +import { Factory } from '@miragejs/server'; import Server from 'ember-cli-mirage/server'; module('Integration | Server with ORM', function(hooks) { diff --git a/tests/integration/server/create-and-create-list-test.js b/tests/integration/server/create-and-create-list-test.js index 38327f311..51bee08ba 100644 --- a/tests/integration/server/create-and-create-list-test.js +++ b/tests/integration/server/create-and-create-list-test.js @@ -1,5 +1,6 @@ import { module, test } from 'qunit'; -import { Model, Factory, hasMany, belongsTo } from 'ember-cli-mirage'; +import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; +import { Factory } from '@miragejs/server'; import Inflector from 'ember-inflector'; import Server from 'ember-cli-mirage/server'; // import escape from 'escape-string-regexp'; diff --git a/tests/performance/simple-factory-test.js b/tests/performance/simple-factory-test.js index 3fdb6182a..53d240f25 100644 --- a/tests/performance/simple-factory-test.js +++ b/tests/performance/simple-factory-test.js @@ -1,5 +1,6 @@ import { module } from 'qunit'; -import { Model, Factory } from 'ember-cli-mirage'; +import { Model } from 'ember-cli-mirage'; +import { Factory } from '@miragejs/server'; import Server from 'ember-cli-mirage/server'; import { perfTest } from './utils'; From 0e96e1f3081bade524db9b13be1b03602ecc9296 Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Thu, 23 May 2019 17:57:06 +0100 Subject: [PATCH 434/879] Revert "Migrate Response and trair to @miragejs/server" This reverts commit 0ebf99c66526e5222e81bf693064e2562ca8bbfe. --- addon/index.js | 6 +- addon/response.js | 56 +++++++++++++++++++ addon/route-handler.js | 2 +- addon/route-handlers/shorthands/get.js | 2 +- addon/route-handlers/shorthands/head.js | 2 +- addon/trait.js | 12 ++++ .../function-handler/basic-test.js | 3 +- .../server/custom-responses-test.js | 2 +- tests/unit/response-test.js | 2 +- yarn.lock | 48 +--------------- 10 files changed, 81 insertions(+), 54 deletions(-) create mode 100644 addon/response.js create mode 100644 addon/trait.js diff --git a/addon/index.js b/addon/index.js index 44fe2b14d..b53c79c50 100644 --- a/addon/index.js +++ b/addon/index.js @@ -1,14 +1,16 @@ +======= +import Factory from './factory'; +import trait from './trait'; import association from './association'; +import Response from './response'; import Model from './orm/model'; import Collection from './orm/collection'; import Serializer from './serializer'; import ActiveModelSerializer from './serializers/active-model-serializer'; import JSONAPISerializer from './serializers/json-api-serializer'; -import RestSerializer from './serializers/rest-serializer'; import HasMany from './orm/associations/has-many'; import BelongsTo from './orm/associations/belongs-to'; import IdentityManager from './identity-manager'; -import { Factory, Response, trait } from '@miragejs/server'; /** @hide diff --git a/addon/response.js b/addon/response.js new file mode 100644 index 000000000..1cb5139ea --- /dev/null +++ b/addon/response.js @@ -0,0 +1,56 @@ +import { warn } from '@ember/debug'; + +/** + You can use this class when you want more control over your route handlers response. + + Pass the `code`, `headers` and `data` into the constructor and return an instance from any route handler. + + ```js + import { Response } from 'ember-cli-mirage'; + + this.get('/users', () => { + return new Response(400, { some: 'header' }, { errors: [ 'name cannot be blank'] }); + }); + ``` +*/ +export default class Response { + + constructor(code, headers = {}, data) { + this.code = code; + this.headers = headers; + + // Default data for "undefined 204" responses to empty string (no content) + if (code === 204) { + if (data !== undefined && data !== '') { + warn( + `Mirage: One of your route handlers is returning a custom + 204 Response that has data, but this is a violation of the HTTP spec + and could lead to unexpected behavior. 204 responses should have no + content (an empty string) as their body. [warning id: + ember-cli-mirage.warn-response-204-non-empty-payload]`, + false, + { id: 'ember-cli-mirage.warn-response-204-non-empty-payload' } + ); + } else { + this.data = ''; + } + + // Default data for "empty untyped" responses to empty JSON object + } else if ((data === undefined || data === '') && !this.headers.hasOwnProperty('Content-Type')) { + this.data = {}; + + } else { + this.data = data; + } + + // Default "untyped" responses to application/json + if (code !== 204 && !this.headers.hasOwnProperty('Content-Type')) { + this.headers['Content-Type'] = 'application/json'; + } + } + + toRackResponse() { + return [ this.code, this.headers, this.data ]; + } + +} diff --git a/addon/route-handler.js b/addon/route-handler.js index 26af5ca7b..c74489efa 100644 --- a/addon/route-handler.js +++ b/addon/route-handler.js @@ -1,6 +1,6 @@ import { Promise } from 'rsvp'; import { MirageError } from 'ember-cli-mirage/assert'; -import { Response } from '@miragejs/server'; +import Response from './response'; import FunctionHandler from './route-handlers/function'; import ObjectHandler from './route-handlers/object'; import GetShorthandHandler from './route-handlers/shorthands/get'; diff --git a/addon/route-handlers/shorthands/get.js b/addon/route-handlers/shorthands/get.js index b1f780525..bc264f7c9 100644 --- a/addon/route-handlers/shorthands/get.js +++ b/addon/route-handlers/shorthands/get.js @@ -1,6 +1,6 @@ import assert from 'ember-cli-mirage/assert'; import BaseShorthandRouteHandler from './base'; -import { Response } from '@miragejs/server'; +import { Response } from 'ember-cli-mirage'; import { singularize, camelize } from 'ember-cli-mirage/utils/inflector'; /** diff --git a/addon/route-handlers/shorthands/head.js b/addon/route-handlers/shorthands/head.js index 05963299e..b894f4933 100644 --- a/addon/route-handlers/shorthands/head.js +++ b/addon/route-handlers/shorthands/head.js @@ -1,6 +1,6 @@ import assert from 'ember-cli-mirage/assert'; import BaseShorthandRouteHandler from './base'; -import { Response } from '@miragejs/server'; +import { Response } from 'ember-cli-mirage'; import { camelize } from 'ember-cli-mirage/utils/inflector'; /** diff --git a/addon/trait.js b/addon/trait.js new file mode 100644 index 000000000..415cd3c88 --- /dev/null +++ b/addon/trait.js @@ -0,0 +1,12 @@ +let trait = function(extension) { + let __isTrait__ = true; + return { + extension, + __isTrait__ + }; +}; + +/** + @hide +*/ +export default trait; diff --git a/tests/integration/route-handlers/function-handler/basic-test.js b/tests/integration/route-handlers/function-handler/basic-test.js index 59c14bfd6..f11e4ff2d 100644 --- a/tests/integration/route-handlers/function-handler/basic-test.js +++ b/tests/integration/route-handlers/function-handler/basic-test.js @@ -1,7 +1,6 @@ import { module, test } from 'qunit'; import { Promise } from 'rsvp'; -import { Model, ActiveModelSerializer } from 'ember-cli-mirage'; -import { Response } from '@miragejs/server'; +import { Model, ActiveModelSerializer, Response } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; import promiseAjax from '../../../helpers/promise-ajax'; diff --git a/tests/integration/server/custom-responses-test.js b/tests/integration/server/custom-responses-test.js index 6ba2f204e..7c1556d16 100644 --- a/tests/integration/server/custom-responses-test.js +++ b/tests/integration/server/custom-responses-test.js @@ -1,7 +1,7 @@ import { module, test } from 'qunit'; import Server from 'ember-cli-mirage/server'; import promiseAjax from '../../helpers/promise-ajax'; -import { Response } from '@miragejs/server'; +import { Response } from 'ember-cli-mirage'; module('Integration | Server | Custom responses', function(hooks) { hooks.beforeEach(function() { diff --git a/tests/unit/response-test.js b/tests/unit/response-test.js index 0218d817b..63fd4e277 100644 --- a/tests/unit/response-test.js +++ b/tests/unit/response-test.js @@ -1,4 +1,4 @@ -import { Response } from '@miragejs/server'; +import Response from 'ember-cli-mirage/response'; import { module, test } from 'qunit'; diff --git a/yarn.lock b/yarn.lock index 27899b853..8f6a9e76d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1077,29 +1077,6 @@ dependencies: core-js "^2.5.7" -"@miragejs/server@^2.0.0-beta.4": - version "2.0.0-beta.4" - resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-2.0.0-beta.4.tgz#b4a13232737abfeffd219fab200f970ea2f82761" - integrity sha512-4MgGkFRemcZRXBUCJzqiIhgWOE+wJrK+RF50R1Oh0HFKNl21RGurn57tICtJilOHY1e2C2yvoQaNHoRUoVmqAQ== - dependencies: - "@xg-wang/whatwg-fetch" "^3.0.0" - broccoli-file-creator "^2.1.1" - broccoli-funnel "^2.0.1" - broccoli-merge-trees "^3.0.2" - broccoli-stew "^2.0.1" - broccoli-string-replace "^0.1.2" - chalk "^1.1.1" - ember-auto-import "^1.2.19" - ember-cli-babel "^6.16.0" - ember-cli-node-assets "^0.2.2" - ember-get-config "^0.2.2" - ember-inflector "^2.0.0 || ^3.0.0" - fake-xml-http-request "^2.0.0" - inflected "^2.0.4" - lodash "^4.17.11" - pretender "2.1.1" - route-recognizer "^0.3.4" - "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -1338,11 +1315,6 @@ "@webassemblyjs/wast-parser" "1.7.11" "@xtuc/long" "4.2.1" -"@xg-wang/whatwg-fetch@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@xg-wang/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#f7b222c012a238e7d6e89ed3d72a1e0edb58453d" - integrity sha512-ULtqA6L75RLzTNW68IiOja0XYv4Ebc3OGMzfia1xxSEMpD0mk/pMvkQX0vbCFyQmKc5xGp80Ms2WiSlXLh8hbA== - "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -3267,7 +3239,7 @@ broccoli-stew@^1.4.2, broccoli-stew@^1.5.0: symlink-or-copy "^1.2.0" walk-sync "^0.3.0" -broccoli-stew@^2.0.0, broccoli-stew@^2.0.1: +broccoli-stew@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-2.1.0.tgz#ba73add17fda3b9b01d8cfb343a8b613b7136a0a" integrity sha512-tgCkuTWYl4uf7k7ib2D79KFEj2hCgnTUNPMnrCoAha0/4bywcNccmaZVWtL9Ex37yX5h5eAbnM/ak2ULoMwSSw== @@ -3769,7 +3741,7 @@ chai@^4.1.0: pathval "^1.1.0" type-detect "^4.0.5" -chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.0.0, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= @@ -8247,7 +8219,7 @@ indexof@0.0.1: resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= -inflected@^2.0.3, inflected@^2.0.4: +inflected@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inflected/-/inflected-2.0.4.tgz#323770961ccbe992a98ea930512e9a82d3d3ef77" integrity sha512-HQPzFLTTUvwfeUH6RAGjD8cHS069mBqXG5n4qaxX7sJXBhVQrsGgF+0ZJGkSuN6a8pcUWB/GXStta11kKi/WvA== @@ -11411,15 +11383,6 @@ preserve@^0.2.0: resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= -pretender@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/pretender/-/pretender-2.1.1.tgz#5085f0a1272c31d5b57c488386f69e6ca207cb35" - integrity sha512-IkidsJzaroAanw3I43tKCFm2xCpurkQr9aPXv5/jpN+LfCwDaeI8rngVWtQZTx4qqbhc5zJspnLHJ4N/25KvDQ== - dependencies: - "@xg-wang/whatwg-fetch" "^3.0.0" - fake-xml-http-request "^2.0.0" - route-recognizer "^0.3.3" - pretender@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.0.1.tgz#817ac43faa3330aa17646968a115f232de10b2ca" @@ -12301,11 +12264,6 @@ route-recognizer@^0.3.3: resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.3.tgz#1d365e27fa6995e091675f7dc940a8c00353bd29" integrity sha1-HTZeJ/ppleCRZ199yUCowANTvSk= -route-recognizer@^0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.4.tgz#39ab1ffbce1c59e6d2bdca416f0932611e4f3ca3" - integrity sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g== - rsvp@^3.0.14, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.3.3, rsvp@^3.5.0: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" From e9e543684725f6a8a1bfa90bd3425d77cea75fc1 Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Thu, 23 May 2019 18:02:26 +0100 Subject: [PATCH 435/879] Revert direct imports to @miragejs/server Factory --- addon/index.js | 2 +- .../files/__root__/factories/__name__.js | 2 +- test-projects/01-basic-app/mirage/factories/user.js | 2 +- .../app/pods/docs/data-layer/factories/template.md | 12 ++++++------ .../pods/docs/getting-started/overview/template.md | 2 +- .../docs/getting-started/upgrade-guide/template.md | 2 +- tests/integration/database-test.js | 2 +- tests/integration/factories/after-create-test.js | 2 +- tests/integration/factories/helpers-test.js | 2 +- tests/integration/index-named-imports-test.js | 2 +- tests/integration/server-with-orm-test.js | 2 +- .../server/create-and-create-list-test.js | 2 +- tests/performance/simple-factory-test.js | 2 +- 13 files changed, 18 insertions(+), 18 deletions(-) diff --git a/addon/index.js b/addon/index.js index b53c79c50..e0e7ac440 100644 --- a/addon/index.js +++ b/addon/index.js @@ -1,4 +1,3 @@ -======= import Factory from './factory'; import trait from './trait'; import association from './association'; @@ -8,6 +7,7 @@ import Collection from './orm/collection'; import Serializer from './serializer'; import ActiveModelSerializer from './serializers/active-model-serializer'; import JSONAPISerializer from './serializers/json-api-serializer'; +import RestSerializer from './serializers/rest-serializer'; import HasMany from './orm/associations/has-many'; import BelongsTo from './orm/associations/belongs-to'; import IdentityManager from './identity-manager'; diff --git a/blueprints/mirage-factory/files/__root__/factories/__name__.js b/blueprints/mirage-factory/files/__root__/factories/__name__.js index 77aafabac..85018979d 100644 --- a/blueprints/mirage-factory/files/__root__/factories/__name__.js +++ b/blueprints/mirage-factory/files/__root__/factories/__name__.js @@ -1,4 +1,4 @@ -import { Factory } from '@miragejs/server'; +import { Factory } from 'ember-cli-mirage'; export default Factory.extend({ }); diff --git a/test-projects/01-basic-app/mirage/factories/user.js b/test-projects/01-basic-app/mirage/factories/user.js index cb9b4cb04..6a59ee9d2 100644 --- a/test-projects/01-basic-app/mirage/factories/user.js +++ b/test-projects/01-basic-app/mirage/factories/user.js @@ -1,4 +1,4 @@ -import { Factory } from '@miragejs/server'; +import { Factory } from 'ember-cli-mirage'; import faker from 'faker'; export default Factory.extend({ diff --git a/tests/dummy/app/pods/docs/data-layer/factories/template.md b/tests/dummy/app/pods/docs/data-layer/factories/template.md index 54a7a254e..5e91ef3f9 100644 --- a/tests/dummy/app/pods/docs/data-layer/factories/template.md +++ b/tests/dummy/app/pods/docs/data-layer/factories/template.md @@ -94,7 +94,7 @@ which creates this file: ```js // mirage/factories/movie.js -import { Factory } from '@miragejs/server'; +import { Factory } from 'ember-cli-mirage'; export default Factory.extend({ }); @@ -104,7 +104,7 @@ Right now the Factory is empty. Let's define a property on it: ```js // mirage/factories/movie.js -import { Factory } from '@miragejs/server'; +import { Factory } from 'ember-cli-mirage'; export default Factory.extend({ @@ -127,7 +127,7 @@ We can also make this property a function. ```js // mirage/factories/movie.js -import { Factory } from '@miragejs/server'; +import { Factory } from 'ember-cli-mirage'; export default Factory.extend({ @@ -164,7 +164,7 @@ Let's add some more properties to our factory: ```js // mirage/factories/movie.js -import { Factory } from '@miragejs/server'; +import { Factory } from 'ember-cli-mirage'; import faker from 'faker'; export default Factory.extend({ @@ -232,7 +232,7 @@ Attributes can depend on other attributes via `this` from within a function. Thi ```js // mirage/factories/user.js -import { Factory } from '@miragejs/server'; +import { Factory } from 'ember-cli-mirage'; import faker from 'faker'; export default Factory.extend({ @@ -501,7 +501,7 @@ As we saw earlier, given a `Post` that `belongsTo` a `User`, we were able to use ```js // mirage/factories/post.js -import { Factory } from '@miragejs/server'; +import { Factory } from 'ember-cli-mirage'; export default Factory.extend({ diff --git a/tests/dummy/app/pods/docs/getting-started/overview/template.md b/tests/dummy/app/pods/docs/getting-started/overview/template.md index 34b2c8429..e3d0608b5 100644 --- a/tests/dummy/app/pods/docs/getting-started/overview/template.md +++ b/tests/dummy/app/pods/docs/getting-started/overview/template.md @@ -95,7 +95,7 @@ We can then define some properties on our Factory. They can be simple types like ```js // mirage/factories/movie.js -import { Factory } from '@miragejs/server'; +import { Factory } from 'ember-cli-mirage'; export default Factory.extend({ diff --git a/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md b/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md index 0e3dab1c8..0b5c35aa4 100644 --- a/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md +++ b/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md @@ -54,7 +54,7 @@ Here are the steps you'll need to take to fix this: ```diff - import { Factory, faker } from 'ember-cli-mirage'; - + import { Factory } from '@miragejs/server'; + + import { Factory } from 'ember-cli-mirage'; + import faker from 'faker'; ``` diff --git a/tests/integration/database-test.js b/tests/integration/database-test.js index d57be2658..3ffcb6e84 100644 --- a/tests/integration/database-test.js +++ b/tests/integration/database-test.js @@ -1,7 +1,7 @@ import {module, test} from 'qunit'; import Server from 'ember-cli-mirage/server'; import { Model } from 'ember-cli-mirage'; -import { Factory } from '@miragejs/server'; +import { Factory } from 'ember-cli-mirage'; module('Integration | Database', function(hooks) { hooks.beforeEach(function() { diff --git a/tests/integration/factories/after-create-test.js b/tests/integration/factories/after-create-test.js index 3e372dbb8..cb48c1641 100644 --- a/tests/integration/factories/after-create-test.js +++ b/tests/integration/factories/after-create-test.js @@ -1,6 +1,6 @@ import { module, test } from 'qunit'; import { Model, belongsTo } from 'ember-cli-mirage'; -import { Factory } from '@miragejs/server'; +import { Factory } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; module('Integration | Server | Factories | afterCreate', function(hooks) { diff --git a/tests/integration/factories/helpers-test.js b/tests/integration/factories/helpers-test.js index 758b5e91d..2db05f623 100644 --- a/tests/integration/factories/helpers-test.js +++ b/tests/integration/factories/helpers-test.js @@ -1,6 +1,6 @@ import { module, test } from 'qunit'; import { Model, belongsTo, hasMany, trait, association } from 'ember-cli-mirage'; -import { Factory } from '@miragejs/server'; +import { Factory } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; module('Integration | Server | Factories | helpers', function(hooks) { diff --git a/tests/integration/index-named-imports-test.js b/tests/integration/index-named-imports-test.js index 202e3fe0c..6232cd81e 100644 --- a/tests/integration/index-named-imports-test.js +++ b/tests/integration/index-named-imports-test.js @@ -9,7 +9,7 @@ import { belongsTo, IdentityManager } from 'ember-cli-mirage'; -import { Factory } from '@miragejs/server'; +import { Factory } from 'ember-cli-mirage'; test('Factory is present in named exports from ember-cli-mirage', function(assert) { assert.ok(Factory); diff --git a/tests/integration/server-with-orm-test.js b/tests/integration/server-with-orm-test.js index de5a0db2b..a00e403ad 100644 --- a/tests/integration/server-with-orm-test.js +++ b/tests/integration/server-with-orm-test.js @@ -1,6 +1,6 @@ import {module, test} from 'qunit'; import { Model } from 'ember-cli-mirage'; -import { Factory } from '@miragejs/server'; +import { Factory } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; module('Integration | Server with ORM', function(hooks) { diff --git a/tests/integration/server/create-and-create-list-test.js b/tests/integration/server/create-and-create-list-test.js index 51bee08ba..0c757b994 100644 --- a/tests/integration/server/create-and-create-list-test.js +++ b/tests/integration/server/create-and-create-list-test.js @@ -1,6 +1,6 @@ import { module, test } from 'qunit'; import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; -import { Factory } from '@miragejs/server'; +import { Factory } from 'ember-cli-mirage'; import Inflector from 'ember-inflector'; import Server from 'ember-cli-mirage/server'; // import escape from 'escape-string-regexp'; diff --git a/tests/performance/simple-factory-test.js b/tests/performance/simple-factory-test.js index 53d240f25..afa83965f 100644 --- a/tests/performance/simple-factory-test.js +++ b/tests/performance/simple-factory-test.js @@ -1,6 +1,6 @@ import { module } from 'qunit'; import { Model } from 'ember-cli-mirage'; -import { Factory } from '@miragejs/server'; +import { Factory } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; import { perfTest } from './utils'; From cf2b50173e72c9b73a79608db7bc5293ac1a870c Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Thu, 23 May 2019 18:13:24 +0100 Subject: [PATCH 436/879] Revert importing directly from @miragejs/server. Bridge imports in response.js file --- addon/response.js | 58 +------------------ .../getting-started/upgrade-guide/template.md | 2 +- tests/integration/database-test.js | 4 +- .../factories/after-create-test.js | 3 +- tests/integration/factories/helpers-test.js | 3 +- tests/integration/index-named-imports-test.js | 2 +- tests/integration/server-with-orm-test.js | 3 +- .../server/create-and-create-list-test.js | 3 +- tests/performance/simple-factory-test.js | 3 +- 9 files changed, 12 insertions(+), 69 deletions(-) diff --git a/addon/response.js b/addon/response.js index 1cb5139ea..21fb597c1 100644 --- a/addon/response.js +++ b/addon/response.js @@ -1,56 +1,4 @@ -import { warn } from '@ember/debug'; +import Response from '@miragejs/server/lib/response'; +export * from '@miragejs/server/lib/response'; -/** - You can use this class when you want more control over your route handlers response. - - Pass the `code`, `headers` and `data` into the constructor and return an instance from any route handler. - - ```js - import { Response } from 'ember-cli-mirage'; - - this.get('/users', () => { - return new Response(400, { some: 'header' }, { errors: [ 'name cannot be blank'] }); - }); - ``` -*/ -export default class Response { - - constructor(code, headers = {}, data) { - this.code = code; - this.headers = headers; - - // Default data for "undefined 204" responses to empty string (no content) - if (code === 204) { - if (data !== undefined && data !== '') { - warn( - `Mirage: One of your route handlers is returning a custom - 204 Response that has data, but this is a violation of the HTTP spec - and could lead to unexpected behavior. 204 responses should have no - content (an empty string) as their body. [warning id: - ember-cli-mirage.warn-response-204-non-empty-payload]`, - false, - { id: 'ember-cli-mirage.warn-response-204-non-empty-payload' } - ); - } else { - this.data = ''; - } - - // Default data for "empty untyped" responses to empty JSON object - } else if ((data === undefined || data === '') && !this.headers.hasOwnProperty('Content-Type')) { - this.data = {}; - - } else { - this.data = data; - } - - // Default "untyped" responses to application/json - if (code !== 204 && !this.headers.hasOwnProperty('Content-Type')) { - this.headers['Content-Type'] = 'application/json'; - } - } - - toRackResponse() { - return [ this.code, this.headers, this.data ]; - } - -} +export default Response; diff --git a/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md b/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md index 0b5c35aa4..35d92c503 100644 --- a/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md +++ b/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md @@ -82,7 +82,7 @@ For `faker.list.cycle`, use the remainder (modulo) operator: - return faker.list.cycle([ 'United States of America', 'Canada', 'Mexico' ]); + let countries = [ 'United States of America', 'Canada', 'Mexico' ]; -+ ++ + return countries[i % countries.length]; } ``` diff --git a/tests/integration/database-test.js b/tests/integration/database-test.js index 3ffcb6e84..3c947a280 100644 --- a/tests/integration/database-test.js +++ b/tests/integration/database-test.js @@ -1,7 +1,6 @@ import {module, test} from 'qunit'; import Server from 'ember-cli-mirage/server'; -import { Model } from 'ember-cli-mirage'; -import { Factory } from 'ember-cli-mirage'; +import { Model, Factory } from 'ember-cli-mirage'; module('Integration | Database', function(hooks) { hooks.beforeEach(function() { @@ -38,3 +37,4 @@ module('Integration | Database', function(hooks) { assert.deepEqual(authors.map((a) => a.id), ['1', '2']); }); }); + diff --git a/tests/integration/factories/after-create-test.js b/tests/integration/factories/after-create-test.js index cb48c1641..3536974d8 100644 --- a/tests/integration/factories/after-create-test.js +++ b/tests/integration/factories/after-create-test.js @@ -1,6 +1,5 @@ import { module, test } from 'qunit'; -import { Model, belongsTo } from 'ember-cli-mirage'; -import { Factory } from 'ember-cli-mirage'; +import { Model, Factory, belongsTo } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; module('Integration | Server | Factories | afterCreate', function(hooks) { diff --git a/tests/integration/factories/helpers-test.js b/tests/integration/factories/helpers-test.js index 2db05f623..d78e15031 100644 --- a/tests/integration/factories/helpers-test.js +++ b/tests/integration/factories/helpers-test.js @@ -1,6 +1,5 @@ import { module, test } from 'qunit'; -import { Model, belongsTo, hasMany, trait, association } from 'ember-cli-mirage'; -import { Factory } from 'ember-cli-mirage'; +import { Model, Factory, belongsTo, hasMany, trait, association } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; module('Integration | Server | Factories | helpers', function(hooks) { diff --git a/tests/integration/index-named-imports-test.js b/tests/integration/index-named-imports-test.js index 6232cd81e..d02bfff37 100644 --- a/tests/integration/index-named-imports-test.js +++ b/tests/integration/index-named-imports-test.js @@ -1,5 +1,6 @@ import { test } from 'qunit'; import { + Factory, Response, Model, Serializer, @@ -9,7 +10,6 @@ import { belongsTo, IdentityManager } from 'ember-cli-mirage'; -import { Factory } from 'ember-cli-mirage'; test('Factory is present in named exports from ember-cli-mirage', function(assert) { assert.ok(Factory); diff --git a/tests/integration/server-with-orm-test.js b/tests/integration/server-with-orm-test.js index a00e403ad..5d63690e4 100644 --- a/tests/integration/server-with-orm-test.js +++ b/tests/integration/server-with-orm-test.js @@ -1,6 +1,5 @@ import {module, test} from 'qunit'; -import { Model } from 'ember-cli-mirage'; -import { Factory } from 'ember-cli-mirage'; +import { Model, Factory } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; module('Integration | Server with ORM', function(hooks) { diff --git a/tests/integration/server/create-and-create-list-test.js b/tests/integration/server/create-and-create-list-test.js index 0c757b994..38327f311 100644 --- a/tests/integration/server/create-and-create-list-test.js +++ b/tests/integration/server/create-and-create-list-test.js @@ -1,6 +1,5 @@ import { module, test } from 'qunit'; -import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; -import { Factory } from 'ember-cli-mirage'; +import { Model, Factory, hasMany, belongsTo } from 'ember-cli-mirage'; import Inflector from 'ember-inflector'; import Server from 'ember-cli-mirage/server'; // import escape from 'escape-string-regexp'; diff --git a/tests/performance/simple-factory-test.js b/tests/performance/simple-factory-test.js index afa83965f..3fdb6182a 100644 --- a/tests/performance/simple-factory-test.js +++ b/tests/performance/simple-factory-test.js @@ -1,6 +1,5 @@ import { module } from 'qunit'; -import { Model } from 'ember-cli-mirage'; -import { Factory } from 'ember-cli-mirage'; +import { Model, Factory } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; import { perfTest } from './utils'; From e05ae069c3bdf8439aacad0191e21522a6b7bf05 Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Thu, 23 May 2019 18:24:05 +0100 Subject: [PATCH 437/879] Migrate Trait without breaking path imports --- addon/trait.js | 14 +++----------- yarn.lock | 48 +++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 48 insertions(+), 14 deletions(-) diff --git a/addon/trait.js b/addon/trait.js index 415cd3c88..d701fc088 100644 --- a/addon/trait.js +++ b/addon/trait.js @@ -1,12 +1,4 @@ -let trait = function(extension) { - let __isTrait__ = true; - return { - extension, - __isTrait__ - }; -}; +import Trait from '@miragejs/server/lib/trait'; +export * from '@miragejs/server/lib/trait'; -/** - @hide -*/ -export default trait; +export default Trait; diff --git a/yarn.lock b/yarn.lock index 8f6a9e76d..27899b853 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1077,6 +1077,29 @@ dependencies: core-js "^2.5.7" +"@miragejs/server@^2.0.0-beta.4": + version "2.0.0-beta.4" + resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-2.0.0-beta.4.tgz#b4a13232737abfeffd219fab200f970ea2f82761" + integrity sha512-4MgGkFRemcZRXBUCJzqiIhgWOE+wJrK+RF50R1Oh0HFKNl21RGurn57tICtJilOHY1e2C2yvoQaNHoRUoVmqAQ== + dependencies: + "@xg-wang/whatwg-fetch" "^3.0.0" + broccoli-file-creator "^2.1.1" + broccoli-funnel "^2.0.1" + broccoli-merge-trees "^3.0.2" + broccoli-stew "^2.0.1" + broccoli-string-replace "^0.1.2" + chalk "^1.1.1" + ember-auto-import "^1.2.19" + ember-cli-babel "^6.16.0" + ember-cli-node-assets "^0.2.2" + ember-get-config "^0.2.2" + ember-inflector "^2.0.0 || ^3.0.0" + fake-xml-http-request "^2.0.0" + inflected "^2.0.4" + lodash "^4.17.11" + pretender "2.1.1" + route-recognizer "^0.3.4" + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -1315,6 +1338,11 @@ "@webassemblyjs/wast-parser" "1.7.11" "@xtuc/long" "4.2.1" +"@xg-wang/whatwg-fetch@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@xg-wang/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#f7b222c012a238e7d6e89ed3d72a1e0edb58453d" + integrity sha512-ULtqA6L75RLzTNW68IiOja0XYv4Ebc3OGMzfia1xxSEMpD0mk/pMvkQX0vbCFyQmKc5xGp80Ms2WiSlXLh8hbA== + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -3239,7 +3267,7 @@ broccoli-stew@^1.4.2, broccoli-stew@^1.5.0: symlink-or-copy "^1.2.0" walk-sync "^0.3.0" -broccoli-stew@^2.0.0: +broccoli-stew@^2.0.0, broccoli-stew@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-2.1.0.tgz#ba73add17fda3b9b01d8cfb343a8b613b7136a0a" integrity sha512-tgCkuTWYl4uf7k7ib2D79KFEj2hCgnTUNPMnrCoAha0/4bywcNccmaZVWtL9Ex37yX5h5eAbnM/ak2ULoMwSSw== @@ -3741,7 +3769,7 @@ chai@^4.1.0: pathval "^1.1.0" type-detect "^4.0.5" -chalk@^1.0.0, chalk@^1.1.3: +chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= @@ -8219,7 +8247,7 @@ indexof@0.0.1: resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= -inflected@^2.0.3: +inflected@^2.0.3, inflected@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inflected/-/inflected-2.0.4.tgz#323770961ccbe992a98ea930512e9a82d3d3ef77" integrity sha512-HQPzFLTTUvwfeUH6RAGjD8cHS069mBqXG5n4qaxX7sJXBhVQrsGgF+0ZJGkSuN6a8pcUWB/GXStta11kKi/WvA== @@ -11383,6 +11411,15 @@ preserve@^0.2.0: resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= +pretender@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pretender/-/pretender-2.1.1.tgz#5085f0a1272c31d5b57c488386f69e6ca207cb35" + integrity sha512-IkidsJzaroAanw3I43tKCFm2xCpurkQr9aPXv5/jpN+LfCwDaeI8rngVWtQZTx4qqbhc5zJspnLHJ4N/25KvDQ== + dependencies: + "@xg-wang/whatwg-fetch" "^3.0.0" + fake-xml-http-request "^2.0.0" + route-recognizer "^0.3.3" + pretender@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.0.1.tgz#817ac43faa3330aa17646968a115f232de10b2ca" @@ -12264,6 +12301,11 @@ route-recognizer@^0.3.3: resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.3.tgz#1d365e27fa6995e091675f7dc940a8c00353bd29" integrity sha1-HTZeJ/ppleCRZ199yUCowANTvSk= +route-recognizer@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.4.tgz#39ab1ffbce1c59e6d2bdca416f0932611e4f3ca3" + integrity sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g== + rsvp@^3.0.14, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.3.3, rsvp@^3.5.0: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" From 9e0c9e71c989d5a510d64fc920ffbd15a542f1cf Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Fri, 24 May 2019 01:30:47 +0100 Subject: [PATCH 438/879] Point files to @miragejs/server --- addon/assert.js | 71 +- addon/association.js | 15 +- addon/db-collection.js | 451 +------ addon/db.js | 174 +-- addon/factory.js | 145 +-- addon/identity-manager.js | 107 +- addon/index.js | 52 +- addon/route-handler.js | 125 +- addon/serializer-registry.js | 97 +- addon/serializer.js | 1113 +---------------- addon/server.js | 1071 +--------------- addon/start-mirage.js | 52 +- .../function-handler/basic-test.js | 3 +- 13 files changed, 33 insertions(+), 3443 deletions(-) diff --git a/addon/assert.js b/addon/assert.js index 4342d2644..008888788 100644 --- a/addon/assert.js +++ b/addon/assert.js @@ -1,69 +1,4 @@ -import Ember from 'ember'; +import Assert from '@miragejs/server/lib/assert'; +export * from '@miragejs/server/lib/assert'; -/* eslint no-console: 0 */ -let errorProps = [ - 'description', - 'fileName', - 'lineNumber', - 'message', - 'name', - 'number', - 'stack' -]; - -/** - @hide -*/ -export default function assert(bool, text) { - if (typeof bool === 'string' && !text) { - throw new MirageError(bool); - } - - if (!bool) { - throw new MirageError(text.replace(/^ +/gm, '') || 'Assertion failed'); - } -} - -/** - @public - @hide - Copied from ember-metal/error -*/ -export function MirageError(message, stack) { - let tmp = Error(message); - - if (stack) { - tmp.stack = stack; - } - - for (let idx = 0; idx < errorProps.length; idx++) { - let prop = errorProps[idx]; - - if (['description', 'message', 'stack'].indexOf(prop) > -1) { - this[prop] = `Mirage: ${tmp[prop]}`; - } else { - this[prop] = tmp[prop]; - } - } -} - -MirageError.prototype = Object.create(Error.prototype); - -/** - @hide -*/ -export const logger = { - errors: [], - - get messages() { - return this.errors; - }, - - error(message) { - if (Ember.testing) { - this.errors.push(message); - } else { - console.error(message); - } - } -}; +export default Assert; diff --git a/addon/association.js b/addon/association.js index 656bee16d..e19babd0e 100644 --- a/addon/association.js +++ b/addon/association.js @@ -1,13 +1,4 @@ -/** - @hide -*/ -let association = function(...traitsAndOverrides) { - let __isAssociation__ = true; +import Association from '@miragejs/server/lib/association'; +export * from '@miragejs/server/lib/association'; - return { - __isAssociation__, - traitsAndOverrides - }; -}; - -export default association; +export default Association; diff --git a/addon/db-collection.js b/addon/db-collection.js index 935d44c6a..4dbbf198f 100644 --- a/addon/db-collection.js +++ b/addon/db-collection.js @@ -1,451 +1,4 @@ -import _assign from 'lodash/assign'; -import _map from 'lodash/map'; -import _isEqual from 'lodash/isEqual'; - -function duplicate(data) { - if (Array.isArray(data)) { - return data.map(duplicate); - } else { - return _assign({}, data); - } -} - -/** - Mirage's `Db` has many `DbCollections`, which are equivalent to tables from traditional databases. They store specific types of data, for example `users` and `posts`. - - `DbCollections` have names, like `users`, which you use to access the collection from the `Db` object. - - Suppose you had a `user` model defined, and the following data had been inserted into your database (either through factories or fixtures): - - ```js - export default [ - { id: 1, name: 'Zelda' }, - { id: 2, name: 'Link' } - ]; - ``` - - Then `db.contacts` would return this array. - - @class DbCollection - @constructor - @public - */ -class DbCollection { - - constructor(name, initialData, IdentityManager) { - this.name = name; - this._records = []; - this.identityManager = new IdentityManager(); - - if (initialData) { - this.insert(initialData); - } - } - - /** - * Returns a copy of the data, to prevent inadvertent data manipulation. - * @method all - * @public - * @hide - */ - all() { - return duplicate(this._records); - } - - /** - Inserts `data` into the collection. `data` can be a single object - or an array of objects. Returns the inserted record. - - ```js - // Insert a single record - let link = db.users.insert({ name: 'Link', age: 173 }); - - link; // { id: 1, name: 'Link', age: 173 } - - // Insert an array - let users = db.users.insert([ - { name: 'Zelda', age: 142 }, - { name: 'Epona', age: 58 }, - ]); - - users; // [ { id: 2, name: 'Zelda', age: 142 }, { id: 3, name: 'Epona', age: 58 } ] - ``` - - @method insert - @param data - @public - */ - insert(data) { - if (!Array.isArray(data)) { - return this._insertRecord(data); - } else { - return _map(data, attrs => this._insertRecord(attrs)); - } - } - - /** - Returns a single record from the `collection` if `ids` is a single - id, or an array of records if `ids` is an array of ids. Note - each id can be an int or a string, but integer ids as strings - (e.g. the string “1â€) will be treated as integers. - - ```js - // Given users = [{id: 1, name: 'Link'}, {id: 2, name: 'Zelda'}] - - db.users.find(1); // {id: 1, name: 'Link'} - db.users.find([1, 2]); // [{id: 1, name: 'Link'}, {id: 2, name: 'Zelda'}] - ``` - - @method find - @param ids - @public - */ - find(ids) { - if (Array.isArray(ids)) { - let records = this._findRecords(ids) - .filter(Boolean) - .map(duplicate); // Return a copy - - return records; - } else { - let record = this._findRecord(ids); - if (!record) { - return null; - } - - // Return a copy - return duplicate(record); - } - } - - /** - Returns the first model from `collection` that matches the - key-value pairs in the `query` object. Note that a string - comparison is used. `query` is a POJO. - - ```js - // Given users = [ { id: 1, name: 'Link' }, { id: 2, name: 'Zelda' } ] - db.users.findBy({ name: 'Link' }); // { id: 1, name: 'Link' } - ``` - - @method find - @param query - @public - */ - findBy(query) { - let record = this._findRecordBy(query); - if (!record) { - return null; - } - - // Return a copy - return duplicate(record); - } - - /** - Returns an array of models from `collection` that match the - key-value pairs in the `query` object. Note that a string - comparison is used. `query` is a POJO. - - ```js - // Given users = [ { id: 1, name: 'Link' }, { id: 2, name: 'Zelda' } ] - - db.users.where({ name: 'Zelda' }); // [ { id: 2, name: 'Zelda' } ] - ``` - - @method where - @param query - @public - */ - where(query) { - return this._findRecordsWhere(query).map(duplicate); - } - - /** - Finds the first record matching the provided _query_ in - `collection`, or creates a new record using a merge of the - `query` and optional `attributesForCreate`. - - Often times you may have a pattern like the following in your API stub: - - ```js - // Given users = [ - // { id: 1, name: 'Link' }, - // { id: 2, name: 'Zelda' } - // ] - - // Create Link if he doesn't yet exist - let records = db.users.where({ name: 'Link' }); - let record; - - if (records.length > 0) { - record = records[0]; - } else { - record = db.users.insert({ name: 'Link' }); - } - ``` - - You can now replace this with the following: - - ```js - let record = db.users.firstOrCreate({ name: 'Link' }); - ``` - - An extended example using *attributesForCreate*: - - ```js - let record = db.users.firstOrCreate({ name: 'Link' }, { evil: false }); - ``` - - @method firstOrCreate - @param query - @param attributesForCreate - @public - */ - firstOrCreate(query, attributesForCreate = {}) { - let queryResult = this.where(query); - let [record] = queryResult; - - if (record) { - return record; - } else { - let mergedAttributes = _assign(attributesForCreate, query); - let createdRecord = this.insert(mergedAttributes); - - return createdRecord; - } - } - - /** - Updates one or more records in the collection. - - If *attrs* is the only arg present, updates all records in the collection according to the key-value pairs in *attrs*. - - If *target* is present, restricts updates to those that match *target*. If *target* is a number or string, finds a single record whose id is *target* to update. If *target* is a POJO, queries *collection* for records that match the key-value pairs in *target*, and updates their *attrs*. - - Returns the updated record or records. - - ```js - // Given users = [ - // {id: 1, name: 'Link'}, - // {id: 2, name: 'Zelda'} - // ] - - db.users.update({name: 'Ganon'}); // db.users = [{id: 1, name: 'Ganon'}, {id: 2, name: 'Ganon'}] - db.users.update(1, {name: 'Young Link'}); // db.users = [{id: 1, name: 'Young Link'}, {id: 2, name: 'Zelda'}] - db.users.update({name: 'Link'}, {name: 'Epona'}); // db.users = [{id: 1, name: 'Epona'}, {id: 2, name: 'Zelda'}] - ``` - - @method update - @param target - @param attrs - @public - */ - update(target, attrs) { - let records; - - if (typeof attrs === 'undefined') { - attrs = target; - let changedRecords = []; - - this._records.forEach((record) => { - let oldRecord = _assign({}, record); - - this._updateRecord(record, attrs); - - if (!_isEqual(oldRecord, record)) { - changedRecords.push(record); - } - }); - - return changedRecords; - - } else if (typeof target === 'number' || typeof target === 'string') { - let id = target; - let record = this._findRecord(id); - - this._updateRecord(record, attrs); - - return record; - - } else if (Array.isArray(target)) { - let ids = target; - records = this._findRecords(ids); - - records.forEach((record) => { - this._updateRecord(record, attrs); - }); - - return records; - - } else if (typeof target === 'object') { - let query = target; - records = this._findRecordsWhere(query); - - records.forEach((record) => { - this._updateRecord(record, attrs); - }); - - return records; - } - } - - /** - Removes one or more records in *collection*. - - If *target* is undefined, removes all records. If *target* is a number or string, removes a single record using *target* as id. If *target* is a POJO, queries *collection* for records that match the key-value pairs in *target*, and removes them from the collection. - - ```js - // Given users = [ - // {id: 1, name: 'Link'}, - // {id: 2, name: 'Zelda'} - // ] - - db.users.remove(); // db.users = [] - db.users.remove(1); // db.users = [{id: 2, name: 'Zelda'}] - db.users.remove({name: 'Zelda'}); // db.users = [{id: 1, name: 'Link'}] - ``` - - @method remove - @param target - @public - */ - remove(target) { - let records; - - if (typeof target === 'undefined') { - this._records = []; - this.identityManager.reset(); - - } else if (typeof target === 'number' || typeof target === 'string') { - let record = this._findRecord(target); - let index = this._records.indexOf(record); - this._records.splice(index, 1); - - } else if (Array.isArray(target)) { - records = this._findRecords(target); - records.forEach((record) => { - let index = this._records.indexOf(record); - this._records.splice(index, 1); - }); - - } else if (typeof target === 'object') { - records = this._findRecordsWhere(target); - records.forEach((record) => { - let index = this._records.indexOf(record); - this._records.splice(index, 1); - }); - } - } - - /* - Private methods. - - These return the actual db objects, whereas the public - API query methods return copies. - */ - - /** - @method _findRecord - @param id - @private - @hide - */ - _findRecord(id) { - id = id.toString(); - - let [record] = this._records.filter((obj) => obj.id === id); - - return record; - } - - /** - @method _findRecordBy - @param query - @private - @hide - */ - _findRecordBy(query) { - return this._findRecordsWhere(query)[0]; - } - - /** - @method _findRecords - @param ids - @private - @hide - */ - _findRecords(ids) { - return ids.map(this._findRecord, this); - } - - /** - @method _findRecordsWhere - @param query - @private - @hide - */ - _findRecordsWhere(query) { - let records = this._records; - - function defaultQueryFunction(record) { - let keys = Object.keys(query); - - return keys.every(function(key) { - return String(record[key]) === String(query[key]); - }); - } - - let queryFunction = typeof query === 'object' ? defaultQueryFunction : query; - - return records.filter(queryFunction); - } - - /** - @method _insertRecord - @param data - @private - @hide - */ - _insertRecord(data) { - let attrs = duplicate(data); - - if (attrs && (attrs.id === undefined || attrs.id === null)) { - attrs.id = this.identityManager.fetch(attrs); - } else { - attrs.id = attrs.id.toString(); - - this.identityManager.set(attrs.id); - } - - this._records.push(attrs); - - return duplicate(attrs); - } - - /** - @method _updateRecord - @param record - @param attrs - @private - @hide - */ - _updateRecord(record, attrs) { - let targetId = (attrs && attrs.hasOwnProperty('id')) ? attrs.id.toString() : null; - let currentId = record.id; - - if (targetId && currentId !== targetId) { - throw new Error('Updating the ID of a record is not permitted'); - } - - for (let attr in attrs) { - if (attr === 'id') { - continue; - } - - record[attr] = attrs[attr]; - } - } -} +import DbCollection from '@miragejs/server/lib/db-collection'; +export * from '@miragejs/server/lib/db-collection'; export default DbCollection; diff --git a/addon/db.js b/addon/db.js index 5fd3a933b..49b4f4e96 100644 --- a/addon/db.js +++ b/addon/db.js @@ -1,174 +1,4 @@ -import DbCollection from './db-collection'; -import IdentityManager from './identity-manager'; -import { singularize } from './utils/inflector'; -import _cloneDeep from 'lodash/cloneDeep'; - -/** - Your Mirage server has a database which you can interact with in your route handlers. You’ll typically use models to interact with your database data, but you can always reach into the db directly in the event you want more control. - - Access the db from your route handlers via `schema.db`. - - You can access individual DbCollections by using `schema.db.name`: - - ```js - schema.db.users // would return, e.g., [ { id: 1, name: 'Yehuda' }, { id: 2, name: 'Tom '} ] - ``` - - @class Db - @constructor - @public - */ -class Db { - - constructor(initialData, identityManagers) { - this._collections = []; - - this.registerIdentityManagers(identityManagers); - - if (initialData) { - this.loadData(initialData); - } - } - - /** - Loads an object of data into Mirage's database. - - The keys of the object correspond to the DbCollections, and the values are arrays of records. - - ```js - server.db.loadData({ - users: [ - { name: 'Yehuda' }, - { name: 'Tom' } - ] - }); - ``` - - As with `db.collection.insert`, IDs will automatically be created for records that don't have them. - - @method loadData - @param {Object} data - Data to load - @public - */ - loadData(data) { - for (let key in data) { - this.createCollection(key, _cloneDeep(data[key])); - } - } - - /** - Logs out the contents of the Db. - - ```js - server.db.dump() // { users: [ name: 'Yehuda', ... - ``` - - @method dump - @public - */ - dump() { - return this._collections.reduce((data, collection) => { - data[collection.name] = collection.all(); - - return data; - }, {}); - } - - /** - Add an empty collection named _name_ to your database. Typically you won’t need to do this yourself, since collections are automatically created for any models you have defined. - - @method createCollection - @param name - @param initialData (optional) - @public - */ - createCollection(name, initialData) { - if (!this[name]) { - let IdentityManager = this.identityManagerFor(name); - let newCollection = new DbCollection(name, initialData, IdentityManager); - - // Public API has a convenient array interface. It comes at the cost of - // returning a copy of all records to avoid accidental mutations. - Object.defineProperty(this, name, { - get() { - let recordsCopy = newCollection.all(); - - ['insert', 'find', 'findBy', 'where', 'update', 'remove', 'firstOrCreate'] - .forEach(function(method) { - recordsCopy[method] = function() { - return newCollection[method](...arguments); - }; - }); - - return recordsCopy; - } - }); - - // Private API does not have the array interface. This means internally, only - // db-collection methods can be used. This is so records aren't copied redundantly - // internally, which leads to accidental O(n^2) operations (e.g., createList). - Object.defineProperty(this, `_${name}`, { - get() { - let recordsCopy = []; - - ['insert', 'find', 'findBy', 'where', 'update', 'remove', 'firstOrCreate'] - .forEach(function(method) { - recordsCopy[method] = function() { - return newCollection[method](...arguments); - }; - }); - - return recordsCopy; - } - }); - - this._collections.push(newCollection); - - } else if (initialData) { - this[name].insert(initialData); - } - - return this; - } - - /** - @method createCollections - @param ...collections - @public - @hide - */ - createCollections(...collections) { - collections.forEach((c) => this.createCollection(c)); - } - - /** - Removes all data from Mirage's database. - - @method emptyData - @public - */ - emptyData() { - this._collections.forEach((c) => c.remove()); - } - - /** - @method identityManagerFor - @param name - @public - @hide - */ - identityManagerFor(name) { - return this._identityManagers[singularize(name)] || this._identityManagers.application || IdentityManager; - } - - /** - @method registerIdentityManagers - @public - @hide - */ - registerIdentityManagers(identityManagers) { - this._identityManagers = identityManagers || {}; - } -} +import Db from '@miragejs/server/lib/db'; +export * from '@miragejs/server/lib/db'; export default Db; diff --git a/addon/factory.js b/addon/factory.js index 8fe4d590b..c31345fff 100644 --- a/addon/factory.js +++ b/addon/factory.js @@ -1,145 +1,4 @@ -import _assign from 'lodash/assign'; -import _isFunction from 'lodash/isFunction'; -import _mapValues from 'lodash/mapValues'; -import referenceSort from './utils/reference-sort'; -import _isPlainObject from 'lodash/isPlainObject'; +import Factory from '@miragejs/server/lib/factory'; +export * from '@miragejs/server/lib/factory'; -let Factory = function() { - this.build = function(sequence) { - let object = {}; - let topLevelAttrs = _assign({}, this.attrs); - delete topLevelAttrs.afterCreate; - Object.keys(topLevelAttrs).forEach((attr) => { - if (Factory.isTrait.call(this, attr)) { - delete topLevelAttrs[attr]; - } - }); - let keys = sortAttrs(topLevelAttrs, sequence); - - keys.forEach(function(key) { - let buildAttrs, buildSingleValue; - - buildAttrs = function(attrs) { - return _mapValues(attrs, buildSingleValue); - }; - - buildSingleValue = (value) => { - if (Array.isArray(value)) { - return value.map(buildSingleValue); - } else if (_isPlainObject(value)) { - return buildAttrs(value); - } else if (_isFunction(value)) { - return value.call(topLevelAttrs, sequence); - } else { - return value; - } - }; - - let value = topLevelAttrs[key]; - if (_isFunction(value)) { - object[key] = value.call(object, sequence); - } else { - object[key] = buildSingleValue(value); - } - - }); - - return object; - }; -}; - -Factory.extend = function(attrs) { - // Merge the new attributes with existing ones. If conflict, new ones win. - let newAttrs = _assign({}, this.attrs, attrs); - - let Subclass = function() { - this.attrs = newAttrs; - Factory.call(this); - }; - - // Copy extend - Subclass.extend = Factory.extend; - Subclass.extractAfterCreateCallbacks = Factory.extractAfterCreateCallbacks; - Subclass.isTrait = Factory.isTrait; - - // Store a reference on the class for future subclasses - Subclass.attrs = newAttrs; - - return Subclass; -}; - -Factory.extractAfterCreateCallbacks = function({ traits } = {}) { - let afterCreateCallbacks = []; - let attrs = this.attrs || {}; - let traitCandidates; - - if (attrs.afterCreate) { - afterCreateCallbacks.push(attrs.afterCreate); - } - - if (Array.isArray(traits)) { - traitCandidates = traits; - } else { - traitCandidates = Object.keys(attrs); - } - - traitCandidates.filter((attr) => { - return this.isTrait(attr) && attrs[attr].extension.afterCreate; - }).forEach((attr) => { - afterCreateCallbacks.push(attrs[attr].extension.afterCreate); - }); - - return afterCreateCallbacks; -}; - -Factory.isTrait = function(attrName) { - let { attrs } = this; - return _isPlainObject(attrs[attrName]) && attrs[attrName].__isTrait__ === true; -}; - -function sortAttrs(attrs, sequence) { - let Temp = function() {}; - let obj = new Temp(); - let refs = []; - let property; - - Object.keys(attrs).forEach(function(key) { - let value; - Object.defineProperty(obj.constructor.prototype, key, { - get() { - refs.push([property, key]); - return value; - }, - set(newValue) { - value = newValue; - }, - enumerable: false, - configurable: true - }); - }); - - Object.keys(attrs).forEach(function(key) { - let value = attrs[key]; - if (typeof value !== 'function') { - obj[key] = value; - } - }); - - Object.keys(attrs).forEach(function(key) { - let value = attrs[key]; - property = key; - - if (typeof value === 'function') { - obj[key] = value.call(obj, sequence); - } - - refs.push([key]); - }); - - return referenceSort(refs); -} - -/** - * @hide -*/ export default Factory; diff --git a/addon/identity-manager.js b/addon/identity-manager.js index 090253348..14da818a9 100644 --- a/addon/identity-manager.js +++ b/addon/identity-manager.js @@ -1,107 +1,4 @@ -function isNumber(n) { - return (+n).toString() === n.toString(); -} - -/** - By default Mirage uses autoincrementing numbers starting with `1` as IDs for records. This can be customized by implementing one or more IdentityManagers for your application. - - An IdentityManager is a class that's responsible for generating unique identifiers. You can define a custom identity manager for your entire application, as well as on a per-model basis. - - A custom IdentityManager must implement these methods: - - - `fetch`, which must return an identifier not yet used - - `set`, which is called with an `id` of a record being insert into Mirage's database - - `reset`, which should reset database to initial state - - Mirage provides a blueprint to generate custom IdentityManagers: - - ``` - ember generate mirage-identity-manager - ``` - - Check out the advanced guide on Mocking UUIDs to see a complete example of a custom IdentityManager. - - @class IdentityManager - @constructor - @public -*/ -class IdentityManager { - - constructor() { - this._nextId = 1; - this._ids = {}; - } - - /** - @method get - @hide - @private - */ - get() { - return this._nextId; - } - - /** - Registers `uniqueIdentifier` as used. - - This method should throw is `uniqueIdentifier` has already been taken. - - @method set - @param {String|Number} uniqueIdentifier - @public - */ - set(uniqueIdentifier) { - if (this._ids[uniqueIdentifier]) { - throw new Error(`Attempting to use the ID ${uniqueIdentifier}, but it's already been used`); - } - - if (isNumber(uniqueIdentifier) && +uniqueIdentifier >= this._nextId) { - this._nextId = +uniqueIdentifier + 1; - } - - this._ids[uniqueIdentifier] = true; - } - - /** - @method inc - @hide - @private - */ - inc() { - let nextValue = this.get() + 1; - - this._nextId = nextValue; - - return nextValue; - } - - /** - Returns the next unique identifier. - - @method fetch - @return {String} Unique identifier - @public - */ - fetch() { - let id = this.get(); - - this._ids[id] = true; - - this.inc(); - - return id.toString(); - } - - /** - Resets the identity manager, marking all unique identifiers as available. - - @method reset - @public - */ - reset() { - this._nextId = 1; - this._ids = {}; - } -} +import IdentityManager from '@miragejs/server/lib/identity-manager'; +export * from '@miragejs/server/lib/identity-manager'; export default IdentityManager; diff --git a/addon/index.js b/addon/index.js index e0e7ac440..77e842f17 100644 --- a/addon/index.js +++ b/addon/index.js @@ -1,50 +1,4 @@ -import Factory from './factory'; -import trait from './trait'; -import association from './association'; -import Response from './response'; -import Model from './orm/model'; -import Collection from './orm/collection'; -import Serializer from './serializer'; -import ActiveModelSerializer from './serializers/active-model-serializer'; -import JSONAPISerializer from './serializers/json-api-serializer'; -import RestSerializer from './serializers/rest-serializer'; -import HasMany from './orm/associations/has-many'; -import BelongsTo from './orm/associations/belongs-to'; -import IdentityManager from './identity-manager'; +import MirageServer from '@miragejs/server/lib/index'; +export * from '@miragejs/server/lib/index'; -/** - @hide -*/ -function hasMany(...args) { - return new HasMany(...args); -} - -/** - @hide -*/ -function belongsTo(...args) { - return new BelongsTo(...args); -} - -export { - Factory, - trait, - association, - Response, - Model, - Collection, - Serializer, - ActiveModelSerializer, - JSONAPISerializer, - RestSerializer, - hasMany, - belongsTo, - IdentityManager -}; - -export default { - Factory, - Response, - hasMany, - belongsTo -}; +export default MirageServer; diff --git a/addon/route-handler.js b/addon/route-handler.js index c74489efa..d020a4bf6 100644 --- a/addon/route-handler.js +++ b/addon/route-handler.js @@ -1,123 +1,4 @@ -import { Promise } from 'rsvp'; -import { MirageError } from 'ember-cli-mirage/assert'; -import Response from './response'; -import FunctionHandler from './route-handlers/function'; -import ObjectHandler from './route-handlers/object'; -import GetShorthandHandler from './route-handlers/shorthands/get'; -import PostShorthandHandler from './route-handlers/shorthands/post'; -import PutShorthandHandler from './route-handlers/shorthands/put'; -import DeleteShorthandHandler from './route-handlers/shorthands/delete'; -import HeadShorthandHandler from './route-handlers/shorthands/head'; +import RouteHandler from '@miragejs/server/lib/route-handler'; +export * from '@miragejs/server/lib/route-handler'; -const DEFAULT_CODES = { get: 200, put: 204, post: 201, 'delete': 204 }; - -function createHandler({ verb, schema, serializerOrRegistry, path, rawHandler, options }) { - let handler; - let args = [schema, serializerOrRegistry, rawHandler, path, options]; - let type = typeof rawHandler; - - if (type === 'function') { - handler = new FunctionHandler(...args); - } else if (type === 'object' && rawHandler) { - handler = new ObjectHandler(...args); - } else if (verb === 'get') { - handler = new GetShorthandHandler(...args); - } else if (verb === 'post') { - handler = new PostShorthandHandler(...args); - } else if (verb === 'put' || verb === 'patch') { - handler = new PutShorthandHandler(...args); - } else if (verb === 'delete') { - handler = new DeleteShorthandHandler(...args); - } else if (verb === 'head') { - handler = new HeadShorthandHandler(...args); - } - return handler; -} - -/** - * @hide - */ -export default class RouteHandler { - - constructor({ schema, verb, rawHandler, customizedCode, options, path, serializerOrRegistry }) { - this.verb = verb; - this.customizedCode = customizedCode; - this.serializerOrRegistry = serializerOrRegistry; - this.handler = createHandler({ verb, schema, path, serializerOrRegistry, rawHandler, options }); - } - - handle(request) { - return this._getMirageResponseForRequest(request) - .then(mirageResponse => this.serialize(mirageResponse, request)) - .then(serializedMirageResponse => { - return serializedMirageResponse.toRackResponse(); - }); - } - - _getMirageResponseForRequest(request) { - let result; - try { - /* - We need to do this for the #serialize convenience method. Probably is - a better way. - */ - if (this.handler instanceof FunctionHandler) { - this.handler.setRequest(request); - } - - result = this.handler.handle(request); - } catch(e) { - if (e instanceof MirageError) { - result = new Response(500, {}, e); - - } else { - let message = e.message || e; - - result = new Response(500, {}, { - message, - stack: `Mirage: Your ${request.method} handler for the url ${request.url} threw an error:\n\n${e.stack || e}` - }); - } - } - - return this._toMirageResponse(result); - } - - _toMirageResponse(result) { - let mirageResponse; - - return new Promise((resolve, reject) => { - Promise.resolve(result) - .then(response => { - if (response instanceof Response) { - mirageResponse = result; - } else { - let code = this._getCodeForResponse(response); - mirageResponse = new Response(code, {}, response); - } - resolve(mirageResponse); - }) - .catch(reject); - }); - } - - _getCodeForResponse(response) { - let code; - if (this.customizedCode) { - code = this.customizedCode; - } else { - code = DEFAULT_CODES[this.verb]; - // Returning any data for a 204 is invalid - if (code === 204 && response !== undefined && response !== '') { - code = 200; - } - } - return code; - } - - serialize(mirageResponse, request) { - mirageResponse.data = this.serializerOrRegistry.serialize(mirageResponse.data, request); - - return mirageResponse; - } -} +export default RouteHandler; diff --git a/addon/serializer-registry.js b/addon/serializer-registry.js index 2ae885f39..f32643a3c 100644 --- a/addon/serializer-registry.js +++ b/addon/serializer-registry.js @@ -1,95 +1,4 @@ -import Model from 'ember-cli-mirage/orm/model'; -import Collection from 'ember-cli-mirage/orm/collection'; -import PolymorphicCollection from 'ember-cli-mirage/orm/polymorphic-collection'; -import Serializer from 'ember-cli-mirage/serializer'; -import JsonApiSerializer from 'ember-cli-mirage/serializers/json-api-serializer'; -import { pluralize, camelize } from './utils/inflector'; -import assert from './assert'; +import SerializerRegistry from '@miragejs/server/lib/serializer-registry'; +export * from '@miragejs/server/lib/serializer-registry'; -import _assign from 'lodash/assign'; - -/** - * @hide - */ -export default class SerializerRegistry { - - constructor(schema, serializerMap = {}) { - this.schema = schema; - this._serializerMap = serializerMap; - } - - normalize(payload, modelName) { - return this.serializerFor(modelName).normalize(payload); - } - - serialize(response, request) { - this.request = request; - - if (this._isModelOrCollection(response)) { - let serializer = this.serializerFor(response.modelName); - - return serializer.serialize(response, request); - - } else if (Array.isArray(response) && response.filter(this._isCollection).length) { - return response.reduce((json, collection) => { - let serializer = this.serializerFor(collection.modelName); - - if (serializer.embed) { - json[pluralize(collection.modelName)] = serializer.serialize(collection, request); - } else { - json = _assign(json, serializer.serialize(collection, request)); - } - - return json; - }, {}); - - } else { - return response; - } - } - - serializerFor(type, { explicit = false } = {}) { - let SerializerForResponse = type && this._serializerMap && (this._serializerMap[camelize(type)]); - - if (explicit) { - assert(!!SerializerForResponse, `You passed in ${type} as an explicit serializer type but that serializer doesn't exist. Try running \`ember g mirage-serializer ${type}\`.`); - } else { - SerializerForResponse = SerializerForResponse || this._serializerMap.application || Serializer; - - assert( - !SerializerForResponse - || (SerializerForResponse.prototype.embed) - || (SerializerForResponse.prototype.root) - || (new SerializerForResponse() instanceof JsonApiSerializer), - 'You cannot have a serializer that sideloads (embed: false) and disables the root (root: false).' - ); - } - - return new SerializerForResponse(this, type, this.request); - } - - _isModel(object) { - return object instanceof Model; - } - - _isCollection(object) { - return object instanceof Collection || object instanceof PolymorphicCollection; - } - - _isModelOrCollection(object) { - return this._isModel(object) || this._isCollection(object); - } - - registerSerializers(newSerializerMaps) { - let currentSerializerMap = this._serializerMap || {}; - this._serializerMap = _assign( - currentSerializerMap, - newSerializerMaps - ); - } - - getCoalescedIds(request, modelName) { - return this.serializerFor(modelName).getCoalescedIds(request); - } - -} +export default SerializerRegistry; diff --git a/addon/serializer.js b/addon/serializer.js index d75d13548..eae7a3ece 100644 --- a/addon/serializer.js +++ b/addon/serializer.js @@ -1,1113 +1,4 @@ -import Model from './orm/model'; -import Collection from './orm/collection'; -import PolymorphicCollection from './orm/polymorphic-collection'; -import extend from './utils/extend'; -import { singularize, pluralize, camelize } from './utils/inflector'; -import assert from './assert'; -import _isFunction from 'lodash/isFunction'; -import _isArray from 'lodash/isArray'; -import _isEmpty from 'lodash/isEmpty'; -import _includes from 'lodash/includes'; -import _assign from 'lodash/assign'; -import _get from 'lodash/get'; -import _flatten from 'lodash/flatten'; -import _compact from 'lodash/compact'; -import _uniqBy from 'lodash/uniqBy'; - -/** - Serializers are responsible for formatting your route handler's response. - - The application serializer (`/mirage/serializers/application.js`) will apply to every response. To make specific customizations, define per-model serializers (e.g. `/mirage/serializers/blog-post.js`). - - Any Model or Collection returned from a route handler will pass through the serializer layer. Highest priority will be given to a model-specific serializer, then the application serializer, then the default serializer. - - Mirage ships with three named serializers: - - - **JSONAPISerializer**, to simulate JSON:API compliant servers: - - ```js - // mirage/serializers/application.js - import { JSONAPISerializer } from 'ember-cli-mirage'; - - export default JSONAPISerializer; - ``` - - - **ActiveModelSerializer**, to fake Rails backends that use AMS-style responses: - - ```js - // mirage/serializers/application.js - import { ActiveModelSerializer } from 'ember-cli-mirage'; - - export default ActiveModelSerializer; - ``` - - - **RestSerializer**, to fake backends that match Ember Data's RestSerializer expected response format: - - ```js - // mirage/serializers/application.js - import { RestSerializer } from 'ember-cli-mirage'; - - export default RestSerializer; - ``` - - Additionally, Mirage has a basic Serializer class which you can customize using the hooks documented below: - - ```js - // mirage/serializers/application.js - import { Serializer } from 'ember-cli-mirage'; - - export default Serializer; - ``` - - When writing model-specific serializers, remember to extend from your application serializer: - - ```js - // mirage/serializers/blog-post.js - import ApplicationSerializer from './application'; - - export default ApplicationSerializer.extend({ - include: ['comments'] - }); - ``` - - @class Serializer - @constructor - @public -*/ -class Serializer { - - constructor(registry, type, request = {}) { - this.registry = registry; - this.type = type; - this.request = request; - - /** - Use this property on a model serializer to whitelist attributes that will be used in your JSON payload. - - For example, if you had a `blog-post` model in your database that looked like - - ``` - { - id: 1, - title: 'Lorem ipsum', - createdAt: '2014-01-01 10:00:00', - updatedAt: '2014-01-03 11:42:12' - } - ``` - - and you just wanted `id` and `title`, you could write - - ```js - // mirage/serializers/blog-post.js - - export default Serializer.extend({ - attrs: ['id', 'title'] - }); - ``` - - and the payload would look like - - ``` - { - id: 1, - title: 'Lorem ipsum' - } - ``` - - @property attrs - @public - */ - this.attrs = this.attrs || undefined; // this is just here so I can add the doc comment. Better way? - - /** - Use this property on a model serializer to specify related models you'd like to include in your JSON payload. (These can be considered default server-side includes.) - - For example, if you had an `author` with many `blog-post`s: - - ```js - // mirage/models/author.js - export default Model.extend({ - blogPosts: hasMany() - }); - ``` - - and you wanted to sideload these, specify so in the `include` key: - - ```js - // mirage/serializers/author.js - export default Serializer.extend({ - include: ['blogPosts'] - }); - ``` - - Now a response to a request for an author would look like this: - - ``` - GET /authors/1 - - { - author: { - id: 1, - name: 'Link', - blogPostIds: [1, 2] - }, - blogPosts: [ - {id: 1, authorId: 1, title: 'Lorem'}, - {id: 2, authorId: 1, title: 'Ipsum'} - ] - } - ``` - - You can also define `include` as a function so it can be determined dynamically: - - ```js - // mirage/serializers/author.js - export default Serializer.extend({ - include: function(request) { - if (request.queryParams.posts) { - return ['blogPosts']; - } else { - return []; - } - } - }); - ``` - - **Query param includes for JSONAPISerializer** - - The JSONAPISerializer supports the use of `include` query parameter to return compound documents out of the box. - - For versions of Ember Data before 2.5, you'll need to add `'ds-finder-include': true` to your app FEATURES object: - - ```js - // config/environment.js - var ENV = { - EmberENV: { - FEATURES: { - 'ds-finder-include': true - } - } - }; - ``` - - To tell Mirage to sideload blogPosts when we find all authors we can do the following: - - ```js - // routes/authors.js - export default Ember.Route.extend({ - model() { - return this.store.findAll('author', { include: 'blogPosts' }); - } - } - ``` - - The above will make a GET request to `/api/authors?include=blogPosts`, and then the appropriate Mirage route handler will be invoked. When it comes time to serialize the response, the JSONAPISerializer will inspect the query params of the request, see that the blogPosts relationship is present, and then proceed as if this relationship was specified directly in the include: [] array on the serializer itself. - - Note that, in accordance with the spec, Mirage gives precedence to an ?include query param over a default include: [] array that you might have specified directly on the serializer. Default includes will still be in effect, however, if a request does not have an ?include query param. - - Also note that default includes specified with the `include: []` array can only take a single model; they cannot take dot-separated paths to nested relationships. - - If you'd like to set a default dot-separated (nested) include path for a resource, you have to do it at the route level by setting a default value for `request.queryParams`: - - ```js - this.get('/users', function(schema, request) => { - request.queryParams = request.queryParams || {}; - if (!request.queryParams.include) { - request.queryParams.include = 'blog-posts.comments'; - } - - // rest of route handler logic - }); - ``` - - @property include - @public - */ - this.include = this.include || []; // this is just here so I can add the doc comment. Better way? - - /** - Set whether your JSON response should have a root key in it. - - *Doesn't apply to JSONAPISerializer.* - - Defaults to true, so a request for an author looks like: - - ``` - GET /authors/1 - - { - author: { - id: 1, - name: 'Link' - } - } - ``` - - Setting `root` to false disables this: - - ```js - // mirage/serializers/application.js - export default Serializer.extend({ - root: false - }); - ``` - - Now the response looks like: - - ``` - GET /authors/1 - - { - id: 1, - name: 'Link' - } - ``` - - @property root - @public - */ - this.root = this.root || undefined; // this is just here so I can add the doc comment. Better way? - - /** - Set whether related models should be embedded or sideloaded. - - *Doesn't apply to JSONAPISerializer.* - - By default this false, so relationships are sideloaded: - - ``` - GET /authors/1 - - { - author: { - id: 1, - name: 'Link', - blogPostIds: [1, 2] - }, - blogPosts: [ - { id: 1, authorId: 1, title: 'Lorem' }, - { id: 2, authorId: 1, title: 'Ipsum' } - ] - } - ``` - - Setting `embed` to true will embed related records: - - ```js - // mirage/serializers/application.js - export default Serializer.extend({ - embed: true - }); - ``` - - Now the response looks like: - - ``` - GET /authors/1 - - { - author: { - id: 1, - name: 'Link', - blogPosts: [ - { id: 1, authorId: 1, title: 'Lorem' }, - { id: 2, authorId: 1, title: 'Ipsum' } - ] - } - } - ``` - */ - this.embed = this.embed || undefined; // this is just here so I can add the doc comment. Better way? - - /** - Use this to define how your serializer handles serializing relationship keys. It can take one of three values: - - - `included`, which is the default, will serialize the ids of a relationship if that relationship is included (sideloaded) along with the model or collection in the response - - `always` will always serialize the ids of all relationships for the model or collection in the response - - `never` will never serialize the ids of relationships for the model or collection in the response - - _Note: this feature was added in 0.2.2._ - - @property serializeIds - @public - */ - this.serializeIds = this.serializeIds || undefined; // this is just here so I can add the doc comment. Better way? - } - - /** - Override this method to implement your own custom serialize function. *response* is whatever was returned from your route handler, and *request* is the Pretender request object. - - Returns a plain JavaScript object or array, which Mirage uses as the response data to your Ember app's XHR request. - - You can also override this method, call super, and manipulate the data before Mirage responds with it. This is a great place to add metadata, or for one-off operations that don't fit neatly into any of Mirage's other abstractions: - - ```js - serialize(object, request) { - // This is how to call super, as Mirage borrows [Backbone's implementation of extend](http://backbonejs.org/#Model-extend) - let json = Serializer.prototype.serialize.apply(this, arguments); - - // Add metadata, sort parts of the response, etc. - - return json; - } - ``` - - @param primaryResource - @param request - @return { Object } the json response - */ - serialize(primaryResource /* , request */) { - return this.buildPayload(primaryResource); - } - - /** - This method is used by the POST and PUT shorthands. These shorthands expect a valid JSON:API document as part of the request, so that they know how to create or update the appropriate resouce. The *normalize* method allows you to transform your request body into a JSON:API document, which lets you take advantage of the shorthands when you otherwise may not be able to. - - Note that this method is a noop if you're using JSON:API already, since request payloads sent along with POST and PUT requests will already be in the correct format. - - Take a look at the included [ActiveModelSerializer's normalize method](https://github.com/samselikoff/ember-cli-mirage/blob/master/addon/serializers/active-model-serializer.js#L22) for an example. - - @method normalize - @param json - @public - */ - normalize(json) { - return json; - } - - buildPayload(primaryResource, toInclude, didSerialize, json) { - if (!primaryResource && _isEmpty(toInclude)) { - return json; - - } else if (primaryResource) { - let [resourceHash, newIncludes] = this.getHashForPrimaryResource(primaryResource); - let newDidSerialize = (this.isCollection(primaryResource) ? primaryResource.models : [primaryResource]); - - return this.buildPayload(undefined, newIncludes, newDidSerialize, resourceHash); - - } else { - let nextIncludedResource = toInclude.shift(); - let [resourceHash, newIncludes] = this.getHashForIncludedResource(nextIncludedResource); - - let newToInclude = newIncludes - .filter((resource) => { - return !_includes(didSerialize.map((m) => m.toString()), resource.toString()); - }) - .concat(toInclude); - let newDidSerialize = (this.isCollection(nextIncludedResource) ? nextIncludedResource.models : [nextIncludedResource]) - .concat(didSerialize); - let newJson = this.mergePayloads(json, resourceHash); - - return this.buildPayload(undefined, newToInclude, newDidSerialize, newJson); - } - } - - getHashForPrimaryResource(resource) { - let [hash, addToIncludes] = this.getHashForResource(resource); - let hashWithRoot; - - if (this.root) { - assert( - !(resource instanceof PolymorphicCollection), - `The base Serializer class cannot serialize a top-level PolymorphicCollection when root is true, since PolymorphicCollections have no type.` - ); - - let serializer = this.serializerFor(resource.modelName); - let rootKey = serializer.keyForResource(resource); - hashWithRoot = { [rootKey]: hash }; - } else { - hashWithRoot = hash; - } - - return [hashWithRoot, addToIncludes]; - } - - getHashForIncludedResource(resource) { - let hashWithRoot, addToIncludes; - - if (resource instanceof PolymorphicCollection) { - hashWithRoot = {}; - addToIncludes = resource.models; - - } else { - let serializer = this.serializerFor(resource.modelName); - let [ hash, newModels ] = serializer.getHashForResource(resource); - - // Included resources always have a root, and are always pushed to an array. - let rootKey = serializer.keyForRelationship(resource.modelName); - hashWithRoot = _isArray(hash) ? { [rootKey]: hash } : { [rootKey]: [hash] }; - addToIncludes = newModels; - } - - return [ hashWithRoot, addToIncludes ]; - } - - getHashForResource(resource, removeForeignKeys = false, didSerialize = {}, lookupSerializer = false) { - let hash, - serializer; - - if (!lookupSerializer) { - serializer = this; // this is used for embedded responses - } - - // PolymorphicCollection lacks a modelName, but is dealt with in the map - // by looking up the serializer on a per-model basis - if (lookupSerializer && resource.modelName) { - serializer = this.serializerFor(resource.modelName); - } - - if (this.isModel(resource)) { - hash = serializer._hashForModel(resource, removeForeignKeys, didSerialize); - } else { - hash = resource.models.map((m) => { - let modelSerializer = serializer; - - if (!modelSerializer) { - // Can't get here if lookupSerializer is false, so look it up - modelSerializer = this.serializerFor(m.modelName); - } - - return modelSerializer._hashForModel(m, removeForeignKeys, didSerialize); - }); - } - - if (this.embed) { - return [hash, []]; - - } else { - let addToIncludes = _uniqBy( - _compact( - _flatten( - serializer.getKeysForIncluded().map(key => { - if (this.isCollection(resource)) { - return resource.models.map(m => m[key]); - } else { - return resource[key]; - } - }) - ) - ), - m => m.toString() - ); - return [hash, addToIncludes]; - } - } - - /* - Merges new resource hash into json. If json already has root key, - pushes value of resourceHash onto that key. - - For example, - - json = { - post: { id: 1, title: 'Lorem Ipsum', comment_ids: [1, 3] }, - comments: [ - { id: 1, text: 'foo' } - ] - }; - - resourceHash = { - comments: [ - { id: 2, text: 'bar' } - ] - }; - - would yield - - { - post: { id: 1, title: 'Lorem Ipsum', comment_ids: [1, 3] }, - comments: [ - { id: 1, text: 'foo' }, - { id: 2, text: 'bar' } - ] - }; - - */ - mergePayloads(json, resourceHash) { - let newJson; - let [resourceHashKey] = Object.keys(resourceHash); - - if (json[resourceHashKey]) { - newJson = json; - newJson[resourceHashKey] = json[resourceHashKey].concat(resourceHash[resourceHashKey]); - } else { - newJson = _assign(json, resourceHash); - } - - return newJson; - } - - keyForResource(resource) { - let { modelName } = resource; - return this.isModel(resource) ? this.keyForModel(modelName) : this.keyForCollection(modelName); - } - - /** - Used to define a custom key when serializing a primary model of modelName *modelName*. For example, the default Serializer will return something like the following: - - ``` - GET /blogPosts/1 - - { - blogPost: { - id: 1, - title: 'Lorem ipsum' - } - } - ``` - - If your API uses hyphenated keys, you could overwrite `keyForModel`: - - ```js - // serializers/application.js - export default Serializer.extend({ - keyForModel(modelName) { - return Ember.String.dasherize(modelName); - } - }); - ``` - - Now the response will look like - - ``` - { - 'blog-post': { - id: 1, - title: 'Lorem ipsum' - } - } - ``` - - @method keyForModel - @param modelName - @public - */ - keyForModel(modelName) { - return camelize(modelName); - } - - /** - Used to customize the key when serializing a primary collection. By default this pluralizes the return value of `keyForModel`. - - For example, by default the following request may look like: - - ``` - GET /blogPosts - - { - blogPosts: [ - { - id: 1, - title: 'Lorem ipsum' - }, - ... - ] - } - ``` - - If your API hyphenates keys, you could overwrite `keyForCollection`: - - ```js - // serializers/application.js - const { dasherize, pluralize } = Ember.String; - - export default Serializer.extend({ - keyForCollection(modelName) { - return pluralize(dasherize(modelName)); - } - }); - ``` - - Now the response would look like: - - ``` - { - 'blog-posts': [ - { - id: 1, - title: 'Lorem ipsum' - }, - ... - ] - } - ``` - - @method keyForCollection - @param modelName - @public - */ - keyForCollection(modelName) { - return pluralize(this.keyForModel(modelName)); - } - - _hashForModel(model, removeForeignKeys, didSerialize = {}) { - let attrs = this._attrsForModel(model); - - if (removeForeignKeys) { - model.fks.forEach((fk) => { - delete attrs[fk]; - }); - } - - if (this.embed) { - let newDidSerialize = _assign({}, didSerialize); - newDidSerialize[model.modelName] = newDidSerialize[model.modelName] || {}; - newDidSerialize[model.modelName][model.id] = true; - - this.getKeysForIncluded().forEach((key) => { - let associatedResource = model[key]; - if (associatedResource && !_get(newDidSerialize, `${associatedResource.modelName}.${associatedResource.id}`)) { - let [ associatedResourceHash ] = this.getHashForResource(associatedResource, true, newDidSerialize, true); - let formattedKey = this.keyForEmbeddedRelationship(key); - attrs[formattedKey] = associatedResourceHash; - - if (this.isModel(associatedResource)) { - let fk = `${camelize(key)}Id`; - delete attrs[fk]; - } - } - }); - - return attrs; - } else { - return this._maybeAddAssociationIds(model, attrs); - } - } - - /** - @method _attrsForModel - @param model - @private - @hide - */ - _attrsForModel(model) { - let attrs = {}; - - if (this.attrs) { - attrs = this.attrs.reduce((memo, attr) => { - memo[attr] = model[attr]; - return memo; - }, {}); - } else { - attrs = _assign(attrs, model.attrs); - } - - // Remove fks - model.fks.forEach(key => delete attrs[key]); - - return this._formatAttributeKeys(attrs); - } - - /** - @method _maybeAddAssociationIds - @param model - @param attrs - @private - @hide - */ - _maybeAddAssociationIds(model, attrs) { - let newHash = _assign({}, attrs); - - if (this.serializeIds === 'always') { - model.associationKeys.forEach((key) => { - let resource = model[key]; - - if (this.isCollection(resource)) { - let formattedKey = this.keyForRelationshipIds(key); - newHash[formattedKey] = model[`${singularize(key)}Ids`]; - - } else if (resource) { - let formattedKey = this.keyForForeignKey(key); - newHash[formattedKey] = model[`${key}Id`]; - } - }); - - } else if (this.serializeIds === 'included') { - this.getKeysForIncluded().forEach((key) => { - let resource = model[key]; - let association = model.associationFor(key); - - if (this.isCollection(resource)) { - let formattedKey = this.keyForRelationshipIds(key); - - newHash[formattedKey] = model[`${singularize(key)}Ids`]; - - } else if (this.isModel(resource) && association.isPolymorphic) { - let formattedTypeKey = this.keyForPolymorphicForeignKeyType(key); - let formattedIdKey = this.keyForPolymorphicForeignKeyId(key); - - newHash[formattedTypeKey] = model[`${key}Id`].type; - newHash[formattedIdKey] = model[`${key}Id`].id; - - } else if (this.isModel(resource)) { - let formattedKey = this.keyForForeignKey(key); - - newHash[formattedKey] = model[`${key}Id`]; - } - }); - } - - return newHash; - } - - /** - Used to customize how a model's attribute is formatted in your JSON payload. - - By default, model attributes are camelCase: - - ``` - GET /authors/1 - - { - author: { - firstName: 'Link', - lastName: 'The WoodElf' - } - } - ``` - - If your API expects snake case, you could write the following: - - ```js - // serializers/application.js - const { underscore } = Ember.String; - - export default Serializer.extend({ - keyForAttribute(attr) { - return underscore(attr); - } - }); - ``` - - Now the response would look like: - - ``` - { - author: { - first_name: 'Link', - last_name: 'The WoodElf' - } - } - ``` - - @method keyForAttribute - @param attr - @public - */ - keyForAttribute(attr) { - return attr; - } - - /** - Use this hook to format the key for collections related to this model. *modelName* is the named parameter for the relationship. - - For example, if you're serializing an `author` that - sideloads many `blogPosts`, the default response will look like: - - ``` - { - author: {...}, - blogPosts: [...] - } - ``` - - Overwrite `keyForRelationship` to format this key: - - ```js - // serializers/application.js - const { underscore } = Ember.String; - - export default Serializer.extend({ - keyForRelationship(modelName) { - return underscore(modelName); - } - }); - ``` - - Now the response will look like this: - - ``` - { - author: {...}, - blog_posts: [...] - } - ``` - - @method keyForRelationship - @param modelName - @public - */ - keyForRelationship(modelName) { - return camelize(pluralize(modelName)); - } - - /** - Like `keyForRelationship`, but for embedded relationships. - - @method keyForEmbeddedRelationship - @param attributeName - @public - */ - keyForEmbeddedRelationship(attributeName) { - return camelize(attributeName); - } - - /** - Use this hook to format the key for the IDS of a `hasMany` relationship - in this model's JSON representation. - - For example, if you're serializing an `author` that - sideloads many `blogPosts`, by default your `author` JSON would include a `blogPostIds` key: - - ``` - { - author: { - id: 1, - blogPostIds: [1, 2, 3] - }, - blogPosts: [...] - } - ``` - - Overwrite `keyForRelationshipIds` to format this key: - - ```js - // serializers/application.js - const { underscore } = Ember.String; - - export default Serializer.extend({ - keyForRelationshipIds(relationship) { - return underscore(relationship) + '_ids'; - } - }); - ``` - - Now the response will look like: - - ``` - { - author: { - id: 1, - blog_post_ids: [1, 2, 3] - }, - blogPosts: [...] - } - ``` - - @method keyForRelationshipIds - @param modelName - @public - */ - keyForRelationshipIds(relationshipName) { - return `${singularize(camelize(relationshipName))}Ids`; - } - - /** - Like `keyForRelationshipIds`, but for `belongsTo` relationships. - - For example, if you're serializing a `blogPost` that sideloads one `author`, - your `blogPost` JSON would include a `authorId` key: - - ``` - { - blogPost: { - id: 1, - authorId: 1 - }, - author: ... - } - ``` - - Overwrite `keyForForeignKey` to format this key: - - ```js - // serializers/application.js - const { underscore } = Ember.String; - - export default Serializer.extend({ - keyForForeignKey(relationshipName) { - return underscore(relationshipName) + '_id'; - } - }); - ``` - - Now the response will look like: - - ```js - { - blogPost: { - id: 1, - author_id: 1 - }, - author: ... - } - ``` - - @method keyForForeignKey - @param relationshipName - @public - */ - keyForForeignKey(relationshipName) { - return `${camelize(relationshipName)}Id`; - } - - /** - Polymorphic relationships are represented with type-id pairs. - - Given the following model - - ```js - // mirage/models/comment.js - export default Mirage.Model.extend({ - commentable: belongsTo({ polymorphic: true }) - }); - ``` - - the default Serializer would produce - - ```js - { - comment: { - id: 1, - commentableType: 'post', - commentableId: '1' - } - } - ``` - - This hook controls how the `id` field (`commentableId` in the above example) - is serialized. By default it camelizes the relationship and adds `Id` as a suffix. - - @method keyForPolymorphicForeignKeyId - @param {String} relationshipName - @return {String} - @public - */ - keyForPolymorphicForeignKeyId(relationshipName) { - return `${camelize(relationshipName)}Id`; - } - - /** - Polymorphic relationships are represented with type-id pairs. - - Given the following model - - ```js - // mirage/models/comment.js - export default Mirage.Model.extend({ - commentable: belongsTo({ polymorphic: true }) - }); - ``` - - the default Serializer would produce - - ```js - { - comment: { - id: 1, - commentableType: 'post', - commentableId: '1' - } - } - ``` - - This hook controls how the `type` field (`commentableType` in the above example) - is serialized. By default it camelizes the relationship and adds `Type` as a suffix. - - @method keyForPolymorphicForeignKeyType - @param {String} relationshipName - @return {String} - @public - */ - keyForPolymorphicForeignKeyType(relationshipName) { - return `${camelize(relationshipName)}Type`; - } - - /** - @method isModel - @param object - @return {Boolean} - @public - @hide - */ - isModel(object) { - return object instanceof Model; - } - - /** - @method isCollection - @param object - @return {Boolean} - @public - @hide - */ - isCollection(object) { - return (object instanceof Collection) || (object instanceof PolymorphicCollection); - } - - /** - @method isModelOrCollection - @param object - @return {Boolean} - @public - @hide - */ - isModelOrCollection(object) { - return this.isModel(object) || this.isCollection(object); - } - - /** - @method serializerFor - @param type - @public - @hide - */ - serializerFor(type) { - return this.registry.serializerFor(type); - } - - getKeysForIncluded() { - return _isFunction(this.include) ? this.include(this.request) : this.include; - } - - /** - Foo bar. - - @property schema - @public - @hide - */ - get schema() { - return this.registry.schema; - } - - /** - @method _formatAttributeKeys - @param attrs - @private - @hide - */ - _formatAttributeKeys(attrs) { - let formattedAttrs = {}; - - for (let key in attrs) { - let formattedKey = this.keyForAttribute(key); - formattedAttrs[formattedKey] = attrs[key]; - } - - return formattedAttrs; - } - - getCoalescedIds(/* request */) { - } -} - -// Defaults -Serializer.prototype.include = []; -Serializer.prototype.root = true; -Serializer.prototype.embed = false; -Serializer.prototype.serializeIds = 'included'; // can be 'included', 'always', or 'never' - -Serializer.extend = extend; +import Serializer from '@miragejs/server/lib/serializer'; +export * from '@miragejs/server/lib/serializer'; export default Serializer; diff --git a/addon/server.js b/addon/server.js index a52a1d37b..a689cf298 100644 --- a/addon/server.js +++ b/addon/server.js @@ -1,1069 +1,4 @@ -/* eslint no-console: 0 */ +import Server from '@miragejs/server/lib/server'; +export * from '@miragejs/server/lib/server'; -import { singularize, pluralize, camelize } from './utils/inflector'; -import { toCollectionName, toInternalCollectionName } from 'ember-cli-mirage/utils/normalize-name'; -import { getModels } from './ember-data'; -import { hasEmberData } from './utils/ember-data'; -import isAssociation from 'ember-cli-mirage/utils/is-association'; -import Pretender from 'pretender'; -import Db from './db'; -import Schema from './orm/schema'; -import assert from './assert'; -import SerializerRegistry from './serializer-registry'; -import RouteHandler from './route-handler'; -import BelongsTo from './orm/associations/belongs-to'; - -import _pick from 'lodash/pick'; -import _assign from 'lodash/assign'; -import _find from 'lodash/find'; -import _isPlainObject from 'lodash/isPlainObject'; -import _isInteger from 'lodash/isInteger'; - -/** - * Creates a new Pretender instance. - * - * @method createPretender - * @param {Server} server - * @return {Object} A new Pretender instance. - * @public - */ -function createPretender(server) { - return new Pretender(function() { - this.passthroughRequest = function(verb, path, request) { - if (server.shouldLog()) { - console.log(`Passthrough request: ${verb.toUpperCase()} ${request.url}`); - } - }; - - this.handledRequest = function(verb, path, request) { - if (server.shouldLog()) { - console.groupCollapsed( - `Mirage: [${request.status}] ${verb.toUpperCase()} ${request.url}` - ); - let { requestBody, responseText } = request; - let loggedRequest, loggedResponse; - - try { - loggedRequest = JSON.parse(requestBody); - } catch(e) { - loggedRequest = requestBody; - } - - try { - loggedResponse = JSON.parse(responseText); - } catch(e) { - loggedResponse = responseText; - } - - console.log({ - request: loggedRequest, - response: loggedResponse, - raw: request - }); - console.groupEnd(); - } - }; - - this.unhandledRequest = function(verb, path) { - path = decodeURI(path); - assert( - `Your Ember app tried to ${verb} '${path}', but there was no route defined to handle this request. Define a route that matches this path in your mirage/config.js file. Did you forget to add your namespace?` - ); - }; - }, { trackRequests: server.shouldTrackRequests() }); -} - -const defaultRouteOptions = { - coalesce: false, - timing: undefined -}; - -/** - @hide -*/ -const defaultPassthroughs = [ - 'http://localhost:0/chromecheckurl', // mobile chrome - 'http://localhost:30820/socket.io' // electron -]; - -/** - @hide -*/ -export { defaultPassthroughs }; - -/** - * Determine if the object contains a valid option. - * - * @method isOption - * @param {Object} option An object with one option value pair. - * @return {Boolean} True if option is a valid option, false otherwise. - * @private - */ -function isOption(option) { - if (!option || typeof option !== 'object') { - return false; - } - - let allOptions = Object.keys(defaultRouteOptions); - let optionKeys = Object.keys(option); - for (let i = 0; i < optionKeys.length; i++) { - let key = optionKeys[i]; - if (allOptions.indexOf(key) > -1) { - return true; - } - } - return false; -} - -/** - * Extract arguments for a route. - * - * @method extractRouteArguments - * @param {Array} args Of the form [options], [object, code], [function, code] - * [shorthand, options], [shorthand, code, options] - * @return {Array} [handler (i.e. the function, object or shorthand), code, - * options]. - * @private - */ -function extractRouteArguments(args) { - let [ lastArg ] = args.splice(-1); - if (isOption(lastArg)) { - lastArg = _assign({}, defaultRouteOptions, lastArg); - } else { - args.push(lastArg); - lastArg = defaultRouteOptions; - } - let t = 2 - args.length; - while (t-- > 0) { - args.push(undefined); - } - args.push(lastArg); - return args; -} - -/** - The Mirage server. - - Note that `this` within your config function in `mirage/config.js` refers to the server instance, which is the same instance that `server` refers to in your tests. - - @class Server - @public -*/ -export default class Server { - - constructor(options = {}) { - this.config(options); - - /** - Returns the Mirage Db instance. - - @property db - @return Db - */ - this.db = this.db || undefined; - - /** - Returns the Mirage Schema (ORM) instance. - - @property schema - @return Schema - */ - this.schema = this.schema || undefined; - } - - config(config = {}) { - let didOverrideConfig = (config.environment && (this.environment && (this.environment !== config.environment))); - assert(!didOverrideConfig, - 'You cannot modify Mirage\'s environment once the server is created'); - this.environment = config.environment || this.environment || 'development'; - - this._config = config; - - /** - Set the base namespace used for all routes defined with `get`, `post`, `put` or `del`. - - For example, - - ```js - // mirage/config.js - export default function() { - this.namespace = '/api'; - - // this route will handle the URL '/api/contacts' - this.get('/contacts', 'contacts'); - }; - ``` - - Note that only routes defined after `this.namespace` are affected. This is useful if you have a few one-off routes that you don't want under your namespace: - - ```js - // mirage/config.js - export default function() { - - // this route handles /auth - this.get('/auth', function() { ...}); - - this.namespace = '/api'; - // this route will handle the URL '/api/contacts' - this.get('/contacts', 'contacts'); - }; - ``` - - If your Ember app is loaded from the filesystem vs. a server (e.g. via Cordova or Electron vs. `ember s` or `https://yourhost.com/`), you will need to explicitly define a namespace. Likely values are `/` (if requests are made with relative paths) or `https://yourhost.com/api/...` (if requests are made to a defined server). - - For a sample implementation leveraging a configured API host & namespace, check out [this issue comment](https://github.com/samselikoff/ember-cli-mirage/issues/497#issuecomment-183458721). - - @property namespace - @type String - @public - */ - this.namespace = this.namespace || config.namespace || ''; - - /** - Sets a string to prefix all route handler URLs with. - - Useful if your Ember app makes API requests to a different port. - - ```js - // mirage/config.js - export default function() { - this.urlPrefix = 'http://localhost:8080' - }; - ``` - */ - this.urlPrefix = this.urlPrefix || config.urlPrefix || ''; - - /** - Set the number of milliseconds for the the Server's response time. - - By default there's a 400ms delay during development, and 0 delay in testing (so your tests run fast). - - ```js - // mirage/config.js - export default function() { - this.timing = 400; // default - }; - ``` - - To set the timing for individual routes, see the `timing` option for route handlers. - - @property timing - @type Number - @public - */ - this.timing = this.timing || config.timing || 400; - - /** - Set to `true` or `false` to explicitly specify logging behavior. - - By default, server responses are logged in non-testing environments. Logging is disabled by default in testing, so as not to clutter CI test runner output. - - For example, to enable logging in tests, write the following: - - ```js - test('I can view all users', function() { - server.logging = true; - server.create('user'); - - visit('/users'); - // ... - }); - ``` - - You can also write a custom log message, using the [Pretender server's](#pretender) `handledRequest` hook. See [Mirage's default implementation](https://github.com/samselikoff/ember-cli-mirage/blob/2c31ad15a46e90b357a83b6896c6774fa42c6488/addon/server.js#L25) for an example. - - To override, - - ```js - // mirage/config.js - export default function() { - this.pretender.handledRequest = function(verb, path, request) { - let { responseText } = request; - // log request and response data - } - } - ``` - - @property logging - @return {Boolean} - @public - */ - this.logging = this.logging || undefined; - - /** - Export a named `testConfig` function to define routes that only apply in your test environment: - - ```js - // mirage/config.js - export default function() { - // normal config, shared across development + testing - } - - export function testConfig() { - // test-only config, does not apply to development - } - ``` - - This could be useful if you'd like to use Mirage in testing, but generally proxy to an actual API during development. As you develop, your frontend may be ahead of your API, in which case you'd work with the routes in the default config, and write your tests. Then, once your API implements the new endpoints, you can move the routes to your testConfig, so your tests still run, but Mirage doesn't interfere during development. - */ - this.testConfig = this.testConfig || undefined; - - this.trackRequests = config.trackRequests; - - this._defineRouteHandlerHelpers(); - - // Merge models from autogenerated Ember Data models with user defined models - if (hasEmberData && config.discoverEmberDataModels) { - let models = {}; - _assign(models, getModels(), config.models || {}); - config.models = models; - } - - if (this.db) { - this.db.registerIdentityManagers(config.identityManagers); - } else { - this.db = new Db(undefined, config.identityManagers); - } - - if (this.schema) { - this.schema.registerModels(config.models); - this.serializerOrRegistry.registerSerializers(config.serializers || {}); - } else { - this.schema = new Schema(this.db, config.models); - this.serializerOrRegistry = new SerializerRegistry(this.schema, config.serializers); - } - - let hasFactories = this._hasModulesOfType(config, 'factories'); - let hasDefaultScenario = config.scenarios && config.scenarios.hasOwnProperty('default'); - - let didOverridePretenderConfig = (config.trackRequests !== undefined) && this.pretender; - assert( - !didOverridePretenderConfig, - 'You cannot modify Pretender\'s request tracking once the server is created' - ); - - /** - Mirage uses [pretender.js](https://github.com/trek/pretender) as its xhttp interceptor. In your Mirage config, `this.pretender` refers to the actual Pretender instance, so any config options that work there will work here as well. - - ```js - // mirage/config.js - export default function() { - this.pretender.handledRequest = (verb, path, request) => { - console.log(`Your server responded to ${path}`); - } - }; - ``` - - Refer to [Pretender's docs](https://github.com/pretenderjs/pretender) if you want to change any options on your Pretender instance. - - @property pretender - @return {Object} The Pretender instance - @public - */ - this.pretender = this.pretender || config.pretender || createPretender(this); - - if (config.baseConfig) { - this.loadConfig(config.baseConfig); - } - - if (this.isTest()) { - if (config.testConfig) { - this.loadConfig(config.testConfig); - } - - window.server = this; // TODO: Better way to inject server into test env - } - - if (this.isTest() && hasFactories) { - this.loadFactories(config.factories); - } else if (!this.isTest() && hasDefaultScenario) { - this.loadFactories(config.factories); - config.scenarios.default(this); - } else { - this.loadFixtures(); - } - - if (config.useDefaultPassthroughs) { - this._configureDefaultPassthroughs(); - } - } - - /** - * Determines if the current environment is the testing environment. - * - * @method isTest - * @return {Boolean} True if the environment is 'test', false otherwise. - * @public - * @hide - */ - isTest() { - return this.environment === 'test'; - } - - /** - Determines if the server should log. - - @method shouldLog - @return The value of this.logging if defined, or false if in the testing environment, - true otherwise. - @public - @hide - */ - shouldLog() { - - return typeof this.logging !== 'undefined' ? this.logging : !this.isTest(); - } - - /** - * Determines if the server should track requests. - * - * @method shouldTrackRequests - * @return The value of this.trackRequests if defined, false otherwise. - * @public - * @hide - */ - shouldTrackRequests() { - return Boolean(this.trackRequests); - } - - /** - * Load the configuration given, setting timing to 0 if in the test - * environment. - * - * @method loadConfig - * @param {Object} config The configuration to load. - * @public - * @hide - */ - loadConfig(config) { - config.call(this); - this.timing = this.isTest() ? 0 : (this.timing || 0); - } - - /** - By default, if your Ember app makes a request that is not defined in your server config, Mirage will throw an error. You can use `passthrough` to whitelist requests, and allow them to pass through your Mirage server to the actual network layer. - - - - To ignore paths on your current host (as well as configured `namespace`), use a leading `/`: - - ```js - this.passthrough('/addresses'); - ``` - - You can also pass a list of paths, or call `passthrough` multiple times: - - ```js - this.passthrough('/addresses', '/contacts'); - this.passthrough('/something'); - this.passthrough('/else'); - ``` - - These lines will allow all HTTP verbs to pass through. If you want only certain verbs to pass through, pass an array as the last argument with the specified verbs: - - ```js - this.passthrough('/addresses', ['post']); - this.passthrough('/contacts', '/photos', ['get']); - ``` - - If you want all requests on the current domain to pass through, simply invoke the method with no arguments: - - ```js - this.passthrough(); - ``` - - Note again that the current namespace (i.e. any `namespace` property defined above this call) will be applied. - - You can also allow other-origin hosts to passthrough. If you use a fully-qualified domain name, the `namespace` property will be ignored. Use two * wildcards to match all requests under a path: - - ```js - this.passthrough('http://api.foo.bar/**'); - this.passthrough('http://api.twitter.com/v1/cards/**'); - ``` - - In versions of Pretender prior to 0.12, `passthrough` only worked with jQuery >= 2.x. As long as you're on Pretender@0.12 or higher, you should be all set. - - @method passthrough - @param {String} [...paths] Any numer of paths to whitelist - @param {Array} options Unused - @public - */ - passthrough(...paths) { - let verbs = ['get', 'post', 'put', 'delete', 'patch', 'options', 'head']; - let lastArg = paths[paths.length - 1]; - - if (paths.length === 0) { - // paths = ['http://localhost:7357']; - paths = ['/**', '/']; - } else if (Array.isArray(lastArg)) { - verbs = paths.pop(); - } - - verbs.forEach((verb) => { - paths.forEach((path) => { - let fullPath = this._getFullPath(path); - this.pretender[verb](fullPath, this.pretender.passthrough); - }); - }); - } - - /** - By default, all the data files under `/fixtures` will be loaded during testing if you don't have factories defined, and during development if you don't have `/scenarios/default.js` defined. You can use `loadFixtures()` to also load fixture files in either of these environments, in addition to using factories to seed your database. - - `server.loadFixtures()` loads all the files, and `server.loadFixtures(file1, file2...)` loads selective fixture files. - - For example, in a test you may want to start out with all your fixture data loaded: - - ```js - test('I can view the photos', function() { - server.loadFixtures(); - server.createList('photo', 10); - - visit('/'); - - andThen(() => { - equal( find('img').length, 10 ); - }); - }); - ``` - - or in development, you may want to load a few reference fixture files, and use factories to define the rest of your data: - - ```js - // scenarios/default.js - export default function(server) { - server.loadFixtures('countries', 'states'); - - let author = server.create('author'); - server.createList('post', 10, {author_id: author.id}); - } - ``` - - @method loadFixtures - @param {String} [...args] The name of the fixture to load. - @public - */ - loadFixtures(...args) { - let { fixtures } = this._config; - if (args.length) { - let camelizedArgs = args.map(camelize); - fixtures = _pick(fixtures, ...camelizedArgs); - } - - this.db.loadData(fixtures); - } - - /* - Factory methods - */ - - /** - * Load factories into Mirage's database. - * - * @method loadFactories - * @param {Object} factoryMap - * @public - * @hide - */ - loadFactories(factoryMap = {}) { - // Store a reference to the factories - let currentFactoryMap = this._factoryMap || {}; - this._factoryMap = _assign(currentFactoryMap, factoryMap); - - // Create a collection for each factory - Object.keys(factoryMap).forEach((type) => { - let collectionName = toCollectionName(type); - this.db.createCollection(collectionName); - }); - } - - /** - * Get the factory for a given type. - * - * @method factoryFor - * @param {String} type - * @private - * @hide - */ - factoryFor(type) { - let camelizedType = camelize(type); - - if (this._factoryMap && this._factoryMap[camelizedType]) { - return this._factoryMap[camelizedType]; - } - } - - build(type, ...traitsAndOverrides) { - let traits = traitsAndOverrides.filter((arg) => arg && typeof arg === 'string'); - let overrides = _find(traitsAndOverrides, (arg) => _isPlainObject(arg)); - let camelizedType = camelize(type); - - // Store sequence for factory type as instance variable - this.factorySequences = this.factorySequences || {}; - this.factorySequences[camelizedType] = this.factorySequences[camelizedType] + 1 || 0; - - let OriginalFactory = this.factoryFor(type); - if (OriginalFactory) { - OriginalFactory = OriginalFactory.extend({}); - let attrs = OriginalFactory.attrs || {}; - this._validateTraits(traits, OriginalFactory, type); - let mergedExtensions = this._mergeExtensions(attrs, traits, overrides); - this._mapAssociationsFromAttributes(type, attrs, overrides); - this._mapAssociationsFromAttributes(type, mergedExtensions); - - let Factory = OriginalFactory.extend(mergedExtensions); - let factory = new Factory(); - - let sequence = this.factorySequences[camelizedType]; - return factory.build(sequence); - } else { - return overrides; - } - } - - buildList(type, amount, ...traitsAndOverrides) { - assert(_isInteger(amount), `second argument has to be an integer, you passed: ${typeof amount}`); - - let list = []; - - for (let i = 0; i < amount; i++) { - list.push(this.build(type, ...traitsAndOverrides)); - } - - return list; - } - - /** - Generates a single model of type *type*, inserts it into the database (giving it an id), and returns the data that was - added. - - ```js - test("I can view a contact's details", function() { - var contact = server.create('contact'); - - visit('/contacts/' + contact.id); - - andThen(() => { - equal( find('h1').text(), 'The contact is Link'); - }); - }); - ``` - - You can override the attributes from the factory definition with a - hash passed in as the second parameter. For example, if we had this factory - - ```js - export default Factory.extend({ - name: 'Link' - }); - ``` - - we could override the name like this: - - ```js - test("I can view the contacts", function() { - server.create('contact', {name: 'Zelda'}); - - visit('/'); - - andThen(() => { - equal( find('p').text(), 'Zelda' ); - }); - }); - ``` - - @method create - @param type the singularized type of the model - @param traitsAndOverrides - @public - */ - create(type, ...options) { - assert(this._modelOrFactoryExistsForType(type), `You called server.create('${type}') but no model or factory was found. Make sure you're passing in the singularized version of the model or factory name.`); - - // When there is a Model defined, we should return an instance - // of it instead of returning the bare attributes. - let traits = options.filter((arg) => arg && typeof arg === 'string'); - let overrides = _find(options, (arg) => _isPlainObject(arg)); - let collectionFromCreateList = _find(options, (arg) => arg && Array.isArray(arg)); - - let attrs = this.build(type, ...traits, overrides); - let modelOrRecord; - - if (this.schema && this.schema[toCollectionName(type)]) { - let modelClass = this.schema[toCollectionName(type)]; - - modelOrRecord = modelClass.create(attrs); - - } else { - let collection, collectionName; - - if (collectionFromCreateList) { - collection = collectionFromCreateList; - } else { - collectionName = this.schema ? toInternalCollectionName(type) : `_${pluralize(type)}`; - collection = this.db[collectionName]; - } - - assert(collection, `You called server.create('${type}') but no model or factory was found.`); - modelOrRecord = collection.insert(attrs); - } - - let OriginalFactory = this.factoryFor(type); - if (OriginalFactory) { - OriginalFactory.extractAfterCreateCallbacks({ traits }).forEach((afterCreate) => { - afterCreate(modelOrRecord, this); - }); - } - - return modelOrRecord; - } - - /** - Creates *amount* models of type *type*, optionally overriding the attributes from the factory with *attrs*. - - Returns the array of records that were added to the database. - - Here's an example from a test: - - ```js - test("I can view the contacts", function() { - server.createList('contact', 5); - var youngContacts = server.createList('contact', 5, {age: 15}); - - visit('/'); - - andThen(function() { - equal(currentRouteName(), 'index'); - equal( find('p').length, 10 ); - }); - }); - ``` - - And one from setting up your development database: - - ```js - // mirage/scenarios/default.js - export default function(server) { - var contact = server.create('contact'); - server.createList('address', 5, {contactId: contact.id}); - } - ``` - - @method createList - @param type - @param amount - @param traitsAndOverrides - @public - */ - createList(type, amount, ...traitsAndOverrides) { - assert(this._modelOrFactoryExistsForType(type), `You called server.createList('${type}') but no model or factory was found. Make sure you're passing in the singularized version of the model or factory name.`); - assert(_isInteger(amount), `second argument has to be an integer, you passed: ${typeof amount}`); - - let list = []; - let collectionName = this.schema ? toInternalCollectionName(type) : `_${pluralize(type)}`; - let collection = this.db[collectionName]; - - for (let i = 0; i < amount; i++) { - list.push(this.create(type, ...traitsAndOverrides, collection)); - } - - return list; - } - - shutdown() { - this.pretender.shutdown(); - if (this.environment === 'test') { - window.server = undefined; - } - } - - resource(resourceName, { only, except, path } = {}) { - resourceName = pluralize(resourceName); - path = path || `/${resourceName}`; - only = only || []; - except = except || []; - - if (only.length > 0 && except.length > 0) { - throw 'cannot use both :only and :except options'; - } - - let actionsMethodsAndsPathsMappings = { - index: { methods: ['get'], path: `${path}` }, - show: { methods: ['get'], path: `${path}/:id` }, - create: { methods: ['post'], path: `${path}` }, - update: { methods: ['put', 'patch'], path: `${path}/:id` }, - delete: { methods: ['del'], path: `${path}/:id` } - }; - - let allActions = Object.keys(actionsMethodsAndsPathsMappings); - let actions = only.length > 0 && only - || except.length > 0 && allActions.filter((action) => (except.indexOf(action) === -1)) - || allActions; - - actions.forEach((action) => { - let methodsWithPath = actionsMethodsAndsPathsMappings[action]; - - methodsWithPath.methods.forEach((method) => { - return path === resourceName - ? this[method](methodsWithPath.path) - : this[method](methodsWithPath.path, resourceName); - }); - }); - } - - /** - * - * @private - * @hide - */ - _defineRouteHandlerHelpers() { - [['get'], ['post'], ['put'], ['delete', 'del'], ['patch'], ['head'], ['options']].forEach(([verb, alias]) => { - this[verb] = (path, ...args) => { - let [ rawHandler, customizedCode, options ] = extractRouteArguments(args); - return this._registerRouteHandler(verb, path, rawHandler, customizedCode, options); - }; - - if (alias) { - this[alias] = this[verb]; - } - }); - } - - _serialize(body) { - if (typeof body === 'string') { - return body; - } else { - return JSON.stringify(body); - } - } - - _registerRouteHandler(verb, path, rawHandler, customizedCode, options) { - - let routeHandler = new RouteHandler({ - schema: this.schema, - verb, rawHandler, customizedCode, options, path, - serializerOrRegistry: this.serializerOrRegistry - }); - - let fullPath = this._getFullPath(path); - let timing = options.timing !== undefined ? options.timing : (() => this.timing); - - return this.pretender[verb]( - fullPath, - (request) => { - return routeHandler.handle(request) - .then(mirageResponse => { - let [ code, headers, response ] = mirageResponse; - - return [ code, headers, this._serialize(response) ]; - }); - }, - timing - ); - } - - /** - * - * @private - * @hide - */ - _hasModulesOfType(modules, type) { - let modulesOfType = modules[type]; - return modulesOfType ? Object.keys(modulesOfType).length > 0 : false; - } - - /** - * Builds a full path for Pretender to monitor based on the `path` and - * configured options (`urlPrefix` and `namespace`). - * - * @private - * @hide - */ - _getFullPath(path) { - path = path[0] === '/' ? path.slice(1) : path; - let fullPath = ''; - let urlPrefix = this.urlPrefix ? this.urlPrefix.trim() : ''; - let namespace = ''; - - // if there is a urlPrefix and a namespace - if (this.urlPrefix && this.namespace) { - if (this.namespace[0] === '/' && this.namespace[this.namespace.length - 1] === '/') { - namespace = this.namespace.substring(0, this.namespace.length - 1).substring(1); - } - - if (this.namespace[0] === '/' && this.namespace[this.namespace.length - 1] !== '/') { - namespace = this.namespace.substring(1); - } - - if (this.namespace[0] !== '/' && this.namespace[this.namespace.length - 1] === '/') { - namespace = this.namespace.substring(0, this.namespace.length - 1); - } - - if (this.namespace[0] !== '/' && this.namespace[this.namespace.length - 1] !== '/') { - namespace = this.namespace; - } - } - - // if there is a namespace and no urlPrefix - if (this.namespace && !this.urlPrefix) { - if (this.namespace[0] === '/' && this.namespace[this.namespace.length - 1] === '/') { - namespace = this.namespace.substring(0, this.namespace.length - 1); - } - - if (this.namespace[0] === '/' && this.namespace[this.namespace.length - 1] !== '/') { - namespace = this.namespace; - } - - if (this.namespace[0] !== '/' && this.namespace[this.namespace.length - 1] === '/') { - let namespaceSub = this.namespace.substring(0, this.namespace.length - 1); - namespace = `/${namespaceSub}`; - } - - if (this.namespace[0] !== '/' && this.namespace[this.namespace.length - 1] !== '/') { - namespace = `/${this.namespace}`; - } - } - - // if no namespace - if (!this.namespace) { - namespace = ''; - } - - // check to see if path is a FQDN. if so, ignore any urlPrefix/namespace that was set - if (/^https?:\/\//.test(path)) { - fullPath += path; - } else { - // otherwise, if there is a urlPrefix, use that as the beginning of the path - if (urlPrefix.length) { - fullPath += (urlPrefix[urlPrefix.length - 1] === '/') ? urlPrefix : `${urlPrefix}/`; - } - - // add the namespace to the path - fullPath += namespace; - - // add a trailing slash to the path if it doesn't already contain one - if (fullPath[fullPath.length - 1] !== '/') { - fullPath += '/'; - } - - // finally add the configured path - fullPath += path; - - // if we're making a same-origin request, ensure a / is prepended and - // dedup any double slashes - if (!/^https?:\/\//.test(fullPath)) { - fullPath = `/${fullPath}`; - fullPath = fullPath.replace(/\/+/g, '/'); - } - } - - return fullPath; - } - - /** - * - * @private - * @hide - */ - _configureDefaultPassthroughs() { - defaultPassthroughs.forEach((passthroughUrl) => { - this.passthrough(passthroughUrl); - }); - } - - /** - * - * @private - * @hide - */ - _typeIsPluralForModel(typeOrCollectionName) { - let modelOrFactoryExists = this._modelOrFactoryExistsForTypeOrCollectionName(typeOrCollectionName); - let isPlural = typeOrCollectionName === pluralize(typeOrCollectionName); - let isUncountable = singularize(typeOrCollectionName) === pluralize(typeOrCollectionName); - - return isPlural && !isUncountable && modelOrFactoryExists; - } - - /** - * - * @private - * @hide - */ - _modelOrFactoryExistsForType(type) { - let modelExists = (this.schema && this.schema.modelFor(camelize(type))); - let dbCollectionExists = this.db[toInternalCollectionName(type)]; - - return (modelExists || dbCollectionExists) && !this._typeIsPluralForModel(type); - } - - /** - * - * @private - * @hide - */ - _modelOrFactoryExistsForTypeOrCollectionName(typeOrCollectionName) { - let modelExists = (this.schema && this.schema.modelFor(camelize(typeOrCollectionName))); - let dbCollectionExists = this.db[toInternalCollectionName(typeOrCollectionName)]; - - return modelExists || dbCollectionExists; - } - - /** - * - * @private - * @hide - */ - _validateTraits(traits, factory, type) { - traits.forEach((traitName) => { - if (!factory.isTrait(traitName)) { - throw new Error(`'${traitName}' trait is not registered in '${type}' factory`); - } - }); - } - - /** - * - * @private - * @hide - */ - _mergeExtensions(attrs, traits, overrides) { - let allExtensions = traits.map((traitName) => { - return attrs[traitName].extension; - }); - allExtensions.push(overrides || {}); - return allExtensions.reduce((accum, extension) => { - return _assign(accum, extension); - }, {}); - } - - /** - * - * @private - * @hide - */ - _mapAssociationsFromAttributes(modelName, attributes, overrides = {}) { - Object.keys(attributes || {}).filter((attr) => { - return isAssociation(attributes[attr]); - }).forEach((attr) => { - let modelClass = this.schema.modelClassFor(modelName); - let association = modelClass.associationFor(attr); - - assert(association && association instanceof BelongsTo, - `You're using the \`association\` factory helper on the '${attr}' attribute of your ${modelName} factory, but that attribute is not a \`belongsTo\` association. Read the Factories docs for more information: http://www.ember-cli-mirage.com/docs/v0.3.x/factories/#factories-and-relationships` - ); - - let isSelfReferentialBelongsTo = association && association instanceof BelongsTo && association.modelName === modelName; - - assert(!isSelfReferentialBelongsTo, `You're using the association() helper on your ${modelName} factory for ${attr}, which is a belongsTo self-referential relationship. You can't do this as it will lead to infinite recursion. You can move the helper inside of a trait and use it selectively.`); - - let factoryAssociation = attributes[attr]; - let foreignKey = `${camelize(attr)}Id`; - if (!overrides[attr]) { - attributes[foreignKey] = this.create(association.modelName, ...factoryAssociation.traitsAndOverrides).id; - } - delete attributes[attr]; - }); - } -} +export default Server; diff --git a/addon/start-mirage.js b/addon/start-mirage.js index 3d3fd5e2f..a8a7d8d63 100644 --- a/addon/start-mirage.js +++ b/addon/start-mirage.js @@ -1,50 +1,4 @@ -import { getWithDefault } from '@ember/object'; -import readModules from 'ember-cli-mirage/utils/read-modules'; -import Server from 'ember-cli-mirage/server'; -import _assign from 'lodash/assign'; +import StartMirage from '@miragejs/server/lib/start-mirage'; +export * from '@miragejs/server/lib/start-mirage'; -/** - Helper to start mirage. This should not be called directly. In rfc232/rfc268 - tests, use `setupMirage()` or the `autoboot` option in the addon config - in the environment. In legacy tests that call `startMirage` directly, this - should be called via the `startMirage` method exported from - `/initializers/ember-cli-mirage`. - - This is intended to be called with only the `owner` argument (which would be - `this.owner` in an rfc232/rfc268 test, or the application instance if called - from an instance initializer). However, to support the legacy initializer, it - can instead accept a hash of the environment and config objects. - - @hide -*/ -export default function startMirage(owner, { env, baseConfig, testConfig } = {}) { - if (!env || !baseConfig) { - if (!owner) { - throw new Error('You must pass `owner` to startMirage()'); - } - - env = env || resolveRegistration(owner, 'config:environment'); - // These are set from `/initializers/ember-cli-mirage` - baseConfig = baseConfig || resolveRegistration(owner, 'mirage:base-config'); - testConfig = testConfig || resolveRegistration(owner, 'mirage:test-config'); - } - - let environment = env.environment; - let discoverEmberDataModels = getWithDefault(env['ember-cli-mirage'] || {}, 'discoverEmberDataModels', true); - let modules = readModules(env.modulePrefix); - let options = _assign(modules, {environment, baseConfig, testConfig, discoverEmberDataModels}); - options.trackRequests = env['ember-cli-mirage'].trackRequests; - - return new Server(options); -} - -// Support Ember 1.13 -function resolveRegistration(owner, ...args) { - if (owner.resolveRegistration) { - return owner.resolveRegistration(...args); - } else if (owner.__container__) { - return owner.__container__.lookupFactory(...args); - } else { - return owner.container.lookupFactory(...args); - } -} +export default StartMirage; diff --git a/tests/integration/route-handlers/function-handler/basic-test.js b/tests/integration/route-handlers/function-handler/basic-test.js index f11e4ff2d..59c14bfd6 100644 --- a/tests/integration/route-handlers/function-handler/basic-test.js +++ b/tests/integration/route-handlers/function-handler/basic-test.js @@ -1,6 +1,7 @@ import { module, test } from 'qunit'; import { Promise } from 'rsvp'; -import { Model, ActiveModelSerializer, Response } from 'ember-cli-mirage'; +import { Model, ActiveModelSerializer } from 'ember-cli-mirage'; +import { Response } from '@miragejs/server'; import Server from 'ember-cli-mirage/server'; import promiseAjax from '../../../helpers/promise-ajax'; From e03424d63f38362c37d10b75cee688d94b3f7c04 Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Fri, 24 May 2019 02:43:56 +0100 Subject: [PATCH 439/879] Migrate *all* modules to bridge to @miragejs/server - almost working --- addon/index.js | 4 +- .../ember-cli-mirage-autostart.js | 4 +- addon/orm/associations/association.js | 226 +--- addon/orm/associations/belongs-to.js | 261 +---- addon/orm/associations/has-many.js | 282 +---- addon/orm/collection.js | 339 +----- addon/orm/model.js | 1039 +---------------- addon/orm/polymorphic-collection.js | 184 +-- addon/orm/schema.js | 494 +------- addon/route-handlers/base.js | 118 +- addon/route-handlers/function.js | 71 +- addon/route-handlers/object.js | 18 +- addon/route-handlers/shorthands/base.js | 41 +- addon/route-handlers/shorthands/delete.js | 49 +- addon/route-handlers/shorthands/get.js | 75 +- addon/route-handlers/shorthands/head.js | 49 +- addon/route-handlers/shorthands/post.js | 31 +- addon/route-handlers/shorthands/put.js | 32 +- addon/serializers/active-model-serializer.js | 104 +- addon/serializers/json-api-serializer.js | 584 +-------- addon/serializers/rest-serializer.js | 36 +- addon/utils/ember-data.js | 22 +- addon/utils/extend.js | 34 +- addon/utils/inflector.js | 6 +- addon/utils/is-association.js | 10 +- addon/utils/normalize-name.js | 31 +- addon/utils/read-modules.js | 62 +- addon/utils/reference-sort.js | 55 +- addon/utils/uuid.js | 14 +- .../route-handlers/delete-shorthand-test.js | 4 +- .../function-handler/basic-test.js | 4 +- .../function-handler/serialize-test.js | 3 +- .../serializers/base/full-request-test.js | 10 +- .../integration/serializers/schema-helper.js | 20 +- 34 files changed, 103 insertions(+), 4213 deletions(-) diff --git a/addon/index.js b/addon/index.js index 77e842f17..54717f1ee 100644 --- a/addon/index.js +++ b/addon/index.js @@ -1,4 +1,4 @@ -import MirageServer from '@miragejs/server/lib/index'; -export * from '@miragejs/server/lib/index'; +import MirageServer from '@miragejs/server/lib'; +export * from '@miragejs/server/lib'; export default MirageServer; diff --git a/addon/instance-initializers/ember-cli-mirage-autostart.js b/addon/instance-initializers/ember-cli-mirage-autostart.js index fc6c1d650..b8b32ef81 100644 --- a/addon/instance-initializers/ember-cli-mirage-autostart.js +++ b/addon/instance-initializers/ember-cli-mirage-autostart.js @@ -1,6 +1,6 @@ import EmberObject from '@ember/object'; -import getRfc232TestContext from 'ember-cli-mirage/get-rfc232-test-context'; -import startMirage from 'ember-cli-mirage/start-mirage'; +import getRfc232TestContext from '../get-rfc232-test-context'; +import startMirage from '../start-mirage'; // An object we can register with the container to ensure that mirage is shut // down when the application is destroyed diff --git a/addon/orm/associations/association.js b/addon/orm/associations/association.js index 939f8ddd2..9bf270106 100644 --- a/addon/orm/associations/association.js +++ b/addon/orm/associations/association.js @@ -1,224 +1,4 @@ -import { dasherize } from 'ember-cli-mirage/utils/inflector'; +import Association from '@miragejs/server/lib/orm/associations/association'; +export * from '@miragejs/server/lib/orm/associations/association'; -/** - To define associations on your models, use the `belongsTo` and `hasMany` helpers. Each helper adds some dynamic methods to your model. - - If you're using Ember Data, you don't need to define these relationships, as they will be inferred from your Ember Data schema automatically. - - ## Association types - - ### belongsTo - - ```js - // mirage/models/blog-post.js - import { Model, belongsTo } from 'ember-cli-mirage'; - - export default Model.extend({ - author: belongsTo() - }); - ``` - - This adds an `authorId` property to your `blogPost` model, as well as some methods for working with the associated `author` model: - - ```js - blogPost.authorId; // 1 - blogPost.authorId = 2; // updates the relationship - blogPost.author; // Author instance - blogPost.author = anotherAuthor; - blogPost.newAuthor(attrs); // new unsaved author - blogPost.createAuthor(attrs); // new saved author (updates blogPost.authorId in memory only) - ``` - Note that when a child calls `child.createParent`, the new parent is immediately saved to the `db`, but the child's foreign key is updated *on this instance only*, and is not immediately persisted to the database. - - In other words, `blogPost.createAuthor` will create a new `author` record, insert it into the `db`, and update the `blogPost.authorId` in memory, but if you were to fetch the `blogPost` from the `db` again, the relationship would not be persisted. - - To persist the new foreign key, you would call `blogPost.save()` after creating the new author. - - ### hasMany - - ```js - // mirage/models/blog-post.js - import { Model, hasMany } from 'ember-cli-mirage'; - - export default Model.extend({ - comments: hasMany() - }); - ``` - - This adds a `commentIds` property to the `blogPost` model, as well as some methods for working with the associated `comments` collection: - - ```js - blogPost.commentIds; // [1, 2, 3] - blogPost.commentIds = [2, 3]; // updates the relationship - blogPost.comments; // array of related comments - blogPost.comments = [comment1, comment2]; // updates the relationship - blogPost.newComment(attrs); // new unsaved comment - blogPost.createComment(attrs); // new saved comment (comment.blogPostId is set) - ``` - - ## Association options - - ### modelName - - If your associations model has a different name than the association itself, you can specify the `modelName` on the association. - - For example, - - ```js - // mirage/models/blog-post.js - import { Model, belongsTo, hasMany } from 'ember-cli-mirage'; - - export default Model.extend({ - author: belongsTo('user'), - comments: hasMany('annotation') - }); - ``` - - would add all the named `author` and `comment` methods as listed above, but use `user` and `annotation` models for the actual relationships. - - ### inverse - - Sometimes a `hasMany` relationship can point to a model with multiple associations of the same type. You can use the `inverse` option to specify which property on the related model is the inverse of the given relationship: - - ```js - // app/models/talk.js - export default Model.extend({ - primaryEvent: belongsTo('event'), - secondaryEvent: belongsTo('event'), - }); - - // app/models/event.js - export default Model.extend({ - talks: hasMany('talk', { inverse: 'primaryEvent' }), - }); - ``` - - ### polymorphic - - You can specify whether an association is a polymorphic association by passing `{ polymorphic: true }` as an option. - - For example, say you have a `Comment` that can belong to a `BlogPost` or a `Picture`. Here's how the model definitions would look: - - ```js - // app/models/comment.js - export default Model.extend({ - commentable: belongsTo({ polymorphic: true }) - }); - - // app/models/blog-post.js - export default Model.extend({ - comments: hasMany() - }); - - // app/models/picture.js - export default Model.extend({ - comments: hasMany() - }); - ``` - - Note that `commentable` doesn't need a type (there's no validation done on which types of models can exist on that association). - - Polymorphic associations have slightly different method signatures for their foreign keys and build/create methods. - - ```js - let comment = schema.comments.create({ text: "foo" }); - - comment.buildCommentable('post', { title: 'Lorem Ipsum' }); - comment.createCommentable('post', { title: 'Lorem Ipsum' }); - - // getter - comment.commentableId; // { id: 1, type: 'blog-post' } - - // setter - comment.commentableId = { id: 2, type: 'picture' }; - ``` - - Has-many asssociations can also be polymorphic: - - ```js - // app/models/user.js - export default Model.extend({ - things: hasMany({ polymorphic: true }) - }); - - // app/models/car.js - export default Model.extend({ - }); - - // app/models/watch.js - export default Model.extend({ - }); - - let user = schema.users.create({ name: "Sam" }); - - user.buildThing('car', { attrs }); - user.createThing('watch', { attrs }); - - // getter - user.thingIds; // [ { id: 1, type: 'car' }, { id: 3, type: 'watch' }, ... ] - - // setter - user.thingIds = [ { id: 2, type: 'watch' }, ... ]; - ``` - - @class Association - @constructor - @public -*/ -export default class Association { - - constructor(modelName, opts) { - if (typeof modelName === 'object') { - // Received opts only - this.modelName = undefined; - this.opts = modelName; - } else { - // The modelName of the association. (Might not be passed in - set later - // by schema). - this.modelName = modelName ? dasherize(modelName) : ''; - this.opts = opts || {}; - } - - // The key pointing to the association - this.key = ''; - - // The modelName that owns this association - this.ownerModelName = ''; - } - - /** - A setter for schema, since we don't have a reference at constuction time. - - @method setSchema - @public - @hide - */ - setSchema(schema) { - this.schema = schema; - } - - /** - Returns true if the association is reflexive. - - @method isReflexive - @return {Boolean} - @public - */ - isReflexive() { - let isExplicitReflexive = !!(this.modelName === this.ownerModelName && this.opts.inverse); - let isImplicitReflexive = !!(this.opts.inverse === undefined && this.ownerModelName === this.modelName); - - return isExplicitReflexive || isImplicitReflexive; - } - - get isPolymorphic() { - return this.opts.polymorphic; - } - - /** - @hide - */ - get identifier() { - throw new Error('Subclasses of Association must implement a getter for identifier'); - } -} +export default Association; diff --git a/addon/orm/associations/belongs-to.js b/addon/orm/associations/belongs-to.js index 3f94ad795..babd29eff 100644 --- a/addon/orm/associations/belongs-to.js +++ b/addon/orm/associations/belongs-to.js @@ -1,259 +1,4 @@ -import Association from './association'; -import _assign from 'lodash/assign'; -import { capitalize, camelize } from 'ember-cli-mirage/utils/inflector'; -import { toCollectionName } from 'ember-cli-mirage/utils/normalize-name'; -import assert from 'ember-cli-mirage/assert'; +import BelongsTo from '@miragejs/server/lib/orm/associations/belongs-to'; +export * from '@miragejs/server/lib/orm/associations/belongs-to'; -/** - * The belongsTo association adds a fk to the owner of the association - * - * @class BelongsTo - * @extends Association - * @constructor - * @public - * @hide - */ -export default class BelongsTo extends Association { - - get identifier() { - return `${camelize(this.key)}Id`; - } - - /** - * @method getForeignKeyArray - * @return {Array} Array of camelized name of the model owning the association - * and foreign key for the association - * @public - */ - getForeignKeyArray() { - return [camelize(this.ownerModelName), this.getForeignKey()]; - } - - /** - * @method getForeignKey - * @return {String} Foreign key for the association - * @public - */ - getForeignKey() { - return `${camelize(this.key)}Id`; - } - - /** - * Registers belongs-to association defined by given key on given model, - * defines getters / setters for associated parent and associated parent's id, - * adds methods for creating unsaved parent record and creating a saved one - * - * @method addMethodsToModelClass - * @param {Function} ModelClass - * @param {String} key the named key for the association - * @public - */ - addMethodsToModelClass(ModelClass, key) { - let modelPrototype = ModelClass.prototype; - let association = this; - let foreignKey = this.getForeignKey(); - let associationHash = { [key]: this }; - - modelPrototype.belongsToAssociations = _assign(modelPrototype.belongsToAssociations, associationHash); - - // Add to target's dependent associations array - this.schema.addDependentAssociation(this, this.modelName); - - // TODO: look how this is used. Are these necessary, seems like they could be gotten from the above? - // Or we could use a single data structure to store this information? - modelPrototype.associationKeys.push(key); - modelPrototype.associationIdKeys.push(foreignKey); - - Object.defineProperty(modelPrototype, foreignKey, { - - /* - object.parentId - - returns the associated parent's id - */ - get() { - this._tempAssociations = this._tempAssociations || {}; - let tempParent = this._tempAssociations[key]; - let id; - - if (tempParent === null) { - id = null; - } else { - - if (association.isPolymorphic) { - if (tempParent) { - id = { id: tempParent.id, type: tempParent.modelName }; - } else { - id = this.attrs[foreignKey]; - } - } else { - if (tempParent) { - id = tempParent.id; - } else { - id = this.attrs[foreignKey]; - } - } - - } - - return id; - }, - - /* - object.parentId = (parentId) - - sets the associated parent via id - */ - set(id) { - let tempParent; - - if (id === null) { - tempParent = null; - } else if (id !== undefined) { - if (association.isPolymorphic) { - assert(typeof id === 'object', `You're setting an ID on the polymorphic association '${association.key}' but you didn't pass in an object. Polymorphic IDs need to be in the form { type, id }.`); - tempParent = association.schema[toCollectionName(id.type)].find(id.id); - } else { - tempParent = association.schema[toCollectionName(association.modelName)].find(id); - assert(tempParent, `Couldn't find ${association.modelName} with id = ${id}`); - } - } - - this[key] = tempParent; - } - }); - - Object.defineProperty(modelPrototype, key, { - /* - object.parent - - returns the associated parent - */ - get() { - this._tempAssociations = this._tempAssociations || {}; - - let tempParent = this._tempAssociations[key]; - let foreignKeyId = this[foreignKey]; - let model = null; - - if (tempParent) { - model = tempParent; - } else if (foreignKeyId !== null) { - if (association.isPolymorphic) { - model = association.schema[toCollectionName(foreignKeyId.type)].find(foreignKeyId.id); - } else { - model = association.schema[toCollectionName(association.modelName)].find(foreignKeyId); - } - } - - return model; - }, - - /* - object.parent = (parentModel) - - sets the associated parent via model - - I want to jot some notes about hasInverseFor. There used to be an - association.inverse() check, but adding polymorphic associations - complicated this. `comment.commentable`, you can't easily check for an - inverse since `comments: hasMany()` could be on any model. - - Instead of making it very complex and looking for an inverse on the - association in isoaltion, it was much simpler to ask the model being - passed in if it had an inverse for the setting model and with its - association. - */ - set(model) { - this._tempAssociations = this._tempAssociations || {}; - this._tempAssociations[key] = model; - - if (model && model.hasInverseFor(association)) { - let inverse = model.inverseFor(association); - - model.associate(this, inverse); - } - } - }); - - /* - object.newParent - - creates a new unsaved associated parent - - TODO: document polymorphic - */ - modelPrototype[`new${capitalize(key)}`] = function(...args) { - let modelName, attrs; - - if (association.isPolymorphic) { - modelName = args[0]; - attrs = args[1]; - } else { - modelName = association.modelName; - attrs = args[0]; - } - - let parent = association.schema[toCollectionName(modelName)].new(attrs); - - this[key] = parent; - - return parent; - }; - - /* - object.createParent - - creates a new saved associated parent, and immediately persists both models - - TODO: document polymorphic - */ - modelPrototype[`create${capitalize(key)}`] = function(...args) { - let modelName, attrs; - if (association.isPolymorphic) { - modelName = args[0]; - attrs = args[1]; - } else { - modelName = association.modelName; - attrs = args[0]; - } - - let parent = association.schema[toCollectionName(modelName)].create(attrs); - - this[key] = parent; - this.save(); - - return parent.reload(); - }; - } - - /** - * - * - * @public - */ - disassociateAllDependentsFromTarget(model) { - let owner = this.ownerModelName; - let fk; - - if (this.isPolymorphic) { - fk = { type: model.modelName, id: model.id }; - } else { - fk = model.id; - } - - let dependents = this.schema[toCollectionName(owner)] - .where((potentialOwner) => { - let id = potentialOwner[this.getForeignKey()]; - - if (!id) { - return false; - } - - if (typeof id === 'object') { - return id.type === fk.type && id.id === fk.id; - } else { - return id === fk; - } - }); - - dependents.models.forEach(dependent => { - dependent.disassociate(model, this); - dependent.save(); - }); - } -} +export default BelongsTo; diff --git a/addon/orm/associations/has-many.js b/addon/orm/associations/has-many.js index dd1e124db..603bd0de1 100644 --- a/addon/orm/associations/has-many.js +++ b/addon/orm/associations/has-many.js @@ -1,280 +1,4 @@ -import Association from './association'; -import Collection from '../collection'; -import PolymorphicCollection from '../polymorphic-collection'; -import _assign from 'lodash/assign'; -import _compact from 'lodash/compact'; -import { capitalize, camelize, singularize } from 'ember-cli-mirage/utils/inflector'; -import { toCollectionName } from 'ember-cli-mirage/utils/normalize-name'; -import assert from 'ember-cli-mirage/assert'; +import HasMany from '@miragejs/server/lib/orm/associations/has-many'; +export * from '@miragejs/server/lib/orm/associations/has-many'; -/** - * @class HasMany - * @extends Association - * @constructor - * @public - * @hide - */ -export default class HasMany extends Association { - - get identifier() { - return `${camelize(singularize(this.key))}Ids`; - } - - /** - * @method getForeignKeyArray - * @return {Array} Array of camelized model name of associated objects - * and foreign key for the object owning the association - * @public - */ - getForeignKeyArray() { - return [camelize(this.ownerModelName), this.getForeignKey()]; - } - - /** - * @method getForeignKey - * @return {String} Foreign key for the object owning the association - * @public - */ - getForeignKey() { - return `${singularize(camelize(this.key))}Ids`; - } - - /** - * Registers has-many association defined by given key on given model, - * defines getters / setters for associated records and associated records' ids, - * adds methods for creating unsaved child records and creating saved ones - * - * @method addMethodsToModelClass - * @param {Function} ModelClass - * @param {String} key - * @public - */ - addMethodsToModelClass(ModelClass, key) { - let modelPrototype = ModelClass.prototype; - let association = this; - let foreignKey = this.getForeignKey(); - let associationHash = { [key]: this }; - - modelPrototype.hasManyAssociations = _assign(modelPrototype.hasManyAssociations, associationHash); - - // Add to target's dependent associations array - this.schema.addDependentAssociation(this, this.modelName); - - // TODO: look how this is used. Are these necessary, seems like they could be gotten from the above? - // Or we could use a single data structure to store this information? - modelPrototype.associationKeys.push(key); - modelPrototype.associationIdKeys.push(foreignKey); - - Object.defineProperty(modelPrototype, foreignKey, { - - /* - object.childrenIds - - returns an array of the associated children's ids - */ - get() { - this._tempAssociations = this._tempAssociations || {}; - let tempChildren = this._tempAssociations[key]; - let ids = []; - - if (tempChildren) { - if (association.isPolymorphic) { - ids = tempChildren.models.map(model => ({ type: model.modelName, id: model.id })); - } else { - ids = tempChildren.models.map(model => model.id); - } - } else { - ids = this.attrs[foreignKey] || []; - } - - return ids; - }, - - /* - object.childrenIds = ([childrenIds...]) - - sets the associated children (via id) - */ - set(ids) { - let tempChildren; - - if (ids === null) { - tempChildren = []; - } else if (ids !== undefined) { - assert(Array.isArray(ids), `You must pass an array in when setting ${foreignKey} on ${this}`); - - if (association.isPolymorphic) { - assert(ids.every((el) => { - return ((typeof el === 'object') - && (typeof el.type !== undefined) - && (typeof el.id !== undefined) - ); - }), `You must pass in an array of polymorphic identifiers (objects of shape { type, id }) when setting ${foreignKey} on ${this}`); - - let models = ids.map(({ type, id }) => { - return association.schema[toCollectionName(type)].find(id); - }); - tempChildren = new PolymorphicCollection(models); - } else { - tempChildren = association.schema[toCollectionName(association.modelName)].find(ids); - } - } - - this[key] = tempChildren; - } - }); - - Object.defineProperty(modelPrototype, key, { - - /* - object.children - - returns an array of associated children - */ - get() { - this._tempAssociations = this._tempAssociations || {}; - let collection = null; - - if (this._tempAssociations[key]) { - collection = this._tempAssociations[key]; - } else { - if (association.isPolymorphic) { - if (this[foreignKey]) { - let polymorphicIds = this[foreignKey]; - let models = polymorphicIds.map(({ type, id }) => { - return association.schema[toCollectionName(type)].find(id); - }); - - collection = new PolymorphicCollection(models); - } else { - collection = new PolymorphicCollection(association.modelName); - } - } else { - if (this[foreignKey]) { - collection = association.schema[toCollectionName(association.modelName)].find(this[foreignKey]); - } else { - collection = new Collection(association.modelName); - } - } - - this._tempAssociations[key] = collection; - } - - return collection; - }, - - /* - object.children = [model1, model2, ...] - - sets the associated children (via array of models or Collection) - */ - set(models) { - if (models instanceof Collection || models instanceof PolymorphicCollection) { - models = models.models; - } - - models = models ? _compact(models) : []; - this._tempAssociations = this._tempAssociations || {}; - - let collection; - if (association.isPolymorphic) { - collection = new PolymorphicCollection(models); - } else { - collection = new Collection(association.modelName, models); - } - this._tempAssociations[key] = collection; - - models.forEach(model => { - if (model.hasInverseFor(association)) { - let inverse = model.inverseFor(association); - - model.associate(this, inverse); - } - }); - } - }); - - /* - object.newChild - - creates a new unsaved associated child - */ - modelPrototype[`new${capitalize(camelize(singularize(association.key)))}`] = function(...args) { - let modelName, attrs; - if (association.isPolymorphic) { - modelName = args[0]; - attrs = args[1]; - } else { - modelName = association.modelName; - attrs = args[0]; - } - - let child = association.schema[toCollectionName(modelName)].new(attrs); - let children = this[key].models; - - children.push(child); - this[key] = children; - - return child; - }; - - /* - object.createChild - - creates a new saved associated child, and immediately persists both models - - TODO: forgot why this[key].add(child) doesn't work, most likely - because these external APIs trigger saving cascades. Should probably - have an internal method like this[key]._add. - */ - modelPrototype[`create${capitalize(camelize(singularize(association.key)))}`] = function(...args) { - let modelName, attrs; - if (association.isPolymorphic) { - modelName = args[0]; - attrs = args[1]; - } else { - modelName = association.modelName; - attrs = args[0]; - } - - let child = association.schema[toCollectionName(modelName)].create(attrs); - let children = this[key].models; - - children.push(child); - this[key] = children; - - this.save(); - - return child.reload(); - }; - } - - /** - * - * - * @public - */ - disassociateAllDependentsFromTarget(model) { - let owner = this.ownerModelName; - let fk; - - if (this.isPolymorphic) { - fk = { type: model.modelName, id: model.id }; - } else { - fk = model.id; - } - - let dependents = this.schema[toCollectionName(owner)] - .where((potentialOwner) => { - let currentIds = potentialOwner[this.getForeignKey()]; - - // Need this check because currentIds could be null - return currentIds && currentIds.find((id) => { - if (typeof id === 'object') { - return id.type === fk.type && id.id === fk.id; - } else { - return id === fk; - } - }); - }); - - dependents.models.forEach(dependent => { - dependent.disassociate(model, this); - dependent.save(); - }); - } -} +export default HasMany; diff --git a/addon/orm/collection.js b/addon/orm/collection.js index cc2f4d9d9..4f9e2da7b 100644 --- a/addon/orm/collection.js +++ b/addon/orm/collection.js @@ -1,337 +1,4 @@ -import assert from '../assert'; -import _invokeMap from 'lodash/invokeMap'; +import Collection from '@miragejs/server/lib/orm/collection'; +export * from '@miragejs/server/lib/orm/collection'; -/** - Collections represent arrays of models. They are returned by a hasMany association, or by one of the ModelClass query methods: - - ```js - let posts = user.blogPosts; - let posts = schema.blogPosts.all(); - let posts = schema.blogPosts.find([1, 2, 4]); - let posts = schema.blogPosts.where({ published: true }); - ``` - - Note that there is also a `PolymorphicCollection` class that is identical to `Collection`, except it can contain a heterogeneous array of models. Thus, it has no `modelName` property. This lets serializers and other parts of the system interact with it differently. - - @class Collection - @constructor - @public -*/ -export default class Collection { - constructor(modelName, models = []) { - assert( - modelName && typeof modelName === 'string', - 'You must pass a `modelName` into a Collection' - ); - - /** - The dasherized model name this Collection represents. - - ```js - let posts = user.blogPosts; - - posts.modelName; // "blog-post" - ``` - - The model name is separate from the actual models, since Collections can be empty. - - @property modelName - @type {String} - @public - */ - this.modelName = modelName; - - /** - The underlying plain JavaScript array of Models in this Collection. - - ```js - posts.models // [ post:1, post:2, ... ] - ``` - - While Collections have many array-ish methods like `filter` and `sort`, it - can be useful to work with the plain array if you want to work with methods - like `map`, or use the `[]` accessor. - - For example, in testing you might want to assert against a model from the - collection: - - ```js - let newPost = user.posts.models[0].title; - - assert.equal(newPost, "My first post"); - ``` - - @property models - @type {Array} - @public - */ - this.models = models; - } - - /** - The number of models in the collection. - - ```js - user.posts.length; // 2 - ``` - - @property length - @type {Integer} - @public - */ - get length() { - return this.models.length; - } - - /** - Updates each model in the collection, and immediately persists all changes to the db. - - ```js - let posts = user.blogPosts; - - posts.update('published', true); // the db was updated for all posts - ``` - - @method update - @param key - @param val - @return this - @public - */ - update(...args) { - _invokeMap(this.models, 'update', ...args); - - return this; - } - - /** - Saves all models in the collection. - - ```js - let posts = user.blogPosts; - - posts.models[0].published = true; - - posts.save(); // all posts saved to db - ``` - - @method save - @return this - @public - */ - save() { - _invokeMap(this.models, 'save'); - - return this; - } - - /** - Reloads each model in the collection. - - ```js - let posts = author.blogPosts; - - // ... - - posts.reload(); // reloads data for each post from the db - ``` - - @method reload - @return this - @public - */ - reload() { - _invokeMap(this.models, 'reload'); - - return this; - } - - /** - Destroys the db record for all models in the collection. - - ```js - let posts = user.blogPosts; - - posts.destroy(); // all posts removed from db - ``` - - @method destroy - @return this - @public - */ - destroy() { - _invokeMap(this.models, 'destroy'); - - return this; - } - - /** - Adds a model to this collection. - - ```js - posts.length; // 1 - - posts.add(newPost); - - posts.length; // 2 - ``` - - @method add - @param {Model} model - @return this - @public - */ - add(model) { - this.models.push(model); - - return this; - } - - /** - Removes a model from this collection. - - ```js - posts.length; // 5 - - let firstPost = posts.models[0]; - posts.remove(firstPost); - posts.save(); - - posts.length; // 4 - ``` - - @method remove - @param {Model} model - @return this - @public - */ - remove(model) { - let [ match ] = this.models.filter(m => m.toString() === model.toString()); - if (match) { - let i = this.models.indexOf(match); - this.models.splice(i, 1); - } - - return this; - } - - /** - Checks if the Collection includes the given model. - - ```js - posts.includes(newPost); - ``` - - Works by checking if the given model name and id exists in the Collection, - making it a bit more flexible than strict object equality. - - ```js - let post = server.create('post'); - let programming = server.create('tag', { text: 'Programming' }); - - visit(`/posts/${post.id}`); - click('.tag-selector'); - click('.tag:contains(Programming)'); - - post.reload(); - assert.ok(post.tags.includes(programming)); - ``` - - @method includes - @return {Boolean} - @public - */ - includes(model) { - return this.models.filter(m => m.toString() === model.toString()).length > 0; - } - - /** - Returns a new Collection with its models filtered according to the provided [callback function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter). - - ```js - let publishedPosts = user.posts.filter(post => post.isPublished); - ``` - @method filter - @param {Function} f - @return {Collection} - @public - */ - filter(f) { - let filteredModels = this.models.filter(f); - - return new Collection(this.modelName, filteredModels); - } - - /** - Returns a new Collection with its models sorted according to the provided [compare function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Parameters). - - ```js - let postsByTitleAsc = user.posts.sort((a, b) => { - return b.title < a.title; - }); - ``` - - @method sort - @param {Function} f - @return {Collection} - @public - */ - sort(f) { - let sortedModels = this.models.concat().sort(f); - - return new Collection(this.modelName, sortedModels); - } - - /** - Returns a new Collection with a subset of its models selected from `begin` to `end`. - - ```js - let firstThreePosts = user.posts.slice(0, 3); - ``` - - @method slice - @param {Integer} begin - @param {Integer} end - @return {Collection} - @public - */ - slice(...args) { - let slicedModels = this.models.slice(...args); - - return new Collection(this.modelName, slicedModels); - } - - /** - Modifies the Collection by merging the models from another collection. - - ```js - user.posts.mergeCollection(newPosts); - user.posts.save(); - ``` - - @method mergeCollection - @param {Collection} collection - @return this - @public - */ - mergeCollection(collection) { - this.models = this.models.concat(collection.models); - - return this; - } - - /** - Simple string representation of the collection and id. - - ```js - user.posts.toString(); // collection:post(post:1,post:4) - ``` - - @method toString - @return {String} - @public - */ - toString() { - return `collection:${this.modelName}(${this.models.map((m) => m.id).join(',')})`; - } -} +export default Collection; diff --git a/addon/orm/model.js b/addon/orm/model.js index 84429ed5c..e766cfdf1 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -1,1039 +1,4 @@ -import BelongsTo from './associations/belongs-to'; -import HasMany from './associations/has-many'; -import { toCollectionName, toInternalCollectionName } from 'ember-cli-mirage/utils/normalize-name'; -import extend from '../utils/extend'; -import assert from '../assert'; -import Collection from './collection'; -import PolymorphicCollection from './polymorphic-collection'; -import _values from 'lodash/values'; -import _compact from 'lodash/compact'; -import _assign from 'lodash/assign'; - -/** - Models wrap your database and allow you to define relationships. - - As a clarifying point, Mirage model instances only exist within Mirage's server, and are not shared directly with your Ember app. The only way to get Mirage models into your Ember app is via an API call. This means you should never create a Mirage model and, for example, pass it directly into an Ember component. They exist solely to help you manage the data and relationships in your fake backend. - - If you're using Ember Data and version 0.3.3. of Mirage or later, your Mirage model definitions (with relationships) will be detected and auto-generated for you, so you don't need to define the files yourself. If you're not, you can define models by adding files under `/models` or using the provided generator: - - ``` - ember g mirage-model blog-post - ``` - - This would create the following file: - - ```js - // mirage/models/blog-post.js - import { Model } from 'ember-cli-mirage'; - - export default Model; - ``` - - **Class vs. instance methods** - - The methods documented below apply to _instances_ of models, but you'll typically use the `Schema` to access the model _class_, which can be used to find or create instances. - - You can find the Class methods documented under the `Schema` API docs. - - **Accessing properties and relationships** - - You can access properites (fields) and relationships directly off of models. - - ```js - user.name; // 'Sam' - user.team; // Team model - user.teamId; // Team id (foreign key) - ``` - - Mirage Models are schemaless in their attributes, but their relationship schema is known. - - For example, - - ```js - let user = schema.users.create(); - user.attrs // { } - user.name // undefined - - let user = schema.users.create({ name: 'Sam' }); - user.attrs // { name: 'Sam' } - user.name // 'Sam' - ``` - - However, if a `user` has a `posts` relationships defined, - - ```js - let user = schema.users.create(); - user.posts // returns an empty Posts Collection - ``` - - @class Model - @constructor - @public - */ -class Model { - - // TODO: schema and modelName now set statically at registration, need to remove - /* - Notes: - - - We need to pass in modelName, because models are created with - .extend and anonymous functions, so you cannot use - reflection to find the name of the constructor. - */ - constructor(schema, modelName, attrs, fks) { - assert(schema, 'A model requires a schema'); - assert(modelName, 'A model requires a modelName'); - - this._schema = schema; - this.modelName = modelName; - this.fks = fks || []; - - /** - Returns the attributes of your model. - - ```js - let post = schema.blogPosts.find(1); - post.attrs; // {id: 1, title: 'Lorem Ipsum', publishedAt: '2012-01-01 10:00:00'} - ``` - - Note that you can also access individual attributes directly off a model, e.g. `post.title`. - - @property attrs - @public - */ - this.attrs = undefined; - - attrs = attrs || {}; - - this._setupAttrs(attrs); - this._setupRelationships(attrs); - - return this; - } - - /** - Create or saves the model. - - ```js - let post = blogPosts.new({ title: 'Lorem ipsum' }); - post.id; // null - - post.save(); - post.id; // 1 - - post.title = 'Hipster ipsum'; // db has not been updated - post.save(); // ...now the db is updated - ``` - - @method save - @return this - @public - */ - save() { - let collection = toInternalCollectionName(this.modelName); - - if (this.isNew()) { - // Update the attrs with the db response - this.attrs = this._schema.db[collection].insert(this.attrs); - - // Ensure the id getter/setter is set - this._definePlainAttribute('id'); - - } else { - this._schema.isSaving[this.toString()] = true; - this._schema.db[collection].update(this.attrs.id, this.attrs); - } - - this._saveAssociations(); - - this._schema.isSaving[this.toString()] = false; - return this; - } - - /** - Updates the record in the db. - - ```js - let post = blogPosts.find(1); - post.update('title', 'Hipster ipsum'); // the db was updated - post.update({ - title: 'Lorem ipsum', - created_at: 'before it was cool' - }); - ``` - - @method update - @param {String} key - @param {String} val - @return this - @public - */ - update(key, val) { - let attrs; - if (key == null) { - return this; - } - - if (typeof key === 'object') { - attrs = key; - } else { - (attrs = {})[key] = val; - } - - Object.keys(attrs).forEach(function(attr) { - if (this.associationKeys.indexOf(attr) === -1 && this.associationIdKeys.indexOf(attr) === -1) { - this._definePlainAttribute(attr); - } - this[attr] = attrs[attr]; - }, this); - - this.save(); - - return this; - } - - /** - Destroys the db record. - - ```js - let post = blogPosts.find(1); - post.destroy(); // removed from the db - ``` - - @method destroy - @public - */ - destroy() { - if (this.isSaved()) { - this._disassociateFromDependents(); - - let collection = toInternalCollectionName(this.modelName); - this._schema.db[collection].remove(this.attrs.id); - } - } - - /** - Boolean, true if the model has not been persisted yet to the db. - - ```js - let post = blogPosts.new({title: 'Lorem ipsum'}); - post.isNew(); // true - post.id; // null - - post.save(); // true - post.isNew(); // false - post.id; // 1 - ``` - - @method isNew - @return {Boolean} - @public - */ - isNew() { - let hasDbRecord = false; - let hasId = this.attrs.id !== undefined && this.attrs.id !== null; - - if (hasId) { - let collectionName = toInternalCollectionName(this.modelName); - let record = this._schema.db[collectionName].find(this.attrs.id); - - if (record) { - hasDbRecord = true; - } - } - - return !hasDbRecord; - } - - /** - Boolean, opposite of `isNew` - - @method isSaved - @return {Boolean} - @public - */ - isSaved() { - return !this.isNew(); - } - - /** - Reload a model's data from the database. - - ```js - let post = blogPosts.find(1); - post.attrs; // {id: 1, title: 'Lorem ipsum'} - - post.title = 'Hipster ipsum'; - post.title; // 'Hipster ipsum'; - - post.reload(); // true - post.title; // 'Lorem ipsum' - ``` - - @method reload - @return this - @public - */ - reload() { - if (this.id) { - let collection = toInternalCollectionName(this.modelName); - let attrs = this._schema.db[collection].find(this.id); - - Object.keys(attrs) - .filter(function(attr) { - return attr !== 'id'; - }) - .forEach(function(attr) { - this.attrs[attr] = attrs[attr]; - }, this); - } - - // Clear temp associations - this._tempAssociations = {}; - - return this; - } - - toJSON() { - return this.attrs; - } - - /** - Returns the association for the given key - - @method associationFor - @param key - @public - @hide - */ - associationFor(key) { - return this._schema.associationsFor(this.modelName)[key]; - } - - /** - Returns this model's inverse association for the given - model-type-association pair, if it exists. - - Example: - - post: Model.extend({ - comments: hasMany() - }), - comments: Model.extend({ - post: belongsTo() - }) - - post.inversefor(commentsPostAssociation) would return the - `post.comments` association object. - - Originally we had association.inverse() but that became impossible with - the addition of polymorphic models. Consider the following: - - post: Model.extend({ - comments: hasMany() - }), - picture: Model.extend({ - comments: hasMany() - }), - comments: Model.extend({ - commentable: belongsTo({ polymorphic: true }) - }) - - `commentable.inverse()` is ambiguous - does it return - `post.comments` or `picture.comments`? Instead we need to ask each model - if it has an inverse for a given association. post.inverseFor(commentable) - is no longer ambiguous. - - @method hasInverseFor - @param {String} modelName The model name of the class we're scanning - @param {ORM/Association} association - @return {ORM/Association} - @public - @hide - */ - inverseFor(association) { - return this._explicitInverseFor(association) || this._implicitInverseFor(association); - } - - /** - Finds the inverse for an association that explicity defines it's inverse - - @private - @hide - */ - _explicitInverseFor(association) { - this._checkForMultipleExplicitInverses(association); - - let associations = this._schema.associationsFor(this.modelName); - let inverse = association.opts.inverse; - let candidate = inverse ? associations[inverse] : null; - let matchingPolymorphic = candidate && candidate.isPolymorphic; - let matchingInverse = candidate && candidate.modelName === association.ownerModelName; - let candidateInverse = candidate && candidate.opts.inverse; - - if (candidateInverse && candidate.opts.inverse !== association.key) { - assert( - false, - `You specified an inverse of ${inverse} for ${association.key}, but it does not match ${candidate.modelName} ${candidate.key}'s inverse` - ); - } - - return matchingPolymorphic || matchingInverse ? candidate : null; - } - - /** - Ensures multiple explicit inverses don't exist on the current model - for the given association. - - TODO: move this to compile-time check - - @private - @hide - */ - _checkForMultipleExplicitInverses(association) { - let associations = this._schema.associationsFor(this.modelName); - let matchingExplicitInverses = Object.keys(associations).filter(key => { - let candidate = associations[key]; - let modelMatches = association.ownerModelName === candidate.modelName; - let inverseKeyMatches = association.key === candidate.opts.inverse; - - return modelMatches && inverseKeyMatches; - }); - assert( - matchingExplicitInverses.length <= 1, - `The ${this.modelName} model has defined multiple explicit inverse associations for the ${association.ownerModelName}.${association.key} association.` - ); - } - - /** - Finds if there is an inverse for an association that does not - explicitly define one. - - @private - @hide - */ - _implicitInverseFor(association) { - let associations = this._schema.associationsFor(this.modelName); - let modelName = association.ownerModelName; - - return _values(associations) - .filter(candidate => candidate.modelName === modelName) - .reduce((inverse, candidate) => { - let candidateInverse = candidate.opts.inverse; - let candidateIsImplicitInverse = candidateInverse === undefined; - let candidateIsExplicitInverse = candidateInverse === association.key; - - let candidateMatches = candidateIsImplicitInverse || candidateIsExplicitInverse; - - if (candidateMatches) { - // Need to move this check to compile-time init - assert(!inverse, `The ${this.modelName} model has multiple possible inverse associations for the ${association.ownerModelName}.${association.key} association.`); - inverse = candidate; - } - - return inverse; - }, null); - } - - /** - Returns whether this model has an inverse association for the given - model-type-association pair. - - @method hasInverseFor - @param {String} modelName - @param {ORM/Association} association - @return {Boolean} - @public - @hide - */ - hasInverseFor(association) { - return !!this.inverseFor(association); - } - - /** - Used to check if models match each other. If models are saved, we check model type - and id, since they could have other non-persisted properties that are different. - - @public - @hide - */ - alreadyAssociatedWith(model, association) { - let { key } = association; - let associatedModelOrCollection = this[key]; - - if (associatedModelOrCollection && model) { - if (associatedModelOrCollection instanceof Model) { - if (associatedModelOrCollection.isSaved() && model.isSaved()) { - return associatedModelOrCollection.toString() === model.toString(); - } else { - return associatedModelOrCollection === model; - } - } else { - return associatedModelOrCollection.includes(model); - } - } - } - - associate(model, association) { - if (this.alreadyAssociatedWith(model, association)) { - return; - } - - let { key } = association; - - if (association instanceof HasMany) { - if (!this[key].includes(model)) { - this[key].add(model); - } - } else { - this[key] = model; - } - } - - disassociate(model, association) { - let fk = association.getForeignKey(); - - if (association instanceof HasMany) { - let i; - if (association.isPolymorphic) { - let found = this[fk].find(({ type, id }) => (type === model.modelName && id === model.id)); - i = found && this[fk].indexOf(found); - } else { - i = this[fk].map(key => key.toString()).indexOf(model.id.toString()); - } - - if (i > -1) { - this.attrs[fk].splice(i, 1); - } - } else { - this.attrs[fk] = null; - } - } - - /** - @hide - */ - get isSaving() { - return this._schema.isSaving[this.toString()]; - } - - // Private - /** - model.attrs represents the persistable attributes, i.e. your db - table fields. - @method _setupAttrs - @param attrs - @private - @hide - */ - _setupAttrs(attrs) { - this._validateAttrs(attrs); - - // Filter out association keys - let hash = Object.keys(attrs).reduce((memo, key) => { - if (this.associationKeys.indexOf(key) === -1 && this.associationIdKeys.indexOf(key) === -1) { - memo[key] = attrs[key]; - } - return memo; - }, {}); - - // Ensure fks are there - this.fks.map(function(fk) { - hash[fk] = attrs[fk] !== undefined ? attrs[fk] : null; - }); - - this.attrs = hash; - - // define plain getter/setters for non-association keys - Object.keys(hash).forEach(function(attr) { - if (this.associationKeys.indexOf(attr) === -1 && this.associationIdKeys.indexOf(attr) === -1) { - this._definePlainAttribute(attr); - } - }, this); - } - - /** - Define getter/setter for a plain attribute - @method _definePlainAttribute - @param attr - @private - @hide - */ - _definePlainAttribute(attr) { - - // Ensure the property hasn't already been defined - let existingProperty = Object.getOwnPropertyDescriptor(this, attr); - if (existingProperty && existingProperty.get) { - return; - } - - // Ensure the attribute is on the attrs hash - if (!this.attrs.hasOwnProperty(attr)) { - this.attrs[attr] = null; - } - - // Define the getter/setter - Object.defineProperty(this, attr, { - get() { - return this.attrs[attr]; - }, - set(val) { - this.attrs[attr] = val; - return this; - } - }); - } - - /** - Foreign keys get set on attrs directly (to avoid potential recursion), but - model references use the setter. - * - We validate foreign keys during instantiation. - * - @method _setupRelationships - @param attrs - @private - @hide - */ - _setupRelationships(attrs) { - let foreignKeysHash = Object.keys(attrs).reduce((memo, attr) => { - if (this.associationIdKeys.indexOf(attr) > -1 || this.fks.indexOf(attr) > -1) { - memo[attr] = attrs[attr]; - } - return memo; - }, {}); - - Object.keys(foreignKeysHash).forEach(function(attr) { - let fk = foreignKeysHash[attr]; - if (fk !== undefined && fk !== null) { - this._validateForeignKeyExistsInDatabase(attr, fk); - } - - this.attrs[attr] = fk; - }, this); - - let associationKeysHash = Object.keys(attrs).reduce((memo, attr) => { - if (this.associationKeys.indexOf(attr) > -1) { - memo[attr] = attrs[attr]; - } - return memo; - }, {}); - Object.keys(associationKeysHash).forEach(function(attr) { - this[attr] = associationKeysHash[attr]; - }, this); - } - - /** - @method _validateAttrs - @private - @hide - */ - _validateAttrs(attrs) { - // Verify attrs passed in for associations are actually associations - Object.keys(attrs) - .filter(key => this.associationKeys.includes(key)) - .forEach(key => { - let value = attrs[key]; - let association = this.associationFor(key); - let isNull = value === null; - - if (association instanceof HasMany) { - let isCollection = value instanceof Collection || value instanceof PolymorphicCollection; - let isArrayOfModels = Array.isArray(value) && value.every(item => item instanceof Model); - - assert(isCollection || isArrayOfModels || isNull, `You're trying to create a ${this.modelName} model and you passed in "${value}" under the ${key} key, but that key is a HasMany relationship. You must pass in a Collection, PolymorphicCollection, array of Models, or null.`); - - } else if (association instanceof BelongsTo) { - assert(value instanceof Model || isNull, `You're trying to create a ${this.modelName} model and you passed in "${value}" under the ${key} key, but that key is a BelongsTo relationship. You must pass in a Model or null.`); - } - }); - - // Verify attrs passed in for association foreign keys are actually fks - Object.keys(attrs) - .filter(key => this.associationIdKeys.includes(key)) - .forEach(key => { - let value = attrs[key]; - - if (key.match(/Ids$/)) { - let isArray = Array.isArray(value); - let isNull = value === null; - assert(isArray || isNull, `You're trying to create a ${this.modelName} model and you passed in "${value}" under the ${key} key, but that key is a foreign key for a HasMany relationship. You must pass in an array of ids or null.`); - } - }); - - // Verify no undefined associations are passed in - Object.keys(attrs) - .filter(key => { - let value = attrs[key]; - let isModelOrCollection = (value instanceof Model || value instanceof Collection || value instanceof PolymorphicCollection); - let isArrayOfModels = Array.isArray(value) && value.length && value.every(item => item instanceof Model); - - return isModelOrCollection || isArrayOfModels; - }) - .forEach(key => { - let modelOrCollection = attrs[key]; - - assert(this.associationKeys.indexOf(key) > -1, `You're trying to create a ${this.modelName} model and you passed in a ${modelOrCollection.toString()} under the ${key} key, but you haven't defined that key as an association on your model.`); - }); - } - - /** - Originally we validated this via association.setId method, but it triggered - recursion. That method is designed for updating an existing model's ID so - this method is needed during instantiation. - * - @method _validateForeignKeyExistsInDatabase - @private - @hide - */ - _validateForeignKeyExistsInDatabase(foreignKeyName, foreignKeys) { - if (Array.isArray(foreignKeys)) { - let association = Object.keys(this.hasManyAssociations) - .map(key => this.hasManyAssociations[key]) - .filter(association => association.getForeignKey() === foreignKeyName)[0]; - - let found; - if (association.isPolymorphic) { - found = foreignKeys.map(({ type, id }) => { - return this._schema.db[toInternalCollectionName(type)].find(id); - }); - found = _compact(found); - } else { - found = this._schema.db[toInternalCollectionName(association.modelName)].find(foreignKeys); - } - - let foreignKeyLabel = association.isPolymorphic ? foreignKeys.map(fk => `${fk.type}:${fk.id}`).join(',') : foreignKeys; - assert(found.length === foreignKeys.length, `You're instantiating a ${this.modelName} that has a ${foreignKeyName} of ${foreignKeyLabel}, but some of those records don't exist in the database.`); - - } else { - let association = Object.keys(this.belongsToAssociations) - .map(key => this.belongsToAssociations[key]) - .filter(association => association.getForeignKey() === foreignKeyName)[0]; - - let found; - if (association.isPolymorphic) { - found = this._schema.db[toInternalCollectionName(foreignKeys.type)].find(foreignKeys.id); - } else { - found = this._schema.db[toInternalCollectionName(association.modelName)].find(foreignKeys); - } - - let foreignKeyLabel = association.isPolymorphic ? `${foreignKeys.type}:${foreignKeys.id}` : foreignKeys; - assert(found, `You're instantiating a ${this.modelName} that has a ${foreignKeyName} of ${foreignKeyLabel}, but that record doesn't exist in the database.`); - } - } - - /** - Update associated children when saving a collection - * - @method _saveAssociations - @private - @hide - */ - _saveAssociations() { - this._saveBelongsToAssociations(); - this._saveHasManyAssociations(); - } - - _saveBelongsToAssociations() { - _values(this.belongsToAssociations).forEach(association => { - this._disassociateFromOldInverses(association); - this._saveNewAssociates(association); - this._associateWithNewInverses(association); - }); - } - - _saveHasManyAssociations() { - _values(this.hasManyAssociations).forEach(association => { - this._disassociateFromOldInverses(association); - this._saveNewAssociates(association); - this._associateWithNewInverses(association); - }); - } - - _disassociateFromOldInverses(association) { - if (association instanceof HasMany) { - this._disassociateFromHasManyInverses(association); - } else if (association instanceof BelongsTo) { - this._disassociateFromBelongsToInverse(association); - } - } - - // Disassociate currently persisted models that are no longer associated - _disassociateFromHasManyInverses(association) { - let { key } = association; - let fk = association.getForeignKey(); - let tempAssociation = this._tempAssociations && this._tempAssociations[key]; - let associateIds = this.attrs[fk]; - - if (tempAssociation && associateIds) { - let models; - if (association.isPolymorphic) { - models = associateIds.map(({ type, id }) => { - return this._schema[toCollectionName(type)].find(id); - }); - } else { - // TODO: prob should initialize hasMany fks with [] - models = this._schema[toCollectionName(association.modelName)] - .find(associateIds || []) - .models; - } - - models - .filter(associate => !associate.isSaving) // filter out models that are already being saved - .filter(associate => !tempAssociation.includes(associate)) // filter out models that will still be associated - .forEach(associate => { - if (associate.hasInverseFor(association)) { - let inverse = associate.inverseFor(association); - - associate.disassociate(this, inverse); - associate.save(); - } - }); - } - } - - /* - Disassociate currently persisted models that are no longer associated. - - Example: - - post: Model.extend({ - comments: hasMany() - }), - - comment: Model.extend({ - post: belongsTo() - }) - - Assume `this` is comment:1. When saving, if comment:1 is no longer - associated with post:1, we need to remove comment:1 from post:1.comments. - In this example `association` would be `comment.post`. - */ - _disassociateFromBelongsToInverse(association) { - let { key } = association; - let fk = association.getForeignKey(); - let tempAssociation = this._tempAssociations && this._tempAssociations[key]; - let associateId = this.attrs[fk]; - - if ((tempAssociation !== undefined) && associateId) { - let associate; - if (association.isPolymorphic) { - associate = this._schema[toCollectionName(associateId.type)] - .find(associateId.id); - } else { - associate = this._schema[toCollectionName(association.modelName)] - .find(associateId); - } - - if (associate.hasInverseFor(association)) { - let inverse = associate.inverseFor(association); - - associate.disassociate(this, inverse); - associate._updateInDb(associate.attrs); - } - } - } - - // Find all other models that depend on me and update their foreign keys - _disassociateFromDependents() { - this._schema.dependentAssociationsFor(this.modelName) - .forEach(association => { - association.disassociateAllDependentsFromTarget(this); - }); - } - - _saveNewAssociates(association) { - let { key } = association; - let fk = association.getForeignKey(); - let tempAssociate = this._tempAssociations && this._tempAssociations[key]; - - if (tempAssociate !== undefined) { - this.__isSavingNewChildren = true; - delete this._tempAssociations[key]; - - if (tempAssociate instanceof Collection) { - tempAssociate.models - .filter(model => !model.isSaving) - .forEach(child => { - child.save(); - }); - - this._updateInDb({ [fk]: tempAssociate.models.map(child => child.id) }); - - } else if (tempAssociate instanceof PolymorphicCollection) { - tempAssociate.models - .filter(model => !model.isSaving) - .forEach(child => { - child.save(); - }); - - this._updateInDb({ - [fk]: tempAssociate.models.map(child => { - return { type: child.modelName, id: child.id }; - }) - }); - - } else { - - // Clearing the association - if (tempAssociate === null) { - this._updateInDb({ [fk]: null }); - - // Self-referential - } else if (this.equals(tempAssociate)) { - this._updateInDb({ [fk]: this.id }); - - // Non-self-referential - } else if (!tempAssociate.isSaving) { - - // Save the tempAssociate and update the local reference - tempAssociate.save(); - this._syncTempAssociations(tempAssociate); - - let fkValue; - if (association.isPolymorphic) { - fkValue = { id: tempAssociate.id, type: tempAssociate.modelName}; - } else { - fkValue = tempAssociate.id; - } - - this._updateInDb({ [fk]: fkValue }); - } - } - - this.__isSavingNewChildren = false; - } - } - - /* - Step 3 in saving associations. - - Example: - - // initial state - post.author = steinbeck; - - // new state - post.author = twain; - - 1. Disassociate from old inverse (remove post from steinbeck.posts) - 2. Save new associates (if twain.isNew, save twain) - -> 3. Associate with new inverse (add post to twain.posts) - */ - _associateWithNewInverses(association) { - if (!this.__isSavingNewChildren) { - let modelOrCollection = this[association.key]; - - if (modelOrCollection instanceof Model) { - this._associateModelWithInverse(modelOrCollection, association); - - } else if (modelOrCollection instanceof Collection || modelOrCollection instanceof PolymorphicCollection) { - modelOrCollection.models - .forEach(model => { - this._associateModelWithInverse(model, association); - }); - } - - delete this._tempAssociations[association.key]; - } - } - - _associateModelWithInverse(model, association) { - if (model.hasInverseFor(association)) { - let inverse = model.inverseFor(association); - let inverseFk = inverse.getForeignKey(); - - let ownerId = this.id; - if (inverse instanceof BelongsTo) { - let newId; - if (inverse.isPolymorphic) { - newId = { type: this.modelName, id: ownerId }; - } else { - newId = ownerId; - } - this._schema.db[toInternalCollectionName(model.modelName)].update(model.id, { [inverseFk]: newId }); - } else { - let inverseCollection = this._schema.db[toInternalCollectionName(model.modelName)]; - let currentIdsForInverse = inverseCollection.find(model.id)[inverse.getForeignKey()] || []; - let newIdsForInverse = _assign([], currentIdsForInverse); - let newId, alreadyAssociatedWith; - - if (inverse.isPolymorphic) { - newId = { type: this.modelName, id: ownerId }; - alreadyAssociatedWith = newIdsForInverse.some(key => (key.type == this.modelName && key.id == ownerId)); - } else { - newId = ownerId; - alreadyAssociatedWith = newIdsForInverse.indexOf(ownerId) !== -1; - } - - if (!alreadyAssociatedWith) { - newIdsForInverse.push(newId); - } - - inverseCollection.update(model.id, { [inverseFk]: newIdsForInverse }); - } - } - } - - // Used to update data directly, since #save and #update can retrigger saves, - // which can cause cycles with associations. - _updateInDb(attrs) { - this.attrs = this._schema.db[toInternalCollectionName(this.modelName)].update(this.attrs.id, attrs); - } - - /* - Super gnarly: after we save this tempAssociate, we we need to through - all other tempAssociates for a reference to this same model, and - update it. Otherwise those other references are stale, which could - cause a bug when they are subsequently saved. - - This only works for belongsTo right now, should add hasMany logic to it. - - See issue #1613: https://github.com/samselikoff/ember-cli-mirage/pull/1613 - */ - _syncTempAssociations(tempAssociate) { - Object.keys(this._tempAssociations).forEach(key => { - if (this._tempAssociations[key] && this._tempAssociations[key].toString() === tempAssociate.toString()) { - this._tempAssociations[key] = tempAssociate; - } - }); - } - - /** - Simple string representation of the model and id. - - ```js - let post = blogPosts.find(1); - post.toString(); // "model:blogPost:1" - ``` - - @method toString - @return {String} - @public - */ - toString() { - let idLabel = this.id ? `(${this.id})` : ''; - - return `model:${this.modelName}${idLabel}`; - } - - /** - Checks the equality of this model and the passed-in model - * - @method equals - @return boolean - @public - @hide - */ - equals(model) { - return this.toString() === model.toString(); - } - -} - -Model.extend = extend; -Model.findBelongsToAssociation = function(associationType) { - return this.prototype.belongsToAssociations[associationType]; -}; +import Model from '@miragejs/server/lib/orm/model'; +export * from '@miragejs/server/lib/orm/model'; export default Model; diff --git a/addon/orm/polymorphic-collection.js b/addon/orm/polymorphic-collection.js index 6bc5a2156..637d4b223 100644 --- a/addon/orm/polymorphic-collection.js +++ b/addon/orm/polymorphic-collection.js @@ -1,182 +1,4 @@ -import _invokeMap from 'lodash/invokeMap'; -import _isEqual from 'lodash/isEqual'; +import PolymorphicCollection from '@miragejs/server/lib/orm/polymorphic-collection'; +export * from '@miragejs/server/lib/orm/polymorphic-collection'; -/** - * An array of models, returned from one of the schema query - * methods (all, find, where). Knows how to update and destroy its models. - * - * Identical to Collection except it can contain a heterogeneous array of - * models. Thus, it has no `modelName` property. This lets serializers and - * other parts of the system interact with it differently. - * - * @class PolymorphicCollection - * @constructor - * @public - * @hide - */ -export default class PolymorphicCollection { - constructor(models = []) { - this.models = models; - } - - /** - * Number of models in the collection. - * - * @property length - * @type Number - * @public - */ - get length() { - return this.models.length; - } - - /** - * Updates each model in the collection (persisting immediately to the db). - * @method update - * @param key - * @param val - * @return this - * @public - */ - update(...args) { - _invokeMap(this.models, 'update', ...args); - - return this; - } - - /** - * Destroys the db record for all models in the collection. - * @method destroy - * @return this - * @public - */ - destroy() { - _invokeMap(this.models, 'destroy'); - - return this; - } - - /** - * Saves all models in the collection. - * @method save - * @return this - * @public - */ - save() { - _invokeMap(this.models, 'save'); - - return this; - } - - /** - * Reloads each model in the collection. - * @method reload - * @return this - * @public - */ - reload() { - _invokeMap(this.models, 'reload'); - - return this; - } - - /** - * Adds a model to this collection - * - * @method add - * @return this - * @public - */ - add(model) { - this.models.push(model); - - return this; - } - - /** - * Removes a model to this collection - * - * @method remove - * @return this - * @public - */ - remove(model) { - let [ match ] = this.models.filter(m => _isEqual(m.attrs, model.attrs)); - if (match) { - let i = this.models.indexOf(match); - this.models.splice(i, 1); - } - - return this; - } - - /** - * Checks if the collection includes the model - * - * @method includes - * @return boolean - * @public - */ - includes(model) { - return this.models.filter(m => _isEqual(m.attrs, model.attrs)).length > 0; - } - - /** - * @method filter - * @param f - * @return {Collection} - * @public - */ - filter(f) { - let filteredModels = this.models.filter(f); - - return new PolymorphicCollection(filteredModels); - } - - /** - * @method sort - * @param f - * @return {Collection} - * @public - */ - sort(f) { - let sortedModels = this.models.concat().sort(f); - - return new PolymorphicCollection(sortedModels); - } - - /** - * @method slice - * @param {Integer} begin - * @param {Integer} end - * @return {Collection} - * @public - */ - slice(...args) { - let slicedModels = this.models.slice(...args); - - return new PolymorphicCollection(slicedModels); - } - - /** - * @method mergeCollection - * @param collection - * @return this - * @public - */ - mergeCollection(collection) { - this.models = this.models.concat(collection.models); - - return this; - } - - /** - * Simple string representation of the collection and id. - * @method toString - * @return {String} - * @public - */ - toString() { - return `collection:${this.modelName}(${this.models.map((m) => m.id).join(',')})`; - } -} +export default PolymorphicCollection; diff --git a/addon/orm/schema.js b/addon/orm/schema.js index c662e05bf..cc0575943 100644 --- a/addon/orm/schema.js +++ b/addon/orm/schema.js @@ -1,492 +1,4 @@ -import { pluralize, camelize, dasherize } from '../utils/inflector'; -import { toCollectionName, toModelName } from 'ember-cli-mirage/utils/normalize-name'; -import Association from './associations/association'; -import Collection from './collection'; -import _assign from 'lodash/assign'; -import _forIn from 'lodash/forIn'; -import _includes from 'lodash/includes'; -import assert from '../assert'; +import Schema from '@miragejs/server/lib/orm/schema'; +export * from '@miragejs/server/lib/orm/schema'; -/** - The primary use of the `Schema` class is to use it to find Models and Collections via the `Model` class methods. - - The `Schema` is most often accessed via the first parameter to a route handler: - - ```js - this.get('posts', schema => { - return schema.posts.where({ isAdmin: false }); - }); - ``` - - It is also available from the `.schema` property of a `server` instance: - - ```js - server.schema.users.create({ name: 'Yehuda' }); - ``` - - To work with the Model or Collection returned from one of the methods below, refer to the instance methods in the API docs for the `Model` and `Collection` classes. - - @class Schema - @constructor - @public - */ -export default class Schema { - - constructor(db, modelsMap = {}) { - assert(db, 'A schema requires a db'); - - /** - Returns Mirage's database. See the `Db` docs for the db's API. - - @property db - @type {Object} - @public - */ - this.db = db; - this._registry = {}; - this._dependentAssociations = { polymorphic: [] }; - this.registerModels(modelsMap); - this.isSaving = {}; // a hash of models that are being saved, used to avoid cycles - } - - /** - @method registerModels - @param hash - @public - @hide - */ - registerModels(hash = {}) { - _forIn(hash, (model, key) => { - this.registerModel(key, hash[key]); - }); - } - - /** - @method registerModel - @param type - @param ModelClass - @public - @hide - */ - registerModel(type, ModelClass) { - let camelizedModelName = camelize(type); - let modelName = dasherize(camelizedModelName); - - // Avoid mutating original class, because we may want to reuse it across many tests - ModelClass = ModelClass.extend(); - - // Store model & fks in registry - // TODO: don't think this is needed anymore - this._registry[camelizedModelName] = this._registry[camelizedModelName] || { class: null, foreignKeys: [] }; // we may have created this key before, if another model added fks to it - this._registry[camelizedModelName].class = ModelClass; - - // TODO: set here, remove from model#constructor - ModelClass.prototype._schema = this; - ModelClass.prototype.modelName = modelName; - // Set up associations - ModelClass.prototype.hasManyAssociations = {}; // a registry of the model's hasMany associations. Key is key from model definition, value is association instance itself - ModelClass.prototype.belongsToAssociations = {}; // a registry of the model's belongsTo associations. Key is key from model definition, value is association instance itself - ModelClass.prototype.associationKeys = []; // ex: address.user, user.addresses - ModelClass.prototype.associationIdKeys = []; // ex: address.user_id, user.address_ids - ModelClass.prototype.dependentAssociations = []; // a registry of associations that depend on this model, needed for deletion cleanup. - - let fksAddedFromThisModel = {}; - for (let associationProperty in ModelClass.prototype) { - if (ModelClass.prototype[associationProperty] instanceof Association) { - let association = ModelClass.prototype[associationProperty]; - association.key = associationProperty; - association.modelName = association.modelName || toModelName(associationProperty); - association.ownerModelName = modelName; - association.setSchema(this); - - // Update the registry with this association's foreign keys. This is - // essentially our "db migration", since we must know about the fks. - let [fkHolder, fk] = association.getForeignKeyArray(); - - fksAddedFromThisModel[fkHolder] = fksAddedFromThisModel[fkHolder] || []; - assert( - !_includes(fksAddedFromThisModel[fkHolder], fk), - `Your '${type}' model definition has multiple possible inverse relationships of type '${fkHolder}'. - - Please read the associations guide and specify explicit inverses: http://www.ember-cli-mirage.com/docs/v0.3.x/models/#associations` - ); - fksAddedFromThisModel[fkHolder].push(fk); - - this._addForeignKeyToRegistry(fkHolder, fk); - - // Augment the Model's class with any methods added by this association - association.addMethodsToModelClass(ModelClass, associationProperty); - } - } - - // Create a db collection for this model, if doesn't exist - let collection = toCollectionName(modelName); - if (!this.db[collection]) { - this.db.createCollection(collection); - } - - // Create the entity methods - this[collection] = { - camelizedModelName, - new: (attrs) => this.new(camelizedModelName, attrs), - create: (attrs) => this.create(camelizedModelName, attrs), - all: (attrs) => this.all(camelizedModelName, attrs), - find: (attrs) => this.find(camelizedModelName, attrs), - findBy: (attrs) => this.findBy(camelizedModelName, attrs), - findOrCreateBy: (attrs) => this.findOrCreateBy(camelizedModelName, attrs), - where: (attrs) => this.where(camelizedModelName, attrs), - none: (attrs) => this.none(camelizedModelName, attrs), - first: (attrs) => this.first(camelizedModelName, attrs) - }; - - return this; - } - - /** - @method modelFor - @param type - @public - @hide - */ - modelFor(type) { - return this._registry[type]; - } - - /** - Create a new unsaved model instance with attributes *attrs*. - - ```js - let post = blogPosts.new({ title: 'Lorem ipsum' }); - post.title; // Lorem ipsum - post.id; // null - post.isNew(); // true - ``` - - @method new - @param type - @param attrs - @public - */ - new(type, attrs) { - return this._instantiateModel(dasherize(type), attrs); - } - - /** - Create a new model instance with attributes *attrs*, and insert it into the database. - - ```js - let post = blogPosts.create({title: 'Lorem ipsum'}); - post.title; // Lorem ipsum - post.id; // 1 - post.isNew(); // false - ``` - - @method create - @param type - @param attrs - @public - */ - create(type, attrs) { - return this.new(type, attrs).save(); - } - - /** - Return all models in the database. - - ```js - let posts = blogPosts.all(); - // [post:1, post:2, ...] - ``` - - @method all - @param type - @public - */ - all(type) { - let collection = this._collectionForType(type); - - return this._hydrate(collection, dasherize(type)); - } - - /** - Return an empty collection of type `type`. - - @method none - @param type - @public - */ - none(type) { - return this._hydrate([], dasherize(type)); - } - - /** - Return one or many models in the database by id. - - ```js - let post = blogPosts.find(1); - let posts = blogPosts.find([1, 3, 4]); - ``` - - @method find - @param type - @param ids - @public - */ - find(type, ids) { - let collection = this._collectionForType(type); - let records = collection.find(ids); - - if (Array.isArray(ids)) { - assert( - records.length === ids.length, - `Couldn't find all ${pluralize(type)} with ids: (${ids.join(',')}) (found ${records.length} results, but was looking for ${ids.length})` - ); - } - - return this._hydrate(records, dasherize(type)); - } - - /** - Returns the first model in the database that matches the key-value pairs in `attrs`. Note that a string comparison is used. - - ```js - let post = blogPosts.findBy({ published: true }); - ``` - - N.B. This will return `null` if the schema doesn't have any matching record. - - @method findBy - @param type - @param attributeName - @public - */ - findBy(type, query) { - let collection = this._collectionForType(type); - let record = collection.findBy(query); - - return this._hydrate(record, dasherize(type)); - } - - /** - Returns the first model in the database that matches the key-value pairs in `attrs`, or creates a record with the attributes if one is not found. - - ```js - // Find the first published blog post, or create a new one. - let post = blogPosts.findOrCreateBy({ published: true }); - ``` - - @method findOrCreateBy - @param type - @param attributeName - @public - */ - findOrCreateBy(type, attrs) { - let collection = this._collectionForType(type); - let record = collection.findBy(attrs); - let model; - - if (!record) { - model = this.create(type, attrs); - } else { - model = this._hydrate(record, dasherize(type)); - } - - return model; - } - - /** - Return an array of models in the database matching the key-value pairs in *query*. Note that a string comparison is used. - - ```js - let posts = blogPosts.where({ published: true }); - ``` - - @method where - @param type - @param query - @public - */ - where(type, query) { - let collection = this._collectionForType(type); - let records = collection.where(query); - - return this._hydrate(records, dasherize(type)); - } - - /** - Returns the first model in the database. - - ```js - let post = blogPosts.first(); - ``` - - N.B. This will return `null` if the schema doesn't contain any records. - - @method first - @param type - @public - */ - first(type) { - let collection = this._collectionForType(type); - let record = collection[0]; - - return this._hydrate(record, dasherize(type)); - } - - /** - @method modelClassFor - @param modelName - @public - @hide - */ - modelClassFor(modelName) { - let model = this._registry[camelize(modelName)]; - - assert(model, `Model not registered: ${modelName}`); - - return model.class.prototype; - } - - /* - This method updates the dependentAssociations registry, which is used to - keep track of which models depend on a given association. It's used when - deleting models - their dependents need to be looked up and foreign keys - updated. - - For example, - - schema = { - post: Model.extend(), - comment: Model.extend({ - post: belongsTo() - }) - }; - - comment1.post = post1; - ... - post1.destroy() - - Deleting this post should clear out comment1's foreign key. - - Polymorphic associations can have _any_ other model as a dependent, so we - handle them separately. - */ - addDependentAssociation(association, modelName) { - if (association.isPolymorphic) { - this._dependentAssociations.polymorphic.push(association); - } else { - this._dependentAssociations[modelName] = this._dependentAssociations[modelName] || []; - this._dependentAssociations[modelName].push(association); - } - } - - dependentAssociationsFor(modelName) { - let directDependents = this._dependentAssociations[modelName] || []; - let polymorphicAssociations = this._dependentAssociations.polymorphic || []; - - return directDependents.concat(polymorphicAssociations); - } - - associationsFor(modelName) { - let modelClass = this.modelClassFor(modelName); - - return _assign({}, modelClass.belongsToAssociations, modelClass.hasManyAssociations); - } - - hasModelForModelName(modelName) { - return this.modelFor(camelize(modelName)); - } - - /* - Private methods - */ - - /** - @method _collectionForType - @param type - @private - @hide - */ - _collectionForType(type) { - let collection = toCollectionName(type); - assert( - this.db[collection], - `You're trying to find model(s) of type ${type} but this collection doesn't exist in the database.` - ); - - return this.db[collection]; - } - - /** - @method _addForeignKeyToRegistry - @param type - @param fk - @private - @hide - */ - _addForeignKeyToRegistry(type, fk) { - this._registry[type] = this._registry[type] || { class: null, foreignKeys: [] }; - - let fks = this._registry[type].foreignKeys; - if (!_includes(fks, fk)) { - fks.push(fk); - } - } - - /** - @method _instantiateModel - @param modelName - @param attrs - @private - @hide - */ - _instantiateModel(modelName, attrs) { - let ModelClass = this._modelFor(modelName); - let fks = this._foreignKeysFor(modelName); - - return new ModelClass(this, modelName, attrs, fks); - } - - /** - @method _modelFor - @param modelName - @private - @hide - */ - _modelFor(modelName) { - return this._registry[camelize(modelName)].class; - } - - /** - @method _foreignKeysFor - @param modelName - @private - @hide - */ - _foreignKeysFor(modelName) { - return this._registry[camelize(modelName)].foreignKeys; - } - - /** - Takes a record and returns a model, or an array of records - and returns a collection. - * - @method _hydrate - @param records - @param modelName - @private - @hide - */ - _hydrate(records, modelName) { - if (Array.isArray(records)) { - let models = records.map(function(record) { - return this._instantiateModel(modelName, record); - }, this); - return new Collection(modelName, models); - } else if (records) { - return this._instantiateModel(modelName, records); - } else { - return null; - } - } -} +export default Schema; diff --git a/addon/route-handlers/base.js b/addon/route-handlers/base.js index 9e77be384..f0db5bb69 100644 --- a/addon/route-handlers/base.js +++ b/addon/route-handlers/base.js @@ -1,116 +1,4 @@ -import assert from 'ember-cli-mirage/assert'; -import { camelize, singularize, dasherize } from 'ember-cli-mirage/utils/inflector'; -import HasMany from '../orm/associations/has-many'; +import Base from '@miragejs/server/lib/route-handlers/base'; +export * from '@miragejs/server/lib/route-handlers/base'; -const PATH_VAR_REGEXP = /^:/; - -/** - @hide -*/ -export default class BaseRouteHandler { - - getModelClassFromPath(fullPath) { - if (!fullPath) { - return; - } - let path = fullPath.split('/'); - let lastPath; - while (path.length > 0) { - lastPath = path.splice(-1)[0]; - if (lastPath && !PATH_VAR_REGEXP.test(lastPath)) { - break; - } - } - let modelName = dasherize(camelize(singularize(lastPath))); - - return modelName; - } - - _getIdForRequest(request, jsonApiDoc) { - let id; - if (request && request.params && request.params.id) { - id = request.params.id; - } else if (jsonApiDoc && jsonApiDoc.data && jsonApiDoc.data.id) { - id = jsonApiDoc.data.id; - } - return id; - } - - _getJsonApiDocForRequest(request, modelName) { - let body; - if (request && request.requestBody) { - body = JSON.parse(request.requestBody); - } - return this.serializerOrRegistry.normalize(body, modelName); - } - - _getAttrsForRequest(request, modelName) { - let json = this._getJsonApiDocForRequest(request, modelName); - let id = this._getIdForRequest(request, json); - let attrs = {}; - - assert( - json.data && (json.data.attributes || json.data.type || json.data.relationships), - `You're using a shorthand or #normalizedRequestAttrs, but your serializer's normalize function did not return a valid JSON:API document. http://www.ember-cli-mirage.com/docs/v0.3.x/serializers/#normalizejson` - ); - - if (json.data.attributes) { - attrs = Object.keys(json.data.attributes).reduce((sum, key) => { - sum[camelize(key)] = json.data.attributes[key]; - return sum; - }, {}); - } - - if (json.data.relationships) { - Object.keys(json.data.relationships).forEach((relationshipName) => { - let relationship = json.data.relationships[relationshipName]; - let modelClass = this.schema.modelClassFor(modelName); - let association = modelClass.associationFor(camelize(relationshipName)); - let valueForRelationship; - - assert( - association, - `You're passing the relationship '${relationshipName}' to the '${modelName}' model via a ${request.method} to '${request.url}', but you did not define the '${relationshipName}' association on the '${modelName}' model. http://www.ember-cli-mirage.com/docs/v0.4.x/models/#associations` - ); - - if (association.isPolymorphic) { - valueForRelationship = relationship.data; - - } else if (association instanceof HasMany) { - valueForRelationship = relationship.data && relationship.data.map(rel => rel.id); - - } else { - valueForRelationship = relationship.data && relationship.data.id; - } - - attrs[association.identifier] = valueForRelationship; - }, {}); - } - - if (id) { - attrs.id = id; - } - - return attrs; - } - - _getAttrsForFormRequest({ requestBody }) { - let attrs; - let urlEncodedParts = []; - - assert( - requestBody && typeof requestBody === 'string', - `You're using the helper method #normalizedFormData, but the request body is empty or not a valid url encoded string.` - ); - - urlEncodedParts = requestBody.split('&'); - - attrs = urlEncodedParts.reduce((a, urlEncodedPart) => { - let [key, value] = urlEncodedPart.split('='); - a[key] = decodeURIComponent(value.replace(/\+/g, ' ')); - return a; - }, {}); - - return attrs; - } -} +export default Base; diff --git a/addon/route-handlers/function.js b/addon/route-handlers/function.js index 167cd5859..5e36a988b 100644 --- a/addon/route-handlers/function.js +++ b/addon/route-handlers/function.js @@ -1,69 +1,4 @@ -import BaseRouteHandler from './base'; -import assert from 'ember-cli-mirage/assert'; -import { dasherize } from 'ember-cli-mirage/utils/inflector'; +import FunctionHandler from '@miragejs/server/lib/route-handlers/function'; +export * from '@miragejs/server/lib/route-handlers/function'; -/** - * @hide - */ -export default class FunctionRouteHandler extends BaseRouteHandler { - - constructor(schema, serializerOrRegistry, userFunction, path) { - super(); - this.schema = schema; - this.serializerOrRegistry = serializerOrRegistry; - this.userFunction = userFunction; - this.path = path; - } - - handle(request) { - return this.userFunction(this.schema, request); - } - - setRequest(request) { - this.request = request; - } - - serialize(response, serializerType) { - let serializer; - - if (serializerType) { - serializer = this.serializerOrRegistry.serializerFor(serializerType, { explicit: true }); - } else { - serializer = this.serializerOrRegistry; - } - - return serializer.serialize(response, this.request); - } - - normalizedRequestAttrs(modelName = null) { - let { - path, - request, - request: { requestHeaders } - } = this; - let attrs; - - let lowerCaseHeaders = {}; - for (let header in requestHeaders) { - lowerCaseHeaders[header.toLowerCase()] = requestHeaders[header]; - } - if (/x-www-form-urlencoded/.test(lowerCaseHeaders['content-type'])) { - attrs = this._getAttrsForFormRequest(request); - } else { - if (modelName) { - assert(dasherize(modelName) === modelName, `You called normalizedRequestAttrs('${modelName}'), but normalizedRequestAttrs was intended to be used with the dasherized version of the model type. Please change this to normalizedRequestAttrs('${dasherize(modelName)}').`); - } else { - modelName = this.getModelClassFromPath(path); - } - - assert( - this.schema.hasModelForModelName(modelName), - `You're using a shorthand or the #normalizedRequestAttrs helper but the detected model of '${modelName}' does not exist. You might need to pass in the correct modelName as the first argument to #normalizedRequestAttrs.` - ); - - attrs = this._getAttrsForRequest(request, modelName); - } - - return attrs; - } -} +export default FunctionHandler; diff --git a/addon/route-handlers/object.js b/addon/route-handlers/object.js index 2377f50a4..4a59bd3fa 100644 --- a/addon/route-handlers/object.js +++ b/addon/route-handlers/object.js @@ -1,16 +1,4 @@ -/** - * @hide - */ -export default class ObjectRouteHandler { +import ObjectHandler from '@miragejs/server/lib/route-handlers/object'; +export * from '@miragejs/server/lib/route-handlers/object'; - constructor(schema, serializerOrRegistry, object) { - this.schema = schema; - this.serializerOrRegistry = serializerOrRegistry; - this.object = object; - } - - handle(/* request */) { - return this.object; - } - -} +export default ObjectHandler; diff --git a/addon/route-handlers/shorthands/base.js b/addon/route-handlers/shorthands/base.js index 36259d7b0..f531370e3 100644 --- a/addon/route-handlers/shorthands/base.js +++ b/addon/route-handlers/shorthands/base.js @@ -1,39 +1,4 @@ -import { toCollectionName } from 'ember-cli-mirage/utils/normalize-name'; -import BaseRouteHandler from '../base'; +import Base from '@miragejs/server/lib/route-handlers/shorthands/base'; +export * from '@miragejs/server/lib/route-handlers/shorthands/base'; -/** - @hide -*/ -export default class BaseShorthandRouteHandler extends BaseRouteHandler { - - constructor(schema, serializerOrRegistry, shorthand, path, options = {}) { - super(); - shorthand = shorthand || this.getModelClassFromPath(path); - this.schema = schema; - this.serializerOrRegistry = serializerOrRegistry; - this.shorthand = shorthand; - this.options = options; - - let type = Array.isArray(shorthand) ? 'array' : typeof shorthand; - if (type === 'string') { - let modelClass = this.schema[toCollectionName(shorthand)]; - this.handle = (request) => { - return this.handleStringShorthand(request, modelClass); - }; - } else if (type === 'array') { - let modelClasses = shorthand.map((modelName) => this.schema[toCollectionName(modelName)]); - this.handle = (request) => { - return this.handleArrayShorthand(request, modelClasses); - }; - } - } - - // handleStringShorthand() { - // - // } - // - // handleArrayShorthand() { - // - // } - -} +export default Base; diff --git a/addon/route-handlers/shorthands/delete.js b/addon/route-handlers/shorthands/delete.js index 00d9d1a9e..ee21b2113 100644 --- a/addon/route-handlers/shorthands/delete.js +++ b/addon/route-handlers/shorthands/delete.js @@ -1,47 +1,4 @@ -import assert from 'ember-cli-mirage/assert'; -import BaseShorthandRouteHandler from './base'; -import { pluralize, camelize } from 'ember-cli-mirage/utils/inflector'; +import Delete from '@miragejs/server/lib/route-handlers/shorthands/delete'; +export * from '@miragejs/server/lib/route-handlers/shorthands/delete'; -/** - * @hide - */ -export default class DeleteShorthandRouteHandler extends BaseShorthandRouteHandler { - - /* - Remove the model from the db of type *camelizedModelName*. - - This would remove the user with id :id: - Ex: this.del('/contacts/:id', 'user'); - */ - handleStringShorthand(request, modelClass) { - let modelName = this.shorthand; - let camelizedModelName = camelize(modelName); - assert( - modelClass, - `The route handler for ${request.url} is trying to access the ${camelizedModelName} model, but that model doesn't exist. Create it using 'ember g mirage-model ${modelName}'.` - ); - - let id = this._getIdForRequest(request); - modelClass.find(id).destroy(); - } - - /* - Remove the model and child related models from the db. - - This would remove the contact with id `:id`, as well - as this contact's addresses and phone numbers. - Ex: this.del('/contacts/:id', ['contact', 'addresses', 'numbers'); - */ - handleArrayShorthand(request, modelClasses) { - let id = this._getIdForRequest(request); - - let parent = modelClasses[0].find(id); - let childTypes = modelClasses.slice(1) - .map((modelClass) => pluralize(modelClass.camelizedModelName)); - - // Delete related children - childTypes.forEach((type) => parent[type].destroy()); - parent.destroy(); - } - -} +export default Delete; diff --git a/addon/route-handlers/shorthands/get.js b/addon/route-handlers/shorthands/get.js index bc264f7c9..766fe47d0 100644 --- a/addon/route-handlers/shorthands/get.js +++ b/addon/route-handlers/shorthands/get.js @@ -1,73 +1,4 @@ -import assert from 'ember-cli-mirage/assert'; -import BaseShorthandRouteHandler from './base'; -import { Response } from 'ember-cli-mirage'; -import { singularize, camelize } from 'ember-cli-mirage/utils/inflector'; +import Get from '@miragejs/server/lib/route-handlers/shorthands/get'; +export * from '@miragejs/server/lib/route-handlers/shorthands/get'; -/** - * @hide - */ -export default class GetShorthandRouteHandler extends BaseShorthandRouteHandler { - - /* - Retrieve a model/collection from the db. - - Examples: - this.get('/contacts', 'contact'); - this.get('/contacts/:id', 'contact'); - */ - handleStringShorthand(request, modelClass) { - let modelName = this.shorthand; - let camelizedModelName = camelize(modelName); - - assert( - modelClass, - `The route handler for ${request.url} is trying to access the ${camelizedModelName} model, but that model doesn't exist. Create it using 'ember g mirage-model ${modelName}'.` - ); - - let id = this._getIdForRequest(request); - if (id) { - let model = modelClass.find(id); - if (!model) { - return new Response(404); - } else { - return model; - } - } else if (this.options.coalesce) { - let ids = this.serializerOrRegistry.getCoalescedIds(request, camelizedModelName); - if (ids) { - return modelClass.find(ids); - } - } - return modelClass.all(); - } - - /* - Retrieve an array of collections from the db. - - Ex: this.get('/home', ['contacts', 'pictures']); - */ - handleArrayShorthand(request, modelClasses) { - let keys = this.shorthand; - let id = this._getIdForRequest(request); - - /* - If the first key is singular and we have an id param in - the request, we're dealing with the version of the shorthand - that has a parent model and several has-many relationships. - We throw an error, because the serializer is the appropriate - place for this now. - */ - assert( - !id || singularize(keys[0]) !== keys[0], - `It looks like you're using the "Single record with - related records" version of the array shorthand, in addition to opting - in to the model layer. This shorthand was made when there was no - serializer layer. Now that you're using models, please ensure your - relationships are defined, and create a serializer for the parent - model, adding the relationships there.` - ); - - return modelClasses.map((modelClass) => modelClass.all()); - } - -} +export default Get; diff --git a/addon/route-handlers/shorthands/head.js b/addon/route-handlers/shorthands/head.js index b894f4933..af2d951a5 100644 --- a/addon/route-handlers/shorthands/head.js +++ b/addon/route-handlers/shorthands/head.js @@ -1,47 +1,4 @@ -import assert from 'ember-cli-mirage/assert'; -import BaseShorthandRouteHandler from './base'; -import { Response } from 'ember-cli-mirage'; -import { camelize } from 'ember-cli-mirage/utils/inflector'; +import Head from '@miragejs/server/lib/route-handlers/shorthands/head'; +export * from '@miragejs/server/lib/route-handlers/shorthands/head'; -/** - * @hide - */ -export default class HeadShorthandRouteHandler extends BaseShorthandRouteHandler { - - /* - Retrieve a model/collection from the db. - - Examples: - this.head('/contacts', 'contact'); - this.head('/contacts/:id', 'contact'); - */ - handleStringShorthand(request, modelClass) { - let modelName = this.shorthand; - let camelizedModelName = camelize(modelName); - - assert( - modelClass, - `The route handler for ${request.url} is trying to access the ${camelizedModelName} model, but that model doesn't exist. Create it using 'ember g mirage-model ${modelName}'.` - ); - - let id = this._getIdForRequest(request); - if (id) { - let model = modelClass.find(id); - if (!model) { - return new Response(404); - } else { - return new Response(204); - } - } else if (this.options.coalesce && request.queryParams && request.queryParams.ids) { - let model = modelClass.find(request.queryParams.ids); - - if (!model) { - return new Response(404); - } else { - return new Response(204); - } - } else { - return new Response(204); - } - } -} +export default Head; diff --git a/addon/route-handlers/shorthands/post.js b/addon/route-handlers/shorthands/post.js index 6a904801d..d5bae8137 100644 --- a/addon/route-handlers/shorthands/post.js +++ b/addon/route-handlers/shorthands/post.js @@ -1,29 +1,4 @@ -import assert from 'ember-cli-mirage/assert'; -import BaseShorthandRouteHandler from './base'; -import { camelize } from 'ember-cli-mirage/utils/inflector'; +import Post from '@miragejs/server/lib/route-handlers/shorthands/post'; +export * from '@miragejs/server/lib/route-handlers/shorthands/post'; -/** - * @hide - */ -export default class PostShorthandRouteHandler extends BaseShorthandRouteHandler { - - /* - Push a new model of type *camelizedModelName* to the db. - - For example, this will push a 'user': - this.post('/contacts', 'user'); - */ - - handleStringShorthand(request, modelClass) { - let modelName = this.shorthand; - let camelizedModelName = camelize(modelName); - assert( - modelClass, - `The route handler for ${request.url} is trying to access the ${camelizedModelName} model, but that model doesn't exist. Create it using 'ember g mirage-model ${modelName}'.` - ); - - let attrs = this._getAttrsForRequest(request, modelClass.camelizedModelName); - return modelClass.create(attrs); - } - -} +export default Post; diff --git a/addon/route-handlers/shorthands/put.js b/addon/route-handlers/shorthands/put.js index 7bf1461cc..881bc694d 100644 --- a/addon/route-handlers/shorthands/put.js +++ b/addon/route-handlers/shorthands/put.js @@ -1,30 +1,4 @@ -import assert from 'ember-cli-mirage/assert'; -import BaseShorthandRouteHandler from './base'; -import { camelize } from 'ember-cli-mirage/utils/inflector'; +import Put from '@miragejs/server/lib/route-handlers/shorthands/put'; +export * from '@miragejs/server/lib/route-handlers/shorthands/put'; -/** - * @hide - */ -export default class PutShorthandRouteHandler extends BaseShorthandRouteHandler { - - /* - Update an object from the db, specifying the type. - - this.put('/contacts/:id', 'user'); - */ - handleStringShorthand(request, modelClass) { - let modelName = this.shorthand; - let camelizedModelName = camelize(modelName); - - assert( - modelClass, - `The route handler for ${request.url} is trying to access the ${camelizedModelName} model, but that model doesn't exist. Create it using 'ember g mirage-model ${modelName}'.` - ); - - let id = this._getIdForRequest(request); - let attrs = this._getAttrsForRequest(request, modelClass.camelizedModelName); - - return modelClass.find(id).update(attrs); - } - -} +export default Put; diff --git a/addon/serializers/active-model-serializer.js b/addon/serializers/active-model-serializer.js index b0c1894b1..151f2a4cb 100644 --- a/addon/serializers/active-model-serializer.js +++ b/addon/serializers/active-model-serializer.js @@ -1,102 +1,4 @@ -import Serializer from '../serializer'; -import { underscore, pluralize, dasherize, singularize, camelize } from '../utils/inflector'; +import ActiveModelSerializer from '@miragejs/server/lib/serializers/active-model-serializer'; +export * from '@miragejs/server/lib/serializers/active-model-serializer'; -export default Serializer.extend({ - serializeIds: 'always', - normalizeIds: true, - - keyForModel(type) { - return underscore(type); - }, - - keyForAttribute(attr) { - return underscore(attr); - }, - - keyForRelationship(type) { - return pluralize(underscore(type)); - }, - - keyForEmbeddedRelationship(attributeName) { - return underscore(attributeName); - }, - - keyForRelationshipIds(type) { - return `${underscore(singularize(type))}_ids`; - }, - - keyForForeignKey(relationshipName) { - return `${underscore(relationshipName)}_id`; - }, - - keyForPolymorphicForeignKeyId(relationshipName) { - return `${underscore(relationshipName)}_id`; - }, - - keyForPolymorphicForeignKeyType(relationshipName) { - return `${underscore(relationshipName)}_type`; - }, - - normalize(payload) { - let type = Object.keys(payload)[0]; - let attrs = payload[type]; - let modelName = camelize(type); - let modelClass = this.schema.modelClassFor(modelName); - let { belongsToAssociations, hasManyAssociations } = modelClass; - let belongsToKeys = Object.keys(belongsToAssociations); - let hasManyKeys = Object.keys(hasManyAssociations); - - let jsonApiPayload = { - data: { - type: pluralize(type), - attributes: {} - } - }; - if (attrs.id) { - jsonApiPayload.data.id = attrs.id; - } - - let relationships = {}; - - Object.keys(attrs).forEach((key) => { - if (key !== 'id') { - if (this.normalizeIds) { - if (belongsToKeys.includes(key)) { - let association = belongsToAssociations[key]; - let associationModel = association.modelName; - relationships[dasherize(key)] = { - data: { - type: associationModel, - id: attrs[key] - } - }; - } else if (hasManyKeys.includes(key)) { - let association = hasManyAssociations[key]; - let associationModel = association.modelName; - let data = attrs[key].map(id => { - return { - type: associationModel, - id - }; - }); - relationships[dasherize(key)] = { data }; - } else { - jsonApiPayload.data.attributes[dasherize(key)] = attrs[key]; - } - } else { - jsonApiPayload.data.attributes[dasherize(key)] = attrs[key]; - } - } - }); - if (Object.keys(relationships).length) { - jsonApiPayload.data.relationships = relationships; - } - - return jsonApiPayload; - }, - - getCoalescedIds(request) { - return request.queryParams && request.queryParams.ids; - } - -}); +export default ActiveModelSerializer; diff --git a/addon/serializers/json-api-serializer.js b/addon/serializers/json-api-serializer.js index fe0d7677d..6d00e9568 100644 --- a/addon/serializers/json-api-serializer.js +++ b/addon/serializers/json-api-serializer.js @@ -1,582 +1,4 @@ -import Serializer from '../serializer'; -import { dasherize, pluralize, camelize } from '../utils/inflector'; -import _get from 'lodash/get'; -import _flatten from 'lodash/flatten'; -import _compact from 'lodash/compact'; -import _uniqBy from 'lodash/uniqBy'; -import _isEmpty from 'lodash/isEmpty'; -import assert from 'ember-cli-mirage/assert'; +import JsonApiSerializer from '@miragejs/server/lib/serializers/json-api-serializer'; +export * from '@miragejs/server/lib/serializers/json-api-serializer'; -/** - The JSONAPISerializer. Subclass of Serializer. - - Please use - - ```js - import { JSONAPISerializer } from 'ember-cli-mirage'; - ``` - - instead of the full import path below. - - @class JSONAPISerializer - @constructor - @public - */ -class JSONAPISerializer extends Serializer { - - constructor() { - super(...arguments); - - /** - By default, JSON:API's linkage data is only added for relationships that are being included in the current request. - - That means given an `author` model with a `posts` relationship, a GET request to /authors/1 would return a JSON:API document with an empty `relationships` hash: - - ```js - { - data: { - type: 'authors', - id: '1', - attributes: { ... } - } - } - ``` - - but a request to GET /authors/1?include=posts would have linkage data added (in addition to the included resources): - - ```js - { - data: { - type: 'authors', - id: '1', - attributes: { ... }, - relationships: { - data: [ - { type: 'posts', id: '1' }, - { type: 'posts', id: '2' }, - { type: 'posts', id: '3' } - ] - } - }, - included: [ ... ] - } - ``` - - To add the linkage data for all relationships, you could set `alwaysIncludeLinkageData` to `true`: - - ```js - // mirage/serializers/application.js - import { JSONAPISerializer } from 'ember-cli-mirage'; - - export default JSONAPISerializer.extend({ - alwaysIncludeLinkageData: true - }); - ``` - - Then, a GET to /authors/1 would respond with - - ```js - { - data: { - type: 'authors', - id: '1', - attributes: { ... }, - relationships: { - posts: { - data: [ - { type: 'posts', id: '1' }, - { type: 'posts', id: '2' }, - { type: 'posts', id: '3' } - ] - } - } - } - } - ``` - - even though the related `posts` are not included in the same document. - - You can also use the `links` method (on the Serializer base class) to add relationship links (which will always be added regardless of the relationship is being included document), or you could use `shouldIncludeLinkageData` for more granular control. - - For more background on the behavior of this API, see [this blog post](http://www.ember-cli-mirage.com/blog/changing-mirages-default-linkage-data-behavior-1475). - - @property alwaysIncludeLinkageData - @type {Boolean} - @public - */ - this.alwaysIncludeLinkageData = this.alwaysIncludeLinkageData || undefined; // this is just here so I can add the doc comment. Better way? - } - - // Don't think this is used? - keyForModel(modelName) { - return dasherize(modelName); - } - - // Don't think this is used? - keyForCollection(modelName) { - return dasherize(modelName); - } - - /** - Used to customize the key for an attribute. By default, compound attribute names are dasherized. - - For example, the JSON:API document for a `post` model with a `commentCount` attribute would be: - - ```js - { - data: { - id: 1, - type: 'posts', - attributes: { - 'comment-count': 28 - } - } - } - ``` - - @method keyForAttribute - @param {String} attr - @return {String} - @public - */ - keyForAttribute(attr) { - return dasherize(attr); - } - - /** - Used to customize the key for a relationships. By default, compound relationship names are dasherized. - - For example, the JSON:API document for an `author` model with a `blogPosts` relationship would be: - - ```js - { - data: { - id: 1, - type: 'author', - attributes: { - ... - }, - relationships: { - 'blog-posts': { - ... - } - } - } - } - ``` - - @method keyForAttribute - @param {String} key - @return {String} - @public - */ - keyForRelationship(key) { - return dasherize(key); - } - - /** - Use this hook to add top-level `links` data to JSON:API resource objects. The argument is the model being serialized. - - ```js - // serializers/author.js - import { JSONAPISerializer } from 'ember-cli-mirage'; - - export default JSONAPISerializer.extend({ - - links(author) { - return { - 'posts': { - related: `/api/authors/${author.id}/posts` - } - }; - } - - }); - ``` - - @method links - @param model - */ - links() { - } - - getHashForPrimaryResource(resource) { - this._createRequestedIncludesGraph(resource); - - let resourceHash = this.getHashForResource(resource); - let hashWithRoot = { data: resourceHash }; - let addToIncludes = this.getAddToIncludesForResource(resource); - - return [ hashWithRoot, addToIncludes ]; - } - - getHashForIncludedResource(resource) { - let serializer = this.serializerFor(resource.modelName); - let hash = serializer.getHashForResource(resource); - let hashWithRoot = { included: (this.isModel(resource) ? [ hash ] : hash) }; - let addToIncludes = []; - - if (!this.hasQueryParamIncludes()) { - addToIncludes = this.getAddToIncludesForResource(resource); - } - - return [ hashWithRoot, addToIncludes ]; - } - - getHashForResource(resource) { - let hash; - - if (this.isModel(resource)) { - hash = this._getResourceObjectForModel(resource); - } else { - hash = resource.models.map((m) => this._getResourceObjectForModel(m)); - } - - return hash; - } - - /* - Returns a flat unique list of resources that need to be added to includes - */ - getAddToIncludesForResource(resource) { - let relationshipPaths; - - if (this.hasQueryParamIncludes()) { - relationshipPaths = this.request.queryParams.include.split(','); - } else { - let serializer = this.serializerFor(resource.modelName); - relationshipPaths = serializer.getKeysForIncluded(); - } - - return this.getAddToIncludesForResourceAndPaths(resource, relationshipPaths); - } - - getAddToIncludesForResourceAndPaths(resource, relationshipPaths) { - let includes = []; - - relationshipPaths.forEach((path) => { - let relationshipNames = path.split('.'); - let newIncludes = this.getIncludesForResourceAndPath(resource, ...relationshipNames); - includes.push(newIncludes); - }); - - return _uniqBy(_compact(_flatten(includes)), m => m.toString()); - } - - getIncludesForResourceAndPath(resource, ...names) { - let nameForCurrentResource = camelize(names.shift()); - let includes = []; - let modelsToAdd = []; - - if (this.isModel(resource)) { - let relationship = resource[nameForCurrentResource]; - - if (this.isModel(relationship)) { - modelsToAdd = [ relationship ]; - } else if (this.isCollection(relationship)) { - modelsToAdd = relationship.models; - } - - } else { - resource.models.forEach((model) => { - let relationship = model[nameForCurrentResource]; - - if (this.isModel(relationship)) { - modelsToAdd.push(relationship); - } else if (this.isCollection(relationship)) { - modelsToAdd = modelsToAdd.concat(relationship.models); - } - }); - } - - includes = includes.concat(modelsToAdd); - - if (names.length) { - modelsToAdd.forEach((model) => { - includes = includes.concat(this.getIncludesForResourceAndPath(model, ...names)); - }); - } - - return includes; - } - - _getResourceObjectForModel(model) { - let attrs = this._attrsForModel(model, true); - delete attrs.id; - - let hash = { - type: this.typeKeyForModel(model), - id: model.id, - attributes: attrs - }; - - return this._maybeAddRelationshipsToResourceObjectForModel(hash, model); - } - - _maybeAddRelationshipsToResourceObjectForModel(hash, model) { - let relationships = model.associationKeys.reduce((relationships, key) => { - let relationship = model[key]; - let relationshipKey = this.keyForRelationship(key); - let relationshipHash = {}; - - if (this.hasLinksForRelationship(model, key)) { - let serializer = this.serializerFor(model.modelName); - let links = serializer.links(model); - relationshipHash.links = links[key]; - } - - if (this.alwaysIncludeLinkageData || this.shouldIncludeLinkageData(key, model) || this._relationshipIsIncludedForModel(key, model)) { - let data = null; - if (this.isModel(relationship)) { - data = { - type: this.typeKeyForModel(relationship), - id: relationship.id - }; - } else if (this.isCollection(relationship)) { - data = relationship.models.map((model) => { - return { - type: this.typeKeyForModel(model), - id: model.id - }; - }); - } - relationshipHash.data = data; - } - - if (!_isEmpty(relationshipHash)) { - relationships[relationshipKey] = relationshipHash; - } - - return relationships; - }, {}); - - if (!_isEmpty(relationships)) { - hash.relationships = relationships; - } - - return hash; - } - - hasLinksForRelationship(model, relationshipKey) { - let serializer = this.serializerFor(model.modelName); - let links = serializer.links(model); - - return links && links[relationshipKey] != null; - } - - /* - This code (and a lot of this serializer) need to be re-worked according to - the graph logic... - */ - _relationshipIsIncludedForModel(relationshipKey, model) { - if (this.hasQueryParamIncludes()) { - let graph = this.request._includesGraph; - let graphKey = this._graphKeyForModel(model); - - // Find the resource in the graph - let graphResource; - - // Check primary data - if (graph.data[graphKey]) { - graphResource = graph.data[graphKey]; - - // Check includes - } else if (graph.included[pluralize(model.modelName)]) { - graphResource = graph.included[pluralize(model.modelName)][graphKey]; - } - - // If the model's in the graph, check if relationshipKey should be included - return graphResource && graphResource.relationships && graphResource.relationships.hasOwnProperty(dasherize(relationshipKey)); - - } else { - let relationshipPaths = this.getKeysForIncluded(); - - return relationshipPaths.includes(relationshipKey); - } - } - - /* - This is needed for _relationshipIsIncludedForModel - see the note there for - more background. - - If/when we can refactor this serializer, the logic in this method would - probably be the basis for the new overall json/graph creation. - */ - _createRequestedIncludesGraph(primaryResource, secondaryResource = null) { - let graph = { - data: {} - }; - - if (this.isModel(primaryResource)) { - let primaryResourceKey = this._graphKeyForModel(primaryResource); - graph.data[primaryResourceKey] = {}; - - this._addPrimaryModelToRequestedIncludesGraph(graph, primaryResource); - - } else if (this.isCollection(primaryResource)) { - primaryResource.models.forEach(model => { - let primaryResourceKey = this._graphKeyForModel(model); - graph.data[primaryResourceKey] = {}; - - this._addPrimaryModelToRequestedIncludesGraph(graph, model); - }); - } - - // Hack :/ Need to think of a better palce to put this if - // refactoring json:api serializer. - this.request._includesGraph = graph; - } - - _addPrimaryModelToRequestedIncludesGraph(graph, model) { - if (this.hasQueryParamIncludes()) { - let graphKey = this._graphKeyForModel(model); - let queryParamIncludes = this.getQueryParamIncludes(); - - queryParamIncludes.split(',') - .forEach(includesPath => { // includesPath is post.comments, for example - graph.data[graphKey].relationships = graph.data[graphKey].relationships || {}; - - let relationshipKeys = includesPath.split('.').map(dasherize); - let relationshipKey = relationshipKeys[0]; - let graphRelationshipKey = relationshipKey; - let normalizedRelationshipKey = camelize(relationshipKey); - let hasAssociation = model.associationKeys.includes(normalizedRelationshipKey); - - assert(hasAssociation, `You tried to include "${relationshipKey}" with ${model} but no association named "${normalizedRelationshipKey}" is defined on the model.`); - - let relationship = model[normalizedRelationshipKey]; - let relationshipData; - - if (this.isModel(relationship)) { - relationshipData = this._graphKeyForModel(relationship); - } else if (this.isCollection(relationship)) { - relationshipData = relationship.models.map(this._graphKeyForModel); - } else { - relationshipData = null; - } - - graph.data[graphKey].relationships[graphRelationshipKey] = relationshipData; - - if (relationship) { - this._addResourceToRequestedIncludesGraph(graph, relationship, relationshipKeys.slice(1)); - } - }); - } - } - - _addResourceToRequestedIncludesGraph(graph, resource, relationshipNames) { - graph.included = graph.included || {}; - - let models = this.isCollection(resource) ? resource.models : [ resource ]; - - models.forEach(model => { - let collectionName = pluralize(model.modelName); - graph.included[collectionName] = graph.included[collectionName] || {}; - - this._addModelToRequestedIncludesGraph(graph, model, relationshipNames); - }); - } - - _addModelToRequestedIncludesGraph(graph, model, relationshipNames) { - let collectionName = pluralize(model.modelName); - let resourceKey = this._graphKeyForModel(model); - graph.included[collectionName][resourceKey] = graph.included[collectionName][resourceKey] || {}; - - if (relationshipNames.length) { - this._addResourceRelationshipsToRequestedIncludesGraph(graph, collectionName, resourceKey, model, relationshipNames); - } - } - - /* - Lot of the same logic here from _addPrimaryModelToRequestedIncludesGraph, could refactor & share - */ - _addResourceRelationshipsToRequestedIncludesGraph(graph, collectionName, resourceKey, model, relationshipNames) { - graph.included[collectionName][resourceKey].relationships = graph.included[collectionName][resourceKey].relationships || {}; - - let relationshipName = relationshipNames[0]; - let relationship = model[camelize(relationshipName)]; - let relationshipData; - - if (this.isModel(relationship)) { - relationshipData = this._graphKeyForModel(relationship); - } else if (this.isCollection(relationship)) { - relationshipData = relationship.models.map(this._graphKeyForModel); - } - graph.included[collectionName][resourceKey].relationships[relationshipName] = relationshipData; - - if (relationship) { - this._addResourceToRequestedIncludesGraph(graph, relationship, relationshipNames.slice(1)); - } - } - - _graphKeyForModel(model) { - return `${model.modelName}:${model.id}`; - } - - getQueryParamIncludes() { - return (_get(this, 'request.queryParams.include')); - } - - hasQueryParamIncludes() { - return !!this.getQueryParamIncludes(); - } - - /** - Used to customize the `type` field of the document. By default, pluralizes and dasherizes the model's `modelName`. - - For example, the JSON:API document for a `blogPost` model would be: - - ```js - { - data: { - id: 1, - type: 'blog-posts' - } - } - ``` - - @method typeKeyForModel - @param {Model} model - @return {String} - @public - */ - typeKeyForModel(model) { - return dasherize(pluralize(model.modelName)); - } - - getCoalescedIds(request) { - let ids = request.queryParams && request.queryParams['filter[id]']; - if (typeof ids === 'string') { - return ids.split(','); - } - return ids; - } - - /** - Allows for per-relationship inclusion of linkage data. Use this when `alwaysIncludeLinkageData` is not granular enough. - - ```js - export default JSONAPISerializer.extend({ - shouldIncludeLinkageData(relationshipKey, model) { - if (relationshipKey === 'author' || relationshipKey === 'ghostWriter') { - return true; - } - return false; - } - }); - ``` - - @method shouldIncludeLinkageData - @param {String} relationshipKey - @param {Model} model - @return {Boolean} - @public - */ - shouldIncludeLinkageData(relationshipKey, model) { - return false; - } -} - -JSONAPISerializer.prototype.alwaysIncludeLinkageData = false; - -export default JSONAPISerializer; +export default JsonApiSerializer; diff --git a/addon/serializers/rest-serializer.js b/addon/serializers/rest-serializer.js index 1d6e0ea37..cc8551e09 100644 --- a/addon/serializers/rest-serializer.js +++ b/addon/serializers/rest-serializer.js @@ -1,34 +1,4 @@ -import ActiveModelSerializer from './active-model-serializer'; -import { camelize, singularize, pluralize } from '../utils/inflector'; +import RestSerializer from '@miragejs/server/lib/serializers/rest-serializer'; +export * from '@miragejs/server/lib/serializers/rest-serializer'; -export default ActiveModelSerializer.extend({ - serializeIds: 'always', - - keyForModel(type) { - return camelize(type); - }, - - keyForAttribute(attr) { - return camelize(attr); - }, - - keyForRelationship(type) { - return camelize(pluralize(type)); - }, - - keyForEmbeddedRelationship(attributeName) { - return camelize(attributeName); - }, - - keyForRelationshipIds(type) { - return camelize(pluralize(type)); - }, - - keyForForeignKey(relationshipName) { - return camelize(singularize(relationshipName)); - }, - - getCoalescedIds(request) { - return request.queryParams && request.queryParams.ids; - } -}); +export default RestSerializer; diff --git a/addon/utils/ember-data.js b/addon/utils/ember-data.js index a7a36355a..47563d9c4 100644 --- a/addon/utils/ember-data.js +++ b/addon/utils/ember-data.js @@ -1,20 +1,4 @@ -/* global requirejs */ +import EmberData from '@miragejs/server/lib/utils/ember-data'; +export * from '@miragejs/server/lib/utils/ember-data'; -import _find from 'lodash/find'; - -function _hasEmberData() { - let matchRegex = /^ember-data/i; - return !!_find(Object.keys(requirejs.entries), (e) => !!e.match(matchRegex)); -} - -/** - @hide -*/ -export const hasEmberData = _hasEmberData(); - -/** - @hide -*/ -export function isDsModel(m) { - return m && typeof m.eachRelationship === 'function'; -} +export default EmberData; diff --git a/addon/utils/extend.js b/addon/utils/extend.js index 75a03016d..12aea5b0c 100644 --- a/addon/utils/extend.js +++ b/addon/utils/extend.js @@ -1,32 +1,4 @@ -import _assign from 'lodash/assign'; -import _has from 'lodash/has'; +import Extend from '@miragejs/server/lib/utils/extend'; +export * from '@miragejs/server/lib/utils/extend'; -/** - @hide -*/ -export default function extend(protoProps, staticProps) { - let Parent = this; - - class Child extends Parent { - constructor(...args) { - super(...args); - // The constructor function for the new subclass is optionally defined by you - // in your `extend` definition - if (protoProps && _has(protoProps, 'constructor')) { - protoProps.constructor.call(this, ...args); - } - } - } - - // Add static properties to the constructor function, if supplied. - - _assign(Child, Parent, staticProps); - - // Add prototype properties (instance properties) to the subclass, - // if supplied. - if (protoProps) { - _assign(Child.prototype, protoProps); - } - - return Child; -} +export default Extend; diff --git a/addon/utils/inflector.js b/addon/utils/inflector.js index d16c72e71..06c9d4d6d 100644 --- a/addon/utils/inflector.js +++ b/addon/utils/inflector.js @@ -1,4 +1,4 @@ -import { capitalize, camelize, dasherize, underscore } from '@ember/string'; -export { singularize, pluralize } from 'ember-inflector'; +import Inflector from '@miragejs/server/lib/utils/inflector'; +export * from '@miragejs/server/lib/utils/inflector'; -export { capitalize, camelize, dasherize, underscore }; +export default Inflector; diff --git a/addon/utils/is-association.js b/addon/utils/is-association.js index 3f1079547..7af277fc7 100644 --- a/addon/utils/is-association.js +++ b/addon/utils/is-association.js @@ -1,8 +1,4 @@ -import _isPlainObject from 'lodash/isPlainObject'; +import IsAssociation from '@miragejs/server/lib/utils/is-association'; +export * from '@miragejs/server/lib/utils/is-association'; -/** - @hide -*/ -export default function(object) { - return _isPlainObject(object) && object.__isAssociation__ === true; -} +export default IsAssociation; diff --git a/addon/utils/normalize-name.js b/addon/utils/normalize-name.js index fecc85d07..041ae554c 100644 --- a/addon/utils/normalize-name.js +++ b/addon/utils/normalize-name.js @@ -1,29 +1,4 @@ -import { - camelize, - pluralize, - singularize, - dasherize -} from 'ember-cli-mirage/utils/inflector'; +import NormalizeName from '@miragejs/server/lib/utils/normalize-name'; +export * from '@miragejs/server/lib/utils/normalize-name'; -/** - @hide -*/ -export function toCollectionName(type) { - let modelName = dasherize(type); - return camelize(pluralize(modelName)); -} - -/** - @hide -*/ -export function toInternalCollectionName(type) { - return `_${toCollectionName(type)}`; -} - -/** - @hide -*/ -export function toModelName(type) { - let modelName = dasherize(type); - return singularize(modelName); -} +export default NormalizeName; diff --git a/addon/utils/read-modules.js b/addon/utils/read-modules.js index 2d4105342..4dfb4da5a 100644 --- a/addon/utils/read-modules.js +++ b/addon/utils/read-modules.js @@ -1,60 +1,4 @@ -/* global requirejs, require */ -/* eslint-env node */ -'use strict'; +import ReadModules from '@miragejs/server/lib/utils/read-modules'; +export * from '@miragejs/server/lib/utils/read-modules'; -import { assert } from '@ember/debug'; -import _camelCase from 'lodash/camelCase'; -import { pluralize } from 'ember-cli-mirage/utils/inflector'; -import require from 'require'; - -/** - This function looks through all files that have been loaded by Ember CLI and - finds the ones under /mirage/[factories, fixtures, scenarios, models]/, and exports - a hash containing the names of the files as keys and the data as values. - - @hide -*/ -export default function(prefix) { - let modules = ['factories', 'fixtures', 'scenarios', 'models', 'serializers', 'identity-managers']; - let mirageModuleRegExp = new RegExp(`^${prefix}/mirage/(${modules.join('|')})`); - let modulesMap = modules.reduce((memo, name) => { - memo[_camelCase(name)] = {}; - return memo; - }, {}); - - Object.keys(requirejs.entries).filter(function(key) { - return mirageModuleRegExp.test(key); - }).forEach(function(moduleName) { - if (moduleName.match('.jshint')) { // ignore autogenerated .jshint files - return; - } - let moduleParts = moduleName.split('/'); - let moduleType = _camelCase(moduleParts[moduleParts.length - 2]); - let moduleKey = moduleParts[moduleParts.length - 1]; - assert(`Subdirectories under ${moduleType} are not supported`, - moduleParts[moduleParts.length - 3] === 'mirage'); - - if (moduleType === 'scenario') { - assert('Only scenario/default.js is supported at this time.', - moduleKey !== 'default'); - } - - /* - Ensure fixture keys are pluralized - */ - if (moduleType === 'fixtures') { - moduleKey = pluralize(moduleKey); - } - - let module = require(moduleName, null, null, true); - if (!module) { - throw new Error(`${moduleName} must export a ${moduleType}`); - } - - let data = module.default; - - modulesMap[moduleType][_camelCase(moduleKey)] = data; - }); - - return modulesMap; -} +export default ReadModules; diff --git a/addon/utils/reference-sort.js b/addon/utils/reference-sort.js index 93b3627d4..b9736eed0 100644 --- a/addon/utils/reference-sort.js +++ b/addon/utils/reference-sort.js @@ -1,53 +1,4 @@ -// jscs:disable disallowVar, requireArrayDestructuring -import _uniq from 'lodash/uniq'; -import _flatten from 'lodash/flatten'; +import ReferenceSort from '@miragejs/server/lib/utils/reference-sort'; +export * from '@miragejs/server/lib/utils/reference-sort'; -/** - @hide -*/ -export default function(edges) { - let nodes = _uniq(_flatten(edges)); - let cursor = nodes.length; - let sorted = new Array(cursor); - let visited = {}; - let i = cursor; - - let visit = function(node, i, predecessors) { - - if (predecessors.indexOf(node) >= 0) { - throw new Error(`Cyclic dependency in properties ${JSON.stringify(predecessors)}`); - } - - if (visited[i]) { - return; - } else { - visited[i] = true; - } - - let outgoing = edges.filter(function(edge) { - return edge && edge[0] === node; - }); - i = outgoing.length; - if (i) { - let preds = predecessors.concat(node); - do { - let pair = outgoing[--i]; - let child = pair[1]; - if (child) { - visit(child, nodes.indexOf(child), preds); - } - } while (i); - } - - sorted[--cursor] = node; - }; - - while (i--) { - if (!visited[i]) { - visit(nodes[i], i, []); - } - } - - return sorted.reverse(); - -} +export default ReferenceSort; diff --git a/addon/utils/uuid.js b/addon/utils/uuid.js index a6baea541..12c6f2f5c 100644 --- a/addon/utils/uuid.js +++ b/addon/utils/uuid.js @@ -1,12 +1,4 @@ -/** - UUID generator +import Uuid from '@miragejs/server/lib/utils/uuid'; +export * from '@miragejs/server/lib/utils/uuid'; - @hide -*/ -export default function() { - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { - var r = Math.random() * 16 | 0; - var v = c === 'x' ? r : (r & 0x3 | 0x8); - return v.toString(16); - }); -} +export default Uuid; diff --git a/tests/integration/route-handlers/delete-shorthand-test.js b/tests/integration/route-handlers/delete-shorthand-test.js index c5a8c894c..0b4ef4059 100644 --- a/tests/integration/route-handlers/delete-shorthand-test.js +++ b/tests/integration/route-handlers/delete-shorthand-test.js @@ -1,9 +1,9 @@ import {module, test} from 'qunit'; import Server from 'ember-cli-mirage/server'; import Model from 'ember-cli-mirage/orm/model'; -import Mirage from 'ember-cli-mirage'; import DeleteShorthandRouteHandler from 'ember-cli-mirage/route-handlers/shorthands/delete'; import JSONAPISerializer from 'ember-cli-mirage/serializers/json-api-serializer'; +import { hasMany } from 'ember-cli-mirage'; module('Integration | Route Handlers | DELETE shorthand', function(hooks) { hooks.beforeEach(function() { @@ -11,7 +11,7 @@ module('Integration | Route Handlers | DELETE shorthand', function(hooks) { environment: 'development', models: { wordSmith: Model.extend({ - blogPosts: Mirage.hasMany() + blogPosts: hasMany() }), blogPost: Model } diff --git a/tests/integration/route-handlers/function-handler/basic-test.js b/tests/integration/route-handlers/function-handler/basic-test.js index 59c14bfd6..dc0e2d130 100644 --- a/tests/integration/route-handlers/function-handler/basic-test.js +++ b/tests/integration/route-handlers/function-handler/basic-test.js @@ -1,8 +1,6 @@ import { module, test } from 'qunit'; import { Promise } from 'rsvp'; -import { Model, ActiveModelSerializer } from 'ember-cli-mirage'; -import { Response } from '@miragejs/server'; -import Server from 'ember-cli-mirage/server'; +import Server, { Model, ActiveModelSerializer, Response } from 'ember-cli-mirage'; import promiseAjax from '../../../helpers/promise-ajax'; module('Integration | Route handlers | Function handler', function(hooks) { diff --git a/tests/integration/route-handlers/function-handler/serialize-test.js b/tests/integration/route-handlers/function-handler/serialize-test.js index 9bea8f3f0..64d803bc8 100644 --- a/tests/integration/route-handlers/function-handler/serialize-test.js +++ b/tests/integration/route-handlers/function-handler/serialize-test.js @@ -1,6 +1,5 @@ import { module, test } from 'qunit'; -import { Model, Collection, ActiveModelSerializer } from 'ember-cli-mirage'; -import Server from 'ember-cli-mirage/server'; +import Server, { Model, Collection, ActiveModelSerializer } from 'ember-cli-mirage'; import _uniqBy from 'lodash/uniqBy'; import promiseAjax from '../../../helpers/promise-ajax'; diff --git a/tests/integration/serializers/base/full-request-test.js b/tests/integration/serializers/base/full-request-test.js index 89ebe4df0..eeb8f92b3 100644 --- a/tests/integration/serializers/base/full-request-test.js +++ b/tests/integration/serializers/base/full-request-test.js @@ -1,9 +1,9 @@ -import Mirage from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; import Model from 'ember-cli-mirage/orm/model'; import Serializer from 'ember-cli-mirage/serializer'; import {module, test} from 'qunit'; import promiseAjax from '../../../helpers/promise-ajax'; +import { hasMany, belongsTo } from 'ember-cli-mirage'; module('Integration | Serializers | Base | Full Request', function(hooks) { hooks.beforeEach(function() { @@ -11,14 +11,14 @@ module('Integration | Serializers | Base | Full Request', function(hooks) { environment: 'development', models: { author: Model.extend({ - posts: Mirage.hasMany() + posts: hasMany() }), post: Model.extend({ - author: Mirage.belongsTo(), - comments: Mirage.hasMany() + author: belongsTo(), + comments: hasMany() }), comment: Model.extend({ - post: Mirage.belongsTo() + post: belongsTo() }) }, serializers: { diff --git a/tests/integration/serializers/schema-helper.js b/tests/integration/serializers/schema-helper.js index a82362e9b..d9597890a 100644 --- a/tests/integration/serializers/schema-helper.js +++ b/tests/integration/serializers/schema-helper.js @@ -1,38 +1,38 @@ -import Mirage from 'ember-cli-mirage'; import Schema from 'ember-cli-mirage/orm/schema'; import Model from 'ember-cli-mirage/orm/model'; import Db from 'ember-cli-mirage/db'; +import { hasMany, belongsTo } from 'ember-cli-mirage'; export default { setup() { return new Schema(new Db(), { wordSmith: Model.extend({ - blogPosts: Mirage.hasMany() + blogPosts: hasMany() }), blogPost: Model.extend({ - wordSmith: Mirage.belongsTo(), - fineComments: Mirage.hasMany() + wordSmith: belongsTo(), + fineComments: hasMany() }), fineComment: Model.extend({ - blogPost: Mirage.belongsTo() + blogPost: belongsTo() }), greatPhoto: Model, foo: Model.extend({ - bar: Mirage.belongsTo() + bar: belongsTo() }), bar: Model.extend({ - baz: Mirage.belongsTo() + baz: belongsTo() }), baz: Model.extend({ - quuxes: Mirage.hasMany() + quuxes: hasMany() }), quux: Model.extend({ - zomgs: Mirage.hasMany() + zomgs: hasMany() }), zomg: Model.extend({ - lol: Mirage.belongsTo() + lol: belongsTo() }), lol: Model }); From 8f6be6ed7f0925d4e65ccba62970a299fb42418e Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 24 May 2019 15:14:51 -0400 Subject: [PATCH 440/879] Update factory-test --- tests/unit/factory-test.js | 41 +++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/tests/unit/factory-test.js b/tests/unit/factory-test.js index b53dad1d8..aa9c82a92 100644 --- a/tests/unit/factory-test.js +++ b/tests/unit/factory-test.js @@ -1,22 +1,21 @@ -import Mirage from 'ember-cli-mirage'; -import { trait } from 'ember-cli-mirage'; +import { Factory, trait } from 'ember-cli-mirage'; import {module, test} from 'qunit'; module('Unit | Factory', function() { test('it exists', function(assert) { - assert.ok(Mirage.Factory); + assert.ok(Factory); }); test('the base class builds empty objects', function(assert) { - let f = new Mirage.Factory(); + let f = new Factory(); let data = f.build(); assert.deepEqual(data, {}); }); test('a noop extension builds empty objects', function(assert) { - let EmptyFactory = Mirage.Factory.extend(); + let EmptyFactory = Factory.extend(); let f = new EmptyFactory(); let data = f.build(); @@ -24,7 +23,7 @@ module('Unit | Factory', function() { }); test('it works with strings, numbers and booleans', function(assert) { - let AFactory = Mirage.Factory.extend({ + let AFactory = Factory.extend({ name: 'Sam', age: 28, alive: true @@ -37,7 +36,7 @@ module('Unit | Factory', function() { }); test('it supports inheritance', function(assert) { - let PersonFactory = Mirage.Factory.extend({ + let PersonFactory = Factory.extend({ species: 'human' }); let ManFactory = PersonFactory.extend({ @@ -57,7 +56,7 @@ module('Unit | Factory', function() { }); test('it can use sequences', function(assert) { - let PostFactory = Mirage.Factory.extend({ + let PostFactory = Factory.extend({ likes(i) { return 5 * i; } @@ -72,7 +71,7 @@ module('Unit | Factory', function() { }); test('it can reuse static properties', function(assert) { - let BazFactory = Mirage.Factory.extend({ + let BazFactory = Factory.extend({ foo: 5, bar(i) { return this.foo * i; @@ -88,7 +87,7 @@ module('Unit | Factory', function() { }); test('it can reuse dynamic properties', function(assert) { - let BazFactory = Mirage.Factory.extend({ + let BazFactory = Factory.extend({ foo(i) { return 5 * i; }, @@ -106,7 +105,7 @@ module('Unit | Factory', function() { }); test('it can have dynamic properties that depend on another', function(assert) { - let BazFactory = Mirage.Factory.extend({ + let BazFactory = Factory.extend({ name() { return 'foo'; }, @@ -122,7 +121,7 @@ module('Unit | Factory', function() { }); test('it can reference properties out of order', function(assert) { - let BazFactory = Mirage.Factory.extend({ + let BazFactory = Factory.extend({ bar() { return this.foo + 2; }, @@ -143,7 +142,7 @@ module('Unit | Factory', function() { }); test('it can reference multiple properties in any order', function(assert) { - let FooFactory = Mirage.Factory.extend({ + let FooFactory = Factory.extend({ foo() { return this.bar + this.baz; }, @@ -153,7 +152,7 @@ module('Unit | Factory', function() { baz: 10 }); - let BarFactory = Mirage.Factory.extend({ + let BarFactory = Factory.extend({ bar: 6, foo() { @@ -163,7 +162,7 @@ module('Unit | Factory', function() { baz: 10 }); - let BazFactory = Mirage.Factory.extend({ + let BazFactory = Factory.extend({ bar: 6, baz: 10, @@ -187,7 +186,7 @@ module('Unit | Factory', function() { }); test('it can reference properties on complex object', function(assert) { - let AbcFactory = Mirage.Factory.extend({ + let AbcFactory = Factory.extend({ a(i) { return this.b + i; }, @@ -217,7 +216,7 @@ module('Unit | Factory', function() { }); test('throws meaningfull exception on circular reference', function(assert) { - let BazFactory = Mirage.Factory.extend({ + let BazFactory = Factory.extend({ bar() { return this.foo; }, @@ -237,7 +236,7 @@ module('Unit | Factory', function() { test('#build skips invoking `afterCreate`', function(assert) { let skipped = true; - let PostFactory = Mirage.Factory.extend({ + let PostFactory = Factory.extend({ afterCreate() { skipped = false; } @@ -255,7 +254,7 @@ module('Unit | Factory', function() { }); test('extractAfterCreateCallbacks returns all afterCreate callbacks from factory with the base one being first', function(assert) { - let PostFactory = Mirage.Factory.extend({ + let PostFactory = Factory.extend({ published: trait({ afterCreate() { return 'from published'; @@ -281,7 +280,7 @@ module('Unit | Factory', function() { }); test('extractAfterCreateCallbacks filters traits from which the afterCreate callbacks will be extracted from', function(assert) { - let PostFactory = Mirage.Factory.extend({ + let PostFactory = Factory.extend({ published: trait({ afterCreate() { return 'from published'; @@ -327,7 +326,7 @@ module('Unit | Factory', function() { }); test('isTrait returns true if there is a trait with given name', function(assert) { - let PostFactory = Mirage.Factory.extend({ + let PostFactory = Factory.extend({ title: 'Lorem ipsum', published: trait({ From 6527fd5aea001635bd8ce9f8738a4f62d00ce764 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 24 May 2019 16:28:35 -0400 Subject: [PATCH 441/879] Pull back in read-modules and start-mirage --- addon/start-mirage.js | 52 +++++++++++++++++++++++++++++-- addon/utils/read-modules.js | 62 +++++++++++++++++++++++++++++++++++-- 2 files changed, 108 insertions(+), 6 deletions(-) diff --git a/addon/start-mirage.js b/addon/start-mirage.js index a8a7d8d63..023001334 100644 --- a/addon/start-mirage.js +++ b/addon/start-mirage.js @@ -1,4 +1,50 @@ -import StartMirage from '@miragejs/server/lib/start-mirage'; -export * from '@miragejs/server/lib/start-mirage'; +import readModules from './utils/read-modules'; +import Server from './server'; +import _assign from 'lodash/assign'; -export default StartMirage; +/** + Helper to start mirage. This should not be called directly. In rfc232/rfc268 + tests, use `setupMirage()` or the `autoboot` option in the addon config + in the environment. In legacy tests that call `startMirage` directly, this + should be called via the `startMirage` method exported from + `/initializers/ember-cli-mirage`. + + This is intended to be called with only the `owner` argument (which would be + `this.owner` in an rfc232/rfc268 test, or the application instance if called + from an instance initializer). However, to support the legacy initializer, it + can instead accept a hash of the environment and config objects. + + @hide +*/ +export default function startMirage(owner, { env, baseConfig, testConfig } = {}) { + if (!env || !baseConfig) { + if (!owner) { + throw new Error('You must pass `owner` to startMirage()'); + } + + env = env || resolveRegistration(owner, 'config:environment'); + // These are set from `/initializers/ember-cli-mirage` + baseConfig = baseConfig || resolveRegistration(owner, 'mirage:base-config'); + testConfig = testConfig || resolveRegistration(owner, 'mirage:test-config'); + } + + let environment = env.environment; + let envConfig = env['ember-cli-mirage'] || {}; + let discoverEmberDataModels = envConfig.discoverEmberDataModels !== undefined ? envConfig.discoverEmberDataModels : true; + let modules = readModules(env.modulePrefix); + let options = _assign(modules, {environment, baseConfig, testConfig, discoverEmberDataModels}); + options.trackRequests = env['ember-cli-mirage'].trackRequests; + + return new Server(options); +} + +// Support Ember 1.13 +function resolveRegistration(owner, ...args) { + if (owner.resolveRegistration) { + return owner.resolveRegistration(...args); + } else if (owner.__container__) { + return owner.__container__.lookupFactory(...args); + } else { + return owner.container.lookupFactory(...args); + } +} diff --git a/addon/utils/read-modules.js b/addon/utils/read-modules.js index 4dfb4da5a..4aa8d3256 100644 --- a/addon/utils/read-modules.js +++ b/addon/utils/read-modules.js @@ -1,4 +1,60 @@ -import ReadModules from '@miragejs/server/lib/utils/read-modules'; -export * from '@miragejs/server/lib/utils/read-modules'; +/* global requirejs, require */ +/* eslint-env node */ +'use strict'; -export default ReadModules; +import assert from '../assert'; +import _camelCase from 'lodash/camelCase'; +import { pluralize } from '../utils/inflector'; +import require from 'require'; + +/** + This function looks through all files that have been loaded by Ember CLI and + finds the ones under /mirage/[factories, fixtures, scenarios, models]/, and exports + a hash containing the names of the files as keys and the data as values. + + @hide +*/ +export default function(prefix) { + let modules = ['factories', 'fixtures', 'scenarios', 'models', 'serializers', 'identity-managers']; + let mirageModuleRegExp = new RegExp(`^${prefix}/mirage/(${modules.join('|')})`); + let modulesMap = modules.reduce((memo, name) => { + memo[_camelCase(name)] = {}; + return memo; + }, {}); + + Object.keys(requirejs.entries).filter(function(key) { + return mirageModuleRegExp.test(key); + }).forEach(function(moduleName) { + if (moduleName.match('.jshint')) { // ignore autogenerated .jshint files + return; + } + let moduleParts = moduleName.split('/'); + let moduleType = _camelCase(moduleParts[moduleParts.length - 2]); + let moduleKey = moduleParts[moduleParts.length - 1]; + assert(`Subdirectories under ${moduleType} are not supported`, + moduleParts[moduleParts.length - 3] === 'mirage'); + + if (moduleType === 'scenario') { + assert('Only scenario/default.js is supported at this time.', + moduleKey !== 'default'); + } + + /* + Ensure fixture keys are pluralized + */ + if (moduleType === 'fixtures') { + moduleKey = pluralize(moduleKey); + } + + let module = require(moduleName, null, null, true); + if (!module) { + throw new Error(`${moduleName} must export a ${moduleType}`); + } + + let data = module.default; + + modulesMap[moduleType][_camelCase(moduleKey)] = data; + }); + + return modulesMap; +} From 9996abce08d614b8b719356c1d81b1d94cab827a Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Sat, 25 May 2019 04:14:33 +0100 Subject: [PATCH 442/879] Got it working with new inflector interface --- tests/integration/orm/collection-inflector-test.js | 10 ++++++++-- .../integration/server/create-and-create-list-test.js | 8 ++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/tests/integration/orm/collection-inflector-test.js b/tests/integration/orm/collection-inflector-test.js index 1ed387e4a..5ee496f5b 100644 --- a/tests/integration/orm/collection-inflector-test.js +++ b/tests/integration/orm/collection-inflector-test.js @@ -1,14 +1,16 @@ import Model from 'ember-cli-mirage/orm/model'; import Schema from 'ember-cli-mirage/orm/schema'; import Db from 'ember-cli-mirage/db'; -import Inflector from 'ember-inflector'; import {module, test} from 'qunit'; +import { Inflector } from 'ember-cli-mirage'; var db, schema, HeadOfState; module('Integration | ORM | inflector-collectionName integration', function(hooks) { hooks.beforeEach(function() { - Inflector.inflector.irregular('head-of-state', 'heads-of-state'); + Inflector.configureInflector((inflector) => { + inflector.irregular('head-of-state', 'heads-of-state'); + }); HeadOfState = Model.extend(); db = new Db({}); @@ -16,6 +18,10 @@ module('Integration | ORM | inflector-collectionName integration', function(hook schema.registerModel('headOfState', HeadOfState); }); + hooks.afterEach(function() { + Inflector.clearInflector(); + }); + test(' [regression] collection creation respects irregular plural rules', function(assert) { assert.equal(schema.db._collections.length, 1); assert.equal(schema.db._collections[0].name, 'headsOfState'); diff --git a/tests/integration/server/create-and-create-list-test.js b/tests/integration/server/create-and-create-list-test.js index 38327f311..81e9e5b9d 100644 --- a/tests/integration/server/create-and-create-list-test.js +++ b/tests/integration/server/create-and-create-list-test.js @@ -1,6 +1,5 @@ import { module, test } from 'qunit'; -import { Model, Factory, hasMany, belongsTo } from 'ember-cli-mirage'; -import Inflector from 'ember-inflector'; +import { Model, Factory, hasMany, belongsTo, Inflector } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; // import escape from 'escape-string-regexp'; import regExpFromString from '../../helpers/reg-exp-from-string'; @@ -49,6 +48,7 @@ module('Integration | Server | create and createList', function(hooks) { hooks.afterEach(function() { this.server.shutdown(); + Inflector.clearInflector(); // eslint-disable-next-line no-console console.warn = originalWarn; @@ -83,7 +83,7 @@ module('Integration | Server | create and createList', function(hooks) { test('create returns a Model instance if the Model name is uncountable', function(assert) { expectNoWarning(assert); - Inflector.inflector.uncountable('data'); + Inflector.configureInflector((inflector) => inflector.uncountable('data')); let data = this.server.create('data'); assert.ok(data instanceof this.Data, 'expected a Data'); @@ -118,7 +118,7 @@ module('Integration | Server | create and createList', function(hooks) { test('createList returns Models if the model name is uncountable', function(assert) { expectNoWarning(assert); - Inflector.inflector.uncountable('data'); + Inflector.configureInflector(inflector => inflector.uncountable('data')); let data = this.server.createList('data', 1); assert.ok(data[0] instanceof this.Data, 'expected a Data'); From 6f9a35a6563d2e1cc18860116743fea3f5f2737b Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Sat, 25 May 2019 04:19:00 +0100 Subject: [PATCH 443/879] Update temp version to @miragejs/server with customized inflector api --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2a5ee984b..58c55db7d 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "prepare": "./scripts/link.sh" }, "dependencies": { - "@miragejs/server": "^2.0.0-beta.4", + "@miragejs/server": "git+https://github.com/asantos00/server.git#add-inflector-customization-api", "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^2.0.1", "broccoli-merge-trees": "^3.0.2", From ecbbe122e565c4df4050f63e30cfc2bc77b79548 Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Sun, 26 May 2019 10:45:40 +0100 Subject: [PATCH 444/879] Revert "Got it working with new inflector interface" This reverts commit 9996abce08d614b8b719356c1d81b1d94cab827a. --- tests/integration/orm/collection-inflector-test.js | 10 ++-------- .../integration/server/create-and-create-list-test.js | 8 ++++---- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/tests/integration/orm/collection-inflector-test.js b/tests/integration/orm/collection-inflector-test.js index 5ee496f5b..1ed387e4a 100644 --- a/tests/integration/orm/collection-inflector-test.js +++ b/tests/integration/orm/collection-inflector-test.js @@ -1,16 +1,14 @@ import Model from 'ember-cli-mirage/orm/model'; import Schema from 'ember-cli-mirage/orm/schema'; import Db from 'ember-cli-mirage/db'; +import Inflector from 'ember-inflector'; import {module, test} from 'qunit'; -import { Inflector } from 'ember-cli-mirage'; var db, schema, HeadOfState; module('Integration | ORM | inflector-collectionName integration', function(hooks) { hooks.beforeEach(function() { - Inflector.configureInflector((inflector) => { - inflector.irregular('head-of-state', 'heads-of-state'); - }); + Inflector.inflector.irregular('head-of-state', 'heads-of-state'); HeadOfState = Model.extend(); db = new Db({}); @@ -18,10 +16,6 @@ module('Integration | ORM | inflector-collectionName integration', function(hook schema.registerModel('headOfState', HeadOfState); }); - hooks.afterEach(function() { - Inflector.clearInflector(); - }); - test(' [regression] collection creation respects irregular plural rules', function(assert) { assert.equal(schema.db._collections.length, 1); assert.equal(schema.db._collections[0].name, 'headsOfState'); diff --git a/tests/integration/server/create-and-create-list-test.js b/tests/integration/server/create-and-create-list-test.js index 81e9e5b9d..38327f311 100644 --- a/tests/integration/server/create-and-create-list-test.js +++ b/tests/integration/server/create-and-create-list-test.js @@ -1,5 +1,6 @@ import { module, test } from 'qunit'; -import { Model, Factory, hasMany, belongsTo, Inflector } from 'ember-cli-mirage'; +import { Model, Factory, hasMany, belongsTo } from 'ember-cli-mirage'; +import Inflector from 'ember-inflector'; import Server from 'ember-cli-mirage/server'; // import escape from 'escape-string-regexp'; import regExpFromString from '../../helpers/reg-exp-from-string'; @@ -48,7 +49,6 @@ module('Integration | Server | create and createList', function(hooks) { hooks.afterEach(function() { this.server.shutdown(); - Inflector.clearInflector(); // eslint-disable-next-line no-console console.warn = originalWarn; @@ -83,7 +83,7 @@ module('Integration | Server | create and createList', function(hooks) { test('create returns a Model instance if the Model name is uncountable', function(assert) { expectNoWarning(assert); - Inflector.configureInflector((inflector) => inflector.uncountable('data')); + Inflector.inflector.uncountable('data'); let data = this.server.create('data'); assert.ok(data instanceof this.Data, 'expected a Data'); @@ -118,7 +118,7 @@ module('Integration | Server | create and createList', function(hooks) { test('createList returns Models if the model name is uncountable', function(assert) { expectNoWarning(assert); - Inflector.configureInflector(inflector => inflector.uncountable('data')); + Inflector.inflector.uncountable('data'); let data = this.server.createList('data', 1); assert.ok(data[0] instanceof this.Data, 'expected a Data'); From 1fab9ccd088c93eaf16929db68f535fb16678ade Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Sun, 26 May 2019 23:24:50 +0100 Subject: [PATCH 445/879] Use temporary __inflections variable --- tests/integration/orm/collection-inflector-test.js | 4 ++-- tests/integration/server/create-and-create-list-test.js | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/integration/orm/collection-inflector-test.js b/tests/integration/orm/collection-inflector-test.js index 1ed387e4a..0f306c154 100644 --- a/tests/integration/orm/collection-inflector-test.js +++ b/tests/integration/orm/collection-inflector-test.js @@ -1,14 +1,14 @@ import Model from 'ember-cli-mirage/orm/model'; import Schema from 'ember-cli-mirage/orm/schema'; import Db from 'ember-cli-mirage/db'; -import Inflector from 'ember-inflector'; import {module, test} from 'qunit'; +import { __inflections } from 'ember-cli-mirage/utils/inflector'; var db, schema, HeadOfState; module('Integration | ORM | inflector-collectionName integration', function(hooks) { hooks.beforeEach(function() { - Inflector.inflector.irregular('head-of-state', 'heads-of-state'); + __inflections(inflector => inflector.irregular('head-of-state', 'heads-of-state')); HeadOfState = Model.extend(); db = new Db({}); diff --git a/tests/integration/server/create-and-create-list-test.js b/tests/integration/server/create-and-create-list-test.js index 38327f311..1c5191291 100644 --- a/tests/integration/server/create-and-create-list-test.js +++ b/tests/integration/server/create-and-create-list-test.js @@ -1,6 +1,5 @@ import { module, test } from 'qunit'; import { Model, Factory, hasMany, belongsTo } from 'ember-cli-mirage'; -import Inflector from 'ember-inflector'; import Server from 'ember-cli-mirage/server'; // import escape from 'escape-string-regexp'; import regExpFromString from '../../helpers/reg-exp-from-string'; From 2ddb4aa4a458ea20b8ec5691ea4f2790b1172e74 Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Mon, 27 May 2019 15:18:41 +0100 Subject: [PATCH 446/879] Forward ember-inflector calls to inflected --- addon/index.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/addon/index.js b/addon/index.js index 54717f1ee..e88363b8d 100644 --- a/addon/index.js +++ b/addon/index.js @@ -1,4 +1,26 @@ import MirageServer from '@miragejs/server/lib'; export * from '@miragejs/server/lib'; +import Inflector from 'ember-inflector'; +import { __inflections } from './utils/inflector'; + +function patchEmberInflector() { + __inflections(inflector => { + // Proxy ember-inflector calls to `inflected` + Inflector.inflector = new window.Proxy(Inflector.inflector, { + get: function(_, prop) { + if (inflector[prop]) { + return function(...args) { + return inflector[prop](...args); + }; + } + + return window.Reflect.get(...arguments); + } + }); + }); +} + +patchEmberInflector(); + export default MirageServer; From 37d988ffb457bb9a3383ada5407a208d55beeab1 Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Mon, 27 May 2019 15:32:13 +0100 Subject: [PATCH 447/879] import Inflector in create-and-create-list-test --- addon/index.js | 10 ++++------ .../integration/server/create-and-create-list-test.js | 1 + 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/addon/index.js b/addon/index.js index e88363b8d..a7afd4c19 100644 --- a/addon/index.js +++ b/addon/index.js @@ -5,17 +5,15 @@ import Inflector from 'ember-inflector'; import { __inflections } from './utils/inflector'; function patchEmberInflector() { - __inflections(inflector => { + __inflections(newInflector => { // Proxy ember-inflector calls to `inflected` Inflector.inflector = new window.Proxy(Inflector.inflector, { get: function(_, prop) { - if (inflector[prop]) { - return function(...args) { - return inflector[prop](...args); - }; + if (!newInflector[prop]) { + return window.Reflect.get(...arguments); } - return window.Reflect.get(...arguments); + return (...args) => newInflector[prop](...args); } }); }); diff --git a/tests/integration/server/create-and-create-list-test.js b/tests/integration/server/create-and-create-list-test.js index 1c5191291..967e0277b 100644 --- a/tests/integration/server/create-and-create-list-test.js +++ b/tests/integration/server/create-and-create-list-test.js @@ -3,6 +3,7 @@ import { Model, Factory, hasMany, belongsTo } from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; // import escape from 'escape-string-regexp'; import regExpFromString from '../../helpers/reg-exp-from-string'; +import Inflector from 'ember-inflector'; // eslint-disable-next-line no-console let originalWarn = console.warn; From ee152c020c2b3cfe4a2a0cc9cafa0386e4c36544 Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Mon, 27 May 2019 15:48:25 +0100 Subject: [PATCH 448/879] Use nicer syntax instead of Reflect --- addon/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addon/index.js b/addon/index.js index a7afd4c19..3da8362bd 100644 --- a/addon/index.js +++ b/addon/index.js @@ -8,9 +8,9 @@ function patchEmberInflector() { __inflections(newInflector => { // Proxy ember-inflector calls to `inflected` Inflector.inflector = new window.Proxy(Inflector.inflector, { - get: function(_, prop) { + get: function(target, prop) { if (!newInflector[prop]) { - return window.Reflect.get(...arguments); + return target[prop].apply(this, arguments); } return (...args) => newInflector[prop](...args); From 774cfee0924cef688ed51805d986423542f4412d Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Tue, 28 May 2019 00:32:48 +0100 Subject: [PATCH 449/879] Revert changes to Mirage.something api --- .../route-handlers/delete-shorthand-test.js | 4 +- .../function-handler/basic-test.js | 2 +- .../function-handler/serialize-test.js | 2 +- .../serializers/base/full-request-test.js | 10 ++--- .../integration/serializers/schema-helper.js | 20 ++++----- tests/unit/factory-test.js | 41 ++++++++++--------- 6 files changed, 40 insertions(+), 39 deletions(-) diff --git a/tests/integration/route-handlers/delete-shorthand-test.js b/tests/integration/route-handlers/delete-shorthand-test.js index 0b4ef4059..c5a8c894c 100644 --- a/tests/integration/route-handlers/delete-shorthand-test.js +++ b/tests/integration/route-handlers/delete-shorthand-test.js @@ -1,9 +1,9 @@ import {module, test} from 'qunit'; import Server from 'ember-cli-mirage/server'; import Model from 'ember-cli-mirage/orm/model'; +import Mirage from 'ember-cli-mirage'; import DeleteShorthandRouteHandler from 'ember-cli-mirage/route-handlers/shorthands/delete'; import JSONAPISerializer from 'ember-cli-mirage/serializers/json-api-serializer'; -import { hasMany } from 'ember-cli-mirage'; module('Integration | Route Handlers | DELETE shorthand', function(hooks) { hooks.beforeEach(function() { @@ -11,7 +11,7 @@ module('Integration | Route Handlers | DELETE shorthand', function(hooks) { environment: 'development', models: { wordSmith: Model.extend({ - blogPosts: hasMany() + blogPosts: Mirage.hasMany() }), blogPost: Model } diff --git a/tests/integration/route-handlers/function-handler/basic-test.js b/tests/integration/route-handlers/function-handler/basic-test.js index dc0e2d130..ac7375e0b 100644 --- a/tests/integration/route-handlers/function-handler/basic-test.js +++ b/tests/integration/route-handlers/function-handler/basic-test.js @@ -1,6 +1,6 @@ import { module, test } from 'qunit'; import { Promise } from 'rsvp'; -import Server, { Model, ActiveModelSerializer, Response } from 'ember-cli-mirage'; +import { Server, Model, ActiveModelSerializer, Response } from 'ember-cli-mirage'; import promiseAjax from '../../../helpers/promise-ajax'; module('Integration | Route handlers | Function handler', function(hooks) { diff --git a/tests/integration/route-handlers/function-handler/serialize-test.js b/tests/integration/route-handlers/function-handler/serialize-test.js index 64d803bc8..0b0eff84a 100644 --- a/tests/integration/route-handlers/function-handler/serialize-test.js +++ b/tests/integration/route-handlers/function-handler/serialize-test.js @@ -1,5 +1,5 @@ import { module, test } from 'qunit'; -import Server, { Model, Collection, ActiveModelSerializer } from 'ember-cli-mirage'; +import { Server, Model, Collection, ActiveModelSerializer } from 'ember-cli-mirage'; import _uniqBy from 'lodash/uniqBy'; import promiseAjax from '../../../helpers/promise-ajax'; diff --git a/tests/integration/serializers/base/full-request-test.js b/tests/integration/serializers/base/full-request-test.js index eeb8f92b3..89ebe4df0 100644 --- a/tests/integration/serializers/base/full-request-test.js +++ b/tests/integration/serializers/base/full-request-test.js @@ -1,9 +1,9 @@ +import Mirage from 'ember-cli-mirage'; import Server from 'ember-cli-mirage/server'; import Model from 'ember-cli-mirage/orm/model'; import Serializer from 'ember-cli-mirage/serializer'; import {module, test} from 'qunit'; import promiseAjax from '../../../helpers/promise-ajax'; -import { hasMany, belongsTo } from 'ember-cli-mirage'; module('Integration | Serializers | Base | Full Request', function(hooks) { hooks.beforeEach(function() { @@ -11,14 +11,14 @@ module('Integration | Serializers | Base | Full Request', function(hooks) { environment: 'development', models: { author: Model.extend({ - posts: hasMany() + posts: Mirage.hasMany() }), post: Model.extend({ - author: belongsTo(), - comments: hasMany() + author: Mirage.belongsTo(), + comments: Mirage.hasMany() }), comment: Model.extend({ - post: belongsTo() + post: Mirage.belongsTo() }) }, serializers: { diff --git a/tests/integration/serializers/schema-helper.js b/tests/integration/serializers/schema-helper.js index d9597890a..a82362e9b 100644 --- a/tests/integration/serializers/schema-helper.js +++ b/tests/integration/serializers/schema-helper.js @@ -1,38 +1,38 @@ +import Mirage from 'ember-cli-mirage'; import Schema from 'ember-cli-mirage/orm/schema'; import Model from 'ember-cli-mirage/orm/model'; import Db from 'ember-cli-mirage/db'; -import { hasMany, belongsTo } from 'ember-cli-mirage'; export default { setup() { return new Schema(new Db(), { wordSmith: Model.extend({ - blogPosts: hasMany() + blogPosts: Mirage.hasMany() }), blogPost: Model.extend({ - wordSmith: belongsTo(), - fineComments: hasMany() + wordSmith: Mirage.belongsTo(), + fineComments: Mirage.hasMany() }), fineComment: Model.extend({ - blogPost: belongsTo() + blogPost: Mirage.belongsTo() }), greatPhoto: Model, foo: Model.extend({ - bar: belongsTo() + bar: Mirage.belongsTo() }), bar: Model.extend({ - baz: belongsTo() + baz: Mirage.belongsTo() }), baz: Model.extend({ - quuxes: hasMany() + quuxes: Mirage.hasMany() }), quux: Model.extend({ - zomgs: hasMany() + zomgs: Mirage.hasMany() }), zomg: Model.extend({ - lol: belongsTo() + lol: Mirage.belongsTo() }), lol: Model }); diff --git a/tests/unit/factory-test.js b/tests/unit/factory-test.js index aa9c82a92..b53dad1d8 100644 --- a/tests/unit/factory-test.js +++ b/tests/unit/factory-test.js @@ -1,21 +1,22 @@ -import { Factory, trait } from 'ember-cli-mirage'; +import Mirage from 'ember-cli-mirage'; +import { trait } from 'ember-cli-mirage'; import {module, test} from 'qunit'; module('Unit | Factory', function() { test('it exists', function(assert) { - assert.ok(Factory); + assert.ok(Mirage.Factory); }); test('the base class builds empty objects', function(assert) { - let f = new Factory(); + let f = new Mirage.Factory(); let data = f.build(); assert.deepEqual(data, {}); }); test('a noop extension builds empty objects', function(assert) { - let EmptyFactory = Factory.extend(); + let EmptyFactory = Mirage.Factory.extend(); let f = new EmptyFactory(); let data = f.build(); @@ -23,7 +24,7 @@ module('Unit | Factory', function() { }); test('it works with strings, numbers and booleans', function(assert) { - let AFactory = Factory.extend({ + let AFactory = Mirage.Factory.extend({ name: 'Sam', age: 28, alive: true @@ -36,7 +37,7 @@ module('Unit | Factory', function() { }); test('it supports inheritance', function(assert) { - let PersonFactory = Factory.extend({ + let PersonFactory = Mirage.Factory.extend({ species: 'human' }); let ManFactory = PersonFactory.extend({ @@ -56,7 +57,7 @@ module('Unit | Factory', function() { }); test('it can use sequences', function(assert) { - let PostFactory = Factory.extend({ + let PostFactory = Mirage.Factory.extend({ likes(i) { return 5 * i; } @@ -71,7 +72,7 @@ module('Unit | Factory', function() { }); test('it can reuse static properties', function(assert) { - let BazFactory = Factory.extend({ + let BazFactory = Mirage.Factory.extend({ foo: 5, bar(i) { return this.foo * i; @@ -87,7 +88,7 @@ module('Unit | Factory', function() { }); test('it can reuse dynamic properties', function(assert) { - let BazFactory = Factory.extend({ + let BazFactory = Mirage.Factory.extend({ foo(i) { return 5 * i; }, @@ -105,7 +106,7 @@ module('Unit | Factory', function() { }); test('it can have dynamic properties that depend on another', function(assert) { - let BazFactory = Factory.extend({ + let BazFactory = Mirage.Factory.extend({ name() { return 'foo'; }, @@ -121,7 +122,7 @@ module('Unit | Factory', function() { }); test('it can reference properties out of order', function(assert) { - let BazFactory = Factory.extend({ + let BazFactory = Mirage.Factory.extend({ bar() { return this.foo + 2; }, @@ -142,7 +143,7 @@ module('Unit | Factory', function() { }); test('it can reference multiple properties in any order', function(assert) { - let FooFactory = Factory.extend({ + let FooFactory = Mirage.Factory.extend({ foo() { return this.bar + this.baz; }, @@ -152,7 +153,7 @@ module('Unit | Factory', function() { baz: 10 }); - let BarFactory = Factory.extend({ + let BarFactory = Mirage.Factory.extend({ bar: 6, foo() { @@ -162,7 +163,7 @@ module('Unit | Factory', function() { baz: 10 }); - let BazFactory = Factory.extend({ + let BazFactory = Mirage.Factory.extend({ bar: 6, baz: 10, @@ -186,7 +187,7 @@ module('Unit | Factory', function() { }); test('it can reference properties on complex object', function(assert) { - let AbcFactory = Factory.extend({ + let AbcFactory = Mirage.Factory.extend({ a(i) { return this.b + i; }, @@ -216,7 +217,7 @@ module('Unit | Factory', function() { }); test('throws meaningfull exception on circular reference', function(assert) { - let BazFactory = Factory.extend({ + let BazFactory = Mirage.Factory.extend({ bar() { return this.foo; }, @@ -236,7 +237,7 @@ module('Unit | Factory', function() { test('#build skips invoking `afterCreate`', function(assert) { let skipped = true; - let PostFactory = Factory.extend({ + let PostFactory = Mirage.Factory.extend({ afterCreate() { skipped = false; } @@ -254,7 +255,7 @@ module('Unit | Factory', function() { }); test('extractAfterCreateCallbacks returns all afterCreate callbacks from factory with the base one being first', function(assert) { - let PostFactory = Factory.extend({ + let PostFactory = Mirage.Factory.extend({ published: trait({ afterCreate() { return 'from published'; @@ -280,7 +281,7 @@ module('Unit | Factory', function() { }); test('extractAfterCreateCallbacks filters traits from which the afterCreate callbacks will be extracted from', function(assert) { - let PostFactory = Factory.extend({ + let PostFactory = Mirage.Factory.extend({ published: trait({ afterCreate() { return 'from published'; @@ -326,7 +327,7 @@ module('Unit | Factory', function() { }); test('isTrait returns true if there is a trait with given name', function(assert) { - let PostFactory = Factory.extend({ + let PostFactory = Mirage.Factory.extend({ title: 'Lorem ipsum', published: trait({ From 13e126a30c4f0c9ae53546505a49792eafcea0ea Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Tue, 28 May 2019 02:25:29 +0100 Subject: [PATCH 450/879] Fix patch ember-inflector proxy --- addon/index.js | 7 ++++++- yarn.lock | 39 +++++++-------------------------------- 2 files changed, 13 insertions(+), 33 deletions(-) diff --git a/addon/index.js b/addon/index.js index 3da8362bd..f5d48e1aa 100644 --- a/addon/index.js +++ b/addon/index.js @@ -9,8 +9,13 @@ function patchEmberInflector() { // Proxy ember-inflector calls to `inflected` Inflector.inflector = new window.Proxy(Inflector.inflector, { get: function(target, prop) { + let originalValue = target[prop]; + if (typeof originalValue !== 'function') { + return originalValue; + } + if (!newInflector[prop]) { - return target[prop].apply(this, arguments); + return (...args) => target[prop](args); } return (...args) => newInflector[prop](...args); diff --git a/yarn.lock b/yarn.lock index 353ea812c..99e82ea75 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1077,28 +1077,22 @@ dependencies: core-js "^2.5.7" -"@miragejs/server@^2.0.0-beta.4": +"@miragejs/server@git+https://github.com/asantos00/server.git#add-inflector-customization-api": version "2.0.0-beta.4" - resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-2.0.0-beta.4.tgz#b4a13232737abfeffd219fab200f970ea2f82761" - integrity sha512-4MgGkFRemcZRXBUCJzqiIhgWOE+wJrK+RF50R1Oh0HFKNl21RGurn57tICtJilOHY1e2C2yvoQaNHoRUoVmqAQ== + resolved "git+https://github.com/asantos00/server.git#cbff57c909fe46876f9178189281fd26e12d86fc" dependencies: - "@xg-wang/whatwg-fetch" "^3.0.0" broccoli-file-creator "^2.1.1" broccoli-funnel "^2.0.1" broccoli-merge-trees "^3.0.2" - broccoli-stew "^2.0.1" broccoli-string-replace "^0.1.2" - chalk "^1.1.1" + chalk "^2.4.2" ember-auto-import "^1.2.19" - ember-cli-babel "^6.16.0" - ember-cli-node-assets "^0.2.2" + ember-cli-babel "^7.5.0" ember-get-config "^0.2.2" ember-inflector "^2.0.0 || ^3.0.0" - fake-xml-http-request "^2.0.0" inflected "^2.0.4" lodash "^4.17.11" - pretender "2.1.1" - route-recognizer "^0.3.4" + pretender "3.0.1" "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" @@ -1338,11 +1332,6 @@ "@webassemblyjs/wast-parser" "1.7.11" "@xtuc/long" "4.2.1" -"@xg-wang/whatwg-fetch@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@xg-wang/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#f7b222c012a238e7d6e89ed3d72a1e0edb58453d" - integrity sha512-ULtqA6L75RLzTNW68IiOja0XYv4Ebc3OGMzfia1xxSEMpD0mk/pMvkQX0vbCFyQmKc5xGp80Ms2WiSlXLh8hbA== - "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -3267,7 +3256,7 @@ broccoli-stew@^1.4.2, broccoli-stew@^1.5.0: symlink-or-copy "^1.2.0" walk-sync "^0.3.0" -broccoli-stew@^2.0.0, broccoli-stew@^2.0.1: +broccoli-stew@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-2.1.0.tgz#ba73add17fda3b9b01d8cfb343a8b613b7136a0a" integrity sha512-tgCkuTWYl4uf7k7ib2D79KFEj2hCgnTUNPMnrCoAha0/4bywcNccmaZVWtL9Ex37yX5h5eAbnM/ak2ULoMwSSw== @@ -3769,7 +3758,7 @@ chai@^4.1.0: pathval "^1.1.0" type-detect "^4.0.5" -chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.0.0, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= @@ -11411,15 +11400,6 @@ preserve@^0.2.0: resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= -pretender@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/pretender/-/pretender-2.1.1.tgz#5085f0a1272c31d5b57c488386f69e6ca207cb35" - integrity sha512-IkidsJzaroAanw3I43tKCFm2xCpurkQr9aPXv5/jpN+LfCwDaeI8rngVWtQZTx4qqbhc5zJspnLHJ4N/25KvDQ== - dependencies: - "@xg-wang/whatwg-fetch" "^3.0.0" - fake-xml-http-request "^2.0.0" - route-recognizer "^0.3.3" - pretender@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.0.1.tgz#817ac43faa3330aa17646968a115f232de10b2ca" @@ -12301,11 +12281,6 @@ route-recognizer@^0.3.3: resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.3.tgz#1d365e27fa6995e091675f7dc940a8c00353bd29" integrity sha1-HTZeJ/ppleCRZ199yUCowANTvSk= -route-recognizer@^0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.4.tgz#39ab1ffbce1c59e6d2bdca416f0932611e4f3ca3" - integrity sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g== - rsvp@^3.0.14, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.3.3, rsvp@^3.5.0: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" From a353fb569256ff3d5eff67ede7e52e227515d89e Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Tue, 28 May 2019 16:55:12 +0100 Subject: [PATCH 451/879] Revert changes in collection-inflector-test --- tests/integration/orm/collection-inflector-test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/integration/orm/collection-inflector-test.js b/tests/integration/orm/collection-inflector-test.js index 0f306c154..1ed387e4a 100644 --- a/tests/integration/orm/collection-inflector-test.js +++ b/tests/integration/orm/collection-inflector-test.js @@ -1,14 +1,14 @@ import Model from 'ember-cli-mirage/orm/model'; import Schema from 'ember-cli-mirage/orm/schema'; import Db from 'ember-cli-mirage/db'; +import Inflector from 'ember-inflector'; import {module, test} from 'qunit'; -import { __inflections } from 'ember-cli-mirage/utils/inflector'; var db, schema, HeadOfState; module('Integration | ORM | inflector-collectionName integration', function(hooks) { hooks.beforeEach(function() { - __inflections(inflector => inflector.irregular('head-of-state', 'heads-of-state')); + Inflector.inflector.irregular('head-of-state', 'heads-of-state'); HeadOfState = Model.extend(); db = new Db({}); From 3e4185b7fc451c653682b34615eae8f0d33b9803 Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Tue, 28 May 2019 17:07:23 +0100 Subject: [PATCH 452/879] Remove patcher from addon/index.js --- addon/index.js | 25 ------------------------- addon/start-mirage.js | 2 ++ 2 files changed, 2 insertions(+), 25 deletions(-) diff --git a/addon/index.js b/addon/index.js index f5d48e1aa..54717f1ee 100644 --- a/addon/index.js +++ b/addon/index.js @@ -1,29 +1,4 @@ import MirageServer from '@miragejs/server/lib'; export * from '@miragejs/server/lib'; -import Inflector from 'ember-inflector'; -import { __inflections } from './utils/inflector'; - -function patchEmberInflector() { - __inflections(newInflector => { - // Proxy ember-inflector calls to `inflected` - Inflector.inflector = new window.Proxy(Inflector.inflector, { - get: function(target, prop) { - let originalValue = target[prop]; - if (typeof originalValue !== 'function') { - return originalValue; - } - - if (!newInflector[prop]) { - return (...args) => target[prop](args); - } - - return (...args) => newInflector[prop](...args); - } - }); - }); -} - -patchEmberInflector(); - export default MirageServer; diff --git a/addon/start-mirage.js b/addon/start-mirage.js index 023001334..3d87d25f6 100644 --- a/addon/start-mirage.js +++ b/addon/start-mirage.js @@ -35,6 +35,8 @@ export default function startMirage(owner, { env, baseConfig, testConfig } = {}) let options = _assign(modules, {environment, baseConfig, testConfig, discoverEmberDataModels}); options.trackRequests = env['ember-cli-mirage'].trackRequests; + patchEmberInflector(); + return new Server(options); } From 329ecf5601b6733411fb8fc371a66bf4429153ea Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Wed, 29 May 2019 02:21:13 +0100 Subject: [PATCH 453/879] tmp: Started to try passing server reference everywhere --- addon/start-mirage.js | 4 +- tests/integration/database-test.js | 5 ++- tests/integration/orm/all-test.js | 59 ++++++++++++++++++----------- tests/integration/orm/attrs-test.js | 40 +++++++++++-------- 4 files changed, 67 insertions(+), 41 deletions(-) diff --git a/addon/start-mirage.js b/addon/start-mirage.js index 3d87d25f6..80757ea30 100644 --- a/addon/start-mirage.js +++ b/addon/start-mirage.js @@ -1,6 +1,7 @@ import readModules from './utils/read-modules'; import Server from './server'; import _assign from 'lodash/assign'; +import { singularize, pluralize } from 'ember-inflector'; /** Helper to start mirage. This should not be called directly. In rfc232/rfc268 @@ -34,8 +35,7 @@ export default function startMirage(owner, { env, baseConfig, testConfig } = {}) let modules = readModules(env.modulePrefix); let options = _assign(modules, {environment, baseConfig, testConfig, discoverEmberDataModels}); options.trackRequests = env['ember-cli-mirage'].trackRequests; - - patchEmberInflector(); + options.inflector = { singularize, pluralize }; return new Server(options); } diff --git a/tests/integration/database-test.js b/tests/integration/database-test.js index 3c947a280..43808c4b9 100644 --- a/tests/integration/database-test.js +++ b/tests/integration/database-test.js @@ -19,6 +19,10 @@ module('Integration | Database', function(hooks) { authors: [ { id: 1, name: 'Zelda' } ] + }, + inflector: { + singularize: () => '', + pluralize: () => '' } }); }); @@ -37,4 +41,3 @@ module('Integration | Database', function(hooks) { assert.deepEqual(authors.map((a) => a.id), ['1', '2']); }); }); - diff --git a/tests/integration/orm/all-test.js b/tests/integration/orm/all-test.js index 5c5a6bf06..b4454dcf5 100644 --- a/tests/integration/orm/all-test.js +++ b/tests/integration/orm/all-test.js @@ -1,41 +1,54 @@ -import Schema from 'ember-cli-mirage/orm/schema'; -import Model from 'ember-cli-mirage/orm/model'; -import Db from 'ember-cli-mirage/db'; -import Collection from 'ember-cli-mirage/orm/collection'; -import {module, test} from 'qunit'; +import Schema from "ember-cli-mirage/orm/schema"; +import Model from "ember-cli-mirage/orm/model"; +import Db from "ember-cli-mirage/db"; +import Collection from "ember-cli-mirage/orm/collection"; +import { module, test } from "qunit"; -module('Integration | ORM | #all', function() { - test('it can return all models', function(assert) { - let db = new Db({ - users: [ - { id: 1, name: 'Link' }, - { id: 2, name: 'Zelda' } - ] - }); +const mockedInflector = { + inflector: { singularize: () => "", pluralize: () => "" } +}; + +module("Integration | ORM | #all", function() { + test("it can return all models", function(assert) { + let db = new Db( + { + users: [{ id: 1, name: "Link" }, { id: 2, name: "Zelda" }] + }, + {}, + mockedInflector + ); let User = Model.extend(); let schema = new Schema(db, { user: User }); let users = schema.users.all(); - assert.ok(users instanceof Collection, 'it returns a collection'); - assert.ok(users.models[0] instanceof User, 'each member of the collection is a model'); + assert.ok(users instanceof Collection, "it returns a collection"); + assert.ok( + users.models[0] instanceof User, + "each member of the collection is a model" + ); assert.equal(users.models.length, 2); - assert.deepEqual(users.models[1].attrs, { id: '2', name: 'Zelda' }); + assert.deepEqual(users.models[1].attrs, { id: "2", name: "Zelda" }); }); - test('it returns an empty array when no models exist', function(assert) { - let db = new Db({ users: [] }); + test("it returns an empty array when no models exist", function(assert) { + let db = new Db({ users: [] }, {}, mockedInflector); let User = Model.extend(); - let schema = new Schema(db, { - user: User - }); + let schema = new Schema( + db, + { + user: User + }, + {}, + mockedInflector + ); let users = schema.users.all(); - assert.ok(users instanceof Collection, 'it returns a collection'); - assert.equal(users.modelName, 'user', 'the collection knows its type'); + assert.ok(users instanceof Collection, "it returns a collection"); + assert.equal(users.modelName, "user", "the collection knows its type"); assert.equal(users.models.length, 0); }); }); diff --git a/tests/integration/orm/attrs-test.js b/tests/integration/orm/attrs-test.js index 12e2c5c3b..d9650ac79 100644 --- a/tests/integration/orm/attrs-test.js +++ b/tests/integration/orm/attrs-test.js @@ -1,31 +1,41 @@ -import Schema from 'ember-cli-mirage/orm/schema'; -import Model from 'ember-cli-mirage/orm/model'; -import Db from 'ember-cli-mirage/db'; -import {module, test} from 'qunit'; +import Schema from "ember-cli-mirage/orm/schema"; +import Model from "ember-cli-mirage/orm/model"; +import Db from "ember-cli-mirage/db"; +import { module, test } from "qunit"; var db, schema, User; -module('Integration | ORM | attrs', function(hooks) { +module("Integration | ORM | attrs", function(hooks) { + let mockedServer = { + inflector: { singularize: () => "", pluralize: () => "" } + }; hooks.beforeEach(function() { - db = new Db({ users: [ - { id: 1, name: 'Link', evil: false } - ] }); + db = new Db( + { users: [{ id: 1, name: "Link", evil: false }] }, + {}, + mockedServer + ); User = Model.extend(); - schema = new Schema(db, { - user: User - }); + schema = new Schema( + db, + { + user: User + }, + {}, + mockedServer + ); }); - test('attrs returns the models attributes', function(assert) { + test("attrs returns the models attributes", function(assert) { let user = schema.users.find(1); - assert.deepEqual(user.attrs, { id: '1', name: 'Link', evil: false }); + assert.deepEqual(user.attrs, { id: "1", name: "Link", evil: false }); }); - test('attributes can be read via plain property access', function(assert) { + test("attributes can be read via plain property access", function(assert) { let user = schema.users.find(1); - assert.equal(user.name, 'Link'); + assert.equal(user.name, "Link"); }); }); From f77174704478b6f3c91b34142dfc58ff75c18666 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 29 May 2019 14:31:46 -0400 Subject: [PATCH 454/879] Test updates, all passing using miragejs/server PR#6 --- addon/utils/inflector.js | 6 ++++ addon/utils/normalize-name.js | 4 --- tests/integration/database-test.js | 4 --- tests/integration/orm/all-test.js | 27 +++++------------- tests/integration/orm/attrs-test.js | 18 +++--------- .../orm/collection-inflector-test.js | 28 +++++++++++-------- .../server/create-and-create-list-test.js | 3 +- tests/unit/inflector-test.js | 4 +++ tests/unit/utils/normalize-name-test.js | 26 ----------------- 9 files changed, 39 insertions(+), 81 deletions(-) delete mode 100644 addon/utils/normalize-name.js delete mode 100644 tests/unit/utils/normalize-name-test.js diff --git a/addon/utils/inflector.js b/addon/utils/inflector.js index 06c9d4d6d..e84c6b075 100644 --- a/addon/utils/inflector.js +++ b/addon/utils/inflector.js @@ -1,4 +1,10 @@ import Inflector from '@miragejs/server/lib/utils/inflector'; export * from '@miragejs/server/lib/utils/inflector'; +/* + Keeping these tests here for now to avoid accidental breakage, but they are + definitely an Ember Mirage thing, not a Mirage thing. +*/ +export { singularize, pluralize } from 'ember-inflector'; + export default Inflector; diff --git a/addon/utils/normalize-name.js b/addon/utils/normalize-name.js deleted file mode 100644 index 041ae554c..000000000 --- a/addon/utils/normalize-name.js +++ /dev/null @@ -1,4 +0,0 @@ -import NormalizeName from '@miragejs/server/lib/utils/normalize-name'; -export * from '@miragejs/server/lib/utils/normalize-name'; - -export default NormalizeName; diff --git a/tests/integration/database-test.js b/tests/integration/database-test.js index 43808c4b9..76a7def06 100644 --- a/tests/integration/database-test.js +++ b/tests/integration/database-test.js @@ -19,10 +19,6 @@ module('Integration | Database', function(hooks) { authors: [ { id: 1, name: 'Zelda' } ] - }, - inflector: { - singularize: () => '', - pluralize: () => '' } }); }); diff --git a/tests/integration/orm/all-test.js b/tests/integration/orm/all-test.js index b4454dcf5..c3ae84c79 100644 --- a/tests/integration/orm/all-test.js +++ b/tests/integration/orm/all-test.js @@ -4,19 +4,11 @@ import Db from "ember-cli-mirage/db"; import Collection from "ember-cli-mirage/orm/collection"; import { module, test } from "qunit"; -const mockedInflector = { - inflector: { singularize: () => "", pluralize: () => "" } -}; - module("Integration | ORM | #all", function() { test("it can return all models", function(assert) { - let db = new Db( - { - users: [{ id: 1, name: "Link" }, { id: 2, name: "Zelda" }] - }, - {}, - mockedInflector - ); + let db = new Db({ + users: [{ id: 1, name: "Link" }, { id: 2, name: "Zelda" }] + }); let User = Model.extend(); let schema = new Schema(db, { user: User @@ -33,17 +25,12 @@ module("Integration | ORM | #all", function() { }); test("it returns an empty array when no models exist", function(assert) { - let db = new Db({ users: [] }, {}, mockedInflector); + let db = new Db({ users: [] }); let User = Model.extend(); - let schema = new Schema( - db, - { - user: User - }, - {}, - mockedInflector - ); + let schema = new Schema(db, { + user: User + }); let users = schema.users.all(); diff --git a/tests/integration/orm/attrs-test.js b/tests/integration/orm/attrs-test.js index d9650ac79..523f5404d 100644 --- a/tests/integration/orm/attrs-test.js +++ b/tests/integration/orm/attrs-test.js @@ -6,25 +6,15 @@ import { module, test } from "qunit"; var db, schema, User; module("Integration | ORM | attrs", function(hooks) { - let mockedServer = { - inflector: { singularize: () => "", pluralize: () => "" } - }; hooks.beforeEach(function() { db = new Db( - { users: [{ id: 1, name: "Link", evil: false }] }, - {}, - mockedServer + { users: [{ id: 1, name: "Link", evil: false }] } ); User = Model.extend(); - schema = new Schema( - db, - { - user: User - }, - {}, - mockedServer - ); + schema = new Schema(db, { + user: User + }); }); test("attrs returns the models attributes", function(assert) { diff --git a/tests/integration/orm/collection-inflector-test.js b/tests/integration/orm/collection-inflector-test.js index 1ed387e4a..56a5d4e61 100644 --- a/tests/integration/orm/collection-inflector-test.js +++ b/tests/integration/orm/collection-inflector-test.js @@ -1,23 +1,27 @@ -import Model from 'ember-cli-mirage/orm/model'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; +// import Model from 'ember-cli-mirage/orm/model'; +// import Schema from 'ember-cli-mirage/orm/schema'; +import { Server, Model } from 'ember-cli-mirage'; import Inflector from 'ember-inflector'; -import {module, test} from 'qunit'; - -var db, schema, HeadOfState; +import { module, test } from 'qunit'; module('Integration | ORM | inflector-collectionName integration', function(hooks) { hooks.beforeEach(function() { Inflector.inflector.irregular('head-of-state', 'heads-of-state'); - HeadOfState = Model.extend(); - db = new Db({}); - schema = new Schema(db); - schema.registerModel('headOfState', HeadOfState); + this.server = new Server({ + models: { + headOfState: Model.extend() + }, + inflector: Inflector.inflector + }); + }); + + hooks.beforeEach(function() { + this.server.shutdown(); }); test(' [regression] collection creation respects irregular plural rules', function(assert) { - assert.equal(schema.db._collections.length, 1); - assert.equal(schema.db._collections[0].name, 'headsOfState'); + assert.equal(this.server.db._collections.length, 1); + assert.equal(this.server.db._collections[0].name, 'headsOfState'); }); }); diff --git a/tests/integration/server/create-and-create-list-test.js b/tests/integration/server/create-and-create-list-test.js index 967e0277b..dee064b96 100644 --- a/tests/integration/server/create-and-create-list-test.js +++ b/tests/integration/server/create-and-create-list-test.js @@ -41,7 +41,8 @@ module('Integration | Server | create and createList', function(hooks) { name: 'Yehuda' }), amazingContact: Factory - } + }, + inflector: Inflector.inflector }); this.server.timing = 0; this.server.logging = false; diff --git a/tests/unit/inflector-test.js b/tests/unit/inflector-test.js index 63263e599..06c0beb50 100644 --- a/tests/unit/inflector-test.js +++ b/tests/unit/inflector-test.js @@ -2,6 +2,10 @@ import { singularize, pluralize } from 'ember-cli-mirage/utils/inflector'; import {module, test} from 'qunit'; +/* + Keeping these tests here for now to avoid accidental breakage, but they are + definitely a Ember Mirage thing, not a Mirage thing. +*/ module('Unit | Inflector', function() { test('can singularize', function(assert) { assert.equal(singularize('tests'), 'test'); diff --git a/tests/unit/utils/normalize-name-test.js b/tests/unit/utils/normalize-name-test.js deleted file mode 100644 index f9853a0e8..000000000 --- a/tests/unit/utils/normalize-name-test.js +++ /dev/null @@ -1,26 +0,0 @@ -import { toCollectionName, toModelName } from 'ember-cli-mirage/utils/normalize-name'; -import Inflector from 'ember-inflector'; - -import {module, test} from 'qunit'; - -module('Unit | Normalize name', function() { - test('can convert Model name to DbCollection name', function(assert) { - assert.equal(toCollectionName('test'), 'tests'); - assert.equal(toCollectionName('hard-test'), 'hardTests'); - }); - - test('can convert DbCollection name to Model name', function(assert) { - assert.equal(toModelName('tests'), 'test'); - assert.equal(toModelName('hardTests'), 'hard-test'); - }); - - test('can convert Model name to DbCollection using custom inflector rules', function(assert) { - Inflector.inflector.irregular('head-of-state', 'heads-of-state'); - assert.equal(toCollectionName('head-of-state'), 'headsOfState'); - }); - - test('can convert DbCollection name to Model name using custom inflector rules', function(assert) { - Inflector.inflector.irregular('head-of-state', 'heads-of-state'); - assert.equal(toModelName('headsOfState'), 'head-of-state'); - }); -}); From 35652b0a94b98558e04113525f4b09fa136bf4a2 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 29 May 2019 15:18:57 -0400 Subject: [PATCH 455/879] Bump miragejs/server to 0.1.0 --- package.json | 2 +- yarn.lock | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 58c55db7d..4862dcebc 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "prepare": "./scripts/link.sh" }, "dependencies": { - "@miragejs/server": "git+https://github.com/asantos00/server.git#add-inflector-customization-api", + "@miragejs/server": "0.1.0", "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^2.0.1", "broccoli-merge-trees": "^3.0.2", diff --git a/yarn.lock b/yarn.lock index 99e82ea75..c9461e45b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1077,9 +1077,10 @@ dependencies: core-js "^2.5.7" -"@miragejs/server@git+https://github.com/asantos00/server.git#add-inflector-customization-api": - version "2.0.0-beta.4" - resolved "git+https://github.com/asantos00/server.git#cbff57c909fe46876f9178189281fd26e12d86fc" +"@miragejs/server@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.0.tgz#8205e4ee20d6e6a57d7ca54bc86c0bec0534f43f" + integrity sha512-b03eBi4I5K8ObJqqLWixwAtE3xK5goB/ooia27nB7FkAcHi7TXdhje0a5wvmRSLQzCFQCrZBPiz4xEE1vCQR7Q== dependencies: broccoli-file-creator "^2.1.1" broccoli-funnel "^2.0.1" From 1ca951bb5d30f5de9c89ba3592060190d2cdb3a6 Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Tue, 4 Jun 2019 03:22:10 +0100 Subject: [PATCH 456/879] Add packages to ember-cli-build --- ember-cli-build.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ember-cli-build.js b/ember-cli-build.js index 0e2af11de..06a038bad 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -7,11 +7,15 @@ module.exports = function(defaults) { // Add options here 'ember-cli-babel': { includePolyfill: true + }, + 'ember-cli-addon-docs': { + packages: ['./node_modules/@miragejs/server'] } }); /* This build file specifies the options for the dummy test app of this + addon, located in `/tests/dummy` This build file does *not* influence how the addon or the app using it behave. You most likely want to be modifying `./index.js` or app's build file From 078cc333e89a087cf794a03ed9bd8f2480b1b57e Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 11 Jun 2019 15:33:06 -0500 Subject: [PATCH 457/879] Fix issue with segaults during Travis builds (#1651) Full description of issue: https://github.com/ember-cli/ember-try/issues/360#issuecomment-500969714 --- package.json | 3 +++ yarn.lock | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 6b57eefbb..8fb0f70d8 100644 --- a/package.json +++ b/package.json @@ -100,6 +100,9 @@ "marked": "^0.6.0", "qunit-dom": "^0.8.4" }, + "resolutions": { + "favicons": "5.3.0" + }, "engines": { "node": "6.* || 8.* || >= 10.*" }, diff --git a/yarn.lock b/yarn.lock index f95986933..9ea3299ae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6925,7 +6925,7 @@ fastboot@^2.0.1: simple-dom "^1.4.0" source-map-support "^0.5.0" -favicons@^5.3.0: +favicons@5.3.0, favicons@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/favicons/-/favicons-5.3.0.tgz#ba4f826f147718ccf7e312f6f7ae23881ad1dfa6" integrity sha512-0uU+QToJ790J4X9ACR7AyNCxjoLsChC5mIm3P1TbVYrLlW3MQ6sv6DIxFpEyhnx7CzUP8ww7hpizWAel3Hr4Yw== From 830f8b7b2a09ff7c56bf448fd5bf08aabdcd4124 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" Date: Tue, 11 Jun 2019 20:35:28 +0000 Subject: [PATCH 458/879] build(deps-dev): bump ember-cli-favicon from 2.1.0 to 2.2.0 Bumps [ember-cli-favicon](https://github.com/davewasmer/ember-cli-favicon) from 2.1.0 to 2.2.0. - [Release notes](https://github.com/davewasmer/ember-cli-favicon/releases) - [Changelog](https://github.com/davewasmer/ember-cli-favicon/blob/master/CHANGELOG.md) - [Commits](https://github.com/davewasmer/ember-cli-favicon/compare/v2.1.0...v2.2.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 73 ++++++++++++++++--------------------------------------- 1 file changed, 21 insertions(+), 52 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9ea3299ae..3a6e6dfbd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2039,13 +2039,6 @@ babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-p dependencies: ember-rfc176-data "^0.3.8" -babel-plugin-ember-modules-api-polyfill@^2.7.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.9.0.tgz#8503e7b4192aeb336b00265e6235258ff6b754aa" - integrity sha512-c03h50291phJ2gQxo/aIOvFQE2c6glql1A7uagE3XbPXpKVAJOUxtVDjvWG6UAB6BC5ynsJfMWvY0w4TPRKIHQ== - dependencies: - ember-rfc176-data "^0.3.9" - babel-plugin-feature-flags@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/babel-plugin-feature-flags/-/babel-plugin-feature-flags-0.3.1.tgz#9c827cf9a4eb9a19f725ccb239e85cab02036fc1" @@ -2884,13 +2877,13 @@ broccoli-debug@^0.6.1, broccoli-debug@^0.6.4, broccoli-debug@^0.6.5: symlink-or-copy "^1.1.8" tree-sync "^1.2.2" -broccoli-favicon@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/broccoli-favicon/-/broccoli-favicon-2.1.0.tgz#d33ff792b32fc23c1dd5aaf53797cdd30fe9ef5e" - integrity sha512-J52Nx4ASfWbEkVwRoQ6NPWij7Id3QP/WskVn4hHbOPUOcjUGcfyDZrfOR6Y8U8tzCDT6KhpRP4SR7pjrmPWuOg== +broccoli-favicon@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/broccoli-favicon/-/broccoli-favicon-2.1.2.tgz#519449687c17602720496285f4e19c016155dead" + integrity sha512-Sg0d/eywB/jB8gu6VkTttGSLk2Czg3LR2dCZOYL4ufv9D9C985MrV0tUPaouvXKb+5up+g28BUqbGN8KWsbXng== dependencies: broccoli-caching-writer "3.0.3" - favicons "^5.3.0" + favicons "~5.3.0" heimdalljs-logger "~0.1.10" himalaya "1.1.0" lodash.merge "~4.6.1" @@ -3150,7 +3143,7 @@ broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli rimraf "^2.3.4" symlink-or-copy "^1.1.8" -broccoli-replace@0.12.0, broccoli-replace@^0.12.0: +broccoli-replace@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/broccoli-replace/-/broccoli-replace-0.12.0.tgz#36460a984c45c61731638c53068b0ab12ea8fdb7" integrity sha1-NkYKmExFxhcxY4xTBosKsS6o/bc= @@ -5069,12 +5062,14 @@ ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.0: resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.0.tgz#de3baedd093163b6c2461f95964888c1676325ac" integrity sha512-Zr4my8Xn+CzO0gIuFNXji0eTRml5AxZUTDQz/wsNJ5AJAtyFWCY4QtKdoELNNbiCVGt1lq5yLiwTm4scGKu6xA== -ember-cli-babel@7.5.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.5.0.tgz#af654dcef23630391d2efe85aaa3bdf8b6ca17b7" - integrity sha512-wWXqPPQNRxCtEHvYaLBNiIVgCVCy8YqZ0tM8Dpql1D5nGnPDbaK073sS1vlOYBP7xe5Ab2nXhvQkFwUxFacJ2g== +ember-cli-babel@7.7.3, ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.4.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.0, ember-cli-babel@^7.7.3: + version "7.7.3" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.7.3.tgz#f94709f6727583d18685ca6773a995877b87b8a0" + integrity sha512-/LWwyKIoSlZQ7k52P+6agC7AhcOBqPJ5C2u27qXHVVxKvCtg6ahNuRk/KmfZmV4zkuw4EjTZxfJE1PzpFyHkXg== dependencies: "@babel/core" "^7.0.0" + "@babel/plugin-proposal-class-properties" "^7.3.4" + "@babel/plugin-proposal-decorators" "^7.3.0" "@babel/plugin-transform-modules-amd" "^7.0.0" "@babel/plugin-transform-runtime" "^7.2.0" "@babel/polyfill" "^7.0.0" @@ -5082,13 +5077,14 @@ ember-cli-babel@7.5.0: "@babel/runtime" "^7.2.0" amd-name-resolver "^1.2.1" babel-plugin-debug-macros "^0.3.0" - babel-plugin-ember-modules-api-polyfill "^2.7.0" + babel-plugin-ember-modules-api-polyfill "^2.8.0" babel-plugin-module-resolver "^3.1.1" broccoli-babel-transpiler "^7.1.2" broccoli-debug "^0.6.4" broccoli-funnel "^2.0.1" broccoli-source "^1.1.0" clone "^2.1.2" + ember-cli-babel-plugin-helpers "^1.1.0" ember-cli-version-checker "^2.1.2" ensure-posix-path "^1.0.2" semver "^5.5.0" @@ -5112,33 +5108,6 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.4.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.0, ember-cli-babel@^7.7.3: - version "7.7.3" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.7.3.tgz#f94709f6727583d18685ca6773a995877b87b8a0" - integrity sha512-/LWwyKIoSlZQ7k52P+6agC7AhcOBqPJ5C2u27qXHVVxKvCtg6ahNuRk/KmfZmV4zkuw4EjTZxfJE1PzpFyHkXg== - dependencies: - "@babel/core" "^7.0.0" - "@babel/plugin-proposal-class-properties" "^7.3.4" - "@babel/plugin-proposal-decorators" "^7.3.0" - "@babel/plugin-transform-modules-amd" "^7.0.0" - "@babel/plugin-transform-runtime" "^7.2.0" - "@babel/polyfill" "^7.0.0" - "@babel/preset-env" "^7.0.0" - "@babel/runtime" "^7.2.0" - amd-name-resolver "^1.2.1" - babel-plugin-debug-macros "^0.3.0" - babel-plugin-ember-modules-api-polyfill "^2.8.0" - babel-plugin-module-resolver "^3.1.1" - broccoli-babel-transpiler "^7.1.2" - broccoli-debug "^0.6.4" - broccoli-funnel "^2.0.1" - broccoli-source "^1.1.0" - clone "^2.1.2" - ember-cli-babel-plugin-helpers "^1.1.0" - ember-cli-version-checker "^2.1.2" - ensure-posix-path "^1.0.2" - semver "^5.5.0" - ember-cli-broccoli-sane-watcher@^2.1.1: version "2.2.2" resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.2.2.tgz#9bb1b04ddeb2c086aecd8693cbaeca1d88dc160c" @@ -5273,14 +5242,14 @@ ember-cli-fastboot@^2.0.4: silent-error "^1.1.0" ember-cli-favicon@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ember-cli-favicon/-/ember-cli-favicon-2.1.0.tgz#90ae95a9d507c71d688c70d37df03e243cc2ca0a" - integrity sha512-6mHE6NeZHtm3rxQzKoLvHQangSbx58jnNkRWOXFiyAHggOTZIiFg638PIiYbOi1wozZ0hi+4qD37yWWdI9hiZQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/ember-cli-favicon/-/ember-cli-favicon-2.2.0.tgz#35ece16e5455d5f9a5c38a5baa00e7a44fc54807" + integrity sha512-RHiNb1vOu1MhtGuBorW/thM5BpxSGCJK1DZHj15JuZBZ7g4FngJMvtLGCBl+GmbChzWIMyEEZIUbIQrKUSiibQ== dependencies: - broccoli-favicon "~2.1.0" + broccoli-favicon "~2.1.1" broccoli-merge-trees "3.0.2" - broccoli-replace "0.12.0" - ember-cli-babel "7.5.0" + broccoli-string-replace "^0.1.2" + ember-cli-babel "7.7.3" lodash.merge "~4.6.1" ember-cli-get-component-path-option@^1.0.0: @@ -6925,7 +6894,7 @@ fastboot@^2.0.1: simple-dom "^1.4.0" source-map-support "^0.5.0" -favicons@5.3.0, favicons@^5.3.0: +favicons@5.3.0, favicons@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/favicons/-/favicons-5.3.0.tgz#ba4f826f147718ccf7e312f6f7ae23881ad1dfa6" integrity sha512-0uU+QToJ790J4X9ACR7AyNCxjoLsChC5mIm3P1TbVYrLlW3MQ6sv6DIxFpEyhnx7CzUP8ww7hpizWAel3Hr4Yw== From 2737fec9c0d0e043562bab9b20420c1a7328881c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" Date: Tue, 11 Jun 2019 21:17:51 +0000 Subject: [PATCH 459/879] build(deps-dev): bump ember-cli-fastboot from 2.0.4 to 2.1.1 Bumps [ember-cli-fastboot](https://github.com/ember-fastboot/ember-cli-fastboot) from 2.0.4 to 2.1.1. - [Release notes](https://github.com/ember-fastboot/ember-cli-fastboot/releases) - [Changelog](https://github.com/ember-fastboot/ember-cli-fastboot/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-fastboot/ember-cli-fastboot/compare/v2.0.4...v2.1.1) --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3a6e6dfbd..0be8879ae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5220,9 +5220,9 @@ ember-cli-eslint@^4.2.3: walk-sync "^0.3.0" ember-cli-fastboot@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/ember-cli-fastboot/-/ember-cli-fastboot-2.0.4.tgz#2aa4ecc87671f04078e3e1cb48684677bb2f26c5" - integrity sha512-5FYPXxcFIDdQFaXCcXAvv6Z4HwoNkqmoLRQRh/iMm/ajCJVuEWjbjaPuy+Cs0sAVuPYiJ1VVVkZDOieAhNNIrQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/ember-cli-fastboot/-/ember-cli-fastboot-2.1.1.tgz#3890e76f93a132d9eef189c78d18562b421594f2" + integrity sha512-qn3QcyDEbcc1/z2gPymwzTu3laSlou2WS3ZmUzlZz3wBi8WmIonzv5+i9ImjhPOP256MaIOnmdpSLi9QH45wbg== dependencies: broccoli-concat "^3.7.1" broccoli-funnel "^2.0.1" From 2ce98e714734a64c2f7c84aa67c0c83aeed0852d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" Date: Tue, 11 Jun 2019 21:18:02 +0000 Subject: [PATCH 460/879] build(deps-dev): bump @ember/jquery from 0.6.0 to 0.6.1 Bumps [@ember/jquery](https://github.com/emberjs/ember-jquery) from 0.6.0 to 0.6.1. - [Release notes](https://github.com/emberjs/ember-jquery/releases) - [Changelog](https://github.com/emberjs/ember-jquery/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember-jquery/compare/v0.6.0...v0.6.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3a6e6dfbd..99567f807 100644 --- a/yarn.lock +++ b/yarn.lock @@ -696,16 +696,16 @@ to-fast-properties "^2.0.0" "@ember/jquery@^0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@ember/jquery/-/jquery-0.6.0.tgz#5fe9d39b15c9d47fe495302b2a6176059a6267cd" - integrity sha512-O81+JslKE7bsV+5wrhXEmBU1Bpte2u9bm6MLIoRYePvWDo50l7llDW1RM38l1KkeSj/s7iXTsviZ4uunhIcKow== + version "0.6.1" + resolved "https://registry.yarnpkg.com/@ember/jquery/-/jquery-0.6.1.tgz#eef89ebc8d7b49bddc176f2a646746c8f5d93978" + integrity sha512-XMgfUYag97YOYLsC0Ys4/H6mHO2U2wra/92eVIug+5eYBloYSDhv2MY/iq/ocwXVSB2dQaphJx5pFXqdrjEzWQ== dependencies: - broccoli-funnel "^2.0.1" + broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.2" - ember-cli-babel "^7.4.0" - ember-cli-version-checker "^3.0.0" - jquery "^3.3.1" - resolve "^1.10.0" + ember-cli-babel "^7.7.3" + ember-cli-version-checker "^3.1.3" + jquery "^3.4.1" + resolve "^1.11.1" "@ember/optional-features@^0.7.0": version "0.7.0" @@ -5062,7 +5062,7 @@ ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.0: resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.0.tgz#de3baedd093163b6c2461f95964888c1676325ac" integrity sha512-Zr4my8Xn+CzO0gIuFNXji0eTRml5AxZUTDQz/wsNJ5AJAtyFWCY4QtKdoELNNbiCVGt1lq5yLiwTm4scGKu6xA== -ember-cli-babel@7.7.3, ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.4.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.0, ember-cli-babel@^7.7.3: +ember-cli-babel@7.7.3, ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.0, ember-cli-babel@^7.7.3: version "7.7.3" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.7.3.tgz#f94709f6727583d18685ca6773a995877b87b8a0" integrity sha512-/LWwyKIoSlZQ7k52P+6agC7AhcOBqPJ5C2u27qXHVVxKvCtg6ahNuRk/KmfZmV4zkuw4EjTZxfJE1PzpFyHkXg== @@ -8756,10 +8756,10 @@ jquery-deferred@^0.3.0: resolved "https://registry.yarnpkg.com/jquery-deferred/-/jquery-deferred-0.3.1.tgz#596eca1caaff54f61b110962b23cafea74c35355" integrity sha1-WW7KHKr/VPYbEQlisjyv6nTDU1U= -jquery@^3.3.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.0.tgz#8de513fa0fa4b2c7d2e48a530e26f0596936efdf" - integrity sha512-ggRCXln9zEqv6OqAGXFEcshF5dSBvCkzj6Gm2gzuR5fWawaX8t7cxKVkkygKODrDAzKdoYw3l/e3pm3vlT4IbQ== +jquery@^3.3.1, jquery@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2" + integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw== js-base64@^2.1.9: version "2.4.8" @@ -12128,10 +12128,10 @@ resolve@1.5.0: dependencies: path-parse "^1.0.5" -resolve@^1.1.3, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.1.tgz#664842ac960795bbe758221cdccda61fb64b5f18" - integrity sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA== +resolve@^1.1.3, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" + integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== dependencies: path-parse "^1.0.6" From 892ccca3e646def6a881b2f0b908be9f50172203 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 12 Jun 2019 00:30:56 -0400 Subject: [PATCH 461/879] Add @miragejs/server to API docs --- ember-cli-build.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ember-cli-build.js b/ember-cli-build.js index 06a038bad..cfb1a3224 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -8,8 +8,8 @@ module.exports = function(defaults) { 'ember-cli-babel': { includePolyfill: true }, - 'ember-cli-addon-docs': { - packages: ['./node_modules/@miragejs/server'] + 'ember-cli-addon-docs-esdoc': { + packages: [ 'ember-cli-mirage', '@miragejs/server' ] } }); From ec88446b5a5d2e167ba99aa37b473f08333158bb Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 12 Jun 2019 00:50:42 -0400 Subject: [PATCH 462/879] Bump @miragejs/server --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4862dcebc..854741f7a 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "prepare": "./scripts/link.sh" }, "dependencies": { - "@miragejs/server": "0.1.0", + "@miragejs/server": "0.1.1", "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^2.0.1", "broccoli-merge-trees": "^3.0.2", From 0ac317f09f645509cd099d499c12526d759ea630 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 12 Jun 2019 06:51:58 -0400 Subject: [PATCH 463/879] Bump -esdoc addon --- package.json | 2 +- yarn.lock | 23 +++++++++++++++-------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 854741f7a..becb4bddf 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "ember-ajax": "^5.0.0", "ember-cli": "~3.4.4", "ember-cli-addon-docs": "^0.6.4", - "ember-cli-addon-docs-esdoc": "^0.2.1", + "ember-cli-addon-docs-esdoc": "ember-learn/ember-cli-addon-docs-esdoc#518e12930cdcbaed31b5d260ece3aa09cc71bb33", "ember-cli-app-version": "^3.2.0", "ember-cli-dependency-checker": "^3.0.0", "ember-cli-deploy": "^1.0.2", diff --git a/yarn.lock b/yarn.lock index c9461e45b..b7bdb67c4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1077,10 +1077,10 @@ dependencies: core-js "^2.5.7" -"@miragejs/server@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.0.tgz#8205e4ee20d6e6a57d7ca54bc86c0bec0534f43f" - integrity sha512-b03eBi4I5K8ObJqqLWixwAtE3xK5goB/ooia27nB7FkAcHi7TXdhje0a5wvmRSLQzCFQCrZBPiz4xEE1vCQR7Q== +"@miragejs/server@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.1.tgz#b88102e5f48bd3b28169fc04e951a5df7e099062" + integrity sha512-dKFRBWlojJtnq+xGyce2jBwMh+NJyvge5jhWGMzAT5N83x5zNvcAkE8qDhY9Z0ZsAj6ODGWQvkHjPLsAWdT4UA== dependencies: broccoli-file-creator "^2.1.1" broccoli-funnel "^2.0.1" @@ -4984,10 +4984,9 @@ ember-auto-import@^1.2.19: walk-sync "^0.3.3" webpack "~4.28" -ember-cli-addon-docs-esdoc@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ember-cli-addon-docs-esdoc/-/ember-cli-addon-docs-esdoc-0.2.1.tgz#fcb2f1792f1bd4d6a5df8205f7b6e555abbcd1b9" - integrity sha512-iDPMhxB68whOV4veW89TAOFBPU4g2ysP9y+Jn1Ic0+37N7LqOULas/FF4KxbhB+dUr5V5pW3txULeeLVcx5kYQ== +ember-cli-addon-docs-esdoc@ember-learn/ember-cli-addon-docs-esdoc#518e12930cdcbaed31b5d260ece3aa09cc71bb33: + version "0.2.2" + resolved "https://codeload.github.com/ember-learn/ember-cli-addon-docs-esdoc/tar.gz/518e12930cdcbaed31b5d260ece3aa09cc71bb33" dependencies: broccoli-caching-writer "^3.0.3" ember-cli-babel "^6.6.0" @@ -4997,6 +4996,7 @@ ember-cli-addon-docs-esdoc@^0.2.1: fs-extra "^5.0.0" json-api-serializer "^1.11.0" lodash "^4.17.5" + resolve "^1.11.1" tmp "^0.0.33" walk-sync "^0.3.2" @@ -12184,6 +12184,13 @@ resolve@^1.1.3, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1 dependencies: path-parse "^1.0.6" +resolve@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" + integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== + dependencies: + path-parse "^1.0.6" + responselike@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" From 79597dcb6e996c110f63da9c00b1ae55d97ffd2d Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 12 Jun 2019 07:14:27 -0400 Subject: [PATCH 464/879] Bump miragejs/server --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index becb4bddf..052bf20d5 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "prepare": "./scripts/link.sh" }, "dependencies": { - "@miragejs/server": "0.1.1", + "@miragejs/server": "0.1.2", "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^2.0.1", "broccoli-merge-trees": "^3.0.2", diff --git a/yarn.lock b/yarn.lock index b7bdb67c4..79d31559b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1077,10 +1077,10 @@ dependencies: core-js "^2.5.7" -"@miragejs/server@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.1.tgz#b88102e5f48bd3b28169fc04e951a5df7e099062" - integrity sha512-dKFRBWlojJtnq+xGyce2jBwMh+NJyvge5jhWGMzAT5N83x5zNvcAkE8qDhY9Z0ZsAj6ODGWQvkHjPLsAWdT4UA== +"@miragejs/server@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.2.tgz#ed3dc7b363ae024a16574c0e5df535acba3ca276" + integrity sha512-JJQErnn7cQPNsC2aDn1TK2VBqcb5+5DhIQKECBujVj/VE1nMG8pwPKUcSItnY6NTfksM1u3DiNDOzI9DigxqzA== dependencies: broccoli-file-creator "^2.1.1" broccoli-funnel "^2.0.1" From c91c6cc43d3e0bf711b010bcadfe40fdeb2ec4ce Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 12 Jun 2019 14:56:14 -0400 Subject: [PATCH 465/879] Set showImportPaths to false --- ember-cli-build.js | 10 ++++------ tests/dummy/config/environment.js | 4 ++++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/ember-cli-build.js b/ember-cli-build.js index cfb1a3224..d09ce8d37 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -4,7 +4,6 @@ const EmberAddon = require('ember-cli/lib/broccoli/ember-addon'); module.exports = function(defaults) { let app = new EmberAddon(defaults, { - // Add options here 'ember-cli-babel': { includePolyfill: true }, @@ -14,11 +13,10 @@ module.exports = function(defaults) { }); /* - This build file specifies the options for the dummy test app of this - - addon, located in `/tests/dummy` - This build file does *not* influence how the addon or the app using it - behave. You most likely want to be modifying `./index.js` or app's build file + This build file specifies the options for the dummy test app of this addon, + located in `/tests/dummy`. This build file does *not* influence how the addon + or the app using it behave. You most likely want to be modifying `./index.js` + or app's build file. */ return app.toTree(); diff --git a/tests/dummy/config/environment.js b/tests/dummy/config/environment.js index f7d62f698..9379c0920 100644 --- a/tests/dummy/config/environment.js +++ b/tests/dummy/config/environment.js @@ -21,6 +21,10 @@ module.exports = function(environment) { APP: { // Here you can pass flags/options to your application instance // when it is created + }, + + 'ember-cli-addon-docs': { + showImportPaths: false } }; From 6336351ace321c15a71f528407d1b03bf0fc693c Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 12 Jun 2019 14:59:15 -0400 Subject: [PATCH 466/879] Bump -esdoc --- package.json | 2 +- yarn.lock | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 052bf20d5..cd9673c47 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "ember-ajax": "^5.0.0", "ember-cli": "~3.4.4", "ember-cli-addon-docs": "^0.6.4", - "ember-cli-addon-docs-esdoc": "ember-learn/ember-cli-addon-docs-esdoc#518e12930cdcbaed31b5d260ece3aa09cc71bb33", + "ember-cli-addon-docs-esdoc": "^0.2.2", "ember-cli-app-version": "^3.2.0", "ember-cli-dependency-checker": "^3.0.0", "ember-cli-deploy": "^1.0.2", diff --git a/yarn.lock b/yarn.lock index 79d31559b..583f67b54 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4984,9 +4984,10 @@ ember-auto-import@^1.2.19: walk-sync "^0.3.3" webpack "~4.28" -ember-cli-addon-docs-esdoc@ember-learn/ember-cli-addon-docs-esdoc#518e12930cdcbaed31b5d260ece3aa09cc71bb33: +ember-cli-addon-docs-esdoc@^0.2.2: version "0.2.2" - resolved "https://codeload.github.com/ember-learn/ember-cli-addon-docs-esdoc/tar.gz/518e12930cdcbaed31b5d260ece3aa09cc71bb33" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs-esdoc/-/ember-cli-addon-docs-esdoc-0.2.2.tgz#c430392c38b321f7cbbb8b328969b056ee318751" + integrity sha512-DcvyMRBPbhMYadgGFCCcifTrcO4NPj/yp3woZgd35gkD0hTTK0tvDFld90GK+8kcB6BQmx8IcCKoc0osQpTMug== dependencies: broccoli-caching-writer "^3.0.3" ember-cli-babel "^6.6.0" From 17bba66e161297f42d15b58192df14dcb142a289 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 12 Jun 2019 16:53:50 -0400 Subject: [PATCH 467/879] Bump addon-docs --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index cd9673c47..a6a24c83a 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "chai": "^4.1.0", "ember-ajax": "^5.0.0", "ember-cli": "~3.4.4", - "ember-cli-addon-docs": "^0.6.4", + "ember-cli-addon-docs": "^0.6.13", "ember-cli-addon-docs-esdoc": "^0.2.2", "ember-cli-app-version": "^3.2.0", "ember-cli-dependency-checker": "^3.0.0", diff --git a/yarn.lock b/yarn.lock index 583f67b54..108c58936 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5001,10 +5001,10 @@ ember-cli-addon-docs-esdoc@^0.2.2: tmp "^0.0.33" walk-sync "^0.3.2" -ember-cli-addon-docs@^0.6.4: - version "0.6.12" - resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.12.tgz#5dcd5c2fd527720e90a43f6aa241c59e2e69568e" - integrity sha512-uBGW7b3BvvTrVyZSdHSysFQj8ONjKnN7GL09OpH2DBcpNVv9Pi8NT8M7hb/BdXzPe5tirqMtpjCKHZaRIt6DVA== +ember-cli-addon-docs@^0.6.13: + version "0.6.13" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.13.tgz#84bb96ea30f63adc16f8bf3eb08f12c68fbd14f0" + integrity sha512-K3emQn7WWTYAktUKSG2zTT/U53aXjO5KllvGZDg2LURweCe1YQ/turRww9sx+6CQcxU1oGNujGHpUxnyEGEPTA== dependencies: "@glimmer/syntax" "^0.36.4" broccoli-bridge "^1.0.0" @@ -5020,10 +5020,10 @@ ember-cli-addon-docs@^0.6.4: chalk "^2.4.2" ember-auto-import "^1.2.19" ember-cli-autoprefixer "^0.8.1" - ember-cli-babel "^6.16.0" + ember-cli-babel "^7.7.3" ember-cli-clipboard "^0.11.1" - ember-cli-htmlbars "^3.0.0" - ember-cli-htmlbars-inline-precompile "^1.0.3" + ember-cli-htmlbars "^3.0.1" + ember-cli-htmlbars-inline-precompile "^2.1.0" ember-cli-sass "10.0.0" ember-cli-string-helpers "^1.9.0" ember-cli-string-utils "^1.1.0" @@ -5307,7 +5307,7 @@ ember-cli-get-component-path-option@^1.0.0: resolved "https://registry.yarnpkg.com/ember-cli-get-component-path-option/-/ember-cli-get-component-path-option-1.0.0.tgz#0d7b595559e2f9050abed804f1d8eff1b08bc771" integrity sha1-DXtZVVni+QUKvtgE8djv8bCLx3E= -ember-cli-htmlbars-inline-precompile@^1.0.0, ember-cli-htmlbars-inline-precompile@^1.0.3: +ember-cli-htmlbars-inline-precompile@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-1.0.5.tgz#312e050c9e3dd301c55fb399fd706296cd0b1d6a" integrity sha512-/CNEqPxroIcbY6qejrt704ZaghHLCntZKYLizFfJ2esirXoJx6fuYKBY1YyJ8GOgjfbHHKjBZuK4vFFJpkGqkQ== @@ -5339,7 +5339,7 @@ ember-cli-htmlbars@^2.0.1, ember-cli-htmlbars@^2.0.2: json-stable-stringify "^1.0.0" strip-bom "^3.0.0" -ember-cli-htmlbars@^3.0.0: +ember-cli-htmlbars@^3.0.0, ember-cli-htmlbars@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-3.0.1.tgz#01e21f0fd05e0a6489154f26614b1041769e3e58" integrity sha512-pyyB2s52vKTXDC5svU3IjU7GRLg2+5O81o9Ui0ZSiBS14US/bZl46H2dwcdSJAK+T+Za36ZkQM9eh1rNwOxfoA== From a63e98ee165891db0fefce9adf1158c4f61787b0 Mon Sep 17 00:00:00 2001 From: Jonas Brusman Date: Thu, 13 Jun 2019 12:52:17 +0200 Subject: [PATCH 468/879] docs: Correct yarn command in the upgrade guide (#1652) --- .../app/pods/docs/getting-started/upgrade-guide/template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md b/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md index 539fcf9db..3fe4f400e 100644 --- a/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md +++ b/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md @@ -7,7 +7,7 @@ If you're upgrading from an existing version of Mirage, you can run the followin npm install -D ember-cli-mirage@X.X.X # Using yarn -yarn install -D ember-cli-mirage@X.X.X +yarn add -D ember-cli-mirage@X.X.X ``` From 6e1f1a46ade9345eb9552dc6bb86740cd9369b04 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" Date: Thu, 13 Jun 2019 12:43:17 +0000 Subject: [PATCH 469/879] build(deps-dev): bump ember-cli-addon-docs from 0.6.12 to 0.6.13 Bumps [ember-cli-addon-docs](https://github.com/ember-learn/ember-cli-addon-docs) from 0.6.12 to 0.6.13. - [Release notes](https://github.com/ember-learn/ember-cli-addon-docs/releases) - [Changelog](https://github.com/ember-learn/ember-cli-addon-docs/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-learn/ember-cli-addon-docs/compare/v0.6.12...v0.6.13) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index 049baf54a..d7121e60c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4976,9 +4976,9 @@ ember-cli-addon-docs-esdoc@^0.2.1: walk-sync "^0.3.2" ember-cli-addon-docs@^0.6.4: - version "0.6.12" - resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.12.tgz#5dcd5c2fd527720e90a43f6aa241c59e2e69568e" - integrity sha512-uBGW7b3BvvTrVyZSdHSysFQj8ONjKnN7GL09OpH2DBcpNVv9Pi8NT8M7hb/BdXzPe5tirqMtpjCKHZaRIt6DVA== + version "0.6.13" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.13.tgz#84bb96ea30f63adc16f8bf3eb08f12c68fbd14f0" + integrity sha512-K3emQn7WWTYAktUKSG2zTT/U53aXjO5KllvGZDg2LURweCe1YQ/turRww9sx+6CQcxU1oGNujGHpUxnyEGEPTA== dependencies: "@glimmer/syntax" "^0.36.4" broccoli-bridge "^1.0.0" @@ -4994,10 +4994,10 @@ ember-cli-addon-docs@^0.6.4: chalk "^2.4.2" ember-auto-import "^1.2.19" ember-cli-autoprefixer "^0.8.1" - ember-cli-babel "^6.16.0" + ember-cli-babel "^7.7.3" ember-cli-clipboard "^0.11.1" - ember-cli-htmlbars "^3.0.0" - ember-cli-htmlbars-inline-precompile "^1.0.3" + ember-cli-htmlbars "^3.0.1" + ember-cli-htmlbars-inline-precompile "^2.1.0" ember-cli-sass "10.0.0" ember-cli-string-helpers "^1.9.0" ember-cli-string-utils "^1.1.0" @@ -5257,7 +5257,7 @@ ember-cli-get-component-path-option@^1.0.0: resolved "https://registry.yarnpkg.com/ember-cli-get-component-path-option/-/ember-cli-get-component-path-option-1.0.0.tgz#0d7b595559e2f9050abed804f1d8eff1b08bc771" integrity sha1-DXtZVVni+QUKvtgE8djv8bCLx3E= -ember-cli-htmlbars-inline-precompile@^1.0.0, ember-cli-htmlbars-inline-precompile@^1.0.3: +ember-cli-htmlbars-inline-precompile@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-1.0.5.tgz#312e050c9e3dd301c55fb399fd706296cd0b1d6a" integrity sha512-/CNEqPxroIcbY6qejrt704ZaghHLCntZKYLizFfJ2esirXoJx6fuYKBY1YyJ8GOgjfbHHKjBZuK4vFFJpkGqkQ== @@ -5289,7 +5289,7 @@ ember-cli-htmlbars@^2.0.1, ember-cli-htmlbars@^2.0.2: json-stable-stringify "^1.0.0" strip-bom "^3.0.0" -ember-cli-htmlbars@^3.0.0: +ember-cli-htmlbars@^3.0.0, ember-cli-htmlbars@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-3.0.1.tgz#01e21f0fd05e0a6489154f26614b1041769e3e58" integrity sha512-pyyB2s52vKTXDC5svU3IjU7GRLg2+5O81o9Ui0ZSiBS14US/bZl46H2dwcdSJAK+T+Za36ZkQM9eh1rNwOxfoA== From b9feb3de39f2204fceaf3ca1e892c15fdaac2eaa Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" Date: Thu, 13 Jun 2019 13:14:14 +0000 Subject: [PATCH 470/879] build(deps): bump ember-auto-import from 1.3.0 to 1.4.0 Bumps [ember-auto-import](https://github.com/ef4/ember-auto-import) from 1.3.0 to 1.4.0. - [Release notes](https://github.com/ef4/ember-auto-import/releases) - [Changelog](https://github.com/ef4/ember-auto-import/blob/master/CHANGELOG.md) - [Commits](https://github.com/ef4/ember-auto-import/compare/v1.3.0...v1.4.0) --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index d7121e60c..cfe92cf5c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4930,9 +4930,9 @@ ember-assign-polyfill@~2.4.0: ember-cli-version-checker "^2.0.0" ember-auto-import@^1.2.19: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.3.0.tgz#0d0988790e60847315f9bba758299226a3ba75c6" - integrity sha512-Fiw0lVSdARFI6/ewq7zDPmfC6+Ss+qIV6Xp0iwhlJOPa6HP1KpNodPXBnmzppMdnGMsnT72YdMgPbVXsyWMu8A== + version "1.4.0" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.4.0.tgz#9fee23cfe050e2221626ebb5ca30a91b03926064" + integrity sha512-3OK37rFEQT3e0mjl1v7L3HHd9w0dWD+JqDjTnQFRNT0uhTeD2lq8k30r3w6HYtvJ1ish57ChdfxBLgGib8MTiA== dependencies: "@babel/core" "^7.1.6" "@babel/traverse" "^7.1.6" From b159f3bada8bfd598c50d5ff59183014699b4bf5 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" Date: Thu, 13 Jun 2019 13:14:30 +0000 Subject: [PATCH 471/879] build(deps-dev): bump ember-cli-addon-docs-esdoc from 0.2.1 to 0.2.2 Bumps [ember-cli-addon-docs-esdoc](https://github.com/ember-learn/ember-cli-addon-docs-esdoc) from 0.2.1 to 0.2.2. - [Release notes](https://github.com/ember-learn/ember-cli-addon-docs-esdoc/releases) - [Commits](https://github.com/ember-learn/ember-cli-addon-docs-esdoc/compare/v0.2.1...v0.2.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/yarn.lock b/yarn.lock index d7121e60c..33e0e76cc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4960,18 +4960,19 @@ ember-auto-import@^1.2.19: webpack "~4.28" ember-cli-addon-docs-esdoc@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ember-cli-addon-docs-esdoc/-/ember-cli-addon-docs-esdoc-0.2.1.tgz#fcb2f1792f1bd4d6a5df8205f7b6e555abbcd1b9" - integrity sha512-iDPMhxB68whOV4veW89TAOFBPU4g2ysP9y+Jn1Ic0+37N7LqOULas/FF4KxbhB+dUr5V5pW3txULeeLVcx5kYQ== + version "0.2.2" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs-esdoc/-/ember-cli-addon-docs-esdoc-0.2.2.tgz#c430392c38b321f7cbbb8b328969b056ee318751" + integrity sha512-DcvyMRBPbhMYadgGFCCcifTrcO4NPj/yp3woZgd35gkD0hTTK0tvDFld90GK+8kcB6BQmx8IcCKoc0osQpTMug== dependencies: broccoli-caching-writer "^3.0.3" ember-cli-babel "^6.6.0" - esdoc pzuraq/esdoc#015a342 + esdoc "github:pzuraq/esdoc#015a342" esdoc-accessor-plugin "^1.0.0" esdoc-ecmascript-proposal-plugin "^1.0.0" fs-extra "^5.0.0" json-api-serializer "^1.11.0" lodash "^4.17.5" + resolve "^1.11.1" tmp "^0.0.33" walk-sync "^0.3.2" @@ -6257,8 +6258,9 @@ esdoc-ecmascript-proposal-plugin@^1.0.0: resolved "https://registry.yarnpkg.com/esdoc-ecmascript-proposal-plugin/-/esdoc-ecmascript-proposal-plugin-1.0.0.tgz#390dc5656ba8a2830e39dba3570d79138df2ffd9" integrity sha1-OQ3FZWuoooMOOdujVw15E43y/9k= -esdoc@pzuraq/esdoc#015a342: +"esdoc@github:pzuraq/esdoc#015a342": version "1.0.4" + uid "015a3426b2e53b2b0270a9c00133780db3f1d144" resolved "https://codeload.github.com/pzuraq/esdoc/tar.gz/015a3426b2e53b2b0270a9c00133780db3f1d144" dependencies: babel-generator "6.26.0" From d6dc4c87c9518be2380b9c35c42387c6a75a3d42 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" Date: Fri, 14 Jun 2019 14:25:40 +0000 Subject: [PATCH 472/879] build(deps): bump ember-auto-import from 1.4.0 to 1.4.1 Bumps [ember-auto-import](https://github.com/ef4/ember-auto-import) from 1.4.0 to 1.4.1. - [Release notes](https://github.com/ef4/ember-auto-import/releases) - [Changelog](https://github.com/ef4/ember-auto-import/blob/master/CHANGELOG.md) - [Commits](https://github.com/ef4/ember-auto-import/compare/v1.4.0...v1.4.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 60e68132e..7b4e7d8d6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4930,9 +4930,9 @@ ember-assign-polyfill@~2.4.0: ember-cli-version-checker "^2.0.0" ember-auto-import@^1.2.19: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.4.0.tgz#9fee23cfe050e2221626ebb5ca30a91b03926064" - integrity sha512-3OK37rFEQT3e0mjl1v7L3HHd9w0dWD+JqDjTnQFRNT0uhTeD2lq8k30r3w6HYtvJ1ish57ChdfxBLgGib8MTiA== + version "1.4.1" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.4.1.tgz#a2a602168f1446422e8ef8a8431667bb771b35c1" + integrity sha512-n1D0Xom6eWbg156lXAqSprf8RK85PLmCQj1Q8eUNHq7lhfFizYnwQ7ODcTJy6MR4/xrtim+SnfPHd6f3FFHtDQ== dependencies: "@babel/core" "^7.1.6" "@babel/traverse" "^7.1.6" From 04dc5c367904f232fe90bb3c0eb1c343abbee888 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" Date: Mon, 17 Jun 2019 15:47:49 +0000 Subject: [PATCH 473/879] build(deps-dev): bump eslint-plugin-ember from 6.4.1 to 6.6.0 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 6.4.1 to 6.6.0. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v6.4.1...v6.6.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 7b4e7d8d6..42fc2cc85 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6283,9 +6283,9 @@ eslint-plugin-ember-suave@^1.0.0: requireindex "~1.1.0" eslint-plugin-ember@^6.2.0: - version "6.4.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-6.4.1.tgz#9b6fc99bbd86b4f43e9098a5c07c446eb2e64a08" - integrity sha512-eNzB3t/S4tR+4OhOucufIWs1UUzftxYrk97L7yErz5ETVXht6nEenV7T9FXt+wB2OBMWnlHvCeaSyhhaAR1DBw== + version "6.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-6.6.0.tgz#fa64f0e9fbbe14ae44478b5fa3890fb74d720e5e" + integrity sha512-vqRAyGMtuohMe+cnxiPYIF73gC2Rlei0GX/TAAAIXIJH8E98TFQkOHAhzF6u/6l6W5XRVuTKOlXyPJzRY+kJwQ== dependencies: ember-rfc176-data "^0.3.9" snake-case "^2.1.0" From 09184c77009b5cc10e8c716b2d0ac0fb59e6d2c2 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" Date: Tue, 18 Jun 2019 13:04:11 +0000 Subject: [PATCH 474/879] build(deps): bump ember-cli-babel from 7.7.3 to 7.8.0 Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 7.7.3 to 7.8.0. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v7.7.3...v7.8.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/yarn.lock b/yarn.lock index 42fc2cc85..490178c9e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2032,12 +2032,12 @@ babel-plugin-debug-macros@^0.3.0: dependencies: semver "^5.3.0" -babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-polyfill@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.8.0.tgz#70244800f750bf1c9f380910c1b2eed1db80ab4a" - integrity sha512-3dlBH92qx8so2pRoks73+gwnuX97d0ajirOr96GwTZMnZxFzVR02c/PQbKWBcxpPqoL8CJSE2onuWM8PWezhOQ== +babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-polyfill@^2.8.0, babel-plugin-ember-modules-api-polyfill@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.9.0.tgz#8503e7b4192aeb336b00265e6235258ff6b754aa" + integrity sha512-c03h50291phJ2gQxo/aIOvFQE2c6glql1A7uagE3XbPXpKVAJOUxtVDjvWG6UAB6BC5ynsJfMWvY0w4TPRKIHQ== dependencies: - ember-rfc176-data "^0.3.8" + ember-rfc176-data "^0.3.9" babel-plugin-feature-flags@^0.3.1: version "0.3.1" @@ -5063,7 +5063,7 @@ ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.0: resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.0.tgz#de3baedd093163b6c2461f95964888c1676325ac" integrity sha512-Zr4my8Xn+CzO0gIuFNXji0eTRml5AxZUTDQz/wsNJ5AJAtyFWCY4QtKdoELNNbiCVGt1lq5yLiwTm4scGKu6xA== -ember-cli-babel@7.7.3, ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.0, ember-cli-babel@^7.7.3: +ember-cli-babel@7.7.3: version "7.7.3" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.7.3.tgz#f94709f6727583d18685ca6773a995877b87b8a0" integrity sha512-/LWwyKIoSlZQ7k52P+6agC7AhcOBqPJ5C2u27qXHVVxKvCtg6ahNuRk/KmfZmV4zkuw4EjTZxfJE1PzpFyHkXg== @@ -5109,6 +5109,33 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be ember-cli-version-checker "^2.1.2" semver "^5.5.0" +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.0, ember-cli-babel@^7.7.3: + version "7.8.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.8.0.tgz#e596500eca0f5a7c9aaee755f803d1542f578acf" + integrity sha512-xUBgJQ81fqd7k/KIiGU+pjpoXhrmmRf9pUrqLenNSU5N+yeNFT5a1+w0b+p1F7oBphfXVwuxApdZxrmAHOdA3Q== + dependencies: + "@babel/core" "^7.0.0" + "@babel/plugin-proposal-class-properties" "^7.3.4" + "@babel/plugin-proposal-decorators" "^7.3.0" + "@babel/plugin-transform-modules-amd" "^7.0.0" + "@babel/plugin-transform-runtime" "^7.2.0" + "@babel/polyfill" "^7.0.0" + "@babel/preset-env" "^7.0.0" + "@babel/runtime" "^7.2.0" + amd-name-resolver "^1.2.1" + babel-plugin-debug-macros "^0.3.0" + babel-plugin-ember-modules-api-polyfill "^2.9.0" + babel-plugin-module-resolver "^3.1.1" + broccoli-babel-transpiler "^7.1.2" + broccoli-debug "^0.6.4" + broccoli-funnel "^2.0.1" + broccoli-source "^1.1.0" + clone "^2.1.2" + ember-cli-babel-plugin-helpers "^1.1.0" + ember-cli-version-checker "^2.1.2" + ensure-posix-path "^1.0.2" + semver "^5.5.0" + ember-cli-broccoli-sane-watcher@^2.1.1: version "2.2.2" resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.2.2.tgz#9bb1b04ddeb2c086aecd8693cbaeca1d88dc160c" @@ -5921,7 +5948,7 @@ ember-responsive@^3.0.1: dependencies: ember-cli-babel "^6.6.0" -ember-rfc176-data@^0.3.8, ember-rfc176-data@^0.3.9: +ember-rfc176-data@^0.3.9: version "0.3.9" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.9.tgz#44b6e051ead6c044ea87bd551f402e2cf89a7e3d" integrity sha512-EiTo5YQS0Duy0xp9gCP8ekzv9vxirNi7MnIB4zWs+thtWp/mEKgf5mkiiLU2+oo8C5DuavVHhoPQDmyxh8Io1Q== From 593bf56a31ef1f98d47065b56842caa117b3dc3d Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 18 Jun 2019 11:19:15 -0400 Subject: [PATCH 475/879] =?UTF-8?q?Actually=20run=2001-basic-app=20test=20?= =?UTF-8?q?suite=20=F0=9F=A4=A6=E2=80=8D=E2=99=82=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/test.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/test.sh b/scripts/test.sh index b74ba5b33..8f73ba394 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -2,5 +2,6 @@ ./scripts/parallel --tag < Date: Tue, 18 Jun 2019 11:27:06 -0400 Subject: [PATCH 476/879] Actually run test project tests --- scripts/test.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/test.sh b/scripts/test.sh index b74ba5b33..8f73ba394 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -2,5 +2,6 @@ ./scripts/parallel --tag < Date: Tue, 18 Jun 2019 13:41:15 -0400 Subject: [PATCH 477/879] Fix test projects (#1659) --- .node-version | 1 + package.json | 4 ++-- test-projects/01-basic-app/package.json | 5 +++-- yarn.lock | 16 ++++++++++++---- 4 files changed, 18 insertions(+), 8 deletions(-) create mode 100644 .node-version diff --git a/.node-version b/.node-version new file mode 100644 index 000000000..894aa0bc6 --- /dev/null +++ b/.node-version @@ -0,0 +1 @@ +8.16.0 diff --git a/package.json b/package.json index 8fb0f70d8..ce1a3d35c 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "ember-disable-prototype-extensions": "^1.1.3", "ember-export-application-global": "^2.0.0", "ember-load-initializers": "^2.0.0", - "ember-maybe-import-regenerator": "^0.1.6", + "ember-maybe-import-regenerator-for-testing": "^1.0.0", "ember-moment": "^7.8.1", "ember-resolver": "^5.0.1", "ember-source": "~3.10.0", @@ -101,7 +101,7 @@ "qunit-dom": "^0.8.4" }, "resolutions": { - "favicons": "5.3.0" + "favicons": "5.3.0" }, "engines": { "node": "6.* || 8.* || >= 10.*" diff --git a/test-projects/01-basic-app/package.json b/test-projects/01-basic-app/package.json index ee3f282c8..6dc242131 100644 --- a/test-projects/01-basic-app/package.json +++ b/test-projects/01-basic-app/package.json @@ -37,15 +37,16 @@ "ember-data": "*", "ember-export-application-global": "*", "ember-load-initializers": "*", + "ember-maybe-import-regenerator-for-testing": "*", "ember-resolver": "*", "ember-source": "*", "eslint-plugin-ember": "*", + "faker": "*", "fastboot": "*", "jsdom": "*", "loader.js": "*", "qunit": "*", - "qunit-dom": "*", - "faker": "*" + "qunit-dom": "*" }, "engines": { "node": ">= 8.*" diff --git a/yarn.lock b/yarn.lock index 490178c9e..1918ebb91 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4966,7 +4966,7 @@ ember-cli-addon-docs-esdoc@^0.2.1: dependencies: broccoli-caching-writer "^3.0.3" ember-cli-babel "^6.6.0" - esdoc "github:pzuraq/esdoc#015a342" + esdoc pzuraq/esdoc#015a342 esdoc-accessor-plugin "^1.0.0" esdoc-ecmascript-proposal-plugin "^1.0.0" fs-extra "^5.0.0" @@ -5885,7 +5885,16 @@ ember-macro-helpers@^2.1.0: ember-cli-test-info "^1.0.0" ember-weakmap "^3.0.0" -ember-maybe-import-regenerator@^0.1.5, ember-maybe-import-regenerator@^0.1.6: +ember-maybe-import-regenerator-for-testing@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-maybe-import-regenerator-for-testing/-/ember-maybe-import-regenerator-for-testing-1.0.0.tgz#894b8089c5b3067c920b492c81233603852d5c2f" + integrity sha512-9ZOjrXZ6iO8WnVuk5kLqUZIFEEOx2O/EA08vcedaT/XSna6LzH2knLx5OiOD9f7XiO8jNaYuZoh0Uq3wnm8/oA== + dependencies: + broccoli-funnel "^1.0.1" + ember-cli-babel "^6.6.0" + regenerator-runtime "^0.9.5" + +ember-maybe-import-regenerator@^0.1.5: version "0.1.6" resolved "https://registry.yarnpkg.com/ember-maybe-import-regenerator/-/ember-maybe-import-regenerator-0.1.6.tgz#35d41828afa6d6a59bc0da3ce47f34c573d776ca" integrity sha1-NdQYKK+m1qWbwNo85H80xXPXdso= @@ -6285,9 +6294,8 @@ esdoc-ecmascript-proposal-plugin@^1.0.0: resolved "https://registry.yarnpkg.com/esdoc-ecmascript-proposal-plugin/-/esdoc-ecmascript-proposal-plugin-1.0.0.tgz#390dc5656ba8a2830e39dba3570d79138df2ffd9" integrity sha1-OQ3FZWuoooMOOdujVw15E43y/9k= -"esdoc@github:pzuraq/esdoc#015a342": +esdoc@pzuraq/esdoc#015a342: version "1.0.4" - uid "015a3426b2e53b2b0270a9c00133780db3f1d144" resolved "https://codeload.github.com/pzuraq/esdoc/tar.gz/015a3426b2e53b2b0270a9c00133780db3f1d144" dependencies: babel-generator "6.26.0" From 22c3b736261e7286e83f359eebbd1afee50322fc Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" Date: Tue, 18 Jun 2019 17:43:39 +0000 Subject: [PATCH 478/879] build(deps-dev): bump jsdom from 15.1.0 to 15.1.1 Bumps [jsdom](https://github.com/jsdom/jsdom) from 15.1.0 to 15.1.1. - [Release notes](https://github.com/jsdom/jsdom/releases) - [Changelog](https://github.com/jsdom/jsdom/blob/master/Changelog.md) - [Commits](https://github.com/jsdom/jsdom/compare/15.1.0...15.1.1) --- yarn.lock | 125 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 73 insertions(+), 52 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1918ebb91..6f41706f0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1375,10 +1375,10 @@ acorn-globals@^1.0.4: dependencies: acorn "^2.1.0" -acorn-globals@^4.1.0, acorn-globals@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.0.tgz#e3b6f8da3c1552a95ae627571f7dd6923bb54103" - integrity sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw== +acorn-globals@^4.1.0, acorn-globals@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.2.tgz#4e2c2313a597fd589720395f6354b41cd5ec8006" + integrity sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ== dependencies: acorn "^6.0.1" acorn-walk "^6.0.1" @@ -1410,10 +1410,10 @@ acorn@^5.0.0, acorn@^5.2.1, acorn@^5.4.0, acorn@^5.5.3, acorn@^5.6.2: resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== -acorn@^6.0.1, acorn@^6.0.4: - version "6.0.5" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.5.tgz#81730c0815f3f3b34d8efa95cb7430965f4d887a" - integrity sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg== +acorn@^6.0.1, acorn@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" + integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== active-model-adapter@^2.0.3: version "2.2.0" @@ -1731,7 +1731,7 @@ async-each@^1.0.0: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" integrity sha1-GdOGodntxufByF04iu28xW0zYC0= -async-limiter@~1.0.0: +async-limiter@^1.0.0, async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== @@ -4485,10 +4485,10 @@ csso@~2.0.0: clap "^1.0.9" source-map "^0.5.3" -cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0", "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.4.tgz#8cd52e8a3acfd68d3aed38ee0a640177d2f9d797" - integrity sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog== +cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0", "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.6.tgz#f85206cee04efa841f3c5982a74ba96ab20d65ad" + integrity sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A== "cssstyle@>= 0.2.29 < 0.3.0": version "0.2.37" @@ -4497,10 +4497,10 @@ cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0", "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4: dependencies: cssom "0.3.x" -cssstyle@^1.0.0, cssstyle@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.1.1.tgz#18b038a9c44d65f7a8e428a653b9f6fe42faf5fb" - integrity sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog== +cssstyle@^1.0.0, cssstyle@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.2.2.tgz#427ea4d585b18624f6fdbf9de7a2a1a3ba713077" + integrity sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow== dependencies: cssom "0.3.x" @@ -6272,10 +6272,10 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escodegen@^1.11.0, escodegen@^1.6.1, escodegen@^1.9.1: - version "1.11.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" - integrity sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw== +escodegen@^1.11.1, escodegen@^1.6.1, escodegen@^1.9.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510" + integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw== dependencies: esprima "^3.1.3" estraverse "^4.2.0" @@ -8334,6 +8334,11 @@ ip-regex@^1.0.1: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" integrity sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0= +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + ipaddr.js@1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" @@ -8882,35 +8887,35 @@ jsdom@^11.12.0: xml-name-validator "^3.0.0" jsdom@^15.0.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.1.0.tgz#80c5f0dd69466742ab1194f15d301bdd01417596" - integrity sha512-QEmc2XIkNfCK3KRfa9ljMJjC4kAGdVgRrs/pCBsQG/QoKz0B42+C58f6TdAmhq/rw494eFCoLHxX6+hWuxb96Q== + version "15.1.1" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.1.1.tgz#21ed01f81d95ef4327f3e564662aef5e65881252" + integrity sha512-cQZRBB33arrDAeCrAEWn1U3SvrvC8XysBua9Oqg1yWrsY/gYcusloJC3RZJXuY5eehSCmws8f2YeliCqGSkrtQ== dependencies: abab "^2.0.0" - acorn "^6.0.4" - acorn-globals "^4.3.0" + acorn "^6.1.1" + acorn-globals "^4.3.2" array-equal "^1.0.0" - cssom "^0.3.4" - cssstyle "^1.1.1" + cssom "^0.3.6" + cssstyle "^1.2.2" data-urls "^1.1.0" domexception "^1.0.1" - escodegen "^1.11.0" + escodegen "^1.11.1" html-encoding-sniffer "^1.0.2" - nwsapi "^2.1.3" + nwsapi "^2.1.4" parse5 "5.1.0" pn "^1.1.0" request "^2.88.0" - request-promise-native "^1.0.5" + request-promise-native "^1.0.7" saxes "^3.1.9" symbol-tree "^3.2.2" - tough-cookie "^2.5.0" + tough-cookie "^3.0.1" w3c-hr-time "^1.0.1" w3c-xmlserializer "^1.1.2" webidl-conversions "^4.0.2" whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" whatwg-url "^7.0.0" - ws "^6.1.2" + ws "^7.0.0" xml-name-validator "^3.0.0" jsdom@^7.0.2: @@ -10611,10 +10616,10 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" integrity sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ== -nwsapi@^2.0.7, nwsapi@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.3.tgz#25f3a5cec26c654f7376df6659cdf84b99df9558" - integrity sha512-RowAaJGEgYXEZfQ7tvvdtAQUKPyTR6T6wNu0fwlNsGQYr/h3yQc6oI8WnVZh3Y/Sylwc+dtAlvPqfFZjhTyk3A== +nwsapi@^2.0.7, nwsapi@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f" + integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw== oauth-sign@~0.3.0: version "0.3.0" @@ -12004,21 +12009,21 @@ request-progress@^2.0.1: dependencies: throttleit "^1.0.0" -request-promise-core@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" - integrity sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY= +request-promise-core@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" + integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag== dependencies: - lodash "^4.13.1" + lodash "^4.17.11" -request-promise-native@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" - integrity sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU= +request-promise-native@^1.0.5, request-promise-native@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" + integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== dependencies: - request-promise-core "1.1.1" - stealthy-require "^1.1.0" - tough-cookie ">=2.3.3" + request-promise-core "1.1.2" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" request@^2.55.0, request@^2.65.0, request@^2.81.0, request@^2.87.0, request@^2.88.0: version "2.88.0" @@ -12939,7 +12944,7 @@ statuses@~1.3.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= -stealthy-require@^1.1.0: +stealthy-require@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= @@ -13511,7 +13516,16 @@ topo@2.x.x: dependencies: hoek "4.x.x" -tough-cookie@>=0.12.0, tough-cookie@>=2.3.3, tough-cookie@^2.2.0, tough-cookie@^2.3.4, tough-cookie@^2.5.0: +tough-cookie@>=0.12.0, tough-cookie@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" + integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== + dependencies: + ip-regex "^2.1.0" + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@^2.2.0, tough-cookie@^2.3.3, tough-cookie@^2.3.4: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== @@ -14242,7 +14256,14 @@ ws@^5.2.0: dependencies: async-limiter "~1.0.0" -ws@^6.1.2, ws@~6.1.0: +ws@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.0.1.tgz#1a04e86cc3a57c03783f4910fdb090cf31b8e165" + integrity sha512-ILHfMbuqLJvnSgYXLgy4kMntroJpe8hT41dOVWM8bxRuw6TK4mgMp9VJUNsZTEc5Bh+Mbs0DJT4M0N+wBG9l9A== + dependencies: + async-limiter "^1.0.0" + +ws@~6.1.0: version "6.1.2" resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.2.tgz#3cc7462e98792f0ac679424148903ded3b9c3ad8" integrity sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw== From 7a3a53aebd1961e0a8687b08b7ce9cb7ed47cb03 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" Date: Tue, 18 Jun 2019 17:43:42 +0000 Subject: [PATCH 479/879] build(deps-dev): bump ember-source from 3.10.0 to 3.10.2 Bumps [ember-source](https://github.com/emberjs/ember.js) from 3.10.0 to 3.10.2. - [Release notes](https://github.com/emberjs/ember.js/releases) - [Changelog](https://github.com/emberjs/ember.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember.js/compare/v3.10.0...v3.10.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1918ebb91..efba1e252 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6000,9 +6000,9 @@ ember-source-channel-url@^2.0.1: got "^8.0.1" ember-source@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.10.0.tgz#c423f494d573d418bf843d605ea79c21a14ca863" - integrity sha512-qHI+1y1gcfHO44+Ld3ty9565UsqlmimfOLe/Ra3jA4Z9h6vJNOdIzr4Bws7by/8kiBqjO1RM+TVe19zglivwoQ== + version "3.10.2" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.10.2.tgz#17a0405f1e470698f601622b3383cce7f80e2d31" + integrity sha512-7WRBikgS5riwO0DiBtKQDQhk80mqppMbghSAHXvfJAYpkGFxuH//MxjO1eRXP9xjzmdMhfDmixrMnNBtc5D6mA== dependencies: broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.2" From 2c244217cff092ebb325e297f84e7bc7ac1e3b16 Mon Sep 17 00:00:00 2001 From: Alexandre Santos Date: Thu, 20 Jun 2019 02:17:30 +0100 Subject: [PATCH 480/879] Try to get tests to pass - Migrate ember-data stuff back to ember-cli-mirage - Auto discover models on ember-cli-mirage initializer - **Missing**: Discover a way to auto detect models when instantiating server directly --- addon/start-mirage.js | 9 +++++++++ addon/utils/ember-data.js | 22 +++++++++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/addon/start-mirage.js b/addon/start-mirage.js index 80757ea30..a822aa44e 100644 --- a/addon/start-mirage.js +++ b/addon/start-mirage.js @@ -2,6 +2,8 @@ import readModules from './utils/read-modules'; import Server from './server'; import _assign from 'lodash/assign'; import { singularize, pluralize } from 'ember-inflector'; +import { getModels } from './ember-data'; +import { hasEmberData } from './utils/ember-data'; /** Helper to start mirage. This should not be called directly. In rfc232/rfc268 @@ -37,6 +39,13 @@ export default function startMirage(owner, { env, baseConfig, testConfig } = {}) options.trackRequests = env['ember-cli-mirage'].trackRequests; options.inflector = { singularize, pluralize }; + // Merge models from autogenerated Ember Data models with user defined models + if (hasEmberData && discoverEmberDataModels) { + let models = {}; + _assign(models, getModels()); + options.models = models; + } + return new Server(options); } diff --git a/addon/utils/ember-data.js b/addon/utils/ember-data.js index 47563d9c4..a7a36355a 100644 --- a/addon/utils/ember-data.js +++ b/addon/utils/ember-data.js @@ -1,4 +1,20 @@ -import EmberData from '@miragejs/server/lib/utils/ember-data'; -export * from '@miragejs/server/lib/utils/ember-data'; +/* global requirejs */ -export default EmberData; +import _find from 'lodash/find'; + +function _hasEmberData() { + let matchRegex = /^ember-data/i; + return !!_find(Object.keys(requirejs.entries), (e) => !!e.match(matchRegex)); +} + +/** + @hide +*/ +export const hasEmberData = _hasEmberData(); + +/** + @hide +*/ +export function isDsModel(m) { + return m && typeof m.eachRelationship === 'function'; +} From d55ada5c4a03c47de8dd9042f4070de8824b6f7c Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 20 Jun 2019 16:17:43 -0400 Subject: [PATCH 481/879] Detect ED models in constructor, to preserve behavior --- addon/server.js | 17 ++++++++++++++++- addon/start-mirage.js | 13 ++----------- package.json | 2 +- yarn.lock | 8 ++++---- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/addon/server.js b/addon/server.js index a689cf298..642e018e6 100644 --- a/addon/server.js +++ b/addon/server.js @@ -1,4 +1,19 @@ import Server from '@miragejs/server/lib/server'; +import { getModels } from './ember-data'; +import { hasEmberData } from './utils/ember-data'; +import _assign from 'lodash/assign'; + export * from '@miragejs/server/lib/server'; -export default Server; +export default class EmberServer extends Server { + + constructor(options) { + // Merge models from autogenerated Ember Data models with user defined models + if (hasEmberData && options.discoverEmberDataModels) { + options.models = _assign({}, getModels(), options.models); + } + + super(options); + } + +} diff --git a/addon/start-mirage.js b/addon/start-mirage.js index a822aa44e..292f73a66 100644 --- a/addon/start-mirage.js +++ b/addon/start-mirage.js @@ -1,9 +1,8 @@ +import { getWithDefault } from '@ember/object'; import readModules from './utils/read-modules'; import Server from './server'; import _assign from 'lodash/assign'; import { singularize, pluralize } from 'ember-inflector'; -import { getModels } from './ember-data'; -import { hasEmberData } from './utils/ember-data'; /** Helper to start mirage. This should not be called directly. In rfc232/rfc268 @@ -32,20 +31,12 @@ export default function startMirage(owner, { env, baseConfig, testConfig } = {}) } let environment = env.environment; - let envConfig = env['ember-cli-mirage'] || {}; - let discoverEmberDataModels = envConfig.discoverEmberDataModels !== undefined ? envConfig.discoverEmberDataModels : true; + let discoverEmberDataModels = getWithDefault(env['ember-cli-mirage'] || {}, 'discoverEmberDataModels', true); let modules = readModules(env.modulePrefix); let options = _assign(modules, {environment, baseConfig, testConfig, discoverEmberDataModels}); options.trackRequests = env['ember-cli-mirage'].trackRequests; options.inflector = { singularize, pluralize }; - // Merge models from autogenerated Ember Data models with user defined models - if (hasEmberData && discoverEmberDataModels) { - let models = {}; - _assign(models, getModels()); - options.models = models; - } - return new Server(options); } diff --git a/package.json b/package.json index 1e58657c9..defe89406 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "prepare": "./scripts/link.sh" }, "dependencies": { - "@miragejs/server": "0.1.2", + "@miragejs/server": "0.1.3", "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^2.0.1", "broccoli-merge-trees": "^3.0.2", diff --git a/yarn.lock b/yarn.lock index b7cce977c..7113fc1dd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1077,10 +1077,10 @@ dependencies: core-js "^2.5.7" -"@miragejs/server@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.2.tgz#ed3dc7b363ae024a16574c0e5df535acba3ca276" - integrity sha512-JJQErnn7cQPNsC2aDn1TK2VBqcb5+5DhIQKECBujVj/VE1nMG8pwPKUcSItnY6NTfksM1u3DiNDOzI9DigxqzA== +"@miragejs/server@0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.3.tgz#1ce542f0d7d0ef01d4c9a758babf18701cf9194f" + integrity sha512-Y73YLxA2gRNh2srVZe6Nx2aOCELE5xuyZbwlpowiD0srcKLFIJZhWbs2ogr4cPLukNa75EPiV5y4ONmiiEPCuQ== dependencies: broccoli-file-creator "^2.1.1" broccoli-funnel "^2.0.1" From 8821c15ea4ea7061c5be22c0852c5cc24d3640e2 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 22 Jun 2019 00:27:37 -0400 Subject: [PATCH 482/879] Only use named imports --- addon/assert.js | 5 +- addon/association.js | 5 +- addon/db-collection.js | 5 +- addon/db.js | 5 +- addon/factory.js | 5 +- addon/identity-manager.js | 5 +- addon/index.js | 6 +- addon/orm/associations/association.js | 5 +- addon/orm/associations/belongs-to.js | 5 +- addon/orm/associations/has-many.js | 5 +- addon/orm/collection.js | 5 +- addon/orm/model.js | 5 +- addon/orm/polymorphic-collection.js | 5 +- addon/orm/schema.js | 5 +- addon/response.js | 5 +- addon/route-handler.js | 5 +- addon/route-handlers/base.js | 5 +- addon/route-handlers/function.js | 5 +- addon/route-handlers/object.js | 5 +- addon/route-handlers/shorthands/base.js | 5 +- addon/route-handlers/shorthands/delete.js | 5 +- addon/route-handlers/shorthands/get.js | 5 +- addon/route-handlers/shorthands/head.js | 5 +- addon/route-handlers/shorthands/post.js | 5 +- addon/route-handlers/shorthands/put.js | 5 +- addon/serializer-registry.js | 5 +- addon/serializer.js | 5 +- addon/serializers/active-model-serializer.js | 5 +- addon/serializers/json-api-serializer.js | 5 +- addon/serializers/rest-serializer.js | 5 +- addon/server.js | 4 +- addon/trait.js | 5 +- addon/utils/extend.js | 5 +- addon/utils/inflector.js | 10 +- addon/utils/is-association.js | 5 +- addon/utils/reference-sort.js | 5 +- addon/utils/uuid.js | 5 +- package.json | 2 +- yarn.lock | 285 +++++++++++++++++-- 39 files changed, 310 insertions(+), 167 deletions(-) diff --git a/addon/assert.js b/addon/assert.js index 008888788..832d6b414 100644 --- a/addon/assert.js +++ b/addon/assert.js @@ -1,4 +1 @@ -import Assert from '@miragejs/server/lib/assert'; -export * from '@miragejs/server/lib/assert'; - -export default Assert; +export { _assert as default } from '@miragejs/server'; diff --git a/addon/association.js b/addon/association.js index e19babd0e..868347668 100644 --- a/addon/association.js +++ b/addon/association.js @@ -1,4 +1 @@ -import Association from '@miragejs/server/lib/association'; -export * from '@miragejs/server/lib/association'; - -export default Association; +export { association as default } from '@miragejs/server'; diff --git a/addon/db-collection.js b/addon/db-collection.js index 4dbbf198f..6a60ce946 100644 --- a/addon/db-collection.js +++ b/addon/db-collection.js @@ -1,4 +1 @@ -import DbCollection from '@miragejs/server/lib/db-collection'; -export * from '@miragejs/server/lib/db-collection'; - -export default DbCollection; +export { _dbCollection as default } from '@miragejs/server'; diff --git a/addon/db.js b/addon/db.js index 49b4f4e96..4958d4c66 100644 --- a/addon/db.js +++ b/addon/db.js @@ -1,4 +1 @@ -import Db from '@miragejs/server/lib/db'; -export * from '@miragejs/server/lib/db'; - -export default Db; +export { _Db as default } from '@miragejs/server'; diff --git a/addon/factory.js b/addon/factory.js index c31345fff..3b4b087b5 100644 --- a/addon/factory.js +++ b/addon/factory.js @@ -1,4 +1 @@ -import Factory from '@miragejs/server/lib/factory'; -export * from '@miragejs/server/lib/factory'; - -export default Factory; +export { Factory as default } from '@miragejs/server'; diff --git a/addon/identity-manager.js b/addon/identity-manager.js index 14da818a9..2ab3de762 100644 --- a/addon/identity-manager.js +++ b/addon/identity-manager.js @@ -1,4 +1 @@ -import IdentityManager from '@miragejs/server/lib/identity-manager'; -export * from '@miragejs/server/lib/identity-manager'; - -export default IdentityManager; +export { IdentityManager as default } from '@miragejs/server'; diff --git a/addon/index.js b/addon/index.js index 54717f1ee..b59a91c8f 100644 --- a/addon/index.js +++ b/addon/index.js @@ -1,4 +1,2 @@ -import MirageServer from '@miragejs/server/lib'; -export * from '@miragejs/server/lib'; - -export default MirageServer; +export { default } from '@miragejs/server'; +export * from '@miragejs/server'; diff --git a/addon/orm/associations/association.js b/addon/orm/associations/association.js index 9bf270106..21af9e685 100644 --- a/addon/orm/associations/association.js +++ b/addon/orm/associations/association.js @@ -1,4 +1 @@ -import Association from '@miragejs/server/lib/orm/associations/association'; -export * from '@miragejs/server/lib/orm/associations/association'; - -export default Association; +export { _ormAssociationsAssociation as default } from '@miragejs/server'; diff --git a/addon/orm/associations/belongs-to.js b/addon/orm/associations/belongs-to.js index babd29eff..a8024ab2f 100644 --- a/addon/orm/associations/belongs-to.js +++ b/addon/orm/associations/belongs-to.js @@ -1,4 +1 @@ -import BelongsTo from '@miragejs/server/lib/orm/associations/belongs-to'; -export * from '@miragejs/server/lib/orm/associations/belongs-to'; - -export default BelongsTo; +export {_ormAssociationsBelongsTo as default } from '@miragejs/server'; diff --git a/addon/orm/associations/has-many.js b/addon/orm/associations/has-many.js index 603bd0de1..cb8a5a2be 100644 --- a/addon/orm/associations/has-many.js +++ b/addon/orm/associations/has-many.js @@ -1,4 +1 @@ -import HasMany from '@miragejs/server/lib/orm/associations/has-many'; -export * from '@miragejs/server/lib/orm/associations/has-many'; - -export default HasMany; +export { _ormAssociationsHasMany as default } from '@miragejs/server'; diff --git a/addon/orm/collection.js b/addon/orm/collection.js index 4f9e2da7b..886220cb2 100644 --- a/addon/orm/collection.js +++ b/addon/orm/collection.js @@ -1,4 +1 @@ -import Collection from '@miragejs/server/lib/orm/collection'; -export * from '@miragejs/server/lib/orm/collection'; - -export default Collection; +export { Collection as default } from '@miragejs/server'; diff --git a/addon/orm/model.js b/addon/orm/model.js index e766cfdf1..0f4ba5d42 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -1,4 +1 @@ -import Model from '@miragejs/server/lib/orm/model'; -export * from '@miragejs/server/lib/orm/model'; - -export default Model; +export { Model as default } from '@miragejs/server'; diff --git a/addon/orm/polymorphic-collection.js b/addon/orm/polymorphic-collection.js index 637d4b223..dc804f93b 100644 --- a/addon/orm/polymorphic-collection.js +++ b/addon/orm/polymorphic-collection.js @@ -1,4 +1 @@ -import PolymorphicCollection from '@miragejs/server/lib/orm/polymorphic-collection'; -export * from '@miragejs/server/lib/orm/polymorphic-collection'; - -export default PolymorphicCollection; +export { _ormPolymorphicCollection as default } from '@miragejs/server'; diff --git a/addon/orm/schema.js b/addon/orm/schema.js index cc0575943..59b54eb3e 100644 --- a/addon/orm/schema.js +++ b/addon/orm/schema.js @@ -1,4 +1 @@ -import Schema from '@miragejs/server/lib/orm/schema'; -export * from '@miragejs/server/lib/orm/schema'; - -export default Schema; +export { _ormSchema as default } from '@miragejs/server'; diff --git a/addon/response.js b/addon/response.js index 21fb597c1..da34a7391 100644 --- a/addon/response.js +++ b/addon/response.js @@ -1,4 +1 @@ -import Response from '@miragejs/server/lib/response'; -export * from '@miragejs/server/lib/response'; - -export default Response; +export { Response as default } from '@miragejs/server'; diff --git a/addon/route-handler.js b/addon/route-handler.js index d020a4bf6..b119c95f0 100644 --- a/addon/route-handler.js +++ b/addon/route-handler.js @@ -1,4 +1 @@ -import RouteHandler from '@miragejs/server/lib/route-handler'; -export * from '@miragejs/server/lib/route-handler'; - -export default RouteHandler; +export { _RouteHandler as default } from '@miragejs/server'; diff --git a/addon/route-handlers/base.js b/addon/route-handlers/base.js index f0db5bb69..54e38e8e2 100644 --- a/addon/route-handlers/base.js +++ b/addon/route-handlers/base.js @@ -1,4 +1 @@ -import Base from '@miragejs/server/lib/route-handlers/base'; -export * from '@miragejs/server/lib/route-handlers/base'; - -export default Base; +export { _routeHandlersBase as default } from '@miragejs/server'; diff --git a/addon/route-handlers/function.js b/addon/route-handlers/function.js index 5e36a988b..ec83bd8c4 100644 --- a/addon/route-handlers/function.js +++ b/addon/route-handlers/function.js @@ -1,4 +1 @@ -import FunctionHandler from '@miragejs/server/lib/route-handlers/function'; -export * from '@miragejs/server/lib/route-handlers/function'; - -export default FunctionHandler; +export { _routeHandlersFunction as default } from '@miragejs/server'; diff --git a/addon/route-handlers/object.js b/addon/route-handlers/object.js index 4a59bd3fa..fa802bca4 100644 --- a/addon/route-handlers/object.js +++ b/addon/route-handlers/object.js @@ -1,4 +1 @@ -import ObjectHandler from '@miragejs/server/lib/route-handlers/object'; -export * from '@miragejs/server/lib/route-handlers/object'; - -export default ObjectHandler; +export { _routeHandlersObject as default } from '@miragejs/server'; diff --git a/addon/route-handlers/shorthands/base.js b/addon/route-handlers/shorthands/base.js index f531370e3..e1f925c06 100644 --- a/addon/route-handlers/shorthands/base.js +++ b/addon/route-handlers/shorthands/base.js @@ -1,4 +1 @@ -import Base from '@miragejs/server/lib/route-handlers/shorthands/base'; -export * from '@miragejs/server/lib/route-handlers/shorthands/base'; - -export default Base; +export { _routeHandlersShorthandsBase as default } from '@miragejs/server'; diff --git a/addon/route-handlers/shorthands/delete.js b/addon/route-handlers/shorthands/delete.js index ee21b2113..246d68017 100644 --- a/addon/route-handlers/shorthands/delete.js +++ b/addon/route-handlers/shorthands/delete.js @@ -1,4 +1 @@ -import Delete from '@miragejs/server/lib/route-handlers/shorthands/delete'; -export * from '@miragejs/server/lib/route-handlers/shorthands/delete'; - -export default Delete; +export { _routeHandlersShorthandsDelete as default } from '@miragejs/server'; diff --git a/addon/route-handlers/shorthands/get.js b/addon/route-handlers/shorthands/get.js index 766fe47d0..429bf8e22 100644 --- a/addon/route-handlers/shorthands/get.js +++ b/addon/route-handlers/shorthands/get.js @@ -1,4 +1 @@ -import Get from '@miragejs/server/lib/route-handlers/shorthands/get'; -export * from '@miragejs/server/lib/route-handlers/shorthands/get'; - -export default Get; +export { _routeHandlersShorthandsGet as default } from '@miragejs/server'; diff --git a/addon/route-handlers/shorthands/head.js b/addon/route-handlers/shorthands/head.js index af2d951a5..e6dcb97ab 100644 --- a/addon/route-handlers/shorthands/head.js +++ b/addon/route-handlers/shorthands/head.js @@ -1,4 +1 @@ -import Head from '@miragejs/server/lib/route-handlers/shorthands/head'; -export * from '@miragejs/server/lib/route-handlers/shorthands/head'; - -export default Head; +export { _routeHandlersShorthandsHead as default } from '@miragejs/server'; diff --git a/addon/route-handlers/shorthands/post.js b/addon/route-handlers/shorthands/post.js index d5bae8137..44285c147 100644 --- a/addon/route-handlers/shorthands/post.js +++ b/addon/route-handlers/shorthands/post.js @@ -1,4 +1 @@ -import Post from '@miragejs/server/lib/route-handlers/shorthands/post'; -export * from '@miragejs/server/lib/route-handlers/shorthands/post'; - -export default Post; +export { _routeHandlersShorthandsPost as default } from '@miragejs/server'; diff --git a/addon/route-handlers/shorthands/put.js b/addon/route-handlers/shorthands/put.js index 881bc694d..67cdce865 100644 --- a/addon/route-handlers/shorthands/put.js +++ b/addon/route-handlers/shorthands/put.js @@ -1,4 +1 @@ -import Put from '@miragejs/server/lib/route-handlers/shorthands/put'; -export * from '@miragejs/server/lib/route-handlers/shorthands/put'; - -export default Put; +export { _routeHandlersShorthandsPut as default } from '@miragejs/server'; diff --git a/addon/serializer-registry.js b/addon/serializer-registry.js index f32643a3c..2d1612e7e 100644 --- a/addon/serializer-registry.js +++ b/addon/serializer-registry.js @@ -1,4 +1 @@ -import SerializerRegistry from '@miragejs/server/lib/serializer-registry'; -export * from '@miragejs/server/lib/serializer-registry'; - -export default SerializerRegistry; +export { _SerializerRegistry as default } from '@miragejs/server'; diff --git a/addon/serializer.js b/addon/serializer.js index eae7a3ece..deef41b8a 100644 --- a/addon/serializer.js +++ b/addon/serializer.js @@ -1,4 +1 @@ -import Serializer from '@miragejs/server/lib/serializer'; -export * from '@miragejs/server/lib/serializer'; - -export default Serializer; +export { Serializer as default } from '@miragejs/server'; diff --git a/addon/serializers/active-model-serializer.js b/addon/serializers/active-model-serializer.js index 151f2a4cb..7a8267d90 100644 --- a/addon/serializers/active-model-serializer.js +++ b/addon/serializers/active-model-serializer.js @@ -1,4 +1 @@ -import ActiveModelSerializer from '@miragejs/server/lib/serializers/active-model-serializer'; -export * from '@miragejs/server/lib/serializers/active-model-serializer'; - -export default ActiveModelSerializer; +export { ActiveModelSerializer as default } from '@miragejs/server'; diff --git a/addon/serializers/json-api-serializer.js b/addon/serializers/json-api-serializer.js index 6d00e9568..73210435b 100644 --- a/addon/serializers/json-api-serializer.js +++ b/addon/serializers/json-api-serializer.js @@ -1,4 +1 @@ -import JsonApiSerializer from '@miragejs/server/lib/serializers/json-api-serializer'; -export * from '@miragejs/server/lib/serializers/json-api-serializer'; - -export default JsonApiSerializer; +export { JSONAPISerializer as default } from '@miragejs/server'; diff --git a/addon/serializers/rest-serializer.js b/addon/serializers/rest-serializer.js index cc8551e09..7a8267d90 100644 --- a/addon/serializers/rest-serializer.js +++ b/addon/serializers/rest-serializer.js @@ -1,4 +1 @@ -import RestSerializer from '@miragejs/server/lib/serializers/rest-serializer'; -export * from '@miragejs/server/lib/serializers/rest-serializer'; - -export default RestSerializer; +export { ActiveModelSerializer as default } from '@miragejs/server'; diff --git a/addon/server.js b/addon/server.js index 642e018e6..855e502b2 100644 --- a/addon/server.js +++ b/addon/server.js @@ -1,9 +1,9 @@ -import Server from '@miragejs/server/lib/server'; +import { Server } from '@miragejs/server'; import { getModels } from './ember-data'; import { hasEmberData } from './utils/ember-data'; import _assign from 'lodash/assign'; -export * from '@miragejs/server/lib/server'; +export { defaultPassthroughs } from '@miragejs/server'; export default class EmberServer extends Server { diff --git a/addon/trait.js b/addon/trait.js index d701fc088..681f29548 100644 --- a/addon/trait.js +++ b/addon/trait.js @@ -1,4 +1 @@ -import Trait from '@miragejs/server/lib/trait'; -export * from '@miragejs/server/lib/trait'; - -export default Trait; +export { trait as default } from '@miragejs/server'; diff --git a/addon/utils/extend.js b/addon/utils/extend.js index 12aea5b0c..e85ccfaf6 100644 --- a/addon/utils/extend.js +++ b/addon/utils/extend.js @@ -1,4 +1 @@ -import Extend from '@miragejs/server/lib/utils/extend'; -export * from '@miragejs/server/lib/utils/extend'; - -export default Extend; +export { _utilsExtend as default } from '@miragejs/server'; diff --git a/addon/utils/inflector.js b/addon/utils/inflector.js index e84c6b075..cec6ed0c2 100644 --- a/addon/utils/inflector.js +++ b/addon/utils/inflector.js @@ -1,10 +1,12 @@ -import Inflector from '@miragejs/server/lib/utils/inflector'; -export * from '@miragejs/server/lib/utils/inflector'; +export { + _utilsInflectorCamelize as camelize, + _utilsInflectorDasherize as dasherize, + _utilsInflectorUnderscore as underscore, + _utilsInflectorCapitalize as capitalize +} from '@miragejs/server'; /* Keeping these tests here for now to avoid accidental breakage, but they are definitely an Ember Mirage thing, not a Mirage thing. */ export { singularize, pluralize } from 'ember-inflector'; - -export default Inflector; diff --git a/addon/utils/is-association.js b/addon/utils/is-association.js index 7af277fc7..5336cb592 100644 --- a/addon/utils/is-association.js +++ b/addon/utils/is-association.js @@ -1,4 +1 @@ -import IsAssociation from '@miragejs/server/lib/utils/is-association'; -export * from '@miragejs/server/lib/utils/is-association'; - -export default IsAssociation; +export { _utilsIsAssociation as default } from '@miragejs/server'; diff --git a/addon/utils/reference-sort.js b/addon/utils/reference-sort.js index b9736eed0..da34fc655 100644 --- a/addon/utils/reference-sort.js +++ b/addon/utils/reference-sort.js @@ -1,4 +1 @@ -import ReferenceSort from '@miragejs/server/lib/utils/reference-sort'; -export * from '@miragejs/server/lib/utils/reference-sort'; - -export default ReferenceSort; +export { _utilsReferenceSort as default } from '@miragejs/server'; diff --git a/addon/utils/uuid.js b/addon/utils/uuid.js index 12c6f2f5c..ca4a83ffd 100644 --- a/addon/utils/uuid.js +++ b/addon/utils/uuid.js @@ -1,4 +1 @@ -import Uuid from '@miragejs/server/lib/utils/uuid'; -export * from '@miragejs/server/lib/utils/uuid'; - -export default Uuid; +export { _utilsUuid as default } from '@miragejs/server'; diff --git a/package.json b/package.json index defe89406..0e5db1dac 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "prepare": "./scripts/link.sh" }, "dependencies": { - "@miragejs/server": "0.1.3", + "@miragejs/server": "0.1.4", "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^2.0.1", "broccoli-merge-trees": "^3.0.2", diff --git a/yarn.lock b/yarn.lock index 7113fc1dd..d027a4c36 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1077,23 +1077,17 @@ dependencies: core-js "^2.5.7" -"@miragejs/server@0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.3.tgz#1ce542f0d7d0ef01d4c9a758babf18701cf9194f" - integrity sha512-Y73YLxA2gRNh2srVZe6Nx2aOCELE5xuyZbwlpowiD0srcKLFIJZhWbs2ogr4cPLukNa75EPiV5y4ONmiiEPCuQ== +"@miragejs/server@0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.4.tgz#6516afcf52027f0393e32a583bda4744b03c3d49" + integrity sha512-pbfVCKdaj5bzU7m2vH8WooQgrVRNIL35N4bQyZpNw80T6xotiH7MKYYAaTYH/YuvF3OgvvMqBWB1d0/arDusHA== dependencies: - broccoli-file-creator "^2.1.1" - broccoli-funnel "^2.0.1" - broccoli-merge-trees "^3.0.2" - broccoli-string-replace "^0.1.2" chalk "^2.4.2" - ember-auto-import "^1.2.19" - ember-cli-babel "^7.5.0" - ember-get-config "^0.2.2" - ember-inflector "^2.0.0 || ^3.0.0" + eslint "^5.16.0" inflected "^2.0.4" lodash "^4.17.11" pretender "3.0.1" + prettier "^1.18.2" "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" @@ -1408,6 +1402,11 @@ acorn-jsx@^3.0.0: dependencies: acorn "^3.0.4" +acorn-jsx@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" + integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== + acorn-walk@^6.0.1: version "6.1.1" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" @@ -1433,6 +1432,11 @@ acorn@^6.0.1, acorn@^6.0.4: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.5.tgz#81730c0815f3f3b34d8efa95cb7430965f4d887a" integrity sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg== +acorn@^6.0.7: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" + integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== + active-model-adapter@^2.0.3: version "2.2.0" resolved "https://registry.yarnpkg.com/active-model-adapter/-/active-model-adapter-2.2.0.tgz#6885d6968574809f17f398c499b688a921c30f91" @@ -1481,6 +1485,16 @@ ajv@^6.1.0, ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.9.1: + version "6.10.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" + integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + amd-name-resolver@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.2.0.tgz#fc41b3848824b557313897d71f8d5a0184fbe679" @@ -1511,6 +1525,11 @@ ansi-escapes@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" integrity sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ== +ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -1521,12 +1540,17 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= -ansi-styles@^3.0.0, ansi-styles@^3.2.1: +ansi-styles@^3.0.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -1731,6 +1755,11 @@ ast-types@0.9.6: resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" integrity sha1-ECyenpAF0+fjgpvwxPok7oYu6bk= +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + async-disk-cache@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/async-disk-cache/-/async-disk-cache-1.3.3.tgz#6040486660b370e4051cd9fa9fee275e1fae3728" @@ -3650,6 +3679,11 @@ callsites@^0.2.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + camelcase-css@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-1.0.1.tgz#157c4238265f5cf94a1dffde86446552cbf3f705" @@ -3777,6 +3811,11 @@ chardet@^0.4.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + charenc@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" @@ -4423,7 +4462,7 @@ cross-spawn@^5.0.1, cross-spawn@^5.1.0: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^6.0.0: +cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -4774,6 +4813,13 @@ doctrine@^2.1.0: dependencies: esutils "^2.0.2" +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + dom-serializer@0, dom-serializer@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" @@ -6136,6 +6182,11 @@ emit-function@0.0.2: resolved "https://registry.yarnpkg.com/emit-function/-/emit-function-0.0.2.tgz#e3a50b3d61be1bf8ca88b924bf713157a5bec124" integrity sha1-46ULPWG+G/jKiLkkv3ExV6W+wSQ= +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" @@ -6379,6 +6430,14 @@ eslint-scope@^4.0.0: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + eslint-utils@^1.3.0, eslint-utils@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" @@ -6432,6 +6491,48 @@ eslint@^4.0.0: table "^4.0.1" text-table "~0.2.0" +eslint@^5.16.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" + integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.9.1" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^4.0.3" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^5.0.1" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.7.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^6.2.2" + js-yaml "^3.13.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.11" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^5.5.1" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" + table "^5.2.3" + text-table "^0.2.0" + esm@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.4.tgz#0b728b5d6043061bf552197407bf2c630717812b" @@ -6445,6 +6546,15 @@ espree@^3.5.2: acorn "^5.4.0" acorn-jsx "^3.0.0" +espree@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" + integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== + dependencies: + acorn "^6.0.7" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" + esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" @@ -6472,6 +6582,13 @@ esquery@^1.0.0: dependencies: estraverse "^4.0.0" +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + dependencies: + estraverse "^4.0.0" + esrecurse@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" @@ -6793,6 +6910,15 @@ external-editor@^2.0.4: iconv-lite "^0.4.17" tmp "^0.0.33" +external-editor@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" + integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" @@ -7012,6 +7138,13 @@ file-entry-cache@^2.0.0: flat-cache "^1.2.1" object-assign "^4.0.1" +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + file-type@^3.1.0, file-type@^3.8.0: version "3.9.0" resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" @@ -7183,6 +7316,20 @@ flat-cache@^1.2.1: graceful-fs "^4.1.2" write "^0.2.1" +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916" + integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg== + flush-write-stream@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" @@ -7658,6 +7805,11 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" integrity sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg== +globals@^11.7.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -8167,7 +8319,7 @@ iconv-lite@0.4.23: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@0.4.24, iconv-lite@^0.4.4: +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -8196,7 +8348,7 @@ ignore@^3.3.3: resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== -ignore@^4.0.3: +ignore@^4.0.3, ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== @@ -8216,6 +8368,14 @@ image-size@^0.6.3: resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2" integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== +import-fresh@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390" + integrity sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -8327,6 +8487,25 @@ inquirer@^3.0.6, inquirer@^3.3.0: strip-ansi "^4.0.0" through "^2.3.6" +inquirer@^6.2.2: + version "6.4.1" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.4.1.tgz#7bd9e5ab0567cd23b41b0180b68e0cfa82fc3c0b" + integrity sha512-/Jw+qPZx4EDYsaT6uz7F4GJRNFMRdKNeUZw3ZnKV8lyuUgz/YWRCSUAJMZSVhSq4Ec0R2oYnyi6b3d4JXcL5Nw== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.11" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + into-stream@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" @@ -8846,7 +9025,7 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.12.0, js-yaml@^3.12.1, js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.3.0, js-yaml@^3.9.1: +js-yaml@^3.12.0, js-yaml@^3.12.1, js-yaml@^3.13.0, js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.3.0, js-yaml@^3.9.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -10908,6 +11087,13 @@ parallel-transform@^1.1.0: inherits "^2.0.3" readable-stream "^2.1.5" +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + parse-asn1@^5.0.0: version "5.1.3" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.3.tgz#1600c6cc0727365d68b97f3aa78939e735a75204" @@ -11416,6 +11602,11 @@ pretender@3.0.1: route-recognizer "^0.3.3" whatwg-fetch "^3.0.0" +prettier@^1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" + integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== + pretty-ms@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-3.2.0.tgz#87a8feaf27fc18414d75441467d411d6e6098a25" @@ -12147,6 +12338,11 @@ resolve-from@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + resolve-package-path@^1.0.11: version "1.2.6" resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-1.2.6.tgz#48f5d69a5b3a0ea68f7b9c7398459dd4125807c7" @@ -12218,7 +12414,7 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.1, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: +rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.1, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -12339,6 +12535,13 @@ rx@^4.1.0: resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= +rxjs@^6.4.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.2.tgz#2e35ce815cd46d84d02a209fb4e5921e051dbec7" + integrity sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg== + dependencies: + tslib "^1.9.0" + safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -12650,6 +12853,15 @@ slice-ansi@1.0.0: dependencies: is-fullwidth-code-point "^2.0.0" +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + snake-case@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f" @@ -13040,6 +13252,15 @@ string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + string.prototype.repeat@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-0.2.0.tgz#aba36de08dcee6a5a337d49b2ea1da1b28fc0ecf" @@ -13090,6 +13311,13 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -13114,7 +13342,7 @@ strip-indent@^1.0.1: dependencies: get-stdin "^4.0.1" -strip-json-comments@~2.0.1: +strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= @@ -13207,6 +13435,16 @@ table@^4.0.1: slice-ansi "1.0.0" string-width "^2.1.1" +table@^5.2.3: + version "5.4.1" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.1.tgz#0691ae2ebe8259858efb63e550b6d5f9300171e8" + integrity sha512-E6CK1/pZe2N75rGZQotFOdmzWQ1AILtgYbMAbAjvms0S1l5IDB47zG3nCnFGB/w+7nB3vKofbLXCH7HPBo864w== + dependencies: + ajv "^6.9.1" + lodash "^4.17.11" + slice-ansi "^2.1.0" + string-width "^3.0.0" + taffydb@2.7.2: version "2.7.2" resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.7.2.tgz#7bf8106a5c1a48251b3e3bc0a0e1732489fd0dc8" @@ -13334,7 +13572,7 @@ tether@^1.4.0: resolved "https://registry.yarnpkg.com/tether/-/tether-1.4.4.tgz#9dc6eb2b3e601da2098fd264e7f7a8b264de1125" integrity sha512-bagKeRRo3vEynHnO3GB7/jB3Q4YIf0mN7gXM/nR0wZvNHkPrwmZemg1w0C32JZP0prHZUwxGwoX5CdA7tuIDEw== -text-table@~0.2.0: +text-table@^0.2.0, text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= @@ -14246,6 +14484,13 @@ write-file-stdout@0.0.2: resolved "https://registry.yarnpkg.com/write-file-stdout/-/write-file-stdout-0.0.2.tgz#c252d7c7c5b1b402897630e3453c7bfe690d9ca1" integrity sha1-wlLXx8WxtAKJdjDjRTx7/mkNnKE= +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + write@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" From e406a6fc24a3bd65d8b870dca0131e64055effaa Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 22 Jun 2019 10:53:16 -0400 Subject: [PATCH 483/879] Travis tags latest and next appropriately --- .travis.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.travis.yml b/.travis.yml index 28e5f294e..8b24ccf27 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,6 +24,16 @@ install: notifications: email: false + +# Identifies `a.b.c-xxx.n` tags as pre-releases, and `a.b.c` as stable releases +before_deploy: | + function npm_dist_tag() { + if [[ "$TRAVIS_TAG" = *"-"* ]]; then + echo "next" + else + echo "latest" + fi + } jobs: fail_fast: true @@ -62,6 +72,7 @@ jobs: script: skip deploy: provider: npm + tag: $(npm_dist_tag) email: sam.selikoff@gmail.com api_key: secure: O6cP0nTiCbA+MuD6hRKdyyd6DWTFR/dc9klB10zXTnrwajjzLmenvvshPUv+F6lHCpb2SfrWW6cpFjZ61BPwKaaalF9u8encNkGlDYGtO77sWJu6LuJFeWPZnAC9rdAw4hPjz+gqTL+leeDMHzjB32VRqy2cpwFzet3e+W2eUuk= From ba1150598cd295e6b1bba6c824a9c4eb5b8f38b5 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 22 Jun 2019 12:22:16 -0400 Subject: [PATCH 484/879] v1.1.0-beta.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0e5db1dac..4487210f7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "1.0.0", + "version": "1.1.0-beta.1", "description": "A client-side server to help you build, test and demo your Ember app", "keywords": [ "ember-addon", From 2179d8fee92e906fbcee8c864f0813169479aa3c Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 22 Jun 2019 17:05:29 -0400 Subject: [PATCH 485/879] Bump miragejs-server to 0.1.5 (#1661) --- package.json | 2 +- yarn.lock | 15 +++++---------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 4487210f7..007b8ed73 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "prepare": "./scripts/link.sh" }, "dependencies": { - "@miragejs/server": "0.1.4", + "@miragejs/server": "0.1.5", "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^2.0.1", "broccoli-merge-trees": "^3.0.2", diff --git a/yarn.lock b/yarn.lock index 1eb88da7b..3b07c5985 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1077,10 +1077,10 @@ dependencies: core-js "^2.5.7" -"@miragejs/server@0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.4.tgz#6516afcf52027f0393e32a583bda4744b03c3d49" - integrity sha512-pbfVCKdaj5bzU7m2vH8WooQgrVRNIL35N4bQyZpNw80T6xotiH7MKYYAaTYH/YuvF3OgvvMqBWB1d0/arDusHA== +"@miragejs/server@0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.5.tgz#af1f66871fe97365859688ac7b389840a3a780dc" + integrity sha512-ND6wKD5134LODsbIh/mPMxoZmuiJrxWZuHE1LqTRFM8Sw5IGdigORmMY7GgPjU9orpzR+4miC45xnqc474CSow== dependencies: chalk "^2.4.2" eslint "^5.16.0" @@ -1427,12 +1427,7 @@ acorn@^5.0.0, acorn@^5.2.1, acorn@^5.4.0, acorn@^5.5.3, acorn@^5.6.2: resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== -acorn@^6.0.1, acorn@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" - integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== - -acorn@^6.0.7: +acorn@^6.0.1, acorn@^6.0.7, acorn@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== From 98a1d7fda342111947c9a31dbb43e032e19fbfff Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 22 Jun 2019 17:06:24 -0400 Subject: [PATCH 486/879] v1.1.0-beta.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 007b8ed73..27db78836 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "1.1.0-beta.1", + "version": "1.1.0-beta.2", "description": "A client-side server to help you build, test and demo your Ember app", "keywords": [ "ember-addon", From 8dcb8ab1bf093df85fec2bfb64342a259f007e50 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2019 01:25:38 -0400 Subject: [PATCH 487/879] build(deps-dev): bump qunit-dom from 0.8.5 to 0.9.0 (#1655) Bumps [qunit-dom](https://github.com/simplabs/qunit-dom) from 0.8.5 to 0.9.0. - [Release notes](https://github.com/simplabs/qunit-dom/releases) - [Changelog](https://github.com/simplabs/qunit-dom/blob/master/CHANGELOG.md) - [Commits](https://github.com/simplabs/qunit-dom/compare/v0.8.5...v0.9.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 27db78836..eb1bbf2f7 100644 --- a/package.json +++ b/package.json @@ -99,7 +99,7 @@ "jsdom": "^15.0.0", "loader.js": "^4.7.0", "marked": "^0.6.0", - "qunit-dom": "^0.8.4" + "qunit-dom": "^0.9.0" }, "resolutions": { "favicons": "5.3.0" diff --git a/yarn.lock b/yarn.lock index 3b07c5985..6ff7f639f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11818,10 +11818,10 @@ quick-temp@^0.1.0, quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quic rimraf "^2.5.4" underscore.string "~3.3.4" -qunit-dom@^0.8.4: - version "0.8.5" - resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-0.8.5.tgz#34b7cffb338e631c39955b21bdbe4d774090124e" - integrity sha512-I4GSy22ESUkoZYDSYsqFJoMvqhpmgd2iCYlrN7aWLEOdmumUkao3qz24/qVNZd1PAnoOQA78FefzNPRHePFx1A== +qunit-dom@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-0.9.0.tgz#99d15fffbf06059e543bb93dae8fe0a3f42a27b9" + integrity sha512-MvVEoCcf8BHVPD3gXg5GBfNy3JMZ3U3yOha4MB1rFs698EpvxMprOfC+NMEGvOF9Epm6GrsA0BFOdCKHd8Orrw== dependencies: broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.1" From 0fd4426b0f369ca3485d27a120b91b45f82e2990 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 26 Jun 2019 09:55:17 -0400 Subject: [PATCH 488/879] build(deps-dev): bump ember-source from 3.10.2 to 3.11.0 (#1663) Bumps [ember-source](https://github.com/emberjs/ember.js) from 3.10.2 to 3.11.0. - [Release notes](https://github.com/emberjs/ember.js/releases) - [Changelog](https://github.com/emberjs/ember.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember.js/compare/v3.10.2...v3.11.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index eb1bbf2f7..b3557d0db 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "ember-maybe-import-regenerator-for-testing": "^1.0.0", "ember-moment": "^7.8.1", "ember-resolver": "^5.0.1", - "ember-source": "~3.10.0", + "ember-source": "~3.11.0", "ember-source-channel-url": "^2.0.1", "ember-try": "^1.0.0", "escape-string-regexp": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index 6ff7f639f..9b35e62f4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6058,10 +6058,10 @@ ember-source-channel-url@^2.0.1: dependencies: got "^8.0.1" -ember-source@~3.10.0: - version "3.10.2" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.10.2.tgz#17a0405f1e470698f601622b3383cce7f80e2d31" - integrity sha512-7WRBikgS5riwO0DiBtKQDQhk80mqppMbghSAHXvfJAYpkGFxuH//MxjO1eRXP9xjzmdMhfDmixrMnNBtc5D6mA== +ember-source@~3.11.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.11.0.tgz#03515692782404ce3b2ca37d45a78af8e66c0cb9" + integrity sha512-88M+5xUQz03PKy1HyTfwykN7wtm6Ty4GHEnDPoe1JPXA+9tn33j+JpOyS8ga0i+Vpj5DkEJeXcckNadX9+9iBQ== dependencies: broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.2" @@ -6075,8 +6075,8 @@ ember-source@~3.10.0: ember-cli-version-checker "^3.1.3" ember-router-generator "^1.2.3" inflection "^1.12.0" - jquery "^3.3.1" - resolve "^1.10.0" + jquery "^3.4.1" + resolve "^1.10.1" ember-svg-jar@^1.2.2: version "1.2.2" @@ -8990,7 +8990,7 @@ jquery-deferred@^0.3.0: resolved "https://registry.yarnpkg.com/jquery-deferred/-/jquery-deferred-0.3.1.tgz#596eca1caaff54f61b110962b23cafea74c35355" integrity sha1-WW7KHKr/VPYbEQlisjyv6nTDU1U= -jquery@^3.3.1, jquery@^3.4.1: +jquery@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2" integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw== From a3fe6a8197a1a81ab683cdc5eb6ad1e7d37b9b1c Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 26 Jun 2019 11:44:04 -0400 Subject: [PATCH 489/879] Update ISSUE_TEMPLATE.md --- ISSUE_TEMPLATE.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index 9c856825b..b27bd17c7 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -4,14 +4,12 @@ If this is a feature request, add a 👠reaction to it. We use these to help us # Bug or question -If possible, please use the Mirage Boilerplate CodeSandbox to demonstrate your issue or bug: +If possible, please use the Mirage Boilerplate to demonstrate your issue or bug: -1. Open the Mirage Boilerplate CodeSandbox: - - https://codesandbox.io/s/003o6pq34n +1. Visit the [Ember CLI Mirage Boilerplate](https://github.com/samselikoff/ember-cli-mirage-boilerplate) repo 2. Click Fork -3. Reproduce your issue and save +3. Clone your fork locally, checkout a new branch, reproduce your issue and push -4. Include the URL to your Sandbox in your issue +4. Link to your branch in your issue From 62432513bf84aa9552316c4785bba3e66b732f16 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 26 Jun 2019 11:53:47 -0400 Subject: [PATCH 490/879] Update template.md --- .../dummy/app/pods/docs/data-layer/serializers/template.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/dummy/app/pods/docs/data-layer/serializers/template.md b/tests/dummy/app/pods/docs/data-layer/serializers/template.md index 81e2354e8..0c0460f72 100644 --- a/tests/dummy/app/pods/docs/data-layer/serializers/template.md +++ b/tests/dummy/app/pods/docs/data-layer/serializers/template.md @@ -211,11 +211,11 @@ The other serializers also have mechanisms controlling how related data can be l While most route handlers should return a Model or Collection instance, and leave the serialization logic up to the Serializer, sometimes it can be convenient to perform some final serialization logic directly in your route handler. -You can use the `this.serialize` helper method to do this. +You can use the `this.serialize` helper method to do this - make sure to use a `function` instead of a fat arrow so you have access to the correct `this`: ```js // mirage/config.js -this.get('/movies', (schema, request) => { +this.get('/movies', function(schema, request) { let movies = schema.movies.all(); let json = this.serialize(movies); @@ -231,7 +231,7 @@ You can also use a specific serializer if you have a special case by passing in ```js // mirage/config.js -this.get('/movies', (schema, request) => { +this.get('/movies', function(schema, request) { let movies = schema.movies.all(); let json = this.serialize(movies, 'movie-with-relationship'); From dcef77adced352d43d314ab484e47075018addb7 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 26 Jun 2019 16:22:27 -0400 Subject: [PATCH 491/879] Use lodash-es (#1666) --- addon/server.js | 3 +-- addon/start-mirage.js | 3 +-- addon/utils/ember-data.js | 4 +--- addon/utils/read-modules.js | 10 +++++----- package.json | 2 +- .../route-handlers/function-handler/serialize-test.js | 4 ++-- tests/integration/serializers/base/basic-test.js | 4 ++-- yarn.lock | 5 +++++ 8 files changed, 18 insertions(+), 17 deletions(-) diff --git a/addon/server.js b/addon/server.js index 855e502b2..2398840e8 100644 --- a/addon/server.js +++ b/addon/server.js @@ -1,7 +1,6 @@ import { Server } from '@miragejs/server'; import { getModels } from './ember-data'; import { hasEmberData } from './utils/ember-data'; -import _assign from 'lodash/assign'; export { defaultPassthroughs } from '@miragejs/server'; @@ -10,7 +9,7 @@ export default class EmberServer extends Server { constructor(options) { // Merge models from autogenerated Ember Data models with user defined models if (hasEmberData && options.discoverEmberDataModels) { - options.models = _assign({}, getModels(), options.models); + options.models = Object.assign({}, getModels(), options.models); } super(options); diff --git a/addon/start-mirage.js b/addon/start-mirage.js index 292f73a66..00b473c3c 100644 --- a/addon/start-mirage.js +++ b/addon/start-mirage.js @@ -1,7 +1,6 @@ import { getWithDefault } from '@ember/object'; import readModules from './utils/read-modules'; import Server from './server'; -import _assign from 'lodash/assign'; import { singularize, pluralize } from 'ember-inflector'; /** @@ -33,7 +32,7 @@ export default function startMirage(owner, { env, baseConfig, testConfig } = {}) let environment = env.environment; let discoverEmberDataModels = getWithDefault(env['ember-cli-mirage'] || {}, 'discoverEmberDataModels', true); let modules = readModules(env.modulePrefix); - let options = _assign(modules, {environment, baseConfig, testConfig, discoverEmberDataModels}); + let options = Object.assign(modules, {environment, baseConfig, testConfig, discoverEmberDataModels}); options.trackRequests = env['ember-cli-mirage'].trackRequests; options.inflector = { singularize, pluralize }; diff --git a/addon/utils/ember-data.js b/addon/utils/ember-data.js index a7a36355a..3ee05a9f7 100644 --- a/addon/utils/ember-data.js +++ b/addon/utils/ember-data.js @@ -1,10 +1,8 @@ /* global requirejs */ -import _find from 'lodash/find'; - function _hasEmberData() { let matchRegex = /^ember-data/i; - return !!_find(Object.keys(requirejs.entries), (e) => !!e.match(matchRegex)); + return !!(Object.keys(requirejs.entries).find(e => !!e.match(matchRegex))); } /** diff --git a/addon/utils/read-modules.js b/addon/utils/read-modules.js index 4aa8d3256..083fa7599 100644 --- a/addon/utils/read-modules.js +++ b/addon/utils/read-modules.js @@ -1,9 +1,9 @@ -/* global requirejs, require */ +/* global requirejs */ /* eslint-env node */ 'use strict'; import assert from '../assert'; -import _camelCase from 'lodash/camelCase'; +import { camelCase } from 'lodash-es'; import { pluralize } from '../utils/inflector'; import require from 'require'; @@ -18,7 +18,7 @@ export default function(prefix) { let modules = ['factories', 'fixtures', 'scenarios', 'models', 'serializers', 'identity-managers']; let mirageModuleRegExp = new RegExp(`^${prefix}/mirage/(${modules.join('|')})`); let modulesMap = modules.reduce((memo, name) => { - memo[_camelCase(name)] = {}; + memo[camelCase(name)] = {}; return memo; }, {}); @@ -29,7 +29,7 @@ export default function(prefix) { return; } let moduleParts = moduleName.split('/'); - let moduleType = _camelCase(moduleParts[moduleParts.length - 2]); + let moduleType = camelCase(moduleParts[moduleParts.length - 2]); let moduleKey = moduleParts[moduleParts.length - 1]; assert(`Subdirectories under ${moduleType} are not supported`, moduleParts[moduleParts.length - 3] === 'mirage'); @@ -53,7 +53,7 @@ export default function(prefix) { let data = module.default; - modulesMap[moduleType][_camelCase(moduleKey)] = data; + modulesMap[moduleType][camelCase(moduleKey)] = data; }); return modulesMap; diff --git a/package.json b/package.json index b3557d0db..306833e55 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "ember-cli-babel": "^7.5.0", "ember-get-config": "^0.2.2", "ember-inflector": "^2.0.0 || ^3.0.0", - "lodash": "^4.17.11", + "lodash-es": "^4.17.11", "pretender": "3.0.1" }, "devDependencies": { diff --git a/tests/integration/route-handlers/function-handler/serialize-test.js b/tests/integration/route-handlers/function-handler/serialize-test.js index 0b0eff84a..f49f98529 100644 --- a/tests/integration/route-handlers/function-handler/serialize-test.js +++ b/tests/integration/route-handlers/function-handler/serialize-test.js @@ -1,6 +1,6 @@ import { module, test } from 'qunit'; import { Server, Model, Collection, ActiveModelSerializer } from 'ember-cli-mirage'; -import _uniqBy from 'lodash/uniqBy'; +import { uniqBy } from 'lodash-es'; import promiseAjax from '../../../helpers/promise-ajax'; module('Integration | Route handlers | Function handler | #serialize', function(hooks) { @@ -135,7 +135,7 @@ module('Integration | Route handlers | Function handler | #serialize', function( this.server.get('/users', function(schema) { let users = schema.users.all().models; - let uniqueNames = _uniqBy(users, 'name'); + let uniqueNames = uniqBy(users, 'name'); let collection = new Collection('user', uniqueNames); let json = this.serialize(collection, 'sparse-user'); diff --git a/tests/integration/serializers/base/basic-test.js b/tests/integration/serializers/base/basic-test.js index dabef7757..8f4a14147 100644 --- a/tests/integration/serializers/base/basic-test.js +++ b/tests/integration/serializers/base/basic-test.js @@ -2,7 +2,7 @@ import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; import schemaHelper from '../schema-helper'; import { module, test } from 'qunit'; -import _uniqBy from 'lodash/uniqBy'; +import { uniqBy } from 'lodash-es'; module('Integration | Serializers | Base | Basic', function(hooks) { hooks.beforeEach(function() { @@ -79,7 +79,7 @@ module('Integration | Serializers | Base | Basic', function(hooks) { this.schema.wordSmiths.create({ name: 'Ganondorf' }); let wordSmiths = this.schema.wordSmiths.all().models; - let uniqueNames = _uniqBy(wordSmiths, 'name'); + let uniqueNames = uniqBy(wordSmiths, 'name'); let result = this.registry.serialize(uniqueNames); assert.deepEqual(result, uniqueNames); diff --git a/yarn.lock b/yarn.lock index 9b35e62f4..32807885e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9458,6 +9458,11 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" +lodash-es@^4.17.11: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.11.tgz#145ab4a7ac5c5e52a3531fb4f310255a152b4be0" + integrity sha512-DHb1ub+rMjjrxqlB3H56/6MXtm1lSksDp2rA2cNWjG8mlDUYFhUj3Di2Zn5IwSU87xLv8tNIQ7sSwE/YOX/D/Q== + lodash._baseassign@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" From 167b85529e7972bff84f3d22032a5dde873a21bb Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 28 Jun 2019 10:33:51 +0000 Subject: [PATCH 492/879] build(deps-dev): bump ember-source from 3.11.0 to 3.11.1 Bumps [ember-source](https://github.com/emberjs/ember.js) from 3.11.0 to 3.11.1. - [Release notes](https://github.com/emberjs/ember.js/releases) - [Changelog](https://github.com/emberjs/ember.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember.js/compare/v3.11.0...v3.11.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 32807885e..e0c43a19c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6059,9 +6059,9 @@ ember-source-channel-url@^2.0.1: got "^8.0.1" ember-source@~3.11.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.11.0.tgz#03515692782404ce3b2ca37d45a78af8e66c0cb9" - integrity sha512-88M+5xUQz03PKy1HyTfwykN7wtm6Ty4GHEnDPoe1JPXA+9tn33j+JpOyS8ga0i+Vpj5DkEJeXcckNadX9+9iBQ== + version "3.11.1" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.11.1.tgz#2318fbe600c88d3a8abbf56fc2f3a61645ee42d8" + integrity sha512-FPHHHu/5FBbKQ3o1D2HXEIniBUVqG1N4vDB66BaP0ht2ZcO6EB3HMjGxVH8Ad3Of8QOcXtZrBfXDHZdIWLW4lQ== dependencies: broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.2" From 0d22054a69cd7c53e70b98a0316c175c771bf7c7 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2019 10:50:27 +0000 Subject: [PATCH 493/879] build(deps-dev): bump ember-cli-htmlbars from 3.0.1 to 3.1.0 Bumps [ember-cli-htmlbars](https://github.com/ember-cli/ember-cli-htmlbars) from 3.0.1 to 3.1.0. - [Release notes](https://github.com/ember-cli/ember-cli-htmlbars/releases) - [Commits](https://github.com/ember-cli/ember-cli-htmlbars/compare/v3.0.1...v3.1.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 78 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 45 insertions(+), 33 deletions(-) diff --git a/yarn.lock b/yarn.lock index e0c43a19c..d3be847a6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1179,6 +1179,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.41.tgz#e57c3152eb2e7ec748c733cebd0c095b437c5d37" integrity sha512-sPZWEbFMz6qAy9SLY7jh5cgepmsiwqUUHjvEm8lpU6kug2hmmcyuTnwhoGw/GWpI5Npue4EqvsiQQI0eWjW/ZA== +"@types/symlink-or-copy@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@types/symlink-or-copy/-/symlink-or-copy-1.2.0.tgz#4151a81b4052c80bc2becbae09f3a9ec010a9c7a" + integrity sha512-Lja2xYuuf2B3knEsga8ShbOdsfNOtzT73GyJmZyY7eGl2+ajOqrs8yM5ze0fsSoYwvA6bw7/Qr7OZ7PEEmYwWg== + "@types/tmp@^0.0.33": version "0.0.33" resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.0.33.tgz#1073c4bc824754ae3d10cfab88ab0237ba964e4d" @@ -3146,15 +3151,15 @@ broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-p symlink-or-copy "^1.0.1" walk-sync "^0.3.1" -broccoli-persistent-filter@^2.0.0, broccoli-persistent-filter@^2.1.0, broccoli-persistent-filter@^2.1.1, broccoli-persistent-filter@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.2.2.tgz#e0180e75ede5dd05d4c702f24f6c049e93fba915" - integrity sha512-PW12RD1yY+x5SASUADuUMJce+dVSmjBO3pV1rLNHmT1C31rp1P++TvX7AgUObFmGhL7qlwviSdhMbBkY1v3G2w== +broccoli-persistent-filter@^2.0.0, broccoli-persistent-filter@^2.1.0, broccoli-persistent-filter@^2.1.1, broccoli-persistent-filter@^2.2.1, broccoli-persistent-filter@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.3.1.tgz#4a052e0e0868b344c3a2977e35a3d497aa9eca72" + integrity sha512-hVsmIgCDrl2NFM+3Gs4Cr2TA6UPaIZip99hN8mtkaUPgM8UeVnCbxelCvBjUBHo0oaaqP5jzqqnRVvb568Yu5g== dependencies: async-disk-cache "^1.2.1" async-promise-queue "^1.0.3" broccoli-plugin "^1.0.0" - fs-tree-diff "^1.0.2" + fs-tree-diff "^2.0.0" hash-for-dep "^1.5.0" heimdalljs "^0.2.1" heimdalljs-logger "^0.1.7" @@ -3163,6 +3168,7 @@ broccoli-persistent-filter@^2.0.0, broccoli-persistent-filter@^2.1.0, broccoli-p rimraf "^2.6.1" rsvp "^4.7.0" symlink-or-copy "^1.0.1" + sync-disk-cache "^1.3.3" walk-sync "^1.0.0" broccoli-plugin@1.1.0: @@ -5377,13 +5383,13 @@ ember-cli-htmlbars@^2.0.1, ember-cli-htmlbars@^2.0.2: strip-bom "^3.0.0" ember-cli-htmlbars@^3.0.0, ember-cli-htmlbars@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-3.0.1.tgz#01e21f0fd05e0a6489154f26614b1041769e3e58" - integrity sha512-pyyB2s52vKTXDC5svU3IjU7GRLg2+5O81o9Ui0ZSiBS14US/bZl46H2dwcdSJAK+T+Za36ZkQM9eh1rNwOxfoA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-3.1.0.tgz#87806c2a0bca2ab52d4fb8af8e2215c1ca718a99" + integrity sha512-cgvRJM73IT0aePUG7oQ/afB7vSRBV3N0wu9BrWhHX2zkR7A7cUBI7KC9VPk6tbctCXoM7BRGsCC4aIjF7yrfXA== dependencies: - broccoli-persistent-filter "^1.4.3" - hash-for-dep "^1.2.3" - json-stable-stringify "^1.0.0" + broccoli-persistent-filter "^2.3.1" + hash-for-dep "^1.5.1" + json-stable-stringify "^1.0.1" strip-bom "^3.0.0" ember-cli-import-polyfill@^0.2.0: @@ -7510,6 +7516,17 @@ fs-tree-diff@^1.0.0, fs-tree-diff@^1.0.2: path-posix "^1.0.0" symlink-or-copy "^1.1.8" +fs-tree-diff@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-2.0.1.tgz#343e4745ab435ec39ebac5f9059ad919cd034afa" + integrity sha512-x+CfAZ/lJHQqwlD64pYM5QxWjzWhSjroaVsr8PW831zOApL55qPibed0c+xebaLWVr2BnHFoHdrwOv8pzt8R5A== + dependencies: + "@types/symlink-or-copy" "^1.2.0" + heimdalljs-logger "^0.1.7" + object-assign "^4.1.0" + path-posix "^1.0.0" + symlink-or-copy "^1.1.8" + fs-updater@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/fs-updater/-/fs-updater-1.0.4.tgz#2329980f99ae9176e9a0e84f7637538a182ce63b" @@ -8046,28 +8063,7 @@ hash-base@^3.0.0: inherits "^2.0.1" safe-buffer "^5.0.1" -hash-for-dep@^1.0.2, hash-for-dep@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.2.3.tgz#5ec69fca32c23523972d52acb5bb65ffc3664cab" - integrity sha512-NE//rDaCFpWHViw30YM78OAGBShU+g4dnUGY3UWGyEzPOGYg/ptOjk32nEc+bC1xz+RfK5UIs6lOL6eQdrV4Ow== - dependencies: - broccoli-kitchen-sink-helpers "^0.3.1" - heimdalljs "^0.2.3" - heimdalljs-logger "^0.1.7" - resolve "^1.4.0" - -hash-for-dep@^1.4.7: - version "1.4.7" - resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.4.7.tgz#ea6f9d8e2f9e784fc48ca60c40ea886bdb41aa54" - integrity sha512-nz0Ttg6U7vx8Ec4ai4niocpJYD76fm9L1n/d2dIt4lH+s0T+TPgwaxgYkQ3S3R7ZxDyiNedYwRtdzqL29FQyTw== - dependencies: - broccoli-kitchen-sink-helpers "^0.3.1" - heimdalljs "^0.2.3" - heimdalljs-logger "^0.1.7" - path-root "^0.1.1" - resolve "^1.4.0" - -hash-for-dep@^1.5.0: +hash-for-dep@^1.0.2, hash-for-dep@^1.2.3, hash-for-dep@^1.4.7, hash-for-dep@^1.5.0, hash-for-dep@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.5.1.tgz#497754b39bee2f1c4ade4521bfd2af0a7c1196e3" integrity sha512-/dQ/A2cl7FBPI2pO0CANkvuuVi/IFS5oTyJ0PsOb6jW6WbVW1js5qJXMJTNbWHXBIPdFTWFbabjB+mE0d+gelw== @@ -13428,6 +13424,17 @@ symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.8, symlink- resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.2.0.tgz#5d49108e2ab824a34069b68974486c290020b393" integrity sha512-W31+GLiBmU/ZR02Ii0mVZICuNEN9daZ63xZMPDsYgPgNjMtg+atqLEGI7PPI936jYSQZxoLb/63xos8Adrx4Eg== +sync-disk-cache@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/sync-disk-cache/-/sync-disk-cache-1.3.3.tgz#481933461623fdc2bdf46cfc87872ba215a7e246" + integrity sha512-Kp7DFemXDPRUbFW856CKamtX7bJuThZPa2dwnK2RfNqMew7Ah8xDc52SdooNlfN8oydDdDHlBPLsXTrtmA7HKw== + dependencies: + debug "^2.1.3" + heimdalljs "^0.2.3" + mkdirp "^0.5.0" + rimraf "^2.2.8" + username-sync "^1.0.2" + table@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" @@ -14092,6 +14099,11 @@ username-sync@1.0.1: resolved "https://registry.yarnpkg.com/username-sync/-/username-sync-1.0.1.tgz#1cde87eefcf94b8822984d938ba2b797426dae1f" integrity sha1-HN6H7vz5S4gimE2Ti6K3l0Jtrh8= +username-sync@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/username-sync/-/username-sync-1.0.2.tgz#0a3697909fb7b5768d29e2921f573acfdd427592" + integrity sha512-ayNkOJdoNSGNDBE46Nkc+l6IXmeugbzahZLSMkwvgRWv5y5ZqNY2IrzcgmkR4z32sj1W3tM3TuTUMqkqBzO+RA== + username@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/username/-/username-1.0.1.tgz#e1f72295e3e58e06f002c6327ce06897a99cd67f" From 44ccb37792ded8108b907394c973ec7c6dbdf08b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2019 10:51:09 +0000 Subject: [PATCH 494/879] build(deps-dev): bump marked from 0.6.2 to 0.6.3 Bumps [marked](https://github.com/markedjs/marked) from 0.6.2 to 0.6.3. - [Release notes](https://github.com/markedjs/marked/releases) - [Commits](https://github.com/markedjs/marked/compare/v0.6.2...v0.6.3) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index e0c43a19c..81f873704 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10074,9 +10074,9 @@ marked@^0.5.0: integrity sha512-iUkBZegCZou4AdwbKTwSW/lNDcz5OuRSl3qdcl31Ia0B2QPG0Jn+tKblh/9/eP9/6+4h27vpoh8wel/vQOV0vw== marked@^0.6.0: - version "0.6.2" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.6.2.tgz#c574be8b545a8b48641456ca1dbe0e37b6dccc1a" - integrity sha512-LqxwVH3P/rqKX4EKGz7+c2G9r98WeM/SW34ybhgNGhUQNKtf1GmmSkJ6cDGJ/t6tiyae49qRkpyTw2B9HOrgUA== + version "0.6.3" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.6.3.tgz#79babad78af638ba4d522a9e715cdfdd2429e946" + integrity sha512-Fqa7eq+UaxfMriqzYLayfqAE40WN03jf+zHjT18/uXNuzjq3TY0XTbrAoPeqSJrAmPz11VuUA+kBPYOhHt9oOQ== match-media@^0.2.0: version "0.2.0" From 804311039d51b14675c291f1bc8acaa20a4809c0 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2019 10:44:10 +0000 Subject: [PATCH 495/879] build(deps): bump ember-inflector from 3.0.0 to 3.0.1 Bumps [ember-inflector](https://github.com/emberjs/ember-inflector) from 3.0.0 to 3.0.1. - [Release notes](https://github.com/emberjs/ember-inflector/releases) - [Changelog](https://github.com/emberjs/ember-inflector/blob/v3.0.1/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember-inflector/compare/v3.0.0...v3.0.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index f8f5682f7..2da3d9f38 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5919,9 +5919,9 @@ ember-inflector@^2.0.0: ember-cli-babel "^6.0.0" "ember-inflector@^2.0.0 || ^3.0.0", ember-inflector@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-3.0.0.tgz#7e1ee8aaa0fa773ba0905d8b7c0786354d890ee1" - integrity sha512-tLWfYolZAkLnkTvvBkjizy4Wmj8yI8wqHZFK+leh0iScHiC3r1Yh5C4qO+OMGiBTMLwfTy+YqVoE/Nu3hGNkcA== + version "3.0.1" + resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-3.0.1.tgz#04be6df4d7e4000f6d6bd70787cdc995f77be4ab" + integrity sha512-fngrwMsnhkBt51KZgwNwQYxgURwV4lxtoHdjxf7RueGZ5zM7frJLevhHw7pbQNGqXZ3N+MRkhfNOLkdDK9kFdA== dependencies: ember-cli-babel "^6.6.0" From 8cd3d0afc4b9d94124090f1a59fa93750aa4630b Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 2 Jul 2019 09:14:52 -0400 Subject: [PATCH 496/879] Fixing default links (#1672) Closes #1637 --- package.json | 2 +- .../associations/links-test.js | 41 ++++++++++++++++++- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 306833e55..efed1c64a 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "prepare": "./scripts/link.sh" }, "dependencies": { - "@miragejs/server": "0.1.5", + "@miragejs/server": "0.1.7", "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^2.0.1", "broccoli-merge-trees": "^3.0.2", diff --git a/tests/integration/serializers/json-api-serializer/associations/links-test.js b/tests/integration/serializers/json-api-serializer/associations/links-test.js index 074dfe986..fd5bf397c 100644 --- a/tests/integration/serializers/json-api-serializer/associations/links-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/links-test.js @@ -1,5 +1,5 @@ import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import { Model, hasMany, belongsTo, JSONAPISerializer } from 'ember-cli-mirage'; +import { Server, Model, hasMany, belongsTo, JSONAPISerializer, ActiveModelSerializer } from 'ember-cli-mirage'; import { module, test } from 'qunit'; import Db from 'ember-cli-mirage/db'; import Schema from 'ember-cli-mirage/orm/schema'; @@ -129,4 +129,43 @@ module('Integration | Serializers | JSON API Serializer | Associations | Links', } }); }); + + test('[regression] it works when using a named serializer, relationships, and a non-JSONAPISerializer for the base', async function(assert) { + let server = new Server({ + serializers: { + application: ActiveModelSerializer, + userV2: JSONAPISerializer + }, + + models: { + user: Model.extend({ + posts: hasMany() + }), + post: Model.extend() + }, + + baseConfig() { + this.get('/users', function(schema) { + let json = this.serialize(schema.users.find(1), 'userV2'); + + return json; + }); + } + }); + + server.create('user'); + + let res = await fetch('/users'); + let json = await res.json(); + + assert.deepEqual( + json, + { + "data": { + "attributes": {}, + "id": "1", + "type": "users" + } + }); + }); }); From 95de637549671ed3f5e31b84e8d4f876ca49fec2 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 3 Jul 2019 10:30:28 +0000 Subject: [PATCH 497/879] build(deps-dev): bump eslint-plugin-ember from 6.6.0 to 6.7.1 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 6.6.0 to 6.7.1. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v6.6.0...v6.7.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 65 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 54 insertions(+), 11 deletions(-) diff --git a/yarn.lock b/yarn.lock index 2da3d9f38..fd8c1b0fd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1077,17 +1077,18 @@ dependencies: core-js "^2.5.7" -"@miragejs/server@0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.5.tgz#af1f66871fe97365859688ac7b389840a3a780dc" - integrity sha512-ND6wKD5134LODsbIh/mPMxoZmuiJrxWZuHE1LqTRFM8Sw5IGdigORmMY7GgPjU9orpzR+4miC45xnqc474CSow== +"@miragejs/server@0.1.7": + version "0.1.7" + resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.7.tgz#92c9ba4aea0931c51625535155c2188cf66a08c5" + integrity sha512-AbtaYKPgSBwPaPozfgLktYMyM1kbq50i+5LhP2IsWAUgmH2hGi21xxgaqlGFDLMbIO6Z+O2NaP36n9xiahnX7A== dependencies: chalk "^2.4.2" eslint "^5.16.0" inflected "^2.0.4" - lodash "^4.17.11" + lodash-es "^4.17.11" pretender "3.0.1" prettier "^1.18.2" + rollup-plugin-async "^1.2.0" "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" @@ -1791,6 +1792,15 @@ async-promise-queue@^1.0.3, async-promise-queue@^1.0.4: async "^2.4.1" debug "^2.6.8" +async-to-gen@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/async-to-gen/-/async-to-gen-1.4.0.tgz#f8157f9013e0c487e1e940150a4d1a1b78b2dd6b" + integrity sha1-+BV/kBPgxIfh6UAVCk0aG3iy3Ws= + dependencies: + babylon "^6.14.0" + magic-string "^0.22.0" + pirates "^3.0.2" + async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -2488,7 +2498,7 @@ babel6-plugin-strip-heimdall@^6.0.1: resolved "https://registry.yarnpkg.com/babel6-plugin-strip-heimdall/-/babel6-plugin-strip-heimdall-6.0.1.tgz#35f80eddec1f7fffdc009811dfbd46d9965072b6" integrity sha1-NfgO3ewff//cAJgR371G2ZZQcrY= -babylon@6.18.0, babylon@^6.18.0: +babylon@6.18.0, babylon@^6.14.0, babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== @@ -6388,9 +6398,9 @@ eslint-plugin-ember-suave@^1.0.0: requireindex "~1.1.0" eslint-plugin-ember@^6.2.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-6.6.0.tgz#fa64f0e9fbbe14ae44478b5fa3890fb74d720e5e" - integrity sha512-vqRAyGMtuohMe+cnxiPYIF73gC2Rlei0GX/TAAAIXIJH8E98TFQkOHAhzF6u/6l6W5XRVuTKOlXyPJzRY+kJwQ== + version "6.7.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-6.7.1.tgz#be11e3b9b8f38227b81d90b11792a395322a9b4f" + integrity sha512-5qzd/5zjXRVlyWpDcRRaIdl6yAHLrUCUyNE71pnk3Egs/erqQazyQHjKKToIWjTA1a7ba/WEC72tJ8HbLsevhA== dependencies: ember-rfc176-data "^0.3.9" snake-case "^2.1.0" @@ -6603,6 +6613,11 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= +estree-walker@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e" + integrity sha1-va/oCVOD2EFNXcLs9MkXO225QS4= + estree-walker@^0.5.0, estree-walker@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.2.tgz#d3850be7529c9580d815600b53126515e146dd39" @@ -9965,9 +9980,9 @@ lunr@^2.3.3: resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.5.tgz#7b510bad57e948dfb99a71fdff00c1bf9171bdda" integrity sha512-EtnfmHsHJTr3u24sito9JctSxej5Ds0SgUD2Lm+qRHyLgM7BGesFlW14eNh1mil0fV5Muh8gf3dBBXzADlUlzQ== -magic-string@^0.22.4: +magic-string@^0.22.0, magic-string@^0.22.4: version "0.22.5" - resolved "http://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e" integrity sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w== dependencies: vlq "^0.2.2" @@ -10658,6 +10673,11 @@ node-modules-path@^1.0.1: resolved "https://registry.yarnpkg.com/node-modules-path/-/node-modules-path-1.0.2.tgz#e3acede9b7baf4bc336e3496b58e5b40d517056e" integrity sha512-6Gbjq+d7uhkO7epaKi5DNgUJn7H0gEyA4Jg0Mo1uQOi3Rk50G83LtmhhFyw0LxnAFhtlspkiiw52ISP13qzcBg== +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + node-notifier@^5.0.1: version "5.2.1" resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" @@ -11403,6 +11423,13 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= +pirates@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-3.0.2.tgz#7e6f85413fd9161ab4e12b539b06010d85954bb9" + integrity sha512-c5CgUJq6H2k6MJz72Ak1F5sN9n9wlSlJyEnwvpm9/y3WB4E3pHBDT2c6PEiS1vyJvq2bUxUAIu0EGf8Cx4Ic7Q== + dependencies: + node-modules-regexp "^1.0.0" + pixelmatch@^4.0.0, pixelmatch@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854" @@ -12435,6 +12462,14 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +rollup-plugin-async@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-async/-/rollup-plugin-async-1.2.0.tgz#f95fdd29f8b6f2332b5a89a9d64ee8087b12b249" + integrity sha1-+V/dKfi28jMrWomp1k7oCHsSskk= + dependencies: + async-to-gen "^1.2.0" + rollup-pluginutils "^1.5.1" + rollup-plugin-commonjs@^8.3.0: version "8.4.1" resolved "http://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.4.1.tgz#5c9cea2b2c3de322f5fbccd147e07ed5e502d7a0" @@ -12455,6 +12490,14 @@ rollup-plugin-node-resolve@^3.3.0: is-module "^1.0.0" resolve "^1.1.6" +rollup-pluginutils@^1.5.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408" + integrity sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg= + dependencies: + estree-walker "^0.2.1" + minimatch "^3.0.2" + rollup-pluginutils@^2.0.1: version "2.3.3" resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.3.3.tgz#3aad9b1eb3e7fe8262820818840bf091e5ae6794" From aaa189a6bdf11b64f3b1fad244f1d38c145acee7 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2019 10:43:59 +0000 Subject: [PATCH 498/879] build(deps): bump ember-auto-import from 1.4.1 to 1.5.0 Bumps [ember-auto-import](https://github.com/ef4/ember-auto-import) from 1.4.1 to 1.5.0. - [Release notes](https://github.com/ef4/ember-auto-import/releases) - [Changelog](https://github.com/ef4/ember-auto-import/blob/master/CHANGELOG.md) - [Commits](https://github.com/ef4/ember-auto-import/commits) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 279 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 218 insertions(+), 61 deletions(-) diff --git a/yarn.lock b/yarn.lock index fd8c1b0fd..c6a25ab01 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,18 +9,18 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.3.3", "@babel/core@^7.3.4": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.3.tgz#198d6d3af4567be3989550d97e068de94503074f" - integrity sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA== +"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.2.2", "@babel/core@^7.3.3", "@babel/core@^7.3.4": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.0.tgz#6ed6a2881ad48a732c5433096d96d1b0ee5eb734" + integrity sha512-6Isr4X98pwXqHvtigw71CKgmhL1etZjPs5A67jL/w0TkLM9eqmFR40YrnJvEc1WnMZFsskjsmid8bHZyxKEAnw== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.4.0" - "@babel/helpers" "^7.4.3" - "@babel/parser" "^7.4.3" - "@babel/template" "^7.4.0" - "@babel/traverse" "^7.4.3" - "@babel/types" "^7.4.0" + "@babel/generator" "^7.5.0" + "@babel/helpers" "^7.5.0" + "@babel/parser" "^7.5.0" + "@babel/template" "^7.4.4" + "@babel/traverse" "^7.5.0" + "@babel/types" "^7.5.0" convert-source-map "^1.1.0" debug "^4.1.0" json5 "^2.1.0" @@ -29,12 +29,12 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.0.tgz#c230e79589ae7a729fd4631b9ded4dc220418196" - integrity sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ== +"@babel/generator@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.0.tgz#f20e4b7a91750ee8b63656073d843d2a736dca4a" + integrity sha512-1TTVrt7J9rcG5PMjvO7VEG3FrEoEJNHxumRq66GemPmzboLWtIjjcJgk8rokuAS7IiRSpgVSu5Vb9lc99iJkOA== dependencies: - "@babel/types" "^7.4.0" + "@babel/types" "^7.5.0" jsesc "^2.5.1" lodash "^4.17.11" source-map "^0.5.0" @@ -214,6 +214,13 @@ dependencies: "@babel/types" "^7.4.0" +"@babel/helper-split-export-declaration@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" + integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== + dependencies: + "@babel/types" "^7.4.4" + "@babel/helper-wrap-function@^7.1.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" @@ -224,14 +231,14 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.2.0" -"@babel/helpers@^7.4.3": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.3.tgz#7b1d354363494b31cb9a2417ae86af32b7853a3b" - integrity sha512-BMh7X0oZqb36CfyhvtbSmcWc3GXocfxv3yNsAEuM0l+fAqSO22rQrUpijr3oE/10jCTrB6/0b9kzmG4VetCj8Q== +"@babel/helpers@^7.5.0": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.5.1.tgz#65407c741a56ddd59dd86346cd112da3de912db3" + integrity sha512-rVOTDv8sH8kNI72Unenusxw6u+1vEepZgLxeV+jHkhsQlYhzVhzL1EpfoWT7Ub3zpWSv2WV03V853dqsnyoQzA== dependencies: - "@babel/template" "^7.4.0" - "@babel/traverse" "^7.4.3" - "@babel/types" "^7.4.0" + "@babel/template" "^7.4.4" + "@babel/traverse" "^7.5.0" + "@babel/types" "^7.5.0" "@babel/highlight@^7.0.0": version "7.0.0" @@ -247,15 +254,10 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.4.tgz#a43357e4bbf4b92a437fb9e465c192848287f27c" integrity sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ== -"@babel/parser@^7.4.0": - version "7.4.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.2.tgz#b4521a400cb5a871eab3890787b4bc1326d38d91" - integrity sha512-9fJTDipQFvlfSVdD/JBtkiY0br9BtfvW2R8wo6CX/Ej2eMuV0gWPk1M67Mt3eggQvBqYW1FCEk8BN7WvGm/g5g== - -"@babel/parser@^7.4.3": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.3.tgz#eb3ac80f64aa101c907d4ce5406360fe75b7895b" - integrity sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ== +"@babel/parser@^7.3.4", "@babel/parser@^7.4.4", "@babel/parser@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.0.tgz#3e0713dff89ad6ae37faec3b29dcfc5c979770b7" + integrity sha512-I5nW8AhGpOXGCCNYGc+p7ExQIBxRFnS2fd/d862bNOKvmoEPjYPcfIjsfdy0ujagYOIYPczKgD9l3FsgTkAzKA== "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" @@ -330,6 +332,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-dynamic-import@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" + integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" @@ -662,34 +671,34 @@ "@babel/parser" "^7.2.2" "@babel/types" "^7.2.2" -"@babel/template@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.0.tgz#12474e9c077bae585c5d835a95c0b0b790c25c8b" - integrity sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw== +"@babel/template@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" + integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.4.0" - "@babel/types" "^7.4.0" + "@babel/parser" "^7.4.4" + "@babel/types" "^7.4.4" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.2.3", "@babel/traverse@^7.4.0", "@babel/traverse@^7.4.3": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.3.tgz#1a01f078fc575d589ff30c0f71bf3c3d9ccbad84" - integrity sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ== +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.2.3", "@babel/traverse@^7.2.4", "@babel/traverse@^7.3.4", "@babel/traverse@^7.4.0", "@babel/traverse@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.0.tgz#4216d6586854ef5c3c4592dab56ec7eb78485485" + integrity sha512-SnA9aLbyOCcnnbQEGwdfBggnc142h/rbqqsXcaATj2hZcegCl903pUD/lfpsNBlBSuWow/YDfRyJuWi2EPR5cg== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.4.0" + "@babel/generator" "^7.5.0" "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.0" - "@babel/parser" "^7.4.3" - "@babel/types" "^7.4.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.5.0" + "@babel/types" "^7.5.0" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.11" -"@babel/types@^7.0.0", "@babel/types@^7.1.5", "@babel/types@^7.1.6", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.0.tgz#670724f77d24cce6cc7d8cf64599d511d164894c" - integrity sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA== +"@babel/types@^7.0.0", "@babel/types@^7.1.5", "@babel/types@^7.1.6", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.2", "@babel/types@^7.3.4", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.0.tgz#e47d43840c2e7f9105bc4d3a2c371b4d0c7832ab" + integrity sha512-UFpDVqRABKsW01bvw7/wSUe56uy6RXM5+VJibVVAybDGxEW25jdwiFJEf7ASvSaC7sN7rbE/l3cLp2izav+CtQ== dependencies: esutils "^2.0.2" lodash "^4.17.11" @@ -739,6 +748,52 @@ ember-cli-babel "^6.12.0" ember-cli-htmlbars-inline-precompile "^1.0.0" +"@embroider/core@0.4.3", "@embroider/core@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@embroider/core/-/core-0.4.3.tgz#117973b9761d68aee14d820bbaefeb05d5984ba8" + integrity sha512-n24WU/dGuGDqZrljWoX8raK2wFX3R8iJG0rfCWx+1kW87IvB+ZgS3j4KiZ/S788BA07udrYsrgecYnciG2bBMg== + dependencies: + "@babel/core" "^7.2.2" + "@babel/parser" "^7.3.4" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" + "@babel/traverse" "^7.3.4" + "@babel/types" "^7.3.4" + "@embroider/macros" "0.4.3" + assert-never "^1.1.0" + babel-plugin-syntax-dynamic-import "^6.18.0" + broccoli-persistent-filter "^2.2.2" + broccoli-plugin "^1.3.0" + broccoli-source "^1.1.0" + debug "^3.1.0" + fast-sourcemap-concat "^1.4.0" + filesize "^4.1.2" + fs-extra "^7.0.1" + fs-tree-diff "^2.0.0" + handlebars "^4.0.11" + js-string-escape "^1.0.1" + jsdom "^12.0.0" + json-stable-stringify "^1.0.1" + lodash "^4.17.10" + pkg-up "^2.0.0" + resolve "^1.8.1" + resolve-package-path "^1.2.2" + semver "^5.5.0" + strip-bom "^3.0.0" + typescript-memoize "^1.0.0-alpha.3" + walk-sync "^1.1.3" + +"@embroider/macros@0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.4.3.tgz#ea5604b8bd578520f15886a428a6c4fa9481abc0" + integrity sha512-vq/Ny2ULpKxq60Sv5usSrz651dXFM5phP/O5G5MWDY8YOodIkRLGqtub34sB0OmwxpCuTntUzl9P/I4wkyQ3Kw== + dependencies: + "@babel/core" "^7.2.2" + "@babel/traverse" "^7.2.4" + "@babel/types" "^7.3.2" + "@embroider/core" "0.4.3" + resolve "^1.8.1" + semver "^5.6.0" + "@glimmer/compiler@^0.38.0": version "0.38.0" resolved "https://registry.yarnpkg.com/@glimmer/compiler/-/compiler-0.38.0.tgz#fde12464feef3f3c82ef6a0cab1813074f34a5a4" @@ -1393,7 +1448,7 @@ acorn-globals@^1.0.4: dependencies: acorn "^2.1.0" -acorn-globals@^4.1.0, acorn-globals@^4.3.2: +acorn-globals@^4.1.0, acorn-globals@^4.3.0, acorn-globals@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.2.tgz#4e2c2313a597fd589720395f6354b41cd5ec8006" integrity sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ== @@ -1438,6 +1493,11 @@ acorn@^6.0.1, acorn@^6.0.7, acorn@^6.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== +acorn@^6.0.2: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.2.0.tgz#67f0da2fc339d6cfb5d6fb244fd449f33cd8bbe3" + integrity sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw== + active-model-adapter@^2.0.3: version "2.2.0" resolved "https://registry.yarnpkg.com/active-model-adapter/-/active-model-adapter-2.2.0.tgz#6885d6968574809f17f398c499b688a921c30f91" @@ -1724,6 +1784,11 @@ asn1@~0.2.3: resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" integrity sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y= +assert-never@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/assert-never/-/assert-never-1.2.0.tgz#e6597ed9e357f7e62c074dfa7c71e30ed7b67a8b" + integrity sha512-61QPxh2lfV5j2dBsEtwhz8/sUj+baAIuCpQxeWorGeMxlTkbeyGyq7igxJB8yij1JdzUhyoiekNHMXrMYnkjvA== + assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" @@ -2054,6 +2119,16 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" +babel-loader@^8.0.6: + version "8.0.6" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" + integrity sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw== + dependencies: + find-cache-dir "^2.0.0" + loader-utils "^1.0.2" + mkdirp "^0.5.1" + pify "^4.0.1" + babel-messages@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" @@ -3161,7 +3236,7 @@ broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-p symlink-or-copy "^1.0.1" walk-sync "^0.3.1" -broccoli-persistent-filter@^2.0.0, broccoli-persistent-filter@^2.1.0, broccoli-persistent-filter@^2.1.1, broccoli-persistent-filter@^2.2.1, broccoli-persistent-filter@^2.3.1: +broccoli-persistent-filter@^2.0.0, broccoli-persistent-filter@^2.1.0, broccoli-persistent-filter@^2.1.1, broccoli-persistent-filter@^2.2.1, broccoli-persistent-filter@^2.2.2, broccoli-persistent-filter@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.3.1.tgz#4a052e0e0868b344c3a2977e35a3d497aa9eca72" integrity sha512-hVsmIgCDrl2NFM+3Gs4Cr2TA6UPaIZip99hN8mtkaUPgM8UeVnCbxelCvBjUBHo0oaaqP5jzqqnRVvb568Yu5g== @@ -4390,6 +4465,11 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +core-js@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" + integrity sha1-TekR5mew6ukSTjQlS1OupvxhjT4= + core-js@^2.4.0, core-js@^2.5.0: version "2.5.3" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" @@ -4558,6 +4638,11 @@ cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0", "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.6: resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.6.tgz#f85206cee04efa841f3c5982a74ba96ab20d65ad" integrity sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A== +cssom@^0.3.4, cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + "cssstyle@>= 0.2.29 < 0.3.0": version "0.2.37" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" @@ -4572,6 +4657,13 @@ cssstyle@^1.0.0, cssstyle@^1.2.2: dependencies: cssom "0.3.x" +cssstyle@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.3.0.tgz#c36c466f7037fd30f03baa271b65f0f17b50585c" + integrity sha512-wXsoRfsRfsLVNaVzoKdqvEmK/5PFaEXNspVT22Ots6K/cnJdpoDKuQFw+qlMiXnmaif1OgeC466X1zISgAOcGg== + dependencies: + cssom "~0.3.6" + ctype@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/ctype/-/ctype-0.5.3.tgz#82c18c2461f74114ef16c135224ad0b9144ca12f" @@ -4601,7 +4693,7 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -data-urls@^1.0.0, data-urls@^1.1.0: +data-urls@^1.0.0, data-urls@^1.0.1, data-urls@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== @@ -5005,14 +5097,16 @@ ember-assign-polyfill@~2.4.0: ember-cli-version-checker "^2.0.0" ember-auto-import@^1.2.19: - version "1.4.1" - resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.4.1.tgz#a2a602168f1446422e8ef8a8431667bb771b35c1" - integrity sha512-n1D0Xom6eWbg156lXAqSprf8RK85PLmCQj1Q8eUNHq7lhfFizYnwQ7ODcTJy6MR4/xrtim+SnfPHd6f3FFHtDQ== + version "1.5.0" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.5.0.tgz#371580c21f105cf1ada735039a92eb65c58819d0" + integrity sha512-cTx+XGt2EiO/DjpLwXclMOazl2Fl/hC8ajfrhg3767RW8QUxgEs8VTKS1YUs/KcFLKJbe4lrpxw8Az1hYxCsgw== dependencies: "@babel/core" "^7.1.6" "@babel/traverse" "^7.1.6" "@babel/types" "^7.1.6" + "@embroider/core" "^0.4.3" babel-core "^6.26.3" + babel-loader "^8.0.6" babel-plugin-syntax-dynamic-import "^6.18.0" babel-template "^6.26.0" babylon "^6.18.0" @@ -5031,6 +5125,7 @@ ember-auto-import@^1.2.19: resolve "^1.7.1" rimraf "^2.6.2" symlink-or-copy "^1.2.0" + typescript-memoize "^1.0.0-alpha.3" walk-sync "^0.3.3" webpack "~4.28" @@ -6352,7 +6447,7 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escodegen@^1.11.1, escodegen@^1.6.1, escodegen@^1.9.1: +escodegen@^1.11.0, escodegen@^1.11.1, escodegen@^1.6.1, escodegen@^1.9.1: version "1.11.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510" integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw== @@ -7186,6 +7281,11 @@ filesize@^3.6.1: resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== +filesize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-4.1.2.tgz#fcd570af1353cea97897be64f56183adb995994b" + integrity sha512-iSWteWtfNcrWQTkQw8ble2bnonSl7YJImsn9OZKpE2E4IHhXI78eASpDYUljXZZdYj36QsEKjOs/CsiDqmKMJw== + fill-range@^2.1.0: version "2.2.4" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" @@ -7495,7 +7595,7 @@ fs-extra@^6.0.1: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^7.0.0: +fs-extra@^7.0.0, fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== @@ -9089,6 +9189,37 @@ jsdom@^11.12.0: ws "^5.2.0" xml-name-validator "^3.0.0" +jsdom@^12.0.0: + version "12.2.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-12.2.0.tgz#7cf3f5b5eafd47f8f09ca52315d367ff6e95de23" + integrity sha512-QPOggIJ8fquWPLaYYMoh+zqUmdphDtu1ju0QGTitZT1Yd8I5qenPpXM1etzUegu3MjVp8XPzgZxdn8Yj7e40ig== + dependencies: + abab "^2.0.0" + acorn "^6.0.2" + acorn-globals "^4.3.0" + array-equal "^1.0.0" + cssom "^0.3.4" + cssstyle "^1.1.1" + data-urls "^1.0.1" + domexception "^1.0.1" + escodegen "^1.11.0" + html-encoding-sniffer "^1.0.2" + nwsapi "^2.0.9" + parse5 "5.1.0" + pn "^1.1.0" + request "^2.88.0" + request-promise-native "^1.0.5" + saxes "^3.1.3" + symbol-tree "^3.2.2" + tough-cookie "^2.4.3" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + ws "^6.1.0" + xml-name-validator "^3.0.0" + jsdom@^15.0.0: version "15.1.1" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.1.1.tgz#21ed01f81d95ef4327f3e564662aef5e65881252" @@ -9434,7 +9565,7 @@ loader-runner@^2.3.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@^1.1.0: +loader-utils@^1.0.2, loader-utils@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== @@ -10829,7 +10960,7 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" integrity sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ== -nwsapi@^2.0.7, nwsapi@^2.1.4: +nwsapi@^2.0.7, nwsapi@^2.0.9, nwsapi@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f" integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw== @@ -12379,7 +12510,7 @@ resolve-package-path@^1.0.11: path-root "^0.1.1" resolve "^1.10.0" -resolve-package-path@^1.2.6: +resolve-package-path@^1.2.2, resolve-package-path@^1.2.6: version "1.2.7" resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-1.2.7.tgz#2a7bc37ad96865e239330e3102c31322847e652e" integrity sha512-fVEKHGeK85bGbVFuwO9o1aU0n3vqQGrezPc51JGu9UTXpFQfWq5qCeKxyaRUSvephs+06c5j5rPq/dzHGEo8+Q== @@ -12673,6 +12804,13 @@ sax@>=0.6.0, sax@^1.1.4, sax@^1.2.4, sax@~1.2.1: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +saxes@^3.1.3: + version "3.1.11" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" + integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== + dependencies: + xmlchars "^2.1.1" + saxes@^3.1.9: version "3.1.9" resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.9.tgz#c1c197cd54956d88c09f960254b999e192d7058b" @@ -13831,7 +13969,7 @@ tough-cookie@>=0.12.0, tough-cookie@^3.0.1: psl "^1.1.28" punycode "^2.1.1" -tough-cookie@^2.2.0, tough-cookie@^2.3.3, tough-cookie@^2.3.4: +tough-cookie@^2.2.0, tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@^2.4.3: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== @@ -13945,6 +14083,13 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typescript-memoize@^1.0.0-alpha.3: + version "1.0.0-alpha.3" + resolved "https://registry.yarnpkg.com/typescript-memoize/-/typescript-memoize-1.0.0-alpha.3.tgz#699a5415f886694a8d6e2e5451bc28a39a6bc2f9" + integrity sha1-aZpUFfiGaUqNbi5UUbwoo5prwvk= + dependencies: + core-js "2.4.1" + uc.micro@^1.0.0, uc.micro@^1.0.1, uc.micro@^1.0.3, uc.micro@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376" @@ -14574,6 +14719,13 @@ ws@^5.2.0: dependencies: async-limiter "~1.0.0" +ws@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + ws@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/ws/-/ws-7.0.1.tgz#1a04e86cc3a57c03783f4910fdb090cf31b8e165" @@ -14636,6 +14788,11 @@ xmlchars@^1.3.1: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-1.3.1.tgz#1dda035f833dbb4f86a0c28eaa6ca769214793cf" integrity sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw== +xmlchars@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.1.1.tgz#ef1a81c05bff629c2280007f12daca21bd6f6c93" + integrity sha512-7hew1RPJ1iIuje/Y01bGD/mXokXxegAgVS+e+E0wSi2ILHQkYAH1+JXARwTjZSM4Z4Z+c73aKspEcqj+zPPL/w== + xmldom@^0.1.19: version "0.1.27" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" From ef6dff401f681d34a06c153600f11fd73281e8aa Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 9 Jul 2019 17:05:16 -0400 Subject: [PATCH 499/879] Bump mirage (#1678) --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index efed1c64a..9dae59008 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "prepare": "./scripts/link.sh" }, "dependencies": { - "@miragejs/server": "0.1.7", + "@miragejs/server": "0.1.8", "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^2.0.1", "broccoli-merge-trees": "^3.0.2", diff --git a/yarn.lock b/yarn.lock index c6a25ab01..9545b05e2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1132,10 +1132,10 @@ dependencies: core-js "^2.5.7" -"@miragejs/server@0.1.7": - version "0.1.7" - resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.7.tgz#92c9ba4aea0931c51625535155c2188cf66a08c5" - integrity sha512-AbtaYKPgSBwPaPozfgLktYMyM1kbq50i+5LhP2IsWAUgmH2hGi21xxgaqlGFDLMbIO6Z+O2NaP36n9xiahnX7A== +"@miragejs/server@0.1.8": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.8.tgz#bb7a5627381a0430f8cc3d0903b61735ba4c162c" + integrity sha512-0OTVVrOBFDR9kmap9MRhcSx9gK0ZpS2aPH65d56HT1J88Dcm7YHaNyLowkuG5p9dd16qbSe9yz21INjlB9syFA== dependencies: chalk "^2.4.2" eslint "^5.16.0" From 1de59ea555acbb30b5802758612dd3ba58e1e060 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 10 Jul 2019 08:11:17 -0400 Subject: [PATCH 500/879] Add docs on models and relationships, and bump server (#1679) Closes https://github.com/samselikoff/ember-cli-mirage/issues/1665 --- addon/server.js | 3 + package.json | 2 +- .../pods/docs/data-layer/models/template.md | 111 +++++++++ .../app/pods/docs/data-layer/orm/template.md | 10 +- .../docs/data-layer/relationships/template.md | 216 ++++++++++++++++++ tests/dummy/app/pods/docs/template.hbs | 4 +- tests/dummy/app/router.js | 2 + yarn.lock | 8 +- 8 files changed, 343 insertions(+), 13 deletions(-) create mode 100644 tests/dummy/app/pods/docs/data-layer/models/template.md create mode 100644 tests/dummy/app/pods/docs/data-layer/relationships/template.md diff --git a/addon/server.js b/addon/server.js index 2398840e8..8d2c0c48d 100644 --- a/addon/server.js +++ b/addon/server.js @@ -4,6 +4,9 @@ import { hasEmberData } from './utils/ember-data'; export { defaultPassthroughs } from '@miragejs/server'; +/** + @hide +*/ export default class EmberServer extends Server { constructor(options) { diff --git a/package.json b/package.json index 9dae59008..0537fa9bd 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "prepare": "./scripts/link.sh" }, "dependencies": { - "@miragejs/server": "0.1.8", + "@miragejs/server": "0.1.9", "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^2.0.1", "broccoli-merge-trees": "^3.0.2", diff --git a/tests/dummy/app/pods/docs/data-layer/models/template.md b/tests/dummy/app/pods/docs/data-layer/models/template.md new file mode 100644 index 000000000..6e2d56963 --- /dev/null +++ b/tests/dummy/app/pods/docs/data-layer/models/template.md @@ -0,0 +1,111 @@ +# Models + +To take advantage of the ORM, Mirage needs to know about your application's models and their relationships. This section will teach you how to define and work with your models, and the next will discuss relationships. + +**Note that if your Ember application uses Ember Data, Mirage will automatically discover your models and their relationships**, so you don’t need to define any files within Mirage yourself. + +As a clarifying point, Mirage model instances only exist within Mirage's server, and are never shared directly with your Ember app or rendered directly in components. They exist solely to help you manage the data and relationships in your fake backend, but are serialized as a JSON string before they are sent over to your Ember app. + +## Defining models + +To define a model, you can use the generator: + +```sh +ember g mirage-model blog-post +``` + +This creates a file under `/mirage/models`: + +```js +// mirage/models/blog-post.js +import { Model } from 'ember-cli-mirage'; + +export default Model; +``` + +## Creating models + +To create models, access the model's collection via the `schema` object, which is available in your route handlers: + +```js +this.post('/blog-posts', function(schema) { + let attrs = this.normalizedRequestAttrs(); + + schema.blogPosts.create(attrs); +}); +``` + +or as `server.schema` directly off of your Mirage server instance: + +```js +// scenarios/default.js +export default function(server) { + server.schema.blogPosts.create({ title: 'Lorem ipsum' }); +} +``` + +Note that the collection is the pluralized form of the model's model name (the `models/blog-post.js` definition from above creates a `schema.blogPosts` collection). + +Outside of route handlers, you'll typically create models using Factories via `server.create` + +```js +// scenarios/default.js +export default function(server) { + server.create('blog-post'); +} +``` + +which delegates to the collection's `create` method under the hood. We'll talk more about creating data using Factories later in these guides. + + +## Accessing models + +To access your models, use the various query methods from the model's collection. + +For example, use `all()` to return all known models: + +```js +this.get('/blog-posts', (schema, request) => { + return schema.blogPosts.all(); +}); +``` + +Here are some other common query methods: + +```js +schema.blogPosts.find(1); +schema.blogPosts.first(); +schema.blogPosts.where({ isPublished: true }); +schema.blogPosts.findBy({ title: 'Introduction' }); +``` + +Check out the {{docs-link 'Schema API docs' 'docs.api.item' 'modules/lib/orm/schema~Schema'}} to see all available query methods. + + +## Updating and deleting models + +Once you're working with an instance of a model, there are other properties and methods you'll have access to. + +For example, you can update a model: + +```js +let post = schema.blogPosts.find(1); + +post.update({ author: 'Obi-Wan' }); +``` + +or delete one: + +```js +let post = schema.blogPosts.find(2); + +post.destroy(); +``` + +View the {{docs-link 'Model API docs' 'docs.api.item' 'modules/lib/orm/model~Model'}} to see all the available fields and methods for model instances. + +--- + +Once your Models have been defined, the next step is to define the relationships between them, so you can really start to leverage the power of Mirage's ORM. + +Let's talk about how to do that next. diff --git a/tests/dummy/app/pods/docs/data-layer/orm/template.md b/tests/dummy/app/pods/docs/data-layer/orm/template.md index b57560993..cdd30bf2a 100644 --- a/tests/dummy/app/pods/docs/data-layer/orm/template.md +++ b/tests/dummy/app/pods/docs/data-layer/orm/template.md @@ -1,4 +1,4 @@ -# The ORM +# Why an ORM? Mirage originally shipped with just a database as its data layer. While helpful, users still had to write a lot of code to reproduce their modern, complex backends. In particular, dealing with relationships was a big pain point. @@ -394,10 +394,6 @@ The ORM allows Mirage to abstract all this bookkeeping away from your code, and --- -These are some of the main problems addressed by Mirage's ORM. Generally, when Mirage knows about your application's models and their relationships, it can take on more of the responsibility of configuring your mock server. +These are some of the main problems addressed by Mirage's ORM. Generally, when Mirage knows about your application's schema, it can take on more of the responsibility of configuring your mock server. -Be sure to check out the {{docs-link 'Schema' 'docs.api.item' 'modules/ember-cli-mirage/orm/schema~Schema'}}, {{docs-link 'Model' 'docs.api.item' 'modules/ember-cli-mirage/orm/model~Model'}} and {{docs-link 'Collection' 'docs.api.item' 'modules/ember-cli-mirage/orm/collection~Collection'}} API docs to learn about all the available ORM methods, as well as the {{docs-link 'Association' 'docs.api.item' 'modules/ember-cli-mirage/orm/associations/association~Association'}} docs to see what methods are added by belongsTo and hasMany relationships. - -We'll also cover Serializers in these guides, where you'll learn how to customize the serialized forms of your models and collections to match your production API. - -Next, let's take a look at Factories, which also leverage the ORM to make it easy to create the relational data needed to put your server in a variety of states. +Next, we'll take a look at how to actually define your models and their relationships in Mirage. diff --git a/tests/dummy/app/pods/docs/data-layer/relationships/template.md b/tests/dummy/app/pods/docs/data-layer/relationships/template.md new file mode 100644 index 000000000..c71d6e06f --- /dev/null +++ b/tests/dummy/app/pods/docs/data-layer/relationships/template.md @@ -0,0 +1,216 @@ +# Relationships + +Once you've defined your models, you can define relationships between them using the `belongsTo` and `hasMany` helpers. Each helper adds some dynamic methods to your model. + +Just as another reminder, if you use Ember Data and have models and relationships defined there, you don't need to define any relationships within your Mirage folder, as those will be automatically discovered and set up for you. + +## belongsTo + +To define a to-one relationship, import the `belongsTo` helper and define a new property on a model that points to another model: + +```js +// mirage/models/blog-post.js +import { Model, belongsTo } from 'ember-cli-mirage'; + +export default Model.extend({ + author: belongsTo() +}); +``` + +This defines a `belongsTo` relationship to an `Author` model. + +The `belongsTo` helper adds several new properties and methods to your models. + +In this case, our `blog-post` model would now have an `authorId` property, as well as some methods for working with the associated `author` model: + +```js +blogPost.authorId; // 1 +blogPost.authorId = 2; // updates the relationship +blogPost.author; // Author instance +blogPost.author = anotherAuthor; +blogPost.newAuthor(attrs); // new unsaved author +blogPost.createAuthor(attrs); // new saved author (updates blogPost.authorId in memory only) +``` + +Note that when a child calls `child.createParent`, the new parent is immediately saved to the `db`, but the child's foreign key is updated *on this instance only*, and is not immediately persisted to the database. + +In other words, `blogPost.createAuthor` will create a new `author` record, insert it into the `db`, and update the `blogPost.authorId` in memory, but if you were to fetch the `blogPost` from the `db` again, the relationship would not be persisted. + +To persist the new foreign key, you would call `blogPost.save()` after creating the new author. + +## hasMany + +To define a to-many relationship, use the `hasMany` helper: + +```js +// mirage/models/blog-post.js +import { Model, hasMany } from 'ember-cli-mirage'; + +export default Model.extend({ + comments: hasMany() +}); +``` + +This helper adds a `commentIds` property to the `blogPost` model, as well as some methods for working with the associated `comments` collection: + +```js +blogPost.commentIds; // [1, 2, 3] +blogPost.commentIds = [2, 3]; // updates the relationship +blogPost.comments; // array of related comments +blogPost.comments = [comment1, comment2]; // updates the relationship +blogPost.newComment(attrs); // new unsaved comment +blogPost.createComment(attrs); // new saved comment (comment.blogPostId is set) +``` + +## Association options + +### modelName + +If your associations model has a different name than the association itself, you can specify the `modelName` on the association. + +For example, + +```js +// mirage/models/blog-post.js +import { Model, belongsTo, hasMany } from 'ember-cli-mirage'; + +export default Model.extend({ + + author: belongsTo('user'), + comments: hasMany('annotation') + +}); +``` + +would add all the named `author` and `comment` methods as listed above, but use `user` and `annotation` models for the actual relationships. + +### inverse + +Often, relationships can be inverses of each other. + +For example, say we had the following two models: + +```js +// blog-post.js +export default Model.extend({ + comments: hasMany() +}); + +// comment.js +export default Model.extend({ + blogPost: belongsTo() +}); +``` + +In this case, `blogPost.comments` would point to a collection of Comment models, and each one of those Comment models would have a `comment.blogPost` relationship that pointed back to the original post. + +Mirage will often be able to infer that two relationships on two different models are inverses of each other, but sometimes you'll need to be explicit. This typically happens if a model has two relationships that point to the same model type. + +For example, suppose we had the following schema: + +```js +// user.js +export default Model.extend({ + blogPosts: hasMany() +}); + +// blog-post.js +export default Model.extend({ + author: belongsTo('user'), + reviewer: belongsTo('user') +}); +``` + +In this case, Mirage doesn't know which relationship (`blogPost.author` or `blogPost.reviewer`) should by synchronized with the parent's `user.blogPosts` collection. So, you can specify which one by using the `inverse` option: + +```js +// user.js +export default Model.extend({ + blogPosts: hasMany() +}); + +// blog-post.js +export default Model.extend({ + author: belongsTo('user', { inverse: 'blogPosts' }), + reviewer: belongsTo('user', { inverse: null }) +}); +``` + +Now, if a blog post is added to `user.blogPosts`, that post's `author` will be correctly set. + +### polymorphic + +You can specify whether an association is a polymorphic association by passing `{ polymorphic: true }` as an option. + +For example, say you have a `Comment` that can belong to a `BlogPost` or a `Picture`. Here's how the model definitions would look: + +```js +// app/models/comment.js +export default Model.extend({ + commentable: belongsTo({ polymorphic: true }) +}); + +// app/models/blog-post.js +export default Model.extend({ + comments: hasMany() +}); + +// app/models/picture.js +export default Model.extend({ + comments: hasMany() +}); +``` + +Note that `commentable` doesn't need a type (there's no validation done on which types of models can exist on that association). + +Polymorphic associations have slightly different method signatures for their foreign keys and build/create methods. + +```js +let comment = schema.comments.create({ text: "foo" }); + +comment.buildCommentable('post', { title: 'Lorem Ipsum' }); +comment.createCommentable('post', { title: 'Lorem Ipsum' }); + +// getter +comment.commentableId; // { id: 1, type: 'blog-post' } + +// setter +comment.commentableId = { id: 2, type: 'picture' }; +``` + +Has-many asssociations can also be polymorphic: + +```js +// app/models/user.js +export default Model.extend({ + things: hasMany({ polymorphic: true }) +}); + +// app/models/car.js +export default Model.extend({ +}); + +// app/models/watch.js +export default Model.extend({ +}); + +let user = schema.users.create({ name: "Sam" }); + +user.buildThing('car', { attrs }); +user.createThing('watch', { attrs }); + +// getter +user.thingIds; // [ { id: 1, type: 'car' }, { id: 3, type: 'watch' }, ... ] + +// setter +user.thingIds = [ { id: 2, type: 'watch' }, ... ]; +``` + + +--- + +Be sure to check out the {{docs-link 'Schema' 'docs.api.item' 'modules/lib/orm/schema~Schema'}}, {{docs-link 'Model' 'docs.api.item' 'modules/lib/orm/model~Model'}} and {{docs-link 'Collection' 'docs.api.item' 'modules/lib/orm/collection~Collection'}} API docs to learn about all the available ORM methods. + +We'll also cover Serializers in these guides, where you'll learn how to customize the serialized forms of your models and collections to match your production API. + +Next, let's take a look at Factories, which leverage your new Model and Relationship definitions to make it easy to create graphs of relational data. diff --git a/tests/dummy/app/pods/docs/template.hbs b/tests/dummy/app/pods/docs/template.hbs index 6f937956e..35f5740ca 100644 --- a/tests/dummy/app/pods/docs/template.hbs +++ b/tests/dummy/app/pods/docs/template.hbs @@ -13,7 +13,9 @@ {{nav.section "Data layer"}} {{nav.item "The Database" "docs.data-layer.database"}} - {{nav.item "The ORM" "docs.data-layer.orm"}} + {{nav.item "Why an ORM?" "docs.data-layer.orm"}} + {{nav.item "Models" "docs.data-layer.models"}} + {{nav.item "Relationships" "docs.data-layer.relationships"}} {{nav.item "Factories" "docs.data-layer.factories"}} {{nav.item "Fixtures" "docs.data-layer.fixtures"}} {{nav.item "Serializers" "docs.data-layer.serializers"}} diff --git a/tests/dummy/app/router.js b/tests/dummy/app/router.js index ffe3c5623..27cf7ecc4 100644 --- a/tests/dummy/app/router.js +++ b/tests/dummy/app/router.js @@ -23,6 +23,8 @@ Router.map(function() { this.route('data-layer', function() { this.route('database'); this.route('orm'); + this.route('models'); + this.route('relationships'); this.route('factories'); this.route('fixtures'); this.route('serializers'); diff --git a/yarn.lock b/yarn.lock index 9545b05e2..bd3f7603a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1132,10 +1132,10 @@ dependencies: core-js "^2.5.7" -"@miragejs/server@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.8.tgz#bb7a5627381a0430f8cc3d0903b61735ba4c162c" - integrity sha512-0OTVVrOBFDR9kmap9MRhcSx9gK0ZpS2aPH65d56HT1J88Dcm7YHaNyLowkuG5p9dd16qbSe9yz21INjlB9syFA== +"@miragejs/server@0.1.9": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.9.tgz#98fb8efa7ed8f76e50b702df63ea950fe74b1c63" + integrity sha512-EEgnyeEoo38cx9sSrcleHmMlXq/4/6EOkT56wMJwviThTyxMLoJN06dUamsxaCVVEbsVZqlP0Km7hhmHhEOXEg== dependencies: chalk "^2.4.2" eslint "^5.16.0" From 6ba037128977869248c07639b570119b905cb032 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 10 Jul 2019 08:11:28 -0400 Subject: [PATCH 501/879] [closes #1632] Clarify pre-3.0 test setup (#1680) --- tests/dummy/app/pods/docs/testing/acceptance-tests/template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md b/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md index b51e8b043..7f51222b1 100644 --- a/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md +++ b/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md @@ -23,7 +23,7 @@ Assuming you're using Application Tests (introduced in [Ember 3.0](https://ember }); ``` -(Pre-3.0 style tests will automatically boot Mirage via an initializer.) +(If you are using pre-3.0 style tests, Mirage should boot automatically via an initializer. The only other difference is that Mirage is accessed via `server`, a global, whereas in 3.0-style tests Mirage is accessed via `this.server`. The rest of this guide will assume 3.0-style tests, but you can just use `server` in place of `this.server` and the rest of the documentation applies the same.) Now we can run your Ember app's test suite with `ember t -s`. From 919f39fba5c6c87365c4596bad6eabc719eb853c Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 10 Jul 2019 08:13:01 -0400 Subject: [PATCH 502/879] Remove marked --- package.json | 1 - yarn.lock | 5 ----- 2 files changed, 6 deletions(-) diff --git a/package.json b/package.json index 0537fa9bd..ad33afcfe 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,6 @@ "js-yaml": "^3.12.1", "jsdom": "^15.0.0", "loader.js": "^4.7.0", - "marked": "^0.6.0", "qunit-dom": "^0.9.0" }, "resolutions": { diff --git a/yarn.lock b/yarn.lock index bd3f7603a..1b5e259b1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10215,11 +10215,6 @@ marked@^0.5.0: resolved "https://registry.yarnpkg.com/marked/-/marked-0.5.1.tgz#062f43b88b02ee80901e8e8d8e6a620ddb3aa752" integrity sha512-iUkBZegCZou4AdwbKTwSW/lNDcz5OuRSl3qdcl31Ia0B2QPG0Jn+tKblh/9/eP9/6+4h27vpoh8wel/vQOV0vw== -marked@^0.6.0: - version "0.6.3" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.6.3.tgz#79babad78af638ba4d522a9e715cdfdd2429e946" - integrity sha512-Fqa7eq+UaxfMriqzYLayfqAE40WN03jf+zHjT18/uXNuzjq3TY0XTbrAoPeqSJrAmPz11VuUA+kBPYOhHt9oOQ== - match-media@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/match-media/-/match-media-0.2.0.tgz#ea4e09742e7253cc7d7e1599ba627e0fa29fbc50" From 5798447a204ba11967a27bd0538cafa84ca6da96 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 10 Jul 2019 08:18:19 -0400 Subject: [PATCH 503/879] v1.1.0-beta.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ad33afcfe..e966b8693 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "1.1.0-beta.2", + "version": "1.1.0-beta.3", "description": "A client-side server to help you build, test and demo your Ember app", "keywords": [ "ember-addon", From b80c65a567c45729b1cba056e98f39f85367883e Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 10 Jul 2019 08:37:23 -0400 Subject: [PATCH 504/879] Remove template lint --- package.json | 1 - yarn.lock | 170 +++------------------------------------------------ 2 files changed, 7 insertions(+), 164 deletions(-) diff --git a/package.json b/package.json index e966b8693..1ad310cde 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,6 @@ "ember-cli-qunit": "^4.4.0", "ember-cli-release": "^0.2.9", "ember-cli-sri": "^2.1.1", - "ember-cli-template-lint": "^1.0.0-beta.1", "ember-cli-uglify": "^3.0.0", "ember-composable-helpers": "^2.1.0", "ember-data": "~3.10.0", diff --git a/yarn.lock b/yarn.lock index 1b5e259b1..9229363b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -794,16 +794,6 @@ resolve "^1.8.1" semver "^5.6.0" -"@glimmer/compiler@^0.38.0": - version "0.38.0" - resolved "https://registry.yarnpkg.com/@glimmer/compiler/-/compiler-0.38.0.tgz#fde12464feef3f3c82ef6a0cab1813074f34a5a4" - integrity sha512-qxQzeuRrD0qR3cJorz8GzhP6A1jgio/THLHj6nhdZu4Rv+Nch6ooQkqIK+6AzvaBknoOT7h+QCSTGJWMHG/jzQ== - dependencies: - "@glimmer/interfaces" "^0.38.0" - "@glimmer/syntax" "^0.38.0" - "@glimmer/util" "^0.38.0" - "@glimmer/wire-format" "^0.38.0" - "@glimmer/di@^0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@glimmer/di/-/di-0.2.0.tgz#73bfd4a6ee4148a80bf092e8a5d29bcac9d4ce7e" @@ -821,14 +811,6 @@ dependencies: "@glimmer/wire-format" "^0.36.5" -"@glimmer/interfaces@^0.38.0": - version "0.38.0" - resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.38.0.tgz#dea320d1c0b5bd210e4d1119da081993ce766171" - integrity sha512-5/STOfFFg7+4Plr2AhJfhMqOmtGv9k6YvQFEavM1+7UwlHyz+WCOQL+11t3ov4Ngn8X4apkq21gPblhsMdp/Nw== - dependencies: - "@glimmer/wire-format" "^0.38.0" - "@simple-dom/interface" "1.4.0" - "@glimmer/resolver@^0.4.1": version "0.4.2" resolved "https://registry.yarnpkg.com/@glimmer/resolver/-/resolver-0.4.2.tgz#60c9b492e90bc3956ac82b3134649bd337e1651c" @@ -846,26 +828,11 @@ handlebars "^4.0.6" simple-html-tokenizer "^0.5.6" -"@glimmer/syntax@^0.38.0": - version "0.38.0" - resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.38.0.tgz#5270839ecc3f6fff80c1cbfdad0d0c9413c84445" - integrity sha512-fAlQS0NioN/MW63AC/g6+AlIj4c3NjHDnUVeCQDy3WczV47YU42U/j4jNyDeTh5rAYp2vz/JRXeJ9RVc1NfUNw== - dependencies: - "@glimmer/interfaces" "^0.38.0" - "@glimmer/util" "^0.38.0" - handlebars "^4.0.6" - simple-html-tokenizer "^0.5.6" - "@glimmer/util@^0.36.5": version "0.36.5" resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.36.5.tgz#829f393ef0bf791df5b287f104f0fd76e456182c" integrity sha512-RcDsxxuKGnIc6Ro6wZGFMUZ/E8L3Rbcd5E5F2WOSa59RYHel146fhQtctGrpGxQUZwfxMEMs91GJIaKeukd84g== -"@glimmer/util@^0.38.0": - version "0.38.0" - resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.38.0.tgz#c4b6817df8900ab29c4e26768b81315255d76b60" - integrity sha512-QIyh79A9soXVnamYJlGX6Be5NtBUQEIb8NrIk1JCrI7WTjJ/Z6tfXkhb4kRXjbxh2KMvEfOlBjjHZm1FLeOB/g== - "@glimmer/wire-format@^0.36.5": version "0.36.5" resolved "https://registry.yarnpkg.com/@glimmer/wire-format/-/wire-format-0.36.5.tgz#6713c95fbdc23c2e4dcc946e16452ded5cc17447" @@ -873,13 +840,6 @@ dependencies: "@glimmer/util" "^0.36.5" -"@glimmer/wire-format@^0.38.0": - version "0.38.0" - resolved "https://registry.yarnpkg.com/@glimmer/wire-format/-/wire-format-0.38.0.tgz#db77a9b4867c84fd0fec7490ed0e481df769c47a" - integrity sha512-sxNpQ2V0q2rKuJA+ScJTyc0din/7yF+V6CD9F/BBmeP8Cah+SdHpziMIhvT8gwJCMj/ySUTWSy7l/yGSLObiVA== - dependencies: - "@glimmer/util" "^0.38.0" - "@jimp/bmp@^0.5.4": version "0.5.4" resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.5.4.tgz#b7b375aa774f26154912569864d5466e71333ef1" @@ -1145,19 +1105,6 @@ prettier "^1.18.2" rollup-plugin-async "^1.2.0" -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== - dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" - -"@nodelib/fs.stat@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== - "@simple-dom/document@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@simple-dom/document/-/document-1.4.0.tgz#af60855f957f284d436983798ef1006cca1a1678" @@ -1165,7 +1112,7 @@ dependencies: "@simple-dom/interface" "^1.4.0" -"@simple-dom/interface@1.4.0", "@simple-dom/interface@^1.4.0": +"@simple-dom/interface@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@simple-dom/interface/-/interface-1.4.0.tgz#e8feea579232017f89b0138e2726facda6fbb71f" integrity sha512-l5qumKFWU0S+4ZzMaLXFU8tQZsicHEMEyAxI5kDFGhJsRqDwe0a7/iPA/GdxlGyDKseQQAgIz5kzU7eXTrlSpA== @@ -1206,21 +1153,7 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -"@types/events@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== - -"@types/glob@^7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" - integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== - dependencies: - "@types/events" "*" - "@types/minimatch" "*" - "@types/node" "*" - -"@types/minimatch@*", "@types/minimatch@^3.0.3": +"@types/minimatch@^3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== @@ -1733,7 +1666,7 @@ array-to-sentence@^1.1.0: resolved "https://registry.yarnpkg.com/array-to-sentence/-/array-to-sentence-1.1.0.tgz#c804956dafa53232495b205a9452753a258d39fc" integrity sha1-yASVba+lMjJJWyBalFJ1OiWNOfw= -array-union@^1.0.1, array-union@^1.0.2: +array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= @@ -3236,7 +3169,7 @@ broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-p symlink-or-copy "^1.0.1" walk-sync "^0.3.1" -broccoli-persistent-filter@^2.0.0, broccoli-persistent-filter@^2.1.0, broccoli-persistent-filter@^2.1.1, broccoli-persistent-filter@^2.2.1, broccoli-persistent-filter@^2.2.2, broccoli-persistent-filter@^2.3.1: +broccoli-persistent-filter@^2.0.0, broccoli-persistent-filter@^2.1.1, broccoli-persistent-filter@^2.2.1, broccoli-persistent-filter@^2.2.2, broccoli-persistent-filter@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.3.1.tgz#4a052e0e0868b344c3a2977e35a3d497aa9eca72" integrity sha512-hVsmIgCDrl2NFM+3Gs4Cr2TA6UPaIZip99hN8mtkaUPgM8UeVnCbxelCvBjUBHo0oaaqP5jzqqnRVvb568Yu5g== @@ -3743,11 +3676,6 @@ calculate-cache-key-for-tree@^1.1.0, calculate-cache-key-for-tree@^1.2.0: dependencies: json-stable-stringify "^1.0.1" -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= - caller-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" @@ -4902,13 +4830,6 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" -dir-glob@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" - integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== - dependencies: - path-type "^3.0.0" - doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" @@ -5654,23 +5575,6 @@ ember-cli-tailwind@^0.6.2: rollup-plugin-node-resolve "^3.3.0" tailwindcss "^0.6.1" -ember-cli-template-lint@^1.0.0-beta.1: - version "1.0.0-beta.3" - resolved "https://registry.yarnpkg.com/ember-cli-template-lint/-/ember-cli-template-lint-1.0.0-beta.3.tgz#48f2fa43e7ad0172685fa171e5acd4d75b873792" - integrity sha512-ivrvYih+cx7VUlyyMQBmk61Ki+gT5axfppWrk6fSvHaoxHZadXU3zRJMT5DPkeRaayRu0y1dls4wqfrUhzQ1PA== - dependencies: - aot-test-generators "^0.1.0" - broccoli-concat "^3.7.1" - broccoli-persistent-filter "^2.1.0" - chalk "^2.4.1" - debug "^4.0.1" - ember-cli-version-checker "^3.0.1" - ember-template-lint "^1.1.0" - json-stable-stringify "^1.0.1" - md5-hex "^2.0.0" - strip-ansi "^4.0.0" - walk-sync "^1.1.3" - ember-cli-test-info@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-test-info/-/ember-cli-test-info-1.0.0.tgz#ed4e960f249e97523cf891e4aed2072ce84577b4" @@ -5719,7 +5623,7 @@ ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0, ember-cli-ve resolve "^1.3.3" semver "^5.3.0" -ember-cli-version-checker@^3.0.0, ember-cli-version-checker@^3.0.1, ember-cli-version-checker@^3.1.3: +ember-cli-version-checker@^3.0.0, ember-cli-version-checker@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-3.1.3.tgz#7c9b4f5ff30fdebcd480b1c06c4de43bb51c522c" integrity sha512-PZNSvpzwWgv68hcXxyjREpj3WWb81A7rtYNQq1lLEgrWIchF8ApKJjWP3NBpHjaatwILkZAV8klair5WFlXAKg== @@ -6207,18 +6111,6 @@ ember-svg-jar@^1.2.2: mkdirp "^0.5.1" path-posix "^1.0.0" -ember-template-lint@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ember-template-lint/-/ember-template-lint-1.1.0.tgz#312e101728452bf082f54cbe429ed9b52273ba64" - integrity sha512-DPEWdjaNVIC58wJqeJStvQzk2gyKN5/u6dJfDKQ7mRJaouoLP1hZjSZwwpyO9bj10E9/3OJZnLmx1jjJ9/nqWA== - dependencies: - "@glimmer/compiler" "^0.38.0" - chalk "^2.0.0" - globby "^9.0.0" - minimatch "^3.0.4" - resolve "^1.1.3" - strip-bom "^3.0.0" - ember-tether@^1.0.0-beta.2: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-tether/-/ember-tether-1.0.0.tgz#6117ea7351927887cb74fa5d46097dd300280c2d" @@ -7091,18 +6983,6 @@ fast-deep-equal@^2.0.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= -fast-glob@^2.2.6: - version "2.2.6" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.6.tgz#a5d5b697ec8deda468d85a74035290a025a95295" - integrity sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w== - dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.1.2" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.3" - micromatch "^3.1.10" - fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" @@ -7866,11 +7746,6 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= - glob@^5.0.10: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" @@ -7965,20 +7840,6 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" -globby@^9.0.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" - integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== - dependencies: - "@types/glob" "^7.1.1" - array-union "^1.0.2" - dir-glob "^2.2.2" - fast-glob "^2.2.6" - glob "^7.1.3" - ignore "^4.0.3" - pify "^4.0.1" - slash "^2.0.0" - good-listener@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" @@ -8454,7 +8315,7 @@ ignore@^3.3.3: resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== -ignore@^4.0.3, ignore@^4.0.6: +ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== @@ -10348,11 +10209,6 @@ merge-trees@^2.0.0: fs-updater "^1.0.4" heimdalljs "^0.2.5" -merge2@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" - integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== - merge@^1.1.3, merge@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" @@ -11453,13 +11309,6 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - pathval@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" @@ -12533,7 +12382,7 @@ resolve@1.5.0: dependencies: path-parse "^1.0.5" -resolve@^1.1.3, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: version "1.11.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== @@ -13018,11 +12867,6 @@ slash@^1.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - slice-ansi@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" From 4c8a1962666302154649fdd42730711031414663 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 10 Jul 2019 09:11:54 -0400 Subject: [PATCH 505/879] v1.1.0-beta.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1ad310cde..a9adcf602 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "1.1.0-beta.3", + "version": "1.1.0-beta.4", "description": "A client-side server to help you build, test and demo your Ember app", "keywords": [ "ember-addon", From 7d56f7243b78b7333f59e99c3e326a2e77aa081d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2019 21:25:07 +0000 Subject: [PATCH 506/879] build(deps): [security] bump lodash.defaultsdeep from 4.6.0 to 4.6.1 Bumps [lodash.defaultsdeep](https://github.com/lodash/lodash) from 4.6.0 to 4.6.1. **This update includes security fixes.** - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.6.0...4.6.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9229363b6..b7d4c4fc0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9687,9 +9687,9 @@ lodash.defaults@~2.3.0: lodash.keys "~2.3.0" lodash.defaultsdeep@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.0.tgz#bec1024f85b1bd96cbea405b23c14ad6443a6f81" - integrity sha1-vsECT4WxvZbL6kBbI8FK1kQ6b4E= + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz#512e9bd721d272d94e3d3a63653fa17516741ca6" + integrity sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA== lodash.escape@~2.3.0: version "2.3.0" From 744af814cbc16f14ff1ed6cf7b3b89132a83da26 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2019 22:08:25 +0000 Subject: [PATCH 507/879] build(deps): [security] bump lodash-es from 4.17.11 to 4.17.14 Bumps [lodash-es](https://github.com/lodash/lodash) from 4.17.11 to 4.17.14. **This update includes security fixes.** - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.11...4.17.14) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9229363b6..3862d3ffc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9462,9 +9462,9 @@ locate-path@^3.0.0: path-exists "^3.0.0" lodash-es@^4.17.11: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.11.tgz#145ab4a7ac5c5e52a3531fb4f310255a152b4be0" - integrity sha512-DHb1ub+rMjjrxqlB3H56/6MXtm1lSksDp2rA2cNWjG8mlDUYFhUj3Di2Zn5IwSU87xLv8tNIQ7sSwE/YOX/D/Q== + version "4.17.14" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.14.tgz#12a95a963cc5955683cee3b74e85458954f37ecc" + integrity sha512-7zchRrGa8UZXjD/4ivUWP1867jDkhzTG2c/uj739utSd7O/pFFdxspCemIFKEEjErbcqRzn8nKnGsi7mvTgRPA== lodash._baseassign@^3.0.0: version "3.2.0" From 49e59bc76dc2a653daacc3546838a0db55a9c750 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2019 22:54:57 +0000 Subject: [PATCH 508/879] build(deps): [security] bump lodash.merge from 4.6.1 to 4.6.2 Bumps [lodash.merge](https://github.com/lodash/lodash) from 4.6.1 to 4.6.2. **This update includes security fixes.** - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/commits) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9229363b6..3c506d5f3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9801,9 +9801,9 @@ lodash.memoize@^4.1.2: integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= lodash.merge@^4.3.1, lodash.merge@^4.4.0, lodash.merge@^4.6.0, lodash.merge@~4.6.1: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" - integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash.noop@~2.3.0: version "2.3.0" From e03ddb2e8d533852bfca083bf1ad51821a2446b8 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 11 Jul 2019 11:02:55 +0000 Subject: [PATCH 509/879] build(deps): bump ember-auto-import from 1.5.0 to 1.5.2 Bumps [ember-auto-import](https://github.com/ef4/ember-auto-import) from 1.5.0 to 1.5.2. - [Release notes](https://github.com/ef4/ember-auto-import/releases) - [Changelog](https://github.com/ef4/ember-auto-import/blob/master/CHANGELOG.md) - [Commits](https://github.com/ef4/ember-auto-import/compare/v1.5.0...v1.5.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 42 +++++++++++++++--------------------------- 1 file changed, 15 insertions(+), 27 deletions(-) diff --git a/yarn.lock b/yarn.lock index 715620435..b32e10285 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1811,13 +1811,6 @@ async@^2.4.1: dependencies: lodash "^4.14.0" -async@^2.5.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" - integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== - dependencies: - lodash "^4.17.10" - async@~0.2.9: version "0.2.10" resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" @@ -5018,11 +5011,12 @@ ember-assign-polyfill@~2.4.0: ember-cli-version-checker "^2.0.0" ember-auto-import@^1.2.19: - version "1.5.0" - resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.5.0.tgz#371580c21f105cf1ada735039a92eb65c58819d0" - integrity sha512-cTx+XGt2EiO/DjpLwXclMOazl2Fl/hC8ajfrhg3767RW8QUxgEs8VTKS1YUs/KcFLKJbe4lrpxw8Az1hYxCsgw== + version "1.5.2" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.5.2.tgz#e97ed96b600caa6090ffed83e4611c3e7ec9bad7" + integrity sha512-skVQpfdc6G5OVRsyemDn3vI1nj/iBBgnoqRLRka0ZbDT2GqelmyJ86bp+Bd/ztJe45Le3we+LXbR7T54RU5A9w== dependencies: "@babel/core" "^7.1.6" + "@babel/preset-env" "^7.0.0" "@babel/traverse" "^7.1.6" "@babel/types" "^7.1.6" "@embroider/core" "^0.4.3" @@ -5038,7 +5032,7 @@ ember-auto-import@^1.2.19: enhanced-resolve "^4.0.0" fs-extra "^6.0.1" fs-tree-diff "^1.0.0" - handlebars "~4.0.13" + handlebars "~4.1.2" js-string-escape "^1.0.1" lodash "^4.17.10" mkdirp "^0.5.1" @@ -7907,23 +7901,12 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -handlebars@^4.0.11, handlebars@^4.0.4, handlebars@^4.0.6: - version "4.1.0" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.0.tgz#0d6a6f34ff1f63cecec8423aa4169827bf787c3a" - integrity sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w== - dependencies: - async "^2.5.0" - optimist "^0.6.1" - source-map "^0.6.1" - optionalDependencies: - uglify-js "^3.1.4" - -handlebars@~4.0.13: - version "4.0.13" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.13.tgz#89fc17bf26f46fd7f6f99d341d92efaae64f997d" - integrity sha512-uydY0jy4Z3wy/iGXsi64UtLD4t1fFJe16c/NFxsYE4WdQis8ZCzOXUZaPQNG0e5bgtLQV41QTfqBindhEjnpyQ== +handlebars@^4.0.11, handlebars@^4.0.4, handlebars@^4.0.6, handlebars@~4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" + integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== dependencies: - async "^2.5.0" + neo-async "^2.6.0" optimist "^0.6.1" source-map "^0.6.1" optionalDependencies: @@ -10594,6 +10577,11 @@ neo-async@^2.5.0: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== +neo-async@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" From eea36a8f580f3932c5ea2d83dd37791583652cd6 Mon Sep 17 00:00:00 2001 From: ian knauer Date: Sat, 13 Jul 2019 09:22:52 -0700 Subject: [PATCH 510/879] Old testing link breaks documentation below (#1689) Changed route to match router file. --- tests/dummy/app/pods/docs/data-layer/factories/template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dummy/app/pods/docs/data-layer/factories/template.md b/tests/dummy/app/pods/docs/data-layer/factories/template.md index 5e91ef3f9..f30221d88 100644 --- a/tests/dummy/app/pods/docs/data-layer/factories/template.md +++ b/tests/dummy/app/pods/docs/data-layer/factories/template.md @@ -647,7 +647,7 @@ In this test, we start our Mirage server out with 5 movies. Then we boot up the When we write another test, the database will start out empty so that none of Mirage's state leaks across tests. -You can read more about testing with Mirage in the {{docs-link 'Testing' 'docs.testing.acceptance-testing'}} section of these guides. +You can read more about testing with Mirage in the {{docs-link 'Testing' 'docs.testing.acceptance-tests'}} section of these guides. ## Factory best practices From c002e042b82d2777d29cecbc69b701f67452fecb Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 18 Jul 2019 23:09:10 +0000 Subject: [PATCH 511/879] build(deps-dev): bump ember-cli-fastboot from 2.1.1 to 2.1.3 Bumps [ember-cli-fastboot](https://github.com/ember-fastboot/ember-cli-fastboot) from 2.1.1 to 2.1.3. - [Release notes](https://github.com/ember-fastboot/ember-cli-fastboot/releases) - [Changelog](https://github.com/ember-fastboot/ember-cli-fastboot/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-fastboot/ember-cli-fastboot/compare/v2.1.1...v2.1.3) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 44 +++++++++++++++----------------------------- 1 file changed, 15 insertions(+), 29 deletions(-) diff --git a/yarn.lock b/yarn.lock index b32e10285..fbabdf039 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4642,7 +4642,7 @@ debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.2, debug@^2.1.3, debug@^2.2. dependencies: ms "2.0.0" -debug@=3.1.0, debug@^3.0.0, debug@^3.1.0, debug@~3.1.0: +debug@=3.1.0, debug@^3.1.0, debug@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== @@ -5333,9 +5333,9 @@ ember-cli-eslint@^4.2.3: walk-sync "^0.3.0" ember-cli-fastboot@^2.0.4: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ember-cli-fastboot/-/ember-cli-fastboot-2.1.1.tgz#3890e76f93a132d9eef189c78d18562b421594f2" - integrity sha512-qn3QcyDEbcc1/z2gPymwzTu3laSlou2WS3ZmUzlZz3wBi8WmIonzv5+i9ImjhPOP256MaIOnmdpSLi9QH45wbg== + version "2.1.3" + resolved "https://registry.yarnpkg.com/ember-cli-fastboot/-/ember-cli-fastboot-2.1.3.tgz#4cdef4e1110d15d925efe1408c0386a2a75688d0" + integrity sha512-1HIJz/VyuOvy4Z1k9eSYQ4w/JQev50BS3A/k79cd5V9z3jQNalPVUVJKSBVMrBOIa++aPePl+8aN4suryqAuXQ== dependencies: broccoli-concat "^3.7.1" broccoli-funnel "^2.0.1" @@ -5346,8 +5346,8 @@ ember-cli-fastboot@^2.0.4: ember-cli-lodash-subset "2.0.1" ember-cli-preprocess-registry "^3.1.2" ember-cli-version-checker "^3.0.0" - fastboot "^1.2.0" - fastboot-express-middleware "^1.2.0" + fastboot "^2.0.0" + fastboot-express-middleware "^2.0.0" fastboot-transform "^0.1.3" fs-extra "^7.0.0" json-stable-stringify "^1.0.1" @@ -7008,13 +7008,13 @@ fast-sourcemap-concat@^1.4.0: source-map-url "^0.3.0" sourcemap-validator "^1.1.0" -fastboot-express-middleware@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fastboot-express-middleware/-/fastboot-express-middleware-1.2.0.tgz#3f32fb21d8d01ad7c0c7d876b278601665ea17fa" - integrity sha1-PzL7IdjQGtfAx9h2snhgFmXqF/o= +fastboot-express-middleware@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fastboot-express-middleware/-/fastboot-express-middleware-2.0.0.tgz#3cb2c4b744e738a709b4336c4166f1a059ab0ffb" + integrity sha512-sJHZrHpo/8jh56t+DTzaDcg6cnHbmXlTSAdfhRZbBa8XDY3TfN+TjHsHd4Z7vouLFU+ISuaZkzKfwGwipW5xwQ== dependencies: chalk "^2.0.1" - fastboot "^1.2.0" + fastboot "^2.0.1" request "^2.81.0" fastboot-transform@0.1.1: @@ -7032,21 +7032,7 @@ fastboot-transform@^0.1.3: broccoli-stew "^1.5.0" convert-source-map "^1.5.1" -fastboot@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-1.2.0.tgz#35c5747db1943d082f2ba619226d16cd7281e946" - integrity sha1-NcV0fbGUPQgvK6YZIm0WzXKB6UY= - dependencies: - chalk "^2.0.1" - cookie "^0.3.1" - debug "^3.0.0" - exists-sync "0.0.4" - najax "^1.0.2" - rsvp "^4.7.0" - simple-dom "^1.0.0" - source-map-support "^0.5.0" - -fastboot@^2.0.1: +fastboot@^2.0.0, fastboot@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-2.0.1.tgz#f8fc0d14379e69a250045708f58268c98943f115" integrity sha512-NH6viW7oo8oDbWXqQ1aJNP5ey3gPYKIVBCX9ByqGxdPISXo5iOEKblyijN+HrPpbidPdQx8PNqHH8mtqo9rY/g== @@ -10505,7 +10491,7 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -najax@^1.0.2, najax@^1.0.3: +najax@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/najax/-/najax-1.0.4.tgz#63fd8dbf15d18f24dc895b3a16fec66c136b8084" integrity sha512-wsSacA+RkgY1wxRxXCT3tdqzmamEv9PLeoV/ub9SlLf2RngbPMSqc3A7H35XJDfURC0twMmZsnPdsYPkuuFSVg== @@ -12435,7 +12421,7 @@ rollup-plugin-async@^1.2.0: rollup-plugin-commonjs@^8.3.0: version "8.4.1" - resolved "http://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.4.1.tgz#5c9cea2b2c3de322f5fbccd147e07ed5e502d7a0" + resolved "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.4.1.tgz#5c9cea2b2c3de322f5fbccd147e07ed5e502d7a0" integrity sha512-mg+WuD+jlwoo8bJtW3Mvx7Tz6TsIdMsdhuvCnDMoyjh0oxsVgsjB/N0X984RJCWwc5IIiqNVJhXeeITcc73++A== dependencies: acorn "^5.2.1" @@ -12834,7 +12820,7 @@ silent-error@^1.0.0, silent-error@^1.0.1, silent-error@^1.1.0, silent-error@^1.1 dependencies: debug "^2.2.0" -simple-dom@^1.0.0, simple-dom@^1.4.0: +simple-dom@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/simple-dom/-/simple-dom-1.4.0.tgz#78ad1f41b8b70d16f82b7e0d458441c9262565b7" integrity sha512-TnBPkmOyjdaOqyBMb4ick+n8c0Xv9Iwg1PykFV7hz9Se3UCiacTbRb+25cPmvozFNJLBUNvUzX/KsPfXF14ivA== From 47c2c303ea2c1dad71f06741da4a2f5746c84af3 Mon Sep 17 00:00:00 2001 From: ian knauer Date: Fri, 19 Jul 2019 06:29:38 -0700 Subject: [PATCH 512/879] add missing character from example (#1692) The example here is missing the opening curly bracket. --- tests/dummy/app/pods/docs/testing/acceptance-tests/template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md b/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md index 7f51222b1..87dded226 100644 --- a/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md +++ b/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md @@ -75,7 +75,7 @@ test('I can view the movies', async function(assert) { }); test("I see the movies's title on the detail route", await function(assert) { - let movie = this.server.create('movie', + let movie = this.server.create('movie', { title: 'Interstellar' }); From f4e29cd7f37c9bc269571548713add70592a5f82 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 19 Jul 2019 17:03:59 +0000 Subject: [PATCH 513/879] build(deps): bump lodash-es from 4.17.14 to 4.17.15 Bumps [lodash-es](https://github.com/lodash/lodash) from 4.17.14 to 4.17.15. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.14...4.17.15) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index fbabdf039..dea72c979 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9431,9 +9431,9 @@ locate-path@^3.0.0: path-exists "^3.0.0" lodash-es@^4.17.11: - version "4.17.14" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.14.tgz#12a95a963cc5955683cee3b74e85458954f37ecc" - integrity sha512-7zchRrGa8UZXjD/4ivUWP1867jDkhzTG2c/uj739utSd7O/pFFdxspCemIFKEEjErbcqRzn8nKnGsi7mvTgRPA== + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78" + integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ== lodash._baseassign@^3.0.0: version "3.2.0" From 22ecdfa72a01d29ff8c745b1b3cf923a3976f8d7 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 19 Jul 2019 13:06:07 -0400 Subject: [PATCH 514/879] Document discoverEmberDataModels --- .../advanced/environment-options/template.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/dummy/app/pods/docs/advanced/environment-options/template.md b/tests/dummy/app/pods/docs/advanced/environment-options/template.md index 440643dad..bfa550d11 100644 --- a/tests/dummy/app/pods/docs/advanced/environment-options/template.md +++ b/tests/dummy/app/pods/docs/advanced/environment-options/template.md @@ -93,3 +93,19 @@ ENV['ember-cli-mirage'] = { directory: 'app/mirage' }; ``` + +## discoverEmberDataModels + +Tells Mirage whether to automatically infer its schema from the host application's Ember Data models and relationships. + +Defaults to true. If Ember Data models are present, predefines Mirage's models and relationships. If Ember Data models are not present, has no effect. + +You can disable by setting to `false`. You might want to do this if you run into an edge case/issue where the autodiscovery code causes issues in your app's environment (for example, if you have a complex engines setup). + +```js +// config/environment.js +... +ENV['ember-cli-mirage'] = { + discoverEmberDataModels: false +}; +``` From 0e0740a6c7844cbeb159a340924590554d1232ee Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 19 Jul 2019 13:50:16 -0400 Subject: [PATCH 515/879] v1.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a9adcf602..204955be5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "1.1.0-beta.4", + "version": "1.1.0", "description": "A client-side server to help you build, test and demo your Ember app", "keywords": [ "ember-addon", From f5b577360ab176489d99a4aea5a92c307ba0b7df Mon Sep 17 00:00:00 2001 From: "Andrey Mikhaylov (lolmaus)" Date: Wed, 24 Jul 2019 16:19:40 +0300 Subject: [PATCH 516/879] Use consistent name of the fixtures file (#1698) --- tests/dummy/app/pods/docs/testing/acceptance-tests/template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md b/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md index 87dded226..91125ade4 100644 --- a/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md +++ b/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md @@ -145,7 +145,7 @@ Create the module ```js // scenarios/shared.js export default function(server) { - server.loadFixtures('country'); + server.loadFixtures('countries'); server.createList('event', 10); }); From 404385fb0deb8f2be98c65ab6816543de3507352 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 5 Aug 2019 11:17:28 +0000 Subject: [PATCH 517/879] build(deps-dev): bump fastboot from 2.0.1 to 2.0.2 Bumps [fastboot](https://github.com/ember-fastboot/fastboot) from 2.0.1 to 2.0.2. - [Release notes](https://github.com/ember-fastboot/fastboot/releases) - [Changelog](https://github.com/ember-fastboot/fastboot/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-fastboot/fastboot/compare/v2.0.1...v2.0.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/yarn.lock b/yarn.lock index dea72c979..9a354d159 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4359,11 +4359,16 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= -cookie@0.3.1, cookie@^0.3.1: +cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= +cookie@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" @@ -7033,12 +7038,12 @@ fastboot-transform@^0.1.3: convert-source-map "^1.5.1" fastboot@^2.0.0, fastboot@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-2.0.1.tgz#f8fc0d14379e69a250045708f58268c98943f115" - integrity sha512-NH6viW7oo8oDbWXqQ1aJNP5ey3gPYKIVBCX9ByqGxdPISXo5iOEKblyijN+HrPpbidPdQx8PNqHH8mtqo9rY/g== + version "2.0.2" + resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-2.0.2.tgz#8f4b09aabf7cb69b80b673837a0e760d19b964b5" + integrity sha512-b/RdlA8ndtQeu+jHQ4EszrFLIDLZcHQqP7tsXIb+8yIdYsYAvaeeF6jc1LkwBJ0qbdNx8pXHehxSqO30BxRRGw== dependencies: chalk "^2.0.1" - cookie "^0.3.1" + cookie "^0.4.0" debug "^4.1.0" najax "^1.0.3" resolve "^1.8.1" @@ -12990,15 +12995,7 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" -source-map-support@^0.5.0, source-map-support@~0.5.6: - version "0.5.10" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c" - integrity sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@~0.5.10: +source-map-support@^0.5.0, source-map-support@~0.5.10, source-map-support@~0.5.6: version "0.5.12" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== From 89e0aabc2f1c5869081dff574581d87bf6924bd0 Mon Sep 17 00:00:00 2001 From: Buck Doyle Date: Wed, 7 Aug 2019 14:34:15 -0500 Subject: [PATCH 518/879] Fix database API documentation links (#1711) * Fix order of database API links * Fix path to database API links --- tests/dummy/app/pods/docs/data-layer/database/template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dummy/app/pods/docs/data-layer/database/template.md b/tests/dummy/app/pods/docs/data-layer/database/template.md index 1253ee0c3..b736b1486 100644 --- a/tests/dummy/app/pods/docs/data-layer/database/template.md +++ b/tests/dummy/app/pods/docs/data-layer/database/template.md @@ -57,6 +57,6 @@ test('I can create a movie', async function(assert) { }); ``` -You can view the rest of the Database APIs in the {{docs-link 'Db' 'docs.api.item' 'modules/ember-cli-mirage/db-collection~DbCollection'}} and {{docs-link 'DbCollection' 'docs.api.item' 'modules/ember-cli-mirage/db~Db'}} API reference. +You can view the rest of the Database APIs in the {{docs-link 'Db' 'docs.api.item' 'modules/lib/db~Db'}} and {{docs-link 'DbCollection' 'docs.api.item' 'modules/lib/db-collection~DbCollection'}} API reference. Next, we'll learn about Mirage's ORM. From 7af65e890bd430441ea980dc7b30e71b9105e38a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 9 Aug 2019 10:44:40 +0000 Subject: [PATCH 519/879] build(deps-dev): bump eslint-plugin-ember from 6.7.1 to 6.8.2 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 6.7.1 to 6.8.2. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v6.7.1...v6.8.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9a354d159..94f11dd8d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -704,6 +704,11 @@ lodash "^4.17.11" to-fast-properties "^2.0.0" +"@ember-data/rfc395-data@^0.0.4": + version "0.0.4" + resolved "https://registry.yarnpkg.com/@ember-data/rfc395-data/-/rfc395-data-0.0.4.tgz#ecb86efdf5d7733a76ff14ea651a1b0ed1f8a843" + integrity sha512-tGRdvgC9/QMQSuSuJV45xoyhI0Pzjm7A9o/MVVA3HakXIImJbbzx/k/6dO9CUEQXIyS2y0fW6C1XaYOG7rY0FQ== + "@ember/jquery@^0.6.0": version "0.6.1" resolved "https://registry.yarnpkg.com/@ember/jquery/-/jquery-0.6.1.tgz#eef89ebc8d7b49bddc176f2a646746c8f5d93978" @@ -6384,10 +6389,11 @@ eslint-plugin-ember-suave@^1.0.0: requireindex "~1.1.0" eslint-plugin-ember@^6.2.0: - version "6.7.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-6.7.1.tgz#be11e3b9b8f38227b81d90b11792a395322a9b4f" - integrity sha512-5qzd/5zjXRVlyWpDcRRaIdl6yAHLrUCUyNE71pnk3Egs/erqQazyQHjKKToIWjTA1a7ba/WEC72tJ8HbLsevhA== + version "6.8.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-6.8.2.tgz#3b512426c3d6cb29913471dedbee2c21f16fc26e" + integrity sha512-NXtanzQaX7p88rNK55ZlTU25MSiu8DDrdT83plgx1zQ8C8oVcX3qnnpD4SfaVfuGE1ZKmEGkelPZF8y6kU1qoA== dependencies: + "@ember-data/rfc395-data" "^0.0.4" ember-rfc176-data "^0.3.9" snake-case "^2.1.0" From fde8905bdb14dd619563a007397fb192de9d4221 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 21 Aug 2019 00:11:30 -0400 Subject: [PATCH 520/879] build(deps-dev): bump ember-source from 3.11.1 to 3.12.0 (#1708) Bumps [ember-source](https://github.com/emberjs/ember.js) from 3.11.1 to 3.12.0. - [Release notes](https://github.com/emberjs/ember.js/releases) - [Changelog](https://github.com/emberjs/ember.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember.js/compare/v3.11.1...v3.12.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 204955be5..d47dc15d2 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "ember-maybe-import-regenerator-for-testing": "^1.0.0", "ember-moment": "^7.8.1", "ember-resolver": "^5.0.1", - "ember-source": "~3.11.0", + "ember-source": "~3.12.0", "ember-source-channel-url": "^2.0.1", "ember-try": "^1.0.0", "escape-string-regexp": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index 94f11dd8d..aac036981 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6077,10 +6077,10 @@ ember-source-channel-url@^2.0.1: dependencies: got "^8.0.1" -ember-source@~3.11.0: - version "3.11.1" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.11.1.tgz#2318fbe600c88d3a8abbf56fc2f3a61645ee42d8" - integrity sha512-FPHHHu/5FBbKQ3o1D2HXEIniBUVqG1N4vDB66BaP0ht2ZcO6EB3HMjGxVH8Ad3Of8QOcXtZrBfXDHZdIWLW4lQ== +ember-source@~3.12.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.12.0.tgz#92f72894836d4497e704901c1d061c61b066bddf" + integrity sha512-4iA2BgYmNLWysifLyt2LCQgU9ux/NiTR/MT7KTt9HUyTDJyivcdyKNtfrUQst/1InUvn+MxuQ0ZsbQICJkX6yA== dependencies: broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.2" @@ -6095,7 +6095,7 @@ ember-source@~3.11.0: ember-router-generator "^1.2.3" inflection "^1.12.0" jquery "^3.4.1" - resolve "^1.10.1" + resolve "^1.11.1" ember-svg-jar@^1.2.2: version "1.2.2" From 30149b712d2e1e0dffc6c924442ccf191e12b48c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 21 Aug 2019 00:12:06 -0400 Subject: [PATCH 521/879] build(deps-dev): bump ember-cli-eslint from 4.2.3 to 5.1.0 (#1517) Bumps [ember-cli-eslint](https://github.com/ember-cli/ember-cli-eslint) from 4.2.3 to 5.1.0. - [Release notes](https://github.com/ember-cli/ember-cli-eslint/releases) - [Changelog](https://github.com/ember-cli/ember-cli-eslint/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-cli-eslint/commits) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 290 +++++---------------------------------------------- 2 files changed, 26 insertions(+), 266 deletions(-) diff --git a/package.json b/package.json index d47dc15d2..45e23f34c 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "ember-cli-deploy-build": "^1.1.1", "ember-cli-deploy-git": "^1.3.3", "ember-cli-deploy-git-ci": "^1.0.1", - "ember-cli-eslint": "^4.2.3", + "ember-cli-eslint": "^5.1.0", "ember-cli-fastboot": "^2.0.4", "ember-cli-favicon": "^2.0.0", "ember-cli-htmlbars": "^3.0.0", diff --git a/yarn.lock b/yarn.lock index aac036981..2d8ee2e04 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1394,13 +1394,6 @@ acorn-globals@^4.1.0, acorn-globals@^4.3.0, acorn-globals@^4.3.2: acorn "^6.0.1" acorn-walk "^6.0.1" -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" - integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= - dependencies: - acorn "^3.0.4" - acorn-jsx@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" @@ -1416,12 +1409,7 @@ acorn@^2.1.0, acorn@^2.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7" integrity sha1-q259nYhqrKiwhbwzEreaGYQz8Oc= -acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= - -acorn@^5.0.0, acorn@^5.2.1, acorn@^5.4.0, acorn@^5.5.3, acorn@^5.6.2: +acorn@^5.0.0, acorn@^5.2.1, acorn@^5.5.3, acorn@^5.6.2: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== @@ -1454,26 +1442,11 @@ ajv-errors@^1.0.0: resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== -ajv-keywords@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" - integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= - ajv-keywords@^3.1.0: version "3.3.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.3.0.tgz#cb6499da9b83177af8bc1732b2f0a1a1a3aacf8c" integrity sha512-CMzN9S62ZOO4sA/mJZIO4S++ZM7KFWzH3PPWkveLhy4OZ9i1/VatgwWMD46w/XbGCBy7Ye0gCk+Za6mmyfKK7g== -ajv@^5.2.3, ajv@^5.3.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - ajv@^6.1.0, ajv@^6.5.5: version "6.7.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.7.0.tgz#e3ce7bb372d6577bb1839f1dfdfcbf5ad2948d96" @@ -1698,7 +1671,7 @@ arraybuffer.slice@~0.0.7: resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== -arrify@^1.0.0, arrify@^1.0.1: +arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= @@ -1863,7 +1836,7 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== -babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: +babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= @@ -3073,15 +3046,15 @@ broccoli-kitchen-sink-helpers@^0.3.1: glob "^5.0.10" mkdirp "^0.5.1" -broccoli-lint-eslint@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/broccoli-lint-eslint/-/broccoli-lint-eslint-4.2.1.tgz#f780dc083a7357a9746a9cfa8f76feb092777477" - integrity sha512-Jvm06UvuMPa5gEH+9/Sb+QpoIodDAYzbyIUEqxniPCdA6JJooa91hQDCTJc32RUV46JNMcLhb3Dl55BdA8v5mw== +broccoli-lint-eslint@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/broccoli-lint-eslint/-/broccoli-lint-eslint-5.0.0.tgz#05365879d597dd78496a1c718db0e5ea5d4a2bde" + integrity sha512-V7M6U4th21bf1X4u3KoZa0xkcPq9JCSyKxB/nCWCBFMI3rkrB8nlyDLd8DKIUTqL+ojlFOGV5lohPZwndw0sZw== dependencies: aot-test-generators "^0.1.0" broccoli-concat "^3.2.2" - broccoli-persistent-filter "^1.4.3" - eslint "^4.0.0" + broccoli-persistent-filter "^2.1.0" + eslint "^5.6.0" json-stable-stringify "^1.0.1" lodash.defaultsdeep "^4.6.0" md5-hex "^2.0.0" @@ -3167,7 +3140,7 @@ broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-p symlink-or-copy "^1.0.1" walk-sync "^0.3.1" -broccoli-persistent-filter@^2.0.0, broccoli-persistent-filter@^2.1.1, broccoli-persistent-filter@^2.2.1, broccoli-persistent-filter@^2.2.2, broccoli-persistent-filter@^2.3.1: +broccoli-persistent-filter@^2.0.0, broccoli-persistent-filter@^2.1.0, broccoli-persistent-filter@^2.1.1, broccoli-persistent-filter@^2.2.1, broccoli-persistent-filter@^2.2.2, broccoli-persistent-filter@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.3.1.tgz#4a052e0e0868b344c3a2977e35a3d497aa9eca72" integrity sha512-hVsmIgCDrl2NFM+3Gs4Cr2TA6UPaIZip99hN8mtkaUPgM8UeVnCbxelCvBjUBHo0oaaqP5jzqqnRVvb568Yu5g== @@ -3674,23 +3647,11 @@ calculate-cache-key-for-tree@^1.1.0, calculate-cache-key-for-tree@^1.2.0: dependencies: json-stable-stringify "^1.0.1" -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= - dependencies: - callsites "^0.2.0" - callsite@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= - callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -3937,11 +3898,6 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -circular-json@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== - clap@^1.0.9: version "1.2.3" resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" @@ -4265,7 +4221,7 @@ concat-stream@1.6.2, concat-stream@^1.5.0: readable-stream "^2.2.2" typedarray "^0.0.6" -concat-stream@^1.4.7, concat-stream@^1.6.0: +concat-stream@^1.4.7: version "1.6.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" integrity sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc= @@ -4475,7 +4431,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-spawn@^5.0.1, cross-spawn@^5.1.0: +cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= @@ -4741,19 +4697,6 @@ defined@^1.0.0: resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= -del@^2.0.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= - dependencies: - globby "^5.0.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - rimraf "^2.2.8" - delayed-stream@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-0.0.5.tgz#d4b1f43a93e8296dfe02694f4680bc37a313c73f" @@ -4833,13 +4776,6 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -5332,15 +5268,15 @@ ember-cli-deploy@^1.0.2: rsvp "^3.3.3" silent-error "^1.0.0" -ember-cli-eslint@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/ember-cli-eslint/-/ember-cli-eslint-4.2.3.tgz#2844d3f5e8184f19b2d7132ba99eb0b370b55598" - integrity sha512-1fqRz9QVLTT790Zr07aDFmAprZ1vVsaBGJOGQgDEFmBpogq8BeaQopaxogWFp748hol8nGC4QP5tbzhVD6KQHw== +ember-cli-eslint@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-eslint/-/ember-cli-eslint-5.1.0.tgz#acdb9b072911e04b07c313b610f514db4086d21a" + integrity sha512-o6787b0tgkRNp+KJo5BiQxtkLuz/yyYqVWF31LPrh+ZCC8jETrfyjsuk8VPDxKLGq7qEiQNJUgOEW87HTad7Vg== dependencies: - broccoli-lint-eslint "^4.2.1" - ember-cli-version-checker "^2.1.0" + broccoli-lint-eslint "^5.0.0" + ember-cli-version-checker "^3.0.0" rsvp "^4.6.1" - walk-sync "^0.3.0" + walk-sync "^1.0.0" ember-cli-fastboot@^2.0.4: version "2.1.3" @@ -6417,7 +6353,7 @@ eslint-plugin-node@^9.0.1: resolve "^1.10.1" semver "^6.1.0" -eslint-scope@3.7.1, eslint-scope@^3.7.1: +eslint-scope@3.7.1: version "3.7.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug= @@ -6451,50 +6387,7 @@ eslint-visitor-keys@^1.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== -eslint@^4.0.0: - version "4.17.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.17.0.tgz#dc24bb51ede48df629be7031c71d9dc0ee4f3ddf" - integrity sha512-AyxBUCANU/o/xC0ijGMKavo5Ls3oK6xykiOITlMdjFjrKOsqLrA7Nf5cnrDgcKrHzBirclAZt63XO7YZlVUPwA== - dependencies: - ajv "^5.3.0" - babel-code-frame "^6.22.0" - chalk "^2.1.0" - concat-stream "^1.6.0" - cross-spawn "^5.1.0" - debug "^3.1.0" - doctrine "^2.1.0" - eslint-scope "^3.7.1" - eslint-visitor-keys "^1.0.0" - espree "^3.5.2" - esquery "^1.0.0" - esutils "^2.0.2" - file-entry-cache "^2.0.0" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.0.1" - ignore "^3.3.3" - imurmurhash "^0.1.4" - inquirer "^3.0.6" - is-resolvable "^1.0.0" - js-yaml "^3.9.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.4" - minimatch "^3.0.2" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - pluralize "^7.0.0" - progress "^2.0.0" - require-uncached "^1.0.3" - semver "^5.3.0" - strip-ansi "^4.0.0" - strip-json-comments "~2.0.1" - table "^4.0.1" - text-table "~0.2.0" - -eslint@^5.16.0: +eslint@^5.16.0, eslint@^5.6.0: version "5.16.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== @@ -6541,14 +6434,6 @@ esm@^3.2.4: resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.4.tgz#0b728b5d6043061bf552197407bf2c630717812b" integrity sha512-wOuWtQCkkwD1WKQN/k3RsyGSSN+AmiUzdKftn8vaC+uV9JesYmQlODJxgXaaRz0LaaFIlUxZaUu5NPiUAjKAAA== -espree@^3.5.2: - version "3.5.3" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.3.tgz#931e0af64e7fbbed26b050a29daad1fc64799fa6" - integrity sha512-Zy3tAJDORxQZLl2baguiRU1syPERAIg0L+JB2MWorORgTu/CplzvxS9WWA7Xh4+Q+eOQihNs/1o1Xep8cvCxWQ== - dependencies: - acorn "^5.4.0" - acorn-jsx "^3.0.0" - espree@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" @@ -6578,13 +6463,6 @@ esprima@~3.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.0.0.tgz#53cf247acda77313e551c3aa2e73342d3fb4f7d9" integrity sha1-U88kes2ncxPlUcOqLnM0LT+099k= -esquery@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" - integrity sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo= - dependencies: - estraverse "^4.0.0" - esquery@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" @@ -6978,11 +6856,6 @@ faker@^4.1.0: resolved "https://registry.yarnpkg.com/faker/-/faker-4.1.0.tgz#1e45bbbecc6774b3c195fad2835109c6d748cc3f" integrity sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8= -fast-deep-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" - integrity sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8= - fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" @@ -7112,14 +6985,6 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" - integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= - dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" - file-entry-cache@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" @@ -7293,16 +7158,6 @@ fixturify@^0.3.2, fixturify@^0.3.4: fs-extra "^0.30.0" matcher-collection "^1.0.4" -flat-cache@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" - integrity sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE= - dependencies: - circular-json "^0.3.1" - del "^2.0.2" - graceful-fs "^4.1.2" - write "^0.2.1" - flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" @@ -7788,11 +7643,6 @@ global@~4.3.0: min-document "^2.19.0" process "~0.5.1" -globals@^11.0.1: - version "11.3.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.3.0.tgz#e04fdb7b9796d8adac9c8f64c14837b2313378b0" - integrity sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw== - globals@^11.1.0: version "11.7.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" @@ -7808,18 +7658,6 @@ globals@^9.18.0: resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0= - dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -8290,11 +8128,6 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -ignore@^3.3.3: - version "3.3.10" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" - integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== - ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" @@ -8414,7 +8247,7 @@ inquirer@^2: strip-ansi "^3.0.0" through "^2.3.6" -inquirer@^3.0.6, inquirer@^3.3.0: +inquirer@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== @@ -8698,25 +8531,6 @@ is-odd@^1.0.0: dependencies: is-number "^3.0.0" -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= - -is-path-in-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" - integrity sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw= - dependencies: - is-path-inside "^1.0.0" - -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= - dependencies: - path-is-inside "^1.0.1" - is-plain-obj@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -8763,11 +8577,6 @@ is-regex@^1.0.4: dependencies: has "^1.0.1" -is-resolvable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== - is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" @@ -8977,7 +8786,7 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.12.0, js-yaml@^3.12.1, js-yaml@^3.13.0, js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.3.0, js-yaml@^3.9.1: +js-yaml@^3.12.0, js-yaml@^3.12.1, js-yaml@^3.13.0, js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.3.0: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -9156,11 +8965,6 @@ json-parse-better-errors@^1.0.2: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -11243,7 +11047,7 @@ path-is-absolute@1.0.1, path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-is-inside@^1.0.1, path-is-inside@^1.0.2: +path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= @@ -11411,11 +11215,6 @@ pkg-up@^2.0.0: dependencies: find-up "^2.1.0" -pluralize@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" - integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== - pn@^1.0.0, pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" @@ -12278,14 +12077,6 @@ require-relative@^0.8.7: resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4= -require-uncached@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= - dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" - requireindex@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162" @@ -12321,11 +12112,6 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1: expand-tilde "^2.0.0" global-modules "^1.0.0" -resolve-from@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -12852,13 +12638,6 @@ slash@^1.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= -slice-ansi@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" - integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== - dependencies: - is-fullwidth-code-point "^2.0.0" - slice-ansi@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" @@ -13432,18 +13211,6 @@ sync-disk-cache@^1.3.3: rimraf "^2.2.8" username-sync "^1.0.2" -table@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" - integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA== - dependencies: - ajv "^5.2.3" - ajv-keywords "^2.1.0" - chalk "^2.1.0" - lodash "^4.17.4" - slice-ansi "1.0.0" - string-width "^2.1.1" - table@^5.2.3: version "5.4.1" resolved "https://registry.yarnpkg.com/table/-/table-5.4.1.tgz#0691ae2ebe8259858efb63e550b6d5f9300171e8" @@ -13581,7 +13348,7 @@ tether@^1.4.0: resolved "https://registry.yarnpkg.com/tether/-/tether-1.4.4.tgz#9dc6eb2b3e601da2098fd264e7f7a8b264de1125" integrity sha512-bagKeRRo3vEynHnO3GB7/jB3Q4YIf0mN7gXM/nR0wZvNHkPrwmZemg1w0C32JZP0prHZUwxGwoX5CdA7tuIDEw== -text-table@^0.2.0, text-table@~0.2.0: +text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= @@ -14521,13 +14288,6 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -write@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" - integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= - dependencies: - mkdirp "^0.5.1" - ws@^5.2.0: version "5.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" From e2763d1b0ce5b5cc5907cbf9eb869a949adcd3ad Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 3 Sep 2019 23:41:34 -0400 Subject: [PATCH 522/879] Fix fastboot test failure under floating deps (#1738) The 01-basic-app test project had a failing fastboot test under our Travis floating-deps test case. This means the fastboot tests passed when all node_modules were installed using our `yarn.lock` file, but failed when `yarn install --no-lockfile` was used. This means there was some bump in a transitive dependency that caused an issue in one of the fastboot tests in 01-basic-app, when newing up a Fastboot instance. To track down the problematic dependency, we cut the yarn.lockfile in half and deleted it, regenerating the remaining entries until we found the problematic one. It turned out to be terser-webpack-plugin, which is in our dependency graph because of Ember Auto Import. By pinning the dependency, all tests now pass when `yarn install --no-lockfile` is used. --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 45e23f34c..e6e1c8aab 100644 --- a/package.json +++ b/package.json @@ -100,7 +100,8 @@ "qunit-dom": "^0.9.0" }, "resolutions": { - "favicons": "5.3.0" + "favicons": "5.3.0", + "ember-auto-import/**/terser-webpack-plugin": "1.2.1" }, "engines": { "node": "6.* || 8.* || >= 10.*" From a0f352259a325bd3e7db22fa7e51f763c08b0696 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Clemens=20M=EF=BF=BDller?= Date: Wed, 4 Sep 2019 16:18:53 +0200 Subject: [PATCH 523/879] DOC: add missing `If ` at beginning of sentence (#1718) --- tests/dummy/app/pods/docs/testing/acceptance-tests/template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md b/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md index 91125ade4..9e86de42e 100644 --- a/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md +++ b/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md @@ -138,7 +138,7 @@ Typically you should reserve the `scenarios/default.js` file for development, so If there's some logic you'd like to share between your development scenario and your tests, you can always make a new module under `scenarios` and import it in both places. -you'd like to load your development scenario in your tests, you can always directly import that module and run your test server through it: +If you'd like to load your development scenario in your tests, you can always directly import that module and run your test server through it: Create the module From fe5ad873cba4766115c902a3605dd13305598e48 Mon Sep 17 00:00:00 2001 From: Luke Date: Wed, 4 Sep 2019 08:50:22 -0700 Subject: [PATCH 524/879] Fix autodetect ember models when podModulePrefix is null (#1724) --- addon/ember-data.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addon/ember-data.js b/addon/ember-data.js index 6be94eee1..65eed70f1 100644 --- a/addon/ember-data.js +++ b/addon/ember-data.js @@ -29,7 +29,7 @@ export function getDsModels() { let moduleMap = requirejs.entries; let classicModelMatchRegex = new RegExp(`^${modulePrefix}/models/(.*)$`, 'i'); - let podModelMatchRegex = new RegExp(`^${podModulePrefix}/(.*)/model$`, 'i'); + let podModelMatchRegex = new RegExp(`^${podModulePrefix || modulePrefix}/(.*)/model$`, 'i'); DsModels = {}; From 88fbfa10f4a61fa191de804be7b9c3797e1e9765 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 4 Sep 2019 15:50:56 +0000 Subject: [PATCH 525/879] build(deps): [security] bump mixin-deep from 1.3.1 to 1.3.2 Bumps [mixin-deep](https://github.com/jonschlinkert/mixin-deep) from 1.3.1 to 1.3.2. **This update includes a security fix.** - [Release notes](https://github.com/jonschlinkert/mixin-deep/releases) - [Commits](https://github.com/jonschlinkert/mixin-deep/compare/1.3.1...1.3.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index 2d8ee2e04..c43d0d38f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10205,9 +10205,9 @@ mississippi@^3.0.0: through2 "^2.0.0" mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" @@ -13277,7 +13277,7 @@ temp@0.8.3: os-tmpdir "^1.0.0" rimraf "~2.2.6" -terser-webpack-plugin@^1.1.0: +terser-webpack-plugin@1.2.1, terser-webpack-plugin@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.1.tgz#7545da9ae5f4f9ae6a0ac961eb46f5e7c845cc26" integrity sha512-GGSt+gbT0oKcMDmPx4SRSfJPE1XaN3kQRWG4ghxKQw9cn5G9x6aCKSsgYdvyM0na9NJ4Drv0RG6jbBByZ5CMjw== From 84484062b6017251d77aa99cbe0409392072f26c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 4 Sep 2019 15:51:12 +0000 Subject: [PATCH 526/879] build(deps): [security] bump eslint-utils from 1.3.1 to 1.4.2 Bumps [eslint-utils](https://github.com/mysticatea/eslint-utils) from 1.3.1 to 1.4.2. **This update includes a security fix.** - [Release notes](https://github.com/mysticatea/eslint-utils/releases) - [Commits](https://github.com/mysticatea/eslint-utils/compare/v1.3.1...v1.4.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/yarn.lock b/yarn.lock index 2d8ee2e04..d305e116e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6378,14 +6378,16 @@ eslint-scope@^4.0.3: estraverse "^4.1.1" eslint-utils@^1.3.0, eslint-utils@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" - integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q== + version "1.4.2" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab" + integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q== + dependencies: + eslint-visitor-keys "^1.0.0" eslint-visitor-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" - integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== eslint@^5.16.0, eslint@^5.6.0: version "5.16.0" @@ -13277,7 +13279,7 @@ temp@0.8.3: os-tmpdir "^1.0.0" rimraf "~2.2.6" -terser-webpack-plugin@^1.1.0: +terser-webpack-plugin@1.2.1, terser-webpack-plugin@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.1.tgz#7545da9ae5f4f9ae6a0ac961eb46f5e7c845cc26" integrity sha512-GGSt+gbT0oKcMDmPx4SRSfJPE1XaN3kQRWG4ghxKQw9cn5G9x6aCKSsgYdvyM0na9NJ4Drv0RG6jbBByZ5CMjw== From 3432266f84198ac3a64c21c12491e2272be243cd Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 4 Sep 2019 15:52:04 +0000 Subject: [PATCH 527/879] build(deps-dev): bump ember-cli-addon-docs from 0.6.13 to 0.6.14 Bumps [ember-cli-addon-docs](https://github.com/ember-learn/ember-cli-addon-docs) from 0.6.13 to 0.6.14. - [Release notes](https://github.com/ember-learn/ember-cli-addon-docs/releases) - [Changelog](https://github.com/ember-learn/ember-cli-addon-docs/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-learn/ember-cli-addon-docs/compare/v0.6.13...v0.6.14) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 970 +++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 706 insertions(+), 264 deletions(-) diff --git a/yarn.lock b/yarn.lock index 2d8ee2e04..48b64ddac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,6 +9,13 @@ dependencies: "@babel/highlight" "^7.0.0" +"@babel/code-frame@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" + integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== + dependencies: + "@babel/highlight" "^7.0.0" + "@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.2.2", "@babel/core@^7.3.3", "@babel/core@^7.3.4": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.0.tgz#6ed6a2881ad48a732c5433096d96d1b0ee5eb734" @@ -40,6 +47,17 @@ source-map "^0.5.0" trim-right "^1.0.1" +"@babel/generator@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.5.tgz#873a7f936a3c89491b43536d12245b626664e3cf" + integrity sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ== + dependencies: + "@babel/types" "^7.5.5" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + trim-right "^1.0.1" + "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" @@ -259,6 +277,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.0.tgz#3e0713dff89ad6ae37faec3b29dcfc5c979770b7" integrity sha512-I5nW8AhGpOXGCCNYGc+p7ExQIBxRFnS2fd/d862bNOKvmoEPjYPcfIjsfdy0ujagYOIYPczKgD9l3FsgTkAzKA== +"@babel/parser@^7.4.5", "@babel/parser@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.5.tgz#02f077ac8817d3df4a832ef59de67565e71cca4b" + integrity sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g== + "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" @@ -695,6 +718,21 @@ globals "^11.1.0" lodash "^4.17.11" +"@babel/traverse@^7.4.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.5.tgz#f664f8f368ed32988cd648da9f72d5ca70f165bb" + integrity sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.5.5" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.5.5" + "@babel/types" "^7.5.5" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + "@babel/types@^7.0.0", "@babel/types@^7.1.5", "@babel/types@^7.1.6", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.2", "@babel/types@^7.3.4", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.0.tgz#e47d43840c2e7f9105bc4d3a2c371b4d0c7832ab" @@ -704,6 +742,15 @@ lodash "^4.17.11" to-fast-properties "^2.0.0" +"@babel/types@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.5.tgz#97b9f728e182785909aa4ab56264f090a028d18a" + integrity sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + "@ember-data/rfc395-data@^0.0.4": version "0.0.4" resolved "https://registry.yarnpkg.com/@ember-data/rfc395-data/-/rfc395-data-0.0.4.tgz#ecb86efdf5d7733a76ff14ea651a1b0ed1f8a843" @@ -809,12 +856,10 @@ resolved "https://registry.yarnpkg.com/@glimmer/env/-/env-0.1.7.tgz#fd2d2b55a9029c6b37a6c935e8c8871ae70dfa07" integrity sha1-/S0rVakCnGs3psk16MiHGucN+gc= -"@glimmer/interfaces@^0.36.5": - version "0.36.5" - resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.36.5.tgz#b9ef4a6756745dc41927ab01d6c23cdf7ece4158" - integrity sha512-IhoGEP0Awe9bTOMcLF9dUgEV3xguI6m2vFer7SHYX1vuugthA6NEJb83hqUe9FqOd1cNxJE8nAsX0JInx8gn+A== - dependencies: - "@glimmer/wire-format" "^0.36.5" +"@glimmer/interfaces@^0.42.0": + version "0.42.0" + resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.42.0.tgz#525f5352dd78011eef7b3eb0e3fb61b981c94319" + integrity sha512-lZlydeRRK3yL6pco0gCstPVuC5XYjBUtql1vSvWTRd+MUO0Chg8kxIvduFVg6f+Xfr1kqWd2YQq1MCMdmfzfvg== "@glimmer/resolver@^0.4.1": version "0.4.2" @@ -823,27 +868,20 @@ dependencies: "@glimmer/di" "^0.2.0" -"@glimmer/syntax@^0.36.4": - version "0.36.5" - resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.36.5.tgz#603099a0bf2019dc497e3b858eb6fc84abda805a" - integrity sha512-62BcnXtej4oBEMYSCBezSCOvlZ+1gLAJ/zVXwDgTmin56wKUL2bChScw332OeIL+brvcExAlwZ/hB1UoldMgwQ== +"@glimmer/syntax@^0.42.0": + version "0.42.0" + resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.42.0.tgz#65d38f6f6339e0e00cfbb34bc08ed3ff94f080c6" + integrity sha512-H0vydEQjlSqlVyjUmQxOy9BMBdL8OAII4GQjTXHWOQKmQBreZ05Dpr2EbXusiby6E2lMgbcPOqxGXdB/VVUBew== dependencies: - "@glimmer/interfaces" "^0.36.5" - "@glimmer/util" "^0.36.5" - handlebars "^4.0.6" - simple-html-tokenizer "^0.5.6" - -"@glimmer/util@^0.36.5": - version "0.36.5" - resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.36.5.tgz#829f393ef0bf791df5b287f104f0fd76e456182c" - integrity sha512-RcDsxxuKGnIc6Ro6wZGFMUZ/E8L3Rbcd5E5F2WOSa59RYHel146fhQtctGrpGxQUZwfxMEMs91GJIaKeukd84g== + "@glimmer/interfaces" "^0.42.0" + "@glimmer/util" "^0.42.0" + handlebars "^4.0.13" + simple-html-tokenizer "^0.5.8" -"@glimmer/wire-format@^0.36.5": - version "0.36.5" - resolved "https://registry.yarnpkg.com/@glimmer/wire-format/-/wire-format-0.36.5.tgz#6713c95fbdc23c2e4dcc946e16452ded5cc17447" - integrity sha512-wt+H4iNsGPkW/b/POP21DmTM4cYYYcDmaI54RkEgtMRoeBP6hyi7Y4awbRPMWal6QKIxFepMUY4vnbq345m00w== - dependencies: - "@glimmer/util" "^0.36.5" +"@glimmer/util@^0.42.0": + version "0.42.0" + resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.42.0.tgz#3f3a647ecaa16bbe4fc0545923d3b0a527319d78" + integrity sha512-rvXxKVb7BoQUvdrEQgxyvIeqGRUFM4LZAc7X1OmIpMnoaEh3fyx/e8Bz0blF0Yk6QvHpfV/GKirhlGmfum/ISA== "@jimp/bmp@^0.5.4": version "0.5.4" @@ -1153,11 +1191,158 @@ dependencies: "@types/estree" "*" +"@types/ember@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/ember/-/ember-3.1.0.tgz#3c44b846c41a1340bc823910f9222746585b3314" + integrity sha512-RHP/N7k81XIS16DLF/yTfnWEKdFFftRAUgjWO1oKNJ5ho3+iTH3vVq8u11PrhaHd+FHXNB1XKV20d5o1KEOnUQ== + dependencies: + "@types/ember__application" "*" + "@types/ember__array" "*" + "@types/ember__component" "*" + "@types/ember__controller" "*" + "@types/ember__debug" "*" + "@types/ember__engine" "*" + "@types/ember__error" "*" + "@types/ember__object" "*" + "@types/ember__polyfills" "*" + "@types/ember__routing" "*" + "@types/ember__runloop" "*" + "@types/ember__service" "*" + "@types/ember__string" "*" + "@types/ember__test" "*" + "@types/ember__utils" "*" + "@types/htmlbars-inline-precompile" "*" + "@types/jquery" "*" + "@types/rsvp" "*" + +"@types/ember__application@*": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@types/ember__application/-/ember__application-3.0.7.tgz#8a34f6d75661256d6d6859dcdde848bdd3bea47e" + integrity sha512-7M5Oba1u9fQ1rLs/LeyHqDhnMAqJJF+K2HBBYkbPkD8hf+DR8Ae5PvWXgHwjAmiiWe559zJcapCqawPgzMw8lg== + dependencies: + "@types/ember__application" "*" + "@types/ember__engine" "*" + "@types/ember__object" "*" + "@types/ember__routing" "*" + +"@types/ember__array@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/ember__array/-/ember__array-3.0.4.tgz#6b04b9188da1c315d808304c989a6e7ed24d7ad3" + integrity sha512-WPqytL1qOKoNpcY3eHKp8f7lejTGFyiySAH+yPhXMX1X2F6Y8nkCQGmmTQ9W9+nYQbyVlA3SCXqd1uTzCEOLjg== + dependencies: + "@types/ember__array" "*" + "@types/ember__object" "*" + +"@types/ember__component@*": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/ember__component/-/ember__component-3.0.5.tgz#ae0a64d53ec3bff7a100347fac52320cba068c22" + integrity sha512-pGDNR2OkPjNIcpdV/XEtzU/yE5n+vzRcYHtUCaA7dn0qoMAAiMPkJjeNMGkWQIv1q+aLyXvjiV9elcP2i1HA9g== + dependencies: + "@types/ember__component" "*" + "@types/ember__object" "*" + "@types/jquery" "*" + +"@types/ember__controller@*": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/ember__controller/-/ember__controller-3.0.6.tgz#dbfbc1480a4584efb719746b3562636398bf6261" + integrity sha512-flwfLteYs8/kSo759PYMEvKESbANIdUHhj05Gxv1aEvqQnpzNiGYTol32USO6XWi13Ui7MyxdFiWS06dj9NwMQ== + dependencies: + "@types/ember__object" "*" + +"@types/ember__debug@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/ember__debug/-/ember__debug-3.0.4.tgz#cdf87a580688a0e3053820eff6f390fbb7ba0e80" + integrity sha512-jTdLdNGvDn3MhktfskhdxOaDHO09QtQqeh+krI7EDePl2+Xom+KnNeveFeCkzxDkYOa+/R7UNSxW4yN/3YTw3w== + dependencies: + "@types/ember__debug" "*" + "@types/ember__engine" "*" + "@types/ember__object" "*" + +"@types/ember__engine@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/ember__engine/-/ember__engine-3.0.4.tgz#7e79d72653f5c7fd9f6d828d32540be372128aca" + integrity sha512-DfbM0iKgF8mvthZwshDgYn8H1BZQJOk42X5b183K7vbkaye49seeTnPDelrVRRnlMXH6BA6OHAghY92axwVLzw== + dependencies: + "@types/ember__engine" "*" + "@types/ember__object" "*" + +"@types/ember__error@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/ember__error/-/ember__error-3.0.3.tgz#73e5d9f05212d7965e7c2f4df39abdbf5ea41ab1" + integrity sha512-P1+YLJJ9xzc8w5mKYtXsrS070MOTjsNeoGoEHnj7nO5IfeyC34yTHdceW9hoBMRLZs2tZ+cjElUNdR1kxpl+oA== + +"@types/ember__object@*": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/ember__object/-/ember__object-3.1.1.tgz#ea0a8313fc80ac5af4826190da3e688d72f02d58" + integrity sha512-VQk38Dqiz0fVNt4RIrxyIanDqCFYDZB6QPHzdMjnjQSGeEHh130B+lFECtNQrO1V9czXzm588qpIBdPp9N2H9g== + dependencies: + "@types/ember__object" "*" + "@types/rsvp" "*" + +"@types/ember__polyfills@*": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/ember__polyfills/-/ember__polyfills-3.0.5.tgz#8f2c97b42f089afed53b4c137a6d7bbf4f7aa12e" + integrity sha512-yffc3Alk/Z12LwpRXvchcqrmou5fo37wZMoFiAOiqBYzJO3JL9gcYcrYuwg0eBdR/EwOr3aUeE8S+XAqXx3pIQ== + +"@types/ember__routing@*": + version "3.0.9" + resolved "https://registry.yarnpkg.com/@types/ember__routing/-/ember__routing-3.0.9.tgz#3387d4f60b1ea3211d96e8bb9700129125c95538" + integrity sha512-E78LjdZB55Ayw0mSrFYNBxDLR6AhtuFL6JkSpySQuGmfcmEcywwlK1XDxEI5j92pMuUAZdKXaPfpOIkA0Vk0yg== + dependencies: + "@types/ember__component" "*" + "@types/ember__controller" "*" + "@types/ember__object" "*" + "@types/ember__routing" "*" + "@types/ember__service" "*" + +"@types/ember__runloop@*": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/ember__runloop/-/ember__runloop-3.0.6.tgz#5a30b51e542c984439a01e0e441c07b817beefc3" + integrity sha512-mD8NQf7z5UOaoqajOeRhc/CPk5JxiPQdJJWeT17zaqU1pmbwNxGQejX1UUaU5GYYSr2rXq07nySfA/lIsJjsig== + dependencies: + "@types/ember__runloop" "*" + +"@types/ember__service@*": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/ember__service/-/ember__service-3.0.5.tgz#6e566ae03eb26ec16ea6cc84e9cc190d926b791b" + integrity sha512-mThqrHMYVGSvsLRwJRWW0HV2DJ9WwLxiC13kSffhRqAKjQfeyq6ELoGtbXXMY3ri/nnGQJ6MVYY142s7AWdT/A== + dependencies: + "@types/ember__object" "*" + +"@types/ember__string@*": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/ember__string/-/ember__string-3.0.6.tgz#79b10b0fc0136a9c86536bc55cbd18cae9a9bd3b" + integrity sha512-VBKH8nR/uK2tlr9eob8Nl+0cKP62GNtFWqq4PVGusnBMPFktGley1gsUhqNYJ9G3y2mvVfikicxM2/bE5AMYLA== + +"@types/ember__test@*": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/ember__test/-/ember__test-3.0.5.tgz#8435b9b3caa5b97a9057d8f4e922c20f2279f93f" + integrity sha512-7F45zVSaM1hqXtv0bTMOLwgvATPfAGsnvU5CmMdUpuLBHRnOIe5HDAx0s1Yr4I318IAT5LgAX180dIJmXs1/+g== + dependencies: + "@types/ember__application" "*" + +"@types/ember__utils@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/ember__utils/-/ember__utils-3.0.2.tgz#d4c32007d0c84c95faa9221a1582b87ac3b1b4f3" + integrity sha512-d6fswmNDozslgUk+0DfC1oG0vD8R5ivvrEe0t3BuWSnF+TVyYhj24KZINecpBySg/4RODCg2IVV1GeRsimqzkg== + "@types/estree@*", "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== +"@types/htmlbars-inline-precompile@*": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/htmlbars-inline-precompile/-/htmlbars-inline-precompile-1.0.1.tgz#de564513fabb165746aecd76369c87bd85e5bbb4" + integrity sha512-sVD2e6QAAHW0Y6Btse+tTA9k9g0iKm87wjxRsgZRU5EwSooz80tenbV+fA+f2BI2g0G2CqxsS1rIlwQCtPRQow== + +"@types/jquery@*": + version "3.3.31" + resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.3.31.tgz#27c706e4bf488474e1cb54a71d8303f37c93451b" + integrity sha512-Lz4BAJihoFw5nRzKvg4nawXPzutkv7wmfQ5121avptaSIXlDNJCUuxZxX/G+9EVidZGuO0UBlk+YjKbwRKJigg== + dependencies: + "@types/sizzle" "*" + "@types/minimatch@^3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -1173,6 +1358,21 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.41.tgz#e57c3152eb2e7ec748c733cebd0c095b437c5d37" integrity sha512-sPZWEbFMz6qAy9SLY7jh5cgepmsiwqUUHjvEm8lpU6kug2hmmcyuTnwhoGw/GWpI5Npue4EqvsiQQI0eWjW/ZA== +"@types/q@^1.5.1": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" + integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== + +"@types/rsvp@*", "@types/rsvp@^4.0.2": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/rsvp/-/rsvp-4.0.3.tgz#4a1223158453257bce09d42b9eef7cfa6d257482" + integrity sha512-OpRwxbgx16nL/0/7ol0WoLLyLaMXBvtPOHjqLljnzAB/E7Qk1wtjytxgBhOTBMZvuLXnJUqfnjb4W/QclNFvSA== + +"@types/sizzle@*": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.2.tgz#a811b8c18e2babab7d542b3365887ae2e4d9de47" + integrity sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg== + "@types/symlink-or-copy@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@types/symlink-or-copy/-/symlink-or-copy-1.2.0.tgz#4151a81b4052c80bc2becbae09f3a9ec010a9c7a" @@ -1351,10 +1551,10 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -abortcontroller-polyfill@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.2.1.tgz#4e88847513a4ed691d5e4899d8b3a3af6f7d90ee" - integrity sha512-9jN7+BijYKWO8fxfcG7QZh7js6V+g3OjkxMRHfKWNjjs85048VY4cd27Uoe6yk55P66L/z7Dflu5+YEApgMzkA== +abortcontroller-polyfill@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.3.0.tgz#de69af32ae926c210b7efbcc29bf644ee4838b00" + integrity sha512-lbWQgf+eRvku3va8poBlDBO12FigTQr9Zb7NIjXrePrhxWVKdCP2wbDl1tLDaYa18PWTom3UEWwdH13S46I+yA== accepts@~1.3.4: version "1.3.4" @@ -1559,6 +1759,14 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" +anymatch@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.0.tgz#e609350e50a9313b472789b2f14ef35808ee14d6" + integrity sha512-Ozz7l4ixzI7Oxj2+cw+p0tVUt27BpaJ+1+q1TCeANWxHpvyn2+Un+YamBdfKu0uh8xLodGhoa1v7595NhKDAuA== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + aot-test-generators@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/aot-test-generators/-/aot-test-generators-0.1.0.tgz#43f0f615f97cb298d7919c1b0b4e6b7310b03cd0" @@ -1727,6 +1935,11 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= +ast-types@0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.2.tgz#df39b677a911a83f3a049644fb74fdded23cea48" + integrity sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA== + ast-types@0.9.6: version "0.9.6" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" @@ -2568,6 +2781,11 @@ binary-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" integrity sha1-RqoXUftqL5PuXmibsQh9SxTGwgU= +binary-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" + integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== + "binaryextensions@1 || 2": version "2.1.1" resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.1.tgz#3209a51ca4a4ad541a3b8d3d6a6d5b83a2485935" @@ -2655,7 +2873,7 @@ body@^5.1.0: raw-body "~1.1.0" safe-json-parse "~1.0.1" -boolbase@~1.0.0: +boolbase@^1.0.0, boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= @@ -2741,6 +2959,13 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + broccoli-amd-funnel@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/broccoli-amd-funnel/-/broccoli-amd-funnel-1.3.0.tgz#c4426b4fce976e44295bd74f34725f53bdeb08e3" @@ -2884,6 +3109,24 @@ broccoli-concat@^3.2.2, broccoli-concat@^3.5.1, broccoli-concat@^3.7.1, broccoli lodash.uniq "^4.2.0" walk-sync "^0.3.2" +broccoli-concat@^3.7.4: + version "3.7.4" + resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.7.4.tgz#7371e846eb7a97cb44ccff10f68582bcadcafacd" + integrity sha512-9gRv1tyCQuq2+48DT9DQyxRNLOuwDtHybDeYuWA3g26HFqZd0PGAOeXcLXHpKRhxzrEbU6Gm28dZ/KolMr04cQ== + dependencies: + broccoli-debug "^0.6.5" + broccoli-kitchen-sink-helpers "^0.3.1" + broccoli-plugin "^1.3.0" + ensure-posix-path "^1.0.2" + fast-sourcemap-concat "^1.4.0" + find-index "^1.1.0" + fs-extra "^4.0.3" + fs-tree-diff "^0.5.7" + lodash.merge "^4.6.2" + lodash.omit "^4.1.0" + lodash.uniq "^4.2.0" + walk-sync "^0.3.2" + broccoli-config-loader@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/broccoli-config-loader/-/broccoli-config-loader-1.0.1.tgz#d10aaf8ebc0cb45c1da5baa82720e1d88d28c80a" @@ -3030,7 +3273,7 @@ broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1, broccoli-funnel@^2.0.2: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-kitchen-sink-helpers@^0.2.0, broccoli-kitchen-sink-helpers@^0.2.5, broccoli-kitchen-sink-helpers@~0.2.0: +broccoli-kitchen-sink-helpers@^0.2.5, broccoli-kitchen-sink-helpers@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz#a5e0986ed8d76fb5984b68c3f0450d3a96e36ecc" integrity sha1-peCYbtjXb7WYS2jD8EUNOpbjbsw= @@ -3140,7 +3383,7 @@ broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-p symlink-or-copy "^1.0.1" walk-sync "^0.3.1" -broccoli-persistent-filter@^2.0.0, broccoli-persistent-filter@^2.1.0, broccoli-persistent-filter@^2.1.1, broccoli-persistent-filter@^2.2.1, broccoli-persistent-filter@^2.2.2, broccoli-persistent-filter@^2.3.1: +broccoli-persistent-filter@^2.1.0, broccoli-persistent-filter@^2.1.1, broccoli-persistent-filter@^2.2.1, broccoli-persistent-filter@^2.2.2, broccoli-persistent-filter@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.3.1.tgz#4a052e0e0868b344c3a2977e35a3d497aa9eca72" integrity sha512-hVsmIgCDrl2NFM+3Gs4Cr2TA6UPaIZip99hN8mtkaUPgM8UeVnCbxelCvBjUBHo0oaaqP5jzqqnRVvb568Yu5g== @@ -3240,16 +3483,7 @@ broccoli-sri-hash@^2.1.0: sri-toolbox "^0.2.0" symlink-or-copy "^1.0.1" -broccoli-static-compiler@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/broccoli-static-compiler/-/broccoli-static-compiler-0.1.4.tgz#713d18f08eb3131530575a0c5ad2951bba10af41" - integrity sha1-cT0Y8I6zExUwV1oMWtKVG7oQr0E= - dependencies: - broccoli-kitchen-sink-helpers "^0.2.0" - broccoli-writer "^0.1.1" - mkdirp "^0.3.5" - -broccoli-stew@^1.4.2, broccoli-stew@^1.5.0: +broccoli-stew@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-1.6.0.tgz#01f6d92806ed6679ddbe48d405066a0e164dfbef" integrity sha512-sUwCJNnYH4Na690By5xcEMAZqKgquUQnMAEuIiL3Z2k63mSw9Xg+7Ew4wCrFrMmXMcLpWjZDOm6Yqnq268N+ZQ== @@ -3269,7 +3503,7 @@ broccoli-stew@^1.4.2, broccoli-stew@^1.5.0: symlink-or-copy "^1.2.0" walk-sync "^0.3.0" -broccoli-stew@^2.0.0: +broccoli-stew@^2.0.0, broccoli-stew@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-2.1.0.tgz#ba73add17fda3b9b01d8cfb343a8b613b7136a0a" integrity sha512-tgCkuTWYl4uf7k7ib2D79KFEj2hCgnTUNPMnrCoAha0/4bywcNccmaZVWtL9Ex37yX5h5eAbnM/ak2ULoMwSSw== @@ -3308,27 +3542,16 @@ broccoli-style-manifest@^1.5.2: rsvp "^4.8.2" walk-sync "^0.3.1" -broccoli-svg-optimizer@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/broccoli-svg-optimizer/-/broccoli-svg-optimizer-1.1.0.tgz#5d6e03310298c7a1d22d373508beedc6258590cc" - integrity sha512-cFwZLK4xHreyTPRl1D2yVHnba5UhiS0EE7j42z05Q22aPFOmRrpMIJNiBnrfaPBmskpQYseZLnOYdwWP8Pj6Dw== - dependencies: - broccoli-persistent-filter "^1.2.0" - json-stable-stringify "^1.0.1" - lodash "^4.17.10" - rsvp "^4.8.2" - svgo "0.6.6" - -broccoli-symbolizer@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/broccoli-symbolizer/-/broccoli-symbolizer-0.6.0.tgz#1ece00fba329f19ab42d920350a5f2014f8d0b52" - integrity sha512-ZwVDX+kkJ7/TXdhl2ChRZARNAeBiru1+53HHafN5UcnpIzJaE+CbyuSQdxEtnIakSKIZtgI/J6uJIffGDgft3g== +broccoli-svg-optimizer@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/broccoli-svg-optimizer/-/broccoli-svg-optimizer-2.0.0.tgz#22b6920bee5e126e86b95ae0cdf8ad6cc4be3735" + integrity sha512-zIbUmBeSxl9r18Mqjl0OArvXyAKuSDd4FFVcH5HmiX2/1SFUofL4JN5g5qhP/GqQnLTEVdwr61LawSGDZHcqOg== dependencies: - broccoli-concat "^3.2.2" - broccoli-persistent-filter "^1.2.0" - cheerio "^0.22.0" + broccoli-persistent-filter "^2.3.1" json-stable-stringify "^1.0.1" - lodash "^4.17.10" + lodash "^4.17.15" + rsvp "^4.8.5" + svgo "1.3.0" broccoli-templater@^2.0.1: version "2.0.2" @@ -3370,7 +3593,7 @@ broccoli-uglify-sourcemap@^3.1.0: walk-sync "^1.1.3" workerpool "^3.1.2" -broccoli-writer@^0.1.1, broccoli-writer@~0.1.1: +broccoli-writer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/broccoli-writer/-/broccoli-writer-0.1.1.tgz#d4d71aa8f2afbc67a3866b91a2da79084b96ab2d" integrity sha1-1NcaqPKvvGejhmuRotp5CEuWqy0= @@ -3647,6 +3870,13 @@ calculate-cache-key-for-tree@^1.1.0, calculate-cache-key-for-tree@^1.2.0: dependencies: json-stable-stringify "^1.0.1" +calculate-cache-key-for-tree@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-2.0.0.tgz#7ac57f149a4188eacb0a45b210689215d3fef8d6" + integrity sha512-Quw8a6y8CPmRd6eU+mwypktYCwUcf8yVFIRbNZ6tPQEckX9yd+EBVEPC/GSZZrMWH9e7Vz4pT7XhpmyApRByLQ== + dependencies: + json-stable-stringify "^1.0.1" + callsite@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" @@ -3853,7 +4083,22 @@ cheerio@^1.0.0-rc.2: lodash "^4.15.0" parse5 "^3.0.1" -chokidar@^2.0.0, chokidar@^2.0.2: +"chokidar@>=2.0.0 <4.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.0.2.tgz#0d1cd6d04eb2df0327446188cd13736a3367d681" + integrity sha512-c4PR2egjNjI1um6bamCQ6bUNPDiyofNQruHvKgHQ4gDUP/ITSVSzNsiI5OWtHOsX323i5ha/kk4YmOZ1Ktg7KA== + dependencies: + anymatch "^3.0.1" + braces "^3.0.2" + glob-parent "^5.0.0" + is-binary-path "^2.1.0" + is-glob "^4.0.1" + normalize-path "^3.0.0" + readdirp "^3.1.1" + optionalDependencies: + fsevents "^2.0.6" + +chokidar@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== @@ -3898,13 +4143,6 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -clap@^1.0.9: - version "1.2.3" - resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" - integrity sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA== - dependencies: - chalk "^1.1.3" - class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -4051,11 +4289,13 @@ co@^4.6.0: resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= -coa@~1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" - integrity sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0= +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" q "^1.1.2" code-point-at@^1.0.0: @@ -4098,7 +4338,7 @@ colors@1.0.3: resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= -colors@^1.1.2, colors@~1.1.2: +colors@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= @@ -4492,6 +4732,21 @@ cson-parser@^1.1.0: dependencies: coffee-script "^1.10.0" +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.0.2.tgz#ab4386cec9e1f668855564b17c3733b43b2a5ede" + integrity sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ== + dependencies: + boolbase "^1.0.0" + css-what "^2.1.2" + domutils "^1.7.0" + nth-check "^1.0.2" + css-select@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" @@ -4502,23 +4757,43 @@ css-select@~1.2.0: domutils "1.5.1" nth-check "~1.0.1" +css-tree@1.0.0-alpha.29: + version "1.0.0-alpha.29" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39" + integrity sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg== + dependencies: + mdn-data "~1.1.0" + source-map "^0.5.3" + +css-tree@1.0.0-alpha.33: + version "1.0.0-alpha.33" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.33.tgz#970e20e5a91f7a378ddd0fc58d0b6c8d4f3be93e" + integrity sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w== + dependencies: + mdn-data "2.0.4" + source-map "^0.5.3" + css-what@2.1: version "2.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" integrity sha1-lGfQMsOM+u+58teVASUwYvh/ob0= +css-what@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + css.escape@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= -csso@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/csso/-/csso-2.0.0.tgz#178b43a44621221c27756086f531e02f42900ee8" - integrity sha1-F4tDpEYhIhwndWCG9THgL0KQDug= +csso@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b" + integrity sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg== dependencies: - clap "^1.0.9" - source-map "^0.5.3" + css-tree "1.0.0-alpha.29" cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0", "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.6: version "0.3.6" @@ -4663,7 +4938,7 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -define-properties@^1.1.2: +define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== @@ -4840,7 +5115,7 @@ domutils@1.5, domutils@1.5.1: dom-serializer "0" domelementtype "1" -domutils@^1.5.1: +domutils@^1.5.1, domutils@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== @@ -4933,19 +5208,23 @@ ember-ajax@^5.0.0: ember-cli-babel "^7.5.0" najax "^1.0.3" -ember-app-scheduler@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/ember-app-scheduler/-/ember-app-scheduler-1.0.4.tgz#2d75cc645c18a0f5b0febaf8de37e6ca4059f4ed" - integrity sha512-0rqIegUhT2oxMUivxg/PHXTKaqjHxg/SKhqSbXqMxusyHhKduOjFeEzf6sU6zr1XwXt8cTg361NYMOON+0r3kw== +ember-app-scheduler@^1.0.5: + version "1.0.8" + resolved "https://registry.yarnpkg.com/ember-app-scheduler/-/ember-app-scheduler-1.0.8.tgz#37adacce2fa5ab59324e2c0b08f3c4a3568025b4" + integrity sha512-fYCOhQTLb1b+TZ2PBSqyvHXVAxf7qfWD0ZSJTd/IdU/xbLJSt34X75w7qK2uBHZCkVvCNm/ATW3pjFC/0zYk7A== dependencies: - ember-cli-babel "^6.3.0" + "@types/ember" "^3.1.0" + "@types/rsvp" "^4.0.2" + ember-cli-babel "^7.1.3" + ember-cli-typescript "^2.0.0" + ember-compatibility-helpers "^1.1.2" -ember-assign-polyfill@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/ember-assign-polyfill/-/ember-assign-polyfill-2.5.0.tgz#0dc7079addbdbad7984ba3f35d970cf07a73f704" - integrity sha512-oRGPg/jeo4SAIJX56PYUDcVcjcfkuZe6j9umkuSkjwuduMBQNtmyoC8qhcCBrn+qqrtAG6g3iSAdEu8DkUBIiQ== +ember-assign-polyfill@^2.5.0, ember-assign-polyfill@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/ember-assign-polyfill/-/ember-assign-polyfill-2.6.0.tgz#07847e3357ee35b33f886a0b5fbec6873f6860eb" + integrity sha512-Y8NzOmHI/g4PuJ+xC14eTYiQbigNYddyHB8FY2kuQMxThTEIDE7SJtgttJrYYcPciOu0Tnb5ff36iO46LeiXkw== dependencies: - ember-cli-babel "^6.6.0" + ember-cli-babel "^6.16.0" ember-cli-version-checker "^2.0.0" ember-assign-polyfill@~2.4.0: @@ -4956,7 +5235,7 @@ ember-assign-polyfill@~2.4.0: ember-cli-babel "^6.6.0" ember-cli-version-checker "^2.0.0" -ember-auto-import@^1.2.19: +ember-auto-import@^1.2.19, ember-auto-import@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.5.2.tgz#e97ed96b600caa6090ffed83e4611c3e7ec9bad7" integrity sha512-skVQpfdc6G5OVRsyemDn3vI1nj/iBBgnoqRLRka0ZbDT2GqelmyJ86bp+Bd/ztJe45Le3we+LXbR7T54RU5A9w== @@ -5008,23 +5287,24 @@ ember-cli-addon-docs-esdoc@^0.2.2: walk-sync "^0.3.2" ember-cli-addon-docs@^0.6.13: - version "0.6.13" - resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.13.tgz#84bb96ea30f63adc16f8bf3eb08f12c68fbd14f0" - integrity sha512-K3emQn7WWTYAktUKSG2zTT/U53aXjO5KllvGZDg2LURweCe1YQ/turRww9sx+6CQcxU1oGNujGHpUxnyEGEPTA== + version "0.6.14" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.14.tgz#7d7801f0ffca6df00b86a11d58101c8523e6d44b" + integrity sha512-kfwGcoeNN6ban1ghHdaIqlfvMkj7T9oWoiel7kHknbgcukC5GX67G1w5CaEVMtmAK69kIlJDzo7VB+hAUnCthw== dependencies: - "@glimmer/syntax" "^0.36.4" + "@glimmer/syntax" "^0.42.0" broccoli-bridge "^1.0.0" broccoli-caching-writer "^3.0.3" broccoli-debug "^0.6.4" broccoli-filter "^1.2.4" - broccoli-funnel "^2.0.1" + broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.1" - broccoli-persistent-filter "^2.0.0" + broccoli-persistent-filter "^2.3.1" broccoli-plugin "^1.3.1" broccoli-source "^1.1.0" broccoli-stew "^2.0.0" chalk "^2.4.2" - ember-auto-import "^1.2.19" + ember-assign-polyfill "^2.6.0" + ember-auto-import "^1.5.2" ember-cli-autoprefixer "^0.8.1" ember-cli-babel "^7.7.3" ember-cli-clipboard "^0.11.1" @@ -5034,40 +5314,40 @@ ember-cli-addon-docs@^0.6.13: ember-cli-string-helpers "^1.9.0" ember-cli-string-utils "^1.1.0" ember-cli-tailwind "^0.6.2" - ember-code-snippet "^2.4.0" - ember-component-css "^0.6.7" - ember-concurrency "^0.9.0" + ember-code-snippet "^2.4.1" + ember-component-css "^0.7.4" + ember-concurrency "^0.9.0 || ^0.10.0 || ^1.0.0" ember-data "2.x - 3.x" - ember-fetch "^6.2.0" + ember-fetch "^6.7.0" ember-fetch-adapter "^0.4.3" ember-href-to "^1.15.1" ember-keyboard "^4.0.0" - ember-modal-dialog "3.0.0-beta.3" - ember-responsive "^3.0.1" - ember-router-generator "^1.2.3" - ember-router-scroll "^1.0.0" - ember-svg-jar "^1.2.2" + ember-modal-dialog "^3.0.0-beta.4" + ember-responsive "^3.0.5" + ember-router-generator "^2.0.0" + ember-router-scroll "^1.2.1" + ember-svg-jar "^2.1.0" ember-tether "^1.0.0-beta.2" ember-truth-helpers "^2.1.0" - esm "^3.2.4" + esm "^3.2.25" execa "^1.0.0" fs-extra "^7.0.0" - git-repo-info "^2.0.0" + git-repo-info "^2.1.0" highlight.js "^9.14.2" hosted-git-info "^2.7.1" html-entities "^1.2.1" inflected "^2.0.3" jsdom "^11.12.0" json-api-serializer "^1.13.0" - liquid-fire "^0.29.5" - lodash "^4.17.11" - lunr "^2.3.3" + liquid-fire "^0.29.5 || ^0.30.0" + lodash "^4.17.15" + lunr "^2.3.6" marked "^0.5.0" pad-start "^1.0.2" parse-git-config "^2.0.3" quick-temp "^0.1.8" - resolve "^1.8.1" - sass "^1.17.0" + resolve "^1.12.0" + sass "^1.22.10" semver "^5.5.1" striptags "^3.1.1" walk-sync "^0.3.3" @@ -5563,7 +5843,7 @@ ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0, ember-cli-ve resolve "^1.3.3" semver "^5.3.0" -ember-cli-version-checker@^3.0.0, ember-cli-version-checker@^3.1.3: +ember-cli-version-checker@^3.0.0, ember-cli-version-checker@^3.0.1, ember-cli-version-checker@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-3.1.3.tgz#7c9b4f5ff30fdebcd480b1c06c4de43bb51c522c" integrity sha512-PZNSvpzwWgv68hcXxyjREpj3WWb81A7rtYNQq1lLEgrWIchF8ApKJjWP3NBpHjaatwILkZAV8klair5WFlXAKg== @@ -5664,15 +5944,16 @@ ember-cli@~3.4.4: watch-detector "^0.1.0" yam "^0.0.24" -ember-code-snippet@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/ember-code-snippet/-/ember-code-snippet-2.4.0.tgz#3ed901ee0c6458019b67733e923056d5b9f74bc2" - integrity sha512-MLnUxsbxoW1njWYrIRB0T0AbH8Ng2IJTUMXSmR/40z4Hnu6ykC7sCFJyzxcmdIj6IVPmOcFN7WpOMEfPWjKmIQ== +ember-code-snippet@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/ember-code-snippet/-/ember-code-snippet-2.4.1.tgz#4f4416bcfbc6c5e4a7c073158aff92748e31f219" + integrity sha512-LQTYH2E2/5cVxEPhL8v1VcXJSd/73735gj3KuRNwCYPK4PS91lpOho6L/1cLACSOg0W2a8YZKgfPAHN7aQGfgw== dependencies: broccoli-flatiron "^0.1.3" broccoli-merge-trees "^1.0.0" - broccoli-static-compiler "^0.1.4" - broccoli-writer "^0.1.1" + broccoli-plugin "^1.3.1" + ember-cli-babel "^7.7.3" + ember-cli-htmlbars "^3.0.1" es6-promise "^1.0.0" glob "^7.1.3" @@ -5685,7 +5966,7 @@ ember-compatibility-helpers@^1.1.1: ember-cli-version-checker "^2.1.1" semver "^5.4.1" -ember-compatibility-helpers@^1.2.0: +ember-compatibility-helpers@^1.1.2, ember-compatibility-helpers@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.2.0.tgz#feee16c5e9ef1b1f1e53903b241740ad4b01097e" integrity sha512-pUW4MzJdcaQtwGsErYmitFRs0rlCYBAnunVzlFFUBr4xhjlCjgHJo0b53gFnhTgenNM3d3/NqLarzRhDTjXRTg== @@ -5694,10 +5975,10 @@ ember-compatibility-helpers@^1.2.0: ember-cli-version-checker "^2.1.1" semver "^5.4.1" -ember-component-css@^0.6.7: - version "0.6.7" - resolved "https://registry.yarnpkg.com/ember-component-css/-/ember-component-css-0.6.7.tgz#dbc6debe5c04a2c0fe8a5edc64303c7324b33945" - integrity sha512-nZbGVHr3TI5uBb6mGqAvB2QJo8VQcmXTLCy/PnJ/Lyq3sKZCjg5dQE66X+TcHPG3IWEMOmCe/1vaK4HPtE8gfA== +ember-component-css@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/ember-component-css/-/ember-component-css-0.7.4.tgz#b8e94b062468721df6c9ea0c8739226c96809c9f" + integrity sha512-dJV6WyvIc4NZ2fSNhMWe4UJaSPLBtjQ4zHJ9bOg6UCMLHfTlwjJsn+rYqddMn65xau7MS8mwxa+otujQij0xEw== dependencies: broccoli-concat "^3.7.3" broccoli-funnel "^2.0.1" @@ -5707,14 +5988,14 @@ ember-component-css@^0.6.7: broccoli-replace "^0.12.0" broccoli-style-manifest "^1.5.2" ember-cli-babel "^7.1.4" - ember-cli-version-checker "^2.1.2" + ember-cli-version-checker "^3.0.1" ember-getowner-polyfill "^2.2.0" - fs-tree-diff "^1.0.2" + fs-tree-diff "^0.5.9" md5 "^2.2.1" postcss "^7.0.6" postcss-less "^3.1.0" postcss-scss "^2.0.0" - postcss-selector-namespace "^1.5.0" + postcss-selector-namespace "^2.0.0" rsvp "^4.8.4" walk-sync "^1.0.1" @@ -5728,10 +6009,10 @@ ember-composable-helpers@^2.1.0: ember-cli-babel "^7.1.0" resolve "^1.10.0" -ember-concurrency@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-0.9.0.tgz#0016652ff780fb665842e7f47815ee0601122ea1" - integrity sha512-JDjvwSlZBUQwv1+qUj6YUqXXe0Y0/to4ppUTNXQ1EEiEAopkHJXQUn0ZcFOiQpEinrYp34Vg6+lUNskoJFL2Vg== +"ember-concurrency@^0.9.0 || ^0.10.0 || ^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-1.0.0.tgz#3b650672fdd5dc1d45007626119135829076c2b6" + integrity sha512-76aKC0lo2LAPoQYz7vMRlpolWTIQerszr8PPf3JMM5cTOzPwXUtzDcjfso3JAEDdhyUF9fkv2V1DmHagFbC2YQ== dependencies: babel-core "^6.24.1" ember-cli-babel "^6.8.2" @@ -5803,22 +6084,22 @@ ember-fetch-adapter@^0.4.3: dependencies: ember-cli-babel "^6.12.0" -ember-fetch@^6.2.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-6.4.0.tgz#806b2acfbda07f3b0dd48a9fcdbc575c5519611d" - integrity sha512-/GtJWQiUAAOX2HMGuLrWQMNWO9YRNH9+AiMzZYc5PrTHKdv+Ib5fciysz0+e97Dj9vyvF2mQa49mrosAPW9ziQ== +ember-fetch@^6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-6.7.0.tgz#c219f820e40f7918147391617a5940c67d293319" + integrity sha512-lB9G+XDKOc84Dr3THJs+l/KmtzUus7nv12Z0xOP54J917HmjnAsSZ9OHTp+X8ClxlAm35/v9l+sFd7IlB9Baqw== dependencies: - abortcontroller-polyfill "^1.2.1" + abortcontroller-polyfill "^1.3.0" broccoli-concat "^3.2.2" broccoli-debug "^0.6.5" broccoli-merge-trees "^3.0.0" broccoli-rollup "^2.1.1" - broccoli-stew "^2.0.0" + broccoli-stew "^2.1.0" broccoli-templater "^2.0.1" - calculate-cache-key-for-tree "^1.1.0" + calculate-cache-key-for-tree "^2.0.0" caniuse-api "^3.0.0" ember-cli-babel "^6.8.2" - node-fetch "^2.3.0" + node-fetch "^2.6.0" whatwg-fetch "^3.0.0" ember-get-config@^0.2.2: @@ -5829,7 +6110,7 @@ ember-get-config@^0.2.2: broccoli-file-creator "^1.1.1" ember-cli-babel "^6.3.0" -ember-getowner-polyfill@^2.0.1, ember-getowner-polyfill@^2.2.0: +ember-getowner-polyfill@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ember-getowner-polyfill/-/ember-getowner-polyfill-2.2.0.tgz#38e7dccbcac69d5ec694000329ec0b2be651d2b2" integrity sha512-rwGMJgbGzxIAiWYjdpAh04Abvt0s3HuS/VjHzUFhVyVg2pzAuz45B9AzOxYXzkp88vFC7FPaiA4kE8NxNk4A4Q== @@ -5837,14 +6118,6 @@ ember-getowner-polyfill@^2.0.1, ember-getowner-polyfill@^2.2.0: ember-cli-version-checker "^2.1.0" ember-factory-for-polyfill "^1.3.1" -ember-hash-helper-polyfill@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ember-hash-helper-polyfill/-/ember-hash-helper-polyfill-0.2.1.tgz#73b074d8e2f7183d2e68c3df77e951097afa907c" - integrity sha512-bEiKQeWGjswH1ykVY1zXabambolEPDwQCPuYOgUoRyEV4JFR9h91s3c8PNNy2pjoYBLkIYuCk4F4POJJLmDPjw== - dependencies: - ember-cli-babel "^6.8.2" - ember-cli-version-checker "^2.1.0" - ember-href-to@^1.15.1: version "1.15.1" resolved "https://registry.yarnpkg.com/ember-href-to/-/ember-href-to-1.15.1.tgz#1ba20ec201245c7cae7e2aa3eec50eb2aa25b729" @@ -5918,10 +6191,10 @@ ember-maybe-import-regenerator@^0.1.5: ember-cli-babel "^6.0.0-beta.4" regenerator-runtime "^0.9.5" -ember-modal-dialog@3.0.0-beta.3: - version "3.0.0-beta.3" - resolved "https://registry.yarnpkg.com/ember-modal-dialog/-/ember-modal-dialog-3.0.0-beta.3.tgz#8ba00c1a228d62d837f63dc7ce964e48f25d1326" - integrity sha512-R9vo3KftPmNJK89rIipKvoTEvTC3tMEtM4Yhy2gyMX3yrFCcNPlnTXTRyTePUtSVxPNq9lNT1n0YWMBT1xoJxg== +ember-modal-dialog@^3.0.0-beta.4: + version "3.0.0-beta.4" + resolved "https://registry.yarnpkg.com/ember-modal-dialog/-/ember-modal-dialog-3.0.0-beta.4.tgz#2da8b5424cf33fd87117624dcaabfe9727f967e9" + integrity sha512-23kCmH0uPkDh132NbXr4E7x15gF00pGM8f/Q0lCV6IKZOJcW+lb9L6sKgkEEayzGTvgxp4BPU8n8xnIP3go4FA== dependencies: ember-cli-babel "^7.1.3" ember-cli-htmlbars "^3.0.0" @@ -5964,10 +6237,10 @@ ember-resolver@^5.0.1: ember-cli-version-checker "^3.0.0" resolve "^1.10.0" -ember-responsive@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ember-responsive/-/ember-responsive-3.0.1.tgz#52eac29ff9ab57e4912f65354056aee1f132c63c" - integrity sha512-diHQ09KL1SNM0jOwW6iGailh0MhcbdBP5JIQc/jiIijYm/pNe0LRGnnYvM3FK5RQ6XeDg87rLx0shLyCy0HpTg== +ember-responsive@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/ember-responsive/-/ember-responsive-3.0.5.tgz#690c96a051dcf7c10a8c3bcfb3b23ecc784e3f7d" + integrity sha512-tQMDxrIsDyfvyLWhyQ2MYpJVkm1pmBKJSQKgdA06EFRrVw5QYX4coXemSZOzBM9gPrkgOUfPp522GaldsAeInw== dependencies: ember-cli-babel "^6.6.0" @@ -5983,14 +6256,23 @@ ember-router-generator@^1.2.3: dependencies: recast "^0.11.3" -ember-router-scroll@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ember-router-scroll/-/ember-router-scroll-1.0.1.tgz#07f57aae10a009d170928b9e62b85edd92c81e4e" - integrity sha512-bEQF9WTXwVkaGpAz6f+8nQOKvG2HH2if11ZoKpaDRVxQF5K+y6Pa/c7Y8TNZAELk3NJVFizH7m0OeNAY91DKFA== +ember-router-generator@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-2.0.0.tgz#d04abfed4ba8b42d166477bbce47fccc672dbde0" + integrity sha512-89oVHVJwmLDvGvAUWgS87KpBoRhy3aZ6U0Ql6HOmU4TrPkyaa8pM0W81wj9cIwjYprcQtN9EwzZMHnq46+oUyw== dependencies: - ember-app-scheduler "^1.0.1" - ember-cli-babel "^7.1.0" - ember-getowner-polyfill "^2.0.1" + "@babel/parser" "^7.4.5" + "@babel/traverse" "^7.4.5" + recast "^0.18.1" + +ember-router-scroll@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ember-router-scroll/-/ember-router-scroll-1.2.1.tgz#47c2293d4cb32d47ea7c103dc6af597af6eee4a7" + integrity sha512-QgZ7wzCLuV52ctudjcxiNLScE2uqv8z+8AX1RVfWGcMqoSYv+FqtlvEMx0zJyXwEpQH2Oy1yDABMKeFiFP4VXg== + dependencies: + ember-app-scheduler "^1.0.5" + ember-cli-babel "^7.1.2" + ember-compatibility-helpers "^1.1.2" ember-router-service-polyfill@^1.0.2: version "1.0.3" @@ -6033,21 +6315,23 @@ ember-source@~3.12.0: jquery "^3.4.1" resolve "^1.11.1" -ember-svg-jar@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/ember-svg-jar/-/ember-svg-jar-1.2.2.tgz#065d9a462353dbf3b1b4f57fb653859bfbe52022" - integrity sha512-vIB/SyLdsp1PLuz0oPd56CD9U4yUYWv0ghhMlemVM8wwshgopztE0tDFjoIEZjhbZ7kNkLLUt69qMvyMjx5NPg== +ember-svg-jar@^2.1.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ember-svg-jar/-/ember-svg-jar-2.2.1.tgz#89c672162a7b479e10c08acfd3eabe93d1eb0275" + integrity sha512-NHG2go9iX+xggX0J65kKPjDMhJPF2r237CTqFlVM857acWqxS1XkHnpPP6Tesihk/S0y6+fjefuf2GzK/NtchA== dependencies: broccoli-caching-writer "^3.0.3" - broccoli-funnel "^2.0.1" - broccoli-merge-trees "^2.0.0" + broccoli-concat "^3.7.4" + broccoli-funnel "^2.0.2" + broccoli-merge-trees "^3.0.2" + broccoli-persistent-filter "^2.3.1" broccoli-string-replace "^0.1.2" - broccoli-svg-optimizer "1.1.0" - broccoli-symbolizer "^0.6.0" + broccoli-svg-optimizer "2.0.0" cheerio "^0.22.0" ember-assign-polyfill "^2.5.0" - ember-cli-babel "^6.6.0" - lodash "^4.13.1" + ember-cli-babel "^7.7.3" + json-stable-stringify "^1.0.1" + lodash "^4.17.15" mkdirp "^0.5.1" path-posix "^1.0.0" @@ -6228,6 +6512,22 @@ error@^7.0.0: string-template "~0.2.1" xtend "~4.0.0" +es-abstract@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.14.1.tgz#6e8d84b445ec9c610781e74a6d52cc31aac5b4ca" + integrity sha512-cp/Tb1oA/rh2X7vqeSOvM+TSo3UkJLX70eNihgVEvnzwAgikjkTFr/QVgRCaxjm0knCNQzNoxxxcw2zO2LJdZA== + dependencies: + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.0" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-inspect "^1.6.0" + object-keys "^1.1.1" + string.prototype.trimleft "^2.0.0" + string.prototype.trimright "^2.0.0" + es-abstract@^1.5.1, es-abstract@^1.9.0: version "1.13.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" @@ -6429,10 +6729,10 @@ eslint@^5.16.0, eslint@^5.6.0: table "^5.2.3" text-table "^0.2.0" -esm@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.4.tgz#0b728b5d6043061bf552197407bf2c630717812b" - integrity sha512-wOuWtQCkkwD1WKQN/k3RsyGSSN+AmiUzdKftn8vaC+uV9JesYmQlODJxgXaaRz0LaaFIlUxZaUu5NPiUAjKAAA== +esm@^3.2.25: + version "3.2.25" + resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" + integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== espree@^5.0.1: version "5.0.1" @@ -6443,11 +6743,6 @@ espree@^5.0.1: acorn-jsx "^5.0.0" eslint-visitor-keys "^1.0.0" -esprima@^2.6.0: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= - esprima@^3.1.3, esprima@~3.1.0: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" @@ -6463,6 +6758,11 @@ esprima@~3.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.0.0.tgz#53cf247acda77313e551c3aa2e73342d3fb4f7d9" integrity sha1-U88kes2ncxPlUcOqLnM0LT+099k= +esprima@~4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + esquery@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" @@ -7043,6 +7343,13 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + finalhandler@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" @@ -7347,7 +7654,7 @@ fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5 path-posix "^1.0.0" symlink-or-copy "^1.1.8" -fs-tree-diff@^1.0.0, fs-tree-diff@^1.0.2: +fs-tree-diff@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-1.0.2.tgz#0e2931733a85b55feb3472c0b89a20b0c03ac0de" integrity sha512-Zro2ACaPVDgVOx9+s5s5AfPlAD0kMJdbwGvTGF6KC1SjxjiGWxJvV4mUTDkFVSy3OUw2C/f1qpdjF81hGqSBAw== @@ -7410,7 +7717,12 @@ fsevents@^1.2.3: nan "^2.9.2" node-pre-gyp "^0.10.0" -function-bind@^1.1.1: +fsevents@^2.0.6: + version "2.0.7" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.0.7.tgz#382c9b443c6cbac4c57187cdda23aa3bf1ccfc2a" + integrity sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ== + +function-bind@^1.0.2, function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== @@ -7531,7 +7843,7 @@ git-repo-info@^1.4.1: resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-1.4.1.tgz#2a072823254aaf62fcf0766007d7b6651bd41943" integrity sha1-KgcoIyVKr2L88HZgB9e2ZRvUGUM= -git-repo-info@^2.0.0: +git-repo-info@^2.0.0, git-repo-info@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-2.1.0.tgz#13d1f753c75bc2994432e65a71e35377ff563813" integrity sha512-+kigfDB7j3W80f74BoOUX+lKOmf4pR3/i2Ww6baKTCPe2hD4FRdjhV3s4P5Dy0Tak1uY1891QhKoYNtnyX2VvA== @@ -7592,6 +7904,13 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" +glob-parent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.0.0.tgz#1dc99f0f39b006d3e92c2c284068382f0c20e954" + integrity sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg== + dependencies: + is-glob "^4.0.1" + glob@^5.0.10: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" @@ -7736,7 +8055,7 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -handlebars@^4.0.11, handlebars@^4.0.4, handlebars@^4.0.6, handlebars@~4.1.2: +handlebars@^4.0.11, handlebars@^4.0.4, handlebars@~4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== @@ -7747,6 +8066,17 @@ handlebars@^4.0.11, handlebars@^4.0.4, handlebars@^4.0.6, handlebars@~4.1.2: optionalDependencies: uglify-js "^3.1.4" +handlebars@^4.0.13: + version "4.2.0" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.2.0.tgz#57ce8d2175b9bbb3d8b3cf3e4217b1aec8ddcb2e" + integrity sha512-Kb4xn5Qh1cxAKvQnzNWZ512DhABzyFNmsaJf3OAkWNa4NkaqWcNI8Tao8Tasi0/F4JD9oyG0YxuFyvyR57d+Gw== + dependencies: + neo-async "^2.6.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -8352,6 +8682,13 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" +is-binary-path@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + is-buffer@^1.1.5, is-buffer@~1.1.1: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -8490,6 +8827,13 @@ is-glob@^4.0.0: dependencies: is-extglob "^2.1.1" +is-glob@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" @@ -8514,6 +8858,11 @@ is-number@^4.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" @@ -8786,7 +9135,7 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.12.0, js-yaml@^3.12.1, js-yaml@^3.13.0, js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.3.0: +js-yaml@^3.12.0, js-yaml@^3.12.1, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.3.0: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -8794,14 +9143,6 @@ js-yaml@^3.12.0, js-yaml@^3.12.1, js-yaml@^3.13.0, js-yaml@^3.2.5, js-yaml@^3.2. argparse "^1.0.7" esprima "^4.0.0" -js-yaml@~3.6.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" - integrity sha1-bl/mfYsgXOTSL60Ft3geja3MSzA= - dependencies: - argparse "^1.0.7" - esprima "^2.6.0" - jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -9145,22 +9486,20 @@ linkify-it@~1.2.0: dependencies: uc.micro "^1.0.1" -liquid-fire@^0.29.5: - version "0.29.5" - resolved "https://registry.yarnpkg.com/liquid-fire/-/liquid-fire-0.29.5.tgz#da8e3158e3f96c34a8cf371b90b8ae941ea8960d" - integrity sha512-h+KxMaCvavkAfL5duNc5tQikrZxzbGVvUdmBU9mjkInUQQKvTjpD1DwphRKk6qWRRuDY9HT2ecY0Hf6/gMXkJA== +"liquid-fire@^0.29.5 || ^0.30.0": + version "0.30.0" + resolved "https://registry.yarnpkg.com/liquid-fire/-/liquid-fire-0.30.0.tgz#20e6673f9db32d503f909592fd2c691452b07d6d" + integrity sha512-5ffmsrPvAzc4EQdjVHouiPc0m+c+wt4YOBgABrPgO+30cSAlYLYuIhQIQ5j+zX87oa61btq0BJVjjtxunG1Nrg== dependencies: - broccoli-funnel "^1.0.1" - broccoli-merge-trees "^1.0.0" - broccoli-stew "^1.4.2" - ember-cli-babel "^6.6.0" - ember-cli-htmlbars "^2.0.1" - ember-cli-version-checker "^2.0.0" + broccoli-funnel "^2.0.2" + broccoli-merge-trees "^3.0.2" + broccoli-stew "^2.1.0" + ember-cli-babel "^7.7.3" + ember-cli-htmlbars "^3.0.1" + ember-cli-version-checker "^3.1.3" ember-copy "^1.0.0" - ember-getowner-polyfill "^2.0.1" - ember-hash-helper-polyfill "^0.2.0" match-media "^0.2.0" - velocity-animate "^1.5.1" + velocity-animate "^1.5.2" livereload-js@^2.3.0: version "2.3.0" @@ -9584,7 +9923,7 @@ lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -lodash.merge@^4.3.1, lodash.merge@^4.4.0, lodash.merge@^4.6.0, lodash.merge@~4.6.1: +lodash.merge@^4.3.1, lodash.merge@^4.4.0, lodash.merge@^4.6.0, lodash.merge@^4.6.2, lodash.merge@~4.6.1: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== @@ -9694,10 +10033,10 @@ lodash@^3.10.0: resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= -lodash@^4.0.0, lodash@^4.1.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== +lodash@^4.0.0, lodash@^4.1.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== log-symbols@^2.2.0: version "2.2.0" @@ -9751,10 +10090,10 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -lunr@^2.3.3: - version "2.3.5" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.5.tgz#7b510bad57e948dfb99a71fdff00c1bf9171bdda" - integrity sha512-EtnfmHsHJTr3u24sito9JctSxej5Ds0SgUD2Lm+qRHyLgM7BGesFlW14eNh1mil0fV5Muh8gf3dBBXzADlUlzQ== +lunr@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.6.tgz#f278beee7ffd56ad86e6e478ce02ab2b98c78dd5" + integrity sha512-swStvEyDqQ85MGpABCMBclZcLI/pBIlu8FFDtmX197+oEgKloJ67QnB+Tidh0340HmLMs39c4GrkPY3cmkXp6Q== magic-string@^0.22.0, magic-string@^0.22.4: version "0.22.5" @@ -9922,6 +10261,16 @@ md5@^2.2.1: crypt "~0.0.1" is-buffer "~1.1.1" +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +mdn-data@~1.1.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01" + integrity sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA== + mdn-links@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/mdn-links/-/mdn-links-0.1.0.tgz#e24c83b97cb4c5886cc39f2f780705fbfe273aa5" @@ -10395,10 +10744,10 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" -node-fetch@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5" - integrity sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA== +node-fetch@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" + integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== node-int64@^0.4.0: version "0.4.0" @@ -10519,6 +10868,11 @@ normalize-path@^2.0.1, normalize-path@^2.1.1: dependencies: remove-trailing-separator "^1.0.1" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" @@ -10578,6 +10932,13 @@ npmlog@^4.0.0, npmlog@^4.0.2: gauge "~2.7.3" set-blocking "~2.0.0" +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + nth-check@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" @@ -10644,11 +11005,21 @@ object-hash@^1.3.1: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== +object-inspect@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" + integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== + object-keys@^1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag== +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -10679,6 +11050,16 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" +object.values@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" + integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.12.0" + function-bind "^1.1.1" + has "^1.0.3" + omggif@^1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.9.tgz#dcb7024dacd50c52b4d303f04802c91c057c765f" @@ -11160,6 +11541,11 @@ phin@^2.9.1: resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c" integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== +picomatch@^2.0.4: + version "2.0.7" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" + integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== + pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -11311,12 +11697,12 @@ postcss-scss@^2.0.0: dependencies: postcss "^7.0.0" -postcss-selector-namespace@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/postcss-selector-namespace/-/postcss-selector-namespace-1.5.0.tgz#62335de8f1992eae989d1be33ba2298156ab458b" - integrity sha512-tQmqzuqOyH4sCwr+yRmnIKPzNQy1tIVvEZMR9qd82npDJ2X5KwMoeFFjCdupJ00eqMrCYj58wWvSwwZDA3kTmA== +postcss-selector-namespace@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-namespace/-/postcss-selector-namespace-2.0.0.tgz#d784cc24f5f483a301c9148fc7e50f5d7b64845e" + integrity sha512-1Eka6f/6IL08c8gWfslUdwqmURvHYbdI57zOMHeslIuiLaK1nxvQefqAGcr9Em9T0k+4IcwhBTAtJm+6nCz2wQ== dependencies: - postcss "^6.0.14" + postcss "^7.0.0" postcss-selector-parser@^3.1.1: version "3.1.1" @@ -11793,6 +12179,13 @@ readdirp@^2.0.0: micromatch "^3.1.10" readable-stream "^2.0.2" +readdirp@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.1.2.tgz#fa85d2d14d4289920e4671dead96431add2ee78a" + integrity sha512-8rhl0xs2cxfVsqzreYCvs8EwBfn/DhVdqtoLmw19uI3SC5avYX9teCurlErfpPXGmYtMHReGaP2RsLnFvz/lnw== + dependencies: + picomatch "^2.0.4" + recast@^0.11.3: version "0.11.23" resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" @@ -11803,6 +12196,16 @@ recast@^0.11.3: private "~0.1.5" source-map "~0.5.0" +recast@^0.18.1: + version "0.18.2" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.18.2.tgz#ada263677edc70c45408caf20e6ae990958fdea8" + integrity sha512-MbuHc1lzIDIn7bpxaqIAGwwtyaokkzPqINf1Vm/LA0BSyVrTgXNVTTT7RzWC9kP+vqrUoYVpd6wHhI8x75ej8w== + dependencies: + ast-types "0.13.2" + esprima "~4.0.0" + private "^0.1.8" + source-map "~0.6.1" + redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" @@ -12153,10 +12556,10 @@ resolve@1.5.0: dependencies: path-parse "^1.0.5" -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" - integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: + version "1.12.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" + integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== dependencies: path-parse "^1.0.6" @@ -12284,6 +12687,11 @@ rsvp@^4.6.1, rsvp@^4.7.0, rsvp@^4.8.0, rsvp@^4.8.1, rsvp@^4.8.2, rsvp@^4.8.3, rs resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911" integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA== +rsvp@^4.8.5: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + rsvp@~3.0.6: version "3.0.21" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.0.21.tgz#49c588fe18ef293bcd0ab9f4e6756e6ac433359f" @@ -12407,14 +12815,14 @@ sane@^4.0.0: walker "~1.0.5" watch "~0.18.0" -sass@^1.17.0: - version "1.17.2" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.17.2.tgz#b5a28f2f13c6a219f28084c03623bb2c8d176323" - integrity sha512-TBNcwSIEXpXAIaFxQnWbHzhciwPKpHRprQ+1ww+g9eHCiY3PINJs6vQTu+LcBt1vIhrtQGRFIoxJO39TfLrptA== +sass@^1.22.10: + version "1.22.10" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.22.10.tgz#b9f01440352ba0be5d99fa64a2040b035cc6e5ff" + integrity sha512-DUpS1tVMGCH6gr/N9cXCoemrjoNdOLhAHfQ37fJw2A5ZM4gSI9ej/8Xi95Xwus03RqZ2zdSnKZGULL7oS+jfMA== dependencies: - chokidar "^2.0.0" + chokidar ">=2.0.0 <4.0.0" -sax@>=0.6.0, sax@^1.1.4, sax@^1.2.4, sax@~1.2.1: +sax@>=0.6.0, sax@^1.1.4, sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -12628,10 +13036,10 @@ simple-dom@^1.4.0: "@simple-dom/serializer" "^1.4.0" "@simple-dom/void-map" "^1.4.0" -simple-html-tokenizer@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.7.tgz#8eca336ecfbe2b3c6166cbb31b2682088de79f40" - integrity sha512-APW9iYbkJ5cijjX4Ljhf3VG8SwYPUJT5gZrwci/wieMabQxWFiV5VwsrP5c6GMRvXKEQMGkAB1d9dvW66dTqpg== +simple-html-tokenizer@^0.5.8: + version "0.5.8" + resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.8.tgz#3417382f75954ee34515cc4fd32d9918e693f173" + integrity sha512-0Sq4FvLlQEQODVA6PH2MIrc7tzYO0KT2HzzwvaVLYClWgIsuvaNUOrhrAvTi1pZHrcq7GDB4WiI3ukjqBMxcGQ== slash@^1.0.0: version "1.0.0" @@ -12916,6 +13324,11 @@ ssri@^6.0.1: dependencies: figgy-pudding "^3.5.1" +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + stagehand@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stagehand/-/stagehand-1.0.0.tgz#79515e2ad3a02c63f8720c7df9b6077ae14276d9" @@ -13043,6 +13456,22 @@ string.prototype.repeat@^0.2.0: resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-0.2.0.tgz#aba36de08dcee6a5a337d49b2ea1da1b28fc0ecf" integrity sha1-q6Nt4I3O5qWjN9SbLqHaGyj8Ds8= +string.prototype.trimleft@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.0.0.tgz#68b6aa8e162c6a80e76e3a8a0c2e747186e271ff" + integrity sha1-aLaqjhYsaoDnbjqKDC50cYbicf8= + dependencies: + define-properties "^1.1.2" + function-bind "^1.0.2" + +string.prototype.trimright@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.0.0.tgz#ab4a56d802a01fbe7293e11e84f24dc8164661dd" + integrity sha1-q0pW2AKgH75yk+EehPJNyBZGYd0= + dependencies: + define-properties "^1.1.2" + function-bind "^1.0.2" + string_decoder@0.10, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -13177,18 +13606,24 @@ svg2png@^4.1.1: pn "^1.0.0" yargs "^6.5.0" -svgo@0.6.6: - version "0.6.6" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.6.6.tgz#b340889036f20f9b447543077d0f5573ed044c08" - integrity sha1-s0CIkDbyD5tEdUMHfQ9Vc+0ETAg= +svgo@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.0.tgz#bae51ba95ded9a33a36b7c46ce9c359ae9154313" + integrity sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ== dependencies: - coa "~1.0.1" - colors "~1.1.2" - csso "~2.0.0" - js-yaml "~3.6.0" + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.33" + csso "^3.5.1" + js-yaml "^3.13.1" mkdirp "~0.5.1" - sax "~1.2.1" - whet.extend "~0.9.9" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" "symbol-tree@>= 3.1.0 < 4.0.0", symbol-tree@^3.2.2: version "3.2.2" @@ -13277,7 +13712,7 @@ temp@0.8.3: os-tmpdir "^1.0.0" rimraf "~2.2.6" -terser-webpack-plugin@^1.1.0: +terser-webpack-plugin@1.2.1, terser-webpack-plugin@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.1.tgz#7545da9ae5f4f9ae6a0ac961eb46f5e7c845cc26" integrity sha512-GGSt+gbT0oKcMDmPx4SRSfJPE1XaN3kQRWG4ghxKQw9cn5G9x6aCKSsgYdvyM0na9NJ4Drv0RG6jbBByZ5CMjw== @@ -13512,6 +13947,13 @@ to-regex-range@^2.1.0: is-number "^3.0.0" repeat-string "^1.6.1" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + to-regex@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.1.tgz#15358bee4a2c83bd76377ba1dc049d0f18837aae" @@ -13776,6 +14218,11 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -13894,7 +14341,7 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util.promisify@^1.0.0: +util.promisify@^1.0.0, util.promisify@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== @@ -13946,7 +14393,7 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= -velocity-animate@^1.5.1: +velocity-animate@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/velocity-animate/-/velocity-animate-1.5.2.tgz#5a351d75fca2a92756f5c3867548b873f6c32105" integrity sha512-m6EXlCAMetKztO1ppBhGU1/1MR3IiEevO6ESq6rcrSQ3Q77xYSW13jkfXW88o4xMrkXJhy/U7j4wFR/twMB0Eg== @@ -14183,11 +14630,6 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" -whet.extend@~0.9.9: - version "0.9.9" - resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" - integrity sha1-+HfVv2SMl+WqVC+twW1qJZucEaE= - which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" From 426aadc84f4b02835bdcc04a44c350eaa0612b84 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 4 Sep 2019 18:02:11 +0000 Subject: [PATCH 528/879] build(deps-dev): bump ember-resolver from 5.1.3 to 5.2.1 Bumps [ember-resolver](https://github.com/ember-cli/ember-resolver) from 5.1.3 to 5.2.1. - [Release notes](https://github.com/ember-cli/ember-resolver/releases) - [Changelog](https://github.com/ember-cli/ember-resolver/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-resolver/compare/v5.1.3...v5.2.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/yarn.lock b/yarn.lock index adf1d3d52..511ad93f6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6225,17 +6225,17 @@ ember-qunit@^3.5.0: qunit "~2.6.0" ember-resolver@^5.0.1: - version "5.1.3" - resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-5.1.3.tgz#d2a5a856d53911552c022649cdc7b0408a7908ae" - integrity sha512-ud7Sw8R3hcGnGSvom96p56zdLEqEgVQEAo4HySJjBP0n7JT1lWSvLb7JrJwAZ7d9g1c2tm5ZlxBPUDwQrwMOuQ== + version "5.2.1" + resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-5.2.1.tgz#538d7a29351316d9550864ff06fcbe55bdd92774" + integrity sha512-Ciz5qsrtILr7AGXO9mTSFs3/XKXpMYJqISNCfvIY0C8PlMgq+9RYbmUoBpAlvBUc/mUi3ORZKJ4csd9qchvxZw== dependencies: "@glimmer/resolver" "^0.4.1" babel-plugin-debug-macros "^0.1.10" broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.0" ember-cli-babel "^6.16.0" - ember-cli-version-checker "^3.0.0" - resolve "^1.10.0" + ember-cli-version-checker "^3.1.3" + resolve "^1.12.0" ember-responsive@^3.0.5: version "3.0.5" From 09cbf3d448e33e09d995eee1d06f40c46be81035 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 4 Sep 2019 14:38:09 -0400 Subject: [PATCH 529/879] build(deps-dev): bump eslint-plugin-ember from 6.8.2 to 7.0.0 (#1731) Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 6.8.2 to 7.0.0. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v6.8.2...v7.0.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index e6e1c8aab..20035432d 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,7 @@ "ember-source-channel-url": "^2.0.1", "ember-try": "^1.0.0", "escape-string-regexp": "^2.0.0", - "eslint-plugin-ember": "^6.2.0", + "eslint-plugin-ember": "^7.0.0", "eslint-plugin-ember-suave": "^1.0.0", "eslint-plugin-node": "^9.0.1", "faker": "^4.1.0", diff --git a/yarn.lock b/yarn.lock index adf1d3d52..e10453565 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6244,10 +6244,10 @@ ember-responsive@^3.0.5: dependencies: ember-cli-babel "^6.6.0" -ember-rfc176-data@^0.3.9: - version "0.3.9" - resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.9.tgz#44b6e051ead6c044ea87bd551f402e2cf89a7e3d" - integrity sha512-EiTo5YQS0Duy0xp9gCP8ekzv9vxirNi7MnIB4zWs+thtWp/mEKgf5mkiiLU2+oo8C5DuavVHhoPQDmyxh8Io1Q== +ember-rfc176-data@^0.3.11, ember-rfc176-data@^0.3.9: + version "0.3.12" + resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.12.tgz#90d82878e69e2ac9a5438e8ce14d12c6031c5bd2" + integrity sha512-g9HeZj/gU5bfIIrGXkP7MhS2b3Vu5DfNUrYr14hy99TgIvtZETO+96QF4WOEUXGjIJdfTRjerVnQlqngPQSv1g== ember-router-generator@^1.2.3: version "1.2.3" @@ -6624,13 +6624,13 @@ eslint-plugin-ember-suave@^1.0.0: dependencies: requireindex "~1.1.0" -eslint-plugin-ember@^6.2.0: - version "6.8.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-6.8.2.tgz#3b512426c3d6cb29913471dedbee2c21f16fc26e" - integrity sha512-NXtanzQaX7p88rNK55ZlTU25MSiu8DDrdT83plgx1zQ8C8oVcX3qnnpD4SfaVfuGE1ZKmEGkelPZF8y6kU1qoA== +eslint-plugin-ember@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.0.0.tgz#75412b62501a8489b5b6345ccb6adfb877ceb38a" + integrity sha512-cMdYuKs46hpF5DEPQ2cccNjgC5xy0C1GcFfP47qiHTKAAAkHUttD/6DdEH3OwlreK/uFbF4fFaHxuq84xkaOgA== dependencies: "@ember-data/rfc395-data" "^0.0.4" - ember-rfc176-data "^0.3.9" + ember-rfc176-data "^0.3.11" snake-case "^2.1.0" eslint-plugin-es@^1.4.0: From 5be63291ea9fca011002eba32925d91323715070 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 4 Sep 2019 19:04:06 +0000 Subject: [PATCH 530/879] build(deps): bump ember-cli-babel from 7.8.0 to 7.11.0 Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 7.8.0 to 7.11.0. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v7.8.0...v7.11.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/yarn.lock b/yarn.lock index 0fe2de0ca..f1309150c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2281,12 +2281,12 @@ babel-plugin-debug-macros@^0.3.0: dependencies: semver "^5.3.0" -babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-polyfill@^2.8.0, babel-plugin-ember-modules-api-polyfill@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.9.0.tgz#8503e7b4192aeb336b00265e6235258ff6b754aa" - integrity sha512-c03h50291phJ2gQxo/aIOvFQE2c6glql1A7uagE3XbPXpKVAJOUxtVDjvWG6UAB6BC5ynsJfMWvY0w4TPRKIHQ== +babel-plugin-ember-modules-api-polyfill@^2.12.0, babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-polyfill@^2.8.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.12.0.tgz#a5e703205ba4e625a7fab9bb1aea64ef3222cf75" + integrity sha512-ZQU4quX0TJ1yYyosPy5PFigKdCFEVHJ6H0b3hwjxekIP9CDwzk0OhQuKhCOPti+d52VWjjCjxu2BrXEih29mFw== dependencies: - ember-rfc176-data "^0.3.9" + ember-rfc176-data "^0.3.12" babel-plugin-feature-flags@^0.3.1: version "0.3.1" @@ -5421,9 +5421,9 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be semver "^5.5.0" ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.0, ember-cli-babel@^7.7.3: - version "7.8.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.8.0.tgz#e596500eca0f5a7c9aaee755f803d1542f578acf" - integrity sha512-xUBgJQ81fqd7k/KIiGU+pjpoXhrmmRf9pUrqLenNSU5N+yeNFT5a1+w0b+p1F7oBphfXVwuxApdZxrmAHOdA3Q== + version "7.11.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.11.0.tgz#a2f4e4f123a4690968b512b87b4ff4bfa57ec244" + integrity sha512-ykEsr7XoEPaADCBCJMViycCok1grtBRGvZ1k/atlL/gQYCQ1W4E4OROY/Mm2YBgyLftBv6buH7IZsULyQRZUmg== dependencies: "@babel/core" "^7.0.0" "@babel/plugin-proposal-class-properties" "^7.3.4" @@ -5435,7 +5435,7 @@ ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cl "@babel/runtime" "^7.2.0" amd-name-resolver "^1.2.1" babel-plugin-debug-macros "^0.3.0" - babel-plugin-ember-modules-api-polyfill "^2.9.0" + babel-plugin-ember-modules-api-polyfill "^2.12.0" babel-plugin-module-resolver "^3.1.1" broccoli-babel-transpiler "^7.1.2" broccoli-debug "^0.6.4" @@ -6244,7 +6244,7 @@ ember-responsive@^3.0.5: dependencies: ember-cli-babel "^6.6.0" -ember-rfc176-data@^0.3.11, ember-rfc176-data@^0.3.9: +ember-rfc176-data@^0.3.11, ember-rfc176-data@^0.3.12: version "0.3.12" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.12.tgz#90d82878e69e2ac9a5438e8ce14d12c6031c5bd2" integrity sha512-g9HeZj/gU5bfIIrGXkP7MhS2b3Vu5DfNUrYr14hy99TgIvtZETO+96QF4WOEUXGjIJdfTRjerVnQlqngPQSv1g== From ebbe618d3bacc72479d402b42195fa665009f725 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 4 Sep 2019 23:08:04 -0400 Subject: [PATCH 531/879] Dont need to re export AddonDocs application controller anymore (#1740) --- tests/acceptance/home-test.js | 13 +++++++++++++ tests/dummy/app/pods/application/controller.js | 3 --- 2 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 tests/acceptance/home-test.js delete mode 100644 tests/dummy/app/pods/application/controller.js diff --git a/tests/acceptance/home-test.js b/tests/acceptance/home-test.js new file mode 100644 index 000000000..0d006f91a --- /dev/null +++ b/tests/acceptance/home-test.js @@ -0,0 +1,13 @@ +import { module, test } from "qunit"; +import { visit, currentURL } from "@ember/test-helpers"; +import { setupApplicationTest } from "ember-qunit"; + +module("Acceptance | home", function(hooks) { + setupApplicationTest(hooks); + + test("the homepage renders without error", async function(assert) { + await visit("/"); + + assert.equal(currentURL(), "/"); + }); +}); diff --git a/tests/dummy/app/pods/application/controller.js b/tests/dummy/app/pods/application/controller.js deleted file mode 100644 index 003c62f62..000000000 --- a/tests/dummy/app/pods/application/controller.js +++ /dev/null @@ -1,3 +0,0 @@ -import Controller from 'ember-cli-addon-docs/controllers/application'; - -export default Controller.extend(); From a29742a8d355d44c039943e0d28cae3d496ad8ae Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 5 Sep 2019 00:48:13 -0400 Subject: [PATCH 532/879] Bump mirage 2 (#1741) * Bump mirage, remove pretender * Specify sourceDirectory for mirage * Bump addon-docs-esdoc * Remember to shutdown server in test * remove ember-suave * Update assertions --- .eslintrc.js | 73 ++- ember-cli-build.js | 13 +- package.json | 8 +- .../associations/links-test.js | 301 +++++++------ .../server/resource-shorthand-test.js | 415 +++++++++--------- yarn.lock | 185 +++++--- 6 files changed, 522 insertions(+), 473 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index d1a7ce938..64e2e9fac 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -2,29 +2,22 @@ module.exports = { root: true, parserOptions: { ecmaVersion: 2017, - sourceType: 'module' + sourceType: "module" }, - plugins: [ - 'ember' - ], - extends: [ - 'eslint:recommended', - 'plugin:ember-suave/recommended' - ], + plugins: ["ember"], + extends: ["eslint:recommended"], env: { browser: true }, rules: { - 'camelcase': 0, - 'ember-suave/no-direct-property-access': 0, - 'ember-suave/prefer-destructuring': 0, - 'object-curly-spacing': 0, - 'quotes': 0, - 'array-bracket-spacing': 0, - 'no-var': 0, - 'object-shorthand': 0, - 'arrow-parens': 0, - 'no-unused-vars': ['error', { 'args': 'none' }] + camelcase: 0, + "object-curly-spacing": 0, + quotes: 0, + "array-bracket-spacing": 0, + "no-var": 0, + "object-shorthand": 0, + "arrow-parens": 0, + "no-unused-vars": ["error", { args: "none" }] }, globals: { server: true @@ -33,42 +26,46 @@ module.exports = { // node files { files: [ - '.template-lintrc.js', - 'ember-cli-build.js', - 'index.js', - 'testem.js', - 'blueprints/*/index.js', - 'config/**/*.js', - 'tests/dummy/config/**/*.js', - 'fastboot-tests/**/*.js' + ".template-lintrc.js", + "ember-cli-build.js", + "index.js", + "testem.js", + "blueprints/*/index.js", + "config/**/*.js", + "tests/dummy/config/**/*.js", + "fastboot-tests/**/*.js" ], excludedFiles: [ - 'addon/**', - 'addon-test-support/**', - 'app/**', - 'tests/dummy/app/**' + "addon/**", + "addon-test-support/**", + "app/**", + "tests/dummy/app/**" ], parserOptions: { - sourceType: 'script', + sourceType: "script", ecmaVersion: 2018 }, env: { browser: false, node: true }, - plugins: ['node'], - rules: Object.assign({}, require('eslint-plugin-node').configs.recommended.rules, { - // add your custom rules and overrides for node files here - }) + plugins: ["node"], + rules: Object.assign( + {}, + require("eslint-plugin-node").configs.recommended.rules, + { + // add your custom rules and overrides for node files here + } + ) }, // test files. Can remove when we upgrade tests to new style. { - files: ['tests/**/*.js'], - excludedFiles: ['tests/dummy/**/*.js'], + files: ["tests/**/*.js"], + excludedFiles: ["tests/dummy/**/*.js"], env: { embertest: true } - }, + } ] }; diff --git a/ember-cli-build.js b/ember-cli-build.js index d09ce8d37..44bafa7b8 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -1,14 +1,17 @@ -'use strict'; +"use strict"; -const EmberAddon = require('ember-cli/lib/broccoli/ember-addon'); +const EmberAddon = require("ember-cli/lib/broccoli/ember-addon"); module.exports = function(defaults) { let app = new EmberAddon(defaults, { - 'ember-cli-babel': { + "ember-cli-babel": { includePolyfill: true }, - 'ember-cli-addon-docs-esdoc': { - packages: [ 'ember-cli-mirage', '@miragejs/server' ] + "ember-cli-addon-docs-esdoc": { + packages: [ + "ember-cli-mirage", + { name: "@miragejs/server", sourceDirectory: "lib" } + ] } }); diff --git a/package.json b/package.json index 20035432d..621a8d9b1 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "prepare": "./scripts/link.sh" }, "dependencies": { - "@miragejs/server": "0.1.9", + "@miragejs/server": "0.1.21", "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^2.0.1", "broccoli-merge-trees": "^3.0.2", @@ -45,8 +45,7 @@ "ember-cli-babel": "^7.5.0", "ember-get-config": "^0.2.2", "ember-inflector": "^2.0.0 || ^3.0.0", - "lodash-es": "^4.17.11", - "pretender": "3.0.1" + "lodash-es": "^4.17.11" }, "devDependencies": { "@ember/jquery": "^0.6.0", @@ -59,7 +58,7 @@ "ember-ajax": "^5.0.0", "ember-cli": "~3.4.4", "ember-cli-addon-docs": "^0.6.13", - "ember-cli-addon-docs-esdoc": "^0.2.2", + "ember-cli-addon-docs-esdoc": "^0.2.3", "ember-cli-app-version": "^3.2.0", "ember-cli-dependency-checker": "^3.0.0", "ember-cli-deploy": "^1.0.2", @@ -90,7 +89,6 @@ "ember-try": "^1.0.0", "escape-string-regexp": "^2.0.0", "eslint-plugin-ember": "^7.0.0", - "eslint-plugin-ember-suave": "^1.0.0", "eslint-plugin-node": "^9.0.1", "faker": "^4.1.0", "fastboot": "^2.0.1", diff --git a/tests/integration/serializers/json-api-serializer/associations/links-test.js b/tests/integration/serializers/json-api-serializer/associations/links-test.js index fd5bf397c..cddd55416 100644 --- a/tests/integration/serializers/json-api-serializer/associations/links-test.js +++ b/tests/integration/serializers/json-api-serializer/associations/links-test.js @@ -1,171 +1,182 @@ -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import { Server, Model, hasMany, belongsTo, JSONAPISerializer, ActiveModelSerializer } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; -import Db from 'ember-cli-mirage/db'; -import Schema from 'ember-cli-mirage/orm/schema'; - -module('Integration | Serializers | JSON API Serializer | Associations | Links', function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - blogPosts: hasMany() - }), - blogPost: Model.extend({ - wordSmith: belongsTo(), - fineComments: hasMany() - }), - fineComment: Model.extend({ - blogPost: belongsTo() - }) +import SerializerRegistry from "ember-cli-mirage/serializer-registry"; +import { + Server, + Model, + hasMany, + belongsTo, + JSONAPISerializer, + ActiveModelSerializer +} from "ember-cli-mirage"; +import { module, test } from "qunit"; +import Db from "ember-cli-mirage/db"; +import Schema from "ember-cli-mirage/orm/schema"; + +module( + "Integration | Serializers | JSON API Serializer | Associations | Links", + function(hooks) { + hooks.beforeEach(function() { + this.schema = new Schema(new Db(), { + wordSmith: Model.extend({ + blogPosts: hasMany() + }), + blogPost: Model.extend({ + wordSmith: belongsTo(), + fineComments: hasMany() + }), + fineComment: Model.extend({ + blogPost: belongsTo() + }) + }); }); - }); - - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); - - test(`it supports links`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - links(model) { - return { - 'wordSmith': { - related: `/api/word_smiths/${model.wordSmith.id}`, - self: `/api/blog_posts/${model.id}/relationships/word_smith` - }, - 'fineComments': { - related: `/api/fine_comments?blog_post_id=${model.id}`, - self: `/api/blog_posts/${model.id}/relationships/fine_comments` - } - }; - } - }) + + hooks.afterEach(function() { + this.schema.db.emptyData(); }); - let link = this.schema.wordSmiths.create({ id: 3, name: 'Link' }); // specify id to really test our links function - let blogPost = link.createBlogPost({ title: 'Lorem ipsum' }); + test(`it supports links`, function(assert) { + let registry = new SerializerRegistry(this.schema, { + application: JSONAPISerializer, + blogPost: JSONAPISerializer.extend({ + links(model) { + return { + wordSmith: { + related: `/api/word_smiths/${model.wordSmith.id}`, + self: `/api/blog_posts/${model.id}/relationships/word_smith` + }, + fineComments: { + related: `/api/fine_comments?blog_post_id=${model.id}`, + self: `/api/blog_posts/${model.id}/relationships/fine_comments` + } + }; + } + }) + }); - let result = registry.serialize(blogPost); + let link = this.schema.wordSmiths.create({ id: 3, name: "Link" }); // specify id to really test our links function + let blogPost = link.createBlogPost({ title: "Lorem ipsum" }); - assert.deepEqual(result, { - data: { - type: 'blog-posts', - id: blogPost.id, - attributes: { - 'title': 'Lorem ipsum' - }, - relationships: { - 'word-smith': { - links: { - related: `/api/word_smiths/${link.id}`, - self: `/api/blog_posts/${blogPost.id}/relationships/word_smith` - } + let result = registry.serialize(blogPost); + + assert.deepEqual(result, { + data: { + type: "blog-posts", + id: blogPost.id, + attributes: { + title: "Lorem ipsum" }, - 'fine-comments': { - links: { - related: `/api/fine_comments?blog_post_id=${blogPost.id}`, - self: `/api/blog_posts/${blogPost.id}/relationships/fine_comments` + relationships: { + "word-smith": { + links: { + related: `/api/word_smiths/${link.id}`, + self: `/api/blog_posts/${blogPost.id}/relationships/word_smith` + } + }, + "fine-comments": { + links: { + related: `/api/fine_comments?blog_post_id=${blogPost.id}`, + self: `/api/blog_posts/${blogPost.id}/relationships/fine_comments` + } } } } - } + }); }); - }); - test(`it supports links alongside data linkage`, function(assert) { - let ApplicationSerializer = JSONAPISerializer.extend({ - alwaysIncludeLinkageData: true - }); - let registry = new SerializerRegistry(this.schema, { - application: ApplicationSerializer, - blogPost: ApplicationSerializer.extend({ - links(model) { - return { - 'wordSmith': { - related: `/api/word_smiths/${model.wordSmith.id}`, - self: `/api/blog_posts/${model.id}/relationships/word_smith` - }, - 'fineComments': { - related: `/api/fine_comments?blog_post_id=${model.id}`, - self: `/api/blog_posts/${model.id}/relationships/fine_comments` - } - }; - } - }) - }); + test(`it supports links alongside data linkage`, function(assert) { + let ApplicationSerializer = JSONAPISerializer.extend({ + alwaysIncludeLinkageData: true + }); + let registry = new SerializerRegistry(this.schema, { + application: ApplicationSerializer, + blogPost: ApplicationSerializer.extend({ + links(model) { + return { + wordSmith: { + related: `/api/word_smiths/${model.wordSmith.id}`, + self: `/api/blog_posts/${model.id}/relationships/word_smith` + }, + fineComments: { + related: `/api/fine_comments?blog_post_id=${model.id}`, + self: `/api/blog_posts/${model.id}/relationships/fine_comments` + } + }; + } + }) + }); - let link = this.schema.wordSmiths.create({ id: 3, name: 'Link' }); // specify id to really test our links function - let blogPost = link.createBlogPost({ title: 'Lorem ipsum' }); + let link = this.schema.wordSmiths.create({ id: 3, name: "Link" }); // specify id to really test our links function + let blogPost = link.createBlogPost({ title: "Lorem ipsum" }); - let result = registry.serialize(blogPost); + let result = registry.serialize(blogPost); - assert.deepEqual(result, { - data: { - type: 'blog-posts', - id: blogPost.id, - attributes: { - 'title': 'Lorem ipsum' - }, - relationships: { - 'word-smith': { - "data": { - "id": "3", - "type": "word-smiths" - }, - links: { - related: `/api/word_smiths/${link.id}`, - self: `/api/blog_posts/${blogPost.id}/relationships/word_smith` - } + assert.deepEqual(result, { + data: { + type: "blog-posts", + id: blogPost.id, + attributes: { + title: "Lorem ipsum" }, - 'fine-comments': { - data: [], - links: { - related: `/api/fine_comments?blog_post_id=${blogPost.id}`, - self: `/api/blog_posts/${blogPost.id}/relationships/fine_comments` + relationships: { + "word-smith": { + data: { + id: "3", + type: "word-smiths" + }, + links: { + related: `/api/word_smiths/${link.id}`, + self: `/api/blog_posts/${blogPost.id}/relationships/word_smith` + } + }, + "fine-comments": { + data: [], + links: { + related: `/api/fine_comments?blog_post_id=${blogPost.id}`, + self: `/api/blog_posts/${blogPost.id}/relationships/fine_comments` + } } } } - } + }); }); - }); - - test('[regression] it works when using a named serializer, relationships, and a non-JSONAPISerializer for the base', async function(assert) { - let server = new Server({ - serializers: { - application: ActiveModelSerializer, - userV2: JSONAPISerializer - }, - - models: { - user: Model.extend({ - posts: hasMany() - }), - post: Model.extend() - }, - baseConfig() { - this.get('/users', function(schema) { - let json = this.serialize(schema.users.find(1), 'userV2'); + test("[regression] it works when using a named serializer, relationships, and a non-JSONAPISerializer for the base", async function(assert) { + let server = new Server({ + environment: "test", + serializers: { + application: ActiveModelSerializer, + userV2: JSONAPISerializer + }, - return json; - }); - } - }); + models: { + user: Model.extend({ + posts: hasMany() + }), + post: Model.extend() + }, - server.create('user'); + baseConfig() { + this.get("/users", function(schema) { + let json = this.serialize(schema.users.find(1), "userV2"); - let res = await fetch('/users'); - let json = await res.json(); + return json; + }); + } + }); - assert.deepEqual( - json, - { - "data": { - "attributes": {}, - "id": "1", - "type": "users" + server.create("user"); + + let res = await fetch("/users"); + let json = await res.json(); + + assert.deepEqual(json, { + data: { + attributes: {}, + id: "1", + type: "users" } }); - }); -}); + + server.shutdown(); + }); + } +); diff --git a/tests/integration/server/resource-shorthand-test.js b/tests/integration/server/resource-shorthand-test.js index 5808081a1..1e6875150 100644 --- a/tests/integration/server/resource-shorthand-test.js +++ b/tests/integration/server/resource-shorthand-test.js @@ -1,12 +1,12 @@ -import {module, test} from 'qunit'; -import { Model, ActiveModelSerializer } from 'ember-cli-mirage'; -import Server from 'ember-cli-mirage/server'; -import promiseAjax from '../../helpers/promise-ajax'; +import { module, test } from "qunit"; +import { Model, ActiveModelSerializer } from "ember-cli-mirage"; +import Server from "ember-cli-mirage/server"; +import promiseAjax from "../../helpers/promise-ajax"; -module('Integration | Server | Resource shorthand', function(hooks) { +module("Integration | Server | Resource shorthand", function(hooks) { hooks.beforeEach(function() { this.server = new Server({ - environment: 'test', + environment: "test", models: { contact: Model, blogPost: Model @@ -15,77 +15,65 @@ module('Integration | Server | Resource shorthand', function(hooks) { application: ActiveModelSerializer } }); - this.server.timing = 0; - this.server.logging = false; }); hooks.afterEach(function() { this.server.shutdown(); }); - test('resource generates get shorthand for index action', async function(assert) { + test("resource generates get shorthand for index action", async function(assert) { assert.expect(2); this.server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' }, - { id: 2, name: 'Zelda' } - ], - blogPosts: [ - { id: 1, title: 'Post 1' }, - { id: 2, title: 'Post 2' } - ] + contacts: [{ id: 1, name: "Link" }, { id: 2, name: "Zelda" }], + blogPosts: [{ id: 1, title: "Post 1" }, { id: 2, title: "Post 2" }] }); - this.server.resource('contacts'); + this.server.resource("contacts"); let { data, xhr } = await promiseAjax({ - method: 'GET', - url: '/contacts' + method: "GET", + url: "/contacts" }); assert.equal(xhr.status, 200); - assert.deepEqual(data, { contacts: [{ id: '1', name: 'Link' }, { id: '2', name: 'Zelda' }] }); + assert.deepEqual(data, { + contacts: [{ id: "1", name: "Link" }, { id: "2", name: "Zelda" }] + }); }); - test('resource generates get shorthand for show action', async function(assert) { + test("resource generates get shorthand for show action", async function(assert) { assert.expect(2); this.server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' }, - { id: 2, name: 'Zelda' } - ], - blogPosts: [ - { id: 1, title: 'Post 1' }, - { id: 2, title: 'Post 2' } - ] + contacts: [{ id: 1, name: "Link" }, { id: 2, name: "Zelda" }], + blogPosts: [{ id: 1, title: "Post 1" }, { id: 2, title: "Post 2" }] }); - this.server.resource('contacts'); - this.server.resource('blog-posts', { path: '/posts' }); + this.server.resource("contacts"); + this.server.resource("blog-posts", { path: "/posts" }); let { data, xhr } = await promiseAjax({ - method: 'GET', - url: '/contacts/2' + method: "GET", + url: "/contacts/2" }); assert.equal(xhr.status, 200); - assert.deepEqual(data, { contact: { id: '2', name: 'Zelda' } }); + assert.deepEqual(data, { contact: { id: "2", name: "Zelda" } }); }); - test('resource generates post shorthand', async function(assert) { + test("resource generates post shorthand", async function(assert) { let { server } = this; assert.expect(2); - server.resource('contacts'); + server.resource("contacts"); let { xhr } = await promiseAjax({ - method: 'POST', - url: '/contacts', + method: "POST", + url: "/contacts", data: JSON.stringify({ contact: { - name: 'Zelda' + name: "Zelda" } }) }); @@ -94,406 +82,419 @@ module('Integration | Server | Resource shorthand', function(hooks) { assert.equal(server.db.contacts.length, 1); }); - test('resource generates put shorthand', async function(assert) { + test("resource generates put shorthand", async function(assert) { let { server } = this; assert.expect(2); this.server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' } - ], - blogPosts: [ - { id: 1, title: 'Post 1' } - ] + contacts: [{ id: 1, name: "Link" }], + blogPosts: [{ id: 1, title: "Post 1" }] }); - server.resource('contacts'); + server.resource("contacts"); let { xhr } = await promiseAjax({ - method: 'PUT', - url: '/contacts/1', + method: "PUT", + url: "/contacts/1", data: JSON.stringify({ contact: { - name: 'Zelda' + name: "Zelda" } }) }); assert.equal(xhr.status, 200); - assert.equal(server.db.contacts[0].name, 'Zelda'); + assert.equal(server.db.contacts[0].name, "Zelda"); }); - test('resource generates patch shorthand', async function(assert) { + test("resource generates patch shorthand", async function(assert) { let { server } = this; assert.expect(2); this.server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' } - ], - blogPosts: [ - { id: 1, title: 'Post 1' } - ] + contacts: [{ id: 1, name: "Link" }], + blogPosts: [{ id: 1, title: "Post 1" }] }); - server.resource('contacts'); + server.resource("contacts"); let { xhr } = await promiseAjax({ - method: 'PATCH', - url: '/contacts/1', + method: "PATCH", + url: "/contacts/1", data: JSON.stringify({ contact: { - name: 'Zelda' + name: "Zelda" } }) }); assert.equal(xhr.status, 200); - assert.equal(server.db.contacts[0].name, 'Zelda'); + assert.equal(server.db.contacts[0].name, "Zelda"); }); - test('resource generates delete shorthand works', async function(assert) { + test("resource generates delete shorthand works", async function(assert) { let { server } = this; assert.expect(2); this.server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' } - ], - blogPosts: [ - { id: 1, title: 'Post 1' } - ] + contacts: [{ id: 1, name: "Link" }], + blogPosts: [{ id: 1, title: "Post 1" }] }); - server.resource('contacts'); + server.resource("contacts"); let { xhr } = await promiseAjax({ - method: 'DELETE', - url: '/contacts/1' + method: "DELETE", + url: "/contacts/1" }); assert.equal(xhr.status, 204); assert.equal(server.db.contacts.length, 0); }); - test('resource accepts a custom path for a resource', async function(assert) { + test("resource accepts a custom path for a resource", async function(assert) { assert.expect(6); this.server.db.loadData({ - blogPosts: [ - { id: 1, title: 'Post 1' }, - { id: 2, title: 'Post 2' } - ] + blogPosts: [{ id: 1, title: "Post 1" }, { id: 2, title: "Post 2" }] }); - this.server.resource('blog-posts', { path: '/posts' }); + this.server.resource("blog-posts", { path: "/posts" }); let indexResponse = await promiseAjax({ - method: 'GET', - url: '/posts' + method: "GET", + url: "/posts" }); - assert.equal(indexResponse.xhr.status, 200, 'Should receive a 200 response from resource index action'); + assert.equal( + indexResponse.xhr.status, + 200, + "Should receive a 200 response from resource index action" + ); let showResponse = await promiseAjax({ - method: 'GET', - url: '/posts/2' + method: "GET", + url: "/posts/2" }); - assert.equal(showResponse.xhr.status, 200, 'Should receive a 200 response from resource show action'); + assert.equal( + showResponse.xhr.status, + 200, + "Should receive a 200 response from resource show action" + ); let createResponse = await promiseAjax({ - method: 'POST', - url: '/posts', + method: "POST", + url: "/posts", data: JSON.stringify({ blog_post: { - name: 'Post 1' + name: "Post 1" } }) }); - assert.equal(createResponse.xhr.status, 201, 'Should receive 201 response from resource create action'); + assert.equal( + createResponse.xhr.status, + 201, + "Should receive 201 response from resource create action" + ); let updatePutResponse = await promiseAjax({ - method: 'PUT', - url: '/posts/1', + method: "PUT", + url: "/posts/1", data: JSON.stringify({ blog_post: { - name: 'Post 2' + name: "Post 2" } }) }); - assert.equal(updatePutResponse.xhr.status, 200, 'Should receive 200 response from resource update action with PUT'); + assert.equal( + updatePutResponse.xhr.status, + 200, + "Should receive 200 response from resource update action with PUT" + ); let updatePatchResponse = await promiseAjax({ - method: 'PATCH', - url: '/posts/1', + method: "PATCH", + url: "/posts/1", data: JSON.stringify({ blog_post: { - name: 'Post 2' + name: "Post 2" } }) }); - assert.equal(updatePatchResponse.xhr.status, 200, 'Should receive 200 response from resource update action with PATCH'); + assert.equal( + updatePatchResponse.xhr.status, + 200, + "Should receive 200 response from resource update action with PATCH" + ); let deleteResponse = await promiseAjax({ - method: 'DELETE', - url: '/posts/1' + method: "DELETE", + url: "/posts/1" }); - assert.equal(deleteResponse.xhr.status, 204, 'Should receive 204 response from the resource delete action'); + assert.equal( + deleteResponse.xhr.status, + 204, + "Should receive 204 response from the resource delete action" + ); }); - test('resource accepts singular name', async function(assert) { + test("resource accepts singular name", async function(assert) { assert.expect(4); this.server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' }, - { id: 2, name: 'Zelda' } - ], - blogPosts: [ - { id: 1, title: 'Post 1' }, - { id: 2, title: 'Post 2' } - ] + contacts: [{ id: 1, name: "Link" }, { id: 2, name: "Zelda" }], + blogPosts: [{ id: 1, title: "Post 1" }, { id: 2, title: "Post 2" }] }); - this.server.resource('contact'); - this.server.resource('blog-post', { path: '/posts' }); + this.server.resource("contact"); + this.server.resource("blog-post", { path: "/posts" }); let contactsResponse = await promiseAjax({ - method: 'GET', - url: '/contacts' + method: "GET", + url: "/contacts" }); assert.equal(contactsResponse.xhr.status, 200); - assert.deepEqual( - contactsResponse.data, - { contacts: [{ id: '1', name: 'Link' }, { id: '2', name: 'Zelda' }] } - ); + assert.deepEqual(contactsResponse.data, { + contacts: [{ id: "1", name: "Link" }, { id: "2", name: "Zelda" }] + }); let postsResponse = await promiseAjax({ - method: 'GET', - url: '/posts' + method: "GET", + url: "/posts" }); assert.equal(postsResponse.xhr.status, 200); - assert.deepEqual( - postsResponse.data, - { blog_posts: [{ id: '1', title: 'Post 1' }, { id: '2', title: 'Post 2' }] } - ); + assert.deepEqual(postsResponse.data, { + blog_posts: [{ id: "1", title: "Post 1" }, { id: "2", title: "Post 2" }] + }); }); - test('resource does not accept both :all and :except options', function(assert) { + test("resource does not accept both :all and :except options", function(assert) { let { server } = this; assert.throws(() => { - server.resource('contacts', { only: ['index'], except: ['create'] }); - }, 'cannot use both :only and :except options'); + server.resource("contacts", { only: ["index"], except: ["create"] }); + }, "cannot use both :only and :except options"); }); - test('resource generates shorthands which are whitelisted by :only option', async function(assert) { + test("resource generates shorthands which are whitelisted by :only option", async function(assert) { let { server } = this; assert.expect(1); server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' }, - { id: 2, name: 'Zelda' } - ] + contacts: [{ id: 1, name: "Link" }, { id: 2, name: "Zelda" }] }); - server.resource('contacts', { only: ['index'] }); + server.resource("contacts", { only: ["index"] }); let { xhr } = await promiseAjax({ - method: 'GET', - url: '/contacts' + method: "GET", + url: "/contacts" }); assert.equal(xhr.status, 200); }); - test('resource does not generate shorthands which are not whitelisted with :only option', async function(assert) { + test("resource does not generate shorthands which are not whitelisted with :only option", async function(assert) { let { server } = this; assert.expect(5); server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' } - ] + contacts: [{ id: 1, name: "Link" }] }); - server.resource('contacts', { only: ['index'] }); + server.resource("contacts", { only: ["index"] }); try { await promiseAjax({ - method: 'GET', - url: '/contacts/1' + method: "GET", + url: "/contacts/1" }); - } catch(e) { + } catch (e) { assert.ok( - e.error.message.indexOf("Mirage: Your Ember app tried to GET '/contacts/1'") > -1, - 'Should receive an error from Mirage when requesting the show action' + e.error.message.indexOf("Mirage: Your app tried to GET '/contacts/1'") > + -1, + "Should receive an error from Mirage when requesting the show action" ); } try { await promiseAjax({ - method: 'POST', - url: '/contacts', + method: "POST", + url: "/contacts", data: JSON.stringify({ contact: { - name: 'Zelda' + name: "Zelda" } }) }); - } catch(e) { + } catch (e) { assert.ok( - e.error.message.indexOf("Mirage: Your Ember app tried to POST '/contacts'") > -1, - 'Should receive an error from Mirage when requesting the create action' + e.error.message.indexOf("Mirage: Your app tried to POST '/contacts'") > + -1, + "Should receive an error from Mirage when requesting the create action" ); } try { await promiseAjax({ - method: 'PUT', - url: '/contacts/1', + method: "PUT", + url: "/contacts/1", data: JSON.stringify({ contact: { - name: 'Zelda' + name: "Zelda" } }) }); - } catch(e) { + } catch (e) { assert.ok( - e.error.message.indexOf("Mirage: Your Ember app tried to PUT '/contacts/1'") > -1, - 'Should receive an error from Mirage when requesting the update action with PUT' + e.error.message.indexOf("Mirage: Your app tried to PUT '/contacts/1'") > + -1, + "Should receive an error from Mirage when requesting the update action with PUT" ); } try { await promiseAjax({ - method: 'PATCH', - url: '/contacts/1', + method: "PATCH", + url: "/contacts/1", data: JSON.stringify({ contact: { - name: 'Zelda' + name: "Zelda" } }) }); - } catch(e) { + } catch (e) { assert.ok( - e.error.message.indexOf("Mirage: Your Ember app tried to PATCH '/contacts/1'") > -1, - 'Should receive an error from Mirage when requesting the update action with PATCH' + e.error.message.indexOf( + "Mirage: Your app tried to PATCH '/contacts/1'" + ) > -1, + "Should receive an error from Mirage when requesting the update action with PATCH" ); } try { await promiseAjax({ - method: 'DELETE', - url: '/contacts/1' + method: "DELETE", + url: "/contacts/1" }); - } catch(e) { + } catch (e) { assert.ok( - e.error.message.indexOf("Mirage: Your Ember app tried to DELETE '/contacts/1'") > -1, - 'Should receive an error from Mirage when requesting the delet action' + e.error.message.indexOf( + "Mirage: Your app tried to DELETE '/contacts/1'" + ) > -1, + "Should receive an error from Mirage when requesting the delet action" ); } }); - test('resource generates shorthands which are not blacklisted by :except option', async function(assert) { + test("resource generates shorthands which are not blacklisted by :except option", async function(assert) { let { server } = this; assert.expect(2); server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' } - ] + contacts: [{ id: 1, name: "Link" }] }); - server.resource('contacts', { except: ['create', 'update', 'delete'] }); + server.resource("contacts", { except: ["create", "update", "delete"] }); let indexResponse = await promiseAjax({ - method: 'GET', - url: '/contacts' + method: "GET", + url: "/contacts" }); - assert.equal(indexResponse.xhr.status, 200, 'Should receive a 200 response from resource index action'); + assert.equal( + indexResponse.xhr.status, + 200, + "Should receive a 200 response from resource index action" + ); let showResponse = await promiseAjax({ - method: 'GET', - url: '/contacts/1' + method: "GET", + url: "/contacts/1" }); - assert.equal(showResponse.xhr.status, 200, 'Should receive a 200 response from resource show action'); + assert.equal( + showResponse.xhr.status, + 200, + "Should receive a 200 response from resource show action" + ); }); - test('resource does not generate shorthands which are blacklisted by :except option', async function(assert) { + test("resource does not generate shorthands which are blacklisted by :except option", async function(assert) { let { server } = this; assert.expect(4); server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' } - ] + contacts: [{ id: 1, name: "Link" }] }); - server.resource('contacts', { except: ['create', 'update', 'delete'] }); + server.resource("contacts", { except: ["create", "update", "delete"] }); try { await promiseAjax({ - method: 'POST', - url: '/contacts', + method: "POST", + url: "/contacts", data: JSON.stringify({ contact: { - name: 'Zelda' + name: "Zelda" } }) }); - } catch(e) { + } catch (e) { assert.ok( - e.error.message.indexOf("Mirage: Your Ember app tried to POST '/contacts'") > -1, - 'Should receive an error from Mirage when requesting the create action' + e.error.message.indexOf("Mirage: Your app tried to POST '/contacts'") > + -1, + "Should receive an error from Mirage when requesting the create action" ); } try { await promiseAjax({ - method: 'PUT', - url: '/contacts/1', + method: "PUT", + url: "/contacts/1", data: JSON.stringify({ contact: { - name: 'Zelda' + name: "Zelda" } }) }); - } catch(e) { + } catch (e) { assert.ok( - e.error.message.indexOf("Mirage: Your Ember app tried to PUT '/contacts/1'") > -1, - 'Should receive an error from Mirage when requesting the update action with PUT' + e.error.message.indexOf("Mirage: Your app tried to PUT '/contacts/1'") > + -1, + "Should receive an error from Mirage when requesting the update action with PUT" ); } try { await promiseAjax({ - method: 'PATCH', - url: '/contacts/1', + method: "PATCH", + url: "/contacts/1", data: JSON.stringify({ contact: { - name: 'Zelda' + name: "Zelda" } }) }); - } catch(e) { + } catch (e) { assert.ok( - e.error.message.indexOf("Mirage: Your Ember app tried to PATCH '/contacts/1'") > -1, - 'Should receive an error from Mirage when requesting the update action with PATCH' + e.error.message.indexOf( + "Mirage: Your app tried to PATCH '/contacts/1'" + ) > -1, + "Should receive an error from Mirage when requesting the update action with PATCH" ); } try { await promiseAjax({ - method: 'DELETE', - url: '/contacts/1' + method: "DELETE", + url: "/contacts/1" }); - } catch(e) { + } catch (e) { assert.ok( - e.error.message.indexOf("Mirage: Your Ember app tried to DELETE '/contacts/1'") > -1, - 'Should receive an error from Mirage when requesting the delet action' + e.error.message.indexOf( + "Mirage: Your app tried to DELETE '/contacts/1'" + ) > -1, + "Should receive an error from Mirage when requesting the delet action" ); } }); diff --git a/yarn.lock b/yarn.lock index f1309150c..bedb79fa3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1135,18 +1135,34 @@ dependencies: core-js "^2.5.7" -"@miragejs/server@0.1.9": - version "0.1.9" - resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.9.tgz#98fb8efa7ed8f76e50b702df63ea950fe74b1c63" - integrity sha512-EEgnyeEoo38cx9sSrcleHmMlXq/4/6EOkT56wMJwviThTyxMLoJN06dUamsxaCVVEbsVZqlP0Km7hhmHhEOXEg== +"@miragejs/server@0.1.21": + version "0.1.21" + resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.21.tgz#28f8d1aaa65cac5d1b02e34c7c18971534237995" + integrity sha512-O16ISQCC2j6dTn1OF1BHglbNgg2cz/JWFlVyTwyGfwfF2AUGRPlcETd/eFqfKL46Z/YMbcWGTVyIvDVRPGtPLQ== dependencies: - chalk "^2.4.2" - eslint "^5.16.0" inflected "^2.0.4" - lodash-es "^4.17.11" - pretender "3.0.1" - prettier "^1.18.2" - rollup-plugin-async "^1.2.0" + lodash.assign "^4.2.0" + lodash.camelcase "^4.3.0" + lodash.clonedeep "^4.5.0" + lodash.compact "^3.0.1" + lodash.find "^4.6.0" + lodash.flatten "^4.4.0" + lodash.forin "^4.4.0" + lodash.get "^4.4.2" + lodash.has "^4.5.2" + lodash.invokemap "^4.6.0" + lodash.isempty "^4.4.0" + lodash.isequal "^4.5.0" + lodash.isfunction "^3.0.9" + lodash.isinteger "^4.0.4" + lodash.isplainobject "^4.0.6" + lodash.lowerfirst "^4.3.1" + lodash.map "^4.6.0" + lodash.mapvalues "^4.6.0" + lodash.pick "^4.4.0" + lodash.uniq "^4.5.0" + lodash.uniqby "^4.7.0" + pretender "3.0.2" "@simple-dom/document@^1.4.0": version "1.4.0" @@ -1981,15 +1997,6 @@ async-promise-queue@^1.0.3, async-promise-queue@^1.0.4: async "^2.4.1" debug "^2.6.8" -async-to-gen@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/async-to-gen/-/async-to-gen-1.4.0.tgz#f8157f9013e0c487e1e940150a4d1a1b78b2dd6b" - integrity sha1-+BV/kBPgxIfh6UAVCk0aG3iy3Ws= - dependencies: - babylon "^6.14.0" - magic-string "^0.22.0" - pirates "^3.0.2" - async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -2690,7 +2697,7 @@ babel6-plugin-strip-heimdall@^6.0.1: resolved "https://registry.yarnpkg.com/babel6-plugin-strip-heimdall/-/babel6-plugin-strip-heimdall-6.0.1.tgz#35f80eddec1f7fffdc009811dfbd46d9965072b6" integrity sha1-NfgO3ewff//cAJgR371G2ZZQcrY= -babylon@6.18.0, babylon@^6.14.0, babylon@^6.18.0: +babylon@6.18.0, babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== @@ -5269,10 +5276,10 @@ ember-auto-import@^1.2.19, ember-auto-import@^1.5.2: walk-sync "^0.3.3" webpack "~4.28" -ember-cli-addon-docs-esdoc@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/ember-cli-addon-docs-esdoc/-/ember-cli-addon-docs-esdoc-0.2.2.tgz#c430392c38b321f7cbbb8b328969b056ee318751" - integrity sha512-DcvyMRBPbhMYadgGFCCcifTrcO4NPj/yp3woZgd35gkD0hTTK0tvDFld90GK+8kcB6BQmx8IcCKoc0osQpTMug== +ember-cli-addon-docs-esdoc@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs-esdoc/-/ember-cli-addon-docs-esdoc-0.2.3.tgz#918d029b2041765d757d07161b0f4f94b7e0de94" + integrity sha512-4SJ7sA52eg5mheorHABXNG6vzsGJh9TvitT2bVtUrWYClPfuRK4VLOCY5SVU4j4A71gwBJ2EHrFUUS75I8x55w== dependencies: broccoli-caching-writer "^3.0.3" ember-cli-babel "^6.6.0" @@ -6601,7 +6608,7 @@ esdoc-ecmascript-proposal-plugin@^1.0.0: resolved "https://registry.yarnpkg.com/esdoc-ecmascript-proposal-plugin/-/esdoc-ecmascript-proposal-plugin-1.0.0.tgz#390dc5656ba8a2830e39dba3570d79138df2ffd9" integrity sha1-OQ3FZWuoooMOOdujVw15E43y/9k= -esdoc@pzuraq/esdoc#015a342: +"esdoc@github:pzuraq/esdoc#015a342": version "1.0.4" resolved "https://codeload.github.com/pzuraq/esdoc/tar.gz/015a3426b2e53b2b0270a9c00133780db3f1d144" dependencies: @@ -6689,7 +6696,7 @@ eslint-visitor-keys@^1.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== -eslint@^5.16.0, eslint@^5.6.0: +eslint@^5.6.0: version "5.16.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== @@ -6785,11 +6792,6 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= -estree-walker@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e" - integrity sha1-va/oCVOD2EFNXcLs9MkXO225QS4= - estree-walker@^0.5.0, estree-walker@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.2.tgz#d3850be7529c9580d815600b53126515e146dd39" @@ -9757,6 +9759,11 @@ lodash.assign@^3.2.0: lodash._createassigner "^3.0.0" lodash.keys "^3.0.0" +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= + lodash.assignin@^4.0.9, lodash.assignin@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" @@ -9776,6 +9783,11 @@ lodash.bind@~2.3.0: lodash._renative "~2.3.0" lodash._slice "~2.3.0" +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + lodash.castarray@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" @@ -9786,6 +9798,11 @@ lodash.clonedeep@^4.4.1, lodash.clonedeep@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= +lodash.compact@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash.compact/-/lodash.compact-3.0.1.tgz#540ce3837745975807471e16b4a2ba21e7256ca5" + integrity sha1-VAzjg3dFl1gHRx4WtKK6IeclbKU= + lodash.debounce@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-3.1.1.tgz#812211c378a94cc29d5aa4e3346cf0bfce3a7df5" @@ -9830,7 +9847,7 @@ lodash.filter@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4= -lodash.find@^4.5.1: +lodash.find@^4.5.1, lodash.find@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" integrity sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E= @@ -9843,7 +9860,7 @@ lodash.flatten@^3.0.2: lodash._baseflatten "^3.0.0" lodash._isiterateecall "^3.0.0" -lodash.flatten@^4.2.0: +lodash.flatten@^4.2.0, lodash.flatten@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= @@ -9861,6 +9878,11 @@ lodash.foreach@~2.3.x: lodash._basecreatecallback "~2.3.0" lodash.forown "~2.3.0" +lodash.forin@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.forin/-/lodash.forin-4.4.0.tgz#5d3f20ae564011fbe88381f7d98949c9c9519731" + integrity sha1-XT8grlZAEfvog4H32YlJyclRlzE= + lodash.forown@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.forown/-/lodash.forown-2.3.0.tgz#24fb4aaf800d45fc2dc60bfec3ce04c836a3ad7f" @@ -9870,11 +9892,26 @@ lodash.forown@~2.3.0: lodash._objecttypes "~2.3.0" lodash.keys "~2.3.0" +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + +lodash.has@^4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.has/-/lodash.has-4.5.2.tgz#d19f4dc1095058cccbe2b0cdf4ee0fe4aa37c862" + integrity sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI= + lodash.identity@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.identity/-/lodash.identity-2.3.0.tgz#6b01a210c9485355c2a913b48b6711219a173ded" integrity sha1-awGiEMlIU1XCqRO0i2cRIZoXPe0= +lodash.invokemap@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz#1748cda5d8b0ef8369c4eb3ec54c21feba1f2d62" + integrity sha1-F0jNpdiw74NpxOs+xUwh/rofLWI= + lodash.isarguments@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" @@ -9885,11 +9922,31 @@ lodash.isarray@^3.0.0: resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U= +lodash.isempty@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" + integrity sha1-b4bL7di+TsmHvpqvM8loTbGzHn4= + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + +lodash.isfunction@^3.0.9: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" + integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== + lodash.isfunction@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-2.3.0.tgz#6b2973e47a647cf12e70d676aea13643706e5267" integrity sha1-aylz5HpkfPEucNZ2rqE2Q3BuUmc= +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= + lodash.isobject@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.3.0.tgz#2e16d3fc583da9831968953f2d8e6d73434f6799" @@ -9897,6 +9954,11 @@ lodash.isobject@~2.3.0: dependencies: lodash._objecttypes "~2.3.0" +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + lodash.keys@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" @@ -9915,11 +9977,21 @@ lodash.keys@~2.3.0: lodash._shimkeys "~2.3.0" lodash.isobject "~2.3.0" -lodash.map@^4.4.0: +lodash.lowerfirst@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/lodash.lowerfirst/-/lodash.lowerfirst-4.3.1.tgz#de3c7b12e02c6524a0059c2f6cb7c5c52655a13d" + integrity sha1-3jx7EuAsZSSgBZwvbLfFxSZVoT0= + +lodash.map@^4.4.0, lodash.map@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= +lodash.mapvalues@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" + integrity sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw= + lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -9940,7 +10012,7 @@ lodash.omit@^4.1.0: resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA= -lodash.pick@^4.2.1: +lodash.pick@^4.2.1, lodash.pick@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= @@ -10097,7 +10169,7 @@ lunr@^2.3.6: resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.6.tgz#f278beee7ffd56ad86e6e478ce02ab2b98c78dd5" integrity sha512-swStvEyDqQ85MGpABCMBclZcLI/pBIlu8FFDtmX197+oEgKloJ67QnB+Tidh0340HmLMs39c4GrkPY3cmkXp6Q== -magic-string@^0.22.0, magic-string@^0.22.4: +magic-string@^0.22.4: version "0.22.5" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e" integrity sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w== @@ -10795,11 +10867,6 @@ node-modules-path@^1.0.1: resolved "https://registry.yarnpkg.com/node-modules-path/-/node-modules-path-1.0.2.tgz#e3acede9b7baf4bc336e3496b58e5b40d517056e" integrity sha512-6Gbjq+d7uhkO7epaKi5DNgUJn7H0gEyA4Jg0Mo1uQOi3Rk50G83LtmhhFyw0LxnAFhtlspkiiw52ISP13qzcBg== -node-modules-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" - integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= - node-notifier@^5.0.1: version "5.2.1" resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" @@ -11575,13 +11642,6 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pirates@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-3.0.2.tgz#7e6f85413fd9161ab4e12b539b06010d85954bb9" - integrity sha512-c5CgUJq6H2k6MJz72Ak1F5sN9n9wlSlJyEnwvpm9/y3WB4E3pHBDT2c6PEiS1vyJvq2bUxUAIu0EGf8Cx4Ic7Q== - dependencies: - node-modules-regexp "^1.0.0" - pixelmatch@^4.0.0, pixelmatch@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854" @@ -11768,20 +11828,15 @@ preserve@^0.2.0: resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= -pretender@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.0.1.tgz#817ac43faa3330aa17646968a115f232de10b2ca" - integrity sha512-NO5qK7vJls4uz1NxVKuAY6/aHLOVvchGAvrPWCRHRKpCLquBWQjk3CVx195Hs5yUdcQ4e3OlpUijmOzFzzOmWQ== +pretender@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.0.2.tgz#1e9123914c4e4bd1b553ca78a401120d300d265f" + integrity sha512-6gIDHUaJKRZv7ZgP3CsKicvxtBB3brBr2LWKvJYvEyZRicG9JV2SKokK2TIK0b4Zz9+4C79y57MZHpqUjvJqDg== dependencies: fake-xml-http-request "^2.0.0" route-recognizer "^0.3.3" whatwg-fetch "^3.0.0" -prettier@^1.18.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" - integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== - pretty-ms@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-3.2.0.tgz#87a8feaf27fc18414d75441467d411d6e6098a25" @@ -12613,14 +12668,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rollup-plugin-async@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-async/-/rollup-plugin-async-1.2.0.tgz#f95fdd29f8b6f2332b5a89a9d64ee8087b12b249" - integrity sha1-+V/dKfi28jMrWomp1k7oCHsSskk= - dependencies: - async-to-gen "^1.2.0" - rollup-pluginutils "^1.5.1" - rollup-plugin-commonjs@^8.3.0: version "8.4.1" resolved "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.4.1.tgz#5c9cea2b2c3de322f5fbccd147e07ed5e502d7a0" @@ -12641,14 +12688,6 @@ rollup-plugin-node-resolve@^3.3.0: is-module "^1.0.0" resolve "^1.1.6" -rollup-pluginutils@^1.5.1: - version "1.5.2" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408" - integrity sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg= - dependencies: - estree-walker "^0.2.1" - minimatch "^3.0.2" - rollup-pluginutils@^2.0.1: version "2.3.3" resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.3.3.tgz#3aad9b1eb3e7fe8262820818840bf091e5ae6794" From d10486d1991781118ad8bd91dc8228c35254503f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2019 11:21:02 +0000 Subject: [PATCH 533/879] build(deps-dev): bump ember-load-initializers from 2.0.0 to 2.1.0 Bumps [ember-load-initializers](https://github.com/ember-cli/ember-load-initializers) from 2.0.0 to 2.1.0. - [Release notes](https://github.com/ember-cli/ember-load-initializers/releases) - [Changelog](https://github.com/ember-cli/ember-load-initializers/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-load-initializers/compare/v2.0.0...v2.1.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/yarn.lock b/yarn.lock index bedb79fa3..120ae3168 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5427,7 +5427,7 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.0, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.10.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.0, ember-cli-babel@^7.7.3: version "7.11.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.11.0.tgz#a2f4e4f123a4690968b512b87b4ff4bfa57ec244" integrity sha512-ykEsr7XoEPaADCBCJMViycCok1grtBRGvZ1k/atlL/gQYCQ1W4E4OROY/Mm2YBgyLftBv6buH7IZsULyQRZUmg== @@ -6163,11 +6163,12 @@ ember-keyboard@^4.0.0: ember-cli-babel "^6.6.0" ember-load-initializers@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-2.0.0.tgz#d4b3108dd14edb0f9dc3735553cc96dadd8a80cb" - integrity sha512-GQ0x7jGcPovmIFsLQO0dFERHCjkFNAWeuVErXHR466oPHvi479in/WtSJK707pmr3GA5QXXRJy6U8fAdJeJcxA== + version "2.1.0" + resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-2.1.0.tgz#b402815ab9c823ff48a1369b52633721987e72d4" + integrity sha512-zvcq35U2EPyjonCPdDBISZbeuxP3OXf+asmj2bNucFwo1ej7gYJCJacy6N8oABEG2EmrU/8jMDoZndWIAGn0cQ== dependencies: - ember-cli-babel "^7.0.0" + ember-cli-babel "^7.10.0" + ember-cli-typescript "^2.0.0" ember-macro-helpers@^2.1.0: version "2.1.0" @@ -6608,8 +6609,9 @@ esdoc-ecmascript-proposal-plugin@^1.0.0: resolved "https://registry.yarnpkg.com/esdoc-ecmascript-proposal-plugin/-/esdoc-ecmascript-proposal-plugin-1.0.0.tgz#390dc5656ba8a2830e39dba3570d79138df2ffd9" integrity sha1-OQ3FZWuoooMOOdujVw15E43y/9k= -"esdoc@github:pzuraq/esdoc#015a342": +esdoc@pzuraq/esdoc#015a342: version "1.0.4" + uid "015a3426b2e53b2b0270a9c00133780db3f1d144" resolved "https://codeload.github.com/pzuraq/esdoc/tar.gz/015a3426b2e53b2b0270a9c00133780db3f1d144" dependencies: babel-generator "6.26.0" @@ -6624,13 +6626,6 @@ esdoc-ecmascript-proposal-plugin@^1.0.0: minimist "1.2.0" taffydb "2.7.2" -eslint-plugin-ember-suave@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember-suave/-/eslint-plugin-ember-suave-1.0.0.tgz#ea7d232a126562dcd8b1ee3aa2700ac3b626e514" - integrity sha1-6n0jKhJlYtzYse46onAKw7Ym5RQ= - dependencies: - requireindex "~1.1.0" - eslint-plugin-ember@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.0.0.tgz#75412b62501a8489b5b6345ccb6adfb877ceb38a" @@ -12537,11 +12532,6 @@ require-relative@^0.8.7: resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4= -requireindex@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162" - integrity sha1-5UBLgVV+91225JxacgBIk/4D4WI= - requires-port@1.x.x, requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" From 0212929d0f767e7614bf6cb9021a160a801150b4 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2019 09:00:10 -0400 Subject: [PATCH 534/879] build(deps-dev): bump ember-cli-deploy-build from 1.1.1 to 2.0.0 (#1743) Bumps [ember-cli-deploy-build](https://github.com/ember-cli-deploy/ember-cli-deploy-build) from 1.1.1 to 2.0.0. - [Release notes](https://github.com/ember-cli-deploy/ember-cli-deploy-build/releases) - [Changelog](https://github.com/ember-cli-deploy/ember-cli-deploy-build/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli-deploy/ember-cli-deploy-build/compare/v1.1.1...v2.0.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 30 +++++++----------------------- 2 files changed, 8 insertions(+), 24 deletions(-) diff --git a/package.json b/package.json index 621a8d9b1..2093b9911 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "ember-cli-app-version": "^3.2.0", "ember-cli-dependency-checker": "^3.0.0", "ember-cli-deploy": "^1.0.2", - "ember-cli-deploy-build": "^1.1.1", + "ember-cli-deploy-build": "^2.0.0", "ember-cli-deploy-git": "^1.3.3", "ember-cli-deploy-git-ci": "^1.0.1", "ember-cli-eslint": "^5.1.0", diff --git a/yarn.lock b/yarn.lock index bedb79fa3..49c04970a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5498,10 +5498,10 @@ ember-cli-dependency-checker@^3.0.0: resolve "^1.5.0" semver "^5.3.0" -ember-cli-deploy-build@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ember-cli-deploy-build/-/ember-cli-deploy-build-1.1.1.tgz#de515b04536a569f42626ef28aea139f32ef00e8" - integrity sha512-q6Svm9PhEO2t5bCjsHfwkm36Cdou1eTdzvw00dU/nAHnysmai7sIqEzT7k20zawjGws7CgttZzMz6Oek5TOZ1w== +ember-cli-deploy-build@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-deploy-build/-/ember-cli-deploy-build-2.0.0.tgz#20d14836f5e8e1325a5b2c3d43367354783d2008" + integrity sha512-o6TCCKVLC85KYkk3TV8PCmEPfUI9R0qYzb7Sda+SIq9f5oR+vOoTsQmjUPyMB5Qou2sBVreUTjgNEaJBzvLtLg== dependencies: chalk "^1.0.0" ember-cli-deploy-plugin "^0.2.1" @@ -6608,8 +6608,9 @@ esdoc-ecmascript-proposal-plugin@^1.0.0: resolved "https://registry.yarnpkg.com/esdoc-ecmascript-proposal-plugin/-/esdoc-ecmascript-proposal-plugin-1.0.0.tgz#390dc5656ba8a2830e39dba3570d79138df2ffd9" integrity sha1-OQ3FZWuoooMOOdujVw15E43y/9k= -"esdoc@github:pzuraq/esdoc#015a342": +esdoc@pzuraq/esdoc#015a342: version "1.0.4" + uid "015a3426b2e53b2b0270a9c00133780db3f1d144" resolved "https://codeload.github.com/pzuraq/esdoc/tar.gz/015a3426b2e53b2b0270a9c00133780db3f1d144" dependencies: babel-generator "6.26.0" @@ -6624,13 +6625,6 @@ esdoc-ecmascript-proposal-plugin@^1.0.0: minimist "1.2.0" taffydb "2.7.2" -eslint-plugin-ember-suave@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember-suave/-/eslint-plugin-ember-suave-1.0.0.tgz#ea7d232a126562dcd8b1ee3aa2700ac3b626e514" - integrity sha1-6n0jKhJlYtzYse46onAKw7Ym5RQ= - dependencies: - requireindex "~1.1.0" - eslint-plugin-ember@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.0.0.tgz#75412b62501a8489b5b6345ccb6adfb877ceb38a" @@ -12537,11 +12531,6 @@ require-relative@^0.8.7: resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4= -requireindex@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162" - integrity sha1-5UBLgVV+91225JxacgBIk/4D4WI= - requires-port@1.x.x, requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -12723,12 +12712,7 @@ rsvp@^3.0.14, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0 resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== -rsvp@^4.6.1, rsvp@^4.7.0, rsvp@^4.8.0, rsvp@^4.8.1, rsvp@^4.8.2, rsvp@^4.8.3, rsvp@^4.8.4: - version "4.8.4" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911" - integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA== - -rsvp@^4.8.5: +rsvp@^4.6.1, rsvp@^4.7.0, rsvp@^4.8.0, rsvp@^4.8.1, rsvp@^4.8.2, rsvp@^4.8.3, rsvp@^4.8.4, rsvp@^4.8.5: version "4.8.5" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== From ecaeccdcb4a5eb7b7b54f8c557196dd42146611e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2019 09:00:53 -0400 Subject: [PATCH 535/879] build(deps-dev): bump eslint-plugin-node from 9.1.0 to 10.0.0 (#1744) Bumps [eslint-plugin-node](https://github.com/mysticatea/eslint-plugin-node) from 9.1.0 to 10.0.0. - [Release notes](https://github.com/mysticatea/eslint-plugin-node/releases) - [Commits](https://github.com/mysticatea/eslint-plugin-node/compare/v9.1.0...v10.0.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 31 ++++++++++++++++++------------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 2093b9911..c3922efbd 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,7 @@ "ember-try": "^1.0.0", "escape-string-regexp": "^2.0.0", "eslint-plugin-ember": "^7.0.0", - "eslint-plugin-node": "^9.0.1", + "eslint-plugin-node": "^10.0.0", "faker": "^4.1.0", "fastboot": "^2.0.1", "js-yaml": "^3.12.1", diff --git a/yarn.lock b/yarn.lock index 49c04970a..deab5fe29 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6634,21 +6634,21 @@ eslint-plugin-ember@^7.0.0: ember-rfc176-data "^0.3.11" snake-case "^2.1.0" -eslint-plugin-es@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz#475f65bb20c993fc10e8c8fe77d1d60068072da6" - integrity sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw== +eslint-plugin-es@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-2.0.0.tgz#0f5f5da5f18aa21989feebe8a73eadefb3432976" + integrity sha512-f6fceVtg27BR02EYnBhgWLFQfK6bN4Ll0nQFrBHOlCsAyxeZkn0NHns5O0YZOPrV1B3ramd6cgFwaoFLcSkwEQ== dependencies: - eslint-utils "^1.3.0" - regexpp "^2.0.1" + eslint-utils "^1.4.2" + regexpp "^3.0.0" -eslint-plugin-node@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-9.1.0.tgz#f2fd88509a31ec69db6e9606d76dabc5adc1b91a" - integrity sha512-ZwQYGm6EoV2cfLpE1wxJWsfnKUIXfM/KM09/TlorkukgCAwmkgajEJnPCmyzoFPQQkmvo5DrW/nyKutNIw36Mw== +eslint-plugin-node@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-10.0.0.tgz#fd1adbc7a300cf7eb6ac55cf4b0b6fc6e577f5a6" + integrity sha512-1CSyM/QCjs6PXaT18+zuAXsjXGIGo5Rw630rSKwokSs2jrYURQc4R5JZpoanNCqwNmepg+0eZ9L7YiRUJb8jiQ== dependencies: - eslint-plugin-es "^1.4.0" - eslint-utils "^1.3.1" + eslint-plugin-es "^2.0.0" + eslint-utils "^1.4.2" ignore "^5.1.1" minimatch "^3.0.4" resolve "^1.10.1" @@ -6678,7 +6678,7 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-utils@^1.3.0, eslint-utils@^1.3.1: +eslint-utils@^1.3.1, eslint-utils@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab" integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q== @@ -12352,6 +12352,11 @@ regexpp@^2.0.1: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== +regexpp@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" + integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== + regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" From 0f88a388cd8a9fc1fbdd3afecc9267c10022d94c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2019 09:01:28 -0400 Subject: [PATCH 536/879] build(deps-dev): bump ember-cli-htmlbars-inline-precompile (#1742) Bumps [ember-cli-htmlbars-inline-precompile](https://github.com/ember-cli/ember-cli-htmlbars-inline-precompile) from 2.1.0 to 3.0.0. - [Release notes](https://github.com/ember-cli/ember-cli-htmlbars-inline-precompile/releases) - [Changelog](https://github.com/ember-cli/ember-cli-htmlbars-inline-precompile/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-cli-htmlbars-inline-precompile/compare/v2.1.0...v3.0.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index c3922efbd..b32f6bcbe 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "ember-cli-fastboot": "^2.0.4", "ember-cli-favicon": "^2.0.0", "ember-cli-htmlbars": "^3.0.0", - "ember-cli-htmlbars-inline-precompile": "^2.1.0", + "ember-cli-htmlbars-inline-precompile": "^3.0.0", "ember-cli-inject-live-reload": "^2.0.1", "ember-cli-moment-shim": "^3.7.1", "ember-cli-qunit": "^4.4.0", diff --git a/yarn.lock b/yarn.lock index deab5fe29..13bdd5a7b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2318,6 +2318,11 @@ babel-plugin-htmlbars-inline-precompile@^1.0.0: resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-1.0.0.tgz#a9d2f6eaad8a3f3d361602de593a8cbef8179c22" integrity sha512-4jvKEHR1bAX03hBDZ94IXsYCj3bwk9vYsn6ux6JZNL2U5pvzCWjqyrGahfsGNrhERyxw8IqcirOi9Q6WCo3dkQ== +babel-plugin-htmlbars-inline-precompile@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-2.0.0.tgz#e08e0107468637f93625d159d3670dc19cf55e4f" + integrity sha512-08vtZNHseQ+uxN5DxK0ca1Qs1MWqzieuWF+pYkEzFohF+WxVNLiM1FN6ss5YP3BrigE68sI/yFrbJlO0bSb1XA== + babel-plugin-module-resolver@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.1.1.tgz#881cf67e3d4b8400d5eaaefc1be44d2dc1fe404f" @@ -5625,6 +5630,17 @@ ember-cli-htmlbars-inline-precompile@^2.1.0: heimdalljs-logger "^0.1.9" silent-error "^1.1.0" +ember-cli-htmlbars-inline-precompile@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-3.0.0.tgz#df67c7c3e69406063d57d3d9b7a27812bb2835de" + integrity sha512-OI/xDQkYm+uo0rbMAtRFWwuYv+MKekyzDac4xm42kWKNVClCABL56U7X7Z18BEWXhp5twYVbc3PSnjwA/eZN3w== + dependencies: + babel-plugin-htmlbars-inline-precompile "^2.0.0" + ember-cli-version-checker "^3.1.3" + hash-for-dep "^1.5.1" + heimdalljs-logger "^0.1.9" + silent-error "^1.1.0" + ember-cli-htmlbars@^2.0.1, ember-cli-htmlbars@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.4.tgz#0bcda483f14271663c38756e1fd1cb89da6a50cf" From c8ee0b1493d28f033ee0616abffcfaa1ca64c276 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 5 Sep 2019 17:15:41 -0400 Subject: [PATCH 537/879] Bump @miragejs/server (#1747) --- package.json | 2 +- yarn.lock | 21 ++++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index b32f6bcbe..8d062b7cd 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "prepare": "./scripts/link.sh" }, "dependencies": { - "@miragejs/server": "0.1.21", + "@miragejs/server": "0.1.23", "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^2.0.1", "broccoli-merge-trees": "^3.0.2", diff --git a/yarn.lock b/yarn.lock index 6e4bd0651..80d61d5c6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1135,10 +1135,10 @@ dependencies: core-js "^2.5.7" -"@miragejs/server@0.1.21": - version "0.1.21" - resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.21.tgz#28f8d1aaa65cac5d1b02e34c7c18971534237995" - integrity sha512-O16ISQCC2j6dTn1OF1BHglbNgg2cz/JWFlVyTwyGfwfF2AUGRPlcETd/eFqfKL46Z/YMbcWGTVyIvDVRPGtPLQ== +"@miragejs/server@0.1.23": + version "0.1.23" + resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.23.tgz#10e7c1865b9fc4b1c4b8ae5f9ee58509efb37519" + integrity sha512-WgcuN4fjWDzqGo/f9f1G1df0JbCUS4ulOGHaWYgrhvDTMq7LDbn1g31xO30IWdZ4USxiLR79CskXg6DuqZlXAw== dependencies: inflected "^2.0.4" lodash.assign "^4.2.0" @@ -1160,8 +1160,10 @@ lodash.map "^4.6.0" lodash.mapvalues "^4.6.0" lodash.pick "^4.4.0" + lodash.snakecase "^4.1.1" lodash.uniq "^4.5.0" lodash.uniqby "^4.7.0" + lodash.values "^4.3.0" pretender "3.0.2" "@simple-dom/document@^1.4.0": @@ -6627,7 +6629,6 @@ esdoc-ecmascript-proposal-plugin@^1.0.0: esdoc@pzuraq/esdoc#015a342: version "1.0.4" - uid "015a3426b2e53b2b0270a9c00133780db3f1d144" resolved "https://codeload.github.com/pzuraq/esdoc/tar.gz/015a3426b2e53b2b0270a9c00133780db3f1d144" dependencies: babel-generator "6.26.0" @@ -10043,6 +10044,11 @@ lodash.restparam@^3.0.0: resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= +lodash.snakecase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" + integrity sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40= + lodash.some@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" @@ -10106,6 +10112,11 @@ lodash.uniqby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI= +lodash.values@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" + integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c= + lodash.values@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.3.0.tgz#ca96fbe60a20b0b0ec2ba2ba5fc6a765bd14a3ba" From 893060d5522ff97c34d682a2e4d8407ac3ea85f1 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 5 Sep 2019 17:18:31 -0400 Subject: [PATCH 538/879] v1.1.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8d062b7cd..09fab455f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "1.1.0", + "version": "1.1.1", "description": "A client-side server to help you build, test and demo your Ember app", "keywords": [ "ember-addon", From fecd714946dbe1d782790dd2b0089d4aa46f8ff2 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 11 Sep 2019 11:54:03 +0000 Subject: [PATCH 539/879] build(deps-dev): bump ember-cli-fastboot from 2.1.3 to 2.2.0 Bumps [ember-cli-fastboot](https://github.com/ember-fastboot/ember-cli-fastboot) from 2.1.3 to 2.2.0. - [Release notes](https://github.com/ember-fastboot/ember-cli-fastboot/releases) - [Changelog](https://github.com/ember-fastboot/ember-cli-fastboot/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-fastboot/ember-cli-fastboot/compare/v2.1.3...v2.2.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 28 +++++----------------------- 1 file changed, 5 insertions(+), 23 deletions(-) diff --git a/yarn.lock b/yarn.lock index 80d61d5c6..e26e5d039 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3105,25 +3105,7 @@ broccoli-clean-css@^1.1.0: inline-source-map-comment "^1.0.5" json-stable-stringify "^1.0.0" -broccoli-concat@^3.2.2, broccoli-concat@^3.5.1, broccoli-concat@^3.7.1, broccoli-concat@^3.7.3: - version "3.7.3" - resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.7.3.tgz#0dca01311567ffb13180e6b4eb111824628e4885" - integrity sha512-2Ma9h81EJ0PRb9n4sW0i8KZlcnpTQfKxcj87zvi5DFe1fd8CTDEdseHDotK2beuA2l+LbgVPfd8EHaBJKm/Y8g== - dependencies: - broccoli-debug "^0.6.5" - broccoli-kitchen-sink-helpers "^0.3.1" - broccoli-plugin "^1.3.0" - ensure-posix-path "^1.0.2" - fast-sourcemap-concat "^1.4.0" - find-index "^1.1.0" - fs-extra "^4.0.3" - fs-tree-diff "^0.5.7" - lodash.merge "^4.3.1" - lodash.omit "^4.1.0" - lodash.uniq "^4.2.0" - walk-sync "^0.3.2" - -broccoli-concat@^3.7.4: +broccoli-concat@^3.2.2, broccoli-concat@^3.5.1, broccoli-concat@^3.7.1, broccoli-concat@^3.7.3, broccoli-concat@^3.7.4: version "3.7.4" resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.7.4.tgz#7371e846eb7a97cb44ccff10f68582bcadcafacd" integrity sha512-9gRv1tyCQuq2+48DT9DQyxRNLOuwDtHybDeYuWA3g26HFqZd0PGAOeXcLXHpKRhxzrEbU6Gm28dZ/KolMr04cQ== @@ -5573,9 +5555,9 @@ ember-cli-eslint@^5.1.0: walk-sync "^1.0.0" ember-cli-fastboot@^2.0.4: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ember-cli-fastboot/-/ember-cli-fastboot-2.1.3.tgz#4cdef4e1110d15d925efe1408c0386a2a75688d0" - integrity sha512-1HIJz/VyuOvy4Z1k9eSYQ4w/JQev50BS3A/k79cd5V9z3jQNalPVUVJKSBVMrBOIa++aPePl+8aN4suryqAuXQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/ember-cli-fastboot/-/ember-cli-fastboot-2.2.0.tgz#202d4c3ebcf6e392d5348e17208dec9f04bab98f" + integrity sha512-9nbHJvQAwxN2i9FgUzsjhKclzSxJw6rmli8qwiblUkKVhs7PqKsjMszxA/Ssk3UjqCNkecEsNzaJoycPgrIChQ== dependencies: broccoli-concat "^3.7.1" broccoli-funnel "^2.0.1" @@ -10009,7 +9991,7 @@ lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -lodash.merge@^4.3.1, lodash.merge@^4.4.0, lodash.merge@^4.6.0, lodash.merge@^4.6.2, lodash.merge@~4.6.1: +lodash.merge@^4.4.0, lodash.merge@^4.6.0, lodash.merge@^4.6.2, lodash.merge@~4.6.1: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== From b18642b8ffe393f8e106b58a607973d06ec071f1 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 12 Sep 2019 11:26:10 +0000 Subject: [PATCH 540/879] build(deps-dev): bump ember-cli-fastboot from 2.2.0 to 2.2.1 Bumps [ember-cli-fastboot](https://github.com/ember-fastboot/ember-cli-fastboot) from 2.2.0 to 2.2.1. - [Release notes](https://github.com/ember-fastboot/ember-cli-fastboot/releases) - [Changelog](https://github.com/ember-fastboot/ember-cli-fastboot/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-fastboot/ember-cli-fastboot/compare/v2.2.0...v2.2.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index e26e5d039..1bcc1ee9d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4067,13 +4067,13 @@ cheerio@0.22.0, cheerio@^0.22.0: lodash.reject "^4.4.0" lodash.some "^4.4.0" -cheerio@^1.0.0-rc.2: - version "1.0.0-rc.2" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db" - integrity sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs= +cheerio@^1.0.0-rc.2, cheerio@^1.0.0-rc.3: + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.3.tgz#094636d425b2e9c0f4eb91a46c05630c9a1a8bf6" + integrity sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA== dependencies: css-select "~1.2.0" - dom-serializer "~0.1.0" + dom-serializer "~0.1.1" entities "~1.1.1" htmlparser2 "^3.9.1" lodash "^4.15.0" @@ -5062,6 +5062,14 @@ dom-serializer@0, dom-serializer@~0.1.0: domelementtype "~1.1.1" entities "~1.1.1" +dom-serializer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" + integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== + dependencies: + domelementtype "^1.3.0" + entities "^1.1.1" + dom-walk@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" @@ -5555,15 +5563,17 @@ ember-cli-eslint@^5.1.0: walk-sync "^1.0.0" ember-cli-fastboot@^2.0.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ember-cli-fastboot/-/ember-cli-fastboot-2.2.0.tgz#202d4c3ebcf6e392d5348e17208dec9f04bab98f" - integrity sha512-9nbHJvQAwxN2i9FgUzsjhKclzSxJw6rmli8qwiblUkKVhs7PqKsjMszxA/Ssk3UjqCNkecEsNzaJoycPgrIChQ== + version "2.2.1" + resolved "https://registry.yarnpkg.com/ember-cli-fastboot/-/ember-cli-fastboot-2.2.1.tgz#8c646fe3f93331c61ba87149cfecf327de79826f" + integrity sha512-veT089wHsYNyx+IZyjG38+RMzHiiLNX2zwRAmv31VWT1NyaEcHv7+u9iOV3KdA1wVgpicJQ2PVIOw8OuIHo+1A== dependencies: broccoli-concat "^3.7.1" + broccoli-file-creator "^2.1.1" broccoli-funnel "^2.0.1" broccoli-merge-trees "^3.0.1" broccoli-plugin "^1.3.1" chalk "^2.4.1" + cheerio "^1.0.0-rc.3" ember-cli-babel "^7.1.0" ember-cli-lodash-subset "2.0.1" ember-cli-preprocess-registry "^3.1.2" From f7b1c47e48b1d97c8c4773cc0ff5532e1b9516a8 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 12 Sep 2019 12:11:29 +0000 Subject: [PATCH 541/879] build(deps-dev): bump fastboot from 2.0.2 to 2.0.3 Bumps [fastboot](https://github.com/ember-fastboot/fastboot) from 2.0.2 to 2.0.3. - [Release notes](https://github.com/ember-fastboot/fastboot/releases) - [Changelog](https://github.com/ember-fastboot/fastboot/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-fastboot/fastboot/compare/v2.0.2...v2.0.3) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1bcc1ee9d..bf49ce65e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7225,9 +7225,9 @@ fastboot-transform@^0.1.3: convert-source-map "^1.5.1" fastboot@^2.0.0, fastboot@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-2.0.2.tgz#8f4b09aabf7cb69b80b673837a0e760d19b964b5" - integrity sha512-b/RdlA8ndtQeu+jHQ4EszrFLIDLZcHQqP7tsXIb+8yIdYsYAvaeeF6jc1LkwBJ0qbdNx8pXHehxSqO30BxRRGw== + version "2.0.3" + resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-2.0.3.tgz#0b712e6c590f1b463dc5b12138893bcbbafa2459" + integrity sha512-NNH/o+XhITAQUnW2CC9IDXlcnI74W2BONjtRSRmc01N3uJl/7pcvX9iWTUWu2PYQbQZUBu8HzVFt7GmQ9qw9JQ== dependencies: chalk "^2.0.1" cookie "^0.4.0" From 4e877b0d412d2fe079e24d9bd907953fbb969cdd Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 13 Sep 2019 11:07:06 +0000 Subject: [PATCH 542/879] build(deps-dev): bump ember-cli-deploy-git from 1.3.3 to 1.3.4 Bumps [ember-cli-deploy-git](https://github.com/ef4/ember-cli-deploy-git) from 1.3.3 to 1.3.4. - [Release notes](https://github.com/ef4/ember-cli-deploy-git/releases) - [Commits](https://github.com/ef4/ember-cli-deploy-git/compare/v1.3.3...v1.3.4) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index bf49ce65e..53081eba4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5515,9 +5515,9 @@ ember-cli-deploy-git-ci@^1.0.1: fs-extra "^4.0.0" ember-cli-deploy-git@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/ember-cli-deploy-git/-/ember-cli-deploy-git-1.3.3.tgz#7fdd035ad93af4016d1eecbc0a5bac35ae7da60f" - integrity sha512-skwu+ROq38SuWqcrTh0e/iTCLWOdeANMz2PcnSIiPUcOocVCZUX0FbV4YmQ9Wn6yavzg7VTKrZPxN1YA9eHwYg== + version "1.3.4" + resolved "https://registry.yarnpkg.com/ember-cli-deploy-git/-/ember-cli-deploy-git-1.3.4.tgz#918905df863eb867d23a323ff0b80d1336cfa05d" + integrity sha512-ESLyVY7yLM+hS31/7rXIpQnA5skKkpQx+TRn+GVRPp6g6XSApUrmWAmmeBIYhDLsxMZRLgD98DhDF50ogOoU7A== dependencies: ember-cli-babel "^6.11.0" ember-cli-deploy-plugin "^0.2.9" From d60adbdddf24c5ba84168d9833a4c10039c5f78f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 19 Sep 2019 10:47:46 +0000 Subject: [PATCH 543/879] build(deps-dev): bump eslint-plugin-ember from 7.0.0 to 7.1.0 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 7.0.0 to 7.1.0. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v7.0.0...v7.1.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/yarn.lock b/yarn.lock index 53081eba4..ed3b77f38 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6262,7 +6262,7 @@ ember-responsive@^3.0.5: dependencies: ember-cli-babel "^6.6.0" -ember-rfc176-data@^0.3.11, ember-rfc176-data@^0.3.12: +ember-rfc176-data@^0.3.12: version "0.3.12" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.12.tgz#90d82878e69e2ac9a5438e8ce14d12c6031c5bd2" integrity sha512-g9HeZj/gU5bfIIrGXkP7MhS2b3Vu5DfNUrYr14hy99TgIvtZETO+96QF4WOEUXGjIJdfTRjerVnQlqngPQSv1g== @@ -6636,12 +6636,12 @@ esdoc@pzuraq/esdoc#015a342: taffydb "2.7.2" eslint-plugin-ember@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.0.0.tgz#75412b62501a8489b5b6345ccb6adfb877ceb38a" - integrity sha512-cMdYuKs46hpF5DEPQ2cccNjgC5xy0C1GcFfP47qiHTKAAAkHUttD/6DdEH3OwlreK/uFbF4fFaHxuq84xkaOgA== + version "7.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.1.0.tgz#1ae46ead1f17efa489e2dcba3fe3880b95fc162b" + integrity sha512-Tbh/vCxzQrOpzXX2zhEA+FJyZWHscisXi3pKPHmy49MHz0ZjGxBmhR4Y72xw6qeiwwtVNkU4+iCYTLgNeA05TQ== dependencies: "@ember-data/rfc395-data" "^0.0.4" - ember-rfc176-data "^0.3.11" + ember-rfc176-data "^0.3.12" snake-case "^2.1.0" eslint-plugin-es@^2.0.0: From 05ba18590ef504579c7d35692d31d9569899f1a7 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 24 Sep 2019 11:17:59 +0000 Subject: [PATCH 544/879] build(deps): bump ember-cli-babel from 7.11.0 to 7.11.1 Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 7.11.0 to 7.11.1. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v7.11.0...v7.11.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index ed3b77f38..80bf25d14 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3032,10 +3032,10 @@ broccoli-babel-transpiler@^6.5.0: rsvp "^4.8.2" workerpool "^2.3.0" -broccoli-babel-transpiler@^7.1.2: - version "7.2.0" - resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.2.0.tgz#5c0d694c4055106abb385e2d3d88936d35b7cb18" - integrity sha512-lkP9dNFfK810CRHHWsNl9rjyYqcXH3qg0kArnA6tV9Owx3nlZm3Eyr0cGo6sMUQCNLH+2oKrRjOdUGSc6Um6Cw== +broccoli-babel-transpiler@^7.1.2, broccoli-babel-transpiler@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.3.0.tgz#a0ad3a37dbf74469664bbca403d652070c2c1317" + integrity sha512-tsXNvDf3gp6g8rGkz234AhbaIRUsCdd6CM3ikfkJVB0EpC8ZAczGsFKTjENLy1etx4s7FkruW/QjI7Wfdhx6Ng== dependencies: "@babel/core" "^7.3.3" "@babel/polyfill" "^7.0.0" @@ -5425,9 +5425,9 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be semver "^5.5.0" ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.10.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.0, ember-cli-babel@^7.7.3: - version "7.11.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.11.0.tgz#a2f4e4f123a4690968b512b87b4ff4bfa57ec244" - integrity sha512-ykEsr7XoEPaADCBCJMViycCok1grtBRGvZ1k/atlL/gQYCQ1W4E4OROY/Mm2YBgyLftBv6buH7IZsULyQRZUmg== + version "7.11.1" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.11.1.tgz#77bc8f4001d47b91d80e3d36a4754412616fc0d8" + integrity sha512-Qgd7y9NVbRLEtwjBW/vPHXdTQrIgfgoCSFHfvBpEmLuWSWNpE/J6qwXrSbB9nEIlfzyjH0Almv4m0jwuJsB3ow== dependencies: "@babel/core" "^7.0.0" "@babel/plugin-proposal-class-properties" "^7.3.4" @@ -5441,7 +5441,7 @@ ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cl babel-plugin-debug-macros "^0.3.0" babel-plugin-ember-modules-api-polyfill "^2.12.0" babel-plugin-module-resolver "^3.1.1" - broccoli-babel-transpiler "^7.1.2" + broccoli-babel-transpiler "^7.3.0" broccoli-debug "^0.6.4" broccoli-funnel "^2.0.1" broccoli-source "^1.1.0" From fe07094b49f06899f32e44fc3ed5bcdac366efc8 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 24 Sep 2019 11:19:57 +0000 Subject: [PATCH 545/879] build(deps-dev): bump ember-resolver from 5.2.1 to 5.3.0 Bumps [ember-resolver](https://github.com/ember-cli/ember-resolver) from 5.2.1 to 5.3.0. - [Release notes](https://github.com/ember-cli/ember-resolver/releases) - [Changelog](https://github.com/ember-cli/ember-resolver/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-resolver/compare/v5.2.1...v5.3.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index ed3b77f38..be86347fc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6243,9 +6243,9 @@ ember-qunit@^3.5.0: qunit "~2.6.0" ember-resolver@^5.0.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-5.2.1.tgz#538d7a29351316d9550864ff06fcbe55bdd92774" - integrity sha512-Ciz5qsrtILr7AGXO9mTSFs3/XKXpMYJqISNCfvIY0C8PlMgq+9RYbmUoBpAlvBUc/mUi3ORZKJ4csd9qchvxZw== + version "5.3.0" + resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-5.3.0.tgz#9fbeedfa63c094b588ac7647ba62f1305374f1d8" + integrity sha512-NWin+WzmsRnZxFvDlx9B3rb3kxwK0MNblJemoRvNbbxLK6z5lGxVoBfpU4/nqItWfwmpVb9ZK8bqXYs5q8HT4A== dependencies: "@glimmer/resolver" "^0.4.1" babel-plugin-debug-macros "^0.1.10" From 427ee5f8ed79d54e3f52e39d3718219ba63bc28f Mon Sep 17 00:00:00 2001 From: Michael Caputo Date: Tue, 24 Sep 2019 20:18:49 -0700 Subject: [PATCH 546/879] Update template.md for typo (#1765) --- tests/dummy/app/pods/docs/testing/acceptance-tests/template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md b/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md index 9e86de42e..ea87738a9 100644 --- a/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md +++ b/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md @@ -148,7 +148,7 @@ export default function(server) { server.loadFixtures('countries'); server.createList('event', 10); -}); +}; ``` ...load it in your default scenario From 160dcc825a9c9130b519b79587ce726d630bf0b3 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 25 Sep 2019 14:22:47 -0400 Subject: [PATCH 547/879] build(deps-dev): bump @ember/optional-features from 0.7.0 to 1.0.0 (#1759) Bumps [@ember/optional-features](https://github.com/emberjs/ember-optional-features) from 0.7.0 to 1.0.0. - [Release notes](https://github.com/emberjs/ember-optional-features/releases) - [Changelog](https://github.com/emberjs/ember-optional-features/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember-optional-features/compare/v0.7.0...v1.0.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 91 ++++++++++++---------------------------------------- 2 files changed, 21 insertions(+), 72 deletions(-) diff --git a/package.json b/package.json index 09fab455f..8cfb342df 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ }, "devDependencies": { "@ember/jquery": "^0.6.0", - "@ember/optional-features": "^0.7.0", + "@ember/optional-features": "^1.0.0", "active-model-adapter": "^2.0.3", "babel-eslint": "^9.0.0", "broccoli-asset-rev": "^3.0.0", diff --git a/yarn.lock b/yarn.lock index c7b8ab5e1..26524ab2a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -768,18 +768,18 @@ jquery "^3.4.1" resolve "^1.11.1" -"@ember/optional-features@^0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@ember/optional-features/-/optional-features-0.7.0.tgz#f65a858007020ddfb8342f586112750c32abd2d9" - integrity sha512-qLXvL/Kq/COb43oQmCrKx7Fy8k1XJDI2RlgbCnZHH26AGVgJT/sZugx1A2AIxKdamtl/Mi+rQSjGIuscSjqjDw== +"@ember/optional-features@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@ember/optional-features/-/optional-features-1.0.0.tgz#8e54ff37f4d9642212b45387f182cf7322aaaab9" + integrity sha512-nPWqiyjkbSLaNd1kA1Y0BYAx+0IzuxdBfOkQyEwNaaB6xvgGpQMiQF/Au5UBlV/S3GEpuL2kFRQj48XMiTBY+w== dependencies: - chalk "^2.3.0" + chalk "^2.4.2" co "^4.6.0" - ember-cli-version-checker "^2.1.0" - glob "^7.1.2" - inquirer "^3.3.0" + ember-cli-version-checker "^3.1.3" + glob "^7.1.4" + inquirer "^6.5.1" mkdirp "^0.5.1" - silent-error "^1.1.0" + silent-error "^1.1.1" util.promisify "^1.0.0" "@ember/ordered-set@^2.0.3": @@ -1710,11 +1710,6 @@ ansi-escapes@^1.1.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" integrity sha1-06ioOzGapneTZisT52HHkRQiMG4= -ansi-escapes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" - integrity sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ== - ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" @@ -4005,11 +4000,6 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4 escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chardet@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" - integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= - chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -7095,15 +7085,6 @@ external-editor@^1.1.0: spawn-sync "^1.0.15" tmp "^0.0.29" -external-editor@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" - integrity sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA== - dependencies: - chardet "^0.4.0" - iconv-lite "^0.4.17" - tmp "^0.0.33" - external-editor@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" @@ -7930,10 +7911,10 @@ glob@^5.0.10: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.3, glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== +glob@^7.0.3, glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -8430,7 +8411,7 @@ ice-cap@0.0.4: cheerio "0.20.0" color-logger "0.0.3" -iconv-lite@0.4.19, iconv-lite@^0.4.17: +iconv-lite@0.4.19: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" integrity sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ== @@ -8585,30 +8566,10 @@ inquirer@^2: strip-ansi "^3.0.0" through "^2.3.6" -inquirer@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" - integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.0.4" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - -inquirer@^6.2.2: - version "6.4.1" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.4.1.tgz#7bd9e5ab0567cd23b41b0180b68e0cfa82fc3c0b" - integrity sha512-/Jw+qPZx4EDYsaT6uz7F4GJRNFMRdKNeUZw3ZnKV8lyuUgz/YWRCSUAJMZSVhSq4Ec0R2oYnyi6b3d4JXcL5Nw== +inquirer@^6.2.2, inquirer@^6.5.1: + version "6.5.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== dependencies: ansi-escapes "^3.2.0" chalk "^2.4.2" @@ -8616,7 +8577,7 @@ inquirer@^6.2.2: cli-width "^2.0.0" external-editor "^3.0.3" figures "^2.0.0" - lodash "^4.17.11" + lodash "^4.17.12" mute-stream "0.0.7" run-async "^2.2.0" rxjs "^6.4.0" @@ -10121,7 +10082,7 @@ lodash@^3.10.0: resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= -lodash@^4.0.0, lodash@^4.1.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1: +lodash@^4.0.0, lodash@^4.1.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -12766,18 +12727,6 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rx-lite-aggregates@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" - integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= - dependencies: - rx-lite "*" - -rx-lite@*, rx-lite@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" - integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= - rx@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" From f7c171c772fe3055c412ac7679826cb198d9a8a8 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 25 Sep 2019 14:23:08 -0400 Subject: [PATCH 548/879] build(deps-dev): bump ember-data from 3.10.0 to 3.13.1 (#1766) Bumps [ember-data](https://github.com/emberjs/data) from 3.10.0 to 3.13.1. - [Release notes](https://github.com/emberjs/data/releases) - [Changelog](https://github.com/emberjs/data/blob/v3.13.1/CHANGELOG.md) - [Commits](https://github.com/emberjs/data/compare/v3.10.0...v3.13.1) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 268 ++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 214 insertions(+), 56 deletions(-) diff --git a/package.json b/package.json index 8cfb342df..730640dd3 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "ember-cli-sri": "^2.1.1", "ember-cli-uglify": "^3.0.0", "ember-composable-helpers": "^2.1.0", - "ember-data": "~3.10.0", + "ember-data": "~3.13.1", "ember-disable-prototype-extensions": "^1.1.3", "ember-export-application-global": "^2.0.0", "ember-load-initializers": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index 26524ab2a..55d688c9e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -421,6 +421,14 @@ "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.10" +"@babel/plugin-transform-block-scoping@^7.5.5": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.2.tgz#96c33ab97a9ae500cc6f5b19e04a7e6553360a79" + integrity sha512-zZT8ivau9LOQQaOGC7bQLQOT4XPkPXgN2ERfUgk1X8ql+mVkLc4E8eKk+FO3o0154kxzqenWCorfmEXpEZcrSQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.13" + "@babel/plugin-transform-classes@^7.2.0": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz#6c90542f210ee975aa2aa8c8b5af7fa73a126953" @@ -606,10 +614,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-typescript@^7.1.0": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.3.2.tgz#59a7227163e55738842f043d9e5bd7c040447d96" - integrity sha512-Pvco0x0ZSCnexJnshMfaibQ5hnK8aUHSvjCQhC1JR8eeg+iBwt0AtCO7gWxJ358zZevuf9wPSO5rv+WJcbHPXQ== +"@babel/plugin-transform-typescript@~7.4.0": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.4.5.tgz#ab3351ba35307b79981993536c93ff8be050ba28" + integrity sha512-RPB/YeGr4ZrFKNwfuQRlMf2lxoCUaU01MTw39/OFE/RiL8HDjtn68BwEPft1P7JN4akyEmjGWAMNldOV7o9V2g== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-typescript" "^7.2.0" @@ -733,7 +741,7 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.1.5", "@babel/types@^7.1.6", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.2", "@babel/types@^7.3.4", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.0": +"@babel/types@^7.0.0", "@babel/types@^7.1.6", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.2", "@babel/types@^7.3.4", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.0.tgz#e47d43840c2e7f9105bc4d3a2c371b4d0c7832ab" integrity sha512-UFpDVqRABKsW01bvw7/wSUe56uy6RXM5+VJibVVAybDGxEW25jdwiFJEf7ASvSaC7sN7rbE/l3cLp2izav+CtQ== @@ -751,11 +759,102 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@ember-data/-build-infra@3.13.1": + version "3.13.1" + resolved "https://registry.yarnpkg.com/@ember-data/-build-infra/-/-build-infra-3.13.1.tgz#e31247b72a4c61b837286d0ef0829f4128466601" + integrity sha512-bDvnQVPAaQf2UuRsU/6ha444hwdUsUeV5vNsc7U2i6ffzSYiF9y8yQhOoW0JgTUwz0mnASRscOO6QKEUJOTkKA== + dependencies: + "@babel/plugin-transform-block-scoping" "^7.5.5" + "@ember/edition-utils" "^1.1.1" + babel-plugin-debug-macros "^0.3.2" + babel-plugin-feature-flags "^0.3.1" + babel-plugin-filter-imports "^3.0.0" + babel6-plugin-strip-class-callcheck "^6.0.0" + broccoli-debug "^0.6.5" + broccoli-file-creator "^2.1.1" + broccoli-funnel "^2.0.2" + broccoli-merge-trees "^3.0.2" + broccoli-rollup "^4.1.1" + calculate-cache-key-for-tree "^2.0.0" + chalk "^2.4.1" + ember-cli-path-utils "^1.0.0" + ember-cli-string-utils "^1.1.0" + ember-cli-version-checker "^3.1.2" + esm "^3.2.25" + git-repo-info "^2.0.0" + glob "^7.1.4" + npm-git-info "^1.0.3" + rimraf "^2.6.2" + rsvp "^4.8.5" + silent-error "^1.1.1" + +"@ember-data/adapter@3.13.1": + version "3.13.1" + resolved "https://registry.yarnpkg.com/@ember-data/adapter/-/adapter-3.13.1.tgz#2cb9becd3b8ac844e1ae97b408d2c3118a695f5c" + integrity sha512-IpdebSh8B4HlLwkpmpOJUE63U0Q0itI3StsGzZ5i/DIKD6WsMFdux7v8fxRqkW4ZwQDjQdEAtNUUWRILQcWDFw== + dependencies: + "@ember-data/-build-infra" "3.13.1" + "@ember/edition-utils" "^1.1.1" + ember-cli-babel "^7.8.0" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^2.0.2" + +"@ember-data/canary-features@3.13.1": + version "3.13.1" + resolved "https://registry.yarnpkg.com/@ember-data/canary-features/-/canary-features-3.13.1.tgz#c60302d498153fbefe9f1a6d30b9a23d997cbc49" + integrity sha512-zfLpzcTxux5UPA/E0snGJqbM3yPtcQgWcen45Rcj9AcQNsnYiw/r9HV0uTHzRzeyH7lDMplyvLdQedvyk8K88w== + dependencies: + ember-cli-babel "^7.8.0" + +"@ember-data/model@3.13.1": + version "3.13.1" + resolved "https://registry.yarnpkg.com/@ember-data/model/-/model-3.13.1.tgz#6364d5ed3f8997a35d39b5b97a3519b2df63870b" + integrity sha512-lm6AWuBSNp6zMPIjJGN6Dh7u4DJDd8ejOPaS3Cv7r7pgR1ROxRmrjMcgxFdqMY51a/MREj0BfTMWSHKsftcCYA== + dependencies: + "@ember-data/-build-infra" "3.13.1" + "@ember-data/store" "3.13.1" + "@ember/edition-utils" "^1.1.1" + ember-cli-babel "^7.8.0" + ember-cli-string-utils "^1.1.0" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^2.0.2" + ember-compatibility-helpers "^1.2.0" + inflection "1.12.0" + "@ember-data/rfc395-data@^0.0.4": version "0.0.4" resolved "https://registry.yarnpkg.com/@ember-data/rfc395-data/-/rfc395-data-0.0.4.tgz#ecb86efdf5d7733a76ff14ea651a1b0ed1f8a843" integrity sha512-tGRdvgC9/QMQSuSuJV45xoyhI0Pzjm7A9o/MVVA3HakXIImJbbzx/k/6dO9CUEQXIyS2y0fW6C1XaYOG7rY0FQ== +"@ember-data/serializer@3.13.1": + version "3.13.1" + resolved "https://registry.yarnpkg.com/@ember-data/serializer/-/serializer-3.13.1.tgz#0d1f844caa4e98f6f6c7f28341fa6660b7e568c3" + integrity sha512-DhTtsvED0KSLy21zBw5NVnSnaJgLEv5vvLUPN1JQyY47Q+auQXi2JXzgTV8mYdTl4Xbe6GYygC0jyPUA4rM8IA== + dependencies: + "@ember-data/-build-infra" "3.13.1" + "@ember-data/store" "3.13.1" + ember-cli-babel "^7.8.0" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^2.0.2" + +"@ember-data/store@3.13.1": + version "3.13.1" + resolved "https://registry.yarnpkg.com/@ember-data/store/-/store-3.13.1.tgz#e74cad3f5650451f90740b3b3e5f4ed0f6213127" + integrity sha512-7Inhnl3J6yFYE6autfOUPyrNJ63S28OXUM3k4O0pOlvWQbsEPNoELMNPUvjatxRB608qg5Yloh/kVxbdZsM/4w== + dependencies: + "@ember-data/-build-infra" "3.13.1" + "@ember-data/adapter" "3.13.1" + "@ember-data/canary-features" "3.13.1" + ember-cli-babel "^7.8.0" + ember-cli-path-utils "^1.0.0" + ember-cli-typescript "^2.0.2" + heimdalljs "^0.3.0" + +"@ember/edition-utils@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@ember/edition-utils/-/edition-utils-1.1.1.tgz#d5732c3da593f202e6e1ac6dbee56a758242403f" + integrity sha512-GEhri78jdQp/xxPpM6z08KlB0wrHfnfrJ9dmQk7JeQ4XCiMzXsJci7yooQgg/IcTKCM/PxE/IkGCQAo80adMkw== + "@ember/jquery@^0.6.0": version "0.6.1" resolved "https://registry.yarnpkg.com/@ember/jquery/-/jquery-0.6.1.tgz#eef89ebc8d7b49bddc176f2a646746c8f5d93978" @@ -1209,6 +1308,11 @@ dependencies: "@types/estree" "*" +"@types/broccoli-plugin@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@types/broccoli-plugin/-/broccoli-plugin-1.3.0.tgz#38f8462fecaebc4e09a32e4d4ed1b9808f75bbca" + integrity sha512-SLk4/hFc2kGvgwNFrpn2O1juxFOllcHAywvlo7VwxfExLzoz1GGJ0oIZCwj5fwSpvHw4AWpZjJ1fUvb62PDayQ== + "@types/ember@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@types/ember/-/ember-3.1.0.tgz#3c44b846c41a1340bc823910f9222746585b3314" @@ -1371,6 +1475,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-11.9.5.tgz#011eece9d3f839a806b63973e228f85967b79ed3" integrity sha512-vVjM0SVzgaOUpflq4GYBvCpozes8OgIIS5gVXVka+OfK3hvnkC1i93U8WiY2OtNE4XUWyyy/86Kf6e0IHTQw1Q== +"@types/node@^12.7.5": + version "12.7.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.7.tgz#f9bd8c00fa9e1a8129af910fc829f6139c397d6c" + integrity sha512-4jUncNe2tj1nmrO/34PsRpZqYVnRV1svbU78cKhuQKkMntKB/AmdLyGgswcZKjFHEHGpiY8pVD8CuVI55nP54w== + "@types/node@^9.6.0": version "9.6.41" resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.41.tgz#e57c3152eb2e7ec748c733cebd0c095b437c5d37" @@ -1642,6 +1751,11 @@ acorn@^6.0.2: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.2.0.tgz#67f0da2fc339d6cfb5d6fb244fd449f33cd8bbe3" integrity sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw== +acorn@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" + integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== + active-model-adapter@^2.0.3: version "2.2.0" resolved "https://registry.yarnpkg.com/active-model-adapter/-/active-model-adapter-2.2.0.tgz#6885d6968574809f17f398c499b688a921c30f91" @@ -2285,6 +2399,13 @@ babel-plugin-debug-macros@^0.3.0: dependencies: semver "^5.3.0" +babel-plugin-debug-macros@^0.3.2: + version "0.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.3.3.tgz#29c3449d663f61c7385f5b8c72d8015b069a5cb7" + integrity sha512-E+NI8TKpxJDBbVkdWkwHrKgJi696mnRL8XYrOPYw82veNHPDORM9WIQifl6TpIo8PNy2tU2skPqbfkmHXrHKQA== + dependencies: + semver "^5.3.0" + babel-plugin-ember-modules-api-polyfill@^2.12.0, babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-polyfill@^2.8.0: version "2.12.0" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.12.0.tgz#a5e703205ba4e625a7fab9bb1aea64ef3222cf75" @@ -2297,12 +2418,12 @@ babel-plugin-feature-flags@^0.3.1: resolved "https://registry.yarnpkg.com/babel-plugin-feature-flags/-/babel-plugin-feature-flags-0.3.1.tgz#9c827cf9a4eb9a19f725ccb239e85cab02036fc1" integrity sha1-nIJ8+aTrmhn3JcyyOehcqwIDb8E= -babel-plugin-filter-imports@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-2.0.4.tgz#9209b708ed3b228349c4e6f660358bf02685e803" - integrity sha512-Ra4VylqMFsmTJCUeLRJ/OP2ZqO0cCJQK2HKihNTnoKP4f8IhxHKL4EkbmfkwGjXCeDyXd0xQ6UTK8Nd+h9V/SQ== +babel-plugin-filter-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-3.0.0.tgz#a849683837ad29960da17492fb32789ab6b09a11" + integrity sha512-p/chjzVTgCxUqyLM0q/pfWVZS7IJTwGQMwNg0LOvuQpKiTftQgZDtkGB8XvETnUw19rRcL7bJCTopSwibTN2tA== dependencies: - "@babel/types" "^7.1.5" + "@babel/types" "^7.4.0" lodash "^4.17.11" babel-plugin-htmlbars-inline-precompile@^0.2.5: @@ -2694,11 +2815,6 @@ babel6-plugin-strip-class-callcheck@^6.0.0: resolved "https://registry.yarnpkg.com/babel6-plugin-strip-class-callcheck/-/babel6-plugin-strip-class-callcheck-6.0.0.tgz#de841c1abebbd39f78de0affb2c9a52ee228fddf" integrity sha1-3oQcGr6705943gr/ssmlLuIo/d8= -babel6-plugin-strip-heimdall@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/babel6-plugin-strip-heimdall/-/babel6-plugin-strip-heimdall-6.0.1.tgz#35f80eddec1f7fffdc009811dfbd46d9965072b6" - integrity sha1-NfgO3ewff//cAJgR371G2ZZQcrY= - babylon@6.18.0, babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" @@ -3414,6 +3530,16 @@ broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli rimraf "^2.3.4" symlink-or-copy "^1.1.8" +broccoli-plugin@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-2.1.0.tgz#2fab6c578219cfcc64f773e9616073313fc8b334" + integrity sha512-ElE4caljW4slapyEhSD9jU9Uayc8SoSABWdmY9SqbV8DHNxU6xg1jJsPcMm+cXOvggR3+G+OXAYQeFjWVnznaw== + dependencies: + promise-map-series "^0.2.1" + quick-temp "^0.1.3" + rimraf "^2.3.4" + symlink-or-copy "^1.1.8" + broccoli-replace@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/broccoli-replace/-/broccoli-replace-0.12.0.tgz#36460a984c45c61731638c53068b0ab12ea8fdb7" @@ -3440,6 +3566,21 @@ broccoli-rollup@^2.0.0, broccoli-rollup@^2.1.1: symlink-or-copy "^1.1.8" walk-sync "^0.3.1" +broccoli-rollup@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/broccoli-rollup/-/broccoli-rollup-4.1.1.tgz#7531a24d88ddab9f1bace1c6ee6e6ca74a38d36f" + integrity sha512-hkp0dB5chiemi32t6hLe5bJvxuTOm1TU+SryFlZIs95KT9+94uj0C8w6k6CsZ2HuIdIZg6D252t4gwOlcTXrpA== + dependencies: + "@types/broccoli-plugin" "^1.3.0" + broccoli-plugin "^2.0.0" + fs-tree-diff "^2.0.1" + heimdalljs "^0.2.6" + node-modules-path "^1.0.1" + rollup "^1.12.0" + rollup-pluginutils "^2.8.1" + symlink-or-copy "^1.2.0" + walk-sync "^1.1.3" + broccoli-sass-source-maps@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/broccoli-sass-source-maps/-/broccoli-sass-source-maps-4.0.0.tgz#1ee4c10a810b10955b0502e28f85ab672f5961a2" @@ -3854,7 +3995,7 @@ cacheable-request@^2.1.1: normalize-url "2.0.1" responselike "1.0.2" -calculate-cache-key-for-tree@^1.1.0, calculate-cache-key-for-tree@^1.2.0: +calculate-cache-key-for-tree@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-1.2.3.tgz#5a5e4fcfa2d374a63e47fe967593f179e8282825" integrity sha512-PPQorvdNw8K8k7UftCeradwOmKDSDJs8wcqYTtJPEt3fHbZyK8QsorybJA+lOmk0dgE61vX6R+5Kd3W9h4EMGg== @@ -5414,7 +5555,7 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.10.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.0, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.10.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.0, ember-cli-babel@^7.7.3, ember-cli-babel@^7.8.0: version "7.11.1" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.11.1.tgz#77bc8f4001d47b91d80e3d36a4754412616fc0d8" integrity sha512-Qgd7y9NVbRLEtwjBW/vPHXdTQrIgfgoCSFHfvBpEmLuWSWNpE/J6qwXrSbB9nEIlfzyjH0Almv4m0jwuJsB3ow== @@ -5816,13 +5957,13 @@ ember-cli-test-loader@^2.2.0: dependencies: ember-cli-babel "^6.8.1" -ember-cli-typescript@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-2.0.1.tgz#9c46729213b9e1d13f5c3ff8421d772134aa889e" - integrity sha512-xwSEQOUNM621Wt+XJWpbLhBIeqC/dM1lDS+oZQ2nSjxp4MLZkpKuiVBqdbBWcURbvv8ghoVQPfy8wYU4JIFkLA== +ember-cli-typescript@^2.0.0, ember-cli-typescript@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-2.0.2.tgz#464984131fbdc05655eb61d1c3cdd911d3137f0d" + integrity sha512-7I5azCTxOgRDN8aSSnJZIKSqr+MGnT+jLTUbBYqF8wu6ojs2DUnTePxUcQMcvNh3Q3B1ySv7Q/uZFSjdU9gSjA== dependencies: "@babel/plugin-proposal-class-properties" "^7.1.0" - "@babel/plugin-transform-typescript" "^7.1.0" + "@babel/plugin-transform-typescript" "~7.4.0" ansi-to-html "^0.6.6" debug "^4.0.0" ember-cli-babel-plugin-helpers "^1.0.0" @@ -5850,7 +5991,7 @@ ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0, ember-cli-ve resolve "^1.3.3" semver "^5.3.0" -ember-cli-version-checker@^3.0.0, ember-cli-version-checker@^3.0.1, ember-cli-version-checker@^3.1.3: +ember-cli-version-checker@^3.0.0, ember-cli-version-checker@^3.0.1, ember-cli-version-checker@^3.1.2, ember-cli-version-checker@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-3.1.3.tgz#7c9b4f5ff30fdebcd480b1c06c4de43bb51c522c" integrity sha512-PZNSvpzwWgv68hcXxyjREpj3WWb81A7rtYNQq1lLEgrWIchF8ApKJjWP3NBpHjaatwILkZAV8klair5WFlXAKg== @@ -6033,37 +6174,21 @@ ember-copy@^1.0.0: dependencies: ember-cli-babel "^6.6.0" -"ember-data@2.x - 3.x", ember-data@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.10.0.tgz#b5f53a445ba1ee37890ec672b3dc3f869d8b3992" - integrity sha512-QqKJ5/Co2wGBnD5FSUiO1tbhsjjiRS5uJUwD2vRa0suwNv5E9f+5S6Yww6O0B2z5nDRzRheBFZ7iRjbshQhWDg== - dependencies: +"ember-data@2.x - 3.x", ember-data@~3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.13.1.tgz#a6b31703de9feaae19f2a0fccfc72185808174dd" + integrity sha512-1mxmnvwWXjqfjGXwukHhArJvH829pEdWXiOnZXIDLC2K1PfFHkXxBjONlssGRBPI2rS4Oaa2M6/47uAyZ4mkEA== + dependencies: + "@ember-data/-build-infra" "3.13.1" + "@ember-data/adapter" "3.13.1" + "@ember-data/model" "3.13.1" + "@ember-data/serializer" "3.13.1" + "@ember-data/store" "3.13.1" "@ember/ordered-set" "^2.0.3" "@glimmer/env" "^0.1.7" - babel-plugin-feature-flags "^0.3.1" - babel-plugin-filter-imports "^2.0.4" - babel6-plugin-strip-class-callcheck "^6.0.0" - babel6-plugin-strip-heimdall "^6.0.1" - broccoli-debug "^0.6.5" - broccoli-file-creator "^2.1.1" - broccoli-funnel "^2.0.1" - broccoli-merge-trees "^3.0.2" - broccoli-rollup "^2.1.1" - calculate-cache-key-for-tree "^1.2.0" - chalk "^2.4.1" - ember-cli-babel "^7.7.3" - ember-cli-path-utils "^1.0.0" - ember-cli-string-utils "^1.1.0" - ember-cli-test-info "^1.0.0" - ember-cli-typescript "^2.0.0" - ember-cli-version-checker "^3.1.3" - ember-inflector "^3.0.0" - git-repo-info "^2.0.0" - heimdalljs "^0.3.0" - inflection "^1.12.0" - npm-git-info "^1.0.3" - resolve "^1.8.1" - silent-error "^1.1.1" + ember-cli-babel "^7.8.0" + ember-cli-typescript "^2.0.2" + ember-inflector "^3.0.1" ember-disable-prototype-extensions@^1.1.3: version "1.1.3" @@ -6147,7 +6272,7 @@ ember-inflector@^2.0.0: dependencies: ember-cli-babel "^6.0.0" -"ember-inflector@^2.0.0 || ^3.0.0", ember-inflector@^3.0.0: +"ember-inflector@^2.0.0 || ^3.0.0", ember-inflector@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-3.0.1.tgz#04be6df4d7e4000f6d6bd70787cdc995f77be4ab" integrity sha512-fngrwMsnhkBt51KZgwNwQYxgURwV4lxtoHdjxf7RueGZ5zM7frJLevhHw7pbQNGqXZ3N+MRkhfNOLkdDK9kFdA== @@ -6791,6 +6916,11 @@ estree-walker@^0.5.0, estree-walker@^0.5.2: resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.2.tgz#d3850be7529c9580d815600b53126515e146dd39" integrity sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig== +estree-walker@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" + integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== + esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -7653,7 +7783,7 @@ fs-tree-diff@^1.0.0: path-posix "^1.0.0" symlink-or-copy "^1.1.8" -fs-tree-diff@^2.0.0: +fs-tree-diff@^2.0.0, fs-tree-diff@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-2.0.1.tgz#343e4745ab435ec39ebac5f9059ad919cd034afa" integrity sha512-x+CfAZ/lJHQqwlD64pYM5QxWjzWhSjroaVsr8PW831zOApL55qPibed0c+xebaLWVr2BnHFoHdrwOv8pzt8R5A== @@ -7923,6 +8053,18 @@ glob@^7.0.3, glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -8507,7 +8649,7 @@ inflected@^2.0.3, inflected@^2.0.4: resolved "https://registry.yarnpkg.com/inflected/-/inflected-2.0.4.tgz#323770961ccbe992a98ea930512e9a82d3d3ef77" integrity sha512-HQPzFLTTUvwfeUH6RAGjD8cHS069mBqXG5n4qaxX7sJXBhVQrsGgF+0ZJGkSuN6a8pcUWB/GXStta11kKi/WvA== -inflection@^1.12.0: +inflection@1.12.0, inflection@^1.12.0: version "1.12.0" resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" integrity sha1-ogCTVlbW9fa8TcdQLhrstwMihBY= @@ -12671,6 +12813,13 @@ rollup-pluginutils@^2.0.1: estree-walker "^0.5.2" micromatch "^2.3.11" +rollup-pluginutils@^2.8.1: + version "2.8.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" + integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== + dependencies: + estree-walker "^0.6.1" + rollup@^0.57.1: version "0.57.1" resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.57.1.tgz#0bb28be6151d253f67cf4a00fea48fb823c74027" @@ -12688,6 +12837,15 @@ rollup@^0.57.1: signal-exit "^3.0.2" sourcemap-codec "^1.4.1" +rollup@^1.12.0: + version "1.21.4" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.21.4.tgz#00a41a30f90095db890301b226cbe2918e4cf54d" + integrity sha512-Pl512XVCmVzgcBz5h/3Li4oTaoDcmpuFZ+kdhS/wLreALz//WuDAMfomD3QEYl84NkDu6Z6wV9twlcREb4qQsw== + dependencies: + "@types/estree" "0.0.39" + "@types/node" "^12.7.5" + acorn "^7.0.0" + route-recognizer@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.3.tgz#1d365e27fa6995e091675f7dc940a8c00353bd29" From dde43e5fe13cfc5b227bab1b5299167616f3f8c5 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 26 Sep 2019 09:45:36 -0400 Subject: [PATCH 549/879] Bump miragejs, delete some old tests (#1768) --- package.json | 2 +- tests/unit/server-test.js | 32 +------------------------------- yarn.lock | 26 ++++++++++---------------- 3 files changed, 12 insertions(+), 48 deletions(-) diff --git a/package.json b/package.json index 730640dd3..4991dfa29 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "prepare": "./scripts/link.sh" }, "dependencies": { - "@miragejs/server": "0.1.23", + "@miragejs/server": "0.1.27", "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^2.0.1", "broccoli-merge-trees": "^3.0.2", diff --git a/tests/unit/server-test.js b/tests/unit/server-test.js index 775f84fae..a871f4634 100644 --- a/tests/unit/server-test.js +++ b/tests/unit/server-test.js @@ -1,4 +1,4 @@ -import Server, { defaultPassthroughs } from 'ember-cli-mirage/server'; +import Server from 'ember-cli-mirage/server'; import {module, test} from 'qunit'; import { Model, Factory, belongsTo, hasMany, trait, association } from 'ember-cli-mirage'; @@ -1286,33 +1286,3 @@ module('Unit | Server #buildList', function(hooks) { }, /second argument has to be an integer, you passed: string/); }); }); - -module('Unit | Server #defaultPassthroughs', function() { - test('server configures default passthroughs when useDefaultPassthroughs is true', function(assert) { - let server = new Server({ useDefaultPassthroughs: true }); - - assert.expect(defaultPassthroughs.length); - defaultPassthroughs.forEach((passthroughUrl) => { - let passthroughRequest = { method: 'GET', url: passthroughUrl }; - let isPassedThrough = server.pretender.checkPassthrough(passthroughRequest); - - assert.ok(isPassedThrough); - }); - - server.shutdown(); - }); - - test('server does not configure default passthroughs when useDefaultPassthroughs is false', function(assert) { - let server = new Server({ useDefaultPassthroughs: false }); - - assert.expect(defaultPassthroughs.length); - defaultPassthroughs.forEach((passthroughUrl) => { - let passthroughRequest = { method: 'GET', url: passthroughUrl }; - let isPassedThrough = server.pretender.checkPassthrough(passthroughRequest); - - assert.ok(!isPassedThrough); - }); - - server.shutdown(); - }); -}); diff --git a/yarn.lock b/yarn.lock index 55d688c9e..44d0168f1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1234,11 +1234,17 @@ dependencies: core-js "^2.5.7" -"@miragejs/server@0.1.23": - version "0.1.23" - resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.23.tgz#10e7c1865b9fc4b1c4b8ae5f9ee58509efb37519" - integrity sha512-WgcuN4fjWDzqGo/f9f1G1df0JbCUS4ulOGHaWYgrhvDTMq7LDbn1g31xO30IWdZ4USxiLR79CskXg6DuqZlXAw== +"@miragejs/pretender-node-polyfill@^0.1.0": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@miragejs/pretender-node-polyfill/-/pretender-node-polyfill-0.1.2.tgz#d26b6b7483fb70cd62189d05c95d2f67153e43f2" + integrity sha512-M/BexG/p05C5lFfMunxo/QcgIJnMT2vDVCd00wNqK2ImZONIlEETZwWJu1QtLxtmYlSHlCFl3JNzp0tLe7OJ5g== + +"@miragejs/server@0.1.27": + version "0.1.27" + resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.27.tgz#a4e850b28e384a7d92715a538b54074e38e9a931" + integrity sha512-UuhoUFwlZ8Y1lnmQfoNU2EmMmHq5cgbI15GN61nopfUN2KbPX4ZpuCzINcQa1WOlsFBoQzBgzqbacXxjmmT8kg== dependencies: + "@miragejs/pretender-node-polyfill" "^0.1.0" inflected "^2.0.4" lodash.assign "^4.2.0" lodash.camelcase "^4.3.0" @@ -8053,18 +8059,6 @@ glob@^7.0.3, glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.4: - version "7.1.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" From 3ac2de391972d80714ea4675887ba83f943e590a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2019 09:46:10 -0400 Subject: [PATCH 550/879] build(deps-dev): bump ember-source from 3.12.0 to 3.13.2 (#1771) Bumps [ember-source](https://github.com/emberjs/ember.js) from 3.12.0 to 3.13.2. - [Release notes](https://github.com/emberjs/ember.js/releases) - [Changelog](https://github.com/emberjs/ember.js/blob/v3.13.2/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember.js/compare/v3.12.0...v3.13.2) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 72 ++++++++++++++++++---------------------------------- 2 files changed, 26 insertions(+), 48 deletions(-) diff --git a/package.json b/package.json index 4991dfa29..daafd7cb1 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "ember-maybe-import-regenerator-for-testing": "^1.0.0", "ember-moment": "^7.8.1", "ember-resolver": "^5.0.1", - "ember-source": "~3.12.0", + "ember-source": "~3.13.2", "ember-source-channel-url": "^2.0.1", "ember-try": "^1.0.0", "escape-string-regexp": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index 44d0168f1..f570acdb1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -413,15 +413,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-block-scoping@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.2.0.tgz#f17c49d91eedbcdf5dd50597d16f5f2f770132d4" - integrity sha512-vDTgf19ZEV6mx35yiPJe4fS02mPQUUcBNwWQSZFXSzTSbsJFQvHt7DqyS3LK8oOWALFOsJ+8bbqBgkirZteD5Q== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - lodash "^4.17.10" - -"@babel/plugin-transform-block-scoping@^7.5.5": +"@babel/plugin-transform-block-scoping@^7.2.0", "@babel/plugin-transform-block-scoping@^7.4.4", "@babel/plugin-transform-block-scoping@^7.5.5": version "7.6.2" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.2.tgz#96c33ab97a9ae500cc6f5b19e04a7e6553360a79" integrity sha512-zZT8ivau9LOQQaOGC7bQLQOT4XPkPXgN2ERfUgk1X8ql+mVkLc4E8eKk+FO3o0154kxzqenWCorfmEXpEZcrSQ== @@ -543,6 +535,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-object-assign@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.2.0.tgz#6fdeea42be17040f119e38e23ea0f49f31968bde" + integrity sha512-nmE55cZBPFgUktbF2OuoZgPRadfxosLOpSgzEPYotKSls9J4pEPcembi8r78RU37Rph6UApCpNmsQA4QMWK9Ng== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-object-super@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" @@ -2073,11 +2072,6 @@ ast-types@0.13.2: resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.2.tgz#df39b677a911a83f3a049644fb74fdded23cea48" integrity sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA== -ast-types@0.9.6: - version "0.9.6" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" - integrity sha1-ECyenpAF0+fjgpvwxPok7oYu6bk= - astral-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" @@ -2398,14 +2392,7 @@ babel-plugin-debug-macros@^0.2.0, babel-plugin-debug-macros@^0.2.0-beta.6: dependencies: semver "^5.3.0" -babel-plugin-debug-macros@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.3.0.tgz#7a025944faef0777804ef3518c54e8b040197397" - integrity sha512-D6qYBI/3+FvcKVnRnH6FBUwXPp/5o/jnJNVFKqVaZpYAWx88+R8jNNyaEX7iQFs7UfCib6rcY/9+ICR4jhjFCQ== - dependencies: - semver "^5.3.0" - -babel-plugin-debug-macros@^0.3.2: +babel-plugin-debug-macros@^0.3.0, babel-plugin-debug-macros@^0.3.2, babel-plugin-debug-macros@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.3.3.tgz#29c3449d663f61c7385f5b8c72d8015b069a5cb7" integrity sha512-E+NI8TKpxJDBbVkdWkwHrKgJi696mnRL8XYrOPYw82veNHPDORM9WIQifl6TpIo8PNy2tU2skPqbfkmHXrHKQA== @@ -6388,13 +6375,6 @@ ember-rfc176-data@^0.3.12: resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.12.tgz#90d82878e69e2ac9a5438e8ce14d12c6031c5bd2" integrity sha512-g9HeZj/gU5bfIIrGXkP7MhS2b3Vu5DfNUrYr14hy99TgIvtZETO+96QF4WOEUXGjIJdfTRjerVnQlqngPQSv1g== -ember-router-generator@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-1.2.3.tgz#8ed2ca86ff323363120fc14278191e9e8f1315ee" - integrity sha1-jtLKhv8yM2MSD8FCeBkeno8TFe4= - dependencies: - recast "^0.11.3" - ember-router-generator@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-2.0.0.tgz#d04abfed4ba8b42d166477bbce47fccc672dbde0" @@ -6434,11 +6414,18 @@ ember-source-channel-url@^2.0.1: dependencies: got "^8.0.1" -ember-source@~3.12.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.12.0.tgz#92f72894836d4497e704901c1d061c61b066bddf" - integrity sha512-4iA2BgYmNLWysifLyt2LCQgU9ux/NiTR/MT7KTt9HUyTDJyivcdyKNtfrUQst/1InUvn+MxuQ0ZsbQICJkX6yA== +ember-source@~3.13.2: + version "3.13.2" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.13.2.tgz#872a583935ce5827518d8b9c23f81475a8f5dbda" + integrity sha512-VBzLziCCdRW4K9YljxL+bGxAG1aaozENaaIDrqmg79OidM6SeTNDEY+y9m2V2YFUGyFkwtqOK1IzcM4GYnnL+w== dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.4.4" + "@babel/plugin-transform-object-assign" "^7.2.0" + "@ember/edition-utils" "^1.1.1" + babel-plugin-debug-macros "^0.3.3" + babel-plugin-filter-imports "^3.0.0" + broccoli-concat "^3.7.3" broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.2" chalk "^2.4.2" @@ -6449,10 +6436,11 @@ ember-source@~3.12.0: ember-cli-path-utils "^1.0.0" ember-cli-string-utils "^1.1.0" ember-cli-version-checker "^3.1.3" - ember-router-generator "^1.2.3" + ember-router-generator "^2.0.0" inflection "^1.12.0" jquery "^3.4.1" resolve "^1.11.1" + silent-error "^1.1.1" ember-svg-jar@^2.1.0: version "2.2.1" @@ -6877,7 +6865,7 @@ espree@^5.0.1: acorn-jsx "^5.0.0" eslint-visitor-keys "^1.0.0" -esprima@^3.1.3, esprima@~3.1.0: +esprima@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= @@ -11960,7 +11948,7 @@ printf@^0.5.1: resolved "https://registry.yarnpkg.com/printf/-/printf-0.5.1.tgz#e0466788260859ed153006dc6867f09ddf240cf3" integrity sha512-UaE/jO0hNsrvPGQEb4LyNzcrJv9Z00tsreBduOSxMtrebvoUhxiEJ4YCHX8YHf6akwfKsC2Gyv5zv47UXhMiLg== -private@^0.1.6, private@^0.1.8, private@~0.1.5: +private@^0.1.6, private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== @@ -12354,16 +12342,6 @@ readdirp@^3.1.1: dependencies: picomatch "^2.0.4" -recast@^0.11.3: - version "0.11.23" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" - integrity sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM= - dependencies: - ast-types "0.9.6" - esprima "~3.1.0" - private "~0.1.5" - source-map "~0.5.0" - recast@^0.18.1: version "0.18.2" resolved "https://registry.yarnpkg.com/recast/-/recast-0.18.2.tgz#ada263677edc70c45408caf20e6ae990958fdea8" @@ -13364,7 +13342,7 @@ source-map@0.4.x, source-map@^0.4.2: dependencies: amdefine ">=0.0.4" -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0: +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= From e01a11c1e1df5cb97ca6614c2b15fa49237fa149 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 26 Sep 2019 09:47:17 -0400 Subject: [PATCH 551/879] v1.1.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index daafd7cb1..afdd81f2c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "1.1.1", + "version": "1.1.2", "description": "A client-side server to help you build, test and demo your Ember app", "keywords": [ "ember-addon", From 64244577156d370645351b215d4f92c59ef5a830 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2019 14:33:30 +0000 Subject: [PATCH 552/879] build(deps): bump ember-cli-babel from 7.11.1 to 7.12.0 Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 7.11.1 to 7.12.0. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v7.11.1...v7.12.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index f570acdb1..3da2c85cd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5549,9 +5549,9 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be semver "^5.5.0" ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.10.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.0, ember-cli-babel@^7.7.3, ember-cli-babel@^7.8.0: - version "7.11.1" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.11.1.tgz#77bc8f4001d47b91d80e3d36a4754412616fc0d8" - integrity sha512-Qgd7y9NVbRLEtwjBW/vPHXdTQrIgfgoCSFHfvBpEmLuWSWNpE/J6qwXrSbB9nEIlfzyjH0Almv4m0jwuJsB3ow== + version "7.12.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.12.0.tgz#064997d199384be8c88d251f30ef67953d3bddc5" + integrity sha512-+EGQsbPvh19nNXHCm6rVBx2CdlxQlzxMyhey5hsGViDPriDI4PFYXYaFWdGizDrmZoDcG/Ywpeph3hl0NxGQTg== dependencies: "@babel/core" "^7.0.0" "@babel/plugin-proposal-class-properties" "^7.3.4" From e6ec9ba8be35e6cff0e549bc4502f392e3faf925 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 2 Oct 2019 12:57:17 +0000 Subject: [PATCH 553/879] build(deps-dev): bump ember-cli-htmlbars-inline-precompile Bumps [ember-cli-htmlbars-inline-precompile](https://github.com/ember-cli/ember-cli-htmlbars-inline-precompile) from 3.0.0 to 3.0.1. - [Release notes](https://github.com/ember-cli/ember-cli-htmlbars-inline-precompile/releases) - [Changelog](https://github.com/ember-cli/ember-cli-htmlbars-inline-precompile/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-cli-htmlbars-inline-precompile/compare/v3.0.0...v3.0.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3da2c85cd..3d984d98d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2429,10 +2429,10 @@ babel-plugin-htmlbars-inline-precompile@^1.0.0: resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-1.0.0.tgz#a9d2f6eaad8a3f3d361602de593a8cbef8179c22" integrity sha512-4jvKEHR1bAX03hBDZ94IXsYCj3bwk9vYsn6ux6JZNL2U5pvzCWjqyrGahfsGNrhERyxw8IqcirOi9Q6WCo3dkQ== -babel-plugin-htmlbars-inline-precompile@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-2.0.0.tgz#e08e0107468637f93625d159d3670dc19cf55e4f" - integrity sha512-08vtZNHseQ+uxN5DxK0ca1Qs1MWqzieuWF+pYkEzFohF+WxVNLiM1FN6ss5YP3BrigE68sI/yFrbJlO0bSb1XA== +babel-plugin-htmlbars-inline-precompile@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-2.1.1.tgz#59edd4eab28d27fbafa26d51bc19795278d103a9" + integrity sha512-obo5//IFrEZNAQovcXxOXLn5nwkQ0Y+xhR7AMg1sYR6W7KxQLZI9/XzbIytVhjwwY+Bd2e0+qyHEplJbHyZ1Og== babel-plugin-module-resolver@^3.1.1: version "3.1.1" @@ -5749,14 +5749,15 @@ ember-cli-htmlbars-inline-precompile@^2.1.0: silent-error "^1.1.0" ember-cli-htmlbars-inline-precompile@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-3.0.0.tgz#df67c7c3e69406063d57d3d9b7a27812bb2835de" - integrity sha512-OI/xDQkYm+uo0rbMAtRFWwuYv+MKekyzDac4xm42kWKNVClCABL56U7X7Z18BEWXhp5twYVbc3PSnjwA/eZN3w== + version "3.0.1" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-3.0.1.tgz#dc1f6fbc3bb5e51d01ca334e692c7f0b5e298d57" + integrity sha512-mLGJjxEPiOFty9HVM7LHg+5cfM1M9lwbEBmlanZMM333cnwvgZulKjTYU0/e0tpWDvNvPdX8rM+/Leh0TIrqqA== dependencies: - babel-plugin-htmlbars-inline-precompile "^2.0.0" + babel-plugin-htmlbars-inline-precompile "^2.1.0" ember-cli-version-checker "^3.1.3" hash-for-dep "^1.5.1" heimdalljs-logger "^0.1.9" + semver "^6.3.0" silent-error "^1.1.0" ember-cli-htmlbars@^2.0.1, ember-cli-htmlbars@^2.0.2: @@ -13002,10 +13003,10 @@ semver@^4.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= -semver@^6.0.0, semver@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.0.tgz#e95dc415d45ecf03f2f9f83b264a6b11f49c0cca" - integrity sha512-kCqEOOHoBcFs/2Ccuk4Xarm/KiWRSLEX9CAZF8xkJ6ZPlIoTZ8V5f7J16vYLJqDbR7KrxTJpR2lqjIEm2Qx9cQ== +semver@^6.0.0, semver@^6.1.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== send@0.16.1: version "0.16.1" From 7c36f4ca68d86718572f0f471a4b755a639d87f3 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 5 Oct 2019 15:13:31 -0700 Subject: [PATCH 554/879] build(deps): bump @miragejs/server from 0.1.27 to 0.1.28 (#1779) Bumps [@miragejs/server](https://github.com/miragejs/server) from 0.1.27 to 0.1.28. - [Release notes](https://github.com/miragejs/server/releases) - [Changelog](https://github.com/miragejs/server/blob/master/CHANGELOG.md) - [Commits](https://github.com/miragejs/server/compare/v0.1.27...v0.1.28) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index afdd81f2c..a0285976b 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "prepare": "./scripts/link.sh" }, "dependencies": { - "@miragejs/server": "0.1.27", + "@miragejs/server": "0.1.28", "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^2.0.1", "broccoli-merge-trees": "^3.0.2", diff --git a/yarn.lock b/yarn.lock index 3d984d98d..d466b677e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1238,10 +1238,10 @@ resolved "https://registry.yarnpkg.com/@miragejs/pretender-node-polyfill/-/pretender-node-polyfill-0.1.2.tgz#d26b6b7483fb70cd62189d05c95d2f67153e43f2" integrity sha512-M/BexG/p05C5lFfMunxo/QcgIJnMT2vDVCd00wNqK2ImZONIlEETZwWJu1QtLxtmYlSHlCFl3JNzp0tLe7OJ5g== -"@miragejs/server@0.1.27": - version "0.1.27" - resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.27.tgz#a4e850b28e384a7d92715a538b54074e38e9a931" - integrity sha512-UuhoUFwlZ8Y1lnmQfoNU2EmMmHq5cgbI15GN61nopfUN2KbPX4ZpuCzINcQa1WOlsFBoQzBgzqbacXxjmmT8kg== +"@miragejs/server@0.1.28": + version "0.1.28" + resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.28.tgz#5f7e9780ac518feba5f5c3e81361eb376609bddc" + integrity sha512-Ohg7FlOyn/1E28Y5cIfda0cw1t61gKIlm6TSMv+1mAA3fFWAHEUX+BBkQTAF5dyviovwpUZwAEVANnBay4BQDg== dependencies: "@miragejs/pretender-node-polyfill" "^0.1.0" inflected "^2.0.4" From 0f2926d0c0248113c374b8784dc95be6a304d2ff Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 5 Oct 2019 18:32:27 -0700 Subject: [PATCH 555/879] build(deps-dev): bump ember-moment from 7.8.1 to 8.0.0 (#1729) Bumps [ember-moment](https://github.com/stefanpenner/ember-moment) from 7.8.1 to 8.0.0. - [Release notes](https://github.com/stefanpenner/ember-moment/releases) - [Changelog](https://github.com/stefanpenner/ember-moment/blob/master/CHANGELOG.md) - [Commits](https://github.com/stefanpenner/ember-moment/compare/v7.8.1...v8.0.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 34 ++++++++++++---------------------- 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index a0285976b..8e4fc060a 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "ember-export-application-global": "^2.0.0", "ember-load-initializers": "^2.0.0", "ember-maybe-import-regenerator-for-testing": "^1.0.0", - "ember-moment": "^7.8.1", + "ember-moment": "^8.0.0", "ember-resolver": "^5.0.1", "ember-source": "~3.13.2", "ember-source-channel-url": "^2.0.1", diff --git a/yarn.lock b/yarn.lock index d466b677e..a0803df28 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3827,7 +3827,7 @@ browserslist@^2.11.3: caniuse-lite "^1.0.30000792" electron-to-chromium "^1.3.30" -browserslist@^3.1.1, browserslist@^3.2.6: +browserslist@^3.2.6: version "3.2.8" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== @@ -5548,7 +5548,7 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.10.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.0, ember-cli-babel@^7.7.3, ember-cli-babel@^7.8.0: +ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.10.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.0, ember-cli-babel@^7.7.3, ember-cli-babel@^7.8.0: version "7.12.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.12.0.tgz#064997d199384be8c88d251f30ef67953d3bddc5" integrity sha512-+EGQsbPvh19nNXHCm6rVBx2CdlxQlzxMyhey5hsGViDPriDI4PFYXYaFWdGizDrmZoDcG/Ywpeph3hl0NxGQTg== @@ -6289,15 +6289,14 @@ ember-load-initializers@^2.0.0: ember-cli-babel "^7.10.0" ember-cli-typescript "^2.0.0" -ember-macro-helpers@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ember-macro-helpers/-/ember-macro-helpers-2.1.0.tgz#e8eeff5704da4d2d071cc6446cd29c3b9b4c0f6d" - integrity sha512-VmXIXUhbMWNqtpQr81EC9Ud/1/rR8+ggiteThapxenD4OssJs7gn5i/ZJU4RopODma69/rfJTmaSlOC+/OxRSg== +ember-macro-helpers@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/ember-macro-helpers/-/ember-macro-helpers-4.2.2.tgz#dfb28b2b21f9fd49ade599f68c99e73ce5692cdc" + integrity sha512-E46MnpjMu+ZXRw/5A1tADZKFJADGpSAcsclcaBNfV/B1aRPV3PTTnCpDvYC1wfJ4kwwUh0DRLDH/OpBv+/41pQ== dependencies: - ember-cli-babel "^7.0.0" + ember-cli-babel "^7.7.3" ember-cli-string-utils "^1.1.0" ember-cli-test-info "^1.0.0" - ember-weakmap "^3.0.0" ember-maybe-import-regenerator-for-testing@^1.0.0: version "1.0.0" @@ -6329,14 +6328,14 @@ ember-modal-dialog@^3.0.0-beta.4: ember-ignore-children-helper "^1.0.1" ember-wormhole "^0.5.5" -ember-moment@^7.8.1: - version "7.8.1" - resolved "https://registry.yarnpkg.com/ember-moment/-/ember-moment-7.8.1.tgz#6f77cf941d1a92e231b2f4b810e113b2fae50c5f" - integrity sha512-qEMWvJYOGGgyusUE9b+2wU7uWUG8aHkzdE6NBtGjaX5NU8SeByQkH8RkA+QKZonWQH3JncdbG6UBqRO1Ng3DYA== +ember-moment@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/ember-moment/-/ember-moment-8.0.0.tgz#f3993711df0af444558f0f3922dc3f412af72410" + integrity sha512-JbwmTiS75EEXFWGR5P8rXykISpDf6EH8L8IpxsF6FaRwJ/4odXV/yf8cKh6gpzxoags9OJ8qxyQqG0Prhgs9Sg== dependencies: ember-cli-babel "^6.7.2" ember-getowner-polyfill "^2.2.0" - ember-macro-helpers "^2.1.0" + ember-macro-helpers "^4.2.2" ember-qunit@^3.5.0: version "3.5.3" @@ -6510,15 +6509,6 @@ ember-try@^1.0.0: rsvp "^4.7.0" walk-sync "^1.1.3" -ember-weakmap@^3.0.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/ember-weakmap/-/ember-weakmap-3.3.1.tgz#5188b035f5bfb17397067ea635300ae4e1205e11" - integrity sha512-pClKGFyByX03R2Y9ZogXHWXreeHzFZcuZj8EOOqj7fVYx0QDNiXBWo+jGhTl/pINlvjw4Z6fMFHlItrq1tZFxA== - dependencies: - browserslist "^3.1.1" - debug "^3.1.0" - ember-cli-babel "^6.6.0" - ember-wormhole@^0.5.5: version "0.5.5" resolved "https://registry.yarnpkg.com/ember-wormhole/-/ember-wormhole-0.5.5.tgz#db417ff748cb21e574cd5f233889897bc27096cb" From 043af083573bedd1981d8a19c4dcc08215abde07 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 6 Oct 2019 09:51:47 -0700 Subject: [PATCH 556/879] build(deps-dev): bump ember-cli-htmlbars from 3.1.0 to 4.0.5 (#1780) Bumps [ember-cli-htmlbars](https://github.com/ember-cli/ember-cli-htmlbars) from 3.1.0 to 4.0.5. - [Release notes](https://github.com/ember-cli/ember-cli-htmlbars/releases) - [Changelog](https://github.com/ember-cli/ember-cli-htmlbars/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-cli-htmlbars/compare/v3.1.0...v4.0.5) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 73 +++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 67 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 8e4fc060a..e7193d8e4 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "ember-cli-eslint": "^5.1.0", "ember-cli-fastboot": "^2.0.4", "ember-cli-favicon": "^2.0.0", - "ember-cli-htmlbars": "^3.0.0", + "ember-cli-htmlbars": "^4.0.5", "ember-cli-htmlbars-inline-precompile": "^3.0.0", "ember-cli-inject-live-reload": "^2.0.1", "ember-cli-moment-shim": "^3.7.1", diff --git a/yarn.lock b/yarn.lock index a0803df28..5c924419d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2434,6 +2434,11 @@ babel-plugin-htmlbars-inline-precompile@^2.1.0: resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-2.1.1.tgz#59edd4eab28d27fbafa26d51bc19795278d103a9" integrity sha512-obo5//IFrEZNAQovcXxOXLn5nwkQ0Y+xhR7AMg1sYR6W7KxQLZI9/XzbIytVhjwwY+Bd2e0+qyHEplJbHyZ1Og== +babel-plugin-htmlbars-inline-precompile@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-3.0.0.tgz#95aa0d2379347cda9a7127c028fe35cb39179fa2" + integrity sha512-dR12lOqIcBLOTwgnI5iG+bSrZhR8JIZ7zAHW43YhcD5q8G8iipvSuRo8Fah6NPPh6C8cATd827bgPikphbF09w== + babel-plugin-module-resolver@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.1.1.tgz#881cf67e3d4b8400d5eaaefc1be44d2dc1fe404f" @@ -3459,6 +3464,11 @@ broccoli-module-unification-reexporter@^1.0.0: mkdirp "^0.5.1" walk-sync "^0.3.2" +broccoli-node-api@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/broccoli-node-api/-/broccoli-node-api-1.7.0.tgz#391aa6edecd2a42c63c111b4162956b2fa288cb6" + integrity sha512-QIqLSVJWJUVOhclmkmypJJH9u9s/aWH4+FH6Q6Ju5l+Io4dtwqdPUNmDfw40o6sxhbZHhqGujDJuHTML1wG8Yw== + broccoli-node-info@1.1.0, broccoli-node-info@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-1.1.0.tgz#3aa2e31e07e5bdb516dd25214f7c45ba1c459412" @@ -3533,6 +3543,17 @@ broccoli-plugin@^2.0.0: rimraf "^2.3.4" symlink-or-copy "^1.1.8" +broccoli-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-3.0.0.tgz#516f2b550ffa2bb111bf54c1afb4bd0b2f02065b" + integrity sha512-aEtobBvzAlUIAaY5z+LwW2W3IJ9pruJtrT571CyfjoDFTGa8LZx0qjQG97Z7Guk5YzuxDoDNlM3hGsgBnnReTw== + dependencies: + broccoli-node-api "^1.6.0" + promise-map-series "^0.2.1" + quick-temp "^0.1.3" + rimraf "^2.3.4" + symlink-or-copy "^1.1.8" + broccoli-replace@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/broccoli-replace/-/broccoli-replace-0.12.0.tgz#36460a984c45c61731638c53068b0ab12ea8fdb7" @@ -4519,12 +4540,10 @@ comment-regex@^1.0.0: resolved "https://registry.yarnpkg.com/comment-regex/-/comment-regex-1.0.1.tgz#e070d2c4db33231955d0979d27c918fcb6f93565" integrity sha512-IWlN//Yfby92tOIje7J18HkNmWRR7JESA/BK8W7wqY/akITpU5B0JQWnbTjCfdChSrDNb0DrdA9jfAxiiBXyiQ== -common-tags@^1.4.0: - version "1.7.2" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.7.2.tgz#24d9768c63d253a56ecff93845b44b4df1d52771" - integrity sha512-joj9ZlUOjCrwdbmiLqafeUSgkUM74NqhLsZtSqDmhKudaIY197zTrb8JMl31fMnCUuxwFT23eC/oWvrZzDLRJQ== - dependencies: - babel-runtime "^6.26.0" +common-tags@^1.4.0, common-tags@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== commondir@^1.0.1: version "1.0.1" @@ -5780,6 +5799,27 @@ ember-cli-htmlbars@^3.0.0, ember-cli-htmlbars@^3.0.1: json-stable-stringify "^1.0.1" strip-bom "^3.0.0" +ember-cli-htmlbars@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.0.5.tgz#0ad521831c2d740502ffd9b0bd28d2d799752f63" + integrity sha512-/zJKzP7RVNnnlYwtliyLsr174wBLcFMJUIOvy0mGnb+optwDJpgCdMzSYEjy/myoXDWgS/6cpLVLneFZ4tYm9Q== + dependencies: + "@ember/edition-utils" "^1.1.1" + babel-plugin-htmlbars-inline-precompile "^3.0.0" + broccoli-debug "^0.6.5" + broccoli-persistent-filter "^2.3.1" + broccoli-plugin "^3.0.0" + common-tags "^1.8.0" + ember-cli-babel-plugin-helpers "^1.1.0" + fs-copy-file-sync "^1.1.1" + hash-for-dep "^1.5.1" + heimdalljs-logger "^0.1.10" + json-stable-stringify "^1.0.1" + mkdirp "^0.5.1" + semver "^6.3.0" + strip-bom "^4.0.0" + walk-sync "^2.0.2" + ember-cli-import-polyfill@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/ember-cli-import-polyfill/-/ember-cli-import-polyfill-0.2.0.tgz#c1a08a8affb45c97b675926272fe78cf4ca166f2" @@ -7670,6 +7710,11 @@ from2@^2.1.0, from2@^2.1.1: inherits "^2.0.1" readable-stream "^2.0.0" +fs-copy-file-sync@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fs-copy-file-sync/-/fs-copy-file-sync-1.1.1.tgz#11bf32c096c10d126e5f6b36d06eece776062918" + integrity sha512-2QY5eeqVv4m2PfyMiEuy9adxNP+ajf+8AR05cEi+OAzPcOj90hvFImeZhTmKLBgSd9EvG33jsD7ZRxsx9dThkQ== + fs-exists-sync@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" @@ -8342,7 +8387,7 @@ heimdalljs-graph@^0.3.4: resolved "https://registry.yarnpkg.com/heimdalljs-graph/-/heimdalljs-graph-0.3.5.tgz#420fbbc8fc3aec5963ddbbf1a5fb47921c4a5927" integrity sha512-szOy9WZUc7eUInEBQEsoa1G2d+oYHrn6ndZPf76eh8A9ID1zWUCEEsxP3F+CvQx9+EDrg1srdyLUmfVAr8EB4g== -heimdalljs-logger@^0.1.7, heimdalljs-logger@^0.1.9, heimdalljs-logger@~0.1.10: +heimdalljs-logger@^0.1.10, heimdalljs-logger@^0.1.7, heimdalljs-logger@^0.1.9, heimdalljs-logger@~0.1.10: version "0.1.10" resolved "https://registry.yarnpkg.com/heimdalljs-logger/-/heimdalljs-logger-0.1.10.tgz#90cad58aabb1590a3c7e640ddc6a4cd3a43faaf7" integrity sha512-pO++cJbhIufVI/fmB/u2Yty3KJD0TqNPecehFae0/eps0hkZ3b4Zc/PezUMOpYuHFQbA7FxHZxa305EhmjLj4g== @@ -13656,6 +13701,11 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -14605,6 +14655,15 @@ walk-sync@^1.0.0, walk-sync@^1.0.1, walk-sync@^1.1.3: ensure-posix-path "^1.1.0" matcher-collection "^1.1.1" +walk-sync@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-2.0.2.tgz#5ea8a28377c8be68c92d50f4007ea381725da14b" + integrity sha512-dCZkrxfHjPn7tIvdYrX3uMD/R0beVrHpA8lROQ5wWrl8psJgR6xwCkwqTFes0dNujbS2o/ITpvSYgIFsLsf13A== + dependencies: + "@types/minimatch" "^3.0.3" + ensure-posix-path "^1.1.0" + matcher-collection "^2.0.0" + walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" From 232051ecb9e7b9047ff40c3a50519db10ca84565 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 6 Oct 2019 09:52:07 -0700 Subject: [PATCH 557/879] build(deps-dev): bump @ember/jquery from 0.6.1 to 1.1.0 (#1778) Bumps [@ember/jquery](https://github.com/emberjs/ember-jquery) from 0.6.1 to 1.1.0. - [Release notes](https://github.com/emberjs/ember-jquery/releases) - [Changelog](https://github.com/emberjs/ember-jquery/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember-jquery/compare/v0.6.1...v1.1.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index e7193d8e4..b480577c9 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "lodash-es": "^4.17.11" }, "devDependencies": { - "@ember/jquery": "^0.6.0", + "@ember/jquery": "^1.1.0", "@ember/optional-features": "^1.0.0", "active-model-adapter": "^2.0.3", "babel-eslint": "^9.0.0", diff --git a/yarn.lock b/yarn.lock index 5c924419d..4efbd3f75 100644 --- a/yarn.lock +++ b/yarn.lock @@ -854,14 +854,14 @@ resolved "https://registry.yarnpkg.com/@ember/edition-utils/-/edition-utils-1.1.1.tgz#d5732c3da593f202e6e1ac6dbee56a758242403f" integrity sha512-GEhri78jdQp/xxPpM6z08KlB0wrHfnfrJ9dmQk7JeQ4XCiMzXsJci7yooQgg/IcTKCM/PxE/IkGCQAo80adMkw== -"@ember/jquery@^0.6.0": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@ember/jquery/-/jquery-0.6.1.tgz#eef89ebc8d7b49bddc176f2a646746c8f5d93978" - integrity sha512-XMgfUYag97YOYLsC0Ys4/H6mHO2U2wra/92eVIug+5eYBloYSDhv2MY/iq/ocwXVSB2dQaphJx5pFXqdrjEzWQ== +"@ember/jquery@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@ember/jquery/-/jquery-1.1.0.tgz#33d062610a5ceaa5c5c8a3187f870d47d6595940" + integrity sha512-zePT3LiK4/2bS4xafrbOlwoLJrDFseOZ95OOuVDyswv8RjFL+9lar+uxX6+jxRb0w900BcQSWP/4nuFSK6HXXw== dependencies: broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.2" - ember-cli-babel "^7.7.3" + ember-cli-babel "^7.11.1" ember-cli-version-checker "^3.1.3" jquery "^3.4.1" resolve "^1.11.1" @@ -5567,7 +5567,7 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.10.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.0, ember-cli-babel@^7.7.3, ember-cli-babel@^7.8.0: +ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.0, ember-cli-babel@^7.7.3, ember-cli-babel@^7.8.0: version "7.12.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.12.0.tgz#064997d199384be8c88d251f30ef67953d3bddc5" integrity sha512-+EGQsbPvh19nNXHCm6rVBx2CdlxQlzxMyhey5hsGViDPriDI4PFYXYaFWdGizDrmZoDcG/Ywpeph3hl0NxGQTg== From af4485da19e75e1efdaca5a67f3a978ac0e45a24 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sun, 6 Oct 2019 09:52:33 -0700 Subject: [PATCH 558/879] v1.1.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b480577c9..153a2c53f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "1.1.2", + "version": "1.1.3", "description": "A client-side server to help you build, test and demo your Ember app", "keywords": [ "ember-addon", From 76692973b61456061e4083c7888a4ef91730da3b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 7 Oct 2019 18:38:00 +0000 Subject: [PATCH 559/879] build(deps-dev): bump ember-cli-addon-docs from 0.6.14 to 0.6.15 Bumps [ember-cli-addon-docs](https://github.com/ember-learn/ember-cli-addon-docs) from 0.6.14 to 0.6.15. - [Release notes](https://github.com/ember-learn/ember-cli-addon-docs/releases) - [Changelog](https://github.com/ember-learn/ember-cli-addon-docs/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-learn/ember-cli-addon-docs/compare/v0.6.14...v0.6.15) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4efbd3f75..3e8a74bf1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5434,9 +5434,9 @@ ember-cli-addon-docs-esdoc@^0.2.3: walk-sync "^0.3.2" ember-cli-addon-docs@^0.6.13: - version "0.6.14" - resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.14.tgz#7d7801f0ffca6df00b86a11d58101c8523e6d44b" - integrity sha512-kfwGcoeNN6ban1ghHdaIqlfvMkj7T9oWoiel7kHknbgcukC5GX67G1w5CaEVMtmAK69kIlJDzo7VB+hAUnCthw== + version "0.6.15" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.15.tgz#a0b8d744a37e3dba9afa1b0c19b44bb7cca5afba" + integrity sha512-swlN0dWY2AUq7CCN8cS0IRtZFdVzDCjcaGorg0NxppP+/MlruRlLPEZm14me3ghS3ArlTohWwp+DIFy1gylczw== dependencies: "@glimmer/syntax" "^0.42.0" broccoli-bridge "^1.0.0" From 0cdacf85b85cc7f63d4dd9666c5c187337b6e8d8 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 8 Oct 2019 15:31:30 +0000 Subject: [PATCH 560/879] build(deps-dev): bump ember-source from 3.13.2 to 3.13.3 Bumps [ember-source](https://github.com/emberjs/ember.js) from 3.13.2 to 3.13.3. - [Release notes](https://github.com/emberjs/ember.js/releases) - [Changelog](https://github.com/emberjs/ember.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember.js/compare/v3.13.2...v3.13.3) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3e8a74bf1..3c4d8f6aa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6455,9 +6455,9 @@ ember-source-channel-url@^2.0.1: got "^8.0.1" ember-source@~3.13.2: - version "3.13.2" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.13.2.tgz#872a583935ce5827518d8b9c23f81475a8f5dbda" - integrity sha512-VBzLziCCdRW4K9YljxL+bGxAG1aaozENaaIDrqmg79OidM6SeTNDEY+y9m2V2YFUGyFkwtqOK1IzcM4GYnnL+w== + version "3.13.3" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.13.3.tgz#65794f79dec0512d833332575f13c77f9ccae2a1" + integrity sha512-aDmzAwpCa4H6ozd+RbsQs9/Pfo4wbnDVe9eb2D05PH9W6zRpiUa+pTluJsUFDfbi+jYGPQnjty2U/UQYBayFvg== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/plugin-transform-block-scoping" "^7.4.4" From 0cbde559bfcdcb540013cd210671dbbf4da4e2ef Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 9 Oct 2019 14:37:33 +0000 Subject: [PATCH 561/879] build(deps-dev): bump ember-cli-inject-live-reload from 2.0.1 to 2.0.2 Bumps [ember-cli-inject-live-reload](https://github.com/rwjblue/ember-cli-inject-live-reload) from 2.0.1 to 2.0.2. - [Release notes](https://github.com/rwjblue/ember-cli-inject-live-reload/releases) - [Changelog](https://github.com/rwjblue/ember-cli-inject-live-reload/blob/master/CHANGELOG.md) - [Commits](https://github.com/rwjblue/ember-cli-inject-live-reload/commits) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3c4d8f6aa..24a06631f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5826,12 +5826,12 @@ ember-cli-import-polyfill@^0.2.0: integrity sha1-waCKiv+0XJe2dZJicv54z0yhZvI= ember-cli-inject-live-reload@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-2.0.1.tgz#1bf3a6ea1747bceddc9f62f7ca8575de6b53ddaf" - integrity sha512-vrW/3KSrku+Prqmp7ZkpCxYkabnLrTHDEvV9B1yphTP++dhiV7n7Dv9NrmyubkoF3Inm0xrbbhB5mScvvuTQSg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-2.0.2.tgz#95edb543b386239d35959e5ea9579f5382976ac7" + integrity sha512-HDD6o/kBHT/kUtazklU0OW23q2jigIN42QmcpFdXUSvJ2/2SYA6yIqSUxWfJgISmtn5gTNZ2KPq1p3dLkhJxSQ== dependencies: clean-base-url "^1.0.0" - ember-cli-version-checker "^2.1.2" + ember-cli-version-checker "^3.1.3" ember-cli-is-package-missing@^1.0.0: version "1.0.0" From 20168aa3a2fbfc41ad3ae68f1111a68d48571512 Mon Sep 17 00:00:00 2001 From: Ruslan Hrabovyi Date: Fri, 11 Oct 2019 00:00:39 +0300 Subject: [PATCH 562/879] Feature/nested mirage modules (#1785) --- addon/utils/read-modules.js | 14 ++--- .../mirage/factories/nested/thing.js | 5 ++ .../mirage/fixtures/nested/things.js | 3 + .../mirage/identity-managers/nested/thing.js | 56 +++++++++++++++++++ .../mirage/models/nested/thing.js | 4 ++ .../mirage/serializers/nested/thing.js | 9 +++ .../tests/acceptance/start-mirage-test.js | 27 +++++++++ 7 files changed, 110 insertions(+), 8 deletions(-) create mode 100644 test-projects/01-basic-app/mirage/factories/nested/thing.js create mode 100644 test-projects/01-basic-app/mirage/fixtures/nested/things.js create mode 100644 test-projects/01-basic-app/mirage/identity-managers/nested/thing.js create mode 100644 test-projects/01-basic-app/mirage/models/nested/thing.js create mode 100644 test-projects/01-basic-app/mirage/serializers/nested/thing.js diff --git a/addon/utils/read-modules.js b/addon/utils/read-modules.js index 083fa7599..797b295e2 100644 --- a/addon/utils/read-modules.js +++ b/addon/utils/read-modules.js @@ -3,8 +3,7 @@ 'use strict'; import assert from '../assert'; -import { camelCase } from 'lodash-es'; -import { pluralize } from '../utils/inflector'; +import { pluralize, camelize } from '../utils/inflector'; import require from 'require'; /** @@ -18,7 +17,7 @@ export default function(prefix) { let modules = ['factories', 'fixtures', 'scenarios', 'models', 'serializers', 'identity-managers']; let mirageModuleRegExp = new RegExp(`^${prefix}/mirage/(${modules.join('|')})`); let modulesMap = modules.reduce((memo, name) => { - memo[camelCase(name)] = {}; + memo[camelize(name)] = {}; return memo; }, {}); @@ -29,10 +28,9 @@ export default function(prefix) { return; } let moduleParts = moduleName.split('/'); - let moduleType = camelCase(moduleParts[moduleParts.length - 2]); - let moduleKey = moduleParts[moduleParts.length - 1]; - assert(`Subdirectories under ${moduleType} are not supported`, - moduleParts[moduleParts.length - 3] === 'mirage'); + let moduleTypeIndex = moduleParts.indexOf('mirage') + 1; + let moduleType = camelize(moduleParts[moduleTypeIndex]); + let moduleKey = moduleParts.slice([moduleTypeIndex + 1]).join('/'); if (moduleType === 'scenario') { assert('Only scenario/default.js is supported at this time.', @@ -53,7 +51,7 @@ export default function(prefix) { let data = module.default; - modulesMap[moduleType][camelCase(moduleKey)] = data; + modulesMap[moduleType][camelize(moduleKey)] = data; }); return modulesMap; diff --git a/test-projects/01-basic-app/mirage/factories/nested/thing.js b/test-projects/01-basic-app/mirage/factories/nested/thing.js new file mode 100644 index 000000000..a49b783d3 --- /dev/null +++ b/test-projects/01-basic-app/mirage/factories/nested/thing.js @@ -0,0 +1,5 @@ +import { Factory } from 'ember-cli-mirage'; + +export default Factory.extend({ + name: 'nested factory works!' +}); diff --git a/test-projects/01-basic-app/mirage/fixtures/nested/things.js b/test-projects/01-basic-app/mirage/fixtures/nested/things.js new file mode 100644 index 000000000..5c0aee901 --- /dev/null +++ b/test-projects/01-basic-app/mirage/fixtures/nested/things.js @@ -0,0 +1,3 @@ +export default [ + { fixtureField: 'nested fixture works!' } +]; diff --git a/test-projects/01-basic-app/mirage/identity-managers/nested/thing.js b/test-projects/01-basic-app/mirage/identity-managers/nested/thing.js new file mode 100644 index 000000000..52271b76d --- /dev/null +++ b/test-projects/01-basic-app/mirage/identity-managers/nested/thing.js @@ -0,0 +1,56 @@ +export default class { + constructor() { + this.reset(); + } + + /** + * Returns an unique identifier. + * + * @method fetch + * @return {String} Unique identifier + * @public + */ + fetch() { + let id; + + if (this._nextId >= 1) { + throw new Error(`IdentityManager used for testing only supports single id.`); + } + id = 'nested identity manager works!'; + this._ids[id] = true; + this._nextId = this._nextid + 1; + return id; + } + + /** + * Register an identifier. + * Must throw if identifier is already used. + * + * @method set + * @param {String|Number} id + * @public + */ + set(id) { + if (typeof this._ids[id] !== 'undefined') { + throw new Error(`Id {id} is already used.`); + } + + this._ids[id] = true; + + let int = parseInt(id, 16); + if (!isNaN(int) && int > this._nextid) { + this._nextId = int; + } + } + + /** + * Reset identity manager. + * + * @method reset + * @public + */ + reset() { + this._nextId = 0; + this._ids = {}; + } +} diff --git a/test-projects/01-basic-app/mirage/models/nested/thing.js b/test-projects/01-basic-app/mirage/models/nested/thing.js new file mode 100644 index 000000000..1486a7240 --- /dev/null +++ b/test-projects/01-basic-app/mirage/models/nested/thing.js @@ -0,0 +1,4 @@ +import { Model } from 'ember-cli-mirage'; + +export default Model.extend({ +}); diff --git a/test-projects/01-basic-app/mirage/serializers/nested/thing.js b/test-projects/01-basic-app/mirage/serializers/nested/thing.js new file mode 100644 index 000000000..66d972c4d --- /dev/null +++ b/test-projects/01-basic-app/mirage/serializers/nested/thing.js @@ -0,0 +1,9 @@ +import ApplicationSerizlizer from '../application'; + +export default ApplicationSerizlizer.extend({ + keyForAttribute(attr) { + const key = ApplicationSerizlizer.prototype.keyForAttribute.call(this, attr); + + return `nested_thing_${key}`; + } +}); diff --git a/test-projects/01-basic-app/tests/acceptance/start-mirage-test.js b/test-projects/01-basic-app/tests/acceptance/start-mirage-test.js index 83258e215..3e77740fd 100644 --- a/test-projects/01-basic-app/tests/acceptance/start-mirage-test.js +++ b/test-projects/01-basic-app/tests/acceptance/start-mirage-test.js @@ -5,6 +5,7 @@ import {visit, currentRouteName} from '@ember/test-helpers'; import startMirage from 'ember-cli-mirage/start-mirage'; import { setupMirage } from 'ember-cli-mirage/test-support'; import ENV from 'basic-app/config/environment'; +import NestedThingModel from 'basic-app/mirage/models/nested/thing'; let module; if (Ember.VERSION === '1.13.13') { @@ -52,6 +53,32 @@ module('Acceptance | Starting mirage', function(hooks) { assert.dom('[data-test-id="user"]').exists(); }); + module('nested mirage modules', function() { + test('it works', async function(assert) { + const server = startMirage(this.owner); + const model = server.create('nested/thing'); + + assert.ok(model instanceof NestedThingModel, 'models'); + assert.equal(model.id, 'nested identity manager works!', 'identity managers'); + assert.equal(model.name, 'nested factory works!', 'factories'); + + const { attributes } = server.serializerOrRegistry.serialize(model).data; + assert.ok('nested_thing_name' in attributes, 'serializer'); + }); + + // factories and fixtures have to be tested separately + test('fixtures support', async function(assert) { + const server = startMirage(this.owner); + + server.loadFixtures('nested/things'); + const model = server.schema.first('nested/thing'); + + assert.ok(model instanceof NestedThingModel, 'models'); + assert.equal(model.id, 'nested identity manager works!', 'identity managers'); + assert.equal(model.fixtureField, 'nested fixture works!', 'fixtures'); + }); + }) + module('setupMirage()', function(hooks) { setupMirage(hooks); From ee5db3406243e9991d8eaf3cf755c3223d77e7d5 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 14 Oct 2019 21:17:17 +0000 Subject: [PATCH 563/879] build(deps-dev): bump jsdom from 15.1.1 to 15.2.0 Bumps [jsdom](https://github.com/jsdom/jsdom) from 15.1.1 to 15.2.0. - [Release notes](https://github.com/jsdom/jsdom/releases) - [Changelog](https://github.com/jsdom/jsdom/blob/master/Changelog.md) - [Commits](https://github.com/jsdom/jsdom/compare/15.1.1...15.2.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 63 ++++++++++++++++++++----------------------------------- 1 file changed, 23 insertions(+), 40 deletions(-) diff --git a/yarn.lock b/yarn.lock index 24a06631f..a7adf73da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1746,17 +1746,12 @@ acorn@^5.0.0, acorn@^5.2.1, acorn@^5.5.3, acorn@^5.6.2: resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== -acorn@^6.0.1, acorn@^6.0.7, acorn@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" - integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== - -acorn@^6.0.2: +acorn@^6.0.1, acorn@^6.0.2, acorn@^6.0.7: version "6.2.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.2.0.tgz#67f0da2fc339d6cfb5d6fb244fd449f33cd8bbe3" integrity sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw== -acorn@^7.0.0: +acorn@^7.0.0, acorn@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== @@ -4934,16 +4929,16 @@ csso@^3.5.1: dependencies: css-tree "1.0.0-alpha.29" -cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0", "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.6.tgz#f85206cee04efa841f3c5982a74ba96ab20d65ad" - integrity sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A== - -cssom@^0.3.4, cssom@~0.3.6: +cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0", "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4, cssom@~0.3.6: version "0.3.8" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== +cssom@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.1.tgz#b24111d236b6dbd00cdfacb5ab67a20473381fe3" + integrity sha512-6Aajq0XmukE7HdXUU6IoSWuH1H6gH9z6qmagsstTiN7cW2FNTsb+J2Chs+ufPgZCsV/yo8oaEudQLrb9dGxSVQ== + "cssstyle@>= 0.2.29 < 0.3.0": version "0.2.37" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" @@ -4951,20 +4946,20 @@ cssom@^0.3.4, cssom@~0.3.6: dependencies: cssom "0.3.x" -cssstyle@^1.0.0, cssstyle@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.2.2.tgz#427ea4d585b18624f6fdbf9de7a2a1a3ba713077" - integrity sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow== - dependencies: - cssom "0.3.x" - -cssstyle@^1.1.1: +cssstyle@^1.0.0, cssstyle@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.3.0.tgz#c36c466f7037fd30f03baa271b65f0f17b50585c" integrity sha512-wXsoRfsRfsLVNaVzoKdqvEmK/5PFaEXNspVT22Ots6K/cnJdpoDKuQFw+qlMiXnmaif1OgeC466X1zISgAOcGg== dependencies: cssom "~0.3.6" +cssstyle@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.0.0.tgz#911f0fe25532db4f5d44afc83f89cc4b82c97fe3" + integrity sha512-QXSAu2WBsSRXCPjvI43Y40m6fMevvyRm8JVAuF9ksQz5jha4pWP1wpaK7Yu5oLFc6+XAY+hj8YhefyXcBB53gg== + dependencies: + cssom "~0.3.6" + ctype@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/ctype/-/ctype-0.5.3.tgz#82c18c2461f74114ef16c135224ad0b9144ca12f" @@ -9341,16 +9336,16 @@ jsdom@^12.0.0: xml-name-validator "^3.0.0" jsdom@^15.0.0: - version "15.1.1" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.1.1.tgz#21ed01f81d95ef4327f3e564662aef5e65881252" - integrity sha512-cQZRBB33arrDAeCrAEWn1U3SvrvC8XysBua9Oqg1yWrsY/gYcusloJC3RZJXuY5eehSCmws8f2YeliCqGSkrtQ== + version "15.2.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.0.tgz#4baead4f464e733533ed6ac607ce440918cf5cbb" + integrity sha512-+hRyEfjRPFwTYMmSQ3/f7U9nP8ZNZmbkmUek760ZpxnCPWJIhaaLRuUSvpJ36fZKCGENxLwxClzwpOpnXNfChQ== dependencies: abab "^2.0.0" - acorn "^6.1.1" + acorn "^7.1.0" acorn-globals "^4.3.2" array-equal "^1.0.0" - cssom "^0.3.6" - cssstyle "^1.2.2" + cssom "^0.4.1" + cssstyle "^2.0.0" data-urls "^1.1.0" domexception "^1.0.1" escodegen "^1.11.1" @@ -12992,20 +12987,13 @@ sax@>=0.6.0, sax@^1.1.4, sax@^1.2.4, sax@~1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -saxes@^3.1.3: +saxes@^3.1.3, saxes@^3.1.9: version "3.1.11" resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== dependencies: xmlchars "^2.1.1" -saxes@^3.1.9: - version "3.1.9" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.9.tgz#c1c197cd54956d88c09f960254b999e192d7058b" - integrity sha512-FZeKhJglhJHk7eWG5YM0z46VHmI3KJpMBAQm3xa9meDvd+wevB5GuBB0wc0exPInZiBBHqi00DbS8AcvCGCFMw== - dependencies: - xmlchars "^1.3.1" - schema-utils@^0.4.4: version "0.4.7" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" @@ -14980,11 +14968,6 @@ xmlbuilder@~9.0.1: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= -xmlchars@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-1.3.1.tgz#1dda035f833dbb4f86a0c28eaa6ca769214793cf" - integrity sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw== - xmlchars@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.1.1.tgz#ef1a81c05bff629c2280007f12daca21bd6f6c93" From 23c4e1c1e54a988e8c612b1f1e1bde532dc9bfd6 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 14 Oct 2019 21:19:40 +0000 Subject: [PATCH 564/879] build(deps): bump ember-auto-import from 1.5.2 to 1.5.3 Bumps [ember-auto-import](https://github.com/ef4/ember-auto-import) from 1.5.2 to 1.5.3. - [Release notes](https://github.com/ef4/ember-auto-import/releases) - [Changelog](https://github.com/ef4/ember-auto-import/blob/master/CHANGELOG.md) - [Commits](https://github.com/ef4/ember-auto-import/compare/v1.5.2...v1.5.3) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 55 ++++++++++--------------------------------------------- 1 file changed, 10 insertions(+), 45 deletions(-) diff --git a/yarn.lock b/yarn.lock index 24a06631f..f4368f2b1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -710,22 +710,7 @@ "@babel/parser" "^7.4.4" "@babel/types" "^7.4.4" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.2.3", "@babel/traverse@^7.2.4", "@babel/traverse@^7.3.4", "@babel/traverse@^7.4.0", "@babel/traverse@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.0.tgz#4216d6586854ef5c3c4592dab56ec7eb78485485" - integrity sha512-SnA9aLbyOCcnnbQEGwdfBggnc142h/rbqqsXcaATj2hZcegCl903pUD/lfpsNBlBSuWow/YDfRyJuWi2EPR5cg== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.5.0" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.5.0" - "@babel/types" "^7.5.0" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.11" - -"@babel/traverse@^7.4.5": +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.2.3", "@babel/traverse@^7.2.4", "@babel/traverse@^7.3.4", "@babel/traverse@^7.4.0", "@babel/traverse@^7.4.5", "@babel/traverse@^7.5.0": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.5.tgz#f664f8f368ed32988cd648da9f72d5ca70f165bb" integrity sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ== @@ -740,16 +725,7 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.1.6", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.2", "@babel/types@^7.3.4", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.0.tgz#e47d43840c2e7f9105bc4d3a2c371b4d0c7832ab" - integrity sha512-UFpDVqRABKsW01bvw7/wSUe56uy6RXM5+VJibVVAybDGxEW25jdwiFJEf7ASvSaC7sN7rbE/l3cLp2izav+CtQ== - dependencies: - esutils "^2.0.2" - lodash "^4.17.11" - to-fast-properties "^2.0.0" - -"@babel/types@^7.5.5": +"@babel/types@^7.0.0", "@babel/types@^7.1.6", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.2", "@babel/types@^7.3.4", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.0", "@babel/types@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.5.tgz#97b9f728e182785909aa4ab56264f090a028d18a" integrity sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw== @@ -5383,9 +5359,9 @@ ember-assign-polyfill@~2.4.0: ember-cli-version-checker "^2.0.0" ember-auto-import@^1.2.19, ember-auto-import@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.5.2.tgz#e97ed96b600caa6090ffed83e4611c3e7ec9bad7" - integrity sha512-skVQpfdc6G5OVRsyemDn3vI1nj/iBBgnoqRLRka0ZbDT2GqelmyJ86bp+Bd/ztJe45Le3we+LXbR7T54RU5A9w== + version "1.5.3" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.5.3.tgz#b32936f874d1ed7057ad2ed3f6116357820be44b" + integrity sha512-7JfdunM1BmLy/lyUXu7uEoi0Gi4+dxkGM23FgIEyW5g7z4MidhP53Fc61t49oPSnq7+J4lLpbH1f6C+mDMgb4A== dependencies: "@babel/core" "^7.1.6" "@babel/preset-env" "^7.0.0" @@ -5404,7 +5380,7 @@ ember-auto-import@^1.2.19, ember-auto-import@^1.5.2: enhanced-resolve "^4.0.0" fs-extra "^6.0.1" fs-tree-diff "^1.0.0" - handlebars "~4.1.2" + handlebars "^4.3.1" js-string-escape "^1.0.1" lodash "^4.17.10" mkdirp "^0.5.1" @@ -8204,21 +8180,10 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -handlebars@^4.0.11, handlebars@^4.0.4, handlebars@~4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" - integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== - dependencies: - neo-async "^2.6.0" - optimist "^0.6.1" - source-map "^0.6.1" - optionalDependencies: - uglify-js "^3.1.4" - -handlebars@^4.0.13: - version "4.2.0" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.2.0.tgz#57ce8d2175b9bbb3d8b3cf3e4217b1aec8ddcb2e" - integrity sha512-Kb4xn5Qh1cxAKvQnzNWZ512DhABzyFNmsaJf3OAkWNa4NkaqWcNI8Tao8Tasi0/F4JD9oyG0YxuFyvyR57d+Gw== +handlebars@^4.0.11, handlebars@^4.0.13, handlebars@^4.0.4, handlebars@^4.3.1: + version "4.4.3" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.4.3.tgz#180bae52c1d0e9ec0c15d7e82a4362d662762f6e" + integrity sha512-B0W4A2U1ww3q7VVthTKfh+epHx+q4mCt6iK+zEAzbMBpWQAwxCeKxEGpj/1oQTpzPXDNSOG7hmG14TsISH50yw== dependencies: neo-async "^2.6.0" optimist "^0.6.1" From 8bcc2a5b9cb8c2dbe8bb03f3a002a89b1118cb8c Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 17 Oct 2019 11:08:30 -0400 Subject: [PATCH 565/879] @miragejs/server -> miragejs (#1791) --- addon/assert.js | 2 +- addon/association.js | 2 +- addon/db-collection.js | 2 +- addon/db.js | 2 +- addon/factory.js | 2 +- addon/identity-manager.js | 2 +- addon/index.js | 4 +- addon/orm/associations/association.js | 2 +- addon/orm/associations/belongs-to.js | 2 +- addon/orm/associations/has-many.js | 2 +- addon/orm/collection.js | 2 +- addon/orm/model.js | 2 +- addon/orm/polymorphic-collection.js | 2 +- addon/orm/schema.js | 2 +- addon/response.js | 2 +- addon/route-handler.js | 2 +- addon/route-handlers/base.js | 2 +- addon/route-handlers/function.js | 2 +- addon/route-handlers/object.js | 2 +- addon/route-handlers/shorthands/base.js | 2 +- addon/route-handlers/shorthands/delete.js | 2 +- addon/route-handlers/shorthands/get.js | 2 +- addon/route-handlers/shorthands/head.js | 2 +- addon/route-handlers/shorthands/post.js | 2 +- addon/route-handlers/shorthands/put.js | 2 +- addon/serializer-registry.js | 2 +- addon/serializer.js | 2 +- addon/serializers/active-model-serializer.js | 2 +- addon/serializers/json-api-serializer.js | 2 +- addon/serializers/rest-serializer.js | 2 +- addon/server.js | 4 +- addon/trait.js | 2 +- addon/utils/extend.js | 2 +- addon/utils/inflector.js | 2 +- addon/utils/is-association.js | 2 +- addon/utils/reference-sort.js | 2 +- addon/utils/uuid.js | 2 +- ember-cli-build.js | 2 +- package.json | 2 +- yarn.lock | 64 ++++++++++---------- 40 files changed, 73 insertions(+), 73 deletions(-) diff --git a/addon/assert.js b/addon/assert.js index 832d6b414..60ea7a59e 100644 --- a/addon/assert.js +++ b/addon/assert.js @@ -1 +1 @@ -export { _assert as default } from '@miragejs/server'; +export { _assert as default } from "miragejs"; diff --git a/addon/association.js b/addon/association.js index 868347668..c42b7ecc1 100644 --- a/addon/association.js +++ b/addon/association.js @@ -1 +1 @@ -export { association as default } from '@miragejs/server'; +export { association as default } from 'miragejs'; diff --git a/addon/db-collection.js b/addon/db-collection.js index 6a60ce946..159cd33ae 100644 --- a/addon/db-collection.js +++ b/addon/db-collection.js @@ -1 +1 @@ -export { _dbCollection as default } from '@miragejs/server'; +export { _dbCollection as default } from 'miragejs'; diff --git a/addon/db.js b/addon/db.js index 4958d4c66..a758ca727 100644 --- a/addon/db.js +++ b/addon/db.js @@ -1 +1 @@ -export { _Db as default } from '@miragejs/server'; +export { _Db as default } from 'miragejs'; diff --git a/addon/factory.js b/addon/factory.js index 3b4b087b5..176972f75 100644 --- a/addon/factory.js +++ b/addon/factory.js @@ -1 +1 @@ -export { Factory as default } from '@miragejs/server'; +export { Factory as default } from "miragejs"; diff --git a/addon/identity-manager.js b/addon/identity-manager.js index 2ab3de762..e5d0f06ca 100644 --- a/addon/identity-manager.js +++ b/addon/identity-manager.js @@ -1 +1 @@ -export { IdentityManager as default } from '@miragejs/server'; +export { IdentityManager as default } from "miragejs"; diff --git a/addon/index.js b/addon/index.js index b59a91c8f..aa4512ac3 100644 --- a/addon/index.js +++ b/addon/index.js @@ -1,2 +1,2 @@ -export { default } from '@miragejs/server'; -export * from '@miragejs/server'; +export { default } from 'miragejs'; +export * from 'miragejs'; diff --git a/addon/orm/associations/association.js b/addon/orm/associations/association.js index 21af9e685..8eb279d95 100644 --- a/addon/orm/associations/association.js +++ b/addon/orm/associations/association.js @@ -1 +1 @@ -export { _ormAssociationsAssociation as default } from '@miragejs/server'; +export { _ormAssociationsAssociation as default } from 'miragejs'; diff --git a/addon/orm/associations/belongs-to.js b/addon/orm/associations/belongs-to.js index a8024ab2f..8bafa4831 100644 --- a/addon/orm/associations/belongs-to.js +++ b/addon/orm/associations/belongs-to.js @@ -1 +1 @@ -export {_ormAssociationsBelongsTo as default } from '@miragejs/server'; +export {_ormAssociationsBelongsTo as default } from 'miragejs'; diff --git a/addon/orm/associations/has-many.js b/addon/orm/associations/has-many.js index cb8a5a2be..07fba6af3 100644 --- a/addon/orm/associations/has-many.js +++ b/addon/orm/associations/has-many.js @@ -1 +1 @@ -export { _ormAssociationsHasMany as default } from '@miragejs/server'; +export { _ormAssociationsHasMany as default } from 'miragejs'; diff --git a/addon/orm/collection.js b/addon/orm/collection.js index 886220cb2..eae3fea07 100644 --- a/addon/orm/collection.js +++ b/addon/orm/collection.js @@ -1 +1 @@ -export { Collection as default } from '@miragejs/server'; +export { Collection as default } from 'miragejs'; diff --git a/addon/orm/model.js b/addon/orm/model.js index 0f4ba5d42..0a3929699 100644 --- a/addon/orm/model.js +++ b/addon/orm/model.js @@ -1 +1 @@ -export { Model as default } from '@miragejs/server'; +export { Model as default } from 'miragejs'; diff --git a/addon/orm/polymorphic-collection.js b/addon/orm/polymorphic-collection.js index dc804f93b..b83b03e94 100644 --- a/addon/orm/polymorphic-collection.js +++ b/addon/orm/polymorphic-collection.js @@ -1 +1 @@ -export { _ormPolymorphicCollection as default } from '@miragejs/server'; +export { _ormPolymorphicCollection as default } from 'miragejs'; diff --git a/addon/orm/schema.js b/addon/orm/schema.js index 59b54eb3e..45e9b7039 100644 --- a/addon/orm/schema.js +++ b/addon/orm/schema.js @@ -1 +1 @@ -export { _ormSchema as default } from '@miragejs/server'; +export { _ormSchema as default } from 'miragejs'; diff --git a/addon/response.js b/addon/response.js index da34a7391..f6d034e89 100644 --- a/addon/response.js +++ b/addon/response.js @@ -1 +1 @@ -export { Response as default } from '@miragejs/server'; +export { Response as default } from "miragejs"; diff --git a/addon/route-handler.js b/addon/route-handler.js index b119c95f0..208bdbd5b 100644 --- a/addon/route-handler.js +++ b/addon/route-handler.js @@ -1 +1 @@ -export { _RouteHandler as default } from '@miragejs/server'; +export { _RouteHandler as default } from 'miragejs'; diff --git a/addon/route-handlers/base.js b/addon/route-handlers/base.js index 54e38e8e2..0bcfd4fea 100644 --- a/addon/route-handlers/base.js +++ b/addon/route-handlers/base.js @@ -1 +1 @@ -export { _routeHandlersBase as default } from '@miragejs/server'; +export { _routeHandlersBase as default } from 'miragejs'; diff --git a/addon/route-handlers/function.js b/addon/route-handlers/function.js index ec83bd8c4..1b3be7c8d 100644 --- a/addon/route-handlers/function.js +++ b/addon/route-handlers/function.js @@ -1 +1 @@ -export { _routeHandlersFunction as default } from '@miragejs/server'; +export { _routeHandlersFunction as default } from 'miragejs'; diff --git a/addon/route-handlers/object.js b/addon/route-handlers/object.js index fa802bca4..9f4a871d1 100644 --- a/addon/route-handlers/object.js +++ b/addon/route-handlers/object.js @@ -1 +1 @@ -export { _routeHandlersObject as default } from '@miragejs/server'; +export { _routeHandlersObject as default } from 'miragejs'; diff --git a/addon/route-handlers/shorthands/base.js b/addon/route-handlers/shorthands/base.js index e1f925c06..324c9b299 100644 --- a/addon/route-handlers/shorthands/base.js +++ b/addon/route-handlers/shorthands/base.js @@ -1 +1 @@ -export { _routeHandlersShorthandsBase as default } from '@miragejs/server'; +export { _routeHandlersShorthandsBase as default } from 'miragejs'; diff --git a/addon/route-handlers/shorthands/delete.js b/addon/route-handlers/shorthands/delete.js index 246d68017..6aace2dda 100644 --- a/addon/route-handlers/shorthands/delete.js +++ b/addon/route-handlers/shorthands/delete.js @@ -1 +1 @@ -export { _routeHandlersShorthandsDelete as default } from '@miragejs/server'; +export { _routeHandlersShorthandsDelete as default } from 'miragejs'; diff --git a/addon/route-handlers/shorthands/get.js b/addon/route-handlers/shorthands/get.js index 429bf8e22..4cfc1ff82 100644 --- a/addon/route-handlers/shorthands/get.js +++ b/addon/route-handlers/shorthands/get.js @@ -1 +1 @@ -export { _routeHandlersShorthandsGet as default } from '@miragejs/server'; +export { _routeHandlersShorthandsGet as default } from 'miragejs'; diff --git a/addon/route-handlers/shorthands/head.js b/addon/route-handlers/shorthands/head.js index e6dcb97ab..55ef50ce3 100644 --- a/addon/route-handlers/shorthands/head.js +++ b/addon/route-handlers/shorthands/head.js @@ -1 +1 @@ -export { _routeHandlersShorthandsHead as default } from '@miragejs/server'; +export { _routeHandlersShorthandsHead as default } from 'miragejs'; diff --git a/addon/route-handlers/shorthands/post.js b/addon/route-handlers/shorthands/post.js index 44285c147..765de5299 100644 --- a/addon/route-handlers/shorthands/post.js +++ b/addon/route-handlers/shorthands/post.js @@ -1 +1 @@ -export { _routeHandlersShorthandsPost as default } from '@miragejs/server'; +export { _routeHandlersShorthandsPost as default } from 'miragejs'; diff --git a/addon/route-handlers/shorthands/put.js b/addon/route-handlers/shorthands/put.js index 67cdce865..472f4a5cf 100644 --- a/addon/route-handlers/shorthands/put.js +++ b/addon/route-handlers/shorthands/put.js @@ -1 +1 @@ -export { _routeHandlersShorthandsPut as default } from '@miragejs/server'; +export { _routeHandlersShorthandsPut as default } from 'miragejs'; diff --git a/addon/serializer-registry.js b/addon/serializer-registry.js index 2d1612e7e..48508ba69 100644 --- a/addon/serializer-registry.js +++ b/addon/serializer-registry.js @@ -1 +1 @@ -export { _SerializerRegistry as default } from '@miragejs/server'; +export { _SerializerRegistry as default } from 'miragejs'; diff --git a/addon/serializer.js b/addon/serializer.js index deef41b8a..5ede4e2df 100644 --- a/addon/serializer.js +++ b/addon/serializer.js @@ -1 +1 @@ -export { Serializer as default } from '@miragejs/server'; +export { Serializer as default } from 'miragejs'; diff --git a/addon/serializers/active-model-serializer.js b/addon/serializers/active-model-serializer.js index 7a8267d90..0c9eab38f 100644 --- a/addon/serializers/active-model-serializer.js +++ b/addon/serializers/active-model-serializer.js @@ -1 +1 @@ -export { ActiveModelSerializer as default } from '@miragejs/server'; +export { ActiveModelSerializer as default } from 'miragejs'; diff --git a/addon/serializers/json-api-serializer.js b/addon/serializers/json-api-serializer.js index 73210435b..fbb4ad235 100644 --- a/addon/serializers/json-api-serializer.js +++ b/addon/serializers/json-api-serializer.js @@ -1 +1 @@ -export { JSONAPISerializer as default } from '@miragejs/server'; +export { JSONAPISerializer as default } from 'miragejs'; diff --git a/addon/serializers/rest-serializer.js b/addon/serializers/rest-serializer.js index 7a8267d90..0c9eab38f 100644 --- a/addon/serializers/rest-serializer.js +++ b/addon/serializers/rest-serializer.js @@ -1 +1 @@ -export { ActiveModelSerializer as default } from '@miragejs/server'; +export { ActiveModelSerializer as default } from 'miragejs'; diff --git a/addon/server.js b/addon/server.js index 8d2c0c48d..6683704f0 100644 --- a/addon/server.js +++ b/addon/server.js @@ -1,8 +1,8 @@ -import { Server } from '@miragejs/server'; +import { Server } from 'miragejs'; import { getModels } from './ember-data'; import { hasEmberData } from './utils/ember-data'; -export { defaultPassthroughs } from '@miragejs/server'; +export { defaultPassthroughs } from 'miragejs'; /** @hide diff --git a/addon/trait.js b/addon/trait.js index 681f29548..b7e09401e 100644 --- a/addon/trait.js +++ b/addon/trait.js @@ -1 +1 @@ -export { trait as default } from '@miragejs/server'; +export { trait as default } from 'miragejs'; diff --git a/addon/utils/extend.js b/addon/utils/extend.js index e85ccfaf6..08c3ecbdf 100644 --- a/addon/utils/extend.js +++ b/addon/utils/extend.js @@ -1 +1 @@ -export { _utilsExtend as default } from '@miragejs/server'; +export { _utilsExtend as default } from 'miragejs'; diff --git a/addon/utils/inflector.js b/addon/utils/inflector.js index cec6ed0c2..b36902ab8 100644 --- a/addon/utils/inflector.js +++ b/addon/utils/inflector.js @@ -3,7 +3,7 @@ export { _utilsInflectorDasherize as dasherize, _utilsInflectorUnderscore as underscore, _utilsInflectorCapitalize as capitalize -} from '@miragejs/server'; +} from 'miragejs'; /* Keeping these tests here for now to avoid accidental breakage, but they are diff --git a/addon/utils/is-association.js b/addon/utils/is-association.js index 5336cb592..1dc93cd3d 100644 --- a/addon/utils/is-association.js +++ b/addon/utils/is-association.js @@ -1 +1 @@ -export { _utilsIsAssociation as default } from '@miragejs/server'; +export { _utilsIsAssociation as default } from 'miragejs'; diff --git a/addon/utils/reference-sort.js b/addon/utils/reference-sort.js index da34fc655..b03811e8f 100644 --- a/addon/utils/reference-sort.js +++ b/addon/utils/reference-sort.js @@ -1 +1 @@ -export { _utilsReferenceSort as default } from '@miragejs/server'; +export { _utilsReferenceSort as default } from 'miragejs'; diff --git a/addon/utils/uuid.js b/addon/utils/uuid.js index ca4a83ffd..9bb3f37e7 100644 --- a/addon/utils/uuid.js +++ b/addon/utils/uuid.js @@ -1 +1 @@ -export { _utilsUuid as default } from '@miragejs/server'; +export { _utilsUuid as default } from 'miragejs'; diff --git a/ember-cli-build.js b/ember-cli-build.js index 44bafa7b8..24e43c1c8 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -10,7 +10,7 @@ module.exports = function(defaults) { "ember-cli-addon-docs-esdoc": { packages: [ "ember-cli-mirage", - { name: "@miragejs/server", sourceDirectory: "lib" } + { name: "miragejs", sourceDirectory: "lib" } ] } }); diff --git a/package.json b/package.json index 153a2c53f..dfe23d3d4 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "prepare": "./scripts/link.sh" }, "dependencies": { - "@miragejs/server": "0.1.28", + "miragejs": "^0.1.31", "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^2.0.1", "broccoli-merge-trees": "^3.0.2", diff --git a/yarn.lock b/yarn.lock index 66636b6d1..d6e770865 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1214,38 +1214,6 @@ resolved "https://registry.yarnpkg.com/@miragejs/pretender-node-polyfill/-/pretender-node-polyfill-0.1.2.tgz#d26b6b7483fb70cd62189d05c95d2f67153e43f2" integrity sha512-M/BexG/p05C5lFfMunxo/QcgIJnMT2vDVCd00wNqK2ImZONIlEETZwWJu1QtLxtmYlSHlCFl3JNzp0tLe7OJ5g== -"@miragejs/server@0.1.28": - version "0.1.28" - resolved "https://registry.yarnpkg.com/@miragejs/server/-/server-0.1.28.tgz#5f7e9780ac518feba5f5c3e81361eb376609bddc" - integrity sha512-Ohg7FlOyn/1E28Y5cIfda0cw1t61gKIlm6TSMv+1mAA3fFWAHEUX+BBkQTAF5dyviovwpUZwAEVANnBay4BQDg== - dependencies: - "@miragejs/pretender-node-polyfill" "^0.1.0" - inflected "^2.0.4" - lodash.assign "^4.2.0" - lodash.camelcase "^4.3.0" - lodash.clonedeep "^4.5.0" - lodash.compact "^3.0.1" - lodash.find "^4.6.0" - lodash.flatten "^4.4.0" - lodash.forin "^4.4.0" - lodash.get "^4.4.2" - lodash.has "^4.5.2" - lodash.invokemap "^4.6.0" - lodash.isempty "^4.4.0" - lodash.isequal "^4.5.0" - lodash.isfunction "^3.0.9" - lodash.isinteger "^4.0.4" - lodash.isplainobject "^4.0.6" - lodash.lowerfirst "^4.3.1" - lodash.map "^4.6.0" - lodash.mapvalues "^4.6.0" - lodash.pick "^4.4.0" - lodash.snakecase "^4.1.1" - lodash.uniq "^4.5.0" - lodash.uniqby "^4.7.0" - lodash.values "^4.3.0" - pretender "3.0.2" - "@simple-dom/document@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@simple-dom/document/-/document-1.4.0.tgz#af60855f957f284d436983798ef1006cca1a1678" @@ -10706,6 +10674,38 @@ minizlib@^1.1.1: dependencies: minipass "^2.2.1" +miragejs@^0.1.31: + version "0.1.31" + resolved "https://registry.yarnpkg.com/miragejs/-/miragejs-0.1.31.tgz#9251081360db8b462b28714449baf8fe5ceceb9b" + integrity sha512-V7JUOSQx/IrvKAFG3H+8qig0KUG03Y9tcYUQuRdT6/7rp0E1HwQ+s8liQwCTtCpO37EhVUu33WOCUvBndmKfyw== + dependencies: + "@miragejs/pretender-node-polyfill" "^0.1.0" + inflected "^2.0.4" + lodash.assign "^4.2.0" + lodash.camelcase "^4.3.0" + lodash.clonedeep "^4.5.0" + lodash.compact "^3.0.1" + lodash.find "^4.6.0" + lodash.flatten "^4.4.0" + lodash.forin "^4.4.0" + lodash.get "^4.4.2" + lodash.has "^4.5.2" + lodash.invokemap "^4.6.0" + lodash.isempty "^4.4.0" + lodash.isequal "^4.5.0" + lodash.isfunction "^3.0.9" + lodash.isinteger "^4.0.4" + lodash.isplainobject "^4.0.6" + lodash.lowerfirst "^4.3.1" + lodash.map "^4.6.0" + lodash.mapvalues "^4.6.0" + lodash.pick "^4.4.0" + lodash.snakecase "^4.1.1" + lodash.uniq "^4.5.0" + lodash.uniqby "^4.7.0" + lodash.values "^4.3.0" + pretender "3.0.2" + mississippi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" From 477665369ac170bd73cf5a057e2fe9adc32da07b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 18 Oct 2019 10:22:10 +0000 Subject: [PATCH 566/879] build(deps-dev): bump ember-cli-htmlbars from 4.0.5 to 4.0.6 Bumps [ember-cli-htmlbars](https://github.com/ember-cli/ember-cli-htmlbars) from 4.0.5 to 4.0.6. - [Release notes](https://github.com/ember-cli/ember-cli-htmlbars/releases) - [Changelog](https://github.com/ember-cli/ember-cli-htmlbars/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-cli-htmlbars/compare/v4.0.5...v4.0.6) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index d6e770865..4653bde96 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5739,9 +5739,9 @@ ember-cli-htmlbars@^3.0.0, ember-cli-htmlbars@^3.0.1: strip-bom "^3.0.0" ember-cli-htmlbars@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.0.5.tgz#0ad521831c2d740502ffd9b0bd28d2d799752f63" - integrity sha512-/zJKzP7RVNnnlYwtliyLsr174wBLcFMJUIOvy0mGnb+optwDJpgCdMzSYEjy/myoXDWgS/6cpLVLneFZ4tYm9Q== + version "4.0.6" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.0.6.tgz#833fe2dfdff8c43a47e39b7d19296a0e1c8928e9" + integrity sha512-DOeH6k1MqUD81NMj3Q2OaZVkvkMAsYcxaDLF6NDd1L0+dVY/xsjq46QiugCZa3HWMdzT9Jm6tg4e8tpSpaNveQ== dependencies: "@ember/edition-utils" "^1.1.1" babel-plugin-htmlbars-inline-precompile "^3.0.0" From b698653f6118f27b5a004899d40ef46276024dcb Mon Sep 17 00:00:00 2001 From: David Mazza Date: Sun, 20 Oct 2019 20:53:08 -0500 Subject: [PATCH 567/879] fix a mistake in Factories docs (#1794) --- tests/dummy/app/pods/docs/data-layer/factories/template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dummy/app/pods/docs/data-layer/factories/template.md b/tests/dummy/app/pods/docs/data-layer/factories/template.md index f30221d88..671bf19d9 100644 --- a/tests/dummy/app/pods/docs/data-layer/factories/template.md +++ b/tests/dummy/app/pods/docs/data-layer/factories/template.md @@ -508,7 +508,7 @@ export default Factory.extend({ afterCreate(post, server) { if (!post.user) { post.update({ - user: server('user') + user: server.create('user') }); } } From 757640083cd9a81aa9327d2aed732880f3f71fb6 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 21 Oct 2019 10:17:47 +0000 Subject: [PATCH 568/879] build(deps-dev): bump eslint-plugin-ember from 7.1.0 to 7.2.0 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 7.1.0 to 7.2.0. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v7.1.0...v7.2.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4653bde96..5799d8bf9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6715,9 +6715,9 @@ esdoc@pzuraq/esdoc#015a342: taffydb "2.7.2" eslint-plugin-ember@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.1.0.tgz#1ae46ead1f17efa489e2dcba3fe3880b95fc162b" - integrity sha512-Tbh/vCxzQrOpzXX2zhEA+FJyZWHscisXi3pKPHmy49MHz0ZjGxBmhR4Y72xw6qeiwwtVNkU4+iCYTLgNeA05TQ== + version "7.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.2.0.tgz#668e20b2ab3442d6ee3ba18c016f37f794eb0104" + integrity sha512-W2Vtep3sbAkNhZOISv3ofMd1LD9fp0QtLR9088Zw5mZkvM9uSGBSENCZfpWdwhvebruOvGpb1r7F1sjC5Qjs0w== dependencies: "@ember-data/rfc395-data" "^0.0.4" ember-rfc176-data "^0.3.12" From cde73dd0734cde1795c6e3dbd075d26dceefdc10 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 21 Oct 2019 10:18:26 +0000 Subject: [PATCH 569/879] build(deps-dev): bump ember-cli-htmlbars from 4.0.6 to 4.0.8 Bumps [ember-cli-htmlbars](https://github.com/ember-cli/ember-cli-htmlbars) from 4.0.6 to 4.0.8. - [Release notes](https://github.com/ember-cli/ember-cli-htmlbars/releases) - [Changelog](https://github.com/ember-cli/ember-cli-htmlbars/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-cli-htmlbars/compare/v4.0.6...v4.0.8) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4653bde96..815bc3745 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5739,9 +5739,9 @@ ember-cli-htmlbars@^3.0.0, ember-cli-htmlbars@^3.0.1: strip-bom "^3.0.0" ember-cli-htmlbars@^4.0.5: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.0.6.tgz#833fe2dfdff8c43a47e39b7d19296a0e1c8928e9" - integrity sha512-DOeH6k1MqUD81NMj3Q2OaZVkvkMAsYcxaDLF6NDd1L0+dVY/xsjq46QiugCZa3HWMdzT9Jm6tg4e8tpSpaNveQ== + version "4.0.8" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.0.8.tgz#e87b62e7040bd478a2d007053bdb1644dd1685b0" + integrity sha512-B6fzlqmv2E2dl8P6UIYu3bY8nZU2kKfl1VkEIgxFAINfsu9fP65kX/bKzHqGhHF8nAtWBoXZWw6tomHKfUT/Jg== dependencies: "@ember/edition-utils" "^1.1.1" babel-plugin-htmlbars-inline-precompile "^3.0.0" From b9e390a5211772135d051c03caa9f49d7f1d0649 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 23 Oct 2019 10:18:08 +0000 Subject: [PATCH 570/879] build(deps-dev): bump ember-composable-helpers from 2.3.1 to 2.4.0 Bumps [ember-composable-helpers](https://github.com/DockYard/ember-composable-helpers) from 2.3.1 to 2.4.0. - [Release notes](https://github.com/DockYard/ember-composable-helpers/releases) - [Commits](https://github.com/DockYard/ember-composable-helpers/compare/v2.3.1...v2.4.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index c394f75a9..a9c24cf52 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6121,9 +6121,9 @@ ember-component-css@^0.7.4: walk-sync "^1.0.1" ember-composable-helpers@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-2.3.1.tgz#db98ad8b55d053e2ac216b9da091c9e7a3b9f453" - integrity sha512-Eltj5yt2CtHhBMrdsjKQTP1zFyfEXQ5/v85ObV2zh0eIJZa1t/gImHN+GIHHuJ+9xOrCUAy60/2TJZjadpoPBQ== + version "2.4.0" + resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-2.4.0.tgz#024bd6a8c338cc9cdf10f1141b119b8f72de205f" + integrity sha512-91ZqFnNG1EDL3WzxXWTgAy6EonPS7htWHletI5SOw5ezEzKbt6EGNBwT6QPhwariugtR8LEfYNQ9lXEiCZrX1w== dependencies: "@babel/core" "^7.0.0" broccoli-funnel "2.0.1" From e3998662c15a6eb2d92ae77f8cf423d2d2c7697d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 24 Oct 2019 10:17:34 +0000 Subject: [PATCH 571/879] build(deps-dev): bump @ember/optional-features from 1.0.0 to 1.1.0 Bumps [@ember/optional-features](https://github.com/emberjs/ember-optional-features) from 1.0.0 to 1.1.0. - [Release notes](https://github.com/emberjs/ember-optional-features/releases) - [Changelog](https://github.com/emberjs/ember-optional-features/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember-optional-features/compare/v1.0.0...v1.1.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index a9c24cf52..7e9310ec1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -843,14 +843,14 @@ resolve "^1.11.1" "@ember/optional-features@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@ember/optional-features/-/optional-features-1.0.0.tgz#8e54ff37f4d9642212b45387f182cf7322aaaab9" - integrity sha512-nPWqiyjkbSLaNd1kA1Y0BYAx+0IzuxdBfOkQyEwNaaB6xvgGpQMiQF/Au5UBlV/S3GEpuL2kFRQj48XMiTBY+w== + version "1.1.0" + resolved "https://registry.yarnpkg.com/@ember/optional-features/-/optional-features-1.1.0.tgz#0ff27ba6e9fc1f1e936e024f6a7cc33a96abffba" + integrity sha512-ST3+gIRH2WtgGcOtf42uM9WaXBY4dj4//zoTYV6GPe8cp0XdJEU63oMo9SbE6+0Efp8lvk96LsX+DVDDZy9Rmw== dependencies: chalk "^2.4.2" co "^4.6.0" ember-cli-version-checker "^3.1.3" - glob "^7.1.4" + glob "^7.1.5" inquirer "^6.5.1" mkdirp "^0.5.1" silent-error "^1.1.1" @@ -8010,10 +8010,10 @@ glob@^5.0.10: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.3, glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: - version "7.1.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== +glob@^7.0.3, glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.5: + version "7.1.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.5.tgz#6714c69bee20f3c3e64c4dd905553e532b40cdc0" + integrity sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" From af2be134be2ac18c3d3fc0dca72b4424d137298a Mon Sep 17 00:00:00 2001 From: Dean M <2848187+deanmraz@users.noreply.github.com> Date: Fri, 25 Oct 2019 04:27:59 -0700 Subject: [PATCH 572/879] Fix functions template (#1793) Based on this issue and pull request fix [here](https://github.com/samselikoff/ember-cli-mirage/issues/1634). The function's documentation should be updated to reflect the use of `function` over `arrow function`. --- .../dummy/app/pods/docs/route-handlers/functions/template.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/dummy/app/pods/docs/route-handlers/functions/template.md b/tests/dummy/app/pods/docs/route-handlers/functions/template.md index 2ceba654a..71f8ecb10 100644 --- a/tests/dummy/app/pods/docs/route-handlers/functions/template.md +++ b/tests/dummy/app/pods/docs/route-handlers/functions/template.md @@ -128,7 +128,7 @@ There are several helpers available when writing function route handlers. This helper returns the JSON for the given Model or Collection after passing it through the Serializer layer. It's useful if you want to do some final munging on the serialized JSON before returning it. ```js -this.get('/movies', (schema) => { +this.get('/movies', function (schema) { let movies = schema.movies.all(); let json = this.serialize(movies); @@ -141,7 +141,7 @@ this.get('/movies', (schema) => { By default this method uses the named serializer for the given Model or Collection. You can pass in a specific serializer name as the second argument: ```js -this.get('/movies', (schema) => { +this.get('/movies', function (schema) { let movies = schema.movies.all(); let json = this.serialize(movies, 'sparse-movie'); From 0ead4fa6d05a05fa2b649ba8c1c54da47c0824bf Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 25 Oct 2019 07:28:31 -0400 Subject: [PATCH 573/879] v1.1.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dfe23d3d4..a5c3b3aba 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "1.1.3", + "version": "1.1.4", "description": "A client-side server to help you build, test and demo your Ember app", "keywords": [ "ember-addon", From 3a0835626e4568e562472d801c4e14a57496cc12 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2019 10:19:11 +0000 Subject: [PATCH 574/879] build(deps-dev): bump qunit-dom from 0.9.0 to 0.9.1 Bumps [qunit-dom](https://github.com/simplabs/qunit-dom) from 0.9.0 to 0.9.1. - [Release notes](https://github.com/simplabs/qunit-dom/releases) - [Changelog](https://github.com/simplabs/qunit-dom/blob/master/CHANGELOG.md) - [Commits](https://github.com/simplabs/qunit-dom/compare/v0.9.0...v0.9.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 7e9310ec1..bcbb44dc2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12144,9 +12144,9 @@ quick-temp@^0.1.0, quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quic underscore.string "~3.3.4" qunit-dom@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-0.9.0.tgz#99d15fffbf06059e543bb93dae8fe0a3f42a27b9" - integrity sha512-MvVEoCcf8BHVPD3gXg5GBfNy3JMZ3U3yOha4MB1rFs698EpvxMprOfC+NMEGvOF9Epm6GrsA0BFOdCKHd8Orrw== + version "0.9.1" + resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-0.9.1.tgz#d861ff8d2402cc7844874a37df85940d62bfbbdf" + integrity sha512-5MOPPjohXSL+4dE5ZmgWgypqF9XMxJBpobwSVzf/9zNS8PKEdJiRlR09R1Wrc38BTf3Ap2f2YPcNh3H6lEOZ6A== dependencies: broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.1" From 02c0fda32d3faddc74d59e283a4485cd538bcec7 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 31 Oct 2019 13:03:45 +0000 Subject: [PATCH 575/879] build(deps-dev): bump eslint-plugin-ember from 7.2.0 to 7.3.0 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 7.2.0 to 7.3.0. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v7.2.0...v7.3.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index bcbb44dc2..61bc944ee 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6715,9 +6715,9 @@ esdoc@pzuraq/esdoc#015a342: taffydb "2.7.2" eslint-plugin-ember@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.2.0.tgz#668e20b2ab3442d6ee3ba18c016f37f794eb0104" - integrity sha512-W2Vtep3sbAkNhZOISv3ofMd1LD9fp0QtLR9088Zw5mZkvM9uSGBSENCZfpWdwhvebruOvGpb1r7F1sjC5Qjs0w== + version "7.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.3.0.tgz#8af2efbedbff376b6da3e080a566eba76180a7df" + integrity sha512-Xx4d+VR6i+/1nuFeNmKSmdXwpl7aCAA1U/fh8ysmopX8d5vFFlBJY5rKP7EQOWe/7hebB6rVn45gAh9Xie4plw== dependencies: "@ember-data/rfc395-data" "^0.0.4" ember-rfc176-data "^0.3.12" From 7725d12bd806269c4250eb326421802008ec1e60 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2019 14:13:57 +0000 Subject: [PATCH 576/879] build(deps-dev): bump jsdom from 15.2.0 to 15.2.1 Bumps [jsdom](https://github.com/jsdom/jsdom) from 15.2.0 to 15.2.1. - [Release notes](https://github.com/jsdom/jsdom/releases) - [Changelog](https://github.com/jsdom/jsdom/blob/master/Changelog.md) - [Commits](https://github.com/jsdom/jsdom/compare/15.2.0...15.2.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index 61bc944ee..a5d18db45 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9269,9 +9269,9 @@ jsdom@^12.0.0: xml-name-validator "^3.0.0" jsdom@^15.0.0: - version "15.2.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.0.tgz#4baead4f464e733533ed6ac607ce440918cf5cbb" - integrity sha512-+hRyEfjRPFwTYMmSQ3/f7U9nP8ZNZmbkmUek760ZpxnCPWJIhaaLRuUSvpJ36fZKCGENxLwxClzwpOpnXNfChQ== + version "15.2.1" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.1.tgz#d2feb1aef7183f86be521b8c6833ff5296d07ec5" + integrity sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g== dependencies: abab "^2.0.0" acorn "^7.1.0" @@ -9283,7 +9283,7 @@ jsdom@^15.0.0: domexception "^1.0.1" escodegen "^1.11.1" html-encoding-sniffer "^1.0.2" - nwsapi "^2.1.4" + nwsapi "^2.2.0" parse5 "5.1.0" pn "^1.1.0" request "^2.88.0" @@ -11125,10 +11125,10 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" integrity sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ== -nwsapi@^2.0.7, nwsapi@^2.0.9, nwsapi@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f" - integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw== +nwsapi@^2.0.7, nwsapi@^2.0.9, nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== oauth-sign@~0.3.0: version "0.3.0" From 97699241abc7770202616591e8b6be83d0a26305 Mon Sep 17 00:00:00 2001 From: Matt Gardner Date: Tue, 5 Nov 2019 09:28:10 -0500 Subject: [PATCH 577/879] Add documention clarifying use of scenarios (#1427) (#1802) --- .../switching-between-scenarios/template.md | 77 +++++++++++++++++++ tests/dummy/app/pods/docs/template.hbs | 1 + tests/dummy/app/router.js | 1 + 3 files changed, 79 insertions(+) create mode 100644 tests/dummy/app/pods/docs/advanced/switching-between-scenarios/template.md diff --git a/tests/dummy/app/pods/docs/advanced/switching-between-scenarios/template.md b/tests/dummy/app/pods/docs/advanced/switching-between-scenarios/template.md new file mode 100644 index 000000000..40e4021a0 --- /dev/null +++ b/tests/dummy/app/pods/docs/advanced/switching-between-scenarios/template.md @@ -0,0 +1,77 @@ +# Switching between scenarios + +Mirage adds a `/scenarios` directory to your project, where you'll find a `default.js` file. +The function in this file will run in development mode and act as your "development seeds". +In testing it's ignored, so that your Mirage server starts out with a clean database. You +can then use each test to seed Mirage as needed for that test. In this way, each test acts +as its own Mirage scenario. + +Originally Mirage was going to add first-class support for development-time scenario switching, +but currently only the `scenarios/default.js` file is used by Mirage. However, you can use various +strategies to configure the behavior of your default scenario, to support multiple development +server states or to facilitate things like running [user acceptance testing](https://en.wikipedia.org/wiki/Acceptance_testing#User_acceptance_testing). +For example, you might want to test whether a user can complete a set of tasks specific to unique circumstances defined in a scenario. + +One strategy you could take is to configure your default scenario file to honor options passed +to the runtime environment. For example, say you wanted to be able to run a scenario file like this: + +```bash +MIRAGE_SCENARIO=some-scenario ember s +``` + +To affect the behavior of `scenarios/default.js`, add the `MIRAGE_SCENARIO` ENV variable to your `environment/config.js`: + +```js +const { MIRAGE_SCENARIO } = process.env; + +module.exports = function(environment) { + const ENV = { + // ...other stuff + + MIRAGE_SCENARIO, + + // ...other stuff + }; + + return ENV; +} +``` + +Then access this new config variable in your `scenarios/default.js` file: + +```js +// scenarios/default.js +import ENV from '../../config/environment'; +import visitor from './visitor'; +import subscriber from './subscriber'; +import administrator from './administrator'; + +const scenarios = { + visitor, + subscriber, + administrator +} + +const activeScenario = ENV.MIRAGE_SCENARIO || 'visitor'; + +export default function(server) { + const scenario = scenarios[activeScenario]; + + if (scenario) { + scenario(server); + } + + // plus whatever default scenario code you want +} +``` + +Like other Mirage objects, all scenario files must export a function like so: + +```js +export default function(server) { + // server.createList('post', 15); +} +``` + +Note that the `server` parameter is not provided by default. + diff --git a/tests/dummy/app/pods/docs/template.hbs b/tests/dummy/app/pods/docs/template.hbs index 35f5740ca..fb36354ed 100644 --- a/tests/dummy/app/pods/docs/template.hbs +++ b/tests/dummy/app/pods/docs/template.hbs @@ -30,6 +30,7 @@ {{nav.item "Simulating cookie responses" "docs.advanced.simulating-cookie-responses"}} {{nav.item "Mocking GUIDs" "docs.advanced.mocking-guids"}} {{nav.item "Customizing the inflector" "docs.advanced.customizing-the-inflector"}} + {{nav.item "Switching between scenarios" "docs.advanced.switching-between-scenarios"}} {{/viewer.nav}} diff --git a/tests/dummy/app/router.js b/tests/dummy/app/router.js index 27cf7ecc4..046ae4b84 100644 --- a/tests/dummy/app/router.js +++ b/tests/dummy/app/router.js @@ -41,6 +41,7 @@ Router.map(function() { this.route('simulating-cookie-responses'); this.route('mocking-guids'); this.route('customizing-the-inflector'); + this.route('switching-between-scenarios'); }); this.route('api', function() { From da49de00732acbd6e657920db443b7c4d8bbc3b3 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 5 Nov 2019 09:32:52 -0500 Subject: [PATCH 578/879] build(deps-dev): bump ember-source from 3.13.3 to 3.14.1 (#1806) Bumps [ember-source](https://github.com/emberjs/ember.js) from 3.13.3 to 3.14.1. - [Release notes](https://github.com/emberjs/ember.js/releases) - [Changelog](https://github.com/emberjs/ember.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember.js/compare/v3.13.3...v3.14.1) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 27 ++++++++++++++------------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index a5c3b3aba..acfc0def2 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "ember-maybe-import-regenerator-for-testing": "^1.0.0", "ember-moment": "^8.0.0", "ember-resolver": "^5.0.1", - "ember-source": "~3.13.2", + "ember-source": "~3.14.1", "ember-source-channel-url": "^2.0.1", "ember-try": "^1.0.0", "escape-string-regexp": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index a5d18db45..df7eb1dff 100644 --- a/yarn.lock +++ b/yarn.lock @@ -413,10 +413,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-block-scoping@^7.2.0", "@babel/plugin-transform-block-scoping@^7.4.4", "@babel/plugin-transform-block-scoping@^7.5.5": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.2.tgz#96c33ab97a9ae500cc6f5b19e04a7e6553360a79" - integrity sha512-zZT8ivau9LOQQaOGC7bQLQOT4XPkPXgN2ERfUgk1X8ql+mVkLc4E8eKk+FO3o0154kxzqenWCorfmEXpEZcrSQ== +"@babel/plugin-transform-block-scoping@^7.2.0", "@babel/plugin-transform-block-scoping@^7.5.5", "@babel/plugin-transform-block-scoping@^7.6.0": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz#6e854e51fbbaa84351b15d4ddafe342f3a5d542a" + integrity sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.13" @@ -5506,7 +5506,7 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.0, ember-cli-babel@^7.7.3, ember-cli-babel@^7.8.0: +ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3, ember-cli-babel@^7.8.0: version "7.12.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.12.0.tgz#064997d199384be8c88d251f30ef67953d3bddc5" integrity sha512-+EGQsbPvh19nNXHCm6rVBx2CdlxQlzxMyhey5hsGViDPriDI4PFYXYaFWdGizDrmZoDcG/Ywpeph3hl0NxGQTg== @@ -6393,22 +6393,22 @@ ember-source-channel-url@^2.0.1: dependencies: got "^8.0.1" -ember-source@~3.13.2: - version "3.13.3" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.13.3.tgz#65794f79dec0512d833332575f13c77f9ccae2a1" - integrity sha512-aDmzAwpCa4H6ozd+RbsQs9/Pfo4wbnDVe9eb2D05PH9W6zRpiUa+pTluJsUFDfbi+jYGPQnjty2U/UQYBayFvg== +ember-source@~3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.14.1.tgz#f11f98dffa7b169a045590203fa15c3ad2098c34" + integrity sha512-UvgjF/I7jANBEjQWdxtL/luXn97ZtIL3QCsJnR7HIcwRg7JuIyz/kaT9gLOGMxWEnwu610gJ+Ic0h0dkgQqg2w== dependencies: "@babel/helper-module-imports" "^7.0.0" - "@babel/plugin-transform-block-scoping" "^7.4.4" + "@babel/plugin-transform-block-scoping" "^7.6.0" "@babel/plugin-transform-object-assign" "^7.2.0" "@ember/edition-utils" "^1.1.1" babel-plugin-debug-macros "^0.3.3" babel-plugin-filter-imports "^3.0.0" - broccoli-concat "^3.7.3" + broccoli-concat "^3.7.4" broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.2" chalk "^2.4.2" - ember-cli-babel "^7.7.0" + ember-cli-babel "^7.11.0" ember-cli-get-component-path-option "^1.0.0" ember-cli-is-package-missing "^1.0.0" ember-cli-normalize-entity-name "^1.0.0" @@ -6419,6 +6419,7 @@ ember-source@~3.13.2: inflection "^1.12.0" jquery "^3.4.1" resolve "^1.11.1" + semver "^6.1.1" silent-error "^1.1.1" ember-svg-jar@^2.1.0: @@ -12991,7 +12992,7 @@ semver@^4.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= -semver@^6.0.0, semver@^6.1.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== From 8c7772280265a79b55f68537bb1303cf031bb478 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 5 Nov 2019 09:34:11 -0500 Subject: [PATCH 579/879] build(deps-dev): bump ember-composable-helpers from 2.4.0 to 3.0.1 (#1805) Bumps [ember-composable-helpers](https://github.com/DockYard/ember-composable-helpers) from 2.4.0 to 3.0.1. - [Release notes](https://github.com/DockYard/ember-composable-helpers/releases) - [Commits](https://github.com/DockYard/ember-composable-helpers/compare/v2.4.0...v3.0.1) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index acfc0def2..d5a833ee8 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "ember-cli-release": "^0.2.9", "ember-cli-sri": "^2.1.1", "ember-cli-uglify": "^3.0.0", - "ember-composable-helpers": "^2.1.0", + "ember-composable-helpers": "^3.0.1", "ember-data": "~3.13.1", "ember-disable-prototype-extensions": "^1.1.3", "ember-export-application-global": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index df7eb1dff..300f23745 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6130,6 +6130,16 @@ ember-composable-helpers@^2.1.0: ember-cli-babel "^7.1.0" resolve "^1.10.0" +ember-composable-helpers@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-3.0.1.tgz#a9fbc1f5ea6346fa0b2a912e56d3d8c73ef1fc00" + integrity sha512-2Q2oxr7K0qclxUzUCdWBUvqWxRF9ZghcZi76Dgfh2CNjXGG+v+0Y816yDGLOYYBZmqtqAdl/Js0esVifLXZn2A== + dependencies: + "@babel/core" "^7.0.0" + broccoli-funnel "2.0.1" + ember-cli-babel "^7.1.0" + resolve "^1.10.0" + "ember-concurrency@^0.9.0 || ^0.10.0 || ^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-1.0.0.tgz#3b650672fdd5dc1d45007626119135829076c2b6" From cd6e03a434878ff906a151e0424cdbba51772ea7 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 5 Nov 2019 17:13:16 +0000 Subject: [PATCH 580/879] build(deps-dev): bump ember-load-initializers from 2.1.0 to 2.1.1 Bumps [ember-load-initializers](https://github.com/ember-cli/ember-load-initializers) from 2.1.0 to 2.1.1. - [Release notes](https://github.com/ember-cli/ember-load-initializers/releases) - [Changelog](https://github.com/ember-cli/ember-load-initializers/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-load-initializers/compare/v2.1.0...v2.1.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index 300f23745..00021290a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5506,7 +5506,7 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3, ember-cli-babel@^7.8.0: +ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3, ember-cli-babel@^7.8.0: version "7.12.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.12.0.tgz#064997d199384be8c88d251f30ef67953d3bddc5" integrity sha512-+EGQsbPvh19nNXHCm6rVBx2CdlxQlzxMyhey5hsGViDPriDI4PFYXYaFWdGizDrmZoDcG/Ywpeph3hl0NxGQTg== @@ -6271,12 +6271,12 @@ ember-keyboard@^4.0.0: ember-cli-babel "^6.6.0" ember-load-initializers@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-2.1.0.tgz#b402815ab9c823ff48a1369b52633721987e72d4" - integrity sha512-zvcq35U2EPyjonCPdDBISZbeuxP3OXf+asmj2bNucFwo1ej7gYJCJacy6N8oABEG2EmrU/8jMDoZndWIAGn0cQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-2.1.1.tgz#d1a8bead00bc44222b0ab181840869992beb30f5" + integrity sha512-Ho5sBeaZPN3HmZkYkcLrjSBF3DTNmzC5h0DizzDj8cjpnCvaqeofphJDnH41k6kLv/QHMk4pMRISPcwc+bOceQ== dependencies: - ember-cli-babel "^7.10.0" - ember-cli-typescript "^2.0.0" + ember-cli-babel "^7.11.0" + ember-cli-typescript "^2.0.2" ember-macro-helpers@^4.2.2: version "4.2.2" From cf55207028dcda1b1b674a4966f92c636e0e7194 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 7 Nov 2019 10:14:55 +0000 Subject: [PATCH 581/879] build(deps-dev): bump eslint-plugin-ember from 7.3.0 to 7.4.0 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 7.3.0 to 7.4.0. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v7.3.0...v7.4.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 00021290a..262ae246d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6726,9 +6726,9 @@ esdoc@pzuraq/esdoc#015a342: taffydb "2.7.2" eslint-plugin-ember@^7.0.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.3.0.tgz#8af2efbedbff376b6da3e080a566eba76180a7df" - integrity sha512-Xx4d+VR6i+/1nuFeNmKSmdXwpl7aCAA1U/fh8ysmopX8d5vFFlBJY5rKP7EQOWe/7hebB6rVn45gAh9Xie4plw== + version "7.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.4.0.tgz#f2ee11f691ea17661712800e5e91e771ee923d5d" + integrity sha512-KLMv47p4ZYR96ps3kNW8bJArBTO6lhib3dUBY8JyEWco7/wqGd5Kj2tBlgWJTqjXRiu7A591pGOFxEwp8ZpzDw== dependencies: "@ember-data/rfc395-data" "^0.0.4" ember-rfc176-data "^0.3.12" From 7b3ee3aa2459bb80d0191b4f00cf58f329b37612 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 8 Nov 2019 10:18:31 +0000 Subject: [PATCH 582/879] build(deps-dev): bump eslint-plugin-ember from 7.4.0 to 7.4.1 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 7.4.0 to 7.4.1. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v7.4.0...v7.4.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 262ae246d..463963e97 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6726,9 +6726,9 @@ esdoc@pzuraq/esdoc#015a342: taffydb "2.7.2" eslint-plugin-ember@^7.0.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.4.0.tgz#f2ee11f691ea17661712800e5e91e771ee923d5d" - integrity sha512-KLMv47p4ZYR96ps3kNW8bJArBTO6lhib3dUBY8JyEWco7/wqGd5Kj2tBlgWJTqjXRiu7A591pGOFxEwp8ZpzDw== + version "7.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.4.1.tgz#d205cfb16f7614076a771a5b33907a160cec1893" + integrity sha512-QPpdTDrlcP5uj7pDuBBFyzTZdQt+ySWV2AQw9n2NfCRNPW10mMyI+Cs027Jb+jGl3RUISBZeCodPUW7fQR4ERg== dependencies: "@ember-data/rfc395-data" "^0.0.4" ember-rfc176-data "^0.3.12" From 9a4baef6a1cd34363b8799dd47174dd71b117717 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 11 Nov 2019 11:50:52 +0000 Subject: [PATCH 583/879] build(deps-dev): bump ember-composable-helpers from 3.0.1 to 3.0.2 Bumps [ember-composable-helpers](https://github.com/DockYard/ember-composable-helpers) from 3.0.1 to 3.0.2. - [Release notes](https://github.com/DockYard/ember-composable-helpers/releases) - [Commits](https://github.com/DockYard/ember-composable-helpers/compare/v3.0.1...v3.0.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 463963e97..4f6656b41 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6131,9 +6131,9 @@ ember-composable-helpers@^2.1.0: resolve "^1.10.0" ember-composable-helpers@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-3.0.1.tgz#a9fbc1f5ea6346fa0b2a912e56d3d8c73ef1fc00" - integrity sha512-2Q2oxr7K0qclxUzUCdWBUvqWxRF9ZghcZi76Dgfh2CNjXGG+v+0Y816yDGLOYYBZmqtqAdl/Js0esVifLXZn2A== + version "3.0.2" + resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-3.0.2.tgz#7deb3cb72bd0ba14097378d4b35b6f89950a1c0f" + integrity sha512-XQEBjEIKi8hDV3TfjD7AGNLpzjMoWqXliBQ3A0k/OP1SAP2iW5wRwiNkKuInVtwZZjMBGJt0NUBT60M8TJwxOg== dependencies: "@babel/core" "^7.0.0" broccoli-funnel "2.0.1" From c4fe32813634fdfb12ddda1fc7bd657ce47c83eb Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 12 Nov 2019 10:17:59 +0000 Subject: [PATCH 584/879] build(deps-dev): bump qunit-dom from 0.9.1 to 0.9.2 Bumps [qunit-dom](https://github.com/simplabs/qunit-dom) from 0.9.1 to 0.9.2. - [Release notes](https://github.com/simplabs/qunit-dom/releases) - [Changelog](https://github.com/simplabs/qunit-dom/blob/master/CHANGELOG.md) - [Commits](https://github.com/simplabs/qunit-dom/compare/v0.9.1...v0.9.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4f6656b41..aacce56cd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12155,9 +12155,9 @@ quick-temp@^0.1.0, quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quic underscore.string "~3.3.4" qunit-dom@^0.9.0: - version "0.9.1" - resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-0.9.1.tgz#d861ff8d2402cc7844874a37df85940d62bfbbdf" - integrity sha512-5MOPPjohXSL+4dE5ZmgWgypqF9XMxJBpobwSVzf/9zNS8PKEdJiRlR09R1Wrc38BTf3Ap2f2YPcNh3H6lEOZ6A== + version "0.9.2" + resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-0.9.2.tgz#cc7bb777e4f5faa749eca843f54e199755df8473" + integrity sha512-BPf7OZjhXo9ekgsViNjQVS9BWkm2yQsPvBoy0juvt5nOFlcBVVwHSYsgpsJOunWkI1IgA3eStAC9mQx3Zw734g== dependencies: broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.1" From 69b9d21309729460e75fedeb0b35db02fb290e27 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 12 Nov 2019 10:18:48 +0000 Subject: [PATCH 585/879] build(deps-dev): bump ember-try from 1.2.1 to 1.3.0 Bumps [ember-try](https://github.com/ember-cli/ember-try) from 1.2.1 to 1.3.0. - [Release notes](https://github.com/ember-cli/ember-try/releases) - [Changelog](https://github.com/ember-cli/ember-try/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-try/compare/v1.2.1...v1.3.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4f6656b41..dacca46b0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6481,9 +6481,9 @@ ember-try-config@^3.0.0: semver "^5.5.0" ember-try@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ember-try/-/ember-try-1.2.1.tgz#4118521ec3658ebeed542b426020939935bd0f26" - integrity sha512-/10g+5bvGNBoN3uN+MMGxidUj4bw0ne453aphjeFf4T/ZF1UoFTPZ8JV+g4XhdVL49zAoeTOLpsbwV0D1M+X6w== + version "1.3.0" + resolved "https://registry.yarnpkg.com/ember-try/-/ember-try-1.3.0.tgz#394bdcd726e5acd2ebf8422c7bcf9ecf0aa2c2ac" + integrity sha512-XtVhBHNQVdVu5LouyNLhGeKx0f88lz9VtrSf1NYFulVlOHIQEeZCEIs3pTifGhtZJ0B7POPKMdPpNso77Z95uQ== dependencies: chalk "^2.4.2" cli-table3 "^0.5.1" From 97f55e981cecc19ccf8e1b4d95fd27bcf5ea2d97 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Wed, 20 Nov 2019 17:51:28 +0100 Subject: [PATCH 586/879] Add "Mirage logging" checkbox to QUnit user interface (#1818) * Add "Mirage logging" checkbox to QUnit user interface * Simplify `treeFor()` implementation * Use original `vendor` tree unconditionally This allows us to import the `add-qunit-option.js` file in the `included()` hook. This should not change anything else since we don't use the vendor folder/tree anywhere else. --- addon/server.js | 5 +++++ index.js | 14 +++++++------- package.json | 3 +++ vendor/add-qunit-option.js | 8 ++++++++ 4 files changed, 23 insertions(+), 7 deletions(-) create mode 100644 vendor/add-qunit-option.js diff --git a/addon/server.js b/addon/server.js index 6683704f0..65e6a8fcd 100644 --- a/addon/server.js +++ b/addon/server.js @@ -16,6 +16,11 @@ export default class EmberServer extends Server { } super(options); + + + if (typeof location !== 'undefined' && location.search.indexOf('mirageLogging') !== -1) { + this.logging = true; + } } } diff --git a/index.js b/index.js index dab938280..5928a9d89 100644 --- a/index.js +++ b/index.js @@ -39,6 +39,8 @@ module.exports = { } else { this.mirageDirectory = path.join(this.app.project.root, '/mirage'); } + + this.import('vendor/add-qunit-option.js', { type: 'test' }); }, blueprintsPath() { @@ -46,22 +48,20 @@ module.exports = { }, treeFor(name) { - let tree; let shouldIncludeFiles = this._shouldIncludeFiles(); + if (shouldIncludeFiles || name === 'vendor') { + return this._super.treeFor.apply(this, arguments); + } - if (!shouldIncludeFiles && name === 'app') { + if (name === 'app') { // Include a noop initializer, even if Mirage is excluded from the build - tree = writeFile('initializers/ember-cli-mirage.js', ` + return writeFile('initializers/ember-cli-mirage.js', ` export default { name: 'ember-cli-mirage', initialize() {} }; `); - } else if (shouldIncludeFiles) { - tree = this._super.treeFor.apply(this, arguments); } - - return tree; }, _lintMirageTree(mirageTree) { diff --git a/package.json b/package.json index d5a833ee8..76ed239ee 100644 --- a/package.json +++ b/package.json @@ -108,6 +108,9 @@ "configPath": "tests/dummy/config", "before": [ "ember-cli-babel" + ], + "after": [ + "ember-qunit" ] } } diff --git a/vendor/add-qunit-option.js b/vendor/add-qunit-option.js new file mode 100644 index 000000000..db868ec70 --- /dev/null +++ b/vendor/add-qunit-option.js @@ -0,0 +1,8 @@ +(function() { + if (typeof QUnit !== 'undefined') { + QUnit.config.urlConfig.push({ + id: 'mirageLogging', + label: 'Mirage logging', + }); + } +})(); From 2accab7825878a8d80fa0b31ee0446d3fcc5410d Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 22 Nov 2019 21:22:50 -0500 Subject: [PATCH 587/879] Pin ember-data (#1823) https://github.com/miragejs/ember-cli-mirage/pull/1738, part deux --- package.json | 3 ++- yarn.lock | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 76ed239ee..2f8336820 100644 --- a/package.json +++ b/package.json @@ -99,7 +99,8 @@ }, "resolutions": { "favicons": "5.3.0", - "ember-auto-import/**/terser-webpack-plugin": "1.2.1" + "ember-auto-import/**/terser-webpack-plugin": "1.2.1", + "ember-data": "3.13.1" }, "engines": { "node": "6.* || 8.* || >= 10.*" diff --git a/yarn.lock b/yarn.lock index 592f18fd0..a404b0ff5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6157,7 +6157,7 @@ ember-copy@^1.0.0: dependencies: ember-cli-babel "^6.6.0" -"ember-data@2.x - 3.x", ember-data@~3.13.1: +"ember-data@2.x - 3.x", ember-data@3.13.1, ember-data@~3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.13.1.tgz#a6b31703de9feaae19f2a0fccfc72185808174dd" integrity sha512-1mxmnvwWXjqfjGXwukHhArJvH829pEdWXiOnZXIDLC2K1PfFHkXxBjONlssGRBPI2rS4Oaa2M6/47uAyZ4mkEA== From 3023242039e2ac2ab89452b8a9bdda58bbec6351 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 22 Nov 2019 21:23:03 -0500 Subject: [PATCH 588/879] Remove unused deps (#1820) --- package.json | 12 +- test-projects/01-basic-app/package.json | 1 - .../02-app-that-excludes-mirage/package.json | 1 - yarn.lock | 268 +----------------- 4 files changed, 11 insertions(+), 271 deletions(-) diff --git a/package.json b/package.json index 2f8336820..859cc9d06 100644 --- a/package.json +++ b/package.json @@ -35,31 +35,25 @@ "prepare": "./scripts/link.sh" }, "dependencies": { - "miragejs": "^0.1.31", "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^2.0.1", "broccoli-merge-trees": "^3.0.2", - "broccoli-string-replace": "^0.1.2", - "chalk": "^2.4.2", "ember-auto-import": "^1.2.19", "ember-cli-babel": "^7.5.0", "ember-get-config": "^0.2.2", "ember-inflector": "^2.0.0 || ^3.0.0", - "lodash-es": "^4.17.11" + "lodash-es": "^4.17.11", + "miragejs": "^0.1.31" }, "devDependencies": { "@ember/jquery": "^1.1.0", "@ember/optional-features": "^1.0.0", - "active-model-adapter": "^2.0.3", "babel-eslint": "^9.0.0", "broccoli-asset-rev": "^3.0.0", - "broccoli-test-helper": "^2.0.0", - "chai": "^4.1.0", "ember-ajax": "^5.0.0", "ember-cli": "~3.4.4", "ember-cli-addon-docs": "^0.6.13", "ember-cli-addon-docs-esdoc": "^0.2.3", - "ember-cli-app-version": "^3.2.0", "ember-cli-dependency-checker": "^3.0.0", "ember-cli-deploy": "^1.0.2", "ember-cli-deploy-build": "^2.0.0", @@ -69,11 +63,9 @@ "ember-cli-fastboot": "^2.0.4", "ember-cli-favicon": "^2.0.0", "ember-cli-htmlbars": "^4.0.5", - "ember-cli-htmlbars-inline-precompile": "^3.0.0", "ember-cli-inject-live-reload": "^2.0.1", "ember-cli-moment-shim": "^3.7.1", "ember-cli-qunit": "^4.4.0", - "ember-cli-release": "^0.2.9", "ember-cli-sri": "^2.1.1", "ember-cli-uglify": "^3.0.0", "ember-composable-helpers": "^3.0.1", diff --git a/test-projects/01-basic-app/package.json b/test-projects/01-basic-app/package.json index 6dc242131..3ee8e2922 100644 --- a/test-projects/01-basic-app/package.json +++ b/test-projects/01-basic-app/package.json @@ -28,7 +28,6 @@ "ember-cli-eslint": "*", "ember-cli-fastboot": "*", "ember-cli-htmlbars": "*", - "ember-cli-htmlbars-inline-precompile": "*", "ember-cli-inject-live-reload": "*", "ember-cli-mirage": "*", "ember-cli-qunit": "*", diff --git a/test-projects/02-app-that-excludes-mirage/package.json b/test-projects/02-app-that-excludes-mirage/package.json index 0e6ec44fe..d94d8450e 100644 --- a/test-projects/02-app-that-excludes-mirage/package.json +++ b/test-projects/02-app-that-excludes-mirage/package.json @@ -27,7 +27,6 @@ "ember-cli-eslint": "*", "ember-cli-fastboot": "*", "ember-cli-htmlbars": "*", - "ember-cli-htmlbars-inline-precompile": "*", "ember-cli-inject-live-reload": "*", "ember-cli-mirage": "*", "ember-cli-qunit": "*", diff --git a/yarn.lock b/yarn.lock index a404b0ff5..a687a6e77 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1454,11 +1454,6 @@ resolved "https://registry.yarnpkg.com/@types/symlink-or-copy/-/symlink-or-copy-1.2.0.tgz#4151a81b4052c80bc2becbae09f3a9ec010a9c7a" integrity sha512-Lja2xYuuf2B3knEsga8ShbOdsfNOtzT73GyJmZyY7eGl2+ajOqrs8yM5ze0fsSoYwvA6bw7/Qr7OZ7PEEmYwWg== -"@types/tmp@^0.0.33": - version "0.0.33" - resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.0.33.tgz#1073c4bc824754ae3d10cfab88ab0237ba964e4d" - integrity sha1-EHPEvIJHVK49EM+riKsCN7qWTk0= - "@webassemblyjs/ast@1.7.11": version "1.7.11" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" @@ -1700,14 +1695,6 @@ acorn@^7.0.0, acorn@^7.1.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== -active-model-adapter@^2.0.3: - version "2.2.0" - resolved "https://registry.yarnpkg.com/active-model-adapter/-/active-model-adapter-2.2.0.tgz#6885d6968574809f17f398c499b688a921c30f91" - integrity sha512-hflmeFKGiKXZtqPJ5pGbjUOCCIDWi2aFC7Q4htNi+FbLvI+8lBqjpDxiHgL82HmDF/CVVZGFQ2y0MROTxgC58g== - dependencies: - ember-cli-babel "^6.8.2" - ember-inflector "^2.0.0" - after@0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" @@ -1996,11 +1983,6 @@ assert@^1.1.1: dependencies: util "0.10.3" -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -2368,11 +2350,6 @@ babel-plugin-htmlbars-inline-precompile@^1.0.0: resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-1.0.0.tgz#a9d2f6eaad8a3f3d361602de593a8cbef8179c22" integrity sha512-4jvKEHR1bAX03hBDZ94IXsYCj3bwk9vYsn6ux6JZNL2U5pvzCWjqyrGahfsGNrhERyxw8IqcirOi9Q6WCo3dkQ== -babel-plugin-htmlbars-inline-precompile@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-2.1.1.tgz#59edd4eab28d27fbafa26d51bc19795278d103a9" - integrity sha512-obo5//IFrEZNAQovcXxOXLn5nwkQ0Y+xhR7AMg1sYR6W7KxQLZI9/XzbIytVhjwwY+Bd2e0+qyHEplJbHyZ1Og== - babel-plugin-htmlbars-inline-precompile@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-3.0.0.tgz#95aa0d2379347cda9a7127c028fe35cb39179fa2" @@ -3408,7 +3385,7 @@ broccoli-node-api@^1.6.0: resolved "https://registry.yarnpkg.com/broccoli-node-api/-/broccoli-node-api-1.7.0.tgz#391aa6edecd2a42c63c111b4162956b2fa288cb6" integrity sha512-QIqLSVJWJUVOhclmkmypJJH9u9s/aWH4+FH6Q6Ju5l+Io4dtwqdPUNmDfw40o6sxhbZHhqGujDJuHTML1wG8Yw== -broccoli-node-info@1.1.0, broccoli-node-info@^1.1.0: +broccoli-node-info@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-1.1.0.tgz#3aa2e31e07e5bdb516dd25214f7c45ba1c459412" integrity sha1-OqLjHgflvbUW3SUhT3xFuhxFlBI= @@ -3649,18 +3626,6 @@ broccoli-templater@^2.0.1: rimraf "^2.6.2" walk-sync "^0.3.3" -broccoli-test-helper@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/broccoli-test-helper/-/broccoli-test-helper-2.0.0.tgz#1cfbb76f7e856ad8df96d55ee2f5e0dddddf5d4f" - integrity sha512-TKwh8dBT+RcxKEG+vAoaRRhZsCMwZIHPZbCzBNCA0nUi1aoFB/LVosqwMC6H9Ipe06FxY5hpQxDLFbnBMdUPsA== - dependencies: - "@types/tmp" "^0.0.33" - broccoli "^2.0.0" - fixturify "^0.3.2" - fs-tree-diff "^0.5.9" - tmp "^0.0.33" - walk-sync "^0.3.3" - broccoli-uglify-sourcemap@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/broccoli-uglify-sourcemap/-/broccoli-uglify-sourcemap-3.1.0.tgz#424abcb2c1c70fd1857165c5f191d59a37ee33ff" @@ -3686,30 +3651,6 @@ broccoli-writer@~0.1.1: quick-temp "^0.1.0" rsvp "^3.0.6" -broccoli@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/broccoli/-/broccoli-2.0.1.tgz#3611d643bf4b2666b565dc24cc5307fc80f62bf6" - integrity sha512-ipHuKVjO8jPJE3DKFHLXlj8DcsbGH8OQ1DlHaAWfuQya1qe6lgEi1+kyeKWCccaJlEtEq40EQ50Eiq2M0hxOfQ== - dependencies: - broccoli-node-info "1.1.0" - broccoli-slow-trees "^3.0.1" - broccoli-source "^1.1.0" - commander "^2.15.1" - connect "^3.6.6" - findup-sync "^2.0.0" - handlebars "^4.0.11" - heimdalljs "^0.2.5" - heimdalljs-logger "^0.1.9" - mime-types "^2.1.19" - promise.prototype.finally "^3.1.0" - resolve-path "^1.4.0" - rimraf "^2.6.2" - sane "^4.0.0" - tmp "0.0.33" - tree-sync "^1.2.2" - underscore.string "^3.2.2" - watch-detector "^0.1.0" - brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -4062,18 +4003,6 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chai@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" - integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^3.0.1" - get-func-name "^2.0.0" - pathval "^1.1.0" - type-detect "^4.0.5" - chalk@^1.0.0, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -4111,11 +4040,6 @@ charm@^1.0.0: dependencies: inherits "^2.0.1" -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= - cheerio@0.20.0: version "0.20.0" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.20.0.tgz#5c710f2bab95653272842ba01c6ea61b3545ec35" @@ -4459,11 +4383,6 @@ commander@^2.11.0, commander@~2.17.1: resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== -commander@^2.15.1: - version "2.19.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" - integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== - commander@^2.19.0: version "2.20.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" @@ -4560,16 +4479,6 @@ configstore@^4.0.0: write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" -connect@^3.6.6: - version "3.6.6" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" - integrity sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ= - dependencies: - debug "2.6.9" - finalhandler "1.1.0" - parseurl "~1.3.2" - utils-merge "1.0.1" - console-browserify@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" @@ -4992,13 +4901,6 @@ decompress-response@^3.3.0: dependencies: mimic-response "^1.0.0" -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - dependencies: - type-detect "^4.0.0" - deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -5439,14 +5341,6 @@ ember-cli-addon-docs@^0.6.13: walk-sync "^0.3.3" yuidocjs "^0.10.2" -ember-cli-app-version@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ember-cli-app-version/-/ember-cli-app-version-3.2.0.tgz#7b9ad0e1b63ae0518648356ee24c703e922bc26e" - integrity sha512-fHWOJElSw8JL03FNCHrT0RdWhGpWEQ4VQ10unEwwhVZ+OANNcOLz8O2dA3D5iuB4bb0fMLwjEwYZGM62+TBs1Q== - dependencies: - ember-cli-babel "^6.12.0" - git-repo-version "^1.0.2" - ember-cli-autoprefixer@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/ember-cli-autoprefixer/-/ember-cli-autoprefixer-0.8.1.tgz#071dd9574451057b03dcc03b71f5bd9cb07ef332" @@ -5487,7 +5381,7 @@ ember-cli-babel@7.7.3: ensure-posix-path "^1.0.2" semver "^5.5.0" -ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.7.2, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2: +ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.7.2, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2: version "6.18.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz#3f6435fd275172edeff2b634ee7b29ce74318957" integrity sha512-7ceC8joNYxY2wES16iIBlbPSxwKDBhYwC8drU3ZEvuPDMwVv1KzxCNu1fvxyFEBWhwaRNTUxSCsEVoTd9nosGA== @@ -5706,18 +5600,6 @@ ember-cli-htmlbars-inline-precompile@^2.1.0: heimdalljs-logger "^0.1.9" silent-error "^1.1.0" -ember-cli-htmlbars-inline-precompile@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-3.0.1.tgz#dc1f6fbc3bb5e51d01ca334e692c7f0b5e298d57" - integrity sha512-mLGJjxEPiOFty9HVM7LHg+5cfM1M9lwbEBmlanZMM333cnwvgZulKjTYU0/e0tpWDvNvPdX8rM+/Leh0TIrqqA== - dependencies: - babel-plugin-htmlbars-inline-precompile "^2.1.0" - ember-cli-version-checker "^3.1.3" - hash-for-dep "^1.5.1" - heimdalljs-logger "^0.1.9" - semver "^6.3.0" - silent-error "^1.1.0" - ember-cli-htmlbars@^2.0.1, ember-cli-htmlbars@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.4.tgz#0bcda483f14271663c38756e1fd1cb89da6a50cf" @@ -5848,21 +5730,6 @@ ember-cli-qunit@^4.4.0: ember-cli-babel "^6.11.0" ember-qunit "^3.5.0" -ember-cli-release@^0.2.9: - version "0.2.9" - resolved "https://registry.yarnpkg.com/ember-cli-release/-/ember-cli-release-0.2.9.tgz#5e8de3d034c65597933748023058470ec1231adb" - integrity sha1-Xo3j0DTGVZeTN0gCMFhHDsEjGts= - dependencies: - chalk "^1.0.0" - git-tools "^0.1.4" - make-array "^0.1.2" - merge "^1.2.0" - moment-timezone "^0.3.0" - nopt "^3.0.3" - rsvp "^3.0.17" - semver "^4.3.1" - silent-error "^1.0.0" - ember-cli-sass@10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/ember-cli-sass/-/ember-cli-sass-10.0.0.tgz#700094ebaf348896111756c2644f1e444b05323c" @@ -6248,13 +6115,6 @@ ember-ignore-children-helper@^1.0.1: dependencies: ember-cli-babel "^6.8.2" -ember-inflector@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-2.1.0.tgz#afcb92d022a4eab58f08ff4578eafc3a1de2d09b" - integrity sha512-o7X+MdPuMgH6GGP8JsZ6mr+WYiCcymzjPLr0ct2IUw4lh1EwVtmePuY6fBLuWmyQE1nJq4smDyNoOCE74n3f7g== - dependencies: - ember-cli-babel "^6.0.0" - "ember-inflector@^2.0.0 || ^3.0.0", ember-inflector@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-3.0.1.tgz#04be6df4d7e4000f6d6bd70787cdc995f77be4ab" @@ -6636,7 +6496,7 @@ es-abstract@^1.12.0: string.prototype.trimleft "^2.0.0" string.prototype.trimright "^2.0.0" -es-abstract@^1.5.1, es-abstract@^1.9.0: +es-abstract@^1.5.1: version "1.13.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== @@ -6950,11 +6810,6 @@ exec-sh@^0.2.0: dependencies: merge "^1.1.3" -exec-sh@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" - integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg== - execa@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" @@ -7522,7 +7377,7 @@ find-yarn-workspace-root@^1.1.0: fs-extra "^4.0.3" micromatch "^3.1.4" -findup-sync@2.0.0, findup-sync@^2.0.0: +findup-sync@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= @@ -7551,7 +7406,7 @@ fixturify-project@^1.5.3: fixturify "^0.3.4" tmp "^0.0.33" -fixturify@^0.3.2, fixturify@^0.3.4: +fixturify@^0.3.4: version "0.3.4" resolved "https://registry.yarnpkg.com/fixturify/-/fixturify-0.3.4.tgz#c676de404a7f8ee8e64d0b76118e62ec95ab7b25" integrity sha512-Gx+KSB25b6gMc4bf7UFRTA85uE0iZR+RYur0JHh6dg4AGBh0EksOv4FCHyM7XpGmiJO7Bc7oV7vxENQBT+2WEQ== @@ -7860,11 +7715,6 @@ get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= - get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" @@ -7937,30 +7787,11 @@ git-read-pkt-line@0.0.8: bops "0.0.3" through "~2.2.7" -git-repo-info@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-1.4.1.tgz#2a072823254aaf62fcf0766007d7b6651bd41943" - integrity sha1-KgcoIyVKr2L88HZgB9e2ZRvUGUM= - git-repo-info@^2.0.0, git-repo-info@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-2.1.0.tgz#13d1f753c75bc2994432e65a71e35377ff563813" integrity sha512-+kigfDB7j3W80f74BoOUX+lKOmf4pR3/i2Ww6baKTCPe2hD4FRdjhV3s4P5Dy0Tak1uY1891QhKoYNtnyX2VvA== -git-repo-version@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/git-repo-version/-/git-repo-version-1.0.2.tgz#2c8e9bee5d970cafc0dd58480f9dc56d9afe8e4f" - integrity sha512-OPtwtHx9E8/rTMcWT+BU6GNj6Kq/O40bHJZaZAGy+pN2RXGmeKcfr0ix4M+SQuFY8vl5L/wfPSGOAtvUT/e3Qg== - dependencies: - git-repo-info "^1.4.1" - -git-tools@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/git-tools/-/git-tools-0.1.4.tgz#5e43e59443b8a5dedb39dba663da49e79f943978" - integrity sha1-XkPllEO4pd7bOdumY9pJ55+UOXg= - dependencies: - spawnback "~1.0.0" - git-transport-protocol@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/git-transport-protocol/-/git-transport-protocol-0.1.0.tgz#99f4dd6389b9161eded74a9e617d6ba5ed0a6c2c" @@ -10257,11 +10088,6 @@ magic-string@^0.24.0: dependencies: sourcemap-codec "^1.4.1" -make-array@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/make-array/-/make-array-0.1.2.tgz#335e36ebb0c5a43154d21213a1ecaeae2a1bb3ef" - integrity sha1-M14267DFpDFU0hIToeyuriobs+8= - make-dir@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51" @@ -10490,7 +10316,7 @@ merge-trees@^2.0.0: fs-updater "^1.0.4" heimdalljs "^0.2.5" -merge@^1.1.3, merge@^1.2.0: +merge@^1.1.3: version "1.2.1" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== @@ -10575,11 +10401,6 @@ mime-db@~1.30.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" integrity sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE= -mime-db@~1.38.0: - version "1.38.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad" - integrity sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg== - mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16: version "2.1.17" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" @@ -10594,13 +10415,6 @@ mime-types@^2.1.18, mime-types@~2.1.18, mime-types@~2.1.19: dependencies: mime-db "~1.37.0" -mime-types@^2.1.19: - version "2.1.22" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.22.tgz#fe6b355a190926ab7698c9a0556a11199b2199bd" - integrity sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog== - dependencies: - mime-db "~1.38.0" - mime-types@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-1.0.2.tgz#995ae1392ab8affcbfcb2641dd054e943c0d5dce" @@ -10758,13 +10572,6 @@ mktemp@~0.4.0: resolved "https://registry.yarnpkg.com/mktemp/-/mktemp-0.4.0.tgz#6d0515611c8a8c84e484aa2000129b98e981ff0b" integrity sha1-bQUVYRyKjITkhKogABKbmOmB/ws= -moment-timezone@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.3.1.tgz#3ef47856b02d53b718a10a5ec2023aa299e07bf5" - integrity sha1-PvR4VrAtU7cYoQpewgI6opnge/U= - dependencies: - moment ">= 2.6.0" - moment-timezone@^0.5.13: version "0.5.23" resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.23.tgz#7cbb00db2c14c71b19303cb47b0fb0a6d8651463" @@ -10772,11 +10579,6 @@ moment-timezone@^0.5.13: dependencies: moment ">= 2.9.0" -"moment@>= 2.6.0": - version "2.23.0" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.23.0.tgz#759ea491ac97d54bac5ad776996e2a58cc1bc225" - integrity sha512-3IE39bHVqFbWWaPOMHZF98Q9c3LDKGTmypMiTM2QygGXXElkFWIH7GxfmlwmY2vwa+wmNsoYZmG2iusf1ZjJoA== - "moment@>= 2.9.0", moment@^2.19.3: version "2.24.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" @@ -11011,7 +10813,7 @@ node-uuid@~1.4.0: resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" integrity sha1-sEDrCSOWivq/jTL7HxfxFn/auQc= -nopt@^3.0.3, nopt@^3.0.6: +nopt@^3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= @@ -11598,7 +11400,7 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= -path-is-absolute@1.0.1, path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= @@ -11654,11 +11456,6 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -pathval@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" - integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= - pbkdf2@^3.0.3: version "3.0.17" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" @@ -12009,15 +11806,6 @@ promise-map-series@^0.2.1, promise-map-series@^0.2.3: dependencies: rsvp "^3.0.14" -promise.prototype.finally@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.0.tgz#66f161b1643636e50e7cf201dc1b84a857f3864e" - integrity sha512-7p/K2f6dI+dM8yjRQEGrTQs5hTQixUAdOGpMEA3+pVxpX5oHKRSKAXyLw9Q9HUWDTdwtoo39dSHGQtN90HcEwQ== - dependencies: - define-properties "^1.1.2" - es-abstract "^1.9.0" - function-bind "^1.1.1" - proxy-addr@~2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec" @@ -12689,14 +12477,6 @@ resolve-package-path@^1.2.2, resolve-package-path@^1.2.6: path-root "^0.1.1" resolve "^1.10.0" -resolve-path@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7" - integrity sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc= - dependencies: - http-errors "~1.6.2" - path-is-absolute "1.0.1" - resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -12936,21 +12716,6 @@ sane@^3.0.0: optionalDependencies: fsevents "^1.2.3" -sane@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.0.2.tgz#5bd4a3f1268fd7a921a2dc657047de635c8f8f25" - integrity sha512-/3STCUfNSgMVpoREJc1i6ajKFlYZ5OflzZTOhlqPLa+01Ey+QR9iGZK7K5/qIRsQbEDCvqEJH/PL7yZywmnWsA== - dependencies: - anymatch "^2.0.0" - capture-exit "^1.2.0" - exec-sh "^0.3.2" - execa "^1.0.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - watch "~0.18.0" - sass@^1.22.10: version "1.22.10" resolved "https://registry.yarnpkg.com/sass/-/sass-1.22.10.tgz#b9f01440352ba0be5d99fa64a2040b035cc6e5ff" @@ -12997,11 +12762,6 @@ select@^1.1.2: resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== -semver@^4.3.1: - version "4.3.6" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" - integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= - semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -13387,11 +13147,6 @@ spawn-sync@^1.0.11, spawn-sync@^1.0.15: concat-stream "^1.4.7" os-shim "^0.1.2" -spawnback@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/spawnback/-/spawnback-1.0.0.tgz#f73662f7e54d95367eca74d6426c677dd7ea686f" - integrity sha1-9zZi9+VNlTZ+ynTWQmxnfdfqaG8= - spdx-correct@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" @@ -14216,11 +13971,6 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@^4.0.0, type-detect@^4.0.5: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - type-is@~1.6.15: version "1.6.15" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" @@ -14262,7 +14012,7 @@ uglify-js@^3.1.4: commander "~2.17.1" source-map "~0.6.1" -underscore.string@^3.2.2, underscore.string@~3.3.4: +underscore.string@~3.3.4: version "3.3.5" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023" integrity sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg== From 7d9f4a2a97bde0ec1ad1c4912eac742fa189f2b0 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 23 Nov 2019 00:00:28 -0500 Subject: [PATCH 589/879] build(deps): bump ember-cli-babel from 7.12.0 to 7.13.0 (#1826) Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 7.12.0 to 7.13.0. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v7.12.0...v7.13.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 1083 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 621 insertions(+), 462 deletions(-) diff --git a/yarn.lock b/yarn.lock index a687a6e77..0afb076ae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,37 +16,26 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.2.2", "@babel/core@^7.3.3", "@babel/core@^7.3.4": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.0.tgz#6ed6a2881ad48a732c5433096d96d1b0ee5eb734" - integrity sha512-6Isr4X98pwXqHvtigw71CKgmhL1etZjPs5A67jL/w0TkLM9eqmFR40YrnJvEc1WnMZFsskjsmid8bHZyxKEAnw== +"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.2.2", "@babel/core@^7.3.3", "@babel/core@^7.3.4", "@babel/core@^7.7.0": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.4.tgz#37e864532200cb6b50ee9a4045f5f817840166ab" + integrity sha512-+bYbx56j4nYBmpsWtnPUsKW3NdnYxbqyfrP2w9wILBuHzdfIKz9prieZK0DFPyIzkjYVUe4QkusGL07r5pXznQ== dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.5.0" - "@babel/helpers" "^7.5.0" - "@babel/parser" "^7.5.0" - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.5.0" - "@babel/types" "^7.5.0" - convert-source-map "^1.1.0" + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.7.4" + "@babel/helpers" "^7.7.4" + "@babel/parser" "^7.7.4" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + convert-source-map "^1.7.0" debug "^4.1.0" json5 "^2.1.0" - lodash "^4.17.11" + lodash "^4.17.13" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.0.tgz#f20e4b7a91750ee8b63656073d843d2a736dca4a" - integrity sha512-1TTVrt7J9rcG5PMjvO7VEG3FrEoEJNHxumRq66GemPmzboLWtIjjcJgk8rokuAS7IiRSpgVSu5Vb9lc99iJkOA== - dependencies: - "@babel/types" "^7.5.0" - jsesc "^2.5.1" - lodash "^4.17.11" - source-map "^0.5.0" - trim-right "^1.0.1" - "@babel/generator@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.5.tgz#873a7f936a3c89491b43536d12245b626664e3cf" @@ -58,58 +47,76 @@ source-map "^0.5.0" trim-right "^1.0.1" -"@babel/helper-annotate-as-pure@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" - integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== +"@babel/generator@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.4.tgz#db651e2840ca9aa66f327dcec1dc5f5fa9611369" + integrity sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.7.4" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" - integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== +"@babel/helper-annotate-as-pure@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.4.tgz#bb3faf1e74b74bd547e867e48f551fa6b098b6ce" + integrity sha512-2BQmQgECKzYKFPpiycoF9tlb5HA4lrVyAmLLVK177EcQAqjVLciUb2/R+n1boQ9y5ENV3uz2ZqiNw7QMBBw1Og== dependencies: - "@babel/helper-explode-assignable-expression" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/types" "^7.7.4" -"@babel/helper-call-delegate@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz#6a957f105f37755e8645343d3038a22e1449cc4a" - integrity sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.4.tgz#5f73f2b28580e224b5b9bd03146a4015d6217f5f" + integrity sha512-Biq/d/WtvfftWZ9Uf39hbPBYDUo986m5Bb4zhkeYDGUllF43D+nUe5M6Vuo6/8JDK/0YX/uBdeoQpyaNhNugZQ== dependencies: - "@babel/helper-hoist-variables" "^7.0.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/helper-explode-assignable-expression" "^7.7.4" + "@babel/types" "^7.7.4" -"@babel/helper-create-class-features-plugin@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.0.tgz#30fd090e059d021995c1762a5b76798fa0b51d82" - integrity sha512-2K8NohdOT7P6Vyp23QH4w2IleP8yG3UJsbRKwA4YP6H8fErcLkFuuEEqbF2/BYBKSNci/FWJiqm6R3VhM/QHgw== +"@babel/helper-call-delegate@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.7.4.tgz#621b83e596722b50c0066f9dc37d3232e461b801" + integrity sha512-8JH9/B7J7tCYJ2PpWVpw9JhPuEVHztagNVuQAFBVFYluRMlpG7F1CgKEgGeL6KFqcsIa92ZYVj6DSc0XwmN1ZA== dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-member-expression-to-functions" "^7.0.0" - "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-hoist-variables" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + +"@babel/helper-create-class-features-plugin@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.4.tgz#fce60939fd50618610942320a8d951b3b639da2d" + integrity sha512-l+OnKACG4uiDHQ/aJT8dwpR+LhCJALxL0mJ6nzjB25e5IPwqV1VOsY7ah6UB1DG+VOXAIMtuC54rFJGiHkxjgA== + dependencies: + "@babel/helper-function-name" "^7.7.4" + "@babel/helper-member-expression-to-functions" "^7.7.4" + "@babel/helper-optimise-call-expression" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.4.0" - "@babel/helper-split-export-declaration" "^7.4.0" + "@babel/helper-replace-supers" "^7.7.4" + "@babel/helper-split-export-declaration" "^7.7.4" -"@babel/helper-define-map@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c" - integrity sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg== +"@babel/helper-create-regexp-features-plugin@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.4.tgz#6d5762359fd34f4da1500e4cff9955b5299aaf59" + integrity sha512-Mt+jBKaxL0zfOIWrfQpnfYCN7/rS6GKx6CCCfuoqVVd+17R8zNDlzVYmIi9qyb2wOk002NsmSTDymkIygDUH7A== dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/types" "^7.0.0" - lodash "^4.17.10" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.6.0" -"@babel/helper-explode-assignable-expression@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" - integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== +"@babel/helper-define-map@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.7.4.tgz#2841bf92eb8bd9c906851546fe6b9d45e162f176" + integrity sha512-v5LorqOa0nVQUvAUTUF3KPastvUt/HzByXNamKQ6RdJRTV7j8rLL+WB5C/MzzWAwOomxDhYFb1wLLxHqox86lg== dependencies: - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/helper-function-name" "^7.7.4" + "@babel/types" "^7.7.4" + lodash "^4.17.13" + +"@babel/helper-explode-assignable-expression@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.4.tgz#fa700878e008d85dc51ba43e9fb835cddfe05c84" + integrity sha512-2/SicuFrNSXsZNBxe5UGdLr+HZg+raWBLE9vC98bdYOKX/U6PY0mdGlYUJdtTDPSU0Lw0PNbKKDpwYHJLn2jLg== + dependencies: + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" "@babel/helper-function-name@^7.1.0": version "7.1.0" @@ -120,6 +127,15 @@ "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" +"@babel/helper-function-name@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz#ab6e041e7135d436d8f0a3eca15de5b67a341a2e" + integrity sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ== + dependencies: + "@babel/helper-get-function-arity" "^7.7.4" + "@babel/template" "^7.7.4" + "@babel/types" "^7.7.4" + "@babel/helper-get-function-arity@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" @@ -127,19 +143,26 @@ dependencies: "@babel/types" "^7.0.0" -"@babel/helper-hoist-variables@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" - integrity sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w== +"@babel/helper-get-function-arity@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz#cb46348d2f8808e632f0ab048172130e636005f0" + integrity sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.7.4" -"@babel/helper-member-expression-to-functions@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" - integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== +"@babel/helper-hoist-variables@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.4.tgz#612384e3d823fdfaaf9fce31550fe5d4db0f3d12" + integrity sha512-wQC4xyvc1Jo/FnLirL6CEgPgPCa8M74tOdjWpRhQYapz5JC7u3NYU1zCVoVAGCE3EaIP9T1A3iW0WLJ+reZlpQ== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.7.4" + +"@babel/helper-member-expression-to-functions@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz#356438e2569df7321a8326644d4b790d2122cb74" + integrity sha512-9KcA1X2E3OjXl/ykfMMInBK+uVdfIVakVe7W7Lg3wfXUNyS3Q1HWLFRwZIjhqiCGbslummPDnmb7vIekS0C1vw== + dependencies: + "@babel/types" "^7.7.4" "@babel/helper-module-imports@^7.0.0": version "7.0.0" @@ -148,24 +171,31 @@ dependencies: "@babel/types" "^7.0.0" -"@babel/helper-module-transforms@^7.1.0": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz#ab2f8e8d231409f8370c883d20c335190284b963" - integrity sha512-YRD7I6Wsv+IHuTPkAmAS4HhY0dkPobgLftHp0cRGZSdrRvmZY8rFvae/GVu3bD00qscuvK3WPHB3YdNpBXUqrA== +"@babel/helper-module-imports@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz#e5a92529f8888bf319a6376abfbd1cebc491ad91" + integrity sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ== dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/template" "^7.2.2" - "@babel/types" "^7.2.2" - lodash "^4.17.10" + "@babel/types" "^7.7.4" -"@babel/helper-optimise-call-expression@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" - integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== +"@babel/helper-module-transforms@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.4.tgz#8d7cdb1e1f8ea3d8c38b067345924ac4f8e0879a" + integrity sha512-ehGBu4mXrhs0FxAqN8tWkzF8GSIGAiEumu4ONZ/hD9M88uHcD+Yu2ttKfOCgwzoesJOJrtQh7trI5YPbRtMmnA== dependencies: - "@babel/types" "^7.0.0" + "@babel/helper-module-imports" "^7.7.4" + "@babel/helper-simple-access" "^7.7.4" + "@babel/helper-split-export-declaration" "^7.7.4" + "@babel/template" "^7.7.4" + "@babel/types" "^7.7.4" + lodash "^4.17.13" + +"@babel/helper-optimise-call-expression@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz#034af31370d2995242aa4df402c3b7794b2dcdf2" + integrity sha512-VB7gWZ2fDkSuqW6b1AKXkJWO5NyNI3bFL/kK79/30moK57blr6NbH8xcl2XcKCwOmJosftWunZqfO84IGq3ZZg== + dependencies: + "@babel/types" "^7.7.4" "@babel/helper-plugin-utils@^7.0.0": version "7.0.0" @@ -179,58 +209,41 @@ dependencies: lodash "^4.17.10" -"@babel/helper-remap-async-to-generator@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" - integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-wrap-function" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-replace-supers@^7.1.0": - version "7.2.3" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.2.3.tgz#19970020cf22677d62b3a689561dbd9644d8c5e5" - integrity sha512-GyieIznGUfPXPWu0yLS6U55Mz67AZD9cUk0BfirOWlPrXlBcan9Gz+vHGz+cPfuoweZSnPzPIm67VtQM0OWZbA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.0.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.2.3" - "@babel/types" "^7.0.0" - -"@babel/helper-replace-supers@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.0.tgz#4f56adb6aedcd449d2da9399c2dcf0545463b64c" - integrity sha512-PVwCVnWWAgnal+kJ+ZSAphzyl58XrFeSKSAJRiqg5QToTsjL+Xu1f9+RJ+d+Q0aPhPfBGaYfkox66k86thxNSg== +"@babel/helper-regex@^7.4.4": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" + integrity sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw== dependencies: - "@babel/helper-member-expression-to-functions" "^7.0.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.4.0" - "@babel/types" "^7.4.0" + lodash "^4.17.13" -"@babel/helper-simple-access@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" - integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== +"@babel/helper-remap-async-to-generator@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.4.tgz#c68c2407350d9af0e061ed6726afb4fff16d0234" + integrity sha512-Sk4xmtVdM9sA/jCI80f+KS+Md+ZHIpjuqmYPk1M7F/upHou5e4ReYmExAiu6PVe65BhJPZA2CY9x9k4BqE5klw== dependencies: - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/helper-annotate-as-pure" "^7.7.4" + "@babel/helper-wrap-function" "^7.7.4" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" -"@babel/helper-split-export-declaration@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" - integrity sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag== +"@babel/helper-replace-supers@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz#3c881a6a6a7571275a72d82e6107126ec9e2cdd2" + integrity sha512-pP0tfgg9hsZWo5ZboYGuBn/bbYT/hdLPVSS4NMmiRJdwWhP0IznPwN9AE1JwyGsjSPLC364I0Qh5p+EPkGPNpg== dependencies: - "@babel/types" "^7.0.0" + "@babel/helper-member-expression-to-functions" "^7.7.4" + "@babel/helper-optimise-call-expression" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" -"@babel/helper-split-export-declaration@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz#571bfd52701f492920d63b7f735030e9a3e10b55" - integrity sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw== +"@babel/helper-simple-access@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.7.4.tgz#a169a0adb1b5f418cfc19f22586b2ebf58a9a294" + integrity sha512-zK7THeEXfan7UlWsG2A6CI/L9jVnI5+xxKZOdej39Y0YtDYKx9raHk5F2EtK9K8DHRTihYwg20ADt9S36GR78A== dependencies: - "@babel/types" "^7.4.0" + "@babel/template" "^7.7.4" + "@babel/types" "^7.7.4" "@babel/helper-split-export-declaration@^7.4.4": version "7.4.4" @@ -239,24 +252,31 @@ dependencies: "@babel/types" "^7.4.4" -"@babel/helper-wrap-function@^7.1.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" - integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== +"@babel/helper-split-export-declaration@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz#57292af60443c4a3622cf74040ddc28e68336fd8" + integrity sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug== dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.2.0" + "@babel/types" "^7.7.4" -"@babel/helpers@^7.5.0": - version "7.5.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.5.1.tgz#65407c741a56ddd59dd86346cd112da3de912db3" - integrity sha512-rVOTDv8sH8kNI72Unenusxw6u+1vEepZgLxeV+jHkhsQlYhzVhzL1EpfoWT7Ub3zpWSv2WV03V853dqsnyoQzA== +"@babel/helper-wrap-function@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz#37ab7fed5150e22d9d7266e830072c0cdd8baace" + integrity sha512-VsfzZt6wmsocOaVU0OokwrIytHND55yvyT4BPB9AIIgwr8+x7617hetdJTsuGwygN5RC6mxA9EJztTjuwm2ofg== dependencies: - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.5.0" - "@babel/types" "^7.5.0" + "@babel/helper-function-name" "^7.7.4" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + +"@babel/helpers@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.4.tgz#62c215b9e6c712dadc15a9a0dcab76c92a940302" + integrity sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg== + dependencies: + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" "@babel/highlight@^7.0.0": version "7.0.0" @@ -272,7 +292,7 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.4.tgz#a43357e4bbf4b92a437fb9e465c192848287f27c" integrity sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ== -"@babel/parser@^7.3.4", "@babel/parser@^7.4.4", "@babel/parser@^7.5.0": +"@babel/parser@^7.3.4": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.0.tgz#3e0713dff89ad6ae37faec3b29dcfc5c979770b7" integrity sha512-I5nW8AhGpOXGCCNYGc+p7ExQIBxRFnS2fd/d862bNOKvmoEPjYPcfIjsfdy0ujagYOIYPczKgD9l3FsgTkAzKA== @@ -282,76 +302,88 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.5.tgz#02f077ac8817d3df4a832ef59de67565e71cca4b" integrity sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g== -"@babel/plugin-proposal-async-generator-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" - integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== +"@babel/parser@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.4.tgz#75ab2d7110c2cf2fa949959afb05fa346d2231bb" + integrity sha512-jIwvLO0zCL+O/LmEJQjWA75MQTWwx3c3u2JOTDK5D3/9egrWRRA0/0hk9XXywYnXZVVpzrBYeIQTmhwUaePI9g== + +"@babel/plugin-proposal-async-generator-functions@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.4.tgz#0351c5ac0a9e927845fffd5b82af476947b7ce6d" + integrity sha512-1ypyZvGRXriY/QP668+s8sFr2mqinhkRDMPSQLNghCQE+GAkFtp+wkHVvg2+Hdki8gwP+NFzJBJ/N1BfzCCDEw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" - "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/helper-remap-async-to-generator" "^7.7.4" + "@babel/plugin-syntax-async-generators" "^7.7.4" -"@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.3.4": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.0.tgz#d70db61a2f1fd79de927eea91f6411c964e084b8" - integrity sha512-t2ECPNOXsIeK1JxJNKmgbzQtoG27KIlVE61vTqX0DKR9E9sZlVVxWUtEW9D5FlZ8b8j7SBNCHY47GgPKCKlpPg== +"@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.3.4", "@babel/plugin-proposal-class-properties@^7.7.0": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.4.tgz#2f964f0cb18b948450362742e33e15211e77c2ba" + integrity sha512-EcuXeV4Hv1X3+Q1TsuOmyyxeTRiSqurGJ26+I/FW1WbymmRRapVORm6x1Zl3iDIHyRxEs+VXWp6qnlcfcJSbbw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.4.0" + "@babel/helper-create-class-features-plugin" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-proposal-decorators@^7.3.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.0.tgz#8e1bfd83efa54a5f662033afcc2b8e701f4bb3a9" - integrity sha512-d08TLmXeK/XbgCo7ZeZ+JaeZDtDai/2ctapTRsWWkkmy7G/cqz8DQN/HlWG7RR4YmfXxmExsbU3SuCjlM7AtUg== +"@babel/plugin-proposal-decorators@^7.3.0", "@babel/plugin-proposal-decorators@^7.7.0": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.7.4.tgz#58c1e21d21ea12f9f5f0a757e46e687b94a7ab2b" + integrity sha512-GftcVDcLCwVdzKmwOBDjATd548+IE+mBo7ttgatqNDR7VG7GqIuZPtRWlMLHbhTXhcnFZiGER8iIYl1n/imtsg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.4.0" + "@babel/helper-create-class-features-plugin" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-decorators" "^7.2.0" + "@babel/plugin-syntax-decorators" "^7.7.4" -"@babel/plugin-proposal-json-strings@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" - integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== +"@babel/plugin-proposal-dynamic-import@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.4.tgz#dde64a7f127691758cbfed6cf70de0fa5879d52d" + integrity sha512-StH+nGAdO6qDB1l8sZ5UBV8AC3F2VW2I8Vfld73TMKyptMU9DY5YsJAS8U81+vEtxcH3Y/La0wG0btDrhpnhjQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/plugin-syntax-dynamic-import" "^7.7.4" -"@babel/plugin-proposal-object-rest-spread@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.2.0.tgz#88f5fec3e7ad019014c97f7ee3c992f0adbf7fb8" - integrity sha512-1L5mWLSvR76XYUQJXkd/EEQgjq8HHRP6lQuZTTg0VA4tTGPpGemmCdAfQIz1rzEuWAm+ecP8PyyEm30jC1eQCg== +"@babel/plugin-proposal-json-strings@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.7.4.tgz#7700a6bfda771d8dc81973249eac416c6b4c697d" + integrity sha512-wQvt3akcBTfLU/wYoqm/ws7YOAQKu8EVJEvHip/mzkNtjaclQoCCIqKXFP5/eyfnfbQCDV3OLRIK3mIVyXuZlw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.7.4" -"@babel/plugin-proposal-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" - integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== +"@babel/plugin-proposal-object-rest-spread@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.4.tgz#cc57849894a5c774214178c8ab64f6334ec8af71" + integrity sha512-rnpnZR3/iWKmiQyJ3LKJpSwLDcX/nSXhdLk4Aq/tXOApIvyu7qoabrige0ylsAJffaUC51WiBu209Q0U+86OWQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.7.4" -"@babel/plugin-proposal-unicode-property-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz#abe7281fe46c95ddc143a65e5358647792039520" - integrity sha512-LvRVYb7kikuOtIoUeWTkOxQEV1kYvL5B6U3iWEGCzPNRus1MzJweFqORTj+0jkxozkTSYNJozPOddxmqdqsRpw== +"@babel/plugin-proposal-optional-catch-binding@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.7.4.tgz#ec21e8aeb09ec6711bc0a39ca49520abee1de379" + integrity sha512-DyM7U2bnsQerCQ+sejcTNZh8KQEUuC3ufzdnVnSiUv/qoGJp2Z3hanKL18KDhsBT5Wj6a7CMT5mdyCNJsEaA9w== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - regexpu-core "^4.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.7.4" -"@babel/plugin-syntax-async-generators@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" - integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== +"@babel/plugin-proposal-unicode-property-regex@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.4.tgz#7c239ccaf09470dbe1d453d50057460e84517ebb" + integrity sha512-cHgqHgYvffluZk85dJ02vloErm3Y6xtH+2noOBOJ2kXOJH3aVCDnj5eR/lVNlTnYu4hndAPJD3rTFjW3qee0PA== dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-decorators@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz#c50b1b957dcc69e4b1127b65e1c33eef61570c1b" - integrity sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA== +"@babel/plugin-syntax-async-generators@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.7.4.tgz#331aaf310a10c80c44a66b238b6e49132bd3c889" + integrity sha512-Li4+EjSpBgxcsmeEF8IFcfV/+yJGxHXDirDkEoyFjumuwbmfCVHUt0HuowD/iGM7OhIRyXJH9YXxqiH6N815+g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-decorators@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.7.4.tgz#3c91cfee2a111663ff3ac21b851140f5a52a4e0b" + integrity sha512-0oNLWNH4k5ZbBVfAwiTU53rKFWIeTh6ZlaWOXWJc4ywxs0tjz5fc3uZ6jKAnZSxN98eXVgg7bJIuzjX+3SXY+A== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -362,24 +394,38 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-json-strings@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" - integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== +"@babel/plugin-syntax-dynamic-import@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz#29ca3b4415abfe4a5ec381e903862ad1a54c3aec" + integrity sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-object-rest-spread@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" - integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== +"@babel/plugin-syntax-json-strings@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.7.4.tgz#86e63f7d2e22f9e27129ac4e83ea989a382e86cc" + integrity sha512-QpGupahTQW1mHRXddMG5srgpHWqRLwJnJZKXTigB9RPFCCGbDGCgBeM/iC82ICXp414WeYx/tD54w7M2qRqTMg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" - integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== +"@babel/plugin-syntax-object-rest-spread@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz#47cf220d19d6d0d7b154304701f468fc1cc6ff46" + integrity sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.7.4.tgz#a3e38f59f4b6233867b4a92dcb0ee05b2c334aa6" + integrity sha512-4ZSuzWgFxqHRE31Glu+fEr/MirNZOMYmD/0BhBWyLyOOQz/gTAl7QmWm2hX1QxEIXsr2vkdlwxIzTyiYRC4xcQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-top-level-await@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.4.tgz#bd7d8fa7b9fee793a36e4027fd6dd1aa32f946da" + integrity sha512-wdsOw0MvkL1UIgiQ/IFr3ETcfv1xb8RMM0H9wbiDyLaJFyiDg5oZvDLCXosIXmFeIlweML5iOBXAkqddkYNizg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -390,30 +436,30 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-arrow-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" - integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== +"@babel/plugin-transform-arrow-functions@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.7.4.tgz#76309bd578addd8aee3b379d809c802305a98a12" + integrity sha512-zUXy3e8jBNPiffmqkHRNDdZM2r8DWhCB7HhcoyZjiK1TxYEluLHAvQuYnTT+ARqRpabWqy/NHkO6e3MsYB5YfA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-async-to-generator@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.2.0.tgz#68b8a438663e88519e65b776f8938f3445b1a2ff" - integrity sha512-CEHzg4g5UraReozI9D4fblBYABs7IM6UerAVG7EJVrTLC5keh00aEuLUT+O40+mJCEzaXkYfTCUKIyeDfMOFFQ== +"@babel/plugin-transform-async-to-generator@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.4.tgz#694cbeae6d613a34ef0292713fa42fb45c4470ba" + integrity sha512-zpUTZphp5nHokuy8yLlyafxCJ0rSlFoSHypTUWgpdwoDXWQcseaect7cJ8Ppk6nunOM6+5rPMkod4OYKPR5MUg== dependencies: - "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-module-imports" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/helper-remap-async-to-generator" "^7.7.4" -"@babel/plugin-transform-block-scoped-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" - integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== +"@babel/plugin-transform-block-scoped-functions@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.7.4.tgz#d0d9d5c269c78eaea76227ace214b8d01e4d837b" + integrity sha512-kqtQzwtKcpPclHYjLK//3lH8OFsCDuDJBaFhVwf8kqdnF6MN4l618UDlcA7TfRs3FayrHj+svYnSX8MC9zmUyQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-block-scoping@^7.2.0", "@babel/plugin-transform-block-scoping@^7.5.5", "@babel/plugin-transform-block-scoping@^7.6.0": +"@babel/plugin-transform-block-scoping@^7.5.5", "@babel/plugin-transform-block-scoping@^7.6.0": version "7.6.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz#6e854e51fbbaa84351b15d4ddafe342f3a5d542a" integrity sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw== @@ -421,117 +467,141 @@ "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.13" -"@babel/plugin-transform-classes@^7.2.0": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz#6c90542f210ee975aa2aa8c8b5af7fa73a126953" - integrity sha512-gEZvgTy1VtcDOaQty1l10T3jQmJKlNVxLDCs+3rCVPr6nMkODLELxViq5X9l+rfxbie3XrfrMCYYY6eX3aOcOQ== +"@babel/plugin-transform-block-scoping@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz#200aad0dcd6bb80372f94d9e628ea062c58bf224" + integrity sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg== dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.1.0" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-optimise-call-expression" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.0.0" + lodash "^4.17.13" + +"@babel/plugin-transform-classes@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.4.tgz#c92c14be0a1399e15df72667067a8f510c9400ec" + integrity sha512-sK1mjWat7K+buWRuImEzjNf68qrKcrddtpQo3swi9j7dUcG6y6R6+Di039QN2bD1dykeswlagupEmpOatFHHUg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.7.4" + "@babel/helper-define-map" "^7.7.4" + "@babel/helper-function-name" "^7.7.4" + "@babel/helper-optimise-call-expression" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.7.4" + "@babel/helper-split-export-declaration" "^7.7.4" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" - integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== +"@babel/plugin-transform-computed-properties@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.7.4.tgz#e856c1628d3238ffe12d668eb42559f79a81910d" + integrity sha512-bSNsOsZnlpLLyQew35rl4Fma3yKWqK3ImWMSC/Nc+6nGjC9s5NFWAer1YQ899/6s9HxO2zQC1WoFNfkOqRkqRQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-destructuring@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.2.0.tgz#e75269b4b7889ec3a332cd0d0c8cff8fed0dc6f3" - integrity sha512-coVO2Ayv7g0qdDbrNiadE4bU7lvCd9H539m2gMknyVjjMdwF/iCOM7R+E8PkntoqLkltO0rk+3axhpp/0v68VQ== +"@babel/plugin-transform-destructuring@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz#2b713729e5054a1135097b6a67da1b6fe8789267" + integrity sha512-4jFMXI1Cu2aXbcXXl8Lr6YubCn6Oc7k9lLsu8v61TZh+1jny2BWmdtvY9zSUlLdGUvcy9DMAWyZEOqjsbeg/wA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-dotall-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz#f0aabb93d120a8ac61e925ea0ba440812dbe0e49" - integrity sha512-sKxnyHfizweTgKZf7XsXu/CNupKhzijptfTM+bozonIuyVrLWVUvYjE2bhuSBML8VQeMxq4Mm63Q9qvcvUcciQ== +"@babel/plugin-transform-dotall-regex@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.4.tgz#f7ccda61118c5b7a2599a72d5e3210884a021e96" + integrity sha512-mk0cH1zyMa/XHeb6LOTXTbG7uIJ8Rrjlzu91pUx/KS3JpcgaTDwMS8kM+ar8SLOvlL2Lofi4CGBAjCo3a2x+lw== dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - regexpu-core "^4.1.3" -"@babel/plugin-transform-duplicate-keys@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" - integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== +"@babel/plugin-transform-duplicate-keys@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.7.4.tgz#3d21731a42e3f598a73835299dd0169c3b90ac91" + integrity sha512-g1y4/G6xGWMD85Tlft5XedGaZBCIVN+/P0bs6eabmcPP9egFleMAo65OOjlhcz1njpwagyY3t0nsQC9oTFegJA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-exponentiation-operator@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" - integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== +"@babel/plugin-transform-exponentiation-operator@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.7.4.tgz#dd30c0191e3a1ba19bcc7e389bdfddc0729d5db9" + integrity sha512-MCqiLfCKm6KEA1dglf6Uqq1ElDIZwFuzz1WH5mTf8k2uQSxEJMbOIEh7IZv7uichr7PMfi5YVSrr1vz+ipp7AQ== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-for-of@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz#ab7468befa80f764bb03d3cb5eef8cc998e1cad9" - integrity sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ== +"@babel/plugin-transform-for-of@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.7.4.tgz#248800e3a5e507b1f103d8b4ca998e77c63932bc" + integrity sha512-zZ1fD1B8keYtEcKF+M1TROfeHTKnijcVQm0yO/Yu1f7qoDoxEIc/+GX6Go430Bg84eM/xwPFp0+h4EbZg7epAA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-function-name@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz#f7930362829ff99a3174c39f0afcc024ef59731a" - integrity sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ== +"@babel/plugin-transform-function-name@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.4.tgz#75a6d3303d50db638ff8b5385d12451c865025b1" + integrity sha512-E/x09TvjHNhsULs2IusN+aJNRV5zKwxu1cpirZyRPw+FyyIKEHPXTsadj48bVpc1R5Qq1B5ZkzumuFLytnbT6g== dependencies: - "@babel/helper-function-name" "^7.1.0" + "@babel/helper-function-name" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" - integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== +"@babel/plugin-transform-literals@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.7.4.tgz#27fe87d2b5017a2a5a34d1c41a6b9f6a6262643e" + integrity sha512-X2MSV7LfJFm4aZfxd0yLVFrEXAgPqYoDG53Br/tCKiKYfX0MjVjQeWPIhPHHsCqzwQANq+FLN786fF5rgLS+gw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-modules-amd@^7.0.0", "@babel/plugin-transform-modules-amd@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" - integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== +"@babel/plugin-transform-member-expression-literals@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.7.4.tgz#aee127f2f3339fc34ce5e3055d7ffbf7aa26f19a" + integrity sha512-9VMwMO7i69LHTesL0RdGy93JU6a+qOPuvB4F4d0kR0zyVjJRVJRaoaGjhtki6SzQUu8yen/vxPKN6CWnCUw6bA== dependencies: - "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-modules-commonjs@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz#c4f1933f5991d5145e9cfad1dfd848ea1727f404" - integrity sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ== +"@babel/plugin-transform-modules-amd@^7.0.0", "@babel/plugin-transform-modules-amd@^7.5.0", "@babel/plugin-transform-modules-amd@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.4.tgz#276b3845ca2b228f2995e453adc2e6f54d72fb71" + integrity sha512-/542/5LNA18YDtg1F+QHvvUSlxdvjZoD/aldQwkq+E3WCkbEjNSN9zdrOXaSlfg3IfGi22ijzecklF/A7kVZFQ== dependencies: - "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-module-transforms" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" + babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-systemjs@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.2.0.tgz#912bfe9e5ff982924c81d0937c92d24994bb9068" - integrity sha512-aYJwpAhoK9a+1+O625WIjvMY11wkB/ok0WClVwmeo3mCjcNRjt+/8gHWrB5i+00mUju0gWsBkQnPpdvQ7PImmQ== +"@babel/plugin-transform-modules-commonjs@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.4.tgz#bee4386e550446343dd52a571eda47851ff857a3" + integrity sha512-k8iVS7Jhc367IcNF53KCwIXtKAH7czev866ThsTgy8CwlXjnKZna2VHwChglzLleYrcHz1eQEIJlGRQxB53nqA== dependencies: - "@babel/helper-hoist-variables" "^7.0.0" + "@babel/helper-module-transforms" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.7.4" + babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-umd@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" - integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== +"@babel/plugin-transform-modules-systemjs@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.4.tgz#cd98152339d3e763dfe838b7d4273edaf520bb30" + integrity sha512-y2c96hmcsUi6LrMqvmNDPBBiGCiQu0aYqpHatVVu6kD4mFEXKjyNxd/drc18XXAf9dv7UXjrZwBVmTTGaGP8iw== dependencies: - "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-hoist-variables" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" + babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-new-target@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" - integrity sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw== +"@babel/plugin-transform-modules-umd@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.4.tgz#1027c355a118de0aae9fee00ad7813c584d9061f" + integrity sha512-u2B8TIi0qZI4j8q4C51ktfO7E3cQ0qnaXFI1/OXITordD40tt17g/sXqgNNCcMTcBFKrUPcGDx+TBJuZxLx7tw== + dependencies: + "@babel/helper-module-transforms" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.4.tgz#fb3bcc4ee4198e7385805007373d6b6f42c98220" + integrity sha512-jBUkiqLKvUWpv9GLSuHUFYdmHg0ujC1JEYoZUfeOOfNydZXp1sXObgyPatpcwjWgsdBGsagWW0cdJpX/DO2jMw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.7.4" + +"@babel/plugin-transform-new-target@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.7.4.tgz#4a0753d2d60639437be07b592a9e58ee00720167" + integrity sha512-CnPRiNtOG1vRodnsyGX37bHQleHE14B9dnnlgSeEs3ek3fHN1A1SScglTCg1sfbe7sRQ2BUcpgpTpWSfMKz3gg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -542,74 +612,88 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-object-super@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" - integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== +"@babel/plugin-transform-object-super@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.7.4.tgz#48488937a2d586c0148451bf51af9d7dda567262" + integrity sha512-ho+dAEhC2aRnff2JCA0SAK7V2R62zJd/7dmtoe7MHcso4C2mS+vZjn1Pb1pCVZvJs1mgsvv5+7sT+m3Bysb6eg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.1.0" + "@babel/helper-replace-supers" "^7.7.4" -"@babel/plugin-transform-parameters@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz#0d5ad15dc805e2ea866df4dd6682bfe76d1408c2" - integrity sha512-kB9+hhUidIgUoBQ0MsxMewhzr8i60nMa2KgeJKQWYrqQpqcBYtnpR+JgkadZVZoaEZ/eKu9mclFaVwhRpLNSzA== +"@babel/plugin-transform-parameters@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.4.tgz#da4555c97f39b51ac089d31c7380f03bca4075ce" + integrity sha512-VJwhVePWPa0DqE9vcfptaJSzNDKrWU/4FbYCjZERtmqEs05g3UMXnYMZoXja7JAJ7Y7sPZipwm/pGApZt7wHlw== dependencies: - "@babel/helper-call-delegate" "^7.1.0" - "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-call-delegate" "^7.7.4" + "@babel/helper-get-function-arity" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-regenerator@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz#5b41686b4ed40bef874d7ed6a84bdd849c13e0c1" - integrity sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw== +"@babel/plugin-transform-property-literals@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.7.4.tgz#2388d6505ef89b266103f450f9167e6bd73f98c2" + integrity sha512-MatJhlC4iHsIskWYyawl53KuHrt+kALSADLQQ/HkhTjX954fkxIEh4q5slL4oRAnsm/eDoZ4q0CIZpcqBuxhJQ== dependencies: - regenerator-transform "^0.13.3" + "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-runtime@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.2.0.tgz#566bc43f7d0aedc880eaddbd29168d0f248966ea" - integrity sha512-jIgkljDdq4RYDnJyQsiWbdvGeei/0MOTtSHKO/rfbd/mXBxNpdlulMx49L0HQ4pug1fXannxoqCI+fYSle9eSw== +"@babel/plugin-transform-regenerator@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.4.tgz#d18eac0312a70152d7d914cbed2dc3999601cfc0" + integrity sha512-e7MWl5UJvmPEwFJTwkBlPmqixCtr9yAASBqff4ggXTNicZiwbF8Eefzm6NVgfiBp7JdAGItecnctKTgH44q2Jw== + dependencies: + regenerator-transform "^0.14.0" + +"@babel/plugin-transform-reserved-words@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.7.4.tgz#6a7cf123ad175bb5c69aec8f6f0770387ed3f1eb" + integrity sha512-OrPiUB5s5XvkCO1lS7D8ZtHcswIC57j62acAnJZKqGGnHP+TIc/ljQSrgdX/QyOTdEK5COAhuc820Hi1q2UgLQ== dependencies: - "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-runtime@^7.2.0", "@babel/plugin-transform-runtime@^7.6.0": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.7.4.tgz#51fe458c1c1fa98a8b07934f4ed38b6cd62177a6" + integrity sha512-O8kSkS5fP74Ad/8pfsCMGa8sBRdLxYoSReaARRNSz3FbFQj3z/QUvoUmJ28gn9BO93YfnXc3j+Xyaqe8cKDNBQ== + dependencies: + "@babel/helper-module-imports" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" resolve "^1.8.1" semver "^5.5.1" -"@babel/plugin-transform-shorthand-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" - integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== +"@babel/plugin-transform-shorthand-properties@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.7.4.tgz#74a0a9b2f6d67a684c6fbfd5f0458eb7ba99891e" + integrity sha512-q+suddWRfIcnyG5YiDP58sT65AJDZSUhXQDZE3r04AuqD6d/XLaQPPXSBzP2zGerkgBivqtQm9XKGLuHqBID6Q== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-spread@^7.2.0": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" - integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== +"@babel/plugin-transform-spread@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.7.4.tgz#aa673b356fe6b7e70d69b6e33a17fef641008578" + integrity sha512-8OSs0FLe5/80cndziPlg4R0K6HcWSM0zyNhHhLsmw/Nc5MaA49cAsnoJ/t/YZf8qkG7fD+UjTRaApVDB526d7Q== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-sticky-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" - integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== +"@babel/plugin-transform-sticky-regex@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.7.4.tgz#ffb68c05090c30732076b1285dc1401b404a123c" + integrity sha512-Ls2NASyL6qtVe1H1hXts9yuEeONV2TJZmplLONkMPUG158CtmnrzW5Q5teibM5UVOFjG0D3IC5mzXR6pPpUY7A== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" -"@babel/plugin-transform-template-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz#d87ed01b8eaac7a92473f608c97c089de2ba1e5b" - integrity sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg== +"@babel/plugin-transform-template-literals@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.7.4.tgz#1eb6411736dd3fe87dbd20cc6668e5121c17d604" + integrity sha512-sA+KxLwF3QwGj5abMHkHgshp9+rRz+oY9uoRil4CyLtgEuE/88dpkeWgNk5qKVsJE9iSfly3nvHapdRiIS2wnQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-annotate-as-pure" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-typeof-symbol@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" - integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== +"@babel/plugin-transform-typeof-symbol@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.7.4.tgz#3174626214f2d6de322882e498a38e8371b2140e" + integrity sha512-KQPUQ/7mqe2m0B8VecdyaW5XcQYaePyl9R7IsKd+irzj6jvbhoGnRE+M0aNkyAzI07VfUQ9266L5xMARitV3wg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -621,78 +705,87 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-typescript" "^7.2.0" -"@babel/plugin-transform-unicode-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz#4eb8db16f972f8abb5062c161b8b115546ade08b" - integrity sha512-m48Y0lMhrbXEJnVUaYly29jRXbQ3ksxPrS1Tg8t+MHqzXhtBYAvI51euOBaoAlZLPHsieY9XPVMf80a5x0cPcA== +"@babel/plugin-transform-unicode-regex@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.4.tgz#a3c0f65b117c4c81c5b6484f2a5e7b95346b83ae" + integrity sha512-N77UUIV+WCvE+5yHw+oks3m18/umd7y392Zv7mYTpFqHtkpcc+QUz+gLJNTWVlWROIWeLqY0f3OjZxV5TcXnRw== dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - regexpu-core "^4.1.3" -"@babel/polyfill@^7.0.0": - version "7.2.5" - resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.2.5.tgz#6c54b964f71ad27edddc567d065e57e87ed7fa7d" - integrity sha512-8Y/t3MWThtMLYr0YNC/Q76tqN1w30+b0uQMeFUYauG2UGTR19zyUtFrAzT23zNtBxPp+LbE5E/nwV/q/r3y6ug== +"@babel/polyfill@^7.0.0", "@babel/polyfill@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.7.0.tgz#e1066e251e17606ec7908b05617f9b7f8180d8f3" + integrity sha512-/TS23MVvo34dFmf8mwCisCbWGrfhbiWZSwBo6HkADTBhUa2Q/jWltyY/tpofz/b6/RIhqaqQcquptCirqIhOaQ== dependencies: - core-js "^2.5.7" - regenerator-runtime "^0.12.0" + core-js "^2.6.5" + regenerator-runtime "^0.13.2" -"@babel/preset-env@^7.0.0": - version "7.2.3" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.2.3.tgz#948c8df4d4609c99c7e0130169f052ea6a7a8933" - integrity sha512-AuHzW7a9rbv5WXmvGaPX7wADxFkZIqKlbBh1dmZUQp4iwiPpkE/Qnrji6SC4UQCQzvWY/cpHET29eUhXS9cLPw== +"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.7.0": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.7.4.tgz#ccaf309ae8d1ee2409c85a4e2b5e280ceee830f8" + integrity sha512-Dg+ciGJjwvC1NIe/DGblMbcGq1HOtKbw8RLl4nIjlfcILKEOkWT/vRqPpumswABEBVudii6dnVwrBtzD7ibm4g== dependencies: - "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-module-imports" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-async-generator-functions" "^7.2.0" - "@babel/plugin-proposal-json-strings" "^7.2.0" - "@babel/plugin-proposal-object-rest-spread" "^7.2.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.2.0" - "@babel/plugin-syntax-async-generators" "^7.2.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - "@babel/plugin-transform-arrow-functions" "^7.2.0" - "@babel/plugin-transform-async-to-generator" "^7.2.0" - "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.2.0" - "@babel/plugin-transform-classes" "^7.2.0" - "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.2.0" - "@babel/plugin-transform-dotall-regex" "^7.2.0" - "@babel/plugin-transform-duplicate-keys" "^7.2.0" - "@babel/plugin-transform-exponentiation-operator" "^7.2.0" - "@babel/plugin-transform-for-of" "^7.2.0" - "@babel/plugin-transform-function-name" "^7.2.0" - "@babel/plugin-transform-literals" "^7.2.0" - "@babel/plugin-transform-modules-amd" "^7.2.0" - "@babel/plugin-transform-modules-commonjs" "^7.2.0" - "@babel/plugin-transform-modules-systemjs" "^7.2.0" - "@babel/plugin-transform-modules-umd" "^7.2.0" - "@babel/plugin-transform-new-target" "^7.0.0" - "@babel/plugin-transform-object-super" "^7.2.0" - "@babel/plugin-transform-parameters" "^7.2.0" - "@babel/plugin-transform-regenerator" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.2.0" - "@babel/plugin-transform-spread" "^7.2.0" - "@babel/plugin-transform-sticky-regex" "^7.2.0" - "@babel/plugin-transform-template-literals" "^7.2.0" - "@babel/plugin-transform-typeof-symbol" "^7.2.0" - "@babel/plugin-transform-unicode-regex" "^7.2.0" - browserslist "^4.3.4" + "@babel/plugin-proposal-async-generator-functions" "^7.7.4" + "@babel/plugin-proposal-dynamic-import" "^7.7.4" + "@babel/plugin-proposal-json-strings" "^7.7.4" + "@babel/plugin-proposal-object-rest-spread" "^7.7.4" + "@babel/plugin-proposal-optional-catch-binding" "^7.7.4" + "@babel/plugin-proposal-unicode-property-regex" "^7.7.4" + "@babel/plugin-syntax-async-generators" "^7.7.4" + "@babel/plugin-syntax-dynamic-import" "^7.7.4" + "@babel/plugin-syntax-json-strings" "^7.7.4" + "@babel/plugin-syntax-object-rest-spread" "^7.7.4" + "@babel/plugin-syntax-optional-catch-binding" "^7.7.4" + "@babel/plugin-syntax-top-level-await" "^7.7.4" + "@babel/plugin-transform-arrow-functions" "^7.7.4" + "@babel/plugin-transform-async-to-generator" "^7.7.4" + "@babel/plugin-transform-block-scoped-functions" "^7.7.4" + "@babel/plugin-transform-block-scoping" "^7.7.4" + "@babel/plugin-transform-classes" "^7.7.4" + "@babel/plugin-transform-computed-properties" "^7.7.4" + "@babel/plugin-transform-destructuring" "^7.7.4" + "@babel/plugin-transform-dotall-regex" "^7.7.4" + "@babel/plugin-transform-duplicate-keys" "^7.7.4" + "@babel/plugin-transform-exponentiation-operator" "^7.7.4" + "@babel/plugin-transform-for-of" "^7.7.4" + "@babel/plugin-transform-function-name" "^7.7.4" + "@babel/plugin-transform-literals" "^7.7.4" + "@babel/plugin-transform-member-expression-literals" "^7.7.4" + "@babel/plugin-transform-modules-amd" "^7.7.4" + "@babel/plugin-transform-modules-commonjs" "^7.7.4" + "@babel/plugin-transform-modules-systemjs" "^7.7.4" + "@babel/plugin-transform-modules-umd" "^7.7.4" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.7.4" + "@babel/plugin-transform-new-target" "^7.7.4" + "@babel/plugin-transform-object-super" "^7.7.4" + "@babel/plugin-transform-parameters" "^7.7.4" + "@babel/plugin-transform-property-literals" "^7.7.4" + "@babel/plugin-transform-regenerator" "^7.7.4" + "@babel/plugin-transform-reserved-words" "^7.7.4" + "@babel/plugin-transform-shorthand-properties" "^7.7.4" + "@babel/plugin-transform-spread" "^7.7.4" + "@babel/plugin-transform-sticky-regex" "^7.7.4" + "@babel/plugin-transform-template-literals" "^7.7.4" + "@babel/plugin-transform-typeof-symbol" "^7.7.4" + "@babel/plugin-transform-unicode-regex" "^7.7.4" + "@babel/types" "^7.7.4" + browserslist "^4.6.0" + core-js-compat "^3.1.1" invariant "^2.2.2" js-levenshtein "^1.1.3" - semver "^5.3.0" + semver "^5.5.0" -"@babel/runtime@^7.2.0": - version "7.3.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.3.1.tgz#574b03e8e8a9898eaf4a872a92ea20b7846f6f2a" - integrity sha512-7jGW8ppV0ant637pIqAcFfQDDH1orEPGJb8aXfUozuCU3QqX7rX4DA8iwrbPrR1hcH0FTTHz47yQnk+bl5xHQA== +"@babel/runtime@^7.2.0", "@babel/runtime@^7.7.0": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.4.tgz#b23a856751e4bf099262f867767889c0e3fe175b" + integrity sha512-r24eVUUr0QqNZa+qrImUk8fn5SPhHq+IfYvIoIMg0do3GdK9sMdiLKP3GYVVaxpPKORgm8KRKaNTEhAjgIpLMw== dependencies: - regenerator-runtime "^0.12.0" + regenerator-runtime "^0.13.2" -"@babel/template@^7.1.0", "@babel/template@^7.2.2": +"@babel/template@^7.1.0": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" integrity sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g== @@ -701,16 +794,16 @@ "@babel/parser" "^7.2.2" "@babel/types" "^7.2.2" -"@babel/template@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" - integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== +"@babel/template@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b" + integrity sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/parser" "^7.7.4" + "@babel/types" "^7.7.4" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.2.3", "@babel/traverse@^7.2.4", "@babel/traverse@^7.3.4", "@babel/traverse@^7.4.0", "@babel/traverse@^7.4.5", "@babel/traverse@^7.5.0": +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.2.4", "@babel/traverse@^7.3.4", "@babel/traverse@^7.4.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.5.tgz#f664f8f368ed32988cd648da9f72d5ca70f165bb" integrity sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ== @@ -725,7 +818,22 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.1.6", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.2", "@babel/types@^7.3.4", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.0", "@babel/types@^7.5.5": +"@babel/traverse@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.4.tgz#9c1e7c60fb679fe4fcfaa42500833333c2058558" + integrity sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.7.4" + "@babel/helper-function-name" "^7.7.4" + "@babel/helper-split-export-declaration" "^7.7.4" + "@babel/parser" "^7.7.4" + "@babel/types" "^7.7.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/types@^7.0.0", "@babel/types@^7.1.6", "@babel/types@^7.2.2", "@babel/types@^7.3.2", "@babel/types@^7.3.4", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.5.tgz#97b9f728e182785909aa4ab56264f090a028d18a" integrity sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw== @@ -734,6 +842,15 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@babel/types@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" + integrity sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + "@ember-data/-build-infra@3.13.1": version "3.13.1" resolved "https://registry.yarnpkg.com/@ember-data/-build-infra/-/-build-infra-3.13.1.tgz#e31247b72a4c61b837286d0ef0829f4128466601" @@ -2320,6 +2437,13 @@ babel-plugin-debug-macros@^0.3.0, babel-plugin-debug-macros@^0.3.2, babel-plugin dependencies: semver "^5.3.0" +babel-plugin-dynamic-import-node@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" + integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== + dependencies: + object.assign "^4.1.0" + babel-plugin-ember-modules-api-polyfill@^2.12.0, babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-polyfill@^2.8.0: version "2.12.0" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.12.0.tgz#a5e703205ba4e625a7fab9bb1aea64ef3222cf75" @@ -3745,14 +3869,14 @@ browserslist@^4.0.0: electron-to-chromium "^1.3.103" node-releases "^1.1.3" -browserslist@^4.3.4: - version "4.4.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.4.0.tgz#7050d1412cbfc5274aba609ed5e50359ca1a5fdf" - integrity sha512-tQkHS8VVxWbrjnNDXgt7/+SuPJ7qDvD0Y2e6bLtoQluR2SPvlmPUcfcU75L1KAalhqULlIFJlJ6BDfnYyJxJsw== +browserslist@^4.6.0, browserslist@^4.7.3: + version "4.7.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.3.tgz#02341f162b6bcc1e1028e30624815d4924442dc3" + integrity sha512-jWvmhqYpx+9EZm/FxcZSbUZyDEvDTLDi3nSAKbzEkyWvtI0mNSmUosey+5awDW1RUlrgXbQb5A6qY1xQH9U6MQ== dependencies: - caniuse-lite "^1.0.30000928" - electron-to-chromium "^1.3.100" - node-releases "^1.1.3" + caniuse-lite "^1.0.30001010" + electron-to-chromium "^1.3.306" + node-releases "^1.1.40" bser@^2.0.0: version "2.0.0" @@ -3973,10 +4097,10 @@ caniuse-lite@^1.0.30000844: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25" integrity sha512-vs79o1mOSKRGv/1pSkp4EXgl4ZviWeYReXw60XfacPU64uQWZwJT6vZNmxRF9O+6zu71sJwMxLK5JXxbzuVrLw== -caniuse-lite@^1.0.30000928: - version "1.0.30000928" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000928.tgz#805e828dc72b06498e3683a32e61c7507fd67b88" - integrity sha512-aSpMWRXL6ZXNnzm8hgE4QDLibG5pVJ2Ujzsuj3icazlIkxXkPXtL+BWnMx6FBkWmkZgBHGUxPZQvrbRw2ZTxhg== +caniuse-lite@^1.0.30001010: + version "1.0.30001011" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001011.tgz#0d6c4549c78c4a800bb043a83ca0cbe0aee6c6e1" + integrity sha512-h+Eqyn/YA6o6ZTqpS86PyRmNWOs1r54EBDcd2NTwwfsXQ8re1B38SnB+p2RKF8OUsyEIjeDU8XGec1RGO/wYCg== capture-exit@^1.2.0: version "1.2.0" @@ -4530,18 +4654,18 @@ continuable-cache@^0.3.1: resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f" integrity sha1-vXJ6f67XfnH/OYWskzUakSczrQ8= -convert-source-map@^1.1.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" - integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== - dependencies: - safe-buffer "~5.1.1" - convert-source-map@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" integrity sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU= +convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -4579,6 +4703,14 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +core-js-compat@^3.1.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.4.2.tgz#652fa7c54652b7f6586a893e37001df55ea2ac37" + integrity sha512-W0Aj+LM3EAxxjD0Kp2o4be8UlnxIZHNupBv2znqrheR4aY2nOn91794k/xoSp+SxqqriiZpTsSwBtZr60cbkwQ== + dependencies: + browserslist "^4.7.3" + semver "^6.3.0" + core-js@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" @@ -4594,6 +4726,11 @@ core-js@^2.5.7: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.2.tgz#267988d7268323b349e20b4588211655f0e83944" integrity sha512-NdBPF/RVwPW6jr0NCILuyN9RiqLo2b1mddWHkUL+VnvcB7dzlnBJ1bXYntjpTGOgkZiiLWj2JxmOr7eGE3qK6g== +core-js@^2.6.5: + version "2.6.10" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.10.tgz#8a5b8391f8cc7013da703411ce5b585706300d7f" + integrity sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA== + core-object@2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/core-object/-/core-object-2.0.6.tgz#60134b9c40ff69b27bc15e82db945e4df782961b" @@ -5160,7 +5297,7 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.100, electron-to-chromium@^1.3.103: +electron-to-chromium@^1.3.103: version "1.3.103" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.103.tgz#a695777efdbc419cad6cbb0e58458251302cd52f" integrity sha512-tObPqGmY9X8MUM8i3MEimYmbnLLf05/QV5gPlkR8MQ3Uj8G8B2govE1U4cQcBYtv3ymck9Y8cIOu4waoiykMZQ== @@ -5170,6 +5307,11 @@ electron-to-chromium@^1.3.30: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.32.tgz#11d0684c0840e003c4be8928f8ac5f35dbc2b4e6" integrity sha1-EdBoTAhA4APEvoko+KxfNdvCtOY= +electron-to-chromium@^1.3.306: + version "1.3.311" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.311.tgz#73baa361e2b1f44b7b4f1a443aaa1372f8074ebb" + integrity sha512-7GH6RKCzziLzJ9ejmbiBEdzHZsc6C3eRpav14dmRfTWMpNgMqpP1ukw/FU/Le2fR+ep642naq7a23xNdmh2s+A== + electron-to-chromium@^1.3.47: version "1.3.52" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0" @@ -5401,18 +5543,18 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6 semver "^5.5.0" ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3, ember-cli-babel@^7.8.0: - version "7.12.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.12.0.tgz#064997d199384be8c88d251f30ef67953d3bddc5" - integrity sha512-+EGQsbPvh19nNXHCm6rVBx2CdlxQlzxMyhey5hsGViDPriDI4PFYXYaFWdGizDrmZoDcG/Ywpeph3hl0NxGQTg== - dependencies: - "@babel/core" "^7.0.0" - "@babel/plugin-proposal-class-properties" "^7.3.4" - "@babel/plugin-proposal-decorators" "^7.3.0" - "@babel/plugin-transform-modules-amd" "^7.0.0" - "@babel/plugin-transform-runtime" "^7.2.0" - "@babel/polyfill" "^7.0.0" - "@babel/preset-env" "^7.0.0" - "@babel/runtime" "^7.2.0" + version "7.13.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.13.0.tgz#3f2c2ba7a44d7948ec927d41cf072673330f62cd" + integrity sha512-VjagtumwQP+3jsjLR64gpca5iq2o0PS1MT0PdC90COtAYqpOqNM9axYEYBamNLIuv+3vJpAoFKu8EMBC1ZlWGQ== + dependencies: + "@babel/core" "^7.7.0" + "@babel/plugin-proposal-class-properties" "^7.7.0" + "@babel/plugin-proposal-decorators" "^7.7.0" + "@babel/plugin-transform-modules-amd" "^7.5.0" + "@babel/plugin-transform-runtime" "^7.6.0" + "@babel/polyfill" "^7.7.0" + "@babel/preset-env" "^7.7.0" + "@babel/runtime" "^7.7.0" amd-name-resolver "^1.2.1" babel-plugin-debug-macros "^0.3.0" babel-plugin-ember-modules-api-polyfill "^2.12.0" @@ -10808,6 +10950,13 @@ node-releases@^1.1.3: dependencies: semver "^5.3.0" +node-releases@^1.1.40: + version "1.1.41" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.41.tgz#57674a82a37f812d18e3b26118aefaf53a00afed" + integrity sha512-+IctMa7wIs8Cfsa8iYzeaLTFwv5Y4r5jZud+4AnfymzeEXKBCavFX0KBgzVaPVqf0ywa6PrO8/b+bPqdwjGBSg== + dependencies: + semver "^6.3.0" + node-uuid@~1.4.0: version "1.4.8" resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" @@ -10987,16 +11136,16 @@ object-inspect@^1.6.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== +object-keys@^1.0.11, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + object-keys@^1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag== -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -11004,6 +11153,16 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + object.getownpropertydescriptors@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" @@ -12162,10 +12321,10 @@ redeyed@~1.0.0: dependencies: esprima "~3.0.0" -regenerate-unicode-properties@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" - integrity sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw== +regenerate-unicode-properties@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" + integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== dependencies: regenerate "^1.4.0" @@ -12189,10 +12348,10 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-runtime@^0.12.0: - version "0.12.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" - integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== +regenerator-runtime@^0.13.2: + version "0.13.3" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" + integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== regenerator-runtime@^0.9.5: version "0.9.6" @@ -12208,10 +12367,10 @@ regenerator-transform@^0.10.0: babel-types "^6.19.0" private "^0.1.6" -regenerator-transform@^0.13.3: - version "0.13.3" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" - integrity sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA== +regenerator-transform@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb" + integrity sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ== dependencies: private "^0.1.6" @@ -12256,17 +12415,17 @@ regexpu-core@^2.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" -regexpu-core@^4.1.3, regexpu-core@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.4.0.tgz#8d43e0d1266883969720345e70c275ee0aec0d32" - integrity sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA== +regexpu-core@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" + integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== dependencies: regenerate "^1.4.0" - regenerate-unicode-properties "^7.0.0" + regenerate-unicode-properties "^8.1.0" regjsgen "^0.5.0" regjsparser "^0.6.0" unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.0.2" + unicode-match-property-value-ecmascript "^1.1.0" registry-auth-token@^3.0.1: version "3.3.2" @@ -14038,10 +14197,10 @@ unicode-match-property-ecmascript@^1.0.4: unicode-canonical-property-names-ecmascript "^1.0.4" unicode-property-aliases-ecmascript "^1.0.4" -unicode-match-property-value-ecmascript@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" - integrity sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ== +unicode-match-property-value-ecmascript@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" + integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== unicode-property-aliases-ecmascript@^1.0.4: version "1.0.4" From 30c81572d20ddb5f6567a9ce950a317bc4d00ab0 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 23 Nov 2019 00:00:42 -0500 Subject: [PATCH 590/879] build(deps-dev): bump eslint-plugin-ember from 7.4.1 to 7.6.0 (#1827) Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 7.4.1 to 7.6.0. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v7.4.1...v7.6.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 0afb076ae..bf28b19de 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6728,9 +6728,9 @@ esdoc@pzuraq/esdoc#015a342: taffydb "2.7.2" eslint-plugin-ember@^7.0.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.4.1.tgz#d205cfb16f7614076a771a5b33907a160cec1893" - integrity sha512-QPpdTDrlcP5uj7pDuBBFyzTZdQt+ySWV2AQw9n2NfCRNPW10mMyI+Cs027Jb+jGl3RUISBZeCodPUW7fQR4ERg== + version "7.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.6.0.tgz#383ce9be91b3ac219046e616216d0adb32eda39a" + integrity sha512-ni+Ey2qgx3GTBvGm0px4s+Xp37ZWB7kJhvS9ZjhrZAHUVLHzberCP+Q+wxCHCu95Z564ARZe2x6W70ImDhLatA== dependencies: "@ember-data/rfc395-data" "^0.0.4" ember-rfc176-data "^0.3.12" From 3228e6177f9770bc4d08813c6448fd33e4f8e8cf Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 23 Nov 2019 00:01:38 -0500 Subject: [PATCH 591/879] Create config.yml --- .dependabot/config.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .dependabot/config.yml diff --git a/.dependabot/config.yml b/.dependabot/config.yml new file mode 100644 index 000000000..b3dfd9523 --- /dev/null +++ b/.dependabot/config.yml @@ -0,0 +1,13 @@ +version: 1 + +update_configs: + - package_manager: "javascript" + directory: "/" + update_schedule: "daily" + automerged_updates: + - match: + dependency_type: "all" + update_type: "in_range" + ignored_updates: + - match: + dependency_name: "ember-cli" From 8d955dfdfc7d3c86b04f224ab36bfd8f0b2c26d6 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 23 Nov 2019 00:01:55 -0500 Subject: [PATCH 592/879] build(deps-dev): bump ember-export-application-global (#1824) Bumps [ember-export-application-global](https://github.com/ember-cli/ember-export-application-global) from 2.0.0 to 2.0.1. - [Release notes](https://github.com/ember-cli/ember-export-application-global/releases) - [Commits](https://github.com/ember-cli/ember-export-application-global/compare/v2.0.0...v2.0.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index bf28b19de..ad96a62d6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5523,7 +5523,7 @@ ember-cli-babel@7.7.3: ensure-posix-path "^1.0.2" semver "^5.5.0" -ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.7.2, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2: +ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.7.2, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2: version "6.18.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz#3f6435fd275172edeff2b634ee7b29ce74318957" integrity sha512-7ceC8joNYxY2wES16iIBlbPSxwKDBhYwC8drU3ZEvuPDMwVv1KzxCNu1fvxyFEBWhwaRNTUxSCsEVoTd9nosGA== @@ -6188,11 +6188,9 @@ ember-disable-prototype-extensions@^1.1.3: integrity sha1-GWkTUhdlS14nj5/i2dTkm1cgMp4= ember-export-application-global@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ember-export-application-global/-/ember-export-application-global-2.0.0.tgz#8d6d7619ac8a1a3f8c43003549eb21ebed685bd2" - integrity sha1-jW12GayKGj+MQwA1Sesh6+1oW9I= - dependencies: - ember-cli-babel "^6.0.0-beta.7" + version "2.0.1" + resolved "https://registry.yarnpkg.com/ember-export-application-global/-/ember-export-application-global-2.0.1.tgz#b120a70e322ab208defc9e2daebe8d0dfc2dcd46" + integrity sha512-B7wiurPgsxsSGzJuPFkpBWnaeuCu2PGpG2BjyrfA1VcL7//o+5RSnZqiCEY326y7qmxb2GoCgo0ft03KBU0rRw== ember-factory-for-polyfill@^1.3.1: version "1.3.1" From 88628dd4852382f34e3ff76a0a129e0cfc0be8b7 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 23 Nov 2019 05:56:22 +0000 Subject: [PATCH 593/879] build(deps-dev): bump ember-source from 3.14.1 to 3.14.2 Bumps [ember-source](https://github.com/emberjs/ember.js) from 3.14.1 to 3.14.2. - [Release notes](https://github.com/emberjs/ember.js/releases) - [Changelog](https://github.com/emberjs/ember.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember.js/compare/v3.14.1...v3.14.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/yarn.lock b/yarn.lock index ad96a62d6..4c3b84c01 100644 --- a/yarn.lock +++ b/yarn.lock @@ -164,14 +164,7 @@ dependencies: "@babel/types" "^7.7.4" -"@babel/helper-module-imports@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" - integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-module-imports@^7.7.4": +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz#e5a92529f8888bf319a6376abfbd1cebc491ad91" integrity sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ== @@ -459,15 +452,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-block-scoping@^7.5.5", "@babel/plugin-transform-block-scoping@^7.6.0": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz#6e854e51fbbaa84351b15d4ddafe342f3a5d542a" - integrity sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - lodash "^4.17.13" - -"@babel/plugin-transform-block-scoping@^7.7.4": +"@babel/plugin-transform-block-scoping@^7.5.5", "@babel/plugin-transform-block-scoping@^7.6.0", "@babel/plugin-transform-block-scoping@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz#200aad0dcd6bb80372f94d9e628ea062c58bf224" integrity sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg== @@ -6404,9 +6389,9 @@ ember-source-channel-url@^2.0.1: got "^8.0.1" ember-source@~3.14.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.14.1.tgz#f11f98dffa7b169a045590203fa15c3ad2098c34" - integrity sha512-UvgjF/I7jANBEjQWdxtL/luXn97ZtIL3QCsJnR7HIcwRg7JuIyz/kaT9gLOGMxWEnwu610gJ+Ic0h0dkgQqg2w== + version "3.14.2" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.14.2.tgz#5cb5c84004192e2288300deb644b412fb389fc81" + integrity sha512-Yi99+K0C95gJR9kqGGyak2dZX2moBn4e+UmA5G3ZiJxDbWdvVGkef4u+8P261VRLvP9xsQiIruhkPqjHcs46XA== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/plugin-transform-block-scoping" "^7.6.0" From 2eda9be30cc1e899a1c2a7dd8e3d388c27fabd3c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 23 Nov 2019 11:35:22 -0500 Subject: [PATCH 594/879] build(deps-dev): bump ember-resolver from 5.3.0 to 6.0.0 (#1830) Bumps [ember-resolver](https://github.com/ember-cli/ember-resolver) from 5.3.0 to 6.0.0. - [Release notes](https://github.com/ember-cli/ember-resolver/releases) - [Changelog](https://github.com/ember-cli/ember-resolver/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-resolver/compare/v5.3.0...v6.0.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 21 +++++++-------------- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 859cc9d06..6bd5464b4 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "ember-load-initializers": "^2.0.0", "ember-maybe-import-regenerator-for-testing": "^1.0.0", "ember-moment": "^8.0.0", - "ember-resolver": "^5.0.1", + "ember-resolver": "^6.0.0", "ember-source": "~3.14.1", "ember-source-channel-url": "^2.0.1", "ember-try": "^1.0.0", diff --git a/yarn.lock b/yarn.lock index 4c3b84c01..914642039 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2401,13 +2401,6 @@ babel-plugin-check-es2015-constants@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-debug-macros@^0.1.10: - version "0.1.11" - resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.1.11.tgz#6c562bf561fccd406ce14ab04f42c218cf956605" - integrity sha512-hZw5qNNGAR02Y+yBUrtsnJHh8OXavkayPRqKGAXnIm4t5rWVpj3ArwsC7TWdpZsBguQvHAeyTxZ7s23yY60HHg== - dependencies: - semver "^5.3.0" - babel-plugin-debug-macros@^0.2.0, babel-plugin-debug-macros@^0.2.0-beta.6: version "0.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.2.0.tgz#0120ac20ce06ccc57bf493b667cf24b85c28da7a" @@ -5527,7 +5520,7 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3, ember-cli-babel@^7.8.0: +ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.13.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3, ember-cli-babel@^7.8.0: version "7.13.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.13.0.tgz#3f2c2ba7a44d7948ec927d41cf072673330f62cd" integrity sha512-VjagtumwQP+3jsjLR64gpca5iq2o0PS1MT0PdC90COtAYqpOqNM9axYEYBamNLIuv+3vJpAoFKu8EMBC1ZlWGQ== @@ -6324,16 +6317,16 @@ ember-qunit@^3.5.0: ember-cli-test-loader "^2.2.0" qunit "~2.6.0" -ember-resolver@^5.0.1: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-5.3.0.tgz#9fbeedfa63c094b588ac7647ba62f1305374f1d8" - integrity sha512-NWin+WzmsRnZxFvDlx9B3rb3kxwK0MNblJemoRvNbbxLK6z5lGxVoBfpU4/nqItWfwmpVb9ZK8bqXYs5q8HT4A== +ember-resolver@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-6.0.0.tgz#e06bc8720a2f9214b3aebbe1c35018d8b172560f" + integrity sha512-M2tarFwu0nd+fSa+Kuh8U9fRy5Vnp6l5sfoR+Pl4ihhqoIC2MdyAogVg5iKBC31AfFrYjXw0cm75UV9vLqSyzQ== dependencies: "@glimmer/resolver" "^0.4.1" - babel-plugin-debug-macros "^0.1.10" + babel-plugin-debug-macros "^0.3.3" broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.0" - ember-cli-babel "^6.16.0" + ember-cli-babel "^7.13.0" ember-cli-version-checker "^3.1.3" resolve "^1.12.0" From 31cbfeeb8de08088e49b0f0bf6d1e806d43a1888 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 23 Nov 2019 13:20:05 -0500 Subject: [PATCH 595/879] build(deps-dev): bump ember-data from 3.13.1 to 3.14.0 (#1831) Bumps [ember-data](https://github.com/emberjs/data) from 3.13.1 to 3.14.0. - [Release notes](https://github.com/emberjs/data/releases) - [Changelog](https://github.com/emberjs/data/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/data/compare/v3.13.1...v3.14.0) Signed-off-by: dependabot-preview[bot] --- package.json | 4 +- yarn.lock | 309 +++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 251 insertions(+), 62 deletions(-) diff --git a/package.json b/package.json index 6bd5464b4..18f8c09f3 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "ember-cli-sri": "^2.1.1", "ember-cli-uglify": "^3.0.0", "ember-composable-helpers": "^3.0.1", - "ember-data": "~3.13.1", + "ember-data": "~3.14.0", "ember-disable-prototype-extensions": "^1.1.3", "ember-export-application-global": "^2.0.0", "ember-load-initializers": "^2.0.0", @@ -92,7 +92,7 @@ "resolutions": { "favicons": "5.3.0", "ember-auto-import/**/terser-webpack-plugin": "1.2.1", - "ember-data": "3.13.1" + "ember-data": "3.14.0" }, "engines": { "node": "6.* || 8.* || >= 10.*" diff --git a/yarn.lock b/yarn.lock index 914642039..15f92fc72 100644 --- a/yarn.lock +++ b/yarn.lock @@ -342,6 +342,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-json-strings" "^7.7.4" +"@babel/plugin-proposal-nullish-coalescing-operator@^7.4.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.7.4.tgz#7db302c83bc30caa89e38fee935635ef6bd11c28" + integrity sha512-TbYHmr1Gl1UC7Vo2HVuj/Naci5BEGNZ0AJhzqD2Vpr6QPFWpUmBRLrIDjedzx7/CShq0bRDS2gI4FIs77VHLVQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.7.4" + "@babel/plugin-proposal-object-rest-spread@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.4.tgz#cc57849894a5c774214178c8ab64f6334ec8af71" @@ -358,6 +366,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-catch-binding" "^7.7.4" +"@babel/plugin-proposal-optional-chaining@^7.6.0": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.7.4.tgz#3f04c2de1a942cbd3008324df8144b9cbc0ca0ba" + integrity sha512-JmgaS+ygAWDR/STPe3/7y0lNlHgS+19qZ9aC06nYLwQ/XB7c0q5Xs+ksFU3EDnp9EiEsO0dnRAOKeyLHTZuW3A== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-chaining" "^7.7.4" + "@babel/plugin-proposal-unicode-property-regex@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.4.tgz#7c239ccaf09470dbe1d453d50057460e84517ebb" @@ -401,6 +417,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-nullish-coalescing-operator@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.7.4.tgz#e53b751d0c3061b1ba3089242524b65a7a9da12b" + integrity sha512-XKh/yIRPiQTOeBg0QJjEus5qiSKucKAiApNtO1psqG7D17xmE+X2i5ZqBEuSvo0HRuyPaKaSN/Gy+Ha9KFQolw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz#47cf220d19d6d0d7b154304701f468fc1cc6ff46" @@ -415,6 +438,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-optional-chaining@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.7.4.tgz#c91fdde6de85d2eb8906daea7b21944c3610c901" + integrity sha512-2MqYD5WjZSbJdUagnJvIdSfkb/ucOC9/1fRJxm7GAxY6YQLWlUvkfxoNbUPcPLHJyetKUDQ4+yyuUyAoc0HriA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-top-level-await@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.4.tgz#bd7d8fa7b9fee793a36e4027fd6dd1aa32f946da" @@ -429,6 +459,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-typescript@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.7.4.tgz#5d037ffa10f3b25a16f32570ebbe7a8c2efa304b" + integrity sha512-77blgY18Hud4NM1ggTA8xVT/dBENQf17OpiToSa2jSmEY3fWXD2jwrdVlO4kq5yzUTeF15WSQ6b4fByNvJcjpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-arrow-functions@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.7.4.tgz#76309bd578addd8aee3b379d809c802305a98a12" @@ -452,7 +489,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-block-scoping@^7.5.5", "@babel/plugin-transform-block-scoping@^7.6.0", "@babel/plugin-transform-block-scoping@^7.7.4": +"@babel/plugin-transform-block-scoping@^7.6.0", "@babel/plugin-transform-block-scoping@^7.6.2", "@babel/plugin-transform-block-scoping@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz#200aad0dcd6bb80372f94d9e628ea062c58bf224" integrity sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg== @@ -690,6 +727,15 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-typescript" "^7.2.0" +"@babel/plugin-transform-typescript@~7.7.0": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.7.4.tgz#2974fd05f4e85c695acaf497f432342de9fc0636" + integrity sha512-X8e3tcPEKnwwPVG+vP/vSqEShkwODOEeyQGod82qrIuidwIrfnsGn11qPM1jBLF4MqguTXXYzm58d0dY+/wdpg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-typescript" "^7.7.4" + "@babel/plugin-transform-unicode-regex@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.4.tgz#a3c0f65b117c4c81c5b6484f2a5e7b95346b83ae" @@ -836,14 +882,15 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" -"@ember-data/-build-infra@3.13.1": - version "3.13.1" - resolved "https://registry.yarnpkg.com/@ember-data/-build-infra/-/-build-infra-3.13.1.tgz#e31247b72a4c61b837286d0ef0829f4128466601" - integrity sha512-bDvnQVPAaQf2UuRsU/6ha444hwdUsUeV5vNsc7U2i6ffzSYiF9y8yQhOoW0JgTUwz0mnASRscOO6QKEUJOTkKA== +"@ember-data/-build-infra@3.14.0": + version "3.14.0" + resolved "https://registry.yarnpkg.com/@ember-data/-build-infra/-/-build-infra-3.14.0.tgz#d81242b018038b0bf39bceaa1b0df167398f60b8" + integrity sha512-rF3RDpDe49UnhhNxRLCkOSqO6DDl2zxJB4+1ZYXNjxkWoxRZQ2U/Hzq28+khEz2WFdiGFSaK8jT1tFTZ1xoutw== dependencies: - "@babel/plugin-transform-block-scoping" "^7.5.5" + "@babel/plugin-transform-block-scoping" "^7.6.2" + "@ember-data/canary-features" "3.14.0" "@ember/edition-utils" "^1.1.1" - babel-plugin-debug-macros "^0.3.2" + babel-plugin-debug-macros "^0.3.3" babel-plugin-feature-flags "^0.3.1" babel-plugin-filter-imports "^3.0.0" babel6-plugin-strip-class-callcheck "^6.0.0" @@ -861,40 +908,41 @@ git-repo-info "^2.0.0" glob "^7.1.4" npm-git-info "^1.0.3" - rimraf "^2.6.2" + rimraf "^3.0.0" rsvp "^4.8.5" silent-error "^1.1.1" -"@ember-data/adapter@3.13.1": - version "3.13.1" - resolved "https://registry.yarnpkg.com/@ember-data/adapter/-/adapter-3.13.1.tgz#2cb9becd3b8ac844e1ae97b408d2c3118a695f5c" - integrity sha512-IpdebSh8B4HlLwkpmpOJUE63U0Q0itI3StsGzZ5i/DIKD6WsMFdux7v8fxRqkW4ZwQDjQdEAtNUUWRILQcWDFw== +"@ember-data/adapter@3.14.0": + version "3.14.0" + resolved "https://registry.yarnpkg.com/@ember-data/adapter/-/adapter-3.14.0.tgz#88900b0f77c042079683058c7a291103171fff67" + integrity sha512-bv8kiK3lUNQsMbxOSsk3N/aJ0ZjOe/5k5XH4921r/itxAtjzSYeIsjM0Ziyc9hubkUz3LDXJIU4ARgOUvi6gsw== dependencies: - "@ember-data/-build-infra" "3.13.1" + "@ember-data/-build-infra" "3.14.0" "@ember/edition-utils" "^1.1.1" - ember-cli-babel "^7.8.0" + ember-cli-babel "^7.11.1" ember-cli-test-info "^1.0.0" - ember-cli-typescript "^2.0.2" + ember-cli-typescript "^3.0.0" -"@ember-data/canary-features@3.13.1": - version "3.13.1" - resolved "https://registry.yarnpkg.com/@ember-data/canary-features/-/canary-features-3.13.1.tgz#c60302d498153fbefe9f1a6d30b9a23d997cbc49" - integrity sha512-zfLpzcTxux5UPA/E0snGJqbM3yPtcQgWcen45Rcj9AcQNsnYiw/r9HV0uTHzRzeyH7lDMplyvLdQedvyk8K88w== +"@ember-data/canary-features@3.14.0": + version "3.14.0" + resolved "https://registry.yarnpkg.com/@ember-data/canary-features/-/canary-features-3.14.0.tgz#0474ebcbf0102b3e705a6312c50fb933447b7462" + integrity sha512-VgXZk99tpHG30PLL46RC2TfzM8DLGLcliFfuP/+eo/ZfPJlwAneDJxxBlngAhSDfEFyZML5mXDOnHAxLghX5/A== dependencies: - ember-cli-babel "^7.8.0" + ember-cli-babel "^7.11.1" -"@ember-data/model@3.13.1": - version "3.13.1" - resolved "https://registry.yarnpkg.com/@ember-data/model/-/model-3.13.1.tgz#6364d5ed3f8997a35d39b5b97a3519b2df63870b" - integrity sha512-lm6AWuBSNp6zMPIjJGN6Dh7u4DJDd8ejOPaS3Cv7r7pgR1ROxRmrjMcgxFdqMY51a/MREj0BfTMWSHKsftcCYA== +"@ember-data/model@3.14.0": + version "3.14.0" + resolved "https://registry.yarnpkg.com/@ember-data/model/-/model-3.14.0.tgz#6c4a60143837355f0d124404ef256270b841788e" + integrity sha512-VYuZtF+4H672xfpnKdb0yXjUHVQ3nd9nE7wtL58oSbZtiYi6nNVtzGVs66M/e04mZI9zdofAAtUQ3eO1K+JQdg== dependencies: - "@ember-data/-build-infra" "3.13.1" - "@ember-data/store" "3.13.1" + "@ember-data/-build-infra" "3.14.0" + "@ember-data/canary-features" "3.14.0" + "@ember-data/store" "3.14.0" "@ember/edition-utils" "^1.1.1" - ember-cli-babel "^7.8.0" + ember-cli-babel "^7.11.1" ember-cli-string-utils "^1.1.0" ember-cli-test-info "^1.0.0" - ember-cli-typescript "^2.0.2" + ember-cli-typescript "^3.0.0" ember-compatibility-helpers "^1.2.0" inflection "1.12.0" @@ -903,28 +951,29 @@ resolved "https://registry.yarnpkg.com/@ember-data/rfc395-data/-/rfc395-data-0.0.4.tgz#ecb86efdf5d7733a76ff14ea651a1b0ed1f8a843" integrity sha512-tGRdvgC9/QMQSuSuJV45xoyhI0Pzjm7A9o/MVVA3HakXIImJbbzx/k/6dO9CUEQXIyS2y0fW6C1XaYOG7rY0FQ== -"@ember-data/serializer@3.13.1": - version "3.13.1" - resolved "https://registry.yarnpkg.com/@ember-data/serializer/-/serializer-3.13.1.tgz#0d1f844caa4e98f6f6c7f28341fa6660b7e568c3" - integrity sha512-DhTtsvED0KSLy21zBw5NVnSnaJgLEv5vvLUPN1JQyY47Q+auQXi2JXzgTV8mYdTl4Xbe6GYygC0jyPUA4rM8IA== +"@ember-data/serializer@3.14.0": + version "3.14.0" + resolved "https://registry.yarnpkg.com/@ember-data/serializer/-/serializer-3.14.0.tgz#8361d56b8a8170b8e48a6d1945d1cbbd6d7a569a" + integrity sha512-Vh3pv4oB48krrcqCWAztAJZggkQkTRtW59Ii1VZ70JQuFLil3lNbFo1qDGWHCWdPv/9kEqMD50ZTyytMpXqCGA== dependencies: - "@ember-data/-build-infra" "3.13.1" - "@ember-data/store" "3.13.1" - ember-cli-babel "^7.8.0" + "@ember-data/-build-infra" "3.14.0" + "@ember-data/store" "3.14.0" + ember-cli-babel "^7.11.1" ember-cli-test-info "^1.0.0" - ember-cli-typescript "^2.0.2" + ember-cli-typescript "^3.0.0" -"@ember-data/store@3.13.1": - version "3.13.1" - resolved "https://registry.yarnpkg.com/@ember-data/store/-/store-3.13.1.tgz#e74cad3f5650451f90740b3b3e5f4ed0f6213127" - integrity sha512-7Inhnl3J6yFYE6autfOUPyrNJ63S28OXUM3k4O0pOlvWQbsEPNoELMNPUvjatxRB608qg5Yloh/kVxbdZsM/4w== +"@ember-data/store@3.14.0": + version "3.14.0" + resolved "https://registry.yarnpkg.com/@ember-data/store/-/store-3.14.0.tgz#0b1fa76d5d5bed17226e0dfbdba57084bf2579f1" + integrity sha512-Ytr4PgWT7rsMy9XxGz67kAAX7Iz4c56KGiI2SK16HhU+hUOARHRmfKrVKGte5wq3omFAcM+AmgH+xifThHAcsg== dependencies: - "@ember-data/-build-infra" "3.13.1" - "@ember-data/adapter" "3.13.1" - "@ember-data/canary-features" "3.13.1" - ember-cli-babel "^7.8.0" + "@ember-data/-build-infra" "3.14.0" + "@ember-data/adapter" "3.14.0" + "@ember-data/canary-features" "3.14.0" + "@ember/ordered-set" "^2.0.3" + ember-cli-babel "^7.11.1" ember-cli-path-utils "^1.0.0" - ember-cli-typescript "^2.0.2" + ember-cli-typescript "^3.0.0" heimdalljs "^0.3.0" "@ember/edition-utils@^1.1.1": @@ -2408,7 +2457,7 @@ babel-plugin-debug-macros@^0.2.0, babel-plugin-debug-macros@^0.2.0-beta.6: dependencies: semver "^5.3.0" -babel-plugin-debug-macros@^0.3.0, babel-plugin-debug-macros@^0.3.2, babel-plugin-debug-macros@^0.3.3: +babel-plugin-debug-macros@^0.3.0, babel-plugin-debug-macros@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.3.3.tgz#29c3449d663f61c7385f5b8c72d8015b069a5cb7" integrity sha512-E+NI8TKpxJDBbVkdWkwHrKgJi696mnRL8XYrOPYw82veNHPDORM9WIQifl6TpIo8PNy2tU2skPqbfkmHXrHKQA== @@ -4793,6 +4842,15 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + crypt@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" @@ -5520,7 +5578,7 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.13.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3, ember-cli-babel@^7.8.0: +ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.13.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: version "7.13.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.13.0.tgz#3f2c2ba7a44d7948ec927d41cf072673330f62cd" integrity sha512-VjagtumwQP+3jsjLR64gpca5iq2o0PS1MT0PdC90COtAYqpOqNM9axYEYBamNLIuv+3vJpAoFKu8EMBC1ZlWGQ== @@ -5935,6 +5993,25 @@ ember-cli-typescript@^2.0.0, ember-cli-typescript@^2.0.2: stagehand "^1.0.0" walk-sync "^1.0.0" +ember-cli-typescript@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-3.1.1.tgz#a5a12ebf915e43ded7bf6bb460ecea4b67b0d95b" + integrity sha512-HCjM5EZ29Yh94Jy/M2+MVkS9LdtOoGYtYLIcZ4F7umJaRJM67ku/xCyN/2r+uTeYTNdpJN9+HWx30a6yyAbfRA== + dependencies: + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.4.4" + "@babel/plugin-proposal-optional-chaining" "^7.6.0" + "@babel/plugin-transform-typescript" "~7.7.0" + ansi-to-html "^0.6.6" + debug "^4.0.0" + ember-cli-babel-plugin-helpers "^1.0.0" + execa "^3.0.0" + fs-extra "^8.0.0" + resolve "^1.5.0" + rsvp "^4.8.1" + semver "^6.0.0" + stagehand "^1.0.0" + walk-sync "^2.0.0" + ember-cli-uglify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ember-cli-uglify/-/ember-cli-uglify-3.0.0.tgz#8819665b2cc5fe70e3ba9fe7a94645209bc42fd6" @@ -6144,20 +6221,20 @@ ember-copy@^1.0.0: dependencies: ember-cli-babel "^6.6.0" -"ember-data@2.x - 3.x", ember-data@3.13.1, ember-data@~3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.13.1.tgz#a6b31703de9feaae19f2a0fccfc72185808174dd" - integrity sha512-1mxmnvwWXjqfjGXwukHhArJvH829pEdWXiOnZXIDLC2K1PfFHkXxBjONlssGRBPI2rS4Oaa2M6/47uAyZ4mkEA== - dependencies: - "@ember-data/-build-infra" "3.13.1" - "@ember-data/adapter" "3.13.1" - "@ember-data/model" "3.13.1" - "@ember-data/serializer" "3.13.1" - "@ember-data/store" "3.13.1" +"ember-data@2.x - 3.x", ember-data@3.14.0, ember-data@~3.14.0: + version "3.14.0" + resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.14.0.tgz#e36584722bf84aef21a0541e10f2a3016b75b231" + integrity sha512-qmABgVOR/BtQV8mSCskn9EHYewVENGbvMzJfnNZ4EEWVebYQKqy2tAw1DHfiOkCmUk2MpFnJi/UfyH0p4nWhhQ== + dependencies: + "@ember-data/-build-infra" "3.14.0" + "@ember-data/adapter" "3.14.0" + "@ember-data/model" "3.14.0" + "@ember-data/serializer" "3.14.0" + "@ember-data/store" "3.14.0" "@ember/ordered-set" "^2.0.3" "@glimmer/env" "^0.1.7" - ember-cli-babel "^7.8.0" - ember-cli-typescript "^2.0.2" + ember-cli-babel "^7.11.1" + ember-cli-typescript "^3.0.0" ember-inflector "^3.0.1" ember-disable-prototype-extensions@^1.1.3: @@ -6967,6 +7044,22 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-3.3.0.tgz#7e348eef129a1937f21ecbbd53390942653522c1" + integrity sha512-j5Vit5WZR/cbHlqU97+qcnw9WHRCIL4V1SVe75VcHcD1JRBdt8fv0zw89b7CQHQdUHTt2VjuhcF5ibAgVOxqpg== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + exif-parser@^0.1.12, exif-parser@^0.1.9: version "0.1.12" resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922" @@ -7709,6 +7802,15 @@ fs-extra@^7.0.0, fs-extra@^7.0.1: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" @@ -7858,6 +7960,13 @@ get-stream@^4.0.0: dependencies: pump "^3.0.0" +get-stream@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" + integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + dependencies: + pump "^3.0.0" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -8093,6 +8202,11 @@ graceful-fs@^4.1.15: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== +graceful-fs@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + "graceful-readlink@>= 1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" @@ -8451,6 +8565,11 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + ice-cap@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/ice-cap/-/ice-cap-0.0.4.tgz#8a6d31ab4cac8d4b56de4fa946df3352561b6e18" @@ -8953,6 +9072,11 @@ is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + is-symbol@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" @@ -10414,6 +10538,11 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + merge-trees@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-trees/-/merge-trees-1.0.1.tgz#ccbe674569787f9def17fd46e6525f5700bbd23e" @@ -10558,6 +10687,11 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + mimic-response@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" @@ -11024,6 +11158,13 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" +npm-run-path@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.0.tgz#d644ec1bd0569187d2a52909971023a0a58e8438" + integrity sha512-8eyAOAH+bYXFPSnNnKr3J+yoybe8O87Is5rtAQ8qRczJz1ajcsjg8l2oZqP+Ppx15Ii3S1vUTjQN2h4YO2tWWQ== + dependencies: + path-key "^3.0.0" + npmlog@^4.0.0, npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" @@ -11208,6 +11349,13 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + dependencies: + mimic-fn "^2.1.0" + optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" @@ -11293,6 +11441,11 @@ p-finally@^1.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-finally@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" + integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== + p-is-promise@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" @@ -11550,6 +11703,11 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" @@ -12666,6 +12824,13 @@ rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.1, rimraf@^2.4.3, rimraf dependencies: glob "^7.1.3" +rimraf@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" + integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg== + dependencies: + glob "^7.1.3" + rimraf@~2.2.6: version "2.2.8" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" @@ -13027,11 +13192,23 @@ shebang-command@^1.2.0: dependencies: shebang-regex "^1.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" @@ -13565,6 +13742,11 @@ strip-eof@^1.0.0: resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" @@ -14504,7 +14686,7 @@ walk-sync@^1.0.0, walk-sync@^1.0.1, walk-sync@^1.1.3: ensure-posix-path "^1.1.0" matcher-collection "^1.1.1" -walk-sync@^2.0.2: +walk-sync@^2.0.0, walk-sync@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-2.0.2.tgz#5ea8a28377c8be68c92d50f4007ea381725da14b" integrity sha512-dCZkrxfHjPn7tIvdYrX3uMD/R0beVrHpA8lROQ5wWrl8psJgR6xwCkwqTFes0dNujbS2o/ITpvSYgIFsLsf13A== @@ -14677,6 +14859,13 @@ which@^1.2.14, which@^1.2.9, which@^1.3.0: dependencies: isexe "^2.0.0" +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + wide-align@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" From 18f359b05417f847fad35e99abf3338db97fc380 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Sat, 23 Nov 2019 14:10:28 -0500 Subject: [PATCH 596/879] Update yarn.lock file (#1832) --- yarn.lock | 3921 +++++++++++++++++++---------------------------------- 1 file changed, 1421 insertions(+), 2500 deletions(-) diff --git a/yarn.lock b/yarn.lock index 15f92fc72..969e59d83 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,14 +2,7 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" - integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== - dependencies: - "@babel/highlight" "^7.0.0" - -"@babel/code-frame@^7.5.5": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== @@ -36,17 +29,6 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.5.tgz#873a7f936a3c89491b43536d12245b626664e3cf" - integrity sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ== - dependencies: - "@babel/types" "^7.5.5" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - trim-right "^1.0.1" - "@babel/generator@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.4.tgz#db651e2840ca9aa66f327dcec1dc5f5fa9611369" @@ -118,15 +100,6 @@ "@babel/traverse" "^7.7.4" "@babel/types" "^7.7.4" -"@babel/helper-function-name@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" - integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== - dependencies: - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" - "@babel/helper-function-name@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz#ab6e041e7135d436d8f0a3eca15de5b67a341a2e" @@ -136,13 +109,6 @@ "@babel/template" "^7.7.4" "@babel/types" "^7.7.4" -"@babel/helper-get-function-arity@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" - integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== - dependencies: - "@babel/types" "^7.0.0" - "@babel/helper-get-function-arity@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz#cb46348d2f8808e632f0ab048172130e636005f0" @@ -195,14 +161,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== -"@babel/helper-regex@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0.tgz#2c1718923b57f9bbe64705ffe5640ac64d9bdb27" - integrity sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg== - dependencies: - lodash "^4.17.10" - -"@babel/helper-regex@^7.4.4": +"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" integrity sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw== @@ -238,13 +197,6 @@ "@babel/template" "^7.7.4" "@babel/types" "^7.7.4" -"@babel/helper-split-export-declaration@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" - integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== - dependencies: - "@babel/types" "^7.4.4" - "@babel/helper-split-export-declaration@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz#57292af60443c4a3622cf74040ddc28e68336fd8" @@ -272,30 +224,15 @@ "@babel/types" "^7.7.4" "@babel/highlight@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" - integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" + integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== dependencies: chalk "^2.0.0" esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.2.2": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.4.tgz#a43357e4bbf4b92a437fb9e465c192848287f27c" - integrity sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ== - -"@babel/parser@^7.3.4": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.0.tgz#3e0713dff89ad6ae37faec3b29dcfc5c979770b7" - integrity sha512-I5nW8AhGpOXGCCNYGc+p7ExQIBxRFnS2fd/d862bNOKvmoEPjYPcfIjsfdy0ujagYOIYPczKgD9l3FsgTkAzKA== - -"@babel/parser@^7.4.5", "@babel/parser@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.5.tgz#02f077ac8817d3df4a832ef59de67565e71cca4b" - integrity sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g== - -"@babel/parser@^7.7.4": +"@babel/parser@^7.0.0", "@babel/parser@^7.3.4", "@babel/parser@^7.4.5", "@babel/parser@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.4.tgz#75ab2d7110c2cf2fa949959afb05fa346d2231bb" integrity sha512-jIwvLO0zCL+O/LmEJQjWA75MQTWwx3c3u2JOTDK5D3/9egrWRRA0/0hk9XXywYnXZVVpzrBYeIQTmhwUaePI9g== @@ -396,14 +333,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-dynamic-import@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" - integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-dynamic-import@^7.7.4": +"@babel/plugin-syntax-dynamic-import@^7.2.0", "@babel/plugin-syntax-dynamic-import@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz#29ca3b4415abfe4a5ec381e903862ad1a54c3aec" integrity sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg== @@ -452,14 +382,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-typescript@^7.2.0": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz#a7cc3f66119a9f7ebe2de5383cce193473d65991" - integrity sha512-dGwbSMA1YhVS8+31CnPR7LB4pcbrzcV99wQzby4uAfrkZPYZlQ7ImwdpzLqi6Z6IL02b8IAL379CaMwo0x5Lag== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-typescript@^7.7.4": +"@babel/plugin-syntax-typescript@^7.2.0", "@babel/plugin-syntax-typescript@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.7.4.tgz#5d037ffa10f3b25a16f32570ebbe7a8c2efa304b" integrity sha512-77blgY18Hud4NM1ggTA8xVT/dBENQf17OpiToSa2jSmEY3fWXD2jwrdVlO4kq5yzUTeF15WSQ6b4fByNvJcjpQ== @@ -628,9 +551,9 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-object-assign@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.2.0.tgz#6fdeea42be17040f119e38e23ea0f49f31968bde" - integrity sha512-nmE55cZBPFgUktbF2OuoZgPRadfxosLOpSgzEPYotKSls9J4pEPcembi8r78RU37Rph6UApCpNmsQA4QMWK9Ng== + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.7.4.tgz#a31b70c434a00a078b2d4d10dbd59992fa70afca" + integrity sha512-0TpeUlnhQDwKxPLTIckdaWt46L2s61c/5w5snw1OUod5ehOJywZD98Ha3dFHVjeqkfOFtOTH7cqxddjxUuvcmg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -816,15 +739,6 @@ dependencies: regenerator-runtime "^0.13.2" -"@babel/template@^7.1.0": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" - integrity sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.2.2" - "@babel/types" "^7.2.2" - "@babel/template@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b" @@ -834,22 +748,7 @@ "@babel/parser" "^7.7.4" "@babel/types" "^7.7.4" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.2.4", "@babel/traverse@^7.3.4", "@babel/traverse@^7.4.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.5.tgz#f664f8f368ed32988cd648da9f72d5ca70f165bb" - integrity sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.5.5" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.5.5" - "@babel/types" "^7.5.5" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - -"@babel/traverse@^7.7.4": +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.2.4", "@babel/traverse@^7.3.4", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.4.tgz#9c1e7c60fb679fe4fcfaa42500833333c2058558" integrity sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw== @@ -864,16 +763,7 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.1.6", "@babel/types@^7.2.2", "@babel/types@^7.3.2", "@babel/types@^7.3.4", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.5.tgz#97b9f728e182785909aa4ab56264f090a028d18a" - integrity sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw== - dependencies: - esutils "^2.0.2" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@babel/types@^7.7.4": +"@babel/types@^7.0.0", "@babel/types@^7.1.6", "@babel/types@^7.3.2", "@babel/types@^7.3.4", "@babel/types@^7.4.0", "@babel/types@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" integrity sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA== @@ -1072,41 +962,41 @@ semver "^5.6.0" "@glimmer/di@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@glimmer/di/-/di-0.2.0.tgz#73bfd4a6ee4148a80bf092e8a5d29bcac9d4ce7e" - integrity sha1-c7/Upu5BSKgL8JLopdKbysnUzn4= + version "0.2.1" + resolved "https://registry.yarnpkg.com/@glimmer/di/-/di-0.2.1.tgz#5286b6b32040232b751138f6d006130c728d4b3d" + integrity sha512-0D53YVuEgGdHfTl9LGWDZqVzGhn4cT0CXqyAuOYkKFLvqboJXz6SnkRhQNPhhA2hLVrPnvUz3+choQmPhHLGGQ== "@glimmer/env@^0.1.7": version "0.1.7" resolved "https://registry.yarnpkg.com/@glimmer/env/-/env-0.1.7.tgz#fd2d2b55a9029c6b37a6c935e8c8871ae70dfa07" integrity sha1-/S0rVakCnGs3psk16MiHGucN+gc= -"@glimmer/interfaces@^0.42.0": - version "0.42.0" - resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.42.0.tgz#525f5352dd78011eef7b3eb0e3fb61b981c94319" - integrity sha512-lZlydeRRK3yL6pco0gCstPVuC5XYjBUtql1vSvWTRd+MUO0Chg8kxIvduFVg6f+Xfr1kqWd2YQq1MCMdmfzfvg== +"@glimmer/interfaces@^0.42.2": + version "0.42.2" + resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.42.2.tgz#9cf8d6f8f5eee6bfcfa36919ca68ae716e1f78db" + integrity sha512-7LOuQd02cxxNNHChzdHMAU8/qOeQvTro141CU5tXITP7z6aOv2D2gkFdau97lLQiVxezGrh8J7h8GCuF7TEqtg== "@glimmer/resolver@^0.4.1": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@glimmer/resolver/-/resolver-0.4.2.tgz#60c9b492e90bc3956ac82b3134649bd337e1651c" - integrity sha512-OYOSn2qKPMWRTrInu4W7Ilx2q4+mFfeKS8o8SCWdGN6q/9LnRUvN3vfiAEEfpgoMSvEr8TSGw6/b2WSLWoYAAA== + version "0.4.3" + resolved "https://registry.yarnpkg.com/@glimmer/resolver/-/resolver-0.4.3.tgz#b1baae5c3291b4621002ccf8d7870466097e841d" + integrity sha512-UhX6vlZbWRMq6pCquSC3wfWLM9kO0PhQPD1dZ3XnyZkmsvEE94Cq+EncA9JalUuevKoJrfUFRvrZ0xaz+yar3g== dependencies: "@glimmer/di" "^0.2.0" "@glimmer/syntax@^0.42.0": - version "0.42.0" - resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.42.0.tgz#65d38f6f6339e0e00cfbb34bc08ed3ff94f080c6" - integrity sha512-H0vydEQjlSqlVyjUmQxOy9BMBdL8OAII4GQjTXHWOQKmQBreZ05Dpr2EbXusiby6E2lMgbcPOqxGXdB/VVUBew== + version "0.42.2" + resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.42.2.tgz#89bb3cb787285b84665dc0d8907d94b008e5be9a" + integrity sha512-SR26SmF/Mb5o2cc4eLHpOyoX5kwwXP4KRhq4fbWfrvan74xVWA38PLspPCzwGhyVH/JsE7tUEPMjSo2DcJge/Q== dependencies: - "@glimmer/interfaces" "^0.42.0" - "@glimmer/util" "^0.42.0" + "@glimmer/interfaces" "^0.42.2" + "@glimmer/util" "^0.42.2" handlebars "^4.0.13" simple-html-tokenizer "^0.5.8" -"@glimmer/util@^0.42.0": - version "0.42.0" - resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.42.0.tgz#3f3a647ecaa16bbe4fc0545923d3b0a527319d78" - integrity sha512-rvXxKVb7BoQUvdrEQgxyvIeqGRUFM4LZAc7X1OmIpMnoaEh3fyx/e8Bz0blF0Yk6QvHpfV/GKirhlGmfum/ISA== +"@glimmer/util@^0.42.2": + version "0.42.2" + resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.42.2.tgz#9ca1631e42766ea6059f4b49d0bdfb6095aad2c4" + integrity sha512-Heck0baFSaWDanCYtmOcLeaz7v+rSqI8ovS7twrp2/FWEteb3Ze5sWQ2BEuSAG23L/k/lzVwYM/MY7ZugxBpaA== "@jimp/bmp@^0.5.4": version "0.5.4" @@ -1402,9 +1292,9 @@ integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== "@types/acorn@^4.0.3": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.4.tgz#b3ee72dcd81d1daeea03fed67d7ca7c2574c313b" - integrity sha512-/qLQgGw/hzbpWpEiSrnNDqiVtw7J/wBEfWMWN8HPhOHUMINkL7ggOtj8VSyjfzXlNkoUbStomzKsLEATXcMSzg== + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.5.tgz#e29fdf884695e77be4e99e67d748f5147255752d" + integrity sha512-603sPiZ4GVRHPvn6vNgEAvJewKsy+zwRWYS2MeIMemgoAtcjlw2G3lALxrb9OPA17J28bkB71R33yXlQbUatCA== dependencies: "@types/estree" "*" @@ -1414,9 +1304,9 @@ integrity sha512-SLk4/hFc2kGvgwNFrpn2O1juxFOllcHAywvlo7VwxfExLzoz1GGJ0oIZCwj5fwSpvHw4AWpZjJ1fUvb62PDayQ== "@types/ember@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@types/ember/-/ember-3.1.0.tgz#3c44b846c41a1340bc823910f9222746585b3314" - integrity sha512-RHP/N7k81XIS16DLF/yTfnWEKdFFftRAUgjWO1oKNJ5ho3+iTH3vVq8u11PrhaHd+FHXNB1XKV20d5o1KEOnUQ== + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/ember/-/ember-3.1.1.tgz#401810fa3ba911855d609d334ea77990b9b94802" + integrity sha512-8Yu+7qvcRA80NXuJrgii25hi4B/P3lrCug34O2ksPNHk2z1RaLnjKSj0cptQXMQAMnVtM0Vye8lAwUle47/M9w== dependencies: "@types/ember__application" "*" "@types/ember__array" "*" @@ -1431,6 +1321,7 @@ "@types/ember__runloop" "*" "@types/ember__service" "*" "@types/ember__string" "*" + "@types/ember__template" "*" "@types/ember__test" "*" "@types/ember__utils" "*" "@types/htmlbars-inline-precompile" "*" @@ -1448,17 +1339,17 @@ "@types/ember__routing" "*" "@types/ember__array@*": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/ember__array/-/ember__array-3.0.4.tgz#6b04b9188da1c315d808304c989a6e7ed24d7ad3" - integrity sha512-WPqytL1qOKoNpcY3eHKp8f7lejTGFyiySAH+yPhXMX1X2F6Y8nkCQGmmTQ9W9+nYQbyVlA3SCXqd1uTzCEOLjg== + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/ember__array/-/ember__array-3.0.5.tgz#46bd3a92f8cf4e996e147601856205316f55a0f3" + integrity sha512-NPv5tmvlSgpvAwzIqTNxpR1qqAppMbZBXpasr1Y4TGWlgmWjHRTzhU09sv828Guvd+PXsAluj0n1Jj8o1tuWDw== dependencies: "@types/ember__array" "*" "@types/ember__object" "*" "@types/ember__component@*": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/ember__component/-/ember__component-3.0.5.tgz#ae0a64d53ec3bff7a100347fac52320cba068c22" - integrity sha512-pGDNR2OkPjNIcpdV/XEtzU/yE5n+vzRcYHtUCaA7dn0qoMAAiMPkJjeNMGkWQIv1q+aLyXvjiV9elcP2i1HA9g== + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/ember__component/-/ember__component-3.0.6.tgz#1172dd8c9de3e79df643621d77d71f9e2cfa5d8b" + integrity sha512-RLcIiqqVrAV91gx2IIgElYmeT+uUsxjZJb06yrjCtG+uQPQtN0tcF0xX9BCT/wsBQiuk18uXbFJua1alurEZFQ== dependencies: "@types/ember__component" "*" "@types/ember__object" "*" @@ -1472,9 +1363,9 @@ "@types/ember__object" "*" "@types/ember__debug@*": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/ember__debug/-/ember__debug-3.0.4.tgz#cdf87a580688a0e3053820eff6f390fbb7ba0e80" - integrity sha512-jTdLdNGvDn3MhktfskhdxOaDHO09QtQqeh+krI7EDePl2+Xom+KnNeveFeCkzxDkYOa+/R7UNSxW4yN/3YTw3w== + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/ember__debug/-/ember__debug-3.0.6.tgz#fa8bbc58249d8bdeea9be5b4ab8e974b33c39b07" + integrity sha512-he07ArVIGzXw79NDEePawpkQSmiDc9C6Z/K6MkD2sUJdVSFaggGXBKvGh/QdenaP8hdYz36/umXGabq/Z862SA== dependencies: "@types/ember__debug" "*" "@types/ember__engine" "*" @@ -1502,14 +1393,14 @@ "@types/rsvp" "*" "@types/ember__polyfills@*": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/ember__polyfills/-/ember__polyfills-3.0.5.tgz#8f2c97b42f089afed53b4c137a6d7bbf4f7aa12e" - integrity sha512-yffc3Alk/Z12LwpRXvchcqrmou5fo37wZMoFiAOiqBYzJO3JL9gcYcrYuwg0eBdR/EwOr3aUeE8S+XAqXx3pIQ== + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/ember__polyfills/-/ember__polyfills-3.0.6.tgz#18908e2583c1175df1e10a22c6656bab8a4cd0de" + integrity sha512-jNp+88chKEeJB/QdqWKApl5bKDf8AXP38WodrhecHlLnZh7AWTHqSV9wZNXReKZAOaPeYibs6J1oEE5baQt4Tg== "@types/ember__routing@*": - version "3.0.9" - resolved "https://registry.yarnpkg.com/@types/ember__routing/-/ember__routing-3.0.9.tgz#3387d4f60b1ea3211d96e8bb9700129125c95538" - integrity sha512-E78LjdZB55Ayw0mSrFYNBxDLR6AhtuFL6JkSpySQuGmfcmEcywwlK1XDxEI5j92pMuUAZdKXaPfpOIkA0Vk0yg== + version "3.0.10" + resolved "https://registry.yarnpkg.com/@types/ember__routing/-/ember__routing-3.0.10.tgz#1421372cd3d4223ae6f58f05e00df041ac7039b6" + integrity sha512-2uEVqmskaStUZIPMEk/9ZRQjrik1U3nPV6ZVKoCZDWkRO7eduB/j8X3d7Kag0LFMapz42XFIUQ0sfzCNg9nVNA== dependencies: "@types/ember__component" "*" "@types/ember__controller" "*" @@ -1532,9 +1423,16 @@ "@types/ember__object" "*" "@types/ember__string@*": - version "3.0.6" - resolved "https://registry.yarnpkg.com/@types/ember__string/-/ember__string-3.0.6.tgz#79b10b0fc0136a9c86536bc55cbd18cae9a9bd3b" - integrity sha512-VBKH8nR/uK2tlr9eob8Nl+0cKP62GNtFWqq4PVGusnBMPFktGley1gsUhqNYJ9G3y2mvVfikicxM2/bE5AMYLA== + version "3.0.7" + resolved "https://registry.yarnpkg.com/@types/ember__string/-/ember__string-3.0.7.tgz#0a2319e4540f5964f62ad2fab63ba472dd3f4950" + integrity sha512-qs5tfiJtEECVDCisJq25T3Amxk/th0NcFvX8VNeigNeiTStgVXkJYrfOO3tJQRdaeE9zoskJTbgy0GoQYf3edw== + dependencies: + "@types/ember__template" "*" + +"@types/ember__template@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/ember__template/-/ember__template-3.0.0.tgz#d499ebf000faa371c1c98124633b9864be69b968" + integrity sha512-aWNg/kL2QToE0fwI8MVgAr2upWyAUwqRv2sp3CpypsMTOC1lZizIehz8QI6w1m1+Eh1WYs/89gvuM3mTc4OyIw== "@types/ember__test@*": version "3.0.5" @@ -1544,15 +1442,36 @@ "@types/ember__application" "*" "@types/ember__utils@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/ember__utils/-/ember__utils-3.0.2.tgz#d4c32007d0c84c95faa9221a1582b87ac3b1b4f3" - integrity sha512-d6fswmNDozslgUk+0DfC1oG0vD8R5ivvrEe0t3BuWSnF+TVyYhj24KZINecpBySg/4RODCg2IVV1GeRsimqzkg== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/ember__utils/-/ember__utils-3.0.3.tgz#c7bfe0ea89411f3376965a1214028561fdcd24eb" + integrity sha512-GhXlUsGln/7PzLMqmtplqLSG8IWu2F9AjEKlqds/BrZlQtbMVS3MCvIkH1R8xlatYml02PqIdd9rZLi7r6QS6Q== "@types/estree@*", "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== +"@types/events@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + +"@types/fs-extra@^5.0.5": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-5.1.0.tgz#2a325ef97901504a3828718c390d34b8426a10a1" + integrity sha512-AInn5+UBFIK9FK5xc9yP5e3TQSPNNgjHByqYcj9g5elVBnDQcQL7PlO1CIRy2gWlbwK7UPYqi7vRvFA44dCmYQ== + dependencies: + "@types/node" "*" + +"@types/glob@*": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + "@types/htmlbars-inline-precompile@*": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/htmlbars-inline-precompile/-/htmlbars-inline-precompile-1.0.1.tgz#de564513fabb165746aecd76369c87bd85e5bbb4" @@ -1565,31 +1484,34 @@ dependencies: "@types/sizzle" "*" -"@types/minimatch@^3.0.3": +"@types/minimatch@*", "@types/minimatch@^3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== "@types/node@*": - version "11.9.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.9.5.tgz#011eece9d3f839a806b63973e228f85967b79ed3" - integrity sha512-vVjM0SVzgaOUpflq4GYBvCpozes8OgIIS5gVXVka+OfK3hvnkC1i93U8WiY2OtNE4XUWyyy/86Kf6e0IHTQw1Q== - -"@types/node@^12.7.5": - version "12.7.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.7.tgz#f9bd8c00fa9e1a8129af910fc829f6139c397d6c" - integrity sha512-4jUncNe2tj1nmrO/34PsRpZqYVnRV1svbU78cKhuQKkMntKB/AmdLyGgswcZKjFHEHGpiY8pVD8CuVI55nP54w== + version "12.12.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.12.tgz#529bc3e73dbb35dd9e90b0a1c83606a9d3264bdb" + integrity sha512-MGuvYJrPU0HUwqF7LqvIj50RZUX23Z+m583KBygKYUZLlZ88n6w28XRNJRJgsHukLEnLz6w6SvxZoLgbr5wLqQ== "@types/node@^9.6.0": - version "9.6.41" - resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.41.tgz#e57c3152eb2e7ec748c733cebd0c095b437c5d37" - integrity sha512-sPZWEbFMz6qAy9SLY7jh5cgepmsiwqUUHjvEm8lpU6kug2hmmcyuTnwhoGw/GWpI5Npue4EqvsiQQI0eWjW/ZA== + version "9.6.55" + resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.55.tgz#7cc1358c9c18e71f6c020e410962971863232cf5" + integrity sha512-e/5tg8Ok0gSrN6pvHphnwTK0/CD9VPZrtZqpvvpEFAtfs+ZntusgGaWkf2lSEq1OFe2EDPeUMiMVpy4nZpJ4AQ== "@types/q@^1.5.1": version "1.5.2" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== +"@types/rimraf@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.3.tgz#0199a46af106729ba14213fda7b981278d8c84f2" + integrity sha512-dZfyfL/u9l/oi984hEXdmAjX3JHry7TLWw43u1HQ8HhPv6KtfxnrZ3T/bleJ0GEvnk9t5sM7eePkgMqz3yBcGg== + dependencies: + "@types/glob" "*" + "@types/node" "*" + "@types/rsvp@*", "@types/rsvp@^4.0.2": version "4.0.3" resolved "https://registry.yarnpkg.com/@types/rsvp/-/rsvp-4.0.3.tgz#4a1223158453257bce09d42b9eef7cfa6d257482" @@ -1764,9 +1686,9 @@ abab@^1.0.0: integrity sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4= abab@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" - integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== + version "2.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" + integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== abbrev@1: version "1.1.1" @@ -1774,25 +1696,17 @@ abbrev@1: integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== abortcontroller-polyfill@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.3.0.tgz#de69af32ae926c210b7efbcc29bf644ee4838b00" - integrity sha512-lbWQgf+eRvku3va8poBlDBO12FigTQr9Zb7NIjXrePrhxWVKdCP2wbDl1tLDaYa18PWTom3UEWwdH13S46I+yA== - -accepts@~1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" - integrity sha1-hiRnWMfdbSGmR0/whKR0DsBesh8= - dependencies: - mime-types "~2.1.16" - negotiator "0.6.1" + version "1.4.0" + resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.4.0.tgz#0d5eb58e522a461774af8086414f68e1dda7a6c4" + integrity sha512-3ZFfCRfDzx3GFjO6RAkYx81lPGpUS20ISxux9gLxuKnqafNcFQo59+IoZqpO2WvQlyc287B62HDnDdNYRmlvWA== -accepts@~1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" - integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== dependencies: - mime-types "~2.1.18" - negotiator "0.6.1" + mime-types "~2.1.24" + negotiator "0.6.2" acorn-dynamic-import@^3.0.0: version "3.0.0" @@ -1809,22 +1723,22 @@ acorn-globals@^1.0.4: acorn "^2.1.0" acorn-globals@^4.1.0, acorn-globals@^4.3.0, acorn-globals@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.2.tgz#4e2c2313a597fd589720395f6354b41cd5ec8006" - integrity sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ== + version "4.3.4" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== dependencies: acorn "^6.0.1" acorn-walk "^6.0.1" acorn-jsx@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" - integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== + version "5.1.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" + integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== acorn-walk@^6.0.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" - integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== acorn@^2.1.0, acorn@^2.4.0: version "2.7.0" @@ -1837,11 +1751,11 @@ acorn@^5.0.0, acorn@^5.2.1, acorn@^5.5.3, acorn@^5.6.2: integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== acorn@^6.0.1, acorn@^6.0.2, acorn@^6.0.7: - version "6.2.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.2.0.tgz#67f0da2fc339d6cfb5d6fb244fd449f33cd8bbe3" - integrity sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw== + version "6.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e" + integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA== -acorn@^7.0.0, acorn@^7.1.0: +acorn@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== @@ -1857,24 +1771,14 @@ ajv-errors@^1.0.0: integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== ajv-keywords@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.3.0.tgz#cb6499da9b83177af8bc1732b2f0a1a1a3aacf8c" - integrity sha512-CMzN9S62ZOO4sA/mJZIO4S++ZM7KFWzH3PPWkveLhy4OZ9i1/VatgwWMD46w/XbGCBy7Ye0gCk+Za6mmyfKK7g== - -ajv@^6.1.0, ajv@^6.5.5: - version "6.7.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.7.0.tgz#e3ce7bb372d6577bb1839f1dfdfcbf5ad2948d96" - integrity sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== -ajv@^6.9.1: - version "6.10.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" - integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== +ajv@^6.1.0, ajv@^6.10.2, ajv@^6.5.5, ajv@^6.9.1: + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" @@ -1911,6 +1815,11 @@ ansi-escapes@^3.2.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== +ansi-html@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -1939,11 +1848,11 @@ ansi-styles@^3.0.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1: color-convert "^1.9.0" ansi-to-html@^0.6.6: - version "0.6.10" - resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.10.tgz#412114353bac2589a034db7ec5b371b8ba771131" - integrity sha512-znsY3gvsk4CiApWu1yVYF8Nx5Vy0FEe8B0YwyxdbCdErJu5lfKlRHB2twtUjR+dxR4WewTk2OP8XqTmWYnImOg== + version "0.6.13" + resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.13.tgz#c72eae8b63e5ca0643aab11bfc6e6f2217425833" + integrity sha512-Ys2/umuaTlQvP9DLkaa7UzRKF2FLrfod/hNHXS9QhXCrw7seObG6ksOGmNz3UoK+adwM8L9vQfG7mvaxfJ3Jvw== dependencies: - entities "^1.1.1" + entities "^1.1.2" ansicolors@~0.2.1: version "0.2.1" @@ -1968,10 +1877,10 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.0.tgz#e609350e50a9313b472789b2f14ef35808ee14d6" - integrity sha512-Ozz7l4ixzI7Oxj2+cw+p0tVUt27BpaJ+1+q1TCeANWxHpvyn2+Un+YamBdfKu0uh8xLodGhoa1v7595NhKDAuA== +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -1998,9 +1907,9 @@ aproba@^1.0.3, aproba@^1.1.1: integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== are-we-there-yet@~1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" - integrity sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0= + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== dependencies: delegates "^1.0.0" readable-stream "^2.0.6" @@ -2012,19 +1921,12 @@ argparse@^1.0.7, argparse@~1.0.2: dependencies: sprintf-js "~1.0.2" -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= - dependencies: - arr-flatten "^1.0.1" - arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= -arr-flatten@^1.0.1, arr-flatten@^1.1.0: +arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== @@ -2073,11 +1975,6 @@ array-uniq@^1.0.1: resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= - array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -2108,9 +2005,11 @@ asn1@0.1.11: integrity sha1-VZvhg3bQik7E2+gId9J4GGObLfc= asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" - integrity sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y= + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" assert-never@^1.1.0: version "1.2.0" @@ -2128,10 +2027,11 @@ assert-plus@^0.1.5: integrity sha1-7nQAlBMALYTOxyGcasgRgS5yMWA= assert@^1.1.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" - integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== dependencies: + object-assign "^4.1.1" util "0.10.3" assign-symbols@^1.0.0: @@ -2150,9 +2050,9 @@ astral-regex@^1.0.0: integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== async-disk-cache@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/async-disk-cache/-/async-disk-cache-1.3.3.tgz#6040486660b370e4051cd9fa9fee275e1fae3728" - integrity sha512-GyaWSbDAZCltxSobtj1m1ptXa0+zSdjWs3sM4IqnvhoRwMDHW5786sXQ1RiXbR3ZGuQe6NXMB4N0vUmW163cew== + version "1.3.5" + resolved "https://registry.yarnpkg.com/async-disk-cache/-/async-disk-cache-1.3.5.tgz#cc6206ed79bb6982b878fc52e0505e4f52b62a02" + integrity sha512-VZpqfR0R7CEOJZ/0FOTgWq70lCrZyS1rkI8PXugDUkTKyyAUgZ2zQ09gLhMkEn+wN8LYeUTPxZdXtlX/kmbXKQ== dependencies: debug "^2.1.3" heimdalljs "^0.2.3" @@ -2160,37 +2060,32 @@ async-disk-cache@^1.2.1: mkdirp "^0.5.0" rimraf "^2.5.3" rsvp "^3.0.18" - username-sync "1.0.1" + username-sync "^1.0.2" -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - integrity sha1-GdOGodntxufByF04iu28xW0zYC0= +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== async-limiter@^1.0.0, async-limiter@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" - integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -async-promise-queue@^1.0.3, async-promise-queue@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/async-promise-queue/-/async-promise-queue-1.0.4.tgz#308baafbc74aff66a0bb6e7f4a18d4fe8434440c" - integrity sha512-GQ5X3DT+TefYuFPHdvIPXFTlKnh39U7dwtl+aUBGeKjMea9nBpv3c91DXgeyBQmY07vQ97f3Sr9XHqkamEameQ== +async-promise-queue@^1.0.3, async-promise-queue@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/async-promise-queue/-/async-promise-queue-1.0.5.tgz#cb23bce9fce903a133946a700cc85f27f09ea49d" + integrity sha512-xi0aQ1rrjPWYmqbwr18rrSKbSaXIeIwSd1J4KAgVfkq8utNbdZoht7GfvfY6swFUAMJ9obkc4WPJmtGwl+B8dw== dependencies: async "^2.4.1" debug "^2.6.8" -async@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= - -async@^2.4.1: - version "2.6.0" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" - integrity sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw== +async@^2.4.1, async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== dependencies: - lodash "^4.14.0" + lodash "^4.17.14" async@~0.2.9: version "0.2.10" @@ -2207,7 +2102,7 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -atob@^2.0.0: +atob@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== @@ -2248,7 +2143,7 @@ babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.24.1, babel-core@^6.26.0, babel-core@^6.26.3: +babel-core@^6.26.0, babel-core@^6.26.3: version "6.26.3" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== @@ -2507,9 +2402,9 @@ babel-plugin-htmlbars-inline-precompile@^3.0.0: integrity sha512-dR12lOqIcBLOTwgnI5iG+bSrZhR8JIZ7zAHW43YhcD5q8G8iipvSuRo8Fah6NPPh6C8cATd827bgPikphbF09w== babel-plugin-module-resolver@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.1.1.tgz#881cf67e3d4b8400d5eaaefc1be44d2dc1fe404f" - integrity sha512-1Q77Al4ydp6nYApJ7sQ2fmgz30WuQgJZegIYuyOdbdpxenB/bSezQ3hDPsumIXGlUS4vUIv+EwFjzzXZNWtARw== + version "3.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.2.0.tgz#ddfa5e301e3b9aa12d852a9979f18b37881ff5a7" + integrity sha512-tjR0GvSndzPew/Iayf4uICWZqjBwnlMWjSx6brryfQ81F9rxBVqwDJtFCV8oOs0+vJeefK9TmdZtkIFdFe1UnA== dependencies: find-babel-config "^1.1.0" glob "^7.1.2" @@ -2647,9 +2542,9 @@ babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015 babel-template "^6.24.1" babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" - integrity sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo= + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== dependencies: babel-plugin-transform-strict-mode "^6.24.1" babel-runtime "^6.26.0" @@ -2886,9 +2781,9 @@ babylon@6.18.0, babylon@^6.18.0: integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== backbone@^1.1.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.3.3.tgz#4cc80ea7cb1631ac474889ce40f2f8bc683b2999" - integrity sha1-TMgOp8sWMaxHSInOQPL4vGg7KZk= + version "1.4.0" + resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.4.0.tgz#54db4de9df7c3811c3f032f34749a4cd27f3bd12" + integrity sha512-RLmDrRXkVdouTg38jcgHhyQ/2zjg7a8E6sz2zxfz21Hh17xDJYUHBZimVIt5fUyS8vbfpeSmTL3gUjTEvUV3qQ== dependencies: underscore ">=1.8.3" @@ -2913,14 +2808,14 @@ base64-js@0.0.2: integrity sha1-Ak8Pcq+iW3X5wO5zzU9V7Bvtl4Q= base64-js@^1.0.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" - integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== -base64id@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" - integrity sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY= +base64id@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== base@^0.11.1: version "0.11.2" @@ -2936,16 +2831,16 @@ base@^0.11.1: pascalcase "^0.1.1" basic-auth@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.0.tgz#015db3f353e02e56377755f962742e8981e7bbba" - integrity sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o= + version "2.0.1" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== dependencies: - safe-buffer "5.1.1" + safe-buffer "5.1.2" bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" - integrity sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40= + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= dependencies: tweetnacl "^0.14.3" @@ -2967,9 +2862,9 @@ bignumber.js@^2.1.0: integrity sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg= binary-extensions@^1.0.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" - integrity sha1-RqoXUftqL5PuXmibsQh9SxTGwgU= + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== binary-extensions@^2.0.0: version "2.0.0" @@ -2977,9 +2872,9 @@ binary-extensions@^2.0.0: integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== "binaryextensions@1 || 2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.1.tgz#3209a51ca4a4ad541a3b8d3d6a6d5b83a2485935" - integrity sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.2.0.tgz#e7c6ba82d4f5f5758c26078fe8eea28881233311" + integrity sha512-bHhs98rj/7i/RZpCSJ3uk55pLXOItjIrh2sRQZSM6OoktScX+LxJzvlU+FELp9j3TdcddTmmYArLSGptCTwjuw== blank-object@^1.0.1: version "1.0.2" @@ -2991,15 +2886,10 @@ blob@0.0.5: resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== -bluebird@^3.1.1, bluebird@^3.4.6: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" - integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== - -bluebird@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" - integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== +bluebird@^3.1.1, bluebird@^3.4.6, bluebird@^3.5.5: + version "3.7.1" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.1.tgz#df70e302b471d7473489acf26a93d63b53f874de" + integrity sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg== bmp-js@0.0.1: version "0.0.1" @@ -3021,37 +2911,21 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== -body-parser@1.18.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" - integrity sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ= - dependencies: - bytes "3.0.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.1" - http-errors "~1.6.2" - iconv-lite "0.4.19" - on-finished "~2.3.0" - qs "6.5.1" - raw-body "2.3.2" - type-is "~1.6.15" - -body-parser@1.18.3: - version "1.18.3" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" - integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== dependencies: - bytes "3.0.0" + bytes "3.1.0" content-type "~1.0.4" debug "2.6.9" depd "~1.1.2" - http-errors "~1.6.3" - iconv-lite "0.4.23" + http-errors "1.7.2" + iconv-lite "0.4.24" on-finished "~2.3.0" - qs "6.5.2" - raw-body "2.3.3" - type-is "~1.6.16" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" body@^5.1.0: version "5.1.0" @@ -3107,33 +2981,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -braces@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.0.tgz#a46941cb5fb492156b3d6a656e06c35364e3e66e" - integrity sha512-P4O8UQRdGiMLWSizsApmXVQDBS6KCt7dSexgLKBmH5Hr1CZq7vsnscFh8oR1sP1ab1Zj0uCHCEzZeV6SfUf3rA== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - define-property "^1.0.0" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^2.3.1: +braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== @@ -3149,7 +2997,7 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.2: +braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -3193,9 +3041,9 @@ broccoli-autoprefixer@^5.0.0: postcss "^6.0.1" broccoli-babel-transpiler@^6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.5.0.tgz#aa501a227b298a99742fdd0309b1eaad7124bba0" - integrity sha512-c5OLGY40Sdmv6rP230Jt8yoK49BHfOw1LXiDMu9EC9k2U6sqlpNRK78SzvByQ8IzKtBYUfeWCxeZHcvW+gH7VQ== + version "6.5.1" + resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.5.1.tgz#a4afc8d3b59b441518eb9a07bd44149476e30738" + integrity sha512-w6GcnkxvHcNCte5FcLGEG1hUdQvlfvSN/6PtGWU/otg69Ugk8rUk51h41R0Ugoc+TNxyeFG1opRt2RlA87XzNw== dependencies: babel-core "^6.26.0" broccoli-funnel "^2.0.1" @@ -3282,9 +3130,9 @@ broccoli-clean-css@^1.1.0: json-stable-stringify "^1.0.0" broccoli-concat@^3.2.2, broccoli-concat@^3.5.1, broccoli-concat@^3.7.1, broccoli-concat@^3.7.3, broccoli-concat@^3.7.4: - version "3.7.4" - resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.7.4.tgz#7371e846eb7a97cb44ccff10f68582bcadcafacd" - integrity sha512-9gRv1tyCQuq2+48DT9DQyxRNLOuwDtHybDeYuWA3g26HFqZd0PGAOeXcLXHpKRhxzrEbU6Gm28dZ/KolMr04cQ== + version "3.7.5" + resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.7.5.tgz#223beda8c1184252cf08ae020a3d45ffa6a48218" + integrity sha512-rDs1Mej3Ej0Cy5yIO9oIQq5+BCv0opAwS2NW7M0BeCsAMeFM42Z/zacDUC6jKc5OV5wiHvGTyCPLnZkMe0h6kQ== dependencies: broccoli-debug "^0.6.5" broccoli-kitchen-sink-helpers "^0.3.1" @@ -3340,16 +3188,12 @@ broccoli-favicon@~2.1.1: lodash.merge "~4.6.1" broccoli-file-creator@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/broccoli-file-creator/-/broccoli-file-creator-1.1.1.tgz#1b35b67d215abdfadd8d49eeb69493c39e6c3450" - integrity sha1-GzW2fSFavfrdjUnutpSTw55sNFA= + version "1.2.0" + resolved "https://registry.yarnpkg.com/broccoli-file-creator/-/broccoli-file-creator-1.2.0.tgz#27f1b25b1b00e7bb7bf3d5d7abed5f4d5388df4d" + integrity sha512-l9zthHg6bAtnOfRr/ieZ1srRQEsufMZID7xGYRW3aBDv3u/3Eux+Iawl10tAGYE5pL9YB4n5X4vxkp6iNOoZ9g== dependencies: - broccoli-kitchen-sink-helpers "~0.2.0" broccoli-plugin "^1.1.0" - broccoli-writer "~0.1.1" mkdirp "^0.5.1" - rsvp "~3.0.6" - symlink-or-copy "^1.0.1" broccoli-file-creator@^2.1.1: version "2.1.1" @@ -3406,7 +3250,7 @@ broccoli-funnel@2.0.1: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.1.0: +broccoli-funnel@^1.0.1, broccoli-funnel@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-1.2.0.tgz#cddc3afc5ff1685a8023488fff74ce6fb5a51296" integrity sha1-zdw6/F/xaFqAI0iP/3TOb7WlEpY= @@ -3445,7 +3289,7 @@ broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1, broccoli-funnel@^2.0.2: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-kitchen-sink-helpers@^0.2.5, broccoli-kitchen-sink-helpers@~0.2.0: +broccoli-kitchen-sink-helpers@^0.2.0, broccoli-kitchen-sink-helpers@^0.2.5: version "0.2.9" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz#a5e0986ed8d76fb5984b68c3f0450d3a96e36ecc" integrity sha1-peCYbtjXb7WYS2jD8EUNOpbjbsw= @@ -3497,19 +3341,21 @@ broccoli-merge-trees@^1.0.0, broccoli-merge-trees@^1.1.1: symlink-or-copy "^1.0.0" broccoli-merge-trees@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-2.0.0.tgz#10aea46dd5cebcc8b8f7d5a54f0a84a4f0bb90b9" - integrity sha1-EK6kbdXOvMi499WlTwqEpPC7kLk= + version "2.0.1" + resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-2.0.1.tgz#14d4b7fc1a90318c12b16f843e6ba2693808100c" + integrity sha512-WjaexJ+I8BxP5V5RNn6um/qDRSmKoiBC/QkRi79FT9ClHfldxRyCDs9mcV7mmoaPlsshmmPaUz5jdtcKA6DClQ== dependencies: broccoli-plugin "^1.3.0" merge-trees "^1.0.1" broccoli-middleware@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/broccoli-middleware/-/broccoli-middleware-2.0.1.tgz#093314f13e52fad7fa8c4254a4e4a4560c857a65" - integrity sha512-V/K5uozcEH/XJ09ZAL8aJt/W2UwJU8I8fA2FAg3u9gzs5dQrehHDtgSoKS2QjPjurRC1GSiYLcsMp36sezaQQg== + version "2.1.1" + resolved "https://registry.yarnpkg.com/broccoli-middleware/-/broccoli-middleware-2.1.1.tgz#183635bbef4dc1241533ee001a162f013d776cb9" + integrity sha512-BK8aPhQpOLsHWiftrqXQr84XsvzUqeaN4PlCQOYg5yM0M+WKAHtX2WFXmicSQZOVgKDyh5aeoNTFkHjBAEBzwQ== dependencies: + ansi-html "^0.0.7" handlebars "^4.0.4" + has-ansi "^3.0.0" mime-types "^2.1.18" broccoli-module-normalizer@^1.3.0: @@ -3696,6 +3542,15 @@ broccoli-sri-hash@^2.1.0: sri-toolbox "^0.2.0" symlink-or-copy "^1.0.1" +broccoli-static-compiler@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/broccoli-static-compiler/-/broccoli-static-compiler-0.1.4.tgz#713d18f08eb3131530575a0c5ad2951bba10af41" + integrity sha1-cT0Y8I6zExUwV1oMWtKVG7oQr0E= + dependencies: + broccoli-kitchen-sink-helpers "^0.2.0" + broccoli-writer "^0.1.1" + mkdirp "^0.3.5" + broccoli-stew@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-1.6.0.tgz#01f6d92806ed6679ddbe48d405066a0e164dfbef" @@ -3738,7 +3593,7 @@ broccoli-stew@^2.0.0, broccoli-stew@^2.1.0: broccoli-string-replace@^0.1.2: version "0.1.2" - resolved "https://registry.npmjs.org/broccoli-string-replace/-/broccoli-string-replace-0.1.2.tgz#1ed92f85680af8d503023925e754e4e33676b91f" + resolved "https://registry.yarnpkg.com/broccoli-string-replace/-/broccoli-string-replace-0.1.2.tgz#1ed92f85680af8d503023925e754e4e33676b91f" integrity sha1-HtkvhWgK+NUDAjkl51Tk4zZ2uR8= dependencies: broccoli-persistent-filter "^1.1.5" @@ -3778,23 +3633,23 @@ broccoli-templater@^2.0.1: walk-sync "^0.3.3" broccoli-uglify-sourcemap@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/broccoli-uglify-sourcemap/-/broccoli-uglify-sourcemap-3.1.0.tgz#424abcb2c1c70fd1857165c5f191d59a37ee33ff" - integrity sha512-8urQlRfoL6TDP65EylZgbqTwYkSMuZkWE+bwYgC+GMhncSb6bCc0zHn4AGaC+1DRaAsEjb8uyhtYnKCil4NRPA== + version "3.2.0" + resolved "https://registry.yarnpkg.com/broccoli-uglify-sourcemap/-/broccoli-uglify-sourcemap-3.2.0.tgz#d96f1d41f6c18e9a5d49af1a5ab9489cdcac1c6c" + integrity sha512-kkkn8v7kXdWwnZNekq+3ILuTAGkZoaoEMUYCKoER5/uokuoyTjtdYLHaE7UxHkuPEuLfjvJYv21sCCePZ74/2g== dependencies: - async-promise-queue "^1.0.4" + async-promise-queue "^1.0.5" broccoli-plugin "^1.2.1" debug "^4.1.0" - lodash.defaultsdeep "^4.6.0" + lodash.defaultsdeep "^4.6.1" matcher-collection "^2.0.0" mkdirp "^0.5.0" source-map-url "^0.4.0" symlink-or-copy "^1.0.1" - terser "^3.17.0" + terser "^4.3.9" walk-sync "^1.1.3" - workerpool "^3.1.2" + workerpool "^5.0.1" -broccoli-writer@~0.1.1: +broccoli-writer@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/broccoli-writer/-/broccoli-writer-0.1.1.tgz#d4d71aa8f2afbc67a3866b91a2da79084b96ab2d" integrity sha1-1NcaqPKvvGejhmuRotp5CEuWqy0= @@ -3808,9 +3663,9 @@ brorand@^1.0.1: integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= browser-process-hrtime@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" - integrity sha1-Ql1opY00R/AqBKqJQYf86K+Le44= + version "0.1.3" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" + integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" @@ -3887,16 +3742,7 @@ browserslist@^3.2.6: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" -browserslist@^4.0.0: - version "4.4.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.4.1.tgz#42e828954b6b29a7a53e352277be429478a69062" - integrity sha512-pEBxEXg7JwaakBXjATYw/D1YZh4QUSCX/Mnd/wnqSRPPSi1U39iDhDoKGoBUcraKdxDlrYqJxSI5nNvD+dWP2A== - dependencies: - caniuse-lite "^1.0.30000929" - electron-to-chromium "^1.3.103" - node-releases "^1.1.3" - -browserslist@^4.6.0, browserslist@^4.7.3: +browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.7.3: version "4.7.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.3.tgz#02341f162b6bcc1e1028e30624815d4924442dc3" integrity sha512-jWvmhqYpx+9EZm/FxcZSbUZyDEvDTLDi3nSAKbzEkyWvtI0mNSmUosey+5awDW1RUlrgXbQb5A6qY1xQH9U6MQ== @@ -3906,9 +3752,9 @@ browserslist@^4.6.0, browserslist@^4.7.3: node-releases "^1.1.40" bser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" - integrity sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk= + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: node-int64 "^0.4.0" @@ -3936,9 +3782,9 @@ buffer-fill@^1.0.0: integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= buffer-from@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" - integrity sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ== + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== buffer-xor@^1.0.3: version "1.0.3" @@ -3946,27 +3792,22 @@ buffer-xor@^1.0.3: integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= buffer@^4.3.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" - integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" isarray "^1.0.0" buffer@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" - integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg== + version "5.4.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.4.3.tgz#3fbc9c69eb713d323e3fc1a895eee0710c072115" + integrity sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A== dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" -builtin-modules@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= - builtin-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-2.0.0.tgz#60b7ef5ae6546bd7deefa74b08b62a43a232648e" @@ -3992,22 +3833,27 @@ bytes@3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + cacache@^11.0.2: - version "11.3.2" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa" - integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg== + version "11.3.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.3.tgz#8bd29df8c6a718a6ebd2d010da4d7972ae3bbadc" + integrity sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA== dependencies: - bluebird "^3.5.3" + bluebird "^3.5.5" chownr "^1.1.1" figgy-pudding "^3.5.1" - glob "^7.1.3" + glob "^7.1.4" graceful-fs "^4.1.15" lru-cache "^5.1.1" mississippi "^3.0.0" mkdirp "^0.5.1" move-concurrently "^1.0.1" promise-inflight "^1.0.1" - rimraf "^2.6.2" + rimraf "^2.6.3" ssri "^6.0.1" unique-filename "^1.1.1" y18n "^4.0.0" @@ -4104,27 +3950,7 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000929: - version "1.0.30000929" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000929.tgz#7b391b781a9c3097ecc39ea053301aea8ea16317" - integrity sha512-n2w1gPQSsYyorSVYqPMqbSaz1w7o9ZC8VhOEGI9T5MfGDzp7sbopQxG6GaQmYsaq13Xfx/mkxJUWC1Dz3oZfzw== - -caniuse-lite@^1.0.30000792: - version "1.0.30000803" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000803.tgz#9939c37149d38d5f4540430490d240c03106a0f5" - integrity sha512-AoROHIFLv2iv5CG4nonOfT9ZCQ3JTN0GyEn8LG2sPb2Wc5cIyX/UwLYP0pnVajVF3LWH+mrO/DXBzmte0BK9cQ== - -caniuse-lite@^1.0.30000805: - version "1.0.30000878" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000878.tgz#c644c39588dd42d3498e952234c372e5a40a4123" - integrity sha512-/dCGTdLCnjVJno1mFRn7Y6eit3AYaeFzSrMQHCoK0LEQaWl5snuLex1Ky4b8/Qu2ig5NgTX4cJx65hH9546puA== - -caniuse-lite@^1.0.30000844: - version "1.0.30000865" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25" - integrity sha512-vs79o1mOSKRGv/1pSkp4EXgl4ZviWeYReXw60XfacPU64uQWZwJT6vZNmxRF9O+6zu71sJwMxLK5JXxbzuVrLw== - -caniuse-lite@^1.0.30001010: +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001010: version "1.0.30001011" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001011.tgz#0d6c4549c78c4a800bb043a83ca0cbe0aee6c6e1" integrity sha512-h+Eqyn/YA6o6ZTqpS86PyRmNWOs1r54EBDcd2NTwwfsXQ8re1B38SnB+p2RKF8OUsyEIjeDU8XGec1RGO/wYCg== @@ -4239,49 +4065,48 @@ cheerio@^1.0.0-rc.2, cheerio@^1.0.0-rc.3: parse5 "^3.0.1" "chokidar@>=2.0.0 <4.0.0": - version "3.0.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.0.2.tgz#0d1cd6d04eb2df0327446188cd13736a3367d681" - integrity sha512-c4PR2egjNjI1um6bamCQ6bUNPDiyofNQruHvKgHQ4gDUP/ITSVSzNsiI5OWtHOsX323i5ha/kk4YmOZ1Ktg7KA== - dependencies: - anymatch "^3.0.1" - braces "^3.0.2" - glob-parent "^5.0.0" - is-binary-path "^2.1.0" - is-glob "^4.0.1" - normalize-path "^3.0.0" - readdirp "^3.1.1" + version "3.3.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" + integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.2.0" optionalDependencies: - fsevents "^2.0.6" + fsevents "~2.1.1" chokidar@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" - integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== dependencies: anymatch "^2.0.0" - async-each "^1.0.0" - braces "^2.3.0" + async-each "^1.0.1" + braces "^2.3.2" glob-parent "^3.1.0" - inherits "^2.0.1" + inherits "^2.0.3" is-binary-path "^1.0.0" is-glob "^4.0.0" - lodash.debounce "^4.0.8" - normalize-path "^2.1.1" + normalize-path "^3.0.0" path-is-absolute "^1.0.0" - readdirp "^2.0.0" - upath "^1.0.5" + readdirp "^2.2.1" + upath "^1.1.1" optionalDependencies: - fsevents "^1.2.2" + fsevents "^1.2.7" chownr@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" - integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + version "1.1.3" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" + integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== chrome-trace-event@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" - integrity sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A== + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== dependencies: tslib "^1.9.0" @@ -4431,9 +4256,9 @@ clone@^2.0.0, clone@^2.1.1, clone@^2.1.2: integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= cloneable-readable@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.2.tgz#d591dee4a8f8bc15da43ce97dceeba13d43e2a65" - integrity sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg== + version "1.1.3" + resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec" + integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ== dependencies: inherits "^2.0.1" process-nextick-args "^2.0.0" @@ -4472,18 +4297,18 @@ collection-visit@^1.0.0: object-visit "^1.0.0" color-convert@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" - integrity sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ== + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: - color-name "^1.1.1" + color-name "1.1.3" color-logger@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/color-logger/-/color-logger-0.0.3.tgz#d9b22dd1d973e166b18bf313f9f481bba4df2018" integrity sha1-2bIt0dlz4Waxi/MT+fSBu6TfIBg= -color-name@^1.1.1: +color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= @@ -4493,20 +4318,15 @@ colors@1.0.3: resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= -colors@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" - integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= - -colors@^1.3.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" - integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== +colors@^1.1.2, colors@^1.3.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" - integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" @@ -4529,20 +4349,10 @@ commander@2.8.x: dependencies: graceful-readlink ">= 1.0.0" -commander@^2.11.0, commander@~2.17.1: - version "2.17.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" - integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== - -commander@^2.19.0: - version "2.20.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" - integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== - -commander@^2.6.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.0.tgz#7b25325963e6aace20d3a9285b09379b0c2208b5" - integrity sha512-okPpdvdJr6mUGi2XzupC+irQxzwGLVaBzacFC14hjLv8NColXEsxsU+QaeuSSXpQUak5g2K0vQ7WjA1e8svczg== +commander@^2.11.0, commander@^2.19.0, commander@^2.20.0, commander@^2.6.0, commander@~2.20.3: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== comment-regex@^1.0.0: version "1.0.1" @@ -4564,33 +4374,38 @@ component-bind@1.0.0: resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= -component-emitter@1.2.1, component-emitter@^1.2.1: +component-emitter@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + component-inherit@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= -compressible@~2.0.14: - version "2.0.15" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.15.tgz#857a9ab0a7e5a07d8d837ed43fe2defff64fe212" - integrity sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw== +compressible@~2.0.16: + version "2.0.17" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.17.tgz#6e8c108a16ad58384a977f3a482ca20bff2f38c1" + integrity sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw== dependencies: - mime-db ">= 1.36.0 < 2" + mime-db ">= 1.40.0 < 2" -compression@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" - integrity sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg== +compression@^1.7.3, compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== dependencies: accepts "~1.3.5" bytes "3.0.0" - compressible "~2.0.14" + compressible "~2.0.16" debug "2.6.9" - on-headers "~1.0.1" + on-headers "~1.0.2" safe-buffer "5.1.2" vary "~1.1.2" @@ -4599,7 +4414,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@1.6.2, concat-stream@^1.5.0: +concat-stream@1.6.2, concat-stream@^1.4.7, concat-stream@^1.5.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -4609,15 +4424,6 @@ concat-stream@1.6.2, concat-stream@^1.5.0: readable-stream "^2.2.2" typedarray "^0.0.6" -concat-stream@^1.4.7: - version "1.6.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" - integrity sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc= - dependencies: - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - configstore@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/configstore/-/configstore-4.0.0.tgz#5933311e95d3687efb592c528b922d9262d227e7" @@ -4631,11 +4437,9 @@ configstore@^4.0.0: xdg-basedir "^3.0.0" console-browserify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= - dependencies: - date-now "^0.1.4" + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" @@ -4666,10 +4470,12 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= -content-disposition@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" - integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" content-type@~1.0.4: version "1.0.4" @@ -4681,12 +4487,7 @@ continuable-cache@^0.3.1: resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f" integrity sha1-vXJ6f67XfnH/OYWskzUakSczrQ8= -convert-source-map@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" - integrity sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU= - -convert-source-map@^1.7.0: +convert-source-map@^1.5.1, convert-source-map@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== @@ -4703,7 +4504,7 @@ cookie@0.3.1: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= -cookie@^0.4.0: +cookie@0.4.0, cookie@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== @@ -4743,17 +4544,7 @@ core-js@2.4.1: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" integrity sha1-TekR5mew6ukSTjQlS1OupvxhjT4= -core-js@^2.4.0, core-js@^2.5.0: - version "2.5.3" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" - integrity sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4= - -core-js@^2.5.7: - version "2.6.2" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.2.tgz#267988d7268323b349e20b4588211655f0e83944" - integrity sha512-NdBPF/RVwPW6jr0NCILuyN9RiqLo2b1mddWHkUL+VnvcB7dzlnBJ1bXYntjpTGOgkZiiLWj2JxmOr7eGE3qK6g== - -core-js@^2.6.5: +core-js@^2.4.0, core-js@^2.5.0, core-js@^2.5.7, core-js@^2.6.5: version "2.6.10" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.10.tgz#8a5b8391f8cc7013da703411ce5b585706300d7f" integrity sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA== @@ -4898,12 +4689,12 @@ css-select-base-adapter@^0.1.1: integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== css-select@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.0.2.tgz#ab4386cec9e1f668855564b17c3733b43b2a5ede" - integrity sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== dependencies: boolbase "^1.0.0" - css-what "^2.1.2" + css-what "^3.2.1" domutils "^1.7.0" nth-check "^1.0.2" @@ -4934,15 +4725,15 @@ css-tree@1.0.0-alpha.33: source-map "^0.5.3" css-what@2.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" - integrity sha1-lGfQMsOM+u+58teVASUwYvh/ob0= - -css-what@^2.1.2: version "2.1.3" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== +css-what@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1" + integrity sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw== + css.escape@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" @@ -4961,9 +4752,9 @@ cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0", "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4, c integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== cssom@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.1.tgz#b24111d236b6dbd00cdfacb5ab67a20473381fe3" - integrity sha512-6Aajq0XmukE7HdXUU6IoSWuH1H6gH9z6qmagsstTiN7cW2FNTsb+J2Chs+ufPgZCsV/yo8oaEudQLrb9dGxSVQ== + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== "cssstyle@>= 0.2.29 < 0.3.0": version "0.2.37" @@ -4973,11 +4764,11 @@ cssom@^0.4.1: cssom "0.3.x" cssstyle@^1.0.0, cssstyle@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.3.0.tgz#c36c466f7037fd30f03baa271b65f0f17b50585c" - integrity sha512-wXsoRfsRfsLVNaVzoKdqvEmK/5PFaEXNspVT22Ots6K/cnJdpoDKuQFw+qlMiXnmaif1OgeC466X1zISgAOcGg== + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" + integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== dependencies: - cssom "~0.3.6" + cssom "0.3.x" cssstyle@^2.0.0: version "2.0.0" @@ -4998,10 +4789,10 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" -cyclist@~0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" - integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= dag-map@^2.0.1, dag-map@^2.0.2: version "2.0.2" @@ -5024,11 +4815,6 @@ data-urls@^1.0.0, data-urls@^1.0.1, data-urls@^1.1.0: whatwg-mimetype "^2.2.0" whatwg-url "^7.0.0" -date-now@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= - date-time@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/date-time/-/date-time-2.1.0.tgz#0286d1b4c769633b3ca13e1e62558d2dbdc2eba2" @@ -5036,19 +4822,19 @@ date-time@^2.1.0: dependencies: time-zone "^1.0.0" -debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@=3.1.0, debug@^3.1.0, debug@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== +debug@^3.0.0, debug@^3.0.1, debug@^3.1.0, debug@^3.1.1, debug@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== dependencies: - ms "2.0.0" + ms "^2.1.1" debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.1.0: version "4.1.1" @@ -5057,6 +4843,13 @@ debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.1.0: dependencies: ms "^2.1.1" +debug@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -5145,20 +4938,15 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -depd@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" - integrity sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k= - -depd@~1.1.1, depd@~1.1.2: +depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= des.js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" - integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== dependencies: inherits "^2.0.1" minimalistic-assert "^1.0.0" @@ -5180,10 +4968,10 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" -detect-indent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" - integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= +detect-indent@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd" + integrity sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA== detect-libc@^1.0.2: version "1.0.3" @@ -5211,15 +4999,15 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-serializer@0, dom-serializer@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" - integrity sha1-BzxpdUbOB4DOI75KKOKT5AvDDII= +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== dependencies: - domelementtype "~1.1.1" - entities "~1.1.1" + domelementtype "^2.0.1" + entities "^2.0.0" -dom-serializer@~0.1.1: +dom-serializer@~0.1.0, dom-serializer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== @@ -5237,15 +5025,15 @@ domain-browser@^1.1.1: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== -domelementtype@1, domelementtype@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" - integrity sha1-sXrtguirWeUt2cGbF1bg/BhyBMI= +domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== -domelementtype@~1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" - integrity sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs= +domelementtype@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" + integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== domexception@^1.0.1: version "1.0.1" @@ -5307,9 +5095,9 @@ duplexer3@^0.1.4: integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= duplexify@^3.4.2, duplexify@^3.6.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.1.tgz#b1a7a29c4abfd639585efaecce80d666b1e34125" - integrity sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA== + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== dependencies: end-of-stream "^1.0.0" inherits "^2.0.1" @@ -5317,11 +5105,12 @@ duplexify@^3.4.2, duplexify@^3.6.0: stream-shift "^1.0.0" ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" - integrity sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU= + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= dependencies: jsbn "~0.1.0" + safer-buffer "^2.1.0" editions@^1.1.1: version "1.3.4" @@ -5333,30 +5122,15 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.103: - version "1.3.103" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.103.tgz#a695777efdbc419cad6cbb0e58458251302cd52f" - integrity sha512-tObPqGmY9X8MUM8i3MEimYmbnLLf05/QV5gPlkR8MQ3Uj8G8B2govE1U4cQcBYtv3ymck9Y8cIOu4waoiykMZQ== - -electron-to-chromium@^1.3.30: - version "1.3.32" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.32.tgz#11d0684c0840e003c4be8928f8ac5f35dbc2b4e6" - integrity sha1-EdBoTAhA4APEvoko+KxfNdvCtOY= - -electron-to-chromium@^1.3.306: +electron-to-chromium@^1.3.30, electron-to-chromium@^1.3.306, electron-to-chromium@^1.3.47: version "1.3.311" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.311.tgz#73baa361e2b1f44b7b4f1a443aaa1372f8074ebb" integrity sha512-7GH6RKCzziLzJ9ejmbiBEdzHZsc6C3eRpav14dmRfTWMpNgMqpP1ukw/FU/Le2fR+ep642naq7a23xNdmh2s+A== -electron-to-chromium@^1.3.47: - version "1.3.52" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0" - integrity sha1-0tnxJwuko7lnuDHEDvcftNmrXOA= - elliptic@^6.0.0: - version "6.4.1" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" - integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== + version "6.5.2" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" + integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -5779,9 +5553,9 @@ ember-cli-htmlbars-inline-precompile@^2.1.0: silent-error "^1.1.0" ember-cli-htmlbars@^2.0.1, ember-cli-htmlbars@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.4.tgz#0bcda483f14271663c38756e1fd1cb89da6a50cf" - integrity sha512-WSGODKKG65M/Q7QcLflmxnJKMA32JqFLyX0a5ghMRDWRqvUVkKWSZDbjJsNsCw/OCeBbPWQLQWq0wtpCnTTjwA== + version "2.0.5" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.5.tgz#b5a105429a6bce4f7c9c97b667e3b8926e31397f" + integrity sha512-3f3PAxdnQ/fhQa8XP/3z4RLRgLHxV8j4Ln75aHbRdemOCjBa048KxL9l+acRLhCulbGQCMnLiIUIC89PAzLrcA== dependencies: broccoli-persistent-filter "^1.4.3" hash-for-dep "^1.2.3" @@ -5842,11 +5616,6 @@ ember-cli-lodash-subset@2.0.1, ember-cli-lodash-subset@^2.0.1: resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-2.0.1.tgz#20cb68a790fe0fde2488ddfd8efbb7df6fe766f2" integrity sha1-IMtop5D+D94kiN39jvu332/nZvI= -ember-cli-lodash-subset@^1.0.7: - version "1.0.12" - resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-1.0.12.tgz#af2e77eba5dcb0d77f3308d3a6fd7d3450f6e537" - integrity sha1-ry5366XcsNd/MwjTpv19NFD25Tc= - ember-cli-moment-shim@^3.7.1: version "3.7.1" resolved "https://registry.yarnpkg.com/ember-cli-moment-shim/-/ember-cli-moment-shim-3.7.1.tgz#3ad691c5027c1f38a4890fe47d74b5224cc98e32" @@ -5888,17 +5657,14 @@ ember-cli-path-utils@^1.0.0: integrity sha1-Tjmvi1UwHN3FAXc5t3qAT7ogce0= ember-cli-preprocess-registry@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/ember-cli-preprocess-registry/-/ember-cli-preprocess-registry-3.1.2.tgz#083efb21fd922c021ceba9e08f4d9278249fc4db" - integrity sha512-YJfcDHMBEjtD505CIhM8dtu5FO2Ku+0OTs/0kdLlj9mhXlbzC+k0JAS5c/0AQ+Nh2f+qZZJ8G19ySdzWwTLSCQ== + version "3.3.0" + resolved "https://registry.yarnpkg.com/ember-cli-preprocess-registry/-/ember-cli-preprocess-registry-3.3.0.tgz#685837a314fbe57224bd54b189f4b9c23907a2de" + integrity sha512-60GYpw7VPeB7TvzTLZTuLTlHdOXvayxjAQ+IxM2T04Xkfyu75O2ItbWlftQW7NZVGkaCsXSRAmn22PG03VpLMA== dependencies: broccoli-clean-css "^1.1.0" - broccoli-funnel "^1.0.0" - broccoli-merge-trees "^1.0.0" - debug "^2.2.0" - ember-cli-lodash-subset "^1.0.7" + broccoli-funnel "^2.0.1" + debug "^3.0.1" process-relative-require "^1.0.0" - silent-error "^1.0.0" ember-cli-qunit@^4.4.0: version "4.4.0" @@ -5939,10 +5705,11 @@ ember-cli-string-utils@^1.0.0, ember-cli-string-utils@^1.1.0: integrity sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE= ember-cli-tailwind@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/ember-cli-tailwind/-/ember-cli-tailwind-0.6.2.tgz#bbedc92df4978bd22e6065029fc178b3d3e7d3bb" - integrity sha512-RAtpnGTTyOy0xWWY/JkNy8rI48rWRV1Nzikis5vs/E1L3tWHSEBquwfq2+h7oUpZK3n5uhVPLcp/JAfnyLkztg== + version "0.6.3" + resolved "https://registry.yarnpkg.com/ember-cli-tailwind/-/ember-cli-tailwind-0.6.3.tgz#db9858367af082bc0283056f462685cfaada1335" + integrity sha512-SMkucR5N75GQY8lDQ0i7ad/CbHLCxjKPIhkR3L6lO+UU3q5w5U6KMo6HySLu9iIKmp5XckRzXUVnhAnQS00wsQ== dependencies: + broccoli-caching-writer "^3.0.3" broccoli-funnel "^2.0.1" broccoli-merge-trees "^3.0.1" broccoli-plugin "^1.3.0" @@ -6130,28 +5897,18 @@ ember-cli@~3.4.4: yam "^0.0.24" ember-code-snippet@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/ember-code-snippet/-/ember-code-snippet-2.4.1.tgz#4f4416bcfbc6c5e4a7c073158aff92748e31f219" - integrity sha512-LQTYH2E2/5cVxEPhL8v1VcXJSd/73735gj3KuRNwCYPK4PS91lpOho6L/1cLACSOg0W2a8YZKgfPAHN7aQGfgw== + version "2.4.2" + resolved "https://registry.yarnpkg.com/ember-code-snippet/-/ember-code-snippet-2.4.2.tgz#17a125c5afc9b134caf7ab8df3d7f68c09019669" + integrity sha512-JO2HKVsL2tUAGj9atJ7Q3bS9DK2ZijdhXDUsu6iJPS2PBvWGKKktHq572sl5cPc4tj+Girgrq3zp/5Wy95Xmsg== dependencies: broccoli-flatiron "^0.1.3" broccoli-merge-trees "^1.0.0" - broccoli-plugin "^1.3.1" - ember-cli-babel "^7.7.3" - ember-cli-htmlbars "^3.0.1" + broccoli-static-compiler "^0.1.4" + broccoli-writer "^0.1.1" es6-promise "^1.0.0" glob "^7.1.3" -ember-compatibility-helpers@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.1.2.tgz#ae0ee4a7a2858b5ffdf79b428c23aee85c47d93d" - integrity sha512-yN163MzERpotO8M0b+q+kXs4i3Nx6aIriiZHWv+yXQzr2TAtYlVwg9V7/3+jcurOa3oDEYDpN7y9UZ6q3mnoTg== - dependencies: - babel-plugin-debug-macros "^0.2.0" - ember-cli-version-checker "^2.1.1" - semver "^5.4.1" - -ember-compatibility-helpers@^1.1.2, ember-compatibility-helpers@^1.2.0: +ember-compatibility-helpers@^1.1.1, ember-compatibility-helpers@^1.1.2, ember-compatibility-helpers@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.2.0.tgz#feee16c5e9ef1b1f1e53903b241740ad4b01097e" integrity sha512-pUW4MzJdcaQtwGsErYmitFRs0rlCYBAnunVzlFFUBr4xhjlCjgHJo0b53gFnhTgenNM3d3/NqLarzRhDTjXRTg== @@ -6205,14 +5962,13 @@ ember-composable-helpers@^3.0.1: resolve "^1.10.0" "ember-concurrency@^0.9.0 || ^0.10.0 || ^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-1.0.0.tgz#3b650672fdd5dc1d45007626119135829076c2b6" - integrity sha512-76aKC0lo2LAPoQYz7vMRlpolWTIQerszr8PPf3JMM5cTOzPwXUtzDcjfso3JAEDdhyUF9fkv2V1DmHagFbC2YQ== + version "1.1.2" + resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-1.1.2.tgz#73de1f3e41b983af531a17596853ed9614c24107" + integrity sha512-GiASMU4GH4yDALR3vbAl6THYXSv+XUzjcF+4uPMgw1VxQmSde/oXTFdz/Z9QMetJ7Hhz7nYQcknWj471Lg9aEg== dependencies: - babel-core "^6.24.1" - ember-cli-babel "^6.8.2" + ember-cli-babel "^7.7.3" ember-compatibility-helpers "^1.2.0" - ember-maybe-import-regenerator "^0.1.5" + ember-maybe-import-regenerator "^0.1.6" ember-copy@^1.0.0: version "1.0.0" @@ -6262,9 +6018,9 @@ ember-fetch-adapter@^0.4.3: ember-cli-babel "^6.12.0" ember-fetch@^6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-6.7.0.tgz#c219f820e40f7918147391617a5940c67d293319" - integrity sha512-lB9G+XDKOc84Dr3THJs+l/KmtzUus7nv12Z0xOP54J917HmjnAsSZ9OHTp+X8ClxlAm35/v9l+sFd7IlB9Baqw== + version "6.7.2" + resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-6.7.2.tgz#82efce4a55a64863104347b71e598208b9acf518" + integrity sha512-+Dd++MJVkCXoqX2DPtFDjuoDMcLk+7fphLq7D8OoXwJq9KQMTff07sH18qhxWXV5Hqknvz3Uwy214g54vOboag== dependencies: abortcontroller-polyfill "^1.3.0" broccoli-concat "^3.2.2" @@ -6351,7 +6107,7 @@ ember-maybe-import-regenerator-for-testing@^1.0.0: ember-cli-babel "^6.6.0" regenerator-runtime "^0.9.5" -ember-maybe-import-regenerator@^0.1.5: +ember-maybe-import-regenerator@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ember-maybe-import-regenerator/-/ember-maybe-import-regenerator-0.1.6.tgz#35d41828afa6d6a59bc0da3ce47f34c573d776ca" integrity sha1-NdQYKK+m1qWbwNo85H80xXPXdso= @@ -6429,9 +6185,9 @@ ember-router-generator@^2.0.0: recast "^0.18.1" ember-router-scroll@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ember-router-scroll/-/ember-router-scroll-1.2.1.tgz#47c2293d4cb32d47ea7c103dc6af597af6eee4a7" - integrity sha512-QgZ7wzCLuV52ctudjcxiNLScE2uqv8z+8AX1RVfWGcMqoSYv+FqtlvEMx0zJyXwEpQH2Oy1yDABMKeFiFP4VXg== + version "1.3.3" + resolved "https://registry.yarnpkg.com/ember-router-scroll/-/ember-router-scroll-1.3.3.tgz#411991a671bd970497f5ce757baa627e850ae6e0" + integrity sha512-SwGsX7kceLXd3AZtKFcM/Ggl5lw37/a1v2rYHwWKZNMiyICBctJmWeEvALLQpiNzT8YMJrJHBkucHFmG07JPXQ== dependencies: ember-app-scheduler "^1.0.5" ember-cli-babel "^7.1.2" @@ -6445,9 +6201,9 @@ ember-router-service-polyfill@^1.0.2: ember-cli-babel "^6.8.2" ember-source-channel-url@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ember-source-channel-url/-/ember-source-channel-url-1.1.0.tgz#73de5cc6ebc25b2120e932ec1d8f82677bfaf6ef" - integrity sha512-y1RVXmyqrdX6zq9ZejpPt7ohKNGuLMBEKaOUyxFWcYAM5gvLuo6xFerwNmXEBbu4e3//GaoasjodXi6Cl+ddUQ== + version "1.2.0" + resolved "https://registry.yarnpkg.com/ember-source-channel-url/-/ember-source-channel-url-1.2.0.tgz#77eb9d0889e5f5370e6c70fcb2696c63ff4a34a1" + integrity sha512-CLClcHzVf+8GoFk4176R16nwXoel70bd7DKVAY6D8M0m5fJJhbTrAPYpDA0lY8A60HZo9j/s8A8LWiGh1YmdZg== dependencies: got "^8.0.1" @@ -6488,9 +6244,9 @@ ember-source@~3.14.1: silent-error "^1.1.1" ember-svg-jar@^2.1.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ember-svg-jar/-/ember-svg-jar-2.2.1.tgz#89c672162a7b479e10c08acfd3eabe93d1eb0275" - integrity sha512-NHG2go9iX+xggX0J65kKPjDMhJPF2r237CTqFlVM857acWqxS1XkHnpPP6Tesihk/S0y6+fjefuf2GzK/NtchA== + version "2.2.3" + resolved "https://registry.yarnpkg.com/ember-svg-jar/-/ember-svg-jar-2.2.3.tgz#632f8d6a999ceb1c815a135fbc2bd681b856330b" + integrity sha512-17kBxi5IfsEnCsVuFTjVs+HEAa3sfdB4t4C+5GZUxWixEbK8hwoRDsuvsboOGhDemycVv21GAyexcTeinabsnQ== dependencies: broccoli-caching-writer "^3.0.3" broccoli-concat "^3.7.4" @@ -6577,27 +6333,27 @@ emojis-list@^2.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= -encodeurl@~1.0.1, encodeurl@~1.0.2: +encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" - integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" -engine.io-client@~3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.3.1.tgz#afedb4a07b2ea48b7190c3136bfea98fdd4f0f03" - integrity sha512-q66JBFuQcy7CSlfAz9L3jH+v7DTT3i6ZEadYcVj2pOs8/0uJHLxKX3WBkGTvULJMdz0tUCyJag0aKT/dpXL9BQ== +engine.io-client@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.4.0.tgz#82a642b42862a9b3f7a188f41776b2deab643700" + integrity sha512-a4J5QO2k99CM2a0b12IznnyQndoEvtA4UAldhGzKqnHf42I3Qs2W5SPnDvatZRcMaNZs4IevVicBPayxYt6FwA== dependencies: component-emitter "1.2.1" component-inherit "0.0.3" - debug "~3.1.0" - engine.io-parser "~2.1.1" + debug "~4.1.0" + engine.io-parser "~2.2.0" has-cors "1.1.0" indexof "0.0.1" parseqs "0.0.5" @@ -6606,10 +6362,10 @@ engine.io-client@~3.3.1: xmlhttprequest-ssl "~1.5.4" yeast "0.1.2" -engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.3.tgz#757ab970fbf2dfb32c7b74b033216d5739ef79a6" - integrity sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA== +engine.io-parser@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.0.tgz#312c4894f57d52a02b420868da7b5c1c84af80ed" + integrity sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w== dependencies: after "0.8.2" arraybuffer.slice "~0.0.7" @@ -6617,25 +6373,25 @@ engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: blob "0.0.5" has-binary2 "~1.0.2" -engine.io@~3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.3.2.tgz#18cbc8b6f36e9461c5c0f81df2b830de16058a59" - integrity sha512-AsaA9KG7cWPXWHp5FvHdDWY3AMWeZ8x+2pUVLcn71qE5AtAzgGbxuclOytygskw8XGmiQafTmnI9Bix3uihu2w== +engine.io@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.4.0.tgz#3a962cc4535928c252759a00f98519cb46c53ff3" + integrity sha512-XCyYVWzcHnK5cMz7G4VTu2W7zJS7SM1QkcelghyIk/FmobWBtXE7fwhBusEKvCSqc3bMh8fNFMlUkCKTFRxH2w== dependencies: accepts "~1.3.4" - base64id "1.0.0" + base64id "2.0.0" cookie "0.3.1" - debug "~3.1.0" - engine.io-parser "~2.1.0" - ws "~6.1.0" + debug "~4.1.0" + engine.io-parser "~2.2.0" + ws "^7.1.2" enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" - integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== + version "4.1.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" + integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== dependencies: graceful-fs "^4.1.2" - memory-fs "^0.4.0" + memory-fs "^0.5.0" tapable "^1.0.0" ensure-posix-path@^1.0.0, ensure-posix-path@^1.0.1, ensure-posix-path@^1.0.2, ensure-posix-path@^1.1.0: @@ -6648,10 +6404,15 @@ entities@1.0: resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" integrity sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY= -entities@^1.1.1, entities@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" - integrity sha1-blwtClYhtdra7O+AuQ7ftc13cvA= +entities@^1.1.1, entities@^1.1.2, entities@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" + integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== errno@^0.1.3, errno@~0.1.7: version "0.1.7" @@ -6661,24 +6422,23 @@ errno@^0.1.3, errno@~0.1.7: prr "~1.0.1" error-ex@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" - integrity sha1-+FWobOYa3E6GIcPNoh56dhLDqNw= + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" error@^7.0.0: - version "7.0.2" - resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02" - integrity sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI= + version "7.2.1" + resolved "https://registry.yarnpkg.com/error/-/error-7.2.1.tgz#eab21a4689b5f684fc83da84a0e390de82d94894" + integrity sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA== dependencies: string-template "~0.2.1" - xtend "~4.0.0" -es-abstract@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.14.1.tgz#6e8d84b445ec9c610781e74a6d52cc31aac5b4ca" - integrity sha512-cp/Tb1oA/rh2X7vqeSOvM+TSo3UkJLX70eNihgVEvnzwAgikjkTFr/QVgRCaxjm0knCNQzNoxxxcw2zO2LJdZA== +es-abstract@^1.12.0, es-abstract@^1.5.1: + version "1.16.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.0.tgz#d3a26dc9c3283ac9750dca569586e976d9dcc06d" + integrity sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg== dependencies: es-to-primitive "^1.2.0" function-bind "^1.1.1" @@ -6688,25 +6448,13 @@ es-abstract@^1.12.0: is-regex "^1.0.4" object-inspect "^1.6.0" object-keys "^1.1.1" - string.prototype.trimleft "^2.0.0" - string.prototype.trimright "^2.0.0" - -es-abstract@^1.5.1: - version "1.13.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" - integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== - dependencies: - es-to-primitive "^1.2.0" - function-bind "^1.1.1" - has "^1.0.3" - is-callable "^1.1.4" - is-regex "^1.0.4" - object-keys "^1.0.12" + string.prototype.trimleft "^2.1.0" + string.prototype.trimright "^2.1.0" es-to-primitive@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" - integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" is-date-object "^1.0.1" @@ -6723,9 +6471,9 @@ es6-promise@^3.0.2: integrity sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM= es6-promise@^4.0.3: - version "4.2.4" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" - integrity sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ== + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== escape-html@1.0.3, escape-html@~1.0.3: version "1.0.3" @@ -6743,9 +6491,9 @@ escape-string-regexp@^2.0.0: integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== escodegen@^1.11.0, escodegen@^1.11.1, escodegen@^1.6.1, escodegen@^1.9.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510" - integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw== + version "1.12.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541" + integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg== dependencies: esprima "^3.1.3" estraverse "^4.2.0" @@ -6764,7 +6512,7 @@ esdoc-ecmascript-proposal-plugin@^1.0.0: resolved "https://registry.yarnpkg.com/esdoc-ecmascript-proposal-plugin/-/esdoc-ecmascript-proposal-plugin-1.0.0.tgz#390dc5656ba8a2830e39dba3570d79138df2ffd9" integrity sha1-OQ3FZWuoooMOOdujVw15E43y/9k= -esdoc@pzuraq/esdoc#015a342: +"esdoc@github:pzuraq/esdoc#015a342": version "1.0.4" resolved "https://codeload.github.com/pzuraq/esdoc/tar.gz/015a3426b2e53b2b0270a9c00133780db3f1d144" dependencies: @@ -6817,15 +6565,7 @@ eslint-scope@3.7.1: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" - integrity sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-scope@^4.0.3: +eslint-scope@^4.0.0, eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== @@ -6834,13 +6574,13 @@ eslint-scope@^4.0.3: estraverse "^4.1.1" eslint-utils@^1.3.1, eslint-utils@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab" - integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q== + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== dependencies: - eslint-visitor-keys "^1.0.0" + eslint-visitor-keys "^1.1.0" -eslint-visitor-keys@^1.0.0: +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== @@ -6906,21 +6646,16 @@ esprima@^3.1.3: resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= -esprima@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" - integrity sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw== +esprima@^4.0.0, esprima@~4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esprima@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.0.0.tgz#53cf247acda77313e551c3aa2e73342d3fb4f7d9" integrity sha1-U88kes2ncxPlUcOqLnM0LT+099k= -esprima@~4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - esquery@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" @@ -6929,19 +6664,18 @@ esquery@^1.0.1: estraverse "^4.0.0" esrecurse@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" - integrity sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM= + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== dependencies: estraverse "^4.1.0" - object-assign "^4.0.1" estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estree-walker@^0.5.0, estree-walker@^0.5.2: +estree-walker@^0.5.0: version "0.5.2" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.2.tgz#d3850be7529c9580d815600b53126515e146dd39" integrity sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig== @@ -6952,24 +6686,19 @@ estree-walker@^0.6.1: integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -eventemitter3@1.x.x: - version "1.2.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" - integrity sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg= - -eventemitter3@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" - integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA== +eventemitter3@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" + integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== events-to-array@^1.0.1: version "1.1.2" @@ -6999,11 +6728,11 @@ exec-file-sync@^2.0.0: spawn-sync "^1.0.11" exec-sh@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" - integrity sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg== + version "0.2.2" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36" + integrity sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw== dependencies: - merge "^1.1.3" + merge "^1.2.0" execa@^0.10.0: version "0.10.0" @@ -7085,13 +6814,6 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= - dependencies: - is-posix-bracket "^0.1.0" - expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -7105,13 +6827,6 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= - dependencies: - fill-range "^2.1.0" - expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" @@ -7119,111 +6834,39 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" -express@^4.10.7: - version "4.16.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" - integrity sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w= - dependencies: - accepts "~1.3.4" - array-flatten "1.1.1" - body-parser "1.18.2" - content-disposition "0.5.2" - content-type "~1.0.4" - cookie "0.3.1" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.1" - encodeurl "~1.0.1" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.1.0" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.2" - path-to-regexp "0.1.7" - proxy-addr "~2.0.2" - qs "6.5.1" - range-parser "~1.2.0" - safe-buffer "5.1.1" - send "0.16.1" - serve-static "1.13.1" - setprototypeof "1.1.0" - statuses "~1.3.1" - type-is "~1.6.15" - utils-merge "1.0.1" - vary "~1.1.2" - -express@^4.13.1: - version "4.16.3" - resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" - integrity sha1-avilAjUNsyRuzEvs9rWjTSL37VM= - dependencies: - accepts "~1.3.5" - array-flatten "1.1.1" - body-parser "1.18.2" - content-disposition "0.5.2" - content-type "~1.0.4" - cookie "0.3.1" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.1.1" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.2" - path-to-regexp "0.1.7" - proxy-addr "~2.0.3" - qs "6.5.1" - range-parser "~1.2.0" - safe-buffer "5.1.1" - send "0.16.2" - serve-static "1.13.2" - setprototypeof "1.1.0" - statuses "~1.4.0" - type-is "~1.6.16" - utils-merge "1.0.1" - vary "~1.1.2" - -express@^4.16.3: - version "4.16.4" - resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" - integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== +express@^4.10.7, express@^4.13.1, express@^4.16.3: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== dependencies: - accepts "~1.3.5" + accepts "~1.3.7" array-flatten "1.1.1" - body-parser "1.18.3" - content-disposition "0.5.2" + body-parser "1.19.0" + content-disposition "0.5.3" content-type "~1.0.4" - cookie "0.3.1" + cookie "0.4.0" cookie-signature "1.0.6" debug "2.6.9" depd "~1.1.2" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.1.1" + finalhandler "~1.1.2" fresh "0.5.2" merge-descriptors "1.0.1" methods "~1.1.2" on-finished "~2.3.0" - parseurl "~1.3.2" + parseurl "~1.3.3" path-to-regexp "0.1.7" - proxy-addr "~2.0.4" - qs "6.5.2" - range-parser "~1.2.0" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" safe-buffer "5.1.2" - send "0.16.2" - serve-static "1.13.2" - setprototypeof "1.1.0" - statuses "~1.4.0" - type-is "~1.6.16" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" @@ -7257,22 +6900,15 @@ external-editor@^1.1.0: tmp "^0.0.29" external-editor@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" - integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== dependencies: chardet "^0.7.0" iconv-lite "^0.4.24" tmp "^0.0.33" -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= - dependencies: - is-extglob "^1.0.0" - -extglob@^2.0.2, extglob@^2.0.4: +extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== @@ -7307,9 +6943,9 @@ extsprintf@^1.2.0: integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= fake-xml-http-request@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-2.0.0.tgz#41a92f0ca539477700cb1dafd2df251d55dac8ff" - integrity sha512-UjNnynb6eLAB0lyh2PlTEkjRJORnNsVF1hbzU+PQv89/cyBV9GDRCy7JAcLQgeCLYT+3kaumWWZKEJvbaK74eQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-2.0.1.tgz#e4a7f256af055d8059deb23c9d7ae721d28cf078" + integrity sha512-KzT+G4aLM1Btg25QRGxB6yGLGOVZXXzrH8I4OG3KHwsdoqFclyW3alieqh5NaYGcmbQvNOn/ldGO1rGKf7CNdA== faker@^4.1.0: version "4.1.0" @@ -7326,7 +6962,7 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= -fast-levenshtein@~2.0.4: +fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -7467,31 +7103,15 @@ file-url@^2.0.0: resolved "https://registry.yarnpkg.com/file-url/-/file-url-2.0.2.tgz#e951784d79095127d3713029ab063f40818ca2ae" integrity sha1-6VF4TXkJUSfTcTApqwY/QIGMoq4= -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= - filesize@^3.6.1: version "3.6.1" resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== filesize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-4.1.2.tgz#fcd570af1353cea97897be64f56183adb995994b" - integrity sha512-iSWteWtfNcrWQTkQw8ble2bnonSl7YJImsn9OZKpE2E4IHhXI78eASpDYUljXZZdYj36QsEKjOs/CsiDqmKMJw== - -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" + version "4.2.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-4.2.1.tgz#ab1cb2069db5d415911c1a13e144c0e743bc89bc" + integrity sha512-bP82Hi8VRZX/TUBKfE24iiUGsB/sfm2WUrwTQyAzQrhO3V9IhcBBNBXMyzLY5orACxRyYJ3d2HeRVX+eFv4lmA== fill-range@^4.0.0: version "4.0.0" @@ -7510,53 +7130,40 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" - integrity sha1-zgtoVbRYU+eRsvzGgARtiCU91/U= - dependencies: - debug "2.6.9" - encodeurl "~1.0.1" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.2" - statuses "~1.3.1" - unpipe "~1.0.0" - -finalhandler@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" - integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== dependencies: debug "2.6.9" encodeurl "~1.0.2" escape-html "~1.0.3" on-finished "~2.3.0" - parseurl "~1.3.2" - statuses "~1.4.0" + parseurl "~1.3.3" + statuses "~1.5.0" unpipe "~1.0.0" find-babel-config@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.1.0.tgz#acc01043a6749fec34429be6b64f542ebb5d6355" - integrity sha1-rMAQQ6Z0n+w0Qpvmtk9ULrtdY1U= + version "1.2.0" + resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.2.0.tgz#a9b7b317eb5b9860cda9d54740a8c8337a2283a2" + integrity sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA== dependencies: json5 "^0.5.1" path-exists "^3.0.0" find-cache-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d" - integrity sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA== + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== dependencies: commondir "^1.0.1" - make-dir "^1.0.0" + make-dir "^2.0.0" pkg-dir "^3.0.0" find-index@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-index/-/find-index-1.1.0.tgz#53007c79cd30040d6816d79458e8837d5c5705ef" - integrity sha1-UwB8ec0wBA1oFteUWOiDfVxXBe8= + version "1.1.1" + resolved "https://registry.yarnpkg.com/find-index/-/find-index-1.1.1.tgz#4b221f8d46b7f8bea33d8faed953f3ca7a081cbc" + integrity sha512-XYKutXMrIK99YMUPf91KX5QVJoG31/OsgftD6YoTPAObfQIxM4ziA9f0J1AsqKhJmo+IeaIPP0CFopTD4bdUBw== find-up@^1.0.0: version "1.1.2" @@ -7610,20 +7217,23 @@ fireworm@^0.7.0: minimatch "^3.0.2" fixturify-project@^1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/fixturify-project/-/fixturify-project-1.5.3.tgz#2ba4ffec59c1d79ae6638f818c0847eb974d179b" - integrity sha512-vgH+Uo+pC6jHg7mt+FDz+j08bKFugnP6guBWeumYllQDbvxT7NQ/sf6zO4nC0XKRRsSNWsOHkO0AppaHvwF69A== + version "1.9.1" + resolved "https://registry.yarnpkg.com/fixturify-project/-/fixturify-project-1.9.1.tgz#64cdf6fd763a8f8975170e1d9d3bbadea0778680" + integrity sha512-KyzFWPWMitlZFDrC6lluvr/UGkJg0ExucR5ubN9uLAHWsGmwghofA8CT5chFJCy5aMWx/SNxYpTygPKaZFERIg== dependencies: - fixturify "^0.3.4" + fixturify "^1.2.0" tmp "^0.0.33" -fixturify@^0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/fixturify/-/fixturify-0.3.4.tgz#c676de404a7f8ee8e64d0b76118e62ec95ab7b25" - integrity sha512-Gx+KSB25b6gMc4bf7UFRTA85uE0iZR+RYur0JHh6dg4AGBh0EksOv4FCHyM7XpGmiJO7Bc7oV7vxENQBT+2WEQ== +fixturify@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fixturify/-/fixturify-1.2.0.tgz#abe8c52dd27dbbfdb874a02893781c93425663ea" + integrity sha512-b5CMQmBZKsGR6HGqdSrLOGYGHIqrR0CUrcGU/lDL0mYy+DtGm5cnb61Z0UiIUqMVZIoV0CbN+u9/Gwjj+ICg0A== dependencies: - fs-extra "^0.30.0" - matcher-collection "^1.0.4" + "@types/fs-extra" "^5.0.5" + "@types/minimatch" "^3.0.3" + "@types/rimraf" "^2.0.2" + fs-extra "^7.0.1" + matcher-collection "^2.0.0" flat-cache@^2.0.1: version "2.0.1" @@ -7635,44 +7245,30 @@ flat-cache@^2.0.1: write "1.0.3" flatted@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916" - integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg== + version "2.0.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" + integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== flush-write-stream@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" - integrity sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw== + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== dependencies: - inherits "^2.0.1" - readable-stream "^2.0.4" - -follow-redirects@^1.0.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.6.1.tgz#514973c44b5757368bad8bddfe52f81f015c94cb" - integrity sha512-t2JCjbzxQpWvbhts3l6SH1DKzSrx8a+SsaVf4h6bG4kOXUuPYS/kg2Lr4gQSb7eemaHqJkOThF1BGyjlUkO1GQ== - dependencies: - debug "=3.1.0" + inherits "^2.0.3" + readable-stream "^2.3.6" -for-each@^0.3.2: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== +follow-redirects@^1.0.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.9.0.tgz#8d5bcdc65b7108fe1508649c79c12d732dcedb4f" + integrity sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A== dependencies: - is-callable "^1.1.3" + debug "^3.0.0" -for-in@^1.0.1, for-in@^1.0.2: +for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= - dependencies: - for-in "^1.0.1" - forever-agent@~0.5.0: version "0.5.2" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.5.2.tgz#6d0e09c4921f94a27f63d3b49c5feff1ea4c5130" @@ -7755,17 +7351,6 @@ fs-extra@^0.24.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - fs-extra@^4.0.0, fs-extra@^4.0.2, fs-extra@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" @@ -7812,11 +7397,11 @@ fs-extra@^8.0.0: universalify "^0.1.0" fs-minipass@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" - integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== dependencies: - minipass "^2.2.1" + minipass "^2.6.0" fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6, fs-tree-diff@^0.5.7, fs-tree-diff@^0.5.9: version "0.5.9" @@ -7875,28 +7460,20 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" - integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg== - dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" - -fsevents@^1.2.3: - version "1.2.6" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.6.tgz#d3a1864a71876a2eb9b244e3bd8f606eb09568c0" - integrity sha512-BalK54tfK0pMC0jQFb2oHn1nz7JNQD/2ex5pBnCHgBi2xG7VV0cAOGy2RS2VbCqUXx5/6obMrMcQTJ8yjcGzbg== +fsevents@^1.2.3, fsevents@^1.2.7: + version "1.2.9" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" + integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" + nan "^2.12.1" + node-pre-gyp "^0.12.0" -fsevents@^2.0.6: - version "2.0.7" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.0.7.tgz#382c9b443c6cbac4c57187cdda23aa3bf1ccfc2a" - integrity sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ== +fsevents@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" + integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== -function-bind@^1.0.2, function-bind@^1.1.1: +function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== @@ -7925,12 +7502,7 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -get-caller-file@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" - integrity sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U= - -get-caller-file@^1.0.1: +get-caller-file@^1.0.0, get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== @@ -8015,9 +7587,9 @@ git-read-pkt-line@0.0.8: through "~2.2.7" git-repo-info@^2.0.0, git-repo-info@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-2.1.0.tgz#13d1f753c75bc2994432e65a71e35377ff563813" - integrity sha512-+kigfDB7j3W80f74BoOUX+lKOmf4pR3/i2Ww6baKTCPe2hD4FRdjhV3s4P5Dy0Tak1uY1891QhKoYNtnyX2VvA== + version "2.1.1" + resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-2.1.1.tgz#220ffed8cbae74ef8a80e3052f2ccb5179aed058" + integrity sha512-8aCohiDo4jwjOwma4FmYFd3i97urZulL8XL24nIPxuE+GZnfsAyy/g2Shqx6OjUiFKUXZM+Yy+KHnOmmA3FVcg== git-transport-protocol@^0.1.0: version "0.1.0" @@ -8038,21 +7610,6 @@ git-write-pkt-line@0.1.0: bops "0.0.3" through "~2.2.7" -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= - dependencies: - is-glob "^2.0.0" - glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -8061,10 +7618,10 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.0.0.tgz#1dc99f0f39b006d3e92c2c284068382f0c20e954" - integrity sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg== +glob-parent@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== dependencies: is-glob "^4.0.1" @@ -8079,10 +7636,10 @@ glob@^5.0.10: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.3, glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.5: - version "7.1.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.5.tgz#6714c69bee20f3c3e64c4dd905553e532b40cdc0" - integrity sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ== +glob@^7.0.3, glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.5, glob@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -8119,12 +7676,7 @@ global@~4.3.0: min-document "^2.19.0" process "~0.5.1" -globals@^11.1.0: - version "11.7.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" - integrity sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg== - -globals@^11.7.0: +globals@^11.1.0, globals@^11.7.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== @@ -8192,17 +7744,7 @@ got@^8.0.1: url-parse-lax "^3.0.0" url-to-options "^1.0.1" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= - -graceful-fs@^4.1.15: - version "4.1.15" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" - integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== - -graceful-fs@^4.2.0: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== @@ -8218,9 +7760,9 @@ growly@^1.3.0: integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= handlebars@^4.0.11, handlebars@^4.0.13, handlebars@^4.0.4, handlebars@^4.3.1: - version "4.4.3" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.4.3.tgz#180bae52c1d0e9ec0c15d7e82a4362d662762f6e" - integrity sha512-B0W4A2U1ww3q7VVthTKfh+epHx+q4mCt6iK+zEAzbMBpWQAwxCeKxEGpj/1oQTpzPXDNSOG7hmG14TsISH50yw== + version "4.5.3" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.3.tgz#5cf75bd8714f7605713511a56be7c349becb0482" + integrity sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA== dependencies: neo-async "^2.6.0" optimist "^0.6.1" @@ -8248,6 +7790,13 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" +has-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-3.0.0.tgz#36077ef1d15f333484aa7fa77a28606f1c655b37" + integrity sha1-Ngd+8dFfMzSEqn+neihgbxxlWzc= + dependencies: + ansi-regex "^3.0.0" + has-binary2@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" @@ -8275,10 +7824,10 @@ has-symbol-support-x@^1.4.1: resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== -has-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" - integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== has-to-string-tag-x@^1.2.0: version "1.4.1" @@ -8377,9 +7926,9 @@ hawk@1.1.1: sntp "0.2.x" heimdalljs-fs-monitor@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/heimdalljs-fs-monitor/-/heimdalljs-fs-monitor-0.2.2.tgz#a76d98f52dbf3aa1b7c20cebb0132e2f5eeb9204" - integrity sha512-R/VhkWs8tm4x+ekLIp+oieR8b3xYK0oFDumEraGnwNMixpiKwO3+Ms5MJzDP5W5Ui1+H/57nGW5L3lHbxi20GA== + version "0.2.3" + resolved "https://registry.yarnpkg.com/heimdalljs-fs-monitor/-/heimdalljs-fs-monitor-0.2.3.tgz#1aedd4b1c61d86c51f6141fb75c5a3350dc41b15" + integrity sha512-fYAvqSP0CxeOjLrt61B4wux/jqZzdZnS2xfb2oc14NP6BTZ8gtgtR2op6gKFakOR8lm8GN9Xhz1K4A1ZvJ4RQw== dependencies: heimdalljs "^0.2.3" heimdalljs-logger "^0.1.7" @@ -8412,9 +7961,9 @@ heimdalljs@^0.3.0: rsvp "~3.2.1" highlight.js@^9.14.2: - version "9.14.2" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.14.2.tgz#efbfb22dc701406e4da406056ef8c2b70ebe5b26" - integrity sha512-Nc6YNECYpxyJABGYJAyw7dBAYbXEuIzwzkqoJnwbc1nIpCiN+3ioYf0XrBnLiyyG0JLuJhpPtt2iTSbXiKLoyA== + version "9.16.2" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.16.2.tgz#68368d039ffe1c6211bcc07e483daf95de3e403e" + integrity sha512-feMUrVLZvjy0oC7FVJQcSQRqbBq9kwqnYE4+Kj9ZjbHh3g+BisiPgF49NyQbVLNdrL/qqZr3Ca9yOKwgn2i/tw== himalaya@1.1.0: version "1.1.0" @@ -8436,9 +7985,9 @@ hoek@0.9.x: integrity sha1-PTIkYrrfB3Fup+uFuviAec3c5QU= hoek@4.x.x: - version "4.2.0" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" - integrity sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ== + version "4.2.1" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" + integrity sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA== home-or-tmp@^2.0.0: version "2.0.0" @@ -8449,16 +7998,16 @@ home-or-tmp@^2.0.0: os-tmpdir "^1.0.1" homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" - integrity sha1-TCu8inWJmP7r9e1oWA921GdotLw= + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== dependencies: parse-passwd "^1.0.0" -hosted-git-info@^2.1.4, hosted-git-info@^2.6.0, hosted-git-info@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" - integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== +hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: + version "2.8.5" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" + integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== html-encoding-sniffer@^1.0.2: version "1.0.2" @@ -8473,16 +8022,16 @@ html-entities@^1.2.1: integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= htmlparser2@^3.9.1: - version "3.9.2" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" - integrity sha1-G9+HrMoPP55T+k/M6w9LTLsAszg= + version "3.10.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== dependencies: - domelementtype "^1.3.0" + domelementtype "^1.3.1" domhandler "^2.3.0" domutils "^1.5.1" entities "^1.1.1" inherits "^2.0.1" - readable-stream "^2.0.2" + readable-stream "^3.1.1" htmlparser2@~3.8.1: version "3.8.3" @@ -8500,45 +8049,39 @@ http-cache-semantics@3.8.1: resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== -http-errors@1.6.2, http-errors@~1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" - integrity sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY= +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== dependencies: - depd "1.1.1" + depd "~1.1.2" inherits "2.0.3" - setprototypeof "1.0.3" - statuses ">= 1.3.1 < 2" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" -http-errors@1.6.3, http-errors@~1.6.3: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== dependencies: depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" -http-parser-js@>=0.4.0: +"http-parser-js@>=0.4.0 <0.4.11": version "0.4.10" resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= -http-proxy@^1.13.1: - version "1.16.2" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" - integrity sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I= - dependencies: - eventemitter3 "1.x.x" - requires-port "1.x.x" - -http-proxy@^1.17.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" - integrity sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g== +http-proxy@^1.13.1, http-proxy@^1.17.0: + version "1.18.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" + integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== dependencies: - eventemitter3 "^3.0.0" + eventemitter3 "^4.0.0" follow-redirects "^1.0.0" requires-port "^1.0.0" @@ -8578,18 +8121,6 @@ ice-cap@0.0.4: cheerio "0.20.0" color-logger "0.0.3" -iconv-lite@0.4.19: - version "0.4.19" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" - integrity sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ== - -iconv-lite@0.4.23: - version "0.4.23" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" - integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -8598,9 +8129,9 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: safer-buffer ">= 2.1.2 < 3" ieee754@^1.1.4: - version "1.1.12" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" - integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA== + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== iferr@^0.1.5: version "0.1.5" @@ -8608,9 +8139,9 @@ iferr@^0.1.5: integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= ignore-walk@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" - integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + version "3.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" + integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== dependencies: minimatch "^3.0.4" @@ -8620,9 +8151,9 @@ ignore@^4.0.6: integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== ignore@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.1.tgz#2fc6b8f518aff48fef65a7f348ed85632448e4a5" - integrity sha512-DWjnQIFLenVrwyRCKZT+7a7/U4Cqgar4WG8V++K3hw+lrW1hc/SIwdiGmtxKCVACmHULTuGeBbHJmbwW7/sAvA== + version "5.1.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" + integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== image-size@^0.5.0: version "0.5.5" @@ -8635,9 +8166,9 @@ image-size@^0.6.3: integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== import-fresh@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390" - integrity sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ== + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -8687,16 +8218,21 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" @@ -8761,9 +8297,9 @@ into-stream@^3.1.0: p-is-promise "^1.1.0" invariant@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" - integrity sha1-nh9WrArNtr8wMwbzOL47IErmA2A= + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" @@ -8782,15 +8318,10 @@ ip-regex@^2.1.0: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= -ipaddr.js@1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" - integrity sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A= - -ipaddr.js@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" - integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= +ipaddr.js@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" + integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== is-accessor-descriptor@^0.1.6: version "0.1.6" @@ -8818,7 +8349,7 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" -is-binary-path@^2.1.0: +is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== @@ -8830,14 +8361,7 @@ is-buffer@^1.1.5, is-buffer@~1.1.1: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= - dependencies: - builtin-modules "^1.0.0" - -is-callable@^1.1.3, is-callable@^1.1.4: +is-callable@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== @@ -8879,18 +8403,6 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= - dependencies: - is-primitive "^2.0.0" - is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -8903,11 +8415,6 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= - is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -8942,13 +8449,6 @@ is-git-url@^1.0.0: resolved "https://registry.yarnpkg.com/is-git-url/-/is-git-url-1.0.0.tgz#53f684cd143285b52c3244b4e6f28253527af66b" integrity sha1-U/aEzRQyhbUsMkS05vKCU1J69ms= -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= - dependencies: - is-extglob "^1.0.0" - is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -8956,14 +8456,7 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" - integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A= - dependencies: - is-extglob "^2.1.1" - -is-glob@^4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== @@ -8975,13 +8468,6 @@ is-module@^1.0.0: resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= - dependencies: - kind-of "^3.0.2" - is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -8989,11 +8475,6 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -9009,35 +8490,18 @@ is-object@^1.0.1: resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= -is-odd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-1.0.0.tgz#3b8a932eb028b3775c39bb09e91767accdb69088" - integrity sha1-O4qTLrAos3dcObsJ6RdnrM22kIg= - dependencies: - is-number "^3.0.0" - is-plain-obj@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= - is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" @@ -9049,9 +8513,9 @@ is-redirect@^1.0.0: integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= is-reference@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.1.1.tgz#bf2cda150a877f04d48caaf8fd70c03d8bed5e2d" - integrity sha512-URlByVARcyP2E2GC7d3Ur702g3vqW391VKCHuF5Goo/M8IT97k4RU/+56OYImwDdX1J/V/VRxECE/wJqB0I2tg== + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.1.4.tgz#3f95849886ddb70256a3e6d062b1a68c13c51427" + integrity sha512-uJA/CDPO3Tao3GTrxYn6AwkM4nUPJiGGYu5+cB8qbC7WGFlrKZbiRo7SFKxUAEpFUfiHofWCXBUNhvYJMh+6zw== dependencies: "@types/estree" "0.0.39" @@ -9063,9 +8527,9 @@ is-regex@^1.0.4: has "^1.0.1" is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" - integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" + integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" @@ -9078,11 +8542,11 @@ is-stream@^2.0.0: integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== is-symbol@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" - integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== dependencies: - has-symbols "^1.0.0" + has-symbols "^1.0.1" is-type@0.0.1: version "0.0.1" @@ -9101,16 +8565,16 @@ is-utf8@^0.2.0: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= -is-windows@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.1.tgz#310db70f742d259a16a369202b51af84233310d9" - integrity sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk= - -is-windows@^1.0.2: +is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -9134,9 +8598,9 @@ isbinaryfile@^3.0.3: buffer-alloc "^1.2.0" isemail@3.x.x: - version "3.1.3" - resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.1.3.tgz#64f37fc113579ea12523165c3ebe3a71a56ce571" - integrity sha512-5xbsG5wYADIcB+mfLsd+nst1V/D+I7EU7LEZPo2GOIMu4JzfcRs5yQoypP4avA7QtUqgxYLKBYNv4IdzBmbhdw== + version "3.2.0" + resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.2.0.tgz#59310a021931a9fb06bbb51e155ce0b3f236832c" + integrity sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg== dependencies: punycode "2.x.x" @@ -9232,9 +8696,9 @@ jpeg-js@^0.2.0: integrity sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII= jpeg-js@^0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.3.4.tgz#dc2ba501ee3d58b7bb893c5d1fab47294917e7e7" - integrity sha512-6IzjQxvnlT8UlklNmDXIJMWxijULjqGrzgqc0OG7YadZdvm7KPQ1j0ehmQQHckgEWOfgpptzcnWgESovxudpTA== + version "0.3.6" + resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.3.6.tgz#c40382aac9506e7d1f2d856eb02f6c7b2a98b37c" + integrity sha512-MUj2XlMB8kpe+8DJUGH/3UJm4XpI8XEgZQ+CiHDeyrGoKPdW/8FJv6ku+3UiYm5Fz3CWaL+iXmD8Q4Ap6aC1Jw== jquery-deferred@^0.3.0: version "0.3.1" @@ -9247,9 +8711,9 @@ jquery@^3.4.1: integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw== js-base64@^2.1.9: - version "2.4.8" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.8.tgz#57a9b130888f956834aa40c5b165ba59c758f033" - integrity sha512-hm2nYpDrwoO/OzBhdcqs/XGT6XjSuSSCVEpia+Kl2J6x4CYt5hISlVL/AYU1khoDXv0AQVgxtdJySb9gjAn56Q== + version "2.5.1" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121" + integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw== js-levenshtein@^1.1.3: version "1.1.6" @@ -9266,16 +8730,16 @@ js-string-escape@^1.0.1: resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= -js-tokens@^3.0.0, js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - -js-tokens@^4.0.0: +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + js-yaml@^3.12.0, js-yaml@^3.12.1, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.3.0: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" @@ -9411,9 +8875,9 @@ jsesc@^1.3.0: integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= jsesc@^2.5.0, jsesc@^2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" - integrity sha1-5CGiqOINawgZ3yiQj3glJrlt0f4= + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.3.x: version "0.3.0" @@ -9426,9 +8890,9 @@ jsesc@~0.5.0: integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= json-api-serializer@^1.11.0, json-api-serializer@^1.13.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/json-api-serializer/-/json-api-serializer-1.13.0.tgz#cab7239736e72abee4658b1c8915edc290f5a9e9" - integrity sha512-h5XKsQsLhN6zKLzYKFMyCuQWQZXa6Ozk4GC4svZfh8BkxdwBHidQ+zn41pHlnntexAujY/PcO+hjH92IEvGf0A== + version "1.15.1" + resolved "https://registry.yarnpkg.com/json-api-serializer/-/json-api-serializer-1.15.1.tgz#241ea66dfc5c629ae46d8315c6ee4232b81bb6b7" + integrity sha512-dp7d/TLWudViXADFnmdiq80krYZ+zA0WeB1771O1Is8HWdeySZofhp/TPWHCzgFPmGkgwI7oTEgjgZ6Dcxr/2w== dependencies: into-stream "^3.1.0" joi "^12.0.0" @@ -9487,9 +8951,9 @@ json5@^1.0.1: minimist "^1.2.0" json5@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" - integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" + integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== dependencies: minimist "^1.2.0" @@ -9553,7 +9017,7 @@ kind-of@^4.0.0: dependencies: is-buffer "^1.1.5" -kind-of@^5.0.0, kind-of@^5.0.2: +kind-of@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== @@ -9570,13 +9034,6 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" -lazy-cache@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" - integrity sha1-uRkKT5EzVGlIQIWfio9whNiCImQ= - dependencies: - set-getter "^0.1.0" - lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -9614,9 +9071,9 @@ line-stream@0.0.0: through "~2.2.0" linkify-it@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.0.3.tgz#d94a4648f9b1c179d64fa97291268bdb6ce9434f" - integrity sha1-2UpGSPmxwXnWT6lykSaL22zpQ08= + version "2.2.0" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" + integrity sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw== dependencies: uc.micro "^1.0.1" @@ -9643,24 +9100,11 @@ linkify-it@~1.2.0: velocity-animate "^1.5.2" livereload-js@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.3.0.tgz#c3ab22e8aaf5bf3505d80d098cbad67726548c9a" - integrity sha512-j1R0/FeGa64Y+NmqfZhyoVRzcFlOZ8sNlKzHjh4VvLULFACZhn68XrX5DFg2FhMvSMJmROuFxRSa560ECWKBMg== - -load-bmfont@^1.2.3: - version "1.3.1" - resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.3.1.tgz#0e7933f66543409882127b0d0fbad7a66d5a7869" - integrity sha512-lQkEawgez06lM2iw1vQEEOtVLJXyMzFcUqbwWMrB0g6zwhdUs/+e0KNd1zEJ7OFBbMVz0tbzQyjgjtTB47+PBg== - dependencies: - buffer-equal "0.0.1" - mime "^1.3.4" - parse-bmfont-ascii "^1.0.3" - parse-bmfont-binary "^1.0.5" - parse-bmfont-xml "^1.1.4" - xhr "^2.0.1" - xtend "^4.0.0" + version "2.4.0" + resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.4.0.tgz#447c31cf1ea9ab52fc20db615c5ddf678f78009c" + integrity sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw== -load-bmfont@^1.3.1, load-bmfont@^1.4.0: +load-bmfont@^1.2.3, load-bmfont@^1.3.1, load-bmfont@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.0.tgz#75f17070b14a8c785fe7f5bee2e6fd4f98093b6b" integrity sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g== @@ -9738,49 +9182,11 @@ lodash._baseassign@^3.0.0: lodash._basecopy "^3.0.0" lodash.keys "^3.0.0" -lodash._basebind@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash._basebind/-/lodash._basebind-2.3.0.tgz#2b5bc452a0e106143b21869f233bdb587417d248" - integrity sha1-K1vEUqDhBhQ7IYafIzvbWHQX0kg= - dependencies: - lodash._basecreate "~2.3.0" - lodash._setbinddata "~2.3.0" - lodash.isobject "~2.3.0" - lodash._basecopy@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY= -lodash._basecreate@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-2.3.0.tgz#9b88a86a4dcff7b7f3c61d83a2fcfc0671ec9de0" - integrity sha1-m4ioak3P97fzxh2Dovz8BnHsneA= - dependencies: - lodash._renative "~2.3.0" - lodash.isobject "~2.3.0" - lodash.noop "~2.3.0" - -lodash._basecreatecallback@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash._basecreatecallback/-/lodash._basecreatecallback-2.3.0.tgz#37b2ab17591a339e988db3259fcd46019d7ac362" - integrity sha1-N7KrF1kaM56YjbMln81GAZ16w2I= - dependencies: - lodash._setbinddata "~2.3.0" - lodash.bind "~2.3.0" - lodash.identity "~2.3.0" - lodash.support "~2.3.0" - -lodash._basecreatewrapper@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.3.0.tgz#aa0c61ad96044c3933376131483a9759c3651247" - integrity sha1-qgxhrZYETDkzN2ExSDqXWcNlEkc= - dependencies: - lodash._basecreate "~2.3.0" - lodash._setbinddata "~2.3.0" - lodash._slice "~2.3.0" - lodash.isobject "~2.3.0" - lodash._baseflatten@^3.0.0: version "3.1.4" resolved "https://registry.yarnpkg.com/lodash._baseflatten/-/lodash._baseflatten-3.1.4.tgz#0770ff80131af6e34f3b511796a7ba5214e65ff7" @@ -9803,90 +9209,21 @@ lodash._createassigner@^3.0.0: lodash._isiterateecall "^3.0.0" lodash.restparam "^3.0.0" -lodash._createwrapper@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash._createwrapper/-/lodash._createwrapper-2.3.0.tgz#d1aae1102dadf440e8e06fc133a6edd7fe146075" - integrity sha1-0arhEC2t9EDo4G/BM6bt1/4UYHU= - dependencies: - lodash._basebind "~2.3.0" - lodash._basecreatewrapper "~2.3.0" - lodash.isfunction "~2.3.0" - -lodash._escapehtmlchar@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.3.0.tgz#d03da6bd82eedf38dc0a5b503d740ecd0e894592" - integrity sha1-0D2mvYLu3zjcCltQPXQOzQ6JRZI= - dependencies: - lodash._htmlescapes "~2.3.0" - -lodash._escapestringchar@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.3.0.tgz#cce73ae60fc6da55d2bf8a0679c23ca2bab149fc" - integrity sha1-zOc65g/G2lXSv4oGecI8orqxSfw= - lodash._getnative@^3.0.0: version "3.9.1" resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= -lodash._htmlescapes@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.3.0.tgz#1ca98863cadf1fa1d82c84f35f31e40556a04f3a" - integrity sha1-HKmIY8rfH6HYLITzXzHkBVagTzo= - lodash._isiterateecall@^3.0.0: version "3.0.9" resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" integrity sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw= -lodash._objecttypes@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.3.0.tgz#6a3ea3987dd6eeb8021b2d5c9c303549cc2bae1e" - integrity sha1-aj6jmH3W7rgCGy1cnDA1Scwrrh4= - -lodash._reinterpolate@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.3.0.tgz#03ee9d85c0e55cbd590d71608a295bdda51128ec" - integrity sha1-A+6dhcDlXL1ZDXFgiilb3aURKOw= - -lodash._reinterpolate@~3.0.0: +lodash._reinterpolate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= -lodash._renative@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash._renative/-/lodash._renative-2.3.0.tgz#77d8edd4ced26dd5971f9e15a5f772e4e317fbd3" - integrity sha1-d9jt1M7SbdWXH54Vpfdy5OMX+9M= - -lodash._reunescapedhtml@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.3.0.tgz#db920b55ac7f3ff825939aceb9ba2c231713d24d" - integrity sha1-25ILVax/P/glk5rOubosIxcT0k0= - dependencies: - lodash._htmlescapes "~2.3.0" - lodash.keys "~2.3.0" - -lodash._setbinddata@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash._setbinddata/-/lodash._setbinddata-2.3.0.tgz#e5610490acd13277d59858d95b5f2727f1508f04" - integrity sha1-5WEEkKzRMnfVmFjZW18nJ/FQjwQ= - dependencies: - lodash._renative "~2.3.0" - lodash.noop "~2.3.0" - -lodash._shimkeys@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.3.0.tgz#611f93149e3e6c721096b48769ef29537ada8ba9" - integrity sha1-YR+TFJ4+bHIQlrSHae8pU3rai6k= - dependencies: - lodash._objecttypes "~2.3.0" - -lodash._slice@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash._slice/-/lodash._slice-2.3.0.tgz#147198132859972e4680ca29a5992c855669aa5c" - integrity sha1-FHGYEyhZly5GgMoppZkshVZpqlw= - lodash.assign@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" @@ -9911,15 +9248,6 @@ lodash.bind@^4.1.4: resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU= -lodash.bind@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-2.3.0.tgz#c2a8e18b68e5ecc152e2b168266116fea5b016cc" - integrity sha1-wqjhi2jl7MFS4rFoJmEW/qWwFsw= - dependencies: - lodash._createwrapper "~2.3.0" - lodash._renative "~2.3.0" - lodash._slice "~2.3.0" - lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" @@ -9947,38 +9275,16 @@ lodash.debounce@^3.1.1: dependencies: lodash._getnative "^3.0.0" -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= - lodash.defaults@^4.0.1, lodash.defaults@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= -lodash.defaults@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.3.0.tgz#a832b001f138f3bb9721c2819a2a7cc5ae21ed25" - integrity sha1-qDKwAfE487uXIcKBmip8xa4h7SU= - dependencies: - lodash._objecttypes "~2.3.0" - lodash.keys "~2.3.0" - -lodash.defaultsdeep@^4.6.0: +lodash.defaultsdeep@^4.6.0, lodash.defaultsdeep@^4.6.1: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz#512e9bd721d272d94e3d3a63653fa17516741ca6" integrity sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA== -lodash.escape@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.3.0.tgz#844c38c58f844e1362ebe96726159b62cf5f2a58" - integrity sha1-hEw4xY+EThNi6+lnJhWbYs9fKlg= - dependencies: - lodash._escapehtmlchar "~2.3.0" - lodash._reunescapedhtml "~2.3.0" - lodash.keys "~2.3.0" - lodash.filter@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" @@ -10002,33 +9308,16 @@ lodash.flatten@^4.2.0, lodash.flatten@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= -lodash.foreach@^4.3.0: +lodash.foreach@^4.3.0, lodash.foreach@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= -lodash.foreach@~2.3.x: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-2.3.0.tgz#083404c91e846ee77245fdf9d76519c68b2af168" - integrity sha1-CDQEyR6EbudyRf3512UZxosq8Wg= - dependencies: - lodash._basecreatecallback "~2.3.0" - lodash.forown "~2.3.0" - lodash.forin@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.forin/-/lodash.forin-4.4.0.tgz#5d3f20ae564011fbe88381f7d98949c9c9519731" integrity sha1-XT8grlZAEfvog4H32YlJyclRlzE= -lodash.forown@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash.forown/-/lodash.forown-2.3.0.tgz#24fb4aaf800d45fc2dc60bfec3ce04c836a3ad7f" - integrity sha1-JPtKr4ANRfwtxgv+w84EyDajrX8= - dependencies: - lodash._basecreatecallback "~2.3.0" - lodash._objecttypes "~2.3.0" - lodash.keys "~2.3.0" - lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" @@ -10039,11 +9328,6 @@ lodash.has@^4.5.2: resolved "https://registry.yarnpkg.com/lodash.has/-/lodash.has-4.5.2.tgz#d19f4dc1095058cccbe2b0cdf4ee0fe4aa37c862" integrity sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI= -lodash.identity@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash.identity/-/lodash.identity-2.3.0.tgz#6b01a210c9485355c2a913b48b6711219a173ded" - integrity sha1-awGiEMlIU1XCqRO0i2cRIZoXPe0= - lodash.invokemap@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz#1748cda5d8b0ef8369c4eb3ec54c21feba1f2d62" @@ -10074,23 +9358,11 @@ lodash.isfunction@^3.0.9: resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== -lodash.isfunction@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-2.3.0.tgz#6b2973e47a647cf12e70d676aea13643706e5267" - integrity sha1-aylz5HpkfPEucNZ2rqE2Q3BuUmc= - lodash.isinteger@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= -lodash.isobject@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.3.0.tgz#2e16d3fc583da9831968953f2d8e6d73434f6799" - integrity sha1-LhbT/Fg9qYMZaJU/LY5tc0NPZ5k= - dependencies: - lodash._objecttypes "~2.3.0" - lodash.isplainobject@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" @@ -10105,15 +9377,6 @@ lodash.keys@^3.0.0: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" -lodash.keys@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.3.0.tgz#b350f4f92caa9f45a4a2ecf018454cf2f28ae253" - integrity sha1-s1D0+Syqn0WkouzwGEVM8vKK4lM= - dependencies: - lodash._renative "~2.3.0" - lodash._shimkeys "~2.3.0" - lodash.isobject "~2.3.0" - lodash.lowerfirst@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/lodash.lowerfirst/-/lodash.lowerfirst-4.3.1.tgz#de3c7b12e02c6524a0059c2f6cb7c5c52655a13d" @@ -10139,11 +9402,6 @@ lodash.merge@^4.4.0, lodash.merge@^4.6.0, lodash.merge@^4.6.2, lodash.merge@~4.6 resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.noop@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash.noop/-/lodash.noop-2.3.0.tgz#3059d628d51bbf937cd2a0b6fc3a7f212a669c2c" - integrity sha1-MFnWKNUbv5N80qC2/Dp/ISpmnCw= - lodash.omit@^4.1.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" @@ -10184,48 +9442,20 @@ lodash.sortby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= -lodash.support@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash.support/-/lodash.support-2.3.0.tgz#7eaf038af4f0d6aab776b44aa6dcfc80334c9bfd" - integrity sha1-fq8DivTw1qq3drRKptz8gDNMm/0= - dependencies: - lodash._renative "~2.3.0" - -lodash.template@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" - integrity sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A= +lodash.template@^4.4.0, lodash.template@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== dependencies: - lodash._reinterpolate "~3.0.0" + lodash._reinterpolate "^3.0.0" lodash.templatesettings "^4.0.0" -lodash.template@~2.3.x: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.3.0.tgz#4e3e29c433b4cfea675ec835e6f12391c61fd22b" - integrity sha1-Tj4pxDO0z+pnXsg15vEjkcYf0is= - dependencies: - lodash._escapestringchar "~2.3.0" - lodash._reinterpolate "~2.3.0" - lodash.defaults "~2.3.0" - lodash.escape "~2.3.0" - lodash.keys "~2.3.0" - lodash.templatesettings "~2.3.0" - lodash.values "~2.3.0" - lodash.templatesettings@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" - integrity sha1-K01OlbpEDZFf8IvImeRVNmZxMxY= - dependencies: - lodash._reinterpolate "~3.0.0" - -lodash.templatesettings@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.3.0.tgz#303d132c342710040d5a18efaa2d572fd03f8cdc" - integrity sha1-MD0TLDQnEAQNWhjvqi1XL9A/jNw= + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== dependencies: - lodash._reinterpolate "~2.3.0" - lodash.escape "~2.3.0" + lodash._reinterpolate "^3.0.0" lodash.uniq@^4.2.0, lodash.uniq@^4.5.0: version "4.5.0" @@ -10242,19 +9472,12 @@ lodash.values@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c= -lodash.values@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.3.0.tgz#ca96fbe60a20b0b0ec2ba2ba5fc6a765bd14a3ba" - integrity sha1-ypb75gogsLDsK6K6X8anZb0Uo7o= - dependencies: - lodash.keys "~2.3.0" - lodash@^3.10.0: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= -lodash@^4.0.0, lodash@^4.1.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1: +lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -10267,11 +9490,11 @@ log-symbols@^2.2.0: chalk "^2.0.1" loose-envify@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" - integrity sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg= + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: - js-tokens "^3.0.0" + js-tokens "^3.0.0 || ^4.0.0" loud-rejection@^1.0.0: version "1.6.0" @@ -10297,9 +9520,9 @@ lowercase-keys@^1.0.0: integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== lru-cache@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" - integrity sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew== + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== dependencies: pseudomap "^1.0.2" yallist "^2.1.2" @@ -10312,9 +9535,9 @@ lru-cache@^5.1.1: yallist "^3.0.2" lunr@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.6.tgz#f278beee7ffd56ad86e6e478ce02ab2b98c78dd5" - integrity sha512-swStvEyDqQ85MGpABCMBclZcLI/pBIlu8FFDtmX197+oEgKloJ67QnB+Tidh0340HmLMs39c4GrkPY3cmkXp6Q== + version "2.3.8" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.8.tgz#a8b89c31f30b5a044b97d2d28e2da191b6ba2072" + integrity sha512-oxMeX/Y35PNFuZoHp+jUj5OSEmLCaIH4KTFJh7a93cHBoFmpw2IoPs22VIz7vyO2YUnx2Tn9dzIwO2P/4quIRg== magic-string@^0.22.4: version "0.22.5" @@ -10331,12 +9554,20 @@ magic-string@^0.24.0: sourcemap-codec "^1.4.1" make-dir@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51" - integrity sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA== + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== dependencies: pify "^3.0.0" +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" @@ -10383,18 +9614,7 @@ markdown-it@^4.3.0: mdurl "~1.0.0" uc.micro "^1.0.0" -markdown-it@^8.3.1: - version "8.4.0" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.0.tgz#e2400881bf171f7018ed1bd9da441dac8af6306d" - integrity sha512-tNuOCCfunY5v5uhcO2AUMArvKAyKMygX8tfup/JrgnsDqcCATQsAExBq7o5Ml9iMmO82bk6jYNLj6khcrl0JGA== - dependencies: - argparse "^1.0.7" - entities "~1.1.1" - linkify-it "^2.0.0" - mdurl "^1.0.1" - uc.micro "^1.0.3" - -markdown-it@^8.4.2: +markdown-it@^8.3.1, markdown-it@^8.4.2: version "8.4.2" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54" integrity sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ== @@ -10411,23 +9631,16 @@ marked@0.3.6: integrity sha1-ssbGGPzOzk74bE/Gy4p8v1rtqNc= marked@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.5.1.tgz#062f43b88b02ee80901e8e8d8e6a620ddb3aa752" - integrity sha512-iUkBZegCZou4AdwbKTwSW/lNDcz5OuRSl3qdcl31Ia0B2QPG0Jn+tKblh/9/eP9/6+4h27vpoh8wel/vQOV0vw== + version "0.5.2" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.5.2.tgz#3efdb27b1fd0ecec4f5aba362bddcd18120e5ba9" + integrity sha512-fdZvBa7/vSQIZCi4uuwo2N3q+7jJURpMVCcbaX0S1Mg65WZ5ilXvC67MviJAsdjqqgD+CEq4RKo5AYGgINkVAA== match-media@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/match-media/-/match-media-0.2.0.tgz#ea4e09742e7253cc7d7e1599ba627e0fa29fbc50" integrity sha1-6k4JdC5yU8x9fhWZumJ+D6KfvFA= -matcher-collection@^1.0.0, matcher-collection@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.0.5.tgz#2ee095438372cb8884f058234138c05c644ec339" - integrity sha512-nUCmzKipcJEwYsBVAFh5P+d7JBuhJaW1xs85Hara9xuMLqtCVUrW6DSC0JVIkluxEH2W45nPBM/wjHtBXa/tYA== - dependencies: - minimatch "^3.0.2" - -matcher-collection@^1.1.1: +matcher-collection@^1.0.0, matcher-collection@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.1.2.tgz#1076f506f10ca85897b53d14ef54f90a5c426838" integrity sha512-YQ/teqaOIIfUHedRam08PB3NK7Mjct6BvzRnJmpGDm8uFXpNr1sbY4yuflI5JcEs6COpYA0FpRQhSDBf1tT95g== @@ -10435,18 +9648,13 @@ matcher-collection@^1.1.1: minimatch "^3.0.2" matcher-collection@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-2.0.0.tgz#470ae263c793e897b3f1e72c695016b7aea355c4" - integrity sha512-wSi4BgQGTFfBN5J+pIaS78rEKk4qIkjrw+NfJYdHsd2cRVIQsbDi3BZtNAXTFA2WHvlbS9kLGtTjv3cPJKuRSw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-2.0.1.tgz#90be1a4cf58d6f2949864f65bb3b0f3e41303b29" + integrity sha512-daE62nS2ZQsDg9raM0IlZzLmI2u+7ZapXBwdoeBUKAYERPDDIc0qNqA8E0Rp2D+gspKR7BgIFP52GeujaGXWeQ== dependencies: "@types/minimatch" "^3.0.3" minimatch "^3.0.2" -math-random@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" - integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== - md5-hex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-2.0.0.tgz#d0588e9f1c74954492ecd24ac0ac6ce997d92e33" @@ -10502,7 +9710,15 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -memory-fs@^0.4.0, memory-fs@~0.4.1: +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= @@ -10563,7 +9779,7 @@ merge-trees@^2.0.0: fs-updater "^1.0.4" heimdalljs "^0.2.5" -merge@^1.1.3: +merge@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== @@ -10573,45 +9789,7 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^2.3.11: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.0.4: - version "3.1.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.5.tgz#d05e168c206472dfbca985bfef4f57797b4cd4ba" - integrity sha512-ykttrLPQrz1PUJcXjwsTUjGoPJ64StIGNE2lGVD1c9CuguJ+L7/navsE8IcDNndOoCMvYV0qc/exfVbMHkUhvA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.0" - define-property "^1.0.0" - extend-shallow "^2.0.1" - extglob "^2.0.2" - fragment-cache "^0.2.1" - kind-of "^6.0.0" - nanomatch "^1.2.5" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -10638,41 +9816,24 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -"mime-db@>= 1.36.0 < 2", mime-db@~1.37.0: - version "1.37.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" - integrity sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg== +mime-db@1.42.0, "mime-db@>= 1.40.0 < 2": + version "1.42.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.42.0.tgz#3e252907b4c7adb906597b4b65636272cf9e7bac" + integrity sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ== -mime-db@~1.30.0: - version "1.30.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" - integrity sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE= - -mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16: - version "2.1.17" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" - integrity sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo= - dependencies: - mime-db "~1.30.0" - -mime-types@^2.1.18, mime-types@~2.1.18, mime-types@~2.1.19: - version "2.1.21" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" - integrity sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg== +mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.25" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.25.tgz#39772d46621f93e2a80a856c53b86a62156a6437" + integrity sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg== dependencies: - mime-db "~1.37.0" + mime-db "1.42.0" mime-types@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-1.0.2.tgz#995ae1392ab8affcbfcb2641dd054e943c0d5dce" integrity sha1-mVrhOSq4r/y/yyZB3QVOlDwNXc4= -mime@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" - integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== - -mime@^1.3.4: +mime@1.6.0, mime@^1.3.4: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== @@ -10736,20 +9897,20 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= -minipass@^2.2.0, minipass@^2.2.1, minipass@^2.3.4: - version "2.3.5" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" - integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== +minipass@^2.2.0, minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== dependencies: safe-buffer "^5.1.2" yallist "^3.0.0" -minizlib@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" - integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== +minizlib@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== dependencies: - minipass "^2.2.1" + minipass "^2.9.0" miragejs@^0.1.31: version "0.1.31" @@ -10807,7 +9968,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -10825,9 +9986,9 @@ mktemp@~0.4.0: integrity sha1-bQUVYRyKjITkhKogABKbmOmB/ws= moment-timezone@^0.5.13: - version "0.5.23" - resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.23.tgz#7cbb00db2c14c71b19303cb47b0fb0a6d8651463" - integrity sha512-WHFH85DkCfiNMDX5D3X7hpNH3/PUhjTGcD0U1SgfBGZxJ3qUmJh5FdvaFjcClxOvB3rzdfj4oRffbI38jEnC1w== + version "0.5.27" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.27.tgz#73adec8139b6fe30452e78f210f27b1f346b8877" + integrity sha512-EIKQs7h5sAsjhPCqN6ggx6cEbs94GK050254TIJySD1bzoM5JTYDwAU1IoVOeTOL6Gm27kYJ51/uuvq1kIlrbw== dependencies: moment ">= 2.9.0" @@ -10848,9 +10009,9 @@ morgan@^1.9.0: on-headers "~1.0.1" mout@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mout/-/mout-1.1.0.tgz#0b29d41e6a80fa9e2d4a5be9d602e1d9d02177f6" - integrity sha512-XsP0vf4As6BfqglxZqbqQ8SR6KQot2AgxvR0gG+WtUkf90vUXchMOZQtPf/Hml1rEffJupqL/tIrU6EYhsUQjw== + version "1.2.2" + resolved "https://registry.yarnpkg.com/mout/-/mout-1.2.2.tgz#c9b718a499806a0632cede178e80f436259e777d" + integrity sha512-w0OUxFEla6z3d7sVpMZGBCpQvYh8PHS1wZ6Wu9GNKHMpAHWJ0if0LsQZh3DlOqw55HlhJEOMLpFnwtxp99Y5GA== move-concurrently@^1.0.1: version "1.0.1" @@ -10869,15 +10030,20 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@^2.1.1: +ms@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + mustache@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.0.1.tgz#873855f23aa8a95b150fb96d9836edbc5a1d248a" - integrity sha512-jFI/4UVRsRYdUbuDTKT7KzfOp7FiD5WzYmmwNwXyUVypC0xjoTL78Fqc0jHUPIvvGD+6DQSPHIt1NE7D1ArsqA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.1.0.tgz#9fba26e7aefc5709f07ff585abb7e0abced6c372" + integrity sha512-3Bxq1R5LBZp7fbFPZzFe5WN4s0q3+gxZaZuZVY+QctYJiCiVgXHOTIC0/HgZuOPFt/6BQcx5u0H2CUOxT/RoGQ== mute-stream@0.0.6: version "0.0.6" @@ -10898,27 +10064,10 @@ najax@^1.0.3: lodash.defaultsdeep "^4.6.0" qs "^6.2.0" -nan@^2.9.2: - version "2.11.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.0.tgz#574e360e4d954ab16966ec102c0c049fd961a099" - integrity sha512-F4miItu2rGnV2ySkXOQoA8FKz/SR2Q2sWP0sbTxNxz/tuokeC8WxOhPMcwi0qIyGtVn/rrSeLbvVkznqCdwYnw== - -nanomatch@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.7.tgz#53cd4aa109ff68b7f869591fdc9d10daeeea3e79" - integrity sha512-/5ldsnyurvEw7wNpxLFgjVvBLMta43niEYOy0CJ4ntcYSbx6bugRUTQeFb4BR/WanEL1o3aQgHuVLHQaB6tOqg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^1.0.0" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - is-odd "^1.0.0" - kind-of "^5.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== nanomatch@^1.2.9: version "1.2.13" @@ -10943,25 +10092,20 @@ natural-compare@^1.4.0: integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= needle@^2.2.1: - version "2.2.4" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" - integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== + version "2.4.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" + integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== dependencies: - debug "^2.1.2" + debug "^3.2.6" iconv-lite "^0.4.4" sax "^1.2.4" -negotiator@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" - integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= - -neo-async@^2.5.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" - integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== -neo-async@^2.6.0: +neo-async@^2.5.0, neo-async@^2.6.0: version "2.6.1" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== @@ -10989,9 +10133,9 @@ node-int64@^0.4.0: integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= node-libs-browser@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77" - integrity sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA== + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== dependencies: assert "^1.1.1" browserify-zlib "^0.2.0" @@ -11003,7 +10147,7 @@ node-libs-browser@^2.0.0: events "^3.0.0" https-browserify "^1.0.0" os-browserify "^0.3.0" - path-browserify "0.0.0" + path-browserify "0.0.1" process "^0.11.10" punycode "^1.2.4" querystring-es3 "^0.2.0" @@ -11015,32 +10159,28 @@ node-libs-browser@^2.0.0: tty-browserify "0.0.0" url "^0.11.0" util "^0.11.0" - vm-browserify "0.0.4" - -node-modules-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/node-modules-path/-/node-modules-path-1.0.1.tgz#40096b08ce7ad0ea14680863af449c7c75a5d1c8" - integrity sha1-QAlrCM560OoUaAhjr0ScfHWl0cg= + vm-browserify "^1.0.1" -node-modules-path@^1.0.1: +node-modules-path@^1.0.0, node-modules-path@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/node-modules-path/-/node-modules-path-1.0.2.tgz#e3acede9b7baf4bc336e3496b58e5b40d517056e" integrity sha512-6Gbjq+d7uhkO7epaKi5DNgUJn7H0gEyA4Jg0Mo1uQOi3Rk50G83LtmhhFyw0LxnAFhtlspkiiw52ISP13qzcBg== node-notifier@^5.0.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" - integrity sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg== + version "5.4.3" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" + integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== dependencies: growly "^1.3.0" - semver "^5.4.1" + is-wsl "^1.1.0" + semver "^5.5.0" shellwords "^0.1.1" which "^1.3.0" -node-pre-gyp@^0.10.0: - version "0.10.3" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" - integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" @@ -11053,13 +10193,6 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" -node-releases@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.3.tgz#aad9ce0dcb98129c753f772c0aa01360fb90fbd2" - integrity sha512-6VrvH7z6jqqNFY200kdB6HdzkgM96Oaj9v3dqGfgp6mF+cHmU4wyQKZ2/WPDRVoR0Jz9KqbamaBN0ZhdUaysUQ== - dependencies: - semver "^5.3.0" - node-releases@^1.1.40: version "1.1.41" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.41.tgz#57674a82a37f812d18e3b26118aefaf53a00afed" @@ -11088,23 +10221,23 @@ nopt@^4.0.1: osenv "^0.1.4" normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" - integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" + resolve "^1.10.0" semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.1, normalize-path@^2.1.1: +normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" -normalize-path@^3.0.0: +normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== @@ -11124,9 +10257,9 @@ normalize-url@2.0.1: sort-keys "^2.0.0" npm-bundled@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" - integrity sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g== + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== npm-git-info@^1.0.3: version "1.0.3" @@ -11134,19 +10267,19 @@ npm-git-info@^1.0.3: integrity sha1-qTPELsMh6A02RuDW6ESv6UYw4dU= npm-package-arg@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.0.tgz#15ae1e2758a5027efb4c250554b85a737db7fcc1" - integrity sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA== + version "6.1.1" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.1.tgz#02168cb0a49a2b75bf988a28698de7b529df5cb7" + integrity sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg== dependencies: - hosted-git-info "^2.6.0" + hosted-git-info "^2.7.1" osenv "^0.1.5" - semver "^5.5.0" + semver "^5.6.0" validate-npm-package-name "^3.0.0" npm-packlist@^1.1.6: - version "1.2.0" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.2.0.tgz#55a60e793e272f00862c7089274439a4cc31fc7f" - integrity sha512-7Mni4Z8Xkx0/oegoqlcao/JpPCPEMtUvsmB0q7mgvlMinykJLSRTYuFqoQLYgGY8biuxIeiHO+QNJKbCfljewQ== + version "1.4.6" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.6.tgz#53ba3ed11f8523079f1457376dd379ee4ea42ff4" + integrity sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg== dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -11175,20 +10308,13 @@ npmlog@^4.0.0, npmlog@^4.0.2: gauge "~2.7.3" set-blocking "~2.0.0" -nth-check@^1.0.2: +nth-check@^1.0.2, nth-check@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== dependencies: boolbase "~1.0.0" -nth-check@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" - integrity sha1-mSms32KPwsQQmN6rgqxYDPFJquQ= - dependencies: - boolbase "~1.0.0" - num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" @@ -11249,20 +10375,15 @@ object-hash@^1.3.1: integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== object-inspect@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" - integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== -object-keys@^1.0.11, object-keys@^1.1.1: +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-keys@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" - integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag== - object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -11288,14 +10409,6 @@ object.getownpropertydescriptors@^2.0.3: define-properties "^1.1.2" es-abstract "^1.5.1" -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -11314,9 +10427,9 @@ object.values@^1.1.0: has "^1.0.3" omggif@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.9.tgz#dcb7024dacd50c52b4d303f04802c91c057c765f" - integrity sha1-3LcCTazVDFK00wPwSALJHAV8dl8= + version "1.0.10" + resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.10.tgz#ddaaf90d4a42f532e9e7cb3a95ecdd47f17c7b19" + integrity sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw== on-finished@~2.3.0: version "2.3.0" @@ -11325,10 +10438,10 @@ on-finished@~2.3.0: dependencies: ee-first "1.1.1" -on-headers@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" - integrity sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c= +on-headers@~1.0.1, on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" @@ -11365,16 +10478,16 @@ optimist@^0.6.1: wordwrap "~0.0.2" optionator@^0.8.1, optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: deep-is "~0.1.3" - fast-levenshtein "~2.0.4" + fast-levenshtein "~2.0.6" levn "~0.3.0" prelude-ls "~1.1.2" type-check "~0.3.2" - wordwrap "~1.0.0" + word-wrap "~1.2.3" ora@^2.0.0: version "2.1.0" @@ -11415,15 +10528,7 @@ os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@^0.1.3, osenv@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" - integrity sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ= - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -osenv@^0.1.5: +osenv@^0.1.3, osenv@^0.1.4, osenv@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== @@ -11452,16 +10557,16 @@ p-is-promise@^1.1.0: integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4= p-limit@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" - integrity sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng== + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== dependencies: p-try "^1.0.0" p-limit@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.1.0.tgz#1d5a0d20fb12707c758a655f6bbc4386b5930d68" - integrity sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g== + version "2.2.1" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" + integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== dependencies: p-try "^2.0.0" @@ -11492,9 +10597,9 @@ p-try@^1.0.0: integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= p-try@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" - integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== package-json@^4.0.1: version "4.0.1" @@ -11512,16 +10617,16 @@ pad-start@^1.0.2: integrity sha1-I+W6s+lkRrYoFs/28VCXXwQNGxQ= pako@^1.0.5, pako@~1.0.5: - version "1.0.8" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.8.tgz#6844890aab9c635af868ad5fecc62e8acbba3ea4" - integrity sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA== + version "1.0.10" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" + integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== parallel-transform@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" - integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY= + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== dependencies: - cyclist "~0.2.2" + cyclist "^1.0.1" inherits "^2.0.3" readable-stream "^2.1.5" @@ -11533,9 +10638,9 @@ parent-module@^1.0.0: callsites "^3.0.0" parse-asn1@^5.0.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.3.tgz#1600c6cc0727365d68b97f3aa78939e735a75204" - integrity sha512-VrPoetlz7B/FqjBLD2f5wBVZvsZVLnRUrxVLfRYhGXCODa/NWE4p3Wp+6+aV3ZPL3KM7/OZmxDIwwijD7yuucg== + version "5.1.5" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" + integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== dependencies: asn1.js "^4.0.0" browserify-aes "^1.0.0" @@ -11571,23 +10676,10 @@ parse-git-config@^2.0.3: git-config-path "^1.0.1" ini "^1.3.5" -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - parse-headers@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.1.tgz#6ae83a7aa25a9d9b700acc28698cd1f1ed7e9536" - integrity sha1-aug6eqJanZtwCswoaYzR8e1+lTY= - dependencies: - for-each "^0.3.2" - trim "0.0.1" + version "2.0.3" + resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.3.tgz#5e8e7512383d140ba02f0c7aa9f49b4399c92515" + integrity sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA== parse-json@^2.2.0: version "2.2.0" @@ -11649,10 +10741,10 @@ parseuri@0.0.5: dependencies: better-assert "~1.0.0" -parseurl@~1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" - integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== pascalcase@^0.1.1: version "0.1.1" @@ -11666,10 +10758,10 @@ passwd-user@^1.2.1: dependencies: exec-file-sync "^2.0.0" -path-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" - integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== path-dirname@^1.0.0: version "1.0.2" @@ -11708,12 +10800,7 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" - integrity sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME= - -path-parse@^1.0.6: +path-parse@^1.0.5, path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== @@ -11807,9 +10894,9 @@ phin@^2.9.1: integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== picomatch@^2.0.4: - version "2.0.7" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" - integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== + version "2.1.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.1.1.tgz#ecdfbea7704adb5fe6fb47f9866c4c0e15e905c5" + integrity sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA== pify@^2.0.0, pify@^2.3.0: version "2.3.0" @@ -11865,18 +10952,18 @@ pn@^1.0.0, pn@^1.1.0: integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== pngjs@^3.0.0, pngjs@^3.2.0, pngjs@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.3.3.tgz#85173703bde3edac8998757b96e5821d0966a21b" - integrity sha512-1n3Z4p3IOxArEs1VRXnZ/RXdfEniAUS9jb68g58FIXMNkPJeZd+Qh4Uq7/e0LVxAQGos1eIUrqrt4FpjdnEd+Q== + version "3.4.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" + integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== portfinder@^1.0.15: - version "1.0.20" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a" - integrity sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw== + version "1.0.25" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca" + integrity sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg== dependencies: - async "^1.5.2" - debug "^2.2.0" - mkdirp "0.5.x" + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.1" posix-character-classes@^0.1.0: version "0.1.1" @@ -11927,11 +11014,11 @@ postcss-js@^1.0.1: postcss "^6.0.11" postcss-less@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-3.1.1.tgz#87347038bf9cdec9c47722ecf97648bacd171cc3" - integrity sha512-yVa0hb03p7xj914Z4qDDA/PGwXYvCEfjJizWVYQvnEQr8SgJ098qejCvbCGk1dDYQpQEGKkvYHQCo66DwTocjg== + version "3.1.4" + resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-3.1.4.tgz#369f58642b5928ef898ffbc1a6e93c958304c5ad" + integrity sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA== dependencies: - postcss "^7.0.3" + postcss "^7.0.14" postcss-nested@^3.0.0: version "3.0.0" @@ -11972,9 +11059,9 @@ postcss-selector-parser@^3.1.1: uniq "^1.0.1" postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" - integrity sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU= + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== postcss@^5.0.8, postcss@^5.2.4: version "5.2.18" @@ -11995,10 +11082,10 @@ postcss@^6.0.1, postcss@^6.0.11, postcss@^6.0.14, postcss@^6.0.17, postcss@^6.0. source-map "^0.6.1" supports-color "^5.4.0" -postcss@^7.0.0, postcss@^7.0.3, postcss@^7.0.6: - version "7.0.13" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.13.tgz#42bf716413e8f1c786ab71dc6e722b3671b16708" - integrity sha512-h8SY6kQTd1wISHWjz+E6cswdhMuyBZRb16pSTv3W4zYZ3/YbyWeJdNUeOXB5IdZqE1U76OUEjjjqsC3z2f3hVg== +postcss@^7.0.0, postcss@^7.0.14, postcss@^7.0.6: + version "7.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.23.tgz#9f9759fad661b15964f3cfc3140f66f1e05eadc1" + integrity sha512-hOlMf3ouRIFXD+j2VJecwssTwbvsPGJVMzupptg+85WA+i7MwyrydmQAgY3R+m0Bc0exunhbJmijy8u8+vufuQ== dependencies: chalk "^2.4.2" source-map "^0.6.1" @@ -12019,11 +11106,6 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= - pretender@3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.0.2.tgz#1e9123914c4e4bd1b553ca78a401120d300d265f" @@ -12041,9 +11123,9 @@ pretty-ms@^3.1.0: parse-ms "^1.0.0" printf@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/printf/-/printf-0.5.1.tgz#e0466788260859ed153006dc6867f09ddf240cf3" - integrity sha512-UaE/jO0hNsrvPGQEb4LyNzcrJv9Z00tsreBduOSxMtrebvoUhxiEJ4YCHX8YHf6akwfKsC2Gyv5zv47UXhMiLg== + version "0.5.2" + resolved "https://registry.yarnpkg.com/printf/-/printf-0.5.2.tgz#8546e01a1f647b1dff510ae92bdc92beb8c9b2f9" + integrity sha512-Hn0UuWqTRd94HiCJoiCNGZTnSyXJdIF3t4/4I293hezIzyH4pQ3ai4TlH/SmRCiMvR5aNMxSYWshjQWWW6J8MQ== private@^0.1.6, private@^0.1.8: version "0.1.8" @@ -12051,14 +11133,9 @@ private@^0.1.6, private@^0.1.8: integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== - -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" - integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== process-relative-require@^1.0.0: version "1.0.0" @@ -12083,9 +11160,9 @@ progress@^1.1.8: integrity sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74= progress@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" - integrity sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8= + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== promise-inflight@^1.0.1: version "1.0.1" @@ -12099,21 +11176,13 @@ promise-map-series@^0.2.1, promise-map-series@^0.2.3: dependencies: rsvp "^3.0.14" -proxy-addr@~2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec" - integrity sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew= - dependencies: - forwarded "~0.1.2" - ipaddr.js "1.5.2" - -proxy-addr@~2.0.3, proxy-addr@~2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" - integrity sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA== +proxy-addr@~2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" + integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== dependencies: forwarded "~0.1.2" - ipaddr.js "1.8.0" + ipaddr.js "1.9.0" prr@~1.0.1: version "1.0.1" @@ -12125,15 +11194,10 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -psl@^1.1.24: - version "1.1.28" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.28.tgz#4fb6ceb08a1e2214d4fd4de0ca22dae13740bc7b" - integrity sha512-+AqO1Ae+N/4r7Rvchrdm432afjT9hqJRyBN3DQv9At0tPz4hIFSGKbq64fN9dVoCow4oggIIax5/iONx0r9hZw== - -psl@^1.1.28: - version "1.1.31" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" - integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== +psl@^1.1.24, psl@^1.1.28: + version "1.4.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.4.0.tgz#5dd26156cdb69fa1fdb8ab1991667d3f80ced7c2" + integrity sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw== public-encrypt@^4.0.0: version "4.0.3" @@ -12192,21 +11256,26 @@ q@^1.1.2: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qs@6.5.1, qs@^6.4.0: - version "6.5.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" - integrity sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A== +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== -qs@6.5.2, qs@^6.2.0, qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== +qs@^6.2.0, qs@^6.4.0: + version "6.9.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.1.tgz#20082c65cb78223635ab1a9eaca8875a29bf8ec9" + integrity sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA== qs@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/qs/-/qs-1.0.2.tgz#50a93e2b5af6691c31bcea5dae78ee6ea1903768" integrity sha1-UKk+K1r2aRwxvOpdrnjubqGQN2g= +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + query-string@^5.0.1: version "5.1.1" resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" @@ -12256,19 +11325,10 @@ qunit@~2.6.0: sane "^2.5.2" walk-sync "0.3.2" -randomatic@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" - randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" - integrity sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A== + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" @@ -12280,29 +11340,19 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -range-parser@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= - -raw-body@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" - integrity sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k= - dependencies: - bytes "3.0.0" - http-errors "1.6.2" - iconv-lite "0.4.19" - unpipe "1.0.0" +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" - integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== dependencies: - bytes "3.0.0" - http-errors "1.6.3" - iconv-lite "0.4.23" + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" unpipe "1.0.0" raw-body@~1.1.0: @@ -12359,7 +11409,7 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.4, readable-stream@^2.1.5, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -12382,28 +11432,15 @@ readable-stream@1.1: isarray "0.0.1" string_decoder "~0.10.x" -"readable-stream@2 || 3": - version "3.3.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.3.0.tgz#cb8011aad002eb717bf040291feba8569c986fb9" - integrity sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw== +"readable-stream@2 || 3", readable-stream@^3.1.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" + integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" - integrity sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - safe-buffer "~5.1.1" - string_decoder "~1.0.3" - util-deprecate "~1.0.1" - readable-stream@~1.0.2: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" @@ -12414,7 +11451,7 @@ readable-stream@~1.0.2: isarray "0.0.1" string_decoder "~0.10.x" -readdirp@^2.0.0: +readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== @@ -12423,17 +11460,17 @@ readdirp@^2.0.0: micromatch "^3.1.10" readable-stream "^2.0.2" -readdirp@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.1.2.tgz#fa85d2d14d4289920e4671dead96431add2ee78a" - integrity sha512-8rhl0xs2cxfVsqzreYCvs8EwBfn/DhVdqtoLmw19uI3SC5avYX9teCurlErfpPXGmYtMHReGaP2RsLnFvz/lnw== +readdirp@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" + integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== dependencies: picomatch "^2.0.4" recast@^0.18.1: - version "0.18.2" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.18.2.tgz#ada263677edc70c45408caf20e6ae990958fdea8" - integrity sha512-MbuHc1lzIDIn7bpxaqIAGwwtyaokkzPqINf1Vm/LA0BSyVrTgXNVTTT7RzWC9kP+vqrUoYVpd6wHhI8x75ej8w== + version "0.18.5" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.18.5.tgz#9d5adbc07983a3c8145f3034812374a493e0fe4d" + integrity sha512-sD1WJrpLQAkXGyQZyGzTM75WJvyAd98II5CHdK3IYbt/cZlU0UzCRVU11nUFNXX9fBVEt4E9ajkMjBlUlG+Oog== dependencies: ast-types "0.13.2" esprima "~4.0.0" @@ -12462,12 +11499,7 @@ regenerate-unicode-properties@^8.1.0: dependencies: regenerate "^1.4.0" -regenerate@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" - integrity sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg== - -regenerate@^1.4.0: +regenerate@^1.2.1, regenerate@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== @@ -12508,21 +11540,7 @@ regenerator-transform@^0.14.0: dependencies: private "^0.1.6" -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== - dependencies: - is-equal-shallow "^0.1.3" - -regex-not@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.0.tgz#42f83e39771622df826b02af176525d6a5f157f9" - integrity sha1-Qvg+OXcWIt+CawKvF2Ul1qXxV/k= - dependencies: - extend-shallow "^2.0.1" - -regex-not@^1.0.2: +regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== @@ -12562,9 +11580,9 @@ regexpu-core@^4.6.0: unicode-match-property-value-ecmascript "^1.1.0" registry-auth-token@^3.0.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" - integrity sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ== + version "3.4.0" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" + integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== dependencies: rc "^1.1.6" safe-buffer "^5.0.1" @@ -12582,9 +11600,9 @@ regjsgen@^0.2.0: integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= regjsgen@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" - integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== + version "0.5.1" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" + integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== regjsparser@^0.1.4: version "0.1.5" @@ -12614,11 +11632,11 @@ remove-trailing-separator@^1.0.1: integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" - integrity sha1-7wiaF40Ug7quTZPrmLT55OEdmQo= + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.5.2, repeat-string@^1.6.1: +repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= @@ -12642,19 +11660,19 @@ request-progress@^2.0.1: dependencies: throttleit "^1.0.0" -request-promise-core@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" - integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag== +request-promise-core@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" + integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== dependencies: - lodash "^4.17.11" + lodash "^4.17.15" request-promise-native@^1.0.5, request-promise-native@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" - integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== + version "1.0.8" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" + integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== dependencies: - request-promise-core "1.1.2" + request-promise-core "1.1.3" stealthy-require "^1.1.1" tough-cookie "^2.3.3" @@ -12719,7 +11737,7 @@ require-relative@^0.8.7: resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4= -requires-port@1.x.x, requires-port@^1.0.0: +requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= @@ -12754,15 +11772,7 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-package-path@^1.0.11: - version "1.2.6" - resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-1.2.6.tgz#48f5d69a5b3a0ea68f7b9c7398459dd4125807c7" - integrity sha512-He6cGWU74tJ6wLYSKrbvWOfIXf2tUu5RcBWqX/2K9Ju00CncF5WRdCOJQisqCtaULcqIqpLvMtz8ZjfpwlBwqg== - dependencies: - path-root "^0.1.1" - resolve "^1.10.0" - -resolve-package-path@^1.2.2, resolve-package-path@^1.2.6: +resolve-package-path@^1.0.11, resolve-package-path@^1.2.2, resolve-package-path@^1.2.6: version "1.2.7" resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-1.2.7.tgz#2a7bc37ad96865e239330e3102c31322847e652e" integrity sha512-fVEKHGeK85bGbVFuwO9o1aU0n3vqQGrezPc51JGu9UTXpFQfWq5qCeKxyaRUSvephs+06c5j5rPq/dzHGEo8+Q== @@ -12783,9 +11793,9 @@ resolve@1.5.0: path-parse "^1.0.5" resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: - version "1.12.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" - integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== + version "1.12.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.2.tgz#08b12496d9aa8659c75f534a8f05f0d892fff594" + integrity sha512-cAVTI2VLHWYsGOirfeYVVQ7ZDejtQ9fp4YhYckWDEkFfqbVjaT11iM8k6xSAfGFMM+gDpZjMnFssPu8we+mqFw== dependencies: path-parse "^1.0.6" @@ -12817,13 +11827,20 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.1, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: +rimraf@2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== dependencies: glob "^7.1.3" +rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.1, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + rimraf@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" @@ -12846,7 +11863,7 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: rollup-plugin-commonjs@^8.3.0: version "8.4.1" - resolved "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.4.1.tgz#5c9cea2b2c3de322f5fbccd147e07ed5e502d7a0" + resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.4.1.tgz#5c9cea2b2c3de322f5fbccd147e07ed5e502d7a0" integrity sha512-mg+WuD+jlwoo8bJtW3Mvx7Tz6TsIdMsdhuvCnDMoyjh0oxsVgsjB/N0X984RJCWwc5IIiqNVJhXeeITcc73++A== dependencies: acorn "^5.2.1" @@ -12864,15 +11881,7 @@ rollup-plugin-node-resolve@^3.3.0: is-module "^1.0.0" resolve "^1.1.6" -rollup-pluginutils@^2.0.1: - version "2.3.3" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.3.3.tgz#3aad9b1eb3e7fe8262820818840bf091e5ae6794" - integrity sha512-2XZwja7b6P5q4RZ5FhyX1+f46xi1Z3qBKigLRZ6VTZjwbN0K1IFGMlwm06Uu0Emcre2Z63l77nq/pzn+KxIEoA== - dependencies: - estree-walker "^0.5.2" - micromatch "^2.3.11" - -rollup-pluginutils@^2.8.1: +rollup-pluginutils@^2.0.1, rollup-pluginutils@^2.8.1: version "2.8.2" resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== @@ -12897,18 +11906,18 @@ rollup@^0.57.1: sourcemap-codec "^1.4.1" rollup@^1.12.0: - version "1.21.4" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.21.4.tgz#00a41a30f90095db890301b226cbe2918e4cf54d" - integrity sha512-Pl512XVCmVzgcBz5h/3Li4oTaoDcmpuFZ+kdhS/wLreALz//WuDAMfomD3QEYl84NkDu6Z6wV9twlcREb4qQsw== + version "1.27.4" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.27.4.tgz#5bca607a10c99c034288de9f9c756f9fe1a08431" + integrity sha512-UaGNOIax/Ixfd92CAAanUilx2RSkkwEfC1lCTw1eL5Re6NURWgX66ARZt5+3px4kYnpSwzyOot4r18c2b+QgJQ== dependencies: - "@types/estree" "0.0.39" - "@types/node" "^12.7.5" - acorn "^7.0.0" + "@types/estree" "*" + "@types/node" "*" + acorn "^7.1.0" route-recognizer@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.3.tgz#1d365e27fa6995e091675f7dc940a8c00353bd29" - integrity sha1-HTZeJ/ppleCRZ199yUCowANTvSk= + version "0.3.4" + resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.4.tgz#39ab1ffbce1c59e6d2bdca416f0932611e4f3ca3" + integrity sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g== rsvp@^3.0.14, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.3.3, rsvp@^3.5.0: version "3.6.2" @@ -12920,11 +11929,6 @@ rsvp@^4.6.1, rsvp@^4.7.0, rsvp@^4.8.0, rsvp@^4.8.1, rsvp@^4.8.2, rsvp@^4.8.3, rs resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== -rsvp@~3.0.6: - version "3.0.21" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.0.21.tgz#49c588fe18ef293bcd0ab9f4e6756e6ac433359f" - integrity sha1-ScWI/hjvKTvNCrn05nVuasQzNZ8= - rsvp@~3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.2.1.tgz#07cb4a5df25add9e826ebc67dcc9fd89db27d84a" @@ -12950,22 +11954,22 @@ rx@^4.1.0: integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= rxjs@^6.4.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.2.tgz#2e35ce815cd46d84d02a209fb4e5921e051dbec7" - integrity sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg== + version "6.5.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" + integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== dependencies: tslib "^1.9.0" -safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" - integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== - -safe-buffer@5.1.2, safe-buffer@^5.1.0, safe-buffer@^5.1.2: +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + safe-json-parse@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" @@ -12978,7 +11982,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2: +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -13017,9 +12021,9 @@ sane@^3.0.0: fsevents "^1.2.3" sass@^1.22.10: - version "1.22.10" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.22.10.tgz#b9f01440352ba0be5d99fa64a2040b035cc6e5ff" - integrity sha512-DUpS1tVMGCH6gr/N9cXCoemrjoNdOLhAHfQ37fJw2A5ZM4gSI9ej/8Xi95Xwus03RqZ2zdSnKZGULL7oS+jfMA== + version "1.23.7" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.23.7.tgz#090254e006af1219d442f1bff31e139d5e085dff" + integrity sha512-cYgc0fanwIpi0rXisGxl+/wadVQ/HX3RhpdRcjLdj2o2ye/sxUTpAxIhbmJy3PLQgRFbf6Pn8Jsrta2vdXcoOQ== dependencies: chokidar ">=2.0.0 <4.0.0" @@ -13058,38 +12062,19 @@ select@^1.1.2: integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= "semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" - integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -send@0.16.1: - version "0.16.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" - integrity sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A== - dependencies: - debug "2.6.9" - depd "~1.1.1" - destroy "~1.0.4" - encodeurl "~1.0.1" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.6.2" - mime "1.4.1" - ms "2.0.0" - on-finished "~2.3.0" - range-parser "~1.2.0" - statuses "~1.3.1" - -send@0.16.2: - version "0.16.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" - integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== dependencies: debug "2.6.9" depd "~1.1.2" @@ -13098,64 +12083,37 @@ send@0.16.2: escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" - http-errors "~1.6.2" - mime "1.4.1" - ms "2.0.0" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" on-finished "~2.3.0" - range-parser "~1.2.0" - statuses "~1.4.0" + range-parser "~1.2.1" + statuses "~1.5.0" serialize-javascript@^1.4.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.6.1.tgz#4d1f697ec49429a847ca6f442a2a755126c4d879" - integrity sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw== - -serve-static@1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" - integrity sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ== - dependencies: - encodeurl "~1.0.1" - escape-html "~1.0.3" - parseurl "~1.3.2" - send "0.16.1" + version "1.9.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" + integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A== -serve-static@1.13.2: - version "1.13.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" - integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" - parseurl "~1.3.2" - send "0.16.2" + parseurl "~1.3.3" + send "0.17.1" set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-getter@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376" - integrity sha1-12nBgsnVpR9AkUXy+6guXoboA3Y= - dependencies: - to-object-path "^0.3.0" - -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -13167,15 +12125,10 @@ setimmediate@^1.0.4: resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= -setprototypeof@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" - integrity sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ= - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" @@ -13280,9 +12233,9 @@ snapdragon-util@^3.0.1: kind-of "^3.2.0" snapdragon@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.1.tgz#e12b5487faded3e3dea0ac91e9400bf75b401370" - integrity sha1-4StUh/re0+PeoKyR6UAL91tAE3A= + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== dependencies: base "^0.11.1" debug "^2.2.0" @@ -13291,7 +12244,7 @@ snapdragon@^0.8.1: map-cache "^0.2.2" source-map "^0.5.6" source-map-resolve "^0.5.0" - use "^2.0.0" + use "^3.1.0" sntp@0.2.x: version "0.2.4" @@ -13305,17 +12258,17 @@ socket.io-adapter@~1.1.0: resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" integrity sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs= -socket.io-client@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.2.0.tgz#84e73ee3c43d5020ccc1a258faeeb9aec2723af7" - integrity sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA== +socket.io-client@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.3.0.tgz#14d5ba2e00b9bcd145ae443ab96b3f86cbcc1bb4" + integrity sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA== dependencies: backo2 "1.0.2" base64-arraybuffer "0.1.5" component-bind "1.0.0" component-emitter "1.2.1" - debug "~3.1.0" - engine.io-client "~3.3.1" + debug "~4.1.0" + engine.io-client "~3.4.0" has-binary2 "~1.0.2" has-cors "1.1.0" indexof "0.0.1" @@ -13334,17 +12287,26 @@ socket.io-parser@~3.3.0: debug "~3.1.0" isarray "2.0.1" +socket.io-parser@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.4.0.tgz#370bb4a151df2f77ce3345ff55a7072cc6e9565a" + integrity sha512-/G/VOI+3DBp0+DJKW4KesGnQkQPFmUCbA/oO2QGT6CWxU7hLGWqU3tyuzeSK/dqcyeHsQg1vTe9jiZI8GU9SCQ== + dependencies: + component-emitter "1.2.1" + debug "~4.1.0" + isarray "2.0.1" + socket.io@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.2.0.tgz#f0f633161ef6712c972b307598ecd08c9b1b4d5b" - integrity sha512-wxXrIuZ8AILcn+f1B4ez4hJTPG24iNgxBBDaJfT6MsyOhVYiTXWexGoPkd87ktJG8kQEcL/NBvRi64+9k4Kc0w== + version "2.3.0" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.3.0.tgz#cd762ed6a4faeca59bc1f3e243c0969311eb73fb" + integrity sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg== dependencies: debug "~4.1.0" - engine.io "~3.3.1" + engine.io "~3.4.0" has-binary2 "~1.0.2" socket.io-adapter "~1.1.0" - socket.io-client "2.2.0" - socket.io-parser "~3.3.0" + socket.io-client "2.3.0" + socket.io-parser "~3.4.0" sort-keys@^2.0.0: version "2.0.0" @@ -13359,11 +12321,12 @@ sort-object-keys@^1.1.2: integrity sha1-06bEjcKsl+a8lDZ2luA/bQnTeVI= sort-package-json@^1.15.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.17.1.tgz#ab8d7ba8c8e2bbe1805e0650829256f64191c203" - integrity sha512-IxcHMpJF2ksT2cTtY3scXErmxbpp79bA7nlToENHCn0ZhoX7fMJk97z9sHDyubRoKzbwzq4r6TZz9DHL5V0LXA== + version "1.23.1" + resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.23.1.tgz#7882349ad885ee6d82ff57af4184f9d6e9159e1d" + integrity sha512-dg6XChDHL+V1gPBLW4fDWsip5T94wpDVlowm8gxXsxQMxX2271zw8JM1RRbJSIrN80/UlwlRdBVkk2SuiuZ2cw== dependencies: - detect-indent "^5.0.0" + detect-indent "^6.0.0" + glob "^7.1.6" sort-object-keys "^1.1.2" source-list-map@^2.0.0: @@ -13372,11 +12335,11 @@ source-list-map@^2.0.0: integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== source-map-resolve@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" - integrity sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A== + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== dependencies: - atob "^2.0.0" + atob "^2.1.1" decode-uri-component "^0.2.0" resolve-url "^0.2.1" source-map-url "^0.4.0" @@ -13389,10 +12352,10 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" -source-map-support@^0.5.0, source-map-support@~0.5.10, source-map-support@~0.5.6: - version "0.5.12" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" - integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== +source-map-support@^0.5.0, source-map-support@~0.5.10, source-map-support@~0.5.12: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -13432,18 +12395,18 @@ source-map@~0.1.x: amdefine ">=0.0.4" sourcemap-codec@^1.4.1: - version "1.4.4" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz#c63ea927c029dd6bd9a2b7fa03b3fec02ad56e9f" - integrity sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg== + version "1.4.6" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz#e30a74f0402bad09807640d39e971090a08ce1e9" + integrity sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg== sourcemap-validator@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/sourcemap-validator/-/sourcemap-validator-1.1.0.tgz#00454547d1682186e1498a7208e022e8dfa8738f" - integrity sha512-Hmdu39KL+EoAAZ69OTk7RXXJdPRRizJvOZOWhCW9jLGfEQflCNPTlSoCXFPdKWFwwf0uzLcGR/fc7EP/PT8vRQ== + version "1.1.1" + resolved "https://registry.yarnpkg.com/sourcemap-validator/-/sourcemap-validator-1.1.1.tgz#3d7d8a399ccab09c1fedc510d65436e25b1c386b" + integrity sha512-pq6y03Vs6HUaKo9bE0aLoksAcpeOo9HZd7I8pI6O480W/zxNZ9U32GfzgtPP0Pgc/K1JHna569nAbOk3X8/Qtw== dependencies: jsesc "~0.3.x" - lodash.foreach "~2.3.x" - lodash.template "~2.3.x" + lodash.foreach "^4.5.0" + lodash.template "^4.5.0" source-map "~0.1.x" spawn-args@^0.2.0: @@ -13459,22 +12422,31 @@ spawn-sync@^1.0.11, spawn-sync@^1.0.15: concat-stream "^1.4.7" os-shim "^0.1.2" -spdx-correct@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" - integrity sha1-SzBz2TP/UfORLwOsVRlJikFQ20A= +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== dependencies: - spdx-license-ids "^1.0.2" + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" -spdx-expression-parse@~1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" - integrity sha1-m98vIOH0DtRH++JzJmGR/O1RYmw= +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== -spdx-license-ids@^1.0.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" - integrity sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc= +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -13540,21 +12512,11 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.3.1 < 2", statuses@~1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" - integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== - -"statuses@>= 1.4.0 < 2": +"statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= -statuses@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" - integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= - stealthy-require@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" @@ -13630,7 +12592,7 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -13652,21 +12614,21 @@ string.prototype.repeat@^0.2.0: resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-0.2.0.tgz#aba36de08dcee6a5a337d49b2ea1da1b28fc0ecf" integrity sha1-q6Nt4I3O5qWjN9SbLqHaGyj8Ds8= -string.prototype.trimleft@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.0.0.tgz#68b6aa8e162c6a80e76e3a8a0c2e747186e271ff" - integrity sha1-aLaqjhYsaoDnbjqKDC50cYbicf8= +string.prototype.trimleft@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634" + integrity sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw== dependencies: - define-properties "^1.1.2" - function-bind "^1.0.2" + define-properties "^1.1.3" + function-bind "^1.1.1" -string.prototype.trimright@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.0.0.tgz#ab4a56d802a01fbe7293e11e84f24dc8164661dd" - integrity sha1-q0pW2AKgH75yk+EehPJNyBZGYd0= +string.prototype.trimright@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58" + integrity sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg== dependencies: - define-properties "^1.1.2" - function-bind "^1.0.2" + define-properties "^1.1.3" + function-bind "^1.1.1" string_decoder@0.10, string_decoder@~0.10.x: version "0.10.31" @@ -13674,18 +12636,11 @@ string_decoder@0.10, string_decoder@~0.10.x: integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= string_decoder@^1.0.0, string_decoder@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" - integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== - dependencies: - safe-buffer "~5.1.0" - -string_decoder@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" - integrity sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ== + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: - safe-buffer "~5.1.0" + safe-buffer "~5.2.0" string_decoder@~1.1.1: version "1.1.1" @@ -13832,9 +12787,9 @@ svgo@1.3.0: util.promisify "~1.0.0" "symbol-tree@>= 3.1.0 < 4.0.0", symbol-tree@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" - integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.8, symlink-or-copy@^1.2.0: version "1.2.0" @@ -13842,9 +12797,9 @@ symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.8, symlink- integrity sha512-W31+GLiBmU/ZR02Ii0mVZICuNEN9daZ63xZMPDsYgPgNjMtg+atqLEGI7PPI936jYSQZxoLb/63xos8Adrx4Eg== sync-disk-cache@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/sync-disk-cache/-/sync-disk-cache-1.3.3.tgz#481933461623fdc2bdf46cfc87872ba215a7e246" - integrity sha512-Kp7DFemXDPRUbFW856CKamtX7bJuThZPa2dwnK2RfNqMew7Ah8xDc52SdooNlfN8oydDdDHlBPLsXTrtmA7HKw== + version "1.3.4" + resolved "https://registry.yarnpkg.com/sync-disk-cache/-/sync-disk-cache-1.3.4.tgz#53a2c5a09d8f4bb53160bce182a456ad71574024" + integrity sha512-GlkGeM81GPPEKz/lH7QUTbvqLq7K/IUTuaKDSMulP9XQ42glqNJIN/RKgSOw4y8vxL1gOVvj+W7ruEO4s36eCw== dependencies: debug "^2.1.3" heimdalljs "^0.2.3" @@ -13853,12 +12808,12 @@ sync-disk-cache@^1.3.3: username-sync "^1.0.2" table@^5.2.3: - version "5.4.1" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.1.tgz#0691ae2ebe8259858efb63e550b6d5f9300171e8" - integrity sha512-E6CK1/pZe2N75rGZQotFOdmzWQ1AILtgYbMAbAjvms0S1l5IDB47zG3nCnFGB/w+7nB3vKofbLXCH7HPBo864w== + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== dependencies: - ajv "^6.9.1" - lodash "^4.17.11" + ajv "^6.10.2" + lodash "^4.17.14" slice-ansi "^2.1.0" string-width "^3.0.0" @@ -13893,22 +12848,22 @@ tap-parser@^7.0.0: minipass "^2.2.0" tapable@^1.0.0, tapable@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e" - integrity sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA== + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== tar@^4: - version "4.4.8" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" - integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== + version "4.4.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== dependencies: chownr "^1.1.1" fs-minipass "^1.2.5" - minipass "^2.3.4" - minizlib "^1.1.1" + minipass "^2.8.6" + minizlib "^1.2.1" mkdirp "^0.5.0" safe-buffer "^5.1.2" - yallist "^3.0.2" + yallist "^3.0.3" temp@0.8.3: version "0.8.3" @@ -13932,7 +12887,7 @@ terser-webpack-plugin@1.2.1, terser-webpack-plugin@^1.1.0: webpack-sources "^1.1.0" worker-farm "^1.5.2" -terser@^3.17.0: +terser@^3.8.1: version "3.17.0" resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2" integrity sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ== @@ -13941,24 +12896,25 @@ terser@^3.17.0: source-map "~0.6.1" source-map-support "~0.5.10" -terser@^3.8.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-3.14.1.tgz#cc4764014af570bc79c79742358bd46926018a32" - integrity sha512-NSo3E99QDbYSMeJaEk9YW2lTg3qS9V0aKGlb+PlOrei1X02r1wSBHCNX/O+yeTRFSWPKPIGj6MqvvdqV4rnVGw== +terser@^4.3.9: + version "4.4.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.4.0.tgz#22c46b4817cf4c9565434bfe6ad47336af259ac3" + integrity sha512-oDG16n2WKm27JO8h4y/w3iqBGAOSCtq7k8dRmrn4Wf9NouL0b2WpMHGChFGZq4nFAQy1FsNJrVQHfurXOSTmOA== dependencies: - commander "~2.17.1" + commander "^2.20.0" source-map "~0.6.1" - source-map-support "~0.5.6" + source-map-support "~0.5.12" testem@^2.9.2: - version "2.14.0" - resolved "https://registry.yarnpkg.com/testem/-/testem-2.14.0.tgz#418a9a15843f68381659c6a486abb4ea48d06c29" - integrity sha512-tldpNPCzXfibmxOoTMGOfr8ztUiHf9292zSXCu7SitBx9dCK83k7vEoa77qJBS9t3RGCQCRF+GNMUuiFw//Mbw== + version "2.17.0" + resolved "https://registry.yarnpkg.com/testem/-/testem-2.17.0.tgz#1cb4a2a90524a088803dfe52fbf197a6fd73c883" + integrity sha512-PLkIlT523w5rTJPWwR4TL1EiAEa941ECV7d4pMqsB0YdnH+sCTz0loWMKCUSdhR+VijveAZ6anE/JHehE7KqMQ== dependencies: backbone "^1.1.2" bluebird "^3.4.6" charm "^1.0.0" commander "^2.6.0" + compression "^1.7.4" consolidate "^0.15.1" execa "^1.0.0" express "^4.10.7" @@ -13985,9 +12941,9 @@ testem@^2.9.2: xmldom "^0.1.19" tether@^1.4.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/tether/-/tether-1.4.4.tgz#9dc6eb2b3e601da2098fd264e7f7a8b264de1125" - integrity sha512-bagKeRRo3vEynHnO3GB7/jB3Q4YIf0mN7gXM/nR0wZvNHkPrwmZemg1w0C32JZP0prHZUwxGwoX5CdA7tuIDEw== + version "1.4.7" + resolved "https://registry.yarnpkg.com/tether/-/tether-1.4.7.tgz#d56a818590d8fe72e387f77a67f93ab96d8e1fb2" + integrity sha512-Z0J1aExjoFU8pybVkQAo/vD2wfSO63r+XOPfWQMC5qtf1bI7IWqNk4MiyBcgvvnY8kqnY06dVdvwTK2S3PU/Fw== text-table@^0.2.0: version "0.2.0" @@ -13995,29 +12951,29 @@ text-table@^0.2.0: integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= "textextensions@1 || 2": - version "2.2.0" - resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.2.0.tgz#38ac676151285b658654581987a0ce1a4490d286" - integrity sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA== + version "2.6.0" + resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.6.0.tgz#d7e4ab13fe54e32e08873be40d51b74229b00fc4" + integrity sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ== throttleit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw= -through2-filter@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" - integrity sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw= +through2-filter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254" + integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA== dependencies: through2 "~2.0.0" xtend "~4.0.0" through2@^2.0.0, through2@^2.0.3, through2@~2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" - integrity sha1-AARWmzfHx0ujnEPzzteNGtlBQL4= + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== dependencies: - readable-stream "^2.1.5" + readable-stream "~2.3.6" xtend "~4.0.1" through2@^3.0.0: @@ -14048,21 +13004,21 @@ timed-out@^4.0.0, timed-out@^4.0.1: integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= timers-browserify@^2.0.4: - version "2.0.10" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" - integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg== + version "2.0.11" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" + integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== dependencies: setimmediate "^1.0.4" timm@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/timm/-/timm-1.6.1.tgz#5f8aafc932248c76caf2c6af60542a32d3c30701" - integrity sha512-hqDTYi/bWuDxL2i6T3v6nrvkAQ/1Bc060GSkVEQZp02zTSTB4CHSKsOkliequCftQaNRcjRqUZmpGWs5FfhrNg== + version "1.6.2" + resolved "https://registry.yarnpkg.com/timm/-/timm-1.6.2.tgz#dfd8c6719f7ba1fcfc6295a32670a1c6d166c0bd" + integrity sha512-IH3DYDL1wMUwmIlVmMrmesw5lZD6N+ZOAFWEyLrtpoL9Bcrs9u7M/vyOnHzDD2SMs4irLkVjqxZbHrXStS/Nmw== tiny-emitter@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.0.2.tgz#82d27468aca5ade8e5fd1e6d22b57dd43ebdfb7c" - integrity sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow== + version "2.1.0" + resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" + integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== tiny-lr@^1.1.1: version "1.1.1" @@ -14160,16 +13116,7 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-regex@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.1.tgz#15358bee4a2c83bd76377ba1dc049d0f18837aae" - integrity sha1-FTWL7kosg712N3uh3ASdDxiDeq4= - dependencies: - define-property "^0.2.5" - extend-shallow "^2.0.1" - regex-not "^1.0.0" - -to-regex@^3.0.2: +to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== @@ -14184,6 +13131,11 @@ to-utf8@0.0.1: resolved "https://registry.yarnpkg.com/to-utf8/-/to-utf8-0.0.1.tgz#d17aea72ff2fba39b9e43601be7b3ff72e089852" integrity sha1-0Xrqcv8vujm55DYBvns/9y4ImFI= +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + topo@2.x.x: version "2.0.2" resolved "https://registry.yarnpkg.com/topo/-/topo-2.0.2.tgz#cd5615752539057c0dc0491a621c3bc6fbe1d182" @@ -14229,15 +13181,15 @@ tr46@~0.0.1: integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= tree-sync@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-sync/-/tree-sync-1.2.2.tgz#2cf76b8589f59ffedb58db5a3ac7cb013d0158b7" - integrity sha1-LPdrhYn1n/7bWNtaOsfLAT0BWLc= + version "1.4.0" + resolved "https://registry.yarnpkg.com/tree-sync/-/tree-sync-1.4.0.tgz#314598d13abaf752547d9335b8f95d9a137100d6" + integrity sha512-YvYllqh3qrR5TAYZZTXdspnIhlKAYezPYw11ntmweoceu4VK+keN356phHRIIo1d+RDmLpHZrUlmxga2gc9kSQ== dependencies: debug "^2.2.0" fs-tree-diff "^0.5.6" mkdirp "^0.5.1" quick-temp "^0.1.5" - walk-sync "^0.2.7" + walk-sync "^0.3.3" trim-newlines@^1.0.0: version "1.0.0" @@ -14249,15 +13201,10 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -trim@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" - integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= - tslib@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" - integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== tty-browserify@0.0.0: version "0.0.0" @@ -14288,21 +13235,13 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-is@~1.6.15: - version "1.6.15" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" - integrity sha1-yrEPtJCeRByChC6v4a1kbIGARBA= - dependencies: - media-typer "0.3.0" - mime-types "~2.1.15" - -type-is@~1.6.16: - version "1.6.16" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" - integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" - mime-types "~2.1.18" + mime-types "~2.1.24" typedarray@^0.0.6: version "0.0.6" @@ -14316,17 +13255,17 @@ typescript-memoize@^1.0.0-alpha.3: dependencies: core-js "2.4.1" -uc.micro@^1.0.0, uc.micro@^1.0.1, uc.micro@^1.0.3, uc.micro@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376" - integrity sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg== +uc.micro@^1.0.0, uc.micro@^1.0.1, uc.micro@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== uglify-js@^3.1.4: - version "3.4.9" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" - integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q== + version "3.6.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.9.tgz#85d353edb6ddfb62a9d798f36e91792249320611" + integrity sha512-pcnnhaoG6RtrvHJ1dFncAe8Od6Nuy30oaJ82ts6//sGSXOP5UjBMEthiProjXmMNHOfd93sqlkztifFMcb+4yw== dependencies: - commander "~2.17.1" + commander "~2.20.3" source-map "~0.6.1" underscore.string@~3.3.4: @@ -14338,9 +13277,9 @@ underscore.string@~3.3.4: util-deprecate "^1.0.2" underscore@>=1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" - integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI= + version "1.9.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" + integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" @@ -14361,19 +13300,19 @@ unicode-match-property-value-ecmascript@^1.1.0: integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== unicode-property-aliases-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" - integrity sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg== + version "1.0.5" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" + integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== dependencies: arr-union "^3.1.0" get-value "^2.0.6" is-extendable "^0.1.1" - set-value "^0.4.3" + set-value "^2.0.1" uniq@^1.0.1: version "1.0.1" @@ -14388,19 +13327,19 @@ unique-filename@^1.1.1: unique-slug "^2.0.0" unique-slug@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" - integrity sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== dependencies: imurmurhash "^0.1.4" unique-stream@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" - integrity sha1-WqADz76Uxf+GbE59ZouxxNuts2k= + version "2.3.1" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac" + integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A== dependencies: - json-stable-stringify "^1.0.0" - through2-filter "^2.0.0" + json-stable-stringify-without-jsonify "^1.0.1" + through2-filter "^3.0.0" unique-string@^1.0.0: version "1.0.0" @@ -14410,9 +13349,9 @@ unique-string@^1.0.0: crypto-random-string "^1.0.0" universalify@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" - integrity sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc= + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" @@ -14444,10 +13383,10 @@ unzip-response@^2.0.1: resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= -upath@^1.0.5: - version "1.1.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" - integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw== +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== uri-js@^4.2.2: version "4.2.2" @@ -14495,14 +13434,10 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" -use@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8" - integrity sha1-riig1y+TvyJCKhii43mZMRLeyOg= - dependencies: - define-property "^0.2.5" - isobject "^3.0.0" - lazy-cache "^2.0.2" +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== user-info@^1.0.0: version "1.0.0" @@ -14513,11 +13448,6 @@ user-info@^1.0.0: passwd-user "^1.2.1" username "^1.0.1" -username-sync@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/username-sync/-/username-sync-1.0.1.tgz#1cde87eefcf94b8822984d938ba2b797426dae1f" - integrity sha1-HN6H7vz5S4gimE2Ti6K3l0Jtrh8= - username-sync@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/username-sync/-/username-sync-1.0.2.tgz#0a3697909fb7b5768d29e2921f573acfdd427592" @@ -14570,17 +13500,17 @@ utils-merge@1.0.1: integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= uuid@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + version "3.3.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" + integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== validate-npm-package-license@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" - integrity sha1-KAS6vnEq0zeUWaz74kdGqywwP7w= + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: - spdx-correct "~1.0.0" - spdx-expression-parse "~1.0.0" + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" validate-npm-package-name@^3.0.0: version "3.0.0" @@ -14600,9 +13530,9 @@ velocity-animate@^1.5.2: integrity sha512-m6EXlCAMetKztO1ppBhGU1/1MR3IiEevO6ESq6rcrSQ3Q77xYSW13jkfXW88o4xMrkXJhy/U7j4wFR/twMB0Eg== vendors@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" - integrity sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ== + version "1.0.3" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.3.tgz#a6467781abd366217c050f8202e7e50cc9eef8c0" + integrity sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw== verror@1.10.0: version "1.10.0" @@ -14630,12 +13560,10 @@ vlq@^0.2.2: resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== -vm-browserify@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" - integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= - dependencies: - indexof "0.0.1" +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== w3c-hr-time@^1.0.1: version "1.0.1" @@ -14661,7 +13589,7 @@ walk-sync@0.3.2: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" -walk-sync@^0.2.5, walk-sync@^0.2.7: +walk-sync@^0.2.5: version "0.2.7" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.2.7.tgz#b49be4ee6867657aeb736978b56a29d10fa39969" integrity sha1-tJvk7mhnZXrrc2l4tWop0Q+jmWk= @@ -14678,9 +13606,9 @@ walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2, walk-sync@^0.3.3: matcher-collection "^1.0.0" walk-sync@^1.0.0, walk-sync@^1.0.1, walk-sync@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-1.1.3.tgz#3b7b6468f068b5eba2278c931c57db3d39092969" - integrity sha512-23ivbET0Q/389y3EHpiIgxx881AS2mwdXA7iBqUDNSymoTPYb2jWlF3gkuuAP1iLgdNXmiHw/kZ/wZwrELU6Ag== + version "1.1.4" + resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-1.1.4.tgz#81049f3d8095479b49574cfa5f558d7a252b127d" + integrity sha512-nowc9thB/Jg0KW4TgxoRjLLYRPvl3DB/98S89r4ZcJqq2B0alNcKDh6pzLkBSkPMzRSMsJghJHQi79qw0YWEkA== dependencies: "@types/minimatch" "^3.0.3" ensure-posix-path "^1.1.0" @@ -14748,9 +13676,9 @@ webidl-conversions@^4.0.2: integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== webpack-sources@^1.1.0, webpack-sources@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" - integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== dependencies: source-list-map "^2.0.0" source-map "~0.6.1" @@ -14786,11 +13714,12 @@ webpack@~4.28: webpack-sources "^1.3.0" websocket-driver@>=0.5.1: - version "0.7.0" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" - integrity sha1-DK+dLXVdk67gSdS90NP+LMoqJOs= + version "0.7.3" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" + integrity sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg== dependencies: - http-parser-js ">=0.4.0" + http-parser-js ">=0.4.0 <0.4.11" + safe-buffer ">=5.1.0" websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: @@ -14832,9 +13761,9 @@ whatwg-url@^6.4.1: webidl-conversions "^4.0.2" whatwg-url@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" - integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== dependencies: lodash.sortby "^4.7.0" tr46 "^1.0.1" @@ -14845,20 +13774,13 @@ which-module@^1.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= -which@^1.2.10: +which@^1.2.10, which@^1.2.14, which@^1.2.9, which@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -which@^1.2.14, which@^1.2.9, which@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" - integrity sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg== - dependencies: - isexe "^2.0.0" - which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -14867,44 +13789,37 @@ which@^2.0.1: isexe "^2.0.0" wide-align@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" - integrity sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w== + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== dependencies: - string-width "^1.0.2" + string-width "^1.0.2 || 2" + +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - worker-farm@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" - integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ== + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== dependencies: errno "~0.1.7" workerpool@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-2.3.0.tgz#86c5cbe946b55e7dc9d12b1936c8801a6e2d744d" - integrity sha512-JP5DpviEV84zDmz13QnD4FfRjZBjnTOYY2O4pGgxtlqLh47WOzQFHm8o17TE5OSfcDoKC6vHSrN4yPju93DW0Q== + version "2.3.3" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-2.3.3.tgz#49a70089bd55e890d68cc836a19419451d7c81d7" + integrity sha512-L1ovlYHp6UObYqElXXpbd214GgbEKDED0d3sj7pRdFXjNkb2+un/AUcCkceHizO0IVI6SOGGncrcjozruCkRgA== dependencies: object-assign "4.1.1" workerpool@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-3.1.1.tgz#9decea76b73c2f91de1b5bec1019f8a474b3a620" - integrity sha512-VzYD/kM3Gk9L7GR0LtrcyiZA8+h8Fse503aq4WkYwRBXreHTixVEcqKLjiFS6gM0fyaEt0pjSLf1ANGQXM27cg== - dependencies: - object-assign "4.1.1" - -workerpool@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-3.1.2.tgz#b34e79243647decb174b7481ab5b351dc565c426" integrity sha512-WJFA0dGqIK7qj7xPTqciWBH5DlJQzoPjsANvc3Y4hNB0SScT+Emjvt0jPPkDBUjBNngX1q9hHgt1Gfwytu6pug== @@ -14913,6 +13828,11 @@ workerpool@^3.1.2: object-assign "4.1.1" rsvp "^4.8.4" +workerpool@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-5.0.2.tgz#8fd8f6c7250710b9c3143d5f7494db3b6633ce6e" + integrity sha512-RsXfHGFzbqrfrExTN1TyZobWXCN6+vbn9B1CsZ5zQ2ASA2kQaYONCGOAT88Ew+kNSaRq/XmApRC/HRSv9Z98Ng== + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -14927,9 +13847,9 @@ wrappy@1: integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= write-file-atomic@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" - integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA== + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" @@ -14961,17 +13881,17 @@ ws@^6.1.0: dependencies: async-limiter "~1.0.0" -ws@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.0.1.tgz#1a04e86cc3a57c03783f4910fdb090cf31b8e165" - integrity sha512-ILHfMbuqLJvnSgYXLgy4kMntroJpe8hT41dOVWM8bxRuw6TK4mgMp9VJUNsZTEc5Bh+Mbs0DJT4M0N+wBG9l9A== +ws@^7.0.0, ws@^7.1.2: + version "7.2.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.0.tgz#422eda8c02a4b5dba7744ba66eebbd84bcef0ec7" + integrity sha512-+SqNqFbwTm/0DC18KYzIsMTnEWpLwJsiasW/O17la4iDRRIO9uaHbvKiAS3AHgTiuuWerK/brj4O6MYZkei9xg== dependencies: async-limiter "^1.0.0" ws@~6.1.0: - version "6.1.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.2.tgz#3cc7462e98792f0ac679424148903ded3b9c3ad8" - integrity sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw== + version "6.1.4" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.4.tgz#5b5c8800afab925e94ccb29d153c8d02c1776ef9" + integrity sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA== dependencies: async-limiter "~1.0.0" @@ -15006,22 +13926,23 @@ xml-parse-from-string@^1.0.0: integrity sha1-qQKekp09vN7RafPG4oI42VpdWig= xml2js@^0.4.5: - version "0.4.19" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" - integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== + version "0.4.22" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.22.tgz#4fa2d846ec803237de86f30aa9b5f70b6600de02" + integrity sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw== dependencies: sax ">=0.6.0" - xmlbuilder "~9.0.1" + util.promisify "~1.0.0" + xmlbuilder "~11.0.0" -xmlbuilder@~9.0.1: - version "9.0.7" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" - integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== xmlchars@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.1.1.tgz#ef1a81c05bff629c2280007f12daca21bd6f6c93" - integrity sha512-7hew1RPJ1iIuje/Y01bGD/mXokXxegAgVS+e+E0wSi2ILHQkYAH1+JXARwTjZSM4Z4Z+c73aKspEcqj+zPPL/w== + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== xmldom@^0.1.19: version "0.1.27" @@ -15034,9 +13955,9 @@ xmlhttprequest-ssl@~1.5.4: integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^3.2.1: version "3.2.1" @@ -15053,10 +13974,10 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.0, yallist@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" - integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yam@^0.0.24: version "0.0.24" From 21ca3573f88de24ba68d4476c45fc1a45d5e0fa5 Mon Sep 17 00:00:00 2001 From: Buck Doyle Date: Sun, 24 Nov 2019 12:30:50 -0600 Subject: [PATCH 597/879] Fix broken intra-documentation links (#1833) --- tests/dummy/app/pods/docs/data-layer/serializers/template.md | 2 +- tests/dummy/app/pods/docs/getting-started/overview/template.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/dummy/app/pods/docs/data-layer/serializers/template.md b/tests/dummy/app/pods/docs/data-layer/serializers/template.md index 0c0460f72..3a868938a 100644 --- a/tests/dummy/app/pods/docs/data-layer/serializers/template.md +++ b/tests/dummy/app/pods/docs/data-layer/serializers/template.md @@ -250,6 +250,6 @@ In general, you should not need to write much code dealing with Mirage serialize The more conventional your backend API is, the less code you'll need to write – not only in Mirage, but also in other parts of your Ember application! -Be sure to check out the {{docs-link 'Serializer' 'docs.api.item' 'modules/ember-cli-mirage/serializer~Serializer#keyForAttribute'}} and {{docs-link 'JSONAPISerializer' 'docs.api.item' 'modules/ember-cli-mirage/serializers/json-api-serializer~JSONAPISerializer'}} docs to learn about all the hooks available to customize your serializer layer. +Be sure to check out the {{docs-link 'Serializer' 'docs.api.item' 'modules/serializer~Serializer#keyForAttribute'}} and {{docs-link 'JSONAPISerializer' 'docs.api.item' 'modules/serializers/json-api-serializer~JSONAPISerializer'}} docs to learn about all the hooks available to customize your serializer layer. Now that we've covered the ins and outs of Mirage's data layer, we're ready to see how we can use Mirage to effectively test our Ember application. diff --git a/tests/dummy/app/pods/docs/getting-started/overview/template.md b/tests/dummy/app/pods/docs/getting-started/overview/template.md index e3d0608b5..4f1668dde 100644 --- a/tests/dummy/app/pods/docs/getting-started/overview/template.md +++ b/tests/dummy/app/pods/docs/getting-started/overview/template.md @@ -360,7 +360,7 @@ With the above config, a GET to `/movies/1` would return automatically include r } ``` -Mirage ships with two named serializers, JSONAPISerializer and ActiveModelSerializer, to save you the trouble of writing this custom code yourself. See the [serializer guide](../api/modules/ember-cli-mirage/serializer~Serializer) to learn more. +Mirage ships with two named serializers, JSONAPISerializer and ActiveModelSerializer, to save you the trouble of writing this custom code yourself. See the [serializer guide](../api/modules/serializer~Serializer) to learn more. ## Shorthands From b6d98c49d679391b1224f33978b3ec5890f95f1b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 2 Dec 2019 07:09:11 +0000 Subject: [PATCH 598/879] build(deps-dev): bump eslint-plugin-ember from 7.6.0 to 7.7.1 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 7.6.0 to 7.7.1. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v7.6.0...v7.7.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index 969e59d83..814c736d7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6512,8 +6512,9 @@ esdoc-ecmascript-proposal-plugin@^1.0.0: resolved "https://registry.yarnpkg.com/esdoc-ecmascript-proposal-plugin/-/esdoc-ecmascript-proposal-plugin-1.0.0.tgz#390dc5656ba8a2830e39dba3570d79138df2ffd9" integrity sha1-OQ3FZWuoooMOOdujVw15E43y/9k= -"esdoc@github:pzuraq/esdoc#015a342": +esdoc@pzuraq/esdoc#015a342: version "1.0.4" + uid "015a3426b2e53b2b0270a9c00133780db3f1d144" resolved "https://codeload.github.com/pzuraq/esdoc/tar.gz/015a3426b2e53b2b0270a9c00133780db3f1d144" dependencies: babel-generator "6.26.0" @@ -6529,9 +6530,9 @@ esdoc-ecmascript-proposal-plugin@^1.0.0: taffydb "2.7.2" eslint-plugin-ember@^7.0.0: - version "7.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.6.0.tgz#383ce9be91b3ac219046e616216d0adb32eda39a" - integrity sha512-ni+Ey2qgx3GTBvGm0px4s+Xp37ZWB7kJhvS9ZjhrZAHUVLHzberCP+Q+wxCHCu95Z564ARZe2x6W70ImDhLatA== + version "7.7.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.7.1.tgz#41398c9a32304c21547fb969c689cd3300718f9d" + integrity sha512-9nWU7QAdfzKPHlZ1C8yjjyRkvsIv4Lea3saD2H7NnIep8Z4YN9+AKfycejniYjeLvxYMsSqI+JFXPUcbpgZhhw== dependencies: "@ember-data/rfc395-data" "^0.0.4" ember-rfc176-data "^0.3.12" From a391937fabd00eccf7f3a262172d1d6f2bce786e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 4 Dec 2019 07:05:40 +0000 Subject: [PATCH 599/879] build(deps-dev): bump ember-source from 3.14.2 to 3.14.3 Bumps [ember-source](https://github.com/emberjs/ember.js) from 3.14.2 to 3.14.3. - [Release notes](https://github.com/emberjs/ember.js/releases) - [Changelog](https://github.com/emberjs/ember.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember.js/compare/v3.14.2...v3.14.3) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 814c736d7..911fbe22e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6215,9 +6215,9 @@ ember-source-channel-url@^2.0.1: got "^8.0.1" ember-source@~3.14.1: - version "3.14.2" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.14.2.tgz#5cb5c84004192e2288300deb644b412fb389fc81" - integrity sha512-Yi99+K0C95gJR9kqGGyak2dZX2moBn4e+UmA5G3ZiJxDbWdvVGkef4u+8P261VRLvP9xsQiIruhkPqjHcs46XA== + version "3.14.3" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.14.3.tgz#ae764f49d1db5a1327056d469ce07dbd53cbeaab" + integrity sha512-w4vOvUEk6qnRs61bLkgnebSzlOKwo7X+OdklFoR4gJltsahzZa6SLR8VzvyrrGc/jypu2STK923txBAQ0YG9bA== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/plugin-transform-block-scoping" "^7.6.0" From f8024dffd80a4e79da05fb91996d56a564f5eda9 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 4 Dec 2019 09:57:57 -0500 Subject: [PATCH 600/879] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e7876d3cc..9c506f070 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Ember CLI Mirage -[![Build Status](https://travis-ci.org/samselikoff/ember-cli-mirage.svg?branch=master)](https://travis-ci.org/samselikoff/ember-cli-mirage) +[![Build Status](https://travis-ci.org/miragejs/ember-cli-mirage.svg?branch=master)](https://travis-ci.org/miragejs/ember-cli-mirage) [![npm version](https://badge.fury.io/js/ember-cli-mirage.svg)](http://badge.fury.io/js/ember-cli-mirage) [![Ember Observer Score](http://emberobserver.com/badges/ember-cli-mirage.svg)](http://emberobserver.com/addons/ember-cli-mirage) @@ -20,7 +20,7 @@ ember install ember-cli-mirage Please open an issue and add a :+1: emoji reaction. We will use the number of reactions as votes to indicate community interest, which will in turn help us prioritize feature development. -You can view the most-upvoted feature requests with [this link](https://github.com/samselikoff/ember-cli-mirage/issues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc+label%3A%22Feature+%2F+Enhancement%22). +You can view the most-upvoted feature requests with [this link](https://github.com/miragejs/ember-cli-mirage/issues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc+label%3A%22Feature+%2F+Enhancement%22). ## Support @@ -37,4 +37,4 @@ Have a look at our [Contributing guidelines](./CONTRIBUTING.md). This library is developed and maintained by [EmberMap](https://embermap.com/). We have a [Mirage tips and tricks](https://embermap.com/topics/mirage-tips-and-tricks) video series if you're looking to learn how to get the most out of Mirage. -Thanks to all our amazing [contributors](https://github.com/samselikoff/ember-cli-mirage/graphs/contributors)! +Thanks to all our amazing [contributors](https://github.com/miragejs/ember-cli-mirage/graphs/contributors)! From 33645c3be3c00ec4b9c0bcac1679b7f552ffe36a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 4 Dec 2019 15:10:59 +0000 Subject: [PATCH 601/879] build(deps): bump miragejs from 0.1.31 to 0.1.32 Bumps [miragejs](https://github.com/miragejs/miragejs) from 0.1.31 to 0.1.32. - [Release notes](https://github.com/miragejs/miragejs/releases) - [Changelog](https://github.com/miragejs/miragejs/blob/master/CHANGELOG.md) - [Commits](https://github.com/miragejs/miragejs/compare/v0.1.31...v0.1.32) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/yarn.lock b/yarn.lock index 911fbe22e..d5d84ced3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6943,10 +6943,10 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -fake-xml-http-request@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-2.0.1.tgz#e4a7f256af055d8059deb23c9d7ae721d28cf078" - integrity sha512-KzT+G4aLM1Btg25QRGxB6yGLGOVZXXzrH8I4OG3KHwsdoqFclyW3alieqh5NaYGcmbQvNOn/ldGO1rGKf7CNdA== +fake-xml-http-request@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-2.1.1.tgz#279fdac235840d7a4dff77d98ec44bce9fc690a6" + integrity sha512-Kn2WYYS6cDBS5jq/voOfSGCA0TafOYAUPbEp8mUVpD/DVV5bQIDjlq+MLLvNUokkbTpjBVlLDaM5PnX+PwZMlw== faker@^4.1.0: version "4.1.0" @@ -9914,9 +9914,9 @@ minizlib@^1.2.1: minipass "^2.9.0" miragejs@^0.1.31: - version "0.1.31" - resolved "https://registry.yarnpkg.com/miragejs/-/miragejs-0.1.31.tgz#9251081360db8b462b28714449baf8fe5ceceb9b" - integrity sha512-V7JUOSQx/IrvKAFG3H+8qig0KUG03Y9tcYUQuRdT6/7rp0E1HwQ+s8liQwCTtCpO37EhVUu33WOCUvBndmKfyw== + version "0.1.32" + resolved "https://registry.yarnpkg.com/miragejs/-/miragejs-0.1.32.tgz#077ed497e928adf2bc85d89550967cd223e4a2a7" + integrity sha512-HVA79I/Ta3H9/uQ60XcsKyeiq9vGUN0JDyaC6XZrGnSBXxj2ZEZurrdkvYNXeYd2cJELD/f3750IjB0lRkXBgA== dependencies: "@miragejs/pretender-node-polyfill" "^0.1.0" inflected "^2.0.4" @@ -9943,7 +9943,7 @@ miragejs@^0.1.31: lodash.uniq "^4.5.0" lodash.uniqby "^4.7.0" lodash.values "^4.3.0" - pretender "3.0.2" + pretender "3.1.0" mississippi@^3.0.0: version "3.0.0" @@ -11107,12 +11107,12 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -pretender@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.0.2.tgz#1e9123914c4e4bd1b553ca78a401120d300d265f" - integrity sha512-6gIDHUaJKRZv7ZgP3CsKicvxtBB3brBr2LWKvJYvEyZRicG9JV2SKokK2TIK0b4Zz9+4C79y57MZHpqUjvJqDg== +pretender@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.1.0.tgz#d8d7cc8502a9dbda82346ea399b9c63e7012f584" + integrity sha512-BxCsLXzbD7LsHBF7t8phgDa9EBWxJEYR8YqvYgrwri/YHnm9r6EiDThqHumW5FdxHlk4F10/xT2rv24C929r1Q== dependencies: - fake-xml-http-request "^2.0.0" + fake-xml-http-request "^2.1.1" route-recognizer "^0.3.3" whatwg-fetch "^3.0.0" From 1dbdb6f4531f0db1180acc436bb81144ae398c2a Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Wed, 4 Dec 2019 11:56:27 -0500 Subject: [PATCH 602/879] Update template.md --- .../app/pods/docs/getting-started/upgrade-guide/template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md b/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md index 3fe4f400e..985f1bac5 100644 --- a/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md +++ b/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md @@ -59,7 +59,7 @@ Here are the steps you'll need to take to fix this: + import faker from 'faker'; ``` -[There is a codemod](https://github.com/samselikoff/ember-cli-mirage-faker-codemod/tree/update-transform) that will do this for you, thanks to the gracious work of [Casey Watts](https://github.com/caseywatts). +[There is a codemod](https://github.com/miragejs/ember-cli-mirage-faker-codemod) that will do this for you, thanks to the gracious work of [Casey Watts](https://github.com/caseywatts). Additionally, when I originally bundled Faker, I monkey-patched it with some methods that I thought would be "useful" additions. I thought this was a good idea at the time... it wasn't. 🙈 From 2d634c7e820aa2bdd4db339d15ec207535998245 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 5 Dec 2019 07:06:42 +0000 Subject: [PATCH 603/879] build(deps-dev): bump ember-cli-htmlbars from 4.0.8 to 4.0.9 Bumps [ember-cli-htmlbars](https://github.com/ember-cli/ember-cli-htmlbars) from 4.0.8 to 4.0.9. - [Release notes](https://github.com/ember-cli/ember-cli-htmlbars/releases) - [Changelog](https://github.com/ember-cli/ember-cli-htmlbars/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-cli-htmlbars/compare/v4.0.8...v4.0.9) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index d5d84ced3..77fa2d0b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5573,9 +5573,9 @@ ember-cli-htmlbars@^3.0.0, ember-cli-htmlbars@^3.0.1: strip-bom "^3.0.0" ember-cli-htmlbars@^4.0.5: - version "4.0.8" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.0.8.tgz#e87b62e7040bd478a2d007053bdb1644dd1685b0" - integrity sha512-B6fzlqmv2E2dl8P6UIYu3bY8nZU2kKfl1VkEIgxFAINfsu9fP65kX/bKzHqGhHF8nAtWBoXZWw6tomHKfUT/Jg== + version "4.0.9" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.0.9.tgz#a4f56f2f91ee4bf3ef4d1b3ec1d653800d05251b" + integrity sha512-6WJXN/XX3ylczGMVxpPIFWjieS0MDUGPQaW0nTqo/gT91WaH+DX5/4tySDKtjM5e32oFN0OXFOk8AhePzuw3Aw== dependencies: "@ember/edition-utils" "^1.1.1" babel-plugin-htmlbars-inline-precompile "^3.0.0" From a8e67069c39c653fa573d9ed1eb332e613ddb4f7 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2019 07:19:03 +0000 Subject: [PATCH 604/879] build(deps-dev): bump ember-cli-htmlbars from 4.0.9 to 4.1.0 Bumps [ember-cli-htmlbars](https://github.com/ember-cli/ember-cli-htmlbars) from 4.0.9 to 4.1.0. - [Release notes](https://github.com/ember-cli/ember-cli-htmlbars/releases) - [Changelog](https://github.com/ember-cli/ember-cli-htmlbars/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-cli-htmlbars/compare/v4.0.9...v4.1.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/yarn.lock b/yarn.lock index 77fa2d0b6..b853bc0ed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5573,9 +5573,9 @@ ember-cli-htmlbars@^3.0.0, ember-cli-htmlbars@^3.0.1: strip-bom "^3.0.0" ember-cli-htmlbars@^4.0.5: - version "4.0.9" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.0.9.tgz#a4f56f2f91ee4bf3ef4d1b3ec1d653800d05251b" - integrity sha512-6WJXN/XX3ylczGMVxpPIFWjieS0MDUGPQaW0nTqo/gT91WaH+DX5/4tySDKtjM5e32oFN0OXFOk8AhePzuw3Aw== + version "4.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.1.0.tgz#2abb96d20d22d024f384df3691ad9d667ccabbe7" + integrity sha512-ZxVtixNPvtdCyYd9AdgCfSVO/WWLHdvK0WpTzbZ+/iTbMH0unNypJ8o2GY6DbArEB/PE6bV/Ta3khYURyuH47g== dependencies: "@ember/edition-utils" "^1.1.1" babel-plugin-htmlbars-inline-precompile "^3.0.0" @@ -5584,11 +5584,10 @@ ember-cli-htmlbars@^4.0.5: broccoli-plugin "^3.0.0" common-tags "^1.8.0" ember-cli-babel-plugin-helpers "^1.1.0" - fs-copy-file-sync "^1.1.1" + fs-tree-diff "^2.0.1" hash-for-dep "^1.5.1" heimdalljs-logger "^0.1.10" json-stable-stringify "^1.0.1" - mkdirp "^0.5.1" semver "^6.3.0" strip-bom "^4.0.0" walk-sync "^2.0.2" @@ -7323,11 +7322,6 @@ from2@^2.1.0, from2@^2.1.1: inherits "^2.0.1" readable-stream "^2.0.0" -fs-copy-file-sync@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/fs-copy-file-sync/-/fs-copy-file-sync-1.1.1.tgz#11bf32c096c10d126e5f6b36d06eece776062918" - integrity sha512-2QY5eeqVv4m2PfyMiEuy9adxNP+ajf+8AR05cEi+OAzPcOj90hvFImeZhTmKLBgSd9EvG33jsD7ZRxsx9dThkQ== - fs-exists-sync@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" From d4331ce14797f010605ddf260f4725daa0bc0489 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 12 Dec 2019 07:12:00 +0000 Subject: [PATCH 605/879] build(deps-dev): bump ember-try from 1.3.0 to 1.4.0 Bumps [ember-try](https://github.com/ember-cli/ember-try) from 1.3.0 to 1.4.0. - [Release notes](https://github.com/ember-cli/ember-try/releases) - [Changelog](https://github.com/ember-cli/ember-try/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-try/compare/v1.3.0...v1.4.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index b853bc0ed..c1397a891 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6291,9 +6291,9 @@ ember-try-config@^3.0.0: semver "^5.5.0" ember-try@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ember-try/-/ember-try-1.3.0.tgz#394bdcd726e5acd2ebf8422c7bcf9ecf0aa2c2ac" - integrity sha512-XtVhBHNQVdVu5LouyNLhGeKx0f88lz9VtrSf1NYFulVlOHIQEeZCEIs3pTifGhtZJ0B7POPKMdPpNso77Z95uQ== + version "1.4.0" + resolved "https://registry.yarnpkg.com/ember-try/-/ember-try-1.4.0.tgz#be15965bd1727c27a65a78c4c8392f03763cc565" + integrity sha512-o0SoCH4K8umCf8etphla8FDygKfQGkwY+w47wEuYFVKaESrOZaK63ObnAK7DTKkjJU74Fss2abf+r+pAWpX43g== dependencies: chalk "^2.4.2" cli-table3 "^0.5.1" From 5a94d3c582a4c0dc6e0b5877107215e90017709b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 12 Dec 2019 07:12:28 +0000 Subject: [PATCH 606/879] build(deps-dev): bump ember-cli-htmlbars from 4.1.0 to 4.2.0 Bumps [ember-cli-htmlbars](https://github.com/ember-cli/ember-cli-htmlbars) from 4.1.0 to 4.2.0. - [Release notes](https://github.com/ember-cli/ember-cli-htmlbars/releases) - [Changelog](https://github.com/ember-cli/ember-cli-htmlbars/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-cli-htmlbars/compare/v4.1.0...v4.2.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index c1397a891..b28199abd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5573,9 +5573,9 @@ ember-cli-htmlbars@^3.0.0, ember-cli-htmlbars@^3.0.1: strip-bom "^3.0.0" ember-cli-htmlbars@^4.0.5: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.1.0.tgz#2abb96d20d22d024f384df3691ad9d667ccabbe7" - integrity sha512-ZxVtixNPvtdCyYd9AdgCfSVO/WWLHdvK0WpTzbZ+/iTbMH0unNypJ8o2GY6DbArEB/PE6bV/Ta3khYURyuH47g== + version "4.2.0" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.2.0.tgz#a3694ab31f6d571c45786a3041b9c76e4eb30989" + integrity sha512-YymJLg/rRiclK5jxbTFpaRNlbS+f3SY6SplnMExjcrcbSjMRsBuams50+mppENEu7iKfd6PBqH3FHVbYsukHSQ== dependencies: "@ember/edition-utils" "^1.1.1" babel-plugin-htmlbars-inline-precompile "^3.0.0" From b958d56141456bfac6424f896ea703eb9bf42452 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2019 07:03:26 +0000 Subject: [PATCH 607/879] build(deps-dev): bump eslint-plugin-ember from 7.7.1 to 7.7.2 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 7.7.1 to 7.7.2. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v7.7.1...v7.7.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 50 +++++++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/yarn.lock b/yarn.lock index b28199abd..6ba6ec2e8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5072,6 +5072,14 @@ domutils@^1.5.1, domutils@^1.7.0: dom-serializer "0" domelementtype "1" +dot-case@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.2.tgz#6758d86d3e7b69adc0fcfad23a845676c329f7d9" + integrity sha512-z3vMZEW2o3btKlM9I6FQF0pIWTzBuW+udrAaJr+A6JA3+p62ADZjeFthKxqxKHZlUxQmkKeEWvaKLJdwpc5u6g== + dependencies: + no-case "^3.0.2" + tslib "^1.10.0" + dot-prop@^4.1.0, dot-prop@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" @@ -6529,13 +6537,13 @@ esdoc@pzuraq/esdoc#015a342: taffydb "2.7.2" eslint-plugin-ember@^7.0.0: - version "7.7.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.7.1.tgz#41398c9a32304c21547fb969c689cd3300718f9d" - integrity sha512-9nWU7QAdfzKPHlZ1C8yjjyRkvsIv4Lea3saD2H7NnIep8Z4YN9+AKfycejniYjeLvxYMsSqI+JFXPUcbpgZhhw== + version "7.7.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.7.2.tgz#ba4afe59e7b2efdfbb85bc16484c95aaa45b8392" + integrity sha512-Ua7+xePz8m0BrqSHfYibkRXWQMMb5RBsH9ohZy2a7ri+s6+UQre9x3BxPpawCLZMzQzIG4vQh93YiVGCSv3XYA== dependencies: "@ember-data/rfc395-data" "^0.0.4" ember-rfc176-data "^0.3.12" - snake-case "^2.1.0" + snake-case "^3.0.2" eslint-plugin-es@^2.0.0: version "2.0.0" @@ -9499,10 +9507,12 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" -lower-case@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" - integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= +lower-case@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.1.tgz#39eeb36e396115cc05e29422eaea9e692c9408c7" + integrity sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ== + dependencies: + tslib "^1.10.0" lowercase-keys@1.0.0: version "1.0.0" @@ -10110,12 +10120,13 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -no-case@^2.2.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" - integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== +no-case@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.2.tgz#2b03928510318591854c0423e504d13b21234263" + integrity sha512-Yber3mEOA3T9+as7Z70TJUQCUPRmmq6s8NmsZX5aSB1qk+Mt+3a5JVPpnAnONUShLTkMDF4PJY3h0GKlXdRTNA== dependencies: - lower-case "^1.1.1" + lower-case "^2.0.1" + tslib "^1.10.0" node-fetch@^2.6.0: version "2.6.0" @@ -12204,12 +12215,13 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" -snake-case@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f" - integrity sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8= +snake-case@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.2.tgz#2cc0eacf4edaab998f21af579b5a72b0766f91dd" + integrity sha512-1fRJdasXJTcsrGnUkDsnKNjHoP9NGclbIkYyY6Vv0vBVgz32rqhPFPg/Y0yIP4hwOd41Dh8rocCRHjNIuK4EZg== dependencies: - no-case "^2.2.0" + dot-case "^3.0.2" + tslib "^1.10.0" snapdragon-node@^2.0.1: version "2.1.1" @@ -13196,7 +13208,7 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -tslib@^1.9.0: +tslib@^1.10.0, tslib@^1.9.0: version "1.10.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== From 80fa6bfaa6096a873ff256a597783bafcc46dcca Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2019 07:03:59 +0000 Subject: [PATCH 608/879] build(deps): bump ember-cli-babel from 7.13.0 to 7.13.2 Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 7.13.0 to 7.13.2. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v7.13.0...v7.13.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 6ba6ec2e8..f72498cf4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5361,9 +5361,9 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, semver "^5.5.0" ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.13.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: - version "7.13.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.13.0.tgz#3f2c2ba7a44d7948ec927d41cf072673330f62cd" - integrity sha512-VjagtumwQP+3jsjLR64gpca5iq2o0PS1MT0PdC90COtAYqpOqNM9axYEYBamNLIuv+3vJpAoFKu8EMBC1ZlWGQ== + version "7.13.2" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.13.2.tgz#6b6f4d508cc3bb300c5711d3d02c59ba80f0f686" + integrity sha512-VH2tMXaRFkbQEyVJnxUtAyta5bAKjtcLwJ4lStW/iRk/NIlNFNJh1uOd7uL9H9Vm0f4/xR7Mc0Q7ND9ezKOo+A== dependencies: "@babel/core" "^7.7.0" "@babel/plugin-proposal-class-properties" "^7.7.0" From e70da3fa02d907a7cc203d9b8c16858c0451641b Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 16 Dec 2019 10:29:32 -0500 Subject: [PATCH 609/879] Fix relationship links (#1854) Closes 1840 --- .../docs/data-layer/relationships/template.md | 51 +++++++++---------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/tests/dummy/app/pods/docs/data-layer/relationships/template.md b/tests/dummy/app/pods/docs/data-layer/relationships/template.md index c71d6e06f..fe3d6c99d 100644 --- a/tests/dummy/app/pods/docs/data-layer/relationships/template.md +++ b/tests/dummy/app/pods/docs/data-layer/relationships/template.md @@ -10,7 +10,7 @@ To define a to-one relationship, import the `belongsTo` helper and define a new ```js // mirage/models/blog-post.js -import { Model, belongsTo } from 'ember-cli-mirage'; +import { Model, belongsTo } from "ember-cli-mirage"; export default Model.extend({ author: belongsTo() @@ -24,15 +24,15 @@ The `belongsTo` helper adds several new properties and methods to your models. In this case, our `blog-post` model would now have an `authorId` property, as well as some methods for working with the associated `author` model: ```js -blogPost.authorId; // 1 -blogPost.authorId = 2; // updates the relationship -blogPost.author; // Author instance +blogPost.authorId; // 1 +blogPost.authorId = 2; // updates the relationship +blogPost.author; // Author instance blogPost.author = anotherAuthor; -blogPost.newAuthor(attrs); // new unsaved author -blogPost.createAuthor(attrs); // new saved author (updates blogPost.authorId in memory only) +blogPost.newAuthor(attrs); // new unsaved author +blogPost.createAuthor(attrs); // new saved author (updates blogPost.authorId in memory only) ``` -Note that when a child calls `child.createParent`, the new parent is immediately saved to the `db`, but the child's foreign key is updated *on this instance only*, and is not immediately persisted to the database. +Note that when a child calls `child.createParent`, the new parent is immediately saved to the `db`, but the child's foreign key is updated _on this instance only_, and is not immediately persisted to the database. In other words, `blogPost.createAuthor` will create a new `author` record, insert it into the `db`, and update the `blogPost.authorId` in memory, but if you were to fetch the `blogPost` from the `db` again, the relationship would not be persisted. @@ -44,7 +44,7 @@ To define a to-many relationship, use the `hasMany` helper: ```js // mirage/models/blog-post.js -import { Model, hasMany } from 'ember-cli-mirage'; +import { Model, hasMany } from "ember-cli-mirage"; export default Model.extend({ comments: hasMany() @@ -54,12 +54,12 @@ export default Model.extend({ This helper adds a `commentIds` property to the `blogPost` model, as well as some methods for working with the associated `comments` collection: ```js -blogPost.commentIds; // [1, 2, 3] -blogPost.commentIds = [2, 3]; // updates the relationship -blogPost.comments; // array of related comments +blogPost.commentIds; // [1, 2, 3] +blogPost.commentIds = [2, 3]; // updates the relationship +blogPost.comments; // array of related comments blogPost.comments = [comment1, comment2]; // updates the relationship -blogPost.newComment(attrs); // new unsaved comment -blogPost.createComment(attrs); // new saved comment (comment.blogPostId is set) +blogPost.newComment(attrs); // new unsaved comment +blogPost.createComment(attrs); // new saved comment (comment.blogPostId is set) ``` ## Association options @@ -72,13 +72,11 @@ For example, ```js // mirage/models/blog-post.js -import { Model, belongsTo, hasMany } from 'ember-cli-mirage'; +import { Model, belongsTo, hasMany } from "ember-cli-mirage"; export default Model.extend({ - - author: belongsTo('user'), - comments: hasMany('annotation') - + author: belongsTo("user"), + comments: hasMany("annotation") }); ``` @@ -116,8 +114,8 @@ export default Model.extend({ // blog-post.js export default Model.extend({ - author: belongsTo('user'), - reviewer: belongsTo('user') + author: belongsTo("user"), + reviewer: belongsTo("user") }); ``` @@ -131,8 +129,8 @@ export default Model.extend({ // blog-post.js export default Model.extend({ - author: belongsTo('user', { inverse: 'blogPosts' }), - reviewer: belongsTo('user', { inverse: null }) + author: belongsTo("user", { inverse: "blogPosts" }), + reviewer: belongsTo("user", { inverse: null }) }); ``` @@ -168,14 +166,14 @@ Polymorphic associations have slightly different method signatures for their for ```js let comment = schema.comments.create({ text: "foo" }); -comment.buildCommentable('post', { title: 'Lorem Ipsum' }); -comment.createCommentable('post', { title: 'Lorem Ipsum' }); +comment.buildCommentable("post", { title: "Lorem Ipsum" }); +comment.createCommentable("post", { title: "Lorem Ipsum" }); // getter comment.commentableId; // { id: 1, type: 'blog-post' } // setter -comment.commentableId = { id: 2, type: 'picture' }; +comment.commentableId = { id: 2, type: "picture" }; ``` Has-many asssociations can also be polymorphic: @@ -206,10 +204,9 @@ user.thingIds; // [ { id: 1, type: 'car' }, { id: 3, type: 'watch' }, ... ] user.thingIds = [ { id: 2, type: 'watch' }, ... ]; ``` - --- -Be sure to check out the {{docs-link 'Schema' 'docs.api.item' 'modules/lib/orm/schema~Schema'}}, {{docs-link 'Model' 'docs.api.item' 'modules/lib/orm/model~Model'}} and {{docs-link 'Collection' 'docs.api.item' 'modules/lib/orm/collection~Collection'}} API docs to learn about all the available ORM methods. +Be sure to check out the {{docs-link 'Schema' 'docs.api.item' 'modules/orm/schema~Schema'}}, {{docs-link 'Model' 'docs.api.item' 'modules/orm/model~Model'}} and {{docs-link 'Collection' 'docs.api.item' 'modules/orm/collection~Collection'}} API docs to learn about all the available ORM methods. We'll also cover Serializers in these guides, where you'll learn how to customize the serialized forms of your models and collections to match your production API. From 22b6c73debea97e1ef4bc63cc7989513325abf6a Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 16 Dec 2019 10:31:37 -0500 Subject: [PATCH 610/879] v1.1.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 18f8c09f3..e385a51c7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "1.1.4", + "version": "1.1.5", "description": "A client-side server to help you build, test and demo your Ember app", "keywords": [ "ember-addon", From 078b7b816a01e274abc18ef5e343a44fb4b62bad Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 16 Dec 2019 12:13:21 -0500 Subject: [PATCH 611/879] Replace samselikoff/ember-cli-mirage with miragejs/ember-cli-mirage --- .travis.yml | 7 +- CHANGELOG.md | 2 +- CONTRIBUTING.md | 3 +- ISSUE_TEMPLATE.md | 2 +- config/deploy.js | 16 +- package.json | 6 +- tests/dummy/app/adapters/post.js | 160 ++++++------- .../getting-started/installation/template.md | 3 +- .../getting-started/upgrade-guide/template.md | 215 ++++++++---------- 9 files changed, 203 insertions(+), 211 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8b24ccf27..f65e38707 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,7 +24,7 @@ install: notifications: email: false - + # Identifies `a.b.c-xxx.n` tags as pre-releases, and `a.b.c` as stable releases before_deploy: | function npm_dist_tag() { @@ -60,13 +60,12 @@ jobs: - env: EMBER_TRY_SCENARIO=ember-canary - env: EMBER_TRY_SCENARIO=ember-default - env: EMBER_TRY_SCENARIO=ember-default-with-jquery - + - stage: deploy if: (branch = master OR tag IS present) AND type = push env: NAME=deploy script: node_modules/.bin/ember deploy production - - stage: npm release install: skip script: skip @@ -78,7 +77,7 @@ jobs: secure: O6cP0nTiCbA+MuD6hRKdyyd6DWTFR/dc9klB10zXTnrwajjzLmenvvshPUv+F6lHCpb2SfrWW6cpFjZ61BPwKaaalF9u8encNkGlDYGtO77sWJu6LuJFeWPZnAC9rdAw4hPjz+gqTL+leeDMHzjB32VRqy2cpwFzet3e+W2eUuk= on: tags: true - repo: samselikoff/ember-cli-mirage + repo: miragejs/ember-cli-mirage allow_failures: - env: EMBER_TRY_SCENARIO=ember-beta diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ee0c89e2..0ee0feb95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,3 @@ # Ember CLI Mirage Change log -Releases (along with upgrade instructions) are documented on the Github [Releases](https://github.com/samselikoff/ember-cli-mirage/releases) page. +Releases (along with upgrade instructions) are documented on the Github [Releases](https://github.com/miragejs/ember-cli-mirage/releases) page. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fc5adf027..f53c8ad47 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,7 +15,7 @@ If you're just making a change to a single page in the docs, look for the "Edit To make more substantial changes, you'll want to be able to develop the docs site locally. To run an AddonDocs site, ```shell -git clone git@github.com:samselikoff/ember-cli-mirage.git +git clone git@github.com:miragejs/ember-cli-mirage.git cd ember-cli-mirage yarn install # (or npm install) ember s @@ -23,7 +23,6 @@ ember s You should be able to visit `localhost:4200` and see the docs site running locally. Now checkout a new branch, make your changes, and submit a PR! - ## Mirage development To help out with Mirage development, first pull down the project locally and verify that all tests on `master` are passing. diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index b27bd17c7..9af044d40 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -6,7 +6,7 @@ If this is a feature request, add a 👠reaction to it. We use these to help us If possible, please use the Mirage Boilerplate to demonstrate your issue or bug: -1. Visit the [Ember CLI Mirage Boilerplate](https://github.com/samselikoff/ember-cli-mirage-boilerplate) repo +1. Visit the [Ember CLI Mirage Boilerplate](https://github.com/miragejs/ember-cli-mirage-boilerplate) repo 2. Click Fork diff --git a/config/deploy.js b/config/deploy.js index 941da9562..134a17174 100644 --- a/config/deploy.js +++ b/config/deploy.js @@ -1,26 +1,26 @@ /* eslint-env node */ -'use strict'; +"use strict"; module.exports = function(deployTarget) { let ENV = { build: {}, git: { - repo: 'git@github.com:samselikoff/ember-cli-mirage.git' + repo: "git@github.com:miragejs/ember-cli-mirage.git" } }; - if (deployTarget === 'development') { - ENV.build.environment = 'development'; + if (deployTarget === "development") { + ENV.build.environment = "development"; // configure other plugins for development deploy target here } - if (deployTarget === 'staging') { - ENV.build.environment = 'production'; + if (deployTarget === "staging") { + ENV.build.environment = "production"; // configure other plugins for staging deploy target here } - if (deployTarget === 'production') { - ENV.build.environment = 'production'; + if (deployTarget === "production") { + ENV.build.environment = "production"; // configure other plugins for production deploy target here } diff --git a/package.json b/package.json index e385a51c7..84c6a9529 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ ], "repository": { "type": "git", - "url": "https://github.com/samselikoff/ember-cli-mirage.git" + "url": "https://github.com/miragejs/ember-cli-mirage.git" }, "license": "MIT", "author": "Sam Selikoff", @@ -19,9 +19,9 @@ "doc": "doc", "test": "tests" }, - "homepage": "https://github.com/samselikoff/ember-cli-mirage", + "homepage": "https://github.com/miragejs/ember-cli-mirage", "bugs": { - "url": "https://github.com/samselikoff/ember-cli-mirage/issues" + "url": "https://github.com/miragejs/ember-cli-mirage/issues" }, "scripts": { "build": "ember build", diff --git a/tests/dummy/app/adapters/post.js b/tests/dummy/app/adapters/post.js index 12009ccf0..f665e7403 100644 --- a/tests/dummy/app/adapters/post.js +++ b/tests/dummy/app/adapters/post.js @@ -1,39 +1,41 @@ -import $ from 'jquery'; -import { Promise } from 'rsvp'; -import DS from 'ember-data'; +import $ from "jquery"; +import { Promise } from "rsvp"; +import DS from "ember-data"; -const BASE_URL = 'https://api.github.com/repos/samselikoff/ember-cli-mirage'; +const BASE_URL = "https://api.github.com/repos/miragejs/ember-cli-mirage"; export default DS.JSONAPIAdapter.extend({ - findRecord(store, type, id, snapshot) { let url = `${BASE_URL}/issues/${id}`; return new Promise((resolve, reject) => { - $.getJSON(url).then(json => { - let jsonApiDocument = { - data: { - id, - type: 'posts', - attributes: { - title: json.title, - body: json.body, - 'issue-url': json.html_url - }, - relationships: { - comments: { - links: { - related: json.comments_url + $.getJSON(url).then( + json => { + let jsonApiDocument = { + data: { + id, + type: "posts", + attributes: { + title: json.title, + body: json.body, + "issue-url": json.html_url + }, + relationships: { + comments: { + links: { + related: json.comments_url + } } } } - } - }; + }; - resolve(jsonApiDocument); - }, jqXHR => { - reject(jqXHR); - }); + resolve(jsonApiDocument); + }, + jqXHR => { + reject(jqXHR); + } + ); }); }, @@ -41,25 +43,28 @@ export default DS.JSONAPIAdapter.extend({ let url = `${BASE_URL}/issues?state=closed&labels=Blog%20post`; return new Promise((resolve, reject) => { - $.getJSON(url).then(json => { - this.hasLoadedAllPosts = true; + $.getJSON(url).then( + json => { + this.hasLoadedAllPosts = true; - let jsonApiDocument = { - data: json.map(obj => ({ - id: obj.number, - type: 'posts', - attributes: { - title: obj.title, - body: obj.body, - 'issue-url': obj.html_url - } - })) - }; + let jsonApiDocument = { + data: json.map(obj => ({ + id: obj.number, + type: "posts", + attributes: { + title: obj.title, + body: obj.body, + "issue-url": obj.html_url + } + })) + }; - resolve(jsonApiDocument); - }, jqXHR => { - reject(jqXHR); - }); + resolve(jsonApiDocument); + }, + jqXHR => { + reject(jqXHR); + } + ); }); }, @@ -69,46 +74,49 @@ export default DS.JSONAPIAdapter.extend({ findHasMany(store, snapshot, url, relationship) { return new Promise((resolve, reject) => { - $.getJSON(url).then(json => { - let jsonApiDocument = { data: [], included: [] }; - let includedUserHash = {}; + $.getJSON(url).then( + json => { + let jsonApiDocument = { data: [], included: [] }; + let includedUserHash = {}; - json.forEach(obj => { - jsonApiDocument.data.push({ - id: obj.id, - type: 'comments', - attributes: { - body: obj.body, - permalink: obj.html_url, - 'created-at': obj.created_at - }, - relationships: { - user: { - data: { type: 'users', id: obj.user.id } + json.forEach(obj => { + jsonApiDocument.data.push({ + id: obj.id, + type: "comments", + attributes: { + body: obj.body, + permalink: obj.html_url, + "created-at": obj.created_at + }, + relationships: { + user: { + data: { type: "users", id: obj.user.id } + } } - } - }); + }); - includedUserHash[obj.user.id] = obj.user; - }); + includedUserHash[obj.user.id] = obj.user; + }); - Object.keys(includedUserHash).forEach(key => { - let user = includedUserHash[key]; - jsonApiDocument.included.push({ - type: 'users', - id: user.id, - attributes: { - 'avatar-url': user.avatar_url, - 'profile-url': user.html_url, - username: user.login - } + Object.keys(includedUserHash).forEach(key => { + let user = includedUserHash[key]; + jsonApiDocument.included.push({ + type: "users", + id: user.id, + attributes: { + "avatar-url": user.avatar_url, + "profile-url": user.html_url, + username: user.login + } + }); }); - }); - resolve(jsonApiDocument); - }, jqXHR => { - reject(jqXHR); - }); + resolve(jsonApiDocument); + }, + jqXHR => { + reject(jqXHR); + } + ); }); } }); diff --git a/tests/dummy/app/pods/docs/getting-started/installation/template.md b/tests/dummy/app/pods/docs/getting-started/installation/template.md index 25b713839..6d016264b 100644 --- a/tests/dummy/app/pods/docs/getting-started/installation/template.md +++ b/tests/dummy/app/pods/docs/getting-started/installation/template.md @@ -25,11 +25,12 @@ There's an Ember CLI bug that exposes itself when using Prettier + Mirage. A lon You might expect Mirage to serve network requests made by your FastBoot app, but because Mirage runs only in the browser, it currently disables itself if your app is being served by FastBoot. -[FastBoot support](https://github.com/samselikoff/ember-cli-mirage/issues/1411) is a highly requested feature we are working on. In the meantime, you'll need to develop your FastBoot pages against a local server. +[FastBoot support](https://github.com/miragejs/ember-cli-mirage/issues/1411) is a highly requested feature we are working on. In the meantime, you'll need to develop your FastBoot pages against a local server. You can always bypass FastBoot page generation locally by running ```sh FASTBOOT_DISABLED=true ember serve ``` + Mirage will then run in the browser as expected, and you can develop your client app as normal. diff --git a/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md b/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md index 985f1bac5..b6ba1a7f8 100644 --- a/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md +++ b/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md @@ -10,12 +10,9 @@ npm install -D ember-cli-mirage@X.X.X yarn add -D ember-cli-mirage@X.X.X ``` - - ## Full Changelog -You can view all of Mirage's release notes on [our Releases page](https://github.com/samselikoff/ember-cli-mirage/releases). - +You can view all of Mirage's release notes on [our Releases page](https://github.com/miragejs/ember-cli-mirage/releases). ## 1.0 Upgrade guide @@ -39,31 +36,31 @@ Here are the steps you'll need to take to fix this: 1. Install Ember Auto Import (if it's not already installed) - ```sh - ember install ember-auto-import - ``` +```sh +ember install ember-auto-import +``` 2. Install Faker.js directly from npm: - ```sh - yarn add -D faker +```sh +yarn add -D faker - # or npm install --save-dev faker - ``` +# or npm install --save-dev faker +``` 3. Change all imports of `faker` from the `ember-cli-packge` to import directly from `faker`: - ```diff - - import { Factory, faker } from 'ember-cli-mirage'; - + import { Factory } from 'ember-cli-mirage'; - + import faker from 'faker'; - ``` +```diff +- import { Factory, faker } from 'ember-cli-mirage'; ++ import { Factory } from 'ember-cli-mirage'; ++ import faker from 'faker'; +``` [There is a codemod](https://github.com/miragejs/ember-cli-mirage-faker-codemod) that will do this for you, thanks to the gracious work of [Casey Watts](https://github.com/caseywatts). Additionally, when I originally bundled Faker, I monkey-patched it with some methods that I thought would be "useful" additions. I thought this was a good idea at the time... it wasn't. 🙈 -You can look at [the module from v0.4.15](https://github.com/samselikoff/ember-cli-mirage/blob/v0.4.15/addon/faker.js) to see that we added the `faker.list.random`, `faker.list.cycle` and `faker.random.number.range` methods, so if you use these methods too, you'll need to refactor them. +You can look at [the module from v0.4.15](https://github.com/miragejs/ember-cli-mirage/blob/v0.4.15/addon/faker.js) to see that we added the `faker.list.random`, `faker.list.cycle` and `faker.random.number.range` methods, so if you use these methods too, you'll need to refactor them. Fortunately, two of them have been added to recent versions of Faker, and one can be replaced with some simple JS: @@ -83,7 +80,7 @@ For `faker.list.cycle`, use the remainder (modulo) operator: - return faker.list.cycle([ 'United States of America', 'Canada', 'Mexico' ]); + let countries = [ 'United States of America', 'Canada', 'Mexico' ]; -+ ++ + return countries[i % countries.length]; } ``` @@ -105,10 +102,10 @@ Please use the new named import for the setupMirage test helper. The old one sti ```js // Before -import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; +import setupMirage from "ember-cli-mirage/test-support/setup-mirage"; // After -import { setupMirage } from 'ember-cli-mirage/test-support'; +import { setupMirage } from "ember-cli-mirage/test-support"; ``` ### 3. Remove deprecated forms of `create`, `createList` and `normalizedRequestAttrs` @@ -119,19 +116,19 @@ This behavior was discovered during a refactor, and the non-singularized version - `server.create` and `server.createList` were coded to take a singularized model name, e.g. `server.create('user')`. It just so happens that `server.create('users')` also works. That pluralized version is now removed from Mirage. - If you're running the latest 0.x version you should see a deprecation message letting you know where to change it. Otherwise, it should be a pretty mechanic change from things like `server.create('users')` to `server.create('user')`. + If you're running the latest 0.x version you should see a deprecation message letting you know where to change it. Otherwise, it should be a pretty mechanic change from things like `server.create('users')` to `server.create('user')`. - Note this also applies to `server.createList` – the correct form is `server.createList('user', 3)`, and the pluralized form `server.createList('users', 3)` is now unsupported. + Note this also applies to `server.createList` – the correct form is `server.createList('user', 3)`, and the pluralized form `server.createList('users', 3)` is now unsupported. - `this.normalizedRequestAttrs` in a route handler optionally takes a modelName as an argument. This is if your URLs are non-standard and Mirage cannot guess the modelName from the URL path. - In this case, you can call `this.normalizedRequestAttrs('blog-post')` to tell Mirage to expect the payload to be for a `blog-post` model. + In this case, you can call `this.normalizedRequestAttrs('blog-post')` to tell Mirage to expect the payload to be for a `blog-post` model. - This API was intended to be used with dasherized names, because that's how compound model names are specified throughout Mirage when they are represented as strings. + This API was intended to be used with dasherized names, because that's how compound model names are specified throughout Mirage when they are represented as strings. - It just so happened that `this.normalizedRequestAttrs('blogPost')` also worked, by chance, until a refactor. So, that behavior was kept but now is being removed. + It just so happened that `this.normalizedRequestAttrs('blogPost')` also worked, by chance, until a refactor. So, that behavior was kept but now is being removed. - The correct usage is `this.normalizedRequestAttrs('blog-post')`. Using the camelized version of the model name is no longer supported. + The correct usage is `this.normalizedRequestAttrs('blog-post')`. Using the camelized version of the model name is no longer supported. If either of these changes cause a ton of refactoring pain, we can try to marshal some resources to help write a codemod. Please open an issue if that's the case! @@ -147,7 +144,7 @@ There was a gap in the default `normalize` method for a long time, in that it di let payload = { contact: { id: 1, - name: 'Link', + name: "Link", address: 1 } }; @@ -177,7 +174,6 @@ We added this feature a while ago, and it's controlled with the `normalizeIds` p We're now making `true` the default, which should be the behavior everyone desires (assuming they're using shorthands). This is technically a breaking change, though it's unlikely to affect most people. - ## 0.3.x → 0.4 Upgrade guide There is one primary change in 0.4 that could break your 0.3 app. @@ -239,7 +235,7 @@ This behavior is configurable via the `alwaysIncludeLinkageData` key on your JSO ```js // mirage/serializers/application.js -import { JSONAPISerializer } from 'ember-cli-mirage'; +import { JSONAPISerializer } from "ember-cli-mirage"; export default JSONAPISerializer.extend({ alwaysIncludeLinkageData: true @@ -248,7 +244,6 @@ export default JSONAPISerializer.extend({ If you do this, I would recommend looking closely at how your real server behaves when serializing resources' relationships and whether it uses resource `links` or resource linkage `data`, and to update your Mirage code accordingly to give you the most faithful representation of your server. - ## 0.2.x → 0.3 Upgrade guide The main change from 0.2.x to 0.3.x is that relationships are now one-way. This better matches the semantics of both Ember Data and common HTTP transfer protocols like JSON:API. @@ -257,19 +252,15 @@ In 0.2, the following model definitions ```js // mirage/models/author.js -import { Model } from 'ember-cli-mirage'; - -export default Model.extend({ +import { Model } from "ember-cli-mirage"; -}); +export default Model.extend({}); // mirage/models/post.js -import { Model, belongsTo } from 'ember-cli-mirage'; +import { Model, belongsTo } from "ember-cli-mirage"; export default Model.extend({ - author: belongsTo() - }); ``` @@ -277,21 +268,17 @@ would have generated a "schema" with a one-to-many relationship between authors ```js // mirage/models/author.js -import { Model, hasMany } from 'ember-cli-mirage'; +import { Model, hasMany } from "ember-cli-mirage"; export default Model.extend({ - posts: hasMany() - }); // mirage/models/post.js -import { Model, belongsTo } from 'ember-cli-mirage'; +import { Model, belongsTo } from "ember-cli-mirage"; export default Model.extend({ - author: belongsTo() - }); ``` @@ -307,112 +294,110 @@ For more information on the motivation behind change, please read the [0-3 beta If you're upgrading your Mirage server from v0.1.x to v0.2.x, here's what you need to know: - - **The default Mirage directory has changed.** The default Mirage directory has moved from `/app/mirage` to `/mirage`. When you install 0.2.0, the default blueprint will add the `/mirage` directory to your project. You can delete it and move your current Mirage files to the new location with something like - - ```sh - rm -rf mirage - mv app/mirage mirage - ``` +- **The default Mirage directory has changed.** The default Mirage directory has moved from `/app/mirage` to `/mirage`. When you install 0.2.0, the default blueprint will add the `/mirage` directory to your project. You can delete it and move your current Mirage files to the new location with something like - from the root of your project. Mirage's directory is also [customizable](../configuration/#directory) (Although you should move it from the `/app` directory or else it will not be removed from the build in production mode). + ```sh + rm -rf mirage + mv app/mirage mirage + ``` - - **All multiword filenames are dasherized.** In Mirage 0.1.x, database collection names were taken from filenames. The idea was, if your API returned snake_case collection keys (e.g. `blog_posts: []`), just name your file `fixtures/blog_posts.js`. This approach turned out to be insufficiently flexib-- what am I saying, it was just a bad idea :P. + from the root of your project. Mirage's directory is also [customizable](../configuration/#directory) (Although you should move it from the `/app` directory or else it will not be removed from the build in production mode). - In Mirage 0.2.x, we follow Ember CLI's conventions of dasherized filenames. So, you'll just need to go through and change +- **All multiword filenames are dasherized.** In Mirage 0.1.x, database collection names were taken from filenames. The idea was, if your API returned snake_case collection keys (e.g. `blog_posts: []`), just name your file `fixtures/blog_posts.js`. This approach turned out to be insufficiently flexib-- what am I saying, it was just a bad idea :P. - ```sh - /mirage/factories/blog_post.js - /mirage/fixtures/blog_post.js - # etc. - ``` + In Mirage 0.2.x, we follow Ember CLI's conventions of dasherized filenames. So, you'll just need to go through and change - to + ```sh + /mirage/factories/blog_post.js + /mirage/fixtures/blog_post.js + # etc. + ``` - ```sh - /mirage/factories/blog-post.js - /mirage/fixtures/blog-post.js - ``` + to - You will then use the [new Serializer layer](../serializers) to do things like format keys in your json payloads. + ```sh + /mirage/factories/blog-post.js + /mirage/fixtures/blog-post.js + ``` - - **All JavaScript properties are camelCased.** Similar to the previous change, factory properties and database collection names followed the format of your API in Mirage 0.1.x. If you were faking an ActiveModelSerializer backend, multiword keys used snake_case throughout your Mirage code. So, your database table might be `db.blog_posts`, and your factory keys might be `first_name() {..}`. Looks pretty cool right? + You will then use the [new Serializer layer](../serializers) to do things like format keys in your json payloads. - Wrong. We're JavaScript developers here, people. It's time to start using camelCase. (Also, the idea of tying these keys to your serialization format was bad, as it left us without any conventions. We need to stick to a single format, so the ORM knows how to find foreign keys.) +- **All JavaScript properties are camelCased.** Similar to the previous change, factory properties and database collection names followed the format of your API in Mirage 0.1.x. If you were faking an ActiveModelSerializer backend, multiword keys used snake_case throughout your Mirage code. So, your database table might be `db.blog_posts`, and your factory keys might be `first_name() {..}`. Looks pretty cool right? - You'll need to update your route handlers, which may look like this: + Wrong. We're JavaScript developers here, people. It's time to start using camelCase. (Also, the idea of tying these keys to your serialization format was bad, as it left us without any conventions. We need to stick to a single format, so the ORM knows how to find foreign keys.) - ```js - let posts = db.blog_posts.filter(p => p.author_id === 1); - ``` + You'll need to update your route handlers, which may look like this: - to + ```js + let posts = db.blog_posts.filter(p => p.author_id === 1); + ``` - ```js - let posts = db.blogPosts.filter(p => p.authorId === 1); - ``` + to - Note that everything is camelCased, including foreign keys. + ```js + let posts = db.blogPosts.filter(p => p.authorId === 1); + ``` - Similarly, factories that look like + Note that everything is camelCased, including foreign keys. - ```js - export default Factory.extend({ - first_name() { - return faker.name.firstName(); - }, + Similarly, factories that look like - last_name() { - return faker.name.firstName(); - }, - }); - ``` + ```js + export default Factory.extend({ + first_name() { + return faker.name.firstName(); + }, - should be changed to + last_name() { + return faker.name.firstName(); + } + }); + ``` - ```js - export default Factory.extend({ - firstName() { - return faker.name.firstName(); - }, + should be changed to - lastName() { - return faker.name.firstName(); - }, - }); - ``` + ```js + export default Factory.extend({ + firstName() { + return faker.name.firstName(); + }, - This goes for all attrs that `server.create` takes (and returns), etc. For many this will be the most painful part of the upgrade. Please find it in your heart to forgive me. + lastName() { + return faker.name.firstName(); + } + }); + ``` - - **Mirage now has its own Model layer (an ORM).** In Mirage 0.1.x, you had to define either a factory or a fixture file (or both) in order for a database collection to be created, which let you take advantage of the db in your route handlers. In 0.2, we've introduced Mirage Models, which serve as the new canonical source of truth about your database. + This goes for all attrs that `server.create` takes (and returns), etc. For many this will be the most painful part of the upgrade. Please find it in your heart to forgive me. - To create a model, use +- **Mirage now has its own Model layer (an ORM).** In Mirage 0.1.x, you had to define either a factory or a fixture file (or both) in order for a database collection to be created, which let you take advantage of the db in your route handlers. In 0.2, we've introduced Mirage Models, which serve as the new canonical source of truth about your database. - ``` - ember g mirage-model blog-post - ``` + To create a model, use - This will create a file like + ``` + ember g mirage-model blog-post + ``` - ```js - import { Model } from 'ember-cli-mirage'; + This will create a file like - export default Model.extend({ + ```js + import { Model } from "ember-cli-mirage"; - }); - ``` + export default Model.extend({}); + ``` - Having that file sets up the `db.blogPosts` collection, allows you to use the JSON:API serializer, and more. You can still define factories and fixtures - but only if you need them. Models, factories and fixtures all work together, but now you won't be making blank factory or fixture files just to set up your database. The models themselves serve as the source of truth. + Having that file sets up the `db.blogPosts` collection, allows you to use the JSON:API serializer, and more. You can still define factories and fixtures - but only if you need them. Models, factories and fixtures all work together, but now you won't be making blank factory or fixture files just to set up your database. The models themselves serve as the source of truth. - We needed to add models for [association support](../models/#associations) (which currently exists) and factory relationships (the first feature to come after the 0.2 release). Read through the [models guide](../models) and [serializers guide](../serializers) to see how having models can simplify your Mirage server. + We needed to add models for [association support](../models/#associations) (which currently exists) and factory relationships (the first feature to come after the 0.2 release). Read through the [models guide](../models) and [serializers guide](../serializers) to see how having models can simplify your Mirage server. - We also have a plan to make a separate addon that could ascertain your model definitions and their relationships from your Ember Data models. Adding the ORM paves the way for this important future addition. + We also have a plan to make a separate addon that could ascertain your model definitions and their relationships from your Ember Data models. Adding the ORM paves the way for this important future addition. - Currently, Mirage will still work if a factory/fixture file is defined for a particular db collection without a corresponding model. Eventually, we may require all setups to have model definitions for each collection. But for now, to make for an easier upgrade path, you can start generating models and opt-in to the ORM layer in piecemeal. + Currently, Mirage will still work if a factory/fixture file is defined for a particular db collection without a corresponding model. Eventually, we may require all setups to have model definitions for each collection. But for now, to make for an easier upgrade path, you can start generating models and opt-in to the ORM layer in piecemeal. - **The ORM object `schema` is now injected into route handlers.** In Mirage 0.1.x, the `db` was the first parameter injected into route handlers: ```js - this.get('/posts', function(db, request) { + this.get("/posts", function(db, request) { // work with db }); ``` @@ -420,7 +405,7 @@ If you're upgrading your Mirage server from v0.1.x to v0.2.x, here's what you ne Now, the `schema` object is, so you can take advantage of the Model layer. Fortunately, the `db` hangs directly off of the `schema`, so you can leave all your old route handler code intact (with the exception of making the change to camelCase), and just use destructuring to change the function signature to ```js - this.get('/posts', function({ db }, request) { + this.get("/posts", function({ db }, request) { // work with db }); ``` @@ -431,4 +416,4 @@ If you're upgrading your Mirage server from v0.1.x to v0.2.x, here's what you ne --- -You can always view the [full changelog](https://github.com/samselikoff/ember-cli-mirage/blob/master/CHANGELOG.md) to see everything that's changed. If you think this guide missed a critical part of the upgrade path, please [open an issue](https://github.com/samselikoff/ember-cli-mirage/issues/new)! +You can always view the [full changelog](https://github.com/miragejs/ember-cli-mirage/blob/master/CHANGELOG.md) to see everything that's changed. If you think this guide missed a critical part of the upgrade path, please [open an issue](https://github.com/miragejs/ember-cli-mirage/issues/new)! From 070545ad3f187f4e784ed333d252889c529089ec Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 16 Dec 2019 12:15:19 -0500 Subject: [PATCH 612/879] v1.1.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 84c6a9529..53d7393e6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "1.1.5", + "version": "1.1.6", "description": "A client-side server to help you build, test and demo your Ember app", "keywords": [ "ember-addon", From 48489120dc8cef1998c0a430f050a26fa0d50178 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 17 Dec 2019 07:07:07 +0000 Subject: [PATCH 613/879] build(deps-dev): bump @ember/optional-features from 1.1.0 to 1.2.0 Bumps [@ember/optional-features](https://github.com/emberjs/ember-optional-features) from 1.1.0 to 1.2.0. - [Release notes](https://github.com/emberjs/ember-optional-features/releases) - [Changelog](https://github.com/emberjs/ember-optional-features/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember-optional-features/compare/v1.1.0...v1.2.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 143 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index f72498cf4..5bd6de886 100644 --- a/yarn.lock +++ b/yarn.lock @@ -884,15 +884,15 @@ resolve "^1.11.1" "@ember/optional-features@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@ember/optional-features/-/optional-features-1.1.0.tgz#0ff27ba6e9fc1f1e936e024f6a7cc33a96abffba" - integrity sha512-ST3+gIRH2WtgGcOtf42uM9WaXBY4dj4//zoTYV6GPe8cp0XdJEU63oMo9SbE6+0Efp8lvk96LsX+DVDDZy9Rmw== + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ember/optional-features/-/optional-features-1.2.0.tgz#121934fb8fbda2217bffea8fe18d6a916a01c257" + integrity sha512-XK3J4vW0nwo1FwrvIHsa93FgkLfT84hTmYIPyCj1roYVok9gpzyTYGqr1uCmfk1yl12NmwIetiCZTO37GMgTPQ== dependencies: - chalk "^2.4.2" + chalk "^3.0.0" co "^4.6.0" ember-cli-version-checker "^3.1.3" - glob "^7.1.5" - inquirer "^6.5.1" + glob "^7.1.6" + inquirer "^7.0.1" mkdirp "^0.5.1" silent-error "^1.1.1" util.promisify "^1.0.0" @@ -1303,6 +1303,11 @@ resolved "https://registry.yarnpkg.com/@types/broccoli-plugin/-/broccoli-plugin-1.3.0.tgz#38f8462fecaebc4e09a32e4d4ed1b9808f75bbca" integrity sha512-SLk4/hFc2kGvgwNFrpn2O1juxFOllcHAywvlo7VwxfExLzoz1GGJ0oIZCwj5fwSpvHw4AWpZjJ1fUvb62PDayQ== +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + "@types/ember@^3.1.0": version "3.1.1" resolved "https://registry.yarnpkg.com/@types/ember/-/ember-3.1.1.tgz#401810fa3ba911855d609d334ea77990b9b94802" @@ -1815,6 +1820,13 @@ ansi-escapes@^3.2.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== +ansi-escapes@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d" + integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg== + dependencies: + type-fest "^0.8.1" + ansi-html@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" @@ -1835,6 +1847,11 @@ ansi-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -1847,6 +1864,14 @@ ansi-styles@^3.0.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +ansi-styles@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.0.tgz#5681f0dcf7ae5880a7841d8831c4724ed9cc0172" + integrity sha512-7kFQgnEaMdRtwf6uSfUnVr9gSGC7faurn+J/Mv90/W+iTtN0405/nLdopfMWwchyxhbGYl6TC4Sccn9TUkGAgg== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + ansi-to-html@^0.6.6: version "0.6.13" resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.13.tgz#c72eae8b63e5ca0643aab11bfc6e6f2217425833" @@ -4000,6 +4025,14 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4 escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -4174,6 +4207,13 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + cli-spinners@^1.1.0: version "1.3.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" @@ -4303,6 +4343,13 @@ color-convert@^1.9.0: dependencies: color-name "1.1.3" +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + color-logger@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/color-logger/-/color-logger-0.0.3.tgz#d9b22dd1d973e166b18bf313f9f481bba4df2018" @@ -4313,6 +4360,11 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + colors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" @@ -6335,6 +6387,11 @@ emoji-regex@^7.0.1: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" @@ -7089,6 +7146,13 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" +figures@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" + integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== + dependencies: + escape-string-regexp "^1.0.5" + file-entry-cache@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" @@ -7639,7 +7703,7 @@ glob@^5.0.10: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.3, glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.5, glob@^7.1.6: +glob@^7.0.3, glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -7822,6 +7886,11 @@ has-flag@^3.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + has-symbol-support-x@^1.4.1: version "1.4.2" resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" @@ -8272,7 +8341,7 @@ inquirer@^2: strip-ansi "^3.0.0" through "^2.3.6" -inquirer@^6.2.2, inquirer@^6.5.1: +inquirer@^6.2.2: version "6.5.2" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== @@ -8291,6 +8360,25 @@ inquirer@^6.2.2, inquirer@^6.5.1: strip-ansi "^5.1.0" through "^2.3.6" +inquirer@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.1.tgz#13f7980eedc73c689feff3994b109c4e799c6ebb" + integrity sha512-V1FFQ3TIO15det8PijPLFR9M9baSlnRs9nL7zWu1MNVA2T9YVl9ZbrHJhYs7e9X8jeMZ3lr2JH/rdHFgNCBdYw== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.2.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + into-stream@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" @@ -8442,6 +8530,11 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + is-function@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" @@ -10060,6 +10153,11 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + najax@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/najax/-/najax-1.0.4.tgz#63fd8dbf15d18f24dc895b3a16fec66c136b8084" @@ -11828,6 +11926,14 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -11959,7 +12065,7 @@ rx@^4.1.0: resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= -rxjs@^6.4.0: +rxjs@^6.4.0, rxjs@^6.5.3: version "6.5.3" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== @@ -12616,6 +12722,15 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string-width@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + string.prototype.repeat@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-0.2.0.tgz#aba36de08dcee6a5a337d49b2ea1da1b28fc0ecf" @@ -12682,6 +12797,13 @@ strip-ansi@^5.1.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -12764,6 +12886,13 @@ supports-color@^6.1.0: dependencies: has-flag "^3.0.0" +supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + dependencies: + has-flag "^4.0.0" + svg2png@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/svg2png/-/svg2png-4.1.1.tgz#6b9e0398aa418778b6436e127a2fb7f00d499c28" @@ -13242,6 +13371,11 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" From c50df32f4ca2af148303bf576fc7dd3bc7bc3c65 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 18 Dec 2019 07:01:12 +0000 Subject: [PATCH 614/879] build(deps-dev): bump ember-resolver from 6.0.0 to 6.0.1 Bumps [ember-resolver](https://github.com/ember-cli/ember-resolver) from 6.0.0 to 6.0.1. - [Release notes](https://github.com/ember-cli/ember-resolver/releases) - [Changelog](https://github.com/ember-cli/ember-resolver/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-resolver/compare/v6.0.0...v6.0.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 33 ++++++++++----------------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/yarn.lock b/yarn.lock index 5bd6de886..632089959 100644 --- a/yarn.lock +++ b/yarn.lock @@ -961,11 +961,6 @@ resolve "^1.8.1" semver "^5.6.0" -"@glimmer/di@^0.2.0": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@glimmer/di/-/di-0.2.1.tgz#5286b6b32040232b751138f6d006130c728d4b3d" - integrity sha512-0D53YVuEgGdHfTl9LGWDZqVzGhn4cT0CXqyAuOYkKFLvqboJXz6SnkRhQNPhhA2hLVrPnvUz3+choQmPhHLGGQ== - "@glimmer/env@^0.1.7": version "0.1.7" resolved "https://registry.yarnpkg.com/@glimmer/env/-/env-0.1.7.tgz#fd2d2b55a9029c6b37a6c935e8c8871ae70dfa07" @@ -976,13 +971,6 @@ resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.42.2.tgz#9cf8d6f8f5eee6bfcfa36919ca68ae716e1f78db" integrity sha512-7LOuQd02cxxNNHChzdHMAU8/qOeQvTro141CU5tXITP7z6aOv2D2gkFdau97lLQiVxezGrh8J7h8GCuF7TEqtg== -"@glimmer/resolver@^0.4.1": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@glimmer/resolver/-/resolver-0.4.3.tgz#b1baae5c3291b4621002ccf8d7870466097e841d" - integrity sha512-UhX6vlZbWRMq6pCquSC3wfWLM9kO0PhQPD1dZ3XnyZkmsvEE94Cq+EncA9JalUuevKoJrfUFRvrZ0xaz+yar3g== - dependencies: - "@glimmer/di" "^0.2.0" - "@glimmer/syntax@^0.42.0": version "0.42.2" resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.42.2.tgz#89bb3cb787285b84665dc0d8907d94b008e5be9a" @@ -5412,7 +5400,7 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.13.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.13.2, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: version "7.13.2" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.13.2.tgz#6b6f4d508cc3bb300c5711d3d02c59ba80f0f686" integrity sha512-VH2tMXaRFkbQEyVJnxUtAyta5bAKjtcLwJ4lStW/iRk/NIlNFNJh1uOd7uL9H9Vm0f4/xR7Mc0Q7ND9ezKOo+A== @@ -6210,17 +6198,16 @@ ember-qunit@^3.5.0: qunit "~2.6.0" ember-resolver@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-6.0.0.tgz#e06bc8720a2f9214b3aebbe1c35018d8b172560f" - integrity sha512-M2tarFwu0nd+fSa+Kuh8U9fRy5Vnp6l5sfoR+Pl4ihhqoIC2MdyAogVg5iKBC31AfFrYjXw0cm75UV9vLqSyzQ== + version "6.0.1" + resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-6.0.1.tgz#a112c168f8c82810b5336f8f2f6171184ea5641d" + integrity sha512-Q5rrN4CB9fWtXyw0X3eMukuT2uz7ECuZC9M9GOg+9F0O3nEcN+TFKG+WfIdRSKVHvnxP4m0eHTd/vRlG4CbXHw== dependencies: - "@glimmer/resolver" "^0.4.1" babel-plugin-debug-macros "^0.3.3" broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.0" - ember-cli-babel "^7.13.0" + ember-cli-babel "^7.13.2" ember-cli-version-checker "^3.1.3" - resolve "^1.12.0" + resolve "^1.13.1" ember-responsive@^3.0.5: version "3.0.5" @@ -11896,10 +11883,10 @@ resolve@1.5.0: dependencies: path-parse "^1.0.5" -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: - version "1.12.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.2.tgz#08b12496d9aa8659c75f534a8f05f0d892fff594" - integrity sha512-cAVTI2VLHWYsGOirfeYVVQ7ZDejtQ9fp4YhYckWDEkFfqbVjaT11iM8k6xSAfGFMM+gDpZjMnFssPu8we+mqFw== +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: + version "1.14.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.0.tgz#6d14c6f9db9f8002071332b600039abf82053f64" + integrity sha512-uviWSi5N67j3t3UKFxej1loCH0VZn5XuqdNxoLShPcYPw6cUZn74K1VRj+9myynRX03bxIBEkwlkob/ujLsJVw== dependencies: path-parse "^1.0.6" From f2bbb052337bc6feac42679c1fada27131335c14 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 20 Dec 2019 07:07:34 +0000 Subject: [PATCH 615/879] build(deps-dev): bump @ember/optional-features from 1.2.0 to 1.3.0 Bumps [@ember/optional-features](https://github.com/emberjs/ember-optional-features) from 1.2.0 to 1.3.0. - [Release notes](https://github.com/emberjs/ember-optional-features/releases) - [Changelog](https://github.com/emberjs/ember-optional-features/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember-optional-features/compare/v1.2.0...v1.3.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index 632089959..2a302a897 100644 --- a/yarn.lock +++ b/yarn.lock @@ -884,12 +884,11 @@ resolve "^1.11.1" "@ember/optional-features@^1.0.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ember/optional-features/-/optional-features-1.2.0.tgz#121934fb8fbda2217bffea8fe18d6a916a01c257" - integrity sha512-XK3J4vW0nwo1FwrvIHsa93FgkLfT84hTmYIPyCj1roYVok9gpzyTYGqr1uCmfk1yl12NmwIetiCZTO37GMgTPQ== + version "1.3.0" + resolved "https://registry.yarnpkg.com/@ember/optional-features/-/optional-features-1.3.0.tgz#d7da860417b85a56cec88419f30da5ee1dde2756" + integrity sha512-Lrfojy4xKwTX+J4EAylmxZY2TO6bQtP4Lg5C8/z2priVqiT0X5fVB1+4WQCJbRBetctO1lMDnqjmhWCVKB8bmQ== dependencies: chalk "^3.0.0" - co "^4.6.0" ember-cli-version-checker "^3.1.3" glob "^7.1.6" inquirer "^7.0.1" @@ -4292,11 +4291,6 @@ cloneable-readable@^1.0.0: process-nextick-args "^2.0.0" readable-stream "^2.3.5" -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= - coa@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" From 0628318a6e0b3d55b2ffe75139e266200813805d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 6 Jan 2020 07:12:17 +0000 Subject: [PATCH 616/879] build(deps-dev): bump ember-composable-helpers from 3.0.2 to 3.0.3 Bumps [ember-composable-helpers](https://github.com/DockYard/ember-composable-helpers) from 3.0.2 to 3.0.3. - [Release notes](https://github.com/DockYard/ember-composable-helpers/releases) - [Commits](https://github.com/DockYard/ember-composable-helpers/compare/v3.0.2...v3.0.3) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 2a302a897..06f12b15b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5993,9 +5993,9 @@ ember-composable-helpers@^2.1.0: resolve "^1.10.0" ember-composable-helpers@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-3.0.2.tgz#7deb3cb72bd0ba14097378d4b35b6f89950a1c0f" - integrity sha512-XQEBjEIKi8hDV3TfjD7AGNLpzjMoWqXliBQ3A0k/OP1SAP2iW5wRwiNkKuInVtwZZjMBGJt0NUBT60M8TJwxOg== + version "3.0.3" + resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-3.0.3.tgz#bcb0d33690868067aeea38b879dab41e279f5d33" + integrity sha512-uNZm9EJQFGLBNUYm2es+hdS0vGLgSHiqXdSvFQ11y/B3nBkV4noocYqseF+wXoGuhB5di74zpB9Nty/E0mzuWw== dependencies: "@babel/core" "^7.0.0" broccoli-funnel "2.0.1" From 600531eb4eaa2e818acf95b86cc34a10a8775aa1 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 6 Jan 2020 07:12:51 +0000 Subject: [PATCH 617/879] build(deps-dev): bump ember-cli-addon-docs from 0.6.15 to 0.6.16 Bumps [ember-cli-addon-docs](https://github.com/ember-learn/ember-cli-addon-docs) from 0.6.15 to 0.6.16. - [Release notes](https://github.com/ember-learn/ember-cli-addon-docs/releases) - [Changelog](https://github.com/ember-learn/ember-cli-addon-docs/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-learn/ember-cli-addon-docs/compare/v0.6.15...v0.6.16) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 915 +++++++++++++++++++++++------------------------------- 1 file changed, 397 insertions(+), 518 deletions(-) diff --git a/yarn.lock b/yarn.lock index 06f12b15b..f42e4e527 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"30-seconds-of-code@^1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/30-seconds-of-code/-/30-seconds-of-code-1.2.3.tgz#b955acba83a050e3754fd0c84faaf25b32287fd4" + integrity sha512-IRjJtNwmSfVLplKCOxHfjup1Z7Cq1IgDCvGiKf+6gFGq/eEVfYqwGaEQx+NH1vsQZkCJrg8YMfBKGNUnb+uI+w== + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" @@ -970,7 +975,7 @@ resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.42.2.tgz#9cf8d6f8f5eee6bfcfa36919ca68ae716e1f78db" integrity sha512-7LOuQd02cxxNNHChzdHMAU8/qOeQvTro141CU5tXITP7z6aOv2D2gkFdau97lLQiVxezGrh8J7h8GCuF7TEqtg== -"@glimmer/syntax@^0.42.0": +"@glimmer/syntax@^0.42.2": version "0.42.2" resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.42.2.tgz#89bb3cb787285b84665dc0d8907d94b008e5be9a" integrity sha512-SR26SmF/Mb5o2cc4eLHpOyoX5kwwXP4KRhq4fbWfrvan74xVWA38PLspPCzwGhyVH/JsE7tUEPMjSo2DcJge/Q== @@ -1714,7 +1719,7 @@ acorn-globals@^1.0.4: dependencies: acorn "^2.1.0" -acorn-globals@^4.1.0, acorn-globals@^4.3.0, acorn-globals@^4.3.2: +acorn-globals@^4.3.0, acorn-globals@^4.3.2: version "4.3.4" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== @@ -1737,7 +1742,7 @@ acorn@^2.1.0, acorn@^2.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7" integrity sha1-q259nYhqrKiwhbwzEreaGYQz8Oc= -acorn@^5.0.0, acorn@^5.2.1, acorn@^5.5.3, acorn@^5.6.2: +acorn@^5.0.0, acorn@^5.5.3, acorn@^5.6.2: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== @@ -1975,18 +1980,6 @@ array-to-sentence@^1.1.0: resolved "https://registry.yarnpkg.com/array-to-sentence/-/array-to-sentence-1.1.0.tgz#c804956dafa53232495b205a9452753a258d39fc" integrity sha1-yASVba+lMjJJWyBalFJ1OiWNOfw= -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -2131,6 +2124,19 @@ autoprefixer@^7.0.0: postcss "^6.0.17" postcss-value-parser "^3.2.3" +autoprefixer@^9.4.5: + version "9.7.3" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.3.tgz#fd42ed03f53de9beb4ca0d61fb4f7268a9bb50b4" + integrity sha512-8T5Y1C5Iyj6PgkPSFd0ODvK9DIleuPKUPYniNxybS47g2k2wFgLZ46lGQHlBuGKIAEV8fbCDfKCCRS1tvOgc3Q== + dependencies: + browserslist "^4.8.0" + caniuse-lite "^1.0.30001012" + chalk "^2.4.2" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.23" + postcss-value-parser "^4.0.2" + aws-sign2@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.5.0.tgz#c57103f7a17fc037f02d7c2e64b602ea223f7d63" @@ -2403,11 +2409,6 @@ babel-plugin-htmlbars-inline-precompile@^0.2.5: resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.2.6.tgz#c00b8a3f4b32ca04bf0f0d5169fcef3b5a66d69d" integrity sha512-H4H75TKGUFij8ukwEYWEERAgrUf16R8NSK1uDPe3QwxT8mnE1K8+/s6DVjUqbM5Pv6lSIcE4XufXdlSX+DTB6g== -babel-plugin-htmlbars-inline-precompile@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-1.0.0.tgz#a9d2f6eaad8a3f3d361602de593a8cbef8179c22" - integrity sha512-4jvKEHR1bAX03hBDZ94IXsYCj3bwk9vYsn6ux6JZNL2U5pvzCWjqyrGahfsGNrhERyxw8IqcirOi9Q6WCo3dkQ== - babel-plugin-htmlbars-inline-precompile@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-3.0.0.tgz#95aa0d2379347cda9a7127c028fe35cb39179fa2" @@ -3301,7 +3302,7 @@ broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1, broccoli-funnel@^2.0.2: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-kitchen-sink-helpers@^0.2.0, broccoli-kitchen-sink-helpers@^0.2.5: +broccoli-kitchen-sink-helpers@^0.2.5: version "0.2.9" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz#a5e0986ed8d76fb5984b68c3f0450d3a96e36ecc" integrity sha1-peCYbtjXb7WYS2jD8EUNOpbjbsw= @@ -3389,7 +3390,7 @@ broccoli-module-unification-reexporter@^1.0.0: mkdirp "^0.5.1" walk-sync "^0.3.2" -broccoli-node-api@^1.6.0: +broccoli-node-api@^1.6.0, broccoli-node-api@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/broccoli-node-api/-/broccoli-node-api-1.7.0.tgz#391aa6edecd2a42c63c111b4162956b2fa288cb6" integrity sha512-QIqLSVJWJUVOhclmkmypJJH9u9s/aWH4+FH6Q6Ju5l+Io4dtwqdPUNmDfw40o6sxhbZHhqGujDJuHTML1wG8Yw== @@ -3399,6 +3400,18 @@ broccoli-node-info@^1.1.0: resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-1.1.0.tgz#3aa2e31e07e5bdb516dd25214f7c45ba1c459412" integrity sha1-OqLjHgflvbUW3SUhT3xFuhxFlBI= +broccoli-node-info@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-2.1.0.tgz#ca84560e8570ff78565bea1699866ddbf58ad644" + integrity sha512-l6qDuboJThHfRVVWQVaTs++bFdrFTP0gJXgsWenczc1PavRVUmL1Eyb2swTAXXMpDOnr2zhNOBLx4w9AxkqbPQ== + +broccoli-output-wrapper@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/broccoli-output-wrapper/-/broccoli-output-wrapper-2.0.0.tgz#f1e0b9b2f259a67fd41a380141c3c20b096828e6" + integrity sha512-V/ozejo+snzNf75i/a6iTmp71k+rlvqjE3+jYfimuMwR1tjNNRdtfno+NGNQB2An9bIAeqZnKhMDurAznHAdtA== + dependencies: + heimdalljs-logger "^0.1.10" + broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.2.0, broccoli-persistent-filter@^1.4.3: version "1.4.6" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.6.tgz#80762d19000880a77da33c34373299c0f6a3e615" @@ -3418,7 +3431,7 @@ broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-p symlink-or-copy "^1.0.1" walk-sync "^0.3.1" -broccoli-persistent-filter@^2.1.0, broccoli-persistent-filter@^2.1.1, broccoli-persistent-filter@^2.2.1, broccoli-persistent-filter@^2.2.2, broccoli-persistent-filter@^2.3.1: +broccoli-persistent-filter@^2.1.0, broccoli-persistent-filter@^2.1.1, broccoli-persistent-filter@^2.2.1, broccoli-persistent-filter@^2.2.2, broccoli-persistent-filter@^2.3.0, broccoli-persistent-filter@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.3.1.tgz#4a052e0e0868b344c3a2977e35a3d497aa9eca72" integrity sha512-hVsmIgCDrl2NFM+3Gs4Cr2TA6UPaIZip99hN8mtkaUPgM8UeVnCbxelCvBjUBHo0oaaqP5jzqqnRVvb568Yu5g== @@ -3448,6 +3461,19 @@ broccoli-plugin@1.1.0: rimraf "^2.3.4" symlink-or-copy "^1.0.1" +"broccoli-plugin@1.3.1 - 3", broccoli-plugin@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-3.1.0.tgz#54ba6dd90a42ec3db5624063292610e326b1e542" + integrity sha512-7w7FP8WJYjLvb0eaw27LO678TGGaom++49O1VYIuzjhXjK5kn2+AMlDm7CaUFw4F7CLGoVQeZ84d8gICMJa4lA== + dependencies: + broccoli-node-api "^1.6.0" + broccoli-output-wrapper "^2.0.0" + fs-merger "^3.0.1" + promise-map-series "^0.2.1" + quick-temp "^0.1.3" + rimraf "^2.3.4" + symlink-or-copy "^1.1.8" + broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli-plugin@^1.2.1, broccoli-plugin@^1.3.0, broccoli-plugin@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.1.tgz#a26315732fb99ed2d9fb58f12a1e14e986b4fabd" @@ -3458,7 +3484,7 @@ broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli rimraf "^2.3.4" symlink-or-copy "^1.1.8" -broccoli-plugin@^2.0.0: +broccoli-plugin@^2.0.0, broccoli-plugin@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-2.1.0.tgz#2fab6c578219cfcc64f773e9616073313fc8b334" integrity sha512-ElE4caljW4slapyEhSD9jU9Uayc8SoSABWdmY9SqbV8DHNxU6xg1jJsPcMm+cXOvggR3+G+OXAYQeFjWVnznaw== @@ -3468,16 +3494,26 @@ broccoli-plugin@^2.0.0: rimraf "^2.3.4" symlink-or-copy "^1.1.8" -broccoli-plugin@^3.0.0: +broccoli-postcss-single@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-3.0.0.tgz#516f2b550ffa2bb111bf54c1afb4bd0b2f02065b" - integrity sha512-aEtobBvzAlUIAaY5z+LwW2W3IJ9pruJtrT571CyfjoDFTGa8LZx0qjQG97Z7Guk5YzuxDoDNlM3hGsgBnnReTw== + resolved "https://registry.yarnpkg.com/broccoli-postcss-single/-/broccoli-postcss-single-3.0.0.tgz#1393f87b69e4bbf20a1a1e614e09bbf066db28a2" + integrity sha512-+CsV6zdK9CXTplZvQeAsZm7mEh+BwIN6GBzpqm7agqsMZTvW6kkcWDaL2ahG1+Aq2HfLYk1Sam6iQ3jdESNmPA== dependencies: - broccoli-node-api "^1.6.0" - promise-map-series "^0.2.1" - quick-temp "^0.1.3" - rimraf "^2.3.4" - symlink-or-copy "^1.1.8" + broccoli-caching-writer "^3.0.3" + include-path-searcher "^0.1.0" + mkdirp "^0.5.1" + object-assign "^4.1.1" + postcss "^7.0.0" + +broccoli-postcss@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/broccoli-postcss/-/broccoli-postcss-5.0.0.tgz#b4ac48e936b0ce0032e68a5872d54323fcf4744d" + integrity sha512-iJk+meVt0Oe33iaaE0T6z2lxSs349BRD7pz2kk/I6MuSjjWrZSzP/2txmEHQN7LyQGZjbC222MzBgSQj/O8kTw== + dependencies: + broccoli-funnel "^2.0.1" + broccoli-persistent-filter "^2.1.0" + object-assign "^4.1.1" + postcss "^7.0.5" broccoli-replace@^0.12.0: version "0.12.0" @@ -3488,7 +3524,7 @@ broccoli-replace@^0.12.0: broccoli-persistent-filter "^1.2.0" minimatch "^3.0.0" -broccoli-rollup@^2.0.0, broccoli-rollup@^2.1.1: +broccoli-rollup@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/broccoli-rollup/-/broccoli-rollup-2.1.1.tgz#0b77dc4b7560a53e998ea85f3b56772612d4988d" integrity sha512-aky/Ovg5DbsrsJEx2QCXxHLA6ZR+9u1TNVTf85soP4gL8CjGGKQ/JU8R3BZ2ntkWzo6/83RCKzX6O+nlNKR5MQ== @@ -3543,6 +3579,13 @@ broccoli-source@^1.1.0: resolved "https://registry.yarnpkg.com/broccoli-source/-/broccoli-source-1.1.0.tgz#54f0e82c8b73f46580cbbc4f578f0b32fca8f809" integrity sha1-VPDoLItz9GWAy7xPV48LMvyo+Ak= +broccoli-source@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/broccoli-source/-/broccoli-source-3.0.0.tgz#c7c9ba24505941b72a0244568285bc859f69dfbd" + integrity sha512-G4Zc8HngZIdASyQOiz/9H/0Gjc2F02EFwhWF4wiueaI+/FBrM9Ixj6Prno/1aiLIYcN0JvRC3oytN9uOVonTww== + dependencies: + broccoli-node-api "^1.6.0" + broccoli-sri-hash@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/broccoli-sri-hash/-/broccoli-sri-hash-2.1.2.tgz#bc69905ed7a381ad325cc0d02ded071328ebf3f3" @@ -3554,15 +3597,6 @@ broccoli-sri-hash@^2.1.0: sri-toolbox "^0.2.0" symlink-or-copy "^1.0.1" -broccoli-static-compiler@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/broccoli-static-compiler/-/broccoli-static-compiler-0.1.4.tgz#713d18f08eb3131530575a0c5ad2951bba10af41" - integrity sha1-cT0Y8I6zExUwV1oMWtKVG7oQr0E= - dependencies: - broccoli-kitchen-sink-helpers "^0.2.0" - broccoli-writer "^0.1.1" - mkdirp "^0.3.5" - broccoli-stew@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-1.6.0.tgz#01f6d92806ed6679ddbe48d405066a0e164dfbef" @@ -3603,6 +3637,26 @@ broccoli-stew@^2.0.0, broccoli-stew@^2.1.0: symlink-or-copy "^1.2.0" walk-sync "^0.3.3" +broccoli-stew@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-3.0.0.tgz#fd1d19d162ad9490b42e5c563b78c26eb1e80b95" + integrity sha512-NXfi+Vas24n3Ivo21GvENTI55qxKu7OwKRnCLWXld8MiLiQKQlWIq28eoARaFj0lTUFwUa4jKZeA7fW9PiWQeg== + dependencies: + broccoli-debug "^0.6.5" + broccoli-funnel "^2.0.0" + broccoli-merge-trees "^3.0.1" + broccoli-persistent-filter "^2.3.0" + broccoli-plugin "^2.1.0" + chalk "^2.4.1" + debug "^4.1.1" + ensure-posix-path "^1.0.1" + fs-extra "^8.0.1" + minimatch "^3.0.4" + resolve "^1.11.1" + rsvp "^4.8.5" + symlink-or-copy "^1.2.0" + walk-sync "^1.1.3" + broccoli-string-replace@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/broccoli-string-replace/-/broccoli-string-replace-0.1.2.tgz#1ed92f85680af8d503023925e754e4e33676b91f" @@ -3661,14 +3715,6 @@ broccoli-uglify-sourcemap@^3.1.0: walk-sync "^1.1.3" workerpool "^5.0.1" -broccoli-writer@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/broccoli-writer/-/broccoli-writer-0.1.1.tgz#d4d71aa8f2afbc67a3866b91a2da79084b96ab2d" - integrity sha1-1NcaqPKvvGejhmuRotp5CEuWqy0= - dependencies: - quick-temp "^0.1.0" - rsvp "^3.0.6" - brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -3763,6 +3809,15 @@ browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.7.3: electron-to-chromium "^1.3.306" node-releases "^1.1.40" +browserslist@^4.8.0: + version "4.8.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.3.tgz#65802fcd77177c878e015f0e3189f2c4f627ba44" + integrity sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg== + dependencies: + caniuse-lite "^1.0.30001017" + electron-to-chromium "^1.3.322" + node-releases "^1.1.44" + bser@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -3820,11 +3875,6 @@ buffer@^5.2.0: base64-js "^1.0.2" ieee754 "^1.1.4" -builtin-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-2.0.0.tgz#60b7ef5ae6546bd7deefa74b08b62a43a232648e" - integrity sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg== - builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -3845,7 +3895,7 @@ bytes@3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= -bytes@3.1.0: +bytes@3.1.0, bytes@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== @@ -3922,10 +3972,10 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase-css@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-1.0.1.tgz#157c4238265f5cf94a1dffde86446552cbf3f705" - integrity sha1-FXxCOCZfXPlKHf/ehkRlUsvz9wU= +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== camelcase-keys@^2.0.0: version "2.1.0" @@ -3967,6 +4017,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805, can resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001011.tgz#0d6c4549c78c4a800bb043a83ca0cbe0aee6c6e1" integrity sha512-h+Eqyn/YA6o6ZTqpS86PyRmNWOs1r54EBDcd2NTwwfsXQ8re1B38SnB+p2RKF8OUsyEIjeDU8XGec1RGO/wYCg== +caniuse-lite@^1.0.30001012, caniuse-lite@^1.0.30001017: + version "1.0.30001019" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001019.tgz#857e3fccaad2b2feb3f1f6d8a8f62d747ea648e1" + integrity sha512-6ljkLtF1KM5fQ+5ZN0wuyVvvebJxgJPTmScOMaFuQN2QuOzvRJnWSKfzQskQU5IOU4Gap3zasYPIinzwUjoj/g== + capture-exit@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" @@ -4228,15 +4283,6 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= -clipboard@^1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-1.7.1.tgz#360d6d6946e99a7a1fef395e42ba92b5e9b5a16b" - integrity sha1-Ng1taUbpmnof7zleQrqStem1oWs= - dependencies: - good-listener "^1.2.2" - select "^1.1.2" - tiny-emitter "^2.0.0" - clipboard@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.4.tgz#836dafd66cf0fea5d71ce5d5b0bf6e958009112d" @@ -4383,16 +4429,11 @@ commander@2.8.x: dependencies: graceful-readlink ">= 1.0.0" -commander@^2.11.0, commander@^2.19.0, commander@^2.20.0, commander@^2.6.0, commander@~2.20.3: +commander@^2.19.0, commander@^2.20.0, commander@^2.6.0, commander@~2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -comment-regex@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/comment-regex/-/comment-regex-1.0.1.tgz#e070d2c4db33231955d0979d27c918fcb6f93565" - integrity sha512-IWlN//Yfby92tOIje7J18HkNmWRR7JESA/BK8W7wqY/akITpU5B0JQWnbTjCfdChSrDNb0DrdA9jfAxiiBXyiQ== - common-tags@^1.4.0, common-tags@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" @@ -4758,6 +4799,11 @@ css-tree@1.0.0-alpha.33: mdn-data "2.0.4" source-map "^0.5.3" +css-unit-converter@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996" + integrity sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY= + css-what@2.1: version "2.1.3" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" @@ -4768,10 +4814,10 @@ css-what@^3.2.1: resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1" integrity sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw== -css.escape@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" - integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== csso@^3.5.1: version "3.5.1" @@ -4780,7 +4826,7 @@ csso@^3.5.1: dependencies: css-tree "1.0.0-alpha.29" -cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0", "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4, cssom@~0.3.6: +cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0", cssom@^0.3.4, cssom@~0.3.6: version "0.3.8" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== @@ -4797,7 +4843,7 @@ cssom@^0.4.1: dependencies: cssom "0.3.x" -cssstyle@^1.0.0, cssstyle@^1.1.1: +cssstyle@^1.1.1: version "1.4.0" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== @@ -4840,7 +4886,7 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -data-urls@^1.0.0, data-urls@^1.0.1, data-urls@^1.1.0: +data-urls@^1.0.1, data-urls@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== @@ -4947,11 +4993,6 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= - delayed-stream@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-0.0.5.tgz#d4b1f43a93e8296dfe02694f4680bc37a313c73f" @@ -5114,7 +5155,7 @@ dot-case@^3.0.2: no-case "^3.0.2" tslib "^1.10.0" -dot-prop@^4.1.0, dot-prop@^4.1.1: +dot-prop@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== @@ -5169,6 +5210,11 @@ electron-to-chromium@^1.3.30, electron-to-chromium@^1.3.306, electron-to-chromiu resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.311.tgz#73baa361e2b1f44b7b4f1a443aaa1372f8074ebb" integrity sha512-7GH6RKCzziLzJ9ejmbiBEdzHZsc6C3eRpav14dmRfTWMpNgMqpP1ukw/FU/Le2fR+ep642naq7a23xNdmh2s+A== +electron-to-chromium@^1.3.322: + version "1.3.326" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.326.tgz#71715aca9afd328ea208a3bc4651c15b869f0d1b" + integrity sha512-kaBmGWJlLW5bGEbm7/HWG9jt4oH+uecBIIfzFWfFkgqssPT2I6RDenGqo4wmKzm7seNu7DSCRZBXCuf7w8dtkQ== + elliptic@^6.0.0: version "6.5.2" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" @@ -5190,6 +5236,16 @@ ember-ajax@^5.0.0: ember-cli-babel "^7.5.0" najax "^1.0.3" +ember-angle-bracket-invocation-polyfill@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ember-angle-bracket-invocation-polyfill/-/ember-angle-bracket-invocation-polyfill-2.0.2.tgz#117ab5238305f11046a2eb3a5bc026c98d2cf5c1" + integrity sha512-HkG0xyTHtAhWVjU0Q5V/i4xe4FRvNIOaiUEgIvN815F3TIUboV/J0xhYgivm0uDZp9lAYUVF+U5PI1sCnlC3Og== + dependencies: + ember-cli-babel "^6.17.0" + ember-cli-version-checker "^2.1.2" + ember-compatibility-helpers "^1.0.2" + silent-error "^1.1.1" + ember-app-scheduler@^1.0.5: version "1.0.8" resolved "https://registry.yarnpkg.com/ember-app-scheduler/-/ember-app-scheduler-1.0.8.tgz#37adacce2fa5ab59324e2c0b08f3c4a3568025b4" @@ -5217,7 +5273,7 @@ ember-assign-polyfill@~2.4.0: ember-cli-babel "^6.6.0" ember-cli-version-checker "^2.0.0" -ember-auto-import@^1.2.19, ember-auto-import@^1.5.2: +ember-auto-import@^1.2.19, ember-auto-import@^1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.5.3.tgz#b32936f874d1ed7057ad2ed3f6116357820be44b" integrity sha512-7JfdunM1BmLy/lyUXu7uEoi0Gi4+dxkGM23FgIEyW5g7z4MidhP53Fc61t49oPSnq7+J4lLpbH1f6C+mDMgb4A== @@ -5269,11 +5325,11 @@ ember-cli-addon-docs-esdoc@^0.2.3: walk-sync "^0.3.2" ember-cli-addon-docs@^0.6.13: - version "0.6.15" - resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.15.tgz#a0b8d744a37e3dba9afa1b0c19b44bb7cca5afba" - integrity sha512-swlN0dWY2AUq7CCN8cS0IRtZFdVzDCjcaGorg0NxppP+/MlruRlLPEZm14me3ghS3ArlTohWwp+DIFy1gylczw== + version "0.6.16" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.16.tgz#846a86d75d205890b2977816423899f4ed5e511e" + integrity sha512-I3ZJC+eQA+epiU+TbKFGOXY3O0JyicwLEv9TT0vxY7XO60TW6Lt79mXRx8aJz5RNp5Qzvp/q4zhW83cL+bmRvg== dependencies: - "@glimmer/syntax" "^0.42.0" + "@glimmer/syntax" "^0.42.2" broccoli-bridge "^1.0.0" broccoli-caching-writer "^3.0.3" broccoli-debug "^0.6.4" @@ -5281,58 +5337,62 @@ ember-cli-addon-docs@^0.6.13: broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.1" broccoli-persistent-filter "^2.3.1" - broccoli-plugin "^1.3.1" - broccoli-source "^1.1.0" - broccoli-stew "^2.0.0" + broccoli-plugin "1.3.1 - 3" + broccoli-source "^3.0.0" + broccoli-stew "^3.0.0" chalk "^2.4.2" + ember-angle-bracket-invocation-polyfill "^2.0.2" ember-assign-polyfill "^2.6.0" - ember-auto-import "^1.5.2" + ember-auto-import "^1.5.3" ember-cli-autoprefixer "^0.8.1" - ember-cli-babel "^7.7.3" - ember-cli-clipboard "^0.11.1" - ember-cli-htmlbars "^3.0.1" - ember-cli-htmlbars-inline-precompile "^2.1.0" - ember-cli-sass "10.0.0" - ember-cli-string-helpers "^1.9.0" + ember-cli-babel "^7.12.0" + ember-cli-clipboard "^0.13.0" + ember-cli-htmlbars "^4.0.7" + ember-cli-postcss "^5.0.0" + ember-cli-sass "10.0.1" + ember-cli-string-helpers "^4.0.5" ember-cli-string-utils "^1.1.0" - ember-cli-tailwind "^0.6.2" - ember-code-snippet "^2.4.1" + ember-code-snippet "^3.0.0" ember-component-css "^0.7.4" + ember-composable-helpers "^2.3.1" ember-concurrency "^0.9.0 || ^0.10.0 || ^1.0.0" ember-data "2.x - 3.x" - ember-fetch "^6.7.0" + ember-fetch "^6.7.1" ember-fetch-adapter "^0.4.3" + ember-get-config "^0.2.4" ember-href-to "^1.15.1" ember-keyboard "^4.0.0" ember-modal-dialog "^3.0.0-beta.4" + ember-named-arguments-polyfill "^1.0.0" ember-responsive "^3.0.5" ember-router-generator "^2.0.0" - ember-router-scroll "^1.2.1" - ember-svg-jar "^2.1.0" + ember-router-scroll "^1.3.3" + ember-svg-jar "^2.2.3" ember-tether "^1.0.0-beta.2" ember-truth-helpers "^2.1.0" esm "^3.2.25" - execa "^1.0.0" - fs-extra "^7.0.0" - git-repo-info "^2.1.0" - highlight.js "^9.14.2" - hosted-git-info "^2.7.1" + execa "^3.2.0" + fs-extra "^8.1.0" + git-repo-info "^2.1.1" + highlight.js "^9.15.10" + hosted-git-info "^3.0.2" html-entities "^1.2.1" inflected "^2.0.3" - jsdom "^11.12.0" - json-api-serializer "^1.13.0" - liquid-fire "^0.29.5 || ^0.30.0" + jsdom "^15.2.0" + json-api-serializer "^2.2.1" + liquid-fire "^0.29.5 || ^0.30.0 || ^0.31.0" lodash "^4.17.15" - lunr "^2.3.6" - marked "^0.5.0" + lunr "^2.3.7" + marked "^0.7.0" pad-start "^1.0.2" - parse-git-config "^2.0.3" + parse-git-config "^3.0.0" quick-temp "^0.1.8" resolve "^1.12.0" sass "^1.22.10" - semver "^5.5.1" + semver "^6.3.0" striptags "^3.1.1" - walk-sync "^0.3.3" + tailwindcss "^1.0" + walk-sync "^2.0.2" yuidocjs "^0.10.2" ember-cli-autoprefixer@^0.8.1: @@ -5375,7 +5435,7 @@ ember-cli-babel@7.7.3: ensure-posix-path "^1.0.2" semver "^5.5.0" -ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.7.2, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2: +ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.17.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.7.2, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2: version "6.18.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz#3f6435fd275172edeff2b634ee7b29ce74318957" integrity sha512-7ceC8joNYxY2wES16iIBlbPSxwKDBhYwC8drU3ZEvuPDMwVv1KzxCNu1fvxyFEBWhwaRNTUxSCsEVoTd9nosGA== @@ -5394,7 +5454,7 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.13.2, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: version "7.13.2" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.13.2.tgz#6b6f4d508cc3bb300c5711d3d02c59ba80f0f686" integrity sha512-VH2tMXaRFkbQEyVJnxUtAyta5bAKjtcLwJ4lStW/iRk/NIlNFNJh1uOd7uL9H9Vm0f4/xR7Mc0Q7ND9ezKOo+A== @@ -5432,27 +5492,16 @@ ember-cli-broccoli-sane-watcher@^2.1.1: rsvp "^3.0.18" sane "^2.4.1" -ember-cli-clipboard@^0.11.1: - version "0.11.1" - resolved "https://registry.yarnpkg.com/ember-cli-clipboard/-/ember-cli-clipboard-0.11.1.tgz#caa6aaae498f12922102555d6825ad81ad843d2a" - integrity sha512-LAsrFpaOV8mgyI4MLR6R2BJFbzW8ac3GZkTKmAH+V5LeyidK/Inr4yZpY5nff/jKlQFT6E4991Z9mzldfKJZcg== +ember-cli-clipboard@^0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/ember-cli-clipboard/-/ember-cli-clipboard-0.13.0.tgz#47d3de3aec09987409c162cbff36f966a2c138b7" + integrity sha512-AA2J5lliP/DXUFKnQ+r/D3e4xiN3ttlmN8W+8WfZg7K8VeOYlWpMyGcUjmuLa7inLUCMjLbtG6nXc20AQ5OjDg== dependencies: broccoli-funnel "^1.1.0" clipboard "^2.0.0" - ember-cli-babel "^7.1.2" - ember-cli-htmlbars "^2.0.2" - fastboot-transform "0.1.1" - -ember-cli-clipboard@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/ember-cli-clipboard/-/ember-cli-clipboard-0.8.1.tgz#59f8eb6ba471a7668dff592fcebb7b06014240dd" - integrity sha1-Wfjra6Rxp2aN/1kvzrt7BgFCQN0= - dependencies: - broccoli-funnel "^1.1.0" - clipboard "^1.7.1" - ember-cli-babel "^6.8.0" - ember-cli-htmlbars "^2.0.2" - fastboot-transform "0.1.1" + ember-cli-babel "^7.7.3" + ember-cli-htmlbars "^3.0.1" + fastboot-transform "^0.1.3" ember-cli-dependency-checker@^3.0.0: version "3.2.0" @@ -5583,18 +5632,7 @@ ember-cli-htmlbars-inline-precompile@^1.0.0: heimdalljs-logger "^0.1.9" silent-error "^1.1.0" -ember-cli-htmlbars-inline-precompile@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-2.1.0.tgz#61b91ff1879d44ae504cadb46fb1f2604995ae08" - integrity sha512-BylIHduwQkncPhnj0ZyorBuljXbTzLgRo6kuHf1W+IHFxThFl2xG+r87BVwsqx4Mn9MTgW9SE0XWjwBJcSWd6Q== - dependencies: - babel-plugin-htmlbars-inline-precompile "^1.0.0" - ember-cli-version-checker "^2.1.2" - hash-for-dep "^1.2.3" - heimdalljs-logger "^0.1.9" - silent-error "^1.1.0" - -ember-cli-htmlbars@^2.0.1, ember-cli-htmlbars@^2.0.2: +ember-cli-htmlbars@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.5.tgz#b5a105429a6bce4f7c9c97b667e3b8926e31397f" integrity sha512-3f3PAxdnQ/fhQa8XP/3z4RLRgLHxV8j4Ln75aHbRdemOCjBa048KxL9l+acRLhCulbGQCMnLiIUIC89PAzLrcA== @@ -5614,7 +5652,7 @@ ember-cli-htmlbars@^3.0.0, ember-cli-htmlbars@^3.0.1: json-stable-stringify "^1.0.1" strip-bom "^3.0.0" -ember-cli-htmlbars@^4.0.5: +ember-cli-htmlbars@^4.0.5, ember-cli-htmlbars@^4.0.7: version "4.2.0" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.2.0.tgz#a3694ab31f6d571c45786a3041b9c76e4eb30989" integrity sha512-YymJLg/rRiclK5jxbTFpaRNlbS+f3SY6SplnMExjcrcbSjMRsBuams50+mppENEu7iKfd6PBqH3FHVbYsukHSQ== @@ -5697,6 +5735,18 @@ ember-cli-path-utils@^1.0.0: resolved "https://registry.yarnpkg.com/ember-cli-path-utils/-/ember-cli-path-utils-1.0.0.tgz#4e39af8b55301cddc5017739b77a804fba2071ed" integrity sha1-Tjmvi1UwHN3FAXc5t3qAT7ogce0= +ember-cli-postcss@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-postcss/-/ember-cli-postcss-5.0.0.tgz#07891b2950e0a6e8b35234d5960575d0471da50a" + integrity sha512-znJOyXeYmhDF3DOocfcCUrnGN0iWmDGvMJKTVPszFeBd1/cqx+lSxc1Tx25RAF1KpOyI0FqD1amp6s9lud62EQ== + dependencies: + broccoli-file-creator "^2.1.1" + broccoli-merge-trees "^3.0.0" + broccoli-postcss "^5.0.0" + broccoli-postcss-single "^3.0.0" + ember-cli-babel "^7.1.0" + merge "^1.2.0" + ember-cli-preprocess-registry@^3.1.2: version "3.3.0" resolved "https://registry.yarnpkg.com/ember-cli-preprocess-registry/-/ember-cli-preprocess-registry-3.3.0.tgz#685837a314fbe57224bd54b189f4b9c23907a2de" @@ -5715,10 +5765,10 @@ ember-cli-qunit@^4.4.0: ember-cli-babel "^6.11.0" ember-qunit "^3.5.0" -ember-cli-sass@10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/ember-cli-sass/-/ember-cli-sass-10.0.0.tgz#700094ebaf348896111756c2644f1e444b05323c" - integrity sha512-gAMh3sHRExk/gOpbJ+OKKLPd8vCT8Bs8UU0cdNwBUOVwQ0UJ3iKyQY6GS1bMMXYtiyK2ieUPsrDGf14LUcC7bw== +ember-cli-sass@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/ember-cli-sass/-/ember-cli-sass-10.0.1.tgz#afa91eb7dfe3890be0390639d66976512e7d8edc" + integrity sha512-dWVoX03O2Mot1dEB1AN3ofC8DDZb6iU4Kfkbr3WYi9S9bGVHrpR/ngsR7tuVBuTugTyG53FPtLLqYdqx7XjXdA== dependencies: broccoli-funnel "^2.0.1" broccoli-merge-trees "^3.0.1" @@ -5732,43 +5782,19 @@ ember-cli-sri@^2.1.1: dependencies: broccoli-sri-hash "^2.1.0" -ember-cli-string-helpers@^1.9.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/ember-cli-string-helpers/-/ember-cli-string-helpers-1.10.0.tgz#6ee6c18d15759acb0905aa0153fe9e031a382fa4" - integrity sha512-z2eNT7BsTNSxp3qNrv7KAxjPwdLC1kIYCck9CERg0RM5vBGy2vK6ozZE3U6nWrtth1xO4PrYkgISwhSgN8NMeg== +ember-cli-string-helpers@^4.0.5: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ember-cli-string-helpers/-/ember-cli-string-helpers-4.0.6.tgz#2f38538bfb6b8226624077cfe3ce335b8269c05c" + integrity sha512-ge7ri4EU9rNwE4Z8HbACvuJeFyTi7113dRLzs205RvX9vf7kEaHIKijeroqVPUioPH62JdlojCDC2h0dCw2R7g== dependencies: - broccoli-funnel "^1.0.1" - ember-cli-babel "^6.6.0" + broccoli-funnel "^2.0.2" + ember-cli-babel "^7.7.3" ember-cli-string-utils@^1.0.0, ember-cli-string-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz#39b677fc2805f55173735376fcef278eaa4452a1" integrity sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE= -ember-cli-tailwind@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/ember-cli-tailwind/-/ember-cli-tailwind-0.6.3.tgz#db9858367af082bc0283056f462685cfaada1335" - integrity sha512-SMkucR5N75GQY8lDQ0i7ad/CbHLCxjKPIhkR3L6lO+UU3q5w5U6KMo6HySLu9iIKmp5XckRzXUVnhAnQS00wsQ== - dependencies: - broccoli-caching-writer "^3.0.3" - broccoli-funnel "^2.0.1" - broccoli-merge-trees "^3.0.1" - broccoli-plugin "^1.3.0" - broccoli-rollup "^2.0.0" - broccoli-stew "^2.0.0" - ember-cli-babel "^6.6.0" - ember-cli-clipboard "^0.8.1" - ember-cli-htmlbars "^2.0.1" - ember-cli-string-utils "^1.1.0" - ember-composable-helpers "^2.1.0" - ember-truth-helpers "^2.0.0" - fs-extra "^5.0.0" - postcss "^6.0.20" - postcss-easy-import "^3.0.0" - rollup-plugin-commonjs "^8.3.0" - rollup-plugin-node-resolve "^3.3.0" - tailwindcss "^0.6.1" - ember-cli-test-info@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-test-info/-/ember-cli-test-info-1.0.0.tgz#ed4e960f249e97523cf891e4aed2072ce84577b4" @@ -5937,19 +5963,20 @@ ember-cli@~3.4.4: watch-detector "^0.1.0" yam "^0.0.24" -ember-code-snippet@^2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/ember-code-snippet/-/ember-code-snippet-2.4.2.tgz#17a125c5afc9b134caf7ab8df3d7f68c09019669" - integrity sha512-JO2HKVsL2tUAGj9atJ7Q3bS9DK2ZijdhXDUsu6iJPS2PBvWGKKktHq572sl5cPc4tj+Girgrq3zp/5Wy95Xmsg== +ember-code-snippet@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-code-snippet/-/ember-code-snippet-3.0.0.tgz#5e3108a68cc76740355cbbca840656d96c6b7ba1" + integrity sha512-pvIpGPLma7m6WQ5+uOjwkzozIzRAqlUSQk9TMCrQQ/AeEGWtqTJvZyAtH9LoarPtudHtWCZkUqJXIqKsjIqAbw== dependencies: broccoli-flatiron "^0.1.3" broccoli-merge-trees "^1.0.0" - broccoli-static-compiler "^0.1.4" - broccoli-writer "^0.1.1" + broccoli-plugin "^1.3.1" + ember-cli-babel "^7.7.3" + ember-cli-htmlbars "^3.0.1" es6-promise "^1.0.0" glob "^7.1.3" -ember-compatibility-helpers@^1.1.1, ember-compatibility-helpers@^1.1.2, ember-compatibility-helpers@^1.2.0: +ember-compatibility-helpers@^1.0.2, ember-compatibility-helpers@^1.1.1, ember-compatibility-helpers@^1.1.2, ember-compatibility-helpers@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.2.0.tgz#feee16c5e9ef1b1f1e53903b241740ad4b01097e" integrity sha512-pUW4MzJdcaQtwGsErYmitFRs0rlCYBAnunVzlFFUBr4xhjlCjgHJo0b53gFnhTgenNM3d3/NqLarzRhDTjXRTg== @@ -5982,7 +6009,7 @@ ember-component-css@^0.7.4: rsvp "^4.8.4" walk-sync "^1.0.1" -ember-composable-helpers@^2.1.0: +ember-composable-helpers@^2.3.1: version "2.4.0" resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-2.4.0.tgz#024bd6a8c338cc9cdf10f1141b119b8f72de205f" integrity sha512-91ZqFnNG1EDL3WzxXWTgAy6EonPS7htWHletI5SOw5ezEzKbt6EGNBwT6QPhwariugtR8LEfYNQ9lXEiCZrX1w== @@ -6011,13 +6038,6 @@ ember-composable-helpers@^3.0.1: ember-compatibility-helpers "^1.2.0" ember-maybe-import-regenerator "^0.1.6" -ember-copy@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ember-copy/-/ember-copy-1.0.0.tgz#426554ba6cf65920f31d24d0a3ca2cb1be16e4aa" - integrity sha512-aiZNAvOmdemHdvZNn0b5b/0d9g3JFpcOsrDgfhYEbfd7SzE0b69YiaVK2y3wjqfjuuiA54vOllGN4pjSzECNSw== - dependencies: - ember-cli-babel "^6.6.0" - "ember-data@2.x - 3.x", ember-data@3.14.0, ember-data@~3.14.0: version "3.14.0" resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.14.0.tgz#e36584722bf84aef21a0541e10f2a3016b75b231" @@ -6058,7 +6078,7 @@ ember-fetch-adapter@^0.4.3: dependencies: ember-cli-babel "^6.12.0" -ember-fetch@^6.7.0: +ember-fetch@^6.7.1: version "6.7.2" resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-6.7.2.tgz#82efce4a55a64863104347b71e598208b9acf518" integrity sha512-+Dd++MJVkCXoqX2DPtFDjuoDMcLk+7fphLq7D8OoXwJq9KQMTff07sH18qhxWXV5Hqknvz3Uwy214g54vOboag== @@ -6076,7 +6096,7 @@ ember-fetch@^6.7.0: node-fetch "^2.6.0" whatwg-fetch "^3.0.0" -ember-get-config@^0.2.2: +ember-get-config@^0.2.2, ember-get-config@^0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.2.4.tgz#118492a2a03d73e46004ed777928942021fe1ecd" integrity sha1-EYSSoqA9c+RgBO13eSiUICH+Hs0= @@ -6178,6 +6198,14 @@ ember-moment@^8.0.0: ember-getowner-polyfill "^2.2.0" ember-macro-helpers "^4.2.2" +ember-named-arguments-polyfill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-named-arguments-polyfill/-/ember-named-arguments-polyfill-1.0.0.tgz#0b81fb81a7cef2c89e9e1d0278b579e708bf4ded" + integrity sha1-C4H7gafO8sienh0CeLV55wi/Te0= + dependencies: + ember-cli-babel "^6.6.0" + ember-cli-version-checker "^2.1.2" + ember-qunit@^3.5.0: version "3.5.3" resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-3.5.3.tgz#bfd0bff8298c78c77e870cca43fe0826e78a0d09" @@ -6224,7 +6252,7 @@ ember-router-generator@^2.0.0: "@babel/traverse" "^7.4.5" recast "^0.18.1" -ember-router-scroll@^1.2.1: +ember-router-scroll@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/ember-router-scroll/-/ember-router-scroll-1.3.3.tgz#411991a671bd970497f5ce757baa627e850ae6e0" integrity sha512-SwGsX7kceLXd3AZtKFcM/Ggl5lw37/a1v2rYHwWKZNMiyICBctJmWeEvALLQpiNzT8YMJrJHBkucHFmG07JPXQ== @@ -6283,7 +6311,7 @@ ember-source@~3.14.1: semver "^6.1.1" silent-error "^1.1.1" -ember-svg-jar@^2.1.0: +ember-svg-jar@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/ember-svg-jar/-/ember-svg-jar-2.2.3.tgz#632f8d6a999ceb1c815a135fbc2bd681b856330b" integrity sha512-17kBxi5IfsEnCsVuFTjVs+HEAa3sfdB4t4C+5GZUxWixEbK8hwoRDsuvsboOGhDemycVv21GAyexcTeinabsnQ== @@ -6312,7 +6340,7 @@ ember-tether@^1.0.0-beta.2: ember-cli-node-assets "^0.2.2" tether "^1.4.0" -ember-truth-helpers@^2.0.0, ember-truth-helpers@^2.1.0: +ember-truth-helpers@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-truth-helpers/-/ember-truth-helpers-2.1.0.tgz#d4dab4eee7945aa2388126485977baeb33ca0798" integrity sha512-BQlU8aTNl1XHKTYZ243r66yqtR9JU7XKWQcmMA+vkqfkE/c9WWQ9hQZM8YABihCmbyxzzZsngvldokmeX5GhAw== @@ -6535,7 +6563,7 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escodegen@^1.11.0, escodegen@^1.11.1, escodegen@^1.6.1, escodegen@^1.9.1: +escodegen@^1.11.0, escodegen@^1.11.1, escodegen@^1.6.1: version "1.12.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541" integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg== @@ -6721,11 +6749,6 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estree-walker@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.2.tgz#d3850be7529c9580d815600b53126515e146dd39" - integrity sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig== - estree-walker@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" @@ -6819,10 +6842,10 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-3.3.0.tgz#7e348eef129a1937f21ecbbd53390942653522c1" - integrity sha512-j5Vit5WZR/cbHlqU97+qcnw9WHRCIL4V1SVe75VcHcD1JRBdt8fv0zw89b7CQHQdUHTt2VjuhcF5ibAgVOxqpg== +execa@^3.0.0, execa@^3.2.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" + integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g== dependencies: cross-spawn "^7.0.0" get-stream "^5.0.0" @@ -7043,13 +7066,6 @@ fastboot-express-middleware@^2.0.0: fastboot "^2.0.1" request "^2.81.0" -fastboot-transform@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/fastboot-transform/-/fastboot-transform-0.1.1.tgz#de55550d85644ec94cb11264c2ba883e3ea3b255" - integrity sha512-aY3wh4kFCYOZWZM88f2svB9OL8UNpqBtOQxV3hHxjeRncQUKLD81I2GXayIFaGEQiS8g34awXfq46WZv8uIHvQ== - dependencies: - broccoli-stew "^1.5.0" - fastboot-transform@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/fastboot-transform/-/fastboot-transform-0.1.3.tgz#7dea0b117594afd8772baa6c9b0919644e7f7dcd" @@ -7375,11 +7391,6 @@ from2@^2.1.0, from2@^2.1.1: inherits "^2.0.1" readable-stream "^2.0.0" -fs-exists-sync@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" - integrity sha1-mC1ok6+RjnLQjeyehnP/K1qNat0= - fs-extra@1.0.0, fs-extra@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" @@ -7435,7 +7446,7 @@ fs-extra@^7.0.0, fs-extra@^7.0.1: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^8.0.0: +fs-extra@^8.0.0, fs-extra@^8.0.1, fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== @@ -7444,6 +7455,18 @@ fs-extra@^8.0.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-merger@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fs-merger/-/fs-merger-3.0.2.tgz#bf111334b89b8d65b95580d33c587dc79620a4e3" + integrity sha512-63wmgjPDClP5XcTSKdIXz66X5paYy/m2Ymq5c5YpGxRQEk1HFZ8rtti3LMNSOSw1ketbBMGbSFFcQeEnpnzDpQ== + dependencies: + broccoli-node-api "^1.7.0" + broccoli-node-info "^2.1.0" + fs-extra "^8.0.1" + fs-tree-diff "^2.0.1" + rimraf "^2.6.3" + walk-sync "^2.0.2" + fs-minipass@^1.2.5: version "1.2.7" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" @@ -7531,11 +7554,6 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -gather-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gather-stream/-/gather-stream-1.0.0.tgz#b33994af457a8115700d410f317733cbe7a0904b" - integrity sha1-szmUr0V6gRVwDUEPMXczy+egkEs= - gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -7599,14 +7617,10 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -git-config-path@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/git-config-path/-/git-config-path-1.0.1.tgz#6d33f7ed63db0d0e118131503bab3aca47d54664" - integrity sha1-bTP37WPbDQ4RgTFQO6s6ykfVRmQ= - dependencies: - extend-shallow "^2.0.1" - fs-exists-sync "^0.1.0" - homedir-polyfill "^1.0.0" +git-config-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/git-config-path/-/git-config-path-2.0.0.tgz#62633d61af63af4405a5024efd325762f58a181b" + integrity sha512-qc8h1KIQbJpp+241id3GuAtkdyJ+IK+LIVtkiFTRKRrmddDzs3SI9CvP1QYmWBFvm1I/PWRwj//of8bgAc0ltA== git-fetch-pack@^0.1.1: version "0.1.1" @@ -7634,7 +7648,7 @@ git-read-pkt-line@0.0.8: bops "0.0.3" through "~2.2.7" -git-repo-info@^2.0.0, git-repo-info@^2.1.0: +git-repo-info@^2.0.0, git-repo-info@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-2.1.1.tgz#220ffed8cbae74ef8a80e3052f2ccb5179aed058" integrity sha512-8aCohiDo4jwjOwma4FmYFd3i97urZulL8XL24nIPxuE+GZnfsAyy/g2Shqx6OjUiFKUXZM+Yy+KHnOmmA3FVcg== @@ -7684,7 +7698,7 @@ glob@^5.0.10: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.3, glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -7734,17 +7748,6 @@ globals@^9.18.0: resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - good-listener@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" @@ -7807,7 +7810,7 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -handlebars@^4.0.11, handlebars@^4.0.13, handlebars@^4.0.4, handlebars@^4.3.1: +handlebars@^4.0.11, handlebars@^4.0.13, handlebars@^4.0.4, handlebars@^4.3.1, handlebars@^4.5.3: version "4.5.3" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.3.tgz#5cf75bd8714f7605713511a56be7c349becb0482" integrity sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA== @@ -7857,11 +7860,6 @@ has-cors@1.1.0: resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -8013,10 +8011,12 @@ heimdalljs@^0.3.0: dependencies: rsvp "~3.2.1" -highlight.js@^9.14.2: - version "9.16.2" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.16.2.tgz#68368d039ffe1c6211bcc07e483daf95de3e403e" - integrity sha512-feMUrVLZvjy0oC7FVJQcSQRqbBq9kwqnYE4+Kj9ZjbHh3g+BisiPgF49NyQbVLNdrL/qqZr3Ca9yOKwgn2i/tw== +highlight.js@^9.15.10: + version "9.17.1" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.17.1.tgz#14a4eded23fd314b05886758bb906e39dd627f9a" + integrity sha512-TA2/doAur5Ol8+iM3Ov7qy3jYcr/QiJ2eDTdRF4dfbjG7AaaB99J5G+zSl11ljbl6cIcahgPY6SKb3sC3EJ0fw== + dependencies: + handlebars "^4.5.3" himalaya@1.1.0: version "1.1.0" @@ -8050,7 +8050,7 @@ home-or-tmp@^2.0.0: os-homedir "^1.0.0" os-tmpdir "^1.0.1" -homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: +homedir-polyfill@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== @@ -8062,6 +8062,13 @@ hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== +hosted-git-info@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.2.tgz#8b7e3bd114b59b51786f8bade0f39ddc80275a97" + integrity sha512-ezZMWtHXm7Eb7Rq4Mwnx2vs79WUx2QmRg3+ZqeGroKzfDO+EprOcgRPYghsOP9JuYBfK18VojmRTGCg8Ma+ktw== + dependencies: + lru-cache "^5.1.1" + html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" @@ -8540,11 +8547,6 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" - integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= - is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -8787,11 +8789,6 @@ jquery@^3.4.1: resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2" integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw== -js-base64@^2.1.9: - version "2.5.1" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121" - integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw== - js-levenshtein@^1.1.3: version "1.1.6" resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" @@ -8830,38 +8827,6 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jsdom@^11.12.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" - integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== - dependencies: - abab "^2.0.0" - acorn "^5.5.3" - acorn-globals "^4.1.0" - array-equal "^1.0.0" - cssom ">= 0.3.2 < 0.4.0" - cssstyle "^1.0.0" - data-urls "^1.0.0" - domexception "^1.0.1" - escodegen "^1.9.1" - html-encoding-sniffer "^1.0.2" - left-pad "^1.3.0" - nwsapi "^2.0.7" - parse5 "4.0.0" - pn "^1.1.0" - request "^2.87.0" - request-promise-native "^1.0.5" - sax "^1.2.4" - symbol-tree "^3.2.2" - tough-cookie "^2.3.4" - w3c-hr-time "^1.0.1" - webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.3" - whatwg-mimetype "^2.1.0" - whatwg-url "^6.4.1" - ws "^5.2.0" - xml-name-validator "^3.0.0" - jsdom@^12.0.0: version "12.2.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-12.2.0.tgz#7cf3f5b5eafd47f8f09ca52315d367ff6e95de23" @@ -8893,7 +8858,7 @@ jsdom@^12.0.0: ws "^6.1.0" xml-name-validator "^3.0.0" -jsdom@^15.0.0: +jsdom@^15.0.0, jsdom@^15.2.0: version "15.2.1" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.1.tgz#d2feb1aef7183f86be521b8c6833ff5296d07ec5" integrity sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g== @@ -8966,7 +8931,7 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -json-api-serializer@^1.11.0, json-api-serializer@^1.13.0: +json-api-serializer@^1.11.0: version "1.15.1" resolved "https://registry.yarnpkg.com/json-api-serializer/-/json-api-serializer-1.15.1.tgz#241ea66dfc5c629ae46d8315c6ee4232b81bb6b7" integrity sha512-dp7d/TLWudViXADFnmdiq80krYZ+zA0WeB1771O1Is8HWdeySZofhp/TPWHCzgFPmGkgwI7oTEgjgZ6Dcxr/2w== @@ -8978,6 +8943,14 @@ json-api-serializer@^1.11.0, json-api-serializer@^1.13.0: through2 "^2.0.3" unique-stream "^2.2.1" +json-api-serializer@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/json-api-serializer/-/json-api-serializer-2.2.2.tgz#233bf2633b300d62ac15105669b7d2615b3b2443" + integrity sha512-SbP98/T4Mfibi8tnYV6o4ofRZ9nN1QQ5foon5H0w4lIzwXWYRD/Xs3nNbpLbSEPAH6vDzkeRVN2cM5qciGMlug== + dependencies: + "30-seconds-of-code" "^1.2.3" + lodash.set "^4.3.2" + json-buffer@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" @@ -9127,11 +9100,6 @@ leek@0.0.24: lodash.assign "^3.2.0" rsvp "^3.0.21" -left-pad@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" - integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== - levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -9161,10 +9129,10 @@ linkify-it@~1.2.0: dependencies: uc.micro "^1.0.1" -"liquid-fire@^0.29.5 || ^0.30.0": - version "0.30.0" - resolved "https://registry.yarnpkg.com/liquid-fire/-/liquid-fire-0.30.0.tgz#20e6673f9db32d503f909592fd2c691452b07d6d" - integrity sha512-5ffmsrPvAzc4EQdjVHouiPc0m+c+wt4YOBgABrPgO+30cSAlYLYuIhQIQ5j+zX87oa61btq0BJVjjtxunG1Nrg== +"liquid-fire@^0.29.5 || ^0.30.0 || ^0.31.0": + version "0.31.0" + resolved "https://registry.yarnpkg.com/liquid-fire/-/liquid-fire-0.31.0.tgz#6dc9f4785b5a06dcbe1a7ca4e8b130ac595ee2f5" + integrity sha512-KVI2vBB+6I1kvkOSD/S/Vjq5hYqlFw3zBLiRoCSIDj9LMWmm2GEKvQcmpxiqgsdjMS2VAFaqUd+9BJFRvCmIjA== dependencies: broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.2" @@ -9172,7 +9140,6 @@ linkify-it@~1.2.0: ember-cli-babel "^7.7.3" ember-cli-htmlbars "^3.0.1" ember-cli-version-checker "^3.1.3" - ember-copy "^1.0.0" match-media "^0.2.0" velocity-animate "^1.5.2" @@ -9504,6 +9471,11 @@ lodash.restparam@^3.0.0: resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= +lodash.set@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" + integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM= + lodash.snakecase@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" @@ -9534,6 +9506,11 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "^3.0.0" +lodash.toarray@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" + integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= + lodash.uniq@^4.2.0, lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" @@ -9613,18 +9590,11 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -lunr@^2.3.6: +lunr@^2.3.7: version "2.3.8" resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.8.tgz#a8b89c31f30b5a044b97d2d28e2da191b6ba2072" integrity sha512-oxMeX/Y35PNFuZoHp+jUj5OSEmLCaIH4KTFJh7a93cHBoFmpw2IoPs22VIz7vyO2YUnx2Tn9dzIwO2P/4quIRg== -magic-string@^0.22.4: - version "0.22.5" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e" - integrity sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w== - dependencies: - vlq "^0.2.2" - magic-string@^0.24.0: version "0.24.1" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.24.1.tgz#7e38e5f126cae9f15e71f0cf8e450818ca7d5a8f" @@ -9709,10 +9679,10 @@ marked@0.3.6: resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" integrity sha1-ssbGGPzOzk74bE/Gy4p8v1rtqNc= -marked@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.5.2.tgz#3efdb27b1fd0ecec4f5aba362bddcd18120e5ba9" - integrity sha512-fdZvBa7/vSQIZCi4uuwo2N3q+7jJURpMVCcbaX0S1Mg65WZ5ilXvC67MviJAsdjqqgD+CEq4RKo5AYGgINkVAA== +marked@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e" + integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg== match-media@^0.2.0: version "0.2.0" @@ -10207,6 +10177,13 @@ no-case@^3.0.2: lower-case "^2.0.1" tslib "^1.10.0" +node-emoji@^1.8.1: + version "1.10.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.10.0.tgz#8886abd25d9c7bb61802a658523d1f8d2a89b2da" + integrity sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw== + dependencies: + lodash.toarray "^4.4.0" + node-fetch@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" @@ -10285,6 +10262,13 @@ node-releases@^1.1.40: dependencies: semver "^6.3.0" +node-releases@^1.1.44: + version "1.1.44" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.44.tgz#cd66438a6eb875e3eb012b6a12e48d9f4326ffd7" + integrity sha512-NwbdvJyR7nrcGrXvKAvzc5raj/NkoJudkarh2yIpJ4t0NH4aqjUDz/486P+ynIW5eokKOfzGNRdYoLfBlomruw== + dependencies: + semver "^6.3.0" + node-uuid@~1.4.0: version "1.4.8" resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" @@ -10341,6 +10325,11 @@ normalize-url@2.0.1: query-string "^5.0.1" sort-keys "^2.0.0" +normalize.css@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-8.0.1.tgz#9b98a208738b9cc2634caacbc42d131c97487bf3" + integrity sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg== + npm-bundled@^1.0.1: version "1.0.6" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" @@ -10415,7 +10404,7 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" integrity sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ== -nwsapi@^2.0.7, nwsapi@^2.0.9, nwsapi@^2.2.0: +nwsapi@^2.0.9, nwsapi@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== @@ -10752,13 +10741,12 @@ parse-bmfont-xml@^1.1.4: xml-parse-from-string "^1.0.0" xml2js "^0.4.5" -parse-git-config@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/parse-git-config/-/parse-git-config-2.0.3.tgz#6fb840d4a956e28b971c97b33a5deb73a6d5b6bb" - integrity sha512-Js7ueMZOVSZ3tP8C7E3KZiHv6QQl7lnJ+OkbxoaFazzSa2KyEHqApfGbU3XboUgUnq4ZuUmskUpYKTNx01fm5A== +parse-git-config@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/parse-git-config/-/parse-git-config-3.0.0.tgz#4a2de08c7b74a2555efa5ae94d40cd44302a6132" + integrity sha512-wXoQGL1D+2COYWCD35/xbiKma1Z15xvZL8cI25wvxzled58V51SJM04Urt/uznS900iQor7QO04SgdfT/XlbuA== dependencies: - expand-tilde "^2.0.2" - git-config-path "^1.0.1" + git-config-path "^2.0.0" ini "^1.3.5" parse-headers@^2.0.0: @@ -10790,11 +10778,6 @@ parse-png@^1.0.0, parse-png@^1.1.1: dependencies: pngjs "^3.2.0" -parse5@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" - integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== - parse5@5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" @@ -10937,22 +10920,6 @@ pend@~1.2.0: resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= -perfectionist@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/perfectionist/-/perfectionist-2.4.0.tgz#c147ad3714e126467f1764129ee72df861d47ea0" - integrity sha1-wUetNxThJkZ/F2QSnuct+GHUfqA= - dependencies: - comment-regex "^1.0.0" - defined "^1.0.0" - minimist "^1.2.0" - postcss "^5.0.8" - postcss-scss "^0.3.0" - postcss-value-parser "^3.3.0" - read-file-stdin "^0.2.0" - string.prototype.repeat "^0.2.0" - vendors "^1.0.0" - write-file-stdout "0.0.2" - performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -10983,7 +10950,7 @@ picomatch@^2.0.4: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.1.1.tgz#ecdfbea7704adb5fe6fb47f9866c4c0e15e905c5" integrity sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA== -pify@^2.0.0, pify@^2.3.0: +pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= @@ -11055,20 +11022,6 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -postcss-easy-import@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-easy-import/-/postcss-easy-import-3.0.0.tgz#8eaaf5ae59566083d0cae98735dfd803e3ab194d" - integrity sha512-cfNsear/v8xlkl9v5Wm8y4Do/puiDQTFF+WX2Fo++h7oKt1fKWVVW/5Ca8hslYDQWnjndrg813cA23Pt1jsYdg== - dependencies: - globby "^6.1.0" - is-glob "^4.0.0" - lodash "^4.17.4" - object-assign "^4.0.1" - pify "^3.0.0" - postcss "^6.0.11" - postcss-import "^10.0.0" - resolve "^1.1.7" - postcss-functions@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-functions/-/postcss-functions-3.0.0.tgz#0e94d01444700a481de20de4d55fb2640564250e" @@ -11079,24 +11032,13 @@ postcss-functions@^3.0.0: postcss "^6.0.9" postcss-value-parser "^3.3.0" -postcss-import@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-10.0.0.tgz#4c85c97b099136cc5ea0240dc1dfdbfde4e2ebbe" - integrity sha1-TIXJewmRNsxeoCQNwd/b/eTi674= - dependencies: - object-assign "^4.0.1" - postcss "^6.0.1" - postcss-value-parser "^3.2.3" - read-cache "^1.0.0" - resolve "^1.1.7" - -postcss-js@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-1.0.1.tgz#ffaf29226e399ea74b5dce02cab1729d7addbc7b" - integrity sha512-smhUUMF5o5W1ZCQSyh5A3lNOXFLdNrxqyhWbLsGolZH2AgVmlyhxhYbIixfsdKE6r1vG5i7O40DPcvEvE1mvjw== +postcss-js@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-2.0.3.tgz#a96f0f23ff3d08cec7dc5b11bf11c5f8077cdab9" + integrity sha512-zS59pAk3deu6dVHyrGqmC3oDXBdNdajk4k1RyxeVXCrcEDBUBHoIhE4QTsmhxgzXxsaqFDAkUZfmMa5f/N/79w== dependencies: - camelcase-css "^1.0.1" - postcss "^6.0.11" + camelcase-css "^2.0.1" + postcss "^7.0.18" postcss-less@^3.1.0: version "3.1.4" @@ -11105,20 +11047,13 @@ postcss-less@^3.1.0: dependencies: postcss "^7.0.14" -postcss-nested@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-3.0.0.tgz#cde40bd07a078565f3df72e2dc2665871c724852" - integrity sha512-1xxmLHSfubuUi6xZZ0zLsNoiKfk3BWQj6fkNMaBJC529wKKLcdeCxXt6KJmDLva+trNyQNwEaE/ZWMA7cve1fA== - dependencies: - postcss "^6.0.14" - postcss-selector-parser "^3.1.1" - -postcss-scss@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-0.3.1.tgz#65c610d8e2a7ee0e62b1835b71b8870734816e4b" - integrity sha1-ZcYQ2OKn7g5isYNbcbiHBzSBbks= +postcss-nested@^4.1.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-4.2.1.tgz#4bc2e5b35e3b1e481ff81e23b700da7f82a8b248" + integrity sha512-AMayXX8tS0HCp4O4lolp4ygj9wBn32DJWXvG6gCv+ZvJrEa00GUxJcJEEzMh87BIe6FrWdYkpR2cuyqHKrxmXw== dependencies: - postcss "^5.2.4" + postcss "^7.0.21" + postcss-selector-parser "^6.0.2" postcss-scss@^2.0.0: version "2.0.0" @@ -11134,12 +11069,12 @@ postcss-selector-namespace@^2.0.0: dependencies: postcss "^7.0.0" -postcss-selector-parser@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865" - integrity sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU= +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" + integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== dependencies: - dot-prop "^4.1.1" + cssesc "^3.0.0" indexes-of "^1.0.1" uniq "^1.0.1" @@ -11148,17 +11083,12 @@ postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss@^5.0.8, postcss@^5.2.4: - version "5.2.18" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" - integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg== - dependencies: - chalk "^1.1.3" - js-base64 "^2.1.9" - source-map "^0.5.6" - supports-color "^3.2.3" +postcss-value-parser@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz#482282c09a42706d1fc9a069b73f44ec08391dc9" + integrity sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ== -postcss@^6.0.1, postcss@^6.0.11, postcss@^6.0.14, postcss@^6.0.17, postcss@^6.0.20, postcss@^6.0.9: +postcss@^6.0.1, postcss@^6.0.17, postcss@^6.0.9: version "6.0.23" resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== @@ -11176,6 +11106,15 @@ postcss@^7.0.0, postcss@^7.0.14, postcss@^7.0.6: source-map "^0.6.1" supports-color "^6.1.0" +postcss@^7.0.11, postcss@^7.0.18, postcss@^7.0.21, postcss@^7.0.23, postcss@^7.0.5: + version "7.0.26" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.26.tgz#5ed615cfcab35ba9bbb82414a4fa88ea10429587" + integrity sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -11200,6 +11139,11 @@ pretender@3.1.0: route-recognizer "^0.3.3" whatwg-fetch "^3.0.0" +pretty-hrtime@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= + pretty-ms@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-3.2.0.tgz#87a8feaf27fc18414d75441467d411d6e6098a25" @@ -11380,7 +11324,7 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= -quick-temp@^0.1.0, quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quick-temp@^0.1.8: +quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quick-temp@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/quick-temp/-/quick-temp-0.1.8.tgz#bab02a242ab8fb0dd758a3c9776b32f9a5d94408" integrity sha1-urAqJCq4+w3XWKPJd2sy+aXZRAg= @@ -11458,25 +11402,11 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -read-cache@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" - integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= - dependencies: - pify "^2.3.0" - read-chunk@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-1.0.1.tgz#5f68cab307e663f19993527d9b589cace4661194" integrity sha1-X2jKswfmY/GZk1J9m1icrORmEZQ= -read-file-stdin@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/read-file-stdin/-/read-file-stdin-0.2.1.tgz#25eccff3a153b6809afacb23ee15387db9e0ee61" - integrity sha1-JezP86FTtoCa+ssj7hU4fbng7mE= - dependencies: - gather-stream "^1.0.0" - read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" @@ -11577,6 +11507,14 @@ redeyed@~1.0.0: dependencies: esprima "~3.0.0" +reduce-css-calc@^2.1.6: + version "2.1.7" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.7.tgz#1ace2e02c286d78abcd01fd92bfe8097ab0602c2" + integrity sha512-fDnlZ+AybAS3C7Q9xDq5y8A2z+lT63zLbynew/lur/IR24OQF5x98tfNwf79mzEdfywZ0a2wpM860FhFfMxZlA== + dependencies: + css-unit-converter "^1.1.1" + postcss-value-parser "^3.3.0" + regenerate-unicode-properties@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" @@ -11761,7 +11699,7 @@ request-promise-native@^1.0.5, request-promise-native@^1.0.7: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.55.0, request@^2.65.0, request@^2.81.0, request@^2.87.0, request@^2.88.0: +request@^2.55.0, request@^2.65.0, request@^2.81.0, request@^2.88.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== @@ -11877,7 +11815,7 @@ resolve@1.5.0: dependencies: path-parse "^1.0.5" -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: +resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: version "1.14.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.0.tgz#6d14c6f9db9f8002071332b600039abf82053f64" integrity sha512-uviWSi5N67j3t3UKFxej1loCH0VZn5XuqdNxoLShPcYPw6cUZn74K1VRj+9myynRX03bxIBEkwlkob/ujLsJVw== @@ -11954,26 +11892,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rollup-plugin-commonjs@^8.3.0: - version "8.4.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.4.1.tgz#5c9cea2b2c3de322f5fbccd147e07ed5e502d7a0" - integrity sha512-mg+WuD+jlwoo8bJtW3Mvx7Tz6TsIdMsdhuvCnDMoyjh0oxsVgsjB/N0X984RJCWwc5IIiqNVJhXeeITcc73++A== - dependencies: - acorn "^5.2.1" - estree-walker "^0.5.0" - magic-string "^0.22.4" - resolve "^1.4.0" - rollup-pluginutils "^2.0.1" - -rollup-plugin-node-resolve@^3.3.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.4.0.tgz#908585eda12e393caac7498715a01e08606abc89" - integrity sha512-PJcd85dxfSBWih84ozRtBkB731OjXk0KnzN0oGp7WOWcarAFkVa71cV5hTJg2qpVsV2U8EUwrzHP3tvy9vS3qg== - dependencies: - builtin-modules "^2.0.0" - is-module "^1.0.0" - resolve "^1.1.6" - rollup-pluginutils@^2.0.1, rollup-pluginutils@^2.8.1: version "2.8.2" resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" @@ -12712,11 +12630,6 @@ string-width@^4.1.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string.prototype.repeat@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-0.2.0.tgz#aba36de08dcee6a5a337d49b2ea1da1b28fc0ecf" - integrity sha1-q6Nt4I3O5qWjN9SbLqHaGyj8Ds8= - string.prototype.trimleft@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634" @@ -12846,13 +12759,6 @@ supports-color@^2.0.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= - dependencies: - has-flag "^1.0.0" - supports-color@^5.3.0, supports-color@^5.4.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -12939,21 +12845,25 @@ taffydb@2.7.2: resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.7.2.tgz#7bf8106a5c1a48251b3e3bc0a0e1732489fd0dc8" integrity sha1-e/gQalwaSCUbPjvAoOFzJIn9Dcg= -tailwindcss@^0.6.1: - version "0.6.6" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-0.6.6.tgz#a8c8a8bf7d230c8bc10031672923d84af29cd34d" - integrity sha512-g6xb7kcPIom85K7ak16AUBrwN3tPdhrQoKJ7Jl7OJ3zBOQNHthquZ1/q+0V6fj9jsC66jrDCQxn72DIjK4aYgg== +tailwindcss@^1.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-1.1.4.tgz#786bd5faaf485c9eddcb821dd55666c56baa814e" + integrity sha512-p4AxVa4CKpX7IbNxImwNMGG9MHuLgratOaOE/iGriNd4AsRQRM2xMisoQ3KQHqShunrWuObga7rI7xbNsVoWGA== dependencies: - commander "^2.11.0" - css.escape "^1.5.1" - fs-extra "^4.0.2" - lodash "^4.17.5" - perfectionist "^2.4.0" - postcss "^6.0.9" + autoprefixer "^9.4.5" + bytes "^3.0.0" + chalk "^2.4.1" + fs-extra "^8.0.0" + lodash "^4.17.11" + node-emoji "^1.8.1" + normalize.css "^8.0.1" + postcss "^7.0.11" postcss-functions "^3.0.0" - postcss-js "^1.0.1" - postcss-nested "^3.0.0" - postcss-selector-parser "^3.1.1" + postcss-js "^2.0.0" + postcss-nested "^4.1.1" + postcss-selector-parser "^6.0.0" + pretty-hrtime "^1.0.3" + reduce-css-calc "^2.1.6" tap-parser@^7.0.0: version "7.0.0" @@ -13269,7 +13179,7 @@ tough-cookie@>=0.12.0, tough-cookie@^3.0.1: psl "^1.1.28" punycode "^2.1.1" -tough-cookie@^2.2.0, tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@^2.4.3: +tough-cookie@^2.2.0, tough-cookie@^2.3.3, tough-cookie@^2.4.3: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== @@ -13651,11 +13561,6 @@ velocity-animate@^1.5.2: resolved "https://registry.yarnpkg.com/velocity-animate/-/velocity-animate-1.5.2.tgz#5a351d75fca2a92756f5c3867548b873f6c32105" integrity sha512-m6EXlCAMetKztO1ppBhGU1/1MR3IiEevO6ESq6rcrSQ3Q77xYSW13jkfXW88o4xMrkXJhy/U7j4wFR/twMB0Eg== -vendors@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.3.tgz#a6467781abd366217c050f8202e7e50cc9eef8c0" - integrity sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw== - verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -13677,11 +13582,6 @@ vinyl@^2.2.0: remove-trailing-separator "^1.0.1" replace-ext "^1.0.0" -vlq@^0.2.2: - version "0.2.3" - resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" - integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== - vm-browserify@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" @@ -13849,7 +13749,7 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== @@ -13861,7 +13761,7 @@ whatwg-fetch@^3.0.0: resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== -whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: +whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== @@ -13873,15 +13773,6 @@ whatwg-url-compat@~0.6.5: dependencies: tr46 "~0.0.1" -whatwg-url@^6.4.1: - version "6.5.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" - integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - whatwg-url@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" @@ -13977,11 +13868,6 @@ write-file-atomic@^2.0.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" -write-file-stdout@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/write-file-stdout/-/write-file-stdout-0.0.2.tgz#c252d7c7c5b1b402897630e3453c7bfe690d9ca1" - integrity sha1-wlLXx8WxtAKJdjDjRTx7/mkNnKE= - write@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" @@ -13989,13 +13875,6 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@^5.2.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" - integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== - dependencies: - async-limiter "~1.0.0" - ws@^6.1.0: version "6.2.1" resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" From ea8ea6adc480ee71dfeeab01d37acaca03386a78 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 17 Jan 2020 07:08:45 +0000 Subject: [PATCH 618/879] build(deps-dev): bump ember-cli-htmlbars from 4.2.0 to 4.2.2 Bumps [ember-cli-htmlbars](https://github.com/ember-cli/ember-cli-htmlbars) from 4.2.0 to 4.2.2. - [Release notes](https://github.com/ember-cli/ember-cli-htmlbars/releases) - [Changelog](https://github.com/ember-cli/ember-cli-htmlbars/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-cli-htmlbars/compare/v4.2.0...v4.2.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/yarn.lock b/yarn.lock index f42e4e527..123b1379a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -871,10 +871,10 @@ ember-cli-typescript "^3.0.0" heimdalljs "^0.3.0" -"@ember/edition-utils@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@ember/edition-utils/-/edition-utils-1.1.1.tgz#d5732c3da593f202e6e1ac6dbee56a758242403f" - integrity sha512-GEhri78jdQp/xxPpM6z08KlB0wrHfnfrJ9dmQk7JeQ4XCiMzXsJci7yooQgg/IcTKCM/PxE/IkGCQAo80adMkw== +"@ember/edition-utils@^1.1.1", "@ember/edition-utils@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ember/edition-utils/-/edition-utils-1.2.0.tgz#a039f542dc14c8e8299c81cd5abba95e2459cfa6" + integrity sha512-VmVq/8saCaPdesQmftPqbFtxJWrzxNGSQ+e8x8LLe3Hjm36pJ04Q8LeORGZkAeOhldoUX9seLGmSaHeXkIqoog== "@ember/jquery@^1.1.0": version "1.1.0" @@ -2409,10 +2409,10 @@ babel-plugin-htmlbars-inline-precompile@^0.2.5: resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.2.6.tgz#c00b8a3f4b32ca04bf0f0d5169fcef3b5a66d69d" integrity sha512-H4H75TKGUFij8ukwEYWEERAgrUf16R8NSK1uDPe3QwxT8mnE1K8+/s6DVjUqbM5Pv6lSIcE4XufXdlSX+DTB6g== -babel-plugin-htmlbars-inline-precompile@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-3.0.0.tgz#95aa0d2379347cda9a7127c028fe35cb39179fa2" - integrity sha512-dR12lOqIcBLOTwgnI5iG+bSrZhR8JIZ7zAHW43YhcD5q8G8iipvSuRo8Fah6NPPh6C8cATd827bgPikphbF09w== +babel-plugin-htmlbars-inline-precompile@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-3.0.1.tgz#e1e38a4087f446578e419a21c112530c8df02345" + integrity sha512-ZiFY0nQjtdMPGIDwp/5LYOs6rCr54QfcSV5nPbrA7C++Fv4Vb2Q/qrKYx78t+dwmARJztnOBlObFk4z8veHxNA== babel-plugin-module-resolver@^3.1.1: version "3.2.0" @@ -3461,7 +3461,7 @@ broccoli-plugin@1.1.0: rimraf "^2.3.4" symlink-or-copy "^1.0.1" -"broccoli-plugin@1.3.1 - 3", broccoli-plugin@^3.0.0: +"broccoli-plugin@1.3.1 - 3", broccoli-plugin@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-3.1.0.tgz#54ba6dd90a42ec3db5624063292610e326b1e542" integrity sha512-7w7FP8WJYjLvb0eaw27LO678TGGaom++49O1VYIuzjhXjK5kn2+AMlDm7CaUFw4F7CLGoVQeZ84d8gICMJa4lA== @@ -5653,15 +5653,15 @@ ember-cli-htmlbars@^3.0.0, ember-cli-htmlbars@^3.0.1: strip-bom "^3.0.0" ember-cli-htmlbars@^4.0.5, ember-cli-htmlbars@^4.0.7: - version "4.2.0" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.2.0.tgz#a3694ab31f6d571c45786a3041b9c76e4eb30989" - integrity sha512-YymJLg/rRiclK5jxbTFpaRNlbS+f3SY6SplnMExjcrcbSjMRsBuams50+mppENEu7iKfd6PBqH3FHVbYsukHSQ== + version "4.2.2" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.2.2.tgz#3db341a0c866b6e16919db071be9592b9702f014" + integrity sha512-xhVYhdbS2H+XNHzSYfOZKRFIpZ8zOrNGMuAc7vJd6oUE8Aad2r5xjncIVQDioPp8sQfUpXt0uvkUZaOll/thXw== dependencies: - "@ember/edition-utils" "^1.1.1" - babel-plugin-htmlbars-inline-precompile "^3.0.0" + "@ember/edition-utils" "^1.2.0" + babel-plugin-htmlbars-inline-precompile "^3.0.1" broccoli-debug "^0.6.5" broccoli-persistent-filter "^2.3.1" - broccoli-plugin "^3.0.0" + broccoli-plugin "^3.1.0" common-tags "^1.8.0" ember-cli-babel-plugin-helpers "^1.1.0" fs-tree-diff "^2.0.1" From fa3e81f039701bdf59dda205f155f8c1c16551db Mon Sep 17 00:00:00 2001 From: Matt Gardner Date: Fri, 17 Jan 2020 14:52:42 -0500 Subject: [PATCH 619/879] Fix documentation to use the correct variable (#1873) --- tests/dummy/app/pods/docs/testing/assertions/template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dummy/app/pods/docs/testing/assertions/template.md b/tests/dummy/app/pods/docs/testing/assertions/template.md index 74823ffb6..af37486dd 100644 --- a/tests/dummy/app/pods/docs/testing/assertions/template.md +++ b/tests/dummy/app/pods/docs/testing/assertions/template.md @@ -89,7 +89,7 @@ test("I can filter the table", async function(assert) { assert.dom('tr').exists({ count: 5 }); // Also assert against the HTTP request count & query - let requests = server.pretender.handledRequests; + let requests = this.server.pretender.handledRequests; assert.equal(requests.length, 1); assert.deepEqual(requests[0].queryParams, { 'filter[genre]': 'Sci-Fi' }); }); From 6515e3996a3938ce5e3221de4c4ce67de3fd34b3 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 21 Jan 2020 07:07:30 +0000 Subject: [PATCH 620/879] build(deps-dev): bump ember-composable-helpers from 3.0.3 to 3.1.0 Bumps [ember-composable-helpers](https://github.com/DockYard/ember-composable-helpers) from 3.0.3 to 3.1.0. - [Release notes](https://github.com/DockYard/ember-composable-helpers/releases) - [Commits](https://github.com/DockYard/ember-composable-helpers/compare/v3.0.3...v3.1.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 123b1379a..d6252853c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6020,9 +6020,9 @@ ember-composable-helpers@^2.3.1: resolve "^1.10.0" ember-composable-helpers@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-3.0.3.tgz#bcb0d33690868067aeea38b879dab41e279f5d33" - integrity sha512-uNZm9EJQFGLBNUYm2es+hdS0vGLgSHiqXdSvFQ11y/B3nBkV4noocYqseF+wXoGuhB5di74zpB9Nty/E0mzuWw== + version "3.1.0" + resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-3.1.0.tgz#c15f6bf8c878ea16a4b3fed41b9e8ff13c8ae13d" + integrity sha512-A/UhryodDMCxk6wC8t7xjqZBV/jtkTzamr58Y44MZbtoxPM7FGMLNCABV8NxUe/46k+a3cazuV1dJ3MciOTvvg== dependencies: "@babel/core" "^7.0.0" broccoli-funnel "2.0.1" From 34cbee65ced87f64ba7fe0f76c7a55696fd58a5b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2020 07:13:00 +0000 Subject: [PATCH 621/879] build(deps): bump ember-cli-babel from 7.13.2 to 7.14.1 Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 7.13.2 to 7.14.1. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v7.13.2...v7.14.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 1147 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 699 insertions(+), 448 deletions(-) diff --git a/yarn.lock b/yarn.lock index d6252853c..6be03726e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14,20 +14,37 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.2.2", "@babel/core@^7.3.3", "@babel/core@^7.3.4", "@babel/core@^7.7.0": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.4.tgz#37e864532200cb6b50ee9a4045f5f817840166ab" - integrity sha512-+bYbx56j4nYBmpsWtnPUsKW3NdnYxbqyfrP2w9wILBuHzdfIKz9prieZK0DFPyIzkjYVUe4QkusGL07r5pXznQ== +"@babel/code-frame@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" + integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.7.4" - "@babel/helpers" "^7.7.4" - "@babel/parser" "^7.7.4" - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" + "@babel/highlight" "^7.8.3" + +"@babel/compat-data@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.8.4.tgz#bbe65d05a291667a8394fe8a0e0e277ef22b0d2a" + integrity sha512-lHLhlsvFjJAqNU71b7k6Vv9ewjmTXKvqaMv7n0G1etdCabWLw3nEYE8mmgoVOxMIFE07xOvo7H7XBASirX6Rrg== + dependencies: + browserslist "^4.8.5" + invariant "^2.2.4" + semver "^5.5.0" + +"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.2.2", "@babel/core@^7.3.4", "@babel/core@^7.8.3": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.4.tgz#d496799e5c12195b3602d0fddd77294e3e38e80e" + integrity sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.8.4" + "@babel/helpers" "^7.8.4" + "@babel/parser" "^7.8.4" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.4" + "@babel/types" "^7.8.3" convert-source-map "^1.7.0" debug "^4.1.0" + gensync "^1.0.0-beta.1" json5 "^2.1.0" lodash "^4.17.13" resolve "^1.3.2" @@ -44,29 +61,50 @@ lodash "^4.17.13" source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.4.tgz#bb3faf1e74b74bd547e867e48f551fa6b098b6ce" - integrity sha512-2BQmQgECKzYKFPpiycoF9tlb5HA4lrVyAmLLVK177EcQAqjVLciUb2/R+n1boQ9y5ENV3uz2ZqiNw7QMBBw1Og== +"@babel/generator@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.4.tgz#35bbc74486956fe4251829f9f6c48330e8d0985e" + integrity sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA== dependencies: - "@babel/types" "^7.7.4" + "@babel/types" "^7.8.3" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.4.tgz#5f73f2b28580e224b5b9bd03146a4015d6217f5f" - integrity sha512-Biq/d/WtvfftWZ9Uf39hbPBYDUo986m5Bb4zhkeYDGUllF43D+nUe5M6Vuo6/8JDK/0YX/uBdeoQpyaNhNugZQ== +"@babel/helper-annotate-as-pure@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" + integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw== dependencies: - "@babel/helper-explode-assignable-expression" "^7.7.4" - "@babel/types" "^7.7.4" + "@babel/types" "^7.8.3" -"@babel/helper-call-delegate@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.7.4.tgz#621b83e596722b50c0066f9dc37d3232e461b801" - integrity sha512-8JH9/B7J7tCYJ2PpWVpw9JhPuEVHztagNVuQAFBVFYluRMlpG7F1CgKEgGeL6KFqcsIa92ZYVj6DSc0XwmN1ZA== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" + integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw== dependencies: - "@babel/helper-hoist-variables" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" + "@babel/helper-explode-assignable-expression" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-call-delegate@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz#de82619898aa605d409c42be6ffb8d7204579692" + integrity sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A== + dependencies: + "@babel/helper-hoist-variables" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-compilation-targets@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.4.tgz#03d7ecd454b7ebe19a254f76617e61770aed2c88" + integrity sha512-3k3BsKMvPp5bjxgMdrFyq0UaEO48HciVrOVF0+lon8pp95cyJ2ujAh0TrBHNMnJGT2rr0iKOJPFFbSqjDyf/Pg== + dependencies: + "@babel/compat-data" "^7.8.4" + browserslist "^4.8.5" + invariant "^2.2.4" + levenary "^1.1.1" + semver "^5.5.0" "@babel/helper-create-class-features-plugin@^7.7.4": version "7.7.4" @@ -80,30 +118,42 @@ "@babel/helper-replace-supers" "^7.7.4" "@babel/helper-split-export-declaration" "^7.7.4" -"@babel/helper-create-regexp-features-plugin@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.4.tgz#6d5762359fd34f4da1500e4cff9955b5299aaf59" - integrity sha512-Mt+jBKaxL0zfOIWrfQpnfYCN7/rS6GKx6CCCfuoqVVd+17R8zNDlzVYmIi9qyb2wOk002NsmSTDymkIygDUH7A== +"@babel/helper-create-class-features-plugin@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz#5b94be88c255f140fd2c10dd151e7f98f4bff397" + integrity sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + +"@babel/helper-create-regexp-features-plugin@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz#c774268c95ec07ee92476a3862b75cc2839beb79" + integrity sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q== dependencies: - "@babel/helper-regex" "^7.4.4" + "@babel/helper-regex" "^7.8.3" regexpu-core "^4.6.0" -"@babel/helper-define-map@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.7.4.tgz#2841bf92eb8bd9c906851546fe6b9d45e162f176" - integrity sha512-v5LorqOa0nVQUvAUTUF3KPastvUt/HzByXNamKQ6RdJRTV7j8rLL+WB5C/MzzWAwOomxDhYFb1wLLxHqox86lg== +"@babel/helper-define-map@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15" + integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== dependencies: - "@babel/helper-function-name" "^7.7.4" - "@babel/types" "^7.7.4" + "@babel/helper-function-name" "^7.8.3" + "@babel/types" "^7.8.3" lodash "^4.17.13" -"@babel/helper-explode-assignable-expression@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.4.tgz#fa700878e008d85dc51ba43e9fb835cddfe05c84" - integrity sha512-2/SicuFrNSXsZNBxe5UGdLr+HZg+raWBLE9vC98bdYOKX/U6PY0mdGlYUJdtTDPSU0Lw0PNbKKDpwYHJLn2jLg== +"@babel/helper-explode-assignable-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" + integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw== dependencies: - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" "@babel/helper-function-name@^7.7.4": version "7.7.4" @@ -114,6 +164,15 @@ "@babel/template" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-function-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" + integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== + dependencies: + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" + "@babel/helper-get-function-arity@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz#cb46348d2f8808e632f0ab048172130e636005f0" @@ -121,12 +180,19 @@ dependencies: "@babel/types" "^7.7.4" -"@babel/helper-hoist-variables@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.4.tgz#612384e3d823fdfaaf9fce31550fe5d4db0f3d12" - integrity sha512-wQC4xyvc1Jo/FnLirL6CEgPgPCa8M74tOdjWpRhQYapz5JC7u3NYU1zCVoVAGCE3EaIP9T1A3iW0WLJ+reZlpQ== +"@babel/helper-get-function-arity@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" + integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== dependencies: - "@babel/types" "^7.7.4" + "@babel/types" "^7.8.3" + +"@babel/helper-hoist-variables@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134" + integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg== + dependencies: + "@babel/types" "^7.8.3" "@babel/helper-member-expression-to-functions@^7.7.4": version "7.7.4" @@ -135,23 +201,37 @@ dependencies: "@babel/types" "^7.7.4" -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.7.4": +"@babel/helper-member-expression-to-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" + integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-module-imports@^7.0.0": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz#e5a92529f8888bf319a6376abfbd1cebc491ad91" integrity sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ== dependencies: "@babel/types" "^7.7.4" -"@babel/helper-module-transforms@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.4.tgz#8d7cdb1e1f8ea3d8c38b067345924ac4f8e0879a" - integrity sha512-ehGBu4mXrhs0FxAqN8tWkzF8GSIGAiEumu4ONZ/hD9M88uHcD+Yu2ttKfOCgwzoesJOJrtQh7trI5YPbRtMmnA== +"@babel/helper-module-imports@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" + integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== dependencies: - "@babel/helper-module-imports" "^7.7.4" - "@babel/helper-simple-access" "^7.7.4" - "@babel/helper-split-export-declaration" "^7.7.4" - "@babel/template" "^7.7.4" - "@babel/types" "^7.7.4" + "@babel/types" "^7.8.3" + +"@babel/helper-module-transforms@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz#d305e35d02bee720fbc2c3c3623aa0c316c01590" + integrity sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-simple-access" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" lodash "^4.17.13" "@babel/helper-optimise-call-expression@^7.7.4": @@ -161,28 +241,40 @@ dependencies: "@babel/types" "^7.7.4" +"@babel/helper-optimise-call-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" + integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== + dependencies: + "@babel/types" "^7.8.3" + "@babel/helper-plugin-utils@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== -"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" - integrity sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw== +"@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" + integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== + +"@babel/helper-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" + integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ== dependencies: lodash "^4.17.13" -"@babel/helper-remap-async-to-generator@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.4.tgz#c68c2407350d9af0e061ed6726afb4fff16d0234" - integrity sha512-Sk4xmtVdM9sA/jCI80f+KS+Md+ZHIpjuqmYPk1M7F/upHou5e4ReYmExAiu6PVe65BhJPZA2CY9x9k4BqE5klw== +"@babel/helper-remap-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86" + integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA== dependencies: - "@babel/helper-annotate-as-pure" "^7.7.4" - "@babel/helper-wrap-function" "^7.7.4" - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-wrap-function" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" "@babel/helper-replace-supers@^7.7.4": version "7.7.4" @@ -194,13 +286,23 @@ "@babel/traverse" "^7.7.4" "@babel/types" "^7.7.4" -"@babel/helper-simple-access@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.7.4.tgz#a169a0adb1b5f418cfc19f22586b2ebf58a9a294" - integrity sha512-zK7THeEXfan7UlWsG2A6CI/L9jVnI5+xxKZOdej39Y0YtDYKx9raHk5F2EtK9K8DHRTihYwg20ADt9S36GR78A== +"@babel/helper-replace-supers@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz#91192d25f6abbcd41da8a989d4492574fb1530bc" + integrity sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA== dependencies: - "@babel/template" "^7.7.4" - "@babel/types" "^7.7.4" + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-simple-access@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" + integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== + dependencies: + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" "@babel/helper-split-export-declaration@^7.7.4": version "7.7.4" @@ -209,24 +311,31 @@ dependencies: "@babel/types" "^7.7.4" -"@babel/helper-wrap-function@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz#37ab7fed5150e22d9d7266e830072c0cdd8baace" - integrity sha512-VsfzZt6wmsocOaVU0OokwrIytHND55yvyT4BPB9AIIgwr8+x7617hetdJTsuGwygN5RC6mxA9EJztTjuwm2ofg== +"@babel/helper-split-export-declaration@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" + integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== dependencies: - "@babel/helper-function-name" "^7.7.4" - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" + "@babel/types" "^7.8.3" -"@babel/helpers@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.4.tgz#62c215b9e6c712dadc15a9a0dcab76c92a940302" - integrity sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg== +"@babel/helper-wrap-function@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" + integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ== dependencies: - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" + "@babel/helper-function-name" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helpers@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.4.tgz#754eb3ee727c165e0a240d6c207de7c455f36f73" + integrity sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w== + dependencies: + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.4" + "@babel/types" "^7.8.3" "@babel/highlight@^7.0.0": version "7.5.0" @@ -237,52 +346,66 @@ esutils "^2.0.2" js-tokens "^4.0.0" +"@babel/highlight@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797" + integrity sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + "@babel/parser@^7.0.0", "@babel/parser@^7.3.4", "@babel/parser@^7.4.5", "@babel/parser@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.4.tgz#75ab2d7110c2cf2fa949959afb05fa346d2231bb" integrity sha512-jIwvLO0zCL+O/LmEJQjWA75MQTWwx3c3u2JOTDK5D3/9egrWRRA0/0hk9XXywYnXZVVpzrBYeIQTmhwUaePI9g== -"@babel/plugin-proposal-async-generator-functions@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.4.tgz#0351c5ac0a9e927845fffd5b82af476947b7ce6d" - integrity sha512-1ypyZvGRXriY/QP668+s8sFr2mqinhkRDMPSQLNghCQE+GAkFtp+wkHVvg2+Hdki8gwP+NFzJBJ/N1BfzCCDEw== +"@babel/parser@^7.8.3", "@babel/parser@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.4.tgz#d1dbe64691d60358a974295fa53da074dd2ce8e8" + integrity sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw== + +"@babel/plugin-proposal-async-generator-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" + integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.7.4" - "@babel/plugin-syntax-async-generators" "^7.7.4" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-remap-async-to-generator" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" -"@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.3.4", "@babel/plugin-proposal-class-properties@^7.7.0": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.4.tgz#2f964f0cb18b948450362742e33e15211e77c2ba" - integrity sha512-EcuXeV4Hv1X3+Q1TsuOmyyxeTRiSqurGJ26+I/FW1WbymmRRapVORm6x1Zl3iDIHyRxEs+VXWp6qnlcfcJSbbw== +"@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.3.4", "@babel/plugin-proposal-class-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e" + integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-create-class-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-proposal-decorators@^7.3.0", "@babel/plugin-proposal-decorators@^7.7.0": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.7.4.tgz#58c1e21d21ea12f9f5f0a757e46e687b94a7ab2b" - integrity sha512-GftcVDcLCwVdzKmwOBDjATd548+IE+mBo7ttgatqNDR7VG7GqIuZPtRWlMLHbhTXhcnFZiGER8iIYl1n/imtsg== +"@babel/plugin-proposal-decorators@^7.3.0", "@babel/plugin-proposal-decorators@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz#2156860ab65c5abf068c3f67042184041066543e" + integrity sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w== dependencies: - "@babel/helper-create-class-features-plugin" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-decorators" "^7.7.4" + "@babel/helper-create-class-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-decorators" "^7.8.3" -"@babel/plugin-proposal-dynamic-import@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.4.tgz#dde64a7f127691758cbfed6cf70de0fa5879d52d" - integrity sha512-StH+nGAdO6qDB1l8sZ5UBV8AC3F2VW2I8Vfld73TMKyptMU9DY5YsJAS8U81+vEtxcH3Y/La0wG0btDrhpnhjQ== +"@babel/plugin-proposal-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" + integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-dynamic-import" "^7.7.4" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" -"@babel/plugin-proposal-json-strings@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.7.4.tgz#7700a6bfda771d8dc81973249eac416c6b4c697d" - integrity sha512-wQvt3akcBTfLU/wYoqm/ws7YOAQKu8EVJEvHip/mzkNtjaclQoCCIqKXFP5/eyfnfbQCDV3OLRIK3mIVyXuZlw== +"@babel/plugin-proposal-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" + integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-json-strings" "^7.7.4" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" "@babel/plugin-proposal-nullish-coalescing-operator@^7.4.4": version "7.7.4" @@ -292,21 +415,29 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.7.4" -"@babel/plugin-proposal-object-rest-spread@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.4.tgz#cc57849894a5c774214178c8ab64f6334ec8af71" - integrity sha512-rnpnZR3/iWKmiQyJ3LKJpSwLDcX/nSXhdLk4Aq/tXOApIvyu7qoabrige0ylsAJffaUC51WiBu209Q0U+86OWQ== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" + integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.7.4" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/plugin-proposal-optional-catch-binding@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.7.4.tgz#ec21e8aeb09ec6711bc0a39ca49520abee1de379" - integrity sha512-DyM7U2bnsQerCQ+sejcTNZh8KQEUuC3ufzdnVnSiUv/qoGJp2Z3hanKL18KDhsBT5Wj6a7CMT5mdyCNJsEaA9w== +"@babel/plugin-proposal-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz#eb5ae366118ddca67bed583b53d7554cad9951bb" + integrity sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.7.4" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" + integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" "@babel/plugin-proposal-optional-chaining@^7.6.0": version "7.7.4" @@ -316,41 +447,56 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-chaining" "^7.7.4" -"@babel/plugin-proposal-unicode-property-regex@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.4.tgz#7c239ccaf09470dbe1d453d50057460e84517ebb" - integrity sha512-cHgqHgYvffluZk85dJ02vloErm3Y6xtH+2noOBOJ2kXOJH3aVCDnj5eR/lVNlTnYu4hndAPJD3rTFjW3qee0PA== +"@babel/plugin-proposal-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz#ae10b3214cb25f7adb1f3bc87ba42ca10b7e2543" + integrity sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-syntax-async-generators@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.7.4.tgz#331aaf310a10c80c44a66b238b6e49132bd3c889" - integrity sha512-Li4+EjSpBgxcsmeEF8IFcfV/+yJGxHXDirDkEoyFjumuwbmfCVHUt0HuowD/iGM7OhIRyXJH9YXxqiH6N815+g== +"@babel/plugin-proposal-unicode-property-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz#b646c3adea5f98800c9ab45105ac34d06cd4a47f" + integrity sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-decorators@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.7.4.tgz#3c91cfee2a111663ff3ac21b851140f5a52a4e0b" - integrity sha512-0oNLWNH4k5ZbBVfAwiTU53rKFWIeTh6ZlaWOXWJc4ywxs0tjz5fc3uZ6jKAnZSxN98eXVgg7bJIuzjX+3SXY+A== +"@babel/plugin-syntax-async-generators@^7.8.0": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-decorators@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz#8d2c15a9f1af624b0025f961682a9d53d3001bda" + integrity sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-dynamic-import@^7.2.0", "@babel/plugin-syntax-dynamic-import@^7.7.4": +"@babel/plugin-syntax-dynamic-import@^7.2.0": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz#29ca3b4415abfe4a5ec381e903862ad1a54c3aec" integrity sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-json-strings@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.7.4.tgz#86e63f7d2e22f9e27129ac4e83ea989a382e86cc" - integrity sha512-QpGupahTQW1mHRXddMG5srgpHWqRLwJnJZKXTigB9RPFCCGbDGCgBeM/iC82ICXp414WeYx/tD54w7M2qRqTMg== +"@babel/plugin-syntax-dynamic-import@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-json-strings@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-nullish-coalescing-operator@^7.7.4": version "7.7.4" @@ -359,19 +505,26 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-object-rest-spread@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz#47cf220d19d6d0d7b154304701f468fc1cc6ff46" - integrity sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg== +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-catch-binding@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.7.4.tgz#a3e38f59f4b6233867b4a92dcb0ee05b2c334aa6" - integrity sha512-4ZSuzWgFxqHRE31Glu+fEr/MirNZOMYmD/0BhBWyLyOOQz/gTAl7QmWm2hX1QxEIXsr2vkdlwxIzTyiYRC4xcQ== +"@babel/plugin-syntax-object-rest-spread@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.7.4": version "7.7.4" @@ -380,12 +533,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-top-level-await@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.4.tgz#bd7d8fa7b9fee793a36e4027fd6dd1aa32f946da" - integrity sha512-wdsOw0MvkL1UIgiQ/IFr3ETcfv1xb8RMM0H9wbiDyLaJFyiDg5oZvDLCXosIXmFeIlweML5iOBXAkqddkYNizg== +"@babel/plugin-syntax-optional-chaining@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391" + integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-typescript@^7.2.0", "@babel/plugin-syntax-typescript@^7.7.4": version "7.7.4" @@ -394,30 +554,30 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-arrow-functions@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.7.4.tgz#76309bd578addd8aee3b379d809c802305a98a12" - integrity sha512-zUXy3e8jBNPiffmqkHRNDdZM2r8DWhCB7HhcoyZjiK1TxYEluLHAvQuYnTT+ARqRpabWqy/NHkO6e3MsYB5YfA== +"@babel/plugin-transform-arrow-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" + integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-async-to-generator@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.4.tgz#694cbeae6d613a34ef0292713fa42fb45c4470ba" - integrity sha512-zpUTZphp5nHokuy8yLlyafxCJ0rSlFoSHypTUWgpdwoDXWQcseaect7cJ8Ppk6nunOM6+5rPMkod4OYKPR5MUg== +"@babel/plugin-transform-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" + integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ== dependencies: - "@babel/helper-module-imports" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.7.4" + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-remap-async-to-generator" "^7.8.3" -"@babel/plugin-transform-block-scoped-functions@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.7.4.tgz#d0d9d5c269c78eaea76227ace214b8d01e4d837b" - integrity sha512-kqtQzwtKcpPclHYjLK//3lH8OFsCDuDJBaFhVwf8kqdnF6MN4l618UDlcA7TfRs3FayrHj+svYnSX8MC9zmUyQ== +"@babel/plugin-transform-block-scoped-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" + integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-block-scoping@^7.6.0", "@babel/plugin-transform-block-scoping@^7.6.2", "@babel/plugin-transform-block-scoping@^7.7.4": +"@babel/plugin-transform-block-scoping@^7.6.0", "@babel/plugin-transform-block-scoping@^7.6.2": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz#200aad0dcd6bb80372f94d9e628ea062c58bf224" integrity sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg== @@ -425,135 +585,144 @@ "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.13" -"@babel/plugin-transform-classes@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.4.tgz#c92c14be0a1399e15df72667067a8f510c9400ec" - integrity sha512-sK1mjWat7K+buWRuImEzjNf68qrKcrddtpQo3swi9j7dUcG6y6R6+Di039QN2bD1dykeswlagupEmpOatFHHUg== +"@babel/plugin-transform-block-scoping@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" + integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== dependencies: - "@babel/helper-annotate-as-pure" "^7.7.4" - "@babel/helper-define-map" "^7.7.4" - "@babel/helper-function-name" "^7.7.4" - "@babel/helper-optimise-call-expression" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.7.4" - "@babel/helper-split-export-declaration" "^7.7.4" + "@babel/helper-plugin-utils" "^7.8.3" + lodash "^4.17.13" + +"@babel/plugin-transform-classes@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz#46fd7a9d2bb9ea89ce88720477979fe0d71b21b8" + integrity sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-define-map" "^7.8.3" + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.7.4.tgz#e856c1628d3238ffe12d668eb42559f79a81910d" - integrity sha512-bSNsOsZnlpLLyQew35rl4Fma3yKWqK3ImWMSC/Nc+6nGjC9s5NFWAer1YQ899/6s9HxO2zQC1WoFNfkOqRkqRQ== +"@babel/plugin-transform-computed-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" + integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-destructuring@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz#2b713729e5054a1135097b6a67da1b6fe8789267" - integrity sha512-4jFMXI1Cu2aXbcXXl8Lr6YubCn6Oc7k9lLsu8v61TZh+1jny2BWmdtvY9zSUlLdGUvcy9DMAWyZEOqjsbeg/wA== +"@babel/plugin-transform-destructuring@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz#20ddfbd9e4676906b1056ee60af88590cc7aaa0b" + integrity sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-dotall-regex@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.4.tgz#f7ccda61118c5b7a2599a72d5e3210884a021e96" - integrity sha512-mk0cH1zyMa/XHeb6LOTXTbG7uIJ8Rrjlzu91pUx/KS3JpcgaTDwMS8kM+ar8SLOvlL2Lofi4CGBAjCo3a2x+lw== +"@babel/plugin-transform-dotall-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" + integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-duplicate-keys@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.7.4.tgz#3d21731a42e3f598a73835299dd0169c3b90ac91" - integrity sha512-g1y4/G6xGWMD85Tlft5XedGaZBCIVN+/P0bs6eabmcPP9egFleMAo65OOjlhcz1njpwagyY3t0nsQC9oTFegJA== +"@babel/plugin-transform-duplicate-keys@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" + integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-exponentiation-operator@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.7.4.tgz#dd30c0191e3a1ba19bcc7e389bdfddc0729d5db9" - integrity sha512-MCqiLfCKm6KEA1dglf6Uqq1ElDIZwFuzz1WH5mTf8k2uQSxEJMbOIEh7IZv7uichr7PMfi5YVSrr1vz+ipp7AQ== +"@babel/plugin-transform-exponentiation-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" + integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-for-of@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.7.4.tgz#248800e3a5e507b1f103d8b4ca998e77c63932bc" - integrity sha512-zZ1fD1B8keYtEcKF+M1TROfeHTKnijcVQm0yO/Yu1f7qoDoxEIc/+GX6Go430Bg84eM/xwPFp0+h4EbZg7epAA== +"@babel/plugin-transform-for-of@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz#6fe8eae5d6875086ee185dd0b098a8513783b47d" + integrity sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-function-name@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.4.tgz#75a6d3303d50db638ff8b5385d12451c865025b1" - integrity sha512-E/x09TvjHNhsULs2IusN+aJNRV5zKwxu1cpirZyRPw+FyyIKEHPXTsadj48bVpc1R5Qq1B5ZkzumuFLytnbT6g== +"@babel/plugin-transform-function-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" + integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== dependencies: - "@babel/helper-function-name" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-literals@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.7.4.tgz#27fe87d2b5017a2a5a34d1c41a6b9f6a6262643e" - integrity sha512-X2MSV7LfJFm4aZfxd0yLVFrEXAgPqYoDG53Br/tCKiKYfX0MjVjQeWPIhPHHsCqzwQANq+FLN786fF5rgLS+gw== +"@babel/plugin-transform-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" + integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-member-expression-literals@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.7.4.tgz#aee127f2f3339fc34ce5e3055d7ffbf7aa26f19a" - integrity sha512-9VMwMO7i69LHTesL0RdGy93JU6a+qOPuvB4F4d0kR0zyVjJRVJRaoaGjhtki6SzQUu8yen/vxPKN6CWnCUw6bA== +"@babel/plugin-transform-member-expression-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" + integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-modules-amd@^7.0.0", "@babel/plugin-transform-modules-amd@^7.5.0", "@babel/plugin-transform-modules-amd@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.4.tgz#276b3845ca2b228f2995e453adc2e6f54d72fb71" - integrity sha512-/542/5LNA18YDtg1F+QHvvUSlxdvjZoD/aldQwkq+E3WCkbEjNSN9zdrOXaSlfg3IfGi22ijzecklF/A7kVZFQ== +"@babel/plugin-transform-modules-amd@^7.0.0", "@babel/plugin-transform-modules-amd@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz#65606d44616b50225e76f5578f33c568a0b876a5" + integrity sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ== dependencies: - "@babel/helper-module-transforms" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-commonjs@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.4.tgz#bee4386e550446343dd52a571eda47851ff857a3" - integrity sha512-k8iVS7Jhc367IcNF53KCwIXtKAH7czev866ThsTgy8CwlXjnKZna2VHwChglzLleYrcHz1eQEIJlGRQxB53nqA== +"@babel/plugin-transform-modules-commonjs@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz#df251706ec331bd058a34bdd72613915f82928a5" + integrity sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg== dependencies: - "@babel/helper-module-transforms" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-simple-access" "^7.7.4" + "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-simple-access" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-systemjs@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.4.tgz#cd98152339d3e763dfe838b7d4273edaf520bb30" - integrity sha512-y2c96hmcsUi6LrMqvmNDPBBiGCiQu0aYqpHatVVu6kD4mFEXKjyNxd/drc18XXAf9dv7UXjrZwBVmTTGaGP8iw== +"@babel/plugin-transform-modules-systemjs@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz#d8bbf222c1dbe3661f440f2f00c16e9bb7d0d420" + integrity sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg== dependencies: - "@babel/helper-hoist-variables" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-hoist-variables" "^7.8.3" + "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-umd@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.4.tgz#1027c355a118de0aae9fee00ad7813c584d9061f" - integrity sha512-u2B8TIi0qZI4j8q4C51ktfO7E3cQ0qnaXFI1/OXITordD40tt17g/sXqgNNCcMTcBFKrUPcGDx+TBJuZxLx7tw== +"@babel/plugin-transform-modules-umd@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz#592d578ce06c52f5b98b02f913d653ffe972661a" + integrity sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw== dependencies: - "@babel/helper-module-transforms" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-named-capturing-groups-regex@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.4.tgz#fb3bcc4ee4198e7385805007373d6b6f42c98220" - integrity sha512-jBUkiqLKvUWpv9GLSuHUFYdmHg0ujC1JEYoZUfeOOfNydZXp1sXObgyPatpcwjWgsdBGsagWW0cdJpX/DO2jMw== +"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" + integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.7.4" + "@babel/helper-create-regexp-features-plugin" "^7.8.3" -"@babel/plugin-transform-new-target@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.7.4.tgz#4a0753d2d60639437be07b592a9e58ee00720167" - integrity sha512-CnPRiNtOG1vRodnsyGX37bHQleHE14B9dnnlgSeEs3ek3fHN1A1SScglTCg1sfbe7sRQ2BUcpgpTpWSfMKz3gg== +"@babel/plugin-transform-new-target@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" + integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-object-assign@^7.2.0": version "7.7.4" @@ -562,90 +731,90 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-object-super@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.7.4.tgz#48488937a2d586c0148451bf51af9d7dda567262" - integrity sha512-ho+dAEhC2aRnff2JCA0SAK7V2R62zJd/7dmtoe7MHcso4C2mS+vZjn1Pb1pCVZvJs1mgsvv5+7sT+m3Bysb6eg== +"@babel/plugin-transform-object-super@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" + integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.7.4" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.3" -"@babel/plugin-transform-parameters@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.4.tgz#da4555c97f39b51ac089d31c7380f03bca4075ce" - integrity sha512-VJwhVePWPa0DqE9vcfptaJSzNDKrWU/4FbYCjZERtmqEs05g3UMXnYMZoXja7JAJ7Y7sPZipwm/pGApZt7wHlw== +"@babel/plugin-transform-parameters@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz#1d5155de0b65db0ccf9971165745d3bb990d77d3" + integrity sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA== dependencies: - "@babel/helper-call-delegate" "^7.7.4" - "@babel/helper-get-function-arity" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-call-delegate" "^7.8.3" + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-property-literals@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.7.4.tgz#2388d6505ef89b266103f450f9167e6bd73f98c2" - integrity sha512-MatJhlC4iHsIskWYyawl53KuHrt+kALSADLQQ/HkhTjX954fkxIEh4q5slL4oRAnsm/eDoZ4q0CIZpcqBuxhJQ== +"@babel/plugin-transform-property-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" + integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-regenerator@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.4.tgz#d18eac0312a70152d7d914cbed2dc3999601cfc0" - integrity sha512-e7MWl5UJvmPEwFJTwkBlPmqixCtr9yAASBqff4ggXTNicZiwbF8Eefzm6NVgfiBp7JdAGItecnctKTgH44q2Jw== +"@babel/plugin-transform-regenerator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz#b31031e8059c07495bf23614c97f3d9698bc6ec8" + integrity sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA== dependencies: regenerator-transform "^0.14.0" -"@babel/plugin-transform-reserved-words@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.7.4.tgz#6a7cf123ad175bb5c69aec8f6f0770387ed3f1eb" - integrity sha512-OrPiUB5s5XvkCO1lS7D8ZtHcswIC57j62acAnJZKqGGnHP+TIc/ljQSrgdX/QyOTdEK5COAhuc820Hi1q2UgLQ== +"@babel/plugin-transform-reserved-words@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" + integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-runtime@^7.2.0", "@babel/plugin-transform-runtime@^7.6.0": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.7.4.tgz#51fe458c1c1fa98a8b07934f4ed38b6cd62177a6" - integrity sha512-O8kSkS5fP74Ad/8pfsCMGa8sBRdLxYoSReaARRNSz3FbFQj3z/QUvoUmJ28gn9BO93YfnXc3j+Xyaqe8cKDNBQ== +"@babel/plugin-transform-runtime@^7.2.0", "@babel/plugin-transform-runtime@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.8.3.tgz#c0153bc0a5375ebc1f1591cb7eea223adea9f169" + integrity sha512-/vqUt5Yh+cgPZXXjmaG9NT8aVfThKk7G4OqkVhrXqwsC5soMn/qTCxs36rZ2QFhpfTJcjw4SNDIZ4RUb8OL4jQ== dependencies: - "@babel/helper-module-imports" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" resolve "^1.8.1" semver "^5.5.1" -"@babel/plugin-transform-shorthand-properties@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.7.4.tgz#74a0a9b2f6d67a684c6fbfd5f0458eb7ba99891e" - integrity sha512-q+suddWRfIcnyG5YiDP58sT65AJDZSUhXQDZE3r04AuqD6d/XLaQPPXSBzP2zGerkgBivqtQm9XKGLuHqBID6Q== +"@babel/plugin-transform-shorthand-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" + integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-spread@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.7.4.tgz#aa673b356fe6b7e70d69b6e33a17fef641008578" - integrity sha512-8OSs0FLe5/80cndziPlg4R0K6HcWSM0zyNhHhLsmw/Nc5MaA49cAsnoJ/t/YZf8qkG7fD+UjTRaApVDB526d7Q== +"@babel/plugin-transform-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" + integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-sticky-regex@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.7.4.tgz#ffb68c05090c30732076b1285dc1401b404a123c" - integrity sha512-Ls2NASyL6qtVe1H1hXts9yuEeONV2TJZmplLONkMPUG158CtmnrzW5Q5teibM5UVOFjG0D3IC5mzXR6pPpUY7A== +"@babel/plugin-transform-sticky-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" + integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-regex" "^7.8.3" -"@babel/plugin-transform-template-literals@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.7.4.tgz#1eb6411736dd3fe87dbd20cc6668e5121c17d604" - integrity sha512-sA+KxLwF3QwGj5abMHkHgshp9+rRz+oY9uoRil4CyLtgEuE/88dpkeWgNk5qKVsJE9iSfly3nvHapdRiIS2wnQ== +"@babel/plugin-transform-template-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" + integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-typeof-symbol@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.7.4.tgz#3174626214f2d6de322882e498a38e8371b2140e" - integrity sha512-KQPUQ/7mqe2m0B8VecdyaW5XcQYaePyl9R7IsKd+irzj6jvbhoGnRE+M0aNkyAzI07VfUQ9266L5xMARitV3wg== +"@babel/plugin-transform-typeof-symbol@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412" + integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-typescript@~7.4.0": version "7.4.5" @@ -664,83 +833,89 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-typescript" "^7.7.4" -"@babel/plugin-transform-unicode-regex@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.4.tgz#a3c0f65b117c4c81c5b6484f2a5e7b95346b83ae" - integrity sha512-N77UUIV+WCvE+5yHw+oks3m18/umd7y392Zv7mYTpFqHtkpcc+QUz+gLJNTWVlWROIWeLqY0f3OjZxV5TcXnRw== +"@babel/plugin-transform-unicode-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" + integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/polyfill@^7.0.0", "@babel/polyfill@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.7.0.tgz#e1066e251e17606ec7908b05617f9b7f8180d8f3" - integrity sha512-/TS23MVvo34dFmf8mwCisCbWGrfhbiWZSwBo6HkADTBhUa2Q/jWltyY/tpofz/b6/RIhqaqQcquptCirqIhOaQ== +"@babel/polyfill@^7.0.0", "@babel/polyfill@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.8.3.tgz#2333fc2144a542a7c07da39502ceeeb3abe4debd" + integrity sha512-0QEgn2zkCzqGIkSWWAEmvxD7e00Nm9asTtQvi7HdlYvMhjy/J38V/1Y9ode0zEJeIuxAI0uftiAzqc7nVeWUGg== dependencies: core-js "^2.6.5" regenerator-runtime "^0.13.2" -"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.7.0": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.7.4.tgz#ccaf309ae8d1ee2409c85a4e2b5e280ceee830f8" - integrity sha512-Dg+ciGJjwvC1NIe/DGblMbcGq1HOtKbw8RLl4nIjlfcILKEOkWT/vRqPpumswABEBVudii6dnVwrBtzD7ibm4g== - dependencies: - "@babel/helper-module-imports" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-async-generator-functions" "^7.7.4" - "@babel/plugin-proposal-dynamic-import" "^7.7.4" - "@babel/plugin-proposal-json-strings" "^7.7.4" - "@babel/plugin-proposal-object-rest-spread" "^7.7.4" - "@babel/plugin-proposal-optional-catch-binding" "^7.7.4" - "@babel/plugin-proposal-unicode-property-regex" "^7.7.4" - "@babel/plugin-syntax-async-generators" "^7.7.4" - "@babel/plugin-syntax-dynamic-import" "^7.7.4" - "@babel/plugin-syntax-json-strings" "^7.7.4" - "@babel/plugin-syntax-object-rest-spread" "^7.7.4" - "@babel/plugin-syntax-optional-catch-binding" "^7.7.4" - "@babel/plugin-syntax-top-level-await" "^7.7.4" - "@babel/plugin-transform-arrow-functions" "^7.7.4" - "@babel/plugin-transform-async-to-generator" "^7.7.4" - "@babel/plugin-transform-block-scoped-functions" "^7.7.4" - "@babel/plugin-transform-block-scoping" "^7.7.4" - "@babel/plugin-transform-classes" "^7.7.4" - "@babel/plugin-transform-computed-properties" "^7.7.4" - "@babel/plugin-transform-destructuring" "^7.7.4" - "@babel/plugin-transform-dotall-regex" "^7.7.4" - "@babel/plugin-transform-duplicate-keys" "^7.7.4" - "@babel/plugin-transform-exponentiation-operator" "^7.7.4" - "@babel/plugin-transform-for-of" "^7.7.4" - "@babel/plugin-transform-function-name" "^7.7.4" - "@babel/plugin-transform-literals" "^7.7.4" - "@babel/plugin-transform-member-expression-literals" "^7.7.4" - "@babel/plugin-transform-modules-amd" "^7.7.4" - "@babel/plugin-transform-modules-commonjs" "^7.7.4" - "@babel/plugin-transform-modules-systemjs" "^7.7.4" - "@babel/plugin-transform-modules-umd" "^7.7.4" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.7.4" - "@babel/plugin-transform-new-target" "^7.7.4" - "@babel/plugin-transform-object-super" "^7.7.4" - "@babel/plugin-transform-parameters" "^7.7.4" - "@babel/plugin-transform-property-literals" "^7.7.4" - "@babel/plugin-transform-regenerator" "^7.7.4" - "@babel/plugin-transform-reserved-words" "^7.7.4" - "@babel/plugin-transform-shorthand-properties" "^7.7.4" - "@babel/plugin-transform-spread" "^7.7.4" - "@babel/plugin-transform-sticky-regex" "^7.7.4" - "@babel/plugin-transform-template-literals" "^7.7.4" - "@babel/plugin-transform-typeof-symbol" "^7.7.4" - "@babel/plugin-transform-unicode-regex" "^7.7.4" - "@babel/types" "^7.7.4" - browserslist "^4.6.0" - core-js-compat "^3.1.1" +"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.8.3": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.8.4.tgz#9dac6df5f423015d3d49b6e9e5fa3413e4a72c4e" + integrity sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w== + dependencies: + "@babel/compat-data" "^7.8.4" + "@babel/helper-compilation-targets" "^7.8.4" + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-proposal-async-generator-functions" "^7.8.3" + "@babel/plugin-proposal-dynamic-import" "^7.8.3" + "@babel/plugin-proposal-json-strings" "^7.8.3" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-object-rest-spread" "^7.8.3" + "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" + "@babel/plugin-proposal-optional-chaining" "^7.8.3" + "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-transform-arrow-functions" "^7.8.3" + "@babel/plugin-transform-async-to-generator" "^7.8.3" + "@babel/plugin-transform-block-scoped-functions" "^7.8.3" + "@babel/plugin-transform-block-scoping" "^7.8.3" + "@babel/plugin-transform-classes" "^7.8.3" + "@babel/plugin-transform-computed-properties" "^7.8.3" + "@babel/plugin-transform-destructuring" "^7.8.3" + "@babel/plugin-transform-dotall-regex" "^7.8.3" + "@babel/plugin-transform-duplicate-keys" "^7.8.3" + "@babel/plugin-transform-exponentiation-operator" "^7.8.3" + "@babel/plugin-transform-for-of" "^7.8.4" + "@babel/plugin-transform-function-name" "^7.8.3" + "@babel/plugin-transform-literals" "^7.8.3" + "@babel/plugin-transform-member-expression-literals" "^7.8.3" + "@babel/plugin-transform-modules-amd" "^7.8.3" + "@babel/plugin-transform-modules-commonjs" "^7.8.3" + "@babel/plugin-transform-modules-systemjs" "^7.8.3" + "@babel/plugin-transform-modules-umd" "^7.8.3" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" + "@babel/plugin-transform-new-target" "^7.8.3" + "@babel/plugin-transform-object-super" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.8.4" + "@babel/plugin-transform-property-literals" "^7.8.3" + "@babel/plugin-transform-regenerator" "^7.8.3" + "@babel/plugin-transform-reserved-words" "^7.8.3" + "@babel/plugin-transform-shorthand-properties" "^7.8.3" + "@babel/plugin-transform-spread" "^7.8.3" + "@babel/plugin-transform-sticky-regex" "^7.8.3" + "@babel/plugin-transform-template-literals" "^7.8.3" + "@babel/plugin-transform-typeof-symbol" "^7.8.4" + "@babel/plugin-transform-unicode-regex" "^7.8.3" + "@babel/types" "^7.8.3" + browserslist "^4.8.5" + core-js-compat "^3.6.2" invariant "^2.2.2" - js-levenshtein "^1.1.3" + levenary "^1.1.1" semver "^5.5.0" -"@babel/runtime@^7.2.0", "@babel/runtime@^7.7.0": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.4.tgz#b23a856751e4bf099262f867767889c0e3fe175b" - integrity sha512-r24eVUUr0QqNZa+qrImUk8fn5SPhHq+IfYvIoIMg0do3GdK9sMdiLKP3GYVVaxpPKORgm8KRKaNTEhAjgIpLMw== +"@babel/runtime@^7.2.0", "@babel/runtime@^7.8.3": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.4.tgz#d79f5a2040f7caa24d53e563aad49cbc05581308" + integrity sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ== dependencies: regenerator-runtime "^0.13.2" @@ -753,6 +928,15 @@ "@babel/parser" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/template@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.3.tgz#e02ad04fe262a657809327f578056ca15fd4d1b8" + integrity sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/parser" "^7.8.3" + "@babel/types" "^7.8.3" + "@babel/traverse@^7.0.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.2.4", "@babel/traverse@^7.3.4", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.4.tgz#9c1e7c60fb679fe4fcfaa42500833333c2058558" @@ -768,6 +952,21 @@ globals "^11.1.0" lodash "^4.17.13" +"@babel/traverse@^7.8.3", "@babel/traverse@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.4.tgz#f0845822365f9d5b0e312ed3959d3f827f869e3c" + integrity sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.8.4" + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/parser" "^7.8.4" + "@babel/types" "^7.8.3" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + "@babel/types@^7.0.0", "@babel/types@^7.1.6", "@babel/types@^7.3.2", "@babel/types@^7.3.4", "@babel/types@^7.4.0", "@babel/types@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" @@ -777,6 +976,15 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@babel/types@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" + integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + "@ember-data/-build-infra@3.14.0": version "3.14.0" resolved "https://registry.yarnpkg.com/@ember-data/-build-infra/-/-build-infra-3.14.0.tgz#d81242b018038b0bf39bceaa1b0df167398f60b8" @@ -3069,13 +3277,13 @@ broccoli-babel-transpiler@^6.5.0: rsvp "^4.8.2" workerpool "^2.3.0" -broccoli-babel-transpiler@^7.1.2, broccoli-babel-transpiler@^7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.3.0.tgz#a0ad3a37dbf74469664bbca403d652070c2c1317" - integrity sha512-tsXNvDf3gp6g8rGkz234AhbaIRUsCdd6CM3ikfkJVB0EpC8ZAczGsFKTjENLy1etx4s7FkruW/QjI7Wfdhx6Ng== +broccoli-babel-transpiler@^7.1.2, broccoli-babel-transpiler@^7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.4.0.tgz#f3069f0f77e8017aa17e1e757dfb4a30de044182" + integrity sha512-DzPXQr1C+zOgzXG40wqPjtjSSa6wRKb+Ls45Qtq7Pn+GxL3/jIvQOBZi0/irZ5dlYVbRMEZiUnaIBIOha2ygIw== dependencies: - "@babel/core" "^7.3.3" - "@babel/polyfill" "^7.0.0" + "@babel/core" "^7.8.3" + "@babel/polyfill" "^7.8.3" broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.2" broccoli-persistent-filter "^2.2.1" @@ -3800,7 +4008,7 @@ browserslist@^3.2.6: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" -browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.7.3: +browserslist@^4.0.0: version "4.7.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.3.tgz#02341f162b6bcc1e1028e30624815d4924442dc3" integrity sha512-jWvmhqYpx+9EZm/FxcZSbUZyDEvDTLDi3nSAKbzEkyWvtI0mNSmUosey+5awDW1RUlrgXbQb5A6qY1xQH9U6MQ== @@ -3818,6 +4026,15 @@ browserslist@^4.8.0: electron-to-chromium "^1.3.322" node-releases "^1.1.44" +browserslist@^4.8.3, browserslist@^4.8.5: + version "4.8.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.6.tgz#96406f3f5f0755d272e27a66f4163ca821590a7e" + integrity sha512-ZHao85gf0eZ0ESxLfCp73GG9O/VTytYDIkIiZDlURppLTI9wErSM/5yAKEq6rcUdxBLjMELmrYUJGg5sxGKMHg== + dependencies: + caniuse-lite "^1.0.30001023" + electron-to-chromium "^1.3.341" + node-releases "^1.1.47" + bser@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -4022,6 +4239,11 @@ caniuse-lite@^1.0.30001012, caniuse-lite@^1.0.30001017: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001019.tgz#857e3fccaad2b2feb3f1f6d8a8f62d747ea648e1" integrity sha512-6ljkLtF1KM5fQ+5ZN0wuyVvvebJxgJPTmScOMaFuQN2QuOzvRJnWSKfzQskQU5IOU4Gap3zasYPIinzwUjoj/g== +caniuse-lite@^1.0.30001023: + version "1.0.30001023" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001023.tgz#b82155827f3f5009077bdd2df3d8968bcbcc6fc4" + integrity sha512-C5TDMiYG11EOhVOA62W1p3UsJ2z4DsHtMBQtjzp3ZsUglcQn62WOUgW0y795c7A5uZ+GCEIvzkMatLIlAsbNTA== + capture-exit@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" @@ -4606,13 +4828,13 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-compat@^3.1.1: - version "3.4.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.4.2.tgz#652fa7c54652b7f6586a893e37001df55ea2ac37" - integrity sha512-W0Aj+LM3EAxxjD0Kp2o4be8UlnxIZHNupBv2znqrheR4aY2nOn91794k/xoSp+SxqqriiZpTsSwBtZr60cbkwQ== +core-js-compat@^3.6.2: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17" + integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA== dependencies: - browserslist "^4.7.3" - semver "^6.3.0" + browserslist "^4.8.3" + semver "7.0.0" core-js@2.4.1: version "2.4.1" @@ -5215,6 +5437,11 @@ electron-to-chromium@^1.3.322: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.326.tgz#71715aca9afd328ea208a3bc4651c15b869f0d1b" integrity sha512-kaBmGWJlLW5bGEbm7/HWG9jt4oH+uecBIIfzFWfFkgqssPT2I6RDenGqo4wmKzm7seNu7DSCRZBXCuf7w8dtkQ== +electron-to-chromium@^1.3.341: + version "1.3.344" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.344.tgz#f1397a633c35e726730c24be1084cd25c3ee8148" + integrity sha512-tvbx2Wl8WBR+ym3u492D0L6/jH+8NoQXqe46+QhbWH3voVPauGuZYeb1QAXYoOAWuiP2dbSvlBx0kQ1F3hu/Mw== + elliptic@^6.0.0: version "6.5.2" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" @@ -5455,23 +5682,23 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, semver "^5.5.0" ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: - version "7.13.2" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.13.2.tgz#6b6f4d508cc3bb300c5711d3d02c59ba80f0f686" - integrity sha512-VH2tMXaRFkbQEyVJnxUtAyta5bAKjtcLwJ4lStW/iRk/NIlNFNJh1uOd7uL9H9Vm0f4/xR7Mc0Q7ND9ezKOo+A== - dependencies: - "@babel/core" "^7.7.0" - "@babel/plugin-proposal-class-properties" "^7.7.0" - "@babel/plugin-proposal-decorators" "^7.7.0" - "@babel/plugin-transform-modules-amd" "^7.5.0" - "@babel/plugin-transform-runtime" "^7.6.0" - "@babel/polyfill" "^7.7.0" - "@babel/preset-env" "^7.7.0" - "@babel/runtime" "^7.7.0" + version "7.14.1" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.14.1.tgz#b34045449c4e7a22072757f394c89d585c1322e3" + integrity sha512-d8d3IQIvFlTfwWI+t4Ou5mbHMEhdqbpyw93dabV9X3MOxRXcKfo88YfIq6QWQRB0EG3kwuLxt3Jo0wCy4rrylA== + dependencies: + "@babel/core" "^7.8.3" + "@babel/plugin-proposal-class-properties" "^7.8.3" + "@babel/plugin-proposal-decorators" "^7.8.3" + "@babel/plugin-transform-modules-amd" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.8.3" + "@babel/polyfill" "^7.8.3" + "@babel/preset-env" "^7.8.3" + "@babel/runtime" "^7.8.3" amd-name-resolver "^1.2.1" babel-plugin-debug-macros "^0.3.0" babel-plugin-ember-modules-api-polyfill "^2.12.0" babel-plugin-module-resolver "^3.1.1" - broccoli-babel-transpiler "^7.3.0" + broccoli-babel-transpiler "^7.4.0" broccoli-debug "^0.6.4" broccoli-funnel "^2.0.1" broccoli-source "^1.1.0" @@ -7568,6 +7795,11 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + get-caller-file@^1.0.0, get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" @@ -8375,7 +8607,7 @@ into-stream@^3.1.0: from2 "^2.1.1" p-is-promise "^1.1.0" -invariant@^2.2.2: +invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -8789,11 +9021,6 @@ jquery@^3.4.1: resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2" integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw== -js-levenshtein@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" - integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== - js-reporters@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/js-reporters/-/js-reporters-1.2.1.tgz#f88c608e324a3373a95bcc45ad305e5c979c459b" @@ -9100,6 +9327,18 @@ leek@0.0.24: lodash.assign "^3.2.0" rsvp "^3.0.21" +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levenary@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" + integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== + dependencies: + leven "^3.1.0" + levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -10269,6 +10508,13 @@ node-releases@^1.1.44: dependencies: semver "^6.3.0" +node-releases@^1.1.47: + version "1.1.47" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.47.tgz#c59ef739a1fd7ecbd9f0b7cf5b7871e8a8b591e4" + integrity sha512-k4xjVPx5FpwBUj0Gw7uvFOTF4Ep8Hok1I6qjwL3pLfwe7Y0REQSAqOwwv9TWBCUtMHxcXfY4PgRLRozcChvTcA== + dependencies: + semver "^6.3.0" + node-uuid@~1.4.0: version "1.4.8" resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" @@ -12077,6 +12323,11 @@ select@^1.1.2: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" From e93b18b52ec218a06ca73589cf17a33f9c39f1de Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 4 Feb 2020 10:36:56 -0500 Subject: [PATCH 622/879] Update .travis.yml --- .travis.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index f65e38707..e0eb0c290 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,7 @@ --- language: node_js node_js: - # we recommend testing addons with the same minimum supported node version as Ember CLI - # so that your addon works for all apps - - "8" + - "10" sudo: false dist: trusty From a64b5467be442ef3d863ae05c0b30a8951ae3313 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 4 Feb 2020 17:10:25 -0500 Subject: [PATCH 623/879] build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 (#1863) Bumps [eslint-plugin-node](https://github.com/mysticatea/eslint-plugin-node) from 10.0.0 to 11.0.0. - [Release notes](https://github.com/mysticatea/eslint-plugin-node/releases) - [Commits](https://github.com/mysticatea/eslint-plugin-node/compare/v10.0.0...v11.0.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 31 +++++++++++++++++++------------ 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 53d7393e6..a3ca4298b 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "ember-try": "^1.0.0", "escape-string-regexp": "^2.0.0", "eslint-plugin-ember": "^7.0.0", - "eslint-plugin-node": "^10.0.0", + "eslint-plugin-node": "^11.0.0", "faker": "^4.1.0", "fastboot": "^2.0.1", "js-yaml": "^3.12.1", diff --git a/yarn.lock b/yarn.lock index 6be03726e..5bfe51c32 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6838,21 +6838,21 @@ eslint-plugin-ember@^7.0.0: ember-rfc176-data "^0.3.12" snake-case "^3.0.2" -eslint-plugin-es@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-2.0.0.tgz#0f5f5da5f18aa21989feebe8a73eadefb3432976" - integrity sha512-f6fceVtg27BR02EYnBhgWLFQfK6bN4Ll0nQFrBHOlCsAyxeZkn0NHns5O0YZOPrV1B3ramd6cgFwaoFLcSkwEQ== +eslint-plugin-es@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.0.tgz#98cb1bc8ab0aa807977855e11ad9d1c9422d014b" + integrity sha512-6/Jb/J/ZvSebydwbBJO1R9E5ky7YeElfK56Veh7e4QGFHCXoIXGH9HhVz+ibJLM3XJ1XjP+T7rKBLUa/Y7eIng== dependencies: - eslint-utils "^1.4.2" + eslint-utils "^2.0.0" regexpp "^3.0.0" -eslint-plugin-node@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-10.0.0.tgz#fd1adbc7a300cf7eb6ac55cf4b0b6fc6e577f5a6" - integrity sha512-1CSyM/QCjs6PXaT18+zuAXsjXGIGo5Rw630rSKwokSs2jrYURQc4R5JZpoanNCqwNmepg+0eZ9L7YiRUJb8jiQ== +eslint-plugin-node@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.0.0.tgz#365944bb0804c5d1d501182a9bc41a0ffefed726" + integrity sha512-chUs/NVID+sknFiJzxoN9lM7uKSOEta8GC8365hw1nDfwIPIjjpRSwwPvQanWv8dt/pDe9EV4anmVSwdiSndNg== dependencies: - eslint-plugin-es "^2.0.0" - eslint-utils "^1.4.2" + eslint-plugin-es "^3.0.0" + eslint-utils "^2.0.0" ignore "^5.1.1" minimatch "^3.0.4" resolve "^1.10.1" @@ -6874,13 +6874,20 @@ eslint-scope@^4.0.0, eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-utils@^1.3.1, eslint-utils@^1.4.2: +eslint-utils@^1.3.1: version "1.4.3" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== dependencies: eslint-visitor-keys "^1.1.0" +eslint-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd" + integrity sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA== + dependencies: + eslint-visitor-keys "^1.1.0" + eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" From f3f0d78a6d01460eb2682e39dc3fed9679e8f2b6 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 4 Feb 2020 17:10:43 -0500 Subject: [PATCH 624/879] build(deps-dev): bump babel-eslint from 9.0.0 to 10.0.3 (#1874) Bumps [babel-eslint](https://github.com/babel/babel-eslint) from 9.0.0 to 10.0.3. - [Release notes](https://github.com/babel/babel-eslint/releases) - [Commits](https://github.com/babel/babel-eslint/compare/v9.0.0...v10.0.3) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 18 +++++------------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index a3ca4298b..63e282e8f 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "devDependencies": { "@ember/jquery": "^1.1.0", "@ember/optional-features": "^1.0.0", - "babel-eslint": "^9.0.0", + "babel-eslint": "^10.0.3", "broccoli-asset-rev": "^3.0.0", "ember-ajax": "^5.0.0", "ember-cli": "~3.4.4", diff --git a/yarn.lock b/yarn.lock index 5bfe51c32..2f3c278b2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2394,17 +2394,17 @@ babel-core@^6.26.0, babel-core@^6.26.3: slash "^1.0.0" source-map "^0.5.7" -babel-eslint@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-9.0.0.tgz#7d9445f81ed9f60aff38115f838970df9f2b6220" - integrity sha512-itv1MwE3TMbY0QtNfeL7wzak1mV47Uy+n6HtSOO4Xd7rvmO+tsGQSgyOEEgo6Y2vHZKZphaoelNeSVj4vkLA1g== +babel-eslint@^10.0.3: + version "10.0.3" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.3.tgz#81a2c669be0f205e19462fed2482d33e4687a88a" + integrity sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA== dependencies: "@babel/code-frame" "^7.0.0" "@babel/parser" "^7.0.0" "@babel/traverse" "^7.0.0" "@babel/types" "^7.0.0" - eslint-scope "3.7.1" eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" babel-generator@6.26.0: version "6.26.0" @@ -6858,14 +6858,6 @@ eslint-plugin-node@^11.0.0: resolve "^1.10.1" semver "^6.1.0" -eslint-scope@3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" - integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug= - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - eslint-scope@^4.0.0, eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" From 08e83014f70060841a3ca24f8234eca47db832a4 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 4 Feb 2020 17:11:14 -0500 Subject: [PATCH 625/879] build(deps-dev): bump ember-source from 3.14.3 to 3.16.1 (#1883) Bumps [ember-source](https://github.com/emberjs/ember.js) from 3.14.3 to 3.16.1. - [Release notes](https://github.com/emberjs/ember.js/releases) - [Changelog](https://github.com/emberjs/ember.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember.js/compare/v3.14.3...v3.16.1) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 32 +++++++++----------------------- 2 files changed, 10 insertions(+), 24 deletions(-) diff --git a/package.json b/package.json index 63e282e8f..7b1a243e6 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "ember-maybe-import-regenerator-for-testing": "^1.0.0", "ember-moment": "^8.0.0", "ember-resolver": "^6.0.0", - "ember-source": "~3.14.1", + "ember-source": "~3.16.1", "ember-source-channel-url": "^2.0.1", "ember-try": "^1.0.0", "escape-string-regexp": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index 2f3c278b2..6117b73c4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -208,14 +208,7 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-module-imports@^7.0.0": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz#e5a92529f8888bf319a6376abfbd1cebc491ad91" - integrity sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ== - dependencies: - "@babel/types" "^7.7.4" - -"@babel/helper-module-imports@^7.8.3": +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== @@ -577,15 +570,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-block-scoping@^7.6.0", "@babel/plugin-transform-block-scoping@^7.6.2": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz#200aad0dcd6bb80372f94d9e628ea062c58bf224" - integrity sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - lodash "^4.17.13" - -"@babel/plugin-transform-block-scoping@^7.8.3": +"@babel/plugin-transform-block-scoping@^7.6.2", "@babel/plugin-transform-block-scoping@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== @@ -6509,18 +6494,19 @@ ember-source-channel-url@^2.0.1: dependencies: got "^8.0.1" -ember-source@~3.14.1: - version "3.14.3" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.14.3.tgz#ae764f49d1db5a1327056d469ce07dbd53cbeaab" - integrity sha512-w4vOvUEk6qnRs61bLkgnebSzlOKwo7X+OdklFoR4gJltsahzZa6SLR8VzvyrrGc/jypu2STK923txBAQ0YG9bA== +ember-source@~3.16.1: + version "3.16.1" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.16.1.tgz#997f51c2b74620906d2a8111089b6e894b6165e6" + integrity sha512-4cYfQ+DsqeSTqG0RztuTsh8d8p0XdeIaPWe9Ol229GhQjM1JgpjQNTXGJDTIB8FfbAxycPlCwIk2qXygA+pFsA== dependencies: "@babel/helper-module-imports" "^7.0.0" - "@babel/plugin-transform-block-scoping" "^7.6.0" + "@babel/plugin-transform-block-scoping" "^7.6.2" "@babel/plugin-transform-object-assign" "^7.2.0" - "@ember/edition-utils" "^1.1.1" + "@ember/edition-utils" "^1.2.0" babel-plugin-debug-macros "^0.3.3" babel-plugin-filter-imports "^3.0.0" broccoli-concat "^3.7.4" + broccoli-debug "^0.6.4" broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.2" chalk "^2.4.2" From bb2c607d2caaac5420a310442477dcde5cd7ab89 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2020 07:08:52 +0000 Subject: [PATCH 626/879] build(deps): bump ember-cli-babel from 7.14.1 to 7.17.1 Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 7.14.1 to 7.17.1. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v7.14.1...v7.17.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 81 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 63 insertions(+), 18 deletions(-) diff --git a/yarn.lock b/yarn.lock index 6117b73c4..df71f0628 100644 --- a/yarn.lock +++ b/yarn.lock @@ -30,7 +30,7 @@ invariant "^2.2.4" semver "^5.5.0" -"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.2.2", "@babel/core@^7.3.4", "@babel/core@^7.8.3": +"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.2.2", "@babel/core@^7.3.4", "@babel/core@^7.8.3", "@babel/core@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.4.tgz#d496799e5c12195b3602d0fddd77294e3e38e80e" integrity sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA== @@ -547,6 +547,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-typescript@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz#c1f659dda97711a569cef75275f7e15dcaa6cabc" + integrity sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-arrow-functions@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" @@ -801,6 +808,15 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" +"@babel/plugin-transform-typescript@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.3.tgz#be6f01a7ef423be68e65ace1f04fc407e6d88917" + integrity sha512-Ebj230AxcrKGZPKIp4g4TdQLrqX95TobLUWKd/CwG7X1XHUH1ZpkpFvXuXqWbtGRWb7uuEWNlrl681wsOArAdQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-typescript" "^7.8.3" + "@babel/plugin-transform-typescript@~7.4.0": version "7.4.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.4.5.tgz#ab3351ba35307b79981993536c93ff8be050ba28" @@ -834,7 +850,7 @@ core-js "^2.6.5" regenerator-runtime "^0.13.2" -"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.8.3": +"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.8.4.tgz#9dac6df5f423015d3d49b6e9e5fa3413e4a72c4e" integrity sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w== @@ -897,7 +913,7 @@ levenary "^1.1.1" semver "^5.5.0" -"@babel/runtime@^7.2.0", "@babel/runtime@^7.8.3": +"@babel/runtime@^7.2.0", "@babel/runtime@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.4.tgz#d79f5a2040f7caa24d53e563aad49cbc05581308" integrity sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ== @@ -2577,6 +2593,13 @@ babel-plugin-dynamic-import-node@^2.3.0: dependencies: object.assign "^4.1.0" +babel-plugin-ember-data-packages-polyfill@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-data-packages-polyfill/-/babel-plugin-ember-data-packages-polyfill-0.1.1.tgz#428217228bedb95215bcaac6da83f59488b40edd" + integrity sha512-WQlevWS8RNNVCm4SNI6PogUMhH4Eu2ectRd/SVcKVnLnzaOHJjN9W1eaoQ9dwBidDgHhtXUbvkBSdLExaW+MYA== + dependencies: + "@ember-data/rfc395-data" "^0.0.4" + babel-plugin-ember-modules-api-polyfill@^2.12.0, babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-polyfill@^2.8.0: version "2.12.0" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.12.0.tgz#a5e703205ba4e625a7fab9bb1aea64ef3222cf75" @@ -5667,20 +5690,23 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, semver "^5.5.0" ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: - version "7.14.1" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.14.1.tgz#b34045449c4e7a22072757f394c89d585c1322e3" - integrity sha512-d8d3IQIvFlTfwWI+t4Ou5mbHMEhdqbpyw93dabV9X3MOxRXcKfo88YfIq6QWQRB0EG3kwuLxt3Jo0wCy4rrylA== + version "7.17.1" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.17.1.tgz#96a4a527409b9555e329adea846f1f40eb4131c2" + integrity sha512-GC7EOgmJE27JTljGL00fHOt3eg+kCXOfzHE7qCjndtmvZ26DR1WiHXjQdni5fZpz/l2zz83ymQCpVIpZHdglpA== dependencies: - "@babel/core" "^7.8.3" + "@babel/core" "^7.8.4" + "@babel/helper-compilation-targets" "^7.8.4" "@babel/plugin-proposal-class-properties" "^7.8.3" "@babel/plugin-proposal-decorators" "^7.8.3" "@babel/plugin-transform-modules-amd" "^7.8.3" "@babel/plugin-transform-runtime" "^7.8.3" + "@babel/plugin-transform-typescript" "^7.8.3" "@babel/polyfill" "^7.8.3" - "@babel/preset-env" "^7.8.3" - "@babel/runtime" "^7.8.3" + "@babel/preset-env" "^7.8.4" + "@babel/runtime" "^7.8.4" amd-name-resolver "^1.2.1" babel-plugin-debug-macros "^0.3.0" + babel-plugin-ember-data-packages-polyfill "^0.1.1" babel-plugin-ember-modules-api-polyfill "^2.12.0" babel-plugin-module-resolver "^3.1.1" broccoli-babel-transpiler "^7.4.0" @@ -5689,8 +5715,10 @@ ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cl broccoli-source "^1.1.0" clone "^2.1.2" ember-cli-babel-plugin-helpers "^1.1.0" - ember-cli-version-checker "^2.1.2" + ember-cli-version-checker "^4.1.0" ensure-posix-path "^1.0.2" + fixturify-project "^1.10.0" + rimraf "^3.0.1" semver "^5.5.0" ember-cli-broccoli-sane-watcher@^2.1.1: @@ -6082,6 +6110,15 @@ ember-cli-version-checker@^3.0.0, ember-cli-version-checker@^3.0.1, ember-cli-ve resolve-package-path "^1.2.6" semver "^5.6.0" +ember-cli-version-checker@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-4.1.0.tgz#7fc9836bdbc87451d286ba6a9a89b23591d8bbb7" + integrity sha512-yLf2YqotTSsjiXwx9Dt6H7AU0QcldFn5SLk/pG3Zqb0aHNeanBOPlx4/Ysa46ILGWYIh0fDH34AEVRueXTrQBQ== + dependencies: + resolve-package-path "^2.0.0" + semver "^6.3.0" + silent-error "^1.1.1" + ember-cli@~3.4.4: version "3.4.4" resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.4.4.tgz#8d25b223b2ef3b863310099192da92ab1feeef6b" @@ -7497,10 +7534,10 @@ fireworm@^0.7.0: lodash.flatten "^3.0.2" minimatch "^3.0.2" -fixturify-project@^1.5.3: - version "1.9.1" - resolved "https://registry.yarnpkg.com/fixturify-project/-/fixturify-project-1.9.1.tgz#64cdf6fd763a8f8975170e1d9d3bbadea0778680" - integrity sha512-KyzFWPWMitlZFDrC6lluvr/UGkJg0ExucR5ubN9uLAHWsGmwghofA8CT5chFJCy5aMWx/SNxYpTygPKaZFERIg== +fixturify-project@^1.10.0, fixturify-project@^1.5.3: + version "1.10.0" + resolved "https://registry.yarnpkg.com/fixturify-project/-/fixturify-project-1.10.0.tgz#091c452a9bb15f09b6b9cc7cf5c0ad559f1d9aad" + integrity sha512-L1k9uiBQuN0Yr8tA9Noy2VSQ0dfg0B8qMdvT7Wb5WQKc7f3dn3bzCbSrqlb+etLW+KDV4cBC7R1OvcMg3kcxmA== dependencies: fixturify "^1.2.0" tmp "^0.0.33" @@ -12034,6 +12071,14 @@ resolve-package-path@^1.0.11, resolve-package-path@^1.2.2, resolve-package-path@ path-root "^0.1.1" resolve "^1.10.0" +resolve-package-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-2.0.0.tgz#7f258ab86ff074fff4ff8027a28f94d17d6fb1df" + integrity sha512-/CLuzodHO2wyyHTzls5Qr+EFeG6RcW4u6//gjYvUfcfyuplIX1SSccU+A5A9A78Gmezkl3NBkFAMxLbzTY9TJA== + dependencies: + path-root "^0.1.1" + resolve "^1.13.1" + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -12103,10 +12148,10 @@ rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.1, rimraf@^2.4.3, rimraf@^2.4.4, rimra dependencies: glob "^7.1.3" -rimraf@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" - integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg== +rimraf@^3.0.0, rimraf@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.1.tgz#48d3d4cb46c80d388ab26cd61b1b466ae9ae225a" + integrity sha512-IQ4ikL8SjBiEDZfk+DFVwqRK8md24RWMEJkdSlgNLkyyAImcjf8SWvU1qFMDOb4igBClbTQ/ugPqXcRwdFTxZw== dependencies: glob "^7.1.3" From 3666d5c4ff57843960b88360e39f0f19c95b8183 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 7 Feb 2020 07:02:07 +0000 Subject: [PATCH 627/879] build(deps): bump ember-cli-babel from 7.17.1 to 7.17.2 Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 7.17.1 to 7.17.2. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v7.17.1...v7.17.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index df71f0628..eda3abe34 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5690,9 +5690,9 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, semver "^5.5.0" ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: - version "7.17.1" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.17.1.tgz#96a4a527409b9555e329adea846f1f40eb4131c2" - integrity sha512-GC7EOgmJE27JTljGL00fHOt3eg+kCXOfzHE7qCjndtmvZ26DR1WiHXjQdni5fZpz/l2zz83ymQCpVIpZHdglpA== + version "7.17.2" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.17.2.tgz#2c7717c6864425be3cd11913c722115fbf1448d2" + integrity sha512-64jRwtRVtEp4ghhew/sHeMsPyUOg3t1TB2dary5mCbKkRasb3L7FwF7xnuzPihaz+AW/v2LqYLALXGCml5XNLA== dependencies: "@babel/core" "^7.8.4" "@babel/helper-compilation-targets" "^7.8.4" From fa2b6071d00561858d9f6f9400cc6d8640282931 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 11 Feb 2020 06:56:33 +0000 Subject: [PATCH 628/879] build(deps-dev): bump ember-source from 3.16.1 to 3.16.2 Bumps [ember-source](https://github.com/emberjs/ember.js) from 3.16.1 to 3.16.2. - [Release notes](https://github.com/emberjs/ember.js/releases) - [Changelog](https://github.com/emberjs/ember.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember.js/compare/v3.16.1...v3.16.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index eda3abe34..0b6900e73 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6532,9 +6532,9 @@ ember-source-channel-url@^2.0.1: got "^8.0.1" ember-source@~3.16.1: - version "3.16.1" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.16.1.tgz#997f51c2b74620906d2a8111089b6e894b6165e6" - integrity sha512-4cYfQ+DsqeSTqG0RztuTsh8d8p0XdeIaPWe9Ol229GhQjM1JgpjQNTXGJDTIB8FfbAxycPlCwIk2qXygA+pFsA== + version "3.16.2" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.16.2.tgz#bdb342445804d20b46796b98919a924e5a8eb61e" + integrity sha512-aRF90V88rJ6h47ootUw8oGcV7O4ulwLYNVqnokTr9RTeWjEimwMtzLLazUfDR1LZMkdMTLVLGcQkJCJVvUAg5A== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/plugin-transform-block-scoping" "^7.6.2" From 13ef462d29034978cc0c9f24b72d5e3a39bc61a9 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2020 07:02:40 +0000 Subject: [PATCH 629/879] build(deps-dev): bump eslint-plugin-ember from 7.7.2 to 7.8.0 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 7.7.2 to 7.8.0. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v7.7.2...v7.8.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/yarn.lock b/yarn.lock index 0b6900e73..5236f3143 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5377,12 +5377,12 @@ domutils@^1.5.1, domutils@^1.7.0: dom-serializer "0" domelementtype "1" -dot-case@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.2.tgz#6758d86d3e7b69adc0fcfad23a845676c329f7d9" - integrity sha512-z3vMZEW2o3btKlM9I6FQF0pIWTzBuW+udrAaJr+A6JA3+p62ADZjeFthKxqxKHZlUxQmkKeEWvaKLJdwpc5u6g== +dot-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.3.tgz#21d3b52efaaba2ea5fda875bb1aa8124521cf4aa" + integrity sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA== dependencies: - no-case "^3.0.2" + no-case "^3.0.3" tslib "^1.10.0" dot-prop@^4.1.0: @@ -6853,13 +6853,13 @@ esdoc@pzuraq/esdoc#015a342: taffydb "2.7.2" eslint-plugin-ember@^7.0.0: - version "7.7.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.7.2.tgz#ba4afe59e7b2efdfbb85bc16484c95aaa45b8392" - integrity sha512-Ua7+xePz8m0BrqSHfYibkRXWQMMb5RBsH9ohZy2a7ri+s6+UQre9x3BxPpawCLZMzQzIG4vQh93YiVGCSv3XYA== + version "7.8.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.8.0.tgz#cefdc5dfabb0969953fee43b0758cc6ed1020293" + integrity sha512-vT5VAAxWXAe/DQNNsmzOOy6TadSuFXf8pmnPUV3Il92eXCHXIGY+jtPRhdi0pJnao7HCCk4IKbOXvIatjkGsEw== dependencies: "@ember-data/rfc395-data" "^0.0.4" ember-rfc176-data "^0.3.12" - snake-case "^3.0.2" + snake-case "^3.0.3" eslint-plugin-es@^3.0.0: version "3.0.0" @@ -10430,10 +10430,10 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -no-case@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.2.tgz#2b03928510318591854c0423e504d13b21234263" - integrity sha512-Yber3mEOA3T9+as7Z70TJUQCUPRmmq6s8NmsZX5aSB1qk+Mt+3a5JVPpnAnONUShLTkMDF4PJY3h0GKlXdRTNA== +no-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.3.tgz#c21b434c1ffe48b39087e86cfb4d2582e9df18f8" + integrity sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw== dependencies: lower-case "^2.0.1" tslib "^1.10.0" @@ -12501,12 +12501,12 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" -snake-case@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.2.tgz#2cc0eacf4edaab998f21af579b5a72b0766f91dd" - integrity sha512-1fRJdasXJTcsrGnUkDsnKNjHoP9NGclbIkYyY6Vv0vBVgz32rqhPFPg/Y0yIP4hwOd41Dh8rocCRHjNIuK4EZg== +snake-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.3.tgz#c598b822ab443fcbb145ae8a82c5e43526d5bbee" + integrity sha512-WM1sIXEO+rsAHBKjGf/6R1HBBcgbncKS08d2Aqec/mrDSpU80SiOU41hO7ny6DToHSyrlwTYzQBIK1FPSx4Y3Q== dependencies: - dot-case "^3.0.2" + dot-case "^3.0.3" tslib "^1.10.0" snapdragon-node@^2.0.1: From 34067f643c903e4a6343352c69d9da9264d99e3a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2020 07:03:12 +0000 Subject: [PATCH 630/879] build(deps-dev): bump ember-composable-helpers from 3.1.0 to 3.1.1 Bumps [ember-composable-helpers](https://github.com/DockYard/ember-composable-helpers) from 3.1.0 to 3.1.1. - [Release notes](https://github.com/DockYard/ember-composable-helpers/releases) - [Commits](https://github.com/DockYard/ember-composable-helpers/compare/v3.1.0...v3.1.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 5236f3143..bfdccb111 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6269,9 +6269,9 @@ ember-composable-helpers@^2.3.1: resolve "^1.10.0" ember-composable-helpers@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-3.1.0.tgz#c15f6bf8c878ea16a4b3fed41b9e8ff13c8ae13d" - integrity sha512-A/UhryodDMCxk6wC8t7xjqZBV/jtkTzamr58Y44MZbtoxPM7FGMLNCABV8NxUe/46k+a3cazuV1dJ3MciOTvvg== + version "3.1.1" + resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-3.1.1.tgz#9d663f4359fd54fd369ea60aa1915bf59113bcec" + integrity sha512-lPmPhk4wIg1JDnuOfzcDzrCZoaDoTvZrYVaBi4Eia2SdEEfcDNipQTXTk0yHFCvKfSjXjuNlTtNP9UANH58TzQ== dependencies: "@babel/core" "^7.0.0" broccoli-funnel "2.0.1" From 8d5e9fffbae5049cab4c44548e822b2bffcdaf0a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 14 Feb 2020 07:04:10 +0000 Subject: [PATCH 631/879] build(deps): bump ember-cli-babel from 7.17.2 to 7.18.0 Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 7.17.2 to 7.18.0. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v7.17.2...v7.18.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index bfdccb111..f0ec2f377 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2593,10 +2593,10 @@ babel-plugin-dynamic-import-node@^2.3.0: dependencies: object.assign "^4.1.0" -babel-plugin-ember-data-packages-polyfill@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-data-packages-polyfill/-/babel-plugin-ember-data-packages-polyfill-0.1.1.tgz#428217228bedb95215bcaac6da83f59488b40edd" - integrity sha512-WQlevWS8RNNVCm4SNI6PogUMhH4Eu2ectRd/SVcKVnLnzaOHJjN9W1eaoQ9dwBidDgHhtXUbvkBSdLExaW+MYA== +babel-plugin-ember-data-packages-polyfill@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-data-packages-polyfill/-/babel-plugin-ember-data-packages-polyfill-0.1.2.tgz#21154c095ddc703722b1fb8bb06c126c0b6d77dc" + integrity sha512-kTHnOwoOXfPXi00Z8yAgyD64+jdSXk3pknnS7NlqnCKAU6YDkXZ4Y7irl66kaZjZn0FBBt0P4YOZFZk85jYOww== dependencies: "@ember-data/rfc395-data" "^0.0.4" @@ -5690,9 +5690,9 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, semver "^5.5.0" ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: - version "7.17.2" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.17.2.tgz#2c7717c6864425be3cd11913c722115fbf1448d2" - integrity sha512-64jRwtRVtEp4ghhew/sHeMsPyUOg3t1TB2dary5mCbKkRasb3L7FwF7xnuzPihaz+AW/v2LqYLALXGCml5XNLA== + version "7.18.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.18.0.tgz#e979b73eee00cd93f63452c6170d045e8832f29c" + integrity sha512-OLPfYD8wSfCrmGHcUf8zEfySSvbAL+5Qp2RWLycJIMaBZhg+SncKj5kVkL3cPJR5n2hVHPdfmKTQIYjOYl6FnQ== dependencies: "@babel/core" "^7.8.4" "@babel/helper-compilation-targets" "^7.8.4" @@ -5706,7 +5706,7 @@ ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cl "@babel/runtime" "^7.8.4" amd-name-resolver "^1.2.1" babel-plugin-debug-macros "^0.3.0" - babel-plugin-ember-data-packages-polyfill "^0.1.1" + babel-plugin-ember-data-packages-polyfill "^0.1.2" babel-plugin-ember-modules-api-polyfill "^2.12.0" babel-plugin-module-resolver "^3.1.1" broccoli-babel-transpiler "^7.4.0" From ee2b6750a1882e40d8ff8ab4802f7ee02378512f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2020 07:18:58 +0000 Subject: [PATCH 632/879] build(deps-dev): bump eslint-plugin-ember from 7.8.0 to 7.8.1 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 7.8.0 to 7.8.1. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v7.8.0...v7.8.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index f0ec2f377..ed3bb5048 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6853,9 +6853,9 @@ esdoc@pzuraq/esdoc#015a342: taffydb "2.7.2" eslint-plugin-ember@^7.0.0: - version "7.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.8.0.tgz#cefdc5dfabb0969953fee43b0758cc6ed1020293" - integrity sha512-vT5VAAxWXAe/DQNNsmzOOy6TadSuFXf8pmnPUV3Il92eXCHXIGY+jtPRhdi0pJnao7HCCk4IKbOXvIatjkGsEw== + version "7.8.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.8.1.tgz#9b2d0526bb6b697f3f18e5c7d3fcf64e447813af" + integrity sha512-74Whm5MHV+llWv0LA/4b4IaLQxMTj5Jc1zoK11gYEPQbPIAviTF4JsRuzPM/x7QMo5pQZyTdfGYF5zVMbgQ2RA== dependencies: "@ember-data/rfc395-data" "^0.0.4" ember-rfc176-data "^0.3.12" From a3bbe9ebc545ba4ecd0f5ab8b14f8921e602c697 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 19 Feb 2020 07:04:24 +0000 Subject: [PATCH 633/879] build(deps-dev): bump ember-source from 3.16.2 to 3.16.3 Bumps [ember-source](https://github.com/emberjs/ember.js) from 3.16.2 to 3.16.3. - [Release notes](https://github.com/emberjs/ember.js/releases) - [Changelog](https://github.com/emberjs/ember.js/blob/v3.16.3/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember.js/compare/v3.16.2...v3.16.3) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index ed3bb5048..44da6ebfd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6532,9 +6532,9 @@ ember-source-channel-url@^2.0.1: got "^8.0.1" ember-source@~3.16.1: - version "3.16.2" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.16.2.tgz#bdb342445804d20b46796b98919a924e5a8eb61e" - integrity sha512-aRF90V88rJ6h47ootUw8oGcV7O4ulwLYNVqnokTr9RTeWjEimwMtzLLazUfDR1LZMkdMTLVLGcQkJCJVvUAg5A== + version "3.16.3" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.16.3.tgz#080ded36d6b43ed1ee8e9a13ed4cebf27a50db6a" + integrity sha512-A5IuTBDnxM4zK5IOaoePOchmgaKm4iYuYfQZVsvuPoczm89SBTKuQZnsXFp2ZI8Sc17ALm1Euc9Lc10TNy2KXw== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/plugin-transform-block-scoping" "^7.6.2" From 43f2a8ab73bc0c34777214a161416ace456b84ac Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 26 Mar 2020 06:35:11 -0700 Subject: [PATCH 634/879] Regen lockfile, remove old tests (#1914) --- .node-version | 2 +- tests/integration/database-test.js | 39 - tests/integration/db/identity-manager-test.js | 81 - .../factories/after-create-test.js | 54 - tests/integration/factories/helpers-test.js | 131 - tests/integration/http-verbs-test.js | 140 -- tests/integration/index-named-imports-test.js | 39 - tests/integration/load-fixtures-test.js | 59 - tests/integration/orm/all-test.js | 41 - tests/integration/orm/assertions-test.js | 77 - tests/integration/orm/attrs-test.js | 31 - .../orm/belongs-to/1-basic/_helper.js | 96 - .../belongs-to/1-basic/_regressions-test.js | 27 - .../orm/belongs-to/1-basic/accessor-test.js | 22 - .../1-basic/association-create-test.js | 26 - .../1-basic/association-new-test.js | 31 - .../1-basic/association-set-id-test.js | 41 - .../1-basic/association-set-test.js | 44 - .../orm/belongs-to/1-basic/create-test.js | 60 - .../orm/belongs-to/1-basic/delete-test.js | 24 - .../belongs-to/1-basic/instantiating-test.js | 82 - .../10-one-to-one-polymorphic/_helper.js | 105 - .../accessor-test.js | 34 - .../association-create-test.js | 27 - .../association-new-test.js | 33 - .../association-set-id-test.js | 47 - .../association-set-test.js | 49 - .../10-one-to-one-polymorphic/create-test.js | 65 - .../10-one-to-one-polymorphic/delete-test.js | 24 - .../instantiating-test.js | 83 - .../_helper.js | 72 - .../accessor-test.js | 28 - .../association-create-test.js | 26 - .../association-new-test.js | 31 - .../association-set-id-test.js | 54 - .../association-set-test.js | 43 - .../orm/belongs-to/2-named/_helper.js | 96 - .../orm/belongs-to/2-named/accessor-test.js | 22 - .../2-named/association-create-test.js | 26 - .../2-named/association-new-test.js | 31 - .../2-named/association-set-id-test.js | 41 - .../2-named/association-set-test.js | 44 - .../orm/belongs-to/2-named/create-test.js | 60 - .../orm/belongs-to/2-named/delete-test.js | 24 - .../belongs-to/2-named/instantiating-test.js | 82 - .../orm/belongs-to/3-reflexive/_helper.js | 95 - .../belongs-to/3-reflexive/accessor-test.js | 34 - .../3-reflexive/association-create-test.js | 33 - .../3-reflexive/association-new-test.js | 37 - .../3-reflexive/association-set-id-test.js | 53 - .../3-reflexive/association-set-test.js | 62 - .../orm/belongs-to/3-reflexive/create-test.js | 62 - .../orm/belongs-to/3-reflexive/delete-test.js | 24 - .../3-reflexive/instantiating-test.js | 83 - .../belongs-to/4-named-reflexive/_helper.js | 95 - .../4-named-reflexive/accessor-test.js | 34 - .../association-create-test.js | 26 - .../4-named-reflexive/association-new-test.js | 31 - .../association-set-id-test.js | 41 - .../4-named-reflexive/association-set-test.js | 44 - .../4-named-reflexive/create-test.js | 62 - .../4-named-reflexive/delete-test.js | 24 - .../4-named-reflexive/instantiating-test.js | 83 - .../_helper.js | 95 - .../accessor-test.js | 34 - .../association-create-test.js | 26 - .../association-new-test.js | 31 - .../association-set-id-test.js | 41 - .../association-set-test.js | 44 - .../create-test.js | 62 - .../delete-test.js | 24 - .../instantiating-test.js | 83 - .../belongs-to/6-one-way-reflexive/_helper.js | 94 - .../6-one-way-reflexive/accessor-test.js | 28 - .../association-create-test.js | 26 - .../association-new-test.js | 31 - .../association-set-id-test.js | 41 - .../association-set-test.js | 44 - .../6-one-way-reflexive/create-test.js | 60 - .../6-one-way-reflexive/delete-test.js | 24 - .../6-one-way-reflexive/instantiating-test.js | 82 - .../7-named-one-way-reflexive/_helper.js | 94 - .../accessor-test.js | 28 - .../association-create-test.js | 26 - .../association-new-test.js | 31 - .../association-set-id-test.js | 41 - .../association-set-test.js | 44 - .../7-named-one-way-reflexive/create-test.js | 60 - .../7-named-one-way-reflexive/delete-test.js | 24 - .../instantiating-test.js | 82 - .../orm/belongs-to/8-one-to-one/_helper.js | 98 - .../belongs-to/8-one-to-one/accessor-test.js | 34 - .../8-one-to-one/association-create-test.js | 27 - .../8-one-to-one/association-new-test.js | 33 - .../8-one-to-one/association-set-id-test.js | 47 - .../8-one-to-one/association-set-test.js | 49 - .../belongs-to/8-one-to-one/create-test.js | 65 - .../belongs-to/8-one-to-one/delete-test.js | 24 - .../8-one-to-one/instantiating-test.js | 83 - .../9-one-way-polymorphic/_helper.js | 113 - .../9-one-way-polymorphic/accessor-test.js | 22 - .../association-create-test.js | 26 - .../association-new-test.js | 31 - .../association-set-id-test.js | 41 - .../association-set-test.js | 44 - .../9-one-way-polymorphic/create-test.js | 38 - .../9-one-way-polymorphic/delete-test.js | 24 - .../instantiating-test.js | 84 - tests/integration/orm/belongs-to/misc-test.js | 18 - tests/integration/orm/belongs-to/notes.md | 43 - .../belongs-to/regressions/issue-1112-test.js | 29 - .../belongs-to/regressions/pr-1312-test.js | 23 - .../orm/collection-inflector-test.js | 27 - tests/integration/orm/collection-test.js | 86 - tests/integration/orm/create-test.js | 51 - tests/integration/orm/destroy-test.js | 41 - .../integration/orm/find-or-create-by-test.js | 55 - tests/integration/orm/find-test.js | 49 - tests/integration/orm/first-test.js | 25 - .../orm/has-many/1-basic/_helper.js | 124 - .../orm/has-many/1-basic/accessor-test.js | 30 - .../1-basic/association-create-test.js | 28 - .../has-many/1-basic/association-new-test.js | 33 - .../1-basic/association-set-ids-test.js | 34 - .../has-many/1-basic/association-set-test.js | 53 - .../orm/has-many/1-basic/create-test.js | 87 - .../orm/has-many/1-basic/delete-test.js | 24 - .../has-many/1-basic/instantiating-test.js | 81 - .../10-many-to-many-polymorphic/_helper.js | 143 -- .../accessor-test.js | 37 - .../association-create-test.js | 33 - .../association-new-test.js | 37 - .../association-set-ids-test.js | 52 - .../association-set-test.js | 83 - .../create-test.js | 57 - .../delete-test.js | 24 - .../instantiating-test.js | 81 - .../orm/has-many/2-named/_helper.js | 123 - .../orm/has-many/2-named/accessor-test.js | 30 - .../2-named/association-create-test.js | 28 - .../has-many/2-named/association-new-test.js | 33 - .../2-named/association-set-ids-test.js | 34 - .../has-many/2-named/association-set-test.js | 53 - .../orm/has-many/2-named/create-test.js | 87 - .../orm/has-many/2-named/delete-test.js | 24 - .../has-many/2-named/instantiating-test.js | 81 - .../orm/has-many/3-reflexive/_helper.js | 127 - .../orm/has-many/3-reflexive/accessor-test.js | 30 - .../3-reflexive/association-create-test.js | 39 - .../3-reflexive/association-new-test.js | 36 - .../3-reflexive/association-set-ids-test.js | 48 - .../3-reflexive/association-set-test.js | 81 - .../orm/has-many/3-reflexive/create-test.js | 94 - .../orm/has-many/3-reflexive/delete-test.js | 24 - .../orm/has-many/3-reflexive/new-test.js | 81 - .../orm/has-many/4-named-reflexive/_helper.js | 127 - .../4-named-reflexive/accessor-test.js | 30 - .../association-create-test.js | 29 - .../4-named-reflexive/association-new-test.js | 35 - .../association-set-ids-test.js | 48 - .../4-named-reflexive/association-set-test.js | 81 - .../has-many/4-named-reflexive/create-test.js | 94 - .../has-many/4-named-reflexive/delete-test.js | 24 - .../has-many/4-named-reflexive/new-test.js | 81 - .../_helper.js | 127 - .../accessor-test.js | 30 - .../association-create-test.js | 29 - .../association-new-test.js | 35 - .../association-set-ids-test.js | 48 - .../association-set-test.js | 81 - .../create-test.js | 94 - .../delete-test.js | 24 - .../new-test.js | 81 - .../has-many/6-one-way-reflexive/_helper.js | 127 - .../6-one-way-reflexive/accessor-test.js | 27 - .../association-create-test.js | 29 - .../association-new-test.js | 35 - .../association-set-ids-test.js | 38 - .../association-set-test.js | 63 - .../6-one-way-reflexive/create-test.js | 92 - .../6-one-way-reflexive/delete-test.js | 24 - .../has-many/6-one-way-reflexive/new-test.js | 81 - .../7-named-one-way-reflexive/_helper.js | 127 - .../accessor-test.js | 27 - .../association-create-test.js | 29 - .../association-new-test.js | 35 - .../association-set-ids-test.js | 38 - .../association-set-test.js | 63 - .../7-named-one-way-reflexive/create-test.js | 92 - .../7-named-one-way-reflexive/delete-test.js | 24 - .../7-named-one-way-reflexive/new-test.js | 81 - .../orm/has-many/8-many-to-many/_helper.js | 135 -- .../has-many/8-many-to-many/accessor-test.js | 30 - .../8-many-to-many/association-create-test.js | 29 - .../8-many-to-many/association-new-test.js | 35 - .../association-set-ids-test.js | 49 - .../8-many-to-many/association-set-test.js | 82 - .../has-many/8-many-to-many/create-test.js | 97 - .../has-many/8-many-to-many/delete-test.js | 24 - .../orm/has-many/8-many-to-many/new-test.js | 81 - .../has-many/9-one-way-polymorphic/_helper.js | 124 - .../9-one-way-polymorphic/accessor-test.js | 30 - .../association-create-test.js | 32 - .../association-new-test.js | 35 - .../association-set-ids-test.js | 34 - .../association-set-test.js | 53 - .../9-one-way-polymorphic/create-test.js | 87 - .../9-one-way-polymorphic/delete-test.js | 24 - .../instantiating-test.js | 81 - .../many-to-many-inverse-set-bug-test.js | 38 - .../orm/mixed/1-one-to-many/_helper.js | 138 -- .../orm/mixed/1-one-to-many/accessor-test.js | 34 - .../1-one-to-many/association-create-test.js | 32 - .../1-one-to-many/association-new-test.js | 33 - .../1-one-to-many/association-set-ids-test.js | 59 - .../1-one-to-many/association-set-test.js | 89 - .../orm/mixed/1-one-to-many/create-test.js | 97 - .../mixed/1-one-to-many/instantiating-test.js | 81 - .../orm/mixed/2-many-to-one/_helper.js | 104 - .../orm/mixed/2-many-to-one/accessor-test.js | 35 - .../2-many-to-one/association-create-test.js | 34 - .../2-many-to-one/association-new-test.js | 42 - .../2-many-to-one/association-set-ids-test.js | 54 - .../2-many-to-one/association-set-test.js | 67 - .../orm/mixed/2-many-to-one/create-test.js | 71 - .../mixed/2-many-to-one/instantiating-test.js | 96 - .../3-one-to-many-polymorphic/_helper.js | 138 -- .../accessor-test.js | 36 - .../association-create-test.js | 36 - .../association-new-test.js | 35 - .../association-set-ids-test.js | 59 - .../association-set-test.js | 89 - .../3-one-to-many-polymorphic/create-test.js | 65 - .../3-one-to-many-polymorphic/delete-test.js | 24 - .../instantiating-test.js | 81 - ...-with-same-target-model-update-bug-test.js | 34 - tests/integration/orm/none-test.js | 29 - .../orm/reinitialize-associations-test.js | 32 - .../schema-verification/belongs-to-test.js | 188 -- .../orm/schema-verification/has-many-test.js | 81 - .../orm/schema-verification/mixed-test.js | 285 --- tests/integration/orm/update-test.js | 88 - tests/integration/orm/where-test.js | 49 - tests/integration/passthrough-test.js | 249 -- .../route-handlers/assertions-test.js | 64 - .../route-handlers/delete-shorthand-test.js | 89 - .../function-handler/basic-test.js | 117 - .../normalize-request-attrs-test.js | 167 -- .../function-handler/serialize-test.js | 152 -- .../route-handlers/get-shorthand-test.js | 243 -- .../route-handlers/head-shorthand-test.js | 125 - .../route-handlers/post-shorthand-test.js | 81 - .../route-handlers/put-shorthand-test.js | 88 - .../active-model-serializer-test.js | 182 -- .../associations/embedded-collection-test.js | 168 -- .../base/associations/embedded-model-test.js | 219 -- .../polymorphic/belongs-to-test.js | 52 - .../associations/polymorphic/has-many-test.js | 107 - .../polymorphic/top-level-test.js | 67 - ...ideloading-and-embedded-collection-test.js | 97 - .../sideloading-and-embedded-model-test.js | 96 - .../sideloading-assorted-collections-test.js | 69 - .../sideloading-collection-test.js | 209 -- .../associations/sideloading-model-test.js | 183 -- .../base/assorted-collections-test.js | 44 - .../base/attribute-key-formatting-test.js | 57 - .../serializers/base/attrs-test.js | 51 - .../serializers/base/basic-test.js | 87 - .../serializers/base/full-request-test.js | 155 -- .../base/override-serialize-test.js | 74 - .../integration/serializers/base/root-test.js | 53 - .../base/serialize-array-of-models-test.js | 31 - .../serializers/base/serialize-ids-test.js | 80 - .../associations/collection-test.js | 500 ---- .../associations/includes-test.js | 518 ---- .../associations/key-for-relationship-test.js | 68 - .../associations/links-test.js | 182 -- .../associations/model-test.js | 488 ---- .../associations/polymorphic-test.js | 253 -- .../json-api-serializer/attrs-test.js | 103 - .../json-api-serializer/base-test.js | 68 - .../key-formatting-test.js | 79 - .../serializers/rest-serializer-test.js | 97 - .../integration/serializers/schema-helper.js | 41 - tests/integration/server-config-test.js | 264 -- tests/integration/server-with-orm-test.js | 34 - .../server/create-and-create-list-test.js | 189 -- .../server/custom-responses-test.js | 67 - .../customized-normalize-method-test.js | 104 - .../server/falsy-responses-test.js | 81 - .../integration/server/get-full-path-test.js | 99 - .../regressions/1318-linkage-data-bug-test.js | 74 - ...22-relationship-path-normalization-test.js | 88 - ...-with-same-target-model-update-bug-test.js | 103 - .../regressions/many-to-many-bug-test.js | 78 - .../server/resource-shorthand-test.js | 501 ---- .../active-model-serializer-sanity-test.js | 138 -- ...patch-shorthand-with-relationships-test.js | 187 -- .../post-shorthand-with-relationships-test.js | 175 -- .../shorthands/rest-serializer-sanity-test.js | 152 -- tests/performance/simple-factory-test.js | 38 - tests/performance/utils.js | 30 - tests/unit/collection-test.js | 64 - tests/unit/controller-test.js | 128 - tests/unit/db-test.js | 657 ----- tests/unit/db/identity-manager-test.js | 86 - tests/unit/factory-test.js | 347 --- tests/unit/model-test.js | 32 - tests/unit/reference-sort-test.js | 38 - tests/unit/response-test.js | 33 - .../route-handlers/shorthands/base-test.js | 62 - tests/unit/schema-test.js | 69 - .../active-model-serializer-test.js | 133 - .../serializers/json-api-serializer-test.js | 18 - ...ncludes-graph-snapshot-collections-test.js | 127 - ...eate-includes-graph-snapshot-mixed-test.js | 92 - ...ate-includes-graph-snapshot-models-test.js | 285 --- .../unit/serializers/rest-serializer-test.js | 54 - tests/unit/server-test.js | 1288 ---------- yarn.lock | 2160 +++++++++-------- 320 files changed, 1162 insertions(+), 26352 deletions(-) delete mode 100644 tests/integration/database-test.js delete mode 100644 tests/integration/db/identity-manager-test.js delete mode 100644 tests/integration/factories/after-create-test.js delete mode 100644 tests/integration/factories/helpers-test.js delete mode 100644 tests/integration/http-verbs-test.js delete mode 100644 tests/integration/index-named-imports-test.js delete mode 100644 tests/integration/load-fixtures-test.js delete mode 100644 tests/integration/orm/all-test.js delete mode 100644 tests/integration/orm/assertions-test.js delete mode 100644 tests/integration/orm/attrs-test.js delete mode 100644 tests/integration/orm/belongs-to/1-basic/_helper.js delete mode 100644 tests/integration/orm/belongs-to/1-basic/_regressions-test.js delete mode 100644 tests/integration/orm/belongs-to/1-basic/accessor-test.js delete mode 100644 tests/integration/orm/belongs-to/1-basic/association-create-test.js delete mode 100644 tests/integration/orm/belongs-to/1-basic/association-new-test.js delete mode 100644 tests/integration/orm/belongs-to/1-basic/association-set-id-test.js delete mode 100644 tests/integration/orm/belongs-to/1-basic/association-set-test.js delete mode 100644 tests/integration/orm/belongs-to/1-basic/create-test.js delete mode 100644 tests/integration/orm/belongs-to/1-basic/delete-test.js delete mode 100644 tests/integration/orm/belongs-to/1-basic/instantiating-test.js delete mode 100644 tests/integration/orm/belongs-to/10-one-to-one-polymorphic/_helper.js delete mode 100644 tests/integration/orm/belongs-to/10-one-to-one-polymorphic/accessor-test.js delete mode 100644 tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-create-test.js delete mode 100644 tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-new-test.js delete mode 100644 tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-id-test.js delete mode 100644 tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-test.js delete mode 100644 tests/integration/orm/belongs-to/10-one-to-one-polymorphic/create-test.js delete mode 100644 tests/integration/orm/belongs-to/10-one-to-one-polymorphic/delete-test.js delete mode 100644 tests/integration/orm/belongs-to/10-one-to-one-polymorphic/instantiating-test.js delete mode 100644 tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/_helper.js delete mode 100644 tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/accessor-test.js delete mode 100644 tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-create-test.js delete mode 100644 tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-new-test.js delete mode 100644 tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-set-id-test.js delete mode 100644 tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-set-test.js delete mode 100644 tests/integration/orm/belongs-to/2-named/_helper.js delete mode 100644 tests/integration/orm/belongs-to/2-named/accessor-test.js delete mode 100644 tests/integration/orm/belongs-to/2-named/association-create-test.js delete mode 100644 tests/integration/orm/belongs-to/2-named/association-new-test.js delete mode 100644 tests/integration/orm/belongs-to/2-named/association-set-id-test.js delete mode 100644 tests/integration/orm/belongs-to/2-named/association-set-test.js delete mode 100644 tests/integration/orm/belongs-to/2-named/create-test.js delete mode 100644 tests/integration/orm/belongs-to/2-named/delete-test.js delete mode 100644 tests/integration/orm/belongs-to/2-named/instantiating-test.js delete mode 100644 tests/integration/orm/belongs-to/3-reflexive/_helper.js delete mode 100644 tests/integration/orm/belongs-to/3-reflexive/accessor-test.js delete mode 100644 tests/integration/orm/belongs-to/3-reflexive/association-create-test.js delete mode 100644 tests/integration/orm/belongs-to/3-reflexive/association-new-test.js delete mode 100644 tests/integration/orm/belongs-to/3-reflexive/association-set-id-test.js delete mode 100644 tests/integration/orm/belongs-to/3-reflexive/association-set-test.js delete mode 100644 tests/integration/orm/belongs-to/3-reflexive/create-test.js delete mode 100644 tests/integration/orm/belongs-to/3-reflexive/delete-test.js delete mode 100644 tests/integration/orm/belongs-to/3-reflexive/instantiating-test.js delete mode 100644 tests/integration/orm/belongs-to/4-named-reflexive/_helper.js delete mode 100644 tests/integration/orm/belongs-to/4-named-reflexive/accessor-test.js delete mode 100644 tests/integration/orm/belongs-to/4-named-reflexive/association-create-test.js delete mode 100644 tests/integration/orm/belongs-to/4-named-reflexive/association-new-test.js delete mode 100644 tests/integration/orm/belongs-to/4-named-reflexive/association-set-id-test.js delete mode 100644 tests/integration/orm/belongs-to/4-named-reflexive/association-set-test.js delete mode 100644 tests/integration/orm/belongs-to/4-named-reflexive/create-test.js delete mode 100644 tests/integration/orm/belongs-to/4-named-reflexive/delete-test.js delete mode 100644 tests/integration/orm/belongs-to/4-named-reflexive/instantiating-test.js delete mode 100644 tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/_helper.js delete mode 100644 tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/accessor-test.js delete mode 100644 tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-create-test.js delete mode 100644 tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-new-test.js delete mode 100644 tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-id-test.js delete mode 100644 tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-test.js delete mode 100644 tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/create-test.js delete mode 100644 tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/delete-test.js delete mode 100644 tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/instantiating-test.js delete mode 100644 tests/integration/orm/belongs-to/6-one-way-reflexive/_helper.js delete mode 100644 tests/integration/orm/belongs-to/6-one-way-reflexive/accessor-test.js delete mode 100644 tests/integration/orm/belongs-to/6-one-way-reflexive/association-create-test.js delete mode 100644 tests/integration/orm/belongs-to/6-one-way-reflexive/association-new-test.js delete mode 100644 tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-id-test.js delete mode 100644 tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-test.js delete mode 100644 tests/integration/orm/belongs-to/6-one-way-reflexive/create-test.js delete mode 100644 tests/integration/orm/belongs-to/6-one-way-reflexive/delete-test.js delete mode 100644 tests/integration/orm/belongs-to/6-one-way-reflexive/instantiating-test.js delete mode 100644 tests/integration/orm/belongs-to/7-named-one-way-reflexive/_helper.js delete mode 100644 tests/integration/orm/belongs-to/7-named-one-way-reflexive/accessor-test.js delete mode 100644 tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-create-test.js delete mode 100644 tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-new-test.js delete mode 100644 tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-id-test.js delete mode 100644 tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-test.js delete mode 100644 tests/integration/orm/belongs-to/7-named-one-way-reflexive/create-test.js delete mode 100644 tests/integration/orm/belongs-to/7-named-one-way-reflexive/delete-test.js delete mode 100644 tests/integration/orm/belongs-to/7-named-one-way-reflexive/instantiating-test.js delete mode 100644 tests/integration/orm/belongs-to/8-one-to-one/_helper.js delete mode 100644 tests/integration/orm/belongs-to/8-one-to-one/accessor-test.js delete mode 100644 tests/integration/orm/belongs-to/8-one-to-one/association-create-test.js delete mode 100644 tests/integration/orm/belongs-to/8-one-to-one/association-new-test.js delete mode 100644 tests/integration/orm/belongs-to/8-one-to-one/association-set-id-test.js delete mode 100644 tests/integration/orm/belongs-to/8-one-to-one/association-set-test.js delete mode 100644 tests/integration/orm/belongs-to/8-one-to-one/create-test.js delete mode 100644 tests/integration/orm/belongs-to/8-one-to-one/delete-test.js delete mode 100644 tests/integration/orm/belongs-to/8-one-to-one/instantiating-test.js delete mode 100644 tests/integration/orm/belongs-to/9-one-way-polymorphic/_helper.js delete mode 100644 tests/integration/orm/belongs-to/9-one-way-polymorphic/accessor-test.js delete mode 100644 tests/integration/orm/belongs-to/9-one-way-polymorphic/association-create-test.js delete mode 100644 tests/integration/orm/belongs-to/9-one-way-polymorphic/association-new-test.js delete mode 100644 tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-id-test.js delete mode 100644 tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-test.js delete mode 100644 tests/integration/orm/belongs-to/9-one-way-polymorphic/create-test.js delete mode 100644 tests/integration/orm/belongs-to/9-one-way-polymorphic/delete-test.js delete mode 100644 tests/integration/orm/belongs-to/9-one-way-polymorphic/instantiating-test.js delete mode 100644 tests/integration/orm/belongs-to/misc-test.js delete mode 100644 tests/integration/orm/belongs-to/notes.md delete mode 100644 tests/integration/orm/belongs-to/regressions/issue-1112-test.js delete mode 100644 tests/integration/orm/belongs-to/regressions/pr-1312-test.js delete mode 100644 tests/integration/orm/collection-inflector-test.js delete mode 100644 tests/integration/orm/collection-test.js delete mode 100644 tests/integration/orm/create-test.js delete mode 100644 tests/integration/orm/destroy-test.js delete mode 100644 tests/integration/orm/find-or-create-by-test.js delete mode 100644 tests/integration/orm/find-test.js delete mode 100644 tests/integration/orm/first-test.js delete mode 100644 tests/integration/orm/has-many/1-basic/_helper.js delete mode 100644 tests/integration/orm/has-many/1-basic/accessor-test.js delete mode 100644 tests/integration/orm/has-many/1-basic/association-create-test.js delete mode 100644 tests/integration/orm/has-many/1-basic/association-new-test.js delete mode 100644 tests/integration/orm/has-many/1-basic/association-set-ids-test.js delete mode 100644 tests/integration/orm/has-many/1-basic/association-set-test.js delete mode 100644 tests/integration/orm/has-many/1-basic/create-test.js delete mode 100644 tests/integration/orm/has-many/1-basic/delete-test.js delete mode 100644 tests/integration/orm/has-many/1-basic/instantiating-test.js delete mode 100644 tests/integration/orm/has-many/10-many-to-many-polymorphic/_helper.js delete mode 100644 tests/integration/orm/has-many/10-many-to-many-polymorphic/accessor-test.js delete mode 100644 tests/integration/orm/has-many/10-many-to-many-polymorphic/association-create-test.js delete mode 100644 tests/integration/orm/has-many/10-many-to-many-polymorphic/association-new-test.js delete mode 100644 tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-ids-test.js delete mode 100644 tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-test.js delete mode 100644 tests/integration/orm/has-many/10-many-to-many-polymorphic/create-test.js delete mode 100644 tests/integration/orm/has-many/10-many-to-many-polymorphic/delete-test.js delete mode 100644 tests/integration/orm/has-many/10-many-to-many-polymorphic/instantiating-test.js delete mode 100644 tests/integration/orm/has-many/2-named/_helper.js delete mode 100644 tests/integration/orm/has-many/2-named/accessor-test.js delete mode 100644 tests/integration/orm/has-many/2-named/association-create-test.js delete mode 100644 tests/integration/orm/has-many/2-named/association-new-test.js delete mode 100644 tests/integration/orm/has-many/2-named/association-set-ids-test.js delete mode 100644 tests/integration/orm/has-many/2-named/association-set-test.js delete mode 100644 tests/integration/orm/has-many/2-named/create-test.js delete mode 100644 tests/integration/orm/has-many/2-named/delete-test.js delete mode 100644 tests/integration/orm/has-many/2-named/instantiating-test.js delete mode 100644 tests/integration/orm/has-many/3-reflexive/_helper.js delete mode 100644 tests/integration/orm/has-many/3-reflexive/accessor-test.js delete mode 100644 tests/integration/orm/has-many/3-reflexive/association-create-test.js delete mode 100644 tests/integration/orm/has-many/3-reflexive/association-new-test.js delete mode 100644 tests/integration/orm/has-many/3-reflexive/association-set-ids-test.js delete mode 100644 tests/integration/orm/has-many/3-reflexive/association-set-test.js delete mode 100644 tests/integration/orm/has-many/3-reflexive/create-test.js delete mode 100644 tests/integration/orm/has-many/3-reflexive/delete-test.js delete mode 100644 tests/integration/orm/has-many/3-reflexive/new-test.js delete mode 100644 tests/integration/orm/has-many/4-named-reflexive/_helper.js delete mode 100644 tests/integration/orm/has-many/4-named-reflexive/accessor-test.js delete mode 100644 tests/integration/orm/has-many/4-named-reflexive/association-create-test.js delete mode 100644 tests/integration/orm/has-many/4-named-reflexive/association-new-test.js delete mode 100644 tests/integration/orm/has-many/4-named-reflexive/association-set-ids-test.js delete mode 100644 tests/integration/orm/has-many/4-named-reflexive/association-set-test.js delete mode 100644 tests/integration/orm/has-many/4-named-reflexive/create-test.js delete mode 100644 tests/integration/orm/has-many/4-named-reflexive/delete-test.js delete mode 100644 tests/integration/orm/has-many/4-named-reflexive/new-test.js delete mode 100644 tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/_helper.js delete mode 100644 tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/accessor-test.js delete mode 100644 tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-create-test.js delete mode 100644 tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-new-test.js delete mode 100644 tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-ids-test.js delete mode 100644 tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-test.js delete mode 100644 tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/create-test.js delete mode 100644 tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/delete-test.js delete mode 100644 tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/new-test.js delete mode 100644 tests/integration/orm/has-many/6-one-way-reflexive/_helper.js delete mode 100644 tests/integration/orm/has-many/6-one-way-reflexive/accessor-test.js delete mode 100644 tests/integration/orm/has-many/6-one-way-reflexive/association-create-test.js delete mode 100644 tests/integration/orm/has-many/6-one-way-reflexive/association-new-test.js delete mode 100644 tests/integration/orm/has-many/6-one-way-reflexive/association-set-ids-test.js delete mode 100644 tests/integration/orm/has-many/6-one-way-reflexive/association-set-test.js delete mode 100644 tests/integration/orm/has-many/6-one-way-reflexive/create-test.js delete mode 100644 tests/integration/orm/has-many/6-one-way-reflexive/delete-test.js delete mode 100644 tests/integration/orm/has-many/6-one-way-reflexive/new-test.js delete mode 100644 tests/integration/orm/has-many/7-named-one-way-reflexive/_helper.js delete mode 100644 tests/integration/orm/has-many/7-named-one-way-reflexive/accessor-test.js delete mode 100644 tests/integration/orm/has-many/7-named-one-way-reflexive/association-create-test.js delete mode 100644 tests/integration/orm/has-many/7-named-one-way-reflexive/association-new-test.js delete mode 100644 tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-ids-test.js delete mode 100644 tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-test.js delete mode 100644 tests/integration/orm/has-many/7-named-one-way-reflexive/create-test.js delete mode 100644 tests/integration/orm/has-many/7-named-one-way-reflexive/delete-test.js delete mode 100644 tests/integration/orm/has-many/7-named-one-way-reflexive/new-test.js delete mode 100644 tests/integration/orm/has-many/8-many-to-many/_helper.js delete mode 100644 tests/integration/orm/has-many/8-many-to-many/accessor-test.js delete mode 100644 tests/integration/orm/has-many/8-many-to-many/association-create-test.js delete mode 100644 tests/integration/orm/has-many/8-many-to-many/association-new-test.js delete mode 100644 tests/integration/orm/has-many/8-many-to-many/association-set-ids-test.js delete mode 100644 tests/integration/orm/has-many/8-many-to-many/association-set-test.js delete mode 100644 tests/integration/orm/has-many/8-many-to-many/create-test.js delete mode 100644 tests/integration/orm/has-many/8-many-to-many/delete-test.js delete mode 100644 tests/integration/orm/has-many/8-many-to-many/new-test.js delete mode 100644 tests/integration/orm/has-many/9-one-way-polymorphic/_helper.js delete mode 100644 tests/integration/orm/has-many/9-one-way-polymorphic/accessor-test.js delete mode 100644 tests/integration/orm/has-many/9-one-way-polymorphic/association-create-test.js delete mode 100644 tests/integration/orm/has-many/9-one-way-polymorphic/association-new-test.js delete mode 100644 tests/integration/orm/has-many/9-one-way-polymorphic/association-set-ids-test.js delete mode 100644 tests/integration/orm/has-many/9-one-way-polymorphic/association-set-test.js delete mode 100644 tests/integration/orm/has-many/9-one-way-polymorphic/create-test.js delete mode 100644 tests/integration/orm/has-many/9-one-way-polymorphic/delete-test.js delete mode 100644 tests/integration/orm/has-many/9-one-way-polymorphic/instantiating-test.js delete mode 100644 tests/integration/orm/has-many/regressions/many-to-many-inverse-set-bug-test.js delete mode 100644 tests/integration/orm/mixed/1-one-to-many/_helper.js delete mode 100644 tests/integration/orm/mixed/1-one-to-many/accessor-test.js delete mode 100644 tests/integration/orm/mixed/1-one-to-many/association-create-test.js delete mode 100644 tests/integration/orm/mixed/1-one-to-many/association-new-test.js delete mode 100644 tests/integration/orm/mixed/1-one-to-many/association-set-ids-test.js delete mode 100644 tests/integration/orm/mixed/1-one-to-many/association-set-test.js delete mode 100644 tests/integration/orm/mixed/1-one-to-many/create-test.js delete mode 100644 tests/integration/orm/mixed/1-one-to-many/instantiating-test.js delete mode 100644 tests/integration/orm/mixed/2-many-to-one/_helper.js delete mode 100644 tests/integration/orm/mixed/2-many-to-one/accessor-test.js delete mode 100644 tests/integration/orm/mixed/2-many-to-one/association-create-test.js delete mode 100644 tests/integration/orm/mixed/2-many-to-one/association-new-test.js delete mode 100644 tests/integration/orm/mixed/2-many-to-one/association-set-ids-test.js delete mode 100644 tests/integration/orm/mixed/2-many-to-one/association-set-test.js delete mode 100644 tests/integration/orm/mixed/2-many-to-one/create-test.js delete mode 100644 tests/integration/orm/mixed/2-many-to-one/instantiating-test.js delete mode 100644 tests/integration/orm/mixed/3-one-to-many-polymorphic/_helper.js delete mode 100644 tests/integration/orm/mixed/3-one-to-many-polymorphic/accessor-test.js delete mode 100644 tests/integration/orm/mixed/3-one-to-many-polymorphic/association-create-test.js delete mode 100644 tests/integration/orm/mixed/3-one-to-many-polymorphic/association-new-test.js delete mode 100644 tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-ids-test.js delete mode 100644 tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-test.js delete mode 100644 tests/integration/orm/mixed/3-one-to-many-polymorphic/create-test.js delete mode 100644 tests/integration/orm/mixed/3-one-to-many-polymorphic/delete-test.js delete mode 100644 tests/integration/orm/mixed/3-one-to-many-polymorphic/instantiating-test.js delete mode 100644 tests/integration/orm/mixed/regressions/1613-two-bidirectional-many-to-many-with-same-target-model-update-bug-test.js delete mode 100644 tests/integration/orm/none-test.js delete mode 100644 tests/integration/orm/reinitialize-associations-test.js delete mode 100644 tests/integration/orm/schema-verification/belongs-to-test.js delete mode 100644 tests/integration/orm/schema-verification/has-many-test.js delete mode 100644 tests/integration/orm/schema-verification/mixed-test.js delete mode 100644 tests/integration/orm/update-test.js delete mode 100644 tests/integration/orm/where-test.js delete mode 100644 tests/integration/passthrough-test.js delete mode 100644 tests/integration/route-handlers/assertions-test.js delete mode 100644 tests/integration/route-handlers/delete-shorthand-test.js delete mode 100644 tests/integration/route-handlers/function-handler/basic-test.js delete mode 100644 tests/integration/route-handlers/function-handler/normalize-request-attrs-test.js delete mode 100644 tests/integration/route-handlers/function-handler/serialize-test.js delete mode 100644 tests/integration/route-handlers/get-shorthand-test.js delete mode 100644 tests/integration/route-handlers/head-shorthand-test.js delete mode 100644 tests/integration/route-handlers/post-shorthand-test.js delete mode 100644 tests/integration/route-handlers/put-shorthand-test.js delete mode 100644 tests/integration/serializers/active-model-serializer-test.js delete mode 100644 tests/integration/serializers/base/associations/embedded-collection-test.js delete mode 100644 tests/integration/serializers/base/associations/embedded-model-test.js delete mode 100644 tests/integration/serializers/base/associations/polymorphic/belongs-to-test.js delete mode 100644 tests/integration/serializers/base/associations/polymorphic/has-many-test.js delete mode 100644 tests/integration/serializers/base/associations/polymorphic/top-level-test.js delete mode 100644 tests/integration/serializers/base/associations/sideloading-and-embedded-collection-test.js delete mode 100644 tests/integration/serializers/base/associations/sideloading-and-embedded-model-test.js delete mode 100644 tests/integration/serializers/base/associations/sideloading-assorted-collections-test.js delete mode 100644 tests/integration/serializers/base/associations/sideloading-collection-test.js delete mode 100644 tests/integration/serializers/base/associations/sideloading-model-test.js delete mode 100644 tests/integration/serializers/base/assorted-collections-test.js delete mode 100644 tests/integration/serializers/base/attribute-key-formatting-test.js delete mode 100644 tests/integration/serializers/base/attrs-test.js delete mode 100644 tests/integration/serializers/base/basic-test.js delete mode 100644 tests/integration/serializers/base/full-request-test.js delete mode 100644 tests/integration/serializers/base/override-serialize-test.js delete mode 100644 tests/integration/serializers/base/root-test.js delete mode 100644 tests/integration/serializers/base/serialize-array-of-models-test.js delete mode 100644 tests/integration/serializers/base/serialize-ids-test.js delete mode 100644 tests/integration/serializers/json-api-serializer/associations/collection-test.js delete mode 100644 tests/integration/serializers/json-api-serializer/associations/includes-test.js delete mode 100644 tests/integration/serializers/json-api-serializer/associations/key-for-relationship-test.js delete mode 100644 tests/integration/serializers/json-api-serializer/associations/links-test.js delete mode 100644 tests/integration/serializers/json-api-serializer/associations/model-test.js delete mode 100644 tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js delete mode 100644 tests/integration/serializers/json-api-serializer/attrs-test.js delete mode 100644 tests/integration/serializers/json-api-serializer/base-test.js delete mode 100644 tests/integration/serializers/json-api-serializer/key-formatting-test.js delete mode 100644 tests/integration/serializers/rest-serializer-test.js delete mode 100644 tests/integration/serializers/schema-helper.js delete mode 100644 tests/integration/server-config-test.js delete mode 100644 tests/integration/server-with-orm-test.js delete mode 100644 tests/integration/server/create-and-create-list-test.js delete mode 100644 tests/integration/server/custom-responses-test.js delete mode 100644 tests/integration/server/customized-normalize-method-test.js delete mode 100644 tests/integration/server/falsy-responses-test.js delete mode 100644 tests/integration/server/get-full-path-test.js delete mode 100644 tests/integration/server/regressions/1318-linkage-data-bug-test.js delete mode 100644 tests/integration/server/regressions/1322-relationship-path-normalization-test.js delete mode 100644 tests/integration/server/regressions/1613-two-bidirectional-many-to-many-with-same-target-model-update-bug-test.js delete mode 100644 tests/integration/server/regressions/many-to-many-bug-test.js delete mode 100644 tests/integration/server/resource-shorthand-test.js delete mode 100644 tests/integration/server/shorthands/active-model-serializer-sanity-test.js delete mode 100644 tests/integration/server/shorthands/patch-shorthand-with-relationships-test.js delete mode 100644 tests/integration/server/shorthands/post-shorthand-with-relationships-test.js delete mode 100644 tests/integration/server/shorthands/rest-serializer-sanity-test.js delete mode 100644 tests/performance/simple-factory-test.js delete mode 100644 tests/performance/utils.js delete mode 100644 tests/unit/collection-test.js delete mode 100644 tests/unit/controller-test.js delete mode 100644 tests/unit/db-test.js delete mode 100644 tests/unit/db/identity-manager-test.js delete mode 100644 tests/unit/factory-test.js delete mode 100644 tests/unit/model-test.js delete mode 100644 tests/unit/reference-sort-test.js delete mode 100644 tests/unit/response-test.js delete mode 100644 tests/unit/route-handlers/shorthands/base-test.js delete mode 100644 tests/unit/schema-test.js delete mode 100644 tests/unit/serializers/active-model-serializer-test.js delete mode 100644 tests/unit/serializers/json-api-serializer-test.js delete mode 100644 tests/unit/serializers/json-api-serializer/create-includes-graph-snapshot-collections-test.js delete mode 100644 tests/unit/serializers/json-api-serializer/create-includes-graph-snapshot-mixed-test.js delete mode 100644 tests/unit/serializers/json-api-serializer/create-includes-graph-snapshot-models-test.js delete mode 100644 tests/unit/serializers/rest-serializer-test.js delete mode 100644 tests/unit/server-test.js diff --git a/.node-version b/.node-version index 894aa0bc6..5b7269c0a 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -8.16.0 +10.19.0 diff --git a/tests/integration/database-test.js b/tests/integration/database-test.js deleted file mode 100644 index 76a7def06..000000000 --- a/tests/integration/database-test.js +++ /dev/null @@ -1,39 +0,0 @@ -import {module, test} from 'qunit'; -import Server from 'ember-cli-mirage/server'; -import { Model, Factory } from 'ember-cli-mirage'; - -module('Integration | Database', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'development', - scenarios: { - default() {} - }, - models: { - author: Model - }, - factories: { - author: Factory - }, - fixtures: { - authors: [ - { id: 1, name: 'Zelda' } - ] - } - }); - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test(`[regression] When loaded, fixture files correctly update the database's autoincrement id`, function(assert) { - this.server.loadFixtures(); - - this.server.schema.authors.create({}); - - let { authors } = this.server.db; - assert.equal(authors.length, 2); - assert.deepEqual(authors.map((a) => a.id), ['1', '2']); - }); -}); diff --git a/tests/integration/db/identity-manager-test.js b/tests/integration/db/identity-manager-test.js deleted file mode 100644 index 5cfbfcf19..000000000 --- a/tests/integration/db/identity-manager-test.js +++ /dev/null @@ -1,81 +0,0 @@ -import { module, test } from 'qunit'; -import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; -import Server from 'ember-cli-mirage/server'; -import DefaultIdentityManager from 'ember-cli-mirage/identity-manager'; - -const CustomIdentityManager = class { - constructor() { - this.wasCalled = false; - } - fetch() { - if (this.wasCalled) { - throw new Error('IdentityManager used for test only supports one call to fetch'); - } - this.wasCalled = true; - return 'custom-id'; - } - set(id) { - throw new Error('Not implemented for test.'); - } - reset() { - throw new Error('Not implemented for test.'); - } -}; - -module('Integration | Db | Identity manager', function(hooks) { - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('it uses identity managers defined by config', function(assert) { - this.server = new Server({ - environment: 'test', - identityManagers: { - post: DefaultIdentityManager, - author: CustomIdentityManager - }, - models: { - author: Model.extend({ - posts: hasMany() - }), - comment: Model.extend({ - post: belongsTo() - }), - post: Model.extend({ - author: belongsTo() - }) - } - }); - - let author = server.create('author'); - let comment = server.create('comment'); - let post = server.create('post'); - assert.equal(author.id, 'custom-id', 'custom identity manager defined in config is used'); - assert.equal(post.id, '1', 'ember-cli-mirage identity manager defined in config is used'); - assert.equal(comment.id, '1', 'falls back to ember-cli-mirage identity manager if no one is defined in config for model'); - }); - - test('attribute hash is passed to identity managers fetch method', function(assert) { - assert.expect(2); - - let dataForRecord = { - foo: 'bar' - }; - let IdentityManagerForTest = class { - fetch(data) { - assert.ok(data); - assert.deepEqual(data, dataForRecord); - } - }; - this.server = new Server({ - environment: 'test', - identityManagers: { - application: IdentityManagerForTest - }, - models: { - foo: Model.extend() - } - }); - this.server.create('foo', dataForRecord); - }); -}); diff --git a/tests/integration/factories/after-create-test.js b/tests/integration/factories/after-create-test.js deleted file mode 100644 index 3536974d8..000000000 --- a/tests/integration/factories/after-create-test.js +++ /dev/null @@ -1,54 +0,0 @@ -import { module, test } from 'qunit'; -import { Model, Factory, belongsTo } from 'ember-cli-mirage'; -import Server from 'ember-cli-mirage/server'; - -module('Integration | Server | Factories | afterCreate', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'test', - models: { - author: Model, - post: Model.extend({ - author: belongsTo() - }), - comment: Model.extend({ - post: belongsTo() - }) - }, - factories: { - author: Factory.extend({ - afterCreate(author, server) { - author.update({ name: 'Sam' }); - server.create('post', { author }); - } - }), - post: Factory.extend({ - title: 'Lorem ipsum', - afterCreate(post, server) { - server.create('comment', { post }); - } - }), - comment: Factory.extend({ - text: 'Yo soy el nino' - }) - } - }); - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('it works for models', function(assert) { - let author = this.server.create('author'); - - assert.equal(author.name, 'Sam'); - assert.deepEqual(this.server.db.posts.length, 1); - assert.deepEqual(this.server.db.posts[0], { id: '1', title: 'Lorem ipsum', authorId: '1' }); - assert.deepEqual(this.server.db.comments.length, 1); - assert.deepEqual(this.server.db.comments[0], { id: '1', text: 'Yo soy el nino', postId: '1' }); - }); - - // test('it works for db records', function(assert) { - // }); -}); diff --git a/tests/integration/factories/helpers-test.js b/tests/integration/factories/helpers-test.js deleted file mode 100644 index d78e15031..000000000 --- a/tests/integration/factories/helpers-test.js +++ /dev/null @@ -1,131 +0,0 @@ -import { module, test } from 'qunit'; -import { Model, Factory, belongsTo, hasMany, trait, association } from 'ember-cli-mirage'; -import Server from 'ember-cli-mirage/server'; - -module('Integration | Server | Factories | helpers', function(hooks) { - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('it creates associations with "association" helper in a dasherized factory', function(assert) { - this.server = new Server({ - environment: 'test', - models: { - author: Model.extend({ - blogPosts: hasMany() - }), - blogPost: Model.extend({ - author: belongsTo() - }) - }, - factories: { - author: Factory.extend({ - name: 'Sam' - }), - blogPost: Factory.extend({ - title: 'Lorem ipsum', - - author: association() - }) - } - }); - - let blogPost = this.server.create('blog-post'); - - assert.ok(blogPost.author); - - let { db } = this.server; - - assert.equal(db.authors.length, 1); - assert.deepEqual(db.authors[0], { - id: '1', - name: 'Sam', - blogPostIds: ['1'] - }); - }); - - test('it creates associations with "association" helper combininig with traits', function(assert) { - this.server = new Server({ - environment: 'test', - models: { - author: Model.extend({ - posts: hasMany() - }), - category: Model.extend({ - posts: hasMany('post', { inverse: 'kind' }) - }), - post: Model.extend({ - author: belongsTo(), - kind: belongsTo('category') - }) - }, - factories: { - author: Factory.extend({ - name: 'Sam' - }), - category: Factory.extend({ - name: 'awesome software' - }), - post: Factory.extend({ - title: 'Lorem ipsum', - - author: association(), - - withCategory: trait({ - kind: association() - }) - }) - } - }); - - let post = this.server.create('post', 'withCategory'); - - assert.ok(post.kind); - assert.ok(post.author); - - let { db } = this.server; - - assert.equal(db.posts.length, 1); - assert.deepEqual(db.posts[0], { - id: '1', - title: 'Lorem ipsum', - authorId: '1', - kindId: '1' - }); - - assert.equal(db.authors.length, 1); - assert.deepEqual(db.authors[0], { - id: '1', - name: 'Sam', - postIds: ['1'] - }); - - assert.equal(db.categories.length, 1); - assert.deepEqual(db.categories[0], { - id: '1', - name: 'awesome software', - postIds: ['1'] - }); - }); - - test('it throws if using the association helper on a self-referential belongsTo relationship', function(assert) { - this.server = new Server({ - environment: 'test', - models: { - page: Model.extend({ - parentPage: belongsTo('page', { inverse: 'childPages' }), - childPages: hasMany('page', { inverse: 'parentPage' }) - }) - }, - factories: { - page: Factory.extend({ - parentPage: association() - }) - } - }); - - assert.throws(() => { - this.server.create('page'); - }, /You're using the association\(\) helper on your page factory for parentPage, which is a belongsTo self-referential relationship. You can't do this as it will lead to infinite recursion. You can move the helper inside of a trait and use it selectively./); - }); -}); diff --git a/tests/integration/http-verbs-test.js b/tests/integration/http-verbs-test.js deleted file mode 100644 index ad5fa43c2..000000000 --- a/tests/integration/http-verbs-test.js +++ /dev/null @@ -1,140 +0,0 @@ -import {module, test} from 'qunit'; -import Server from 'ember-cli-mirage/server'; -import { Model } from 'ember-cli-mirage'; -import promiseAjax from '../helpers/promise-ajax'; - -module('Integration | HTTP Verbs', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'development', - models: { - contact: Model - } - }); - this.server.timing = 0; - this.server.logging = false; - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('mirage responds to get', async function(assert) { - assert.expect(1); - - this.server.get('/contacts', function() { - return true; - }); - - let { data } = await promiseAjax({ - method: 'GET', - url: '/contacts' - }); - - assert.equal(data, true); - }); - - test('mirage responds to post', async function(assert) { - assert.expect(1); - - this.server.post('/contacts', function() { - return true; - }); - - let { data } = await promiseAjax({ - method: 'POST', - url: '/contacts' - }); - - assert.equal(data, true); - }); - - test('mirage responds to put', async function(assert) { - assert.expect(1); - - this.server.put('/contacts', function() { - return true; - }); - - let { data } = await promiseAjax({ - method: 'PUT', - url: '/contacts' - }); - - assert.equal(data, true); - }); - - test('mirage responds to delete', async function(assert) { - assert.expect(1); - - this.server.delete('/contacts', function() { - return true; - }); - - let { data } = await promiseAjax({ - method: 'DELETE', - url: '/contacts' - }); - - assert.equal(data, true); - }); - - test('mirage responds to patch', async function(assert) { - assert.expect(1); - - this.server.patch('/contacts', function() { - return true; - }); - - let { data } = await promiseAjax({ - method: 'PATCH', - url: '/contacts' - }); - - assert.equal(data, true); - }); - - test('mirage responds to resource', function(assert) { - assert.expect(0); - let done = assert.async(); - - this.server.resource('contacts'); - - promiseAjax({ - method: 'GET', - url: '/contacts' - }).then(function() { - done(); - }); - }); - - test('response code can be customized', async function(assert) { - assert.expect(1); - - this.server.get('/contacts', {}, 404); - - try { - await promiseAjax({ - method: 'GET', - url: '/contacts' - }); - } catch(e) { - assert.ok(e.xhr.status, 404); - } - }); - - test('mirage responds to options', async function(assert) { - assert.expect(1); - - this.server.options('/contacts', function() { - return true; - }); - - let { data } = await promiseAjax({ - method: 'OPTIONS', - url: '/contacts' - }); - - assert.equal(data, true); - }); -}); diff --git a/tests/integration/index-named-imports-test.js b/tests/integration/index-named-imports-test.js deleted file mode 100644 index d02bfff37..000000000 --- a/tests/integration/index-named-imports-test.js +++ /dev/null @@ -1,39 +0,0 @@ -import { test } from 'qunit'; -import { - Factory, - Response, - Model, - Serializer, - ActiveModelSerializer, - JSONAPISerializer, - hasMany, - belongsTo, - IdentityManager -} from 'ember-cli-mirage'; - -test('Factory is present in named exports from ember-cli-mirage', function(assert) { - assert.ok(Factory); -}); - -test('Response is present in named exports from ember-cli-mirage', function(assert) { - assert.ok(Response); -}); - -test('Model is present in named exports from ember-cli-mirage', function(assert) { - assert.ok(Model); -}); - -test('serializers are present in named exports from ember-cli-mirage', function(assert) { - assert.ok(ActiveModelSerializer); - assert.ok(JSONAPISerializer); - assert.ok(Serializer); -}); - -test('relationship helpers are present in named exports from ember-cli-mirage', function(assert) { - assert.ok(hasMany); - assert.ok(belongsTo); -}); - -test('IdentityManager ist present in named exports from ember-cli-mirage', function(assert) { - assert.ok(IdentityManager); -}); diff --git a/tests/integration/load-fixtures-test.js b/tests/integration/load-fixtures-test.js deleted file mode 100644 index e7b3fa166..000000000 --- a/tests/integration/load-fixtures-test.js +++ /dev/null @@ -1,59 +0,0 @@ -import {module, test} from 'qunit'; -import Server from 'ember-cli-mirage/server'; - -module('Integration | Server #loadFixtures', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'development', - scenarios: { - default() {} - }, - factories: { - author: {}, - post: {}, - comment: {} - }, - fixtures: { - authors: [ - { id: 1, name: 'Zelda' }, - { id: 2, name: 'Link' } - ], - posts: [ - { id: 1, title: 'Lorem' }, - { id: 2, title: 'Ipsum' } - ], - comments: [ - { id: 1, title: 'Lorem' } - ] - } - }); - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('it can load all fixtures in the map', function(assert) { - this.server.loadFixtures(); - - assert.equal(this.server.db.authors.length, 2); - assert.equal(this.server.db.posts.length, 2); - assert.equal(this.server.db.comments.length, 1); - }); - - test('it can load a single named fixture file', function(assert) { - this.server.loadFixtures('authors'); - - assert.equal(this.server.db.authors.length, 2); - assert.equal(this.server.db.posts.length, 0); - assert.equal(this.server.db.comments.length, 0); - }); - - test('it can load several named single fixtures', function(assert) { - this.server.loadFixtures('authors', 'posts'); - - assert.equal(this.server.db.authors.length, 2); - assert.equal(this.server.db.posts.length, 2); - assert.equal(this.server.db.comments.length, 0); - }); -}); diff --git a/tests/integration/orm/all-test.js b/tests/integration/orm/all-test.js deleted file mode 100644 index c3ae84c79..000000000 --- a/tests/integration/orm/all-test.js +++ /dev/null @@ -1,41 +0,0 @@ -import Schema from "ember-cli-mirage/orm/schema"; -import Model from "ember-cli-mirage/orm/model"; -import Db from "ember-cli-mirage/db"; -import Collection from "ember-cli-mirage/orm/collection"; -import { module, test } from "qunit"; - -module("Integration | ORM | #all", function() { - test("it can return all models", function(assert) { - let db = new Db({ - users: [{ id: 1, name: "Link" }, { id: 2, name: "Zelda" }] - }); - let User = Model.extend(); - let schema = new Schema(db, { - user: User - }); - - let users = schema.users.all(); - assert.ok(users instanceof Collection, "it returns a collection"); - assert.ok( - users.models[0] instanceof User, - "each member of the collection is a model" - ); - assert.equal(users.models.length, 2); - assert.deepEqual(users.models[1].attrs, { id: "2", name: "Zelda" }); - }); - - test("it returns an empty array when no models exist", function(assert) { - let db = new Db({ users: [] }); - - let User = Model.extend(); - let schema = new Schema(db, { - user: User - }); - - let users = schema.users.all(); - - assert.ok(users instanceof Collection, "it returns a collection"); - assert.equal(users.modelName, "user", "the collection knows its type"); - assert.equal(users.models.length, 0); - }); -}); diff --git a/tests/integration/orm/assertions-test.js b/tests/integration/orm/assertions-test.js deleted file mode 100644 index 676409b72..000000000 --- a/tests/integration/orm/assertions-test.js +++ /dev/null @@ -1,77 +0,0 @@ -import { module, test } from 'qunit'; -import Server from 'ember-cli-mirage/server'; -import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; - -module('Integration | ORM | assertions', function(hooks) { - - hooks.beforeEach(function() { - this.server = new Server({ - models: { - user: Model.extend({ - posts: hasMany() - }), - post: Model.extend({ - author: belongsTo('user') - }) - } - }); - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('it errors when passing in the wrong type for a HasMany association', function(assert) { - assert.throws(() => { - this.server.schema.users.create({ - name: 'Sam', - posts: [ 1 ] - }); - }, /You're trying to create a user model and you passed in "1" under the posts key, but that key is a HasMany relationship./); - }); - - test(`it doesn't error when passing in an empty array`, function(assert) { - this.server.schema.users.create({ - name: 'Sam', - posts: [] - }); - assert.ok(true); - }); - - test('it errors when passing in the wrong type for a HasMany association foreign key', function(assert) { - assert.throws(() => { - this.server.schema.users.create({ - name: 'Sam', - postIds: 'foo' - }); - }, /You're trying to create a user model and you passed in "foo" under the postIds key, but that key is a foreign key for a HasMany relationship./); - }); - - test('it errors when passing in a missing foreign key for a HasMany association foreign key', function(assert) { - assert.throws(() => { - this.server.schema.users.create({ - name: 'Sam', - postIds: [ 2 ] - }); - }, /You're instantiating a user that has a postIds of 2, but some of those records don't exist in the database/); - }); - - test('it errors when passing in the wrong type for a BelongsTo association', function(assert) { - assert.throws(() => { - this.server.schema.posts.create({ - title: 'Post 1', - author: 'sam' - }); - }, /You're trying to create a post model and you passed in "sam" under the author key, but that key is a BelongsTo relationship./); - }); - - test('it errors when passing in a missing foreign key for a BelongsTo association foreign key', function(assert) { - assert.throws(() => { - this.server.schema.posts.create({ - title: 'Post 1', - authorId: 1 - }); - }, /You're instantiating a post that has a authorId of 1, but that record doesn't exist in the database/); - }); - -}); diff --git a/tests/integration/orm/attrs-test.js b/tests/integration/orm/attrs-test.js deleted file mode 100644 index 523f5404d..000000000 --- a/tests/integration/orm/attrs-test.js +++ /dev/null @@ -1,31 +0,0 @@ -import Schema from "ember-cli-mirage/orm/schema"; -import Model from "ember-cli-mirage/orm/model"; -import Db from "ember-cli-mirage/db"; -import { module, test } from "qunit"; - -var db, schema, User; - -module("Integration | ORM | attrs", function(hooks) { - hooks.beforeEach(function() { - db = new Db( - { users: [{ id: 1, name: "Link", evil: false }] } - ); - - User = Model.extend(); - schema = new Schema(db, { - user: User - }); - }); - - test("attrs returns the models attributes", function(assert) { - let user = schema.users.find(1); - - assert.deepEqual(user.attrs, { id: "1", name: "Link", evil: false }); - }); - - test("attributes can be read via plain property access", function(assert) { - let user = schema.users.find(1); - - assert.equal(user.name, "Link"); - }); -}); diff --git a/tests/integration/orm/belongs-to/1-basic/_helper.js b/tests/integration/orm/belongs-to/1-basic/_helper.js deleted file mode 100644 index 4d27f4e57..000000000 --- a/tests/integration/orm/belongs-to/1-basic/_helper.js +++ /dev/null @@ -1,96 +0,0 @@ -import { Model, belongsTo } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -/* - A model with a belongsTo association can be in six states - with respect to its association. This helper class - returns a child (and its association) in these various states. - - The return value is an array of the form - - [ child, parent ] - - where the parent may be undefined. -*/ -export default class BelongsToHelper { - - constructor() { - this.db = new Db(); - - this.schema = new Schema(this.db, { - author: Model.extend(), - post: Model.extend({ - author: belongsTo() - }) - }); - } - - savedChildNoParent() { - let insertedPost = this.db.posts.insert({ title: 'Lorem' }); - - return [ this.schema.posts.find(insertedPost.id), undefined ]; - } - - savedChildNewParent() { - let insertedPost = this.db.posts.insert({ title: 'Lorem' }); - let post = this.schema.posts.find(insertedPost.id); - let author = this.schema.authors.new({ name: 'Bob' }); - - post.author = author; - - return [ post, author ]; - } - - savedChildSavedParent() { - let insertedAuthor = this.db.authors.insert({ name: 'Bob' }); - let insertedPost = this.db.posts.insert({ title: 'Lorem', authorId: insertedAuthor.id }); - let post = this.schema.posts.find(insertedPost.id); - let author = this.schema.authors.find(insertedAuthor.id); - - return [ post, author ]; - } - - newChildNoParent() { - return [ this.schema.posts.new({ title: 'Lorem' }), undefined ]; - } - - newChildNewParent() { - let post = this.schema.posts.new({ title: 'Lorem' }); - let newAuthor = this.schema.authors.new({ name: 'Bob' }); - post.author = newAuthor; - - return [ post, newAuthor ]; - } - - newChildSavedParent() { - let insertedAuthor = this.db.authors.insert({ name: 'Bob' }); - let post = this.schema.posts.new({ title: 'Lorem' }); - let savedAuthor = this.schema.authors.find(insertedAuthor.id); - - post.author = savedAuthor; - - return [ post, savedAuthor ]; - } - - // Just a saved unassociated parent. - savedParent() { - let insertedAuthor = this.db.authors.insert({ name: 'Bob' }); - - return this.schema.authors.find(insertedAuthor.id); - } - - newParent() { - return this.schema.authors.new({ name: 'Bob' }); - } - -} - -export const states = [ - 'savedChildNoParent', - 'savedChildNewParent', - 'savedChildSavedParent', - 'newChildNoParent', - 'newChildNewParent', - 'newChildSavedParent' -]; diff --git a/tests/integration/orm/belongs-to/1-basic/_regressions-test.js b/tests/integration/orm/belongs-to/1-basic/_regressions-test.js deleted file mode 100644 index e8b46c257..000000000 --- a/tests/integration/orm/belongs-to/1-basic/_regressions-test.js +++ /dev/null @@ -1,27 +0,0 @@ -import { Model, belongsTo } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Basic | regressions', function() { - test('belongsTo accessors works when foreign key is present but falsy', function(assert) { - let db = new Db({ - posts: [ - { id: 1, authorId: 0, name: 'some post' } - ], - authors: [ - { id: 0, name: 'Foo' } - ] - }); - - let schema = new Schema(db, { - author: Model.extend(), - post: Model.extend({ - author: belongsTo() - }) - }); - - let post = schema.posts.find(1); - assert.equal(post.author.name, 'Foo'); - }); -}); diff --git a/tests/integration/orm/belongs-to/1-basic/accessor-test.js b/tests/integration/orm/belongs-to/1-basic/accessor-test.js deleted file mode 100644 index 72a8e9fec..000000000 --- a/tests/integration/orm/belongs-to/1-basic/accessor-test.js +++ /dev/null @@ -1,22 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Basic | accessor', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ post, author ] = this.helper[state](); - - assert.deepEqual(post.author, author ? author : null, 'the model reference is correct'); - assert.equal(post.authorId, author ? author.id : null, 'the modelId reference is correct'); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/1-basic/association-create-test.js b/tests/integration/orm/belongs-to/1-basic/association-create-test.js deleted file mode 100644 index 7b787ec6e..000000000 --- a/tests/integration/orm/belongs-to/1-basic/association-create-test.js +++ /dev/null @@ -1,26 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Basic | association #create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a belongs-to association, for all states - */ - states.forEach((state) => { - - test(`a ${state} can create an associated parent`, function(assert) { - let [ post ] = this.helper[state](); - - let ganon = post.createAuthor({ name: 'Ganon' }); - - assert.ok(ganon.id, 'the parent was persisted'); - assert.deepEqual(post.author.attrs, ganon.attrs); - assert.equal(post.authorId, ganon.id); - assert.equal(this.helper.schema.posts.find(post.id).authorId, ganon.id, 'the child was persisted'); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/1-basic/association-new-test.js b/tests/integration/orm/belongs-to/1-basic/association-new-test.js deleted file mode 100644 index 82043ff86..000000000 --- a/tests/integration/orm/belongs-to/1-basic/association-new-test.js +++ /dev/null @@ -1,31 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Basic | association #new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ - - states.forEach((state) => { - - test(`a ${state} can build a new associated parent`, function(assert) { - let [ post ] = this.helper[state](); - - let ganon = post.newAuthor({ name: 'Ganon' }); - - assert.ok(!ganon.id, 'the parent was not persisted'); - assert.deepEqual(post.author, ganon); - assert.equal(post.authorId, null); - - post.save(); - - assert.ok(ganon.id, 'saving the child persists the parent'); - assert.equal(post.authorId, ganon.id, 'the childs fk was updated'); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/1-basic/association-set-id-test.js b/tests/integration/orm/belongs-to/1-basic/association-set-id-test.js deleted file mode 100644 index 6e0394465..000000000 --- a/tests/integration/orm/belongs-to/1-basic/association-set-id-test.js +++ /dev/null @@ -1,41 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Basic | association #setId', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ post ] = this.helper[state](); - let savedAuthor = this.helper.savedParent(); - - post.authorId = savedAuthor.id; - - assert.equal(post.authorId, savedAuthor.id); - assert.deepEqual(post.author.attrs, savedAuthor.attrs); - }); - - }); - - [ - 'savedChildSavedParent', - 'newChildSavedParent' - ].forEach((state) => { - - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ post ] = this.helper[state](); - - post.authorId = null; - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/1-basic/association-set-test.js b/tests/integration/orm/belongs-to/1-basic/association-set-test.js deleted file mode 100644 index 9da46642b..000000000 --- a/tests/integration/orm/belongs-to/1-basic/association-set-test.js +++ /dev/null @@ -1,44 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Basic | association #set', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ post ] = this.helper[state](); - let savedAuthor = this.helper.savedParent(); - - post.author = savedAuthor; - - assert.equal(post.authorId, savedAuthor.id); - assert.deepEqual(post.author, savedAuthor); - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ post ] = this.helper[state](); - let newAuthor = this.helper.newParent(); - - post.author = newAuthor; - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, newAuthor); - }); - - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ post ] = this.helper[state](); - - post.author = null; - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/1-basic/create-test.js b/tests/integration/orm/belongs-to/1-basic/create-test.js deleted file mode 100644 index 56ee68c3c..000000000 --- a/tests/integration/orm/belongs-to/1-basic/create-test.js +++ /dev/null @@ -1,60 +0,0 @@ -import Helper from './_helper'; -import { Model } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Basic | create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let author = this.helper.schema.create('author'); - let post = this.helper.schema.create('post', { - authorId: author.id - }); - - assert.equal(post.authorId, author.id); - assert.deepEqual(post.author.attrs, author.attrs); - assert.equal(this.helper.schema.db.authors.length, 1); - assert.deepEqual(this.helper.schema.db.authors[0], { id: '1' }); - assert.equal(this.helper.schema.db.posts.length, 1); - assert.deepEqual(this.helper.schema.db.posts[0], { id: '1', authorId: '1' }); - }); - - test('it sets up associations correctly when passing in the association itself', function(assert) { - let author = this.helper.schema.create('author'); - let post = this.helper.schema.create('post', { - author - }); - - assert.equal(post.authorId, author.id); - assert.deepEqual(post.author.attrs, author.attrs); - assert.equal(this.helper.schema.db.authors.length, 1); - assert.deepEqual(this.helper.schema.db.authors[0], { id: '1' }); - assert.equal(this.helper.schema.db.posts.length, 1); - assert.deepEqual(this.helper.schema.db.posts[0], { id: '1', authorId: '1' }); - }); - - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.create('post', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); - - assert.throws(function() { - schema.create('post', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); -}); diff --git a/tests/integration/orm/belongs-to/1-basic/delete-test.js b/tests/integration/orm/belongs-to/1-basic/delete-test.js deleted file mode 100644 index d284dcc6d..000000000 --- a/tests/integration/orm/belongs-to/1-basic/delete-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Basic | delete', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ post, author ] = this.helper[state](); - - if (author) { - author.destroy(); - post.reload(); - } - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/1-basic/instantiating-test.js b/tests/integration/orm/belongs-to/1-basic/instantiating-test.js deleted file mode 100644 index 4d27ee4a3..000000000 --- a/tests/integration/orm/belongs-to/1-basic/instantiating-test.js +++ /dev/null @@ -1,82 +0,0 @@ -import Helper from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Basic | instantiating', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the child accepts a saved parent id', function(assert) { - let author = this.helper.savedParent(); - let post = this.schema.posts.new({ authorId: author.id }); - - assert.equal(post.authorId, author.id); - assert.deepEqual(post.author, author); - assert.deepEqual(post.attrs, { authorId: author.id }); - }); - - test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.posts.new({ authorId: 2 }); - }, /You're instantiating a post that has a authorId of 2, but that record doesn't exist in the database/); - }); - - test('the child accepts a null parent id', function(assert) { - let post = this.schema.posts.new({ authorId: null }); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - assert.deepEqual(post.attrs, { authorId: null }); - }); - - test('the child accepts a saved parent model', function(assert) { - let author = this.helper.savedParent(); - let post = this.schema.posts.new({ author }); - - assert.equal(post.authorId, 1); - assert.deepEqual(post.author, author); - }); - - test('the child accepts a new parent model', function(assert) { - let zelda = this.schema.authors.new({ name: 'Zelda' }); - let post = this.schema.posts.new({ author: zelda }); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, zelda); - assert.deepEqual(post.attrs, { authorId: null }); - }); - - test('the child accepts a null parent model', function(assert) { - let post = this.schema.posts.new({ author: null }); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - assert.deepEqual(post.attrs, { authorId: null }); - }); - - test('the child accepts a parent model and id', function(assert) { - let author = this.helper.savedParent(); - let post = this.schema.posts.new({ author, authorId: author.id }); - - assert.equal(post.authorId, '1'); - assert.deepEqual(post.author, author); - assert.deepEqual(post.attrs, { authorId: author.id }); - }); - - test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let post = this.schema.posts.new({}); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - assert.deepEqual(post.attrs, { authorId: null }); - }); - - test('the child accepts no reference to a parent id or model', function(assert) { - let post = this.schema.posts.new(); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - assert.deepEqual(post.attrs, { authorId: null }); - }); -}); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/_helper.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/_helper.js deleted file mode 100644 index a5ad9814b..000000000 --- a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/_helper.js +++ /dev/null @@ -1,105 +0,0 @@ -import { Model, belongsTo } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -/* - A model with a belongsTo association can be in six states - with respect to its association. This helper class - returns a child (and its association) in these various states. - - The return value is an array of the form - - [ child, parent ] - - where the parent may be undefined. -*/ -export default class BelongsToHelper { - - constructor() { - this.db = new Db(); - this.loadData = this.db.loadData.bind(this.db); - - this.schema = new Schema(this.db, { - post: Model.extend({ - comment: belongsTo() - }), - comment: Model.extend({ - commentable: belongsTo({ polymorphic: true }) - }) - }); - } - - savedChildNoParent() { - let insertedComment = this.db.comments.insert({ text: 'Lorem' }); - - return [ this.schema.comments.find(insertedComment.id), undefined ]; - } - - savedChildNewParent() { - let comment = this.schema.comments.create({ text: 'Lorem' }); - let post = this.schema.posts.new({ title: 'Post 1' }); - - comment.commentable = post; - - return [ comment, post ]; - } - - savedChildSavedParent() { - this.loadData({ - posts: [ - { id: '1', title: 'Post 1', commentId: '1' } - ], - comments: [ - { id: '1', text: 'Lorem', commentableId: { id: '1', type: 'post' } } - ] - }); - - let comment = this.schema.comments.find(1); - let post = this.schema.posts.find(1); - - return [ comment, post ]; - } - - newChildNoParent() { - return [ this.schema.comments.new({ text: 'Lorem' }), undefined ]; - } - - newChildNewParent() { - let post = this.schema.posts.new({ title: 'Post 1' }); - let comment = this.schema.comments.new({ text: 'Lorem' }); - comment.commentable = post; - - return [ comment, post ]; - } - - newChildSavedParent() { - let insertedPost = this.db.posts.insert({ title: 'Post 1' }); - let comment = this.schema.comments.new({ text: 'Lorem' }); - let savedProfile = this.schema.posts.find(insertedPost.id); - - comment.commentable = savedProfile; - - return [ comment, savedProfile ]; - } - - // Just a saved unassociated parent. - savedParent() { - let insertedPost = this.db.posts.insert({ title: 'Post 1' }); - - return this.schema.posts.find(insertedPost.id); - } - - newParent() { - return this.schema.posts.new({ title: 'Post 1' }); - } - -} - -export const states = [ - 'savedChildNoParent', - 'savedChildNewParent', - 'savedChildSavedParent', - 'newChildNoParent', - 'newChildNewParent', - 'newChildSavedParent' -]; diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/accessor-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/accessor-test.js deleted file mode 100644 index 5483c2bcd..000000000 --- a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/accessor-test.js +++ /dev/null @@ -1,34 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One-to-one Polymorphic | accessor', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ comment, post ] = this.helper[state](); - - // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison - if (post) { - assert.deepEqual(comment.commentable.attrs, post.attrs, 'the model reference is correct'); - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }, 'the modelId reference is correct'); - } else { - assert.deepEqual(comment.commentable, null, 'the model reference is correct'); - assert.equal(comment.commentableId, null, 'the modelId reference is correct'); - } - - // If there's a post in this state, make sure the inverse association is correct - if (post) { - assert.deepEqual(post.comment.attrs, comment.attrs, 'the inverse model reference is correct'); - assert.equal(post.commentId, comment.id, 'the inverse modelId reference is correct'); - } - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-create-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-create-test.js deleted file mode 100644 index ab8b7ea8a..000000000 --- a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-create-test.js +++ /dev/null @@ -1,27 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One-to-one Polymorphic | association #create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a belongs-to association, for all states - */ - states.forEach((state) => { - - test(`a ${state} can create an associated parent`, function(assert) { - let [ comment ] = this.helper[state](); - - let post = comment.createCommentable('post', { title: 'Lorem' }); - - assert.ok(post.id, 'the parent was persisted'); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.deepEqual(post.comment.attrs, comment.attrs, 'the inverse was set'); - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); - assert.deepEqual(this.helper.schema.comments.find(comment.id).commentableId, { type: 'post', id: post.id }, 'the comment was persisted'); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-new-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-new-test.js deleted file mode 100644 index 7fb5aefeb..000000000 --- a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-new-test.js +++ /dev/null @@ -1,33 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One-to-one Polymorphic | association #new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ - - states.forEach((state) => { - - test(`a ${state} can build a new associated parent`, function(assert) { - let [ comment ] = this.helper[state](); - - let post = comment.newCommentable('post', { age: 300 }); - - assert.ok(!post.id, 'the parent was not persisted'); - assert.deepEqual(comment.commentable, post); - assert.deepEqual(comment.commentableId, { type: 'post', id: undefined }); - assert.deepEqual(post.comment, comment, 'the inverse was set'); - assert.equal(post.commentId, comment.id); - - comment.save(); - - assert.ok(post.id, 'saving the child persists the parent'); - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }, 'the childs fk was updated'); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-id-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-id-test.js deleted file mode 100644 index 2f15f0b7c..000000000 --- a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-id-test.js +++ /dev/null @@ -1,47 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One-to-one Polymorphic | association #setId', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ comment ] = this.helper[state](); - let post = this.helper.savedParent(); - - comment.commentableId = { type: 'post', id: post.id }; - - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); - assert.deepEqual(comment.commentable.attrs, post.attrs); - - comment.save(); - post.reload(); - - assert.equal(post.commentId, comment.id, 'the inverse was set'); - assert.deepEqual(post.comment.attrs, comment.attrs); - }); - - }); - - [ - 'savedChildSavedParent', - 'newChildSavedParent' - ].forEach((state) => { - - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ comment ] = this.helper[state](); - - comment.commentableId = null; - - assert.equal(comment.commentableId, null); - assert.equal(comment.commentable, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-test.js deleted file mode 100644 index f034f2cb8..000000000 --- a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/association-set-test.js +++ /dev/null @@ -1,49 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One-to-one Polymorphic | association #set', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ comment ] = this.helper[state](); - let post = this.helper.savedParent(); - - comment.commentable = post; - - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.equal(post.commentId, comment.id, 'the inverse was set'); - assert.deepEqual(post.comment.attrs, comment.attrs); - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ comment ] = this.helper[state](); - let post = this.helper.newParent(); - - comment.commentable = post; - - assert.deepEqual(comment.commentableId, { type: 'post', id: undefined }); - assert.deepEqual(comment.commentable.attrs, post.attrs); - - assert.equal(post.commentId, comment.id, 'the inverse was set'); - assert.deepEqual(post.comment.attrs, comment.attrs); - }); - - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ comment ] = this.helper[state](); - - comment.commentable = null; - - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/create-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/create-test.js deleted file mode 100644 index 7de39aa98..000000000 --- a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/create-test.js +++ /dev/null @@ -1,65 +0,0 @@ -import Helper from './_helper'; -import { Model } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One-to-one Polymorphic | create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let post = schema.create('post'); - let comment = schema.create('comment', { - commentableId: { type: 'post', id: post.id } - }); - post.reload(); - - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.deepEqual(post.comment.attrs, comment.attrs); - assert.equal(schema.db.comments.length, 1); - assert.equal(schema.db.posts.length, 1); - assert.deepEqual(schema.db.comments[0], { id: '1', commentableId: { type: 'post', id: '1' } }); - assert.deepEqual(schema.db.posts[0], { id: '1', commentId: '1' }); - }); - - test('it sets up associations correctly when passing in the association itself', function(assert) { - let { schema } = this.helper; - let post = schema.create('post'); - let comment = schema.create('comment', { - commentable: post - }); - - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.deepEqual(post.comment.attrs, comment.attrs); - assert.equal(schema.db.comments.length, 1); - assert.equal(schema.db.posts.length, 1); - assert.deepEqual(schema.db.comments[0], { id: '1', commentableId: { type: 'post', id: '1' } }); - assert.deepEqual(schema.db.posts[0], { id: '1', commentId: '1' }); - }); - - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.create('comment', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); - - assert.throws(function() { - schema.create('comment', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); -}); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/delete-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/delete-test.js deleted file mode 100644 index 567d24065..000000000 --- a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/delete-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One-to-one Polymorphic | delete', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ comment, post ] = this.helper[state](); - - if (post) { - post.destroy(); - comment.reload(); - } - - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/instantiating-test.js b/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/instantiating-test.js deleted file mode 100644 index bdbfd0367..000000000 --- a/tests/integration/orm/belongs-to/10-one-to-one-polymorphic/instantiating-test.js +++ /dev/null @@ -1,83 +0,0 @@ -import Helper from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One-to-one Polymorphic | instantiating', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the child accepts a saved parent id', function(assert) { - let post = this.helper.savedParent(); - let comment = this.schema.comments.new({ commentableId: { type: 'post', id: post.id } }); - - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.deepEqual(comment.attrs, { commentableId: { type: 'post', id: post.id } }); - }); - - test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.comments.new({ commentableId: { type: 'post', id: 2 } }); - }, /You're instantiating a comment that has a commentableId of post:2, but that record doesn't exist in the database/); - }); - - test('the child accepts a null parent id', function(assert) { - let comment = this.schema.comments.new({ commentableId: null }); - - assert.equal(comment.commentableId, null); - assert.equal(comment.commentable, null); - assert.deepEqual(comment.attrs, { commentableId: null }); - }); - - test('the child accepts a saved parent model', function(assert) { - let post = this.helper.savedParent(); - let comment = this.schema.comments.new({ commentable: post }); - - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.deepEqual(comment.attrs, { commentableId: null }); // this would update when saved - }); - - test('the child accepts a new parent model', function(assert) { - let post = this.schema.posts.new({ age: 300 }); - let comment = this.schema.comments.new({ commentable: post }); - - assert.deepEqual(comment.commentableId, { type: 'post', id: undefined }); - assert.deepEqual(comment.commentable, post); - assert.deepEqual(comment.attrs, { commentableId: null }); - }); - - test('the child accepts a null parent model', function(assert) { - let comment = this.schema.comments.new({ commentable: null }); - - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - assert.deepEqual(comment.attrs, { commentableId: null }); - }); - - test('the child accepts a parent model and id', function(assert) { - let post = this.helper.savedParent(); - let comment = this.schema.comments.new({ commentable: post, commentableId: { type: 'post', id: post.id } }); - - assert.deepEqual(comment.commentableId, { type: 'post', id: '1' }); - assert.deepEqual(comment.commentable, post); - assert.deepEqual(comment.attrs, { commentableId: { type: 'post', id: post.id } }); - }); - - test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let comment = this.schema.comments.new({}); - - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - assert.deepEqual(comment.attrs, { commentableId: null }); - }); - - test('the child accepts no reference to a parent id or model', function(assert) { - let comment = this.schema.comments.new(); - - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - assert.deepEqual(comment.attrs, { commentableId: null }); - }); -}); diff --git a/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/_helper.js b/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/_helper.js deleted file mode 100644 index 183d52b5c..000000000 --- a/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/_helper.js +++ /dev/null @@ -1,72 +0,0 @@ -import { Model, belongsTo } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -/* - A model with a belongsTo association can be in six states - with respect to its association. This helper class - returns a child (and its association) in these various states. - - The return value is an array of the form - - [ child, parent ] - - where the parent may be undefined. -*/ -export default class BelongsToHelper { - - constructor() { - this.db = new Db(); - - this.schema = new Schema(this.db, { - user: Model.extend({ - representative: belongsTo('user', { inverse: null }) - }) - }); - } - - savedChildNoParent() { - let link = this.db.users.insert({ name: 'Link' }); - - return [ this.schema.users.find(link.id), undefined ]; - } - - savedChildSavedParent() { - let linkDbRecord = this.db.users.insert({ name: 'Link' }); - this.db.users.update(linkDbRecord.id, { representativeId: linkDbRecord.id }); - - let link = this.schema.users.find(linkDbRecord.id); - - return [ link, link ]; - } - - newChildNoParent() { - return [ this.schema.users.new({ name: 'Link' }), undefined ]; - } - - newChildNewParent() { - let link = this.schema.users.new({ name: 'Link' }); - link.representative = link; - - return [ link, link ]; - } - - // Just a saved unassociated parent. - // savedParent() { - // let insertedParent = this.db.users.insert({ name: 'Bob' }); - // - // return this.schema.users.find(insertedParent.id); - // } - // - // newParent() { - // return this.schema.users.new({ name: 'Bob' }); - // } - -} - -export const states = [ - 'savedChildNoParent', - 'savedChildSavedParent', - 'newChildNoParent', - 'newChildNewParent' -]; diff --git a/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/accessor-test.js b/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/accessor-test.js deleted file mode 100644 index 4200794bc..000000000 --- a/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/accessor-test.js +++ /dev/null @@ -1,28 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named one-way reflexive self referential | accessor', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ user, representative ] = this.helper[state](); - - // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison - if (representative) { - assert.deepEqual(user.representative.attrs, representative.attrs, 'the model reference is correct'); - assert.equal(user.representativeId, representative.id, 'the modelId reference is correct'); - } else { - assert.deepEqual(user.representative, null, 'the model reference is correct'); - assert.equal(user.representativeId, null, 'the modelId reference is correct'); - } - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-create-test.js b/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-create-test.js deleted file mode 100644 index 03cbadfe1..000000000 --- a/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-create-test.js +++ /dev/null @@ -1,26 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named one-way reflexive self referential | association #create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a belongs-to association, for all states - */ - states.forEach((state) => { - - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); - - let ganon = user.createRepresentative({ name: 'Ganon' }); - - assert.ok(ganon.id, 'the parent was persisted'); - assert.deepEqual(user.representative.attrs, ganon.attrs); - assert.equal(user.representativeId, ganon.id); - assert.equal(this.helper.schema.users.find(user.id).representativeId, ganon.id, 'the user was persisted'); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-new-test.js b/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-new-test.js deleted file mode 100644 index 7dd2d2e24..000000000 --- a/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-new-test.js +++ /dev/null @@ -1,31 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named one-way reflexive self referential | association #new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ - - states.forEach((state) => { - - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); - - let ganon = user.newRepresentative({ name: 'Ganon' }); - - assert.ok(!ganon.id, 'the parent was not persisted'); - assert.deepEqual(user.representative, ganon); - assert.equal(user.representativeId, null); - - user.save(); - - assert.ok(ganon.id, 'saving the child persists the parent'); - assert.equal(user.representativeId, ganon.id, 'the childs fk was updated'); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-set-id-test.js b/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-set-id-test.js deleted file mode 100644 index b470f865a..000000000 --- a/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-set-id-test.js +++ /dev/null @@ -1,54 +0,0 @@ -import Helper from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named one-way reflexive self referential | association #setId', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - - [ - 'savedChildNoParent', - 'savedChildSavedParent' - ].forEach((state) => { - - test(`a ${state} can update its association to itself via parentId`, function(assert) { - let [ user ] = this.helper[state](); - - user.representativeId = user.id; - - assert.equal(user.representativeId, user.id); - assert.deepEqual(user.representative.attrs, user.attrs); - - user.save(); - - assert.equal(user.representativeId, user.id); - assert.deepEqual(user.representative.attrs, user.attrs); - }); - - }); - - [ - 'savedChildSavedParent', - 'newChildNewParent' - ].forEach((state) => { - - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ user ] = this.helper[state](); - - user.representativeId = null; - - assert.equal(user.representativeId, null); - assert.equal(user.representative, null); - - user.save(); - - assert.equal(user.representativeId, null); - assert.equal(user.representative, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-set-test.js b/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-set-test.js deleted file mode 100644 index 4fb814992..000000000 --- a/tests/integration/orm/belongs-to/11-named-one-way-reflexive-self-referential/association-set-test.js +++ /dev/null @@ -1,43 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named one-way reflexive self referential | association #set', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to itself`, function(assert) { - let [ user ] = this.helper[state](); - - user.representative = user; - - assert.equal(user.representativeId, user.id); - assert.deepEqual(user.representative.attrs, user.attrs); - - user.save(); - - assert.equal(user.representativeId, user.id); - assert.deepEqual(user.representative.attrs, user.attrs); - }); - - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ user ] = this.helper[state](); - - user.representative = null; - - assert.equal(user.representativeId, null); - assert.deepEqual(user.representative, null); - - user.save(); - - assert.equal(user.representativeId, null); - assert.deepEqual(user.representative, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/2-named/_helper.js b/tests/integration/orm/belongs-to/2-named/_helper.js deleted file mode 100644 index 332999e6e..000000000 --- a/tests/integration/orm/belongs-to/2-named/_helper.js +++ /dev/null @@ -1,96 +0,0 @@ -import { Model, belongsTo } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -/* - A model with a belongsTo association can be in six states - with respect to its association. This helper class - returns a child (and its association) in these various states. - - The return value is an array of the form - - [ child, parent ] - - where the parent may be undefined. -*/ -export default class BelongsToHelper { - - constructor() { - this.db = new Db(); - - this.schema = new Schema(this.db, { - user: Model.extend(), - post: Model.extend({ - author: belongsTo('user') - }) - }); - } - - savedChildNoParent() { - let insertedPost = this.db.posts.insert({ title: 'Lorem' }); - - return [ this.schema.posts.find(insertedPost.id), undefined ]; - } - - savedChildNewParent() { - let insertedPost = this.db.posts.insert({ title: 'Lorem' }); - let post = this.schema.posts.find(insertedPost.id); - let author = this.schema.users.new({ name: 'Bob' }); - - post.author = author; - - return [ post, author ]; - } - - savedChildSavedParent() { - let insertedAuthor = this.db.users.insert({ name: 'Bob' }); - let insertedPost = this.db.posts.insert({ title: 'Lorem', authorId: insertedAuthor.id }); - let post = this.schema.posts.find(insertedPost.id); - let author = this.schema.users.find(insertedAuthor.id); - - return [ post, author ]; - } - - newChildNoParent() { - return [ this.schema.posts.new({ title: 'Lorem' }), undefined ]; - } - - newChildNewParent() { - let post = this.schema.posts.new({ title: 'Lorem' }); - let newAuthor = this.schema.users.new({ name: 'Bob' }); - post.author = newAuthor; - - return [ post, newAuthor ]; - } - - newChildSavedParent() { - let insertedAuthor = this.db.users.insert({ name: 'Bob' }); - let post = this.schema.posts.new({ title: 'Lorem' }); - let savedAuthor = this.schema.users.find(insertedAuthor.id); - - post.author = savedAuthor; - - return [ post, savedAuthor ]; - } - - // Just a saved unassociated parent. - savedParent() { - let insertedAuthor = this.db.users.insert({ name: 'Bob' }); - - return this.schema.users.find(insertedAuthor.id); - } - - newParent() { - return this.schema.users.new({ name: 'Bob' }); - } - -} - -export const states = [ - 'savedChildNoParent', - 'savedChildNewParent', - 'savedChildSavedParent', - 'newChildNoParent', - 'newChildNewParent', - 'newChildSavedParent' -]; diff --git a/tests/integration/orm/belongs-to/2-named/accessor-test.js b/tests/integration/orm/belongs-to/2-named/accessor-test.js deleted file mode 100644 index b4c0c8dca..000000000 --- a/tests/integration/orm/belongs-to/2-named/accessor-test.js +++ /dev/null @@ -1,22 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named | accessor', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ post, author ] = this.helper[state](); - - assert.deepEqual(post.author, author ? author : null, 'the model reference is correct'); - assert.equal(post.authorId, author ? author.id : null, 'the modelId reference is correct'); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/2-named/association-create-test.js b/tests/integration/orm/belongs-to/2-named/association-create-test.js deleted file mode 100644 index 501979a33..000000000 --- a/tests/integration/orm/belongs-to/2-named/association-create-test.js +++ /dev/null @@ -1,26 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named | association #create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a belongs-to association, for all states - */ - states.forEach((state) => { - - test(`a ${state} can create an associated parent`, function(assert) { - let [ post ] = this.helper[state](); - - let ganon = post.createAuthor({ name: 'Ganon' }); - - assert.ok(ganon.id, 'the parent was persisted'); - assert.deepEqual(post.author.attrs, ganon.attrs); - assert.equal(post.authorId, ganon.id); - assert.equal(this.helper.schema.posts.find(post.id).authorId, ganon.id, 'the child was persisted'); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/2-named/association-new-test.js b/tests/integration/orm/belongs-to/2-named/association-new-test.js deleted file mode 100644 index ff83afa23..000000000 --- a/tests/integration/orm/belongs-to/2-named/association-new-test.js +++ /dev/null @@ -1,31 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named | association #new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ - - states.forEach((state) => { - - test(`a ${state} can build a new associated parent`, function(assert) { - let [ post ] = this.helper[state](); - - let ganon = post.newAuthor({ name: 'Ganon' }); - - assert.ok(!ganon.id, 'the parent was not persisted'); - assert.deepEqual(post.author, ganon); - assert.equal(post.authorId, null); - - post.save(); - - assert.ok(ganon.id, 'saving the child persists the parent'); - assert.equal(post.authorId, ganon.id, 'the childs fk was updated'); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/2-named/association-set-id-test.js b/tests/integration/orm/belongs-to/2-named/association-set-id-test.js deleted file mode 100644 index fa8682ec6..000000000 --- a/tests/integration/orm/belongs-to/2-named/association-set-id-test.js +++ /dev/null @@ -1,41 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named | association #setId', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ post ] = this.helper[state](); - let savedAuthor = this.helper.savedParent(); - - post.authorId = savedAuthor.id; - - assert.equal(post.authorId, savedAuthor.id); - assert.deepEqual(post.author, savedAuthor); - }); - - }); - - [ - 'savedChildSavedParent', - 'newChildSavedParent' - ].forEach((state) => { - - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ post ] = this.helper[state](); - - post.authorId = null; - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/2-named/association-set-test.js b/tests/integration/orm/belongs-to/2-named/association-set-test.js deleted file mode 100644 index a3e0b775f..000000000 --- a/tests/integration/orm/belongs-to/2-named/association-set-test.js +++ /dev/null @@ -1,44 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named | association #set', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ post ] = this.helper[state](); - let savedAuthor = this.helper.savedParent(); - - post.author = savedAuthor; - - assert.equal(post.authorId, savedAuthor.id); - assert.deepEqual(post.author, savedAuthor); - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ post ] = this.helper[state](); - let newAuthor = this.helper.newParent(); - - post.author = newAuthor; - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, newAuthor); - }); - - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ post ] = this.helper[state](); - - post.author = null; - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/2-named/create-test.js b/tests/integration/orm/belongs-to/2-named/create-test.js deleted file mode 100644 index 200429048..000000000 --- a/tests/integration/orm/belongs-to/2-named/create-test.js +++ /dev/null @@ -1,60 +0,0 @@ -import Helper from './_helper'; -import { Model } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named | create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let author = this.helper.schema.create('user'); - let post = this.helper.schema.create('post', { - authorId: author.id - }); - - assert.equal(post.authorId, author.id); - assert.deepEqual(post.author.attrs, author.attrs); - assert.equal(this.helper.schema.db.users.length, 1); - assert.deepEqual(this.helper.schema.db.users[0], { id: '1' }); - assert.equal(this.helper.schema.db.posts.length, 1); - assert.deepEqual(this.helper.schema.db.posts[0], { id: '1', authorId: '1' }); - }); - - test('it sets up associations correctly when passing in the association itself', function(assert) { - let author = this.helper.schema.create('user'); - let post = this.helper.schema.create('post', { - author - }); - - assert.equal(post.authorId, author.id); - assert.deepEqual(post.author.attrs, author.attrs); - assert.equal(this.helper.schema.db.users.length, 1); - assert.deepEqual(this.helper.schema.db.users[0], { id: '1' }); - assert.equal(this.helper.schema.db.posts.length, 1); - assert.deepEqual(this.helper.schema.db.posts[0], { id: '1', authorId: '1' }); - }); - - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.create('post', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); - - assert.throws(function() { - schema.create('post', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); -}); diff --git a/tests/integration/orm/belongs-to/2-named/delete-test.js b/tests/integration/orm/belongs-to/2-named/delete-test.js deleted file mode 100644 index 855a3674d..000000000 --- a/tests/integration/orm/belongs-to/2-named/delete-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named | delete', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ post, user ] = this.helper[state](); - - if (user) { - user.destroy(); - post.reload(); - } - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/2-named/instantiating-test.js b/tests/integration/orm/belongs-to/2-named/instantiating-test.js deleted file mode 100644 index 2570e37c9..000000000 --- a/tests/integration/orm/belongs-to/2-named/instantiating-test.js +++ /dev/null @@ -1,82 +0,0 @@ -import Helper from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named | instantiating', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the child accepts a saved parent id', function(assert) { - let author = this.helper.savedParent(); - let post = this.schema.posts.new({ authorId: author.id }); - - assert.equal(post.authorId, author.id); - assert.deepEqual(post.author, author); - assert.deepEqual(post.attrs, { authorId: author.id }); - }); - - test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.posts.new({ authorId: 2 }); - }, /You're instantiating a post that has a authorId of 2, but that record doesn't exist in the database/); - }); - - test('the child accepts a null parent id', function(assert) { - let post = this.schema.posts.new({ authorId: null }); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - assert.deepEqual(post.attrs, { authorId: null }); - }); - - test('the child accepts a saved parent model', function(assert) { - let author = this.helper.savedParent(); - let post = this.schema.posts.new({ author }); - - assert.equal(post.authorId, 1); - assert.deepEqual(post.author, author); - }); - - test('the child accepts a new parent model', function(assert) { - let zelda = this.schema.users.new({ name: 'Zelda' }); - let post = this.schema.posts.new({ author: zelda }); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, zelda); - assert.deepEqual(post.attrs, { authorId: null }); - }); - - test('the child accepts a null parent model', function(assert) { - let post = this.schema.posts.new({ author: null }); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - assert.deepEqual(post.attrs, { authorId: null }); - }); - - test('the child accepts a parent model and id', function(assert) { - let author = this.helper.savedParent(); - let post = this.schema.posts.new({ author, authorId: author.id }); - - assert.equal(post.authorId, '1'); - assert.deepEqual(post.author, author); - assert.deepEqual(post.attrs, { authorId: author.id }); - }); - - test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let post = this.schema.posts.new({}); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - assert.deepEqual(post.attrs, { authorId: null }); - }); - - test('the child accepts no reference to a parent id or model', function(assert) { - let post = this.schema.posts.new(); - - assert.equal(post.authorId, null); - assert.deepEqual(post.author, null); - assert.deepEqual(post.attrs, { authorId: null }); - }); -}); diff --git a/tests/integration/orm/belongs-to/3-reflexive/_helper.js b/tests/integration/orm/belongs-to/3-reflexive/_helper.js deleted file mode 100644 index 9d0c00fd1..000000000 --- a/tests/integration/orm/belongs-to/3-reflexive/_helper.js +++ /dev/null @@ -1,95 +0,0 @@ -import { Model, belongsTo } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -/* - A model with a belongsTo association can be in six states - with respect to its association. This helper class - returns a child (and its association) in these various states. - - The return value is an array of the form - - [ child, parent ] - - where the parent may be undefined. -*/ -export default class BelongsToHelper { - - constructor() { - this.db = new Db(); - - this.schema = new Schema(this.db, { - user: Model.extend({ - user: belongsTo() // implicit inverse - }) - }); - } - - savedChildNoParent() { - let insertedUser = this.db.users.insert({ name: 'Link' }); - - return [ this.schema.users.find(insertedUser.id), undefined ]; - } - - savedChildNewParent() { - let user = this.schema.users.create({ name: 'Link' }); - let friend = this.schema.users.new({ name: 'Bob' }); - - user.user = friend; - - return [ user, friend ]; - } - - savedChildSavedParent() { - let insertedFriend = this.db.users.insert({ name: 'Bob' }); - let insertedUser = this.db.users.insert({ name: 'Link', userId: insertedFriend.id }); - this.db.users.update(insertedFriend.id, { userId: insertedUser.id }); - let user = this.schema.users.find(insertedUser.id); - let friend = this.schema.users.find(insertedFriend.id); - - return [ user, friend ]; - } - - newChildNoParent() { - return [ this.schema.users.new({ name: 'Link' }), undefined ]; - } - - newChildNewParent() { - let friend = this.schema.users.new({ name: 'Link' }); - let user = this.schema.users.new({ name: 'Bob' }); - user.user = friend; - - return [ user, friend ]; - } - - newChildSavedParent() { - let insertedFriend = this.db.users.insert({ name: 'Bob' }); - let user = this.schema.users.new({ name: 'Link' }); - let savedFriend = this.schema.users.find(insertedFriend.id); - - user.user = savedFriend; - - return [ user, savedFriend ]; - } - - // Just a saved unassociated parent. - savedParent() { - let insertedParent = this.db.users.insert({ name: 'Bob' }); - - return this.schema.users.find(insertedParent.id); - } - - newParent() { - return this.schema.users.new({ name: 'Bob' }); - } - -} - -export const states = [ - 'savedChildNoParent', - 'savedChildNewParent', - 'savedChildSavedParent', - 'newChildNoParent', - 'newChildNewParent', - 'newChildSavedParent' -]; diff --git a/tests/integration/orm/belongs-to/3-reflexive/accessor-test.js b/tests/integration/orm/belongs-to/3-reflexive/accessor-test.js deleted file mode 100644 index 10a59b71e..000000000 --- a/tests/integration/orm/belongs-to/3-reflexive/accessor-test.js +++ /dev/null @@ -1,34 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Reflexive | accessor', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ user, friend ] = this.helper[state](); - - // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison - if (friend) { - assert.deepEqual(user.user.attrs, friend.attrs, 'the model reference is correct'); - assert.equal(user.userId, friend.id, 'the modelId reference is correct'); - } else { - assert.deepEqual(user.user, null, 'the model reference is correct'); - assert.equal(user.userId, null, 'the modelId reference is correct'); - } - - // If there's a friend in this state, make sure the inverse association is correct - if (friend) { - assert.deepEqual(friend.user.attrs, user.attrs, 'the inverse model reference is correct'); - assert.equal(friend.userId, user.id, 'the inverse modelId reference is correct'); - } - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/3-reflexive/association-create-test.js b/tests/integration/orm/belongs-to/3-reflexive/association-create-test.js deleted file mode 100644 index d660cce01..000000000 --- a/tests/integration/orm/belongs-to/3-reflexive/association-create-test.js +++ /dev/null @@ -1,33 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Reflexive | association #create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a belongs-to association, for all states - */ - states.forEach((state) => { - - test(`a ${state} can create an associated parent`, function(assert) { - let [ user, originalUser ] = this.helper[state](); - - let ganon = user.createUser({ name: 'Ganon' }); - - assert.ok(ganon.id, 'the parent was persisted'); - assert.deepEqual(user.user.attrs, ganon.attrs); - assert.deepEqual(ganon.user.attrs, user.attrs, 'the inverse was set'); - assert.equal(user.userId, ganon.id); - assert.equal(ganon.userId, user.id, 'the inverse was set'); - assert.equal(this.helper.schema.users.find(user.id).userId, ganon.id, 'the user was persisted'); - - if (originalUser) { - originalUser.reload(); - assert.equal(originalUser.userId, null, 'old inverses were cleared out'); - } - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/3-reflexive/association-new-test.js b/tests/integration/orm/belongs-to/3-reflexive/association-new-test.js deleted file mode 100644 index 2955a9c88..000000000 --- a/tests/integration/orm/belongs-to/3-reflexive/association-new-test.js +++ /dev/null @@ -1,37 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Reflexive | association #new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ - - states.forEach((state) => { - - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user, originalUser ] = this.helper[state](); - - let ganon = user.newUser({ name: 'Ganon' }); - - assert.ok(!ganon.id, 'the parent was not persisted'); - assert.deepEqual(user.user, ganon); - assert.equal(user.userId, null); - assert.deepEqual(ganon.user, user, 'the inverse was set'); - - user.save(); - - assert.ok(ganon.id, 'saving the child persists the parent'); - assert.equal(user.userId, ganon.id, 'the childs fk was updated'); - - if (originalUser) { - originalUser.reload(); - assert.equal(originalUser.userId, null, 'old inverses were cleared out'); - } - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/3-reflexive/association-set-id-test.js b/tests/integration/orm/belongs-to/3-reflexive/association-set-id-test.js deleted file mode 100644 index 0c3e7a719..000000000 --- a/tests/integration/orm/belongs-to/3-reflexive/association-set-id-test.js +++ /dev/null @@ -1,53 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Reflexive | association #setId', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user, originalUser ] = this.helper[state](); - let friend = this.helper.savedParent(); - - user.userId = friend.id; - - assert.equal(user.userId, friend.id); - assert.deepEqual(user.user.attrs, friend.attrs); - - user.save(); - if (originalUser) { - originalUser.reload(); - assert.equal(originalUser.userId, null, 'old inverses were cleared out'); - } - }); - - }); - - [ - 'savedChildSavedParent', - 'newChildSavedParent' - ].forEach((state) => { - - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ user, originalUser ] = this.helper[state](); - - user.userId = null; - - assert.equal(user.userId, null); - assert.equal(user.user, null); - - user.save(); - if (originalUser) { - originalUser.reload(); - assert.equal(originalUser.userId, null, 'old inverses were cleared out'); - } - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/3-reflexive/association-set-test.js b/tests/integration/orm/belongs-to/3-reflexive/association-set-test.js deleted file mode 100644 index 843099bf8..000000000 --- a/tests/integration/orm/belongs-to/3-reflexive/association-set-test.js +++ /dev/null @@ -1,62 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Reflexive | association #set', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ user, originalUser ] = this.helper[state](); - let friend = this.helper.savedParent(); - - user.user = friend; - - assert.equal(user.userId, friend.id); - assert.deepEqual(user.user.attrs, friend.attrs); - - user.save(); - if (originalUser) { - originalUser.reload(); - assert.equal(originalUser.userId, null, 'old inverses were cleared out'); - } - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user, originalUser ] = this.helper[state](); - let friend = this.helper.newParent(); - - user.user = friend; - - assert.equal(user.userId, null); - assert.deepEqual(user.user.attrs, friend.attrs); - - user.save(); - if (originalUser) { - originalUser.reload(); - assert.equal(originalUser.userId, null, 'old inverses were cleared out'); - } - }); - - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ user, originalUser ] = this.helper[state](); - - user.user = null; - - assert.equal(user.userId, null); - assert.deepEqual(user.user, null); - - user.save(); - if (originalUser) { - originalUser.reload(); - assert.equal(originalUser.userId, null, 'old inverses were cleared out'); - } - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/3-reflexive/create-test.js b/tests/integration/orm/belongs-to/3-reflexive/create-test.js deleted file mode 100644 index 0189771f3..000000000 --- a/tests/integration/orm/belongs-to/3-reflexive/create-test.js +++ /dev/null @@ -1,62 +0,0 @@ -import Helper from './_helper'; -import { Model } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Reflexive | create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let friend = schema.create('user'); - let user = schema.create('user', { - userId: friend.id - }); - - friend.reload(); - - assert.equal(user.userId, friend.id); - assert.deepEqual(user.user.attrs, friend.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', userId: '2' }); - assert.deepEqual(schema.db.users[1], { id: '2', userId: '1' }); - }); - - test('it sets up associations correctly when passing in the association itself', function(assert) { - let { schema } = this.helper; - let friend = schema.create('user'); - let user = schema.create('user', { - user: friend - }); - - assert.equal(user.userId, friend.id); - assert.deepEqual(user.user.attrs, friend.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', userId: '2' }); - assert.deepEqual(schema.db.users[1], { id: '2', userId: '1' }); - }); - - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.create('user', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); - - assert.throws(function() { - schema.create('user', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); -}); diff --git a/tests/integration/orm/belongs-to/3-reflexive/delete-test.js b/tests/integration/orm/belongs-to/3-reflexive/delete-test.js deleted file mode 100644 index 1d94301ed..000000000 --- a/tests/integration/orm/belongs-to/3-reflexive/delete-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Reflexive | delete', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ user, targetUser ] = this.helper[state](); - - if (targetUser) { - targetUser.destroy(); - user.reload(); - } - - assert.equal(user.userId, null); - assert.deepEqual(user.user, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/3-reflexive/instantiating-test.js b/tests/integration/orm/belongs-to/3-reflexive/instantiating-test.js deleted file mode 100644 index da45fb1e0..000000000 --- a/tests/integration/orm/belongs-to/3-reflexive/instantiating-test.js +++ /dev/null @@ -1,83 +0,0 @@ -import Helper from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Reflexive | instantiating', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the child accepts a saved parent id', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ userId: friend.id }); - - assert.equal(user.userId, friend.id); - assert.deepEqual(user.user.attrs, friend.attrs); - assert.deepEqual(user.attrs, { userId: friend.id }); - }); - - test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ userId: 2 }); - }, /You're instantiating a user that has a userId of 2, but that record doesn't exist in the database/); - }); - - test('the child accepts a null parent id', function(assert) { - let user = this.schema.users.new({ userId: null }); - - assert.equal(user.userId, null); - assert.equal(user.user, null); - assert.deepEqual(user.attrs, { userId: null }); - }); - - test('the child accepts a saved parent model', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ user: friend }); - - assert.equal(user.userId, 1); - assert.deepEqual(user.user.attrs, friend.attrs); - assert.deepEqual(user.attrs, { userId: null }); // this would update when saved - }); - - test('the child accepts a new parent model', function(assert) { - let zelda = this.schema.users.new({ name: 'Zelda' }); - let user = this.schema.users.new({ user: zelda }); - - assert.equal(user.userId, null); - assert.deepEqual(user.user, zelda); - assert.deepEqual(user.attrs, { userId: null }); - }); - - test('the child accepts a null parent model', function(assert) { - let user = this.schema.users.new({ user: null }); - - assert.equal(user.userId, null); - assert.deepEqual(user.user, null); - assert.deepEqual(user.attrs, { userId: null }); - }); - - test('the child accepts a parent model and id', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ user: friend, userId: friend.id }); - - assert.equal(user.userId, '1'); - assert.deepEqual(user.user, friend); - assert.deepEqual(user.attrs, { userId: friend.id }); - }); - - test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let user = this.schema.users.new({}); - - assert.equal(user.userId, null); - assert.deepEqual(user.user, null); - assert.deepEqual(user.attrs, { userId: null }); - }); - - test('the child accepts no reference to a parent id or model', function(assert) { - let user = this.schema.users.new(); - - assert.equal(user.userId, null); - assert.deepEqual(user.user, null); - assert.deepEqual(user.attrs, { userId: null }); - }); -}); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/_helper.js b/tests/integration/orm/belongs-to/4-named-reflexive/_helper.js deleted file mode 100644 index 54a5b1017..000000000 --- a/tests/integration/orm/belongs-to/4-named-reflexive/_helper.js +++ /dev/null @@ -1,95 +0,0 @@ -import { Model, belongsTo } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -/* - A model with a belongsTo association can be in six states - with respect to its association. This helper class - returns a child (and its association) in these various states. - - The return value is an array of the form - - [ child, parent ] - - where the parent may be undefined. -*/ -export default class BelongsToHelper { - - constructor() { - this.db = new Db(); - - this.schema = new Schema(this.db, { - user: Model.extend({ - bestFriend: belongsTo('user') // implicit inverse - }) - }); - } - - savedChildNoParent() { - let insertedUser = this.db.users.insert({ name: 'Link' }); - - return [ this.schema.users.find(insertedUser.id), undefined ]; - } - - savedChildNewParent() { - let user = this.schema.users.create({ name: 'Link' }); - let friend = this.schema.users.new({ name: 'Bob' }); - - user.bestFriend = friend; - - return [ user, friend ]; - } - - savedChildSavedParent() { - let insertedFriend = this.db.users.insert({ name: 'Bob' }); - let insertedUser = this.db.users.insert({ name: 'Link', bestFriendId: insertedFriend.id }); - this.db.users.update(insertedFriend.id, { bestFriendId: insertedUser.id }); - let user = this.schema.users.find(insertedUser.id); - let friend = this.schema.users.find(insertedFriend.id); - - return [ user, friend ]; - } - - newChildNoParent() { - return [ this.schema.users.new({ name: 'Link' }), undefined ]; - } - - newChildNewParent() { - let friend = this.schema.users.new({ name: 'Link' }); - let user = this.schema.users.new({ name: 'Bob' }); - user.bestFriend = friend; - - return [ user, friend ]; - } - - newChildSavedParent() { - let insertedFriend = this.db.users.insert({ name: 'Bob' }); - let user = this.schema.users.new({ name: 'Link' }); - let savedFriend = this.schema.users.find(insertedFriend.id); - - user.bestFriend = savedFriend; - - return [ user, savedFriend ]; - } - - // Just a saved unassociated parent. - savedParent() { - let insertedParent = this.db.users.insert({ name: 'Bob' }); - - return this.schema.users.find(insertedParent.id); - } - - newParent() { - return this.schema.users.new({ name: 'Bob' }); - } - -} - -export const states = [ - 'savedChildNoParent', - 'savedChildNewParent', - 'savedChildSavedParent', - 'newChildNoParent', - 'newChildNewParent', - 'newChildSavedParent' -]; diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/accessor-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/accessor-test.js deleted file mode 100644 index d3011430b..000000000 --- a/tests/integration/orm/belongs-to/4-named-reflexive/accessor-test.js +++ /dev/null @@ -1,34 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named Reflexive | accessor', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ user, friend ] = this.helper[state](); - - // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison - if (friend) { - assert.deepEqual(user.bestFriend.attrs, friend.attrs, 'the model reference is correct'); - assert.equal(user.bestFriendId, friend.id, 'the modelId reference is correct'); - } else { - assert.deepEqual(user.bestFriend, null, 'the model reference is correct'); - assert.equal(user.bestFriendId, null, 'the modelId reference is correct'); - } - - // If there's a friend in this state, make sure the inverse association is correct - if (friend) { - assert.deepEqual(friend.bestFriend.attrs, user.attrs, 'the inverse model reference is correct'); - assert.equal(friend.bestFriendId, user.id, 'the inverse modelId reference is correct'); - } - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/association-create-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/association-create-test.js deleted file mode 100644 index 5107cee5f..000000000 --- a/tests/integration/orm/belongs-to/4-named-reflexive/association-create-test.js +++ /dev/null @@ -1,26 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named Reflexive | association #create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a belongs-to association, for all states - */ - states.forEach((state) => { - - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); - - let ganon = user.createBestFriend({ name: 'Ganon' }); - - assert.ok(ganon.id, 'the parent was persisted'); - assert.deepEqual(user.bestFriend.attrs, ganon.attrs); - assert.equal(user.bestFriendId, ganon.id); - assert.equal(this.helper.schema.users.find(user.id).bestFriendId, ganon.id, 'the user was persisted'); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/association-new-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/association-new-test.js deleted file mode 100644 index 4a38a1113..000000000 --- a/tests/integration/orm/belongs-to/4-named-reflexive/association-new-test.js +++ /dev/null @@ -1,31 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named Reflexive | association #new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ - - states.forEach((state) => { - - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); - - let ganon = user.newBestFriend({ name: 'Ganon' }); - - assert.ok(!ganon.id, 'the parent was not persisted'); - assert.deepEqual(user.bestFriend, ganon); - assert.equal(user.bestFriendId, null); - - user.save(); - - assert.ok(ganon.id, 'saving the child persists the parent'); - assert.equal(user.bestFriendId, ganon.id, 'the childs fk was updated'); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/association-set-id-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/association-set-id-test.js deleted file mode 100644 index 012fa66f5..000000000 --- a/tests/integration/orm/belongs-to/4-named-reflexive/association-set-id-test.js +++ /dev/null @@ -1,41 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named Reflexive | association #setId', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user ] = this.helper[state](); - let friend = this.helper.savedParent(); - - user.bestFriendId = friend.id; - - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - }); - - }); - - [ - 'savedChildSavedParent', - 'newChildSavedParent' - ].forEach((state) => { - - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ user ] = this.helper[state](); - - user.bestFriendId = null; - - assert.equal(user.bestFriendId, null); - assert.equal(user.bestFriend, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/association-set-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/association-set-test.js deleted file mode 100644 index bd19b6eef..000000000 --- a/tests/integration/orm/belongs-to/4-named-reflexive/association-set-test.js +++ /dev/null @@ -1,44 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named Reflexive | association #set', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ user ] = this.helper[state](); - let friend = this.helper.savedParent(); - - user.bestFriend = friend; - - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user ] = this.helper[state](); - let friend = this.helper.newParent(); - - user.bestFriend = friend; - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - }); - - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ user ] = this.helper[state](); - - user.bestFriend = null; - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/create-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/create-test.js deleted file mode 100644 index 3bd081637..000000000 --- a/tests/integration/orm/belongs-to/4-named-reflexive/create-test.js +++ /dev/null @@ -1,62 +0,0 @@ -import Helper from './_helper'; -import { Model } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named Reflexive | create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let friend = schema.create('user'); - let user = schema.create('user', { - bestFriendId: friend.id - }); - - friend.reload(); - - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', bestFriendId: '2' }); - assert.deepEqual(schema.db.users[1], { id: '2', bestFriendId: '1' }); - }); - - test('it sets up associations correctly when passing in the association itself', function(assert) { - let { schema } = this.helper; - let friend = schema.create('user'); - let user = schema.create('user', { - bestFriend: friend - }); - - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', bestFriendId: '2' }); - assert.deepEqual(schema.db.users[1], { id: '2', bestFriendId: '1' }); - }); - - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.create('user', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); - - assert.throws(function() { - schema.create('user', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); -}); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/delete-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/delete-test.js deleted file mode 100644 index 04a42a0d8..000000000 --- a/tests/integration/orm/belongs-to/4-named-reflexive/delete-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named Reflexive | delete', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ user, bestFriend ] = this.helper[state](); - - if (bestFriend) { - bestFriend.destroy(); - user.reload(); - } - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/4-named-reflexive/instantiating-test.js b/tests/integration/orm/belongs-to/4-named-reflexive/instantiating-test.js deleted file mode 100644 index 654277944..000000000 --- a/tests/integration/orm/belongs-to/4-named-reflexive/instantiating-test.js +++ /dev/null @@ -1,83 +0,0 @@ -import Helper from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named Reflexive | instantiating', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the child accepts a saved parent id', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ bestFriendId: friend.id }); - - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - assert.deepEqual(user.attrs, { bestFriendId: friend.id }); - }); - - test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ bestFriendId: 2 }); - }, /You're instantiating a user that has a bestFriendId of 2, but that record doesn't exist in the database/); - }); - - test('the child accepts a null parent id', function(assert) { - let user = this.schema.users.new({ bestFriendId: null }); - - assert.equal(user.bestFriendId, null); - assert.equal(user.bestFriend, null); - assert.deepEqual(user.attrs, { bestFriendId: null }); - }); - - test('the child accepts a saved parent model', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ bestFriend: friend }); - - assert.equal(user.bestFriendId, 1); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - assert.deepEqual(user.attrs, { bestFriendId: null }); // this would update when saved - }); - - test('the child accepts a new parent model', function(assert) { - let zelda = this.schema.users.new({ name: 'Zelda' }); - let user = this.schema.users.new({ bestFriend: zelda }); - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, zelda); - assert.deepEqual(user.attrs, { bestFriendId: null }); - }); - - test('the child accepts a null parent model', function(assert) { - let user = this.schema.users.new({ bestFriend: null }); - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - assert.deepEqual(user.attrs, { bestFriendId: null }); - }); - - test('the child accepts a parent model and id', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ bestFriend: friend, bestFriendId: friend.id }); - - assert.equal(user.bestFriendId, '1'); - assert.deepEqual(user.bestFriend, friend); - assert.deepEqual(user.attrs, { bestFriendId: friend.id }); - }); - - test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let user = this.schema.users.new({}); - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - assert.deepEqual(user.attrs, { bestFriendId: null }); - }); - - test('the child accepts no reference to a parent id or model', function(assert) { - let user = this.schema.users.new(); - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - assert.deepEqual(user.attrs, { bestFriendId: null }); - }); -}); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/_helper.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/_helper.js deleted file mode 100644 index 1f3f25bb7..000000000 --- a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/_helper.js +++ /dev/null @@ -1,95 +0,0 @@ -import { Model, belongsTo } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -/* - A model with a belongsTo association can be in six states - with respect to its association. This helper class - returns a child (and its association) in these various states. - - The return value is an array of the form - - [ child, parent ] - - where the parent may be undefined. -*/ -export default class BelongsToHelper { - - constructor() { - this.db = new Db(); - - this.schema = new Schema(this.db, { - user: Model.extend({ - bestFriend: belongsTo('user', { inverse: 'bestFriend' }) - }) - }); - } - - savedChildNoParent() { - let insertedUser = this.db.users.insert({ name: 'Link' }); - - return [ this.schema.users.find(insertedUser.id), undefined ]; - } - - savedChildNewParent() { - let user = this.schema.users.create({ name: 'Link' }); - let friend = this.schema.users.new({ name: 'Bob' }); - - user.bestFriend = friend; - - return [ user, friend ]; - } - - savedChildSavedParent() { - let insertedFriend = this.db.users.insert({ name: 'Bob' }); - let insertedUser = this.db.users.insert({ name: 'Link', bestFriendId: insertedFriend.id }); - this.db.users.update(insertedFriend.id, { bestFriendId: insertedUser.id }); - let user = this.schema.users.find(insertedUser.id); - let friend = this.schema.users.find(insertedFriend.id); - - return [ user, friend ]; - } - - newChildNoParent() { - return [ this.schema.users.new({ name: 'Link' }), undefined ]; - } - - newChildNewParent() { - let friend = this.schema.users.new({ name: 'Link' }); - let user = this.schema.users.new({ name: 'Bob' }); - user.bestFriend = friend; - - return [ user, friend ]; - } - - newChildSavedParent() { - let insertedFriend = this.db.users.insert({ name: 'Bob' }); - let user = this.schema.users.new({ name: 'Link' }); - let savedFriend = this.schema.users.find(insertedFriend.id); - - user.bestFriend = savedFriend; - - return [ user, savedFriend ]; - } - - // Just a saved unassociated parent. - savedParent() { - let insertedParent = this.db.users.insert({ name: 'Bob' }); - - return this.schema.users.find(insertedParent.id); - } - - newParent() { - return this.schema.users.new({ name: 'Bob' }); - } - -} - -export const states = [ - 'savedChildNoParent', - 'savedChildNewParent', - 'savedChildSavedParent', - 'newChildNoParent', - 'newChildNewParent', - 'newChildSavedParent' -]; diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/accessor-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/accessor-test.js deleted file mode 100644 index a6a646856..000000000 --- a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/accessor-test.js +++ /dev/null @@ -1,34 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | accessor', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ user, friend ] = this.helper[state](); - - // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison - if (friend) { - assert.deepEqual(user.bestFriend.attrs, friend.attrs, 'the model reference is correct'); - assert.equal(user.bestFriendId, friend.id, 'the modelId reference is correct'); - } else { - assert.deepEqual(user.bestFriend, null, 'the model reference is correct'); - assert.equal(user.bestFriendId, null, 'the modelId reference is correct'); - } - - // If there's a friend in this state, make sure the inverse association is correct - if (friend) { - assert.deepEqual(friend.bestFriend.attrs, user.attrs, 'the inverse model reference is correct'); - assert.equal(friend.bestFriendId, user.id, 'the inverse modelId reference is correct'); - } - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-create-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-create-test.js deleted file mode 100644 index 8d0680193..000000000 --- a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-create-test.js +++ /dev/null @@ -1,26 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | association #create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a belongs-to association, for all states - */ - states.forEach((state) => { - - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); - - let ganon = user.createBestFriend({ name: 'Ganon' }); - - assert.ok(ganon.id, 'the parent was persisted'); - assert.deepEqual(user.bestFriend.attrs, ganon.attrs); - assert.equal(user.bestFriendId, ganon.id); - assert.equal(this.helper.schema.users.find(user.id).bestFriendId, ganon.id, 'the user was persisted'); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-new-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-new-test.js deleted file mode 100644 index 510bfd4ac..000000000 --- a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-new-test.js +++ /dev/null @@ -1,31 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | association #new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ - - states.forEach((state) => { - - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); - - let ganon = user.newBestFriend({ name: 'Ganon' }); - - assert.ok(!ganon.id, 'the parent was not persisted'); - assert.deepEqual(user.bestFriend, ganon); - assert.equal(user.bestFriendId, null); - - user.save(); - - assert.ok(ganon.id, 'saving the child persists the parent'); - assert.equal(user.bestFriendId, ganon.id, 'the childs fk was updated'); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-id-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-id-test.js deleted file mode 100644 index 06e1c202b..000000000 --- a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-id-test.js +++ /dev/null @@ -1,41 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | association #setId', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user ] = this.helper[state](); - let friend = this.helper.savedParent(); - - user.bestFriendId = friend.id; - - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - }); - - }); - - [ - 'savedChildSavedParent', - 'newChildSavedParent' - ].forEach((state) => { - - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ user ] = this.helper[state](); - - user.bestFriendId = null; - - assert.equal(user.bestFriendId, null); - assert.equal(user.bestFriend, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-test.js deleted file mode 100644 index a87fa4221..000000000 --- a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/association-set-test.js +++ /dev/null @@ -1,44 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | association #set', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ user ] = this.helper[state](); - let friend = this.helper.savedParent(); - - user.bestFriend = friend; - - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user ] = this.helper[state](); - let friend = this.helper.newParent(); - - user.bestFriend = friend; - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - }); - - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ user ] = this.helper[state](); - - user.bestFriend = null; - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/create-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/create-test.js deleted file mode 100644 index 1065c7295..000000000 --- a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/create-test.js +++ /dev/null @@ -1,62 +0,0 @@ -import Helper from './_helper'; -import { Model } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let friend = schema.create('user'); - let user = schema.create('user', { - bestFriendId: friend.id - }); - - friend.reload(); - - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', bestFriendId: '2' }); - assert.deepEqual(schema.db.users[1], { id: '2', bestFriendId: '1' }); - }); - - test('it sets up associations correctly when passing in the association itself', function(assert) { - let { schema } = this.helper; - let friend = schema.create('user'); - let user = schema.create('user', { - bestFriend: friend - }); - - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', bestFriendId: '2' }); - assert.deepEqual(schema.db.users[1], { id: '2', bestFriendId: '1' }); - }); - - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.create('user', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); - - assert.throws(function() { - schema.create('user', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); -}); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/delete-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/delete-test.js deleted file mode 100644 index 8396b5d6c..000000000 --- a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/delete-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | delete', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ user, bestFriend ] = this.helper[state](); - - if (bestFriend) { - bestFriend.destroy(); - user.reload(); - } - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/instantiating-test.js b/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/instantiating-test.js deleted file mode 100644 index 3567a9cb5..000000000 --- a/tests/integration/orm/belongs-to/5-named-reflexive-explicit-inverse/instantiating-test.js +++ /dev/null @@ -1,83 +0,0 @@ -import Helper from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named Reflexive Explicit Inverse | instantiating', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the child accepts a saved parent id', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ bestFriendId: friend.id }); - - assert.equal(user.bestFriendId, friend.id); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - assert.deepEqual(user.attrs, { bestFriendId: friend.id }); - }); - - test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ bestFriendId: 2 }); - }, /You're instantiating a user that has a bestFriendId of 2, but that record doesn't exist in the database/); - }); - - test('the child accepts a null parent id', function(assert) { - let user = this.schema.users.new({ bestFriendId: null }); - - assert.equal(user.bestFriendId, null); - assert.equal(user.bestFriend, null); - assert.deepEqual(user.attrs, { bestFriendId: null }); - }); - - test('the child accepts a saved parent model', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ bestFriend: friend }); - - assert.equal(user.bestFriendId, 1); - assert.deepEqual(user.bestFriend.attrs, friend.attrs); - assert.deepEqual(user.attrs, { bestFriendId: null }); // this would update when saved - }); - - test('the child accepts a new parent model', function(assert) { - let zelda = this.schema.users.new({ name: 'Zelda' }); - let user = this.schema.users.new({ bestFriend: zelda }); - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, zelda); - assert.deepEqual(user.attrs, { bestFriendId: null }); - }); - - test('the child accepts a null parent model', function(assert) { - let user = this.schema.users.new({ bestFriend: null }); - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - assert.deepEqual(user.attrs, { bestFriendId: null }); - }); - - test('the child accepts a parent model and id', function(assert) { - let friend = this.helper.savedParent(); - let user = this.schema.users.new({ bestFriend: friend, bestFriendId: friend.id }); - - assert.equal(user.bestFriendId, '1'); - assert.deepEqual(user.bestFriend, friend); - assert.deepEqual(user.attrs, { bestFriendId: friend.id }); - }); - - test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let user = this.schema.users.new({}); - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - assert.deepEqual(user.attrs, { bestFriendId: null }); - }); - - test('the child accepts no reference to a parent id or model', function(assert) { - let user = this.schema.users.new(); - - assert.equal(user.bestFriendId, null); - assert.deepEqual(user.bestFriend, null); - assert.deepEqual(user.attrs, { bestFriendId: null }); - }); -}); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/_helper.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/_helper.js deleted file mode 100644 index 1c0dd99cb..000000000 --- a/tests/integration/orm/belongs-to/6-one-way-reflexive/_helper.js +++ /dev/null @@ -1,94 +0,0 @@ -import { Model, belongsTo } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -/* - A model with a belongsTo association can be in six states - with respect to its association. This helper class - returns a child (and its association) in these various states. - - The return value is an array of the form - - [ child, parent ] - - where the parent may be undefined. -*/ -export default class BelongsToHelper { - - constructor() { - this.db = new Db(); - - this.schema = new Schema(this.db, { - user: Model.extend({ - user: belongsTo('user', { inverse: null }) - }) - }); - } - - savedChildNoParent() { - let insertedUser = this.db.users.insert({ name: 'Link' }); - - return [ this.schema.users.find(insertedUser.id), undefined ]; - } - - savedChildNewParent() { - let child = this.schema.users.create({ name: 'Link' }); - let parent = this.schema.users.new({ name: 'Bob' }); - - child.user = parent; - - return [ child, parent ]; - } - - savedChildSavedParent() { - let insertedParent = this.db.users.insert({ name: 'Bob' }); - let insertedChild = this.db.users.insert({ name: 'Link', userId: insertedParent.id }); - let child = this.schema.users.find(insertedChild.id); - let parent = this.schema.users.find(insertedParent.id); - - return [ child, parent ]; - } - - newChildNoParent() { - return [ this.schema.users.new({ name: 'Link' }), undefined ]; - } - - newChildNewParent() { - let parent = this.schema.users.new({ name: 'Link' }); - let child = this.schema.users.new({ name: 'Bob' }); - child.user = parent; - - return [ child, parent ]; - } - - newChildSavedParent() { - let insertedParent = this.db.users.insert({ name: 'Bob' }); - let child = this.schema.users.new({ name: 'Link' }); - let savedParent = this.schema.users.find(insertedParent.id); - - child.user = savedParent; - - return [ child, savedParent ]; - } - - // Just a saved unassociated parent. - savedParent() { - let insertedParent = this.db.users.insert({ name: 'Bob' }); - - return this.schema.users.find(insertedParent.id); - } - - newParent() { - return this.schema.users.new({ name: 'Bob' }); - } - -} - -export const states = [ - 'savedChildNoParent', - 'savedChildNewParent', - 'savedChildSavedParent', - 'newChildNoParent', - 'newChildNewParent', - 'newChildSavedParent' -]; diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/accessor-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/accessor-test.js deleted file mode 100644 index 02b643655..000000000 --- a/tests/integration/orm/belongs-to/6-one-way-reflexive/accessor-test.js +++ /dev/null @@ -1,28 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One-Way Reflexive | accessor', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ user, parent ] = this.helper[state](); - - // We use .attrs here to avoid infinite recursion - if (parent) { - assert.deepEqual(user.user.attrs, parent.attrs, 'the model reference is correct'); - assert.equal(user.userId, parent.id, 'the modelId reference is correct'); - } else { - assert.deepEqual(user.user, null, 'the model reference is correct'); - assert.equal(user.userId, null, 'the modelId reference is correct'); - } - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-create-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-create-test.js deleted file mode 100644 index 23d6230d0..000000000 --- a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-create-test.js +++ /dev/null @@ -1,26 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One-Way Reflexive | association #create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a belongs-to association, for all states - */ - states.forEach((state) => { - - test(`a ${state} can create an associated parent`, function(assert) { - let [ child ] = this.helper[state](); - - let ganon = child.createUser({ name: 'Ganon' }); - - assert.ok(ganon.id, 'the parent was persisted'); - assert.deepEqual(child.user.attrs, ganon.attrs); - assert.equal(child.userId, ganon.id); - assert.equal(this.helper.schema.users.find(child.id).userId, ganon.id, 'the child was persisted'); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-new-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-new-test.js deleted file mode 100644 index 9e3080664..000000000 --- a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-new-test.js +++ /dev/null @@ -1,31 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One-Way Reflexive | association #new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ - - states.forEach((state) => { - - test(`a ${state} can build a new associated parent`, function(assert) { - let [ child ] = this.helper[state](); - - let ganon = child.newUser({ name: 'Ganon' }); - - assert.ok(!ganon.id, 'the parent was not persisted'); - assert.deepEqual(child.user, ganon); - assert.equal(child.userId, null); - - child.save(); - - assert.ok(ganon.id, 'saving the child persists the parent'); - assert.equal(child.userId, ganon.id, 'the childs fk was updated'); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-id-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-id-test.js deleted file mode 100644 index 08112deda..000000000 --- a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-id-test.js +++ /dev/null @@ -1,41 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One-Way Reflexive | association #setId', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ child ] = this.helper[state](); - let savedParent = this.helper.savedParent(); - - child.userId = savedParent.id; - - assert.equal(child.userId, savedParent.id); - assert.deepEqual(child.user.attrs, savedParent.attrs); - }); - - }); - - [ - 'savedChildSavedParent', - 'newChildSavedParent' - ].forEach((state) => { - - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ child ] = this.helper[state](); - - child.userId = null; - - assert.equal(child.userId, null); - assert.deepEqual(child.user, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-test.js deleted file mode 100644 index 8fc9f88f3..000000000 --- a/tests/integration/orm/belongs-to/6-one-way-reflexive/association-set-test.js +++ /dev/null @@ -1,44 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One-Way Reflexive | association #set', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ child ] = this.helper[state](); - let savedParent = this.helper.savedParent(); - - child.user = savedParent; - - assert.equal(child.userId, savedParent.id); - assert.deepEqual(child.user.attrs, savedParent.attrs); - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ child ] = this.helper[state](); - let newParent = this.helper.newParent(); - - child.user = newParent; - - assert.equal(child.userId, null); - assert.deepEqual(child.user, newParent); - }); - - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ child ] = this.helper[state](); - - child.user = null; - - assert.equal(child.userId, null); - assert.deepEqual(child.user, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/create-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/create-test.js deleted file mode 100644 index 4a60f5e98..000000000 --- a/tests/integration/orm/belongs-to/6-one-way-reflexive/create-test.js +++ /dev/null @@ -1,60 +0,0 @@ -import Helper from './_helper'; -import { Model } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One-Way Reflexive | create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let parent = schema.create('user'); - let child = schema.create('user', { - userId: parent.id - }); - - assert.equal(child.userId, parent.id); - assert.deepEqual(child.user.attrs, parent.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', userId: null }); - assert.deepEqual(schema.db.users[1], { id: '2', userId: '1' }); - }); - - test('it sets up associations correctly when passing in the association itself', function(assert) { - let { schema } = this.helper; - let parent = schema.create('user'); - let child = schema.create('user', { - user: parent - }); - - assert.equal(child.userId, parent.id); - assert.deepEqual(child.user.attrs, parent.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', userId: null }); - assert.deepEqual(schema.db.users[1], { id: '2', userId: '1' }); - }); - - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.create('user', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); - - assert.throws(function() { - schema.create('user', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); -}); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/delete-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/delete-test.js deleted file mode 100644 index a8f9238e7..000000000 --- a/tests/integration/orm/belongs-to/6-one-way-reflexive/delete-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One-Way Reflexive | delete', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ user, targetUser ] = this.helper[state](); - - if (targetUser) { - targetUser.destroy(); - user.reload(); - } - - assert.equal(user.userId, null); - assert.deepEqual(user.user, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/6-one-way-reflexive/instantiating-test.js b/tests/integration/orm/belongs-to/6-one-way-reflexive/instantiating-test.js deleted file mode 100644 index 886f7b9ad..000000000 --- a/tests/integration/orm/belongs-to/6-one-way-reflexive/instantiating-test.js +++ /dev/null @@ -1,82 +0,0 @@ -import Helper from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One-Way Reflexive | instantiating', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the child accepts a saved parent id', function(assert) { - let parent = this.helper.savedParent(); - let child = this.schema.users.new({ userId: parent.id }); - - assert.equal(child.userId, parent.id); - assert.deepEqual(child.user.attrs, parent.attrs); - assert.deepEqual(child.attrs, { userId: parent.id }); - }); - - test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ userId: 2 }); - }, /You're instantiating a user that has a userId of 2, but that record doesn't exist in the database/); - }); - - test('the child accepts a null parent id', function(assert) { - let child = this.schema.users.new({ userId: null }); - - assert.equal(child.userId, null); - assert.deepEqual(child.user, null); - assert.deepEqual(child.attrs, { userId: null }); - }); - - test('the child accepts a saved parent model', function(assert) { - let parent = this.helper.savedParent(); - let child = this.schema.users.new({ user: parent }); - - assert.equal(child.userId, 1); - assert.deepEqual(child.user.attrs, parent.attrs); - }); - - test('the child accepts a new parent model', function(assert) { - let zelda = this.schema.users.new({ name: 'Zelda' }); - let child = this.schema.users.new({ user: zelda }); - - assert.equal(child.userId, null); - assert.deepEqual(child.user, zelda); - assert.deepEqual(child.attrs, { userId: null }); - }); - - test('the child accepts a null parent model', function(assert) { - let child = this.schema.users.new({ user: null }); - - assert.equal(child.userId, null); - assert.deepEqual(child.user, null); - assert.deepEqual(child.attrs, { userId: null }); - }); - - test('the child accepts a parent model and id', function(assert) { - let parent = this.helper.savedParent(); - let child = this.schema.users.new({ user: parent, userId: parent.id }); - - assert.equal(child.userId, '1'); - assert.deepEqual(child.user.attrs, parent.attrs); - assert.deepEqual(child.attrs, { userId: parent.id }); - }); - - test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let child = this.schema.users.new({}); - - assert.equal(child.userId, null); - assert.deepEqual(child.user, null); - assert.deepEqual(child.attrs, { userId: null }); - }); - - test('the child accepts no reference to a parent id or model', function(assert) { - let child = this.schema.users.new(); - - assert.equal(child.userId, null); - assert.deepEqual(child.user, null); - assert.deepEqual(child.attrs, { userId: null }); - }); -}); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/_helper.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/_helper.js deleted file mode 100644 index 00b522aa0..000000000 --- a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/_helper.js +++ /dev/null @@ -1,94 +0,0 @@ -import { Model, belongsTo } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -/* - A model with a belongsTo association can be in six states - with respect to its association. This helper class - returns a child (and its association) in these various states. - - The return value is an array of the form - - [ child, parent ] - - where the parent may be undefined. -*/ -export default class BelongsToHelper { - - constructor() { - this.db = new Db(); - - this.schema = new Schema(this.db, { - user: Model.extend({ - parent: belongsTo('user', { inverse: null }) - }) - }); - } - - savedChildNoParent() { - let insertedUser = this.db.users.insert({ name: 'Link' }); - - return [ this.schema.users.find(insertedUser.id), undefined ]; - } - - savedChildNewParent() { - let child = this.schema.users.create({ name: 'Link' }); - let parent = this.schema.users.new({ name: 'Bob' }); - - child.parent = parent; - - return [ child, parent ]; - } - - savedChildSavedParent() { - let insertedParent = this.db.users.insert({ name: 'Bob' }); - let insertedChild = this.db.users.insert({ name: 'Link', parentId: insertedParent.id }); - let child = this.schema.users.find(insertedChild.id); - let parent = this.schema.users.find(insertedParent.id); - - return [ child, parent ]; - } - - newChildNoParent() { - return [ this.schema.users.new({ name: 'Link' }), undefined ]; - } - - newChildNewParent() { - let parent = this.schema.users.new({ name: 'Link' }); - let child = this.schema.users.new({ name: 'Bob' }); - child.parent = parent; - - return [ child, parent ]; - } - - newChildSavedParent() { - let insertedParent = this.db.users.insert({ name: 'Bob' }); - let child = this.schema.users.new({ name: 'Link' }); - let savedParent = this.schema.users.find(insertedParent.id); - - child.parent = savedParent; - - return [ child, savedParent ]; - } - - // Just a saved unassociated parent. - savedParent() { - let insertedParent = this.db.users.insert({ name: 'Bob' }); - - return this.schema.users.find(insertedParent.id); - } - - newParent() { - return this.schema.users.new({ name: 'Bob' }); - } - -} - -export const states = [ - 'savedChildNoParent', - 'savedChildNewParent', - 'savedChildSavedParent', - 'newChildNoParent', - 'newChildNewParent', - 'newChildSavedParent' -]; diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/accessor-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/accessor-test.js deleted file mode 100644 index 4eb66e5ee..000000000 --- a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/accessor-test.js +++ /dev/null @@ -1,28 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named One-Way Reflexive | accessor', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ user, parent ] = this.helper[state](); - - // We use .attrs here to avoid infinite recursion - if (parent) { - assert.deepEqual(user.parent.attrs, parent.attrs, 'the model reference is correct'); - assert.equal(user.parentId, parent.id, 'the modelId reference is correct'); - } else { - assert.deepEqual(user.parent, null, 'the model reference is correct'); - assert.equal(user.parentId, null, 'the modelId reference is correct'); - } - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-create-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-create-test.js deleted file mode 100644 index edd67ff21..000000000 --- a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-create-test.js +++ /dev/null @@ -1,26 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named One-Way Reflexive | association #create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a belongs-to association, for all states - */ - states.forEach((state) => { - - test(`a ${state} can create an associated parent`, function(assert) { - let [ child ] = this.helper[state](); - - let ganon = child.createParent({ name: 'Ganon' }); - - assert.ok(ganon.id, 'the parent was persisted'); - assert.deepEqual(child.parent.attrs, ganon.attrs); - assert.equal(child.parentId, ganon.id); - assert.equal(this.helper.schema.users.find(child.id).parentId, ganon.id, 'the child was persisted'); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-new-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-new-test.js deleted file mode 100644 index 556c3df43..000000000 --- a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-new-test.js +++ /dev/null @@ -1,31 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named One-Way Reflexive | association #new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ - - states.forEach((state) => { - - test(`a ${state} can build a new associated parent`, function(assert) { - let [ child ] = this.helper[state](); - - let ganon = child.newParent({ name: 'Ganon' }); - - assert.ok(!ganon.id, 'the parent was not persisted'); - assert.deepEqual(child.parent, ganon); - assert.equal(child.parentId, null); - - child.save(); - - assert.ok(ganon.id, 'saving the child persists the parent'); - assert.equal(child.parentId, ganon.id, 'the childs fk was updated'); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-id-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-id-test.js deleted file mode 100644 index effec45a1..000000000 --- a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-id-test.js +++ /dev/null @@ -1,41 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named One-Way Reflexive | association #setId', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ child ] = this.helper[state](); - let savedParent = this.helper.savedParent(); - - child.parentId = savedParent.id; - - assert.equal(child.parentId, savedParent.id); - assert.deepEqual(child.parent.attrs, savedParent.attrs); - }); - - }); - - [ - 'savedChildSavedParent', - 'newChildSavedParent' - ].forEach((state) => { - - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ child ] = this.helper[state](); - - child.parentId = null; - - assert.equal(child.parentId, null); - assert.deepEqual(child.parent, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-test.js deleted file mode 100644 index 9bc5cf453..000000000 --- a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/association-set-test.js +++ /dev/null @@ -1,44 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named One-Way Reflexive | association #set', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ child ] = this.helper[state](); - let savedParent = this.helper.savedParent(); - - child.parent = savedParent; - - assert.equal(child.parentId, savedParent.id); - assert.deepEqual(child.parent.attrs, savedParent.attrs); - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ child ] = this.helper[state](); - let newParent = this.helper.newParent(); - - child.parent = newParent; - - assert.equal(child.parentId, null); - assert.deepEqual(child.parent, newParent); - }); - - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ child ] = this.helper[state](); - - child.parent = null; - - assert.equal(child.parentId, null); - assert.deepEqual(child.parent, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/create-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/create-test.js deleted file mode 100644 index c5be2d821..000000000 --- a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/create-test.js +++ /dev/null @@ -1,60 +0,0 @@ -import Helper from './_helper'; -import { Model } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named One-Way Reflexive | create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let parent = schema.create('user'); - let child = schema.create('user', { - parentId: parent.id - }); - - assert.equal(child.parentId, parent.id); - assert.deepEqual(child.parent.attrs, parent.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', parentId: null }); - assert.deepEqual(schema.db.users[1], { id: '2', parentId: '1' }); - }); - - test('it sets up associations correctly when passing in the association itself', function(assert) { - let { schema } = this.helper; - let parent = schema.create('user'); - let child = schema.create('user', { - parent - }); - - assert.equal(child.parentId, parent.id); - assert.deepEqual(child.parent.attrs, parent.attrs); - assert.equal(schema.db.users.length, 2); - assert.deepEqual(schema.db.users[0], { id: '1', parentId: null }); - assert.deepEqual(schema.db.users[1], { id: '2', parentId: '1' }); - }); - - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.create('user', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); - - assert.throws(function() { - schema.create('user', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); -}); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/delete-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/delete-test.js deleted file mode 100644 index 3c2e080c9..000000000 --- a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/delete-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named One-Way Reflexive | delete', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ user, parent ] = this.helper[state](); - - if (parent) { - parent.destroy(); - user.reload(); - } - - assert.equal(user.parentId, null); - assert.deepEqual(user.parent, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/instantiating-test.js b/tests/integration/orm/belongs-to/7-named-one-way-reflexive/instantiating-test.js deleted file mode 100644 index b7cb0751b..000000000 --- a/tests/integration/orm/belongs-to/7-named-one-way-reflexive/instantiating-test.js +++ /dev/null @@ -1,82 +0,0 @@ -import Helper from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Named One-Way Reflexive | instantiating', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the child accepts a saved parent id', function(assert) { - let parent = this.helper.savedParent(); - let child = this.schema.users.new({ parentId: parent.id }); - - assert.equal(child.parentId, parent.id); - assert.deepEqual(child.parent.attrs, parent.attrs); - assert.deepEqual(child.attrs, { parentId: parent.id }); - }); - - test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ parentId: 2 }); - }, /You're instantiating a user that has a parentId of 2, but that record doesn't exist in the database/); - }); - - test('the child accepts a null parent id', function(assert) { - let child = this.schema.users.new({ parentId: null }); - - assert.equal(child.parentId, null); - assert.deepEqual(child.parent, null); - assert.deepEqual(child.attrs, { parentId: null }); - }); - - test('the child accepts a saved parent model', function(assert) { - let parent = this.helper.savedParent(); - let child = this.schema.users.new({ parent }); - - assert.equal(child.parentId, 1); - assert.deepEqual(child.parent.attrs, parent.attrs); - }); - - test('the child accepts a new parent model', function(assert) { - let zelda = this.schema.users.new({ name: 'Zelda' }); - let child = this.schema.users.new({ parent: zelda }); - - assert.equal(child.parentId, null); - assert.deepEqual(child.parent, zelda); - assert.deepEqual(child.attrs, { parentId: null }); - }); - - test('the child accepts a null parent model', function(assert) { - let child = this.schema.users.new({ parent: null }); - - assert.equal(child.parentId, null); - assert.deepEqual(child.parent, null); - assert.deepEqual(child.attrs, { parentId: null }); - }); - - test('the child accepts a parent model and id', function(assert) { - let parent = this.helper.savedParent(); - let child = this.schema.users.new({ parent, parentId: parent.id }); - - assert.equal(child.parentId, '1'); - assert.deepEqual(child.parent.attrs, parent.attrs); - assert.deepEqual(child.attrs, { parentId: parent.id }); - }); - - test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let child = this.schema.users.new({}); - - assert.equal(child.parentId, null); - assert.deepEqual(child.parent, null); - assert.deepEqual(child.attrs, { parentId: null }); - }); - - test('the child accepts no reference to a parent id or model', function(assert) { - let child = this.schema.users.new(); - - assert.equal(child.parentId, null); - assert.deepEqual(child.parent, null); - assert.deepEqual(child.attrs, { parentId: null }); - }); -}); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/_helper.js b/tests/integration/orm/belongs-to/8-one-to-one/_helper.js deleted file mode 100644 index a1cde6151..000000000 --- a/tests/integration/orm/belongs-to/8-one-to-one/_helper.js +++ /dev/null @@ -1,98 +0,0 @@ -import { Model, belongsTo } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -/* - A model with a belongsTo association can be in six states - with respect to its association. This helper class - returns a child (and its association) in these various states. - - The return value is an array of the form - - [ child, parent ] - - where the parent may be undefined. -*/ -export default class BelongsToHelper { - - constructor() { - this.db = new Db(); - - this.schema = new Schema(this.db, { - user: Model.extend({ - profile: belongsTo() - }), - profile: Model.extend({ - user: belongsTo() - }) - }); - } - - savedChildNoParent() { - let insertedUser = this.db.users.insert({ name: 'Link' }); - - return [ this.schema.users.find(insertedUser.id), undefined ]; - } - - savedChildNewParent() { - let user = this.schema.users.create({ name: 'Link' }); - let profile = this.schema.profiles.new({ age: 300 }); - - user.profile = profile; - - return [ user, profile ]; - } - - savedChildSavedParent() { - let insertedProfile = this.db.profiles.insert({ age: 300 }); - let insertedUser = this.db.users.insert({ name: 'Link', profileId: insertedProfile.id }); - this.db.profiles.update(insertedProfile.id, { userId: insertedUser.id }); - let user = this.schema.users.find(insertedUser.id); - let profile = this.schema.profiles.find(insertedProfile.id); - - return [ user, profile ]; - } - - newChildNoParent() { - return [ this.schema.users.new({ name: 'Link' }), undefined ]; - } - - newChildNewParent() { - let profile = this.schema.profiles.new({ age: 300 }); - let user = this.schema.users.new({ name: 'Link' }); - user.profile = profile; - - return [ user, profile ]; - } - - newChildSavedParent() { - let insertedProfile = this.db.profiles.insert({ age: 300 }); - let user = this.schema.users.new({ name: 'Link' }); - let savedProfile = this.schema.profiles.find(insertedProfile.id); - - user.profile = savedProfile; - - return [ user, savedProfile ]; - } - - // Just a saved unassociated parent. - savedParent() { - let insertedProfile = this.db.profiles.insert({ age: 300 }); - - return this.schema.profiles.find(insertedProfile.id); - } - - newParent() { - return this.schema.profiles.new({ age: 300 }); - } - -} - -export const states = [ - 'savedChildNoParent', - 'savedChildNewParent', - 'savedChildSavedParent', - 'newChildNoParent', - 'newChildNewParent', - 'newChildSavedParent' -]; diff --git a/tests/integration/orm/belongs-to/8-one-to-one/accessor-test.js b/tests/integration/orm/belongs-to/8-one-to-one/accessor-test.js deleted file mode 100644 index f72e04488..000000000 --- a/tests/integration/orm/belongs-to/8-one-to-one/accessor-test.js +++ /dev/null @@ -1,34 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One To One | accessor', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ user, profile ] = this.helper[state](); - - // We use .attrs here because otherwise deepEqual goes on infinite recursive comparison - if (profile) { - assert.deepEqual(user.profile.attrs, profile.attrs, 'the model reference is correct'); - assert.equal(user.profileId, profile.id, 'the modelId reference is correct'); - } else { - assert.deepEqual(user.profile, null, 'the model reference is correct'); - assert.equal(user.profileId, null, 'the modelId reference is correct'); - } - - // If there's a profile in this state, make sure the inverse association is correct - if (profile) { - assert.deepEqual(profile.user.attrs, user.attrs, 'the inverse model reference is correct'); - assert.equal(profile.userId, user.id, 'the inverse modelId reference is correct'); - } - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/association-create-test.js b/tests/integration/orm/belongs-to/8-one-to-one/association-create-test.js deleted file mode 100644 index e8ec1ae35..000000000 --- a/tests/integration/orm/belongs-to/8-one-to-one/association-create-test.js +++ /dev/null @@ -1,27 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One To One | association #create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a belongs-to association, for all states - */ - states.forEach((state) => { - - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); - - let profile = user.createProfile({ age: 300 }); - - assert.ok(profile.id, 'the parent was persisted'); - assert.deepEqual(user.profile.attrs, profile.attrs); - assert.deepEqual(profile.user.attrs, user.attrs, 'the inverse was set'); - assert.equal(user.profileId, profile.id); - assert.equal(this.helper.schema.users.find(user.id).profileId, profile.id, 'the user was persisted'); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/association-new-test.js b/tests/integration/orm/belongs-to/8-one-to-one/association-new-test.js deleted file mode 100644 index 51951ffe5..000000000 --- a/tests/integration/orm/belongs-to/8-one-to-one/association-new-test.js +++ /dev/null @@ -1,33 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One To One | association #new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ - - states.forEach((state) => { - - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); - - let profile = user.newProfile({ age: 300 }); - - assert.ok(!profile.id, 'the parent was not persisted'); - assert.deepEqual(user.profile, profile); - assert.equal(user.profileId, null); - assert.deepEqual(profile.user, user, 'the inverse was set'); - assert.equal(profile.userId, user.id); - - user.save(); - - assert.ok(profile.id, 'saving the child persists the parent'); - assert.equal(user.profileId, profile.id, 'the childs fk was updated'); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/association-set-id-test.js b/tests/integration/orm/belongs-to/8-one-to-one/association-set-id-test.js deleted file mode 100644 index 3ba448827..000000000 --- a/tests/integration/orm/belongs-to/8-one-to-one/association-set-id-test.js +++ /dev/null @@ -1,47 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One To One | association #setId', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user ] = this.helper[state](); - let profile = this.helper.savedParent(); - - user.profileId = profile.id; - - assert.equal(user.profileId, profile.id); - assert.deepEqual(user.profile.attrs, profile.attrs); - - user.save(); - profile.reload(); - - assert.equal(profile.userId, user.id, 'the inverse was set'); - assert.deepEqual(profile.user.attrs, user.attrs); - }); - - }); - - // [ - // 'savedChildSavedParent', - // 'newChildSavedParent' - // ].forEach((state) => { - // - // test(`a ${state} can clear its association via a null parentId`, function(assert) { - // let [ user ] = this.helper[state](); - // - // user.userId = null; - // - // assert.equal(user.userId, null); - // assert.equal(user.user, null); - // }); - // - // }); -}); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/association-set-test.js b/tests/integration/orm/belongs-to/8-one-to-one/association-set-test.js deleted file mode 100644 index 8ef6095c6..000000000 --- a/tests/integration/orm/belongs-to/8-one-to-one/association-set-test.js +++ /dev/null @@ -1,49 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One To One | association #set', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ user ] = this.helper[state](); - let profile = this.helper.savedParent(); - - user.profile = profile; - - assert.equal(user.profileId, profile.id); - assert.deepEqual(user.profile.attrs, profile.attrs); - assert.equal(profile.userId, user.id, 'the inverse was set'); - assert.deepEqual(profile.user.attrs, user.attrs); - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user ] = this.helper[state](); - let profile = this.helper.newParent(); - - user.profile = profile; - - assert.equal(user.profileId, null); - assert.deepEqual(user.profile.attrs, profile.attrs); - - assert.equal(profile.userId, user.id, 'the inverse was set'); - assert.deepEqual(profile.user.attrs, user.attrs); - }); - - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ user ] = this.helper[state](); - - user.profile = null; - - assert.equal(user.profileId, null); - assert.deepEqual(user.profile, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/create-test.js b/tests/integration/orm/belongs-to/8-one-to-one/create-test.js deleted file mode 100644 index f438c1abb..000000000 --- a/tests/integration/orm/belongs-to/8-one-to-one/create-test.js +++ /dev/null @@ -1,65 +0,0 @@ -import Helper from './_helper'; -import { Model } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One To One | create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let profile = schema.create('profile'); - let user = schema.create('user', { - profileId: profile.id - }); - profile.reload(); - - assert.equal(user.profileId, profile.id); - assert.deepEqual(user.profile.attrs, profile.attrs); - assert.deepEqual(profile.user.attrs, user.attrs); - assert.equal(schema.db.users.length, 1); - assert.equal(schema.db.profiles.length, 1); - assert.deepEqual(schema.db.users[0], { id: '1', profileId: '1' }); - assert.deepEqual(schema.db.profiles[0], { id: '1', userId: '1' }); - }); - - test('it sets up associations correctly when passing in the association itself', function(assert) { - let { schema } = this.helper; - let profile = schema.create('profile'); - let user = schema.create('user', { - profile - }); - - assert.equal(user.profileId, profile.id); - assert.deepEqual(user.profile.attrs, profile.attrs); - assert.deepEqual(profile.user.attrs, user.attrs); - assert.equal(schema.db.users.length, 1); - assert.equal(schema.db.profiles.length, 1); - assert.deepEqual(schema.db.users[0], { id: '1', profileId: '1' }); - assert.deepEqual(schema.db.profiles[0], { id: '1', userId: '1' }); - }); - - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.create('user', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); - - assert.throws(function() { - schema.create('user', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); -}); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/delete-test.js b/tests/integration/orm/belongs-to/8-one-to-one/delete-test.js deleted file mode 100644 index 0799df441..000000000 --- a/tests/integration/orm/belongs-to/8-one-to-one/delete-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One To One | delete', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ user, profile ] = this.helper[state](); - - if (profile) { - profile.destroy(); - user.reload(); - } - - assert.equal(user.profileId, null); - assert.deepEqual(user.profile, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/8-one-to-one/instantiating-test.js b/tests/integration/orm/belongs-to/8-one-to-one/instantiating-test.js deleted file mode 100644 index 312290b0a..000000000 --- a/tests/integration/orm/belongs-to/8-one-to-one/instantiating-test.js +++ /dev/null @@ -1,83 +0,0 @@ -import Helper from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One To One | instantiating', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the child accepts a saved parent id', function(assert) { - let profile = this.helper.savedParent(); - let user = this.schema.users.new({ profileId: profile.id }); - - assert.equal(user.profileId, profile.id); - assert.deepEqual(user.profile.attrs, profile.attrs); - assert.deepEqual(user.attrs, { profileId: profile.id }); - }); - - test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ profileId: 2 }); - }, /You're instantiating a user that has a profileId of 2, but that record doesn't exist in the database/); - }); - - test('the child accepts a null parent id', function(assert) { - let user = this.schema.users.new({ profileId: null }); - - assert.equal(user.profileId, null); - assert.equal(user.profile, null); - assert.deepEqual(user.attrs, { profileId: null }); - }); - - test('the child accepts a saved parent model', function(assert) { - let profile = this.helper.savedParent(); - let user = this.schema.users.new({ profile }); - - assert.equal(user.profileId, 1); - assert.deepEqual(user.profile.attrs, profile.attrs); - assert.deepEqual(user.attrs, { profileId: null }); // this would update when saved - }); - - test('the child accepts a new parent model', function(assert) { - let profile = this.schema.profiles.new({ age: 300 }); - let user = this.schema.users.new({ profile }); - - assert.equal(user.profileId, null); - assert.deepEqual(user.profile, profile); - assert.deepEqual(user.attrs, { profileId: null }); - }); - - test('the child accepts a null parent model', function(assert) { - let user = this.schema.users.new({ profile: null }); - - assert.equal(user.profileId, null); - assert.deepEqual(user.profile, null); - assert.deepEqual(user.attrs, { profileId: null }); - }); - - test('the child accepts a parent model and id', function(assert) { - let profile = this.helper.savedParent(); - let user = this.schema.users.new({ profile, profileId: profile.id }); - - assert.equal(user.profileId, '1'); - assert.deepEqual(user.profile, profile); - assert.deepEqual(user.attrs, { profileId: profile.id }); - }); - - test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let user = this.schema.users.new({}); - - assert.equal(user.profileId, null); - assert.deepEqual(user.profile, null); - assert.deepEqual(user.attrs, { profileId: null }); - }); - - test('the child accepts no reference to a parent id or model', function(assert) { - let user = this.schema.users.new(); - - assert.equal(user.profileId, null); - assert.deepEqual(user.profile, null); - assert.deepEqual(user.attrs, { profileId: null }); - }); -}); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/_helper.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/_helper.js deleted file mode 100644 index 87da0c9bb..000000000 --- a/tests/integration/orm/belongs-to/9-one-way-polymorphic/_helper.js +++ /dev/null @@ -1,113 +0,0 @@ -import { Model, belongsTo } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -/* - A model with a belongsTo association can be in six states - with respect to its association. This helper class - returns a child (and its association) in these various states. - - The return value is an array of the form - - [ child, parent ] - - where the parent may be undefined. -*/ -export default class BelongsToHelper { - - constructor() { - this.db = new Db(); - this.loadData = this.db.loadData.bind(this.db); - - this.schema = new Schema(this.db, { - post: Model.extend(), - comment: Model.extend({ - commentable: belongsTo('commentable', { polymorphic: true }) - }) - }); - } - - savedChildNoParent() { - let insertedComment = this.db.comments.insert({ text: 'Lorem' }); - - return [ this.schema.comments.find(insertedComment.id), undefined ]; - } - - savedChildNewParent() { - this.loadData({ - comments: [ - { id: '1', text: 'Lorem' } - ] - }); - - let comment = this.schema.comments.find(1); - let post = this.schema.posts.new({ title: 'Bob' }); - - comment.commentable = post; - - return [ comment, post ]; - } - - savedChildSavedParent() { - this.loadData({ - posts: [ - { id: '1', title: 'Lorem ipsum' } - ], - comments: [ - { id: '1', text: 'Trolling', commentableId: { id: '1', type: 'post' } } - ] - }); - - let comment = this.schema.comments.find(1); - let post = this.schema.posts.find(1); - - return [ comment, post ]; - } - - newChildNoParent() { - return [ this.schema.comments.new({ text: 'Lorem' }), undefined ]; - } - - newChildNewParent() { - let comment = this.schema.comments.new({ text: 'Lorem' }); - let newPost = this.schema.posts.new({ title: 'Bob' }); - comment.commentable = newPost; - - return [ comment, newPost ]; - } - - newChildSavedParent() { - this.loadData({ - posts: [ - { id: '1', title: 'Lorem ipsum' } - ] - }); - let comment = this.schema.comments.new({ text: 'Lorem' }); - let savedPost = this.schema.posts.find(1); - - comment.commentable = savedPost; - - return [ comment, savedPost ]; - } - - // Just a saved unassociated parent. - savedParent() { - let insertedPost = this.db.posts.insert({ title: 'Bob' }); - - return this.schema.posts.find(insertedPost.id); - } - - newParent() { - return this.schema.posts.new({ title: 'Bob' }); - } - -} - -export const states = [ - 'savedChildNoParent', - 'savedChildNewParent', - 'savedChildSavedParent', - 'newChildNoParent', - 'newChildNewParent', - 'newChildSavedParent' -]; diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/accessor-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/accessor-test.js deleted file mode 100644 index d8bb00b3b..000000000 --- a/tests/integration/orm/belongs-to/9-one-way-polymorphic/accessor-test.js +++ /dev/null @@ -1,22 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One-way Polymorphic | accessor', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ comment, post ] = this.helper[state](); - - assert.deepEqual(comment.commentable, post ? post : null, 'the model reference is correct'); - assert.deepEqual(comment.commentableId, post ? { id: post.id, type: 'post' } : null, 'the modelId reference is correct'); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-create-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-create-test.js deleted file mode 100644 index 730612014..000000000 --- a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-create-test.js +++ /dev/null @@ -1,26 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One-way Polymorphic | association #create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a belongs-to association, for all states - */ - states.forEach((state) => { - - test(`a ${state} can create an associated parent`, function(assert) { - let [ comment ] = this.helper[state](); - - let post = comment.createCommentable('post', { title: 'Lorem ipsum' }); - - assert.ok(post.id, 'the parent was persisted'); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }); - assert.ok(this.helper.db.posts.find(post.id), 'the child was persisted'); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-new-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-new-test.js deleted file mode 100644 index 88c5f14fd..000000000 --- a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-new-test.js +++ /dev/null @@ -1,31 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One-way Polymorphic | association #new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ - - states.forEach((state) => { - - test(`a ${state} can build a new associated parent`, function(assert) { - let [ comment ] = this.helper[state](); - - let post = comment.newCommentable('post', { title: 'Lorem ipsum' }); - - assert.ok(!post.id, 'the parent was not persisted'); - assert.deepEqual(comment.commentable, post); - assert.deepEqual(comment.commentableId, { id: undefined, type: 'post' }); - - comment.save(); - - assert.ok(post.id, 'saving the child persists the parent'); - assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }, 'the childs fk was updated'); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-id-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-id-test.js deleted file mode 100644 index a74907048..000000000 --- a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-id-test.js +++ /dev/null @@ -1,41 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One-way Polymorphic | association #setId', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ comment ] = this.helper[state](); - let savedPost = this.helper.savedParent(); - - comment.commentableId = { id: savedPost.id, type: 'post' }; - - assert.deepEqual(comment.commentableId, { id: savedPost.id, type: 'post' }); - assert.deepEqual(comment.commentable.attrs, savedPost.attrs); - }); - - }); - - [ - 'savedChildSavedParent', - 'newChildSavedParent' - ].forEach((state) => { - - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ comment ] = this.helper[state](); - - comment.commentableId = null; - - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-test.js deleted file mode 100644 index 2eae479d5..000000000 --- a/tests/integration/orm/belongs-to/9-one-way-polymorphic/association-set-test.js +++ /dev/null @@ -1,44 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One-way Polymorphic | association #set', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ comment ] = this.helper[state](); - let savedPost = this.helper.savedParent(); - - comment.commentable = savedPost; - - assert.deepEqual(comment.commentableId, { id: savedPost.id, type: 'post' }); - assert.deepEqual(comment.commentable, savedPost); - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ comment ] = this.helper[state](); - let newPost = this.helper.newParent(); - - comment.commentable = newPost; - - assert.deepEqual(comment.commentableId, { id: undefined, type: 'post' }); - assert.deepEqual(comment.commentable, newPost); - }); - - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ comment ] = this.helper[state](); - - comment.commentable = null; - - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/create-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/create-test.js deleted file mode 100644 index b927fc3df..000000000 --- a/tests/integration/orm/belongs-to/9-one-way-polymorphic/create-test.js +++ /dev/null @@ -1,38 +0,0 @@ -import Helper from './_helper'; -import { Model } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One-way Polymorphic | create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let post = this.helper.schema.create('post'); - let comment = this.helper.schema.create('comment', { - commentableId: { id: post.id, type: 'post' } - }); - - assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.equal(this.helper.schema.db.posts.length, 1); - assert.deepEqual(this.helper.schema.db.posts[0], { id: '1' }); - assert.equal(this.helper.schema.db.comments.length, 1); - assert.deepEqual(this.helper.schema.db.comments[0], { id: '1', commentableId: { id: '1', type: 'post' } }); - }); - - test('it sets up associations correctly when passing in the association itself', function(assert) { - let post = this.helper.schema.create('post'); - let comment = this.helper.schema.create('comment', { - commentable: post - }); - - assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }); - assert.deepEqual(comment.commentable.attrs, post.attrs); - assert.equal(this.helper.schema.db.posts.length, 1); - assert.deepEqual(this.helper.schema.db.posts[0], { id: '1' }); - assert.equal(this.helper.schema.db.comments.length, 1); - assert.deepEqual(this.helper.schema.db.comments[0], { id: '1', commentableId: { id: '1', type: 'post' } }); - }); -}); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/delete-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/delete-test.js deleted file mode 100644 index 8fabed15c..000000000 --- a/tests/integration/orm/belongs-to/9-one-way-polymorphic/delete-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One-way Polymorphic | delete', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`deleting the parent updates the child's foreign key for a ${state}`, function(assert) { - let [ comment, post ] = this.helper[state](); - - if (post) { - post.destroy(); - comment.reload(); - } - - assert.equal(comment.commentableId, null); - assert.equal(comment.post, null); - }); - - }); -}); diff --git a/tests/integration/orm/belongs-to/9-one-way-polymorphic/instantiating-test.js b/tests/integration/orm/belongs-to/9-one-way-polymorphic/instantiating-test.js deleted file mode 100644 index 7b711f945..000000000 --- a/tests/integration/orm/belongs-to/9-one-way-polymorphic/instantiating-test.js +++ /dev/null @@ -1,84 +0,0 @@ -import Helper from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | One-way Polymorphic | instantiating', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the child accepts a saved parent id', function(assert) { - let post = this.helper.savedParent(); - let comment = this.schema.comments.new({ - commentableId: { id: post.id, type: 'post' } - }); - - assert.deepEqual(comment.commentableId, { id: post.id, type: 'post' }); - assert.deepEqual(comment.commentable, post); - assert.deepEqual(comment.attrs, { commentableId: { id: post.id, type: 'post' } }); - }); - - test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.comments.new({ commentableId: { type: 'post', id: 2 } }); - }, /You're instantiating a comment that has a commentableId of post:2, but that record doesn't exist in the database/); - }); - - test('the child accepts a null parent id', function(assert) { - let comment = this.schema.comments.new({ commentableId: null }); - - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - assert.deepEqual(comment.attrs, { commentableId: null }); - }); - - test('the child accepts a saved parent model', function(assert) { - let post = this.helper.savedParent(); - let comment = this.schema.comments.new({ commentable: post }); - - assert.deepEqual(comment.commentableId, { type: 'post', id: post.id }); - assert.deepEqual(comment.commentable, post); - }); - - test('the child accepts a new parent model', function(assert) { - let post = this.schema.posts.new({ text: 'foo' }); - let comment = this.schema.comments.new({ commentable: post }); - - assert.deepEqual(comment.commentableId, { type: 'post', id: undefined }); - assert.deepEqual(comment.commentable, post); - assert.deepEqual(comment.attrs, { commentableId: null }); - }); - - test('the child accepts a null parent model', function(assert) { - let comment = this.schema.comments.new({ commentable: null }); - - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - assert.deepEqual(comment.attrs, { commentableId: null }); - }); - - test('the child accepts a parent model and id', function(assert) { - let post = this.helper.savedParent(); - let comment = this.schema.comments.new({ commentable: post, commentableId: { type: 'post', id: post.id } }); - - assert.deepEqual(comment.commentableId, { type: 'post', id: '1' }); - assert.deepEqual(comment.commentable, post); - assert.deepEqual(comment.attrs, { commentableId: { type: 'post', id: post.id } }); - }); - - test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let comment = this.schema.comments.new({}); - - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - assert.deepEqual(comment.attrs, { commentableId: null }); - }); - - test('the child accepts no reference to a parent id or model', function(assert) { - let comment = this.schema.comments.new(); - - assert.equal(comment.commentableId, null); - assert.deepEqual(comment.commentable, null); - assert.deepEqual(comment.attrs, { commentableId: null }); - }); -}); diff --git a/tests/integration/orm/belongs-to/misc-test.js b/tests/integration/orm/belongs-to/misc-test.js deleted file mode 100644 index 481099bdb..000000000 --- a/tests/integration/orm/belongs-to/misc-test.js +++ /dev/null @@ -1,18 +0,0 @@ -// import { Model, belongsTo } from 'ember-cli-mirage'; -// import Schema from 'ember-cli-mirage/orm/schema'; -// import Db from 'ember-cli-mirage/db'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Misc', function() { - test('an ambiguous schema throws an error', function(assert) { - assert.ok(true); - // assert.throws(function() { - // new Schema(new Db(), { - // user: Model.extend({ - // foo: belongsTo('user'), - // bar: belongsTo('user') - // }) - // }); - // }, /You defined the 'foo' relationship on user, but multiple possible inverse relationships of type user exist. Please refer to the models documentation to learn how to explicitly specify inverses./); - }); -}); diff --git a/tests/integration/orm/belongs-to/notes.md b/tests/integration/orm/belongs-to/notes.md deleted file mode 100644 index 5785341ae..000000000 --- a/tests/integration/orm/belongs-to/notes.md +++ /dev/null @@ -1,43 +0,0 @@ -A belongsTo relationship has the following possible schemas. For each schema, the child model can be in six states with respect to its parent: - - - the child can be saved and the parent can be one of: undefined, new or saved - - - the child can be new and the parent can be one of: undefined, new or saved - -This is how the tests in this directory are organized. - -# belongsTo -Given Post, Author models -For the Post model - -## basic -author: belongsTo() - -## named -writer: belongsTo('author') - -## reflexive, one-way -post: belongsTo() - -## named reflexive -childPost: belongsTo('post') - -## inverse (implicit) -author: belongsTo() - -(author) -posts: hasMany() - -## inverse (explicit) -author: belongsTo('author', { inverse: 'redPosts' }) - -(author) -posts: hasMany('post', { inverse: 'author' }) -drafts: hasMany('post') - -## multiple (conflict) -primaryAuthor: belongsTo('author') -secondaryAuthor: belongsTo('author') - -(author) -posts: hasMany() diff --git a/tests/integration/orm/belongs-to/regressions/issue-1112-test.js b/tests/integration/orm/belongs-to/regressions/issue-1112-test.js deleted file mode 100644 index 22bcc115b..000000000 --- a/tests/integration/orm/belongs-to/regressions/issue-1112-test.js +++ /dev/null @@ -1,29 +0,0 @@ -import { Model, belongsTo, hasMany } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Regressions | Issue 1112', function() { - test(`deleting a record with a polymorphic belongsTo doesn't interfere with other dependents`, function(assert) { - let schema = new Schema(new Db(), { - comment: Model.extend({ - commentable: belongsTo({ polymorphic: true }), - user: belongsTo('user') - }), - - post: Model, - - user: Model.extend({ - comments: hasMany('comment') - }) - }); - - let user = schema.users.create(); - let post = schema.posts.create(); - let comment = schema.comments.create({ commentable: post, user }); - - comment.destroy(); - - assert.deepEqual(user.reload().commentIds, []); - }); -}); diff --git a/tests/integration/orm/belongs-to/regressions/pr-1312-test.js b/tests/integration/orm/belongs-to/regressions/pr-1312-test.js deleted file mode 100644 index f7734e6eb..000000000 --- a/tests/integration/orm/belongs-to/regressions/pr-1312-test.js +++ /dev/null @@ -1,23 +0,0 @@ -import { Model, belongsTo, hasMany } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Belongs To | Regressions | pr-1312', function() { - test(`creating and using a record with a polymorphic hasMany and explicit inverse does not fail when accessing the association`, function(assert) { - let schema = new Schema(new Db(), { - comment: Model.extend({ - commentable: belongsTo({ polymorphic: true, inverse: 'comments' }) - }), - - post: Model.extend({ - comments: hasMany('comment', { inverse: 'commentable' }) - }) - }); - - let post = schema.posts.create(); - post.createComment(); - - assert.equal(post.comments.models.length, 1); - }); -}); diff --git a/tests/integration/orm/collection-inflector-test.js b/tests/integration/orm/collection-inflector-test.js deleted file mode 100644 index 56a5d4e61..000000000 --- a/tests/integration/orm/collection-inflector-test.js +++ /dev/null @@ -1,27 +0,0 @@ -// import Model from 'ember-cli-mirage/orm/model'; -// import Schema from 'ember-cli-mirage/orm/schema'; -import { Server, Model } from 'ember-cli-mirage'; -import Inflector from 'ember-inflector'; -import { module, test } from 'qunit'; - -module('Integration | ORM | inflector-collectionName integration', function(hooks) { - hooks.beforeEach(function() { - Inflector.inflector.irregular('head-of-state', 'heads-of-state'); - - this.server = new Server({ - models: { - headOfState: Model.extend() - }, - inflector: Inflector.inflector - }); - }); - - hooks.beforeEach(function() { - this.server.shutdown(); - }); - - test(' [regression] collection creation respects irregular plural rules', function(assert) { - assert.equal(this.server.db._collections.length, 1); - assert.equal(this.server.db._collections[0].name, 'headsOfState'); - }); -}); diff --git a/tests/integration/orm/collection-test.js b/tests/integration/orm/collection-test.js deleted file mode 100644 index 57603880c..000000000 --- a/tests/integration/orm/collection-test.js +++ /dev/null @@ -1,86 +0,0 @@ -import Schema from 'ember-cli-mirage/orm/schema'; -import Model from 'ember-cli-mirage/orm/model'; -import Db from 'ember-cli-mirage/db'; -import Collection from 'ember-cli-mirage/orm/collection'; -import {module, test} from 'qunit'; - -module('Integration | ORM | collection', function(hooks) { - hooks.beforeEach(function() { - this.User = Model.extend(); - this.db = new Db({ users: [ - { id: 1, name: 'Link', good: true }, - { id: 2, name: 'Zelda', good: true }, - { id: 3, name: 'Ganon', good: false } - ] }); - - this.schema = new Schema(this.db, { - user: this.User - }); - }); - - test('a collection can save its models', function(assert) { - let collection = this.schema.users.all(); - collection.models[0].name = 'Sam'; - collection.save(); - - assert.deepEqual(this.db.users[0], { id: '1', name: 'Sam', good: true }); - }); - - test('a collection can reload its models', function(assert) { - let collection = this.schema.users.all(); - assert.equal(collection.models[0].name, 'Link'); - - collection.models[0].name = 'Sam'; - assert.equal(collection.models[0].name, 'Sam'); - - collection.reload(); - assert.equal(collection.models[0].name, 'Link'); - }); - - test('a collection can filter its models', function(assert) { - let collection = this.schema.users.all(); - assert.equal(collection.models.length, 3); - - let newCollection = collection.filter((author) => author.good); - - assert.ok(newCollection instanceof Collection); - assert.equal(newCollection.modelName, 'user', 'the filtered collection has the right type'); - assert.equal(newCollection.models.length, 2); - }); - - test('a collection can sort its models', function(assert) { - let collection = this.schema.users.all(); - assert.deepEqual(collection.models.map((m) => m.name), ['Link', 'Zelda', 'Ganon']); - - let newCollection = collection.sort((a, b) => { - return a.name.localeCompare(b.name); - }); - - assert.ok(newCollection instanceof Collection); - assert.equal(newCollection.modelName, 'user', 'the sorted collection has the right type'); - assert.deepEqual(newCollection.models.map((m) => m.name), ['Ganon', 'Link', 'Zelda']); - }); - - test('a collection can slice its models', function(assert) { - let collection = this.schema.users.all(); - assert.deepEqual(collection.models.map(m => m.name), ['Link', 'Zelda', 'Ganon'], 'Starts with 3'); - - let newCollection = collection.slice(-2); - - assert.ok(newCollection instanceof Collection); - assert.equal(newCollection.modelName, 'user', 'the sliced collection has the right type'); - assert.deepEqual(newCollection.models.map(m => m.name), ['Zelda', 'Ganon']); - }); - - test('a collection can merge with another collection', function(assert) { - let goodGuys = this.schema.users.where((user) => user.good); - let badGuys = this.schema.users.where((user) => !user.good); - - assert.equal(goodGuys.models.length, 2); - assert.equal(badGuys.models.length, 1); - - goodGuys.mergeCollection(badGuys); - - assert.equal(goodGuys.models.length, 3); - }); -}); diff --git a/tests/integration/orm/create-test.js b/tests/integration/orm/create-test.js deleted file mode 100644 index 70f5b7498..000000000 --- a/tests/integration/orm/create-test.js +++ /dev/null @@ -1,51 +0,0 @@ -import Schema from 'ember-cli-mirage/orm/schema'; -import Model from 'ember-cli-mirage/orm/model'; -import Db from 'ember-cli-mirage/db'; -import {module, test} from 'qunit'; - -var db, schema, User; - -module('Integration | ORM | create', function(hooks) { - hooks.beforeEach(function() { - User = Model.extend(); - db = new Db(); - schema = new Schema(db, { - user: User - }); - }); - - test('it cannot make new models that havent been registered', function(assert) { - assert.throws(function() { - schema.authors.new({ name: 'Link' }); - }); - }); - - test('it cannot create models that havent been registered', function(assert) { - assert.throws(function() { - schema.authors.create({ name: 'Link' }); - }); - }); - - test('it can make new models and then save them', function(assert) { - let user = schema.users.new({ name: 'Link' }); - - assert.ok(user instanceof User); - assert.deepEqual(user.attrs, { name: 'Link' }); - assert.deepEqual(db.users, []); - - user.save(); - - assert.ok(user.id, 'user has an id getter'); - assert.deepEqual(user.attrs, { id: '1', name: 'Link' }); - assert.deepEqual(db.users, [{ id: '1', name: 'Link' }]); - }); - - test('it can create new models, saved directly to the db', function(assert) { - let user = schema.users.create({ name: 'Link' }); - - assert.ok(user instanceof Model); - assert.ok(user instanceof User); - assert.deepEqual(user.attrs, { id: '1', name: 'Link' }); - assert.deepEqual(db.users, [{ id: '1', name: 'Link' }]); - }); -}); diff --git a/tests/integration/orm/destroy-test.js b/tests/integration/orm/destroy-test.js deleted file mode 100644 index 0970c0299..000000000 --- a/tests/integration/orm/destroy-test.js +++ /dev/null @@ -1,41 +0,0 @@ -import Schema from 'ember-cli-mirage/orm/schema'; -import Model from 'ember-cli-mirage/orm/model'; -import Db from 'ember-cli-mirage/db'; -import {module, test} from 'qunit'; - -let db; - -module('Integration | ORM | destroy', function(hooks) { - hooks.beforeEach(function() { - db = new Db({ - users: [ - { id: 1, name: 'Link', evil: false }, - { id: 2, name: 'Link', location: 'Hyrule', evil: false }, - { id: 3, name: 'Zelda', location: 'Hyrule', evil: false } - ] - }); - - this.schema = new Schema(db, { - user: Model - }); - }); - - test('destroying a model removes the associated record from the db', function(assert) { - assert.deepEqual(db.users.length, 3); - - let link = this.schema.users.find(1); - link.destroy(); - - assert.deepEqual(db.users.find(1), null); - assert.deepEqual(db.users.length, 2); - }); - - test('destroying a collection removes the associated records from the db', function(assert) { - assert.deepEqual(db.users.length, 3); - - let users = this.schema.users.all(); - users.destroy(); - - assert.deepEqual(db.users, []); - }); -}); diff --git a/tests/integration/orm/find-or-create-by-test.js b/tests/integration/orm/find-or-create-by-test.js deleted file mode 100644 index 6658f87b7..000000000 --- a/tests/integration/orm/find-or-create-by-test.js +++ /dev/null @@ -1,55 +0,0 @@ -import Schema from 'ember-cli-mirage/orm/schema'; -import Model from 'ember-cli-mirage/orm/model'; -import Db from 'ember-cli-mirage/db'; -import {module, test} from 'qunit'; - -module('Integration | ORM | #findOrCreateBy', function(hooks) { - hooks.beforeEach(function() { - let db = new Db({ users: [ - { id: 1, name: 'Link', good: true }, - { id: 2, name: 'Zelda', good: true }, - { id: 3, name: 'Ganon', good: false } - ] }); - - this.User = Model.extend(); - - this.schema = new Schema(db, { - user: this.User - }); - }); - - test('it returns the first model that matches the attrs', function(assert) { - let user = this.schema.users.findOrCreateBy({ good: true }); - - assert.ok(user instanceof this.User); - assert.deepEqual(user.attrs, { id: '1', name: 'Link', good: true }); - }); - - test('it creates a model if no existing model with the attrs is found', function(assert) { - assert.equal(this.schema.db.users.length, 3); - - let newUser = this.schema.users.findOrCreateBy({ name: 'Link', good: false }); - - assert.equal(this.schema.db.users.length, 4); - assert.ok(newUser instanceof this.User); - assert.deepEqual(newUser.attrs, { id: '4', name: 'Link', good: false }); - }); - - // test('it returns models that match using a query function', function(assert) { - // let users = schema.users.where(function(rec) { - // return !rec.good; - // }); - // - // assert.ok(users instanceof Collection, 'it returns a collection'); - // assert.equal(users.models.length, 1); - // assert.ok(users.models[0] instanceof User); - // assert.deepEqual(users.models[0].attrs, { id: '3', name: 'Ganon', good: false }); - // }); - - // test('it returns an empty collection if no models match a query', function(assert) { - // let users = schema.users.where({ name: 'Link', good: false }); - // - // assert.ok(users instanceof Collection, 'it returns a collection'); - // assert.equal(users.models.length, 0); - // }); -}); diff --git a/tests/integration/orm/find-test.js b/tests/integration/orm/find-test.js deleted file mode 100644 index 9eb97565c..000000000 --- a/tests/integration/orm/find-test.js +++ /dev/null @@ -1,49 +0,0 @@ -import Schema from 'ember-cli-mirage/orm/schema'; -import Model from 'ember-cli-mirage/orm/model'; -import Db from 'ember-cli-mirage/db'; -import Collection from 'ember-cli-mirage/orm/collection'; -import {module, test} from 'qunit'; - -var schema; -var User = Model.extend(); - -module('Integration | ORM | #find', function(hooks) { - hooks.beforeEach(function() { - let db = new Db({ users: [ - { id: 1, name: 'Link' }, - { id: 2, name: 'Zelda' } - ] }); - - schema = new Schema(db, { - user: User - }); - }); - - test('it can find a model by id', function(assert) { - let zelda = schema.users.find(2); - - assert.ok(zelda instanceof User); - assert.deepEqual(zelda.attrs, { id: '2', name: 'Zelda' }); - }); - - test('it returns null if no model is found for an id', function(assert) { - let user = schema.users.find(4); - - assert.equal(user, null); - }); - - test('it can find multiple models by ids', function(assert) { - let users = schema.users.find([1, 2]); - - assert.ok(users instanceof Collection, 'it returns a collection'); - assert.ok(users.models[0] instanceof User); - assert.equal(users.models.length, 2); - assert.deepEqual(users.models[1].attrs, { id: '2', name: 'Zelda' }); - }); - - test('it errors if incorrect number of models are found for an array of ids', function(assert) { - assert.throws(function() { - schema.users.find([1, 6]); - }, /Couldn't find all users/); - }); -}); diff --git a/tests/integration/orm/first-test.js b/tests/integration/orm/first-test.js deleted file mode 100644 index 731c2e6d4..000000000 --- a/tests/integration/orm/first-test.js +++ /dev/null @@ -1,25 +0,0 @@ -import Schema from 'ember-cli-mirage/orm/schema'; -import Model from 'ember-cli-mirage/orm/model'; -import Db from 'ember-cli-mirage/db'; -import {module, test} from 'qunit'; - -let schema; -let User = Model.extend(); - -module('Integration | ORM | #first', function(hooks) { - hooks.beforeEach(function() { - let db = new Db(); - db.createCollection('users'); - db.users.insert([{ id: 1, name: 'Link' }, { id: 2, name: 'Zelda' }]); - schema = new Schema(db); - - schema.registerModel('user', User); - }); - - test('it can find the first model', function(assert) { - let user = schema.users.first(); - - assert.ok(user instanceof User); - assert.deepEqual(user.attrs, { id: '1', name: 'Link' }); - }); -}); diff --git a/tests/integration/orm/has-many/1-basic/_helper.js b/tests/integration/orm/has-many/1-basic/_helper.js deleted file mode 100644 index da1d233b7..000000000 --- a/tests/integration/orm/has-many/1-basic/_helper.js +++ /dev/null @@ -1,124 +0,0 @@ -import { Model, hasMany } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -/* - A model with a hasMany association can be in eight states - with respect to its association. This helper class - returns a parent (and its children) in these various states. - - The return value is an array of the form - - [ parent, [child1, child2...] ] - - where the children array may be empty. -*/ -export default class Helper { - - constructor() { - this.db = new Db(); - - this.schema = new Schema(this.db, { - user: Model.extend({ - posts: hasMany() - }), - post: Model - }); - } - - savedParentNoChildren() { - let user = this.db.users.insert({ name: 'Link' }); - - return [ this.schema.users.find(user.id), [] ]; - } - - savedParentNewChildren() { - let user = this.schema.users.create({ name: 'Link' }); - let post1 = this.schema.posts.new({ title: 'Lorem' }); - let post2 = this.schema.posts.new({ title: 'Ipsum' }); - - user.posts = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - savedParentSavedChildren() { - let user = this.schema.users.create({ name: 'Link' }); - let post1 = this.schema.posts.create({ title: 'Lorem' }); - let post2 = this.schema.posts.create({ title: 'Ipsum' }); - - user.posts = [ post1, post2 ]; - user.save(); - - return [ user, [ post1, post2 ] ]; - } - - savedParentMixedChildren() { - let user = this.schema.users.create({ name: 'Link' }); - let post1 = this.schema.posts.create({ title: 'Lorem' }); - let post2 = this.schema.posts.new({ title: 'Ipsum' }); - - user.posts = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - newParentNoChildren() { - let user = this.schema.users.new({ name: 'Link' }); - - return [ user, [] ]; - } - - newParentNewChildren() { - let user = this.schema.users.new({ name: 'Link' }); - let post1 = this.schema.posts.new({ title: 'Lorem' }); - let post2 = this.schema.posts.new({ title: 'Ipsum' }); - - user.posts = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - newParentSavedChildren() { - let user = this.schema.users.new({ name: 'Link' }); - let post1 = this.schema.posts.create({ title: 'Lorem' }); - let post2 = this.schema.posts.create({ title: 'Ipsum' }); - - user.posts = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - newParentMixedChildren() { - let user = this.schema.users.new({ name: 'Link' }); - let post1 = this.schema.posts.create({ title: 'Lorem' }); - let post2 = this.schema.posts.new({ title: 'Ipsum' }); - - user.posts = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - // Unassociated child models, used for setting tests - savedChild() { - let insertedPost = this.db.posts.insert({ title: 'Lorem' }); - - return this.schema.posts.find(insertedPost.id); - } - - newChild() { - return this.schema.posts.new({ title: 'Lorem' }); - } - -} - -export const states = [ - 'savedParentNoChildren', - 'savedParentNewChildren', - 'savedParentSavedChildren', - 'savedParentMixedChildren', - 'newParentNoChildren', - 'newParentNewChildren', - 'newParentSavedChildren', - 'newParentMixedChildren' -]; diff --git a/tests/integration/orm/has-many/1-basic/accessor-test.js b/tests/integration/orm/has-many/1-basic/accessor-test.js deleted file mode 100644 index f0eb0c597..000000000 --- a/tests/integration/orm/has-many/1-basic/accessor-test.js +++ /dev/null @@ -1,30 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Basic | accessor', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ user, posts ] = this.helper[state](); - - assert.equal(user.posts.models.length, posts.length, 'the parent has the correct number of children'); - assert.equal(user.postIds.length, posts.length, 'the parent has the correct number of children ids'); - - posts.forEach((post, i) => { - assert.deepEqual(user.posts.models[i], posts[i], 'each child is in parent.children array'); - - if (post.isSaved()) { - assert.ok(user.postIds.indexOf(post.id) > -1, 'each saved child id is in parent.childrenIds array'); - } - }); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/1-basic/association-create-test.js b/tests/integration/orm/has-many/1-basic/association-create-test.js deleted file mode 100644 index 5f47567d1..000000000 --- a/tests/integration/orm/has-many/1-basic/association-create-test.js +++ /dev/null @@ -1,28 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Basic | association #create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { - - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.posts.models.length; - - let post = user.createPost({ title: 'Lorem ipsum' }); - - assert.ok(post.id, 'the child was persisted'); - assert.equal(user.posts.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.posts.includes(post), 'the model was added to user.posts'); - assert.ok(user.postIds.indexOf(post.id) > -1, 'the id was added to the fks array'); - assert.ok(user.attrs.postIds.indexOf(post.id) > -1, 'fks were persisted'); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/1-basic/association-new-test.js b/tests/integration/orm/has-many/1-basic/association-new-test.js deleted file mode 100644 index 754a279bf..000000000 --- a/tests/integration/orm/has-many/1-basic/association-new-test.js +++ /dev/null @@ -1,33 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Basic | association #new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ - - states.forEach((state) => { - - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.posts.models.length; - - let post = user.newPost({ title: 'Lorem ipsum' }); - - assert.ok(!post.id, 'the child was not persisted'); - assert.equal(user.posts.models.length, initialCount + 1); - - post.save(); - - assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum' }, 'the child was persisted'); - assert.equal(user.posts.models.length, initialCount + 1, 'the collection size was increased'); - assert.deepEqual(user.posts.models.filter((a) => a.id === post.id)[0], post, 'the model was added to user.posts'); - assert.ok(user.postIds.indexOf(post.id) > -1, 'the id was added to the fks array'); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/1-basic/association-set-ids-test.js b/tests/integration/orm/has-many/1-basic/association-set-ids-test.js deleted file mode 100644 index 316b5a78c..000000000 --- a/tests/integration/orm/has-many/1-basic/association-set-ids-test.js +++ /dev/null @@ -1,34 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Basic | association #setIds', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user ] = this.helper[state](); - let savedPost = this.helper.savedChild(); - - user.postIds = [ savedPost.id ]; - - assert.deepEqual(user.posts.models[0].attrs, savedPost.attrs); - assert.deepEqual(user.postIds, [ savedPost.id ]); - }); - - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ user ] = this.helper[state](); - - user.postIds = null; - - assert.deepEqual(user.posts.models, []); - assert.deepEqual(user.postIds, []); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/1-basic/association-set-test.js b/tests/integration/orm/has-many/1-basic/association-set-test.js deleted file mode 100644 index 6d90d9d55..000000000 --- a/tests/integration/orm/has-many/1-basic/association-set-test.js +++ /dev/null @@ -1,53 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Basic | association #set', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ user ] = this.helper[state](); - let savedPost = this.helper.savedChild(); - - user.posts = [ savedPost ]; - - assert.ok(user.posts.models.indexOf(savedPost) > -1); - assert.ok(user.postIds.indexOf(savedPost.id) > -1); - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user ] = this.helper[state](); - let newPost = this.helper.newChild(); - - user.posts = [ newPost ]; - - assert.deepEqual(user.postIds, [ undefined ]); - assert.deepEqual(user.posts.models[0], newPost); - }); - - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user ] = this.helper[state](); - - user.posts = [ ]; - - assert.deepEqual(user.postIds, [ ]); - assert.equal(user.posts.models.length, 0); - }); - - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user ] = this.helper[state](); - - user.posts = null; - - assert.deepEqual(user.postIds, [ ]); - assert.equal(user.posts.models.length, 0); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/1-basic/create-test.js b/tests/integration/orm/has-many/1-basic/create-test.js deleted file mode 100644 index 4374c4842..000000000 --- a/tests/integration/orm/has-many/1-basic/create-test.js +++ /dev/null @@ -1,87 +0,0 @@ -import Helper from './_helper'; -import { Model } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Basic | create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - postIds: [ post.id ] - }); - - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.attrs.postIds, [ post.id ], 'the ids were persisted'); - assert.deepEqual(user.posts.models[0].attrs, post.attrs); - assert.equal(this.helper.db.posts.length, 1); - assert.deepEqual(this.helper.db.posts[0], { id: '1' }); - assert.equal(this.helper.db.users.length, 1); - assert.deepEqual(this.helper.db.users[0], { id: '1', postIds: [ '1' ] }); - }); - - test('it sets up associations correctly when passing in an array of models', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - posts: [ post ] - }); - - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.attrs.postIds, [ post.id ], 'the ids were persisted'); - assert.deepEqual(user.posts.models[0].attrs, post.attrs); - assert.equal(this.helper.db.posts.length, 1); - assert.deepEqual(this.helper.db.posts[0], { id: '1' }); - assert.equal(this.helper.db.users.length, 1); - assert.deepEqual(this.helper.db.users[0], { id: '1', postIds: [ '1' ] }); - }); - - test('it sets up associations correctly when passing in a collection', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - posts: this.helper.schema.posts.all() - }); - - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.attrs.postIds, [ post.id ], 'the ids were persisted'); - assert.deepEqual(user.posts.models[0].attrs, post.attrs); - assert.equal(this.helper.db.posts.length, 1); - assert.deepEqual(this.helper.db.posts[0], { id: '1' }); - assert.equal(this.helper.db.users.length, 1); - assert.deepEqual(this.helper.db.users[0], { id: '1', postIds: [ '1' ] }); - }); - - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.create('user', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.create('user', { - foos: [ schema.create('foo') ] - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); - - assert.throws(function() { - schema.create('post', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); -}); diff --git a/tests/integration/orm/has-many/1-basic/delete-test.js b/tests/integration/orm/has-many/1-basic/delete-test.js deleted file mode 100644 index fce706906..000000000 --- a/tests/integration/orm/has-many/1-basic/delete-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Basic | delete', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ user, posts ] = this.helper[state](); - - if (posts && posts.length) { - posts.forEach(p => p.destroy()); - user.reload(); - } - - assert.equal(user.posts.length, 0); - assert.equal(user.postIds.length, 0); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/1-basic/instantiating-test.js b/tests/integration/orm/has-many/1-basic/instantiating-test.js deleted file mode 100644 index e0c01ebd4..000000000 --- a/tests/integration/orm/has-many/1-basic/instantiating-test.js +++ /dev/null @@ -1,81 +0,0 @@ -import Helper from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Basic | instantiating', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the parent accepts a saved child id', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ - postIds: [ post.id ] - }); - - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.posts.models[0], post); - }); - - test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ postIds: [ 2 ] }); - }, /You're instantiating a user that has a postIds of 2, but some of those records don't exist in the database/); - }); - - test('the parent accepts null children foreign key', function(assert) { - let user = this.schema.users.new({ postIds: null }); - - assert.equal(user.posts.models.length, 0); - assert.deepEqual(user.postIds, []); - assert.deepEqual(user.attrs, { postIds: null }); - }); - - test('the parent accepts saved children', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ posts: [ post ] }); - - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.posts.models[0], post); - }); - - test('the parent accepts new children', function(assert) { - let post = this.schema.posts.new({ title: 'Lorem' }); - let user = this.schema.users.new({ posts: [ post ] }); - - assert.deepEqual(user.postIds, [ undefined ]); - assert.deepEqual(user.posts.models[0], post); - }); - - test('the parent accepts null children', function(assert) { - let user = this.schema.users.new({ posts: null }); - - assert.equal(user.posts.models.length, 0); - assert.deepEqual(user.postIds, []); - assert.deepEqual(user.attrs, { postIds: null }); - }); - - test('the parent accepts children and child ids', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ posts: [ post ], postIds: [ post.id ] }); - - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.posts.models[0], post); - }); - - test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let user = this.schema.users.new({}); - - assert.deepEqual(user.postIds, []); - assert.deepEqual(user.posts.models, []); - assert.deepEqual(user.attrs, { postIds: null }); - }); - - test('the parent accepts no reference to children or child ids', function(assert) { - let user = this.schema.users.new(); - - assert.deepEqual(user.postIds, []); - assert.deepEqual(user.posts.models, []); - assert.deepEqual(user.attrs, { postIds: null }); - }); -}); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/_helper.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/_helper.js deleted file mode 100644 index ca38b0a60..000000000 --- a/tests/integration/orm/has-many/10-many-to-many-polymorphic/_helper.js +++ /dev/null @@ -1,143 +0,0 @@ -import { Model, hasMany } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -/* - A model with a hasMany association can be in eight states - with respect to its association. This helper class - returns a parent (and its children) in these various states. - - The return value is an array of the form - - [ parent, [child1, child2...] ] - - where the children array may be empty. -*/ -export default class Helper { - - constructor() { - this.db = new Db(); - this.loadData = this.db.loadData.bind(this.db); - - this.schema = new Schema(this.db, { - post: Model.extend({ - users: hasMany() - }), - user: Model.extend({ - commentables: hasMany({ polymorphic: true }) - }) - }); - } - - savedParentNoChildren() { - let user = this.db.users.insert({ name: 'Link' }); - - return [ this.schema.users.find(user.id), [] ]; - } - - savedParentNewChildren() { - let user = this.schema.users.create({ name: 'Link' }); - let post1 = this.schema.posts.new({ title: 'Lorem' }); - let post2 = this.schema.posts.new({ title: 'Ipsum' }); - - user.commentables = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - savedParentSavedChildren() { - this.loadData({ - posts: [ - { id: '1', title: 'Lorem', userIds: [ '1' ] }, - { id: '2', title: 'Ipsum', userIds: [ '1' ] } - ], - users: [ - { id: '1', name: 'Link', commentableIds: [ { type: 'post', id: '1' }, { type: 'post', id: '2' } ] } - ] - }); - - let user = this.schema.users.find(1); - let post1 = this.schema.posts.find(1); - let post2 = this.schema.posts.find(2); - - return [ user, [ post1, post2 ] ]; - } - - savedParentMixedChildren() { - this.loadData({ - posts: [ - { id: '1', title: 'Lorem', userIds: [ ] } - ], - users: [ - { id: '1', name: 'Link', commentableIds: [ ] } - ] - }); - - let user = this.schema.users.find(1); - let post1 = this.schema.posts.find(1); - let post2 = this.schema.posts.new({ title: 'Ipsum' }); - - user.commentables = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - newParentNoChildren() { - let user = this.schema.users.new({ name: 'Link' }); - - return [ user, [] ]; - } - - newParentNewChildren() { - let user = this.schema.users.new({ name: 'Link' }); - let post1 = this.schema.posts.new({ title: 'Lorem' }); - let post2 = this.schema.posts.new({ title: 'Ipsum' }); - - user.commentables = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - newParentSavedChildren() { - let user = this.schema.users.new({ name: 'Link' }); - let post1 = this.schema.posts.create({ title: 'Lorem' }); - let post2 = this.schema.posts.create({ title: 'Ipsum' }); - - user.commentables = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - newParentMixedChildren() { - let user = this.schema.users.new({ name: 'Link' }); - let post1 = this.schema.posts.create({ title: 'Lorem' }); - let post2 = this.schema.posts.new({ title: 'Ipsum' }); - - user.commentables = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - // Unassociated child models, used for setting tests - savedChild() { - let insertedPost = this.db.posts.insert({ title: 'Lorem' }); - - return this.schema.posts.find(insertedPost.id); - } - - newChild() { - return this.schema.posts.new({ title: 'Lorem' }); - } - -} - -export const states = [ - 'savedParentNoChildren', - 'savedParentNewChildren', - 'savedParentSavedChildren', - 'savedParentMixedChildren', - 'newParentNoChildren', - 'newParentNewChildren', - 'newParentSavedChildren', - 'newParentMixedChildren' -]; diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/accessor-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/accessor-test.js deleted file mode 100644 index c994c97b8..000000000 --- a/tests/integration/orm/has-many/10-many-to-many-polymorphic/accessor-test.js +++ /dev/null @@ -1,37 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Many-to-many Polymorphic | accessor', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ user, posts ] = this.helper[state](); - - assert.equal(user.commentables.models.length, posts.length, 'the parent has the correct number of children'); - assert.equal(user.commentableIds.length, posts.length, 'the parent has the correct number of children ids'); - - posts.forEach((post, i) => { - assert.ok(user.commentables.includes(post), 'each child is in parent.children array'); - - if (post.isSaved()) { - assert.deepEqual( - user.commentableIds[i], - { type: 'post', id: post.id }, - 'each saved child id is in parent.childrenIds array' - ); - } - - // Check the inverse - assert.ok(post.users.includes(user)); - }); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-create-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-create-test.js deleted file mode 100644 index d62cb5135..000000000 --- a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-create-test.js +++ /dev/null @@ -1,33 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Many-to-many Polymorphic | association #create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { - - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.commentables.models.length; - - let post = user.createCommentable('post', { title: 'Lorem ipsum' }); - - assert.ok(post.id, 'the child was persisted'); - assert.equal(user.commentables.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.commentables.includes(post), 'the model was added to the association'); - assert.ok(user.commentableIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'the id was added to the fks array'); - assert.ok(user.attrs.commentableIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'fks were persisted'); - assert.ok(post.users.includes(user), 'the inverse was set'); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-new-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-new-test.js deleted file mode 100644 index e849ae02c..000000000 --- a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-new-test.js +++ /dev/null @@ -1,37 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Many-to-many Polymorphic | association #new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ - - states.forEach((state) => { - - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.commentables.models.length; - - let post = user.newCommentable('post', { title: 'Lorem ipsum' }); - - assert.ok(!post.id, 'the child was not persisted'); - assert.equal(user.commentables.models.length, initialCount + 1); - assert.equal(post.users.models.length, 1, 'the inverse was set'); - - post.save(); - - assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum', userIds: [ user.id ] }, 'the child was persisted'); - assert.equal(user.commentables.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.commentables.includes(post), 'the model was added to user.commentables'); - assert.ok(user.commentableIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'the id was added to the fks array'); - assert.ok(post.users.includes(user), 'the inverse was set'); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-ids-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-ids-test.js deleted file mode 100644 index 1cac266bf..000000000 --- a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-ids-test.js +++ /dev/null @@ -1,52 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Many-to-many Polymorphic | association #setIds', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let savedPost = this.helper.savedChild(); - - user.commentableIds = [ { type: 'post', id: savedPost.id } ]; - - assert.ok(user.commentables.includes(savedPost)); - assert.ok(user.commentableIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); - - user.save(); - savedPost.reload(); - - assert.ok(savedPost.users.includes(user), 'the inverse was set'); - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.notOk(post.users.includes(user), 'old inverses were cleared'); - } - }); - }); - - test(`a ${state} can clear its association via a null ids`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - - user.commentableIds = null; - - assert.deepEqual(user.commentables.models, []); - assert.deepEqual(user.commentableIds, []); - - user.save(); - - originalPosts.forEach(post => { - post.reload(); - assert.notOk(post.users.includes(user), 'old inverses were cleared'); - }); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-test.js deleted file mode 100644 index 85288b194..000000000 --- a/tests/integration/orm/has-many/10-many-to-many-polymorphic/association-set-test.js +++ /dev/null @@ -1,83 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Many-to-many Polymorphic | association #set', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let savedPost = this.helper.savedChild(); - - user.commentables = [ savedPost ]; - - assert.ok(user.commentables.models.includes(savedPost)); - assert.ok(user.commentableIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); - assert.ok(savedPost.users.includes(user), 'the inverse was set'); - - user.save(); - - originalPosts.forEach(post => { - post.reload(); - assert.notOk(post.users.includes(user), 'old inverses were cleared'); - }); - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let newPost = this.helper.newChild(); - - user.commentables = [ newPost ]; - - assert.deepEqual(user.commentableIds, [ { type: 'post', id: undefined } ]); - assert.deepEqual(user.commentables.models[0], newPost); - assert.ok(newPost.users.includes(user), 'the inverse was set'); - - user.save(); - - originalPosts.forEach(post => { - post.reload(); - assert.notOk(post.users.includes(user), 'old inverses were cleared'); - }); - }); - - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - - user.commentables = [ ]; - - assert.deepEqual(user.commentableIds, [ ]); - assert.equal(user.commentables.models.length, 0); - - user.save(); - - originalPosts.forEach(post => { - post.reload(); - assert.notOk(post.users.includes(user), 'old inverses were cleared'); - }); - }); - - test(`a ${state} can clear its association via null`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - - user.commentables = null; - - assert.deepEqual(user.commentableIds, [ ]); - assert.equal(user.commentables.models.length, 0); - - user.save(); - - originalPosts.forEach(post => { - post.reload(); - assert.notOk(post.users.includes(user), 'old inverses were cleared'); - }); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/create-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/create-test.js deleted file mode 100644 index 297032b1a..000000000 --- a/tests/integration/orm/has-many/10-many-to-many-polymorphic/create-test.js +++ /dev/null @@ -1,57 +0,0 @@ -import Helper from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Many-to-many Polymorphic | create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - commentableIds: [ { type: 'post', id: post.id } ] - }); - - post.reload(); - - assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.attrs.commentableIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); - assert.deepEqual(user.commentables.models[0].attrs, post.attrs); - assert.equal(this.helper.db.posts.length, 1); - assert.equal(this.helper.db.users.length, 1); - assert.deepEqual(this.helper.db.posts[0], { id: '1', userIds: [ '1' ] }); - assert.deepEqual(this.helper.db.users[0], { id: '1', commentableIds: [ { type: 'post', id: '1' } ] }); - }); - - test('it sets up associations correctly when passing in an array of models', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - commentables: [ post ] - }); - - post.reload(); - - assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(post.userIds, [ '1' ], 'the inverse was set'); - assert.deepEqual(user.attrs.commentableIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); - assert.deepEqual(post.attrs.userIds, [ user.id ], 'the inverse was set'); - assert.equal(this.helper.db.users.length, 1); - assert.equal(this.helper.db.posts.length, 1); - }); - - test('it sets up associations correctly when passing in a collection', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - commentables: this.helper.schema.posts.all() - }); - - post.reload(); - - assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(post.userIds, [ user.id ], 'the inverse was set'); - assert.deepEqual(user.attrs.commentableIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(post.attrs.userIds, [ user.id ], 'the inverse was set'); - assert.equal(this.helper.db.users.length, 1); - assert.equal(this.helper.db.posts.length, 1); - }); -}); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/delete-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/delete-test.js deleted file mode 100644 index 70dae8c9c..000000000 --- a/tests/integration/orm/has-many/10-many-to-many-polymorphic/delete-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Many-to-many Polymorphic | delete', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ user, posts ] = this.helper[state](); - - if (posts && posts.length) { - posts.forEach(p => p.destroy()); - user.reload(); - } - - assert.equal(user.commentables.length, 0); - assert.equal(user.commentableIds.length, 0); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/10-many-to-many-polymorphic/instantiating-test.js b/tests/integration/orm/has-many/10-many-to-many-polymorphic/instantiating-test.js deleted file mode 100644 index 4fabb718d..000000000 --- a/tests/integration/orm/has-many/10-many-to-many-polymorphic/instantiating-test.js +++ /dev/null @@ -1,81 +0,0 @@ -import Helper from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Many-to-many Polymorphic | instantiating', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the parent accepts a saved child id', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ - commentableIds: [ { type: 'post', id: post.id } ] - }); - - assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); - assert.ok(user.commentables.includes(post)); - }); - - test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ commentableIds: [ { type: 'post', id: 2 } ] }); - }, /You're instantiating a user that has a commentableIds of post:2, but some of those records don't exist in the database/); - }); - - test('the parent accepts null children foreign key', function(assert) { - let user = this.schema.users.new({ commentableIds: null }); - - assert.equal(user.commentables.models.length, 0); - assert.deepEqual(user.commentableIds, []); - assert.deepEqual(user.attrs, { commentableIds: null }); - }); - - test('the parent accepts saved children', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ commentables: [ post ] }); - - assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); - assert.ok(user.commentables.includes(post)); - }); - - test('the parent accepts new children', function(assert) { - let post = this.schema.posts.new({ title: 'Lorem' }); - let user = this.schema.users.new({ commentables: [ post ] }); - - assert.deepEqual(user.commentableIds, [ { type: 'post', id: undefined } ]); - assert.ok(user.commentables.includes(post)); - }); - - test('the parent accepts null children', function(assert) { - let user = this.schema.users.new({ commentables: null }); - - assert.equal(user.commentables.models.length, 0); - assert.deepEqual(user.commentableIds, []); - assert.deepEqual(user.attrs, { commentableIds: null }); - }); - - test('the parent accepts children and child ids', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ commentables: [ post ], commentableIds: [ { type: 'post', id: post.id } ] }); - - assert.deepEqual(user.commentableIds, [ { type: 'post', id: post.id } ]); - assert.ok(user.commentables.includes(post)); - }); - - test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let user = this.schema.users.new({}); - - assert.deepEqual(user.commentableIds, []); - assert.deepEqual(user.commentables.models, []); - assert.deepEqual(user.attrs, { commentableIds: null }); - }); - - test('the parent accepts no reference to children or child ids', function(assert) { - let user = this.schema.users.new(); - - assert.deepEqual(user.commentableIds, []); - assert.deepEqual(user.commentables.models, []); - assert.deepEqual(user.attrs, { commentableIds: null }); - }); -}); diff --git a/tests/integration/orm/has-many/2-named/_helper.js b/tests/integration/orm/has-many/2-named/_helper.js deleted file mode 100644 index 6fdc8e029..000000000 --- a/tests/integration/orm/has-many/2-named/_helper.js +++ /dev/null @@ -1,123 +0,0 @@ -import { Model, hasMany } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -/* - A model with a hasMany association can be in eight states - with respect to its association. This helper class - returns a parent (and its children) in these various states. - - The return value is an array of the form - - [ parent, [child1, child2...] ] - - where the children array may be empty. -*/ -export default class Helper { - - constructor() { - this.db = new Db(); - - this.schema = new Schema(this.db, { - user: Model.extend({ - blogPosts: hasMany('post') - }), - post: Model - }); - } - - savedParentNoChildren() { - let user = this.db.users.insert({ name: 'Link' }); - - return [ this.schema.users.find(user.id), [] ]; - } - - savedParentNewChildren() { - let user = this.schema.users.create({ name: 'Link' }); - let post1 = this.schema.posts.new({ title: 'Lorem' }); - let post2 = this.schema.posts.new({ title: 'Ipsum' }); - - user.blogPosts = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - savedParentSavedChildren() { - let user = this.schema.users.create({ name: 'Link' }); - let post1 = this.schema.posts.create({ title: 'Lorem' }); - let post2 = this.schema.posts.create({ title: 'Ipsum' }); - - user.blogPosts = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - savedParentMixedChildren() { - let user = this.schema.users.create({ name: 'Link' }); - let post1 = this.schema.posts.create({ title: 'Lorem' }); - let post2 = this.schema.posts.new({ title: 'Ipsum' }); - - user.blogPosts = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - newParentNoChildren() { - let user = this.schema.users.new({ name: 'Link' }); - - return [ user, [] ]; - } - - newParentNewChildren() { - let user = this.schema.users.new({ name: 'Link' }); - let post1 = this.schema.posts.new({ title: 'Lorem' }); - let post2 = this.schema.posts.new({ title: 'Ipsum' }); - - user.blogPosts = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - newParentSavedChildren() { - let user = this.schema.users.new({ name: 'Link' }); - let post1 = this.schema.posts.create({ title: 'Lorem' }); - let post2 = this.schema.posts.create({ title: 'Ipsum' }); - - user.blogPosts = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - newParentMixedChildren() { - let user = this.schema.users.new({ name: 'Link' }); - let post1 = this.schema.posts.create({ title: 'Lorem' }); - let post2 = this.schema.posts.new({ title: 'Ipsum' }); - - user.blogPosts = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - // Unassociated child models, used for setting tests - savedChild() { - let insertedPost = this.db.posts.insert({ title: 'Lorem' }); - - return this.schema.posts.find(insertedPost.id); - } - - newChild() { - return this.schema.posts.new({ title: 'Lorem' }); - } - -} - -export const states = [ - 'savedParentNoChildren', - 'savedParentNewChildren', - 'savedParentSavedChildren', - 'savedParentMixedChildren', - 'newParentNoChildren', - 'newParentNewChildren', - 'newParentSavedChildren', - 'newParentMixedChildren' -]; diff --git a/tests/integration/orm/has-many/2-named/accessor-test.js b/tests/integration/orm/has-many/2-named/accessor-test.js deleted file mode 100644 index acc99d4ec..000000000 --- a/tests/integration/orm/has-many/2-named/accessor-test.js +++ /dev/null @@ -1,30 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named | accessor', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ user, posts ] = this.helper[state](); - - assert.equal(user.blogPosts.models.length, posts.length, 'the parent has the correct number of children'); - assert.equal(user.blogPostIds.length, posts.length, 'the parent has the correct number of children ids'); - - posts.forEach((post, i) => { - assert.deepEqual(user.blogPosts.models[i], posts[i], 'each child is in parent.children array'); - - if (post.isSaved()) { - assert.ok(user.blogPostIds.indexOf(post.id) > -1, 'each saved child id is in parent.childrenIds array'); - } - }); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/2-named/association-create-test.js b/tests/integration/orm/has-many/2-named/association-create-test.js deleted file mode 100644 index 5ba24f5a7..000000000 --- a/tests/integration/orm/has-many/2-named/association-create-test.js +++ /dev/null @@ -1,28 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named | association #create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { - - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.blogPosts.models.length; - - let post = user.createBlogPost({ title: 'Lorem ipsum' }); - - assert.ok(post.id, 'the child was persisted'); - assert.equal(user.blogPosts.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.blogPosts.includes(post), 'the model was added to user.blogPosts'); - assert.ok(user.blogPostIds.indexOf(post.id) > -1, 'the id was added to the fks array'); - assert.ok(user.attrs.blogPostIds.indexOf(post.id) > -1, 'fks were persisted'); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/2-named/association-new-test.js b/tests/integration/orm/has-many/2-named/association-new-test.js deleted file mode 100644 index 227b37c43..000000000 --- a/tests/integration/orm/has-many/2-named/association-new-test.js +++ /dev/null @@ -1,33 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named | association #new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ - - states.forEach((state) => { - - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.blogPosts.models.length; - - let post = user.newBlogPost({ title: 'Lorem ipsum' }); - - assert.ok(!post.id, 'the child was not persisted'); - assert.equal(user.blogPosts.models.length, initialCount + 1); - - post.save(); - - assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum' }, 'the child was persisted'); - assert.equal(user.blogPosts.models.length, initialCount + 1, 'the collection size was increased'); - assert.deepEqual(user.blogPosts.models.filter((a) => a.id === post.id)[0], post, 'the model was added to user.blogPosts'); - assert.ok(user.blogPostIds.indexOf(post.id) > -1, 'the id was added to the fks array'); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/2-named/association-set-ids-test.js b/tests/integration/orm/has-many/2-named/association-set-ids-test.js deleted file mode 100644 index 6921290bb..000000000 --- a/tests/integration/orm/has-many/2-named/association-set-ids-test.js +++ /dev/null @@ -1,34 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named | association #setIds', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user ] = this.helper[state](); - let savedPost = this.helper.savedChild(); - - user.blogPostIds = [ savedPost.id ]; - - assert.deepEqual(user.blogPosts.models[0].attrs, savedPost.attrs); - assert.deepEqual(user.blogPostIds, [ savedPost.id ]); - }); - - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ user ] = this.helper[state](); - - user.blogPostIds = null; - - assert.deepEqual(user.blogPosts.models, []); - assert.deepEqual(user.blogPostIds, []); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/2-named/association-set-test.js b/tests/integration/orm/has-many/2-named/association-set-test.js deleted file mode 100644 index 0106d6863..000000000 --- a/tests/integration/orm/has-many/2-named/association-set-test.js +++ /dev/null @@ -1,53 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named | association #set', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ user ] = this.helper[state](); - let savedPost = this.helper.savedChild(); - - user.blogPosts = [ savedPost ]; - - assert.ok(user.blogPosts.models.indexOf(savedPost) > -1); - assert.ok(user.blogPostIds.indexOf(savedPost.id) > -1); - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user ] = this.helper[state](); - let newPost = this.helper.newChild(); - - user.blogPosts = [ newPost ]; - - assert.deepEqual(user.blogPostIds, [ undefined ]); - assert.deepEqual(user.blogPosts.models[0], newPost); - }); - - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user ] = this.helper[state](); - - user.blogPosts = [ ]; - - assert.deepEqual(user.blogPostIds, [ ]); - assert.equal(user.blogPosts.models.length, 0); - }); - - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user ] = this.helper[state](); - - user.blogPosts = null; - - assert.deepEqual(user.blogPostIds, [ ]); - assert.equal(user.blogPosts.models.length, 0); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/2-named/create-test.js b/tests/integration/orm/has-many/2-named/create-test.js deleted file mode 100644 index 7a18a1030..000000000 --- a/tests/integration/orm/has-many/2-named/create-test.js +++ /dev/null @@ -1,87 +0,0 @@ -import Helper from './_helper'; -import { Model } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named | create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - blogPostIds: [ post.id ] - }); - - assert.deepEqual(user.blogPostIds, [ post.id ]); - assert.deepEqual(user.attrs.blogPostIds, [ post.id ], 'the ids were persisted'); - assert.deepEqual(user.blogPosts.models[0].attrs, post.attrs); - assert.equal(this.helper.db.posts.length, 1); - assert.deepEqual(this.helper.db.posts[0], { id: '1' }); - assert.equal(this.helper.db.users.length, 1); - assert.deepEqual(this.helper.db.users[0], { id: '1', blogPostIds: [ '1' ] }); - }); - - test('it sets up associations correctly when passing in an array of models', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - blogPosts: [ post ] - }); - - assert.deepEqual(user.blogPostIds, [ post.id ]); - assert.deepEqual(user.attrs.blogPostIds, [ post.id ], 'the ids were persisted'); - assert.deepEqual(user.blogPosts.models[0].attrs, post.attrs); - assert.equal(this.helper.db.posts.length, 1); - assert.deepEqual(this.helper.db.posts[0], { id: '1' }); - assert.equal(this.helper.db.users.length, 1); - assert.deepEqual(this.helper.db.users[0], { id: '1', blogPostIds: [ '1' ] }); - }); - - test('it sets up associations correctly when passing in a collection', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - blogPosts: this.helper.schema.posts.all() - }); - - assert.deepEqual(user.blogPostIds, [ post.id ]); - assert.deepEqual(user.attrs.blogPostIds, [ post.id ], 'the ids were persisted'); - assert.deepEqual(user.blogPosts.models[0].attrs, post.attrs); - assert.equal(this.helper.db.posts.length, 1); - assert.deepEqual(this.helper.db.posts[0], { id: '1' }); - assert.equal(this.helper.db.users.length, 1); - assert.deepEqual(this.helper.db.users[0], { id: '1', blogPostIds: [ '1' ] }); - }); - - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.create('user', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.create('user', { - foos: [ schema.create('foo') ] - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); - - assert.throws(function() { - schema.create('post', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); -}); diff --git a/tests/integration/orm/has-many/2-named/delete-test.js b/tests/integration/orm/has-many/2-named/delete-test.js deleted file mode 100644 index 6d9484012..000000000 --- a/tests/integration/orm/has-many/2-named/delete-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named | delete', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ user, blogPosts ] = this.helper[state](); - - if (blogPosts && blogPosts.length) { - blogPosts.forEach(p => p.destroy()); - user.reload(); - } - - assert.equal(user.blogPosts.length, 0); - assert.equal(user.blogPostIds.length, 0); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/2-named/instantiating-test.js b/tests/integration/orm/has-many/2-named/instantiating-test.js deleted file mode 100644 index 888e219b7..000000000 --- a/tests/integration/orm/has-many/2-named/instantiating-test.js +++ /dev/null @@ -1,81 +0,0 @@ -import Helper from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named | instantiating', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the parent accepts a saved child id', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ - blogPostIds: [ post.id ] - }); - - assert.deepEqual(user.blogPostIds, [ post.id ]); - assert.deepEqual(user.blogPosts.models[0], post); - }); - - test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ blogPostIds: [ 2 ] }); - }, /You're instantiating a user that has a blogPostIds of 2, but some of those records don't exist in the database/); - }); - - test('the parent accepts null children foreign key', function(assert) { - let user = this.schema.users.new({ blogPostIds: null }); - - assert.equal(user.blogPosts.models.length, 0); - assert.deepEqual(user.blogPostIds, []); - assert.deepEqual(user.attrs, { blogPostIds: null }); - }); - - test('the parent accepts saved children', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ blogPosts: [ post ] }); - - assert.deepEqual(user.blogPostIds, [ post.id ]); - assert.deepEqual(user.blogPosts.models[0], post); - }); - - test('the parent accepts new children', function(assert) { - let post = this.schema.posts.new({ title: 'Lorem' }); - let user = this.schema.users.new({ blogPosts: [ post ] }); - - assert.deepEqual(user.blogPostIds, [ undefined ]); - assert.deepEqual(user.blogPosts.models[0], post); - }); - - test('the parent accepts null children', function(assert) { - let user = this.schema.users.new({ blogPosts: null }); - - assert.equal(user.blogPosts.models.length, 0); - assert.deepEqual(user.blogPostIds, []); - assert.deepEqual(user.attrs, { blogPostIds: null }); - }); - - test('the parent accepts children and child ids', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ blogPosts: [ post ], blogPostIds: [ post.id ] }); - - assert.deepEqual(user.blogPostIds, [ post.id ]); - assert.deepEqual(user.blogPosts.models[0], post); - }); - - test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let user = this.schema.users.new({}); - - assert.deepEqual(user.blogPostIds, []); - assert.deepEqual(user.blogPosts.models, []); - assert.deepEqual(user.attrs, { blogPostIds: null }); - }); - - test('the parent accepts no reference to children or child ids', function(assert) { - let user = this.schema.users.new(); - - assert.deepEqual(user.blogPostIds, []); - assert.deepEqual(user.blogPosts.models, []); - assert.deepEqual(user.attrs, { blogPostIds: null }); - }); -}); diff --git a/tests/integration/orm/has-many/3-reflexive/_helper.js b/tests/integration/orm/has-many/3-reflexive/_helper.js deleted file mode 100644 index f1390b5cd..000000000 --- a/tests/integration/orm/has-many/3-reflexive/_helper.js +++ /dev/null @@ -1,127 +0,0 @@ -import { Model, hasMany } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -/* - A model with a hasMany association can be in eight states - with respect to its association. This helper class - returns a parent (and its children) in these various states. - - The return value is an array of the form - - [ parent, [child1, child2...] ] - - where the children array may be empty. -*/ -export default class Helper { - - constructor() { - this.db = new Db(); - - this.schema = new Schema(this.db, { - tag: Model.extend({ - tags: hasMany() // implicit inverse - }) - }); - } - - savedParentNoChildren() { - let tag = this.db.tags.insert({ name: 'Red' }); - - return [ this.schema.tags.find(tag.id), [] ]; - } - - savedParentNewChildren() { - let tag = this.schema.tags.create({ name: 'Red' }); - let tag1 = this.schema.tags.new({ name: 'Blue' }); - let tag2 = this.schema.tags.new({ name: 'Green' }); - - tag.tags = [ tag1, tag2 ]; - - return [ tag, [ tag1, tag2 ] ]; - } - - savedParentSavedChildren() { - let { schema } = this; - schema.db.tags.insert([ - { id: '1', name: 'Red', tagIds: ['2', '3'] }, - { id: '2', name: 'Blue', tagIds: ['1'] }, - { id: '3', name: 'Green', tagIds: ['1'] } - ]); - - return [ schema.tags.find(1), [ schema.tags.find(2), schema.tags.find(3) ] ]; - } - - savedParentMixedChildren() { - this.schema.db.tags.insert([ - { id: '1', name: 'Red', tagIds: ['2'] }, - { id: '2', name: 'Blue', tagIds: ['1'] } - ]); - let tag = this.schema.tags.find(1); - let blueTag = this.schema.tags.find(2); - let greenTag = this.schema.tags.new({ name: 'Green' }); - - tag.tags = [ blueTag, greenTag ]; - - return [ tag, [ blueTag, greenTag ] ]; - } - - newParentNoChildren() { - let tag = this.schema.tags.new({ name: 'Red' }); - - return [ tag, [] ]; - } - - newParentNewChildren() { - let tag = this.schema.tags.new({ name: 'Red' }); - let tag1 = this.schema.tags.new({ name: 'Blue' }); - let tag2 = this.schema.tags.new({ name: 'Green' }); - - tag.tags = [ tag1, tag2 ]; - - return [ tag, [ tag1, tag2 ] ]; - } - - newParentSavedChildren() { - let tag = this.schema.tags.new({ name: 'Red' }); - let tag1 = this.schema.tags.create({ name: 'Blue' }); - let tag2 = this.schema.tags.create({ name: 'Green' }); - - tag.tags = [ tag1, tag2 ]; - - return [ tag, [ tag1, tag2 ] ]; - } - - newParentMixedChildren() { - let tag = this.schema.tags.new({ name: 'Red' }); - let tag1 = this.schema.tags.create({ name: 'Blue' }); - let tag2 = this.schema.tags.new({ name: 'Green' }); - - tag.tags = [ tag1, tag2 ]; - - return [ tag, [ tag1, tag2 ] ]; - } - - // Unassociated child models, used for setting tests - savedChild() { - let insertedTag = this.db.tags.insert({ name: 'Blue' }); - - return this.schema.tags.find(insertedTag.id); - } - - newChild() { - return this.schema.tags.new({ name: 'Blue' }); - } - -} - -export const states = [ - 'savedParentNoChildren', - 'savedParentNewChildren', - 'savedParentMixedChildren', - 'savedParentSavedChildren', - 'newParentNoChildren', - 'newParentNewChildren', - 'newParentSavedChildren', - 'newParentMixedChildren' -]; diff --git a/tests/integration/orm/has-many/3-reflexive/accessor-test.js b/tests/integration/orm/has-many/3-reflexive/accessor-test.js deleted file mode 100644 index cc6310cc4..000000000 --- a/tests/integration/orm/has-many/3-reflexive/accessor-test.js +++ /dev/null @@ -1,30 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Reflexive | accessor', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ tag, tags ] = this.helper[state](); - - assert.equal(tag.tags.models.length, tags.length, 'the parent has the correct number of children'); - assert.equal(tag.tagIds.length, tags.length, 'the parent has the correct number of children ids'); - - tags.forEach(t => { - assert.ok(tag.tags.includes(t)); - - if (t.isSaved()) { - assert.ok(tag.tagIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); - } - - // Check the inverse - assert.ok(t.tags.includes(tag)); - }); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/3-reflexive/association-create-test.js b/tests/integration/orm/has-many/3-reflexive/association-create-test.js deleted file mode 100644 index f29a2f6cf..000000000 --- a/tests/integration/orm/has-many/3-reflexive/association-create-test.js +++ /dev/null @@ -1,39 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Reflexive | association #create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { - - test(`a ${state} can create an associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.tags.models.length; - - let orangeTag = tag.createTag({ name: 'Orange' }); - let blueTag = tag.createTag({ name: 'Blue' }); - - assert.ok(orangeTag.id, 'the child was persisted'); - assert.ok(blueTag.id, 'the child was persisted'); - assert.equal(tag.tags.models.length, initialCount + 2, 'the collection size was increased'); - assert.ok(tag.tags.includes(orangeTag), 'the model was added to tag.tags'); - assert.ok(tag.tags.includes(blueTag), 'the model was added to tag.tags'); - assert.ok(tag.tagIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); - assert.ok(tag.tagIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); - assert.ok(tag.attrs.tagIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); - assert.ok(tag.attrs.tagIds.indexOf(blueTag.id) > -1, 'fks were persisted'); - - // Check the inverse - assert.equal(orangeTag.tags.models.length, 1); - assert.ok(orangeTag.tags.includes(tag), 'the inverse was set'); - assert.equal(blueTag.tags.models.length, 1); - assert.ok(blueTag.tags.includes(tag), 'the inverse was set'); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/3-reflexive/association-new-test.js b/tests/integration/orm/has-many/3-reflexive/association-new-test.js deleted file mode 100644 index 203c8c4ee..000000000 --- a/tests/integration/orm/has-many/3-reflexive/association-new-test.js +++ /dev/null @@ -1,36 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Reflexive | association #new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ - - states.forEach((state) => { - - test(`a ${state} can build a new associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.tags.models.length; - - let blueTag = tag.newTag({ name: 'Blue' }); - - assert.ok(!blueTag.id, 'the child was not persisted'); - assert.equal(tag.tags.models.length, initialCount + 1); - assert.equal(blueTag.tags.models.length, 1, 'the inverse was set'); - - blueTag.save(); - tag.reload(); - - assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', tagIds: [ tag.id ] }, 'the child was persisted'); - assert.equal(tag.tags.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.tags.includes(blueTag), 'the model was added to tag.tags'); - assert.ok(tag.tagIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); - assert.ok(blueTag.tags.includes(tag), 'the inverse was set'); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/3-reflexive/association-set-ids-test.js b/tests/integration/orm/has-many/3-reflexive/association-set-ids-test.js deleted file mode 100644 index 1ff25cda1..000000000 --- a/tests/integration/orm/has-many/3-reflexive/association-set-ids-test.js +++ /dev/null @@ -1,48 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Reflexive | association #setIds', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let savedTag = this.helper.savedChild(); - - tag.tagIds = [ savedTag.id ]; - - assert.deepEqual(tag.tags.models[0].attrs, savedTag.attrs); - assert.deepEqual(tag.tagIds, [ savedTag.id ]); - - tag.save(); - savedTag.reload(); - - assert.deepEqual(savedTag.tags.models[0].attrs, tag.attrs, 'the inverse was set'); - originalTags.forEach(originalTag => { - if (originalTag.isSaved()) { - originalTag.reload(); - assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); - } - }); - }); - - test(`a ${state} can clear its association via a null childIds`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - - tag.tagIds = null; - - assert.deepEqual(tag.tags.models, []); - assert.deepEqual(tag.tagIds, []); - - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); - }); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/3-reflexive/association-set-test.js b/tests/integration/orm/has-many/3-reflexive/association-set-test.js deleted file mode 100644 index 9edd77e0b..000000000 --- a/tests/integration/orm/has-many/3-reflexive/association-set-test.js +++ /dev/null @@ -1,81 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Reflexive | association #set', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let savedTag = this.helper.savedChild(); - - tag.tags = [ savedTag ]; - - assert.ok(tag.tags.includes(savedTag)); - assert.equal(tag.tagIds[0], savedTag.id); - assert.ok(savedTag.tags.includes(tag), 'the inverse was set'); - - tag.save(); - - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); - }); - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let newTag = this.helper.newChild(); - - tag.tags = [ newTag ]; - - assert.ok(tag.tags.includes(newTag)); - assert.equal(tag.tagIds[0], undefined); - assert.ok(newTag.tags.includes(tag), 'the inverse was set'); - - tag.save(); - - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); - }); - }); - - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - - tag.tags = [ ]; - - assert.deepEqual(tag.tagIds, [ ]); - assert.equal(tag.tags.models.length, 0); - - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); - }); - }); - - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - - tag.tags = null; - - assert.deepEqual(tag.tagIds, [ ]); - assert.equal(tag.tags.models.length, 0); - - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.tags.includes(tag), 'old inverses were cleared'); - }); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/3-reflexive/create-test.js b/tests/integration/orm/has-many/3-reflexive/create-test.js deleted file mode 100644 index 1ba9f2f68..000000000 --- a/tests/integration/orm/has-many/3-reflexive/create-test.js +++ /dev/null @@ -1,94 +0,0 @@ -import Helper from './_helper'; -import { Model } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Reflexive | create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - tagIds: [ tagA.id ] - }); - - tagA.reload(); - - assert.deepEqual(tagA.tagIds, [ tagB.id ]); - assert.deepEqual(tagB.tagIds, [ tagA.id ], 'the inverse was set'); - assert.deepEqual(tagA.attrs.tagIds, [ tagB.id ], 'the ids were persisted'); - assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ], 'the inverse ids were persisted'); - assert.ok(tagA.tags.includes(tagB)); - assert.ok(tagB.tags.includes(tagA), 'the inverse was set'); - assert.equal(this.helper.db.tags.length, 2); - assert.deepEqual(this.helper.db.tags[0], { id: '1', tagIds: [ '2' ] }); - assert.deepEqual(this.helper.db.tags[1], { id: '2', tagIds: [ '1' ] }); - }); - - test('it sets up associations correctly when passing in an array of models', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - tags: [ tagA ] - }); - - tagA.reload(); - - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagA.tagIds, [ tagB.id ], 'the inverse was set'); - assert.deepEqual(tagA.attrs.tagIds, [ tagB.id ], 'the ids were persisted'); - assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ], 'the inverse was set'); - assert.equal(this.helper.db.tags.length, 2); - }); - - test('it sets up associations correctly when passing in a collection', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - tags: schema.tags.all() - }); - - tagA.reload(); - - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagA.tagIds, [ tagB.id ], 'the inverse was set'); - assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ]); - assert.deepEqual(tagA.attrs.tagIds, [ tagB.id ], 'the inverse was set'); - assert.equal(this.helper.db.tags.length, 2); - }); - - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.tags.create({ - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.tags.create({ - foos: [ schema.create('foo') ] - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.foos.create(); - schema.foos.create(); - - assert.throws(function() { - schema.tags.create({ - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); -}); diff --git a/tests/integration/orm/has-many/3-reflexive/delete-test.js b/tests/integration/orm/has-many/3-reflexive/delete-test.js deleted file mode 100644 index 1b009128b..000000000 --- a/tests/integration/orm/has-many/3-reflexive/delete-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Reflexive | delete', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ tag, tags ] = this.helper[state](); - - if (tags && tags.length) { - tags.forEach(t => t.destroy()); - tag.reload(); - } - - assert.equal(tag.tags.length, 0); - assert.equal(tag.tagIds.length, 0); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/3-reflexive/new-test.js b/tests/integration/orm/has-many/3-reflexive/new-test.js deleted file mode 100644 index e24f9694e..000000000 --- a/tests/integration/orm/has-many/3-reflexive/new-test.js +++ /dev/null @@ -1,81 +0,0 @@ -import Helper from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Reflexive | new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the parent accepts a saved child id', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ - tagIds: [ tagA.id ] - }); - - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.ok(tagB.tags.includes(tagA)); - }); - - test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.tags.new({ tagIds: [ 2 ] }); - }, /You're instantiating a tag that has a tagIds of 2, but some of those records don't exist in the database/); - }); - - test('the parent accepts null children foreign key', function(assert) { - let tag = this.schema.tags.new({ tagIds: null }); - - assert.equal(tag.tags.models.length, 0); - assert.deepEqual(tag.tagIds, []); - assert.deepEqual(tag.attrs, { tagIds: null }); - }); - - test('the parent accepts saved children', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ tags: [ tagA ] }); - - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagB.tags.models[0], tagA); - }); - - test('the parent accepts new children', function(assert) { - let tagA = this.schema.tags.new({ color: 'Red' }); - let tagB = this.schema.tags.new({ tags: [ tagA ] }); - - assert.deepEqual(tagB.tagIds, [ undefined ]); - assert.deepEqual(tagB.tags.models[0], tagA); - }); - - test('the parent accepts null children', function(assert) { - let tag = this.schema.tags.new({ tags: null }); - - assert.equal(tag.tags.models.length, 0); - assert.deepEqual(tag.tagIds, []); - assert.deepEqual(tag.attrs, { tagIds: null }); - }); - - test('the parent accepts children and child ids', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ tags: [ tagA ], tagIds: [ tagA.id ] }); - - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagB.tags.models[0], tagA); - }); - - test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let tag = this.schema.tags.new({}); - - assert.deepEqual(tag.tagIds, []); - assert.deepEqual(tag.tags.models, []); - assert.deepEqual(tag.attrs, { tagIds: null }); - }); - - test('the parent accepts no reference to children or child ids', function(assert) { - let tag = this.schema.tags.new(); - - assert.deepEqual(tag.tagIds, []); - assert.deepEqual(tag.tags.models, []); - assert.deepEqual(tag.attrs, { tagIds: null }); - }); -}); diff --git a/tests/integration/orm/has-many/4-named-reflexive/_helper.js b/tests/integration/orm/has-many/4-named-reflexive/_helper.js deleted file mode 100644 index 1b917ceeb..000000000 --- a/tests/integration/orm/has-many/4-named-reflexive/_helper.js +++ /dev/null @@ -1,127 +0,0 @@ -import { Model, hasMany } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -/* - A model with a hasMany association can be in eight states - with respect to its association. This helper class - returns a parent (and its children) in these various states. - - The return value is an array of the form - - [ parent, [child1, child2...] ] - - where the children array may be empty. -*/ -export default class Helper { - - constructor() { - this.db = new Db(); - - this.schema = new Schema(this.db, { - tag: Model.extend({ - labels: hasMany('tag') // implicit inverse - }) - }); - } - - savedParentNoChildren() { - let tag = this.db.tags.insert({ name: 'Red' }); - - return [ this.schema.tags.find(tag.id), [] ]; - } - - savedParentNewChildren() { - let tag = this.schema.tags.create({ name: 'Red' }); - let tag1 = this.schema.tags.new({ name: 'Blue' }); - let tag2 = this.schema.tags.new({ name: 'Green' }); - - tag.labels = [ tag1, tag2 ]; - - return [ tag, [ tag1, tag2 ] ]; - } - - savedParentSavedChildren() { - let { schema } = this; - schema.db.tags.insert([ - { id: '1', name: 'Red', labelIds: ['2', '3'] }, - { id: '2', name: 'Blue', labelIds: ['1'] }, - { id: '3', name: 'Green', labelIds: ['1'] } - ]); - - return [ schema.tags.find(1), [ schema.tags.find(2), schema.tags.find(3) ] ]; - } - - savedParentMixedChildren() { - this.schema.db.tags.insert([ - { id: '1', name: 'Red', labelIds: ['2'] }, - { id: '2', name: 'Blue', labelIds: ['1'] } - ]); - let tag = this.schema.tags.find(1); - let blueTag = this.schema.tags.find(2); - let greenTag = this.schema.tags.new({ name: 'Green' }); - - tag.labels = [ blueTag, greenTag ]; - - return [ tag, [ blueTag, greenTag ] ]; - } - - newParentNoChildren() { - let tag = this.schema.tags.new({ name: 'Red' }); - - return [ tag, [] ]; - } - - newParentNewChildren() { - let tag = this.schema.tags.new({ name: 'Red' }); - let tag1 = this.schema.tags.new({ name: 'Blue' }); - let tag2 = this.schema.tags.new({ name: 'Green' }); - - tag.labels = [ tag1, tag2 ]; - - return [ tag, [ tag1, tag2 ] ]; - } - - newParentSavedChildren() { - let tag = this.schema.tags.new({ name: 'Red' }); - let tag1 = this.schema.tags.create({ name: 'Blue' }); - let tag2 = this.schema.tags.create({ name: 'Green' }); - - tag.labels = [ tag1, tag2 ]; - - return [ tag, [ tag1, tag2 ] ]; - } - - newParentMixedChildren() { - let tag = this.schema.tags.new({ name: 'Red' }); - let tag1 = this.schema.tags.create({ name: 'Blue' }); - let tag2 = this.schema.tags.new({ name: 'Green' }); - - tag.labels = [ tag1, tag2 ]; - - return [ tag, [ tag1, tag2 ] ]; - } - - // Unassociated child models, used for setting tests - savedChild() { - let insertedTag = this.db.tags.insert({ name: 'Blue' }); - - return this.schema.tags.find(insertedTag.id); - } - - newChild() { - return this.schema.tags.new({ name: 'Blue' }); - } - -} - -export const states = [ - 'savedParentNoChildren', - 'savedParentNewChildren', - 'savedParentMixedChildren', - 'savedParentSavedChildren', - 'newParentNoChildren', - 'newParentNewChildren', - 'newParentSavedChildren', - 'newParentMixedChildren' -]; diff --git a/tests/integration/orm/has-many/4-named-reflexive/accessor-test.js b/tests/integration/orm/has-many/4-named-reflexive/accessor-test.js deleted file mode 100644 index 13c66630f..000000000 --- a/tests/integration/orm/has-many/4-named-reflexive/accessor-test.js +++ /dev/null @@ -1,30 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named Reflexive | accessor', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ tag, tags ] = this.helper[state](); - - assert.equal(tag.labels.models.length, tags.length, 'the parent has the correct number of children'); - assert.equal(tag.labelIds.length, tags.length, 'the parent has the correct number of children ids'); - - tags.forEach(t => { - assert.ok(tag.labels.includes(t)); - - if (t.isSaved()) { - assert.ok(tag.labelIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); - } - - // Check the inverse - assert.ok(t.labels.includes(tag)); - }); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/4-named-reflexive/association-create-test.js b/tests/integration/orm/has-many/4-named-reflexive/association-create-test.js deleted file mode 100644 index 2a22bc255..000000000 --- a/tests/integration/orm/has-many/4-named-reflexive/association-create-test.js +++ /dev/null @@ -1,29 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named Reflexive | association #create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { - - test(`a ${state} can create an associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.labels.models.length; - - let orangeTag = tag.createLabel({ name: 'Orange' }); - - assert.ok(orangeTag.id, 'the child was persisted'); - assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.labels.includes(orangeTag), 'the model was added to tag.labels'); - assert.ok(tag.labelIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); - assert.ok(tag.attrs.labelIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); - assert.ok(orangeTag.labels.includes(tag), 'the inverse was set'); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/4-named-reflexive/association-new-test.js b/tests/integration/orm/has-many/4-named-reflexive/association-new-test.js deleted file mode 100644 index cdf76a76c..000000000 --- a/tests/integration/orm/has-many/4-named-reflexive/association-new-test.js +++ /dev/null @@ -1,35 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named Reflexive | association #new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ - - states.forEach((state) => { - - test(`a ${state} can build a new associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.labels.models.length; - - let blueTag = tag.newLabel({ name: 'Blue' }); - - assert.ok(!blueTag.id, 'the child was not persisted'); - assert.equal(tag.labels.models.length, initialCount + 1); - assert.equal(blueTag.labels.models.length, 1, 'the inverse was set'); - - blueTag.save(); - - assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', labelIds: [ tag.id ] }, 'the child was persisted'); - assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.labels.includes(blueTag), 'the model was added to tag.labels'); - assert.ok(tag.labelIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); - assert.ok(blueTag.labels.includes(tag), 'the inverse was set'); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/4-named-reflexive/association-set-ids-test.js b/tests/integration/orm/has-many/4-named-reflexive/association-set-ids-test.js deleted file mode 100644 index 237ded8c0..000000000 --- a/tests/integration/orm/has-many/4-named-reflexive/association-set-ids-test.js +++ /dev/null @@ -1,48 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named Reflexive | association #setIds', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let savedTag = this.helper.savedChild(); - - tag.labelIds = [ savedTag.id ]; - - assert.deepEqual(tag.labels.models[0].attrs, savedTag.attrs); - assert.deepEqual(tag.labelIds, [ savedTag.id ]); - - tag.save(); - savedTag.reload(); - - assert.deepEqual(savedTag.labels.models[0].attrs, tag.attrs, 'the inverse was set'); - originalTags.forEach(originalTag => { - if (originalTag.isSaved()) { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - } - }); - }); - - test(`a ${state} can clear its association via a null childIds`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - - tag.labelIds = null; - - assert.deepEqual(tag.labels.models, []); - assert.deepEqual(tag.labelIds, []); - - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/4-named-reflexive/association-set-test.js b/tests/integration/orm/has-many/4-named-reflexive/association-set-test.js deleted file mode 100644 index 5e4e2c494..000000000 --- a/tests/integration/orm/has-many/4-named-reflexive/association-set-test.js +++ /dev/null @@ -1,81 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named Reflexive | association #set', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let savedTag = this.helper.savedChild(); - - tag.labels = [ savedTag ]; - - assert.ok(tag.labels.includes(savedTag)); - assert.equal(tag.labelIds[0], savedTag.id); - assert.ok(savedTag.labels.includes(tag), 'the inverse was set'); - - tag.save(); - - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let newTag = this.helper.newChild(); - - tag.labels = [ newTag ]; - - assert.ok(tag.labels.includes(newTag)); - assert.equal(tag.labelIds[0], undefined); - assert.ok(newTag.labels.includes(tag), 'the inverse was set'); - - tag.save(); - - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); - }); - - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - - tag.labels = [ ]; - - assert.deepEqual(tag.labelIds, [ ]); - assert.equal(tag.labels.models.length, 0); - - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); - }); - - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - - tag.labels = null; - - assert.deepEqual(tag.labelIds, [ ]); - assert.equal(tag.labels.models.length, 0); - - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/4-named-reflexive/create-test.js b/tests/integration/orm/has-many/4-named-reflexive/create-test.js deleted file mode 100644 index 40e5c6dfa..000000000 --- a/tests/integration/orm/has-many/4-named-reflexive/create-test.js +++ /dev/null @@ -1,94 +0,0 @@ -import Helper from './_helper'; -import { Model } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named Reflexive | create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labelIds: [ tagA.id ] - }); - - tagA.reload(); - - assert.deepEqual(tagA.labelIds, [ tagB.id ]); - assert.deepEqual(tagB.labelIds, [ tagA.id ], 'the inverse was set'); - assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the ids were persisted'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the inverse ids were persisted'); - assert.deepEqual(tagA.labels.models[0].attrs, tagB.attrs); - assert.deepEqual(tagB.labels.models[0].attrs, tagA.attrs, 'the inverse was set'); - assert.equal(this.helper.db.tags.length, 2); - assert.deepEqual(this.helper.db.tags[0], { id: '1', labelIds: [ '2' ] }); - assert.deepEqual(this.helper.db.tags[1], { id: '2', labelIds: [ '1' ] }); - }); - - test('it sets up associations correctly when passing in an array of models', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labels: [ tagA ] - }); - - tagA.reload(); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.labelIds, [ tagB.id ], 'the inverse was set'); - assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the ids were persisted'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the inverse was set'); - assert.equal(this.helper.db.tags.length, 2); - }); - - test('it sets up associations correctly when passing in a collection', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labels: schema.tags.all() - }); - - tagA.reload(); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.labelIds, [ tagB.id ], 'the inverse was set'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the inverse was set'); - assert.equal(this.helper.db.tags.length, 2); - }); - - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.tags.create({ - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.tags.create({ - foos: [ schema.create('foo') ] - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.foos.create(); - schema.foos.create(); - - assert.throws(function() { - schema.tags.create({ - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); -}); diff --git a/tests/integration/orm/has-many/4-named-reflexive/delete-test.js b/tests/integration/orm/has-many/4-named-reflexive/delete-test.js deleted file mode 100644 index af5427909..000000000 --- a/tests/integration/orm/has-many/4-named-reflexive/delete-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named Reflexive | delete', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ tag, labels ] = this.helper[state](); - - if (labels && labels.length) { - labels.forEach(t => t.destroy()); - tag.reload(); - } - - assert.equal(tag.labels.length, 0); - assert.equal(tag.labelIds.length, 0); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/4-named-reflexive/new-test.js b/tests/integration/orm/has-many/4-named-reflexive/new-test.js deleted file mode 100644 index e5c89f2ba..000000000 --- a/tests/integration/orm/has-many/4-named-reflexive/new-test.js +++ /dev/null @@ -1,81 +0,0 @@ -import Helper from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named Reflexive | new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the parent accepts a saved child id', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ - labelIds: [ tagA.id ] - }); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.ok(tagB.labels.includes(tagA)); - }); - - test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.tags.new({ labelIds: [ 2 ] }); - }, /You're instantiating a tag that has a labelIds of 2, but some of those records don't exist in the database/); - }); - - test('the parent accepts null children foreign key', function(assert) { - let tag = this.schema.tags.new({ labelIds: null }); - - assert.equal(tag.labels.models.length, 0); - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.attrs, { labelIds: null }); - }); - - test('the parent accepts saved children', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ labels: [ tagA ] }); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagB.labels.models[0], tagA); - }); - - test('the parent accepts new children', function(assert) { - let tagA = this.schema.tags.new({ color: 'Red' }); - let tagB = this.schema.tags.new({ labels: [ tagA ] }); - - assert.deepEqual(tagB.labelIds, [ undefined ]); - assert.deepEqual(tagB.labels.models[0], tagA); - }); - - test('the parent accepts null children', function(assert) { - let tag = this.schema.tags.new({ labels: null }); - - assert.equal(tag.labels.models.length, 0); - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.attrs, { labelIds: null }); - }); - - test('the parent accepts children and child ids', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ labels: [ tagA ], labelIds: [ tagA.id ] }); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagB.labels.models[0], tagA); - }); - - test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let tag = this.schema.tags.new({}); - - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.labels.models, []); - assert.deepEqual(tag.attrs, { labelIds: null }); - }); - - test('the parent accepts no reference to children or child ids', function(assert) { - let tag = this.schema.tags.new(); - - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.labels.models, []); - assert.deepEqual(tag.attrs, { labelIds: null }); - }); -}); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/_helper.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/_helper.js deleted file mode 100644 index acd2b1710..000000000 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/_helper.js +++ /dev/null @@ -1,127 +0,0 @@ -import { Model, hasMany } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -/* - A model with a hasMany association can be in eight states - with respect to its association. This helper class - returns a parent (and its children) in these various states. - - The return value is an array of the form - - [ parent, [child1, child2...] ] - - where the children array may be empty. -*/ -export default class Helper { - - constructor() { - this.db = new Db(); - - this.schema = new Schema(this.db, { - tag: Model.extend({ - labels: hasMany('tag', { inverse: 'labels' }) // implicit inverse - }) - }); - } - - savedParentNoChildren() { - let tag = this.db.tags.insert({ name: 'Red' }); - - return [ this.schema.tags.find(tag.id), [] ]; - } - - savedParentNewChildren() { - let tag = this.schema.tags.create({ name: 'Red' }); - let tag1 = this.schema.tags.new({ name: 'Blue' }); - let tag2 = this.schema.tags.new({ name: 'Green' }); - - tag.labels = [ tag1, tag2 ]; - - return [ tag, [ tag1, tag2 ] ]; - } - - savedParentSavedChildren() { - let { schema } = this; - schema.db.tags.insert([ - { id: '1', name: 'Red', labelIds: ['2', '3'] }, - { id: '2', name: 'Blue', labelIds: ['1'] }, - { id: '3', name: 'Green', labelIds: ['1'] } - ]); - - return [ schema.tags.find(1), [ schema.tags.find(2), schema.tags.find(3) ] ]; - } - - savedParentMixedChildren() { - this.schema.db.tags.insert([ - { id: '1', name: 'Red', labelIds: ['2'] }, - { id: '2', name: 'Blue', labelIds: ['1'] } - ]); - let tag = this.schema.tags.find(1); - let blueTag = this.schema.tags.find(2); - let greenTag = this.schema.tags.new({ name: 'Green' }); - - tag.labels = [ blueTag, greenTag ]; - - return [ tag, [ blueTag, greenTag ] ]; - } - - newParentNoChildren() { - let tag = this.schema.tags.new({ name: 'Red' }); - - return [ tag, [] ]; - } - - newParentNewChildren() { - let tag = this.schema.tags.new({ name: 'Red' }); - let tag1 = this.schema.tags.new({ name: 'Blue' }); - let tag2 = this.schema.tags.new({ name: 'Green' }); - - tag.labels = [ tag1, tag2 ]; - - return [ tag, [ tag1, tag2 ] ]; - } - - newParentSavedChildren() { - let tag = this.schema.tags.new({ name: 'Red' }); - let tag1 = this.schema.tags.create({ name: 'Blue' }); - let tag2 = this.schema.tags.create({ name: 'Green' }); - - tag.labels = [ tag1, tag2 ]; - - return [ tag, [ tag1, tag2 ] ]; - } - - newParentMixedChildren() { - let tag = this.schema.tags.new({ name: 'Red' }); - let tag1 = this.schema.tags.create({ name: 'Blue' }); - let tag2 = this.schema.tags.new({ name: 'Green' }); - - tag.labels = [ tag1, tag2 ]; - - return [ tag, [ tag1, tag2 ] ]; - } - - // Unassociated child models, used for setting tests - savedChild() { - let insertedTag = this.db.tags.insert({ name: 'Blue' }); - - return this.schema.tags.find(insertedTag.id); - } - - newChild() { - return this.schema.tags.new({ name: 'Blue' }); - } - -} - -export const states = [ - 'savedParentNoChildren', - 'savedParentNewChildren', - 'savedParentMixedChildren', - 'savedParentSavedChildren', - 'newParentNoChildren', - 'newParentNewChildren', - 'newParentSavedChildren', - 'newParentMixedChildren' -]; diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/accessor-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/accessor-test.js deleted file mode 100644 index 78c942fb1..000000000 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/accessor-test.js +++ /dev/null @@ -1,30 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | accessor', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ tag, tags ] = this.helper[state](); - - assert.equal(tag.labels.models.length, tags.length, 'the parent has the correct number of children'); - assert.equal(tag.labelIds.length, tags.length, 'the parent has the correct number of children ids'); - - tags.forEach(t => { - assert.ok(tag.labels.includes(t)); - - if (t.isSaved()) { - assert.ok(tag.labelIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); - } - - // Check the inverse - assert.ok(t.labels.includes(tag)); - }); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-create-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-create-test.js deleted file mode 100644 index 465e63f90..000000000 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-create-test.js +++ /dev/null @@ -1,29 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | association #create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { - - test(`a ${state} can create an associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.labels.models.length; - - let orangeTag = tag.createLabel({ name: 'Orange' }); - - assert.ok(orangeTag.id, 'the child was persisted'); - assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.labels.includes(orangeTag), 'the model was added to tag.labels'); - assert.ok(tag.labelIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); - assert.ok(tag.attrs.labelIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); - assert.ok(orangeTag.labels.includes(tag), 'the inverse was set'); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-new-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-new-test.js deleted file mode 100644 index 3c6467c43..000000000 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-new-test.js +++ /dev/null @@ -1,35 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | association #new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ - - states.forEach((state) => { - - test(`a ${state} can build a new associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.labels.models.length; - - let blueTag = tag.newLabel({ name: 'Blue' }); - - assert.ok(!blueTag.id, 'the child was not persisted'); - assert.equal(tag.labels.models.length, initialCount + 1); - assert.equal(blueTag.labels.models.length, 1, 'the inverse was set'); - - blueTag.save(); - - assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', labelIds: [ tag.id ] }, 'the child was persisted'); - assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.labels.includes(blueTag), 'the model was added to tag.labels'); - assert.ok(tag.labelIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); - assert.ok(blueTag.labels.includes(tag), 'the inverse was set'); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-ids-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-ids-test.js deleted file mode 100644 index cd30e8d43..000000000 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-ids-test.js +++ /dev/null @@ -1,48 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | association #setIds', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let savedTag = this.helper.savedChild(); - - tag.labelIds = [ savedTag.id ]; - - assert.deepEqual(tag.labels.models[0].attrs, savedTag.attrs); - assert.deepEqual(tag.labelIds, [ savedTag.id ]); - - tag.save(); - savedTag.reload(); - - assert.deepEqual(savedTag.labels.models[0].attrs, tag.attrs, 'the inverse was set'); - originalTags.forEach(originalTag => { - if (originalTag.isSaved()) { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - } - }); - }); - - test(`a ${state} can clear its association via a null childIds`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - - tag.labelIds = null; - - assert.deepEqual(tag.labels.models, []); - assert.deepEqual(tag.labelIds, []); - - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-test.js deleted file mode 100644 index fc11b1dcc..000000000 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/association-set-test.js +++ /dev/null @@ -1,81 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | association #set', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let savedTag = this.helper.savedChild(); - - tag.labels = [ savedTag ]; - - assert.ok(tag.labels.includes(savedTag)); - assert.equal(tag.labelIds[0], savedTag.id); - assert.ok(savedTag.labels.includes(tag), 'the inverse was set'); - - tag.save(); - - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - let newTag = this.helper.newChild(); - - tag.labels = [ newTag ]; - - assert.ok(tag.labels.includes(newTag)); - assert.equal(tag.labelIds[0], undefined); - assert.ok(newTag.labels.includes(tag), 'the inverse was set'); - - tag.save(); - - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); - }); - - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - - tag.labels = [ ]; - - assert.deepEqual(tag.labelIds, [ ]); - assert.equal(tag.labels.models.length, 0); - - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); - }); - - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag, originalTags ] = this.helper[state](); - - tag.labels = null; - - assert.deepEqual(tag.labelIds, [ ]); - assert.equal(tag.labels.models.length, 0); - - tag.save(); - originalTags.forEach(originalTag => { - originalTag.reload(); - assert.notOk(originalTag.labels.includes(tag), 'old inverses were cleared'); - }); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/create-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/create-test.js deleted file mode 100644 index b98d351f1..000000000 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/create-test.js +++ /dev/null @@ -1,94 +0,0 @@ -import Helper from './_helper'; -import { Model } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labelIds: [ tagA.id ] - }); - - tagA.reload(); - - assert.deepEqual(tagA.labelIds, [ tagB.id ]); - assert.deepEqual(tagB.labelIds, [ tagA.id ], 'the inverse was set'); - assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the ids were persisted'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the inverse ids were persisted'); - assert.deepEqual(tagA.labels.models[0].attrs, tagB.attrs); - assert.deepEqual(tagB.labels.models[0].attrs, tagA.attrs, 'the inverse was set'); - assert.equal(this.helper.db.tags.length, 2); - assert.deepEqual(this.helper.db.tags[0], { id: '1', labelIds: [ '2' ] }); - assert.deepEqual(this.helper.db.tags[1], { id: '2', labelIds: [ '1' ] }); - }); - - test('it sets up associations correctly when passing in an array of models', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labels: [ tagA ] - }); - - tagA.reload(); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.labelIds, [ tagB.id ], 'the inverse was set'); - assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the ids were persisted'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the inverse was set'); - assert.equal(this.helper.db.tags.length, 2); - }); - - test('it sets up associations correctly when passing in a collection', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labels: schema.tags.all() - }); - - tagA.reload(); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.labelIds, [ tagB.id ], 'the inverse was set'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.attrs.labelIds, [ tagB.id ], 'the inverse was set'); - assert.equal(this.helper.db.tags.length, 2); - }); - - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.tags.create({ - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.tags.create({ - foos: [ schema.create('foo') ] - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.foos.create(); - schema.foos.create(); - - assert.throws(function() { - schema.tags.create({ - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); -}); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/delete-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/delete-test.js deleted file mode 100644 index 1f277205e..000000000 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/delete-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | delete', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ tag, labels ] = this.helper[state](); - - if (labels && labels.length) { - labels.forEach(t => t.destroy()); - tag.reload(); - } - - assert.equal(tag.labels.length, 0); - assert.equal(tag.labelIds.length, 0); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/new-test.js b/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/new-test.js deleted file mode 100644 index 2f739901c..000000000 --- a/tests/integration/orm/has-many/5-named-reflexive-explicit-inverse/new-test.js +++ /dev/null @@ -1,81 +0,0 @@ -import Helper from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named Reflexive Explicit Inverse | new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the parent accepts a saved child id', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ - labelIds: [ tagA.id ] - }); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.ok(tagB.labels.includes(tagA)); - }); - - test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.tags.new({ labelIds: [ 2 ] }); - }, /You're instantiating a tag that has a labelIds of 2, but some of those records don't exist in the database/); - }); - - test('the parent accepts null children foreign key', function(assert) { - let tag = this.schema.tags.new({ labelIds: null }); - - assert.equal(tag.labels.models.length, 0); - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.attrs, { labelIds: null }); - }); - - test('the parent accepts saved children', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ labels: [ tagA ] }); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagB.labels.models[0], tagA); - }); - - test('the parent accepts new children', function(assert) { - let tagA = this.schema.tags.new({ color: 'Red' }); - let tagB = this.schema.tags.new({ labels: [ tagA ] }); - - assert.deepEqual(tagB.labelIds, [ undefined ]); - assert.deepEqual(tagB.labels.models[0], tagA); - }); - - test('the parent accepts null children', function(assert) { - let tag = this.schema.tags.new({ labels: null }); - - assert.equal(tag.labels.models.length, 0); - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.attrs, { labelIds: null }); - }); - - test('the parent accepts children and child ids', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ labels: [ tagA ], labelIds: [ tagA.id ] }); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagB.labels.models[0], tagA); - }); - - test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let tag = this.schema.tags.new({}); - - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.labels.models, []); - assert.deepEqual(tag.attrs, { labelIds: null }); - }); - - test('the parent accepts no reference to children or child ids', function(assert) { - let tag = this.schema.tags.new(); - - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.labels.models, []); - assert.deepEqual(tag.attrs, { labelIds: null }); - }); -}); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/_helper.js b/tests/integration/orm/has-many/6-one-way-reflexive/_helper.js deleted file mode 100644 index a5dd69876..000000000 --- a/tests/integration/orm/has-many/6-one-way-reflexive/_helper.js +++ /dev/null @@ -1,127 +0,0 @@ -import { Model, hasMany } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -/* - A model with a hasMany association can be in eight states - with respect to its association. This helper class - returns a parent (and its children) in these various states. - - The return value is an array of the form - - [ parent, [child1, child2...] ] - - where the children array may be empty. -*/ -export default class Helper { - - constructor() { - this.db = new Db(); - - this.schema = new Schema(this.db, { - tag: Model.extend({ - tags: hasMany('tag', { inverse: null }) - }) - }); - } - - savedParentNoChildren() { - let tag = this.db.tags.insert({ name: 'Red' }); - - return [ this.schema.tags.find(tag.id), [] ]; - } - - savedParentNewChildren() { - let tag = this.schema.tags.create({ name: 'Red' }); - let tag1 = this.schema.tags.new({ name: 'Blue' }); - let tag2 = this.schema.tags.new({ name: 'Green' }); - - tag.tags = [ tag1, tag2 ]; - - return [ tag, [ tag1, tag2 ] ]; - } - - savedParentSavedChildren() { - let { schema } = this; - schema.db.tags.insert([ - { id: '1', name: 'Red', tagIds: ['2', '3'] }, - { id: '2', name: 'Blue', tagIds: [] }, - { id: '3', name: 'Green', tagIds: [] } - ]); - - return [ schema.tags.find(1), [ schema.tags.find(2), schema.tags.find(3) ] ]; - } - - savedParentMixedChildren() { - this.schema.db.tags.insert([ - { id: '1', name: 'Red', tagIds: ['2'] }, - { id: '2', name: 'Blue', tagIds: [] } - ]); - let tag = this.schema.tags.find(1); - let blueTag = this.schema.tags.find(2); - let greenTag = this.schema.tags.new({ name: 'Green' }); - - tag.tags = [ blueTag, greenTag ]; - - return [ tag, [ blueTag, greenTag ] ]; - } - - newParentNoChildren() { - let tag = this.schema.tags.new({ name: 'Red' }); - - return [ tag, [] ]; - } - - newParentNewChildren() { - let tag = this.schema.tags.new({ name: 'Red' }); - let tag1 = this.schema.tags.new({ name: 'Blue' }); - let tag2 = this.schema.tags.new({ name: 'Green' }); - - tag.tags = [ tag1, tag2 ]; - - return [ tag, [ tag1, tag2 ] ]; - } - - newParentSavedChildren() { - let tag = this.schema.tags.new({ name: 'Red' }); - let tag1 = this.schema.tags.create({ name: 'Blue' }); - let tag2 = this.schema.tags.create({ name: 'Green' }); - - tag.tags = [ tag1, tag2 ]; - - return [ tag, [ tag1, tag2 ] ]; - } - - newParentMixedChildren() { - let tag = this.schema.tags.new({ name: 'Red' }); - let tag1 = this.schema.tags.create({ name: 'Blue' }); - let tag2 = this.schema.tags.new({ name: 'Green' }); - - tag.tags = [ tag1, tag2 ]; - - return [ tag, [ tag1, tag2 ] ]; - } - - // Unassociated child models, used for setting tests - savedChild() { - let insertedTag = this.db.tags.insert({ name: 'Blue' }); - - return this.schema.tags.find(insertedTag.id); - } - - newChild() { - return this.schema.tags.new({ name: 'Blue' }); - } - -} - -export const states = [ - 'savedParentNoChildren', - 'savedParentNewChildren', - 'savedParentMixedChildren', - 'savedParentSavedChildren', - 'newParentNoChildren', - 'newParentNewChildren', - 'newParentSavedChildren', - 'newParentMixedChildren' -]; diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/accessor-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/accessor-test.js deleted file mode 100644 index 295ce2a15..000000000 --- a/tests/integration/orm/has-many/6-one-way-reflexive/accessor-test.js +++ /dev/null @@ -1,27 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | One-Way Reflexive | accessor', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ tag, tags ] = this.helper[state](); - - assert.equal(tag.tags.models.length, tags.length, 'the parent has the correct number of children'); - assert.equal(tag.tagIds.length, tags.length, 'the parent has the correct number of children ids'); - - tags.forEach(t => { - assert.ok(tag.tags.includes(t)); - - if (t.isSaved()) { - assert.ok(tag.tagIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); - } - }); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/association-create-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/association-create-test.js deleted file mode 100644 index c47933a63..000000000 --- a/tests/integration/orm/has-many/6-one-way-reflexive/association-create-test.js +++ /dev/null @@ -1,29 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | One-Way Reflexive | association #create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { - - test(`a ${state} can create an associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.tags.models.length; - - let orangeTag = tag.createTag({ name: 'Orange' }); - - assert.ok(orangeTag.id, 'the child was persisted'); - assert.equal(tag.tags.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.tags.includes(orangeTag), 'the model was added to tag.tags'); - assert.ok(tag.tagIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); - assert.ok(tag.attrs.tagIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); - assert.notOk(orangeTag.tags.includes(tag), 'the inverse was not set'); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/association-new-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/association-new-test.js deleted file mode 100644 index 5ec493c62..000000000 --- a/tests/integration/orm/has-many/6-one-way-reflexive/association-new-test.js +++ /dev/null @@ -1,35 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | One-Way Reflexive | association #new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ - - states.forEach((state) => { - - test(`a ${state} can build a new associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.tags.models.length; - - let blueTag = tag.newTag({ name: 'Blue' }); - - assert.ok(!blueTag.id, 'the child was not persisted'); - assert.equal(tag.tags.models.length, initialCount + 1); - assert.equal(blueTag.tags.models.length, 0, 'the inverse was not set'); - - blueTag.save(); - - assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', tagIds: [ ] }, 'the child was persisted'); - assert.equal(tag.tags.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.tags.includes(blueTag), 'the model was added to tag.tags'); - assert.ok(tag.tagIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); - assert.notOk(blueTag.tags.includes(tag), 'the inverse was not set'); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/association-set-ids-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/association-set-ids-test.js deleted file mode 100644 index 9a3eeb6a3..000000000 --- a/tests/integration/orm/has-many/6-one-way-reflexive/association-set-ids-test.js +++ /dev/null @@ -1,38 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | One-Way Reflexive | association #setIds', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { - let [ tag ] = this.helper[state](); - let savedTag = this.helper.savedChild(); - - tag.tagIds = [ savedTag.id ]; - - assert.deepEqual(tag.tags.models[0].attrs, savedTag.attrs); - assert.deepEqual(tag.tagIds, [ savedTag.id ]); - - tag.save(); - savedTag.reload(); - - assert.equal(savedTag.tags.models.length, 0, 'the inverse was not set'); - }); - - test(`a ${state} can clear its association via a null childIds`, function(assert) { - let [ tag ] = this.helper[state](); - - tag.tagIds = null; - - assert.deepEqual(tag.tags.models, []); - assert.deepEqual(tag.tagIds, []); - - tag.save(); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/association-set-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/association-set-test.js deleted file mode 100644 index 8955cbed9..000000000 --- a/tests/integration/orm/has-many/6-one-way-reflexive/association-set-test.js +++ /dev/null @@ -1,63 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | One-Way Reflexive | association #set', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ tag ] = this.helper[state](); - let savedTag = this.helper.savedChild(); - - tag.tags = [ savedTag ]; - - assert.ok(tag.tags.includes(savedTag)); - assert.equal(tag.tagIds[0], savedTag.id); - assert.notOk(savedTag.tags.includes(tag), 'the inverse was not set'); - - tag.save(); - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ tag ] = this.helper[state](); - let newTag = this.helper.newChild(); - - tag.tags = [ newTag ]; - - assert.ok(tag.tags.includes(newTag)); - assert.equal(tag.tagIds[0], undefined); - assert.notOk(newTag.tags.includes(tag), 'the inverse was not set'); - - tag.save(); - }); - - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag ] = this.helper[state](); - - tag.tags = [ ]; - - assert.deepEqual(tag.tagIds, [ ]); - assert.equal(tag.tags.models.length, 0); - - tag.save(); - }); - - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag ] = this.helper[state](); - - tag.tags = null; - - assert.deepEqual(tag.tagIds, [ ]); - assert.equal(tag.tags.models.length, 0); - - tag.save(); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/create-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/create-test.js deleted file mode 100644 index 1d0360863..000000000 --- a/tests/integration/orm/has-many/6-one-way-reflexive/create-test.js +++ /dev/null @@ -1,92 +0,0 @@ -import Helper from './_helper'; -import { Model } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | One-Way Reflexive | create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - tagIds: [ tagA.id ] - }); - - tagA.reload(); - - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagA.tagIds, [ ], 'the inverse was not set'); - assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ], 'the ids were persisted'); - assert.deepEqual(tagB.tags.models[0].attrs, tagA.attrs); - assert.equal(this.helper.db.tags.length, 2); - assert.deepEqual(this.helper.db.tags[0], { id: '1', tagIds: null }); - assert.deepEqual(this.helper.db.tags[1], { id: '2', tagIds: [ '1' ] }); - }); - - test('it sets up associations correctly when passing in an array of models', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - tags: [ tagA ] - }); - - tagA.reload(); - - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagA.tagIds, [ ], 'the inverse was not set'); - assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ], 'the ids were persisted'); - assert.deepEqual(tagA.attrs.tagIds, null, 'the inverse was not set'); - assert.equal(this.helper.db.tags.length, 2); - }); - - test('it sets up associations correctly when passing in a collection', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - tags: schema.tags.all() - }); - - tagA.reload(); - - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagA.tagIds, [ ], 'the inverse was not set'); - assert.deepEqual(tagB.attrs.tagIds, [ tagA.id ]); - assert.deepEqual(tagA.attrs.tagIds, null, 'the inverse was not set'); - assert.equal(this.helper.db.tags.length, 2); - }); - - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.tags.create({ - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.tags.create({ - foos: [ schema.create('foo') ] - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.foos.create(); - schema.foos.create(); - - assert.throws(function() { - schema.tags.create({ - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); -}); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/delete-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/delete-test.js deleted file mode 100644 index fbd7a9968..000000000 --- a/tests/integration/orm/has-many/6-one-way-reflexive/delete-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | One-Way Reflexive | delete', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ tag, tags ] = this.helper[state](); - - if (tags && tags.length) { - tags.forEach(t => t.destroy()); - tag.reload(); - } - - assert.equal(tag.tags.length, 0); - assert.equal(tag.tagIds.length, 0); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/6-one-way-reflexive/new-test.js b/tests/integration/orm/has-many/6-one-way-reflexive/new-test.js deleted file mode 100644 index f0c1c7db1..000000000 --- a/tests/integration/orm/has-many/6-one-way-reflexive/new-test.js +++ /dev/null @@ -1,81 +0,0 @@ -import Helper from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | One-Way Reflexive | new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the parent accepts a saved child id', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ - tagIds: [ tagA.id ] - }); - - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.ok(tagB.tags.includes(tagA)); - }); - - test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.tags.new({ tagIds: [ 2 ] }); - }, /You're instantiating a tag that has a tagIds of 2, but some of those records don't exist in the database/); - }); - - test('the parent accepts null children foreign key', function(assert) { - let tag = this.schema.tags.new({ tagIds: null }); - - assert.equal(tag.tags.models.length, 0); - assert.deepEqual(tag.tagIds, []); - assert.deepEqual(tag.attrs, { tagIds: null }); - }); - - test('the parent accepts saved children', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ tags: [ tagA ] }); - - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagB.tags.models[0], tagA); - }); - - test('the parent accepts new children', function(assert) { - let tagA = this.schema.tags.new({ color: 'Red' }); - let tagB = this.schema.tags.new({ tags: [ tagA ] }); - - assert.deepEqual(tagB.tagIds, [ undefined ]); - assert.deepEqual(tagB.tags.models[0], tagA); - }); - - test('the parent accepts null children', function(assert) { - let tag = this.schema.tags.new({ tags: null }); - - assert.equal(tag.tags.models.length, 0); - assert.deepEqual(tag.tagIds, []); - assert.deepEqual(tag.attrs, { tagIds: null }); - }); - - test('the parent accepts children and child ids', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ tags: [ tagA ], tagIds: [ tagA.id ] }); - - assert.deepEqual(tagB.tagIds, [ tagA.id ]); - assert.deepEqual(tagB.tags.models[0], tagA); - }); - - test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let tag = this.schema.tags.new({}); - - assert.deepEqual(tag.tagIds, []); - assert.deepEqual(tag.tags.models, []); - assert.deepEqual(tag.attrs, { tagIds: null }); - }); - - test('the parent accepts no reference to children or child ids', function(assert) { - let tag = this.schema.tags.new(); - - assert.deepEqual(tag.tagIds, []); - assert.deepEqual(tag.tags.models, []); - assert.deepEqual(tag.attrs, { tagIds: null }); - }); -}); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/_helper.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/_helper.js deleted file mode 100644 index bd80e643c..000000000 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/_helper.js +++ /dev/null @@ -1,127 +0,0 @@ -import { Model, hasMany } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -/* - A model with a hasMany association can be in eight states - with respect to its association. This helper class - returns a parent (and its children) in these various states. - - The return value is an array of the form - - [ parent, [child1, child2...] ] - - where the children array may be empty. -*/ -export default class Helper { - - constructor() { - this.db = new Db(); - - this.schema = new Schema(this.db, { - tag: Model.extend({ - labels: hasMany('tag', { inverse: null }) - }) - }); - } - - savedParentNoChildren() { - let tag = this.db.tags.insert({ name: 'Red' }); - - return [ this.schema.tags.find(tag.id), [] ]; - } - - savedParentNewChildren() { - let tag = this.schema.tags.create({ name: 'Red' }); - let tag1 = this.schema.tags.new({ name: 'Blue' }); - let tag2 = this.schema.tags.new({ name: 'Green' }); - - tag.labels = [ tag1, tag2 ]; - - return [ tag, [ tag1, tag2 ] ]; - } - - savedParentSavedChildren() { - let { schema } = this; - schema.db.tags.insert([ - { id: '1', name: 'Red', labelIds: ['2', '3'] }, - { id: '2', name: 'Blue', labelIds: [] }, - { id: '3', name: 'Green', labelIds: [] } - ]); - - return [ schema.tags.find(1), [ schema.tags.find(2), schema.tags.find(3) ] ]; - } - - savedParentMixedChildren() { - this.schema.db.tags.insert([ - { id: '1', name: 'Red', labelIds: ['2'] }, - { id: '2', name: 'Blue', labelIds: [] } - ]); - let tag = this.schema.tags.find(1); - let blueTag = this.schema.tags.find(2); - let greenTag = this.schema.tags.new({ name: 'Green' }); - - tag.labels = [ blueTag, greenTag ]; - - return [ tag, [ blueTag, greenTag ] ]; - } - - newParentNoChildren() { - let tag = this.schema.tags.new({ name: 'Red' }); - - return [ tag, [] ]; - } - - newParentNewChildren() { - let tag = this.schema.tags.new({ name: 'Red' }); - let tag1 = this.schema.tags.new({ name: 'Blue' }); - let tag2 = this.schema.tags.new({ name: 'Green' }); - - tag.labels = [ tag1, tag2 ]; - - return [ tag, [ tag1, tag2 ] ]; - } - - newParentSavedChildren() { - let tag = this.schema.tags.new({ name: 'Red' }); - let tag1 = this.schema.tags.create({ name: 'Blue' }); - let tag2 = this.schema.tags.create({ name: 'Green' }); - - tag.labels = [ tag1, tag2 ]; - - return [ tag, [ tag1, tag2 ] ]; - } - - newParentMixedChildren() { - let tag = this.schema.tags.new({ name: 'Red' }); - let tag1 = this.schema.tags.create({ name: 'Blue' }); - let tag2 = this.schema.tags.new({ name: 'Green' }); - - tag.labels = [ tag1, tag2 ]; - - return [ tag, [ tag1, tag2 ] ]; - } - - // Unassociated child models, used for setting tests - savedChild() { - let insertedTag = this.db.tags.insert({ name: 'Blue' }); - - return this.schema.tags.find(insertedTag.id); - } - - newChild() { - return this.schema.tags.new({ name: 'Blue' }); - } - -} - -export const states = [ - 'savedParentNoChildren', - 'savedParentNewChildren', - 'savedParentMixedChildren', - 'savedParentSavedChildren', - 'newParentNoChildren', - 'newParentNewChildren', - 'newParentSavedChildren', - 'newParentMixedChildren' -]; diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/accessor-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/accessor-test.js deleted file mode 100644 index d9d4cc3ce..000000000 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/accessor-test.js +++ /dev/null @@ -1,27 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named One-Way Reflexive | accessor', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ tag, tags ] = this.helper[state](); - - assert.equal(tag.labels.models.length, tags.length, 'the parent has the correct number of children'); - assert.equal(tag.labelIds.length, tags.length, 'the parent has the correct number of children ids'); - - tags.forEach(t => { - assert.ok(tag.labels.includes(t)); - - if (t.isSaved()) { - assert.ok(tag.labelIds.indexOf(t.id) > -1, 'each saved child id is in parent.childrenIds array'); - } - }); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-create-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-create-test.js deleted file mode 100644 index e9fff42b4..000000000 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-create-test.js +++ /dev/null @@ -1,29 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named One-Way Reflexive | association #create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { - - test(`a ${state} can create an associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.labels.models.length; - - let orangeTag = tag.createLabel({ name: 'Orange' }); - - assert.ok(orangeTag.id, 'the child was persisted'); - assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.labels.includes(orangeTag), 'the model was added to tag.labels'); - assert.ok(tag.labelIds.indexOf(orangeTag.id) > -1, 'the id was added to the fks array'); - assert.ok(tag.attrs.labelIds.indexOf(orangeTag.id) > -1, 'fks were persisted'); - assert.notOk(orangeTag.labels.includes(tag), 'the inverse was not set'); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-new-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-new-test.js deleted file mode 100644 index 67733eb24..000000000 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-new-test.js +++ /dev/null @@ -1,35 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named One-Way Reflexive | association #new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ - - states.forEach((state) => { - - test(`a ${state} can build a new associated child`, function(assert) { - let [ tag ] = this.helper[state](); - let initialCount = tag.labels.models.length; - - let blueTag = tag.newLabel({ name: 'Blue' }); - - assert.ok(!blueTag.id, 'the child was not persisted'); - assert.equal(tag.labels.models.length, initialCount + 1); - assert.equal(blueTag.labels.models.length, 0, 'the inverse was not set'); - - blueTag.save(); - - assert.deepEqual(blueTag.attrs, { id: blueTag.id, name: 'Blue', labelIds: [ ] }, 'the child was persisted'); - assert.equal(tag.labels.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(tag.labels.includes(blueTag), 'the model was added to tag.labels'); - assert.ok(tag.labelIds.indexOf(blueTag.id) > -1, 'the id was added to the fks array'); - assert.notOk(blueTag.labels.includes(tag), 'the inverse was not set'); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-ids-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-ids-test.js deleted file mode 100644 index d207dca42..000000000 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-ids-test.js +++ /dev/null @@ -1,38 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named One-Way Reflexive | association #setIds', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { - let [ tag ] = this.helper[state](); - let savedTag = this.helper.savedChild(); - - tag.labelIds = [ savedTag.id ]; - - assert.deepEqual(tag.labels.models[0].attrs, savedTag.attrs); - assert.deepEqual(tag.labelIds, [ savedTag.id ]); - - tag.save(); - savedTag.reload(); - - assert.equal(savedTag.labels.models.length, 0, 'the inverse was not set'); - }); - - test(`a ${state} can clear its association via a null childIds`, function(assert) { - let [ tag ] = this.helper[state](); - - tag.labelIds = null; - - assert.deepEqual(tag.labels.models, []); - assert.deepEqual(tag.labelIds, []); - - tag.save(); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-test.js deleted file mode 100644 index 6fa110d3a..000000000 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/association-set-test.js +++ /dev/null @@ -1,63 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named One-Way Reflexive | association #set', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ tag ] = this.helper[state](); - let savedTag = this.helper.savedChild(); - - tag.labels = [ savedTag ]; - - assert.ok(tag.labels.includes(savedTag)); - assert.equal(tag.labelIds[0], savedTag.id); - assert.notOk(savedTag.labels.includes(tag), 'the inverse was not set'); - - tag.save(); - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ tag ] = this.helper[state](); - let newTag = this.helper.newChild(); - - tag.labels = [ newTag ]; - - assert.ok(tag.labels.includes(newTag)); - assert.equal(tag.labelIds[0], undefined); - assert.notOk(newTag.labels.includes(tag), 'the inverse was not set'); - - tag.save(); - }); - - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag ] = this.helper[state](); - - tag.labels = [ ]; - - assert.deepEqual(tag.labelIds, [ ]); - assert.equal(tag.labels.models.length, 0); - - tag.save(); - }); - - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ tag ] = this.helper[state](); - - tag.labels = null; - - assert.deepEqual(tag.labelIds, [ ]); - assert.equal(tag.labels.models.length, 0); - - tag.save(); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/create-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/create-test.js deleted file mode 100644 index 84f92e013..000000000 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/create-test.js +++ /dev/null @@ -1,92 +0,0 @@ -import Helper from './_helper'; -import { Model } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named One-Way Reflexive | create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labelIds: [ tagA.id ] - }); - - tagA.reload(); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.labelIds, [ ], 'the inverse was not set'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the ids were persisted'); - assert.deepEqual(tagB.labels.models[0].attrs, tagA.attrs); - assert.equal(this.helper.db.tags.length, 2); - assert.deepEqual(this.helper.db.tags[0], { id: '1', labelIds: null }); - assert.deepEqual(this.helper.db.tags[1], { id: '2', labelIds: [ '1' ] }); - }); - - test('it sets up associations correctly when passing in an array of models', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labels: [ tagA ] - }); - - tagA.reload(); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.labelIds, [ ], 'the inverse was not set'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ], 'the ids were persisted'); - assert.deepEqual(tagA.attrs.labelIds, null, 'the inverse was not set'); - assert.equal(this.helper.db.tags.length, 2); - }); - - test('it sets up associations correctly when passing in a collection', function(assert) { - let { schema } = this.helper; - let tagA = schema.tags.create(); - let tagB = schema.tags.create({ - labels: schema.tags.all() - }); - - tagA.reload(); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.labelIds, [ ], 'the inverse was not set'); - assert.deepEqual(tagB.attrs.labelIds, [ tagA.id ]); - assert.deepEqual(tagA.attrs.labelIds, null, 'the inverse was not set'); - assert.equal(this.helper.db.tags.length, 2); - }); - - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.tags.create({ - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.tags.create({ - foos: [ schema.create('foo') ] - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.foos.create(); - schema.foos.create(); - - assert.throws(function() { - schema.tags.create({ - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); -}); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/delete-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/delete-test.js deleted file mode 100644 index 267c6b752..000000000 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/delete-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named One-Way Reflexive | delete', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ tag, labels ] = this.helper[state](); - - if (labels && labels.length) { - labels.forEach(t => t.destroy()); - tag.reload(); - } - - assert.equal(tag.labels.length, 0); - assert.equal(tag.labelIds.length, 0); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/7-named-one-way-reflexive/new-test.js b/tests/integration/orm/has-many/7-named-one-way-reflexive/new-test.js deleted file mode 100644 index 1472b13cb..000000000 --- a/tests/integration/orm/has-many/7-named-one-way-reflexive/new-test.js +++ /dev/null @@ -1,81 +0,0 @@ -import Helper from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Named One-Way Reflexive | new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the parent accepts a saved child id', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ - labelIds: [ tagA.id ] - }); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.ok(tagB.labels.includes(tagA)); - }); - - test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.tags.new({ labelIds: [ 2 ] }); - }, /You're instantiating a tag that has a labelIds of 2, but some of those records don't exist in the database/); - }); - - test('the parent accepts null children foreign key', function(assert) { - let tag = this.schema.tags.new({ labelIds: null }); - - assert.equal(tag.labels.models.length, 0); - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.attrs, { labelIds: null }); - }); - - test('the parent accepts saved children', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ labels: [ tagA ] }); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagB.labels.models[0], tagA); - }); - - test('the parent accepts new children', function(assert) { - let tagA = this.schema.tags.new({ color: 'Red' }); - let tagB = this.schema.tags.new({ labels: [ tagA ] }); - - assert.deepEqual(tagB.labelIds, [ undefined ]); - assert.deepEqual(tagB.labels.models[0], tagA); - }); - - test('the parent accepts null children', function(assert) { - let tag = this.schema.tags.new({ labels: null }); - - assert.equal(tag.labels.models.length, 0); - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.attrs, { labelIds: null }); - }); - - test('the parent accepts children and child ids', function(assert) { - let tagA = this.helper.savedChild(); - let tagB = this.schema.tags.new({ labels: [ tagA ], labelIds: [ tagA.id ] }); - - assert.deepEqual(tagB.labelIds, [ tagA.id ]); - assert.deepEqual(tagB.labels.models[0], tagA); - }); - - test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let tag = this.schema.tags.new({}); - - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.labels.models, []); - assert.deepEqual(tag.attrs, { labelIds: null }); - }); - - test('the parent accepts no reference to children or child ids', function(assert) { - let tag = this.schema.tags.new(); - - assert.deepEqual(tag.labelIds, []); - assert.deepEqual(tag.labels.models, []); - assert.deepEqual(tag.attrs, { labelIds: null }); - }); -}); diff --git a/tests/integration/orm/has-many/8-many-to-many/_helper.js b/tests/integration/orm/has-many/8-many-to-many/_helper.js deleted file mode 100644 index a90bad32c..000000000 --- a/tests/integration/orm/has-many/8-many-to-many/_helper.js +++ /dev/null @@ -1,135 +0,0 @@ -import { Model, hasMany } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -/* - A model with a hasMany association can be in eight states - with respect to its association. This helper class - returns a parent (and its children) in these various states. - - The return value is an array of the form - - [ parent, [child1, child2...] ] - - where the children array may be empty. -*/ -export default class Helper { - - constructor() { - this.db = new Db(); - - // implicit inverse - this.schema = new Schema(this.db, { - order: Model.extend({ - products: hasMany() - }), - product: Model.extend({ - orders: hasMany() - }) - }); - } - - savedParentNoChildren() { - let order = this.db.orders.insert({ name: 'Red' }); - - return [ this.schema.orders.find(order.id), [] ]; - } - - savedParentNewChildren() { - let order = this.schema.orders.create({ name: 'Red' }); - let product1 = this.schema.products.new({ name: 'Blue' }); - let product2 = this.schema.products.new({ name: 'Green' }); - - order.products = [ product1, product2 ]; - - return [ order, [ product1, product2 ] ]; - } - - savedParentSavedChildren() { - let { schema } = this; - schema.db.orders.insert([ - { id: '1', name: 'Red', productIds: ['2', '3'] } - ]); - schema.db.products.insert([ - { id: '2', name: 'Blue', orderIds: ['1'] }, - { id: '3', name: 'Green', orderIds: ['1'] } - ]); - - return [ schema.orders.find(1), [ schema.products.find(2), schema.products.find(3) ] ]; - } - - savedParentMixedChildren() { - this.schema.db.orders.insert([ - { id: '1', name: 'Red', productIds: ['2'] } - ]); - this.schema.db.products.insert([ - { id: '2', name: 'Blue', orderIds: ['1'] } - ]); - let order = this.schema.orders.find(1); - let product1 = this.schema.products.find(2); - let product2 = this.schema.products.new({ name: 'Green' }); - - order.products = [ product1, product2 ]; - - return [ order, [ product1, product2 ] ]; - } - - newParentNoChildren() { - let order = this.schema.orders.new({ name: 'Red' }); - - return [ order, [] ]; - } - - newParentNewChildren() { - let order = this.schema.orders.new({ name: 'Red' }); - let product1 = this.schema.products.new({ name: 'Blue' }); - let product2 = this.schema.products.new({ name: 'Green' }); - - order.products = [ product1, product2 ]; - - return [ order, [ product1, product2 ] ]; - } - - newParentSavedChildren() { - let order = this.schema.orders.new({ name: 'Red' }); - let product1 = this.schema.products.create({ name: 'Blue' }); - let product2 = this.schema.products.create({ name: 'Green' }); - - order.products = [ product1, product2 ]; - - return [ order, [ product1, product2 ] ]; - } - - newParentMixedChildren() { - let order = this.schema.orders.new({ name: 'Red' }); - let product1 = this.schema.products.create({ name: 'Blue' }); - let product2 = this.schema.products.new({ name: 'Green' }); - - order.products = [ product1, product2 ]; - - return [ order, [ product1, product2 ] ]; - } - - // Unassociated child models, used for setting tests - savedChild() { - let insertedProduct = this.db.products.insert({ name: 'Blue' }); - - return this.schema.products.find(insertedProduct.id); - } - - newChild() { - return this.schema.products.new({ name: 'Blue' }); - } - -} - -export const states = [ - 'savedParentNoChildren', - 'savedParentNewChildren', - 'savedParentMixedChildren', - 'savedParentSavedChildren', - 'newParentNoChildren', - 'newParentNewChildren', - 'newParentSavedChildren', - 'newParentMixedChildren' -]; diff --git a/tests/integration/orm/has-many/8-many-to-many/accessor-test.js b/tests/integration/orm/has-many/8-many-to-many/accessor-test.js deleted file mode 100644 index 3f12c66c4..000000000 --- a/tests/integration/orm/has-many/8-many-to-many/accessor-test.js +++ /dev/null @@ -1,30 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Many to Many | accessor', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ order, products ] = this.helper[state](); - - assert.equal(order.products.models.length, products.length, 'the parent has the correct number of children'); - assert.equal(order.productIds.length, products.length, 'the parent has the correct number of children ids'); - - products.forEach(p => { - assert.ok(order.products.includes(p)); - - if (p.isSaved()) { - assert.ok(order.productIds.indexOf(p.id) > -1, 'each saved child id is in parent.childrenIds array'); - } - - // Check the inverse - assert.ok(p.orders.includes(order)); - }); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/8-many-to-many/association-create-test.js b/tests/integration/orm/has-many/8-many-to-many/association-create-test.js deleted file mode 100644 index 7cffd3fcd..000000000 --- a/tests/integration/orm/has-many/8-many-to-many/association-create-test.js +++ /dev/null @@ -1,29 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Many to Many | association #create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { - - test(`a ${state} can create an associated child`, function(assert) { - let [ order ] = this.helper[state](); - let initialCount = order.products.models.length; - - let orangeProduct = order.createProduct({ name: 'Orange' }); - - assert.ok(orangeProduct.id, 'the child was persisted'); - assert.equal(order.products.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(order.products.includes(orangeProduct), 'the model was added to order.products'); - assert.ok(order.productIds.indexOf(orangeProduct.id) > -1, 'the id was added to the fks array'); - assert.ok(order.attrs.productIds.indexOf(orangeProduct.id) > -1, 'fks were persisted'); - assert.ok(orangeProduct.orders.includes(order), 'the inverse was set'); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/8-many-to-many/association-new-test.js b/tests/integration/orm/has-many/8-many-to-many/association-new-test.js deleted file mode 100644 index 12ffd4f32..000000000 --- a/tests/integration/orm/has-many/8-many-to-many/association-new-test.js +++ /dev/null @@ -1,35 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Many to Many | association #new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ - - states.forEach((state) => { - - test(`a ${state} can build a new associated child`, function(assert) { - let [ order ] = this.helper[state](); - let initialCount = order.products.models.length; - - let blueProduct = order.newProduct({ name: 'Blue' }); - - assert.ok(!blueProduct.id, 'the child was not persisted'); - assert.equal(order.products.models.length, initialCount + 1); - assert.equal(blueProduct.orders.models.length, 1, 'the inverse was set'); - - blueProduct.save(); - - assert.deepEqual(blueProduct.attrs, { id: blueProduct.id, name: 'Blue', orderIds: [ order.id ] }, 'the child was persisted'); - assert.equal(order.products.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(order.products.includes(blueProduct), 'the model was added to order.products'); - assert.ok(order.productIds.indexOf(blueProduct.id) > -1, 'the id was added to the fks array'); - assert.ok(blueProduct.orders.includes(order), 'the inverse was set'); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/8-many-to-many/association-set-ids-test.js b/tests/integration/orm/has-many/8-many-to-many/association-set-ids-test.js deleted file mode 100644 index a81ac6254..000000000 --- a/tests/integration/orm/has-many/8-many-to-many/association-set-ids-test.js +++ /dev/null @@ -1,49 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Many to Many | association #setIds', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`a ${state} can update its association to include a saved child via childIds`, function(assert) { - let [ order, originalProducts ] = this.helper[state](); - let savedProduct = this.helper.savedChild(); - - order.productIds = [ savedProduct.id ]; - - assert.deepEqual(order.products.models[0].attrs, savedProduct.attrs); - assert.deepEqual(order.productIds, [ savedProduct.id ]); - - order.save(); - savedProduct.reload(); - - assert.deepEqual(savedProduct.orders.models[0].attrs, order.attrs, 'the inverse was set'); - originalProducts.forEach(p => { - if (p.isSaved()) { - p.reload(); - assert.notOk(p.orders.includes(order), 'old inverses were cleared'); - } - }); - }); - - test(`a ${state} can clear its association via a null childIds`, function(assert) { - let [ order, originalProducts ] = this.helper[state](); - - order.productIds = null; - - assert.deepEqual(order.products.models, []); - assert.deepEqual(order.productIds, []); - - order.save(); - - originalProducts.forEach(p => { - p.reload(); - assert.notOk(p.orders.includes(order), 'old inverses were cleared'); - }); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/8-many-to-many/association-set-test.js b/tests/integration/orm/has-many/8-many-to-many/association-set-test.js deleted file mode 100644 index 5344530ea..000000000 --- a/tests/integration/orm/has-many/8-many-to-many/association-set-test.js +++ /dev/null @@ -1,82 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Many to Many | association #set', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ order, originalProducts ] = this.helper[state](); - let savedProduct = this.helper.savedChild(); - - order.products = [ savedProduct ]; - - assert.ok(order.products.includes(savedProduct)); - assert.equal(order.productIds[0], savedProduct.id); - assert.ok(savedProduct.orders.includes(order), 'the inverse was set'); - - order.save(); - - originalProducts.forEach(p => { - p.reload(); - assert.notOk(p.orders.includes(order), 'old inverses were cleared'); - }); - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ order, originalProducts ] = this.helper[state](); - let newProduct = this.helper.newChild(); - - order.products = [ newProduct ]; - - assert.ok(order.products.includes(newProduct)); - assert.equal(order.productIds[0], undefined); - assert.ok(newProduct.orders.includes(order), 'the inverse was set'); - - order.save(); - - originalProducts.forEach(p => { - p.reload(); - assert.notOk(p.orders.includes(order), 'old inverses were cleared'); - }); - }); - - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ order, originalProducts ] = this.helper[state](); - - order.products = [ ]; - - assert.deepEqual(order.productIds, [ ]); - assert.equal(order.products.models.length, 0); - - order.save(); - originalProducts.forEach(p => { - p.reload(); - assert.notOk(p.orders.includes(order), 'old inverses were cleared'); - }); - }); - - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ order, originalProducts ] = this.helper[state](); - - order.products = null; - - assert.deepEqual(order.productIds, [ ]); - assert.equal(order.products.models.length, 0); - - order.save(); - - originalProducts.forEach(p => { - p.reload(); - assert.notOk(p.orders.includes(order), 'old inverses were cleared'); - }); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/8-many-to-many/create-test.js b/tests/integration/orm/has-many/8-many-to-many/create-test.js deleted file mode 100644 index 1fbf55f09..000000000 --- a/tests/integration/orm/has-many/8-many-to-many/create-test.js +++ /dev/null @@ -1,97 +0,0 @@ -import Helper from './_helper'; -import { Model } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Many to Many | create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let product = schema.products.create(); - let order = schema.orders.create({ - productIds: [ product.id ] - }); - - product.reload(); - - assert.deepEqual(order.productIds, [ product.id ]); - assert.deepEqual(product.orderIds, [ order.id ], 'the inverse was set'); - assert.deepEqual(order.attrs.productIds, [ product.id ], 'the ids were persisted'); - assert.deepEqual(product.attrs.orderIds, [ order.id ], 'the inverse ids were persisted'); - assert.deepEqual(order.products.models[0].attrs, product.attrs); - assert.deepEqual(product.orders.models[0].attrs, order.attrs, 'the inverse was set'); - assert.equal(this.helper.db.orders.length, 1); - assert.equal(this.helper.db.products.length, 1); - assert.deepEqual(this.helper.db.orders[0], { id: '1', productIds: [ '1' ] }); - assert.deepEqual(this.helper.db.products[0], { id: '1', orderIds: [ '1' ] }); - }); - - test('it sets up associations correctly when passing in an array of models', function(assert) { - let { schema } = this.helper; - let product = schema.products.create(); - let order = schema.orders.create({ - products: [ product ] - }); - - product.reload(); - - assert.deepEqual(order.productIds, [ product.id ]); - assert.deepEqual(product.orderIds, [ order.id ], 'the inverse was set'); - assert.deepEqual(order.attrs.productIds, [ product.id ], 'the ids were persisted'); - assert.deepEqual(product.attrs.orderIds, [ order.id ], 'the inverse was set'); - assert.equal(this.helper.db.orders.length, 1); - assert.equal(this.helper.db.products.length, 1); - }); - - test('it sets up associations correctly when passing in a collection', function(assert) { - let { schema } = this.helper; - let product = schema.products.create(); - let order = schema.orders.create({ - products: schema.products.all() - }); - - product.reload(); - - assert.deepEqual(order.productIds, [ product.id ]); - assert.deepEqual(product.orderIds, [ order.id ], 'the inverse was set'); - assert.deepEqual(order.attrs.productIds, [ product.id ]); - assert.deepEqual(product.attrs.orderIds, [ order.id ], 'the inverse was set'); - assert.equal(this.helper.db.orders.length, 1); - assert.equal(this.helper.db.products.length, 1); - }); - - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.orders.create({ - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.orders.create({ - foos: [ schema.create('foo') ] - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.foos.create(); - schema.foos.create(); - - assert.throws(function() { - schema.orders.create({ - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); -}); diff --git a/tests/integration/orm/has-many/8-many-to-many/delete-test.js b/tests/integration/orm/has-many/8-many-to-many/delete-test.js deleted file mode 100644 index 463c27125..000000000 --- a/tests/integration/orm/has-many/8-many-to-many/delete-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Many to Many | delete', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ order, products ] = this.helper[state](); - - if (products && products.length) { - products.forEach(t => t.destroy()); - order.reload(); - } - - assert.equal(order.products.length, 0); - assert.equal(order.productIds.length, 0); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/8-many-to-many/new-test.js b/tests/integration/orm/has-many/8-many-to-many/new-test.js deleted file mode 100644 index 78ca6f8b1..000000000 --- a/tests/integration/orm/has-many/8-many-to-many/new-test.js +++ /dev/null @@ -1,81 +0,0 @@ -import Helper from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | Many to Many | new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the parent accepts a saved child id', function(assert) { - let product = this.helper.savedChild(); - let order = this.schema.orders.new({ - productIds: [ product.id ] - }); - - assert.deepEqual(order.productIds, [ product.id ]); - assert.ok(order.products.includes(product)); - }); - - test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.orders.new({ productIds: [ 2 ] }); - }, /You're instantiating a order that has a productIds of 2, but some of those records don't exist in the database/); - }); - - test('the parent accepts null children foreign key', function(assert) { - let order = this.schema.orders.new({ productIds: null }); - - assert.equal(order.products.models.length, 0); - assert.deepEqual(order.productIds, []); - assert.deepEqual(order.attrs, { productIds: null }); - }); - - test('the parent accepts saved children', function(assert) { - let product = this.helper.savedChild(); - let order = this.schema.orders.new({ products: [ product ] }); - - assert.deepEqual(order.productIds, [ product.id ]); - assert.deepEqual(order.products.models[0], product); - }); - - test('the parent accepts new children', function(assert) { - let product = this.schema.products.new({ color: 'Red' }); - let order = this.schema.orders.new({ products: [ product ] }); - - assert.deepEqual(order.productIds, [ undefined ]); - assert.deepEqual(order.products.models[0], product); - }); - - test('the parent accepts null children', function(assert) { - let order = this.schema.orders.new({ products: null }); - - assert.equal(order.products.models.length, 0); - assert.deepEqual(order.productIds, []); - assert.deepEqual(order.attrs, { productIds: null }); - }); - - test('the parent accepts children and child ids', function(assert) { - let product = this.helper.savedChild(); - let order = this.schema.orders.new({ products: [ product ], productIds: [ product.id ] }); - - assert.deepEqual(order.productIds, [ product.id ]); - assert.deepEqual(order.products.models[0], product); - }); - - test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let order = this.schema.orders.new({}); - - assert.deepEqual(order.productIds, []); - assert.deepEqual(order.products.models, []); - assert.deepEqual(order.attrs, { productIds: null }); - }); - - test('the parent accepts no reference to children or child ids', function(assert) { - let order = this.schema.orders.new(); - - assert.deepEqual(order.productIds, []); - assert.deepEqual(order.products.models, []); - assert.deepEqual(order.attrs, { productIds: null }); - }); -}); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/_helper.js b/tests/integration/orm/has-many/9-one-way-polymorphic/_helper.js deleted file mode 100644 index 3330b7e7b..000000000 --- a/tests/integration/orm/has-many/9-one-way-polymorphic/_helper.js +++ /dev/null @@ -1,124 +0,0 @@ -import { Model, hasMany } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -/* - A model with a hasMany association can be in eight states - with respect to its association. This helper class - returns a parent (and its children) in these various states. - - The return value is an array of the form - - [ parent, [child1, child2...] ] - - where the children array may be empty. -*/ -export default class Helper { - - constructor() { - this.db = new Db(); - - this.schema = new Schema(this.db, { - user: Model.extend({ - things: hasMany('thing', { polymorphic: true }) - }), - post: Model - }); - } - - savedParentNoChildren() { - let user = this.db.users.insert({ name: 'Link' }); - - return [ this.schema.users.find(user.id), [] ]; - } - - savedParentNewChildren() { - let user = this.schema.users.create({ name: 'Link' }); - let post1 = this.schema.posts.new({ title: 'Lorem' }); - let post2 = this.schema.posts.new({ title: 'Ipsum' }); - - user.things = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - savedParentSavedChildren() { - let user = this.schema.users.create({ name: 'Link' }); - let post1 = this.schema.posts.create({ title: 'Lorem' }); - let post2 = this.schema.posts.create({ title: 'Ipsum' }); - - user.things = [ post1, post2 ]; - user.save(); - - return [ user, [ post1, post2 ] ]; - } - - savedParentMixedChildren() { - let user = this.schema.users.create({ name: 'Link' }); - let post1 = this.schema.posts.create({ title: 'Lorem' }); - let post2 = this.schema.posts.new({ title: 'Ipsum' }); - - user.things = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - newParentNoChildren() { - let user = this.schema.users.new({ name: 'Link' }); - - return [ user, [] ]; - } - - newParentNewChildren() { - let user = this.schema.users.new({ name: 'Link' }); - let post1 = this.schema.posts.new({ title: 'Lorem' }); - let post2 = this.schema.posts.new({ title: 'Ipsum' }); - - user.things = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - newParentSavedChildren() { - let user = this.schema.users.new({ name: 'Link' }); - let post1 = this.schema.posts.create({ title: 'Lorem' }); - let post2 = this.schema.posts.create({ title: 'Ipsum' }); - - user.things = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - newParentMixedChildren() { - let user = this.schema.users.new({ name: 'Link' }); - let post1 = this.schema.posts.create({ title: 'Lorem' }); - let post2 = this.schema.posts.new({ title: 'Ipsum' }); - - user.things = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - // Unassociated child models, used for setting tests - savedChild() { - let insertedPost = this.db.posts.insert({ title: 'Lorem' }); - - return this.schema.posts.find(insertedPost.id); - } - - newChild() { - return this.schema.posts.new({ title: 'Lorem' }); - } - -} - -export const states = [ - 'savedParentNoChildren', - 'savedParentNewChildren', - 'savedParentSavedChildren', - 'savedParentMixedChildren', - 'newParentNoChildren', - 'newParentNewChildren', - 'newParentSavedChildren', - 'newParentMixedChildren' -]; diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/accessor-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/accessor-test.js deleted file mode 100644 index 7076d2ad2..000000000 --- a/tests/integration/orm/has-many/9-one-way-polymorphic/accessor-test.js +++ /dev/null @@ -1,30 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | One-way Polymorphic | accessor', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ user, posts ] = this.helper[state](); - - assert.equal(user.things.models.length, posts.length, 'the parent has the correct number of children'); - assert.equal(user.thingIds.length, posts.length, 'the parent has the correct number of children ids'); - - posts.forEach((post, i) => { - assert.ok(user.things.includes(post), 'each child is in parent.children array'); - - if (post.isSaved()) { - assert.deepEqual(user.thingIds[i], { type: 'post', id: post.id }, 'each saved child id is in parent.childrenIds array'); - } - }); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/association-create-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/association-create-test.js deleted file mode 100644 index c38564673..000000000 --- a/tests/integration/orm/has-many/9-one-way-polymorphic/association-create-test.js +++ /dev/null @@ -1,32 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | One-way Polymorphic | association #create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { - - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.things.models.length; - - let post = user.createThing('post', { title: 'Lorem ipsum' }); - - assert.ok(post.id, 'the child was persisted'); - assert.equal(user.things.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.things.includes(post), 'the model was added to user.posts'); - assert.ok(user.thingIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'the id was added to the fks array'); - assert.ok(user.attrs.thingIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'fks were persisted'); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/association-new-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/association-new-test.js deleted file mode 100644 index 5c8974d32..000000000 --- a/tests/integration/orm/has-many/9-one-way-polymorphic/association-new-test.js +++ /dev/null @@ -1,35 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | One-way Polymorphic | association #new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ - - states.forEach((state) => { - - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.things.models.length; - - let post = user.newThing('post', { title: 'Lorem ipsum' }); - - assert.ok(!post.id, 'the child was not persisted'); - assert.equal(user.things.models.length, initialCount + 1); - - post.save(); - - assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum' }, 'the child was persisted'); - assert.equal(user.things.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.things.includes(post), 'the model was added to user.things'); - assert.ok(user.thingIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'the id was added to the fks array'); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-ids-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-ids-test.js deleted file mode 100644 index bcbe821c1..000000000 --- a/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-ids-test.js +++ /dev/null @@ -1,34 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | One-way Polymorphic | association #setIds', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user ] = this.helper[state](); - let savedPost = this.helper.savedChild(); - - user.thingIds = [ { type: 'post', id: savedPost.id } ]; - - assert.ok(user.things.includes(savedPost)); - assert.ok(user.thingIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); - }); - - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ user ] = this.helper[state](); - - user.thingIds = null; - - assert.deepEqual(user.things.models, []); - assert.deepEqual(user.thingIds, []); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-test.js deleted file mode 100644 index f1f1e191f..000000000 --- a/tests/integration/orm/has-many/9-one-way-polymorphic/association-set-test.js +++ /dev/null @@ -1,53 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | One-way Polymorphic | association #set', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ user ] = this.helper[state](); - let savedPost = this.helper.savedChild(); - - user.things = [ savedPost ]; - - assert.ok(user.things.models.includes(savedPost)); - assert.ok(user.thingIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user ] = this.helper[state](); - let newPost = this.helper.newChild(); - - user.things = [ newPost ]; - - assert.deepEqual(user.thingIds, [ { type: 'post', id: undefined } ]); - assert.deepEqual(user.things.models[0], newPost); - }); - - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user ] = this.helper[state](); - - user.things = [ ]; - - assert.deepEqual(user.thingIds, [ ]); - assert.equal(user.things.models.length, 0); - }); - - test(`a ${state} can clear its association via null`, function(assert) { - let [ user ] = this.helper[state](); - - user.things = null; - - assert.deepEqual(user.thingIds, [ ]); - assert.equal(user.things.models.length, 0); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/create-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/create-test.js deleted file mode 100644 index edd75a259..000000000 --- a/tests/integration/orm/has-many/9-one-way-polymorphic/create-test.js +++ /dev/null @@ -1,87 +0,0 @@ -import Helper from './_helper'; -import { Model } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | One-way Polymorphic | create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - thingIds: [ { type: 'post', id: post.id } ] - }); - - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); - assert.deepEqual(user.things.models[0].attrs, post.attrs); - assert.equal(this.helper.db.posts.length, 1); - assert.deepEqual(this.helper.db.posts[0], { id: '1' }); - assert.equal(this.helper.db.users.length, 1); - assert.deepEqual(this.helper.db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); - }); - - test('it sets up associations correctly when passing in an array of models', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - things: [ post ] - }); - - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); - assert.ok(user.things.includes(post)); - assert.equal(this.helper.db.posts.length, 1); - assert.deepEqual(this.helper.db.posts[0], { id: '1' }); - assert.equal(this.helper.db.users.length, 1); - assert.deepEqual(this.helper.db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); - }); - - test('it sets up associations correctly when passing in a collection', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - things: this.helper.schema.posts.all() - }); - - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); - assert.ok(user.things.includes(post)); - assert.equal(this.helper.db.posts.length, 1); - assert.deepEqual(this.helper.db.posts[0], { id: '1' }); - assert.equal(this.helper.db.users.length, 1); - assert.deepEqual(this.helper.db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); - }); - - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.create('user', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.create('user', { - foos: [ schema.create('foo') ] - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); - - assert.throws(function() { - schema.create('user', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); -}); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/delete-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/delete-test.js deleted file mode 100644 index 986baa699..000000000 --- a/tests/integration/orm/has-many/9-one-way-polymorphic/delete-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | One-way Polymorphic | delete', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ user, posts ] = this.helper[state](); - - if (posts && posts.length) { - posts.forEach(p => p.destroy()); - user.reload(); - } - - assert.equal(user.things.length, 0); - assert.equal(user.thingIds.length, 0); - }); - - }); -}); diff --git a/tests/integration/orm/has-many/9-one-way-polymorphic/instantiating-test.js b/tests/integration/orm/has-many/9-one-way-polymorphic/instantiating-test.js deleted file mode 100644 index abbe5efd1..000000000 --- a/tests/integration/orm/has-many/9-one-way-polymorphic/instantiating-test.js +++ /dev/null @@ -1,81 +0,0 @@ -import Helper from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Has Many | One-way Polymorphic | instantiating', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the parent accepts a saved child id', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ - thingIds: [ { type: 'post', id: post.id } ] - }); - - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.ok(user.things.includes(post)); - }); - - test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ thingIds: [ { type: 'post', id: 2 } ] }); - }, /You're instantiating a user that has a thingIds of post:2, but some of those records don't exist in the database/); - }); - - test('the parent accepts null children foreign key', function(assert) { - let user = this.schema.users.new({ thingIds: null }); - - assert.equal(user.things.models.length, 0); - assert.deepEqual(user.thingIds, []); - assert.deepEqual(user.attrs, { thingIds: null }); - }); - - test('the parent accepts saved children', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ things: [ post ] }); - - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.ok(user.things.includes(post)); - }); - - test('the parent accepts new children', function(assert) { - let post = this.schema.posts.new({ title: 'Lorem' }); - let user = this.schema.users.new({ things: [ post ] }); - - assert.deepEqual(user.thingIds, [ { type: 'post', id: undefined } ]); - assert.ok(user.things.includes(post)); - }); - - test('the parent accepts null children', function(assert) { - let user = this.schema.users.new({ things: null }); - - assert.equal(user.things.models.length, 0); - assert.deepEqual(user.thingIds, []); - assert.deepEqual(user.attrs, { thingIds: null }); - }); - - test('the parent accepts children and child ids', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ things: [ post ], thingIds: [ { type: 'post', id: post.id } ] }); - - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.ok(user.things.includes(post)); - }); - - test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let user = this.schema.users.new({}); - - assert.deepEqual(user.thingIds, []); - assert.deepEqual(user.things.models, []); - assert.deepEqual(user.attrs, { thingIds: null }); - }); - - test('the parent accepts no reference to children or child ids', function(assert) { - let user = this.schema.users.new(); - - assert.deepEqual(user.thingIds, []); - assert.deepEqual(user.things.models, []); - assert.deepEqual(user.attrs, { thingIds: null }); - }); -}); diff --git a/tests/integration/orm/has-many/regressions/many-to-many-inverse-set-bug-test.js b/tests/integration/orm/has-many/regressions/many-to-many-inverse-set-bug-test.js deleted file mode 100644 index f0d3ef071..000000000 --- a/tests/integration/orm/has-many/regressions/many-to-many-inverse-set-bug-test.js +++ /dev/null @@ -1,38 +0,0 @@ -import { module, test } from 'qunit'; -import { Model, hasMany } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -module('Integration | ORM | Has Many | Regressions | Many to many inverse set bug', function(hooks) { - hooks.beforeEach(function() { - this.db = new Db(); - - this.schema = new Schema(this.db, { - post: Model.extend({ - tags: hasMany() - }), - tag: Model.extend({ - posts: hasMany() - }) - }); - }); - - test(`it works`, function(assert) { - this.db.loadData({ - posts: [ - { id: '1', tagIds: [ '15', '16' ] }, - { id: '2', tagIds: [ '16' ] } - ], - tags: [ - { id: '15', postIds: [ '1' ] }, - { id: '16', postIds: [ '1', '2' ] } - ] - }); - - this.schema.posts.find(1).update({ tagIds: [ '15' ] }); - - assert.deepEqual(this.db.posts.find(1).tagIds, [ '15' ]); - assert.deepEqual(this.db.tags.find(15).postIds, [ '1' ]); - assert.deepEqual(this.db.tags.find(16).postIds, [ '2' ]); - }); -}); diff --git a/tests/integration/orm/mixed/1-one-to-many/_helper.js b/tests/integration/orm/mixed/1-one-to-many/_helper.js deleted file mode 100644 index cfc068c2d..000000000 --- a/tests/integration/orm/mixed/1-one-to-many/_helper.js +++ /dev/null @@ -1,138 +0,0 @@ -import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -/* - A model with a hasMany association can be in eight states - with respect to its association. This helper class - returns a parent (and its children) in these various states. - - The return value is an array of the form - - [ parent, [child1, child2...] ] - - where the children array may be empty. -*/ -export default class Helper { - - constructor() { - this.db = new Db(); - - this.schema = new Schema(this.db, { - user: Model.extend({ - posts: hasMany() - }), - post: Model.extend({ - user: belongsTo() - }) - }); - } - - savedParentNoChildren() { - let user = this.db.users.insert({ name: 'Link' }); - - return [ this.schema.users.find(user.id), [] ]; - } - - savedParentNewChildren() { - let user = this.schema.users.create({ name: 'Link' }); - let post1 = this.schema.posts.new({ title: 'Lorem' }); - let post2 = this.schema.posts.new({ title: 'Ipsum' }); - - user.posts = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - savedParentSavedChildren() { - let { schema } = this; - schema.db.loadData({ - users: [ - { id: '1', name: 'Link', postIds: ['1', '2'] } - ], - posts: [ - { id: '1', title: 'Lorem', userId: '1' }, - { id: '2', title: 'Ipsum', userId: '1' } - ] - }); - - return [ schema.users.find(1), [ schema.posts.find(1), schema.posts.find(2) ] ]; - } - - savedParentMixedChildren() { - this.schema.db.loadData({ - users: [ - { id: '1', name: 'Link', postIds: ['1'] } - ], - posts: [ - { id: '1', title: 'Lorem', userId: '1' } - ] - }); - let user = this.schema.users.find(1); - let post1 = this.schema.posts.find(1); - let post2 = this.schema.posts.new({ name: 'Ipsum' }); - - user.posts = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - newParentNoChildren() { - let user = this.schema.users.new({ name: 'Link' }); - - return [ user, [] ]; - } - - newParentNewChildren() { - let user = this.schema.users.new({ name: 'Link' }); - let post1 = this.schema.posts.new({ title: 'Lorem' }); - let post2 = this.schema.posts.new({ title: 'Ipsum' }); - - user.posts = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - newParentSavedChildren() { - let user = this.schema.users.new({ name: 'Link' }); - let post1 = this.schema.posts.create({ title: 'Lorem' }); - let post2 = this.schema.posts.create({ title: 'Ipsum' }); - - user.posts = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - newParentMixedChildren() { - let user = this.schema.users.new({ name: 'Link' }); - let post1 = this.schema.posts.create({ title: 'Lorem' }); - let post2 = this.schema.posts.new({ title: 'Ipsum' }); - - user.posts = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - // Unassociated child models, used for setting tests - savedChild() { - let insertedPost = this.db.posts.insert({ title: 'Lorem' }); - - return this.schema.posts.find(insertedPost.id); - } - - newChild() { - return this.schema.posts.new({ title: 'Lorem' }); - } - -} - -export const states = [ - 'savedParentNoChildren', - 'savedParentNewChildren', - 'savedParentSavedChildren', - 'savedParentMixedChildren', - 'newParentNoChildren', - 'newParentNewChildren', - 'newParentSavedChildren', - 'newParentMixedChildren' -]; diff --git a/tests/integration/orm/mixed/1-one-to-many/accessor-test.js b/tests/integration/orm/mixed/1-one-to-many/accessor-test.js deleted file mode 100644 index 380476060..000000000 --- a/tests/integration/orm/mixed/1-one-to-many/accessor-test.js +++ /dev/null @@ -1,34 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Mixed | One To Many | accessor', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ user, posts ] = this.helper[state](); - - assert.equal(user.posts.models.length, posts.length, 'the parent has the correct number of children'); - assert.equal(user.postIds.length, posts.length, 'the parent has the correct number of children ids'); - - posts.forEach(post => { - assert.ok(user.posts.includes(post)); - - if (post.isSaved()) { - assert.ok(user.postIds.indexOf(post.id) > -1, 'each saved child id is in parent.childrenIds array'); - } - - // Check the inverse - assert.deepEqual(post.user.attrs, user.attrs); - assert.deepEqual(post.userId, user.id); - }); - }); - - }); -}); diff --git a/tests/integration/orm/mixed/1-one-to-many/association-create-test.js b/tests/integration/orm/mixed/1-one-to-many/association-create-test.js deleted file mode 100644 index 1ab67369a..000000000 --- a/tests/integration/orm/mixed/1-one-to-many/association-create-test.js +++ /dev/null @@ -1,32 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Mixed | One To Many | association #create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { - - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.posts.models.length; - - let post = user.createPost({ title: 'Lorem ipsum' }); - - assert.ok(post.id, 'the child was persisted'); - assert.equal(user.posts.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.posts.includes(post), 'the model was added to user.posts'); - assert.ok(user.postIds.indexOf(post.id) > -1, 'the id was added to the fks array'); - assert.ok(user.attrs.postIds.indexOf(post.id) > -1, 'fks were persisted'); - - // Check the inverse - assert.deepEqual(post.user.attrs, user.attrs); - assert.deepEqual(post.userId, user.id); - }); - - }); -}); diff --git a/tests/integration/orm/mixed/1-one-to-many/association-new-test.js b/tests/integration/orm/mixed/1-one-to-many/association-new-test.js deleted file mode 100644 index a578e1a3c..000000000 --- a/tests/integration/orm/mixed/1-one-to-many/association-new-test.js +++ /dev/null @@ -1,33 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Mixed | One To Many | association #new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ - - states.forEach((state) => { - - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.posts.models.length; - - let post = user.newPost({ title: 'Lorem ipsum' }); - - assert.ok(!post.id, 'the child was not persisted'); - assert.equal(user.posts.models.length, initialCount + 1); - - post.save(); - - assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum', userId: user.id }, 'the child was persisted'); - assert.equal(user.posts.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.posts.includes(post), 'the model was added to user.posts'); - assert.ok(user.postIds.indexOf(post.id) > -1, 'the id was added to the fks array'); - }); - - }); -}); diff --git a/tests/integration/orm/mixed/1-one-to-many/association-set-ids-test.js b/tests/integration/orm/mixed/1-one-to-many/association-set-ids-test.js deleted file mode 100644 index 1853485ac..000000000 --- a/tests/integration/orm/mixed/1-one-to-many/association-set-ids-test.js +++ /dev/null @@ -1,59 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Mixed | One To Many | association #setIds', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let savedPost = this.helper.savedChild(); - - user.postIds = [ savedPost.id ]; - - assert.ok(user.posts.includes(savedPost)); - assert.deepEqual(user.postIds, [ savedPost.id ]); - - user.save(); - savedPost.reload(); - - // Check the inverse - assert.deepEqual(savedPost.user.attrs, user.attrs); - assert.equal(savedPost.userId, user.id); - - // Check old associates - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); - }); - - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - - user.postIds = null; - - assert.deepEqual(user.posts.models, []); - assert.deepEqual(user.postIds, []); - - user.save(); - - // Check old associates - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); - }); - - }); -}); diff --git a/tests/integration/orm/mixed/1-one-to-many/association-set-test.js b/tests/integration/orm/mixed/1-one-to-many/association-set-test.js deleted file mode 100644 index 3502dca4b..000000000 --- a/tests/integration/orm/mixed/1-one-to-many/association-set-test.js +++ /dev/null @@ -1,89 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Mixed | One To Many | association #set', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let savedPost = this.helper.savedChild(); - - user.posts = [ savedPost ]; - - assert.ok(user.posts.includes(savedPost)); - assert.ok(user.postIds.indexOf(savedPost.id) > -1); - - user.save(); - - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let newPost = this.helper.newChild(); - - user.posts = [ newPost ]; - - assert.deepEqual(user.postIds, [ undefined ]); - assert.ok(user.posts.includes(newPost)); - - user.save(); - - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); - }); - - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - - user.posts = [ ]; - - assert.deepEqual(user.postIds, [ ]); - assert.equal(user.posts.models.length, 0); - - user.save(); - - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); - }); - - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - - user.posts = null; - - assert.deepEqual(user.postIds, [ ]); - assert.equal(user.posts.models.length, 0); - - user.save(); - - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); - }); - - }); -}); diff --git a/tests/integration/orm/mixed/1-one-to-many/create-test.js b/tests/integration/orm/mixed/1-one-to-many/create-test.js deleted file mode 100644 index 3faab874a..000000000 --- a/tests/integration/orm/mixed/1-one-to-many/create-test.js +++ /dev/null @@ -1,97 +0,0 @@ -import Helper from './_helper'; -import { Model } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Mixed | One To Many | create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - postIds: [ post.id ] - }); - post.reload(); - - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.attrs.postIds, [ post.id ], 'the ids were persisted'); - assert.ok(user.posts.includes(post)); - assert.deepEqual(post.user.attrs, user.attrs); - - let { db } = this.helper; - assert.equal(db.posts.length, 1); - assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); - assert.equal(db.users.length, 1); - assert.deepEqual(db.users[0], { id: '1', postIds: [ '1' ] }); - }); - - test('it sets up associations correctly when passing in an array of models', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - posts: [ post ] - }); - - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.attrs.postIds, [ post.id ], 'the ids were persisted'); - assert.ok(user.posts.includes(post)); - assert.deepEqual(post.user.attrs, user.attrs); - - let { db } = this.helper; - assert.equal(db.posts.length, 1); - assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); - assert.equal(db.users.length, 1); - assert.deepEqual(db.users[0], { id: '1', postIds: [ '1' ] }); - }); - - test('it sets up associations correctly when passing in a collection', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - posts: this.helper.schema.posts.all() - }); - post.reload(); - - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.attrs.postIds, [ post.id ], 'the ids were persisted'); - assert.ok(user.posts.includes(post)); - - let { db } = this.helper; - assert.equal(db.posts.length, 1); - assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); - assert.equal(db.users.length, 1); - assert.deepEqual(db.users[0], { id: '1', postIds: [ '1' ] }); - }); - - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.create('user', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if an array of models is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.create('user', { - foos: [ schema.create('foo') ] - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); - - assert.throws(function() { - schema.create('post', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); -}); diff --git a/tests/integration/orm/mixed/1-one-to-many/instantiating-test.js b/tests/integration/orm/mixed/1-one-to-many/instantiating-test.js deleted file mode 100644 index 337c271fe..000000000 --- a/tests/integration/orm/mixed/1-one-to-many/instantiating-test.js +++ /dev/null @@ -1,81 +0,0 @@ -import Helper from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Mixed | One To Many | instantiating', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the parent accepts a saved child id', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ - postIds: [ post.id ] - }); - - assert.deepEqual(user.postIds, [ post.id ]); - assert.ok(user.posts.includes(post)); - }); - - test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ postIds: [ 2 ] }); - }, /You're instantiating a user that has a postIds of 2, but some of those records don't exist in the database/); - }); - - test('the parent accepts null children foreign key', function(assert) { - let user = this.schema.users.new({ postIds: null }); - - assert.equal(user.posts.models.length, 0); - assert.deepEqual(user.postIds, []); - assert.deepEqual(user.attrs, { postIds: null }); - }); - - test('the parent accepts saved children', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ posts: [ post ] }); - - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.posts.models[0], post); - }); - - test('the parent accepts new children', function(assert) { - let post = this.schema.posts.new({ title: 'Lorem' }); - let user = this.schema.users.new({ posts: [ post ] }); - - assert.deepEqual(user.postIds, [ undefined ]); - assert.deepEqual(user.posts.models[0], post); - }); - - test('the parent accepts null children', function(assert) { - let user = this.schema.users.new({ posts: null }); - - assert.equal(user.posts.models.length, 0); - assert.deepEqual(user.postIds, []); - assert.deepEqual(user.attrs, { postIds: null }); - }); - - test('the parent accepts children and child ids', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ posts: [ post ], postIds: [ post.id ] }); - - assert.deepEqual(user.postIds, [ post.id ]); - assert.deepEqual(user.posts.models[0], post); - }); - - test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let user = this.schema.users.new({}); - - assert.deepEqual(user.postIds, []); - assert.deepEqual(user.posts.models, []); - assert.deepEqual(user.attrs, { postIds: null }); - }); - - test('the parent accepts no reference to children or child ids', function(assert) { - let user = this.schema.users.new(); - - assert.deepEqual(user.postIds, []); - assert.deepEqual(user.posts.models, []); - assert.deepEqual(user.attrs, { postIds: null }); - }); -}); diff --git a/tests/integration/orm/mixed/2-many-to-one/_helper.js b/tests/integration/orm/mixed/2-many-to-one/_helper.js deleted file mode 100644 index 530a63efc..000000000 --- a/tests/integration/orm/mixed/2-many-to-one/_helper.js +++ /dev/null @@ -1,104 +0,0 @@ -import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -/* - A model with a hasMany association can be in eight states - with respect to its association. This helper class - returns a parent (and its children) in these various states. - - The return value is an array of the form - - [ parent, [child1, child2...] ] - - where the children array may be empty. -*/ -export default class Helper { - - constructor() { - this.db = new Db(); - - this.schema = new Schema(this.db, { - user: Model.extend({ - posts: hasMany() - }), - post: Model.extend({ - user: belongsTo() - }) - }); - } - - savedChildNoParent() { - let post = this.db.posts.insert({ title: 'Lorem' }); - - return [ this.schema.posts.find(post.id), null ]; - } - - savedChildNewParent() { - let post = this.schema.posts.create({ title: 'Lorem' }); - let user = this.schema.users.new({ name: 'Link' }); - - post.user = user; - - return [ post, user ]; - } - - savedChildSavedParent() { - let { schema } = this; - schema.db.loadData({ - posts: [ - { id: '1', title: 'Lorem', userId: '1' } - ], - users: [ - { id: '1', name: 'Link', postIds: ['1'] } - ] - }); - - return [ schema.posts.find(1), schema.users.find(1) ]; - } - - newChildNoParent() { - let post = this.schema.posts.new({ title: 'Lorem' }); - - return [ post, null ]; - } - - newChildNewParent() { - let post = this.schema.posts.new({ title: 'Lorem' }); - let user = this.schema.users.new({ name: 'Link' }); - - post.user = user; - - return [ post, user ]; - } - - newChildSavedParent() { - let post = this.schema.posts.create({ title: 'Lorem' }); - let user = this.schema.users.new({ name: 'Link' }); - - post.user = user; - - return [ post, user ]; - } - - // Unassociated models - savedParent() { - let insertedUser = this.db.users.insert({ name: 'Link' }); - - return this.schema.users.find(insertedUser.id); - } - - newParent() { - return this.schema.users.new({ name: 'Link' }); - } - -} - -export const states = [ - 'savedChildNoParent', - 'savedChildNewParent', - 'savedChildSavedParent', - 'newChildNoParent', - 'newChildNewParent', - 'newChildSavedParent' -]; diff --git a/tests/integration/orm/mixed/2-many-to-one/accessor-test.js b/tests/integration/orm/mixed/2-many-to-one/accessor-test.js deleted file mode 100644 index d9cb8867c..000000000 --- a/tests/integration/orm/mixed/2-many-to-one/accessor-test.js +++ /dev/null @@ -1,35 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Mixed | Many To One | accessor', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ post, user ] = this.helper[state](); - - if (post.user) { - assert.ok(post.user.equals(user)); - } else { - assert.equal(post.user, null); - assert.equal(user, null); - } - assert.equal(post.userId, user ? user.id : null); - - post.save(); - - // Check the inverse - if (user && user.isSaved()) { - user.reload(); - assert.ok(user.posts.includes(post)); - } - }); - - }); -}); diff --git a/tests/integration/orm/mixed/2-many-to-one/association-create-test.js b/tests/integration/orm/mixed/2-many-to-one/association-create-test.js deleted file mode 100644 index df8fe2177..000000000 --- a/tests/integration/orm/mixed/2-many-to-one/association-create-test.js +++ /dev/null @@ -1,34 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Mixed | Many To One | association #create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { - - test(`a ${state} can create an associated parent`, function(assert) { - let [ post, originalUser ] = this.helper[state](); - - let user = post.createUser({ name: 'Zelda' }); - - assert.ok(user.id, 'the parent was persisted'); - assert.deepEqual(post.user.attrs, user.attrs); - assert.equal(post.userId, user.id); - - // Check the inverse - assert.ok(user.posts.includes(post), 'the inverse was set'); - - // Ensure old inverse was cleared - if (originalUser && originalUser.isSaved()) { - originalUser.reload(); - assert.notOk(originalUser.posts.includes(post)); - } - }); - - }); -}); diff --git a/tests/integration/orm/mixed/2-many-to-one/association-new-test.js b/tests/integration/orm/mixed/2-many-to-one/association-new-test.js deleted file mode 100644 index 891705dcc..000000000 --- a/tests/integration/orm/mixed/2-many-to-one/association-new-test.js +++ /dev/null @@ -1,42 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Mixed | Many To One | association #new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ - - states.forEach((state) => { - - test(`a ${state} can build a new associated parent`, function(assert) { - let [ post, originalUser ] = this.helper[state](); - - let user = post.newUser({ name: 'Zelda' }); - - assert.ok(!user.id, 'the child was not persisted'); - assert.deepEqual(post.user, user, 'the relationship was set'); - assert.ok(user.posts.includes(post), 'the inverse was set'); - - user.save(); - post.reload(); - - assert.ok(user.id, 'the parent was persisted'); - assert.deepEqual(post.user.attrs, user.attrs); - assert.equal(post.userId, user.id); - - // Check the inverse - assert.ok(user.posts.includes(post), 'the inverse was set'); - - // Ensure old inverse was cleared - if (originalUser && originalUser.isSaved()) { - originalUser.reload(); - assert.notOk(originalUser.posts.includes(post)); - } - }); - - }); -}); diff --git a/tests/integration/orm/mixed/2-many-to-one/association-set-ids-test.js b/tests/integration/orm/mixed/2-many-to-one/association-set-ids-test.js deleted file mode 100644 index 3d56b504e..000000000 --- a/tests/integration/orm/mixed/2-many-to-one/association-set-ids-test.js +++ /dev/null @@ -1,54 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Mixed | Many To One | association #setIds', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ post, originalUser ] = this.helper[state](); - let user = this.helper.savedParent(); - - post.userId = user.id; - - assert.equal(post.userId, user.id); - assert.deepEqual(post.user.attrs, user.attrs); - - assert.ok(post.user.posts.includes(post), 'the inverse was set'); - - post.save(); - user.reload(); - - assert.ok(user.posts.includes(post)); - - // Old inverses were cleared - if (originalUser && originalUser.isSaved()) { - originalUser.reload(); - assert.notOk(originalUser.posts.includes(post)); - } - }); - - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ post, originalUser ] = this.helper[state](); - - post.userId = null; - - assert.deepEqual(post.user, null); - assert.deepEqual(post.userId, null); - - post.save(); - - if (originalUser && originalUser.isSaved()) { - originalUser.reload(); - assert.notOk(originalUser.posts.includes(post)); - } - }); - - }); -}); diff --git a/tests/integration/orm/mixed/2-many-to-one/association-set-test.js b/tests/integration/orm/mixed/2-many-to-one/association-set-test.js deleted file mode 100644 index 4cd92aa0c..000000000 --- a/tests/integration/orm/mixed/2-many-to-one/association-set-test.js +++ /dev/null @@ -1,67 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Mixed | Many To One | association #set', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent`, function(assert) { - let [ post, originalUser ] = this.helper[state](); - let savedUser = this.helper.savedParent(); - - post.user = savedUser; - - assert.deepEqual(post.user, savedUser); - assert.ok(savedUser.posts.includes(post), 'the inverse was set'); - - post.save(); - - // Old inverse was cleared - if (originalUser && originalUser.isSaved()) { - originalUser.reload(); - assert.notOk(originalUser.posts.includes(post)); - } - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ post, originalUser ] = this.helper[state](); - let newUser = this.helper.newParent(); - - post.user = newUser; - - assert.deepEqual(post.user, newUser); - assert.ok(newUser.posts.includes(post), 'the inverse was set'); - - post.save(); - - // Old inverse was cleared - if (originalUser && originalUser.isSaved()) { - originalUser.reload(); - assert.notOk(originalUser.posts.includes(post)); - } - }); - - test(`a ${state} can update its association to a null parent`, function(assert) { - let [ post, originalUser ] = this.helper[state](); - - post.user = null; - - assert.deepEqual(post.user, null); - - post.save(); - - // Old inverse was cleared - if (originalUser && originalUser.isSaved()) { - originalUser.reload(); - assert.notOk(originalUser.posts.includes(post)); - } - }); - - }); -}); diff --git a/tests/integration/orm/mixed/2-many-to-one/create-test.js b/tests/integration/orm/mixed/2-many-to-one/create-test.js deleted file mode 100644 index dc4f96df1..000000000 --- a/tests/integration/orm/mixed/2-many-to-one/create-test.js +++ /dev/null @@ -1,71 +0,0 @@ -import Helper from './_helper'; -import { Model } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Mixed | Many To One | create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let { schema } = this.helper; - let user = schema.create('user'); - let post = schema.create('post', { - userId: user.id - }); - user.reload(); - - assert.deepEqual(post.user.attrs, user.attrs); - assert.equal(post.userId, user.id); - assert.ok(user.posts.includes(post), 'inverse was set'); - assert.deepEqual(user.postIds, [ post.id ]); - - let { db } = this.helper; - assert.equal(db.posts.length, 1); - assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); - assert.equal(db.users.length, 1); - assert.deepEqual(db.users[0], { id: '1', postIds: [ '1' ] }); - }); - - test('it sets up associations correctly when passing in the association itself', function(assert) { - let { schema } = this.helper; - let user = schema.create('user'); - let post = schema.create('post', { - user - }); - - assert.deepEqual(post.user.attrs, user.attrs); - assert.equal(post.userId, user.id); - assert.ok(user.posts.includes(post), 'inverse was set'); - assert.deepEqual(user.postIds, [ post.id ]); - - let { db } = this.helper; - assert.equal(db.posts.length, 1); - assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); - assert.equal(db.users.length, 1); - assert.deepEqual(db.users[0], { id: '1', postIds: [ '1' ] }); - }); - - test('it throws an error if a model is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - - assert.throws(function() { - schema.create('post', { - foo: schema.create('foo') - }); - }, /you haven't defined that key as an association on your model/); - }); - - test('it throws an error if a collection is passed in without a defined relationship', function(assert) { - let { schema } = this.helper; - schema.create('foo'); - schema.create('foo'); - - assert.throws(function() { - schema.create('post', { - foos: schema.foos.all() - }); - }, /you haven't defined that key as an association on your model/); - }); -}); diff --git a/tests/integration/orm/mixed/2-many-to-one/instantiating-test.js b/tests/integration/orm/mixed/2-many-to-one/instantiating-test.js deleted file mode 100644 index e956c1dae..000000000 --- a/tests/integration/orm/mixed/2-many-to-one/instantiating-test.js +++ /dev/null @@ -1,96 +0,0 @@ -import Helper from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Mixed | One To Many | instantiating', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the child accepts a saved parent id', function(assert) { - let user = this.helper.savedParent(); - let post = this.schema.posts.new({ userId: user.id }); - - assert.equal(post.userId, user.id); - assert.deepEqual(post.user.attrs, user.attrs); - assert.deepEqual(post.attrs, { userId: user.id }); - - post.save(); - user.reload(); - - assert.ok(user.posts.includes(post), 'the inverse was set'); - }); - - test('the child errors if the parent id doesnt exist', function(assert) { - assert.throws(function() { - this.schema.posts.new({ userId: 2 }); - }, /You're instantiating a post that has a userId of 2, but that record doesn't exist in the database/); - }); - - test('the child accepts a null parent id', function(assert) { - let post = this.schema.posts.new({ userId: null }); - - assert.equal(post.userId, null); - assert.equal(post.user, null); - assert.deepEqual(post.attrs, { userId: null }); - }); - - test('the child accepts a saved parent model', function(assert) { - let user = this.helper.savedParent(); - let post = this.schema.posts.new({ user }); - - assert.equal(post.userId, 1); - assert.deepEqual(post.user.attrs, user.attrs); - assert.deepEqual(post.attrs, { userId: null }); - - post.save(); - user.reload(); - - assert.ok(user.posts.includes(post), 'the inverse was set'); - }); - - test('the child accepts a new parent model', function(assert) { - let user = this.schema.users.new({ age: 300 }); - let post = this.schema.posts.new({ user }); - - assert.equal(post.userId, null); - assert.deepEqual(post.user, user); - assert.deepEqual(post.attrs, { userId: null }); - assert.ok(user.posts.includes(post), 'the inverse was set'); - }); - - test('the child accepts a null parent model', function(assert) { - let post = this.schema.posts.new({ user: null }); - - assert.equal(post.userId, null); - assert.deepEqual(post.user, null); - assert.deepEqual(post.attrs, { userId: null }); - }); - - test('the child accepts a parent model and id', function(assert) { - let user = this.helper.savedParent(); - let post = this.schema.posts.new({ user, userId: user.id }); - - assert.equal(post.userId, '1'); - assert.deepEqual(post.user, user); - assert.deepEqual(post.attrs, { userId: user.id }); - - assert.ok(user.posts.includes(post), 'the inverse was set'); - }); - - test('the child accepts no reference to a parent id or model as empty obj', function(assert) { - let post = this.schema.posts.new({}); - - assert.equal(post.userId, null); - assert.deepEqual(post.user, null); - assert.deepEqual(post.attrs, { userId: null }); - }); - - test('the child accepts no reference to a parent id or model', function(assert) { - let post = this.schema.posts.new(); - - assert.equal(post.userId, null); - assert.deepEqual(post.user, null); - assert.deepEqual(post.attrs, { userId: null }); - }); -}); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/_helper.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/_helper.js deleted file mode 100644 index fb9065896..000000000 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/_helper.js +++ /dev/null @@ -1,138 +0,0 @@ -import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -/* - A model with a hasMany association can be in eight states - with respect to its association. This helper class - returns a parent (and its children) in these various states. - - The return value is an array of the form - - [ parent, [child1, child2...] ] - - where the children array may be empty. -*/ -export default class Helper { - - constructor() { - this.db = new Db(); - - this.schema = new Schema(this.db, { - user: Model.extend({ - things: hasMany({ polymorphic: true }) - }), - post: Model.extend({ - user: belongsTo({ inverse: 'things' }) - }) - }); - } - - savedParentNoChildren() { - let user = this.db.users.insert({ name: 'Link' }); - - return [ this.schema.users.find(user.id), [] ]; - } - - savedParentNewChildren() { - let user = this.schema.users.create({ name: 'Link' }); - let post1 = this.schema.posts.new({ title: 'Lorem' }); - let post2 = this.schema.posts.new({ title: 'Ipsum' }); - - user.things = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - savedParentSavedChildren() { - let { schema } = this; - schema.db.loadData({ - users: [ - { id: '1', name: 'Link', thingIds: [ { type: 'post', id: '1' }, { type: 'post', id: '2' } ] } - ], - posts: [ - { id: '1', title: 'Lorem', userId: '1' }, - { id: '2', title: 'Ipsum', userId: '1' } - ] - }); - - return [ schema.users.find(1), [ schema.posts.find(1), schema.posts.find(2) ] ]; - } - - savedParentMixedChildren() { - this.schema.db.loadData({ - users: [ - { id: '1', name: 'Link', thingIds: [ { type: 'post', id: '1' } ] } - ], - posts: [ - { id: '1', title: 'Lorem', userId: '1' } - ] - }); - let user = this.schema.users.find(1); - let post1 = this.schema.posts.find(1); - let post2 = this.schema.posts.new({ name: 'Ipsum' }); - - user.things = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - newParentNoChildren() { - let user = this.schema.users.new({ name: 'Link' }); - - return [ user, [] ]; - } - - newParentNewChildren() { - let user = this.schema.users.new({ name: 'Link' }); - let post1 = this.schema.posts.new({ title: 'Lorem' }); - let post2 = this.schema.posts.new({ title: 'Ipsum' }); - - user.things = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - newParentSavedChildren() { - let user = this.schema.users.new({ name: 'Link' }); - let post1 = this.schema.posts.create({ title: 'Lorem' }); - let post2 = this.schema.posts.create({ title: 'Ipsum' }); - - user.things = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - newParentMixedChildren() { - let user = this.schema.users.new({ name: 'Link' }); - let post1 = this.schema.posts.create({ title: 'Lorem' }); - let post2 = this.schema.posts.new({ title: 'Ipsum' }); - - user.things = [ post1, post2 ]; - - return [ user, [ post1, post2 ] ]; - } - - // Unassociated child models, used for setting tests - savedChild() { - let insertedPost = this.db.posts.insert({ title: 'Lorem' }); - - return this.schema.posts.find(insertedPost.id); - } - - newChild() { - return this.schema.posts.new({ title: 'Lorem' }); - } - -} - -export const states = [ - 'savedParentNoChildren', - 'savedParentNewChildren', - 'savedParentSavedChildren', - 'savedParentMixedChildren', - 'newParentNoChildren', - 'newParentNewChildren', - 'newParentSavedChildren', - 'newParentMixedChildren' -]; diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/accessor-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/accessor-test.js deleted file mode 100644 index 35e958bb3..000000000 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/accessor-test.js +++ /dev/null @@ -1,36 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Mixed | One To Many Polymorphic | accessor', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The reference to a belongs-to association is correct, for all states - */ - states.forEach((state) => { - - test(`the references of a ${state} are correct`, function(assert) { - let [ user, posts ] = this.helper[state](); - - assert.equal(user.things.models.length, posts.length, 'the parent has the correct number of children'); - assert.equal(user.thingIds.length, posts.length, 'the parent has the correct number of children ids'); - - posts.forEach(post => { - assert.ok(user.things.includes(post)); - - if (post.isSaved()) { - assert.ok(user.thingIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'each saved child id is in parent.childrenIds array'); - } - - // Check the inverse - assert.deepEqual(post.user.attrs, user.attrs); - assert.deepEqual(post.userId, user.id); - }); - }); - - }); -}); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-create-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-create-test.js deleted file mode 100644 index b93b146ad..000000000 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-create-test.js +++ /dev/null @@ -1,36 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Mixed | One To Many Polymorphic | association #create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can create a has-many association, for all states - */ - states.forEach((state) => { - - test(`a ${state} can create an associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.things.models.length; - - let post = user.createThing('post', { title: 'Lorem ipsum' }); - - assert.ok(post.id, 'the child was persisted'); - assert.equal(user.things.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.things.includes(post), 'the model was added to user.posts'); - assert.ok(user.thingIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'the id was added to the fks array'); - assert.ok(user.attrs.thingIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'fks were persisted'); - - // Check the inverse - assert.deepEqual(post.user.attrs, user.attrs); - assert.deepEqual(post.userId, user.id); - }); - - }); -}); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-new-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-new-test.js deleted file mode 100644 index 7a2435467..000000000 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-new-test.js +++ /dev/null @@ -1,35 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Mixed | One To Many Polymorphic | association #new', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can make a new unsaved belongs-to association, for all states - */ - - states.forEach((state) => { - - test(`a ${state} can build a new associated parent`, function(assert) { - let [ user ] = this.helper[state](); - let initialCount = user.things.models.length; - - let post = user.newThing('post', { title: 'Lorem ipsum' }); - - assert.ok(!post.id, 'the child was not persisted'); - assert.equal(user.things.models.length, initialCount + 1); - - post.save(); - - assert.deepEqual(post.attrs, { id: post.id, title: 'Lorem ipsum', userId: user.id }, 'the child was persisted'); - assert.equal(user.things.models.length, initialCount + 1, 'the collection size was increased'); - assert.ok(user.things.includes(post), 'the model was added to user.things'); - assert.ok(user.thingIds.find(obj => { - return (obj.id === post.id && obj.type === 'post'); - }), 'the id was added to the fks array'); - }); - - }); -}); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-ids-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-ids-test.js deleted file mode 100644 index 6153fe2f3..000000000 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-ids-test.js +++ /dev/null @@ -1,59 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Mixed | One To Many Polymorphic | association #setIds', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parentId, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a saved parent via parentId`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let savedPost = this.helper.savedChild(); - - user.thingIds = [ { type: 'post', id: savedPost.id } ]; - - assert.ok(user.things.includes(savedPost)); - assert.deepEqual(user.thingIds, [ { type: 'post', id: savedPost.id } ]); - - user.save(); - savedPost.reload(); - - // Check the inverse - assert.deepEqual(savedPost.user.attrs, user.attrs); - assert.equal(savedPost.userId, user.id); - - // Check old associates - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); - }); - - test(`a ${state} can clear its association via a null parentId`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - - user.thingIds = null; - - assert.deepEqual(user.things.models, []); - assert.deepEqual(user.thingIds, []); - - user.save(); - - // Check old associates - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); - }); - - }); -}); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-test.js deleted file mode 100644 index dc5897bf3..000000000 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/association-set-test.js +++ /dev/null @@ -1,89 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Mixed | One To Many Polymorphic | association #set', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - /* - The model can update its association via parent, for all states - */ - states.forEach((state) => { - - test(`a ${state} can update its association to a list of saved children`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let savedPost = this.helper.savedChild(); - - user.things = [ savedPost ]; - - assert.ok(user.things.includes(savedPost)); - assert.ok(user.thingIds.find(({ id, type }) => ((id === savedPost.id && type === 'post')))); - - user.save(); - - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); - }); - - test(`a ${state} can update its association to a new parent`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - let newPost = this.helper.newChild(); - - user.things = [ newPost ]; - - assert.deepEqual(user.thingIds, [ { type: 'post', id: undefined } ]); - assert.ok(user.things.includes(newPost)); - - user.save(); - - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); - }); - - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - - user.things = [ ]; - - assert.deepEqual(user.thingIds, [ ]); - assert.equal(user.things.models.length, 0); - - user.save(); - - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); - }); - - test(`a ${state} can clear its association via an empty list`, function(assert) { - let [ user, originalPosts ] = this.helper[state](); - - user.things = null; - - assert.deepEqual(user.thingIds, [ ]); - assert.equal(user.things.models.length, 0); - - user.save(); - - originalPosts.forEach(post => { - if (post.isSaved()) { - post.reload(); - assert.equal(post.user, null); - } - }); - }); - - }); -}); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/create-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/create-test.js deleted file mode 100644 index 41d268552..000000000 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/create-test.js +++ /dev/null @@ -1,65 +0,0 @@ -import Helper from './_helper'; -import { Model } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Mixed | One To Many Polymorphic | create', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.helper.schema.registerModel('foo', Model); - }); - - test('it sets up associations correctly when passing in the foreign key', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - thingIds: [ { type: 'post', id: post.id } ] - }); - post.reload(); - - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); - assert.ok(user.things.includes(post)); - assert.deepEqual(post.user.attrs, user.attrs); - - let { db } = this.helper; - assert.equal(db.posts.length, 1); - assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); - assert.equal(db.users.length, 1); - assert.deepEqual(db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); - }); - - test('it sets up associations correctly when passing in an array of models', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - things: [ post ] - }); - - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); - assert.ok(user.things.includes(post)); - assert.deepEqual(post.user.attrs, user.attrs); - - let { db } = this.helper; - assert.equal(db.posts.length, 1); - assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); - assert.equal(db.users.length, 1); - assert.deepEqual(db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); - }); - - test('it sets up associations correctly when passing in a collection', function(assert) { - let post = this.helper.schema.create('post'); - let user = this.helper.schema.create('user', { - things: this.helper.schema.posts.all() - }); - post.reload(); - - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.attrs.thingIds, [ { type: 'post', id: post.id } ], 'the ids were persisted'); - assert.ok(user.things.includes(post)); - - let { db } = this.helper; - assert.equal(db.posts.length, 1); - assert.deepEqual(db.posts[0], { id: '1', userId: '1' }); - assert.equal(db.users.length, 1); - assert.deepEqual(db.users[0], { id: '1', thingIds: [ { type: 'post', id: '1' } ] }); - }); -}); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/delete-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/delete-test.js deleted file mode 100644 index c92699e5d..000000000 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/delete-test.js +++ /dev/null @@ -1,24 +0,0 @@ -import Helper, { states } from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Mixed | One To Many Polymorphic | delete', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - }); - - states.forEach((state) => { - - test(`deleting children updates the parent's foreign key for a ${state}`, function(assert) { - let [ user, posts ] = this.helper[state](); - - if (posts && posts.length) { - posts.forEach(p => p.destroy()); - user.reload(); - } - - assert.equal(user.things.length, 0); - assert.equal(user.thingIds.length, 0); - }); - - }); -}); diff --git a/tests/integration/orm/mixed/3-one-to-many-polymorphic/instantiating-test.js b/tests/integration/orm/mixed/3-one-to-many-polymorphic/instantiating-test.js deleted file mode 100644 index 1a46fc912..000000000 --- a/tests/integration/orm/mixed/3-one-to-many-polymorphic/instantiating-test.js +++ /dev/null @@ -1,81 +0,0 @@ -import Helper from './_helper'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Mixed | One To Many Polymorphic | instantiating', function(hooks) { - hooks.beforeEach(function() { - this.helper = new Helper(); - this.schema = this.helper.schema; - }); - - test('the parent accepts a saved child id', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ - thingIds: [ { type: 'post', id: post.id } ] - }); - - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.ok(user.things.includes(post)); - }); - - test('the parent errors if the children ids don\'t exist', function(assert) { - assert.throws(function() { - this.schema.users.new({ thingIds: [ { type: 'post', id: 2 } ] }); - }, /You're instantiating a user that has a thingIds of post:2, but some of those records don't exist in the database/); - }); - - test('the parent accepts null children foreign key', function(assert) { - let user = this.schema.users.new({ thingIds: null }); - - assert.equal(user.things.models.length, 0); - assert.deepEqual(user.thingIds, []); - assert.deepEqual(user.attrs, { thingIds: null }); - }); - - test('the parent accepts saved children', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ things: [ post ] }); - - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.things.models[0], post); - }); - - test('the parent accepts new children', function(assert) { - let post = this.schema.posts.new({ title: 'Lorem' }); - let user = this.schema.users.new({ things: [ post ] }); - - assert.deepEqual(user.thingIds, [ { type: 'post', id: undefined } ]); - assert.deepEqual(user.things.models[0], post); - }); - - test('the parent accepts null children', function(assert) { - let user = this.schema.users.new({ things: null }); - - assert.equal(user.things.models.length, 0); - assert.deepEqual(user.thingIds, []); - assert.deepEqual(user.attrs, { thingIds: null }); - }); - - test('the parent accepts children and child ids', function(assert) { - let post = this.helper.savedChild(); - let user = this.schema.users.new({ things: [ post ], thingIds: [ { type: 'post', id: post.id } ] }); - - assert.deepEqual(user.thingIds, [ { type: 'post', id: post.id } ]); - assert.deepEqual(user.things.models[0], post); - }); - - test('the parent accepts no reference to children or child ids as empty obj', function(assert) { - let user = this.schema.users.new({}); - - assert.deepEqual(user.thingIds, []); - assert.deepEqual(user.things.models, []); - assert.deepEqual(user.attrs, { thingIds: null }); - }); - - test('the parent accepts no reference to children or child ids', function(assert) { - let user = this.schema.users.new(); - - assert.deepEqual(user.thingIds, []); - assert.deepEqual(user.things.models, []); - assert.deepEqual(user.attrs, { thingIds: null }); - }); -}); diff --git a/tests/integration/orm/mixed/regressions/1613-two-bidirectional-many-to-many-with-same-target-model-update-bug-test.js b/tests/integration/orm/mixed/regressions/1613-two-bidirectional-many-to-many-with-same-target-model-update-bug-test.js deleted file mode 100644 index 2798b7b73..000000000 --- a/tests/integration/orm/mixed/regressions/1613-two-bidirectional-many-to-many-with-same-target-model-update-bug-test.js +++ /dev/null @@ -1,34 +0,0 @@ -import { module, test } from 'qunit'; -import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -module('Integration | ORM | Mixed | Regressions | 1613 Two bidirectional one-to-many relationships with same target model update ids bug', function(hooks) { - hooks.beforeEach(function() { - this.db = new Db(); - - this.schema = new Schema(this.db, { - user: Model.extend({ - authoredPosts: hasMany('post', { inverse: 'author' }), - editedPosts: hasMany('post', { inverse: 'editor' }) - }), - post: Model.extend({ - author: belongsTo('user', { inverse: 'authoredPosts' }), - editor: belongsTo('user', { inverse: 'editedPosts' }) - }) - }); - }); - - test(`it works, and all inverses are correctly updated`, function(assert) { - let user = this.schema.users.create(); - let post = this.schema.posts.create(); - - post.update({ - authorId: user.id, - editorId: user.id - }); - - assert.deepEqual(this.db.posts.find(1), { id: '1', authorId: '1', editorId: '1' }); - assert.deepEqual(this.db.users.find(1), { id: '1', authoredPostIds: [ '1' ], editedPostIds: [ '1' ] }); - }); -}); diff --git a/tests/integration/orm/none-test.js b/tests/integration/orm/none-test.js deleted file mode 100644 index c7e9c0337..000000000 --- a/tests/integration/orm/none-test.js +++ /dev/null @@ -1,29 +0,0 @@ -import Schema from 'ember-cli-mirage/orm/schema'; -import Model from 'ember-cli-mirage/orm/model'; -import Db from 'ember-cli-mirage/db'; -import Collection from 'ember-cli-mirage/orm/collection'; -import {module, test} from 'qunit'; - -let schema; -let User = Model.extend(); - -module('Integration | ORM | #none', function(hooks) { - hooks.beforeEach(function() { - let db = new Db({ users: [ - { id: 1, name: 'Link', good: true }, - { id: 2, name: 'Zelda', good: true }, - { id: 3, name: 'Ganon', good: false } - ] }); - - schema = new Schema(db, { - user: User - }); - }); - - test('it returns an empty collection', function(assert) { - let users = schema.users.none(); - - assert.ok(users instanceof Collection, 'it returns a collection'); - assert.equal(users.models.length, 0); - }); -}); diff --git a/tests/integration/orm/reinitialize-associations-test.js b/tests/integration/orm/reinitialize-associations-test.js deleted file mode 100644 index 7f65409ef..000000000 --- a/tests/integration/orm/reinitialize-associations-test.js +++ /dev/null @@ -1,32 +0,0 @@ -// jscs:disable disallowVar -import { Model, hasMany } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import {module, test} from 'qunit'; - -// Model classes are defined statically, just like in a typical app -var User = Model.extend({ - addresses: hasMany() -}); -var Address = Model.extend(); - -module('Integration | ORM | reinitialize associations', function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - address: Address, - user: User - }); - - this.schema.addresses.create({ id: 1, country: 'Hyrule' }); - this.schema.users.create({ id: 1, name: 'Link', addressIds: [ 1 ] }); - }); - - // By running two tests, we force the statically-defined classes to be - // registered twice. - test('safely initializes associations', function(assert) { - assert.equal(this.schema.users.find(1).addresses.models[0].country, 'Hyrule'); - }); - test('safely initializes associations again', function(assert) { - assert.equal(this.schema.users.find(1).addresses.models[0].country, 'Hyrule'); - }); -}); diff --git a/tests/integration/orm/schema-verification/belongs-to-test.js b/tests/integration/orm/schema-verification/belongs-to-test.js deleted file mode 100644 index d43fab15e..000000000 --- a/tests/integration/orm/schema-verification/belongs-to-test.js +++ /dev/null @@ -1,188 +0,0 @@ -import { Model, belongsTo } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Schema Verification | Belongs To', function() { - test('a one-way belongsTo association is correct', function(assert) { - let schema = new Schema(new Db({ - authors: [ - { id: 1, name: 'Frodo' } - ], - posts: [ - { id: 1, title: 'Lorem ipsum' } - ] - }), { - author: Model.extend(), - post: Model.extend({ - author: belongsTo() - }) - }); - - let post = schema.posts.find(1); - let association = post.associationFor('author'); - let frodo = schema.authors.find(1); - - assert.equal(association.key, 'author'); - assert.equal(association.modelName, 'author'); - assert.equal(association.ownerModelName, 'post'); - assert.ok(frodo.inverseFor(association) === null, 'there is no inverse'); - }); - - test('a one-way named belongsTo association is correct', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ], - posts: [ - { id: 1, title: 'Lorem ipsum' } - ] - }), { - user: Model.extend(), - post: Model.extend({ - author: belongsTo('user') - }) - }); - - let post = schema.posts.find(1); - let association = post.associationFor('author'); - let frodo = schema.users.find(1); - - assert.equal(association.key, 'author'); - assert.equal(association.modelName, 'user'); - assert.equal(association.ownerModelName, 'post'); - assert.ok(frodo.inverseFor(association) === null, 'there is no inverse'); - }); - - test('a reflexive belongsTo association is correct and has an implicit inverse', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ] - }), { - user: Model.extend({ - user: belongsTo() - }) - }); - - let frodo = schema.users.find(1); - let association = frodo.associationFor('user'); - - assert.equal(association.key, 'user'); - assert.equal(association.modelName, 'user'); - assert.equal(association.ownerModelName, 'user'); - assert.ok(frodo.inverseFor(association) === association, 'the implicit inverse was found'); - }); - - test('a named reflexive belongsTo association with an implicit inverse is correct', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ] - }), { - user: Model.extend({ - bestFriend: belongsTo('user') - }) - }); - - let frodo = schema.users.find(1); - let association = frodo.associationFor('bestFriend'); - - assert.equal(association.key, 'bestFriend'); - assert.equal(association.modelName, 'user'); - assert.equal(association.ownerModelName, 'user'); - assert.ok(frodo.inverseFor(association) === association, 'the implicit inverse was found'); - }); - - test('a named reflexive belongsTo association with an explicit inverse is correct', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ] - }), { - user: Model.extend({ - bestFriend: belongsTo('user', { inverse: 'bestFriend' }) - }) - }); - - let frodo = schema.users.find(1); - let association = frodo.associationFor('bestFriend'); - - assert.equal(association.key, 'bestFriend'); - assert.equal(association.modelName, 'user'); - assert.equal(association.ownerModelName, 'user'); - assert.ok(frodo.inverseFor(association) === association, 'the explicit inverse was found'); - }); - - test('a one-way reflexive belongsTo association with a null inverse is correct', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ] - }), { - user: Model.extend({ - user: belongsTo('user', { inverse: null }) - }) - }); - - let frodo = schema.users.find(1); - let association = frodo.associationFor('user'); - - assert.equal(association.key, 'user'); - assert.equal(association.modelName, 'user'); - assert.equal(association.ownerModelName, 'user'); - assert.ok(frodo.inverseFor(association) === null, 'there is no inverse'); - }); - - test('a named one-way way reflexive belongsTo association with a null inverse is correct', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ] - }), { - user: Model.extend({ - parent: belongsTo('user', { inverse: null }) - }) - }); - - let frodo = schema.users.find(1); - let association = frodo.associationFor('parent'); - - assert.equal(association.key, 'parent'); - assert.equal(association.modelName, 'user'); - assert.equal(association.ownerModelName, 'user'); - assert.ok(frodo.inverseFor(association) === null, 'there is no inverse'); - }); - - test('a one-to-one belongsTo association with an implicit inverse is correct', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ], - profiles: [ - { id: 1, type: 'Admin' } - ] - }), { - user: Model.extend({ - profile: belongsTo() - }), - profile: Model.extend({ - user: belongsTo() - }) - }); - - let admin = schema.profiles.find(1); - let association = admin.associationFor('user'); - - assert.equal(association.key, 'user'); - assert.equal(association.modelName, 'user'); - assert.equal(association.ownerModelName, 'profile'); - - let frodo = schema.users.find(1); - let inverse = frodo.inverseFor(association); - - assert.equal(inverse.key, 'profile'); - assert.equal(inverse.modelName, 'profile'); - assert.equal(inverse.ownerModelName, 'user'); - }); -}); diff --git a/tests/integration/orm/schema-verification/has-many-test.js b/tests/integration/orm/schema-verification/has-many-test.js deleted file mode 100644 index 55c2498af..000000000 --- a/tests/integration/orm/schema-verification/has-many-test.js +++ /dev/null @@ -1,81 +0,0 @@ -import { Model, hasMany } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Schema Verification | Has Many', function() { - test('a one-way has many association is correct', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ], - posts: [ - { id: 1, title: 'Lorem' } - ] - }), { - user: Model.extend({ - posts: hasMany() - }), - post: Model.extend() - }); - - let frodo = schema.users.find(1); - let association = frodo.associationFor('posts'); - - assert.equal(association.key, 'posts'); - assert.equal(association.modelName, 'post'); - assert.equal(association.ownerModelName, 'user'); - - let post = schema.posts.find(1); - - assert.ok(post.inverseFor(association) === null, 'there is no inverse'); - }); - - test('a named one-way has many association is correct', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ], - posts: [ - { id: 1, title: 'Lorem' } - ] - }), { - user: Model.extend({ - blogPosts: hasMany('post') - }), - post: Model.extend() - }); - - let frodo = schema.users.find(1); - let association = frodo.associationFor('blogPosts'); - - assert.equal(association.key, 'blogPosts'); - assert.equal(association.modelName, 'post'); - assert.equal(association.ownerModelName, 'user'); - - let post = schema.posts.find(1); - - assert.ok(post.inverseFor(association) === null, 'there is no inverse'); - }); - - test('a reflexive hasMany association with an implicit inverse is correct', function(assert) { - let schema = new Schema(new Db({ - tags: [ - { id: 1, name: 'economics' } - ] - }), { - tag: Model.extend({ - tags: hasMany() - }) - }); - - let tag = schema.tags.find(1); - let association = tag.associationFor('tags'); - - assert.equal(association.key, 'tags'); - assert.equal(association.modelName, 'tag'); - assert.equal(association.ownerModelName, 'tag'); - - assert.ok(tag.inverseFor(association) === association, 'the implicit inverse was found'); - }); -}); diff --git a/tests/integration/orm/schema-verification/mixed-test.js b/tests/integration/orm/schema-verification/mixed-test.js deleted file mode 100644 index bdeea839d..000000000 --- a/tests/integration/orm/schema-verification/mixed-test.js +++ /dev/null @@ -1,285 +0,0 @@ -import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import { module, test } from 'qunit'; - -module('Integration | ORM | Schema Verification | Mixed', function() { - test('unnamed one-to-many associations are correct', function(assert) { - let schema = new Schema(new Db({ - wordSmiths: [ - { id: 1, name: 'Frodo' } - ], - blogPosts: [ - { id: 1, title: 'Lorem' } - ] - }), { - wordSmith: Model.extend({ - blogPosts: hasMany() - }), - blogPost: Model.extend({ - wordSmith: belongsTo() - }) - }); - - let frodo = schema.wordSmiths.find(1); - let association = frodo.associationFor('blogPosts'); - - assert.equal(association.key, 'blogPosts'); - assert.equal(association.modelName, 'blog-post'); - assert.equal(association.ownerModelName, 'word-smith'); - - let post = schema.blogPosts.find(1); - - assert.deepEqual(post.inverseFor(association), post.associationFor('wordSmith')); - }); - - test('a named one-to-many association is correct', function(assert) { - let schema = new Schema(new Db({ - wordSmiths: [ - { id: 1, name: 'Frodo' } - ], - blogPosts: [ - { id: 1, title: 'Lorem' } - ] - }), { - wordSmith: Model.extend({ - posts: hasMany('blog-post') - }), - blogPost: Model.extend({ - author: belongsTo('word-smith') - }) - }); - - let frodo = schema.wordSmiths.find(1); - let association = frodo.associationFor('posts'); - - assert.equal(association.key, 'posts'); - assert.equal(association.modelName, 'blog-post'); - assert.equal(association.ownerModelName, 'word-smith'); - - let post = schema.blogPosts.find(1); - - assert.deepEqual(post.inverseFor(association), post.associationFor('author')); - }); - - test('multiple has-many associations of the same type', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ], - posts: [ - { id: 1, title: 'Lorem' } - ] - }), { - user: Model.extend({ - notes: hasMany('post', { inverse: 'author' }), - messages: hasMany('post', { inverse: 'messenger' }) - }), - post: Model.extend({ - author: belongsTo('user', { inverse: 'notes' }), - messenger: belongsTo('user', { inverse: 'messages' }) - }) - }); - - let frodo = schema.users.find(1); - let notesAssociation = frodo.associationFor('notes'); - - assert.equal(notesAssociation.key, 'notes'); - assert.equal(notesAssociation.modelName, 'post'); - assert.equal(notesAssociation.ownerModelName, 'user'); - - let post = schema.posts.find(1); - - assert.deepEqual(post.inverseFor(notesAssociation), post.associationFor('author')); - - let messagesAssociation = frodo.associationFor('messages'); - - assert.equal(messagesAssociation.key, 'messages'); - assert.equal(messagesAssociation.modelName, 'post'); - assert.equal(messagesAssociation.ownerModelName, 'user'); - - assert.deepEqual(post.inverseFor(messagesAssociation), post.associationFor('messenger')); - }); - - test('one-to-many reflexive association is correct', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ] - }), { - user: Model.extend({ - parent: belongsTo('user', { inverse: 'children' }), - children: hasMany('user', { inverse: 'parent' }) - }) - }); - - let frodo = schema.users.find(1); - let parentAssociation = frodo.associationFor('parent'); - - assert.equal(parentAssociation.key, 'parent'); - assert.equal(parentAssociation.modelName, 'user'); - assert.equal(parentAssociation.ownerModelName, 'user'); - - assert.deepEqual(frodo.inverseFor(parentAssociation), frodo.associationFor('children')); - }); - - test('one-to-many polymorphic association is correct', function(assert) { - let schema = new Schema(new Db({ - authors: [ - { id: 1, name: 'Peter' } - ], - posts: [ - { id: 1, title: 'Lorem' } - ], - articles: [ - { id: 1, title: 'Ipsum' } - ] - }), { - author: Model.extend({ - writings: hasMany({ polymorphic: true }) - }), - post: Model.extend({ - author: belongsTo('author', { inverse: 'writings' }) - }), - article: Model.extend({ - author: belongsTo('author', { inverse: 'writings' }) - }) - }); - - let author = schema.authors.find(1); - let writingsAssociation = author.associationFor('writings'); - - let post = schema.posts.find(1); - let postAuthorAssociation = post.associationFor('author'); - - let article = schema.articles.find(1); - let articleAuthorAssociation = article.associationFor('author'); - - assert.deepEqual(post.inverseFor(writingsAssociation), postAuthorAssociation); - assert.deepEqual(article.inverseFor(writingsAssociation), articleAuthorAssociation); - assert.deepEqual(author.inverseFor(postAuthorAssociation), writingsAssociation); - assert.deepEqual(author.inverseFor(postAuthorAssociation), writingsAssociation); - }); - - test('multiple implicit inverse associations with the same key throws an error', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ], - posts: [ - { id: 1, title: 'Lorem' } - ] - }), { - user: Model.extend({ - posts: hasMany('post') - }), - post: Model.extend({ - editor: belongsTo('user'), - authors: hasMany('user') - }) - }); - - let frodo = schema.users.find(1); - let userPostsAssociation = frodo.associationFor('posts'); - let post = schema.posts.find(1); - - assert.throws(function() { - post.inverseFor(userPostsAssociation); - }, /The post model has multiple possible inverse associations for the user.posts association./); - }); - - test('multiple explicit inverse associations with the same key throws an error', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ], - posts: [ - { id: 1, title: 'Lorem' } - ] - }), { - user: Model.extend({ - posts: hasMany('post', { inverse: 'authors' }) - }), - post: Model.extend({ - editor: belongsTo('user', { inverse: 'posts' }), - authors: hasMany('user', { inverse: 'posts' }) - }) - }); - - let frodo = schema.users.find(1); - let userPostsAssociation = frodo.associationFor('posts'); - let post = schema.posts.find(1); - - assert.throws(function() { - post.inverseFor(userPostsAssociation); - }, /The post model has defined multiple explicit inverse associations for the user.posts association./); - }); - - test('explicit inverse is chosen over implicit inverses', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ], - posts: [ - { id: 1, title: 'Lorem' } - ] - }), { - user: Model.extend({ - posts: hasMany('post', { inverse: 'authors' }) - }), - post: Model.extend({ - editor: belongsTo('user'), - authors: hasMany('user', { inverse: 'posts' }) - }) - }); - - let frodo = schema.users.find(1); - let userPostsAssociation = frodo.associationFor('posts'); - - assert.equal(userPostsAssociation.key, 'posts'); - assert.equal(userPostsAssociation.modelName, 'post'); - assert.equal(userPostsAssociation.ownerModelName, 'user'); - - let post = schema.posts.find(1); - - assert.deepEqual(post.inverseFor(userPostsAssociation), post.associationFor('authors')); - }); - - test('multiple explicit inverse associations with the same key but different models does not throw an error', function(assert) { - let schema = new Schema(new Db({ - users: [ - { id: 1, name: 'Frodo' } - ], - posts: [ - { id: 1, title: 'Lorem' } - ], - books: [ - { id: 1, title: 'Ipsum' } - ] - }), { - user: Model.extend({ - authoredPosts: hasMany('post', { inverse: 'authors' }), - authoredBooks: hasMany('book', { inverse: 'authors' }) - }), - post: Model.extend({ - authors: hasMany('user', { inverse: 'authoredPosts' }) - }), - book: Model.extend({ - authors: hasMany('user', { inverse: 'authoredBooks' }) - }) - }); - - let frodo = schema.users.find(1); - let post = schema.posts.find(1); - let book = schema.books.find(1); - - let userAuthoredPostsAssociation = frodo.associationFor('authoredPosts'); - let userAuthoredBooksAssociation = frodo.associationFor('authoredBooks'); - let postsAuthorsAssociation = post.associationFor('authors'); - let bookAuthorsAssociation = book.associationFor('authors'); - assert.deepEqual(post.inverseFor(userAuthoredPostsAssociation), post.associationFor('authors')); - assert.deepEqual(book.inverseFor(userAuthoredBooksAssociation), book.associationFor('authors')); - assert.deepEqual(frodo.inverseFor(postsAuthorsAssociation), frodo.associationFor('authoredPosts')); - assert.deepEqual(frodo.inverseFor(bookAuthorsAssociation), frodo.associationFor('authoredBooks')); - }); -}); diff --git a/tests/integration/orm/update-test.js b/tests/integration/orm/update-test.js deleted file mode 100644 index 6e55a8ee2..000000000 --- a/tests/integration/orm/update-test.js +++ /dev/null @@ -1,88 +0,0 @@ -import Schema from 'ember-cli-mirage/orm/schema'; -import Model from 'ember-cli-mirage/orm/model'; -import Db from 'ember-cli-mirage/db'; -import {module, test} from 'qunit'; - -module('Integration | ORM | update', function(hooks) { - hooks.beforeEach(function() { - this.db = new Db({ - users: [ - { id: 1, name: 'Link', location: 'Hyrule', evil: false }, - { id: 2, name: 'Zelda', location: 'Hyrule', evil: false } - ] - }); - - this.schema = new Schema(this.db, { - user: Model - }); - }); - - test('a collection can update its models with a key and value', function(assert) { - let collection = this.schema.users.all(); - collection.update('evil', true); - - assert.deepEqual(this.db.users, [ - { id: '1', name: 'Link', location: 'Hyrule', evil: true }, - { id: '2', name: 'Zelda', location: 'Hyrule', evil: true } - ]); - assert.deepEqual(collection.models[0].attrs, { id: '1', name: 'Link', location: 'Hyrule', evil: true }); - }); - - test('it can update its models with a hash of attrs', function(assert) { - let collection = this.schema.users.all(); - collection.update({ location: 'The water temple', evil: true }); - - assert.deepEqual(this.db.users, [ - { id: '1', name: 'Link', location: 'The water temple', evil: true }, - { id: '2', name: 'Zelda', location: 'The water temple', evil: true } - ]); - assert.deepEqual(collection.models[0].attrs, { id: '1', name: 'Link', location: 'The water temple', evil: true }); - assert.deepEqual(collection.models[1].attrs, { id: '2', name: 'Zelda', location: 'The water temple', evil: true }); - }); - - test('it can set an attribute and then save the model', function(assert) { - let user = this.schema.users.find(1); - - user.name = 'Young link'; - - assert.deepEqual(user.attrs, { id: '1', name: 'Young link', location: 'Hyrule', evil: false }); - assert.deepEqual(this.db.users.find(1), { id: '1', name: 'Link', location: 'Hyrule', evil: false }); - - user.save(); - - assert.deepEqual(user.attrs, { id: '1', name: 'Young link', location: 'Hyrule', evil: false }); - assert.deepEqual(this.db.users.find(1), { id: '1', name: 'Young link', location: 'Hyrule', evil: false }); - }); - - test('it can update and immediately persist a single attribute', function(assert) { - let link = this.schema.users.find(1); - link.update('evil', true); - - assert.deepEqual(link.attrs, { id: '1', name: 'Link', location: 'Hyrule', evil: true }); - assert.deepEqual(this.db.users.find(1), { id: '1', name: 'Link', location: 'Hyrule', evil: true }); - }); - - test('it can update a hash of attrs immediately', function(assert) { - var link = this.schema.users.find(1); - link.update({ name: 'Evil link', evil: true }); - - assert.deepEqual(link.attrs, { id: '1', name: 'Evil link', location: 'Hyrule', evil: true }); - assert.deepEqual(this.db.users.find(1), { id: '1', name: 'Evil link', location: 'Hyrule', evil: true }); - }); - - test('it can update a non-existing attribute', function(assert) { - var link = this.schema.users.find(1); - link.update({ name: 'Evil link', evil: true, reallyEvil: 'absolutely evil' }); - - assert.deepEqual(link.attrs, { id: '1', name: 'Evil link', location: 'Hyrule', evil: true, reallyEvil: 'absolutely evil' }); - assert.deepEqual(this.db.users.find(1), { id: '1', name: 'Evil link', location: 'Hyrule', evil: true, reallyEvil: 'absolutely evil' }); - }); - - test('if users sets incorrectly an attribute without using update, it will still work', function(assert) { - var link = this.schema.users.find(1); - link.reallyEvil = 'absolutely evil'; - link.update({ reallyEvil: 'a little flower', evil: true }); - assert.deepEqual(link.attrs, { id: '1', reallyEvil: 'a little flower', evil: true, location: 'Hyrule', name: 'Link' }); - assert.deepEqual(this.db.users.find(1), { id: '1', reallyEvil: 'a little flower', evil: true, location: 'Hyrule', name: 'Link' }); - }); -}); diff --git a/tests/integration/orm/where-test.js b/tests/integration/orm/where-test.js deleted file mode 100644 index 8e797b6d7..000000000 --- a/tests/integration/orm/where-test.js +++ /dev/null @@ -1,49 +0,0 @@ -import Schema from 'ember-cli-mirage/orm/schema'; -import Model from 'ember-cli-mirage/orm/model'; -import Db from 'ember-cli-mirage/db'; -import Collection from 'ember-cli-mirage/orm/collection'; -import {module, test} from 'qunit'; - -let schema; -let User = Model.extend(); - -module('Integration | ORM | #where', function(hooks) { - hooks.beforeEach(function() { - let db = new Db({ users: [ - { id: 1, name: 'Link', good: true }, - { id: 2, name: 'Zelda', good: true }, - { id: 3, name: 'Ganon', good: false } - ] }); - - schema = new Schema(db, { - user: User - }); - }); - - test('it returns models that match a query with where', function(assert) { - let users = schema.users.where({ good: false }); - - assert.ok(users instanceof Collection, 'it returns a collection'); - assert.equal(users.models.length, 1); - assert.ok(users.models[0] instanceof User); - assert.deepEqual(users.models[0].attrs, { id: '3', name: 'Ganon', good: false }); - }); - - test('it returns models that match using a query function', function(assert) { - let users = schema.users.where(function(rec) { - return !rec.good; - }); - - assert.ok(users instanceof Collection, 'it returns a collection'); - assert.equal(users.models.length, 1); - assert.ok(users.models[0] instanceof User); - assert.deepEqual(users.models[0].attrs, { id: '3', name: 'Ganon', good: false }); - }); - - test('it returns an empty collection if no models match a query', function(assert) { - let users = schema.users.where({ name: 'Link', good: false }); - - assert.ok(users instanceof Collection, 'it returns a collection'); - assert.equal(users.models.length, 0); - }); -}); diff --git a/tests/integration/passthrough-test.js b/tests/integration/passthrough-test.js deleted file mode 100644 index 81f5b7c7b..000000000 --- a/tests/integration/passthrough-test.js +++ /dev/null @@ -1,249 +0,0 @@ -import {module, test} from 'qunit'; -import Server from 'ember-cli-mirage/server'; -import promiseAjax from '../helpers/promise-ajax'; - -module('Integration | Passthrough', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'development' - }); - this.server.timing = 0; - this.server.logging = false; - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('it can passthrough individual paths', function(assert) { - assert.expect(2); - let done1 = assert.async(); - let done2 = assert.async(); - let { server } = this; - - server.loadConfig(function() { - this.get('/contacts', function() { - return 123; - }); - this.passthrough('/addresses'); - }); - - promiseAjax({ - method: 'GET', - url: '/contacts' - }).then((response) => { - assert.equal(response.data, 123); - done1(); - }); - - promiseAjax({ - method: 'GET', - url: '/addresses' - }).catch((error) => { - assert.equal(error.xhr.status, 404); - done2(); - }); - }); - - test('it can passthrough certain verbs for individual paths', function(assert) { - assert.expect(3); - let done1 = assert.async(); - let done2 = assert.async(); - let done3 = assert.async(); - let { server } = this; - - server.loadConfig(function() { - this.get('/contacts', function() { - return 123; - }); - this.passthrough('/addresses', ['post']); - }); - server.pretender.unhandledRequest = function(/* verb, path */) { - assert.ok(true, 'it doesnt passthrough GET'); - done2(); - }; - - promiseAjax({ - method: 'GET', - url: '/contacts' - }).then((response) => { - assert.equal(response.data, 123); - done1(); - }); - - promiseAjax({ - method: 'GET', - url: '/addresses' - }); - - promiseAjax({ - method: 'POST', - url: '/addresses' - }).catch((error) => { - assert.equal(error.xhr.status, 404); - done3(); - }); - }); - - test('it can passthrough all verbs by default', function(assert) { - let verbs = ['GET', 'HEAD', 'PUT', 'POST', 'PATCH', 'DELETE', 'OPTIONS']; - assert.expect(verbs.length); - - let done = verbs.map(() => assert.async()); - let { server } = this; - - server.loadConfig(function() { - this.passthrough('/addresses'); - }); - - verbs.forEach((verb, index) => { - promiseAjax({ - method: verb, - url: '/addresses' - }).catch(error => { - assert.equal(error.xhr.status, 404); - done[index](); - }); - }); - }); - - test('it can passthrough multiple paths in a single call', function(assert) { - assert.expect(2); - let done1 = assert.async(); - let done2 = assert.async(); - let { server } = this; - - server.loadConfig(function() { - this.get('/contacts', function() { - return 123; - }); - this.passthrough('/contacts', '/addresses'); - }); - - promiseAjax({ - method: 'GET', - url: '/contacts' - }).catch((error) => { - assert.equal(error.xhr.status, 404); - done1(); - }); - - promiseAjax({ - method: 'POST', - url: '/addresses' - }).catch((error) => { - assert.equal(error.xhr.status, 404); - done2(); - }); - }); - - test('user can call passthrough multiple times', function(assert) { - assert.expect(2); - let done1 = assert.async(); - let done2 = assert.async(); - let { server } = this; - - server.loadConfig(function() { - this.passthrough('/contacts'); - this.passthrough('/addresses', ['post']); - }); - - promiseAjax({ - method: 'GET', - url: '/contacts' - }).catch((error) => { - assert.equal(error.xhr.status, 404); - done1(); - }); - - promiseAjax({ - method: 'POST', - url: '/addresses' - }).catch((error) => { - assert.equal(error.xhr.status, 404); - done2(); - }); - }); - - test('passthrough without args allows all paths on the current domain to passthrough', function(assert) { - assert.expect(2); - let done1 = assert.async(); - let done2 = assert.async(); - let { server } = this; - - server.loadConfig(function() { - this.get('/contacts', function() { - return 123; - }); - this.passthrough(); - }); - - promiseAjax({ - method: 'GET', - url: '/contacts' - }).then((response) => { - assert.equal(response.data, 123); - done1(); - }); - - promiseAjax({ - method: 'GET', - url: '/addresses' - }).catch((error) => { - assert.equal(error.xhr.status, 404); - done2(); - }); - }); - - test('passthrough without args allows index route on current domain to passthrough', function(assert) { - assert.expect(2); - let done1 = assert.async(); - let done2 = assert.async(); - let { server } = this; - - server.loadConfig(function() { - this.get('/contacts', function() { - return 123; - }); - this.passthrough(); - }); - - promiseAjax({ - method: 'GET', - url: '/contacts' - }).then((response) => { - assert.equal(response.data, 123, 'contacts is intercepted'); - done1(); // test will fail bc only 1 assertion, but we don't have to wait - }); - - promiseAjax({ - method: 'GET', - url: '/' - }).then((response) => { - // a passthrough request to index on the current domain - // actually succeeds here, since that's where the test runner is served - assert.ok(response.data, '/ is passed through'); - done2(); - }).catch(() => { - done2(); // test will fail bc only 1 assertion, but we don't have to wait - }); - }); - - test('it can passthrough other-origin hosts', function(assert) { - assert.expect(1); - let done1 = assert.async(); - let { server } = this; - - server.loadConfig(function() { - this.passthrough('http://api.foo.bar/**'); - }); - - promiseAjax({ - method: 'GET', - url: '/addresses' - }).catch((error) => { - assert.ok(true); - done1(); - }); - }); -}); diff --git a/tests/integration/route-handlers/assertions-test.js b/tests/integration/route-handlers/assertions-test.js deleted file mode 100644 index 086761269..000000000 --- a/tests/integration/route-handlers/assertions-test.js +++ /dev/null @@ -1,64 +0,0 @@ -import { module, test } from 'qunit'; - -import { Model, JSONAPISerializer } from 'ember-cli-mirage'; -import Server from 'ember-cli-mirage/server'; -import FunctionRouteHandler from 'ember-cli-mirage/route-handlers/function'; - -module('Integration | Route handlers | Assertions', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'development', - models: { - user: Model.extend({ - }), - comment: Model.extend({ - }) - }, - serializers: { - application: JSONAPISerializer - } - }); - this.server.timing = 0; - this.server.logging = false; - - this.server.post('/users'); - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('a helpful assert is thrown if a relationship passed in a request is not a defined association on the posted model', async function(assert) { - assert.expect(1); - - let request = { - requestHeaders: {}, - method: 'POST', - url: '/users', - requestBody: JSON.stringify({ - data: { - type: 'user', - attributes: { - name: 'Jacob Dylan' - }, - relationships: { - 'comments': { - data: { - type: 'comment', - name: 'Bob Dylan' - } - } - } - } - }) - }; - - this.functionHandler = new FunctionRouteHandler(this.server.schema, this.server.serializerOrRegistry); - this.functionHandler.path = '/users'; - this.functionHandler.request = request; - - assert.throws(function() { - this.functionHandler.normalizedRequestAttrs(); - }, /You're passing the relationship 'comments' to the 'user' model via a POST to '\/users', but you did not define the 'comments' association on the 'user' model./); - }); -}); diff --git a/tests/integration/route-handlers/delete-shorthand-test.js b/tests/integration/route-handlers/delete-shorthand-test.js deleted file mode 100644 index c5a8c894c..000000000 --- a/tests/integration/route-handlers/delete-shorthand-test.js +++ /dev/null @@ -1,89 +0,0 @@ -import {module, test} from 'qunit'; -import Server from 'ember-cli-mirage/server'; -import Model from 'ember-cli-mirage/orm/model'; -import Mirage from 'ember-cli-mirage'; -import DeleteShorthandRouteHandler from 'ember-cli-mirage/route-handlers/shorthands/delete'; -import JSONAPISerializer from 'ember-cli-mirage/serializers/json-api-serializer'; - -module('Integration | Route Handlers | DELETE shorthand', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'development', - models: { - wordSmith: Model.extend({ - blogPosts: Mirage.hasMany() - }), - blogPost: Model - } - }); - this.server.timing = 0; - this.server.logging = false; - - let wordSmiths = [ - { id: 1, name: 'Ganon', blogPostIds: [1] } - ]; - let blogPosts = [ - { id: 1, title: 'Lorem', wordSmithId: '1' }, - { id: 2, title: 'Another', wordSmithId: '2' } - ]; - this.server.db.loadData({ wordSmiths, blogPosts }); - - this.schema = this.server.schema; - this.serializer = new JSONAPISerializer(); - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('undefined shorthand deletes the record and returns null', function(assert) { - let request = { url: '/word-smiths/1', params: { id: '1' } }; - let handler = new DeleteShorthandRouteHandler(this.schema, this.serializer, undefined, '/word-smiths/:id'); - - let response = handler.handle(request); - - assert.equal(this.schema.db.wordSmiths.length, 0); - assert.equal(response, null); - }); - - test('query params are ignored', function(assert) { - let request = { url: '/word-smiths/1?foo=bar', params: { id: '1' }, queryParams: { foo: 'bar' } }; - let handler = new DeleteShorthandRouteHandler(this.schema, this.serializer, undefined, '/word-smiths/:id'); - - let response = handler.handle(request); - - assert.equal(this.schema.db.wordSmiths.length, 0); - assert.equal(response, null); - }); - - test('string shorthand deletes the record of the specified type', function(assert) { - let request = { url: '/word-smiths/1?foo=bar', params: { id: '1' }, queryParams: { foo: 'bar' } }; - let handler = new DeleteShorthandRouteHandler(this.schema, this.serializer, undefined, '/word-smiths/:id'); - - let response = handler.handle(request); - - assert.equal(this.schema.db.wordSmiths.length, 0); - assert.equal(response, null); - }); - - test('array shorthand deletes the record and all related records', function(assert) { - let request = { url: '/word-smiths/1', params: { id: '1' } }; - let handler = new DeleteShorthandRouteHandler(this.schema, this.serializer, ['word-smith', 'blog-posts']); - - let response = handler.handle(request); - - assert.equal(this.schema.db.wordSmiths.length, 0); - assert.equal(this.schema.db.blogPosts.length, 1); - assert.equal(response, null); - }); - - test('if a shorthand tries to access an unknown type it throws an error', function(assert) { - let request = { url: '/foobars/1', params: { id: '1' } }; - let handler = new DeleteShorthandRouteHandler(this.schema, this.serializer, undefined, '/foobars/:id'); - - assert.throws(function() { - handler.handle(request); - }, /model doesn't exist/); - assert.ok(true); - }); -}); diff --git a/tests/integration/route-handlers/function-handler/basic-test.js b/tests/integration/route-handlers/function-handler/basic-test.js deleted file mode 100644 index ac7375e0b..000000000 --- a/tests/integration/route-handlers/function-handler/basic-test.js +++ /dev/null @@ -1,117 +0,0 @@ -import { module, test } from 'qunit'; -import { Promise } from 'rsvp'; -import { Server, Model, ActiveModelSerializer, Response } from 'ember-cli-mirage'; -import promiseAjax from '../../../helpers/promise-ajax'; - -module('Integration | Route handlers | Function handler', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'development', - models: { - user: Model.extend({ - }) - }, - serializers: { - application: ActiveModelSerializer, - sparseUser: ActiveModelSerializer.extend({ - attrs: ['id', 'name', 'tall'] - }) - } - }); - this.server.timing = 0; - this.server.logging = false; - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('a meaningful error is thrown if a custom route handler throws an error', async function(assert) { - this.server.get('/users', function() { - throw 'I goofed'; - }); - - assert.rejects( - promiseAjax({ method: 'GET', url: '/users' }), - function(ajaxError) { - let text = ajaxError.xhr.responseText; - let line1 = text.indexOf(`Mirage: Your GET handler for the url /users threw an error`) > 0; - let line2 = text.indexOf(`I goofed`) > 0; - - return line1 && line2; - } - ); - }); - - test('mirage response string is not serialized to string', async function(assert) { - assert.expect(1); - - this.server.get('/users', function() { - return new Response(200, { 'Content-Type': 'text/csv' }, 'firstname,lastname\nbob,dylon'); - }); - - let { data } = await promiseAjax({ method: 'GET', url: '/users' }); - assert.equal(data, 'firstname,lastname\nbob,dylon'); - }); - - test('it can return a promise with non-serializable content', async function(assert) { - assert.expect(1); - - this.server.get('/users', function() { - return new Promise(resolve => { - resolve(new Response(200, { 'Content-Type': 'text/csv' }, 'firstname,lastname\nbob,dylan')); - }); - }); - - let { data } = await promiseAjax({ method: 'GET', url: '/users' }); - assert.equal(data, 'firstname,lastname\nbob,dylan'); - }); - - test('it can return a promise with serializable content', async function(assert) { - assert.expect(1); - - let user = this.server.create('user', { name: 'Sam' }); - - this.server.get('/users', function(schema) { - return new Promise(resolve => { - resolve(schema.users.all()); - }); - }); - - let { data } = await promiseAjax({ method: 'GET', url: '/users' }); - assert.deepEqual(data, { users: [ { id: user.id, name: 'Sam' } ] }); - }); - - test('it can return a promise with an empty string', async function(assert) { - assert.expect(4); - - this.server.get('/users', function() { - return new Promise(resolve => { - resolve(new Response(200, { 'Content-Type': 'text/csv' }, '')); - }); - }); - - let { data, xhr } = await promiseAjax({ method: 'GET', url: '/users' }); - - assert.deepEqual(data, ''); - assert.equal(xhr.responseText, ""); - assert.equal(xhr.status, 200); - assert.equal(xhr.getAllResponseHeaders().trim(), "Content-Type: text/csv"); - }); - - test(`it can serialize a POJA of models`, async function(assert) { - assert.expect(1); - - this.server.createList('user', 3); - this.server.get('/users', (schema) => { - return schema.users.all().models; - }); - - let { data } = await promiseAjax({ - method: 'GET', - url: '/users' - }); - - assert.deepEqual(data, [{ id: '1' }, { id: '2' }, { id: '3' }]); - }); -}); diff --git a/tests/integration/route-handlers/function-handler/normalize-request-attrs-test.js b/tests/integration/route-handlers/function-handler/normalize-request-attrs-test.js deleted file mode 100644 index 0c0158218..000000000 --- a/tests/integration/route-handlers/function-handler/normalize-request-attrs-test.js +++ /dev/null @@ -1,167 +0,0 @@ -import { module, test } from 'qunit'; -import { Model, ActiveModelSerializer } from 'ember-cli-mirage'; -import Server from 'ember-cli-mirage/server'; -import promiseAjax from '../../../helpers/promise-ajax'; - -module('Integration | Route handlers | Function handler | #normalizedRequestAttrs', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'development', - models: { - user: Model.extend({ - }), - fineComment: Model.extend({ - }) - }, - serializers: { - application: ActiveModelSerializer - } - }); - this.server.timing = 0; - this.server.logging = false; - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test(`it returns an object with the primary resource's attrs and belongsTo keys camelized`, async function(assert) { - assert.expect(1); - - this.server.post('/users', function() { - let attrs = this.normalizedRequestAttrs(); - - assert.deepEqual(attrs, { - firstName: 'Sam', - lastName: 'Selikoff', - teamId: 1 - }); - - return {}; - }); - - await promiseAjax({ - method: 'POST', - url: '/users', - contentType: 'application/json', - data: JSON.stringify({ - user: { - first_name: 'Sam', - last_name: 'Selikoff', - team_id: 1 - } - }) - }); - }); - - test(`it works for compound names`, async function(assert) { - assert.expect(1); - - this.server.post('/fine-comments', function() { - let attrs = this.normalizedRequestAttrs(); - - assert.deepEqual(attrs, { - shortText: 'lorem ipsum' - }); - - return {}; - }); - - await promiseAjax({ - method: 'POST', - url: '/fine-comments', - contentType: 'application/json', - data: JSON.stringify({ - fine_comment: { - short_text: 'lorem ipsum' - } - }) - }); - }); - - test(`it shows a meaningful error message if it cannot infer the modelname from the URL`, async function(assert) { - assert.expect(1); - - this.server.post('/users/create', function() { - this.normalizedRequestAttrs(); - }); - - assert.rejects( - promiseAjax({ method: 'POST', url: '/users/create' }), - function(ajaxError) { - return ajaxError.xhr.responseText.indexOf(`the detected model of 'create' does not exist`) > -1; - } - ); - }); - - test(`it accepts an optional modelName if it cannot be inferred from the path `, async function(assert) { - assert.expect(1); - - this.server.post('/users/create', function() { - let attrs = this.normalizedRequestAttrs('user'); - - assert.deepEqual(attrs, { - firstName: 'Sam', - lastName: 'Selikoff', - teamId: 1 - }); - - return {}; - }); - - await promiseAjax({ - method: 'POST', - url: '/users/create', - contentType: 'application/json', - data: JSON.stringify({ - user: { - first_name: 'Sam', - last_name: 'Selikoff', - team_id: 1 - } - }) - }); - }); - - test(`it errors if the optional parameter is camelized for a model with a compount name`, async function(assert) { - assert.expect(1); - - this.server.post('/fine-comments/create', function() { - this.normalizedRequestAttrs('fineComment'); - }); - - assert.rejects( - promiseAjax({ method: 'POST', url: '/fine-comments/create' }), - function(ajaxError) { - return ajaxError.xhr.responseText.indexOf(`You called normalizedRequestAttrs('fineComment'), but normalizedRequestAttrs was intended to be used with the dasherized version of the model type. Please change this to normalizedRequestAttrs('fine-comment')`) > 0; - } - ); - }); - - test(`it works with a form encoded request that has a lower-case content-type (issue 1398)`, async function(assert) { - assert.expect(1); - - this.server.post('/form-test', function() { - // Easiest way I could figure out to change the capitalization of the Content-Type header. Tried - // to do this from the Ajax side but jquery kept capitalizing the header. - this.request.requestHeaders['content-type'] = this.request.requestHeaders['Content-Type']; - delete this.request.requestHeaders['Content-Type']; - - let attrs = this.normalizedRequestAttrs('user'); - - assert.deepEqual(attrs, { - name: 'Sam Selikoff', - company: 'TED', - email: 'sam.selikoff@gmail.com' - }); - - return {}; - }); - - await promiseAjax({ - method: 'POST', - url: '/form-test', - data: 'name=Sam+Selikoff&company=TED&email=sam.selikoff@gmail.com' - }); - }); -}); diff --git a/tests/integration/route-handlers/function-handler/serialize-test.js b/tests/integration/route-handlers/function-handler/serialize-test.js deleted file mode 100644 index f49f98529..000000000 --- a/tests/integration/route-handlers/function-handler/serialize-test.js +++ /dev/null @@ -1,152 +0,0 @@ -import { module, test } from 'qunit'; -import { Server, Model, Collection, ActiveModelSerializer } from 'ember-cli-mirage'; -import { uniqBy } from 'lodash-es'; -import promiseAjax from '../../../helpers/promise-ajax'; - -module('Integration | Route handlers | Function handler | #serialize', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'development', - models: { - user: Model.extend({ - }) - }, - serializers: { - application: ActiveModelSerializer, - sparseUser: ActiveModelSerializer.extend({ - attrs: ['id', 'name', 'tall'] - }) - } - }); - this.server.timing = 0; - this.server.logging = false; - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('it uses the default serializer on a model', async function(assert) { - assert.expect(1); - - this.server.create('user', { name: 'Sam' }); - - this.server.get('/users', function(schema) { - let user = this.schema.users.first(); - let json = this.serialize(user); - - assert.deepEqual(json, { - user: { - id: '1', - name: 'Sam' - } - }); - - return true; - }); - - await promiseAjax({ method: 'GET', url: '/users' }); - }); - - test('it uses the default serializer on a collection', async function(assert) { - assert.expect(1); - - this.server.create('user', { name: 'Sam' }); - - this.server.get('/users', function(schema) { - let users = this.schema.users.all(); - let json = this.serialize(users); - - assert.deepEqual(json, { - users: [ - { id: '1', name: 'Sam' } - ] - }); - - return true; - }); - - await promiseAjax({ method: 'GET', url: '/users' }); - }); - - test('it takes an optional serializer type', async function(assert) { - assert.expect(1); - - this.server.create('user', { name: 'Sam', tall: true, evil: false }); - this.server.create('user', { name: 'Ganondorf', tall: true, evil: true }); - - this.server.get('/users', function(schema) { - let users = schema.users.all(); - let json = this.serialize(users, 'sparse-user'); - - assert.deepEqual(json, { - users: [ - { id: '1', name: 'Sam', tall: true }, - { id: '2', name: 'Ganondorf', tall: true } - ] - }); - - return true; - }); - - await promiseAjax({ method: 'GET', url: '/users' }); - }); - - test('it throws an error when trying to specify a serializer that doesnt exist', async function(assert) { - assert.expect(1); - - this.server.create('user', { name: 'Sam' }); - this.server.get('/users', function(schema) { - let users = schema.users.all(); - - this.serialize(users, 'foo-user'); - }); - - assert.rejects( - promiseAjax({ method: 'GET', url: '/users' }), - function(ajaxError) { - return ajaxError.xhr.responseText.indexOf(`that serializer doesn't exist`) > 0; - } - ); - }); - - test('it noops on plain JS arrays', async function(assert) { - assert.expect(1); - - this.server.create('user', { name: 'Sam' }); - this.server.create('user', { name: 'Ganondorf' }); - - this.server.get('/users', function(schema) { - let names = schema.users.all().models.map(user => user.name); - let json = this.serialize(names); - - assert.deepEqual(json, names); - }); - - await promiseAjax({ method: 'GET', url: '/users' }); - }); - - test('it can take an optional serializer type on a Collection', async function(assert) { - assert.expect(1); - - this.server.create('user', { name: 'Sam', tall: true, evil: false }); - this.server.create('user', { name: 'Sam', tall: true, evil: false }); - this.server.create('user', { name: 'Ganondorf', tall: true, evil: true }); - - this.server.get('/users', function(schema) { - let users = schema.users.all().models; - let uniqueNames = uniqBy(users, 'name'); - let collection = new Collection('user', uniqueNames); - let json = this.serialize(collection, 'sparse-user'); - - assert.deepEqual(json, { - users: [ - { id: '1', name: 'Sam', tall: true }, - { id: '3', name: 'Ganondorf', tall: true } - ] - }); - }); - - await promiseAjax({ method: 'GET', url: '/users' }); - }); -}); diff --git a/tests/integration/route-handlers/get-shorthand-test.js b/tests/integration/route-handlers/get-shorthand-test.js deleted file mode 100644 index 29b3d1eb7..000000000 --- a/tests/integration/route-handlers/get-shorthand-test.js +++ /dev/null @@ -1,243 +0,0 @@ -import { module, test } from 'qunit'; -import { - Model, - hasMany, - belongsTo, - JSONAPISerializer, - RestSerializer, - Response -} from 'ember-cli-mirage'; -import Collection from 'ember-cli-mirage/orm/collection'; -import Server from 'ember-cli-mirage/server'; -import GetShorthandRouteHandler from 'ember-cli-mirage/route-handlers/shorthands/get'; - -module('Integration | Route Handlers | GET shorthand', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'development', - models: { - author: Model.extend({ - posts: hasMany() - }), - post: Model.extend({ - author: belongsTo(), - comments: hasMany() - }), - comment: Model.extend({ - post: belongsTo() - }), - photo: Model, - 'project-owner': Model - } - }); - this.server.timing = 0; - this.server.logging = false; - - this.authors = [ - { id: 1, name: 'Link' }, - { id: 2, name: 'Zelda' }, - { id: 3, name: 'Epona' } - ]; - this.posts = [ - { id: 1, title: 'Lorem', authorId: 1 }, - { id: 2, title: 'Ipsum', authorId: 1 } - ]; - this.photos = [ - { id: 1, title: 'Amazing', location: 'Hyrule' }, - { id: 2, title: 'Photo', location: 'Goron City' } - ]; - this.projectOwners = [ - { id: 1, name: 'Nintendo' } - ]; - this.server.db.loadData({ - authors: this.authors, - posts: this.posts, - photos: this.photos, - projectOwners: this.projectOwners - }); - - this.schema = this.server.schema; - this.serializer = new JSONAPISerializer(); - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('undefined shorthand returns the collection of models', function(assert) { - let request = { url: '/authors' }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors'); - - let authors = handler.handle(request); - - assert.equal(authors.models.length, 3); - assert.ok(authors.models[0] instanceof Model); - assert.equal(authors.models[0].modelName, 'author'); - }); - - test('undefined shorthand ignores query params', function(assert) { - let request = { url: '/authors?foo=bar' }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors'); - - let authors = handler.handle(request); - - assert.equal(authors.models.length, 3); - assert.ok(authors.models[0] instanceof Model); - assert.equal(authors.models[0].modelName, 'author'); - }); - - test('undefined shorthand can return a single model', function(assert) { - let request = { url: '/authors/2', params: { id: 2 } }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors/:id'); - - let author = handler.handle(request); - - assert.ok(author instanceof Model); - assert.equal(author.modelName, 'author'); - assert.equal(author.name, 'Zelda'); - }); - - test('undefined shorthand returns a 404 if a singular resource does not exist', function(assert) { - let request = { url: '/authors/99', params: { id: 99 } }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors/:id'); - - let author = handler.handle(request); - - assert.ok(author instanceof Response); - assert.equal(author.code, 404); - }); - - test('undefined shorthand ignores query params for a singular resource', function(assert) { - let request = { url: '/authors/2?foo=bar', params: { id: 2 } }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors/:id'); - - let author = handler.handle(request); - - assert.ok(author instanceof Model); - assert.equal(author.modelName, 'author'); - assert.equal(author.name, 'Zelda'); - }); - - test('undefined shorthand with coalesce true returns the appropriate models [JSONAPI]', function(assert) { - let request = { url: '/authors?filter[id]=1,3', queryParams: { 'filter[id]': '1,3' } }; - let options = { coalesce: true }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors', options); - - let authors = handler.handle(request); - - assert.equal(authors.models.length, 2); - assert.deepEqual(authors.models.map((author) => author.name), ['Link', 'Epona']); - }); - - test('undefined shorthand with coalesce true returns the appropriate models [REST]', function(assert) { - let request = { url: '/authors?ids[]=1&ids[]=3', queryParams: { ids: [1, 3] } }; - let options = { coalesce: true }; - let handler = new GetShorthandRouteHandler(this.schema, new RestSerializer(), undefined, '/authors', options); - - let authors = handler.handle(request); - - assert.equal(authors.models.length, 2); - assert.deepEqual(authors.models.map((author) => author.name), ['Link', 'Epona']); - }); - - test('string shorthand returns the correct collection of models', function(assert) { - let request = { url: '/people' }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, 'author'); - - let authors = handler.handle(request); - - assert.equal(authors.models.length, 3); - assert.ok(authors.models[0] instanceof Model); - assert.equal(authors.models[0].modelName, 'author'); - }); - - test('string shorthand with an id returns the correct model', function(assert) { - let request = { url: '/people/2', params: { id: 2 } }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, 'author'); - - let author = handler.handle(request); - - assert.ok(author instanceof Model); - assert.equal(author.modelName, 'author'); - assert.equal(author.name, 'Zelda'); - }); - - test('string shorthand with an id 404s if the model is not found', function(assert) { - let request = { url: '/people/99', params: { id: 99 } }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, 'author'); - - let author = handler.handle(request); - - assert.ok(author instanceof Response); - assert.equal(author.code, 404); - }); - - test('string shorthand with coalesce returns the correct models [JSONAPI]', function(assert) { - let request = { url: '/authors?filter[id]=1,3', queryParams: { 'filter[id]': '1,3' } }; - let options = { coalesce: true }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, 'author', '/people', options); - - let authors = handler.handle(request); - - assert.equal(authors.models.length, 2); - assert.deepEqual(authors.models.map((author) => author.name), ['Link', 'Epona']); - }); - - test('string shorthand with coalesce returns the correct models [REST]', function(assert) { - let request = { url: '/people?ids[]=1&ids[]=3', queryParams: { ids: [1, 3] } }; - let options = { coalesce: true }; - let handler = new GetShorthandRouteHandler(this.schema, new RestSerializer(), 'author', '/people', options); - - let authors = handler.handle(request); - - assert.equal(authors.models.length, 2); - assert.deepEqual(authors.models.map((author) => author.name), ['Link', 'Epona']); - }); - - test('array shorthand returns the correct models', function(assert) { - let url = '/home'; - let request = { url }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, ['authors', 'photos'], url); - - let models = handler.handle(request); - - assert.ok(models[0] instanceof Collection); - assert.equal(models[0].modelName, 'author'); - assert.equal(models[0].models.length, this.authors.length); - - assert.ok(models[1] instanceof Collection); - assert.equal(models[1].modelName, 'photo'); - assert.equal(models[1].models.length, this.photos.length); - }); - - test('array shorthand for a singular resource errors', function(assert) { - let url = '/authors/1'; - let request = { url, params: { id: 1 } }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, ['author', 'posts'], url); - - assert.throws(function() { - handler.handle(request); - }, /create a serializer/); - }); - - test('shorthand for list of models with a dash in their name', function(assert) { - let url = '/project-owners'; - let request = { url }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, undefined, url); - let models = handler.handle(request); - - assert.equal(models.models.length, 1); - assert.ok(models.models[0] instanceof Model); - assert.equal(models.models[0].modelName, 'project-owner'); - }); - - test('if a shorthand tries to access an unknown type it throws an error', function(assert) { - let url = '/foobars'; - let request = { url }; - let handler = new GetShorthandRouteHandler(this.schema, this.serializer, undefined, url); - - assert.throws(function() { - handler.handle(request); - }, /model doesn't exist/); - }); -}); diff --git a/tests/integration/route-handlers/head-shorthand-test.js b/tests/integration/route-handlers/head-shorthand-test.js deleted file mode 100644 index e1c4426f5..000000000 --- a/tests/integration/route-handlers/head-shorthand-test.js +++ /dev/null @@ -1,125 +0,0 @@ -import { module, test } from 'qunit'; -import { - Model, - JSONAPISerializer, - Response -} from 'ember-cli-mirage'; -import Server from 'ember-cli-mirage/server'; -import HeadShorthandRouteHandler from 'ember-cli-mirage/route-handlers/shorthands/head'; - -module('Integration | Route Handlers | HEAD shorthand', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'development', - models: { - author: Model, - photo: Model - } - }); - this.server.timing = 0; - this.server.logging = false; - - this.authors = [ - { id: 1, name: 'Link' }, - { id: 2, name: 'Zelda' }, - { id: 3, name: 'Epona' } - ]; - this.photos = [ - { id: 1, title: 'Amazing', location: 'Hyrule' }, - { id: 2, title: 'Photo', location: 'Goron City' } - ]; - this.server.db.loadData({ - authors: this.authors, - photos: this.photos - }); - - this.schema = this.server.schema; - this.serializer = new JSONAPISerializer(); - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('undefined shorthand with an ID that is not in the DB will return a 404 Response', function(assert) { - let request = { url: '/authors', params: { id: 101 } }; - let handler = new HeadShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors'); - - let response = handler.handle(request); - - assert.ok(response instanceof Response); - assert.equal(response.code, 404); - }); - - test('undefined shorthand with an ID that is in the DB will return a 204 Response', function(assert) { - let request = { url: '/authors', params: { id: 1 } }; - let handler = new HeadShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors'); - - let response = handler.handle(request); - - assert.ok(response instanceof Response); - assert.equal(response.code, 204); - }); - - test('undefined shorthand with coalesce true will return a 204 response if one of the IDs are found', function(assert) { - let request = { url: '/authors?ids[]=1&ids[]=3', queryParams: { ids: [1, 3] } }; - let options = { coalesce: true }; - let handler = new HeadShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors', options); - - let response = handler.handle(request); - - assert.ok(response instanceof Response); - assert.equal(response.code, 204); - }); - - test('undefined shorthand string (no id) shorthand returns a 204 (regardless of the length of the collection)', function(assert) { - let request = { url: '/authors' }; - let handler = new HeadShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors'); - - let response = handler.handle(request); - - assert.ok(response instanceof Response); - assert.equal(response.code, 204); - }); - - test('string shorthand with an ID that is not in the DB will return a 404 Response', function(assert) { - let request = { url: '/authors', params: { id: 101 } }; - let handler = new HeadShorthandRouteHandler(this.schema, this.serializer, 'author'); - - let response = handler.handle(request); - - assert.ok(response instanceof Response); - assert.equal(response.code, 404); - }); - - test('string shorthand with an ID that is in the DB will return a 204 Response', function(assert) { - let request = { url: '/authors', params: { id: 1 } }; - let handler = new HeadShorthandRouteHandler(this.schema, this.serializer, 'author'); - - let response = handler.handle(request); - - assert.ok(response instanceof Response); - assert.equal(response.code, 204); - }); - - test('string shorthand with coalesce true will return a 204 response if one of the IDs are found', function(assert) { - let request = { url: '/authors?ids[]=1&ids[]=3', queryParams: { ids: [1, 3] } }; - let options = { coalesce: true }; - let handler = new HeadShorthandRouteHandler(this.schema, this.serializer, 'author', '/people', options); - - let response = handler.handle(request); - - assert.ok(response instanceof Response); - assert.equal(response.code, 204); - }); - - test('string shorthand string (no id) shorthand returns a 204 (regardless of the length of the collection)', function(assert) { - let request = { url: '/authors' }; - let handler = new HeadShorthandRouteHandler(this.schema, this.serializer, 'author'); - - let response = handler.handle(request); - - assert.ok(response instanceof Response); - assert.equal(response.code, 204); - }); -}); diff --git a/tests/integration/route-handlers/post-shorthand-test.js b/tests/integration/route-handlers/post-shorthand-test.js deleted file mode 100644 index ef778ce41..000000000 --- a/tests/integration/route-handlers/post-shorthand-test.js +++ /dev/null @@ -1,81 +0,0 @@ -import {module, test} from 'qunit'; -import Server from 'ember-cli-mirage/server'; -import Model from 'ember-cli-mirage/orm/model'; -import PostShorthandRouteHandler from 'ember-cli-mirage/route-handlers/shorthands/post'; -import JSONAPISerializer from 'ember-cli-mirage/serializers/json-api-serializer'; - -module('Integration | Route Handlers | POST shorthand', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'development', - models: { - author: Model.extend({}) - } - }); - this.server.timing = 0; - this.server.logging = false; - this.schema = this.server.schema; - - this.serializer = new JSONAPISerializer(); - - this.body = { - data: { - type: 'authors', - attributes: { - 'first-name': 'Ganon', - 'last-name': 'Dorf' - } - } - }; - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('string shorthand creates a record of the specified type and returns the new model', function(assert) { - let request = { requestBody: JSON.stringify(this.body), url: '/people' }; - let handler = new PostShorthandRouteHandler(this.schema, this.serializer, 'author'); - - let model = handler.handle(request); - - assert.equal(this.schema.db.authors.length, 1); - assert.ok(model instanceof Model); - assert.equal(model.modelName, 'author'); - assert.equal(model.firstName, 'Ganon'); - }); - - test('query params are ignored', function(assert) { - let request = { requestBody: JSON.stringify(this.body), url: '/authors?foo=bar', queryParams: { foo: 'bar' } }; - let handler = new PostShorthandRouteHandler(this.schema, this.serializer, 'author'); - - let model = handler.handle(request); - - assert.equal(this.schema.db.authors.length, 1); - assert.ok(model instanceof Model); - assert.equal(model.modelName, 'author'); - assert.equal(model.firstName, 'Ganon'); - }); - - test('undefined shorthand creates a record and returns the new model', function(assert) { - let request = { requestBody: JSON.stringify(this.body), url: '/authors' }; - let handler = new PostShorthandRouteHandler(this.schema, this.serializer, null, '/authors'); - - let model = handler.handle(request); - - assert.equal(this.schema.db.authors.length, 1); - assert.ok(model instanceof Model); - assert.equal(model.modelName, 'author'); - assert.equal(model.firstName, 'Ganon'); - }); - - test('if a shorthand tries to access an unknown type it throws an error', function(assert) { - let request = { requestBody: JSON.stringify(this.body), url: '/foobars' }; - let handler = new PostShorthandRouteHandler(this.schema, this.serializer, 'foobar'); - - assert.throws(function() { - handler.handle(request); - }, /model doesn't exist/); - assert.ok(true); - }); -}); diff --git a/tests/integration/route-handlers/put-shorthand-test.js b/tests/integration/route-handlers/put-shorthand-test.js deleted file mode 100644 index d890ab571..000000000 --- a/tests/integration/route-handlers/put-shorthand-test.js +++ /dev/null @@ -1,88 +0,0 @@ -import {module, test} from 'qunit'; -import PutShorthandRouteHandler from 'ember-cli-mirage/route-handlers/shorthands/put'; -import Server from 'ember-cli-mirage/server'; -import Model from 'ember-cli-mirage/orm/model'; -import JSONAPISerializer from 'ember-cli-mirage/serializers/json-api-serializer'; - -module('Integration | Route Handlers | PUT shorthand', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'development', - models: { - author: Model.extend() - } - }); - this.server.timing = 0; - this.server.logging = false; - - this.authors = [ - { id: 1, firstName: 'Ganon' } - ]; - this.server.db.loadData({ - authors: this.authors - }); - - this.schema = this.server.schema; - this.serializer = new JSONAPISerializer(); - - this.body = { - data: { - type: 'authors', - id: '1', - attributes: { - 'first-name': 'Ganondorf' - } - } - }; - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('undefined shorthand updates the record and returns the model', function(assert) { - let handler = new PutShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors/:id'); - let request = { requestBody: JSON.stringify(this.body), url: '/authors/1', params: { id: '1' } }; - - let model = handler.handle(request); - - assert.equal(this.schema.db.authors.length, 1); - assert.ok(model instanceof Model); - assert.equal(model.modelName, 'author'); - assert.equal(model.firstName, 'Ganondorf'); - }); - - test('query params are ignored', function(assert) { - let handler = new PutShorthandRouteHandler(this.schema, this.serializer, 'author'); - let request = { requestBody: JSON.stringify(this.body), url: '/authors/1?foo=bar', params: { id: '1' }, queryParams: { foo: 'bar' } }; - - let model = handler.handle(request); - - assert.equal(this.schema.db.authors.length, 1); - assert.ok(model instanceof Model); - assert.equal(model.modelName, 'author'); - assert.equal(model.firstName, 'Ganondorf'); - }); - - test('string shorthand updates the record of the specified type and returns the model', function(assert) { - let handler = new PutShorthandRouteHandler(this.schema, this.serializer, undefined, '/authors/:id'); - let request = { requestBody: JSON.stringify(this.body), url: '/authors/1', params: { id: '1' } }; - - let model = handler.handle(request); - - assert.equal(this.schema.db.authors.length, 1); - assert.ok(model instanceof Model); - assert.equal(model.modelName, 'author'); - assert.equal(model.firstName, 'Ganondorf'); - }); - - test('if a shorthand tries to access an unknown type it throws an error', function(assert) { - let handler = new PutShorthandRouteHandler(this.schema, this.serializer, undefined, '/foobars/:id'); - let request = { requestBody: JSON.stringify(this.body), url: '/foobars/1', params: { id: '1' } }; - - assert.throws(function() { - handler.handle(request); - }, /model doesn't exist/); - assert.ok(true); - }); -}); diff --git a/tests/integration/serializers/active-model-serializer-test.js b/tests/integration/serializers/active-model-serializer-test.js deleted file mode 100644 index c3a7b53ad..000000000 --- a/tests/integration/serializers/active-model-serializer-test.js +++ /dev/null @@ -1,182 +0,0 @@ -import { ActiveModelSerializer, Model, hasMany, belongsTo } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import { module, test } from 'qunit'; - -module('Integration | Serializer | ActiveModelSerializer', function(hooks) { - hooks.beforeEach(function() { - let db = new Db(); - this.schema = new Schema(db); - this.schema.registerModels({ - wordSmith: Model.extend({ - blogPosts: hasMany() - }), - blogPost: Model.extend({ - wordSmith: belongsTo(), - comments: hasMany() - }), - user: Model.extend({ - contactInfos: hasMany() - }), - contactInfo: Model.extend({ - user: belongsTo() - }), - comment: Model.extend({ - commentable: belongsTo({ polymorphic: true }) - }) - }); - - let link = this.schema.wordSmiths.create({ name: 'Link', age: 123 }); - let post1 = link.createBlogPost({ title: 'Lorem' }); - link.createBlogPost({ title: 'Ipsum' }); - - this.schema.wordSmiths.create({ name: 'Zelda', age: 230 }); - - let user = this.schema.users.create({ name: 'John Peach', age: 123 }); - user.createContactInfo({ email: 'peach@bb.me' }); - user.createContactInfo({ email: 'john3000@mail.com' }); - - this.schema.users.create({ name: 'Pine Apple', age: 230 }); - this.schema.comments.create({ text: 'Hi there', commentable: post1 }); - - this.registry = new SerializerRegistry(this.schema, { - application: ActiveModelSerializer, - wordSmith: ActiveModelSerializer.extend({ - serializeIds: 'included', - attrs: ['id', 'name'], - include: ['blogPosts'] - }), - blogPost: ActiveModelSerializer.extend({ - serializeIds: 'included', - include: ['wordSmith', 'comments'] - }), - comment: ActiveModelSerializer.extend({ - serializeIds: 'included', - include: ['commentable'] - }), - contactInfo: ActiveModelSerializer.extend({ - serializeIds: 'included', - include: ['user'] - }), - user: ActiveModelSerializer.extend({ - serializeIds: 'included', - attrs: ['id', 'name'], - include: ['contactInfos'], - embed: true - }) - }); - }); - - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); - - test('it sideloads associations and snake-cases relationships and attributes correctly for a model', function(assert) { - let link = this.schema.wordSmiths.find(1); - let result = this.registry.serialize(link); - - assert.deepEqual(result, { - word_smith: { - id: '1', - name: 'Link', - blog_post_ids: ['1', '2'] - }, - blog_posts: [ - { - id: '1', - title: 'Lorem', - word_smith_id: '1', - comment_ids: [ '1' ] - }, - { - id: '2', - title: 'Ipsum', - word_smith_id: '1', - comment_ids: [ ] - } - ], - comments: [ - { - id: '1', - text: 'Hi there', - commentable_id: '1', - commentable_type: 'blog-post' - } - ] - }); - }); - - test('it sideloads associations and snake-cases relationships and attributes correctly for a collection', function(assert) { - let wordSmiths = this.schema.wordSmiths.all(); - let result = this.registry.serialize(wordSmiths); - - assert.deepEqual(result, { - word_smiths: [ - { - id: '1', - name: 'Link', - blog_post_ids: ['1', '2'] - }, - { - id: '2', - name: 'Zelda', - blog_post_ids: [] - } - ], - blog_posts: [ - { - id: '1', - title: 'Lorem', - word_smith_id: '1', - comment_ids: [ '1' ] - }, - { - id: '2', - title: 'Ipsum', - word_smith_id: '1', - comment_ids: [ ] - } - ], - comments: [ - { - id: '1', - text: 'Hi there', - commentable_id: '1', - commentable_type: 'blog-post' - } - ] - }); - }); - - test('it embeds associations and snake-cases relationships and attributes correctly for a collection', function(assert) { - let users = this.schema.users.all(); - let result = this.registry.serialize(users); - - assert.deepEqual(result, { - users: [ - { - id: '1', - name: 'John Peach', - contact_infos: [ - { - id: '1', - email: 'peach@bb.me', - user_id: '1' - }, - { - id: '2', - email: 'john3000@mail.com', - user_id: '1' - } - ] - }, - { - id: '2', - name: 'Pine Apple', - contact_infos: [] - } - ] - }); - }); -}); diff --git a/tests/integration/serializers/base/associations/embedded-collection-test.js b/tests/integration/serializers/base/associations/embedded-collection-test.js deleted file mode 100644 index 88d339a37..000000000 --- a/tests/integration/serializers/base/associations/embedded-collection-test.js +++ /dev/null @@ -1,168 +0,0 @@ -import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import Serializer from 'ember-cli-mirage/serializer'; -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import { module, test } from 'qunit'; - -module('Integration | Serializers | Base | Associations | Embedded Collections', function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - posts: hasMany('blogPost', { inverse: 'author' }) - }), - blogPost: Model.extend({ - author: belongsTo('wordSmith', { inverse: 'posts' }), - comments: hasMany('fineComment', { inverse: 'post' }) - }), - fineComment: Model.extend({ - post: belongsTo('blogPost') - }) - }); - - let wordSmith = this.schema.wordSmiths.create({ name: 'Link' }); - let blogPost = wordSmith.createPost({ title: 'Lorem' }); - blogPost.createComment({ text: 'pwned' }); - - wordSmith.createPost({ title: 'Ipsum' }); - - this.schema.wordSmiths.create({ name: 'Zelda' }); - - this.BaseSerializer = Serializer.extend({ - embed: true - }); - }); - - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); - - test(`it can embed a collection with a has-many relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }) - }); - - let wordSmiths = this.schema.wordSmiths.all(); - let result = registry.serialize(wordSmiths); - - assert.deepEqual(result, { - wordSmiths: [ - { - id: '1', - name: 'Link', - posts: [ - { id: '1', title: 'Lorem' }, - { id: '2', title: 'Ipsum' } - ] - }, - { - id: '2', - name: 'Zelda', - posts: [] - } - ] - }); - }); - - test(`it can embed a collection with a chain of has-many relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['comments'] - }) - }); - - let wordSmiths = this.schema.wordSmiths.all(); - let result = registry.serialize(wordSmiths); - - assert.deepEqual(result, { - wordSmiths: [ - { - id: '1', - name: 'Link', - posts: [ - { - id: '1', - title: 'Lorem', - comments: [ - { id: '1', text: 'pwned' } - ] - }, - { - id: '2', - title: 'Ipsum', - comments: [] - } - ] - }, - { - id: '2', - name: 'Zelda', - posts: [] - } - ] - }); - }); - - test(`it can embed a collection with a belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let blogPosts = this.schema.blogPosts.all(); - let result = registry.serialize(blogPosts); - - assert.deepEqual(result, { - blogPosts: [ - { - id: '1', - title: 'Lorem', - author: { id: '1', name: 'Link' } - }, - { - id: '2', - title: 'Ipsum', - author: { id: '1', name: 'Link' } - } - ] - }); - }); - - test(`it can embed a collection with a chain of belongs-to relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - fineComment: this.BaseSerializer.extend({ - include: ['post'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let fineComments = this.schema.fineComments.all(); - let result = registry.serialize(fineComments); - - assert.deepEqual(result, { - fineComments: [ - { - id: '1', - text: 'pwned', - post: { - id: '1', - title: 'Lorem', - author: { id: '1', name: 'Link' } - } - } - ] - }); - }); -}); diff --git a/tests/integration/serializers/base/associations/embedded-model-test.js b/tests/integration/serializers/base/associations/embedded-model-test.js deleted file mode 100644 index 10cabaef5..000000000 --- a/tests/integration/serializers/base/associations/embedded-model-test.js +++ /dev/null @@ -1,219 +0,0 @@ -import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import Serializer from 'ember-cli-mirage/serializer'; -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import { module, test } from 'qunit'; - -module('Integration | Serializers | Base | Associations | Embedded Models', function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - posts: hasMany('blogPost', { inverse: 'author' }) - }), - blogPost: Model.extend({ - author: belongsTo('wordSmith', { inverse: 'posts' }), - comments: hasMany('fineComment', { inverse: 'post' }) - }), - fineComment: Model.extend({ - post: belongsTo('blogPost') - }) - }); - - let wordSmith = this.schema.wordSmiths.create({ name: 'Link' }); - let post = wordSmith.createPost({ title: 'Lorem' }); - post.createComment({ text: 'pwned' }); - - wordSmith.createPost({ title: 'Ipsum' }); - - this.schema.wordSmiths.create({ name: 'Zelda' }); - - this.BaseSerializer = Serializer.extend({ - embed: true - }); - }); - - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); - - test(`it can embed has-many relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }) - }); - - let link = this.schema.wordSmiths.find(1); - let result = registry.serialize(link); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - posts: [ - { id: '1', title: 'Lorem' }, - { id: '2', title: 'Ipsum' } - ] - } - }); - }); - - test(`it can embed a chain of has-many relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['comments'] - }) - }); - - let wordSmith = this.schema.wordSmiths.find(1); - let result = registry.serialize(wordSmith); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - posts: [ - { id: '1', title: 'Lorem', comments: [ - { id: '1', text: 'pwned' } - ] }, - { id: '2', title: 'Ipsum', comments: [] } - ] - } - }); - }); - - test(`it can embed a belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - blogPost: this.BaseSerializer.extend({ - embed: true, - include: ['author'] - }) - }); - - let blogPost = this.schema.blogPosts.find(1); - let result = registry.serialize(blogPost); - - assert.deepEqual(result, { - blogPost: { - id: '1', - title: 'Lorem', - author: { id: '1', name: 'Link' } - } - }); - }); - - test(`it can serialize a chain of belongs-to relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - fineComment: this.BaseSerializer.extend({ - include: ['post'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let fineComment = this.schema.fineComments.find(1); - let result = registry.serialize(fineComment); - - assert.deepEqual(result, { - fineComment: { - id: '1', - text: 'pwned', - post: { - id: '1', - title: 'Lorem', - author: { - id: '1', name: 'Link' - } - } - } - }); - }); - - test(`it can have a null value on a belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - blogPost: this.BaseSerializer.extend({ - embed: true, - include: ['author'] - }) - }); - - let blogPost = this.schema.blogPosts.find(1); - blogPost.update('author', null); - let result = registry.serialize(blogPost); - - assert.deepEqual(result, { - blogPost: { - id: '1', - title: 'Lorem' - } - }); - }); - - test(`it ignores relationships that refer to serialized ancestor resources`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let wordSmith = this.schema.wordSmiths.find(1); - let result = registry.serialize(wordSmith); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - posts: [ - { id: '1', title: 'Lorem' }, - { id: '2', title: 'Ipsum' } - ] - } - }); - }); - - test(`it ignores relationships that refer to serialized ancestor resources, multiple levels down`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - embed: true, - include: ['posts'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['author', 'comments'] - }), - fineComment: this.BaseSerializer.extend({ - include: ['post'] - }) - }); - - let wordSmith = this.schema.wordSmiths.find(1); - let result = registry.serialize(wordSmith); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - posts: [ - { id: '1', title: 'Lorem', comments: [ - { id: '1', text: 'pwned' } - ] }, - { id: '2', title: 'Ipsum', comments: [] } - ] - } - }); - }); -}); diff --git a/tests/integration/serializers/base/associations/polymorphic/belongs-to-test.js b/tests/integration/serializers/base/associations/polymorphic/belongs-to-test.js deleted file mode 100644 index 89395c1a0..000000000 --- a/tests/integration/serializers/base/associations/polymorphic/belongs-to-test.js +++ /dev/null @@ -1,52 +0,0 @@ -import { Model, belongsTo } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import Serializer from 'ember-cli-mirage/serializer'; -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import { module, test } from 'qunit'; - -module('Integration | Serializers | Base | Associations | Polymorphic | Belongs To', function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - post: Model.extend(), - comment: Model.extend({ - commentable: belongsTo({ polymorphic: true }) - }) - }); - - let post = this.schema.posts.create({ title: 'Lorem ipsum' }); - this.schema.comments.create({ commentable: post, text: 'Foo' }); - - this.BaseSerializer = Serializer.extend({ - embed: false - }); - }); - - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); - - test(`it can serialize a polymorphic belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - comment: this.BaseSerializer.extend({ - include: ['commentable'] - }) - }); - - let comment = this.schema.comments.find(1); - let result = registry.serialize(comment); - - assert.deepEqual(result, { - comment: { - id: '1', - text: 'Foo', - commentableType: 'post', - commentableId: '1' - }, - posts: [ - { id: '1', title: 'Lorem ipsum' } - ] - }); - }); -}); diff --git a/tests/integration/serializers/base/associations/polymorphic/has-many-test.js b/tests/integration/serializers/base/associations/polymorphic/has-many-test.js deleted file mode 100644 index 91255d899..000000000 --- a/tests/integration/serializers/base/associations/polymorphic/has-many-test.js +++ /dev/null @@ -1,107 +0,0 @@ -import { Model, hasMany } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import Serializer from 'ember-cli-mirage/serializer'; -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import { module, test } from 'qunit'; - -module('Integration | Serializers | Base | Associations | Polymorphic | Has Many', function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - user: Model.extend({ - things: hasMany({ polymorphic: true }) - }), - picture: Model.extend() - }); - - let post = this.schema.pictures.create({ title: 'Lorem ipsum' }); - this.schema.users.create({ things: [ post ], name: 'Ned' }); - }); - - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); - - test(`it can serialize a polymorphic has-many relationship when serializeIds is set to included`, function(assert) { - let BaseSerializer = Serializer.extend({ - embed: false, - serializeIds: 'included' - }); - let registry = new SerializerRegistry(this.schema, { - application: BaseSerializer, - user: BaseSerializer.extend({ - serializeIds: 'included', - include: ['things'] - }) - }); - - let user = this.schema.users.find(1); - let result = registry.serialize(user); - - assert.deepEqual(result, { - user: { - id: '1', - name: 'Ned', - thingIds: [ - { id: '1', type: 'picture' } - ] - }, - pictures: [ - { id: '1', title: 'Lorem ipsum' } - ] - }); - }); - - test(`it can serialize a polymorphic has-many relationship when serializeIds is set to always`, function(assert) { - let BaseSerializer = Serializer.extend({ - embed: false, - serializeIds: 'always' - }); - let registry = new SerializerRegistry(this.schema, { - application: BaseSerializer, - user: BaseSerializer - }); - - let user = this.schema.users.find(1); - let result = registry.serialize(user); - - assert.deepEqual(result, { - user: { - id: '1', - name: 'Ned', - thingIds: [ - { id: '1', type: 'picture' } - ] - } - }); - }); - - test(`it can serialize an embedded polymorphic has-many relationship`, function(assert) { - let BaseSerializer = Serializer.extend({ - embed: true, - serializeIds: 'included' - }); - let registry = new SerializerRegistry(this.schema, { - application: BaseSerializer, - user: BaseSerializer.extend({ - include: ['things'] - }) - }); - - let user = this.schema.users.find(1); - let result = registry.serialize(user); - - assert.deepEqual(result, { - user: { - id: '1', - name: 'Ned', - things: [ - { - id: '1', - title: 'Lorem ipsum' - } - ] - } - }); - }); -}); diff --git a/tests/integration/serializers/base/associations/polymorphic/top-level-test.js b/tests/integration/serializers/base/associations/polymorphic/top-level-test.js deleted file mode 100644 index 7e244561d..000000000 --- a/tests/integration/serializers/base/associations/polymorphic/top-level-test.js +++ /dev/null @@ -1,67 +0,0 @@ -import { module, test } from 'qunit'; -import { Model, hasMany, Serializer } from 'ember-cli-mirage'; -import Server from 'ember-cli-mirage/server'; - -module('Integration | Serializers | Base | Associations | Polymorphic | Top level', function(hooks) { - - hooks.beforeEach(function() { - this.server = new Server({ - models: { - user: Model.extend({ - things: hasMany({ polymorphic: true }) - }), - picture: Model.extend(), - car: Model.extend() - } - }); - this.user = this.server.create('user', { - things: [ - this.server.create('picture', { title: 'Picture 1'}), - this.server.create('car', { name: 'Car 1' }) - ] - }); - - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test(`it can serialize a polymorphic collection when root is false`, function(assert) { - this.server.config({ - serializers: { - application: Serializer.extend({ - root: false, - embed: true - }) - } - }); - let json = this.server.serializerOrRegistry.serialize(this.user.things); - - assert.deepEqual(json, [ - { - "id": "1", - "title": "Picture 1" - }, - { - "id": "1", - "name": "Car 1" - } - ]); - }); - - test(`it throws if trying to serialize a polymorphic collection when root is true`, function(assert) { - this.server.config({ - serializers: { - application: Serializer.extend({ - root: true - }) - } - }); - - assert.throws(() => { - this.server.serializerOrRegistry.serialize(this.user.things); - }, /The base Serializer class cannot serialize a top-level PolymorphicCollection when root is true/); - }); - -}); diff --git a/tests/integration/serializers/base/associations/sideloading-and-embedded-collection-test.js b/tests/integration/serializers/base/associations/sideloading-and-embedded-collection-test.js deleted file mode 100644 index 22a199f81..000000000 --- a/tests/integration/serializers/base/associations/sideloading-and-embedded-collection-test.js +++ /dev/null @@ -1,97 +0,0 @@ -import Schema from 'ember-cli-mirage/orm/schema'; -import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; -import Db from 'ember-cli-mirage/db'; -import Serializer from 'ember-cli-mirage/serializer'; -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import { module, test } from 'qunit'; - -module('Integration | Serializers | Base | Associations | Sideloading and Embedded Collections', function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - posts: hasMany('blog-post') - }), - blogPost: Model.extend({ - author: belongsTo('word-smith'), - comments: hasMany('fine-comment') - }), - fineComment: Model.extend({ - post: belongsTo('blog-post') - }) - }); - - let link = this.schema.wordSmiths.create({ name: 'Link' }); - let blogPost = link.createPost({ title: 'Lorem' }); - link.createPost({ title: 'Ipsum' }); - - blogPost.createComment({ text: 'pwned' }); - - let zelda = this.schema.wordSmiths.create({ name: 'Zelda' }); - zelda.createPost({ title: `Zeldas blogPost` }); - - this.BaseSerializer = Serializer.extend({ - embed: false - }); - }); - - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); - - test(`it can sideload a collection with a has-many relationship containing embedded models`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - embed: false, - include: ["posts"] - }), - blogPost: this.BaseSerializer.extend({ - embed: true, - include: ["comments"] - }) - }); - - let wordSmiths = this.schema.wordSmiths.all(); - let result = registry.serialize(wordSmiths); - - assert.deepEqual(result, { - wordSmiths: [ - { id: "1", name: "Link", postIds: ["1", "2"] }, - { id: "2", name: "Zelda", postIds: ["3"] } - ], - blogPosts: [ - { id: "1", title: "Lorem", comments: [{ id: "1", text: "pwned" }] }, - { id: "2", title: "Ipsum", comments: [] }, - { id: "3", title: "Zeldas blogPost", comments: [] } - ] - }); - }); - - test(`it can sideload a collection with a belongs-to relationship containing embedded models`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - fineComment: this.BaseSerializer.extend({ - embed: false, - include: ["post"] - }), - blogPost: this.BaseSerializer.extend({ - embed: true, - include: ["author"] - }) - }); - - let fineComments = this.schema.fineComments.all(); - let result = registry.serialize(fineComments); - - assert.deepEqual(result, { - fineComments: [{ id: "1", text: "pwned", postId: "1" }], - blogPosts: [ - { - id: "1", - title: "Lorem", - author: { id: "1", name: "Link" } - } - ] - }); - }); -}); diff --git a/tests/integration/serializers/base/associations/sideloading-and-embedded-model-test.js b/tests/integration/serializers/base/associations/sideloading-and-embedded-model-test.js deleted file mode 100644 index eb116b044..000000000 --- a/tests/integration/serializers/base/associations/sideloading-and-embedded-model-test.js +++ /dev/null @@ -1,96 +0,0 @@ -import Schema from 'ember-cli-mirage/orm/schema'; -import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; -import Db from 'ember-cli-mirage/db'; -import Serializer from 'ember-cli-mirage/serializer'; -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import { module, test } from 'qunit'; - -module('Integration | Serializers | Base | Associations | Sideloading and Embedded Models', function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - posts: hasMany('blog-post') - }), - blogPost: Model.extend({ - author: belongsTo('word-smith'), - comments: hasMany('fine-comment') - }), - fineComment: Model.extend({ - post: belongsTo('blog-post') - }) - }); - - let wordSmith = this.schema.wordSmiths.create({ name: 'Link' }); - let blogPost = wordSmith.createPost({ title: 'Lorem' }); - blogPost.createComment({ text: 'pwned' }); - - wordSmith.createPost({ title: 'Ipsum' }); - - this.schema.wordSmiths.create({ name: 'Zelda' }); - - this.BaseSerializer = Serializer.extend({ - embed: false - }); - }); - - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); - - test(`it can sideload a model with a has-many relationship containing embedded models`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - embed: false, - include: ["posts"] - }), - blogPost: this.BaseSerializer.extend({ - embed: true, - include: ["comments"] - }) - }); - - let link = this.schema.wordSmiths.find(1); - let result = registry.serialize(link); - - assert.deepEqual(result, { - wordSmith: { - id: "1", - name: "Link", - postIds: ["1", "2"] - }, - blogPosts: [ - { id: "1", title: "Lorem", comments: [{ id: "1", text: "pwned" }] }, - { id: "2", title: "Ipsum", comments: [] } - ] - }); - }); - - test(`it can sideload a model with a belongs-to relationship containing embedded models`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - fineComment: this.BaseSerializer.extend({ - embed: false, - include: ["post"] - }), - blogPost: this.BaseSerializer.extend({ - embed: true, - include: ["author"] - }) - }); - - let fineComment = this.schema.fineComments.find(1); - let result = registry.serialize(fineComment); - - assert.deepEqual(result, { - fineComment: { id: "1", text: "pwned", postId: "1" }, - blogPosts: [ - { - id: "1", - title: "Lorem", - author: { id: "1", name: "Link" } - } - ] - }); - }); -}); diff --git a/tests/integration/serializers/base/associations/sideloading-assorted-collections-test.js b/tests/integration/serializers/base/associations/sideloading-assorted-collections-test.js deleted file mode 100644 index b0d1db9eb..000000000 --- a/tests/integration/serializers/base/associations/sideloading-assorted-collections-test.js +++ /dev/null @@ -1,69 +0,0 @@ -import { Model, hasMany } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import Serializer from 'ember-cli-mirage/serializer'; -import { module, test } from 'qunit'; - -module('Integration | Serializers | Base | Associations | Sideloading Assorted Collections', function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - blogPosts: hasMany() - }), - blogPost: Model, - greatPhoto: Model - }); - - let BaseSerializer = Serializer.extend({ - embed: false - }); - this.registry = new SerializerRegistry(this.schema, { - application: BaseSerializer, - wordSmith: BaseSerializer.extend({ - include: ['blogPosts'] - }), - greatPhoto: BaseSerializer.extend({ - attrs: ['id', 'title'] - }) - }); - this.wordSmiths = [ - { id: '1', name: 'Link', blogPostIds: ['1', '2'] }, - { id: '2', name: 'Zelda', blogPostIds: [] }, - { id: '3', name: 'Epona', blogPostIds: [] } - ]; - this.blogPosts = [ - { id: '1', title: 'Lorem' }, - { id: '2', title: 'Ipsum' } - ]; - this.greatPhotos = [ - { id: '1', title: 'Amazing', location: 'Hyrule' }, - { id: '2', title: 'greatPhoto', location: 'Goron City' } - ]; - this.schema.db.loadData({ - wordSmiths: this.wordSmiths, - blogPosts: this.blogPosts, - greatPhotos: this.greatPhotos - }); - }); - - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); - - /* - This is a strange response from a route handler, but it's used in the array get shorthand. Deprecate that shorthand? - */ - test(`it can sideload an array of assorted collections that have relationships`, function(assert) { - let result = this.registry.serialize([this.schema.wordSmiths.all(), this.schema.greatPhotos.all()]); - - assert.deepEqual(result, { - wordSmiths: this.wordSmiths, - blogPosts: this.blogPosts, - greatPhotos: this.greatPhotos.map((attrs) => { - delete attrs.location; - return attrs; - }) - }); - }); -}); diff --git a/tests/integration/serializers/base/associations/sideloading-collection-test.js b/tests/integration/serializers/base/associations/sideloading-collection-test.js deleted file mode 100644 index 145342dd0..000000000 --- a/tests/integration/serializers/base/associations/sideloading-collection-test.js +++ /dev/null @@ -1,209 +0,0 @@ -import Schema from 'ember-cli-mirage/orm/schema'; -import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; -import Db from 'ember-cli-mirage/db'; -import Serializer from 'ember-cli-mirage/serializer'; -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import { module, test } from 'qunit'; - -module('Integration | Serializers | Base | Associations | Sideloading Collections', function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - posts: hasMany('blog-post') - }), - blogPost: Model.extend({ - author: belongsTo('word-smith'), - comments: hasMany('fine-comment') - }), - fineComment: Model.extend({ - post: belongsTo('blog-post') - }) - }); - - let link = this.schema.wordSmiths.create({ name: 'Link' }); - let blogPost = link.createPost({ title: 'Lorem' }); - link.createPost({ title: 'Ipsum' }); - - blogPost.createComment({ text: 'pwned' }); - - let zelda = this.schema.wordSmiths.create({ name: 'Zelda' }); - zelda.createPost({ title: `Zeldas blogPost` }); - - this.BaseSerializer = Serializer.extend({ - embed: false - }); - }); - - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); - - test(`it throws an error if embed is false and root is false`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - wordSmith: this.BaseSerializer.extend({ - root: false, - include: ['posts'] - }) - }); - - let wordSmiths = this.schema.wordSmiths.all(); - - assert.throws(function() { - registry.serialize(wordSmiths); - }, /disables the root/); - }); - - test(`it can sideload an empty collection`, function(assert) { - this.schema.db.emptyData(); - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }) - }); - - let result = registry.serialize(this.schema.wordSmiths.all()); - - assert.deepEqual(result, { - wordSmiths: [] - }); - }); - - test(`it can sideload a collection with a has-many relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - embed: false, - include: ['posts'] - }) - }); - - let wordSmiths = this.schema.wordSmiths.all(); - let result = registry.serialize(wordSmiths); - - assert.deepEqual(result, { - wordSmiths: [ - { id: '1', name: 'Link', postIds: ['1', '2'] }, - { id: '2', name: 'Zelda', postIds: ['3'] } - ], - blogPosts: [ - { id: '1', title: 'Lorem' }, - { id: '2', title: 'Ipsum' }, - { id: '3', title: 'Zeldas blogPost' } - ] - }); - }); - - test(`it can sideload a collection with a chain of has-many relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - embed: false, - include: ['posts'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['comments'] - }) - }); - - let wordSmiths = this.schema.wordSmiths.all(); - let result = registry.serialize(wordSmiths); - - assert.deepEqual(result, { - wordSmiths: [ - { id: '1', name: 'Link', postIds: ['1', '2'] }, - { id: '2', name: 'Zelda', postIds: ['3'] } - ], - blogPosts: [ - { id: '1', title: 'Lorem', commentIds: ['1'] }, - { id: '2', title: 'Ipsum', commentIds: [] }, - { id: '3', title: 'Zeldas blogPost', commentIds: [] } - ], - fineComments: [ - { id: '1', text: 'pwned' } - ] - }); - }); - - test(`it avoids circularity when serializing a collection`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - embed: false, - include: ['posts'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let wordSmiths = this.schema.wordSmiths.all(); - let result = registry.serialize(wordSmiths); - - assert.deepEqual(result, { - wordSmiths: [ - { id: '1', name: 'Link', postIds: ['1', '2'] }, - { id: '2', name: 'Zelda', postIds: ['3'] } - ], - blogPosts: [ - { id: '1', title: 'Lorem', authorId: '1' }, - { id: '2', title: 'Ipsum', authorId: '1' }, - { id: '3', title: 'Zeldas blogPost', authorId: '2' } - ] - }); - }); - - test(`it can sideload a collection with a belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - blogPost: this.BaseSerializer.extend({ - embed: false, - include: ['author'] - }) - }); - - let blogPosts = this.schema.blogPosts.all(); - let result = registry.serialize(blogPosts); - - assert.deepEqual(result, { - blogPosts: [ - { id: '1', title: 'Lorem', authorId: '1' }, - { id: '2', title: 'Ipsum', authorId: '1' }, - { id: '3', title: 'Zeldas blogPost', authorId: '2' } - ], - wordSmiths: [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ] - }); - }); - - test(`it can sideload a collection with a chain of belongs-to relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - fineComment: this.BaseSerializer.extend({ - embed: false, - include: ['post'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let fineComments = this.schema.fineComments.all(); - let result = registry.serialize(fineComments); - - assert.deepEqual(result, { - fineComments: [ - { id: '1', text: 'pwned', postId: '1' } - ], - blogPosts: [ - { id: '1', title: 'Lorem', authorId: '1' } - ], - wordSmiths: [ - { id: '1', name: 'Link' } - ] - }); - }); - -}); diff --git a/tests/integration/serializers/base/associations/sideloading-model-test.js b/tests/integration/serializers/base/associations/sideloading-model-test.js deleted file mode 100644 index aa8bd8b7a..000000000 --- a/tests/integration/serializers/base/associations/sideloading-model-test.js +++ /dev/null @@ -1,183 +0,0 @@ -import Schema from 'ember-cli-mirage/orm/schema'; -import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; -import Db from 'ember-cli-mirage/db'; -import Serializer from 'ember-cli-mirage/serializer'; -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import { module, test } from 'qunit'; - -module('Integration | Serializers | Base | Associations | Sideloading Models', function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - posts: hasMany('blog-post') - }), - blogPost: Model.extend({ - author: belongsTo('word-smith'), - comments: hasMany('fine-comment') - }), - fineComment: Model.extend({ - post: belongsTo('blog-post') - }) - }); - - let wordSmith = this.schema.wordSmiths.create({ name: 'Link' }); - let blogPost = wordSmith.createPost({ title: 'Lorem' }); - blogPost.createComment({ text: 'pwned' }); - - wordSmith.createPost({ title: 'Ipsum' }); - - this.schema.wordSmiths.create({ name: 'Zelda' }); - - this.BaseSerializer = Serializer.extend({ - embed: false - }); - }); - - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); - - test(`it throws an error if embed is false and root is false`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - wordSmith: this.BaseSerializer.extend({ - root: false, - include: ['posts'] - }) - }); - - let link = this.schema.wordSmiths.find(1); - assert.throws(function() { - registry.serialize(link); - }, /disables the root/); - - }); - - test(`it can sideload a model with a has-many relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }) - }); - - let link = this.schema.wordSmiths.find(1); - let result = registry.serialize(link); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - postIds: ['1', '2'] - }, - blogPosts: [ - { id: '1', title: 'Lorem' }, - { id: '2', title: 'Ipsum' } - ] - }); - }); - - test(`it can sideload a model with a chain of has-many relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['comments'] - }) - }); - - let link = this.schema.wordSmiths.find(1); - let result = registry.serialize(link); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - postIds: ['1', '2'] - }, - blogPosts: [ - { id: '1', title: 'Lorem', commentIds: ['1'] }, - { id: '2', title: 'Ipsum', commentIds: [] } - ], - fineComments: [ - { id: '1', text: 'pwned' } - ] - }); - }); - - test(`it avoids circularity when serializing a model`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - wordSmith: this.BaseSerializer.extend({ - include: ['posts'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let link = this.schema.wordSmiths.find(1); - let result = registry.serialize(link); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - postIds: ['1', '2'] - }, - blogPosts: [ - { id: '1', title: 'Lorem', authorId: '1' }, - { id: '2', title: 'Ipsum', authorId: '1' } - ] - }); - }); - - test(`it can sideload a model with a belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let blogPost = this.schema.blogPosts.find(1); - let result = registry.serialize(blogPost); - - assert.deepEqual(result, { - blogPost: { - id: '1', title: 'Lorem', authorId: '1' - }, - wordSmiths: [ - { id: '1', name: 'Link' } - ] - }); - }); - - test(`it can sideload a model with a chain of belongs-to relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: this.BaseSerializer, - fineComment: this.BaseSerializer.extend({ - include: ['post'] - }), - blogPost: this.BaseSerializer.extend({ - include: ['author'] - }) - }); - - let fineComment = this.schema.fineComments.find(1); - let result = registry.serialize(fineComment); - - assert.deepEqual(result, { - fineComment: { - id: '1', text: 'pwned', postId: '1' - }, - blogPosts: [ - { id: '1', title: 'Lorem', authorId: '1' } - ], - wordSmiths: [ - { id: '1', name: 'Link' } - ] - }); - }); -}); diff --git a/tests/integration/serializers/base/assorted-collections-test.js b/tests/integration/serializers/base/assorted-collections-test.js deleted file mode 100644 index 54c9fc602..000000000 --- a/tests/integration/serializers/base/assorted-collections-test.js +++ /dev/null @@ -1,44 +0,0 @@ -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import Serializer from 'ember-cli-mirage/serializer'; -import schemaHelper from '../schema-helper'; -import {module, test} from 'qunit'; - -module('Integration | Serializers | Base | Assorted Collections', function(hooks) { - hooks.beforeEach(function() { - this.schema = schemaHelper.setup(); - this.registry = new SerializerRegistry(this.schema, { - greatPhoto: Serializer.extend({ - attrs: ['id', 'title'] - }) - }); - this.wordSmiths = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' }, - { id: '3', name: 'Epona' } - ]; - this.greatPhotos = [ - { id: '1', title: 'Amazing', location: 'Hyrule' }, - { id: '2', title: 'greatPhoto', location: 'Goron City' } - ]; - this.schema.db.loadData({ - wordSmiths: this.wordSmiths, - greatPhotos: this.greatPhotos - }); - }); - - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); - - test(`an array of assorted collections can be serialized`, function(assert) { - let result = this.registry.serialize([this.schema.wordSmiths.all(), this.schema.greatPhotos.all()]); - - assert.deepEqual(result, { - wordSmiths: this.wordSmiths, - greatPhotos: this.greatPhotos.map((attrs) => { - delete attrs.location; - return attrs; - }) - }); - }); -}); diff --git a/tests/integration/serializers/base/attribute-key-formatting-test.js b/tests/integration/serializers/base/attribute-key-formatting-test.js deleted file mode 100644 index 2d9d63c40..000000000 --- a/tests/integration/serializers/base/attribute-key-formatting-test.js +++ /dev/null @@ -1,57 +0,0 @@ -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import Serializer from 'ember-cli-mirage/serializer'; -import schemaHelper from '../schema-helper'; -import { camelize } from 'ember-cli-mirage/utils/inflector'; -import {module, test} from 'qunit'; - -module('Integration | Serializers | Base | Attribute Key Formatting', function(hooks) { - hooks.beforeEach(function() { - this.schema = schemaHelper.setup(); - this.registry = new SerializerRegistry(this.schema, { - wordSmith: Serializer.extend({ - keyForAttribute(key) { - return camelize(key); - } - }) - }); - }); - - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); - - test(`keyForAttribute formats the attributes of a model`, function(assert) { - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - 'first-name': 'Link', - 'last-name': 'Jackson', - age: 323 - }); - - let result = this.registry.serialize(wordSmith); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - firstName: 'Link', - lastName: 'Jackson', - age: 323 - } - }); - }); - - test(`keyForAttribute also formats the models in a collections`, function(assert) { - this.schema.wordSmiths.create({ id: 1, 'first-name': 'Link', 'last-name': 'Jackson' }); - this.schema.wordSmiths.create({ id: 2, 'first-name': 'Zelda', 'last-name': 'Brown' }); - let wordSmiths = this.schema.wordSmiths.all(); - - let result = this.registry.serialize(wordSmiths); - - assert.deepEqual(result, { - wordSmiths: [ - { id: '1', firstName: 'Link', lastName: 'Jackson' }, - { id: '2', firstName: 'Zelda', lastName: 'Brown' } - ] - }); - }); -}); diff --git a/tests/integration/serializers/base/attrs-test.js b/tests/integration/serializers/base/attrs-test.js deleted file mode 100644 index 075cf842d..000000000 --- a/tests/integration/serializers/base/attrs-test.js +++ /dev/null @@ -1,51 +0,0 @@ -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import Serializer from 'ember-cli-mirage/serializer'; -import schemaHelper from '../schema-helper'; -import { module, test } from 'qunit'; - -module('Integration | Serializers | Base | Attrs List', function(hooks) { - hooks.beforeEach(function() { - this.schema = schemaHelper.setup(); - this.registry = new SerializerRegistry(this.schema, { - wordSmith: Serializer.extend({ - attrs: ['id', 'name'] - }) - }); - }); - - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); - - test(`it returns only the whitelisted attrs when serializing a model`, function(assert) { - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - name: 'Link', - age: 123 - }); - - let result = this.registry.serialize(wordSmith); - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link' - } - }); - }); - - test(`it returns only the whitelisted attrs when serializing a collection`, function(assert) { - let { schema } = this; - schema.wordSmiths.create({ id: 1, name: 'Link', age: 123 }); - schema.wordSmiths.create({ id: 2, name: 'Zelda', age: 456 }); - - let collection = this.schema.wordSmiths.all(); - let result = this.registry.serialize(collection); - - assert.deepEqual(result, { - wordSmiths: [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ] - }); - }); -}); diff --git a/tests/integration/serializers/base/basic-test.js b/tests/integration/serializers/base/basic-test.js deleted file mode 100644 index 8f4a14147..000000000 --- a/tests/integration/serializers/base/basic-test.js +++ /dev/null @@ -1,87 +0,0 @@ -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import schemaHelper from '../schema-helper'; -import { module, test } from 'qunit'; - -import { uniqBy } from 'lodash-es'; - -module('Integration | Serializers | Base | Basic', function(hooks) { - hooks.beforeEach(function() { - this.schema = schemaHelper.setup(); - this.registry = new SerializerRegistry(this.schema); - }); - - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); - - test('it returns objects unaffected', function(assert) { - let result = this.registry.serialize({ oh: 'hai' }); - - assert.deepEqual(result, { oh: 'hai' }); - }); - - test('it returns arrays unaffected', function(assert) { - let data = [{ id: '1', name: 'Link' }, { id: '2', name: 'Zelda' }]; - let result = this.registry.serialize(data); - - assert.deepEqual(result, data); - }); - - test('it returns empty arrays unaffected', function(assert) { - let result = this.registry.serialize([]); - - assert.deepEqual(result, []); - }); - - test(`it serializes a model by returning its attrs under a root`, function(assert) { - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - name: 'Link' - }); - let result = this.registry.serialize(wordSmith); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link' - } - }); - }); - - test(`it serializes a collection of models by returning an array of their attrs under a pluralized root`, function(assert) { - this.schema.wordSmiths.create({ id: 1, name: 'Link' }); - this.schema.wordSmiths.create({ id: 2, name: 'Zelda' }); - - let wordSmiths = this.schema.wordSmiths.all(); - - let result = this.registry.serialize(wordSmiths); - - assert.deepEqual(result, { - wordSmiths: [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ] - }); - }); - - test(`it can serialize an empty collection`, function(assert) { - let wordSmiths = this.schema.wordSmiths.all(); - let result = this.registry.serialize(wordSmiths); - - assert.deepEqual(result, { - wordSmiths: [] - }); - }); - - test('it returns POJAs of models unaffected', function(assert) { - this.schema.wordSmiths.create({ name: 'Sam' }); - this.schema.wordSmiths.create({ name: 'Sam' }); - this.schema.wordSmiths.create({ name: 'Ganondorf' }); - - let wordSmiths = this.schema.wordSmiths.all().models; - let uniqueNames = uniqBy(wordSmiths, 'name'); - let result = this.registry.serialize(uniqueNames); - - assert.deepEqual(result, uniqueNames); - }); -}); diff --git a/tests/integration/serializers/base/full-request-test.js b/tests/integration/serializers/base/full-request-test.js deleted file mode 100644 index 89ebe4df0..000000000 --- a/tests/integration/serializers/base/full-request-test.js +++ /dev/null @@ -1,155 +0,0 @@ -import Mirage from 'ember-cli-mirage'; -import Server from 'ember-cli-mirage/server'; -import Model from 'ember-cli-mirage/orm/model'; -import Serializer from 'ember-cli-mirage/serializer'; -import {module, test} from 'qunit'; -import promiseAjax from '../../../helpers/promise-ajax'; - -module('Integration | Serializers | Base | Full Request', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'development', - models: { - author: Model.extend({ - posts: Mirage.hasMany() - }), - post: Model.extend({ - author: Mirage.belongsTo(), - comments: Mirage.hasMany() - }), - comment: Model.extend({ - post: Mirage.belongsTo() - }) - }, - serializers: { - application: Serializer.extend({ - embed: true, - root: false - }), - author: Serializer.extend({ - embed: true, - attrs: ['id', 'first'], - include: ['posts'] - }), - comment: Serializer.extend({ - embed: true, - root: false, - include(request) { - return request.queryParams.include_post ? ['post'] : []; - } - }) - } - }); - this.server.timing = 0; - this.server.logging = false; - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('the appropriate serializer is used', async function(assert) { - assert.expect(1); - - let author = this.server.schema.authors.create({ - first: 'Link', - last: 'of Hyrule', - age: 323 - }); - author.createPost({ title: 'Lorem ipsum' }); - - this.server.get('/authors/:id', function(schema, request) { - let { id } = request.params; - - return schema.authors.find(id); - }); - - let { data } = await promiseAjax({ - method: 'GET', - url: '/authors/1' - }); - - assert.deepEqual(data, { - author: { - id: '1', - first: 'Link', - posts: [ - { id: '1', title: 'Lorem ipsum' } - ] - } - }); - }); - - test('components decoded', async function(assert) { - assert.expect(1); - - this.server.get('/authors/:id', function(schema, request) { - let { id } = request.params; - - return { data: { id } }; - }); - - let { data } = await promiseAjax({ - method: 'GET', - url: '/authors/%3A1' - }); - - assert.deepEqual(data, { data: { id: ':1' } }); - }); - - test('a response falls back to the application serializer, if it exists', async function(assert) { - assert.expect(1); - this.server.schema.posts.create({ - title: 'Lorem', - date: '20001010' - }); - - this.server.get('/posts/:id', function(schema, request) { - let { id } = request.params; - - return schema.posts.find(id); - }); - - let { data } = await promiseAjax({ - method: 'GET', - url: '/posts/1' - }); - - assert.deepEqual(data, { - id: '1', - title: 'Lorem', - date: '20001010' - }); - }); - - test('serializer.include is invoked when it is a function', async function(assert) { - assert.expect(1); - let post = this.server.schema.posts.create({ - title: 'Lorem', - date: '20001010' - }); - post.createComment({ - description: 'Lorem is the best' - }); - - this.server.get('/comments/:id', function(schema, request) { - let { id } = request.params; - return schema.comments.find(id); - }); - - let { data } = await promiseAjax({ - method: 'GET', - url: '/comments/1?include_post=true' - }); - - assert.deepEqual(data, { - id: '1', - description: 'Lorem is the best', - post: { - id: '1', - title: 'Lorem', - date: '20001010' - } - }); - }); -}); diff --git a/tests/integration/serializers/base/override-serialize-test.js b/tests/integration/serializers/base/override-serialize-test.js deleted file mode 100644 index 0908307e8..000000000 --- a/tests/integration/serializers/base/override-serialize-test.js +++ /dev/null @@ -1,74 +0,0 @@ -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import Serializer from 'ember-cli-mirage/serializer'; -import schemaHelper from '../schema-helper'; -import { module, test } from 'qunit'; - -module('Integration | Serializers | Base | Overriding Serialize', function(hooks) { - hooks.beforeEach(function() { - this.schema = schemaHelper.setup(); - }); - - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); - - test(`it can use a completely custom serialize function`, function(assert) { - this.registry = new SerializerRegistry(this.schema, { - wordSmith: Serializer.extend({ - serialize() { - return 'blah'; - } - }) - }); - - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - title: 'Link' - }); - - let result = this.registry.serialize(wordSmith); - - assert.deepEqual(result, 'blah'); - }); - - test(`it can access the request in a custom serialize function`, function(assert) { - this.registry = new SerializerRegistry(this.schema, { - wordSmith: Serializer.extend({ - serialize(response, request) { - return request.queryParams.foo || 'blah'; - } - }) - }); - - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - title: 'Link' - }); - - let request = { url: '/word-smiths/1?foo=bar', params: { id: '1' }, queryParams: { foo: 'bar' } }; - let result = this.registry.serialize(wordSmith, request); - - assert.deepEqual(result, 'bar'); - }); - - test(`it can access the databse while in a serializer method`, function(assert) { - this.registry = new SerializerRegistry(this.schema, { - wordSmith: Serializer.extend({ - serialize(response, request) { - let id = request.params.id; - return this.schema.db.wordSmiths.find(id).title || 'No title'; - } - }) - }); - - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - title: 'Title in database' - }); - - let request = { url: '/word-smiths/1?foo=bar', params: { id: '1' }, queryParams: { foo: 'bar' } }; - let result = this.registry.serialize(wordSmith, request); - - assert.deepEqual(result, 'Title in database'); - }); -}); diff --git a/tests/integration/serializers/base/root-test.js b/tests/integration/serializers/base/root-test.js deleted file mode 100644 index 9be6947e1..000000000 --- a/tests/integration/serializers/base/root-test.js +++ /dev/null @@ -1,53 +0,0 @@ -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import Serializer from 'ember-cli-mirage/serializer'; -import schemaHelper from '../schema-helper'; -import { module, test } from 'qunit'; - -module('Integration | Serializers | Base | Root', function(hooks) { - hooks.beforeEach(function() { - this.schema = schemaHelper.setup(); - this.registry = new SerializerRegistry(this.schema, { - wordSmith: Serializer.extend({ - embed: true, - root: false - }) - }); - }); - - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); - - test(`if root is false, it serializes a model by returning its attrs`, function(assert) { - let wordSmith = this.schema.wordSmiths.create({ - id: '1', - name: 'Link' - }); - - let result = this.registry.serialize(wordSmith); - assert.deepEqual(result, { - id: '1', - name: 'Link' - }); - }); - - test(`if root is false, it serializes a collection of models by returning an array of their attrs`, function(assert) { - this.schema.wordSmiths.create({ id: 1, name: 'Link' }); - this.schema.wordSmiths.create({ id: 2, name: 'Zelda' }); - let wordSmiths = this.schema.wordSmiths.all(); - - let result = this.registry.serialize(wordSmiths); - - assert.deepEqual(result, [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ]); - }); - - test(`if root is false, it serializes an empty collection by returning an empty array`, function(assert) { - let emptywordSmithCollection = this.schema.wordSmiths.all(); - let result = this.registry.serialize(emptywordSmithCollection); - - assert.deepEqual(result, []); - }); -}); diff --git a/tests/integration/serializers/base/serialize-array-of-models-test.js b/tests/integration/serializers/base/serialize-array-of-models-test.js deleted file mode 100644 index 367ac8009..000000000 --- a/tests/integration/serializers/base/serialize-array-of-models-test.js +++ /dev/null @@ -1,31 +0,0 @@ -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import Serializer from 'ember-cli-mirage/serializer'; -import schemaHelper from '../schema-helper'; -import { module, test } from 'qunit'; - -module('Integration | Serializers | Base | Array of Models', function(hooks) { - hooks.beforeEach(function() { - this.schema = schemaHelper.setup(); - this.schema.wordSmiths.create({ id: 1, title: 'Link' }); - }); - - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); - - test(`it applies correct serializer when the response is an array of models`, function(assert) { - assert.expect(1); - - let wordSmiths = this.schema.wordSmiths.all().filter(() => true); - let registry = new SerializerRegistry(this.schema, { - wordSmith: Serializer.extend({ - serialize() { - assert.ok('serializer ran'); - return {}; - } - }) - }); - - registry.serialize(wordSmiths); - }); -}); diff --git a/tests/integration/serializers/base/serialize-ids-test.js b/tests/integration/serializers/base/serialize-ids-test.js deleted file mode 100644 index 41f885771..000000000 --- a/tests/integration/serializers/base/serialize-ids-test.js +++ /dev/null @@ -1,80 +0,0 @@ -import { module, test } from 'qunit'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import { Serializer, Model, hasMany } from 'ember-cli-mirage'; - -module('Integration | Serializers | Base | Serialize ids', function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - blogPosts: hasMany(), - specialPosts: hasMany('blog-post', { inverse: 'specialAuthor' }) - }), - blogPost: Model - }); - }); - - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); - - test(`if serializeIds is 'include' it serializes ids of hasMany associations that are included`, function(assert) { - let ApplicationSerializer = Serializer.extend({ - serializeIds: 'included' - }); - let registry = new SerializerRegistry(this.schema, { - application: ApplicationSerializer, - wordSmith: ApplicationSerializer.extend({ - include: ['blogPosts'] - }) - }); - - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - name: 'Link' - }); - wordSmith.createBlogPost(); - wordSmith.createBlogPost(); - wordSmith.createSpecialPost(); - let result = registry.serialize(wordSmith); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - blogPostIds: ['1', '2'] - }, - blogPosts: [ - { id: '1' }, - { id: '2' } - ] - }); - }); - - test(`if serializeIds is 'always' it serializes ids of all hasMany associations`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: Serializer.extend({ - serializeIds: 'always' - }) - }); - - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - name: 'Link' - }); - wordSmith.createBlogPost(); - wordSmith.createBlogPost(); - wordSmith.createSpecialPost(); - let result = registry.serialize(wordSmith); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - blogPostIds: ['1', '2'], - specialPostIds: ['3'] - } - }); - }); -}); diff --git a/tests/integration/serializers/json-api-serializer/associations/collection-test.js b/tests/integration/serializers/json-api-serializer/associations/collection-test.js deleted file mode 100644 index 7f877e70b..000000000 --- a/tests/integration/serializers/json-api-serializer/associations/collection-test.js +++ /dev/null @@ -1,500 +0,0 @@ -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import { Model, hasMany, belongsTo, JSONAPISerializer } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | Serializers | JSON API Serializer | Associations | Collection', function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - posts: hasMany('blogPost', { inverse: 'author' }) - }), - blogPost: Model.extend({ - author: belongsTo('wordSmith', { inverse: 'posts' }), - comments: hasMany('fineComment', { inverse: 'post' }) - }), - fineComment: Model.extend({ - post: belongsTo('blogPost') - }) - }); - }); - - test(`by default, it doesn't include a collection's relationships if those relationships are not included in the document and no links are defined`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer - }); - this.schema.wordSmiths.create({ firstName: 'Link', age: 123 }); - this.schema.wordSmiths.create({ firstName: 'Zelda', age: 456 }); - - let collection = this.schema.wordSmiths.all(); - let result = registry.serialize(collection); - - assert.deepEqual(result, { - data: [{ - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link', - age: 123 - } - }, { - type: 'word-smiths', - id: '2', - attributes: { - 'first-name': 'Zelda', - age: 456 - } - }] - }); - }); - - test(`when alwaysIncludeLinkageData is true, it contains linkage data for all a collection's relationships, regardless of includes`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer.extend({ - alwaysIncludeLinkageData: true - }) - }); - this.schema.wordSmiths.create({ firstName: 'Link', age: 123 }); - this.schema.wordSmiths.create({ firstName: 'Zelda', age: 456 }); - - let collection = this.schema.wordSmiths.all(); - let result = registry.serialize(collection); - - assert.deepEqual(result, { - data: [{ - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link', - age: 123 - }, - relationships: { - 'posts': { - data: [] - } - } - }, { - type: 'word-smiths', - id: '2', - attributes: { - 'first-name': 'Zelda', - age: 456 - }, - relationships: { - 'posts': { - data: [] - } - } - }] - }); - }); - - test(`when shouldIncludeLinkageData returns true for a relationship, it contains linkage data for that relationship on all of the collection, regardless of includes`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer.extend({ - shouldIncludeLinkageData(relationshipKey, model) { - if (relationshipKey == 'posts') { - return true; - } - } - }) - }); - this.schema.wordSmiths.create({ firstName: 'Link', age: 123 }); - this.schema.wordSmiths.create({ firstName: 'Zelda', age: 456 }); - - let collection = this.schema.wordSmiths.all(); - let result = registry.serialize(collection); - - assert.deepEqual(result, { - data: [{ - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link', - age: 123 - }, - relationships: { - 'posts': { - data: [] - } - } - }, { - type: 'word-smiths', - id: '2', - attributes: { - 'first-name': 'Zelda', - age: 456 - }, - relationships: { - 'posts': { - data: [] - } - } - }] - }); - }); - - test(`it includes linkage data for a has-many relationship that's being included`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - wordSmith: JSONAPISerializer.extend({ - include: ['posts'] - }) - }); - let link = this.schema.wordSmiths.create({ firstName: 'Link' }); - link.createPost({ title: 'Lorem' }); - link.createPost({ title: 'Ipsum' }); - this.schema.wordSmiths.create({ firstName: 'Zelda' }); - - let collection = this.schema.wordSmiths.all(); - let result = registry.serialize(collection); - - assert.deepEqual(result, { - data: [ - { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - }, - relationships: { - 'posts': { - data: [ - { type: 'blog-posts', id: '1' }, - { type: 'blog-posts', id: '2' } - ] - } - } - }, - { - type: 'word-smiths', - id: '2', - attributes: { - 'first-name': 'Zelda' - }, - relationships: { - 'posts': { - data: [] - } - } - } - ], - included: [ - { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - } - }, - { - type: 'blog-posts', - id: '2', - attributes: { - title: 'Ipsum' - } - } - ] - }); - }); - - test(`it can serialize a collection with a chain of has-many relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - wordSmith: JSONAPISerializer.extend({ - include: ['posts'] - }), - blogPost: JSONAPISerializer.extend({ - include: ['comments'] - }) - }); - - let link = this.schema.wordSmiths.create({ firstName: 'Link' }); - let lorem = link.createPost({ title: 'Lorem' }); - lorem.createComment({ text: 'pwned' }); - link.createPost({ title: 'Ipsum' }); - this.schema.wordSmiths.create({ firstName: 'Zelda' }); - - let collection = this.schema.wordSmiths.all(); - let result = registry.serialize(collection); - - assert.deepEqual(result, { - data: [ - { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - }, - relationships: { - 'posts': { - data: [ - { type: 'blog-posts', id: '1' }, - { type: 'blog-posts', id: '2' } - ] - } - } - }, - { - type: 'word-smiths', - id: '2', - attributes: { - 'first-name': 'Zelda' - }, - relationships: { - 'posts': { - data: [] - } - } - } - ], - included: [ - { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - }, - relationships: { - 'comments': { - data: [ - { type: 'fine-comments', id: '1' } - ] - } - } - }, - { - type: 'fine-comments', - id: '1', - attributes: { - text: 'pwned' - } - }, - { - type: 'blog-posts', - id: '2', - attributes: { - title: 'Ipsum' - }, - relationships: { - 'comments': { - data: [] - } - } - } - ] - }); - }); - - test(`it can serialize a collection with a belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - include: ['author'] - }) - }); - - let link = this.schema.wordSmiths.create({ firstName: 'Link' }); - let post = link.createPost({ title: 'Lorem' }); - post.createComment(); - link.createPost({ title: 'Ipsum' }); - this.schema.wordSmiths.create({ firstName: 'Zelda' }); - - let blogPosts = this.schema.blogPosts.all(); - let result = registry.serialize(blogPosts); - - assert.deepEqual(result, { - data: [ - { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - }, - relationships: { - 'author': { - data: { type: 'word-smiths', id: '1' } - } - } - }, - { - type: 'blog-posts', - id: '2', - attributes: { - title: 'Ipsum' - }, - relationships: { - 'author': { - data: { type: 'word-smiths', id: '1' } - } - } - } - ], - included: [ - { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - } - } - ] - }); - }); - - test(`it can serialize a collection with a chain of belongs-to relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - fineComment: JSONAPISerializer.extend({ - include: ['post'] - }), - blogPost: JSONAPISerializer.extend({ - include: ['author'] - }) - }); - - let link = this.schema.wordSmiths.create({ firstName: 'Link' }); - let post = link.createPost({ title: 'Lorem' }); - post.createComment({ text: 'pwned' }); - link.createPost({ title: 'Ipsum' }); - this.schema.wordSmiths.create({ firstName: 'Zelda' }); - - let fineComments = this.schema.fineComments.all(); - let result = registry.serialize(fineComments); - - assert.deepEqual(result, { - data: [ - { - type: 'fine-comments', - id: '1', - attributes: { - text: 'pwned' - }, - relationships: { - 'post': { - data: { type: 'blog-posts', id: '1' } - } - } - } - ], - included: [ - { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - }, - relationships: { - 'author': { - data: { type: 'word-smiths', id: '1' } - } - } - }, - { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - } - } - ] - }); - }); - - test(`it propertly serializes complex relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - include: ['author', 'comments'] - }), - wordSmith: JSONAPISerializer.extend({ - include: ['posts'] - }), - fineComment: JSONAPISerializer.extend({ - include: ['post'] - }) - }); - - let link = this.schema.wordSmiths.create({ firstName: 'Link' }); - let post = link.createPost({ title: 'Lorem' }); - post.createComment({ text: 'pwned' }); - link.createPost({ title: 'Ipsum' }); - this.schema.wordSmiths.create({ firstName: 'Zelda' }); - - let blogPost = this.schema.blogPosts.find(1); - let result = registry.serialize(blogPost); - - assert.deepEqual(result, { - data: { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - }, - relationships: { - 'author': { - data: { type: 'word-smiths', id: '1' } - }, - 'comments': { - data: [{ type: 'fine-comments', id: '1' }] - } - } - }, - included: [ - { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - }, - relationships: { - 'posts': { - data: [ - { - id: '1', - type: 'blog-posts' - }, - { - id: '2', - type: 'blog-posts' - } - ] - } - } - }, - { - type: 'blog-posts', - id: '2', - attributes: { - 'title': 'Ipsum' - }, - relationships: { - author: { - data: { type: 'word-smiths', id: '1' } - }, - comments: { - data: [] - } - } - }, - { - type: 'fine-comments', - id: '1', - attributes: { - 'text': 'pwned' - }, - relationships: { - 'post': { - data: { - id: '1', - type: 'blog-posts' - } - } - } - } - ] - }); - - }); -}); diff --git a/tests/integration/serializers/json-api-serializer/associations/includes-test.js b/tests/integration/serializers/json-api-serializer/associations/includes-test.js deleted file mode 100644 index 7e980b329..000000000 --- a/tests/integration/serializers/json-api-serializer/associations/includes-test.js +++ /dev/null @@ -1,518 +0,0 @@ -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import { JSONAPISerializer, Model, hasMany, belongsTo } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | Serializers | JSON API Serializer | Associations | Includes', function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - blogPosts: hasMany() - }), - - blogPost: Model.extend({ - wordSmith: belongsTo(), - fineComments: hasMany() - }), - - fineComment: Model.extend({ - blogPost: belongsTo(), - category: belongsTo() - }), - - category: Model.extend({ - labels: hasMany() - }), - - label: Model.extend({ - - }) - }); - }); - - test('includes get serialized with correct serializer', function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - attrs: ['title'], - include: ['wordSmith'] - }), - wordSmith: JSONAPISerializer.extend({ - attrs: ['firstName'] - }) - }); - - let post = this.schema.blogPosts.create({ title: 'We love Mirage!' }); - post.createWordSmith({ firstName: 'Sam' }); - - let result = registry.serialize(post); - - assert.propEqual(result, { - data: { - type: 'blog-posts', - id: '1', - attributes: { - 'title': 'We love Mirage!' - }, - relationships: { - 'word-smith': { - data: { type: 'word-smiths', id: '1' } - } - } - }, - included: [ - { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Sam' - } - } - ] - }); - }); - - test('includes can be a function', function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - attrs: ['title'], - include() { - return [ 'wordSmith' ]; - } - }), - wordSmith: JSONAPISerializer.extend({ - attrs: ['firstName'] - }) - }); - - let post = this.schema.blogPosts.create({ title: 'We love Mirage!' }); - post.createWordSmith({ firstName: 'Sam' }); - - let result = registry.serialize(post); - - assert.propEqual(result, { - data: { - type: 'blog-posts', - id: '1', - attributes: { - 'title': 'We love Mirage!' - }, - relationships: { - 'word-smith': { - data: { type: 'word-smiths', id: '1' } - } - } - }, - included: [ - { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Sam' - } - } - ] - }); - }); - - test('query param includes work when serializing a model', function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer - }); - - let post = this.schema.blogPosts.create(); - post.createWordSmith(); - post.createFineComment(); - post.createFineComment(); - - let request = { - queryParams: { - include: 'word-smith,fine-comments' - } - }; - - let result = registry.serialize(post, request); - - assert.propEqual(result, { - data: { - type: 'blog-posts', - id: '1', - attributes: {}, - relationships: { - 'word-smith': { - data: { type: 'word-smiths', id: '1' } - }, - 'fine-comments': { - data: [ - { type: 'fine-comments', id: '1' }, - { type: 'fine-comments', id: '2' } - ] - } - } - }, - included: [ - { - type: 'word-smiths', - id: '1', - attributes: {} - }, - { - type: 'fine-comments', - id: '1', - attributes: {} - }, - { - type: 'fine-comments', - id: '2', - attributes: {} - } - ] - }); - }); - - test('query param includes work when serializing a collection', function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer - }); - - let post1 = this.schema.blogPosts.create(); - post1.createWordSmith(); - post1.createFineComment(); - post1.createFineComment(); - this.schema.blogPosts.create(); - - let request = { - queryParams: { - include: 'word-smith,fine-comments' - } - }; - - let result = registry.serialize(this.schema.blogPosts.all(), request); - - assert.propEqual(result, { - data: [ - { - type: 'blog-posts', - id: '1', - attributes: {}, - relationships: { - 'word-smith': { - data: { type: 'word-smiths', id: '1' } - }, - 'fine-comments': { - data: [ - { type: 'fine-comments', id: '1' }, - { type: 'fine-comments', id: '2' } - ] - } - } - }, - { - type: 'blog-posts', - id: '2', - attributes: {}, - relationships: { - 'word-smith': { - data: null - }, - 'fine-comments': { - data: [] - } - } - } - ], - included: [ - { - type: 'word-smiths', - id: '1', - attributes: {} - }, - { - type: 'fine-comments', - id: '1', - attributes: {} - }, - { - type: 'fine-comments', - id: '2', - attributes: {} - } - ] - }); - }); - - test('query param includes take precedence over default server includes', function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - include: ['wordSmith'] - }) - }); - - let post = this.schema.blogPosts.create(); - post.createWordSmith(); - post.createFineComment(); - post.createFineComment(); - - let request = { - queryParams: { - include: 'fine-comments' - } - }; - - let result = registry.serialize(post, request); - - assert.propEqual(result, { - data: { - type: 'blog-posts', - id: '1', - attributes: {}, - relationships: { - 'fine-comments': { - data: [ - { type: 'fine-comments', id: '1' }, - { type: 'fine-comments', id: '2' } - ] - } - } - }, - included: [ - { - type: 'fine-comments', - id: '1', - attributes: {} - }, - { - type: 'fine-comments', - id: '2', - attributes: {} - } - ] - }); - }); - - test('query param includes support dot-paths when serializing a model', function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer - }); - - this.schema.db.loadData({ - wordSmiths: [ - { id: 1, name: 'Sam', blogPostIds: [2] } - ], - blogPosts: [ - { id: 2, wordSmithId: 1, fineCommentIds: [3], title: 'Lorem Ipsum' } - ], - fineComments: [ - { id: 3, text: 'Foo', blogPostId: 2, categoryId: 10 } - ], - categories: [ - { id: 10, foo: 'bar', labelIds: [20] } - ], - labels: [ - { id: 20, name: 'Economics' } - ] - }); - let request = { - queryParams: { - include: 'word-smith,fine-comments.category.labels' - } - }; - let result = registry.serialize(this.schema.blogPosts.first(), request); - - assert.propEqual(result, { - data: { - type: 'blog-posts', - id: '2', - attributes: { - title: 'Lorem Ipsum' - }, - relationships: { - 'word-smith': { - data: { type: 'word-smiths', id: '1' } - }, - 'fine-comments': { - data: [ - { type: 'fine-comments', id: '3' } - ] - } - } - }, - included: [ - { - type: 'word-smiths', - id: '1', - attributes: { - name: 'Sam' - } - }, - { - type: 'fine-comments', - id: '3', - attributes: { - text: 'Foo' - }, - relationships: { - 'category': { - data: { type: 'categories', id: '10' } - } - } - }, - { - type: 'categories', - id: '10', - attributes: { - foo: 'bar' - }, - relationships: { - 'labels': { - data: [ - { type: 'labels', id: '20' } - ] - } - } - }, - { - type: 'labels', - id: '20', - attributes: { - name: 'Economics' - } - } - ] - }); - }); - - test('query param includes support dot-paths when serializing a collection', function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer - }); - - this.schema.db.loadData({ - wordSmiths: [ - { id: 1, name: 'Sam', blogPostIds: [2, 5] } - ], - blogPosts: [ - { id: 2, wordSmithId: 1, fineCommentIds: [3], title: 'Lorem Ipsum' }, - { id: 5, wordSmithId: 1, title: 'Dolor' } - ], - fineComments: [ - { id: 3, text: 'Foo', blogPostId: 2, categoryId: 10 } - ], - categories: [ - { id: 10, foo: 'bar', labelIds: [20] } - ], - labels: [ - { id: 20, name: 'Economics' } - ] - }); - let request = { - queryParams: { - include: 'word-smith,fine-comments.category.labels' - } - }; - let result = registry.serialize(this.schema.blogPosts.all(), request); - - assert.propEqual(result, { - data: [ - { - type: 'blog-posts', - id: '2', - attributes: { - title: 'Lorem Ipsum' - }, - relationships: { - 'word-smith': { - data: { type: 'word-smiths', id: '1' } - }, - 'fine-comments': { - data: [ - { type: 'fine-comments', id: '3' } - ] - } - } - }, - { - type: 'blog-posts', - id: '5', - attributes: { - title: 'Dolor' - }, - relationships: { - 'word-smith': { - data: { type: 'word-smiths', id: '1' } - }, - 'fine-comments': { - data: [] - } - } - } - ], - included: [ - { - type: 'word-smiths', - id: '1', - attributes: { - name: 'Sam' - } - }, - { - type: 'fine-comments', - id: '3', - attributes: { - text: 'Foo' - }, - relationships: { - 'category': { - data: { type: 'categories', id: '10' } - } - } - }, - { - type: 'categories', - id: '10', - attributes: { - foo: 'bar' - }, - relationships: { - 'labels': { - data: [ - { type: 'labels', id: '20' } - ] - } - } - }, - { - type: 'labels', - id: '20', - attributes: { - name: 'Economics' - } - } - ] - }); - }); - - test('queryParamIncludes throws if including something that is not an association', function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer - }); - - this.schema.db.loadData({ - blogPosts: [ - { id: 2, title: 'Lorem Ipsum' } - ] - }); - let request = { - queryParams: { - include: 'title' - } - }; - - assert.throws(() => { - registry.serialize(this.schema.blogPosts.first(), request); - }, /You tried to include "title".*but no association named "title" is defined/); - }); -}); diff --git a/tests/integration/serializers/json-api-serializer/associations/key-for-relationship-test.js b/tests/integration/serializers/json-api-serializer/associations/key-for-relationship-test.js deleted file mode 100644 index b4427e6bf..000000000 --- a/tests/integration/serializers/json-api-serializer/associations/key-for-relationship-test.js +++ /dev/null @@ -1,68 +0,0 @@ -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import { Model, hasMany, JSONAPISerializer } from 'ember-cli-mirage'; -import { underscore } from 'ember-cli-mirage/utils/inflector'; -import { module, test } from 'qunit'; - -module('Integration | Serializers | JSON API Serializer | Key for relationship', function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - blogPosts: hasMany() - }), - blogPost: Model - }); - }); - - test(`keyForRelationship works`, function(assert) { - let ApplicationSerializer = JSONAPISerializer.extend({ - keyForRelationship(key) { - return underscore(key); - } - }); - let registry = new SerializerRegistry(this.schema, { - application: ApplicationSerializer, - wordSmith: ApplicationSerializer.extend({ - include: ['blogPosts'] - }) - }); - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - firstName: 'Link', - lastName: 'Jackson', - age: 323 - }); - wordSmith.createBlogPost({ title: 'Lorem ipsum' }); - - let result = registry.serialize(wordSmith); - - assert.deepEqual(result, { - data: { - type: 'word-smiths', - id: '1', - attributes: { - age: 323, - 'first-name': 'Link', - 'last-name': 'Jackson' - }, - relationships: { - 'blog_posts': { - data: [ - { id: '1', type: 'blog-posts' } - ] - } - } - }, - included: [ - { - attributes: { - title: "Lorem ipsum" - }, - id: "1", - type: "blog-posts" - } - ] - }); - }); -}); diff --git a/tests/integration/serializers/json-api-serializer/associations/links-test.js b/tests/integration/serializers/json-api-serializer/associations/links-test.js deleted file mode 100644 index cddd55416..000000000 --- a/tests/integration/serializers/json-api-serializer/associations/links-test.js +++ /dev/null @@ -1,182 +0,0 @@ -import SerializerRegistry from "ember-cli-mirage/serializer-registry"; -import { - Server, - Model, - hasMany, - belongsTo, - JSONAPISerializer, - ActiveModelSerializer -} from "ember-cli-mirage"; -import { module, test } from "qunit"; -import Db from "ember-cli-mirage/db"; -import Schema from "ember-cli-mirage/orm/schema"; - -module( - "Integration | Serializers | JSON API Serializer | Associations | Links", - function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - blogPosts: hasMany() - }), - blogPost: Model.extend({ - wordSmith: belongsTo(), - fineComments: hasMany() - }), - fineComment: Model.extend({ - blogPost: belongsTo() - }) - }); - }); - - hooks.afterEach(function() { - this.schema.db.emptyData(); - }); - - test(`it supports links`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - links(model) { - return { - wordSmith: { - related: `/api/word_smiths/${model.wordSmith.id}`, - self: `/api/blog_posts/${model.id}/relationships/word_smith` - }, - fineComments: { - related: `/api/fine_comments?blog_post_id=${model.id}`, - self: `/api/blog_posts/${model.id}/relationships/fine_comments` - } - }; - } - }) - }); - - let link = this.schema.wordSmiths.create({ id: 3, name: "Link" }); // specify id to really test our links function - let blogPost = link.createBlogPost({ title: "Lorem ipsum" }); - - let result = registry.serialize(blogPost); - - assert.deepEqual(result, { - data: { - type: "blog-posts", - id: blogPost.id, - attributes: { - title: "Lorem ipsum" - }, - relationships: { - "word-smith": { - links: { - related: `/api/word_smiths/${link.id}`, - self: `/api/blog_posts/${blogPost.id}/relationships/word_smith` - } - }, - "fine-comments": { - links: { - related: `/api/fine_comments?blog_post_id=${blogPost.id}`, - self: `/api/blog_posts/${blogPost.id}/relationships/fine_comments` - } - } - } - } - }); - }); - - test(`it supports links alongside data linkage`, function(assert) { - let ApplicationSerializer = JSONAPISerializer.extend({ - alwaysIncludeLinkageData: true - }); - let registry = new SerializerRegistry(this.schema, { - application: ApplicationSerializer, - blogPost: ApplicationSerializer.extend({ - links(model) { - return { - wordSmith: { - related: `/api/word_smiths/${model.wordSmith.id}`, - self: `/api/blog_posts/${model.id}/relationships/word_smith` - }, - fineComments: { - related: `/api/fine_comments?blog_post_id=${model.id}`, - self: `/api/blog_posts/${model.id}/relationships/fine_comments` - } - }; - } - }) - }); - - let link = this.schema.wordSmiths.create({ id: 3, name: "Link" }); // specify id to really test our links function - let blogPost = link.createBlogPost({ title: "Lorem ipsum" }); - - let result = registry.serialize(blogPost); - - assert.deepEqual(result, { - data: { - type: "blog-posts", - id: blogPost.id, - attributes: { - title: "Lorem ipsum" - }, - relationships: { - "word-smith": { - data: { - id: "3", - type: "word-smiths" - }, - links: { - related: `/api/word_smiths/${link.id}`, - self: `/api/blog_posts/${blogPost.id}/relationships/word_smith` - } - }, - "fine-comments": { - data: [], - links: { - related: `/api/fine_comments?blog_post_id=${blogPost.id}`, - self: `/api/blog_posts/${blogPost.id}/relationships/fine_comments` - } - } - } - } - }); - }); - - test("[regression] it works when using a named serializer, relationships, and a non-JSONAPISerializer for the base", async function(assert) { - let server = new Server({ - environment: "test", - serializers: { - application: ActiveModelSerializer, - userV2: JSONAPISerializer - }, - - models: { - user: Model.extend({ - posts: hasMany() - }), - post: Model.extend() - }, - - baseConfig() { - this.get("/users", function(schema) { - let json = this.serialize(schema.users.find(1), "userV2"); - - return json; - }); - } - }); - - server.create("user"); - - let res = await fetch("/users"); - let json = await res.json(); - - assert.deepEqual(json, { - data: { - attributes: {}, - id: "1", - type: "users" - } - }); - - server.shutdown(); - }); - } -); diff --git a/tests/integration/serializers/json-api-serializer/associations/model-test.js b/tests/integration/serializers/json-api-serializer/associations/model-test.js deleted file mode 100644 index 3f975bd79..000000000 --- a/tests/integration/serializers/json-api-serializer/associations/model-test.js +++ /dev/null @@ -1,488 +0,0 @@ -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import { Model, hasMany, belongsTo, JSONAPISerializer } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | Serializers | JSON API Serializer | Associations | Model', function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model.extend({ - blogPosts: hasMany() - }), - blogPost: Model.extend({ - wordSmith: belongsTo(), - fineComments: hasMany() - }), - fineComment: Model.extend({ - blogPost: belongsTo() - }) - }); - }); - - test(`by default, it doesn't include a model's relationships if those relationships are not included in the document and no links are defined`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer - }); - let link = this.schema.wordSmiths.create({ - firstName: 'Link', - age: 123 - }); - let post = link.createBlogPost({ title: 'Lorem ipsum' }); - - let result = registry.serialize(post); - assert.deepEqual(result, { - data: { - type: 'blog-posts', - id: '1', - attributes: { - 'title': 'Lorem ipsum' - } - } - }); - }); - - test(`when alwaysIncludeLinkageData is true, it contains linkage data for all a model's relationships, regardless of includes`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer.extend({ - alwaysIncludeLinkageData: true - }) - }); - let link = this.schema.wordSmiths.create({ - firstName: 'Link', - age: 123 - }); - let post = link.createBlogPost({ title: 'Lorem ipsum' }); - - let result = registry.serialize(post); - assert.deepEqual(result, { - data: { - type: 'blog-posts', - id: '1', - attributes: { - 'title': 'Lorem ipsum' - }, - relationships: { - 'word-smith': { - data: { - type: 'word-smiths', - id: '1' - } - }, - 'fine-comments': { - data: [] - } - } - } - }); - }); - - test(`when shouldIncludeLinkageData returns true for a certain belongsTo relationship, it contains linkage data for that relationship, regardless of includes`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer.extend({ - shouldIncludeLinkageData(relationshipKey, model) { - if (relationshipKey === 'wordSmith') { - return true; - } - } - }) - }); - let link = this.schema.wordSmiths.create({ - firstName: 'Link', - age: 123 - }); - let post = link.createBlogPost({ title: 'Lorem ipsum' }); - - let result = registry.serialize(post); - assert.deepEqual(result, { - data: { - type: 'blog-posts', - id: '1', - attributes: { - 'title': 'Lorem ipsum' - }, - relationships: { - 'word-smith': { - data: { - type: 'word-smiths', - id: '1' - } - } - } - } - }); - }); - - test(`when shouldIncludeLinkageData returns true for a certain hasMany relationship, it contains linkage data for that relationship, regardless of includes`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - wordSmith: JSONAPISerializer.extend({ - shouldIncludeLinkageData(relationshipKey, model) { - if (relationshipKey === 'blogPosts') { - return true; - } - } - }) - }); - - let link = this.schema.wordSmiths.create({ firstName: 'Link' }); - link.createBlogPost({ title: 'Lorem' }); - link.createBlogPost({ title: 'Ipsum' }); - - let result = registry.serialize(link); - - assert.deepEqual(result, { - data: { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - }, - relationships: { - 'blog-posts': { - data: [ - { type: 'blog-posts', id: '1' }, - { type: 'blog-posts', id: '2' } - ] - } - } - } - }); - }); - - test(`it includes linkage data for a has-many relationship that's being included`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - wordSmith: JSONAPISerializer.extend({ - include: ['blogPosts'] - }) - }); - - let link = this.schema.wordSmiths.create({ firstName: 'Link' }); - link.createBlogPost({ title: 'Lorem' }); - link.createBlogPost({ title: 'Ipsum' }); - - let result = registry.serialize(link); - - assert.deepEqual(result, { - data: { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - }, - relationships: { - 'blog-posts': { - data: [ - { type: 'blog-posts', id: '1' }, - { type: 'blog-posts', id: '2' } - ] - } - } - }, - included: [ - { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - } - }, - { - type: 'blog-posts', - id: '2', - attributes: { - title: 'Ipsum' - } - } - ] - }); - }); - - test(`it can include a chain of has-many relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - wordSmith: JSONAPISerializer.extend({ - include: ['blogPosts'] - }), - blogPost: JSONAPISerializer.extend({ - include: ['fineComments'] - }) - }); - - let link = this.schema.wordSmiths.create({ firstName: 'Link' }); - let post1 = link.createBlogPost({ title: 'Lorem' }); - post1.createFineComment({ text: 'pwned' }); - link.createBlogPost({ title: 'Ipsum' }); - - let result = registry.serialize(link); - - assert.deepEqual(result, { - data: { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - }, - relationships: { - 'blog-posts': { - data: [ - { type: 'blog-posts', id: '1' }, - { type: 'blog-posts', id: '2' } - ] - } - } - }, - included: [ - { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - }, - relationships: { - 'fine-comments': { - data: [ - { type: 'fine-comments', id: '1' } - ] - } - } - }, - { - type: 'fine-comments', - id: '1', - attributes: { - text: 'pwned' - } - }, - { - type: 'blog-posts', - id: '2', - attributes: { - title: 'Ipsum' - }, - relationships: { - 'fine-comments': { - data: [] - } - } - } - ] - }); - }); - - test(`it can include a belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - include: ['wordSmith'] - }) - }); - - let link = this.schema.wordSmiths.create({ firstName: 'Link' }); - let blogPost = link.createBlogPost({ title: 'Lorem' }); - blogPost.createFineComment(); - - let result = registry.serialize(blogPost); - - assert.deepEqual(result, { - data: { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - }, - relationships: { - 'word-smith': { - data: { - id: '1', - type: 'word-smiths' - } - } - } - }, - 'included': [ - { - attributes: { - 'first-name': 'Link' - }, - id: '1', - type: 'word-smiths' - } - ] - }); - }); - - test(`it gracefully handles null belongs-to relationship`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - include: ['wordSmith'] - }) - }); - - let blogPost = this.schema.blogPosts.create({ title: 'Lorem' }); - let result = registry.serialize(blogPost); - - assert.deepEqual(result, { - data: { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - }, - relationships: { - 'word-smith': { - data: null - } - } - } - }); - }); - - test(`it can include a chain of belongs-to relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - blogPost: JSONAPISerializer.extend({ - include: ['wordSmith'] - }), - fineComment: JSONAPISerializer.extend({ - include: ['blogPost'] - }) - }); - - let wordSmith = this.schema.wordSmiths.create({ firstName: 'Link' }); - let post = wordSmith.createBlogPost({ title: 'Lorem' }); - let comment = post.createFineComment({ text: 'pwned' }); - - let result = registry.serialize(comment); - - assert.deepEqual(result, { - data: { - type: 'fine-comments', - id: '1', - attributes: { - text: 'pwned' - }, - relationships: { - 'blog-post': { - data: { - id: '1', - type: 'blog-posts' - } - } - } - }, - 'included': [ - { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - }, - relationships: { - 'word-smith': { - data: { - type: 'word-smiths', - id: '1' - } - } - } - }, - { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - } - } - ] - }); - }); - - test(`it properly serializes complex relationships`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - wordSmith: JSONAPISerializer.extend({ - include: ['blogPosts'] - }), - blogPost: JSONAPISerializer.extend({ - include: ['wordSmith', 'fineComments'] - }), - fineComment: JSONAPISerializer.extend({ - include: ['blogPost'] - }) - }); - - let wordSmith = this.schema.wordSmiths.create({ firstName: 'Link' }); - let post = wordSmith.createBlogPost({ title: 'Lorem' }); - wordSmith.createBlogPost({ title: 'Ipsum' }); - post.createFineComment({ text: 'pwned' }); - - let result = registry.serialize(wordSmith); - - assert.deepEqual(result, { - data: { - attributes: { - 'first-name': 'Link' - }, - id: '1', - relationships: { - 'blog-posts': { - data: [ - { type: 'blog-posts', id: '1' }, - { type: 'blog-posts', id: '2' } - ] - } - }, - type: 'word-smiths' - }, - included: [ - { - type: 'blog-posts', - id: '1', - attributes: { - title: 'Lorem' - }, - relationships: { - 'word-smith': { - data: { type: 'word-smiths', id: '1' } - }, - 'fine-comments': { - data: [ - { type: 'fine-comments', id: '1' } - ] - } - } - }, - { - type: 'fine-comments', - id: '1', - attributes: { - text: 'pwned' - }, - relationships: { - 'blog-post': { - data: { type: 'blog-posts', id: '1' } - } - } - }, - { - type: 'blog-posts', - id: '2', - attributes: { - title: 'Ipsum' - }, - relationships: { - 'word-smith': { - data: { type: 'word-smiths', id: '1' } - }, - 'fine-comments': { - data: [] - } - } - } - ] - }); - }); -}); diff --git a/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js b/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js deleted file mode 100644 index 9ee3a2104..000000000 --- a/tests/integration/serializers/json-api-serializer/associations/polymorphic-test.js +++ /dev/null @@ -1,253 +0,0 @@ -import { module, test } from 'qunit'; -import Server from 'ember-cli-mirage/server'; -import { Model, belongsTo, hasMany, JSONAPISerializer } from 'ember-cli-mirage'; - -module('Integration | Serializers | JSON API Serializer | Associations | Polymorphic', function() { - - test('it works for belongs to polymorphic relationships', function(assert) { - let server = new Server({ - models: { - photo: Model.extend(), - video: Model.extend(), - comment: Model.extend({ - commentable: belongsTo({ polymorphic: true }) - }) - }, - serializers: { - application: JSONAPISerializer, - comment: JSONAPISerializer.extend({ - include: ['commentable'] - }) - } - }); - - let schema = server.schema; - let photo = schema.photos.create({ title: 'Foo' }); - schema.comments.create({ text: 'Pretty foo!', commentable: photo }); - - let video = schema.videos.create({ title: 'Bar' }); - schema.comments.create({ text: 'Love the bar!', commentable: video }); - - let result = server.serializerOrRegistry.serialize(schema.comments.all()); - assert.deepEqual(result, { - data: [ - { - "attributes": { - "text": "Pretty foo!" - }, - "id": "1", - "relationships": { - "commentable": { - "data": { id: '1', type: 'photos' } - } - }, - "type": "comments" - }, - { - "attributes": { - "text": "Love the bar!" - }, - "id": "2", - "relationships": { - "commentable": { - "data": { id: '1', type: 'videos' } - } - }, - "type": "comments" - } - ], - included: [ - { - attributes: { - title: "Foo" - }, - id: "1", - type: "photos" - }, - { - attributes: { - "title": "Bar" - }, - id: "1", - type: "videos" - } - ] - }); - - server.shutdown(); - }); - - test('it works for has many polymorphic relationships', function(assert) { - let server = new Server({ - models: { - user: Model.extend({ - things: hasMany({ polymorphic: true }) - }), - car: Model.extend(), - watch: Model.extend() - }, - serializers: { - application: JSONAPISerializer, - user: JSONAPISerializer.extend({ - include: ['things'] - }) - } - }); - - let schema = server.schema; - let car = schema.cars.create({ make: 'Infiniti' }); - let watch = schema.watches.create({ make: 'Citizen' }); - let user = schema.users.create({ - name: 'Sam', - things: [ car, watch ] - }); - - let json = server.serializerOrRegistry.serialize(user); - - assert.deepEqual(json, { - data: { - "attributes": { - "name": "Sam" - }, - "id": "1", - "relationships": { - "things": { - "data": [ - { id: '1', type: 'cars' }, - { id: '1', type: 'watches' } - ] - } - }, - "type": "users" - }, - "included": [ - { - "attributes": { - "make": "Infiniti" - }, - "id": "1", - "type": "cars" - }, - { - "attributes": { - "make": "Citizen" - }, - "id": "1", - "type": "watches" - } - ] - }); - - server.shutdown(); - }); - - test('it works for has many polymorphic relationships included via query params', function(assert) { - let server = new Server({ - models: { - user: Model.extend({ - things: hasMany({ polymorphic: true }) - }), - car: Model.extend(), - watch: Model.extend() - }, - serializers: { - application: JSONAPISerializer - } - }); - - let schema = server.schema; - let car = schema.cars.create({ make: 'Infiniti' }); - let watch = schema.watches.create({ make: 'Citizen' }); - let user = schema.users.create({ - name: 'Sam', - things: [ car, watch ] - }); - - let json = server.serializerOrRegistry.serialize(user, { queryParams: { include: 'things' } }); - - assert.deepEqual(json, { - data: { - "attributes": { - "name": "Sam" - }, - "id": "1", - "relationships": { - "things": { - "data": [ - { id: '1', type: 'cars' }, - { id: '1', type: 'watches' } - ] - } - }, - "type": "users" - }, - "included": [ - { - "attributes": { - "make": "Infiniti" - }, - "id": "1", - "type": "cars" - }, - { - "attributes": { - "make": "Citizen" - }, - "id": "1", - "type": "watches" - } - ] - }); - - server.shutdown(); - }); - - test('it works for a top-level polymorphic collection', function(assert) { - let server = new Server({ - models: { - user: Model.extend({ - things: hasMany({ polymorphic: true }) - }), - car: Model.extend(), - watch: Model.extend() - }, - serializers: { - application: JSONAPISerializer, - user: JSONAPISerializer.extend({ - include: ['things'] - }) - } - }); - - let schema = server.schema; - let car = schema.cars.create({ make: 'Infiniti' }); - let watch = schema.watches.create({ make: 'Citizen' }); - let user = schema.users.create({ - name: 'Sam', - things: [ car, watch ] - }); - - let json = server.serializerOrRegistry.serialize(user.things); - - assert.deepEqual(json, { - data: [ - { - attributes: { - make: "Infiniti" - }, - id: "1", - type: "cars" - }, - { - attributes: { - make: "Citizen" - }, - id: "1", - type: "watches" - } - ] - }); - - server.shutdown(); - }); -}); diff --git a/tests/integration/serializers/json-api-serializer/attrs-test.js b/tests/integration/serializers/json-api-serializer/attrs-test.js deleted file mode 100644 index 9c3bce0be..000000000 --- a/tests/integration/serializers/json-api-serializer/attrs-test.js +++ /dev/null @@ -1,103 +0,0 @@ -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import { Model, JSONAPISerializer } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | Serializers | JSON API Serializer | Attrs List', function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model, - photograph: Model - }); - }); - - test(`it returns only the whitelisted attrs when serializing a model`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - wordSmith: JSONAPISerializer.extend({ - attrs: ['firstName'] - }) - }); - let user = this.schema.wordSmiths.create({ - id: 1, - firstName: 'Link', - age: 123 - }); - - let result = registry.serialize(user); - - assert.deepEqual(result, { - data: { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - } - } - }); - }); - - test(`it returns only the whitelisted attrs when serializing a collection`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer, - wordSmith: JSONAPISerializer.extend({ - attrs: ['firstName'] - }) - }); - this.schema.wordSmiths.create({ id: 1, firstName: 'Link', age: 123 }); - this.schema.wordSmiths.create({ id: 2, firstName: 'Zelda', age: 456 }); - - let collection = this.schema.wordSmiths.all(); - let result = registry.serialize(collection); - - assert.deepEqual(result, { - data: [{ - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - } - }, { - type: 'word-smiths', - id: '2', - attributes: { - 'first-name': 'Zelda' - } - }] - }); - }); - - test(`it can use different attr whitelists for different serializers`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - wordSmith: JSONAPISerializer.extend({ - attrs: ['firstName'] - }), - photograph: JSONAPISerializer.extend({ - attrs: ['title'] - }) - }); - - let link = this.schema.wordSmiths.create({ id: 1, firstName: 'Link', age: 123 }); - assert.deepEqual(registry.serialize(link), { - data: { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link' - } - } - }); - - let photo = this.schema.photographs.create({ id: 1, title: 'Lorem ipsum', createdAt: '2010-01-01' }); - assert.deepEqual(registry.serialize(photo), { - data: { - type: 'photographs', - id: '1', - attributes: { - 'title': 'Lorem ipsum' - } - } - }); - }); -}); diff --git a/tests/integration/serializers/json-api-serializer/base-test.js b/tests/integration/serializers/json-api-serializer/base-test.js deleted file mode 100644 index 753b082c2..000000000 --- a/tests/integration/serializers/json-api-serializer/base-test.js +++ /dev/null @@ -1,68 +0,0 @@ -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import { Model, JSONAPISerializer } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -module('Integration | Serializers | JSON API Serializer | Base', function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model - }); - this.registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer - }); - }); - - test(`it includes all attributes for a model`, function(assert) { - let link = this.schema.wordSmiths.create({ firstName: 'Link', age: 123 }); - let result = this.registry.serialize(link); - - assert.deepEqual(result, { - data: { - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link', - age: 123 - } - } - }); - }); - - test(`it includes all attributes for each model in a collection`, function(assert) { - this.schema.wordSmiths.create({ firstName: 'Link', age: 123 }); - this.schema.wordSmiths.create({ id: 1, firstName: 'Link', age: 123 }); - this.schema.wordSmiths.create({ id: 2, firstName: 'Zelda', age: 456 }); - - let collection = this.schema.wordSmiths.all(); - let result = this.registry.serialize(collection); - - assert.deepEqual(result, { - data: [{ - type: 'word-smiths', - id: '1', - attributes: { - 'first-name': 'Link', - age: 123 - } - }, { - type: 'word-smiths', - id: '2', - attributes: { - 'first-name': 'Zelda', - age: 456 - } - }] - }); - }); - - test(`it can serialize an empty collection`, function(assert) { - let wordSmiths = this.schema.wordSmiths.all(); - let result = this.registry.serialize(wordSmiths); - - assert.deepEqual(result, { - data: [] - }); - }); -}); diff --git a/tests/integration/serializers/json-api-serializer/key-formatting-test.js b/tests/integration/serializers/json-api-serializer/key-formatting-test.js deleted file mode 100644 index 9f4a7cd7b..000000000 --- a/tests/integration/serializers/json-api-serializer/key-formatting-test.js +++ /dev/null @@ -1,79 +0,0 @@ -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import SerializerRegistry from 'ember-cli-mirage/serializer-registry'; -import { Model, JSONAPISerializer } from 'ember-cli-mirage'; -import { underscore } from 'ember-cli-mirage/utils/inflector'; -import { module, test } from 'qunit'; - -module('Integration | Serializers | JSON API Serializer | Key Formatting', function(hooks) { - hooks.beforeEach(function() { - this.schema = new Schema(new Db(), { - wordSmith: Model, - photograph: Model - }); - }); - - test(`keyForAttribute formats the attributes of a model`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer.extend({ - keyForAttribute(key) { - return underscore(key); - } - }) - }); - let wordSmith = this.schema.wordSmiths.create({ - id: 1, - firstName: 'Link', - lastName: 'Jackson', - age: 323 - }); - - let result = registry.serialize(wordSmith); - - assert.deepEqual(result, { - data: { - type: 'word-smiths', - id: '1', - attributes: { - age: 323, - first_name: 'Link', - last_name: 'Jackson' - } - } - }); - }); - - test(`keyForAttribute also formats the models in a collections`, function(assert) { - let registry = new SerializerRegistry(this.schema, { - application: JSONAPISerializer.extend({ - keyForAttribute(key) { - return underscore(key); - } - }) - }); - - this.schema.wordSmiths.create({ id: 1, 'firstName': 'Link', 'lastName': 'Jackson' }); - this.schema.wordSmiths.create({ id: 2, 'firstName': 'Zelda', 'lastName': 'Brown' }); - let wordSmiths = this.schema.wordSmiths.all(); - - let result = registry.serialize(wordSmiths); - - assert.deepEqual(result, { - data: [{ - type: 'word-smiths', - id: '1', - attributes: { - 'first_name': 'Link', - 'last_name': 'Jackson' - } - }, { - type: 'word-smiths', - id: '2', - attributes: { - 'first_name': 'Zelda', - 'last_name': 'Brown' - } - }] - }); - }); -}); diff --git a/tests/integration/serializers/rest-serializer-test.js b/tests/integration/serializers/rest-serializer-test.js deleted file mode 100644 index 673c69a39..000000000 --- a/tests/integration/serializers/rest-serializer-test.js +++ /dev/null @@ -1,97 +0,0 @@ -import { module, test } from 'qunit'; -import Server from 'ember-cli-mirage/server'; -import { Model, hasMany, belongsTo, RestSerializer } from 'ember-cli-mirage'; - -module('Integration | Serializer | RestSerializer', function(hooks) { - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('it sideloads associations and camel-cases relationships and attributes correctly for a model', function(assert) { - this.server = new Server({ - environment: 'test', - models: { - wordSmith: Model.extend({ - blogPosts: hasMany() - }), - blogPost: Model.extend({ - wordSmith: belongsTo() - }) - }, - serializers: { - application: RestSerializer, - wordSmith: RestSerializer.extend({ - attrs: ['id', 'name'], - include: ['blogPosts'] - }), - blogPost: RestSerializer.extend({ - include: ['wordSmith'] - }) - } - }); - - let link = this.server.create('word-smith', { name: 'Link', age: 123 }); - link.createBlogPost({ title: 'Lorem' }); - link.createBlogPost({ title: 'Ipsum' }); - - this.server.create('word-smith', { name: 'Zelda', age: 230 }); - - let result = this.server.serializerOrRegistry.serialize(link); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - blogPosts: ['1', '2'] - }, - blogPosts: [ - { - id: '1', - title: 'Lorem', - wordSmith: '1' - }, - { - id: '2', - title: 'Ipsum', - wordSmith: '1' - } - ] - }); - }); - - test('it works for has-many polymorphic associations', function(assert) { - this.server = new Server({ - environment: 'test', - models: { - wordSmith: Model.extend({ - posts: hasMany({ polymorphic: true }) - }), - blogPost: Model.extend() - }, - serializers: { - application: RestSerializer - } - }); - - let post = this.server.create('blog-post', { title: 'Post 1' }); - let link = this.server.create('word-smith', { - name: 'Link', - age: 123, - posts: [ post ] - }); - - let result = this.server.serializerOrRegistry.serialize(link); - - assert.deepEqual(result, { - wordSmith: { - id: '1', - name: 'Link', - age: 123, - posts: [ - { id: '1', type: 'blog-post' } - ] - } - }); - }); - -}); diff --git a/tests/integration/serializers/schema-helper.js b/tests/integration/serializers/schema-helper.js deleted file mode 100644 index a82362e9b..000000000 --- a/tests/integration/serializers/schema-helper.js +++ /dev/null @@ -1,41 +0,0 @@ -import Mirage from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Model from 'ember-cli-mirage/orm/model'; -import Db from 'ember-cli-mirage/db'; - -export default { - - setup() { - return new Schema(new Db(), { - wordSmith: Model.extend({ - blogPosts: Mirage.hasMany() - }), - blogPost: Model.extend({ - wordSmith: Mirage.belongsTo(), - fineComments: Mirage.hasMany() - }), - fineComment: Model.extend({ - blogPost: Mirage.belongsTo() - }), - greatPhoto: Model, - - foo: Model.extend({ - bar: Mirage.belongsTo() - }), - bar: Model.extend({ - baz: Mirage.belongsTo() - }), - baz: Model.extend({ - quuxes: Mirage.hasMany() - }), - quux: Model.extend({ - zomgs: Mirage.hasMany() - }), - zomg: Model.extend({ - lol: Mirage.belongsTo() - }), - lol: Model - }); - } - -}; diff --git a/tests/integration/server-config-test.js b/tests/integration/server-config-test.js deleted file mode 100644 index 58ceb5b79..000000000 --- a/tests/integration/server-config-test.js +++ /dev/null @@ -1,264 +0,0 @@ -import { module, test } from 'qunit'; -import { Model } from 'ember-cli-mirage'; -import Server from 'ember-cli-mirage/server'; -import ActiveModelSerializer from 'ember-cli-mirage/serializers/active-model-serializer'; -import RestSerializer from 'ember-cli-mirage/serializers/rest-serializer'; -import $ from 'jquery'; - -module('Integration | Server Config', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'development', - models: { - contact: Model, - post: Model - }, - serializers: { - contact: ActiveModelSerializer - } - }); - this.server.timing = 0; - this.server.logging = false; - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('namespace can be configured', function(assert) { - assert.expect(1); - let done = assert.async(); - - let contacts = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ]; - this.server.db.loadData({ - contacts - }); - this.server.namespace = 'api'; - this.server.get('/contacts'); - - $.getJSON('/api/contacts', function(data) { - assert.deepEqual(data, { contacts }); - done(); - }); - }); - - test('urlPrefix can be configured', function(assert) { - assert.expect(1); - let done = assert.async(); - let { server } = this; - - let contacts = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ]; - server.db.loadData({ - contacts - }); - server.urlPrefix = 'http://localhost:3000'; - server.get('/contacts'); - - $.getJSON('http://localhost:3000/contacts', function(data) { - assert.deepEqual(data, { contacts }); - done(); - }); - }); - - test('urlPrefix and namespace can be configured simultaneously', function(assert) { - assert.expect(1); - let done = assert.async(); - let { server } = this; - - let contacts = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ]; - server.db.loadData({ - contacts - }); - server.urlPrefix = 'http://localhost:3000'; - server.namespace = 'api'; - server.get('/contacts'); - - $.getJSON('http://localhost:3000/api/contacts', function(data) { - assert.deepEqual(data, { contacts }); - done(); - }); - }); - - test('fully qualified domain names can be used in configuration', function(assert) { - assert.expect(1); - let done = assert.async(); - - let contacts = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ]; - this.server.db.loadData({ - contacts - }); - this.server.get('http://example.org/api/contacts'); - - $.getJSON('http://example.org/api/contacts', function(data) { - assert.deepEqual(data, { contacts }); - done(); - }); - }); - - test('urlPrefix/namespace are ignored when fully qualified domain names are used in configuration', function(assert) { - assert.expect(1); - let done = assert.async(); - let { server } = this; - - let contacts = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ]; - server.db.loadData({ - contacts - }); - this.urlPrefix = 'https://example.net'; - server.get('http://example.org/api/contacts'); - - $.getJSON('http://example.org/api/contacts', function(data) { - assert.deepEqual(data, { contacts }); - done(); - }); - }); - - test('blank urlPrefix and namespace ends up as /', function(assert) { - assert.expect(1); - let done = assert.async(); - - let contacts = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ]; - this.server.db.loadData({ - contacts - }); - this.server.namespace = ''; - this.server.urlPrefix = ''; - this.server.get('contacts'); - - $.getJSON('/contacts', function(data) { - assert.deepEqual(data, { contacts }); - done(); - }); - }); - - test('namespace with no slash gets one', function(assert) { - assert.expect(1); - let done = assert.async(); - - let contacts = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ]; - this.server.db.loadData({ - contacts - }); - this.server.namespace = 'api'; - this.server.get('contacts'); - - $.getJSON('/api/contacts', function(data) { - assert.deepEqual(data, { contacts }); - done(); - }); - }); - - test('urlPrefix with no slash gets one', function(assert) { - assert.expect(1); - let done = assert.async(); - - let contacts = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ]; - this.server.db.loadData({ - contacts - }); - this.server.urlPrefix = 'pre'; - this.server.get('contacts'); - - $.getJSON('/pre/contacts', function(data) { - assert.deepEqual(data, { contacts }); - done(); - }); - }); - - test('namespace of / works', function(assert) { - assert.expect(1); - let done = assert.async(); - - let contacts = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ]; - this.server.db.loadData({ - contacts - }); - this.server.namespace = '/'; - this.server.get('contacts'); - - $.getJSON('/contacts', function(data) { - assert.deepEqual(data, { contacts }); - done(); - }); - }); - - test('redefining options using the config method works', function(assert) { - assert.expect(5); - let done = assert.async(); - let { server } = this; - - let contacts = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Zelda' } - ]; - server.config({ - namespace: 'api', - urlPrefix: 'http://localhost:3000', - timing: 1000, - serializers: { - post: RestSerializer - } - }); - server.db.loadData({ - contacts - }); - server.get('contacts'); - - assert.equal(server.timing, 1000); - $.getJSON('http://localhost:3000/api/contacts', function(data) { - assert.deepEqual(data, { contacts }); - done(); - }); - let serializerMap = server.serializerOrRegistry._serializerMap; - assert.equal(Object.keys(serializerMap).length, 2); - assert.equal(serializerMap.contact, ActiveModelSerializer); - assert.equal(serializerMap.post, RestSerializer); - }); - - test('changing the environment of the server throws an error', function(assert) { - let { server } = this; - - assert.throws(function() { - server.config({ - environment: 'test' - }); - }, /You cannot modify Mirage's environment once the server is created/); - }); - - test('changing the trackRequests configuration of the server throws an error', function(assert) { - let { server } = this; - - assert.throws(function() { - server.config({ - trackRequests: true - }); - }, /You cannot modify Pretender's request tracking once the server is created/); - }); -}); diff --git a/tests/integration/server-with-orm-test.js b/tests/integration/server-with-orm-test.js deleted file mode 100644 index 5d63690e4..000000000 --- a/tests/integration/server-with-orm-test.js +++ /dev/null @@ -1,34 +0,0 @@ -import {module, test} from 'qunit'; -import { Model, Factory } from 'ember-cli-mirage'; -import Server from 'ember-cli-mirage/server'; - -module('Integration | Server with ORM', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'test', - models: { - blogPost: Model - }, - factories: { - blogPost: Factory - } - }); - this.server.timing = 0; - this.server.logging = false; - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('a single blogPost db collection is made', function(assert) { - assert.equal(this.server.db._collections.length, 1); - assert.equal(this.server.db._collections[0].name, 'blogPosts'); - }); - - test('create looks up the appropriate db collection', function(assert) { - server.create('blog-post'); - - assert.equal(this.server.db.blogPosts.length, 1); - }); -}); diff --git a/tests/integration/server/create-and-create-list-test.js b/tests/integration/server/create-and-create-list-test.js deleted file mode 100644 index dee064b96..000000000 --- a/tests/integration/server/create-and-create-list-test.js +++ /dev/null @@ -1,189 +0,0 @@ -import { module, test } from 'qunit'; -import { Model, Factory, hasMany, belongsTo } from 'ember-cli-mirage'; -import Server from 'ember-cli-mirage/server'; -// import escape from 'escape-string-regexp'; -import regExpFromString from '../../helpers/reg-exp-from-string'; -import Inflector from 'ember-inflector'; - -// eslint-disable-next-line no-console -let originalWarn = console.warn; - -function expectNoWarning(assert) { - // eslint-disable-next-line no-console - console.warn = () => { - assert.notOk(true, 'no warning should be logged'); - }; -} - -module('Integration | Server | create and createList', function(hooks) { - hooks.beforeEach(function() { - this.Contact = Model.extend(); - this.AmazingContact = Model.extend(); - this.Post = Model.extend({ - author: belongsTo() - }); - this.Author = Model.extend({ - posts: hasMany() - }); - this.Data = Model.extend(); - - this.server = new Server({ - environment: 'test', - models: { - contact: this.Contact, - amazingContact: this.AmazingContact, - post: this.Post, - author: this.Author, - data: this.Data - }, - factories: { - contact: Factory.extend({ - name: 'Yehuda' - }), - amazingContact: Factory - }, - inflector: Inflector.inflector - }); - this.server.timing = 0; - this.server.logging = false; - }); - - hooks.afterEach(function() { - this.server.shutdown(); - - // eslint-disable-next-line no-console - console.warn = originalWarn; - }); - - test('create throws when passing in an undefined model', function(assert) { - expectNoWarning(assert); - - assert.throws(() => { - this.server.create('foo'); - }, regExpFromString(`You called server.create('foo') but no model or factory was found.`)); - }); - - // This used to be deprecated behavior, but now it errors. So we test it separately from the nonsense test above. - test('create throws when passing in a pluralized version of a model', function(assert) { - assert.expect(1); - - assert.throws(() => { - this.server.create('contacts'); - }, regExpFromString(`You called server.create('contacts') but no model or factory was found. Make sure you're passing in the singularized version of the model or factory name`)); - }); - - test('create returns a Model if one is defined', function(assert) { - expectNoWarning(assert); - - let contact = this.server.create('contact'); - - assert.ok(contact instanceof this.Contact, 'expected a Contact'); - assert.equal(contact.name, 'Yehuda', 'the factory is used'); - }); - - test('create returns a Model instance if the Model name is uncountable', function(assert) { - expectNoWarning(assert); - - Inflector.inflector.uncountable('data'); - let data = this.server.create('data'); - - assert.ok(data instanceof this.Data, 'expected a Data'); - }); - - test('createList throws when passing in an undefined model', function(assert) { - expectNoWarning(assert); - - assert.throws(() => { - this.server.createList('foo', 1); - }, regExpFromString(`You called server.createList('foo') but no model or factory was found.`)); - }); - - // This used to be deprecated behavior, but now it errors. So we test it separately from the nonsense test above. - test('createList throws when passing in a pluralized version of a model', function(assert) { - assert.expect(1); - - assert.throws(() => { - this.server.createList('contacts', 1); - }, regExpFromString(`You called server.createList('contacts') but no model or factory was found. Make sure you're passing in the singularized version of the model or factory name.`)); - }); - - test('createList returns Models if one is defined', function(assert) { - expectNoWarning(); - - let contacts = this.server.createList('contact', 1); - - assert.ok(contacts[0] instanceof this.Contact, 'expected a Contactl'); - assert.equal(contacts[0].name, 'Yehuda', 'the factory is used'); - }); - - test('createList returns Models if the model name is uncountable', function(assert) { - expectNoWarning(assert); - - Inflector.inflector.uncountable('data'); - let data = this.server.createList('data', 1); - - assert.ok(data[0] instanceof this.Data, 'expected a Data'); - }); - - test('create returns a Model if one is defined, when using a compound name', function(assert) { - expectNoWarning(assert); - - let contact = this.server.create('amazing-contact'); - - assert.ok(contact instanceof this.AmazingContact, 'expected an AmazingContact'); - }); - - test('createList returns Models if one is defined, when using a compound name', function(assert) { - expectNoWarning(assert); - - let contacts = this.server.createList('amazing-contact', 1); - - assert.ok(contacts[0] instanceof this.AmazingContact, 'expected an AmazingContact'); - }); - - test('create falls back to a model if no factory is defined', function(assert) { - expectNoWarning(assert); - - let post = this.server.create('post'); - - assert.ok(post instanceof this.Post); - assert.equal(post.id, 1); - }); - - test('createList falls back to a model if no factory is defined', function(assert) { - expectNoWarning(assert); - - let posts = this.server.createList('post', 2); - - assert.ok(posts[0] instanceof this.Post); - assert.equal(posts.length, 2); - assert.equal(posts[0].id, 1); - }); - - test('create sets up the db correctly when passing in fks', function(assert) { - expectNoWarning(assert); - - let author = server.create('author'); - let post = this.server.create('post', { - authorId: author.id - }); - author.reload(); - - assert.equal(author.posts.models.length, 1); - assert.deepEqual(post.author.attrs, author.attrs); - assert.equal(this.server.db.posts[0].authorId, author.id); - }); - - test('create sets up the db correctly when passing in models', function(assert) { - expectNoWarning(assert); - - let author = server.create('author'); - let post = this.server.create('post', { - author - }); - - assert.equal(author.posts.models.length, 1); - assert.deepEqual(post.author.attrs, author.attrs); - assert.equal(this.server.db.posts[0].authorId, author.id); - }); -}); diff --git a/tests/integration/server/custom-responses-test.js b/tests/integration/server/custom-responses-test.js deleted file mode 100644 index 7c1556d16..000000000 --- a/tests/integration/server/custom-responses-test.js +++ /dev/null @@ -1,67 +0,0 @@ -import { module, test } from 'qunit'; -import Server from 'ember-cli-mirage/server'; -import promiseAjax from '../../helpers/promise-ajax'; -import { Response } from 'ember-cli-mirage'; - -module('Integration | Server | Custom responses', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'test' - }); - this.server.timing = 0; - this.server.logging = false; - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('GET to an empty Response defaults to 200 and an empty json object', async function(assert) { - this.server.get('/example', function() { - return new Response(); - }); - - let { data, xhr } = await promiseAjax({ - method: 'GET', - url: '/example' - }); - - assert.deepEqual(data, {}); - assert.equal(xhr.responseText, "{}"); - assert.equal(xhr.status, 200); - assert.equal(xhr.getAllResponseHeaders().trim(), "Content-Type: application/json"); - }); - - test('GET to a 200 Response responds with an empty json object', async function(assert) { - this.server.get('/example', function() { - return new Response(200); - }); - - let { data, xhr } = await promiseAjax({ - method: 'GET', - url: '/example' - }); - - assert.deepEqual(data, {}); - assert.equal(xhr.responseText, "{}"); - assert.equal(xhr.status, 200); - assert.equal(xhr.getAllResponseHeaders().trim(), "Content-Type: application/json"); - }); - - test('a 204 Response responds with an empty body', async function(assert) { - this.server.post('/example', function() { - return new Response(204); - }); - - let { data, xhr } = await promiseAjax({ - method: 'POST', - url: '/example' - }); - - assert.deepEqual(data, undefined); - assert.equal(xhr.responseText, ''); - assert.equal(xhr.status, 204); - assert.equal(xhr.getAllResponseHeaders().trim(), ''); - }); - -}); diff --git a/tests/integration/server/customized-normalize-method-test.js b/tests/integration/server/customized-normalize-method-test.js deleted file mode 100644 index c6bd65cea..000000000 --- a/tests/integration/server/customized-normalize-method-test.js +++ /dev/null @@ -1,104 +0,0 @@ -import {module, test} from 'qunit'; -import { Model, ActiveModelSerializer } from 'ember-cli-mirage'; -import { camelize } from 'ember-cli-mirage/utils/inflector'; -import Server from 'ember-cli-mirage/server'; -import promiseAjax from '../../helpers/promise-ajax'; - -module('Integration | Server | Customized normalize method', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'test', - models: { - contact: Model - }, - serializers: { - application: ActiveModelSerializer, - contact: ActiveModelSerializer.extend({ - normalize(payload) { - let attrs = payload.some.random[1].attrs; - Object.keys(attrs).forEach(camelize); - - let jsonApiDoc = { - data: { - type: 'contacts', - attributes: attrs - } - }; - return jsonApiDoc; - } - }) - } - }); - this.server.timing = 0; - this.server.logging = false; - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('custom model-specific normalize functions are used', async function(assert) { - let { server } = this; - assert.expect(3); - - server.post('/contacts'); - - let { xhr } = await promiseAjax({ - method: 'POST', - url: '/contacts', - data: JSON.stringify({ - some: { - random: [ - { - format: true - }, - { - attrs: { - first_name: 'Zelda' - } - } - ] - } - }) - }); - - assert.equal(xhr.status, 201); - assert.equal(server.db.contacts.length, 1); - assert.equal(server.db.contacts[0].firstName, 'Zelda'); - }); - - test('custom model-specific normalize functions are used with custom function handlers', async function(assert) { - let { server } = this; - - server.put('/contacts/:id', function(schema, request) { - let attrs = this.normalizedRequestAttrs(); - - assert.deepEqual(attrs, { - id: '1', - firstName: 'Zelda' - }); - - return {}; - }); - - await promiseAjax({ - method: 'PUT', - url: '/contacts/1', - contentType: 'application/json', - data: JSON.stringify({ - some: { - random: [ - { - format: true - }, - { - attrs: { - first_name: 'Zelda' - } - } - ] - } - }) - }); - }); -}); diff --git a/tests/integration/server/falsy-responses-test.js b/tests/integration/server/falsy-responses-test.js deleted file mode 100644 index 06a31ff2e..000000000 --- a/tests/integration/server/falsy-responses-test.js +++ /dev/null @@ -1,81 +0,0 @@ -import { module, test } from 'qunit'; -import Server from 'ember-cli-mirage/server'; -import promiseAjax from '../../helpers/promise-ajax'; - -module('Integration | Server | Falsy responses', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'test' - }); - this.server.timing = 0; - this.server.logging = false; - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('undefined response returns an empty object', async function(assert) { - this.server.get('/example', function() { - return undefined; - }); - - let { data, xhr } = await promiseAjax({ - method: 'GET', - url: '/example' - }); - - assert.deepEqual(data, {}); - assert.equal(xhr.responseText, "{}"); - assert.equal(xhr.status, 200); - assert.equal(xhr.getAllResponseHeaders().trim(), "Content-Type: application/json"); - }); - - test('null response returns a JSON null', async function(assert) { - this.server.get('/example', function() { - return null; - }); - - let { data, xhr } = await promiseAjax({ - method: 'GET', - url: '/example' - }); - - assert.deepEqual(data, null); - assert.equal(xhr.responseText, "null"); - assert.equal(xhr.status, 200); - assert.equal(xhr.getAllResponseHeaders().trim(), "Content-Type: application/json"); - }); - - test('empty string response returns an empty object', async function(assert) { - this.server.get('/example', function() { - return ''; - }); - - let { data, xhr } = await promiseAjax({ - method: 'GET', - url: '/example' - }); - - assert.deepEqual(data, {}); - assert.equal(xhr.responseText, "{}"); - assert.equal(xhr.status, 200); - assert.equal(xhr.getAllResponseHeaders().trim(), "Content-Type: application/json"); - }); - - test('empty object PUT response returns an empty object', async function(assert) { - this.server.put('/example', function() { - return {}; - }); - - let { data, xhr } = await promiseAjax({ - method: 'PUT', - url: '/example' - }); - - assert.deepEqual(data, {}); - assert.equal(xhr.responseText, "{}"); - assert.equal(xhr.status, 200); - assert.equal(xhr.getAllResponseHeaders().trim(), "Content-Type: application/json"); - }); -}); diff --git a/tests/integration/server/get-full-path-test.js b/tests/integration/server/get-full-path-test.js deleted file mode 100644 index 4cf8304d9..000000000 --- a/tests/integration/server/get-full-path-test.js +++ /dev/null @@ -1,99 +0,0 @@ -import {module, test} from 'qunit'; -import Server from 'ember-cli-mirage/server'; - -module('Integration | Server | Get full path', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'test' - }); - this.server.timing = 0; - this.server.logging = false; - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('it works with a configured namespace with a leading slash', function(assert) { - assert.expect(1); - let { server } = this; - server.namespace = '/api'; - - assert.equal(server._getFullPath('/contacts'), '/api/contacts'); - }); - - test('it works with a configured namespace with a trailing slash', function(assert) { - assert.expect(1); - let { server } = this; - server.namespace = 'api/'; - - assert.equal(server._getFullPath('/contacts'), '/api/contacts'); - }); - - test('it works with a configured namespace without a leading slash', function(assert) { - assert.expect(1); - let { server } = this; - server.namespace = 'api'; - - assert.equal(server._getFullPath('/contacts'), '/api/contacts'); - }); - - test('it works with a configured namespace is an empty string', function(assert) { - assert.expect(1); - let { server } = this; - server.namespace = ''; - - assert.equal(server._getFullPath('/contacts'), '/contacts'); - }); - - test('it works with a configured urlPrefix with a trailing slash', function(assert) { - assert.expect(1); - let { server } = this; - server.urlPrefix = 'http://localhost:3000/'; - - assert.equal(server._getFullPath('/contacts'), 'http://localhost:3000/contacts'); - }); - - test('it works with a configured urlPrefix without a trailing slash', function(assert) { - assert.expect(1); - let { server } = this; - server.urlPrefix = 'http://localhost:3000'; - - assert.equal(server._getFullPath('/contacts'), 'http://localhost:3000/contacts'); - }); - - test('it works with a configured urlPrefix as an empty string', function(assert) { - assert.expect(1); - let { server } = this; - server.urlPrefix = ''; - - assert.equal(server._getFullPath('/contacts'), '/contacts'); - }); - - test('it works with a configured namespace and a urlPrefix', function(assert) { - assert.expect(1); - let { server } = this; - server.namespace = 'api'; - server.urlPrefix = 'http://localhost:3000'; - - assert.equal(server._getFullPath('/contacts'), 'http://localhost:3000/api/contacts'); - }); - - test('it works with a configured namespace with a leading slash and a urlPrefix', function(assert) { - assert.expect(1); - let { server } = this; - server.namespace = '/api'; - server.urlPrefix = 'http://localhost:3000'; - - assert.equal(server._getFullPath('/contacts'), 'http://localhost:3000/api/contacts'); - }); - - test('it works with a configured namespace and a urlPrefix as empty strings', function(assert) { - assert.expect(1); - let { server } = this; - server.namespace = ''; - server.urlPrefix = ''; - - assert.equal(server._getFullPath('/contacts'), '/contacts'); - }); -}); \ No newline at end of file diff --git a/tests/integration/server/regressions/1318-linkage-data-bug-test.js b/tests/integration/server/regressions/1318-linkage-data-bug-test.js deleted file mode 100644 index a6cf49612..000000000 --- a/tests/integration/server/regressions/1318-linkage-data-bug-test.js +++ /dev/null @@ -1,74 +0,0 @@ -import { module, test } from 'qunit'; -import { Model, hasMany, belongsTo, JSONAPISerializer } from 'ember-cli-mirage'; -import Server from 'ember-cli-mirage/server'; -import promiseAjax from 'dummy/tests/helpers/promise-ajax'; - -module('Integration | Server | Regressions | 1318 Linkage bug test', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'test', - models: { - happyUser: Model.extend({ - happyLicenses: hasMany() - }), - happyLicense: Model.extend({ - happyUser: belongsTo(), - happySubscription: belongsTo() - }), - happySubscription: Model.extend({ - happyLicenses: hasMany() - }) - }, - serializers: { - application: JSONAPISerializer - }, - baseConfig() { - this.resource('happy-users'); - } - }); - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('it works', async function(assert) { - let happySubscription = this.server.create('happy-subscription'); - - let user1 = this.server.create('happy-user'); - this.server.create('happy-license', { happyUser: user1, happySubscription }); - - let user2 = this.server.create('happy-user'); - this.server.create('happy-license', { happyUser: user2, happySubscription }); - - assert.expect(1); - - let response = await promiseAjax({ - method: 'GET', - url: '/happy-users/1?include=happy-licenses.happy-subscription' - }); - let json = response.data; - - assert.deepEqual(json.included, [ - { - id: '1', - type: 'happy-licenses', - attributes: {}, - relationships: { - 'happy-subscription': { - data: { - type: 'happy-subscriptions', - id: '1' - } - } - } - }, - { - id: '1', - type: 'happy-subscriptions', - attributes: {} - } - ]); - }); - -}); diff --git a/tests/integration/server/regressions/1322-relationship-path-normalization-test.js b/tests/integration/server/regressions/1322-relationship-path-normalization-test.js deleted file mode 100644 index 70207a3b3..000000000 --- a/tests/integration/server/regressions/1322-relationship-path-normalization-test.js +++ /dev/null @@ -1,88 +0,0 @@ -import { module, test } from 'qunit'; -import { Model, hasMany, belongsTo, JSONAPISerializer } from 'ember-cli-mirage'; -import Server from 'ember-cli-mirage/server'; -import promiseAjax from 'dummy/tests/helpers/promise-ajax'; -import { underscore } from 'ember-cli-mirage/utils/inflector'; - -module('Integration | Server | Regressions | 1322 Relationship Path Normalization Test', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'test', - models: { - happyUser: Model.extend({ - happyLicenses: hasMany(), - happyAvatar: belongsTo() - }), - happyLicense: Model.extend({ - happyUser: belongsTo() - }), - happyAvatar: Model.extend({ - happyUser: belongsTo() - }) - }, - serializers: { - application: JSONAPISerializer.extend({ - keyForRelationship(relationshipName) { - return underscore(relationshipName); - } - }) - }, - baseConfig() { - this.resource('happy-licenses'); - } - }); - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('it works', async function(assert) { - let avatar1 = this.server.create('happy-avatar'); - let user1 = this.server.create('happy-user', { happyAvatar: avatar1 }); - this.server.create('happy-license', { happyUser: user1 }); - - assert.expect(2); - - let response = await promiseAjax({ - method: 'GET', - url: '/happy-licenses/1?include=happy_user.happy_avatar' - }); - let json = response.data; - - assert.deepEqual(json.data, { - attributes: {}, - id: "1", - relationships: { - "happy_user": { - data: { - id: user1.id, - type: "happy-users" - } - } - }, - type: "happy-licenses" - }); - assert.deepEqual(json.included, [ - { - id: user1.id, - type: 'happy-users', - attributes: {}, - relationships: { - 'happy_avatar': { - data: { - id: avatar1.id, - type: 'happy-avatars' - } - } - } - }, - { - id: avatar1.id, - type: 'happy-avatars', - attributes: {} - } - ]); - }); - -}); diff --git a/tests/integration/server/regressions/1613-two-bidirectional-many-to-many-with-same-target-model-update-bug-test.js b/tests/integration/server/regressions/1613-two-bidirectional-many-to-many-with-same-target-model-update-bug-test.js deleted file mode 100644 index 26712351b..000000000 --- a/tests/integration/server/regressions/1613-two-bidirectional-many-to-many-with-same-target-model-update-bug-test.js +++ /dev/null @@ -1,103 +0,0 @@ -import { module, test } from 'qunit'; -import { Model, hasMany, belongsTo, JSONAPISerializer } from 'ember-cli-mirage'; -import Server from 'ember-cli-mirage/server'; -import promiseAjax from 'dummy/tests/helpers/promise-ajax'; - -module('Integration | Server | Regressions | 1613 Two bidirectional many-to-many with same target model update bug', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'test', - models: { - user: Model.extend({ - authoredPosts: hasMany('post', { inverse: 'author' }), - editedPosts: hasMany('post', { inverse: 'editor' }) - }), - post: Model.extend({ - author: belongsTo('user', { inverse: 'authoredPosts' }), - editor: belongsTo('user', { inverse: 'editedPosts' }) - }) - }, - serializers: { - application: JSONAPISerializer.extend(), - user: JSONAPISerializer.extend({ - alwaysIncludeLinkageData: true - }) - }, - baseConfig() { - this.resource('posts'); - this.resource('users'); - } - }); - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('it stores both relationships', async function(assert) { - let post = this.server.create('post'); - let user = this.server.create('user'); - - assert.expect(1); - - await promiseAjax({ - method: 'PATCH', - url: `/posts/${post.id}`, - contentType: 'application/vnd.api+json', - data: JSON.stringify({ - data: { - id: post.id, - attributes: {}, - relationships: { - author: { - data: { - type: 'users', - id: user.id - } - }, - editor: { - data: { - type: 'users', - id: user.id - } - } - }, - type: 'posts' - } - }) - }); - - let response = await promiseAjax({ - method: 'GET', - url: `/users/${user.id}` - }); - - let json = response.data; - - assert.deepEqual(json.data, - { - "attributes": {}, - "id": "1", - "relationships": { - "authored-posts": { - "data": [ - { - "id": "1", - "type": "posts" - } - ] - }, - "edited-posts": { - "data": [ - { - "id": "1", - "type": "posts" - } - ] - } - }, - "type": "users" - }); - }); - -}); diff --git a/tests/integration/server/regressions/many-to-many-bug-test.js b/tests/integration/server/regressions/many-to-many-bug-test.js deleted file mode 100644 index 7689c3b98..000000000 --- a/tests/integration/server/regressions/many-to-many-bug-test.js +++ /dev/null @@ -1,78 +0,0 @@ -import { module, test } from 'qunit'; -import { Model, hasMany, JSONAPISerializer } from 'ember-cli-mirage'; -import Server from 'ember-cli-mirage/server'; -import promiseAjax from 'dummy/tests/helpers/promise-ajax'; - -module('Integration | Server | Regressions | Many to many bug', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'test', - models: { - post: Model.extend({ - tags: hasMany() - }), - tag: Model.extend({ - posts: hasMany() - }) - }, - serializers: { - application: JSONAPISerializer - }, - baseConfig() { - this.resource('posts'); - } - }); - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('it works', async function(assert) { - assert.expect(6); - - let serverTagA = this.server.create('tag', { name: 'A', slug: 'a' }); - let serverTagB = this.server.create('tag', { name: 'B', slug: 'b' }); - let serverPost = this.server.create('post', { - title: 'Post 1', - tags: [ serverTagA, serverTagB ] - }); - - assert.equal(serverTagA.postIds.length, 1); - assert.equal(serverTagB.postIds.length, 1); - assert.deepEqual(serverPost.tagIds, [ '1', '2' ]); - - await promiseAjax({ - method: 'PATCH', - url: '/posts/1', - data: JSON.stringify({ - "data": { - "id": "1", - "attributes": { - "title": "Post 2" - }, - "relationships": { - "tags": { - "data": [ - { - "type": "tags", - "id": "2" - } - ] - } - }, - "type": "posts" - } - }) - }); - - serverTagA.reload(); - serverTagB.reload(); - serverPost.reload(); - - assert.deepEqual(serverTagA.postIds, []); - assert.deepEqual(serverTagB.postIds, [ '1' ]); - assert.deepEqual(serverPost.tagIds, [ '2' ]); - }); - -}); diff --git a/tests/integration/server/resource-shorthand-test.js b/tests/integration/server/resource-shorthand-test.js deleted file mode 100644 index 1e6875150..000000000 --- a/tests/integration/server/resource-shorthand-test.js +++ /dev/null @@ -1,501 +0,0 @@ -import { module, test } from "qunit"; -import { Model, ActiveModelSerializer } from "ember-cli-mirage"; -import Server from "ember-cli-mirage/server"; -import promiseAjax from "../../helpers/promise-ajax"; - -module("Integration | Server | Resource shorthand", function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: "test", - models: { - contact: Model, - blogPost: Model - }, - serializers: { - application: ActiveModelSerializer - } - }); - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test("resource generates get shorthand for index action", async function(assert) { - assert.expect(2); - - this.server.db.loadData({ - contacts: [{ id: 1, name: "Link" }, { id: 2, name: "Zelda" }], - blogPosts: [{ id: 1, title: "Post 1" }, { id: 2, title: "Post 2" }] - }); - - this.server.resource("contacts"); - - let { data, xhr } = await promiseAjax({ - method: "GET", - url: "/contacts" - }); - - assert.equal(xhr.status, 200); - assert.deepEqual(data, { - contacts: [{ id: "1", name: "Link" }, { id: "2", name: "Zelda" }] - }); - }); - - test("resource generates get shorthand for show action", async function(assert) { - assert.expect(2); - - this.server.db.loadData({ - contacts: [{ id: 1, name: "Link" }, { id: 2, name: "Zelda" }], - blogPosts: [{ id: 1, title: "Post 1" }, { id: 2, title: "Post 2" }] - }); - - this.server.resource("contacts"); - this.server.resource("blog-posts", { path: "/posts" }); - - let { data, xhr } = await promiseAjax({ - method: "GET", - url: "/contacts/2" - }); - - assert.equal(xhr.status, 200); - assert.deepEqual(data, { contact: { id: "2", name: "Zelda" } }); - }); - - test("resource generates post shorthand", async function(assert) { - let { server } = this; - assert.expect(2); - - server.resource("contacts"); - - let { xhr } = await promiseAjax({ - method: "POST", - url: "/contacts", - data: JSON.stringify({ - contact: { - name: "Zelda" - } - }) - }); - - assert.equal(xhr.status, 201); - assert.equal(server.db.contacts.length, 1); - }); - - test("resource generates put shorthand", async function(assert) { - let { server } = this; - assert.expect(2); - - this.server.db.loadData({ - contacts: [{ id: 1, name: "Link" }], - blogPosts: [{ id: 1, title: "Post 1" }] - }); - - server.resource("contacts"); - - let { xhr } = await promiseAjax({ - method: "PUT", - url: "/contacts/1", - data: JSON.stringify({ - contact: { - name: "Zelda" - } - }) - }); - - assert.equal(xhr.status, 200); - assert.equal(server.db.contacts[0].name, "Zelda"); - }); - - test("resource generates patch shorthand", async function(assert) { - let { server } = this; - assert.expect(2); - - this.server.db.loadData({ - contacts: [{ id: 1, name: "Link" }], - blogPosts: [{ id: 1, title: "Post 1" }] - }); - - server.resource("contacts"); - - let { xhr } = await promiseAjax({ - method: "PATCH", - url: "/contacts/1", - data: JSON.stringify({ - contact: { - name: "Zelda" - } - }) - }); - - assert.equal(xhr.status, 200); - assert.equal(server.db.contacts[0].name, "Zelda"); - }); - - test("resource generates delete shorthand works", async function(assert) { - let { server } = this; - assert.expect(2); - - this.server.db.loadData({ - contacts: [{ id: 1, name: "Link" }], - blogPosts: [{ id: 1, title: "Post 1" }] - }); - - server.resource("contacts"); - - let { xhr } = await promiseAjax({ - method: "DELETE", - url: "/contacts/1" - }); - - assert.equal(xhr.status, 204); - assert.equal(server.db.contacts.length, 0); - }); - - test("resource accepts a custom path for a resource", async function(assert) { - assert.expect(6); - - this.server.db.loadData({ - blogPosts: [{ id: 1, title: "Post 1" }, { id: 2, title: "Post 2" }] - }); - - this.server.resource("blog-posts", { path: "/posts" }); - - let indexResponse = await promiseAjax({ - method: "GET", - url: "/posts" - }); - assert.equal( - indexResponse.xhr.status, - 200, - "Should receive a 200 response from resource index action" - ); - - let showResponse = await promiseAjax({ - method: "GET", - url: "/posts/2" - }); - assert.equal( - showResponse.xhr.status, - 200, - "Should receive a 200 response from resource show action" - ); - - let createResponse = await promiseAjax({ - method: "POST", - url: "/posts", - data: JSON.stringify({ - blog_post: { - name: "Post 1" - } - }) - }); - assert.equal( - createResponse.xhr.status, - 201, - "Should receive 201 response from resource create action" - ); - - let updatePutResponse = await promiseAjax({ - method: "PUT", - url: "/posts/1", - data: JSON.stringify({ - blog_post: { - name: "Post 2" - } - }) - }); - assert.equal( - updatePutResponse.xhr.status, - 200, - "Should receive 200 response from resource update action with PUT" - ); - - let updatePatchResponse = await promiseAjax({ - method: "PATCH", - url: "/posts/1", - data: JSON.stringify({ - blog_post: { - name: "Post 2" - } - }) - }); - assert.equal( - updatePatchResponse.xhr.status, - 200, - "Should receive 200 response from resource update action with PATCH" - ); - - let deleteResponse = await promiseAjax({ - method: "DELETE", - url: "/posts/1" - }); - assert.equal( - deleteResponse.xhr.status, - 204, - "Should receive 204 response from the resource delete action" - ); - }); - - test("resource accepts singular name", async function(assert) { - assert.expect(4); - - this.server.db.loadData({ - contacts: [{ id: 1, name: "Link" }, { id: 2, name: "Zelda" }], - blogPosts: [{ id: 1, title: "Post 1" }, { id: 2, title: "Post 2" }] - }); - - this.server.resource("contact"); - this.server.resource("blog-post", { path: "/posts" }); - - let contactsResponse = await promiseAjax({ - method: "GET", - url: "/contacts" - }); - - assert.equal(contactsResponse.xhr.status, 200); - assert.deepEqual(contactsResponse.data, { - contacts: [{ id: "1", name: "Link" }, { id: "2", name: "Zelda" }] - }); - - let postsResponse = await promiseAjax({ - method: "GET", - url: "/posts" - }); - - assert.equal(postsResponse.xhr.status, 200); - assert.deepEqual(postsResponse.data, { - blog_posts: [{ id: "1", title: "Post 1" }, { id: "2", title: "Post 2" }] - }); - }); - - test("resource does not accept both :all and :except options", function(assert) { - let { server } = this; - - assert.throws(() => { - server.resource("contacts", { only: ["index"], except: ["create"] }); - }, "cannot use both :only and :except options"); - }); - - test("resource generates shorthands which are whitelisted by :only option", async function(assert) { - let { server } = this; - assert.expect(1); - - server.db.loadData({ - contacts: [{ id: 1, name: "Link" }, { id: 2, name: "Zelda" }] - }); - - server.resource("contacts", { only: ["index"] }); - - let { xhr } = await promiseAjax({ - method: "GET", - url: "/contacts" - }); - - assert.equal(xhr.status, 200); - }); - - test("resource does not generate shorthands which are not whitelisted with :only option", async function(assert) { - let { server } = this; - assert.expect(5); - - server.db.loadData({ - contacts: [{ id: 1, name: "Link" }] - }); - - server.resource("contacts", { only: ["index"] }); - - try { - await promiseAjax({ - method: "GET", - url: "/contacts/1" - }); - } catch (e) { - assert.ok( - e.error.message.indexOf("Mirage: Your app tried to GET '/contacts/1'") > - -1, - "Should receive an error from Mirage when requesting the show action" - ); - } - - try { - await promiseAjax({ - method: "POST", - url: "/contacts", - data: JSON.stringify({ - contact: { - name: "Zelda" - } - }) - }); - } catch (e) { - assert.ok( - e.error.message.indexOf("Mirage: Your app tried to POST '/contacts'") > - -1, - "Should receive an error from Mirage when requesting the create action" - ); - } - - try { - await promiseAjax({ - method: "PUT", - url: "/contacts/1", - data: JSON.stringify({ - contact: { - name: "Zelda" - } - }) - }); - } catch (e) { - assert.ok( - e.error.message.indexOf("Mirage: Your app tried to PUT '/contacts/1'") > - -1, - "Should receive an error from Mirage when requesting the update action with PUT" - ); - } - - try { - await promiseAjax({ - method: "PATCH", - url: "/contacts/1", - data: JSON.stringify({ - contact: { - name: "Zelda" - } - }) - }); - } catch (e) { - assert.ok( - e.error.message.indexOf( - "Mirage: Your app tried to PATCH '/contacts/1'" - ) > -1, - "Should receive an error from Mirage when requesting the update action with PATCH" - ); - } - - try { - await promiseAjax({ - method: "DELETE", - url: "/contacts/1" - }); - } catch (e) { - assert.ok( - e.error.message.indexOf( - "Mirage: Your app tried to DELETE '/contacts/1'" - ) > -1, - "Should receive an error from Mirage when requesting the delet action" - ); - } - }); - - test("resource generates shorthands which are not blacklisted by :except option", async function(assert) { - let { server } = this; - assert.expect(2); - - server.db.loadData({ - contacts: [{ id: 1, name: "Link" }] - }); - - server.resource("contacts", { except: ["create", "update", "delete"] }); - - let indexResponse = await promiseAjax({ - method: "GET", - url: "/contacts" - }); - assert.equal( - indexResponse.xhr.status, - 200, - "Should receive a 200 response from resource index action" - ); - - let showResponse = await promiseAjax({ - method: "GET", - url: "/contacts/1" - }); - assert.equal( - showResponse.xhr.status, - 200, - "Should receive a 200 response from resource show action" - ); - }); - - test("resource does not generate shorthands which are blacklisted by :except option", async function(assert) { - let { server } = this; - assert.expect(4); - - server.db.loadData({ - contacts: [{ id: 1, name: "Link" }] - }); - - server.resource("contacts", { except: ["create", "update", "delete"] }); - - try { - await promiseAjax({ - method: "POST", - url: "/contacts", - data: JSON.stringify({ - contact: { - name: "Zelda" - } - }) - }); - } catch (e) { - assert.ok( - e.error.message.indexOf("Mirage: Your app tried to POST '/contacts'") > - -1, - "Should receive an error from Mirage when requesting the create action" - ); - } - - try { - await promiseAjax({ - method: "PUT", - url: "/contacts/1", - data: JSON.stringify({ - contact: { - name: "Zelda" - } - }) - }); - } catch (e) { - assert.ok( - e.error.message.indexOf("Mirage: Your app tried to PUT '/contacts/1'") > - -1, - "Should receive an error from Mirage when requesting the update action with PUT" - ); - } - - try { - await promiseAjax({ - method: "PATCH", - url: "/contacts/1", - data: JSON.stringify({ - contact: { - name: "Zelda" - } - }) - }); - } catch (e) { - assert.ok( - e.error.message.indexOf( - "Mirage: Your app tried to PATCH '/contacts/1'" - ) > -1, - "Should receive an error from Mirage when requesting the update action with PATCH" - ); - } - - try { - await promiseAjax({ - method: "DELETE", - url: "/contacts/1" - }); - } catch (e) { - assert.ok( - e.error.message.indexOf( - "Mirage: Your app tried to DELETE '/contacts/1'" - ) > -1, - "Should receive an error from Mirage when requesting the delet action" - ); - } - }); -}); diff --git a/tests/integration/server/shorthands/active-model-serializer-sanity-test.js b/tests/integration/server/shorthands/active-model-serializer-sanity-test.js deleted file mode 100644 index 6b2bec8ea..000000000 --- a/tests/integration/server/shorthands/active-model-serializer-sanity-test.js +++ /dev/null @@ -1,138 +0,0 @@ -import {module, test} from 'qunit'; -import { Model, ActiveModelSerializer } from 'ember-cli-mirage'; -import Server from 'ember-cli-mirage/server'; -import promiseAjax from '../../../helpers/promise-ajax'; - -module('Integration | Server | Shorthands | Active Model Serializer Sanity check', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'test', - models: { - contact: Model - }, - serializers: { - application: ActiveModelSerializer - } - }); - this.server.timing = 0; - this.server.logging = false; - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('a get shorthand works', async function(assert) { - assert.expect(2); - - this.server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' } - ] - }); - - this.server.get('/contacts'); - - let { xhr, data } = await promiseAjax({ - method: 'GET', - url: '/contacts' - }); - - assert.equal(xhr.status, 200); - assert.deepEqual(data, { contacts: [{ id: '1', name: 'Link' }] }); - }); - - test('a post shorthand works', async function(assert) { - let { server } = this; - assert.expect(2); - - server.post('/contacts'); - - let { xhr } = await promiseAjax({ - method: 'POST', - url: '/contacts', - data: JSON.stringify({ - contact: { - name: 'Zelda' - } - }) - }); - - assert.equal(xhr.status, 201); - assert.equal(server.db.contacts.length, 1); - }); - - test('a put shorthand works', async function(assert) { - let { server } = this; - assert.expect(2); - - this.server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' } - ] - }); - - server.put('/contacts/:id'); - - let { xhr } = await promiseAjax({ - method: 'PUT', - url: '/contacts/1', - data: JSON.stringify({ - contact: { - name: 'Zelda' - } - }) - }); - - assert.equal(xhr.status, 200); - assert.equal(server.db.contacts[0].name, 'Zelda'); - }); - - test('a patch shorthand works', async function(assert) { - let { server } = this; - assert.expect(2); - - this.server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' } - ] - }); - - server.patch('/contacts/:id'); - - let { xhr } = await promiseAjax({ - method: 'PATCH', - url: '/contacts/1', - data: JSON.stringify({ - contact: { - name: 'Zelda' - } - }) - }); - - assert.equal(xhr.status, 200); - assert.equal(server.db.contacts[0].name, 'Zelda'); - }); - - test('a delete shorthand works', async function(assert) { - let { server } = this; - assert.expect(3); - - this.server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' } - ] - }); - - server.del('/contacts/:id'); - - let { xhr } = await promiseAjax({ - method: 'DELETE', - url: '/contacts/1' - }); - - assert.equal(xhr.responseText, ""); - assert.equal(xhr.status, 204); - assert.equal(server.db.contacts.length, 0); - }); -}); diff --git a/tests/integration/server/shorthands/patch-shorthand-with-relationships-test.js b/tests/integration/server/shorthands/patch-shorthand-with-relationships-test.js deleted file mode 100644 index b1be6758e..000000000 --- a/tests/integration/server/shorthands/patch-shorthand-with-relationships-test.js +++ /dev/null @@ -1,187 +0,0 @@ -import { module, test } from 'qunit'; -import Server from 'ember-cli-mirage/server'; -import { Model, belongsTo, hasMany } from 'ember-cli-mirage'; -import PostShorthandRouteHandler from 'ember-cli-mirage/route-handlers/shorthands/post'; -import JSONAPISerializer from 'ember-cli-mirage/serializers/json-api-serializer'; -import promiseAjax from '../../../helpers/promise-ajax'; - -module('Integration | Server | Shorthands | Patch with relationships', function(hooks) { - hooks.beforeEach(function() { - this.newServerWithSchema = function(schema) { - this.server = new Server({ - environment: 'development', - models: schema - }); - this.server.timing = 0; - this.server.logging = false; - this.schema = this.server.schema; - - this.serializer = new JSONAPISerializer(); - - return this.server; - }; - - this.handleRequest = function({ url, body }) { - let request = { requestBody: JSON.stringify(body), url }; - let handler = new PostShorthandRouteHandler(this.schema, this.serializer); - return handler.handle(request); - }; - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('it can null out belongs to relationships', async function(assert) { - let server = this.newServerWithSchema({ - author: Model.extend({ - posts: hasMany() - }), - post: Model.extend({ - author: belongsTo() - }) - }); - server.loadConfig(function() { - this.patch('/posts/:id'); - }); - - let author = server.create('author'); - let post = server.create('post', { author }); - - await promiseAjax({ - method: 'PATCH', - url: `/posts/${post.id}`, - data: JSON.stringify({ - data: { - attributes: { - title: 'Post 1' - }, - relationships: { - author: { - data: null - } - } - } - }) - }); - - post.reload(); - assert.equal(post.author, null); - }); - - test('it can null out belongs to polymorphic relationships', async function(assert) { - let server = this.newServerWithSchema({ - video: Model.extend(), - post: Model.extend(), - comment: Model.extend({ - commentable: belongsTo({ polymorphic: true }) - }) - }); - server.loadConfig(function() { - this.patch('/comments/:id'); - }); - - let video = server.create('video'); - let comment = server.create('comment', { - commentable: video - }); - - await promiseAjax({ - method: 'PATCH', - url: `/comments/${comment.id}`, - data: JSON.stringify({ - data: { - attributes: { - title: 'Post 1' - }, - relationships: { - commentable: { - data: null - } - } - } - }) - }); - - comment.reload(); - assert.equal(comment.commentable, null); - }); - - test('it can null out has many polymorphic relationships', async function(assert) { - let server = this.newServerWithSchema({ - car: Model.extend(), - watch: Model.extend(), - user: Model.extend({ - collectibles: hasMany({ polymorphic: true }) - }) - }); - server.loadConfig(function() { - this.patch('/users/:id'); - }); - - let car = server.create('car'); - let watch = server.create('watch'); - let user = server.create('user', { - collectibles: [ car, watch ] - }); - - await promiseAjax({ - method: 'PATCH', - url: `/users/${user.id}`, - data: JSON.stringify({ - data: { - attributes: { - }, - relationships: { - collectibles: { - data: null - } - } - } - }) - }); - - user.reload(); - assert.equal(user.collectibles.length, 0); - }); - - test('it camelizes relationship names', async function(assert) { - let server = this.newServerWithSchema({ - postAuthor: Model.extend({ - posts: hasMany() - }), - post: Model.extend({ - postAuthor: belongsTo() - }) - }); - - server.loadConfig(function() { - this.patch('/posts/:id'); - }); - - let postAuthor = server.create('post-author'); - let post = server.create('post'); - - await promiseAjax({ - method: 'PATCH', - url: `/posts/${post.id}`, - data: JSON.stringify({ - data: { - attributes: { - }, - relationships: { - 'post-author': { - data: { - id: postAuthor.id, - type: 'post-authors' - } - } - } - } - }) - }); - - post.reload(); - assert.equal(post.postAuthorId, postAuthor.id, 'relationship gets updated successfully'); - }); -}); diff --git a/tests/integration/server/shorthands/post-shorthand-with-relationships-test.js b/tests/integration/server/shorthands/post-shorthand-with-relationships-test.js deleted file mode 100644 index 7c049e6c2..000000000 --- a/tests/integration/server/shorthands/post-shorthand-with-relationships-test.js +++ /dev/null @@ -1,175 +0,0 @@ -import { module, test } from 'qunit'; -import Server from 'ember-cli-mirage/server'; -import { Model, belongsTo, hasMany } from 'ember-cli-mirage'; -import PostShorthandRouteHandler from 'ember-cli-mirage/route-handlers/shorthands/post'; -import JSONAPISerializer from 'ember-cli-mirage/serializers/json-api-serializer'; -import promiseAjax from '../../../helpers/promise-ajax'; - -module('Integration | Server | Shorthands | Post with relationships', function(hooks) { - hooks.beforeEach(function() { - this.newServerWithSchema = function(schema) { - this.server = new Server({ - environment: 'development', - models: schema - }); - this.server.timing = 0; - this.server.logging = false; - this.schema = this.server.schema; - - this.serializer = new JSONAPISerializer(); - - return this.server; - }; - - this.handleRequest = function({ url, body }) { - let request = { requestBody: JSON.stringify(body), url }; - let handler = new PostShorthandRouteHandler(this.schema, this.serializer); - return handler.handle(request); - }; - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('it works for belongs to', async function(assert) { - let server = this.newServerWithSchema({ - author: Model.extend({ - posts: hasMany() - }), - post: Model.extend({ - author: belongsTo() - }) - }); - server.loadConfig(function() { - this.post('/posts'); - }); - - assert.equal(server.db.posts.length, 0); - - let author = server.create('author'); - - let response = await promiseAjax({ - method: 'POST', - url: '/posts', - data: JSON.stringify({ - data: { - attributes: { - title: 'Post 1' - }, - relationships: { - author: { - data: { - type: 'authors', - id: author.id - } - } - } - } - }) - }); - - let postId = response.data.post.id; - let post = server.schema.posts.find(postId); - - assert.ok(post); - assert.equal(post.author.id, author.id); - }); - - test('it works for belongs to polymorphic', async function(assert) { - let server = this.newServerWithSchema({ - video: Model.extend(), - post: Model.extend(), - comment: Model.extend({ - commentable: belongsTo({ polymorphic: true }) - }) - }); - server.loadConfig(function() { - this.post('/comments'); - }); - - assert.equal(server.db.comments.length, 0); - - let video = server.create('video'); - - let response = await promiseAjax({ - method: 'POST', - url: '/comments', - data: JSON.stringify({ - data: { - type: 'comments', - attributes: { - text: 'Comment 1' - }, - relationships: { - commentable: { - data: { - type: 'videos', - id: video.id - } - } - } - } - }) - }); - - let commentId = response.data.comment.id; - let comment = server.schema.comments.find(commentId); - - assert.ok(comment); - assert.ok(comment.commentable.equals(video)); - }); - - test('it works for has many polymorphic', async function(assert) { - let server = this.newServerWithSchema({ - car: Model.extend(), - watch: Model.extend(), - user: Model.extend({ - collectibles: hasMany({ polymorphic: true }) - }) - }); - server.loadConfig(function() { - this.post('/users'); - }); - - assert.equal(server.db.users.length, 0); - - let car = server.create('car'); - let watch = server.create('watch'); - - let response = await promiseAjax({ - method: 'POST', - url: '/users', - data: JSON.stringify({ - data: { - type: 'users', - attributes: { - name: 'Elon Musk' - }, - relationships: { - collectibles: { - data: [ - { - type: 'cars', - id: car.id - }, - { - type: 'watches', - id: watch.id - } - ] - } - } - } - }) - }); - - let userId = response.data.user.id; - let user = server.schema.users.find(userId); - - assert.ok(user); - assert.ok(user.collectibles.includes(car)); - assert.ok(user.collectibles.includes(watch)); - }); - -}); diff --git a/tests/integration/server/shorthands/rest-serializer-sanity-test.js b/tests/integration/server/shorthands/rest-serializer-sanity-test.js deleted file mode 100644 index 7030010ca..000000000 --- a/tests/integration/server/shorthands/rest-serializer-sanity-test.js +++ /dev/null @@ -1,152 +0,0 @@ -import { module, test } from 'qunit'; -import { Model, hasMany, belongsTo, RestSerializer } from 'ember-cli-mirage'; -import Server from 'ember-cli-mirage/server'; -import promiseAjax from '../../../helpers/promise-ajax'; - -module('Integration | Server | Shorthands | REST Serializer Sanity check', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'test', - models: { - contact: Model.extend({ - addresses: hasMany() - }), - address: Model.extend({ - contact: belongsTo() - }) - }, - serializers: { - application: RestSerializer.extend({ - normalizeIds: true - }) - } - }); - this.server.timing = 0; - this.server.logging = false; - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('a get shorthand works', async function(assert) { - assert.expect(2); - - this.server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' } - ] - }); - - this.server.get('/contacts'); - - let { xhr, data } = await promiseAjax({ - method: 'GET', - url: '/contacts' - }); - - assert.equal(xhr.status, 200); - assert.deepEqual(data, { contacts: [{ id: '1', name: 'Link', addresses: [] }] }); - }); - - test('a post shorthand works', async function(assert) { - let { server } = this; - assert.expect(3); - - this.server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' } - ] - }); - - server.post('/addresses'); - - let { xhr } = await promiseAjax({ - method: 'POST', - url: '/addresses', - data: JSON.stringify({ - address: { - street: '5th ave', - contact: 1 - } - }) - }); - - assert.equal(xhr.status, 201); - assert.equal(server.db.addresses.length, 1); - assert.equal(server.db.addresses[0].contactId, 1); - }); - - test('a put shorthand works', async function(assert) { - let { server } = this; - assert.expect(2); - - this.server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' } - ] - }); - - server.put('/contacts/:id'); - - let { xhr } = await promiseAjax({ - method: 'PUT', - url: '/contacts/1', - data: JSON.stringify({ - contact: { - name: 'Zelda' - } - }) - }); - - assert.equal(xhr.status, 200); - assert.equal(server.db.contacts[0].name, 'Zelda'); - }); - - test('a patch shorthand works', async function(assert) { - let { server } = this; - assert.expect(2); - - this.server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' } - ] - }); - - server.patch('/contacts/:id'); - - let { xhr } = await promiseAjax({ - method: 'PATCH', - url: '/contacts/1', - data: JSON.stringify({ - contact: { - name: 'Zelda' - } - }) - }); - - assert.equal(xhr.status, 200); - assert.equal(server.db.contacts[0].name, 'Zelda'); - }); - - test('a delete shorthand works', async function(assert) { - let { server } = this; - assert.expect(2); - - this.server.db.loadData({ - contacts: [ - { id: 1, name: 'Link' } - ] - }); - - server.del('/contacts/:id'); - - let { xhr } = await promiseAjax({ - method: 'DELETE', - url: '/contacts/1' - }); - - assert.equal(xhr.status, 204); - assert.equal(server.db.contacts.length, 0); - }); -}); diff --git a/tests/performance/simple-factory-test.js b/tests/performance/simple-factory-test.js deleted file mode 100644 index 3fdb6182a..000000000 --- a/tests/performance/simple-factory-test.js +++ /dev/null @@ -1,38 +0,0 @@ -import { module } from 'qunit'; -import { Model, Factory } from 'ember-cli-mirage'; -import Server from 'ember-cli-mirage/server'; -import { perfTest } from './utils'; - -module('Performance | Factory | Simple', { - beforeEach() { - this.Car = Model.extend(); - this.CarFactory = Factory.extend({ - make: 'Fjord', - model: 'Wagon', - year: '1886' - }); - - this.server = new Server({ - environment: 'test', - models: { - car: this.Car - }, - factories: { - car: this.CarFactory - } - }); - this.server.timing = 0; - this.server.logging = false; - }, - afterEach() { - this.server.shutdown(); - } -}); - -const carMaker = (count) => { - server.createList('car', count); -}; - -perfTest(50, 'models', carMaker); -perfTest(500, 'models', carMaker); -perfTest(5000, 'models', carMaker); diff --git a/tests/performance/utils.js b/tests/performance/utils.js deleted file mode 100644 index 4dc8aaf25..000000000 --- a/tests/performance/utils.js +++ /dev/null @@ -1,30 +0,0 @@ -import { test } from 'qunit'; - -export function perfTest(count, message, testFn, timeout = 0) { - test(`(${count}) ${message}`, function(assert) { - var duration = time(() => { - testFn(count); - }); - - if (timeout) { - assert.ok(duration < timeout, `${duration}ms (${timeout}ms timeout)`); - } else { - assert.ok(true, `${duration}ms`); - } - }); -} - -export function time(fn) { - var start = now(); - fn(); - - return now() - start; -} - -export function now() { - return performance - ? performance.now() - : Date.now - ? Date.now() - : +new Date(); -} diff --git a/tests/unit/collection-test.js b/tests/unit/collection-test.js deleted file mode 100644 index 48a6333ac..000000000 --- a/tests/unit/collection-test.js +++ /dev/null @@ -1,64 +0,0 @@ -import Collection from 'ember-cli-mirage/orm/collection'; -import {module, test} from 'qunit'; - -module('Unit | Collection', function() { - test('it can be instantiated', function(assert) { - let collection = new Collection('plant'); - - assert.ok(collection); - }); - - test('it cannot be instantiated without a modelName', function(assert) { - assert.throws(() => { - new Collection(); - }, /must pass a `modelName`/); - }); - - test('it knows its modelname', function(assert) { - let collection = new Collection('author'); - - assert.equal(collection.modelName, 'author'); - }); - - test('it can be instantiated with an array of models', function(assert) { - let models = [{ id: 1 }, { id: 2 }, { id: 3 }]; - let collection = new Collection('author', models); - - assert.ok(collection); - }); - - test('#models returns the underlying array', function(assert) { - let models = [{ id: 1 }, { id: 2 }, { id: 3 }]; - let collection = new Collection('author', models); - - assert.deepEqual(collection.models, models); - }); - - test('#length returns the number of elements', function(assert) { - let models = [{ id: 1 }, { id: 2 }]; - let collection = new Collection('post', models); - - assert.equal(collection.length, 2); - - collection.models = [{ id: 1 }]; - assert.equal(collection.length, 1); - }); - - // test('collection.filter returns collection instance', function(assert) { - // let collection = new Collection('plant'); - // let filteredCollection = collection.filter(Boolean); - // assert.ok(filteredCollection instanceof Collection); - // assert.equal(filteredCollection.modelName, 'plant'); - // }); - // - // test('collection.mergeCollection works', function(assert) { - // let collection1 = new Collection('plant', { name: 'chrerry' }, { name: 'uchreaflier' }); - // let collection2 = new Collection('plant', { name: 'vlip' }); - // assert.equal(collection1.length, 2); - // assert.equal(collection2.length, 1); - // collection2.mergeCollection(collection1); - // assert.equal(collection2.length, 3); - // assert.equal(collection2.modelName, 'plant'); - // }); - // -}); diff --git a/tests/unit/controller-test.js b/tests/unit/controller-test.js deleted file mode 100644 index 395fca1a8..000000000 --- a/tests/unit/controller-test.js +++ /dev/null @@ -1,128 +0,0 @@ -// import Controller from 'ember-cli-mirage/controller'; -// import Db from 'ember-cli-mirage/db'; -// import Response from 'ember-cli-mirage/response'; - -// import {module, test} from 'qunit'; - -// var contacts = [{id: 1, name: 'Link', address_ids: [1]}, {id: 2, name: 'Zelda', address_ids: [2]}]; -// var addresses = [{id: 1, name: '123 Hyrule Way', contact_id: 1}, {id: 2, name: '456 Hyrule Way', contact_id: 2}]; -// var db; -// module('mirage:controller', { -// beforeEach: function() { -// db = new Db(); -// db.createCollections('contacts', 'addresses'); -// db.contacts.insert(contacts); -// db.addresses.insert(addresses); - -// var serializerDouble = { -// serialize: function(res) {return res; } -// }; -// this.controller = new Controller(serializerDouble); -// } -// }); - -// test("function handler works", function(assert) { -// var response = this.controller.handle('get', function(db, request) { -// return db.contacts; -// }, db, {params: {id: 1}}); - -// assert.deepEqual(response[2], contacts); -// }); - -// test("function handler works with custom response", function(assert) { -// var response = this.controller.handle('get', function(db, request) { -// return new Response(201, {some: 'header'}, {some: 'data'}); -// }, db); - -// assert.deepEqual(response, [201, {some: 'header'}, {some: 'data'}]); -// }); - -// test('its default response is 200 if the verb is get', function(assert) { -// var response = this.controller.handle('get', {}); -// assert.equal(response[0], 200); -// }); - -// test('its default response is 204 if the verb is put and the response is empty', function(assert) { -// var response = this.controller.handle('put', {}); -// assert.equal(response[0], 204); -// }); - -// test('its default response is 200 if the verb is put and the response is not empty and no specific code passed', function(assert) { -// var response = this.controller.handle('put', function() { -// return { text: 'thanks' }; -// }); -// assert.equal(response[0], 200, 'Returning a non-empty object changes the default code to 200'); - -// var response2 = this.controller.handle('put', function() { -// return []; -// }); -// assert.equal(response2[0], 200, 'An empty array IS NOT an empty response'); - -// var response3 = this.controller.handle('put', function() { -// return; -// }); -// assert.equal(response3[0], 204, 'undefined is considered an empty response'); - -// var response4 = this.controller.handle('put', function() { -// return ''; -// }); -// assert.equal(response4[0], 204, 'An empty string is considered and empty response'); - -// var response5 = this.controller.handle('put', function() { -// return; -// }, 204); -// assert.equal(response5[0], 204, 'If the response code is forced, that takes precedence'); - -// var response6 = this.controller.handle('put', function() { -// return {}; -// }, 204); -// assert.equal(response6[0], 204, 'An empty object is considered and empty response'); -// }); - -// test('its default response is 201 if the verb is post', function(assert) { -// var response = this.controller.handle('put', {}); -// assert.equal(response[0], 204); -// }); - -// test('its default response is 204 if the verb is delete and the response is empty', function(assert) { -// var response = this.controller.handle('delete', {}); -// assert.equal(response[0], 204); -// }); - -// test('its default response is 200 if the verb is delete and the response is not empty and no specific code passed', function(assert) { -// var response = this.controller.handle('delete', function() { -// return { text: 'thanks' }; -// }); -// assert.equal(response[0], 200, 'Returning a non-empty object changes the default code to 200'); - -// var response2 = this.controller.handle('delete', function() { -// return []; -// }); -// assert.equal(response2[0], 200, 'An empty array IS NOT an empty response'); - -// var response3 = this.controller.handle('delete', function() { -// return; -// }); -// assert.equal(response3[0], 204, 'undefined is considered an empty response'); - -// var response4 = this.controller.handle('delete', function() { -// return ''; -// }); -// assert.equal(response4[0], 204, 'An empty string is considered and empty response'); - -// var response5 = this.controller.handle('delete', function() { -// return; -// }, 204); -// assert.equal(response5[0], 204, 'If the response code is forced, that takes precedence'); - -// var response6 = this.controller.handle('delete', function() { -// return {}; -// }, 204); -// assert.equal(response6[0], 204, 'An empty object is considered and empty response'); -// }); - -// // TODO: Use spies to ensure get#shorthand is called with appropriate args -// // module('mirage:controller#get'); -// // module('mirage:controller#post'); -// // module('mirage:controller#put'); -// // module('mirage:controller#delete'); diff --git a/tests/unit/db-test.js b/tests/unit/db-test.js deleted file mode 100644 index 93bf754fc..000000000 --- a/tests/unit/db-test.js +++ /dev/null @@ -1,657 +0,0 @@ -import Db from 'ember-cli-mirage/db'; -import DefaultIdentityManager from 'ember-cli-mirage/identity-manager'; - -import {module, test} from 'qunit'; - -let db; - -module('Unit | Db', function() { - test('it can be instantiated', function(assert) { - db = new Db(); - assert.ok(db); - }); - - test('it can load data on instantiation', function(assert) { - db = new Db({ - users: [{ id: 1, name: 'Link' }], - addresses: [{ id: 1, name: '123 Hyrule Way' }, { id: 2, name: 'Lorem ipsum' }] - }); - - assert.equal(db.users.length, 1); - assert.equal(db.addresses.length, 2); - }); - - test('it can empty its data', function(assert) { - db = new Db({ - users: [{ id: 1, name: 'Link' }], - addresses: [{ id: 1, name: '123 Hyrule Way' }, { id: 2, name: 'Lorem ipsum' }] - }); - - db.emptyData(); - - assert.equal(db.users.length, 0); - assert.equal(db.addresses.length, 0); - }); -}); - -module('Unit | Db #createCollection', function(hooks) { - hooks.beforeEach(function() { - db = new Db(); - }); - - hooks.afterEach(function() { - db.emptyData(); - }); - - test('it can create an empty collection', function(assert) { - db.createCollection('contacts'); - - assert.ok(db.contacts); - }); - - test('it can create many collections', function(assert) { - db.createCollections('contacts', 'addresses'); - - assert.ok(db.contacts); - assert.ok(db.addresses); - }); -}); - -module('Unit | Db #loadData', function(hooks) { - hooks.beforeEach(function() { - db = new Db(); - }); - - hooks.afterEach(function() { - db.emptyData(); - }); - - test('it can load an object of data', function(assert) { - let data = { - contacts: [{ id: '1', name: 'Link' }], - addresses: [{ id: '1', name: '123 Hyrule Way' }] - }; - db.loadData(data); - - assert.deepEqual(db.contacts, data.contacts); - assert.deepEqual(db.addresses, data.addresses); - }); - - test("it clones all data so nothing is passed by reference", function(assert) { - let data = { - contacts: [{ id: '1', someArray: ['foo', 'bar'] }] - }; - db.loadData(data); - - let contactRecord = db.contacts.find(1); - contactRecord.someArray.push('baz'); - - assert.equal(contactRecord.someArray.length, 3); - assert.equal(data.contacts[0].someArray.length, 2); - }); -}); - -module('Unit | Db #all', function(hooks) { - hooks.beforeEach(function() { - this.data = { - contacts: [{ id: '1', name: 'Link' }], - addresses: [{ id: '1', name: '123 Hyrule Way' }] - }; - - db = new Db(this.data); - }); - - hooks.afterEach(function() { - db.emptyData(); - }); - - test('it can return a collection', function(assert) { - assert.deepEqual(db.contacts, this.data.contacts); - assert.deepEqual(db.addresses, this.data.addresses); - }); - - test('the collection is a copy', function(assert) { - let { contacts } = db; - - assert.deepEqual(contacts, this.data.contacts); - contacts[0].name = 'Zelda'; - - assert.deepEqual(db.contacts, this.data.contacts); - }); -}); - -module('Unit | Db #insert', function(hooks) { - hooks.beforeEach(function() { - db = new Db(); - db.createCollection('contacts'); - }); - - hooks.afterEach(function() { - db.emptyData(); - }); - - test('it inserts an object and returns it', function(assert) { - let link = db.contacts.insert({ name: 'Link' }); - let expectedRecord = { - id: '1', - name: 'Link' - }; - - assert.deepEqual(db.contacts, [expectedRecord]); - assert.deepEqual(link, expectedRecord); - }); - - test('it returns a copy', function(assert) { - let link = db.contacts.insert({ name: 'Link' }); - let expectedRecord = { - id: '1', - name: 'Link' - }; - - assert.deepEqual(link, expectedRecord); - - link.name = 'Young link'; - - assert.deepEqual(db.contacts.find(1), expectedRecord); - }); - - test('it can insert objects sequentially', function(assert) { - db.contacts.insert({ name: 'Link' }); - db.contacts.insert({ name: 'Ganon' }); - - let records = [ - { id: '1', name: 'Link' }, - { id: '2', name: 'Ganon' } - ]; - - assert.deepEqual(db.contacts, records); - }); - - test('it does not add an id if present', function(assert) { - let attrs = { id: '5', name: 'Link' }; - - db.contacts.insert(attrs); - - assert.deepEqual(db.contacts, [attrs]); - }); - - test('it can insert an array and return it', function(assert) { - db.contacts.insert({ name: 'Link' }); - - let contacts = db.contacts.insert([{ name: 'Zelda' }, { name: 'Ganon' }]); - - assert.deepEqual(db.contacts, [{ id: '1', name: 'Link' }, { id: '2', name: 'Zelda' }, { id: '3', name: 'Ganon' }]); - assert.deepEqual(contacts, [{ id: '2', name: 'Zelda' }, { id: '3', name: 'Ganon' }]); - }); - - test('it does not add ids to array data if present', function(assert) { - db.contacts.insert([{ id: 2, name: 'Link' }, { id: 1, name: 'Ganon' }]); - - assert.deepEqual(db.contacts, [{ id: '2', name: 'Link' }, { id: '1', name: 'Ganon' }]); - }); - - test('it can insert a record with an id of 0', function(assert) { - db.contacts.insert({ id: 0, name: 'Link' }); - - assert.deepEqual(db.contacts, [{ id: '0', name: 'Link' }]); - }); - - test('IDs increment correctly, even after a record is removed', function(assert) { - let records = db.contacts.insert([{ name: 'Link' }, { name: 'Ganon' }]); - - db.contacts.remove(records[0]); - - let record = db.contacts.insert({ name: 'Zelda' }); - - assert.equal(record.id, 3); - }); - - test('inserting a record with an already used ID throws an error', function(assert) { - assert.expect(2); - - db.contacts.insert({ id: 1, name: 'Duncan McCleod' }); - - assert.throws(function() { - db.contacts.insert({ id: 1, name: 'Duncan McCleod' }); - }); - - db.contacts.insert({ id: 'atp', name: 'Adenosine Triphosphate' }); - - assert.throws(function() { - db.contacts.insert({ id: 'atp', name: 'Adenosine Triphosphate' }); - }); - }); - - test('tracks the correct IDs being used', function(assert) { - db.contacts.insert({ name: 'Vegeta' }); - db.contacts.insert({ id: 2, name: 'Krilli' }); - - assert.equal(db.contacts.length, 2); - }); -}); - -module('Unit | Db #findBy', function(hooks) { - hooks.beforeEach(function() { - db = new Db(); - db.createCollection('contacts'); - db.contacts.insert([ - { name: 'Zelda' }, - { name: 'Link' }, - { name: 'Epona', race: 'Horse' }, - { name: 'Epona', race: 'Centaur' }, - { id: 'abc', name: 'Ganon' } - ]); - }); - - hooks.afterEach(function() { - db.emptyData(); - }); - - test('returns a record that matches the given name', function(assert) { - let contact = db.contacts.findBy({ 'name': 'Link' }); - - assert.deepEqual(contact, { id: '2', name: 'Link' }); - }); - - test('returns a copy not a reference', function(assert) { - let contact = db.contacts.findBy({ 'name': 'Link' }); - - contact.name = 'blah'; - - assert.deepEqual(db.contacts.find(2), { id: '2', name: 'Link' }); - }); - - test('returns the first record matching the criteria', function(assert) { - let contact = db.contacts.findBy({ 'name': 'Epona' }); - - assert.deepEqual(contact, { id: '3', name: 'Epona', race: 'Horse' }); - }); - - test('returns a record only matching multiple criteria', function(assert) { - let contact = db.contacts.findBy({ 'name': 'Epona', 'race': 'Centaur' }); - - assert.deepEqual(contact, { id: '4', name: 'Epona', race: 'Centaur' }); - }); - - test('returns null when no record is found', function(assert) { - let contact = db.contacts.findBy({ 'name': 'Fi' }); - - assert.equal(contact, null); - }); -}); - -module('Unit | Db #find', function(hooks) { - hooks.beforeEach(function() { - db = new Db(); - db.createCollection('contacts'); - db.contacts.insert([ - { name: 'Zelda' }, - { name: 'Link' }, - { id: 'abc', name: 'Ganon' } - ]); - }); - - hooks.afterEach(function() { - db.emptyData(); - }); - - test('returns a record that matches a numerical id', function(assert) { - let contact = db.contacts.find(2); - - assert.deepEqual(contact, { id: '2', name: 'Link' }); - }); - - test('returns a copy not a reference', function(assert) { - let contact = db.contacts.find(2); - - assert.deepEqual(contact, { id: '2', name: 'Link' }); - - contact.name = 'blah'; - - assert.deepEqual(db.contacts.find(2), { id: '2', name: 'Link' }); - }); - - test('returns a record that matches a string id', function(assert) { - let contact = db.contacts.find('abc'); - - assert.deepEqual(contact, { id: 'abc', name: 'Ganon' }); - }); - - test('returns multiple record that matches an array of ids', function(assert) { - let contacts = db.contacts.find([1, 2]); - - assert.deepEqual(contacts, [{ id: '1', name: 'Zelda' }, { id: '2', name: 'Link' }]); - }); - - test('returns a record whose id is a string that start with numbers', function(assert) { - db.contacts.insert({ - id: '123-456', - name: 'Epona' - }); - - let contact = db.contacts.find('123-456'); - assert.deepEqual(contact, { id: '123-456', name: 'Epona' }); - }); - - test('returns multiple record that match an array of ids', function(assert) { - let contacts = db.contacts.find([1, 2]); - - assert.deepEqual(contacts, [{ id: '1', name: 'Zelda' }, { id: '2', name: 'Link' }]); - }); - - test('returns an empty array when it doesnt find multiple ids', function(assert) { - let contacts = db.contacts.find([99, 100]); - - assert.deepEqual(contacts, []); - }); -}); - -module('Unit | Db #where', function(hooks) { - hooks.beforeEach(function() { - db = new Db(); - db.createCollection('contacts'); - db.contacts.insert([ - { name: 'Link', evil: false, age: 17 }, - { name: 'Zelda', evil: false, age: 17 }, - { name: 'Ganon', evil: true, age: 45 } - ]); - }); - - hooks.afterEach(function() { - db.emptyData(); - }); - - test('returns an array of records that match the query', function(assert) { - let result = db.contacts.where({ evil: true }); - - assert.deepEqual(result, [ - { id: '3', name: 'Ganon', evil: true, age: 45 } - ]); - }); - - test('it coerces query params to strings', function(assert) { - let result = db.contacts.where({ age: '45' }); - - assert.deepEqual(result, [ - { id: '3', name: 'Ganon', evil: true, age: 45 } - ]); - }); - - test('returns a copy, not a referecne', function(assert) { - let result = db.contacts.where({ evil: true }); - - assert.deepEqual(result, [ - { id: '3', name: 'Ganon', evil: true, age: 45 } - ]); - - result[0].evil = false; - - assert.deepEqual(db.contacts.where({ evil: true }), [ - { id: '3', name: 'Ganon', evil: true, age: 45 } - ]); - }); - - test('returns an empty array if no records match the query', function(assert) { - let result = db.contacts.where({ name: 'Link', evil: true }); - - assert.deepEqual(result, []); - }); - - test('accepts a filter function', function(assert) { - let result = db.contacts.where(function(record) { - return record.age === 45; - }); - - assert.deepEqual(result, [ - { id: '3', name: 'Ganon', evil: true, age: 45 } - ]); - }); -}); - -module('Unit | Db #update', function(hooks) { - hooks.beforeEach(function() { - db = new Db(); - db.createCollection('contacts'); - db.contacts.insert([ - { name: 'Link', evil: false }, - { name: 'Zelda', evil: false }, - { name: 'Ganon', evil: true }, - { id: '123-abc', name: 'Epona', evil: false } - ]); - }); - - hooks.afterEach(function() { - db.emptyData(); - }); - - test('it can update the whole collection', function(assert) { - db.contacts.update({ name: 'Sam', evil: false }); - - let actualContacts = db.contacts; - - let expectedContacts = [ - { id: '1', name: 'Sam', evil: false }, - { id: '2', name: 'Sam', evil: false }, - { id: '3', name: 'Sam', evil: false }, - { id: '123-abc', name: 'Sam', evil: false } - ]; - - assert.deepEqual( - actualContacts, expectedContacts, [actualContacts.map(function(r) { - return r.id; - }).join(','), expectedContacts.map(function(r) { - return r.id; - }).join(',')].join(';') - ); - }); - - test('it can update a record by id', function(assert) { - db.contacts.update(3, { name: 'Ganondorf', evil: false }); - let ganon = db.contacts.find(3); - - assert.deepEqual(ganon, { id: '3', name: 'Ganondorf', evil: false }); - }); - - test('it can update a record by id when the id is a string', function(assert) { - db.contacts.update('123-abc', { evil: true }); - let epona = db.contacts.find('123-abc'); - - assert.deepEqual(epona, { id: '123-abc', name: 'Epona', evil: true }); - }); - - test('it can update multiple records by ids', function(assert) { - db.contacts.update([1, 2], { evil: true }); - let link = db.contacts.find(1); - let zelda = db.contacts.find(2); - - assert.equal(link.evil, true); - assert.equal(zelda.evil, true); - }); - - test('it can update records by query', function(assert) { - db.contacts.update({ evil: false }, { name: 'Sam' }); - - assert.deepEqual(db.contacts, [ - { id: '1', name: 'Sam', evil: false }, - { id: '2', name: 'Sam', evil: false }, - { id: '3', name: 'Ganon', evil: true }, - { id: '123-abc', name: 'Sam', evil: false } - ]); - }); - - test('updating a single record returns that record', function(assert) { - let ganon = db.contacts.update(3, { name: 'Ganondorf' }); - assert.deepEqual(ganon, { id: '3', name: 'Ganondorf', evil: true }); - }); - - test('updating a collection returns the updated records', function(assert) { - let characters = db.contacts.update({ evil: true }); - assert.deepEqual(characters, [ - { id: '1', name: 'Link', evil: true }, - { id: '2', name: 'Zelda', evil: true }, - { id: '123-abc', name: 'Epona', evil: true } - ]); - }); - - test('updating multiple records returns the updated records', function(assert) { - let characters = db.contacts.update({ evil: false }, { evil: true }); - assert.deepEqual(characters, [ - { id: '1', name: 'Link', evil: true }, - { id: '2', name: 'Zelda', evil: true }, - { id: '123-abc', name: 'Epona', evil: true } - ]); - }); - - test('throws when updating an ID is attempted', function(assert) { - assert.expect(1); - - assert.throws(function() { - db.contacts.update(1, { id: 3 }); - }); - }); -}); - -module('Unit | Db #remove', function(hooks) { - hooks.beforeEach(function() { - db = new Db(); - db.createCollection('contacts'); - db.contacts.insert([ - { name: 'Link', evil: false }, - { name: 'Zelda', evil: false }, - { name: 'Ganon', evil: true }, - { id: '123-abc', name: 'Epona', evil: false } - ]); - }); - - hooks.afterEach(function() { - db.emptyData(); - }); - - test('it can remove an entire collection', function(assert) { - db.contacts.remove(); - - assert.deepEqual(db.contacts, []); - }); - - test('it can remove a single record by id', function(assert) { - db.contacts.remove(1); - - assert.deepEqual(db.contacts, [ - { id: '2', name: 'Zelda', evil: false }, - { id: '3', name: 'Ganon', evil: true }, - { id: '123-abc', name: 'Epona', evil: false } - ]); - }); - - test('it can remove a single record when the id is a string', function(assert) { - db.contacts.remove('123-abc'); - - assert.deepEqual(db.contacts, [ - { id: '1', name: 'Link', evil: false }, - { id: '2', name: 'Zelda', evil: false }, - { id: '3', name: 'Ganon', evil: true } - ]); - }); - - test('it can remove multiple records by ids', function(assert) { - db.contacts.remove([1, 2]); - - assert.deepEqual(db.contacts, [ - { id: '3', name: 'Ganon', evil: true }, - { id: '123-abc', name: 'Epona', evil: false } - ]); - }); - - test('it can remove multiple records by query', function(assert) { - db.contacts.remove({ evil: false }); - - assert.deepEqual(db.contacts, [ - { id: '3', name: 'Ganon', evil: true } - ]); - }); - - test('it can add a record after removing all records', function(assert) { - db.contacts.remove(); - db.contacts.insert({ name: 'Foo' }); - - assert.equal(db.contacts.length, 1); - assert.deepEqual(db.contacts, [ - { id: '1', name: 'Foo' } - ]); - }); -}); - -module('Unit | Db #firstOrCreate', function(hooks) { - hooks.beforeEach(function() { - db = new Db(); - db.createCollection('contacts'); - db.contacts.insert([ - { id: 1, name: 'Link', evil: false }, - { id: 2, name: 'Zelda', evil: false }, - { id: 3, name: 'Ganon', evil: true } - ]); - }); - - hooks.afterEach(function() { - db.emptyData(); - }); - - test('it can find the first record available from the query', function(assert) { - let record = db.contacts.firstOrCreate({ name: 'Link' }); - - assert.deepEqual(record, { id: '1', name: 'Link', evil: false }); - }); - - test('it creates a new record from query + attrs if none found', function(assert) { - let record = db.contacts.firstOrCreate({ name: 'Mario' }, { evil: false }); - - assert.equal(record.name, 'Mario'); - assert.equal(record.evil, false); - assert.ok(record.id); - }); - - test('does not require attrs', function(assert) { - let record = db.contacts.firstOrCreate({ name: 'Luigi' }); - - assert.equal(record.name, 'Luigi'); - assert.ok(record.id); - }); -}); - -module('Unit | Db #registerIdentityManagers and #identityManagerFor', function() { - test('identityManagerFor returns ember-cli-mirage default IdentityManager if there aren\'t any custom ones', function(assert) { - let db = new Db(); - assert.equal(db.identityManagerFor('foo'), DefaultIdentityManager); - }); - - test('it can register identity managers per db collection and for application', function(assert) { - let FooIdentityManager = class {}; - let ApplicationIdentityManager = class {}; - - let db = new Db(); - db.registerIdentityManagers({ - foo: FooIdentityManager, - application: ApplicationIdentityManager - }); - - assert.equal( - db.identityManagerFor('foo'), - FooIdentityManager, - 'it allows to declare an identity manager per db collection' - ); - assert.equal( - db.identityManagerFor('bar'), - ApplicationIdentityManager, - 'it falls back to application idenitity manager if there isn\'t one for a specific db collection' - ); - }); - - test('it can register idenitity managers on instantiation', function(assert) { - let CustomIdentityManager = class {}; - let db = new Db(undefined, { - foo: CustomIdentityManager - }); - assert.equal(db.identityManagerFor('foo'), CustomIdentityManager); - assert.equal(db.identityManagerFor('bar'), DefaultIdentityManager); - }); -}); diff --git a/tests/unit/db/identity-manager-test.js b/tests/unit/db/identity-manager-test.js deleted file mode 100644 index 2e59a580d..000000000 --- a/tests/unit/db/identity-manager-test.js +++ /dev/null @@ -1,86 +0,0 @@ -import IdentityManager from 'ember-cli-mirage/identity-manager'; - -import {module, test} from 'qunit'; - -module('Unit | Db | IdentityManager', function() { - test('it can be instantiated', function(assert) { - let manager = new IdentityManager(); - assert.ok(manager); - }); - - test(`fetch returns the latest number`, function(assert) { - let manager = new IdentityManager(); - - assert.equal(manager.fetch(), 1); - assert.equal(manager.fetch(), 2); - assert.equal(manager.fetch(), 3); - }); - - test(`get returns the upcoming id used for fetch`, function(assert) { - let manager = new IdentityManager(); - - assert.equal(manager.fetch(), 1); - assert.equal(manager.get(), 2); - assert.equal(manager.fetch(), 2); - }); - - test(`set indicates an id is being used`, function(assert) { - let manager = new IdentityManager(); - manager.set('abc'); - - assert.throws(function() { - manager.set('abc'); - }, /already been used/); - }); - - test(`a numerical value passed into set affects future ids used by fetch`, function(assert) { - let manager = new IdentityManager(); - manager.set(5); - - assert.equal(manager.fetch(), 6); - assert.equal(manager.fetch(), 7); - }); - - test(`multiple numerical values passed into set affects future ids used by fetch`, function(assert) { - let manager = new IdentityManager(); - manager.set(5); - manager.set(6); - - assert.equal(manager.fetch(), 7); - assert.equal(manager.fetch(), 8); - }); - - test(`an int as a string passed into set affects future ids used by fetch`, function(assert) { - let manager = new IdentityManager(); - manager.set('5'); - - assert.equal(manager.fetch(), 6); - assert.equal(manager.fetch(), 7); - }); - - test(`multiple ints as a string passed into set affects future ids used by fetch`, function(assert) { - let manager = new IdentityManager(); - manager.set('5'); - manager.set('6'); - - assert.equal(manager.fetch(), 7); - assert.equal(manager.fetch(), 8); - }); - - test(`a string value that doesn't parse as an int passed into set doesn't affect future ids used by fetch`, function(assert) { - let manager = new IdentityManager(); - manager.set('123-abc'); - - assert.equal(manager.fetch(), 1); - assert.equal(manager.fetch(), 2); - }); - - test(`reset clears the managers memory`, function(assert) { - let manager = new IdentityManager(); - manager.set('abc'); - manager.reset(); - manager.set('abc'); - - assert.ok(true); - }); -}); diff --git a/tests/unit/factory-test.js b/tests/unit/factory-test.js deleted file mode 100644 index b53dad1d8..000000000 --- a/tests/unit/factory-test.js +++ /dev/null @@ -1,347 +0,0 @@ -import Mirage from 'ember-cli-mirage'; -import { trait } from 'ember-cli-mirage'; - -import {module, test} from 'qunit'; - -module('Unit | Factory', function() { - test('it exists', function(assert) { - assert.ok(Mirage.Factory); - }); - - test('the base class builds empty objects', function(assert) { - let f = new Mirage.Factory(); - let data = f.build(); - - assert.deepEqual(data, {}); - }); - - test('a noop extension builds empty objects', function(assert) { - let EmptyFactory = Mirage.Factory.extend(); - let f = new EmptyFactory(); - let data = f.build(); - - assert.deepEqual(data, {}); - }); - - test('it works with strings, numbers and booleans', function(assert) { - let AFactory = Mirage.Factory.extend({ - name: 'Sam', - age: 28, - alive: true - }); - - let f = new AFactory(); - let data = f.build(); - - assert.deepEqual(data, { name: 'Sam', age: 28, alive: true }); - }); - - test('it supports inheritance', function(assert) { - let PersonFactory = Mirage.Factory.extend({ - species: 'human' - }); - let ManFactory = PersonFactory.extend({ - gender: 'male' - }); - let SamFactory = ManFactory.extend({ - name: 'Sam' - }); - - let p = new PersonFactory(); - let m = new ManFactory(); - let s = new SamFactory(); - - assert.deepEqual(p.build(), { species: 'human' }); - assert.deepEqual(m.build(), { species: 'human', gender: 'male' }); - assert.deepEqual(s.build(), { species: 'human', gender: 'male', name: 'Sam' }); - }); - - test('it can use sequences', function(assert) { - let PostFactory = Mirage.Factory.extend({ - likes(i) { - return 5 * i; - } - }); - - let p = new PostFactory(); - let post1 = p.build(1); - let post2 = p.build(2); - - assert.deepEqual(post1, { likes: 5 }); - assert.deepEqual(post2, { likes: 10 }); - }); - - test('it can reuse static properties', function(assert) { - let BazFactory = Mirage.Factory.extend({ - foo: 5, - bar(i) { - return this.foo * i; - } - }); - - let b = new BazFactory(); - let baz1 = b.build(1); - let baz2 = b.build(2); - - assert.deepEqual(baz1, { foo: 5, bar: 5 }); - assert.deepEqual(baz2, { foo: 5, bar: 10 }); - }); - - test('it can reuse dynamic properties', function(assert) { - let BazFactory = Mirage.Factory.extend({ - foo(i) { - return 5 * i; - }, - bar() { - return this.foo * 2; - } - }); - - let b = new BazFactory(); - let baz1 = b.build(1); - let baz2 = b.build(2); - - assert.deepEqual(baz1, { foo: 5, bar: 10 }); - assert.deepEqual(baz2, { foo: 10, bar: 20 }); - }); - - test('it can have dynamic properties that depend on another', function(assert) { - let BazFactory = Mirage.Factory.extend({ - name() { - return 'foo'; - }, - bar() { - return this.name.substr(1); - } - }); - - let b = new BazFactory(); - let baz1 = b.build(1); - - assert.deepEqual(baz1, { name: 'foo', bar: 'oo' }); - }); - - test('it can reference properties out of order', function(assert) { - let BazFactory = Mirage.Factory.extend({ - bar() { - return this.foo + 2; - }, - - baz: 6, - - foo(i) { - return this.baz * i; - } - }); - - let b = new BazFactory(); - let baz1 = b.build(1); - let baz2 = b.build(2); - - assert.deepEqual(baz1, { baz: 6, foo: 6, bar: 8 }); - assert.deepEqual(baz2, { baz: 6, foo: 12, bar: 14 }); - }); - - test('it can reference multiple properties in any order', function(assert) { - let FooFactory = Mirage.Factory.extend({ - foo() { - return this.bar + this.baz; - }, - - bar: 6, - - baz: 10 - }); - - let BarFactory = Mirage.Factory.extend({ - bar: 6, - - foo() { - return this.bar + this.baz; - }, - - baz: 10 - }); - - let BazFactory = Mirage.Factory.extend({ - bar: 6, - - baz: 10, - - foo() { - return this.bar + this.baz; - } - }); - - let Foo = new FooFactory(); - let Bar = new BarFactory(); - let Baz = new BazFactory(); - - let foo = Foo.build(1); - let bar = Bar.build(1); - let baz = Baz.build(1); - - assert.deepEqual(foo, { foo: 16, bar: 6, baz: 10 }); - assert.deepEqual(bar, { foo: 16, bar: 6, baz: 10 }); - assert.deepEqual(baz, { foo: 16, bar: 6, baz: 10 }); - }); - - test('it can reference properties on complex object', function(assert) { - let AbcFactory = Mirage.Factory.extend({ - a(i) { - return this.b + i; - }, - b() { - return this.c + 1; - }, - c() { - return this.f + 1; - }, - d(i) { - return this.e + i; - }, - e() { - return this.c + 1; - }, - f: 1, - g: 2, - h: 3 - }); - - let b = new AbcFactory(); - let abc1 = b.build(1); - let abc2 = b.build(2); - - assert.deepEqual(abc1, { a: 4, b: 3, c: 2, d: 4, e: 3, f: 1, g: 2, h: 3 }); - assert.deepEqual(abc2, { a: 5, b: 3, c: 2, d: 5, e: 3, f: 1, g: 2, h: 3 }); - }); - - test('throws meaningfull exception on circular reference', function(assert) { - let BazFactory = Mirage.Factory.extend({ - bar() { - return this.foo; - }, - - foo() { - return this.bar; - } - }); - - let b = new BazFactory(); - assert.throws(function() { - b.build(1); - }, function(e) { - return e.toString() === 'Error: Cyclic dependency in properties ["foo","bar"]'; - }); - }); - - test('#build skips invoking `afterCreate`', function(assert) { - let skipped = true; - let PostFactory = Mirage.Factory.extend({ - afterCreate() { - skipped = false; - } - }); - - let factory = new PostFactory(); - let post = factory.build(0); - - assert.ok(skipped, 'skips invoking `afterCreate`'); - assert.equal( - typeof post.afterCreate, - 'undefined', - 'does not build `afterCreate` attribute' - ); - }); - - test('extractAfterCreateCallbacks returns all afterCreate callbacks from factory with the base one being first', function(assert) { - let PostFactory = Mirage.Factory.extend({ - published: trait({ - afterCreate() { - return 'from published'; - } - }), - - withComments: trait({ - afterCreate() { - return 'from withComments'; - } - }), - - otherTrait: trait({}), - - afterCreate() { - return 'from base'; - } - }); - - let callbacks = PostFactory.extractAfterCreateCallbacks(); - assert.equal(callbacks.length, 3); - assert.deepEqual(callbacks.map((cb) => cb()), ['from base', 'from published', 'from withComments']); - }); - - test('extractAfterCreateCallbacks filters traits from which the afterCreate callbacks will be extracted from', function(assert) { - let PostFactory = Mirage.Factory.extend({ - published: trait({ - afterCreate() { - return 'from published'; - } - }), - - withComments: trait({ - afterCreate() { - return 'from withComments'; - } - }), - - otherTrait: trait({}), - - afterCreate() { - return 'from base'; - } - }); - - assert.equal(PostFactory.extractAfterCreateCallbacks({ traits: [] }).length, 1); - assert.deepEqual( - PostFactory.extractAfterCreateCallbacks({ traits: [] }).map((cb) => cb()), - ['from base'] - ); - - assert.equal(PostFactory.extractAfterCreateCallbacks({ traits: ['withComments'] }).length, 2); - assert.deepEqual( - PostFactory.extractAfterCreateCallbacks({ traits: ['withComments'] }).map((cb) => cb()), - ['from base', 'from withComments'] - ); - - assert.equal(PostFactory.extractAfterCreateCallbacks({ traits: ['withComments', 'published'] }).length, 3); - assert.deepEqual( - PostFactory.extractAfterCreateCallbacks({ traits: ['withComments', 'published'] }).map((cb) => cb()), - ['from base', 'from withComments', 'from published'] - ); - - assert.equal(PostFactory.extractAfterCreateCallbacks({ traits: ['withComments', 'otherTrait'] }).length, 2); - assert.deepEqual( - PostFactory.extractAfterCreateCallbacks({ traits: ['withComments', 'otherTrait'] }).map((cb) => cb()), - ['from base', 'from withComments'] - ); - }); - - test('isTrait returns true if there is a trait with given name', function(assert) { - let PostFactory = Mirage.Factory.extend({ - title: 'Lorem ipsum', - - published: trait({ - isPublished: true - }), - - someNestedObject: { - value: 'nested' - } - }); - - assert.ok(!PostFactory.isTrait('title')); - assert.ok(PostFactory.isTrait('published')); - assert.ok(!PostFactory.isTrait('someNestedObject')); - assert.ok(!PostFactory.isTrait('notdefined')); - }); -}); diff --git a/tests/unit/model-test.js b/tests/unit/model-test.js deleted file mode 100644 index 4bfeb876e..000000000 --- a/tests/unit/model-test.js +++ /dev/null @@ -1,32 +0,0 @@ -import Model from 'ember-cli-mirage/orm/model'; -import {module, test} from 'qunit'; - -module('Unit | Model', function() { - test('it can be instantiated', function(assert) { - let model = new Model({}, 'user'); - assert.ok(model); - }); - - test('it cannot be instantiated without a schema', function(assert) { - assert.throws(function() { - new Model(); - }, /requires a schema/); - }); - - test('it cannot be instantiated without a modelName', function(assert) { - assert.throws(function() { - new Model({}); - }, /requires a modelName/); - }); - - test('findBelongsToAssociation returns association for given type if defined', function(assert) { - let ModelClass = Model.extend(); - let authorAssociationMock = {}; - ModelClass.prototype.belongsToAssociations = { - author: authorAssociationMock - }; - - assert.equal(ModelClass.findBelongsToAssociation('article'), null); - assert.deepEqual(ModelClass.findBelongsToAssociation('author'), authorAssociationMock); - }); -}); diff --git a/tests/unit/reference-sort-test.js b/tests/unit/reference-sort-test.js deleted file mode 100644 index 520225543..000000000 --- a/tests/unit/reference-sort-test.js +++ /dev/null @@ -1,38 +0,0 @@ -import referenceSort from 'ember-cli-mirage/utils/reference-sort'; -import {module, test} from 'qunit'; - -module('mirage:reference-sort', function() { - test('it sorts property references', function(assert) { - let sorted = referenceSort([ - ['propA'], - ['propB', 'propC'], - ['propC', 'propA'], - ['propD'] - ]); - - assert.deepEqual(sorted, ['propD', 'propA', 'propC', 'propB']); - }); - - test('it throws on circular dependency', function(assert) { - assert.throws(function() { - referenceSort([ - ['propA', 'propB'], - ['propB', 'propA'] - ]); - }, function(e) { - return e.toString() === 'Error: Cyclic dependency in properties ["propB","propA"]'; - }); - - }); - - test('it works with no references', function(assert) { - let sorted = referenceSort([ - ['propA'], - ['propB'], - ['propC'], - ['propD'] - ]); - - assert.deepEqual(sorted, ['propD', 'propC', 'propB', 'propA']); - }); -}); diff --git a/tests/unit/response-test.js b/tests/unit/response-test.js deleted file mode 100644 index 63fd4e277..000000000 --- a/tests/unit/response-test.js +++ /dev/null @@ -1,33 +0,0 @@ -import Response from 'ember-cli-mirage/response'; - -import { module, test } from 'qunit'; - -module('Unit | Response', function() { - test('it can be instantiated and return a rack response', function(assert) { - let response = new Response(404, {}, {}); - - assert.ok(response); - assert.ok(response.toRackResponse()); - }); - - test('it can be instantiated with just a response code', function(assert) { - let response = new Response(404); - - assert.ok(response); - assert.ok(response.toRackResponse()); - }); - - test('it adds Content-Type by default', function(assert) { - let response = new Response(200, {}, {}); - - assert.ok(response); - assert.equal(response.headers['Content-Type'], 'application/json'); - }); - - test('it does not add Content-Type for a 204 response', function(assert) { - let response = new Response(204); - - assert.ok(response); - assert.notOk(response.headers['Content-Type']); - }); -}); diff --git a/tests/unit/route-handlers/shorthands/base-test.js b/tests/unit/route-handlers/shorthands/base-test.js deleted file mode 100644 index ad5419267..000000000 --- a/tests/unit/route-handlers/shorthands/base-test.js +++ /dev/null @@ -1,62 +0,0 @@ -import BaseShorthandRouteHandler from 'ember-cli-mirage/route-handlers/shorthands/base'; - -import {module, test} from 'qunit'; - -module('Unit | Route handlers | Shorthands | BaseShorthandRouteHandler', function(hooks) { - hooks.beforeEach(function() { - this.handler = new BaseShorthandRouteHandler(); - this.request = { params: { id: '' } }; - }); - - test('it returns a number if it\'s a number', function(assert) { - this.request.params.id = 2; - assert.equal(this.handler._getIdForRequest(this.request), 2, 'it returns a number'); - }); - - test('it returns a number if it\'s a string represented number', function(assert) { - this.request.params.id = '2'; - assert.equal(this.handler._getIdForRequest(this.request), 2, 'it returns a number'); - }); - - test('it returns a string it\'s a dasherized number', function(assert) { - this.request.params.id = '2-1'; - assert.equal(this.handler._getIdForRequest(this.request), '2-1', 'it returns a number'); - }); - - test('it returns a string if it\'s a string', function(assert) { - this.request.params.id = 'someID'; - assert.equal(this.handler._getIdForRequest(this.request), 'someID', 'it returns a number'); - }); - - test('getModelClassFromPath works with various named route path variable', function(assert) { - let urlWithSlash = '/api/fancy-users'; - let urlWithIdAndSlash = '/api/fancy-users/:id'; - - assert.equal(this.handler.getModelClassFromPath(urlWithSlash), 'fancy-user', 'it returns a singular model name'); - assert.equal(this.handler.getModelClassFromPath(urlWithIdAndSlash, true), 'fancy-user', 'it returns a singular model name'); - - urlWithSlash = '/api/exquisite-users'; - urlWithIdAndSlash = '/api/exquisite-users/:objectId'; - - assert.equal(this.handler.getModelClassFromPath(urlWithSlash), 'exquisite-user', 'it returns a singular model name'); - assert.equal(this.handler.getModelClassFromPath(urlWithIdAndSlash, true), 'exquisite-user', 'it returns a singular model name'); - - urlWithSlash = '/api/elegant-users'; - urlWithIdAndSlash = '/api/elegant-users/:firstName/:lastName'; - - assert.equal(this.handler.getModelClassFromPath(urlWithSlash), 'elegant-user', 'it returns a singular model name'); - assert.equal(this.handler.getModelClassFromPath(urlWithIdAndSlash, true), 'elegant-user', 'it returns a singular model name'); - }); - - test('it can read the id from the url', function(assert) { - let request = { params: { id: 'test-id' } }; - assert.equal(this.handler._getIdForRequest(request), 'test-id', 'it returns id from url parameters.'); - }); - - test('it can read the id from the request body', function(assert) { - let request = { params: {} }; - let jsonApiDoc = { data: { id: 'jsonapi-id' } }; - assert.equal(this.handler._getIdForRequest(request, jsonApiDoc), 'jsonapi-id', 'it returns id from json api data.'); - }); - -}); diff --git a/tests/unit/schema-test.js b/tests/unit/schema-test.js deleted file mode 100644 index dba92642d..000000000 --- a/tests/unit/schema-test.js +++ /dev/null @@ -1,69 +0,0 @@ -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import { Model, belongsTo } from 'ember-cli-mirage'; -import {module, test} from 'qunit'; - -module('Unit | Schema', function() { - test('it can be instantiated', function(assert) { - let dbMock = {}; - let schema = new Schema(dbMock); - assert.ok(schema); - }); - - test('it cannot be instantiated without a db', function(assert) { - assert.throws(function() { - new Schema(); - }, /requires a db/); - }); - - test('modelFor returns model for given type if registered', function(assert) { - let db = new Db(); - let schema = new Schema(db); - - assert.equal(schema.modelFor('article'), null); - - let authorModel = Model.extend({ - }); - let articleModel = Model.extend({ - author: belongsTo() - }); - schema.registerModel('article', articleModel); - schema.registerModel('author', authorModel); - - assert.deepEqual(schema.modelFor('article').foreignKeys, ['authorId']); - assert.deepEqual(schema.modelFor('author').foreignKeys, []); - }); - - test('`first()` returns null when nothing is found', function(assert) { - assert.expect(2); - - let db = new Db(); - let schema = new Schema(db); - - let authorModel = Model.extend({}); - schema.registerModel('author', authorModel); - - assert.equal(schema.first('author'), null); - - let record = schema.create('author', { id: 1, name: 'Mary Roach' }); - - assert.deepEqual(schema.first('author'), record); - }); - - test('`findBy()` returns null when nothing is found', function(assert) { - assert.expect(3); - - let db = new Db(); - let schema = new Schema(db); - - let authorModel = Model.extend({}); - schema.registerModel('author', authorModel); - - assert.deepEqual(schema.findBy('author', { name: 'Mary Roach' }), null); - - let record = schema.create('author', { id: 1, name: 'Mary Roach' }); - - assert.deepEqual(schema.findBy('author', { name: 'Mary Roach' }), record); - assert.equal(schema.findBy('author', { name: 'Charles Dickens' }), null); - }); -}); diff --git a/tests/unit/serializers/active-model-serializer-test.js b/tests/unit/serializers/active-model-serializer-test.js deleted file mode 100644 index a0ff00a37..000000000 --- a/tests/unit/serializers/active-model-serializer-test.js +++ /dev/null @@ -1,133 +0,0 @@ -import { Model, belongsTo } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import ActiveModelSerializer from 'ember-cli-mirage/serializers/active-model-serializer'; - -import {module, test} from 'qunit'; - -module('Unit | Serializers | ActiveModelSerializer', function(hooks) { - hooks.beforeEach(function() { - let schema = new Schema(new Db(), { - contact: Model.extend({ - address: belongsTo() - }), - address: Model.extend({ - contact: belongsTo() - }) - }); - this.serializer = new ActiveModelSerializer({ - schema - }); - }); - - test('normalize works', function(assert) { - let payload = { - contact: { - id: 1, - name: 'Link' - } - }; - let jsonApiDoc = this.serializer.normalize(payload); - - assert.deepEqual(jsonApiDoc, { - data: { - type: 'contacts', - id: 1, - attributes: { - name: 'Link' - } - } - }); - }); - - test('it hyphenates snake_cased words', function(assert) { - let payload = { - contact: { - id: 1, - first_name: 'Link' - } - }; - let jsonApiDoc = this.serializer.normalize(payload); - - assert.deepEqual(jsonApiDoc, { - data: { - type: 'contacts', - id: 1, - attributes: { - 'first-name': 'Link' - } - } - }); - }); - - test('it works without an id', function(assert) { - let payload = { - contact: { - first_name: 'Link', - last_name: 'zor' - } - }; - let jsonApiDoc = this.serializer.normalize(payload); - - assert.deepEqual(jsonApiDoc, { - data: { - type: 'contacts', - attributes: { - 'first-name': 'Link', - 'last-name': 'zor' - } - } - }); - }); - - test('it returns coalesce Ids if present', function(assert) { - let request = { url: '/authors', queryParams: { ids: ['1', '3'] } }; - assert.deepEqual(this.serializer.getCoalescedIds(request), ['1', '3']); - }); - - test('it returns undefined coalesce Ids if not present', function(assert) { - let request = { url: '/authors', queryParams: {} }; - assert.strictEqual(this.serializer.getCoalescedIds(request), undefined); - }); - - test('normalizeIds defaults to true', function(assert) { - let serializer = new ActiveModelSerializer(); - - assert.equal(serializer.normalizeIds, true); - }); - - test('normalize works with normalizeIds set to true', function(assert) { - this.serializer.normalizeIds = true; - let payload = { - contact: { - id: 1, - name: 'Link', - address: 1 - } - }; - let jsonApiDoc = this.serializer.normalize(payload); - - assert.deepEqual(jsonApiDoc, { - data: { - type: 'contacts', - id: 1, - attributes: { - name: 'Link' - }, - relationships: { - address: { - data: { - type: 'address', - id: 1 - } - } - } - } - }); - }); - - test('serializeIds defaults to "always"', function(assert) { - let defaultState = new ActiveModelSerializer; - assert.equal(defaultState.serializeIds, 'always'); - }); -}); diff --git a/tests/unit/serializers/json-api-serializer-test.js b/tests/unit/serializers/json-api-serializer-test.js deleted file mode 100644 index e92b1365f..000000000 --- a/tests/unit/serializers/json-api-serializer-test.js +++ /dev/null @@ -1,18 +0,0 @@ -import JSONAPISerializer from 'ember-cli-mirage/serializers/json-api-serializer'; -import { module, test } from 'qunit'; - -module('Unit | Serializers | JSON API Serializer', function(hooks) { - hooks.beforeEach(function() { - this.serializer = new JSONAPISerializer(); - }); - - test('it returns coalesce Ids if present', function(assert) { - let request = { url: '/authors', queryParams: { 'filter[id]': '1,3' } }; - assert.deepEqual(this.serializer.getCoalescedIds(request), ['1', '3']); - }); - - test('it returns undefined coalesce Ids if not present', function(assert) { - let request = { url: '/authors', queryParams: {} }; - assert.strictEqual(this.serializer.getCoalescedIds(request), undefined); - }); -}); diff --git a/tests/unit/serializers/json-api-serializer/create-includes-graph-snapshot-collections-test.js b/tests/unit/serializers/json-api-serializer/create-includes-graph-snapshot-collections-test.js deleted file mode 100644 index 75d81341d..000000000 --- a/tests/unit/serializers/json-api-serializer/create-includes-graph-snapshot-collections-test.js +++ /dev/null @@ -1,127 +0,0 @@ -import JSONAPISerializer from 'ember-cli-mirage/serializers/json-api-serializer'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import { module, test } from 'qunit'; -import { Model, hasMany } from 'ember-cli-mirage'; - -/* - This test is heavily coupled to the implementation and can be deleted - during a future refactoring. -*/ -module('Unit | Serializers | JSON API Serializer | #_createIncludesGraphSnapshot collections', function(hooks) { - hooks.beforeEach(function() { - let serializer; - let registry = { - serializerFor() { - return serializer; - } - }; - let type = 'foo'; - let request = {}; - - serializer = new JSONAPISerializer(registry, type, request); - this.serializer = serializer; - }); - - test('it works on collections with no includes', function(assert) { - let schema = new Schema(new Db(), { - wordSmith: Model.extend({ - }) - }); - schema.wordSmiths.create(); - schema.wordSmiths.create(); - - this.serializer._createRequestedIncludesGraph(schema.wordSmiths.all()); - - assert.deepEqual(this.serializer.request._includesGraph, { - data: { - 'word-smith:1': {}, - 'word-smith:2': {} - } - }); - }); - - test('it works on collections with hasMany relationships and dot-path includes', function(assert) { - let schema = new Schema(new Db(), { - wordSmith: Model.extend({ - redTags: hasMany(), - bluePosts: hasMany() - }), - bluePost: Model.extend({ - redTags: hasMany() - }), - redTag: Model.extend({ - someColors: hasMany() - }), - someColor: Model.extend() - }); - let wordSmith1 = schema.wordSmiths.create(); - wordSmith1.createRedTag(); - wordSmith1.createRedTag(); - - let bluePost = wordSmith1.createBluePost(); - let redTag = bluePost.createRedTag(); - redTag.createSomeColor(); - - let wordSmith2 = schema.wordSmiths.create(); - wordSmith2.createRedTag(); - - let bluePost2 = wordSmith2.createBluePost(); - let redTag2 = bluePost2.createRedTag(); - redTag2.createSomeColor(); - - this.serializer.request = { queryParams: { include: 'red-tags,blue-posts.red-tags.some-colors' } }; - - this.serializer._createRequestedIncludesGraph(schema.wordSmiths.all()); - - assert.deepEqual(this.serializer.request._includesGraph, { - data: { - 'word-smith:1': { - relationships: { - 'red-tags': [ 'red-tag:1', 'red-tag:2' ], - 'blue-posts': [ 'blue-post:1' ] - } - }, - 'word-smith:2': { - relationships: { - 'red-tags': [ 'red-tag:4' ], - 'blue-posts': [ 'blue-post:2' ] - } - } - }, - included: { - 'red-tags': { - 'red-tag:1': {}, - 'red-tag:2': {}, - 'red-tag:3': { - relationships: { - 'some-colors': [ 'some-color:1' ] - } - }, - 'red-tag:4': {}, - 'red-tag:5': { - relationships: { - 'some-colors': [ 'some-color:2' ] - } - } - }, - 'blue-posts': { - 'blue-post:1': { - relationships: { - 'red-tags': [ 'red-tag:3' ] - } - }, - 'blue-post:2': { - relationships: { - 'red-tags': [ 'red-tag:5' ] - } - } - }, - 'some-colors': { - 'some-color:1': {}, - 'some-color:2': {} - } - } - }); - }); -}); diff --git a/tests/unit/serializers/json-api-serializer/create-includes-graph-snapshot-mixed-test.js b/tests/unit/serializers/json-api-serializer/create-includes-graph-snapshot-mixed-test.js deleted file mode 100644 index 0d17a74ae..000000000 --- a/tests/unit/serializers/json-api-serializer/create-includes-graph-snapshot-mixed-test.js +++ /dev/null @@ -1,92 +0,0 @@ -import JSONAPISerializer from 'ember-cli-mirage/serializers/json-api-serializer'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import { module, test } from 'qunit'; -import { Model, hasMany, belongsTo } from 'ember-cli-mirage'; - -/* - This test is heavily coupled to the implementation and can be deleted - during a future refactoring. -*/ -module('Unit | Serializers | JSON API Serializer | #_createIncludesGraphSnapshot mixed', function(hooks) { - hooks.beforeEach(function() { - let serializer; - let registry = { - serializerFor() { - return serializer; - } - }; - let type = 'foo'; - let request = {}; - - serializer = new JSONAPISerializer(registry, type, request); - this.serializer = serializer; - }); - - test('it works on models and collections with dot-path includes', function(assert) { - let schema = new Schema(new Db(), { - wordSmith: Model.extend({ - blogPosts: hasMany() - }), - blogPost: Model.extend({ - happyTag: belongsTo() - }), - happyTag: Model.extend({ - happyColor: belongsTo() - }), - happyColor: Model.extend() - }); - let wordSmith = schema.wordSmiths.create(); - let blogPost1 = wordSmith.createBlogPost(); - let happyTag = blogPost1.createHappyTag(); - happyTag.createHappyColor(); - - let blogPost2 = wordSmith.createBlogPost(); - let happyTag2 = blogPost2.createHappyTag(); - happyTag2.createHappyColor(); - - this.serializer.request = { queryParams: { include: 'blog-posts.happy-tag.happy-color' } }; - - this.serializer._createRequestedIncludesGraph(wordSmith); - - assert.deepEqual(this.serializer.request._includesGraph, { - data: { - 'word-smith:1': { - relationships: { - 'blog-posts': [ 'blog-post:1', 'blog-post:2' ] - } - } - }, - included: { - 'blog-posts': { - 'blog-post:1': { - relationships: { - 'happy-tag': 'happy-tag:1' - } - }, - 'blog-post:2': { - relationships: { - 'happy-tag': 'happy-tag:2' - } - } - }, - 'happy-tags': { - 'happy-tag:1': { - relationships: { - 'happy-color': 'happy-color:1' - } - }, - 'happy-tag:2': { - relationships: { - 'happy-color': 'happy-color:2' - } - } - }, - 'happy-colors': { - 'happy-color:1': {}, - 'happy-color:2': {} - } - } - }); - }); -}); diff --git a/tests/unit/serializers/json-api-serializer/create-includes-graph-snapshot-models-test.js b/tests/unit/serializers/json-api-serializer/create-includes-graph-snapshot-models-test.js deleted file mode 100644 index 6fb696a73..000000000 --- a/tests/unit/serializers/json-api-serializer/create-includes-graph-snapshot-models-test.js +++ /dev/null @@ -1,285 +0,0 @@ -import JSONAPISerializer from 'ember-cli-mirage/serializers/json-api-serializer'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; -import { Model, belongsTo, hasMany } from 'ember-cli-mirage'; -import { module, test } from 'qunit'; - -/* - This test is heavily coupled to the implementation and can be deleted - during a future refactoring. -*/ -module('Unit | Serializers | JSON API Serializer | #_createIncludesGraphSnapshot models', function(hooks) { - hooks.beforeEach(function() { - let serializer; - let registry = { - serializerFor() { - return serializer; - } - }; - let type = 'foo'; - let request = {}; - - serializer = new JSONAPISerializer(registry, type, request); - this.serializer = serializer; - }); - - test('it works on models with no includes', function(assert) { - let schema = new Schema(new Db(), { - wordSmith: Model.extend({ - }) - }); - let wordSmith = schema.wordSmiths.create(); - - this.serializer._createRequestedIncludesGraph(wordSmith); - - assert.deepEqual(this.serializer.request._includesGraph, { - data: { - 'word-smith:1': {} - } - }); - }); - - test("it doesn't choke on an empty belongsTo relationship", function(assert) { - let schema = new Schema(new Db(), { - wordSmith: Model.extend({ - blogPost: belongsTo() - }), - blogPost: Model.extend({ - happyCategory: belongsTo() - }), - happyCategory: Model.extend() - }); - let wordSmith = schema.wordSmiths.create(); - wordSmith.createBlogPost(); - - this.serializer.request = { queryParams: { include: 'blog-post.happy-category' } }; - - this.serializer._createRequestedIncludesGraph(wordSmith); - - assert.deepEqual(this.serializer.request._includesGraph, { - data: { - 'word-smith:1': { - relationships: { - 'blog-post': 'blog-post:1' - } - } - }, - included: { - 'blog-posts': { - 'blog-post:1': { - relationships: { - 'happy-category': undefined - } - } - } - } - }); - }); - - test('it works on models with belongsTo relationships', function(assert) { - let schema = new Schema(new Db(), { - wordSmith: Model.extend({ - redTag: belongsTo(), - bluePost: belongsTo() - }), - bluePost: Model.extend({ - redTag: belongsTo() - }), - redTag: Model.extend() - }); - let wordSmith = schema.wordSmiths.create(); - wordSmith.createRedTag(); - - let bluePost = wordSmith.createBluePost(); - bluePost.createRedTag(); - - this.serializer.request = { queryParams: { include: 'red-tag,blue-post' } }; - - this.serializer._createRequestedIncludesGraph(wordSmith); - - assert.deepEqual(this.serializer.request._includesGraph, { - data: { - 'word-smith:1': { - relationships: { - 'red-tag': 'red-tag:1', - 'blue-post': 'blue-post:1' - } - } - }, - included: { - 'red-tags': { - 'red-tag:1': { - } - }, - 'blue-posts': { - 'blue-post:1': { - } - } - } - }); - }); - - test('it works on models with belongsTo relationships and dot-path includes', function(assert) { - let schema = new Schema(new Db(), { - wordSmith: Model.extend({ - redTag: belongsTo(), - bluePost: belongsTo() - }), - bluePost: Model.extend({ - redTag: belongsTo() - }), - redTag: Model.extend({ - someColor: belongsTo() - }), - someColor: Model.extend({ - }) - }); - let wordSmith = schema.wordSmiths.create(); - wordSmith.createRedTag(); - - let bluePost = wordSmith.createBluePost(); - let redTag = bluePost.createRedTag(); - redTag.createSomeColor(); - - this.serializer.request = { queryParams: { include: 'red-tag,blue-post.red-tag.some-color' } }; - - this.serializer._createRequestedIncludesGraph(wordSmith); - - assert.deepEqual(this.serializer.request._includesGraph, { - data: { - 'word-smith:1': { - relationships: { - 'red-tag': 'red-tag:1', - 'blue-post': 'blue-post:1' - } - } - }, - included: { - 'red-tags': { - 'red-tag:1': { - }, - 'red-tag:2': { - relationships: { - 'some-color': 'some-color:1' - } - } - }, - 'blue-posts': { - 'blue-post:1': { - relationships: { - 'red-tag': 'red-tag:2' - } - } - }, - 'some-colors': { - 'some-color:1': {} - } - } - }); - }); - - test('it works on models with hasMany relationships', function(assert) { - let schema = new Schema(new Db(), { - wordSmith: Model.extend({ - redTags: hasMany(), - bluePosts: hasMany() - }), - bluePost: Model.extend({ - redTags: hasMany() - }), - redTag: Model.extend() - }); - let wordSmith = schema.wordSmiths.create(); - wordSmith.createRedTag(); - wordSmith.createRedTag(); - - let bluePost = wordSmith.createBluePost(); - bluePost.createRedTag(); - - this.serializer.request = { queryParams: { include: 'red-tags,blue-posts' } }; - - this.serializer._createRequestedIncludesGraph(wordSmith); - - assert.deepEqual(this.serializer.request._includesGraph, { - data: { - 'word-smith:1': { - relationships: { - 'red-tags': [ 'red-tag:1', 'red-tag:2' ], - 'blue-posts': [ 'blue-post:1' ] - } - } - }, - included: { - 'red-tags': { - 'red-tag:1': { - }, - 'red-tag:2': { - } - }, - 'blue-posts': { - 'blue-post:1': { - } - } - } - }); - }); - - test('it works on models with hasMany relationships and dot-path includes', function(assert) { - let schema = new Schema(new Db(), { - wordSmith: Model.extend({ - redTags: hasMany(), - bluePosts: hasMany() - }), - bluePost: Model.extend({ - redTags: hasMany() - }), - redTag: Model.extend({ - someColors: hasMany() - }), - someColor: Model.extend() - }); - let wordSmith = schema.wordSmiths.create(); - wordSmith.createRedTag(); - wordSmith.createRedTag(); - - let bluePost = wordSmith.createBluePost(); - let redTag = bluePost.createRedTag(); - redTag.createSomeColor(); - - this.serializer.request = { queryParams: { include: 'red-tags,blue-posts.red-tags.some-colors' } }; - - this.serializer._createRequestedIncludesGraph(wordSmith); - - assert.deepEqual(this.serializer.request._includesGraph, { - data: { - 'word-smith:1': { - relationships: { - 'red-tags': [ 'red-tag:1', 'red-tag:2' ], - 'blue-posts': [ 'blue-post:1' ] - } - } - }, - included: { - 'red-tags': { - 'red-tag:1': {}, - 'red-tag:2': {}, - 'red-tag:3': { - relationships: { - 'some-colors': [ 'some-color:1' ] - } - } - }, - 'blue-posts': { - 'blue-post:1': { - relationships: { - 'red-tags': [ 'red-tag:3' ] - } - } - }, - 'some-colors': { - 'some-color:1': {} - } - } - }); - }); -}); diff --git a/tests/unit/serializers/rest-serializer-test.js b/tests/unit/serializers/rest-serializer-test.js deleted file mode 100644 index c7294c44c..000000000 --- a/tests/unit/serializers/rest-serializer-test.js +++ /dev/null @@ -1,54 +0,0 @@ -import RestSerializer from 'ember-cli-mirage/serializers/rest-serializer'; - -import { module, test } from 'qunit'; -import { Model } from 'ember-cli-mirage'; -import Schema from 'ember-cli-mirage/orm/schema'; -import Db from 'ember-cli-mirage/db'; - -module('Unit | Serializers | RestSerializer', function(hooks) { - hooks.beforeEach(function() { - let schema = new Schema(new Db(), { - person: Model - }); - this.serializer = new RestSerializer({ - schema - }); - }); - - test('it hyphenates camelized words', function(assert) { - let payload = { - 'person': { - 'id': 1, - 'firstName': 'Rick', - 'lastName': 'Sanchez' - } - }; - let jsonApiDoc = this.serializer.normalize(payload); - - assert.deepEqual(jsonApiDoc, { - data: { - type: 'people', - id: 1, - attributes: { - 'first-name': 'Rick', - 'last-name': 'Sanchez' - } - } - }); - }); - - test('it returns coalesce Ids if present', function(assert) { - let request = { url: '/authors', queryParams: { ids: ['1', '3'] } }; - assert.deepEqual(this.serializer.getCoalescedIds(request), ['1', '3']); - }); - - test('it returns undefined coalesce Ids if not present', function(assert) { - let request = { url: '/authors', queryParams: {} }; - assert.strictEqual(this.serializer.getCoalescedIds(request), undefined); - }); -}); - -test('serializeIds defaults to "always"', function(assert) { - let defaultState = new RestSerializer; - assert.equal(defaultState.serializeIds, 'always'); -}); diff --git a/tests/unit/server-test.js b/tests/unit/server-test.js deleted file mode 100644 index a871f4634..000000000 --- a/tests/unit/server-test.js +++ /dev/null @@ -1,1288 +0,0 @@ -import Server from 'ember-cli-mirage/server'; -import {module, test} from 'qunit'; -import { Model, Factory, belongsTo, hasMany, trait, association } from 'ember-cli-mirage'; - -module('Unit | Server', function() { - test('it can be instantiated', function(assert) { - let server = new Server({ environment: 'test' }); - - assert.ok(server); - - server.shutdown(); - }); - - test('routes return pretender handler', function(assert) { - let server = new Server({ environment: 'test' }); - - let handler = server.post('foo'); - - assert.strictEqual(handler.numberOfCalls, 0); - - server.shutdown(); - }); - - test('it runs the default scenario in non-test environments', function(assert) { - assert.expect(1); - - let server = new Server({ - environment: 'development', - scenarios: { - default() { - assert.ok(true); - } - } - }); - - server.shutdown(); - }); -}); - -module('Unit | Server #loadConfig', function() { - test('forces timing to 0 in test environment', function(assert) { - let server = new Server({ environment: 'test' }); - - server.loadConfig(function() { - this.timing = 50; - }); - - assert.equal(server.timing, 0); - - server.shutdown(); - }); - - test("doesn't modify user's timing config in other environments", function(assert) { - let server = new Server({ environment: 'blah' }); - - server.loadConfig(function() { - this.timing = 50; - }); - - assert.equal(server.timing, 50); - - server.shutdown(); - }); -}); - -module('Unit | Server #db', function() { - test('its db is isolated across instances', function(assert) { - let server1 = new Server({ environment: 'test' }); - - server1.db.createCollection('contacts'); - server1.db.contacts.insert({ name: 'Sam' }); - - server1.shutdown(); - - let server2 = new Server({ environment: 'test' }); - - assert.equal(server2.contacts, undefined); - - server2.shutdown(); - }); -}); - -module('Unit | Server #create', function() { - test('create fails when no factories or models are registered', function(assert) { - let server = new Server({ environment: 'test' }); - - assert.throws(function() { - server.create('contact'); - }); - - server.shutdown(); - }); - - test('create fails when an expected factory isn\'t registered', function(assert) { - let server = new Server({ - environment: 'test', - factories: { - address: Factory - } - }); - - assert.throws(function() { - server.create('contact'); - }, /no model or factory was found/); - - server.shutdown(); - }); - - test('create works when models but no factories are registered', function(assert) { - let server = new Server({ - environment: 'test', - models: { - contact: Model - } - }); - - server.create('contact'); - - assert.equal(server.db.contacts.length, 1); - - server.shutdown(); - }); - - test('create adds the data to the db', function(assert) { - let server = new Server({ - environment: 'test', - factories: { - contact: Factory.extend({ - name: 'Sam' - }) - } - }); - - server.create('contact'); - let contactsInDb = server.db.contacts; - - assert.equal(contactsInDb.length, 1); - assert.deepEqual(contactsInDb[0], { id: '1', name: 'Sam' }); - - server.shutdown(); - }); - - test('create returns the new data in the db', function(assert) { - let server = new Server({ - environment: 'test', - factories: { - contact: Factory.extend({ - name: 'Sam' - }) - } - }); - - let contact = server.create('contact'); - - assert.deepEqual(contact, { id: '1', name: 'Sam' }); - - server.shutdown(); - }); - - test('create allows for attr overrides', function(assert) { - let server = new Server({ - environment: 'test', - factories: { - contact: Factory.extend({ - name: 'Sam' - }) - } - }); - - let sam = server.create('contact'); - let link = server.create('contact', { name: 'Link' }); - - assert.deepEqual(sam, { id: '1', name: 'Sam' }); - assert.deepEqual(link, { id: '2', name: 'Link' }); - - server.shutdown(); - }); - - test('create allows for attr overrides with extended factories', function(assert) { - let ContactFactory = Factory.extend({ - name: 'Link', - age: 500 - }); - let FriendFactory = ContactFactory.extend({ - is_young() { - return this.age < 18; - } - }); - - let server = new Server({ - environment: 'test', - factories: { - contact: ContactFactory, - friend: FriendFactory - } - }); - - let link = server.create('friend'); - let youngLink = server.create('friend', { age: 10 }); - - assert.deepEqual(link, { id: '1', name: 'Link', age: 500, is_young: false }); - assert.deepEqual(youngLink, { id: '2', name: 'Link', age: 10, is_young: true }); - - server.shutdown(); - }); - - test('create allows for attr overrides with arrays', function(assert) { - let server = new Server({ - environment: 'test', - factories: { - contact: Factory.extend({ - name: ['Sam', 'Carl'] - }) - } - }); - - let sam = server.create('contact'); - let link = server.create('contact', { name: ['Link'] }); - let noname = server.create('contact', { name: [] }); - - assert.deepEqual(sam, { id: '1', name: ['Sam', 'Carl'] }); - assert.deepEqual(link, { id: '2', name: ['Link'] }); - assert.deepEqual(noname, { id: '3', name: [] }); - - server.shutdown(); - }); - - test('create allows for nested attr overrides', function(assert) { - let server = new Server({ - environment: 'test', - factories: { - contact: Factory.extend({ - address: { - streetName: 'Main', - streetAddress(i) { - return 1000 + i; - } - } - }) - } - }); - - let contact1 = server.create('contact'); - let contact2 = server.create('contact'); - - assert.deepEqual(contact1, { id: '1', address: { streetName: 'Main', streetAddress: 1000 } }); - assert.deepEqual(contact2, { id: '2', address: { streetName: 'Main', streetAddress: 1001 } }); - - server.shutdown(); - }); - - test('factories can have dynamic properties that depend on attr overrides', function(assert) { - let server = new Server({ - environment: 'test', - factories: { - baz: Factory.extend({ - bar() { - return this.name.substr(1); - } - }) - } - }); - - let baz1 = server.create('baz', { name: 'foo' }); - - assert.deepEqual(baz1, { id: '1', name: 'foo', bar: 'oo' }); - - server.shutdown(); - }); - - test('create allows for arrays of attr overrides', function(assert) { - let server = new Server({ - environment: 'test', - factories: { - contact: Factory.extend({ - websites: [ - 'http://example.com', - function(i) { - return `http://placekitten.com/${320 + i}/${240 + i}`; - } - ] - }) - } - }); - - let contact1 = server.create('contact'); - let contact2 = server.create('contact'); - - assert.deepEqual(contact1, { id: '1', websites: ['http://example.com', 'http://placekitten.com/320/240'] }); - assert.deepEqual(contact2, { id: '2', websites: ['http://example.com', 'http://placekitten.com/321/241'] }); - - server.shutdown(); - }); - - test('create allows to extend factory with trait', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', - - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }) - }); - - let server = new Server({ - environment: 'test', - factories: { - article: ArticleFactory - } - }); - - let article = server.create('article'); - let publishedArticle = server.create('article', 'published'); - - assert.deepEqual(article, { id: '1', title: 'Lorem ipsum' }); - assert.deepEqual(publishedArticle, { id: '2', title: 'Lorem ipsum', isPublished: true, - publishedAt: '2010-01-01 10:00:00' }); - - server.shutdown(); - }); - - test('create allows to extend factory with multiple traits', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', - - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), - - withContent: trait({ - content: 'content' - }) - }); - - let server = new Server({ - environment: 'test', - factories: { - article: ArticleFactory - } - }); - - let article = server.create('article'); - let publishedArticle = server.create('article', 'published'); - let publishedArticleWithContent = server.create('article', 'published', 'withContent'); - - assert.deepEqual(article, { id: '1', title: 'Lorem ipsum' }); - assert.deepEqual(publishedArticle, { id: '2', title: 'Lorem ipsum', isPublished: true, - publishedAt: '2010-01-01 10:00:00' }); - assert.deepEqual(publishedArticleWithContent, { id: '3', title: 'Lorem ipsum', isPublished: true, - publishedAt: '2010-01-01 10:00:00', content: 'content' }); - - server.shutdown(); - }); - - test('create allows to extend factory with traits containing afterCreate callbacks', function(assert) { - let CommentFactory = Factory.extend({ - content: 'content' - }); - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', - - withComments: trait({ - afterCreate(article, server) { - server.createList('comment', 3, { article }); - } - }) - }); - - let server = new Server({ - environment: 'test', - factories: { - article: ArticleFactory, - comment: CommentFactory - } - }); - - let articleWithComments = server.create('article', 'withComments'); - - assert.deepEqual(articleWithComments, { id: '1', title: 'Lorem ipsum' }); - assert.equal(server.db.comments.length, 3); - - server.shutdown(); - }); - - test('create does not execute afterCreate callbacks from traits that are not applied', function(assert) { - let CommentFactory = Factory.extend({ - content: 'content' - }); - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', - - withComments: trait({ - afterCreate(article, server) { - server.createList('comment', 3, { article }); - } - }) - }); - - let server = new Server({ - environment: 'test', - factories: { - article: ArticleFactory, - comment: CommentFactory - } - }); - - let articleWithComments = server.create('article'); - - assert.deepEqual(articleWithComments, { id: '1', title: 'Lorem ipsum' }); - assert.equal(server.db.comments.length, 0); - - server.shutdown(); - }); - - test('create allows to extend with multiple traits and to apply attr overrides', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', - - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), - - withContent: trait({ - content: 'content' - }) - }); - - let server = new Server({ - environment: 'test', - factories: { - article: ArticleFactory - } - }); - - let overrides = { - publishedAt: '2012-01-01 10:00:00' - }; - let publishedArticleWithContent = server.create('article', 'published', 'withContent', overrides); - - assert.deepEqual(publishedArticleWithContent, { id: '1', title: 'Lorem ipsum', isPublished: true, - publishedAt: '2012-01-01 10:00:00', content: 'content' }); - - server.shutdown(); - }); - - test('create throws errors when using trait that is not defined and distinquishes between traits and non-traits', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', - - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), - - private: { - someAttr: 'value' - } - }); - - let server = new Server({ - environment: 'test', - factories: { - article: ArticleFactory - } - }); - - assert.throws(() => { - server.create('article', 'private'); - }, /'private' trait is not registered in 'article' factory/); - - server.shutdown(); - }); - - test('create allows to create objects with associations', function(assert) { - let AuthorFactory = Factory.extend({ - name: 'Sam' - }); - let CategoryFactory = Factory.extend({ - name: 'splendid software' - }); - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', - - withCategory: trait({ - awesomeCategory: association() - }), - - author: association() - }); - - let server = new Server({ - environment: 'test', - models: { - author: Model.extend({ - articles: hasMany() - }), - category: Model.extend({ - }), - article: Model.extend({ - author: belongsTo(), - awesomeCategory: belongsTo('category') - }) - }, - factories: { - article: ArticleFactory, - author: AuthorFactory, - category: CategoryFactory - } - }); - - let article = server.create('article', 'withCategory'); - - assert.deepEqual(article.attrs, { title: 'Lorem ipsum', id: '1', authorId: '1', awesomeCategoryId: '1' }); - assert.equal(server.db.authors.length, 1); - assert.equal(server.db.categories.length, 1); - - let anotherArticle = server.create('article', 'withCategory'); - assert.deepEqual(anotherArticle.attrs, { title: 'Lorem ipsum', id: '2', authorId: '2', awesomeCategoryId: '2' }); - assert.equal(server.db.authors.length, 2); - assert.equal(server.db.categories.length, 2); - - server.shutdown(); - }); - - test('create allows to create objects with associations with traits and overrides for associations', function(assert) { - let CategoryFactory = Factory.extend({ - name: 'splendid software', - - published: trait({ - isPublished: true, - publishedAt: '2014-01-01 10:00:00' - }) - }); - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', - - withCategory: trait({ - category: association('published', { publishedAt: '2016-01-01 12:00:00' }) - }) - }); - - let server = new Server({ - environment: 'test', - factories: { - article: ArticleFactory, - category: CategoryFactory - }, - models: { - category: Model.extend({ - }), - article: Model.extend({ - category: belongsTo('category') - }) - } - }); - - let article = server.create('article', 'withCategory'); - - assert.deepEqual(article.attrs, { title: 'Lorem ipsum', id: '1', categoryId: '1' }); - assert.equal(server.db.categories.length, 1); - assert.deepEqual( - server.db.categories[0], - { name: 'splendid software', id: '1', isPublished: true, publishedAt: '2016-01-01 12:00:00' } - ); - - server.shutdown(); - }); - - test('create does not create (extra) models on associations when they are passed in as overrides', function(assert) { - let MotherFactory = Factory.extend({ - name: 'Should not create' - }); - let ChildFactory = Factory.extend({ - mother: association() - }); - - let server = new Server({ - environment: 'test', - factories: { - mother: MotherFactory, - child: ChildFactory - }, - models: { - mother: Model.extend({ - children: hasMany('child') - }), - child: Model.extend({ - mother: belongsTo('mother') - }) - } - }); - - let mother = server.create('mother', { name: 'Lynda' }); - server.create('child', { name: 'Don', mother }); - server.create('child', { name: 'Dan', mother }); - - assert.equal(server.db.mothers.length, 1); - - server.shutdown(); - }); -}); - -module('Unit | Server #createList', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ environment: 'test' }); - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('createList adds the given number of elements to the db', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ name: 'Sam' }) - }); - - this.server.createList('contact', 3); - let contactsInDb = this.server.db.contacts; - - assert.equal(contactsInDb.length, 3); - assert.deepEqual(contactsInDb[0], { id: '1', name: 'Sam' }); - assert.deepEqual(contactsInDb[1], { id: '2', name: 'Sam' }); - assert.deepEqual(contactsInDb[2], { id: '3', name: 'Sam' }); - }); - - test('createList returns the created elements', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ name: 'Sam' }) - }); - - this.server.create('contact'); - let contacts = this.server.createList('contact', 3); - - assert.equal(contacts.length, 3); - assert.deepEqual(contacts[0], { id: '2', name: 'Sam' }); - assert.deepEqual(contacts[1], { id: '3', name: 'Sam' }); - assert.deepEqual(contacts[2], { id: '4', name: 'Sam' }); - }); - - test('createList respects sequences', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ - name(i) { - return `name${i}`; - } - }) - }); - - let contacts = this.server.createList('contact', 3); - - assert.deepEqual(contacts[0], { id: '1', name: 'name0' }); - assert.deepEqual(contacts[1], { id: '2', name: 'name1' }); - assert.deepEqual(contacts[2], { id: '3', name: 'name2' }); - }); - - test('createList respects attr overrides', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ name: 'Sam' }) - }); - - let sams = this.server.createList('contact', 2); - let links = this.server.createList('contact', 2, { name: 'Link' }); - - assert.deepEqual(sams[0], { id: '1', name: 'Sam' }); - assert.deepEqual(sams[1], { id: '2', name: 'Sam' }); - assert.deepEqual(links[0], { id: '3', name: 'Link' }); - assert.deepEqual(links[1], { id: '4', name: 'Link' }); - }); - - test('createList respects traits', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', - - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), - - withContent: trait({ - content: 'content' - }) - }); - - this.server.loadFactories({ - article: ArticleFactory - }); - - let articles = this.server.createList('article', 2, 'published', 'withContent'); - - assert.deepEqual(articles[0], { id: '1', title: 'Lorem ipsum', isPublished: true, - publishedAt: '2010-01-01 10:00:00', content: 'content' }); - assert.deepEqual(articles[1], { id: '2', title: 'Lorem ipsum', isPublished: true, - publishedAt: '2010-01-01 10:00:00', content: 'content' }); - }); - - test('createList respects traits with attr overrides', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', - - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), - - withContent: trait({ - content: 'content' - }) - }); - - this.server.loadFactories({ - article: ArticleFactory - }); - - let overrides = { publishedAt: '2012-01-01 10:00:00' }; - let articles = this.server.createList('article', 2, 'published', 'withContent', overrides); - - assert.deepEqual(articles[0], { id: '1', title: 'Lorem ipsum', isPublished: true, - publishedAt: '2012-01-01 10:00:00', content: 'content' }); - assert.deepEqual(articles[1], { id: '2', title: 'Lorem ipsum', isPublished: true, - publishedAt: '2012-01-01 10:00:00', content: 'content' }); - }); - - test('createList throws errors when using trait that is not defined and distinquishes between traits and non-traits', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', - - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), - - private: { - someAttr: 'value' - } - }); - - this.server.loadFactories({ - article: ArticleFactory - }); - - assert.throws(() => { - this.server.createList('article', 2, 'private'); - }, /'private' trait is not registered in 'article' factory/); - }); - - test('createList throws an error if the second argument is not an integer', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', - - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }) - }); - - this.server.loadFactories({ - article: ArticleFactory - }); - - assert.throws(() => { - this.server.createList('article', 'published'); - }, /second argument has to be an integer, you passed: string/); - }); -}); - -module('Unit | Server #build', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ environment: 'test' }); - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('build does not add the data to the db', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ name: 'Sam' }) - }); - - this.server.build('contact'); - let contactsInDb = this.server.db.contacts; - - assert.equal(contactsInDb.length, 0); - }); - - test('build returns the new attrs with no id', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ name: 'Sam' }) - }); - - let contact = this.server.build('contact'); - - assert.deepEqual(contact, { name: 'Sam' }); - }); - - test('build allows for attr overrides', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ name: 'Sam' }) - }); - - let sam = this.server.build('contact'); - let link = this.server.build('contact', { name: 'Link' }); - - assert.deepEqual(sam, { name: 'Sam' }); - assert.deepEqual(link, { name: 'Link' }); - }); - - test('build allows for attr overrides with extended factories', function(assert) { - let ContactFactory = Factory.extend({ - name: 'Link', - age: 500 - }); - let FriendFactory = ContactFactory.extend({ - is_young() { - return this.age < 18; - } - }); - this.server.loadFactories({ - contact: ContactFactory, - friend: FriendFactory - }); - - let link = this.server.build('friend'); - let youngLink = this.server.build('friend', { age: 10 }); - - assert.deepEqual(link, { name: 'Link', age: 500, is_young: false }); - assert.deepEqual(youngLink, { name: 'Link', age: 10, is_young: true }); - }); - - test('build allows for attr overrides with arrays', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ name: ['Sam', 'Carl'] }) - }); - - let sam = this.server.build('contact'); - let link = this.server.build('contact', { name: ['Link'] }); - let noname = this.server.build('contact', { name: [] }); - - assert.deepEqual(sam, { name: ['Sam', 'Carl'] }); - assert.deepEqual(link, { name: ['Link'] }); - assert.deepEqual(noname, { name: [] }); - }); - - test('build allows for nested attr overrides', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ - address: { - streetName: 'Main', - streetAddress(i) { - return 1000 + i; - } - } - }) - }); - - let contact1 = this.server.build('contact'); - let contact2 = this.server.build('contact'); - - assert.deepEqual(contact1, { address: { streetName: 'Main', streetAddress: 1000 } }); - assert.deepEqual(contact2, { address: { streetName: 'Main', streetAddress: 1001 } }); - }); - - test('build allows for arrays of attr overrides', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ - websites: [ - 'http://example.com', - function(i) { - return `http://placekitten.com/${320 + i}/${240 + i}`; - } - ] - }) - }); - - let contact1 = this.server.build('contact'); - let contact2 = this.server.build('contact'); - - assert.deepEqual(contact1, { websites: ['http://example.com', 'http://placekitten.com/320/240'] }); - assert.deepEqual(contact2, { websites: ['http://example.com', 'http://placekitten.com/321/241'] }); - }); - - test('build allows to extend factory with trait', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', - - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }) - }); - - this.server.loadFactories({ - article: ArticleFactory - }); - - let article = this.server.build('article'); - let publishedArticle = this.server.build('article', 'published'); - - assert.deepEqual(article, { title: 'Lorem ipsum' }); - assert.deepEqual(publishedArticle, { title: 'Lorem ipsum', isPublished: true, - publishedAt: '2010-01-01 10:00:00' }); - }); - - test('build allows to extend factory with multiple traits', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', - - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), - - withContent: trait({ - content: 'content' - }) - }); - - this.server.loadFactories({ - article: ArticleFactory - }); - - let article = this.server.build('article'); - let publishedArticle = this.server.build('article', 'published'); - let publishedArticleWithContent = this.server.build('article', 'published', 'withContent'); - - assert.deepEqual(article, { title: 'Lorem ipsum' }); - assert.deepEqual(publishedArticle, { title: 'Lorem ipsum', isPublished: true, - publishedAt: '2010-01-01 10:00:00' }); - assert.deepEqual(publishedArticleWithContent, { title: 'Lorem ipsum', isPublished: true, - publishedAt: '2010-01-01 10:00:00', content: 'content' }); - }); - - test('build allows to extend with multiple traits and to apply attr overrides', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', - - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), - - withContent: trait({ - content: 'content' - }) - }); - - this.server.loadFactories({ - article: ArticleFactory - }); - - let overrides = { - publishedAt: '2012-01-01 10:00:00' - }; - let publishedArticleWithContent = this.server.build('article', 'published', 'withContent', overrides); - - assert.deepEqual(publishedArticleWithContent, { title: 'Lorem ipsum', isPublished: true, - publishedAt: '2012-01-01 10:00:00', content: 'content' }); - }); - - test('build allows to build objects with associations', function(assert) { - let AuthorFactory = Factory.extend({ - name: 'Yehuda' - }); - let CategoryFactory = Factory.extend({ - name: 'splendid software' - }); - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', - - withCategory: trait({ - awesomeCategory: association() - }), - - someOtherTrait: trait({ - user: association() - }), - - author: association() - }); - - this.server.loadFactories({ - article: ArticleFactory, - author: AuthorFactory, - category: CategoryFactory - }); - this.server.schema.registerModels({ - author: Model.extend({ - articles: hasMany() - }), - category: Model.extend({ - }), - article: Model.extend({ - author: belongsTo(), - awesomeCategory: belongsTo('category') - }) - }); - - let article = this.server.build('article', 'withCategory'); - - assert.deepEqual(article, { title: 'Lorem ipsum', authorId: '1', awesomeCategoryId: '1' }); - assert.equal(server.db.authors.length, 1); - assert.equal(server.db.categories.length, 1); - }); - - test('build allows to build objects with associations with traits and overrides for associations', function(assert) { - let CategoryFactory = Factory.extend({ - name: 'splendid software', - - published: trait({ - isPublished: true, - publishedAt: '2014-01-01 10:00:00' - }) - }); - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', - - withCategory: trait({ - category: association('published', { publishedAt: '2016-01-01 12:00:00' }) - }) - }); - - this.server.config({ - factories: { - article: ArticleFactory, - category: CategoryFactory - }, - models: { - category: Model.extend({ - }), - article: Model.extend({ - category: belongsTo() - }) - } - }); - - let article = this.server.build('article', 'withCategory'); - - assert.deepEqual(article, { title: 'Lorem ipsum', categoryId: '1' }); - assert.equal(this.server.db.categories.length, 1); - assert.deepEqual( - this.server.db.categories[0], - { name: 'splendid software', id: '1', isPublished: true, publishedAt: '2016-01-01 12:00:00' } - ); - }); - - test('build throws errors when using trait that is not defined and distinquishes between traits and non-traits', function(assert) { - this.server.config({ - factories: { - article: Factory.extend({ - title: 'Lorem ipsum', - - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), - - private: { - someAttr: 'value' - } - }) - } - }); - - assert.throws(() => { - this.server.build('article', 'private'); - }, /'private' trait is not registered in 'article' factory/); - }); - - test('build does not build objects and throws error if model is not registered and association helper is used', function(assert) { - this.server.config({ - factories: { - article: Factory.extend({ - title: 'Lorem ipsum', - - withCategory: trait({ - category: association('published', { publishedAt: '2016-01-01 12:00:00' }) - }) - }), - category: Factory.extend({ - name: 'splendid software', - - published: trait({ - isPublished: true, - publishedAt: '2014-01-01 10:00:00' - }) - }) - }, - models: { - category: Model.extend() - } - }); - - assert.throws(() => { - this.server.build('article', 'withCategory'); - }, /Model not registered: article/); - }); - - test('build does not build objects and throws error if model for given association is not registered', function(assert) { - this.server.config({ - factories: { - article: Factory.extend({ - title: 'Lorem ipsum', - - withCategory: trait({ - category: association('published', { publishedAt: '2016-01-01 12:00:00' }) - }) - }), - category: Factory.extend({ - name: 'splendid software', - - published: trait({ - isPublished: true, - publishedAt: '2014-01-01 10:00:00' - }) - }) - }, - models: { - article: Model.extend() - } - }); - - assert.throws(() => { - this.server.build('article', 'withCategory'); - }, /You're using the `association` factory helper on the 'category' attribute of your article factory/); - }); -}); - -module('Unit | Server #buildList', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ environment: 'test' }); - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test('buildList does not add elements to the db', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ name: 'Sam' }) - }); - - this.server.buildList('contact', 3); - let contactsInDb = this.server.db.contacts; - - assert.equal(contactsInDb.length, 0); - }); - - test('buildList returns the built elements without ids', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ name: 'Sam' }) - }); - - this.server.create('contact'); - let contacts = this.server.buildList('contact', 3); - - assert.equal(contacts.length, 3); - assert.deepEqual(contacts[0], { name: 'Sam' }); - assert.deepEqual(contacts[1], { name: 'Sam' }); - assert.deepEqual(contacts[2], { name: 'Sam' }); - }); - - test('buildList respects sequences', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ - name(i) { - return `name${i}`; - } - }) - }); - - let contacts = this.server.buildList('contact', 3); - - assert.deepEqual(contacts[0], { name: 'name0' }); - assert.deepEqual(contacts[1], { name: 'name1' }); - assert.deepEqual(contacts[2], { name: 'name2' }); - }); - - test('buildList respects attr overrides', function(assert) { - this.server.loadFactories({ - contact: Factory.extend({ name: 'Sam' }) - }); - - let sams = this.server.buildList('contact', 2); - let links = this.server.buildList('contact', 2, { name: 'Link' }); - - assert.deepEqual(sams[0], { name: 'Sam' }); - assert.deepEqual(sams[1], { name: 'Sam' }); - assert.deepEqual(links[0], { name: 'Link' }); - assert.deepEqual(links[1], { name: 'Link' }); - }); - - test('buildList respects traits', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', - - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), - - withContent: trait({ - content: 'content' - }) - }); - - this.server.loadFactories({ - article: ArticleFactory - }); - - let articles = this.server.buildList('article', 2, 'published', 'withContent'); - - assert.deepEqual(articles[0], { title: 'Lorem ipsum', isPublished: true, - publishedAt: '2010-01-01 10:00:00', content: 'content' }); - assert.deepEqual(articles[1], { title: 'Lorem ipsum', isPublished: true, - publishedAt: '2010-01-01 10:00:00', content: 'content' }); - }); - - test('buildList respects traits with attr overrides', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', - - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), - - withContent: trait({ - content: 'content' - }) - }); - - this.server.loadFactories({ - article: ArticleFactory - }); - - let overrides = { publishedAt: '2012-01-01 10:00:00' }; - let articles = this.server.buildList('article', 2, 'published', 'withContent', overrides); - - assert.deepEqual(articles[0], { title: 'Lorem ipsum', isPublished: true, - publishedAt: '2012-01-01 10:00:00', content: 'content' }); - assert.deepEqual(articles[1], { title: 'Lorem ipsum', isPublished: true, - publishedAt: '2012-01-01 10:00:00', content: 'content' }); - }); - - test('buildList throws errors when using trait that is not defined and distinquishes between traits and non-traits', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', - - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }), - - private: { - someAttr: 'value' - } - }); - - this.server.loadFactories({ - article: ArticleFactory - }); - - assert.throws(() => { - this.server.buildList('article', 2, 'private'); - }, /'private' trait is not registered in 'article' factory/); - }); - - test('buildList throws an error if the second argument is not an integer', function(assert) { - let ArticleFactory = Factory.extend({ - title: 'Lorem ipsum', - - published: trait({ - isPublished: true, - publishedAt: '2010-01-01 10:00:00' - }) - }); - - this.server.loadFactories({ - article: ArticleFactory - }); - - assert.throws(() => { - this.server.buildList('article', 'published'); - }, /second argument has to be an integer, you passed: string/); - }); -}); diff --git a/yarn.lock b/yarn.lock index 44da6ebfd..7747a9d79 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,66 +7,50 @@ resolved "https://registry.yarnpkg.com/30-seconds-of-code/-/30-seconds-of-code-1.2.3.tgz#b955acba83a050e3754fd0c84faaf25b32287fd4" integrity sha512-IRjJtNwmSfVLplKCOxHfjup1Z7Cq1IgDCvGiKf+6gFGq/eEVfYqwGaEQx+NH1vsQZkCJrg8YMfBKGNUnb+uI+w== -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" - integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== - dependencies: - "@babel/highlight" "^7.0.0" - -"@babel/code-frame@^7.8.3": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== dependencies: "@babel/highlight" "^7.8.3" -"@babel/compat-data@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.8.4.tgz#bbe65d05a291667a8394fe8a0e0e277ef22b0d2a" - integrity sha512-lHLhlsvFjJAqNU71b7k6Vv9ewjmTXKvqaMv7n0G1etdCabWLw3nEYE8mmgoVOxMIFE07xOvo7H7XBASirX6Rrg== +"@babel/compat-data@^7.8.6", "@babel/compat-data@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.0.tgz#04815556fc90b0c174abd2c0c1bb966faa036a6c" + integrity sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g== dependencies: - browserslist "^4.8.5" + browserslist "^4.9.1" invariant "^2.2.4" semver "^5.5.0" "@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.2.2", "@babel/core@^7.3.4", "@babel/core@^7.8.3", "@babel/core@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.4.tgz#d496799e5c12195b3602d0fddd77294e3e38e80e" - integrity sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA== + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" + integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== dependencies: "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.4" - "@babel/helpers" "^7.8.4" - "@babel/parser" "^7.8.4" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.4" - "@babel/types" "^7.8.3" + "@babel/generator" "^7.9.0" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helpers" "^7.9.0" + "@babel/parser" "^7.9.0" + "@babel/template" "^7.8.6" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" - json5 "^2.1.0" + json5 "^2.1.2" lodash "^4.17.13" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.4.tgz#db651e2840ca9aa66f327dcec1dc5f5fa9611369" - integrity sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg== +"@babel/generator@^7.9.0": + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.4.tgz#12441e90c3b3c4159cdecf312075bf1a8ce2dbce" + integrity sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA== dependencies: - "@babel/types" "^7.7.4" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - -"@babel/generator@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.4.tgz#35bbc74486956fe4251829f9f6c48330e8d0985e" - integrity sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA== - dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.9.0" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" @@ -86,57 +70,37 @@ "@babel/helper-explode-assignable-expression" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-call-delegate@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz#de82619898aa605d409c42be6ffb8d7204579692" - integrity sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A== - dependencies: - "@babel/helper-hoist-variables" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-compilation-targets@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.4.tgz#03d7ecd454b7ebe19a254f76617e61770aed2c88" - integrity sha512-3k3BsKMvPp5bjxgMdrFyq0UaEO48HciVrOVF0+lon8pp95cyJ2ujAh0TrBHNMnJGT2rr0iKOJPFFbSqjDyf/Pg== +"@babel/helper-compilation-targets@^7.8.4", "@babel/helper-compilation-targets@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde" + integrity sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw== dependencies: - "@babel/compat-data" "^7.8.4" - browserslist "^4.8.5" + "@babel/compat-data" "^7.8.6" + browserslist "^4.9.1" invariant "^2.2.4" levenary "^1.1.1" semver "^5.5.0" -"@babel/helper-create-class-features-plugin@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.4.tgz#fce60939fd50618610942320a8d951b3b639da2d" - integrity sha512-l+OnKACG4uiDHQ/aJT8dwpR+LhCJALxL0mJ6nzjB25e5IPwqV1VOsY7ah6UB1DG+VOXAIMtuC54rFJGiHkxjgA== - dependencies: - "@babel/helper-function-name" "^7.7.4" - "@babel/helper-member-expression-to-functions" "^7.7.4" - "@babel/helper-optimise-call-expression" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.7.4" - "@babel/helper-split-export-declaration" "^7.7.4" - "@babel/helper-create-class-features-plugin@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz#5b94be88c255f140fd2c10dd151e7f98f4bff397" - integrity sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA== + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz#243a5b46e2f8f0f674dc1387631eb6b28b851de0" + integrity sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg== dependencies: "@babel/helper-function-name" "^7.8.3" "@babel/helper-member-expression-to-functions" "^7.8.3" "@babel/helper-optimise-call-expression" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" "@babel/helper-split-export-declaration" "^7.8.3" -"@babel/helper-create-regexp-features-plugin@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz#c774268c95ec07ee92476a3862b75cc2839beb79" - integrity sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q== +"@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087" + integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg== dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" "@babel/helper-regex" "^7.8.3" - regexpu-core "^4.6.0" + regexpu-core "^4.7.0" "@babel/helper-define-map@^7.8.3": version "7.8.3" @@ -155,15 +119,6 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-function-name@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz#ab6e041e7135d436d8f0a3eca15de5b67a341a2e" - integrity sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ== - dependencies: - "@babel/helper-get-function-arity" "^7.7.4" - "@babel/template" "^7.7.4" - "@babel/types" "^7.7.4" - "@babel/helper-function-name@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" @@ -173,13 +128,6 @@ "@babel/template" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-get-function-arity@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz#cb46348d2f8808e632f0ab048172130e636005f0" - integrity sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA== - dependencies: - "@babel/types" "^7.7.4" - "@babel/helper-get-function-arity@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" @@ -194,13 +142,6 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-member-expression-to-functions@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz#356438e2569df7321a8326644d4b790d2122cb74" - integrity sha512-9KcA1X2E3OjXl/ykfMMInBK+uVdfIVakVe7W7Lg3wfXUNyS3Q1HWLFRwZIjhqiCGbslummPDnmb7vIekS0C1vw== - dependencies: - "@babel/types" "^7.7.4" - "@babel/helper-member-expression-to-functions@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" @@ -208,32 +149,26 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.8.3": +"@babel/helper-module-imports@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== dependencies: "@babel/types" "^7.8.3" -"@babel/helper-module-transforms@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz#d305e35d02bee720fbc2c3c3623aa0c316c01590" - integrity sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q== +"@babel/helper-module-transforms@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" + integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== dependencies: "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" "@babel/helper-simple-access" "^7.8.3" "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/template" "^7.8.6" + "@babel/types" "^7.9.0" lodash "^4.17.13" -"@babel/helper-optimise-call-expression@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz#034af31370d2995242aa4df402c3b7794b2dcdf2" - integrity sha512-VB7gWZ2fDkSuqW6b1AKXkJWO5NyNI3bFL/kK79/30moK57blr6NbH8xcl2XcKCwOmJosftWunZqfO84IGq3ZZg== - dependencies: - "@babel/types" "^7.7.4" - "@babel/helper-optimise-call-expression@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" @@ -241,12 +176,7 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-plugin-utils@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" - integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== - -"@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== @@ -269,25 +199,15 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-replace-supers@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz#3c881a6a6a7571275a72d82e6107126ec9e2cdd2" - integrity sha512-pP0tfgg9hsZWo5ZboYGuBn/bbYT/hdLPVSS4NMmiRJdwWhP0IznPwN9AE1JwyGsjSPLC364I0Qh5p+EPkGPNpg== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.7.4" - "@babel/helper-optimise-call-expression" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" - -"@babel/helper-replace-supers@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz#91192d25f6abbcd41da8a989d4492574fb1530bc" - integrity sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA== +"@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" + integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== dependencies: "@babel/helper-member-expression-to-functions" "^7.8.3" "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/traverse" "^7.8.6" + "@babel/types" "^7.8.6" "@babel/helper-simple-access@^7.8.3": version "7.8.3" @@ -297,13 +217,6 @@ "@babel/template" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-split-export-declaration@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz#57292af60443c4a3622cf74040ddc28e68336fd8" - integrity sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug== - dependencies: - "@babel/types" "^7.7.4" - "@babel/helper-split-export-declaration@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" @@ -311,6 +224,11 @@ dependencies: "@babel/types" "^7.8.3" +"@babel/helper-validator-identifier@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" + integrity sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw== + "@babel/helper-wrap-function@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" @@ -321,42 +239,28 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helpers@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.4.tgz#754eb3ee727c165e0a240d6c207de7c455f36f73" - integrity sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w== +"@babel/helpers@^7.9.0": + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" + integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== dependencies: "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.4" - "@babel/types" "^7.8.3" - -"@babel/highlight@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" - integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^4.0.0" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" "@babel/highlight@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797" - integrity sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg== + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" + integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== dependencies: + "@babel/helper-validator-identifier" "^7.9.0" chalk "^2.0.0" - esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.3.4", "@babel/parser@^7.4.5", "@babel/parser@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.4.tgz#75ab2d7110c2cf2fa949959afb05fa346d2231bb" - integrity sha512-jIwvLO0zCL+O/LmEJQjWA75MQTWwx3c3u2JOTDK5D3/9egrWRRA0/0hk9XXywYnXZVVpzrBYeIQTmhwUaePI9g== - -"@babel/parser@^7.8.3", "@babel/parser@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.4.tgz#d1dbe64691d60358a974295fa53da074dd2ce8e8" - integrity sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw== +"@babel/parser@^7.3.4", "@babel/parser@^7.4.5", "@babel/parser@^7.7.0", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" + integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== "@babel/plugin-proposal-async-generator-functions@^7.8.3": version "7.8.3" @@ -400,15 +304,7 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-json-strings" "^7.8.0" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.4.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.7.4.tgz#7db302c83bc30caa89e38fee935635ef6bd11c28" - integrity sha512-TbYHmr1Gl1UC7Vo2HVuj/Naci5BEGNZ0AJhzqD2Vpr6QPFWpUmBRLrIDjedzx7/CShq0bRDS2gI4FIs77VHLVQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.7.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.4.4", "@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== @@ -416,10 +312,18 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/plugin-proposal-object-rest-spread@^7.8.3": +"@babel/plugin-proposal-numeric-separator@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz#eb5ae366118ddca67bed583b53d7554cad9951bb" - integrity sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA== + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" + integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + +"@babel/plugin-proposal-object-rest-spread@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz#a28993699fc13df165995362693962ba6b061d6f" + integrity sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" @@ -432,28 +336,20 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.6.0": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.7.4.tgz#3f04c2de1a942cbd3008324df8144b9cbc0ca0ba" - integrity sha512-JmgaS+ygAWDR/STPe3/7y0lNlHgS+19qZ9aC06nYLwQ/XB7c0q5Xs+ksFU3EDnp9EiEsO0dnRAOKeyLHTZuW3A== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-chaining" "^7.7.4" - -"@babel/plugin-proposal-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz#ae10b3214cb25f7adb1f3bc87ba42ca10b7e2543" - integrity sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg== +"@babel/plugin-proposal-optional-chaining@^7.6.0", "@babel/plugin-proposal-optional-chaining@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" + integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-unicode-property-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz#b646c3adea5f98800c9ab45105ac34d06cd4a47f" - integrity sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ== +"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d" + integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-create-regexp-features-plugin" "^7.8.8" "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-async-generators@^7.8.0": @@ -470,14 +366,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-dynamic-import@^7.2.0": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz#29ca3b4415abfe4a5ec381e903862ad1a54c3aec" - integrity sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-dynamic-import@^7.8.0": +"@babel/plugin-syntax-dynamic-import@^7.2.0", "@babel/plugin-syntax-dynamic-import@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== @@ -491,13 +380,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-nullish-coalescing-operator@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.7.4.tgz#e53b751d0c3061b1ba3089242524b65a7a9da12b" - integrity sha512-XKh/yIRPiQTOeBg0QJjEus5qiSKucKAiApNtO1psqG7D17xmE+X2i5ZqBEuSvo0HRuyPaKaSN/Gy+Ha9KFQolw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" @@ -505,6 +387,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" + integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" @@ -519,13 +408,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-chaining@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.7.4.tgz#c91fdde6de85d2eb8906daea7b21944c3610c901" - integrity sha512-2MqYD5WjZSbJdUagnJvIdSfkb/ucOC9/1fRJxm7GAxY6YQLWlUvkfxoNbUPcPLHJyetKUDQ4+yyuUyAoc0HriA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-chaining@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" @@ -540,14 +422,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-typescript@^7.2.0", "@babel/plugin-syntax-typescript@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.7.4.tgz#5d037ffa10f3b25a16f32570ebbe7a8c2efa304b" - integrity sha512-77blgY18Hud4NM1ggTA8xVT/dBENQf17OpiToSa2jSmEY3fWXD2jwrdVlO4kq5yzUTeF15WSQ6b4fByNvJcjpQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-typescript@^7.8.3": +"@babel/plugin-syntax-typescript@^7.2.0", "@babel/plugin-syntax-typescript@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz#c1f659dda97711a569cef75275f7e15dcaa6cabc" integrity sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg== @@ -585,17 +460,17 @@ "@babel/helper-plugin-utils" "^7.8.3" lodash "^4.17.13" -"@babel/plugin-transform-classes@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz#46fd7a9d2bb9ea89ce88720477979fe0d71b21b8" - integrity sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w== +"@babel/plugin-transform-classes@^7.9.0": + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz#8603fc3cc449e31fdbdbc257f67717536a11af8d" + integrity sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ== dependencies: "@babel/helper-annotate-as-pure" "^7.8.3" "@babel/helper-define-map" "^7.8.3" "@babel/helper-function-name" "^7.8.3" "@babel/helper-optimise-call-expression" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" "@babel/helper-split-export-declaration" "^7.8.3" globals "^11.1.0" @@ -607,13 +482,13 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-destructuring@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz#20ddfbd9e4676906b1056ee60af88590cc7aaa0b" - integrity sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ== + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz#fadb2bc8e90ccaf5658de6f8d4d22ff6272a2f4b" + integrity sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ== dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-dotall-regex@^7.8.3": +"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== @@ -636,10 +511,10 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-for-of@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz#6fe8eae5d6875086ee185dd0b098a8513783b47d" - integrity sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A== +"@babel/plugin-transform-for-of@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" + integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ== dependencies: "@babel/helper-plugin-utils" "^7.8.3" @@ -665,41 +540,41 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-modules-amd@^7.0.0", "@babel/plugin-transform-modules-amd@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz#65606d44616b50225e76f5578f33c568a0b876a5" - integrity sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ== +"@babel/plugin-transform-modules-amd@^7.0.0", "@babel/plugin-transform-modules-amd@^7.8.3", "@babel/plugin-transform-modules-amd@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4" + integrity sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q== dependencies: - "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-commonjs@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz#df251706ec331bd058a34bdd72613915f82928a5" - integrity sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg== +"@babel/plugin-transform-modules-commonjs@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940" + integrity sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g== dependencies: - "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" "@babel/helper-simple-access" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-systemjs@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz#d8bbf222c1dbe3661f440f2f00c16e9bb7d0d420" - integrity sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg== +"@babel/plugin-transform-modules-systemjs@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90" + integrity sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ== dependencies: "@babel/helper-hoist-variables" "^7.8.3" - "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-umd@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz#592d578ce06c52f5b98b02f913d653ffe972661a" - integrity sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw== +"@babel/plugin-transform-modules-umd@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697" + integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ== dependencies: - "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": @@ -716,12 +591,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-object-assign@^7.2.0": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.7.4.tgz#a31b70c434a00a078b2d4d10dbd59992fa70afca" - integrity sha512-0TpeUlnhQDwKxPLTIckdaWt46L2s61c/5w5snw1OUod5ehOJywZD98Ha3dFHVjeqkfOFtOTH7cqxddjxUuvcmg== +"@babel/plugin-transform-object-assign@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.8.3.tgz#dc3b8dd50ef03837868a37b7df791f64f288538e" + integrity sha512-i3LuN8tPDqUCRFu3dkzF2r1Nx0jp4scxtm7JxtIqI9he9Vk20YD+/zshdzR9JLsoBMlJlNR82a62vQExNEVx/Q== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-object-super@^7.8.3": version "7.8.3" @@ -731,12 +606,11 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/helper-replace-supers" "^7.8.3" -"@babel/plugin-transform-parameters@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz#1d5155de0b65db0ccf9971165745d3bb990d77d3" - integrity sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA== +"@babel/plugin-transform-parameters@^7.8.7": + version "7.9.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz#3028d0cc20ddc733166c6e9c8534559cee09f54a" + integrity sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg== dependencies: - "@babel/helper-call-delegate" "^7.8.3" "@babel/helper-get-function-arity" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" @@ -747,12 +621,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-regenerator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz#b31031e8059c07495bf23614c97f3d9698bc6ec8" - integrity sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA== +"@babel/plugin-transform-regenerator@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" + integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA== dependencies: - regenerator-transform "^0.14.0" + regenerator-transform "^0.14.2" "@babel/plugin-transform-reserved-words@^7.8.3": version "7.8.3" @@ -762,9 +636,9 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-runtime@^7.2.0", "@babel/plugin-transform-runtime@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.8.3.tgz#c0153bc0a5375ebc1f1591cb7eea223adea9f169" - integrity sha512-/vqUt5Yh+cgPZXXjmaG9NT8aVfThKk7G4OqkVhrXqwsC5soMn/qTCxs36rZ2QFhpfTJcjw4SNDIZ4RUb8OL4jQ== + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz#45468c0ae74cc13204e1d3b1f4ce6ee83258af0b" + integrity sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw== dependencies: "@babel/helper-module-imports" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" @@ -809,9 +683,9 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-typescript@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.3.tgz#be6f01a7ef423be68e65ace1f04fc407e6d88917" - integrity sha512-Ebj230AxcrKGZPKIp4g4TdQLrqX95TobLUWKd/CwG7X1XHUH1ZpkpFvXuXqWbtGRWb7uuEWNlrl681wsOArAdQ== + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.4.tgz#4bb4dde4f10bbf2d787fce9707fb09b483e33359" + integrity sha512-yeWeUkKx2auDbSxRe8MusAG+n4m9BFY/v+lPjmQDgOFX5qnySkUY5oXzkp6FwPdsYqnKay6lorXYdC0n3bZO7w== dependencies: "@babel/helper-create-class-features-plugin" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" @@ -825,14 +699,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-typescript" "^7.2.0" -"@babel/plugin-transform-typescript@~7.7.0": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.7.4.tgz#2974fd05f4e85c695acaf497f432342de9fc0636" - integrity sha512-X8e3tcPEKnwwPVG+vP/vSqEShkwODOEeyQGod82qrIuidwIrfnsGn11qPM1jBLF4MqguTXXYzm58d0dY+/wdpg== +"@babel/plugin-transform-typescript@~7.8.0": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.7.tgz#48bccff331108a7b3a28c3a4adc89e036dc3efda" + integrity sha512-7O0UsPQVNKqpHeHLpfvOG4uXmlw+MOxYvUv6Otc9uH5SYMIxvF6eBdjkWvC3f9G+VXe0RsNExyAQBeTRug/wqQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-typescript" "^7.7.4" + "@babel/helper-create-class-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-typescript" "^7.8.3" "@babel/plugin-transform-unicode-regex@^7.8.3": version "7.8.3" @@ -843,34 +717,36 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/polyfill@^7.0.0", "@babel/polyfill@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.8.3.tgz#2333fc2144a542a7c07da39502ceeeb3abe4debd" - integrity sha512-0QEgn2zkCzqGIkSWWAEmvxD7e00Nm9asTtQvi7HdlYvMhjy/J38V/1Y9ode0zEJeIuxAI0uftiAzqc7nVeWUGg== + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.8.7.tgz#151ec24c7135481336168c3bd8b8bf0cf91c032f" + integrity sha512-LeSfP9bNZH2UOZgcGcZ0PIHUt1ZuHub1L3CVmEyqLxCeDLm4C5Gi8jRH8ZX2PNpDhQCo0z6y/+DIs2JlliXW8w== dependencies: core-js "^2.6.5" - regenerator-runtime "^0.13.2" + regenerator-runtime "^0.13.4" "@babel/preset-env@^7.0.0", "@babel/preset-env@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.8.4.tgz#9dac6df5f423015d3d49b6e9e5fa3413e4a72c4e" - integrity sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w== + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8" + integrity sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ== dependencies: - "@babel/compat-data" "^7.8.4" - "@babel/helper-compilation-targets" "^7.8.4" + "@babel/compat-data" "^7.9.0" + "@babel/helper-compilation-targets" "^7.8.7" "@babel/helper-module-imports" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-proposal-async-generator-functions" "^7.8.3" "@babel/plugin-proposal-dynamic-import" "^7.8.3" "@babel/plugin-proposal-json-strings" "^7.8.3" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-proposal-object-rest-spread" "^7.8.3" + "@babel/plugin-proposal-numeric-separator" "^7.8.3" + "@babel/plugin-proposal-object-rest-spread" "^7.9.0" "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" - "@babel/plugin-proposal-optional-chaining" "^7.8.3" + "@babel/plugin-proposal-optional-chaining" "^7.9.0" "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" "@babel/plugin-syntax-async-generators" "^7.8.0" "@babel/plugin-syntax-dynamic-import" "^7.8.0" "@babel/plugin-syntax-json-strings" "^7.8.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.8.0" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" "@babel/plugin-syntax-optional-chaining" "^7.8.0" @@ -879,26 +755,26 @@ "@babel/plugin-transform-async-to-generator" "^7.8.3" "@babel/plugin-transform-block-scoped-functions" "^7.8.3" "@babel/plugin-transform-block-scoping" "^7.8.3" - "@babel/plugin-transform-classes" "^7.8.3" + "@babel/plugin-transform-classes" "^7.9.0" "@babel/plugin-transform-computed-properties" "^7.8.3" "@babel/plugin-transform-destructuring" "^7.8.3" "@babel/plugin-transform-dotall-regex" "^7.8.3" "@babel/plugin-transform-duplicate-keys" "^7.8.3" "@babel/plugin-transform-exponentiation-operator" "^7.8.3" - "@babel/plugin-transform-for-of" "^7.8.4" + "@babel/plugin-transform-for-of" "^7.9.0" "@babel/plugin-transform-function-name" "^7.8.3" "@babel/plugin-transform-literals" "^7.8.3" "@babel/plugin-transform-member-expression-literals" "^7.8.3" - "@babel/plugin-transform-modules-amd" "^7.8.3" - "@babel/plugin-transform-modules-commonjs" "^7.8.3" - "@babel/plugin-transform-modules-systemjs" "^7.8.3" - "@babel/plugin-transform-modules-umd" "^7.8.3" + "@babel/plugin-transform-modules-amd" "^7.9.0" + "@babel/plugin-transform-modules-commonjs" "^7.9.0" + "@babel/plugin-transform-modules-systemjs" "^7.9.0" + "@babel/plugin-transform-modules-umd" "^7.9.0" "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" "@babel/plugin-transform-new-target" "^7.8.3" "@babel/plugin-transform-object-super" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.8.4" + "@babel/plugin-transform-parameters" "^7.8.7" "@babel/plugin-transform-property-literals" "^7.8.3" - "@babel/plugin-transform-regenerator" "^7.8.3" + "@babel/plugin-transform-regenerator" "^7.8.7" "@babel/plugin-transform-reserved-words" "^7.8.3" "@babel/plugin-transform-shorthand-properties" "^7.8.3" "@babel/plugin-transform-spread" "^7.8.3" @@ -906,83 +782,62 @@ "@babel/plugin-transform-template-literals" "^7.8.3" "@babel/plugin-transform-typeof-symbol" "^7.8.4" "@babel/plugin-transform-unicode-regex" "^7.8.3" - "@babel/types" "^7.8.3" - browserslist "^4.8.5" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.9.0" + browserslist "^4.9.1" core-js-compat "^3.6.2" invariant "^2.2.2" levenary "^1.1.1" semver "^5.5.0" -"@babel/runtime@^7.2.0", "@babel/runtime@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.4.tgz#d79f5a2040f7caa24d53e563aad49cbc05581308" - integrity sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ== +"@babel/preset-modules@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" + integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== dependencies: - regenerator-runtime "^0.13.2" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" -"@babel/template@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b" - integrity sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw== +"@babel/runtime@^7.2.0", "@babel/runtime@^7.8.4": + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" + integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q== dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.7.4" - "@babel/types" "^7.7.4" + regenerator-runtime "^0.13.4" -"@babel/template@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.3.tgz#e02ad04fe262a657809327f578056ca15fd4d1b8" - integrity sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ== +"@babel/template@^7.8.3", "@babel/template@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" + integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== dependencies: "@babel/code-frame" "^7.8.3" - "@babel/parser" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/parser" "^7.8.6" + "@babel/types" "^7.8.6" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.2.4", "@babel/traverse@^7.3.4", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.4.tgz#9c1e7c60fb679fe4fcfaa42500833333c2058558" - integrity sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.7.4" - "@babel/helper-function-name" "^7.7.4" - "@babel/helper-split-export-declaration" "^7.7.4" - "@babel/parser" "^7.7.4" - "@babel/types" "^7.7.4" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - -"@babel/traverse@^7.8.3", "@babel/traverse@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.4.tgz#f0845822365f9d5b0e312ed3959d3f827f869e3c" - integrity sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg== +"@babel/traverse@^7.1.6", "@babel/traverse@^7.2.4", "@babel/traverse@^7.3.4", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892" + integrity sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w== dependencies: "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.4" + "@babel/generator" "^7.9.0" "@babel/helper-function-name" "^7.8.3" "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.8.4" - "@babel/types" "^7.8.3" + "@babel/parser" "^7.9.0" + "@babel/types" "^7.9.0" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.1.6", "@babel/types@^7.3.2", "@babel/types@^7.3.4", "@babel/types@^7.4.0", "@babel/types@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" - integrity sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA== +"@babel/types@^7.1.6", "@babel/types@^7.3.2", "@babel/types@^7.3.4", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5" + integrity sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng== dependencies: - esutils "^2.0.2" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@babel/types@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" - integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== - dependencies: - esutils "^2.0.2" + "@babel/helper-validator-identifier" "^7.9.0" lodash "^4.17.13" to-fast-properties "^2.0.0" @@ -1016,6 +871,36 @@ rsvp "^4.8.5" silent-error "^1.1.1" +"@ember-data/-build-infra@3.14.1": + version "3.14.1" + resolved "https://registry.yarnpkg.com/@ember-data/-build-infra/-/-build-infra-3.14.1.tgz#1526a6f5315aa23bc0ea76dfe0ba17318ae11257" + integrity sha512-A8l1SSry6bD4aVgm/ZUUbZJpI6PR0QHdbds+zf2mhcudR8/L/ruT0ooe/oLUds7bo+bbHr2K1ugHs2GbDi1rUg== + dependencies: + "@babel/plugin-transform-block-scoping" "^7.6.2" + "@ember-data/canary-features" "3.14.1" + "@ember/edition-utils" "^1.1.1" + babel-plugin-debug-macros "^0.3.3" + babel-plugin-feature-flags "^0.3.1" + babel-plugin-filter-imports "^3.0.0" + babel6-plugin-strip-class-callcheck "^6.0.0" + broccoli-debug "^0.6.5" + broccoli-file-creator "^2.1.1" + broccoli-funnel "^2.0.2" + broccoli-merge-trees "^3.0.2" + broccoli-rollup "^4.1.1" + calculate-cache-key-for-tree "^2.0.0" + chalk "^2.4.1" + ember-cli-path-utils "^1.0.0" + ember-cli-string-utils "^1.1.0" + ember-cli-version-checker "^3.1.2" + esm "^3.2.25" + git-repo-info "^2.0.0" + glob "^7.1.4" + npm-git-info "^1.0.3" + rimraf "^3.0.0" + rsvp "^4.8.5" + silent-error "^1.1.1" + "@ember-data/adapter@3.14.0": version "3.14.0" resolved "https://registry.yarnpkg.com/@ember-data/adapter/-/adapter-3.14.0.tgz#88900b0f77c042079683058c7a291103171fff67" @@ -1027,6 +912,17 @@ ember-cli-test-info "^1.0.0" ember-cli-typescript "^3.0.0" +"@ember-data/adapter@3.14.1": + version "3.14.1" + resolved "https://registry.yarnpkg.com/@ember-data/adapter/-/adapter-3.14.1.tgz#bbb2c2f8c8bdb3d93b50f2cc12c413ab4b18197c" + integrity sha512-xz9Z0tWlU9706V5zCbNAeXhaRZVdyJfdeUamdpAiX2T/RDE3m64bXeH4jOlyYAdWtgr0Yg3B8KF/hDUZuu3Kgw== + dependencies: + "@ember-data/-build-infra" "3.14.1" + "@ember/edition-utils" "^1.1.1" + ember-cli-babel "^7.11.1" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^3.0.0" + "@ember-data/canary-features@3.14.0": version "3.14.0" resolved "https://registry.yarnpkg.com/@ember-data/canary-features/-/canary-features-3.14.0.tgz#0474ebcbf0102b3e705a6312c50fb933447b7462" @@ -1034,6 +930,13 @@ dependencies: ember-cli-babel "^7.11.1" +"@ember-data/canary-features@3.14.1": + version "3.14.1" + resolved "https://registry.yarnpkg.com/@ember-data/canary-features/-/canary-features-3.14.1.tgz#8bad8b76661644f00c33ba881ea62ce59e9afa84" + integrity sha512-l2XC+ymgv6ipvGo0MZGUdmFbKYkOfybfoH9FkxM/XwvwdbxUqBpUKtVvzHLm3PFgJhV1UIub5M69spsctBK/Ng== + dependencies: + ember-cli-babel "^7.11.1" + "@ember-data/model@3.14.0": version "3.14.0" resolved "https://registry.yarnpkg.com/@ember-data/model/-/model-3.14.0.tgz#6c4a60143837355f0d124404ef256270b841788e" @@ -1050,6 +953,22 @@ ember-compatibility-helpers "^1.2.0" inflection "1.12.0" +"@ember-data/model@3.14.1": + version "3.14.1" + resolved "https://registry.yarnpkg.com/@ember-data/model/-/model-3.14.1.tgz#026a84ebea06aff42e86c20b84b4253f72715012" + integrity sha512-IAD2MktqvvF0GSNmqtuW7cETQsemdnb5awAu41paLhtaEurqbeL3P9u7UDuTc9pw3nPa9xDY35wyEBmQZ//sSQ== + dependencies: + "@ember-data/-build-infra" "3.14.1" + "@ember-data/canary-features" "3.14.1" + "@ember-data/store" "3.14.1" + "@ember/edition-utils" "^1.1.1" + ember-cli-babel "^7.11.1" + ember-cli-string-utils "^1.1.0" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^3.0.0" + ember-compatibility-helpers "^1.2.0" + inflection "1.12.0" + "@ember-data/rfc395-data@^0.0.4": version "0.0.4" resolved "https://registry.yarnpkg.com/@ember-data/rfc395-data/-/rfc395-data-0.0.4.tgz#ecb86efdf5d7733a76ff14ea651a1b0ed1f8a843" @@ -1066,6 +985,17 @@ ember-cli-test-info "^1.0.0" ember-cli-typescript "^3.0.0" +"@ember-data/serializer@3.14.1": + version "3.14.1" + resolved "https://registry.yarnpkg.com/@ember-data/serializer/-/serializer-3.14.1.tgz#8ce14c68502503f663fbed76dbfd61d965d9a63f" + integrity sha512-DY2iU7vTnsiE5706rsifICV/W5DwTcLkAsuUZoqgXEMVevNtdwuTX+1H9zZ0/cmObnd5dCFjNhC8A8/yYMDmuw== + dependencies: + "@ember-data/-build-infra" "3.14.1" + "@ember-data/store" "3.14.1" + ember-cli-babel "^7.11.1" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^3.0.0" + "@ember-data/store@3.14.0": version "3.14.0" resolved "https://registry.yarnpkg.com/@ember-data/store/-/store-3.14.0.tgz#0b1fa76d5d5bed17226e0dfbdba57084bf2579f1" @@ -1080,6 +1010,20 @@ ember-cli-typescript "^3.0.0" heimdalljs "^0.3.0" +"@ember-data/store@3.14.1": + version "3.14.1" + resolved "https://registry.yarnpkg.com/@ember-data/store/-/store-3.14.1.tgz#c85fa0e782ef2c794e4018c3f0e9d54ac095f384" + integrity sha512-+M6mddGQUXaPEFuoFMLL5GxOOekScglws+fuBLV4NuZ0N9h4dnC8Oga04zaSq72+40zW/ZqMQsLZwPJTWLTEXw== + dependencies: + "@ember-data/-build-infra" "3.14.1" + "@ember-data/adapter" "3.14.1" + "@ember-data/canary-features" "3.14.1" + "@ember/ordered-set" "^2.0.3" + ember-cli-babel "^7.11.1" + ember-cli-path-utils "^1.0.0" + ember-cli-typescript "^3.0.0" + heimdalljs "^0.3.0" + "@ember/edition-utils@^1.1.1", "@ember/edition-utils@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@ember/edition-utils/-/edition-utils-1.2.0.tgz#a039f542dc14c8e8299c81cd5abba95e2459cfa6" @@ -1174,6 +1118,11 @@ resolve "^1.8.1" semver "^5.6.0" +"@glimmer/di@^0.2.0": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@glimmer/di/-/di-0.2.1.tgz#5286b6b32040232b751138f6d006130c728d4b3d" + integrity sha512-0D53YVuEgGdHfTl9LGWDZqVzGhn4cT0CXqyAuOYkKFLvqboJXz6SnkRhQNPhhA2hLVrPnvUz3+choQmPhHLGGQ== + "@glimmer/env@^0.1.7": version "0.1.7" resolved "https://registry.yarnpkg.com/@glimmer/env/-/env-0.1.7.tgz#fd2d2b55a9029c6b37a6c935e8c8871ae70dfa07" @@ -1184,6 +1133,13 @@ resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.42.2.tgz#9cf8d6f8f5eee6bfcfa36919ca68ae716e1f78db" integrity sha512-7LOuQd02cxxNNHChzdHMAU8/qOeQvTro141CU5tXITP7z6aOv2D2gkFdau97lLQiVxezGrh8J7h8GCuF7TEqtg== +"@glimmer/resolver@^0.4.1": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@glimmer/resolver/-/resolver-0.4.3.tgz#b1baae5c3291b4621002ccf8d7870466097e841d" + integrity sha512-UhX6vlZbWRMq6pCquSC3wfWLM9kO0PhQPD1dZ3XnyZkmsvEE94Cq+EncA9JalUuevKoJrfUFRvrZ0xaz+yar3g== + dependencies: + "@glimmer/di" "^0.2.0" + "@glimmer/syntax@^0.42.2": version "0.42.2" resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.42.2.tgz#89bb3cb787285b84665dc0d8907d94b008e5be9a" @@ -1456,6 +1412,27 @@ resolved "https://registry.yarnpkg.com/@miragejs/pretender-node-polyfill/-/pretender-node-polyfill-0.1.2.tgz#d26b6b7483fb70cd62189d05c95d2f67153e43f2" integrity sha512-M/BexG/p05C5lFfMunxo/QcgIJnMT2vDVCd00wNqK2ImZONIlEETZwWJu1QtLxtmYlSHlCFl3JNzp0tLe7OJ5g== +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== + dependencies: + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + dependencies: + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" + "@simple-dom/document@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@simple-dom/document/-/document-1.4.0.tgz#af60855f957f284d436983798ef1006cca1a1678" @@ -1562,9 +1539,9 @@ "@types/jquery" "*" "@types/ember__controller@*": - version "3.0.6" - resolved "https://registry.yarnpkg.com/@types/ember__controller/-/ember__controller-3.0.6.tgz#dbfbc1480a4584efb719746b3562636398bf6261" - integrity sha512-flwfLteYs8/kSo759PYMEvKESbANIdUHhj05Gxv1aEvqQnpzNiGYTol32USO6XWi13Ui7MyxdFiWS06dj9NwMQ== + version "3.0.7" + resolved "https://registry.yarnpkg.com/@types/ember__controller/-/ember__controller-3.0.7.tgz#ae1e897c38d5764e1263d8a9af34286c16b990f6" + integrity sha512-n1ud2QlX0HQ5XkZvpf3yefth3slvBuAFgCiKeu6ypUXnnW2VjJaO+cgCftBBqak6BGWAoziGPrPvAt/1ayx6cA== dependencies: "@types/ember__object" "*" @@ -1591,9 +1568,9 @@ integrity sha512-P1+YLJJ9xzc8w5mKYtXsrS070MOTjsNeoGoEHnj7nO5IfeyC34yTHdceW9hoBMRLZs2tZ+cjElUNdR1kxpl+oA== "@types/ember__object@*": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@types/ember__object/-/ember__object-3.1.1.tgz#ea0a8313fc80ac5af4826190da3e688d72f02d58" - integrity sha512-VQk38Dqiz0fVNt4RIrxyIanDqCFYDZB6QPHzdMjnjQSGeEHh130B+lFECtNQrO1V9czXzm588qpIBdPp9N2H9g== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@types/ember__object/-/ember__object-3.1.2.tgz#0237a6709b744a23e11a99ac2294df4e122b2c72" + integrity sha512-rFga/FKPedJzwEncNEFOKQHQQ4nC848QRuBhK+jc1w2QQs0IdcQdn/4gQvtHoLKA6PTALujXakiCX/cXdefGnQ== dependencies: "@types/ember__object" "*" "@types/rsvp" "*" @@ -1604,9 +1581,9 @@ integrity sha512-jNp+88chKEeJB/QdqWKApl5bKDf8AXP38WodrhecHlLnZh7AWTHqSV9wZNXReKZAOaPeYibs6J1oEE5baQt4Tg== "@types/ember__routing@*": - version "3.0.10" - resolved "https://registry.yarnpkg.com/@types/ember__routing/-/ember__routing-3.0.10.tgz#1421372cd3d4223ae6f58f05e00df041ac7039b6" - integrity sha512-2uEVqmskaStUZIPMEk/9ZRQjrik1U3nPV6ZVKoCZDWkRO7eduB/j8X3d7Kag0LFMapz42XFIUQ0sfzCNg9nVNA== + version "3.0.12" + resolved "https://registry.yarnpkg.com/@types/ember__routing/-/ember__routing-3.0.12.tgz#4a42e5c0276e2eea2665ac08a890991efdc1c09d" + integrity sha512-uguCrJdycNJtLrdgiu3bfqpcQ4dhCCrS7wB5CyTAvy0SNcqfRBxGOlPUBzgljxPYCtQ1kIqJpmoPorG56hTi0A== dependencies: "@types/ember__component" "*" "@types/ember__controller" "*" @@ -1652,7 +1629,12 @@ resolved "https://registry.yarnpkg.com/@types/ember__utils/-/ember__utils-3.0.3.tgz#c7bfe0ea89411f3376965a1214028561fdcd24eb" integrity sha512-GhXlUsGln/7PzLMqmtplqLSG8IWu2F9AjEKlqds/BrZlQtbMVS3MCvIkH1R8xlatYml02PqIdd9rZLi7r6QS6Q== -"@types/estree@*", "@types/estree@0.0.39": +"@types/estree@*": + version "0.0.44" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.44.tgz#980cc5a29a3ef3bea6ff1f7d021047d7ea575e21" + integrity sha512-iaIVzr+w2ZJ5HkidlZ3EJM8VTZb2MJLCjw3V+505yVts0gRC4UMvjw0d1HPtGqI/HQC/KdsYtayfzl+AXY2R8g== + +"@types/estree@0.0.39": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== @@ -1669,7 +1651,7 @@ dependencies: "@types/node" "*" -"@types/glob@*": +"@types/glob@*", "@types/glob@^7.1.1": version "7.1.1" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== @@ -1684,9 +1666,9 @@ integrity sha512-sVD2e6QAAHW0Y6Btse+tTA9k9g0iKm87wjxRsgZRU5EwSooz80tenbV+fA+f2BI2g0G2CqxsS1rIlwQCtPRQow== "@types/jquery@*": - version "3.3.31" - resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.3.31.tgz#27c706e4bf488474e1cb54a71d8303f37c93451b" - integrity sha512-Lz4BAJihoFw5nRzKvg4nawXPzutkv7wmfQ5121avptaSIXlDNJCUuxZxX/G+9EVidZGuO0UBlk+YjKbwRKJigg== + version "3.3.34" + resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.3.34.tgz#0d3b94057063d3854adaeb579652048fec07ba6c" + integrity sha512-lW9vsVL53Xu/Nj4gi2hNmHGc4u3KKghjqTkAlO0kF5GIOPxbqqnQpgqJBzmn3yXLrPqHb6cmNJ6URnS23Vtvbg== dependencies: "@types/sizzle" "*" @@ -1696,9 +1678,9 @@ integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== "@types/node@*": - version "12.12.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.12.tgz#529bc3e73dbb35dd9e90b0a1c83606a9d3264bdb" - integrity sha512-MGuvYJrPU0HUwqF7LqvIj50RZUX23Z+m583KBygKYUZLlZ88n6w28XRNJRJgsHukLEnLz6w6SvxZoLgbr5wLqQ== + version "12.12.31" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.31.tgz#d6b4f9645fee17f11319b508fb1001797425da51" + integrity sha512-T+wnJno8uh27G9c+1T+a1/WYCHzLeDqtsGJkoEdSp2X8RTh3oOCZQcUnjAx90CS8cmmADX51O0FI/tu9s0yssg== "@types/node@^9.6.0": version "9.6.55" @@ -1711,9 +1693,9 @@ integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== "@types/rimraf@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.3.tgz#0199a46af106729ba14213fda7b981278d8c84f2" - integrity sha512-dZfyfL/u9l/oi984hEXdmAjX3JHry7TLWw43u1HQ8HhPv6KtfxnrZ3T/bleJ0GEvnk9t5sM7eePkgMqz3yBcGg== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.4.tgz#403887b0b53c6100a6c35d2ab24f6ccc042fec46" + integrity sha512-8gBudvllD2A/c0CcEX/BivIDorHFt5UI5m46TsNj8DjWCCTTZT74kEe4g+QsY7P/B9WdO98d82zZgXO/RQzu2Q== dependencies: "@types/glob" "*" "@types/node" "*" @@ -1937,34 +1919,48 @@ acorn-globals@^4.3.0, acorn-globals@^4.3.2: acorn-walk "^6.0.1" acorn-jsx@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" - integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== + version "5.2.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" + integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== + +acorn-node@^1.6.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" acorn-walk@^6.0.1: version "6.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== +acorn-walk@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e" + integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ== + acorn@^2.1.0, acorn@^2.4.0: version "2.7.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7" integrity sha1-q259nYhqrKiwhbwzEreaGYQz8Oc= acorn@^5.0.0, acorn@^5.5.3, acorn@^5.6.2: - version "5.7.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" - integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + version "5.7.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== acorn@^6.0.1, acorn@^6.0.2, acorn@^6.0.7: - version "6.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e" - integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA== + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== -acorn@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" - integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== +acorn@^7.0.0, acorn@^7.1.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" + integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== after@0.8.2: version "0.8.2" @@ -1976,17 +1972,17 @@ ajv-errors@^1.0.0: resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== -ajv-keywords@^3.1.0: +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== -ajv@^6.1.0, ajv@^6.10.2, ajv@^6.5.5, ajv@^6.9.1: - version "6.10.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" - integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== +ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5, ajv@^6.9.1: + version "6.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" + integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== dependencies: - fast-deep-equal "^2.0.1" + fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" @@ -2022,11 +2018,11 @@ ansi-escapes@^3.2.0: integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== ansi-escapes@^4.2.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d" - integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg== + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== dependencies: - type-fest "^0.8.1" + type-fest "^0.11.0" ansi-html@^0.0.7: version "0.0.7" @@ -2066,17 +2062,17 @@ ansi-styles@^3.0.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1: color-convert "^1.9.0" ansi-styles@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.0.tgz#5681f0dcf7ae5880a7841d8831c4724ed9cc0172" - integrity sha512-7kFQgnEaMdRtwf6uSfUnVr9gSGC7faurn+J/Mv90/W+iTtN0405/nLdopfMWwchyxhbGYl6TC4Sccn9TUkGAgg== + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== dependencies: "@types/color-name" "^1.1.1" color-convert "^2.0.1" ansi-to-html@^0.6.6: - version "0.6.13" - resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.13.tgz#c72eae8b63e5ca0643aab11bfc6e6f2217425833" - integrity sha512-Ys2/umuaTlQvP9DLkaa7UzRKF2FLrfod/hNHXS9QhXCrw7seObG6ksOGmNz3UoK+adwM8L9vQfG7mvaxfJ3Jvw== + version "0.6.14" + resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.14.tgz#65fe6d08bba5dd9db33f44a20aec331e0010dad8" + integrity sha512-7ZslfB1+EnFSDO5Ju+ue5Y6It19DRnZXWv8jrGHgIlPna5Mh4jz7BV5jCbQneXNFurQcKoolaaAjHtgSBfOIuA== dependencies: entities "^1.1.2" @@ -2189,6 +2185,11 @@ array-to-sentence@^1.1.0: resolved "https://registry.yarnpkg.com/array-to-sentence/-/array-to-sentence-1.1.0.tgz#c804956dafa53232495b205a9452753a258d39fc" integrity sha1-yASVba+lMjJJWyBalFJ1OiWNOfw= +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -2281,7 +2282,7 @@ async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== -async-limiter@^1.0.0, async-limiter@~1.0.0: +async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== @@ -2316,7 +2317,7 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -atob@^2.1.1: +atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== @@ -2334,17 +2335,17 @@ autoprefixer@^7.0.0: postcss-value-parser "^3.2.3" autoprefixer@^9.4.5: - version "9.7.3" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.3.tgz#fd42ed03f53de9beb4ca0d61fb4f7268a9bb50b4" - integrity sha512-8T5Y1C5Iyj6PgkPSFd0ODvK9DIleuPKUPYniNxybS47g2k2wFgLZ46lGQHlBuGKIAEV8fbCDfKCCRS1tvOgc3Q== + version "9.7.5" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.5.tgz#8df10b9ff9b5814a8d411a5cfbab9c793c392376" + integrity sha512-URo6Zvt7VYifomeAfJlMFnYDhow1rk2bufwkbamPEAtQFcL11moLk4PnR7n9vlu7M+BkXAZkHFA0mIcY7tjQFg== dependencies: - browserslist "^4.8.0" - caniuse-lite "^1.0.30001012" + browserslist "^4.11.0" + caniuse-lite "^1.0.30001036" chalk "^2.4.2" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^7.0.23" - postcss-value-parser "^4.0.2" + postcss "^7.0.27" + postcss-value-parser "^4.0.3" aws-sign2@~0.5.0: version "0.5.0" @@ -2357,9 +2358,9 @@ aws-sign2@~0.7.0: integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" - integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + version "1.9.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" + integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== babel-code-frame@^6.26.0: version "6.26.0" @@ -2396,14 +2397,14 @@ babel-core@^6.26.0, babel-core@^6.26.3: source-map "^0.5.7" babel-eslint@^10.0.3: - version "10.0.3" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.3.tgz#81a2c669be0f205e19462fed2482d33e4687a88a" - integrity sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA== + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" eslint-visitor-keys "^1.0.0" resolve "^1.12.0" @@ -2549,14 +2550,15 @@ babel-helpers@^6.24.1: babel-template "^6.24.1" babel-loader@^8.0.6: - version "8.0.6" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" - integrity sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw== + version "8.1.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" + integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== dependencies: - find-cache-dir "^2.0.0" - loader-utils "^1.0.2" - mkdirp "^0.5.1" + find-cache-dir "^2.1.0" + loader-utils "^1.4.0" + mkdirp "^0.5.3" pify "^4.0.1" + schema-utils "^2.6.5" babel-messages@^6.23.0: version "6.23.0" @@ -3059,7 +3061,7 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" -basic-auth@~2.0.0: +basic-auth@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== @@ -3105,6 +3107,13 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.2.0.tgz#e7c6ba82d4f5f5758c26078fe8eea28881233311" integrity sha512-bHhs98rj/7i/RZpCSJ3uk55pLXOItjIrh2sRQZSM6OoktScX+LxJzvlU+FELp9j3TdcddTmmYArLSGptCTwjuw== +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + blank-object@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/blank-object/-/blank-object-1.0.2.tgz#f990793fbe9a8c8dd013fb3219420bec81d5f4b9" @@ -3116,9 +3125,9 @@ blob@0.0.5: integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== bluebird@^3.1.1, bluebird@^3.4.6, bluebird@^3.5.5: - version "3.7.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.1.tgz#df70e302b471d7473489acf26a93d63b53f874de" - integrity sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg== + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== bmp-js@0.0.1: version "0.0.1" @@ -3226,7 +3235,7 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" -braces@~3.0.2: +braces@^3.0.1, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -3518,6 +3527,22 @@ broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1, broccoli-funnel@^2.0.2: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" +broccoli-funnel@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.2.tgz#25e1c9a512b3852d3c9dde19ebdf07880d619c73" + integrity sha512-yRa7f0H/BtfqXNmL4eCYtAiVAQASI5b83//17MxAYp3I+w8XzGY8Tc3mwhdUrAgh6Zhb6LZwgvUZDZPTLmkK7w== + dependencies: + array-equal "^1.0.0" + blank-object "^1.0.1" + broccoli-plugin "^4.0.1" + debug "^4.1.1" + fast-ordered-set "^1.0.0" + fs-tree-diff "^2.0.1" + heimdalljs "^0.2.0" + minimatch "^3.0.0" + path-posix "^1.0.0" + walk-sync "^2.0.2" + broccoli-kitchen-sink-helpers@^0.2.5: version "0.2.9" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz#a5e0986ed8d76fb5984b68c3f0450d3a96e36ecc" @@ -3628,6 +3653,15 @@ broccoli-output-wrapper@^2.0.0: dependencies: heimdalljs-logger "^0.1.10" +broccoli-output-wrapper@^3.1.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/broccoli-output-wrapper/-/broccoli-output-wrapper-3.2.1.tgz#8f9d1092afe0c1a4b7a1b6f0d2c62f1c403e82ad" + integrity sha512-mhOTy8AyzEsqgefR2ejbv5QTy3dbY2bvDfkARo55Xml52r2MU0CehQu4T/CH6oPcAXkdVYG/hGm9UpV1vU9Ohg== + dependencies: + fs-extra "^8.1.0" + heimdalljs-logger "^0.1.10" + symlink-or-copy "^1.2.0" + broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.2.0, broccoli-persistent-filter@^1.4.3: version "1.4.6" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.6.tgz#80762d19000880a77da33c34373299c0f6a3e615" @@ -3710,6 +3744,19 @@ broccoli-plugin@^2.0.0, broccoli-plugin@^2.1.0: rimraf "^2.3.4" symlink-or-copy "^1.1.8" +broccoli-plugin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-4.0.1.tgz#5a0468a9c8e02f763d5c162ced0a5930db4567a9" + integrity sha512-rBYVtV1rWvlDS8fd+CUUG7L/TO5VUCRjaGm2HEOBaTwUYQKswKJXLRSxwv0CYLo3QfVZJpI1akcn7NGe9kywIQ== + dependencies: + broccoli-node-api "^1.6.0" + broccoli-output-wrapper "^3.1.1" + fs-merger "^3.0.1" + promise-map-series "^0.2.1" + quick-temp "^0.1.3" + rimraf "^3.0.0" + symlink-or-copy "^1.3.0" + broccoli-postcss-single@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/broccoli-postcss-single/-/broccoli-postcss-single-3.0.0.tgz#1393f87b69e4bbf20a1a1e614e09bbf066db28a2" @@ -3722,12 +3769,13 @@ broccoli-postcss-single@^3.0.0: postcss "^7.0.0" broccoli-postcss@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/broccoli-postcss/-/broccoli-postcss-5.0.0.tgz#b4ac48e936b0ce0032e68a5872d54323fcf4744d" - integrity sha512-iJk+meVt0Oe33iaaE0T6z2lxSs349BRD7pz2kk/I6MuSjjWrZSzP/2txmEHQN7LyQGZjbC222MzBgSQj/O8kTw== + version "5.1.0" + resolved "https://registry.yarnpkg.com/broccoli-postcss/-/broccoli-postcss-5.1.0.tgz#5b660fa72ba921b01574b4ab10449b20890bba0a" + integrity sha512-f5cHP5g7EFidu9w88WOLTtbk4dd/W7amK0nek08FkmUII2h4W/Je4EV26HtMEm9nb1hKI301wwuEQ5AQRsVYog== dependencies: - broccoli-funnel "^2.0.1" + broccoli-funnel "^3.0.0" broccoli-persistent-filter "^2.1.0" + minimist ">=1.2.5" object-assign "^4.1.1" postcss "^7.0.5" @@ -3936,10 +3984,10 @@ brorand@^1.0.1: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= -browser-process-hrtime@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" - integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" @@ -4016,34 +4064,17 @@ browserslist@^3.2.6: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" -browserslist@^4.0.0: - version "4.7.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.3.tgz#02341f162b6bcc1e1028e30624815d4924442dc3" - integrity sha512-jWvmhqYpx+9EZm/FxcZSbUZyDEvDTLDi3nSAKbzEkyWvtI0mNSmUosey+5awDW1RUlrgXbQb5A6qY1xQH9U6MQ== - dependencies: - caniuse-lite "^1.0.30001010" - electron-to-chromium "^1.3.306" - node-releases "^1.1.40" - -browserslist@^4.8.0: - version "4.8.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.3.tgz#65802fcd77177c878e015f0e3189f2c4f627ba44" - integrity sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg== +browserslist@^4.0.0, browserslist@^4.11.0, browserslist@^4.8.3, browserslist@^4.9.1: + version "4.11.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.11.0.tgz#aef4357b10a8abda00f97aac7cd587b2082ba1ad" + integrity sha512-WqEC7Yr5wUH5sg6ruR++v2SGOQYpyUdYYd4tZoAq1F7y+QXoLoYGXVbxhtaIqWmAJjtNTRjVD3HuJc1OXTel2A== dependencies: - caniuse-lite "^1.0.30001017" - electron-to-chromium "^1.3.322" - node-releases "^1.1.44" + caniuse-lite "^1.0.30001035" + electron-to-chromium "^1.3.380" + node-releases "^1.1.52" + pkg-up "^3.1.0" -browserslist@^4.8.3, browserslist@^4.8.5: - version "4.8.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.6.tgz#96406f3f5f0755d272e27a66f4163ca821590a7e" - integrity sha512-ZHao85gf0eZ0ESxLfCp73GG9O/VTytYDIkIiZDlURppLTI9wErSM/5yAKEq6rcUdxBLjMELmrYUJGg5sxGKMHg== - dependencies: - caniuse-lite "^1.0.30001023" - electron-to-chromium "^1.3.341" - node-releases "^1.1.47" - -bser@^2.0.0: +bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== @@ -4063,6 +4094,11 @@ buffer-alloc@^1.1.0, buffer-alloc@^1.2.0: buffer-alloc-unsafe "^1.1.0" buffer-fill "^1.0.0" +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + buffer-equal@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" @@ -4093,9 +4129,9 @@ buffer@^4.3.0: isarray "^1.0.0" buffer@^5.2.0: - version "5.4.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.4.3.tgz#3fbc9c69eb713d323e3fc1a895eee0710c072115" - integrity sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A== + version "5.5.0" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.5.0.tgz#9c3caa3d623c33dd1c7ef584b89b88bf9c9bc1ce" + integrity sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww== dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" @@ -4237,20 +4273,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001010: - version "1.0.30001011" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001011.tgz#0d6c4549c78c4a800bb043a83ca0cbe0aee6c6e1" - integrity sha512-h+Eqyn/YA6o6ZTqpS86PyRmNWOs1r54EBDcd2NTwwfsXQ8re1B38SnB+p2RKF8OUsyEIjeDU8XGec1RGO/wYCg== - -caniuse-lite@^1.0.30001012, caniuse-lite@^1.0.30001017: - version "1.0.30001019" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001019.tgz#857e3fccaad2b2feb3f1f6d8a8f62d747ea648e1" - integrity sha512-6ljkLtF1KM5fQ+5ZN0wuyVvvebJxgJPTmScOMaFuQN2QuOzvRJnWSKfzQskQU5IOU4Gap3zasYPIinzwUjoj/g== - -caniuse-lite@^1.0.30001023: - version "1.0.30001023" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001023.tgz#b82155827f3f5009077bdd2df3d8968bcbcc6fc4" - integrity sha512-C5TDMiYG11EOhVOA62W1p3UsJ2z4DsHtMBQtjzp3ZsUglcQn62WOUgW0y795c7A5uZ+GCEIvzkMatLIlAsbNTA== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001036: + version "1.0.30001038" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz#44da3cbca2ab6cb6aa83d1be5d324e17f141caff" + integrity sha512-zii9quPo96XfOiRD4TrfYGs+QsGZpb2cGiMAzPjtf/hpFgB6zCPZgJb7I1+EATeMw/o+lG8FyRAnI+CWStHcaQ== capture-exit@^1.2.0: version "1.2.0" @@ -4370,9 +4396,9 @@ cheerio@^1.0.0-rc.2, cheerio@^1.0.0-rc.3: parse5 "^3.0.1" "chokidar@>=2.0.0 <4.0.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" - integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== + version "3.3.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" + integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -4380,9 +4406,9 @@ cheerio@^1.0.0-rc.2, cheerio@^1.0.0-rc.3: is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.2.0" + readdirp "~3.3.0" optionalDependencies: - fsevents "~2.1.1" + fsevents "~2.1.2" chokidar@^2.0.2: version "2.1.8" @@ -4404,9 +4430,9 @@ chokidar@^2.0.2: fsevents "^1.2.7" chownr@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" - integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== chrome-trace-event@^1.0.0: version "1.0.2" @@ -4514,9 +4540,9 @@ cli-width@^2.0.0: integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= clipboard@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.4.tgz#836dafd66cf0fea5d71ce5d5b0bf6e958009112d" - integrity sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ== + version "2.0.6" + resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.6.tgz#52921296eec0fdf77ead1749421b21c968647376" + integrity sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg== dependencies: good-listener "^1.2.2" select "^1.1.2" @@ -4695,11 +4721,11 @@ component-inherit@0.0.3: integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= compressible@~2.0.16: - version "2.0.17" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.17.tgz#6e8c108a16ad58384a977f3a482ca20bff2f38c1" - integrity sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw== + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== dependencies: - mime-db ">= 1.40.0 < 2" + mime-db ">= 1.43.0 < 2" compression@^1.7.3, compression@^1.7.4: version "1.7.4" @@ -4719,7 +4745,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@1.6.2, concat-stream@^1.4.7, concat-stream@^1.5.0: +concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -4850,9 +4876,9 @@ core-js@2.4.1: integrity sha1-TekR5mew6ukSTjQlS1OupvxhjT4= core-js@^2.4.0, core-js@^2.5.0, core-js@^2.5.7, core-js@^2.6.5: - version "2.6.10" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.10.tgz#8a5b8391f8cc7013da703411ce5b585706300d7f" - integrity sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA== + version "2.6.11" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" + integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== core-object@2.0.6: version "2.0.6" @@ -5081,9 +5107,9 @@ cssstyle@^1.1.1: cssom "0.3.x" cssstyle@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.0.0.tgz#911f0fe25532db4f5d44afc83f89cc4b82c97fe3" - integrity sha512-QXSAu2WBsSRXCPjvI43Y40m6fMevvyRm8JVAuF9ksQz5jha4pWP1wpaK7Yu5oLFc6+XAY+hj8YhefyXcBB53gg== + version "2.2.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.2.0.tgz#e4c44debccd6b7911ed617a4395e5754bba59992" + integrity sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA== dependencies: cssom "~0.3.6" @@ -5223,6 +5249,11 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + delayed-stream@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-0.0.5.tgz#d4b1f43a93e8296dfe02694f4680bc37a313c73f" @@ -5248,6 +5279,11 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= +depd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + des.js@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" @@ -5283,6 +5319,20 @@ detect-libc@^1.0.2: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= +detect-newline@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +detective@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" + integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== + dependencies: + acorn-node "^1.6.1" + defined "^1.0.0" + minimist "^1.1.1" + diff@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" @@ -5297,6 +5347,13 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -5435,20 +5492,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.30, electron-to-chromium@^1.3.306, electron-to-chromium@^1.3.47: - version "1.3.311" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.311.tgz#73baa361e2b1f44b7b4f1a443aaa1372f8074ebb" - integrity sha512-7GH6RKCzziLzJ9ejmbiBEdzHZsc6C3eRpav14dmRfTWMpNgMqpP1ukw/FU/Le2fR+ep642naq7a23xNdmh2s+A== - -electron-to-chromium@^1.3.322: - version "1.3.326" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.326.tgz#71715aca9afd328ea208a3bc4651c15b869f0d1b" - integrity sha512-kaBmGWJlLW5bGEbm7/HWG9jt4oH+uecBIIfzFWfFkgqssPT2I6RDenGqo4wmKzm7seNu7DSCRZBXCuf7w8dtkQ== - -electron-to-chromium@^1.3.341: - version "1.3.344" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.344.tgz#f1397a633c35e726730c24be1084cd25c3ee8148" - integrity sha512-tvbx2Wl8WBR+ym3u492D0L6/jH+8NoQXqe46+QhbWH3voVPauGuZYeb1QAXYoOAWuiP2dbSvlBx0kQ1F3hu/Mw== +electron-to-chromium@^1.3.30, electron-to-chromium@^1.3.380, electron-to-chromium@^1.3.47: + version "1.3.386" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.386.tgz#224f97c808da76014096848f80bb9342b6a95cdb" + integrity sha512-M7JHfp32Bq6Am59AWgglh2d3nqe6y8Y94Vcb/AXUsO3DGvKUHYI5ML9+U5oNShfdOEfurrrjKSoSgFt2mz7mpw== elliptic@^6.0.0: version "6.5.2" @@ -5689,7 +5736,7 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.18.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: version "7.18.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.18.0.tgz#e979b73eee00cd93f63452c6170d045e8832f29c" integrity sha512-OLPfYD8wSfCrmGHcUf8zEfySSvbAL+5Qp2RWLycJIMaBZhg+SncKj5kVkL3cPJR5n2hVHPdfmKTQIYjOYl6FnQ== @@ -5893,9 +5940,9 @@ ember-cli-htmlbars@^3.0.0, ember-cli-htmlbars@^3.0.1: strip-bom "^3.0.0" ember-cli-htmlbars@^4.0.5, ember-cli-htmlbars@^4.0.7: - version "4.2.2" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.2.2.tgz#3db341a0c866b6e16919db071be9592b9702f014" - integrity sha512-xhVYhdbS2H+XNHzSYfOZKRFIpZ8zOrNGMuAc7vJd6oUE8Aad2r5xjncIVQDioPp8sQfUpXt0uvkUZaOll/thXw== + version "4.2.3" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.2.3.tgz#ca1a4ce3806594f0a69a1ada3eed749a125cc2bf" + integrity sha512-AA5N5a7T+9Bc3m+5X076WFYIN4EQL0o/g8acPBZnEolFJhc3TmnSlWay4JwEuvszA1MLFKmZET/VD9CfRw8+EQ== dependencies: "@ember/edition-utils" "^1.2.0" babel-plugin-htmlbars-inline-precompile "^3.0.1" @@ -6068,21 +6115,22 @@ ember-cli-typescript@^2.0.0, ember-cli-typescript@^2.0.2: walk-sync "^1.0.0" ember-cli-typescript@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-3.1.1.tgz#a5a12ebf915e43ded7bf6bb460ecea4b67b0d95b" - integrity sha512-HCjM5EZ29Yh94Jy/M2+MVkS9LdtOoGYtYLIcZ4F7umJaRJM67ku/xCyN/2r+uTeYTNdpJN9+HWx30a6yyAbfRA== + version "3.1.3" + resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-3.1.3.tgz#a2c7ec6a8a5e57c38eb52d83e36d8e18c7071e60" + integrity sha512-bFi15H60L9TLYfn9XUzi+RAP1gTWHFtVdSy9IHvxXHlCvTlFZ+2rfuugr/f8reQLz9gvJccKc5TyRD7v+uhx0Q== dependencies: "@babel/plugin-proposal-nullish-coalescing-operator" "^7.4.4" "@babel/plugin-proposal-optional-chaining" "^7.6.0" - "@babel/plugin-transform-typescript" "~7.7.0" + "@babel/plugin-transform-typescript" "~7.8.0" ansi-to-html "^0.6.6" + broccoli-stew "^3.0.0" debug "^4.0.0" ember-cli-babel-plugin-helpers "^1.0.0" execa "^3.0.0" fs-extra "^8.0.0" resolve "^1.5.0" rsvp "^4.8.1" - semver "^6.0.0" + semver "^6.3.0" stagehand "^1.0.0" walk-sync "^2.0.0" @@ -6279,15 +6327,15 @@ ember-composable-helpers@^3.0.1: resolve "^1.10.0" "ember-concurrency@^0.9.0 || ^0.10.0 || ^1.0.0": - version "1.1.2" - resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-1.1.2.tgz#73de1f3e41b983af531a17596853ed9614c24107" - integrity sha512-GiASMU4GH4yDALR3vbAl6THYXSv+XUzjcF+4uPMgw1VxQmSde/oXTFdz/Z9QMetJ7Hhz7nYQcknWj471Lg9aEg== + version "1.1.6" + resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-1.1.6.tgz#a42806bc2066d556af1c75c7f031abccbf986f8f" + integrity sha512-SjHVtWHfkHpn2cSoZPU1TMpMvzDmS1pIFdi5NEmZnwhVUdQE55TiMp7l0xvoalWzylfFTaf+1PLWl82kw9zC2g== dependencies: ember-cli-babel "^7.7.3" ember-compatibility-helpers "^1.2.0" ember-maybe-import-regenerator "^0.1.6" -"ember-data@2.x - 3.x", ember-data@3.14.0, ember-data@~3.14.0: +"ember-data@2.x - 3.x", ember-data@3.14.0: version "3.14.0" resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.14.0.tgz#e36584722bf84aef21a0541e10f2a3016b75b231" integrity sha512-qmABgVOR/BtQV8mSCskn9EHYewVENGbvMzJfnNZ4EEWVebYQKqy2tAw1DHfiOkCmUk2MpFnJi/UfyH0p4nWhhQ== @@ -6303,6 +6351,23 @@ ember-composable-helpers@^3.0.1: ember-cli-typescript "^3.0.0" ember-inflector "^3.0.1" +ember-data@~3.14.0: + version "3.14.1" + resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.14.1.tgz#fb819ae30498b36ac71634fa221377057a382cf0" + integrity sha512-QQ7ufG5C9YAoktJ6kVV4Da5HfhqZrt84eEWCNyXG0eWgEiquz6/FxCHUbreFgSn2x+vGzncqsL6oQj6hIq9JaQ== + dependencies: + "@ember-data/-build-infra" "3.14.1" + "@ember-data/adapter" "3.14.1" + "@ember-data/model" "3.14.1" + "@ember-data/serializer" "3.14.1" + "@ember-data/store" "3.14.1" + "@ember/edition-utils" "^1.1.1" + "@ember/ordered-set" "^2.0.3" + "@glimmer/env" "^0.1.7" + ember-cli-babel "^7.11.1" + ember-cli-typescript "^3.0.0" + ember-inflector "^3.0.1" + ember-disable-prototype-extensions@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/ember-disable-prototype-extensions/-/ember-disable-prototype-extensions-1.1.3.tgz#1969135217654b5e278f9fe2d9d4e49b5720329e" @@ -6469,16 +6534,17 @@ ember-qunit@^3.5.0: qunit "~2.6.0" ember-resolver@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-6.0.1.tgz#a112c168f8c82810b5336f8f2f6171184ea5641d" - integrity sha512-Q5rrN4CB9fWtXyw0X3eMukuT2uz7ECuZC9M9GOg+9F0O3nEcN+TFKG+WfIdRSKVHvnxP4m0eHTd/vRlG4CbXHw== + version "6.0.2" + resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-6.0.2.tgz#ab05e03e740a7c93a6aa4e8ef29f3eea00cd7934" + integrity sha512-XaaMQ0v85keQgxek6rwyu8P+sYGdU8L2Q/0ehyn1jy6/+qOYyoQ3T8/i9ccarcsDhtxe7qlGzcbfD5pdk28+8Q== dependencies: + "@glimmer/resolver" "^0.4.1" babel-plugin-debug-macros "^0.3.3" broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.0" - ember-cli-babel "^7.13.2" + ember-cli-babel "^7.13.0" ember-cli-version-checker "^3.1.3" - resolve "^1.13.1" + resolve "^1.12.0" ember-responsive@^3.0.5: version "3.0.5" @@ -6532,13 +6598,13 @@ ember-source-channel-url@^2.0.1: got "^8.0.1" ember-source@~3.16.1: - version "3.16.3" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.16.3.tgz#080ded36d6b43ed1ee8e9a13ed4cebf27a50db6a" - integrity sha512-A5IuTBDnxM4zK5IOaoePOchmgaKm4iYuYfQZVsvuPoczm89SBTKuQZnsXFp2ZI8Sc17ALm1Euc9Lc10TNy2KXw== + version "3.16.6" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.16.6.tgz#b3fcfe225dd056012f5de254aa585b8699cab353" + integrity sha512-7X+51YqX1097w0q7j0lpt4fuMPKy7QBYAGfnEvOYirUu12hF07MxPVU449uzlkdrzWfCVDgabamHVlsSrYLX7g== dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/plugin-transform-block-scoping" "^7.6.2" - "@babel/plugin-transform-object-assign" "^7.2.0" + "@babel/helper-module-imports" "^7.8.3" + "@babel/plugin-transform-block-scoping" "^7.8.3" + "@babel/plugin-transform-object-assign" "^7.8.3" "@ember/edition-utils" "^1.2.0" babel-plugin-debug-macros "^0.3.3" babel-plugin-filter-imports "^3.0.0" @@ -6547,7 +6613,7 @@ ember-source@~3.16.1: broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.2" chalk "^2.4.2" - ember-cli-babel "^7.11.0" + ember-cli-babel "^7.18.0" ember-cli-get-component-path-option "^1.0.0" ember-cli-is-package-missing "^1.0.0" ember-cli-normalize-entity-name "^1.0.0" @@ -6651,10 +6717,10 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== encodeurl@~1.0.2: version "1.0.2" @@ -6758,23 +6824,24 @@ error@^7.0.0: dependencies: string-template "~0.2.1" -es-abstract@^1.12.0, es-abstract@^1.5.1: - version "1.16.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.0.tgz#d3a26dc9c3283ac9750dca569586e976d9dcc06d" - integrity sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg== +es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: + version "1.17.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" + integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== dependencies: - es-to-primitive "^1.2.0" + es-to-primitive "^1.2.1" function-bind "^1.1.1" has "^1.0.3" - has-symbols "^1.0.0" - is-callable "^1.1.4" - is-regex "^1.0.4" - object-inspect "^1.6.0" + has-symbols "^1.0.1" + is-callable "^1.1.5" + is-regex "^1.0.5" + object-inspect "^1.7.0" object-keys "^1.1.1" - string.prototype.trimleft "^2.1.0" - string.prototype.trimright "^2.1.0" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" -es-to-primitive@^1.2.0: +es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== @@ -6814,11 +6881,11 @@ escape-string-regexp@^2.0.0: integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== escodegen@^1.11.0, escodegen@^1.11.1, escodegen@^1.6.1: - version "1.12.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541" - integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg== + version "1.14.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" + integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ== dependencies: - esprima "^3.1.3" + esprima "^4.0.1" estraverse "^4.2.0" esutils "^2.0.2" optionator "^0.8.1" @@ -6835,9 +6902,8 @@ esdoc-ecmascript-proposal-plugin@^1.0.0: resolved "https://registry.yarnpkg.com/esdoc-ecmascript-proposal-plugin/-/esdoc-ecmascript-proposal-plugin-1.0.0.tgz#390dc5656ba8a2830e39dba3570d79138df2ffd9" integrity sha1-OQ3FZWuoooMOOdujVw15E43y/9k= -esdoc@pzuraq/esdoc#015a342: +"esdoc@github:pzuraq/esdoc#015a342": version "1.0.4" - uid "015a3426b2e53b2b0270a9c00133780db3f1d144" resolved "https://codeload.github.com/pzuraq/esdoc/tar.gz/015a3426b2e53b2b0270a9c00133780db3f1d144" dependencies: babel-generator "6.26.0" @@ -6853,9 +6919,9 @@ esdoc@pzuraq/esdoc#015a342: taffydb "2.7.2" eslint-plugin-ember@^7.0.0: - version "7.8.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.8.1.tgz#9b2d0526bb6b697f3f18e5c7d3fcf64e447813af" - integrity sha512-74Whm5MHV+llWv0LA/4b4IaLQxMTj5Jc1zoK11gYEPQbPIAviTF4JsRuzPM/x7QMo5pQZyTdfGYF5zVMbgQ2RA== + version "7.11.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.11.1.tgz#d0f0205eab605d5fddaeb706ec6f73b3a71bb971" + integrity sha512-BebVe2jXos+nAU6ptdhxAVFqX6y7ZITjpDS+FhKD33FxtPPzNghJIqg/Yc2NwKCjetrW5zmfHXkIODtq49M1Sg== dependencies: "@ember-data/rfc395-data" "^0.0.4" ember-rfc176-data "^0.3.12" @@ -6964,12 +7030,7 @@ espree@^5.0.1: acorn-jsx "^5.0.0" eslint-visitor-keys "^1.0.0" -esprima@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= - -esprima@^4.0.0, esprima@~4.0.0: +esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -6980,11 +7041,11 @@ esprima@~3.0.0: integrity sha1-U88kes2ncxPlUcOqLnM0LT+099k= esquery@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" - integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + version "1.2.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.2.0.tgz#a010a519c0288f2530b3404124bfb5f02e9797fe" + integrity sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q== dependencies: - estraverse "^4.0.0" + estraverse "^5.0.0" esrecurse@^4.1.0: version "4.2.1" @@ -6993,11 +7054,16 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== +estraverse@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.0.0.tgz#ac81750b482c11cca26e4b07e83ed8f75fbcdc22" + integrity sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A== + estree-walker@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" @@ -7024,9 +7090,9 @@ events-to-array@^1.0.1: integrity sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y= events@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" - integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" + integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" @@ -7241,14 +7307,14 @@ extglob@^2.0.4: to-regex "^3.0.1" extract-zip@^1.6.5: - version "1.6.7" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" - integrity sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k= + version "1.7.0" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" + integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== dependencies: - concat-stream "1.6.2" - debug "2.6.9" - mkdirp "0.5.1" - yauzl "2.4.1" + concat-stream "^1.6.2" + debug "^2.6.9" + mkdirp "^0.5.4" + yauzl "^2.10.0" extsprintf@1.3.0: version "1.3.0" @@ -7270,15 +7336,27 @@ faker@^4.1.0: resolved "https://registry.yarnpkg.com/faker/-/faker-4.1.0.tgz#1e45bbbecc6774b3c195fad2835109c6d748cc3f" integrity sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8= -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + +fast-glob@^3.0.3: + version "3.2.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.2.tgz#ade1a9d91148965d4bf7c51f72e1ca662d32e63d" + integrity sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@~2.0.6: version "2.0.6" @@ -7337,6 +7415,13 @@ fastboot@^2.0.0, fastboot@^2.0.1: simple-dom "^1.4.0" source-map-support "^0.5.0" +fastq@^1.6.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.6.1.tgz#4570c74f2ded173e71cf0beb08ac70bb85826791" + integrity sha512-mpIH5sKYueh3YyeJwqtVo8sORi0CgtmkVbK6kZStpQlZBYQuTzG2CZ7idSiJuA7bY0SFCWUc5WIs+oYumGCQNw== + dependencies: + reusify "^1.0.4" + favicons@5.3.0, favicons@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/favicons/-/favicons-5.3.0.tgz#ba4f826f147718ccf7e312f6f7ae23881ad1dfa6" @@ -7367,23 +7452,23 @@ faye-websocket@~0.10.0: websocket-driver ">=0.5.1" fb-watchman@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" - integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== dependencies: - bser "^2.0.0" + bser "2.1.1" -fd-slicer@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" - integrity sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU= +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= dependencies: pend "~1.2.0" figgy-pudding@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" - integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== figures@^2.0.0: version "2.0.0" @@ -7393,9 +7478,9 @@ figures@^2.0.0: escape-string-regexp "^1.0.5" figures@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" - integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== dependencies: escape-string-regexp "^1.0.5" @@ -7416,6 +7501,11 @@ file-type@^9.0.0: resolved "https://registry.yarnpkg.com/file-type/-/file-type-9.0.0.tgz#a68d5ad07f486414dfb2c8866f73161946714a18" integrity sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw== +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + file-url@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/file-url/-/file-url-2.0.2.tgz#e951784d79095127d3713029ab063f40818ca2ae" @@ -7469,7 +7559,7 @@ find-babel-config@^1.1.0: json5 "^0.5.1" path-exists "^3.0.0" -find-cache-dir@^2.0.0: +find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== @@ -7543,9 +7633,9 @@ fixturify-project@^1.10.0, fixturify-project@^1.5.3: tmp "^0.0.33" fixturify@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fixturify/-/fixturify-1.2.0.tgz#abe8c52dd27dbbfdb874a02893781c93425663ea" - integrity sha512-b5CMQmBZKsGR6HGqdSrLOGYGHIqrR0CUrcGU/lDL0mYy+DtGm5cnb61Z0UiIUqMVZIoV0CbN+u9/Gwjj+ICg0A== + version "1.3.0" + resolved "https://registry.yarnpkg.com/fixturify/-/fixturify-1.3.0.tgz#163c468093c7c4d90b70cde39fd6325f6528b25d" + integrity sha512-tL0svlOy56pIMMUQ4bU1xRe6NZbFSa/ABTWMxW2mH38lFGc9TrNAKWcMBQ7eIjo3wqSS8f2ICabFaatFyFmrVQ== dependencies: "@types/fs-extra" "^5.0.5" "@types/minimatch" "^3.0.3" @@ -7576,9 +7666,9 @@ flush-write-stream@^1.0.0: readable-stream "^2.3.6" follow-redirects@^1.0.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.9.0.tgz#8d5bcdc65b7108fe1508649c79c12d732dcedb4f" - integrity sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A== + version "1.10.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.10.0.tgz#01f5263aee921c6a54fb91667f08f4155ce169eb" + integrity sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ== dependencies: debug "^3.0.0" @@ -7781,14 +7871,14 @@ fs.realpath@^1.0.0: integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.2.3, fsevents@^1.2.7: - version "1.2.9" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" - integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== + version "1.2.12" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.12.tgz#db7e0d8ec3b0b45724fd4d83d43554a8f1f0de5c" + integrity sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q== dependencies: + bindings "^1.5.0" nan "^2.12.1" - node-pre-gyp "^0.12.0" -fsevents@~2.1.1: +fsevents@~2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== @@ -7886,6 +7976,11 @@ git-fetch-pack@^0.1.1: git-packed-ref-parse "0.0.0" through "~2.2.7" +git-hooks-list@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/git-hooks-list/-/git-hooks-list-1.0.2.tgz#b023b76872f00d81b353efd1458fb4a165035575" + integrity sha512-C3c/FG6Pgh053+yK/CnNNYJo5mgCa3OeI+cPxPIl0tyMLm1mGfiV0NX0LrhnjVoX7dfkR78WyW2kvFVHvAlneg== + git-packed-ref-parse@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/git-packed-ref-parse/-/git-packed-ref-parse-0.0.0.tgz#b85046931f3e4a65679b5de54af3a5d3df372646" @@ -7934,10 +8029,10 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@~5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" - integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== +glob-parent@^5.1.0, glob-parent@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== dependencies: is-glob "^4.0.1" @@ -8002,6 +8097,20 @@ globals@^9.18.0: resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== +globby@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.1.tgz#4782c34cb75dd683351335c5829cc3420e606b22" + integrity sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A== + dependencies: + "@types/glob" "^7.1.1" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.0.3" + glob "^7.1.3" + ignore "^5.1.1" + merge2 "^1.2.3" + slash "^3.0.0" + good-listener@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" @@ -8064,10 +8173,10 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -handlebars@^4.0.11, handlebars@^4.0.13, handlebars@^4.0.4, handlebars@^4.3.1, handlebars@^4.5.3: - version "4.5.3" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.3.tgz#5cf75bd8714f7605713511a56be7c349becb0482" - integrity sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA== +handlebars@^4.0.11, handlebars@^4.0.13, handlebars@^4.0.4, handlebars@^4.3.1: + version "4.7.3" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.3.tgz#8ece2797826886cf8082d1726ff21d2a022550ee" + integrity sha512-SRGwSYuNfx8DwHD/6InAPzD6RgeruWLT+B8e8a7gGs8FWgHzlExpTFMEq2IA6QpAfOClpKHy6+8IqTjeBCu6Kg== dependencies: neo-async "^2.6.0" optimist "^0.6.1" @@ -8080,7 +8189,7 @@ har-schema@^2.0.0: resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= -har-validator@~5.1.0: +har-validator@~5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== @@ -8177,7 +8286,7 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.1, has@^1.0.3: +has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== @@ -8266,11 +8375,9 @@ heimdalljs@^0.3.0: rsvp "~3.2.1" highlight.js@^9.15.10: - version "9.17.1" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.17.1.tgz#14a4eded23fd314b05886758bb906e39dd627f9a" - integrity sha512-TA2/doAur5Ol8+iM3Ov7qy3jYcr/QiJ2eDTdRF4dfbjG7AaaB99J5G+zSl11ljbl6cIcahgPY6SKb3sC3EJ0fw== - dependencies: - handlebars "^4.5.3" + version "9.18.1" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.1.tgz#ed21aa001fe6252bb10a3d76d47573c6539fe13c" + integrity sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg== himalaya@1.1.0: version "1.1.0" @@ -8312,14 +8419,14 @@ homedir-polyfill@^1.0.1: parse-passwd "^1.0.0" hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: - version "2.8.5" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" - integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== hosted-git-info@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.2.tgz#8b7e3bd114b59b51786f8bade0f39ddc80275a97" - integrity sha512-ezZMWtHXm7Eb7Rq4Mwnx2vs79WUx2QmRg3+ZqeGroKzfDO+EprOcgRPYghsOP9JuYBfK18VojmRTGCg8Ma+ktw== + version "3.0.4" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.4.tgz#be4973eb1fd2737b11c9c7c19380739bb249f60d" + integrity sha512-4oT62d2jwSDBbLLFLZE+1vPuQ1h8p9wjrJ8Mqx5TjsyWmBMV5B13eJqn8pvluqubLf3cJPTfiYCIwNwDNmzScQ== dependencies: lru-cache "^5.1.1" @@ -8603,22 +8710,22 @@ inquirer@^6.2.2: through "^2.3.6" inquirer@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.1.tgz#13f7980eedc73c689feff3994b109c4e799c6ebb" - integrity sha512-V1FFQ3TIO15det8PijPLFR9M9baSlnRs9nL7zWu1MNVA2T9YVl9ZbrHJhYs7e9X8jeMZ3lr2JH/rdHFgNCBdYw== + version "7.1.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" + integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== dependencies: ansi-escapes "^4.2.1" - chalk "^2.4.2" + chalk "^3.0.0" cli-cursor "^3.1.0" cli-width "^2.0.0" external-editor "^3.0.3" figures "^3.0.0" lodash "^4.17.15" mute-stream "0.0.8" - run-async "^2.2.0" + run-async "^2.4.0" rxjs "^6.5.3" string-width "^4.1.0" - strip-ansi "^5.1.0" + strip-ansi "^6.0.0" through "^2.3.6" into-stream@^3.1.0: @@ -8651,10 +8758,10 @@ ip-regex@^2.1.0: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= -ipaddr.js@1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" - integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== is-accessor-descriptor@^0.1.6: version "0.1.6" @@ -8694,10 +8801,10 @@ is-buffer@^1.1.5, is-buffer@~1.1.1: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" - integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== +is-callable@^1.1.4, is-callable@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== is-data-descriptor@^0.1.4: version "0.1.4" @@ -8714,9 +8821,9 @@ is-data-descriptor@^1.0.0: kind-of "^6.0.0" is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== is-descriptor@^0.1.0: version "0.1.6" @@ -8754,11 +8861,9 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= - dependencies: - number-is-nan "^1.0.0" + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== is-fullwidth-code-point@^1.0.0: version "1.0.0" @@ -8823,6 +8928,11 @@ is-object@^1.0.1: resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= +is-plain-obj@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + is-plain-obj@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -8852,12 +8962,12 @@ is-reference@^1.1.0: dependencies: "@types/estree" "0.0.39" -is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= +is-regex@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== dependencies: - has "^1.0.1" + has "^1.0.3" is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: version "1.2.0" @@ -9029,9 +9139,9 @@ jpeg-js@^0.2.0: integrity sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII= jpeg-js@^0.3.4: - version "0.3.6" - resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.3.6.tgz#c40382aac9506e7d1f2d856eb02f6c7b2a98b37c" - integrity sha512-MUj2XlMB8kpe+8DJUGH/3UJm4XpI8XEgZQ+CiHDeyrGoKPdW/8FJv6ku+3UiYm5Fz3CWaL+iXmD8Q4Ap6aC1Jw== + version "0.3.7" + resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.3.7.tgz#471a89d06011640592d314158608690172b1028d" + integrity sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ== jquery-deferred@^0.3.0: version "0.3.1" @@ -9193,9 +9303,9 @@ json-api-serializer@^1.11.0: unique-stream "^2.2.1" json-api-serializer@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/json-api-serializer/-/json-api-serializer-2.2.2.tgz#233bf2633b300d62ac15105669b7d2615b3b2443" - integrity sha512-SbP98/T4Mfibi8tnYV6o4ofRZ9nN1QQ5foon5H0w4lIzwXWYRD/Xs3nNbpLbSEPAH6vDzkeRVN2cM5qciGMlug== + version "2.3.0" + resolved "https://registry.yarnpkg.com/json-api-serializer/-/json-api-serializer-2.3.0.tgz#0e9d53e287a21891d4d4893f90b849efccb41001" + integrity sha512-/fZwIPwhQqOaKWWdfgPV26qmjyHVmGlReVx9iDM2+HTevgre9wGXpgjQuuEAGIW7m7HwQbbs5J8e3xidso+kDg== dependencies: "30-seconds-of-code" "^1.2.3" lodash.set "^4.3.2" @@ -9249,12 +9359,12 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" - integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== +json5@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e" + integrity sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ== dependencies: - minimist "^1.2.0" + minimist "^1.2.5" jsonfile@^2.1.0: version "2.4.0" @@ -9322,9 +9432,9 @@ kind-of@^5.0.0: integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== klaw@^1.0.0: version "1.3.1" @@ -9439,13 +9549,13 @@ loader-runner@^2.3.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@^1.0.2, loader-utils@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== +loader-utils@^1.1.0, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== dependencies: big.js "^5.2.2" - emojis-list "^2.0.0" + emojis-list "^3.0.0" json5 "^1.0.1" loader.js@^4.7.0: @@ -10089,6 +10199,11 @@ merge-trees@^2.0.0: fs-updater "^1.0.4" heimdalljs "^0.2.5" +merge2@^1.2.3, merge2@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" + integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== + merge@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" @@ -10118,6 +10233,14 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: snapdragon "^0.8.1" to-regex "^3.0.2" +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -10126,17 +10249,17 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.42.0, "mime-db@>= 1.40.0 < 2": - version "1.42.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.42.0.tgz#3e252907b4c7adb906597b4b65636272cf9e7bac" - integrity sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ== +mime-db@1.43.0, "mime-db@>= 1.43.0 < 2": + version "1.43.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" + integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.25" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.25.tgz#39772d46621f93e2a80a856c53b86a62156a6437" - integrity sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg== + version "2.1.26" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" + integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== dependencies: - mime-db "1.42.0" + mime-db "1.43.0" mime-types@~1.0.1: version "1.0.2" @@ -10197,11 +10320,16 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@1.2.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: +minimist@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +minimist@>=1.2.5, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" @@ -10223,9 +10351,9 @@ minizlib@^1.2.1: minipass "^2.9.0" miragejs@^0.1.31: - version "0.1.32" - resolved "https://registry.yarnpkg.com/miragejs/-/miragejs-0.1.32.tgz#077ed497e928adf2bc85d89550967cd223e4a2a7" - integrity sha512-HVA79I/Ta3H9/uQ60XcsKyeiq9vGUN0JDyaC6XZrGnSBXxj2ZEZurrdkvYNXeYd2cJELD/f3750IjB0lRkXBgA== + version "0.1.35" + resolved "https://registry.yarnpkg.com/miragejs/-/miragejs-0.1.35.tgz#7fb64c03ccdc2495a510ed46033d6ac4ff1fa661" + integrity sha512-JxkOxkWcDkzUiHDKWT+7aVJX0rqJqyIHTB+SSWtwr3k6EY86ETKH1aIe7kpNL3WfM+fCQbV24bcJ1Ei5a8dldQ== dependencies: "@miragejs/pretender-node-polyfill" "^0.1.0" inflected "^2.0.4" @@ -10252,7 +10380,7 @@ miragejs@^0.1.31: lodash.uniq "^4.5.0" lodash.uniqby "^4.7.0" lodash.values "^4.3.0" - pretender "3.1.0" + pretender "3.3.1" mississippi@^3.0.0: version "3.0.0" @@ -10278,7 +10406,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -10290,15 +10418,22 @@ mkdirp@^0.3.5: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" integrity sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc= +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@~0.5.0, mkdirp@~0.5.1: + version "0.5.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.4.tgz#fd01504a6797ec5c9be81ff43d204961ed64a512" + integrity sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw== + dependencies: + minimist "^1.2.5" + mktemp@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/mktemp/-/mktemp-0.4.0.tgz#6d0515611c8a8c84e484aa2000129b98e981ff0b" integrity sha1-bQUVYRyKjITkhKogABKbmOmB/ws= moment-timezone@^0.5.13: - version "0.5.27" - resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.27.tgz#73adec8139b6fe30452e78f210f27b1f346b8877" - integrity sha512-EIKQs7h5sAsjhPCqN6ggx6cEbs94GK050254TIJySD1bzoM5JTYDwAU1IoVOeTOL6Gm27kYJ51/uuvq1kIlrbw== + version "0.5.28" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.28.tgz#f093d789d091ed7b055d82aa81a82467f72e4338" + integrity sha512-TDJkZvAyKIVWg5EtVqRzU97w0Rb0YVbfpqyjgu6GwXCAohVRqwZjf4fOzDE6p1Ch98Sro/8hQQi65WDXW5STPw== dependencies: moment ">= 2.9.0" @@ -10308,15 +10443,15 @@ moment-timezone@^0.5.13: integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== morgan@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59" - integrity sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA== + version "1.10.0" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" + integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== dependencies: - basic-auth "~2.0.0" + basic-auth "~2.0.1" debug "2.6.9" - depd "~1.1.2" + depd "~2.0.0" on-finished "~2.3.0" - on-headers "~1.0.1" + on-headers "~1.0.2" mout@^1.0.0: version "1.2.2" @@ -10351,9 +10486,9 @@ ms@^2.1.1: integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== mustache@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.1.0.tgz#9fba26e7aefc5709f07ff585abb7e0abced6c372" - integrity sha512-3Bxq1R5LBZp7fbFPZzFe5WN4s0q3+gxZaZuZVY+QctYJiCiVgXHOTIC0/HgZuOPFt/6BQcx5u0H2CUOxT/RoGQ== + version "3.2.1" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.2.1.tgz#89e78a9d207d78f2799b1e95764a25bf71a28322" + integrity sha512-RERvMFdLpaFfSRIEe632yDm5nsd0SDKn8hGmcUwswnyiE5mtdZLDybtHAz6hjJhawokF0hXvGLtx9mrQfm6FkA== mute-stream@0.0.6: version "0.0.6" @@ -10407,9 +10542,9 @@ natural-compare@^1.4.0: integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= needle@^2.2.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" - integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== + version "2.3.3" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.3.tgz#a041ad1d04a871b0ebb666f40baaf1fb47867117" + integrity sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw== dependencies: debug "^3.2.6" iconv-lite "^0.4.4" @@ -10500,10 +10635,10 @@ node-notifier@^5.0.1: shellwords "^0.1.1" which "^1.3.0" -node-pre-gyp@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" - integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== +node-pre-gyp@*: + version "0.14.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" + integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" @@ -10514,26 +10649,12 @@ node-pre-gyp@^0.12.0: rc "^1.2.7" rimraf "^2.6.1" semver "^5.3.0" - tar "^4" - -node-releases@^1.1.40: - version "1.1.41" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.41.tgz#57674a82a37f812d18e3b26118aefaf53a00afed" - integrity sha512-+IctMa7wIs8Cfsa8iYzeaLTFwv5Y4r5jZud+4AnfymzeEXKBCavFX0KBgzVaPVqf0ywa6PrO8/b+bPqdwjGBSg== - dependencies: - semver "^6.3.0" - -node-releases@^1.1.44: - version "1.1.44" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.44.tgz#cd66438a6eb875e3eb012b6a12e48d9f4326ffd7" - integrity sha512-NwbdvJyR7nrcGrXvKAvzc5raj/NkoJudkarh2yIpJ4t0NH4aqjUDz/486P+ynIW5eokKOfzGNRdYoLfBlomruw== - dependencies: - semver "^6.3.0" + tar "^4.4.2" -node-releases@^1.1.47: - version "1.1.47" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.47.tgz#c59ef739a1fd7ecbd9f0b7cf5b7871e8a8b591e4" - integrity sha512-k4xjVPx5FpwBUj0Gw7uvFOTF4Ep8Hok1I6qjwL3pLfwe7Y0REQSAqOwwv9TWBCUtMHxcXfY4PgRLRozcChvTcA== +node-releases@^1.1.52: + version "1.1.52" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9" + integrity sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ== dependencies: semver "^6.3.0" @@ -10550,9 +10671,9 @@ nopt@^3.0.6: abbrev "1" nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + version "4.0.3" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" + integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== dependencies: abbrev "1" osenv "^0.1.4" @@ -10599,15 +10720,22 @@ normalize.css@^8.0.1: integrity sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg== npm-bundled@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" - integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== + version "1.1.1" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" + integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== + dependencies: + npm-normalize-package-bin "^1.0.1" npm-git-info@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/npm-git-info/-/npm-git-info-1.0.3.tgz#a933c42ec321e80d3646e0d6e844afe94630e1d5" integrity sha1-qTPELsMh6A02RuDW6ESv6UYw4dU= +npm-normalize-package-bin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + npm-package-arg@^6.1.0: version "6.1.1" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.1.tgz#02168cb0a49a2b75bf988a28698de7b529df5cb7" @@ -10619,12 +10747,13 @@ npm-package-arg@^6.1.0: validate-npm-package-name "^3.0.0" npm-packlist@^1.1.6: - version "1.4.6" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.6.tgz#53ba3ed11f8523079f1457376dd379ee4ea42ff4" - integrity sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg== + version "1.4.8" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" + integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" + npm-normalize-package-bin "^1.0.1" npm-run-path@^2.0.0: version "2.0.2" @@ -10634,9 +10763,9 @@ npm-run-path@^2.0.0: path-key "^2.0.0" npm-run-path@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.0.tgz#d644ec1bd0569187d2a52909971023a0a58e8438" - integrity sha512-8eyAOAH+bYXFPSnNnKr3J+yoybe8O87Is5rtAQ8qRczJz1ajcsjg8l2oZqP+Ppx15Ii3S1vUTjQN2h4YO2tWWQ== + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" @@ -10716,7 +10845,7 @@ object-hash@^1.3.1: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== -object-inspect@^1.6.0: +object-inspect@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== @@ -10743,13 +10872,13 @@ object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.getownpropertydescriptors@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" - integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= +object.getownpropertydescriptors@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.1" + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" object.pick@^1.3.0: version "1.3.0" @@ -10759,12 +10888,12 @@ object.pick@^1.3.0: isobject "^3.0.1" object.values@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" - integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" + integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== dependencies: define-properties "^1.1.3" - es-abstract "^1.12.0" + es-abstract "^1.17.0-next.1" function-bind "^1.1.1" has "^1.0.3" @@ -10780,7 +10909,7 @@ on-finished@~2.3.0: dependencies: ee-first "1.1.1" -on-headers@~1.0.1, on-headers@~1.0.2: +on-headers@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== @@ -10906,9 +11035,9 @@ p-limit@^1.1.0: p-try "^1.0.0" p-limit@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" - integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== + version "2.2.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" + integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== dependencies: p-try "^2.0.0" @@ -10959,9 +11088,9 @@ pad-start@^1.0.2: integrity sha1-I+W6s+lkRrYoFs/28VCXXwQNGxQ= pako@^1.0.5, pako@~1.0.5: - version "1.0.10" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" - integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== parallel-transform@^1.1.0: version "1.2.0" @@ -11172,6 +11301,11 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + pbkdf2@^3.0.3: version "3.0.17" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" @@ -11213,10 +11347,10 @@ phin@^2.9.1: resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c" integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== -picomatch@^2.0.4: - version "2.1.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.1.1.tgz#ecdfbea7704adb5fe6fb47f9866c4c0e15e905c5" - integrity sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA== +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.0.7, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== pify@^2.0.0: version "2.3.0" @@ -11266,6 +11400,13 @@ pkg-up@^2.0.0: dependencies: find-up "^2.1.0" +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + pn@^1.0.0, pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" @@ -11351,10 +11492,10 @@ postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss-value-parser@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz#482282c09a42706d1fc9a069b73f44ec08391dc9" - integrity sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ== +postcss-value-parser@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d" + integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg== postcss@^6.0.1, postcss@^6.0.17, postcss@^6.0.9: version "6.0.23" @@ -11365,19 +11506,10 @@ postcss@^6.0.1, postcss@^6.0.17, postcss@^6.0.9: source-map "^0.6.1" supports-color "^5.4.0" -postcss@^7.0.0, postcss@^7.0.14, postcss@^7.0.6: - version "7.0.23" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.23.tgz#9f9759fad661b15964f3cfc3140f66f1e05eadc1" - integrity sha512-hOlMf3ouRIFXD+j2VJecwssTwbvsPGJVMzupptg+85WA+i7MwyrydmQAgY3R+m0Bc0exunhbJmijy8u8+vufuQ== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - -postcss@^7.0.11, postcss@^7.0.18, postcss@^7.0.21, postcss@^7.0.23, postcss@^7.0.5: - version "7.0.26" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.26.tgz#5ed615cfcab35ba9bbb82414a4fa88ea10429587" - integrity sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA== +postcss@^7.0.0, postcss@^7.0.11, postcss@^7.0.14, postcss@^7.0.18, postcss@^7.0.21, postcss@^7.0.27, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.27" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9" + integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ== dependencies: chalk "^2.4.2" source-map "^0.6.1" @@ -11398,10 +11530,10 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -pretender@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.1.0.tgz#d8d7cc8502a9dbda82346ea399b9c63e7012f584" - integrity sha512-BxCsLXzbD7LsHBF7t8phgDa9EBWxJEYR8YqvYgrwri/YHnm9r6EiDThqHumW5FdxHlk4F10/xT2rv24C929r1Q== +pretender@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.3.1.tgz#74a188b0786601959ee8ffaefc9230d24fa7fa5b" + integrity sha512-fFtl0bfW1ay6zMGqok2Lkhpz8yjm8Pdk+fsQAX+Aeqw0LKZNaDs2VQt8qEKTNWvs5UKVUwNfcuHjVmuG7rZKhQ== dependencies: fake-xml-http-request "^2.1.1" route-recognizer "^0.3.3" @@ -11420,9 +11552,9 @@ pretty-ms@^3.1.0: parse-ms "^1.0.0" printf@^0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/printf/-/printf-0.5.2.tgz#8546e01a1f647b1dff510ae92bdc92beb8c9b2f9" - integrity sha512-Hn0UuWqTRd94HiCJoiCNGZTnSyXJdIF3t4/4I293hezIzyH4pQ3ai4TlH/SmRCiMvR5aNMxSYWshjQWWW6J8MQ== + version "0.5.3" + resolved "https://registry.yarnpkg.com/printf/-/printf-0.5.3.tgz#8b7eec278d886833312238b2bf42b2b6f250880a" + integrity sha512-t3lYN6vPU5PZXDiEZZqoyXvN8wCsBfi8gPoxTKo2e5hhV673t/KUh+mfO8P8lCOCDC/BWcOGIxKyebxc5FuqLA== private@^0.1.6, private@^0.1.8: version "0.1.8" @@ -11474,12 +11606,12 @@ promise-map-series@^0.2.1, promise-map-series@^0.2.3: rsvp "^3.0.14" proxy-addr@~2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" - integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== + version "2.0.6" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" + integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== dependencies: forwarded "~0.1.2" - ipaddr.js "1.9.0" + ipaddr.js "1.9.1" prr@~1.0.1: version "1.0.1" @@ -11491,10 +11623,10 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -psl@^1.1.24, psl@^1.1.28: - version "1.4.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.4.0.tgz#5dd26156cdb69fa1fdb8ab1991667d3f80ced7c2" - integrity sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw== +psl@^1.1.28, psl@^1.1.33: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== public-encrypt@^4.0.0: version "4.0.3" @@ -11543,7 +11675,7 @@ punycode@2.x.x, punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -punycode@^1.2.4, punycode@^1.4.1: +punycode@^1.2.4: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= @@ -11559,9 +11691,9 @@ qs@6.7.0: integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== qs@^6.2.0, qs@^6.4.0: - version "6.9.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.1.tgz#20082c65cb78223635ab1a9eaca8875a29bf8ec9" - integrity sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA== + version "6.9.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e" + integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw== qs@~1.0.0: version "1.0.2" @@ -11693,9 +11825,9 @@ read-pkg@^1.0.0: path-type "^1.0.0" "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -11716,9 +11848,9 @@ readable-stream@1.1: string_decoder "~0.10.x" "readable-stream@2 || 3", readable-stream@^3.1.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" - integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" @@ -11743,17 +11875,17 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" -readdirp@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" - integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== +readdirp@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" + integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== dependencies: - picomatch "^2.0.4" + picomatch "^2.0.7" recast@^0.18.1: - version "0.18.5" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.18.5.tgz#9d5adbc07983a3c8145f3034812374a493e0fe4d" - integrity sha512-sD1WJrpLQAkXGyQZyGzTM75WJvyAd98II5CHdK3IYbt/cZlU0UzCRVU11nUFNXX9fBVEt4E9ajkMjBlUlG+Oog== + version "0.18.7" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.18.7.tgz#56338a6d803c8c3b9113344440dc70d13c8a1ef7" + integrity sha512-qNfoxvMkW4k8jJgNCfmIES7S31MEejXcEQs57eKUcQGiJUuX7cXNOD2h+W9z0rjNun2EkKqf0WvuRtmHw4NPNg== dependencies: ast-types "0.13.2" esprima "~4.0.0" @@ -11783,10 +11915,10 @@ reduce-css-calc@^2.1.6: css-unit-converter "^1.1.1" postcss-value-parser "^3.3.0" -regenerate-unicode-properties@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" - integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== dependencies: regenerate "^1.4.0" @@ -11805,10 +11937,10 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-runtime@^0.13.2: - version "0.13.3" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" - integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== +regenerator-runtime@^0.13.4: + version "0.13.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" + integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== regenerator-runtime@^0.9.5: version "0.9.6" @@ -11824,12 +11956,13 @@ regenerator-transform@^0.10.0: babel-types "^6.19.0" private "^0.1.6" -regenerator-transform@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb" - integrity sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ== +regenerator-transform@^0.14.2: + version "0.14.4" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" + integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw== dependencies: - private "^0.1.6" + "@babel/runtime" "^7.8.4" + private "^0.1.8" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" @@ -11858,17 +11991,17 @@ regexpu-core@^2.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" -regexpu-core@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" - integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== +regexpu-core@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" + integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== dependencies: regenerate "^1.4.0" - regenerate-unicode-properties "^8.1.0" - regjsgen "^0.5.0" - regjsparser "^0.6.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.1.0" + unicode-match-property-value-ecmascript "^1.2.0" registry-auth-token@^3.0.1: version "3.4.0" @@ -11890,7 +12023,7 @@ regjsgen@^0.2.0: resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= -regjsgen@^0.5.0: +regjsgen@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== @@ -11902,10 +12035,10 @@ regjsparser@^0.1.4: dependencies: jsesc "~0.5.0" -regjsparser@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" - integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== +regjsparser@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" + integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== dependencies: jsesc "~0.5.0" @@ -11968,9 +12101,9 @@ request-promise-native@^1.0.5, request-promise-native@^1.0.7: tough-cookie "^2.3.3" request@^2.55.0, request@^2.65.0, request@^2.81.0, request@^2.88.0: - version "2.88.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -11979,7 +12112,7 @@ request@^2.55.0, request@^2.65.0, request@^2.81.0, request@^2.88.0: extend "~3.0.2" forever-agent "~0.6.1" form-data "~2.3.2" - har-validator "~5.1.0" + har-validator "~5.1.3" http-signature "~1.2.0" is-typedarray "~1.0.0" isstream "~0.1.2" @@ -11989,7 +12122,7 @@ request@^2.55.0, request@^2.65.0, request@^2.81.0, request@^2.88.0: performance-now "^2.1.0" qs "~6.5.2" safe-buffer "^5.1.2" - tough-cookie "~2.4.3" + tough-cookie "~2.5.0" tunnel-agent "^0.6.0" uuid "^3.3.2" @@ -12091,10 +12224,10 @@ resolve@1.5.0: dependencies: path-parse "^1.0.5" -resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: - version "1.14.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.0.tgz#6d14c6f9db9f8002071332b600039abf82053f64" - integrity sha512-uviWSi5N67j3t3UKFxej1loCH0VZn5XuqdNxoLShPcYPw6cUZn74K1VRj+9myynRX03bxIBEkwlkob/ujLsJVw== +resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: + version "1.15.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" + integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== dependencies: path-parse "^1.0.6" @@ -12134,6 +12267,11 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + rimraf@2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -12149,9 +12287,9 @@ rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.1, rimraf@^2.4.3, rimraf@^2.4.4, rimra glob "^7.1.3" rimraf@^3.0.0, rimraf@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.1.tgz#48d3d4cb46c80d388ab26cd61b1b466ae9ae225a" - integrity sha512-IQ4ikL8SjBiEDZfk+DFVwqRK8md24RWMEJkdSlgNLkyyAImcjf8SWvU1qFMDOb4igBClbTQ/ugPqXcRwdFTxZw== + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" @@ -12193,9 +12331,9 @@ rollup@^0.57.1: sourcemap-codec "^1.4.1" rollup@^1.12.0: - version "1.27.4" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.27.4.tgz#5bca607a10c99c034288de9f9c756f9fe1a08431" - integrity sha512-UaGNOIax/Ixfd92CAAanUilx2RSkkwEfC1lCTw1eL5Re6NURWgX66ARZt5+3px4kYnpSwzyOot4r18c2b+QgJQ== + version "1.32.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.32.1.tgz#4480e52d9d9e2ae4b46ba0d9ddeaf3163940f9c4" + integrity sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A== dependencies: "@types/estree" "*" "@types/node" "*" @@ -12221,13 +12359,18 @@ rsvp@~3.2.1: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.2.1.tgz#07cb4a5df25add9e826ebc67dcc9fd89db27d84a" integrity sha1-B8tKXfJa3Z6Cbrxn3Mn9idsn2Eo= -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= +run-async@^2.2.0, run-async@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" + integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== dependencies: is-promise "^2.1.0" +run-parallel@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" + integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" @@ -12241,9 +12384,9 @@ rx@^4.1.0: integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= rxjs@^6.4.0, rxjs@^6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" - integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== + version "6.5.4" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" + integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== dependencies: tslib "^1.9.0" @@ -12308,9 +12451,9 @@ sane@^3.0.0: fsevents "^1.2.3" sass@^1.22.10: - version "1.23.7" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.23.7.tgz#090254e006af1219d442f1bff31e139d5e085dff" - integrity sha512-cYgc0fanwIpi0rXisGxl+/wadVQ/HX3RhpdRcjLdj2o2ye/sxUTpAxIhbmJy3PLQgRFbf6Pn8Jsrta2vdXcoOQ== + version "1.26.3" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.26.3.tgz#412df54486143b76b5a65cdf7569e86f44659f46" + integrity sha512-5NMHI1+YFYw4sN3yfKjpLuV9B5l7MqQ6FlkTcC4FT+oHbBRUZoSjHrrt/mE0nFXJyY2kQtU9ou9HxvFVjLFuuw== dependencies: chokidar ">=2.0.0 <4.0.0" @@ -12343,6 +12486,14 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" +schema-utils@^2.6.5: + version "2.6.5" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.5.tgz#c758f0a7e624263073d396e29cd40aa101152d8a" + integrity sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ== + dependencies: + ajv "^6.12.0" + ajv-keywords "^3.4.1" + select@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" @@ -12483,15 +12634,20 @@ simple-dom@^1.4.0: "@simple-dom/void-map" "^1.4.0" simple-html-tokenizer@^0.5.8: - version "0.5.8" - resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.8.tgz#3417382f75954ee34515cc4fd32d9918e693f173" - integrity sha512-0Sq4FvLlQEQODVA6PH2MIrc7tzYO0KT2HzzwvaVLYClWgIsuvaNUOrhrAvTi1pZHrcq7GDB4WiI3ukjqBMxcGQ== + version "0.5.9" + resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.9.tgz#1a83fe97f5a3e39b335fddf71cfe9b0263b581c2" + integrity sha512-w/3FEDN94r4JQ9WoYrIr8RqDIPZdyNkdpbK9glFady1CAEyD97XWCv8HFetQO21w81e7h7Nh59iYTyG1mUJftg== slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + slice-ansi@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" @@ -12547,9 +12703,9 @@ sntp@0.2.x: hoek "0.9.x" socket.io-adapter@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" - integrity sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs= + version "1.1.2" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz#ab3f0d6f66b8fc7fca3959ab5991f82221789be9" + integrity sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g== socket.io-client@2.3.0: version "2.3.0" @@ -12608,19 +12764,22 @@ sort-keys@^2.0.0: dependencies: is-plain-obj "^1.0.0" -sort-object-keys@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.2.tgz#d3a6c48dc2ac97e6bc94367696e03f6d09d37952" - integrity sha1-06bEjcKsl+a8lDZ2luA/bQnTeVI= +sort-object-keys@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.3.tgz#bff833fe85cab147b34742e45863453c1e190b45" + integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg== sort-package-json@^1.15.0: - version "1.23.1" - resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.23.1.tgz#7882349ad885ee6d82ff57af4184f9d6e9159e1d" - integrity sha512-dg6XChDHL+V1gPBLW4fDWsip5T94wpDVlowm8gxXsxQMxX2271zw8JM1RRbJSIrN80/UlwlRdBVkk2SuiuZ2cw== + version "1.40.0" + resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.40.0.tgz#81ad8c2bd7dd21b6a127ab4a26186a160f07a157" + integrity sha512-3Uc1kjmQ3SYuKziKghZvA23SihOqGxEjK2QPfFPmd7BMo9rWiJdC2FJWvAZbfhLWapuJrdmkUf6Kp0G4Wtuv5w== dependencies: detect-indent "^6.0.0" - glob "^7.1.6" - sort-object-keys "^1.1.2" + detect-newline "3.1.0" + git-hooks-list "1.0.2" + globby "10.0.1" + is-plain-obj "2.1.0" + sort-object-keys "^1.1.3" source-list-map@^2.0.0: version "2.0.1" @@ -12628,11 +12787,11 @@ source-list-map@^2.0.0: integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== dependencies: - atob "^2.1.1" + atob "^2.1.2" decode-uri-component "^0.2.0" resolve-url "^0.2.1" source-map-url "^0.4.0" @@ -12688,9 +12847,9 @@ source-map@~0.1.x: amdefine ">=0.0.4" sourcemap-codec@^1.4.1: - version "1.4.6" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz#e30a74f0402bad09807640d39e971090a08ce1e9" - integrity sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg== + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== sourcemap-validator@^1.1.0: version "1.1.1" @@ -12843,9 +13002,9 @@ stream-http@^2.7.2: xtend "^4.0.0" stream-shift@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" - integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== stream-to-array@^2.3.0: version "2.3.0" @@ -12911,18 +13070,18 @@ string-width@^4.1.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string.prototype.trimleft@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634" - integrity sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw== +string.prototype.trimleft@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" + integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== dependencies: define-properties "^1.1.3" function-bind "^1.1.1" -string.prototype.trimright@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58" - integrity sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg== +string.prototype.trimright@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" + integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== dependencies: define-properties "^1.1.3" function-bind "^1.1.1" @@ -13095,10 +13254,10 @@ svgo@1.3.0: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.8, symlink-or-copy@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.2.0.tgz#5d49108e2ab824a34069b68974486c290020b393" - integrity sha512-W31+GLiBmU/ZR02Ii0mVZICuNEN9daZ63xZMPDsYgPgNjMtg+atqLEGI7PPI936jYSQZxoLb/63xos8Adrx4Eg== +symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.8, symlink-or-copy@^1.2.0, symlink-or-copy@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.3.1.tgz#9506dd64d8e98fa21dcbf4018d1eab23e77f71fe" + integrity sha512-0K91MEXFpBUaywiwSSkmKjnGcasG/rVBXFLJz5DrgGabpYD6N+3yZrfD6uUIfpuTu65DZLHi7N8CizHc07BPZA== sync-disk-cache@^1.3.3: version "1.3.4" @@ -13127,15 +13286,16 @@ taffydb@2.7.2: integrity sha1-e/gQalwaSCUbPjvAoOFzJIn9Dcg= tailwindcss@^1.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-1.1.4.tgz#786bd5faaf485c9eddcb821dd55666c56baa814e" - integrity sha512-p4AxVa4CKpX7IbNxImwNMGG9MHuLgratOaOE/iGriNd4AsRQRM2xMisoQ3KQHqShunrWuObga7rI7xbNsVoWGA== + version "1.2.0" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-1.2.0.tgz#5df317cebac4f3131f275d258a39da1ba3a0f291" + integrity sha512-CKvY0ytB3ze5qvynG7qv4XSpQtFNGPbu9pUn8qFdkqgD8Yo/vGss8mhzbqls44YCXTl4G62p3qVZBj45qrd6FQ== dependencies: autoprefixer "^9.4.5" bytes "^3.0.0" - chalk "^2.4.1" + chalk "^3.0.0" + detective "^5.2.0" fs-extra "^8.0.0" - lodash "^4.17.11" + lodash "^4.17.15" node-emoji "^1.8.1" normalize.css "^8.0.1" postcss "^7.0.11" @@ -13145,6 +13305,7 @@ tailwindcss@^1.0: postcss-selector-parser "^6.0.0" pretty-hrtime "^1.0.3" reduce-css-calc "^2.1.6" + resolve "^1.14.2" tap-parser@^7.0.0: version "7.0.0" @@ -13160,7 +13321,7 @@ tapable@^1.0.0, tapable@^1.1.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tar@^4: +tar@^4.4.2: version "4.4.13" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== @@ -13205,9 +13366,9 @@ terser@^3.8.1: source-map-support "~0.5.10" terser@^4.3.9: - version "4.4.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.4.0.tgz#22c46b4817cf4c9565434bfe6ad47336af259ac3" - integrity sha512-oDG16n2WKm27JO8h4y/w3iqBGAOSCtq7k8dRmrn4Wf9NouL0b2WpMHGChFGZq4nFAQy1FsNJrVQHfurXOSTmOA== + version "4.6.7" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.7.tgz#478d7f9394ec1907f0e488c5f6a6a9a2bad55e72" + integrity sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g== dependencies: commander "^2.20.0" source-map "~0.6.1" @@ -13451,16 +13612,16 @@ topo@2.x.x: dependencies: hoek "4.x.x" -tough-cookie@>=0.12.0, tough-cookie@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" - integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== +tough-cookie@>=0.12.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" + integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== dependencies: - ip-regex "^2.1.0" - psl "^1.1.28" + psl "^1.1.33" punycode "^2.1.1" + universalify "^0.1.2" -tough-cookie@^2.2.0, tough-cookie@^2.3.3, tough-cookie@^2.4.3: +tough-cookie@^2.2.0, tough-cookie@^2.3.3, tough-cookie@^2.4.3, tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== @@ -13468,13 +13629,14 @@ tough-cookie@^2.2.0, tough-cookie@^2.3.3, tough-cookie@^2.4.3: psl "^1.1.28" punycode "^2.1.1" -tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== +tough-cookie@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" + integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== dependencies: - psl "^1.1.24" - punycode "^1.4.1" + ip-regex "^2.1.0" + psl "^1.1.28" + punycode "^2.1.1" tr46@^1.0.1: version "1.0.1" @@ -13510,9 +13672,9 @@ trim-right@^1.0.1: integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= tslib@^1.10.0, tslib@^1.9.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" - integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== + version "1.11.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" + integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== tty-browserify@0.0.0: version "0.0.0" @@ -13543,10 +13705,10 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" @@ -13574,9 +13736,9 @@ uc.micro@^1.0.0, uc.micro@^1.0.1, uc.micro@^1.0.5: integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== uglify-js@^3.1.4: - version "3.6.9" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.9.tgz#85d353edb6ddfb62a9d798f36e91792249320611" - integrity sha512-pcnnhaoG6RtrvHJ1dFncAe8Od6Nuy30oaJ82ts6//sGSXOP5UjBMEthiProjXmMNHOfd93sqlkztifFMcb+4yw== + version "3.8.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.8.0.tgz#f3541ae97b2f048d7e7e3aa4f39fd8a1f5d7a805" + integrity sha512-ugNSTT8ierCsDHso2jkBHXYrU8Y5/fY2ZUprfrJUiD7YpuFvV4jODLFmb3h4btQjqr5Nh4TX4XtgDfCU1WdioQ== dependencies: commander "~2.20.3" source-map "~0.6.1" @@ -13590,9 +13752,9 @@ underscore.string@~3.3.4: util-deprecate "^1.0.2" underscore@>=1.8.3: - version "1.9.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" - integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== + version "1.9.2" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.2.tgz#0c8d6f536d6f378a5af264a72f7bec50feb7cf2f" + integrity sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ== unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" @@ -13607,15 +13769,15 @@ unicode-match-property-ecmascript@^1.0.4: unicode-canonical-property-names-ecmascript "^1.0.4" unicode-property-aliases-ecmascript "^1.0.4" -unicode-match-property-value-ecmascript@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" - integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== unicode-property-aliases-ecmascript@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" - integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== union-value@^1.0.0: version "1.0.1" @@ -13661,7 +13823,7 @@ unique-string@^1.0.0: dependencies: crypto-random-string "^1.0.0" -universalify@^0.1.0: +universalify@^0.1.0, universalify@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== @@ -13786,12 +13948,14 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= util.promisify@^1.0.0, util.promisify@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" util@0.10.3: version "0.10.3" @@ -13813,9 +13977,9 @@ utils-merge@1.0.1: integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= uuid@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" - integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== validate-npm-package-license@^3.0.1: version "3.0.4" @@ -13869,11 +14033,11 @@ vm-browserify@^1.0.1: integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== w3c-hr-time@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" - integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== dependencies: - browser-process-hrtime "^0.1.2" + browser-process-hrtime "^1.0.0" w3c-xmlserializer@^1.1.2: version "1.1.2" @@ -14123,9 +14287,9 @@ workerpool@^3.1.1: rsvp "^4.8.4" workerpool@^5.0.1: - version "5.0.2" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-5.0.2.tgz#8fd8f6c7250710b9c3143d5f7494db3b6633ce6e" - integrity sha512-RsXfHGFzbqrfrExTN1TyZobWXCN6+vbn9B1CsZ5zQ2ASA2kQaYONCGOAT88Ew+kNSaRq/XmApRC/HRSv9Z98Ng== + version "5.0.4" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-5.0.4.tgz#4f67cb70ff7550a27ab94de25b0b843cd92059a2" + integrity sha512-Sywova24Ow2NQ24JPB68bI89EdqMDjUXo4OpofK/QMD7C2ZVMloYBgQ5J3PChcBJHj2vspsmGx1/3nBKXtUkXQ== wrap-ansi@^2.0.0: version "2.1.0" @@ -14164,11 +14328,9 @@ ws@^6.1.0: async-limiter "~1.0.0" ws@^7.0.0, ws@^7.1.2: - version "7.2.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.0.tgz#422eda8c02a4b5dba7744ba66eebbd84bcef0ec7" - integrity sha512-+SqNqFbwTm/0DC18KYzIsMTnEWpLwJsiasW/O17la4iDRRIO9uaHbvKiAS3AHgTiuuWerK/brj4O6MYZkei9xg== - dependencies: - async-limiter "^1.0.0" + version "7.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46" + integrity sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ== ws@~6.1.0: version "6.1.4" @@ -14208,12 +14370,11 @@ xml-parse-from-string@^1.0.0: integrity sha1-qQKekp09vN7RafPG4oI42VpdWig= xml2js@^0.4.5: - version "0.4.22" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.22.tgz#4fa2d846ec803237de86f30aa9b5f70b6600de02" - integrity sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw== + version "0.4.23" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== dependencies: sax ">=0.6.0" - util.promisify "~1.0.0" xmlbuilder "~11.0.0" xmlbuilder@~11.0.0: @@ -14227,16 +14388,16 @@ xmlchars@^2.1.1: integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== xmldom@^0.1.19: - version "0.1.27" - resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" - integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= + version "0.1.31" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" + integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== xmlhttprequest-ssl@~1.5.4: version "1.5.5" resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= -xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -14295,12 +14456,13 @@ yargs@^6.5.0: y18n "^3.2.1" yargs-parser "^4.2.0" -yauzl@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" - integrity sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU= +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= dependencies: - fd-slicer "~1.0.1" + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" yeast@0.1.2: version "0.1.2" From 07e3077b3ae3df99b360a151dbc4911336647fc2 Mon Sep 17 00:00:00 2001 From: Yuri Ratanov Date: Thu, 26 Mar 2020 21:24:03 +0700 Subject: [PATCH 635/879] Update Customizing the inflector docs (#1912) fixes #1911 --- .../pods/docs/advanced/customizing-the-inflector/template.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/dummy/app/pods/docs/advanced/customizing-the-inflector/template.md b/tests/dummy/app/pods/docs/advanced/customizing-the-inflector/template.md index cdf88d4a2..10bc5cb68 100644 --- a/tests/dummy/app/pods/docs/advanced/customizing-the-inflector/template.md +++ b/tests/dummy/app/pods/docs/advanced/customizing-the-inflector/template.md @@ -29,7 +29,7 @@ might use inflection rules to try to look up the "advices" collection or databas [The guides](https://guides.emberjs.com/release/models/customizing-adapters/#toc_pluralization-customization) document the best way to configure these inflection rules. At the time of this writing, here's how you'd configure the inflector to treat "advice" as an uncountable word (i.e. a word with no plural form): -```js +```diff // app/initializers/custom-inflector-rules.js import Inflector from 'ember-inflector'; @@ -42,6 +42,7 @@ export function initialize(/* application */) { export default { name: 'custom-inflector-rules', ++ before: 'ember-cli-mirage', initialize }; ``` From a11e0957322ec56dee19c06906745a755c9a895e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 26 Mar 2020 11:50:06 -0400 Subject: [PATCH 636/879] build(deps-dev): bump fastboot from 2.0.3 to 3.0.2 (#1910) Bumps [fastboot](https://github.com/ember-fastboot/fastboot) from 2.0.3 to 3.0.2. - [Release notes](https://github.com/ember-fastboot/fastboot/releases) - [Changelog](https://github.com/ember-fastboot/fastboot/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-fastboot/fastboot/compare/v2.0.3...v3.0.2) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 128 ++++++++++----------------------------------------- 2 files changed, 25 insertions(+), 105 deletions(-) diff --git a/package.json b/package.json index 7b1a243e6..d07f57c87 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "eslint-plugin-ember": "^7.0.0", "eslint-plugin-node": "^11.0.0", "faker": "^4.1.0", - "fastboot": "^2.0.1", + "fastboot": "^3.0.2", "js-yaml": "^3.12.1", "jsdom": "^15.0.0", "loader.js": "^4.7.0", diff --git a/yarn.lock b/yarn.lock index 7747a9d79..a1e131a29 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5165,7 +5165,7 @@ debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.3. dependencies: ms "2.0.0" -debug@^3.0.0, debug@^3.0.1, debug@^3.1.0, debug@^3.1.1, debug@^3.2.6: +debug@^3.0.0, debug@^3.0.1, debug@^3.1.0, debug@^3.1.1: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -5314,11 +5314,6 @@ detect-indent@^6.0.0: resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd" integrity sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA== -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - detect-newline@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -6902,8 +6897,9 @@ esdoc-ecmascript-proposal-plugin@^1.0.0: resolved "https://registry.yarnpkg.com/esdoc-ecmascript-proposal-plugin/-/esdoc-ecmascript-proposal-plugin-1.0.0.tgz#390dc5656ba8a2830e39dba3570d79138df2ffd9" integrity sha1-OQ3FZWuoooMOOdujVw15E43y/9k= -"esdoc@github:pzuraq/esdoc#015a342": +esdoc@pzuraq/esdoc#015a342: version "1.0.4" + uid "015a3426b2e53b2b0270a9c00133780db3f1d144" resolved "https://codeload.github.com/pzuraq/esdoc/tar.gz/015a3426b2e53b2b0270a9c00133780db3f1d144" dependencies: babel-generator "6.26.0" @@ -7415,6 +7411,18 @@ fastboot@^2.0.0, fastboot@^2.0.1: simple-dom "^1.4.0" source-map-support "^0.5.0" +fastboot@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-3.0.2.tgz#7e1c5ecc662569c7a2a4973b8d69d02dde9d17cd" + integrity sha512-nDjtaTTeJ1QSDTwoE8XqXp65i1jnasrv0tK3+mk/4fsViImhZ66k1bgQSvFL9z088syC4DnawLCZgvdrCrICHQ== + dependencies: + chalk "^3.0.0" + cookie "^0.4.0" + debug "^4.1.1" + resolve "^1.15.0" + simple-dom "^1.4.0" + source-map-support "^0.5.16" + fastq@^1.6.0: version "1.6.1" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.6.1.tgz#4570c74f2ded173e71cf0beb08ac70bb85826791" @@ -7806,13 +7814,6 @@ fs-merger@^3.0.1: rimraf "^2.6.3" walk-sync "^2.0.2" -fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6, fs-tree-diff@^0.5.7, fs-tree-diff@^0.5.9: version "0.5.9" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.9.tgz#a4ec6182c2f5bd80b9b83c8e23e4522e6f5fd946" @@ -8542,7 +8543,7 @@ ice-cap@0.0.4: cheerio "0.20.0" color-logger "0.0.3" -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -8559,13 +8560,6 @@ iferr@^0.1.5: resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== - dependencies: - minimatch "^3.0.4" - ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" @@ -10335,7 +10329,7 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= -minipass@^2.2.0, minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: +minipass@^2.2.0: version "2.9.0" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== @@ -10343,13 +10337,6 @@ minipass@^2.2.0, minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: safe-buffer "^5.1.2" yallist "^3.0.0" -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - miragejs@^0.1.31: version "0.1.35" resolved "https://registry.yarnpkg.com/miragejs/-/miragejs-0.1.35.tgz#7fb64c03ccdc2495a510ed46033d6ac4ff1fa661" @@ -10541,15 +10528,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -needle@^2.2.1: - version "2.3.3" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.3.tgz#a041ad1d04a871b0ebb666f40baaf1fb47867117" - integrity sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - negotiator@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" @@ -10635,22 +10613,6 @@ node-notifier@^5.0.1: shellwords "^0.1.1" which "^1.3.0" -node-pre-gyp@*: - version "0.14.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" - integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4.4.2" - node-releases@^1.1.52: version "1.1.52" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9" @@ -10670,14 +10632,6 @@ nopt@^3.0.6: dependencies: abbrev "1" -nopt@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" - integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== - dependencies: - abbrev "1" - osenv "^0.1.4" - normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -10719,23 +10673,11 @@ normalize.css@^8.0.1: resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-8.0.1.tgz#9b98a208738b9cc2634caacbc42d131c97487bf3" integrity sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg== -npm-bundled@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" - integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== - dependencies: - npm-normalize-package-bin "^1.0.1" - npm-git-info@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/npm-git-info/-/npm-git-info-1.0.3.tgz#a933c42ec321e80d3646e0d6e844afe94630e1d5" integrity sha1-qTPELsMh6A02RuDW6ESv6UYw4dU= -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - npm-package-arg@^6.1.0: version "6.1.1" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.1.tgz#02168cb0a49a2b75bf988a28698de7b529df5cb7" @@ -10746,15 +10688,6 @@ npm-package-arg@^6.1.0: semver "^5.6.0" validate-npm-package-name "^3.0.0" -npm-packlist@^1.1.6: - version "1.4.8" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" - integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - npm-normalize-package-bin "^1.0.1" - npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -10769,7 +10702,7 @@ npm-run-path@^4.0.0: dependencies: path-key "^3.0.0" -npmlog@^4.0.0, npmlog@^4.0.2: +npmlog@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -10999,7 +10932,7 @@ os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@^0.1.3, osenv@^0.1.4, osenv@^0.1.5: +osenv@^0.1.3, osenv@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== @@ -11792,7 +11725,7 @@ raw-body@~1.1.0: bytes "1" string_decoder "0.10" -rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: +rc@^1.0.1, rc@^1.1.6: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -12224,7 +12157,7 @@ resolve@1.5.0: dependencies: path-parse "^1.0.5" -resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: +resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.15.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: version "1.15.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== @@ -12457,7 +12390,7 @@ sass@^1.22.10: dependencies: chokidar ">=2.0.0 <4.0.0" -sax@>=0.6.0, sax@^1.1.4, sax@^1.2.4, sax@~1.2.4: +sax@>=0.6.0, sax@^1.1.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -12804,7 +12737,7 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" -source-map-support@^0.5.0, source-map-support@~0.5.10, source-map-support@~0.5.12: +source-map-support@^0.5.0, source-map-support@^0.5.16, source-map-support@~0.5.10, source-map-support@~0.5.12: version "0.5.16" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== @@ -13321,19 +13254,6 @@ tapable@^1.0.0, tapable@^1.1.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tar@^4.4.2: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - temp@0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" @@ -14417,7 +14337,7 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: +yallist@^3.0.0, yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== From 7b7db748ae9189e378693eb1e31368141d3d5186 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 26 Mar 2020 11:50:15 -0400 Subject: [PATCH 637/879] build(deps-dev): bump qunit-dom from 0.9.2 to 1.1.0 (#1902) Bumps [qunit-dom](https://github.com/simplabs/qunit-dom) from 0.9.2 to 1.1.0. - [Release notes](https://github.com/simplabs/qunit-dom/releases) - [Changelog](https://github.com/simplabs/qunit-dom/blob/master/CHANGELOG.md) - [Commits](https://github.com/simplabs/qunit-dom/compare/v0.9.2...v1.1.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 22 +++++++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index d07f57c87..1e46e15f7 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "js-yaml": "^3.12.1", "jsdom": "^15.0.0", "loader.js": "^4.7.0", - "qunit-dom": "^0.9.0" + "qunit-dom": "^1.1.0" }, "resolutions": { "favicons": "5.3.0", diff --git a/yarn.lock b/yarn.lock index a1e131a29..611be3e2d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3527,7 +3527,7 @@ broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1, broccoli-funnel@^2.0.2: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-funnel@^3.0.0: +broccoli-funnel@^3.0.0, broccoli-funnel@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.2.tgz#25e1c9a512b3852d3c9dde19ebdf07880d619c73" integrity sha512-yRa7f0H/BtfqXNmL4eCYtAiVAQASI5b83//17MxAYp3I+w8XzGY8Tc3mwhdUrAgh6Zhb6LZwgvUZDZPTLmkK7w== @@ -3602,6 +3602,14 @@ broccoli-merge-trees@^2.0.0: broccoli-plugin "^1.3.0" merge-trees "^1.0.1" +broccoli-merge-trees@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-4.1.0.tgz#a30e2e4c5bb0f5eb8981e8af33a8077714c11f1a" + integrity sha512-1OXsksKPFiRdiZZOfh1z1mm7ZqKezlMS+DPBpHMDLSb6AhYHvoQfjf0KuMXbY8aoYskj7+Z+EJ5SsS/OC2v5yw== + dependencies: + broccoli-plugin "^3.1.0" + merge-trees "^2.0.0" + broccoli-middleware@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/broccoli-middleware/-/broccoli-middleware-2.1.1.tgz#183635bbef4dc1241533ee001a162f013d776cb9" @@ -11666,13 +11674,13 @@ quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quick-temp@^0.1.8: rimraf "^2.5.4" underscore.string "~3.3.4" -qunit-dom@^0.9.0: - version "0.9.2" - resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-0.9.2.tgz#cc7bb777e4f5faa749eca843f54e199755df8473" - integrity sha512-BPf7OZjhXo9ekgsViNjQVS9BWkm2yQsPvBoy0juvt5nOFlcBVVwHSYsgpsJOunWkI1IgA3eStAC9mQx3Zw734g== +qunit-dom@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-1.1.0.tgz#ba830ff36a0b1e93483616156a7730f0c9b1d6f6" + integrity sha512-YYlM6LIBorgqqK8tU/0ggefi9o1QKVSKOO1gfXZb/Ng5MFI7PK1H9qaGHjWGomW8v6MaMYrYkMh6ISiLbdRzuQ== dependencies: - broccoli-funnel "^2.0.2" - broccoli-merge-trees "^3.0.1" + broccoli-funnel "^3.0.2" + broccoli-merge-trees "^4.1.0" qunit@~2.6.0: version "2.6.2" From 40a1ed0d31f26c629a0b6e9e28a1572e804302c9 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 26 Mar 2020 11:50:35 -0400 Subject: [PATCH 638/879] build(deps): bump broccoli-funnel from 2.0.2 to 3.0.2 (#1897) Bumps [broccoli-funnel](https://github.com/broccolijs/broccoli-funnel) from 2.0.2 to 3.0.2. - [Release notes](https://github.com/broccolijs/broccoli-funnel/releases) - [Changelog](https://github.com/broccolijs/broccoli-funnel/blob/master/CHANGELOG.md) - [Commits](https://github.com/broccolijs/broccoli-funnel/compare/v2.0.2...v3.0.2) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1e46e15f7..b473ca869 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ }, "dependencies": { "broccoli-file-creator": "^2.1.1", - "broccoli-funnel": "^2.0.1", + "broccoli-funnel": "^3.0.2", "broccoli-merge-trees": "^3.0.2", "ember-auto-import": "^1.2.19", "ember-cli-babel": "^7.5.0", From 32f94cbc35a7d0eb84db557e982ed58fddc44b93 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Fri, 27 Mar 2020 10:26:42 -0400 Subject: [PATCH 639/879] Fix broken link --- tests/dummy/app/pods/docs/route-handlers/shorthands/template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dummy/app/pods/docs/route-handlers/shorthands/template.md b/tests/dummy/app/pods/docs/route-handlers/shorthands/template.md index 80c4223cd..f5df22ae3 100644 --- a/tests/dummy/app/pods/docs/route-handlers/shorthands/template.md +++ b/tests/dummy/app/pods/docs/route-handlers/shorthands/template.md @@ -110,7 +110,7 @@ this.post('/contacts', function(schema, request) { }); ``` -For this POST shorthand to work, Mirage needs to know the format of the JSON payload your Ember app sends along with the request, so that it can insert the appropriate data into the database. See [the note on normalize](../serializers/#normalizejson) in the Serializer docs for more information. +For this POST shorthand to work, Mirage needs to know the format of the JSON payload your Ember app sends along with the request, so that it can insert the appropriate data into the database. See [the note on normalize](/docs/api/modules/serializer~Serializer#normalize) in the Serializer docs for more information. ## PATCH/PUT Shorthands From ed4f47ca27ceb35f4d9306f51535dc922bf6fb59 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2020 07:29:12 +0000 Subject: [PATCH 640/879] build(deps): bump ember-cli-babel from 7.18.0 to 7.19.0 Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 7.18.0 to 7.19.0. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v7.18.0...v7.19.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/yarn.lock b/yarn.lock index 611be3e2d..8896becde 100644 --- a/yarn.lock +++ b/yarn.lock @@ -23,7 +23,7 @@ invariant "^2.2.4" semver "^5.5.0" -"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.2.2", "@babel/core@^7.3.4", "@babel/core@^7.8.3", "@babel/core@^7.8.4": +"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.2.2", "@babel/core@^7.3.4", "@babel/core@^7.8.3", "@babel/core@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== @@ -70,7 +70,7 @@ "@babel/helper-explode-assignable-expression" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-compilation-targets@^7.8.4", "@babel/helper-compilation-targets@^7.8.7": +"@babel/helper-compilation-targets@^7.8.7": version "7.8.7" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde" integrity sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw== @@ -540,7 +540,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-modules-amd@^7.0.0", "@babel/plugin-transform-modules-amd@^7.8.3", "@babel/plugin-transform-modules-amd@^7.9.0": +"@babel/plugin-transform-modules-amd@^7.0.0", "@babel/plugin-transform-modules-amd@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4" integrity sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q== @@ -635,7 +635,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-runtime@^7.2.0", "@babel/plugin-transform-runtime@^7.8.3": +"@babel/plugin-transform-runtime@^7.2.0", "@babel/plugin-transform-runtime@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz#45468c0ae74cc13204e1d3b1f4ce6ee83258af0b" integrity sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw== @@ -682,7 +682,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-typescript@^7.8.3": +"@babel/plugin-transform-typescript@^7.9.0": version "7.9.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.4.tgz#4bb4dde4f10bbf2d787fce9707fb09b483e33359" integrity sha512-yeWeUkKx2auDbSxRe8MusAG+n4m9BFY/v+lPjmQDgOFX5qnySkUY5oXzkp6FwPdsYqnKay6lorXYdC0n3bZO7w== @@ -716,7 +716,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" -"@babel/polyfill@^7.0.0", "@babel/polyfill@^7.8.3": +"@babel/polyfill@^7.0.0", "@babel/polyfill@^7.8.3", "@babel/polyfill@^7.8.7": version "7.8.7" resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.8.7.tgz#151ec24c7135481336168c3bd8b8bf0cf91c032f" integrity sha512-LeSfP9bNZH2UOZgcGcZ0PIHUt1ZuHub1L3CVmEyqLxCeDLm4C5Gi8jRH8ZX2PNpDhQCo0z6y/+DIs2JlliXW8w== @@ -724,7 +724,7 @@ core-js "^2.6.5" regenerator-runtime "^0.13.4" -"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.8.4": +"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8" integrity sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ== @@ -801,7 +801,7 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/runtime@^7.2.0", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.2.0", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.0": version "7.9.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q== @@ -5740,20 +5740,20 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, semver "^5.5.0" ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.18.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: - version "7.18.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.18.0.tgz#e979b73eee00cd93f63452c6170d045e8832f29c" - integrity sha512-OLPfYD8wSfCrmGHcUf8zEfySSvbAL+5Qp2RWLycJIMaBZhg+SncKj5kVkL3cPJR5n2hVHPdfmKTQIYjOYl6FnQ== + version "7.19.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.19.0.tgz#e6eddea18a867231fcf90a80689e92b98be9a63b" + integrity sha512-HiWKuoyy35vGEr+iCw6gUnQ3pS5qslyTlKEDW8cVoMbvZNGYBgRxHed5nklVUh+BS74AwR9lsp25BTAagYAP9Q== dependencies: - "@babel/core" "^7.8.4" - "@babel/helper-compilation-targets" "^7.8.4" + "@babel/core" "^7.9.0" + "@babel/helper-compilation-targets" "^7.8.7" "@babel/plugin-proposal-class-properties" "^7.8.3" "@babel/plugin-proposal-decorators" "^7.8.3" - "@babel/plugin-transform-modules-amd" "^7.8.3" - "@babel/plugin-transform-runtime" "^7.8.3" - "@babel/plugin-transform-typescript" "^7.8.3" - "@babel/polyfill" "^7.8.3" - "@babel/preset-env" "^7.8.4" - "@babel/runtime" "^7.8.4" + "@babel/plugin-transform-modules-amd" "^7.9.0" + "@babel/plugin-transform-runtime" "^7.9.0" + "@babel/plugin-transform-typescript" "^7.9.0" + "@babel/polyfill" "^7.8.7" + "@babel/preset-env" "^7.9.0" + "@babel/runtime" "^7.9.0" amd-name-resolver "^1.2.1" babel-plugin-debug-macros "^0.3.0" babel-plugin-ember-data-packages-polyfill "^0.1.2" From 89690cd0efc16064f0cf7ddc8dfe9150d9d42d1b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2020 07:29:45 +0000 Subject: [PATCH 641/879] build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 Bumps [eslint-plugin-node](https://github.com/mysticatea/eslint-plugin-node) from 11.0.0 to 11.1.0. - [Release notes](https://github.com/mysticatea/eslint-plugin-node/releases) - [Commits](https://github.com/mysticatea/eslint-plugin-node/compare/v11.0.0...v11.1.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 8896becde..e54d0ac33 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6940,9 +6940,9 @@ eslint-plugin-es@^3.0.0: regexpp "^3.0.0" eslint-plugin-node@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.0.0.tgz#365944bb0804c5d1d501182a9bc41a0ffefed726" - integrity sha512-chUs/NVID+sknFiJzxoN9lM7uKSOEta8GC8365hw1nDfwIPIjjpRSwwPvQanWv8dt/pDe9EV4anmVSwdiSndNg== + version "11.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" + integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== dependencies: eslint-plugin-es "^3.0.0" eslint-utils "^2.0.0" From e243aa61f9c409cee24d5ef2867921cc97d70b06 Mon Sep 17 00:00:00 2001 From: Yuri Ratanov Date: Tue, 31 Mar 2020 20:29:57 +0700 Subject: [PATCH 642/879] Update Customizing the inflector docs [2] (#1917) Apply feedback from #1912 --- .../docs/advanced/customizing-the-inflector/template.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/dummy/app/pods/docs/advanced/customizing-the-inflector/template.md b/tests/dummy/app/pods/docs/advanced/customizing-the-inflector/template.md index 10bc5cb68..945f069fb 100644 --- a/tests/dummy/app/pods/docs/advanced/customizing-the-inflector/template.md +++ b/tests/dummy/app/pods/docs/advanced/customizing-the-inflector/template.md @@ -29,7 +29,7 @@ might use inflection rules to try to look up the "advices" collection or databas [The guides](https://guides.emberjs.com/release/models/customizing-adapters/#toc_pluralization-customization) document the best way to configure these inflection rules. At the time of this writing, here's how you'd configure the inflector to treat "advice" as an uncountable word (i.e. a word with no plural form): -```diff +```js // app/initializers/custom-inflector-rules.js import Inflector from 'ember-inflector'; @@ -42,11 +42,13 @@ export function initialize(/* application */) { export default { name: 'custom-inflector-rules', -+ before: 'ember-cli-mirage', + before: 'ember-cli-mirage', initialize }; ``` +Make sure to use `before: "ember-cli-mirage"` so this runs before Mirage initializes itself. + As long as you follow this approach, Mirage should respect your custom inflector rules. With the above rule, From ae003d731a869bb00f64a0a7f5a28aff24bc2ab1 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 31 Mar 2020 09:30:20 -0400 Subject: [PATCH 643/879] build(deps-dev): bump ember-resolver from 6.0.1 to 7.0.0 (#1859) Bumps [ember-resolver](https://github.com/ember-cli/ember-resolver) from 6.0.1 to 7.0.0. - [Release notes](https://github.com/ember-cli/ember-resolver/releases) - [Changelog](https://github.com/ember-cli/ember-resolver/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-resolver/compare/v6.0.1...v7.0.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 29 ++++++++--------------------- 2 files changed, 9 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index b473ca869..83d3e05b2 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "ember-load-initializers": "^2.0.0", "ember-maybe-import-regenerator-for-testing": "^1.0.0", "ember-moment": "^8.0.0", - "ember-resolver": "^6.0.0", + "ember-resolver": "^7.0.0", "ember-source": "~3.16.1", "ember-source-channel-url": "^2.0.1", "ember-try": "^1.0.0", diff --git a/yarn.lock b/yarn.lock index e54d0ac33..0f9f94273 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1118,11 +1118,6 @@ resolve "^1.8.1" semver "^5.6.0" -"@glimmer/di@^0.2.0": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@glimmer/di/-/di-0.2.1.tgz#5286b6b32040232b751138f6d006130c728d4b3d" - integrity sha512-0D53YVuEgGdHfTl9LGWDZqVzGhn4cT0CXqyAuOYkKFLvqboJXz6SnkRhQNPhhA2hLVrPnvUz3+choQmPhHLGGQ== - "@glimmer/env@^0.1.7": version "0.1.7" resolved "https://registry.yarnpkg.com/@glimmer/env/-/env-0.1.7.tgz#fd2d2b55a9029c6b37a6c935e8c8871ae70dfa07" @@ -1133,13 +1128,6 @@ resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.42.2.tgz#9cf8d6f8f5eee6bfcfa36919ca68ae716e1f78db" integrity sha512-7LOuQd02cxxNNHChzdHMAU8/qOeQvTro141CU5tXITP7z6aOv2D2gkFdau97lLQiVxezGrh8J7h8GCuF7TEqtg== -"@glimmer/resolver@^0.4.1": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@glimmer/resolver/-/resolver-0.4.3.tgz#b1baae5c3291b4621002ccf8d7870466097e841d" - integrity sha512-UhX6vlZbWRMq6pCquSC3wfWLM9kO0PhQPD1dZ3XnyZkmsvEE94Cq+EncA9JalUuevKoJrfUFRvrZ0xaz+yar3g== - dependencies: - "@glimmer/di" "^0.2.0" - "@glimmer/syntax@^0.42.2": version "0.42.2" resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.42.2.tgz#89bb3cb787285b84665dc0d8907d94b008e5be9a" @@ -5739,7 +5727,7 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.18.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.18.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: version "7.19.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.19.0.tgz#e6eddea18a867231fcf90a80689e92b98be9a63b" integrity sha512-HiWKuoyy35vGEr+iCw6gUnQ3pS5qslyTlKEDW8cVoMbvZNGYBgRxHed5nklVUh+BS74AwR9lsp25BTAagYAP9Q== @@ -6536,18 +6524,17 @@ ember-qunit@^3.5.0: ember-cli-test-loader "^2.2.0" qunit "~2.6.0" -ember-resolver@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-6.0.2.tgz#ab05e03e740a7c93a6aa4e8ef29f3eea00cd7934" - integrity sha512-XaaMQ0v85keQgxek6rwyu8P+sYGdU8L2Q/0ehyn1jy6/+qOYyoQ3T8/i9ccarcsDhtxe7qlGzcbfD5pdk28+8Q== +ember-resolver@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-7.0.0.tgz#07ca86b3bae373395b44bba784b8c133f75d61c2" + integrity sha512-tqyWk9E1P5LL42x7AnVoE25a/YWe0WcwAr8LXasm5V7Az3vFR/zbFtwN0oI3tpoSP/nCoGWDct6dRYlXrQjqBQ== dependencies: - "@glimmer/resolver" "^0.4.1" babel-plugin-debug-macros "^0.3.3" broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.0" - ember-cli-babel "^7.13.0" + ember-cli-babel "^7.13.2" ember-cli-version-checker "^3.1.3" - resolve "^1.12.0" + resolve "^1.14.0" ember-responsive@^3.0.5: version "3.0.5" @@ -12165,7 +12152,7 @@ resolve@1.5.0: dependencies: path-parse "^1.0.5" -resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.15.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: +resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.0, resolve@^1.14.2, resolve@^1.15.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: version "1.15.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== From 9d2413531fc4e3ad541953198a71b32c325e973d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 31 Mar 2020 09:30:49 -0400 Subject: [PATCH 644/879] build(deps-dev): bump eslint-plugin-ember from 7.11.1 to 8.1.0 (#1922) Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 7.11.1 to 8.1.0. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v7.11.1...v8.1.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 83d3e05b2..5d522f4cc 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "ember-source-channel-url": "^2.0.1", "ember-try": "^1.0.0", "escape-string-regexp": "^2.0.0", - "eslint-plugin-ember": "^7.0.0", + "eslint-plugin-ember": "^8.1.0", "eslint-plugin-node": "^11.0.0", "faker": "^4.1.0", "fastboot": "^3.0.2", diff --git a/yarn.lock b/yarn.lock index 0f9f94273..ad6c894d0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6909,10 +6909,10 @@ esdoc@pzuraq/esdoc#015a342: minimist "1.2.0" taffydb "2.7.2" -eslint-plugin-ember@^7.0.0: - version "7.11.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.11.1.tgz#d0f0205eab605d5fddaeb706ec6f73b3a71bb971" - integrity sha512-BebVe2jXos+nAU6ptdhxAVFqX6y7ZITjpDS+FhKD33FxtPPzNghJIqg/Yc2NwKCjetrW5zmfHXkIODtq49M1Sg== +eslint-plugin-ember@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.1.0.tgz#bfc9333b6212e6f32f210fc39404379d365a4328" + integrity sha512-ZGo/vXIapt+85+06hjd08jnjMuRM/1aOLrhjdipqvClGPLlTjTqvYuyUQZws0TZAo8qOPBEK2EaI2u5W1whtyA== dependencies: "@ember-data/rfc395-data" "^0.0.4" ember-rfc176-data "^0.3.12" From be24be34c4ba1f7781c85a88ae7a4f9bfc1e4dc1 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 31 Mar 2020 09:31:23 -0400 Subject: [PATCH 645/879] build(deps-dev): bump jsdom from 15.2.1 to 16.2.2 (#1921) Bumps [jsdom](https://github.com/jsdom/jsdom) from 15.2.1 to 16.2.2. - [Release notes](https://github.com/jsdom/jsdom/releases) - [Changelog](https://github.com/jsdom/jsdom/blob/master/Changelog.md) - [Commits](https://github.com/jsdom/jsdom/compare/15.2.1...16.2.2) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 144 ++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 132 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 5d522f4cc..651d50da8 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "faker": "^4.1.0", "fastboot": "^3.0.2", "js-yaml": "^3.12.1", - "jsdom": "^15.0.0", + "jsdom": "^16.2.2", "loader.js": "^4.7.0", "qunit-dom": "^1.1.0" }, diff --git a/yarn.lock b/yarn.lock index ad6c894d0..22555b0fe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1861,7 +1861,7 @@ abab@^1.0.0: resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" integrity sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4= -abab@^2.0.0: +abab@^2.0.0, abab@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== @@ -1906,6 +1906,14 @@ acorn-globals@^4.3.0, acorn-globals@^4.3.2: acorn "^6.0.1" acorn-walk "^6.0.1" +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + acorn-jsx@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" @@ -1925,7 +1933,7 @@ acorn-walk@^6.0.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== -acorn-walk@^7.0.0: +acorn-walk@^7.0.0, acorn-walk@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e" integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ== @@ -1945,7 +1953,7 @@ acorn@^6.0.1, acorn@^6.0.2, acorn@^6.0.7: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== -acorn@^7.0.0, acorn@^7.1.0: +acorn@^7.0.0, acorn@^7.1.0, acorn@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== @@ -5083,7 +5091,7 @@ cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0", cssom@^0.3.4, cssom@~0.3.6: resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== -cssom@^0.4.1: +cssom@^0.4.1, cssom@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== @@ -5102,7 +5110,7 @@ cssstyle@^1.1.1: dependencies: cssom "0.3.x" -cssstyle@^2.0.0: +cssstyle@^2.0.0, cssstyle@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.2.0.tgz#e4c44debccd6b7911ed617a4395e5754bba59992" integrity sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA== @@ -5147,6 +5155,15 @@ data-urls@^1.0.1, data-urls@^1.1.0: whatwg-mimetype "^2.2.0" whatwg-url "^7.0.0" +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + date-time@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/date-time/-/date-time-2.1.0.tgz#0286d1b4c769633b3ca13e1e62558d2dbdc2eba2" @@ -5187,6 +5204,11 @@ decamelize@^1.1.1, decamelize@^1.1.2: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decimal.js@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.0.tgz#39466113a9e036111d02f82489b5fd6b0b5ed231" + integrity sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw== + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -5395,6 +5417,13 @@ domexception@^1.0.1: dependencies: webidl-conversions "^4.0.2" +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + domhandler@2.3: version "2.3.0" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" @@ -6870,7 +6899,7 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escodegen@^1.11.0, escodegen@^1.11.1, escodegen@^1.6.1: +escodegen@^1.11.0, escodegen@^1.11.1, escodegen@^1.14.1, escodegen@^1.6.1: version "1.14.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ== @@ -8433,6 +8462,13 @@ html-encoding-sniffer@^1.0.2: dependencies: whatwg-encoding "^1.0.1" +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + html-entities@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" @@ -8934,6 +8970,11 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-potential-custom-element-name@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" + integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= + is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" @@ -9206,7 +9247,7 @@ jsdom@^12.0.0: ws "^6.1.0" xml-name-validator "^3.0.0" -jsdom@^15.0.0, jsdom@^15.2.0: +jsdom@^15.2.0: version "15.2.1" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.1.tgz#d2feb1aef7183f86be521b8c6833ff5296d07ec5" integrity sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g== @@ -9238,6 +9279,38 @@ jsdom@^15.0.0, jsdom@^15.2.0: ws "^7.0.0" xml-name-validator "^3.0.0" +jsdom@^16.2.2: + version "16.2.2" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.2.2.tgz#76f2f7541646beb46a938f5dc476b88705bedf2b" + integrity sha512-pDFQbcYtKBHxRaP55zGXCJWgFHkDAYbKcsXEK/3Icu9nKYZkutUXfLBwbD+09XDutkYSHcgfQLZ0qvpAAm9mvg== + dependencies: + abab "^2.0.3" + acorn "^7.1.1" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.2.0" + data-urls "^2.0.0" + decimal.js "^10.2.0" + domexception "^2.0.1" + escodegen "^1.14.1" + html-encoding-sniffer "^2.0.1" + is-potential-custom-element-name "^1.0.0" + nwsapi "^2.2.0" + parse5 "5.1.1" + request "^2.88.2" + request-promise-native "^1.0.8" + saxes "^5.0.0" + symbol-tree "^3.2.4" + tough-cookie "^3.0.1" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.0.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + ws "^7.2.3" + xml-name-validator "^3.0.0" + jsdom@^7.0.2: version "7.2.2" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-7.2.2.tgz#40b402770c2bda23469096bee91ab675e3b1fc6e" @@ -11108,6 +11181,11 @@ parse5@5.1.0: resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== +parse5@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + parse5@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" @@ -12019,7 +12097,7 @@ request-promise-core@1.1.3: dependencies: lodash "^4.17.15" -request-promise-native@^1.0.5, request-promise-native@^1.0.7: +request-promise-native@^1.0.5, request-promise-native@^1.0.7, request-promise-native@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== @@ -12028,7 +12106,7 @@ request-promise-native@^1.0.5, request-promise-native@^1.0.7: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.55.0, request@^2.65.0, request@^2.81.0, request@^2.88.0: +request@^2.55.0, request@^2.65.0, request@^2.81.0, request@^2.88.0, request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -12397,6 +12475,13 @@ saxes@^3.1.3, saxes@^3.1.9: dependencies: xmlchars "^2.1.1" +saxes@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.0.tgz#b7d30284d7583a5ca6ad0248b56d8889da53788b" + integrity sha512-LXTZygxhf8lfwKaTP/8N9CsVdjTlea3teze4lL6u37ivbgGbV0GGMuNtS/I9rnD/HC2/txUM7Df4S2LVl1qhiA== + dependencies: + xmlchars "^2.2.0" + schema-utils@^0.4.4: version "0.4.7" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" @@ -13177,7 +13262,7 @@ svgo@1.3.0: unquote "~1.1.1" util.promisify "~1.0.0" -"symbol-tree@>= 3.1.0 < 4.0.0", symbol-tree@^3.2.2: +"symbol-tree@>= 3.1.0 < 4.0.0", symbol-tree@^3.2.2, symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== @@ -13560,6 +13645,13 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" +tr46@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" + integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== + dependencies: + punycode "^2.1.1" + tr46@~0.0.1: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -13947,7 +14039,7 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== -w3c-hr-time@^1.0.1: +w3c-hr-time@^1.0.1, w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== @@ -13963,6 +14055,13 @@ w3c-xmlserializer@^1.1.2: webidl-conversions "^4.0.2" xml-name-validator "^3.0.0" +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + walk-sync@0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.2.tgz#4827280afc42d0e035367c4a4e31eeac0d136f75" @@ -14057,6 +14156,16 @@ webidl-conversions@^4.0.2: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.0.0.tgz#ff41d921371f43e772dba311b146ab6c0ef0ead4" + integrity sha512-jTZAeJnc6D+yAOjygbJOs33kVQIk5H6fj9SFDOhIKjsf9HiAzL/c+tAJsc8ASWafvhNkH+wJZms47pmajkhatA== + webpack-sources@^1.1.0, webpack-sources@^1.3.0: version "1.4.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" @@ -14142,6 +14251,15 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" +whatwg-url@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.0.0.tgz#37f256cb746398e19b107bd6ef820b4ae2d15871" + integrity sha512-41ou2Dugpij8/LPO5Pq64K5q++MnRCBpEHvQr26/mArEKTkCV5aoXIqyhuYtE0pkqScXwhf2JP57rkRTYM29lQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^2.0.0" + webidl-conversions "^5.0.0" + which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" @@ -14242,7 +14360,7 @@ ws@^6.1.0: dependencies: async-limiter "~1.0.0" -ws@^7.0.0, ws@^7.1.2: +ws@^7.0.0, ws@^7.1.2, ws@^7.2.3: version "7.2.3" resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46" integrity sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ== @@ -14297,7 +14415,7 @@ xmlbuilder@~11.0.0: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== -xmlchars@^2.1.1: +xmlchars@^2.1.1, xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== From b29f6782941ecec144541c24ea0a8a5aa3997fef Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 31 Mar 2020 09:31:49 -0400 Subject: [PATCH 646/879] build(deps): bump broccoli-merge-trees from 3.0.2 to 4.2.0 (#1923) Bumps [broccoli-merge-trees](https://github.com/broccolijs/broccoli-merge-trees) from 3.0.2 to 4.2.0. - [Release notes](https://github.com/broccolijs/broccoli-merge-trees/releases) - [Changelog](https://github.com/broccolijs/broccoli-merge-trees/blob/master/CHANGELOG.md) - [Commits](https://github.com/broccolijs/broccoli-merge-trees/compare/v3.0.2...v4.2.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 651d50da8..23647de46 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "dependencies": { "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^3.0.2", - "broccoli-merge-trees": "^3.0.2", + "broccoli-merge-trees": "^4.2.0", "ember-auto-import": "^1.2.19", "ember-cli-babel": "^7.5.0", "ember-get-config": "^0.2.2", diff --git a/yarn.lock b/yarn.lock index 22555b0fe..9d08a8ff5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3598,12 +3598,12 @@ broccoli-merge-trees@^2.0.0: broccoli-plugin "^1.3.0" merge-trees "^1.0.1" -broccoli-merge-trees@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-4.1.0.tgz#a30e2e4c5bb0f5eb8981e8af33a8077714c11f1a" - integrity sha512-1OXsksKPFiRdiZZOfh1z1mm7ZqKezlMS+DPBpHMDLSb6AhYHvoQfjf0KuMXbY8aoYskj7+Z+EJ5SsS/OC2v5yw== +broccoli-merge-trees@^4.1.0, broccoli-merge-trees@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-4.2.0.tgz#692d3c163ecea08c5714a9434d664e628919f47c" + integrity sha512-nTrQe5AQtCrW4enLRvbD/vTLHqyW2tz+vsLXQe4IEaUhepuMGVKJJr+I8n34Vu6fPjmPLwTjzNC8izMIDMtHPw== dependencies: - broccoli-plugin "^3.1.0" + broccoli-plugin "^4.0.2" merge-trees "^2.0.0" broccoli-middleware@^2.0.1: @@ -3657,7 +3657,7 @@ broccoli-output-wrapper@^2.0.0: dependencies: heimdalljs-logger "^0.1.10" -broccoli-output-wrapper@^3.1.1: +broccoli-output-wrapper@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/broccoli-output-wrapper/-/broccoli-output-wrapper-3.2.1.tgz#8f9d1092afe0c1a4b7a1b6f0d2c62f1c403e82ad" integrity sha512-mhOTy8AyzEsqgefR2ejbv5QTy3dbY2bvDfkARo55Xml52r2MU0CehQu4T/CH6oPcAXkdVYG/hGm9UpV1vU9Ohg== @@ -3748,13 +3748,13 @@ broccoli-plugin@^2.0.0, broccoli-plugin@^2.1.0: rimraf "^2.3.4" symlink-or-copy "^1.1.8" -broccoli-plugin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-4.0.1.tgz#5a0468a9c8e02f763d5c162ced0a5930db4567a9" - integrity sha512-rBYVtV1rWvlDS8fd+CUUG7L/TO5VUCRjaGm2HEOBaTwUYQKswKJXLRSxwv0CYLo3QfVZJpI1akcn7NGe9kywIQ== +broccoli-plugin@^4.0.1, broccoli-plugin@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-4.0.2.tgz#a16c1f839bc95cc9975437e58864a395e518b447" + integrity sha512-wMytvn+I0ELNGLmLouZ7GpiMEHZ3pqKvHOWE7AgV4vdcnXm9FKwk1N2xGrGI+lKVxdejQvjxAJ2HCQJ/STrEjg== dependencies: broccoli-node-api "^1.6.0" - broccoli-output-wrapper "^3.1.1" + broccoli-output-wrapper "^3.2.1" fs-merger "^3.0.1" promise-map-series "^0.2.1" quick-temp "^0.1.3" From f6576033243aee7cd4f916c916ea7ab90965d5cc Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 2 Apr 2020 07:06:06 +0000 Subject: [PATCH 647/879] build(deps-dev): bump eslint-plugin-ember from 8.1.0 to 8.1.1 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 8.1.0 to 8.1.1. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v8.1.0...v8.1.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9d08a8ff5..0fcfb9e11 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6939,9 +6939,9 @@ esdoc@pzuraq/esdoc#015a342: taffydb "2.7.2" eslint-plugin-ember@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.1.0.tgz#bfc9333b6212e6f32f210fc39404379d365a4328" - integrity sha512-ZGo/vXIapt+85+06hjd08jnjMuRM/1aOLrhjdipqvClGPLlTjTqvYuyUQZws0TZAo8qOPBEK2EaI2u5W1whtyA== + version "8.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.1.1.tgz#c00aa09b5be5d588bd69084368273d4e3cc9770f" + integrity sha512-KfjT1LToDx5Pc/XBsqP7sYHGeVwtHHJaoxlkyUPcoi+7K8w8kgDUSE9XRVe3zpTzrI6xa3x9Tr8808xQWiO+9A== dependencies: "@ember-data/rfc395-data" "^0.0.4" ember-rfc176-data "^0.3.12" From a158f0115aaa310463690c305ff05d099c4b22f1 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 7 Apr 2020 07:15:10 +0000 Subject: [PATCH 648/879] build(deps): bump miragejs from 0.1.35 to 0.1.37 Bumps [miragejs](https://github.com/miragejs/miragejs) from 0.1.35 to 0.1.37. - [Release notes](https://github.com/miragejs/miragejs/releases) - [Changelog](https://github.com/miragejs/miragejs/blob/master/CHANGELOG.md) - [Commits](https://github.com/miragejs/miragejs/compare/v0.1.35...v0.1.37) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index 0fcfb9e11..18772f683 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10406,9 +10406,9 @@ minipass@^2.2.0: yallist "^3.0.0" miragejs@^0.1.31: - version "0.1.35" - resolved "https://registry.yarnpkg.com/miragejs/-/miragejs-0.1.35.tgz#7fb64c03ccdc2495a510ed46033d6ac4ff1fa661" - integrity sha512-JxkOxkWcDkzUiHDKWT+7aVJX0rqJqyIHTB+SSWtwr3k6EY86ETKH1aIe7kpNL3WfM+fCQbV24bcJ1Ei5a8dldQ== + version "0.1.37" + resolved "https://registry.yarnpkg.com/miragejs/-/miragejs-0.1.37.tgz#e6b5bc3831490fe203248478c7bd160a70926bd5" + integrity sha512-noJV8pt3MUuSPrqvGlT+3HJbq+YYnvJG+3sjGEfKL9K5nQJBKqvn2FETvUQqc5U5hJItsMNlmi/ra4muCC5zeA== dependencies: "@miragejs/pretender-node-polyfill" "^0.1.0" inflected "^2.0.4" @@ -10435,7 +10435,7 @@ miragejs@^0.1.31: lodash.uniq "^4.5.0" lodash.uniqby "^4.7.0" lodash.values "^4.3.0" - pretender "3.3.1" + pretender "3.4.0" mississippi@^3.0.0: version "3.0.0" @@ -11536,14 +11536,13 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -pretender@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.3.1.tgz#74a188b0786601959ee8ffaefc9230d24fa7fa5b" - integrity sha512-fFtl0bfW1ay6zMGqok2Lkhpz8yjm8Pdk+fsQAX+Aeqw0LKZNaDs2VQt8qEKTNWvs5UKVUwNfcuHjVmuG7rZKhQ== +pretender@3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.4.0.tgz#0ccd943eccff48126bcbb912acaf9c33b0829785" + integrity sha512-BxmCnuVOchuP1am8p038XhSDDrRXX0bNqp6GRJPu/VcnWNFssy/BIHBefMcB535lHfMeelonkIP1ETtHEHjOVQ== dependencies: fake-xml-http-request "^2.1.1" route-recognizer "^0.3.3" - whatwg-fetch "^3.0.0" pretty-hrtime@^1.0.3: version "1.0.3" From 0373fa6069e713b0e03237e439c350f2b5411b17 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2020 07:04:15 +0000 Subject: [PATCH 649/879] build(deps-dev): bump fastboot from 3.0.2 to 3.0.3 Bumps [fastboot](https://github.com/ember-fastboot/fastboot) from 3.0.2 to 3.0.3. - [Release notes](https://github.com/ember-fastboot/fastboot/releases) - [Changelog](https://github.com/ember-fastboot/fastboot/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-fastboot/fastboot/compare/v3.0.2...v3.0.3) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 18772f683..c8492b5bc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7436,9 +7436,9 @@ fastboot@^2.0.0, fastboot@^2.0.1: source-map-support "^0.5.0" fastboot@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-3.0.2.tgz#7e1c5ecc662569c7a2a4973b8d69d02dde9d17cd" - integrity sha512-nDjtaTTeJ1QSDTwoE8XqXp65i1jnasrv0tK3+mk/4fsViImhZ66k1bgQSvFL9z088syC4DnawLCZgvdrCrICHQ== + version "3.0.3" + resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-3.0.3.tgz#927a271b192cf9c0f51a19085a3beedcbf633a96" + integrity sha512-n5yhOYo2EosdzepGbgFIyvRSulisdSZFzcFmE+VnE7p6nUx/SEpQyM7aIdphDxqFwZiHx90nYyETkKcGyvM63g== dependencies: chalk "^3.0.0" cookie "^0.4.0" From f7239fbff6b6b753ee909ffb1321dd16eb117087 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 9 Apr 2020 07:12:13 +0000 Subject: [PATCH 650/879] build(deps-dev): bump ember-cli-htmlbars from 4.2.3 to 4.3.0 Bumps [ember-cli-htmlbars](https://github.com/ember-cli/ember-cli-htmlbars) from 4.2.3 to 4.3.0. - [Release notes](https://github.com/ember-cli/ember-cli-htmlbars/releases) - [Changelog](https://github.com/ember-cli/ember-cli-htmlbars/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-cli-htmlbars/compare/v4.2.3...v4.3.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index c8492b5bc..7ba00b32a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5960,9 +5960,9 @@ ember-cli-htmlbars@^3.0.0, ember-cli-htmlbars@^3.0.1: strip-bom "^3.0.0" ember-cli-htmlbars@^4.0.5, ember-cli-htmlbars@^4.0.7: - version "4.2.3" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.2.3.tgz#ca1a4ce3806594f0a69a1ada3eed749a125cc2bf" - integrity sha512-AA5N5a7T+9Bc3m+5X076WFYIN4EQL0o/g8acPBZnEolFJhc3TmnSlWay4JwEuvszA1MLFKmZET/VD9CfRw8+EQ== + version "4.3.0" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.3.0.tgz#841b16f59076b13664a2bb9b8e94902f35c3c18c" + integrity sha512-/UlxHqKWEw8xDDANleh1onLK0ekJ54Ky76tl0XG2+Uo5TqFzLB8U9WMQhjbitBlV/CnMQc08ujZB+vAWvegdvQ== dependencies: "@ember/edition-utils" "^1.2.0" babel-plugin-htmlbars-inline-precompile "^3.0.1" From c3143a842a7a16944c9e0637ad6b6b9affcf8398 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 10 Apr 2020 07:07:23 +0000 Subject: [PATCH 651/879] build(deps-dev): bump ember-cli-htmlbars from 4.3.0 to 4.3.1 Bumps [ember-cli-htmlbars](https://github.com/ember-cli/ember-cli-htmlbars) from 4.3.0 to 4.3.1. - [Release notes](https://github.com/ember-cli/ember-cli-htmlbars/releases) - [Changelog](https://github.com/ember-cli/ember-cli-htmlbars/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-cli-htmlbars/compare/v4.3.0...v4.3.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 7ba00b32a..1f803d587 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5960,9 +5960,9 @@ ember-cli-htmlbars@^3.0.0, ember-cli-htmlbars@^3.0.1: strip-bom "^3.0.0" ember-cli-htmlbars@^4.0.5, ember-cli-htmlbars@^4.0.7: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.3.0.tgz#841b16f59076b13664a2bb9b8e94902f35c3c18c" - integrity sha512-/UlxHqKWEw8xDDANleh1onLK0ekJ54Ky76tl0XG2+Uo5TqFzLB8U9WMQhjbitBlV/CnMQc08ujZB+vAWvegdvQ== + version "4.3.1" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.3.1.tgz#4af8adc21ab3c4953f768956b7f7d207782cb175" + integrity sha512-CW6AY/yzjeVqoRtItOKj3hcYzc5dWPRETmeCzr2Iqjt5vxiVtpl0z5VTqHqIlT5fsFx6sGWBQXNHIe+ivYsxXQ== dependencies: "@ember/edition-utils" "^1.2.0" babel-plugin-htmlbars-inline-precompile "^3.0.1" From 607b8317bcd8ebc02252a08730c0482aa56425e9 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 10 Apr 2020 07:07:44 +0000 Subject: [PATCH 652/879] build(deps-dev): bump ember-cli-fastboot from 2.2.1 to 2.2.2 Bumps [ember-cli-fastboot](https://github.com/ember-fastboot/ember-cli-fastboot) from 2.2.1 to 2.2.2. - [Release notes](https://github.com/ember-fastboot/ember-cli-fastboot/releases) - [Changelog](https://github.com/ember-fastboot/ember-cli-fastboot/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-fastboot/ember-cli-fastboot/compare/v2.2.1...v2.2.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1f803d587..e500cf2b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4387,7 +4387,7 @@ cheerio@0.22.0, cheerio@^0.22.0: lodash.reject "^4.4.0" lodash.some "^4.4.0" -cheerio@^1.0.0-rc.2, cheerio@^1.0.0-rc.3: +cheerio@^1.0.0-rc.2: version "1.0.0-rc.3" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.3.tgz#094636d425b2e9c0f4eb91a46c05630c9a1a8bf6" integrity sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA== @@ -5889,9 +5889,9 @@ ember-cli-eslint@^5.1.0: walk-sync "^1.0.0" ember-cli-fastboot@^2.0.4: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ember-cli-fastboot/-/ember-cli-fastboot-2.2.1.tgz#8c646fe3f93331c61ba87149cfecf327de79826f" - integrity sha512-veT089wHsYNyx+IZyjG38+RMzHiiLNX2zwRAmv31VWT1NyaEcHv7+u9iOV3KdA1wVgpicJQ2PVIOw8OuIHo+1A== + version "2.2.2" + resolved "https://registry.yarnpkg.com/ember-cli-fastboot/-/ember-cli-fastboot-2.2.2.tgz#db7fdab8b5b37bb2ae2541790701527231029c25" + integrity sha512-j3pCxBRZdZIRVtfzbQ9TqkR0LLmnxa4Isjns9HD/ZnO7u8uzWfYmncqqJbgIwcWHHG8v6x8opNeYnx99WQhy9g== dependencies: broccoli-concat "^3.7.1" broccoli-file-creator "^2.1.1" @@ -5899,7 +5899,6 @@ ember-cli-fastboot@^2.0.4: broccoli-merge-trees "^3.0.1" broccoli-plugin "^1.3.1" chalk "^2.4.1" - cheerio "^1.0.0-rc.3" ember-cli-babel "^7.1.0" ember-cli-lodash-subset "2.0.1" ember-cli-preprocess-registry "^3.1.2" From 7f4982be15fdec413824300924e6889f378369de Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2020 07:14:10 +0000 Subject: [PATCH 653/879] build(deps-dev): bump eslint-plugin-ember from 8.1.1 to 8.2.0 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 8.1.1 to 8.2.0. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v8.1.1...v8.2.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index e500cf2b6..062aa0808 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6938,9 +6938,9 @@ esdoc@pzuraq/esdoc#015a342: taffydb "2.7.2" eslint-plugin-ember@^8.1.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.1.1.tgz#c00aa09b5be5d588bd69084368273d4e3cc9770f" - integrity sha512-KfjT1LToDx5Pc/XBsqP7sYHGeVwtHHJaoxlkyUPcoi+7K8w8kgDUSE9XRVe3zpTzrI6xa3x9Tr8808xQWiO+9A== + version "8.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.2.0.tgz#90c14c82a6e81280c27baaf64b62c1c4786b5f26" + integrity sha512-QJhqkYoLOoEm2jodozxztGA5nxvc6pmeUJCdhxIyDCCRGb7+E/FS6dfJ/WMqTbiePlmNJ0EZSOUgUG54LdHsRQ== dependencies: "@ember-data/rfc395-data" "^0.0.4" ember-rfc176-data "^0.3.12" From 1611254dc43e836d0d90b5ba56bb3960c98e19f5 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2020 07:14:39 +0000 Subject: [PATCH 654/879] build(deps-dev): bump qunit-dom from 1.1.0 to 1.2.0 Bumps [qunit-dom](https://github.com/simplabs/qunit-dom) from 1.1.0 to 1.2.0. - [Release notes](https://github.com/simplabs/qunit-dom/releases) - [Changelog](https://github.com/simplabs/qunit-dom/blob/master/CHANGELOG.md) - [Commits](https://github.com/simplabs/qunit-dom/compare/v1.1.0...v1.2.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/yarn.lock b/yarn.lock index 062aa0808..55bbb0d15 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3598,7 +3598,7 @@ broccoli-merge-trees@^2.0.0: broccoli-plugin "^1.3.0" merge-trees "^1.0.1" -broccoli-merge-trees@^4.1.0, broccoli-merge-trees@^4.2.0: +broccoli-merge-trees@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-4.2.0.tgz#692d3c163ecea08c5714a9434d664e628919f47c" integrity sha512-nTrQe5AQtCrW4enLRvbD/vTLHqyW2tz+vsLXQe4IEaUhepuMGVKJJr+I8n34Vu6fPjmPLwTjzNC8izMIDMtHPw== @@ -11738,12 +11738,12 @@ quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quick-temp@^0.1.8: underscore.string "~3.3.4" qunit-dom@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-1.1.0.tgz#ba830ff36a0b1e93483616156a7730f0c9b1d6f6" - integrity sha512-YYlM6LIBorgqqK8tU/0ggefi9o1QKVSKOO1gfXZb/Ng5MFI7PK1H9qaGHjWGomW8v6MaMYrYkMh6ISiLbdRzuQ== + version "1.2.0" + resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-1.2.0.tgz#464cca19e9976c4cee4b14b06da6645c03026880" + integrity sha512-8UqSimcDIo19nokb3eh+Z5hov07xDeLnwsWAgCYPFGcpUF/eiZAIHbLDPCixH0SM1YqCm4YGCLVCojY6sJD5xQ== dependencies: broccoli-funnel "^3.0.2" - broccoli-merge-trees "^4.1.0" + broccoli-merge-trees "^4.2.0" qunit@~2.6.0: version "2.6.2" From d7128e32561ef303d3ee9ab89c3a99ca19c12cd2 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 15 Apr 2020 07:05:01 +0000 Subject: [PATCH 655/879] build(deps-dev): bump eslint-plugin-ember from 8.2.0 to 8.3.0 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 8.2.0 to 8.3.0. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v8.2.0...v8.3.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 55bbb0d15..9560a20a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6938,9 +6938,9 @@ esdoc@pzuraq/esdoc#015a342: taffydb "2.7.2" eslint-plugin-ember@^8.1.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.2.0.tgz#90c14c82a6e81280c27baaf64b62c1c4786b5f26" - integrity sha512-QJhqkYoLOoEm2jodozxztGA5nxvc6pmeUJCdhxIyDCCRGb7+E/FS6dfJ/WMqTbiePlmNJ0EZSOUgUG54LdHsRQ== + version "8.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.3.0.tgz#64a1158ca7f51c150529eadd6396b4066ec6d053" + integrity sha512-uEDiZsEQm4N6ELtIPi/L+YecwD/4Z+3gFqMgHrgxd2Rz9WWQ5Y6IzM87+Nurmo456uB2NCZ8R+DMD1L+pKo7pw== dependencies: "@ember-data/rfc395-data" "^0.0.4" ember-rfc176-data "^0.3.12" From e4b94da31b84eecb0ed0903291a1b2894b3ca40b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 16 Apr 2020 07:01:58 +0000 Subject: [PATCH 656/879] build(deps-dev): bump eslint-plugin-ember from 8.3.0 to 8.4.0 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 8.3.0 to 8.4.0. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v8.3.0...v8.4.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9560a20a8..08bd4ed9a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6938,9 +6938,9 @@ esdoc@pzuraq/esdoc#015a342: taffydb "2.7.2" eslint-plugin-ember@^8.1.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.3.0.tgz#64a1158ca7f51c150529eadd6396b4066ec6d053" - integrity sha512-uEDiZsEQm4N6ELtIPi/L+YecwD/4Z+3gFqMgHrgxd2Rz9WWQ5Y6IzM87+Nurmo456uB2NCZ8R+DMD1L+pKo7pw== + version "8.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.4.0.tgz#bf66c1abf76b1039c8c253bf755b06382dd5c2b9" + integrity sha512-jzSpyA3+aQrEHydo3Tz8cNAbgmtYVlp0eSe8X52OsHYLdVc7i4vzMwA+ptfO06dzpLQNHWW5ziprB5hoAEt95A== dependencies: "@ember-data/rfc395-data" "^0.0.4" ember-rfc176-data "^0.3.12" From 32a9e64e38f6cc1eec2b5c508a3177465c5eec0d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 30 Apr 2020 07:06:24 +0000 Subject: [PATCH 657/879] build(deps): bump miragejs from 0.1.37 to 0.1.38 Bumps [miragejs](https://github.com/miragejs/miragejs) from 0.1.37 to 0.1.38. - [Release notes](https://github.com/miragejs/miragejs/releases) - [Changelog](https://github.com/miragejs/miragejs/blob/master/CHANGELOG.md) - [Commits](https://github.com/miragejs/miragejs/compare/v0.1.37...v0.1.38) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index 08bd4ed9a..94ce89c91 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10405,9 +10405,9 @@ minipass@^2.2.0: yallist "^3.0.0" miragejs@^0.1.31: - version "0.1.37" - resolved "https://registry.yarnpkg.com/miragejs/-/miragejs-0.1.37.tgz#e6b5bc3831490fe203248478c7bd160a70926bd5" - integrity sha512-noJV8pt3MUuSPrqvGlT+3HJbq+YYnvJG+3sjGEfKL9K5nQJBKqvn2FETvUQqc5U5hJItsMNlmi/ra4muCC5zeA== + version "0.1.38" + resolved "https://registry.yarnpkg.com/miragejs/-/miragejs-0.1.38.tgz#f2fd3f02d1470119c9aa654c9484785dcdd83e1a" + integrity sha512-6vw0U7QxR9aCHC+u7J+oaUeMxmxwgbUQLxglTINSzqNKfRgWSYk4XtZtgxmkOAheo2fzaNZa+XglbN1iAoRYUg== dependencies: "@miragejs/pretender-node-polyfill" "^0.1.0" inflected "^2.0.4" @@ -10434,7 +10434,7 @@ miragejs@^0.1.31: lodash.uniq "^4.5.0" lodash.uniqby "^4.7.0" lodash.values "^4.3.0" - pretender "3.4.0" + pretender "^3.4.0" mississippi@^3.0.0: version "3.0.0" @@ -11535,10 +11535,10 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -pretender@3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.4.0.tgz#0ccd943eccff48126bcbb912acaf9c33b0829785" - integrity sha512-BxmCnuVOchuP1am8p038XhSDDrRXX0bNqp6GRJPu/VcnWNFssy/BIHBefMcB535lHfMeelonkIP1ETtHEHjOVQ== +pretender@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.4.1.tgz#04345d99f0da8266f545ff377d4a9f23db9b99dd" + integrity sha512-qIQk0vKo739Dbx940Qq2hMZjIXHxWj9bDRQCfWSgoMWDfZTgn0bJ3lD0aJa37F5/MRzG5AtbYXf5JHzoXMsW/Q== dependencies: fake-xml-http-request "^2.1.1" route-recognizer "^0.3.3" From 4aecc926fa4b5e383d9208bf04c1b4384ecf253c Mon Sep 17 00:00:00 2001 From: Krystan HuffMenne Date: Sun, 7 Jun 2020 03:55:54 -0700 Subject: [PATCH 658/879] Fix moment (#1977) * Upgrade ember-cli-moment-shim `ember-moment` recommends running `ember g ember-moment` after upgrades, which just upgrades ember-cli-moment-shim to a compatible version. * Upgrade moment.js --- package.json | 2 +- yarn.lock | 21 +++++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 23647de46..f16d783ad 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "ember-cli-favicon": "^2.0.0", "ember-cli-htmlbars": "^4.0.5", "ember-cli-inject-live-reload": "^2.0.1", - "ember-cli-moment-shim": "^3.7.1", + "ember-cli-moment-shim": "^3.8.0", "ember-cli-qunit": "^4.4.0", "ember-cli-sri": "^2.1.1", "ember-cli-uglify": "^3.0.0", diff --git a/yarn.lock b/yarn.lock index 94ce89c91..aa5838543 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6001,18 +6001,19 @@ ember-cli-lodash-subset@2.0.1, ember-cli-lodash-subset@^2.0.1: resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-2.0.1.tgz#20cb68a790fe0fde2488ddfd8efbb7df6fe766f2" integrity sha1-IMtop5D+D94kiN39jvu332/nZvI= -ember-cli-moment-shim@^3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/ember-cli-moment-shim/-/ember-cli-moment-shim-3.7.1.tgz#3ad691c5027c1f38a4890fe47d74b5224cc98e32" - integrity sha512-U3HHuEU7sXQ78v25ifmIa9w4nQPQ7vK/LZ2bt18pN3aKNvIDYiLe/MDeXGmqfFIq3OfruKG+CF+7dOLqxuzSlQ== +ember-cli-moment-shim@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/ember-cli-moment-shim/-/ember-cli-moment-shim-3.8.0.tgz#dc61bbac9dce4963394e60dd42726d4ba38e2bc1" + integrity sha512-dN5ImjrjZevEqB7xhwFXaPWwxdKGSFiR1kqy9gDVB+A5EGnhCL1uveKugcyJE/MICVhXUAHBUu6G2LFWEPF2YA== dependencies: broccoli-funnel "^2.0.0" broccoli-merge-trees "^2.0.0" broccoli-source "^1.1.0" broccoli-stew "^1.5.0" chalk "^1.1.3" - ember-cli-babel "^6.6.0" + ember-cli-babel "^7.1.2" ember-cli-import-polyfill "^0.2.0" + ember-get-config "" lodash.defaults "^4.2.0" moment "^2.19.3" moment-timezone "^0.5.13" @@ -6429,7 +6430,7 @@ ember-fetch@^6.7.1: node-fetch "^2.6.0" whatwg-fetch "^3.0.0" -ember-get-config@^0.2.2, ember-get-config@^0.2.4: +ember-get-config@, ember-get-config@^0.2.2, ember-get-config@^0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.2.4.tgz#118492a2a03d73e46004ed777928942021fe1ecd" integrity sha1-EYSSoqA9c+RgBO13eSiUICH+Hs0= @@ -10491,10 +10492,10 @@ moment-timezone@^0.5.13: dependencies: moment ">= 2.9.0" -"moment@>= 2.9.0", moment@^2.19.3: - version "2.24.0" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" - integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== +moment@2.26.0, "moment@>= 2.9.0", moment@^2.19.3: + version "2.26.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.26.0.tgz#5e1f82c6bafca6e83e808b30c8705eed0dcbd39a" + integrity sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw== morgan@^1.9.0: version "1.10.0" From 90d00f79ce0f10495d1ea35202f7c286552a6858 Mon Sep 17 00:00:00 2001 From: Krystan HuffMenne Date: Fri, 29 May 2020 16:30:10 -0700 Subject: [PATCH 659/879] Replace getWithDefault (Fixes #1970) Deprecated by Ember RFC#554 --- addon/start-mirage.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/addon/start-mirage.js b/addon/start-mirage.js index 00b473c3c..d1ef3e517 100644 --- a/addon/start-mirage.js +++ b/addon/start-mirage.js @@ -1,4 +1,3 @@ -import { getWithDefault } from '@ember/object'; import readModules from './utils/read-modules'; import Server from './server'; import { singularize, pluralize } from 'ember-inflector'; @@ -30,10 +29,12 @@ export default function startMirage(owner, { env, baseConfig, testConfig } = {}) } let environment = env.environment; - let discoverEmberDataModels = getWithDefault(env['ember-cli-mirage'] || {}, 'discoverEmberDataModels', true); + let mirageEnvironment = env['ember-cli-mirage'] || {}; + let discoverEmberDataModels = mirageEnvironment.discoverEmberDataModels; + if (discoverEmberDataModels === undefined) { discoverEmberDataModels = true; } let modules = readModules(env.modulePrefix); let options = Object.assign(modules, {environment, baseConfig, testConfig, discoverEmberDataModels}); - options.trackRequests = env['ember-cli-mirage'].trackRequests; + options.trackRequests = mirageEnvironment.trackRequests; options.inflector = { singularize, pluralize }; return new Server(options); From bf3bbff01b3bc69eb49212fda85b14d0226bf304 Mon Sep 17 00:00:00 2001 From: Godfrey Chan Date: Mon, 8 Jun 2020 00:35:54 -0700 Subject: [PATCH 660/879] Fix discrepancy in lockfile (#1978) So `yarn install` doesn't produce a diff --- yarn.lock | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/yarn.lock b/yarn.lock index aa5838543..b9f8e9352 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6923,7 +6923,6 @@ esdoc-ecmascript-proposal-plugin@^1.0.0: esdoc@pzuraq/esdoc#015a342: version "1.0.4" - uid "015a3426b2e53b2b0270a9c00133780db3f1d144" resolved "https://codeload.github.com/pzuraq/esdoc/tar.gz/015a3426b2e53b2b0270a9c00133780db3f1d144" dependencies: babel-generator "6.26.0" @@ -10492,7 +10491,7 @@ moment-timezone@^0.5.13: dependencies: moment ">= 2.9.0" -moment@2.26.0, "moment@>= 2.9.0", moment@^2.19.3: +"moment@>= 2.9.0", moment@^2.19.3: version "2.26.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.26.0.tgz#5e1f82c6bafca6e83e808b30c8705eed0dcbd39a" integrity sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw== From d7c8151cb19ed9c91e3f53b2c89ac5bdbf610753 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2020 01:48:58 -0700 Subject: [PATCH 661/879] build(deps): [security] bump websocket-extensions from 0.1.3 to 0.1.4 (#1976) Bumps [websocket-extensions](https://github.com/faye/websocket-extensions-node) from 0.1.3 to 0.1.4. **This update includes a security fix.** - [Release notes](https://github.com/faye/websocket-extensions-node/releases) - [Changelog](https://github.com/faye/websocket-extensions-node/blob/master/CHANGELOG.md) - [Commits](https://github.com/faye/websocket-extensions-node/compare/0.1.3...0.1.4) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index b9f8e9352..013096f02 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14212,9 +14212,9 @@ websocket-driver@>=0.5.1: websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" - integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: version "1.0.5" From f2b3c3224ed5040ee5485ece898e4eb23b751ce3 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2020 01:49:47 -0700 Subject: [PATCH 662/879] build(deps): [security] bump jquery from 3.4.1 to 3.5.0 (#1950) Bumps [jquery](https://github.com/jquery/jquery) from 3.4.1 to 3.5.0. **This update includes security fixes.** - [Release notes](https://github.com/jquery/jquery/releases) - [Commits](https://github.com/jquery/jquery/compare/3.4.1...3.5.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 013096f02..f9cb963ae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9178,9 +9178,9 @@ jquery-deferred@^0.3.0: integrity sha1-WW7KHKr/VPYbEQlisjyv6nTDU1U= jquery@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2" - integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw== + version "3.5.0" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.0.tgz#9980b97d9e4194611c36530e7dc46a58d7340fc9" + integrity sha512-Xb7SVYMvygPxbFMpTFQiHh1J7HClEaThguL15N/Gg37Lri/qKyhRGZYzHRyLH8Stq3Aow0LsHO2O2ci86fCrNQ== js-reporters@1.2.1: version "1.2.1" From 357714027de4c66bb6692e9076a3b911682ae342 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2020 01:50:46 -0700 Subject: [PATCH 663/879] build(deps): bump broccoli-funnel from 3.0.2 to 3.0.3 (#1965) Bumps [broccoli-funnel](https://github.com/broccolijs/broccoli-funnel) from 3.0.2 to 3.0.3. - [Release notes](https://github.com/broccolijs/broccoli-funnel/releases) - [Changelog](https://github.com/broccolijs/broccoli-funnel/blob/master/CHANGELOG.md) - [Commits](https://github.com/broccolijs/broccoli-funnel/compare/v3.0.2...v3.0.3) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index f9cb963ae..91bb68664 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3524,9 +3524,9 @@ broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1, broccoli-funnel@^2.0.2: walk-sync "^0.3.1" broccoli-funnel@^3.0.0, broccoli-funnel@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.2.tgz#25e1c9a512b3852d3c9dde19ebdf07880d619c73" - integrity sha512-yRa7f0H/BtfqXNmL4eCYtAiVAQASI5b83//17MxAYp3I+w8XzGY8Tc3mwhdUrAgh6Zhb6LZwgvUZDZPTLmkK7w== + version "3.0.3" + resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.3.tgz#26fd42632471f67a91f4770d1987118087219937" + integrity sha512-LPzZ91BwStoHZXdXHQAJeYORl189OrRKM5NdIi86SDU9wZ4s/3lV1PRFOiobDT/jKM10voM7CDzfvicHbCYxAQ== dependencies: array-equal "^1.0.0" blank-object "^1.0.1" From e8d3d65d173a46562c72d4ea3faffa8c93b921c0 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2020 11:48:16 -0400 Subject: [PATCH 664/879] build(deps-dev): bump ember-composable-helpers from 3.1.1 to 4.1.2 (#1980) Bumps [ember-composable-helpers](https://github.com/DockYard/ember-composable-helpers) from 3.1.1 to 4.1.2. - [Release notes](https://github.com/DockYard/ember-composable-helpers/releases) - [Changelog](https://github.com/DockYard/ember-composable-helpers/blob/master/CHANGELOG.md) - [Commits](https://github.com/DockYard/ember-composable-helpers/compare/v3.1.1...v4.1.2) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index f16d783ad..f2ad12bfb 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "ember-cli-qunit": "^4.4.0", "ember-cli-sri": "^2.1.1", "ember-cli-uglify": "^3.0.0", - "ember-composable-helpers": "^3.0.1", + "ember-composable-helpers": "^4.1.2", "ember-data": "~3.14.0", "ember-disable-prototype-extensions": "^1.1.3", "ember-export-application-global": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index 91bb68664..34c562015 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6336,14 +6336,14 @@ ember-composable-helpers@^2.3.1: ember-cli-babel "^7.1.0" resolve "^1.10.0" -ember-composable-helpers@^3.0.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-3.1.1.tgz#9d663f4359fd54fd369ea60aa1915bf59113bcec" - integrity sha512-lPmPhk4wIg1JDnuOfzcDzrCZoaDoTvZrYVaBi4Eia2SdEEfcDNipQTXTk0yHFCvKfSjXjuNlTtNP9UANH58TzQ== +ember-composable-helpers@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.1.2.tgz#1ab2c65c3f053170a65c2e0dc0c37ddbb91f445c" + integrity sha512-jZWO0thLIybaWrCSOZj7yasYcJFanklLU69M2SeajEggVjjn4EIKYxtnSLXmZ0PNa8Tx9EzrHS1seLpVhL4A/Q== dependencies: "@babel/core" "^7.0.0" broccoli-funnel "2.0.1" - ember-cli-babel "^7.1.0" + ember-cli-babel "^7.11.1" resolve "^1.10.0" "ember-concurrency@^0.9.0 || ^0.10.0 || ^1.0.0": From ac63ae80f9031ebae564bda85ee208c973936a8d Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 8 Jun 2020 11:50:14 -0400 Subject: [PATCH 665/879] v1.1.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f2ad12bfb..ade9093d0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "1.1.6", + "version": "1.1.7", "description": "A client-side server to help you build, test and demo your Ember app", "keywords": [ "ember-addon", From c0851b0235cabcd325e517edba2fd893cc959c37 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2020 06:49:09 +0000 Subject: [PATCH 666/879] build(deps): bump miragejs from 0.1.38 to 0.1.40 Bumps [miragejs](https://github.com/miragejs/miragejs) from 0.1.38 to 0.1.40. - [Release notes](https://github.com/miragejs/miragejs/releases) - [Changelog](https://github.com/miragejs/miragejs/blob/master/CHANGELOG.md) - [Commits](https://github.com/miragejs/miragejs/compare/v0.1.38...v0.1.40) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index 34c562015..24307c8fd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10405,9 +10405,9 @@ minipass@^2.2.0: yallist "^3.0.0" miragejs@^0.1.31: - version "0.1.38" - resolved "https://registry.yarnpkg.com/miragejs/-/miragejs-0.1.38.tgz#f2fd3f02d1470119c9aa654c9484785dcdd83e1a" - integrity sha512-6vw0U7QxR9aCHC+u7J+oaUeMxmxwgbUQLxglTINSzqNKfRgWSYk4XtZtgxmkOAheo2fzaNZa+XglbN1iAoRYUg== + version "0.1.40" + resolved "https://registry.yarnpkg.com/miragejs/-/miragejs-0.1.40.tgz#5bcba7634312c012748ae7f294e1516b74b37182" + integrity sha512-7zxIcynzdS6425KZ2+TWD6F6DqESorulSDW2QBXf4iKyVn/J5vSielcubAK8sTKUefTPCrSRi7PwgNOb0JlmIg== dependencies: "@miragejs/pretender-node-polyfill" "^0.1.0" inflected "^2.0.4" @@ -10434,7 +10434,7 @@ miragejs@^0.1.31: lodash.uniq "^4.5.0" lodash.uniqby "^4.7.0" lodash.values "^4.3.0" - pretender "^3.4.0" + pretender "^3.4.3" mississippi@^3.0.0: version "3.0.0" @@ -11535,10 +11535,10 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -pretender@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.4.1.tgz#04345d99f0da8266f545ff377d4a9f23db9b99dd" - integrity sha512-qIQk0vKo739Dbx940Qq2hMZjIXHxWj9bDRQCfWSgoMWDfZTgn0bJ3lD0aJa37F5/MRzG5AtbYXf5JHzoXMsW/Q== +pretender@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.4.3.tgz#a3b4160516007075d29127262f3a0063d19896e9" + integrity sha512-AlbkBly9R8KR+R0sTCJ/ToOeEoUMtt52QVCetui5zoSmeLOU3S8oobFsyPLm1O2txR6t58qDNysqPnA1vVi8Hg== dependencies: fake-xml-http-request "^2.1.1" route-recognizer "^0.3.3" From 6a12ef31157ef7a64c2eac723d0b85458ca7bc28 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2020 06:50:05 +0000 Subject: [PATCH 667/879] build(deps-dev): bump ember-composable-helpers from 4.1.2 to 4.1.3 Bumps [ember-composable-helpers](https://github.com/DockYard/ember-composable-helpers) from 4.1.2 to 4.1.3. - [Release notes](https://github.com/DockYard/ember-composable-helpers/releases) - [Changelog](https://github.com/DockYard/ember-composable-helpers/blob/master/CHANGELOG.md) - [Commits](https://github.com/DockYard/ember-composable-helpers/compare/v4.1.2...v4.1.3) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 24307c8fd..fd22c4c5a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6337,9 +6337,9 @@ ember-composable-helpers@^2.3.1: resolve "^1.10.0" ember-composable-helpers@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.1.2.tgz#1ab2c65c3f053170a65c2e0dc0c37ddbb91f445c" - integrity sha512-jZWO0thLIybaWrCSOZj7yasYcJFanklLU69M2SeajEggVjjn4EIKYxtnSLXmZ0PNa8Tx9EzrHS1seLpVhL4A/Q== + version "4.1.3" + resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.1.3.tgz#0951d850e202edf53d10e1cd6729e249cd07e136" + integrity sha512-dcst8g9+VOqO7/ZNAs2WIHF9sO9v5xFd9cArTcymrospzw4XdekmPv/yuuD5tcydfj+1HI6wTrmWXAeElpB29Q== dependencies: "@babel/core" "^7.0.0" broccoli-funnel "2.0.1" From e27a6f7fed6687ab3b7c3b02f5a9ae492133be6d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2020 06:49:34 +0000 Subject: [PATCH 668/879] build(deps-dev): bump js-yaml from 3.13.1 to 3.14.0 Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 3.13.1 to 3.14.0. - [Release notes](https://github.com/nodeca/js-yaml/releases) - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/3.13.1...3.14.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index fd22c4c5a..9968b1ded 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9203,9 +9203,9 @@ js-tokens@^3.0.2: integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= js-yaml@^3.12.0, js-yaml@^3.12.1, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.3.0: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== dependencies: argparse "^1.0.7" esprima "^4.0.0" From b56a37f5c08593da02e6b48a70d6e23daf1b67d2 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2020 07:04:08 +0000 Subject: [PATCH 669/879] build(deps-dev): bump fastboot from 3.0.3 to 3.1.0 Bumps [fastboot](https://github.com/ember-fastboot/fastboot) from 3.0.3 to 3.1.0. - [Release notes](https://github.com/ember-fastboot/fastboot/releases) - [Changelog](https://github.com/ember-fastboot/fastboot/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-fastboot/fastboot/compare/v3.0.3...v3.1.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9968b1ded..c0292e7b8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7435,13 +7435,14 @@ fastboot@^2.0.0, fastboot@^2.0.1: source-map-support "^0.5.0" fastboot@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-3.0.3.tgz#927a271b192cf9c0f51a19085a3beedcbf633a96" - integrity sha512-n5yhOYo2EosdzepGbgFIyvRSulisdSZFzcFmE+VnE7p6nUx/SEpQyM7aIdphDxqFwZiHx90nYyETkKcGyvM63g== + version "3.1.0" + resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-3.1.0.tgz#e71a2d45c9b034f8a5909562a125888325100843" + integrity sha512-1GyX0seImE0l4Di/LVwTzL1XqXKECQvvDeEZmReNwMUDbsQxETGz3j7XUq/eWSxl1o4R/vZomvxOXdtae6kpfA== dependencies: chalk "^3.0.0" cookie "^0.4.0" debug "^4.1.1" + jsdom "^16.2.2" resolve "^1.15.0" simple-dom "^1.4.0" source-map-support "^0.5.16" From f8a7937ee35aaa629429354b44148670c8bf2f4e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2020 07:04:41 +0000 Subject: [PATCH 670/879] build(deps): bump ember-cli-babel from 7.19.0 to 7.20.5 Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 7.19.0 to 7.20.5. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v7.19.0...v7.20.5) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index c0292e7b8..eff720303 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2598,12 +2598,12 @@ babel-plugin-ember-data-packages-polyfill@^0.1.2: dependencies: "@ember-data/rfc395-data" "^0.0.4" -babel-plugin-ember-modules-api-polyfill@^2.12.0, babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-polyfill@^2.8.0: - version "2.12.0" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.12.0.tgz#a5e703205ba4e625a7fab9bb1aea64ef3222cf75" - integrity sha512-ZQU4quX0TJ1yYyosPy5PFigKdCFEVHJ6H0b3hwjxekIP9CDwzk0OhQuKhCOPti+d52VWjjCjxu2BrXEih29mFw== +babel-plugin-ember-modules-api-polyfill@^2.13.4, babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-polyfill@^2.8.0: + version "2.13.4" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.13.4.tgz#cf62bc9bfd808c48d810d5194f4329e9453bd603" + integrity sha512-uxQPkEQAzCYdwhZk16O9m1R4xtCRNy4oEUTBrccOPfzlIahRZJic/JeP/ZEL0BC6Mfq6r55eOg6gMF/zdFoCvA== dependencies: - ember-rfc176-data "^0.3.12" + ember-rfc176-data "^0.3.13" babel-plugin-feature-flags@^0.3.1: version "0.3.1" @@ -5757,9 +5757,9 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, semver "^5.5.0" ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.18.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: - version "7.19.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.19.0.tgz#e6eddea18a867231fcf90a80689e92b98be9a63b" - integrity sha512-HiWKuoyy35vGEr+iCw6gUnQ3pS5qslyTlKEDW8cVoMbvZNGYBgRxHed5nklVUh+BS74AwR9lsp25BTAagYAP9Q== + version "7.20.5" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.20.5.tgz#ab60dcf7371f4d86d41c2596c6d050470e283074" + integrity sha512-lWvKqJPQ1KJigWKmxREqFbXgZd2/nFKMg3chiiNejpsAIgGLPXGFLwpMQ7QYCRrlims7D/bnDgFvXuOLkw0fcQ== dependencies: "@babel/core" "^7.9.0" "@babel/helper-compilation-targets" "^7.8.7" @@ -5774,7 +5774,7 @@ ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cl amd-name-resolver "^1.2.1" babel-plugin-debug-macros "^0.3.0" babel-plugin-ember-data-packages-polyfill "^0.1.2" - babel-plugin-ember-modules-api-polyfill "^2.12.0" + babel-plugin-ember-modules-api-polyfill "^2.13.4" babel-plugin-module-resolver "^3.1.1" broccoli-babel-transpiler "^7.4.0" broccoli-debug "^0.6.4" @@ -6577,6 +6577,11 @@ ember-rfc176-data@^0.3.12: resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.12.tgz#90d82878e69e2ac9a5438e8ce14d12c6031c5bd2" integrity sha512-g9HeZj/gU5bfIIrGXkP7MhS2b3Vu5DfNUrYr14hy99TgIvtZETO+96QF4WOEUXGjIJdfTRjerVnQlqngPQSv1g== +ember-rfc176-data@^0.3.13: + version "0.3.13" + resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.13.tgz#ed1712a26e65fec703655f35410414aa1982cf3b" + integrity sha512-m9JbwQlT6PjY7x/T8HslnXP7Sz9bx/pz3FrNfNi2NesJnbNISly0Lix6NV1fhfo46572cpq4jrM+/6yYlMefTQ== + ember-router-generator@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-2.0.0.tgz#d04abfed4ba8b42d166477bbce47fccc672dbde0" From 521842a92200234a89c53145b0b22e5cfbd96ddf Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2020 07:03:57 +0000 Subject: [PATCH 671/879] build(deps-dev): bump ember-composable-helpers from 4.1.3 to 4.2.0 Bumps [ember-composable-helpers](https://github.com/DockYard/ember-composable-helpers) from 4.1.3 to 4.2.0. - [Release notes](https://github.com/DockYard/ember-composable-helpers/releases) - [Changelog](https://github.com/DockYard/ember-composable-helpers/blob/master/CHANGELOG.md) - [Commits](https://github.com/DockYard/ember-composable-helpers/compare/v4.1.3...v4.2.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index eff720303..2af02b794 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6337,9 +6337,9 @@ ember-composable-helpers@^2.3.1: resolve "^1.10.0" ember-composable-helpers@^4.1.2: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.1.3.tgz#0951d850e202edf53d10e1cd6729e249cd07e136" - integrity sha512-dcst8g9+VOqO7/ZNAs2WIHF9sO9v5xFd9cArTcymrospzw4XdekmPv/yuuD5tcydfj+1HI6wTrmWXAeElpB29Q== + version "4.2.0" + resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.2.0.tgz#7cccae6af12ded782eeec376fed2427a5dbdf7a6" + integrity sha512-+8TU4F+Gcv0muxPO14alES9f1A1Ljg3+Nlkkvxp0mLb4bAjgiUHLn8qf/IPYCd9e02R19ssiTODTR/+oQmsiVg== dependencies: "@babel/core" "^7.0.0" broccoli-funnel "2.0.1" From 6531b7349ab3d3a44a215161b748b6a8e36f1344 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2020 07:04:43 +0000 Subject: [PATCH 672/879] build(deps-dev): bump ember-cli-fastboot from 2.2.2 to 2.2.3 Bumps [ember-cli-fastboot](https://github.com/ember-fastboot/ember-cli-fastboot) from 2.2.2 to 2.2.3. - [Release notes](https://github.com/ember-fastboot/ember-cli-fastboot/releases) - [Changelog](https://github.com/ember-fastboot/ember-cli-fastboot/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-fastboot/ember-cli-fastboot/compare/v2.2.2...v2.2.3) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 2af02b794..e94c131e6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5889,9 +5889,9 @@ ember-cli-eslint@^5.1.0: walk-sync "^1.0.0" ember-cli-fastboot@^2.0.4: - version "2.2.2" - resolved "https://registry.yarnpkg.com/ember-cli-fastboot/-/ember-cli-fastboot-2.2.2.tgz#db7fdab8b5b37bb2ae2541790701527231029c25" - integrity sha512-j3pCxBRZdZIRVtfzbQ9TqkR0LLmnxa4Isjns9HD/ZnO7u8uzWfYmncqqJbgIwcWHHG8v6x8opNeYnx99WQhy9g== + version "2.2.3" + resolved "https://registry.yarnpkg.com/ember-cli-fastboot/-/ember-cli-fastboot-2.2.3.tgz#d32eba948b2790ec4b5429ff759a8dee932c1e55" + integrity sha512-RdKzTOXHi59VW6a9RB0muCQd15BmY95pWkQ9eLslyeLR38/Uh1EVP+kgWxzJTxODywmMJ9SWW2HPpvxxLDfCEw== dependencies: broccoli-concat "^3.7.1" broccoli-file-creator "^2.1.1" From c897759f0946f2bdb4d0ac4273e3bb2d8b195052 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 15 Jun 2020 07:14:35 +0000 Subject: [PATCH 673/879] build(deps-dev): bump eslint-plugin-ember from 8.4.0 to 8.7.0 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 8.4.0 to 8.7.0. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v8.4.0...v8.7.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index e94c131e6..1f1a4e91f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6572,11 +6572,6 @@ ember-responsive@^3.0.5: dependencies: ember-cli-babel "^6.6.0" -ember-rfc176-data@^0.3.12: - version "0.3.12" - resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.12.tgz#90d82878e69e2ac9a5438e8ce14d12c6031c5bd2" - integrity sha512-g9HeZj/gU5bfIIrGXkP7MhS2b3Vu5DfNUrYr14hy99TgIvtZETO+96QF4WOEUXGjIJdfTRjerVnQlqngPQSv1g== - ember-rfc176-data@^0.3.13: version "0.3.13" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.13.tgz#ed1712a26e65fec703655f35410414aa1982cf3b" @@ -6943,12 +6938,13 @@ esdoc@pzuraq/esdoc#015a342: taffydb "2.7.2" eslint-plugin-ember@^8.1.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.4.0.tgz#bf66c1abf76b1039c8c253bf755b06382dd5c2b9" - integrity sha512-jzSpyA3+aQrEHydo3Tz8cNAbgmtYVlp0eSe8X52OsHYLdVc7i4vzMwA+ptfO06dzpLQNHWW5ziprB5hoAEt95A== + version "8.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.7.0.tgz#71b8c7a79e64fbf1c6e29a1a0c3e3546ed207b77" + integrity sha512-DUQISEtMi1ysIhnL1pdXcrYYnv7qf7AgKC1PMC2e8FzX7h39gQlC6x3+6sAij2wYGAsl1tShVk6hgLFWC61vEw== dependencies: "@ember-data/rfc395-data" "^0.0.4" - ember-rfc176-data "^0.3.12" + ember-rfc176-data "^0.3.13" + lodash.kebabcase "^4.1.1" snake-case "^3.0.3" eslint-plugin-es@^3.0.0: @@ -9850,6 +9846,11 @@ lodash.isplainobject@^4.0.6: resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= +lodash.kebabcase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" + integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY= + lodash.keys@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" From c574c3909cb94b72f8d8058abd1c02c33ecb6a2b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 15 Jun 2020 07:15:16 +0000 Subject: [PATCH 674/879] build(deps-dev): bump ember-composable-helpers from 4.2.0 to 4.2.1 Bumps [ember-composable-helpers](https://github.com/DockYard/ember-composable-helpers) from 4.2.0 to 4.2.1. - [Release notes](https://github.com/DockYard/ember-composable-helpers/releases) - [Changelog](https://github.com/DockYard/ember-composable-helpers/blob/master/CHANGELOG.md) - [Commits](https://github.com/DockYard/ember-composable-helpers/compare/v4.2.0...v4.2.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1f1a4e91f..dc73407c0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6337,9 +6337,9 @@ ember-composable-helpers@^2.3.1: resolve "^1.10.0" ember-composable-helpers@^4.1.2: - version "4.2.0" - resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.2.0.tgz#7cccae6af12ded782eeec376fed2427a5dbdf7a6" - integrity sha512-+8TU4F+Gcv0muxPO14alES9f1A1Ljg3+Nlkkvxp0mLb4bAjgiUHLn8qf/IPYCd9e02R19ssiTODTR/+oQmsiVg== + version "4.2.1" + resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.2.1.tgz#2a123c96b8c40076fa560591dc384fe66d3ef2c4" + integrity sha512-kuRA1MuEb49Pe7OZiOT++KR9Yq10cMoE1FiRNxzn3ldeM1puG83VxWdKdHSvBMIbEjR4KAyT1SgXyaaShH2Nzw== dependencies: "@babel/core" "^7.0.0" broccoli-funnel "2.0.1" From 52c3a874e5c8cc7a240071b103e9ca5ff6fcc5b4 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 15 Jun 2020 07:45:55 +0000 Subject: [PATCH 675/879] build(deps): bump ember-cli-babel from 7.20.5 to 7.21.0 Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 7.20.5 to 7.21.0. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v7.20.5...v7.21.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 1100 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 681 insertions(+), 419 deletions(-) diff --git a/yarn.lock b/yarn.lock index dc73407c0..0a6ff2505 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14,28 +14,35 @@ dependencies: "@babel/highlight" "^7.8.3" -"@babel/compat-data@^7.8.6", "@babel/compat-data@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.0.tgz#04815556fc90b0c174abd2c0c1bb966faa036a6c" - integrity sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g== +"@babel/code-frame@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.1.tgz#d5481c5095daa1c57e16e54c6f9198443afb49ff" + integrity sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw== + dependencies: + "@babel/highlight" "^7.10.1" + +"@babel/compat-data@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.1.tgz#b1085ffe72cd17bf2c0ee790fc09f9626011b2db" + integrity sha512-CHvCj7So7iCkGKPRFUfryXIkU2gSBw7VSZFYLsqVhrS47269VK2Hfi9S/YcublPMW8k1u2bQBlbDruoQEm4fgw== dependencies: - browserslist "^4.9.1" + browserslist "^4.12.0" invariant "^2.2.4" semver "^5.5.0" -"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.2.2", "@babel/core@^7.3.4", "@babel/core@^7.8.3", "@babel/core@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" - integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.0" - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helpers" "^7.9.0" - "@babel/parser" "^7.9.0" - "@babel/template" "^7.8.6" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" +"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.10.2", "@babel/core@^7.2.2", "@babel/core@^7.3.4": + version "7.10.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.2.tgz#bd6786046668a925ac2bd2fd95b579b92a23b36a" + integrity sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ== + dependencies: + "@babel/code-frame" "^7.10.1" + "@babel/generator" "^7.10.2" + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helpers" "^7.10.1" + "@babel/parser" "^7.10.2" + "@babel/template" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.2" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" @@ -45,6 +52,16 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/generator@^7.10.1", "@babel/generator@^7.10.2": + version "7.10.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.2.tgz#0fa5b5b2389db8bfdfcc3492b551ee20f5dd69a9" + integrity sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA== + dependencies: + "@babel/types" "^7.10.2" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + "@babel/generator@^7.9.0": version "7.9.4" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.4.tgz#12441e90c3b3c4159cdecf312075bf1a8ce2dbce" @@ -55,6 +72,13 @@ lodash "^4.17.13" source-map "^0.5.0" +"@babel/helper-annotate-as-pure@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz#f6d08acc6f70bbd59b436262553fb2e259a1a268" + integrity sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw== + dependencies: + "@babel/types" "^7.10.1" + "@babel/helper-annotate-as-pure@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" @@ -62,25 +86,37 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" - integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz#0ec7d9be8174934532661f87783eb18d72290059" + integrity sha512-cQpVq48EkYxUU0xozpGCLla3wlkdRRqLWu1ksFMXA9CM5KQmyyRpSEsYXbao7JUkOw/tAaYKCaYyZq6HOFYtyw== dependencies: - "@babel/helper-explode-assignable-expression" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/helper-explode-assignable-expression" "^7.10.1" + "@babel/types" "^7.10.1" -"@babel/helper-compilation-targets@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde" - integrity sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw== +"@babel/helper-compilation-targets@^7.10.2": + version "7.10.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz#a17d9723b6e2c750299d2a14d4637c76936d8285" + integrity sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA== dependencies: - "@babel/compat-data" "^7.8.6" - browserslist "^4.9.1" + "@babel/compat-data" "^7.10.1" + browserslist "^4.12.0" invariant "^2.2.4" levenary "^1.1.1" semver "^5.5.0" +"@babel/helper-create-class-features-plugin@^7.10.1": + version "7.10.2" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.2.tgz#7474295770f217dbcf288bf7572eb213db46ee67" + integrity sha512-5C/QhkGFh1vqcziq1vAL6SI9ymzUp8BCYjFpvYVhWP4DlATIb3u5q3iUd35mvlyGs8fO7hckkW7i0tmH+5+bvQ== + dependencies: + "@babel/helper-function-name" "^7.10.1" + "@babel/helper-member-expression-to-functions" "^7.10.1" + "@babel/helper-optimise-call-expression" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-replace-supers" "^7.10.1" + "@babel/helper-split-export-declaration" "^7.10.1" + "@babel/helper-create-class-features-plugin@^7.8.3": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz#243a5b46e2f8f0f674dc1387631eb6b28b851de0" @@ -93,6 +129,15 @@ "@babel/helper-replace-supers" "^7.8.6" "@babel/helper-split-export-declaration" "^7.8.3" +"@babel/helper-create-regexp-features-plugin@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz#1b8feeab1594cbcfbf3ab5a3bbcabac0468efdbd" + integrity sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-regex" "^7.10.1" + regexpu-core "^4.7.0" + "@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8": version "7.8.8" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087" @@ -102,22 +147,31 @@ "@babel/helper-regex" "^7.8.3" regexpu-core "^4.7.0" -"@babel/helper-define-map@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15" - integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== +"@babel/helper-define-map@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz#5e69ee8308648470dd7900d159c044c10285221d" + integrity sha512-+5odWpX+OnvkD0Zmq7panrMuAGQBu6aPUgvMzuMGo4R+jUOvealEj2hiqI6WhxgKrTpFoFj0+VdsuA8KDxHBDg== dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/helper-function-name" "^7.10.1" + "@babel/types" "^7.10.1" lodash "^4.17.13" -"@babel/helper-explode-assignable-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" - integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw== +"@babel/helper-explode-assignable-expression@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.1.tgz#e9d76305ee1162ca467357ae25df94f179af2b7e" + integrity sha512-vcUJ3cDjLjvkKzt6rHrl767FeE7pMEYfPanq5L16GRtrXIoznc0HykNW2aEYkcnP76P0isoqJ34dDMFZwzEpJg== dependencies: - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helper-function-name@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz#92bd63829bfc9215aca9d9defa85f56b539454f4" + integrity sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ== + dependencies: + "@babel/helper-get-function-arity" "^7.10.1" + "@babel/template" "^7.10.1" + "@babel/types" "^7.10.1" "@babel/helper-function-name@^7.8.3": version "7.8.3" @@ -128,6 +182,13 @@ "@babel/template" "^7.8.3" "@babel/types" "^7.8.3" +"@babel/helper-get-function-arity@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz#7303390a81ba7cb59613895a192b93850e373f7d" + integrity sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw== + dependencies: + "@babel/types" "^7.10.1" + "@babel/helper-get-function-arity@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" @@ -135,12 +196,19 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-hoist-variables@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134" - integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg== +"@babel/helper-hoist-variables@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.1.tgz#7e77c82e5dcae1ebf123174c385aaadbf787d077" + integrity sha512-vLm5srkU8rI6X3+aQ1rQJyfjvCBLXP8cAGeuw04zeAM2ItKb1e7pmVmLyHb4sDaAYnLL13RHOZPLEtcGZ5xvjg== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.10.1" + +"@babel/helper-member-expression-to-functions@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz#432967fd7e12a4afef66c4687d4ca22bc0456f15" + integrity sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g== + dependencies: + "@babel/types" "^7.10.1" "@babel/helper-member-expression-to-functions@^7.8.3": version "7.8.3" @@ -149,6 +217,13 @@ dependencies: "@babel/types" "^7.8.3" +"@babel/helper-module-imports@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz#dd331bd45bccc566ce77004e9d05fe17add13876" + integrity sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg== + dependencies: + "@babel/types" "^7.10.1" + "@babel/helper-module-imports@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" @@ -156,19 +231,26 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-module-transforms@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" - integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== - dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-simple-access" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/template" "^7.8.6" - "@babel/types" "^7.9.0" +"@babel/helper-module-transforms@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz#24e2f08ee6832c60b157bb0936c86bef7210c622" + integrity sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg== + dependencies: + "@babel/helper-module-imports" "^7.10.1" + "@babel/helper-replace-supers" "^7.10.1" + "@babel/helper-simple-access" "^7.10.1" + "@babel/helper-split-export-declaration" "^7.10.1" + "@babel/template" "^7.10.1" + "@babel/types" "^7.10.1" lodash "^4.17.13" +"@babel/helper-optimise-call-expression@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz#b4a1f2561870ce1247ceddb02a3860fa96d72543" + integrity sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg== + dependencies: + "@babel/types" "^7.10.1" + "@babel/helper-optimise-call-expression@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" @@ -181,6 +263,18 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== +"@babel/helper-plugin-utils@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz#ec5a5cf0eec925b66c60580328b122c01230a127" + integrity sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA== + +"@babel/helper-regex@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.1.tgz#021cf1a7ba99822f993222a001cc3fec83255b96" + integrity sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g== + dependencies: + lodash "^4.17.13" + "@babel/helper-regex@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" @@ -188,18 +282,28 @@ dependencies: lodash "^4.17.13" -"@babel/helper-remap-async-to-generator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86" - integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA== +"@babel/helper-remap-async-to-generator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz#bad6aaa4ff39ce8d4b82ccaae0bfe0f7dbb5f432" + integrity sha512-RfX1P8HqsfgmJ6CwaXGKMAqbYdlleqglvVtht0HGPMSsy2V6MqLlOJVF/0Qyb/m2ZCi2z3q3+s6Pv7R/dQuZ6A== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-wrap-function" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-wrap-function" "^7.10.1" + "@babel/template" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" -"@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6": +"@babel/helper-replace-supers@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz#ec6859d20c5d8087f6a2dc4e014db7228975f13d" + integrity sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.10.1" + "@babel/helper-optimise-call-expression" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helper-replace-supers@^7.8.6": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== @@ -209,13 +313,20 @@ "@babel/traverse" "^7.8.6" "@babel/types" "^7.8.6" -"@babel/helper-simple-access@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" - integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== +"@babel/helper-simple-access@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz#08fb7e22ace9eb8326f7e3920a1c2052f13d851e" + integrity sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw== dependencies: - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/template" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helper-split-export-declaration@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz#c6f4be1cbc15e3a868e4c64a17d5d31d754da35f" + integrity sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g== + dependencies: + "@babel/types" "^7.10.1" "@babel/helper-split-export-declaration@^7.8.3": version "7.8.3" @@ -224,29 +335,43 @@ dependencies: "@babel/types" "^7.8.3" +"@babel/helper-validator-identifier@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz#5770b0c1a826c4f53f5ede5e153163e0318e94b5" + integrity sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw== + "@babel/helper-validator-identifier@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" integrity sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw== -"@babel/helper-wrap-function@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" - integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ== +"@babel/helper-wrap-function@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz#956d1310d6696257a7afd47e4c42dfda5dfcedc9" + integrity sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ== dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/helper-function-name" "^7.10.1" + "@babel/template" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" -"@babel/helpers@^7.9.0": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" - integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== +"@babel/helpers@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.1.tgz#a6827b7cb975c9d9cef5fd61d919f60d8844a973" + integrity sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw== dependencies: - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" + "@babel/template" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/highlight@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.1.tgz#841d098ba613ba1a427a2b383d79e35552c38ae0" + integrity sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg== + dependencies: + "@babel/helper-validator-identifier" "^7.10.1" + chalk "^2.0.0" + js-tokens "^4.0.0" "@babel/highlight@^7.8.3": version "7.9.0" @@ -257,54 +382,67 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/parser@^7.10.1", "@babel/parser@^7.10.2": + version "7.10.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.2.tgz#871807f10442b92ff97e4783b9b54f6a0ca812d0" + integrity sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ== + "@babel/parser@^7.3.4", "@babel/parser@^7.4.5", "@babel/parser@^7.7.0", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": version "7.9.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== -"@babel/plugin-proposal-async-generator-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" - integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw== +"@babel/plugin-proposal-async-generator-functions@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.1.tgz#6911af5ba2e615c4ff3c497fe2f47b35bf6d7e55" + integrity sha512-vzZE12ZTdB336POZjmpblWfNNRpMSua45EYnRigE2XsZxcXcIyly2ixnTJasJE4Zq3U7t2d8rRF7XRUuzHxbOw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-remap-async-to-generator" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-remap-async-to-generator" "^7.10.1" "@babel/plugin-syntax-async-generators" "^7.8.0" -"@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.3.4", "@babel/plugin-proposal-class-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e" - integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA== +"@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.10.1", "@babel/plugin-proposal-class-properties@^7.3.4": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz#046bc7f6550bb08d9bd1d4f060f5f5a4f1087e01" + integrity sha512-sqdGWgoXlnOdgMXU+9MbhzwFRgxVLeiGBqTrnuS7LC2IBU31wSsESbTUreT2O418obpfPdGUR2GbEufZF1bpqw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-create-class-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-proposal-decorators@^7.3.0", "@babel/plugin-proposal-decorators@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz#2156860ab65c5abf068c3f67042184041066543e" - integrity sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w== +"@babel/plugin-proposal-decorators@^7.10.1", "@babel/plugin-proposal-decorators@^7.3.0": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.10.1.tgz#9373c2d8db45345c6e30452ad77b469758e5c8f7" + integrity sha512-xBfteh352MTke2U1NpclzMDmAmCdQ2fBZjhZQQfGTjXw6qcRYMkt528sA1U8o0ThDCSeuETXIj5bOGdxN+5gkw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-decorators" "^7.8.3" + "@babel/helper-create-class-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-decorators" "^7.10.1" -"@babel/plugin-proposal-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" - integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w== +"@babel/plugin-proposal-dynamic-import@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz#e36979dc1dc3b73f6d6816fc4951da2363488ef0" + integrity sha512-Cpc2yUVHTEGPlmiQzXj026kqwjEQAD9I4ZC16uzdbgWgitg/UHKHLffKNCQZ5+y8jpIZPJcKcwsr2HwPh+w3XA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-syntax-dynamic-import" "^7.8.0" -"@babel/plugin-proposal-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" - integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q== +"@babel/plugin-proposal-json-strings@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.1.tgz#b1e691ee24c651b5a5e32213222b2379734aff09" + integrity sha512-m8r5BmV+ZLpWPtMY2mOKN7wre6HIO4gfIiV+eOmsnZABNenrt/kzYBwrh+KOfgumSWpnlGs5F70J8afYMSJMBg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-syntax-json-strings" "^7.8.0" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.4.4", "@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz#02dca21673842ff2fe763ac253777f235e9bbf78" + integrity sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.4.4": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== @@ -312,31 +450,40 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/plugin-proposal-numeric-separator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" - integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ== +"@babel/plugin-proposal-numeric-separator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.1.tgz#a9a38bc34f78bdfd981e791c27c6fdcec478c123" + integrity sha512-jjfym4N9HtCiNfyyLAVD8WqPYeHUrw4ihxuAynWj6zzp2gf9Ey2f7ImhFm6ikB3CLf5Z/zmcJDri6B4+9j9RsA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-numeric-separator" "^7.10.1" -"@babel/plugin-proposal-object-rest-spread@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz#a28993699fc13df165995362693962ba6b061d6f" - integrity sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow== +"@babel/plugin-proposal-object-rest-spread@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz#cba44908ac9f142650b4a65b8aa06bf3478d5fb6" + integrity sha512-Z+Qri55KiQkHh7Fc4BW6o+QBuTagbOp9txE+4U1i79u9oWlf2npkiDx+Rf3iK3lbcHBuNy9UOkwuR5wOMH3LIQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.10.1" -"@babel/plugin-proposal-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" - integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== +"@babel/plugin-proposal-optional-catch-binding@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz#c9f86d99305f9fa531b568ff5ab8c964b8b223d2" + integrity sha512-VqExgeE62YBqI3ogkGoOJp1R6u12DFZjqwJhqtKc2o5m1YTUuUWnos7bZQFBhwkxIFpWYJ7uB75U7VAPPiKETA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.6.0", "@babel/plugin-proposal-optional-chaining@^7.9.0": +"@babel/plugin-proposal-optional-chaining@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.1.tgz#15f5d6d22708629451a91be28f8facc55b0e818c" + integrity sha512-dqQj475q8+/avvok72CF3AOSV/SGEcH29zT5hhohqqvvZ2+boQoOr7iGldBG5YXTO2qgCgc2B3WvVLUdbeMlGA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@^7.6.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w== @@ -344,7 +491,23 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": +"@babel/plugin-proposal-private-methods@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.1.tgz#ed85e8058ab0fe309c3f448e5e1b73ca89cdb598" + integrity sha512-RZecFFJjDiQ2z6maFprLgrdnm0OzoC23Mx89xf1CcEsxmHuzuXOdniEuI+S3v7vjQG4F5sa6YtUp+19sZuSxHg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-proposal-unicode-property-regex@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.1.tgz#dc04feb25e2dd70c12b05d680190e138fa2c0c6f" + integrity sha512-JjfngYRvwmPwmnbRZyNiPFI8zxCZb8euzbCG/LxyKdeTb59tVciKo9GK9bi6JYKInk1H11Dq9j/zRqIH4KigfQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.8.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d" integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A== @@ -359,12 +522,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-decorators@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz#8d2c15a9f1af624b0025f961682a9d53d3001bda" - integrity sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ== +"@babel/plugin-syntax-class-properties@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz#d5bc0645913df5b17ad7eda0fa2308330bde34c5" + integrity sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-decorators@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.1.tgz#16b869c4beafc9a442565147bda7ce0967bd4f13" + integrity sha512-a9OAbQhKOwSle1Vr0NJu/ISg1sPfdEkfRKWpgPuzhnWWzForou2gIeUIIwjAMHRekhhpJ7eulZlYs0H14Cbi+g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-syntax-dynamic-import@^7.2.0", "@babel/plugin-syntax-dynamic-import@^7.8.0": version "7.8.3" @@ -387,12 +557,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" - integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== +"@babel/plugin-syntax-numeric-separator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz#25761ee7410bc8cf97327ba741ee94e4a61b7d99" + integrity sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-syntax-object-rest-spread@^7.8.0": version "7.8.3" @@ -415,12 +585,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391" - integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g== +"@babel/plugin-syntax-top-level-await@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.1.tgz#8b8733f8c57397b3eaa47ddba8841586dcaef362" + integrity sha512-hgA5RYkmZm8FTFT3yu2N9Bx7yVVOKYT6yEdXXo6j2JTm0wNxgqaGeQVaSHRjhfnQbX91DtjFB6McRFSlcJH3xQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-typescript@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.1.tgz#5e82bc27bb4202b93b949b029e699db536733810" + integrity sha512-X/d8glkrAtra7CaQGMiGs/OGa6XgUzqPcBXCIGFCpCqnfGlT0Wfbzo/B89xHhnInTaItPK8LALblVXcUOEh95Q== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-syntax-typescript@^7.2.0", "@babel/plugin-syntax-typescript@^7.8.3": version "7.8.3" @@ -429,28 +606,36 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-arrow-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" - integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== +"@babel/plugin-transform-arrow-functions@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz#cb5ee3a36f0863c06ead0b409b4cc43a889b295b" + integrity sha512-6AZHgFJKP3DJX0eCNJj01RpytUa3SOGawIxweHkNX2L6PYikOZmoh5B0d7hIHaIgveMjX990IAa/xK7jRTN8OA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-async-to-generator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" - integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ== +"@babel/plugin-transform-async-to-generator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz#e5153eb1a3e028f79194ed8a7a4bf55f862b2062" + integrity sha512-XCgYjJ8TY2slj6SReBUyamJn3k2JLUIiiR5b6t1mNCMSvv7yx+jJpaewakikp0uWFQSF7ChPPoe3dHmXLpISkg== dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-remap-async-to-generator" "^7.8.3" + "@babel/helper-module-imports" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-remap-async-to-generator" "^7.10.1" -"@babel/plugin-transform-block-scoped-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" - integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== +"@babel/plugin-transform-block-scoped-functions@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz#146856e756d54b20fff14b819456b3e01820b85d" + integrity sha512-B7K15Xp8lv0sOJrdVAoukKlxP9N59HS48V1J3U/JGj+Ad+MHq+am6xJVs85AgXrQn4LV8vaYFOB+pr/yIuzW8Q== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-block-scoping@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz#47092d89ca345811451cd0dc5d91605982705d5e" + integrity sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + lodash "^4.17.13" "@babel/plugin-transform-block-scoping@^7.6.2", "@babel/plugin-transform-block-scoping@^7.8.3": version "7.8.3" @@ -460,35 +645,43 @@ "@babel/helper-plugin-utils" "^7.8.3" lodash "^4.17.13" -"@babel/plugin-transform-classes@^7.9.0": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz#8603fc3cc449e31fdbdbc257f67717536a11af8d" - integrity sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-define-map" "^7.8.3" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-split-export-declaration" "^7.8.3" +"@babel/plugin-transform-classes@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz#6e11dd6c4dfae70f540480a4702477ed766d733f" + integrity sha512-P9V0YIh+ln/B3RStPoXpEQ/CoAxQIhRSUn7aXqQ+FZJ2u8+oCtjIXR3+X0vsSD8zv+mb56K7wZW1XiDTDGiDRQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-define-map" "^7.10.1" + "@babel/helper-function-name" "^7.10.1" + "@babel/helper-optimise-call-expression" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-replace-supers" "^7.10.1" + "@babel/helper-split-export-declaration" "^7.10.1" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" - integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== +"@babel/plugin-transform-computed-properties@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.1.tgz#59aa399064429d64dce5cf76ef9b90b7245ebd07" + integrity sha512-mqSrGjp3IefMsXIenBfGcPXxJxweQe2hEIwMQvjtiDQ9b1IBvDUjkAtV/HMXX47/vXf14qDNedXsIiNd1FmkaQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-destructuring@^7.8.3": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz#fadb2bc8e90ccaf5658de6f8d4d22ff6272a2f4b" - integrity sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ== +"@babel/plugin-transform-destructuring@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz#abd58e51337815ca3a22a336b85f62b998e71907" + integrity sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": +"@babel/plugin-transform-dotall-regex@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.1.tgz#920b9fec2d78bb57ebb64a644d5c2ba67cc104ee" + integrity sha512-19VIMsD1dp02RvduFUmfzj8uknaO3uiHHF0s3E1OHnVsNj8oge8EQ5RzHRbJjGSetRnkEuBYO7TG1M5kKjGLOA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-dotall-regex@^7.4.4": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== @@ -496,86 +689,86 @@ "@babel/helper-create-regexp-features-plugin" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-duplicate-keys@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" - integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ== +"@babel/plugin-transform-duplicate-keys@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.1.tgz#c900a793beb096bc9d4d0a9d0cde19518ffc83b9" + integrity sha512-wIEpkX4QvX8Mo9W6XF3EdGttrIPZWozHfEaDTU0WJD/TDnXMvdDh30mzUl/9qWhnf7naicYartcEfUghTCSNpA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-exponentiation-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" - integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== +"@babel/plugin-transform-exponentiation-operator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz#279c3116756a60dd6e6f5e488ba7957db9c59eb3" + integrity sha512-lr/przdAbpEA2BUzRvjXdEDLrArGRRPwbaF9rvayuHRvdQ7lUTTkZnhZrJ4LE2jvgMRFF4f0YuPQ20vhiPYxtA== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-for-of@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" - integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ== +"@babel/plugin-transform-for-of@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz#ff01119784eb0ee32258e8646157ba2501fcfda5" + integrity sha512-US8KCuxfQcn0LwSCMWMma8M2R5mAjJGsmoCBVwlMygvmDUMkTCykc84IqN1M7t+agSfOmLYTInLCHJM+RUoz+w== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-function-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" - integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== +"@babel/plugin-transform-function-name@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz#4ed46fd6e1d8fde2a2ec7b03c66d853d2c92427d" + integrity sha512-//bsKsKFBJfGd65qSNNh1exBy5Y9gD9ZN+DvrJ8f7HXr4avE5POW6zB7Rj6VnqHV33+0vXWUwJT0wSHubiAQkw== dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-function-name" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" - integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== +"@babel/plugin-transform-literals@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz#5794f8da82846b22e4e6631ea1658bce708eb46a" + integrity sha512-qi0+5qgevz1NHLZroObRm5A+8JJtibb7vdcPQF1KQE12+Y/xxl8coJ+TpPW9iRq+Mhw/NKLjm+5SHtAHCC7lAw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-member-expression-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" - integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== +"@babel/plugin-transform-member-expression-literals@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz#90347cba31bca6f394b3f7bd95d2bbfd9fce2f39" + integrity sha512-UmaWhDokOFT2GcgU6MkHC11i0NQcL63iqeufXWfRy6pUOGYeCGEKhvfFO6Vz70UfYJYHwveg62GS83Rvpxn+NA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-modules-amd@^7.0.0", "@babel/plugin-transform-modules-amd@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4" - integrity sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q== +"@babel/plugin-transform-modules-amd@^7.0.0", "@babel/plugin-transform-modules-amd@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.1.tgz#65950e8e05797ebd2fe532b96e19fc5482a1d52a" + integrity sha512-31+hnWSFRI4/ACFr1qkboBbrTxoBIzj7qA69qlq8HY8p7+YCzkCT6/TvQ1a4B0z27VeWtAeJd6pr5G04dc1iHw== dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940" - integrity sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g== +"@babel/plugin-transform-modules-commonjs@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz#d5ff4b4413ed97ffded99961056e1fb980fb9301" + integrity sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg== dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-simple-access" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-simple-access" "^7.10.1" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90" - integrity sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ== +"@babel/plugin-transform-modules-systemjs@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.1.tgz#9962e4b0ac6aaf2e20431ada3d8ec72082cbffb6" + integrity sha512-ewNKcj1TQZDL3YnO85qh9zo1YF1CHgmSTlRQgHqe63oTrMI85cthKtZjAiZSsSNjPQ5NCaYo5QkbYqEw1ZBgZA== dependencies: - "@babel/helper-hoist-variables" "^7.8.3" - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + "@babel/helper-hoist-variables" "^7.10.1" + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697" - integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ== +"@babel/plugin-transform-modules-umd@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.1.tgz#ea080911ffc6eb21840a5197a39ede4ee67b1595" + integrity sha512-EIuiRNMd6GB6ulcYlETnYYfgv4AxqrswghmBRQbWLHZxN4s7mupxzglnHqk9ZiUpDI4eRWewedJJNj67PWOXKA== dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": version "7.8.3" @@ -584,12 +777,12 @@ dependencies: "@babel/helper-create-regexp-features-plugin" "^7.8.3" -"@babel/plugin-transform-new-target@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" - integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw== +"@babel/plugin-transform-new-target@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.1.tgz#6ee41a5e648da7632e22b6fb54012e87f612f324" + integrity sha512-MBlzPc1nJvbmO9rPr1fQwXOM2iGut+JC92ku6PbiJMMK7SnQc1rytgpopveE3Evn47gzvGYeCdgfCDbZo0ecUw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-transform-object-assign@^7.8.3": version "7.8.3" @@ -598,98 +791,98 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-object-super@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" - integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== +"@babel/plugin-transform-object-super@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz#2e3016b0adbf262983bf0d5121d676a5ed9c4fde" + integrity sha512-WnnStUDN5GL+wGQrJylrnnVlFhFmeArINIR9gjhSeYyvroGhBrSAXYg/RHsnfzmsa+onJrTJrEClPzgNmmQ4Gw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-replace-supers" "^7.10.1" -"@babel/plugin-transform-parameters@^7.8.7": - version "7.9.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz#3028d0cc20ddc733166c6e9c8534559cee09f54a" - integrity sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg== +"@babel/plugin-transform-parameters@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz#b25938a3c5fae0354144a720b07b32766f683ddd" + integrity sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg== dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-get-function-arity" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-property-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" - integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== +"@babel/plugin-transform-property-literals@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz#cffc7315219230ed81dc53e4625bf86815b6050d" + integrity sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-regenerator@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" - integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA== +"@babel/plugin-transform-regenerator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz#10e175cbe7bdb63cc9b39f9b3f823c5c7c5c5490" + integrity sha512-B3+Y2prScgJ2Bh/2l9LJxKbb8C8kRfsG4AdPT+n7ixBHIxJaIG8bi8tgjxUMege1+WqSJ+7gu1YeoMVO3gPWzw== dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" - integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A== +"@babel/plugin-transform-reserved-words@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.1.tgz#0fc1027312b4d1c3276a57890c8ae3bcc0b64a86" + integrity sha512-qN1OMoE2nuqSPmpTqEM7OvJ1FkMEV+BjVeZZm9V9mq/x1JLKQ4pcv8riZJMNN3u2AUGl0ouOMjRr2siecvHqUQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-runtime@^7.2.0", "@babel/plugin-transform-runtime@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz#45468c0ae74cc13204e1d3b1f4ce6ee83258af0b" - integrity sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw== +"@babel/plugin-transform-runtime@^7.10.1", "@babel/plugin-transform-runtime@^7.2.0": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.10.1.tgz#fd1887f749637fb2ed86dc278e79eb41df37f4b1" + integrity sha512-4w2tcglDVEwXJ5qxsY++DgWQdNJcCCsPxfT34wCUwIf2E7dI7pMpH8JczkMBbgBTNzBX62SZlNJ9H+De6Zebaw== dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-module-imports" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" resolve "^1.8.1" semver "^5.5.1" -"@babel/plugin-transform-shorthand-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" - integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== +"@babel/plugin-transform-shorthand-properties@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz#e8b54f238a1ccbae482c4dce946180ae7b3143f3" + integrity sha512-AR0E/lZMfLstScFwztApGeyTHJ5u3JUKMjneqRItWeEqDdHWZwAOKycvQNCasCK/3r5YXsuNG25funcJDu7Y2g== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" - integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== +"@babel/plugin-transform-spread@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz#0c6d618a0c4461a274418460a28c9ccf5239a7c8" + integrity sha512-8wTPym6edIrClW8FI2IoaePB91ETOtg36dOkj3bYcNe7aDMN2FXEoUa+WrmPc4xa1u2PQK46fUX2aCb+zo9rfw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-sticky-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" - integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== +"@babel/plugin-transform-sticky-regex@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz#90fc89b7526228bed9842cff3588270a7a393b00" + integrity sha512-j17ojftKjrL7ufX8ajKvwRilwqTok4q+BjkknmQw9VNHnItTyMP5anPFzxFJdCQs7clLcWpCV3ma+6qZWLnGMA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-regex" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-regex" "^7.10.1" -"@babel/plugin-transform-template-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" - integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== +"@babel/plugin-transform-template-literals@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.1.tgz#914c7b7f4752c570ea00553b4284dad8070e8628" + integrity sha512-t7B/3MQf5M1T9hPCRG28DNGZUuxAuDqLYS03rJrIk2prj/UV7Z6FOneijhQhnv/Xa039vidXeVbvjK2SK5f7Gg== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-typeof-symbol@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412" - integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg== +"@babel/plugin-transform-typeof-symbol@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.1.tgz#60c0239b69965d166b80a84de7315c1bc7e0bb0e" + integrity sha512-qX8KZcmbvA23zDi+lk9s6hC1FM7jgLHYIjuLgULgc8QtYnmB3tAVIYkNoKRQ75qWBeyzcoMoK8ZQmogGtC/w0g== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-typescript@^7.9.0": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.4.tgz#4bb4dde4f10bbf2d787fce9707fb09b483e33359" - integrity sha512-yeWeUkKx2auDbSxRe8MusAG+n4m9BFY/v+lPjmQDgOFX5qnySkUY5oXzkp6FwPdsYqnKay6lorXYdC0n3bZO7w== +"@babel/plugin-transform-typescript@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.10.1.tgz#2c54daea231f602468686d9faa76f182a94507a6" + integrity sha512-v+QWKlmCnsaimLeqq9vyCsVRMViZG1k2SZTlcZvB+TqyH570Zsij8nvVUZzOASCRiQFUxkLrn9Wg/kH0zgy5OQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-typescript" "^7.8.3" + "@babel/helper-create-class-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-typescript" "^7.10.1" "@babel/plugin-transform-typescript@~7.4.0": version "7.4.5" @@ -708,83 +901,94 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-typescript" "^7.8.3" -"@babel/plugin-transform-unicode-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" - integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== +"@babel/plugin-transform-unicode-escapes@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.1.tgz#add0f8483dab60570d9e03cecef6c023aa8c9940" + integrity sha512-zZ0Poh/yy1d4jeDWpx/mNwbKJVwUYJX73q+gyh4bwtG0/iUlzdEu0sLMda8yuDFS6LBQlT/ST1SJAR6zYwXWgw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/polyfill@^7.0.0", "@babel/polyfill@^7.8.3", "@babel/polyfill@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.8.7.tgz#151ec24c7135481336168c3bd8b8bf0cf91c032f" - integrity sha512-LeSfP9bNZH2UOZgcGcZ0PIHUt1ZuHub1L3CVmEyqLxCeDLm4C5Gi8jRH8ZX2PNpDhQCo0z6y/+DIs2JlliXW8w== +"@babel/plugin-transform-unicode-regex@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz#6b58f2aea7b68df37ac5025d9c88752443a6b43f" + integrity sha512-Y/2a2W299k0VIUdbqYm9X2qS6fE0CUBhhiPpimK6byy7OJ/kORLlIX+J6UrjgNu5awvs62k+6RSslxhcvVw2Tw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/polyfill@^7.0.0", "@babel/polyfill@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.10.1.tgz#d56d4c8be8dd6ec4dce2649474e9b707089f739f" + integrity sha512-TviueJ4PBW5p48ra8IMtLXVkDucrlOZAIZ+EXqS3Ot4eukHbWiqcn7DcqpA1k5PcKtmJ4Xl9xwdv6yQvvcA+3g== dependencies: core-js "^2.6.5" regenerator-runtime "^0.13.4" -"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8" - integrity sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ== - dependencies: - "@babel/compat-data" "^7.9.0" - "@babel/helper-compilation-targets" "^7.8.7" - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-proposal-async-generator-functions" "^7.8.3" - "@babel/plugin-proposal-dynamic-import" "^7.8.3" - "@babel/plugin-proposal-json-strings" "^7.8.3" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-proposal-numeric-separator" "^7.8.3" - "@babel/plugin-proposal-object-rest-spread" "^7.9.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" - "@babel/plugin-proposal-optional-chaining" "^7.9.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" +"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.10.2": + version "7.10.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.10.2.tgz#715930f2cf8573b0928005ee562bed52fb65fdfb" + integrity sha512-MjqhX0RZaEgK/KueRzh+3yPSk30oqDKJ5HP5tqTSB1e2gzGS3PLy7K0BIpnp78+0anFuSwOeuCf1zZO7RzRvEA== + dependencies: + "@babel/compat-data" "^7.10.1" + "@babel/helper-compilation-targets" "^7.10.2" + "@babel/helper-module-imports" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-proposal-async-generator-functions" "^7.10.1" + "@babel/plugin-proposal-class-properties" "^7.10.1" + "@babel/plugin-proposal-dynamic-import" "^7.10.1" + "@babel/plugin-proposal-json-strings" "^7.10.1" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.1" + "@babel/plugin-proposal-numeric-separator" "^7.10.1" + "@babel/plugin-proposal-object-rest-spread" "^7.10.1" + "@babel/plugin-proposal-optional-catch-binding" "^7.10.1" + "@babel/plugin-proposal-optional-chaining" "^7.10.1" + "@babel/plugin-proposal-private-methods" "^7.10.1" + "@babel/plugin-proposal-unicode-property-regex" "^7.10.1" "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-class-properties" "^7.10.1" "@babel/plugin-syntax-dynamic-import" "^7.8.0" "@babel/plugin-syntax-json-strings" "^7.8.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - "@babel/plugin-syntax-numeric-separator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.1" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - "@babel/plugin-transform-arrow-functions" "^7.8.3" - "@babel/plugin-transform-async-to-generator" "^7.8.3" - "@babel/plugin-transform-block-scoped-functions" "^7.8.3" - "@babel/plugin-transform-block-scoping" "^7.8.3" - "@babel/plugin-transform-classes" "^7.9.0" - "@babel/plugin-transform-computed-properties" "^7.8.3" - "@babel/plugin-transform-destructuring" "^7.8.3" - "@babel/plugin-transform-dotall-regex" "^7.8.3" - "@babel/plugin-transform-duplicate-keys" "^7.8.3" - "@babel/plugin-transform-exponentiation-operator" "^7.8.3" - "@babel/plugin-transform-for-of" "^7.9.0" - "@babel/plugin-transform-function-name" "^7.8.3" - "@babel/plugin-transform-literals" "^7.8.3" - "@babel/plugin-transform-member-expression-literals" "^7.8.3" - "@babel/plugin-transform-modules-amd" "^7.9.0" - "@babel/plugin-transform-modules-commonjs" "^7.9.0" - "@babel/plugin-transform-modules-systemjs" "^7.9.0" - "@babel/plugin-transform-modules-umd" "^7.9.0" + "@babel/plugin-syntax-top-level-await" "^7.10.1" + "@babel/plugin-transform-arrow-functions" "^7.10.1" + "@babel/plugin-transform-async-to-generator" "^7.10.1" + "@babel/plugin-transform-block-scoped-functions" "^7.10.1" + "@babel/plugin-transform-block-scoping" "^7.10.1" + "@babel/plugin-transform-classes" "^7.10.1" + "@babel/plugin-transform-computed-properties" "^7.10.1" + "@babel/plugin-transform-destructuring" "^7.10.1" + "@babel/plugin-transform-dotall-regex" "^7.10.1" + "@babel/plugin-transform-duplicate-keys" "^7.10.1" + "@babel/plugin-transform-exponentiation-operator" "^7.10.1" + "@babel/plugin-transform-for-of" "^7.10.1" + "@babel/plugin-transform-function-name" "^7.10.1" + "@babel/plugin-transform-literals" "^7.10.1" + "@babel/plugin-transform-member-expression-literals" "^7.10.1" + "@babel/plugin-transform-modules-amd" "^7.10.1" + "@babel/plugin-transform-modules-commonjs" "^7.10.1" + "@babel/plugin-transform-modules-systemjs" "^7.10.1" + "@babel/plugin-transform-modules-umd" "^7.10.1" "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" - "@babel/plugin-transform-new-target" "^7.8.3" - "@babel/plugin-transform-object-super" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.8.7" - "@babel/plugin-transform-property-literals" "^7.8.3" - "@babel/plugin-transform-regenerator" "^7.8.7" - "@babel/plugin-transform-reserved-words" "^7.8.3" - "@babel/plugin-transform-shorthand-properties" "^7.8.3" - "@babel/plugin-transform-spread" "^7.8.3" - "@babel/plugin-transform-sticky-regex" "^7.8.3" - "@babel/plugin-transform-template-literals" "^7.8.3" - "@babel/plugin-transform-typeof-symbol" "^7.8.4" - "@babel/plugin-transform-unicode-regex" "^7.8.3" + "@babel/plugin-transform-new-target" "^7.10.1" + "@babel/plugin-transform-object-super" "^7.10.1" + "@babel/plugin-transform-parameters" "^7.10.1" + "@babel/plugin-transform-property-literals" "^7.10.1" + "@babel/plugin-transform-regenerator" "^7.10.1" + "@babel/plugin-transform-reserved-words" "^7.10.1" + "@babel/plugin-transform-shorthand-properties" "^7.10.1" + "@babel/plugin-transform-spread" "^7.10.1" + "@babel/plugin-transform-sticky-regex" "^7.10.1" + "@babel/plugin-transform-template-literals" "^7.10.1" + "@babel/plugin-transform-typeof-symbol" "^7.10.1" + "@babel/plugin-transform-unicode-escapes" "^7.10.1" + "@babel/plugin-transform-unicode-regex" "^7.10.1" "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.9.0" - browserslist "^4.9.1" + "@babel/types" "^7.10.2" + browserslist "^4.12.0" core-js-compat "^3.6.2" invariant "^2.2.2" levenary "^1.1.1" @@ -801,14 +1005,23 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/runtime@^7.2.0", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.0": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" - integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q== +"@babel/runtime@^7.10.2", "@babel/runtime@^7.2.0", "@babel/runtime@^7.8.4": + version "7.10.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.2.tgz#d103f21f2602497d38348a32e008637d506db839" + integrity sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.8.3", "@babel/template@^7.8.6": +"@babel/template@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.1.tgz#e167154a94cb5f14b28dc58f5356d2162f539811" + integrity sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig== + dependencies: + "@babel/code-frame" "^7.10.1" + "@babel/parser" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/template@^7.8.3": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== @@ -817,7 +1030,7 @@ "@babel/parser" "^7.8.6" "@babel/types" "^7.8.6" -"@babel/traverse@^7.1.6", "@babel/traverse@^7.2.4", "@babel/traverse@^7.3.4", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": +"@babel/traverse@^7.1.6", "@babel/traverse@^7.2.4", "@babel/traverse@^7.3.4", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.6": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892" integrity sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w== @@ -832,6 +1045,21 @@ globals "^11.1.0" lodash "^4.17.13" +"@babel/traverse@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.1.tgz#bbcef3031e4152a6c0b50147f4958df54ca0dd27" + integrity sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ== + dependencies: + "@babel/code-frame" "^7.10.1" + "@babel/generator" "^7.10.1" + "@babel/helper-function-name" "^7.10.1" + "@babel/helper-split-export-declaration" "^7.10.1" + "@babel/parser" "^7.10.1" + "@babel/types" "^7.10.1" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + "@babel/types@^7.1.6", "@babel/types@^7.3.2", "@babel/types@^7.3.4", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5" @@ -841,6 +1069,15 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@babel/types@^7.10.1", "@babel/types@^7.10.2": + version "7.10.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.2.tgz#30283be31cad0dbf6fb00bd40641ca0ea675172d" + integrity sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng== + dependencies: + "@babel/helper-validator-identifier" "^7.10.1" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + "@ember-data/-build-infra@3.14.0": version "3.14.0" resolved "https://registry.yarnpkg.com/@ember-data/-build-infra/-/-build-infra-3.14.0.tgz#d81242b018038b0bf39bceaa1b0df167398f60b8" @@ -2584,10 +2821,10 @@ babel-plugin-debug-macros@^0.3.0, babel-plugin-debug-macros@^0.3.3: dependencies: semver "^5.3.0" -babel-plugin-dynamic-import-node@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" - integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== dependencies: object.assign "^4.1.0" @@ -3290,13 +3527,13 @@ broccoli-babel-transpiler@^6.5.0: rsvp "^4.8.2" workerpool "^2.3.0" -broccoli-babel-transpiler@^7.1.2, broccoli-babel-transpiler@^7.4.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.4.0.tgz#f3069f0f77e8017aa17e1e757dfb4a30de044182" - integrity sha512-DzPXQr1C+zOgzXG40wqPjtjSSa6wRKb+Ls45Qtq7Pn+GxL3/jIvQOBZi0/irZ5dlYVbRMEZiUnaIBIOha2ygIw== +broccoli-babel-transpiler@^7.1.2, broccoli-babel-transpiler@^7.5.0: + version "7.5.0" + resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.5.0.tgz#6137e2c9324eebe1d83b6a01c7b445bfc5612d49" + integrity sha512-CrLrI8HX7mDqVR+/r8WiTZuQQh6hGMGwal9jyKk+kpk7t/4hqL6oQ06FRt81kazbHm4bil4WJ+kGB+aOfAx+XA== dependencies: - "@babel/core" "^7.8.3" - "@babel/polyfill" "^7.8.3" + "@babel/core" "^7.10.2" + "@babel/polyfill" "^7.10.1" broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.2" broccoli-persistent-filter "^2.2.1" @@ -4068,7 +4305,7 @@ browserslist@^3.2.6: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" -browserslist@^4.0.0, browserslist@^4.11.0, browserslist@^4.8.3, browserslist@^4.9.1: +browserslist@^4.0.0, browserslist@^4.11.0, browserslist@^4.8.3: version "4.11.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.11.0.tgz#aef4357b10a8abda00f97aac7cd587b2082ba1ad" integrity sha512-WqEC7Yr5wUH5sg6ruR++v2SGOQYpyUdYYd4tZoAq1F7y+QXoLoYGXVbxhtaIqWmAJjtNTRjVD3HuJc1OXTel2A== @@ -4078,6 +4315,16 @@ browserslist@^4.0.0, browserslist@^4.11.0, browserslist@^4.8.3, browserslist@^4. node-releases "^1.1.52" pkg-up "^3.1.0" +browserslist@^4.12.0: + version "4.12.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.0.tgz#06c6d5715a1ede6c51fc39ff67fd647f740b656d" + integrity sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg== + dependencies: + caniuse-lite "^1.0.30001043" + electron-to-chromium "^1.3.413" + node-releases "^1.1.53" + pkg-up "^2.0.0" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -4282,6 +4529,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805, can resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz#44da3cbca2ab6cb6aa83d1be5d324e17f141caff" integrity sha512-zii9quPo96XfOiRD4TrfYGs+QsGZpb2cGiMAzPjtf/hpFgB6zCPZgJb7I1+EATeMw/o+lG8FyRAnI+CWStHcaQ== +caniuse-lite@^1.0.30001043: + version "1.0.30001083" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001083.tgz#52410c20c6f029f604f0d45eca0439a82e712442" + integrity sha512-CnYJ27awX4h7yj5glfK7r1TOI13LBytpLzEgfj0s4mY75/F8pnQcYjL+oVpmS38FB59+vU0gscQ9D8tc+lIXvA== + capture-exit@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" @@ -5517,6 +5769,11 @@ electron-to-chromium@^1.3.30, electron-to-chromium@^1.3.380, electron-to-chromiu resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.386.tgz#224f97c808da76014096848f80bb9342b6a95cdb" integrity sha512-M7JHfp32Bq6Am59AWgglh2d3nqe6y8Y94Vcb/AXUsO3DGvKUHYI5ML9+U5oNShfdOEfurrrjKSoSgFt2mz7mpw== +electron-to-chromium@^1.3.413: + version "1.3.473" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.473.tgz#d0cd5fe391046fb70674ec98149f0f97609d29b8" + integrity sha512-smevlzzMNz3vMz6OLeeCq5HRWEj2AcgccNPYnAx4Usx0IOciq9DU36RJcICcS09hXoY7t7deRfVYKD14IrGb9A== + elliptic@^6.0.0: version "6.5.2" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" @@ -5757,26 +6014,26 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, semver "^5.5.0" ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.18.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: - version "7.20.5" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.20.5.tgz#ab60dcf7371f4d86d41c2596c6d050470e283074" - integrity sha512-lWvKqJPQ1KJigWKmxREqFbXgZd2/nFKMg3chiiNejpsAIgGLPXGFLwpMQ7QYCRrlims7D/bnDgFvXuOLkw0fcQ== - dependencies: - "@babel/core" "^7.9.0" - "@babel/helper-compilation-targets" "^7.8.7" - "@babel/plugin-proposal-class-properties" "^7.8.3" - "@babel/plugin-proposal-decorators" "^7.8.3" - "@babel/plugin-transform-modules-amd" "^7.9.0" - "@babel/plugin-transform-runtime" "^7.9.0" - "@babel/plugin-transform-typescript" "^7.9.0" - "@babel/polyfill" "^7.8.7" - "@babel/preset-env" "^7.9.0" - "@babel/runtime" "^7.9.0" + version "7.21.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.21.0.tgz#c79e888876aee87dfc3260aee7cb580b74264bbc" + integrity sha512-jHVi9melAibo0DrAG3GAxid+29xEyjBoU53652B4qcu3Xp58feZGTH/JGXovH7TjvbeNn65zgNyoV3bk1onULw== + dependencies: + "@babel/core" "^7.10.2" + "@babel/helper-compilation-targets" "^7.10.2" + "@babel/plugin-proposal-class-properties" "^7.10.1" + "@babel/plugin-proposal-decorators" "^7.10.1" + "@babel/plugin-transform-modules-amd" "^7.10.1" + "@babel/plugin-transform-runtime" "^7.10.1" + "@babel/plugin-transform-typescript" "^7.10.1" + "@babel/polyfill" "^7.10.1" + "@babel/preset-env" "^7.10.2" + "@babel/runtime" "^7.10.2" amd-name-resolver "^1.2.1" - babel-plugin-debug-macros "^0.3.0" + babel-plugin-debug-macros "^0.3.3" babel-plugin-ember-data-packages-polyfill "^0.1.2" babel-plugin-ember-modules-api-polyfill "^2.13.4" babel-plugin-module-resolver "^3.1.1" - broccoli-babel-transpiler "^7.4.0" + broccoli-babel-transpiler "^7.5.0" broccoli-debug "^0.6.4" broccoli-funnel "^2.0.1" broccoli-source "^1.1.0" @@ -10694,6 +10951,11 @@ node-releases@^1.1.52: dependencies: semver "^6.3.0" +node-releases@^1.1.53: + version "1.1.58" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.58.tgz#8ee20eef30fa60e52755fcc0942def5a734fe935" + integrity sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg== + node-uuid@~1.4.0: version "1.4.8" resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" From a1b9bb9f67a59a45c76f16f89c2eecf0f268a7b5 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 17 Jun 2020 10:05:34 -0400 Subject: [PATCH 676/879] build(deps-dev): bump ember-cli-addon-docs from 0.6.16 to 0.7.0 (#1957) Bumps [ember-cli-addon-docs](https://github.com/ember-learn/ember-cli-addon-docs) from 0.6.16 to 0.7.0. - [Release notes](https://github.com/ember-learn/ember-cli-addon-docs/releases) - [Changelog](https://github.com/ember-learn/ember-cli-addon-docs/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-learn/ember-cli-addon-docs/compare/v0.6.16...v0.7.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 160 ++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 127 insertions(+), 35 deletions(-) diff --git a/package.json b/package.json index ade9093d0..a070e7a98 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "broccoli-asset-rev": "^3.0.0", "ember-ajax": "^5.0.0", "ember-cli": "~3.4.4", - "ember-cli-addon-docs": "^0.6.13", + "ember-cli-addon-docs": "^0.7.0", "ember-cli-addon-docs-esdoc": "^0.2.3", "ember-cli-dependency-checker": "^3.0.0", "ember-cli-deploy": "^1.0.2", diff --git a/yarn.lock b/yarn.lock index 0a6ff2505..f55eea7a5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1355,6 +1355,14 @@ resolve "^1.8.1" semver "^5.6.0" +"@fullhuman/postcss-purgecss@^2.1.2": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@fullhuman/postcss-purgecss/-/postcss-purgecss-2.3.0.tgz#50a954757ec78696615d3e118e3fee2d9291882e" + integrity sha512-qnKm5dIOyPGJ70kPZ5jiz0I9foVOic0j+cOzNDoo8KoCf6HjicIZ99UfO2OmE7vCYSKAAepEwJtNzpiiZAh9xw== + dependencies: + postcss "7.0.32" + purgecss "^2.3.0" + "@glimmer/env@^0.1.7": version "0.1.7" resolved "https://registry.yarnpkg.com/@glimmer/env/-/env-0.1.7.tgz#fd2d2b55a9029c6b37a6c935e8c8871ae70dfa07" @@ -3674,7 +3682,7 @@ broccoli-file-creator@^2.1.1: broccoli-plugin "^1.1.0" mkdirp "^0.5.1" -broccoli-filter@^1.2.2, broccoli-filter@^1.2.3, broccoli-filter@^1.2.4: +broccoli-filter@^1.2.2, broccoli-filter@^1.2.3, broccoli-filter@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/broccoli-filter/-/broccoli-filter-1.3.0.tgz#71e3a8e32a17f309e12261919c5b1006d6766de6" integrity sha512-VXJXw7eBfG82CFxaBDjYmyN7V72D4In2zwLVQJd/h3mBfF3CMdRTsv2L20lmRTtCv1sAHcB+LgMso90e/KYiLw== @@ -4587,6 +4595,14 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -4876,7 +4892,7 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.9.0: +color-convert@^1.9.0, color-convert@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -4900,11 +4916,27 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@~1.1.4: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-string@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" + integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + colors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" @@ -4946,6 +4978,11 @@ commander@^2.19.0, commander@^2.20.0, commander@^2.6.0, commander@~2.20.3: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + common-tags@^1.4.0, common-tags@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" @@ -5883,18 +5920,18 @@ ember-cli-addon-docs-esdoc@^0.2.3: tmp "^0.0.33" walk-sync "^0.3.2" -ember-cli-addon-docs@^0.6.13: - version "0.6.16" - resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.6.16.tgz#846a86d75d205890b2977816423899f4ed5e511e" - integrity sha512-I3ZJC+eQA+epiU+TbKFGOXY3O0JyicwLEv9TT0vxY7XO60TW6Lt79mXRx8aJz5RNp5Qzvp/q4zhW83cL+bmRvg== +ember-cli-addon-docs@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.7.0.tgz#30ba6ea734a71d75244d3b7ebc20a74934538b7c" + integrity sha512-/c+czcpcXB6gQ/jvNG7X9kBYcbceF0PF0RTC6XQcJn1H8NlfvOUehS93xPjk8wfNE38A4RyQnUAon2PqFxBo/Q== dependencies: "@glimmer/syntax" "^0.42.2" broccoli-bridge "^1.0.0" broccoli-caching-writer "^3.0.3" - broccoli-debug "^0.6.4" - broccoli-filter "^1.2.4" + broccoli-debug "^0.6.5" + broccoli-filter "^1.3.0" broccoli-funnel "^2.0.2" - broccoli-merge-trees "^3.0.1" + broccoli-merge-trees "^3.0.2" broccoli-persistent-filter "^2.3.1" broccoli-plugin "1.3.1 - 3" broccoli-source "^3.0.0" @@ -5904,16 +5941,17 @@ ember-cli-addon-docs@^0.6.13: ember-assign-polyfill "^2.6.0" ember-auto-import "^1.5.3" ember-cli-autoprefixer "^0.8.1" - ember-cli-babel "^7.12.0" + ember-cli-babel "^7.18.0" ember-cli-clipboard "^0.13.0" - ember-cli-htmlbars "^4.0.7" + ember-cli-htmlbars "^4.2.3" ember-cli-postcss "^5.0.0" ember-cli-sass "10.0.1" ember-cli-string-helpers "^4.0.5" ember-cli-string-utils "^1.1.0" + ember-cli-version-checker "^3.1.3" ember-code-snippet "^3.0.0" ember-component-css "^0.7.4" - ember-composable-helpers "^2.3.1" + ember-composable-helpers "^2.4.0" ember-concurrency "^0.9.0 || ^0.10.0 || ^1.0.0" ember-data "2.x - 3.x" ember-fetch "^6.7.1" @@ -5923,26 +5961,27 @@ ember-cli-addon-docs@^0.6.13: ember-keyboard "^4.0.0" ember-modal-dialog "^3.0.0-beta.4" ember-named-arguments-polyfill "^1.0.0" + ember-on-modifier "^1.0.0" ember-responsive "^3.0.5" ember-router-generator "^2.0.0" ember-router-scroll "^1.3.3" ember-svg-jar "^2.2.3" - ember-tether "^1.0.0-beta.2" + ember-tether "^1.0.0" ember-truth-helpers "^2.1.0" esm "^3.2.25" execa "^3.2.0" fs-extra "^8.1.0" git-repo-info "^2.1.1" highlight.js "^9.15.10" - hosted-git-info "^3.0.2" + hosted-git-info "^3.0.4" html-entities "^1.2.1" inflected "^2.0.3" - jsdom "^15.2.0" + jsdom "^15.2.1" json-api-serializer "^2.2.1" liquid-fire "^0.29.5 || ^0.30.0 || ^0.31.0" lodash "^4.17.15" lunr "^2.3.7" - marked "^0.7.0" + marked "^0.8.2" pad-start "^1.0.2" parse-git-config "^3.0.0" quick-temp "^0.1.8" @@ -5950,7 +5989,7 @@ ember-cli-addon-docs@^0.6.13: sass "^1.22.10" semver "^6.3.0" striptags "^3.1.1" - tailwindcss "^1.0" + tailwindcss "^1.2.0" walk-sync "^2.0.2" yuidocjs "^0.10.2" @@ -6013,7 +6052,7 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.18.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.13.2, ember-cli-babel@^7.18.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: version "7.21.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.21.0.tgz#c79e888876aee87dfc3260aee7cb580b74264bbc" integrity sha512-jHVi9melAibo0DrAG3GAxid+29xEyjBoU53652B4qcu3Xp58feZGTH/JGXovH7TjvbeNn65zgNyoV3bk1onULw== @@ -6215,7 +6254,7 @@ ember-cli-htmlbars@^3.0.0, ember-cli-htmlbars@^3.0.1: json-stable-stringify "^1.0.1" strip-bom "^3.0.0" -ember-cli-htmlbars@^4.0.5, ember-cli-htmlbars@^4.0.7: +ember-cli-htmlbars@^4.0.5, ember-cli-htmlbars@^4.2.3: version "4.3.1" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.3.1.tgz#4af8adc21ab3c4953f768956b7f7d207782cb175" integrity sha512-CW6AY/yzjeVqoRtItOKj3hcYzc5dWPRETmeCzr2Iqjt5vxiVtpl0z5VTqHqIlT5fsFx6sGWBQXNHIe+ivYsxXQ== @@ -6583,7 +6622,7 @@ ember-component-css@^0.7.4: rsvp "^4.8.4" walk-sync "^1.0.1" -ember-composable-helpers@^2.3.1: +ember-composable-helpers@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-2.4.0.tgz#024bd6a8c338cc9cdf10f1141b119b8f72de205f" integrity sha512-91ZqFnNG1EDL3WzxXWTgAy6EonPS7htWHletI5SOw5ezEzKbt6EGNBwT6QPhwariugtR8LEfYNQ9lXEiCZrX1w== @@ -6780,6 +6819,15 @@ ember-modal-dialog@^3.0.0-beta.4: ember-ignore-children-helper "^1.0.1" ember-wormhole "^0.5.5" +ember-modifier-manager-polyfill@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ember-modifier-manager-polyfill/-/ember-modifier-manager-polyfill-1.2.0.tgz#cf4444e11a42ac84f5c8badd85e635df57565dda" + integrity sha512-bnaKF1LLKMkBNeDoetvIJ4vhwRPKIIumWr6dbVuW6W6p4QV8ZiO+GdF8J7mxDNlog9CeL9Z/7wam4YS86G8BYA== + dependencies: + ember-cli-babel "^7.10.0" + ember-cli-version-checker "^2.1.2" + ember-compatibility-helpers "^1.2.0" + ember-moment@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/ember-moment/-/ember-moment-8.0.0.tgz#f3993711df0af444558f0f3922dc3f412af72410" @@ -6797,6 +6845,16 @@ ember-named-arguments-polyfill@^1.0.0: ember-cli-babel "^6.6.0" ember-cli-version-checker "^2.1.2" +ember-on-modifier@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ember-on-modifier/-/ember-on-modifier-1.0.1.tgz#b99e9c9d7919a9f536bfc9d4a68704462eceb0fe" + integrity sha512-4JKUb/DBmdZkLfljN2Dj6gKmqq2vZ0/3TOwRs1+jUIXTUg1MaBMUVD1XYwzUm+a7abW9/JkQNUEVZZu13SwFMg== + dependencies: + broccoli-funnel "^2.0.2" + ember-cli-babel "^7.19.0" + ember-cli-version-checker "^4.1.0" + ember-modifier-manager-polyfill "^1.2.0" + ember-qunit@^3.5.0: version "3.5.3" resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-3.5.3.tgz#bfd0bff8298c78c77e870cca43fe0826e78a0d09" @@ -6923,7 +6981,7 @@ ember-svg-jar@^2.2.3: mkdirp "^0.5.1" path-posix "^1.0.0" -ember-tether@^1.0.0-beta.2: +ember-tether@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-tether/-/ember-tether-1.0.0.tgz#6117ea7351927887cb74fa5d46097dd300280c2d" integrity sha1-YRfqc1GSeIfLdPpdRgl90wAoDC0= @@ -8330,7 +8388,7 @@ glob@^5.0.10: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.0.0, glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -8706,7 +8764,7 @@ hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== -hosted-git-info@^3.0.2: +hosted-git-info@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.4.tgz#be4973eb1fd2737b11c9c7c19380739bb249f60d" integrity sha512-4oT62d2jwSDBbLLFLZE+1vPuQ1h8p9wjrJ8Mqx5TjsyWmBMV5B13eJqn8pvluqubLf3cJPTfiYCIwNwDNmzScQ== @@ -9065,6 +9123,11 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -9505,7 +9568,7 @@ jsdom@^12.0.0: ws "^6.1.0" xml-name-validator "^3.0.0" -jsdom@^15.2.0: +jsdom@^15.2.1: version "15.2.1" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.1.tgz#d2feb1aef7183f86be521b8c6833ff5296d07ec5" integrity sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g== @@ -10375,10 +10438,10 @@ marked@0.3.6: resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" integrity sha1-ssbGGPzOzk74bE/Gy4p8v1rtqNc= -marked@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e" - integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg== +marked@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.8.2.tgz#4faad28d26ede351a7a1aaa5fec67915c869e355" + integrity sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw== match-media@^0.2.0: version "0.2.0" @@ -11771,6 +11834,15 @@ postcss-value-parser@^4.0.3: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d" integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg== +postcss@7.0.32: + version "7.0.32" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" + integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + postcss@^6.0.1, postcss@^6.0.17, postcss@^6.0.9: version "6.0.23" resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" @@ -11953,6 +12025,16 @@ punycode@^1.2.4: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= +purgecss@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/purgecss/-/purgecss-2.3.0.tgz#5327587abf5795e6541517af8b190a6fb5488bb3" + integrity sha512-BE5CROfVGsx2XIhxGuZAT7rTH9lLeQx/6M0P7DTXQH4IUc3BBzs9JUzt4yzGf3JrH9enkeq6YJBe9CTtkm1WmQ== + dependencies: + commander "^5.0.0" + glob "^7.0.0" + postcss "7.0.32" + postcss-selector-parser "^6.0.2" + q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -12918,6 +13000,13 @@ simple-html-tokenizer@^0.5.8: resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.9.tgz#1a83fe97f5a3e39b335fddf71cfe9b0263b581c2" integrity sha512-w/3FEDN94r4JQ9WoYrIr8RqDIPZdyNkdpbK9glFady1CAEyD97XWCv8HFetQO21w81e7h7Nh59iYTyG1mUJftg== +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" @@ -13565,14 +13654,17 @@ taffydb@2.7.2: resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.7.2.tgz#7bf8106a5c1a48251b3e3bc0a0e1732489fd0dc8" integrity sha1-e/gQalwaSCUbPjvAoOFzJIn9Dcg= -tailwindcss@^1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-1.2.0.tgz#5df317cebac4f3131f275d258a39da1ba3a0f291" - integrity sha512-CKvY0ytB3ze5qvynG7qv4XSpQtFNGPbu9pUn8qFdkqgD8Yo/vGss8mhzbqls44YCXTl4G62p3qVZBj45qrd6FQ== +tailwindcss@^1.2.0: + version "1.4.6" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-1.4.6.tgz#17b37166ccda08d7e7f9ca995ea48ce1e0089700" + integrity sha512-qV0qInUq1FWih39Bc5CWECdgObSzRrbjGD4ke4kAPSIq6WXrPhv0wwOcUWJgJ66ltT9j+XnSRYikG8WNRU/fTQ== dependencies: + "@fullhuman/postcss-purgecss" "^2.1.2" autoprefixer "^9.4.5" + browserslist "^4.12.0" bytes "^3.0.0" - chalk "^3.0.0" + chalk "^4.0.0" + color "^3.1.2" detective "^5.2.0" fs-extra "^8.0.0" lodash "^4.17.15" From 42194eb968688741cfb585d5058b3558294f24d5 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 25 Jun 2020 07:04:02 +0000 Subject: [PATCH 677/879] build(deps-dev): bump eslint-plugin-ember from 8.7.0 to 8.8.0 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 8.7.0 to 8.8.0. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v8.7.0...v8.8.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index f55eea7a5..051214ea8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7253,9 +7253,9 @@ esdoc@pzuraq/esdoc#015a342: taffydb "2.7.2" eslint-plugin-ember@^8.1.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.7.0.tgz#71b8c7a79e64fbf1c6e29a1a0c3e3546ed207b77" - integrity sha512-DUQISEtMi1ysIhnL1pdXcrYYnv7qf7AgKC1PMC2e8FzX7h39gQlC6x3+6sAij2wYGAsl1tShVk6hgLFWC61vEw== + version "8.8.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.8.0.tgz#d3572944b1744c801d7099379cdfeaab6905a33b" + integrity sha512-E1qYkA+mPGVagRaCoGWonXWl6qox4VL8oHN+dCUrMyANFLNANfD0Zbt/D3aOAY2wtbwKSZtoiiNIxfoMGQzPRw== dependencies: "@ember-data/rfc395-data" "^0.0.4" ember-rfc176-data "^0.3.13" From 5083ba21cc304a6ca46a69a598edf80adf89d34c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 25 Jun 2020 07:04:40 +0000 Subject: [PATCH 678/879] build(deps): bump ember-auto-import from 1.5.3 to 1.6.0 Bumps [ember-auto-import](https://github.com/ef4/ember-auto-import) from 1.5.3 to 1.6.0. - [Release notes](https://github.com/ef4/ember-auto-import/releases) - [Changelog](https://github.com/ef4/ember-auto-import/blob/master/CHANGELOG.md) - [Commits](https://github.com/ef4/ember-auto-import/compare/v1.5.3...v1.6.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 48 +++++++----------------------------------------- 1 file changed, 7 insertions(+), 41 deletions(-) diff --git a/yarn.lock b/yarn.lock index 051214ea8..409669e33 100644 --- a/yarn.lock +++ b/yarn.lock @@ -62,16 +62,6 @@ lodash "^4.17.13" source-map "^0.5.0" -"@babel/generator@^7.9.0": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.4.tgz#12441e90c3b3c4159cdecf312075bf1a8ce2dbce" - integrity sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA== - dependencies: - "@babel/types" "^7.9.0" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - "@babel/helper-annotate-as-pure@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz#f6d08acc6f70bbd59b436262553fb2e259a1a268" @@ -387,7 +377,7 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.2.tgz#871807f10442b92ff97e4783b9b54f6a0ca812d0" integrity sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ== -"@babel/parser@^7.3.4", "@babel/parser@^7.4.5", "@babel/parser@^7.7.0", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": +"@babel/parser@^7.3.4", "@babel/parser@^7.4.5", "@babel/parser@^7.7.0", "@babel/parser@^7.8.6": version "7.9.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== @@ -1030,22 +1020,7 @@ "@babel/parser" "^7.8.6" "@babel/types" "^7.8.6" -"@babel/traverse@^7.1.6", "@babel/traverse@^7.2.4", "@babel/traverse@^7.3.4", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.6": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892" - integrity sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.0" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.9.0" - "@babel/types" "^7.9.0" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - -"@babel/traverse@^7.10.1": +"@babel/traverse@^7.1.6", "@babel/traverse@^7.10.1", "@babel/traverse@^7.2.4", "@babel/traverse@^7.3.4", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.6": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.1.tgz#bbcef3031e4152a6c0b50147f4958df54ca0dd27" integrity sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ== @@ -1060,16 +1035,7 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.1.6", "@babel/types@^7.3.2", "@babel/types@^7.3.4", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5" - integrity sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng== - dependencies: - "@babel/helper-validator-identifier" "^7.9.0" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@babel/types@^7.10.1", "@babel/types@^7.10.2": +"@babel/types@^7.1.6", "@babel/types@^7.10.1", "@babel/types@^7.10.2", "@babel/types@^7.3.2", "@babel/types@^7.3.4", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6": version "7.10.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.2.tgz#30283be31cad0dbf6fb00bd40641ca0ea675172d" integrity sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng== @@ -5870,12 +5836,12 @@ ember-assign-polyfill@~2.4.0: ember-cli-version-checker "^2.0.0" ember-auto-import@^1.2.19, ember-auto-import@^1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.5.3.tgz#b32936f874d1ed7057ad2ed3f6116357820be44b" - integrity sha512-7JfdunM1BmLy/lyUXu7uEoi0Gi4+dxkGM23FgIEyW5g7z4MidhP53Fc61t49oPSnq7+J4lLpbH1f6C+mDMgb4A== + version "1.6.0" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.6.0.tgz#00a498172b04f7084a5d2a327f76f577038ed403" + integrity sha512-BRBrmbDXRuXG/WYbn/2DXM7bFNyQuT80du1scUrrX0+xFVkDOU08s46ZPCvzYprzSg2htgrztQ/nVdnfbIBV+Q== dependencies: "@babel/core" "^7.1.6" - "@babel/preset-env" "^7.0.0" + "@babel/preset-env" "^7.10.2" "@babel/traverse" "^7.1.6" "@babel/types" "^7.1.6" "@embroider/core" "^0.4.3" From b11365de616050b14370b5e2b63fb64ef79c49b0 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 29 Jun 2020 07:12:53 +0000 Subject: [PATCH 679/879] build(deps-dev): bump eslint-plugin-ember from 8.8.0 to 8.9.0 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 8.8.0 to 8.9.0. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v8.8.0...v8.9.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 409669e33..b64b09df1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7219,9 +7219,9 @@ esdoc@pzuraq/esdoc#015a342: taffydb "2.7.2" eslint-plugin-ember@^8.1.0: - version "8.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.8.0.tgz#d3572944b1744c801d7099379cdfeaab6905a33b" - integrity sha512-E1qYkA+mPGVagRaCoGWonXWl6qox4VL8oHN+dCUrMyANFLNANfD0Zbt/D3aOAY2wtbwKSZtoiiNIxfoMGQzPRw== + version "8.9.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.9.0.tgz#010f720665b00847df151d5ae64f41e4671c825a" + integrity sha512-wSZuQM5AkDBc/FRL7jAIMVPQxzXSMUBgzGYzxhLNc4HOSBKVu6qqh2XZg7PTUmhst39VdYjDvep9QHmeRWdLkA== dependencies: "@ember-data/rfc395-data" "^0.0.4" ember-rfc176-data "^0.3.13" From 780f2830c1e1255bf489eac6e51afbf792ca838c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 2 Jul 2020 15:48:12 -0400 Subject: [PATCH 680/879] build(deps-dev): bump escape-string-regexp from 2.0.0 to 4.0.0 (#1947) Bumps [escape-string-regexp](https://github.com/sindresorhus/escape-string-regexp) from 2.0.0 to 4.0.0. - [Release notes](https://github.com/sindresorhus/escape-string-regexp/releases) - [Commits](https://github.com/sindresorhus/escape-string-regexp/compare/v2.0.0...v4.0.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index a070e7a98..fdee7191e 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "ember-source": "~3.16.1", "ember-source-channel-url": "^2.0.1", "ember-try": "^1.0.0", - "escape-string-regexp": "^2.0.0", + "escape-string-regexp": "^4.0.0", "eslint-plugin-ember": "^8.1.0", "eslint-plugin-node": "^11.0.0", "faker": "^4.1.0", diff --git a/yarn.lock b/yarn.lock index b64b09df1..4adefc78f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7175,10 +7175,10 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escodegen@^1.11.0, escodegen@^1.11.1, escodegen@^1.14.1, escodegen@^1.6.1: version "1.14.1" From fabd3885cb3a504bf2717af5b417e897801ed776 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 2 Jul 2020 16:44:42 -0400 Subject: [PATCH 681/879] Add Fastboot to addon blacklist for dummy app (#2004) We have ember-cli-fastboot installed so it can be made available to some of the test projects, but we never use it to actually serve the dummy app (which is the docs app). Thus, if a new user clones + runs the repo, unless they have the FASTBOOT_DISABLED ENV var set, `ember s` will try to serve the dummy app via FastBoot which will cause errors. With the addon blacklisted, ember-cli-fastboot will just never be able to affect the dummy app at all. --- ember-cli-build.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/ember-cli-build.js b/ember-cli-build.js index 24e43c1c8..19da1eb1e 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -2,17 +2,20 @@ const EmberAddon = require("ember-cli/lib/broccoli/ember-addon"); -module.exports = function(defaults) { +module.exports = function (defaults) { let app = new EmberAddon(defaults, { "ember-cli-babel": { - includePolyfill: true + includePolyfill: true, }, "ember-cli-addon-docs-esdoc": { packages: [ "ember-cli-mirage", - { name: "miragejs", sourceDirectory: "lib" } - ] - } + { name: "miragejs", sourceDirectory: "lib" }, + ], + }, + addons: { + blacklist: ["ember-cli-fastboot"], + }, }); /* From 6e3ee6b06271443881a126fc1a57979b4091cd9e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2020 07:11:31 +0000 Subject: [PATCH 682/879] build(deps-dev): bump eslint-plugin-ember from 8.9.0 to 8.9.1 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 8.9.0 to 8.9.1. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v8.9.0...v8.9.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4adefc78f..87edfec65 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7219,9 +7219,9 @@ esdoc@pzuraq/esdoc#015a342: taffydb "2.7.2" eslint-plugin-ember@^8.1.0: - version "8.9.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.9.0.tgz#010f720665b00847df151d5ae64f41e4671c825a" - integrity sha512-wSZuQM5AkDBc/FRL7jAIMVPQxzXSMUBgzGYzxhLNc4HOSBKVu6qqh2XZg7PTUmhst39VdYjDvep9QHmeRWdLkA== + version "8.9.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.9.1.tgz#6d76440bd7bb1954ed61c7ebbb1a1cd8c8e1afa6" + integrity sha512-A7TFksLfLLoQEWOHCvJX6SvxxL99yDEPwDZIh28TOgwsPsXpVYJNk22UT5ZrufUyVtdnOH4IsF3jIkRIIE91IA== dependencies: "@ember-data/rfc395-data" "^0.0.4" ember-rfc176-data "^0.3.13" From ea0ecf1da583020f7c6bcc06419d32130cad4e53 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2020 07:12:10 +0000 Subject: [PATCH 683/879] build(deps-dev): bump ember-composable-helpers from 4.2.1 to 4.2.2 Bumps [ember-composable-helpers](https://github.com/DockYard/ember-composable-helpers) from 4.2.1 to 4.2.2. - [Release notes](https://github.com/DockYard/ember-composable-helpers/releases) - [Changelog](https://github.com/DockYard/ember-composable-helpers/blob/master/CHANGELOG.md) - [Commits](https://github.com/DockYard/ember-composable-helpers/compare/v4.2.1...v4.2.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 87edfec65..a19d02a8c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6599,9 +6599,9 @@ ember-composable-helpers@^2.4.0: resolve "^1.10.0" ember-composable-helpers@^4.1.2: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.2.1.tgz#2a123c96b8c40076fa560591dc384fe66d3ef2c4" - integrity sha512-kuRA1MuEb49Pe7OZiOT++KR9Yq10cMoE1FiRNxzn3ldeM1puG83VxWdKdHSvBMIbEjR4KAyT1SgXyaaShH2Nzw== + version "4.2.2" + resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.2.2.tgz#6e1d8cd0372a0b904d89f2391453598f10ba71f0" + integrity sha512-gupkBd9nRRUaRuDXqnHj0BozILKpE18TKizDJPU075JL6YD22gP0JtlhtRFYszlljUHfbHMG6r2Ns38md3kyxA== dependencies: "@babel/core" "^7.0.0" broccoli-funnel "2.0.1" From e0ed668f80e310d408ca56a6c8e75809db9d4057 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 10 Jul 2020 07:01:48 +0000 Subject: [PATCH 684/879] build(deps-dev): bump jsdom from 16.2.2 to 16.3.0 Bumps [jsdom](https://github.com/jsdom/jsdom) from 16.2.2 to 16.3.0. - [Release notes](https://github.com/jsdom/jsdom/releases) - [Changelog](https://github.com/jsdom/jsdom/blob/master/Changelog.md) - [Commits](https://github.com/jsdom/jsdom/compare/16.2.2...16.3.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index a19d02a8c..49b43e42a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9567,9 +9567,9 @@ jsdom@^15.2.1: xml-name-validator "^3.0.0" jsdom@^16.2.2: - version "16.2.2" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.2.2.tgz#76f2f7541646beb46a938f5dc476b88705bedf2b" - integrity sha512-pDFQbcYtKBHxRaP55zGXCJWgFHkDAYbKcsXEK/3Icu9nKYZkutUXfLBwbD+09XDutkYSHcgfQLZ0qvpAAm9mvg== + version "16.3.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.3.0.tgz#75690b7dac36c67be49c336dcd7219bbbed0810c" + integrity sha512-zggeX5UuEknpdZzv15+MS1dPYG0J/TftiiNunOeNxSl3qr8Z6cIlQpN0IdJa44z9aFxZRIVqRncvEhQ7X5DtZg== dependencies: abab "^2.0.3" acorn "^7.1.1" @@ -9591,7 +9591,7 @@ jsdom@^16.2.2: tough-cookie "^3.0.1" w3c-hr-time "^1.0.2" w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.0.0" + webidl-conversions "^6.1.0" whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" @@ -14486,10 +14486,10 @@ webidl-conversions@^5.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== -webidl-conversions@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.0.0.tgz#ff41d921371f43e772dba311b146ab6c0ef0ead4" - integrity sha512-jTZAeJnc6D+yAOjygbJOs33kVQIk5H6fj9SFDOhIKjsf9HiAzL/c+tAJsc8ASWafvhNkH+wJZms47pmajkhatA== +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== webpack-sources@^1.1.0, webpack-sources@^1.3.0: version "1.4.3" From 4e096f2f998c7eb057f3647e8049179e4b48376f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2020 08:16:34 -0400 Subject: [PATCH 685/879] build(deps-dev): bump ember-source from 3.16.6 to 3.20.0 (#2008) Bumps [ember-source](https://github.com/emberjs/ember.js) from 3.16.6 to 3.20.0. - [Release notes](https://github.com/emberjs/ember.js/releases) - [Changelog](https://github.com/emberjs/ember.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember.js/compare/v3.16.6...v3.20.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 126 ++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 90 insertions(+), 38 deletions(-) diff --git a/package.json b/package.json index fdee7191e..0920a5c3a 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "ember-maybe-import-regenerator-for-testing": "^1.0.0", "ember-moment": "^8.0.0", "ember-resolver": "^7.0.0", - "ember-source": "~3.16.1", + "ember-source": "~3.20.0", "ember-source-channel-url": "^2.0.1", "ember-try": "^1.0.0", "escape-string-regexp": "^4.0.0", diff --git a/yarn.lock b/yarn.lock index 49b43e42a..7e001f56f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -207,20 +207,13 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-module-imports@^7.10.1": +"@babel/helper-module-imports@^7.10.1", "@babel/helper-module-imports@^7.8.3": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz#dd331bd45bccc566ce77004e9d05fe17add13876" integrity sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg== dependencies: "@babel/types" "^7.10.1" -"@babel/helper-module-imports@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" - integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== - dependencies: - "@babel/types" "^7.8.3" - "@babel/helper-module-transforms@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz#24e2f08ee6832c60b157bb0936c86bef7210c622" @@ -330,6 +323,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz#5770b0c1a826c4f53f5ede5e153163e0318e94b5" integrity sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw== +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== + "@babel/helper-validator-identifier@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" @@ -619,7 +617,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-block-scoping@^7.10.1": +"@babel/plugin-transform-block-scoping@^7.10.1", "@babel/plugin-transform-block-scoping@^7.6.2", "@babel/plugin-transform-block-scoping@^7.8.3": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz#47092d89ca345811451cd0dc5d91605982705d5e" integrity sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw== @@ -627,14 +625,6 @@ "@babel/helper-plugin-utils" "^7.10.1" lodash "^4.17.13" -"@babel/plugin-transform-block-scoping@^7.6.2", "@babel/plugin-transform-block-scoping@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" - integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - lodash "^4.17.13" - "@babel/plugin-transform-classes@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz#6e11dd6c4dfae70f540480a4702477ed766d733f" @@ -1044,6 +1034,15 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@babel/types@^7.7.2": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.4.tgz#369517188352e18219981efd156bfdb199fff1ee" + integrity sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + "@ember-data/-build-infra@3.14.0": version "3.14.0" resolved "https://registry.yarnpkg.com/@ember-data/-build-infra/-/-build-infra-3.14.0.tgz#d81242b018038b0bf39bceaa1b0df167398f60b8" @@ -2829,6 +2828,14 @@ babel-plugin-filter-imports@^3.0.0: "@babel/types" "^7.4.0" lodash "^4.17.11" +babel-plugin-filter-imports@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-4.0.0.tgz#068f8da15236a96a9602c36dc6f4a6eeca70a4f4" + integrity sha512-jDLlxI8QnfKd7PtieH6pl4tZJzymzfCDCPGdTq/grgbiYAikwDPp/oL0IlFJn0HQjLpcLkyYhPKkUVneRESw5w== + dependencies: + "@babel/types" "^7.7.2" + lodash "^4.17.15" + babel-plugin-htmlbars-inline-precompile@^0.2.5: version "0.2.6" resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.2.6.tgz#c00b8a3f4b32ca04bf0f0d5169fcef3b5a66d69d" @@ -3592,6 +3599,23 @@ broccoli-concat@^3.2.2, broccoli-concat@^3.5.1, broccoli-concat@^3.7.1, broccoli lodash.uniq "^4.2.0" walk-sync "^0.3.2" +broccoli-concat@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-4.2.4.tgz#78e359ddc540b999d815355163bf3cfb6bd67322" + integrity sha512-NgdBIE57r+U/AslBohQr0mCS7PopIWL8dihMI1CzqffQkisAgqWMuddjYmizqRBQlml7crBFaBeUnPDHhf4/RQ== + dependencies: + broccoli-debug "^0.6.5" + broccoli-kitchen-sink-helpers "^0.3.1" + broccoli-plugin "^4.0.2" + ensure-posix-path "^1.0.2" + fast-sourcemap-concat "^2.1.0" + find-index "^1.1.0" + fs-extra "^8.1.0" + fs-tree-diff "^2.0.1" + lodash.merge "^4.6.2" + lodash.omit "^4.1.0" + lodash.uniq "^4.2.0" + broccoli-config-loader@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/broccoli-config-loader/-/broccoli-config-loader-1.0.1.tgz#d10aaf8ebc0cb45c1da5baa82720e1d88d28c80a" @@ -6449,6 +6473,15 @@ ember-cli-version-checker@^4.1.0: semver "^6.3.0" silent-error "^1.1.1" +ember-cli-version-checker@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-5.1.1.tgz#3185c526c14671609cbd22ab0d0925787fc84f3d" + integrity sha512-YziSW1MgOuVdJSyUY2CKSC4vXrGQIHF6FgygHkJOxYGjZNQYwf5MK0sbliKatvJf7kzDSnXs+r8JLrD74W/A8A== + dependencies: + resolve-package-path "^2.0.0" + semver "^7.3.2" + silent-error "^1.1.1" + ember-cli@~3.4.4: version "3.4.4" resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.4.4.tgz#8d25b223b2ef3b863310099192da92ab1feeef6b" @@ -6897,33 +6930,33 @@ ember-source-channel-url@^2.0.1: dependencies: got "^8.0.1" -ember-source@~3.16.1: - version "3.16.6" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.16.6.tgz#b3fcfe225dd056012f5de254aa585b8699cab353" - integrity sha512-7X+51YqX1097w0q7j0lpt4fuMPKy7QBYAGfnEvOYirUu12hF07MxPVU449uzlkdrzWfCVDgabamHVlsSrYLX7g== +ember-source@~3.20.0: + version "3.20.0" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.20.0.tgz#00ce44b5ff1d58b2acaf9f48879a223994ffef39" + integrity sha512-umSKoAOR7mI3XAaUZBX8ki814eHKuymEvCtNOWb4DRz02whIKX+iUKq7kRPVWgCp2NIG/WF/e3X0TDIvrPUI3Q== dependencies: "@babel/helper-module-imports" "^7.8.3" "@babel/plugin-transform-block-scoping" "^7.8.3" "@babel/plugin-transform-object-assign" "^7.8.3" "@ember/edition-utils" "^1.2.0" babel-plugin-debug-macros "^0.3.3" - babel-plugin-filter-imports "^3.0.0" - broccoli-concat "^3.7.4" + babel-plugin-filter-imports "^4.0.0" + broccoli-concat "^4.2.4" broccoli-debug "^0.6.4" broccoli-funnel "^2.0.2" - broccoli-merge-trees "^3.0.2" - chalk "^2.4.2" - ember-cli-babel "^7.18.0" + broccoli-merge-trees "^4.2.0" + chalk "^4.0.0" + ember-cli-babel "^7.19.0" ember-cli-get-component-path-option "^1.0.0" ember-cli-is-package-missing "^1.0.0" ember-cli-normalize-entity-name "^1.0.0" ember-cli-path-utils "^1.0.0" ember-cli-string-utils "^1.1.0" - ember-cli-version-checker "^3.1.3" + ember-cli-version-checker "^5.1.1" ember-router-generator "^2.0.0" inflection "^1.12.0" - jquery "^3.4.1" - resolve "^1.11.1" + jquery "^3.5.0" + resolve "^1.17.0" semver "^6.1.1" silent-error "^1.1.1" @@ -7685,6 +7718,20 @@ fast-sourcemap-concat@^1.4.0: source-map-url "^0.3.0" sourcemap-validator "^1.1.0" +fast-sourcemap-concat@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-sourcemap-concat/-/fast-sourcemap-concat-2.1.0.tgz#12dd36bfc38c804093e4bd1de61dd6216f574211" + integrity sha512-L9uADEnnHOeF4U5Kc3gzEs3oFpNCFkiTJXvT+nKmR0zcFqHZJJbszWT7dv4t9558FJRGpCj8UxUpTgz2zwiIZA== + dependencies: + chalk "^2.0.0" + fs-extra "^5.0.0" + heimdalljs-logger "^0.1.9" + memory-streams "^0.1.3" + mkdirp "^0.5.0" + source-map "^0.4.2" + source-map-url "^0.3.0" + sourcemap-validator "^1.1.0" + fastboot-express-middleware@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fastboot-express-middleware/-/fastboot-express-middleware-2.0.0.tgz#3cb2c4b744e738a709b4336c4166f1a059ab0ffb" @@ -9465,10 +9512,10 @@ jquery-deferred@^0.3.0: resolved "https://registry.yarnpkg.com/jquery-deferred/-/jquery-deferred-0.3.1.tgz#596eca1caaff54f61b110962b23cafea74c35355" integrity sha1-WW7KHKr/VPYbEQlisjyv6nTDU1U= -jquery@^3.4.1: - version "3.5.0" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.0.tgz#9980b97d9e4194611c36530e7dc46a58d7340fc9" - integrity sha512-Xb7SVYMvygPxbFMpTFQiHh1J7HClEaThguL15N/Gg37Lri/qKyhRGZYzHRyLH8Stq3Aow0LsHO2O2ci86fCrNQ== +jquery@^3.4.1, jquery@^3.5.0: + version "3.5.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.1.tgz#d7b4d08e1bfdb86ad2f1a3d039ea17304717abb5" + integrity sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg== js-reporters@1.2.1: version "1.2.1" @@ -12545,10 +12592,10 @@ resolve@1.5.0: dependencies: path-parse "^1.0.5" -resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.0, resolve@^1.14.2, resolve@^1.15.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: - version "1.15.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" - integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== +resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.0, resolve@^1.14.2, resolve@^1.15.0, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: path-parse "^1.0.6" @@ -12842,6 +12889,11 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" From 62335a7c374602966f0f7e3df0b9dec2850cbfde Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 16 Jul 2020 06:57:34 +0000 Subject: [PATCH 686/879] build(deps-dev): bump ember-source from 3.20.0 to 3.20.1 Bumps [ember-source](https://github.com/emberjs/ember.js) from 3.20.0 to 3.20.1. - [Release notes](https://github.com/emberjs/ember.js/releases) - [Changelog](https://github.com/emberjs/ember.js/blob/v3.20.1/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember.js/compare/v3.20.0...v3.20.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 7e001f56f..e147f78ad 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6931,9 +6931,9 @@ ember-source-channel-url@^2.0.1: got "^8.0.1" ember-source@~3.20.0: - version "3.20.0" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.20.0.tgz#00ce44b5ff1d58b2acaf9f48879a223994ffef39" - integrity sha512-umSKoAOR7mI3XAaUZBX8ki814eHKuymEvCtNOWb4DRz02whIKX+iUKq7kRPVWgCp2NIG/WF/e3X0TDIvrPUI3Q== + version "3.20.1" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.20.1.tgz#ade69fc31e7e2c9ab01f63491e10161032cf65f3" + integrity sha512-sxAQ2LvlFdqkh0Lw3v2uoXqXQQRdL7sxSwPkjgk1FJIYSzWbo2ecBNll+3cfvslq35xN8Dr3162naxoTGf3CJQ== dependencies: "@babel/helper-module-imports" "^7.8.3" "@babel/plugin-transform-block-scoping" "^7.8.3" From ca2767a26c5833165dc21d34a66f56d25df4eebc Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 24 Jul 2020 06:59:02 +0000 Subject: [PATCH 687/879] build(deps-dev): bump eslint-plugin-ember from 8.9.1 to 8.9.2 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 8.9.1 to 8.9.2. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v8.9.1...v8.9.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index e147f78ad..aed3f1252 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7252,9 +7252,9 @@ esdoc@pzuraq/esdoc#015a342: taffydb "2.7.2" eslint-plugin-ember@^8.1.0: - version "8.9.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.9.1.tgz#6d76440bd7bb1954ed61c7ebbb1a1cd8c8e1afa6" - integrity sha512-A7TFksLfLLoQEWOHCvJX6SvxxL99yDEPwDZIh28TOgwsPsXpVYJNk22UT5ZrufUyVtdnOH4IsF3jIkRIIE91IA== + version "8.9.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.9.2.tgz#064f2ca391958806885356d85d71962b3a69e665" + integrity sha512-oHQkQdCkT+q9TVjhYAdpqWQh7y6Z/a8thFgTS1LnlJVuv+M+J/evkOejjr+BM9wrZdBQwPG49d2OK0vIXsm9dw== dependencies: "@ember-data/rfc395-data" "^0.0.4" ember-rfc176-data "^0.3.13" From 9e4b28e5929f04334b8e76d9c5e06470fe98e791 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 27 Jul 2020 07:12:56 +0000 Subject: [PATCH 688/879] build(deps-dev): bump ember-source from 3.20.1 to 3.20.2 Bumps [ember-source](https://github.com/emberjs/ember.js) from 3.20.1 to 3.20.2. - [Release notes](https://github.com/emberjs/ember.js/releases) - [Changelog](https://github.com/emberjs/ember.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember.js/compare/v3.20.1...v3.20.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index aed3f1252..58c8da3f9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6931,9 +6931,9 @@ ember-source-channel-url@^2.0.1: got "^8.0.1" ember-source@~3.20.0: - version "3.20.1" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.20.1.tgz#ade69fc31e7e2c9ab01f63491e10161032cf65f3" - integrity sha512-sxAQ2LvlFdqkh0Lw3v2uoXqXQQRdL7sxSwPkjgk1FJIYSzWbo2ecBNll+3cfvslq35xN8Dr3162naxoTGf3CJQ== + version "3.20.2" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.20.2.tgz#c8ea4fd43230ae91e9362c3136b37ed9bdd91c2a" + integrity sha512-9uPBKF7B7doz6u0z+0vBczGqaAVpcGmjqQkZdtf0C0aYY7NXRYDMZrx7vudy5DRhP13Ryo4rjZhlcRgbFPR44w== dependencies: "@babel/helper-module-imports" "^7.8.3" "@babel/plugin-transform-block-scoping" "^7.8.3" From 1c3e1ca9fecf08cf33b07f228829b354b640f097 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 29 Jul 2020 20:58:59 +0000 Subject: [PATCH 689/879] build(deps): [security] bump elliptic from 6.5.2 to 6.5.3 Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.2 to 6.5.3. **This update includes a security fix.** - [Release notes](https://github.com/indutny/elliptic/releases) - [Commits](https://github.com/indutny/elliptic/compare/v6.5.2...v6.5.3) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index 58c8da3f9..d8f945d54 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3359,9 +3359,9 @@ bmp-js@^0.1.0: integrity sha1-4Fpj95amwf8l9Hcex62twUjAcjM= bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + version "4.11.9" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" + integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== body-parser@1.19.0: version "1.19.0" @@ -5802,9 +5802,9 @@ electron-to-chromium@^1.3.413: integrity sha512-smevlzzMNz3vMz6OLeeCq5HRWEj2AcgccNPYnAx4Usx0IOciq9DU36RJcICcS09hXoY7t7deRfVYKD14IrGb9A== elliptic@^6.0.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" - integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== + version "6.5.3" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" + integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== dependencies: bn.js "^4.4.0" brorand "^1.0.1" From 610d37b44f191d4dde513e5e4d4b7851079f6416 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 31 Jul 2020 07:08:48 +0000 Subject: [PATCH 690/879] build(deps): bump ember-cli-babel from 7.21.0 to 7.22.0 Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 7.21.0 to 7.22.0. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v7.21.0...v7.22.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 1180 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 673 insertions(+), 507 deletions(-) diff --git a/yarn.lock b/yarn.lock index d8f945d54..1ef9879d8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21,38 +21,45 @@ dependencies: "@babel/highlight" "^7.10.1" -"@babel/compat-data@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.1.tgz#b1085ffe72cd17bf2c0ee790fc09f9626011b2db" - integrity sha512-CHvCj7So7iCkGKPRFUfryXIkU2gSBw7VSZFYLsqVhrS47269VK2Hfi9S/YcublPMW8k1u2bQBlbDruoQEm4fgw== +"@babel/code-frame@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/compat-data@^7.10.4", "@babel/compat-data@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.11.0.tgz#e9f73efe09af1355b723a7f39b11bad637d7c99c" + integrity sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ== dependencies: browserslist "^4.12.0" invariant "^2.2.4" semver "^5.5.0" -"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.10.2", "@babel/core@^7.2.2", "@babel/core@^7.3.4": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.2.tgz#bd6786046668a925ac2bd2fd95b579b92a23b36a" - integrity sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ== - dependencies: - "@babel/code-frame" "^7.10.1" - "@babel/generator" "^7.10.2" - "@babel/helper-module-transforms" "^7.10.1" - "@babel/helpers" "^7.10.1" - "@babel/parser" "^7.10.2" - "@babel/template" "^7.10.1" - "@babel/traverse" "^7.10.1" - "@babel/types" "^7.10.2" +"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.11.0", "@babel/core@^7.2.2", "@babel/core@^7.3.4": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.0.tgz#73b9c33f1658506887f767c26dae07798b30df76" + integrity sha512-mkLq8nwaXmDtFmRkQ8ED/eA2CnVw4zr7dCztKalZXBvdK5EeNUAesrrwUqjQEzFgomJssayzB0aqlOsP1vGLqg== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.11.0" + "@babel/helper-module-transforms" "^7.11.0" + "@babel/helpers" "^7.10.4" + "@babel/parser" "^7.11.0" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.11.0" + "@babel/types" "^7.11.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" json5 "^2.1.2" - lodash "^4.17.13" + lodash "^4.17.19" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.10.1", "@babel/generator@^7.10.2": +"@babel/generator@^7.10.1": version "7.10.2" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.2.tgz#0fa5b5b2389db8bfdfcc3492b551ee20f5dd69a9" integrity sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA== @@ -62,12 +69,21 @@ lodash "^4.17.13" source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz#f6d08acc6f70bbd59b436262553fb2e259a1a268" - integrity sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw== +"@babel/generator@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.0.tgz#4b90c78d8c12825024568cbe83ee6c9af193585c" + integrity sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ== dependencies: - "@babel/types" "^7.10.1" + "@babel/types" "^7.11.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" + integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA== + dependencies: + "@babel/types" "^7.10.4" "@babel/helper-annotate-as-pure@^7.8.3": version "7.8.3" @@ -76,36 +92,36 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz#0ec7d9be8174934532661f87783eb18d72290059" - integrity sha512-cQpVq48EkYxUU0xozpGCLla3wlkdRRqLWu1ksFMXA9CM5KQmyyRpSEsYXbao7JUkOw/tAaYKCaYyZq6HOFYtyw== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" + integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg== dependencies: - "@babel/helper-explode-assignable-expression" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/helper-explode-assignable-expression" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helper-compilation-targets@^7.10.2": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz#a17d9723b6e2c750299d2a14d4637c76936d8285" - integrity sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA== +"@babel/helper-compilation-targets@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz#804ae8e3f04376607cc791b9d47d540276332bd2" + integrity sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ== dependencies: - "@babel/compat-data" "^7.10.1" + "@babel/compat-data" "^7.10.4" browserslist "^4.12.0" invariant "^2.2.4" levenary "^1.1.1" semver "^5.5.0" -"@babel/helper-create-class-features-plugin@^7.10.1": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.2.tgz#7474295770f217dbcf288bf7572eb213db46ee67" - integrity sha512-5C/QhkGFh1vqcziq1vAL6SI9ymzUp8BCYjFpvYVhWP4DlATIb3u5q3iUd35mvlyGs8fO7hckkW7i0tmH+5+bvQ== +"@babel/helper-create-class-features-plugin@^7.10.4", "@babel/helper-create-class-features-plugin@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d" + integrity sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A== dependencies: - "@babel/helper-function-name" "^7.10.1" - "@babel/helper-member-expression-to-functions" "^7.10.1" - "@babel/helper-optimise-call-expression" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/helper-replace-supers" "^7.10.1" - "@babel/helper-split-export-declaration" "^7.10.1" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-member-expression-to-functions" "^7.10.5" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" "@babel/helper-create-class-features-plugin@^7.8.3": version "7.8.6" @@ -119,13 +135,13 @@ "@babel/helper-replace-supers" "^7.8.6" "@babel/helper-split-export-declaration" "^7.8.3" -"@babel/helper-create-regexp-features-plugin@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz#1b8feeab1594cbcfbf3ab5a3bbcabac0468efdbd" - integrity sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA== +"@babel/helper-create-regexp-features-plugin@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8" + integrity sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.1" - "@babel/helper-regex" "^7.10.1" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-regex" "^7.10.4" regexpu-core "^4.7.0" "@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8": @@ -137,22 +153,22 @@ "@babel/helper-regex" "^7.8.3" regexpu-core "^4.7.0" -"@babel/helper-define-map@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz#5e69ee8308648470dd7900d159c044c10285221d" - integrity sha512-+5odWpX+OnvkD0Zmq7panrMuAGQBu6aPUgvMzuMGo4R+jUOvealEj2hiqI6WhxgKrTpFoFj0+VdsuA8KDxHBDg== +"@babel/helper-define-map@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30" + integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ== dependencies: - "@babel/helper-function-name" "^7.10.1" - "@babel/types" "^7.10.1" - lodash "^4.17.13" + "@babel/helper-function-name" "^7.10.4" + "@babel/types" "^7.10.5" + lodash "^4.17.19" -"@babel/helper-explode-assignable-expression@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.1.tgz#e9d76305ee1162ca467357ae25df94f179af2b7e" - integrity sha512-vcUJ3cDjLjvkKzt6rHrl767FeE7pMEYfPanq5L16GRtrXIoznc0HykNW2aEYkcnP76P0isoqJ34dDMFZwzEpJg== +"@babel/helper-explode-assignable-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz#40a1cd917bff1288f699a94a75b37a1a2dbd8c7c" + integrity sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A== dependencies: - "@babel/traverse" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" "@babel/helper-function-name@^7.10.1": version "7.10.1" @@ -163,6 +179,15 @@ "@babel/template" "^7.10.1" "@babel/types" "^7.10.1" +"@babel/helper-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" + integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== + dependencies: + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + "@babel/helper-function-name@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" @@ -179,6 +204,13 @@ dependencies: "@babel/types" "^7.10.1" +"@babel/helper-get-function-arity@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" + integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== + dependencies: + "@babel/types" "^7.10.4" + "@babel/helper-get-function-arity@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" @@ -186,19 +218,19 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-hoist-variables@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.1.tgz#7e77c82e5dcae1ebf123174c385aaadbf787d077" - integrity sha512-vLm5srkU8rI6X3+aQ1rQJyfjvCBLXP8cAGeuw04zeAM2ItKb1e7pmVmLyHb4sDaAYnLL13RHOZPLEtcGZ5xvjg== +"@babel/helper-hoist-variables@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" + integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA== dependencies: - "@babel/types" "^7.10.1" + "@babel/types" "^7.10.4" -"@babel/helper-member-expression-to-functions@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz#432967fd7e12a4afef66c4687d4ca22bc0456f15" - integrity sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g== +"@babel/helper-member-expression-to-functions@^7.10.4", "@babel/helper-member-expression-to-functions@^7.10.5": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" + integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q== dependencies: - "@babel/types" "^7.10.1" + "@babel/types" "^7.11.0" "@babel/helper-member-expression-to-functions@^7.8.3": version "7.8.3" @@ -207,32 +239,39 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-module-imports@^7.10.1", "@babel/helper-module-imports@^7.8.3": +"@babel/helper-module-imports@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" + integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-module-imports@^7.8.3": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz#dd331bd45bccc566ce77004e9d05fe17add13876" integrity sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg== dependencies: "@babel/types" "^7.10.1" -"@babel/helper-module-transforms@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz#24e2f08ee6832c60b157bb0936c86bef7210c622" - integrity sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg== +"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5", "@babel/helper-module-transforms@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" + integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg== dependencies: - "@babel/helper-module-imports" "^7.10.1" - "@babel/helper-replace-supers" "^7.10.1" - "@babel/helper-simple-access" "^7.10.1" - "@babel/helper-split-export-declaration" "^7.10.1" - "@babel/template" "^7.10.1" - "@babel/types" "^7.10.1" - lodash "^4.17.13" + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/template" "^7.10.4" + "@babel/types" "^7.11.0" + lodash "^4.17.19" -"@babel/helper-optimise-call-expression@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz#b4a1f2561870ce1247ceddb02a3860fa96d72543" - integrity sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg== +"@babel/helper-optimise-call-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" + integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== dependencies: - "@babel/types" "^7.10.1" + "@babel/types" "^7.10.4" "@babel/helper-optimise-call-expression@^7.8.3": version "7.8.3" @@ -251,12 +290,17 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz#ec5a5cf0eec925b66c60580328b122c01230a127" integrity sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA== -"@babel/helper-regex@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.1.tgz#021cf1a7ba99822f993222a001cc3fec83255b96" - integrity sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g== +"@babel/helper-plugin-utils@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@babel/helper-regex@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0" + integrity sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg== dependencies: - lodash "^4.17.13" + lodash "^4.17.19" "@babel/helper-regex@^7.8.3": version "7.8.3" @@ -265,26 +309,26 @@ dependencies: lodash "^4.17.13" -"@babel/helper-remap-async-to-generator@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz#bad6aaa4ff39ce8d4b82ccaae0bfe0f7dbb5f432" - integrity sha512-RfX1P8HqsfgmJ6CwaXGKMAqbYdlleqglvVtht0HGPMSsy2V6MqLlOJVF/0Qyb/m2ZCi2z3q3+s6Pv7R/dQuZ6A== +"@babel/helper-remap-async-to-generator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz#fce8bea4e9690bbe923056ded21e54b4e8b68ed5" + integrity sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.1" - "@babel/helper-wrap-function" "^7.10.1" - "@babel/template" "^7.10.1" - "@babel/traverse" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-wrap-function" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helper-replace-supers@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz#ec6859d20c5d8087f6a2dc4e014db7228975f13d" - integrity sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A== +"@babel/helper-replace-supers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" + integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== dependencies: - "@babel/helper-member-expression-to-functions" "^7.10.1" - "@babel/helper-optimise-call-expression" "^7.10.1" - "@babel/traverse" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/helper-member-expression-to-functions" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" "@babel/helper-replace-supers@^7.8.6": version "7.8.6" @@ -296,13 +340,20 @@ "@babel/traverse" "^7.8.6" "@babel/types" "^7.8.6" -"@babel/helper-simple-access@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz#08fb7e22ace9eb8326f7e3920a1c2052f13d851e" - integrity sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw== +"@babel/helper-simple-access@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" + integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== dependencies: - "@babel/template" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-skip-transparent-expression-wrappers@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz#eec162f112c2f58d3af0af125e3bb57665146729" + integrity sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q== + dependencies: + "@babel/types" "^7.11.0" "@babel/helper-split-export-declaration@^7.10.1": version "7.10.1" @@ -311,6 +362,13 @@ dependencies: "@babel/types" "^7.10.1" +"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" + integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== + dependencies: + "@babel/types" "^7.11.0" + "@babel/helper-split-export-declaration@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" @@ -333,24 +391,24 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" integrity sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw== -"@babel/helper-wrap-function@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz#956d1310d6696257a7afd47e4c42dfda5dfcedc9" - integrity sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ== +"@babel/helper-wrap-function@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87" + integrity sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug== dependencies: - "@babel/helper-function-name" "^7.10.1" - "@babel/template" "^7.10.1" - "@babel/traverse" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/helper-function-name" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helpers@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.1.tgz#a6827b7cb975c9d9cef5fd61d919f60d8844a973" - integrity sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw== +"@babel/helpers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" + integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== dependencies: - "@babel/template" "^7.10.1" - "@babel/traverse" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" "@babel/highlight@^7.10.1": version "7.10.1" @@ -361,6 +419,15 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/highlight@^7.8.3": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" @@ -370,64 +437,85 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.10.1", "@babel/parser@^7.10.2": +"@babel/parser@^7.10.1": version "7.10.2" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.2.tgz#871807f10442b92ff97e4783b9b54f6a0ca812d0" integrity sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ== +"@babel/parser@^7.10.4", "@babel/parser@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.0.tgz#a9d7e11aead25d3b422d17b2c6502c8dddef6a5d" + integrity sha512-qvRvi4oI8xii8NllyEc4MDJjuZiNaRzyb7Y7lup1NqJV8TZHF4O27CcP+72WPn/k1zkgJ6WJfnIbk4jTsVAZHw== + "@babel/parser@^7.3.4", "@babel/parser@^7.4.5", "@babel/parser@^7.7.0", "@babel/parser@^7.8.6": version "7.9.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== -"@babel/plugin-proposal-async-generator-functions@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.1.tgz#6911af5ba2e615c4ff3c497fe2f47b35bf6d7e55" - integrity sha512-vzZE12ZTdB336POZjmpblWfNNRpMSua45EYnRigE2XsZxcXcIyly2ixnTJasJE4Zq3U7t2d8rRF7XRUuzHxbOw== +"@babel/plugin-proposal-async-generator-functions@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz#3491cabf2f7c179ab820606cec27fed15e0e8558" + integrity sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/helper-remap-async-to-generator" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.10.4" "@babel/plugin-syntax-async-generators" "^7.8.0" -"@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.10.1", "@babel/plugin-proposal-class-properties@^7.3.4": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz#046bc7f6550bb08d9bd1d4f060f5f5a4f1087e01" - integrity sha512-sqdGWgoXlnOdgMXU+9MbhzwFRgxVLeiGBqTrnuS7LC2IBU31wSsESbTUreT2O418obpfPdGUR2GbEufZF1bpqw== +"@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.10.4", "@babel/plugin-proposal-class-properties@^7.3.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807" + integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-proposal-decorators@^7.10.1", "@babel/plugin-proposal-decorators@^7.3.0": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.10.1.tgz#9373c2d8db45345c6e30452ad77b469758e5c8f7" - integrity sha512-xBfteh352MTke2U1NpclzMDmAmCdQ2fBZjhZQQfGTjXw6qcRYMkt528sA1U8o0ThDCSeuETXIj5bOGdxN+5gkw== +"@babel/plugin-proposal-decorators@^7.10.5", "@babel/plugin-proposal-decorators@^7.3.0": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.10.5.tgz#42898bba478bc4b1ae242a703a953a7ad350ffb4" + integrity sha512-Sc5TAQSZuLzgY0664mMDn24Vw2P8g/VhyLyGPaWiHahhgLqeZvcGeyBZOrJW0oSKIK2mvQ22a1ENXBIQLhrEiQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-syntax-decorators" "^7.10.1" + "@babel/helper-create-class-features-plugin" "^7.10.5" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-decorators" "^7.10.4" -"@babel/plugin-proposal-dynamic-import@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz#e36979dc1dc3b73f6d6816fc4951da2363488ef0" - integrity sha512-Cpc2yUVHTEGPlmiQzXj026kqwjEQAD9I4ZC16uzdbgWgitg/UHKHLffKNCQZ5+y8jpIZPJcKcwsr2HwPh+w3XA== +"@babel/plugin-proposal-dynamic-import@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz#ba57a26cb98b37741e9d5bca1b8b0ddf8291f17e" + integrity sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-dynamic-import" "^7.8.0" -"@babel/plugin-proposal-json-strings@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.1.tgz#b1e691ee24c651b5a5e32213222b2379734aff09" - integrity sha512-m8r5BmV+ZLpWPtMY2mOKN7wre6HIO4gfIiV+eOmsnZABNenrt/kzYBwrh+KOfgumSWpnlGs5F70J8afYMSJMBg== +"@babel/plugin-proposal-export-namespace-from@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz#570d883b91031637b3e2958eea3c438e62c05f54" + integrity sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz#593e59c63528160233bd321b1aebe0820c2341db" + integrity sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.0" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz#02dca21673842ff2fe763ac253777f235e9bbf78" - integrity sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA== +"@babel/plugin-proposal-logical-assignment-operators@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz#9f80e482c03083c87125dee10026b58527ea20c8" + integrity sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz#02a7e961fc32e6d5b2db0649e01bf80ddee7e04a" + integrity sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" "@babel/plugin-proposal-nullish-coalescing-operator@^7.4.4": @@ -438,37 +526,38 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/plugin-proposal-numeric-separator@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.1.tgz#a9a38bc34f78bdfd981e791c27c6fdcec478c123" - integrity sha512-jjfym4N9HtCiNfyyLAVD8WqPYeHUrw4ihxuAynWj6zzp2gf9Ey2f7ImhFm6ikB3CLf5Z/zmcJDri6B4+9j9RsA== +"@babel/plugin-proposal-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz#ce1590ff0a65ad12970a609d78855e9a4c1aef06" + integrity sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-syntax-numeric-separator" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz#cba44908ac9f142650b4a65b8aa06bf3478d5fb6" - integrity sha512-Z+Qri55KiQkHh7Fc4BW6o+QBuTagbOp9txE+4U1i79u9oWlf2npkiDx+Rf3iK3lbcHBuNy9UOkwuR5wOMH3LIQ== +"@babel/plugin-proposal-object-rest-spread@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz#bd81f95a1f746760ea43b6c2d3d62b11790ad0af" + integrity sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.10.1" + "@babel/plugin-transform-parameters" "^7.10.4" -"@babel/plugin-proposal-optional-catch-binding@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz#c9f86d99305f9fa531b568ff5ab8c964b8b223d2" - integrity sha512-VqExgeE62YBqI3ogkGoOJp1R6u12DFZjqwJhqtKc2o5m1YTUuUWnos7bZQFBhwkxIFpWYJ7uB75U7VAPPiKETA== +"@babel/plugin-proposal-optional-catch-binding@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz#31c938309d24a78a49d68fdabffaa863758554dd" + integrity sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.1.tgz#15f5d6d22708629451a91be28f8facc55b0e818c" - integrity sha512-dqQj475q8+/avvok72CF3AOSV/SGEcH29zT5hhohqqvvZ2+boQoOr7iGldBG5YXTO2qgCgc2B3WvVLUdbeMlGA== +"@babel/plugin-proposal-optional-chaining@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz#de5866d0646f6afdaab8a566382fe3a221755076" + integrity sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" "@babel/plugin-syntax-optional-chaining" "^7.8.0" "@babel/plugin-proposal-optional-chaining@^7.6.0": @@ -479,21 +568,21 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-private-methods@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.1.tgz#ed85e8058ab0fe309c3f448e5e1b73ca89cdb598" - integrity sha512-RZecFFJjDiQ2z6maFprLgrdnm0OzoC23Mx89xf1CcEsxmHuzuXOdniEuI+S3v7vjQG4F5sa6YtUp+19sZuSxHg== +"@babel/plugin-proposal-private-methods@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz#b160d972b8fdba5c7d111a145fc8c421fc2a6909" + integrity sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-proposal-unicode-property-regex@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.1.tgz#dc04feb25e2dd70c12b05d680190e138fa2c0c6f" - integrity sha512-JjfngYRvwmPwmnbRZyNiPFI8zxCZb8euzbCG/LxyKdeTb59tVciKo9GK9bi6JYKInk1H11Dq9j/zRqIH4KigfQ== +"@babel/plugin-proposal-unicode-property-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz#4483cda53041ce3413b7fe2f00022665ddfaa75d" + integrity sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.8.8" @@ -510,19 +599,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz#d5bc0645913df5b17ad7eda0fa2308330bde34c5" - integrity sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ== +"@babel/plugin-syntax-class-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c" + integrity sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-decorators@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.1.tgz#16b869c4beafc9a442565147bda7ce0967bd4f13" - integrity sha512-a9OAbQhKOwSle1Vr0NJu/ISg1sPfdEkfRKWpgPuzhnWWzForou2gIeUIIwjAMHRekhhpJ7eulZlYs0H14Cbi+g== +"@babel/plugin-syntax-decorators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.4.tgz#6853085b2c429f9d322d02f5a635018cdeb2360c" + integrity sha512-2NaoC6fAk2VMdhY1eerkfHV+lVYC1u8b+jmRJISqANCJlTxYy19HGdIkkQtix2UtkcPuPu+IlDgrVseZnU03bw== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-dynamic-import@^7.2.0", "@babel/plugin-syntax-dynamic-import@^7.8.0": version "7.8.3" @@ -531,6 +620,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-json-strings@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" @@ -538,6 +634,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" @@ -545,12 +648,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz#25761ee7410bc8cf97327ba741ee94e4a61b7d99" - integrity sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg== +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.0": version "7.8.3" @@ -573,19 +676,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.1.tgz#8b8733f8c57397b3eaa47ddba8841586dcaef362" - integrity sha512-hgA5RYkmZm8FTFT3yu2N9Bx7yVVOKYT6yEdXXo6j2JTm0wNxgqaGeQVaSHRjhfnQbX91DtjFB6McRFSlcJH3xQ== +"@babel/plugin-syntax-top-level-await@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz#4bbeb8917b54fcf768364e0a81f560e33a3ef57d" + integrity sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-typescript@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.1.tgz#5e82bc27bb4202b93b949b029e699db536733810" - integrity sha512-X/d8glkrAtra7CaQGMiGs/OGa6XgUzqPcBXCIGFCpCqnfGlT0Wfbzo/B89xHhnInTaItPK8LALblVXcUOEh95Q== +"@babel/plugin-syntax-typescript@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz#2f55e770d3501e83af217d782cb7517d7bb34d25" + integrity sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-typescript@^7.2.0", "@babel/plugin-syntax-typescript@^7.8.3": version "7.8.3" @@ -594,30 +697,37 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-arrow-functions@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz#cb5ee3a36f0863c06ead0b409b4cc43a889b295b" - integrity sha512-6AZHgFJKP3DJX0eCNJj01RpytUa3SOGawIxweHkNX2L6PYikOZmoh5B0d7hIHaIgveMjX990IAa/xK7jRTN8OA== +"@babel/plugin-transform-arrow-functions@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz#e22960d77e697c74f41c501d44d73dbf8a6a64cd" + integrity sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-async-to-generator@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz#e5153eb1a3e028f79194ed8a7a4bf55f862b2062" - integrity sha512-XCgYjJ8TY2slj6SReBUyamJn3k2JLUIiiR5b6t1mNCMSvv7yx+jJpaewakikp0uWFQSF7ChPPoe3dHmXLpISkg== +"@babel/plugin-transform-async-to-generator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz#41a5017e49eb6f3cda9392a51eef29405b245a37" + integrity sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ== dependencies: - "@babel/helper-module-imports" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/helper-remap-async-to-generator" "^7.10.1" + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.10.4" -"@babel/plugin-transform-block-scoped-functions@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz#146856e756d54b20fff14b819456b3e01820b85d" - integrity sha512-B7K15Xp8lv0sOJrdVAoukKlxP9N59HS48V1J3U/JGj+Ad+MHq+am6xJVs85AgXrQn4LV8vaYFOB+pr/yIuzW8Q== +"@babel/plugin-transform-block-scoped-functions@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz#1afa595744f75e43a91af73b0d998ecfe4ebc2e8" + integrity sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-block-scoping@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.5.tgz#b81b8aafefbfe68f0f65f7ef397b9ece68a6037d" + integrity sha512-6Ycw3hjpQti0qssQcA6AMSFDHeNJ++R6dIMnpRqUjFeBBTmTDPa8zgF90OVfTvAo11mXZTlVUViY1g8ffrURLg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-block-scoping@^7.10.1", "@babel/plugin-transform-block-scoping@^7.6.2", "@babel/plugin-transform-block-scoping@^7.8.3": +"@babel/plugin-transform-block-scoping@^7.6.2", "@babel/plugin-transform-block-scoping@^7.8.3": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz#47092d89ca345811451cd0dc5d91605982705d5e" integrity sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw== @@ -625,41 +735,41 @@ "@babel/helper-plugin-utils" "^7.10.1" lodash "^4.17.13" -"@babel/plugin-transform-classes@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz#6e11dd6c4dfae70f540480a4702477ed766d733f" - integrity sha512-P9V0YIh+ln/B3RStPoXpEQ/CoAxQIhRSUn7aXqQ+FZJ2u8+oCtjIXR3+X0vsSD8zv+mb56K7wZW1XiDTDGiDRQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.10.1" - "@babel/helper-define-map" "^7.10.1" - "@babel/helper-function-name" "^7.10.1" - "@babel/helper-optimise-call-expression" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/helper-replace-supers" "^7.10.1" - "@babel/helper-split-export-declaration" "^7.10.1" +"@babel/plugin-transform-classes@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz#405136af2b3e218bc4a1926228bc917ab1a0adc7" + integrity sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-define-map" "^7.10.4" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.1.tgz#59aa399064429d64dce5cf76ef9b90b7245ebd07" - integrity sha512-mqSrGjp3IefMsXIenBfGcPXxJxweQe2hEIwMQvjtiDQ9b1IBvDUjkAtV/HMXX47/vXf14qDNedXsIiNd1FmkaQ== +"@babel/plugin-transform-computed-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz#9ded83a816e82ded28d52d4b4ecbdd810cdfc0eb" + integrity sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-destructuring@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz#abd58e51337815ca3a22a336b85f62b998e71907" - integrity sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA== +"@babel/plugin-transform-destructuring@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz#70ddd2b3d1bea83d01509e9bb25ddb3a74fc85e5" + integrity sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-dotall-regex@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.1.tgz#920b9fec2d78bb57ebb64a644d5c2ba67cc104ee" - integrity sha512-19VIMsD1dp02RvduFUmfzj8uknaO3uiHHF0s3E1OHnVsNj8oge8EQ5RzHRbJjGSetRnkEuBYO7TG1M5kKjGLOA== +"@babel/plugin-transform-dotall-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz#469c2062105c1eb6a040eaf4fac4b488078395ee" + integrity sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.8.3" @@ -669,100 +779,100 @@ "@babel/helper-create-regexp-features-plugin" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-duplicate-keys@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.1.tgz#c900a793beb096bc9d4d0a9d0cde19518ffc83b9" - integrity sha512-wIEpkX4QvX8Mo9W6XF3EdGttrIPZWozHfEaDTU0WJD/TDnXMvdDh30mzUl/9qWhnf7naicYartcEfUghTCSNpA== +"@babel/plugin-transform-duplicate-keys@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz#697e50c9fee14380fe843d1f306b295617431e47" + integrity sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-exponentiation-operator@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz#279c3116756a60dd6e6f5e488ba7957db9c59eb3" - integrity sha512-lr/przdAbpEA2BUzRvjXdEDLrArGRRPwbaF9rvayuHRvdQ7lUTTkZnhZrJ4LE2jvgMRFF4f0YuPQ20vhiPYxtA== +"@babel/plugin-transform-exponentiation-operator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz#5ae338c57f8cf4001bdb35607ae66b92d665af2e" + integrity sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-for-of@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz#ff01119784eb0ee32258e8646157ba2501fcfda5" - integrity sha512-US8KCuxfQcn0LwSCMWMma8M2R5mAjJGsmoCBVwlMygvmDUMkTCykc84IqN1M7t+agSfOmLYTInLCHJM+RUoz+w== +"@babel/plugin-transform-for-of@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz#c08892e8819d3a5db29031b115af511dbbfebae9" + integrity sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-function-name@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz#4ed46fd6e1d8fde2a2ec7b03c66d853d2c92427d" - integrity sha512-//bsKsKFBJfGd65qSNNh1exBy5Y9gD9ZN+DvrJ8f7HXr4avE5POW6zB7Rj6VnqHV33+0vXWUwJT0wSHubiAQkw== +"@babel/plugin-transform-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz#6a467880e0fc9638514ba369111811ddbe2644b7" + integrity sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg== dependencies: - "@babel/helper-function-name" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-literals@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz#5794f8da82846b22e4e6631ea1658bce708eb46a" - integrity sha512-qi0+5qgevz1NHLZroObRm5A+8JJtibb7vdcPQF1KQE12+Y/xxl8coJ+TpPW9iRq+Mhw/NKLjm+5SHtAHCC7lAw== +"@babel/plugin-transform-literals@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz#9f42ba0841100a135f22712d0e391c462f571f3c" + integrity sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz#90347cba31bca6f394b3f7bd95d2bbfd9fce2f39" - integrity sha512-UmaWhDokOFT2GcgU6MkHC11i0NQcL63iqeufXWfRy6pUOGYeCGEKhvfFO6Vz70UfYJYHwveg62GS83Rvpxn+NA== +"@babel/plugin-transform-member-expression-literals@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz#b1ec44fcf195afcb8db2c62cd8e551c881baf8b7" + integrity sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-modules-amd@^7.0.0", "@babel/plugin-transform-modules-amd@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.1.tgz#65950e8e05797ebd2fe532b96e19fc5482a1d52a" - integrity sha512-31+hnWSFRI4/ACFr1qkboBbrTxoBIzj7qA69qlq8HY8p7+YCzkCT6/TvQ1a4B0z27VeWtAeJd6pr5G04dc1iHw== +"@babel/plugin-transform-modules-amd@^7.0.0", "@babel/plugin-transform-modules-amd@^7.10.4", "@babel/plugin-transform-modules-amd@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz#1b9cddaf05d9e88b3aad339cb3e445c4f020a9b1" + integrity sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw== dependencies: - "@babel/helper-module-transforms" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-module-transforms" "^7.10.5" + "@babel/helper-plugin-utils" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz#d5ff4b4413ed97ffded99961056e1fb980fb9301" - integrity sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg== +"@babel/plugin-transform-modules-commonjs@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0" + integrity sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w== dependencies: - "@babel/helper-module-transforms" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/helper-simple-access" "^7.10.1" + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.1.tgz#9962e4b0ac6aaf2e20431ada3d8ec72082cbffb6" - integrity sha512-ewNKcj1TQZDL3YnO85qh9zo1YF1CHgmSTlRQgHqe63oTrMI85cthKtZjAiZSsSNjPQ5NCaYo5QkbYqEw1ZBgZA== +"@babel/plugin-transform-modules-systemjs@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz#6270099c854066681bae9e05f87e1b9cadbe8c85" + integrity sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw== dependencies: - "@babel/helper-hoist-variables" "^7.10.1" - "@babel/helper-module-transforms" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-hoist-variables" "^7.10.4" + "@babel/helper-module-transforms" "^7.10.5" + "@babel/helper-plugin-utils" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.1.tgz#ea080911ffc6eb21840a5197a39ede4ee67b1595" - integrity sha512-EIuiRNMd6GB6ulcYlETnYYfgv4AxqrswghmBRQbWLHZxN4s7mupxzglnHqk9ZiUpDI4eRWewedJJNj67PWOXKA== +"@babel/plugin-transform-modules-umd@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz#9a8481fe81b824654b3a0b65da3df89f3d21839e" + integrity sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA== dependencies: - "@babel/helper-module-transforms" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" - integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== +"@babel/plugin-transform-named-capturing-groups-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz#78b4d978810b6f3bcf03f9e318f2fc0ed41aecb6" + integrity sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-create-regexp-features-plugin" "^7.10.4" -"@babel/plugin-transform-new-target@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.1.tgz#6ee41a5e648da7632e22b6fb54012e87f612f324" - integrity sha512-MBlzPc1nJvbmO9rPr1fQwXOM2iGut+JC92ku6PbiJMMK7SnQc1rytgpopveE3Evn47gzvGYeCdgfCDbZo0ecUw== +"@babel/plugin-transform-new-target@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz#9097d753cb7b024cb7381a3b2e52e9513a9c6888" + integrity sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-object-assign@^7.8.3": version "7.8.3" @@ -771,98 +881,99 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-object-super@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz#2e3016b0adbf262983bf0d5121d676a5ed9c4fde" - integrity sha512-WnnStUDN5GL+wGQrJylrnnVlFhFmeArINIR9gjhSeYyvroGhBrSAXYg/RHsnfzmsa+onJrTJrEClPzgNmmQ4Gw== +"@babel/plugin-transform-object-super@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz#d7146c4d139433e7a6526f888c667e314a093894" + integrity sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/helper-replace-supers" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" -"@babel/plugin-transform-parameters@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz#b25938a3c5fae0354144a720b07b32766f683ddd" - integrity sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg== +"@babel/plugin-transform-parameters@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz#59d339d58d0b1950435f4043e74e2510005e2c4a" + integrity sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw== dependencies: - "@babel/helper-get-function-arity" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-property-literals@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz#cffc7315219230ed81dc53e4625bf86815b6050d" - integrity sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA== +"@babel/plugin-transform-property-literals@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz#f6fe54b6590352298785b83edd815d214c42e3c0" + integrity sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-regenerator@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz#10e175cbe7bdb63cc9b39f9b3f823c5c7c5c5490" - integrity sha512-B3+Y2prScgJ2Bh/2l9LJxKbb8C8kRfsG4AdPT+n7ixBHIxJaIG8bi8tgjxUMege1+WqSJ+7gu1YeoMVO3gPWzw== +"@babel/plugin-transform-regenerator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz#2015e59d839074e76838de2159db421966fd8b63" + integrity sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw== dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.1.tgz#0fc1027312b4d1c3276a57890c8ae3bcc0b64a86" - integrity sha512-qN1OMoE2nuqSPmpTqEM7OvJ1FkMEV+BjVeZZm9V9mq/x1JLKQ4pcv8riZJMNN3u2AUGl0ouOMjRr2siecvHqUQ== +"@babel/plugin-transform-reserved-words@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz#8f2682bcdcef9ed327e1b0861585d7013f8a54dd" + integrity sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-runtime@^7.10.1", "@babel/plugin-transform-runtime@^7.2.0": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.10.1.tgz#fd1887f749637fb2ed86dc278e79eb41df37f4b1" - integrity sha512-4w2tcglDVEwXJ5qxsY++DgWQdNJcCCsPxfT34wCUwIf2E7dI7pMpH8JczkMBbgBTNzBX62SZlNJ9H+De6Zebaw== +"@babel/plugin-transform-runtime@^7.11.0", "@babel/plugin-transform-runtime@^7.2.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.0.tgz#e27f78eb36f19448636e05c33c90fd9ad9b8bccf" + integrity sha512-LFEsP+t3wkYBlis8w6/kmnd6Kb1dxTd+wGJ8MlxTGzQo//ehtqlVL4S9DNUa53+dtPSQobN2CXx4d81FqC58cw== dependencies: - "@babel/helper-module-imports" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" resolve "^1.8.1" semver "^5.5.1" -"@babel/plugin-transform-shorthand-properties@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz#e8b54f238a1ccbae482c4dce946180ae7b3143f3" - integrity sha512-AR0E/lZMfLstScFwztApGeyTHJ5u3JUKMjneqRItWeEqDdHWZwAOKycvQNCasCK/3r5YXsuNG25funcJDu7Y2g== +"@babel/plugin-transform-shorthand-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz#9fd25ec5cdd555bb7f473e5e6ee1c971eede4dd6" + integrity sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-spread@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz#0c6d618a0c4461a274418460a28c9ccf5239a7c8" - integrity sha512-8wTPym6edIrClW8FI2IoaePB91ETOtg36dOkj3bYcNe7aDMN2FXEoUa+WrmPc4xa1u2PQK46fUX2aCb+zo9rfw== +"@babel/plugin-transform-spread@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz#fa84d300f5e4f57752fe41a6d1b3c554f13f17cc" + integrity sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" -"@babel/plugin-transform-sticky-regex@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz#90fc89b7526228bed9842cff3588270a7a393b00" - integrity sha512-j17ojftKjrL7ufX8ajKvwRilwqTok4q+BjkknmQw9VNHnItTyMP5anPFzxFJdCQs7clLcWpCV3ma+6qZWLnGMA== +"@babel/plugin-transform-sticky-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz#8f3889ee8657581130a29d9cc91d7c73b7c4a28d" + integrity sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/helper-regex" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-regex" "^7.10.4" -"@babel/plugin-transform-template-literals@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.1.tgz#914c7b7f4752c570ea00553b4284dad8070e8628" - integrity sha512-t7B/3MQf5M1T9hPCRG28DNGZUuxAuDqLYS03rJrIk2prj/UV7Z6FOneijhQhnv/Xa039vidXeVbvjK2SK5f7Gg== +"@babel/plugin-transform-template-literals@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz#78bc5d626a6642db3312d9d0f001f5e7639fde8c" + integrity sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-typeof-symbol@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.1.tgz#60c0239b69965d166b80a84de7315c1bc7e0bb0e" - integrity sha512-qX8KZcmbvA23zDi+lk9s6hC1FM7jgLHYIjuLgULgc8QtYnmB3tAVIYkNoKRQ75qWBeyzcoMoK8ZQmogGtC/w0g== +"@babel/plugin-transform-typeof-symbol@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz#9509f1a7eec31c4edbffe137c16cc33ff0bc5bfc" + integrity sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-typescript@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.10.1.tgz#2c54daea231f602468686d9faa76f182a94507a6" - integrity sha512-v+QWKlmCnsaimLeqq9vyCsVRMViZG1k2SZTlcZvB+TqyH570Zsij8nvVUZzOASCRiQFUxkLrn9Wg/kH0zgy5OQ== +"@babel/plugin-transform-typescript@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz#2b4879676af37342ebb278216dd090ac67f13abb" + integrity sha512-edJsNzTtvb3MaXQwj8403B7mZoGu9ElDJQZOKjGUnvilquxBA3IQoEIOvkX/1O8xfAsnHS/oQhe2w/IXrr+w0w== dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-syntax-typescript" "^7.10.1" + "@babel/helper-create-class-features-plugin" "^7.10.5" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-typescript" "^7.10.4" "@babel/plugin-transform-typescript@~7.4.0": version "7.4.5" @@ -881,93 +992,97 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-typescript" "^7.8.3" -"@babel/plugin-transform-unicode-escapes@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.1.tgz#add0f8483dab60570d9e03cecef6c023aa8c9940" - integrity sha512-zZ0Poh/yy1d4jeDWpx/mNwbKJVwUYJX73q+gyh4bwtG0/iUlzdEu0sLMda8yuDFS6LBQlT/ST1SJAR6zYwXWgw== +"@babel/plugin-transform-unicode-escapes@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz#feae523391c7651ddac115dae0a9d06857892007" + integrity sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-unicode-regex@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz#6b58f2aea7b68df37ac5025d9c88752443a6b43f" - integrity sha512-Y/2a2W299k0VIUdbqYm9X2qS6fE0CUBhhiPpimK6byy7OJ/kORLlIX+J6UrjgNu5awvs62k+6RSslxhcvVw2Tw== +"@babel/plugin-transform-unicode-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz#e56d71f9282fac6db09c82742055576d5e6d80a8" + integrity sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/polyfill@^7.0.0", "@babel/polyfill@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.10.1.tgz#d56d4c8be8dd6ec4dce2649474e9b707089f739f" - integrity sha512-TviueJ4PBW5p48ra8IMtLXVkDucrlOZAIZ+EXqS3Ot4eukHbWiqcn7DcqpA1k5PcKtmJ4Xl9xwdv6yQvvcA+3g== +"@babel/polyfill@^7.0.0", "@babel/polyfill@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.10.4.tgz#915e5bfe61490ac0199008e35ca9d7d151a8e45a" + integrity sha512-8BYcnVqQ5kMD2HXoHInBH7H1b/uP3KdnwCYXOqFnXqguOyuu443WXusbIUbWEfY3Z0Txk0M1uG/8YuAMhNl6zg== dependencies: core-js "^2.6.5" regenerator-runtime "^0.13.4" -"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.10.2": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.10.2.tgz#715930f2cf8573b0928005ee562bed52fb65fdfb" - integrity sha512-MjqhX0RZaEgK/KueRzh+3yPSk30oqDKJ5HP5tqTSB1e2gzGS3PLy7K0BIpnp78+0anFuSwOeuCf1zZO7RzRvEA== - dependencies: - "@babel/compat-data" "^7.10.1" - "@babel/helper-compilation-targets" "^7.10.2" - "@babel/helper-module-imports" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-proposal-async-generator-functions" "^7.10.1" - "@babel/plugin-proposal-class-properties" "^7.10.1" - "@babel/plugin-proposal-dynamic-import" "^7.10.1" - "@babel/plugin-proposal-json-strings" "^7.10.1" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.1" - "@babel/plugin-proposal-numeric-separator" "^7.10.1" - "@babel/plugin-proposal-object-rest-spread" "^7.10.1" - "@babel/plugin-proposal-optional-catch-binding" "^7.10.1" - "@babel/plugin-proposal-optional-chaining" "^7.10.1" - "@babel/plugin-proposal-private-methods" "^7.10.1" - "@babel/plugin-proposal-unicode-property-regex" "^7.10.1" +"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.10.2", "@babel/preset-env@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.11.0.tgz#860ee38f2ce17ad60480c2021ba9689393efb796" + integrity sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg== + dependencies: + "@babel/compat-data" "^7.11.0" + "@babel/helper-compilation-targets" "^7.10.4" + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-proposal-async-generator-functions" "^7.10.4" + "@babel/plugin-proposal-class-properties" "^7.10.4" + "@babel/plugin-proposal-dynamic-import" "^7.10.4" + "@babel/plugin-proposal-export-namespace-from" "^7.10.4" + "@babel/plugin-proposal-json-strings" "^7.10.4" + "@babel/plugin-proposal-logical-assignment-operators" "^7.11.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.4" + "@babel/plugin-proposal-numeric-separator" "^7.10.4" + "@babel/plugin-proposal-object-rest-spread" "^7.11.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.10.4" + "@babel/plugin-proposal-optional-chaining" "^7.11.0" + "@babel/plugin-proposal-private-methods" "^7.10.4" + "@babel/plugin-proposal-unicode-property-regex" "^7.10.4" "@babel/plugin-syntax-async-generators" "^7.8.0" - "@babel/plugin-syntax-class-properties" "^7.10.1" + "@babel/plugin-syntax-class-properties" "^7.10.4" "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - "@babel/plugin-syntax-numeric-separator" "^7.10.1" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-syntax-top-level-await" "^7.10.1" - "@babel/plugin-transform-arrow-functions" "^7.10.1" - "@babel/plugin-transform-async-to-generator" "^7.10.1" - "@babel/plugin-transform-block-scoped-functions" "^7.10.1" - "@babel/plugin-transform-block-scoping" "^7.10.1" - "@babel/plugin-transform-classes" "^7.10.1" - "@babel/plugin-transform-computed-properties" "^7.10.1" - "@babel/plugin-transform-destructuring" "^7.10.1" - "@babel/plugin-transform-dotall-regex" "^7.10.1" - "@babel/plugin-transform-duplicate-keys" "^7.10.1" - "@babel/plugin-transform-exponentiation-operator" "^7.10.1" - "@babel/plugin-transform-for-of" "^7.10.1" - "@babel/plugin-transform-function-name" "^7.10.1" - "@babel/plugin-transform-literals" "^7.10.1" - "@babel/plugin-transform-member-expression-literals" "^7.10.1" - "@babel/plugin-transform-modules-amd" "^7.10.1" - "@babel/plugin-transform-modules-commonjs" "^7.10.1" - "@babel/plugin-transform-modules-systemjs" "^7.10.1" - "@babel/plugin-transform-modules-umd" "^7.10.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" - "@babel/plugin-transform-new-target" "^7.10.1" - "@babel/plugin-transform-object-super" "^7.10.1" - "@babel/plugin-transform-parameters" "^7.10.1" - "@babel/plugin-transform-property-literals" "^7.10.1" - "@babel/plugin-transform-regenerator" "^7.10.1" - "@babel/plugin-transform-reserved-words" "^7.10.1" - "@babel/plugin-transform-shorthand-properties" "^7.10.1" - "@babel/plugin-transform-spread" "^7.10.1" - "@babel/plugin-transform-sticky-regex" "^7.10.1" - "@babel/plugin-transform-template-literals" "^7.10.1" - "@babel/plugin-transform-typeof-symbol" "^7.10.1" - "@babel/plugin-transform-unicode-escapes" "^7.10.1" - "@babel/plugin-transform-unicode-regex" "^7.10.1" + "@babel/plugin-syntax-top-level-await" "^7.10.4" + "@babel/plugin-transform-arrow-functions" "^7.10.4" + "@babel/plugin-transform-async-to-generator" "^7.10.4" + "@babel/plugin-transform-block-scoped-functions" "^7.10.4" + "@babel/plugin-transform-block-scoping" "^7.10.4" + "@babel/plugin-transform-classes" "^7.10.4" + "@babel/plugin-transform-computed-properties" "^7.10.4" + "@babel/plugin-transform-destructuring" "^7.10.4" + "@babel/plugin-transform-dotall-regex" "^7.10.4" + "@babel/plugin-transform-duplicate-keys" "^7.10.4" + "@babel/plugin-transform-exponentiation-operator" "^7.10.4" + "@babel/plugin-transform-for-of" "^7.10.4" + "@babel/plugin-transform-function-name" "^7.10.4" + "@babel/plugin-transform-literals" "^7.10.4" + "@babel/plugin-transform-member-expression-literals" "^7.10.4" + "@babel/plugin-transform-modules-amd" "^7.10.4" + "@babel/plugin-transform-modules-commonjs" "^7.10.4" + "@babel/plugin-transform-modules-systemjs" "^7.10.4" + "@babel/plugin-transform-modules-umd" "^7.10.4" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.4" + "@babel/plugin-transform-new-target" "^7.10.4" + "@babel/plugin-transform-object-super" "^7.10.4" + "@babel/plugin-transform-parameters" "^7.10.4" + "@babel/plugin-transform-property-literals" "^7.10.4" + "@babel/plugin-transform-regenerator" "^7.10.4" + "@babel/plugin-transform-reserved-words" "^7.10.4" + "@babel/plugin-transform-shorthand-properties" "^7.10.4" + "@babel/plugin-transform-spread" "^7.11.0" + "@babel/plugin-transform-sticky-regex" "^7.10.4" + "@babel/plugin-transform-template-literals" "^7.10.4" + "@babel/plugin-transform-typeof-symbol" "^7.10.4" + "@babel/plugin-transform-unicode-escapes" "^7.10.4" + "@babel/plugin-transform-unicode-regex" "^7.10.4" "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.10.2" + "@babel/types" "^7.11.0" browserslist "^4.12.0" core-js-compat "^3.6.2" invariant "^2.2.2" @@ -985,10 +1100,10 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/runtime@^7.10.2", "@babel/runtime@^7.2.0", "@babel/runtime@^7.8.4": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.2.tgz#d103f21f2602497d38348a32e008637d506db839" - integrity sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg== +"@babel/runtime@^7.11.0", "@babel/runtime@^7.2.0", "@babel/runtime@^7.8.4": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.0.tgz#f10245877042a815e07f7e693faff0ae9d3a2aac" + integrity sha512-qArkXsjJq7H+T86WrIFV0Fnu/tNOkZ4cgXmjkzAu3b/58D5mFIO8JH/y77t7C9q0OdDRdh9s7Ue5GasYssxtXw== dependencies: regenerator-runtime "^0.13.4" @@ -1001,6 +1116,15 @@ "@babel/parser" "^7.10.1" "@babel/types" "^7.10.1" +"@babel/template@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" + integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" + "@babel/template@^7.8.3": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" @@ -1010,7 +1134,7 @@ "@babel/parser" "^7.8.6" "@babel/types" "^7.8.6" -"@babel/traverse@^7.1.6", "@babel/traverse@^7.10.1", "@babel/traverse@^7.2.4", "@babel/traverse@^7.3.4", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.6": +"@babel/traverse@^7.1.6", "@babel/traverse@^7.2.4", "@babel/traverse@^7.3.4", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.6": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.1.tgz#bbcef3031e4152a6c0b50147f4958df54ca0dd27" integrity sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ== @@ -1025,6 +1149,21 @@ globals "^11.1.0" lodash "^4.17.13" +"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.0.tgz#9b996ce1b98f53f7c3e4175115605d56ed07dd24" + integrity sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.11.0" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/parser" "^7.11.0" + "@babel/types" "^7.11.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + "@babel/types@^7.1.6", "@babel/types@^7.10.1", "@babel/types@^7.10.2", "@babel/types@^7.3.2", "@babel/types@^7.3.4", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6": version "7.10.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.2.tgz#30283be31cad0dbf6fb00bd40641ca0ea675172d" @@ -1034,6 +1173,15 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.0.tgz#2ae6bf1ba9ae8c3c43824e5861269871b206e90d" + integrity sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + "@babel/types@^7.7.2": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.4.tgz#369517188352e18219981efd156bfdb199fff1ee" @@ -2808,13 +2956,20 @@ babel-plugin-ember-data-packages-polyfill@^0.1.2: dependencies: "@ember-data/rfc395-data" "^0.0.4" -babel-plugin-ember-modules-api-polyfill@^2.13.4, babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-polyfill@^2.8.0: +babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-polyfill@^2.8.0: version "2.13.4" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.13.4.tgz#cf62bc9bfd808c48d810d5194f4329e9453bd603" integrity sha512-uxQPkEQAzCYdwhZk16O9m1R4xtCRNy4oEUTBrccOPfzlIahRZJic/JeP/ZEL0BC6Mfq6r55eOg6gMF/zdFoCvA== dependencies: ember-rfc176-data "^0.3.13" +babel-plugin-ember-modules-api-polyfill@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-3.1.0.tgz#02e2e6ab4220b28692a4bc08a5eb81ff96313a5f" + integrity sha512-TfyzenLPEZPorhO0omUUVpdQS+iKGehF4refqxP9znQN6MnjtxjSiGfRNnWY1syjK2/zCEuxIB91TmqrR/9bCg== + dependencies: + ember-rfc176-data "^0.3.14" + babel-plugin-feature-flags@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/babel-plugin-feature-flags/-/babel-plugin-feature-flags-0.3.1.tgz#9c827cf9a4eb9a19f725ccb239e85cab02036fc1" @@ -3508,18 +3663,19 @@ broccoli-babel-transpiler@^6.5.0: rsvp "^4.8.2" workerpool "^2.3.0" -broccoli-babel-transpiler@^7.1.2, broccoli-babel-transpiler@^7.5.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.5.0.tgz#6137e2c9324eebe1d83b6a01c7b445bfc5612d49" - integrity sha512-CrLrI8HX7mDqVR+/r8WiTZuQQh6hGMGwal9jyKk+kpk7t/4hqL6oQ06FRt81kazbHm4bil4WJ+kGB+aOfAx+XA== +broccoli-babel-transpiler@^7.1.2, broccoli-babel-transpiler@^7.7.0: + version "7.7.0" + resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.7.0.tgz#271d401e713bfd338d5ef0435d3c4c68f6eddd2a" + integrity sha512-U8Cmnv0/AcQKehiIVi6UDzqq3jqhAEbY9CvOW5vdeNRmYhFpK6bXPmVczS/nUz5g4KsPc/FdnC3zbU6yVf4e7w== dependencies: - "@babel/core" "^7.10.2" - "@babel/polyfill" "^7.10.1" + "@babel/core" "^7.11.0" + "@babel/polyfill" "^7.10.4" broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.2" broccoli-persistent-filter "^2.2.1" clone "^2.1.2" hash-for-dep "^1.4.7" + heimdalljs "^0.2.1" heimdalljs-logger "^0.1.9" json-stable-stringify "^1.0.1" rsvp "^4.8.4" @@ -6043,26 +6199,26 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, semver "^5.5.0" ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.13.2, ember-cli-babel@^7.18.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: - version "7.21.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.21.0.tgz#c79e888876aee87dfc3260aee7cb580b74264bbc" - integrity sha512-jHVi9melAibo0DrAG3GAxid+29xEyjBoU53652B4qcu3Xp58feZGTH/JGXovH7TjvbeNn65zgNyoV3bk1onULw== - dependencies: - "@babel/core" "^7.10.2" - "@babel/helper-compilation-targets" "^7.10.2" - "@babel/plugin-proposal-class-properties" "^7.10.1" - "@babel/plugin-proposal-decorators" "^7.10.1" - "@babel/plugin-transform-modules-amd" "^7.10.1" - "@babel/plugin-transform-runtime" "^7.10.1" - "@babel/plugin-transform-typescript" "^7.10.1" - "@babel/polyfill" "^7.10.1" - "@babel/preset-env" "^7.10.2" - "@babel/runtime" "^7.10.2" + version "7.22.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.22.0.tgz#ef9d56aaa77e5ef2ad894dba20a91492b89e34d0" + integrity sha512-uy3Ye8AMUJycGX0m6Gi39hLyJ0oIGgIO/cg4EGK+xsXLyBbxoV6m2Dzi2gFKsCGq/2XafOCpX5qtCSWWd8JFIw== + dependencies: + "@babel/core" "^7.11.0" + "@babel/helper-compilation-targets" "^7.10.4" + "@babel/plugin-proposal-class-properties" "^7.10.4" + "@babel/plugin-proposal-decorators" "^7.10.5" + "@babel/plugin-transform-modules-amd" "^7.10.5" + "@babel/plugin-transform-runtime" "^7.11.0" + "@babel/plugin-transform-typescript" "^7.11.0" + "@babel/polyfill" "^7.10.4" + "@babel/preset-env" "^7.11.0" + "@babel/runtime" "^7.11.0" amd-name-resolver "^1.2.1" babel-plugin-debug-macros "^0.3.3" babel-plugin-ember-data-packages-polyfill "^0.1.2" - babel-plugin-ember-modules-api-polyfill "^2.13.4" + babel-plugin-ember-modules-api-polyfill "^3.1.0" babel-plugin-module-resolver "^3.1.1" - broccoli-babel-transpiler "^7.5.0" + broccoli-babel-transpiler "^7.7.0" broccoli-debug "^0.6.4" broccoli-funnel "^2.0.1" broccoli-source "^1.1.0" @@ -6891,6 +7047,11 @@ ember-rfc176-data@^0.3.13: resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.13.tgz#ed1712a26e65fec703655f35410414aa1982cf3b" integrity sha512-m9JbwQlT6PjY7x/T8HslnXP7Sz9bx/pz3FrNfNi2NesJnbNISly0Lix6NV1fhfo46572cpq4jrM+/6yYlMefTQ== +ember-rfc176-data@^0.3.14: + version "0.3.14" + resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.14.tgz#308808aa4bfdb655e6c3624fbe774699906c59ed" + integrity sha512-C4so9WmmDpRiAZYEzmFwgOSGyFCOL53vKkDuC3YXmbHF+fwDgBl18wt/N6D6pgHF9xXjt+WjHX0QTQzg3tOCyw== + ember-router-generator@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-2.0.0.tgz#d04abfed4ba8b42d166477bbce47fccc672dbde0" @@ -10308,6 +10469,11 @@ lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +lodash@^4.17.19: + version "4.17.19" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" + integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== + log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" From a85ea76b5f5828ab7085ee9e972f1d6de62e0e95 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 31 Jul 2020 07:09:27 +0000 Subject: [PATCH 691/879] build(deps-dev): bump ember-source from 3.20.2 to 3.20.3 Bumps [ember-source](https://github.com/emberjs/ember.js) from 3.20.2 to 3.20.3. - [Release notes](https://github.com/emberjs/ember.js/releases) - [Changelog](https://github.com/emberjs/ember.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember.js/compare/v3.20.2...v3.20.3) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1ef9879d8..dc1e71ca0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7092,9 +7092,9 @@ ember-source-channel-url@^2.0.1: got "^8.0.1" ember-source@~3.20.0: - version "3.20.2" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.20.2.tgz#c8ea4fd43230ae91e9362c3136b37ed9bdd91c2a" - integrity sha512-9uPBKF7B7doz6u0z+0vBczGqaAVpcGmjqQkZdtf0C0aYY7NXRYDMZrx7vudy5DRhP13Ryo4rjZhlcRgbFPR44w== + version "3.20.3" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.20.3.tgz#fdc0e8d9a402985783a2c53729f75abbb7b2ac95" + integrity sha512-Fpz0eVFcL4s74d2mw5D3RFGlhRcljB6N4RyjsuumwYTlg7UMrkDdlHy7A1ZI2tDw2Cz7uE7W2dKzSnCQcZGcVQ== dependencies: "@babel/helper-module-imports" "^7.8.3" "@babel/plugin-transform-block-scoping" "^7.8.3" From 03f703e96387261d9d1d8d43d3d1957960dada05 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 3 Aug 2020 07:40:21 +0000 Subject: [PATCH 692/879] build(deps): bump ember-cli-babel from 7.22.0 to 7.22.1 Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 7.22.0 to 7.22.1. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v7.22.0...v7.22.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/yarn.lock b/yarn.lock index dc1e71ca0..fa88e9178 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2963,12 +2963,12 @@ babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-p dependencies: ember-rfc176-data "^0.3.13" -babel-plugin-ember-modules-api-polyfill@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-3.1.0.tgz#02e2e6ab4220b28692a4bc08a5eb81ff96313a5f" - integrity sha512-TfyzenLPEZPorhO0omUUVpdQS+iKGehF4refqxP9znQN6MnjtxjSiGfRNnWY1syjK2/zCEuxIB91TmqrR/9bCg== +babel-plugin-ember-modules-api-polyfill@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-3.1.1.tgz#c6e9ede43b64c4e36512f260e42e829b071d9b4f" + integrity sha512-hRTnr59fJ6cIiSiSgQLM9QRiVv/RrBAYRYggCPQDj4dvYhOWZeoX6e+1jFY1qC3tJnSDuMWu3OrDciSIi1MJ0A== dependencies: - ember-rfc176-data "^0.3.14" + ember-rfc176-data "^0.3.15" babel-plugin-feature-flags@^0.3.1: version "0.3.1" @@ -6199,9 +6199,9 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, semver "^5.5.0" ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.13.2, ember-cli-babel@^7.18.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: - version "7.22.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.22.0.tgz#ef9d56aaa77e5ef2ad894dba20a91492b89e34d0" - integrity sha512-uy3Ye8AMUJycGX0m6Gi39hLyJ0oIGgIO/cg4EGK+xsXLyBbxoV6m2Dzi2gFKsCGq/2XafOCpX5qtCSWWd8JFIw== + version "7.22.1" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.22.1.tgz#cad28b89cf0e184c93b863d09bc5ba4ce1d2e453" + integrity sha512-kCT8WbC1AYFtyOpU23ESm22a+gL6fWv8Nzwe8QFQ5u0piJzM9MEudfbjADEaoyKTrjMQTDsrWwEf3yjggDsOng== dependencies: "@babel/core" "^7.11.0" "@babel/helper-compilation-targets" "^7.10.4" @@ -6216,7 +6216,7 @@ ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cl amd-name-resolver "^1.2.1" babel-plugin-debug-macros "^0.3.3" babel-plugin-ember-data-packages-polyfill "^0.1.2" - babel-plugin-ember-modules-api-polyfill "^3.1.0" + babel-plugin-ember-modules-api-polyfill "^3.1.1" babel-plugin-module-resolver "^3.1.1" broccoli-babel-transpiler "^7.7.0" broccoli-debug "^0.6.4" @@ -7047,10 +7047,10 @@ ember-rfc176-data@^0.3.13: resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.13.tgz#ed1712a26e65fec703655f35410414aa1982cf3b" integrity sha512-m9JbwQlT6PjY7x/T8HslnXP7Sz9bx/pz3FrNfNi2NesJnbNISly0Lix6NV1fhfo46572cpq4jrM+/6yYlMefTQ== -ember-rfc176-data@^0.3.14: - version "0.3.14" - resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.14.tgz#308808aa4bfdb655e6c3624fbe774699906c59ed" - integrity sha512-C4so9WmmDpRiAZYEzmFwgOSGyFCOL53vKkDuC3YXmbHF+fwDgBl18wt/N6D6pgHF9xXjt+WjHX0QTQzg3tOCyw== +ember-rfc176-data@^0.3.15: + version "0.3.15" + resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.15.tgz#af3f1da5a0339b6feda380edc2f7190e0f416c2d" + integrity sha512-GPKa7zRDBblRy0orxTXt5yrpp/Pf5CkuRFSIR8qMFDww0CqCKjCRwdZnWYzCM4kAEfZnXRIDDefe1tBaFw7v7w== ember-router-generator@^2.0.0: version "2.0.0" From a7399695daa86da9debedc68da449c6db1517bb9 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 3 Aug 2020 07:41:20 +0000 Subject: [PATCH 693/879] build(deps-dev): bump qunit-dom from 1.2.0 to 1.4.0 Bumps [qunit-dom](https://github.com/simplabs/qunit-dom) from 1.2.0 to 1.4.0. - [Release notes](https://github.com/simplabs/qunit-dom/releases) - [Changelog](https://github.com/simplabs/qunit-dom/blob/master/CHANGELOG.md) - [Commits](https://github.com/simplabs/qunit-dom/compare/v1.2.0...v1.4.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/yarn.lock b/yarn.lock index fa88e9178..6ce86b1b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3914,7 +3914,7 @@ broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1, broccoli-funnel@^2.0.2: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-funnel@^3.0.0, broccoli-funnel@^3.0.2: +broccoli-funnel@^3.0.0, broccoli-funnel@^3.0.2, broccoli-funnel@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.3.tgz#26fd42632471f67a91f4770d1987118087219937" integrity sha512-LPzZ91BwStoHZXdXHQAJeYORl189OrRKM5NdIi86SDU9wZ4s/3lV1PRFOiobDT/jKM10voM7CDzfvicHbCYxAQ== @@ -12268,11 +12268,11 @@ quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quick-temp@^0.1.8: underscore.string "~3.3.4" qunit-dom@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-1.2.0.tgz#464cca19e9976c4cee4b14b06da6645c03026880" - integrity sha512-8UqSimcDIo19nokb3eh+Z5hov07xDeLnwsWAgCYPFGcpUF/eiZAIHbLDPCixH0SM1YqCm4YGCLVCojY6sJD5xQ== + version "1.4.0" + resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-1.4.0.tgz#912d3e99aac5f3ff8cb3296269ddc3855ae17801" + integrity sha512-kDR6A4IdDZBluyCRCfJLVoplWIAQdAijVfZdRN3yTBIjOyaFQT+BlHR0IsNTFbB7LAa0/6u/UQEYKClYvwjROQ== dependencies: - broccoli-funnel "^3.0.2" + broccoli-funnel "^3.0.3" broccoli-merge-trees "^4.2.0" qunit@~2.6.0: From bb24c3cd96733917a03854846ba8dbf3ae01d5f2 Mon Sep 17 00:00:00 2001 From: Kelly Selden <602423+kellyselden@users.noreply.github.com> Date: Wed, 5 Aug 2020 14:50:21 +0100 Subject: [PATCH 694/879] revert public dep updates that removed node 8 (#2025) --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 0920a5c3a..eb4b1135b 100644 --- a/package.json +++ b/package.json @@ -36,8 +36,8 @@ }, "dependencies": { "broccoli-file-creator": "^2.1.1", - "broccoli-funnel": "^3.0.2", - "broccoli-merge-trees": "^4.2.0", + "broccoli-funnel": "^2.0.2", + "broccoli-merge-trees": "^3.0.2", "ember-auto-import": "^1.2.19", "ember-cli-babel": "^7.5.0", "ember-get-config": "^0.2.2", From a5a7409d5aa25d924f65723a81fe456316fe9212 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 6 Aug 2020 06:50:32 +0000 Subject: [PATCH 695/879] build(deps-dev): bump eslint-plugin-ember from 8.9.2 to 8.10.0 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 8.9.2 to 8.10.0. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v8.9.2...v8.10.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/yarn.lock b/yarn.lock index 6ce86b1b6..9d1261d8a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3914,7 +3914,7 @@ broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1, broccoli-funnel@^2.0.2: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-funnel@^3.0.0, broccoli-funnel@^3.0.2, broccoli-funnel@^3.0.3: +broccoli-funnel@^3.0.0, broccoli-funnel@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.3.tgz#26fd42632471f67a91f4770d1987118087219937" integrity sha512-LPzZ91BwStoHZXdXHQAJeYORl189OrRKM5NdIi86SDU9wZ4s/3lV1PRFOiobDT/jKM10voM7CDzfvicHbCYxAQ== @@ -7042,12 +7042,7 @@ ember-responsive@^3.0.5: dependencies: ember-cli-babel "^6.6.0" -ember-rfc176-data@^0.3.13: - version "0.3.13" - resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.13.tgz#ed1712a26e65fec703655f35410414aa1982cf3b" - integrity sha512-m9JbwQlT6PjY7x/T8HslnXP7Sz9bx/pz3FrNfNi2NesJnbNISly0Lix6NV1fhfo46572cpq4jrM+/6yYlMefTQ== - -ember-rfc176-data@^0.3.15: +ember-rfc176-data@^0.3.13, ember-rfc176-data@^0.3.15: version "0.3.15" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.15.tgz#af3f1da5a0339b6feda380edc2f7190e0f416c2d" integrity sha512-GPKa7zRDBblRy0orxTXt5yrpp/Pf5CkuRFSIR8qMFDww0CqCKjCRwdZnWYzCM4kAEfZnXRIDDefe1tBaFw7v7w== @@ -7413,12 +7408,12 @@ esdoc@pzuraq/esdoc#015a342: taffydb "2.7.2" eslint-plugin-ember@^8.1.0: - version "8.9.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.9.2.tgz#064f2ca391958806885356d85d71962b3a69e665" - integrity sha512-oHQkQdCkT+q9TVjhYAdpqWQh7y6Z/a8thFgTS1LnlJVuv+M+J/evkOejjr+BM9wrZdBQwPG49d2OK0vIXsm9dw== + version "8.10.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.10.0.tgz#48571e205fd42859c7e84640563e8de3a2725712" + integrity sha512-Ci7LuoBC1vJqWX00v1AcjXNhPo9TY47WwE9hMfNIxmvUvg0oKqaaYVHdzbz2oEkhnJ38kA7v3AjE4ga9BvaDkw== dependencies: "@ember-data/rfc395-data" "^0.0.4" - ember-rfc176-data "^0.3.13" + ember-rfc176-data "^0.3.15" lodash.kebabcase "^4.1.1" snake-case "^3.0.3" From 384f1615ff333026b726009efd2a67958460117e Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Thu, 6 Aug 2020 12:30:49 -0400 Subject: [PATCH 696/879] v1.1.8 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index eb4b1135b..0da377caa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "1.1.7", + "version": "1.1.8", "description": "A client-side server to help you build, test and demo your Ember app", "keywords": [ "ember-addon", From 4240f6f0394c35e70b2f0e2a67bd03134a1f3040 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 10 Aug 2020 06:58:20 +0000 Subject: [PATCH 697/879] build(deps-dev): bump jsdom from 16.3.0 to 16.4.0 Bumps [jsdom](https://github.com/jsdom/jsdom) from 16.3.0 to 16.4.0. - [Release notes](https://github.com/jsdom/jsdom/releases) - [Changelog](https://github.com/jsdom/jsdom/blob/master/Changelog.md) - [Commits](https://github.com/jsdom/jsdom/compare/16.3.0...16.4.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9d1261d8a..8ec32615c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9770,9 +9770,9 @@ jsdom@^15.2.1: xml-name-validator "^3.0.0" jsdom@^16.2.2: - version "16.3.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.3.0.tgz#75690b7dac36c67be49c336dcd7219bbbed0810c" - integrity sha512-zggeX5UuEknpdZzv15+MS1dPYG0J/TftiiNunOeNxSl3qr8Z6cIlQpN0IdJa44z9aFxZRIVqRncvEhQ7X5DtZg== + version "16.4.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.4.0.tgz#36005bde2d136f73eee1a830c6d45e55408edddb" + integrity sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w== dependencies: abab "^2.0.3" acorn "^7.1.1" From 91d65f408bf41661aefa075fbcee5ca8f0a58e55 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 10 Aug 2020 06:58:51 +0000 Subject: [PATCH 698/879] build(deps-dev): bump eslint-plugin-ember from 8.10.0 to 8.10.1 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 8.10.0 to 8.10.1. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v8.10.0...v8.10.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 8ec32615c..c8ee3e792 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7408,9 +7408,9 @@ esdoc@pzuraq/esdoc#015a342: taffydb "2.7.2" eslint-plugin-ember@^8.1.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.10.0.tgz#48571e205fd42859c7e84640563e8de3a2725712" - integrity sha512-Ci7LuoBC1vJqWX00v1AcjXNhPo9TY47WwE9hMfNIxmvUvg0oKqaaYVHdzbz2oEkhnJ38kA7v3AjE4ga9BvaDkw== + version "8.10.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.10.1.tgz#359e31dc5478959244481c03323e22813ff65508" + integrity sha512-NmsrB8E4An8ErjHz5exCS4zjJSueFetZ9UCqdqYyERV6i/yucSBlPsop6tM2Bfopj0nSbB+qdSzTF3AZWVAAqA== dependencies: "@ember-data/rfc395-data" "^0.0.4" ember-rfc176-data "^0.3.15" From 0e58bd04823fb5520dd2b552ef01f8215d28760c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 12 Aug 2020 06:58:17 +0000 Subject: [PATCH 699/879] build(deps-dev): bump ember-source from 3.20.3 to 3.20.4 Bumps [ember-source](https://github.com/emberjs/ember.js) from 3.20.3 to 3.20.4. - [Release notes](https://github.com/emberjs/ember.js/releases) - [Changelog](https://github.com/emberjs/ember.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember.js/compare/v3.20.3...v3.20.4) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 30 +++++------------------------- 1 file changed, 5 insertions(+), 25 deletions(-) diff --git a/yarn.lock b/yarn.lock index c8ee3e792..60727dbcf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -239,20 +239,13 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-module-imports@^7.10.4": +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== dependencies: "@babel/types" "^7.10.4" -"@babel/helper-module-imports@^7.8.3": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz#dd331bd45bccc566ce77004e9d05fe17add13876" - integrity sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg== - dependencies: - "@babel/types" "^7.10.1" - "@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5", "@babel/helper-module-transforms@^7.11.0": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" @@ -285,11 +278,6 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== -"@babel/helper-plugin-utils@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz#ec5a5cf0eec925b66c60580328b122c01230a127" - integrity sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA== - "@babel/helper-plugin-utils@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" @@ -720,21 +708,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-block-scoping@^7.10.4": +"@babel/plugin-transform-block-scoping@^7.10.4", "@babel/plugin-transform-block-scoping@^7.6.2", "@babel/plugin-transform-block-scoping@^7.8.3": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.5.tgz#b81b8aafefbfe68f0f65f7ef397b9ece68a6037d" integrity sha512-6Ycw3hjpQti0qssQcA6AMSFDHeNJ++R6dIMnpRqUjFeBBTmTDPa8zgF90OVfTvAo11mXZTlVUViY1g8ffrURLg== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-block-scoping@^7.6.2", "@babel/plugin-transform-block-scoping@^7.8.3": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz#47092d89ca345811451cd0dc5d91605982705d5e" - integrity sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - lodash "^4.17.13" - "@babel/plugin-transform-classes@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz#405136af2b3e218bc4a1926228bc917ab1a0adc7" @@ -7087,9 +7067,9 @@ ember-source-channel-url@^2.0.1: got "^8.0.1" ember-source@~3.20.0: - version "3.20.3" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.20.3.tgz#fdc0e8d9a402985783a2c53729f75abbb7b2ac95" - integrity sha512-Fpz0eVFcL4s74d2mw5D3RFGlhRcljB6N4RyjsuumwYTlg7UMrkDdlHy7A1ZI2tDw2Cz7uE7W2dKzSnCQcZGcVQ== + version "3.20.4" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.20.4.tgz#582545ae3b20de5ffd9f8b43c42c94815e592291" + integrity sha512-ycWlaq7W63S3Nh7pMRU4oXNirBB9MbNGDN6hUgs3/qc1gjOUVGfGv0p2NPVcKXgqWtbiqrWGqCbp1iTay2MUpA== dependencies: "@babel/helper-module-imports" "^7.8.3" "@babel/plugin-transform-block-scoping" "^7.8.3" From 3553857982d293a156f921646aa04885ba0fdcfd Mon Sep 17 00:00:00 2001 From: Brian Gantzler Date: Fri, 14 Aug 2020 13:10:48 -0400 Subject: [PATCH 700/879] [feat] makeServer named export (#1994) --- .eslintrc.js | 2 +- .gitignore | 3 + addon/ember-data.js | 8 +- addon/index.js | 1 + addon/server.js | 4 +- addon/start-mirage.js | 17 ++- app/initializers/ember-cli-mirage.js | 7 +- scripts/link.sh | 4 +- scripts/test.sh | 1 + test-projects/01-basic-app/.bin | 1 - .../02-app-that-excludes-mirage/.bin | 1 - .../.editorconfig | 20 +++ .../03-app-that-uses-make-server/.ember-cli | 9 ++ .../.eslintignore | 4 + .../03-app-that-uses-make-server/.eslintrc.js | 2 + .../03-app-that-uses-make-server/.gitignore | 23 ++++ .../03-app-that-uses-make-server/.npmignore | 1 + .../03-app-that-uses-make-server/.travis.yml | 29 ++++ .../.watchmanconfig | 3 + .../03-app-that-uses-make-server/README.md | 57 ++++++++ .../03-app-that-uses-make-server/app/app.js | 14 ++ .../app/components/.gitkeep | 0 .../app/controllers/.gitkeep | 0 .../app/controllers/application.js | 22 ++++ .../app/helpers/.gitkeep | 0 .../app/index.html | 25 ++++ .../app/models/.gitkeep | 0 .../app/models/book.js | 8 ++ .../app/models/tag.js | 5 + .../app/models/things/watch.js | 5 + .../app/models/user.js | 13 ++ .../app/pods/application/template.hbs | 3 + .../app/pods/crud-demo-error/template.hbs | 5 + .../app/pods/crud-demo/controller.js | 29 ++++ .../app/pods/crud-demo/route.js | 12 ++ .../app/pods/crud-demo/template.hbs | 42 ++++++ .../app/pods/module-count/controller.js | 22 ++++ .../app/pods/module-count/template.hbs | 20 +++ .../app/resolver.js | 3 + .../app/router.js | 14 ++ .../app/routes/.gitkeep | 0 .../app/styles/app.css | 0 .../app/templates/application.hbs | 22 ++++ .../app/templates/components/.gitkeep | 0 .../config/environment.js | 58 ++++++++ .../config/optional-features.json | 3 + .../config/targets.js | 18 +++ .../ember-cli-build.js | 26 ++++ .../fastboot-tests/included-files-test.js | 85 ++++++++++++ .../mirage/config.js | 14 ++ .../mirage/factories/nested/thing.js | 5 + .../mirage/factories/user.js | 10 ++ .../mirage/fixtures/countries.js | 3 + .../mirage/fixtures/nested/things.js | 3 + .../mirage/fixtures/users.js | 5 + .../mirage/identity-managers/book.js | 57 ++++++++ .../mirage/identity-managers/nested/thing.js | 56 ++++++++ .../mirage/models/nested/thing.js | 4 + .../mirage/scenarios/default.js | 7 + .../mirage/serializers/application.js | 3 + .../mirage/serializers/nested/thing.js | 9 ++ .../03-app-that-uses-make-server/package.json | 53 ++++++++ .../public/robots.txt | 3 + .../03-app-that-uses-make-server/testem.js | 24 ++++ .../tests/acceptance/crud-demo-test.js | 67 ++++++++++ .../tests/acceptance/ember-data-test.js | 72 ++++++++++ .../tests/acceptance/faker-test.js | 15 +++ .../tests/acceptance/fixtures-test.js | 20 +++ .../tests/acceptance/identity-manager-test.js | 10 ++ .../acceptance/legacy-start-mirage-test.js | 59 +++++++++ .../tests/acceptance/request-tracking-test.js | 51 +++++++ .../tests/acceptance/start-mirage-test.js | 124 ++++++++++++++++++ .../tests/helpers/destroy-app.js | 9 ++ .../tests/helpers/module-for-acceptance.js | 21 +++ .../tests/helpers/promise-ajax.js | 10 ++ .../tests/helpers/resolver.js | 11 ++ .../tests/helpers/start-app.js | 17 +++ .../tests/index.html | 33 +++++ .../tests/test-helper.js | 8 ++ .../vendor/.gitkeep | 0 .../advanced/server-configuration/template.md | 95 ++++++++++++++ tests/dummy/app/pods/docs/template.hbs | 1 + tests/dummy/app/router.js | 1 + 83 files changed, 1514 insertions(+), 17 deletions(-) delete mode 120000 test-projects/01-basic-app/.bin delete mode 120000 test-projects/02-app-that-excludes-mirage/.bin create mode 100644 test-projects/03-app-that-uses-make-server/.editorconfig create mode 100644 test-projects/03-app-that-uses-make-server/.ember-cli create mode 100644 test-projects/03-app-that-uses-make-server/.eslintignore create mode 100644 test-projects/03-app-that-uses-make-server/.eslintrc.js create mode 100644 test-projects/03-app-that-uses-make-server/.gitignore create mode 100644 test-projects/03-app-that-uses-make-server/.npmignore create mode 100644 test-projects/03-app-that-uses-make-server/.travis.yml create mode 100644 test-projects/03-app-that-uses-make-server/.watchmanconfig create mode 100644 test-projects/03-app-that-uses-make-server/README.md create mode 100644 test-projects/03-app-that-uses-make-server/app/app.js create mode 100644 test-projects/03-app-that-uses-make-server/app/components/.gitkeep create mode 100644 test-projects/03-app-that-uses-make-server/app/controllers/.gitkeep create mode 100644 test-projects/03-app-that-uses-make-server/app/controllers/application.js create mode 100644 test-projects/03-app-that-uses-make-server/app/helpers/.gitkeep create mode 100644 test-projects/03-app-that-uses-make-server/app/index.html create mode 100644 test-projects/03-app-that-uses-make-server/app/models/.gitkeep create mode 100644 test-projects/03-app-that-uses-make-server/app/models/book.js create mode 100644 test-projects/03-app-that-uses-make-server/app/models/tag.js create mode 100644 test-projects/03-app-that-uses-make-server/app/models/things/watch.js create mode 100644 test-projects/03-app-that-uses-make-server/app/models/user.js create mode 100644 test-projects/03-app-that-uses-make-server/app/pods/application/template.hbs create mode 100644 test-projects/03-app-that-uses-make-server/app/pods/crud-demo-error/template.hbs create mode 100644 test-projects/03-app-that-uses-make-server/app/pods/crud-demo/controller.js create mode 100644 test-projects/03-app-that-uses-make-server/app/pods/crud-demo/route.js create mode 100644 test-projects/03-app-that-uses-make-server/app/pods/crud-demo/template.hbs create mode 100644 test-projects/03-app-that-uses-make-server/app/pods/module-count/controller.js create mode 100644 test-projects/03-app-that-uses-make-server/app/pods/module-count/template.hbs create mode 100644 test-projects/03-app-that-uses-make-server/app/resolver.js create mode 100644 test-projects/03-app-that-uses-make-server/app/router.js create mode 100644 test-projects/03-app-that-uses-make-server/app/routes/.gitkeep create mode 100644 test-projects/03-app-that-uses-make-server/app/styles/app.css create mode 100644 test-projects/03-app-that-uses-make-server/app/templates/application.hbs create mode 100644 test-projects/03-app-that-uses-make-server/app/templates/components/.gitkeep create mode 100644 test-projects/03-app-that-uses-make-server/config/environment.js create mode 100644 test-projects/03-app-that-uses-make-server/config/optional-features.json create mode 100644 test-projects/03-app-that-uses-make-server/config/targets.js create mode 100644 test-projects/03-app-that-uses-make-server/ember-cli-build.js create mode 100644 test-projects/03-app-that-uses-make-server/fastboot-tests/included-files-test.js create mode 100644 test-projects/03-app-that-uses-make-server/mirage/config.js create mode 100644 test-projects/03-app-that-uses-make-server/mirage/factories/nested/thing.js create mode 100644 test-projects/03-app-that-uses-make-server/mirage/factories/user.js create mode 100644 test-projects/03-app-that-uses-make-server/mirage/fixtures/countries.js create mode 100644 test-projects/03-app-that-uses-make-server/mirage/fixtures/nested/things.js create mode 100644 test-projects/03-app-that-uses-make-server/mirage/fixtures/users.js create mode 100644 test-projects/03-app-that-uses-make-server/mirage/identity-managers/book.js create mode 100644 test-projects/03-app-that-uses-make-server/mirage/identity-managers/nested/thing.js create mode 100644 test-projects/03-app-that-uses-make-server/mirage/models/nested/thing.js create mode 100644 test-projects/03-app-that-uses-make-server/mirage/scenarios/default.js create mode 100644 test-projects/03-app-that-uses-make-server/mirage/serializers/application.js create mode 100644 test-projects/03-app-that-uses-make-server/mirage/serializers/nested/thing.js create mode 100644 test-projects/03-app-that-uses-make-server/package.json create mode 100644 test-projects/03-app-that-uses-make-server/public/robots.txt create mode 100644 test-projects/03-app-that-uses-make-server/testem.js create mode 100644 test-projects/03-app-that-uses-make-server/tests/acceptance/crud-demo-test.js create mode 100644 test-projects/03-app-that-uses-make-server/tests/acceptance/ember-data-test.js create mode 100644 test-projects/03-app-that-uses-make-server/tests/acceptance/faker-test.js create mode 100644 test-projects/03-app-that-uses-make-server/tests/acceptance/fixtures-test.js create mode 100644 test-projects/03-app-that-uses-make-server/tests/acceptance/identity-manager-test.js create mode 100644 test-projects/03-app-that-uses-make-server/tests/acceptance/legacy-start-mirage-test.js create mode 100644 test-projects/03-app-that-uses-make-server/tests/acceptance/request-tracking-test.js create mode 100644 test-projects/03-app-that-uses-make-server/tests/acceptance/start-mirage-test.js create mode 100644 test-projects/03-app-that-uses-make-server/tests/helpers/destroy-app.js create mode 100644 test-projects/03-app-that-uses-make-server/tests/helpers/module-for-acceptance.js create mode 100644 test-projects/03-app-that-uses-make-server/tests/helpers/promise-ajax.js create mode 100644 test-projects/03-app-that-uses-make-server/tests/helpers/resolver.js create mode 100644 test-projects/03-app-that-uses-make-server/tests/helpers/start-app.js create mode 100644 test-projects/03-app-that-uses-make-server/tests/index.html create mode 100644 test-projects/03-app-that-uses-make-server/tests/test-helper.js create mode 100644 test-projects/03-app-that-uses-make-server/vendor/.gitkeep create mode 100644 tests/dummy/app/pods/docs/advanced/server-configuration/template.md diff --git a/.eslintrc.js b/.eslintrc.js index 64e2e9fac..c3d4ca140 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,7 +1,7 @@ module.exports = { root: true, parserOptions: { - ecmaVersion: 2017, + ecmaVersion: 2018, sourceType: "module" }, plugins: ["ember"], diff --git a/.gitignore b/.gitignore index 622699b38..2e1cbcb2d 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,6 @@ jekyll-tmp # IDE /.idea/ /*.iml + +### macOS ### +*.DS_Store diff --git a/addon/ember-data.js b/addon/ember-data.js index 65eed70f1..54f5bf8cd 100644 --- a/addon/ember-data.js +++ b/addon/ember-data.js @@ -56,12 +56,10 @@ export function getDsModels() { /** * Get all mirage models for each of the ember-data models * - * @method getModels - * @private - * @hide + * @method discoverEmberDataModels * @return {Object} models */ -export function getModels() { +export function discoverEmberDataModels() { if (Models) { return Models; } @@ -97,7 +95,7 @@ export function getModels() { * @hide */ export function modelFor(name) { - let models = getModels(); + let models = discoverEmberDataModels(); assert(!!models[name], `Model of type '${name}' does not exist.`); return models[name]; } diff --git a/addon/index.js b/addon/index.js index aa4512ac3..00fe95641 100644 --- a/addon/index.js +++ b/addon/index.js @@ -1,2 +1,3 @@ export { default } from 'miragejs'; export * from 'miragejs'; +export {discoverEmberDataModels} from './ember-data'; diff --git a/addon/server.js b/addon/server.js index 65e6a8fcd..6ba1b9433 100644 --- a/addon/server.js +++ b/addon/server.js @@ -1,5 +1,5 @@ import { Server } from 'miragejs'; -import { getModels } from './ember-data'; +import { discoverEmberDataModels } from './ember-data'; import { hasEmberData } from './utils/ember-data'; export { defaultPassthroughs } from 'miragejs'; @@ -12,7 +12,7 @@ export default class EmberServer extends Server { constructor(options) { // Merge models from autogenerated Ember Data models with user defined models if (hasEmberData && options.discoverEmberDataModels) { - options.models = Object.assign({}, getModels(), options.models); + options.models = Object.assign({}, discoverEmberDataModels(), options.models); } super(options); diff --git a/addon/start-mirage.js b/addon/start-mirage.js index d1ef3e517..385b9f5c2 100644 --- a/addon/start-mirage.js +++ b/addon/start-mirage.js @@ -16,7 +16,7 @@ import { singularize, pluralize } from 'ember-inflector'; @hide */ -export default function startMirage(owner, { env, baseConfig, testConfig } = {}) { +export default function startMirage(owner, { env, baseConfig, testConfig, makeServer } = {}) { if (!env || !baseConfig) { if (!owner) { throw new Error('You must pass `owner` to startMirage()'); @@ -26,6 +26,7 @@ export default function startMirage(owner, { env, baseConfig, testConfig } = {}) // These are set from `/initializers/ember-cli-mirage` baseConfig = baseConfig || resolveRegistration(owner, 'mirage:base-config'); testConfig = testConfig || resolveRegistration(owner, 'mirage:test-config'); + makeServer = makeServer || resolveRegistration(owner, 'mirage:make-server'); } let environment = env.environment; @@ -33,11 +34,21 @@ export default function startMirage(owner, { env, baseConfig, testConfig } = {}) let discoverEmberDataModels = mirageEnvironment.discoverEmberDataModels; if (discoverEmberDataModels === undefined) { discoverEmberDataModels = true; } let modules = readModules(env.modulePrefix); - let options = Object.assign(modules, {environment, baseConfig, testConfig, discoverEmberDataModels}); + let options = Object.assign(modules, {environment, routes: baseConfig, testConfig, discoverEmberDataModels}); options.trackRequests = mirageEnvironment.trackRequests; options.inflector = { singularize, pluralize }; - return new Server(options); + let server; + if (makeServer) { + server = makeServer(options); + if (typeof location !== 'undefined' && location.search.indexOf('mirageLogging') !== -1) { + server.logging = true; + } + } else { + server = new Server(options); + } + + return server; } // Support Ember 1.13 diff --git a/app/initializers/ember-cli-mirage.js b/app/initializers/ember-cli-mirage.js index cd05f7ac3..3ecbb53f1 100644 --- a/app/initializers/ember-cli-mirage.js +++ b/app/initializers/ember-cli-mirage.js @@ -1,5 +1,5 @@ import ENV from '../config/environment'; -import baseConfig, { testConfig } from '../mirage/config'; +import baseConfig, { testConfig, makeServer } from '../mirage/config'; import getRfc232TestContext from 'ember-cli-mirage/get-rfc232-test-context'; import startMirageImpl from 'ember-cli-mirage/start-mirage'; @@ -21,6 +21,9 @@ export default { if (testConfig) { application.register('mirage:test-config', testConfig, { instantiate: false }); } + if (makeServer) { + application.register('mirage:make-server', makeServer, { instantiate: false }); + } ENV['ember-cli-mirage'] = ENV['ember-cli-mirage'] || {}; if (_shouldUseMirage(ENV.environment, ENV['ember-cli-mirage'])) { @@ -30,7 +33,7 @@ export default { }; export function startMirage(env = ENV) { - return startMirageImpl(null, { env, baseConfig, testConfig }); + return startMirageImpl(null, { env, baseConfig, testConfig, makeServer}); } function _shouldUseMirage(env, addonConfig) { diff --git a/scripts/link.sh b/scripts/link.sh index 4f81212e8..4e3d2e12a 100755 --- a/scripts/link.sh +++ b/scripts/link.sh @@ -5,7 +5,7 @@ set -e # Copied from https://github.com/ef4/ember-auto-import/blob/9e48e9ec9639ce05ca2a2688581ea41fdd627c5c/scripts/link-them.sh # All packages get a node_modules directory and a .bin link -for package in "01-basic-app" "02-app-that-excludes-mirage"; do +for package in "01-basic-app" "02-app-that-excludes-mirage" "03-app-that-uses-make-server"; do mkdir -p ./test-projects/$package/node_modules pushd ./test-projects/$package/node_modules > /dev/null rm -rf .bin @@ -14,7 +14,7 @@ for package in "01-basic-app" "02-app-that-excludes-mirage"; do done # These packages get to depend on ember-cli-mirage -for package in "01-basic-app" "02-app-that-excludes-mirage"; do +for package in "01-basic-app" "02-app-that-excludes-mirage" "03-app-that-uses-make-server"; do pushd ./test-projects/$package/node_modules > /dev/null rm -rf ./ember-cli-mirage ln -s ../../.. ./ember-cli-mirage diff --git a/scripts/test.sh b/scripts/test.sh index 8f73ba394..e2afac9ca 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -4,4 +4,5 @@ cd test-projects/01-basic-app && yarn test:fastboot cd test-projects/01-basic-app && yarn test cd test-projects/02-app-that-excludes-mirage && yarn test +cd test-projects/03-app-that-uses-make-server && yarn test EOF diff --git a/test-projects/01-basic-app/.bin b/test-projects/01-basic-app/.bin deleted file mode 120000 index 1dedf1a6f..000000000 --- a/test-projects/01-basic-app/.bin +++ /dev/null @@ -1 +0,0 @@ -../../../node_modules/.bin \ No newline at end of file diff --git a/test-projects/02-app-that-excludes-mirage/.bin b/test-projects/02-app-that-excludes-mirage/.bin deleted file mode 120000 index 1dedf1a6f..000000000 --- a/test-projects/02-app-that-excludes-mirage/.bin +++ /dev/null @@ -1 +0,0 @@ -../../../node_modules/.bin \ No newline at end of file diff --git a/test-projects/03-app-that-uses-make-server/.editorconfig b/test-projects/03-app-that-uses-make-server/.editorconfig new file mode 100644 index 000000000..219985c22 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/.editorconfig @@ -0,0 +1,20 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + + +[*] +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +indent_style = space +indent_size = 2 + +[*.hbs] +insert_final_newline = false + +[*.{diff,md}] +trim_trailing_whitespace = false diff --git a/test-projects/03-app-that-uses-make-server/.ember-cli b/test-projects/03-app-that-uses-make-server/.ember-cli new file mode 100644 index 000000000..ee64cfed2 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/.ember-cli @@ -0,0 +1,9 @@ +{ + /** + Ember CLI sends analytics information by default. The data is completely + anonymous, but there are times when you might want to disable this behavior. + + Setting `disableAnalytics` to true will prevent any data from being sent. + */ + "disableAnalytics": false +} diff --git a/test-projects/03-app-that-uses-make-server/.eslintignore b/test-projects/03-app-that-uses-make-server/.eslintignore new file mode 100644 index 000000000..b01e90d69 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/.eslintignore @@ -0,0 +1,4 @@ +/blueprints/*/files/**/*.js +/test-apps/*/dist +/test-apps/*/tmp +/test-apps/*/node_modules diff --git a/test-projects/03-app-that-uses-make-server/.eslintrc.js b/test-projects/03-app-that-uses-make-server/.eslintrc.js new file mode 100644 index 000000000..bbd1f3cf7 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/.eslintrc.js @@ -0,0 +1,2 @@ +let parent = require('../../.eslintrc.js'); +module.exports = parent; diff --git a/test-projects/03-app-that-uses-make-server/.gitignore b/test-projects/03-app-that-uses-make-server/.gitignore new file mode 100644 index 000000000..8fa39a63c --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/.gitignore @@ -0,0 +1,23 @@ +# See https://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp + +# dependencies +/node_modules +/bower_components + +# misc +/.sass-cache +/connect.lock +/coverage/* +/libpeerconnection.log +npm-debug.log* +yarn-error.log +testem.log + +# ember-try +.node_modules.ember-try/ +bower.json.ember-try +package.json.ember-try diff --git a/test-projects/03-app-that-uses-make-server/.npmignore b/test-projects/03-app-that-uses-make-server/.npmignore new file mode 100644 index 000000000..72e8ffc0d --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/.npmignore @@ -0,0 +1 @@ +* diff --git a/test-projects/03-app-that-uses-make-server/.travis.yml b/test-projects/03-app-that-uses-make-server/.travis.yml new file mode 100644 index 000000000..68a25a16e --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/.travis.yml @@ -0,0 +1,29 @@ +--- +language: node_js +node_js: + - "6" + +sudo: false +dist: trusty + +addons: + chrome: stable + +cache: + yarn: true + +env: + global: + # See https://git.io/vdao3 for details. + - JOBS=1 + +before_install: + - curl -o- -L https://yarnpkg.com/install.sh | bash + - export PATH=$HOME/.yarn/bin:$PATH + +install: + - yarn install --non-interactive + +script: + - yarn lint:js + - yarn test diff --git a/test-projects/03-app-that-uses-make-server/.watchmanconfig b/test-projects/03-app-that-uses-make-server/.watchmanconfig new file mode 100644 index 000000000..e7834e3e4 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/.watchmanconfig @@ -0,0 +1,3 @@ +{ + "ignore_dirs": ["tmp", "dist"] +} diff --git a/test-projects/03-app-that-uses-make-server/README.md b/test-projects/03-app-that-uses-make-server/README.md new file mode 100644 index 000000000..b29133388 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/README.md @@ -0,0 +1,57 @@ +# basic-app + +This README outlines the details of collaborating on this Ember application. +A short introduction of this app could easily go here. + +## Prerequisites + +You will need the following things properly installed on your computer. + +* [Git](https://git-scm.com/) +* [Node.js](https://nodejs.org/) +* [Yarn](https://yarnpkg.com/) +* [Ember CLI](https://ember-cli.com/) +* [Google Chrome](https://google.com/chrome/) + +## Installation + +* `git clone ` this repository +* `cd basic-app` +* `yarn install` + +## Running / Development + +* `ember serve` +* Visit your app at [http://localhost:4200](http://localhost:4200). +* Visit your tests at [http://localhost:4200/tests](http://localhost:4200/tests). + +### Code Generators + +Make use of the many generators for code, try `ember help generate` for more details + +### Running Tests + +* `ember test` +* `ember test --server` + +### Linting + +* `yarn lint:js` +* `yarn lint:js --fix` + +### Building + +* `ember build` (development) +* `ember build --environment production` (production) + +### Deploying + +Specify what it takes to deploy your app. + +## Further Reading / Useful Links + +* [ember.js](https://emberjs.com/) +* [ember-cli](https://ember-cli.com/) +* Development Browser Extensions + * [ember inspector for chrome](https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi) + * [ember inspector for firefox](https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/) diff --git a/test-projects/03-app-that-uses-make-server/app/app.js b/test-projects/03-app-that-uses-make-server/app/app.js new file mode 100644 index 000000000..b3b2bd677 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/app/app.js @@ -0,0 +1,14 @@ +import Application from '@ember/application'; +import Resolver from './resolver'; +import loadInitializers from 'ember-load-initializers'; +import config from './config/environment'; + +const App = Application.extend({ + modulePrefix: config.modulePrefix, + podModulePrefix: config.podModulePrefix, + Resolver +}); + +loadInitializers(App, config.modulePrefix); + +export default App; diff --git a/test-projects/03-app-that-uses-make-server/app/components/.gitkeep b/test-projects/03-app-that-uses-make-server/app/components/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test-projects/03-app-that-uses-make-server/app/controllers/.gitkeep b/test-projects/03-app-that-uses-make-server/app/controllers/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test-projects/03-app-that-uses-make-server/app/controllers/application.js b/test-projects/03-app-that-uses-make-server/app/controllers/application.js new file mode 100644 index 000000000..ebf85aef1 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/app/controllers/application.js @@ -0,0 +1,22 @@ +/* global requirejs */ +import Controller from '@ember/controller'; +import { computed } from '@ember/object'; +import ENV from 'basic-app/config/environment'; + +export default Controller.extend({ + + environment: ENV.environment, + + mirageModules: computed(function() { + return Object.keys(requirejs.entries) + .filter(key => key.match('^ember-cli-mirage')); + }), + + otherIncludedModules: computed(function() { + return Object.keys(requirejs.entries) + .filter(key => { + return key.match('^pretender') || key.match('^lodash') || key.match('initializers/ember-cli-mirage'); + }); + }) + +}); diff --git a/test-projects/03-app-that-uses-make-server/app/helpers/.gitkeep b/test-projects/03-app-that-uses-make-server/app/helpers/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test-projects/03-app-that-uses-make-server/app/index.html b/test-projects/03-app-that-uses-make-server/app/index.html new file mode 100644 index 000000000..326f147b5 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/app/index.html @@ -0,0 +1,25 @@ + + + + + + BasicApp + + + + {{content-for "head"}} + + + + + {{content-for "head-footer"}} + + + {{content-for "body"}} + + + + + {{content-for "body-footer"}} + + diff --git a/test-projects/03-app-that-uses-make-server/app/models/.gitkeep b/test-projects/03-app-that-uses-make-server/app/models/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test-projects/03-app-that-uses-make-server/app/models/book.js b/test-projects/03-app-that-uses-make-server/app/models/book.js new file mode 100644 index 000000000..64a6f13d1 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/app/models/book.js @@ -0,0 +1,8 @@ +import Model from 'ember-data/model'; +import { belongsTo } from 'ember-data/relationships'; + +export default Model.extend({ + + user: belongsTo() + +}); diff --git a/test-projects/03-app-that-uses-make-server/app/models/tag.js b/test-projects/03-app-that-uses-make-server/app/models/tag.js new file mode 100644 index 000000000..8aae571f3 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/app/models/tag.js @@ -0,0 +1,5 @@ +import Model from 'ember-data/model'; + +export default Model.extend({ + +}); diff --git a/test-projects/03-app-that-uses-make-server/app/models/things/watch.js b/test-projects/03-app-that-uses-make-server/app/models/things/watch.js new file mode 100644 index 000000000..8aae571f3 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/app/models/things/watch.js @@ -0,0 +1,5 @@ +import Model from 'ember-data/model'; + +export default Model.extend({ + +}); diff --git a/test-projects/03-app-that-uses-make-server/app/models/user.js b/test-projects/03-app-that-uses-make-server/app/models/user.js new file mode 100644 index 000000000..ac53b753c --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/app/models/user.js @@ -0,0 +1,13 @@ +import attr from 'ember-data/attr'; +import Model from 'ember-data/model'; +import { hasMany } from 'ember-data/relationships'; + +export default Model.extend({ + + name: attr('string'), + age: attr('number'), + email: attr('string'), + + books: hasMany() + +}); diff --git a/test-projects/03-app-that-uses-make-server/app/pods/application/template.hbs b/test-projects/03-app-that-uses-make-server/app/pods/application/template.hbs new file mode 100644 index 000000000..b6a8aa972 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/app/pods/application/template.hbs @@ -0,0 +1,3 @@ +

    Mirage - test app

    + +{{outlet}} diff --git a/test-projects/03-app-that-uses-make-server/app/pods/crud-demo-error/template.hbs b/test-projects/03-app-that-uses-make-server/app/pods/crud-demo-error/template.hbs new file mode 100644 index 000000000..0454883f4 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/app/pods/crud-demo-error/template.hbs @@ -0,0 +1,5 @@ +

    WHOOPS

    + +

    + {{model.errors.firstObject}} +

    diff --git a/test-projects/03-app-that-uses-make-server/app/pods/crud-demo/controller.js b/test-projects/03-app-that-uses-make-server/app/pods/crud-demo/controller.js new file mode 100644 index 000000000..e87f8af82 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/app/pods/crud-demo/controller.js @@ -0,0 +1,29 @@ +import Controller from '@ember/controller'; +import { inject as service } from '@ember/service'; + +export default Controller.extend({ + + store: service(), + + actions: { + createUser() { + let name = this.get('newName'); + + this.get('store') + .createRecord('user', { name }) + .save() + .then(() => { + this.set('newName', ''); + }); + }, + + updateUser(user) { + user.save(); + }, + + deleteUser(user) { + user.destroyRecord(); + } + } + +}); diff --git a/test-projects/03-app-that-uses-make-server/app/pods/crud-demo/route.js b/test-projects/03-app-that-uses-make-server/app/pods/crud-demo/route.js new file mode 100644 index 000000000..f67295e61 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/app/pods/crud-demo/route.js @@ -0,0 +1,12 @@ +import Route from '@ember/routing/route'; + +export default Route.extend({ + + model() { + return this.store.findAll('user'); + }, + + actions: { + } + +}); diff --git a/test-projects/03-app-that-uses-make-server/app/pods/crud-demo/template.hbs b/test-projects/03-app-that-uses-make-server/app/pods/crud-demo/template.hbs new file mode 100644 index 000000000..7e052ef79 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/app/pods/crud-demo/template.hbs @@ -0,0 +1,42 @@ +{{#if error}} + +

    + There was an error: {{error}} +

    + +{{else}} + + {{#each model as |user|}} +
    +
    + {{input value=user.name}} + + + + {{#if user.isSaving}} + Saving... + {{else if user.id}} + Saved + {{/if}} + +
    +
    + {{/each}} + +{{/if}} + +
    + +
    +
    +
    + {{input value=newName placeholder='Name'}} +
    + +
    + +
    +
    +
    diff --git a/test-projects/03-app-that-uses-make-server/app/pods/module-count/controller.js b/test-projects/03-app-that-uses-make-server/app/pods/module-count/controller.js new file mode 100644 index 000000000..ebf85aef1 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/app/pods/module-count/controller.js @@ -0,0 +1,22 @@ +/* global requirejs */ +import Controller from '@ember/controller'; +import { computed } from '@ember/object'; +import ENV from 'basic-app/config/environment'; + +export default Controller.extend({ + + environment: ENV.environment, + + mirageModules: computed(function() { + return Object.keys(requirejs.entries) + .filter(key => key.match('^ember-cli-mirage')); + }), + + otherIncludedModules: computed(function() { + return Object.keys(requirejs.entries) + .filter(key => { + return key.match('^pretender') || key.match('^lodash') || key.match('initializers/ember-cli-mirage'); + }); + }) + +}); diff --git a/test-projects/03-app-that-uses-make-server/app/pods/module-count/template.hbs b/test-projects/03-app-that-uses-make-server/app/pods/module-count/template.hbs new file mode 100644 index 000000000..719d77ed1 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/app/pods/module-count/template.hbs @@ -0,0 +1,20 @@ +

    + Environment: + + {{environment}} + +

    + +

    + Mirage modules in project: + + {{mirageModules.length}} + +

    + +

    + Other modules in project: + + {{otherIncludedModules.length}} + +

    diff --git a/test-projects/03-app-that-uses-make-server/app/resolver.js b/test-projects/03-app-that-uses-make-server/app/resolver.js new file mode 100644 index 000000000..2fb563d6c --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/app/resolver.js @@ -0,0 +1,3 @@ +import Resolver from 'ember-resolver'; + +export default Resolver; diff --git a/test-projects/03-app-that-uses-make-server/app/router.js b/test-projects/03-app-that-uses-make-server/app/router.js new file mode 100644 index 000000000..d21c8aad9 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/app/router.js @@ -0,0 +1,14 @@ +import EmberRouter from '@ember/routing/router'; +import config from './config/environment'; + +const Router = EmberRouter.extend({ + location: config.locationType, + rootURL: config.rootURL +}); + +Router.map(function() { + this.route('module-count'); + this.route('crud-demo'); +}); + +export default Router; diff --git a/test-projects/03-app-that-uses-make-server/app/routes/.gitkeep b/test-projects/03-app-that-uses-make-server/app/routes/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test-projects/03-app-that-uses-make-server/app/styles/app.css b/test-projects/03-app-that-uses-make-server/app/styles/app.css new file mode 100644 index 000000000..e69de29bb diff --git a/test-projects/03-app-that-uses-make-server/app/templates/application.hbs b/test-projects/03-app-that-uses-make-server/app/templates/application.hbs new file mode 100644 index 000000000..14ccd024c --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/app/templates/application.hbs @@ -0,0 +1,22 @@ +

    Welcome to Ember

    + +

    + Environment: + + {{environment}} + +

    + +

    + Mirage modules in project: + + {{mirageModules.length}} + +

    + +

    + Other modules in project: + + {{otherIncludedModules.length}} + +

    diff --git a/test-projects/03-app-that-uses-make-server/app/templates/components/.gitkeep b/test-projects/03-app-that-uses-make-server/app/templates/components/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test-projects/03-app-that-uses-make-server/config/environment.js b/test-projects/03-app-that-uses-make-server/config/environment.js new file mode 100644 index 000000000..de90a5d26 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/config/environment.js @@ -0,0 +1,58 @@ +'use strict'; + +module.exports = function(environment) { + let ENV = { + modulePrefix: 'basic-app', + podModulePrefix: 'basic-app/pods', + environment, + rootURL: '/', + locationType: 'auto', + EmberENV: { + FEATURES: { + // Here you can enable experimental features on an ember canary build + // e.g. 'with-controller': true + }, + EXTEND_PROTOTYPES: { + // Prevent Ember Data from overriding Date.parse. + Date: false + } + }, + + APP: { + // Here you can pass flags/options to your application instance + // when it is created + } + }; + + if (process.env.MIRAGE_ENABLED) { + ENV['ember-cli-mirage'] = { + enabled: true + }; + } + + if (environment === 'development') { + // ENV.APP.LOG_RESOLVER = true; + // ENV.APP.LOG_ACTIVE_GENERATION = true; + // ENV.APP.LOG_TRANSITIONS = true; + // ENV.APP.LOG_TRANSITIONS_INTERNAL = true; + // ENV.APP.LOG_VIEW_LOOKUPS = true; + } + + if (environment === 'test') { + // Testem prefers this... + ENV.locationType = 'none'; + + // keep test console output quieter + ENV.APP.LOG_ACTIVE_GENERATION = false; + ENV.APP.LOG_VIEW_LOOKUPS = false; + + ENV.APP.rootElement = '#ember-testing'; + ENV.APP.autoboot = false; + } + + if (environment === 'production') { + // here you can enable a production-specific feature + } + + return ENV; +}; diff --git a/test-projects/03-app-that-uses-make-server/config/optional-features.json b/test-projects/03-app-that-uses-make-server/config/optional-features.json new file mode 100644 index 000000000..21f1dc719 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/config/optional-features.json @@ -0,0 +1,3 @@ +{ + "jquery-integration": true +} diff --git a/test-projects/03-app-that-uses-make-server/config/targets.js b/test-projects/03-app-that-uses-make-server/config/targets.js new file mode 100644 index 000000000..8ffae3636 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/config/targets.js @@ -0,0 +1,18 @@ +'use strict'; + +const browsers = [ + 'last 1 Chrome versions', + 'last 1 Firefox versions', + 'last 1 Safari versions' +]; + +const isCI = !!process.env.CI; +const isProduction = process.env.EMBER_ENV === 'production'; + +if (isCI || isProduction) { + browsers.push('ie 11'); +} + +module.exports = { + browsers +}; diff --git a/test-projects/03-app-that-uses-make-server/ember-cli-build.js b/test-projects/03-app-that-uses-make-server/ember-cli-build.js new file mode 100644 index 000000000..3095129d6 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/ember-cli-build.js @@ -0,0 +1,26 @@ +'use strict'; + +const EmberApp = require('ember-cli/lib/broccoli/ember-app'); + +module.exports = function(defaults) { + let app = new EmberApp(defaults, { + autoImport: { + exclude: ['qunit'] + } + }); + + // Use `app.import` to add additional libraries to the generated + // output files. + // + // If you need to use different assets in different + // environments, specify an object as the first parameter. That + // object's keys should be the environment name and the values + // should be the asset to use in that environment. + // + // If the library that you are including contains AMD or ES6 + // modules that you would like to import into your application + // please specify an object with the list of modules as keys + // along with the exports of each module as its value. + + return app.toTree(); +}; diff --git a/test-projects/03-app-that-uses-make-server/fastboot-tests/included-files-test.js b/test-projects/03-app-that-uses-make-server/fastboot-tests/included-files-test.js new file mode 100644 index 000000000..848e1ba83 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/fastboot-tests/included-files-test.js @@ -0,0 +1,85 @@ +const FastBoot = require('fastboot'); +const { execFileSync } = require('child_process'); +const { module: qModule, test } = require('qunit'); +const jsdom = require('jsdom'); +const { JSDOM } = jsdom; + +const findTextFromHtml = (html, selector) => { + let document = new JSDOM(html).window.document; + return document.querySelector(selector) + .textContent + .trim(); +}; + +qModule('basic-app | fastboot | included files', function(hooks) { + + test('it includes all modules in development by default', async function(assert) { + execFileSync('node', [ + require.resolve('ember-cli/bin/ember'), + 'build' + ]); + let fastboot = new FastBoot({ + distPath: 'dist', + resilient: false + }); + + let page = await fastboot.visit('/module-count'); + let html = await page.html(); + + assert.equal(findTextFromHtml(html, '[data-test-id="environment"]'), 'development'); + assert.ok(+findTextFromHtml(html, '[data-test-id="mirage-module-count"]') > 1); + assert.ok(+findTextFromHtml(html, '[data-test-id="other-module-count"]') > 1); + }); + + test('it includes all modules in test by default', async function(assert) { + execFileSync('node', [ + require.resolve('ember-cli/bin/ember'), + 'build', + '--environment=test' + ]); + let fastboot = new FastBoot({ + distPath: 'dist', + resilient: false + }); + + let page = await fastboot.visit('/module-count'); + let html = await page.html(); + + assert.equal(findTextFromHtml(html, '[data-test-id="environment"]'), 'test'); + assert.ok(+findTextFromHtml(html, '[data-test-id="mirage-module-count"]') > 1); + assert.ok(+findTextFromHtml(html, '[data-test-id="other-module-count"]') > 1); + }); + + test('it only includes an initializer in production by default', async function(assert) { + execFileSync('node', [require.resolve('ember-cli/bin/ember'), 'build', '-prod']); + let fastboot = new FastBoot({ + distPath: 'dist', + resilient: false + }); + let page = await fastboot.visit('/module-count'); + let html = await page.html(); + + assert.equal(findTextFromHtml(html, '[data-test-id="environment"]'), 'production'); + assert.equal(findTextFromHtml(html, '[data-test-id="mirage-module-count"]'), '0'); + assert.equal(findTextFromHtml(html, '[data-test-id="other-module-count"]'), '1'); + }); + + test('all files can be included in production by explicitly setting enabled to true', async function(assert) { + process.env.MIRAGE_ENABLED = 'true'; + execFileSync('node', [ + require.resolve('ember-cli/bin/ember'), + 'build', + '-prod' + ]); + let fastboot = new FastBoot({ + distPath: 'dist', + resilient: false + }); + let page = await fastboot.visit('/module-count'); + let html = await page.html(); + + assert.equal(findTextFromHtml(html, '[data-test-id="environment"]'), 'production'); + assert.ok(+findTextFromHtml(html, '[data-test-id="mirage-module-count"]') > 1); + assert.ok(+findTextFromHtml(html, '[data-test-id="other-module-count"]') > 1); + }); +}); diff --git a/test-projects/03-app-that-uses-make-server/mirage/config.js b/test-projects/03-app-that-uses-make-server/mirage/config.js new file mode 100644 index 000000000..fce92cd97 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/mirage/config.js @@ -0,0 +1,14 @@ +import { createServer, discoverEmberDataModels } from 'ember-cli-mirage'; + +export function makeServer(config) { + let finalConfig = { + ...config, + models: { ...discoverEmberDataModels(), ...config.models }, + }; + + return createServer(finalConfig) +} + +export default function() { + this.resource('user'); +} diff --git a/test-projects/03-app-that-uses-make-server/mirage/factories/nested/thing.js b/test-projects/03-app-that-uses-make-server/mirage/factories/nested/thing.js new file mode 100644 index 000000000..a49b783d3 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/mirage/factories/nested/thing.js @@ -0,0 +1,5 @@ +import { Factory } from 'ember-cli-mirage'; + +export default Factory.extend({ + name: 'nested factory works!' +}); diff --git a/test-projects/03-app-that-uses-make-server/mirage/factories/user.js b/test-projects/03-app-that-uses-make-server/mirage/factories/user.js new file mode 100644 index 000000000..6a59ee9d2 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/mirage/factories/user.js @@ -0,0 +1,10 @@ +import { Factory } from 'ember-cli-mirage'; +import faker from 'faker'; + +export default Factory.extend({ + + age() { + return faker.random.number({ min: 32, max: 32 }); + } + +}); diff --git a/test-projects/03-app-that-uses-make-server/mirage/fixtures/countries.js b/test-projects/03-app-that-uses-make-server/mirage/fixtures/countries.js new file mode 100644 index 000000000..f9b995d1a --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/mirage/fixtures/countries.js @@ -0,0 +1,3 @@ +export default [ + { name: 'United State' } +]; diff --git a/test-projects/03-app-that-uses-make-server/mirage/fixtures/nested/things.js b/test-projects/03-app-that-uses-make-server/mirage/fixtures/nested/things.js new file mode 100644 index 000000000..5c0aee901 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/mirage/fixtures/nested/things.js @@ -0,0 +1,3 @@ +export default [ + { fixtureField: 'nested fixture works!' } +]; diff --git a/test-projects/03-app-that-uses-make-server/mirage/fixtures/users.js b/test-projects/03-app-that-uses-make-server/mirage/fixtures/users.js new file mode 100644 index 000000000..0148a57fa --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/mirage/fixtures/users.js @@ -0,0 +1,5 @@ +export default [ + + { id: 1, name: 'Sam' } + +]; diff --git a/test-projects/03-app-that-uses-make-server/mirage/identity-managers/book.js b/test-projects/03-app-that-uses-make-server/mirage/identity-managers/book.js new file mode 100644 index 000000000..76f1564ad --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/mirage/identity-managers/book.js @@ -0,0 +1,57 @@ +export default class { + constructor() { + this.reset(); + } + + /** + * Returns an unique identifier. + * + * @method fetch + * @return {String} Unique identifier + * @public + */ + fetch() { + let alphabet = 'abcdefghijklmnopqrstuvwxyz'; + let id; + + if (this._nextId >= alphabet.length) { + throw new Error(`IdentityManager used for testing only supports ${alphabet.length} ids.`); + } + id = alphabet[this._nextId % alphabet.length]; + this._ids[id] = true; + this._nextId = this._nextid + 1; + return id; + } + + /** + * Register an identifier. + * Must throw if identifier is already used. + * + * @method set + * @param {String|Number} id + * @public + */ + set(id) { + if (typeof this._ids[id] !== 'undefined') { + throw new Error(`Id {id} is already used.`); + } + + this._ids[id] = true; + + let int = parseInt(id, 16); + if (!isNaN(int) && int > this._nextid) { + this._nextId = int; + } + } + + /** + * Reset identity manager. + * + * @method reset + * @public + */ + reset() { + this._nextId = 0; + this._ids = {}; + } +} diff --git a/test-projects/03-app-that-uses-make-server/mirage/identity-managers/nested/thing.js b/test-projects/03-app-that-uses-make-server/mirage/identity-managers/nested/thing.js new file mode 100644 index 000000000..52271b76d --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/mirage/identity-managers/nested/thing.js @@ -0,0 +1,56 @@ +export default class { + constructor() { + this.reset(); + } + + /** + * Returns an unique identifier. + * + * @method fetch + * @return {String} Unique identifier + * @public + */ + fetch() { + let id; + + if (this._nextId >= 1) { + throw new Error(`IdentityManager used for testing only supports single id.`); + } + id = 'nested identity manager works!'; + this._ids[id] = true; + this._nextId = this._nextid + 1; + return id; + } + + /** + * Register an identifier. + * Must throw if identifier is already used. + * + * @method set + * @param {String|Number} id + * @public + */ + set(id) { + if (typeof this._ids[id] !== 'undefined') { + throw new Error(`Id {id} is already used.`); + } + + this._ids[id] = true; + + let int = parseInt(id, 16); + if (!isNaN(int) && int > this._nextid) { + this._nextId = int; + } + } + + /** + * Reset identity manager. + * + * @method reset + * @public + */ + reset() { + this._nextId = 0; + this._ids = {}; + } +} diff --git a/test-projects/03-app-that-uses-make-server/mirage/models/nested/thing.js b/test-projects/03-app-that-uses-make-server/mirage/models/nested/thing.js new file mode 100644 index 000000000..1486a7240 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/mirage/models/nested/thing.js @@ -0,0 +1,4 @@ +import { Model } from 'ember-cli-mirage'; + +export default Model.extend({ +}); diff --git a/test-projects/03-app-that-uses-make-server/mirage/scenarios/default.js b/test-projects/03-app-that-uses-make-server/mirage/scenarios/default.js new file mode 100644 index 000000000..0cd90b408 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/mirage/scenarios/default.js @@ -0,0 +1,7 @@ +export default function(server) { + + server.create('user', { name: 'Yehuda' }); + server.create('user', { name: 'Tom' }); + server.create('user', { name: 'Leah' }); + +} diff --git a/test-projects/03-app-that-uses-make-server/mirage/serializers/application.js b/test-projects/03-app-that-uses-make-server/mirage/serializers/application.js new file mode 100644 index 000000000..9ebd0e296 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/mirage/serializers/application.js @@ -0,0 +1,3 @@ +import { JSONAPISerializer } from 'ember-cli-mirage'; + +export default JSONAPISerializer; diff --git a/test-projects/03-app-that-uses-make-server/mirage/serializers/nested/thing.js b/test-projects/03-app-that-uses-make-server/mirage/serializers/nested/thing.js new file mode 100644 index 000000000..66d972c4d --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/mirage/serializers/nested/thing.js @@ -0,0 +1,9 @@ +import ApplicationSerizlizer from '../application'; + +export default ApplicationSerizlizer.extend({ + keyForAttribute(attr) { + const key = ApplicationSerizlizer.prototype.keyForAttribute.call(this, attr); + + return `nested_thing_${key}`; + } +}); diff --git a/test-projects/03-app-that-uses-make-server/package.json b/test-projects/03-app-that-uses-make-server/package.json new file mode 100644 index 000000000..55ca96035 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/package.json @@ -0,0 +1,53 @@ +{ + "name": "basic-app", + "version": "0.0.0", + "private": true, + "description": "Small description for basic-app goes here", + "license": "MIT", + "author": "", + "directories": { + "doc": "doc", + "test": "tests" + }, + "repository": "", + "scripts": { + "build": "ember build", + "lint:js": "eslint ./*.js app config mirage tests", + "start": "ember serve", + "test": "ember test --test-port=0", + "test:fastboot": "qunit fastboot-tests/**/*.js" + }, + "devDependencies": { + "@ember/jquery": "*", + "broccoli-asset-rev": "*", + "ember-ajax": "*", + "ember-auto-import": "*", + "ember-cli": "*", + "ember-cli-babel": "*", + "ember-cli-dependency-checker": "*", + "ember-cli-eslint": "*", + "ember-cli-fastboot": "*", + "ember-cli-htmlbars": "*", + "ember-cli-inject-live-reload": "*", + "ember-cli-mirage": "*", + "ember-cli-qunit": "*", + "ember-cli-sri": "*", + "ember-cli-uglify": "*", + "ember-data": "*", + "ember-export-application-global": "*", + "ember-load-initializers": "*", + "ember-maybe-import-regenerator-for-testing": "*", + "ember-resolver": "*", + "ember-source": "*", + "eslint-plugin-ember": "*", + "faker": "*", + "fastboot": "*", + "jsdom": "*", + "loader.js": "*", + "qunit": "*", + "qunit-dom": "*" + }, + "engines": { + "node": ">= 8.*" + } +} diff --git a/test-projects/03-app-that-uses-make-server/public/robots.txt b/test-projects/03-app-that-uses-make-server/public/robots.txt new file mode 100644 index 000000000..f5916452e --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/public/robots.txt @@ -0,0 +1,3 @@ +# http://www.robotstxt.org +User-agent: * +Disallow: diff --git a/test-projects/03-app-that-uses-make-server/testem.js b/test-projects/03-app-that-uses-make-server/testem.js new file mode 100644 index 000000000..d1755a4ea --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/testem.js @@ -0,0 +1,24 @@ +module.exports = { + test_page: 'tests/index.html?hidepassed', + disable_watching: true, + launch_in_ci: [ + 'Chrome' + ], + launch_in_dev: [ + 'Chrome' + ], + browser_args: { + Chrome: { + mode: 'ci', + args: [ + // --no-sandbox is needed when running Chrome inside a container + process.env.TRAVIS ? '--no-sandbox' : null, + + '--disable-gpu', + '--headless', + '--remote-debugging-port=0', + '--window-size=1440,900' + ].filter(Boolean) + } + } +}; diff --git a/test-projects/03-app-that-uses-make-server/tests/acceptance/crud-demo-test.js b/test-projects/03-app-that-uses-make-server/tests/acceptance/crud-demo-test.js new file mode 100644 index 000000000..6d588e094 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/tests/acceptance/crud-demo-test.js @@ -0,0 +1,67 @@ +import { test } from 'qunit'; +import moduleForAcceptance from 'basic-app/tests/helpers/module-for-acceptance'; + +moduleForAcceptance('Acceptance | Crud demo'); + +test('I can view the users', function(assert) { + server.createList('user', 3); + + visit('/crud-demo'); + + andThen(function() { + assert.equal(find('[data-test-id="user"]').length, 3); + }); +}); + +test('I can create a new user', function(assert) { + server.create('user', 1); + + visit('/crud-demo'); + fillIn('input', 'Ganon'); + click('button:contains(Create)'); + + andThen(function() { + assert.equal(find('[data-test-id="user"]').length, 2); + assert.ok(server.db.users.length, 2); + }); +}); + +test('I can update a user', function(assert) { + let user = server.create('user', { name: 'Yehuda' }); + + visit('/crud-demo'); + fillIn('[data-test-id="user"] input', 'Katz'); + click('button:contains(Save)'); + + andThen(function() { + user.reload(); + + assert.equal(find('[data-test-id="user"] input').val(), 'Katz'); + assert.ok(user.name, 'Katz'); + }); +}); + +test('I can delete a user', function(assert) { + server.create('user', { name: 'Yehuda' }); + + visit('/crud-demo'); + click('button:contains(Delete)'); + + andThen(function() { + assert.equal(find('[data-test-id="user"]').length, 0); + assert.equal(server.db.users.length, 0); + }); +}); + +test('If the server errors on GET /users, the error template shows', function(assert) { + server.get('/users', { + errors: [ 'improper auth' ] + }, 404); + + visit('/crud-demo'); + + andThen(function() { + assert.ok(find(':contains(improper auth)').length); + assert.equal(currentRouteName(), 'crud-demo_error'); + }); +}); diff --git a/test-projects/03-app-that-uses-make-server/tests/acceptance/ember-data-test.js b/test-projects/03-app-that-uses-make-server/tests/acceptance/ember-data-test.js new file mode 100644 index 000000000..c70fb0482 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/tests/acceptance/ember-data-test.js @@ -0,0 +1,72 @@ +import { module, test } from 'qunit'; +import Server from 'ember-cli-mirage/server'; +import { Model } from 'ember-cli-mirage'; +import { modelFor } from 'ember-cli-mirage/ember-data'; + +const CustomTag = Model.extend(); +CustomTag.__isCustom__ = true; + +module('Acceptance | Ember Data', function(hooks) { + hooks.beforeEach(function() { + this.server = new Server({ + environment: 'development', + discoverEmberDataModels: true, + scenarios: { + default() {} + }, + models: { + // Friend exists in dummy/app/models. We want to make sure pre-defined + // models take precedence + tag: CustomTag, + foo: Model.extend() + }, + factories: {} + }); + }); + + hooks.afterEach(function() { + this.server.shutdown(); + }); + + test(`Ember data models were generated and loaded`, function(assert) { + let { schema } = this.server; + let registry = schema._registry; + + assert.ok(registry.foo, 'Mirage model Foo has been registered'); + assert.ok(registry.book, 'EmberData model Book has been registered'); + assert.ok(registry.user, 'EmberData model User has been registered'); + assert.equal(registry.user.foreignKeys.length, 1, 'EmberData model User has the correct relationships'); + assert.equal(registry.book.foreignKeys.length, 1, 'EmberData model User has the correct relationships'); + assert.equal(registry.user.foreignKeys[0], 'bookIds', 'EmberData model User has the correct relationships'); + assert.equal(registry.book.foreignKeys[0], 'userId', 'EmberData model Book has the correct relationships'); + }); + + test(`It works with nested models`, function(assert) { + let { schema } = this.server; + let registry = schema._registry; + + assert.ok(registry['things/watch'], 'Model things/watch has been registered'); + }); + + test(`Defined Mirage models take precedence over autogenerated ones`, function(assert) { + let { schema } = this.server; + let registry = schema._registry; + + assert.ok(registry.tag, 'Model Tag has been registered'); + assert.ok(registry.tag.class.__isCustom__, 'Model Tag is not the autogenerated one'); + }); + + test(`Auto generated models can be extended via modelFor`, function(assert) { + let { schema } = this.server; + let registry = schema._registry; + + assert.ok(registry.book, 'Ember data model Book has been registered'); + assert.ok(modelFor('book'), 'Ember data model Book is found'); + assert.equal(typeof modelFor('book').extend, 'function', 'Ember data model Book can be extended'); + }); + + test(`modelFor is only for auto generated models`, function(assert) { + assert.notOk(modelFor('tag').__isCustom__, 'Tag model is not the pre defined one'); + assert.throws(() => modelFor('foo'), /Model of type 'foo' does not exist/, 'Pre defined mirage models cannot be found via modelFor'); + }); +}); diff --git a/test-projects/03-app-that-uses-make-server/tests/acceptance/faker-test.js b/test-projects/03-app-that-uses-make-server/tests/acceptance/faker-test.js new file mode 100644 index 000000000..485301a13 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/tests/acceptance/faker-test.js @@ -0,0 +1,15 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; +import { setupMirage } from 'ember-cli-mirage/test-support'; + +module('Acceptance | Faker', function(hooks) { + setupTest(hooks); + setupMirage(hooks); + + test('it works', function(assert) { + let user = this.server.create('user'); + + assert.equal(user.age, 32); + }); + +}); diff --git a/test-projects/03-app-that-uses-make-server/tests/acceptance/fixtures-test.js b/test-projects/03-app-that-uses-make-server/tests/acceptance/fixtures-test.js new file mode 100644 index 000000000..5cb5a111b --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/tests/acceptance/fixtures-test.js @@ -0,0 +1,20 @@ +import moduleForAcceptance from '../helpers/module-for-acceptance'; +import { test } from 'qunit'; + +moduleForAcceptance('Acceptance | Fixtures'); + +test('I can use fixtures', async function(assert) { + server.loadFixtures(); + + await visit('/crud-demo'); + + assert.equal(find('[data-test-id="user"]').length, 1); +}); + +test('I can use fixtures with the filename api', async function(assert) { + server.loadFixtures('countries'); + + await visit('/crud-demo'); + + assert.equal(find('[data-test-id="user"]').length, 0); +}); diff --git a/test-projects/03-app-that-uses-make-server/tests/acceptance/identity-manager-test.js b/test-projects/03-app-that-uses-make-server/tests/acceptance/identity-manager-test.js new file mode 100644 index 000000000..f05004f59 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/tests/acceptance/identity-manager-test.js @@ -0,0 +1,10 @@ +import { test } from 'qunit'; +import moduleForAcceptance from '../../tests/helpers/module-for-acceptance'; + +moduleForAcceptance('Acceptance | Identity manager'); + +test('custom identity managers work', function(assert) { + let book = server.create('book'); + + assert.equal(book.id, 'a'); +}); diff --git a/test-projects/03-app-that-uses-make-server/tests/acceptance/legacy-start-mirage-test.js b/test-projects/03-app-that-uses-make-server/tests/acceptance/legacy-start-mirage-test.js new file mode 100644 index 000000000..5f6152c16 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/tests/acceptance/legacy-start-mirage-test.js @@ -0,0 +1,59 @@ +import {module, test} from 'qunit'; +import startApp from '../helpers/start-app'; +import destroyApp from '../helpers/destroy-app'; +import { startMirage } from 'basic-app/initializers/ember-cli-mirage'; +import ENV from 'basic-app/config/environment'; + +module('Acceptance | Starting mirage (legacy)', function(hooks) { + let app, oldEnv, addonConfig; + + hooks.beforeEach(function() { + oldEnv = ENV['ember-cli-mirage']; + ENV['ember-cli-mirage'] = addonConfig = {}; + }); + + hooks.afterEach(function() { + destroyApp(app); + ENV['ember-cli-mirage'] = oldEnv; + }); + + test('The server starts automatically when configured with enabled undefined', async function(assert) { + app = startApp(); + + assert.ok(window.server, 'There is a server after starting'); + + window.server.create('user'); + await window.visit('/crud-demo'); + + assert.equal(window.currentRouteName(), 'crud-demo'); + assert.dom('[data-test-id="user"]').exists(); + }); + + test('The server starts automatically when configured with { enabled: true }', async function(assert) { + addonConfig.enabled = true; + app = startApp(); + + assert.ok(window.server, 'There is a server after starting'); + + window.server.create('user'); + await window.visit('/crud-demo'); + + assert.equal(window.currentRouteName(), 'crud-demo'); + assert.dom('[data-test-id="user"]').exists(); + }); + + test('The server can be started manually when configured with { enabled: false }', async function(assert) { + addonConfig.enabled = false; + app = startApp(); + + assert.equal(window.server, undefined, 'There is no server at first'); + startMirage(); + assert.ok(window.server, 'There is a server after starting'); + + window.server.create('user'); + await window.visit('/crud-demo'); + + assert.equal(window.currentRouteName(), 'crud-demo'); + assert.dom('[data-test-id="user"]').exists(); + }); +}); diff --git a/test-projects/03-app-that-uses-make-server/tests/acceptance/request-tracking-test.js b/test-projects/03-app-that-uses-make-server/tests/acceptance/request-tracking-test.js new file mode 100644 index 000000000..d245eaf7d --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/tests/acceptance/request-tracking-test.js @@ -0,0 +1,51 @@ +import { run } from '@ember/runloop'; +import {module, test} from 'qunit'; +import startApp from '../helpers/start-app'; +import ENV from 'basic-app/config/environment'; +import promiseAjax from '../helpers/promise-ajax'; + +let App; + +module('Acceptance | Enabling request tracking', { + afterEach() { + server.shutdown(); + run(App, 'destroy'); + ENV['ember-cli-mirage'].enabled = undefined; + } +}); + +test('Request tracking defaults to false', async function(assert) { + App = startApp(); + + await promiseAjax({ + method: 'GET', + url: '/users' + }); + + assert.equal(server.pretender.handledRequests.length, 0, 'request tracking should be false by default'); +}); + +test('Request tracking treats undefined config as false', async function(assert) { + ENV['ember-cli-mirage'] = { trackRequests: undefined }; + App = startApp(); + + await promiseAjax({ + method: 'GET', + url: '/users' + }); + + assert.equal(server.pretender.handledRequests.length, 0, 'request tracking should be false when undefined in config'); +}); + +test('Request tracking can be set to true in config', async function(assert) { + ENV['ember-cli-mirage'] = { trackRequests: true }; + App = startApp(); + + await promiseAjax({ + method: 'GET', + url: '/users' + }); + + assert.equal(server.pretender.handledRequests.length, 1, 'request tracking can be turned on in config and track requests'); + assert.equal(server.pretender.handledRequests[0].method, 'GET', 'tracked request method should match the requests method'); +}); diff --git a/test-projects/03-app-that-uses-make-server/tests/acceptance/start-mirage-test.js b/test-projects/03-app-that-uses-make-server/tests/acceptance/start-mirage-test.js new file mode 100644 index 000000000..3e77740fd --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/tests/acceptance/start-mirage-test.js @@ -0,0 +1,124 @@ +import Ember from 'ember'; +import {module as qunitModule, test} from 'qunit'; +import {setupTest} from 'ember-qunit'; +import {visit, currentRouteName} from '@ember/test-helpers'; +import startMirage from 'ember-cli-mirage/start-mirage'; +import { setupMirage } from 'ember-cli-mirage/test-support'; +import ENV from 'basic-app/config/environment'; +import NestedThingModel from 'basic-app/mirage/models/nested/thing'; + +let module; +if (Ember.VERSION === '1.13.13') { + module = () => null; +} else { + module = qunitModule; +} + +module('Acceptance | Starting mirage', function(hooks) { + let oldEnv, addonConfig, dynamicAfterEach; + + hooks.beforeEach(function() { + oldEnv = ENV['ember-cli-mirage']; + ENV['ember-cli-mirage'] = addonConfig = {}; + // When running in non-legacy mode we shoud ignore this, so we set it so we + // can make sure that tests that it doesn't cause the server to start when + // it shouldn't in the cases that test that + addonConfig.enabled = true; + + dynamicAfterEach = () => undefined; + }); + + hooks.afterEach(function() { + dynamicAfterEach(); + }); + + hooks.afterEach(function() { + ENV['ember-cli-mirage'] = oldEnv; + }); + + module('without autostart', function(hooks) { + setupTest(hooks); + + test('it does not autostart but can be started manually', async function(assert) { + assert.equal(window.server, undefined, 'There is no global server at first'); + let server = startMirage(this.owner); + assert.ok(server, 'There is a server after starting'); + assert.ok(window.server, 'There is a global server after starting'); + dynamicAfterEach = () => server.shutdown(); + + server.create('user'); + await visit('/crud-demo'); + + assert.equal(currentRouteName(), 'crud-demo'); + assert.dom('[data-test-id="user"]').exists(); + }); + + module('nested mirage modules', function() { + test('it works', async function(assert) { + const server = startMirage(this.owner); + const model = server.create('nested/thing'); + + assert.ok(model instanceof NestedThingModel, 'models'); + assert.equal(model.id, 'nested identity manager works!', 'identity managers'); + assert.equal(model.name, 'nested factory works!', 'factories'); + + const { attributes } = server.serializerOrRegistry.serialize(model).data; + assert.ok('nested_thing_name' in attributes, 'serializer'); + }); + + // factories and fixtures have to be tested separately + test('fixtures support', async function(assert) { + const server = startMirage(this.owner); + + server.loadFixtures('nested/things'); + const model = server.schema.first('nested/thing'); + + assert.ok(model instanceof NestedThingModel, 'models'); + assert.equal(model.id, 'nested identity manager works!', 'identity managers'); + assert.equal(model.fixtureField, 'nested fixture works!', 'fixtures'); + }); + }) + + module('setupMirage()', function(hooks) { + setupMirage(hooks); + + test('it works', async function(assert) { + assert.ok(this.server, 'There is a server'); + assert.ok(window.server, 'There is a global server'); + dynamicAfterEach = () => { + assert.notOk(this.server, 'The server was shut down'); + assert.notOk(window.server, 'The global server is gone'); + }; + + server.create('user'); + await visit('/crud-demo'); + + assert.equal(currentRouteName(), 'crud-demo'); + assert.dom('[data-test-id="user"]').exists(); + }); + }); + }); + + module('with autostart', function(hooks) { + hooks.beforeEach(function() { + addonConfig.autostart = true; + }); + + setupTest(hooks); + + test('it autostarts', async function(assert) { + assert.ok(this.server, 'There is a server'); + assert.ok(window.server, 'There is a global server'); + dynamicAfterEach = () => { + assert.notOk(this.server, 'The server was shut down'); + assert.notOk(window.server, 'The global server is gone'); + }; + + server.create('user'); + await visit('/crud-demo'); + + assert.equal(currentRouteName(), 'crud-demo'); + assert.dom('[data-test-id="user"]').exists(); + }); + }); +}); diff --git a/test-projects/03-app-that-uses-make-server/tests/helpers/destroy-app.js b/test-projects/03-app-that-uses-make-server/tests/helpers/destroy-app.js new file mode 100644 index 000000000..f8d24fc36 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/tests/helpers/destroy-app.js @@ -0,0 +1,9 @@ +import { run } from '@ember/runloop'; + +export default function destroyApp(application) { + run(function() { + application.destroy(); + + server.shutdown(); + }); +} diff --git a/test-projects/03-app-that-uses-make-server/tests/helpers/module-for-acceptance.js b/test-projects/03-app-that-uses-make-server/tests/helpers/module-for-acceptance.js new file mode 100644 index 000000000..90a93bac2 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/tests/helpers/module-for-acceptance.js @@ -0,0 +1,21 @@ +import { module } from 'qunit'; +import { resolve } from 'rsvp'; +import startApp from '../helpers/start-app'; +import destroyApp from '../helpers/destroy-app'; + +export default function(name, options = {}) { + module(name, { + beforeEach() { + this.application = startApp(); + + if (options.beforeEach) { + return options.beforeEach.apply(this, arguments); + } + }, + + afterEach() { + let afterEach = options.afterEach && options.afterEach.apply(this, arguments); + return resolve(afterEach).then(() => destroyApp(this.application)); + } + }); +} diff --git a/test-projects/03-app-that-uses-make-server/tests/helpers/promise-ajax.js b/test-projects/03-app-that-uses-make-server/tests/helpers/promise-ajax.js new file mode 100644 index 000000000..38a09df02 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/tests/helpers/promise-ajax.js @@ -0,0 +1,10 @@ +import { Promise } from 'rsvp'; +import $ from 'jquery'; + +export default (options) => { + return new Promise((resolve, reject) => { + $.ajax(options) + .done((data, status, xhr) => resolve({data, status, xhr})) + .fail((xhr, status, error) => reject({xhr, status, error})); + }); +}; diff --git a/test-projects/03-app-that-uses-make-server/tests/helpers/resolver.js b/test-projects/03-app-that-uses-make-server/tests/helpers/resolver.js new file mode 100644 index 000000000..b208d38d0 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/tests/helpers/resolver.js @@ -0,0 +1,11 @@ +import Resolver from '../../resolver'; +import config from '../../config/environment'; + +const resolver = Resolver.create(); + +resolver.namespace = { + modulePrefix: config.modulePrefix, + podModulePrefix: config.podModulePrefix +}; + +export default resolver; diff --git a/test-projects/03-app-that-uses-make-server/tests/helpers/start-app.js b/test-projects/03-app-that-uses-make-server/tests/helpers/start-app.js new file mode 100644 index 000000000..99d35dcf4 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/tests/helpers/start-app.js @@ -0,0 +1,17 @@ +import Application from '../../app'; +import config from '../../config/environment'; +import { merge } from '@ember/polyfills'; +import { run } from '@ember/runloop'; + +export default function startApp(attrs) { + let attributes = merge({}, config.APP); + attributes.autoboot = true; + attributes = merge(attributes, attrs); // use defaults, but you can override; + + return run(() => { + let application = Application.create(attributes); + application.setupForTesting(); + application.injectTestHelpers(); + return application; + }); +} diff --git a/test-projects/03-app-that-uses-make-server/tests/index.html b/test-projects/03-app-that-uses-make-server/tests/index.html new file mode 100644 index 000000000..008e6d610 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/tests/index.html @@ -0,0 +1,33 @@ + + + + + + BasicApp Tests + + + + {{content-for "head"}} + {{content-for "test-head"}} + + + + + + {{content-for "head-footer"}} + {{content-for "test-head-footer"}} + + + {{content-for "body"}} + {{content-for "test-body"}} + + + + + + + + {{content-for "body-footer"}} + {{content-for "test-body-footer"}} + + diff --git a/test-projects/03-app-that-uses-make-server/tests/test-helper.js b/test-projects/03-app-that-uses-make-server/tests/test-helper.js new file mode 100644 index 000000000..0382a848d --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/tests/test-helper.js @@ -0,0 +1,8 @@ +import Application from '../app'; +import config from '../config/environment'; +import { setApplication } from '@ember/test-helpers'; +import { start } from 'ember-qunit'; + +setApplication(Application.create(config.APP)); + +start(); diff --git a/test-projects/03-app-that-uses-make-server/vendor/.gitkeep b/test-projects/03-app-that-uses-make-server/vendor/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/tests/dummy/app/pods/docs/advanced/server-configuration/template.md b/tests/dummy/app/pods/docs/advanced/server-configuration/template.md new file mode 100644 index 000000000..da9ef5262 --- /dev/null +++ b/tests/dummy/app/pods/docs/advanced/server-configuration/template.md @@ -0,0 +1,95 @@ +# Server configuration + +The MirageJS server is configured for you by ember-cli-mirage. However, if you need to customize the server you can by creating a makeServer function in the config.js. + +```javascript +/* + The named `makeServer` function export gives you a lower-level way to hook + into how your Ember app instantiates your Mirage JS server. + + Typically, the `/mirage/config.js` file contains a single default export which + is a function defining all your Mirage route handlers. Ember CLI Mirage then + uses this function, along with all the other modules you've defined in + `mirage/models`, `mirage/fixtures`, mirage/factories`, and + `mirage/serializers`, to create your Mirage JS server when your app boots up + in development and testing. + + You can now opt in to having more control over exactly how your Mirage server + is instantiated, as well as the ability to use imports directly from the + `miragejs` npm package, by exporting a single named function called + `makeServer` instead. + + `makeServer` receives a single argument called `config`, which contains all + the factory/fixture/serializer/model modules that exist in your project's + `/mirage` directory. This saves you from having to import each module + explicitly and then pass it into your Mirage server, just like you're used to + with the default setup. + + The `config` argument maps exactly to everything inside of your `/mirage` + directory - notably, it does not contain the autogenerated Mirage model + definitions derived from your Ember Data models, which is an important feature + of Ember CLI Mirage that is enabled by default. To replicate this behavior + when using `makeServer`, we have provided an additional import called + `discoverEmberDataModels` from the `ember-cli-mirage` package that you can use + to augment your config with these models so that your Mirage schema is + automatically inferred from your host application's Ember Data models and + relationships. The snippet below shows how to do this. Note that the order + here matters if you also have models defined in your `/mirage/models` + directory, as those model definitions would "win" in the event of a conflict + with the ones autodiscovered from Ember Data. (However, most of time if you + are inferring your Mirage schema from Ember Data, you shouldn't need to define + additional models.) + + Finally, your route handlers just need to be passed to the `routes()` key in + your Mirage config. You can do this inline, or you can make them a separate + function, and organize that function however you choose. + + The only thing needed to enable this behavior is that you delete the default + function export and instead export a single named function called + `makeServer`. You should also add `miragejs` to your project's dependencies in + your `package.json` file, since you are now importing directly from it. Note + that this gives you the added benefit of being able to upgrade `miragejs` + independently of `ember-cli-mirage`. + + Eventually, `ember-cli-mirage` will shed its re-exports of everythign from + `miragejs', and become a small wrapper library delegating the rest of the work + to `miragejs`. This will help align the Ember Mirage users with the rest of + the Mirage JS community. +*/ + +// Example with inline routes +import { createServer, discoverEmberDataModels } from "ember-cli-mirage"; + +export function makeServer(config) { + let finalConfig = { + ...config, + models: { ...discoverEmberDataModels(), ...config.models }, + routes() { + // this.namespace = '/api' + + // this.resource('user') + }, + }; + + return createServer(finalConfig); +} + +// Example with routes in an external function +import { createServer, discoverEmberDataModels } from "ember-cli-mirage"; + +export function makeServer(config) { + let finalConfig = { + ...config, + models: { ...discoverEmberDataModels(), ...config.models }, + routes, + }; + + return createServer(finalConfig); +} + +function routes() { + // this.namespace = '/api' + + // this.resource('user') +} +``` diff --git a/tests/dummy/app/pods/docs/template.hbs b/tests/dummy/app/pods/docs/template.hbs index fb36354ed..3f95c3292 100644 --- a/tests/dummy/app/pods/docs/template.hbs +++ b/tests/dummy/app/pods/docs/template.hbs @@ -27,6 +27,7 @@ {{nav.section "Advanced"}} {{nav.item "Environment options" "docs.advanced.environment-options"}} + {{nav.item "Server Configuration" "docs.advanced.server-configuration"}} {{nav.item "Simulating cookie responses" "docs.advanced.simulating-cookie-responses"}} {{nav.item "Mocking GUIDs" "docs.advanced.mocking-guids"}} {{nav.item "Customizing the inflector" "docs.advanced.customizing-the-inflector"}} diff --git a/tests/dummy/app/router.js b/tests/dummy/app/router.js index 046ae4b84..3c98c42c1 100644 --- a/tests/dummy/app/router.js +++ b/tests/dummy/app/router.js @@ -38,6 +38,7 @@ Router.map(function() { this.route('advanced', function() { this.route('environment-options'); + this.route('server-configuration'); this.route('simulating-cookie-responses'); this.route('mocking-guids'); this.route('customizing-the-inflector'); From 302e24e331edd2a5468adcd2f51c53d9af47feb0 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 17 Aug 2020 07:10:18 +0000 Subject: [PATCH 701/879] build(deps-dev): bump eslint-plugin-ember from 8.10.1 to 8.11.0 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 8.10.1 to 8.11.0. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v8.10.1...v8.11.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 60727dbcf..23f476e24 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7388,9 +7388,9 @@ esdoc@pzuraq/esdoc#015a342: taffydb "2.7.2" eslint-plugin-ember@^8.1.0: - version "8.10.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.10.1.tgz#359e31dc5478959244481c03323e22813ff65508" - integrity sha512-NmsrB8E4An8ErjHz5exCS4zjJSueFetZ9UCqdqYyERV6i/yucSBlPsop6tM2Bfopj0nSbB+qdSzTF3AZWVAAqA== + version "8.11.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.11.0.tgz#40f7c76047047100fed12af5e56a775cab29ae32" + integrity sha512-9VeqrVBbQ5HsxyvKFJORGfkyzJt0bCdUgIdVeHkYN1+31+3SVpGHB8N1zQYLlTh7JkYn/UYxhfUtBN3p4joGJg== dependencies: "@ember-data/rfc395-data" "^0.0.4" ember-rfc176-data "^0.3.15" From 7c154cce8646393c71a4b379785b1b00632e7a2e Mon Sep 17 00:00:00 2001 From: Brian Gantzler Date: Fri, 7 Aug 2020 10:00:19 -0400 Subject: [PATCH 702/879] Ember Data Serializer --- addon/ember-data.js | 112 +++++++ addon/index.js | 3 +- addon/serializers/ember-data-serializer.js | 290 ++++++++++++++++++ index.js | 4 + testem.js | 1 + tests/dummy/app/models/address.js | 5 + tests/dummy/app/models/word-smith.js | 8 + tests/dummy/app/serializers/address.js | 5 + tests/dummy/app/serializers/application.js | 9 + tests/dummy/app/serializers/word-smith.js | 8 + tests/dummy/mirage/config.js | 16 +- .../ember-data-serializer-discover-test.js | 31 ++ .../serializers/ember-data-serializer-test.js | 150 +++++++++ 13 files changed, 640 insertions(+), 2 deletions(-) create mode 100644 addon/serializers/ember-data-serializer.js create mode 100644 tests/dummy/app/models/address.js create mode 100644 tests/dummy/app/models/word-smith.js create mode 100644 tests/dummy/app/serializers/address.js create mode 100644 tests/dummy/app/serializers/application.js create mode 100644 tests/dummy/app/serializers/word-smith.js create mode 100644 tests/unit/serializers/ember-data-serializer-discover-test.js create mode 100644 tests/unit/serializers/ember-data-serializer-test.js diff --git a/addon/ember-data.js b/addon/ember-data.js index 54f5bf8cd..7ef43302d 100644 --- a/addon/ember-data.js +++ b/addon/ember-data.js @@ -5,6 +5,8 @@ import config from 'ember-get-config'; import assert from './assert'; import { hasEmberData, isDsModel } from 'ember-cli-mirage/utils/ember-data'; import { Model, belongsTo, hasMany } from 'ember-cli-mirage'; +import EmberDataSerializer from "ember-cli-mirage/serializers/ember-data-serializer"; +import { camelize } from './utils/inflector'; const { modulePrefix, @@ -13,6 +15,7 @@ const { // Caches let DsModels, Models; +let DsSerializers, Serializers /** * Get all ember data models under the app's namespaces @@ -99,3 +102,112 @@ export function modelFor(name) { assert(!!models[name], `Model of type '${name}' does not exist.`); return models[name]; } + +/** + * Get all ember data serializers under the app's namespaces + * + * @method getDsSerializers + * @private + * @hide + * @return {Object} serializers + */ +export function getDsSerializers() { + if (DsSerializers) { + return DsSerializers; + } + + let moduleMap = requirejs.entries; + let classicSerializerMatchRegex = new RegExp(`^${modulePrefix}/serializers/(.*)$`, 'i'); + let podSerializerMatchRegex = new RegExp(`^${podModulePrefix || modulePrefix}/(.*)/serializer$`, 'i'); + + DsSerializers = {} + + if (!hasEmberData) { + return DsSerializers; + } + + Object.keys(moduleMap) + .forEach((path) => { + let matches = path.match(classicSerializerMatchRegex) || path.match(podSerializerMatchRegex); + if (matches && matches[1]) { + let serializerName = matches[1]; + + let serializer = require(path, null, null, true).default; + // in mirage, registering models takes care of camelize, serializers do not + DsSerializers[camelize(serializerName)] = serializer; + } + }); + + return DsSerializers; +} + +/** + * Generate mirage serializers for each of the ember-data serializers + * if a mirage serializer already exists, apply the ember-data transforms + * + * @method applyEmberDataSerializers + * @private + * @hide + * @return {Object} serializers + */ +export function applyEmberDataSerializers(mirageSerializers = {}) { + if (Serializers) { + return Serializers; + } + + let emberDataSerializers = getDsSerializers(); + + // Start off with the mirage serializers, + // so if there are any mirage serializers with no ED counterpart, they are in the list + Serializers = mirageSerializers; + + Object.keys(emberDataSerializers).forEach(serializerName => { + let dsSerializer = emberDataSerializers[serializerName]; + + // Seems I have to create it to get access to some of the properties + dsSerializer = dsSerializer.create ? dsSerializer.create() : new dsSerializer; + + let transforms; + let primaryKey = dsSerializer.primaryKey; + let attrs = dsSerializer.attrs; + if (primaryKey || attrs) { + + let Serializer = mirageSerializers[serializerName] || mirageSerializers.application || EmberDataSerializer; + + if (attrs) { + let serializer = Serializer.create ? Serializer.create() : new Serializer; + + transforms = serializer.transforms || {}; + + Object.keys(attrs).forEach(key => { + let transform = attrs[key]; + let serializerTransform = serializer.transforms ? serializer.transforms[key] : {}; + let resolvedTransform = typeof attrs[key] === 'string' + ? { + key: attrs[key] + } + : { + key: attrs[key].key, + }; + + if (transform.serialize !== undefined) { + resolvedTransform.deserialize = transform.serialize; + } + + if (transform.deserialize !== undefined) { + resolvedTransform.serialize = transform.deserialize; + } + + transforms[key] = Object.assign(resolvedTransform, serializerTransform); + }); + } + + Serializers[serializerName] = Serializer.extend({ + primaryKey, + transforms + }); + } + }); + + return Serializers; +} diff --git a/addon/index.js b/addon/index.js index 00fe95641..3af4a664f 100644 --- a/addon/index.js +++ b/addon/index.js @@ -1,3 +1,4 @@ export { default } from 'miragejs'; export * from 'miragejs'; -export {discoverEmberDataModels} from './ember-data'; +export {discoverEmberDataModels, applyEmberDataSerializers} from './ember-data'; +export { default as EmberDataSerializer } from 'ember-cli-mirage/serializers/ember-data-serializer'; diff --git a/addon/serializers/ember-data-serializer.js b/addon/serializers/ember-data-serializer.js new file mode 100644 index 000000000..82a91e252 --- /dev/null +++ b/addon/serializers/ember-data-serializer.js @@ -0,0 +1,290 @@ +import { RestSerializer, + _utilsInflectorCamelize as camelize, + _utilsInflectorDasherize as dasherize, +} from 'miragejs'; +import {isFunction} from "lodash-es"; +import {get} from "@ember/object"; + +/** + * This serializer does not use following mirage properties to control how things are serialized + * attrs - see serialize:false on the transform for the properties you do not want to serialize. + * embed - see serialize: records for the relations you want to emded + * serializeIds - see serialize: ids for the relations you want as ids + * + * The above configuration was applied to every property on the serializer, whereas the transforms allows you + * to specify a value for each relation. + * + * The following properties are supported + * include - This works are described in the mirage documentation for the serializer interface + * + * Instead it uses the Ember Data serializer format or attrs to specify the serialization under the + * property transforms (attrs is already in use by mirageJs). + * + * The startMirage has been modified to also generate serializers from the Ember Data serializers supporting + * the key and the serialize/deserialize properties with the value of (true/ids/records). If a serializer is + * already present in the mirage directory, the transforms will be added to it. If that serializer is not + * a serializer of this type, there will be no effect. Ensure that your serializers and/or the application + * serializer in the mirage directory is a type of this serializer + * + */ +let EmberDataSerializer = RestSerializer.extend({ + /** + * The property name for the primary key for mirage and ember data is normally `id`. This allows you + * to specify what that property name should be in the JSON. + */ + primaryKey: "id", + + /** + * Transforms follow the format of ember data serializer attrs as follows + * + * { + * property: { // property would be the name of the property in the mirage store + * key: 'externalKey', // externalKey would be the name in the JSON + * serialize: 'ids', // how should this property be serialized and deserialized + * deserialize: 'ids' // the default is 'ids' that is the id of the releation + * // or 'records', that is, embed the full record instead of the id + * // or false, do not serialize or deserialize as applied + * } + * } + * + * These transforms will be created from the attrs on the corresponding serializer in ember data much like + * the models for mirage are created from the models in in ember date. If the transforms key is specified, it + * will overlay the definition created from the serializer key for key. That is you could override some + * of the transform definition. + */ + transforms: undefined, + // resolved transforms + _transforms: undefined, + + // These are the defaults + // include: [] + + keyForId() { + return this.primaryKey; + }, + + getKeysForIncluded() { + return isFunction(this.include) + ? this.include(this.request, this.primaryResource) + : this.include; + }, + + getTransforms() { + return this.transforms || {}; + }, + + getResolvedTransforms() { + if (!this._resolvedTransforms) { + this._resolvedTransforms = { + serialize: {}, + normalize: {} + } + } + + return this._resolvedTransforms; + }, + + getTransformForSerialize(key) { + let resolvedTransforms = this.getResolvedTransforms(); + let transforms = this.getTransforms(); + + if ( ! resolvedTransforms.serialize[key]) { + let transform = typeof transforms[key] === 'string' + ? {key: transforms[key]} + : Object.assign({}, transforms[key]); + + resolvedTransforms.serialize[key] = Object.assign( + {key: key, serialize: 'ids', deserialize: 'ids'}, + transform + ); + } + + return resolvedTransforms.serialize[key]; + }, + + getTransformForNormalize(key) { + let resolvedTransforms = this.getResolvedTransforms(); + + if ( ! resolvedTransforms.normalize[key]) { + let transforms = this.getTransforms(); + let foundKey; + let foundTransform = Object.keys(transforms).find(item => { + foundKey = item; + return transforms[item].key === key; + }); + let transform = foundTransform + ? Object.assign( + {}, + transforms[foundKey], + { key: foundKey } + ) + : {key: key, serialize: 'ids', deserialize: 'ids'}; + + resolvedTransforms.normalize[key] = transform; + } + + return resolvedTransforms.normalize[key]; + }, + + /** + * + * @param model + * @param removeForeignKeys + * @param didSerialize + * @returns {*} + * @private + */ + _hashForModel(model, removeForeignKeys, didSerialize = {}) { + + let attrs = this._attrsForModel(model); + + let newDidSerialize = Object.assign({}, didSerialize); + newDidSerialize[model.modelName] = newDidSerialize[model.modelName] || {}; + newDidSerialize[model.modelName][model.id] = true; + + model.associationKeys.forEach((key) => { + let transform = this.getTransformForSerialize(key); + + if (transform.serialize) { + let associatedResource = model[key]; + + let serializeOption = transform.serialize; + + if (associatedResource && + get(newDidSerialize, `${associatedResource.modelName}.${associatedResource.id}`) + ) { + // force it to IDS if we already have serialized it to prevent recursion + // TODO: However is the end system wants records, we need to send records, so this really should be do records, dont resurse + serializeOption ='ids'; + } + + if (serializeOption === 'records') { + let [associatedResourceHash] = this.getHashForResource( + associatedResource, + false, + newDidSerialize, + true + ); + let formattedKey = this._keyForProperty(key) || + this.isCollection(associatedResource) + ? this.keyForRelationship(key) + : this.keyForEmbeddedRelationship(key); + attrs[formattedKey] = associatedResourceHash; + } else { + let formattedKey = this._keyForProperty(key) || + this.keyForRelationshipIds(key); + + if (this.isCollection(associatedResource)) { + attrs[formattedKey] = model[`${this._container.inflector.singularize(key)}Ids`]; + } else { + attrs[formattedKey] = model[`${this._container.inflector.singularize(key)}Id`]; + } + } + } + }); + + return attrs; + }, + + _keyForProperty(attr) { + let transform = this.getTransformForSerialize(attr); + + return transform.key; + }, + + keyForAttribute(attr) { + if (attr === "id") { + return this.keyForId(); + } + + return this._keyForProperty(attr) || RestSerializer.prototype.keyForAttribute.apply(this, arguments); + }, + + keyForRelationship(type) { + return this._keyForProperty(type) || RestSerializer.prototype.keyForRelationship.apply(this, arguments); + }, + + keyForEmbeddedRelationship(attributeName) { + return this._keyForProperty(attributeName) || RestSerializer.prototype.keyForEmbeddedRelationship.apply(this, arguments); + }, + + keyForRelationshipIds(type) { + return this._keyForProperty(type) || RestSerializer.prototype.keyForRelationshipIds.apply(this, arguments); + }, + + keyForForeignKey(relationshipName) { + return this._keyForProperty(relationshipName) || RestSerializer.prototype.keyForForeignKey.apply(this, arguments); + }, + + normalize(payload) { + // was it not wrapped when serialized? + if (this.root === false) { + let p = {}; + p[this.type] = payload; + payload = p; + } + + let type = Object.keys(payload)[0]; + let attrs = payload[type]; + let modelName = camelize(type); + let modelClass = this.schema.modelClassFor(modelName); + let { belongsToAssociations, hasManyAssociations } = modelClass; + let belongsToKeys = Object.keys(belongsToAssociations); + let hasManyKeys = Object.keys(hasManyAssociations); + + let jsonApiPayload = { + data: { + type: this._container.inflector.pluralize(type), + attributes: {}, + }, + }; + + if (attrs[this.primaryKey]) { + jsonApiPayload.data.id = attrs[this.primaryKey]; + } + + let relationships = {}; + + Object.keys(attrs).forEach(attrKey => { + if (attrKey !== this.primaryKey) { + let transform = this.getTransformForNormalize(attrKey); + let key = transform.key || attrKey; + if (this.normalizeIds) { + if (belongsToKeys.includes(key)) { + let association = belongsToAssociations[key]; + let associationModel = association.modelName; + relationships[dasherize(key)] = { + data: { + type: associationModel, + id: attrs[attrKey], + }, + }; + } else if (hasManyKeys.includes(key)) { + let association = hasManyAssociations[key]; + let associationModel = association.modelName; + let data = attrs[attrKey].map((id) => { + return { + type: associationModel, + id, + }; + }); + relationships[dasherize(key)] = { data }; + } else { + jsonApiPayload.data.attributes[dasherize(key)] = attrs[attrKey]; + } + } else { + jsonApiPayload.data.attributes[dasherize(key)] = attrs[attrKey]; + } + } + }); + + if (Object.keys(relationships).length) { + jsonApiPayload.data.relationships = relationships; + } + + return jsonApiPayload; + }, + +}); + +export default EmberDataSerializer; diff --git a/index.js b/index.js index 5928a9d89..582c53c60 100644 --- a/index.js +++ b/index.js @@ -7,6 +7,10 @@ const writeFile = require('broccoli-file-creator'); module.exports = { name: 'ember-cli-mirage', + // isDevelopingAddon: function () { + // return true; + // }, + included() { let app; diff --git a/testem.js b/testem.js index 1c23bbd73..726d18799 100644 --- a/testem.js +++ b/testem.js @@ -5,6 +5,7 @@ module.exports = { 'Chrome' ], launch_in_dev: [ + 'Chrome' ], browser_args: { Chrome: { diff --git a/tests/dummy/app/models/address.js b/tests/dummy/app/models/address.js new file mode 100644 index 000000000..1f71205d3 --- /dev/null +++ b/tests/dummy/app/models/address.js @@ -0,0 +1,5 @@ +import Model from '@ember-data/model'; + +export default Model.extend({ + +}); diff --git a/tests/dummy/app/models/word-smith.js b/tests/dummy/app/models/word-smith.js new file mode 100644 index 000000000..599d04ca4 --- /dev/null +++ b/tests/dummy/app/models/word-smith.js @@ -0,0 +1,8 @@ +import Model, {attr, belongsTo, hasMany} from '@ember-data/model'; + +export default Model.extend({ + name: attr(), + age: attr(), + comments: hasMany('comments'), + address: belongsTo('address') +}); diff --git a/tests/dummy/app/serializers/address.js b/tests/dummy/app/serializers/address.js new file mode 100644 index 000000000..fa2080981 --- /dev/null +++ b/tests/dummy/app/serializers/address.js @@ -0,0 +1,5 @@ +import RestSerializer from '@ember-data/serializer/rest'; + +export default RestSerializer.extend({ + primaryKey: "addressId" +}); diff --git a/tests/dummy/app/serializers/application.js b/tests/dummy/app/serializers/application.js new file mode 100644 index 000000000..40fd90153 --- /dev/null +++ b/tests/dummy/app/serializers/application.js @@ -0,0 +1,9 @@ +import JSONAPISerializer from '@ember-data/serializer/json-api'; + +export default JSONAPISerializer.extend({ + appSerializer: true, + + // I do not know why I had to make these two lines to get the home-test to pass + keyForAttribute(key) { return key; }, + keyForRelationship(key) { return key; } +}); diff --git a/tests/dummy/app/serializers/word-smith.js b/tests/dummy/app/serializers/word-smith.js new file mode 100644 index 000000000..651c888ec --- /dev/null +++ b/tests/dummy/app/serializers/word-smith.js @@ -0,0 +1,8 @@ +import RestSerializer from '@ember-data/serializer/rest'; + +export default RestSerializer.extend({ + attrs: { + address: "addressId", + blogPosts: {deserialize: "records"} + } +}); diff --git a/tests/dummy/mirage/config.js b/tests/dummy/mirage/config.js index 8f079ff6b..214ad4bda 100644 --- a/tests/dummy/mirage/config.js +++ b/tests/dummy/mirage/config.js @@ -1,4 +1,18 @@ -export default function() { +import { createServer, discoverEmberDataModels, applyEmberDataSerializers } from 'ember-cli-mirage'; + +export function makeServer(config) { + let finalConfig = { + ...config, + models: { ...discoverEmberDataModels(), ...config.models }, + serializers: applyEmberDataSerializers(config.serializers), + routes, + }; + + return createServer(finalConfig) +} + + +function routes() { // // { // "message": "API rate limit exceeded for 72.229.126.12. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)", diff --git a/tests/unit/serializers/ember-data-serializer-discover-test.js b/tests/unit/serializers/ember-data-serializer-discover-test.js new file mode 100644 index 000000000..179f96d25 --- /dev/null +++ b/tests/unit/serializers/ember-data-serializer-discover-test.js @@ -0,0 +1,31 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; +import Server from 'ember-cli-mirage/server'; + +module('Unit | Serializer | ember data serializer discover', function(hooks) { + setupTest(hooks); + + let server; + + hooks.beforeEach(function() { + server = new Server({ + environment: "test", + discoverEmberDataModels: true, + discoverEmberDataSerializers: true + }); + }); + + hooks.afterEach(function () { + server.shutdown(); + }); + + test('it discovers the serializers', function(assert) { + let serializer = server.serializerOrRegistry.serializerFor('address'); + + assert.ok(serializer.primaryKey === 'addressId'); + + serializer = server.serializerOrRegistry.serializerFor('word-smith'); + assert.ok(serializer.transforms['blogPosts'].serialize === 'records'); + }); + +}); diff --git a/tests/unit/serializers/ember-data-serializer-test.js b/tests/unit/serializers/ember-data-serializer-test.js new file mode 100644 index 000000000..fe05489d2 --- /dev/null +++ b/tests/unit/serializers/ember-data-serializer-test.js @@ -0,0 +1,150 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; +import { Model, hasMany, belongsTo } from "miragejs"; +import Server from 'ember-cli-mirage/server'; +import EmberDataSerializer from "ember-cli-mirage/serializers/ember-data-serializer"; + +module('Unit | Serializer | ember data serializer', function(hooks) { + setupTest(hooks); + + let server; + let address, wordSmith; + + hooks.beforeEach(function() { + server = new Server({ + environment: "test", + models: { + address: Model.extend({ + wordSmith: belongsTo(), + }), + wordSmith: Model.extend({ + blogPosts: hasMany(), + address: belongsTo(), + }), + blogPost: Model.extend({ + wordSmith: belongsTo(), + }), + }, + serializers: { + application: EmberDataSerializer, + wordSmith: EmberDataSerializer, + blogPost: EmberDataSerializer, + }, + }); + + address = server.create("address", { + id: "11", + street: "123 maple", + }); + + wordSmith = server.create("word-smith", { + id: 1, + name: "Zelda", + age: 230, + address: address, + }); + + server.create("blog-post", { + id: 2, + wordSmith: wordSmith, + }); + + }); + + hooks.afterEach(function () { + server.shutdown(); + }); + + test('it renames the properties', function(assert) { + server.config({ + serializers: { + wordSmith: EmberDataSerializer.extend({ + transforms: { + name: "externalName", + address: {key: "addressId", serialize: "ids"}, + age: {key: "externalAge"}, + blogPosts: {key: "blogPostIds"} + } + }) + }, + }); + + let json = server.serializerOrRegistry.serialize(wordSmith); + + assert.deepEqual(json, { + "wordSmith": { + "addressId": "11", + "externalAge": 230, + "blogPostIds": ["2"], + "id": "1", + "externalName": "Zelda" + } + }); + }); + + test('it embeds the properties that are relations', function(assert) { + server.config({ + serializers: { + wordSmith: EmberDataSerializer.extend({ + transforms: { + address: {key: "address", serialize: "records"}, + blogPosts: {key: "blogPosts", serialize: "records"} + } + }), + address: EmberDataSerializer.extend({ + transforms: { + wordSmith: "wordSmithId" + } + }), + blogPost: EmberDataSerializer.extend({ + transforms: { + wordSmith: "wordSmithId" + } + }) + }, + }); + + let json = server.serializerOrRegistry.serialize(wordSmith); + + assert.deepEqual(json, { + "wordSmith": { + "address": {id: "11", street: "123 maple", wordSmithId: "1"}, + "age": 230, + "blogPosts": [{id: "2", wordSmithId: "1"}], + "id": "1", + "name": "Zelda" + } + }); + }); + + test('it honors the includes option', function (assert) { + server.config({ + serializers: { + wordSmith: EmberDataSerializer.extend({ + include: ['address'], + }), + address: EmberDataSerializer.extend({ + transforms: { + wordSmith: "wordSmithId" + } + }), + } + }); + + let json = server.serializerOrRegistry.serialize(wordSmith); + assert.deepEqual(json, { + "wordSmith": { + "address": "11", + "age": 230, + "blogPosts": ["2"], + "id": "1", + "name": "Zelda" + }, + "address": [ + {id: "11", street: "123 maple", wordSmithId: "1"}, + ] + }); + + }) + +}); From b6de1a573e0048eb2cfc2acaa695132f620eaa9f Mon Sep 17 00:00:00 2001 From: Brian Gantzler Date: Mon, 17 Aug 2020 13:55:35 -0400 Subject: [PATCH 703/879] Fixed test, removed test-project-03 --- scripts/test.sh | 1 - .../.editorconfig | 20 --- .../03-app-that-uses-make-server/.ember-cli | 9 -- .../.eslintignore | 4 - .../03-app-that-uses-make-server/.eslintrc.js | 2 - .../03-app-that-uses-make-server/.gitignore | 23 ---- .../03-app-that-uses-make-server/.npmignore | 1 - .../03-app-that-uses-make-server/.travis.yml | 29 ---- .../.watchmanconfig | 3 - .../03-app-that-uses-make-server/README.md | 57 -------- .../03-app-that-uses-make-server/app/app.js | 14 -- .../app/components/.gitkeep | 0 .../app/controllers/.gitkeep | 0 .../app/controllers/application.js | 22 ---- .../app/helpers/.gitkeep | 0 .../app/index.html | 25 ---- .../app/models/.gitkeep | 0 .../app/models/book.js | 8 -- .../app/models/tag.js | 5 - .../app/models/things/watch.js | 5 - .../app/models/user.js | 13 -- .../app/pods/application/template.hbs | 3 - .../app/pods/crud-demo-error/template.hbs | 5 - .../app/pods/crud-demo/controller.js | 29 ---- .../app/pods/crud-demo/route.js | 12 -- .../app/pods/crud-demo/template.hbs | 42 ------ .../app/pods/module-count/controller.js | 22 ---- .../app/pods/module-count/template.hbs | 20 --- .../app/resolver.js | 3 - .../app/router.js | 14 -- .../app/routes/.gitkeep | 0 .../app/styles/app.css | 0 .../app/templates/application.hbs | 22 ---- .../app/templates/components/.gitkeep | 0 .../config/environment.js | 58 -------- .../config/optional-features.json | 3 - .../config/targets.js | 18 --- .../ember-cli-build.js | 26 ---- .../fastboot-tests/included-files-test.js | 85 ------------ .../mirage/config.js | 14 -- .../mirage/factories/nested/thing.js | 5 - .../mirage/factories/user.js | 10 -- .../mirage/fixtures/countries.js | 3 - .../mirage/fixtures/nested/things.js | 3 - .../mirage/fixtures/users.js | 5 - .../mirage/identity-managers/book.js | 57 -------- .../mirage/identity-managers/nested/thing.js | 56 -------- .../mirage/models/nested/thing.js | 4 - .../mirage/scenarios/default.js | 7 - .../mirage/serializers/application.js | 3 - .../mirage/serializers/nested/thing.js | 9 -- .../03-app-that-uses-make-server/package.json | 53 -------- .../public/robots.txt | 3 - .../03-app-that-uses-make-server/testem.js | 24 ---- .../tests/acceptance/crud-demo-test.js | 67 ---------- .../tests/acceptance/ember-data-test.js | 72 ---------- .../tests/acceptance/faker-test.js | 15 --- .../tests/acceptance/fixtures-test.js | 20 --- .../tests/acceptance/identity-manager-test.js | 10 -- .../acceptance/legacy-start-mirage-test.js | 59 --------- .../tests/acceptance/request-tracking-test.js | 51 ------- .../tests/acceptance/start-mirage-test.js | 124 ------------------ .../tests/helpers/destroy-app.js | 9 -- .../tests/helpers/module-for-acceptance.js | 21 --- .../tests/helpers/promise-ajax.js | 10 -- .../tests/helpers/resolver.js | 11 -- .../tests/helpers/start-app.js | 17 --- .../tests/index.html | 33 ----- .../tests/test-helper.js | 8 -- .../vendor/.gitkeep | 0 .../ember-data-serializer-discover-test.js | 8 +- 71 files changed, 3 insertions(+), 1391 deletions(-) delete mode 100644 test-projects/03-app-that-uses-make-server/.editorconfig delete mode 100644 test-projects/03-app-that-uses-make-server/.ember-cli delete mode 100644 test-projects/03-app-that-uses-make-server/.eslintignore delete mode 100644 test-projects/03-app-that-uses-make-server/.eslintrc.js delete mode 100644 test-projects/03-app-that-uses-make-server/.gitignore delete mode 100644 test-projects/03-app-that-uses-make-server/.npmignore delete mode 100644 test-projects/03-app-that-uses-make-server/.travis.yml delete mode 100644 test-projects/03-app-that-uses-make-server/.watchmanconfig delete mode 100644 test-projects/03-app-that-uses-make-server/README.md delete mode 100644 test-projects/03-app-that-uses-make-server/app/app.js delete mode 100644 test-projects/03-app-that-uses-make-server/app/components/.gitkeep delete mode 100644 test-projects/03-app-that-uses-make-server/app/controllers/.gitkeep delete mode 100644 test-projects/03-app-that-uses-make-server/app/controllers/application.js delete mode 100644 test-projects/03-app-that-uses-make-server/app/helpers/.gitkeep delete mode 100644 test-projects/03-app-that-uses-make-server/app/index.html delete mode 100644 test-projects/03-app-that-uses-make-server/app/models/.gitkeep delete mode 100644 test-projects/03-app-that-uses-make-server/app/models/book.js delete mode 100644 test-projects/03-app-that-uses-make-server/app/models/tag.js delete mode 100644 test-projects/03-app-that-uses-make-server/app/models/things/watch.js delete mode 100644 test-projects/03-app-that-uses-make-server/app/models/user.js delete mode 100644 test-projects/03-app-that-uses-make-server/app/pods/application/template.hbs delete mode 100644 test-projects/03-app-that-uses-make-server/app/pods/crud-demo-error/template.hbs delete mode 100644 test-projects/03-app-that-uses-make-server/app/pods/crud-demo/controller.js delete mode 100644 test-projects/03-app-that-uses-make-server/app/pods/crud-demo/route.js delete mode 100644 test-projects/03-app-that-uses-make-server/app/pods/crud-demo/template.hbs delete mode 100644 test-projects/03-app-that-uses-make-server/app/pods/module-count/controller.js delete mode 100644 test-projects/03-app-that-uses-make-server/app/pods/module-count/template.hbs delete mode 100644 test-projects/03-app-that-uses-make-server/app/resolver.js delete mode 100644 test-projects/03-app-that-uses-make-server/app/router.js delete mode 100644 test-projects/03-app-that-uses-make-server/app/routes/.gitkeep delete mode 100644 test-projects/03-app-that-uses-make-server/app/styles/app.css delete mode 100644 test-projects/03-app-that-uses-make-server/app/templates/application.hbs delete mode 100644 test-projects/03-app-that-uses-make-server/app/templates/components/.gitkeep delete mode 100644 test-projects/03-app-that-uses-make-server/config/environment.js delete mode 100644 test-projects/03-app-that-uses-make-server/config/optional-features.json delete mode 100644 test-projects/03-app-that-uses-make-server/config/targets.js delete mode 100644 test-projects/03-app-that-uses-make-server/ember-cli-build.js delete mode 100644 test-projects/03-app-that-uses-make-server/fastboot-tests/included-files-test.js delete mode 100644 test-projects/03-app-that-uses-make-server/mirage/config.js delete mode 100644 test-projects/03-app-that-uses-make-server/mirage/factories/nested/thing.js delete mode 100644 test-projects/03-app-that-uses-make-server/mirage/factories/user.js delete mode 100644 test-projects/03-app-that-uses-make-server/mirage/fixtures/countries.js delete mode 100644 test-projects/03-app-that-uses-make-server/mirage/fixtures/nested/things.js delete mode 100644 test-projects/03-app-that-uses-make-server/mirage/fixtures/users.js delete mode 100644 test-projects/03-app-that-uses-make-server/mirage/identity-managers/book.js delete mode 100644 test-projects/03-app-that-uses-make-server/mirage/identity-managers/nested/thing.js delete mode 100644 test-projects/03-app-that-uses-make-server/mirage/models/nested/thing.js delete mode 100644 test-projects/03-app-that-uses-make-server/mirage/scenarios/default.js delete mode 100644 test-projects/03-app-that-uses-make-server/mirage/serializers/application.js delete mode 100644 test-projects/03-app-that-uses-make-server/mirage/serializers/nested/thing.js delete mode 100644 test-projects/03-app-that-uses-make-server/package.json delete mode 100644 test-projects/03-app-that-uses-make-server/public/robots.txt delete mode 100644 test-projects/03-app-that-uses-make-server/testem.js delete mode 100644 test-projects/03-app-that-uses-make-server/tests/acceptance/crud-demo-test.js delete mode 100644 test-projects/03-app-that-uses-make-server/tests/acceptance/ember-data-test.js delete mode 100644 test-projects/03-app-that-uses-make-server/tests/acceptance/faker-test.js delete mode 100644 test-projects/03-app-that-uses-make-server/tests/acceptance/fixtures-test.js delete mode 100644 test-projects/03-app-that-uses-make-server/tests/acceptance/identity-manager-test.js delete mode 100644 test-projects/03-app-that-uses-make-server/tests/acceptance/legacy-start-mirage-test.js delete mode 100644 test-projects/03-app-that-uses-make-server/tests/acceptance/request-tracking-test.js delete mode 100644 test-projects/03-app-that-uses-make-server/tests/acceptance/start-mirage-test.js delete mode 100644 test-projects/03-app-that-uses-make-server/tests/helpers/destroy-app.js delete mode 100644 test-projects/03-app-that-uses-make-server/tests/helpers/module-for-acceptance.js delete mode 100644 test-projects/03-app-that-uses-make-server/tests/helpers/promise-ajax.js delete mode 100644 test-projects/03-app-that-uses-make-server/tests/helpers/resolver.js delete mode 100644 test-projects/03-app-that-uses-make-server/tests/helpers/start-app.js delete mode 100644 test-projects/03-app-that-uses-make-server/tests/index.html delete mode 100644 test-projects/03-app-that-uses-make-server/tests/test-helper.js delete mode 100644 test-projects/03-app-that-uses-make-server/vendor/.gitkeep diff --git a/scripts/test.sh b/scripts/test.sh index e2afac9ca..8f73ba394 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -4,5 +4,4 @@ cd test-projects/01-basic-app && yarn test:fastboot cd test-projects/01-basic-app && yarn test cd test-projects/02-app-that-excludes-mirage && yarn test -cd test-projects/03-app-that-uses-make-server && yarn test EOF diff --git a/test-projects/03-app-that-uses-make-server/.editorconfig b/test-projects/03-app-that-uses-make-server/.editorconfig deleted file mode 100644 index 219985c22..000000000 --- a/test-projects/03-app-that-uses-make-server/.editorconfig +++ /dev/null @@ -1,20 +0,0 @@ -# EditorConfig helps developers define and maintain consistent -# coding styles between different editors and IDEs -# editorconfig.org - -root = true - - -[*] -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true -indent_style = space -indent_size = 2 - -[*.hbs] -insert_final_newline = false - -[*.{diff,md}] -trim_trailing_whitespace = false diff --git a/test-projects/03-app-that-uses-make-server/.ember-cli b/test-projects/03-app-that-uses-make-server/.ember-cli deleted file mode 100644 index ee64cfed2..000000000 --- a/test-projects/03-app-that-uses-make-server/.ember-cli +++ /dev/null @@ -1,9 +0,0 @@ -{ - /** - Ember CLI sends analytics information by default. The data is completely - anonymous, but there are times when you might want to disable this behavior. - - Setting `disableAnalytics` to true will prevent any data from being sent. - */ - "disableAnalytics": false -} diff --git a/test-projects/03-app-that-uses-make-server/.eslintignore b/test-projects/03-app-that-uses-make-server/.eslintignore deleted file mode 100644 index b01e90d69..000000000 --- a/test-projects/03-app-that-uses-make-server/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -/blueprints/*/files/**/*.js -/test-apps/*/dist -/test-apps/*/tmp -/test-apps/*/node_modules diff --git a/test-projects/03-app-that-uses-make-server/.eslintrc.js b/test-projects/03-app-that-uses-make-server/.eslintrc.js deleted file mode 100644 index bbd1f3cf7..000000000 --- a/test-projects/03-app-that-uses-make-server/.eslintrc.js +++ /dev/null @@ -1,2 +0,0 @@ -let parent = require('../../.eslintrc.js'); -module.exports = parent; diff --git a/test-projects/03-app-that-uses-make-server/.gitignore b/test-projects/03-app-that-uses-make-server/.gitignore deleted file mode 100644 index 8fa39a63c..000000000 --- a/test-projects/03-app-that-uses-make-server/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -# See https://help.github.com/ignore-files/ for more about ignoring files. - -# compiled output -/dist -/tmp - -# dependencies -/node_modules -/bower_components - -# misc -/.sass-cache -/connect.lock -/coverage/* -/libpeerconnection.log -npm-debug.log* -yarn-error.log -testem.log - -# ember-try -.node_modules.ember-try/ -bower.json.ember-try -package.json.ember-try diff --git a/test-projects/03-app-that-uses-make-server/.npmignore b/test-projects/03-app-that-uses-make-server/.npmignore deleted file mode 100644 index 72e8ffc0d..000000000 --- a/test-projects/03-app-that-uses-make-server/.npmignore +++ /dev/null @@ -1 +0,0 @@ -* diff --git a/test-projects/03-app-that-uses-make-server/.travis.yml b/test-projects/03-app-that-uses-make-server/.travis.yml deleted file mode 100644 index 68a25a16e..000000000 --- a/test-projects/03-app-that-uses-make-server/.travis.yml +++ /dev/null @@ -1,29 +0,0 @@ ---- -language: node_js -node_js: - - "6" - -sudo: false -dist: trusty - -addons: - chrome: stable - -cache: - yarn: true - -env: - global: - # See https://git.io/vdao3 for details. - - JOBS=1 - -before_install: - - curl -o- -L https://yarnpkg.com/install.sh | bash - - export PATH=$HOME/.yarn/bin:$PATH - -install: - - yarn install --non-interactive - -script: - - yarn lint:js - - yarn test diff --git a/test-projects/03-app-that-uses-make-server/.watchmanconfig b/test-projects/03-app-that-uses-make-server/.watchmanconfig deleted file mode 100644 index e7834e3e4..000000000 --- a/test-projects/03-app-that-uses-make-server/.watchmanconfig +++ /dev/null @@ -1,3 +0,0 @@ -{ - "ignore_dirs": ["tmp", "dist"] -} diff --git a/test-projects/03-app-that-uses-make-server/README.md b/test-projects/03-app-that-uses-make-server/README.md deleted file mode 100644 index b29133388..000000000 --- a/test-projects/03-app-that-uses-make-server/README.md +++ /dev/null @@ -1,57 +0,0 @@ -# basic-app - -This README outlines the details of collaborating on this Ember application. -A short introduction of this app could easily go here. - -## Prerequisites - -You will need the following things properly installed on your computer. - -* [Git](https://git-scm.com/) -* [Node.js](https://nodejs.org/) -* [Yarn](https://yarnpkg.com/) -* [Ember CLI](https://ember-cli.com/) -* [Google Chrome](https://google.com/chrome/) - -## Installation - -* `git clone ` this repository -* `cd basic-app` -* `yarn install` - -## Running / Development - -* `ember serve` -* Visit your app at [http://localhost:4200](http://localhost:4200). -* Visit your tests at [http://localhost:4200/tests](http://localhost:4200/tests). - -### Code Generators - -Make use of the many generators for code, try `ember help generate` for more details - -### Running Tests - -* `ember test` -* `ember test --server` - -### Linting - -* `yarn lint:js` -* `yarn lint:js --fix` - -### Building - -* `ember build` (development) -* `ember build --environment production` (production) - -### Deploying - -Specify what it takes to deploy your app. - -## Further Reading / Useful Links - -* [ember.js](https://emberjs.com/) -* [ember-cli](https://ember-cli.com/) -* Development Browser Extensions - * [ember inspector for chrome](https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi) - * [ember inspector for firefox](https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/) diff --git a/test-projects/03-app-that-uses-make-server/app/app.js b/test-projects/03-app-that-uses-make-server/app/app.js deleted file mode 100644 index b3b2bd677..000000000 --- a/test-projects/03-app-that-uses-make-server/app/app.js +++ /dev/null @@ -1,14 +0,0 @@ -import Application from '@ember/application'; -import Resolver from './resolver'; -import loadInitializers from 'ember-load-initializers'; -import config from './config/environment'; - -const App = Application.extend({ - modulePrefix: config.modulePrefix, - podModulePrefix: config.podModulePrefix, - Resolver -}); - -loadInitializers(App, config.modulePrefix); - -export default App; diff --git a/test-projects/03-app-that-uses-make-server/app/components/.gitkeep b/test-projects/03-app-that-uses-make-server/app/components/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/test-projects/03-app-that-uses-make-server/app/controllers/.gitkeep b/test-projects/03-app-that-uses-make-server/app/controllers/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/test-projects/03-app-that-uses-make-server/app/controllers/application.js b/test-projects/03-app-that-uses-make-server/app/controllers/application.js deleted file mode 100644 index ebf85aef1..000000000 --- a/test-projects/03-app-that-uses-make-server/app/controllers/application.js +++ /dev/null @@ -1,22 +0,0 @@ -/* global requirejs */ -import Controller from '@ember/controller'; -import { computed } from '@ember/object'; -import ENV from 'basic-app/config/environment'; - -export default Controller.extend({ - - environment: ENV.environment, - - mirageModules: computed(function() { - return Object.keys(requirejs.entries) - .filter(key => key.match('^ember-cli-mirage')); - }), - - otherIncludedModules: computed(function() { - return Object.keys(requirejs.entries) - .filter(key => { - return key.match('^pretender') || key.match('^lodash') || key.match('initializers/ember-cli-mirage'); - }); - }) - -}); diff --git a/test-projects/03-app-that-uses-make-server/app/helpers/.gitkeep b/test-projects/03-app-that-uses-make-server/app/helpers/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/test-projects/03-app-that-uses-make-server/app/index.html b/test-projects/03-app-that-uses-make-server/app/index.html deleted file mode 100644 index 326f147b5..000000000 --- a/test-projects/03-app-that-uses-make-server/app/index.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - BasicApp - - - - {{content-for "head"}} - - - - - {{content-for "head-footer"}} - - - {{content-for "body"}} - - - - - {{content-for "body-footer"}} - - diff --git a/test-projects/03-app-that-uses-make-server/app/models/.gitkeep b/test-projects/03-app-that-uses-make-server/app/models/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/test-projects/03-app-that-uses-make-server/app/models/book.js b/test-projects/03-app-that-uses-make-server/app/models/book.js deleted file mode 100644 index 64a6f13d1..000000000 --- a/test-projects/03-app-that-uses-make-server/app/models/book.js +++ /dev/null @@ -1,8 +0,0 @@ -import Model from 'ember-data/model'; -import { belongsTo } from 'ember-data/relationships'; - -export default Model.extend({ - - user: belongsTo() - -}); diff --git a/test-projects/03-app-that-uses-make-server/app/models/tag.js b/test-projects/03-app-that-uses-make-server/app/models/tag.js deleted file mode 100644 index 8aae571f3..000000000 --- a/test-projects/03-app-that-uses-make-server/app/models/tag.js +++ /dev/null @@ -1,5 +0,0 @@ -import Model from 'ember-data/model'; - -export default Model.extend({ - -}); diff --git a/test-projects/03-app-that-uses-make-server/app/models/things/watch.js b/test-projects/03-app-that-uses-make-server/app/models/things/watch.js deleted file mode 100644 index 8aae571f3..000000000 --- a/test-projects/03-app-that-uses-make-server/app/models/things/watch.js +++ /dev/null @@ -1,5 +0,0 @@ -import Model from 'ember-data/model'; - -export default Model.extend({ - -}); diff --git a/test-projects/03-app-that-uses-make-server/app/models/user.js b/test-projects/03-app-that-uses-make-server/app/models/user.js deleted file mode 100644 index ac53b753c..000000000 --- a/test-projects/03-app-that-uses-make-server/app/models/user.js +++ /dev/null @@ -1,13 +0,0 @@ -import attr from 'ember-data/attr'; -import Model from 'ember-data/model'; -import { hasMany } from 'ember-data/relationships'; - -export default Model.extend({ - - name: attr('string'), - age: attr('number'), - email: attr('string'), - - books: hasMany() - -}); diff --git a/test-projects/03-app-that-uses-make-server/app/pods/application/template.hbs b/test-projects/03-app-that-uses-make-server/app/pods/application/template.hbs deleted file mode 100644 index b6a8aa972..000000000 --- a/test-projects/03-app-that-uses-make-server/app/pods/application/template.hbs +++ /dev/null @@ -1,3 +0,0 @@ -

    Mirage - test app

    - -{{outlet}} diff --git a/test-projects/03-app-that-uses-make-server/app/pods/crud-demo-error/template.hbs b/test-projects/03-app-that-uses-make-server/app/pods/crud-demo-error/template.hbs deleted file mode 100644 index 0454883f4..000000000 --- a/test-projects/03-app-that-uses-make-server/app/pods/crud-demo-error/template.hbs +++ /dev/null @@ -1,5 +0,0 @@ -

    WHOOPS

    - -

    - {{model.errors.firstObject}} -

    diff --git a/test-projects/03-app-that-uses-make-server/app/pods/crud-demo/controller.js b/test-projects/03-app-that-uses-make-server/app/pods/crud-demo/controller.js deleted file mode 100644 index e87f8af82..000000000 --- a/test-projects/03-app-that-uses-make-server/app/pods/crud-demo/controller.js +++ /dev/null @@ -1,29 +0,0 @@ -import Controller from '@ember/controller'; -import { inject as service } from '@ember/service'; - -export default Controller.extend({ - - store: service(), - - actions: { - createUser() { - let name = this.get('newName'); - - this.get('store') - .createRecord('user', { name }) - .save() - .then(() => { - this.set('newName', ''); - }); - }, - - updateUser(user) { - user.save(); - }, - - deleteUser(user) { - user.destroyRecord(); - } - } - -}); diff --git a/test-projects/03-app-that-uses-make-server/app/pods/crud-demo/route.js b/test-projects/03-app-that-uses-make-server/app/pods/crud-demo/route.js deleted file mode 100644 index f67295e61..000000000 --- a/test-projects/03-app-that-uses-make-server/app/pods/crud-demo/route.js +++ /dev/null @@ -1,12 +0,0 @@ -import Route from '@ember/routing/route'; - -export default Route.extend({ - - model() { - return this.store.findAll('user'); - }, - - actions: { - } - -}); diff --git a/test-projects/03-app-that-uses-make-server/app/pods/crud-demo/template.hbs b/test-projects/03-app-that-uses-make-server/app/pods/crud-demo/template.hbs deleted file mode 100644 index 7e052ef79..000000000 --- a/test-projects/03-app-that-uses-make-server/app/pods/crud-demo/template.hbs +++ /dev/null @@ -1,42 +0,0 @@ -{{#if error}} - -

    - There was an error: {{error}} -

    - -{{else}} - - {{#each model as |user|}} -
    -
    - {{input value=user.name}} - - - - {{#if user.isSaving}} - Saving... - {{else if user.id}} - Saved - {{/if}} - -
    -
    - {{/each}} - -{{/if}} - -
    - -
    -
    -
    - {{input value=newName placeholder='Name'}} -
    - -
    - -
    -
    -
    diff --git a/test-projects/03-app-that-uses-make-server/app/pods/module-count/controller.js b/test-projects/03-app-that-uses-make-server/app/pods/module-count/controller.js deleted file mode 100644 index ebf85aef1..000000000 --- a/test-projects/03-app-that-uses-make-server/app/pods/module-count/controller.js +++ /dev/null @@ -1,22 +0,0 @@ -/* global requirejs */ -import Controller from '@ember/controller'; -import { computed } from '@ember/object'; -import ENV from 'basic-app/config/environment'; - -export default Controller.extend({ - - environment: ENV.environment, - - mirageModules: computed(function() { - return Object.keys(requirejs.entries) - .filter(key => key.match('^ember-cli-mirage')); - }), - - otherIncludedModules: computed(function() { - return Object.keys(requirejs.entries) - .filter(key => { - return key.match('^pretender') || key.match('^lodash') || key.match('initializers/ember-cli-mirage'); - }); - }) - -}); diff --git a/test-projects/03-app-that-uses-make-server/app/pods/module-count/template.hbs b/test-projects/03-app-that-uses-make-server/app/pods/module-count/template.hbs deleted file mode 100644 index 719d77ed1..000000000 --- a/test-projects/03-app-that-uses-make-server/app/pods/module-count/template.hbs +++ /dev/null @@ -1,20 +0,0 @@ -

    - Environment: - - {{environment}} - -

    - -

    - Mirage modules in project: - - {{mirageModules.length}} - -

    - -

    - Other modules in project: - - {{otherIncludedModules.length}} - -

    diff --git a/test-projects/03-app-that-uses-make-server/app/resolver.js b/test-projects/03-app-that-uses-make-server/app/resolver.js deleted file mode 100644 index 2fb563d6c..000000000 --- a/test-projects/03-app-that-uses-make-server/app/resolver.js +++ /dev/null @@ -1,3 +0,0 @@ -import Resolver from 'ember-resolver'; - -export default Resolver; diff --git a/test-projects/03-app-that-uses-make-server/app/router.js b/test-projects/03-app-that-uses-make-server/app/router.js deleted file mode 100644 index d21c8aad9..000000000 --- a/test-projects/03-app-that-uses-make-server/app/router.js +++ /dev/null @@ -1,14 +0,0 @@ -import EmberRouter from '@ember/routing/router'; -import config from './config/environment'; - -const Router = EmberRouter.extend({ - location: config.locationType, - rootURL: config.rootURL -}); - -Router.map(function() { - this.route('module-count'); - this.route('crud-demo'); -}); - -export default Router; diff --git a/test-projects/03-app-that-uses-make-server/app/routes/.gitkeep b/test-projects/03-app-that-uses-make-server/app/routes/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/test-projects/03-app-that-uses-make-server/app/styles/app.css b/test-projects/03-app-that-uses-make-server/app/styles/app.css deleted file mode 100644 index e69de29bb..000000000 diff --git a/test-projects/03-app-that-uses-make-server/app/templates/application.hbs b/test-projects/03-app-that-uses-make-server/app/templates/application.hbs deleted file mode 100644 index 14ccd024c..000000000 --- a/test-projects/03-app-that-uses-make-server/app/templates/application.hbs +++ /dev/null @@ -1,22 +0,0 @@ -

    Welcome to Ember

    - -

    - Environment: - - {{environment}} - -

    - -

    - Mirage modules in project: - - {{mirageModules.length}} - -

    - -

    - Other modules in project: - - {{otherIncludedModules.length}} - -

    diff --git a/test-projects/03-app-that-uses-make-server/app/templates/components/.gitkeep b/test-projects/03-app-that-uses-make-server/app/templates/components/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/test-projects/03-app-that-uses-make-server/config/environment.js b/test-projects/03-app-that-uses-make-server/config/environment.js deleted file mode 100644 index de90a5d26..000000000 --- a/test-projects/03-app-that-uses-make-server/config/environment.js +++ /dev/null @@ -1,58 +0,0 @@ -'use strict'; - -module.exports = function(environment) { - let ENV = { - modulePrefix: 'basic-app', - podModulePrefix: 'basic-app/pods', - environment, - rootURL: '/', - locationType: 'auto', - EmberENV: { - FEATURES: { - // Here you can enable experimental features on an ember canary build - // e.g. 'with-controller': true - }, - EXTEND_PROTOTYPES: { - // Prevent Ember Data from overriding Date.parse. - Date: false - } - }, - - APP: { - // Here you can pass flags/options to your application instance - // when it is created - } - }; - - if (process.env.MIRAGE_ENABLED) { - ENV['ember-cli-mirage'] = { - enabled: true - }; - } - - if (environment === 'development') { - // ENV.APP.LOG_RESOLVER = true; - // ENV.APP.LOG_ACTIVE_GENERATION = true; - // ENV.APP.LOG_TRANSITIONS = true; - // ENV.APP.LOG_TRANSITIONS_INTERNAL = true; - // ENV.APP.LOG_VIEW_LOOKUPS = true; - } - - if (environment === 'test') { - // Testem prefers this... - ENV.locationType = 'none'; - - // keep test console output quieter - ENV.APP.LOG_ACTIVE_GENERATION = false; - ENV.APP.LOG_VIEW_LOOKUPS = false; - - ENV.APP.rootElement = '#ember-testing'; - ENV.APP.autoboot = false; - } - - if (environment === 'production') { - // here you can enable a production-specific feature - } - - return ENV; -}; diff --git a/test-projects/03-app-that-uses-make-server/config/optional-features.json b/test-projects/03-app-that-uses-make-server/config/optional-features.json deleted file mode 100644 index 21f1dc719..000000000 --- a/test-projects/03-app-that-uses-make-server/config/optional-features.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "jquery-integration": true -} diff --git a/test-projects/03-app-that-uses-make-server/config/targets.js b/test-projects/03-app-that-uses-make-server/config/targets.js deleted file mode 100644 index 8ffae3636..000000000 --- a/test-projects/03-app-that-uses-make-server/config/targets.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict'; - -const browsers = [ - 'last 1 Chrome versions', - 'last 1 Firefox versions', - 'last 1 Safari versions' -]; - -const isCI = !!process.env.CI; -const isProduction = process.env.EMBER_ENV === 'production'; - -if (isCI || isProduction) { - browsers.push('ie 11'); -} - -module.exports = { - browsers -}; diff --git a/test-projects/03-app-that-uses-make-server/ember-cli-build.js b/test-projects/03-app-that-uses-make-server/ember-cli-build.js deleted file mode 100644 index 3095129d6..000000000 --- a/test-projects/03-app-that-uses-make-server/ember-cli-build.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict'; - -const EmberApp = require('ember-cli/lib/broccoli/ember-app'); - -module.exports = function(defaults) { - let app = new EmberApp(defaults, { - autoImport: { - exclude: ['qunit'] - } - }); - - // Use `app.import` to add additional libraries to the generated - // output files. - // - // If you need to use different assets in different - // environments, specify an object as the first parameter. That - // object's keys should be the environment name and the values - // should be the asset to use in that environment. - // - // If the library that you are including contains AMD or ES6 - // modules that you would like to import into your application - // please specify an object with the list of modules as keys - // along with the exports of each module as its value. - - return app.toTree(); -}; diff --git a/test-projects/03-app-that-uses-make-server/fastboot-tests/included-files-test.js b/test-projects/03-app-that-uses-make-server/fastboot-tests/included-files-test.js deleted file mode 100644 index 848e1ba83..000000000 --- a/test-projects/03-app-that-uses-make-server/fastboot-tests/included-files-test.js +++ /dev/null @@ -1,85 +0,0 @@ -const FastBoot = require('fastboot'); -const { execFileSync } = require('child_process'); -const { module: qModule, test } = require('qunit'); -const jsdom = require('jsdom'); -const { JSDOM } = jsdom; - -const findTextFromHtml = (html, selector) => { - let document = new JSDOM(html).window.document; - return document.querySelector(selector) - .textContent - .trim(); -}; - -qModule('basic-app | fastboot | included files', function(hooks) { - - test('it includes all modules in development by default', async function(assert) { - execFileSync('node', [ - require.resolve('ember-cli/bin/ember'), - 'build' - ]); - let fastboot = new FastBoot({ - distPath: 'dist', - resilient: false - }); - - let page = await fastboot.visit('/module-count'); - let html = await page.html(); - - assert.equal(findTextFromHtml(html, '[data-test-id="environment"]'), 'development'); - assert.ok(+findTextFromHtml(html, '[data-test-id="mirage-module-count"]') > 1); - assert.ok(+findTextFromHtml(html, '[data-test-id="other-module-count"]') > 1); - }); - - test('it includes all modules in test by default', async function(assert) { - execFileSync('node', [ - require.resolve('ember-cli/bin/ember'), - 'build', - '--environment=test' - ]); - let fastboot = new FastBoot({ - distPath: 'dist', - resilient: false - }); - - let page = await fastboot.visit('/module-count'); - let html = await page.html(); - - assert.equal(findTextFromHtml(html, '[data-test-id="environment"]'), 'test'); - assert.ok(+findTextFromHtml(html, '[data-test-id="mirage-module-count"]') > 1); - assert.ok(+findTextFromHtml(html, '[data-test-id="other-module-count"]') > 1); - }); - - test('it only includes an initializer in production by default', async function(assert) { - execFileSync('node', [require.resolve('ember-cli/bin/ember'), 'build', '-prod']); - let fastboot = new FastBoot({ - distPath: 'dist', - resilient: false - }); - let page = await fastboot.visit('/module-count'); - let html = await page.html(); - - assert.equal(findTextFromHtml(html, '[data-test-id="environment"]'), 'production'); - assert.equal(findTextFromHtml(html, '[data-test-id="mirage-module-count"]'), '0'); - assert.equal(findTextFromHtml(html, '[data-test-id="other-module-count"]'), '1'); - }); - - test('all files can be included in production by explicitly setting enabled to true', async function(assert) { - process.env.MIRAGE_ENABLED = 'true'; - execFileSync('node', [ - require.resolve('ember-cli/bin/ember'), - 'build', - '-prod' - ]); - let fastboot = new FastBoot({ - distPath: 'dist', - resilient: false - }); - let page = await fastboot.visit('/module-count'); - let html = await page.html(); - - assert.equal(findTextFromHtml(html, '[data-test-id="environment"]'), 'production'); - assert.ok(+findTextFromHtml(html, '[data-test-id="mirage-module-count"]') > 1); - assert.ok(+findTextFromHtml(html, '[data-test-id="other-module-count"]') > 1); - }); -}); diff --git a/test-projects/03-app-that-uses-make-server/mirage/config.js b/test-projects/03-app-that-uses-make-server/mirage/config.js deleted file mode 100644 index fce92cd97..000000000 --- a/test-projects/03-app-that-uses-make-server/mirage/config.js +++ /dev/null @@ -1,14 +0,0 @@ -import { createServer, discoverEmberDataModels } from 'ember-cli-mirage'; - -export function makeServer(config) { - let finalConfig = { - ...config, - models: { ...discoverEmberDataModels(), ...config.models }, - }; - - return createServer(finalConfig) -} - -export default function() { - this.resource('user'); -} diff --git a/test-projects/03-app-that-uses-make-server/mirage/factories/nested/thing.js b/test-projects/03-app-that-uses-make-server/mirage/factories/nested/thing.js deleted file mode 100644 index a49b783d3..000000000 --- a/test-projects/03-app-that-uses-make-server/mirage/factories/nested/thing.js +++ /dev/null @@ -1,5 +0,0 @@ -import { Factory } from 'ember-cli-mirage'; - -export default Factory.extend({ - name: 'nested factory works!' -}); diff --git a/test-projects/03-app-that-uses-make-server/mirage/factories/user.js b/test-projects/03-app-that-uses-make-server/mirage/factories/user.js deleted file mode 100644 index 6a59ee9d2..000000000 --- a/test-projects/03-app-that-uses-make-server/mirage/factories/user.js +++ /dev/null @@ -1,10 +0,0 @@ -import { Factory } from 'ember-cli-mirage'; -import faker from 'faker'; - -export default Factory.extend({ - - age() { - return faker.random.number({ min: 32, max: 32 }); - } - -}); diff --git a/test-projects/03-app-that-uses-make-server/mirage/fixtures/countries.js b/test-projects/03-app-that-uses-make-server/mirage/fixtures/countries.js deleted file mode 100644 index f9b995d1a..000000000 --- a/test-projects/03-app-that-uses-make-server/mirage/fixtures/countries.js +++ /dev/null @@ -1,3 +0,0 @@ -export default [ - { name: 'United State' } -]; diff --git a/test-projects/03-app-that-uses-make-server/mirage/fixtures/nested/things.js b/test-projects/03-app-that-uses-make-server/mirage/fixtures/nested/things.js deleted file mode 100644 index 5c0aee901..000000000 --- a/test-projects/03-app-that-uses-make-server/mirage/fixtures/nested/things.js +++ /dev/null @@ -1,3 +0,0 @@ -export default [ - { fixtureField: 'nested fixture works!' } -]; diff --git a/test-projects/03-app-that-uses-make-server/mirage/fixtures/users.js b/test-projects/03-app-that-uses-make-server/mirage/fixtures/users.js deleted file mode 100644 index 0148a57fa..000000000 --- a/test-projects/03-app-that-uses-make-server/mirage/fixtures/users.js +++ /dev/null @@ -1,5 +0,0 @@ -export default [ - - { id: 1, name: 'Sam' } - -]; diff --git a/test-projects/03-app-that-uses-make-server/mirage/identity-managers/book.js b/test-projects/03-app-that-uses-make-server/mirage/identity-managers/book.js deleted file mode 100644 index 76f1564ad..000000000 --- a/test-projects/03-app-that-uses-make-server/mirage/identity-managers/book.js +++ /dev/null @@ -1,57 +0,0 @@ -export default class { - constructor() { - this.reset(); - } - - /** - * Returns an unique identifier. - * - * @method fetch - * @return {String} Unique identifier - * @public - */ - fetch() { - let alphabet = 'abcdefghijklmnopqrstuvwxyz'; - let id; - - if (this._nextId >= alphabet.length) { - throw new Error(`IdentityManager used for testing only supports ${alphabet.length} ids.`); - } - id = alphabet[this._nextId % alphabet.length]; - this._ids[id] = true; - this._nextId = this._nextid + 1; - return id; - } - - /** - * Register an identifier. - * Must throw if identifier is already used. - * - * @method set - * @param {String|Number} id - * @public - */ - set(id) { - if (typeof this._ids[id] !== 'undefined') { - throw new Error(`Id {id} is already used.`); - } - - this._ids[id] = true; - - let int = parseInt(id, 16); - if (!isNaN(int) && int > this._nextid) { - this._nextId = int; - } - } - - /** - * Reset identity manager. - * - * @method reset - * @public - */ - reset() { - this._nextId = 0; - this._ids = {}; - } -} diff --git a/test-projects/03-app-that-uses-make-server/mirage/identity-managers/nested/thing.js b/test-projects/03-app-that-uses-make-server/mirage/identity-managers/nested/thing.js deleted file mode 100644 index 52271b76d..000000000 --- a/test-projects/03-app-that-uses-make-server/mirage/identity-managers/nested/thing.js +++ /dev/null @@ -1,56 +0,0 @@ -export default class { - constructor() { - this.reset(); - } - - /** - * Returns an unique identifier. - * - * @method fetch - * @return {String} Unique identifier - * @public - */ - fetch() { - let id; - - if (this._nextId >= 1) { - throw new Error(`IdentityManager used for testing only supports single id.`); - } - id = 'nested identity manager works!'; - this._ids[id] = true; - this._nextId = this._nextid + 1; - return id; - } - - /** - * Register an identifier. - * Must throw if identifier is already used. - * - * @method set - * @param {String|Number} id - * @public - */ - set(id) { - if (typeof this._ids[id] !== 'undefined') { - throw new Error(`Id {id} is already used.`); - } - - this._ids[id] = true; - - let int = parseInt(id, 16); - if (!isNaN(int) && int > this._nextid) { - this._nextId = int; - } - } - - /** - * Reset identity manager. - * - * @method reset - * @public - */ - reset() { - this._nextId = 0; - this._ids = {}; - } -} diff --git a/test-projects/03-app-that-uses-make-server/mirage/models/nested/thing.js b/test-projects/03-app-that-uses-make-server/mirage/models/nested/thing.js deleted file mode 100644 index 1486a7240..000000000 --- a/test-projects/03-app-that-uses-make-server/mirage/models/nested/thing.js +++ /dev/null @@ -1,4 +0,0 @@ -import { Model } from 'ember-cli-mirage'; - -export default Model.extend({ -}); diff --git a/test-projects/03-app-that-uses-make-server/mirage/scenarios/default.js b/test-projects/03-app-that-uses-make-server/mirage/scenarios/default.js deleted file mode 100644 index 0cd90b408..000000000 --- a/test-projects/03-app-that-uses-make-server/mirage/scenarios/default.js +++ /dev/null @@ -1,7 +0,0 @@ -export default function(server) { - - server.create('user', { name: 'Yehuda' }); - server.create('user', { name: 'Tom' }); - server.create('user', { name: 'Leah' }); - -} diff --git a/test-projects/03-app-that-uses-make-server/mirage/serializers/application.js b/test-projects/03-app-that-uses-make-server/mirage/serializers/application.js deleted file mode 100644 index 9ebd0e296..000000000 --- a/test-projects/03-app-that-uses-make-server/mirage/serializers/application.js +++ /dev/null @@ -1,3 +0,0 @@ -import { JSONAPISerializer } from 'ember-cli-mirage'; - -export default JSONAPISerializer; diff --git a/test-projects/03-app-that-uses-make-server/mirage/serializers/nested/thing.js b/test-projects/03-app-that-uses-make-server/mirage/serializers/nested/thing.js deleted file mode 100644 index 66d972c4d..000000000 --- a/test-projects/03-app-that-uses-make-server/mirage/serializers/nested/thing.js +++ /dev/null @@ -1,9 +0,0 @@ -import ApplicationSerizlizer from '../application'; - -export default ApplicationSerizlizer.extend({ - keyForAttribute(attr) { - const key = ApplicationSerizlizer.prototype.keyForAttribute.call(this, attr); - - return `nested_thing_${key}`; - } -}); diff --git a/test-projects/03-app-that-uses-make-server/package.json b/test-projects/03-app-that-uses-make-server/package.json deleted file mode 100644 index 55ca96035..000000000 --- a/test-projects/03-app-that-uses-make-server/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "basic-app", - "version": "0.0.0", - "private": true, - "description": "Small description for basic-app goes here", - "license": "MIT", - "author": "", - "directories": { - "doc": "doc", - "test": "tests" - }, - "repository": "", - "scripts": { - "build": "ember build", - "lint:js": "eslint ./*.js app config mirage tests", - "start": "ember serve", - "test": "ember test --test-port=0", - "test:fastboot": "qunit fastboot-tests/**/*.js" - }, - "devDependencies": { - "@ember/jquery": "*", - "broccoli-asset-rev": "*", - "ember-ajax": "*", - "ember-auto-import": "*", - "ember-cli": "*", - "ember-cli-babel": "*", - "ember-cli-dependency-checker": "*", - "ember-cli-eslint": "*", - "ember-cli-fastboot": "*", - "ember-cli-htmlbars": "*", - "ember-cli-inject-live-reload": "*", - "ember-cli-mirage": "*", - "ember-cli-qunit": "*", - "ember-cli-sri": "*", - "ember-cli-uglify": "*", - "ember-data": "*", - "ember-export-application-global": "*", - "ember-load-initializers": "*", - "ember-maybe-import-regenerator-for-testing": "*", - "ember-resolver": "*", - "ember-source": "*", - "eslint-plugin-ember": "*", - "faker": "*", - "fastboot": "*", - "jsdom": "*", - "loader.js": "*", - "qunit": "*", - "qunit-dom": "*" - }, - "engines": { - "node": ">= 8.*" - } -} diff --git a/test-projects/03-app-that-uses-make-server/public/robots.txt b/test-projects/03-app-that-uses-make-server/public/robots.txt deleted file mode 100644 index f5916452e..000000000 --- a/test-projects/03-app-that-uses-make-server/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# http://www.robotstxt.org -User-agent: * -Disallow: diff --git a/test-projects/03-app-that-uses-make-server/testem.js b/test-projects/03-app-that-uses-make-server/testem.js deleted file mode 100644 index d1755a4ea..000000000 --- a/test-projects/03-app-that-uses-make-server/testem.js +++ /dev/null @@ -1,24 +0,0 @@ -module.exports = { - test_page: 'tests/index.html?hidepassed', - disable_watching: true, - launch_in_ci: [ - 'Chrome' - ], - launch_in_dev: [ - 'Chrome' - ], - browser_args: { - Chrome: { - mode: 'ci', - args: [ - // --no-sandbox is needed when running Chrome inside a container - process.env.TRAVIS ? '--no-sandbox' : null, - - '--disable-gpu', - '--headless', - '--remote-debugging-port=0', - '--window-size=1440,900' - ].filter(Boolean) - } - } -}; diff --git a/test-projects/03-app-that-uses-make-server/tests/acceptance/crud-demo-test.js b/test-projects/03-app-that-uses-make-server/tests/acceptance/crud-demo-test.js deleted file mode 100644 index 6d588e094..000000000 --- a/test-projects/03-app-that-uses-make-server/tests/acceptance/crud-demo-test.js +++ /dev/null @@ -1,67 +0,0 @@ -import { test } from 'qunit'; -import moduleForAcceptance from 'basic-app/tests/helpers/module-for-acceptance'; - -moduleForAcceptance('Acceptance | Crud demo'); - -test('I can view the users', function(assert) { - server.createList('user', 3); - - visit('/crud-demo'); - - andThen(function() { - assert.equal(find('[data-test-id="user"]').length, 3); - }); -}); - -test('I can create a new user', function(assert) { - server.create('user', 1); - - visit('/crud-demo'); - fillIn('input', 'Ganon'); - click('button:contains(Create)'); - - andThen(function() { - assert.equal(find('[data-test-id="user"]').length, 2); - assert.ok(server.db.users.length, 2); - }); -}); - -test('I can update a user', function(assert) { - let user = server.create('user', { name: 'Yehuda' }); - - visit('/crud-demo'); - fillIn('[data-test-id="user"] input', 'Katz'); - click('button:contains(Save)'); - - andThen(function() { - user.reload(); - - assert.equal(find('[data-test-id="user"] input').val(), 'Katz'); - assert.ok(user.name, 'Katz'); - }); -}); - -test('I can delete a user', function(assert) { - server.create('user', { name: 'Yehuda' }); - - visit('/crud-demo'); - click('button:contains(Delete)'); - - andThen(function() { - assert.equal(find('[data-test-id="user"]').length, 0); - assert.equal(server.db.users.length, 0); - }); -}); - -test('If the server errors on GET /users, the error template shows', function(assert) { - server.get('/users', { - errors: [ 'improper auth' ] - }, 404); - - visit('/crud-demo'); - - andThen(function() { - assert.ok(find(':contains(improper auth)').length); - assert.equal(currentRouteName(), 'crud-demo_error'); - }); -}); diff --git a/test-projects/03-app-that-uses-make-server/tests/acceptance/ember-data-test.js b/test-projects/03-app-that-uses-make-server/tests/acceptance/ember-data-test.js deleted file mode 100644 index c70fb0482..000000000 --- a/test-projects/03-app-that-uses-make-server/tests/acceptance/ember-data-test.js +++ /dev/null @@ -1,72 +0,0 @@ -import { module, test } from 'qunit'; -import Server from 'ember-cli-mirage/server'; -import { Model } from 'ember-cli-mirage'; -import { modelFor } from 'ember-cli-mirage/ember-data'; - -const CustomTag = Model.extend(); -CustomTag.__isCustom__ = true; - -module('Acceptance | Ember Data', function(hooks) { - hooks.beforeEach(function() { - this.server = new Server({ - environment: 'development', - discoverEmberDataModels: true, - scenarios: { - default() {} - }, - models: { - // Friend exists in dummy/app/models. We want to make sure pre-defined - // models take precedence - tag: CustomTag, - foo: Model.extend() - }, - factories: {} - }); - }); - - hooks.afterEach(function() { - this.server.shutdown(); - }); - - test(`Ember data models were generated and loaded`, function(assert) { - let { schema } = this.server; - let registry = schema._registry; - - assert.ok(registry.foo, 'Mirage model Foo has been registered'); - assert.ok(registry.book, 'EmberData model Book has been registered'); - assert.ok(registry.user, 'EmberData model User has been registered'); - assert.equal(registry.user.foreignKeys.length, 1, 'EmberData model User has the correct relationships'); - assert.equal(registry.book.foreignKeys.length, 1, 'EmberData model User has the correct relationships'); - assert.equal(registry.user.foreignKeys[0], 'bookIds', 'EmberData model User has the correct relationships'); - assert.equal(registry.book.foreignKeys[0], 'userId', 'EmberData model Book has the correct relationships'); - }); - - test(`It works with nested models`, function(assert) { - let { schema } = this.server; - let registry = schema._registry; - - assert.ok(registry['things/watch'], 'Model things/watch has been registered'); - }); - - test(`Defined Mirage models take precedence over autogenerated ones`, function(assert) { - let { schema } = this.server; - let registry = schema._registry; - - assert.ok(registry.tag, 'Model Tag has been registered'); - assert.ok(registry.tag.class.__isCustom__, 'Model Tag is not the autogenerated one'); - }); - - test(`Auto generated models can be extended via modelFor`, function(assert) { - let { schema } = this.server; - let registry = schema._registry; - - assert.ok(registry.book, 'Ember data model Book has been registered'); - assert.ok(modelFor('book'), 'Ember data model Book is found'); - assert.equal(typeof modelFor('book').extend, 'function', 'Ember data model Book can be extended'); - }); - - test(`modelFor is only for auto generated models`, function(assert) { - assert.notOk(modelFor('tag').__isCustom__, 'Tag model is not the pre defined one'); - assert.throws(() => modelFor('foo'), /Model of type 'foo' does not exist/, 'Pre defined mirage models cannot be found via modelFor'); - }); -}); diff --git a/test-projects/03-app-that-uses-make-server/tests/acceptance/faker-test.js b/test-projects/03-app-that-uses-make-server/tests/acceptance/faker-test.js deleted file mode 100644 index 485301a13..000000000 --- a/test-projects/03-app-that-uses-make-server/tests/acceptance/faker-test.js +++ /dev/null @@ -1,15 +0,0 @@ -import { module, test } from 'qunit'; -import { setupTest } from 'ember-qunit'; -import { setupMirage } from 'ember-cli-mirage/test-support'; - -module('Acceptance | Faker', function(hooks) { - setupTest(hooks); - setupMirage(hooks); - - test('it works', function(assert) { - let user = this.server.create('user'); - - assert.equal(user.age, 32); - }); - -}); diff --git a/test-projects/03-app-that-uses-make-server/tests/acceptance/fixtures-test.js b/test-projects/03-app-that-uses-make-server/tests/acceptance/fixtures-test.js deleted file mode 100644 index 5cb5a111b..000000000 --- a/test-projects/03-app-that-uses-make-server/tests/acceptance/fixtures-test.js +++ /dev/null @@ -1,20 +0,0 @@ -import moduleForAcceptance from '../helpers/module-for-acceptance'; -import { test } from 'qunit'; - -moduleForAcceptance('Acceptance | Fixtures'); - -test('I can use fixtures', async function(assert) { - server.loadFixtures(); - - await visit('/crud-demo'); - - assert.equal(find('[data-test-id="user"]').length, 1); -}); - -test('I can use fixtures with the filename api', async function(assert) { - server.loadFixtures('countries'); - - await visit('/crud-demo'); - - assert.equal(find('[data-test-id="user"]').length, 0); -}); diff --git a/test-projects/03-app-that-uses-make-server/tests/acceptance/identity-manager-test.js b/test-projects/03-app-that-uses-make-server/tests/acceptance/identity-manager-test.js deleted file mode 100644 index f05004f59..000000000 --- a/test-projects/03-app-that-uses-make-server/tests/acceptance/identity-manager-test.js +++ /dev/null @@ -1,10 +0,0 @@ -import { test } from 'qunit'; -import moduleForAcceptance from '../../tests/helpers/module-for-acceptance'; - -moduleForAcceptance('Acceptance | Identity manager'); - -test('custom identity managers work', function(assert) { - let book = server.create('book'); - - assert.equal(book.id, 'a'); -}); diff --git a/test-projects/03-app-that-uses-make-server/tests/acceptance/legacy-start-mirage-test.js b/test-projects/03-app-that-uses-make-server/tests/acceptance/legacy-start-mirage-test.js deleted file mode 100644 index 5f6152c16..000000000 --- a/test-projects/03-app-that-uses-make-server/tests/acceptance/legacy-start-mirage-test.js +++ /dev/null @@ -1,59 +0,0 @@ -import {module, test} from 'qunit'; -import startApp from '../helpers/start-app'; -import destroyApp from '../helpers/destroy-app'; -import { startMirage } from 'basic-app/initializers/ember-cli-mirage'; -import ENV from 'basic-app/config/environment'; - -module('Acceptance | Starting mirage (legacy)', function(hooks) { - let app, oldEnv, addonConfig; - - hooks.beforeEach(function() { - oldEnv = ENV['ember-cli-mirage']; - ENV['ember-cli-mirage'] = addonConfig = {}; - }); - - hooks.afterEach(function() { - destroyApp(app); - ENV['ember-cli-mirage'] = oldEnv; - }); - - test('The server starts automatically when configured with enabled undefined', async function(assert) { - app = startApp(); - - assert.ok(window.server, 'There is a server after starting'); - - window.server.create('user'); - await window.visit('/crud-demo'); - - assert.equal(window.currentRouteName(), 'crud-demo'); - assert.dom('[data-test-id="user"]').exists(); - }); - - test('The server starts automatically when configured with { enabled: true }', async function(assert) { - addonConfig.enabled = true; - app = startApp(); - - assert.ok(window.server, 'There is a server after starting'); - - window.server.create('user'); - await window.visit('/crud-demo'); - - assert.equal(window.currentRouteName(), 'crud-demo'); - assert.dom('[data-test-id="user"]').exists(); - }); - - test('The server can be started manually when configured with { enabled: false }', async function(assert) { - addonConfig.enabled = false; - app = startApp(); - - assert.equal(window.server, undefined, 'There is no server at first'); - startMirage(); - assert.ok(window.server, 'There is a server after starting'); - - window.server.create('user'); - await window.visit('/crud-demo'); - - assert.equal(window.currentRouteName(), 'crud-demo'); - assert.dom('[data-test-id="user"]').exists(); - }); -}); diff --git a/test-projects/03-app-that-uses-make-server/tests/acceptance/request-tracking-test.js b/test-projects/03-app-that-uses-make-server/tests/acceptance/request-tracking-test.js deleted file mode 100644 index d245eaf7d..000000000 --- a/test-projects/03-app-that-uses-make-server/tests/acceptance/request-tracking-test.js +++ /dev/null @@ -1,51 +0,0 @@ -import { run } from '@ember/runloop'; -import {module, test} from 'qunit'; -import startApp from '../helpers/start-app'; -import ENV from 'basic-app/config/environment'; -import promiseAjax from '../helpers/promise-ajax'; - -let App; - -module('Acceptance | Enabling request tracking', { - afterEach() { - server.shutdown(); - run(App, 'destroy'); - ENV['ember-cli-mirage'].enabled = undefined; - } -}); - -test('Request tracking defaults to false', async function(assert) { - App = startApp(); - - await promiseAjax({ - method: 'GET', - url: '/users' - }); - - assert.equal(server.pretender.handledRequests.length, 0, 'request tracking should be false by default'); -}); - -test('Request tracking treats undefined config as false', async function(assert) { - ENV['ember-cli-mirage'] = { trackRequests: undefined }; - App = startApp(); - - await promiseAjax({ - method: 'GET', - url: '/users' - }); - - assert.equal(server.pretender.handledRequests.length, 0, 'request tracking should be false when undefined in config'); -}); - -test('Request tracking can be set to true in config', async function(assert) { - ENV['ember-cli-mirage'] = { trackRequests: true }; - App = startApp(); - - await promiseAjax({ - method: 'GET', - url: '/users' - }); - - assert.equal(server.pretender.handledRequests.length, 1, 'request tracking can be turned on in config and track requests'); - assert.equal(server.pretender.handledRequests[0].method, 'GET', 'tracked request method should match the requests method'); -}); diff --git a/test-projects/03-app-that-uses-make-server/tests/acceptance/start-mirage-test.js b/test-projects/03-app-that-uses-make-server/tests/acceptance/start-mirage-test.js deleted file mode 100644 index 3e77740fd..000000000 --- a/test-projects/03-app-that-uses-make-server/tests/acceptance/start-mirage-test.js +++ /dev/null @@ -1,124 +0,0 @@ -import Ember from 'ember'; -import {module as qunitModule, test} from 'qunit'; -import {setupTest} from 'ember-qunit'; -import {visit, currentRouteName} from '@ember/test-helpers'; -import startMirage from 'ember-cli-mirage/start-mirage'; -import { setupMirage } from 'ember-cli-mirage/test-support'; -import ENV from 'basic-app/config/environment'; -import NestedThingModel from 'basic-app/mirage/models/nested/thing'; - -let module; -if (Ember.VERSION === '1.13.13') { - module = () => null; -} else { - module = qunitModule; -} - -module('Acceptance | Starting mirage', function(hooks) { - let oldEnv, addonConfig, dynamicAfterEach; - - hooks.beforeEach(function() { - oldEnv = ENV['ember-cli-mirage']; - ENV['ember-cli-mirage'] = addonConfig = {}; - // When running in non-legacy mode we shoud ignore this, so we set it so we - // can make sure that tests that it doesn't cause the server to start when - // it shouldn't in the cases that test that - addonConfig.enabled = true; - - dynamicAfterEach = () => undefined; - }); - - hooks.afterEach(function() { - dynamicAfterEach(); - }); - - hooks.afterEach(function() { - ENV['ember-cli-mirage'] = oldEnv; - }); - - module('without autostart', function(hooks) { - setupTest(hooks); - - test('it does not autostart but can be started manually', async function(assert) { - assert.equal(window.server, undefined, 'There is no global server at first'); - let server = startMirage(this.owner); - assert.ok(server, 'There is a server after starting'); - assert.ok(window.server, 'There is a global server after starting'); - dynamicAfterEach = () => server.shutdown(); - - server.create('user'); - await visit('/crud-demo'); - - assert.equal(currentRouteName(), 'crud-demo'); - assert.dom('[data-test-id="user"]').exists(); - }); - - module('nested mirage modules', function() { - test('it works', async function(assert) { - const server = startMirage(this.owner); - const model = server.create('nested/thing'); - - assert.ok(model instanceof NestedThingModel, 'models'); - assert.equal(model.id, 'nested identity manager works!', 'identity managers'); - assert.equal(model.name, 'nested factory works!', 'factories'); - - const { attributes } = server.serializerOrRegistry.serialize(model).data; - assert.ok('nested_thing_name' in attributes, 'serializer'); - }); - - // factories and fixtures have to be tested separately - test('fixtures support', async function(assert) { - const server = startMirage(this.owner); - - server.loadFixtures('nested/things'); - const model = server.schema.first('nested/thing'); - - assert.ok(model instanceof NestedThingModel, 'models'); - assert.equal(model.id, 'nested identity manager works!', 'identity managers'); - assert.equal(model.fixtureField, 'nested fixture works!', 'fixtures'); - }); - }) - - module('setupMirage()', function(hooks) { - setupMirage(hooks); - - test('it works', async function(assert) { - assert.ok(this.server, 'There is a server'); - assert.ok(window.server, 'There is a global server'); - dynamicAfterEach = () => { - assert.notOk(this.server, 'The server was shut down'); - assert.notOk(window.server, 'The global server is gone'); - }; - - server.create('user'); - await visit('/crud-demo'); - - assert.equal(currentRouteName(), 'crud-demo'); - assert.dom('[data-test-id="user"]').exists(); - }); - }); - }); - - module('with autostart', function(hooks) { - hooks.beforeEach(function() { - addonConfig.autostart = true; - }); - - setupTest(hooks); - - test('it autostarts', async function(assert) { - assert.ok(this.server, 'There is a server'); - assert.ok(window.server, 'There is a global server'); - dynamicAfterEach = () => { - assert.notOk(this.server, 'The server was shut down'); - assert.notOk(window.server, 'The global server is gone'); - }; - - server.create('user'); - await visit('/crud-demo'); - - assert.equal(currentRouteName(), 'crud-demo'); - assert.dom('[data-test-id="user"]').exists(); - }); - }); -}); diff --git a/test-projects/03-app-that-uses-make-server/tests/helpers/destroy-app.js b/test-projects/03-app-that-uses-make-server/tests/helpers/destroy-app.js deleted file mode 100644 index f8d24fc36..000000000 --- a/test-projects/03-app-that-uses-make-server/tests/helpers/destroy-app.js +++ /dev/null @@ -1,9 +0,0 @@ -import { run } from '@ember/runloop'; - -export default function destroyApp(application) { - run(function() { - application.destroy(); - - server.shutdown(); - }); -} diff --git a/test-projects/03-app-that-uses-make-server/tests/helpers/module-for-acceptance.js b/test-projects/03-app-that-uses-make-server/tests/helpers/module-for-acceptance.js deleted file mode 100644 index 90a93bac2..000000000 --- a/test-projects/03-app-that-uses-make-server/tests/helpers/module-for-acceptance.js +++ /dev/null @@ -1,21 +0,0 @@ -import { module } from 'qunit'; -import { resolve } from 'rsvp'; -import startApp from '../helpers/start-app'; -import destroyApp from '../helpers/destroy-app'; - -export default function(name, options = {}) { - module(name, { - beforeEach() { - this.application = startApp(); - - if (options.beforeEach) { - return options.beforeEach.apply(this, arguments); - } - }, - - afterEach() { - let afterEach = options.afterEach && options.afterEach.apply(this, arguments); - return resolve(afterEach).then(() => destroyApp(this.application)); - } - }); -} diff --git a/test-projects/03-app-that-uses-make-server/tests/helpers/promise-ajax.js b/test-projects/03-app-that-uses-make-server/tests/helpers/promise-ajax.js deleted file mode 100644 index 38a09df02..000000000 --- a/test-projects/03-app-that-uses-make-server/tests/helpers/promise-ajax.js +++ /dev/null @@ -1,10 +0,0 @@ -import { Promise } from 'rsvp'; -import $ from 'jquery'; - -export default (options) => { - return new Promise((resolve, reject) => { - $.ajax(options) - .done((data, status, xhr) => resolve({data, status, xhr})) - .fail((xhr, status, error) => reject({xhr, status, error})); - }); -}; diff --git a/test-projects/03-app-that-uses-make-server/tests/helpers/resolver.js b/test-projects/03-app-that-uses-make-server/tests/helpers/resolver.js deleted file mode 100644 index b208d38d0..000000000 --- a/test-projects/03-app-that-uses-make-server/tests/helpers/resolver.js +++ /dev/null @@ -1,11 +0,0 @@ -import Resolver from '../../resolver'; -import config from '../../config/environment'; - -const resolver = Resolver.create(); - -resolver.namespace = { - modulePrefix: config.modulePrefix, - podModulePrefix: config.podModulePrefix -}; - -export default resolver; diff --git a/test-projects/03-app-that-uses-make-server/tests/helpers/start-app.js b/test-projects/03-app-that-uses-make-server/tests/helpers/start-app.js deleted file mode 100644 index 99d35dcf4..000000000 --- a/test-projects/03-app-that-uses-make-server/tests/helpers/start-app.js +++ /dev/null @@ -1,17 +0,0 @@ -import Application from '../../app'; -import config from '../../config/environment'; -import { merge } from '@ember/polyfills'; -import { run } from '@ember/runloop'; - -export default function startApp(attrs) { - let attributes = merge({}, config.APP); - attributes.autoboot = true; - attributes = merge(attributes, attrs); // use defaults, but you can override; - - return run(() => { - let application = Application.create(attributes); - application.setupForTesting(); - application.injectTestHelpers(); - return application; - }); -} diff --git a/test-projects/03-app-that-uses-make-server/tests/index.html b/test-projects/03-app-that-uses-make-server/tests/index.html deleted file mode 100644 index 008e6d610..000000000 --- a/test-projects/03-app-that-uses-make-server/tests/index.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - BasicApp Tests - - - - {{content-for "head"}} - {{content-for "test-head"}} - - - - - - {{content-for "head-footer"}} - {{content-for "test-head-footer"}} - - - {{content-for "body"}} - {{content-for "test-body"}} - - - - - - - - {{content-for "body-footer"}} - {{content-for "test-body-footer"}} - - diff --git a/test-projects/03-app-that-uses-make-server/tests/test-helper.js b/test-projects/03-app-that-uses-make-server/tests/test-helper.js deleted file mode 100644 index 0382a848d..000000000 --- a/test-projects/03-app-that-uses-make-server/tests/test-helper.js +++ /dev/null @@ -1,8 +0,0 @@ -import Application from '../app'; -import config from '../config/environment'; -import { setApplication } from '@ember/test-helpers'; -import { start } from 'ember-qunit'; - -setApplication(Application.create(config.APP)); - -start(); diff --git a/test-projects/03-app-that-uses-make-server/vendor/.gitkeep b/test-projects/03-app-that-uses-make-server/vendor/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/tests/unit/serializers/ember-data-serializer-discover-test.js b/tests/unit/serializers/ember-data-serializer-discover-test.js index 179f96d25..2efb0b98a 100644 --- a/tests/unit/serializers/ember-data-serializer-discover-test.js +++ b/tests/unit/serializers/ember-data-serializer-discover-test.js @@ -1,6 +1,6 @@ import { module, test } from 'qunit'; import { setupTest } from 'ember-qunit'; -import Server from 'ember-cli-mirage/server'; +import {createServer, applyEmberDataSerializers} from 'ember-cli-mirage'; module('Unit | Serializer | ember data serializer discover', function(hooks) { setupTest(hooks); @@ -8,10 +8,8 @@ module('Unit | Serializer | ember data serializer discover', function(hooks) { let server; hooks.beforeEach(function() { - server = new Server({ - environment: "test", - discoverEmberDataModels: true, - discoverEmberDataSerializers: true + server = createServer({ + serializers: applyEmberDataSerializers({}) }); }); From dc21f221003f0e70426ca067e16d4520e5b478b8 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 18 Aug 2020 06:53:10 +0000 Subject: [PATCH 704/879] build(deps): [security] bump dot-prop from 4.2.0 to 4.2.1 Bumps [dot-prop](https://github.com/sindresorhus/dot-prop) from 4.2.0 to 4.2.1. **This update includes a security fix.** - [Release notes](https://github.com/sindresorhus/dot-prop/releases) - [Commits](https://github.com/sindresorhus/dot-prop/commits) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 23f476e24..b7facb228 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5878,9 +5878,9 @@ dot-case@^3.0.3: tslib "^1.10.0" dot-prop@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" - integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== + version "4.2.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4" + integrity sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ== dependencies: is-obj "^1.0.0" From e73162349742cf1c71cf3aa5910d15248cde260b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 19 Aug 2020 07:02:20 +0000 Subject: [PATCH 705/879] build(deps-dev): bump eslint-plugin-ember from 8.11.0 to 8.12.0 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 8.11.0 to 8.12.0. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v8.11.0...v8.12.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index b7facb228..f646ab72e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7388,9 +7388,9 @@ esdoc@pzuraq/esdoc#015a342: taffydb "2.7.2" eslint-plugin-ember@^8.1.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.11.0.tgz#40f7c76047047100fed12af5e56a775cab29ae32" - integrity sha512-9VeqrVBbQ5HsxyvKFJORGfkyzJt0bCdUgIdVeHkYN1+31+3SVpGHB8N1zQYLlTh7JkYn/UYxhfUtBN3p4joGJg== + version "8.12.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.12.0.tgz#7e4b50bc6aa457cda58b09809b1545350650af16" + integrity sha512-o2mtq8Tz1Rwdab8f+YlGXtSdH5wpPRJeGC/MeBGGSZK9O/TmpOYbbj1sklUHphtthz6yStU3EhxubZ2M3PoMIw== dependencies: "@ember-data/rfc395-data" "^0.0.4" ember-rfc176-data "^0.3.15" From ebc4b4eae2b0907b6f2e3b69be7f660dd332790a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 5 Sep 2020 15:37:14 +0000 Subject: [PATCH 706/879] build(deps): [security] bump http-proxy from 1.18.0 to 1.18.1 Bumps [http-proxy](https://github.com/http-party/node-http-proxy) from 1.18.0 to 1.18.1. **This update includes a security fix.** - [Release notes](https://github.com/http-party/node-http-proxy/releases) - [Changelog](https://github.com/http-party/node-http-proxy/blob/master/CHANGELOG.md) - [Commits](https://github.com/http-party/node-http-proxy/compare/1.18.0...1.18.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/yarn.lock b/yarn.lock index f646ab72e..4f6f8a685 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5593,7 +5593,7 @@ debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.3. dependencies: ms "2.0.0" -debug@^3.0.0, debug@^3.0.1, debug@^3.1.0, debug@^3.1.1: +debug@^3.0.1, debug@^3.1.0, debug@^3.1.1: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -7550,9 +7550,9 @@ etag@~1.8.1: integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= eventemitter3@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" - integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== events-to-array@^1.0.1: version "1.1.2" @@ -8163,11 +8163,9 @@ flush-write-stream@^1.0.0: readable-stream "^2.3.6" follow-redirects@^1.0.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.10.0.tgz#01f5263aee921c6a54fb91667f08f4155ce169eb" - integrity sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ== - dependencies: - debug "^3.0.0" + version "1.13.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" + integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== for-in@^1.0.2: version "1.0.2" @@ -8995,9 +8993,9 @@ http-errors@~1.7.2: integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= http-proxy@^1.13.1, http-proxy@^1.17.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" - integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== dependencies: eventemitter3 "^4.0.0" follow-redirects "^1.0.0" From d651bd9cd599160b63b19f2c8dff4a1a86510315 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 11 Sep 2020 14:21:27 +0000 Subject: [PATCH 707/879] build(deps): [security] bump node-fetch from 2.6.0 to 2.6.1 Bumps [node-fetch](https://github.com/bitinn/node-fetch) from 2.6.0 to 2.6.1. **This update includes a security fix.** - [Release notes](https://github.com/bitinn/node-fetch/releases) - [Changelog](https://github.com/node-fetch/node-fetch/blob/master/docs/CHANGELOG.md) - [Commits](https://github.com/bitinn/node-fetch/compare/v2.6.0...v2.6.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4f6f8a685..3ce8a5557 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11105,9 +11105,9 @@ node-emoji@^1.8.1: lodash.toarray "^4.4.0" node-fetch@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" - integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== node-int64@^0.4.0: version "0.4.0" From df75233ee3c6c20ff71dc9243a94a507364de95e Mon Sep 17 00:00:00 2001 From: Brian Gantzler Date: Wed, 23 Sep 2020 13:57:34 -0400 Subject: [PATCH 708/879] Updated qunit. Removed deprecations and warning from tests to make them easier to read --- package.json | 2 +- .../app/serializers/application.js | 4 + test-projects/01-basic-app/package.json | 2 +- .../tests/acceptance/start-mirage-test.js | 2 + .../01-basic-app/tests/helpers/start-app.js | 6 +- .../02-app-that-excludes-mirage/package.json | 2 +- .../tests/helpers/start-app.js | 6 +- tests/helpers/start-app.js | 6 +- yarn.lock | 234 +++++++----------- 9 files changed, 101 insertions(+), 163 deletions(-) create mode 100644 test-projects/01-basic-app/app/serializers/application.js diff --git a/package.json b/package.json index 0da377caa..be65e8e35 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,6 @@ "ember-cli-htmlbars": "^4.0.5", "ember-cli-inject-live-reload": "^2.0.1", "ember-cli-moment-shim": "^3.8.0", - "ember-cli-qunit": "^4.4.0", "ember-cli-sri": "^2.1.1", "ember-cli-uglify": "^3.0.0", "ember-composable-helpers": "^4.1.2", @@ -75,6 +74,7 @@ "ember-load-initializers": "^2.0.0", "ember-maybe-import-regenerator-for-testing": "^1.0.0", "ember-moment": "^8.0.0", + "ember-qunit": "^4.6.0", "ember-resolver": "^7.0.0", "ember-source": "~3.20.0", "ember-source-channel-url": "^2.0.1", diff --git a/test-projects/01-basic-app/app/serializers/application.js b/test-projects/01-basic-app/app/serializers/application.js new file mode 100644 index 000000000..81056c386 --- /dev/null +++ b/test-projects/01-basic-app/app/serializers/application.js @@ -0,0 +1,4 @@ +import JSONAPISerializer from '@ember-data/serializer/json-api'; + +export default JSONAPISerializer.extend({ +}); diff --git a/test-projects/01-basic-app/package.json b/test-projects/01-basic-app/package.json index 3ee8e2922..51c8f39a4 100644 --- a/test-projects/01-basic-app/package.json +++ b/test-projects/01-basic-app/package.json @@ -30,13 +30,13 @@ "ember-cli-htmlbars": "*", "ember-cli-inject-live-reload": "*", "ember-cli-mirage": "*", - "ember-cli-qunit": "*", "ember-cli-sri": "*", "ember-cli-uglify": "*", "ember-data": "*", "ember-export-application-global": "*", "ember-load-initializers": "*", "ember-maybe-import-regenerator-for-testing": "*", + "ember-qunit": "*", "ember-resolver": "*", "ember-source": "*", "eslint-plugin-ember": "*", diff --git a/test-projects/01-basic-app/tests/acceptance/start-mirage-test.js b/test-projects/01-basic-app/tests/acceptance/start-mirage-test.js index 3e77740fd..e97a6aab3 100644 --- a/test-projects/01-basic-app/tests/acceptance/start-mirage-test.js +++ b/test-projects/01-basic-app/tests/acceptance/start-mirage-test.js @@ -57,6 +57,7 @@ module('Acceptance | Starting mirage', function(hooks) { test('it works', async function(assert) { const server = startMirage(this.owner); const model = server.create('nested/thing'); + dynamicAfterEach = () => server.shutdown(); assert.ok(model instanceof NestedThingModel, 'models'); assert.equal(model.id, 'nested identity manager works!', 'identity managers'); @@ -69,6 +70,7 @@ module('Acceptance | Starting mirage', function(hooks) { // factories and fixtures have to be tested separately test('fixtures support', async function(assert) { const server = startMirage(this.owner); + dynamicAfterEach = () => server.shutdown(); server.loadFixtures('nested/things'); const model = server.schema.first('nested/thing'); diff --git a/test-projects/01-basic-app/tests/helpers/start-app.js b/test-projects/01-basic-app/tests/helpers/start-app.js index 99d35dcf4..9f6aee596 100644 --- a/test-projects/01-basic-app/tests/helpers/start-app.js +++ b/test-projects/01-basic-app/tests/helpers/start-app.js @@ -1,12 +1,12 @@ import Application from '../../app'; import config from '../../config/environment'; -import { merge } from '@ember/polyfills'; +import { assign } from '@ember/polyfills'; import { run } from '@ember/runloop'; export default function startApp(attrs) { - let attributes = merge({}, config.APP); + let attributes = assign({}, config.APP); attributes.autoboot = true; - attributes = merge(attributes, attrs); // use defaults, but you can override; + attributes = assign(attributes, attrs); // use defaults, but you can override; return run(() => { let application = Application.create(attributes); diff --git a/test-projects/02-app-that-excludes-mirage/package.json b/test-projects/02-app-that-excludes-mirage/package.json index d94d8450e..2c507e7bc 100644 --- a/test-projects/02-app-that-excludes-mirage/package.json +++ b/test-projects/02-app-that-excludes-mirage/package.json @@ -29,12 +29,12 @@ "ember-cli-htmlbars": "*", "ember-cli-inject-live-reload": "*", "ember-cli-mirage": "*", - "ember-cli-qunit": "*", "ember-cli-sri": "*", "ember-cli-uglify": "*", "ember-data": "*", "ember-export-application-global": "*", "ember-load-initializers": "*", + "ember-qunit": "*", "ember-resolver": "*", "ember-source": "*", "eslint-plugin-ember": "*", diff --git a/test-projects/02-app-that-excludes-mirage/tests/helpers/start-app.js b/test-projects/02-app-that-excludes-mirage/tests/helpers/start-app.js index 99d35dcf4..9f6aee596 100644 --- a/test-projects/02-app-that-excludes-mirage/tests/helpers/start-app.js +++ b/test-projects/02-app-that-excludes-mirage/tests/helpers/start-app.js @@ -1,12 +1,12 @@ import Application from '../../app'; import config from '../../config/environment'; -import { merge } from '@ember/polyfills'; +import { assign } from '@ember/polyfills'; import { run } from '@ember/runloop'; export default function startApp(attrs) { - let attributes = merge({}, config.APP); + let attributes = assign({}, config.APP); attributes.autoboot = true; - attributes = merge(attributes, attrs); // use defaults, but you can override; + attributes = assign(attributes, attrs); // use defaults, but you can override; return run(() => { let application = Application.create(attributes); diff --git a/tests/helpers/start-app.js b/tests/helpers/start-app.js index 99d35dcf4..9f6aee596 100644 --- a/tests/helpers/start-app.js +++ b/tests/helpers/start-app.js @@ -1,12 +1,12 @@ import Application from '../../app'; import config from '../../config/environment'; -import { merge } from '@ember/polyfills'; +import { assign } from '@ember/polyfills'; import { run } from '@ember/runloop'; export default function startApp(attrs) { - let attributes = merge({}, config.APP); + let attributes = assign({}, config.APP); attributes.autoboot = true; - attributes = merge(attributes, attrs); // use defaults, but you can override; + attributes = assign(attributes, attrs); // use defaults, but you can override; return run(() => { let application = Application.create(attributes); diff --git a/yarn.lock b/yarn.lock index 3ce8a5557..acf3afd67 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1392,15 +1392,17 @@ ember-cli-babel "^6.16.0" ember-compatibility-helpers "^1.1.1" -"@ember/test-helpers@^0.7.26": - version "0.7.27" - resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-0.7.27.tgz#c622cabd0cbb95b34efc1e1b6274ab5a14edc138" - integrity sha512-AQESk0FTFxRY6GyZ8PharR4SC7Fju0rXqNkfNYIntAjzefZ8xEqEM4iXDj5h7gAvfx/8dA69AQ9+p7ubc+KvJg== +"@ember/test-helpers@^1.7.1": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-1.7.2.tgz#5b128dc5f6524c3850abf52668e6bd4fda401194" + integrity sha512-FEJBpbFNIaWAsCSnataiNwYFvmcpoymL/B7fXLruuJ/46BnJjzLaRPtpUIZ91w4GNTK6knxbHWXW76aVb3Aezg== dependencies: - broccoli-funnel "^2.0.1" - ember-assign-polyfill "~2.4.0" - ember-cli-babel "^6.12.0" - ember-cli-htmlbars-inline-precompile "^1.0.0" + broccoli-debug "^0.6.5" + broccoli-funnel "^2.0.2" + ember-assign-polyfill "^2.6.0" + ember-cli-babel "^7.7.3" + ember-cli-htmlbars-inline-precompile "^2.1.0" + ember-test-waiters "^1.1.1" "@embroider/core@0.4.3", "@embroider/core@^0.4.3": version "0.4.3" @@ -2971,10 +2973,10 @@ babel-plugin-filter-imports@^4.0.0: "@babel/types" "^7.7.2" lodash "^4.17.15" -babel-plugin-htmlbars-inline-precompile@^0.2.5: - version "0.2.6" - resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.2.6.tgz#c00b8a3f4b32ca04bf0f0d5169fcef3b5a66d69d" - integrity sha512-H4H75TKGUFij8ukwEYWEERAgrUf16R8NSK1uDPe3QwxT8mnE1K8+/s6DVjUqbM5Pv6lSIcE4XufXdlSX+DTB6g== +babel-plugin-htmlbars-inline-precompile@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-1.0.0.tgz#a9d2f6eaad8a3f3d361602de593a8cbef8179c22" + integrity sha512-4jvKEHR1bAX03hBDZ94IXsYCj3bwk9vYsn6ux6JZNL2U5pvzCWjqyrGahfsGNrhERyxw8IqcirOi9Q6WCo3dkQ== babel-plugin-htmlbars-inline-precompile@^3.0.1: version "3.0.1" @@ -5087,11 +5089,6 @@ combined-stream@~0.0.4: dependencies: delayed-stream "0.0.5" -commander@2.12.2: - version "2.12.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555" - integrity sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA== - commander@2.8.x: version "2.8.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" @@ -5099,6 +5096,11 @@ commander@2.8.x: dependencies: graceful-readlink ">= 1.0.0" +commander@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.0.0.tgz#2b270da94f8fb9014455312f829a1129dbf8887e" + integrity sha512-s7EA+hDtTYNhuXkTlhqew4txMZVdszBmKWSPEMxGr8ru8JXR7bLUFIAtPhcSuFdJQ0ILMxnJi8GkQL0yvDy/YA== + commander@^2.19.0, commander@^2.20.0, commander@^2.6.0, commander@~2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -5730,11 +5732,6 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= - detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" @@ -5987,14 +5984,6 @@ ember-assign-polyfill@^2.5.0, ember-assign-polyfill@^2.6.0: ember-cli-babel "^6.16.0" ember-cli-version-checker "^2.0.0" -ember-assign-polyfill@~2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/ember-assign-polyfill/-/ember-assign-polyfill-2.4.0.tgz#acb00466f7d674b3e6b030acfe255b3b1f6472e1" - integrity sha512-0SnGQb9CenRqbZdIa1KFsEjT+1ijGWfAbCSaDbg5uVa5l6HPdppuTzOXK6sfEQMsd2nbrp27QWFy7W5VX6l4Ag== - dependencies: - ember-cli-babel "^6.6.0" - ember-cli-version-checker "^2.0.0" - ember-auto-import@^1.2.19, ember-auto-import@^1.5.3: version "1.6.0" resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.6.0.tgz#00a498172b04f7084a5d2a327f76f577038ed403" @@ -6178,7 +6167,7 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.13.2, ember-cli-babel@^7.18.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.18.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: version "7.22.1" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.22.1.tgz#cad28b89cf0e184c93b863d09bc5ba4ce1d2e453" integrity sha512-kCT8WbC1AYFtyOpU23ESm22a+gL6fWv8Nzwe8QFQ5u0piJzM9MEudfbjADEaoyKTrjMQTDsrWwEf3yjggDsOng== @@ -6349,12 +6338,12 @@ ember-cli-get-component-path-option@^1.0.0: resolved "https://registry.yarnpkg.com/ember-cli-get-component-path-option/-/ember-cli-get-component-path-option-1.0.0.tgz#0d7b595559e2f9050abed804f1d8eff1b08bc771" integrity sha1-DXtZVVni+QUKvtgE8djv8bCLx3E= -ember-cli-htmlbars-inline-precompile@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-1.0.5.tgz#312e050c9e3dd301c55fb399fd706296cd0b1d6a" - integrity sha512-/CNEqPxroIcbY6qejrt704ZaghHLCntZKYLizFfJ2esirXoJx6fuYKBY1YyJ8GOgjfbHHKjBZuK4vFFJpkGqkQ== +ember-cli-htmlbars-inline-precompile@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-2.1.0.tgz#61b91ff1879d44ae504cadb46fb1f2604995ae08" + integrity sha512-BylIHduwQkncPhnj0ZyorBuljXbTzLgRo6kuHf1W+IHFxThFl2xG+r87BVwsqx4Mn9MTgW9SE0XWjwBJcSWd6Q== dependencies: - babel-plugin-htmlbars-inline-precompile "^0.2.5" + babel-plugin-htmlbars-inline-precompile "^1.0.0" ember-cli-version-checker "^2.1.2" hash-for-dep "^1.2.3" heimdalljs-logger "^0.1.9" @@ -6486,14 +6475,6 @@ ember-cli-preprocess-registry@^3.1.2: debug "^3.0.1" process-relative-require "^1.0.0" -ember-cli-qunit@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/ember-cli-qunit/-/ember-cli-qunit-4.4.0.tgz#0edd7d651001d0d7ea200b9236a4733a5b7420f1" - integrity sha512-+gkx380AV4WXYjQeIuQi675STL9K12fHFtxs8B9u3EFbw45vJKrnYR4Vph3FujxhE/1pr/Je8kZEPAuezZAVLw== - dependencies: - ember-cli-babel "^6.11.0" - ember-qunit "^3.5.0" - ember-cli-sass@10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/ember-cli-sass/-/ember-cli-sass-10.0.1.tgz#afa91eb7dfe3890be0390639d66976512e7d8edc" @@ -6990,18 +6971,18 @@ ember-on-modifier@^1.0.0: ember-cli-version-checker "^4.1.0" ember-modifier-manager-polyfill "^1.2.0" -ember-qunit@^3.5.0: - version "3.5.3" - resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-3.5.3.tgz#bfd0bff8298c78c77e870cca43fe0826e78a0d09" - integrity sha512-FmXsI1bGsZ5th25x4KEle2fLCVURTptsQODfBt+Pg8tk9rX7y79cqny91PrhtkhE+giZ8p029tnq94SdpJ4ojg== +ember-qunit@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-4.6.0.tgz#ad79fd3ff00073a8779400cc5a4b44829517590f" + integrity sha512-i5VOGn0RP8XH+5qkYDOZshbqAvO6lHgF65D0gz8vRx4DszCIvJMJO+bbftBTfYMxp6rqG85etAA6pfNxE0DqsQ== dependencies: - "@ember/test-helpers" "^0.7.26" - broccoli-funnel "^2.0.1" - broccoli-merge-trees "^2.0.0" + "@ember/test-helpers" "^1.7.1" + broccoli-funnel "^2.0.2" + broccoli-merge-trees "^3.0.2" common-tags "^1.4.0" - ember-cli-babel "^6.8.2" + ember-cli-babel "^7.12.0" ember-cli-test-loader "^2.2.0" - qunit "~2.6.0" + qunit "^2.9.3" ember-resolver@^7.0.0: version "7.0.0" @@ -7116,6 +7097,14 @@ ember-svg-jar@^2.2.3: mkdirp "^0.5.1" path-posix "^1.0.0" +ember-test-waiters@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ember-test-waiters/-/ember-test-waiters-1.2.0.tgz#c12ead4313934c24cff41857020cacdbf8e6effe" + integrity sha512-aEw7YuutLuJT4NUuPTNiGFwgTYl23ThqmBxSkfFimQAn+keWjAftykk3dlFELuhsJhYW/S8YoVjN0bSAQRLNtw== + dependencies: + ember-cli-babel "^7.11.0" + semver "^6.3.0" + ember-tether@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-tether/-/ember-tether-1.0.0.tgz#6117ea7351927887cb74fa5d46097dd300280c2d" @@ -7648,11 +7637,6 @@ exif-parser@^0.1.12, exif-parser@^0.1.9: resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922" integrity sha1-WKnS1ywCwfbwKg70qRZicrd2CSI= -exists-stat@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/exists-stat/-/exists-stat-1.0.0.tgz#0660e3525a2e89d9e446129440c272edfa24b529" - integrity sha1-BmDjUlouidnkRhKUQMJy7foktSk= - exists-sync@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.4.tgz#9744c2c428cc03b01060db454d4b12f0ef3c8879" @@ -7681,13 +7665,6 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= - dependencies: - homedir-polyfill "^1.0.1" - express@^4.10.7, express@^4.13.1, express@^4.16.3: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" @@ -8100,16 +8077,6 @@ find-yarn-workspace-root@^1.1.0: fs-extra "^4.0.3" micromatch "^3.1.4" -findup-sync@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" - integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= - dependencies: - detect-file "^1.0.0" - is-glob "^3.1.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - fireworm@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/fireworm/-/fireworm-0.7.1.tgz#ccf20f7941f108883fcddb99383dbe6e1861c758" @@ -8547,26 +8514,6 @@ glob@^7.0.0, glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, gl once "^1.3.0" path-is-absolute "^1.0.0" -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - global@~4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" @@ -8585,6 +8532,11 @@ globals@^9.18.0: resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== +globalyzer@^0.1.0: + version "0.1.4" + resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.4.tgz#bc8e273afe1ac7c24eea8def5b802340c5cc534f" + integrity sha512-LeguVWaxgHN0MNbWC6YljNMzHkrCny9fzjmEUdnF1kQ7wATFD1RHFRqA1qxaX2tgxGENlcxjOflopBwj3YZiXA== + globby@10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.1.tgz#4782c34cb75dd683351335c5829cc3420e606b22" @@ -8599,6 +8551,11 @@ globby@10.0.1: merge2 "^1.2.3" slash "^3.0.0" +globrex@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" + integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== + good-listener@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" @@ -8899,13 +8856,6 @@ home-or-tmp@^2.0.0: os-homedir "^1.0.0" os-tmpdir "^1.0.1" -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: version "2.8.8" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" @@ -9142,7 +9092,7 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: +ini@^1.3.5, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== @@ -9506,7 +9456,7 @@ is-utf8@^0.2.0: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= -is-windows@^1.0.1, is-windows@^1.0.2: +is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -9651,10 +9601,10 @@ jquery@^3.4.1, jquery@^3.5.0: resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.1.tgz#d7b4d08e1bfdb86ad2f1a3d039ea17304717abb5" integrity sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg== -js-reporters@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/js-reporters/-/js-reporters-1.2.1.tgz#f88c608e324a3373a95bcc45ad305e5c979c459b" - integrity sha1-+IxgjjJKM3OpW8xFrTBeXJecRZs= +js-reporters@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/js-reporters/-/js-reporters-1.2.3.tgz#8febcab370539df62e09b95da133da04b11f6168" + integrity sha512-2YzWkHbbRu6LueEs5ZP3P1LqbECvAeUJYrjw3H4y1ofW06hqCS0AbzBtLwbr+Hke51bt9CUepJ/Fj1hlCRIF6A== js-string-escape@^1.0.1: version "1.0.1" @@ -10754,7 +10704,7 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: +micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -11176,6 +11126,11 @@ node-uuid@~1.4.0: resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" integrity sha1-sEDrCSOWivq/jTL7HxfxFn/auQc= +node-watch@0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/node-watch/-/node-watch-0.6.4.tgz#50e564046eb7be15151c25f9c5aac4b5f495c291" + integrity sha512-cI6CHzivIFESe8djiK3Wh90CtWQBxLwMem8x8S+2GSvCvFgoMuOKVlfJtQ/2v3Afg3wOnHl/+tXotEs8z5vOrg== + nopt@^3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" @@ -11647,11 +11602,6 @@ parse-ms@^1.0.0: resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" integrity sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0= -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= - parse-png@^1.0.0, parse-png@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/parse-png/-/parse-png-1.1.2.tgz#f5c2ad7c7993490986020a284c19aee459711ff2" @@ -11754,7 +11704,7 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.5, path-parse@^1.0.6: +path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== @@ -12248,18 +12198,15 @@ qunit-dom@^1.1.0: broccoli-funnel "^3.0.3" broccoli-merge-trees "^4.2.0" -qunit@~2.6.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.6.2.tgz#551210c5cf857258a4fe39a7fe15d9e14dfef22c" - integrity sha512-PHbKulmd4rrDhFto7iHicIstDTX7oMRvAcI7loHstvU8J7AOGwzcchONmy+EG4KU8HDk0K90o7vO0GhlYyKlOg== +qunit@^2.9.3: + version "2.11.2" + resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.11.2.tgz#ff68b57672053824a670620e7bd341e47561c542" + integrity sha512-lvvKQYK2YFU+L7lTXnTD8+qE49cNs2sK2gr1j8KV4Bj+s1eDrdmwaZf5a8pEcW+rB1cEtCH0ZeQ0Z9K76OQjGA== dependencies: - commander "2.12.2" - exists-stat "1.0.0" - findup-sync "2.0.0" - js-reporters "1.2.1" - resolve "1.5.0" - sane "^2.5.2" - walk-sync "0.3.2" + commander "6.0.0" + js-reporters "1.2.3" + node-watch "0.6.4" + tiny-glob "0.2.6" randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.1.0" @@ -12690,14 +12637,6 @@ resize-img@^1.1.0: jpeg-js "^0.1.1" parse-png "^1.1.1" -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -12724,13 +12663,6 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" - integrity sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw== - dependencies: - path-parse "^1.0.5" - resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.0, resolve@^1.14.2, resolve@^1.15.0, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" @@ -12924,7 +12856,7 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sane@^2.4.1, sane@^2.5.2: +sane@^2.4.1: version "2.5.2" resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" integrity sha1-tNwYYcIbQn6SlQej51HiosuKs/o= @@ -14005,6 +13937,14 @@ tiny-emitter@^2.0.0: resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== +tiny-glob@0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.6.tgz#9e056e169d9788fe8a734dfa1ff02e9b92ed7eda" + integrity sha512-A7ewMqPu1B5PWwC3m7KVgAu96Ch5LA0w4SnEN/LbDREj/gAD0nPWboRbn8YoP9ISZXqeNAlMvKSKoEuhcfK3Pw== + dependencies: + globalyzer "^0.1.0" + globrex "^0.1.1" + tiny-lr@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.1.1.tgz#9fa547412f238fedb068ee295af8b682c98b2aab" @@ -14578,14 +14518,6 @@ w3c-xmlserializer@^2.0.0: dependencies: xml-name-validator "^3.0.0" -walk-sync@0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.2.tgz#4827280afc42d0e035367c4a4e31eeac0d136f75" - integrity sha512-FMB5VqpLqOCcqrzA9okZFc0wq0Qbmdm396qJxvQZhDpyu0W95G9JCmp74tx7iyYnyOcBtUuKJsgIKAqjozvmmQ== - dependencies: - ensure-posix-path "^1.0.0" - matcher-collection "^1.0.0" - walk-sync@^0.2.5: version "0.2.7" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.2.7.tgz#b49be4ee6867657aeb736978b56a29d10fa39969" @@ -14781,7 +14713,7 @@ which-module@^1.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= -which@^1.2.10, which@^1.2.14, which@^1.2.9, which@^1.3.0: +which@^1.2.10, which@^1.2.9, which@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== From 77b8cc73b47fa47906856196fd98d04c1561b393 Mon Sep 17 00:00:00 2001 From: Brian Gantzler Date: Wed, 23 Sep 2020 12:45:51 -0400 Subject: [PATCH 709/879] Update docs for new serializer --- addon/ember-data.js | 2 - addon/serializers/ember-data-serializer.js | 20 +++++---- .../advanced/server-configuration/template.md | 44 ++++++++++++++++-- .../ember-data-serializer/template.md | 45 +++++++++++++++++++ .../serializers/{ => index}/template.md | 2 +- tests/dummy/app/pods/docs/template.hbs | 3 ++ tests/dummy/app/router.js | 4 +- tests/dummy/app/serializers/word-smith.js | 2 +- .../serializers/ember-data-serializer-test.js | 2 +- 9 files changed, 105 insertions(+), 19 deletions(-) create mode 100644 tests/dummy/app/pods/docs/data-layer/serializers/ember-data-serializer/template.md rename tests/dummy/app/pods/docs/data-layer/serializers/{ => index}/template.md (95%) diff --git a/addon/ember-data.js b/addon/ember-data.js index 7ef43302d..07d314954 100644 --- a/addon/ember-data.js +++ b/addon/ember-data.js @@ -146,8 +146,6 @@ export function getDsSerializers() { * if a mirage serializer already exists, apply the ember-data transforms * * @method applyEmberDataSerializers - * @private - * @hide * @return {Object} serializers */ export function applyEmberDataSerializers(mirageSerializers = {}) { diff --git a/addon/serializers/ember-data-serializer.js b/addon/serializers/ember-data-serializer.js index 82a91e252..0bc2fb704 100644 --- a/addon/serializers/ember-data-serializer.js +++ b/addon/serializers/ember-data-serializer.js @@ -7,18 +7,16 @@ import {get} from "@ember/object"; /** * This serializer does not use following mirage properties to control how things are serialized - * attrs - see serialize:false on the transform for the properties you do not want to serialize. - * embed - see serialize: records for the relations you want to emded - * serializeIds - see serialize: ids for the relations you want as ids * - * The above configuration was applied to every property on the serializer, whereas the transforms allows you - * to specify a value for each relation. + * attrs - see `serialize` on the transform property + * embed - see `serialize` on the transform property + * serializeIds - see serialize on the transform property * - * The following properties are supported - * include - This works are described in the mirage documentation for the serializer interface + * The above configuration was applied to every property on the serializer, whereas the transforms allows you + * to specify a value for each property or relation. * - * Instead it uses the Ember Data serializer format or attrs to specify the serialization under the - * property transforms (attrs is already in use by mirageJs). + * This serializer uses a property `transforms` that follows the Ember Data serializer format of `attrs` to specify the + * serialization (`attrs` is already in use by mirageJs). * * The startMirage has been modified to also generate serializers from the Ember Data serializers supporting * the key and the serialize/deserialize properties with the value of (true/ids/records). If a serializer is @@ -26,6 +24,10 @@ import {get} from "@ember/object"; * a serializer of this type, there will be no effect. Ensure that your serializers and/or the application * serializer in the mirage directory is a type of this serializer * + * @class EmberDataSerializer + * @constructor + * @public + * */ let EmberDataSerializer = RestSerializer.extend({ /** diff --git a/tests/dummy/app/pods/docs/advanced/server-configuration/template.md b/tests/dummy/app/pods/docs/advanced/server-configuration/template.md index da9ef5262..dd8164c61 100644 --- a/tests/dummy/app/pods/docs/advanced/server-configuration/template.md +++ b/tests/dummy/app/pods/docs/advanced/server-configuration/template.md @@ -2,9 +2,7 @@ The MirageJS server is configured for you by ember-cli-mirage. However, if you need to customize the server you can by creating a makeServer function in the config.js. -```javascript -/* - The named `makeServer` function export gives you a lower-level way to hook +The named `makeServer` function export gives you a lower-level way to hook into how your Ember app instantiates your Mirage JS server. Typically, the `/mirage/config.js` file contains a single default export which @@ -55,7 +53,7 @@ The MirageJS server is configured for you by ember-cli-mirage. However, if you n `miragejs', and become a small wrapper library delegating the rest of the work to `miragejs`. This will help align the Ember Mirage users with the rest of the Mirage JS community. -*/ +```javascript // Example with inline routes import { createServer, discoverEmberDataModels } from "ember-cli-mirage"; @@ -93,3 +91,41 @@ function routes() { // this.resource('user') } ``` + +##Serializers + +If you would like to have Mirage adjust or create your serializers for you from your ember data serializers adjust your +server configuration to have mirage perform this for you. + +When Mirage auto discovers your ember data models, should you also have the same model defined in mirage, it will use the mirage +version of the model. With serializers, you may have created a mirage serializer to override some methods, but would still +like Mirage to apply the primaryKey and transforms. For that reason the method to apply these properties is different than +the way you merge the models. + +`applyEmberDataSerializers` will apply the `primaryKey` and `attrs` from your ember data serializers to your mirage serializers. +If you have not created a mirage serializer it will create one and extend it from your mirage application serializer. +Ensure your application serializer extends from EmberDataSerializer as the default JSONApiSerializer will not understand +how to use `primaryKey` and `transforms`. If you have not created a mirage serializer named application, the created serializer +will extend EmberDataSerializer directly. + +```javascript +// Example of having Mirage adjust/create your serializers similiar to ember data models +import { createServer, discoverEmberDataModels, applyEmberDataSerializers } from 'ember-cli-mirage'; + +export function makeServer(config) { + let finalConfig = { + ...config, + models: { ...discoverEmberDataModels(), ...config.models }, + serializers: applyEmberDataSerializers(config.serializers), + routes, + }; + + return createServer(finalConfig); +} + +function routes() { + // this.namespace = '/api' + + // this.resource('user') +} +``` diff --git a/tests/dummy/app/pods/docs/data-layer/serializers/ember-data-serializer/template.md b/tests/dummy/app/pods/docs/data-layer/serializers/ember-data-serializer/template.md new file mode 100644 index 000000000..b059aba7d --- /dev/null +++ b/tests/dummy/app/pods/docs/data-layer/serializers/ember-data-serializer/template.md @@ -0,0 +1,45 @@ +The `EmberDataSerializer` extends the `RestSerializer` with the added functionality of +`primaryKey` and `attrs` (renamed `transforms` as `attrs` was already in use by Mirage) properties. +These properties work the same as the properties provided + +##Primary Key +This serializer provides for a property `primaryKey` that works the same as the `primaryKey` property on an ember data serializer. +By default this property will be `id` but if you assign a different value, that value will be used in the JSON instead of `id`. +This means that if you are using the `primaryKey` property on your ember data serializer, using the same property on the mirage serializer +will perform the same function. +If you were using the `RestSerializer` you would need to override the `serialize` and `normalize` functions to do the transform yourself. + +Using `EmberDataSerializer` you can let the serializer perform this transformation for you. To be clear, when data is received by Mirage, this will take the +value of `addressId` from the JSON and use it as the `id` for the Mirage model. When Mirage serializers it's model into JSON, it will +use the value for the `id` property and assign it to the property `addressId`. + +```js +import EmberDateSerialzier from 'ember-cli-mirage/ember-data-serializer'; + +export default EmberDateSerialzier.extend({ + primaryKey: "addressId" +}); +``` + +##Transforms + +Transforms provides the same function as `attrs` for the ember data serializers however this transformation is happening +on the server side for Mirage. This allows your mirage models to look more like your actual server models. + +Example of a Mirage serializer extending from EmberDataSerializer +```js +import { EmberDataSerializer } from "ember-cli-mirage"; + +export default EmberDataSerializer.extend({ + transforms: { + name: "externalName", + address: {key: "addressId", serialize: "ids"}, + age: {key: "externalAge"}, + blogPosts: {key: "blogPostIds"} + } +}); +``` + +If you would like Mirage to apply the transforms from your meber data serializers for you see {{docs-link 'Advanced Configuration of Serializers' 'docs.advanced.server-configuration~Serializers'}} + + diff --git a/tests/dummy/app/pods/docs/data-layer/serializers/template.md b/tests/dummy/app/pods/docs/data-layer/serializers/index/template.md similarity index 95% rename from tests/dummy/app/pods/docs/data-layer/serializers/template.md rename to tests/dummy/app/pods/docs/data-layer/serializers/index/template.md index 3a868938a..3eb7e91b7 100644 --- a/tests/dummy/app/pods/docs/data-layer/serializers/template.md +++ b/tests/dummy/app/pods/docs/data-layer/serializers/index/template.md @@ -41,7 +41,7 @@ If you are starting a new app, it's recommended that you choose a JSON:API imple If your app does use JSON:API, Mirage ships with a `JSONAPISerializer` that will do the heavy lifting for you. -Mirage also ships with two other named serializers, `ActiveModelSerializer` and `RestSerializer`, that match two other popular backend formats. +Mirage also ships with two other named serializers, `ActiveModelSerializer` and `RestSerializer`, that match two other popular backend formats. `EmberDataSerializer` is also provided as a variation to the `RestSerializer` that uses the `primaryKey` and `attrs` defined in your applciations ember data serializers, similar to how models are auto discovered. See the section on {{docs-link 'Ember Data Serializer' 'docs.data-layer.serializers.ember-data-serializer'}} for more information. If your backend uses a different format, you'll need to choose the closest one and customize it to match your production format. We'll talk about that later in this guide. diff --git a/tests/dummy/app/pods/docs/template.hbs b/tests/dummy/app/pods/docs/template.hbs index 3f95c3292..0e24f8f07 100644 --- a/tests/dummy/app/pods/docs/template.hbs +++ b/tests/dummy/app/pods/docs/template.hbs @@ -19,6 +19,9 @@ {{nav.item "Factories" "docs.data-layer.factories"}} {{nav.item "Fixtures" "docs.data-layer.fixtures"}} {{nav.item "Serializers" "docs.data-layer.serializers"}} + {{#nav.subnav as |nav|}} + {{nav.item "Ember Data Serializer" "docs.data-layer.serializers.ember-data-serializer"}} + {{/nav.subnav}} {{nav.section "Testing"}} {{nav.item "Acceptance tests" "docs.testing.acceptance-tests"}} diff --git a/tests/dummy/app/router.js b/tests/dummy/app/router.js index 3c98c42c1..f95977075 100644 --- a/tests/dummy/app/router.js +++ b/tests/dummy/app/router.js @@ -27,7 +27,9 @@ Router.map(function() { this.route('relationships'); this.route('factories'); this.route('fixtures'); - this.route('serializers'); + this.route('serializers', function() { + this.route('ember-data-serializer') + }); }); this.route('testing', function() { diff --git a/tests/dummy/app/serializers/word-smith.js b/tests/dummy/app/serializers/word-smith.js index 651c888ec..59728186b 100644 --- a/tests/dummy/app/serializers/word-smith.js +++ b/tests/dummy/app/serializers/word-smith.js @@ -1,4 +1,4 @@ -import RestSerializer from '@ember-data/serializer/rest'; + import RestSerializer from '@ember-data/serializer/rest'; export default RestSerializer.extend({ attrs: { diff --git a/tests/unit/serializers/ember-data-serializer-test.js b/tests/unit/serializers/ember-data-serializer-test.js index fe05489d2..7ef347801 100644 --- a/tests/unit/serializers/ember-data-serializer-test.js +++ b/tests/unit/serializers/ember-data-serializer-test.js @@ -2,7 +2,7 @@ import { module, test } from 'qunit'; import { setupTest } from 'ember-qunit'; import { Model, hasMany, belongsTo } from "miragejs"; import Server from 'ember-cli-mirage/server'; -import EmberDataSerializer from "ember-cli-mirage/serializers/ember-data-serializer"; +import { EmberDataSerializer } from "ember-cli-mirage"; module('Unit | Serializer | ember data serializer', function(hooks) { setupTest(hooks); From 76f87f324797b9cf43af3c2c4d4161c512114664 Mon Sep 17 00:00:00 2001 From: Brian Gantzler Date: Wed, 23 Sep 2020 16:28:08 -0400 Subject: [PATCH 710/879] Fixed typos --- .../03-app-that-uses-make-server/node_modules/.bin | 1 + .../node_modules/ember-cli-mirage | 1 + .../docs/advanced/server-configuration/template.md | 2 +- .../serializers/ember-data-serializer/template.md | 13 +++++++------ 4 files changed, 10 insertions(+), 7 deletions(-) create mode 120000 test-projects/03-app-that-uses-make-server/node_modules/.bin create mode 120000 test-projects/03-app-that-uses-make-server/node_modules/ember-cli-mirage diff --git a/test-projects/03-app-that-uses-make-server/node_modules/.bin b/test-projects/03-app-that-uses-make-server/node_modules/.bin new file mode 120000 index 000000000..1dedf1a6f --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/node_modules/.bin @@ -0,0 +1 @@ +../../../node_modules/.bin \ No newline at end of file diff --git a/test-projects/03-app-that-uses-make-server/node_modules/ember-cli-mirage b/test-projects/03-app-that-uses-make-server/node_modules/ember-cli-mirage new file mode 120000 index 000000000..a8a4f8c21 --- /dev/null +++ b/test-projects/03-app-that-uses-make-server/node_modules/ember-cli-mirage @@ -0,0 +1 @@ +../../.. \ No newline at end of file diff --git a/tests/dummy/app/pods/docs/advanced/server-configuration/template.md b/tests/dummy/app/pods/docs/advanced/server-configuration/template.md index dd8164c61..ac1d09d73 100644 --- a/tests/dummy/app/pods/docs/advanced/server-configuration/template.md +++ b/tests/dummy/app/pods/docs/advanced/server-configuration/template.md @@ -92,7 +92,7 @@ function routes() { } ``` -##Serializers +## Serializers If you would like to have Mirage adjust or create your serializers for you from your ember data serializers adjust your server configuration to have mirage perform this for you. diff --git a/tests/dummy/app/pods/docs/data-layer/serializers/ember-data-serializer/template.md b/tests/dummy/app/pods/docs/data-layer/serializers/ember-data-serializer/template.md index b059aba7d..bfd179827 100644 --- a/tests/dummy/app/pods/docs/data-layer/serializers/ember-data-serializer/template.md +++ b/tests/dummy/app/pods/docs/data-layer/serializers/ember-data-serializer/template.md @@ -1,8 +1,8 @@ -The `EmberDataSerializer` extends the `RestSerializer` with the added functionality of -`primaryKey` and `attrs` (renamed `transforms` as `attrs` was already in use by Mirage) properties. -These properties work the same as the properties provided +The `EmberDataSerializer` extends the `RestSerializer` with the added functionality of`primaryKey` and `attrs` +(renamed `transforms` as `attrs` was already in use by Mirage) properties. +These properties work the same as the properties provided. -##Primary Key +## Primary Key This serializer provides for a property `primaryKey` that works the same as the `primaryKey` property on an ember data serializer. By default this property will be `id` but if you assign a different value, that value will be used in the JSON instead of `id`. This means that if you are using the `primaryKey` property on your ember data serializer, using the same property on the mirage serializer @@ -21,7 +21,7 @@ export default EmberDateSerialzier.extend({ }); ``` -##Transforms +## Transforms Transforms provides the same function as `attrs` for the ember data serializers however this transformation is happening on the server side for Mirage. This allows your mirage models to look more like your actual server models. @@ -40,6 +40,7 @@ export default EmberDataSerializer.extend({ }); ``` -If you would like Mirage to apply the transforms from your meber data serializers for you see {{docs-link 'Advanced Configuration of Serializers' 'docs.advanced.server-configuration~Serializers'}} +If you would like Mirage to apply the transforms from your ember data serializers for you see +{{docs-link 'Advanced Configuration of Serializers' 'docs.advanced.server-configuration'}}. From 704935e585804c3824de368597985876794d7753 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 5 Oct 2020 12:23:21 -0400 Subject: [PATCH 711/879] build(deps-dev): bump ember-source-channel-url from 2.0.1 to 3.0.0 (#2021) Bumps [ember-source-channel-url](https://github.com/rwjblue/ember-source-channel-url) from 2.0.1 to 3.0.0. - [Release notes](https://github.com/rwjblue/ember-source-channel-url/releases) - [Changelog](https://github.com/ember-cli/ember-source-channel-url/blob/master/CHANGELOG.md) - [Commits](https://github.com/rwjblue/ember-source-channel-url/compare/v2.0.1...v3.0.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index be65e8e35..7738d2d30 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "ember-qunit": "^4.6.0", "ember-resolver": "^7.0.0", "ember-source": "~3.20.0", - "ember-source-channel-url": "^2.0.1", + "ember-source-channel-url": "^3.0.0", "ember-try": "^1.0.0", "escape-string-regexp": "^4.0.0", "eslint-plugin-ember": "^8.1.0", diff --git a/yarn.lock b/yarn.lock index acf3afd67..544e96287 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7040,12 +7040,12 @@ ember-source-channel-url@^1.0.1: dependencies: got "^8.0.1" -ember-source-channel-url@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ember-source-channel-url/-/ember-source-channel-url-2.0.1.tgz#18b88f8a00b7746e7a456b3551abb3aea18729cc" - integrity sha512-YlLUHW9gNvxEaohIj5exykoTZb4xj9ZRTcR4J3svv9S8rjAHJUnHmqC5Fd9onCs+NGxHo7KwR/fDwsfadbDu5Q== +ember-source-channel-url@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-source-channel-url/-/ember-source-channel-url-3.0.0.tgz#bcd5be72c63fa0b8c390b3121783b462063e2a1b" + integrity sha512-vF/8BraOc66ZxIDo3VuNP7iiDrnXEINclJgSJmqwAAEpg84Zb1DHPI22XTXSDA+E8fW5btPUxu65c3ZXi8AQFA== dependencies: - got "^8.0.1" + node-fetch "^2.6.0" ember-source@~3.20.0: version "3.20.4" From 550650d61b6f4d1185d2d1aec7a63c28e7b83ca0 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 5 Oct 2020 12:25:22 -0400 Subject: [PATCH 712/879] build(deps): bump broccoli-funnel from 2.0.2 to 3.0.3 (#2028) Bumps [broccoli-funnel](https://github.com/broccolijs/broccoli-funnel) from 2.0.2 to 3.0.3. - [Release notes](https://github.com/broccolijs/broccoli-funnel/releases) - [Changelog](https://github.com/broccolijs/broccoli-funnel/blob/master/CHANGELOG.md) - [Commits](https://github.com/broccolijs/broccoli-funnel/compare/v2.0.2...v3.0.3) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7738d2d30..477220cd8 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ }, "dependencies": { "broccoli-file-creator": "^2.1.1", - "broccoli-funnel": "^2.0.2", + "broccoli-funnel": "^3.0.3", "broccoli-merge-trees": "^3.0.2", "ember-auto-import": "^1.2.19", "ember-cli-babel": "^7.5.0", From 5e8c637bc4d87020e1b3cc23e502ab8836ff3dc1 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 5 Oct 2020 12:25:48 -0400 Subject: [PATCH 713/879] build(deps-dev): bump faker from 4.1.0 to 5.1.0 (#2045) Bumps [faker](https://github.com/Marak/Faker.js) from 4.1.0 to 5.1.0. - [Release notes](https://github.com/Marak/Faker.js/releases) - [Changelog](https://github.com/Marak/faker.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/Marak/Faker.js/compare/v4.1.0...v5.1.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 477220cd8..2896aa0ed 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "escape-string-regexp": "^4.0.0", "eslint-plugin-ember": "^8.1.0", "eslint-plugin-node": "^11.0.0", - "faker": "^4.1.0", + "faker": "^5.1.0", "fastboot": "^3.0.2", "js-yaml": "^3.12.1", "jsdom": "^16.2.2", diff --git a/yarn.lock b/yarn.lock index 544e96287..d3773b4e2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7778,10 +7778,10 @@ fake-xml-http-request@^2.1.1: resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-2.1.1.tgz#279fdac235840d7a4dff77d98ec44bce9fc690a6" integrity sha512-Kn2WYYS6cDBS5jq/voOfSGCA0TafOYAUPbEp8mUVpD/DVV5bQIDjlq+MLLvNUokkbTpjBVlLDaM5PnX+PwZMlw== -faker@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/faker/-/faker-4.1.0.tgz#1e45bbbecc6774b3c195fad2835109c6d748cc3f" - integrity sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8= +faker@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/faker/-/faker-5.1.0.tgz#e10fa1dec4502551aee0eb771617a7e7b94692e8" + integrity sha512-RrWKFSSA/aNLP0g3o2WW1Zez7/MnMr7xkiZmoCfAGZmdkDQZ6l2KtuXHN5XjdvpRjDl8+3vf+Rrtl06Z352+Mw== fast-deep-equal@^3.1.1: version "3.1.1" From 508a1b0fa603fc46a3c4e2cd505eabe1969f0dbc Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 5 Oct 2020 12:31:40 -0400 Subject: [PATCH 714/879] build(deps-dev): bump ember-cli-htmlbars from 4.3.1 to 5.3.1 (#2034) Bumps [ember-cli-htmlbars](https://github.com/ember-cli/ember-cli-htmlbars) from 4.3.1 to 5.3.1. - [Release notes](https://github.com/ember-cli/ember-cli-htmlbars/releases) - [Changelog](https://github.com/ember-cli/ember-cli-htmlbars/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-cli-htmlbars/compare/v4.3.1...v5.3.1) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 129 ++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 119 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 2896aa0ed..69b98eaa3 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "ember-cli-eslint": "^5.1.0", "ember-cli-fastboot": "^2.0.4", "ember-cli-favicon": "^2.0.0", - "ember-cli-htmlbars": "^4.0.5", + "ember-cli-htmlbars": "^5.3.1", "ember-cli-inject-live-reload": "^2.0.1", "ember-cli-moment-shim": "^3.8.0", "ember-cli-sri": "^2.1.1", diff --git a/yarn.lock b/yarn.lock index d3773b4e2..4ba36b2b5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2613,6 +2613,19 @@ async-disk-cache@^1.2.1: rsvp "^3.0.18" username-sync "^1.0.2" +async-disk-cache@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/async-disk-cache/-/async-disk-cache-2.1.0.tgz#e0f37b187ed8c41a5991518a9556d206ae2843a2" + integrity sha512-iH+boep2xivfD9wMaZWkywYIURSmsL96d6MoqrC94BnGSvXE4Quf8hnJiHGFYhw/nLeIa1XyRaf4vvcvkwAefg== + dependencies: + debug "^4.1.1" + heimdalljs "^0.2.3" + istextorbinary "^2.5.1" + mkdirp "^0.5.0" + rimraf "^3.0.0" + rsvp "^4.8.5" + username-sync "^1.0.2" + async-each@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" @@ -2983,6 +2996,11 @@ babel-plugin-htmlbars-inline-precompile@^3.0.1: resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-3.0.1.tgz#e1e38a4087f446578e419a21c112530c8df02345" integrity sha512-ZiFY0nQjtdMPGIDwp/5LYOs6rCr54QfcSV5nPbrA7C++Fv4Vb2Q/qrKYx78t+dwmARJztnOBlObFk4z8veHxNA== +babel-plugin-htmlbars-inline-precompile@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-4.2.0.tgz#73e7a199c14db139b9c9aea240e03b7112784c81" + integrity sha512-n2jMGcFKvubnYi8Ink7zJnC+aQor97v5FJKYUOUKijj5gIDy/sOIAZ7BxDWb0co1VzZokdN7tvtLnQtiWfD1Gw== + babel-plugin-module-resolver@^3.1.1: version "3.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.2.0.tgz#ddfa5e301e3b9aa12d852a9979f18b37881ff5a7" @@ -3458,6 +3476,11 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.2.0.tgz#e7c6ba82d4f5f5758c26078fe8eea28881233311" integrity sha512-bHhs98rj/7i/RZpCSJ3uk55pLXOItjIrh2sRQZSM6OoktScX+LxJzvlU+FELp9j3TdcddTmmYArLSGptCTwjuw== +binaryextensions@^2.1.2: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.3.0.tgz#1d269cbf7e6243ea886aa41453c3651ccbe13c22" + integrity sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg== + bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" @@ -4078,6 +4101,23 @@ broccoli-persistent-filter@^2.1.0, broccoli-persistent-filter@^2.1.1, broccoli-p sync-disk-cache "^1.3.3" walk-sync "^1.0.0" +broccoli-persistent-filter@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-3.1.1.tgz#318c68a82d5759582bb60e7e2c0f3ca008176224" + integrity sha512-gP797MF87JjkcwhGBkE0fhF3aIbGnOF3K3A0iZpQSxtpmSNt+rbNzuqDOmgiKwWpx6v0+APkM5HUA0NiIZpgsQ== + dependencies: + async-disk-cache "^2.0.0" + async-promise-queue "^1.0.3" + broccoli-plugin "^4.0.3" + fs-tree-diff "^2.0.0" + hash-for-dep "^1.5.0" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + promise-map-series "^0.2.1" + rimraf "^3.0.0" + symlink-or-copy "^1.0.1" + sync-disk-cache "^2.0.0" + broccoli-plugin@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.1.0.tgz#73e2cfa05f8ea1e3fc1420c40c3d9e7dc724bf02" @@ -4121,14 +4161,14 @@ broccoli-plugin@^2.0.0, broccoli-plugin@^2.1.0: rimraf "^2.3.4" symlink-or-copy "^1.1.8" -broccoli-plugin@^4.0.1, broccoli-plugin@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-4.0.2.tgz#a16c1f839bc95cc9975437e58864a395e518b447" - integrity sha512-wMytvn+I0ELNGLmLouZ7GpiMEHZ3pqKvHOWE7AgV4vdcnXm9FKwk1N2xGrGI+lKVxdejQvjxAJ2HCQJ/STrEjg== +broccoli-plugin@^4.0.1, broccoli-plugin@^4.0.2, broccoli-plugin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-4.0.3.tgz#9dcfbfb6a1b27a37cc22e65c071719ce9f92bc1e" + integrity sha512-CtAIEYq5K+4yQv8c/BHymOteuyjDAJfvy/asu4LudIWcMSS7dTn3yGI5gNBkwHG+qlRangYkHJNVAcDZMQbSVQ== dependencies: broccoli-node-api "^1.6.0" broccoli-output-wrapper "^3.2.1" - fs-merger "^3.0.1" + fs-merger "^3.1.0" promise-map-series "^0.2.1" quick-temp "^0.1.3" rimraf "^3.0.0" @@ -5919,6 +5959,14 @@ editions@^1.1.1: resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" integrity sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg== +editions@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/editions/-/editions-2.3.1.tgz#3bc9962f1978e801312fbd0aebfed63b49bfe698" + integrity sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA== + dependencies: + errlop "^2.0.0" + semver "^6.3.0" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -6369,7 +6417,7 @@ ember-cli-htmlbars@^3.0.0, ember-cli-htmlbars@^3.0.1: json-stable-stringify "^1.0.1" strip-bom "^3.0.0" -ember-cli-htmlbars@^4.0.5, ember-cli-htmlbars@^4.2.3: +ember-cli-htmlbars@^4.2.3: version "4.3.1" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.3.1.tgz#4af8adc21ab3c4953f768956b7f7d207782cb175" integrity sha512-CW6AY/yzjeVqoRtItOKj3hcYzc5dWPRETmeCzr2Iqjt5vxiVtpl0z5VTqHqIlT5fsFx6sGWBQXNHIe+ivYsxXQ== @@ -6389,6 +6437,27 @@ ember-cli-htmlbars@^4.0.5, ember-cli-htmlbars@^4.2.3: strip-bom "^4.0.0" walk-sync "^2.0.2" +ember-cli-htmlbars@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.3.1.tgz#61793964fc2599ce750db9e972ab55c6dd177c48" + integrity sha512-ZjQTt44euDoqLvUkWbt1svgNCXgLzOztEbc2qqYMQvhQig416LMrWK7l3SSbNU+BtLD5UIxmwvLfF1tsO2CVyA== + dependencies: + "@ember/edition-utils" "^1.2.0" + babel-plugin-htmlbars-inline-precompile "^4.2.0" + broccoli-debug "^0.6.5" + broccoli-persistent-filter "^3.1.0" + broccoli-plugin "^4.0.3" + common-tags "^1.8.0" + ember-cli-babel-plugin-helpers "^1.1.0" + fs-tree-diff "^2.0.1" + hash-for-dep "^1.5.1" + heimdalljs-logger "^0.1.10" + json-stable-stringify "^1.0.1" + semver "^7.3.2" + silent-error "^1.1.1" + strip-bom "^4.0.0" + walk-sync "^2.2.0" + ember-cli-import-polyfill@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/ember-cli-import-polyfill/-/ember-cli-import-polyfill-0.2.0.tgz#c1a08a8affb45c97b675926272fe78cf4ca166f2" @@ -7261,6 +7330,11 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== +errlop@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/errlop/-/errlop-2.2.0.tgz#1ff383f8f917ae328bebb802d6ca69666a42d21b" + integrity sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw== + errno@^0.1.3, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" @@ -8268,6 +8342,18 @@ fs-merger@^3.0.1: rimraf "^2.6.3" walk-sync "^2.0.2" +fs-merger@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/fs-merger/-/fs-merger-3.1.0.tgz#f30f74f6c70b2ff7333ec074f3d2f22298152f3b" + integrity sha512-RZ9JtqugaE8Rkt7idO5NSwcxEGSDZpLmVFjtVQUm3f+bWun7JAU6fKyU6ZJUeUnKdJwGx8uaro+K4QQfOR7vpA== + dependencies: + broccoli-node-api "^1.7.0" + broccoli-node-info "^2.1.0" + fs-extra "^8.0.1" + fs-tree-diff "^2.0.1" + rimraf "^2.6.3" + walk-sync "^2.0.2" + fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6, fs-tree-diff@^0.5.7, fs-tree-diff@^0.5.9: version "0.5.9" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.9.tgz#a4ec6182c2f5bd80b9b83c8e23e4522e6f5fd946" @@ -9526,6 +9612,15 @@ istextorbinary@2.1.0: editions "^1.1.1" textextensions "1 || 2" +istextorbinary@^2.5.1: + version "2.6.0" + resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.6.0.tgz#60776315fb0fa3999add276c02c69557b9ca28ab" + integrity sha512-+XRlFseT8B3L9KyjxxLjfXSLMuErKDsd8DBNrsaxoViABMEZlOSCstwmw0qpoFX3+U6yWU1yhLudAe6/lETGGA== + dependencies: + binaryextensions "^2.1.2" + editions "^2.2.0" + textextensions "^2.5.0" + isurl@^1.0.0-alpha5: version "1.0.0" resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" @@ -13728,6 +13823,17 @@ sync-disk-cache@^1.3.3: rimraf "^2.2.8" username-sync "^1.0.2" +sync-disk-cache@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sync-disk-cache/-/sync-disk-cache-2.1.0.tgz#01e879edc41c34a01fcdda5b39d47dd496e154a6" + integrity sha512-vngT2JmkSapgq0z7uIoYtB9kWOOzMihAAYq/D3Pjm/ODOGMgS4r++B+OZ09U4hWR6EaOdy9eqQ7/8ygbH3wehA== + dependencies: + debug "^4.1.1" + heimdalljs "^0.2.6" + mkdirp "^0.5.0" + rimraf "^3.0.0" + username-sync "^1.0.2" + table@^5.2.3: version "5.4.6" resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" @@ -13867,7 +13973,7 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -"textextensions@1 || 2": +"textextensions@1 || 2", textextensions@^2.5.0: version "2.6.0" resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.6.0.tgz#d7e4ab13fe54e32e08873be40d51b74229b00fc4" integrity sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ== @@ -14543,14 +14649,15 @@ walk-sync@^1.0.0, walk-sync@^1.0.1, walk-sync@^1.1.3: ensure-posix-path "^1.1.0" matcher-collection "^1.1.1" -walk-sync@^2.0.0, walk-sync@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-2.0.2.tgz#5ea8a28377c8be68c92d50f4007ea381725da14b" - integrity sha512-dCZkrxfHjPn7tIvdYrX3uMD/R0beVrHpA8lROQ5wWrl8psJgR6xwCkwqTFes0dNujbS2o/ITpvSYgIFsLsf13A== +walk-sync@^2.0.0, walk-sync@^2.0.2, walk-sync@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-2.2.0.tgz#80786b0657fcc8c0e1c0b1a042a09eae2966387a" + integrity sha512-IC8sL7aB4/ZgFcGI2T1LczZeFWZ06b3zoHH7jBPyHxOtIIz1jppWHjjEXkOFvFojBVAK9pV7g47xOZ4LW3QLfg== dependencies: "@types/minimatch" "^3.0.3" ensure-posix-path "^1.1.0" matcher-collection "^2.0.0" + minimatch "^3.0.4" walker@~1.0.5: version "1.0.7" From 823e1000308a89c9bdaa52c36d7017fde9b46fa6 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 5 Oct 2020 12:31:59 -0400 Subject: [PATCH 715/879] build(deps-dev): bump @ember/optional-features from 1.3.0 to 2.0.0 (#2046) Bumps [@ember/optional-features](https://github.com/emberjs/ember-optional-features) from 1.3.0 to 2.0.0. - [Release notes](https://github.com/emberjs/ember-optional-features/releases) - [Changelog](https://github.com/emberjs/ember-optional-features/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember-optional-features/compare/v1.3.0...v2.0.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 54 ++++++++++++++++++++++++++++++++++------------------ 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index 69b98eaa3..e2e7373d9 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ }, "devDependencies": { "@ember/jquery": "^1.1.0", - "@ember/optional-features": "^1.0.0", + "@ember/optional-features": "^2.0.0", "babel-eslint": "^10.0.3", "broccoli-asset-rev": "^3.0.0", "ember-ajax": "^5.0.0", diff --git a/yarn.lock b/yarn.lock index 4ba36b2b5..a84ae285a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1371,18 +1371,17 @@ jquery "^3.4.1" resolve "^1.11.1" -"@ember/optional-features@^1.0.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@ember/optional-features/-/optional-features-1.3.0.tgz#d7da860417b85a56cec88419f30da5ee1dde2756" - integrity sha512-Lrfojy4xKwTX+J4EAylmxZY2TO6bQtP4Lg5C8/z2priVqiT0X5fVB1+4WQCJbRBetctO1lMDnqjmhWCVKB8bmQ== +"@ember/optional-features@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@ember/optional-features/-/optional-features-2.0.0.tgz#c809abd5a27d5b0ef3c6de3941334ab6153313f0" + integrity sha512-4gkvuGRYfpAh1nwAz306cmMeC1mG7wxZnbsBZ09mMaMX/W7IyKOKc/38JwrDPUFUalmNEM7q7JEPcmew2M3Dog== dependencies: - chalk "^3.0.0" - ember-cli-version-checker "^3.1.3" + chalk "^4.1.0" + ember-cli-version-checker "^5.1.1" glob "^7.1.6" - inquirer "^7.0.1" - mkdirp "^0.5.1" + inquirer "^7.3.3" + mkdirp "^1.0.4" silent-error "^1.1.1" - util.promisify "^1.0.0" "@ember/ordered-set@^2.0.3": version "2.0.3" @@ -4763,7 +4762,7 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0: +chalk@^4.0.0, chalk@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== @@ -4979,6 +4978,11 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + clipboard@^2.0.0: version "2.0.6" resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.6.tgz#52921296eec0fdf77ead1749421b21c968647376" @@ -9233,21 +9237,21 @@ inquirer@^6.2.2: strip-ansi "^5.1.0" through "^2.3.6" -inquirer@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" - integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== +inquirer@^7.3.3: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== dependencies: ansi-escapes "^4.2.1" - chalk "^3.0.0" + chalk "^4.1.0" cli-cursor "^3.1.0" - cli-width "^2.0.0" + cli-width "^3.0.0" external-editor "^3.0.3" figures "^3.0.0" - lodash "^4.17.15" + lodash "^4.17.19" mute-stream "0.0.8" run-async "^2.4.0" - rxjs "^6.5.3" + rxjs "^6.6.0" string-width "^4.1.0" strip-ansi "^6.0.0" through "^2.3.6" @@ -11003,6 +11007,11 @@ mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@~0.5.0, mkdir dependencies: minimist "^1.2.5" +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mktemp@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/mktemp/-/mktemp-0.4.0.tgz#6d0515611c8a8c84e484aa2000129b98e981ff0b" @@ -12917,13 +12926,20 @@ rx@^4.1.0: resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= -rxjs@^6.4.0, rxjs@^6.5.3: +rxjs@^6.4.0: version "6.5.4" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== dependencies: tslib "^1.9.0" +rxjs@^6.6.0: + version "6.6.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.2.tgz#8096a7ac03f2cc4fe5860ef6e572810d9e01c0d2" + integrity sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg== + dependencies: + tslib "^1.9.0" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" From 9bde820ef059f334d11eaf03b970df07d44432e0 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 5 Oct 2020 15:30:47 -0400 Subject: [PATCH 716/879] build(deps): bump broccoli-merge-trees from 3.0.2 to 4.2.0 (#2029) Bumps [broccoli-merge-trees](https://github.com/broccolijs/broccoli-merge-trees) from 3.0.2 to 4.2.0. - [Release notes](https://github.com/broccolijs/broccoli-merge-trees/releases) - [Changelog](https://github.com/broccolijs/broccoli-merge-trees/blob/master/CHANGELOG.md) - [Commits](https://github.com/broccolijs/broccoli-merge-trees/compare/v3.0.2...v4.2.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e2e7373d9..0b5483a48 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "dependencies": { "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^3.0.3", - "broccoli-merge-trees": "^3.0.2", + "broccoli-merge-trees": "^4.2.0", "ember-auto-import": "^1.2.19", "ember-cli-babel": "^7.5.0", "ember-get-config": "^0.2.2", From 26d4ce83e35c3c5dddbf58d12e8076196d42b616 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 5 Oct 2020 15:36:45 -0400 Subject: [PATCH 717/879] build(deps-dev): bump ember-resolver from 7.0.0 to 8.0.2 (#2032) Bumps [ember-resolver](https://github.com/ember-cli/ember-resolver) from 7.0.0 to 8.0.2. - [Release notes](https://github.com/ember-cli/ember-resolver/releases) - [Changelog](https://github.com/ember-cli/ember-resolver/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-resolver/compare/v7.0.0...v8.0.2) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 0b5483a48..7fffd4355 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "ember-maybe-import-regenerator-for-testing": "^1.0.0", "ember-moment": "^8.0.0", "ember-qunit": "^4.6.0", - "ember-resolver": "^7.0.0", + "ember-resolver": "^8.0.2", "ember-source": "~3.20.0", "ember-source-channel-url": "^3.0.0", "ember-try": "^1.0.0", diff --git a/yarn.lock b/yarn.lock index a84ae285a..72e5f36b5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6219,7 +6219,7 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.18.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.18.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: version "7.22.1" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.22.1.tgz#cad28b89cf0e184c93b863d09bc5ba4ce1d2e453" integrity sha512-kCT8WbC1AYFtyOpU23ESm22a+gL6fWv8Nzwe8QFQ5u0piJzM9MEudfbjADEaoyKTrjMQTDsrWwEf3yjggDsOng== @@ -7057,17 +7057,17 @@ ember-qunit@^4.6.0: ember-cli-test-loader "^2.2.0" qunit "^2.9.3" -ember-resolver@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-7.0.0.tgz#07ca86b3bae373395b44bba784b8c133f75d61c2" - integrity sha512-tqyWk9E1P5LL42x7AnVoE25a/YWe0WcwAr8LXasm5V7Az3vFR/zbFtwN0oI3tpoSP/nCoGWDct6dRYlXrQjqBQ== +ember-resolver@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-8.0.2.tgz#8a45a744aaf5391eb52b4cb393b3b06d2db1975c" + integrity sha512-BmCoPT8nf5uv0g2QkhMsrG1Gmu6MtXd6igfhCVzCTMTwZ97SxhJKqoMY62EP/av5HVSWBC/Sa1uGU5cQvX1Aog== dependencies: babel-plugin-debug-macros "^0.3.3" - broccoli-funnel "^2.0.2" - broccoli-merge-trees "^3.0.0" - ember-cli-babel "^7.13.2" - ember-cli-version-checker "^3.1.3" - resolve "^1.14.0" + broccoli-funnel "^3.0.3" + broccoli-merge-trees "^4.2.0" + ember-cli-babel "^7.22.1" + ember-cli-version-checker "^5.1.1" + resolve "^1.17.0" ember-responsive@^3.0.5: version "3.0.5" @@ -12767,7 +12767,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.0, resolve@^1.14.2, resolve@^1.15.0, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: +resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.15.0, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== From f89a3b9dbe7e926f9a801a5bfdc66b4cea02502f Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Tue, 6 Oct 2020 14:27:26 -0400 Subject: [PATCH 718/879] Bump node (#2057) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7fffd4355..6d2365ee5 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,7 @@ "ember-data": "3.14.0" }, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">= 10.*" }, "ember-addon": { "configPath": "tests/dummy/config", From 2d9f26c29396e27f3255395804207cc677924a24 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 7 Oct 2020 05:09:34 +0000 Subject: [PATCH 719/879] build(deps): bump miragejs from 0.1.40 to 0.1.41 Bumps [miragejs](https://github.com/miragejs/miragejs) from 0.1.40 to 0.1.41. - [Release notes](https://github.com/miragejs/miragejs/releases) - [Changelog](https://github.com/miragejs/miragejs/blob/master/CHANGELOG.md) - [Commits](https://github.com/miragejs/miragejs/compare/v0.1.40...v0.1.41) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 72e5f36b5..eb2fe2bcd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10933,9 +10933,9 @@ minipass@^2.2.0: yallist "^3.0.0" miragejs@^0.1.31: - version "0.1.40" - resolved "https://registry.yarnpkg.com/miragejs/-/miragejs-0.1.40.tgz#5bcba7634312c012748ae7f294e1516b74b37182" - integrity sha512-7zxIcynzdS6425KZ2+TWD6F6DqESorulSDW2QBXf4iKyVn/J5vSielcubAK8sTKUefTPCrSRi7PwgNOb0JlmIg== + version "0.1.41" + resolved "https://registry.yarnpkg.com/miragejs/-/miragejs-0.1.41.tgz#1b06a2d2d9de65624f5bb1cee7ebb4a208f554d0" + integrity sha512-ur8x7sBskgey64vdzKGVCVC3hgKXWl2Cg5lZbxd6OmKrhr9LCCP/Bv7qh4wsQxIMHZnENxybFATXnrQ+rzSOWQ== dependencies: "@miragejs/pretender-node-polyfill" "^0.1.0" inflected "^2.0.4" From a029864bc6e90af77fbceafc2bb9efa0d16129f4 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 7 Oct 2020 05:10:39 +0000 Subject: [PATCH 720/879] build(deps-dev): bump eslint-plugin-ember from 8.12.0 to 8.14.0 Bumps [eslint-plugin-ember](https://github.com/ember-cli/eslint-plugin-ember) from 8.12.0 to 8.14.0. - [Release notes](https://github.com/ember-cli/eslint-plugin-ember/releases) - [Changelog](https://github.com/ember-cli/eslint-plugin-ember/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/eslint-plugin-ember/compare/v8.12.0...v8.14.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index eb2fe2bcd..cffaa2ef5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7455,9 +7455,9 @@ esdoc@pzuraq/esdoc#015a342: taffydb "2.7.2" eslint-plugin-ember@^8.1.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.12.0.tgz#7e4b50bc6aa457cda58b09809b1545350650af16" - integrity sha512-o2mtq8Tz1Rwdab8f+YlGXtSdH5wpPRJeGC/MeBGGSZK9O/TmpOYbbj1sklUHphtthz6yStU3EhxubZ2M3PoMIw== + version "8.14.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.14.0.tgz#fc4c5119b5a1c87604a7bf920ca397783b96b7be" + integrity sha512-PQhR58omMAZzcJOB8GLWzL6l/vjRZ2Uo1eohxOmgPUyeBkHfZAMlvK+OSeneMLIr4azLQ4GISkklwv6lxb8qnw== dependencies: "@ember-data/rfc395-data" "^0.0.4" ember-rfc176-data "^0.3.15" From d4edd5dc0b80eabe618b8e78ba7b70109625a5f7 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 7 Oct 2020 05:11:16 +0000 Subject: [PATCH 721/879] build(deps-dev): bump qunit-dom from 1.4.0 to 1.5.0 Bumps [qunit-dom](https://github.com/simplabs/qunit-dom) from 1.4.0 to 1.5.0. - [Release notes](https://github.com/simplabs/qunit-dom/releases) - [Changelog](https://github.com/simplabs/qunit-dom/blob/master/CHANGELOG.md) - [Commits](https://github.com/simplabs/qunit-dom/compare/v1.4.0...v1.5.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index cffaa2ef5..6ca5ed59a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12295,9 +12295,9 @@ quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quick-temp@^0.1.8: underscore.string "~3.3.4" qunit-dom@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-1.4.0.tgz#912d3e99aac5f3ff8cb3296269ddc3855ae17801" - integrity sha512-kDR6A4IdDZBluyCRCfJLVoplWIAQdAijVfZdRN3yTBIjOyaFQT+BlHR0IsNTFbB7LAa0/6u/UQEYKClYvwjROQ== + version "1.5.0" + resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-1.5.0.tgz#f3e062562c18fb354b7657afd31890d89a24691d" + integrity sha512-VTFApYbzcYkL5Zg7XgZMgLgMI9JXEX+lwBS5bFy5hRkIaz9V38q7rN44svxFBNHWs96y3UaFaAYpOEmlQ0j+fw== dependencies: broccoli-funnel "^3.0.3" broccoli-merge-trees "^4.2.0" From 557af64ef304158e7aa3fd260817f968cd5777f3 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 7 Oct 2020 05:11:37 +0000 Subject: [PATCH 722/879] build(deps-dev): bump ember-composable-helpers from 4.2.2 to 4.3.0 Bumps [ember-composable-helpers](https://github.com/DockYard/ember-composable-helpers) from 4.2.2 to 4.3.0. - [Release notes](https://github.com/DockYard/ember-composable-helpers/releases) - [Changelog](https://github.com/DockYard/ember-composable-helpers/blob/master/CHANGELOG.md) - [Commits](https://github.com/DockYard/ember-composable-helpers/compare/v4.2.2...v4.3.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 6ca5ed59a..cdb37e4dc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6822,9 +6822,9 @@ ember-composable-helpers@^2.4.0: resolve "^1.10.0" ember-composable-helpers@^4.1.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.2.2.tgz#6e1d8cd0372a0b904d89f2391453598f10ba71f0" - integrity sha512-gupkBd9nRRUaRuDXqnHj0BozILKpE18TKizDJPU075JL6YD22gP0JtlhtRFYszlljUHfbHMG6r2Ns38md3kyxA== + version "4.3.0" + resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.3.0.tgz#afe03e14e20639652bed86b84d91633ede2cb129" + integrity sha512-nunPGP3RTf1KbnTzZLcp9/EXBSbOPVs36lVxjxbcW+yo9DV8QRy/kayNJfiU5X5sYf8rLsVs1w0qcFR8exQfxg== dependencies: "@babel/core" "^7.0.0" broccoli-funnel "2.0.1" From 84a85ba256f4fb41f1c0e0be19cbb97747a0825e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 7 Oct 2020 06:43:06 -0400 Subject: [PATCH 723/879] build(deps): bump ember-get-config from 0.2.4 to 0.3.0 (#2063) Bumps [ember-get-config](https://github.com/patience-tema-baron/ember-get-config) from 0.2.4 to 0.3.0. - [Release notes](https://github.com/patience-tema-baron/ember-get-config/releases) - [Commits](https://github.com/patience-tema-baron/ember-get-config/commits) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 6d2365ee5..d0fac5f2a 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "broccoli-merge-trees": "^4.2.0", "ember-auto-import": "^1.2.19", "ember-cli-babel": "^7.5.0", - "ember-get-config": "^0.2.2", + "ember-get-config": "^0.3.0", "ember-inflector": "^2.0.0 || ^3.0.0", "lodash-es": "^4.17.11", "miragejs": "^0.1.31" diff --git a/yarn.lock b/yarn.lock index cdb37e4dc..9b72dcc4f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6219,7 +6219,7 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.18.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.18.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: version "7.22.1" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.22.1.tgz#cad28b89cf0e184c93b863d09bc5ba4ce1d2e453" integrity sha512-kCT8WbC1AYFtyOpU23ESm22a+gL6fWv8Nzwe8QFQ5u0piJzM9MEudfbjADEaoyKTrjMQTDsrWwEf3yjggDsOng== @@ -6915,7 +6915,15 @@ ember-fetch@^6.7.1: node-fetch "^2.6.0" whatwg-fetch "^3.0.0" -ember-get-config@, ember-get-config@^0.2.2, ember-get-config@^0.2.4: +ember-get-config@, ember-get-config@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.3.0.tgz#a73a1a87b48d9dde4c66a0e52ed5260b8a48cfbd" + integrity sha512-0e2pKzwW5lBZ4oJnvu9qHOht4sP1MWz/m3hyz8kpSoMdrlZVf62LDKZ6qfKgy8drcv5YhCMYE6QV7MhnqlrzEQ== + dependencies: + broccoli-file-creator "^1.1.1" + ember-cli-babel "^7.0.0" + +ember-get-config@^0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.2.4.tgz#118492a2a03d73e46004ed777928942021fe1ecd" integrity sha1-EYSSoqA9c+RgBO13eSiUICH+Hs0= From 268fd8f563a04733d876f575e492332578f4197b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 16 Oct 2020 14:54:28 +0000 Subject: [PATCH 724/879] build(deps): bump ember-cli-babel from 7.22.1 to 7.23.0 Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 7.22.1 to 7.23.0. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v7.22.1...v7.23.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 867 +++++++++++++++++++++++++++++------------------------- 1 file changed, 474 insertions(+), 393 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9b72dcc4f..8db41bad6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -28,28 +28,24 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/compat-data@^7.10.4", "@babel/compat-data@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.11.0.tgz#e9f73efe09af1355b723a7f39b11bad637d7c99c" - integrity sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ== - dependencies: - browserslist "^4.12.0" - invariant "^2.2.4" - semver "^5.5.0" +"@babel/compat-data@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.1.tgz#d7386a689aa0ddf06255005b4b991988021101a0" + integrity sha512-725AQupWJZ8ba0jbKceeFblZTY90McUBWMwHhkFQ9q1zKPJ95GUktljFcgcsIVwRnTnRKlcYzfiNImg5G9m6ZQ== -"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.11.0", "@babel/core@^7.2.2", "@babel/core@^7.3.4": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.0.tgz#73b9c33f1658506887f767c26dae07798b30df76" - integrity sha512-mkLq8nwaXmDtFmRkQ8ED/eA2CnVw4zr7dCztKalZXBvdK5EeNUAesrrwUqjQEzFgomJssayzB0aqlOsP1vGLqg== +"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.12.0", "@babel/core@^7.2.2", "@babel/core@^7.3.4": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.1.tgz#980b115a05929ef3ce1b6af9bf50e5a5cf668667" + integrity sha512-6bGmltqzIJrinwRRdczQsMhruSi9Sqty9Te+/5hudn4Izx/JYRhW1QELpR+CIL0gC/c9A7WroH6FmkDGxmWx3w== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.0" - "@babel/helper-module-transforms" "^7.11.0" - "@babel/helpers" "^7.10.4" - "@babel/parser" "^7.11.0" + "@babel/generator" "^7.12.1" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.1" + "@babel/parser" "^7.12.1" "@babel/template" "^7.10.4" - "@babel/traverse" "^7.11.0" - "@babel/types" "^7.11.0" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" @@ -78,6 +74,15 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.1.tgz#0d70be32bdaa03d7c51c8597dda76e0df1f15468" + integrity sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg== + dependencies: + "@babel/types" "^7.12.1" + jsesc "^2.5.1" + source-map "^0.5.0" + "@babel/helper-annotate-as-pure@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" @@ -100,18 +105,17 @@ "@babel/helper-explode-assignable-expression" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helper-compilation-targets@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz#804ae8e3f04376607cc791b9d47d540276332bd2" - integrity sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ== +"@babel/helper-compilation-targets@^7.12.0", "@babel/helper-compilation-targets@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.1.tgz#310e352888fbdbdd8577be8dfdd2afb9e7adcf50" + integrity sha512-jtBEif7jsPwP27GPHs06v4WBV0KrE8a/P7n0N0sSvHn2hwUCYnolP/CLmz51IzAW4NlN+HuoBtb9QcwnRo9F/g== dependencies: - "@babel/compat-data" "^7.10.4" + "@babel/compat-data" "^7.12.1" + "@babel/helper-validator-option" "^7.12.1" browserslist "^4.12.0" - invariant "^2.2.4" - levenary "^1.1.1" semver "^5.5.0" -"@babel/helper-create-class-features-plugin@^7.10.4", "@babel/helper-create-class-features-plugin@^7.10.5": +"@babel/helper-create-class-features-plugin@^7.10.5": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d" integrity sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A== @@ -123,6 +127,17 @@ "@babel/helper-replace-supers" "^7.10.4" "@babel/helper-split-export-declaration" "^7.10.4" +"@babel/helper-create-class-features-plugin@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz#3c45998f431edd4a9214c5f1d3ad1448a6137f6e" + integrity sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-member-expression-to-functions" "^7.12.1" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-split-export-declaration" "^7.10.4" + "@babel/helper-create-class-features-plugin@^7.8.3": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz#243a5b46e2f8f0f674dc1387631eb6b28b851de0" @@ -135,14 +150,14 @@ "@babel/helper-replace-supers" "^7.8.6" "@babel/helper-split-export-declaration" "^7.8.3" -"@babel/helper-create-regexp-features-plugin@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8" - integrity sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g== +"@babel/helper-create-regexp-features-plugin@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz#18b1302d4677f9dc4740fe8c9ed96680e29d37e8" + integrity sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA== dependencies: "@babel/helper-annotate-as-pure" "^7.10.4" "@babel/helper-regex" "^7.10.4" - regexpu-core "^4.7.0" + regexpu-core "^4.7.1" "@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8": version "7.8.8" @@ -232,6 +247,13 @@ dependencies: "@babel/types" "^7.11.0" +"@babel/helper-member-expression-to-functions@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz#fba0f2fcff3fba00e6ecb664bb5e6e26e2d6165c" + integrity sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ== + dependencies: + "@babel/types" "^7.12.1" + "@babel/helper-member-expression-to-functions@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" @@ -239,24 +261,33 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.8.3": +"@babel/helper-module-imports@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz#1644c01591a15a2f084dd6d092d9430eb1d1216c" + integrity sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-module-imports@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== dependencies: "@babel/types" "^7.10.4" -"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5", "@babel/helper-module-transforms@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" - integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg== +"@babel/helper-module-transforms@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" + integrity sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w== dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" - "@babel/helper-simple-access" "^7.10.4" + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-simple-access" "^7.12.1" "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/helper-validator-identifier" "^7.10.4" "@babel/template" "^7.10.4" - "@babel/types" "^7.11.0" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" lodash "^4.17.19" "@babel/helper-optimise-call-expression@^7.10.4": @@ -297,16 +328,14 @@ dependencies: lodash "^4.17.13" -"@babel/helper-remap-async-to-generator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz#fce8bea4e9690bbe923056ded21e54b4e8b68ed5" - integrity sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg== +"@babel/helper-remap-async-to-generator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz#8c4dbbf916314f6047dc05e6a2217074238347fd" + integrity sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A== dependencies: "@babel/helper-annotate-as-pure" "^7.10.4" "@babel/helper-wrap-function" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/types" "^7.12.1" "@babel/helper-replace-supers@^7.10.4": version "7.10.4" @@ -318,6 +347,16 @@ "@babel/traverse" "^7.10.4" "@babel/types" "^7.10.4" +"@babel/helper-replace-supers@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz#f15c9cc897439281891e11d5ce12562ac0cf3fa9" + integrity sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.12.1" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + "@babel/helper-replace-supers@^7.8.6": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" @@ -328,20 +367,19 @@ "@babel/traverse" "^7.8.6" "@babel/types" "^7.8.6" -"@babel/helper-simple-access@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" - integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== +"@babel/helper-simple-access@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz#32427e5aa61547d38eb1e6eaf5fd1426fdad9136" + integrity sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA== dependencies: - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/types" "^7.12.1" -"@babel/helper-skip-transparent-expression-wrappers@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz#eec162f112c2f58d3af0af125e3bb57665146729" - integrity sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q== +"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" + integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA== dependencies: - "@babel/types" "^7.11.0" + "@babel/types" "^7.12.1" "@babel/helper-split-export-declaration@^7.10.1": version "7.10.1" @@ -379,6 +417,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" integrity sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw== +"@babel/helper-validator-option@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz#175567380c3e77d60ff98a54bb015fe78f2178d9" + integrity sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A== + "@babel/helper-wrap-function@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87" @@ -389,14 +432,14 @@ "@babel/traverse" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helpers@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" - integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== +"@babel/helpers@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.1.tgz#8a8261c1d438ec18cb890434df4ec768734c1e79" + integrity sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g== dependencies: "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" "@babel/highlight@^7.10.1": version "7.10.1" @@ -435,26 +478,31 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.0.tgz#a9d7e11aead25d3b422d17b2c6502c8dddef6a5d" integrity sha512-qvRvi4oI8xii8NllyEc4MDJjuZiNaRzyb7Y7lup1NqJV8TZHF4O27CcP+72WPn/k1zkgJ6WJfnIbk4jTsVAZHw== +"@babel/parser@^7.12.1": + version "7.12.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.2.tgz#9d2fcf24cafe85333ab0aff9f26b81bba356004d" + integrity sha512-LMN+SqTiZEonUw4hQA0A3zG8DnN0E1F4K107LbDDUnC+0chML1rvWgsHloC9weB4RmZweE0uhFq0eGX7Nr/PBQ== + "@babel/parser@^7.3.4", "@babel/parser@^7.4.5", "@babel/parser@^7.7.0", "@babel/parser@^7.8.6": version "7.9.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== -"@babel/plugin-proposal-async-generator-functions@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz#3491cabf2f7c179ab820606cec27fed15e0e8558" - integrity sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg== +"@babel/plugin-proposal-async-generator-functions@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz#dc6c1170e27d8aca99ff65f4925bd06b1c90550e" + integrity sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A== dependencies: "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-remap-async-to-generator" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.12.1" "@babel/plugin-syntax-async-generators" "^7.8.0" -"@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.10.4", "@babel/plugin-proposal-class-properties@^7.3.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807" - integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg== +"@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.10.4", "@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.3.4": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" + integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w== dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-create-class-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-proposal-decorators@^7.10.5", "@babel/plugin-proposal-decorators@^7.3.0": @@ -466,42 +514,42 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-decorators" "^7.10.4" -"@babel/plugin-proposal-dynamic-import@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz#ba57a26cb98b37741e9d5bca1b8b0ddf8291f17e" - integrity sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ== +"@babel/plugin-proposal-dynamic-import@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz#43eb5c2a3487ecd98c5c8ea8b5fdb69a2749b2dc" + integrity sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-dynamic-import" "^7.8.0" -"@babel/plugin-proposal-export-namespace-from@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz#570d883b91031637b3e2958eea3c438e62c05f54" - integrity sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg== +"@babel/plugin-proposal-export-namespace-from@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz#8b9b8f376b2d88f5dd774e4d24a5cc2e3679b6d4" + integrity sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz#593e59c63528160233bd321b1aebe0820c2341db" - integrity sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw== +"@babel/plugin-proposal-json-strings@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz#d45423b517714eedd5621a9dfdc03fa9f4eb241c" + integrity sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.0" -"@babel/plugin-proposal-logical-assignment-operators@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz#9f80e482c03083c87125dee10026b58527ea20c8" - integrity sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q== +"@babel/plugin-proposal-logical-assignment-operators@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz#f2c490d36e1b3c9659241034a5d2cd50263a2751" + integrity sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz#02a7e961fc32e6d5b2db0649e01bf80ddee7e04a" - integrity sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz#3ed4fff31c015e7f3f1467f190dbe545cd7b046c" + integrity sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" @@ -514,38 +562,38 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/plugin-proposal-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz#ce1590ff0a65ad12970a609d78855e9a4c1aef06" - integrity sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA== +"@babel/plugin-proposal-numeric-separator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz#0e2c6774c4ce48be412119b4d693ac777f7685a6" + integrity sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz#bd81f95a1f746760ea43b6c2d3d62b11790ad0af" - integrity sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA== +"@babel/plugin-proposal-object-rest-spread@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" + integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.10.4" + "@babel/plugin-transform-parameters" "^7.12.1" -"@babel/plugin-proposal-optional-catch-binding@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz#31c938309d24a78a49d68fdabffaa863758554dd" - integrity sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g== +"@babel/plugin-proposal-optional-catch-binding@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz#ccc2421af64d3aae50b558a71cede929a5ab2942" + integrity sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz#de5866d0646f6afdaab8a566382fe3a221755076" - integrity sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA== +"@babel/plugin-proposal-optional-chaining@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz#cce122203fc8a32794296fc377c6dedaf4363797" + integrity sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw== dependencies: "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" "@babel/plugin-syntax-optional-chaining" "^7.8.0" "@babel/plugin-proposal-optional-chaining@^7.6.0": @@ -556,20 +604,20 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-private-methods@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz#b160d972b8fdba5c7d111a145fc8c421fc2a6909" - integrity sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw== +"@babel/plugin-proposal-private-methods@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz#86814f6e7a21374c980c10d38b4493e703f4a389" + integrity sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w== dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-create-class-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-proposal-unicode-property-regex@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz#4483cda53041ce3413b7fe2f00022665ddfaa75d" - integrity sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA== +"@babel/plugin-proposal-unicode-property-regex@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz#2a183958d417765b9eae334f47758e5d6a82e072" + integrity sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-create-regexp-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-proposal-unicode-property-regex@^7.4.4": @@ -587,10 +635,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c" - integrity sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA== +"@babel/plugin-syntax-class-properties@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz#bcb297c5366e79bebadef509549cd93b04f19978" + integrity sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA== dependencies: "@babel/helper-plugin-utils" "^7.10.4" @@ -664,17 +712,17 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz#4bbeb8917b54fcf768364e0a81f560e33a3ef57d" - integrity sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ== +"@babel/plugin-syntax-top-level-await@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz#dd6c0b357ac1bb142d98537450a319625d13d2a0" + integrity sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-typescript@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz#2f55e770d3501e83af217d782cb7517d7bb34d25" - integrity sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ== +"@babel/plugin-syntax-typescript@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.1.tgz#460ba9d77077653803c3dd2e673f76d66b4029e5" + integrity sha512-UZNEcCY+4Dp9yYRCAHrHDU+9ZXLYaY9MgBXSRLkB9WjYFRR6quJBumfVrEkUxrePPBwFcpWfNKXqVRQQtm7mMA== dependencies: "@babel/helper-plugin-utils" "^7.10.4" @@ -685,70 +733,77 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-arrow-functions@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz#e22960d77e697c74f41c501d44d73dbf8a6a64cd" - integrity sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA== +"@babel/plugin-transform-arrow-functions@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz#8083ffc86ac8e777fbe24b5967c4b2521f3cb2b3" + integrity sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-async-to-generator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz#41a5017e49eb6f3cda9392a51eef29405b245a37" - integrity sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ== +"@babel/plugin-transform-async-to-generator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz#3849a49cc2a22e9743cbd6b52926d30337229af1" + integrity sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A== dependencies: - "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-module-imports" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-remap-async-to-generator" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.12.1" -"@babel/plugin-transform-block-scoped-functions@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz#1afa595744f75e43a91af73b0d998ecfe4ebc2e8" - integrity sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA== +"@babel/plugin-transform-block-scoped-functions@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz#f2a1a365bde2b7112e0a6ded9067fdd7c07905d9" + integrity sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-block-scoping@^7.10.4", "@babel/plugin-transform-block-scoping@^7.6.2", "@babel/plugin-transform-block-scoping@^7.8.3": +"@babel/plugin-transform-block-scoping@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz#f0ee727874b42a208a48a586b84c3d222c2bbef1" + integrity sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-block-scoping@^7.6.2", "@babel/plugin-transform-block-scoping@^7.8.3": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.5.tgz#b81b8aafefbfe68f0f65f7ef397b9ece68a6037d" integrity sha512-6Ycw3hjpQti0qssQcA6AMSFDHeNJ++R6dIMnpRqUjFeBBTmTDPa8zgF90OVfTvAo11mXZTlVUViY1g8ffrURLg== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-classes@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz#405136af2b3e218bc4a1926228bc917ab1a0adc7" - integrity sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA== +"@babel/plugin-transform-classes@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz#65e650fcaddd3d88ddce67c0f834a3d436a32db6" + integrity sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog== dependencies: "@babel/helper-annotate-as-pure" "^7.10.4" "@babel/helper-define-map" "^7.10.4" "@babel/helper-function-name" "^7.10.4" "@babel/helper-optimise-call-expression" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-replace-supers" "^7.12.1" "@babel/helper-split-export-declaration" "^7.10.4" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz#9ded83a816e82ded28d52d4b4ecbdd810cdfc0eb" - integrity sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw== +"@babel/plugin-transform-computed-properties@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz#d68cf6c9b7f838a8a4144badbe97541ea0904852" + integrity sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-destructuring@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz#70ddd2b3d1bea83d01509e9bb25ddb3a74fc85e5" - integrity sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA== +"@babel/plugin-transform-destructuring@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz#b9a570fe0d0a8d460116413cb4f97e8e08b2f847" + integrity sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-dotall-regex@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz#469c2062105c1eb6a040eaf4fac4b488078395ee" - integrity sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA== +"@babel/plugin-transform-dotall-regex@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz#a1d16c14862817b6409c0a678d6f9373ca9cd975" + integrity sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-create-regexp-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-dotall-regex@^7.4.4": @@ -759,98 +814,99 @@ "@babel/helper-create-regexp-features-plugin" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-duplicate-keys@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz#697e50c9fee14380fe843d1f306b295617431e47" - integrity sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA== +"@babel/plugin-transform-duplicate-keys@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz#745661baba295ac06e686822797a69fbaa2ca228" + integrity sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-exponentiation-operator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz#5ae338c57f8cf4001bdb35607ae66b92d665af2e" - integrity sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw== +"@babel/plugin-transform-exponentiation-operator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz#b0f2ed356ba1be1428ecaf128ff8a24f02830ae0" + integrity sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug== dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-for-of@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz#c08892e8819d3a5db29031b115af511dbbfebae9" - integrity sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ== +"@babel/plugin-transform-for-of@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz#07640f28867ed16f9511c99c888291f560921cfa" + integrity sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-function-name@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz#6a467880e0fc9638514ba369111811ddbe2644b7" - integrity sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg== +"@babel/plugin-transform-function-name@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz#2ec76258c70fe08c6d7da154003a480620eba667" + integrity sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw== dependencies: "@babel/helper-function-name" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-literals@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz#9f42ba0841100a135f22712d0e391c462f571f3c" - integrity sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ== +"@babel/plugin-transform-literals@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz#d73b803a26b37017ddf9d3bb8f4dc58bfb806f57" + integrity sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz#b1ec44fcf195afcb8db2c62cd8e551c881baf8b7" - integrity sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw== +"@babel/plugin-transform-member-expression-literals@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz#496038602daf1514a64d43d8e17cbb2755e0c3ad" + integrity sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-modules-amd@^7.0.0", "@babel/plugin-transform-modules-amd@^7.10.4", "@babel/plugin-transform-modules-amd@^7.10.5": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz#1b9cddaf05d9e88b3aad339cb3e445c4f020a9b1" - integrity sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw== +"@babel/plugin-transform-modules-amd@^7.0.0", "@babel/plugin-transform-modules-amd@^7.10.5", "@babel/plugin-transform-modules-amd@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz#3154300b026185666eebb0c0ed7f8415fefcf6f9" + integrity sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ== dependencies: - "@babel/helper-module-transforms" "^7.10.5" + "@babel/helper-module-transforms" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0" - integrity sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w== +"@babel/plugin-transform-modules-commonjs@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz#fa403124542636c786cf9b460a0ffbb48a86e648" + integrity sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag== dependencies: - "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-module-transforms" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-simple-access" "^7.10.4" + "@babel/helper-simple-access" "^7.12.1" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz#6270099c854066681bae9e05f87e1b9cadbe8c85" - integrity sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw== +"@babel/plugin-transform-modules-systemjs@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz#663fea620d593c93f214a464cd399bf6dc683086" + integrity sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q== dependencies: "@babel/helper-hoist-variables" "^7.10.4" - "@babel/helper-module-transforms" "^7.10.5" + "@babel/helper-module-transforms" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-validator-identifier" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz#9a8481fe81b824654b3a0b65da3df89f3d21839e" - integrity sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA== +"@babel/plugin-transform-modules-umd@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz#eb5a218d6b1c68f3d6217b8fa2cc82fec6547902" + integrity sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q== dependencies: - "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-module-transforms" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-named-capturing-groups-regex@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz#78b4d978810b6f3bcf03f9e318f2fc0ed41aecb6" - integrity sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA== +"@babel/plugin-transform-named-capturing-groups-regex@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz#b407f5c96be0d9f5f88467497fa82b30ac3e8753" + integrity sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-create-regexp-features-plugin" "^7.12.1" -"@babel/plugin-transform-new-target@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz#9097d753cb7b024cb7381a3b2e52e9513a9c6888" - integrity sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw== +"@babel/plugin-transform-new-target@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz#80073f02ee1bb2d365c3416490e085c95759dec0" + integrity sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw== dependencies: "@babel/helper-plugin-utils" "^7.10.4" @@ -861,99 +917,97 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-object-super@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz#d7146c4d139433e7a6526f888c667e314a093894" - integrity sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ== +"@babel/plugin-transform-object-super@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz#4ea08696b8d2e65841d0c7706482b048bed1066e" + integrity sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw== dependencies: "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-replace-supers" "^7.12.1" -"@babel/plugin-transform-parameters@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz#59d339d58d0b1950435f4043e74e2510005e2c4a" - integrity sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw== +"@babel/plugin-transform-parameters@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz#d2e963b038771650c922eff593799c96d853255d" + integrity sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg== dependencies: - "@babel/helper-get-function-arity" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-property-literals@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz#f6fe54b6590352298785b83edd815d214c42e3c0" - integrity sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g== +"@babel/plugin-transform-property-literals@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz#41bc81200d730abb4456ab8b3fbd5537b59adecd" + integrity sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-regenerator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz#2015e59d839074e76838de2159db421966fd8b63" - integrity sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw== +"@babel/plugin-transform-regenerator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz#5f0a28d842f6462281f06a964e88ba8d7ab49753" + integrity sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng== dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz#8f2682bcdcef9ed327e1b0861585d7013f8a54dd" - integrity sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ== +"@babel/plugin-transform-reserved-words@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz#6fdfc8cc7edcc42b36a7c12188c6787c873adcd8" + integrity sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-runtime@^7.11.0", "@babel/plugin-transform-runtime@^7.2.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.0.tgz#e27f78eb36f19448636e05c33c90fd9ad9b8bccf" - integrity sha512-LFEsP+t3wkYBlis8w6/kmnd6Kb1dxTd+wGJ8MlxTGzQo//ehtqlVL4S9DNUa53+dtPSQobN2CXx4d81FqC58cw== +"@babel/plugin-transform-runtime@^7.12.0", "@babel/plugin-transform-runtime@^7.2.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz#04b792057eb460389ff6a4198e377614ea1e7ba5" + integrity sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg== dependencies: - "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-module-imports" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" resolve "^1.8.1" semver "^5.5.1" -"@babel/plugin-transform-shorthand-properties@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz#9fd25ec5cdd555bb7f473e5e6ee1c971eede4dd6" - integrity sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q== +"@babel/plugin-transform-shorthand-properties@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz#0bf9cac5550fce0cfdf043420f661d645fdc75e3" + integrity sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-spread@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz#fa84d300f5e4f57752fe41a6d1b3c554f13f17cc" - integrity sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw== +"@babel/plugin-transform-spread@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz#527f9f311be4ec7fdc2b79bb89f7bf884b3e1e1e" + integrity sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng== dependencies: "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" -"@babel/plugin-transform-sticky-regex@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz#8f3889ee8657581130a29d9cc91d7c73b7c4a28d" - integrity sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ== +"@babel/plugin-transform-sticky-regex@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.1.tgz#5c24cf50de396d30e99afc8d1c700e8bce0f5caf" + integrity sha512-CiUgKQ3AGVk7kveIaPEET1jNDhZZEl1RPMWdTBE1799bdz++SwqDHStmxfCtDfBhQgCl38YRiSnrMuUMZIWSUQ== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-regex" "^7.10.4" -"@babel/plugin-transform-template-literals@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz#78bc5d626a6642db3312d9d0f001f5e7639fde8c" - integrity sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw== +"@babel/plugin-transform-template-literals@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz#b43ece6ed9a79c0c71119f576d299ef09d942843" + integrity sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-typeof-symbol@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz#9509f1a7eec31c4edbffe137c16cc33ff0bc5bfc" - integrity sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA== +"@babel/plugin-transform-typeof-symbol@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz#9ca6be343d42512fbc2e68236a82ae64bc7af78a" + integrity sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-typescript@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz#2b4879676af37342ebb278216dd090ac67f13abb" - integrity sha512-edJsNzTtvb3MaXQwj8403B7mZoGu9ElDJQZOKjGUnvilquxBA3IQoEIOvkX/1O8xfAsnHS/oQhe2w/IXrr+w0w== +"@babel/plugin-transform-typescript@^7.12.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.1.tgz#d92cc0af504d510e26a754a7dbc2e5c8cd9c7ab4" + integrity sha512-VrsBByqAIntM+EYMqSm59SiMEf7qkmI9dqMt6RbD/wlwueWmYcI0FFK5Fj47pP6DRZm+3teXjosKlwcZJ5lIMw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.5" + "@babel/helper-create-class-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-typescript" "^7.10.4" + "@babel/plugin-syntax-typescript" "^7.12.1" "@babel/plugin-transform-typescript@~7.4.0": version "7.4.5" @@ -972,53 +1026,54 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-typescript" "^7.8.3" -"@babel/plugin-transform-unicode-escapes@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz#feae523391c7651ddac115dae0a9d06857892007" - integrity sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg== +"@babel/plugin-transform-unicode-escapes@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz#5232b9f81ccb07070b7c3c36c67a1b78f1845709" + integrity sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-unicode-regex@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz#e56d71f9282fac6db09c82742055576d5e6d80a8" - integrity sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A== +"@babel/plugin-transform-unicode-regex@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz#cc9661f61390db5c65e3febaccefd5c6ac3faecb" + integrity sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-create-regexp-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/polyfill@^7.0.0", "@babel/polyfill@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.10.4.tgz#915e5bfe61490ac0199008e35ca9d7d151a8e45a" - integrity sha512-8BYcnVqQ5kMD2HXoHInBH7H1b/uP3KdnwCYXOqFnXqguOyuu443WXusbIUbWEfY3Z0Txk0M1uG/8YuAMhNl6zg== +"@babel/polyfill@^7.0.0", "@babel/polyfill@^7.11.5": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.12.1.tgz#1f2d6371d1261bbd961f3c5d5909150e12d0bd96" + integrity sha512-X0pi0V6gxLi6lFZpGmeNa4zxtwEmCs42isWLNjZZDE0Y8yVfgu0T2OAHlzBbdYlqbW/YXVvoBHpATEM+goCj8g== dependencies: core-js "^2.6.5" regenerator-runtime "^0.13.4" -"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.10.2", "@babel/preset-env@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.11.0.tgz#860ee38f2ce17ad60480c2021ba9689393efb796" - integrity sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg== +"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.10.2", "@babel/preset-env@^7.12.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.1.tgz#9c7e5ca82a19efc865384bb4989148d2ee5d7ac2" + integrity sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg== dependencies: - "@babel/compat-data" "^7.11.0" - "@babel/helper-compilation-targets" "^7.10.4" - "@babel/helper-module-imports" "^7.10.4" + "@babel/compat-data" "^7.12.1" + "@babel/helper-compilation-targets" "^7.12.1" + "@babel/helper-module-imports" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-proposal-async-generator-functions" "^7.10.4" - "@babel/plugin-proposal-class-properties" "^7.10.4" - "@babel/plugin-proposal-dynamic-import" "^7.10.4" - "@babel/plugin-proposal-export-namespace-from" "^7.10.4" - "@babel/plugin-proposal-json-strings" "^7.10.4" - "@babel/plugin-proposal-logical-assignment-operators" "^7.11.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.4" - "@babel/plugin-proposal-numeric-separator" "^7.10.4" - "@babel/plugin-proposal-object-rest-spread" "^7.11.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.10.4" - "@babel/plugin-proposal-optional-chaining" "^7.11.0" - "@babel/plugin-proposal-private-methods" "^7.10.4" - "@babel/plugin-proposal-unicode-property-regex" "^7.10.4" + "@babel/helper-validator-option" "^7.12.1" + "@babel/plugin-proposal-async-generator-functions" "^7.12.1" + "@babel/plugin-proposal-class-properties" "^7.12.1" + "@babel/plugin-proposal-dynamic-import" "^7.12.1" + "@babel/plugin-proposal-export-namespace-from" "^7.12.1" + "@babel/plugin-proposal-json-strings" "^7.12.1" + "@babel/plugin-proposal-logical-assignment-operators" "^7.12.1" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" + "@babel/plugin-proposal-numeric-separator" "^7.12.1" + "@babel/plugin-proposal-object-rest-spread" "^7.12.1" + "@babel/plugin-proposal-optional-catch-binding" "^7.12.1" + "@babel/plugin-proposal-optional-chaining" "^7.12.1" + "@babel/plugin-proposal-private-methods" "^7.12.1" + "@babel/plugin-proposal-unicode-property-regex" "^7.12.1" "@babel/plugin-syntax-async-generators" "^7.8.0" - "@babel/plugin-syntax-class-properties" "^7.10.4" + "@babel/plugin-syntax-class-properties" "^7.12.1" "@babel/plugin-syntax-dynamic-import" "^7.8.0" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-syntax-json-strings" "^7.8.0" @@ -1028,45 +1083,42 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-syntax-top-level-await" "^7.10.4" - "@babel/plugin-transform-arrow-functions" "^7.10.4" - "@babel/plugin-transform-async-to-generator" "^7.10.4" - "@babel/plugin-transform-block-scoped-functions" "^7.10.4" - "@babel/plugin-transform-block-scoping" "^7.10.4" - "@babel/plugin-transform-classes" "^7.10.4" - "@babel/plugin-transform-computed-properties" "^7.10.4" - "@babel/plugin-transform-destructuring" "^7.10.4" - "@babel/plugin-transform-dotall-regex" "^7.10.4" - "@babel/plugin-transform-duplicate-keys" "^7.10.4" - "@babel/plugin-transform-exponentiation-operator" "^7.10.4" - "@babel/plugin-transform-for-of" "^7.10.4" - "@babel/plugin-transform-function-name" "^7.10.4" - "@babel/plugin-transform-literals" "^7.10.4" - "@babel/plugin-transform-member-expression-literals" "^7.10.4" - "@babel/plugin-transform-modules-amd" "^7.10.4" - "@babel/plugin-transform-modules-commonjs" "^7.10.4" - "@babel/plugin-transform-modules-systemjs" "^7.10.4" - "@babel/plugin-transform-modules-umd" "^7.10.4" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.4" - "@babel/plugin-transform-new-target" "^7.10.4" - "@babel/plugin-transform-object-super" "^7.10.4" - "@babel/plugin-transform-parameters" "^7.10.4" - "@babel/plugin-transform-property-literals" "^7.10.4" - "@babel/plugin-transform-regenerator" "^7.10.4" - "@babel/plugin-transform-reserved-words" "^7.10.4" - "@babel/plugin-transform-shorthand-properties" "^7.10.4" - "@babel/plugin-transform-spread" "^7.11.0" - "@babel/plugin-transform-sticky-regex" "^7.10.4" - "@babel/plugin-transform-template-literals" "^7.10.4" - "@babel/plugin-transform-typeof-symbol" "^7.10.4" - "@babel/plugin-transform-unicode-escapes" "^7.10.4" - "@babel/plugin-transform-unicode-regex" "^7.10.4" + "@babel/plugin-syntax-top-level-await" "^7.12.1" + "@babel/plugin-transform-arrow-functions" "^7.12.1" + "@babel/plugin-transform-async-to-generator" "^7.12.1" + "@babel/plugin-transform-block-scoped-functions" "^7.12.1" + "@babel/plugin-transform-block-scoping" "^7.12.1" + "@babel/plugin-transform-classes" "^7.12.1" + "@babel/plugin-transform-computed-properties" "^7.12.1" + "@babel/plugin-transform-destructuring" "^7.12.1" + "@babel/plugin-transform-dotall-regex" "^7.12.1" + "@babel/plugin-transform-duplicate-keys" "^7.12.1" + "@babel/plugin-transform-exponentiation-operator" "^7.12.1" + "@babel/plugin-transform-for-of" "^7.12.1" + "@babel/plugin-transform-function-name" "^7.12.1" + "@babel/plugin-transform-literals" "^7.12.1" + "@babel/plugin-transform-member-expression-literals" "^7.12.1" + "@babel/plugin-transform-modules-amd" "^7.12.1" + "@babel/plugin-transform-modules-commonjs" "^7.12.1" + "@babel/plugin-transform-modules-systemjs" "^7.12.1" + "@babel/plugin-transform-modules-umd" "^7.12.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.1" + "@babel/plugin-transform-new-target" "^7.12.1" + "@babel/plugin-transform-object-super" "^7.12.1" + "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/plugin-transform-property-literals" "^7.12.1" + "@babel/plugin-transform-regenerator" "^7.12.1" + "@babel/plugin-transform-reserved-words" "^7.12.1" + "@babel/plugin-transform-shorthand-properties" "^7.12.1" + "@babel/plugin-transform-spread" "^7.12.1" + "@babel/plugin-transform-sticky-regex" "^7.12.1" + "@babel/plugin-transform-template-literals" "^7.12.1" + "@babel/plugin-transform-typeof-symbol" "^7.12.1" + "@babel/plugin-transform-unicode-escapes" "^7.12.1" + "@babel/plugin-transform-unicode-regex" "^7.12.1" "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.11.0" - browserslist "^4.12.0" + "@babel/types" "^7.12.1" core-js-compat "^3.6.2" - invariant "^2.2.2" - levenary "^1.1.1" semver "^5.5.0" "@babel/preset-modules@^0.1.3": @@ -1080,10 +1132,10 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/runtime@^7.11.0", "@babel/runtime@^7.2.0", "@babel/runtime@^7.8.4": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.0.tgz#f10245877042a815e07f7e693faff0ae9d3a2aac" - integrity sha512-qArkXsjJq7H+T86WrIFV0Fnu/tNOkZ4cgXmjkzAu3b/58D5mFIO8JH/y77t7C9q0OdDRdh9s7Ue5GasYssxtXw== +"@babel/runtime@^7.12.0", "@babel/runtime@^7.2.0", "@babel/runtime@^7.8.4": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.1.tgz#b4116a6b6711d010b2dad3b7b6e43bf1b9954740" + integrity sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA== dependencies: regenerator-runtime "^0.13.4" @@ -1129,7 +1181,7 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.0": +"@babel/traverse@^7.10.4": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.0.tgz#9b996ce1b98f53f7c3e4175115605d56ed07dd24" integrity sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg== @@ -1144,6 +1196,21 @@ globals "^11.1.0" lodash "^4.17.19" +"@babel/traverse@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.1.tgz#941395e0c5cc86d5d3e75caa095d3924526f0c1e" + integrity sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.1" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/parser" "^7.12.1" + "@babel/types" "^7.12.1" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + "@babel/types@^7.1.6", "@babel/types@^7.10.1", "@babel/types@^7.10.2", "@babel/types@^7.3.2", "@babel/types@^7.3.4", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6": version "7.10.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.2.tgz#30283be31cad0dbf6fb00bd40641ca0ea675172d" @@ -1162,6 +1229,15 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" +"@babel/types@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.1.tgz#e109d9ab99a8de735be287ee3d6a9947a190c4ae" + integrity sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + "@babel/types@^7.7.2": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.4.tgz#369517188352e18219981efd156bfdb199fff1ee" @@ -2957,12 +3033,12 @@ babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-p dependencies: ember-rfc176-data "^0.3.13" -babel-plugin-ember-modules-api-polyfill@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-3.1.1.tgz#c6e9ede43b64c4e36512f260e42e829b071d9b4f" - integrity sha512-hRTnr59fJ6cIiSiSgQLM9QRiVv/RrBAYRYggCPQDj4dvYhOWZeoX6e+1jFY1qC3tJnSDuMWu3OrDciSIi1MJ0A== +babel-plugin-ember-modules-api-polyfill@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-3.2.0.tgz#302cb58a3c0fa33d93ab5115f1e91d76c6ec766b" + integrity sha512-k5gyC1kUDyZDcdD8LMGTI7KA+cHdKainuWpmc7d5yv42WgZFO75njPi3hZchEGsFFXtSqm9jiahgvLBUV8E8mA== dependencies: - ember-rfc176-data "^0.3.15" + ember-rfc176-data "^0.3.16" babel-plugin-feature-flags@^0.3.1: version "0.3.1" @@ -3667,13 +3743,13 @@ broccoli-babel-transpiler@^6.5.0: rsvp "^4.8.2" workerpool "^2.3.0" -broccoli-babel-transpiler@^7.1.2, broccoli-babel-transpiler@^7.7.0: - version "7.7.0" - resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.7.0.tgz#271d401e713bfd338d5ef0435d3c4c68f6eddd2a" - integrity sha512-U8Cmnv0/AcQKehiIVi6UDzqq3jqhAEbY9CvOW5vdeNRmYhFpK6bXPmVczS/nUz5g4KsPc/FdnC3zbU6yVf4e7w== +broccoli-babel-transpiler@^7.1.2, broccoli-babel-transpiler@^7.8.0: + version "7.8.0" + resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.8.0.tgz#7e0f01fce5739f49bbadeee7f1e625ca51cad66e" + integrity sha512-dv30Td5uL7dO3NzQUqQKQs+Iq7JGKnCNtvc6GBO76uVPqGnRlsQZcYqdBVr33JrctR+ZrpTUf7TjsFKeDRFA8Q== dependencies: - "@babel/core" "^7.11.0" - "@babel/polyfill" "^7.10.4" + "@babel/core" "^7.12.0" + "@babel/polyfill" "^7.11.5" broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.2" broccoli-persistent-filter "^2.2.1" @@ -6168,10 +6244,10 @@ ember-cli-autoprefixer@^0.8.1: broccoli-autoprefixer "^5.0.0" lodash "^4.0.0" -ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.0.tgz#de3baedd093163b6c2461f95964888c1676325ac" - integrity sha512-Zr4my8Xn+CzO0gIuFNXji0eTRml5AxZUTDQz/wsNJ5AJAtyFWCY4QtKdoELNNbiCVGt1lq5yLiwTm4scGKu6xA== +ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.0, ember-cli-babel-plugin-helpers@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.1.tgz#5016b80cdef37036c4282eef2d863e1d73576879" + integrity sha512-sKvOiPNHr5F/60NLd7SFzMpYPte/nnGkq/tMIfXejfKHIhaiIkYFqX8Z9UFTKWLLn+V7NOaby6niNPZUdvKCRw== ember-cli-babel@7.7.3: version "7.7.3" @@ -6220,31 +6296,31 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, semver "^5.5.0" ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.18.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: - version "7.22.1" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.22.1.tgz#cad28b89cf0e184c93b863d09bc5ba4ce1d2e453" - integrity sha512-kCT8WbC1AYFtyOpU23ESm22a+gL6fWv8Nzwe8QFQ5u0piJzM9MEudfbjADEaoyKTrjMQTDsrWwEf3yjggDsOng== + version "7.23.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.23.0.tgz#ec580aa2c115d0810e454dd5c2fffce238284b92" + integrity sha512-ix58DlRDAbGITtdJoRUPcAoQwKLYr/x/kIXjU9u1ATyhmuUjqb+0FDXghOWbkNihGiNOqBBR49+LBgK9AeBcNw== dependencies: - "@babel/core" "^7.11.0" - "@babel/helper-compilation-targets" "^7.10.4" + "@babel/core" "^7.12.0" + "@babel/helper-compilation-targets" "^7.12.0" "@babel/plugin-proposal-class-properties" "^7.10.4" "@babel/plugin-proposal-decorators" "^7.10.5" "@babel/plugin-transform-modules-amd" "^7.10.5" - "@babel/plugin-transform-runtime" "^7.11.0" - "@babel/plugin-transform-typescript" "^7.11.0" - "@babel/polyfill" "^7.10.4" - "@babel/preset-env" "^7.11.0" - "@babel/runtime" "^7.11.0" + "@babel/plugin-transform-runtime" "^7.12.0" + "@babel/plugin-transform-typescript" "^7.12.0" + "@babel/polyfill" "^7.11.5" + "@babel/preset-env" "^7.12.0" + "@babel/runtime" "^7.12.0" amd-name-resolver "^1.2.1" babel-plugin-debug-macros "^0.3.3" babel-plugin-ember-data-packages-polyfill "^0.1.2" - babel-plugin-ember-modules-api-polyfill "^3.1.1" + babel-plugin-ember-modules-api-polyfill "^3.2.0" babel-plugin-module-resolver "^3.1.1" - broccoli-babel-transpiler "^7.7.0" + broccoli-babel-transpiler "^7.8.0" broccoli-debug "^0.6.4" broccoli-funnel "^2.0.1" broccoli-source "^1.1.0" clone "^2.1.2" - ember-cli-babel-plugin-helpers "^1.1.0" + ember-cli-babel-plugin-helpers "^1.1.1" ember-cli-version-checker "^4.1.0" ensure-posix-path "^1.0.2" fixturify-project "^1.10.0" @@ -7089,6 +7165,11 @@ ember-rfc176-data@^0.3.13, ember-rfc176-data@^0.3.15: resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.15.tgz#af3f1da5a0339b6feda380edc2f7190e0f416c2d" integrity sha512-GPKa7zRDBblRy0orxTXt5yrpp/Pf5CkuRFSIR8qMFDww0CqCKjCRwdZnWYzCM4kAEfZnXRIDDefe1tBaFw7v7w== +ember-rfc176-data@^0.3.16: + version "0.3.16" + resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.16.tgz#2ace0ac9cf9016d493a74a1d931643a308679803" + integrity sha512-IYAzffS90r2ybAcx8c2qprYfkxa70G+/UPkxMN1hw55DU5S2aLOX6v3umKDZItoRhrvZMCnzwsdfKSrKdC9Wbg== + ember-router-generator@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-2.0.0.tgz#d04abfed4ba8b42d166477bbce47fccc672dbde0" @@ -9272,7 +9353,7 @@ into-stream@^3.1.0: from2 "^2.1.1" p-is-promise "^1.1.0" -invariant@^2.2.2, invariant@^2.2.4: +invariant@^2.2.2: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -10046,18 +10127,6 @@ leek@0.0.24: lodash.assign "^3.2.0" rsvp "^3.0.21" -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levenary@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" - integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== - dependencies: - leven "^3.1.0" - levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -12569,6 +12638,18 @@ regexpu-core@^4.7.0: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.2.0" +regexpu-core@^4.7.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" + integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + registry-auth-token@^3.0.1: version "3.4.0" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" From aa7283340291202ee5b98300131b308e66c31310 Mon Sep 17 00:00:00 2001 From: Brian Gantzler Date: Sat, 17 Oct 2020 16:29:49 -0400 Subject: [PATCH 725/879] Only run acceptance test for ember-source > 3.16.0 (#2067) --- package.json | 1 + tests/acceptance/home-test.js | 15 +++++++++++---- yarn.lock | 9 +++++++++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index d0fac5f2a..a52f8ea62 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,7 @@ "ember-cli-moment-shim": "^3.8.0", "ember-cli-sri": "^2.1.1", "ember-cli-uglify": "^3.0.0", + "ember-compatibility-helpers": "^1.2.1", "ember-composable-helpers": "^4.1.2", "ember-data": "~3.14.0", "ember-disable-prototype-extensions": "^1.1.3", diff --git a/tests/acceptance/home-test.js b/tests/acceptance/home-test.js index 0d006f91a..e88eb27d7 100644 --- a/tests/acceptance/home-test.js +++ b/tests/acceptance/home-test.js @@ -1,13 +1,20 @@ import { module, test } from "qunit"; import { visit, currentURL } from "@ember/test-helpers"; import { setupApplicationTest } from "ember-qunit"; +import { + // General functions for checking against Ember version + gte +} from 'ember-compatibility-helpers'; module("Acceptance | home", function(hooks) { setupApplicationTest(hooks); - test("the homepage renders without error", async function(assert) { - await visit("/"); + // Ember Addon docs will fail for sources less then 3.16.0 + if (gte('3.16.0')) { + test("the homepage renders without error", async function(assert) { + await visit("/"); - assert.equal(currentURL(), "/"); - }); + assert.equal(currentURL(), "/", "Correct URL is shown"); + }); + } }); diff --git a/yarn.lock b/yarn.lock index 8db41bad6..625d3842c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6863,6 +6863,15 @@ ember-compatibility-helpers@^1.0.2, ember-compatibility-helpers@^1.1.1, ember-co ember-cli-version-checker "^2.1.1" semver "^5.4.1" +ember-compatibility-helpers@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.2.1.tgz#87c92c4303f990ff455c28ca39fb3ee11441aa16" + integrity sha512-6wzYvnhg1ihQUT5yGqnLtleq3Nv5KNv79WhrEuNU9SwR4uIxCO+KpyC7r3d5VI0EM7/Nmv9Nd0yTkzmTMdVG1A== + dependencies: + babel-plugin-debug-macros "^0.2.0" + ember-cli-version-checker "^2.1.1" + semver "^5.4.1" + ember-component-css@^0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/ember-component-css/-/ember-component-css-0.7.4.tgz#b8e94b062468721df6c9ea0c8739226c96809c9f" From 8007476914ccc0a5e07b06ccc88c404c31841eae Mon Sep 17 00:00:00 2001 From: Brian Gantzler Date: Mon, 19 Oct 2020 11:49:37 -0400 Subject: [PATCH 726/879] Update ember-cli-addon-docs to 0.8.0 (#2068) --- package.json | 2 +- yarn.lock | 157 ++++++++------------------------------------------- 2 files changed, 24 insertions(+), 135 deletions(-) diff --git a/package.json b/package.json index a52f8ea62..ac7902ec7 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "broccoli-asset-rev": "^3.0.0", "ember-ajax": "^5.0.0", "ember-cli": "~3.4.4", - "ember-cli-addon-docs": "^0.7.0", + "ember-cli-addon-docs": "^0.8.0", "ember-cli-addon-docs-esdoc": "^0.2.3", "ember-cli-dependency-checker": "^3.0.0", "ember-cli-deploy": "^1.0.2", diff --git a/yarn.lock b/yarn.lock index 625d3842c..0d73c684d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2525,15 +2525,6 @@ aot-test-generators@^0.1.0: dependencies: jsesc "^2.5.0" -applause@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/applause/-/applause-1.2.2.tgz#a8468579e81f67397bb5634c29953bedcd0f56c0" - integrity sha1-qEaFeegfZzl7tWNMKZU77c0PVsA= - dependencies: - cson-parser "^1.1.0" - js-yaml "^3.3.0" - lodash "^3.10.0" - aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -3066,10 +3057,10 @@ babel-plugin-htmlbars-inline-precompile@^1.0.0: resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-1.0.0.tgz#a9d2f6eaad8a3f3d361602de593a8cbef8179c22" integrity sha512-4jvKEHR1bAX03hBDZ94IXsYCj3bwk9vYsn6ux6JZNL2U5pvzCWjqyrGahfsGNrhERyxw8IqcirOi9Q6WCo3dkQ== -babel-plugin-htmlbars-inline-precompile@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-3.0.1.tgz#e1e38a4087f446578e419a21c112530c8df02345" - integrity sha512-ZiFY0nQjtdMPGIDwp/5LYOs6rCr54QfcSV5nPbrA7C++Fv4Vb2Q/qrKYx78t+dwmARJztnOBlObFk4z8veHxNA== +babel-plugin-htmlbars-inline-precompile@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-3.2.0.tgz#c4882ea875d0f5683f0d91c1f72e29a4f14b5606" + integrity sha512-IUeZmgs9tMUGXYu1vfke5I18yYJFldFGdNFQOWslXTnDWXzpwPih7QFduUqvT+awDpDuNtXpdt5JAf43Q1Hhzg== babel-plugin-htmlbars-inline-precompile@^4.2.0: version "4.2.0" @@ -3817,7 +3808,7 @@ broccoli-clean-css@^1.1.0: inline-source-map-comment "^1.0.5" json-stable-stringify "^1.0.0" -broccoli-concat@^3.2.2, broccoli-concat@^3.5.1, broccoli-concat@^3.7.1, broccoli-concat@^3.7.3, broccoli-concat@^3.7.4: +broccoli-concat@^3.2.2, broccoli-concat@^3.5.1, broccoli-concat@^3.7.1, broccoli-concat@^3.7.4: version "3.7.5" resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.7.5.tgz#223beda8c1184252cf08ae020a3d45ffa6a48218" integrity sha512-rDs1Mej3Ej0Cy5yIO9oIQq5+BCv0opAwS2NW7M0BeCsAMeFM42Z/zacDUC6jKc5OV5wiHvGTyCPLnZkMe0h6kQ== @@ -4137,7 +4128,7 @@ broccoli-output-wrapper@^3.2.1: heimdalljs-logger "^0.1.10" symlink-or-copy "^1.2.0" -broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.2.0, broccoli-persistent-filter@^1.4.3: +broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.4.3: version "1.4.6" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.6.tgz#80762d19000880a77da33c34373299c0f6a3e615" integrity sha512-0RejLwoC95kv4kta8KAa+FmECJCK78Qgm8SRDEK7YyU0N9Cx6KpY3UCDy9WELl3mCXLN8TokNxc7/hp3lL4lfw== @@ -4271,15 +4262,6 @@ broccoli-postcss@^5.0.0: object-assign "^4.1.1" postcss "^7.0.5" -broccoli-replace@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/broccoli-replace/-/broccoli-replace-0.12.0.tgz#36460a984c45c61731638c53068b0ab12ea8fdb7" - integrity sha1-NkYKmExFxhcxY4xTBosKsS6o/bc= - dependencies: - applause "1.2.2" - broccoli-persistent-filter "^1.2.0" - minimatch "^3.0.0" - broccoli-rollup@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/broccoli-rollup/-/broccoli-rollup-2.1.1.tgz#0b77dc4b7560a53e998ea85f3b56772612d4988d" @@ -4421,17 +4403,6 @@ broccoli-string-replace@^0.1.2: broccoli-persistent-filter "^1.1.5" minimatch "^3.0.3" -broccoli-style-manifest@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/broccoli-style-manifest/-/broccoli-style-manifest-1.5.2.tgz#249accc81a75b83fb581cd8c2d16a51a4989664d" - integrity sha512-68IUg6TAD/hBBsg2/MYTQpdpzBpkg6vLAbHvlcebgS3AckkKvZCSC7XXlgnCHJ5xj0L/LPbS8VOzSjpz8IiYow== - dependencies: - broccoli-caching-writer "^3.0.3" - fs-tree-diff "^0.5.6" - md5 "^2.2.1" - rsvp "^4.8.2" - walk-sync "^0.3.1" - broccoli-svg-optimizer@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/broccoli-svg-optimizer/-/broccoli-svg-optimizer-2.0.0.tgz#22b6920bee5e126e86b95ae0cdf8ad6cc4be3735" @@ -4851,11 +4822,6 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -charenc@~0.0.1: - version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= - charm@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/charm/-/charm-1.0.2.tgz#8add367153a6d9a581331052c4090991da995e35" @@ -5127,11 +5093,6 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= -coffee-script@^1.10.0: - version "1.12.7" - resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.7.tgz#c05dae0cb79591d05b3070a8433a98c9a89ccc53" - integrity sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw== - collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -5514,11 +5475,6 @@ cross-spawn@^7.0.0: shebang-command "^2.0.0" which "^2.0.1" -crypt@~0.0.1: - version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= - cryptiles@0.2.x: version "0.2.2" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-0.2.2.tgz#ed91ff1f17ad13d3748288594f8a48a0d26f325c" @@ -5548,13 +5504,6 @@ crypto-random-string@^1.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= -cson-parser@^1.1.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/cson-parser/-/cson-parser-1.3.5.tgz#7ec675e039145533bf2a6a856073f1599d9c2d24" - integrity sha1-fsZ14DkUVTO/KmqFYHPxWZ2cLSQ= - dependencies: - coffee-script "^1.10.0" - css-select-base-adapter@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" @@ -6163,10 +6112,10 @@ ember-cli-addon-docs-esdoc@^0.2.3: tmp "^0.0.33" walk-sync "^0.3.2" -ember-cli-addon-docs@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.7.0.tgz#30ba6ea734a71d75244d3b7ebc20a74934538b7c" - integrity sha512-/c+czcpcXB6gQ/jvNG7X9kBYcbceF0PF0RTC6XQcJn1H8NlfvOUehS93xPjk8wfNE38A4RyQnUAon2PqFxBo/Q== +ember-cli-addon-docs@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.8.0.tgz#090e4c2cc5b1179779d6a59234eb0f080a194956" + integrity sha512-Atg3UY6DypPu2NYsx5iOvsfD3QJjpGB8HQWmXo6kV4V5d8f3XK9gl8GB+l7l3JUZei6Lnf8OlILKkr5nSUTycQ== dependencies: "@glimmer/syntax" "^0.42.2" broccoli-bridge "^1.0.0" @@ -6184,16 +6133,15 @@ ember-cli-addon-docs@^0.7.0: ember-assign-polyfill "^2.6.0" ember-auto-import "^1.5.3" ember-cli-autoprefixer "^0.8.1" - ember-cli-babel "^7.18.0" + ember-cli-babel "^7.19.0" ember-cli-clipboard "^0.13.0" - ember-cli-htmlbars "^4.2.3" + ember-cli-htmlbars "^4.3.1" ember-cli-postcss "^5.0.0" ember-cli-sass "10.0.1" ember-cli-string-helpers "^4.0.5" ember-cli-string-utils "^1.1.0" ember-cli-version-checker "^3.1.3" ember-code-snippet "^3.0.0" - ember-component-css "^0.7.4" ember-composable-helpers "^2.4.0" ember-concurrency "^0.9.0 || ^0.10.0 || ^1.0.0" ember-data "2.x - 3.x" @@ -6295,7 +6243,7 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.1.4, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.18.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: version "7.23.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.23.0.tgz#ec580aa2c115d0810e454dd5c2fffce238284b92" integrity sha512-ix58DlRDAbGITtdJoRUPcAoQwKLYr/x/kIXjU9u1ATyhmuUjqb+0FDXghOWbkNihGiNOqBBR49+LBgK9AeBcNw== @@ -6497,13 +6445,13 @@ ember-cli-htmlbars@^3.0.0, ember-cli-htmlbars@^3.0.1: json-stable-stringify "^1.0.1" strip-bom "^3.0.0" -ember-cli-htmlbars@^4.2.3: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.3.1.tgz#4af8adc21ab3c4953f768956b7f7d207782cb175" - integrity sha512-CW6AY/yzjeVqoRtItOKj3hcYzc5dWPRETmeCzr2Iqjt5vxiVtpl0z5VTqHqIlT5fsFx6sGWBQXNHIe+ivYsxXQ== +ember-cli-htmlbars@^4.3.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.4.0.tgz#7ca17d5ca8f7550984346d9e6e93da0c3323f8d9" + integrity sha512-ohgctqk7dXIZR4TgN0xRoUYltWhghFJgqmtuswQTpZ7p74RxI9PKx+E8WV/95mGcPzraesvMNBg5utQNvcqgNg== dependencies: "@ember/edition-utils" "^1.2.0" - babel-plugin-htmlbars-inline-precompile "^3.0.1" + babel-plugin-htmlbars-inline-precompile "^3.2.0" broccoli-debug "^0.6.5" broccoli-persistent-filter "^2.3.1" broccoli-plugin "^3.1.0" @@ -6722,7 +6670,7 @@ ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0, ember-cli-ve resolve "^1.3.3" semver "^5.3.0" -ember-cli-version-checker@^3.0.0, ember-cli-version-checker@^3.0.1, ember-cli-version-checker@^3.1.2, ember-cli-version-checker@^3.1.3: +ember-cli-version-checker@^3.0.0, ember-cli-version-checker@^3.1.2, ember-cli-version-checker@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-3.1.3.tgz#7c9b4f5ff30fdebcd480b1c06c4de43bb51c522c" integrity sha512-PZNSvpzwWgv68hcXxyjREpj3WWb81A7rtYNQq1lLEgrWIchF8ApKJjWP3NBpHjaatwILkZAV8klair5WFlXAKg== @@ -6872,30 +6820,6 @@ ember-compatibility-helpers@^1.2.1: ember-cli-version-checker "^2.1.1" semver "^5.4.1" -ember-component-css@^0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/ember-component-css/-/ember-component-css-0.7.4.tgz#b8e94b062468721df6c9ea0c8739226c96809c9f" - integrity sha512-dJV6WyvIc4NZ2fSNhMWe4UJaSPLBtjQ4zHJ9bOg6UCMLHfTlwjJsn+rYqddMn65xau7MS8mwxa+otujQij0xEw== - dependencies: - broccoli-concat "^3.7.3" - broccoli-funnel "^2.0.1" - broccoli-merge-trees "^3.0.2" - broccoli-persistent-filter "^2.1.1" - broccoli-plugin "^1.3.1" - broccoli-replace "^0.12.0" - broccoli-style-manifest "^1.5.2" - ember-cli-babel "^7.1.4" - ember-cli-version-checker "^3.0.1" - ember-getowner-polyfill "^2.2.0" - fs-tree-diff "^0.5.9" - md5 "^2.2.1" - postcss "^7.0.6" - postcss-less "^3.1.0" - postcss-scss "^2.0.0" - postcss-selector-namespace "^2.0.0" - rsvp "^4.8.4" - walk-sync "^1.0.1" - ember-composable-helpers@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-2.4.0.tgz#024bd6a8c338cc9cdf10f1141b119b8f72de205f" @@ -9427,7 +9351,7 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-buffer@^1.1.5, is-buffer@~1.1.1: +is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== @@ -9818,7 +9742,7 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@^3.12.0, js-yaml@^3.12.1, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.3.0: +js-yaml@^3.12.0, js-yaml@^3.12.1, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.2.5, js-yaml@^3.2.7: version "3.14.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== @@ -10567,11 +10491,6 @@ lodash.values@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c= -lodash@^3.10.0: - version "3.10.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" - integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= - lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" @@ -10771,15 +10690,6 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" -md5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" - integrity sha1-U6s41f48iJG6RlMp6iP6wFQBJvk= - dependencies: - charenc "~0.0.1" - crypt "~0.0.1" - is-buffer "~1.1.1" - mdn-data@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" @@ -12078,13 +11988,6 @@ postcss-js@^2.0.0: camelcase-css "^2.0.1" postcss "^7.0.18" -postcss-less@^3.1.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-3.1.4.tgz#369f58642b5928ef898ffbc1a6e93c958304c5ad" - integrity sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA== - dependencies: - postcss "^7.0.14" - postcss-nested@^4.1.1: version "4.2.1" resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-4.2.1.tgz#4bc2e5b35e3b1e481ff81e23b700da7f82a8b248" @@ -12093,20 +11996,6 @@ postcss-nested@^4.1.1: postcss "^7.0.21" postcss-selector-parser "^6.0.2" -postcss-scss@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-2.0.0.tgz#248b0a28af77ea7b32b1011aba0f738bda27dea1" - integrity sha512-um9zdGKaDZirMm+kZFKKVsnKPF7zF7qBAtIfTSnZXD1jZ0JNZIxdB6TxQOjCnlSzLRInVl2v3YdBh/M881C4ug== - dependencies: - postcss "^7.0.0" - -postcss-selector-namespace@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-namespace/-/postcss-selector-namespace-2.0.0.tgz#d784cc24f5f483a301c9148fc7e50f5d7b64845e" - integrity sha512-1Eka6f/6IL08c8gWfslUdwqmURvHYbdI57zOMHeslIuiLaK1nxvQefqAGcr9Em9T0k+4IcwhBTAtJm+6nCz2wQ== - dependencies: - postcss "^7.0.0" - postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" @@ -12144,7 +12033,7 @@ postcss@^6.0.1, postcss@^6.0.17, postcss@^6.0.9: source-map "^0.6.1" supports-color "^5.4.0" -postcss@^7.0.0, postcss@^7.0.11, postcss@^7.0.14, postcss@^7.0.18, postcss@^7.0.21, postcss@^7.0.27, postcss@^7.0.5, postcss@^7.0.6: +postcss@^7.0.0, postcss@^7.0.11, postcss@^7.0.18, postcss@^7.0.21, postcss@^7.0.27, postcss@^7.0.5: version "7.0.27" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9" integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ== @@ -14754,7 +14643,7 @@ walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2, walk-sync@^0.3.3: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" -walk-sync@^1.0.0, walk-sync@^1.0.1, walk-sync@^1.1.3: +walk-sync@^1.0.0, walk-sync@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-1.1.4.tgz#81049f3d8095479b49574cfa5f558d7a252b127d" integrity sha512-nowc9thB/Jg0KW4TgxoRjLLYRPvl3DB/98S89r4ZcJqq2B0alNcKDh6pzLkBSkPMzRSMsJghJHQi79qw0YWEkA== From 9c6aa2da2f9de2dfc6ec973466089613d7e78edf Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 23 Oct 2020 21:04:27 +0000 Subject: [PATCH 727/879] build(deps): [security] bump lodash from 4.17.15 to 4.17.20 Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.20. **This update includes security fixes.** - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.20) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index 0d73c684d..e3d4e56be 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10491,15 +10491,10 @@ lodash.values@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c= -lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== - -lodash@^4.17.19: - version "4.17.19" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" - integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== +lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== log-symbols@^2.2.0: version "2.2.0" From bd6e0422070cc1cd7ac6e07df801fecb698e2003 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 23 Oct 2020 21:07:20 +0000 Subject: [PATCH 728/879] build(deps-dev): bump fastboot from 3.1.0 to 3.1.1 Bumps [fastboot](https://github.com/ember-fastboot/fastboot) from 3.1.0 to 3.1.1. - [Release notes](https://github.com/ember-fastboot/fastboot/releases) - [Changelog](https://github.com/ember-fastboot/fastboot/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-fastboot/fastboot/compare/v3.1.0...v3.1.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index e3d4e56be..e98edb0e0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7977,9 +7977,9 @@ fastboot@^2.0.0, fastboot@^2.0.1: source-map-support "^0.5.0" fastboot@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-3.1.0.tgz#e71a2d45c9b034f8a5909562a125888325100843" - integrity sha512-1GyX0seImE0l4Di/LVwTzL1XqXKECQvvDeEZmReNwMUDbsQxETGz3j7XUq/eWSxl1o4R/vZomvxOXdtae6kpfA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-3.1.1.tgz#95306636f4a9dae1bc237142e3cca0d337b419c6" + integrity sha512-qQ7zXzqJ2+qyM9Uy4rXzeOc/Qtk2o9Y9rKvHCrZoRWneOEwsH+/8bN56NP4PUgbMWtzYtWBFwhwGBuC6xPJA3w== dependencies: chalk "^3.0.0" cookie "^0.4.0" From 4babfad9a598dfeec20a4c99562373bddc2d22fa Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2020 18:23:07 +0000 Subject: [PATCH 729/879] build(deps-dev): bump fastboot from 3.1.1 to 3.1.2 Bumps [fastboot](https://github.com/ember-fastboot/fastboot) from 3.1.1 to 3.1.2. - [Release notes](https://github.com/ember-fastboot/fastboot/releases) - [Changelog](https://github.com/ember-fastboot/fastboot/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-fastboot/fastboot/compare/v3.1.1...v3.1.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index e98edb0e0..8072d7515 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7977,9 +7977,9 @@ fastboot@^2.0.0, fastboot@^2.0.1: source-map-support "^0.5.0" fastboot@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-3.1.1.tgz#95306636f4a9dae1bc237142e3cca0d337b419c6" - integrity sha512-qQ7zXzqJ2+qyM9Uy4rXzeOc/Qtk2o9Y9rKvHCrZoRWneOEwsH+/8bN56NP4PUgbMWtzYtWBFwhwGBuC6xPJA3w== + version "3.1.2" + resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-3.1.2.tgz#c10a97be3a61fbbf9e4bd8abc43373e8739d1787" + integrity sha512-yvhJfIRd4wWWACk+qjJxQI+WBIQ+pyQyp0/fxrQyA/cYJgZAXOHb+22zXJbJXaPku3fHS+gBl7crwovIkl8bhQ== dependencies: chalk "^3.0.0" cookie "^0.4.0" From 65713bf8aa6369bf87bcc2a354da1f45b691c054 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 2 Nov 2020 07:03:06 +0000 Subject: [PATCH 730/879] build(deps): bump ember-auto-import from 1.6.0 to 1.7.0 Bumps [ember-auto-import](https://github.com/ef4/ember-auto-import) from 1.6.0 to 1.7.0. - [Release notes](https://github.com/ef4/ember-auto-import/releases) - [Changelog](https://github.com/ef4/ember-auto-import/blob/master/CHANGELOG.md) - [Commits](https://github.com/ef4/ember-auto-import/commits) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 757 ++++++++++++++++++++++++++---------------------------- 1 file changed, 370 insertions(+), 387 deletions(-) diff --git a/yarn.lock b/yarn.lock index 8072d7515..5a60ee55c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14,13 +14,6 @@ dependencies: "@babel/highlight" "^7.8.3" -"@babel/code-frame@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.1.tgz#d5481c5095daa1c57e16e54c6f9198443afb49ff" - integrity sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw== - dependencies: - "@babel/highlight" "^7.10.1" - "@babel/code-frame@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" @@ -33,16 +26,16 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.1.tgz#d7386a689aa0ddf06255005b4b991988021101a0" integrity sha512-725AQupWJZ8ba0jbKceeFblZTY90McUBWMwHhkFQ9q1zKPJ95GUktljFcgcsIVwRnTnRKlcYzfiNImg5G9m6ZQ== -"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.12.0", "@babel/core@^7.2.2", "@babel/core@^7.3.4": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.1.tgz#980b115a05929ef3ce1b6af9bf50e5a5cf668667" - integrity sha512-6bGmltqzIJrinwRRdczQsMhruSi9Sqty9Te+/5hudn4Izx/JYRhW1QELpR+CIL0gC/c9A7WroH6FmkDGxmWx3w== +"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.12.0", "@babel/core@^7.3.4", "@babel/core@^7.8.7": + version "7.12.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.3.tgz#1b436884e1e3bff6fb1328dc02b208759de92ad8" + integrity sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g== dependencies: "@babel/code-frame" "^7.10.4" "@babel/generator" "^7.12.1" "@babel/helper-module-transforms" "^7.12.1" "@babel/helpers" "^7.12.1" - "@babel/parser" "^7.12.1" + "@babel/parser" "^7.12.3" "@babel/template" "^7.10.4" "@babel/traverse" "^7.12.1" "@babel/types" "^7.12.1" @@ -55,25 +48,6 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.10.1": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.2.tgz#0fa5b5b2389db8bfdfcc3492b551ee20f5dd69a9" - integrity sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA== - dependencies: - "@babel/types" "^7.10.2" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - -"@babel/generator@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.0.tgz#4b90c78d8c12825024568cbe83ee6c9af193585c" - integrity sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ== - dependencies: - "@babel/types" "^7.11.0" - jsesc "^2.5.1" - source-map "^0.5.0" - "@babel/generator@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.1.tgz#0d70be32bdaa03d7c51c8597dda76e0df1f15468" @@ -185,15 +159,6 @@ "@babel/traverse" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helper-function-name@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz#92bd63829bfc9215aca9d9defa85f56b539454f4" - integrity sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ== - dependencies: - "@babel/helper-get-function-arity" "^7.10.1" - "@babel/template" "^7.10.1" - "@babel/types" "^7.10.1" - "@babel/helper-function-name@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" @@ -212,13 +177,6 @@ "@babel/template" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-get-function-arity@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz#7303390a81ba7cb59613895a192b93850e373f7d" - integrity sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw== - dependencies: - "@babel/types" "^7.10.1" - "@babel/helper-get-function-arity@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" @@ -381,13 +339,6 @@ dependencies: "@babel/types" "^7.12.1" -"@babel/helper-split-export-declaration@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz#c6f4be1cbc15e3a868e4c64a17d5d31d754da35f" - integrity sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g== - dependencies: - "@babel/types" "^7.10.1" - "@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" @@ -402,11 +353,6 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-validator-identifier@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz#5770b0c1a826c4f53f5ede5e153163e0318e94b5" - integrity sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw== - "@babel/helper-validator-identifier@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" @@ -441,15 +387,6 @@ "@babel/traverse" "^7.12.1" "@babel/types" "^7.12.1" -"@babel/highlight@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.1.tgz#841d098ba613ba1a427a2b383d79e35552c38ae0" - integrity sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg== - dependencies: - "@babel/helper-validator-identifier" "^7.10.1" - chalk "^2.0.0" - js-tokens "^4.0.0" - "@babel/highlight@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" @@ -468,12 +405,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.10.1": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.2.tgz#871807f10442b92ff97e4783b9b54f6a0ca812d0" - integrity sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ== - -"@babel/parser@^7.10.4", "@babel/parser@^7.11.0": +"@babel/parser@^7.10.4": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.0.tgz#a9d7e11aead25d3b422d17b2c6502c8dddef6a5d" integrity sha512-qvRvi4oI8xii8NllyEc4MDJjuZiNaRzyb7Y7lup1NqJV8TZHF4O27CcP+72WPn/k1zkgJ6WJfnIbk4jTsVAZHw== @@ -483,7 +415,12 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.2.tgz#9d2fcf24cafe85333ab0aff9f26b81bba356004d" integrity sha512-LMN+SqTiZEonUw4hQA0A3zG8DnN0E1F4K107LbDDUnC+0chML1rvWgsHloC9weB4RmZweE0uhFq0eGX7Nr/PBQ== -"@babel/parser@^7.3.4", "@babel/parser@^7.4.5", "@babel/parser@^7.7.0", "@babel/parser@^7.8.6": +"@babel/parser@^7.12.3", "@babel/parser@^7.8.7": + version "7.12.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.3.tgz#a305415ebe7a6c7023b40b5122a0662d928334cd" + integrity sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw== + +"@babel/parser@^7.4.5", "@babel/parser@^7.7.0", "@babel/parser@^7.8.6": version "7.9.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== @@ -649,7 +586,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-dynamic-import@^7.2.0", "@babel/plugin-syntax-dynamic-import@^7.8.0": +"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== @@ -1139,15 +1076,6 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.1.tgz#e167154a94cb5f14b28dc58f5356d2162f539811" - integrity sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig== - dependencies: - "@babel/code-frame" "^7.10.1" - "@babel/parser" "^7.10.1" - "@babel/types" "^7.10.1" - "@babel/template@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" @@ -1166,37 +1094,7 @@ "@babel/parser" "^7.8.6" "@babel/types" "^7.8.6" -"@babel/traverse@^7.1.6", "@babel/traverse@^7.2.4", "@babel/traverse@^7.3.4", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.6": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.1.tgz#bbcef3031e4152a6c0b50147f4958df54ca0dd27" - integrity sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ== - dependencies: - "@babel/code-frame" "^7.10.1" - "@babel/generator" "^7.10.1" - "@babel/helper-function-name" "^7.10.1" - "@babel/helper-split-export-declaration" "^7.10.1" - "@babel/parser" "^7.10.1" - "@babel/types" "^7.10.1" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - -"@babel/traverse@^7.10.4": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.0.tgz#9b996ce1b98f53f7c3e4175115605d56ed07dd24" - integrity sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.0" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.11.0" - "@babel/types" "^7.11.0" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.19" - -"@babel/traverse@^7.12.1": +"@babel/traverse@^7.1.6", "@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.6": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.1.tgz#941395e0c5cc86d5d3e75caa095d3924526f0c1e" integrity sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw== @@ -1211,25 +1109,7 @@ globals "^11.1.0" lodash "^4.17.19" -"@babel/types@^7.1.6", "@babel/types@^7.10.1", "@babel/types@^7.10.2", "@babel/types@^7.3.2", "@babel/types@^7.3.4", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.2.tgz#30283be31cad0dbf6fb00bd40641ca0ea675172d" - integrity sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng== - dependencies: - "@babel/helper-validator-identifier" "^7.10.1" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.0.tgz#2ae6bf1ba9ae8c3c43824e5861269871b206e90d" - integrity sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA== - dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.19" - to-fast-properties "^2.0.0" - -"@babel/types@^7.12.1": +"@babel/types@^7.1.6", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.7.2", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.8.7": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.1.tgz#e109d9ab99a8de735be287ee3d6a9947a190c4ae" integrity sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA== @@ -1238,15 +1118,6 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" -"@babel/types@^7.7.2": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.4.tgz#369517188352e18219981efd156bfdb199fff1ee" - integrity sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg== - dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - "@ember-data/-build-infra@3.14.0": version "3.14.0" resolved "https://registry.yarnpkg.com/@ember-data/-build-infra/-/-build-infra-3.14.0.tgz#d81242b018038b0bf39bceaa1b0df167398f60b8" @@ -1479,28 +1350,28 @@ ember-cli-htmlbars-inline-precompile "^2.1.0" ember-test-waiters "^1.1.1" -"@embroider/core@0.4.3", "@embroider/core@^0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@embroider/core/-/core-0.4.3.tgz#117973b9761d68aee14d820bbaefeb05d5984ba8" - integrity sha512-n24WU/dGuGDqZrljWoX8raK2wFX3R8iJG0rfCWx+1kW87IvB+ZgS3j4KiZ/S788BA07udrYsrgecYnciG2bBMg== - dependencies: - "@babel/core" "^7.2.2" - "@babel/parser" "^7.3.4" - "@babel/plugin-syntax-dynamic-import" "^7.2.0" - "@babel/traverse" "^7.3.4" - "@babel/types" "^7.3.4" - "@embroider/macros" "0.4.3" +"@embroider/core@0.23.0", "@embroider/core@^0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@embroider/core/-/core-0.23.0.tgz#5992f6dbeaeac688d2436d7b8b7034738a7722a2" + integrity sha512-e3HniYcT7Xa2IAIjOfTnp6vLst1V8rPJ6Md9/WmDWvGFEyT4tRPPjk6EKjVN47CbsNGtW8iYUigLWEUbUWFWlA== + dependencies: + "@babel/core" "^7.8.7" + "@babel/parser" "^7.8.7" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/traverse" "^7.8.6" + "@babel/types" "^7.8.7" + "@embroider/macros" "0.23.0" assert-never "^1.1.0" babel-plugin-syntax-dynamic-import "^6.18.0" broccoli-persistent-filter "^2.2.2" - broccoli-plugin "^1.3.0" + broccoli-plugin "^3.0.0" broccoli-source "^1.1.0" debug "^3.1.0" fast-sourcemap-concat "^1.4.0" filesize "^4.1.2" fs-extra "^7.0.1" fs-tree-diff "^2.0.0" - handlebars "^4.0.11" + handlebars "^4.4.2" js-string-escape "^1.0.1" jsdom "^12.0.0" json-stable-stringify "^1.0.1" @@ -1512,16 +1383,20 @@ strip-bom "^3.0.0" typescript-memoize "^1.0.0-alpha.3" walk-sync "^1.1.3" + wrap-legacy-hbs-plugin-if-needed "^1.0.1" -"@embroider/macros@0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.4.3.tgz#ea5604b8bd578520f15886a428a6c4fa9481abc0" - integrity sha512-vq/Ny2ULpKxq60Sv5usSrz651dXFM5phP/O5G5MWDY8YOodIkRLGqtub34sB0OmwxpCuTntUzl9P/I4wkyQ3Kw== +"@embroider/macros@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.23.0.tgz#b76a5b34b33228b4ad37136a29e7888722653dd8" + integrity sha512-Id4BA6VYvRmRTrMwTGFXUJkNIJDNnxNpcdAA5a3xWSTDlY0mroYBlPgnM2M+21pu+4p+Hpb4VkeK1+U/DBP6lg== dependencies: - "@babel/core" "^7.2.2" - "@babel/traverse" "^7.2.4" - "@babel/types" "^7.3.2" - "@embroider/core" "0.4.3" + "@babel/core" "^7.8.7" + "@babel/traverse" "^7.8.6" + "@babel/types" "^7.8.7" + "@embroider/core" "0.23.0" + assert-never "^1.1.0" + ember-cli-babel "^7.20.5" + lodash "^4.17.10" resolve "^1.8.1" semver "^5.6.0" @@ -1533,6 +1408,14 @@ postcss "7.0.32" purgecss "^2.3.0" +"@glimmer/encoder@^0.42.2": + version "0.42.2" + resolved "https://registry.yarnpkg.com/@glimmer/encoder/-/encoder-0.42.2.tgz#d3ba3dc9f1d4fa582d1d18b63da100fc5c664057" + integrity sha512-8xkdly0i0BP5HMI0suPB9ly0AnEq8x9Z8j3Gee1HYIovM5VLNtmh7a8HsaHYRs/xHmBEZcqtr8JV89w6F59YMQ== + dependencies: + "@glimmer/interfaces" "^0.42.2" + "@glimmer/vm" "^0.42.2" + "@glimmer/env@^0.1.7": version "0.1.7" resolved "https://registry.yarnpkg.com/@glimmer/env/-/env-0.1.7.tgz#fd2d2b55a9029c6b37a6c935e8c8871ae70dfa07" @@ -1543,7 +1426,41 @@ resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.42.2.tgz#9cf8d6f8f5eee6bfcfa36919ca68ae716e1f78db" integrity sha512-7LOuQd02cxxNNHChzdHMAU8/qOeQvTro141CU5tXITP7z6aOv2D2gkFdau97lLQiVxezGrh8J7h8GCuF7TEqtg== -"@glimmer/syntax@^0.42.2": +"@glimmer/low-level@^0.42.2": + version "0.42.2" + resolved "https://registry.yarnpkg.com/@glimmer/low-level/-/low-level-0.42.2.tgz#52c745414d1d04c4245c369bd132c0e786c816ef" + integrity sha512-s+Q44SnKdTBTnkgX0deBlVNnNPVas+Pg8xEnwky9VrUqOHKsIZRrPgfVULeC6bIdFXtXOKm5CjTajhb9qnQbXQ== + +"@glimmer/program@^0.42.2": + version "0.42.2" + resolved "https://registry.yarnpkg.com/@glimmer/program/-/program-0.42.2.tgz#fe504679ca4df6251dd5fcf3003699bb51fa41fa" + integrity sha512-XpQ6EYzA1VL9ESKoih5XW5JftFmlRvwy3bF/I1ABOa3yLIh8mApEwrRI/sIHK0Nv5s1j0uW4itVF196WxnJXgw== + dependencies: + "@glimmer/encoder" "^0.42.2" + "@glimmer/interfaces" "^0.42.2" + "@glimmer/util" "^0.42.2" + +"@glimmer/reference@^0.42.1", "@glimmer/reference@^0.42.2": + version "0.42.2" + resolved "https://registry.yarnpkg.com/@glimmer/reference/-/reference-0.42.2.tgz#57874e27c825fb7041b5295b5eb153f3f3f92f8f" + integrity sha512-XuhbRjr3M9Q/DP892jGxVfPE6jaGGHu5w9ppGMnuTY7Vm/x+A+68MCiaREhDcEwJlzGg4UkfVjU3fdgmUIrc5Q== + dependencies: + "@glimmer/util" "^0.42.2" + +"@glimmer/runtime@^0.42.1": + version "0.42.2" + resolved "https://registry.yarnpkg.com/@glimmer/runtime/-/runtime-0.42.2.tgz#50e7da5d3cf9144248048a7478be3c489784a4bb" + integrity sha512-52LVZJsLKM3GzI3TEmYcw2LdI9Uk0jotISc3w2ozQBWvkKoYxjDNvI/gsjyMpenj4s7FcG2ggOq0x4tNFqm1GA== + dependencies: + "@glimmer/interfaces" "^0.42.2" + "@glimmer/low-level" "^0.42.2" + "@glimmer/program" "^0.42.2" + "@glimmer/reference" "^0.42.2" + "@glimmer/util" "^0.42.2" + "@glimmer/vm" "^0.42.2" + "@glimmer/wire-format" "^0.42.2" + +"@glimmer/syntax@^0.42.1", "@glimmer/syntax@^0.42.2": version "0.42.2" resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.42.2.tgz#89bb3cb787285b84665dc0d8907d94b008e5be9a" integrity sha512-SR26SmF/Mb5o2cc4eLHpOyoX5kwwXP4KRhq4fbWfrvan74xVWA38PLspPCzwGhyVH/JsE7tUEPMjSo2DcJge/Q== @@ -1558,6 +1475,22 @@ resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.42.2.tgz#9ca1631e42766ea6059f4b49d0bdfb6095aad2c4" integrity sha512-Heck0baFSaWDanCYtmOcLeaz7v+rSqI8ovS7twrp2/FWEteb3Ze5sWQ2BEuSAG23L/k/lzVwYM/MY7ZugxBpaA== +"@glimmer/vm@^0.42.2": + version "0.42.2" + resolved "https://registry.yarnpkg.com/@glimmer/vm/-/vm-0.42.2.tgz#492a4f05eac587c3a37371b3c62593f20bef553d" + integrity sha512-D2MNU5glICLqvet5SfVPrv+l6JNK2TR+CdQhch1Ew+btOoqlW+2LIJIF/5wLb1POjIMEkt+78t/7RN0mDFXGzw== + dependencies: + "@glimmer/interfaces" "^0.42.2" + "@glimmer/util" "^0.42.2" + +"@glimmer/wire-format@^0.42.2": + version "0.42.2" + resolved "https://registry.yarnpkg.com/@glimmer/wire-format/-/wire-format-0.42.2.tgz#b95062b594dddeb8bd11cba3a6a0accbfabc9930" + integrity sha512-IqUo6mdJ7GRsK7KCyZxrc17ioSg9RBniEnb418ZMQxsV/WBv9NQ359MuClUck2M24z1AOXo4TerUw0U7+pb1/A== + dependencies: + "@glimmer/interfaces" "^0.42.2" + "@glimmer/util" "^0.42.2" + "@jimp/bmp@^0.5.4": version "0.5.4" resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.5.4.tgz#b7b375aa774f26154912569864d5466e71333ef1" @@ -2118,158 +2051,160 @@ resolved "https://registry.yarnpkg.com/@types/symlink-or-copy/-/symlink-or-copy-1.2.0.tgz#4151a81b4052c80bc2becbae09f3a9ec010a9c7a" integrity sha512-Lja2xYuuf2B3knEsga8ShbOdsfNOtzT73GyJmZyY7eGl2+ajOqrs8yM5ze0fsSoYwvA6bw7/Qr7OZ7PEEmYwWg== -"@webassemblyjs/ast@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" - integrity sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA== - dependencies: - "@webassemblyjs/helper-module-context" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/wast-parser" "1.7.11" - -"@webassemblyjs/floating-point-hex-parser@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz#a69f0af6502eb9a3c045555b1a6129d3d3f2e313" - integrity sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg== - -"@webassemblyjs/helper-api-error@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz#c7b6bb8105f84039511a2b39ce494f193818a32a" - integrity sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg== - -"@webassemblyjs/helper-buffer@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz#3122d48dcc6c9456ed982debe16c8f37101df39b" - integrity sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w== - -"@webassemblyjs/helper-code-frame@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz#cf8f106e746662a0da29bdef635fcd3d1248364b" - integrity sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw== - dependencies: - "@webassemblyjs/wast-printer" "1.7.11" - -"@webassemblyjs/helper-fsm@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz#df38882a624080d03f7503f93e3f17ac5ac01181" - integrity sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A== - -"@webassemblyjs/helper-module-context@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz#d874d722e51e62ac202476935d649c802fa0e209" - integrity sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg== - -"@webassemblyjs/helper-wasm-bytecode@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz#dd9a1e817f1c2eb105b4cf1013093cb9f3c9cb06" - integrity sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ== - -"@webassemblyjs/helper-wasm-section@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz#9c9ac41ecf9fbcfffc96f6d2675e2de33811e68a" - integrity sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q== - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-buffer" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/wasm-gen" "1.7.11" - -"@webassemblyjs/ieee754@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz#c95839eb63757a31880aaec7b6512d4191ac640b" - integrity sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ== +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.11.tgz#d7267a1ee9c4594fd3f7e37298818ec65687db63" - integrity sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw== - dependencies: - "@xtuc/long" "4.2.1" - -"@webassemblyjs/utf8@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.11.tgz#06d7218ea9fdc94a6793aa92208160db3d26ee82" - integrity sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA== - -"@webassemblyjs/wasm-edit@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz#8c74ca474d4f951d01dbae9bd70814ee22a82005" - integrity sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg== - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-buffer" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/helper-wasm-section" "1.7.11" - "@webassemblyjs/wasm-gen" "1.7.11" - "@webassemblyjs/wasm-opt" "1.7.11" - "@webassemblyjs/wasm-parser" "1.7.11" - "@webassemblyjs/wast-printer" "1.7.11" - -"@webassemblyjs/wasm-gen@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz#9bbba942f22375686a6fb759afcd7ac9c45da1a8" - integrity sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA== - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/ieee754" "1.7.11" - "@webassemblyjs/leb128" "1.7.11" - "@webassemblyjs/utf8" "1.7.11" - -"@webassemblyjs/wasm-opt@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz#b331e8e7cef8f8e2f007d42c3a36a0580a7d6ca7" - integrity sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg== - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-buffer" "1.7.11" - "@webassemblyjs/wasm-gen" "1.7.11" - "@webassemblyjs/wasm-parser" "1.7.11" - -"@webassemblyjs/wasm-parser@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz#6e3d20fa6a3519f6b084ef9391ad58211efb0a1a" - integrity sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg== - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-api-error" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/ieee754" "1.7.11" - "@webassemblyjs/leb128" "1.7.11" - "@webassemblyjs/utf8" "1.7.11" - -"@webassemblyjs/wast-parser@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz#25bd117562ca8c002720ff8116ef9072d9ca869c" - integrity sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ== - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/floating-point-hex-parser" "1.7.11" - "@webassemblyjs/helper-api-error" "1.7.11" - "@webassemblyjs/helper-code-frame" "1.7.11" - "@webassemblyjs/helper-fsm" "1.7.11" - "@xtuc/long" "4.2.1" - -"@webassemblyjs/wast-printer@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz#c4245b6de242cb50a2cc950174fdbf65c78d7813" - integrity sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg== - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/wast-parser" "1.7.11" - "@xtuc/long" "4.2.1" +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== -"@xtuc/long@4.2.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" - integrity sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g== +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== abab@^1.0.0: version "1.0.4" @@ -2358,7 +2293,7 @@ acorn@^2.1.0, acorn@^2.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7" integrity sha1-q259nYhqrKiwhbwzEreaGYQz8Oc= -acorn@^5.0.0, acorn@^5.5.3, acorn@^5.6.2: +acorn@^5.0.0, acorn@^5.5.3: version "5.7.4" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== @@ -2368,6 +2303,11 @@ acorn@^6.0.1, acorn@^6.0.2, acorn@^6.0.7: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== +acorn@^6.4.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + acorn@^7.0.0, acorn@^7.1.0, acorn@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" @@ -4194,7 +4134,7 @@ broccoli-plugin@1.1.0: rimraf "^2.3.4" symlink-or-copy "^1.0.1" -"broccoli-plugin@1.3.1 - 3", broccoli-plugin@^3.1.0: +"broccoli-plugin@1.3.1 - 3", broccoli-plugin@^3.0.0, broccoli-plugin@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-3.1.0.tgz#54ba6dd90a42ec3db5624063292610e326b1e542" integrity sha512-7w7FP8WJYjLvb0eaw27LO678TGGaom++49O1VYIuzjhXjK5kn2+AMlDm7CaUFw4F7CLGoVQeZ84d8gICMJa4lA== @@ -4891,7 +4831,7 @@ cheerio@^1.0.0-rc.2: optionalDependencies: fsevents "~2.1.2" -chokidar@^2.0.2: +chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== @@ -4910,12 +4850,27 @@ chokidar@^2.0.2: optionalDependencies: fsevents "^1.2.7" +chokidar@^3.4.1: + version "3.4.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" + integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.1.2" + chownr@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== -chrome-trace-event@^1.0.0: +chrome-trace-event@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== @@ -6062,15 +6017,15 @@ ember-assign-polyfill@^2.5.0, ember-assign-polyfill@^2.6.0: ember-cli-version-checker "^2.0.0" ember-auto-import@^1.2.19, ember-auto-import@^1.5.3: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.6.0.tgz#00a498172b04f7084a5d2a327f76f577038ed403" - integrity sha512-BRBrmbDXRuXG/WYbn/2DXM7bFNyQuT80du1scUrrX0+xFVkDOU08s46ZPCvzYprzSg2htgrztQ/nVdnfbIBV+Q== + version "1.7.0" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.7.0.tgz#dd809fbe3d40647f2af443072405094d0e77ecf5" + integrity sha512-onp7XZKwiit3BgkOPV/obi3fvLJmDNKTTjRsVtYz63yWeyT3ahiM8BIvJYzHGL4cxlGLvwpTJy2HYBDs6ZtvoQ== dependencies: "@babel/core" "^7.1.6" "@babel/preset-env" "^7.10.2" "@babel/traverse" "^7.1.6" "@babel/types" "^7.1.6" - "@embroider/core" "^0.4.3" + "@embroider/core" "^0.23.0" babel-core "^6.26.3" babel-loader "^8.0.6" babel-plugin-syntax-dynamic-import "^6.18.0" @@ -6079,13 +6034,13 @@ ember-auto-import@^1.2.19, ember-auto-import@^1.5.3: broccoli-debug "^0.6.4" broccoli-plugin "^1.3.0" debug "^3.1.0" - ember-cli-babel "^6.6.0" + ember-cli-babel "^7.0.0" enhanced-resolve "^4.0.0" fs-extra "^6.0.1" fs-tree-diff "^1.0.0" handlebars "^4.3.1" js-string-escape "^1.0.1" - lodash "^4.17.10" + lodash "^4.17.19" mkdirp "^0.5.1" pkg-up "^2.0.0" resolve "^1.7.1" @@ -6093,7 +6048,7 @@ ember-auto-import@^1.2.19, ember-auto-import@^1.5.3: symlink-or-copy "^1.2.0" typescript-memoize "^1.0.0-alpha.3" walk-sync "^0.3.3" - webpack "~4.28" + webpack "^4.43.0" ember-cli-addon-docs-esdoc@^0.2.3: version "0.2.3" @@ -6243,7 +6198,7 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.5, ember-cli-babel@^7.22.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: version "7.23.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.23.0.tgz#ec580aa2c115d0810e454dd5c2fffce238284b92" integrity sha512-ix58DlRDAbGITtdJoRUPcAoQwKLYr/x/kIXjU9u1ATyhmuUjqb+0FDXghOWbkNihGiNOqBBR49+LBgK9AeBcNw== @@ -7327,10 +7282,10 @@ engine.io@~3.4.0: engine.io-parser "~2.2.0" ws "^7.1.2" -enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" - integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== +enhanced-resolve@^4.0.0, enhanced-resolve@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" + integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ== dependencies: graceful-fs "^4.1.2" memory-fs "^0.5.0" @@ -7506,7 +7461,7 @@ eslint-plugin-node@^11.0.0: resolve "^1.10.1" semver "^6.1.0" -eslint-scope@^4.0.0, eslint-scope@^4.0.3: +eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== @@ -8730,14 +8685,15 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -handlebars@^4.0.11, handlebars@^4.0.13, handlebars@^4.0.4, handlebars@^4.3.1: - version "4.7.3" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.3.tgz#8ece2797826886cf8082d1726ff21d2a022550ee" - integrity sha512-SRGwSYuNfx8DwHD/6InAPzD6RgeruWLT+B8e8a7gGs8FWgHzlExpTFMEq2IA6QpAfOClpKHy6+8IqTjeBCu6Kg== +handlebars@^4.0.13, handlebars@^4.0.4, handlebars@^4.3.1, handlebars@^4.4.2: + version "4.7.6" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e" + integrity sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA== dependencies: + minimist "^1.2.5" neo-async "^2.6.0" - optimist "^0.6.1" source-map "^0.6.1" + wordwrap "^1.0.0" optionalDependencies: uglify-js "^3.1.4" @@ -10133,12 +10089,12 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -loader-runner@^2.3.0: +loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@^1.1.0, loader-utils@^1.4.0: +loader-utils@^1.2.3, loader-utils@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== @@ -10710,18 +10666,18 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -memory-fs@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" - integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= dependencies: errno "^0.1.3" readable-stream "^2.0.1" -memory-fs@~0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== dependencies: errno "^0.1.3" readable-stream "^2.0.1" @@ -10794,7 +10750,7 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: +micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -10991,7 +10947,7 @@ mkdirp@^0.3.5: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" integrity sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc= -mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@~0.5.1: version "0.5.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.4.tgz#fd01504a6797ec5c9be81ff43d204961ed64a512" integrity sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw== @@ -11129,6 +11085,11 @@ neo-async@^2.5.0, neo-async@^2.6.0: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== +neo-async@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -11159,7 +11120,7 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= -node-libs-browser@^2.0.0: +node-libs-browser@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== @@ -12410,6 +12371,13 @@ readdirp@~3.3.0: dependencies: picomatch "^2.0.7" +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + recast@^0.18.1: version "0.18.7" resolved "https://registry.yarnpkg.com/recast/-/recast-0.18.7.tgz#56338a6d803c8c3b9113344440dc70d13c8a1ef7" @@ -13008,14 +12976,6 @@ saxes@^5.0.0: dependencies: xmlchars "^2.2.0" -schema-utils@^0.4.4: - version "0.4.7" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" - integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== - dependencies: - ajv "^6.1.0" - ajv-keywords "^3.1.0" - schema-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" @@ -13881,7 +13841,7 @@ tap-parser@^7.0.0: js-yaml "^3.2.7" minipass "^2.2.0" -tapable@^1.0.0, tapable@^1.1.0: +tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== @@ -13894,7 +13854,7 @@ temp@0.8.3: os-tmpdir "^1.0.0" rimraf "~2.2.6" -terser-webpack-plugin@1.2.1, terser-webpack-plugin@^1.1.0: +terser-webpack-plugin@1.2.1, terser-webpack-plugin@^1.4.3: version "1.2.1" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.1.tgz#7545da9ae5f4f9ae6a0ac961eb46f5e7c845cc26" integrity sha512-GGSt+gbT0oKcMDmPx4SRSfJPE1XaN3kQRWG4ghxKQw9cn5G9x6aCKSsgYdvyM0na9NJ4Drv0RG6jbBByZ5CMjw== @@ -14683,14 +14643,23 @@ watch@~0.18.0: exec-sh "^0.2.0" minimist "^1.2.0" -watchpack@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== +watchpack-chokidar2@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" + integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA== + dependencies: + chokidar "^2.1.8" + +watchpack@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.4.tgz#6e9da53b3c80bb2d6508188f5b200410866cd30b" + integrity sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg== dependencies: - chokidar "^2.0.2" graceful-fs "^4.1.2" neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.1" + watchpack-chokidar2 "^2.0.0" wcwidth@^1.0.1: version "1.0.1" @@ -14719,7 +14688,7 @@ webidl-conversions@^6.1.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== -webpack-sources@^1.1.0, webpack-sources@^1.3.0: +webpack-sources@^1.1.0, webpack-sources@^1.4.1: version "1.4.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== @@ -14727,35 +14696,34 @@ webpack-sources@^1.1.0, webpack-sources@^1.3.0: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@~4.28: - version "4.28.4" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.28.4.tgz#1ddae6c89887d7efb752adf0c3cd32b9b07eacd0" - integrity sha512-NxjD61WsK/a3JIdwWjtIpimmvE6UrRi3yG54/74Hk9rwNj5FPkA4DJCf1z4ByDWLkvZhTZE+P3C/eh6UD5lDcw== +webpack@^4.43.0: + version "4.44.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72" + integrity sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q== dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-module-context" "1.7.11" - "@webassemblyjs/wasm-edit" "1.7.11" - "@webassemblyjs/wasm-parser" "1.7.11" - acorn "^5.6.2" - acorn-dynamic-import "^3.0.0" - ajv "^6.1.0" - ajv-keywords "^3.1.0" - chrome-trace-event "^1.0.0" - enhanced-resolve "^4.1.0" - eslint-scope "^4.0.0" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.3.0" + eslint-scope "^4.0.3" json-parse-better-errors "^1.0.2" - loader-runner "^2.3.0" - loader-utils "^1.1.0" - memory-fs "~0.4.1" - micromatch "^3.1.8" - mkdirp "~0.5.0" - neo-async "^2.5.0" - node-libs-browser "^2.0.0" - schema-utils "^0.4.4" - tapable "^1.1.0" - terser-webpack-plugin "^1.1.0" - watchpack "^1.5.0" - webpack-sources "^1.3.0" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.3" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.7.4" + webpack-sources "^1.4.1" websocket-driver@>=0.5.1: version "0.7.3" @@ -14844,6 +14812,11 @@ word-wrap@~1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" @@ -14885,6 +14858,16 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" +wrap-legacy-hbs-plugin-if-needed@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wrap-legacy-hbs-plugin-if-needed/-/wrap-legacy-hbs-plugin-if-needed-1.0.1.tgz#6683eb74747f33e7caea54bb2ed85106ef9006b4" + integrity sha512-aJjXe5WwrY0u0dcUgKW3m2SGnxosJ66LLm/QaG0YMHqgA6+J2xwAFZfhSLsQ2BmO5x8PTH+OIxoAXuGz3qBA7A== + dependencies: + "@glimmer/reference" "^0.42.1" + "@glimmer/runtime" "^0.42.1" + "@glimmer/syntax" "^0.42.1" + "@simple-dom/interface" "^1.4.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" From ba5ef278a5daa8971ab20a6210f383774d1281ca Mon Sep 17 00:00:00 2001 From: Edward Faulkner Date: Tue, 3 Nov 2020 09:15:41 -0500 Subject: [PATCH 731/879] Fix invalid use of ES modules (#2073) The ES module spec doesn't support "optional" exports. If you try import a name from a module and that name is not exported, it's a SyntaxError. Mirage tries to import `default`, `testConfig`, and `makeServer` from the user's config, but they are treated as optional. The solution is to import the module's whole namespace (`import * as...`) and then inspect the namespace object. --- app/initializers/ember-cli-mirage.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/initializers/ember-cli-mirage.js b/app/initializers/ember-cli-mirage.js index 3ecbb53f1..38aedc41f 100644 --- a/app/initializers/ember-cli-mirage.js +++ b/app/initializers/ember-cli-mirage.js @@ -1,7 +1,8 @@ import ENV from '../config/environment'; -import baseConfig, { testConfig, makeServer } from '../mirage/config'; import getRfc232TestContext from 'ember-cli-mirage/get-rfc232-test-context'; import startMirageImpl from 'ember-cli-mirage/start-mirage'; +import * as config from '../mirage/config'; +const { default: baseConfig, testConfig, makeServer } = config; // // This initializer does two things: From a612a2dbf8dcc29aadb39c735cc577aa47b5c252 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 9 Nov 2020 06:55:38 +0000 Subject: [PATCH 732/879] build(deps-dev): bump ember-moment from 8.0.0 to 8.0.1 Bumps [ember-moment](https://github.com/stefanpenner/ember-moment) from 8.0.0 to 8.0.1. - [Release notes](https://github.com/stefanpenner/ember-moment/releases) - [Changelog](https://github.com/stefanpenner/ember-moment/blob/master/CHANGELOG.md) - [Commits](https://github.com/stefanpenner/ember-moment/compare/v8.0.0...v8.0.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 5a60ee55c..eaf510a98 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6990,9 +6990,9 @@ ember-modifier-manager-polyfill@^1.2.0: ember-compatibility-helpers "^1.2.0" ember-moment@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/ember-moment/-/ember-moment-8.0.0.tgz#f3993711df0af444558f0f3922dc3f412af72410" - integrity sha512-JbwmTiS75EEXFWGR5P8rXykISpDf6EH8L8IpxsF6FaRwJ/4odXV/yf8cKh6gpzxoags9OJ8qxyQqG0Prhgs9Sg== + version "8.0.1" + resolved "https://registry.yarnpkg.com/ember-moment/-/ember-moment-8.0.1.tgz#3a11929efeb7fb6bc5c1cc2c9e4c43bd9c500f80" + integrity sha512-YmhcMkH4OUwk1ynypxgWb8/O0E+v2HaZ49rk7yPbsf7EkzAyHn2tXrQPbFW4eWCKgHl+VoRoocLU9ShSIDI7qg== dependencies: ember-cli-babel "^6.7.2" ember-getowner-polyfill "^2.2.0" From 96391f8b9503727c34ccd031944e42d6d1e16eb7 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 9 Nov 2020 06:56:19 +0000 Subject: [PATCH 733/879] build(deps-dev): bump ember-load-initializers from 2.1.1 to 2.1.2 Bumps [ember-load-initializers](https://github.com/ember-cli/ember-load-initializers) from 2.1.1 to 2.1.2. - [Release notes](https://github.com/ember-cli/ember-load-initializers/releases) - [Changelog](https://github.com/ember-cli/ember-load-initializers/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-load-initializers/compare/v2.1.1...v2.1.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/yarn.lock b/yarn.lock index eaf510a98..b602d6405 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6198,7 +6198,7 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.5, ember-cli-babel@^7.22.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.5, ember-cli-babel@^7.22.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: version "7.23.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.23.0.tgz#ec580aa2c115d0810e454dd5c2fffce238284b92" integrity sha512-ix58DlRDAbGITtdJoRUPcAoQwKLYr/x/kIXjU9u1ATyhmuUjqb+0FDXghOWbkNihGiNOqBBR49+LBgK9AeBcNw== @@ -6934,11 +6934,11 @@ ember-keyboard@^4.0.0: ember-cli-babel "^6.6.0" ember-load-initializers@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-2.1.1.tgz#d1a8bead00bc44222b0ab181840869992beb30f5" - integrity sha512-Ho5sBeaZPN3HmZkYkcLrjSBF3DTNmzC5h0DizzDj8cjpnCvaqeofphJDnH41k6kLv/QHMk4pMRISPcwc+bOceQ== + version "2.1.2" + resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-2.1.2.tgz#8a47a656c1f64f9b10cecdb4e22a9d52ad9c7efa" + integrity sha512-CYR+U/wRxLbrfYN3dh+0Tb6mFaxJKfdyz+wNql6cqTrA0BBi9k6J3AaKXj273TqvEpyyXegQFFkZEiuZdYtgJw== dependencies: - ember-cli-babel "^7.11.0" + ember-cli-babel "^7.13.0" ember-cli-typescript "^2.0.2" ember-macro-helpers@^4.2.2: From a58422b812b6d2f545d0631a1f50596f06aa704b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 10 Nov 2020 06:40:47 +0000 Subject: [PATCH 734/879] build(deps-dev): bump ember-composable-helpers from 4.3.0 to 4.3.1 Bumps [ember-composable-helpers](https://github.com/DockYard/ember-composable-helpers) from 4.3.0 to 4.3.1. - [Release notes](https://github.com/DockYard/ember-composable-helpers/releases) - [Changelog](https://github.com/DockYard/ember-composable-helpers/blob/master/CHANGELOG.md) - [Commits](https://github.com/DockYard/ember-composable-helpers/compare/v4.3.0...v4.3.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index b602d6405..5f681bbf7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6786,9 +6786,9 @@ ember-composable-helpers@^2.4.0: resolve "^1.10.0" ember-composable-helpers@^4.1.2: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.3.0.tgz#afe03e14e20639652bed86b84d91633ede2cb129" - integrity sha512-nunPGP3RTf1KbnTzZLcp9/EXBSbOPVs36lVxjxbcW+yo9DV8QRy/kayNJfiU5X5sYf8rLsVs1w0qcFR8exQfxg== + version "4.3.1" + resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.3.1.tgz#d4d0953903549b4fbe01bb923df154b94eb8b4ef" + integrity sha512-m7BEosHnMxpQ2tKdEdQbJTvp8+9vK4OsH3P5ruhIZgo4s5UVmVMz8x0ThXLR5LAIAKFohBhNaZUwd/vH+/aLRA== dependencies: "@babel/core" "^7.0.0" broccoli-funnel "2.0.1" From bd083b4a03a4d30be625179244d248679e214fcd Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 11 Nov 2020 06:48:14 +0000 Subject: [PATCH 735/879] build(deps-dev): bump qunit-dom from 1.5.0 to 1.6.0 Bumps [qunit-dom](https://github.com/simplabs/qunit-dom) from 1.5.0 to 1.6.0. - [Release notes](https://github.com/simplabs/qunit-dom/releases) - [Changelog](https://github.com/simplabs/qunit-dom/blob/master/CHANGELOG.md) - [Commits](https://github.com/simplabs/qunit-dom/compare/v1.5.0...v1.6.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index 5f681bbf7..b2b32e478 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6198,7 +6198,7 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.5, ember-cli-babel@^7.22.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.5, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: version "7.23.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.23.0.tgz#ec580aa2c115d0810e454dd5c2fffce238284b92" integrity sha512-ix58DlRDAbGITtdJoRUPcAoQwKLYr/x/kIXjU9u1ATyhmuUjqb+0FDXghOWbkNihGiNOqBBR49+LBgK9AeBcNw== @@ -12226,12 +12226,14 @@ quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quick-temp@^0.1.8: underscore.string "~3.3.4" qunit-dom@^1.1.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-1.5.0.tgz#f3e062562c18fb354b7657afd31890d89a24691d" - integrity sha512-VTFApYbzcYkL5Zg7XgZMgLgMI9JXEX+lwBS5bFy5hRkIaz9V38q7rN44svxFBNHWs96y3UaFaAYpOEmlQ0j+fw== + version "1.6.0" + resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-1.6.0.tgz#a4bea6a46329d221e4a317d712cb40709107b977" + integrity sha512-YwSqcLjQcRI0fUFpaSWwU10KIJPFW5Qh+d3cT5DOgx81dypRuUSiPkKFmBY/CDs/R1KdHRadthkcXg2rqAon8Q== dependencies: broccoli-funnel "^3.0.3" broccoli-merge-trees "^4.2.0" + ember-cli-babel "^7.23.0" + ember-cli-version-checker "^5.1.1" qunit@^2.9.3: version "2.11.2" From b5be2e9b5d404b92962d6f93588bf6187b065862 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 11 Nov 2020 06:48:45 +0000 Subject: [PATCH 736/879] build(deps-dev): bump ember-compatibility-helpers from 1.2.1 to 1.2.2 Bumps [ember-compatibility-helpers](https://github.com/pzuraq/ember-compatibility-helpers) from 1.2.1 to 1.2.2. - [Release notes](https://github.com/pzuraq/ember-compatibility-helpers/releases) - [Changelog](https://github.com/pzuraq/ember-compatibility-helpers/blob/master/CHANGELOG.md) - [Commits](https://github.com/pzuraq/ember-compatibility-helpers/compare/v1.2.1...v1.2.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/yarn.lock b/yarn.lock index b2b32e478..d5dac740a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6617,7 +6617,7 @@ ember-cli-uglify@^3.0.0: broccoli-uglify-sourcemap "^3.1.0" lodash.defaultsdeep "^4.6.0" -ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0, ember-cli-version-checker@^2.1.1, ember-cli-version-checker@^2.1.2: +ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0, ember-cli-version-checker@^2.1.2: version "2.2.0" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.2.0.tgz#47771b731fe0962705e27c8199a9e3825709f3b3" integrity sha512-G+KtYIVlSOWGcNaTFHk76xR4GdzDLzAS4uxZUKdASuFX0KJE43C6DaqL+y3VTpUFLI2FIkAS6HZ4I1YBi+S3hg== @@ -6757,22 +6757,13 @@ ember-code-snippet@^3.0.0: es6-promise "^1.0.0" glob "^7.1.3" -ember-compatibility-helpers@^1.0.2, ember-compatibility-helpers@^1.1.1, ember-compatibility-helpers@^1.1.2, ember-compatibility-helpers@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.2.0.tgz#feee16c5e9ef1b1f1e53903b241740ad4b01097e" - integrity sha512-pUW4MzJdcaQtwGsErYmitFRs0rlCYBAnunVzlFFUBr4xhjlCjgHJo0b53gFnhTgenNM3d3/NqLarzRhDTjXRTg== - dependencies: - babel-plugin-debug-macros "^0.2.0" - ember-cli-version-checker "^2.1.1" - semver "^5.4.1" - -ember-compatibility-helpers@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.2.1.tgz#87c92c4303f990ff455c28ca39fb3ee11441aa16" - integrity sha512-6wzYvnhg1ihQUT5yGqnLtleq3Nv5KNv79WhrEuNU9SwR4uIxCO+KpyC7r3d5VI0EM7/Nmv9Nd0yTkzmTMdVG1A== +ember-compatibility-helpers@^1.0.2, ember-compatibility-helpers@^1.1.1, ember-compatibility-helpers@^1.1.2, ember-compatibility-helpers@^1.2.0, ember-compatibility-helpers@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.2.2.tgz#839e0c24190b7a2ec8c39b80e030811b1a95b6d3" + integrity sha512-EKyCGOGBvKkBsk6wKfg3GhjTvTTkcEwzl/cv4VYvZM18cihmjGNpliR4BymWsKRWrv4VJLyq15Vhk3NHkSNBag== dependencies: babel-plugin-debug-macros "^0.2.0" - ember-cli-version-checker "^2.1.1" + ember-cli-version-checker "^5.1.1" semver "^5.4.1" ember-composable-helpers@^2.4.0: From 721de9455d38dc619cc8a9bfa4afc286108b4630 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 19 Nov 2020 06:43:41 +0000 Subject: [PATCH 737/879] build(deps-dev): bump ember-composable-helpers from 4.3.1 to 4.3.2 Bumps [ember-composable-helpers](https://github.com/DockYard/ember-composable-helpers) from 4.3.1 to 4.3.2. - [Release notes](https://github.com/DockYard/ember-composable-helpers/releases) - [Changelog](https://github.com/DockYard/ember-composable-helpers/blob/master/CHANGELOG.md) - [Commits](https://github.com/DockYard/ember-composable-helpers/compare/v4.3.1...v4.3.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index d5dac740a..094f91bdd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6777,9 +6777,9 @@ ember-composable-helpers@^2.4.0: resolve "^1.10.0" ember-composable-helpers@^4.1.2: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.3.1.tgz#d4d0953903549b4fbe01bb923df154b94eb8b4ef" - integrity sha512-m7BEosHnMxpQ2tKdEdQbJTvp8+9vK4OsH3P5ruhIZgo4s5UVmVMz8x0ThXLR5LAIAKFohBhNaZUwd/vH+/aLRA== + version "4.3.2" + resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.3.2.tgz#b8cb14c69436bf038809c7a8b413f5be45eb920d" + integrity sha512-QLH7mK4whJ4K960iNCKoIrBbcmMzNWEvARAj+RDVMqQCbvq8SMhvtBKeEYUMrPJeheCKHsR7Ox/7N2rHiNU3Ng== dependencies: "@babel/core" "^7.0.0" broccoli-funnel "2.0.1" From e5673a17a27264392fe5769f5bd09996ec25bd48 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 30 Nov 2020 06:53:37 +0000 Subject: [PATCH 738/879] build(deps-dev): bump ember-composable-helpers from 4.3.2 to 4.4.0 Bumps [ember-composable-helpers](https://github.com/DockYard/ember-composable-helpers) from 4.3.2 to 4.4.0. - [Release notes](https://github.com/DockYard/ember-composable-helpers/releases) - [Changelog](https://github.com/DockYard/ember-composable-helpers/blob/master/CHANGELOG.md) - [Commits](https://github.com/DockYard/ember-composable-helpers/compare/v4.3.2...v4.4.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 094f91bdd..8fe918b57 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6777,9 +6777,9 @@ ember-composable-helpers@^2.4.0: resolve "^1.10.0" ember-composable-helpers@^4.1.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.3.2.tgz#b8cb14c69436bf038809c7a8b413f5be45eb920d" - integrity sha512-QLH7mK4whJ4K960iNCKoIrBbcmMzNWEvARAj+RDVMqQCbvq8SMhvtBKeEYUMrPJeheCKHsR7Ox/7N2rHiNU3Ng== + version "4.4.0" + resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.4.0.tgz#41d87253d16c56dec551ffea9b9fd09db7f351d6" + integrity sha512-RyTyzVJR3E2n3TmvE5K558OmzJOLvXiybbm6sKy1JR3rReRj/l4mbrwPrtUdIgsltbVXy6ZAcEJ9BRGrYN+Mbg== dependencies: "@babel/core" "^7.0.0" broccoli-funnel "2.0.1" From eac55139e3982aadf1385d71ebdf4bed4422528a Mon Sep 17 00:00:00 2001 From: Brian Gantzler Date: Mon, 30 Nov 2020 20:15:36 -0500 Subject: [PATCH 739/879] Bump ember-cli-addon-docs to 0.10.0 Drop ember-try 2.18 (#2081) --- .travis.yml | 2 +- config/ember-try.js | 8 +- package.json | 2 +- yarn.lock | 638 ++++++++++++++++++++++++-------------------- 4 files changed, 359 insertions(+), 291 deletions(-) diff --git a/.travis.yml b/.travis.yml index e0eb0c290..7406f4dce 100644 --- a/.travis.yml +++ b/.travis.yml @@ -52,7 +52,7 @@ jobs: script: yarn test:test-projects - stage: versioned tests - env: EMBER_TRY_SCENARIO=ember-lts-2.18 + env: EMBER_TRY_SCENARIO=ember-lts-3.20 - env: EMBER_TRY_SCENARIO=ember-release - env: EMBER_TRY_SCENARIO=ember-beta - env: EMBER_TRY_SCENARIO=ember-canary diff --git a/config/ember-try.js b/config/ember-try.js index 20d17d9c7..74d97baac 100644 --- a/config/ember-try.js +++ b/config/ember-try.js @@ -12,14 +12,10 @@ module.exports = function() { useYarn: true, scenarios: [ { - name: 'ember-lts-2.18', - env: { - EMBER_OPTIONAL_FEATURES: JSON.stringify({ 'jquery-integration': true }) - }, + name: 'ember-lts-3.20', npm: { devDependencies: { - '@ember/jquery': '^0.5.1', - 'ember-source': '~2.18.0' + 'ember-source': '~3.20.0' } } }, diff --git a/package.json b/package.json index ac7902ec7..92a6b006b 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "broccoli-asset-rev": "^3.0.0", "ember-ajax": "^5.0.0", "ember-cli": "~3.4.4", - "ember-cli-addon-docs": "^0.8.0", + "ember-cli-addon-docs": "^0.10.0", "ember-cli-addon-docs-esdoc": "^0.2.3", "ember-cli-dependency-checker": "^3.0.0", "ember-cli-deploy": "^1.0.2", diff --git a/yarn.lock b/yarn.lock index 8fe918b57..0b303e1e6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -507,7 +507,7 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.12.1": +"@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.3.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== @@ -1338,6 +1338,14 @@ ember-cli-babel "^6.16.0" ember-compatibility-helpers "^1.1.1" +"@ember/render-modifiers@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@ember/render-modifiers/-/render-modifiers-1.0.2.tgz#2e87c48db49d922ce4850d707215caaac60d8444" + integrity sha512-6tEnHl5+62NTSAG2mwhGMFPhUrJQjoVqV+slsn+rlTknm2Zik+iwxBQEbwaiQOU1FUYxkS8RWcieovRNMR8inQ== + dependencies: + ember-cli-babel "^7.10.0" + ember-modifier-manager-polyfill "^1.1.0" + "@ember/test-helpers@^1.7.1": version "1.7.2" resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-1.7.2.tgz#5b128dc5f6524c3850abf52668e6bd4fda401194" @@ -1350,6 +1358,16 @@ ember-cli-htmlbars-inline-precompile "^2.1.0" ember-test-waiters "^1.1.1" +"@ember/test-waiters@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ember/test-waiters/-/test-waiters-2.3.0.tgz#0da40153092ca064007888e63f6f5819efd38a63" + integrity sha512-cezrBqy1BbQbjm09EqU/mXJOdWRP4zdhPBAnpW1myAsmscAM0QQDMauNrZLWcrND0a0WfottxS+rvvddhWtfdQ== + dependencies: + ember-cli-babel "^7.21.0" + ember-cli-typescript "^3.1.4" + ember-cli-version-checker "^5.1.1" + semver "^7.1.3" + "@embroider/core@0.23.0", "@embroider/core@^0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@embroider/core/-/core-0.23.0.tgz#5992f6dbeaeac688d2436d7b8b7034738a7722a2" @@ -1416,7 +1434,7 @@ "@glimmer/interfaces" "^0.42.2" "@glimmer/vm" "^0.42.2" -"@glimmer/env@^0.1.7": +"@glimmer/env@0.1.7", "@glimmer/env@^0.1.7": version "0.1.7" resolved "https://registry.yarnpkg.com/@glimmer/env/-/env-0.1.7.tgz#fd2d2b55a9029c6b37a6c935e8c8871ae70dfa07" integrity sha1-/S0rVakCnGs3psk16MiHGucN+gc= @@ -1426,6 +1444,13 @@ resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.42.2.tgz#9cf8d6f8f5eee6bfcfa36919ca68ae716e1f78db" integrity sha512-7LOuQd02cxxNNHChzdHMAU8/qOeQvTro141CU5tXITP7z6aOv2D2gkFdau97lLQiVxezGrh8J7h8GCuF7TEqtg== +"@glimmer/interfaces@^0.61.2": + version "0.61.2" + resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.61.2.tgz#c8760d9aab6469d4a3bde923f129fb86a3b70262" + integrity sha512-i4qTGFKXWD1Bjr3V6HVxTRWj8DzAhXQ0W0pvsymDRY/r386crH11sTclp8ZFyEiybA8JBlsUvadX8lUD7Oc0TA== + dependencies: + "@simple-dom/interface" "^1.4.0" + "@glimmer/low-level@^0.42.2": version "0.42.2" resolved "https://registry.yarnpkg.com/@glimmer/low-level/-/low-level-0.42.2.tgz#52c745414d1d04c4245c369bd132c0e786c816ef" @@ -1460,7 +1485,7 @@ "@glimmer/vm" "^0.42.2" "@glimmer/wire-format" "^0.42.2" -"@glimmer/syntax@^0.42.1", "@glimmer/syntax@^0.42.2": +"@glimmer/syntax@^0.42.1": version "0.42.2" resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.42.2.tgz#89bb3cb787285b84665dc0d8907d94b008e5be9a" integrity sha512-SR26SmF/Mb5o2cc4eLHpOyoX5kwwXP4KRhq4fbWfrvan74xVWA38PLspPCzwGhyVH/JsE7tUEPMjSo2DcJge/Q== @@ -1470,11 +1495,30 @@ handlebars "^4.0.13" simple-html-tokenizer "^0.5.8" +"@glimmer/syntax@^0.61.2": + version "0.61.2" + resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.61.2.tgz#a8c381872354ebf441e23cfd6fd27caacdb5356b" + integrity sha512-YiXP/saSy/JWVf6AiSWWZemCnYn6z9b4mAifqdba2D/3wrH5TScEiS01mDLlGi2HNhCXffcWf9aOAkEUbnOtFw== + dependencies: + "@glimmer/interfaces" "^0.61.2" + "@glimmer/util" "^0.61.2" + handlebars "^4.7.4" + simple-html-tokenizer "^0.5.9" + "@glimmer/util@^0.42.2": version "0.42.2" resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.42.2.tgz#9ca1631e42766ea6059f4b49d0bdfb6095aad2c4" integrity sha512-Heck0baFSaWDanCYtmOcLeaz7v+rSqI8ovS7twrp2/FWEteb3Ze5sWQ2BEuSAG23L/k/lzVwYM/MY7ZugxBpaA== +"@glimmer/util@^0.61.2": + version "0.61.2" + resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.61.2.tgz#c1d7ccfdd38f97c828e218c6d8e237c0c96ff724" + integrity sha512-xel7wbNldpHzDOmC4GJ1je4UnSmehy5MGzPp/rEON9OcSggCrl2v8cEP413TMfyRGDQJ5Houkr0R4zpvs8aqOg== + dependencies: + "@glimmer/env" "0.1.7" + "@glimmer/interfaces" "^0.61.2" + "@simple-dom/interface" "^1.4.0" + "@glimmer/vm@^0.42.2": version "0.42.2" resolved "https://registry.yarnpkg.com/@glimmer/vm/-/vm-0.42.2.tgz#492a4f05eac587c3a37371b3c62593f20bef553d" @@ -2221,10 +2265,10 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -abortcontroller-polyfill@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.4.0.tgz#0d5eb58e522a461774af8086414f68e1dda7a6c4" - integrity sha512-3ZFfCRfDzx3GFjO6RAkYx81lPGpUS20ISxux9gLxuKnqafNcFQo59+IoZqpO2WvQlyc287B62HDnDdNYRmlvWA== +abortcontroller-polyfill@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.5.0.tgz#2c562f530869abbcf88d949a2b60d1d402e87a7c" + integrity sha512-O6Xk757Jb4o0LMzMOMdWvxpHWrQzruYBaUruFaIOfAQRnWFxfdXYobw12jrVHGtoXk6WiiyYzc0QWN9aL62HQA== accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" @@ -2248,7 +2292,7 @@ acorn-globals@^1.0.4: dependencies: acorn "^2.1.0" -acorn-globals@^4.3.0, acorn-globals@^4.3.2: +acorn-globals@^4.3.0: version "4.3.4" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== @@ -2672,23 +2716,16 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@^7.0.0: - version "7.2.6" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.2.6.tgz#256672f86f7c735da849c4f07d008abb056067dc" - integrity sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ== - dependencies: - browserslist "^2.11.3" - caniuse-lite "^1.0.30000805" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^6.0.17" - postcss-value-parser "^3.2.3" - autoprefixer@^9.4.5: version "9.7.5" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.5.tgz#8df10b9ff9b5814a8d411a5cfbab9c793c392376" @@ -2702,6 +2739,19 @@ autoprefixer@^9.4.5: postcss "^7.0.27" postcss-value-parser "^4.0.3" +autoprefixer@^9.8.4: + version "9.8.6" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" + integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + colorette "^1.2.1" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + aws-sign2@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.5.0.tgz#c57103f7a17fc037f02d7c2e64b602ea223f7d63" @@ -3033,11 +3083,6 @@ babel-plugin-syntax-exponentiation-operator@^6.8.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= - babel-plugin-syntax-trailing-function-commas@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" @@ -3251,14 +3296,6 @@ babel-plugin-transform-exponentiation-operator@^6.22.0: babel-plugin-syntax-exponentiation-operator "^6.8.0" babel-runtime "^6.22.0" -babel-plugin-transform-object-rest-spread@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" - integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.26.0" - babel-plugin-transform-regenerator@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" @@ -3649,14 +3686,14 @@ broccoli-asset-rewrite@^2.0.0: dependencies: broccoli-filter "^1.2.3" -broccoli-autoprefixer@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/broccoli-autoprefixer/-/broccoli-autoprefixer-5.0.0.tgz#68c9f3bfdfff9df2d39e46545b9cf9d4443d6a16" - integrity sha1-aMnzv9//nfLTnkZUW5z51EQ9ahY= +broccoli-autoprefixer@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/broccoli-autoprefixer/-/broccoli-autoprefixer-8.0.0.tgz#9c21422e2597433146a43df4b02b6699b0885489" + integrity sha512-9HRCaMLihugxO/f55ESmgpjGiKRN5dWlI7ub5dAOl2zLgVCcV5F4BxNrkLn8nhuQABd1WuYFGmv2GwdQsiuXSg== dependencies: - autoprefixer "^7.0.0" - broccoli-persistent-filter "^1.1.6" - postcss "^6.0.1" + autoprefixer "^9.8.4" + broccoli-persistent-filter "^3.0.0" + postcss "^7.0.2" broccoli-babel-transpiler@^6.5.0: version "6.5.1" @@ -3886,7 +3923,7 @@ broccoli-funnel@2.0.1: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-funnel@^1.0.1, broccoli-funnel@^1.1.0: +broccoli-funnel@^1.0.1: version "1.2.0" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-1.2.0.tgz#cddc3afc5ff1685a8023488fff74ce6fb5a51296" integrity sha1-zdw6/F/xaFqAI0iP/3TOb7WlEpY= @@ -3978,7 +4015,7 @@ broccoli-merge-trees@3.0.2, broccoli-merge-trees@^3.0.0, broccoli-merge-trees@^3 broccoli-plugin "^1.3.0" merge-trees "^2.0.0" -broccoli-merge-trees@^1.0.0, broccoli-merge-trees@^1.1.1: +broccoli-merge-trees@^1.0.0: version "1.2.4" resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-1.2.4.tgz#a001519bb5067f06589d91afa2942445a2d0fdb5" integrity sha1-oAFRm7UGfwZYnZGvopQkRaLQ/bU= @@ -4000,7 +4037,7 @@ broccoli-merge-trees@^2.0.0: broccoli-plugin "^1.3.0" merge-trees "^1.0.1" -broccoli-merge-trees@^4.2.0: +broccoli-merge-trees@^4.0.0, broccoli-merge-trees@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-4.2.0.tgz#692d3c163ecea08c5714a9434d664e628919f47c" integrity sha512-nTrQe5AQtCrW4enLRvbD/vTLHqyW2tz+vsLXQe4IEaUhepuMGVKJJr+I8n34Vu6fPjmPLwTjzNC8izMIDMtHPw== @@ -4107,6 +4144,23 @@ broccoli-persistent-filter@^2.1.0, broccoli-persistent-filter@^2.1.1, broccoli-p sync-disk-cache "^1.3.3" walk-sync "^1.0.0" +broccoli-persistent-filter@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-3.1.2.tgz#41da6b9577be09a170ecde185f2c5a6099f99c4e" + integrity sha512-CbU95RXXVyy+eJV9XTiHUC7NnsY3EvdVrGzp3YgyvO2bzXZFE5/GzDp4X/VQqX+jsk4qyT1HvMOF0sD1DX68TQ== + dependencies: + async-disk-cache "^2.0.0" + async-promise-queue "^1.0.3" + broccoli-plugin "^4.0.3" + fs-tree-diff "^2.0.0" + hash-for-dep "^1.5.0" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + promise-map-series "^0.2.1" + rimraf "^3.0.0" + symlink-or-copy "^1.0.1" + sync-disk-cache "^2.0.0" + broccoli-persistent-filter@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-3.1.1.tgz#318c68a82d5759582bb60e7e2c0f3ca008176224" @@ -4134,18 +4188,18 @@ broccoli-plugin@1.1.0: rimraf "^2.3.4" symlink-or-copy "^1.0.1" -"broccoli-plugin@1.3.1 - 3", broccoli-plugin@^3.0.0, broccoli-plugin@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-3.1.0.tgz#54ba6dd90a42ec3db5624063292610e326b1e542" - integrity sha512-7w7FP8WJYjLvb0eaw27LO678TGGaom++49O1VYIuzjhXjK5kn2+AMlDm7CaUFw4F7CLGoVQeZ84d8gICMJa4lA== +"broccoli-plugin@1.5.1 - 5", broccoli-plugin@^4.0.1, broccoli-plugin@^4.0.2, broccoli-plugin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-4.0.3.tgz#9dcfbfb6a1b27a37cc22e65c071719ce9f92bc1e" + integrity sha512-CtAIEYq5K+4yQv8c/BHymOteuyjDAJfvy/asu4LudIWcMSS7dTn3yGI5gNBkwHG+qlRangYkHJNVAcDZMQbSVQ== dependencies: broccoli-node-api "^1.6.0" - broccoli-output-wrapper "^2.0.0" - fs-merger "^3.0.1" + broccoli-output-wrapper "^3.2.1" + fs-merger "^3.1.0" promise-map-series "^0.2.1" quick-temp "^0.1.3" - rimraf "^2.3.4" - symlink-or-copy "^1.1.8" + rimraf "^3.0.0" + symlink-or-copy "^1.3.0" broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli-plugin@^1.2.1, broccoli-plugin@^1.3.0, broccoli-plugin@^1.3.1: version "1.3.1" @@ -4167,31 +4221,32 @@ broccoli-plugin@^2.0.0, broccoli-plugin@^2.1.0: rimraf "^2.3.4" symlink-or-copy "^1.1.8" -broccoli-plugin@^4.0.1, broccoli-plugin@^4.0.2, broccoli-plugin@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-4.0.3.tgz#9dcfbfb6a1b27a37cc22e65c071719ce9f92bc1e" - integrity sha512-CtAIEYq5K+4yQv8c/BHymOteuyjDAJfvy/asu4LudIWcMSS7dTn3yGI5gNBkwHG+qlRangYkHJNVAcDZMQbSVQ== +broccoli-plugin@^3.0.0, broccoli-plugin@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-3.1.0.tgz#54ba6dd90a42ec3db5624063292610e326b1e542" + integrity sha512-7w7FP8WJYjLvb0eaw27LO678TGGaom++49O1VYIuzjhXjK5kn2+AMlDm7CaUFw4F7CLGoVQeZ84d8gICMJa4lA== dependencies: broccoli-node-api "^1.6.0" - broccoli-output-wrapper "^3.2.1" - fs-merger "^3.1.0" + broccoli-output-wrapper "^2.0.0" + fs-merger "^3.0.1" promise-map-series "^0.2.1" quick-temp "^0.1.3" - rimraf "^3.0.0" - symlink-or-copy "^1.3.0" + rimraf "^2.3.4" + symlink-or-copy "^1.1.8" -broccoli-postcss-single@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/broccoli-postcss-single/-/broccoli-postcss-single-3.0.0.tgz#1393f87b69e4bbf20a1a1e614e09bbf066db28a2" - integrity sha512-+CsV6zdK9CXTplZvQeAsZm7mEh+BwIN6GBzpqm7agqsMZTvW6kkcWDaL2ahG1+Aq2HfLYk1Sam6iQ3jdESNmPA== +broccoli-postcss-single@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/broccoli-postcss-single/-/broccoli-postcss-single-4.0.1.tgz#21f1494826058c974fd746bba7d10976d9cce26d" + integrity sha512-WfIKXqkTNyA0OJuJKoUJ2TxerRvtkiwYEK8KY5gHGr/GGqPHYWVnAUN5/O8/LWBNhgr9M94KstpXe+GqXyEflA== dependencies: broccoli-caching-writer "^3.0.3" include-path-searcher "^0.1.0" - mkdirp "^0.5.1" + minimist ">=1.2.5" + mkdirp "^1.0.3" object-assign "^4.1.1" postcss "^7.0.0" -broccoli-postcss@^5.0.0: +broccoli-postcss@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/broccoli-postcss/-/broccoli-postcss-5.1.0.tgz#5b660fa72ba921b01574b4ab10449b20890bba0a" integrity sha512-f5cHP5g7EFidu9w88WOLTtbk4dd/W7amK0nek08FkmUII2h4W/Je4EV26HtMEm9nb1hKI301wwuEQ5AQRsVYog== @@ -4451,14 +4506,6 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^2.11.3: - version "2.11.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" - integrity sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA== - dependencies: - caniuse-lite "^1.0.30000792" - electron-to-chromium "^1.3.30" - browserslist@^3.2.6: version "3.2.8" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" @@ -4686,7 +4733,7 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001036: +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001036: version "1.0.30001038" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz#44da3cbca2ab6cb6aa83d1be5d324e17f141caff" integrity sha512-zii9quPo96XfOiRD4TrfYGs+QsGZpb2cGiMAzPjtf/hpFgB6zCPZgJb7I1+EATeMw/o+lG8FyRAnI+CWStHcaQ== @@ -4696,6 +4743,11 @@ caniuse-lite@^1.0.30001043: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001083.tgz#52410c20c6f029f604f0d45eca0439a82e712442" integrity sha512-CnYJ27awX4h7yj5glfK7r1TOI13LBytpLzEgfj0s4mY75/F8pnQcYjL+oVpmS38FB59+vU0gscQ9D8tc+lIXvA== +caniuse-lite@^1.0.30001109: + version "1.0.30001162" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001162.tgz#9f83aad1f42539ce9aab58bb177598f2f8e22ec6" + integrity sha512-E9FktFxaNnp4ky3ucIGzEXLM+Knzlpuq1oN1sFAU0KeayygabGTmOsndpo8QrL4D9pcThlf4D2pUKaDxPCUmVw== + capture-exit@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" @@ -4980,7 +5032,7 @@ cli-width@^3.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== -clipboard@^2.0.0: +clipboard@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.6.tgz#52921296eec0fdf77ead1749421b21c968647376" integrity sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg== @@ -5101,6 +5153,11 @@ color@^3.1.2: color-convert "^1.9.1" color-string "^1.5.2" +colorette@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" + integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== + colors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" @@ -5532,7 +5589,7 @@ cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0", cssom@^0.3.4, cssom@~0.3.6: resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== -cssom@^0.4.1, cssom@^0.4.4: +cssom@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== @@ -5551,7 +5608,7 @@ cssstyle@^1.1.1: dependencies: cssom "0.3.x" -cssstyle@^2.0.0, cssstyle@^2.2.0: +cssstyle@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.2.0.tgz#e4c44debccd6b7911ed617a4395e5754bba59992" integrity sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA== @@ -5587,7 +5644,7 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -data-urls@^1.0.1, data-urls@^1.1.0: +data-urls@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== @@ -5956,7 +6013,7 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.30, electron-to-chromium@^1.3.380, electron-to-chromium@^1.3.47: +electron-to-chromium@^1.3.380, electron-to-chromium@^1.3.47: version "1.3.386" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.386.tgz#224f97c808da76014096848f80bb9342b6a95cdb" integrity sha512-M7JHfp32Bq6Am59AWgglh2d3nqe6y8Y94Vcb/AXUsO3DGvKUHYI5ML9+U5oNShfdOEfurrrjKSoSgFt2mz7mpw== @@ -5997,16 +6054,18 @@ ember-angle-bracket-invocation-polyfill@^2.0.2: ember-compatibility-helpers "^1.0.2" silent-error "^1.1.1" -ember-app-scheduler@^1.0.5: - version "1.0.8" - resolved "https://registry.yarnpkg.com/ember-app-scheduler/-/ember-app-scheduler-1.0.8.tgz#37adacce2fa5ab59324e2c0b08f3c4a3568025b4" - integrity sha512-fYCOhQTLb1b+TZ2PBSqyvHXVAxf7qfWD0ZSJTd/IdU/xbLJSt34X75w7qK2uBHZCkVvCNm/ATW3pjFC/0zYk7A== +ember-app-scheduler@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/ember-app-scheduler/-/ember-app-scheduler-5.1.1.tgz#1dd0bd26d8b82b709b7ec760472059c65951e93d" + integrity sha512-exbZ6wDssBwK+tW4xlQhGzFMng11H0w8jX//E1rjosEXlAtX1X2G0wc1135kX4GJmp5Bp9Pa+HCkH5P2SKAViw== dependencies: + "@ember/test-waiters" "^2.3.0" "@types/ember" "^3.1.0" "@types/rsvp" "^4.0.2" - ember-cli-babel "^7.1.3" - ember-cli-typescript "^2.0.0" + ember-cli-babel "^7.23.0" + ember-cli-typescript "^3.1.4" ember-compatibility-helpers "^1.1.2" + ember-destroyable-polyfill "^2.0.2" ember-assign-polyfill@^2.5.0, ember-assign-polyfill@^2.6.0: version "2.6.0" @@ -6016,7 +6075,7 @@ ember-assign-polyfill@^2.5.0, ember-assign-polyfill@^2.6.0: ember-cli-babel "^6.16.0" ember-cli-version-checker "^2.0.0" -ember-auto-import@^1.2.19, ember-auto-import@^1.5.3: +ember-auto-import@^1.2.19, ember-auto-import@^1.5.3, ember-auto-import@^1.6.0: version "1.7.0" resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.7.0.tgz#dd809fbe3d40647f2af443072405094d0e77ecf5" integrity sha512-onp7XZKwiit3BgkOPV/obi3fvLJmDNKTTjRsVtYz63yWeyT3ahiM8BIvJYzHGL4cxlGLvwpTJy2HYBDs6ZtvoQ== @@ -6067,62 +6126,60 @@ ember-cli-addon-docs-esdoc@^0.2.3: tmp "^0.0.33" walk-sync "^0.3.2" -ember-cli-addon-docs@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.8.0.tgz#090e4c2cc5b1179779d6a59234eb0f080a194956" - integrity sha512-Atg3UY6DypPu2NYsx5iOvsfD3QJjpGB8HQWmXo6kV4V5d8f3XK9gl8GB+l7l3JUZei6Lnf8OlILKkr5nSUTycQ== +ember-cli-addon-docs@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.10.0.tgz#c813bc187f5c46737e6c75f9579cc1df0d1f4345" + integrity sha512-6sT/DWvMvcmTromVKka/UVwjPHLIPgNcH/UmFqgyaIqfkjz3JXjclSjun/RQEWhGtp8q7TJT8CYHhj7rn0Zm/Q== dependencies: - "@glimmer/syntax" "^0.42.2" + "@glimmer/syntax" "^0.61.2" broccoli-bridge "^1.0.0" broccoli-caching-writer "^3.0.3" broccoli-debug "^0.6.5" broccoli-filter "^1.3.0" - broccoli-funnel "^2.0.2" - broccoli-merge-trees "^3.0.2" - broccoli-persistent-filter "^2.3.1" - broccoli-plugin "1.3.1 - 3" + broccoli-funnel "^3.0.3" + broccoli-merge-trees "^4.2.0" + broccoli-persistent-filter "^3.1.0" + broccoli-plugin "1.5.1 - 5" broccoli-source "^3.0.0" broccoli-stew "^3.0.0" - chalk "^2.4.2" + chalk "^4.1.0" ember-angle-bracket-invocation-polyfill "^2.0.2" ember-assign-polyfill "^2.6.0" - ember-auto-import "^1.5.3" - ember-cli-autoprefixer "^0.8.1" - ember-cli-babel "^7.19.0" - ember-cli-clipboard "^0.13.0" - ember-cli-htmlbars "^4.3.1" - ember-cli-postcss "^5.0.0" + ember-auto-import "^1.6.0" + ember-cli-autoprefixer "^1.0.2" + ember-cli-babel "^7.21.0" + ember-cli-clipboard "^0.15.0" + ember-cli-htmlbars "^5.2.0" + ember-cli-postcss "^6.0.1" ember-cli-sass "10.0.1" - ember-cli-string-helpers "^4.0.5" + ember-cli-string-helpers "^5.0.0" ember-cli-string-utils "^1.1.0" ember-cli-version-checker "^3.1.3" ember-code-snippet "^3.0.0" - ember-composable-helpers "^2.4.0" + ember-composable-helpers "^4.2.2" ember-concurrency "^0.9.0 || ^0.10.0 || ^1.0.0" - ember-data "2.x - 3.x" - ember-fetch "^6.7.1" - ember-fetch-adapter "^0.4.3" + ember-fetch "^8.0.2" ember-get-config "^0.2.4" - ember-href-to "^1.15.1" - ember-keyboard "^4.0.0" + ember-href-to "^4.0.0" + ember-keyboard "^5.0.0" ember-modal-dialog "^3.0.0-beta.4" ember-named-arguments-polyfill "^1.0.0" ember-on-modifier "^1.0.0" - ember-responsive "^3.0.5" + ember-responsive "^4.0.0" ember-router-generator "^2.0.0" - ember-router-scroll "^1.3.3" + ember-router-scroll "^3.3.3" ember-svg-jar "^2.2.3" - ember-tether "^1.0.0" + ember-tether "^2.0.0" ember-truth-helpers "^2.1.0" esm "^3.2.25" - execa "^3.2.0" - fs-extra "^8.1.0" + execa "^4.0.3" + fs-extra "^9.0.1" git-repo-info "^2.1.1" highlight.js "^9.15.10" hosted-git-info "^3.0.4" html-entities "^1.2.1" inflected "^2.0.3" - jsdom "^15.2.1" + jsdom "^16.4.0" json-api-serializer "^2.2.1" liquid-fire "^0.29.5 || ^0.30.0 || ^0.31.0" lodash "^4.17.15" @@ -6133,19 +6190,19 @@ ember-cli-addon-docs@^0.8.0: quick-temp "^0.1.8" resolve "^1.12.0" sass "^1.22.10" - semver "^6.3.0" + semver "^7.3.2" striptags "^3.1.1" tailwindcss "^1.2.0" walk-sync "^2.0.2" yuidocjs "^0.10.2" -ember-cli-autoprefixer@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/ember-cli-autoprefixer/-/ember-cli-autoprefixer-0.8.1.tgz#071dd9574451057b03dcc03b71f5bd9cb07ef332" - integrity sha1-Bx3ZV0RRBXsD3MA7cfW9nLB+8zI= +ember-cli-autoprefixer@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ember-cli-autoprefixer/-/ember-cli-autoprefixer-1.0.3.tgz#d4603c2e649c0b3a094c52b87664e172b550924e" + integrity sha512-bh0BrUKQ4G4aj85mG7k3SkhQB5QpB1NipmYPhXQvMjOw5RihqF3k5aB98RFx/0AWAVnY8pF17iIrsHMvvwD1WQ== dependencies: - broccoli-autoprefixer "^5.0.0" - lodash "^4.0.0" + broccoli-autoprefixer "^8.0.0" + ember-cli-htmlbars "^5.0.0" ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.0, ember-cli-babel-plugin-helpers@^1.1.1: version "1.1.1" @@ -6179,7 +6236,7 @@ ember-cli-babel@7.7.3: ensure-posix-path "^1.0.2" semver "^5.5.0" -ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.17.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.7.2, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2: +ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.17.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.7.2, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2: version "6.18.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz#3f6435fd275172edeff2b634ee7b29ce74318957" integrity sha512-7ceC8joNYxY2wES16iIBlbPSxwKDBhYwC8drU3ZEvuPDMwVv1KzxCNu1fvxyFEBWhwaRNTUxSCsEVoTd9nosGA== @@ -6198,7 +6255,7 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.5, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.2, ember-cli-babel@^7.20.5, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.4.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: version "7.23.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.23.0.tgz#ec580aa2c115d0810e454dd5c2fffce238284b92" integrity sha512-ix58DlRDAbGITtdJoRUPcAoQwKLYr/x/kIXjU9u1ATyhmuUjqb+0FDXghOWbkNihGiNOqBBR49+LBgK9AeBcNw== @@ -6241,16 +6298,16 @@ ember-cli-broccoli-sane-watcher@^2.1.1: rsvp "^3.0.18" sane "^2.4.1" -ember-cli-clipboard@^0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/ember-cli-clipboard/-/ember-cli-clipboard-0.13.0.tgz#47d3de3aec09987409c162cbff36f966a2c138b7" - integrity sha512-AA2J5lliP/DXUFKnQ+r/D3e4xiN3ttlmN8W+8WfZg7K8VeOYlWpMyGcUjmuLa7inLUCMjLbtG6nXc20AQ5OjDg== +ember-cli-clipboard@^0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/ember-cli-clipboard/-/ember-cli-clipboard-0.15.0.tgz#3704baaeab1f0a2df13b3d77632dea7266aabe54" + integrity sha512-gcjm2ofr3NOGH6/MFp+2AVqEKTYkdRUvRsVovTg45Iy414jKyWwxu9l3jWM0ZZkRc2IqjE0V2ta9JJe2/HRPUA== dependencies: - broccoli-funnel "^1.1.0" - clipboard "^2.0.0" - ember-cli-babel "^7.7.3" - ember-cli-htmlbars "^3.0.1" - fastboot-transform "^0.1.3" + "@ember/render-modifiers" "^1.0.1" + clipboard "^2.0.6" + ember-auto-import "^1.5.3" + ember-cli-babel "^7.20.2" + ember-cli-htmlbars "^4.2.3" ember-cli-dependency-checker@^3.0.0: version "3.2.0" @@ -6400,7 +6457,7 @@ ember-cli-htmlbars@^3.0.0, ember-cli-htmlbars@^3.0.1: json-stable-stringify "^1.0.1" strip-bom "^3.0.0" -ember-cli-htmlbars@^4.3.1: +ember-cli-htmlbars@^4.2.3: version "4.4.0" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.4.0.tgz#7ca17d5ca8f7550984346d9e6e93da0c3323f8d9" integrity sha512-ohgctqk7dXIZR4TgN0xRoUYltWhghFJgqmtuswQTpZ7p74RxI9PKx+E8WV/95mGcPzraesvMNBg5utQNvcqgNg== @@ -6420,7 +6477,7 @@ ember-cli-htmlbars@^4.3.1: strip-bom "^4.0.0" walk-sync "^2.0.2" -ember-cli-htmlbars@^5.3.1: +ember-cli-htmlbars@^5.0.0, ember-cli-htmlbars@^5.2.0, ember-cli-htmlbars@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.3.1.tgz#61793964fc2599ce750db9e972ab55c6dd177c48" integrity sha512-ZjQTt44euDoqLvUkWbt1svgNCXgLzOztEbc2qqYMQvhQig416LMrWK7l3SSbNU+BtLD5UIxmwvLfF1tsO2CVyA== @@ -6481,18 +6538,6 @@ ember-cli-moment-shim@^3.8.0: moment "^2.19.3" moment-timezone "^0.5.13" -ember-cli-node-assets@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/ember-cli-node-assets/-/ember-cli-node-assets-0.2.2.tgz#d2d55626e7cc6619f882d7fe55751f9266022708" - integrity sha1-0tVWJufMZhn4gtf+VXUfkmYCJwg= - dependencies: - broccoli-funnel "^1.0.1" - broccoli-merge-trees "^1.1.1" - broccoli-source "^1.1.0" - debug "^2.2.0" - lodash "^4.5.1" - resolve "^1.1.7" - ember-cli-normalize-entity-name@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-normalize-entity-name/-/ember-cli-normalize-entity-name-1.0.0.tgz#0b14f7bcbc599aa117b5fddc81e4fd03c4bad5b7" @@ -6505,15 +6550,15 @@ ember-cli-path-utils@^1.0.0: resolved "https://registry.yarnpkg.com/ember-cli-path-utils/-/ember-cli-path-utils-1.0.0.tgz#4e39af8b55301cddc5017739b77a804fba2071ed" integrity sha1-Tjmvi1UwHN3FAXc5t3qAT7ogce0= -ember-cli-postcss@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ember-cli-postcss/-/ember-cli-postcss-5.0.0.tgz#07891b2950e0a6e8b35234d5960575d0471da50a" - integrity sha512-znJOyXeYmhDF3DOocfcCUrnGN0iWmDGvMJKTVPszFeBd1/cqx+lSxc1Tx25RAF1KpOyI0FqD1amp6s9lud62EQ== +ember-cli-postcss@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ember-cli-postcss/-/ember-cli-postcss-6.0.1.tgz#f4c841192c2dddf7700a085a72cfb17a9ba3fea6" + integrity sha512-xnqcFE9/OdfnxqisLHys7VZLzzSSGg96fzTCL+E/q2RqvFmtUC9FRP1sXtt7/UCogB1m4cdqYeW/a0VD8zBgPg== dependencies: broccoli-file-creator "^2.1.1" - broccoli-merge-trees "^3.0.0" - broccoli-postcss "^5.0.0" - broccoli-postcss-single "^3.0.0" + broccoli-merge-trees "^4.0.0" + broccoli-postcss "^5.1.0" + broccoli-postcss-single "^4.0.0" ember-cli-babel "^7.1.0" merge "^1.2.0" @@ -6544,12 +6589,12 @@ ember-cli-sri@^2.1.1: dependencies: broccoli-sri-hash "^2.1.0" -ember-cli-string-helpers@^4.0.5: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ember-cli-string-helpers/-/ember-cli-string-helpers-4.0.6.tgz#2f38538bfb6b8226624077cfe3ce335b8269c05c" - integrity sha512-ge7ri4EU9rNwE4Z8HbACvuJeFyTi7113dRLzs205RvX9vf7kEaHIKijeroqVPUioPH62JdlojCDC2h0dCw2R7g== +ember-cli-string-helpers@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-string-helpers/-/ember-cli-string-helpers-5.0.0.tgz#b1e08ec3ca1c9a457f9fd9aafff60b5939fbf91d" + integrity sha512-PodD3Uf7BkOXIu95E6cWEC0ERroTiUOAwOr828Vb+fPFtV7WYNSC27C9Ds1ggCyyRqnXmpS0JSqCTN1gPZfkWQ== dependencies: - broccoli-funnel "^2.0.2" + broccoli-funnel "^3.0.3" ember-cli-babel "^7.7.3" ember-cli-string-utils@^1.0.0, ember-cli-string-utils@^1.1.0: @@ -6571,7 +6616,7 @@ ember-cli-test-loader@^2.2.0: dependencies: ember-cli-babel "^6.8.1" -ember-cli-typescript@^2.0.0, ember-cli-typescript@^2.0.2: +ember-cli-typescript@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-2.0.2.tgz#464984131fbdc05655eb61d1c3cdd911d3137f0d" integrity sha512-7I5azCTxOgRDN8aSSnJZIKSqr+MGnT+jLTUbBYqF8wu6ojs2DUnTePxUcQMcvNh3Q3B1ySv7Q/uZFSjdU9gSjA== @@ -6609,6 +6654,26 @@ ember-cli-typescript@^3.0.0: stagehand "^1.0.0" walk-sync "^2.0.0" +ember-cli-typescript@^3.1.3, ember-cli-typescript@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-3.1.4.tgz#21d6ccd670d1f2e34c9cce68c6e32c442f46806b" + integrity sha512-HJ73kL45OGRmIkPhBNFt31I1SGUvdZND+LCH21+qpq3pPlFpJG8GORyXpP+2ze8PbnITNLzwe5AwUrpyuRswdQ== + dependencies: + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.4.4" + "@babel/plugin-proposal-optional-chaining" "^7.6.0" + "@babel/plugin-transform-typescript" "~7.8.0" + ansi-to-html "^0.6.6" + broccoli-stew "^3.0.0" + debug "^4.0.0" + ember-cli-babel-plugin-helpers "^1.0.0" + execa "^3.0.0" + fs-extra "^8.0.0" + resolve "^1.5.0" + rsvp "^4.8.1" + semver "^6.3.0" + stagehand "^1.0.0" + walk-sync "^2.0.0" + ember-cli-uglify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ember-cli-uglify/-/ember-cli-uglify-3.0.0.tgz#8819665b2cc5fe70e3ba9fe7a94645209bc42fd6" @@ -6766,17 +6831,7 @@ ember-compatibility-helpers@^1.0.2, ember-compatibility-helpers@^1.1.1, ember-co ember-cli-version-checker "^5.1.1" semver "^5.4.1" -ember-composable-helpers@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-2.4.0.tgz#024bd6a8c338cc9cdf10f1141b119b8f72de205f" - integrity sha512-91ZqFnNG1EDL3WzxXWTgAy6EonPS7htWHletI5SOw5ezEzKbt6EGNBwT6QPhwariugtR8LEfYNQ9lXEiCZrX1w== - dependencies: - "@babel/core" "^7.0.0" - broccoli-funnel "2.0.1" - ember-cli-babel "^7.1.0" - resolve "^1.10.0" - -ember-composable-helpers@^4.1.2: +ember-composable-helpers@^4.1.2, ember-composable-helpers@^4.2.2: version "4.4.0" resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.4.0.tgz#41d87253d16c56dec551ffea9b9fd09db7f351d6" integrity sha512-RyTyzVJR3E2n3TmvE5K558OmzJOLvXiybbm6sKy1JR3rReRj/l4mbrwPrtUdIgsltbVXy6ZAcEJ9BRGrYN+Mbg== @@ -6795,7 +6850,7 @@ ember-composable-helpers@^4.1.2: ember-compatibility-helpers "^1.2.0" ember-maybe-import-regenerator "^0.1.6" -"ember-data@2.x - 3.x", ember-data@3.14.0: +ember-data@3.14.0: version "3.14.0" resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.14.0.tgz#e36584722bf84aef21a0541e10f2a3016b75b231" integrity sha512-qmABgVOR/BtQV8mSCskn9EHYewVENGbvMzJfnNZ4EEWVebYQKqy2tAw1DHfiOkCmUk2MpFnJi/UfyH0p4nWhhQ== @@ -6828,6 +6883,15 @@ ember-data@~3.14.0: ember-cli-typescript "^3.0.0" ember-inflector "^3.0.1" +ember-destroyable-polyfill@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ember-destroyable-polyfill/-/ember-destroyable-polyfill-2.0.2.tgz#2cc7532bd3c00e351b4da9b7fc683f4daff79671" + integrity sha512-9t+ya+9c+FkNM5IAyJIv6ETG8jfZQaUnFCO5SeLlV0wkSw7TOexyb61jh5GVee0KmknfRhrRGGAyT4Y0TwkZ+w== + dependencies: + ember-cli-babel "^7.22.1" + ember-cli-version-checker "^5.1.1" + ember-compatibility-helpers "^1.2.1" + ember-disable-prototype-extensions@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/ember-disable-prototype-extensions/-/ember-disable-prototype-extensions-1.1.3.tgz#1969135217654b5e278f9fe2d9d4e49b5720329e" @@ -6845,30 +6909,24 @@ ember-factory-for-polyfill@^1.3.1: dependencies: ember-cli-version-checker "^2.1.0" -ember-fetch-adapter@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/ember-fetch-adapter/-/ember-fetch-adapter-0.4.3.tgz#c3d2da83ff87f829ab347b841a3201b3cc7e1eb4" - integrity sha1-w9Lag/+H+CmrNHuEGjIBs8x+HrQ= - dependencies: - ember-cli-babel "^6.12.0" - -ember-fetch@^6.7.1: - version "6.7.2" - resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-6.7.2.tgz#82efce4a55a64863104347b71e598208b9acf518" - integrity sha512-+Dd++MJVkCXoqX2DPtFDjuoDMcLk+7fphLq7D8OoXwJq9KQMTff07sH18qhxWXV5Hqknvz3Uwy214g54vOboag== +ember-fetch@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-8.0.2.tgz#9838b9f01e33fcd23550ccf38ae4f1f90cc47113" + integrity sha512-BMwm8jLP5LCeT8Jbgz0jA04RsRyt06ZGMaC3Tx2DbHgoWOPlLMfkEKlCFE0dZVW8ZhuICKuyRZTzt4e8GrnnNA== dependencies: - abortcontroller-polyfill "^1.3.0" - broccoli-concat "^3.2.2" + abortcontroller-polyfill "^1.4.0" + broccoli-concat "^4.2.4" broccoli-debug "^0.6.5" - broccoli-merge-trees "^3.0.0" + broccoli-merge-trees "^4.2.0" broccoli-rollup "^2.1.1" - broccoli-stew "^2.1.0" + broccoli-stew "^3.0.0" broccoli-templater "^2.0.1" calculate-cache-key-for-tree "^2.0.0" caniuse-api "^3.0.0" - ember-cli-babel "^6.8.2" + ember-cli-babel "^7.19.0" + ember-cli-typescript "^3.1.3" node-fetch "^2.6.0" - whatwg-fetch "^3.0.0" + whatwg-fetch "^3.4.0" ember-get-config@, ember-get-config@^0.3.0: version "0.3.0" @@ -6894,13 +6952,12 @@ ember-getowner-polyfill@^2.2.0: ember-cli-version-checker "^2.1.0" ember-factory-for-polyfill "^1.3.1" -ember-href-to@^1.15.1: - version "1.15.1" - resolved "https://registry.yarnpkg.com/ember-href-to/-/ember-href-to-1.15.1.tgz#1ba20ec201245c7cae7e2aa3eec50eb2aa25b729" - integrity sha1-G6IOwgEkXHyufiqj7sUOsqoltyk= +ember-href-to@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ember-href-to/-/ember-href-to-4.1.0.tgz#daa8b398bc5a51ba3ba5ff736e099f0a0d010b7b" + integrity sha512-h8xSzt9lQAUzk4JvXNnZjRj29hOWKo92VIHzH68io13UurDBaMmJ4WtXa0iy/awlSFs6h8BwpEWQeaCYIZDRuQ== dependencies: - ember-cli-babel "^6.8.2" - ember-router-service-polyfill "^1.0.2" + ember-cli-babel "^7.13.2" ember-ignore-children-helper@^1.0.1: version "1.0.1" @@ -6916,13 +6973,13 @@ ember-ignore-children-helper@^1.0.1: dependencies: ember-cli-babel "^6.6.0" -ember-keyboard@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/ember-keyboard/-/ember-keyboard-4.0.0.tgz#63764ebf0fac8153977b04faa73ef1c11820800c" - integrity sha512-445XJXehcxzB/bPFWNhA0OO/m6pQ3sfipCGcjMGSU3erpOZSfM4kZ7uRFEUIf0Pz0tyHRQ9BoLq5RY7VBEXUWw== +ember-keyboard@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ember-keyboard/-/ember-keyboard-5.0.0.tgz#a8ffd949c392b854d094f756116c063070e3ce63" + integrity sha512-ahWioA5ek1MU8JayyzowCiRQWRGXfqYTJPFOpxJsTDQmjpUm3HpQHVXmqZXy6wEPnRnhyngRpPbU5/K8cW0CMg== dependencies: - babel-plugin-transform-object-rest-spread "^6.26.0" - ember-cli-babel "^6.6.0" + "@babel/plugin-proposal-object-rest-spread" "^7.3.1" + ember-cli-babel "^7.4.1" ember-load-initializers@^2.0.0: version "2.1.2" @@ -6971,7 +7028,7 @@ ember-modal-dialog@^3.0.0-beta.4: ember-ignore-children-helper "^1.0.1" ember-wormhole "^0.5.5" -ember-modifier-manager-polyfill@^1.2.0: +ember-modifier-manager-polyfill@^1.1.0, ember-modifier-manager-polyfill@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/ember-modifier-manager-polyfill/-/ember-modifier-manager-polyfill-1.2.0.tgz#cf4444e11a42ac84f5c8badd85e635df57565dda" integrity sha512-bnaKF1LLKMkBNeDoetvIJ4vhwRPKIIumWr6dbVuW6W6p4QV8ZiO+GdF8J7mxDNlog9CeL9Z/7wam4YS86G8BYA== @@ -7032,12 +7089,12 @@ ember-resolver@^8.0.2: ember-cli-version-checker "^5.1.1" resolve "^1.17.0" -ember-responsive@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/ember-responsive/-/ember-responsive-3.0.5.tgz#690c96a051dcf7c10a8c3bcfb3b23ecc784e3f7d" - integrity sha512-tQMDxrIsDyfvyLWhyQ2MYpJVkm1pmBKJSQKgdA06EFRrVw5QYX4coXemSZOzBM9gPrkgOUfPp522GaldsAeInw== +ember-responsive@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/ember-responsive/-/ember-responsive-4.0.1.tgz#4833870c23ed309b6a7daa9c61b6254330f0edd6" + integrity sha512-/RfaacbIgYQf7fkbsxu72YZVFdsiMhKJ7YFGiDOFLaBmOxPSrz2YylmEXED81qw2TdudzWeVFuilpzUoWB1Jkg== dependencies: - ember-cli-babel "^6.6.0" + ember-cli-babel "^7.19.0" ember-rfc176-data@^0.3.13, ember-rfc176-data@^0.3.15: version "0.3.15" @@ -7058,22 +7115,15 @@ ember-router-generator@^2.0.0: "@babel/traverse" "^7.4.5" recast "^0.18.1" -ember-router-scroll@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/ember-router-scroll/-/ember-router-scroll-1.3.3.tgz#411991a671bd970497f5ce757baa627e850ae6e0" - integrity sha512-SwGsX7kceLXd3AZtKFcM/Ggl5lw37/a1v2rYHwWKZNMiyICBctJmWeEvALLQpiNzT8YMJrJHBkucHFmG07JPXQ== +ember-router-scroll@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ember-router-scroll/-/ember-router-scroll-3.3.3.tgz#65321318b74bfe5b06a243953d1b7d5e9faf1e82" + integrity sha512-n+TpZ9Dt/UQaRiNpNVTOUur+TsA6hAkorgi4hj7kjbchPd7/n54ZXUTSH0GVyMEkqsZHJeAmuNADjv3zHTfQDQ== dependencies: - ember-app-scheduler "^1.0.5" - ember-cli-babel "^7.1.2" + ember-app-scheduler "^5.0.1" + ember-cli-babel "^7.11.1" ember-compatibility-helpers "^1.1.2" -ember-router-service-polyfill@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/ember-router-service-polyfill/-/ember-router-service-polyfill-1.0.3.tgz#506d7fbd7179951410b7ffe8db171540601d88b1" - integrity sha1-UG1/vXF5lRQQt//o2xcVQGAdiLE= - dependencies: - ember-cli-babel "^6.8.2" - ember-source-channel-url@^1.0.1: version "1.2.0" resolved "https://registry.yarnpkg.com/ember-source-channel-url/-/ember-source-channel-url-1.2.0.tgz#77eb9d0889e5f5370e6c70fcb2696c63ff4a34a1" @@ -7146,13 +7196,13 @@ ember-test-waiters@^1.1.1: ember-cli-babel "^7.11.0" semver "^6.3.0" -ember-tether@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ember-tether/-/ember-tether-1.0.0.tgz#6117ea7351927887cb74fa5d46097dd300280c2d" - integrity sha1-YRfqc1GSeIfLdPpdRgl90wAoDC0= +ember-tether@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ember-tether/-/ember-tether-2.0.0.tgz#4fcb88749e8c11d3795173e96e894089328005b4" + integrity sha512-07QCzYE5VZsQ53SQQBDbP47E1s2qs6A9p1q6kOQjca693TVKxz0ZKTAKCXoSXOujG1n92hc1hRdA9rOSoxcBJw== dependencies: - ember-cli-babel "^6.6.0" - ember-cli-node-assets "^0.2.2" + ember-auto-import "^1.2.19" + ember-cli-babel "^7.1.2" tether "^1.4.0" ember-truth-helpers@^2.1.0: @@ -7384,7 +7434,7 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escodegen@^1.11.0, escodegen@^1.11.1, escodegen@^1.14.1, escodegen@^1.6.1: +escodegen@^1.11.0, escodegen@^1.14.1, escodegen@^1.6.1: version "1.14.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ== @@ -7662,7 +7712,7 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^3.0.0, execa@^3.2.0: +execa@^3.0.0: version "3.4.0" resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g== @@ -7678,6 +7728,21 @@ execa@^3.0.0, execa@^3.2.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + exif-parser@^0.1.12, exif-parser@^0.1.9: version "0.1.12" resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922" @@ -8302,6 +8367,16 @@ fs-extra@^8.0.0, fs-extra@^8.0.1, fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" + integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^1.0.0" + fs-merger@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/fs-merger/-/fs-merger-3.0.2.tgz#bf111334b89b8d65b95580d33c587dc79620a4e3" @@ -8676,7 +8751,7 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -handlebars@^4.0.13, handlebars@^4.0.4, handlebars@^4.3.1, handlebars@^4.4.2: +handlebars@^4.0.13, handlebars@^4.0.4, handlebars@^4.3.1, handlebars@^4.4.2, handlebars@^4.7.4: version "4.7.6" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e" integrity sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA== @@ -9733,39 +9808,7 @@ jsdom@^12.0.0: ws "^6.1.0" xml-name-validator "^3.0.0" -jsdom@^15.2.1: - version "15.2.1" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.1.tgz#d2feb1aef7183f86be521b8c6833ff5296d07ec5" - integrity sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g== - dependencies: - abab "^2.0.0" - acorn "^7.1.0" - acorn-globals "^4.3.2" - array-equal "^1.0.0" - cssom "^0.4.1" - cssstyle "^2.0.0" - data-urls "^1.1.0" - domexception "^1.0.1" - escodegen "^1.11.1" - html-encoding-sniffer "^1.0.2" - nwsapi "^2.2.0" - parse5 "5.1.0" - pn "^1.1.0" - request "^2.88.0" - request-promise-native "^1.0.7" - saxes "^3.1.9" - symbol-tree "^3.2.2" - tough-cookie "^3.0.1" - w3c-hr-time "^1.0.1" - w3c-xmlserializer "^1.1.2" - webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^7.0.0" - ws "^7.0.0" - xml-name-validator "^3.0.0" - -jsdom@^16.2.2: +jsdom@^16.2.2, jsdom@^16.4.0: version "16.4.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.4.0.tgz#36005bde2d136f73eee1a830c6d45e55408edddb" integrity sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w== @@ -9928,6 +9971,15 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" @@ -10945,7 +10997,7 @@ mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@~0.5.1: dependencies: minimist "^1.2.5" -mkdirp@^1.0.4: +mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== @@ -11952,7 +12004,7 @@ postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: indexes-of "^1.0.1" uniq "^1.0.1" -postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: +postcss-value-parser@^3.3.0: version "3.3.1" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== @@ -11962,6 +12014,11 @@ postcss-value-parser@^4.0.3: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d" integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg== +postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + postcss@7.0.32: version "7.0.32" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" @@ -11971,7 +12028,7 @@ postcss@7.0.32: source-map "^0.6.1" supports-color "^6.1.0" -postcss@^6.0.1, postcss@^6.0.17, postcss@^6.0.9: +postcss@^6.0.9: version "6.0.23" resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== @@ -11989,6 +12046,15 @@ postcss@^7.0.0, postcss@^7.0.11, postcss@^7.0.18, postcss@^7.0.21, postcss@^7.0. source-map "^0.6.1" supports-color "^6.1.0" +postcss@^7.0.2, postcss@^7.0.32: + version "7.0.35" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" + integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -12592,7 +12658,7 @@ request-promise-core@1.1.3: dependencies: lodash "^4.17.15" -request-promise-native@^1.0.5, request-promise-native@^1.0.7, request-promise-native@^1.0.8: +request-promise-native@^1.0.5, request-promise-native@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== @@ -12710,7 +12776,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.15.0, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: +resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.15.0, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== @@ -12955,7 +13021,7 @@ sax@>=0.6.0, sax@^1.1.4, sax@~1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -saxes@^3.1.3, saxes@^3.1.9: +saxes@^3.1.3: version "3.1.11" resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== @@ -13006,7 +13072,7 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.2: +semver@^7.1.3, semver@^7.3.2: version "7.3.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== @@ -13135,6 +13201,11 @@ simple-html-tokenizer@^0.5.8: resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.9.tgz#1a83fe97f5a3e39b335fddf71cfe9b0263b581c2" integrity sha512-w/3FEDN94r4JQ9WoYrIr8RqDIPZdyNkdpbK9glFady1CAEyD97XWCv8HFetQO21w81e7h7Nh59iYTyG1mUJftg== +simple-html-tokenizer@^0.5.9: + version "0.5.10" + resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.10.tgz#0843e4f00c9677f1c81e3dfeefcee0a4aca8e5d0" + integrity sha512-1DHMUmvUOGuUZ9/+cX/+hOhWhRD5dEw6lodn8WuV+T+cQ31hhBcCu1dcDsNotowi4mMaNhrLyKoS+DtB81HdDA== + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -14348,6 +14419,16 @@ universalify@^0.1.0, universalify@^0.1.2: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" + integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -14559,15 +14640,6 @@ w3c-hr-time@^1.0.1, w3c-hr-time@^1.0.2: dependencies: browser-process-hrtime "^1.0.0" -w3c-xmlserializer@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" - integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== - dependencies: - domexception "^1.0.1" - webidl-conversions "^4.0.2" - xml-name-validator "^3.0.0" - w3c-xmlserializer@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" @@ -14739,10 +14811,10 @@ whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: dependencies: iconv-lite "0.4.24" -whatwg-fetch@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" - integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== +whatwg-fetch@^3.4.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.5.0.tgz#605a2cd0a7146e5db141e29d1c62ab84c0c4c868" + integrity sha512-jXkLtsR42xhXg7akoDKvKWE40eJeI+2KZqcp2h3NsOrRnDvtWX36KcKl30dy+hxECivdk2BVUHVNrPtoMBUx6A== whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: version "2.3.0" @@ -14889,7 +14961,7 @@ ws@^6.1.0: dependencies: async-limiter "~1.0.0" -ws@^7.0.0, ws@^7.1.2, ws@^7.2.3: +ws@^7.1.2, ws@^7.2.3: version "7.2.3" resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46" integrity sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ== From 6d25cffe69faa81bf01b300b3433be415cc1523e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 1 Dec 2020 01:17:10 +0000 Subject: [PATCH 740/879] build(deps): [security] bump highlight.js from 9.18.1 to 9.18.5 Bumps [highlight.js](https://github.com/highlightjs/highlight.js) from 9.18.1 to 9.18.5. **This update includes a security fix.** - [Release notes](https://github.com/highlightjs/highlight.js/releases) - [Changelog](https://github.com/highlightjs/highlight.js/blob/9.18.5/CHANGES.md) - [Commits](https://github.com/highlightjs/highlight.js/compare/9.18.1...9.18.5) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 0b303e1e6..28b3b3b05 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8954,9 +8954,9 @@ heimdalljs@^0.3.0: rsvp "~3.2.1" highlight.js@^9.15.10: - version "9.18.1" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.1.tgz#ed21aa001fe6252bb10a3d76d47573c6539fe13c" - integrity sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg== + version "9.18.5" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.5.tgz#d18a359867f378c138d6819edfc2a8acd5f29825" + integrity sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA== himalaya@1.1.0: version "1.1.0" From 13f9618a274c2bf9c1a99c602ccc28db2180e4ed Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 4 Dec 2020 06:38:51 +0000 Subject: [PATCH 741/879] build(deps): bump ember-auto-import from 1.7.0 to 1.8.0 Bumps [ember-auto-import](https://github.com/ef4/ember-auto-import) from 1.7.0 to 1.8.0. - [Release notes](https://github.com/ef4/ember-auto-import/releases) - [Changelog](https://github.com/ef4/ember-auto-import/blob/master/CHANGELOG.md) - [Commits](https://github.com/ef4/ember-auto-import/compare/v1.7.0...v1.8.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 344 ++++++++++++++++++++---------------------------------- 1 file changed, 128 insertions(+), 216 deletions(-) diff --git a/yarn.lock b/yarn.lock index 28b3b3b05..ca7259d19 100644 --- a/yarn.lock +++ b/yarn.lock @@ -26,19 +26,19 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.1.tgz#d7386a689aa0ddf06255005b4b991988021101a0" integrity sha512-725AQupWJZ8ba0jbKceeFblZTY90McUBWMwHhkFQ9q1zKPJ95GUktljFcgcsIVwRnTnRKlcYzfiNImg5G9m6ZQ== -"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.12.0", "@babel/core@^7.3.4", "@babel/core@^7.8.7": - version "7.12.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.3.tgz#1b436884e1e3bff6fb1328dc02b208759de92ad8" - integrity sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g== +"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.3.4": + version "7.12.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" + integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.1" + "@babel/generator" "^7.12.5" "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.1" - "@babel/parser" "^7.12.3" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.7" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.9" + "@babel/types" "^7.12.7" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" @@ -48,12 +48,12 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.1.tgz#0d70be32bdaa03d7c51c8597dda76e0df1f15468" - integrity sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg== +"@babel/generator@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.5.tgz#a2c50de5c8b6d708ab95be5e6053936c1884a4de" + integrity sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A== dependencies: - "@babel/types" "^7.12.1" + "@babel/types" "^7.12.5" jsesc "^2.5.1" source-map "^0.5.0" @@ -378,14 +378,14 @@ "@babel/traverse" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helpers@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.1.tgz#8a8261c1d438ec18cb890434df4ec768734c1e79" - integrity sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g== +"@babel/helpers@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e" + integrity sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA== dependencies: "@babel/template" "^7.10.4" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" + "@babel/traverse" "^7.12.5" + "@babel/types" "^7.12.5" "@babel/highlight@^7.10.4": version "7.10.4" @@ -410,16 +410,16 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.0.tgz#a9d7e11aead25d3b422d17b2c6502c8dddef6a5d" integrity sha512-qvRvi4oI8xii8NllyEc4MDJjuZiNaRzyb7Y7lup1NqJV8TZHF4O27CcP+72WPn/k1zkgJ6WJfnIbk4jTsVAZHw== -"@babel/parser@^7.12.1": - version "7.12.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.2.tgz#9d2fcf24cafe85333ab0aff9f26b81bba356004d" - integrity sha512-LMN+SqTiZEonUw4hQA0A3zG8DnN0E1F4K107LbDDUnC+0chML1rvWgsHloC9weB4RmZweE0uhFq0eGX7Nr/PBQ== - -"@babel/parser@^7.12.3", "@babel/parser@^7.8.7": +"@babel/parser@^7.12.3": version "7.12.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.3.tgz#a305415ebe7a6c7023b40b5122a0662d928334cd" integrity sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw== +"@babel/parser@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.7.tgz#fee7b39fe809d0e73e5b25eecaf5780ef3d73056" + integrity sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg== + "@babel/parser@^7.4.5", "@babel/parser@^7.7.0", "@babel/parser@^7.8.6": version "7.9.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" @@ -890,7 +890,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-runtime@^7.12.0", "@babel/plugin-transform-runtime@^7.2.0": +"@babel/plugin-transform-runtime@^7.12.0", "@babel/plugin-transform-runtime@^7.12.1", "@babel/plugin-transform-runtime@^7.2.0": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz#04b792057eb460389ff6a4198e377614ea1e7ba5" integrity sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg== @@ -1076,6 +1076,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" + integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/template@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" @@ -1085,6 +1092,15 @@ "@babel/parser" "^7.10.4" "@babel/types" "^7.10.4" +"@babel/template@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc" + integrity sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.12.7" + "@babel/types" "^7.12.7" + "@babel/template@^7.8.3": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" @@ -1094,25 +1110,25 @@ "@babel/parser" "^7.8.6" "@babel/types" "^7.8.6" -"@babel/traverse@^7.1.6", "@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.6": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.1.tgz#941395e0c5cc86d5d3e75caa095d3924526f0c1e" - integrity sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw== +"@babel/traverse@^7.1.6", "@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.5", "@babel/traverse@^7.12.9", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.6": + version "7.12.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.9.tgz#fad26c972eabbc11350e0b695978de6cc8e8596f" + integrity sha512-iX9ajqnLdoU1s1nHt36JDI9KG4k+vmI8WgjK5d+aDTwQbL2fUnzedNedssA645Ede3PM2ma1n8Q4h2ohwXgMXw== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.1" + "@babel/generator" "^7.12.5" "@babel/helper-function-name" "^7.10.4" "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.12.1" - "@babel/types" "^7.12.1" + "@babel/parser" "^7.12.7" + "@babel/types" "^7.12.7" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.19" -"@babel/types@^7.1.6", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.7.2", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.8.7": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.1.tgz#e109d9ab99a8de735be287ee3d6a9947a190c4ae" - integrity sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA== +"@babel/types@^7.1.6", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.7.2", "@babel/types@^7.8.3", "@babel/types@^7.8.6": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.7.tgz#6039ff1e242640a29452c9ae572162ec9a8f5d13" + integrity sha512-MNyI92qZq6jrQkXvtIiykvl4WtoRrVV9MPn+ZfsoEENjiWcBQ3ZSHrkxnJWgWtLX3XXqX5hrSQ+X69wkmesXuQ== dependencies: "@babel/helper-validator-identifier" "^7.10.4" lodash "^4.17.19" @@ -1368,55 +1384,59 @@ ember-cli-version-checker "^5.1.1" semver "^7.1.3" -"@embroider/core@0.23.0", "@embroider/core@^0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@embroider/core/-/core-0.23.0.tgz#5992f6dbeaeac688d2436d7b8b7034738a7722a2" - integrity sha512-e3HniYcT7Xa2IAIjOfTnp6vLst1V8rPJ6Md9/WmDWvGFEyT4tRPPjk6EKjVN47CbsNGtW8iYUigLWEUbUWFWlA== +"@embroider/core@0.33.0", "@embroider/core@^0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@embroider/core/-/core-0.33.0.tgz#0fb1752d6e34ea45368e65c42e13220a57ffae76" + integrity sha512-Kd3W4vBJCSwskVislwldhuoe1RtdA04lRr2r2ccnPI4msCXxLn292WBaS7/x0LdEu2EMO5ffRDeQva2/xoS4Yg== dependencies: - "@babel/core" "^7.8.7" - "@babel/parser" "^7.8.7" + "@babel/core" "^7.12.3" + "@babel/parser" "^7.12.3" "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/traverse" "^7.8.6" - "@babel/types" "^7.8.7" - "@embroider/macros" "0.23.0" + "@babel/plugin-transform-runtime" "^7.12.1" + "@babel/runtime" "^7.12.5" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + "@embroider/macros" "0.33.0" assert-never "^1.1.0" babel-plugin-syntax-dynamic-import "^6.18.0" - broccoli-persistent-filter "^2.2.2" - broccoli-plugin "^3.0.0" - broccoli-source "^1.1.0" + broccoli-node-api "^1.7.0" + broccoli-persistent-filter "^3.1.2" + broccoli-plugin "^4.0.1" + broccoli-source "^3.0.0" debug "^3.1.0" + escape-string-regexp "^4.0.0" fast-sourcemap-concat "^1.4.0" filesize "^4.1.2" fs-extra "^7.0.1" fs-tree-diff "^2.0.0" handlebars "^4.4.2" js-string-escape "^1.0.1" - jsdom "^12.0.0" + jsdom "^16.4.0" json-stable-stringify "^1.0.1" lodash "^4.17.10" pkg-up "^2.0.0" resolve "^1.8.1" resolve-package-path "^1.2.2" - semver "^5.5.0" + semver "^7.3.2" strip-bom "^3.0.0" typescript-memoize "^1.0.0-alpha.3" walk-sync "^1.1.3" wrap-legacy-hbs-plugin-if-needed "^1.0.1" -"@embroider/macros@0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.23.0.tgz#b76a5b34b33228b4ad37136a29e7888722653dd8" - integrity sha512-Id4BA6VYvRmRTrMwTGFXUJkNIJDNnxNpcdAA5a3xWSTDlY0mroYBlPgnM2M+21pu+4p+Hpb4VkeK1+U/DBP6lg== +"@embroider/macros@0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.33.0.tgz#d5826ea7565bb69b57ba81ed528315fe77acbf9d" + integrity sha512-nl/1zRn+Wd3MO8Bb+YPqHmFl/2vwQLTsEB6Zt+K9bWXsM/kA+dPCeeCReLN6PbkMP16xxqtNSIrQ8Y49hnWjpg== dependencies: - "@babel/core" "^7.8.7" - "@babel/traverse" "^7.8.6" - "@babel/types" "^7.8.7" - "@embroider/core" "0.23.0" + "@babel/core" "^7.12.3" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + "@embroider/core" "0.33.0" assert-never "^1.1.0" - ember-cli-babel "^7.20.5" + ember-cli-babel "^7.23.0" lodash "^4.17.10" resolve "^1.8.1" - semver "^5.6.0" + semver "^7.3.2" "@fullhuman/postcss-purgecss@^2.1.2": version "2.3.0" @@ -2255,7 +2275,7 @@ abab@^1.0.0: resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" integrity sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4= -abab@^2.0.0, abab@^2.0.3: +abab@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== @@ -2292,14 +2312,6 @@ acorn-globals@^1.0.4: dependencies: acorn "^2.1.0" -acorn-globals@^4.3.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" - integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== - dependencies: - acorn "^6.0.1" - acorn-walk "^6.0.1" - acorn-globals@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" @@ -2322,11 +2334,6 @@ acorn-node@^1.6.1: acorn-walk "^7.0.0" xtend "^4.0.2" -acorn-walk@^6.0.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" - integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== - acorn-walk@^7.0.0, acorn-walk@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e" @@ -2342,7 +2349,7 @@ acorn@^5.0.0, acorn@^5.5.3: resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== -acorn@^6.0.1, acorn@^6.0.2, acorn@^6.0.7: +acorn@^6.0.7: version "6.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== @@ -4124,7 +4131,7 @@ broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-p symlink-or-copy "^1.0.1" walk-sync "^0.3.1" -broccoli-persistent-filter@^2.1.0, broccoli-persistent-filter@^2.1.1, broccoli-persistent-filter@^2.2.1, broccoli-persistent-filter@^2.2.2, broccoli-persistent-filter@^2.3.0, broccoli-persistent-filter@^2.3.1: +broccoli-persistent-filter@^2.1.0, broccoli-persistent-filter@^2.1.1, broccoli-persistent-filter@^2.2.1, broccoli-persistent-filter@^2.3.0, broccoli-persistent-filter@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.3.1.tgz#4a052e0e0868b344c3a2977e35a3d497aa9eca72" integrity sha512-hVsmIgCDrl2NFM+3Gs4Cr2TA6UPaIZip99hN8mtkaUPgM8UeVnCbxelCvBjUBHo0oaaqP5jzqqnRVvb568Yu5g== @@ -4144,7 +4151,7 @@ broccoli-persistent-filter@^2.1.0, broccoli-persistent-filter@^2.1.1, broccoli-p sync-disk-cache "^1.3.3" walk-sync "^1.0.0" -broccoli-persistent-filter@^3.0.0: +broccoli-persistent-filter@^3.0.0, broccoli-persistent-filter@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-3.1.2.tgz#41da6b9577be09a170ecde185f2c5a6099f99c4e" integrity sha512-CbU95RXXVyy+eJV9XTiHUC7NnsY3EvdVrGzp3YgyvO2bzXZFE5/GzDp4X/VQqX+jsk4qyT1HvMOF0sD1DX68TQ== @@ -4188,7 +4195,7 @@ broccoli-plugin@1.1.0: rimraf "^2.3.4" symlink-or-copy "^1.0.1" -"broccoli-plugin@1.5.1 - 5", broccoli-plugin@^4.0.1, broccoli-plugin@^4.0.2, broccoli-plugin@^4.0.3: +"broccoli-plugin@1.5.1 - 5", broccoli-plugin@^4.0.0, broccoli-plugin@^4.0.1, broccoli-plugin@^4.0.2, broccoli-plugin@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-4.0.3.tgz#9dcfbfb6a1b27a37cc22e65c071719ce9f92bc1e" integrity sha512-CtAIEYq5K+4yQv8c/BHymOteuyjDAJfvy/asu4LudIWcMSS7dTn3yGI5gNBkwHG+qlRangYkHJNVAcDZMQbSVQ== @@ -4221,7 +4228,7 @@ broccoli-plugin@^2.0.0, broccoli-plugin@^2.1.0: rimraf "^2.3.4" symlink-or-copy "^1.1.8" -broccoli-plugin@^3.0.0, broccoli-plugin@^3.1.0: +broccoli-plugin@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-3.1.0.tgz#54ba6dd90a42ec3db5624063292610e326b1e542" integrity sha512-7w7FP8WJYjLvb0eaw27LO678TGGaom++49O1VYIuzjhXjK5kn2+AMlDm7CaUFw4F7CLGoVQeZ84d8gICMJa4lA== @@ -5584,7 +5591,7 @@ csso@^3.5.1: dependencies: css-tree "1.0.0-alpha.29" -cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0", cssom@^0.3.4, cssom@~0.3.6: +cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0", cssom@~0.3.6: version "0.3.8" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== @@ -5601,13 +5608,6 @@ cssom@^0.4.4: dependencies: cssom "0.3.x" -cssstyle@^1.1.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" - integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== - dependencies: - cssom "0.3.x" - cssstyle@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.2.0.tgz#e4c44debccd6b7911ed617a4395e5754bba59992" @@ -5644,15 +5644,6 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -data-urls@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" - integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== - dependencies: - abab "^2.0.0" - whatwg-mimetype "^2.2.0" - whatwg-url "^7.0.0" - data-urls@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" @@ -5903,13 +5894,6 @@ domelementtype@^2.0.1: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== -domexception@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" - integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== - dependencies: - webidl-conversions "^4.0.2" - domexception@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" @@ -6076,27 +6060,28 @@ ember-assign-polyfill@^2.5.0, ember-assign-polyfill@^2.6.0: ember-cli-version-checker "^2.0.0" ember-auto-import@^1.2.19, ember-auto-import@^1.5.3, ember-auto-import@^1.6.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.7.0.tgz#dd809fbe3d40647f2af443072405094d0e77ecf5" - integrity sha512-onp7XZKwiit3BgkOPV/obi3fvLJmDNKTTjRsVtYz63yWeyT3ahiM8BIvJYzHGL4cxlGLvwpTJy2HYBDs6ZtvoQ== + version "1.8.0" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.8.0.tgz#de7624b36ceb53a5a5878ebfe86ae70f0fea7921" + integrity sha512-pX8rqT6oWiotz4n4rHDlYrVnQl0KVGanv/a+E2xUnkjsyL2K5JfrwJdyRaDsMQPNHkrz12HFnR/WKhjRoVDoIA== dependencies: "@babel/core" "^7.1.6" "@babel/preset-env" "^7.10.2" "@babel/traverse" "^7.1.6" "@babel/types" "^7.1.6" - "@embroider/core" "^0.23.0" + "@embroider/core" "^0.33.0" babel-core "^6.26.3" babel-loader "^8.0.6" babel-plugin-syntax-dynamic-import "^6.18.0" babel-template "^6.26.0" babylon "^6.18.0" broccoli-debug "^0.6.4" - broccoli-plugin "^1.3.0" + broccoli-node-api "^1.7.0" + broccoli-plugin "^4.0.0" debug "^3.1.0" ember-cli-babel "^7.0.0" enhanced-resolve "^4.0.0" fs-extra "^6.0.1" - fs-tree-diff "^1.0.0" + fs-tree-diff "^2.0.0" handlebars "^4.3.1" js-string-escape "^1.0.1" lodash "^4.17.19" @@ -6104,6 +6089,7 @@ ember-auto-import@^1.2.19, ember-auto-import@^1.5.3, ember-auto-import@^1.6.0: pkg-up "^2.0.0" resolve "^1.7.1" rimraf "^2.6.2" + semver "^7.3.4" symlink-or-copy "^1.2.0" typescript-memoize "^1.0.0-alpha.3" walk-sync "^0.3.3" @@ -6255,7 +6241,7 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.2, ember-cli-babel@^7.20.5, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.4.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.2, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.4.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: version "7.23.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.23.0.tgz#ec580aa2c115d0810e454dd5c2fffce238284b92" integrity sha512-ix58DlRDAbGITtdJoRUPcAoQwKLYr/x/kIXjU9u1ATyhmuUjqb+0FDXghOWbkNihGiNOqBBR49+LBgK9AeBcNw== @@ -7434,7 +7420,7 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escodegen@^1.11.0, escodegen@^1.14.1, escodegen@^1.6.1: +escodegen@^1.14.1, escodegen@^1.6.1: version "1.14.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ== @@ -8411,16 +8397,6 @@ fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5 path-posix "^1.0.0" symlink-or-copy "^1.1.8" -fs-tree-diff@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-1.0.2.tgz#0e2931733a85b55feb3472c0b89a20b0c03ac0de" - integrity sha512-Zro2ACaPVDgVOx9+s5s5AfPlAD0kMJdbwGvTGF6KC1SjxjiGWxJvV4mUTDkFVSy3OUw2C/f1qpdjF81hGqSBAw== - dependencies: - heimdalljs-logger "^0.1.7" - object-assign "^4.1.0" - path-posix "^1.0.0" - symlink-or-copy "^1.1.8" - fs-tree-diff@^2.0.0, fs-tree-diff@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-2.0.1.tgz#343e4745ab435ec39ebac5f9059ad919cd034afa" @@ -9002,13 +8978,6 @@ hosted-git-info@^3.0.4: dependencies: lru-cache "^5.1.1" -html-encoding-sniffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== - dependencies: - whatwg-encoding "^1.0.1" - html-encoding-sniffer@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" @@ -9777,37 +9746,6 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jsdom@^12.0.0: - version "12.2.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-12.2.0.tgz#7cf3f5b5eafd47f8f09ca52315d367ff6e95de23" - integrity sha512-QPOggIJ8fquWPLaYYMoh+zqUmdphDtu1ju0QGTitZT1Yd8I5qenPpXM1etzUegu3MjVp8XPzgZxdn8Yj7e40ig== - dependencies: - abab "^2.0.0" - acorn "^6.0.2" - acorn-globals "^4.3.0" - array-equal "^1.0.0" - cssom "^0.3.4" - cssstyle "^1.1.1" - data-urls "^1.0.1" - domexception "^1.0.1" - escodegen "^1.11.0" - html-encoding-sniffer "^1.0.2" - nwsapi "^2.0.9" - parse5 "5.1.0" - pn "^1.1.0" - request "^2.88.0" - request-promise-native "^1.0.5" - saxes "^3.1.3" - symbol-tree "^3.2.2" - tough-cookie "^2.4.3" - w3c-hr-time "^1.0.1" - webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.2.0" - whatwg-url "^7.0.0" - ws "^6.1.0" - xml-name-validator "^3.0.0" - jsdom@^16.2.2, jsdom@^16.4.0: version "16.4.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.4.0.tgz#36005bde2d136f73eee1a830c6d45e55408edddb" @@ -10549,6 +10487,13 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + lunr@^2.3.7: version "2.3.8" resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.8.tgz#a8b89c31f30b5a044b97d2d28e2da191b6ba2072" @@ -11339,7 +11284,7 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" integrity sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ== -nwsapi@^2.0.9, nwsapi@^2.2.0: +nwsapi@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== @@ -11708,11 +11653,6 @@ parse-png@^1.0.0, parse-png@^1.1.1: dependencies: pngjs "^3.2.0" -parse5@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" - integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== - parse5@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" @@ -11945,7 +11885,7 @@ pkg-up@^3.1.0: dependencies: find-up "^3.0.0" -pn@^1.0.0, pn@^1.1.0: +pn@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== @@ -12658,7 +12598,7 @@ request-promise-core@1.1.3: dependencies: lodash "^4.17.15" -request-promise-native@^1.0.5, request-promise-native@^1.0.8: +request-promise-native@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== @@ -12667,7 +12607,7 @@ request-promise-native@^1.0.5, request-promise-native@^1.0.8: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.55.0, request@^2.65.0, request@^2.81.0, request@^2.88.0, request@^2.88.2: +request@^2.55.0, request@^2.65.0, request@^2.81.0, request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -13021,13 +12961,6 @@ sax@>=0.6.0, sax@^1.1.4, sax@~1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -saxes@^3.1.3: - version "3.1.11" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" - integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== - dependencies: - xmlchars "^2.1.1" - saxes@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.0.tgz#b7d30284d7583a5ca6ad0248b56d8889da53788b" @@ -13072,10 +13005,12 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.1.3, semver@^7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== +semver@^7.1.3, semver@^7.3.2, semver@^7.3.4: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" send@0.17.1: version "0.17.1" @@ -13824,7 +13759,7 @@ svgo@1.3.0: unquote "~1.1.1" util.promisify "~1.0.0" -"symbol-tree@>= 3.1.0 < 4.0.0", symbol-tree@^3.2.2, symbol-tree@^3.2.4: +"symbol-tree@>= 3.1.0 < 4.0.0", symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== @@ -14205,7 +14140,7 @@ tough-cookie@>=0.12.0: punycode "^2.1.1" universalify "^0.1.2" -tough-cookie@^2.2.0, tough-cookie@^2.3.3, tough-cookie@^2.4.3, tough-cookie@~2.5.0: +tough-cookie@^2.2.0, tough-cookie@^2.3.3, tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== @@ -14222,13 +14157,6 @@ tough-cookie@^3.0.1: psl "^1.1.28" punycode "^2.1.1" -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= - dependencies: - punycode "^2.1.0" - tr46@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" @@ -14633,7 +14561,7 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== -w3c-hr-time@^1.0.1, w3c-hr-time@^1.0.2: +w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== @@ -14738,11 +14666,6 @@ webidl-conversions@^2.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-2.0.1.tgz#3bf8258f7d318c7443c36f2e169402a1a6703506" integrity sha1-O/glj30xjHRDw28uFpQCoaZwNQY= -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== - webidl-conversions@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" @@ -14804,7 +14727,7 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: +whatwg-encoding@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== @@ -14816,7 +14739,7 @@ whatwg-fetch@^3.4.0: resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.5.0.tgz#605a2cd0a7146e5db141e29d1c62ab84c0c4c868" integrity sha512-jXkLtsR42xhXg7akoDKvKWE40eJeI+2KZqcp2h3NsOrRnDvtWX36KcKl30dy+hxECivdk2BVUHVNrPtoMBUx6A== -whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: +whatwg-mimetype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== @@ -14828,15 +14751,6 @@ whatwg-url-compat@~0.6.5: dependencies: tr46 "~0.0.1" -whatwg-url@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" - integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - whatwg-url@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.0.0.tgz#37f256cb746398e19b107bd6ef820b4ae2d15871" @@ -14954,13 +14868,6 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" - integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== - dependencies: - async-limiter "~1.0.0" - ws@^7.1.2, ws@^7.2.3: version "7.2.3" resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46" @@ -15016,7 +14923,7 @@ xmlbuilder@~11.0.0: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== -xmlchars@^2.1.1, xmlchars@^2.2.0: +xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== @@ -15056,6 +14963,11 @@ yallist@^3.0.0, yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yam@^0.0.24: version "0.0.24" resolved "https://registry.yarnpkg.com/yam/-/yam-0.0.24.tgz#11e9630444735f66a561d29221407de6d037cd95" From 3c11e49f36eb4091bb5b3569ace22904a16bbbbb Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 7 Dec 2020 06:48:38 +0000 Subject: [PATCH 742/879] build(deps-dev): bump ember-composable-helpers from 4.4.0 to 4.4.1 Bumps [ember-composable-helpers](https://github.com/DockYard/ember-composable-helpers) from 4.4.0 to 4.4.1. - [Release notes](https://github.com/DockYard/ember-composable-helpers/releases) - [Changelog](https://github.com/DockYard/ember-composable-helpers/blob/master/CHANGELOG.md) - [Commits](https://github.com/DockYard/ember-composable-helpers/compare/v4.4.0...v4.4.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index ca7259d19..e0719b125 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6818,9 +6818,9 @@ ember-compatibility-helpers@^1.0.2, ember-compatibility-helpers@^1.1.1, ember-co semver "^5.4.1" ember-composable-helpers@^4.1.2, ember-composable-helpers@^4.2.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.4.0.tgz#41d87253d16c56dec551ffea9b9fd09db7f351d6" - integrity sha512-RyTyzVJR3E2n3TmvE5K558OmzJOLvXiybbm6sKy1JR3rReRj/l4mbrwPrtUdIgsltbVXy6ZAcEJ9BRGrYN+Mbg== + version "4.4.1" + resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.4.1.tgz#968f0ef72731cc300b377c552f36f20881911472" + integrity sha512-MVx4KGFL6JzsYfCf9OqLCCnr7DN5tG2jFW9EvosvfgCL7gRdNxLqewR4PWPYA882wetmJ9zvcIEUJhFzZ4deaw== dependencies: "@babel/core" "^7.0.0" broccoli-funnel "2.0.1" From 90b6c322a4347897e65b4cfb318de4cb9c002303 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 8 Dec 2020 07:32:15 +0000 Subject: [PATCH 743/879] build(deps-dev): bump js-yaml from 3.14.0 to 3.14.1 Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 3.14.0 to 3.14.1. - [Release notes](https://github.com/nodeca/js-yaml/releases) - [Changelog](https://github.com/nodeca/js-yaml/blob/3.14.1/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/3.14.0...3.14.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index e0719b125..9981b93cd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9734,9 +9734,9 @@ js-tokens@^3.0.2: integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= js-yaml@^3.12.0, js-yaml@^3.12.1, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.2.5, js-yaml@^3.2.7: - version "3.14.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" - integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" From a209914f0dd71a47a7f8e9a4b5e5f8712388a44d Mon Sep 17 00:00:00 2001 From: Brian Gantzler Date: Thu, 10 Dec 2020 16:27:00 -0500 Subject: [PATCH 744/879] Update working with ember-qunit v5 --- addon-test-support/index.js | 7 +++++++ index.js | 2 -- package.json | 2 +- tests/acceptance/home-test.js | 7 ++----- tests/index.html | 7 +++++++ vendor/add-qunit-option.js | 8 -------- yarn.lock | 28 ++++++++++++++-------------- 7 files changed, 31 insertions(+), 30 deletions(-) delete mode 100644 vendor/add-qunit-option.js diff --git a/addon-test-support/index.js b/addon-test-support/index.js index c4b76b828..9642b44dc 100644 --- a/addon-test-support/index.js +++ b/addon-test-support/index.js @@ -1,2 +1,9 @@ import setupMirage from './setup-mirage'; export { setupMirage }; + +import { dependencySatisfies } from '@embroider/macros'; + +if (dependencySatisfies('ember-qunit', '*')) { + window.QUnit.config.urlConfig.push({ id: 'mirageLogging', label: 'Mirage logging', }); +} + diff --git a/index.js b/index.js index 582c53c60..83e6214b8 100644 --- a/index.js +++ b/index.js @@ -43,8 +43,6 @@ module.exports = { } else { this.mirageDirectory = path.join(this.app.project.root, '/mirage'); } - - this.import('vendor/add-qunit-option.js', { type: 'test' }); }, blueprintsPath() { diff --git a/package.json b/package.json index 92a6b006b..aa99ccd45 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "prepare": "./scripts/link.sh" }, "dependencies": { + "@embroider/macros": "^0.33.0", "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^3.0.3", "broccoli-merge-trees": "^4.2.0", @@ -67,7 +68,6 @@ "ember-cli-moment-shim": "^3.8.0", "ember-cli-sri": "^2.1.1", "ember-cli-uglify": "^3.0.0", - "ember-compatibility-helpers": "^1.2.1", "ember-composable-helpers": "^4.1.2", "ember-data": "~3.14.0", "ember-disable-prototype-extensions": "^1.1.3", diff --git a/tests/acceptance/home-test.js b/tests/acceptance/home-test.js index e88eb27d7..b127c1ab1 100644 --- a/tests/acceptance/home-test.js +++ b/tests/acceptance/home-test.js @@ -1,16 +1,13 @@ import { module, test } from "qunit"; import { visit, currentURL } from "@ember/test-helpers"; import { setupApplicationTest } from "ember-qunit"; -import { - // General functions for checking against Ember version - gte -} from 'ember-compatibility-helpers'; +import { dependencySatisfies } from '@embroider/macros'; module("Acceptance | home", function(hooks) { setupApplicationTest(hooks); // Ember Addon docs will fail for sources less then 3.16.0 - if (gte('3.16.0')) { + if (dependencySatisfies('ember-source', '^3.16.0')) { test("the homepage renders without error", async function(assert) { await visit("/"); diff --git a/tests/index.html b/tests/index.html index 5209b8523..3eb848dbd 100644 --- a/tests/index.html +++ b/tests/index.html @@ -21,6 +21,13 @@ {{content-for "body"}} {{content-for "test-body"}} +
    +
    +
    +
    +
    +
    + diff --git a/vendor/add-qunit-option.js b/vendor/add-qunit-option.js deleted file mode 100644 index db868ec70..000000000 --- a/vendor/add-qunit-option.js +++ /dev/null @@ -1,8 +0,0 @@ -(function() { - if (typeof QUnit !== 'undefined') { - QUnit.config.urlConfig.push({ - id: 'mirageLogging', - label: 'Mirage logging', - }); - } -})(); diff --git a/yarn.lock b/yarn.lock index e0719b125..0a0204adb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1423,7 +1423,7 @@ walk-sync "^1.1.3" wrap-legacy-hbs-plugin-if-needed "^1.0.1" -"@embroider/macros@0.33.0": +"@embroider/macros@0.33.0", "@embroider/macros@^0.33.0": version "0.33.0" resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.33.0.tgz#d5826ea7565bb69b57ba81ed528315fe77acbf9d" integrity sha512-nl/1zRn+Wd3MO8Bb+YPqHmFl/2vwQLTsEB6Zt+K9bWXsM/kA+dPCeeCReLN6PbkMP16xxqtNSIrQ8Y49hnWjpg== @@ -5196,10 +5196,10 @@ commander@2.8.x: dependencies: graceful-readlink ">= 1.0.0" -commander@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.0.0.tgz#2b270da94f8fb9014455312f829a1129dbf8887e" - integrity sha512-s7EA+hDtTYNhuXkTlhqew4txMZVdszBmKWSPEMxGr8ru8JXR7bLUFIAtPhcSuFdJQ0ILMxnJi8GkQL0yvDy/YA== +commander@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75" + integrity sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q== commander@^2.19.0, commander@^2.20.0, commander@^2.6.0, commander@~2.20.3: version "2.20.3" @@ -11170,10 +11170,10 @@ node-uuid@~1.4.0: resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" integrity sha1-sEDrCSOWivq/jTL7HxfxFn/auQc= -node-watch@0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/node-watch/-/node-watch-0.6.4.tgz#50e564046eb7be15151c25f9c5aac4b5f495c291" - integrity sha512-cI6CHzivIFESe8djiK3Wh90CtWQBxLwMem8x8S+2GSvCvFgoMuOKVlfJtQ/2v3Afg3wOnHl/+tXotEs8z5vOrg== +node-watch@0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/node-watch/-/node-watch-0.7.0.tgz#033c0c04239d9348f3402b6b6f9c1e689a7edbe1" + integrity sha512-OOBiglke5SlRQT5WYfwXTmYqTfXjcTNBHpalyHLtLxDpQYVpVRkJqabcch1kmwJsjV/J4OZuzEafeb4soqtFZA== nopt@^3.0.6: version "3.0.6" @@ -12233,13 +12233,13 @@ qunit-dom@^1.1.0: ember-cli-version-checker "^5.1.1" qunit@^2.9.3: - version "2.11.2" - resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.11.2.tgz#ff68b57672053824a670620e7bd341e47561c542" - integrity sha512-lvvKQYK2YFU+L7lTXnTD8+qE49cNs2sK2gr1j8KV4Bj+s1eDrdmwaZf5a8pEcW+rB1cEtCH0ZeQ0Z9K76OQjGA== + version "2.13.0" + resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.13.0.tgz#4cbaac0b314d787ba20195e238b0edf1cd9b2fb1" + integrity sha512-RvJquyNKbMSn5Qo28S2wKWxHl1Ku8m0zFLTKsXfq/WZkyM+b28gpEs6YkKN1fOCV4S+979+GnevD0FRgQayo3Q== dependencies: - commander "6.0.0" + commander "6.2.0" js-reporters "1.2.3" - node-watch "0.6.4" + node-watch "0.7.0" tiny-glob "0.2.6" randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: From d622bd1c30bbc26d43fde89d4afc76252747ff31 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 10 Dec 2020 17:46:01 +0000 Subject: [PATCH 745/879] build(deps): [security] bump ini from 1.3.5 to 1.3.7 Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.7. **This update includes a security fix.** - [Release notes](https://github.com/isaacs/ini/releases) - [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.7) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9981b93cd..f261fb5b2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9196,9 +9196,9 @@ inherits@2.0.3: integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= ini@^1.3.5, ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + version "1.3.7" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" + integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== inline-source-map-comment@^1.0.5: version "1.0.5" From c228fea6c55cfe12cae8960a27a961db287f7f75 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 14 Dec 2020 07:52:14 +0000 Subject: [PATCH 746/879] build(deps): bump ember-auto-import from 1.8.0 to 1.9.0 Bumps [ember-auto-import](https://github.com/ef4/ember-auto-import) from 1.8.0 to 1.9.0. - [Release notes](https://github.com/ef4/ember-auto-import/releases) - [Changelog](https://github.com/ef4/ember-auto-import/blob/master/CHANGELOG.md) - [Commits](https://github.com/ef4/ember-auto-import/compare/v1.8.0...v1.9.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index f261fb5b2..61c2efe0d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6060,9 +6060,9 @@ ember-assign-polyfill@^2.5.0, ember-assign-polyfill@^2.6.0: ember-cli-version-checker "^2.0.0" ember-auto-import@^1.2.19, ember-auto-import@^1.5.3, ember-auto-import@^1.6.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.8.0.tgz#de7624b36ceb53a5a5878ebfe86ae70f0fea7921" - integrity sha512-pX8rqT6oWiotz4n4rHDlYrVnQl0KVGanv/a+E2xUnkjsyL2K5JfrwJdyRaDsMQPNHkrz12HFnR/WKhjRoVDoIA== + version "1.9.0" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.9.0.tgz#0521f2ce3db11674146587f583837599cd42f1d0" + integrity sha512-wvOlAJCR1296C63ttIFl6/hw9NT28uutyO80xOdJCx7Tx3FldKrle5stftp849BPQPb2obU5hFo3ju4qV7KYfA== dependencies: "@babel/core" "^7.1.6" "@babel/preset-env" "^7.10.2" @@ -6086,8 +6086,7 @@ ember-auto-import@^1.2.19, ember-auto-import@^1.5.3, ember-auto-import@^1.6.0: js-string-escape "^1.0.1" lodash "^4.17.19" mkdirp "^0.5.1" - pkg-up "^2.0.0" - resolve "^1.7.1" + resolve-package-path "^3.1.0" rimraf "^2.6.2" semver "^7.3.4" symlink-or-copy "^1.2.0" @@ -12711,12 +12710,20 @@ resolve-package-path@^2.0.0: path-root "^0.1.1" resolve "^1.13.1" +resolve-package-path@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-3.1.0.tgz#35faaa5d54a9c7dd481eb7c4b2a44410c9c763d8" + integrity sha512-2oC2EjWbMJwvSN6Z7DbDfJMnD8MYEouaLn5eIX0j8XwPsYCVIyY9bbnX88YHVkbr8XHqvZrYbxaLPibfTYKZMA== + dependencies: + path-root "^0.1.1" + resolve "^1.17.0" + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.15.0, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: +resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.15.0, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.8.1: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== From 3373144254ea781d69e7d963ca65d09ecadf7cbc Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 17 Dec 2020 06:44:28 +0000 Subject: [PATCH 747/879] build(deps): bump ember-auto-import from 1.9.0 to 1.10.0 Bumps [ember-auto-import](https://github.com/ef4/ember-auto-import) from 1.9.0 to 1.10.0. - [Release notes](https://github.com/ef4/ember-auto-import/releases) - [Changelog](https://github.com/ef4/ember-auto-import/blob/master/CHANGELOG.md) - [Commits](https://github.com/ef4/ember-auto-import/compare/v1.9.0...v1.10.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index 61c2efe0d..b3a5138fe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6060,9 +6060,9 @@ ember-assign-polyfill@^2.5.0, ember-assign-polyfill@^2.6.0: ember-cli-version-checker "^2.0.0" ember-auto-import@^1.2.19, ember-auto-import@^1.5.3, ember-auto-import@^1.6.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.9.0.tgz#0521f2ce3db11674146587f583837599cd42f1d0" - integrity sha512-wvOlAJCR1296C63ttIFl6/hw9NT28uutyO80xOdJCx7Tx3FldKrle5stftp849BPQPb2obU5hFo3ju4qV7KYfA== + version "1.10.0" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.10.0.tgz#eb6fba6b66974cb86adc42bd835e3cacbf32ebd7" + integrity sha512-E2dI/8x2rJ3GIgTXy+HMKjLiLrV/yDlHPp9Wgzz4W1UWAV2l0KsdbIxAu+rWGUqFIAEhpzFUe8fj0E+Tin+Z3w== dependencies: "@babel/core" "^7.1.6" "@babel/preset-env" "^7.10.2" @@ -6072,7 +6072,6 @@ ember-auto-import@^1.2.19, ember-auto-import@^1.5.3, ember-auto-import@^1.6.0: babel-core "^6.26.3" babel-loader "^8.0.6" babel-plugin-syntax-dynamic-import "^6.18.0" - babel-template "^6.26.0" babylon "^6.18.0" broccoli-debug "^0.6.4" broccoli-node-api "^1.7.0" From 44ccd731653e98c6ee512c0540772fd186133da7 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 21 Dec 2020 07:02:03 +0000 Subject: [PATCH 748/879] build(deps): bump lodash-es from 4.17.15 to 4.17.20 Bumps [lodash-es](https://github.com/lodash/lodash) from 4.17.15 to 4.17.20. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.20) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index b3a5138fe..73107ea52 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10109,9 +10109,9 @@ locate-path@^3.0.0: path-exists "^3.0.0" lodash-es@^4.17.11: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78" - integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ== + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.20.tgz#29f6332eefc60e849f869c264bc71126ad61e8f7" + integrity sha512-JD1COMZsq8maT6mnuz1UMV0jvYD0E0aUsSOdrr1/nAG3dhqQXwRRgeW0cSqH1U43INKcqxaiVIQNOUDld7gRDA== lodash._baseassign@^3.0.0: version "3.2.0" From 203a241c4a561c5b7ba5f0dd8cb084cda6a72602 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Tue, 22 Dec 2020 06:34:51 +0100 Subject: [PATCH 749/879] package.json: Add `changelog` config see https://github.com/lerna/lerna-changelog#configuration --- package.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/package.json b/package.json index aa99ccd45..9ba90d580 100644 --- a/package.json +++ b/package.json @@ -106,5 +106,14 @@ "after": [ "ember-qunit" ] + }, + "changelog": { + "labels": { + "Breaking": "💥 Breaking Change", + "Feature / Enhancement": "🚀 Enhancement", + "Bug": "🛠Bug Fix", + "documentation": "📠Documentation", + "internal": "🠠Internal" + } } } From eb259a56795df58132cbaf9050de9313e6ffab12 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Tue, 22 Dec 2020 06:35:36 +0100 Subject: [PATCH 750/879] v2.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9ba90d580..154c77a97 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "1.1.8", + "version": "2.0.0", "description": "A client-side server to help you build, test and demo your Ember app", "keywords": [ "ember-addon", From 92ad7d11ab58ccabd0efd55ffabaeb723ade561b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 22 Dec 2020 06:54:04 +0000 Subject: [PATCH 751/879] build(deps): bump ember-auto-import from 1.10.0 to 1.10.1 Bumps [ember-auto-import](https://github.com/ef4/ember-auto-import) from 1.10.0 to 1.10.1. - [Release notes](https://github.com/ef4/ember-auto-import/releases) - [Changelog](https://github.com/ef4/ember-auto-import/blob/master/CHANGELOG.md) - [Commits](https://github.com/ef4/ember-auto-import/compare/v1.10.0...v1.10.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4a9647ee5..179c667ee 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6060,9 +6060,9 @@ ember-assign-polyfill@^2.5.0, ember-assign-polyfill@^2.6.0: ember-cli-version-checker "^2.0.0" ember-auto-import@^1.2.19, ember-auto-import@^1.5.3, ember-auto-import@^1.6.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.10.0.tgz#eb6fba6b66974cb86adc42bd835e3cacbf32ebd7" - integrity sha512-E2dI/8x2rJ3GIgTXy+HMKjLiLrV/yDlHPp9Wgzz4W1UWAV2l0KsdbIxAu+rWGUqFIAEhpzFUe8fj0E+Tin+Z3w== + version "1.10.1" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.10.1.tgz#6c93a875e494aa0a58b759867d3f20adfd514ae3" + integrity sha512-7bOWzPELlVwdWDOkB+phDIjg8BNW+/2RiLLQ+Xa/eIvCLT4ABYhHV5wqW5gs5BnXTDVLfE4ddKZdllnGuPGGDQ== dependencies: "@babel/core" "^7.1.6" "@babel/preset-env" "^7.10.2" From b9dfc070cf98dee6b496dcf8e7092757d4161972 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sat, 26 Dec 2020 23:05:47 +0100 Subject: [PATCH 752/879] Widen `ember-get-config` dependency requirement (#2101) This addon works fine with 0.2.x and requiring 0.3.0 can cause dependency version conflicts, so let's widen the requirement so that users can choose a version that does not cause them any conflicts. --- package.json | 2 +- yarn.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 154c77a97..657c4e991 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "broccoli-merge-trees": "^4.2.0", "ember-auto-import": "^1.2.19", "ember-cli-babel": "^7.5.0", - "ember-get-config": "^0.3.0", + "ember-get-config": "^0.2.4 || ^0.3.0", "ember-inflector": "^2.0.0 || ^3.0.0", "lodash-es": "^4.17.11", "miragejs": "^0.1.31" diff --git a/yarn.lock b/yarn.lock index 179c667ee..760fbe36a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6912,7 +6912,7 @@ ember-fetch@^8.0.2: node-fetch "^2.6.0" whatwg-fetch "^3.4.0" -ember-get-config@, ember-get-config@^0.3.0: +ember-get-config@, "ember-get-config@^0.2.4 || ^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.3.0.tgz#a73a1a87b48d9dde4c66a0e52ed5260b8a48cfbd" integrity sha512-0e2pKzwW5lBZ4oJnvu9qHOht4sP1MWz/m3hyz8kpSoMdrlZVf62LDKZ6qfKgy8drcv5YhCMYE6QV7MhnqlrzEQ== From 67449c4a0f82149eb2711848f905c72171a6c9d5 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sun, 27 Dec 2020 09:23:41 +0100 Subject: [PATCH 753/879] v2.0.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 657c4e991..2a33d35bf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "2.0.0", + "version": "2.0.1", "description": "A client-side server to help you build, test and demo your Ember app", "keywords": [ "ember-addon", From 4950825f29e530315f0072e47e41822661799102 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 20 Jan 2021 07:59:06 +0000 Subject: [PATCH 754/879] build(deps): bump ember-cli-babel from 7.23.0 to 7.23.1 Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 7.23.0 to 7.23.1. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v7.23.0...v7.23.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/yarn.lock b/yarn.lock index 760fbe36a..3d05c14f6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1069,14 +1069,7 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/runtime@^7.12.0", "@babel/runtime@^7.2.0", "@babel/runtime@^7.8.4": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.1.tgz#b4116a6b6711d010b2dad3b7b6e43bf1b9954740" - integrity sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.12.5": +"@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.2.0", "@babel/runtime@^7.8.4": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== @@ -3021,10 +3014,10 @@ babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-p dependencies: ember-rfc176-data "^0.3.13" -babel-plugin-ember-modules-api-polyfill@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-3.2.0.tgz#302cb58a3c0fa33d93ab5115f1e91d76c6ec766b" - integrity sha512-k5gyC1kUDyZDcdD8LMGTI7KA+cHdKainuWpmc7d5yv42WgZFO75njPi3hZchEGsFFXtSqm9jiahgvLBUV8E8mA== +babel-plugin-ember-modules-api-polyfill@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-3.2.1.tgz#715252ffde309da36fb32cd6a9bad5c6b61edd33" + integrity sha512-7k4gM0VLAMjoWVxLBDqavH/Dn4mBfzqTuQmtGmZgsdQ4SYVEJ7dewUVeqWBVn5v3QspW4VSoeXh4rHPPlp/rPw== dependencies: ember-rfc176-data "^0.3.16" @@ -6240,9 +6233,9 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, semver "^5.5.0" ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.2, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.4.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: - version "7.23.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.23.0.tgz#ec580aa2c115d0810e454dd5c2fffce238284b92" - integrity sha512-ix58DlRDAbGITtdJoRUPcAoQwKLYr/x/kIXjU9u1ATyhmuUjqb+0FDXghOWbkNihGiNOqBBR49+LBgK9AeBcNw== + version "7.23.1" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.23.1.tgz#d1517228ede08a5d4b045c78a7429728e956b30b" + integrity sha512-qYggmt3hRs6QJ6cRkww3ahMpyP8IEV2KFrIRO/Z6hu9MkE/8Y28Xd5NjQl6fPV3oLoG0vwuHzhNe3Jr7Wec8zw== dependencies: "@babel/core" "^7.12.0" "@babel/helper-compilation-targets" "^7.12.0" @@ -6257,7 +6250,7 @@ ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cl amd-name-resolver "^1.2.1" babel-plugin-debug-macros "^0.3.3" babel-plugin-ember-data-packages-polyfill "^0.1.2" - babel-plugin-ember-modules-api-polyfill "^3.2.0" + babel-plugin-ember-modules-api-polyfill "^3.2.1" babel-plugin-module-resolver "^3.1.1" broccoli-babel-transpiler "^7.8.0" broccoli-debug "^0.6.4" From 04a6c2a02421d5dd2ab431efc4eaeded91356eb1 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 20 Jan 2021 21:35:23 +0000 Subject: [PATCH 755/879] build(deps): [security] bump socket.io from 2.3.0 to 2.4.1 Bumps [socket.io](https://github.com/socketio/socket.io) from 2.3.0 to 2.4.1. **This update includes a security fix.** - [Release notes](https://github.com/socketio/socket.io/releases) - [Changelog](https://github.com/socketio/socket.io/blob/2.4.1/CHANGELOG.md) - [Commits](https://github.com/socketio/socket.io/compare/2.3.0...2.4.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 177 ++++++++++++++++++++++++------------------------------ 1 file changed, 79 insertions(+), 98 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3d05c14f6..32f8fbd34 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2681,11 +2681,6 @@ async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - async-promise-queue@^1.0.3, async-promise-queue@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/async-promise-queue/-/async-promise-queue-1.0.5.tgz#cb23bce9fce903a133946a700cc85f27f09ea49d" @@ -3440,10 +3435,10 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= -base64-arraybuffer@0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" - integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= +base64-arraybuffer@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" + integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI= base64-js@0.0.2: version "0.0.2" @@ -3487,13 +3482,6 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -better-assert@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" - integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= - dependencies: - callsite "1.0.0" - big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" @@ -4683,11 +4671,6 @@ calculate-cache-key-for-tree@^2.0.0: dependencies: json-stable-stringify "^1.0.1" -callsite@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" - integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= - callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -5224,7 +5207,7 @@ component-emitter@1.2.1: resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= -component-emitter@^1.2.1: +component-emitter@^1.2.1, component-emitter@~1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== @@ -5344,16 +5327,16 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= -cookie@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" - integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= - cookie@0.4.0, cookie@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== +cookie@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" @@ -7260,45 +7243,45 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -engine.io-client@~3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.4.0.tgz#82a642b42862a9b3f7a188f41776b2deab643700" - integrity sha512-a4J5QO2k99CM2a0b12IznnyQndoEvtA4UAldhGzKqnHf42I3Qs2W5SPnDvatZRcMaNZs4IevVicBPayxYt6FwA== +engine.io-client@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.5.0.tgz#fc1b4d9616288ce4f2daf06dcf612413dec941c7" + integrity sha512-12wPRfMrugVw/DNyJk34GQ5vIVArEcVMXWugQGGuw2XxUSztFNmJggZmv8IZlLyEdnpO1QB9LkcjeWewO2vxtA== dependencies: - component-emitter "1.2.1" + component-emitter "~1.3.0" component-inherit "0.0.3" - debug "~4.1.0" + debug "~3.1.0" engine.io-parser "~2.2.0" has-cors "1.1.0" indexof "0.0.1" - parseqs "0.0.5" - parseuri "0.0.5" - ws "~6.1.0" + parseqs "0.0.6" + parseuri "0.0.6" + ws "~7.4.2" xmlhttprequest-ssl "~1.5.4" yeast "0.1.2" engine.io-parser@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.0.tgz#312c4894f57d52a02b420868da7b5c1c84af80ed" - integrity sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w== + version "2.2.1" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.1.tgz#57ce5611d9370ee94f99641b589f94c97e4f5da7" + integrity sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg== dependencies: after "0.8.2" arraybuffer.slice "~0.0.7" - base64-arraybuffer "0.1.5" + base64-arraybuffer "0.1.4" blob "0.0.5" has-binary2 "~1.0.2" -engine.io@~3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.4.0.tgz#3a962cc4535928c252759a00f98519cb46c53ff3" - integrity sha512-XCyYVWzcHnK5cMz7G4VTu2W7zJS7SM1QkcelghyIk/FmobWBtXE7fwhBusEKvCSqc3bMh8fNFMlUkCKTFRxH2w== +engine.io@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.5.0.tgz#9d6b985c8a39b1fe87cd91eb014de0552259821b" + integrity sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA== dependencies: accepts "~1.3.4" base64id "2.0.0" - cookie "0.3.1" + cookie "~0.4.1" debug "~4.1.0" engine.io-parser "~2.2.0" - ws "^7.1.2" + ws "~7.4.2" enhanced-resolve@^4.0.0, enhanced-resolve@^4.3.0: version "4.3.0" @@ -10769,7 +10752,12 @@ mime-db@1.43.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== -mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.19, mime-types@~2.1.24: +mime-db@1.45.0: + version "1.45.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" + integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== + +mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.19: version "2.1.26" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== @@ -10781,6 +10769,13 @@ mime-types@~1.0.1: resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-1.0.2.tgz#995ae1392ab8affcbfcb2641dd054e943c0d5dce" integrity sha1-mVrhOSq4r/y/yyZB3QVOlDwNXc4= +mime-types@~2.1.24: + version "2.1.28" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd" + integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== + dependencies: + mime-db "1.45.0" + mime@1.6.0, mime@^1.3.4: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" @@ -10994,9 +10989,9 @@ ms@2.1.1: integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== ms@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== mustache@^3.0.0: version "3.2.1" @@ -11300,11 +11295,6 @@ object-assign@^2.0.0: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" integrity sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo= -object-component@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" - integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= - object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" @@ -11661,19 +11651,15 @@ parse5@^3.0.1: dependencies: "@types/node" "*" -parseqs@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" - integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= - dependencies: - better-assert "~1.0.0" +parseqs@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" + integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w== -parseuri@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" - integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= - dependencies: - better-assert "~1.0.0" +parseuri@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a" + integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow== parseurl@~1.3.3: version "1.3.3" @@ -13216,54 +13202,51 @@ socket.io-adapter@~1.1.0: resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz#ab3f0d6f66b8fc7fca3959ab5991f82221789be9" integrity sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g== -socket.io-client@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.3.0.tgz#14d5ba2e00b9bcd145ae443ab96b3f86cbcc1bb4" - integrity sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA== +socket.io-client@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.4.0.tgz#aafb5d594a3c55a34355562fc8aea22ed9119a35" + integrity sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ== dependencies: backo2 "1.0.2" - base64-arraybuffer "0.1.5" component-bind "1.0.0" - component-emitter "1.2.1" - debug "~4.1.0" - engine.io-client "~3.4.0" + component-emitter "~1.3.0" + debug "~3.1.0" + engine.io-client "~3.5.0" has-binary2 "~1.0.2" - has-cors "1.1.0" indexof "0.0.1" - object-component "0.0.3" - parseqs "0.0.5" - parseuri "0.0.5" + parseqs "0.0.6" + parseuri "0.0.6" socket.io-parser "~3.3.0" to-array "0.1.4" socket.io-parser@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.0.tgz#2b52a96a509fdf31440ba40fed6094c7d4f1262f" - integrity sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng== + version "3.3.2" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.2.tgz#ef872009d0adcf704f2fbe830191a14752ad50b6" + integrity sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg== dependencies: - component-emitter "1.2.1" + component-emitter "~1.3.0" debug "~3.1.0" isarray "2.0.1" socket.io-parser@~3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.4.0.tgz#370bb4a151df2f77ce3345ff55a7072cc6e9565a" - integrity sha512-/G/VOI+3DBp0+DJKW4KesGnQkQPFmUCbA/oO2QGT6CWxU7hLGWqU3tyuzeSK/dqcyeHsQg1vTe9jiZI8GU9SCQ== + version "3.4.1" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.4.1.tgz#b06af838302975837eab2dc980037da24054d64a" + integrity sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A== dependencies: component-emitter "1.2.1" debug "~4.1.0" isarray "2.0.1" socket.io@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.3.0.tgz#cd762ed6a4faeca59bc1f3e243c0969311eb73fb" - integrity sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg== + version "2.4.1" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.4.1.tgz#95ad861c9a52369d7f1a68acf0d4a1b16da451d2" + integrity sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w== dependencies: debug "~4.1.0" - engine.io "~3.4.0" + engine.io "~3.5.0" has-binary2 "~1.0.2" socket.io-adapter "~1.1.0" - socket.io-client "2.3.0" + socket.io-client "2.4.0" socket.io-parser "~3.4.0" sort-keys@^2.0.0: @@ -14867,17 +14850,15 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@^7.1.2, ws@^7.2.3: +ws@^7.2.3: version "7.2.3" resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46" integrity sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ== -ws@~6.1.0: - version "6.1.4" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.4.tgz#5b5c8800afab925e94ccb29d153c8d02c1776ef9" - integrity sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA== - dependencies: - async-limiter "~1.0.0" +ws@~7.4.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.2.tgz#782100048e54eb36fe9843363ab1c68672b261dd" + integrity sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA== xdg-basedir@^3.0.0: version "3.0.0" From f8bc04b0980118816774e943036c997d6958e7d2 Mon Sep 17 00:00:00 2001 From: Paul Kuruvilla Date: Fri, 22 Jan 2021 20:17:50 +0530 Subject: [PATCH 756/879] fix broken API doc links (#2110) --- tests/dummy/app/pods/docs/data-layer/database/template.md | 2 +- tests/dummy/app/pods/docs/data-layer/models/template.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/dummy/app/pods/docs/data-layer/database/template.md b/tests/dummy/app/pods/docs/data-layer/database/template.md index b736b1486..0dc9f7bc2 100644 --- a/tests/dummy/app/pods/docs/data-layer/database/template.md +++ b/tests/dummy/app/pods/docs/data-layer/database/template.md @@ -57,6 +57,6 @@ test('I can create a movie', async function(assert) { }); ``` -You can view the rest of the Database APIs in the {{docs-link 'Db' 'docs.api.item' 'modules/lib/db~Db'}} and {{docs-link 'DbCollection' 'docs.api.item' 'modules/lib/db-collection~DbCollection'}} API reference. +You can view the rest of the Database APIs in the {{docs-link 'Db' 'docs.api.item' 'modules/db~Db'}} and {{docs-link 'DbCollection' 'docs.api.item' 'modules/db-collection~DbCollection'}} API reference. Next, we'll learn about Mirage's ORM. diff --git a/tests/dummy/app/pods/docs/data-layer/models/template.md b/tests/dummy/app/pods/docs/data-layer/models/template.md index 6e2d56963..19ccbb829 100644 --- a/tests/dummy/app/pods/docs/data-layer/models/template.md +++ b/tests/dummy/app/pods/docs/data-layer/models/template.md @@ -79,7 +79,7 @@ schema.blogPosts.where({ isPublished: true }); schema.blogPosts.findBy({ title: 'Introduction' }); ``` -Check out the {{docs-link 'Schema API docs' 'docs.api.item' 'modules/lib/orm/schema~Schema'}} to see all available query methods. +Check out the {{docs-link 'Schema API docs' 'docs.api.item' 'modules/orm/schema~Schema'}} to see all available query methods. ## Updating and deleting models @@ -102,7 +102,7 @@ let post = schema.blogPosts.find(2); post.destroy(); ``` -View the {{docs-link 'Model API docs' 'docs.api.item' 'modules/lib/orm/model~Model'}} to see all the available fields and methods for model instances. +View the {{docs-link 'Model API docs' 'docs.api.item' 'modules/orm/model~Model'}} to see all the available fields and methods for model instances. --- From 80fd1d406294e1c064e98c1896c36efb028728c0 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 26 Jan 2021 06:34:40 +0000 Subject: [PATCH 757/879] build(deps-dev): bump faker from 5.1.0 to 5.2.0 Bumps [faker](https://github.com/Marak/Faker.js) from 5.1.0 to 5.2.0. - [Release notes](https://github.com/Marak/Faker.js/releases) - [Changelog](https://github.com/Marak/faker.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/Marak/Faker.js/compare/v5.1.0...v5.2.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 32f8fbd34..1b7046fa6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7850,9 +7850,9 @@ fake-xml-http-request@^2.1.1: integrity sha512-Kn2WYYS6cDBS5jq/voOfSGCA0TafOYAUPbEp8mUVpD/DVV5bQIDjlq+MLLvNUokkbTpjBVlLDaM5PnX+PwZMlw== faker@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/faker/-/faker-5.1.0.tgz#e10fa1dec4502551aee0eb771617a7e7b94692e8" - integrity sha512-RrWKFSSA/aNLP0g3o2WW1Zez7/MnMr7xkiZmoCfAGZmdkDQZ6l2KtuXHN5XjdvpRjDl8+3vf+Rrtl06Z352+Mw== + version "5.2.0" + resolved "https://registry.yarnpkg.com/faker/-/faker-5.2.0.tgz#5ee7ca475737eda8cf59c0cbaae5f5068e668dd9" + integrity sha512-UlrF1NNRIdzEPtBcy5l8JTlnXQZdz+4pQc3v2TAVocW39nnczCNQ0g0CBKgPGISJPzA2DqJVN1kdr+FCRFdN5g== fast-deep-equal@^3.1.1: version "3.1.1" From b89766f167e66d7c178cec8eaa3a419a2950c2ab Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 3 Feb 2021 08:34:38 +0000 Subject: [PATCH 758/879] build(deps-dev): bump faker from 5.2.0 to 5.3.1 Bumps [faker](https://github.com/Marak/Faker.js) from 5.2.0 to 5.3.1. - [Release notes](https://github.com/Marak/Faker.js/releases) - [Changelog](https://github.com/Marak/faker.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/Marak/Faker.js/compare/v5.2.0...v5.3.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1b7046fa6..d21de3215 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7850,9 +7850,9 @@ fake-xml-http-request@^2.1.1: integrity sha512-Kn2WYYS6cDBS5jq/voOfSGCA0TafOYAUPbEp8mUVpD/DVV5bQIDjlq+MLLvNUokkbTpjBVlLDaM5PnX+PwZMlw== faker@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/faker/-/faker-5.2.0.tgz#5ee7ca475737eda8cf59c0cbaae5f5068e668dd9" - integrity sha512-UlrF1NNRIdzEPtBcy5l8JTlnXQZdz+4pQc3v2TAVocW39nnczCNQ0g0CBKgPGISJPzA2DqJVN1kdr+FCRFdN5g== + version "5.3.1" + resolved "https://registry.yarnpkg.com/faker/-/faker-5.3.1.tgz#67f8f5c170b97a76b875389e0e8b9155da7b4853" + integrity sha512-sVdoApX/awJHO9DZHZsHVaJBNFiJW0n3lPs0q/nFxp/Mtya1dr2sCMktST3mdxNMHjkvKTTMAW488E+jH1eSbg== fast-deep-equal@^3.1.1: version "3.1.1" From c99724dd6eabbb1340e3af4cbbb1a64527bf253b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 11 Feb 2021 06:28:05 +0000 Subject: [PATCH 759/879] build(deps-dev): bump faker from 5.3.1 to 5.4.0 Bumps [faker](https://github.com/Marak/Faker.js) from 5.3.1 to 5.4.0. - [Release notes](https://github.com/Marak/Faker.js/releases) - [Changelog](https://github.com/Marak/faker.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/Marak/Faker.js/commits) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index d21de3215..c8c9b7719 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7850,9 +7850,9 @@ fake-xml-http-request@^2.1.1: integrity sha512-Kn2WYYS6cDBS5jq/voOfSGCA0TafOYAUPbEp8mUVpD/DVV5bQIDjlq+MLLvNUokkbTpjBVlLDaM5PnX+PwZMlw== faker@^5.1.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/faker/-/faker-5.3.1.tgz#67f8f5c170b97a76b875389e0e8b9155da7b4853" - integrity sha512-sVdoApX/awJHO9DZHZsHVaJBNFiJW0n3lPs0q/nFxp/Mtya1dr2sCMktST3mdxNMHjkvKTTMAW488E+jH1eSbg== + version "5.4.0" + resolved "https://registry.yarnpkg.com/faker/-/faker-5.4.0.tgz#f18e55993c6887918182b003d163df14daeb3011" + integrity sha512-Y9n/Ky/xZx/Bj8DePvXspUYRtHl/rGQytoIT5LaxmNwSe3wWyOeOXb3lT6Dpipq240PVpeFaGKzScz/5fvff2g== fast-deep-equal@^3.1.1: version "3.1.1" From f9520f18f37636ef8ccd452342a4ad877f1b5311 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 11 Feb 2021 06:29:37 +0000 Subject: [PATCH 760/879] build(deps-dev): bump ember-cli-htmlbars from 5.3.1 to 5.3.2 Bumps [ember-cli-htmlbars](https://github.com/ember-cli/ember-cli-htmlbars) from 5.3.1 to 5.3.2. - [Release notes](https://github.com/ember-cli/ember-cli-htmlbars/releases) - [Changelog](https://github.com/ember-cli/ember-cli-htmlbars/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-cli-htmlbars/compare/v5.3.1...v5.3.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 41 ++++++++++++----------------------------- 1 file changed, 12 insertions(+), 29 deletions(-) diff --git a/yarn.lock b/yarn.lock index c8c9b7719..7f1408e5e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3047,10 +3047,10 @@ babel-plugin-htmlbars-inline-precompile@^3.2.0: resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-3.2.0.tgz#c4882ea875d0f5683f0d91c1f72e29a4f14b5606" integrity sha512-IUeZmgs9tMUGXYu1vfke5I18yYJFldFGdNFQOWslXTnDWXzpwPih7QFduUqvT+awDpDuNtXpdt5JAf43Q1Hhzg== -babel-plugin-htmlbars-inline-precompile@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-4.2.0.tgz#73e7a199c14db139b9c9aea240e03b7112784c81" - integrity sha512-n2jMGcFKvubnYi8Ink7zJnC+aQor97v5FJKYUOUKijj5gIDy/sOIAZ7BxDWb0co1VzZokdN7tvtLnQtiWfD1Gw== +babel-plugin-htmlbars-inline-precompile@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-4.2.1.tgz#9a367f8d7ecb9fb2c2e886edfe285caf7cb9766d" + integrity sha512-MCJXk+1R0YjlF/F52eDbhJTpsnqRVYsPYVP9d0jEu7E46AcRPEWDL5tfSweiQWHLKG017BIedATb91KcIoT3zA== babel-plugin-module-resolver@^3.1.1: version "3.2.0" @@ -4132,7 +4132,7 @@ broccoli-persistent-filter@^2.1.0, broccoli-persistent-filter@^2.1.1, broccoli-p sync-disk-cache "^1.3.3" walk-sync "^1.0.0" -broccoli-persistent-filter@^3.0.0, broccoli-persistent-filter@^3.1.2: +broccoli-persistent-filter@^3.0.0, broccoli-persistent-filter@^3.1.0, broccoli-persistent-filter@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-3.1.2.tgz#41da6b9577be09a170ecde185f2c5a6099f99c4e" integrity sha512-CbU95RXXVyy+eJV9XTiHUC7NnsY3EvdVrGzp3YgyvO2bzXZFE5/GzDp4X/VQqX+jsk4qyT1HvMOF0sD1DX68TQ== @@ -4149,23 +4149,6 @@ broccoli-persistent-filter@^3.0.0, broccoli-persistent-filter@^3.1.2: symlink-or-copy "^1.0.1" sync-disk-cache "^2.0.0" -broccoli-persistent-filter@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-3.1.1.tgz#318c68a82d5759582bb60e7e2c0f3ca008176224" - integrity sha512-gP797MF87JjkcwhGBkE0fhF3aIbGnOF3K3A0iZpQSxtpmSNt+rbNzuqDOmgiKwWpx6v0+APkM5HUA0NiIZpgsQ== - dependencies: - async-disk-cache "^2.0.0" - async-promise-queue "^1.0.3" - broccoli-plugin "^4.0.3" - fs-tree-diff "^2.0.0" - hash-for-dep "^1.5.0" - heimdalljs "^0.2.1" - heimdalljs-logger "^0.1.7" - promise-map-series "^0.2.1" - rimraf "^3.0.0" - symlink-or-copy "^1.0.1" - sync-disk-cache "^2.0.0" - broccoli-plugin@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.1.0.tgz#73e2cfa05f8ea1e3fc1420c40c3d9e7dc724bf02" @@ -6438,22 +6421,22 @@ ember-cli-htmlbars@^4.2.3: walk-sync "^2.0.2" ember-cli-htmlbars@^5.0.0, ember-cli-htmlbars@^5.2.0, ember-cli-htmlbars@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.3.1.tgz#61793964fc2599ce750db9e972ab55c6dd177c48" - integrity sha512-ZjQTt44euDoqLvUkWbt1svgNCXgLzOztEbc2qqYMQvhQig416LMrWK7l3SSbNU+BtLD5UIxmwvLfF1tsO2CVyA== + version "5.3.2" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.3.2.tgz#d0e1a4ccd2e7c6f91be51ea0cc1ef7650a9b67e7" + integrity sha512-S/spDVzBxkdMhnjiT6gG9xqpM9sT0Z7HskWSvSIAAW1sQsKPOCfRYp/1CqJ3+V5aX8ct0j5aHsdRanQYyHya2w== dependencies: "@ember/edition-utils" "^1.2.0" - babel-plugin-htmlbars-inline-precompile "^4.2.0" + babel-plugin-htmlbars-inline-precompile "^4.2.1" broccoli-debug "^0.6.5" - broccoli-persistent-filter "^3.1.0" + broccoli-persistent-filter "^3.1.2" broccoli-plugin "^4.0.3" common-tags "^1.8.0" - ember-cli-babel-plugin-helpers "^1.1.0" + ember-cli-babel-plugin-helpers "^1.1.1" fs-tree-diff "^2.0.1" hash-for-dep "^1.5.1" heimdalljs-logger "^0.1.10" json-stable-stringify "^1.0.1" - semver "^7.3.2" + semver "^7.3.4" silent-error "^1.1.1" strip-bom "^4.0.0" walk-sync "^2.2.0" From 9569ab255d7b25e7fca80003a0d50b0819edfa64 Mon Sep 17 00:00:00 2001 From: Andrey Fel Date: Tue, 16 Feb 2021 01:35:01 +0300 Subject: [PATCH 761/879] Allow ember-inflector@^4.0.0 (#2121) ember-data updated its dependency from ember-inflector to 4.0.1. Allow ember-cli-mirage to depend on ember-inflector@4 to avoid dependency lint error. --- package.json | 2 +- yarn.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 2a33d35bf..87d39e4e6 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "ember-auto-import": "^1.2.19", "ember-cli-babel": "^7.5.0", "ember-get-config": "^0.2.4 || ^0.3.0", - "ember-inflector": "^2.0.0 || ^3.0.0", + "ember-inflector": "^2.0.0 || ^3.0.0 || ^4.0.0", "lodash-es": "^4.17.11", "miragejs": "^0.1.31" }, diff --git a/yarn.lock b/yarn.lock index 7f1408e5e..e49dfadc4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6909,7 +6909,7 @@ ember-ignore-children-helper@^1.0.1: dependencies: ember-cli-babel "^6.8.2" -"ember-inflector@^2.0.0 || ^3.0.0", ember-inflector@^3.0.1: +"ember-inflector@^2.0.0 || ^3.0.0 || ^4.0.0", ember-inflector@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-3.0.1.tgz#04be6df4d7e4000f6d6bd70787cdc995f77be4ab" integrity sha512-fngrwMsnhkBt51KZgwNwQYxgURwV4lxtoHdjxf7RueGZ5zM7frJLevhHw7pbQNGqXZ3N+MRkhfNOLkdDK9kFdA== From f701a2fb1b90bc4c5ee812cf2f867dec7eea1740 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 16 Feb 2021 06:41:09 +0000 Subject: [PATCH 762/879] build(deps): bump ember-inflector from 3.0.1 to 4.0.1 Bumps [ember-inflector](https://github.com/emberjs/ember-inflector) from 3.0.1 to 4.0.1. - [Release notes](https://github.com/emberjs/ember-inflector/releases) - [Changelog](https://github.com/emberjs/ember-inflector/blob/master/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember-inflector/compare/v3.0.1...v4.0.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index e49dfadc4..1c3389e8b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6909,7 +6909,14 @@ ember-ignore-children-helper@^1.0.1: dependencies: ember-cli-babel "^6.8.2" -"ember-inflector@^2.0.0 || ^3.0.0 || ^4.0.0", ember-inflector@^3.0.1: +"ember-inflector@^2.0.0 || ^3.0.0 || ^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-4.0.1.tgz#e0aa9e39119156a278c80bb8cdec8462ecb8e6ab" + integrity sha512-D14nH2wVMp13ciOONcHMXwdL/IoMBSDXsGObF2rsQX7F8vGjwp+jnSNzZuGjjIvlBFQydOJ+R2n86J2e8HRTQA== + dependencies: + ember-cli-babel "^7.23.0" + +ember-inflector@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-3.0.1.tgz#04be6df4d7e4000f6d6bd70787cdc995f77be4ab" integrity sha512-fngrwMsnhkBt51KZgwNwQYxgURwV4lxtoHdjxf7RueGZ5zM7frJLevhHw7pbQNGqXZ3N+MRkhfNOLkdDK9kFdA== From 44533ddea63dc129ba2fa0ed79da298ca1105fe3 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 22 Feb 2021 06:43:21 +0000 Subject: [PATCH 763/879] build(deps): bump lodash-es from 4.17.20 to 4.17.21 Bumps [lodash-es](https://github.com/lodash/lodash) from 4.17.20 to 4.17.21. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.20...4.17.21) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1c3389e8b..bb07479a3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10075,9 +10075,9 @@ locate-path@^3.0.0: path-exists "^3.0.0" lodash-es@^4.17.11: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.20.tgz#29f6332eefc60e849f869c264bc71126ad61e8f7" - integrity sha512-JD1COMZsq8maT6mnuz1UMV0jvYD0E0aUsSOdrr1/nAG3dhqQXwRRgeW0cSqH1U43INKcqxaiVIQNOUDld7gRDA== + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== lodash._baseassign@^3.0.0: version "3.2.0" From 61cec88d7e135dcf1fde10231ac396af9cb5b843 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 25 Feb 2021 07:32:35 +0000 Subject: [PATCH 764/879] build(deps-dev): bump ember-cli-htmlbars from 5.3.2 to 5.4.0 Bumps [ember-cli-htmlbars](https://github.com/ember-cli/ember-cli-htmlbars) from 5.3.2 to 5.4.0. - [Release notes](https://github.com/ember-cli/ember-cli-htmlbars/releases) - [Changelog](https://github.com/ember-cli/ember-cli-htmlbars/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-cli-htmlbars/compare/v5.3.2...v5.4.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index bb07479a3..a31dd82d5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3016,6 +3016,13 @@ babel-plugin-ember-modules-api-polyfill@^3.2.1: dependencies: ember-rfc176-data "^0.3.16" +babel-plugin-ember-modules-api-polyfill@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-3.4.0.tgz#3f5e0457e135f8a29b3a8b6910806bb5b524649e" + integrity sha512-nVu/LqbZBAup1zLij6xGvQwVLWVk4XYu2fl4vIOUR3S6ukdonMLhKAb0d4QXSzH30Pd7OczVTlPffWbiwahdJw== + dependencies: + ember-rfc176-data "^0.3.16" + babel-plugin-feature-flags@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/babel-plugin-feature-flags/-/babel-plugin-feature-flags-0.3.1.tgz#9c827cf9a4eb9a19f725ccb239e85cab02036fc1" @@ -3047,10 +3054,12 @@ babel-plugin-htmlbars-inline-precompile@^3.2.0: resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-3.2.0.tgz#c4882ea875d0f5683f0d91c1f72e29a4f14b5606" integrity sha512-IUeZmgs9tMUGXYu1vfke5I18yYJFldFGdNFQOWslXTnDWXzpwPih7QFduUqvT+awDpDuNtXpdt5JAf43Q1Hhzg== -babel-plugin-htmlbars-inline-precompile@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-4.2.1.tgz#9a367f8d7ecb9fb2c2e886edfe285caf7cb9766d" - integrity sha512-MCJXk+1R0YjlF/F52eDbhJTpsnqRVYsPYVP9d0jEu7E46AcRPEWDL5tfSweiQWHLKG017BIedATb91KcIoT3zA== +babel-plugin-htmlbars-inline-precompile@^4.4.1: + version "4.4.3" + resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-4.4.3.tgz#e45a6386786583009e2d7c8bd2dc5ec51132c041" + integrity sha512-tJQP1cdJ/ISX5++s+7xKfy6MAZ9CYV2i78zHQ8zCrPVxAmstUWQeOkxglRMqvCoP6G0frvRSZgz+W26GyknoXw== + dependencies: + babel-plugin-ember-modules-api-polyfill "^3.4.0" babel-plugin-module-resolver@^3.1.1: version "3.2.0" @@ -6421,12 +6430,12 @@ ember-cli-htmlbars@^4.2.3: walk-sync "^2.0.2" ember-cli-htmlbars@^5.0.0, ember-cli-htmlbars@^5.2.0, ember-cli-htmlbars@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.3.2.tgz#d0e1a4ccd2e7c6f91be51ea0cc1ef7650a9b67e7" - integrity sha512-S/spDVzBxkdMhnjiT6gG9xqpM9sT0Z7HskWSvSIAAW1sQsKPOCfRYp/1CqJ3+V5aX8ct0j5aHsdRanQYyHya2w== + version "5.4.0" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.4.0.tgz#1eabd0a2a6b9e8877c2e79d3ab3a0627fde90ddc" + integrity sha512-AOThrNG+G6SejHvvfYja72PgpQ5lKJHVEhXyFpuwUPGGeXxqTDzpfh/UYnok/esVBIuM/eJW6qpTHMuZQcPNQg== dependencies: "@ember/edition-utils" "^1.2.0" - babel-plugin-htmlbars-inline-precompile "^4.2.1" + babel-plugin-htmlbars-inline-precompile "^4.4.1" broccoli-debug "^0.6.5" broccoli-persistent-filter "^3.1.2" broccoli-plugin "^4.0.3" From 9cc9e71c5fbe11c2bd61d718a1992ea470418696 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 26 Feb 2021 07:30:11 +0000 Subject: [PATCH 765/879] build(deps-dev): bump ember-cli-htmlbars from 5.4.0 to 5.6.0 Bumps [ember-cli-htmlbars](https://github.com/ember-cli/ember-cli-htmlbars) from 5.4.0 to 5.6.0. - [Release notes](https://github.com/ember-cli/ember-cli-htmlbars/releases) - [Changelog](https://github.com/ember-cli/ember-cli-htmlbars/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-cli-htmlbars/compare/v5.4.0...v5.6.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 1805 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 1740 insertions(+), 65 deletions(-) diff --git a/yarn.lock b/yarn.lock index a31dd82d5..2f382248b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1548,6 +1548,11 @@ "@glimmer/interfaces" "^0.42.2" "@glimmer/util" "^0.42.2" +"@iarna/toml@2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" + integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== + "@jimp/bmp@^0.5.4": version "0.5.4" resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.5.4.tgz#b7b375aa774f26154912569864d5466e71333ef1" @@ -1826,6 +1831,108 @@ "@nodelib/fs.scandir" "2.1.3" fastq "^1.6.0" +"@octokit/auth-token@^2.4.4": + version "2.4.5" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.5.tgz#568ccfb8cb46f36441fac094ce34f7a875b197f3" + integrity sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA== + dependencies: + "@octokit/types" "^6.0.3" + +"@octokit/core@^3.2.3": + version "3.2.5" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.2.5.tgz#57becbd5fd789b0592b915840855f3a5f233d554" + integrity sha512-+DCtPykGnvXKWWQI0E1XD+CCeWSBhB6kwItXqfFmNBlIlhczuDPbg+P6BtLnVBaRJDAjv+1mrUJuRsFSjktopg== + dependencies: + "@octokit/auth-token" "^2.4.4" + "@octokit/graphql" "^4.5.8" + "@octokit/request" "^5.4.12" + "@octokit/types" "^6.0.3" + before-after-hook "^2.1.0" + universal-user-agent "^6.0.0" + +"@octokit/endpoint@^6.0.1": + version "6.0.11" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.11.tgz#082adc2aebca6dcefa1fb383f5efb3ed081949d1" + integrity sha512-fUIPpx+pZyoLW4GCs3yMnlj2LfoXTWDUVPTC4V3MUEKZm48W+XYpeWSZCv+vYF1ZABUm2CqnDVf1sFtIYrj7KQ== + dependencies: + "@octokit/types" "^6.0.3" + is-plain-object "^5.0.0" + universal-user-agent "^6.0.0" + +"@octokit/graphql@^4.5.8": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.6.0.tgz#f9abca55f82183964a33439d5264674c701c3327" + integrity sha512-CJ6n7izLFXLvPZaWzCQDjU/RP+vHiZmWdOunaCS87v+2jxMsW9FB5ktfIxybRBxZjxuJGRnxk7xJecWTVxFUYQ== + dependencies: + "@octokit/request" "^5.3.0" + "@octokit/types" "^6.0.3" + universal-user-agent "^6.0.0" + +"@octokit/openapi-types@^5.1.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-5.1.1.tgz#d01ae6e2879c589edcea7800e3a427455ece619f" + integrity sha512-yMyaX9EDWCiyv7m85/K8L7bLFj1wrLdfDkKcZEZ6gNmepSW5mfSMFJnYwRINN7lF58wvevKPWvw0MYy6sxcFlQ== + +"@octokit/plugin-paginate-rest@^2.6.2": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.10.0.tgz#5925156d809c94b7bfc47b28e17488415548fa67" + integrity sha512-71OsKBSMcQEu/6lfVbhv5C5ikU1rn10rKot/WiV7do7fyfElQ2eCUQFogHPbj0ci5lnKAjvahOiMAr6lcvL8Qw== + dependencies: + "@octokit/types" "^6.10.0" + +"@octokit/plugin-request-log@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.3.tgz#70a62be213e1edc04bb8897ee48c311482f9700d" + integrity sha512-4RFU4li238jMJAzLgAwkBAw+4Loile5haQMQr+uhFq27BmyJXcXSKvoQKqh0agsZEiUlW6iSv3FAgvmGkur7OQ== + +"@octokit/plugin-rest-endpoint-methods@4.12.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.12.0.tgz#1cec405cd4eaf0bdb58cb7d2a9b3d8473b3a70e8" + integrity sha512-RgnQ1aoetdOJjZYC37LV5FNlL7GY/v1CdC5dur1Zp/UiADJlbRFbAz/xLx26ovXw67dK7EUtwCghS+6QyiI9RA== + dependencies: + "@octokit/types" "^6.10.0" + deprecation "^2.3.1" + +"@octokit/request-error@^2.0.0": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.5.tgz#72cc91edc870281ad583a42619256b380c600143" + integrity sha512-T/2wcCFyM7SkXzNoyVNWjyVlUwBvW3igM3Btr/eKYiPmucXTtkxt2RBsf6gn3LTzaLSLTQtNmvg+dGsOxQrjZg== + dependencies: + "@octokit/types" "^6.0.3" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^5.3.0", "@octokit/request@^5.4.12": + version "5.4.14" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.14.tgz#ec5f96f78333bb2af390afa5ff66f114b063bc96" + integrity sha512-VkmtacOIQp9daSnBmDI92xNIeLuSRDOIuplp/CJomkvzt7M18NXgG044Cx/LFKLgjKt9T2tZR6AtJayba9GTSA== + dependencies: + "@octokit/endpoint" "^6.0.1" + "@octokit/request-error" "^2.0.0" + "@octokit/types" "^6.7.1" + deprecation "^2.0.0" + is-plain-object "^5.0.0" + node-fetch "^2.6.1" + once "^1.4.0" + universal-user-agent "^6.0.0" + +"@octokit/rest@18.2.0": + version "18.2.0" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.2.0.tgz#b75c87870bb1f7bc9f37ae0e9acb3a411a34a25f" + integrity sha512-xsp6bIqL2sb/NmgLXTxw96caegobRw+YHnzdIi70ruquHtPPDW2cBAONhDYMUuAOeXx0JH2auOeplpk4SQJy1w== + dependencies: + "@octokit/core" "^3.2.3" + "@octokit/plugin-paginate-rest" "^2.6.2" + "@octokit/plugin-request-log" "^1.0.2" + "@octokit/plugin-rest-endpoint-methods" "4.12.0" + +"@octokit/types@^6.0.3", "@octokit/types@^6.10.0", "@octokit/types@^6.7.1": + version "6.10.1" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.10.1.tgz#5955dc0cf344bb82a46283a0c332651f5dd9f1ad" + integrity sha512-hgNC5jxKG8/RlqxU/6GThkGrvFpz25+cPzjQjyiXTNBvhyltn2Z4GhFY25+kbtXwZ4Co4zM0goW5jak1KLp1ug== + dependencies: + "@octokit/openapi-types" "^5.1.0" + "@simple-dom/document@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@simple-dom/document/-/document-1.4.0.tgz#af60855f957f284d436983798ef1006cca1a1678" @@ -1857,11 +1964,35 @@ resolved "https://registry.yarnpkg.com/@simple-dom/void-map/-/void-map-1.4.0.tgz#f15f07568fe1076740407266aa5e6eac249bc78c" integrity sha512-VDhLEyVCbuhOBBgHol9ShzIv9O8UCzdXeH4FoXu2DOcu/nnvTjLTck+BgXsCLv5ynDiUdoqsREEVFnoyPpFKVw== +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + "@sindresorhus/is@^0.7.0": version "0.7.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== +"@sindresorhus/is@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.0.0.tgz#2ff674e9611b45b528896d820d3d7a812de2f0e4" + integrity sha512-FyD2meJpDPjyNQejSjvnhpgI/azsQkA4lGbuu5BQZfjvJ9cbRZXzeWL2HceCekW4lixO9JPesIIQkSoLjeJHNQ== + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@szmarczak/http-timer@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.5.tgz#bfbd50211e9dfa51ba07da58a14cdfd333205152" + integrity sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ== + dependencies: + defer-to-connect "^2.0.0" + "@types/acorn@^4.0.3": version "4.0.5" resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.5.tgz#e29fdf884695e77be4e99e67d748f5147255752d" @@ -1874,6 +2005,16 @@ resolved "https://registry.yarnpkg.com/@types/broccoli-plugin/-/broccoli-plugin-1.3.0.tgz#38f8462fecaebc4e09a32e4d4ed1b9808f75bbca" integrity sha512-SLk4/hFc2kGvgwNFrpn2O1juxFOllcHAywvlo7VwxfExLzoz1GGJ0oIZCwj5fwSpvHw4AWpZjJ1fUvb62PDayQ== +"@types/cacheable-request@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.1.tgz#5d22f3dded1fd3a84c0bbeb5039a7419c2c91976" + integrity sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "*" + "@types/node" "*" + "@types/responselike" "*" + "@types/color-name@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" @@ -2058,6 +2199,11 @@ resolved "https://registry.yarnpkg.com/@types/htmlbars-inline-precompile/-/htmlbars-inline-precompile-1.0.1.tgz#de564513fabb165746aecd76369c87bd85e5bbb4" integrity sha512-sVD2e6QAAHW0Y6Btse+tTA9k9g0iKm87wjxRsgZRU5EwSooz80tenbV+fA+f2BI2g0G2CqxsS1rIlwQCtPRQow== +"@types/http-cache-semantics@*": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz#9140779736aa2655635ee756e2467d787cfe8a2a" + integrity sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A== + "@types/jquery@*": version "3.3.34" resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.3.34.tgz#0d3b94057063d3854adaeb579652048fec07ba6c" @@ -2065,6 +2211,20 @@ dependencies: "@types/sizzle" "*" +"@types/keyv@*": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.1.tgz#e45a45324fca9dab716ab1230ee249c9fb52cfa7" + integrity sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw== + dependencies: + "@types/node" "*" + +"@types/mdast@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb" + integrity sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw== + dependencies: + "@types/unist" "*" + "@types/minimatch@*", "@types/minimatch@^3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -2080,11 +2240,23 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.55.tgz#7cc1358c9c18e71f6c020e410962971863232cf5" integrity sha512-e/5tg8Ok0gSrN6pvHphnwTK0/CD9VPZrtZqpvvpEFAtfs+ZntusgGaWkf2lSEq1OFe2EDPeUMiMVpy4nZpJ4AQ== +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + "@types/q@^1.5.1": version "1.5.2" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== +"@types/responselike@*", "@types/responselike@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" + integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== + dependencies: + "@types/node" "*" + "@types/rimraf@^2.0.2": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.4.tgz#403887b0b53c6100a6c35d2ab24f6ccc042fec46" @@ -2108,6 +2280,11 @@ resolved "https://registry.yarnpkg.com/@types/symlink-or-copy/-/symlink-or-copy-1.2.0.tgz#4151a81b4052c80bc2becbae09f3a9ec010a9c7a" integrity sha512-Lja2xYuuf2B3knEsga8ShbOdsfNOtzT73GyJmZyY7eGl2+ajOqrs8yM5ze0fsSoYwvA6bw7/Qr7OZ7PEEmYwWg== +"@types/unist@*", "@types/unist@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" + integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== + "@webassemblyjs/ast@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" @@ -2362,6 +2539,35 @@ after@0.8.2: resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= +agent-base@5: + version "5.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c" + integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g== + +agent-base@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" + integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== + dependencies: + es6-promisify "^5.0.0" + +agentkeepalive@^4.1.0: + version "4.1.4" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.1.4.tgz#d928028a4862cb11718e55227872e842a44c945b" + integrity sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ== + dependencies: + debug "^4.1.0" + depd "^1.1.2" + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" @@ -2402,6 +2608,13 @@ amdefine@>=0.0.4: resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= +ansi-align@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" + integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== + dependencies: + string-width "^3.0.0" + ansi-escapes@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" @@ -2456,6 +2669,13 @@ ansi-styles@^3.0.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + ansi-styles@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" @@ -2481,7 +2701,7 @@ any-base@^1.1.0: resolved "https://registry.yarnpkg.com/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe" integrity sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg== -any-promise@^1.1.0: +any-promise@^1.0.0, any-promise@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= @@ -2689,6 +2909,13 @@ async-promise-queue@^1.0.3, async-promise-queue@^1.0.5: async "^2.4.1" debug "^2.6.8" +async-retry@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.1.tgz#139f31f8ddce50c0870b0ba558a6079684aaed55" + integrity sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA== + dependencies: + retry "0.12.0" + async@^2.4.1, async@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" @@ -3459,6 +3686,11 @@ base64-js@^1.0.2: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + base64id@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" @@ -3491,6 +3723,11 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +before-after-hook@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.1.tgz#99ae36992b5cfab4a83f6bee74ab27835f28f405" + integrity sha512-5ekuQOvO04MDj7kYZJaMab2S8SPjGJbotVNyv7QYFCOAwrGZs/YnoDNlh1U+m5hl7H2D/+n0taaAV/tfyd3KMA== + big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" @@ -3528,6 +3765,15 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + blank-object@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/blank-object/-/blank-object-1.0.2.tgz#f990793fbe9a8c8dd013fb3219420bec81d5f4b9" @@ -3625,6 +3871,20 @@ bower-endpoint-parser@0.2.2: resolved "https://registry.yarnpkg.com/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz#00b565adbfab6f2d35addde977e97962acbcb3f6" integrity sha1-ALVlrb+rby01rd3pd+l5Yqy8s/Y= +boxen@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.0.0.tgz#64fe9b16066af815f51057adcc800c3730120854" + integrity sha512-5bvsqw+hhgUi3oYGK0Vf4WpIkyemp60WBInn7+WNfoISzAqk/HX4L7WNROq38E6UR/y3YADpv6pEm4BfkeEAdA== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.0" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -4576,6 +4836,14 @@ buffer@^5.2.0: base64-js "^1.0.2" ieee754 "^1.1.4" +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -4621,6 +4889,31 @@ cacache@^11.0.2: unique-filename "^1.1.1" y18n "^4.0.0" +cacache@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-14.0.0.tgz#97c10fc87c4c7ee41d45e32631c26761c2687caa" + integrity sha512-+Nr/BnA/tjAUXza9gH8F+FSP+1HvWqCKt4c95dQr4EDVJVafbzmPZpLKCkLYexs6vSd2B/1TOXrAoNnqVPfvRA== + dependencies: + chownr "^1.1.2" + figgy-pudding "^3.5.1" + fs-minipass "^2.0.0" + glob "^7.1.4" + graceful-fs "^4.2.2" + infer-owner "^1.0.4" + lru-cache "^5.1.1" + minipass "^3.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + move-concurrently "^1.0.1" + p-map "^3.0.0" + promise-inflight "^1.0.1" + rimraf "^2.7.1" + ssri "^7.0.0" + tar "^6.0.0" + unique-filename "^1.1.1" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -4636,6 +4929,11 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + cacheable-request@^2.1.1: version "2.1.4" resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" @@ -4649,6 +4947,32 @@ cacheable-request@^2.1.1: normalize-url "2.0.1" responselike "1.0.2" +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +cacheable-request@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.1.tgz#062031c2856232782ed694a257fa35da93942a58" + integrity sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^2.0.0" + calculate-cache-key-for-tree@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-1.2.3.tgz#5a5e4fcfa2d374a63e47fe967593f179e8282825" @@ -4691,6 +5015,16 @@ camelcase@^3.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + can-symlink@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/can-symlink/-/can-symlink-1.0.0.tgz#97b607d8a84bb6c6e228b902d864ecb594b9d219" @@ -4748,6 +5082,14 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +chalk@4.1.0, chalk@^4.0.0, chalk@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@^1.0.0, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -4776,13 +5118,20 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== chardet@^0.7.0: version "0.7.0" @@ -4892,11 +5241,16 @@ chokidar@^3.4.1: optionalDependencies: fsevents "~2.1.2" -chownr@^1.1.1: +chownr@^1.1.1, chownr@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + chrome-trace-event@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" @@ -4909,6 +5263,16 @@ ci-info@^1.1.3: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.1.1.tgz#9a32fcefdf7bcdb6f0a7e1c0f8098ec57897b80a" + integrity sha512-kdRWLBIJwdsYJWYJFtAFFYxybguqeF91qpZaggjG5Nf8QKdizFG2hjqvaTXbxFIcYbSaD74KpAXv6BSm17DHEQ== + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -4949,11 +5313,21 @@ clean-css@^3.4.5: commander "2.8.x" source-map "0.4.x" +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + clean-up-path@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clean-up-path/-/clean-up-path-1.0.0.tgz#de9e8196519912e749c9eaf67c13d64fac72a3e5" integrity sha512-PHGlEF0Z6976qQyN6gM7kKH6EH0RdfZcc8V+QhFe36eRxV0SMH5OUBZG7Bxa9YcreNzyNbK63cGiZxdSZgosRw== +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + cli-cursor@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" @@ -4975,11 +5349,28 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" +cli-highlight@^2.1.4: + version "2.1.10" + resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.10.tgz#26a087da9209dce4fcb8cf5427dc97cd96ac173a" + integrity sha512-CcPFD3JwdQ2oSzy+AMG6j3LRTkNjM82kzcSKzoVw6cLanDCJNlsLjeqVTOTfOfucnWv5F0rmBemVf1m9JiIasw== + dependencies: + chalk "^4.0.0" + highlight.js "^10.0.0" + mz "^2.4.0" + parse5 "^5.1.1" + parse5-htmlparser2-tree-adapter "^6.0.0" + yargs "^16.0.0" + cli-spinners@^1.1.0: version "1.3.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== +cli-spinners@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.5.0.tgz#12763e47251bf951cb75c201dfa58ff1bcb2d047" + integrity sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ== + cli-table3@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" @@ -5025,12 +5416,30 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + clone-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= -clone-response@1.0.2: +clone-response@1.0.2, clone-response@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= @@ -5143,7 +5552,7 @@ colors@^1.1.2, colors@^1.3.2: resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -5256,6 +5665,18 @@ configstore@^4.0.0: write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + console-browserify@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" @@ -5395,6 +5816,17 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +cosmiconfig@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" @@ -5462,6 +5894,15 @@ cross-spawn@^7.0.0: shebang-command "^2.0.0" which "^2.0.1" +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + cryptiles@0.2.x: version "0.2.2" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-0.2.2.tgz#ed91ff1f17ad13d3748288594f8a48a0d26f325c" @@ -5491,6 +5932,11 @@ crypto-random-string@^1.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + css-select-base-adapter@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" @@ -5635,6 +6081,13 @@ debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.3. dependencies: ms "2.0.0" +debug@4, debug@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + debug@^3.0.1, debug@^3.1.0, debug@^3.1.1: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -5656,7 +6109,7 @@ debug@~3.1.0: dependencies: ms "2.0.0" -decamelize@^1.1.1, decamelize@^1.1.2: +decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -5678,6 +6131,13 @@ decompress-response@^3.3.0: dependencies: mimic-response "^1.0.0" +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -5695,6 +6155,16 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +defer-to-connect@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -5749,7 +6219,7 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -depd@~1.1.2: +depd@^1.1.2, depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= @@ -5759,6 +6229,19 @@ depd@~2.0.0: resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +deprecated-obj@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/deprecated-obj/-/deprecated-obj-2.0.0.tgz#e6ba93a3989f6ed18d685e7d99fb8d469b4beffc" + integrity sha512-CkdywZC2rJ8RGh+y3MM1fw1EJ4oO/oNExGbRFv0AQoMS+faTd3nO7slYjkj/6t8OnIMUE+wxh6G97YHhK1ytrw== + dependencies: + flat "^5.0.2" + lodash "^4.17.20" + +deprecation@^2.0.0, deprecation@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== + des.js@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" @@ -5914,6 +6397,13 @@ dot-prop@^4.1.0: dependencies: is-obj "^1.0.0" +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + dotenv@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-1.2.0.tgz#7cd73e16e07f057c8072147a5bc3a8677f0ab5c6" @@ -6430,9 +6920,9 @@ ember-cli-htmlbars@^4.2.3: walk-sync "^2.0.2" ember-cli-htmlbars@^5.0.0, ember-cli-htmlbars@^5.2.0, ember-cli-htmlbars@^5.3.1: - version "5.4.0" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.4.0.tgz#1eabd0a2a6b9e8877c2e79d3ab3a0627fde90ddc" - integrity sha512-AOThrNG+G6SejHvvfYja72PgpQ5lKJHVEhXyFpuwUPGGeXxqTDzpfh/UYnok/esVBIuM/eJW6qpTHMuZQcPNQg== + version "5.6.0" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.6.0.tgz#4e61272ec79296bbc8359b90db4fa6c8978eb17f" + integrity sha512-eSNetEGHyxt4bZ2mfgrJqjdBv7+JOWe6uJxyCo49kEHG3aeQLr+9jFgkyRnSPgmOjph8ouiGzDPTeXbGEdUG0A== dependencies: "@ember/edition-utils" "^1.2.0" babel-plugin-htmlbars-inline-precompile "^4.4.1" @@ -6449,6 +6939,9 @@ ember-cli-htmlbars@^5.0.0, ember-cli-htmlbars@^5.2.0, ember-cli-htmlbars@^5.3.1: silent-error "^1.1.1" strip-bom "^4.0.0" walk-sync "^2.2.0" + optionalDependencies: + release-it "^14.2.1" + release-it-lerna-changelog "^3.1.0" ember-cli-import-polyfill@^0.2.0: version "0.2.0" @@ -7235,6 +7728,13 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= +encoding@^0.1.12: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -7311,6 +7811,11 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== +err-code@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" + integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA= + errlop@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/errlop/-/errlop-2.2.0.tgz#1ff383f8f917ae328bebb802d6ca69666a42d21b" @@ -7323,7 +7828,7 @@ errno@^0.1.3, errno@~0.1.7: dependencies: prr "~1.0.1" -error-ex@^1.2.0: +error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== @@ -7378,6 +7883,23 @@ es6-promise@^4.0.3: resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-goat@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" + integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + escape-html@1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -7632,6 +8154,21 @@ exec-sh@^0.2.0: dependencies: merge "^1.2.0" +execa@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.0.0.tgz#4029b0007998a841fbd1032e5f4de86a3c1e3376" + integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + execa@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" @@ -7687,7 +8224,7 @@ execa@^3.0.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" -execa@^4.0.3: +execa@^4.0.2, execa@^4.0.3: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== @@ -7870,6 +8407,18 @@ fast-glob@^3.0.3: micromatch "^4.0.2" picomatch "^2.2.1" +fast-glob@^3.1.1: + version "3.2.5" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" + integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -8082,6 +8631,11 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +filter-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" + integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs= + finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -8117,6 +8671,14 @@ find-index@^1.1.0: resolved "https://registry.yarnpkg.com/find-index/-/find-index-1.1.1.tgz#4b221f8d46b7f8bea33d8faed953f3ca7a081cbc" integrity sha512-XYKutXMrIK99YMUPf91KX5QVJoG31/OsgftD6YoTPAObfQIxM4ziA9f0J1AsqKhJmo+IeaIPP0CFopTD4bdUBw== +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -8186,6 +8748,11 @@ flat-cache@^2.0.1: rimraf "2.6.3" write "1.0.3" +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + flatted@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" @@ -8219,6 +8786,15 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +form-data@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@~0.1.0: version "0.1.4" resolved "https://registry.yarnpkg.com/form-data/-/form-data-0.1.4.tgz#91abd788aba9702b1aabfa8bc01031a2ac9e3b12" @@ -8360,6 +8936,13 @@ fs-merger@^3.1.0: rimraf "^2.6.3" walk-sync "^2.0.2" +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6, fs-tree-diff@^0.5.7, fs-tree-diff@^0.5.9: version "0.5.9" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.9.tgz#a4ec6182c2f5bd80b9b83c8e23e4522e6f5fd946" @@ -8454,6 +9037,11 @@ get-caller-file@^1.0.0, get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== +get-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" @@ -8472,7 +9060,7 @@ get-stream@^2.0.0: object-assign "^4.0.1" pinkie-promise "^2.0.0" -get-stream@^4.0.0: +get-stream@^4.0.0, get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== @@ -8486,6 +9074,18 @@ get-stream@^5.0.0: dependencies: pump "^3.0.0" +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.0.tgz#3e0012cb6827319da2706e601a1583e8629a6718" + integrity sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg== + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -8550,6 +9150,21 @@ git-transport-protocol@^0.1.0: git-write-pkt-line "0.1.0" through "~2.2.7" +git-up@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/git-up/-/git-up-4.0.2.tgz#10c3d731051b366dc19d3df454bfca3f77913a7c" + integrity sha512-kbuvus1dWQB2sSW4cbfTeGpCMd8ge9jx9RKnhXhuJ7tnvT+NIrTVfYZxjtflZddQYcmdOTlkAcjmx7bor+15AQ== + dependencies: + is-ssh "^1.3.0" + parse-url "^5.0.0" + +git-url-parse@11.4.4: + version "11.4.4" + resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.4.4.tgz#5d747debc2469c17bc385719f7d0427802d83d77" + integrity sha512-Y4o9o7vQngQDIU9IjyCmRJBin5iYjI5u9ZITnddRZpD7dcCFQj2sL2XuMNbLRE4b4B/4ENPsp2Q8P44fjAZ0Pw== + dependencies: + git-up "^4.0.0" + git-write-pkt-line@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/git-write-pkt-line/-/git-write-pkt-line-0.1.0.tgz#a84c1856c09011908389b2f06f911d91f6394694" @@ -8596,6 +9211,13 @@ glob@^7.0.0, glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, gl once "^1.3.0" path-is-absolute "^1.0.0" +global-dirs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" + integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== + dependencies: + ini "2.0.0" + global@~4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" @@ -8633,6 +9255,18 @@ globby@10.0.1: merge2 "^1.2.3" slash "^3.0.0" +globby@11.0.2: + version "11.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.2.tgz#1af538b766a3b540ebfb58a32b2e2d5897321d83" + integrity sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + globrex@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" @@ -8645,6 +9279,23 @@ good-listener@^1.2.2: dependencies: delegate "^3.1.2" +got@11.8.1: + version "11.8.1" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.1.tgz#df04adfaf2e782babb3daabc79139feec2f7e85d" + integrity sha512-9aYdZL+6nHmvJwHALLwKSUZ0hMwGaJGYv3hoPLPgnT8BoBXm1SjnZeky+91tfwJaDzun2s4RsBRy48IEYv2q2Q== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.1" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + got@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" @@ -8685,10 +9336,32 @@ got@^8.0.1: url-parse-lax "^3.0.0" url-to-options "^1.0.1" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +graceful-fs@^4.2.2: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== "graceful-readlink@>= 1.0.0": version "1.0.1" @@ -8814,6 +9487,11 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" +has-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -8902,6 +9580,11 @@ heimdalljs@^0.3.0: dependencies: rsvp "~3.2.1" +highlight.js@^10.0.0: + version "10.6.0" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.6.0.tgz#0073aa71d566906965ba6e1b7be7b2682f5e18b6" + integrity sha512-8mlRcn5vk/r4+QcqerapwBYTe+iPL5ih6xrNylxrnBdHQiijDETfXX7VIxC3UiCRiINBJfANBAsPzAvRQj8RpQ== + highlight.js@^9.15.10: version "9.18.5" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.5.tgz#d18a359867f378c138d6819edfc2a8acd5f29825" @@ -8991,6 +9674,11 @@ http-cache-semantics@3.8.1: resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== +http-cache-semantics@^4.0.0, http-cache-semantics@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + http-errors@1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" @@ -9018,6 +9706,14 @@ http-errors@~1.7.2: resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= +http-proxy-agent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-3.0.0.tgz#598f42dc815949a11e2c6dbfdf24cd8a4c165327" + integrity sha512-uGuJaBWQWDQCJI5ip0d/VTYZW0nRrlLWXA4A7P1jrsa+f77rW2yXz315oBt6zGCF6l8C2tlMxY7ffULCj+5FhA== + dependencies: + agent-base "5" + debug "4" + http-proxy@^1.13.1, http-proxy@^1.17.0: version "1.18.1" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" @@ -9045,16 +9741,44 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= +https-proxy-agent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz#702b71fb5520a132a66de1f67541d9e62154d82b" + integrity sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg== + dependencies: + agent-base "5" + debug "4" + human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= + dependencies: + ms "^2.0.0" + ice-cap@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/ice-cap/-/ice-cap-0.0.4.tgz#8a6d31ab4cac8d4b56de4fa946df3352561b6e18" @@ -9070,6 +9794,18 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" + integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ieee754@^1.1.4: version "1.1.13" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" @@ -9090,6 +9826,11 @@ ignore@^5.1.1: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== +ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + image-size@^0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" @@ -9100,6 +9841,13 @@ image-size@^0.6.3: resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2" integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== +import-cwd@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-3.0.0.tgz#20845547718015126ea9b3676b7592fb8bd4cf92" + integrity sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg== + dependencies: + import-from "^3.0.0" + import-fresh@^3.0.0: version "3.2.1" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" @@ -9108,6 +9856,26 @@ import-fresh@^3.0.0: parent-module "^1.0.0" resolve-from "^4.0.0" +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966" + integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== + dependencies: + resolve-from "^5.0.0" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -9125,6 +9893,11 @@ indent-string@^2.1.0: dependencies: repeating "^2.0.0" +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" @@ -9135,6 +9908,11 @@ indexof@0.0.1: resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + inflected@^2.0.3, inflected@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inflected/-/inflected-2.0.4.tgz#323770961ccbe992a98ea930512e9a82d3d3ef77" @@ -9153,7 +9931,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -9168,6 +9946,11 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + ini@^1.3.5, ini@~1.3.0: version "1.3.7" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" @@ -9184,6 +9967,25 @@ inline-source-map-comment@^1.0.5: sum-up "^1.0.1" xtend "^4.0.0" +inquirer@7.3.3, inquirer@^7.3.3: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + inquirer@^2: version "2.0.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-2.0.0.tgz#e1351687b90d150ca403ceaa3cefb1e3065bef4b" @@ -9223,24 +10025,10 @@ inquirer@^6.2.2: strip-ansi "^5.1.0" through "^2.3.6" -inquirer@^7.3.3: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== into-stream@^3.1.0: version "3.1.0" @@ -9272,6 +10060,11 @@ ip-regex@^2.1.0: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= +ip@1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -9291,6 +10084,19 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -9325,6 +10131,27 @@ is-callable@^1.1.4, is-callable@^1.1.5: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== +is-ci@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.0.tgz#c7e7be3c9d8eef7d0fa144390bd1e4b88dc4c994" + integrity sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ== + dependencies: + ci-info "^3.1.1" + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-core-module@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -9344,6 +10171,11 @@ is-date-object@^1.0.1: resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" @@ -9425,6 +10257,34 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= + +is-npm@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" + integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -9442,11 +10302,21 @@ is-obj@^1.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + is-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= +is-path-inside@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" + integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== + is-plain-obj@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" @@ -9464,6 +10334,11 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + is-potential-custom-element-name@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" @@ -9498,6 +10373,13 @@ is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== +is-ssh@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.2.tgz#a4b82ab63d73976fd8263cceee27f99a88bdae2b" + integrity sha512-elEw0/0c2UscLrNG+OAorbP539E3rhliKPg+hDMWN9VwrDXfYK+4PBEykDPfxlYYtQvl84TascnQyobfQLHEhQ== + dependencies: + protocols "^1.1.0" + is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -9522,7 +10404,7 @@ is-type@0.0.1: dependencies: core-util-is "~1.0.0" -is-typedarray@~1.0.0: +is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= @@ -9542,6 +10424,11 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -9817,11 +10704,21 @@ json-buffer@3.0.0: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -9923,6 +10820,20 @@ keyv@3.0.0: dependencies: json-buffer "3.0.0" +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +keyv@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.3.tgz#4f3aa98de254803cafcd2896734108daa35e4254" + integrity sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA== + dependencies: + json-buffer "3.0.1" + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -9954,6 +10865,13 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" +latest-version@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -9970,6 +10888,20 @@ leek@0.0.24: lodash.assign "^3.2.0" rsvp "^3.0.21" +lerna-changelog@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lerna-changelog/-/lerna-changelog-1.0.1.tgz#53090ab7f047730ec88d32087762164626269d3a" + integrity sha512-E7ewsfQknBmQcUspCqd5b8Hbbp5SX768y6vEiIdXXui9pPhZS1WlrKtiAUPs0CeGd8Pv4gtIC/h3wSWIZuvqaA== + dependencies: + chalk "^2.4.1" + cli-highlight "^2.1.4" + execa "^1.0.0" + make-fetch-happen "^7.1.1" + normalize-git-url "^3.0.2" + p-map "^3.0.0" + progress "^2.0.0" + yargs "^13.0.0" + levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -9985,6 +10917,11 @@ line-stream@0.0.0: dependencies: through "~2.2.0" +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + linkify-it@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" @@ -10083,6 +11020,13 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + lodash-es@^4.17.11: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" @@ -10401,11 +11345,16 @@ lodash.values@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c= -lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1: +lodash@4.17.20, lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== +lodash@^4.17.20: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" @@ -10413,6 +11362,13 @@ log-symbols@^2.2.0: dependencies: chalk "^2.0.1" +log-symbols@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== + dependencies: + chalk "^4.0.0" + loose-envify@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -10440,11 +11396,16 @@ lowercase-keys@1.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY= -lowercase-keys@^1.0.0: +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -10472,6 +11433,11 @@ lunr@^2.3.7: resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.8.tgz#a8b89c31f30b5a044b97d2d28e2da191b6ba2072" integrity sha512-oxMeX/Y35PNFuZoHp+jUj5OSEmLCaIH4KTFJh7a93cHBoFmpw2IoPs22VIz7vyO2YUnx2Tn9dzIwO2P/4quIRg== +macos-release@^2.2.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.4.1.tgz#64033d0ec6a5e6375155a74b1a1eba8e509820ac" + integrity sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg== + magic-string@^0.24.0: version "0.24.1" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.24.1.tgz#7e38e5f126cae9f15e71f0cf8e450818ca7d5a8f" @@ -10494,6 +11460,34 @@ make-dir@^2.0.0: pify "^4.0.1" semver "^5.6.0" +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-fetch-happen@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-7.1.1.tgz#89ac8112eaa9d4361541deb591329e9238a531b1" + integrity sha512-7fNjiOXNZhNGQzG5P15nU97aZQtzPU2GVgVd7pnqnl5gnpLzMAD8bAe5YG4iW2s0PTqaZy9xGv4Wfqe872kRNQ== + dependencies: + agentkeepalive "^4.1.0" + cacache "^14.0.0" + http-cache-semantics "^4.0.3" + http-proxy-agent "^3.0.0" + https-proxy-agent "^4.0.0" + is-lambda "^1.0.1" + lru-cache "^5.1.1" + minipass "^3.0.0" + minipass-collect "^1.0.2" + minipass-fetch "^1.1.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + promise-retry "^1.1.1" + socks-proxy-agent "^4.0.0" + ssri "^7.0.1" + makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" @@ -10602,6 +11596,22 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +mdast-util-from-markdown@^0.8.1: + version "0.8.5" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" + integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-string "^2.0.0" + micromark "~2.11.0" + parse-entities "^2.0.0" + unist-util-stringify-position "^2.0.0" + +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== + mdn-data@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" @@ -10711,6 +11721,14 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= +micromark@~2.11.0: + version "2.11.4" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" + integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== + dependencies: + debug "^4.0.0" + parse-entities "^2.0.0" + micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -10756,6 +11774,18 @@ mime-db@1.45.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== +mime-db@1.46.0: + version "1.46.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" + integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== + +mime-types@2.1.29: + version "2.1.29" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2" + integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ== + dependencies: + mime-db "1.46.0" + mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.19: version "2.1.26" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" @@ -10795,11 +11825,16 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-response@^1.0.0: +mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + min-document@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" @@ -10844,6 +11879,45 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^1.1.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.3.3.tgz#34c7cea038c817a8658461bf35174551dce17a0a" + integrity sha512-akCrLDWfbdAWkMLBxJEeWTdNsjML+dt5YgOI4gJ53vuO0vrmYQkUPxa6j6V65s9CcePIr2SSWqjT2EcrNseryQ== + dependencies: + minipass "^3.1.0" + minipass-sized "^1.0.3" + minizlib "^2.0.0" + optionalDependencies: + encoding "^0.1.12" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + minipass@^2.2.0: version "2.9.0" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" @@ -10852,6 +11926,21 @@ minipass@^2.2.0: safe-buffer "^5.1.2" yallist "^3.0.0" +minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== + dependencies: + yallist "^4.0.0" + +minizlib@^2.0.0, minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + miragejs@^0.1.31: version "0.1.41" resolved "https://registry.yarnpkg.com/miragejs/-/miragejs-0.1.41.tgz#1b06a2d2d9de65624f5bb1cee7ebb4a208f554d0" @@ -10987,7 +12076,12 @@ ms@2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@^2.1.1: +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.0.0, ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -11012,6 +12106,15 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +mz@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + najax@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/najax/-/najax-1.0.4.tgz#63fd8dbf15d18f24dc895b3a16fec66c136b8084" @@ -11083,7 +12186,7 @@ node-emoji@^1.8.1: dependencies: lodash.toarray "^4.4.0" -node-fetch@^2.6.0: +node-fetch@^2.6.0, node-fetch@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== @@ -11167,6 +12270,11 @@ nopt@^3.0.6: dependencies: abbrev "1" +normalize-git-url@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/normalize-git-url/-/normalize-git-url-3.0.2.tgz#8e5f14be0bdaedb73e07200310aa416c27350fc4" + integrity sha1-jl8Uvgva7bc+ByADEKpBbCc1D8Q= + normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -11203,6 +12311,16 @@ normalize-url@2.0.1: query-string "^5.0.1" sort-keys "^2.0.0" +normalize-url@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +normalize-url@^4.1.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" + integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== + normalize.css@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-8.0.1.tgz#9b98a208738b9cc2634caacbc42d131c97487bf3" @@ -11230,7 +12348,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npm-run-path@^4.0.0: +npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== @@ -11403,6 +12521,13 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" @@ -11423,6 +12548,20 @@ optionator@^0.8.1, optionator@^0.8.2: type-check "~0.3.2" word-wrap "~1.2.3" +ora@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.3.0.tgz#fb832899d3a1372fe71c8b2c534bbfe74961bb6f" + integrity sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g== + dependencies: + bl "^4.0.3" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + log-symbols "^4.0.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + ora@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ora/-/ora-2.1.0.tgz#6caf2830eb924941861ec53a173799e008b51e5b" @@ -11452,6 +12591,14 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" +os-name@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/os-name/-/os-name-4.0.0.tgz#6c05c09c41c15848ea74658d12c9606f0f286599" + integrity sha512-caABzDdJMbtykt7GmSogEat3faTKQhmZf0BS5l/pZGmP0vPWQjXWqOhbLyK+b6j2/DQPmEvYdzLXJXXLJNVDNg== + dependencies: + macos-release "^2.2.0" + windows-release "^4.0.0" + os-shim@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" @@ -11475,6 +12622,16 @@ p-cancelable@^0.4.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ== +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-cancelable@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.0.0.tgz#4a3740f5bdaf5ed5d7c3e34882c6fb5d6b266a6e" + integrity sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg== + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -11504,6 +12661,13 @@ p-limit@^2.0.0: dependencies: p-try "^2.0.0" +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -11518,6 +12682,20 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + p-timeout@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" @@ -11545,6 +12723,16 @@ package-json@^4.0.1: registry-url "^3.0.3" semver "^5.1.0" +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + pad-start@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pad-start/-/pad-start-1.0.2.tgz#23e5bab3e96446b62816cff6f150975f040d1b14" @@ -11601,6 +12789,18 @@ parse-bmfont-xml@^1.1.4: xml-parse-from-string "^1.0.0" xml2js "^0.4.5" +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + parse-git-config@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/parse-git-config/-/parse-git-config-3.0.0.tgz#4a2de08c7b74a2555efa5ae94d40cd44302a6132" @@ -11614,6 +12814,16 @@ parse-headers@^2.0.0: resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.3.tgz#5e8e7512383d140ba02f0c7aa9f49b4399c92515" integrity sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA== +parse-json@5.2.0, parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -11626,6 +12836,16 @@ parse-ms@^1.0.0: resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" integrity sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0= +parse-path@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.3.tgz#82d81ec3e071dcc4ab49aa9f2c9c0b8966bb22bf" + integrity sha512-9Cepbp2asKnWTJ9x2kpw6Fe8y9JDbqwahGCTvklzd/cEq5C5JC59x2Xb0Kx+x0QZ8bvNquGO8/BWP0cwBHzSAA== + dependencies: + is-ssh "^1.3.0" + protocols "^1.4.0" + qs "^6.9.4" + query-string "^6.13.8" + parse-png@^1.0.0, parse-png@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/parse-png/-/parse-png-1.1.2.tgz#f5c2ad7c7993490986020a284c19aee459711ff2" @@ -11633,7 +12853,24 @@ parse-png@^1.0.0, parse-png@^1.1.1: dependencies: pngjs "^3.2.0" -parse5@5.1.1: +parse-url@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-5.0.2.tgz#856a3be1fcdf78dc93fc8b3791f169072d898b59" + integrity sha512-Czj+GIit4cdWtxo3ISZCvLiUjErSo0iI3wJ+q9Oi3QuMYTI6OZu+7cewMWZ+C1YAnKhYTk6/TLuhIgCypLthPA== + dependencies: + is-ssh "^1.3.0" + normalize-url "^3.3.0" + parse-path "^4.0.0" + protocols "^1.4.0" + +parse5-htmlparser2-tree-adapter@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" + integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== + dependencies: + parse5 "^6.0.1" + +parse5@5.1.1, parse5@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== @@ -11650,6 +12887,11 @@ parse5@^3.0.1: dependencies: "@types/node" "*" +parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + parseqs@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" @@ -11699,6 +12941,11 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -12060,6 +13307,19 @@ promise-map-series@^0.2.1, promise-map-series@^0.2.3: dependencies: rsvp "^3.0.14" +promise-retry@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" + integrity sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0= + dependencies: + err-code "^1.0.0" + retry "^0.10.0" + +protocols@^1.1.0, protocols@^1.4.0: + version "1.4.8" + resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.8.tgz#48eea2d8f58d9644a4a32caae5d5db290a075ce8" + integrity sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg== + proxy-addr@~2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" @@ -12135,6 +13395,13 @@ punycode@^1.2.4: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= +pupa@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== + dependencies: + escape-goat "^2.0.0" + purgecss@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/purgecss/-/purgecss-2.3.0.tgz#5327587abf5795e6541517af8b190a6fb5488bb3" @@ -12160,6 +13427,11 @@ qs@^6.2.0, qs@^6.4.0: resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e" integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw== +qs@^6.9.4: + version "6.9.6" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" + integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== + qs@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/qs/-/qs-1.0.2.tgz#50a93e2b5af6691c31bcea5dae78ee6ea1903768" @@ -12179,6 +13451,16 @@ query-string@^5.0.1: object-assign "^4.1.0" strict-uri-encode "^1.0.0" +query-string@^6.13.8: + version "6.14.0" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.0.tgz#0b7b7ca326f5facf10dd2d45d26645cd287f8c92" + integrity sha512-In3o+lUxlgejoVJgwEdYtdxrmlL0cQWJXj0+kkI7RWVo7hg5AhFtybeKlC9Dpgbr8eOC4ydpEh8017WwyfzqVQ== + dependencies: + decode-uri-component "^0.2.0" + filter-obj "^1.1.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -12189,6 +13471,11 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quick-temp@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/quick-temp/-/quick-temp-0.1.8.tgz#bab02a242ab8fb0dd758a3c9776b32f9a5d94408" @@ -12256,7 +13543,7 @@ raw-body@~1.1.0: bytes "1" string_decoder "0.10" -rc@^1.0.1, rc@^1.1.6: +rc@^1.0.1, rc@^1.1.6, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -12311,7 +13598,7 @@ readable-stream@1.1: isarray "0.0.1" string_decoder "~0.10.x" -"readable-stream@2 || 3", readable-stream@^3.1.1: +"readable-stream@2 || 3", readable-stream@^3.1.1, readable-stream@^3.4.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -12363,6 +13650,13 @@ recast@^0.18.1: private "^0.1.8" source-map "~0.6.1" +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" @@ -12494,6 +13788,13 @@ registry-auth-token@^3.0.1: rc "^1.1.6" safe-buffer "^5.0.1" +registry-auth-token@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" + integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== + dependencies: + rc "^1.2.8" + registry-url@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" @@ -12501,6 +13802,13 @@ registry-url@^3.0.3: dependencies: rc "^1.0.1" +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" @@ -12525,6 +13833,52 @@ regjsparser@^0.6.4: dependencies: jsesc "~0.5.0" +release-it-lerna-changelog@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/release-it-lerna-changelog/-/release-it-lerna-changelog-3.1.0.tgz#cbcc877b40712e93a99a8b9a14e9e48290a82b9f" + integrity sha512-VehiRVpIB37XfggFcwMwDZ3ncXmD4npgM2tGGTfa3CN8MFCCJPPIRvaqHySDC/YV8mN7oLZeGSI/exrKXeybmA== + dependencies: + execa "^4.0.3" + lerna-changelog "^1.0.1" + mdast-util-from-markdown "^0.8.1" + tmp "^0.2.1" + validate-peer-dependencies "^1.0.0" + which "^2.0.2" + +release-it@^14.2.1: + version "14.4.1" + resolved "https://registry.yarnpkg.com/release-it/-/release-it-14.4.1.tgz#7b7dac839e22521853e81aa67d833c40a4094c43" + integrity sha512-fNvl2hIiTA3wKOQMu/cS07acuvibaTlvLUJmhuHarPsYJZpwX+nugb0a4PG20vlpuU5jKfnhkP8uPmvKXtRfuw== + dependencies: + "@iarna/toml" "2.2.5" + "@octokit/rest" "18.2.0" + async-retry "1.3.1" + chalk "4.1.0" + cosmiconfig "7.0.0" + debug "4.3.1" + deprecated-obj "2.0.0" + execa "5.0.0" + find-up "5.0.0" + form-data "4.0.0" + git-url-parse "11.4.4" + globby "11.0.2" + got "11.8.1" + import-cwd "3.0.0" + inquirer "7.3.3" + is-ci "3.0.0" + lodash "4.17.20" + mime-types "2.1.29" + ora "5.3.0" + os-name "4.0.0" + parse-json "5.2.0" + semver "7.3.4" + shelljs "0.8.4" + update-notifier "5.1.0" + url-join "4.0.1" + uuid "8.3.2" + yaml "1.10.0" + yargs-parser "20.2.5" + remote-git-tags@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/remote-git-tags/-/remote-git-tags-2.0.0.tgz#1152f39cf8b5268ae0e4307636ef741ec341664c" @@ -12639,6 +13993,11 @@ require-main-filename@^1.0.1: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + require-relative@^0.8.7: version "0.8.7" resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" @@ -12666,11 +14025,21 @@ resize-img@^1.1.0: jpeg-js "^0.1.1" parse-png "^1.1.1" +resolve-alpn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.0.0.tgz#745ad60b3d6aff4b4a48e01b8c0bdc70959e0e8c" + integrity sha512-rTuiIEqFmGxne4IovivKSDzld2lWW9QCjqv80SYjPgf+gS35eaCAjaP54CCwGAwBtnCsvNLYtqxe1Nw+i6JEmA== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-package-path@^1.0.11, resolve-package-path@^1.2.2, resolve-package-path@^1.2.6: version "1.2.7" resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-1.2.7.tgz#2a7bc37ad96865e239330e3102c31322847e652e" @@ -12700,6 +14069,14 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= +resolve@^1.1.6: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.15.0, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.8.1: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" @@ -12707,13 +14084,20 @@ resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.1 dependencies: path-parse "^1.0.6" -responselike@1.0.2: +responselike@1.0.2, responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= dependencies: lowercase-keys "^1.0.0" +responselike@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" + integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw== + dependencies: + lowercase-keys "^2.0.0" + restore-cursor@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" @@ -12743,6 +14127,16 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +retry@0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +retry@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" + integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -12755,7 +14149,7 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" -rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.1, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: +rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.1, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -12895,7 +14289,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -12974,6 +14368,13 @@ select@^1.1.2: resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + "semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -12984,18 +14385,18 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.1.3, semver@^7.3.2, semver@^7.3.4: +semver@7.3.4, semver@^7.1.3, semver@^7.3.2, semver@^7.3.4: version "7.3.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== dependencies: lru-cache "^6.0.0" +semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -13087,6 +14488,15 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shelljs@0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" + integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" @@ -13097,6 +14507,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= +signal-exit@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + silent-error@^1.0.0, silent-error@^1.0.1, silent-error@^1.1.0, silent-error@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/silent-error/-/silent-error-1.1.1.tgz#f72af5b0d73682a2ba1778b7e32cd8aa7c2d8662" @@ -13151,6 +14566,11 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" +smart-buffer@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" + integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== + snake-case@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.3.tgz#c598b822ab443fcbb145ae8a82c5e43526d5bbee" @@ -13248,6 +14668,22 @@ socket.io@^2.1.0: socket.io-client "2.4.0" socket.io-parser "~3.4.0" +socks-proxy-agent@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386" + integrity sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg== + dependencies: + agent-base "~4.2.1" + socks "~2.3.2" + +socks@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.3.tgz#01129f0a5d534d2b897712ed8aceab7ee65d78e3" + integrity sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA== + dependencies: + ip "1.1.5" + smart-buffer "^4.1.0" + sort-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" @@ -13391,6 +14827,11 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== +split-on-first@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" + integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== + split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -13435,6 +14876,14 @@ ssri@^6.0.1: dependencies: figgy-pudding "^3.5.1" +ssri@^7.0.0, ssri@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.0.tgz#92c241bf6de82365b5c7fb4bd76e975522e1294d" + integrity sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g== + dependencies: + figgy-pudding "^3.5.1" + minipass "^3.1.1" + stable@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" @@ -13521,6 +14970,11 @@ strict-uri-encode@^1.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= + string-template@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" @@ -13543,7 +14997,7 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string-width@^3.0.0: +string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== @@ -13552,7 +15006,7 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0: +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== @@ -13615,7 +15069,7 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.1.0: +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -13826,6 +15280,18 @@ tapable@^1.0.0, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== +tar@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.0.tgz#d1724e9bcc04b977b18d5c573b333a2207229a83" + integrity sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + temp@0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" @@ -13916,6 +15382,20 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.6.0.tgz#d7e4ab13fe54e32e08873be40d51b74229b00fc4" integrity sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ== +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + throttleit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" @@ -14027,6 +15507,13 @@ tmp@^0.0.29: dependencies: os-tmpdir "~1.0.1" +tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" @@ -14070,6 +15557,11 @@ to-object-path@^0.3.0: dependencies: kind-of "^3.0.2" +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" @@ -14210,6 +15702,11 @@ type-fest@^0.11.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -14218,6 +15715,13 @@ type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -14323,6 +15827,25 @@ unique-string@^1.0.0: dependencies: crypto-random-string "^1.0.0" +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +universal-user-agent@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" + integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== + universalify@^0.1.0, universalify@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -14373,6 +15896,26 @@ upath@^1.1.1: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== +update-notifier@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" + integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== + dependencies: + boxen "^5.0.0" + chalk "^4.1.0" + configstore "^5.0.1" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.4.0" + is-npm "^5.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.1.0" + pupa "^2.1.1" + semver "^7.3.4" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" + uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" @@ -14385,6 +15928,11 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= +url-join@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" + integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== + url-parse-lax@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" @@ -14486,6 +16034,11 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= +uuid@8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" @@ -14506,6 +16059,14 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" +validate-peer-dependencies@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/validate-peer-dependencies/-/validate-peer-dependencies-1.1.0.tgz#8240a115df121ea35b0bb082255b38b5c591d7e1" + integrity sha512-eHHxI3fNMqu8bzWPRWWgV72kBJkWwRCeEua7yC7UI6dsqC55orhxKAC3uyQfCjjToOyAZ8mpNrbQH+NMoYBn1w== + dependencies: + resolve-package-path "^3.1.0" + semver "^7.3.2" + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -14746,6 +16307,11 @@ which-module@^1.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + which@^1.2.10, which@^1.2.9, which@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -14753,7 +16319,7 @@ which@^1.2.10, which@^1.2.9, which@^1.3.0: dependencies: isexe "^2.0.0" -which@^2.0.1: +which@^2.0.1, which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== @@ -14767,6 +16333,20 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +windows-release@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-4.0.0.tgz#4725ec70217d1bf6e02c7772413b29cdde9ec377" + integrity sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg== + dependencies: + execa "^4.0.2" + word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -14818,6 +16398,24 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-legacy-hbs-plugin-if-needed@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wrap-legacy-hbs-plugin-if-needed/-/wrap-legacy-hbs-plugin-if-needed-1.0.1.tgz#6683eb74747f33e7caea54bb2ed85106ef9006b4" @@ -14842,6 +16440,16 @@ write-file-atomic@^2.0.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + write@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" @@ -14864,6 +16472,11 @@ xdg-basedir@^3.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + xhr@^2.0.1: version "2.5.0" resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.5.0.tgz#bed8d1676d5ca36108667692b74b316c496e49dd" @@ -14932,6 +16545,11 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== +y18n@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" + integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -14955,6 +16573,29 @@ yam@^0.0.24: fs-extra "^4.0.2" lodash.merge "^4.6.0" +yaml@1.10.0, yaml@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + +yargs-parser@20.2.5: + version "20.2.5" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.5.tgz#5d37729146d3f894f39fc94b6796f5b239513186" + integrity sha512-jYRGS3zWy20NtDtK2kBgo/TlAoy5YUuhD9/LZ7z7W4j1Fdw2cqD0xEEclf8fxc8xjD6X5Qr+qQQwCEsP8iRiYg== + +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^20.2.2: + version "20.2.6" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.6.tgz#69f920addf61aafc0b8b89002f5d66e28f2d8b20" + integrity sha512-AP1+fQIWSM/sMiET8fyayjx/J+JmTPt2Mr0FkrgqB4todtfa53sOsrSAcIrJRD5XS20bKUwaDIuMkWKCEiQLKA== + yargs-parser@^4.2.0: version "4.2.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" @@ -14962,6 +16603,35 @@ yargs-parser@^4.2.0: dependencies: camelcase "^3.0.0" +yargs@^13.0.0: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + +yargs@^16.0.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yargs@^6.5.0: version "6.6.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" @@ -14994,6 +16664,11 @@ yeast@0.1.2: resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + yui@^3.18.1: version "3.18.1" resolved "https://registry.yarnpkg.com/yui/-/yui-3.18.1.tgz#e000269ec0a7b6fbc741cbb8fcbd0e65117b014c" From 0d4da38ba8db73398a296774089c2a113eb6044a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 1 Mar 2021 09:02:02 +0000 Subject: [PATCH 766/879] build(deps-dev): bump ember-cli-htmlbars from 5.6.0 to 5.6.2 Bumps [ember-cli-htmlbars](https://github.com/ember-cli/ember-cli-htmlbars) from 5.6.0 to 5.6.2. - [Release notes](https://github.com/ember-cli/ember-cli-htmlbars/releases) - [Changelog](https://github.com/ember-cli/ember-cli-htmlbars/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-cli-htmlbars/compare/v5.6.0...v5.6.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 2f382248b..50322c6b1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6920,9 +6920,9 @@ ember-cli-htmlbars@^4.2.3: walk-sync "^2.0.2" ember-cli-htmlbars@^5.0.0, ember-cli-htmlbars@^5.2.0, ember-cli-htmlbars@^5.3.1: - version "5.6.0" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.6.0.tgz#4e61272ec79296bbc8359b90db4fa6c8978eb17f" - integrity sha512-eSNetEGHyxt4bZ2mfgrJqjdBv7+JOWe6uJxyCo49kEHG3aeQLr+9jFgkyRnSPgmOjph8ouiGzDPTeXbGEdUG0A== + version "5.6.2" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.6.2.tgz#01aebe6df7b8db7fd6e5dd02ba1c82898c087a35" + integrity sha512-8+x82oVqSkWN1RkHtK7QG40D/X94uEJCPmv5QUOJDg4KE+F/zrjA8TEjDKI/phjBUS6JfZ+Hg5RvamU1ZoZbjQ== dependencies: "@ember/edition-utils" "^1.2.0" babel-plugin-htmlbars-inline-precompile "^4.4.1" From c65a23fdaf312374ce93cad3ea4a629fddc99f3a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 5 Mar 2021 06:40:50 +0000 Subject: [PATCH 767/879] build(deps-dev): bump ember-cli-htmlbars from 5.6.2 to 5.6.3 Bumps [ember-cli-htmlbars](https://github.com/ember-cli/ember-cli-htmlbars) from 5.6.2 to 5.6.3. - [Release notes](https://github.com/ember-cli/ember-cli-htmlbars/releases) - [Changelog](https://github.com/ember-cli/ember-cli-htmlbars/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-cli-htmlbars/compare/v5.6.2...v5.6.3) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 1797 ++--------------------------------------------------- 1 file changed, 61 insertions(+), 1736 deletions(-) diff --git a/yarn.lock b/yarn.lock index 50322c6b1..e5e18b9e5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1548,11 +1548,6 @@ "@glimmer/interfaces" "^0.42.2" "@glimmer/util" "^0.42.2" -"@iarna/toml@2.2.5": - version "2.2.5" - resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" - integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== - "@jimp/bmp@^0.5.4": version "0.5.4" resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.5.4.tgz#b7b375aa774f26154912569864d5466e71333ef1" @@ -1831,108 +1826,6 @@ "@nodelib/fs.scandir" "2.1.3" fastq "^1.6.0" -"@octokit/auth-token@^2.4.4": - version "2.4.5" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.5.tgz#568ccfb8cb46f36441fac094ce34f7a875b197f3" - integrity sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA== - dependencies: - "@octokit/types" "^6.0.3" - -"@octokit/core@^3.2.3": - version "3.2.5" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.2.5.tgz#57becbd5fd789b0592b915840855f3a5f233d554" - integrity sha512-+DCtPykGnvXKWWQI0E1XD+CCeWSBhB6kwItXqfFmNBlIlhczuDPbg+P6BtLnVBaRJDAjv+1mrUJuRsFSjktopg== - dependencies: - "@octokit/auth-token" "^2.4.4" - "@octokit/graphql" "^4.5.8" - "@octokit/request" "^5.4.12" - "@octokit/types" "^6.0.3" - before-after-hook "^2.1.0" - universal-user-agent "^6.0.0" - -"@octokit/endpoint@^6.0.1": - version "6.0.11" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.11.tgz#082adc2aebca6dcefa1fb383f5efb3ed081949d1" - integrity sha512-fUIPpx+pZyoLW4GCs3yMnlj2LfoXTWDUVPTC4V3MUEKZm48W+XYpeWSZCv+vYF1ZABUm2CqnDVf1sFtIYrj7KQ== - dependencies: - "@octokit/types" "^6.0.3" - is-plain-object "^5.0.0" - universal-user-agent "^6.0.0" - -"@octokit/graphql@^4.5.8": - version "4.6.0" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.6.0.tgz#f9abca55f82183964a33439d5264674c701c3327" - integrity sha512-CJ6n7izLFXLvPZaWzCQDjU/RP+vHiZmWdOunaCS87v+2jxMsW9FB5ktfIxybRBxZjxuJGRnxk7xJecWTVxFUYQ== - dependencies: - "@octokit/request" "^5.3.0" - "@octokit/types" "^6.0.3" - universal-user-agent "^6.0.0" - -"@octokit/openapi-types@^5.1.0": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-5.1.1.tgz#d01ae6e2879c589edcea7800e3a427455ece619f" - integrity sha512-yMyaX9EDWCiyv7m85/K8L7bLFj1wrLdfDkKcZEZ6gNmepSW5mfSMFJnYwRINN7lF58wvevKPWvw0MYy6sxcFlQ== - -"@octokit/plugin-paginate-rest@^2.6.2": - version "2.10.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.10.0.tgz#5925156d809c94b7bfc47b28e17488415548fa67" - integrity sha512-71OsKBSMcQEu/6lfVbhv5C5ikU1rn10rKot/WiV7do7fyfElQ2eCUQFogHPbj0ci5lnKAjvahOiMAr6lcvL8Qw== - dependencies: - "@octokit/types" "^6.10.0" - -"@octokit/plugin-request-log@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.3.tgz#70a62be213e1edc04bb8897ee48c311482f9700d" - integrity sha512-4RFU4li238jMJAzLgAwkBAw+4Loile5haQMQr+uhFq27BmyJXcXSKvoQKqh0agsZEiUlW6iSv3FAgvmGkur7OQ== - -"@octokit/plugin-rest-endpoint-methods@4.12.0": - version "4.12.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.12.0.tgz#1cec405cd4eaf0bdb58cb7d2a9b3d8473b3a70e8" - integrity sha512-RgnQ1aoetdOJjZYC37LV5FNlL7GY/v1CdC5dur1Zp/UiADJlbRFbAz/xLx26ovXw67dK7EUtwCghS+6QyiI9RA== - dependencies: - "@octokit/types" "^6.10.0" - deprecation "^2.3.1" - -"@octokit/request-error@^2.0.0": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.5.tgz#72cc91edc870281ad583a42619256b380c600143" - integrity sha512-T/2wcCFyM7SkXzNoyVNWjyVlUwBvW3igM3Btr/eKYiPmucXTtkxt2RBsf6gn3LTzaLSLTQtNmvg+dGsOxQrjZg== - dependencies: - "@octokit/types" "^6.0.3" - deprecation "^2.0.0" - once "^1.4.0" - -"@octokit/request@^5.3.0", "@octokit/request@^5.4.12": - version "5.4.14" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.14.tgz#ec5f96f78333bb2af390afa5ff66f114b063bc96" - integrity sha512-VkmtacOIQp9daSnBmDI92xNIeLuSRDOIuplp/CJomkvzt7M18NXgG044Cx/LFKLgjKt9T2tZR6AtJayba9GTSA== - dependencies: - "@octokit/endpoint" "^6.0.1" - "@octokit/request-error" "^2.0.0" - "@octokit/types" "^6.7.1" - deprecation "^2.0.0" - is-plain-object "^5.0.0" - node-fetch "^2.6.1" - once "^1.4.0" - universal-user-agent "^6.0.0" - -"@octokit/rest@18.2.0": - version "18.2.0" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.2.0.tgz#b75c87870bb1f7bc9f37ae0e9acb3a411a34a25f" - integrity sha512-xsp6bIqL2sb/NmgLXTxw96caegobRw+YHnzdIi70ruquHtPPDW2cBAONhDYMUuAOeXx0JH2auOeplpk4SQJy1w== - dependencies: - "@octokit/core" "^3.2.3" - "@octokit/plugin-paginate-rest" "^2.6.2" - "@octokit/plugin-request-log" "^1.0.2" - "@octokit/plugin-rest-endpoint-methods" "4.12.0" - -"@octokit/types@^6.0.3", "@octokit/types@^6.10.0", "@octokit/types@^6.7.1": - version "6.10.1" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.10.1.tgz#5955dc0cf344bb82a46283a0c332651f5dd9f1ad" - integrity sha512-hgNC5jxKG8/RlqxU/6GThkGrvFpz25+cPzjQjyiXTNBvhyltn2Z4GhFY25+kbtXwZ4Co4zM0goW5jak1KLp1ug== - dependencies: - "@octokit/openapi-types" "^5.1.0" - "@simple-dom/document@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@simple-dom/document/-/document-1.4.0.tgz#af60855f957f284d436983798ef1006cca1a1678" @@ -1964,35 +1857,11 @@ resolved "https://registry.yarnpkg.com/@simple-dom/void-map/-/void-map-1.4.0.tgz#f15f07568fe1076740407266aa5e6eac249bc78c" integrity sha512-VDhLEyVCbuhOBBgHol9ShzIv9O8UCzdXeH4FoXu2DOcu/nnvTjLTck+BgXsCLv5ynDiUdoqsREEVFnoyPpFKVw== -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - "@sindresorhus/is@^0.7.0": version "0.7.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== -"@sindresorhus/is@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.0.0.tgz#2ff674e9611b45b528896d820d3d7a812de2f0e4" - integrity sha512-FyD2meJpDPjyNQejSjvnhpgI/azsQkA4lGbuu5BQZfjvJ9cbRZXzeWL2HceCekW4lixO9JPesIIQkSoLjeJHNQ== - -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - -"@szmarczak/http-timer@^4.0.5": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.5.tgz#bfbd50211e9dfa51ba07da58a14cdfd333205152" - integrity sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ== - dependencies: - defer-to-connect "^2.0.0" - "@types/acorn@^4.0.3": version "4.0.5" resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.5.tgz#e29fdf884695e77be4e99e67d748f5147255752d" @@ -2005,16 +1874,6 @@ resolved "https://registry.yarnpkg.com/@types/broccoli-plugin/-/broccoli-plugin-1.3.0.tgz#38f8462fecaebc4e09a32e4d4ed1b9808f75bbca" integrity sha512-SLk4/hFc2kGvgwNFrpn2O1juxFOllcHAywvlo7VwxfExLzoz1GGJ0oIZCwj5fwSpvHw4AWpZjJ1fUvb62PDayQ== -"@types/cacheable-request@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.1.tgz#5d22f3dded1fd3a84c0bbeb5039a7419c2c91976" - integrity sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ== - dependencies: - "@types/http-cache-semantics" "*" - "@types/keyv" "*" - "@types/node" "*" - "@types/responselike" "*" - "@types/color-name@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" @@ -2199,11 +2058,6 @@ resolved "https://registry.yarnpkg.com/@types/htmlbars-inline-precompile/-/htmlbars-inline-precompile-1.0.1.tgz#de564513fabb165746aecd76369c87bd85e5bbb4" integrity sha512-sVD2e6QAAHW0Y6Btse+tTA9k9g0iKm87wjxRsgZRU5EwSooz80tenbV+fA+f2BI2g0G2CqxsS1rIlwQCtPRQow== -"@types/http-cache-semantics@*": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz#9140779736aa2655635ee756e2467d787cfe8a2a" - integrity sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A== - "@types/jquery@*": version "3.3.34" resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.3.34.tgz#0d3b94057063d3854adaeb579652048fec07ba6c" @@ -2211,20 +2065,6 @@ dependencies: "@types/sizzle" "*" -"@types/keyv@*": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.1.tgz#e45a45324fca9dab716ab1230ee249c9fb52cfa7" - integrity sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw== - dependencies: - "@types/node" "*" - -"@types/mdast@^3.0.0": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb" - integrity sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw== - dependencies: - "@types/unist" "*" - "@types/minimatch@*", "@types/minimatch@^3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -2240,23 +2080,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.55.tgz#7cc1358c9c18e71f6c020e410962971863232cf5" integrity sha512-e/5tg8Ok0gSrN6pvHphnwTK0/CD9VPZrtZqpvvpEFAtfs+ZntusgGaWkf2lSEq1OFe2EDPeUMiMVpy4nZpJ4AQ== -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - "@types/q@^1.5.1": version "1.5.2" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== -"@types/responselike@*", "@types/responselike@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" - integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== - dependencies: - "@types/node" "*" - "@types/rimraf@^2.0.2": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.4.tgz#403887b0b53c6100a6c35d2ab24f6ccc042fec46" @@ -2280,11 +2108,6 @@ resolved "https://registry.yarnpkg.com/@types/symlink-or-copy/-/symlink-or-copy-1.2.0.tgz#4151a81b4052c80bc2becbae09f3a9ec010a9c7a" integrity sha512-Lja2xYuuf2B3knEsga8ShbOdsfNOtzT73GyJmZyY7eGl2+ajOqrs8yM5ze0fsSoYwvA6bw7/Qr7OZ7PEEmYwWg== -"@types/unist@*", "@types/unist@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" - integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== - "@webassemblyjs/ast@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" @@ -2539,35 +2362,6 @@ after@0.8.2: resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= -agent-base@5: - version "5.1.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c" - integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g== - -agent-base@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" - integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== - dependencies: - es6-promisify "^5.0.0" - -agentkeepalive@^4.1.0: - version "4.1.4" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.1.4.tgz#d928028a4862cb11718e55227872e842a44c945b" - integrity sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ== - dependencies: - debug "^4.1.0" - depd "^1.1.2" - humanize-ms "^1.2.1" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" @@ -2608,13 +2402,6 @@ amdefine@>=0.0.4: resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= -ansi-align@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" - integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== - dependencies: - string-width "^3.0.0" - ansi-escapes@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" @@ -2669,13 +2456,6 @@ ansi-styles@^3.0.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - ansi-styles@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" @@ -2701,7 +2481,7 @@ any-base@^1.1.0: resolved "https://registry.yarnpkg.com/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe" integrity sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg== -any-promise@^1.0.0, any-promise@^1.1.0: +any-promise@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= @@ -2909,13 +2689,6 @@ async-promise-queue@^1.0.3, async-promise-queue@^1.0.5: async "^2.4.1" debug "^2.6.8" -async-retry@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.1.tgz#139f31f8ddce50c0870b0ba558a6079684aaed55" - integrity sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA== - dependencies: - retry "0.12.0" - async@^2.4.1, async@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" @@ -3686,11 +3459,6 @@ base64-js@^1.0.2: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - base64id@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" @@ -3723,11 +3491,6 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -before-after-hook@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.1.tgz#99ae36992b5cfab4a83f6bee74ab27835f28f405" - integrity sha512-5ekuQOvO04MDj7kYZJaMab2S8SPjGJbotVNyv7QYFCOAwrGZs/YnoDNlh1U+m5hl7H2D/+n0taaAV/tfyd3KMA== - big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" @@ -3765,15 +3528,6 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - blank-object@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/blank-object/-/blank-object-1.0.2.tgz#f990793fbe9a8c8dd013fb3219420bec81d5f4b9" @@ -3871,20 +3625,6 @@ bower-endpoint-parser@0.2.2: resolved "https://registry.yarnpkg.com/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz#00b565adbfab6f2d35addde977e97962acbcb3f6" integrity sha1-ALVlrb+rby01rd3pd+l5Yqy8s/Y= -boxen@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.0.0.tgz#64fe9b16066af815f51057adcc800c3730120854" - integrity sha512-5bvsqw+hhgUi3oYGK0Vf4WpIkyemp60WBInn7+WNfoISzAqk/HX4L7WNROq38E6UR/y3YADpv6pEm4BfkeEAdA== - dependencies: - ansi-align "^3.0.0" - camelcase "^6.2.0" - chalk "^4.1.0" - cli-boxes "^2.2.1" - string-width "^4.2.0" - type-fest "^0.20.2" - widest-line "^3.1.0" - wrap-ansi "^7.0.0" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -4836,14 +4576,6 @@ buffer@^5.2.0: base64-js "^1.0.2" ieee754 "^1.1.4" -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -4889,31 +4621,6 @@ cacache@^11.0.2: unique-filename "^1.1.1" y18n "^4.0.0" -cacache@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-14.0.0.tgz#97c10fc87c4c7ee41d45e32631c26761c2687caa" - integrity sha512-+Nr/BnA/tjAUXza9gH8F+FSP+1HvWqCKt4c95dQr4EDVJVafbzmPZpLKCkLYexs6vSd2B/1TOXrAoNnqVPfvRA== - dependencies: - chownr "^1.1.2" - figgy-pudding "^3.5.1" - fs-minipass "^2.0.0" - glob "^7.1.4" - graceful-fs "^4.2.2" - infer-owner "^1.0.4" - lru-cache "^5.1.1" - minipass "^3.0.0" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^1.0.3" - move-concurrently "^1.0.1" - p-map "^3.0.0" - promise-inflight "^1.0.1" - rimraf "^2.7.1" - ssri "^7.0.0" - tar "^6.0.0" - unique-filename "^1.1.1" - cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -4929,11 +4636,6 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -cacheable-lookup@^5.0.3: - version "5.0.4" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" - integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== - cacheable-request@^2.1.1: version "2.1.4" resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" @@ -4947,32 +4649,6 @@ cacheable-request@^2.1.1: normalize-url "2.0.1" responselike "1.0.2" -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" - -cacheable-request@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.1.tgz#062031c2856232782ed694a257fa35da93942a58" - integrity sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^4.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^2.0.0" - calculate-cache-key-for-tree@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-1.2.3.tgz#5a5e4fcfa2d374a63e47fe967593f179e8282825" @@ -5015,16 +4691,6 @@ camelcase@^3.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" - integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== - can-symlink@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/can-symlink/-/can-symlink-1.0.0.tgz#97b607d8a84bb6c6e228b902d864ecb594b9d219" @@ -5082,14 +4748,6 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@4.1.0, chalk@^4.0.0, chalk@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chalk@^1.0.0, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -5118,20 +4776,13 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" chardet@^0.7.0: version "0.7.0" @@ -5241,16 +4892,11 @@ chokidar@^3.4.1: optionalDependencies: fsevents "~2.1.2" -chownr@^1.1.1, chownr@^1.1.2: +chownr@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - chrome-trace-event@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" @@ -5263,16 +4909,6 @@ ci-info@^1.1.3: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -ci-info@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.1.1.tgz#9a32fcefdf7bcdb6f0a7e1c0f8098ec57897b80a" - integrity sha512-kdRWLBIJwdsYJWYJFtAFFYxybguqeF91qpZaggjG5Nf8QKdizFG2hjqvaTXbxFIcYbSaD74KpAXv6BSm17DHEQ== - cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -5313,21 +4949,11 @@ clean-css@^3.4.5: commander "2.8.x" source-map "0.4.x" -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - clean-up-path@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clean-up-path/-/clean-up-path-1.0.0.tgz#de9e8196519912e749c9eaf67c13d64fac72a3e5" integrity sha512-PHGlEF0Z6976qQyN6gM7kKH6EH0RdfZcc8V+QhFe36eRxV0SMH5OUBZG7Bxa9YcreNzyNbK63cGiZxdSZgosRw== -cli-boxes@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" - integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== - cli-cursor@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" @@ -5349,28 +4975,11 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-highlight@^2.1.4: - version "2.1.10" - resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.10.tgz#26a087da9209dce4fcb8cf5427dc97cd96ac173a" - integrity sha512-CcPFD3JwdQ2oSzy+AMG6j3LRTkNjM82kzcSKzoVw6cLanDCJNlsLjeqVTOTfOfucnWv5F0rmBemVf1m9JiIasw== - dependencies: - chalk "^4.0.0" - highlight.js "^10.0.0" - mz "^2.4.0" - parse5 "^5.1.1" - parse5-htmlparser2-tree-adapter "^6.0.0" - yargs "^16.0.0" - cli-spinners@^1.1.0: version "1.3.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== -cli-spinners@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.5.0.tgz#12763e47251bf951cb75c201dfa58ff1bcb2d047" - integrity sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ== - cli-table3@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" @@ -5416,30 +5025,12 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - clone-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= -clone-response@1.0.2, clone-response@^1.0.2: +clone-response@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= @@ -5552,7 +5143,7 @@ colors@^1.1.2, colors@^1.3.2: resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -5665,18 +5256,6 @@ configstore@^4.0.0: write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" -configstore@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" - integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== - dependencies: - dot-prop "^5.2.0" - graceful-fs "^4.1.2" - make-dir "^3.0.0" - unique-string "^2.0.0" - write-file-atomic "^3.0.0" - xdg-basedir "^4.0.0" - console-browserify@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" @@ -5816,17 +5395,6 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cosmiconfig@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" - integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" @@ -5894,15 +5462,6 @@ cross-spawn@^7.0.0: shebang-command "^2.0.0" which "^2.0.1" -cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - cryptiles@0.2.x: version "0.2.2" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-0.2.2.tgz#ed91ff1f17ad13d3748288594f8a48a0d26f325c" @@ -5932,11 +5491,6 @@ crypto-random-string@^1.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== - css-select-base-adapter@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" @@ -6081,13 +5635,6 @@ debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.3. dependencies: ms "2.0.0" -debug@4, debug@4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== - dependencies: - ms "2.1.2" - debug@^3.0.1, debug@^3.1.0, debug@^3.1.1: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -6109,7 +5656,7 @@ debug@~3.1.0: dependencies: ms "2.0.0" -decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: +decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -6131,13 +5678,6 @@ decompress-response@^3.3.0: dependencies: mimic-response "^1.0.0" -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -6155,16 +5695,6 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - -defer-to-connect@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" - integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== - define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -6219,7 +5749,7 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -depd@^1.1.2, depd@~1.1.2: +depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= @@ -6229,19 +5759,6 @@ depd@~2.0.0: resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -deprecated-obj@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/deprecated-obj/-/deprecated-obj-2.0.0.tgz#e6ba93a3989f6ed18d685e7d99fb8d469b4beffc" - integrity sha512-CkdywZC2rJ8RGh+y3MM1fw1EJ4oO/oNExGbRFv0AQoMS+faTd3nO7slYjkj/6t8OnIMUE+wxh6G97YHhK1ytrw== - dependencies: - flat "^5.0.2" - lodash "^4.17.20" - -deprecation@^2.0.0, deprecation@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" - integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== - des.js@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" @@ -6397,13 +5914,6 @@ dot-prop@^4.1.0: dependencies: is-obj "^1.0.0" -dot-prop@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== - dependencies: - is-obj "^2.0.0" - dotenv@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-1.2.0.tgz#7cd73e16e07f057c8072147a5bc3a8677f0ab5c6" @@ -6920,9 +6430,9 @@ ember-cli-htmlbars@^4.2.3: walk-sync "^2.0.2" ember-cli-htmlbars@^5.0.0, ember-cli-htmlbars@^5.2.0, ember-cli-htmlbars@^5.3.1: - version "5.6.2" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.6.2.tgz#01aebe6df7b8db7fd6e5dd02ba1c82898c087a35" - integrity sha512-8+x82oVqSkWN1RkHtK7QG40D/X94uEJCPmv5QUOJDg4KE+F/zrjA8TEjDKI/phjBUS6JfZ+Hg5RvamU1ZoZbjQ== + version "5.6.3" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.6.3.tgz#4916d1ea2b6d69ea5e7252c0c59e56d7031ee310" + integrity sha512-pn2pW49KmsrjlG4PEMmd3ZrsbS2WHKn+1NLLCWUjxmc5g4/lHxHicB8IN5z95ANmgqDHAwp+rw1XTyWy9r0xyQ== dependencies: "@ember/edition-utils" "^1.2.0" babel-plugin-htmlbars-inline-precompile "^4.4.1" @@ -6939,9 +6449,6 @@ ember-cli-htmlbars@^5.0.0, ember-cli-htmlbars@^5.2.0, ember-cli-htmlbars@^5.3.1: silent-error "^1.1.1" strip-bom "^4.0.0" walk-sync "^2.2.0" - optionalDependencies: - release-it "^14.2.1" - release-it-lerna-changelog "^3.1.0" ember-cli-import-polyfill@^0.2.0: version "0.2.0" @@ -7728,13 +7235,6 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -encoding@^0.1.12: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -7811,11 +7311,6 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== -err-code@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" - integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA= - errlop@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/errlop/-/errlop-2.2.0.tgz#1ff383f8f917ae328bebb802d6ca69666a42d21b" @@ -7828,7 +7323,7 @@ errno@^0.1.3, errno@~0.1.7: dependencies: prr "~1.0.1" -error-ex@^1.2.0, error-ex@^1.3.1: +error-ex@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== @@ -7883,23 +7378,6 @@ es6-promise@^4.0.3: resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= - dependencies: - es6-promise "^4.0.3" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-goat@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" - integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== - escape-html@1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -8154,21 +7632,6 @@ exec-sh@^0.2.0: dependencies: merge "^1.2.0" -execa@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.0.0.tgz#4029b0007998a841fbd1032e5f4de86a3c1e3376" - integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - execa@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" @@ -8224,7 +7687,7 @@ execa@^3.0.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" -execa@^4.0.2, execa@^4.0.3: +execa@^4.0.3: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== @@ -8407,18 +7870,6 @@ fast-glob@^3.0.3: micromatch "^4.0.2" picomatch "^2.2.1" -fast-glob@^3.1.1: - version "3.2.5" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" - integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.0" - merge2 "^1.3.0" - micromatch "^4.0.2" - picomatch "^2.2.1" - fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -8631,11 +8082,6 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -filter-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" - integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs= - finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -8671,14 +8117,6 @@ find-index@^1.1.0: resolved "https://registry.yarnpkg.com/find-index/-/find-index-1.1.1.tgz#4b221f8d46b7f8bea33d8faed953f3ca7a081cbc" integrity sha512-XYKutXMrIK99YMUPf91KX5QVJoG31/OsgftD6YoTPAObfQIxM4ziA9f0J1AsqKhJmo+IeaIPP0CFopTD4bdUBw== -find-up@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -8748,11 +8186,6 @@ flat-cache@^2.0.1: rimraf "2.6.3" write "1.0.3" -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - flatted@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" @@ -8786,15 +8219,6 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - form-data@~0.1.0: version "0.1.4" resolved "https://registry.yarnpkg.com/form-data/-/form-data-0.1.4.tgz#91abd788aba9702b1aabfa8bc01031a2ac9e3b12" @@ -8936,13 +8360,6 @@ fs-merger@^3.1.0: rimraf "^2.6.3" walk-sync "^2.0.2" -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6, fs-tree-diff@^0.5.7, fs-tree-diff@^0.5.9: version "0.5.9" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.9.tgz#a4ec6182c2f5bd80b9b83c8e23e4522e6f5fd946" @@ -9037,11 +8454,6 @@ get-caller-file@^1.0.0, get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== -get-caller-file@^2.0.1, get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" @@ -9060,7 +8472,7 @@ get-stream@^2.0.0: object-assign "^4.0.1" pinkie-promise "^2.0.0" -get-stream@^4.0.0, get-stream@^4.1.0: +get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== @@ -9074,18 +8486,6 @@ get-stream@^5.0.0: dependencies: pump "^3.0.0" -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-stream@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.0.tgz#3e0012cb6827319da2706e601a1583e8629a6718" - integrity sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg== - get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -9150,21 +8550,6 @@ git-transport-protocol@^0.1.0: git-write-pkt-line "0.1.0" through "~2.2.7" -git-up@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/git-up/-/git-up-4.0.2.tgz#10c3d731051b366dc19d3df454bfca3f77913a7c" - integrity sha512-kbuvus1dWQB2sSW4cbfTeGpCMd8ge9jx9RKnhXhuJ7tnvT+NIrTVfYZxjtflZddQYcmdOTlkAcjmx7bor+15AQ== - dependencies: - is-ssh "^1.3.0" - parse-url "^5.0.0" - -git-url-parse@11.4.4: - version "11.4.4" - resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.4.4.tgz#5d747debc2469c17bc385719f7d0427802d83d77" - integrity sha512-Y4o9o7vQngQDIU9IjyCmRJBin5iYjI5u9ZITnddRZpD7dcCFQj2sL2XuMNbLRE4b4B/4ENPsp2Q8P44fjAZ0Pw== - dependencies: - git-up "^4.0.0" - git-write-pkt-line@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/git-write-pkt-line/-/git-write-pkt-line-0.1.0.tgz#a84c1856c09011908389b2f06f911d91f6394694" @@ -9211,13 +8596,6 @@ glob@^7.0.0, glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, gl once "^1.3.0" path-is-absolute "^1.0.0" -global-dirs@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" - integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== - dependencies: - ini "2.0.0" - global@~4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" @@ -9255,18 +8633,6 @@ globby@10.0.1: merge2 "^1.2.3" slash "^3.0.0" -globby@11.0.2: - version "11.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.2.tgz#1af538b766a3b540ebfb58a32b2e2d5897321d83" - integrity sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" - globrex@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" @@ -9279,23 +8645,6 @@ good-listener@^1.2.2: dependencies: delegate "^3.1.2" -got@11.8.1: - version "11.8.1" - resolved "https://registry.yarnpkg.com/got/-/got-11.8.1.tgz#df04adfaf2e782babb3daabc79139feec2f7e85d" - integrity sha512-9aYdZL+6nHmvJwHALLwKSUZ0hMwGaJGYv3hoPLPgnT8BoBXm1SjnZeky+91tfwJaDzun2s4RsBRy48IEYv2q2Q== - dependencies: - "@sindresorhus/is" "^4.0.0" - "@szmarczak/http-timer" "^4.0.5" - "@types/cacheable-request" "^6.0.1" - "@types/responselike" "^1.0.0" - cacheable-lookup "^5.0.3" - cacheable-request "^7.0.1" - decompress-response "^6.0.0" - http2-wrapper "^1.0.0-beta.5.2" - lowercase-keys "^2.0.0" - p-cancelable "^2.0.0" - responselike "^2.0.0" - got@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" @@ -9336,33 +8685,11 @@ got@^8.0.1: url-parse-lax "^3.0.0" url-to-options "^1.0.1" -got@^9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== -graceful-fs@^4.2.2: - version "4.2.6" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== - "graceful-readlink@>= 1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" @@ -9487,11 +8814,6 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has-yarn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" - integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== - has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -9580,11 +8902,6 @@ heimdalljs@^0.3.0: dependencies: rsvp "~3.2.1" -highlight.js@^10.0.0: - version "10.6.0" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.6.0.tgz#0073aa71d566906965ba6e1b7be7b2682f5e18b6" - integrity sha512-8mlRcn5vk/r4+QcqerapwBYTe+iPL5ih6xrNylxrnBdHQiijDETfXX7VIxC3UiCRiINBJfANBAsPzAvRQj8RpQ== - highlight.js@^9.15.10: version "9.18.5" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.5.tgz#d18a359867f378c138d6819edfc2a8acd5f29825" @@ -9674,11 +8991,6 @@ http-cache-semantics@3.8.1: resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== -http-cache-semantics@^4.0.0, http-cache-semantics@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== - http-errors@1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" @@ -9706,14 +9018,6 @@ http-errors@~1.7.2: resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= -http-proxy-agent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-3.0.0.tgz#598f42dc815949a11e2c6dbfdf24cd8a4c165327" - integrity sha512-uGuJaBWQWDQCJI5ip0d/VTYZW0nRrlLWXA4A7P1jrsa+f77rW2yXz315oBt6zGCF6l8C2tlMxY7ffULCj+5FhA== - dependencies: - agent-base "5" - debug "4" - http-proxy@^1.13.1, http-proxy@^1.17.0: version "1.18.1" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" @@ -9741,44 +9045,16 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -http2-wrapper@^1.0.0-beta.5.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" - integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.0.0" - https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -https-proxy-agent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz#702b71fb5520a132a66de1f67541d9e62154d82b" - integrity sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg== - dependencies: - agent-base "5" - debug "4" - human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= - dependencies: - ms "^2.0.0" - ice-cap@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/ice-cap/-/ice-cap-0.0.4.tgz#8a6d31ab4cac8d4b56de4fa946df3352561b6e18" @@ -9794,18 +9070,6 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" - integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - ieee754@^1.1.4: version "1.1.13" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" @@ -9826,11 +9090,6 @@ ignore@^5.1.1: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== -ignore@^5.1.4: - version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" - integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== - image-size@^0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" @@ -9841,13 +9100,6 @@ image-size@^0.6.3: resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2" integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== -import-cwd@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-3.0.0.tgz#20845547718015126ea9b3676b7592fb8bd4cf92" - integrity sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg== - dependencies: - import-from "^3.0.0" - import-fresh@^3.0.0: version "3.2.1" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" @@ -9856,26 +9108,6 @@ import-fresh@^3.0.0: parent-module "^1.0.0" resolve-from "^4.0.0" -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966" - integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== - dependencies: - resolve-from "^5.0.0" - -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= - imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -9893,11 +9125,6 @@ indent-string@^2.1.0: dependencies: repeating "^2.0.0" -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" @@ -9908,11 +9135,6 @@ indexof@0.0.1: resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= -infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - inflected@^2.0.3, inflected@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inflected/-/inflected-2.0.4.tgz#323770961ccbe992a98ea930512e9a82d3d3ef77" @@ -9931,7 +9153,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -9946,11 +9168,6 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - ini@^1.3.5, ini@~1.3.0: version "1.3.7" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" @@ -9967,25 +9184,6 @@ inline-source-map-comment@^1.0.5: sum-up "^1.0.1" xtend "^4.0.0" -inquirer@7.3.3, inquirer@^7.3.3: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - inquirer@^2: version "2.0.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-2.0.0.tgz#e1351687b90d150ca403ceaa3cefb1e3065bef4b" @@ -10025,10 +9223,24 @@ inquirer@^6.2.2: strip-ansi "^5.1.0" through "^2.3.6" -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== +inquirer@^7.3.3: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" into-stream@^3.1.0: version "3.1.0" @@ -10060,11 +9272,6 @@ ip-regex@^2.1.0: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= -ip@1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= - ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -10084,19 +9291,6 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -10131,27 +9325,6 @@ is-callable@^1.1.4, is-callable@^1.1.5: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== -is-ci@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.0.tgz#c7e7be3c9d8eef7d0fa144390bd1e4b88dc4c994" - integrity sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ== - dependencies: - ci-info "^3.1.1" - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-core-module@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== - dependencies: - has "^1.0.3" - is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -10171,11 +9344,6 @@ is-date-object@^1.0.1: resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" @@ -10257,34 +9425,6 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - -is-installed-globally@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" - integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== - dependencies: - global-dirs "^3.0.0" - is-path-inside "^3.0.2" - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-lambda@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" - integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= - -is-npm@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" - integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== - is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -10302,21 +9442,11 @@ is-obj@^1.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - is-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= -is-path-inside@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" - integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== - is-plain-obj@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" @@ -10334,11 +9464,6 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-plain-object@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" - integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== - is-potential-custom-element-name@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" @@ -10373,13 +9498,6 @@ is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== -is-ssh@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.2.tgz#a4b82ab63d73976fd8263cceee27f99a88bdae2b" - integrity sha512-elEw0/0c2UscLrNG+OAorbP539E3rhliKPg+hDMWN9VwrDXfYK+4PBEykDPfxlYYtQvl84TascnQyobfQLHEhQ== - dependencies: - protocols "^1.1.0" - is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -10404,7 +9522,7 @@ is-type@0.0.1: dependencies: core-util-is "~1.0.0" -is-typedarray@^1.0.0, is-typedarray@~1.0.0: +is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= @@ -10424,11 +9542,6 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= -is-yarn-global@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" - integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== - isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -10704,21 +9817,11 @@ json-buffer@3.0.0: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -10820,20 +9923,6 @@ keyv@3.0.0: dependencies: json-buffer "3.0.0" -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" - -keyv@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.3.tgz#4f3aa98de254803cafcd2896734108daa35e4254" - integrity sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA== - dependencies: - json-buffer "3.0.1" - kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -10865,13 +9954,6 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" -latest-version@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" - integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== - dependencies: - package-json "^6.3.0" - lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -10888,20 +9970,6 @@ leek@0.0.24: lodash.assign "^3.2.0" rsvp "^3.0.21" -lerna-changelog@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lerna-changelog/-/lerna-changelog-1.0.1.tgz#53090ab7f047730ec88d32087762164626269d3a" - integrity sha512-E7ewsfQknBmQcUspCqd5b8Hbbp5SX768y6vEiIdXXui9pPhZS1WlrKtiAUPs0CeGd8Pv4gtIC/h3wSWIZuvqaA== - dependencies: - chalk "^2.4.1" - cli-highlight "^2.1.4" - execa "^1.0.0" - make-fetch-happen "^7.1.1" - normalize-git-url "^3.0.2" - p-map "^3.0.0" - progress "^2.0.0" - yargs "^13.0.0" - levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -10917,11 +9985,6 @@ line-stream@0.0.0: dependencies: through "~2.2.0" -lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= - linkify-it@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" @@ -11020,13 +10083,6 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - lodash-es@^4.17.11: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" @@ -11345,16 +10401,11 @@ lodash.values@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c= -lodash@4.17.20, lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1: +lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== -lodash@^4.17.20: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" @@ -11362,13 +10413,6 @@ log-symbols@^2.2.0: dependencies: chalk "^2.0.1" -log-symbols@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" - integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== - dependencies: - chalk "^4.0.0" - loose-envify@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -11396,16 +10440,11 @@ lowercase-keys@1.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY= -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: +lowercase-keys@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -11433,11 +10472,6 @@ lunr@^2.3.7: resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.8.tgz#a8b89c31f30b5a044b97d2d28e2da191b6ba2072" integrity sha512-oxMeX/Y35PNFuZoHp+jUj5OSEmLCaIH4KTFJh7a93cHBoFmpw2IoPs22VIz7vyO2YUnx2Tn9dzIwO2P/4quIRg== -macos-release@^2.2.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.4.1.tgz#64033d0ec6a5e6375155a74b1a1eba8e509820ac" - integrity sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg== - magic-string@^0.24.0: version "0.24.1" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.24.1.tgz#7e38e5f126cae9f15e71f0cf8e450818ca7d5a8f" @@ -11460,34 +10494,6 @@ make-dir@^2.0.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-fetch-happen@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-7.1.1.tgz#89ac8112eaa9d4361541deb591329e9238a531b1" - integrity sha512-7fNjiOXNZhNGQzG5P15nU97aZQtzPU2GVgVd7pnqnl5gnpLzMAD8bAe5YG4iW2s0PTqaZy9xGv4Wfqe872kRNQ== - dependencies: - agentkeepalive "^4.1.0" - cacache "^14.0.0" - http-cache-semantics "^4.0.3" - http-proxy-agent "^3.0.0" - https-proxy-agent "^4.0.0" - is-lambda "^1.0.1" - lru-cache "^5.1.1" - minipass "^3.0.0" - minipass-collect "^1.0.2" - minipass-fetch "^1.1.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - promise-retry "^1.1.1" - socks-proxy-agent "^4.0.0" - ssri "^7.0.1" - makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" @@ -11596,22 +10602,6 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" -mdast-util-from-markdown@^0.8.1: - version "0.8.5" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" - integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-string "^2.0.0" - micromark "~2.11.0" - parse-entities "^2.0.0" - unist-util-stringify-position "^2.0.0" - -mdast-util-to-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" - integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== - mdn-data@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" @@ -11721,14 +10711,6 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromark@~2.11.0: - version "2.11.4" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" - integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== - dependencies: - debug "^4.0.0" - parse-entities "^2.0.0" - micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -11774,18 +10756,6 @@ mime-db@1.45.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== -mime-db@1.46.0: - version "1.46.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" - integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== - -mime-types@2.1.29: - version "2.1.29" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2" - integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ== - dependencies: - mime-db "1.46.0" - mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.19: version "2.1.26" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" @@ -11825,16 +10795,11 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-response@^1.0.0, mimic-response@^1.0.1: +mimic-response@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - min-document@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" @@ -11879,45 +10844,6 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-fetch@^1.1.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.3.3.tgz#34c7cea038c817a8658461bf35174551dce17a0a" - integrity sha512-akCrLDWfbdAWkMLBxJEeWTdNsjML+dt5YgOI4gJ53vuO0vrmYQkUPxa6j6V65s9CcePIr2SSWqjT2EcrNseryQ== - dependencies: - minipass "^3.1.0" - minipass-sized "^1.0.3" - minizlib "^2.0.0" - optionalDependencies: - encoding "^0.1.12" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-pipeline@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" - -minipass-sized@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" - integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== - dependencies: - minipass "^3.0.0" - minipass@^2.2.0: version "2.9.0" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" @@ -11926,21 +10852,6 @@ minipass@^2.2.0: safe-buffer "^5.1.2" yallist "^3.0.0" -minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" - integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== - dependencies: - yallist "^4.0.0" - -minizlib@^2.0.0, minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - miragejs@^0.1.31: version "0.1.41" resolved "https://registry.yarnpkg.com/miragejs/-/miragejs-0.1.41.tgz#1b06a2d2d9de65624f5bb1cee7ebb4a208f554d0" @@ -12076,12 +10987,7 @@ ms@2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.0.0, ms@^2.1.1: +ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -12106,15 +11012,6 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -mz@^2.4.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - najax@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/najax/-/najax-1.0.4.tgz#63fd8dbf15d18f24dc895b3a16fec66c136b8084" @@ -12186,7 +11083,7 @@ node-emoji@^1.8.1: dependencies: lodash.toarray "^4.4.0" -node-fetch@^2.6.0, node-fetch@^2.6.1: +node-fetch@^2.6.0: version "2.6.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== @@ -12270,11 +11167,6 @@ nopt@^3.0.6: dependencies: abbrev "1" -normalize-git-url@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/normalize-git-url/-/normalize-git-url-3.0.2.tgz#8e5f14be0bdaedb73e07200310aa416c27350fc4" - integrity sha1-jl8Uvgva7bc+ByADEKpBbCc1D8Q= - normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -12311,16 +11203,6 @@ normalize-url@2.0.1: query-string "^5.0.1" sort-keys "^2.0.0" -normalize-url@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" - integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== - -normalize-url@^4.1.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" - integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== - normalize.css@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-8.0.1.tgz#9b98a208738b9cc2634caacbc42d131c97487bf3" @@ -12348,7 +11230,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npm-run-path@^4.0.0, npm-run-path@^4.0.1: +npm-run-path@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== @@ -12521,13 +11403,6 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" @@ -12548,20 +11423,6 @@ optionator@^0.8.1, optionator@^0.8.2: type-check "~0.3.2" word-wrap "~1.2.3" -ora@5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.3.0.tgz#fb832899d3a1372fe71c8b2c534bbfe74961bb6f" - integrity sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g== - dependencies: - bl "^4.0.3" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - log-symbols "^4.0.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - ora@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ora/-/ora-2.1.0.tgz#6caf2830eb924941861ec53a173799e008b51e5b" @@ -12591,14 +11452,6 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" -os-name@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/os-name/-/os-name-4.0.0.tgz#6c05c09c41c15848ea74658d12c9606f0f286599" - integrity sha512-caABzDdJMbtykt7GmSogEat3faTKQhmZf0BS5l/pZGmP0vPWQjXWqOhbLyK+b6j2/DQPmEvYdzLXJXXLJNVDNg== - dependencies: - macos-release "^2.2.0" - windows-release "^4.0.0" - os-shim@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" @@ -12622,16 +11475,6 @@ p-cancelable@^0.4.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ== -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - -p-cancelable@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.0.0.tgz#4a3740f5bdaf5ed5d7c3e34882c6fb5d6b266a6e" - integrity sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg== - p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -12661,13 +11504,6 @@ p-limit@^2.0.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -12682,20 +11518,6 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" - p-timeout@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" @@ -12723,16 +11545,6 @@ package-json@^4.0.1: registry-url "^3.0.3" semver "^5.1.0" -package-json@^6.3.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" - integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== - dependencies: - got "^9.6.0" - registry-auth-token "^4.0.0" - registry-url "^5.0.0" - semver "^6.2.0" - pad-start@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pad-start/-/pad-start-1.0.2.tgz#23e5bab3e96446b62816cff6f150975f040d1b14" @@ -12789,18 +11601,6 @@ parse-bmfont-xml@^1.1.4: xml-parse-from-string "^1.0.0" xml2js "^0.4.5" -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - parse-git-config@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/parse-git-config/-/parse-git-config-3.0.0.tgz#4a2de08c7b74a2555efa5ae94d40cd44302a6132" @@ -12814,16 +11614,6 @@ parse-headers@^2.0.0: resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.3.tgz#5e8e7512383d140ba02f0c7aa9f49b4399c92515" integrity sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA== -parse-json@5.2.0, parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -12836,16 +11626,6 @@ parse-ms@^1.0.0: resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" integrity sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0= -parse-path@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.3.tgz#82d81ec3e071dcc4ab49aa9f2c9c0b8966bb22bf" - integrity sha512-9Cepbp2asKnWTJ9x2kpw6Fe8y9JDbqwahGCTvklzd/cEq5C5JC59x2Xb0Kx+x0QZ8bvNquGO8/BWP0cwBHzSAA== - dependencies: - is-ssh "^1.3.0" - protocols "^1.4.0" - qs "^6.9.4" - query-string "^6.13.8" - parse-png@^1.0.0, parse-png@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/parse-png/-/parse-png-1.1.2.tgz#f5c2ad7c7993490986020a284c19aee459711ff2" @@ -12853,24 +11633,7 @@ parse-png@^1.0.0, parse-png@^1.1.1: dependencies: pngjs "^3.2.0" -parse-url@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-5.0.2.tgz#856a3be1fcdf78dc93fc8b3791f169072d898b59" - integrity sha512-Czj+GIit4cdWtxo3ISZCvLiUjErSo0iI3wJ+q9Oi3QuMYTI6OZu+7cewMWZ+C1YAnKhYTk6/TLuhIgCypLthPA== - dependencies: - is-ssh "^1.3.0" - normalize-url "^3.3.0" - parse-path "^4.0.0" - protocols "^1.4.0" - -parse5-htmlparser2-tree-adapter@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" - integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== - dependencies: - parse5 "^6.0.1" - -parse5@5.1.1, parse5@^5.1.1: +parse5@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== @@ -12887,11 +11650,6 @@ parse5@^3.0.1: dependencies: "@types/node" "*" -parse5@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - parseqs@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" @@ -12941,11 +11699,6 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -13307,19 +12060,6 @@ promise-map-series@^0.2.1, promise-map-series@^0.2.3: dependencies: rsvp "^3.0.14" -promise-retry@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" - integrity sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0= - dependencies: - err-code "^1.0.0" - retry "^0.10.0" - -protocols@^1.1.0, protocols@^1.4.0: - version "1.4.8" - resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.8.tgz#48eea2d8f58d9644a4a32caae5d5db290a075ce8" - integrity sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg== - proxy-addr@~2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" @@ -13395,13 +12135,6 @@ punycode@^1.2.4: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= -pupa@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" - integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== - dependencies: - escape-goat "^2.0.0" - purgecss@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/purgecss/-/purgecss-2.3.0.tgz#5327587abf5795e6541517af8b190a6fb5488bb3" @@ -13427,11 +12160,6 @@ qs@^6.2.0, qs@^6.4.0: resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e" integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw== -qs@^6.9.4: - version "6.9.6" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" - integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== - qs@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/qs/-/qs-1.0.2.tgz#50a93e2b5af6691c31bcea5dae78ee6ea1903768" @@ -13451,16 +12179,6 @@ query-string@^5.0.1: object-assign "^4.1.0" strict-uri-encode "^1.0.0" -query-string@^6.13.8: - version "6.14.0" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.0.tgz#0b7b7ca326f5facf10dd2d45d26645cd287f8c92" - integrity sha512-In3o+lUxlgejoVJgwEdYtdxrmlL0cQWJXj0+kkI7RWVo7hg5AhFtybeKlC9Dpgbr8eOC4ydpEh8017WwyfzqVQ== - dependencies: - decode-uri-component "^0.2.0" - filter-obj "^1.1.0" - split-on-first "^1.0.0" - strict-uri-encode "^2.0.0" - querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -13471,11 +12189,6 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quick-temp@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/quick-temp/-/quick-temp-0.1.8.tgz#bab02a242ab8fb0dd758a3c9776b32f9a5d94408" @@ -13543,7 +12256,7 @@ raw-body@~1.1.0: bytes "1" string_decoder "0.10" -rc@^1.0.1, rc@^1.1.6, rc@^1.2.8: +rc@^1.0.1, rc@^1.1.6: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -13598,7 +12311,7 @@ readable-stream@1.1: isarray "0.0.1" string_decoder "~0.10.x" -"readable-stream@2 || 3", readable-stream@^3.1.1, readable-stream@^3.4.0: +"readable-stream@2 || 3", readable-stream@^3.1.1: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -13650,13 +12363,6 @@ recast@^0.18.1: private "^0.1.8" source-map "~0.6.1" -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= - dependencies: - resolve "^1.1.6" - redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" @@ -13788,13 +12494,6 @@ registry-auth-token@^3.0.1: rc "^1.1.6" safe-buffer "^5.0.1" -registry-auth-token@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" - integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== - dependencies: - rc "^1.2.8" - registry-url@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" @@ -13802,13 +12501,6 @@ registry-url@^3.0.3: dependencies: rc "^1.0.1" -registry-url@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" - integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== - dependencies: - rc "^1.2.8" - regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" @@ -13833,52 +12525,6 @@ regjsparser@^0.6.4: dependencies: jsesc "~0.5.0" -release-it-lerna-changelog@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/release-it-lerna-changelog/-/release-it-lerna-changelog-3.1.0.tgz#cbcc877b40712e93a99a8b9a14e9e48290a82b9f" - integrity sha512-VehiRVpIB37XfggFcwMwDZ3ncXmD4npgM2tGGTfa3CN8MFCCJPPIRvaqHySDC/YV8mN7oLZeGSI/exrKXeybmA== - dependencies: - execa "^4.0.3" - lerna-changelog "^1.0.1" - mdast-util-from-markdown "^0.8.1" - tmp "^0.2.1" - validate-peer-dependencies "^1.0.0" - which "^2.0.2" - -release-it@^14.2.1: - version "14.4.1" - resolved "https://registry.yarnpkg.com/release-it/-/release-it-14.4.1.tgz#7b7dac839e22521853e81aa67d833c40a4094c43" - integrity sha512-fNvl2hIiTA3wKOQMu/cS07acuvibaTlvLUJmhuHarPsYJZpwX+nugb0a4PG20vlpuU5jKfnhkP8uPmvKXtRfuw== - dependencies: - "@iarna/toml" "2.2.5" - "@octokit/rest" "18.2.0" - async-retry "1.3.1" - chalk "4.1.0" - cosmiconfig "7.0.0" - debug "4.3.1" - deprecated-obj "2.0.0" - execa "5.0.0" - find-up "5.0.0" - form-data "4.0.0" - git-url-parse "11.4.4" - globby "11.0.2" - got "11.8.1" - import-cwd "3.0.0" - inquirer "7.3.3" - is-ci "3.0.0" - lodash "4.17.20" - mime-types "2.1.29" - ora "5.3.0" - os-name "4.0.0" - parse-json "5.2.0" - semver "7.3.4" - shelljs "0.8.4" - update-notifier "5.1.0" - url-join "4.0.1" - uuid "8.3.2" - yaml "1.10.0" - yargs-parser "20.2.5" - remote-git-tags@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/remote-git-tags/-/remote-git-tags-2.0.0.tgz#1152f39cf8b5268ae0e4307636ef741ec341664c" @@ -13993,11 +12639,6 @@ require-main-filename@^1.0.1: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - require-relative@^0.8.7: version "0.8.7" resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" @@ -14025,21 +12666,11 @@ resize-img@^1.1.0: jpeg-js "^0.1.1" parse-png "^1.1.1" -resolve-alpn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.0.0.tgz#745ad60b3d6aff4b4a48e01b8c0bdc70959e0e8c" - integrity sha512-rTuiIEqFmGxne4IovivKSDzld2lWW9QCjqv80SYjPgf+gS35eaCAjaP54CCwGAwBtnCsvNLYtqxe1Nw+i6JEmA== - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - resolve-package-path@^1.0.11, resolve-package-path@^1.2.2, resolve-package-path@^1.2.6: version "1.2.7" resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-1.2.7.tgz#2a7bc37ad96865e239330e3102c31322847e652e" @@ -14069,14 +12700,6 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.6: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.15.0, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.8.1: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" @@ -14084,20 +12707,13 @@ resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.1 dependencies: path-parse "^1.0.6" -responselike@1.0.2, responselike@^1.0.2: +responselike@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= dependencies: lowercase-keys "^1.0.0" -responselike@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" - integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw== - dependencies: - lowercase-keys "^2.0.0" - restore-cursor@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" @@ -14127,16 +12743,6 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -retry@0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= - -retry@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" - integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= - reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -14149,7 +12755,7 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" -rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.1, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1: +rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.1, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -14289,7 +12895,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -14368,13 +12974,6 @@ select@^1.1.2: resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= -semver-diff@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" - integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== - dependencies: - semver "^6.3.0" - "semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -14385,18 +12984,18 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@7.3.4, semver@^7.1.3, semver@^7.3.2, semver@^7.3.4: +semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.1.3, semver@^7.3.2, semver@^7.3.4: version "7.3.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.2.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -14488,15 +13087,6 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shelljs@0.8.4: - version "0.8.4" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" - integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" @@ -14507,11 +13097,6 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -signal-exit@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - silent-error@^1.0.0, silent-error@^1.0.1, silent-error@^1.1.0, silent-error@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/silent-error/-/silent-error-1.1.1.tgz#f72af5b0d73682a2ba1778b7e32cd8aa7c2d8662" @@ -14566,11 +13151,6 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" -smart-buffer@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" - integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== - snake-case@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.3.tgz#c598b822ab443fcbb145ae8a82c5e43526d5bbee" @@ -14668,22 +13248,6 @@ socket.io@^2.1.0: socket.io-client "2.4.0" socket.io-parser "~3.4.0" -socks-proxy-agent@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386" - integrity sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg== - dependencies: - agent-base "~4.2.1" - socks "~2.3.2" - -socks@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.3.tgz#01129f0a5d534d2b897712ed8aceab7ee65d78e3" - integrity sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA== - dependencies: - ip "1.1.5" - smart-buffer "^4.1.0" - sort-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" @@ -14827,11 +13391,6 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== -split-on-first@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" - integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== - split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -14876,14 +13435,6 @@ ssri@^6.0.1: dependencies: figgy-pudding "^3.5.1" -ssri@^7.0.0, ssri@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.0.tgz#92c241bf6de82365b5c7fb4bd76e975522e1294d" - integrity sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g== - dependencies: - figgy-pudding "^3.5.1" - minipass "^3.1.1" - stable@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" @@ -14970,11 +13521,6 @@ strict-uri-encode@^1.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= -strict-uri-encode@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" - integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= - string-template@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" @@ -14997,7 +13543,7 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string-width@^3.0.0, string-width@^3.1.0: +string-width@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== @@ -15006,7 +13552,7 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: +string-width@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== @@ -15069,7 +13615,7 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: +strip-ansi@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -15280,18 +13826,6 @@ tapable@^1.0.0, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tar@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.0.tgz#d1724e9bcc04b977b18d5c573b333a2207229a83" - integrity sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^3.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - temp@0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" @@ -15382,20 +13916,6 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.6.0.tgz#d7e4ab13fe54e32e08873be40d51b74229b00fc4" integrity sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ== -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - throttleit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" @@ -15507,13 +14027,6 @@ tmp@^0.0.29: dependencies: os-tmpdir "~1.0.1" -tmp@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" @@ -15557,11 +14070,6 @@ to-object-path@^0.3.0: dependencies: kind-of "^3.0.2" -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" @@ -15702,11 +14210,6 @@ type-fest@^0.11.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -15715,13 +14218,6 @@ type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -15827,25 +14323,6 @@ unique-string@^1.0.0: dependencies: crypto-random-string "^1.0.0" -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== - dependencies: - crypto-random-string "^2.0.0" - -unist-util-stringify-position@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" - integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== - dependencies: - "@types/unist" "^2.0.2" - -universal-user-agent@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" - integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== - universalify@^0.1.0, universalify@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -15896,26 +14373,6 @@ upath@^1.1.1: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-notifier@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" - integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== - dependencies: - boxen "^5.0.0" - chalk "^4.1.0" - configstore "^5.0.1" - has-yarn "^2.1.0" - import-lazy "^2.1.0" - is-ci "^2.0.0" - is-installed-globally "^0.4.0" - is-npm "^5.0.0" - is-yarn-global "^0.3.0" - latest-version "^5.1.0" - pupa "^2.1.1" - semver "^7.3.4" - semver-diff "^3.1.1" - xdg-basedir "^4.0.0" - uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" @@ -15928,11 +14385,6 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= -url-join@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" - integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== - url-parse-lax@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" @@ -16034,11 +14486,6 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" @@ -16059,14 +14506,6 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" -validate-peer-dependencies@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/validate-peer-dependencies/-/validate-peer-dependencies-1.1.0.tgz#8240a115df121ea35b0bb082255b38b5c591d7e1" - integrity sha512-eHHxI3fNMqu8bzWPRWWgV72kBJkWwRCeEua7yC7UI6dsqC55orhxKAC3uyQfCjjToOyAZ8mpNrbQH+NMoYBn1w== - dependencies: - resolve-package-path "^3.1.0" - semver "^7.3.2" - vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -16307,11 +14746,6 @@ which-module@^1.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - which@^1.2.10, which@^1.2.9, which@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -16319,7 +14753,7 @@ which@^1.2.10, which@^1.2.9, which@^1.3.0: dependencies: isexe "^2.0.0" -which@^2.0.1, which@^2.0.2: +which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== @@ -16333,20 +14767,6 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== - dependencies: - string-width "^4.0.0" - -windows-release@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-4.0.0.tgz#4725ec70217d1bf6e02c7772413b29cdde9ec377" - integrity sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg== - dependencies: - execa "^4.0.2" - word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -16398,24 +14818,6 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-legacy-hbs-plugin-if-needed@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wrap-legacy-hbs-plugin-if-needed/-/wrap-legacy-hbs-plugin-if-needed-1.0.1.tgz#6683eb74747f33e7caea54bb2ed85106ef9006b4" @@ -16440,16 +14842,6 @@ write-file-atomic@^2.0.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - write@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" @@ -16472,11 +14864,6 @@ xdg-basedir@^3.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= -xdg-basedir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" - integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== - xhr@^2.0.1: version "2.5.0" resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.5.0.tgz#bed8d1676d5ca36108667692b74b316c496e49dd" @@ -16545,11 +14932,6 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== -y18n@^5.0.5: - version "5.0.5" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" - integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== - yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -16573,29 +14955,6 @@ yam@^0.0.24: fs-extra "^4.0.2" lodash.merge "^4.6.0" -yaml@1.10.0, yaml@^1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" - integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== - -yargs-parser@20.2.5: - version "20.2.5" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.5.tgz#5d37729146d3f894f39fc94b6796f5b239513186" - integrity sha512-jYRGS3zWy20NtDtK2kBgo/TlAoy5YUuhD9/LZ7z7W4j1Fdw2cqD0xEEclf8fxc8xjD6X5Qr+qQQwCEsP8iRiYg== - -yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^20.2.2: - version "20.2.6" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.6.tgz#69f920addf61aafc0b8b89002f5d66e28f2d8b20" - integrity sha512-AP1+fQIWSM/sMiET8fyayjx/J+JmTPt2Mr0FkrgqB4todtfa53sOsrSAcIrJRD5XS20bKUwaDIuMkWKCEiQLKA== - yargs-parser@^4.2.0: version "4.2.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" @@ -16603,35 +14962,6 @@ yargs-parser@^4.2.0: dependencies: camelcase "^3.0.0" -yargs@^13.0.0: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" - -yargs@^16.0.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - yargs@^6.5.0: version "6.6.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" @@ -16664,11 +14994,6 @@ yeast@0.1.2: resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - yui@^3.18.1: version "3.18.1" resolved "https://registry.yarnpkg.com/yui/-/yui-3.18.1.tgz#e000269ec0a7b6fbc741cbb8fcbd0e65117b014c" From 260db56374f6465f05c67fbd95563a1f4d45305a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 8 Mar 2021 07:04:08 +0000 Subject: [PATCH 768/879] build(deps-dev): bump jsdom from 16.4.0 to 16.5.0 Bumps [jsdom](https://github.com/jsdom/jsdom) from 16.4.0 to 16.5.0. - [Release notes](https://github.com/jsdom/jsdom/releases) - [Changelog](https://github.com/jsdom/jsdom/blob/master/Changelog.md) - [Commits](https://github.com/jsdom/jsdom/compare/16.4.0...16.5.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 146 +++++++++++++++++++++++++++--------------------------- 1 file changed, 72 insertions(+), 74 deletions(-) diff --git a/yarn.lock b/yarn.lock index e5e18b9e5..b7f230685 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2268,10 +2268,10 @@ abab@^1.0.0: resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" integrity sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4= -abab@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" - integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== +abab@^2.0.3, abab@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== abbrev@1: version "1.1.1" @@ -2342,12 +2342,7 @@ acorn@^5.0.0, acorn@^5.5.3: resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== -acorn@^6.0.7: - version "6.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" - integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== - -acorn@^6.4.1: +acorn@^6.0.7, acorn@^6.4.1: version "6.4.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== @@ -2357,6 +2352,11 @@ acorn@^7.0.0, acorn@^7.1.0, acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== +acorn@^8.0.5: + version "8.0.5" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.0.5.tgz#a3bfb872a74a6a7f661bc81b9849d9cac12601b7" + integrity sha512-v+DieK/HJkJOpFBETDJioequtc3PfxsWMaxIdIwujtF7FEV/MAyDQLlm6/zPvr7Mix07mLh6ccVwIsloceodlg== + after@0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" @@ -5576,10 +5576,10 @@ cssom@^0.4.4: dependencies: cssom "0.3.x" -cssstyle@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.2.0.tgz#e4c44debccd6b7911ed617a4395e5754bba59992" - integrity sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA== +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== dependencies: cssom "~0.3.6" @@ -5661,10 +5661,10 @@ decamelize@^1.1.1, decamelize@^1.1.2: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= -decimal.js@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.0.tgz#39466113a9e036111d02f82489b5fd6b0b5ed231" - integrity sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw== +decimal.js@^10.2.1: + version "10.2.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" + integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== decode-uri-component@^0.2.0: version "0.2.0" @@ -7393,7 +7393,7 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escodegen@^1.14.1, escodegen@^1.6.1: +escodegen@^1.6.1: version "1.14.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ== @@ -7405,6 +7405,18 @@ escodegen@^1.14.1, escodegen@^1.6.1: optionalDependencies: source-map "~0.6.1" +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + esdoc-accessor-plugin@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/esdoc-accessor-plugin/-/esdoc-accessor-plugin-1.0.0.tgz#791ba4872e6c403515ce749b1348d6f0293ad9eb" @@ -7578,6 +7590,11 @@ estraverse@^5.0.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.0.0.tgz#ac81750b482c11cca26e4b07e83ed8f75fbcdc22" integrity sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A== +estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + estree-walker@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" @@ -9267,11 +9284,6 @@ ip-regex@^1.0.1: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" integrity sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0= -ip-regex@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= - ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -9720,35 +9732,35 @@ jsbn@~0.1.0: integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= jsdom@^16.2.2, jsdom@^16.4.0: - version "16.4.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.4.0.tgz#36005bde2d136f73eee1a830c6d45e55408edddb" - integrity sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w== + version "16.5.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.5.0.tgz#9e453505600cc5a70b385750d35256f380730cc4" + integrity sha512-QxZH0nmDTnTTVI0YDm4RUlaUPl5dcyn62G5TMDNfMmTW+J1u1v9gCR8WR+WZ6UghAa7nKJjDOFaI00eMMWvJFQ== dependencies: - abab "^2.0.3" - acorn "^7.1.1" + abab "^2.0.5" + acorn "^8.0.5" acorn-globals "^6.0.0" cssom "^0.4.4" - cssstyle "^2.2.0" + cssstyle "^2.3.0" data-urls "^2.0.0" - decimal.js "^10.2.0" + decimal.js "^10.2.1" domexception "^2.0.1" - escodegen "^1.14.1" + escodegen "^2.0.0" html-encoding-sniffer "^2.0.1" is-potential-custom-element-name "^1.0.0" nwsapi "^2.2.0" - parse5 "5.1.1" + parse5 "6.0.1" request "^2.88.2" - request-promise-native "^1.0.8" - saxes "^5.0.0" + request-promise-native "^1.0.9" + saxes "^5.0.1" symbol-tree "^3.2.4" - tough-cookie "^3.0.1" + tough-cookie "^4.0.0" w3c-hr-time "^1.0.2" w3c-xmlserializer "^2.0.0" webidl-conversions "^6.1.0" whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" - ws "^7.2.3" + ws "^7.4.4" xml-name-validator "^3.0.0" jsdom@^7.0.2: @@ -11633,10 +11645,10 @@ parse-png@^1.0.0, parse-png@^1.1.1: dependencies: pngjs "^3.2.0" -parse5@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" - integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== +parse5@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== parse5@^1.5.1: version "1.5.1" @@ -12567,19 +12579,19 @@ request-progress@^2.0.1: dependencies: throttleit "^1.0.0" -request-promise-core@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" - integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== dependencies: - lodash "^4.17.15" + lodash "^4.17.19" -request-promise-native@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" - integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== +request-promise-native@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== dependencies: - request-promise-core "1.1.3" + request-promise-core "1.1.4" stealthy-require "^1.1.1" tough-cookie "^2.3.3" @@ -12945,10 +12957,10 @@ sax@>=0.6.0, sax@^1.1.4, sax@~1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -saxes@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.0.tgz#b7d30284d7583a5ca6ad0248b56d8889da53788b" - integrity sha512-LXTZygxhf8lfwKaTP/8N9CsVdjTlea3teze4lL6u37ivbgGbV0GGMuNtS/I9rnD/HC2/txUM7Df4S2LVl1qhiA== +saxes@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== dependencies: xmlchars "^2.2.0" @@ -14112,7 +14124,7 @@ topo@2.x.x: dependencies: hoek "4.x.x" -tough-cookie@>=0.12.0: +tough-cookie@>=0.12.0, tough-cookie@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== @@ -14129,15 +14141,6 @@ tough-cookie@^2.2.0, tough-cookie@^2.3.3, tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" -tough-cookie@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" - integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== - dependencies: - ip-regex "^2.1.0" - psl "^1.1.28" - punycode "^2.1.1" - tr46@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" @@ -14849,15 +14852,10 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@^7.2.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46" - integrity sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ== - -ws@~7.4.2: - version "7.4.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.2.tgz#782100048e54eb36fe9843363ab1c68672b261dd" - integrity sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA== +ws@^7.4.4, ws@~7.4.2: + version "7.4.4" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz#383bc9742cb202292c9077ceab6f6047b17f2d59" + integrity sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw== xdg-basedir@^3.0.0: version "3.0.0" From 250734cdbc902a4d7ac687ef7ce3f5dddd14cf51 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 8 Mar 2021 07:04:42 +0000 Subject: [PATCH 769/879] build(deps-dev): bump ember-cli-htmlbars from 5.6.3 to 5.6.4 Bumps [ember-cli-htmlbars](https://github.com/ember-cli/ember-cli-htmlbars) from 5.6.3 to 5.6.4. - [Release notes](https://github.com/ember-cli/ember-cli-htmlbars/releases) - [Changelog](https://github.com/ember-cli/ember-cli-htmlbars/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-cli-htmlbars/compare/v5.6.3...v5.6.4) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index b7f230685..614b5dccc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6430,9 +6430,9 @@ ember-cli-htmlbars@^4.2.3: walk-sync "^2.0.2" ember-cli-htmlbars@^5.0.0, ember-cli-htmlbars@^5.2.0, ember-cli-htmlbars@^5.3.1: - version "5.6.3" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.6.3.tgz#4916d1ea2b6d69ea5e7252c0c59e56d7031ee310" - integrity sha512-pn2pW49KmsrjlG4PEMmd3ZrsbS2WHKn+1NLLCWUjxmc5g4/lHxHicB8IN5z95ANmgqDHAwp+rw1XTyWy9r0xyQ== + version "5.6.4" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.6.4.tgz#97c1ce813dfe79961c575b4516fbb30cbb782b43" + integrity sha512-I4zSc6PJpWiDuhru7jozQsodo4tAsNENJP/Ry0LTL0DtlZASEa5cwahPsxBjzEmAnr30oI2AExZhrDcZBryTjQ== dependencies: "@ember/edition-utils" "^1.2.0" babel-plugin-htmlbars-inline-precompile "^4.4.1" From 184e2530be5f548d214fffa2d1b2cf8efe6b0288 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 8 Mar 2021 16:31:04 +0000 Subject: [PATCH 770/879] build(deps): [security] bump elliptic from 6.5.3 to 6.5.4 Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.3 to 6.5.4. **This update includes a security fix.** - [Release notes](https://github.com/indutny/elliptic/releases) - [Commits](https://github.com/indutny/elliptic/compare/v6.5.3...v6.5.4) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/yarn.lock b/yarn.lock index 614b5dccc..efb339032 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3558,10 +3558,10 @@ bmp-js@^0.1.0: resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233" integrity sha1-4Fpj95amwf8l9Hcex62twUjAcjM= -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.9" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" - integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== body-parser@1.19.0: version "1.19.0" @@ -4417,7 +4417,7 @@ broccoli-uglify-sourcemap@^3.1.0: walk-sync "^1.1.3" workerpool "^5.0.1" -brorand@^1.0.1: +brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= @@ -5976,17 +5976,17 @@ electron-to-chromium@^1.3.413: integrity sha512-smevlzzMNz3vMz6OLeeCq5HRWEj2AcgccNPYnAx4Usx0IOciq9DU36RJcICcS09hXoY7t7deRfVYKD14IrGb9A== elliptic@^6.0.0: - version "6.5.3" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" - integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" + bn.js "^4.11.9" + brorand "^1.1.0" hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" ember-ajax@^5.0.0: version "5.0.0" @@ -8929,7 +8929,7 @@ himalaya@1.1.0: resolved "https://registry.yarnpkg.com/himalaya/-/himalaya-1.1.0.tgz#31724ae9d35714cd7c6f4be94888953f3604606a" integrity sha512-LLase1dHCRMel68/HZTFft0N0wti0epHr3nNY7ynpLbyZpmrKMQ8YIpiOV77TM97cNpC8Wb2n6f66IRggwdWPw== -hmac-drbg@^1.0.0: +hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= @@ -9170,7 +9170,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -10824,7 +10824,7 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: +minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= From c27f30e48e58ce6b98b48439d011b4ce5e59409a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 15 Mar 2021 07:12:37 +0000 Subject: [PATCH 771/879] build(deps-dev): bump ember-cli-htmlbars from 5.6.4 to 5.6.5 Bumps [ember-cli-htmlbars](https://github.com/ember-cli/ember-cli-htmlbars) from 5.6.4 to 5.6.5. - [Release notes](https://github.com/ember-cli/ember-cli-htmlbars/releases) - [Changelog](https://github.com/ember-cli/ember-cli-htmlbars/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-cli-htmlbars/compare/v5.6.4...v5.6.5) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index efb339032..f8fb9e8fb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3054,10 +3054,10 @@ babel-plugin-htmlbars-inline-precompile@^3.2.0: resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-3.2.0.tgz#c4882ea875d0f5683f0d91c1f72e29a4f14b5606" integrity sha512-IUeZmgs9tMUGXYu1vfke5I18yYJFldFGdNFQOWslXTnDWXzpwPih7QFduUqvT+awDpDuNtXpdt5JAf43Q1Hhzg== -babel-plugin-htmlbars-inline-precompile@^4.4.1: - version "4.4.3" - resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-4.4.3.tgz#e45a6386786583009e2d7c8bd2dc5ec51132c041" - integrity sha512-tJQP1cdJ/ISX5++s+7xKfy6MAZ9CYV2i78zHQ8zCrPVxAmstUWQeOkxglRMqvCoP6G0frvRSZgz+W26GyknoXw== +babel-plugin-htmlbars-inline-precompile@^4.4.5: + version "4.4.5" + resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-4.4.5.tgz#ca0fc6ea49fe13b0a91ff995ee381d33d421a4ef" + integrity sha512-7qnZTDm9uUQppOmEWjAyIPTQ54akEdd9PCIfbTJ8HNgUdekeKC+24uwd+M1ZTjUItby1iLy9maQOK3Wv9RjWJA== dependencies: babel-plugin-ember-modules-api-polyfill "^3.4.0" @@ -6430,12 +6430,12 @@ ember-cli-htmlbars@^4.2.3: walk-sync "^2.0.2" ember-cli-htmlbars@^5.0.0, ember-cli-htmlbars@^5.2.0, ember-cli-htmlbars@^5.3.1: - version "5.6.4" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.6.4.tgz#97c1ce813dfe79961c575b4516fbb30cbb782b43" - integrity sha512-I4zSc6PJpWiDuhru7jozQsodo4tAsNENJP/Ry0LTL0DtlZASEa5cwahPsxBjzEmAnr30oI2AExZhrDcZBryTjQ== + version "5.6.5" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.6.5.tgz#15a55e4e4f47869a5e95a1e49813f77fd22fb76e" + integrity sha512-Wl3AntESMmQoG//yKuu+/7qAOznYAwRgWU8ZOCOPaGdPFaFXD6SPd2SKpRW4BEox5KLBJZFH0e7b9m78IAzcUw== dependencies: "@ember/edition-utils" "^1.2.0" - babel-plugin-htmlbars-inline-precompile "^4.4.1" + babel-plugin-htmlbars-inline-precompile "^4.4.5" broccoli-debug "^0.6.5" broccoli-persistent-filter "^3.1.2" broccoli-plugin "^4.0.3" From bf426d4891569b20742950a3880f03c6d64a3ec3 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 15 Mar 2021 07:13:08 +0000 Subject: [PATCH 772/879] build(deps-dev): bump jsdom from 16.5.0 to 16.5.1 Bumps [jsdom](https://github.com/jsdom/jsdom) from 16.5.0 to 16.5.1. - [Release notes](https://github.com/jsdom/jsdom/releases) - [Changelog](https://github.com/jsdom/jsdom/blob/master/Changelog.md) - [Commits](https://github.com/jsdom/jsdom/compare/16.5.0...16.5.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index f8fb9e8fb..67b33c021 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9732,9 +9732,9 @@ jsbn@~0.1.0: integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= jsdom@^16.2.2, jsdom@^16.4.0: - version "16.5.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.5.0.tgz#9e453505600cc5a70b385750d35256f380730cc4" - integrity sha512-QxZH0nmDTnTTVI0YDm4RUlaUPl5dcyn62G5TMDNfMmTW+J1u1v9gCR8WR+WZ6UghAa7nKJjDOFaI00eMMWvJFQ== + version "16.5.1" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.5.1.tgz#4ced6bbd7b77d67fb980e64d9e3e6fb900f97dd6" + integrity sha512-pF73EOsJgwZekbDHEY5VO/yKXUkab/DuvrQB/ANVizbr6UAHJsDdHXuotZYwkJSGQl1JM+ivXaqY+XBDDL4TiA== dependencies: abab "^2.0.5" acorn "^8.0.5" From 638324177aaa385011e64aaeeccf9f499b608bb4 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 18 Mar 2021 06:46:09 +0000 Subject: [PATCH 773/879] build(deps): bump ember-cli-babel from 7.23.1 to 7.25.0 Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 7.23.1 to 7.25.0. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v7.23.1...v7.25.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 470 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 347 insertions(+), 123 deletions(-) diff --git a/yarn.lock b/yarn.lock index 67b33c021..8a03333d7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21,11 +21,23 @@ dependencies: "@babel/highlight" "^7.10.4" +"@babel/code-frame@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" + integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== + dependencies: + "@babel/highlight" "^7.12.13" + "@babel/compat-data@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.1.tgz#d7386a689aa0ddf06255005b4b991988021101a0" integrity sha512-725AQupWJZ8ba0jbKceeFblZTY90McUBWMwHhkFQ9q1zKPJ95GUktljFcgcsIVwRnTnRKlcYzfiNImg5G9m6ZQ== +"@babel/compat-data@^7.13.0", "@babel/compat-data@^7.13.8": + version "7.13.11" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.11.tgz#9c8fe523c206979c9a81b1e12fe50c1254f1aa35" + integrity sha512-BwKEkO+2a67DcFeS3RLl0Z3Gs2OvdXewuWjc1Hfokhb5eQWP9YRYH1/+VrVZvql2CfjOiNGqSAFOYt4lsqTHzg== + "@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.3.4": version "7.12.9" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" @@ -57,6 +69,15 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.13.0": + version "7.13.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.9.tgz#3a7aa96f9efb8e2be42d38d80e2ceb4c64d8de39" + integrity sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw== + dependencies: + "@babel/types" "^7.13.0" + jsesc "^2.5.1" + source-map "^0.5.0" + "@babel/helper-annotate-as-pure@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" @@ -79,27 +100,15 @@ "@babel/helper-explode-assignable-expression" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helper-compilation-targets@^7.12.0", "@babel/helper-compilation-targets@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.1.tgz#310e352888fbdbdd8577be8dfdd2afb9e7adcf50" - integrity sha512-jtBEif7jsPwP27GPHs06v4WBV0KrE8a/P7n0N0sSvHn2hwUCYnolP/CLmz51IzAW4NlN+HuoBtb9QcwnRo9F/g== +"@babel/helper-compilation-targets@^7.12.0", "@babel/helper-compilation-targets@^7.12.1", "@babel/helper-compilation-targets@^7.13.0": + version "7.13.10" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.10.tgz#1310a1678cb8427c07a753750da4f8ce442bdd0c" + integrity sha512-/Xju7Qg1GQO4mHZ/Kcs6Au7gfafgZnwm+a7sy/ow/tV1sHeraRUHbjdat8/UvDor4Tez+siGKDk6zIKtCPKVJA== dependencies: - "@babel/compat-data" "^7.12.1" - "@babel/helper-validator-option" "^7.12.1" - browserslist "^4.12.0" - semver "^5.5.0" - -"@babel/helper-create-class-features-plugin@^7.10.5": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d" - integrity sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A== - dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-member-expression-to-functions" "^7.10.5" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.10.4" + "@babel/compat-data" "^7.13.8" + "@babel/helper-validator-option" "^7.12.17" + browserslist "^4.14.5" + semver "^6.3.0" "@babel/helper-create-class-features-plugin@^7.12.1": version "7.12.1" @@ -112,6 +121,17 @@ "@babel/helper-replace-supers" "^7.12.1" "@babel/helper-split-export-declaration" "^7.10.4" +"@babel/helper-create-class-features-plugin@^7.13.0": + version "7.13.11" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz#30d30a005bca2c953f5653fc25091a492177f4f6" + integrity sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw== + dependencies: + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-member-expression-to-functions" "^7.13.0" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/helper-replace-supers" "^7.13.0" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-create-class-features-plugin@^7.8.3": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz#243a5b46e2f8f0f674dc1387631eb6b28b851de0" @@ -151,6 +171,20 @@ "@babel/types" "^7.10.5" lodash "^4.17.19" +"@babel/helper-define-polyfill-provider@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz#3c2f91b7971b9fc11fe779c945c014065dea340e" + integrity sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + "@babel/helper-explode-assignable-expression@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz#40a1cd917bff1288f699a94a75b37a1a2dbd8c7c" @@ -168,6 +202,15 @@ "@babel/template" "^7.10.4" "@babel/types" "^7.10.4" +"@babel/helper-function-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" + integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== + dependencies: + "@babel/helper-get-function-arity" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/types" "^7.12.13" + "@babel/helper-function-name@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" @@ -184,6 +227,13 @@ dependencies: "@babel/types" "^7.10.4" +"@babel/helper-get-function-arity@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" + integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-get-function-arity@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" @@ -198,13 +248,6 @@ dependencies: "@babel/types" "^7.10.4" -"@babel/helper-member-expression-to-functions@^7.10.4", "@babel/helper-member-expression-to-functions@^7.10.5": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" - integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q== - dependencies: - "@babel/types" "^7.11.0" - "@babel/helper-member-expression-to-functions@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz#fba0f2fcff3fba00e6ecb664bb5e6e26e2d6165c" @@ -212,6 +255,13 @@ dependencies: "@babel/types" "^7.12.1" +"@babel/helper-member-expression-to-functions@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz#6aa4bb678e0f8c22f58cdb79451d30494461b091" + integrity sha512-yvRf8Ivk62JwisqV1rFRMxiSMDGnN6KH1/mDMmIrij4jztpQNRoHqqMG3U6apYbGRPJpgPalhva9Yd06HlUxJQ== + dependencies: + "@babel/types" "^7.13.0" + "@babel/helper-member-expression-to-functions@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" @@ -226,6 +276,13 @@ dependencies: "@babel/types" "^7.12.1" +"@babel/helper-module-imports@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0" + integrity sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-module-imports@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" @@ -248,6 +305,21 @@ "@babel/types" "^7.12.1" lodash "^4.17.19" +"@babel/helper-module-transforms@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz#42eb4bd8eea68bab46751212c357bfed8b40f6f1" + integrity sha512-Ls8/VBwH577+pw7Ku1QkUWIyRRNHpYlts7+qSqBBFCW3I8QteB9DxfcZ5YJpOwH6Ihe/wn8ch7fMGOP1OhEIvw== + dependencies: + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-replace-supers" "^7.13.0" + "@babel/helper-simple-access" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-validator-identifier" "^7.12.11" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.0" + lodash "^4.17.19" + "@babel/helper-optimise-call-expression@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" @@ -255,6 +327,13 @@ dependencies: "@babel/types" "^7.10.4" +"@babel/helper-optimise-call-expression@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" + integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-optimise-call-expression@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" @@ -272,6 +351,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== +"@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" + integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== + "@babel/helper-regex@^7.10.4": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0" @@ -295,16 +379,6 @@ "@babel/helper-wrap-function" "^7.10.4" "@babel/types" "^7.12.1" -"@babel/helper-replace-supers@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" - integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.10.4" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" - "@babel/helper-replace-supers@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz#f15c9cc897439281891e11d5ce12562ac0cf3fa9" @@ -315,6 +389,16 @@ "@babel/traverse" "^7.12.1" "@babel/types" "^7.12.1" +"@babel/helper-replace-supers@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz#6034b7b51943094cb41627848cb219cb02be1d24" + integrity sha512-Segd5me1+Pz+rmN/NFBOplMbZG3SqRJOBlY+mA0SxAv6rjj7zJqr1AVr3SfzUVTLCv7ZLU5FycOM/SBGuLPbZw== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.13.0" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.0" + "@babel/helper-replace-supers@^7.8.6": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" @@ -332,6 +416,13 @@ dependencies: "@babel/types" "^7.12.1" +"@babel/helper-simple-access@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4" + integrity sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-skip-transparent-expression-wrappers@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" @@ -346,6 +437,13 @@ dependencies: "@babel/types" "^7.11.0" +"@babel/helper-split-export-declaration@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" + integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-split-export-declaration@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" @@ -358,6 +456,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== +"@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + "@babel/helper-validator-identifier@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" @@ -368,6 +471,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz#175567380c3e77d60ff98a54bb015fe78f2178d9" integrity sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A== +"@babel/helper-validator-option@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" + integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== + "@babel/helper-wrap-function@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87" @@ -396,6 +504,15 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.12.13": + version "7.13.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" + integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/highlight@^7.8.3": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" @@ -410,6 +527,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.0.tgz#a9d7e11aead25d3b422d17b2c6502c8dddef6a5d" integrity sha512-qvRvi4oI8xii8NllyEc4MDJjuZiNaRzyb7Y7lup1NqJV8TZHF4O27CcP+72WPn/k1zkgJ6WJfnIbk4jTsVAZHw== +"@babel/parser@^7.12.13", "@babel/parser@^7.13.0": + version "7.13.11" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.11.tgz#f93ebfc99d21c1772afbbaa153f47e7ce2f50b88" + integrity sha512-PhuoqeHoO9fc4ffMEVk4qb/w/s2iOSWohvbHxLtxui0eBg3Lg5gN1U8wp1V1u61hOWkPQJJyJzGH6Y+grwkq8Q== + "@babel/parser@^7.12.3": version "7.12.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.3.tgz#a305415ebe7a6c7023b40b5122a0662d928334cd" @@ -434,22 +556,22 @@ "@babel/helper-remap-async-to-generator" "^7.12.1" "@babel/plugin-syntax-async-generators" "^7.8.0" -"@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.10.4", "@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.3.4": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" - integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w== +"@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.3.4": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37" + integrity sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-create-class-features-plugin" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-proposal-decorators@^7.10.5", "@babel/plugin-proposal-decorators@^7.3.0": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.10.5.tgz#42898bba478bc4b1ae242a703a953a7ad350ffb4" - integrity sha512-Sc5TAQSZuLzgY0664mMDn24Vw2P8g/VhyLyGPaWiHahhgLqeZvcGeyBZOrJW0oSKIK2mvQ22a1ENXBIQLhrEiQ== +"@babel/plugin-proposal-decorators@^7.13.5", "@babel/plugin-proposal-decorators@^7.3.0": + version "7.13.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.13.5.tgz#d28071457a5ba8ee1394b23e38d5dcf32ea20ef7" + integrity sha512-i0GDfVNuoapwiheevUOuSW67mInqJ8qw7uWfpjNVeHMn143kXblEy/bmL9AdZ/0yf/4BMQeWXezK0tQIvNPqag== dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.5" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-decorators" "^7.10.4" + "@babel/helper-create-class-features-plugin" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-decorators" "^7.12.13" "@babel/plugin-proposal-dynamic-import@^7.12.1": version "7.12.1" @@ -579,12 +701,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-decorators@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.4.tgz#6853085b2c429f9d322d02f5a635018cdeb2360c" - integrity sha512-2NaoC6fAk2VMdhY1eerkfHV+lVYC1u8b+jmRJISqANCJlTxYy19HGdIkkQtix2UtkcPuPu+IlDgrVseZnU03bw== +"@babel/plugin-syntax-decorators@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz#fac829bf3c7ef4a1bc916257b403e58c6bdaf648" + integrity sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -656,12 +778,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-typescript@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.1.tgz#460ba9d77077653803c3dd2e673f76d66b4029e5" - integrity sha512-UZNEcCY+4Dp9yYRCAHrHDU+9ZXLYaY9MgBXSRLkB9WjYFRR6quJBumfVrEkUxrePPBwFcpWfNKXqVRQQtm7mMA== +"@babel/plugin-syntax-typescript@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz#9dff111ca64154cef0f4dc52cf843d9f12ce4474" + integrity sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-typescript@^7.2.0", "@babel/plugin-syntax-typescript@^7.8.3": version "7.8.3" @@ -795,13 +917,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-modules-amd@^7.0.0", "@babel/plugin-transform-modules-amd@^7.10.5", "@babel/plugin-transform-modules-amd@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz#3154300b026185666eebb0c0ed7f8415fefcf6f9" - integrity sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ== +"@babel/plugin-transform-modules-amd@^7.0.0", "@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz#19f511d60e3d8753cc5a6d4e775d3a5184866cc3" + integrity sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ== dependencies: - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-module-transforms" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-commonjs@^7.12.1": @@ -890,15 +1012,17 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-runtime@^7.12.0", "@babel/plugin-transform-runtime@^7.12.1", "@babel/plugin-transform-runtime@^7.2.0": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz#04b792057eb460389ff6a4198e377614ea1e7ba5" - integrity sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg== +"@babel/plugin-transform-runtime@^7.12.1", "@babel/plugin-transform-runtime@^7.13.9", "@babel/plugin-transform-runtime@^7.2.0": + version "7.13.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.10.tgz#a1e40d22e2bf570c591c9c7e5ab42d6bf1e419e1" + integrity sha512-Y5k8ipgfvz5d/76tx7JYbKQTcgFSU6VgJ3kKQv4zGTKr+a9T/KBvfRvGtSFgKDQGt/DBykQixV0vNWKIdzWErA== dependencies: - "@babel/helper-module-imports" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - resolve "^1.8.1" - semver "^5.5.1" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + babel-plugin-polyfill-corejs2 "^0.1.4" + babel-plugin-polyfill-corejs3 "^0.1.3" + babel-plugin-polyfill-regenerator "^0.1.2" + semver "^6.3.0" "@babel/plugin-transform-shorthand-properties@^7.12.1": version "7.12.1" @@ -937,14 +1061,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-typescript@^7.12.0": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.1.tgz#d92cc0af504d510e26a754a7dbc2e5c8cd9c7ab4" - integrity sha512-VrsBByqAIntM+EYMqSm59SiMEf7qkmI9dqMt6RbD/wlwueWmYcI0FFK5Fj47pP6DRZm+3teXjosKlwcZJ5lIMw== +"@babel/plugin-transform-typescript@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz#4a498e1f3600342d2a9e61f60131018f55774853" + integrity sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-typescript" "^7.12.1" + "@babel/helper-create-class-features-plugin" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-typescript" "^7.12.13" "@babel/plugin-transform-typescript@~7.4.0": version "7.4.5" @@ -1069,10 +1193,10 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.2.0", "@babel/runtime@^7.8.4": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" - integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== +"@babel/runtime@7.12.18", "@babel/runtime@^7.12.5", "@babel/runtime@^7.2.0", "@babel/runtime@^7.8.4": + version "7.12.18" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.18.tgz#af137bd7e7d9705a412b3caaf991fe6aaa97831b" + integrity sha512-BogPQ7ciE6SYAUPtlm9tWbgI9+2AgqSam6QivMgXgAT+fKbgppaj4ZX15MHeLC1PVF5sNk70huBu20XxWOs8Cg== dependencies: regenerator-runtime "^0.13.4" @@ -1085,6 +1209,15 @@ "@babel/parser" "^7.10.4" "@babel/types" "^7.10.4" +"@babel/template@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" + integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" + "@babel/template@^7.12.7": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc" @@ -1118,6 +1251,21 @@ globals "^11.1.0" lodash "^4.17.19" +"@babel/traverse@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.0.tgz#6d95752475f86ee7ded06536de309a65fc8966cc" + integrity sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.13.0" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/parser" "^7.13.0" + "@babel/types" "^7.13.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + "@babel/types@^7.1.6", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.7.2", "@babel/types@^7.8.3", "@babel/types@^7.8.6": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.7.tgz#6039ff1e242640a29452c9ae572162ec9a8f5d13" @@ -1127,6 +1275,15 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" +"@babel/types@^7.12.13", "@babel/types@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.0.tgz#74424d2816f0171b4100f0ab34e9a374efdf7f80" + integrity sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + "@ember-data/-build-infra@3.14.0": version "3.14.0" resolved "https://registry.yarnpkg.com/@ember-data/-build-infra/-/-build-infra-3.14.0.tgz#d81242b018038b0bf39bceaa1b0df167398f60b8" @@ -2389,7 +2546,7 @@ amd-name-resolver@1.2.0: dependencies: ensure-posix-path "^1.0.1" -amd-name-resolver@^1.2.0, amd-name-resolver@^1.2.1: +amd-name-resolver@^1.2.0, amd-name-resolver@^1.2.1, amd-name-resolver@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.3.1.tgz#ffe71c683c6e7191fc4ae1bb3aaed15abea135d9" integrity sha512-26qTEWqZQ+cxSYygZ4Cf8tsjDBLceJahhtewxtKZA3SRa4PluuqYCuheemDQD+7Mf5B7sr+zhTDWAHDh02a1Dw== @@ -2981,10 +3138,10 @@ babel-plugin-debug-macros@^0.2.0, babel-plugin-debug-macros@^0.2.0-beta.6: dependencies: semver "^5.3.0" -babel-plugin-debug-macros@^0.3.0, babel-plugin-debug-macros@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.3.3.tgz#29c3449d663f61c7385f5b8c72d8015b069a5cb7" - integrity sha512-E+NI8TKpxJDBbVkdWkwHrKgJi696mnRL8XYrOPYw82veNHPDORM9WIQifl6TpIo8PNy2tU2skPqbfkmHXrHKQA== +babel-plugin-debug-macros@^0.3.0, babel-plugin-debug-macros@^0.3.3, babel-plugin-debug-macros@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.3.4.tgz#22961d0cb851a80654cece807a8b4b73d85c6075" + integrity sha512-wfel/vb3pXfwIDZUrkoDrn5FHmlWI96PCJ3UCDv2a86poJ3EQrnArNW5KfHSVJ9IOgxHbo748cQt7sDU+0KCEw== dependencies: semver "^5.3.0" @@ -3009,19 +3166,12 @@ babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-p dependencies: ember-rfc176-data "^0.3.13" -babel-plugin-ember-modules-api-polyfill@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-3.2.1.tgz#715252ffde309da36fb32cd6a9bad5c6b61edd33" - integrity sha512-7k4gM0VLAMjoWVxLBDqavH/Dn4mBfzqTuQmtGmZgsdQ4SYVEJ7dewUVeqWBVn5v3QspW4VSoeXh4rHPPlp/rPw== - dependencies: - ember-rfc176-data "^0.3.16" - -babel-plugin-ember-modules-api-polyfill@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-3.4.0.tgz#3f5e0457e135f8a29b3a8b6910806bb5b524649e" - integrity sha512-nVu/LqbZBAup1zLij6xGvQwVLWVk4XYu2fl4vIOUR3S6ukdonMLhKAb0d4QXSzH30Pd7OczVTlPffWbiwahdJw== +babel-plugin-ember-modules-api-polyfill@^3.4.0, babel-plugin-ember-modules-api-polyfill@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-3.5.0.tgz#27b6087fac75661f779f32e60f94b14d0e9f6965" + integrity sha512-pJajN/DkQUnStw0Az8c6khVcMQHgzqWr61lLNtVeu0g61LRW0k9jyK7vaedrHDWGe/Qe8sxG5wpiyW9NsMqFzA== dependencies: - ember-rfc176-data "^0.3.16" + ember-rfc176-data "^0.3.17" babel-plugin-feature-flags@^0.3.1: version "0.3.1" @@ -3061,7 +3211,7 @@ babel-plugin-htmlbars-inline-precompile@^4.4.5: dependencies: babel-plugin-ember-modules-api-polyfill "^3.4.0" -babel-plugin-module-resolver@^3.1.1: +babel-plugin-module-resolver@^3.1.1, babel-plugin-module-resolver@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.2.0.tgz#ddfa5e301e3b9aa12d852a9979f18b37881ff5a7" integrity sha512-tjR0GvSndzPew/Iayf4uICWZqjBwnlMWjSx6brryfQ81F9rxBVqwDJtFCV8oOs0+vJeefK9TmdZtkIFdFe1UnA== @@ -3072,6 +3222,30 @@ babel-plugin-module-resolver@^3.1.1: reselect "^3.0.1" resolve "^1.4.0" +babel-plugin-polyfill-corejs2@^0.1.4: + version "0.1.10" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz#a2c5c245f56c0cac3dbddbf0726a46b24f0f81d1" + integrity sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA== + dependencies: + "@babel/compat-data" "^7.13.0" + "@babel/helper-define-polyfill-provider" "^0.1.5" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.1.3: + version "0.1.7" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz#80449d9d6f2274912e05d9e182b54816904befd0" + integrity sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.1.5" + core-js-compat "^3.8.1" + +babel-plugin-polyfill-regenerator@^0.1.2: + version "0.1.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz#0fe06a026fe0faa628ccc8ba3302da0a6ce02f3f" + integrity sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.1.5" + babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" @@ -4292,6 +4466,11 @@ broccoli-source@^1.1.0: resolved "https://registry.yarnpkg.com/broccoli-source/-/broccoli-source-1.1.0.tgz#54f0e82c8b73f46580cbbc4f578f0b32fca8f809" integrity sha1-VPDoLItz9GWAy7xPV48LMvyo+Ak= +broccoli-source@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/broccoli-source/-/broccoli-source-2.1.2.tgz#e9ae834f143b607e9ec114ade66731500c38b90b" + integrity sha512-1lLayO4wfS0c0Sj50VfHJXNWf94FYY0WUhxj0R77thbs6uWI7USiOWFqQV5dRmhAJnoKaGN4WyLGQbgjgiYFwQ== + broccoli-source@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/broccoli-source/-/broccoli-source-3.0.0.tgz#c7c9ba24505941b72a0244568285bc859f69dfbd" @@ -4514,6 +4693,17 @@ browserslist@^4.12.0: node-releases "^1.1.53" pkg-up "^2.0.0" +browserslist@^4.14.5, browserslist@^4.16.3: + version "4.16.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" + integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== + dependencies: + caniuse-lite "^1.0.30001181" + colorette "^1.2.1" + electron-to-chromium "^1.3.649" + escalade "^3.1.1" + node-releases "^1.1.70" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -4723,6 +4913,11 @@ caniuse-lite@^1.0.30001109: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001162.tgz#9f83aad1f42539ce9aab58bb177598f2f8e22ec6" integrity sha512-E9FktFxaNnp4ky3ucIGzEXLM+Knzlpuq1oN1sFAU0KeayygabGTmOsndpo8QrL4D9pcThlf4D2pUKaDxPCUmVw== +caniuse-lite@^1.0.30001181: + version "1.0.30001202" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001202.tgz#4cb3bd5e8a808e8cd89e4e66c549989bc8137201" + integrity sha512-ZcijQNqrcF8JNLjzvEiXqX4JUYxoZa7Pvcsd9UD8Kz4TvhTonOSNRsK+qtvpVL4l6+T1Rh4LFtLfnNWg6BGWCQ== + capture-exit@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" @@ -5359,6 +5554,14 @@ core-js-compat@^3.6.2: browserslist "^4.8.3" semver "7.0.0" +core-js-compat@^3.8.1: + version "3.9.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.9.1.tgz#4e572acfe90aff69d76d8c37759d21a5c59bb455" + integrity sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA== + dependencies: + browserslist "^4.16.3" + semver "7.0.0" + core-js@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" @@ -5975,6 +6178,11 @@ electron-to-chromium@^1.3.413: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.473.tgz#d0cd5fe391046fb70674ec98149f0f97609d29b8" integrity sha512-smevlzzMNz3vMz6OLeeCq5HRWEj2AcgccNPYnAx4Usx0IOciq9DU36RJcICcS09hXoY7t7deRfVYKD14IrGb9A== +electron-to-chromium@^1.3.649: + version "1.3.691" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.691.tgz#a671eaf135a3ccec0915eb8d844a0952aba79f3b" + integrity sha512-ZqiO69KImmOGCyoH0icQPU3SndJiW93juEvf63gQngyhODO6SpQIPMTOHldtCs5DS5GMKvAkquk230E2zt2vpw== + elliptic@^6.0.0: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -6208,34 +6416,35 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, semver "^5.5.0" ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.2, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.4.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: - version "7.23.1" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.23.1.tgz#d1517228ede08a5d4b045c78a7429728e956b30b" - integrity sha512-qYggmt3hRs6QJ6cRkww3ahMpyP8IEV2KFrIRO/Z6hu9MkE/8Y28Xd5NjQl6fPV3oLoG0vwuHzhNe3Jr7Wec8zw== + version "7.25.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.25.0.tgz#14a347cf52bc99648229b4b2a445c98b6390368a" + integrity sha512-pBCtTTyle0UwdbwQ7gg7zsrG8Rg7dnK1saMoE4hv9iBL01uU+RhErlFrKtaTf6OOIpQM2Ri1zO6Tb3kJMbD6sg== dependencies: "@babel/core" "^7.12.0" "@babel/helper-compilation-targets" "^7.12.0" - "@babel/plugin-proposal-class-properties" "^7.10.4" - "@babel/plugin-proposal-decorators" "^7.10.5" - "@babel/plugin-transform-modules-amd" "^7.10.5" - "@babel/plugin-transform-runtime" "^7.12.0" - "@babel/plugin-transform-typescript" "^7.12.0" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-decorators" "^7.13.5" + "@babel/plugin-transform-modules-amd" "^7.13.0" + "@babel/plugin-transform-runtime" "^7.13.9" + "@babel/plugin-transform-typescript" "^7.13.0" "@babel/polyfill" "^7.11.5" "@babel/preset-env" "^7.12.0" - "@babel/runtime" "^7.12.0" - amd-name-resolver "^1.2.1" - babel-plugin-debug-macros "^0.3.3" + "@babel/runtime" "7.12.18" + amd-name-resolver "^1.3.1" + babel-plugin-debug-macros "^0.3.4" babel-plugin-ember-data-packages-polyfill "^0.1.2" - babel-plugin-ember-modules-api-polyfill "^3.2.1" - babel-plugin-module-resolver "^3.1.1" + babel-plugin-ember-modules-api-polyfill "^3.5.0" + babel-plugin-module-resolver "^3.2.0" broccoli-babel-transpiler "^7.8.0" broccoli-debug "^0.6.4" - broccoli-funnel "^2.0.1" - broccoli-source "^1.1.0" + broccoli-funnel "^2.0.2" + broccoli-source "^2.1.2" clone "^2.1.2" ember-cli-babel-plugin-helpers "^1.1.1" ember-cli-version-checker "^4.1.0" ensure-posix-path "^1.0.2" fixturify-project "^1.10.0" + resolve-package-path "^3.1.0" rimraf "^3.0.1" semver "^5.5.0" @@ -7060,10 +7269,10 @@ ember-rfc176-data@^0.3.13, ember-rfc176-data@^0.3.15: resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.15.tgz#af3f1da5a0339b6feda380edc2f7190e0f416c2d" integrity sha512-GPKa7zRDBblRy0orxTXt5yrpp/Pf5CkuRFSIR8qMFDww0CqCKjCRwdZnWYzCM4kAEfZnXRIDDefe1tBaFw7v7w== -ember-rfc176-data@^0.3.16: - version "0.3.16" - resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.16.tgz#2ace0ac9cf9016d493a74a1d931643a308679803" - integrity sha512-IYAzffS90r2ybAcx8c2qprYfkxa70G+/UPkxMN1hw55DU5S2aLOX6v3umKDZItoRhrvZMCnzwsdfKSrKdC9Wbg== +ember-rfc176-data@^0.3.17: + version "0.3.17" + resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.17.tgz#d4fc6c33abd6ef7b3440c107a28e04417b49860a" + integrity sha512-EVzTTKqxv9FZbEh6Ktw56YyWRAA0MijKvl7H8C06wVF+8f/cRRz3dXxa4nkwjzyVwx4rzKGuIGq77hxJAQhWWw== ember-router-generator@^2.0.0: version "2.0.0" @@ -7378,6 +7587,11 @@ es6-promise@^4.0.3: resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + escape-html@1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -10201,6 +10415,11 @@ lodash.debounce@^3.1.1: dependencies: lodash._getnative "^3.0.0" +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + lodash.defaults@^4.0.1, lodash.defaults@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" @@ -11162,6 +11381,11 @@ node-releases@^1.1.53: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.58.tgz#8ee20eef30fa60e52755fcc0942def5a734fe935" integrity sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg== +node-releases@^1.1.70: + version "1.1.71" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" + integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== + node-uuid@~1.4.0: version "1.4.8" resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" @@ -12996,7 +13220,7 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== From 9f6c2c54e0c360f59a91e265f7d8ee2d60ddd184 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 18 Mar 2021 06:46:46 +0000 Subject: [PATCH 774/879] build(deps-dev): bump ember-cli-htmlbars from 5.6.5 to 5.7.0 Bumps [ember-cli-htmlbars](https://github.com/ember-cli/ember-cli-htmlbars) from 5.6.5 to 5.7.0. - [Release notes](https://github.com/ember-cli/ember-cli-htmlbars/releases) - [Changelog](https://github.com/ember-cli/ember-cli-htmlbars/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-cli-htmlbars/compare/v5.6.5...v5.7.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/yarn.lock b/yarn.lock index 8a03333d7..736a6f13e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3204,10 +3204,10 @@ babel-plugin-htmlbars-inline-precompile@^3.2.0: resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-3.2.0.tgz#c4882ea875d0f5683f0d91c1f72e29a4f14b5606" integrity sha512-IUeZmgs9tMUGXYu1vfke5I18yYJFldFGdNFQOWslXTnDWXzpwPih7QFduUqvT+awDpDuNtXpdt5JAf43Q1Hhzg== -babel-plugin-htmlbars-inline-precompile@^4.4.5: - version "4.4.5" - resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-4.4.5.tgz#ca0fc6ea49fe13b0a91ff995ee381d33d421a4ef" - integrity sha512-7qnZTDm9uUQppOmEWjAyIPTQ54akEdd9PCIfbTJ8HNgUdekeKC+24uwd+M1ZTjUItby1iLy9maQOK3Wv9RjWJA== +babel-plugin-htmlbars-inline-precompile@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-5.0.0.tgz#b3a3008bdedbd3543e745fc953769cc10d4a7021" + integrity sha512-ZPIV7zVwVcwRyTWCp29HSwIPcvqX7PoslpKlNu53AzAx5X4QBwuMb9fFsUYY3JcriNZb5xWFOM4AE95XW0UYeA== dependencies: babel-plugin-ember-modules-api-polyfill "^3.4.0" @@ -6639,17 +6639,18 @@ ember-cli-htmlbars@^4.2.3: walk-sync "^2.0.2" ember-cli-htmlbars@^5.0.0, ember-cli-htmlbars@^5.2.0, ember-cli-htmlbars@^5.3.1: - version "5.6.5" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.6.5.tgz#15a55e4e4f47869a5e95a1e49813f77fd22fb76e" - integrity sha512-Wl3AntESMmQoG//yKuu+/7qAOznYAwRgWU8ZOCOPaGdPFaFXD6SPd2SKpRW4BEox5KLBJZFH0e7b9m78IAzcUw== + version "5.7.0" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.7.0.tgz#ca10ab2716d7ee7ba08c6514868c69b46b7cc10d" + integrity sha512-Cda9caL1hgd7tOFH7ab1h8WXe9WxChmv766tMb6yunQuzaHLhn/E3NrNJB6TpqosfQH8nIo8TzqWTPRwJbRq2w== dependencies: "@ember/edition-utils" "^1.2.0" - babel-plugin-htmlbars-inline-precompile "^4.4.5" + babel-plugin-htmlbars-inline-precompile "^5.0.0" broccoli-debug "^0.6.5" broccoli-persistent-filter "^3.1.2" broccoli-plugin "^4.0.3" common-tags "^1.8.0" ember-cli-babel-plugin-helpers "^1.1.1" + ember-cli-version-checker "^5.1.2" fs-tree-diff "^2.0.1" hash-for-dep "^1.5.1" heimdalljs-logger "^0.1.10" @@ -6868,13 +6869,13 @@ ember-cli-version-checker@^4.1.0: semver "^6.3.0" silent-error "^1.1.1" -ember-cli-version-checker@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-5.1.1.tgz#3185c526c14671609cbd22ab0d0925787fc84f3d" - integrity sha512-YziSW1MgOuVdJSyUY2CKSC4vXrGQIHF6FgygHkJOxYGjZNQYwf5MK0sbliKatvJf7kzDSnXs+r8JLrD74W/A8A== +ember-cli-version-checker@^5.1.1, ember-cli-version-checker@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-5.1.2.tgz#649c7b6404902e3b3d69c396e054cea964911ab0" + integrity sha512-rk7GY+FmLn/2e22HsZs0Ycrz8HQ1W3Fv+2TFOuEFW9optnDXDgkntPBIl6gact/LHsfBM5RKbM3dHsIIeLgl0Q== dependencies: - resolve-package-path "^2.0.0" - semver "^7.3.2" + resolve-package-path "^3.1.0" + semver "^7.3.4" silent-error "^1.1.1" ember-cli@~3.4.4: From fd8e0b3cd9953741a54a15827ffbe5ded00d77ae Mon Sep 17 00:00:00 2001 From: Jason Williams Date: Thu, 18 Mar 2021 15:37:23 -0600 Subject: [PATCH 775/879] Fix typo in docs --- .../app/pods/docs/data-layer/serializers/index/template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dummy/app/pods/docs/data-layer/serializers/index/template.md b/tests/dummy/app/pods/docs/data-layer/serializers/index/template.md index 3eb7e91b7..9989afd04 100644 --- a/tests/dummy/app/pods/docs/data-layer/serializers/index/template.md +++ b/tests/dummy/app/pods/docs/data-layer/serializers/index/template.md @@ -41,7 +41,7 @@ If you are starting a new app, it's recommended that you choose a JSON:API imple If your app does use JSON:API, Mirage ships with a `JSONAPISerializer` that will do the heavy lifting for you. -Mirage also ships with two other named serializers, `ActiveModelSerializer` and `RestSerializer`, that match two other popular backend formats. `EmberDataSerializer` is also provided as a variation to the `RestSerializer` that uses the `primaryKey` and `attrs` defined in your applciations ember data serializers, similar to how models are auto discovered. See the section on {{docs-link 'Ember Data Serializer' 'docs.data-layer.serializers.ember-data-serializer'}} for more information. +Mirage also ships with two other named serializers, `ActiveModelSerializer` and `RestSerializer`, that match two other popular backend formats. `EmberDataSerializer` is also provided as a variation to the `RestSerializer` that uses the `primaryKey` and `attrs` defined in your applications ember data serializers, similar to how models are auto discovered. See the section on {{docs-link 'Ember Data Serializer' 'docs.data-layer.serializers.ember-data-serializer'}} for more information. If your backend uses a different format, you'll need to choose the closest one and customize it to match your production format. We'll talk about that later in this guide. From c1624db3f1a7ee0fa370ac5acd6a95997f7a25ea Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 19 Mar 2021 06:33:00 +0000 Subject: [PATCH 776/879] build(deps-dev): bump ember-cli-htmlbars from 5.7.0 to 5.7.1 Bumps [ember-cli-htmlbars](https://github.com/ember-cli/ember-cli-htmlbars) from 5.7.0 to 5.7.1. - [Release notes](https://github.com/ember-cli/ember-cli-htmlbars/releases) - [Changelog](https://github.com/ember-cli/ember-cli-htmlbars/blob/master/CHANGELOG.md) - [Commits](https://github.com/ember-cli/ember-cli-htmlbars/compare/v5.7.0...v5.7.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 736a6f13e..d7f070a15 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6639,9 +6639,9 @@ ember-cli-htmlbars@^4.2.3: walk-sync "^2.0.2" ember-cli-htmlbars@^5.0.0, ember-cli-htmlbars@^5.2.0, ember-cli-htmlbars@^5.3.1: - version "5.7.0" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.7.0.tgz#ca10ab2716d7ee7ba08c6514868c69b46b7cc10d" - integrity sha512-Cda9caL1hgd7tOFH7ab1h8WXe9WxChmv766tMb6yunQuzaHLhn/E3NrNJB6TpqosfQH8nIo8TzqWTPRwJbRq2w== + version "5.7.1" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.7.1.tgz#eb5b88c7d9083bc27665fb5447a9b7503b32ce4f" + integrity sha512-9laCgL4tSy48orNoQgQKEHp93MaqAs9ZOl7or5q+8iyGGJHW6sVXIYrVv5/5O9HfV6Ts8/pW1rSoaeKyLUE+oA== dependencies: "@ember/edition-utils" "^1.2.0" babel-plugin-htmlbars-inline-precompile "^5.0.0" From a378060804abab1c9cc3520f84f06bbe3fc63b5f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 19 Mar 2021 06:33:59 +0000 Subject: [PATCH 777/879] build(deps): bump ember-cli-babel from 7.25.0 to 7.26.1 Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 7.25.0 to 7.26.1. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v7.25.0...v7.26.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index d7f070a15..cdd6fe222 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6416,9 +6416,9 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, semver "^5.5.0" ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.2, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.4.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: - version "7.25.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.25.0.tgz#14a347cf52bc99648229b4b2a445c98b6390368a" - integrity sha512-pBCtTTyle0UwdbwQ7gg7zsrG8Rg7dnK1saMoE4hv9iBL01uU+RhErlFrKtaTf6OOIpQM2Ri1zO6Tb3kJMbD6sg== + version "7.26.1" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.1.tgz#d3f06bd9aec8aac9197c5ff4d0b87ff1e4f0d62a" + integrity sha512-WEWP3hJSe9CWL22gEWQ+Y3uKMGk1vLoIREUQfJNKrgUUh3l49bnfAamh3ywcAQz31IgzvkLPO8ZTXO4rxnuP4Q== dependencies: "@babel/core" "^7.12.0" "@babel/helper-compilation-targets" "^7.12.0" From 8933b6094137673e8f017f152f31b5a08678aae9 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 22 Mar 2021 06:57:50 +0000 Subject: [PATCH 778/879] build(deps): bump ember-cli-babel from 7.26.1 to 7.26.2 Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 7.26.1 to 7.26.2. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v7.26.1...v7.26.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index cdd6fe222..89e119368 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6416,9 +6416,9 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, semver "^5.5.0" ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.2, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.4.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: - version "7.26.1" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.1.tgz#d3f06bd9aec8aac9197c5ff4d0b87ff1e4f0d62a" - integrity sha512-WEWP3hJSe9CWL22gEWQ+Y3uKMGk1vLoIREUQfJNKrgUUh3l49bnfAamh3ywcAQz31IgzvkLPO8ZTXO4rxnuP4Q== + version "7.26.2" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.2.tgz#497985e741ffcc08f89f98c9464509e91cdb2809" + integrity sha512-bSSlFbUBfLwaabGpLgoLkOKMIdDRWu3cPBNrN2UQXfzlPei3nZblDatSzPbCZ7O5faJHRi13ra3Q4odnCoBtTg== dependencies: "@babel/core" "^7.12.0" "@babel/helper-compilation-targets" "^7.12.0" From eed62f0c28ad93fe8a99257b06ca6d4416e3795d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 24 Mar 2021 06:55:01 +0000 Subject: [PATCH 779/879] build(deps): bump ember-auto-import from 1.10.1 to 1.11.0 Bumps [ember-auto-import](https://github.com/ef4/ember-auto-import) from 1.10.1 to 1.11.0. - [Release notes](https://github.com/ef4/ember-auto-import/releases) - [Changelog](https://github.com/ef4/ember-auto-import/blob/master/CHANGELOG.md) - [Commits](https://github.com/ef4/ember-auto-import/compare/v1.10.1...v1.11.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 35 ++++++----------------------------- 1 file changed, 6 insertions(+), 29 deletions(-) diff --git a/yarn.lock b/yarn.lock index 89e119368..0c914da56 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1236,22 +1236,7 @@ "@babel/parser" "^7.8.6" "@babel/types" "^7.8.6" -"@babel/traverse@^7.1.6", "@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.5", "@babel/traverse@^7.12.9", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.6": - version "7.12.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.9.tgz#fad26c972eabbc11350e0b695978de6cc8e8596f" - integrity sha512-iX9ajqnLdoU1s1nHt36JDI9KG4k+vmI8WgjK5d+aDTwQbL2fUnzedNedssA645Ede3PM2ma1n8Q4h2ohwXgMXw== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.12.7" - "@babel/types" "^7.12.7" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.19" - -"@babel/traverse@^7.13.0": +"@babel/traverse@^7.1.6", "@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.5", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.6": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.0.tgz#6d95752475f86ee7ded06536de309a65fc8966cc" integrity sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ== @@ -1266,16 +1251,7 @@ globals "^11.1.0" lodash "^4.17.19" -"@babel/types@^7.1.6", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.7.2", "@babel/types@^7.8.3", "@babel/types@^7.8.6": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.7.tgz#6039ff1e242640a29452c9ae572162ec9a8f5d13" - integrity sha512-MNyI92qZq6jrQkXvtIiykvl4WtoRrVV9MPn+ZfsoEENjiWcBQ3ZSHrkxnJWgWtLX3XXqX5hrSQ+X69wkmesXuQ== - dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.19" - to-fast-properties "^2.0.0" - -"@babel/types@^7.12.13", "@babel/types@^7.13.0": +"@babel/types@^7.1.6", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.13.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.7.2", "@babel/types@^7.8.3", "@babel/types@^7.8.6": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.0.tgz#74424d2816f0171b4100f0ab34e9a374efdf7f80" integrity sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA== @@ -6236,9 +6212,9 @@ ember-assign-polyfill@^2.5.0, ember-assign-polyfill@^2.6.0: ember-cli-version-checker "^2.0.0" ember-auto-import@^1.2.19, ember-auto-import@^1.5.3, ember-auto-import@^1.6.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.10.1.tgz#6c93a875e494aa0a58b759867d3f20adfd514ae3" - integrity sha512-7bOWzPELlVwdWDOkB+phDIjg8BNW+/2RiLLQ+Xa/eIvCLT4ABYhHV5wqW5gs5BnXTDVLfE4ddKZdllnGuPGGDQ== + version "1.11.0" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.11.0.tgz#ab499f91de4e7155b0f96b519ec186a2852c0ce5" + integrity sha512-XCnj5OOWIrkepR2EWWv3LPmyjHbHW0q8ZspSuziE4Qp19tBi9ER/klTbSpkad/i/WTeMEuA22MdN8mbPlv/sCw== dependencies: "@babel/core" "^7.1.6" "@babel/preset-env" "^7.10.2" @@ -6252,6 +6228,7 @@ ember-auto-import@^1.2.19, ember-auto-import@^1.5.3, ember-auto-import@^1.6.0: broccoli-debug "^0.6.4" broccoli-node-api "^1.7.0" broccoli-plugin "^4.0.0" + broccoli-source "^3.0.0" debug "^3.1.0" ember-cli-babel "^7.0.0" enhanced-resolve "^4.0.0" From 351b66983c76d0e0684b1058380c0429307d52e5 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 25 Mar 2021 06:34:58 +0000 Subject: [PATCH 780/879] build(deps): bump ember-auto-import from 1.11.0 to 1.11.2 Bumps [ember-auto-import](https://github.com/ef4/ember-auto-import) from 1.11.0 to 1.11.2. - [Release notes](https://github.com/ef4/ember-auto-import/releases) - [Changelog](https://github.com/ef4/ember-auto-import/blob/master/CHANGELOG.md) - [Commits](https://github.com/ef4/ember-auto-import/compare/v1.11.0...v1.11.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 0c914da56..e728d21c5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6212,9 +6212,9 @@ ember-assign-polyfill@^2.5.0, ember-assign-polyfill@^2.6.0: ember-cli-version-checker "^2.0.0" ember-auto-import@^1.2.19, ember-auto-import@^1.5.3, ember-auto-import@^1.6.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.11.0.tgz#ab499f91de4e7155b0f96b519ec186a2852c0ce5" - integrity sha512-XCnj5OOWIrkepR2EWWv3LPmyjHbHW0q8ZspSuziE4Qp19tBi9ER/klTbSpkad/i/WTeMEuA22MdN8mbPlv/sCw== + version "1.11.2" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.11.2.tgz#b6e9a0dddd88a10692830ffa4f5dfd8c137c8919" + integrity sha512-Sm0x9qgAQEx+XSYeh5zeKj89Uo0c7XzULZxuziFPxbhtKy/G4pywhBuQ7EgDznTj8IZVxOdfe4ufcUxnJtbSgg== dependencies: "@babel/core" "^7.1.6" "@babel/preset-env" "^7.10.2" From 32c6d28fa354cd3756fa9f25c6b91a87bf79551e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 25 Mar 2021 16:31:01 +0100 Subject: [PATCH 781/879] build(deps-dev): bump ember-source from 3.20.4 to 3.26.1 (#2148) Bumps [ember-source](https://github.com/emberjs/ember.js) from 3.20.4 to 3.26.1. - [Release notes](https://github.com/emberjs/ember.js/releases) - [Changelog](https://github.com/emberjs/ember.js/blob/v3.26.1/CHANGELOG.md) - [Commits](https://github.com/emberjs/ember.js/compare/v3.20.4...v3.26.1) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 55 ++++++++++++++++++++-------------------------------- 2 files changed, 22 insertions(+), 35 deletions(-) diff --git a/package.json b/package.json index 87d39e4e6..4c153e435 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "ember-moment": "^8.0.0", "ember-qunit": "^4.6.0", "ember-resolver": "^8.0.2", - "ember-source": "~3.20.0", + "ember-source": "~3.26.1", "ember-source-channel-url": "^3.0.0", "ember-try": "^1.0.0", "escape-string-regexp": "^4.0.0", diff --git a/yarn.lock b/yarn.lock index e728d21c5..13960c0ce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -269,27 +269,13 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-module-imports@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz#1644c01591a15a2f084dd6d092d9430eb1d1216c" - integrity sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA== - dependencies: - "@babel/types" "^7.12.1" - -"@babel/helper-module-imports@^7.12.13": +"@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.8.3": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0" integrity sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g== dependencies: "@babel/types" "^7.12.13" -"@babel/helper-module-imports@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" - integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== - dependencies: - "@babel/types" "^7.10.4" - "@babel/helper-module-transforms@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" @@ -815,20 +801,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-block-scoping@^7.12.1": +"@babel/plugin-transform-block-scoping@^7.12.1", "@babel/plugin-transform-block-scoping@^7.6.2", "@babel/plugin-transform-block-scoping@^7.8.3": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz#f0ee727874b42a208a48a586b84c3d222c2bbef1" integrity sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-block-scoping@^7.6.2", "@babel/plugin-transform-block-scoping@^7.8.3": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.5.tgz#b81b8aafefbfe68f0f65f7ef397b9ece68a6037d" - integrity sha512-6Ycw3hjpQti0qssQcA6AMSFDHeNJ++R6dIMnpRqUjFeBBTmTDPa8zgF90OVfTvAo11mXZTlVUViY1g8ffrURLg== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-classes@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz#65e650fcaddd3d88ddce67c0f834a3d436a32db6" @@ -1665,6 +1644,13 @@ "@glimmer/interfaces" "^0.61.2" "@simple-dom/interface" "^1.4.0" +"@glimmer/vm-babel-plugins@0.77.5": + version "0.77.5" + resolved "https://registry.yarnpkg.com/@glimmer/vm-babel-plugins/-/vm-babel-plugins-0.77.5.tgz#daffb6507aa6b08ec36f69d652897d339fdd0007" + integrity sha512-jTBM7fJMrIEy4/bCeI8e7ypR+AuWYzLA+KORCGbnTJtL/NYg4G8qwhQAZBtg1d3KmoqyqaCsyqE6f4/tzJO4eQ== + dependencies: + babel-plugin-debug-macros "^0.3.4" + "@glimmer/vm@^0.42.2": version "0.42.2" resolved "https://registry.yarnpkg.com/@glimmer/vm/-/vm-0.42.2.tgz#492a4f05eac587c3a37371b3c62593f20bef553d" @@ -7284,15 +7270,16 @@ ember-source-channel-url@^3.0.0: dependencies: node-fetch "^2.6.0" -ember-source@~3.20.0: - version "3.20.4" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.20.4.tgz#582545ae3b20de5ffd9f8b43c42c94815e592291" - integrity sha512-ycWlaq7W63S3Nh7pMRU4oXNirBB9MbNGDN6hUgs3/qc1gjOUVGfGv0p2NPVcKXgqWtbiqrWGqCbp1iTay2MUpA== +ember-source@~3.26.1: + version "3.26.1" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.26.1.tgz#8c9e8a314fb0da447b944d64f9d92a80a628d7b5" + integrity sha512-5/NATBo5h9m1N52ITVksmjtGlYhGHLl4lDErAWv5/DC9zYe9ZR93NtymR6PEqrRilXc2x0KWd3NlOsWUoJRUOw== dependencies: "@babel/helper-module-imports" "^7.8.3" "@babel/plugin-transform-block-scoping" "^7.8.3" "@babel/plugin-transform-object-assign" "^7.8.3" "@ember/edition-utils" "^1.2.0" + "@glimmer/vm-babel-plugins" "0.77.5" babel-plugin-debug-macros "^0.3.3" babel-plugin-filter-imports "^4.0.0" broccoli-concat "^4.2.4" @@ -7300,7 +7287,7 @@ ember-source@~3.20.0: broccoli-funnel "^2.0.2" broccoli-merge-trees "^4.2.0" chalk "^4.0.0" - ember-cli-babel "^7.19.0" + ember-cli-babel "^7.23.0" ember-cli-get-component-path-option "^1.0.0" ember-cli-is-package-missing "^1.0.0" ember-cli-normalize-entity-name "^1.0.0" @@ -7309,9 +7296,9 @@ ember-source@~3.20.0: ember-cli-version-checker "^5.1.1" ember-router-generator "^2.0.0" inflection "^1.12.0" - jquery "^3.5.0" + jquery "^3.5.1" resolve "^1.17.0" - semver "^6.1.1" + semver "^7.3.4" silent-error "^1.1.1" ember-svg-jar@^2.2.3: @@ -9885,10 +9872,10 @@ jquery-deferred@^0.3.0: resolved "https://registry.yarnpkg.com/jquery-deferred/-/jquery-deferred-0.3.1.tgz#596eca1caaff54f61b110962b23cafea74c35355" integrity sha1-WW7KHKr/VPYbEQlisjyv6nTDU1U= -jquery@^3.4.1, jquery@^3.5.0: - version "3.5.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.1.tgz#d7b4d08e1bfdb86ad2f1a3d039ea17304717abb5" - integrity sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg== +jquery@^3.4.1, jquery@^3.5.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470" + integrity sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw== js-reporters@1.2.3: version "1.2.3" From cccc9fbbea4af9a091973e0e6d3808c7224de4f3 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 25 Mar 2021 16:31:22 +0100 Subject: [PATCH 782/879] build(deps): bump @embroider/macros from 0.33.0 to 0.37.0 (#2136) Bumps [@embroider/macros](https://github.com/embroider-build/embroider/tree/HEAD/packages/macros) from 0.33.0 to 0.37.0. - [Release notes](https://github.com/embroider-build/embroider/releases) - [Changelog](https://github.com/embroider-build/embroider/blob/master/CHANGELOG.md) - [Commits](https://github.com/embroider-build/embroider/commits/v0.37.0/packages/macros) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 4c153e435..107efbe0c 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "prepare": "./scripts/link.sh" }, "dependencies": { - "@embroider/macros": "^0.33.0", + "@embroider/macros": "^0.37.0", "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^3.0.3", "broccoli-merge-trees": "^4.2.0", diff --git a/yarn.lock b/yarn.lock index 13960c0ce..e6d66ce3f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1528,7 +1528,46 @@ walk-sync "^1.1.3" wrap-legacy-hbs-plugin-if-needed "^1.0.1" -"@embroider/macros@0.33.0", "@embroider/macros@^0.33.0": +"@embroider/core@0.37.0": + version "0.37.0" + resolved "https://registry.yarnpkg.com/@embroider/core/-/core-0.37.0.tgz#bd7a7d63795794ffcd53d90a65b81e939ccf6cff" + integrity sha512-tkXD7qV9GJYb7cGlxLT4PTbPZ+B4vNDXp5oHyEz8EQSuZExN/40Hm90S5KrEC++TpqeVewSIXOz/fA53lkK6RQ== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.12.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.12.1" + "@babel/runtime" "^7.12.5" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + "@embroider/macros" "0.37.0" + assert-never "^1.1.0" + babel-plugin-syntax-dynamic-import "^6.18.0" + broccoli-node-api "^1.7.0" + broccoli-persistent-filter "^3.1.2" + broccoli-plugin "^4.0.1" + broccoli-source "^3.0.0" + debug "^3.1.0" + escape-string-regexp "^4.0.0" + fast-sourcemap-concat "^1.4.0" + filesize "^4.1.2" + fs-extra "^7.0.1" + fs-tree-diff "^2.0.0" + handlebars "^4.4.2" + js-string-escape "^1.0.1" + jsdom "^16.4.0" + json-stable-stringify "^1.0.1" + lodash "^4.17.10" + pkg-up "^3.1.0" + resolve "^1.8.1" + resolve-package-path "^1.2.2" + semver "^7.3.2" + strip-bom "^3.0.0" + typescript-memoize "^1.0.0-alpha.3" + walk-sync "^1.1.3" + wrap-legacy-hbs-plugin-if-needed "^1.0.1" + +"@embroider/macros@0.33.0": version "0.33.0" resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.33.0.tgz#d5826ea7565bb69b57ba81ed528315fe77acbf9d" integrity sha512-nl/1zRn+Wd3MO8Bb+YPqHmFl/2vwQLTsEB6Zt+K9bWXsM/kA+dPCeeCReLN6PbkMP16xxqtNSIrQ8Y49hnWjpg== @@ -1543,6 +1582,21 @@ resolve "^1.8.1" semver "^7.3.2" +"@embroider/macros@0.37.0", "@embroider/macros@^0.37.0": + version "0.37.0" + resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.37.0.tgz#221013fc5bc0eaa78f1de98802fc03e588bfe1b1" + integrity sha512-VItxn4NzGR5prryXGbPGTuLMd+QPPKvAYZv2357iS+wmz6mTzC5nqXljwDQIOJbAji9giDO+FW2HzXYOcY3teQ== + dependencies: + "@babel/core" "^7.12.3" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + "@embroider/core" "0.37.0" + assert-never "^1.1.0" + ember-cli-babel "^7.23.0" + lodash "^4.17.10" + resolve "^1.8.1" + semver "^7.3.2" + "@fullhuman/postcss-purgecss@^2.1.2": version "2.3.0" resolved "https://registry.yarnpkg.com/@fullhuman/postcss-purgecss/-/postcss-purgecss-2.3.0.tgz#50a954757ec78696615d3e118e3fee2d9291882e" From 05abc81325e2915b7cc80fd7a13cac980ea3bd08 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 25 Mar 2021 16:31:40 +0100 Subject: [PATCH 783/879] build(deps-dev): bump js-yaml from 3.14.1 to 4.0.0 (#2103) Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 3.14.1 to 4.0.0. - [Release notes](https://github.com/nodeca/js-yaml/releases) - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/3.14.1...4.0.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 107efbe0c..eba216aca 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "eslint-plugin-node": "^11.0.0", "faker": "^5.1.0", "fastboot": "^3.0.2", - "js-yaml": "^3.12.1", + "js-yaml": "^4.0.0", "jsdom": "^16.2.2", "loader.js": "^4.7.0", "qunit-dom": "^1.1.0" diff --git a/yarn.lock b/yarn.lock index e6d66ce3f..cf0c5a1da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2702,6 +2702,11 @@ argparse@^1.0.7, argparse@~1.0.2: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -9951,7 +9956,7 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@^3.12.0, js-yaml@^3.12.1, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.2.5, js-yaml@^3.2.7: +js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.2.5, js-yaml@^3.2.7: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -9959,6 +9964,13 @@ js-yaml@^3.12.0, js-yaml@^3.12.1, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.2 argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" + integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== + dependencies: + argparse "^2.0.1" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" From 57147deb1ca3994ab0b454c6079e3fb77f0febbf Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Thu, 25 Mar 2021 16:37:18 +0100 Subject: [PATCH 784/879] v2.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index eba216aca..973e826f6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "2.0.1", + "version": "2.1.0", "description": "A client-side server to help you build, test and demo your Ember app", "keywords": [ "ember-addon", From 8b13babb3892ef4ace0d4c93914673fbe2342a28 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 26 Mar 2021 06:20:33 +0000 Subject: [PATCH 785/879] build(deps-dev): bump faker from 5.4.0 to 5.5.0 Bumps [faker](https://github.com/Marak/Faker.js) from 5.4.0 to 5.5.0. - [Release notes](https://github.com/Marak/Faker.js/releases) - [Changelog](https://github.com/Marak/faker.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/Marak/Faker.js/commits/v5.5.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index cf0c5a1da..b6978d50e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8104,9 +8104,9 @@ fake-xml-http-request@^2.1.1: integrity sha512-Kn2WYYS6cDBS5jq/voOfSGCA0TafOYAUPbEp8mUVpD/DVV5bQIDjlq+MLLvNUokkbTpjBVlLDaM5PnX+PwZMlw== faker@^5.1.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/faker/-/faker-5.4.0.tgz#f18e55993c6887918182b003d163df14daeb3011" - integrity sha512-Y9n/Ky/xZx/Bj8DePvXspUYRtHl/rGQytoIT5LaxmNwSe3wWyOeOXb3lT6Dpipq240PVpeFaGKzScz/5fvff2g== + version "5.5.0" + resolved "https://registry.yarnpkg.com/faker/-/faker-5.5.0.tgz#17922f6252cd44c732943c89c2f0f0c7e189ffe3" + integrity sha512-2pPfgmRCfMDRJy8koo5WSEXVHpRdYSs04Iis/kCamSg5nnXyknArW1t4phpJXy2/LIr0C7cys/+IiIQLLU/KCw== fast-deep-equal@^3.1.1: version "3.1.1" From 3c0452cfdda07b0a17b07542cd5694b0acc6af92 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 29 Mar 2021 07:36:45 +0000 Subject: [PATCH 786/879] build(deps-dev): bump faker from 5.5.0 to 5.5.1 Bumps [faker](https://github.com/Marak/Faker.js) from 5.5.0 to 5.5.1. - [Release notes](https://github.com/Marak/Faker.js/releases) - [Changelog](https://github.com/Marak/faker.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/Marak/Faker.js/compare/v5.5.0...v5.5.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index b6978d50e..e6279b956 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8104,9 +8104,9 @@ fake-xml-http-request@^2.1.1: integrity sha512-Kn2WYYS6cDBS5jq/voOfSGCA0TafOYAUPbEp8mUVpD/DVV5bQIDjlq+MLLvNUokkbTpjBVlLDaM5PnX+PwZMlw== faker@^5.1.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/faker/-/faker-5.5.0.tgz#17922f6252cd44c732943c89c2f0f0c7e189ffe3" - integrity sha512-2pPfgmRCfMDRJy8koo5WSEXVHpRdYSs04Iis/kCamSg5nnXyknArW1t4phpJXy2/LIr0C7cys/+IiIQLLU/KCw== + version "5.5.1" + resolved "https://registry.yarnpkg.com/faker/-/faker-5.5.1.tgz#30e4e8ba15c8c08d0494ba935f247d8e2469675d" + integrity sha512-JCFXcVesClQ6RlSWmBMFQmGDAZq6hjbJAFgKALx31uPaQC6p3SWT2ojaJGD8bMQri+8VNqDOkI2F8QC+ABvZng== fast-deep-equal@^3.1.1: version "3.1.1" From 0c0e1fa0eaa3e42c23c109ce52521e46b3488570 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 29 Mar 2021 07:37:33 +0000 Subject: [PATCH 787/879] build(deps): bump ember-cli-babel from 7.26.2 to 7.26.3 Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 7.26.2 to 7.26.3. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v7.26.2...v7.26.3) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index e6279b956..f03d9b593 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6438,9 +6438,9 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, semver "^5.5.0" ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.2, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.4.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: - version "7.26.2" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.2.tgz#497985e741ffcc08f89f98c9464509e91cdb2809" - integrity sha512-bSSlFbUBfLwaabGpLgoLkOKMIdDRWu3cPBNrN2UQXfzlPei3nZblDatSzPbCZ7O5faJHRi13ra3Q4odnCoBtTg== + version "7.26.3" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.3.tgz#e93ce7ec458208894d10844cf76e41cc06fdbeb6" + integrity sha512-ZCs0g99d3kYaHs1+HT33oMY7/K+nLCAAv7dCLxsMzg7cQf55O6Pq4ZKnWEr3IHVs33xbJFnEb9prt1up36QVnw== dependencies: "@babel/core" "^7.12.0" "@babel/helper-compilation-targets" "^7.12.0" From 5e3718f7e4644537daf79e184c20106616f35f4f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 29 Mar 2021 07:38:48 +0000 Subject: [PATCH 788/879] build(deps-dev): bump jsdom from 16.5.1 to 16.5.2 Bumps [jsdom](https://github.com/jsdom/jsdom) from 16.5.1 to 16.5.2. - [Release notes](https://github.com/jsdom/jsdom/releases) - [Changelog](https://github.com/jsdom/jsdom/blob/master/Changelog.md) - [Commits](https://github.com/jsdom/jsdom/compare/16.5.1...16.5.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/yarn.lock b/yarn.lock index f03d9b593..3af70da8e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2525,10 +2525,10 @@ acorn@^7.0.0, acorn@^7.1.0, acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== -acorn@^8.0.5: - version "8.0.5" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.0.5.tgz#a3bfb872a74a6a7f661bc81b9849d9cac12601b7" - integrity sha512-v+DieK/HJkJOpFBETDJioequtc3PfxsWMaxIdIwujtF7FEV/MAyDQLlm6/zPvr7Mix07mLh6ccVwIsloceodlg== +acorn@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.1.0.tgz#52311fd7037ae119cbb134309e901aa46295b3fe" + integrity sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA== after@0.8.2: version "0.8.2" @@ -9977,12 +9977,12 @@ jsbn@~0.1.0: integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= jsdom@^16.2.2, jsdom@^16.4.0: - version "16.5.1" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.5.1.tgz#4ced6bbd7b77d67fb980e64d9e3e6fb900f97dd6" - integrity sha512-pF73EOsJgwZekbDHEY5VO/yKXUkab/DuvrQB/ANVizbr6UAHJsDdHXuotZYwkJSGQl1JM+ivXaqY+XBDDL4TiA== + version "16.5.2" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.5.2.tgz#583fac89a0aea31dbf6237e7e4bedccd9beab472" + integrity sha512-JxNtPt9C1ut85boCbJmffaQ06NBnzkQY/MWO3YxPW8IWS38A26z+B1oBvA9LwKrytewdfymnhi4UNH3/RAgZrg== dependencies: abab "^2.0.5" - acorn "^8.0.5" + acorn "^8.1.0" acorn-globals "^6.0.0" cssom "^0.4.4" cssstyle "^2.3.0" @@ -10004,7 +10004,7 @@ jsdom@^16.2.2, jsdom@^16.4.0: webidl-conversions "^6.1.0" whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" + whatwg-url "^8.5.0" ws "^7.4.4" xml-name-validator "^3.0.0" @@ -10623,11 +10623,6 @@ lodash.some@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= - lodash.template@^4.4.0, lodash.template@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" @@ -10668,6 +10663,11 @@ lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== +lodash@^4.7.0: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" @@ -14396,7 +14396,7 @@ tough-cookie@^2.2.0, tough-cookie@^2.3.3, tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" -tr46@^2.0.0: +tr46@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== @@ -14990,14 +14990,14 @@ whatwg-url-compat@~0.6.5: dependencies: tr46 "~0.0.1" -whatwg-url@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.0.0.tgz#37f256cb746398e19b107bd6ef820b4ae2d15871" - integrity sha512-41ou2Dugpij8/LPO5Pq64K5q++MnRCBpEHvQr26/mArEKTkCV5aoXIqyhuYtE0pkqScXwhf2JP57rkRTYM29lQ== +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.5.0.tgz#7752b8464fc0903fec89aa9846fc9efe07351fd3" + integrity sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg== dependencies: - lodash.sortby "^4.7.0" - tr46 "^2.0.0" - webidl-conversions "^5.0.0" + lodash "^4.7.0" + tr46 "^2.0.2" + webidl-conversions "^6.1.0" which-module@^1.0.0: version "1.0.0" From c7e6bde599bd1f9a20b17d40a688b48cefeea94c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 29 Mar 2021 17:33:55 +0000 Subject: [PATCH 789/879] build(deps): [security] bump y18n from 3.2.1 to 3.2.2 Bumps [y18n](https://github.com/yargs/y18n) from 3.2.1 to 3.2.2. **This update includes a security fix.** - [Release notes](https://github.com/yargs/y18n/releases) - [Changelog](https://github.com/yargs/y18n/blob/master/CHANGELOG.md) - [Commits](https://github.com/yargs/y18n/commits) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3af70da8e..0133b1240 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15176,9 +15176,9 @@ xtend@^4.0.0, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= + version "3.2.2" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" + integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== y18n@^4.0.0: version "4.0.0" From 3e31a6ade2ccc28a9dc0c3229f5d27999cd69565 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 31 Mar 2021 07:00:07 +0000 Subject: [PATCH 790/879] build(deps-dev): bump faker from 5.5.1 to 5.5.2 Bumps [faker](https://github.com/Marak/Faker.js) from 5.5.1 to 5.5.2. - [Release notes](https://github.com/Marak/Faker.js/releases) - [Changelog](https://github.com/Marak/faker.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/Marak/Faker.js/compare/v5.5.1...v5.5.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 0133b1240..65a7e35fe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8104,9 +8104,9 @@ fake-xml-http-request@^2.1.1: integrity sha512-Kn2WYYS6cDBS5jq/voOfSGCA0TafOYAUPbEp8mUVpD/DVV5bQIDjlq+MLLvNUokkbTpjBVlLDaM5PnX+PwZMlw== faker@^5.1.0: - version "5.5.1" - resolved "https://registry.yarnpkg.com/faker/-/faker-5.5.1.tgz#30e4e8ba15c8c08d0494ba935f247d8e2469675d" - integrity sha512-JCFXcVesClQ6RlSWmBMFQmGDAZq6hjbJAFgKALx31uPaQC6p3SWT2ojaJGD8bMQri+8VNqDOkI2F8QC+ABvZng== + version "5.5.2" + resolved "https://registry.yarnpkg.com/faker/-/faker-5.5.2.tgz#d6f99923fb757b26733a6d2396ddb448ac5bb446" + integrity sha512-6G3lzZXWjWfqTJDS9KhHFIislZMGdrzDqews3T14E/dsANVbs3YT4A3jSNDrbA/gbtmjLuKJx9DzcLucdXBqBw== fast-deep-equal@^3.1.1: version "3.1.1" From 7c4782ceaf845c9b0db530954480932a24a1bb87 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 9 Apr 2021 06:40:17 +0000 Subject: [PATCH 791/879] build(deps-dev): bump faker from 5.5.2 to 5.5.3 Bumps [faker](https://github.com/Marak/Faker.js) from 5.5.2 to 5.5.3. - [Release notes](https://github.com/Marak/Faker.js/releases) - [Changelog](https://github.com/Marak/faker.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/Marak/Faker.js/compare/v5.5.2...v5.5.3) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 65a7e35fe..27a59fa2d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8104,9 +8104,9 @@ fake-xml-http-request@^2.1.1: integrity sha512-Kn2WYYS6cDBS5jq/voOfSGCA0TafOYAUPbEp8mUVpD/DVV5bQIDjlq+MLLvNUokkbTpjBVlLDaM5PnX+PwZMlw== faker@^5.1.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/faker/-/faker-5.5.2.tgz#d6f99923fb757b26733a6d2396ddb448ac5bb446" - integrity sha512-6G3lzZXWjWfqTJDS9KhHFIislZMGdrzDqews3T14E/dsANVbs3YT4A3jSNDrbA/gbtmjLuKJx9DzcLucdXBqBw== + version "5.5.3" + resolved "https://registry.yarnpkg.com/faker/-/faker-5.5.3.tgz#c57974ee484431b25205c2c8dc09fda861e51e0e" + integrity sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g== fast-deep-equal@^3.1.1: version "3.1.1" From 748cfefa11004e84d9d25eb1c1f391f39f6eed2c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 07:32:50 +0000 Subject: [PATCH 792/879] build(deps-dev): bump jsdom from 16.5.2 to 16.5.3 Bumps [jsdom](https://github.com/jsdom/jsdom) from 16.5.2 to 16.5.3. - [Release notes](https://github.com/jsdom/jsdom/releases) - [Changelog](https://github.com/jsdom/jsdom/blob/master/Changelog.md) - [Commits](https://github.com/jsdom/jsdom/compare/16.5.2...16.5.3) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 27a59fa2d..61137eb1f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9977,9 +9977,9 @@ jsbn@~0.1.0: integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= jsdom@^16.2.2, jsdom@^16.4.0: - version "16.5.2" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.5.2.tgz#583fac89a0aea31dbf6237e7e4bedccd9beab472" - integrity sha512-JxNtPt9C1ut85boCbJmffaQ06NBnzkQY/MWO3YxPW8IWS38A26z+B1oBvA9LwKrytewdfymnhi4UNH3/RAgZrg== + version "16.5.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.5.3.tgz#13a755b3950eb938b4482c407238ddf16f0d2136" + integrity sha512-Qj1H+PEvUsOtdPJ056ewXM4UJPCi4hhLA8wpiz9F2YvsRBhuFsXxtrIFAgGBDynQA9isAMGE91PfUYbdMPXuTA== dependencies: abab "^2.0.5" acorn "^8.1.0" From 324a0322a63949f7af1fddf61ed29c90b16249f9 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 14 Apr 2021 07:21:51 +0000 Subject: [PATCH 793/879] build(deps): bump broccoli-funnel from 3.0.3 to 3.0.4 Bumps [broccoli-funnel](https://github.com/broccolijs/broccoli-funnel) from 3.0.3 to 3.0.4. - [Release notes](https://github.com/broccolijs/broccoli-funnel/releases) - [Changelog](https://github.com/broccolijs/broccoli-funnel/blob/master/CHANGELOG.md) - [Commits](https://github.com/broccolijs/broccoli-funnel/compare/v3.0.3...v3.0.4) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 61137eb1f..862eceaf7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4155,9 +4155,9 @@ broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1, broccoli-funnel@^2.0.2: walk-sync "^0.3.1" broccoli-funnel@^3.0.0, broccoli-funnel@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.3.tgz#26fd42632471f67a91f4770d1987118087219937" - integrity sha512-LPzZ91BwStoHZXdXHQAJeYORl189OrRKM5NdIi86SDU9wZ4s/3lV1PRFOiobDT/jKM10voM7CDzfvicHbCYxAQ== + version "3.0.4" + resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.4.tgz#0fe6b7e8745fa4585f30470fbfe54653ce058e3c" + integrity sha512-6w0nhWvBeTnOQ0DGVM9mCvFN32duLbXxyE06qLFi9jcd0HwfODkQ0QMtvvuM60+i7pHa+JQ75MStWHpj1DIaoA== dependencies: array-equal "^1.0.0" blank-object "^1.0.1" From 48f346859af23a3f2f7d35d23d371aee38fef268 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 15 Apr 2021 08:07:24 +0000 Subject: [PATCH 794/879] build(deps-dev): bump js-yaml from 4.0.0 to 4.1.0 Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 4.0.0 to 4.1.0. - [Release notes](https://github.com/nodeca/js-yaml/releases) - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/4.0.0...4.1.0) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 862eceaf7..16eb4959a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9965,9 +9965,9 @@ js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.2.5, js-yaml@^3.2. esprima "^4.0.0" js-yaml@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" - integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" From a9b38e7740f9a496678b68c1d849df224e6136fa Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 16 Apr 2021 22:17:50 +0000 Subject: [PATCH 795/879] build(deps): [security] bump ssri from 6.0.1 to 6.0.2 Bumps [ssri](https://github.com/npm/ssri) from 6.0.1 to 6.0.2. **This update includes a security fix.** - [Release notes](https://github.com/npm/ssri/releases) - [Changelog](https://github.com/npm/ssri/blob/v6.0.2/CHANGELOG.md) - [Commits](https://github.com/npm/ssri/compare/v6.0.1...v6.0.2) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 16eb4959a..220f40245 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13696,9 +13696,9 @@ sshpk@^1.7.0: tweetnacl "~0.14.0" ssri@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" - integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + version "6.0.2" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" + integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== dependencies: figgy-pudding "^3.5.1" From 512afdd35431a5bc5b486e24b2c8084fca09403b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 26 Apr 2021 07:00:53 +0000 Subject: [PATCH 796/879] build(deps): bump @embroider/macros from 0.37.0 to 0.40.0 Bumps [@embroider/macros](https://github.com/embroider-build/embroider/tree/HEAD/packages/macros) from 0.37.0 to 0.40.0. - [Release notes](https://github.com/embroider-build/embroider/releases) - [Changelog](https://github.com/embroider-build/embroider/blob/master/CHANGELOG.md) - [Commits](https://github.com/embroider-build/embroider/commits/v0.40.0/packages/macros) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 72 ++++++++++++++-------------------------------------- 2 files changed, 20 insertions(+), 54 deletions(-) diff --git a/package.json b/package.json index 973e826f6..6f2de7d8b 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "prepare": "./scripts/link.sh" }, "dependencies": { - "@embroider/macros": "^0.37.0", + "@embroider/macros": "^0.40.0", "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^3.0.3", "broccoli-merge-trees": "^4.2.0", diff --git a/yarn.lock b/yarn.lock index 220f40245..718fdf7bf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1528,45 +1528,6 @@ walk-sync "^1.1.3" wrap-legacy-hbs-plugin-if-needed "^1.0.1" -"@embroider/core@0.37.0": - version "0.37.0" - resolved "https://registry.yarnpkg.com/@embroider/core/-/core-0.37.0.tgz#bd7a7d63795794ffcd53d90a65b81e939ccf6cff" - integrity sha512-tkXD7qV9GJYb7cGlxLT4PTbPZ+B4vNDXp5oHyEz8EQSuZExN/40Hm90S5KrEC++TpqeVewSIXOz/fA53lkK6RQ== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.12.3" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-transform-runtime" "^7.12.1" - "@babel/runtime" "^7.12.5" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" - "@embroider/macros" "0.37.0" - assert-never "^1.1.0" - babel-plugin-syntax-dynamic-import "^6.18.0" - broccoli-node-api "^1.7.0" - broccoli-persistent-filter "^3.1.2" - broccoli-plugin "^4.0.1" - broccoli-source "^3.0.0" - debug "^3.1.0" - escape-string-regexp "^4.0.0" - fast-sourcemap-concat "^1.4.0" - filesize "^4.1.2" - fs-extra "^7.0.1" - fs-tree-diff "^2.0.0" - handlebars "^4.4.2" - js-string-escape "^1.0.1" - jsdom "^16.4.0" - json-stable-stringify "^1.0.1" - lodash "^4.17.10" - pkg-up "^3.1.0" - resolve "^1.8.1" - resolve-package-path "^1.2.2" - semver "^7.3.2" - strip-bom "^3.0.0" - typescript-memoize "^1.0.0-alpha.3" - walk-sync "^1.1.3" - wrap-legacy-hbs-plugin-if-needed "^1.0.1" - "@embroider/macros@0.33.0": version "0.33.0" resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.33.0.tgz#d5826ea7565bb69b57ba81ed528315fe77acbf9d" @@ -1582,21 +1543,31 @@ resolve "^1.8.1" semver "^7.3.2" -"@embroider/macros@0.37.0", "@embroider/macros@^0.37.0": - version "0.37.0" - resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.37.0.tgz#221013fc5bc0eaa78f1de98802fc03e588bfe1b1" - integrity sha512-VItxn4NzGR5prryXGbPGTuLMd+QPPKvAYZv2357iS+wmz6mTzC5nqXljwDQIOJbAji9giDO+FW2HzXYOcY3teQ== +"@embroider/macros@^0.40.0": + version "0.40.0" + resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.40.0.tgz#f58763b4cfb9b4089679b478a28627595341bc5a" + integrity sha512-ygChvFoebSi/N8b+A+XFncd454gLYBYHancrtY0AE/h6Y1HouoqQvji/IfaLisGoeuwUWuI9rCBv97COweu/rA== dependencies: - "@babel/core" "^7.12.3" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" - "@embroider/core" "0.37.0" + "@embroider/shared-internals" "0.40.0" assert-never "^1.1.0" ember-cli-babel "^7.23.0" lodash "^4.17.10" resolve "^1.8.1" semver "^7.3.2" +"@embroider/shared-internals@0.40.0": + version "0.40.0" + resolved "https://registry.yarnpkg.com/@embroider/shared-internals/-/shared-internals-0.40.0.tgz#2f768c60f4f35ba5f9228f046f70324851e8bfe2" + integrity sha512-Ovr/i0Qgn6W6jdGXMvYJKlRoRpyBY9uhYozDSFKlBjeEmRJ0Plp7OST41+O5Td6Pqp+Rv2jVSnGzhA/MpC++NQ== + dependencies: + ember-rfc176-data "^0.3.17" + fs-extra "^7.0.1" + lodash "^4.17.10" + pkg-up "^3.1.0" + resolve-package-path "^1.2.2" + semver "^7.3.2" + typescript-memoize "^1.0.0-alpha.3" + "@fullhuman/postcss-purgecss@^2.1.2": version "2.3.0" resolved "https://registry.yarnpkg.com/@fullhuman/postcss-purgecss/-/postcss-purgecss-2.3.0.tgz#50a954757ec78696615d3e118e3fee2d9291882e" @@ -10658,12 +10629,7 @@ lodash.values@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c= -lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== - -lodash@^4.7.0: +lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== From 4c1982c68f4b8fd95a88e2d4ad9bb5a8198029ef Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 26 Apr 2021 07:00:05 +0000 Subject: [PATCH 797/879] build(deps): bump ember-auto-import from 1.11.2 to 1.11.3 Bumps [ember-auto-import](https://github.com/ef4/ember-auto-import) from 1.11.2 to 1.11.3. - [Release notes](https://github.com/ef4/ember-auto-import/releases) - [Changelog](https://github.com/ef4/ember-auto-import/blob/master/CHANGELOG.md) - [Commits](https://github.com/ef4/ember-auto-import/compare/v1.11.2...v1.11.3) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index 220f40245..66dfcf34b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6257,9 +6257,9 @@ ember-assign-polyfill@^2.5.0, ember-assign-polyfill@^2.6.0: ember-cli-version-checker "^2.0.0" ember-auto-import@^1.2.19, ember-auto-import@^1.5.3, ember-auto-import@^1.6.0: - version "1.11.2" - resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.11.2.tgz#b6e9a0dddd88a10692830ffa4f5dfd8c137c8919" - integrity sha512-Sm0x9qgAQEx+XSYeh5zeKj89Uo0c7XzULZxuziFPxbhtKy/G4pywhBuQ7EgDznTj8IZVxOdfe4ufcUxnJtbSgg== + version "1.11.3" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.11.3.tgz#6e3384a7fbb163384a34546f2e902cd297b0e683" + integrity sha512-ekq/XCvsonESobFU30zjZ0I4XMy2E/2ZILCYWuQ1JdhcCSTYhnXDZcqRW8itUG7kbsPqAHT/XZ1LEZYm3seVwQ== dependencies: "@babel/core" "^7.1.6" "@babel/preset-env" "^7.10.2" @@ -10658,12 +10658,7 @@ lodash.values@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c= -lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== - -lodash@^4.7.0: +lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== From 7636db3f8b2ca322a8a29519fba29aee67a85f86 Mon Sep 17 00:00:00 2001 From: Max Z <47531779+MrChocolatine@users.noreply.github.com> Date: Tue, 27 Apr 2021 18:07:27 +0100 Subject: [PATCH 798/879] build: only include used composable-helpers --- ember-cli-build.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ember-cli-build.js b/ember-cli-build.js index 19da1eb1e..a24bfde9d 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -13,6 +13,9 @@ module.exports = function (defaults) { { name: "miragejs", sourceDirectory: "lib" }, ], }, + "ember-composable-helpers": { + only: ["sort-by"] + }, addons: { blacklist: ["ember-cli-fastboot"], }, From dafa29716d0a035be1b064f9c07449f845e27031 Mon Sep 17 00:00:00 2001 From: Lorcan Coyle Date: Wed, 28 Apr 2021 14:53:51 +0100 Subject: [PATCH 799/879] Correct some typos --- .../app/pods/docs/advanced/server-configuration/template.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/dummy/app/pods/docs/advanced/server-configuration/template.md b/tests/dummy/app/pods/docs/advanced/server-configuration/template.md index ac1d09d73..5a2837048 100644 --- a/tests/dummy/app/pods/docs/advanced/server-configuration/template.md +++ b/tests/dummy/app/pods/docs/advanced/server-configuration/template.md @@ -8,7 +8,7 @@ The named `makeServer` function export gives you a lower-level way to hook Typically, the `/mirage/config.js` file contains a single default export which is a function defining all your Mirage route handlers. Ember CLI Mirage then uses this function, along with all the other modules you've defined in - `mirage/models`, `mirage/fixtures`, mirage/factories`, and + `mirage/models`, `mirage/fixtures`, `mirage/factories`, and `mirage/serializers`, to create your Mirage JS server when your app boots up in development and testing. @@ -49,8 +49,8 @@ The named `makeServer` function export gives you a lower-level way to hook that this gives you the added benefit of being able to upgrade `miragejs` independently of `ember-cli-mirage`. - Eventually, `ember-cli-mirage` will shed its re-exports of everythign from - `miragejs', and become a small wrapper library delegating the rest of the work + Eventually, `ember-cli-mirage` will shed its re-exports of everything from + `miragejs`, and become a small wrapper library delegating the rest of the work to `miragejs`. This will help align the Ember Mirage users with the rest of the Mirage JS community. ```javascript From c943714c778cc0f5db2839197b0207f5b97f3668 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 29 Apr 2021 06:38:03 +0000 Subject: [PATCH 800/879] build(deps): bump ember-cli-babel from 7.26.3 to 7.26.4 Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 7.26.3 to 7.26.4. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v7.26.3...v7.26.4) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 66dfcf34b..6ada9c9b1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6438,9 +6438,9 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, semver "^5.5.0" ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.2, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.4.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: - version "7.26.3" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.3.tgz#e93ce7ec458208894d10844cf76e41cc06fdbeb6" - integrity sha512-ZCs0g99d3kYaHs1+HT33oMY7/K+nLCAAv7dCLxsMzg7cQf55O6Pq4ZKnWEr3IHVs33xbJFnEb9prt1up36QVnw== + version "7.26.4" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.4.tgz#b73d53592c05479814ca1770b3b849d4e01a87f0" + integrity sha512-GibwLrBUVj8DxNMnbE5PObEIeznX6ohOdYHoSMmTkCBuXa/I9amRGIjBhNlDbAJj+exVKKZoEGAdrV13gnyftQ== dependencies: "@babel/core" "^7.12.0" "@babel/helper-compilation-targets" "^7.12.0" From ee696087a95102ebbebcd676841035a35d1ce6eb Mon Sep 17 00:00:00 2001 From: Timothy Leverett Date: Wed, 28 Apr 2021 16:58:56 -0400 Subject: [PATCH 801/879] Fixed minor formatting issues --- .../advanced/server-configuration/template.md | 105 +++++++++--------- 1 file changed, 53 insertions(+), 52 deletions(-) diff --git a/tests/dummy/app/pods/docs/advanced/server-configuration/template.md b/tests/dummy/app/pods/docs/advanced/server-configuration/template.md index 5a2837048..013d6a646 100644 --- a/tests/dummy/app/pods/docs/advanced/server-configuration/template.md +++ b/tests/dummy/app/pods/docs/advanced/server-configuration/template.md @@ -1,60 +1,61 @@ # Server configuration -The MirageJS server is configured for you by ember-cli-mirage. However, if you need to customize the server you can by creating a makeServer function in the config.js. +The MirageJS server is configured for you by ember-cli-mirage. However, if you +need to customize the server you can by creating a makeServer function in the +config.js. The named `makeServer` function export gives you a lower-level way to hook - into how your Ember app instantiates your Mirage JS server. - - Typically, the `/mirage/config.js` file contains a single default export which - is a function defining all your Mirage route handlers. Ember CLI Mirage then - uses this function, along with all the other modules you've defined in - `mirage/models`, `mirage/fixtures`, `mirage/factories`, and - `mirage/serializers`, to create your Mirage JS server when your app boots up - in development and testing. - - You can now opt in to having more control over exactly how your Mirage server - is instantiated, as well as the ability to use imports directly from the - `miragejs` npm package, by exporting a single named function called - `makeServer` instead. - - `makeServer` receives a single argument called `config`, which contains all - the factory/fixture/serializer/model modules that exist in your project's - `/mirage` directory. This saves you from having to import each module - explicitly and then pass it into your Mirage server, just like you're used to - with the default setup. - - The `config` argument maps exactly to everything inside of your `/mirage` - directory - notably, it does not contain the autogenerated Mirage model - definitions derived from your Ember Data models, which is an important feature - of Ember CLI Mirage that is enabled by default. To replicate this behavior - when using `makeServer`, we have provided an additional import called - `discoverEmberDataModels` from the `ember-cli-mirage` package that you can use - to augment your config with these models so that your Mirage schema is - automatically inferred from your host application's Ember Data models and - relationships. The snippet below shows how to do this. Note that the order - here matters if you also have models defined in your `/mirage/models` - directory, as those model definitions would "win" in the event of a conflict - with the ones autodiscovered from Ember Data. (However, most of time if you - are inferring your Mirage schema from Ember Data, you shouldn't need to define - additional models.) - - Finally, your route handlers just need to be passed to the `routes()` key in - your Mirage config. You can do this inline, or you can make them a separate - function, and organize that function however you choose. - - The only thing needed to enable this behavior is that you delete the default - function export and instead export a single named function called - `makeServer`. You should also add `miragejs` to your project's dependencies in - your `package.json` file, since you are now importing directly from it. Note - that this gives you the added benefit of being able to upgrade `miragejs` - independently of `ember-cli-mirage`. - - Eventually, `ember-cli-mirage` will shed its re-exports of everything from - `miragejs`, and become a small wrapper library delegating the rest of the work - to `miragejs`. This will help align the Ember Mirage users with the rest of - the Mirage JS community. +into how your Ember app instantiates your Mirage JS server. + +Typically, the `/mirage/config.js` file contains a single default export which +is a function defining all your Mirage route handlers. Ember CLI Mirage then +uses this function, along with all the other modules you've defined in +`mirage/models`, `mirage/fixtures`, `mirage/factories`, and +`mirage/serializers`, to create your Mirage JS server when your app boots up +in development and testing. + +You can now opt in to having more control over exactly how your Mirage server +is instantiated, as well as the ability to use imports directly from the +`miragejs` npm package, by exporting a single named function called +`makeServer` instead. + +`makeServer` receives a single argument called `config`, which contains all +the factory/fixture/serializer/model modules that exist in your project's +`/mirage` directory. This saves you from having to import each module +explicitly and then pass it into your Mirage server, just like you're used to +with the default setup. + +The `config` argument maps exactly to everything inside of your `/mirage` +directory - notably, it does not contain the autogenerated Mirage model +definitions derived from your Ember Data models, which is an important feature +of Ember CLI Mirage that is enabled by default. To replicate this behavior +when using `makeServer`, we have provided an additional import called +`discoverEmberDataModels` from the `ember-cli-mirage` package that you can use +to augment your config with these models so that your Mirage schema is +automatically inferred from your host application's Ember Data models and +relationships. The snippet below shows how to do this. Note that the order +here matters if you also have models defined in your `/mirage/models` +directory, as those model definitions would "win" in the event of a conflict +with the ones autodiscovered from Ember Data. (However, most of time if you +are inferring your Mirage schema from Ember Data, you shouldn't need to define +additional models.) + +Finally, your route handlers just need to be passed to the `routes()` key in +your Mirage config. You can do this inline, or you can make them a separate +function, and organize that function however you choose. + +The only thing needed to enable this behavior is that you delete the default +function export and instead export a single named function called +`makeServer`. You should also add `miragejs` to your project's dependencies in +your `package.json` file, since you are now importing directly from it. Note +that this gives you the added benefit of being able to upgrade `miragejs` +independently of `ember-cli-mirage`. + +Eventually, `ember-cli-mirage` will shed its re-exports of everything from +`miragejs`, and become a small wrapper library delegating the rest of the work +to `miragejs`. This will help align the Ember Mirage users with the rest of +the Mirage JS community. ```javascript - // Example with inline routes import { createServer, discoverEmberDataModels } from "ember-cli-mirage"; From 3e2a6bb8472e53a6c58b22cc0d84f4f6e2299995 Mon Sep 17 00:00:00 2001 From: Can Rozanes <37912128+canrozanes@users.noreply.github.com> Date: Thu, 29 Apr 2021 12:50:44 -0400 Subject: [PATCH 802/879] docs: factory - fix traits example The code snippet changed in this PR is described with the following text `Here we define a withComments trait that creates 3 comments for a newly created post:` Creating a post requires having a factory on the path `mirage/factories/post.js` as opposed to `mirage/factories/user.js` Also to keep it consistent with the rest of the examples where posts have a property called `title`, as opposed to `name`, I went ahead and updated the `name` property on the factory to be `title`. --- tests/dummy/app/pods/docs/data-layer/factories/template.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/dummy/app/pods/docs/data-layer/factories/template.md b/tests/dummy/app/pods/docs/data-layer/factories/template.md index 671bf19d9..863e41634 100644 --- a/tests/dummy/app/pods/docs/data-layer/factories/template.md +++ b/tests/dummy/app/pods/docs/data-layer/factories/template.md @@ -470,11 +470,11 @@ When combined with the `afterCreate()` hook, traits simplify the process of sett Here we define a `withComments` trait that creates 3 comments for a newly created post: ``` js -// mirage/factories/user.js +// mirage/factories/post.js import { Factory, trait } from 'ember-cli-mirage'; export default Factory.extend({ - name: 'Lorem ipsum', + title: 'Lorem ipsum', withComments: trait({ afterCreate(post, server) { From 2f53902981e06ce3fc2eb70b9f8c2ff54d34d1a8 Mon Sep 17 00:00:00 2001 From: Brian Gantzler Date: Thu, 29 Apr 2021 13:42:03 -0400 Subject: [PATCH 803/879] Fix regex that checks if ember data is present to allow for difference in namespace --- addon/utils/ember-data.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/addon/utils/ember-data.js b/addon/utils/ember-data.js index 3ee05a9f7..aacfca3b3 100644 --- a/addon/utils/ember-data.js +++ b/addon/utils/ember-data.js @@ -1,8 +1,10 @@ /* global requirejs */ function _hasEmberData() { - let matchRegex = /^ember-data/i; - return !!(Object.keys(requirejs.entries).find(e => !!e.match(matchRegex))); + let matchRegex1 = /^ember-data/i; + let matchRegex2 = /^@ember-data/i; + + return !!(Object.keys(requirejs.entries).find(e => !!e.match(matchRegex2) || !!e.match(matchRegex1) )); } /** From c25e2bfc23487f4cede23f6e12efde3c78364545 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Tue, 4 May 2021 13:12:04 +0200 Subject: [PATCH 804/879] v2.2.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6f2de7d8b..594df7de6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-cli-mirage", - "version": "2.1.0", + "version": "2.2.0", "description": "A client-side server to help you build, test and demo your Ember app", "keywords": [ "ember-addon", From d30b04565c7a6eee3dbd75a05731006a39b062ed Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 6 May 2021 06:32:47 +0000 Subject: [PATCH 805/879] build(deps): bump ember-cli-babel from 7.26.4 to 7.26.5 Bumps [ember-cli-babel](https://github.com/babel/ember-cli-babel) from 7.26.4 to 7.26.5. - [Release notes](https://github.com/babel/ember-cli-babel/releases) - [Changelog](https://github.com/babel/ember-cli-babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/ember-cli-babel/compare/v7.26.4...v7.26.5) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index cb3fbfd09..fca52f3ff 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6409,9 +6409,9 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, semver "^5.5.0" ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.2, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.4.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: - version "7.26.4" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.4.tgz#b73d53592c05479814ca1770b3b849d4e01a87f0" - integrity sha512-GibwLrBUVj8DxNMnbE5PObEIeznX6ohOdYHoSMmTkCBuXa/I9amRGIjBhNlDbAJj+exVKKZoEGAdrV13gnyftQ== + version "7.26.5" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.5.tgz#59904d1d73b5c816167238024d18b85c8b51debc" + integrity sha512-XLMk59yNJneItn/hkJn+kHjnnszdfXWo1sP95C0kouSfPtIsUC3a/f/FW6c59D8koPANJOIHiHP3zUpTpKsnTA== dependencies: "@babel/core" "^7.12.0" "@babel/helper-compilation-targets" "^7.12.0" From 91d1899a0344531223309cc558c540180200d106 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 6 May 2021 16:26:48 +0000 Subject: [PATCH 806/879] build(deps): [security] bump handlebars from 4.7.6 to 4.7.7 Bumps [handlebars](https://github.com/wycats/handlebars.js) from 4.7.6 to 4.7.7. **This update includes a security fix.** - [Release notes](https://github.com/wycats/handlebars.js/releases) - [Changelog](https://github.com/handlebars-lang/handlebars.js/blob/master/release-notes.md) - [Commits](https://github.com/wycats/handlebars.js/compare/v4.7.6...v4.7.7) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/yarn.lock b/yarn.lock index fca52f3ff..d22d3b8ea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5356,7 +5356,7 @@ commander@6.2.0: resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75" integrity sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q== -commander@^2.19.0, commander@^2.20.0, commander@^2.6.0, commander@~2.20.3: +commander@^2.19.0, commander@^2.20.0, commander@^2.6.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -8927,9 +8927,9 @@ growly@^1.3.0: integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= handlebars@^4.0.13, handlebars@^4.0.4, handlebars@^4.3.1, handlebars@^4.4.2, handlebars@^4.7.4: - version "4.7.6" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e" - integrity sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA== + version "4.7.7" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" + integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== dependencies: minimist "^1.2.5" neo-async "^2.6.0" @@ -11281,12 +11281,7 @@ negotiator@0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== -neo-async@^2.5.0, neo-async@^2.6.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" - integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== - -neo-async@^2.6.1: +neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== @@ -14460,12 +14455,9 @@ uc.micro@^1.0.0, uc.micro@^1.0.1, uc.micro@^1.0.5: integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== uglify-js@^3.1.4: - version "3.8.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.8.0.tgz#f3541ae97b2f048d7e7e3aa4f39fd8a1f5d7a805" - integrity sha512-ugNSTT8ierCsDHso2jkBHXYrU8Y5/fY2ZUprfrJUiD7YpuFvV4jODLFmb3h4btQjqr5Nh4TX4XtgDfCU1WdioQ== - dependencies: - commander "~2.20.3" - source-map "~0.6.1" + version "3.13.5" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.5.tgz#5d71d6dbba64cf441f32929b1efce7365bb4f113" + integrity sha512-xtB8yEqIkn7zmOyS2zUNBsYCBRhDkvlNxMMY2smuJ/qA8NCHeQvKCF3i9Z4k8FJH4+PJvZRtMrPynfZ75+CSZw== underscore.string@~3.3.4: version "3.3.5" From 7c332b3f916273f25796ad81bf2f826cfb1f4a5c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 6 May 2021 19:44:40 +0000 Subject: [PATCH 807/879] build(deps): [security] bump underscore from 1.9.2 to 1.13.1 Bumps [underscore](https://github.com/jashkenas/underscore) from 1.9.2 to 1.13.1. **This update includes a security fix.** - [Release notes](https://github.com/jashkenas/underscore/releases) - [Commits](https://github.com/jashkenas/underscore/compare/1.9.2...1.13.1) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index d22d3b8ea..83d5b28a0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14468,9 +14468,9 @@ underscore.string@~3.3.4: util-deprecate "^1.0.2" underscore@>=1.8.3: - version "1.9.2" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.2.tgz#0c8d6f536d6f378a5af264a72f7bec50feb7cf2f" - integrity sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ== + version "1.13.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1" + integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g== unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" From c40d2da439bc21d012b8386cd976533449546d0a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 7 May 2021 18:35:51 +0000 Subject: [PATCH 808/879] build(deps): [security] bump hosted-git-info from 2.8.8 to 2.8.9 Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.8 to 2.8.9. **This update includes a security fix.** - [Release notes](https://github.com/npm/hosted-git-info/releases) - [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md) - [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.8...v2.8.9) Signed-off-by: dependabot-preview[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 83d5b28a0..d242d1c9a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9166,9 +9166,9 @@ home-or-tmp@^2.0.0: os-tmpdir "^1.0.1" hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== hosted-git-info@^3.0.4: version "3.0.4" From 212ec5ca8c434fa3a631e50864b858b7e7efd3ec Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 21 May 2021 22:32:47 +0200 Subject: [PATCH 809/879] Upgrade to GitHub-native Dependabot (#2174) Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- .dependabot/config.yml | 13 ------------- .github/dependabot.yml | 6 ++++++ 2 files changed, 6 insertions(+), 13 deletions(-) delete mode 100644 .dependabot/config.yml create mode 100644 .github/dependabot.yml diff --git a/.dependabot/config.yml b/.dependabot/config.yml deleted file mode 100644 index b3dfd9523..000000000 --- a/.dependabot/config.yml +++ /dev/null @@ -1,13 +0,0 @@ -version: 1 - -update_configs: - - package_manager: "javascript" - directory: "/" - update_schedule: "daily" - automerged_updates: - - match: - dependency_type: "all" - update_type: "in_range" - ignored_updates: - - match: - dependency_name: "ember-cli" diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..d0a9746f6 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: +- package-ecosystem: npm + directory: "/" + schedule: + interval: daily From 59dc78116545ae318afb445c69ab61a065c8cd50 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 18 Jun 2021 20:11:47 +0000 Subject: [PATCH 810/879] Bump striptags from 3.1.1 to 3.2.0 Bumps [striptags](https://github.com/ericnorris/striptags) from 3.1.1 to 3.2.0. - [Release notes](https://github.com/ericnorris/striptags/releases) - [Commits](https://github.com/ericnorris/striptags/compare/v3.1.1...v3.2.0) --- updated-dependencies: - dependency-name: striptags dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index d242d1c9a..8e035cc4c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13897,9 +13897,9 @@ strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= striptags@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/striptags/-/striptags-3.1.1.tgz#c8c3e7fdd6fb4bb3a32a3b752e5b5e3e38093ebd" - integrity sha1-yMPn/db7S7OjKjt1LltePjgJPr0= + version "3.2.0" + resolved "https://registry.yarnpkg.com/striptags/-/striptags-3.2.0.tgz#cc74a137db2de8b0b9a370006334161f7dd67052" + integrity sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw== styled_string@0.0.1: version "0.0.1" From f6a973208ccebf077a25c5b42eb244c2a532a2e4 Mon Sep 17 00:00:00 2001 From: Sam Selikoff Date: Mon, 12 Jul 2021 10:41:07 -0400 Subject: [PATCH 811/879] Create SECURITY.md --- SECURITY.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..7aa47841c --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,11 @@ +# Security Policy + +## Supported Versions + +| Version | Supported | +| ------- | ------------------ | +| 2.x | :white_check_mark: | + +## Reporting a Vulnerability + +Email sam.selikoff@gmail.com to report a vulnerability. From 7c8d542972b8b8b39845ad359491d4ca2f8d4819 Mon Sep 17 00:00:00 2001 From: Mikhail Topolskiy Date: Wed, 21 Jul 2021 16:15:59 +0300 Subject: [PATCH 812/879] Fix import example for EmberDataSerializer --- .../data-layer/serializers/ember-data-serializer/template.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/dummy/app/pods/docs/data-layer/serializers/ember-data-serializer/template.md b/tests/dummy/app/pods/docs/data-layer/serializers/ember-data-serializer/template.md index bfd179827..13b3f2b9d 100644 --- a/tests/dummy/app/pods/docs/data-layer/serializers/ember-data-serializer/template.md +++ b/tests/dummy/app/pods/docs/data-layer/serializers/ember-data-serializer/template.md @@ -14,9 +14,9 @@ value of `addressId` from the JSON and use it as the `id` for the Mirage model. use the value for the `id` property and assign it to the property `addressId`. ```js -import EmberDateSerialzier from 'ember-cli-mirage/ember-data-serializer'; +import { EmberDataSerializer } from "ember-cli-mirage"; -export default EmberDateSerialzier.extend({ +export default EmberDataSerializer.extend({ primaryKey: "addressId" }); ``` From e6dd465b290e60e5645e9e80f427514a42ce0c33 Mon Sep 17 00:00:00 2001 From: Brian Gantzler Date: Fri, 23 Jul 2021 17:21:45 -0400 Subject: [PATCH 813/879] Fix the way that the new server creation using mirageJS is determined. This also helps embroider --- addon/start-mirage.js | 36 +++++++++++- scripts/link.sh | 4 +- .../node_modules/.bin | 1 - .../node_modules/ember-cli-mirage | 1 - .../advanced/server-configuration/template.md | 56 +++++++++---------- tests/dummy/mirage/config.js | 5 +- 6 files changed, 68 insertions(+), 35 deletions(-) delete mode 120000 test-projects/03-app-that-uses-make-server/node_modules/.bin delete mode 120000 test-projects/03-app-that-uses-make-server/node_modules/ember-cli-mirage diff --git a/addon/start-mirage.js b/addon/start-mirage.js index 385b9f5c2..dae61cda5 100644 --- a/addon/start-mirage.js +++ b/addon/start-mirage.js @@ -1,6 +1,7 @@ import readModules from './utils/read-modules'; import Server from './server'; import { singularize, pluralize } from 'ember-inflector'; +import { deprecate } from '@ember/debug'; /** Helper to start mirage. This should not be called directly. In rfc232/rfc268 @@ -29,12 +30,45 @@ export default function startMirage(owner, { env, baseConfig, testConfig, makeSe makeServer = makeServer || resolveRegistration(owner, 'mirage:make-server'); } + // Deprecate exporting makeServer as NOT the default function + deprecate("Do not export the makeServer function. Please make the makeServer function the default exported function", + makeServer === undefined, + { + id: 'ember-cli-mirage-config-makeserver-export', + for: 'ember-cli-mirage', + since: '2.3.0', + until: '3.0.0', + url: 'https://www.ember-cli-mirage.com/docs/advanced/server-configuration' + } + ); + + let routes; + + // Are they using the routes as the default export + if (baseConfig && baseConfig.length === 0) { + routes = baseConfig; + } + + // Is the default exported function the makeServer function + if (baseConfig && baseConfig.length > 0) { + makeServer = baseConfig; + } + let environment = env.environment; let mirageEnvironment = env['ember-cli-mirage'] || {}; + let discoverEmberDataModels = mirageEnvironment.discoverEmberDataModels; if (discoverEmberDataModels === undefined) { discoverEmberDataModels = true; } let modules = readModules(env.modulePrefix); - let options = Object.assign(modules, {environment, routes: baseConfig, testConfig, discoverEmberDataModels}); + + let options = Object.assign(modules, + { + environment, + routes, + testConfig, + discoverEmberDataModels + } + ); options.trackRequests = mirageEnvironment.trackRequests; options.inflector = { singularize, pluralize }; diff --git a/scripts/link.sh b/scripts/link.sh index 4e3d2e12a..4f81212e8 100755 --- a/scripts/link.sh +++ b/scripts/link.sh @@ -5,7 +5,7 @@ set -e # Copied from https://github.com/ef4/ember-auto-import/blob/9e48e9ec9639ce05ca2a2688581ea41fdd627c5c/scripts/link-them.sh # All packages get a node_modules directory and a .bin link -for package in "01-basic-app" "02-app-that-excludes-mirage" "03-app-that-uses-make-server"; do +for package in "01-basic-app" "02-app-that-excludes-mirage"; do mkdir -p ./test-projects/$package/node_modules pushd ./test-projects/$package/node_modules > /dev/null rm -rf .bin @@ -14,7 +14,7 @@ for package in "01-basic-app" "02-app-that-excludes-mirage" "03-app-that-uses-ma done # These packages get to depend on ember-cli-mirage -for package in "01-basic-app" "02-app-that-excludes-mirage" "03-app-that-uses-make-server"; do +for package in "01-basic-app" "02-app-that-excludes-mirage"; do pushd ./test-projects/$package/node_modules > /dev/null rm -rf ./ember-cli-mirage ln -s ../../.. ./ember-cli-mirage diff --git a/test-projects/03-app-that-uses-make-server/node_modules/.bin b/test-projects/03-app-that-uses-make-server/node_modules/.bin deleted file mode 120000 index 1dedf1a6f..000000000 --- a/test-projects/03-app-that-uses-make-server/node_modules/.bin +++ /dev/null @@ -1 +0,0 @@ -../../../node_modules/.bin \ No newline at end of file diff --git a/test-projects/03-app-that-uses-make-server/node_modules/ember-cli-mirage b/test-projects/03-app-that-uses-make-server/node_modules/ember-cli-mirage deleted file mode 120000 index a8a4f8c21..000000000 --- a/test-projects/03-app-that-uses-make-server/node_modules/ember-cli-mirage +++ /dev/null @@ -1 +0,0 @@ -../../.. \ No newline at end of file diff --git a/tests/dummy/app/pods/docs/advanced/server-configuration/template.md b/tests/dummy/app/pods/docs/advanced/server-configuration/template.md index 013d6a646..047fd992e 100644 --- a/tests/dummy/app/pods/docs/advanced/server-configuration/template.md +++ b/tests/dummy/app/pods/docs/advanced/server-configuration/template.md @@ -4,9 +4,6 @@ The MirageJS server is configured for you by ember-cli-mirage. However, if you need to customize the server you can by creating a makeServer function in the config.js. -The named `makeServer` function export gives you a lower-level way to hook -into how your Ember app instantiates your Mirage JS server. - Typically, the `/mirage/config.js` file contains a single default export which is a function defining all your Mirage route handlers. Ember CLI Mirage then uses this function, along with all the other modules you've defined in @@ -15,23 +12,22 @@ uses this function, along with all the other modules you've defined in in development and testing. You can now opt in to having more control over exactly how your Mirage server -is instantiated, as well as the ability to use imports directly from the -`miragejs` npm package, by exporting a single named function called -`makeServer` instead. +is instantiated using the same code as the mirageJS examples of creating a server +by changing your current default export that represents the routes to a normal function, +then creating a new default export function that creates the mirageJS server. -`makeServer` receives a single argument called `config`, which contains all -the factory/fixture/serializer/model modules that exist in your project's -`/mirage` directory. This saves you from having to import each module -explicitly and then pass it into your Mirage server, just like you're used to -with the default setup. +This new default export function receives a single argument named `config`, +which contains all the factory/fixture/serializer/model modules that exist +in your project's `/mirage` directory. This saves you from having to import +each module explicitly and then pass it into your Mirage server, just like +you're used to with the default setup. The `config` argument maps exactly to everything inside of your `/mirage` directory - notably, it does not contain the autogenerated Mirage model definitions derived from your Ember Data models, which is an important feature -of Ember CLI Mirage that is enabled by default. To replicate this behavior -when using `makeServer`, we have provided an additional import called -`discoverEmberDataModels` from the `ember-cli-mirage` package that you can use -to augment your config with these models so that your Mirage schema is +of Ember CLI Mirage that is enabled by default. To replicate this behavior, a helper +has been provided named `discoverEmberDataModels` from the `ember-cli-mirage` +package that you can use to augment your config with these models so that your Mirage schema is automatically inferred from your host application's Ember Data models and relationships. The snippet below shows how to do this. Note that the order here matters if you also have models defined in your `/mirage/models` @@ -44,22 +40,23 @@ Finally, your route handlers just need to be passed to the `routes()` key in your Mirage config. You can do this inline, or you can make them a separate function, and organize that function however you choose. -The only thing needed to enable this behavior is that you delete the default -function export and instead export a single named function called -`makeServer`. You should also add `miragejs` to your project's dependencies in +You should also add `miragejs` to your project's dependencies in your `package.json` file, since you are now importing directly from it. Note that this gives you the added benefit of being able to upgrade `miragejs` -independently of `ember-cli-mirage`. +independently of `ember-cli-mirage`. + +All the objects from `miragejs` are re-exported in `ember-cli-mirage` such as +`Model`, `belongsTo`, `hasMany` as well as `Fixtures`, `Traits` for example. +These should in the future also be imported directly from `miragejs` as +eventually these re-exports will be removed. This will help align the +`ember-cli-mirage` users with the rest of the Mirage JS community. -Eventually, `ember-cli-mirage` will shed its re-exports of everything from -`miragejs`, and become a small wrapper library delegating the rest of the work -to `miragejs`. This will help align the Ember Mirage users with the rest of -the Mirage JS community. ```javascript // Example with inline routes -import { createServer, discoverEmberDataModels } from "ember-cli-mirage"; +import { discoverEmberDataModels } from "ember-cli-mirage"; +import { createServer } from 'miragejs'; -export function makeServer(config) { +export default function(config) { let finalConfig = { ...config, models: { ...discoverEmberDataModels(), ...config.models }, @@ -74,9 +71,10 @@ export function makeServer(config) { } // Example with routes in an external function -import { createServer, discoverEmberDataModels } from "ember-cli-mirage"; +import { discoverEmberDataModels } from "ember-cli-mirage"; +import { createServer } from 'miragejs'; -export function makeServer(config) { +export default function(config) { let finalConfig = { ...config, models: { ...discoverEmberDataModels(), ...config.models }, @@ -111,7 +109,9 @@ will extend EmberDataSerializer directly. ```javascript // Example of having Mirage adjust/create your serializers similiar to ember data models -import { createServer, discoverEmberDataModels, applyEmberDataSerializers } from 'ember-cli-mirage'; + +import { discoverEmberDataModels, applyEmberDataSerializers } from "ember-cli-mirage"; +import { createServer } from 'miragejs'; export function makeServer(config) { let finalConfig = { diff --git a/tests/dummy/mirage/config.js b/tests/dummy/mirage/config.js index 214ad4bda..85b4c2951 100644 --- a/tests/dummy/mirage/config.js +++ b/tests/dummy/mirage/config.js @@ -1,6 +1,7 @@ -import { createServer, discoverEmberDataModels, applyEmberDataSerializers } from 'ember-cli-mirage'; +import { discoverEmberDataModels, applyEmberDataSerializers } from 'ember-cli-mirage'; +import { createServer } from 'miragejs'; -export function makeServer(config) { +export default function(config) { let finalConfig = { ...config, models: { ...discoverEmberDataModels(), ...config.models }, From 9081651fbabc98fe0bbf384e03555417272c50d1 Mon Sep 17 00:00:00 2001 From: Rahul Kumar Date: Fri, 19 Nov 2021 11:25:37 +1300 Subject: [PATCH 814/879] chore: bump minimum ember-get-config dependency to fix ember-cli-babel/ember global deprecation warnings --- package.json | 2 +- yarn.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 594df7de6..7d9d1360b 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "broccoli-merge-trees": "^4.2.0", "ember-auto-import": "^1.2.19", "ember-cli-babel": "^7.5.0", - "ember-get-config": "^0.2.4 || ^0.3.0", + "ember-get-config": "^0.3.0", "ember-inflector": "^2.0.0 || ^3.0.0 || ^4.0.0", "lodash-es": "^4.17.11", "miragejs": "^0.1.31" diff --git a/yarn.lock b/yarn.lock index d242d1c9a..21af9b763 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7083,7 +7083,7 @@ ember-fetch@^8.0.2: node-fetch "^2.6.0" whatwg-fetch "^3.4.0" -ember-get-config@, "ember-get-config@^0.2.4 || ^0.3.0": +ember-get-config@, ember-get-config@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.3.0.tgz#a73a1a87b48d9dde4c66a0e52ed5260b8a48cfbd" integrity sha512-0e2pKzwW5lBZ4oJnvu9qHOht4sP1MWz/m3hyz8kpSoMdrlZVf62LDKZ6qfKgy8drcv5YhCMYE6QV7MhnqlrzEQ== From 9c9643d13bf07de3cacc6fafce5cd203bb82161c Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Tue, 30 Nov 2021 00:46:00 -0500 Subject: [PATCH 815/879] Deprecate miragejs re-exports --- addon/deprecate-imports.js | 32 ++++++++++++++++++++++++++++++++ addon/index.js | 6 ++++-- 2 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 addon/deprecate-imports.js diff --git a/addon/deprecate-imports.js b/addon/deprecate-imports.js new file mode 100644 index 000000000..47bb4ea1b --- /dev/null +++ b/addon/deprecate-imports.js @@ -0,0 +1,32 @@ +import { deprecate } from '@ember/debug'; +import * as ecMirageExports from './index'; +import * as mirage from 'miragejs'; + +const nonDeprecatedImports = ['default']; + +export function initDeprecatedImports () { + Object.entries(mirage).forEach(([name, value]) => { + if (!nonDeprecatedImports.includes(name)) { + Object.defineProperty(ecMirageExports, name, { + get () { + const message = `Importing '${name}' from 'ember-cli-mirage' is deprecated.` + + ` Install the \`miragejs\` package and use ` + + `\`import { ${name} } from 'miragejs';\` instead.`; + + deprecate(message, false, { + id: 'ember-cli-mirage.miragejs.import', + until: '3.0.0', + for: 'ember-cli-mirage', + since: { + enabled: '2.3.0', + } + }); + + return value; + }, + + enumerable: true, + }); + } + }); +} diff --git a/addon/index.js b/addon/index.js index 3af4a664f..83147f048 100644 --- a/addon/index.js +++ b/addon/index.js @@ -1,4 +1,6 @@ export { default } from 'miragejs'; -export * from 'miragejs'; -export {discoverEmberDataModels, applyEmberDataSerializers} from './ember-data'; +export { discoverEmberDataModels, applyEmberDataSerializers } from './ember-data'; export { default as EmberDataSerializer } from 'ember-cli-mirage/serializers/ember-data-serializer'; + +import { initDeprecatedImports } from './deprecate-imports'; +initDeprecatedImports(); From 47c96f8ef9b6f65961ad6fea576a6246e8810e11 Mon Sep 17 00:00:00 2001 From: Brian Gantzler Date: Tue, 30 Nov 2021 16:43:05 -0500 Subject: [PATCH 816/879] updated all imports for miragejs objects to be from miragejs --- addon/ember-data.js | 2 +- .../files/__root__/serializers/application.js | 2 +- .../files/__root__/factories/__name__.js | 2 +- .../files/__root__/models/__name__.js | 2 +- .../mirage/factories/nested/thing.js | 2 +- .../01-basic-app/mirage/factories/user.js | 2 +- .../mirage/models/nested/thing.js | 2 +- .../mirage/serializers/application.js | 2 +- test-projects/01-basic-app/package.json | 1 + .../docs/data-layer/factories/template.md | 26 +++++++++---------- .../pods/docs/data-layer/models/template.md | 2 +- .../app/pods/docs/data-layer/orm/template.md | 8 +++--- .../data-layer/serializers/index/template.md | 6 ++--- .../docs/getting-started/overview/template.md | 12 ++++----- .../getting-started/upgrade-guide/template.md | 4 +-- .../docs/route-handlers/functions/template.md | 2 +- .../docs/testing/acceptance-tests/template.md | 4 +-- tests/dummy/mirage/serializers/application.js | 2 +- .../ember-data-serializer-discover-test.js | 3 ++- 19 files changed, 44 insertions(+), 42 deletions(-) diff --git a/addon/ember-data.js b/addon/ember-data.js index 07d314954..6d9b19f32 100644 --- a/addon/ember-data.js +++ b/addon/ember-data.js @@ -4,7 +4,7 @@ import require from 'require'; import config from 'ember-get-config'; import assert from './assert'; import { hasEmberData, isDsModel } from 'ember-cli-mirage/utils/ember-data'; -import { Model, belongsTo, hasMany } from 'ember-cli-mirage'; +import { Model, belongsTo, hasMany } from 'miragejs'; import EmberDataSerializer from "ember-cli-mirage/serializers/ember-data-serializer"; import { camelize } from './utils/inflector'; diff --git a/blueprints/ember-cli-mirage/files/__root__/serializers/application.js b/blueprints/ember-cli-mirage/files/__root__/serializers/application.js index 6d47a3669..ece160b27 100644 --- a/blueprints/ember-cli-mirage/files/__root__/serializers/application.js +++ b/blueprints/ember-cli-mirage/files/__root__/serializers/application.js @@ -1,4 +1,4 @@ -import { JSONAPISerializer } from 'ember-cli-mirage'; +import { JSONAPISerializer } from 'miragejs'; export default JSONAPISerializer.extend({ }); diff --git a/blueprints/mirage-factory/files/__root__/factories/__name__.js b/blueprints/mirage-factory/files/__root__/factories/__name__.js index 85018979d..f7467166b 100644 --- a/blueprints/mirage-factory/files/__root__/factories/__name__.js +++ b/blueprints/mirage-factory/files/__root__/factories/__name__.js @@ -1,4 +1,4 @@ -import { Factory } from 'ember-cli-mirage'; +import { Factory } from 'miragejs'; export default Factory.extend({ }); diff --git a/blueprints/mirage-model/files/__root__/models/__name__.js b/blueprints/mirage-model/files/__root__/models/__name__.js index 1486a7240..88bbf3c2c 100644 --- a/blueprints/mirage-model/files/__root__/models/__name__.js +++ b/blueprints/mirage-model/files/__root__/models/__name__.js @@ -1,4 +1,4 @@ -import { Model } from 'ember-cli-mirage'; +import { Model } from 'miragejs'; export default Model.extend({ }); diff --git a/test-projects/01-basic-app/mirage/factories/nested/thing.js b/test-projects/01-basic-app/mirage/factories/nested/thing.js index a49b783d3..e0d41a181 100644 --- a/test-projects/01-basic-app/mirage/factories/nested/thing.js +++ b/test-projects/01-basic-app/mirage/factories/nested/thing.js @@ -1,4 +1,4 @@ -import { Factory } from 'ember-cli-mirage'; +import { Factory } from 'miragejs'; export default Factory.extend({ name: 'nested factory works!' diff --git a/test-projects/01-basic-app/mirage/factories/user.js b/test-projects/01-basic-app/mirage/factories/user.js index 6a59ee9d2..95379c936 100644 --- a/test-projects/01-basic-app/mirage/factories/user.js +++ b/test-projects/01-basic-app/mirage/factories/user.js @@ -1,4 +1,4 @@ -import { Factory } from 'ember-cli-mirage'; +import { Factory } from 'miragejs'; import faker from 'faker'; export default Factory.extend({ diff --git a/test-projects/01-basic-app/mirage/models/nested/thing.js b/test-projects/01-basic-app/mirage/models/nested/thing.js index 1486a7240..88bbf3c2c 100644 --- a/test-projects/01-basic-app/mirage/models/nested/thing.js +++ b/test-projects/01-basic-app/mirage/models/nested/thing.js @@ -1,4 +1,4 @@ -import { Model } from 'ember-cli-mirage'; +import { Model } from 'miragejs'; export default Model.extend({ }); diff --git a/test-projects/01-basic-app/mirage/serializers/application.js b/test-projects/01-basic-app/mirage/serializers/application.js index 9ebd0e296..6753a45f3 100644 --- a/test-projects/01-basic-app/mirage/serializers/application.js +++ b/test-projects/01-basic-app/mirage/serializers/application.js @@ -1,3 +1,3 @@ -import { JSONAPISerializer } from 'ember-cli-mirage'; +import { JSONAPISerializer } from 'miragejs'; export default JSONAPISerializer; diff --git a/test-projects/01-basic-app/package.json b/test-projects/01-basic-app/package.json index 51c8f39a4..3e8ea1043 100644 --- a/test-projects/01-basic-app/package.json +++ b/test-projects/01-basic-app/package.json @@ -44,6 +44,7 @@ "fastboot": "*", "jsdom": "*", "loader.js": "*", + "miragejs": "*", "qunit": "*", "qunit-dom": "*" }, diff --git a/tests/dummy/app/pods/docs/data-layer/factories/template.md b/tests/dummy/app/pods/docs/data-layer/factories/template.md index 863e41634..8cf6dbd28 100644 --- a/tests/dummy/app/pods/docs/data-layer/factories/template.md +++ b/tests/dummy/app/pods/docs/data-layer/factories/template.md @@ -16,7 +16,7 @@ Say we have a `Movie` model defined in Mirage. (Remember, if you're using Ember ```js // mirage/models/movie.js -import { Model } from 'ember-cli-mirage'; +import { Model } from 'miragejs'; export default Model.extend({ }); @@ -94,7 +94,7 @@ which creates this file: ```js // mirage/factories/movie.js -import { Factory } from 'ember-cli-mirage'; +import { Factory } from 'miragejs'; export default Factory.extend({ }); @@ -104,7 +104,7 @@ Right now the Factory is empty. Let's define a property on it: ```js // mirage/factories/movie.js -import { Factory } from 'ember-cli-mirage'; +import { Factory } from 'miragejs'; export default Factory.extend({ @@ -127,7 +127,7 @@ We can also make this property a function. ```js // mirage/factories/movie.js -import { Factory } from 'ember-cli-mirage'; +import { Factory } from 'miragejs'; export default Factory.extend({ @@ -164,7 +164,7 @@ Let's add some more properties to our factory: ```js // mirage/factories/movie.js -import { Factory } from 'ember-cli-mirage'; +import { Factory } from 'miragejs'; import faker from 'faker'; export default Factory.extend({ @@ -232,7 +232,7 @@ Attributes can depend on other attributes via `this` from within a function. Thi ```js // mirage/factories/user.js -import { Factory } from 'ember-cli-mirage'; +import { Factory } from 'miragejs'; import faker from 'faker'; export default Factory.extend({ @@ -407,7 +407,7 @@ For example, here we define a trait named `published` on our post factory: ```js // mirage/factories/post.js -import { Factory, trait } from 'ember-cli-mirage'; +import { Factory, trait } from 'miragejs'; export default Factory.extend({ title: 'Lorem ipsum', @@ -434,7 +434,7 @@ You can also compose multiple traits together: ```js // mirage/factories/post.js -import { Factory, trait } from 'ember-cli-mirage'; +import { Factory, trait } from 'miragejs'; export default Factory.extend({ title: 'Lorem ipsum', @@ -471,7 +471,7 @@ Here we define a `withComments` trait that creates 3 comments for a newly create ``` js // mirage/factories/post.js -import { Factory, trait } from 'ember-cli-mirage'; +import { Factory, trait } from 'miragejs'; export default Factory.extend({ title: 'Lorem ipsum', @@ -501,7 +501,7 @@ As we saw earlier, given a `Post` that `belongsTo` a `User`, we were able to use ```js // mirage/factories/post.js -import { Factory } from 'ember-cli-mirage'; +import { Factory } from 'miragejs'; export default Factory.extend({ @@ -520,7 +520,7 @@ The `association()` helper effectively replaces this code: ```js // mirage/factories/post.js -import { Factory, association } from 'ember-cli-mirage'; +import { Factory, association } from 'miragejs'; export default Factory.extend({ @@ -535,7 +535,7 @@ You can also use `association()` within traits ```js // mirage/factories/post.js -import { Factory, association, trait } from 'ember-cli-mirage'; +import { Factory, association, trait } from 'miragejs'; export default Factory.extend({ @@ -550,7 +550,7 @@ and it also accepts additional traits and overrides for the related model's fact ```js // mirage/factories/post.js -import { Factory, association, trait } from 'ember-cli-mirage'; +import { Factory, association, trait } from 'miragejs'; export default Factory.extend({ diff --git a/tests/dummy/app/pods/docs/data-layer/models/template.md b/tests/dummy/app/pods/docs/data-layer/models/template.md index 19ccbb829..c05d3f57e 100644 --- a/tests/dummy/app/pods/docs/data-layer/models/template.md +++ b/tests/dummy/app/pods/docs/data-layer/models/template.md @@ -18,7 +18,7 @@ This creates a file under `/mirage/models`: ```js // mirage/models/blog-post.js -import { Model } from 'ember-cli-mirage'; +import { Model } from 'miragejs'; export default Model; ``` diff --git a/tests/dummy/app/pods/docs/data-layer/orm/template.md b/tests/dummy/app/pods/docs/data-layer/orm/template.md index cdd30bf2a..a4212963c 100644 --- a/tests/dummy/app/pods/docs/data-layer/orm/template.md +++ b/tests/dummy/app/pods/docs/data-layer/orm/template.md @@ -145,7 +145,7 @@ Let's define a `Movie` model. ```js // mirage/models/movie.js -import { Model } from 'ember-cli-mirage'; +import { Model } from 'miragejs'; export default Model.extend({ }); @@ -173,7 +173,7 @@ Mirage ships with a JSONAPISerializer out of the box, so assuming it's defined a ```js // mirage/serializers/application.js -import { JSONAPISerializer } from 'ember-cli-mirage'; +import { JSONAPISerializer } from 'miragejs'; export default JSONAPISerializer.extend({ }); @@ -206,7 +206,7 @@ Let's say our `Movie` has a belongs-to relationship with a `director`: ```js // mirage/models/movie.js -import { Model, belongsTo } from 'ember-cli-mirage'; +import { Model, belongsTo } from 'miragejs'; export default Model.extend({ @@ -219,7 +219,7 @@ The `director` is an instance of a `Person` model: ```js // mirage/models/person.js -import { Model } from 'ember-cli-mirage'; +import { Model } from 'miragejs'; export default Model.extend({ }); diff --git a/tests/dummy/app/pods/docs/data-layer/serializers/index/template.md b/tests/dummy/app/pods/docs/data-layer/serializers/index/template.md index 9989afd04..752628677 100644 --- a/tests/dummy/app/pods/docs/data-layer/serializers/index/template.md +++ b/tests/dummy/app/pods/docs/data-layer/serializers/index/template.md @@ -52,7 +52,7 @@ Once you've selected the appropriate serializer, define your default application ```js // mirage/serializers/application.js -import { JSONAPISerializer } from 'ember-cli-mirage'; +import { JSONAPISerializer } from 'miragejs'; export default JSONAPISerializer.extend({ }); @@ -100,7 +100,7 @@ For example, if your Ember app expects attribute names to be PascalCase you might override the Serializer's `keyForAttribute` method: ```js -import { Serializer } from 'ember-cli-mirage'; +import { Serializer } from 'miragejs'; import { classify } from '@ember/string'; export default Serializer.extend({ @@ -130,7 +130,7 @@ out of the box. But sometimes Ember apps expect a resource payload to have all t There's an option on `JSONAPISerializer` that enables this: ```js -import { JSONAPISerializer } from 'ember-cli-mirage'; +import { JSONAPISerializer } from 'miragejs'; export default JSONAPISerializer.extend({ diff --git a/tests/dummy/app/pods/docs/getting-started/overview/template.md b/tests/dummy/app/pods/docs/getting-started/overview/template.md index 4f1668dde..35807d97d 100644 --- a/tests/dummy/app/pods/docs/getting-started/overview/template.md +++ b/tests/dummy/app/pods/docs/getting-started/overview/template.md @@ -50,7 +50,7 @@ This generates the following file: ```js // mirage/models/movie.js -import { Model } from 'ember-cli-mirage'; +import { Model } from 'miragejs'; export default Model.extend({ }); @@ -95,7 +95,7 @@ We can then define some properties on our Factory. They can be simple types like ```js // mirage/factories/movie.js -import { Factory } from 'ember-cli-mirage'; +import { Factory } from 'miragejs'; export default Factory.extend({ @@ -220,14 +220,14 @@ Let's say your movie has many cast-members. You can declare this relationship in ```js // mirage/models/movie.js -import { Model, hasMany } from 'ember-cli-mirage'; +import { Model, hasMany } from 'miragejs'; export default Model.extend({ castMembers: hasMany() }); // mirage/models/cast-member.js -import { Model, belongsTo } from 'ember-cli-mirage'; +import { Model, belongsTo } from 'miragejs'; export default Model.extend({ movie: belongsTo() @@ -305,7 +305,7 @@ Mirage ships with a few named serializers that match popular backend formats. Yo ```js // mirage/serializers/application.js -import { Serializer } from 'ember-cli-mirage'; +import { Serializer } from 'miragejs'; export default Serializer.extend({ keyForAttribute(attr) { @@ -322,7 +322,7 @@ Mirage's serializer layer is also aware of your relationships, which helps when ```js // mirage/serializers/movie.js -import { Serializer } from 'ember-cli-mirage'; +import { Serializer } from 'miragejs'; export default Serializer.extend({ include: [ 'crewMembers' ] diff --git a/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md b/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md index b6ba1a7f8..0da205a0c 100644 --- a/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md +++ b/tests/dummy/app/pods/docs/getting-started/upgrade-guide/template.md @@ -51,8 +51,8 @@ yarn add -D faker 3. Change all imports of `faker` from the `ember-cli-packge` to import directly from `faker`: ```diff -- import { Factory, faker } from 'ember-cli-mirage'; -+ import { Factory } from 'ember-cli-mirage'; +- import { Factory, faker } from 'miragejs'; ++ import { Factory } from 'miragejs'; + import faker from 'faker'; ``` diff --git a/tests/dummy/app/pods/docs/route-handlers/functions/template.md b/tests/dummy/app/pods/docs/route-handlers/functions/template.md index 71f8ecb10..69a7dd562 100644 --- a/tests/dummy/app/pods/docs/route-handlers/functions/template.md +++ b/tests/dummy/app/pods/docs/route-handlers/functions/template.md @@ -230,7 +230,7 @@ You can customize both the response code and headers by returning an instance of ```js // mirage/config.js -import { Response } from 'ember-cli-mirage'; +import { Response } from 'miragejs'; export default function() { this.post('/authors', function(schema, request) { diff --git a/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md b/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md index ea87738a9..fc688388c 100644 --- a/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md +++ b/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md @@ -52,9 +52,9 @@ Say we wanted to test that when the user visits a details route for a movie titl ```js // mirage/factories/movie.js -import Mirage from 'ember-cli-mirage'; +import Factory from 'ember-cli-mirage'; -export default Mirage.Factory.extend({ +export default Factory.extend({ title: 'Interstellar' }); ``` diff --git a/tests/dummy/mirage/serializers/application.js b/tests/dummy/mirage/serializers/application.js index 9ebd0e296..6753a45f3 100644 --- a/tests/dummy/mirage/serializers/application.js +++ b/tests/dummy/mirage/serializers/application.js @@ -1,3 +1,3 @@ -import { JSONAPISerializer } from 'ember-cli-mirage'; +import { JSONAPISerializer } from 'miragejs'; export default JSONAPISerializer; diff --git a/tests/unit/serializers/ember-data-serializer-discover-test.js b/tests/unit/serializers/ember-data-serializer-discover-test.js index 2efb0b98a..3b175362b 100644 --- a/tests/unit/serializers/ember-data-serializer-discover-test.js +++ b/tests/unit/serializers/ember-data-serializer-discover-test.js @@ -1,6 +1,7 @@ import { module, test } from 'qunit'; import { setupTest } from 'ember-qunit'; -import {createServer, applyEmberDataSerializers} from 'ember-cli-mirage'; +import {createServer } from 'miragejs'; +import { applyEmberDataSerializers} from 'ember-cli-mirage'; module('Unit | Serializer | ember data serializer discover', function(hooks) { setupTest(hooks); From cf1576bae42718e55497d50cca5755b39bd198ee Mon Sep 17 00:00:00 2001 From: Rahul Kumar Date: Wed, 1 Dec 2021 13:21:12 +1300 Subject: [PATCH 817/879] chore: widen net for ember-get-config dependency to work with newer ones --- package.json | 2 +- yarn.lock | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 7d9d1360b..8ca07af4e 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "broccoli-merge-trees": "^4.2.0", "ember-auto-import": "^1.2.19", "ember-cli-babel": "^7.5.0", - "ember-get-config": "^0.3.0", + "ember-get-config": "0.2.4 - 0.5.0", "ember-inflector": "^2.0.0 || ^3.0.0 || ^4.0.0", "lodash-es": "^4.17.11", "miragejs": "^0.1.31" diff --git a/yarn.lock b/yarn.lock index 21af9b763..c2024608f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6441,6 +6441,39 @@ ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cl rimraf "^3.0.1" semver "^5.5.0" +ember-cli-babel@^7.26.6: + version "7.26.6" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.6.tgz#322fbbd3baad9dd99e3276ff05bc6faef5e54b39" + integrity sha512-040svtfj2RC35j/WMwdWJFusZaXmNoytLAMyBDGLMSlRvznudTxZjGlPV6UupmtTBApy58cEF8Fq4a+COWoEmQ== + dependencies: + "@babel/core" "^7.12.0" + "@babel/helper-compilation-targets" "^7.12.0" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-decorators" "^7.13.5" + "@babel/plugin-transform-modules-amd" "^7.13.0" + "@babel/plugin-transform-runtime" "^7.13.9" + "@babel/plugin-transform-typescript" "^7.13.0" + "@babel/polyfill" "^7.11.5" + "@babel/preset-env" "^7.12.0" + "@babel/runtime" "7.12.18" + amd-name-resolver "^1.3.1" + babel-plugin-debug-macros "^0.3.4" + babel-plugin-ember-data-packages-polyfill "^0.1.2" + babel-plugin-ember-modules-api-polyfill "^3.5.0" + babel-plugin-module-resolver "^3.2.0" + broccoli-babel-transpiler "^7.8.0" + broccoli-debug "^0.6.4" + broccoli-funnel "^2.0.2" + broccoli-source "^2.1.2" + clone "^2.1.2" + ember-cli-babel-plugin-helpers "^1.1.1" + ember-cli-version-checker "^4.1.0" + ensure-posix-path "^1.0.2" + fixturify-project "^1.10.0" + resolve-package-path "^3.1.0" + rimraf "^3.0.1" + semver "^5.5.0" + ember-cli-broccoli-sane-watcher@^2.1.1: version "2.2.2" resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.2.2.tgz#9bb1b04ddeb2c086aecd8693cbaeca1d88dc160c" @@ -6631,7 +6664,7 @@ ember-cli-htmlbars@^4.2.3: strip-bom "^4.0.0" walk-sync "^2.0.2" -ember-cli-htmlbars@^5.0.0, ember-cli-htmlbars@^5.2.0, ember-cli-htmlbars@^5.3.1: +ember-cli-htmlbars@^5.0.0, ember-cli-htmlbars@^5.2.0, ember-cli-htmlbars@^5.3.1, ember-cli-htmlbars@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.7.1.tgz#eb5b88c7d9083bc27665fb5447a9b7503b32ce4f" integrity sha512-9laCgL4tSy48orNoQgQKEHp93MaqAs9ZOl7or5q+8iyGGJHW6sVXIYrVv5/5O9HfV6Ts8/pW1rSoaeKyLUE+oA== @@ -7083,7 +7116,7 @@ ember-fetch@^8.0.2: node-fetch "^2.6.0" whatwg-fetch "^3.4.0" -ember-get-config@, ember-get-config@^0.3.0: +ember-get-config@: version "0.3.0" resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.3.0.tgz#a73a1a87b48d9dde4c66a0e52ed5260b8a48cfbd" integrity sha512-0e2pKzwW5lBZ4oJnvu9qHOht4sP1MWz/m3hyz8kpSoMdrlZVf62LDKZ6qfKgy8drcv5YhCMYE6QV7MhnqlrzEQ== @@ -7091,6 +7124,15 @@ ember-get-config@, ember-get-config@^0.3.0: broccoli-file-creator "^1.1.1" ember-cli-babel "^7.0.0" +"ember-get-config@0.2.4 - 0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.5.0.tgz#8195f3e4c0ff0742182c81ae54aad78d07a24bcf" + integrity sha512-y1osD6g8wV/BlDjuaN6OG5MT0iHY2X/yE38gUj/05uUIMIRfpcwOdWnFQHBiXIhDojvAJQTEF1VOYFIETQMkeQ== + dependencies: + broccoli-file-creator "^1.1.1" + ember-cli-babel "^7.26.6" + ember-cli-htmlbars "^5.7.1" + ember-get-config@^0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.2.4.tgz#118492a2a03d73e46004ed777928942021fe1ecd" From ca34a5f64d247eccdb034807e352a8b68e5c2fa5 Mon Sep 17 00:00:00 2001 From: Rahul Kumar Date: Wed, 1 Dec 2021 13:22:17 +1300 Subject: [PATCH 818/879] Run npx yarn-deduplicate --packages ember-cli-babel to clean up lock file --- yarn.lock | 35 +---------------------------------- 1 file changed, 1 insertion(+), 34 deletions(-) diff --git a/yarn.lock b/yarn.lock index c2024608f..c5f330176 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6408,40 +6408,7 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.2, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.4.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: - version "7.26.5" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.5.tgz#59904d1d73b5c816167238024d18b85c8b51debc" - integrity sha512-XLMk59yNJneItn/hkJn+kHjnnszdfXWo1sP95C0kouSfPtIsUC3a/f/FW6c59D8koPANJOIHiHP3zUpTpKsnTA== - dependencies: - "@babel/core" "^7.12.0" - "@babel/helper-compilation-targets" "^7.12.0" - "@babel/plugin-proposal-class-properties" "^7.13.0" - "@babel/plugin-proposal-decorators" "^7.13.5" - "@babel/plugin-transform-modules-amd" "^7.13.0" - "@babel/plugin-transform-runtime" "^7.13.9" - "@babel/plugin-transform-typescript" "^7.13.0" - "@babel/polyfill" "^7.11.5" - "@babel/preset-env" "^7.12.0" - "@babel/runtime" "7.12.18" - amd-name-resolver "^1.3.1" - babel-plugin-debug-macros "^0.3.4" - babel-plugin-ember-data-packages-polyfill "^0.1.2" - babel-plugin-ember-modules-api-polyfill "^3.5.0" - babel-plugin-module-resolver "^3.2.0" - broccoli-babel-transpiler "^7.8.0" - broccoli-debug "^0.6.4" - broccoli-funnel "^2.0.2" - broccoli-source "^2.1.2" - clone "^2.1.2" - ember-cli-babel-plugin-helpers "^1.1.1" - ember-cli-version-checker "^4.1.0" - ensure-posix-path "^1.0.2" - fixturify-project "^1.10.0" - resolve-package-path "^3.1.0" - rimraf "^3.0.1" - semver "^5.5.0" - -ember-cli-babel@^7.26.6: +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.2, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.26.6, ember-cli-babel@^7.4.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: version "7.26.6" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.6.tgz#322fbbd3baad9dd99e3276ff05bc6faef5e54b39" integrity sha512-040svtfj2RC35j/WMwdWJFusZaXmNoytLAMyBDGLMSlRvznudTxZjGlPV6UupmtTBApy58cEF8Fq4a+COWoEmQ== From fb21035bf5d761dc292c02bdb010cc28078ec439 Mon Sep 17 00:00:00 2001 From: Rahul Kumar Date: Wed, 1 Dec 2021 13:28:32 +1300 Subject: [PATCH 819/879] Run npx yarn-deduplicate --packages ember-get-config to clean up lock file --- yarn.lock | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index c5f330176..306c7f4b5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7083,15 +7083,7 @@ ember-fetch@^8.0.2: node-fetch "^2.6.0" whatwg-fetch "^3.4.0" -ember-get-config@: - version "0.3.0" - resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.3.0.tgz#a73a1a87b48d9dde4c66a0e52ed5260b8a48cfbd" - integrity sha512-0e2pKzwW5lBZ4oJnvu9qHOht4sP1MWz/m3hyz8kpSoMdrlZVf62LDKZ6qfKgy8drcv5YhCMYE6QV7MhnqlrzEQ== - dependencies: - broccoli-file-creator "^1.1.1" - ember-cli-babel "^7.0.0" - -"ember-get-config@0.2.4 - 0.5.0": +ember-get-config@, "ember-get-config@0.2.4 - 0.5.0": version "0.5.0" resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.5.0.tgz#8195f3e4c0ff0742182c81ae54aad78d07a24bcf" integrity sha512-y1osD6g8wV/BlDjuaN6OG5MT0iHY2X/yE38gUj/05uUIMIRfpcwOdWnFQHBiXIhDojvAJQTEF1VOYFIETQMkeQ== From efda9a2d330d7d5935e578fac7fe0a41595a6e0b Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Tue, 30 Nov 2021 01:12:04 -0500 Subject: [PATCH 820/879] Switch from travis to GH actions --- .github/workflows/ci.yml | 77 +++++++++++++++++++++++ config/ember-try.js | 131 ++++++++++++++++++++++----------------- 2 files changed, 151 insertions(+), 57 deletions(-) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..b792df176 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,77 @@ +name: CI + +on: + push: + branches: + - main + - master + pull_request: {} + +jobs: + test: + name: "Tests" + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Install Node + uses: actions/setup-node@v2 + with: + node-version: 12.x + cache: yarn + - name: Install Dependencies + run: yarn install --frozen-lockfile + - name: Lint + run: yarn lint + - name: Run Browser Tests + run: yarn test:browser + - name: Run Node Tests + run: yarn test:test-projects + + floating: + name: "Floating Dependencies" + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: 12.x + cache: yarn + - name: Install Dependencies + run: yarn install --no-lockfile + - name: Run Browser Tests + run: yarn test:browser + - name: Run Node Tests + run: yarn test:test-projects + + try-scenarios: + name: ${{ matrix.try-scenario }} + runs-on: ubuntu-latest + needs: 'test' + + strategy: + fail-fast: false + matrix: + try-scenario: + - ember-lts-3.20 + - ember-lts-3.24 + - ember-release + - ember-beta + - ember-canary + - ember-classic + - ember-default-with-jquery + #- embroider-safe + #- embroider-optimized + + steps: + - uses: actions/checkout@v2 + - name: Install Node + uses: actions/setup-node@v2 + with: + node-version: 12.x + cache: yarn + - name: Install Dependencies + run: yarn install --frozen-lockfile + - name: Run Tests + run: ./node_modules/.bin/ember try:one ${{ matrix.try-scenario }} diff --git a/config/ember-try.js b/config/ember-try.js index 74d97baac..7d4e2e632 100644 --- a/config/ember-try.js +++ b/config/ember-try.js @@ -1,68 +1,85 @@ 'use strict'; const getChannelURL = require('ember-source-channel-url'); +// const { embroiderSafe, embroiderOptimized } = require('@embroider/test-setup'); -module.exports = function() { - return Promise.all([ - getChannelURL('release'), - getChannelURL('beta'), - getChannelURL('canary') - ]).then((urls) => { - return { - useYarn: true, - scenarios: [ - { - name: 'ember-lts-3.20', - npm: { - devDependencies: { - 'ember-source': '~3.20.0' - } - } +module.exports = async function () { + return { + useYarn: true, + scenarios: [ + { + name: 'ember-lts-3.20', + npm: { + devDependencies: { + 'ember-source': '~3.20.5', + }, + }, + }, + { + name: 'ember-lts-3.24', + npm: { + devDependencies: { + 'ember-source': '~3.24.3', + }, }, - { - name: 'ember-release', - npm: { - devDependencies: { - 'ember-source': urls[0] - } - } + }, + { + name: 'ember-release', + npm: { + devDependencies: { + 'ember-source': await getChannelURL('release'), + }, }, - { - name: 'ember-beta', - npm: { - devDependencies: { - 'ember-source': urls[1] - } - } + }, + { + name: 'ember-beta', + npm: { + devDependencies: { + 'ember-source': await getChannelURL('beta'), + }, }, - { - name: 'ember-canary', - npm: { - devDependencies: { - 'ember-source': urls[2] - } - } + }, + { + name: 'ember-canary', + npm: { + devDependencies: { + 'ember-source': await getChannelURL('canary'), + }, }, - { - name: 'ember-default', - npm: { - devDependencies: {} - } + }, + { + name: 'ember-default-with-jquery', + env: { + EMBER_OPTIONAL_FEATURES: JSON.stringify({ + 'jquery-integration': true, + }), }, - { - name: 'ember-default-with-jquery', - env: { - EMBER_OPTIONAL_FEATURES: JSON.stringify({ - 'jquery-integration': true - }) + npm: { + devDependencies: { + '@ember/jquery': '^1.1.0', }, - npm: { - devDependencies: { - '@ember/jquery': '^0.5.1' - } - } - } - ] - }; - }); + }, + }, + { + name: 'ember-classic', + env: { + EMBER_OPTIONAL_FEATURES: JSON.stringify({ + 'application-template-wrapper': true, + 'default-async-observers': false, + 'template-only-glimmer-components': false, + }), + }, + npm: { + devDependencies: { + 'ember-source': '~3.28.0', + }, + ember: { + edition: 'classic', + }, + }, + }, + // embroiderSafe(), + // embroiderOptimized(), + ], + }; }; From 46590799ad2fd143aba29e2947fc741088f08a0e Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Tue, 30 Nov 2021 20:59:04 -0500 Subject: [PATCH 821/879] Add `node: 'current'` to targets.js for make FastBoot tests pass --- test-projects/01-basic-app/config/targets.js | 3 ++- test-projects/02-app-that-excludes-mirage/config/targets.js | 3 ++- tests/dummy/config/targets.js | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/test-projects/01-basic-app/config/targets.js b/test-projects/01-basic-app/config/targets.js index 8ffae3636..276d39d41 100644 --- a/test-projects/01-basic-app/config/targets.js +++ b/test-projects/01-basic-app/config/targets.js @@ -14,5 +14,6 @@ if (isCI || isProduction) { } module.exports = { - browsers + browsers, + node: 'current' }; diff --git a/test-projects/02-app-that-excludes-mirage/config/targets.js b/test-projects/02-app-that-excludes-mirage/config/targets.js index 8ffae3636..276d39d41 100644 --- a/test-projects/02-app-that-excludes-mirage/config/targets.js +++ b/test-projects/02-app-that-excludes-mirage/config/targets.js @@ -14,5 +14,6 @@ if (isCI || isProduction) { } module.exports = { - browsers + browsers, + node: 'current' }; diff --git a/tests/dummy/config/targets.js b/tests/dummy/config/targets.js index 8ffae3636..276d39d41 100644 --- a/tests/dummy/config/targets.js +++ b/tests/dummy/config/targets.js @@ -14,5 +14,6 @@ if (isCI || isProduction) { } module.exports = { - browsers + browsers, + node: 'current' }; From 0b91b135adf40d2c5205817e3c4208d6b37ccb4e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Dec 2021 13:49:53 +0000 Subject: [PATCH 822/879] Bump color-string from 1.5.3 to 1.8.2 Bumps [color-string](https://github.com/Qix-/color-string) from 1.5.3 to 1.8.2. - [Release notes](https://github.com/Qix-/color-string/releases) - [Changelog](https://github.com/Qix-/color-string/blob/master/CHANGELOG.md) - [Commits](https://github.com/Qix-/color-string/commits/1.8.2) --- updated-dependencies: - dependency-name: color-string dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 306c7f4b5..a5d74cb09 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5300,9 +5300,9 @@ color-name@^1.0.0, color-name@~1.1.4: integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^1.5.2: - version "1.5.3" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" - integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== + version "1.8.2" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.8.2.tgz#08bd49fa5f3889c27b0c670052ed746dd7a671de" + integrity sha512-w5ZkKRdLsc5NOYsmnpS2DpyRW71npwZGwbRpLrJTuqjfTs2Bhrba7UiV59IX9siBlCPl2pne5NtiwnVWUzvYFA== dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" From 4a90e5e9e67c7efac5b9c762857bfc515f2aed32 Mon Sep 17 00:00:00 2001 From: Brian Gantzler Date: Wed, 1 Dec 2021 08:52:32 -0500 Subject: [PATCH 823/879] Fixed an import and some spacing --- tests/dummy/app/pods/docs/testing/acceptance-tests/template.md | 2 +- tests/unit/serializers/ember-data-serializer-discover-test.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md b/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md index fc688388c..b70dbd966 100644 --- a/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md +++ b/tests/dummy/app/pods/docs/testing/acceptance-tests/template.md @@ -52,7 +52,7 @@ Say we wanted to test that when the user visits a details route for a movie titl ```js // mirage/factories/movie.js -import Factory from 'ember-cli-mirage'; +import { Factory } from 'miragejs'; export default Factory.extend({ title: 'Interstellar' diff --git a/tests/unit/serializers/ember-data-serializer-discover-test.js b/tests/unit/serializers/ember-data-serializer-discover-test.js index 3b175362b..31d828371 100644 --- a/tests/unit/serializers/ember-data-serializer-discover-test.js +++ b/tests/unit/serializers/ember-data-serializer-discover-test.js @@ -1,6 +1,6 @@ import { module, test } from 'qunit'; import { setupTest } from 'ember-qunit'; -import {createServer } from 'miragejs'; +import { createServer } from 'miragejs'; import { applyEmberDataSerializers} from 'ember-cli-mirage'; module('Unit | Serializer | ember data serializer discover', function(hooks) { From 2423102d878a30733bb7cc357d5a83d7f17bf345 Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Wed, 1 Dec 2021 12:19:53 -0500 Subject: [PATCH 824/879] Add `timeout-minutes: 60` to ci.yml config to avoid timeouts --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b792df176..b8cd12598 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,6 +11,7 @@ jobs: test: name: "Tests" runs-on: ubuntu-latest + timeout-minutes: 60 steps: - uses: actions/checkout@v2 @@ -31,6 +32,7 @@ jobs: floating: name: "Floating Dependencies" runs-on: ubuntu-latest + timeout-minutes: 60 steps: - uses: actions/checkout@v2 @@ -48,6 +50,7 @@ jobs: try-scenarios: name: ${{ matrix.try-scenario }} runs-on: ubuntu-latest + timeout-minutes: 60 needs: 'test' strategy: From 0bc15980fd3678e7355e8019c7fbf571ccf9dd74 Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Wed, 1 Dec 2021 13:24:38 -0500 Subject: [PATCH 825/879] Add lint npm script per latest addon blueprint --- package.json | 7 +- test-projects/01-basic-app/package.json | 3 + .../02-app-that-excludes-mirage/package.json | 3 + yarn.lock | 281 +++++++++++++++++- 4 files changed, 291 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 8ca07af4e..075b78ffa 100644 --- a/package.json +++ b/package.json @@ -25,8 +25,12 @@ }, "scripts": { "build": "ember build", + "lint": "npm-run-all --aggregate-output --continue-on-error --parallel \"lint:!(fix)\"", + "lint:fix": "npm-run-all --aggregate-output --continue-on-error --parallel lint:*:fix", "lint:hbs": "ember-template-lint .", - "lint:js": "eslint .", + "lint:hbs:fix": "ember-template-lint . --fix", + "lint:js": "eslint . --cache", + "lint:js:fix": "eslint . --fix", "start": "ember serve", "test": "ember test", "test:all": "ember try:each", @@ -88,6 +92,7 @@ "js-yaml": "^4.0.0", "jsdom": "^16.2.2", "loader.js": "^4.7.0", + "npm-run-all": "^4.1.5", "qunit-dom": "^1.1.0" }, "resolutions": { diff --git a/test-projects/01-basic-app/package.json b/test-projects/01-basic-app/package.json index 3e8ea1043..d15325ccb 100644 --- a/test-projects/01-basic-app/package.json +++ b/test-projects/01-basic-app/package.json @@ -50,5 +50,8 @@ }, "engines": { "node": ">= 8.*" + }, + "volta": { + "extends": "../../package.json" } } diff --git a/test-projects/02-app-that-excludes-mirage/package.json b/test-projects/02-app-that-excludes-mirage/package.json index 2c507e7bc..5798b4530 100644 --- a/test-projects/02-app-that-excludes-mirage/package.json +++ b/test-projects/02-app-that-excludes-mirage/package.json @@ -46,5 +46,8 @@ }, "engines": { "node": ">= 8.*" + }, + "volta": { + "extends": "../../package.json" } } diff --git a/yarn.lock b/yarn.lock index 306c7f4b5..d3229c377 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4845,6 +4845,14 @@ calculate-cache-key-for-tree@^2.0.0: dependencies: json-stable-stringify "^1.0.1" +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -7528,7 +7536,7 @@ errno@^0.1.3, errno@~0.1.7: dependencies: prr "~1.0.1" -error-ex@^1.2.0: +error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== @@ -7559,6 +7567,32 @@ es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: string.prototype.trimleft "^2.1.1" string.prototype.trimright "^2.1.1" +es-abstract@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -8681,6 +8715,15 @@ get-caller-file@^1.0.0, get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" @@ -8713,6 +8756,14 @@ get-stream@^5.0.0: dependencies: pump "^3.0.0" +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -8966,6 +9017,11 @@ has-ansi@^3.0.0: dependencies: ansi-regex "^3.0.0" +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + has-binary2@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" @@ -8998,6 +9054,11 @@ has-symbols@^1.0.0, has-symbols@^1.0.1: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== +has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + has-to-string-tag-x@^1.2.0: version "1.4.1" resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" @@ -9005,6 +9066,13 @@ has-to-string-tag-x@^1.2.0: dependencies: has-symbol-support-x "^1.4.1" +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -9469,6 +9537,15 @@ inquirer@^7.3.3: strip-ansi "^6.0.0" through "^2.3.6" +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + into-stream@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" @@ -9523,6 +9600,13 @@ is-arrayish@^0.3.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -9537,6 +9621,14 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -9547,6 +9639,11 @@ is-callable@^1.1.4, is-callable@^1.1.5: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== +is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -9647,6 +9744,18 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -9715,11 +9824,24 @@ is-regex@^1.0.5: dependencies: has "^1.0.3" +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -9730,6 +9852,13 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + is-symbol@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" @@ -9737,6 +9866,13 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.1" +is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + is-type@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/is-type/-/is-type-0.0.1.tgz#f651d85c365d44955d14a51d8d7061f3f6b4779c" @@ -9754,6 +9890,13 @@ is-utf8@^0.2.0: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= +is-weakref@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" + integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ== + dependencies: + call-bind "^1.0.0" + is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -10046,7 +10189,7 @@ json-buffer@3.0.0: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= -json-parse-better-errors@^1.0.2: +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== @@ -10272,6 +10415,16 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" @@ -10879,6 +11032,11 @@ memory-streams@^0.1.3: dependencies: readable-stream "~1.0.2" +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= + meow@^3.4.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" @@ -11452,6 +11610,21 @@ npm-package-arg@^6.1.0: semver "^5.6.0" validate-npm-package-name "^3.0.0" +npm-run-all@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" + integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== + dependencies: + ansi-styles "^3.2.1" + chalk "^2.4.1" + cross-spawn "^6.0.5" + memorystream "^0.3.1" + minimatch "^3.0.4" + pidtree "^0.3.0" + read-pkg "^3.0.0" + shell-quote "^1.6.1" + string.prototype.padend "^3.0.0" + npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -11537,6 +11710,11 @@ object-hash@^1.3.1: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== + object-inspect@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" @@ -11564,6 +11742,16 @@ object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + object.getownpropertydescriptors@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" @@ -11850,6 +12038,14 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + parse-ms@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" @@ -11984,6 +12180,13 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -12035,6 +12238,11 @@ picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.0.7, picomatch@^2.2.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +pidtree@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" + integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -12517,6 +12725,15 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -13316,11 +13533,25 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@^1.6.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" + integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== + shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -13790,6 +14021,23 @@ string-width@^4.1.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string.prototype.padend@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz#997a6de12c92c7cb34dc8a201a6c53d9bd88a5f1" + integrity sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + string.prototype.trimleft@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" @@ -13806,6 +14054,14 @@ string.prototype.trimright@^2.1.1: define-properties "^1.1.3" function-bind "^1.1.1" +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + string_decoder@0.10, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -14460,6 +14716,16 @@ uglify-js@^3.1.4: resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.5.tgz#5d71d6dbba64cf441f32929b1efce7365bb4f113" integrity sha512-xtB8yEqIkn7zmOyS2zUNBsYCBRhDkvlNxMMY2smuJ/qA8NCHeQvKCF3i9Z4k8FJH4+PJvZRtMrPynfZ75+CSZw== +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + underscore.string@~3.3.4: version "3.3.5" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023" @@ -14958,6 +15224,17 @@ whatwg-url@^8.0.0, whatwg-url@^8.5.0: tr46 "^2.0.2" webidl-conversions "^6.1.0" +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" From c44933a812cd16c98758367d7a8b661bbcfb7ecc Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Wed, 1 Dec 2021 13:28:25 -0500 Subject: [PATCH 826/879] Fix ESLint errors --- blueprints/ember-cli-mirage/index.js | 1 - blueprints/mirage-identity-manager/index.js | 2 ++ config/addon-docs.js | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/blueprints/ember-cli-mirage/index.js b/blueprints/ember-cli-mirage/index.js index 1f2f64c5a..964b06528 100644 --- a/blueprints/ember-cli-mirage/index.js +++ b/blueprints/ember-cli-mirage/index.js @@ -4,7 +4,6 @@ var path = require('path'); var fs = require('fs'); -var EOL = require('os').EOL; module.exports = { normalizeEntityName: function() { diff --git a/blueprints/mirage-identity-manager/index.js b/blueprints/mirage-identity-manager/index.js index 0ffc209dc..35e2e1011 100644 --- a/blueprints/mirage-identity-manager/index.js +++ b/blueprints/mirage-identity-manager/index.js @@ -1,5 +1,7 @@ /*jshint node:true*/ +var path = require('path'); + module.exports = { description: 'Generates a Mirage identity manager', diff --git a/config/addon-docs.js b/config/addon-docs.js index 1e05adf7e..2e88f6143 100644 --- a/config/addon-docs.js +++ b/config/addon-docs.js @@ -1,6 +1,7 @@ /* eslint-env node */ 'use strict'; +/* eslint-disable-next-line node/no-unpublished-require */ const AddonDocsConfig = require('ember-cli-addon-docs/lib/config'); module.exports = class extends AddonDocsConfig { From 43438e13bbe1b27a15b08dee6e92ccbb29faabb7 Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Wed, 1 Dec 2021 13:57:41 -0500 Subject: [PATCH 827/879] Disable ember-template-lint --- package.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/package.json b/package.json index 075b78ffa..19dfcd45d 100644 --- a/package.json +++ b/package.json @@ -27,8 +27,6 @@ "build": "ember build", "lint": "npm-run-all --aggregate-output --continue-on-error --parallel \"lint:!(fix)\"", "lint:fix": "npm-run-all --aggregate-output --continue-on-error --parallel lint:*:fix", - "lint:hbs": "ember-template-lint .", - "lint:hbs:fix": "ember-template-lint . --fix", "lint:js": "eslint . --cache", "lint:js:fix": "eslint . --fix", "start": "ember serve", From 8c7413f1b3fdb78148a0426ebb985b6261f60ae9 Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Wed, 1 Dec 2021 14:50:36 -0500 Subject: [PATCH 828/879] Use Ember.js 3.24 for ember-classic scenario until deps updated --- config/ember-try.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/ember-try.js b/config/ember-try.js index 7d4e2e632..2f353d2e5 100644 --- a/config/ember-try.js +++ b/config/ember-try.js @@ -71,7 +71,7 @@ module.exports = async function () { }, npm: { devDependencies: { - 'ember-source': '~3.28.0', + 'ember-source': '~3.24.0', }, ember: { edition: 'classic', From 245db98a5eb4f5d42649f7f9ec7ff44468af7063 Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Wed, 1 Dec 2021 22:20:45 -0500 Subject: [PATCH 829/879] Introduce ember-template-lint and fix issues --- package.json | 3 + .../app/pods/crud-demo-error/template.hbs | 2 +- .../app/pods/crud-demo/controller.js | 45 +- .../app/pods/crud-demo/template.hbs | 20 +- .../app/pods/module-count/template.hbs | 6 +- .../app/serializers/application.js | 3 +- .../app/templates/application.hbs | 6 +- .../app/controllers/application.js | 2 + .../app/templates/application.hbs | 6 +- tests/dummy/app/pods/application/template.hbs | 6 +- tests/dummy/app/pods/blog/detail/template.hbs | 16 +- tests/dummy/app/pods/blog/error/template.hbs | 2 +- tests/dummy/app/pods/blog/index/template.hbs | 6 +- tests/dummy/app/pods/docs/template.hbs | 18 +- tests/dummy/app/pods/index/template.hbs | 6 +- tests/dummy/app/pods/not-found/template.hbs | 2 +- yarn.lock | 445 +++++++++++++++++- 17 files changed, 522 insertions(+), 72 deletions(-) diff --git a/package.json b/package.json index 19dfcd45d..dc85ceac2 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,8 @@ "build": "ember build", "lint": "npm-run-all --aggregate-output --continue-on-error --parallel \"lint:!(fix)\"", "lint:fix": "npm-run-all --aggregate-output --continue-on-error --parallel lint:*:fix", + "lint:hbs": "ember-template-lint .", + "lint:hbs:fix": "ember-template-lint . --fix", "lint:js": "eslint . --cache", "lint:js:fix": "eslint . --fix", "start": "ember serve", @@ -81,6 +83,7 @@ "ember-resolver": "^8.0.2", "ember-source": "~3.26.1", "ember-source-channel-url": "^3.0.0", + "ember-template-lint": "^3.14.0", "ember-try": "^1.0.0", "escape-string-regexp": "^4.0.0", "eslint-plugin-ember": "^8.1.0", diff --git a/test-projects/01-basic-app/app/pods/crud-demo-error/template.hbs b/test-projects/01-basic-app/app/pods/crud-demo-error/template.hbs index 0454883f4..21a1838f7 100644 --- a/test-projects/01-basic-app/app/pods/crud-demo-error/template.hbs +++ b/test-projects/01-basic-app/app/pods/crud-demo-error/template.hbs @@ -1,5 +1,5 @@

    WHOOPS

    - {{model.errors.firstObject}} + {{this.model.errors.firstObject}}

    diff --git a/test-projects/01-basic-app/app/pods/crud-demo/controller.js b/test-projects/01-basic-app/app/pods/crud-demo/controller.js index e87f8af82..0c5c18f46 100644 --- a/test-projects/01-basic-app/app/pods/crud-demo/controller.js +++ b/test-projects/01-basic-app/app/pods/crud-demo/controller.js @@ -1,29 +1,34 @@ import Controller from '@ember/controller'; import { inject as service } from '@ember/service'; +import { action } from '@ember/object'; export default Controller.extend({ store: service(), - actions: { - createUser() { - let name = this.get('newName'); - - this.get('store') - .createRecord('user', { name }) - .save() - .then(() => { - this.set('newName', ''); - }); - }, - - updateUser(user) { - user.save(); - }, - - deleteUser(user) { - user.destroyRecord(); - } - } + createUser: action(function (event) { + event.preventDefault(); + + let name = this.get('newName'); + + this.get('store') + .createRecord('user', { name }) + .save() + .then(() => { + this.set('newName', ''); + }); + }), + + updateUser: action(function (user, event) { + event.preventDefault(); + + user.save(); + }), + + deleteUser: action(function (user, event) { + event.preventDefault(); + + user.destroyRecord(); + }), }); diff --git a/test-projects/01-basic-app/app/pods/crud-demo/template.hbs b/test-projects/01-basic-app/app/pods/crud-demo/template.hbs index 7e052ef79..a705566fb 100644 --- a/test-projects/01-basic-app/app/pods/crud-demo/template.hbs +++ b/test-projects/01-basic-app/app/pods/crud-demo/template.hbs @@ -1,17 +1,17 @@ -{{#if error}} +{{#if this.error}}

    - There was an error: {{error}} + There was an error: {{this.error}}

    {{else}} - {{#each model as |user|}} + {{#each this.model as |user|}}
    -
    - {{input value=user.name}} - - + + + + {{#if user.isSaving}} Saving... @@ -28,13 +28,13 @@
    - +
    - {{input value=newName placeholder='Name'}} +
    -
    diff --git a/test-projects/01-basic-app/app/pods/module-count/template.hbs b/test-projects/01-basic-app/app/pods/module-count/template.hbs index 719d77ed1..ae84b795e 100644 --- a/test-projects/01-basic-app/app/pods/module-count/template.hbs +++ b/test-projects/01-basic-app/app/pods/module-count/template.hbs @@ -1,20 +1,20 @@

    Environment: - {{environment}} + {{this.environment}}

    Mirage modules in project: - {{mirageModules.length}} + {{this.mirageModules.length}}

    Other modules in project: - {{otherIncludedModules.length}} + {{this.otherIncludedModules.length}}

    diff --git a/test-projects/01-basic-app/app/serializers/application.js b/test-projects/01-basic-app/app/serializers/application.js index 81056c386..33d31a206 100644 --- a/test-projects/01-basic-app/app/serializers/application.js +++ b/test-projects/01-basic-app/app/serializers/application.js @@ -1,4 +1,3 @@ import JSONAPISerializer from '@ember-data/serializer/json-api'; -export default JSONAPISerializer.extend({ -}); +export default class extends JSONAPISerializer {} diff --git a/test-projects/01-basic-app/app/templates/application.hbs b/test-projects/01-basic-app/app/templates/application.hbs index 14ccd024c..aa16a3ead 100644 --- a/test-projects/01-basic-app/app/templates/application.hbs +++ b/test-projects/01-basic-app/app/templates/application.hbs @@ -3,20 +3,20 @@

    Environment: - {{environment}} + {{this.environment}}

    Mirage modules in project: - {{mirageModules.length}} + {{this.mirageModules.length}}

    Other modules in project: - {{otherIncludedModules.length}} + {{this.otherIncludedModules.length}}

    diff --git a/test-projects/02-app-that-excludes-mirage/app/controllers/application.js b/test-projects/02-app-that-excludes-mirage/app/controllers/application.js index ebf85aef1..a37f3c2fc 100644 --- a/test-projects/02-app-that-excludes-mirage/app/controllers/application.js +++ b/test-projects/02-app-that-excludes-mirage/app/controllers/application.js @@ -1,9 +1,11 @@ /* global requirejs */ import Controller from '@ember/controller'; +import { inject as service } from '@ember/service'; import { computed } from '@ember/object'; import ENV from 'basic-app/config/environment'; export default Controller.extend({ + wifi: service(), environment: ENV.environment, diff --git a/test-projects/02-app-that-excludes-mirage/app/templates/application.hbs b/test-projects/02-app-that-excludes-mirage/app/templates/application.hbs index 4641b1a20..b525cba75 100644 --- a/test-projects/02-app-that-excludes-mirage/app/templates/application.hbs +++ b/test-projects/02-app-that-excludes-mirage/app/templates/application.hbs @@ -1,19 +1,19 @@

    Welcome to Ember

    -{{#if wifi.isConnected}} +{{#if this.wifi.isConnected}}

    We ran the initializer

    {{/if}}

    Mirage modules in project: - {{mirageModules.length}} + {{this.mirageModules.length}}

    Other modules in project: - {{otherIncludedModules.length}} + {{this.otherIncludedModules.length}}

    diff --git a/tests/dummy/app/pods/application/template.hbs b/tests/dummy/app/pods/application/template.hbs index cd74283a1..445adab58 100644 --- a/tests/dummy/app/pods/application/template.hbs +++ b/tests/dummy/app/pods/application/template.hbs @@ -1,9 +1,9 @@ -{{#docs-header as |header|}} + {{#header.link "blog"}} Blog {{/header.link}} -{{/docs-header}} + {{outlet}} -{{docs-keyboard-shortcuts}} + diff --git a/tests/dummy/app/pods/blog/detail/template.hbs b/tests/dummy/app/pods/blog/detail/template.hbs index c9ba0bc06..ba8d6bb4a 100644 --- a/tests/dummy/app/pods/blog/detail/template.hbs +++ b/tests/dummy/app/pods/blog/detail/template.hbs @@ -1,19 +1,19 @@ {{!-- docs-md is a private class. Can switch once we expose AddonDocs styles publicly. --}}
    - {{#link-to "blog" class="blog-detail__back-link"}} + ↠All posts - {{/link-to}} +
    -

    @@ -21,7 +21,7 @@

    Comments

    - {{#each model.comments as |comment|}} + {{#each this.model.comments as |comment|}}
    profile @@ -44,7 +44,7 @@ diff --git a/tests/dummy/app/pods/blog/error/template.hbs b/tests/dummy/app/pods/blog/error/template.hbs index a8661c285..41a6ac37c 100644 --- a/tests/dummy/app/pods/blog/error/template.hbs +++ b/tests/dummy/app/pods/blog/error/template.hbs @@ -1,5 +1,5 @@

    We're sorry...

    - {{model.responseJSON.message}} + {{this.model.responseJSON.message}}

    diff --git a/tests/dummy/app/pods/blog/index/template.hbs b/tests/dummy/app/pods/blog/index/template.hbs index b81dfbc49..ab25bf282 100644 --- a/tests/dummy/app/pods/blog/index/template.hbs +++ b/tests/dummy/app/pods/blog/index/template.hbs @@ -1,15 +1,15 @@

    Blog

    - {{#each (sort-by "meta.publishedAt:desc" model) as |post|}} + {{#each (sort-by "meta.publishedAt:desc" this.model) as |post|}}

    - {{#link-to "blog.detail" post.slugAndId}} + {{post.title}} - {{/link-to}} +

    {{/each}} diff --git a/tests/dummy/app/pods/docs/template.hbs b/tests/dummy/app/pods/docs/template.hbs index 0e24f8f07..139e246a2 100644 --- a/tests/dummy/app/pods/docs/template.hbs +++ b/tests/dummy/app/pods/docs/template.hbs @@ -1,6 +1,6 @@ -{{#docs-viewer as |viewer|}} + - {{#viewer.nav as |nav|}} + {{nav.section "Getting started"}} {{nav.item "What is Mirage?" "docs.getting-started.what-is-mirage"}} {{nav.item "Installation" "docs.getting-started.installation"}} @@ -19,9 +19,9 @@ {{nav.item "Factories" "docs.data-layer.factories"}} {{nav.item "Fixtures" "docs.data-layer.fixtures"}} {{nav.item "Serializers" "docs.data-layer.serializers"}} - {{#nav.subnav as |nav|}} - {{nav.item "Ember Data Serializer" "docs.data-layer.serializers.ember-data-serializer"}} - {{/nav.subnav}} + + {{nav.item "Ember Data Serializer" "docs.data-layer.serializers.ember-data-serializer"}} + {{nav.section "Testing"}} {{nav.item "Acceptance tests" "docs.testing.acceptance-tests"}} @@ -36,10 +36,10 @@ {{nav.item "Customizing the inflector" "docs.advanced.customizing-the-inflector"}} {{nav.item "Switching between scenarios" "docs.advanced.switching-between-scenarios"}} - {{/viewer.nav}} + - {{#viewer.main}} + {{outlet}} - {{/viewer.main}} + -{{/docs-viewer}} + diff --git a/tests/dummy/app/pods/index/template.hbs b/tests/dummy/app/pods/index/template.hbs index 718cadfb3..ebf45da9c 100644 --- a/tests/dummy/app/pods/index/template.hbs +++ b/tests/dummy/app/pods/index/template.hbs @@ -1,4 +1,4 @@ -{{docs-hero}} +
    @@ -23,8 +23,8 @@
    - {{#link-to "docs" class="home__cta-link"}} + Read the docs - {{/link-to}} +
    diff --git a/tests/dummy/app/pods/not-found/template.hbs b/tests/dummy/app/pods/not-found/template.hbs index b47394cdd..ff6dab082 100644 --- a/tests/dummy/app/pods/not-found/template.hbs +++ b/tests/dummy/app/pods/not-found/template.hbs @@ -1,4 +1,4 @@

    Not found

    -

    This page doesn't exist. {{#link-to "index"}}Head home?{{/link-to}}

    +

    This page doesn't exist. Head home?

    diff --git a/yarn.lock b/yarn.lock index d3229c377..25f1f245e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1422,6 +1422,16 @@ ember-cli-typescript "^3.0.0" heimdalljs "^0.3.0" +"@ember-template-lint/todo-utils@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@ember-template-lint/todo-utils/-/todo-utils-10.0.0.tgz#085aafcf31ca04ba4d3a9460f088aed752b90ea8" + integrity sha512-US8VKnetBOl8KfKz+rXGsosz6rIETNwSz2F2frM8hIoJfF/d6ME1Iz1K7tPYZEE6SoKqZFlBs5XZPSmzRnabjA== + dependencies: + "@types/eslint" "^7.2.13" + fs-extra "^9.1.0" + slash "^3.0.0" + tslib "^2.2.0" + "@ember/edition-utils@^1.1.1", "@ember/edition-utils@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@ember/edition-utils/-/edition-utils-1.2.0.tgz#a039f542dc14c8e8299c81cd5abba95e2459cfa6" @@ -1589,6 +1599,20 @@ resolved "https://registry.yarnpkg.com/@glimmer/env/-/env-0.1.7.tgz#fd2d2b55a9029c6b37a6c935e8c8871ae70dfa07" integrity sha1-/S0rVakCnGs3psk16MiHGucN+gc= +"@glimmer/global-context@0.65.4": + version "0.65.4" + resolved "https://registry.yarnpkg.com/@glimmer/global-context/-/global-context-0.65.4.tgz#1da1d59dd4260ce912c40e474cd39c2e82de51b8" + integrity sha512-RSYCPG/uVR5XCDcPREBclncU7R0zkjACbADP+n3FWAH1TfWbXRMDIkvO/ZlwHkjHoCZf6tIM6p5S/MoFzfJEJA== + dependencies: + "@glimmer/env" "^0.1.7" + +"@glimmer/interfaces@0.65.4": + version "0.65.4" + resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.65.4.tgz#d298cc2b12b8ebcf269f39246ca7ab92816f6680" + integrity sha512-R0kby79tGNKZOojVJa/7y0JH9Eq4SV+L1s6GcZy30QUZ1g1AAGS5XwCIXc9Sc09coGcv//q+6NLeSw7nlx1y4A== + dependencies: + "@simple-dom/interface" "^1.4.0" + "@glimmer/interfaces@^0.42.2": version "0.42.2" resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.42.2.tgz#9cf8d6f8f5eee6bfcfa36919ca68ae716e1f78db" @@ -1622,6 +1646,17 @@ dependencies: "@glimmer/util" "^0.42.2" +"@glimmer/reference@^0.65.0": + version "0.65.4" + resolved "https://registry.yarnpkg.com/@glimmer/reference/-/reference-0.65.4.tgz#bbc8becd6a1bf01fc189b6489e27446437194711" + integrity sha512-yuRVE4qyqrlCndDMrHKDWUbDmGDCjPzsFtlTmxxnhDMJAdQsnr2cRLITHvQRDm1tXfigVvyKnomeuYhRRbBqYQ== + dependencies: + "@glimmer/env" "^0.1.7" + "@glimmer/global-context" "0.65.4" + "@glimmer/interfaces" "0.65.4" + "@glimmer/util" "0.65.4" + "@glimmer/validator" "0.65.4" + "@glimmer/runtime@^0.42.1": version "0.42.2" resolved "https://registry.yarnpkg.com/@glimmer/runtime/-/runtime-0.42.2.tgz#50e7da5d3cf9144248048a7478be3c489784a4bb" @@ -1655,6 +1690,25 @@ handlebars "^4.7.4" simple-html-tokenizer "^0.5.9" +"@glimmer/syntax@^0.65.0": + version "0.65.4" + resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.65.4.tgz#49164de5dc9e8b67084ec009bdd865e379d8a971" + integrity sha512-y+/C3e8w96efk3a/Z5If9o4ztKJwrr8RtDpbhV2J8X+DUsn5ic2N3IIdlThbt/Zn6tkP1K3dY6uaFUx3pGTvVQ== + dependencies: + "@glimmer/interfaces" "0.65.4" + "@glimmer/util" "0.65.4" + "@handlebars/parser" "^1.1.0" + simple-html-tokenizer "^0.5.10" + +"@glimmer/util@0.65.4": + version "0.65.4" + resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.65.4.tgz#e464145078f3f40da9013ff2590a6016515455d2" + integrity sha512-aofe+rdBhkREKP2GZta6jy1UcbRRMfWx7M18zxGxspPoeD08NscD04Kx+WiOKXmC1TcrfITr8jvqMfrKrMzYWQ== + dependencies: + "@glimmer/env" "0.1.7" + "@glimmer/interfaces" "0.65.4" + "@simple-dom/interface" "^1.4.0" + "@glimmer/util@^0.42.2": version "0.42.2" resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.42.2.tgz#9ca1631e42766ea6059f4b49d0bdfb6095aad2c4" @@ -1669,6 +1723,14 @@ "@glimmer/interfaces" "^0.61.2" "@simple-dom/interface" "^1.4.0" +"@glimmer/validator@0.65.4", "@glimmer/validator@^0.65.0": + version "0.65.4" + resolved "https://registry.yarnpkg.com/@glimmer/validator/-/validator-0.65.4.tgz#12c27a9a63706c60e6499fd687940e9d1affb32c" + integrity sha512-0YUjAyo45DF5JkQxdv5kHn96nMNhvZiEwsAD4Jme0kk5Q9MQcPOUtN76pQAS4f+C6GdF9DeUr2yGXZLFMmb+LA== + dependencies: + "@glimmer/env" "^0.1.7" + "@glimmer/global-context" "0.65.4" + "@glimmer/vm-babel-plugins@0.77.5": version "0.77.5" resolved "https://registry.yarnpkg.com/@glimmer/vm-babel-plugins/-/vm-babel-plugins-0.77.5.tgz#daffb6507aa6b08ec36f69d652897d339fdd0007" @@ -1692,6 +1754,11 @@ "@glimmer/interfaces" "^0.42.2" "@glimmer/util" "^0.42.2" +"@handlebars/parser@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@handlebars/parser/-/parser-1.1.0.tgz#d6dbc7574774b238114582410e8fee0dc3532bdf" + integrity sha512-rR7tJoSwJ2eooOpYGxGGW95sLq6GXUaS1UtWvN7pei6n2/okYvCGld9vsUTvkl2migxbkszsycwtMf/GEc1k1A== + "@jimp/bmp@^0.5.4": version "0.5.4" resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.5.4.tgz#b7b375aa774f26154912569864d5466e71333ef1" @@ -2166,6 +2233,14 @@ resolved "https://registry.yarnpkg.com/@types/ember__utils/-/ember__utils-3.0.3.tgz#c7bfe0ea89411f3376965a1214028561fdcd24eb" integrity sha512-GhXlUsGln/7PzLMqmtplqLSG8IWu2F9AjEKlqds/BrZlQtbMVS3MCvIkH1R8xlatYml02PqIdd9rZLi7r6QS6Q== +"@types/eslint@^7.2.13": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.29.0.tgz#e56ddc8e542815272720bb0b4ccc2aff9c3e1c78" + integrity sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + "@types/estree@*": version "0.0.44" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.44.tgz#980cc5a29a3ef3bea6ff1f7d021047d7ea575e21" @@ -2209,6 +2284,11 @@ dependencies: "@types/sizzle" "*" +"@types/json-schema@*": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + "@types/minimatch@*", "@types/minimatch@^3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -2588,6 +2668,11 @@ ansi-regex@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -2600,6 +2685,13 @@ ansi-styles@^3.0.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + ansi-styles@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" @@ -3625,6 +3717,11 @@ base64-js@^1.0.2: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + base64id@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" @@ -3694,6 +3791,15 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + blank-object@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/blank-object/-/blank-object-1.0.2.tgz#f990793fbe9a8c8dd013fb3219420bec81d5f4b9" @@ -4758,6 +4864,14 @@ buffer@^5.2.0: base64-js "^1.0.2" ieee754 "^1.1.4" +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -4979,6 +5093,14 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -5104,6 +5226,11 @@ ci-info@^1.1.3: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== +ci-info@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" + integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -5175,6 +5302,11 @@ cli-spinners@^1.1.0: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== +cli-spinners@^2.5.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" + integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== + cli-table3@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" @@ -5220,6 +5352,15 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + clone-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" @@ -5333,7 +5474,7 @@ colors@1.0.3: resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= -colors@^1.1.2, colors@^1.3.2: +colors@^1.1.2, colors@^1.3.2, colors@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== @@ -5374,6 +5515,11 @@ commander@^5.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== +commander@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + common-tags@^1.4.0, common-tags@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" @@ -5824,6 +5970,11 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" +date-fns@^2.26.0: + version "2.27.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.27.0.tgz#e1ff3c3ddbbab8a2eaadbb6106be2929a5a2d92b" + integrity sha512-sj+J0Mo2p2X1e306MHq282WS4/A8Pz/95GIFcsPNMPMZVI3EUrAdSv90al1k+p74WGLCruMXk23bfEDZa71X9Q== + date-time@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/date-time/-/date-time-2.1.0.tgz#0286d1b4c769633b3ca13e1e62558d2dbdc2eba2" @@ -7360,6 +7511,44 @@ ember-svg-jar@^2.2.3: mkdirp "^0.5.1" path-posix "^1.0.0" +ember-template-lint@^3.14.0: + version "3.14.0" + resolved "https://registry.yarnpkg.com/ember-template-lint/-/ember-template-lint-3.14.0.tgz#4e7ac709979b229612cab66e8258cf175eefaca2" + integrity sha512-0elxAseSft1SjQFcwqYddCXcsBW783M8TBXQ/eGXBzWTZVFwh/Oe+13SggVeUoyr9ZUX9ngW6rFEsKIyofY0KA== + dependencies: + "@ember-template-lint/todo-utils" "^10.0.0" + chalk "^4.1.2" + ci-info "^3.2.0" + date-fns "^2.26.0" + ember-template-recast "^5.0.3" + find-up "^5.0.0" + fuse.js "^6.4.6" + get-stdin "^8.0.0" + globby "^11.0.4" + is-glob "^4.0.3" + micromatch "^4.0.4" + requireindex "^1.2.0" + resolve "^1.20.0" + v8-compile-cache "^2.3.0" + yargs "^16.2.0" + +ember-template-recast@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/ember-template-recast/-/ember-template-recast-5.0.3.tgz#79df27a70bdce7be17f14db13886afde1e9d02d6" + integrity sha512-qsJYQhf29Dk6QMfviXhUPE+byMOs6iRQxUDHgkj8yqjeppvjHaFG96hZi/NAXJTm/M7o3PpfF5YlmeaKtI9UeQ== + dependencies: + "@glimmer/reference" "^0.65.0" + "@glimmer/syntax" "^0.65.0" + "@glimmer/validator" "^0.65.0" + async-promise-queue "^1.0.5" + colors "^1.4.0" + commander "^6.2.1" + globby "^11.0.3" + ora "^5.4.0" + slash "^3.0.0" + tmp "^0.2.1" + workerpool "^6.1.4" + ember-test-waiters@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/ember-test-waiters/-/ember-test-waiters-1.2.0.tgz#c12ead4313934c24cff41857020cacdbf8e6effe" @@ -8131,6 +8320,17 @@ fast-glob@^3.0.3: micromatch "^4.0.2" picomatch "^2.2.1" +fast-glob@^3.1.1: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -8400,6 +8600,14 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + find-yarn-workspace-root@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db" @@ -8597,6 +8805,16 @@ fs-extra@^9.0.1: jsonfile "^6.0.1" universalify "^1.0.0" +fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-merger@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/fs-merger/-/fs-merger-3.0.2.tgz#bf111334b89b8d65b95580d33c587dc79620a4e3" @@ -8691,6 +8909,11 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +fuse.js@^6.4.6: + version "6.4.6" + resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-6.4.6.tgz#62f216c110e5aa22486aff20be7896d19a059b79" + integrity sha512-/gYxR/0VpXmWSfZOIPS3rWwU8SHgsRTwWuXhyb2O6s7aRuVtHtxCkR33bNYu3wyLyNx/Wpv0vU7FZy8Vj53VNw== + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -8715,6 +8938,11 @@ get-caller-file@^1.0.0, get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" @@ -8729,6 +8957,11 @@ get-stdin@^4.0.1: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= +get-stdin@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" + integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== + get-stream@3.0.0, get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -8851,6 +9084,13 @@ glob-parent@^5.1.0, glob-parent@~5.1.0: dependencies: is-glob "^4.0.1" +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob@^5.0.10: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" @@ -8911,6 +9151,18 @@ globby@10.0.1: merge2 "^1.2.3" slash "^3.0.0" +globby@^11.0.3, globby@^11.0.4: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + globrex@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" @@ -9365,6 +9617,11 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ieee754@^1.1.4: version "1.1.13" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" @@ -9385,6 +9642,11 @@ ignore@^5.1.1: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== +ignore@^5.1.4: + version "5.1.9" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb" + integrity sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ== + image-size@^0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" @@ -9644,6 +9906,13 @@ is-callable@^1.2.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== +is-core-module@^2.2.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" + integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -9744,6 +10013,18 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + is-negative-zero@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" @@ -9885,6 +10166,11 @@ is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" @@ -10465,6 +10751,13 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + lodash-es@^4.17.11: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" @@ -10795,6 +11088,14 @@ log-symbols@^2.2.0: dependencies: chalk "^2.0.1" +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + loose-envify@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -11125,6 +11426,14 @@ micromatch@^4.0.2: braces "^3.0.1" picomatch "^2.0.5" +micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -11852,6 +12161,21 @@ ora@^2.0.0: strip-ansi "^4.0.0" wcwidth "^1.0.1" +ora@^5.4.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" @@ -11921,6 +12245,13 @@ p-limit@^2.0.0: dependencies: p-try "^2.0.0" +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -11935,6 +12266,13 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-timeout@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" @@ -12124,6 +12462,11 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -12238,6 +12581,11 @@ picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.0.7, picomatch@^2.2.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + pidtree@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" @@ -12757,7 +13105,7 @@ readable-stream@1.1: isarray "0.0.1" string_decoder "~0.10.x" -"readable-stream@2 || 3", readable-stream@^3.1.1: +"readable-stream@2 || 3", readable-stream@^3.1.1, readable-stream@^3.4.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -13090,6 +13438,11 @@ require-relative@^0.8.7: resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4= +requireindex@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef" + integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww== + requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -13153,6 +13506,14 @@ resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.1 dependencies: path-parse "^1.0.6" +resolve@^1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + responselike@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -13575,6 +13936,11 @@ simple-dom@^1.4.0: "@simple-dom/serializer" "^1.4.0" "@simple-dom/void-map" "^1.4.0" +simple-html-tokenizer@^0.5.10: + version "0.5.11" + resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.11.tgz#4c5186083c164ba22a7b477b7687ac056ad6b1d9" + integrity sha512-C2WEK/Z3HoSFbYq8tI7ni3eOo/NneSPRoPpcM7WdLjFOArFuyXEjAoCdOC3DgMfRyziZQ1hCNR4mrNdWEvD0og== + simple-html-tokenizer@^0.5.8: version "0.5.9" resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.9.tgz#1a83fe97f5a3e39b335fddf71cfe9b0263b581c2" @@ -14021,6 +14387,15 @@ string-width@^4.1.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string.prototype.padend@^3.0.0: version "3.1.3" resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz#997a6de12c92c7cb34dc8a201a6c53d9bd88a5f1" @@ -14114,6 +14489,13 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -14512,6 +14894,13 @@ tmp@^0.0.29: dependencies: os-tmpdir "~1.0.1" +tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" @@ -14652,6 +15041,11 @@ tslib@^1.10.0, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== +tslib@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" @@ -14974,6 +15368,11 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +v8-compile-cache@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -15304,6 +15703,11 @@ workerpool@^5.0.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-5.0.4.tgz#4f67cb70ff7550a27ab94de25b0b843cd92059a2" integrity sha512-Sywova24Ow2NQ24JPB68bI89EdqMDjUXo4OpofK/QMD7C2ZVMloYBgQ5J3PChcBJHj2vspsmGx1/3nBKXtUkXQ== +workerpool@^6.1.4: + version "6.1.5" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.5.tgz#0f7cf076b6215fd7e1da903ff6f22ddd1886b581" + integrity sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw== + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -15312,6 +15716,15 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-legacy-hbs-plugin-if-needed@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wrap-legacy-hbs-plugin-if-needed/-/wrap-legacy-hbs-plugin-if-needed-1.0.1.tgz#6683eb74747f33e7caea54bb2ed85106ef9006b4" @@ -15421,6 +15834,11 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -15444,6 +15862,11 @@ yam@^0.0.24: fs-extra "^4.0.2" lodash.merge "^4.6.0" +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + yargs-parser@^4.2.0: version "4.2.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" @@ -15451,6 +15874,19 @@ yargs-parser@^4.2.0: dependencies: camelcase "^3.0.0" +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yargs@^6.5.0: version "6.6.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" @@ -15483,6 +15919,11 @@ yeast@0.1.2: resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + yui@^3.18.1: version "3.18.1" resolved "https://registry.yarnpkg.com/yui/-/yui-3.18.1.tgz#e000269ec0a7b6fbc741cbb8fcbd0e65117b014c" From 24398e694c4ddff43eeb67eac6b184f86ac54d95 Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Thu, 2 Dec 2021 21:35:56 -0500 Subject: [PATCH 830/879] Add ember-auto-import and webpack to Ember v4 scenarios --- config/ember-try.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/config/ember-try.js b/config/ember-try.js index 2f353d2e5..17b11444c 100644 --- a/config/ember-try.js +++ b/config/ember-try.js @@ -29,6 +29,10 @@ module.exports = async function () { devDependencies: { 'ember-source': await getChannelURL('release'), }, + dependencies: { + 'ember-auto-import': '^2.2.4', + 'webpack': '^5.64.4' + }, }, }, { @@ -37,6 +41,10 @@ module.exports = async function () { devDependencies: { 'ember-source': await getChannelURL('beta'), }, + dependencies: { + 'ember-auto-import': '^2.2.4', + 'webpack': '^5.64.4' + }, }, }, { @@ -45,6 +53,10 @@ module.exports = async function () { devDependencies: { 'ember-source': await getChannelURL('canary'), }, + dependencies: { + 'ember-auto-import': '^2.2.4', + 'webpack': '^5.64.4' + }, }, }, { From 0a3a75f7c56247a65c89c78612c286b776558fce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Dec 2021 18:59:54 +0000 Subject: [PATCH 831/879] Bump path-parse from 1.0.6 to 1.0.7 Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. - [Release notes](https://github.com/jbgutierrez/path-parse/releases) - [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) --- updated-dependencies: - dependency-name: path-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 25f1f245e..a4139b47e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12488,9 +12488,9 @@ path-key@^3.0.0, path-key@^3.1.0: integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-posix@^1.0.0: version "1.0.0" From 623005f60e702b7374356b30e401145d0d18404c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Dec 2021 18:59:58 +0000 Subject: [PATCH 832/879] Bump tmpl from 1.0.4 to 1.0.5 Bumps [tmpl](https://github.com/daaku/nodejs-tmpl) from 1.0.4 to 1.0.5. - [Release notes](https://github.com/daaku/nodejs-tmpl/releases) - [Commits](https://github.com/daaku/nodejs-tmpl/commits/v1.0.5) --- updated-dependencies: - dependency-name: tmpl dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 25f1f245e..eddcf4387 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14902,9 +14902,9 @@ tmp@^0.2.1: rimraf "^3.0.0" tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-array@0.1.4: version "0.1.4" From 349e807587d87864de400d3eebc836bb65cfcad3 Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Wed, 1 Dec 2021 22:22:30 -0500 Subject: [PATCH 833/879] Replace ember-cli-eslint with eslint --- .eslintignore | 8 ++ .eslintrc.js | 85 +++++++----------- addon/deprecate-imports.js | 1 + .../ember-cli-mirage-autostart.js | 2 +- blueprints/mirage-identity-manager/index.js | 4 +- config/addon-docs.js | 3 +- package.json | 4 +- test-projects/01-basic-app/.eslintignore | 4 - test-projects/01-basic-app/.eslintrc.js | 2 - .../app/controllers/application.js | 15 ++-- test-projects/01-basic-app/app/models/book.js | 9 +- test-projects/01-basic-app/app/models/tag.js | 6 +- .../01-basic-app/app/models/things/watch.js | 6 +- test-projects/01-basic-app/app/models/user.js | 16 ++-- .../app/pods/crud-demo-error/template.hbs | 2 +- .../app/pods/crud-demo/controller.js | 22 ++--- .../01-basic-app/app/pods/crud-demo/route.js | 9 +- .../app/pods/crud-demo/template.hbs | 14 ++- .../app/pods/module-count/controller.js | 15 ++-- .../fastboot-tests/included-files-test.js | 2 +- .../01-basic-app/mirage/factories/user.js | 2 +- test-projects/01-basic-app/package.json | 4 - .../tests/acceptance/crud-demo-test.js | 77 ++++++++-------- .../tests/acceptance/fixtures-test.js | 29 +++--- .../tests/acceptance/identity-manager-test.js | 16 ++-- .../acceptance/legacy-start-mirage-test.js | 2 +- .../tests/acceptance/request-tracking-test.js | 60 ++++++------- .../tests/acceptance/start-mirage-test.js | 18 ++-- .../01-basic-app/tests/helpers/destroy-app.js | 2 +- .../tests/helpers/promise-ajax.js | 1 + .../02-app-that-excludes-mirage/.eslintignore | 4 - .../02-app-that-excludes-mirage/.eslintrc.js | 2 - .../app/controllers/application.js | 18 ++-- .../app/initializers/my-initializer.js | 8 -- .../app/services/wifi.js | 6 +- .../app/templates/application.hbs | 2 +- .../02-app-that-excludes-mirage/package.json | 4 - .../tests/acceptance/modules-test.js | 13 +-- .../acceptance/pre-mirage-initializer-test.js | 15 ++-- .../tests/helpers/destroy-app.js | 2 +- .../tests/helpers/promise-ajax.js | 1 + tests/dummy/app/adapters/post.js | 90 ++++++++++--------- tests/dummy/app/models/comment.js | 19 ++-- tests/dummy/app/models/post.js | 31 ++++--- tests/dummy/app/models/user.js | 12 +-- tests/dummy/app/pods/not-found/route.js | 8 +- tests/dummy/app/serializers/post.js | 5 +- tests/dummy/mirage/scenarios/default.js | 3 +- tests/helpers/destroy-app.js | 2 +- tests/helpers/promise-ajax.js | 1 + tests/test-helper.js | 13 +-- .../serializers/ember-data-serializer-test.js | 1 + 52 files changed, 327 insertions(+), 373 deletions(-) delete mode 100644 test-projects/01-basic-app/.eslintignore delete mode 100644 test-projects/01-basic-app/.eslintrc.js delete mode 100644 test-projects/02-app-that-excludes-mirage/.eslintignore delete mode 100644 test-projects/02-app-that-excludes-mirage/.eslintrc.js delete mode 100644 test-projects/02-app-that-excludes-mirage/app/initializers/my-initializer.js diff --git a/.eslintignore b/.eslintignore index 6437276cc..84717f967 100644 --- a/.eslintignore +++ b/.eslintignore @@ -5,14 +5,22 @@ # compiled output /dist/ /tmp/ +/test-projects/*/dist/ +/test-projects/*/tmp/ # dependencies /bower_components/ +/node_modules/ +/test-projects/*/node_modules/ # misc /coverage/ +!.* +.*/ +.eslintcache # ember-try /.node_modules.ember-try/ /bower.json.ember-try /package.json.ember-try +/yarn.lock.ember-try diff --git a/.eslintrc.js b/.eslintrc.js index c3d4ca140..72879400b 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,71 +1,52 @@ +'use strict'; + module.exports = { root: true, + parser: 'babel-eslint', parserOptions: { ecmaVersion: 2018, - sourceType: "module" + sourceType: 'module', + ecmaFeatures: { + legacyDecorators: true, + }, }, - plugins: ["ember"], - extends: ["eslint:recommended"], + plugins: ['ember'], + extends: [ + 'eslint:recommended', + 'plugin:ember/recommended', + ], env: { - browser: true - }, - rules: { - camelcase: 0, - "object-curly-spacing": 0, - quotes: 0, - "array-bracket-spacing": 0, - "no-var": 0, - "object-shorthand": 0, - "arrow-parens": 0, - "no-unused-vars": ["error", { args: "none" }] - }, - globals: { - server: true + browser: true, }, + rules: {}, overrides: [ // node files { files: [ - ".template-lintrc.js", - "ember-cli-build.js", - "index.js", - "testem.js", - "blueprints/*/index.js", - "config/**/*.js", - "tests/dummy/config/**/*.js", - "fastboot-tests/**/*.js" - ], - excludedFiles: [ - "addon/**", - "addon-test-support/**", - "app/**", - "tests/dummy/app/**" + './.eslintrc.js', + './.prettierrc.js', + './.template-lintrc.js', + './ember-cli-build.js', + './index.js', + './testem.js', + './blueprints/*/index.js', + './config/**/*.js', + './tests/dummy/config/**/*.js', + './fastboot-tests/included-files-test.js', + './test-projects/*/ember-cli-build.js', + './test-projects/*/testem.js', + './test-projects/*/config/**/*.js', + './test-projects/*/fastboot-tests/**/*.js', ], parserOptions: { - sourceType: "script", - ecmaVersion: 2018 + sourceType: 'script', }, env: { browser: false, - node: true + node: true, }, - plugins: ["node"], - rules: Object.assign( - {}, - require("eslint-plugin-node").configs.recommended.rules, - { - // add your custom rules and overrides for node files here - } - ) + plugins: ['node'], + extends: ['plugin:node/recommended'], }, - - // test files. Can remove when we upgrade tests to new style. - { - files: ["tests/**/*.js"], - excludedFiles: ["tests/dummy/**/*.js"], - env: { - embertest: true - } - } - ] + ], }; diff --git a/addon/deprecate-imports.js b/addon/deprecate-imports.js index 47bb4ea1b..91f8b39af 100644 --- a/addon/deprecate-imports.js +++ b/addon/deprecate-imports.js @@ -7,6 +7,7 @@ const nonDeprecatedImports = ['default']; export function initDeprecatedImports () { Object.entries(mirage).forEach(([name, value]) => { if (!nonDeprecatedImports.includes(name)) { + // eslint-disable-next-line no-import-assign Object.defineProperty(ecMirageExports, name, { get () { const message = `Importing '${name}' from 'ember-cli-mirage' is deprecated.` + diff --git a/addon/instance-initializers/ember-cli-mirage-autostart.js b/addon/instance-initializers/ember-cli-mirage-autostart.js index b8b32ef81..a1bae1952 100644 --- a/addon/instance-initializers/ember-cli-mirage-autostart.js +++ b/addon/instance-initializers/ember-cli-mirage-autostart.js @@ -8,7 +8,7 @@ const MirageShutdown = EmberObject.extend({ testContext: null, willDestroy() { - let testContext = this.get('testContext'); + let testContext = this.testContext; testContext.server.shutdown(); delete testContext.server; } diff --git a/blueprints/mirage-identity-manager/index.js b/blueprints/mirage-identity-manager/index.js index 35e2e1011..ceedc9b72 100644 --- a/blueprints/mirage-identity-manager/index.js +++ b/blueprints/mirage-identity-manager/index.js @@ -1,6 +1,4 @@ -/*jshint node:true*/ - -var path = require('path'); +const path = require('path'); module.exports = { description: 'Generates a Mirage identity manager', diff --git a/config/addon-docs.js b/config/addon-docs.js index 2e88f6143..8370a9ef7 100644 --- a/config/addon-docs.js +++ b/config/addon-docs.js @@ -1,7 +1,6 @@ -/* eslint-env node */ 'use strict'; -/* eslint-disable-next-line node/no-unpublished-require */ +// eslint-disable-next-line node/no-unpublished-require const AddonDocsConfig = require('ember-cli-addon-docs/lib/config'); module.exports = class extends AddonDocsConfig { diff --git a/package.json b/package.json index dc85ceac2..d010ccaa8 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,6 @@ "ember-cli-deploy-build": "^2.0.0", "ember-cli-deploy-git": "^1.3.3", "ember-cli-deploy-git-ci": "^1.0.1", - "ember-cli-eslint": "^5.1.0", "ember-cli-fastboot": "^2.0.4", "ember-cli-favicon": "^2.0.0", "ember-cli-htmlbars": "^5.3.1", @@ -86,8 +85,9 @@ "ember-template-lint": "^3.14.0", "ember-try": "^1.0.0", "escape-string-regexp": "^4.0.0", + "eslint": "^7.32.0", "eslint-plugin-ember": "^8.1.0", - "eslint-plugin-node": "^11.0.0", + "eslint-plugin-node": "^11.1.0", "faker": "^5.1.0", "fastboot": "^3.0.2", "js-yaml": "^4.0.0", diff --git a/test-projects/01-basic-app/.eslintignore b/test-projects/01-basic-app/.eslintignore deleted file mode 100644 index b01e90d69..000000000 --- a/test-projects/01-basic-app/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -/blueprints/*/files/**/*.js -/test-apps/*/dist -/test-apps/*/tmp -/test-apps/*/node_modules diff --git a/test-projects/01-basic-app/.eslintrc.js b/test-projects/01-basic-app/.eslintrc.js deleted file mode 100644 index bbd1f3cf7..000000000 --- a/test-projects/01-basic-app/.eslintrc.js +++ /dev/null @@ -1,2 +0,0 @@ -let parent = require('../../.eslintrc.js'); -module.exports = parent; diff --git a/test-projects/01-basic-app/app/controllers/application.js b/test-projects/01-basic-app/app/controllers/application.js index ebf85aef1..123711e15 100644 --- a/test-projects/01-basic-app/app/controllers/application.js +++ b/test-projects/01-basic-app/app/controllers/application.js @@ -1,22 +1,21 @@ /* global requirejs */ import Controller from '@ember/controller'; -import { computed } from '@ember/object'; import ENV from 'basic-app/config/environment'; -export default Controller.extend({ +export default class extends Controller { - environment: ENV.environment, + environment = ENV.environment; - mirageModules: computed(function() { + get mirageModules () { return Object.keys(requirejs.entries) .filter(key => key.match('^ember-cli-mirage')); - }), + } - otherIncludedModules: computed(function() { + get otherIncludedModules () { return Object.keys(requirejs.entries) .filter(key => { return key.match('^pretender') || key.match('^lodash') || key.match('initializers/ember-cli-mirage'); }); - }) + } -}); +} diff --git a/test-projects/01-basic-app/app/models/book.js b/test-projects/01-basic-app/app/models/book.js index 64a6f13d1..c0cc14d11 100644 --- a/test-projects/01-basic-app/app/models/book.js +++ b/test-projects/01-basic-app/app/models/book.js @@ -1,8 +1,7 @@ -import Model from 'ember-data/model'; -import { belongsTo } from 'ember-data/relationships'; +import Model, { belongsTo } from '@ember-data/model'; -export default Model.extend({ +export default class Book extends Model { - user: belongsTo() + @belongsTo() user; -}); +} diff --git a/test-projects/01-basic-app/app/models/tag.js b/test-projects/01-basic-app/app/models/tag.js index 8aae571f3..a765f525b 100644 --- a/test-projects/01-basic-app/app/models/tag.js +++ b/test-projects/01-basic-app/app/models/tag.js @@ -1,5 +1,3 @@ -import Model from 'ember-data/model'; +import Model from '@ember-data/model'; -export default Model.extend({ - -}); +export default class Tag extends Model {} diff --git a/test-projects/01-basic-app/app/models/things/watch.js b/test-projects/01-basic-app/app/models/things/watch.js index 8aae571f3..1999b84c1 100644 --- a/test-projects/01-basic-app/app/models/things/watch.js +++ b/test-projects/01-basic-app/app/models/things/watch.js @@ -1,5 +1,3 @@ -import Model from 'ember-data/model'; +import Model from '@ember-data/model'; -export default Model.extend({ - -}); +export default class ThingsWatch extends Model {} diff --git a/test-projects/01-basic-app/app/models/user.js b/test-projects/01-basic-app/app/models/user.js index ac53b753c..de099dc1a 100644 --- a/test-projects/01-basic-app/app/models/user.js +++ b/test-projects/01-basic-app/app/models/user.js @@ -1,13 +1,11 @@ -import attr from 'ember-data/attr'; -import Model from 'ember-data/model'; -import { hasMany } from 'ember-data/relationships'; +import Model, { attr, hasMany } from '@ember-data/model'; -export default Model.extend({ +export default class User extends Model { - name: attr('string'), - age: attr('number'), - email: attr('string'), + @attr('string') name; + @attr('number') age; + @attr('string') email; - books: hasMany() + @hasMany() books; -}); +} diff --git a/test-projects/01-basic-app/app/pods/crud-demo-error/template.hbs b/test-projects/01-basic-app/app/pods/crud-demo-error/template.hbs index 21a1838f7..d0f5e0a94 100644 --- a/test-projects/01-basic-app/app/pods/crud-demo-error/template.hbs +++ b/test-projects/01-basic-app/app/pods/crud-demo-error/template.hbs @@ -1,5 +1,5 @@

    WHOOPS

    -

    +

    {{this.model.errors.firstObject}}

    diff --git a/test-projects/01-basic-app/app/pods/crud-demo/controller.js b/test-projects/01-basic-app/app/pods/crud-demo/controller.js index 0c5c18f46..ad943f340 100644 --- a/test-projects/01-basic-app/app/pods/crud-demo/controller.js +++ b/test-projects/01-basic-app/app/pods/crud-demo/controller.js @@ -2,33 +2,33 @@ import Controller from '@ember/controller'; import { inject as service } from '@ember/service'; import { action } from '@ember/object'; -export default Controller.extend({ +export default class extends Controller { - store: service(), + @service store; - createUser: action(function (event) { + @action createUser (event) { event.preventDefault(); - let name = this.get('newName'); + let name = this.newName; - this.get('store') + this.store .createRecord('user', { name }) .save() .then(() => { this.set('newName', ''); }); - }), + } - updateUser: action(function (user, event) { + @action updateUser (user, event) { event.preventDefault(); user.save(); - }), + } - deleteUser: action(function (user, event) { + @action deleteUser (user, event) { event.preventDefault(); user.destroyRecord(); - }), + } -}); +} diff --git a/test-projects/01-basic-app/app/pods/crud-demo/route.js b/test-projects/01-basic-app/app/pods/crud-demo/route.js index f67295e61..a39c8fb0a 100644 --- a/test-projects/01-basic-app/app/pods/crud-demo/route.js +++ b/test-projects/01-basic-app/app/pods/crud-demo/route.js @@ -1,12 +1,11 @@ import Route from '@ember/routing/route'; +import { inject as service } from '@ember/service'; -export default Route.extend({ +export default class extends Route { + @service store; model() { return this.store.findAll('user'); - }, - - actions: { } -}); +} diff --git a/test-projects/01-basic-app/app/pods/crud-demo/template.hbs b/test-projects/01-basic-app/app/pods/crud-demo/template.hbs index a705566fb..d074dca68 100644 --- a/test-projects/01-basic-app/app/pods/crud-demo/template.hbs +++ b/test-projects/01-basic-app/app/pods/crud-demo/template.hbs @@ -1,6 +1,6 @@ {{#if this.error}} -

    +

    There was an error: {{this.error}}

    @@ -10,8 +10,14 @@
    - - + + {{#if user.isSaving}} Saving... @@ -34,7 +40,7 @@
    -
    diff --git a/test-projects/01-basic-app/app/pods/module-count/controller.js b/test-projects/01-basic-app/app/pods/module-count/controller.js index ebf85aef1..123711e15 100644 --- a/test-projects/01-basic-app/app/pods/module-count/controller.js +++ b/test-projects/01-basic-app/app/pods/module-count/controller.js @@ -1,22 +1,21 @@ /* global requirejs */ import Controller from '@ember/controller'; -import { computed } from '@ember/object'; import ENV from 'basic-app/config/environment'; -export default Controller.extend({ +export default class extends Controller { - environment: ENV.environment, + environment = ENV.environment; - mirageModules: computed(function() { + get mirageModules () { return Object.keys(requirejs.entries) .filter(key => key.match('^ember-cli-mirage')); - }), + } - otherIncludedModules: computed(function() { + get otherIncludedModules () { return Object.keys(requirejs.entries) .filter(key => { return key.match('^pretender') || key.match('^lodash') || key.match('initializers/ember-cli-mirage'); }); - }) + } -}); +} diff --git a/test-projects/01-basic-app/fastboot-tests/included-files-test.js b/test-projects/01-basic-app/fastboot-tests/included-files-test.js index 848e1ba83..de599e288 100644 --- a/test-projects/01-basic-app/fastboot-tests/included-files-test.js +++ b/test-projects/01-basic-app/fastboot-tests/included-files-test.js @@ -11,7 +11,7 @@ const findTextFromHtml = (html, selector) => { .trim(); }; -qModule('basic-app | fastboot | included files', function(hooks) { +qModule('basic-app | fastboot | included files', function() { test('it includes all modules in development by default', async function(assert) { execFileSync('node', [ diff --git a/test-projects/01-basic-app/mirage/factories/user.js b/test-projects/01-basic-app/mirage/factories/user.js index 95379c936..ffa9661cf 100644 --- a/test-projects/01-basic-app/mirage/factories/user.js +++ b/test-projects/01-basic-app/mirage/factories/user.js @@ -4,7 +4,7 @@ import faker from 'faker'; export default Factory.extend({ age() { - return faker.random.number({ min: 32, max: 32 }); + return faker.datatype.number({ min: 32, max: 32 }); } }); diff --git a/test-projects/01-basic-app/package.json b/test-projects/01-basic-app/package.json index d15325ccb..52014eec2 100644 --- a/test-projects/01-basic-app/package.json +++ b/test-projects/01-basic-app/package.json @@ -25,7 +25,6 @@ "ember-cli": "*", "ember-cli-babel": "*", "ember-cli-dependency-checker": "*", - "ember-cli-eslint": "*", "ember-cli-fastboot": "*", "ember-cli-htmlbars": "*", "ember-cli-inject-live-reload": "*", @@ -50,8 +49,5 @@ }, "engines": { "node": ">= 8.*" - }, - "volta": { - "extends": "../../package.json" } } diff --git a/test-projects/01-basic-app/tests/acceptance/crud-demo-test.js b/test-projects/01-basic-app/tests/acceptance/crud-demo-test.js index 6d588e094..81e2d30cd 100644 --- a/test-projects/01-basic-app/tests/acceptance/crud-demo-test.js +++ b/test-projects/01-basic-app/tests/acceptance/crud-demo-test.js @@ -1,67 +1,62 @@ -import { test } from 'qunit'; -import moduleForAcceptance from 'basic-app/tests/helpers/module-for-acceptance'; +import { module, test } from "qunit"; +import { visit, currentRouteName, findAll, fillIn, click } from "@ember/test-helpers"; +import { setupApplicationTest } from "ember-qunit"; +import { setupMirage } from "ember-cli-mirage/test-support"; -moduleForAcceptance('Acceptance | Crud demo'); +module('Acceptance | Crud demo', function(hooks) { + setupApplicationTest(hooks); + setupMirage(hooks) -test('I can view the users', function(assert) { - server.createList('user', 3); + test('I can view the users', async function(assert) { + this.server.createList('user', 3); - visit('/crud-demo'); + await visit('/crud-demo'); - andThen(function() { - assert.equal(find('[data-test-id="user"]').length, 3); + assert.equal(findAll('[data-test-id="user"]').length, 3); }); -}); -test('I can create a new user', function(assert) { - server.create('user', 1); + test('I can create a new user', async function(assert) { + this.server.create('user', 1); - visit('/crud-demo'); - fillIn('input', 'Ganon'); - click('button:contains(Create)'); + await visit('/crud-demo'); + await fillIn('input', 'Ganon'); + await click('[data-test-id="create-user"]'); - andThen(function() { - assert.equal(find('[data-test-id="user"]').length, 2); - assert.ok(server.db.users.length, 2); + assert.equal(findAll('[data-test-id="user"]').length, 2); + assert.ok(this.server.db.users.length, 2); }); -}); -test('I can update a user', function(assert) { - let user = server.create('user', { name: 'Yehuda' }); + test('I can update a user', async function(assert) { + let user = this.server.create('user', { name: 'Yehuda' }); - visit('/crud-demo'); - fillIn('[data-test-id="user"] input', 'Katz'); - click('button:contains(Save)'); + await visit('/crud-demo'); + await fillIn('[data-test-id="user"] input', 'Katz'); + await click('[data-test-id="update-user"]'); - andThen(function() { user.reload(); - assert.equal(find('[data-test-id="user"] input').val(), 'Katz'); + assert.dom('[data-test-id="user"] input').hasValue('Katz'); assert.ok(user.name, 'Katz'); }); -}); -test('I can delete a user', function(assert) { - server.create('user', { name: 'Yehuda' }); + test('I can delete a user', async function(assert) { + this.server.create('user', { name: 'Yehuda' }); - visit('/crud-demo'); - click('button:contains(Delete)'); + await visit('/crud-demo'); + await click('[data-test-id="delete-user"]'); - andThen(function() { - assert.equal(find('[data-test-id="user"]').length, 0); - assert.equal(server.db.users.length, 0); + assert.equal(findAll('[data-test-id="user"]').length, 0); + assert.equal(this.server.db.users.length, 0); }); -}); -test('If the server errors on GET /users, the error template shows', function(assert) { - server.get('/users', { - errors: [ 'improper auth' ] - }, 404); + test('If the server errors on GET /users, the error template shows', async function(assert) { + this.server.get('/users', { + errors: [ 'improper auth' ] + }, 404); - visit('/crud-demo'); + await visit('/crud-demo'); - andThen(function() { - assert.ok(find(':contains(improper auth)').length); + assert.dom('[data-test-id="error"]').hasText('improper auth'); assert.equal(currentRouteName(), 'crud-demo_error'); }); }); diff --git a/test-projects/01-basic-app/tests/acceptance/fixtures-test.js b/test-projects/01-basic-app/tests/acceptance/fixtures-test.js index 5cb5a111b..8d9e8c283 100644 --- a/test-projects/01-basic-app/tests/acceptance/fixtures-test.js +++ b/test-projects/01-basic-app/tests/acceptance/fixtures-test.js @@ -1,20 +1,25 @@ -import moduleForAcceptance from '../helpers/module-for-acceptance'; -import { test } from 'qunit'; +import { module, test } from "qunit"; +import { visit } from "@ember/test-helpers"; +import { setupApplicationTest } from "ember-qunit"; +import { setupMirage } from "ember-cli-mirage/test-support"; -moduleForAcceptance('Acceptance | Fixtures'); +module('Acceptance | Fixtures', function(hooks) { + setupApplicationTest(hooks); + setupMirage(hooks) -test('I can use fixtures', async function(assert) { - server.loadFixtures(); + test('I can use fixtures', async function(assert) { + this.server.loadFixtures(); - await visit('/crud-demo'); + await visit('/crud-demo'); - assert.equal(find('[data-test-id="user"]').length, 1); -}); + assert.dom('[data-test-id="user"]').exists({ count: 1 }); + }); -test('I can use fixtures with the filename api', async function(assert) { - server.loadFixtures('countries'); + test('I can use fixtures with the filename api', async function(assert) { + this.server.loadFixtures('countries'); - await visit('/crud-demo'); + await visit('/crud-demo'); - assert.equal(find('[data-test-id="user"]').length, 0); + assert.dom('[data-test-id="user"]').doesNotExist(); + }); }); diff --git a/test-projects/01-basic-app/tests/acceptance/identity-manager-test.js b/test-projects/01-basic-app/tests/acceptance/identity-manager-test.js index f05004f59..c150ed049 100644 --- a/test-projects/01-basic-app/tests/acceptance/identity-manager-test.js +++ b/test-projects/01-basic-app/tests/acceptance/identity-manager-test.js @@ -1,10 +1,14 @@ -import { test } from 'qunit'; -import moduleForAcceptance from '../../tests/helpers/module-for-acceptance'; +import { module, test } from "qunit"; +import { setupApplicationTest } from "ember-qunit"; +import { setupMirage } from "ember-cli-mirage/test-support"; -moduleForAcceptance('Acceptance | Identity manager'); +module('Acceptance | Identity manager', function(hooks) { + setupApplicationTest(hooks); + setupMirage(hooks) -test('custom identity managers work', function(assert) { - let book = server.create('book'); + test('custom identity managers work', function(assert) { + let book = this.server.create('book'); - assert.equal(book.id, 'a'); + assert.equal(book.id, 'a'); + }); }); diff --git a/test-projects/01-basic-app/tests/acceptance/legacy-start-mirage-test.js b/test-projects/01-basic-app/tests/acceptance/legacy-start-mirage-test.js index 5f6152c16..9672be99f 100644 --- a/test-projects/01-basic-app/tests/acceptance/legacy-start-mirage-test.js +++ b/test-projects/01-basic-app/tests/acceptance/legacy-start-mirage-test.js @@ -1,4 +1,4 @@ -import {module, test} from 'qunit'; +import { module, test } from 'qunit'; import startApp from '../helpers/start-app'; import destroyApp from '../helpers/destroy-app'; import { startMirage } from 'basic-app/initializers/ember-cli-mirage'; diff --git a/test-projects/01-basic-app/tests/acceptance/request-tracking-test.js b/test-projects/01-basic-app/tests/acceptance/request-tracking-test.js index d245eaf7d..d8146bdf5 100644 --- a/test-projects/01-basic-app/tests/acceptance/request-tracking-test.js +++ b/test-projects/01-basic-app/tests/acceptance/request-tracking-test.js @@ -1,51 +1,51 @@ import { run } from '@ember/runloop'; -import {module, test} from 'qunit'; +import { module, test } from 'qunit'; import startApp from '../helpers/start-app'; import ENV from 'basic-app/config/environment'; import promiseAjax from '../helpers/promise-ajax'; let App; -module('Acceptance | Enabling request tracking', { - afterEach() { - server.shutdown(); +module('Acceptance | Enabling request tracking', function (hooks) { + hooks.afterEach(function () { + window.server.shutdown(); run(App, 'destroy'); ENV['ember-cli-mirage'].enabled = undefined; - } -}); + }); + + test('Request tracking defaults to false', async function(assert) { + App = startApp(); -test('Request tracking defaults to false', async function(assert) { - App = startApp(); + await promiseAjax({ + method: 'GET', + url: '/users' + }); - await promiseAjax({ - method: 'GET', - url: '/users' + assert.equal(window.server.pretender.handledRequests.length, 0, 'request tracking should be false by default'); }); - assert.equal(server.pretender.handledRequests.length, 0, 'request tracking should be false by default'); -}); + test('Request tracking treats undefined config as false', async function(assert) { + ENV['ember-cli-mirage'] = { trackRequests: undefined }; + App = startApp(); -test('Request tracking treats undefined config as false', async function(assert) { - ENV['ember-cli-mirage'] = { trackRequests: undefined }; - App = startApp(); + await promiseAjax({ + method: 'GET', + url: '/users' + }); - await promiseAjax({ - method: 'GET', - url: '/users' + assert.equal(window.server.pretender.handledRequests.length, 0, 'request tracking should be false when undefined in config'); }); - assert.equal(server.pretender.handledRequests.length, 0, 'request tracking should be false when undefined in config'); -}); + test('Request tracking can be set to true in config', async function(assert) { + ENV['ember-cli-mirage'] = { trackRequests: true }; + App = startApp(); -test('Request tracking can be set to true in config', async function(assert) { - ENV['ember-cli-mirage'] = { trackRequests: true }; - App = startApp(); + await promiseAjax({ + method: 'GET', + url: '/users' + }); - await promiseAjax({ - method: 'GET', - url: '/users' + assert.equal(window.server.pretender.handledRequests.length, 1, 'request tracking can be turned on in config and track requests'); + assert.equal(window.server.pretender.handledRequests[0].method, 'GET', 'tracked request method should match the requests method'); }); - - assert.equal(server.pretender.handledRequests.length, 1, 'request tracking can be turned on in config and track requests'); - assert.equal(server.pretender.handledRequests[0].method, 'GET', 'tracked request method should match the requests method'); }); diff --git a/test-projects/01-basic-app/tests/acceptance/start-mirage-test.js b/test-projects/01-basic-app/tests/acceptance/start-mirage-test.js index e97a6aab3..7c5b4c985 100644 --- a/test-projects/01-basic-app/tests/acceptance/start-mirage-test.js +++ b/test-projects/01-basic-app/tests/acceptance/start-mirage-test.js @@ -1,19 +1,11 @@ -import Ember from 'ember'; -import {module as qunitModule, test} from 'qunit'; -import {setupTest} from 'ember-qunit'; -import {visit, currentRouteName} from '@ember/test-helpers'; +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; +import { visit, currentRouteName } from '@ember/test-helpers'; import startMirage from 'ember-cli-mirage/start-mirage'; import { setupMirage } from 'ember-cli-mirage/test-support'; import ENV from 'basic-app/config/environment'; import NestedThingModel from 'basic-app/mirage/models/nested/thing'; -let module; -if (Ember.VERSION === '1.13.13') { - module = () => null; -} else { - module = qunitModule; -} - module('Acceptance | Starting mirage', function(hooks) { let oldEnv, addonConfig, dynamicAfterEach; @@ -92,7 +84,7 @@ module('Acceptance | Starting mirage', function(hooks) { assert.notOk(window.server, 'The global server is gone'); }; - server.create('user'); + this.server.create('user'); await visit('/crud-demo'); assert.equal(currentRouteName(), 'crud-demo'); @@ -116,7 +108,7 @@ module('Acceptance | Starting mirage', function(hooks) { assert.notOk(window.server, 'The global server is gone'); }; - server.create('user'); + this.server.create('user'); await visit('/crud-demo'); assert.equal(currentRouteName(), 'crud-demo'); diff --git a/test-projects/01-basic-app/tests/helpers/destroy-app.js b/test-projects/01-basic-app/tests/helpers/destroy-app.js index f8d24fc36..f9411f492 100644 --- a/test-projects/01-basic-app/tests/helpers/destroy-app.js +++ b/test-projects/01-basic-app/tests/helpers/destroy-app.js @@ -4,6 +4,6 @@ export default function destroyApp(application) { run(function() { application.destroy(); - server.shutdown(); + window.server.shutdown(); }); } diff --git a/test-projects/01-basic-app/tests/helpers/promise-ajax.js b/test-projects/01-basic-app/tests/helpers/promise-ajax.js index 38a09df02..2c8223f7f 100644 --- a/test-projects/01-basic-app/tests/helpers/promise-ajax.js +++ b/test-projects/01-basic-app/tests/helpers/promise-ajax.js @@ -1,3 +1,4 @@ +/* eslint-disable ember/no-jquery */ import { Promise } from 'rsvp'; import $ from 'jquery'; diff --git a/test-projects/02-app-that-excludes-mirage/.eslintignore b/test-projects/02-app-that-excludes-mirage/.eslintignore deleted file mode 100644 index b01e90d69..000000000 --- a/test-projects/02-app-that-excludes-mirage/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -/blueprints/*/files/**/*.js -/test-apps/*/dist -/test-apps/*/tmp -/test-apps/*/node_modules diff --git a/test-projects/02-app-that-excludes-mirage/.eslintrc.js b/test-projects/02-app-that-excludes-mirage/.eslintrc.js deleted file mode 100644 index bbd1f3cf7..000000000 --- a/test-projects/02-app-that-excludes-mirage/.eslintrc.js +++ /dev/null @@ -1,2 +0,0 @@ -let parent = require('../../.eslintrc.js'); -module.exports = parent; diff --git a/test-projects/02-app-that-excludes-mirage/app/controllers/application.js b/test-projects/02-app-that-excludes-mirage/app/controllers/application.js index a37f3c2fc..ac787d4c8 100644 --- a/test-projects/02-app-that-excludes-mirage/app/controllers/application.js +++ b/test-projects/02-app-that-excludes-mirage/app/controllers/application.js @@ -1,24 +1,24 @@ /* global requirejs */ import Controller from '@ember/controller'; import { inject as service } from '@ember/service'; -import { computed } from '@ember/object'; import ENV from 'basic-app/config/environment'; -export default Controller.extend({ - wifi: service(), +export default class extends Controller { - environment: ENV.environment, + @service wifi; - mirageModules: computed(function() { + environment = ENV.environment; + + get mirageModules () { return Object.keys(requirejs.entries) .filter(key => key.match('^ember-cli-mirage')); - }), + } - otherIncludedModules: computed(function() { + get otherIncludedModules () { return Object.keys(requirejs.entries) .filter(key => { return key.match('^pretender') || key.match('^lodash') || key.match('initializers/ember-cli-mirage'); }); - }) + } -}); +} diff --git a/test-projects/02-app-that-excludes-mirage/app/initializers/my-initializer.js b/test-projects/02-app-that-excludes-mirage/app/initializers/my-initializer.js deleted file mode 100644 index 2d492a2f0..000000000 --- a/test-projects/02-app-that-excludes-mirage/app/initializers/my-initializer.js +++ /dev/null @@ -1,8 +0,0 @@ -export function initialize(application) { - application.inject('controller', 'wifi', 'service:wifi'); -} - -export default { - initialize, - before: 'ember-cli-mirage' -}; diff --git a/test-projects/02-app-that-excludes-mirage/app/services/wifi.js b/test-projects/02-app-that-excludes-mirage/app/services/wifi.js index d310336a5..a976661ed 100644 --- a/test-projects/02-app-that-excludes-mirage/app/services/wifi.js +++ b/test-projects/02-app-that-excludes-mirage/app/services/wifi.js @@ -1,7 +1,7 @@ import Service from '@ember/service'; -export default Service.extend({ +export default class extends Service { - isConnected: true + isConnected = true; -}); +} diff --git a/test-projects/02-app-that-excludes-mirage/app/templates/application.hbs b/test-projects/02-app-that-excludes-mirage/app/templates/application.hbs index b525cba75..de2c24227 100644 --- a/test-projects/02-app-that-excludes-mirage/app/templates/application.hbs +++ b/test-projects/02-app-that-excludes-mirage/app/templates/application.hbs @@ -1,7 +1,7 @@

    Welcome to Ember

    {{#if this.wifi.isConnected}} -

    We ran the initializer

    +

    We ran the initializer

    {{/if}}

    diff --git a/test-projects/02-app-that-excludes-mirage/package.json b/test-projects/02-app-that-excludes-mirage/package.json index 5798b4530..fe30a6e37 100644 --- a/test-projects/02-app-that-excludes-mirage/package.json +++ b/test-projects/02-app-that-excludes-mirage/package.json @@ -24,7 +24,6 @@ "ember-cli": "*", "ember-cli-babel": "*", "ember-cli-dependency-checker": "*", - "ember-cli-eslint": "*", "ember-cli-fastboot": "*", "ember-cli-htmlbars": "*", "ember-cli-inject-live-reload": "*", @@ -46,8 +45,5 @@ }, "engines": { "node": ">= 8.*" - }, - "volta": { - "extends": "../../package.json" } } diff --git a/test-projects/02-app-that-excludes-mirage/tests/acceptance/modules-test.js b/test-projects/02-app-that-excludes-mirage/tests/acceptance/modules-test.js index 5974b8c45..8382a9dd6 100644 --- a/test-projects/02-app-that-excludes-mirage/tests/acceptance/modules-test.js +++ b/test-projects/02-app-that-excludes-mirage/tests/acceptance/modules-test.js @@ -1,12 +1,13 @@ -import { test } from 'qunit'; -import moduleForAcceptance from 'basic-app/tests/helpers/module-for-acceptance'; +import { module, test } from "qunit"; +import { visit } from "@ember/test-helpers"; +import { setupApplicationTest } from "ember-qunit"; -moduleForAcceptance('Acceptance | modules'); +module('Acceptance | modules', function(hooks) { + setupApplicationTest(hooks); -test('only 1 module (the no-op initializer) is included in the build', function(assert) { - visit('/'); + test('only 1 module (the no-op initializer) is included in the build', async function(assert) { + await visit('/'); - andThen(function() { assert.dom('[data-test-id="mirage-module-count"]').hasText('0'); assert.dom('[data-test-id="other-module-count"]').hasText('1'); }); diff --git a/test-projects/02-app-that-excludes-mirage/tests/acceptance/pre-mirage-initializer-test.js b/test-projects/02-app-that-excludes-mirage/tests/acceptance/pre-mirage-initializer-test.js index 54d17aab5..71e735f0c 100644 --- a/test-projects/02-app-that-excludes-mirage/tests/acceptance/pre-mirage-initializer-test.js +++ b/test-projects/02-app-that-excludes-mirage/tests/acceptance/pre-mirage-initializer-test.js @@ -1,12 +1,13 @@ -import { test } from 'qunit'; -import moduleForAcceptance from 'basic-app/tests/helpers/module-for-acceptance'; +import { module, test } from "qunit"; +import { visit } from "@ember/test-helpers"; +import { setupApplicationTest } from "ember-qunit"; -moduleForAcceptance('Acceptance | noop initializer test'); +module('Acceptance | noop initializer test', function(hooks) { + setupApplicationTest(hooks); -test('visiting /noop-initializer-test', function(assert) { - visit('/'); + test('visiting /noop-initializer-test', async function (assert) { + await visit('/'); - andThen(function() { - assert.equal(find('p:contains(We ran the initializer)').length, 1); + assert.dom('[data-test-id="wifi-connected"]').exists({ count: 1 }); }); }); diff --git a/test-projects/02-app-that-excludes-mirage/tests/helpers/destroy-app.js b/test-projects/02-app-that-excludes-mirage/tests/helpers/destroy-app.js index 69d8f1d00..4d885ca71 100644 --- a/test-projects/02-app-that-excludes-mirage/tests/helpers/destroy-app.js +++ b/test-projects/02-app-that-excludes-mirage/tests/helpers/destroy-app.js @@ -5,7 +5,7 @@ export default function destroyApp(application) { application.destroy(); if (window.server) { - server.shutdown(); + window.server.shutdown(); } }); } diff --git a/test-projects/02-app-that-excludes-mirage/tests/helpers/promise-ajax.js b/test-projects/02-app-that-excludes-mirage/tests/helpers/promise-ajax.js index 38a09df02..2c8223f7f 100644 --- a/test-projects/02-app-that-excludes-mirage/tests/helpers/promise-ajax.js +++ b/test-projects/02-app-that-excludes-mirage/tests/helpers/promise-ajax.js @@ -1,3 +1,4 @@ +/* eslint-disable ember/no-jquery */ import { Promise } from 'rsvp'; import $ from 'jquery'; diff --git a/tests/dummy/app/adapters/post.js b/tests/dummy/app/adapters/post.js index f665e7403..a64eb105e 100644 --- a/tests/dummy/app/adapters/post.js +++ b/tests/dummy/app/adapters/post.js @@ -1,11 +1,13 @@ -import $ from "jquery"; -import { Promise } from "rsvp"; -import DS from "ember-data"; +/* eslint-disable ember/no-jquery */ +import { run } from '@ember/runloop'; +import JSONAPIAdapter from '@ember-data/adapter/json-api'; +import $ from 'jquery'; +import { Promise } from 'rsvp'; const BASE_URL = "https://api.github.com/repos/miragejs/ember-cli-mirage"; -export default DS.JSONAPIAdapter.extend({ - findRecord(store, type, id, snapshot) { +export default class extends JSONAPIAdapter { + findRecord(store, type, id/*, snapshot*/) { let url = `${BASE_URL}/issues/${id}`; return new Promise((resolve, reject) => { @@ -37,9 +39,9 @@ export default DS.JSONAPIAdapter.extend({ } ); }); - }, + } - findAll(store, type) { + findAll(/*store, type*/) { let url = `${BASE_URL}/issues?state=closed&labels=Blog%20post`; return new Promise((resolve, reject) => { @@ -66,57 +68,59 @@ export default DS.JSONAPIAdapter.extend({ } ); }); - }, + } - shouldReloadAll(store, snapshotArray) { + shouldReloadAll(/*store, snapshotArray*/) { return !this.hasLoadedAllPosts; - }, + } - findHasMany(store, snapshot, url, relationship) { + findHasMany(store, snapshot, url/*, relationship*/) { return new Promise((resolve, reject) => { $.getJSON(url).then( json => { - let jsonApiDocument = { data: [], included: [] }; - let includedUserHash = {}; + run(() => { + let jsonApiDocument = { data: [], included: [] }; + let includedUserHash = {}; - json.forEach(obj => { - jsonApiDocument.data.push({ - id: obj.id, - type: "comments", - attributes: { - body: obj.body, - permalink: obj.html_url, - "created-at": obj.created_at - }, - relationships: { - user: { - data: { type: "users", id: obj.user.id } + json.forEach(obj => { + jsonApiDocument.data.push({ + id: obj.id, + type: "comments", + attributes: { + body: obj.body, + permalink: obj.html_url, + "created-at": obj.created_at + }, + relationships: { + user: { + data: { type: "users", id: obj.user.id } + } } - } - }); + }); - includedUserHash[obj.user.id] = obj.user; - }); + includedUserHash[obj.user.id] = obj.user; + }); - Object.keys(includedUserHash).forEach(key => { - let user = includedUserHash[key]; - jsonApiDocument.included.push({ - type: "users", - id: user.id, - attributes: { - "avatar-url": user.avatar_url, - "profile-url": user.html_url, - username: user.login - } + Object.keys(includedUserHash).forEach(key => { + let user = includedUserHash[key]; + jsonApiDocument.included.push({ + type: "users", + id: user.id, + attributes: { + "avatar-url": user.avatar_url, + "profile-url": user.html_url, + username: user.login + } + }); }); - }); - resolve(jsonApiDocument); + resolve(jsonApiDocument); + }); }, jqXHR => { - reject(jqXHR); + run(() => reject(jqXHR)); } ); }); } -}); +} diff --git a/tests/dummy/app/models/comment.js b/tests/dummy/app/models/comment.js index 7e72569c8..5b038edec 100644 --- a/tests/dummy/app/models/comment.js +++ b/tests/dummy/app/models/comment.js @@ -1,18 +1,19 @@ -import DS from 'ember-data'; +import Model, { attr, belongsTo } from '@ember-data/model'; import compileMarkdown from 'ember-cli-addon-docs/utils/compile-markdown'; import { htmlSafe } from '@ember/string'; import { computed } from '@ember/object'; -export default DS.Model.extend({ +export default class Comment extends Model { - user: DS.belongsTo(), + @belongsTo() user; - body: DS.attr(), - permalink: DS.attr(), - createdAt: DS.attr(), + @attr body; + @attr permalink; + @attr createdAt; - htmlBody: computed('body', function() { + @computed('body') + get htmlBody () { return htmlSafe(compileMarkdown(this.body)); - }) + } -}); +} diff --git a/tests/dummy/app/models/post.js b/tests/dummy/app/models/post.js index 53ff97d0e..d35f21498 100644 --- a/tests/dummy/app/models/post.js +++ b/tests/dummy/app/models/post.js @@ -1,22 +1,24 @@ -import DS from 'ember-data'; +import Model, { attr, hasMany } from '@ember-data/model'; import { computed } from '@ember/object'; import yaml from 'js-yaml'; import compileMarkdown from 'ember-cli-addon-docs/utils/compile-markdown'; import { htmlSafe } from '@ember/string'; -export default DS.Model.extend({ +export default class Post extends Model { - comments: DS.hasMany(), + @hasMany() comments; - title: DS.attr(), - body: DS.attr(), - issueUrl: DS.attr(), + @attr title; + @attr body; + @attr issueUrl; - htmlBody: computed('body', function() { + @computed('body') + get htmlBody () { return htmlSafe(compileMarkdown(this.body)); - }), + } - meta: computed('body', function() { + @computed('body') + get meta () { let lines = this.body.split('\n').map(line => line.trim()); let firstLine = lines[0]; @@ -26,11 +28,14 @@ export default DS.Model.extend({ let meta = yaml.safeLoad(`${metaLines.join('\n')}`); return meta; + } else { + return {}; } - }), + } - slugAndId: computed('slug', 'id', function() { + @computed('meta.slug', 'id') + get slugAndId () { return `${this.meta.slug}-${this.id}`; - }) + } -}); +} diff --git a/tests/dummy/app/models/user.js b/tests/dummy/app/models/user.js index 200ac6111..b3b69e06c 100644 --- a/tests/dummy/app/models/user.js +++ b/tests/dummy/app/models/user.js @@ -1,9 +1,9 @@ -import DS from 'ember-data'; +import Model, { attr } from '@ember-data/model'; -export default DS.Model.extend({ +export default class User extends Model { - avatarUrl: DS.attr(), - profileUrl: DS.attr(), - username: DS.attr() + @attr avatarUrl; + @attr profileUrl; + @attr username; -}); +} diff --git a/tests/dummy/app/pods/not-found/route.js b/tests/dummy/app/pods/not-found/route.js index b968ef67b..9eace6be4 100644 --- a/tests/dummy/app/pods/not-found/route.js +++ b/tests/dummy/app/pods/not-found/route.js @@ -1,6 +1,6 @@ import Route from '@ember/routing/route'; -export default Route.extend({ +export default class extends Route { beforeModel() { let { path } = this.paramsFor('not-found'); @@ -12,9 +12,9 @@ export default Route.extend({ } }); }); - }, + } - redirects: [ + redirects = [ { from: [ 'blog/2018/02/01/changing-mirages-default-linkage-data-behavior', @@ -93,4 +93,4 @@ export default Route.extend({ to: 'blog/thoughts-on-model-attribute-formatting-1492' } ] -}); +} diff --git a/tests/dummy/app/serializers/post.js b/tests/dummy/app/serializers/post.js index 74689dcb5..33d31a206 100644 --- a/tests/dummy/app/serializers/post.js +++ b/tests/dummy/app/serializers/post.js @@ -1,4 +1,3 @@ -import DS from 'ember-data'; +import JSONAPISerializer from '@ember-data/serializer/json-api'; -export default DS.JSONAPISerializer.extend({ -}); +export default class extends JSONAPISerializer {} diff --git a/tests/dummy/mirage/scenarios/default.js b/tests/dummy/mirage/scenarios/default.js index 1b5dd13ef..f0f20407a 100644 --- a/tests/dummy/mirage/scenarios/default.js +++ b/tests/dummy/mirage/scenarios/default.js @@ -1,2 +1 @@ -export default function(server) { -} +export default function(/*server*/) {} diff --git a/tests/helpers/destroy-app.js b/tests/helpers/destroy-app.js index f8d24fc36..f9411f492 100644 --- a/tests/helpers/destroy-app.js +++ b/tests/helpers/destroy-app.js @@ -4,6 +4,6 @@ export default function destroyApp(application) { run(function() { application.destroy(); - server.shutdown(); + window.server.shutdown(); }); } diff --git a/tests/helpers/promise-ajax.js b/tests/helpers/promise-ajax.js index 38a09df02..2c8223f7f 100644 --- a/tests/helpers/promise-ajax.js +++ b/tests/helpers/promise-ajax.js @@ -1,3 +1,4 @@ +/* eslint-disable ember/no-jquery */ import { Promise } from 'rsvp'; import $ from 'jquery'; diff --git a/tests/test-helper.js b/tests/test-helper.js index 36050ce1e..0382a848d 100644 --- a/tests/test-helper.js +++ b/tests/test-helper.js @@ -3,17 +3,6 @@ import config from '../config/environment'; import { setApplication } from '@ember/test-helpers'; import { start } from 'ember-qunit'; -import resolver from './helpers/resolver'; -import { - setResolver -} from 'ember-qunit'; - -import Ember from 'ember'; - -if (Ember.VERSION === "1.13.13") { - setResolver(resolver); -} else { - setApplication(Application.create(config.APP)); -} +setApplication(Application.create(config.APP)); start(); diff --git a/tests/unit/serializers/ember-data-serializer-test.js b/tests/unit/serializers/ember-data-serializer-test.js index 7ef347801..6bb58aea6 100644 --- a/tests/unit/serializers/ember-data-serializer-test.js +++ b/tests/unit/serializers/ember-data-serializer-test.js @@ -1,3 +1,4 @@ +/* eslint-disable ember/avoid-leaking-state-in-ember-objects */ import { module, test } from 'qunit'; import { setupTest } from 'ember-qunit'; import { Model, hasMany, belongsTo } from "miragejs"; From 24b4fb725b87153470d1a526e71e4a96bd78ba88 Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Fri, 3 Dec 2021 00:02:53 -0500 Subject: [PATCH 834/879] Add ember-maybe-import-regenerator to test packages --- package.json | 2 +- test-projects/01-basic-app/package.json | 2 +- .../02-app-that-excludes-mirage/package.json | 1 + yarn.lock | 563 ++++++++++-------- 4 files changed, 332 insertions(+), 236 deletions(-) diff --git a/package.json b/package.json index d010ccaa8..a02304911 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "ember-disable-prototype-extensions": "^1.1.3", "ember-export-application-global": "^2.0.0", "ember-load-initializers": "^2.0.0", - "ember-maybe-import-regenerator-for-testing": "^1.0.0", + "ember-maybe-import-regenerator": "^1.0.0", "ember-moment": "^8.0.0", "ember-qunit": "^4.6.0", "ember-resolver": "^8.0.2", diff --git a/test-projects/01-basic-app/package.json b/test-projects/01-basic-app/package.json index 52014eec2..5449472e9 100644 --- a/test-projects/01-basic-app/package.json +++ b/test-projects/01-basic-app/package.json @@ -34,7 +34,7 @@ "ember-data": "*", "ember-export-application-global": "*", "ember-load-initializers": "*", - "ember-maybe-import-regenerator-for-testing": "*", + "ember-maybe-import-regenerator": "*", "ember-qunit": "*", "ember-resolver": "*", "ember-source": "*", diff --git a/test-projects/02-app-that-excludes-mirage/package.json b/test-projects/02-app-that-excludes-mirage/package.json index fe30a6e37..6fe2ccf85 100644 --- a/test-projects/02-app-that-excludes-mirage/package.json +++ b/test-projects/02-app-that-excludes-mirage/package.json @@ -33,6 +33,7 @@ "ember-data": "*", "ember-export-application-global": "*", "ember-load-initializers": "*", + "ember-maybe-import-regenerator": "*", "ember-qunit": "*", "ember-resolver": "*", "ember-source": "*", diff --git a/yarn.lock b/yarn.lock index 25f1f245e..ab7b87448 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,6 +7,13 @@ resolved "https://registry.yarnpkg.com/30-seconds-of-code/-/30-seconds-of-code-1.2.3.tgz#b955acba83a050e3754fd0c84faaf25b32287fd4" integrity sha512-IRjJtNwmSfVLplKCOxHfjup1Z7Cq1IgDCvGiKf+6gFGq/eEVfYqwGaEQx+NH1vsQZkCJrg8YMfBKGNUnb+uI+w== +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" @@ -1578,6 +1585,21 @@ semver "^7.3.2" typescript-memoize "^1.0.0-alpha.3" +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + "@fullhuman/postcss-purgecss@^2.1.2": version "2.3.0" resolved "https://registry.yarnpkg.com/@fullhuman/postcss-purgecss/-/postcss-purgecss-2.3.0.tgz#50a954757ec78696615d3e118e3fee2d9291882e" @@ -1759,6 +1781,20 @@ resolved "https://registry.yarnpkg.com/@handlebars/parser/-/parser-1.1.0.tgz#d6dbc7574774b238114582410e8fee0dc3532bdf" integrity sha512-rR7tJoSwJ2eooOpYGxGGW95sLq6GXUaS1UtWvN7pei6n2/okYvCGld9vsUTvkl2migxbkszsycwtMf/GEc1k1A== +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + "@jimp/bmp@^0.5.4": version "0.5.4" resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.5.4.tgz#b7b375aa774f26154912569864d5466e71333ef1" @@ -2537,10 +2573,10 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" -acorn-jsx@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" - integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== +acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-node@^1.6.1: version "1.8.2" @@ -2566,7 +2602,7 @@ acorn@^5.0.0, acorn@^5.5.3: resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== -acorn@^6.0.7, acorn@^6.4.1: +acorn@^6.4.1: version "6.4.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== @@ -2576,6 +2612,11 @@ acorn@^7.0.0, acorn@^7.1.0, acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== +acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + acorn@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.1.0.tgz#52311fd7037ae119cbb134309e901aa46295b3fe" @@ -2596,7 +2637,7 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== -ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5, ajv@^6.9.1: +ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5: version "6.12.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== @@ -2606,6 +2647,26 @@ ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5, ajv@^6.9.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.1: + version "8.8.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.8.2.tgz#01b4fef2007a28bf75f0b7fc009f62679de4abbb" + integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + amd-name-resolver@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.2.0.tgz#fc41b3848824b557313897d71f8d5a0184fbe679" @@ -2626,16 +2687,16 @@ amdefine@>=0.0.4: resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + ansi-escapes@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" integrity sha1-06ioOzGapneTZisT52HHkRQiMG4= -ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - ansi-escapes@^4.2.1: version "4.3.1" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" @@ -2658,11 +2719,6 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - ansi-regex@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" @@ -2678,7 +2734,7 @@ ansi-styles@^2.2.1: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= -ansi-styles@^3.0.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-styles@^3.0.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -2738,13 +2794,6 @@ anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" -aot-test-generators@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/aot-test-generators/-/aot-test-generators-0.1.0.tgz#43f0f615f97cb298d7919c1b0b4e6b7310b03cd0" - integrity sha1-Q/D2Ffl8spjXkZwbC05rcxCwPNA= - dependencies: - jsesc "^2.5.0" - aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -2886,10 +2935,10 @@ ast-types@0.13.2: resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.2.tgz#df39b677a911a83f3a049644fb74fdded23cea48" integrity sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA== -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async-disk-cache@^1.2.1: version "1.3.5" @@ -4054,7 +4103,7 @@ broccoli-clean-css@^1.1.0: inline-source-map-comment "^1.0.5" json-stable-stringify "^1.0.0" -broccoli-concat@^3.2.2, broccoli-concat@^3.5.1, broccoli-concat@^3.7.1, broccoli-concat@^3.7.4: +broccoli-concat@^3.5.1, broccoli-concat@^3.7.1, broccoli-concat@^3.7.4: version "3.7.5" resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.7.5.tgz#223beda8c1184252cf08ae020a3d45ffa6a48218" integrity sha512-rDs1Mej3Ej0Cy5yIO9oIQq5+BCv0opAwS2NW7M0BeCsAMeFM42Z/zacDUC6jKc5OV5wiHvGTyCPLnZkMe0h6kQ== @@ -4263,19 +4312,6 @@ broccoli-kitchen-sink-helpers@^0.3.1: glob "^5.0.10" mkdirp "^0.5.1" -broccoli-lint-eslint@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/broccoli-lint-eslint/-/broccoli-lint-eslint-5.0.0.tgz#05365879d597dd78496a1c718db0e5ea5d4a2bde" - integrity sha512-V7M6U4th21bf1X4u3KoZa0xkcPq9JCSyKxB/nCWCBFMI3rkrB8nlyDLd8DKIUTqL+ojlFOGV5lohPZwndw0sZw== - dependencies: - aot-test-generators "^0.1.0" - broccoli-concat "^3.2.2" - broccoli-persistent-filter "^2.1.0" - eslint "^5.6.0" - json-stable-stringify "^1.0.1" - lodash.defaultsdeep "^4.6.0" - md5-hex "^2.0.0" - broccoli-merge-trees@3.0.2, broccoli-merge-trees@^3.0.0, broccoli-merge-trees@^3.0.1, broccoli-merge-trees@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-3.0.2.tgz#f33b451994225522b5c9bcf27d59decfd8ba537d" @@ -5811,6 +5847,15 @@ cross-spawn@^7.0.0: shebang-command "^2.0.0" which "^2.0.1" +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + cryptiles@0.2.x: version "0.2.2" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-0.2.2.tgz#ed91ff1f17ad13d3748288594f8a48a0d26f325c" @@ -6037,6 +6082,11 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -6690,16 +6740,6 @@ ember-cli-deploy@^1.0.2: rsvp "^3.3.3" silent-error "^1.0.0" -ember-cli-eslint@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ember-cli-eslint/-/ember-cli-eslint-5.1.0.tgz#acdb9b072911e04b07c313b610f514db4086d21a" - integrity sha512-o6787b0tgkRNp+KJo5BiQxtkLuz/yyYqVWF31LPrh+ZCC8jETrfyjsuk8VPDxKLGq7qEiQNJUgOEW87HTad7Vg== - dependencies: - broccoli-lint-eslint "^5.0.0" - ember-cli-version-checker "^3.0.0" - rsvp "^4.6.1" - walk-sync "^1.0.0" - ember-cli-fastboot@^2.0.4: version "2.2.3" resolved "https://registry.yarnpkg.com/ember-cli-fastboot/-/ember-cli-fastboot-2.2.3.tgz#d32eba948b2790ec4b5429ff759a8dee932c1e55" @@ -7320,15 +7360,6 @@ ember-macro-helpers@^4.2.2: ember-cli-string-utils "^1.1.0" ember-cli-test-info "^1.0.0" -ember-maybe-import-regenerator-for-testing@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ember-maybe-import-regenerator-for-testing/-/ember-maybe-import-regenerator-for-testing-1.0.0.tgz#894b8089c5b3067c920b492c81233603852d5c2f" - integrity sha512-9ZOjrXZ6iO8WnVuk5kLqUZIFEEOx2O/EA08vcedaT/XSna6LzH2knLx5OiOD9f7XiO8jNaYuZoh0Uq3wnm8/oA== - dependencies: - broccoli-funnel "^1.0.1" - ember-cli-babel "^6.6.0" - regenerator-runtime "^0.9.5" - ember-maybe-import-regenerator@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ember-maybe-import-regenerator/-/ember-maybe-import-regenerator-0.1.6.tgz#35d41828afa6d6a59bc0da3ce47f34c573d776ca" @@ -7339,6 +7370,16 @@ ember-maybe-import-regenerator@^0.1.6: ember-cli-babel "^6.0.0-beta.4" regenerator-runtime "^0.9.5" +ember-maybe-import-regenerator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-maybe-import-regenerator/-/ember-maybe-import-regenerator-1.0.0.tgz#c05453dfd3b65dbec2b569612b01ae70b672dd7e" + integrity sha512-wtjgjEV0Hk4fgiAwFjOfPrGWfmFrbRW3zgNZO4oA3H5FlbMssMvWuR8blQ3QSWYHODVK9r+ThsRAs8lG4kbxqA== + dependencies: + broccoli-funnel "^2.0.1" + broccoli-merge-trees "^3.0.0" + ember-cli-babel "^7.26.6" + regenerator-runtime "^0.13.2" + ember-modal-dialog@^3.0.0-beta.4: version "3.0.0-beta.4" resolved "https://registry.yarnpkg.com/ember-modal-dialog/-/ember-modal-dialog-3.0.0-beta.4.tgz#2da8b5424cf33fd87117624dcaabfe9727f967e9" @@ -7617,11 +7658,6 @@ emit-function@0.0.2: resolved "https://registry.yarnpkg.com/emit-function/-/emit-function-0.0.2.tgz#e3a50b3d61be1bf8ca88b924bf713157a5bec124" integrity sha1-46ULPWG+G/jKiLkkv3ExV6W+wSQ= -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -7693,6 +7729,13 @@ enhanced-resolve@^4.0.0, enhanced-resolve@^4.3.0: memory-fs "^0.5.0" tapable "^1.0.0" +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + ensure-posix-path@^1.0.0, ensure-posix-path@^1.0.1, ensure-posix-path@^1.0.2, ensure-posix-path@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.1.1.tgz#3c62bdb19fa4681544289edb2b382adc029179ce" @@ -7894,7 +7937,7 @@ eslint-plugin-es@^3.0.0: eslint-utils "^2.0.0" regexpp "^3.0.0" -eslint-plugin-node@^11.0.0: +eslint-plugin-node@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== @@ -7914,12 +7957,13 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-utils@^1.3.1: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: - eslint-visitor-keys "^1.1.0" + esrecurse "^4.3.0" + estraverse "^4.1.1" eslint-utils@^2.0.0: version "2.0.0" @@ -7928,66 +7972,87 @@ eslint-utils@^2.0.0: dependencies: eslint-visitor-keys "^1.1.0" +eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== -eslint@^5.6.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" - integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.9.1" - chalk "^2.1.0" - cross-spawn "^6.0.5" +eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint@^7.32.0: + version "7.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" - eslint-scope "^4.0.3" - eslint-utils "^1.3.1" - eslint-visitor-keys "^1.0.0" - espree "^5.0.1" - esquery "^1.0.1" + enquirer "^2.3.5" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" esutils "^2.0.2" - file-entry-cache "^5.0.1" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.7.0" + glob-parent "^5.1.2" + globals "^13.6.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^6.2.2" - js-yaml "^3.13.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.11" + levn "^0.4.1" + lodash.merge "^4.6.2" minimatch "^3.0.4" - mkdirp "^0.5.1" natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" + optionator "^0.9.1" progress "^2.0.0" - regexpp "^2.0.1" - semver "^5.5.1" - strip-ansi "^4.0.0" - strip-json-comments "^2.0.1" - table "^5.2.3" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.9" text-table "^0.2.0" + v8-compile-cache "^2.0.3" esm@^3.2.25: version "3.2.25" resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== -espree@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" - integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== dependencies: - acorn "^6.0.7" - acorn-jsx "^5.0.0" - eslint-visitor-keys "^1.0.0" + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" @@ -7999,12 +8064,12 @@ esprima@~3.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.0.0.tgz#53cf247acda77313e551c3aa2e73342d3fb4f7d9" integrity sha1-U88kes2ncxPlUcOqLnM0LT+099k= -esquery@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.2.0.tgz#a010a519c0288f2530b3404124bfb5f02e9797fe" - integrity sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q== +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: - estraverse "^5.0.0" + estraverse "^5.1.0" esrecurse@^4.1.0: version "4.2.1" @@ -8013,15 +8078,22 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.0.0.tgz#ac81750b482c11cca26e4b07e83ed8f75fbcdc22" - integrity sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A== +estraverse@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== estraverse@^5.2.0: version "5.2.0" @@ -8308,6 +8380,11 @@ fast-deep-equal@^3.1.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== +fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + fast-glob@^3.0.3: version "3.2.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.2.tgz#ade1a9d91148965d4bf7c51f72e1ca662d32e63d" @@ -8336,7 +8413,7 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -8489,12 +8566,12 @@ figures@^3.0.0: dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: - flat-cache "^2.0.1" + flat-cache "^3.0.4" file-type@^3.1.0, file-type@^3.8.0: version "3.9.0" @@ -8646,19 +8723,18 @@ fixturify@^1.2.0: fs-extra "^7.0.1" matcher-collection "^2.0.0" -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" + flatted "^3.1.0" + rimraf "^3.0.2" -flatted@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" - integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== +flatted@^3.1.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2" + integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== flush-write-stream@^1.0.0: version "1.1.1" @@ -9122,11 +9198,18 @@ global@~4.3.0: min-document "^2.19.0" process "~0.5.1" -globals@^11.1.0, globals@^11.7.0: +globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globals@^13.6.0, globals@^13.9.0: + version "13.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.0.tgz#4d733760304230a0082ed96e21e5c565f898089e" + integrity sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg== + dependencies: + type-fest "^0.20.2" + globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -9665,6 +9748,14 @@ import-fresh@^3.0.0: parent-module "^1.0.0" resolve-from "^4.0.0" +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -9761,25 +9852,6 @@ inquirer@^2: strip-ansi "^3.0.0" through "^2.3.6" -inquirer@^6.2.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" - integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== - dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - inquirer@^7.3.3: version "7.3.3" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" @@ -10357,7 +10429,7 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.2.5, js-yaml@^3.2.7: +js-yaml@^3.12.0, js-yaml@^3.13.1, js-yaml@^3.2.5, js-yaml@^3.2.7: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -10435,7 +10507,7 @@ jsesc@^1.3.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= -jsesc@^2.5.0, jsesc@^2.5.1: +jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== @@ -10485,6 +10557,11 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" @@ -10628,7 +10705,15 @@ leek@0.0.24: lodash.assign "^3.2.0" rsvp "^3.0.21" -levn@^0.3.0, levn@~0.3.0: +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= @@ -11061,6 +11146,11 @@ lodash.toarray@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + lodash.uniq@^4.2.0, lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" @@ -11076,7 +11166,7 @@ lodash.values@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c= -lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1, lodash@^4.7.0: +lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -11698,11 +11788,6 @@ mute-stream@0.0.6: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" integrity sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s= -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - mute-stream@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" @@ -12137,7 +12222,7 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" -optionator@^0.8.1, optionator@^0.8.2: +optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -12149,6 +12234,18 @@ optionator@^0.8.1, optionator@^0.8.2: type-check "~0.3.2" word-wrap "~1.2.3" +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + ora@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ora/-/ora-2.1.0.tgz#6caf2830eb924941861ec53a173799e008b51e5b" @@ -12472,11 +12569,6 @@ path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" @@ -12756,6 +12848,11 @@ postcss@^7.0.2, postcss@^7.0.32: source-map "^0.6.1" supports-color "^6.1.0" +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -13202,6 +13299,11 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== +regenerator-runtime@^0.13.2: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + regenerator-runtime@^0.13.4: version "0.13.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" @@ -13237,16 +13339,16 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - regexpp@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== +regexpp@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" @@ -13428,6 +13530,11 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" @@ -13555,13 +13662,6 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.1, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -13569,7 +13669,7 @@ rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.1, rimraf@^2.4.3, rimraf@^2.4.4, rimra dependencies: glob "^7.1.3" -rimraf@^3.0.0, rimraf@^3.0.1: +rimraf@^3.0.0, rimraf@^3.0.1, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -13632,7 +13732,7 @@ rsvp@^3.0.14, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0 resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== -rsvp@^4.6.1, rsvp@^4.7.0, rsvp@^4.8.0, rsvp@^4.8.1, rsvp@^4.8.2, rsvp@^4.8.3, rsvp@^4.8.4, rsvp@^4.8.5: +rsvp@^4.7.0, rsvp@^4.8.0, rsvp@^4.8.1, rsvp@^4.8.2, rsvp@^4.8.3, rsvp@^4.8.4, rsvp@^4.8.5: version "4.8.5" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== @@ -13666,13 +13766,6 @@ rx@^4.1.0: resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= -rxjs@^6.4.0: - version "6.5.4" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" - integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== - dependencies: - tslib "^1.9.0" - rxjs@^6.6.0: version "6.6.2" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.2.tgz#8096a7ac03f2cc4fe5860ef6e572810d9e01c0d2" @@ -13781,7 +13874,7 @@ select@^1.1.2: resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= -"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -13803,6 +13896,13 @@ semver@^7.1.3, semver@^7.3.2, semver@^7.3.4: dependencies: lru-cache "^6.0.0" +semver@^7.2.1: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -13968,14 +14068,14 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" snake-case@^3.0.3: version "3.0.3" @@ -14361,7 +14461,7 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -14369,15 +14469,6 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string-width@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - string-width@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" @@ -14387,7 +14478,7 @@ string-width@^4.1.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string-width@^4.2.0: +string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -14475,13 +14566,6 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - strip-ansi@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" @@ -14530,7 +14614,12 @@ strip-indent@^1.0.1: dependencies: get-stdin "^4.0.1" -strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= @@ -14639,15 +14728,16 @@ sync-disk-cache@^2.0.0: rimraf "^3.0.0" username-sync "^1.0.2" -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== +table@^6.0.9: + version "6.7.5" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.5.tgz#f04478c351ef3d8c7904f0e8be90a1b62417d238" + integrity sha512-LFNeryOqiQHqCVKzhkymKwt6ozeRhlm8IL1mE8rNUurkir4heF6PzMyRgaTa4tlyPTGGgXuvVOF/OLWiH09Lqw== dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" taffydb@2.7.2: version "2.7.2" @@ -15068,6 +15158,13 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -15080,6 +15177,11 @@ type-fest@^0.11.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -15368,7 +15470,7 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -v8-compile-cache@^2.3.0: +v8-compile-cache@^2.0.3, v8-compile-cache@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== @@ -15660,7 +15762,7 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" -word-wrap@~1.2.3: +word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== @@ -15749,13 +15851,6 @@ write-file-atomic@^2.0.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - ws@^7.4.4, ws@~7.4.2: version "7.4.4" resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz#383bc9742cb202292c9077ceab6f6047b17f2d59" From be6bb60ef77a7a24707897afa80108c3d1918587 Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Fri, 3 Dec 2021 00:15:32 -0500 Subject: [PATCH 835/879] Upgrade ember-qunit to v5 --- package.json | 6 +- test-projects/01-basic-app/package.json | 1 + test-projects/01-basic-app/tests/index.html | 7 + .../01-basic-app/tests/test-helper.js | 8 +- .../02-app-that-excludes-mirage/package.json | 2 + .../tests/index.html | 7 + .../tests/test-helper.js | 8 +- tests/index.html | 7 + tests/test-helper.js | 8 +- yarn.lock | 263 ++++++++++++------ 10 files changed, 220 insertions(+), 97 deletions(-) diff --git a/package.json b/package.json index a02304911..333c76062 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "devDependencies": { "@ember/jquery": "^1.1.0", "@ember/optional-features": "^2.0.0", + "@ember/test-helpers": "^2.6.0", "babel-eslint": "^10.0.3", "broccoli-asset-rev": "^3.0.0", "ember-ajax": "^5.0.0", @@ -78,7 +79,7 @@ "ember-load-initializers": "^2.0.0", "ember-maybe-import-regenerator": "^1.0.0", "ember-moment": "^8.0.0", - "ember-qunit": "^4.6.0", + "ember-qunit": "^5.1.5", "ember-resolver": "^8.0.2", "ember-source": "~3.26.1", "ember-source-channel-url": "^3.0.0", @@ -94,7 +95,8 @@ "jsdom": "^16.2.2", "loader.js": "^4.7.0", "npm-run-all": "^4.1.5", - "qunit-dom": "^1.1.0" + "qunit": "^2.17.2", + "qunit-dom": "^2.0.0" }, "resolutions": { "favicons": "5.3.0", diff --git a/test-projects/01-basic-app/package.json b/test-projects/01-basic-app/package.json index 5449472e9..72701e1e5 100644 --- a/test-projects/01-basic-app/package.json +++ b/test-projects/01-basic-app/package.json @@ -19,6 +19,7 @@ }, "devDependencies": { "@ember/jquery": "*", + "@ember/test-helpers": "*", "broccoli-asset-rev": "*", "ember-ajax": "*", "ember-auto-import": "*", diff --git a/test-projects/01-basic-app/tests/index.html b/test-projects/01-basic-app/tests/index.html index 008e6d610..4bfcf9865 100644 --- a/test-projects/01-basic-app/tests/index.html +++ b/test-projects/01-basic-app/tests/index.html @@ -21,6 +21,13 @@ {{content-for "body"}} {{content-for "test-body"}} +

    +
    +
    +
    +
    +
    + diff --git a/test-projects/01-basic-app/tests/test-helper.js b/test-projects/01-basic-app/tests/test-helper.js index 0382a848d..0cd91d37f 100644 --- a/test-projects/01-basic-app/tests/test-helper.js +++ b/test-projects/01-basic-app/tests/test-helper.js @@ -1,8 +1,12 @@ -import Application from '../app'; -import config from '../config/environment'; +import Application from 'basic-app/app'; +import config from 'basic-app/config/environment'; +import * as QUnit from 'qunit'; import { setApplication } from '@ember/test-helpers'; +import { setup } from 'qunit-dom'; import { start } from 'ember-qunit'; setApplication(Application.create(config.APP)); +setup(QUnit.assert); + start(); diff --git a/test-projects/02-app-that-excludes-mirage/package.json b/test-projects/02-app-that-excludes-mirage/package.json index 6fe2ccf85..1e08d0901 100644 --- a/test-projects/02-app-that-excludes-mirage/package.json +++ b/test-projects/02-app-that-excludes-mirage/package.json @@ -19,8 +19,10 @@ }, "devDependencies": { "@ember/jquery": "*", + "@ember/test-helpers": "*", "broccoli-asset-rev": "*", "ember-ajax": "*", + "ember-auto-import": "*", "ember-cli": "*", "ember-cli-babel": "*", "ember-cli-dependency-checker": "*", diff --git a/test-projects/02-app-that-excludes-mirage/tests/index.html b/test-projects/02-app-that-excludes-mirage/tests/index.html index 008e6d610..4bfcf9865 100644 --- a/test-projects/02-app-that-excludes-mirage/tests/index.html +++ b/test-projects/02-app-that-excludes-mirage/tests/index.html @@ -21,6 +21,13 @@ {{content-for "body"}} {{content-for "test-body"}} +
    +
    +
    +
    +
    +
    + diff --git a/test-projects/02-app-that-excludes-mirage/tests/test-helper.js b/test-projects/02-app-that-excludes-mirage/tests/test-helper.js index 0382a848d..0cd91d37f 100644 --- a/test-projects/02-app-that-excludes-mirage/tests/test-helper.js +++ b/test-projects/02-app-that-excludes-mirage/tests/test-helper.js @@ -1,8 +1,12 @@ -import Application from '../app'; -import config from '../config/environment'; +import Application from 'basic-app/app'; +import config from 'basic-app/config/environment'; +import * as QUnit from 'qunit'; import { setApplication } from '@ember/test-helpers'; +import { setup } from 'qunit-dom'; import { start } from 'ember-qunit'; setApplication(Application.create(config.APP)); +setup(QUnit.assert); + start(); diff --git a/tests/index.html b/tests/index.html index 3eb848dbd..24436a9e7 100644 --- a/tests/index.html +++ b/tests/index.html @@ -28,6 +28,13 @@
    +
    +
    +
    +
    +
    +
    + diff --git a/tests/test-helper.js b/tests/test-helper.js index 0382a848d..4efd6e58a 100644 --- a/tests/test-helper.js +++ b/tests/test-helper.js @@ -1,8 +1,12 @@ -import Application from '../app'; -import config from '../config/environment'; +import Application from 'dummy/app'; +import config from 'dummy/config/environment'; +import * as QUnit from 'qunit'; import { setApplication } from '@ember/test-helpers'; +import { setup } from 'qunit-dom'; import { start } from 'ember-qunit'; setApplication(Application.create(config.APP)); +setup(QUnit.assert); + start(); diff --git a/yarn.lock b/yarn.lock index ab7b87448..b192738d0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1484,17 +1484,17 @@ ember-cli-babel "^7.10.0" ember-modifier-manager-polyfill "^1.1.0" -"@ember/test-helpers@^1.7.1": - version "1.7.2" - resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-1.7.2.tgz#5b128dc5f6524c3850abf52668e6bd4fda401194" - integrity sha512-FEJBpbFNIaWAsCSnataiNwYFvmcpoymL/B7fXLruuJ/46BnJjzLaRPtpUIZ91w4GNTK6knxbHWXW76aVb3Aezg== +"@ember/test-helpers@^2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-2.6.0.tgz#d687515c6ab49ba72717fc62046970ef4a72ea9c" + integrity sha512-N5sr3layWk60wB3maCy+/5hFHQRcTh8aqxcZTSs3Od9QkuHdWBtRgMGLP/35mXpJlgWuu3xqLpt6u3dGHc8gCg== dependencies: + "@ember/test-waiters" "^3.0.0" broccoli-debug "^0.6.5" - broccoli-funnel "^2.0.2" - ember-assign-polyfill "^2.6.0" - ember-cli-babel "^7.7.3" - ember-cli-htmlbars-inline-precompile "^2.1.0" - ember-test-waiters "^1.1.1" + broccoli-funnel "^3.0.8" + ember-cli-babel "^7.26.6" + ember-cli-htmlbars "^5.7.1" + ember-destroyable-polyfill "^2.0.3" "@ember/test-waiters@^2.3.0": version "2.3.0" @@ -1506,6 +1506,16 @@ ember-cli-version-checker "^5.1.1" semver "^7.1.3" +"@ember/test-waiters@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@ember/test-waiters/-/test-waiters-3.0.0.tgz#b66a35cd5b78ec3c296a6f5f5fb3852780a5d3c8" + integrity sha512-z6+gIlq/rXLKroWv2wxAoiiLtgSOGQFCw6nUufERausV+jLnA7CYbWwzEo5R7XaOejSDpgA5d6haXIBsD5j0oQ== + dependencies: + calculate-cache-key-for-tree "^2.0.0" + ember-cli-babel "^7.26.6" + ember-cli-version-checker "^5.1.2" + semver "^7.3.5" + "@embroider/core@0.33.0", "@embroider/core@^0.33.0": version "0.33.0" resolved "https://registry.yarnpkg.com/@embroider/core/-/core-0.33.0.tgz#0fb1752d6e34ea45368e65c42e13220a57ffae76" @@ -3327,11 +3337,6 @@ babel-plugin-filter-imports@^4.0.0: "@babel/types" "^7.7.2" lodash "^4.17.15" -babel-plugin-htmlbars-inline-precompile@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-1.0.0.tgz#a9d2f6eaad8a3f3d361602de593a8cbef8179c22" - integrity sha512-4jvKEHR1bAX03hBDZ94IXsYCj3bwk9vYsn6ux6JZNL2U5pvzCWjqyrGahfsGNrhERyxw8IqcirOi9Q6WCo3dkQ== - babel-plugin-htmlbars-inline-precompile@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-3.2.0.tgz#c4882ea875d0f5683f0d91c1f72e29a4f14b5606" @@ -4296,6 +4301,19 @@ broccoli-funnel@^3.0.0, broccoli-funnel@^3.0.3: path-posix "^1.0.0" walk-sync "^2.0.2" +broccoli-funnel@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.8.tgz#f5b62e2763c3918026a15a3c833edc889971279b" + integrity sha512-ng4eIhPYiXqMw6SyGoxPHR3YAwEd2lr9FgBI1CyTbspl4txZovOsmzFkMkGAlu88xyvYXJqHiM2crfLa65T1BQ== + dependencies: + array-equal "^1.0.0" + broccoli-plugin "^4.0.7" + debug "^4.1.1" + fs-tree-diff "^2.0.1" + heimdalljs "^0.2.0" + minimatch "^3.0.0" + walk-sync "^2.0.2" + broccoli-kitchen-sink-helpers@^0.2.5: version "0.2.9" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz#a5e0986ed8d76fb5984b68c3f0450d3a96e36ecc" @@ -4410,6 +4428,15 @@ broccoli-output-wrapper@^3.2.1: heimdalljs-logger "^0.1.10" symlink-or-copy "^1.2.0" +broccoli-output-wrapper@^3.2.5: + version "3.2.5" + resolved "https://registry.yarnpkg.com/broccoli-output-wrapper/-/broccoli-output-wrapper-3.2.5.tgz#514b17801c92922a2c2f87fd145df2a25a11bc5f" + integrity sha512-bQAtwjSrF4Nu0CK0JOy5OZqw9t5U0zzv2555EA/cF8/a8SLDTIetk9UgrtMVw7qKLKdSpOZ2liZNeZZDaKgayw== + dependencies: + fs-extra "^8.1.0" + heimdalljs-logger "^0.1.10" + symlink-or-copy "^1.2.0" + broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.4.3: version "1.4.6" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.6.tgz#80762d19000880a77da33c34373299c0f6a3e615" @@ -4522,6 +4549,19 @@ broccoli-plugin@^3.1.0: rimraf "^2.3.4" symlink-or-copy "^1.1.8" +broccoli-plugin@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-4.0.7.tgz#dd176a85efe915ed557d913744b181abe05047db" + integrity sha512-a4zUsWtA1uns1K7p9rExYVYG99rdKeGRymW0qOCNkvDPHQxVi3yVyJHhQbM3EZwdt2E0mnhr5e0c/bPpJ7p3Wg== + dependencies: + broccoli-node-api "^1.7.0" + broccoli-output-wrapper "^3.2.5" + fs-merger "^3.2.1" + promise-map-series "^0.3.0" + quick-temp "^0.1.8" + rimraf "^3.0.2" + symlink-or-copy "^1.3.1" + broccoli-postcss-single@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/broccoli-postcss-single/-/broccoli-postcss-single-4.0.1.tgz#21f1494826058c974fd746bba7d10976d9cce26d" @@ -5536,10 +5576,10 @@ commander@2.8.x: dependencies: graceful-readlink ">= 1.0.0" -commander@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75" - integrity sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q== +commander@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== commander@^2.19.0, commander@^2.20.0, commander@^2.6.0: version "2.20.3" @@ -5556,7 +5596,7 @@ commander@^6.2.1: resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== -common-tags@^1.4.0, common-tags@^1.8.0: +common-tags@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== @@ -6436,6 +6476,41 @@ ember-assign-polyfill@^2.5.0, ember-assign-polyfill@^2.6.0: ember-cli-babel "^6.16.0" ember-cli-version-checker "^2.0.0" +ember-auto-import@^1.11.3: + version "1.12.0" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.12.0.tgz#52246b04891090e2608244e65c4c6af7710df12b" + integrity sha512-fzMGnyHGfUNFHchpLbJ98Vs/c5H2wZBMR9r/XwW+WOWPisZDGLUPPyhJQsSREPoUQ+o8GvyLaD/rkrKqW8bmgw== + dependencies: + "@babel/core" "^7.1.6" + "@babel/preset-env" "^7.10.2" + "@babel/traverse" "^7.1.6" + "@babel/types" "^7.1.6" + "@embroider/core" "^0.33.0" + babel-core "^6.26.3" + babel-loader "^8.0.6" + babel-plugin-syntax-dynamic-import "^6.18.0" + babylon "^6.18.0" + broccoli-debug "^0.6.4" + broccoli-node-api "^1.7.0" + broccoli-plugin "^4.0.0" + broccoli-source "^3.0.0" + debug "^3.1.0" + ember-cli-babel "^7.0.0" + enhanced-resolve "^4.0.0" + fs-extra "^6.0.1" + fs-tree-diff "^2.0.0" + handlebars "^4.3.1" + js-string-escape "^1.0.1" + lodash "^4.17.19" + mkdirp "^0.5.1" + resolve-package-path "^3.1.0" + rimraf "^2.6.2" + semver "^7.3.4" + symlink-or-copy "^1.2.0" + typescript-memoize "^1.0.0-alpha.3" + walk-sync "^0.3.3" + webpack "^4.43.0" + ember-auto-import@^1.2.19, ember-auto-import@^1.5.3, ember-auto-import@^1.6.0: version "1.11.3" resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.11.3.tgz#6e3384a7fbb163384a34546f2e902cd297b0e683" @@ -6598,7 +6673,7 @@ ember-cli-babel@7.7.3: ensure-posix-path "^1.0.2" semver "^5.5.0" -ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.17.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.7.2, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2: +ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.17.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.7.2, ember-cli-babel@^6.8.2: version "6.18.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz#3f6435fd275172edeff2b634ee7b29ce74318957" integrity sha512-7ceC8joNYxY2wES16iIBlbPSxwKDBhYwC8drU3ZEvuPDMwVv1KzxCNu1fvxyFEBWhwaRNTUxSCsEVoTd9nosGA== @@ -6617,7 +6692,7 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.2, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.26.6, ember-cli-babel@^7.4.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.2, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.26.6, ember-cli-babel@^7.4.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: version "7.26.6" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.6.tgz#322fbbd3baad9dd99e3276ff05bc6faef5e54b39" integrity sha512-040svtfj2RC35j/WMwdWJFusZaXmNoytLAMyBDGLMSlRvznudTxZjGlPV6UupmtTBApy58cEF8Fq4a+COWoEmQ== @@ -6779,17 +6854,6 @@ ember-cli-get-component-path-option@^1.0.0: resolved "https://registry.yarnpkg.com/ember-cli-get-component-path-option/-/ember-cli-get-component-path-option-1.0.0.tgz#0d7b595559e2f9050abed804f1d8eff1b08bc771" integrity sha1-DXtZVVni+QUKvtgE8djv8bCLx3E= -ember-cli-htmlbars-inline-precompile@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-2.1.0.tgz#61b91ff1879d44ae504cadb46fb1f2604995ae08" - integrity sha512-BylIHduwQkncPhnj0ZyorBuljXbTzLgRo6kuHf1W+IHFxThFl2xG+r87BVwsqx4Mn9MTgW9SE0XWjwBJcSWd6Q== - dependencies: - babel-plugin-htmlbars-inline-precompile "^1.0.0" - ember-cli-version-checker "^2.1.2" - hash-for-dep "^1.2.3" - heimdalljs-logger "^0.1.9" - silent-error "^1.1.0" - ember-cli-htmlbars@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.5.tgz#b5a105429a6bce4f7c9c97b667e3b8926e31397f" @@ -6963,12 +7027,12 @@ ember-cli-test-info@^1.0.0: dependencies: ember-cli-string-utils "^1.0.0" -ember-cli-test-loader@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ember-cli-test-loader/-/ember-cli-test-loader-2.2.0.tgz#3fb8d5d1357e4460d3f0a092f5375e71b6f7c243" - integrity sha512-mlSXX9SciIRwGkFTX6XGyJYp4ry6oCFZRxh5jJ7VH8UXLTNx2ZACtDTwaWtNhYrWXgKyiDUvmD8enD56aePWRA== +ember-cli-test-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-test-loader/-/ember-cli-test-loader-3.0.0.tgz#1c036fc48de36155355fcda3266af63f977826f1" + integrity sha512-wfFRBrfO9gaKScYcdQxTfklx9yp1lWK6zv1rZRpkas9z2SHyJojF7NOQRWQgSB3ypm7vfpiF8VsFFVVr7VBzAQ== dependencies: - ember-cli-babel "^6.8.1" + ember-cli-babel "^7.13.2" ember-cli-typescript@^2.0.2: version "2.0.2" @@ -7246,6 +7310,15 @@ ember-destroyable-polyfill@^2.0.2: ember-cli-version-checker "^5.1.1" ember-compatibility-helpers "^1.2.1" +ember-destroyable-polyfill@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/ember-destroyable-polyfill/-/ember-destroyable-polyfill-2.0.3.tgz#1673ed66609a82268ef270a7d917ebd3647f11e1" + integrity sha512-TovtNqCumzyAiW0/OisSkkVK93xnVF4NRU6+FN0ubpfwEOpRrmM2RqDwXI6YAChCgSHON1cz0DfQStpA1Gjuuw== + dependencies: + ember-cli-babel "^7.22.1" + ember-cli-version-checker "^5.1.1" + ember-compatibility-helpers "^1.2.1" + ember-disable-prototype-extensions@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/ember-disable-prototype-extensions/-/ember-disable-prototype-extensions-1.1.3.tgz#1969135217654b5e278f9fe2d9d4e49b5720329e" @@ -7427,18 +7500,20 @@ ember-on-modifier@^1.0.0: ember-cli-version-checker "^4.1.0" ember-modifier-manager-polyfill "^1.2.0" -ember-qunit@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-4.6.0.tgz#ad79fd3ff00073a8779400cc5a4b44829517590f" - integrity sha512-i5VOGn0RP8XH+5qkYDOZshbqAvO6lHgF65D0gz8vRx4DszCIvJMJO+bbftBTfYMxp6rqG85etAA6pfNxE0DqsQ== +ember-qunit@^5.1.5: + version "5.1.5" + resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-5.1.5.tgz#24a7850f052be24189ff597dfc31b923e684c444" + integrity sha512-2cFA4oMygh43RtVcMaBrr086Tpdhgbn3fVZ2awLkzF/rnSN0D0PSRpd7hAD7OdBPerC/ZYRwzVyGXLoW/Zes4A== dependencies: - "@ember/test-helpers" "^1.7.1" - broccoli-funnel "^2.0.2" + broccoli-funnel "^3.0.8" broccoli-merge-trees "^3.0.2" - common-tags "^1.4.0" - ember-cli-babel "^7.12.0" - ember-cli-test-loader "^2.2.0" - qunit "^2.9.3" + common-tags "^1.8.0" + ember-auto-import "^1.11.3" + ember-cli-babel "^7.26.6" + ember-cli-test-loader "^3.0.0" + resolve-package-path "^3.1.0" + silent-error "^1.1.1" + validate-peer-dependencies "^1.2.0" ember-resolver@^8.0.2: version "8.0.2" @@ -7590,14 +7665,6 @@ ember-template-recast@^5.0.3: tmp "^0.2.1" workerpool "^6.1.4" -ember-test-waiters@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ember-test-waiters/-/ember-test-waiters-1.2.0.tgz#c12ead4313934c24cff41857020cacdbf8e6effe" - integrity sha512-aEw7YuutLuJT4NUuPTNiGFwgTYl23ThqmBxSkfFimQAn+keWjAftykk3dlFELuhsJhYW/S8YoVjN0bSAQRLNtw== - dependencies: - ember-cli-babel "^7.11.0" - semver "^6.3.0" - ember-tether@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ember-tether/-/ember-tether-2.0.0.tgz#4fcb88749e8c11d3795173e96e894089328005b4" @@ -8915,6 +8982,17 @@ fs-merger@^3.1.0: rimraf "^2.6.3" walk-sync "^2.0.2" +fs-merger@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/fs-merger/-/fs-merger-3.2.1.tgz#a225b11ae530426138294b8fbb19e82e3d4e0b3b" + integrity sha512-AN6sX12liy0JE7C2evclwoo0aCG3PFulLjrTLsJpWh/2mM+DinhpSGqYLbHBBbIW1PLRNcFhJG8Axtz8mQW3ug== + dependencies: + broccoli-node-api "^1.7.0" + broccoli-node-info "^2.1.0" + fs-extra "^8.0.1" + fs-tree-diff "^2.0.1" + walk-sync "^2.2.0" + fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6, fs-tree-diff@^0.5.7, fs-tree-diff@^0.5.9: version "0.5.9" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.9.tgz#a4ec6182c2f5bd80b9b83c8e23e4522e6f5fd946" @@ -9215,10 +9293,10 @@ globals@^9.18.0: resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== -globalyzer@^0.1.0: - version "0.1.4" - resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.4.tgz#bc8e273afe1ac7c24eea8def5b802340c5cc534f" - integrity sha512-LeguVWaxgHN0MNbWC6YljNMzHkrCny9fzjmEUdnF1kQ7wATFD1RHFRqA1qxaX2tgxGENlcxjOflopBwj3YZiXA== +globalyzer@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465" + integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== globby@10.0.1: version "10.0.1" @@ -9246,7 +9324,7 @@ globby@^11.0.3, globby@^11.0.4: merge2 "^1.3.0" slash "^3.0.0" -globrex@^0.1.1: +globrex@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== @@ -10409,11 +10487,6 @@ jquery@^3.4.1, jquery@^3.5.1: resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470" integrity sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw== -js-reporters@1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/js-reporters/-/js-reporters-1.2.3.tgz#8febcab370539df62e09b95da133da04b11f6168" - integrity sha512-2YzWkHbbRu6LueEs5ZP3P1LqbECvAeUJYrjw3H4y1ofW06hqCS0AbzBtLwbr+Hke51bt9CUepJ/Fj1hlCRIF6A== - js-string-escape@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" @@ -11936,10 +12009,10 @@ node-uuid@~1.4.0: resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" integrity sha1-sEDrCSOWivq/jTL7HxfxFn/auQc= -node-watch@0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/node-watch/-/node-watch-0.7.0.tgz#033c0c04239d9348f3402b6b6f9c1e689a7edbe1" - integrity sha512-OOBiglke5SlRQT5WYfwXTmYqTfXjcTNBHpalyHLtLxDpQYVpVRkJqabcch1kmwJsjV/J4OZuzEafeb4soqtFZA== +node-watch@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/node-watch/-/node-watch-0.7.2.tgz#545f057da8500487eb8287adcb4cb5a7338d7e21" + integrity sha512-g53VjSARRv1JdST0LZRIg8RiuLr1TaBbVPsVvxh0/0Ymvi0xYUjDuoqQQAWtHJQUXhiShowPT/aXKNeHBcyQsw== nopt@^3.0.6: version "3.0.6" @@ -12942,6 +13015,11 @@ promise-map-series@^0.2.1, promise-map-series@^0.2.3: dependencies: rsvp "^3.0.14" +promise-map-series@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/promise-map-series/-/promise-map-series-0.3.0.tgz#41873ca3652bb7a042b387d538552da9b576f8a1" + integrity sha512-3npG2NGhTc8BWBolLLf8l/92OxMGaRLbqvIh9wjCHhDXNvk4zsxaTaCpiCunW09qWPrN2zeNSNwRLVBrQQtutA== + proxy-addr@~2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" @@ -13080,25 +13158,24 @@ quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quick-temp@^0.1.8: rimraf "^2.5.4" underscore.string "~3.3.4" -qunit-dom@^1.1.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-1.6.0.tgz#a4bea6a46329d221e4a317d712cb40709107b977" - integrity sha512-YwSqcLjQcRI0fUFpaSWwU10KIJPFW5Qh+d3cT5DOgx81dypRuUSiPkKFmBY/CDs/R1KdHRadthkcXg2rqAon8Q== +qunit-dom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-2.0.0.tgz#c4d7f7676dbb57f54151b72f8366d862134cd1c0" + integrity sha512-mElzLN99wYPOGekahqRA+mq7NcThXY9c+/tDkgJmT7W5LeZAFNyITr2rFKNnCbWLIhuLdFw88kCBMrJSfyBYpA== dependencies: broccoli-funnel "^3.0.3" broccoli-merge-trees "^4.2.0" ember-cli-babel "^7.23.0" ember-cli-version-checker "^5.1.1" -qunit@^2.9.3: - version "2.13.0" - resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.13.0.tgz#4cbaac0b314d787ba20195e238b0edf1cd9b2fb1" - integrity sha512-RvJquyNKbMSn5Qo28S2wKWxHl1Ku8m0zFLTKsXfq/WZkyM+b28gpEs6YkKN1fOCV4S+979+GnevD0FRgQayo3Q== +qunit@^2.17.2: + version "2.17.2" + resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.17.2.tgz#5cb278e131d931f25c109a0fdb0518be7754c25a" + integrity sha512-17isVvuOmALzsPjiV7wFg/6O5vJYXBrQZPwocfQSSh0I/rXvfX7bKMFJ4GMVW3U4P8r2mBeUy8EAngti4QD2Vw== dependencies: - commander "6.2.0" - js-reporters "1.2.3" - node-watch "0.7.0" - tiny-glob "0.2.6" + commander "7.2.0" + node-watch "0.7.2" + tiny-glob "0.2.9" randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.1.0" @@ -13896,7 +13973,7 @@ semver@^7.1.3, semver@^7.3.2, semver@^7.3.4: dependencies: lru-cache "^6.0.0" -semver@^7.2.1: +semver@^7.2.1, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== @@ -14701,7 +14778,7 @@ svgo@1.3.0: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.8, symlink-or-copy@^1.2.0, symlink-or-copy@^1.3.0: +symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.8, symlink-or-copy@^1.2.0, symlink-or-copy@^1.3.0, symlink-or-copy@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.3.1.tgz#9506dd64d8e98fa21dcbf4018d1eab23e77f71fe" integrity sha512-0K91MEXFpBUaywiwSSkmKjnGcasG/rVBXFLJz5DrgGabpYD6N+3yZrfD6uUIfpuTu65DZLHi7N8CizHc07BPZA== @@ -14938,13 +15015,13 @@ tiny-emitter@^2.0.0: resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== -tiny-glob@0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.6.tgz#9e056e169d9788fe8a734dfa1ff02e9b92ed7eda" - integrity sha512-A7ewMqPu1B5PWwC3m7KVgAu96Ch5LA0w4SnEN/LbDREj/gAD0nPWboRbn8YoP9ISZXqeNAlMvKSKoEuhcfK3Pw== +tiny-glob@0.2.9: + version "0.2.9" + resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.9.tgz#2212d441ac17928033b110f8b3640683129d31e2" + integrity sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg== dependencies: - globalyzer "^0.1.0" - globrex "^0.1.1" + globalyzer "0.1.0" + globrex "^0.1.2" tiny-lr@^1.1.1: version "1.1.1" @@ -15490,6 +15567,14 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" +validate-peer-dependencies@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/validate-peer-dependencies/-/validate-peer-dependencies-1.2.0.tgz#22aab93c514f4fda457d36c80685e8b1160d2036" + integrity sha512-nd2HUpKc6RWblPZQ2GDuI65sxJ2n/UqZwSBVtj64xlWjMx0m7ZB2m9b2JS3v1f+n9VWH/dd1CMhkHfP6pIdckA== + dependencies: + resolve-package-path "^3.1.0" + semver "^7.3.2" + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" From 0ee4fb1842137b5bd1028ca52ebbfafe1f41858c Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Fri, 3 Dec 2021 14:41:39 -0500 Subject: [PATCH 836/879] Enable Ember Octane features to not fail in Ember v4 scenarios --- config/ember-try.js | 9 + package.json | 23 ++- tests/dummy/config/optional-features.json | 5 +- yarn.lock | 231 ++++++++++++++++++++++ 4 files changed, 258 insertions(+), 10 deletions(-) diff --git a/config/ember-try.js b/config/ember-try.js index 17b11444c..cea80661e 100644 --- a/config/ember-try.js +++ b/config/ember-try.js @@ -33,6 +33,9 @@ module.exports = async function () { 'ember-auto-import': '^2.2.4', 'webpack': '^5.64.4' }, + ember: { + edition: 'octane', + }, }, }, { @@ -45,6 +48,9 @@ module.exports = async function () { 'ember-auto-import': '^2.2.4', 'webpack': '^5.64.4' }, + ember: { + edition: 'octane', + }, }, }, { @@ -57,6 +63,9 @@ module.exports = async function () { 'ember-auto-import': '^2.2.4', 'webpack': '^5.64.4' }, + ember: { + edition: 'octane', + }, }, }, { diff --git a/package.json b/package.json index 333c76062..c49798763 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,8 @@ "@ember/jquery": "^1.1.0", "@ember/optional-features": "^2.0.0", "@ember/test-helpers": "^2.6.0", + "@glimmer/component": "^1.0.4", + "@glimmer/tracking": "^1.0.4", "babel-eslint": "^10.0.3", "broccoli-asset-rev": "^3.0.0", "ember-ajax": "^5.0.0", @@ -106,15 +108,6 @@ "engines": { "node": ">= 10.*" }, - "ember-addon": { - "configPath": "tests/dummy/config", - "before": [ - "ember-cli-babel" - ], - "after": [ - "ember-qunit" - ] - }, "changelog": { "labels": { "Breaking": "💥 Breaking Change", @@ -123,5 +116,17 @@ "documentation": "📠Documentation", "internal": "🠠Internal" } + }, + "ember": { + "edition": "classic" + }, + "ember-addon": { + "configPath": "tests/dummy/config", + "before": [ + "ember-cli-babel" + ], + "after": [ + "ember-qunit" + ] } } diff --git a/tests/dummy/config/optional-features.json b/tests/dummy/config/optional-features.json index 21f1dc719..b26286e2e 100644 --- a/tests/dummy/config/optional-features.json +++ b/tests/dummy/config/optional-features.json @@ -1,3 +1,6 @@ { - "jquery-integration": true + "application-template-wrapper": false, + "default-async-observers": true, + "jquery-integration": false, + "template-only-glimmer-components": true } diff --git a/yarn.lock b/yarn.lock index b192738d0..dccde80a4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -35,6 +35,13 @@ dependencies: "@babel/highlight" "^7.12.13" +"@babel/code-frame@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431" + integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA== + dependencies: + "@babel/highlight" "^7.16.0" + "@babel/compat-data@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.1.tgz#d7386a689aa0ddf06255005b4b991988021101a0" @@ -85,6 +92,15 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.0.tgz#d40f3d1d5075e62d3500bccb67f3daa8a95265b2" + integrity sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew== + dependencies: + "@babel/types" "^7.16.0" + jsesc "^2.5.1" + source-map "^0.5.0" + "@babel/helper-annotate-as-pure@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" @@ -92,6 +108,13 @@ dependencies: "@babel/types" "^7.10.4" +"@babel/helper-annotate-as-pure@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz#9a1f0ebcda53d9a2d00108c4ceace6a5d5f1f08d" + integrity sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg== + dependencies: + "@babel/types" "^7.16.0" + "@babel/helper-annotate-as-pure@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" @@ -139,6 +162,18 @@ "@babel/helper-replace-supers" "^7.13.0" "@babel/helper-split-export-declaration" "^7.12.13" +"@babel/helper-create-class-features-plugin@^7.5.5": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz#090d4d166b342a03a9fec37ef4fd5aeb9c7c6a4b" + integrity sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-member-expression-to-functions" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/helper-create-class-features-plugin@^7.8.3": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz#243a5b46e2f8f0f674dc1387631eb6b28b851de0" @@ -218,6 +253,15 @@ "@babel/template" "^7.12.13" "@babel/types" "^7.12.13" +"@babel/helper-function-name@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz#b7dd0797d00bbfee4f07e9c4ea5b0e30c8bb1481" + integrity sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog== + dependencies: + "@babel/helper-get-function-arity" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/types" "^7.16.0" + "@babel/helper-function-name@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" @@ -241,6 +285,13 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-get-function-arity@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz#0088c7486b29a9cb5d948b1a1de46db66e089cfa" + integrity sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ== + dependencies: + "@babel/types" "^7.16.0" + "@babel/helper-get-function-arity@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" @@ -255,6 +306,13 @@ dependencies: "@babel/types" "^7.10.4" +"@babel/helper-hoist-variables@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz#4c9023c2f1def7e28ff46fc1dbcd36a39beaa81a" + integrity sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg== + dependencies: + "@babel/types" "^7.16.0" + "@babel/helper-member-expression-to-functions@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz#fba0f2fcff3fba00e6ecb664bb5e6e26e2d6165c" @@ -269,6 +327,13 @@ dependencies: "@babel/types" "^7.13.0" +"@babel/helper-member-expression-to-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz#29287040efd197c77636ef75188e81da8bccd5a4" + integrity sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ== + dependencies: + "@babel/types" "^7.16.0" + "@babel/helper-member-expression-to-functions@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" @@ -327,6 +392,13 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-optimise-call-expression@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz#cecdb145d70c54096b1564f8e9f10cd7d193b338" + integrity sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw== + dependencies: + "@babel/types" "^7.16.0" + "@babel/helper-optimise-call-expression@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" @@ -392,6 +464,16 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.0" +"@babel/helper-replace-supers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz#73055e8d3cf9bcba8ddb55cad93fedc860f68f17" + integrity sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + "@babel/helper-replace-supers@^7.8.6": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" @@ -437,6 +519,13 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-split-export-declaration@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438" + integrity sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw== + dependencies: + "@babel/types" "^7.16.0" + "@babel/helper-split-export-declaration@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" @@ -454,6 +543,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== +"@babel/helper-validator-identifier@^7.15.7": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== + "@babel/helper-validator-identifier@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" @@ -506,6 +600,15 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" + integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g== + dependencies: + "@babel/helper-validator-identifier" "^7.15.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/highlight@^7.8.3": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" @@ -535,6 +638,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.7.tgz#fee7b39fe809d0e73e5b25eecaf5780ef3d73056" integrity sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg== +"@babel/parser@^7.16.0", "@babel/parser@^7.16.3": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.4.tgz#d5f92f57cf2c74ffe9b37981c0e72fee7311372e" + integrity sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng== + "@babel/parser@^7.4.5", "@babel/parser@^7.7.0", "@babel/parser@^7.8.6": version "7.9.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" @@ -1064,6 +1172,15 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-typescript" "^7.2.0" +"@babel/plugin-transform-typescript@~7.5.0": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.5.5.tgz#6d862766f09b2da1cb1f7d505fe2aedab6b7d4b8" + integrity sha512-pehKf4m640myZu5B2ZviLaiBlxMCjSZ1qTEO459AXKX5GnPueyulJeCqZFs1nz/Ya2dDzXQ1NxZ/kKNWyD4h6w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.5.5" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-typescript" "^7.2.0" + "@babel/plugin-transform-typescript@~7.8.0": version "7.8.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.7.tgz#48bccff331108a7b3a28c3a4adc89e036dc3efda" @@ -1213,6 +1330,15 @@ "@babel/parser" "^7.12.7" "@babel/types" "^7.12.7" +"@babel/template@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.0.tgz#d16a35ebf4cd74e202083356fab21dd89363ddd6" + integrity sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/types" "^7.16.0" + "@babel/template@^7.8.3": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" @@ -1237,6 +1363,21 @@ globals "^11.1.0" lodash "^4.17.19" +"@babel/traverse@^7.16.0": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.3.tgz#f63e8a938cc1b780f66d9ed3c54f532ca2d14787" + integrity sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/generator" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-hoist-variables" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/parser" "^7.16.3" + "@babel/types" "^7.16.0" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.1.6", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.13.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.7.2", "@babel/types@^7.8.3", "@babel/types@^7.8.6": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.0.tgz#74424d2816f0171b4100f0ab34e9a374efdf7f80" @@ -1246,6 +1387,14 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" +"@babel/types@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba" + integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg== + dependencies: + "@babel/helper-validator-identifier" "^7.15.7" + to-fast-properties "^2.0.0" + "@ember-data/-build-infra@3.14.0": version "3.14.0" resolved "https://registry.yarnpkg.com/@ember-data/-build-infra/-/-build-infra-3.14.0.tgz#d81242b018038b0bf39bceaa1b0df167398f60b8" @@ -1618,6 +1767,31 @@ postcss "7.0.32" purgecss "^2.3.0" +"@glimmer/component@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@glimmer/component/-/component-1.0.4.tgz#1c85a5181615a6647f6acfaaed68e28ad7e9626e" + integrity sha512-sS4N8wtcKfYdUJ6O3m8nbTut6NjErdz94Ap8VB1ekcg4WSD+7sI7Nmv6kt2rdPoe363nUdjUbRBzHNWhLzraBw== + dependencies: + "@glimmer/di" "^0.1.9" + "@glimmer/env" "^0.1.7" + "@glimmer/util" "^0.44.0" + broccoli-file-creator "^2.1.1" + broccoli-merge-trees "^3.0.2" + ember-cli-babel "^7.7.3" + ember-cli-get-component-path-option "^1.0.0" + ember-cli-is-package-missing "^1.0.0" + ember-cli-normalize-entity-name "^1.0.0" + ember-cli-path-utils "^1.0.0" + ember-cli-string-utils "^1.1.0" + ember-cli-typescript "3.0.0" + ember-cli-version-checker "^3.1.3" + ember-compatibility-helpers "^1.1.2" + +"@glimmer/di@^0.1.9": + version "0.1.11" + resolved "https://registry.yarnpkg.com/@glimmer/di/-/di-0.1.11.tgz#a6878c07a13a2c2c76fcde598a5c97637bfc4280" + integrity sha1-poeMB6E6LCx2/N5ZilyXY3v8QoA= + "@glimmer/encoder@^0.42.2": version "0.42.2" resolved "https://registry.yarnpkg.com/@glimmer/encoder/-/encoder-0.42.2.tgz#d3ba3dc9f1d4fa582d1d18b63da100fc5c664057" @@ -1732,6 +1906,14 @@ "@handlebars/parser" "^1.1.0" simple-html-tokenizer "^0.5.10" +"@glimmer/tracking@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@glimmer/tracking/-/tracking-1.0.4.tgz#f1bc1412fe5e2236d0f8d502994a8f88af1bbb21" + integrity sha512-F+oT8I55ba2puSGIzInmVrv/8QA2PcK1VD+GWgFMhF6WC97D+uZX7BFg+a3s/2N4FVBq5KHE+QxZzgazM151Yw== + dependencies: + "@glimmer/env" "^0.1.7" + "@glimmer/validator" "^0.44.0" + "@glimmer/util@0.65.4": version "0.65.4" resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.65.4.tgz#e464145078f3f40da9013ff2590a6016515455d2" @@ -1746,6 +1928,11 @@ resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.42.2.tgz#9ca1631e42766ea6059f4b49d0bdfb6095aad2c4" integrity sha512-Heck0baFSaWDanCYtmOcLeaz7v+rSqI8ovS7twrp2/FWEteb3Ze5sWQ2BEuSAG23L/k/lzVwYM/MY7ZugxBpaA== +"@glimmer/util@^0.44.0": + version "0.44.0" + resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.44.0.tgz#45df98d73812440206ae7bda87cfe04aaae21ed9" + integrity sha512-duAsm30uVK9jSysElCbLyU6QQYO2X9iLDLBIBUcCqck9qN1o3tK2qWiHbGK5d6g8E2AJ4H88UrfElkyaJlGrwg== + "@glimmer/util@^0.61.2": version "0.61.2" resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.61.2.tgz#c1d7ccfdd38f97c828e218c6d8e237c0c96ff724" @@ -1763,6 +1950,11 @@ "@glimmer/env" "^0.1.7" "@glimmer/global-context" "0.65.4" +"@glimmer/validator@^0.44.0": + version "0.44.0" + resolved "https://registry.yarnpkg.com/@glimmer/validator/-/validator-0.44.0.tgz#03d127097dc9cb23052cdb7fcae59d0a9dca53e1" + integrity sha512-i01plR0EgFVz69GDrEuFgq1NheIjZcyTy3c7q+w7d096ddPVeVcRzU3LKaqCfovvLJ+6lJx40j45ecycASUUyw== + "@glimmer/vm-babel-plugins@0.77.5": version "0.77.5" resolved "https://registry.yarnpkg.com/@glimmer/vm-babel-plugins/-/vm-babel-plugins-0.77.5.tgz#daffb6507aa6b08ec36f69d652897d339fdd0007" @@ -7034,6 +7226,23 @@ ember-cli-test-loader@^3.0.0: dependencies: ember-cli-babel "^7.13.2" +ember-cli-typescript@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-3.0.0.tgz#3b838d1ce9e4d22a98e68da22ceac6dc0cfd9bfc" + integrity sha512-lo5YArbJzJi5ssvaGqTt6+FnhTALnSvYVuxM7lfyL1UCMudyNJ94ovH5C7n5il7ATd6WsNiAPRUO/v+s5Jq/aA== + dependencies: + "@babel/plugin-transform-typescript" "~7.5.0" + ansi-to-html "^0.6.6" + debug "^4.0.0" + ember-cli-babel-plugin-helpers "^1.0.0" + execa "^2.0.0" + fs-extra "^8.0.0" + resolve "^1.5.0" + rsvp "^4.8.1" + semver "^6.0.0" + stagehand "^1.0.0" + walk-sync "^2.0.0" + ember-cli-typescript@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-2.0.2.tgz#464984131fbdc05655eb61d1c3cdd911d3137f0d" @@ -8260,6 +8469,21 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-2.1.0.tgz#e5d3ecd837d2a60ec50f3da78fd39767747bbe99" + integrity sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^3.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + execa@^3.0.0: version "3.4.0" resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" @@ -12099,6 +12323,13 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" +npm-run-path@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-3.1.0.tgz#7f91be317f6a466efed3c9f2980ad8a4ee8b0fa5" + integrity sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg== + dependencies: + path-key "^3.0.0" + npm-run-path@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" From 939f809704460bc977b841305c4ed400564cc68a Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Sat, 11 Dec 2021 19:34:59 -0500 Subject: [PATCH 837/879] Introduce volta --- package.json | 4 ++++ test-projects/01-basic-app/package.json | 3 +++ test-projects/02-app-that-excludes-mirage/package.json | 3 +++ 3 files changed, 10 insertions(+) diff --git a/package.json b/package.json index c49798763..e13298382 100644 --- a/package.json +++ b/package.json @@ -128,5 +128,9 @@ "after": [ "ember-qunit" ] + }, + "volta": { + "node": "12.22.7", + "yarn": "1.22.17" } } diff --git a/test-projects/01-basic-app/package.json b/test-projects/01-basic-app/package.json index 72701e1e5..7f489f18d 100644 --- a/test-projects/01-basic-app/package.json +++ b/test-projects/01-basic-app/package.json @@ -50,5 +50,8 @@ }, "engines": { "node": ">= 8.*" + }, + "volta": { + "extends": "../../package.json" } } diff --git a/test-projects/02-app-that-excludes-mirage/package.json b/test-projects/02-app-that-excludes-mirage/package.json index 1e08d0901..e1a90d605 100644 --- a/test-projects/02-app-that-excludes-mirage/package.json +++ b/test-projects/02-app-that-excludes-mirage/package.json @@ -48,5 +48,8 @@ }, "engines": { "node": ">= 8.*" + }, + "volta": { + "extends": "../../package.json" } } From 12c5a2f4048617756d2bb45802ab99679ac53195 Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Sat, 11 Dec 2021 19:34:40 -0500 Subject: [PATCH 838/879] Bump ember-cli-addon-docs to 3.0.0 --- package.json | 2 +- yarn.lock | 1001 +++++++++++++++++++++++++++++++++----------------- 2 files changed, 667 insertions(+), 336 deletions(-) diff --git a/package.json b/package.json index e13298382..77bab22be 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "broccoli-asset-rev": "^3.0.0", "ember-ajax": "^5.0.0", "ember-cli": "~3.4.4", - "ember-cli-addon-docs": "^0.10.0", + "ember-cli-addon-docs": "^3.0.0", "ember-cli-addon-docs-esdoc": "^0.2.3", "ember-cli-dependency-checker": "^3.0.0", "ember-cli-deploy": "^1.0.2", diff --git a/yarn.lock b/yarn.lock index dccde80a4..550942b7c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -52,6 +52,11 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.11.tgz#9c8fe523c206979c9a81b1e12fe50c1254f1aa35" integrity sha512-BwKEkO+2a67DcFeS3RLl0Z3Gs2OvdXewuWjc1Hfokhb5eQWP9YRYH1/+VrVZvql2CfjOiNGqSAFOYt4lsqTHzg== +"@babel/compat-data@^7.16.0": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.4.tgz#081d6bbc336ec5c2435c6346b2ae1fb98b5ac68e" + integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q== + "@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.3.4": version "7.12.9" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" @@ -74,6 +79,27 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/core@^7.13.10": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.0.tgz#c4ff44046f5fe310525cc9eb4ef5147f0c5374d4" + integrity sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/generator" "^7.16.0" + "@babel/helper-compilation-targets" "^7.16.0" + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helpers" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + "@babel/generator@^7.12.5": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.5.tgz#a2c50de5c8b6d708ab95be5e6053936c1884a4de" @@ -140,6 +166,16 @@ browserslist "^4.14.5" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.16.0": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz#5b480cd13f68363df6ec4dc8ac8e2da11363cbf0" + integrity sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA== + dependencies: + "@babel/compat-data" "^7.16.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.17.5" + semver "^6.3.0" + "@babel/helper-create-class-features-plugin@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz#3c45998f431edd4a9214c5f1d3ad1448a6137f6e" @@ -348,6 +384,13 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-module-imports@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3" + integrity sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg== + dependencies: + "@babel/types" "^7.16.0" + "@babel/helper-module-transforms@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" @@ -378,6 +421,20 @@ "@babel/types" "^7.13.0" lodash "^4.17.19" +"@babel/helper-module-transforms@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz#1c82a8dd4cb34577502ebd2909699b194c3e9bb5" + integrity sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA== + dependencies: + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-simple-access" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/helper-validator-identifier" "^7.15.7" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + "@babel/helper-optimise-call-expression@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" @@ -498,6 +555,13 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-simple-access@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz#21d6a27620e383e37534cf6c10bba019a6f90517" + integrity sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw== + dependencies: + "@babel/types" "^7.16.0" + "@babel/helper-skip-transparent-expression-wrappers@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" @@ -563,6 +627,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + "@babel/helper-wrap-function@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87" @@ -582,6 +651,15 @@ "@babel/traverse" "^7.12.5" "@babel/types" "^7.12.5" +"@babel/helpers@^7.16.0": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.3.tgz#27fc64f40b996e7074dc73128c3e5c3e7f55c43c" + integrity sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w== + dependencies: + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.3" + "@babel/types" "^7.16.0" + "@babel/highlight@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" @@ -730,7 +808,7 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.3.1": +"@babel/plugin-proposal-object-rest-spread@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== @@ -1363,7 +1441,7 @@ globals "^11.1.0" lodash "^4.17.19" -"@babel/traverse@^7.16.0": +"@babel/traverse@^7.16.0", "@babel/traverse@^7.16.3": version "7.16.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.3.tgz#f63e8a938cc1b780f66d9ed3c54f532ca2d14787" integrity sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag== @@ -1395,6 +1473,21 @@ "@babel/helper-validator-identifier" "^7.15.7" to-fast-properties "^2.0.0" +"@csstools/postcss-sass@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-sass/-/postcss-sass-4.0.0.tgz#6617c5096a6b71751ee0b87d2326418b9d97effb" + integrity sha512-yvm2aaODNJ8PBn43HjYiRvVJcYLEpz5BEKXxQ/7HryqcL+TnAceXZO+khadTEkjw90r8afR5wykTzvVpFeo4vw== + dependencies: + "@csstools/sass-import-resolve" "^1.0.0" + postcss "^7.0.14" + sass "^1.16.1" + source-map "~0.7.3" + +"@csstools/sass-import-resolve@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/sass-import-resolve/-/sass-import-resolve-1.0.0.tgz#32c3cdb2f7af3cd8f0dca357b592e7271f3831b5" + integrity sha512-pH4KCsbtBLLe7eqUrw8brcuFO8IZlN36JjdKlOublibVdAIPHCzEnpBWOVUXK5sCf+DpBi8ZtuWtjF0srybdeA== + "@ember-data/-build-infra@3.14.0": version "3.14.0" resolved "https://registry.yarnpkg.com/@ember-data/-build-infra/-/-build-infra-3.14.0.tgz#d81242b018038b0bf39bceaa1b0df167398f60b8" @@ -1578,6 +1671,29 @@ ember-cli-typescript "^3.0.0" heimdalljs "^0.3.0" +"@ember-decorators/component@^6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@ember-decorators/component/-/component-6.1.1.tgz#b360dc4fa8e576ee1c840879399ef1745fd96e06" + integrity sha512-Cj8tY/c0MC/rsipqsiWLh3YVN72DK92edPYamD/HzvftwzC6oDwawWk8RmStiBnG9PG/vntAt41l3S7HSSA+1Q== + dependencies: + "@ember-decorators/utils" "^6.1.1" + ember-cli-babel "^7.1.3" + +"@ember-decorators/object@^6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@ember-decorators/object/-/object-6.1.1.tgz#50c922f5ac9af3ddd381cb6a43a031dfd9a70c7a" + integrity sha512-cb4CNR9sRoA31J3FCOFLDuR9ztM4wO9w1WlS4JeNRS7Z69SlB/XSXB/vplA3i9OOaXEy/zKWbu5ndZrHz0gvLw== + dependencies: + "@ember-decorators/utils" "^6.1.1" + ember-cli-babel "^7.1.3" + +"@ember-decorators/utils@^6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@ember-decorators/utils/-/utils-6.1.1.tgz#6b619814942b4fb3747cfa9f540c9f05283d7c5e" + integrity sha512-0KqnoeoLKb6AyoSU65TRF5T85wmS4uDn06oARddwNPxxf/lt5jQlh41uX3W7V/fWL9tPu8x1L1Vvpc80MN1+YA== + dependencies: + ember-cli-babel "^7.1.3" + "@ember-template-lint/todo-utils@^10.0.0": version "10.0.0" resolved "https://registry.yarnpkg.com/@ember-template-lint/todo-utils/-/todo-utils-10.0.0.tgz#085aafcf31ca04ba4d3a9460f088aed752b90ea8" @@ -1645,16 +1761,6 @@ ember-cli-htmlbars "^5.7.1" ember-destroyable-polyfill "^2.0.3" -"@ember/test-waiters@^2.3.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ember/test-waiters/-/test-waiters-2.3.0.tgz#0da40153092ca064007888e63f6f5819efd38a63" - integrity sha512-cezrBqy1BbQbjm09EqU/mXJOdWRP4zdhPBAnpW1myAsmscAM0QQDMauNrZLWcrND0a0WfottxS+rvvddhWtfdQ== - dependencies: - ember-cli-babel "^7.21.0" - ember-cli-typescript "^3.1.4" - ember-cli-version-checker "^5.1.1" - semver "^7.1.3" - "@ember/test-waiters@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@ember/test-waiters/-/test-waiters-3.0.0.tgz#b66a35cd5b78ec3c296a6f5f5fb3852780a5d3c8" @@ -1665,6 +1771,41 @@ ember-cli-version-checker "^5.1.2" semver "^7.3.5" +"@embroider/core@0.29.0": + version "0.29.0" + resolved "https://registry.yarnpkg.com/@embroider/core/-/core-0.29.0.tgz#51421fbb2bcee607dc6e162400e3502a121230d2" + integrity sha512-2i0QtV1y1jJpj1aiIA3FVZHfuLBN2yCUcJs0PkOsqZYi7J796KT4t7WwAk8gmBq00yGzHDWLw/iH4ULTomPS8A== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.12.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + "@embroider/macros" "0.29.0" + assert-never "^1.1.0" + babel-plugin-syntax-dynamic-import "^6.18.0" + broccoli-persistent-filter "^2.2.2" + broccoli-plugin "^3.0.0" + broccoli-source "^1.1.0" + debug "^3.1.0" + fast-sourcemap-concat "^1.4.0" + filesize "^4.1.2" + fs-extra "^7.0.1" + fs-tree-diff "^2.0.0" + handlebars "^4.4.2" + js-string-escape "^1.0.1" + jsdom "^16.4.0" + json-stable-stringify "^1.0.1" + lodash "^4.17.10" + pkg-up "^2.0.0" + resolve "^1.8.1" + resolve-package-path "^1.2.2" + semver "^7.3.2" + strip-bom "^3.0.0" + typescript-memoize "^1.0.0-alpha.3" + walk-sync "^1.1.3" + wrap-legacy-hbs-plugin-if-needed "^1.0.1" + "@embroider/core@0.33.0", "@embroider/core@^0.33.0": version "0.33.0" resolved "https://registry.yarnpkg.com/@embroider/core/-/core-0.33.0.tgz#0fb1752d6e34ea45368e65c42e13220a57ffae76" @@ -1704,6 +1845,21 @@ walk-sync "^1.1.3" wrap-legacy-hbs-plugin-if-needed "^1.0.1" +"@embroider/macros@0.29.0", "@embroider/macros@^0.29.0": + version "0.29.0" + resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.29.0.tgz#33048069b0abdda17efc7ff438b18b0c2c237bff" + integrity sha512-Kg8we7U7TpgUZ0EBKlTC4UGItPa91OrGT5Bzxa2cJi/pPp1z8Amgd7Y+m29N+aLBZwlv+OxlhnOCm0Fhjw/dag== + dependencies: + "@babel/core" "^7.12.3" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + "@embroider/core" "0.29.0" + assert-never "^1.1.0" + ember-cli-babel "^7.23.0" + lodash "^4.17.10" + resolve "^1.8.1" + semver "^7.3.2" + "@embroider/macros@0.33.0": version "0.33.0" resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.33.0.tgz#d5826ea7565bb69b57ba81ed528315fe77acbf9d" @@ -1819,18 +1975,18 @@ dependencies: "@simple-dom/interface" "^1.4.0" +"@glimmer/interfaces@0.79.4": + version "0.79.4" + resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.79.4.tgz#3213e7fe73f35340762bef7f4e8c8df593a4a8c8" + integrity sha512-cyNZlRa7aXAfXY9kk7hhnWgL1R7Zw8wwi2UVEWq2nBanmpNmL1lSMJ6nY8oRIWCtWrYA9CeH7RZ6mVP5cQ/v2w== + dependencies: + "@simple-dom/interface" "^1.4.0" + "@glimmer/interfaces@^0.42.2": version "0.42.2" resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.42.2.tgz#9cf8d6f8f5eee6bfcfa36919ca68ae716e1f78db" integrity sha512-7LOuQd02cxxNNHChzdHMAU8/qOeQvTro141CU5tXITP7z6aOv2D2gkFdau97lLQiVxezGrh8J7h8GCuF7TEqtg== -"@glimmer/interfaces@^0.61.2": - version "0.61.2" - resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.61.2.tgz#c8760d9aab6469d4a3bde923f129fb86a3b70262" - integrity sha512-i4qTGFKXWD1Bjr3V6HVxTRWj8DzAhXQ0W0pvsymDRY/r386crH11sTclp8ZFyEiybA8JBlsUvadX8lUD7Oc0TA== - dependencies: - "@simple-dom/interface" "^1.4.0" - "@glimmer/low-level@^0.42.2": version "0.42.2" resolved "https://registry.yarnpkg.com/@glimmer/low-level/-/low-level-0.42.2.tgz#52c745414d1d04c4245c369bd132c0e786c816ef" @@ -1886,16 +2042,6 @@ handlebars "^4.0.13" simple-html-tokenizer "^0.5.8" -"@glimmer/syntax@^0.61.2": - version "0.61.2" - resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.61.2.tgz#a8c381872354ebf441e23cfd6fd27caacdb5356b" - integrity sha512-YiXP/saSy/JWVf6AiSWWZemCnYn6z9b4mAifqdba2D/3wrH5TScEiS01mDLlGi2HNhCXffcWf9aOAkEUbnOtFw== - dependencies: - "@glimmer/interfaces" "^0.61.2" - "@glimmer/util" "^0.61.2" - handlebars "^4.7.4" - simple-html-tokenizer "^0.5.9" - "@glimmer/syntax@^0.65.0": version "0.65.4" resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.65.4.tgz#49164de5dc9e8b67084ec009bdd865e379d8a971" @@ -1906,6 +2052,16 @@ "@handlebars/parser" "^1.1.0" simple-html-tokenizer "^0.5.10" +"@glimmer/syntax@^0.79.3": + version "0.79.4" + resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.79.4.tgz#5aa21d4b3918238c24da3d640abc3b66150fc0c6" + integrity sha512-NiMIoW2G0+sBfLYnvDaZ8o8Ul/3P/ezOT8U7ZvsHDGU5hXM2buFozyoSKLILTvAQ56izdfK9fKCsn0oi4ISx3w== + dependencies: + "@glimmer/interfaces" "0.79.4" + "@glimmer/util" "0.79.4" + "@handlebars/parser" "~2.0.0" + simple-html-tokenizer "^0.5.10" + "@glimmer/tracking@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@glimmer/tracking/-/tracking-1.0.4.tgz#f1bc1412fe5e2236d0f8d502994a8f88af1bbb21" @@ -1923,6 +2079,15 @@ "@glimmer/interfaces" "0.65.4" "@simple-dom/interface" "^1.4.0" +"@glimmer/util@0.79.4": + version "0.79.4" + resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.79.4.tgz#4762ed9b231482470cb9763332097d50042f9bde" + integrity sha512-n2lEGzM9khM43HmKlig2lG5L5cHoL4tFzW21CZzmhMfc1IDCqHuP7s7924OsXSbLT1WB7B9sm/ZhnEj2nd+GiQ== + dependencies: + "@glimmer/env" "0.1.7" + "@glimmer/interfaces" "0.79.4" + "@simple-dom/interface" "^1.4.0" + "@glimmer/util@^0.42.2": version "0.42.2" resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.42.2.tgz#9ca1631e42766ea6059f4b49d0bdfb6095aad2c4" @@ -1933,15 +2098,6 @@ resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.44.0.tgz#45df98d73812440206ae7bda87cfe04aaae21ed9" integrity sha512-duAsm30uVK9jSysElCbLyU6QQYO2X9iLDLBIBUcCqck9qN1o3tK2qWiHbGK5d6g8E2AJ4H88UrfElkyaJlGrwg== -"@glimmer/util@^0.61.2": - version "0.61.2" - resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.61.2.tgz#c1d7ccfdd38f97c828e218c6d8e237c0c96ff724" - integrity sha512-xel7wbNldpHzDOmC4GJ1je4UnSmehy5MGzPp/rEON9OcSggCrl2v8cEP413TMfyRGDQJ5Houkr0R4zpvs8aqOg== - dependencies: - "@glimmer/env" "0.1.7" - "@glimmer/interfaces" "^0.61.2" - "@simple-dom/interface" "^1.4.0" - "@glimmer/validator@0.65.4", "@glimmer/validator@^0.65.0": version "0.65.4" resolved "https://registry.yarnpkg.com/@glimmer/validator/-/validator-0.65.4.tgz#12c27a9a63706c60e6499fd687940e9d1affb32c" @@ -1983,6 +2139,11 @@ resolved "https://registry.yarnpkg.com/@handlebars/parser/-/parser-1.1.0.tgz#d6dbc7574774b238114582410e8fee0dc3532bdf" integrity sha512-rR7tJoSwJ2eooOpYGxGGW95sLq6GXUaS1UtWvN7pei6n2/okYvCGld9vsUTvkl2migxbkszsycwtMf/GEc1k1A== +"@handlebars/parser@~2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@handlebars/parser/-/parser-2.0.0.tgz#5e8b7298f31ff8f7b260e6b7363c7e9ceed7d9c5" + integrity sha512-EP9uEDZv/L5Qh9IWuMUGJRfwhXJ4h1dqKTT4/3+tY0eu7sPis7xh23j61SYUnNF4vqCQvvUXpDo9Bh/+q1zASA== + "@humanwhocodes/config-array@^0.5.0": version "0.5.0" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" @@ -2958,6 +3119,13 @@ ansi-styles@^4.1.0: "@types/color-name" "^1.1.1" color-convert "^2.0.1" +ansi-to-html@^0.6.15: + version "0.6.15" + resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.15.tgz#ac6ad4798a00f6aa045535d7f6a9cb9294eebea7" + integrity sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ== + dependencies: + entities "^2.0.0" + ansi-to-html@^0.6.6: version "0.6.14" resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.14.tgz#65fe6d08bba5dd9db33f44a20aec331e0010dad8" @@ -2996,6 +3164,14 @@ anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -4438,26 +4614,6 @@ broccoli-funnel@2.0.1: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-funnel@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-1.2.0.tgz#cddc3afc5ff1685a8023488fff74ce6fb5a51296" - integrity sha1-zdw6/F/xaFqAI0iP/3TOb7WlEpY= - dependencies: - array-equal "^1.0.0" - blank-object "^1.0.1" - broccoli-plugin "^1.3.0" - debug "^2.2.0" - exists-sync "0.0.4" - fast-ordered-set "^1.0.0" - fs-tree-diff "^0.5.3" - heimdalljs "^0.2.0" - minimatch "^3.0.0" - mkdirp "^0.5.0" - path-posix "^1.0.0" - rimraf "^2.4.3" - symlink-or-copy "^1.0.0" - walk-sync "^0.3.1" - broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1, broccoli-funnel@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-2.0.2.tgz#0edf629569bc10bd02cc525f74b9a38e71366a75" @@ -4493,7 +4649,7 @@ broccoli-funnel@^3.0.0, broccoli-funnel@^3.0.3: path-posix "^1.0.0" walk-sync "^2.0.2" -broccoli-funnel@^3.0.8: +broccoli-funnel@^3.0.6, broccoli-funnel@^3.0.8: version "3.0.8" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.8.tgz#f5b62e2763c3918026a15a3c833edc889971279b" integrity sha512-ng4eIhPYiXqMw6SyGoxPHR3YAwEd2lr9FgBI1CyTbspl4txZovOsmzFkMkGAlu88xyvYXJqHiM2crfLa65T1BQ== @@ -4648,7 +4804,7 @@ broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-p symlink-or-copy "^1.0.1" walk-sync "^0.3.1" -broccoli-persistent-filter@^2.1.0, broccoli-persistent-filter@^2.1.1, broccoli-persistent-filter@^2.2.1, broccoli-persistent-filter@^2.3.0, broccoli-persistent-filter@^2.3.1: +broccoli-persistent-filter@^2.1.1, broccoli-persistent-filter@^2.2.1, broccoli-persistent-filter@^2.2.2, broccoli-persistent-filter@^2.3.0, broccoli-persistent-filter@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.3.1.tgz#4a052e0e0868b344c3a2977e35a3d497aa9eca72" integrity sha512-hVsmIgCDrl2NFM+3Gs4Cr2TA6UPaIZip99hN8mtkaUPgM8UeVnCbxelCvBjUBHo0oaaqP5jzqqnRVvb568Yu5g== @@ -4668,7 +4824,7 @@ broccoli-persistent-filter@^2.1.0, broccoli-persistent-filter@^2.1.1, broccoli-p sync-disk-cache "^1.3.3" walk-sync "^1.0.0" -broccoli-persistent-filter@^3.0.0, broccoli-persistent-filter@^3.1.0, broccoli-persistent-filter@^3.1.2: +broccoli-persistent-filter@^3.0.0, broccoli-persistent-filter@^3.1.0, broccoli-persistent-filter@^3.1.1, broccoli-persistent-filter@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-3.1.2.tgz#41da6b9577be09a170ecde185f2c5a6099f99c4e" integrity sha512-CbU95RXXVyy+eJV9XTiHUC7NnsY3EvdVrGzp3YgyvO2bzXZFE5/GzDp4X/VQqX+jsk4qyT1HvMOF0sD1DX68TQ== @@ -4728,7 +4884,7 @@ broccoli-plugin@^2.0.0, broccoli-plugin@^2.1.0: rimraf "^2.3.4" symlink-or-copy "^1.1.8" -broccoli-plugin@^3.1.0: +broccoli-plugin@^3.0.0, broccoli-plugin@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-3.1.0.tgz#54ba6dd90a42ec3db5624063292610e326b1e542" integrity sha512-7w7FP8WJYjLvb0eaw27LO678TGGaom++49O1VYIuzjhXjK5kn2+AMlDm7CaUFw4F7CLGoVQeZ84d8gICMJa4lA== @@ -4754,28 +4910,28 @@ broccoli-plugin@^4.0.7: rimraf "^3.0.2" symlink-or-copy "^1.3.1" -broccoli-postcss-single@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/broccoli-postcss-single/-/broccoli-postcss-single-4.0.1.tgz#21f1494826058c974fd746bba7d10976d9cce26d" - integrity sha512-WfIKXqkTNyA0OJuJKoUJ2TxerRvtkiwYEK8KY5gHGr/GGqPHYWVnAUN5/O8/LWBNhgr9M94KstpXe+GqXyEflA== +broccoli-postcss-single@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/broccoli-postcss-single/-/broccoli-postcss-single-5.0.0.tgz#adcd2b92f59504bbb9b5da1f9aa6a1c7afa4d9d5" + integrity sha512-u8o00CadIDnwQkE4tGqxwK5rXgWVTeB8xh1yDk0ZLy2JNMfI5EhbHr+A1HZpfe40Xy5IBmQ7VlbU9aIrCP2R8Q== dependencies: broccoli-caching-writer "^3.0.3" include-path-searcher "^0.1.0" minimist ">=1.2.5" mkdirp "^1.0.3" object-assign "^4.1.1" - postcss "^7.0.0" + postcss "^8.1.4" -broccoli-postcss@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/broccoli-postcss/-/broccoli-postcss-5.1.0.tgz#5b660fa72ba921b01574b4ab10449b20890bba0a" - integrity sha512-f5cHP5g7EFidu9w88WOLTtbk4dd/W7amK0nek08FkmUII2h4W/Je4EV26HtMEm9nb1hKI301wwuEQ5AQRsVYog== +broccoli-postcss@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/broccoli-postcss/-/broccoli-postcss-6.0.0.tgz#79337302398a3b8f19bcfc3691def46b3951fcf9" + integrity sha512-XldlgbRag80S5MTkA63PpCzTrjiEh3P1wkuVT0e9HzLK9hgD7VQLucShGoy3a7O1PkCjr2g+1Awg8xJoSqgKCA== dependencies: broccoli-funnel "^3.0.0" - broccoli-persistent-filter "^2.1.0" + broccoli-persistent-filter "^3.1.1" minimist ">=1.2.5" object-assign "^4.1.1" - postcss "^7.0.5" + postcss "^8.1.4" broccoli-rollup@^2.1.1: version "2.1.1" @@ -4809,17 +4965,6 @@ broccoli-rollup@^4.1.1: symlink-or-copy "^1.2.0" walk-sync "^1.1.3" -broccoli-sass-source-maps@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/broccoli-sass-source-maps/-/broccoli-sass-source-maps-4.0.0.tgz#1ee4c10a810b10955b0502e28f85ab672f5961a2" - integrity sha512-Bjgg0Q626pPwiPU+Sk7jJNjblPEwhceuTzMPw2F5XY+FzdTBMYQKuJYlJ4x2DdsubE95e3rVQeSZ68jA13Nhzg== - dependencies: - broccoli-caching-writer "^3.0.3" - include-path-searcher "^0.1.0" - mkdirp "^0.3.5" - object-assign "^2.0.0" - rsvp "^3.0.6" - broccoli-slow-trees@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-3.0.1.tgz#9bf2a9e2f8eb3ed3a3f2abdde988da437ccdc9b4" @@ -5070,6 +5215,17 @@ browserslist@^4.14.5, browserslist@^4.16.3: escalade "^3.1.1" node-releases "^1.1.70" +browserslist@^4.17.5: + version "4.18.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.18.1.tgz#60d3920f25b6860eb917c6c7b185576f4d8b017f" + integrity sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ== + dependencies: + caniuse-lite "^1.0.30001280" + electron-to-chromium "^1.3.896" + escalade "^3.1.1" + node-releases "^2.0.1" + picocolors "^1.0.0" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -5300,6 +5456,11 @@ caniuse-lite@^1.0.30001181: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001202.tgz#4cb3bd5e8a808e8cd89e4e66c549989bc8137201" integrity sha512-ZcijQNqrcF8JNLjzvEiXqX4JUYxoZa7Pvcsd9UD8Kz4TvhTonOSNRsK+qtvpVL4l6+T1Rh4LFtLfnNWg6BGWCQ== +caniuse-lite@^1.0.30001280: + version "1.0.30001286" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001286.tgz#3e9debad420419618cfdf52dc9b6572b28a8fff6" + integrity sha512-zaEMRH6xg8ESMi2eQ3R4eZ5qw/hJiVsO/HlLwniIwErij0JDr9P+8V4dtx1l+kLq6j3yy8l8W4fst1lBnat5wQ== + capture-exit@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" @@ -5353,18 +5514,18 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== +"chalk@^3.0.0 || ^4.0.0", chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" @@ -5428,20 +5589,20 @@ cheerio@^1.0.0-rc.2: lodash "^4.15.0" parse5 "^3.0.1" -"chokidar@>=2.0.0 <4.0.0": - version "3.3.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" - integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== +"chokidar@>=3.0.0 <4.0.0": + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== dependencies: - anymatch "~3.1.1" + anymatch "~3.1.2" braces "~3.0.2" - glob-parent "~5.1.0" + glob-parent "~5.1.2" is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.3.0" + readdirp "~3.6.0" optionalDependencies: - fsevents "~2.1.2" + fsevents "~2.3.2" chokidar@^2.1.8: version "2.1.8" @@ -6079,7 +6240,7 @@ cross-spawn@^7.0.0: shebang-command "^2.0.0" which "^2.0.1" -cross-spawn@^7.0.2: +cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -6616,6 +6777,11 @@ electron-to-chromium@^1.3.649: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.691.tgz#a671eaf135a3ccec0915eb8d844a0952aba79f3b" integrity sha512-ZqiO69KImmOGCyoH0icQPU3SndJiW93juEvf63gQngyhODO6SpQIPMTOHldtCs5DS5GMKvAkquk230E2zt2vpw== +electron-to-chromium@^1.3.896: + version "1.4.16" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.16.tgz#38ddecc616385e6f101359d1b978c802664157d2" + integrity sha512-BQb7FgYwnu6haWLU63/CdVW+9xhmHls3RCQUFiV4lvw3wimEHTVcUk2hkuZo76QhR8nnDdfZE7evJIZqijwPdA== + elliptic@^6.0.0: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -6637,22 +6803,12 @@ ember-ajax@^5.0.0: ember-cli-babel "^7.5.0" najax "^1.0.3" -ember-angle-bracket-invocation-polyfill@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ember-angle-bracket-invocation-polyfill/-/ember-angle-bracket-invocation-polyfill-2.0.2.tgz#117ab5238305f11046a2eb3a5bc026c98d2cf5c1" - integrity sha512-HkG0xyTHtAhWVjU0Q5V/i4xe4FRvNIOaiUEgIvN815F3TIUboV/J0xhYgivm0uDZp9lAYUVF+U5PI1sCnlC3Og== - dependencies: - ember-cli-babel "^6.17.0" - ember-cli-version-checker "^2.1.2" - ember-compatibility-helpers "^1.0.2" - silent-error "^1.1.1" - -ember-app-scheduler@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/ember-app-scheduler/-/ember-app-scheduler-5.1.1.tgz#1dd0bd26d8b82b709b7ec760472059c65951e93d" - integrity sha512-exbZ6wDssBwK+tW4xlQhGzFMng11H0w8jX//E1rjosEXlAtX1X2G0wc1135kX4GJmp5Bp9Pa+HCkH5P2SKAViw== +"ember-app-scheduler@^5.1.2 || ^6.0.0 || ^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/ember-app-scheduler/-/ember-app-scheduler-7.0.0.tgz#029fe204ccfc86ccc3ff0447307fad4d1d40e2ab" + integrity sha512-5Wy/fWhsnSKT0xtL6EkFOuYMOc8T2lREmi7aRjXMeZCm5nDO7/mukezQ0ViVp9DQVlcbHyJz/qbBylnKq+CILw== dependencies: - "@ember/test-waiters" "^2.3.0" + "@ember/test-waiters" "^3.0.0" "@types/ember" "^3.1.0" "@types/rsvp" "^4.0.2" ember-cli-babel "^7.23.0" @@ -6660,7 +6816,7 @@ ember-app-scheduler@^5.0.1: ember-compatibility-helpers "^1.1.2" ember-destroyable-polyfill "^2.0.2" -ember-assign-polyfill@^2.5.0, ember-assign-polyfill@^2.6.0: +ember-assign-polyfill@^2.5.0: version "2.6.0" resolved "https://registry.yarnpkg.com/ember-assign-polyfill/-/ember-assign-polyfill-2.6.0.tgz#07847e3357ee35b33f886a0b5fbec6873f6860eb" integrity sha512-Y8NzOmHI/g4PuJ+xC14eTYiQbigNYddyHB8FY2kuQMxThTEIDE7SJtgttJrYYcPciOu0Tnb5ff36iO46LeiXkw== @@ -6668,7 +6824,7 @@ ember-assign-polyfill@^2.5.0, ember-assign-polyfill@^2.6.0: ember-cli-babel "^6.16.0" ember-cli-version-checker "^2.0.0" -ember-auto-import@^1.11.3: +ember-auto-import@^1.11.2, ember-auto-import@^1.11.3: version "1.12.0" resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.12.0.tgz#52246b04891090e2608244e65c4c6af7710df12b" integrity sha512-fzMGnyHGfUNFHchpLbJ98Vs/c5H2wZBMR9r/XwW+WOWPisZDGLUPPyhJQsSREPoUQ+o8GvyLaD/rkrKqW8bmgw== @@ -6703,7 +6859,7 @@ ember-auto-import@^1.11.3: walk-sync "^0.3.3" webpack "^4.43.0" -ember-auto-import@^1.2.19, ember-auto-import@^1.5.3, ember-auto-import@^1.6.0: +ember-auto-import@^1.2.19, ember-auto-import@^1.5.3: version "1.11.3" resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.11.3.tgz#6e3384a7fbb163384a34546f2e902cd297b0e683" integrity sha512-ekq/XCvsonESobFU30zjZ0I4XMy2E/2ZILCYWuQ1JdhcCSTYhnXDZcqRW8itUG7kbsPqAHT/XZ1LEZYm3seVwQ== @@ -6738,6 +6894,15 @@ ember-auto-import@^1.2.19, ember-auto-import@^1.5.3, ember-auto-import@^1.6.0: walk-sync "^0.3.3" webpack "^4.43.0" +ember-classic-decorator@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ember-classic-decorator/-/ember-classic-decorator-2.0.1.tgz#3ea29890959ff7ed0d0fa77bc49fca7142c586af" + integrity sha512-WQH0tY3vZ25fpcqt9xIPnIH3GzXylPFoLmauQFpNZLPtb6/jGuH8EzpFtAjhzakX+zSJb4/36iTaF5QA7aLxow== + dependencies: + "@embroider/macros" "^0.29.0" + babel-plugin-filter-imports "^3.0.0" + ember-cli-babel "^7.11.1" + ember-cli-addon-docs-esdoc@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/ember-cli-addon-docs-esdoc/-/ember-cli-addon-docs-esdoc-0.2.3.tgz#918d029b2041765d757d07161b0f4f94b7e0de94" @@ -6755,58 +6920,57 @@ ember-cli-addon-docs-esdoc@^0.2.3: tmp "^0.0.33" walk-sync "^0.3.2" -ember-cli-addon-docs@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-0.10.0.tgz#c813bc187f5c46737e6c75f9579cc1df0d1f4345" - integrity sha512-6sT/DWvMvcmTromVKka/UVwjPHLIPgNcH/UmFqgyaIqfkjz3JXjclSjun/RQEWhGtp8q7TJT8CYHhj7rn0Zm/Q== +ember-cli-addon-docs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs/-/ember-cli-addon-docs-3.0.0.tgz#569f943e91929f78d16c87bf93cf20f39512c89a" + integrity sha512-dw2JdyC9GmJ6tG6cwnAFC2w1kkMcej6VSLEKQ7Fk3L3JhBG3mZyax514DEIsj+Mt6ZAoTJNvxemZRgjyaRZedg== dependencies: - "@glimmer/syntax" "^0.61.2" + "@csstools/postcss-sass" "^4.0.0" + "@glimmer/syntax" "^0.79.3" broccoli-bridge "^1.0.0" broccoli-caching-writer "^3.0.3" broccoli-debug "^0.6.5" broccoli-filter "^1.3.0" - broccoli-funnel "^3.0.3" + broccoli-funnel "^3.0.6" broccoli-merge-trees "^4.2.0" broccoli-persistent-filter "^3.1.0" broccoli-plugin "1.5.1 - 5" broccoli-source "^3.0.0" broccoli-stew "^3.0.0" chalk "^4.1.0" - ember-angle-bracket-invocation-polyfill "^2.0.2" - ember-assign-polyfill "^2.6.0" - ember-auto-import "^1.6.0" + ember-auto-import "^1.11.2" + ember-classic-decorator "^2.0.0" ember-cli-autoprefixer "^1.0.2" - ember-cli-babel "^7.21.0" + ember-cli-babel "^7.26.3" ember-cli-clipboard "^0.15.0" - ember-cli-htmlbars "^5.2.0" - ember-cli-postcss "^6.0.1" - ember-cli-sass "10.0.1" - ember-cli-string-helpers "^5.0.0" + ember-cli-htmlbars "^5.7.1" + ember-cli-postcss "^7.0.0" + ember-cli-string-helpers "^6.1.0" ember-cli-string-utils "^1.1.0" - ember-cli-version-checker "^3.1.3" + ember-cli-version-checker "^5.1.0" ember-code-snippet "^3.0.0" - ember-composable-helpers "^4.2.2" - ember-concurrency "^0.9.0 || ^0.10.0 || ^1.0.0" + ember-composable-helpers "^4.4.1" + ember-concurrency "^2.0.0" + ember-decorators "^6.1.1" ember-fetch "^8.0.2" - ember-get-config "^0.2.4" + ember-get-config "^0.3.0" ember-href-to "^4.0.0" - ember-keyboard "^5.0.0" - ember-modal-dialog "^3.0.0-beta.4" - ember-named-arguments-polyfill "^1.0.0" + ember-keyboard "^6.0.3" + ember-modal-dialog "^4.0.0-alpha.0" ember-on-modifier "^1.0.0" ember-responsive "^4.0.0" ember-router-generator "^2.0.0" - ember-router-scroll "^3.3.3" + ember-router-scroll "^4.0.2" ember-svg-jar "^2.2.3" ember-tether "^2.0.0" - ember-truth-helpers "^2.1.0" + ember-truth-helpers "^3.0.0" esm "^3.2.25" - execa "^4.0.3" - fs-extra "^9.0.1" + execa "^5.0.0" + fs-extra "^10.0.0" git-repo-info "^2.1.1" - highlight.js "^9.15.10" - hosted-git-info "^3.0.4" - html-entities "^1.2.1" + highlight.js "^10.7.2" + hosted-git-info "^4.0.2" + html-entities "^2.3.2" inflected "^2.0.3" jsdom "^16.4.0" json-api-serializer "^2.2.1" @@ -6816,12 +6980,15 @@ ember-cli-addon-docs@^0.10.0: marked "^0.8.2" pad-start "^1.0.2" parse-git-config "^3.0.0" + postcss "^8.2.1" + postcss-import "^14.0.0" + postcss-nested "^5.0.3" + postcss-scss "^3.0.4" quick-temp "^0.1.8" resolve "^1.12.0" - sass "^1.22.10" semver "^7.3.2" striptags "^3.1.1" - tailwindcss "^1.2.0" + tailwindcss "1.9.6" walk-sync "^2.0.2" yuidocjs "^0.10.2" @@ -6865,7 +7032,7 @@ ember-cli-babel@7.7.3: ensure-posix-path "^1.0.2" semver "^5.5.0" -ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.17.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.7.2, ember-cli-babel@^6.8.2: +ember-cli-babel@^6.11.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.7.2: version "6.18.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz#3f6435fd275172edeff2b634ee7b29ce74318957" integrity sha512-7ceC8joNYxY2wES16iIBlbPSxwKDBhYwC8drU3ZEvuPDMwVv1KzxCNu1fvxyFEBWhwaRNTUxSCsEVoTd9nosGA== @@ -6884,7 +7051,7 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.2, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.26.6, ember-cli-babel@^7.4.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.2, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.26.3, ember-cli-babel@^7.26.6, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: version "7.26.6" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.6.tgz#322fbbd3baad9dd99e3276ff05bc6faef5e54b39" integrity sha512-040svtfj2RC35j/WMwdWJFusZaXmNoytLAMyBDGLMSlRvznudTxZjGlPV6UupmtTBApy58cEF8Fq4a+COWoEmQ== @@ -7046,17 +7213,7 @@ ember-cli-get-component-path-option@^1.0.0: resolved "https://registry.yarnpkg.com/ember-cli-get-component-path-option/-/ember-cli-get-component-path-option-1.0.0.tgz#0d7b595559e2f9050abed804f1d8eff1b08bc771" integrity sha1-DXtZVVni+QUKvtgE8djv8bCLx3E= -ember-cli-htmlbars@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.5.tgz#b5a105429a6bce4f7c9c97b667e3b8926e31397f" - integrity sha512-3f3PAxdnQ/fhQa8XP/3z4RLRgLHxV8j4Ln75aHbRdemOCjBa048KxL9l+acRLhCulbGQCMnLiIUIC89PAzLrcA== - dependencies: - broccoli-persistent-filter "^1.4.3" - hash-for-dep "^1.2.3" - json-stable-stringify "^1.0.0" - strip-bom "^3.0.0" - -ember-cli-htmlbars@^3.0.0, ember-cli-htmlbars@^3.0.1: +ember-cli-htmlbars@^3.0.1: version "3.1.0" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-3.1.0.tgz#87806c2a0bca2ab52d4fb8af8e2215c1ca718a99" integrity sha512-cgvRJM73IT0aePUG7oQ/afB7vSRBV3N0wu9BrWhHX2zkR7A7cUBI7KC9VPk6tbctCXoM7BRGsCC4aIjF7yrfXA== @@ -7086,7 +7243,7 @@ ember-cli-htmlbars@^4.2.3: strip-bom "^4.0.0" walk-sync "^2.0.2" -ember-cli-htmlbars@^5.0.0, ember-cli-htmlbars@^5.2.0, ember-cli-htmlbars@^5.3.1, ember-cli-htmlbars@^5.7.1: +ember-cli-htmlbars@^5.0.0, ember-cli-htmlbars@^5.3.1, ember-cli-htmlbars@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.7.1.tgz#eb5b88c7d9083bc27665fb5447a9b7503b32ce4f" integrity sha512-9laCgL4tSy48orNoQgQKEHp93MaqAs9ZOl7or5q+8iyGGJHW6sVXIYrVv5/5O9HfV6Ts8/pW1rSoaeKyLUE+oA== @@ -7160,17 +7317,16 @@ ember-cli-path-utils@^1.0.0: resolved "https://registry.yarnpkg.com/ember-cli-path-utils/-/ember-cli-path-utils-1.0.0.tgz#4e39af8b55301cddc5017739b77a804fba2071ed" integrity sha1-Tjmvi1UwHN3FAXc5t3qAT7ogce0= -ember-cli-postcss@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ember-cli-postcss/-/ember-cli-postcss-6.0.1.tgz#f4c841192c2dddf7700a085a72cfb17a9ba3fea6" - integrity sha512-xnqcFE9/OdfnxqisLHys7VZLzzSSGg96fzTCL+E/q2RqvFmtUC9FRP1sXtt7/UCogB1m4cdqYeW/a0VD8zBgPg== +ember-cli-postcss@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/ember-cli-postcss/-/ember-cli-postcss-7.0.2.tgz#b7df580296cbffad4db943c7d2be739b7f68148b" + integrity sha512-nlr5glZlk6VN0nZuxO5yBbhofHo2waoCHYqTQH2CennDgdC0Fph4Kp+VHtif3qCgMyMXTqqvvgkBz2YpOBgsgw== dependencies: - broccoli-file-creator "^2.1.1" broccoli-merge-trees "^4.0.0" - broccoli-postcss "^5.1.0" - broccoli-postcss-single "^4.0.0" + broccoli-postcss "^6.0.0" + broccoli-postcss-single "^5.0.0" ember-cli-babel "^7.1.0" - merge "^1.2.0" + merge "^2.1.1" ember-cli-preprocess-registry@^3.1.2: version "3.3.0" @@ -7182,16 +7338,6 @@ ember-cli-preprocess-registry@^3.1.2: debug "^3.0.1" process-relative-require "^1.0.0" -ember-cli-sass@10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/ember-cli-sass/-/ember-cli-sass-10.0.1.tgz#afa91eb7dfe3890be0390639d66976512e7d8edc" - integrity sha512-dWVoX03O2Mot1dEB1AN3ofC8DDZb6iU4Kfkbr3WYi9S9bGVHrpR/ngsR7tuVBuTugTyG53FPtLLqYdqx7XjXdA== - dependencies: - broccoli-funnel "^2.0.1" - broccoli-merge-trees "^3.0.1" - broccoli-sass-source-maps "^4.0.0" - ember-cli-version-checker "^2.1.0" - ember-cli-sri@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ember-cli-sri/-/ember-cli-sri-2.1.1.tgz#971620934a4b9183cf7923cc03e178b83aa907fd" @@ -7199,13 +7345,15 @@ ember-cli-sri@^2.1.1: dependencies: broccoli-sri-hash "^2.1.0" -ember-cli-string-helpers@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ember-cli-string-helpers/-/ember-cli-string-helpers-5.0.0.tgz#b1e08ec3ca1c9a457f9fd9aafff60b5939fbf91d" - integrity sha512-PodD3Uf7BkOXIu95E6cWEC0ERroTiUOAwOr828Vb+fPFtV7WYNSC27C9Ds1ggCyyRqnXmpS0JSqCTN1gPZfkWQ== +ember-cli-string-helpers@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-string-helpers/-/ember-cli-string-helpers-6.1.0.tgz#aeb96112bb91c540b869ed8b9c680f7fd5859cb6" + integrity sha512-Lw8B6MJx2n8CNF2TSIKs+hWLw0FqSYjr2/NRPyquyYA05qsl137WJSYW3ZqTsLgoinHat0DGF2qaCXocLhLmyA== dependencies: + "@babel/core" "^7.13.10" broccoli-funnel "^3.0.3" ember-cli-babel "^7.7.3" + resolve "^1.20.0" ember-cli-string-utils@^1.0.0, ember-cli-string-utils@^1.1.0: version "1.1.0" @@ -7301,6 +7449,22 @@ ember-cli-typescript@^3.1.3, ember-cli-typescript@^3.1.4: stagehand "^1.0.0" walk-sync "^2.0.0" +ember-cli-typescript@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-4.2.1.tgz#54d08fc90318cc986f3ea562f93ce58a6cc4c24d" + integrity sha512-0iKTZ+/wH6UB/VTWKvGuXlmwiE8HSIGcxHamwNhEC5x1mN3z8RfvsFZdQWYUzIWFN2Tek0gmepGRPTwWdBYl/A== + dependencies: + ansi-to-html "^0.6.15" + broccoli-stew "^3.0.0" + debug "^4.0.0" + execa "^4.0.0" + fs-extra "^9.0.1" + resolve "^1.5.0" + rsvp "^4.8.1" + semver "^7.3.2" + stagehand "^1.0.0" + walk-sync "^2.2.0" + ember-cli-uglify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ember-cli-uglify/-/ember-cli-uglify-3.0.0.tgz#8819665b2cc5fe70e3ba9fe7a94645209bc42fd6" @@ -7334,7 +7498,7 @@ ember-cli-version-checker@^4.1.0: semver "^6.3.0" silent-error "^1.1.1" -ember-cli-version-checker@^5.1.1, ember-cli-version-checker@^5.1.2: +ember-cli-version-checker@^5.1.0, ember-cli-version-checker@^5.1.1, ember-cli-version-checker@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-5.1.2.tgz#649c7b6404902e3b3d69c396e054cea964911ab0" integrity sha512-rk7GY+FmLn/2e22HsZs0Ycrz8HQ1W3Fv+2TFOuEFW9optnDXDgkntPBIl6gact/LHsfBM5RKbM3dHsIIeLgl0Q== @@ -7449,7 +7613,7 @@ ember-code-snippet@^3.0.0: es6-promise "^1.0.0" glob "^7.1.3" -ember-compatibility-helpers@^1.0.2, ember-compatibility-helpers@^1.1.1, ember-compatibility-helpers@^1.1.2, ember-compatibility-helpers@^1.2.0, ember-compatibility-helpers@^1.2.1: +ember-compatibility-helpers@^1.1.1, ember-compatibility-helpers@^1.1.2, ember-compatibility-helpers@^1.2.0, ember-compatibility-helpers@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.2.2.tgz#839e0c24190b7a2ec8c39b80e030811b1a95b6d3" integrity sha512-EKyCGOGBvKkBsk6wKfg3GhjTvTTkcEwzl/cv4VYvZM18cihmjGNpliR4BymWsKRWrv4VJLyq15Vhk3NHkSNBag== @@ -7458,7 +7622,17 @@ ember-compatibility-helpers@^1.0.2, ember-compatibility-helpers@^1.1.1, ember-co ember-cli-version-checker "^5.1.1" semver "^5.4.1" -ember-composable-helpers@^4.1.2, ember-composable-helpers@^4.2.2: +ember-compatibility-helpers@^1.2.4, ember-compatibility-helpers@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.2.5.tgz#b8363b1d5b8725afa9a4fe2b2986ac28626c6f23" + integrity sha512-7cddkQQp8Rs2Mqrj0xqZ0uO7eC9tBCKyZNcP2iE1RxQqOGPv8fiPkj1TUeidUB/Qe80lstoVXWMEuqqhW7Yy9A== + dependencies: + babel-plugin-debug-macros "^0.2.0" + ember-cli-version-checker "^5.1.1" + fs-extra "^9.1.0" + semver "^5.4.1" + +ember-composable-helpers@^4.1.2: version "4.4.1" resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.4.1.tgz#968f0ef72731cc300b377c552f36f20881911472" integrity sha512-MVx4KGFL6JzsYfCf9OqLCCnr7DN5tG2jFW9EvosvfgCL7gRdNxLqewR4PWPYA882wetmJ9zvcIEUJhFzZ4deaw== @@ -7468,14 +7642,26 @@ ember-composable-helpers@^4.1.2, ember-composable-helpers@^4.2.2: ember-cli-babel "^7.11.1" resolve "^1.10.0" -"ember-concurrency@^0.9.0 || ^0.10.0 || ^1.0.0": - version "1.1.6" - resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-1.1.6.tgz#a42806bc2066d556af1c75c7f031abccbf986f8f" - integrity sha512-SjHVtWHfkHpn2cSoZPU1TMpMvzDmS1pIFdi5NEmZnwhVUdQE55TiMp7l0xvoalWzylfFTaf+1PLWl82kw9zC2g== +ember-composable-helpers@^4.4.1: + version "4.5.0" + resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.5.0.tgz#94febbdf4348e64f45f7a6f993f326e32540a61e" + integrity sha512-XjpDLyVPsLCy6kd5dIxZonOECCO6AA5sY5Hr6tYUbJg3s5ghFAiFWaNcYraYC+fL2yPJQAswwpfwGlQORUJZkw== dependencies: - ember-cli-babel "^7.7.3" + "@babel/core" "^7.0.0" + broccoli-funnel "2.0.1" + ember-cli-babel "^7.26.3" + resolve "^1.10.0" + +ember-concurrency@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-2.2.0.tgz#0acfb8ca855e0fdfa4c543be150028299a89ba32" + integrity sha512-Ns1MH6t08oJqfeWQ4EMxyf6bLsXM87SbUPwGNUsg7idpikvkGr1PWqtvU6qxDTv1mA4Vrwdhv0I9yxN0ShH9Bg== + dependencies: + "@glimmer/tracking" "^1.0.4" + ember-cli-babel "^7.26.6" + ember-cli-htmlbars "^5.7.1" ember-compatibility-helpers "^1.2.0" - ember-maybe-import-regenerator "^0.1.6" + ember-destroyable-polyfill "^2.0.2" ember-data@3.14.0: version "3.14.0" @@ -7510,6 +7696,15 @@ ember-data@~3.14.0: ember-cli-typescript "^3.0.0" ember-inflector "^3.0.1" +ember-decorators@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/ember-decorators/-/ember-decorators-6.1.1.tgz#6d770f8999cf5a413a1ee459afd520838c0fc470" + integrity sha512-63vZPntPn1aqMyeNRLoYjJD+8A8obd+c2iZkJflswpDRNVIsp2m7aQdSCtPt4G0U/TEq2251g+N10maHX3rnJQ== + dependencies: + "@ember-decorators/component" "^6.1.1" + "@ember-decorators/object" "^6.1.1" + ember-cli-babel "^7.7.3" + ember-destroyable-polyfill@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/ember-destroyable-polyfill/-/ember-destroyable-polyfill-2.0.2.tgz#2cc7532bd3c00e351b4da9b7fc683f4daff79671" @@ -7573,13 +7768,13 @@ ember-get-config@, "ember-get-config@0.2.4 - 0.5.0": ember-cli-babel "^7.26.6" ember-cli-htmlbars "^5.7.1" -ember-get-config@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.2.4.tgz#118492a2a03d73e46004ed777928942021fe1ecd" - integrity sha1-EYSSoqA9c+RgBO13eSiUICH+Hs0= +ember-get-config@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.3.0.tgz#a73a1a87b48d9dde4c66a0e52ed5260b8a48cfbd" + integrity sha512-0e2pKzwW5lBZ4oJnvu9qHOht4sP1MWz/m3hyz8kpSoMdrlZVf62LDKZ6qfKgy8drcv5YhCMYE6QV7MhnqlrzEQ== dependencies: broccoli-file-creator "^1.1.1" - ember-cli-babel "^6.3.0" + ember-cli-babel "^7.0.0" ember-getowner-polyfill@^2.2.0: version "2.2.0" @@ -7596,13 +7791,6 @@ ember-href-to@^4.0.0: dependencies: ember-cli-babel "^7.13.2" -ember-ignore-children-helper@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ember-ignore-children-helper/-/ember-ignore-children-helper-1.0.1.tgz#f7c4aa17afb9c5685e1d4dcdb61c7b138ca7cdc3" - integrity sha512-AgKkrvd1/hIBWdLn42gITlweVsALUGPYF9fMpQ2IDqp7QnRmtO8ocRbZEmMddPDWY9Xu7W5qO2f35rbD7OSpYw== - dependencies: - ember-cli-babel "^6.8.2" - "ember-inflector@^2.0.0 || ^3.0.0 || ^4.0.0": version "4.0.1" resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-4.0.1.tgz#e0aa9e39119156a278c80bb8cdec8462ecb8e6ab" @@ -7617,13 +7805,16 @@ ember-inflector@^3.0.1: dependencies: ember-cli-babel "^6.6.0" -ember-keyboard@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ember-keyboard/-/ember-keyboard-5.0.0.tgz#a8ffd949c392b854d094f756116c063070e3ce63" - integrity sha512-ahWioA5ek1MU8JayyzowCiRQWRGXfqYTJPFOpxJsTDQmjpUm3HpQHVXmqZXy6wEPnRnhyngRpPbU5/K8cW0CMg== +ember-keyboard@^6.0.3: + version "6.0.4" + resolved "https://registry.yarnpkg.com/ember-keyboard/-/ember-keyboard-6.0.4.tgz#396e1be4c815b2972e2a6973dcc45acbc6701e4a" + integrity sha512-Mkg5TG6KBTtxjOUBdyLADajyj/mJo3ua2mSHw20UtG2MxKxMyO+Bs4tttMlEmmrR3XMrQ9qVBLkq2dIuuQku3w== dependencies: - "@babel/plugin-proposal-object-rest-spread" "^7.3.1" - ember-cli-babel "^7.4.1" + ember-cli-babel "^7.26.6" + ember-cli-htmlbars "^5.7.1" + ember-compatibility-helpers "^1.2.4" + ember-modifier "^2.1.2 || ^3.0.0" + ember-modifier-manager-polyfill "^1.2.0" ember-load-initializers@^2.0.0: version "2.1.2" @@ -7642,16 +7833,6 @@ ember-macro-helpers@^4.2.2: ember-cli-string-utils "^1.1.0" ember-cli-test-info "^1.0.0" -ember-maybe-import-regenerator@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ember-maybe-import-regenerator/-/ember-maybe-import-regenerator-0.1.6.tgz#35d41828afa6d6a59bc0da3ce47f34c573d776ca" - integrity sha1-NdQYKK+m1qWbwNo85H80xXPXdso= - dependencies: - broccoli-funnel "^1.0.1" - broccoli-merge-trees "^1.0.0" - ember-cli-babel "^6.0.0-beta.4" - regenerator-runtime "^0.9.5" - ember-maybe-import-regenerator@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-maybe-import-regenerator/-/ember-maybe-import-regenerator-1.0.0.tgz#c05453dfd3b65dbec2b569612b01ae70b672dd7e" @@ -7662,16 +7843,17 @@ ember-maybe-import-regenerator@^1.0.0: ember-cli-babel "^7.26.6" regenerator-runtime "^0.13.2" -ember-modal-dialog@^3.0.0-beta.4: - version "3.0.0-beta.4" - resolved "https://registry.yarnpkg.com/ember-modal-dialog/-/ember-modal-dialog-3.0.0-beta.4.tgz#2da8b5424cf33fd87117624dcaabfe9727f967e9" - integrity sha512-23kCmH0uPkDh132NbXr4E7x15gF00pGM8f/Q0lCV6IKZOJcW+lb9L6sKgkEEayzGTvgxp4BPU8n8xnIP3go4FA== +ember-modal-dialog@^4.0.0-alpha.0: + version "4.0.0-alpha.1" + resolved "https://registry.yarnpkg.com/ember-modal-dialog/-/ember-modal-dialog-4.0.0-alpha.1.tgz#b63b078a2d3a7bbe26514dccb1795d37e95c1de7" + integrity sha512-jkwpX4lj7RBiZO2os+xnRnwdLFPMYNaKnAEZxa1tGl36eER7c9NV/gJZtB2WwnelCMOT5bhGGZI7Evb8whOUrg== dependencies: - ember-cli-babel "^7.1.3" - ember-cli-htmlbars "^3.0.0" + ember-classic-decorator "^2.0.0" + ember-cli-babel "^7.26.6" + ember-cli-htmlbars "^5.7.1" ember-cli-version-checker "^2.1.0" - ember-ignore-children-helper "^1.0.1" - ember-wormhole "^0.5.5" + ember-decorators "^6.1.1" + ember-wormhole "^0.6.0" ember-modifier-manager-polyfill@^1.1.0, ember-modifier-manager-polyfill@^1.2.0: version "1.2.0" @@ -7682,6 +7864,17 @@ ember-modifier-manager-polyfill@^1.1.0, ember-modifier-manager-polyfill@^1.2.0: ember-cli-version-checker "^2.1.2" ember-compatibility-helpers "^1.2.0" +"ember-modifier@^2.1.2 || ^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-modifier/-/ember-modifier-3.0.0.tgz#74466d32e4ef9b80004915676cc3bfd6e3fd7a3d" + integrity sha512-ccXfMnjWhjEUCB5taeIPQmf0h1zPUIMbmsCV7W+JZ2BioPUZTLhE1WuHspmV0iEOiX3Fwx8jMOx6b74sFcKJ0g== + dependencies: + ember-cli-babel "^7.26.6" + ember-cli-normalize-entity-name "^1.0.0" + ember-cli-string-utils "^1.1.0" + ember-cli-typescript "^4.2.1" + ember-compatibility-helpers "^1.2.5" + ember-moment@^8.0.0: version "8.0.1" resolved "https://registry.yarnpkg.com/ember-moment/-/ember-moment-8.0.1.tgz#3a11929efeb7fb6bc5c1cc2c9e4c43bd9c500f80" @@ -7691,14 +7884,6 @@ ember-moment@^8.0.0: ember-getowner-polyfill "^2.2.0" ember-macro-helpers "^4.2.2" -ember-named-arguments-polyfill@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ember-named-arguments-polyfill/-/ember-named-arguments-polyfill-1.0.0.tgz#0b81fb81a7cef2c89e9e1d0278b579e708bf4ded" - integrity sha1-C4H7gafO8sienh0CeLV55wi/Te0= - dependencies: - ember-cli-babel "^6.6.0" - ember-cli-version-checker "^2.1.2" - ember-on-modifier@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ember-on-modifier/-/ember-on-modifier-1.0.1.tgz#b99e9c9d7919a9f536bfc9d4a68704462eceb0fe" @@ -7762,14 +7947,14 @@ ember-router-generator@^2.0.0: "@babel/traverse" "^7.4.5" recast "^0.18.1" -ember-router-scroll@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/ember-router-scroll/-/ember-router-scroll-3.3.3.tgz#65321318b74bfe5b06a243953d1b7d5e9faf1e82" - integrity sha512-n+TpZ9Dt/UQaRiNpNVTOUur+TsA6hAkorgi4hj7kjbchPd7/n54ZXUTSH0GVyMEkqsZHJeAmuNADjv3zHTfQDQ== +ember-router-scroll@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/ember-router-scroll/-/ember-router-scroll-4.1.2.tgz#8af1c29b7a596738bbbd71a8a04af7c5c0d19403" + integrity sha512-5AGRmbfhSx7kOu2U8caQkG8qOxlLnvJIoQgKRE9mc1isuYPdime6Qn061NSnnQukMMsSPlV8GAImiEk05BmfGA== dependencies: - ember-app-scheduler "^5.0.1" - ember-cli-babel "^7.11.1" - ember-compatibility-helpers "^1.1.2" + ember-app-scheduler "^5.1.2 || ^6.0.0 || ^7.0.0" + ember-cli-babel "^7.26.6" + ember-compatibility-helpers "^1.2.5" ember-source-channel-url@^1.0.1: version "1.2.0" @@ -7883,12 +8068,12 @@ ember-tether@^2.0.0: ember-cli-babel "^7.1.2" tether "^1.4.0" -ember-truth-helpers@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ember-truth-helpers/-/ember-truth-helpers-2.1.0.tgz#d4dab4eee7945aa2388126485977baeb33ca0798" - integrity sha512-BQlU8aTNl1XHKTYZ243r66yqtR9JU7XKWQcmMA+vkqfkE/c9WWQ9hQZM8YABihCmbyxzzZsngvldokmeX5GhAw== +ember-truth-helpers@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-truth-helpers/-/ember-truth-helpers-3.0.0.tgz#86766bdca4ac9b86bce3d262dff2aabc4a0ea384" + integrity sha512-hPKG9QqruAELh0li5xaiLZtr88ioWYxWCXisAWHWE0qCP4a2hgtuMzKUPpiTCkltvKjuqpzTZCU4VhQ+IlRmew== dependencies: - ember-cli-babel "^6.6.0" + ember-cli-babel "^7.22.1" ember-try-config@^3.0.0: version "3.0.0" @@ -7921,13 +8106,13 @@ ember-try@^1.0.0: rsvp "^4.7.0" walk-sync "^1.1.3" -ember-wormhole@^0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/ember-wormhole/-/ember-wormhole-0.5.5.tgz#db417ff748cb21e574cd5f233889897bc27096cb" - integrity sha512-z8l3gpoKmRA2BnTwvnYRk4jKVcETKHpddsD6kpS+EJ4EfyugadFS3zUqBmRDuJhFbNP8BVBLXlbbATj+Rk1Kgg== +ember-wormhole@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/ember-wormhole/-/ember-wormhole-0.6.0.tgz#1f9143aa05c0f0abdf14a97ff22520ebaf85eca0" + integrity sha512-b7RrRxkwCBEJxM2zR34dEzIET81BOZWTcYNJtkidLycLQvdbxPys5QJEjJ/IfDikT/z5HuQBdZRKBhXI0vZNXQ== dependencies: - ember-cli-babel "^6.10.0" - ember-cli-htmlbars "^2.0.1" + ember-cli-babel "^7.22.1" + ember-cli-htmlbars "^5.3.1" emit-function@0.0.2: version "0.0.2" @@ -8500,7 +8685,7 @@ execa@^3.0.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" -execa@^4.0.3: +execa@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== @@ -8515,16 +8700,26 @@ execa@^4.0.3: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + exif-parser@^0.1.12, exif-parser@^0.1.9: version "0.1.12" resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922" integrity sha1-WKnS1ywCwfbwKg70qRZicrd2CSI= -exists-sync@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.4.tgz#9744c2c428cc03b01060db454d4b12f0ef3c8879" - integrity sha1-l0TCxCjMA7AQYNtFTUsS8O88iHk= - exit-hook@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" @@ -9117,6 +9312,15 @@ fs-extra@^0.24.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" +fs-extra@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" + integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^4.0.0, fs-extra@^4.0.2, fs-extra@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" @@ -9277,6 +9481,11 @@ fsevents@~2.1.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -9311,6 +9520,11 @@ gensync@^1.0.0-beta.1: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + get-caller-file@^1.0.0, get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" @@ -9367,6 +9581,11 @@ get-stream@^5.0.0: dependencies: pump "^3.0.0" +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" @@ -9462,7 +9681,7 @@ glob-parent@^5.1.0, glob-parent@~5.1.0: dependencies: is-glob "^4.0.1" -glob-parent@^5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -9615,7 +9834,7 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -handlebars@^4.0.13, handlebars@^4.0.4, handlebars@^4.3.1, handlebars@^4.4.2, handlebars@^4.7.4: +handlebars@^4.0.13, handlebars@^4.0.4, handlebars@^4.3.1, handlebars@^4.4.2: version "4.7.7" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== @@ -9834,10 +10053,10 @@ heimdalljs@^0.3.0: dependencies: rsvp "~3.2.1" -highlight.js@^9.15.10: - version "9.18.5" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.5.tgz#d18a359867f378c138d6819edfc2a8acd5f29825" - integrity sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA== +highlight.js@^10.7.2: + version "10.7.3" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" + integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== himalaya@1.1.0: version "1.1.0" @@ -9876,12 +10095,12 @@ hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== -hosted-git-info@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.4.tgz#be4973eb1fd2737b11c9c7c19380739bb249f60d" - integrity sha512-4oT62d2jwSDBbLLFLZE+1vPuQ1h8p9wjrJ8Mqx5TjsyWmBMV5B13eJqn8pvluqubLf3cJPTfiYCIwNwDNmzScQ== +hosted-git-info@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961" + integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg== dependencies: - lru-cache "^5.1.1" + lru-cache "^6.0.0" html-encoding-sniffer@^2.0.1: version "2.0.1" @@ -9890,10 +10109,15 @@ html-encoding-sniffer@^2.0.1: dependencies: whatwg-encoding "^1.0.5" -html-entities@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" - integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= +html-entities@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488" + integrity sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ== + +html-tags@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" + integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== htmlparser2@^3.9.1: version "3.10.1" @@ -9987,6 +10211,11 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + ice-cap@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/ice-cap/-/ice-cap-0.0.4.tgz#8a6d31ab4cac8d4b56de4fa946df3352561b6e18" @@ -10042,6 +10271,11 @@ image-size@^0.6.3: resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2" integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== +immutable@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23" + integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== + import-fresh@^3.0.0: version "3.2.1" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" @@ -11463,7 +11697,7 @@ lodash.values@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c= -lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1, lodash@^4.7.0: +lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -11781,6 +12015,11 @@ merge@^1.2.0: resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== +merge@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-2.1.1.tgz#59ef4bf7e0b3e879186436e8481c06a6c162ca98" + integrity sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w== + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -11998,11 +12237,6 @@ mkdirp@0.5.1: dependencies: minimist "0.0.8" -mkdirp@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" - integrity sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc= - mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@~0.5.1: version "0.5.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.4.tgz#fd01504a6797ec5c9be81ff43d204961ed64a512" @@ -12104,6 +12338,11 @@ nan@^2.12.1: resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== +nanoid@^3.1.30: + version "3.1.30" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362" + integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -12228,6 +12467,11 @@ node-releases@^1.1.70: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== + node-uuid@~1.4.0: version "1.4.8" resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" @@ -12330,7 +12574,7 @@ npm-run-path@^3.0.0: dependencies: path-key "^3.0.0" -npm-run-path@^4.0.0: +npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== @@ -12389,11 +12633,6 @@ object-assign@4.1.1, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= -object-assign@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" - integrity sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo= - object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" @@ -12408,6 +12647,11 @@ object-hash@^1.3.1: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== +object-hash@^2.0.3: + version "2.2.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" + integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== + object-inspect@^1.11.0, object-inspect@^1.9.0: version "1.11.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" @@ -12518,6 +12762,13 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" @@ -12972,7 +13223,17 @@ phin@^2.9.1: resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c" integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== -picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.0.7, picomatch@^2.2.1: +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== @@ -12987,7 +13248,7 @@ pidtree@^0.3.0: resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== -pify@^2.0.0: +pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= @@ -13076,6 +13337,15 @@ postcss-functions@^3.0.0: postcss "^6.0.9" postcss-value-parser "^3.3.0" +postcss-import@^14.0.0: + version "14.0.2" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.0.2.tgz#60eff77e6be92e7b67fe469ec797d9424cae1aa1" + integrity sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + postcss-js@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-2.0.3.tgz#a96f0f23ff3d08cec7dc5b11bf11c5f8077cdab9" @@ -13092,6 +13362,20 @@ postcss-nested@^4.1.1: postcss "^7.0.21" postcss-selector-parser "^6.0.2" +postcss-nested@^5.0.3: + version "5.0.6" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-5.0.6.tgz#466343f7fc8d3d46af3e7dba3fcd47d052a945bc" + integrity sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA== + dependencies: + postcss-selector-parser "^6.0.6" + +postcss-scss@^3.0.4: + version "3.0.5" + resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-3.0.5.tgz#bd484faf05890e48a6f5e097acb3d104cc7b9ac7" + integrity sha512-3e0qYk87eczfzg5P73ZVuuxEGCBfatRhPze6KrSaIbEKVtmnFI1RYp1Fv+AyZi+w8kcNRSPeNX6ap4b65zEkiA== + dependencies: + postcss "^8.2.7" + postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" @@ -13101,11 +13385,24 @@ postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: indexes-of "^1.0.1" uniq "^1.0.1" +postcss-selector-parser@^6.0.6: + version "6.0.7" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.7.tgz#48404830a635113a71fd79397de8209ed05a66fc" + integrity sha512-U+b/Deoi4I/UmE6KOVPpnhS7I7AYdKbhGcat+qTQ27gycvaACvNEw11ba6RrkwVmDVRW7sigWgLj4/KbbJjeDA== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + postcss-value-parser@^3.3.0: version "3.3.1" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== +postcss-value-parser@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + postcss-value-parser@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d" @@ -13134,7 +13431,7 @@ postcss@^6.0.9: source-map "^0.6.1" supports-color "^5.4.0" -postcss@^7.0.0, postcss@^7.0.11, postcss@^7.0.18, postcss@^7.0.21, postcss@^7.0.27, postcss@^7.0.5: +postcss@^7.0.11, postcss@^7.0.18, postcss@^7.0.21, postcss@^7.0.27: version "7.0.27" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9" integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ== @@ -13143,6 +13440,14 @@ postcss@^7.0.0, postcss@^7.0.11, postcss@^7.0.18, postcss@^7.0.21, postcss@^7.0. source-map "^0.6.1" supports-color "^6.1.0" +postcss@^7.0.14: + version "7.0.39" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== + dependencies: + picocolors "^0.2.1" + source-map "^0.6.1" + postcss@^7.0.2, postcss@^7.0.32: version "7.0.35" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" @@ -13152,6 +13457,15 @@ postcss@^7.0.2, postcss@^7.0.32: source-map "^0.6.1" supports-color "^6.1.0" +postcss@^8.1.4, postcss@^8.2.1, postcss@^8.2.7: + version "8.4.4" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.4.tgz#d53d4ec6a75fd62557a66bb41978bf47ff0c2869" + integrity sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q== + dependencies: + nanoid "^3.1.30" + picocolors "^1.0.0" + source-map-js "^1.0.1" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -13456,6 +13770,13 @@ rc@^1.0.1, rc@^1.1.6: minimist "^1.2.0" strip-json-comments "~2.0.1" +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= + dependencies: + pify "^2.3.0" + read-chunk@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-1.0.1.tgz#5f68cab307e663f19993527d9b589cace4661194" @@ -13538,13 +13859,6 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" -readdirp@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" - integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== - dependencies: - picomatch "^2.0.7" - readdirp@~3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" @@ -13552,6 +13866,13 @@ readdirp@~3.5.0: dependencies: picomatch "^2.2.1" +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + recast@^0.18.1: version "0.18.7" resolved "https://registry.yarnpkg.com/recast/-/recast-0.18.7.tgz#56338a6d803c8c3b9113344440dc70d13c8a1ef7" @@ -13617,11 +13938,6 @@ regenerator-runtime@^0.13.4: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== -regenerator-runtime@^0.9.5: - version "0.9.6" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz#d33eb95d0d2001a4be39659707c51b0cb71ce029" - integrity sha1-0z65XQ0gAaS+OWWXB8UbDLcc4Ck= - regenerator-transform@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" @@ -13914,14 +14230,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.15.0, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.8.1: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== - dependencies: - path-parse "^1.0.6" - -resolve@^1.20.0: +resolve@^1.1.7, resolve@^1.20.0: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -13929,6 +14238,13 @@ resolve@^1.20.0: is-core-module "^2.2.0" path-parse "^1.0.6" +resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.15.0, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.8.1: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + responselike@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -14141,12 +14457,14 @@ sane@^3.0.0: optionalDependencies: fsevents "^1.2.3" -sass@^1.22.10: - version "1.26.3" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.26.3.tgz#412df54486143b76b5a65cdf7569e86f44659f46" - integrity sha512-5NMHI1+YFYw4sN3yfKjpLuV9B5l7MqQ6FlkTcC4FT+oHbBRUZoSjHrrt/mE0nFXJyY2kQtU9ou9HxvFVjLFuuw== +sass@^1.16.1: + version "1.45.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.45.0.tgz#192ede1908324bb293a3e403d1841dbcaafdd323" + integrity sha512-ONy5bjppoohtNkFJRqdz1gscXamMzN3wQy1YH9qO2FiNpgjLhpz/IPRGg0PpCjyz/pWfCOaNEaiEGCcjOFAjqw== dependencies: - chokidar ">=2.0.0 <4.0.0" + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" sax@>=0.6.0, sax@^1.1.4, sax@~1.2.4: version "1.2.4" @@ -14197,13 +14515,6 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.1.3, semver@^7.3.2, semver@^7.3.4: - version "7.3.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== - dependencies: - lru-cache "^6.0.0" - semver@^7.2.1, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" @@ -14211,6 +14522,13 @@ semver@^7.2.1, semver@^7.3.5: dependencies: lru-cache "^6.0.0" +semver@^7.3.2, semver@^7.3.4: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -14326,6 +14644,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= +signal-exit@^3.0.3: + version "3.0.6" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" + integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== + silent-error@^1.0.0, silent-error@^1.0.1, silent-error@^1.1.0, silent-error@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/silent-error/-/silent-error-1.1.1.tgz#f72af5b0d73682a2ba1778b7e32cd8aa7c2d8662" @@ -14354,11 +14677,6 @@ simple-html-tokenizer@^0.5.8: resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.9.tgz#1a83fe97f5a3e39b335fddf71cfe9b0263b581c2" integrity sha512-w/3FEDN94r4JQ9WoYrIr8RqDIPZdyNkdpbK9glFady1CAEyD97XWCv8HFetQO21w81e7h7Nh59iYTyG1mUJftg== -simple-html-tokenizer@^0.5.9: - version "0.5.10" - resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.10.tgz#0843e4f00c9677f1c81e3dfeefcee0a4aca8e5d0" - integrity sha512-1DHMUmvUOGuUZ9/+cX/+hOhWhRD5dEw6lodn8WuV+T+cQ31hhBcCu1dcDsNotowi4mMaNhrLyKoS+DtB81HdDA== - simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -14511,6 +14829,11 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.1.tgz#a1741c131e3c77d048252adfa24e23b908670caf" + integrity sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA== + source-map-resolve@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" @@ -14571,6 +14894,11 @@ source-map@~0.1.x: dependencies: amdefine ">=0.0.4" +source-map@~0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + sourcemap-codec@^1.4.1: version "1.4.8" resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" @@ -15052,27 +15380,30 @@ taffydb@2.7.2: resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.7.2.tgz#7bf8106a5c1a48251b3e3bc0a0e1732489fd0dc8" integrity sha1-e/gQalwaSCUbPjvAoOFzJIn9Dcg= -tailwindcss@^1.2.0: - version "1.4.6" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-1.4.6.tgz#17b37166ccda08d7e7f9ca995ea48ce1e0089700" - integrity sha512-qV0qInUq1FWih39Bc5CWECdgObSzRrbjGD4ke4kAPSIq6WXrPhv0wwOcUWJgJ66ltT9j+XnSRYikG8WNRU/fTQ== +tailwindcss@1.9.6: + version "1.9.6" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-1.9.6.tgz#0c5089911d24e1e98e592a31bfdb3d8f34ecf1a0" + integrity sha512-nY8WYM/RLPqGsPEGEV2z63riyQPcHYZUJpAwdyBzVpxQHOHqHE+F/fvbCeXhdF1+TA5l72vSkZrtYCB9hRcwkQ== dependencies: "@fullhuman/postcss-purgecss" "^2.1.2" autoprefixer "^9.4.5" browserslist "^4.12.0" bytes "^3.0.0" - chalk "^4.0.0" + chalk "^3.0.0 || ^4.0.0" color "^3.1.2" detective "^5.2.0" fs-extra "^8.0.0" - lodash "^4.17.15" + html-tags "^3.1.0" + lodash "^4.17.20" node-emoji "^1.8.1" normalize.css "^8.0.1" + object-hash "^2.0.3" postcss "^7.0.11" postcss-functions "^3.0.0" postcss-js "^2.0.0" postcss-nested "^4.1.1" postcss-selector-parser "^6.0.0" + postcss-value-parser "^4.1.0" pretty-hrtime "^1.0.3" reduce-css-calc "^2.1.6" resolve "^1.14.2" From 273961337f2f6dc5a2592d01f45e3fa7070b3f48 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Dec 2021 01:44:37 +0000 Subject: [PATCH 839/879] Bump broccoli-funnel from 3.0.4 to 3.0.8 Bumps [broccoli-funnel](https://github.com/broccolijs/broccoli-funnel) from 3.0.4 to 3.0.8. - [Release notes](https://github.com/broccolijs/broccoli-funnel/releases) - [Changelog](https://github.com/broccolijs/broccoli-funnel/blob/master/CHANGELOG.md) - [Commits](https://github.com/broccolijs/broccoli-funnel/compare/v3.0.4...v3.0.8) --- updated-dependencies: - dependency-name: broccoli-funnel dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- yarn.lock | 76 ++++++++++--------------------------------------------- 1 file changed, 13 insertions(+), 63 deletions(-) diff --git a/yarn.lock b/yarn.lock index 550942b7c..f7af50db9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4633,23 +4633,7 @@ broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1, broccoli-funnel@^2.0.2: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-funnel@^3.0.0, broccoli-funnel@^3.0.3: - version "3.0.4" - resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.4.tgz#0fe6b7e8745fa4585f30470fbfe54653ce058e3c" - integrity sha512-6w0nhWvBeTnOQ0DGVM9mCvFN32duLbXxyE06qLFi9jcd0HwfODkQ0QMtvvuM60+i7pHa+JQ75MStWHpj1DIaoA== - dependencies: - array-equal "^1.0.0" - blank-object "^1.0.1" - broccoli-plugin "^4.0.1" - debug "^4.1.1" - fast-ordered-set "^1.0.0" - fs-tree-diff "^2.0.1" - heimdalljs "^0.2.0" - minimatch "^3.0.0" - path-posix "^1.0.0" - walk-sync "^2.0.2" - -broccoli-funnel@^3.0.6, broccoli-funnel@^3.0.8: +broccoli-funnel@^3.0.0, broccoli-funnel@^3.0.3, broccoli-funnel@^3.0.6, broccoli-funnel@^3.0.8: version "3.0.8" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.8.tgz#f5b62e2763c3918026a15a3c833edc889971279b" integrity sha512-ng4eIhPYiXqMw6SyGoxPHR3YAwEd2lr9FgBI1CyTbspl4txZovOsmzFkMkGAlu88xyvYXJqHiM2crfLa65T1BQ== @@ -4767,15 +4751,6 @@ broccoli-output-wrapper@^2.0.0: dependencies: heimdalljs-logger "^0.1.10" -broccoli-output-wrapper@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/broccoli-output-wrapper/-/broccoli-output-wrapper-3.2.1.tgz#8f9d1092afe0c1a4b7a1b6f0d2c62f1c403e82ad" - integrity sha512-mhOTy8AyzEsqgefR2ejbv5QTy3dbY2bvDfkARo55Xml52r2MU0CehQu4T/CH6oPcAXkdVYG/hGm9UpV1vU9Ohg== - dependencies: - fs-extra "^8.1.0" - heimdalljs-logger "^0.1.10" - symlink-or-copy "^1.2.0" - broccoli-output-wrapper@^3.2.5: version "3.2.5" resolved "https://registry.yarnpkg.com/broccoli-output-wrapper/-/broccoli-output-wrapper-3.2.5.tgz#514b17801c92922a2c2f87fd145df2a25a11bc5f" @@ -4851,18 +4826,18 @@ broccoli-plugin@1.1.0: rimraf "^2.3.4" symlink-or-copy "^1.0.1" -"broccoli-plugin@1.5.1 - 5", broccoli-plugin@^4.0.0, broccoli-plugin@^4.0.1, broccoli-plugin@^4.0.2, broccoli-plugin@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-4.0.3.tgz#9dcfbfb6a1b27a37cc22e65c071719ce9f92bc1e" - integrity sha512-CtAIEYq5K+4yQv8c/BHymOteuyjDAJfvy/asu4LudIWcMSS7dTn3yGI5gNBkwHG+qlRangYkHJNVAcDZMQbSVQ== +"broccoli-plugin@1.5.1 - 5", broccoli-plugin@^4.0.0, broccoli-plugin@^4.0.1, broccoli-plugin@^4.0.2, broccoli-plugin@^4.0.3, broccoli-plugin@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-4.0.7.tgz#dd176a85efe915ed557d913744b181abe05047db" + integrity sha512-a4zUsWtA1uns1K7p9rExYVYG99rdKeGRymW0qOCNkvDPHQxVi3yVyJHhQbM3EZwdt2E0mnhr5e0c/bPpJ7p3Wg== dependencies: - broccoli-node-api "^1.6.0" - broccoli-output-wrapper "^3.2.1" - fs-merger "^3.1.0" - promise-map-series "^0.2.1" - quick-temp "^0.1.3" - rimraf "^3.0.0" - symlink-or-copy "^1.3.0" + broccoli-node-api "^1.7.0" + broccoli-output-wrapper "^3.2.5" + fs-merger "^3.2.1" + promise-map-series "^0.3.0" + quick-temp "^0.1.8" + rimraf "^3.0.2" + symlink-or-copy "^1.3.1" broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli-plugin@^1.2.1, broccoli-plugin@^1.3.0, broccoli-plugin@^1.3.1: version "1.3.1" @@ -4897,19 +4872,6 @@ broccoli-plugin@^3.0.0, broccoli-plugin@^3.1.0: rimraf "^2.3.4" symlink-or-copy "^1.1.8" -broccoli-plugin@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-4.0.7.tgz#dd176a85efe915ed557d913744b181abe05047db" - integrity sha512-a4zUsWtA1uns1K7p9rExYVYG99rdKeGRymW0qOCNkvDPHQxVi3yVyJHhQbM3EZwdt2E0mnhr5e0c/bPpJ7p3Wg== - dependencies: - broccoli-node-api "^1.7.0" - broccoli-output-wrapper "^3.2.5" - fs-merger "^3.2.1" - promise-map-series "^0.3.0" - quick-temp "^0.1.8" - rimraf "^3.0.2" - symlink-or-copy "^1.3.1" - broccoli-postcss-single@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/broccoli-postcss-single/-/broccoli-postcss-single-5.0.0.tgz#adcd2b92f59504bbb9b5da1f9aa6a1c7afa4d9d5" @@ -9398,18 +9360,6 @@ fs-merger@^3.0.1: rimraf "^2.6.3" walk-sync "^2.0.2" -fs-merger@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/fs-merger/-/fs-merger-3.1.0.tgz#f30f74f6c70b2ff7333ec074f3d2f22298152f3b" - integrity sha512-RZ9JtqugaE8Rkt7idO5NSwcxEGSDZpLmVFjtVQUm3f+bWun7JAU6fKyU6ZJUeUnKdJwGx8uaro+K4QQfOR7vpA== - dependencies: - broccoli-node-api "^1.7.0" - broccoli-node-info "^2.1.0" - fs-extra "^8.0.1" - fs-tree-diff "^2.0.1" - rimraf "^2.6.3" - walk-sync "^2.0.2" - fs-merger@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/fs-merger/-/fs-merger-3.2.1.tgz#a225b11ae530426138294b8fbb19e82e3d4e0b3b" @@ -15337,7 +15287,7 @@ svgo@1.3.0: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.8, symlink-or-copy@^1.2.0, symlink-or-copy@^1.3.0, symlink-or-copy@^1.3.1: +symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.8, symlink-or-copy@^1.2.0, symlink-or-copy@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.3.1.tgz#9506dd64d8e98fa21dcbf4018d1eab23e77f71fe" integrity sha512-0K91MEXFpBUaywiwSSkmKjnGcasG/rVBXFLJz5DrgGabpYD6N+3yZrfD6uUIfpuTu65DZLHi7N8CizHc07BPZA== From 8d1c87112336d5d5009987eda3bcc849654c7d9b Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Sat, 11 Dec 2021 20:46:15 -0500 Subject: [PATCH 840/879] Add eslint-plugin-qunit per latest addon blueprint --- .eslintrc.js | 5 +++++ package.json | 1 + tests/acceptance/home-test.js | 2 +- tests/unit/inflector-test.js | 12 ++++++------ .../ember-data-serializer-discover-test.js | 4 ++-- yarn.lock | 15 +++++++++++++++ 6 files changed, 30 insertions(+), 9 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 72879400b..36a883d02 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -48,5 +48,10 @@ module.exports = { plugins: ['node'], extends: ['plugin:node/recommended'], }, + { + // test files + files: ['tests/**/*-test.{js,ts}'], + extends: ['plugin:qunit/recommended'], + }, ], }; diff --git a/package.json b/package.json index 77bab22be..ec69d9fe9 100644 --- a/package.json +++ b/package.json @@ -91,6 +91,7 @@ "eslint": "^7.32.0", "eslint-plugin-ember": "^8.1.0", "eslint-plugin-node": "^11.1.0", + "eslint-plugin-qunit": "^7.1.0", "faker": "^5.1.0", "fastboot": "^3.0.2", "js-yaml": "^4.0.0", diff --git a/tests/acceptance/home-test.js b/tests/acceptance/home-test.js index b127c1ab1..2c40847eb 100644 --- a/tests/acceptance/home-test.js +++ b/tests/acceptance/home-test.js @@ -11,7 +11,7 @@ module("Acceptance | home", function(hooks) { test("the homepage renders without error", async function(assert) { await visit("/"); - assert.equal(currentURL(), "/", "Correct URL is shown"); + assert.strictEqual(currentURL(), "/", "Correct URL is shown"); }); } }); diff --git a/tests/unit/inflector-test.js b/tests/unit/inflector-test.js index 06c0beb50..dfa685822 100644 --- a/tests/unit/inflector-test.js +++ b/tests/unit/inflector-test.js @@ -8,14 +8,14 @@ import {module, test} from 'qunit'; */ module('Unit | Inflector', function() { test('can singularize', function(assert) { - assert.equal(singularize('tests'), 'test'); - assert.equal(singularize('watches'), 'watch'); - assert.equal(singularize('sheep'), 'sheep'); + assert.strictEqual(singularize('tests'), 'test'); + assert.strictEqual(singularize('watches'), 'watch'); + assert.strictEqual(singularize('sheep'), 'sheep'); }); test('can pluralize', function(assert) { - assert.equal(pluralize('test'), 'tests'); - assert.equal(pluralize('watch'), 'watches'); - assert.equal(pluralize('sheep'), 'sheep'); + assert.strictEqual(pluralize('test'), 'tests'); + assert.strictEqual(pluralize('watch'), 'watches'); + assert.strictEqual(pluralize('sheep'), 'sheep'); }); }); diff --git a/tests/unit/serializers/ember-data-serializer-discover-test.js b/tests/unit/serializers/ember-data-serializer-discover-test.js index 31d828371..a1b6cc415 100644 --- a/tests/unit/serializers/ember-data-serializer-discover-test.js +++ b/tests/unit/serializers/ember-data-serializer-discover-test.js @@ -21,10 +21,10 @@ module('Unit | Serializer | ember data serializer discover', function(hooks) { test('it discovers the serializers', function(assert) { let serializer = server.serializerOrRegistry.serializerFor('address'); - assert.ok(serializer.primaryKey === 'addressId'); + assert.strictEqual(serializer.primaryKey, 'addressId'); serializer = server.serializerOrRegistry.serializerFor('word-smith'); - assert.ok(serializer.transforms['blogPosts'].serialize === 'records'); + assert.strictEqual(serializer.transforms['blogPosts'].serialize, 'records'); }); }); diff --git a/yarn.lock b/yarn.lock index 550942b7c..e24aa8dd9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8410,6 +8410,14 @@ eslint-plugin-node@^11.1.0: resolve "^1.10.1" semver "^6.1.0" +eslint-plugin-qunit@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-qunit/-/eslint-plugin-qunit-7.1.0.tgz#d0d4f9f9f2b9623953a4b7f1ca8a71f4aa7df2b7" + integrity sha512-w1+iL/+idpHGNgWYKknY7uPA3EaVDgl4HT4ndkNM2ONr/MW3FTM3FLRpy6yDZ5YE3km372Ym9Vr/N28E3OI6Jg== + dependencies: + eslint-utils "^3.0.0" + requireindex "^1.2.0" + eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -8440,6 +8448,13 @@ eslint-utils@^2.1.0: dependencies: eslint-visitor-keys "^1.1.0" +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" From e431dacd166307d1f6dadafb5a899da32f19407d Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Sat, 11 Dec 2021 20:50:17 -0500 Subject: [PATCH 841/879] Bump ember-try from 1.4.0 to 2.0.0 --- package.json | 2 +- yarn.lock | 498 ++++++++++++++++----------------------------------- 2 files changed, 151 insertions(+), 349 deletions(-) diff --git a/package.json b/package.json index 77bab22be..d8c457687 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "ember-source": "~3.26.1", "ember-source-channel-url": "^3.0.0", "ember-template-lint": "^3.14.0", - "ember-try": "^1.0.0", + "ember-try": "^2.0.0", "escape-string-regexp": "^4.0.0", "eslint": "^7.32.0", "eslint-plugin-ember": "^8.1.0", diff --git a/yarn.lock b/yarn.lock index 550942b7c..4880fc76b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2467,10 +2467,17 @@ resolved "https://registry.yarnpkg.com/@simple-dom/void-map/-/void-map-1.4.0.tgz#f15f07568fe1076740407266aa5e6eac249bc78c" integrity sha512-VDhLEyVCbuhOBBgHol9ShzIv9O8UCzdXeH4FoXu2DOcu/nnvTjLTck+BgXsCLv5ynDiUdoqsREEVFnoyPpFKVw== -"@sindresorhus/is@^0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" - integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" "@types/acorn@^4.0.3": version "4.0.5" @@ -4129,11 +4136,6 @@ base64-arraybuffer@0.1.4: resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI= -base64-js@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.2.tgz#024f0f72afa25b75f9c0ee73cd4f55ec1bed9784" - integrity sha1-Ak8Pcq+iW3X5wO5zzU9V7Bvtl4Q= - base64-js@^1.0.2: version "1.3.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" @@ -4295,14 +4297,6 @@ boom@0.4.x: dependencies: hoek "0.9.x" -bops@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/bops/-/bops-0.0.3.tgz#c5cbf6fea8be7401ca5ea6d1679e6c4e8b407c79" - integrity sha1-xcv2/qi+dAHKXqbRZ55sTotAfHk= - dependencies: - base64-js "0.0.2" - to-utf8 "0.0.1" - bower-config@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/bower-config/-/bower-config-1.4.1.tgz#85fd9df367c2b8dbbd0caa4c5f2bad40cd84c2cc" @@ -5356,18 +5350,18 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -cacheable-request@^2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" - integrity sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0= +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== dependencies: - clone-response "1.0.2" - get-stream "3.0.0" - http-cache-semantics "3.8.1" - keyv "3.0.0" - lowercase-keys "1.0.0" - normalize-url "2.0.1" - responselike "1.0.2" + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" calculate-cache-key-for-tree@^1.1.0: version "1.2.3" @@ -5468,11 +5462,6 @@ capture-exit@^1.2.0: dependencies: rsvp "^3.3.3" -capture-stack-trace@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" - integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== - cardinal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-1.0.0.tgz#50e21c1b0aa37729f9377def196b5a9cec932ee9" @@ -5736,13 +5725,13 @@ cli-spinners@^2.5.0: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== -cli-table3@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" - integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== +cli-table3@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.0.tgz#b7b1bc65ca8e7b5cef9124e13dc2b21e2ce4faee" + integrity sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ== dependencies: object-assign "^4.1.0" - string-width "^2.1.1" + string-width "^4.2.0" optionalDependencies: colors "^1.1.2" @@ -5795,7 +5784,7 @@ clone-buffer@^1.0.0: resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= -clone-response@1.0.2: +clone-response@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= @@ -6181,13 +6170,6 @@ create-ecdh@^4.0.0: bn.js "^4.1.0" elliptic "^6.0.0" -create-error-class@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" - integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= - dependencies: - capture-stack-trace "^1.0.0" - create-hash@^1.1.0, create-hash@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" @@ -6441,6 +6423,13 @@ debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.1.0: dependencies: ms "^2.1.1" +debug@^4.3.2: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + debug@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" @@ -6492,6 +6481,11 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -6716,11 +6710,6 @@ dotenv@^1.2.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-1.2.0.tgz#7cd73e16e07f057c8072147a5bc3a8677f0ab5c6" integrity sha1-fNc+FuB/BXyAchR6W8OoZ38KtcY= -duplex@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/duplex/-/duplex-1.0.0.tgz#6abc5c16ec17e4c578578727126700590d3a2dda" - integrity sha1-arxcFuwX5MV4V4cnEmcAWQ06Ldo= - duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -7956,13 +7945,6 @@ ember-router-scroll@^4.0.2: ember-cli-babel "^7.26.6" ember-compatibility-helpers "^1.2.5" -ember-source-channel-url@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ember-source-channel-url/-/ember-source-channel-url-1.2.0.tgz#77eb9d0889e5f5370e6c70fcb2696c63ff4a34a1" - integrity sha512-CLClcHzVf+8GoFk4176R16nwXoel70bd7DKVAY6D8M0m5fJJhbTrAPYpDA0lY8A60HZo9j/s8A8LWiGh1YmdZg== - dependencies: - got "^8.0.1" - ember-source-channel-url@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ember-source-channel-url/-/ember-source-channel-url-3.0.0.tgz#bcd5be72c63fa0b8c390b3121783b462063e2a1b" @@ -8075,36 +8057,32 @@ ember-truth-helpers@^3.0.0: dependencies: ember-cli-babel "^7.22.1" -ember-try-config@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ember-try-config/-/ember-try-config-3.0.0.tgz#012d8c90cae9eb624e2b62040bf7e76a1aa58edc" - integrity sha512-pNwHS29O1ACczkrxBKRtDY0TzTb7uPnA5eHEe+4NF6qpLK5FVnL3EtgZ8+yVYtnm1If5mZ07rIubw45vaSek7w== +ember-try-config@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ember-try-config/-/ember-try-config-4.0.0.tgz#8dbdcc071e7acbcb34750b4ed7faf1ab009766f1" + integrity sha512-jAv7fqYJK7QYYekPc/8Nr7KOqDpv/asqM6F8xcRnbmf9UrD35BkSffY63qUuiD9e0aR5qiMNBIQzH8f65rGDqw== dependencies: - ember-source-channel-url "^1.0.1" - lodash "^4.6.1" - package-json "^4.0.1" - remote-git-tags "^2.0.0" - rsvp "^4.8.1" - semver "^5.5.0" + ember-source-channel-url "^3.0.0" + lodash "^4.17.20" + package-json "^6.5.0" + remote-git-tags "^3.0.0" + semver "^7.3.2" -ember-try@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ember-try/-/ember-try-1.4.0.tgz#be15965bd1727c27a65a78c4c8392f03763cc565" - integrity sha512-o0SoCH4K8umCf8etphla8FDygKfQGkwY+w47wEuYFVKaESrOZaK63ObnAK7DTKkjJU74Fss2abf+r+pAWpX43g== +ember-try@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ember-try/-/ember-try-2.0.0.tgz#2671c221f5a0335fa2c189d00db7146e2e72a1dd" + integrity sha512-2N7Vic45sbAegA5fhdfDjVbEVS4r+ze+tTQs2/wkY+8fC5yAGHfCM5ocyoTfBN5m7EhznC3AyMsOy4hLPzHFSQ== dependencies: - chalk "^2.4.2" - cli-table3 "^0.5.1" + chalk "^4.1.2" + cli-table3 "^0.6.0" core-object "^3.1.5" - debug "^4.1.1" - ember-try-config "^3.0.0" - execa "^1.0.0" - extend "^3.0.0" - fs-extra "^5.0.0" - promise-map-series "^0.2.1" - resolve "^1.10.1" - rimraf "^2.6.3" - rsvp "^4.7.0" - walk-sync "^1.1.3" + debug "^4.3.2" + ember-try-config "^4.0.0" + execa "^4.1.0" + fs-extra "^9.0.1" + resolve "^1.20.0" + rimraf "^3.0.2" + walk-sync "^2.2.0" ember-wormhole@^0.6.0: version "0.6.0" @@ -8114,11 +8092,6 @@ ember-wormhole@^0.6.0: ember-cli-babel "^7.22.1" ember-cli-htmlbars "^5.3.1" -emit-function@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/emit-function/-/emit-function-0.0.2.tgz#e3a50b3d61be1bf8ca88b924bf713157a5bec124" - integrity sha1-46ULPWG+G/jKiLkkv3ExV6W+wSQ= - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -8685,7 +8658,7 @@ execa@^3.0.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" -execa@^4.0.0: +execa@^4.0.0, execa@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== @@ -9554,11 +9527,6 @@ get-stdin@^8.0.0: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== -get-stream@3.0.0, get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= - get-stream@^2.0.0: version "2.3.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" @@ -9567,7 +9535,12 @@ get-stream@^2.0.0: object-assign "^4.0.1" pinkie-promise "^2.0.0" -get-stream@^4.0.0: +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^4.0.0, get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== @@ -9581,6 +9554,13 @@ get-stream@^5.0.0: dependencies: pump "^3.0.0" +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + get-stream@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" @@ -9611,61 +9591,16 @@ git-config-path@^2.0.0: resolved "https://registry.yarnpkg.com/git-config-path/-/git-config-path-2.0.0.tgz#62633d61af63af4405a5024efd325762f58a181b" integrity sha512-qc8h1KIQbJpp+241id3GuAtkdyJ+IK+LIVtkiFTRKRrmddDzs3SI9CvP1QYmWBFvm1I/PWRwj//of8bgAc0ltA== -git-fetch-pack@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/git-fetch-pack/-/git-fetch-pack-0.1.1.tgz#7703a32cf0db80f060d2766a34ac00d02cebcdf5" - integrity sha1-dwOjLPDbgPBg0nZqNKwA0CzrzfU= - dependencies: - bops "0.0.3" - emit-function "0.0.2" - git-packed-ref-parse "0.0.0" - through "~2.2.7" - git-hooks-list@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/git-hooks-list/-/git-hooks-list-1.0.2.tgz#b023b76872f00d81b353efd1458fb4a165035575" integrity sha512-C3c/FG6Pgh053+yK/CnNNYJo5mgCa3OeI+cPxPIl0tyMLm1mGfiV0NX0LrhnjVoX7dfkR78WyW2kvFVHvAlneg== -git-packed-ref-parse@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/git-packed-ref-parse/-/git-packed-ref-parse-0.0.0.tgz#b85046931f3e4a65679b5de54af3a5d3df372646" - integrity sha1-uFBGkx8+SmVnm13lSvOl0983JkY= - dependencies: - line-stream "0.0.0" - through "~2.2.7" - -git-read-pkt-line@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/git-read-pkt-line/-/git-read-pkt-line-0.0.8.tgz#494037854ed57bd90cd55676540d86ab0cb36caa" - integrity sha1-SUA3hU7Ve9kM1VZ2VA2GqwyzbKo= - dependencies: - bops "0.0.3" - through "~2.2.7" - git-repo-info@^2.0.0, git-repo-info@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-2.1.1.tgz#220ffed8cbae74ef8a80e3052f2ccb5179aed058" integrity sha512-8aCohiDo4jwjOwma4FmYFd3i97urZulL8XL24nIPxuE+GZnfsAyy/g2Shqx6OjUiFKUXZM+Yy+KHnOmmA3FVcg== -git-transport-protocol@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/git-transport-protocol/-/git-transport-protocol-0.1.0.tgz#99f4dd6389b9161eded74a9e617d6ba5ed0a6c2c" - integrity sha1-mfTdY4m5Fh7e10qeYX1rpe0KbCw= - dependencies: - duplex "~1.0.0" - emit-function "0.0.2" - git-read-pkt-line "0.0.8" - git-write-pkt-line "0.1.0" - through "~2.2.7" - -git-write-pkt-line@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/git-write-pkt-line/-/git-write-pkt-line-0.1.0.tgz#a84c1856c09011908389b2f06f911d91f6394694" - integrity sha1-qEwYVsCQEZCDibLwb5EdkfY5RpQ= - dependencies: - bops "0.0.3" - through "~2.2.7" - glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -9779,45 +9714,22 @@ good-listener@^1.2.2: dependencies: delegate "^3.1.2" -got@^6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" - integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== dependencies: - create-error-class "^3.0.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - unzip-response "^2.0.1" - url-parse-lax "^1.0.0" - -got@^8.0.1: - version "8.3.2" - resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" - integrity sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw== - dependencies: - "@sindresorhus/is" "^0.7.0" - cacheable-request "^2.1.1" + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" decompress-response "^3.3.0" duplexer3 "^0.1.4" - get-stream "^3.0.0" - into-stream "^3.1.0" - is-retry-allowed "^1.1.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - mimic-response "^1.0.0" - p-cancelable "^0.4.0" - p-timeout "^2.0.1" - pify "^3.0.0" - safe-buffer "^5.1.1" - timed-out "^4.0.1" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" - url-to-options "^1.0.1" graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: version "4.2.3" @@ -9900,11 +9812,6 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbol-support-x@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" - integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== - has-symbols@^1.0.0, has-symbols@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" @@ -9915,13 +9822,6 @@ has-symbols@^1.0.2: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== -has-to-string-tag-x@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" - integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== - dependencies: - has-symbol-support-x "^1.4.1" - has-tostringtag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" @@ -10142,10 +10042,10 @@ htmlparser2@~3.8.1: entities "1.0" readable-stream "1.1" -http-cache-semantics@3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" - integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== +http-cache-semantics@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== http-errors@1.7.2: version "1.7.2" @@ -10662,21 +10562,11 @@ is-obj@^1.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= -is-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" - integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= - is-plain-obj@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== -is-plain-obj@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -10694,11 +10584,6 @@ is-promise@^2.1.0: resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= -is-redirect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= - is-reference@^1.1.0: version "1.1.4" resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.1.4.tgz#3f95849886ddb70256a3e6d062b1a68c13c51427" @@ -10721,17 +10606,12 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" - integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== - is-shared-array-buffer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== -is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: +is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -10870,14 +10750,6 @@ istextorbinary@^2.5.1: editions "^2.2.0" textextensions "^2.5.0" -isurl@^1.0.0-alpha5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== - dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" - jimp@^0.2.21: version "0.2.28" resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.2.28.tgz#dd529a937190f42957a7937d1acc3a7762996ea2" @@ -11182,10 +11054,10 @@ kew@^0.7.0: resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" integrity sha1-edk9LTM2PW/dKXCzNdkUGtWR15s= -keyv@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373" - integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA== +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== dependencies: json-buffer "3.0.0" @@ -11252,13 +11124,6 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -line-stream@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/line-stream/-/line-stream-0.0.0.tgz#888b7cc7951c6a05ce4d696dd1e6b8262371bb45" - integrity sha1-iIt8x5UcagXOTWlt0ea4JiNxu0U= - dependencies: - through "~2.2.0" - linkify-it@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" @@ -11697,7 +11562,7 @@ lodash.values@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c= -lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1, lodash@^4.7.0: +lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -11739,16 +11604,16 @@ lower-case@^2.0.1: dependencies: tslib "^1.10.0" -lowercase-keys@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" - integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY= - -lowercase-keys@^1.0.0: +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -12117,7 +11982,7 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-response@^1.0.0: +mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== @@ -12304,6 +12169,11 @@ ms@2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" @@ -12516,14 +12386,10 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= -normalize-url@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" - integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw== - dependencies: - prepend-http "^2.0.0" - query-string "^5.0.1" - sort-keys "^2.0.0" +normalize-url@^4.1.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== normalize.css@^8.0.1: version "8.0.1" @@ -12863,10 +12729,10 @@ osenv@^0.1.3, osenv@^0.1.5: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -p-cancelable@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" - integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ== +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== p-finally@^1.0.0: version "1.0.0" @@ -12925,13 +12791,6 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" -p-timeout@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" - integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA== - dependencies: - p-finally "^1.0.0" - p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" @@ -12942,15 +12801,15 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -package-json@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" - integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= +package-json@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== dependencies: - got "^6.7.1" - registry-auth-token "^3.0.1" - registry-url "^3.0.3" - semver "^5.1.0" + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" pad-start@^1.0.2: version "1.0.2" @@ -13476,11 +13335,6 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - prepend-http@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" @@ -13675,15 +13529,6 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== -query-string@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" - integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== - dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -13760,7 +13605,7 @@ raw-body@~1.1.0: bytes "1" string_decoder "0.10" -rc@^1.0.1, rc@^1.1.6: +rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -14006,20 +13851,19 @@ regexpu-core@^4.7.1: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.2.0" -registry-auth-token@^3.0.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" - integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== +registry-auth-token@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" + integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== dependencies: - rc "^1.1.6" - safe-buffer "^5.0.1" + rc "^1.2.8" -registry-url@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" - integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== dependencies: - rc "^1.0.1" + rc "^1.2.8" regjsgen@^0.2.0: version "0.2.0" @@ -14045,13 +13889,10 @@ regjsparser@^0.6.4: dependencies: jsesc "~0.5.0" -remote-git-tags@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/remote-git-tags/-/remote-git-tags-2.0.0.tgz#1152f39cf8b5268ae0e4307636ef741ec341664c" - integrity sha1-EVLznPi1Jorg5DB2Nu90HsNBZkw= - dependencies: - git-fetch-pack "^0.1.1" - git-transport-protocol "^0.1.0" +remote-git-tags@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/remote-git-tags/-/remote-git-tags-3.0.0.tgz#424f8ec2cdea00bb5af1784a49190f25e16983c3" + integrity sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w== remove-trailing-separator@^1.0.1: version "1.1.0" @@ -14245,7 +14086,7 @@ resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.1 dependencies: path-parse "^1.0.6" -responselike@1.0.2: +responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= @@ -14500,7 +14341,7 @@ select@^1.1.2: resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= -"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -14510,7 +14351,7 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -14800,13 +14641,6 @@ socket.io@^2.1.0: socket.io-client "2.4.0" socket.io-parser "~3.4.0" -sort-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" - integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= - dependencies: - is-plain-obj "^1.0.0" - sort-object-keys@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.3.tgz#bff833fe85cab147b34742e45863453c1e190b45" @@ -15078,11 +14912,6 @@ stream-to@~0.2.0: resolved "https://registry.yarnpkg.com/stream-to/-/stream-to-0.2.2.tgz#84306098d85fdb990b9fa300b1b3ccf55e8ef01d" integrity sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0= -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= - string-template@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" @@ -15097,7 +14926,7 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -15545,21 +15374,11 @@ through@^2.3.6, through@^2.3.8: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -through@~2.2.0, through@~2.2.7: - version "2.2.7" - resolved "https://registry.yarnpkg.com/through/-/through-2.2.7.tgz#6e8e21200191d4eb6a99f6f010df46aa1c6eb2bd" - integrity sha1-bo4hIAGR1OtqmfbwEN9Gqhxusr0= - time-zone@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d" integrity sha1-mcW/VZWJZq9tBtg73zgA3IL67F0= -timed-out@^4.0.0, timed-out@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= - timers-browserify@^2.0.4: version "2.0.11" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" @@ -15673,6 +15492,11 @@ to-object-path@^0.3.0: dependencies: kind-of "^3.0.2" +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" @@ -15698,11 +15522,6 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" -to-utf8@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/to-utf8/-/to-utf8-0.0.1.tgz#d17aea72ff2fba39b9e43601be7b3ff72e089852" - integrity sha1-0Xrqcv8vujm55DYBvns/9y4ImFI= - toidentifier@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" @@ -15981,11 +15800,6 @@ untildify@^2.1.0: dependencies: os-homedir "^1.0.0" -unzip-response@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" - integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= - upath@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" @@ -16003,13 +15817,6 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= - dependencies: - prepend-http "^1.0.1" - url-parse-lax@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" @@ -16024,11 +15831,6 @@ url-regex@^3.0.0: dependencies: ip-regex "^1.0.1" -url-to-options@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= - url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" From 45077dee7965424bf13c958db2ef2e88eb46d172 Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Sat, 11 Dec 2021 21:08:44 -0500 Subject: [PATCH 842/879] Disable Ember v4 scenarios to make CI green --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b8cd12598..c81119276 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -59,9 +59,9 @@ jobs: try-scenario: - ember-lts-3.20 - ember-lts-3.24 - - ember-release - - ember-beta - - ember-canary + #- ember-release + #- ember-beta + #- ember-canary - ember-classic - ember-default-with-jquery #- embroider-safe From 48fbbe5c4353a48ea03bfaa8fd59c26b17edeacd Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Sat, 11 Dec 2021 21:26:53 -0500 Subject: [PATCH 843/879] Remove unused helper reg-exp-from-string and escape-string-regexp devDependency --- package.json | 1 - tests/helpers/reg-exp-from-string.js | 5 ----- 2 files changed, 6 deletions(-) delete mode 100644 tests/helpers/reg-exp-from-string.js diff --git a/package.json b/package.json index 31cee8efd..fc3c8bd70 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,6 @@ "ember-source-channel-url": "^3.0.0", "ember-template-lint": "^3.14.0", "ember-try": "^2.0.0", - "escape-string-regexp": "^4.0.0", "eslint": "^7.32.0", "eslint-plugin-ember": "^8.1.0", "eslint-plugin-node": "^11.1.0", diff --git a/tests/helpers/reg-exp-from-string.js b/tests/helpers/reg-exp-from-string.js deleted file mode 100644 index 76251297d..000000000 --- a/tests/helpers/reg-exp-from-string.js +++ /dev/null @@ -1,5 +0,0 @@ -import escape from 'escape-string-regexp'; - -export default function(str) { - return new RegExp(escape(str)); -} From 91faf9ff06d76a6e1e80965196e487c7384d885d Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Sat, 11 Dec 2021 21:30:32 -0500 Subject: [PATCH 844/879] Bump @embroider/macros from 0.40.0 to 0.41.0 We can't go beyond 0.41.0 as Node 10 support was dropped in v0.42.0 --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 31cee8efd..64afa6ca7 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "prepare": "./scripts/link.sh" }, "dependencies": { - "@embroider/macros": "^0.40.0", + "@embroider/macros": "^0.41.0", "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^3.0.3", "broccoli-merge-trees": "^4.2.0", diff --git a/yarn.lock b/yarn.lock index fc7dff422..f2fc1b3d8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1875,22 +1875,22 @@ resolve "^1.8.1" semver "^7.3.2" -"@embroider/macros@^0.40.0": - version "0.40.0" - resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.40.0.tgz#f58763b4cfb9b4089679b478a28627595341bc5a" - integrity sha512-ygChvFoebSi/N8b+A+XFncd454gLYBYHancrtY0AE/h6Y1HouoqQvji/IfaLisGoeuwUWuI9rCBv97COweu/rA== +"@embroider/macros@^0.41.0": + version "0.41.0" + resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.41.0.tgz#3e78b6f388d7229906abf4c75edfff8bb0208aca" + integrity sha512-QISzwEEfLsskZeL0jyZDs1RoQSotwBWj+4upTogNHuxQP5j/9H3IMG/3QB1gh8GEpbudATb/cS4NDYK3UBxufw== dependencies: - "@embroider/shared-internals" "0.40.0" + "@embroider/shared-internals" "0.41.0" assert-never "^1.1.0" ember-cli-babel "^7.23.0" lodash "^4.17.10" resolve "^1.8.1" semver "^7.3.2" -"@embroider/shared-internals@0.40.0": - version "0.40.0" - resolved "https://registry.yarnpkg.com/@embroider/shared-internals/-/shared-internals-0.40.0.tgz#2f768c60f4f35ba5f9228f046f70324851e8bfe2" - integrity sha512-Ovr/i0Qgn6W6jdGXMvYJKlRoRpyBY9uhYozDSFKlBjeEmRJ0Plp7OST41+O5Td6Pqp+Rv2jVSnGzhA/MpC++NQ== +"@embroider/shared-internals@0.41.0": + version "0.41.0" + resolved "https://registry.yarnpkg.com/@embroider/shared-internals/-/shared-internals-0.41.0.tgz#2553f026d4f48ea1fd11235501feb63bf49fa306" + integrity sha512-fiqUVB6cfh2UBEFE4yhT5EzagkZ1Q26+OhBV0nJszFEJZx4DqVIb3pxSSZ8P+HhpxuJsQ2XpMA/j02ZPFZfbdQ== dependencies: ember-rfc176-data "^0.3.17" fs-extra "^7.0.1" From 3e174042c50b2b4f62c86b47afd835c5ece2295d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Dec 2021 02:35:55 +0000 Subject: [PATCH 845/879] Bump ws from 7.4.4 to 7.4.6 Bumps [ws](https://github.com/websockets/ws) from 7.4.4 to 7.4.6. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/7.4.4...7.4.6) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index fc7dff422..105d6c9d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16266,9 +16266,9 @@ write-file-atomic@^2.0.0: signal-exit "^3.0.2" ws@^7.4.4, ws@~7.4.2: - version "7.4.4" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz#383bc9742cb202292c9077ceab6f6047b17f2d59" - integrity sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw== + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== xdg-basedir@^3.0.0: version "3.0.0" From ab54a5ffe5ff673c2478010ba5845240063c848b Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Sat, 11 Dec 2021 22:30:05 -0500 Subject: [PATCH 846/879] Update Build Status badge: Travis -> GH Actions --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9c506f070..69ece7552 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Ember CLI Mirage -[![Build Status](https://travis-ci.org/miragejs/ember-cli-mirage.svg?branch=master)](https://travis-ci.org/miragejs/ember-cli-mirage) +[![Build Status](https://github.com/miragejs/ember-cli-mirage/actions/workflows/ci.yml/badge.svg)](https://github.com/miragejs/ember-cli-mirage/actions/workflows/ci.yml) [![npm version](https://badge.fury.io/js/ember-cli-mirage.svg)](http://badge.fury.io/js/ember-cli-mirage) [![Ember Observer Score](http://emberobserver.com/badges/ember-cli-mirage.svg)](http://emberobserver.com/addons/ember-cli-mirage) From 7d29ab6634b88bc2d233f4e03652cc9d7e66630a Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Sat, 11 Dec 2021 22:38:07 -0500 Subject: [PATCH 847/879] Use @ember/destroyable for mirage server shutdown --- .../ember-cli-mirage-autostart.js | 28 +++++-------------- package.json | 1 + 2 files changed, 8 insertions(+), 21 deletions(-) diff --git a/addon/instance-initializers/ember-cli-mirage-autostart.js b/addon/instance-initializers/ember-cli-mirage-autostart.js index a1bae1952..10af9e738 100644 --- a/addon/instance-initializers/ember-cli-mirage-autostart.js +++ b/addon/instance-initializers/ember-cli-mirage-autostart.js @@ -1,19 +1,7 @@ -import EmberObject from '@ember/object'; +import { registerDestructor } from '@ember/destroyable'; import getRfc232TestContext from '../get-rfc232-test-context'; import startMirage from '../start-mirage'; -// An object we can register with the container to ensure that mirage is shut -// down when the application is destroyed -const MirageShutdown = EmberObject.extend({ - testContext: null, - - willDestroy() { - let testContext = this.testContext; - testContext.server.shutdown(); - delete testContext.server; - } -}); - /** If we are running an rfc232/rfc268 test then we want to support the `autostart` configuration option, which auto-starts mirage before the test @@ -32,15 +20,13 @@ export function initialize(appInstance) { } = appInstance.resolveRegistration('config:environment'); if (autostart) { - let server = startMirage(appInstance); - testContext.server = server; + testContext.server = startMirage(appInstance); - // To ensure that the server is shut down when the application is - // destroyed, register and create a singleton object that shuts the server - // down in its willDestroy() hook. - appInstance.register('mirage:shutdown', MirageShutdown); - let shutdown = appInstance.lookup('mirage:shutdown'); - shutdown.set('testContext', testContext); + // Ensure that the server is shut down when the application is destroyed. + registerDestructor(appInstance, () => { + testContext.server.shutdown(); + delete testContext.server; + }); } } } diff --git a/package.json b/package.json index 64afa6ca7..cfbbe4e8a 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "broccoli-merge-trees": "^4.2.0", "ember-auto-import": "^1.2.19", "ember-cli-babel": "^7.5.0", + "ember-destroyable-polyfill": "^2.0.3", "ember-get-config": "0.2.4 - 0.5.0", "ember-inflector": "^2.0.0 || ^3.0.0 || ^4.0.0", "lodash-es": "^4.17.11", From 3adcdd5947346fa7235bf0caf2e4478573ea12f1 Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Sat, 11 Dec 2021 22:56:53 -0500 Subject: [PATCH 848/879] Bump jsdom from 16.2.2 to 19.0.0 --- package.json | 2 +- yarn.lock | 188 ++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 180 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index e32881e5a..48c6684fb 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,7 @@ "faker": "^5.1.0", "fastboot": "^3.0.2", "js-yaml": "^4.0.0", - "jsdom": "^16.2.2", + "jsdom": "^19.0.0", "loader.js": "^4.7.0", "npm-run-all": "^4.1.5", "qunit": "^2.17.2", diff --git a/yarn.lock b/yarn.lock index f2fc1b3d8..18764455f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2479,6 +2479,11 @@ dependencies: defer-to-connect "^1.0.1" +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + "@types/acorn@^4.0.3": version "4.0.5" resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.5.tgz#e29fdf884695e77be4e99e67d748f5147255752d" @@ -2992,11 +2997,23 @@ acorn@^8.1.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.1.0.tgz#52311fd7037ae119cbb134309e901aa46295b3fe" integrity sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA== +acorn@^8.5.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.6.0.tgz#e3692ba0eb1a0c83eaa4f37f5fa7368dd7142895" + integrity sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw== + after@0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" @@ -5859,7 +5876,7 @@ colors@^1.1.2, colors@^1.3.2, colors@^1.4.0: resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -6300,6 +6317,11 @@ cssom@^0.4.4: resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== + "cssstyle@>= 0.2.29 < 0.3.0": version "0.2.37" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" @@ -6352,6 +6374,15 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" +data-urls@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.1.tgz#597fc2ae30f8bc4dbcf731fcd1b1954353afc6f8" + integrity sha512-Ds554NeT5Gennfoo9KN50Vh6tpgtvYEwraYjejXnyTpu1C7oXKxdFk75REooENHE8ndTVOJuv+BEs4/J/xcozw== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^3.0.0" + whatwg-url "^10.0.0" + date-fns@^2.26.0: version "2.27.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.27.0.tgz#e1ff3c3ddbbab8a2eaadbb6106be2929a5a2d92b" @@ -6371,6 +6402,13 @@ debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.3. dependencies: ms "2.0.0" +debug@4, debug@^4.3.2: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + debug@^3.0.1, debug@^3.1.0, debug@^3.1.1: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -6385,13 +6423,6 @@ debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.1.0: dependencies: ms "^2.1.1" -debug@^4.3.2: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - debug@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" @@ -6409,6 +6440,11 @@ decimal.js@^10.2.1: resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== +decimal.js@^10.3.1: + version "10.3.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" + integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -6622,6 +6658,13 @@ domexception@^2.0.1: dependencies: webidl-conversions "^5.0.0" +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== + dependencies: + webidl-conversions "^7.0.0" + domhandler@2.3: version "2.3.0" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" @@ -9200,6 +9243,15 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@~0.1.0: version "0.1.4" resolved "https://registry.yarnpkg.com/form-data/-/form-data-0.1.4.tgz#91abd788aba9702b1aabfa8bc01031a2ac9e3b12" @@ -9974,6 +10026,13 @@ html-encoding-sniffer@^2.0.1: dependencies: whatwg-encoding "^1.0.5" +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== + dependencies: + whatwg-encoding "^2.0.0" + html-entities@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488" @@ -10039,6 +10098,15 @@ http-errors@~1.7.2: resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + http-proxy@^1.13.1, http-proxy@^1.17.0: version "1.18.1" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" @@ -10071,6 +10139,14 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" @@ -10096,6 +10172,13 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -10544,6 +10627,11 @@ is-potential-custom-element-name@^1.0.0: resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" @@ -10849,6 +10937,39 @@ jsdom@^16.2.2, jsdom@^16.4.0: ws "^7.4.4" xml-name-validator "^3.0.0" +jsdom@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-19.0.0.tgz#93e67c149fe26816d38a849ea30ac93677e16b6a" + integrity sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A== + dependencies: + abab "^2.0.5" + acorn "^8.5.0" + acorn-globals "^6.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.1" + decimal.js "^10.3.1" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^3.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^10.0.0" + ws "^8.2.3" + xml-name-validator "^4.0.0" + jsdom@^7.0.2: version "7.2.2" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-7.2.2.tgz#40b402770c2bda23469096bee91ab675e3b1fc6e" @@ -14225,7 +14346,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -15523,6 +15644,13 @@ tr46@^2.0.2: dependencies: punycode "^2.1.1" +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== + dependencies: + punycode "^2.1.1" + tr46@~0.0.1: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -15954,6 +16082,13 @@ w3c-xmlserializer@^2.0.0: dependencies: xml-name-validator "^3.0.0" +w3c-xmlserializer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz#06cdc3eefb7e4d0b20a560a5a3aeb0d2d9a65923" + integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg== + dependencies: + xml-name-validator "^4.0.0" + walk-sync@^0.2.5: version "0.2.7" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.2.7.tgz#b49be4ee6867657aeb736978b56a29d10fa39969" @@ -16055,6 +16190,11 @@ webidl-conversions@^6.1.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + webpack-sources@^1.1.0, webpack-sources@^1.4.1: version "1.4.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" @@ -16113,6 +16253,13 @@ whatwg-encoding@^1.0.5: dependencies: iconv-lite "0.4.24" +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + dependencies: + iconv-lite "0.6.3" + whatwg-fetch@^3.4.0: version "3.5.0" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.5.0.tgz#605a2cd0a7146e5db141e29d1c62ab84c0c4c868" @@ -16123,6 +16270,11 @@ whatwg-mimetype@^2.3.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + whatwg-url-compat@~0.6.5: version "0.6.5" resolved "https://registry.yarnpkg.com/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz#00898111af689bb097541cd5a45ca6c8798445bf" @@ -16130,6 +16282,14 @@ whatwg-url-compat@~0.6.5: dependencies: tr46 "~0.0.1" +whatwg-url@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-10.0.0.tgz#37264f720b575b4a311bd4094ed8c760caaa05da" + integrity sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + whatwg-url@^8.0.0, whatwg-url@^8.5.0: version "8.5.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.5.0.tgz#7752b8464fc0903fec89aa9846fc9efe07351fd3" @@ -16270,6 +16430,11 @@ ws@^7.4.4, ws@~7.4.2: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz#383bc9742cb202292c9077ceab6f6047b17f2d59" integrity sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw== +ws@^8.2.3: + version "8.3.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.3.0.tgz#7185e252c8973a60d57170175ff55fdbd116070d" + integrity sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw== + xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" @@ -16295,6 +16460,11 @@ xml-name-validator@^3.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + xml-parse-from-string@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28" From 39d5cc5147229a3ed5676e65fe2eb7d20410cf52 Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Sat, 11 Dec 2021 23:00:43 -0500 Subject: [PATCH 849/879] Bump ember-inflector from 4.0.0 to 4.0.2 --- package.json | 2 +- yarn.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index e32881e5a..c037025f5 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "ember-cli-babel": "^7.5.0", "ember-destroyable-polyfill": "^2.0.3", "ember-get-config": "0.2.4 - 0.5.0", - "ember-inflector": "^2.0.0 || ^3.0.0 || ^4.0.0", + "ember-inflector": "^2.0.0 || ^3.0.0 || ^4.0.2", "lodash-es": "^4.17.11", "miragejs": "^0.1.31" }, diff --git a/yarn.lock b/yarn.lock index f2fc1b3d8..89608e079 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7002,7 +7002,7 @@ ember-cli-babel@^6.11.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.6.0, ember- ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.2, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.26.3, ember-cli-babel@^7.26.6, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.2, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.26.3, ember-cli-babel@^7.26.5, ember-cli-babel@^7.26.6, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: version "7.26.6" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.6.tgz#322fbbd3baad9dd99e3276ff05bc6faef5e54b39" integrity sha512-040svtfj2RC35j/WMwdWJFusZaXmNoytLAMyBDGLMSlRvznudTxZjGlPV6UupmtTBApy58cEF8Fq4a+COWoEmQ== @@ -7742,12 +7742,12 @@ ember-href-to@^4.0.0: dependencies: ember-cli-babel "^7.13.2" -"ember-inflector@^2.0.0 || ^3.0.0 || ^4.0.0": - version "4.0.1" - resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-4.0.1.tgz#e0aa9e39119156a278c80bb8cdec8462ecb8e6ab" - integrity sha512-D14nH2wVMp13ciOONcHMXwdL/IoMBSDXsGObF2rsQX7F8vGjwp+jnSNzZuGjjIvlBFQydOJ+R2n86J2e8HRTQA== +"ember-inflector@^2.0.0 || ^3.0.0 || ^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-4.0.2.tgz#4494f1a5f61c1aca7702d59d54024cc92211d8ec" + integrity sha512-+oRstEa52mm0jAFzhr51/xtEWpCEykB3SEBr7vUg8YnXUZJ5hKNBppP938q8Zzr9XfJEbzrtDSGjhKwJCJv6FQ== dependencies: - ember-cli-babel "^7.23.0" + ember-cli-babel "^7.26.5" ember-inflector@^3.0.1: version "3.0.1" From 327b810a13d8dbb11e87b0ff34dcd37e624e4952 Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Sat, 11 Dec 2021 23:02:10 -0500 Subject: [PATCH 850/879] Bump @ember/jquery from 1.1.0 to 2.0.0 --- package.json | 2 +- yarn.lock | 23 +++++++++++------------ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index e32881e5a..aab33a974 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "miragejs": "^0.1.31" }, "devDependencies": { - "@ember/jquery": "^1.1.0", + "@ember/jquery": "^2.0.0", "@ember/optional-features": "^2.0.0", "@ember/test-helpers": "^2.6.0", "@glimmer/component": "^1.0.4", diff --git a/yarn.lock b/yarn.lock index f2fc1b3d8..5bbbf631f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1709,17 +1709,16 @@ resolved "https://registry.yarnpkg.com/@ember/edition-utils/-/edition-utils-1.2.0.tgz#a039f542dc14c8e8299c81cd5abba95e2459cfa6" integrity sha512-VmVq/8saCaPdesQmftPqbFtxJWrzxNGSQ+e8x8LLe3Hjm36pJ04Q8LeORGZkAeOhldoUX9seLGmSaHeXkIqoog== -"@ember/jquery@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@ember/jquery/-/jquery-1.1.0.tgz#33d062610a5ceaa5c5c8a3187f870d47d6595940" - integrity sha512-zePT3LiK4/2bS4xafrbOlwoLJrDFseOZ95OOuVDyswv8RjFL+9lar+uxX6+jxRb0w900BcQSWP/4nuFSK6HXXw== +"@ember/jquery@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@ember/jquery/-/jquery-2.0.0.tgz#083a1de32333b3fc938fad246a6f3ea7eefe5b10" + integrity sha512-f8+WNqzXBNxl96jo0IwJBO5QCi0bnUlba9I7WbZcGhgnzszC76INJkw6l8UepZ1PMGG1H1wYpoIGoBBp5ZVmFA== dependencies: - broccoli-funnel "^2.0.2" - broccoli-merge-trees "^3.0.2" - ember-cli-babel "^7.11.1" - ember-cli-version-checker "^3.1.3" - jquery "^3.4.1" - resolve "^1.11.1" + broccoli-funnel "^3.0.6" + broccoli-merge-trees "^4.2.0" + ember-cli-babel "^7.26.6" + jquery "^3.5.0" + resolve "^1.15.1" "@ember/optional-features@^2.0.0": version "2.0.0" @@ -10777,7 +10776,7 @@ jquery-deferred@^0.3.0: resolved "https://registry.yarnpkg.com/jquery-deferred/-/jquery-deferred-0.3.1.tgz#596eca1caaff54f61b110962b23cafea74c35355" integrity sha1-WW7KHKr/VPYbEQlisjyv6nTDU1U= -jquery@^3.4.1, jquery@^3.5.1: +jquery@^3.5.0, jquery@^3.5.1: version "3.6.0" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470" integrity sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw== @@ -14036,7 +14035,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.7, resolve@^1.20.0: +resolve@^1.1.7, resolve@^1.15.1, resolve@^1.20.0: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== From b041faab272ac8fdeb5a0349679ca7d870731893 Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Sat, 11 Dec 2021 22:04:10 -0500 Subject: [PATCH 851/879] Bump eslint-plugin-ember from 8.1.0 to 10.5.8 --- package.json | 2 +- test-projects/01-basic-app/app/app.js | 16 ++++++------ .../app/pods/crud-demo/controller.js | 5 +++- test-projects/01-basic-app/app/resolver.js | 3 --- test-projects/01-basic-app/app/router.js | 12 ++++----- test-projects/01-basic-app/package.json | 1 + .../02-app-that-excludes-mirage/app/app.js | 16 ++++++------ .../app/resolver.js | 3 --- .../02-app-that-excludes-mirage/app/router.js | 15 +++++------ tests/dummy/app/app.js | 16 ++++++------ tests/dummy/app/models/address.js | 4 +-- tests/dummy/app/models/comment.js | 2 -- tests/dummy/app/models/post.js | 4 --- tests/dummy/app/models/word-smith.js | 14 +++++------ tests/dummy/app/pods/application/route.js | 4 +-- tests/dummy/app/pods/blog/detail/route.js | 4 +-- tests/dummy/app/pods/blog/index/route.js | 4 +-- tests/dummy/app/pods/docs/index/route.js | 4 +-- tests/dummy/app/resolver.js | 3 --- tests/dummy/app/router.js | 12 ++++----- tests/dummy/app/serializers/address.js | 6 ++--- tests/dummy/app/serializers/application.js | 8 +++--- tests/dummy/app/serializers/word-smith.js | 6 ++--- yarn.lock | 25 ++++++++++++++++--- 24 files changed, 90 insertions(+), 99 deletions(-) delete mode 100644 test-projects/01-basic-app/app/resolver.js delete mode 100644 test-projects/02-app-that-excludes-mirage/app/resolver.js delete mode 100644 tests/dummy/app/resolver.js diff --git a/package.json b/package.json index e32881e5a..1381a48f3 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,7 @@ "ember-template-lint": "^3.14.0", "ember-try": "^2.0.0", "eslint": "^7.32.0", - "eslint-plugin-ember": "^8.1.0", + "eslint-plugin-ember": "^10.5.8", "eslint-plugin-node": "^11.1.0", "eslint-plugin-qunit": "^7.1.0", "faker": "^5.1.0", diff --git a/test-projects/01-basic-app/app/app.js b/test-projects/01-basic-app/app/app.js index b3b2bd677..e9953bf80 100644 --- a/test-projects/01-basic-app/app/app.js +++ b/test-projects/01-basic-app/app/app.js @@ -1,14 +1,12 @@ import Application from '@ember/application'; -import Resolver from './resolver'; +import Resolver from 'ember-resolver'; import loadInitializers from 'ember-load-initializers'; -import config from './config/environment'; +import config from 'basic-app/config/environment'; -const App = Application.extend({ - modulePrefix: config.modulePrefix, - podModulePrefix: config.podModulePrefix, - Resolver -}); +export default class App extends Application { + modulePrefix = config.modulePrefix; + podModulePrefix = config.podModulePrefix; + Resolver = Resolver; +} loadInitializers(App, config.modulePrefix); - -export default App; diff --git a/test-projects/01-basic-app/app/pods/crud-demo/controller.js b/test-projects/01-basic-app/app/pods/crud-demo/controller.js index ad943f340..55a73d8c4 100644 --- a/test-projects/01-basic-app/app/pods/crud-demo/controller.js +++ b/test-projects/01-basic-app/app/pods/crud-demo/controller.js @@ -1,11 +1,14 @@ import Controller from '@ember/controller'; import { inject as service } from '@ember/service'; import { action } from '@ember/object'; +import { tracked } from '@glimmer/tracking'; export default class extends Controller { @service store; + @tracked newName; + @action createUser (event) { event.preventDefault(); @@ -15,7 +18,7 @@ export default class extends Controller { .createRecord('user', { name }) .save() .then(() => { - this.set('newName', ''); + this.newName = ''; }); } diff --git a/test-projects/01-basic-app/app/resolver.js b/test-projects/01-basic-app/app/resolver.js deleted file mode 100644 index 2fb563d6c..000000000 --- a/test-projects/01-basic-app/app/resolver.js +++ /dev/null @@ -1,3 +0,0 @@ -import Resolver from 'ember-resolver'; - -export default Resolver; diff --git a/test-projects/01-basic-app/app/router.js b/test-projects/01-basic-app/app/router.js index d21c8aad9..aebed7526 100644 --- a/test-projects/01-basic-app/app/router.js +++ b/test-projects/01-basic-app/app/router.js @@ -1,14 +1,12 @@ import EmberRouter from '@ember/routing/router'; -import config from './config/environment'; +import config from 'basic-app/config/environment'; -const Router = EmberRouter.extend({ - location: config.locationType, - rootURL: config.rootURL -}); +export default class Router extends EmberRouter { + location = config.locationType; + rootURL = config.rootURL; +} Router.map(function() { this.route('module-count'); this.route('crud-demo'); }); - -export default Router; diff --git a/test-projects/01-basic-app/package.json b/test-projects/01-basic-app/package.json index 7f489f18d..fa2bc65ce 100644 --- a/test-projects/01-basic-app/package.json +++ b/test-projects/01-basic-app/package.json @@ -20,6 +20,7 @@ "devDependencies": { "@ember/jquery": "*", "@ember/test-helpers": "*", + "@glimmer/tracking": "*", "broccoli-asset-rev": "*", "ember-ajax": "*", "ember-auto-import": "*", diff --git a/test-projects/02-app-that-excludes-mirage/app/app.js b/test-projects/02-app-that-excludes-mirage/app/app.js index b3b2bd677..e9953bf80 100644 --- a/test-projects/02-app-that-excludes-mirage/app/app.js +++ b/test-projects/02-app-that-excludes-mirage/app/app.js @@ -1,14 +1,12 @@ import Application from '@ember/application'; -import Resolver from './resolver'; +import Resolver from 'ember-resolver'; import loadInitializers from 'ember-load-initializers'; -import config from './config/environment'; +import config from 'basic-app/config/environment'; -const App = Application.extend({ - modulePrefix: config.modulePrefix, - podModulePrefix: config.podModulePrefix, - Resolver -}); +export default class App extends Application { + modulePrefix = config.modulePrefix; + podModulePrefix = config.podModulePrefix; + Resolver = Resolver; +} loadInitializers(App, config.modulePrefix); - -export default App; diff --git a/test-projects/02-app-that-excludes-mirage/app/resolver.js b/test-projects/02-app-that-excludes-mirage/app/resolver.js deleted file mode 100644 index 2fb563d6c..000000000 --- a/test-projects/02-app-that-excludes-mirage/app/resolver.js +++ /dev/null @@ -1,3 +0,0 @@ -import Resolver from 'ember-resolver'; - -export default Resolver; diff --git a/test-projects/02-app-that-excludes-mirage/app/router.js b/test-projects/02-app-that-excludes-mirage/app/router.js index d0bb00952..f602c5f68 100644 --- a/test-projects/02-app-that-excludes-mirage/app/router.js +++ b/test-projects/02-app-that-excludes-mirage/app/router.js @@ -1,12 +1,9 @@ import EmberRouter from '@ember/routing/router'; -import config from './config/environment'; +import config from 'basic-app/config/environment'; -const Router = EmberRouter.extend({ - location: config.locationType, - rootURL: config.rootURL -}); +export default class Router extends EmberRouter { + location = config.locationType; + rootURL = config.rootURL; +} -Router.map(function() { -}); - -export default Router; +Router.map(function() {}); diff --git a/tests/dummy/app/app.js b/tests/dummy/app/app.js index b3b2bd677..523bad60c 100644 --- a/tests/dummy/app/app.js +++ b/tests/dummy/app/app.js @@ -1,14 +1,12 @@ import Application from '@ember/application'; -import Resolver from './resolver'; +import Resolver from 'ember-resolver'; import loadInitializers from 'ember-load-initializers'; -import config from './config/environment'; +import config from 'dummy/config/environment'; -const App = Application.extend({ - modulePrefix: config.modulePrefix, - podModulePrefix: config.podModulePrefix, - Resolver -}); +export default class App extends Application { + modulePrefix = config.modulePrefix; + podModulePrefix = config.podModulePrefix; + Resolver = Resolver; +} loadInitializers(App, config.modulePrefix); - -export default App; diff --git a/tests/dummy/app/models/address.js b/tests/dummy/app/models/address.js index 1f71205d3..df7e70f8c 100644 --- a/tests/dummy/app/models/address.js +++ b/tests/dummy/app/models/address.js @@ -1,5 +1,3 @@ import Model from '@ember-data/model'; -export default Model.extend({ - -}); +export default class extends Model {} diff --git a/tests/dummy/app/models/comment.js b/tests/dummy/app/models/comment.js index 5b038edec..d0b08f3c4 100644 --- a/tests/dummy/app/models/comment.js +++ b/tests/dummy/app/models/comment.js @@ -1,7 +1,6 @@ import Model, { attr, belongsTo } from '@ember-data/model'; import compileMarkdown from 'ember-cli-addon-docs/utils/compile-markdown'; import { htmlSafe } from '@ember/string'; -import { computed } from '@ember/object'; export default class Comment extends Model { @@ -11,7 +10,6 @@ export default class Comment extends Model { @attr permalink; @attr createdAt; - @computed('body') get htmlBody () { return htmlSafe(compileMarkdown(this.body)); } diff --git a/tests/dummy/app/models/post.js b/tests/dummy/app/models/post.js index d35f21498..2e96ba829 100644 --- a/tests/dummy/app/models/post.js +++ b/tests/dummy/app/models/post.js @@ -1,5 +1,4 @@ import Model, { attr, hasMany } from '@ember-data/model'; -import { computed } from '@ember/object'; import yaml from 'js-yaml'; import compileMarkdown from 'ember-cli-addon-docs/utils/compile-markdown'; import { htmlSafe } from '@ember/string'; @@ -12,12 +11,10 @@ export default class Post extends Model { @attr body; @attr issueUrl; - @computed('body') get htmlBody () { return htmlSafe(compileMarkdown(this.body)); } - @computed('body') get meta () { let lines = this.body.split('\n').map(line => line.trim()); let firstLine = lines[0]; @@ -33,7 +30,6 @@ export default class Post extends Model { } } - @computed('meta.slug', 'id') get slugAndId () { return `${this.meta.slug}-${this.id}`; } diff --git a/tests/dummy/app/models/word-smith.js b/tests/dummy/app/models/word-smith.js index 599d04ca4..4aa646ece 100644 --- a/tests/dummy/app/models/word-smith.js +++ b/tests/dummy/app/models/word-smith.js @@ -1,8 +1,8 @@ -import Model, {attr, belongsTo, hasMany} from '@ember-data/model'; +import Model, { attr, belongsTo, hasMany } from '@ember-data/model'; -export default Model.extend({ - name: attr(), - age: attr(), - comments: hasMany('comments'), - address: belongsTo('address') -}); +export default class extends Model { + @attr name; + @attr age; + @hasMany('comments') comments; + @belongsTo('address') address; +} diff --git a/tests/dummy/app/pods/application/route.js b/tests/dummy/app/pods/application/route.js index 17bd10a4e..12977290c 100644 --- a/tests/dummy/app/pods/application/route.js +++ b/tests/dummy/app/pods/application/route.js @@ -1,6 +1,6 @@ import Route from '@ember/routing/route'; -export default Route.extend({ +export default class extends Route { beforeModel() { let pathname = window.location.pathname; @@ -19,4 +19,4 @@ export default Route.extend({ }); } -}); +} diff --git a/tests/dummy/app/pods/blog/detail/route.js b/tests/dummy/app/pods/blog/detail/route.js index c1183a674..2db12a0fa 100644 --- a/tests/dummy/app/pods/blog/detail/route.js +++ b/tests/dummy/app/pods/blog/detail/route.js @@ -1,6 +1,6 @@ import Route from '@ember/routing/route'; -export default Route.extend({ +export default class extends Route { model({ post_slug_and_id }) { let matches = post_slug_and_id.match(/\d+$/); @@ -14,4 +14,4 @@ export default Route.extend({ return this.store.findRecord('post', postId); } -}); +} diff --git a/tests/dummy/app/pods/blog/index/route.js b/tests/dummy/app/pods/blog/index/route.js index beec6be3b..91edf972b 100644 --- a/tests/dummy/app/pods/blog/index/route.js +++ b/tests/dummy/app/pods/blog/index/route.js @@ -1,9 +1,9 @@ import Route from '@ember/routing/route'; -export default Route.extend({ +export default class extends Route { model() { return this.store.findAll('post'); } -}); +} diff --git a/tests/dummy/app/pods/docs/index/route.js b/tests/dummy/app/pods/docs/index/route.js index 462e9fd12..b2ac26b58 100644 --- a/tests/dummy/app/pods/docs/index/route.js +++ b/tests/dummy/app/pods/docs/index/route.js @@ -1,9 +1,9 @@ import Route from '@ember/routing/route'; -export default Route.extend({ +export default class extends Route { beforeModel() { this.transitionTo('docs.getting-started.what-is-mirage'); } -}); +} diff --git a/tests/dummy/app/resolver.js b/tests/dummy/app/resolver.js deleted file mode 100644 index 2fb563d6c..000000000 --- a/tests/dummy/app/resolver.js +++ /dev/null @@ -1,3 +0,0 @@ -import Resolver from 'ember-resolver'; - -export default Resolver; diff --git a/tests/dummy/app/router.js b/tests/dummy/app/router.js index f95977075..7eb054330 100644 --- a/tests/dummy/app/router.js +++ b/tests/dummy/app/router.js @@ -1,10 +1,10 @@ import AddonDocsRouter, { docsRoute } from 'ember-cli-addon-docs/router'; -import config from './config/environment'; +import config from 'dummy/config/environment'; -const Router = AddonDocsRouter.extend({ - location: config.locationType, - rootURL: config.rootURL -}); +export default class Router extends AddonDocsRouter { + location = config.locationType; + rootURL = config.rootURL; +} Router.map(function() { docsRoute(this, function() { @@ -58,5 +58,3 @@ Router.map(function() { this.route('not-found', { path: '/*path' }); }); - -export default Router; diff --git a/tests/dummy/app/serializers/address.js b/tests/dummy/app/serializers/address.js index fa2080981..034b5bfe3 100644 --- a/tests/dummy/app/serializers/address.js +++ b/tests/dummy/app/serializers/address.js @@ -1,5 +1,5 @@ import RestSerializer from '@ember-data/serializer/rest'; -export default RestSerializer.extend({ - primaryKey: "addressId" -}); +export default class extends RestSerializer { + primaryKey = "addressId"; +} diff --git a/tests/dummy/app/serializers/application.js b/tests/dummy/app/serializers/application.js index 40fd90153..f24ad56ca 100644 --- a/tests/dummy/app/serializers/application.js +++ b/tests/dummy/app/serializers/application.js @@ -1,9 +1,9 @@ import JSONAPISerializer from '@ember-data/serializer/json-api'; -export default JSONAPISerializer.extend({ - appSerializer: true, +export default class extends JSONAPISerializer { + appSerializer = true; // I do not know why I had to make these two lines to get the home-test to pass - keyForAttribute(key) { return key; }, + keyForAttribute(key) { return key; } keyForRelationship(key) { return key; } -}); +} diff --git a/tests/dummy/app/serializers/word-smith.js b/tests/dummy/app/serializers/word-smith.js index 59728186b..20ea96773 100644 --- a/tests/dummy/app/serializers/word-smith.js +++ b/tests/dummy/app/serializers/word-smith.js @@ -1,8 +1,8 @@ import RestSerializer from '@ember-data/serializer/rest'; -export default RestSerializer.extend({ - attrs: { +export default class extends RestSerializer { + attrs = { address: "addressId", blogPosts: {deserialize: "records"} } -}); +} diff --git a/yarn.lock b/yarn.lock index c4725b832..19b8cee69 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6263,6 +6263,14 @@ css-tree@1.0.0-alpha.33: mdn-data "2.0.4" source-map "^0.5.3" +css-tree@^1.0.0-alpha.39: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + css-unit-converter@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996" @@ -8315,14 +8323,18 @@ esdoc@pzuraq/esdoc#015a342: minimist "1.2.0" taffydb "2.7.2" -eslint-plugin-ember@^8.1.0: - version "8.14.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-8.14.0.tgz#fc4c5119b5a1c87604a7bf920ca397783b96b7be" - integrity sha512-PQhR58omMAZzcJOB8GLWzL6l/vjRZ2Uo1eohxOmgPUyeBkHfZAMlvK+OSeneMLIr4azLQ4GISkklwv6lxb8qnw== +eslint-plugin-ember@^10.5.8: + version "10.5.8" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-10.5.8.tgz#87e004a5ebed88f94008364554daf57df2c9c718" + integrity sha512-d21mJ+F+htgi6HhrjwbOfllJojF4ZWGruW13HkBoGS2SaHqKUyvIH/8j3EjSxlsGFiNfhTEUWkNaUSLJxgbtWg== dependencies: "@ember-data/rfc395-data" "^0.0.4" + css-tree "^1.0.0-alpha.39" ember-rfc176-data "^0.3.15" + eslint-utils "^3.0.0" + estraverse "^5.2.0" lodash.kebabcase "^4.1.1" + requireindex "^1.2.0" snake-case "^3.0.3" eslint-plugin-es@^3.0.0: @@ -11736,6 +11748,11 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + mdn-data@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" From 6803e2a7d6e7d37c41a9798319a2c9a21e35f153 Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Sun, 12 Dec 2021 19:17:06 -0500 Subject: [PATCH 852/879] Bump ember-moment from 8.0.0 to 9.0.1 --- package.json | 2 +- yarn.lock | 56 +++++++++++++++++++++------------------------------- 2 files changed, 24 insertions(+), 34 deletions(-) diff --git a/package.json b/package.json index 715dfda63..736571be3 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "ember-export-application-global": "^2.0.0", "ember-load-initializers": "^2.0.0", "ember-maybe-import-regenerator": "^1.0.0", - "ember-moment": "^8.0.0", + "ember-moment": "^9.0.1", "ember-qunit": "^5.1.5", "ember-resolver": "^8.0.2", "ember-source": "~3.26.1", diff --git a/yarn.lock b/yarn.lock index 77b56f044..f8405d292 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6825,7 +6825,7 @@ ember-assign-polyfill@^2.5.0: ember-cli-babel "^6.16.0" ember-cli-version-checker "^2.0.0" -ember-auto-import@^1.11.2, ember-auto-import@^1.11.3: +ember-auto-import@^1.10.1, ember-auto-import@^1.11.2, ember-auto-import@^1.11.3: version "1.12.0" resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.12.0.tgz#52246b04891090e2608244e65c4c6af7710df12b" integrity sha512-fzMGnyHGfUNFHchpLbJ98Vs/c5H2wZBMR9r/XwW+WOWPisZDGLUPPyhJQsSREPoUQ+o8GvyLaD/rkrKqW8bmgw== @@ -7033,7 +7033,7 @@ ember-cli-babel@7.7.3: ensure-posix-path "^1.0.2" semver "^5.5.0" -ember-cli-babel@^6.11.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.7.2: +ember-cli-babel@^6.11.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.6.0: version "6.18.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz#3f6435fd275172edeff2b634ee7b29ce74318957" integrity sha512-7ceC8joNYxY2wES16iIBlbPSxwKDBhYwC8drU3ZEvuPDMwVv1KzxCNu1fvxyFEBWhwaRNTUxSCsEVoTd9nosGA== @@ -7734,13 +7734,6 @@ ember-export-application-global@^2.0.0: resolved "https://registry.yarnpkg.com/ember-export-application-global/-/ember-export-application-global-2.0.1.tgz#b120a70e322ab208defc9e2daebe8d0dfc2dcd46" integrity sha512-B7wiurPgsxsSGzJuPFkpBWnaeuCu2PGpG2BjyrfA1VcL7//o+5RSnZqiCEY326y7qmxb2GoCgo0ft03KBU0rRw== -ember-factory-for-polyfill@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/ember-factory-for-polyfill/-/ember-factory-for-polyfill-1.3.1.tgz#b446ed64916d293c847a4955240eb2c993b86eae" - integrity sha512-y3iG2iCzH96lZMTWQw6LWNLAfOmDC4pXKbZP6FxG8lt7GGaNFkZjwsf+Z5GAe7kxfD7UG4lVkF7x37K82rySGA== - dependencies: - ember-cli-version-checker "^2.1.0" - ember-fetch@^8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-8.0.2.tgz#9838b9f01e33fcd23550ccf38ae4f1f90cc47113" @@ -7777,14 +7770,6 @@ ember-get-config@^0.3.0: broccoli-file-creator "^1.1.1" ember-cli-babel "^7.0.0" -ember-getowner-polyfill@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ember-getowner-polyfill/-/ember-getowner-polyfill-2.2.0.tgz#38e7dccbcac69d5ec694000329ec0b2be651d2b2" - integrity sha512-rwGMJgbGzxIAiWYjdpAh04Abvt0s3HuS/VjHzUFhVyVg2pzAuz45B9AzOxYXzkp88vFC7FPaiA4kE8NxNk4A4Q== - dependencies: - ember-cli-version-checker "^2.1.0" - ember-factory-for-polyfill "^1.3.1" - ember-href-to@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ember-href-to/-/ember-href-to-4.1.0.tgz#daa8b398bc5a51ba3ba5ff736e099f0a0d010b7b" @@ -7825,15 +7810,6 @@ ember-load-initializers@^2.0.0: ember-cli-babel "^7.13.0" ember-cli-typescript "^2.0.2" -ember-macro-helpers@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/ember-macro-helpers/-/ember-macro-helpers-4.2.2.tgz#dfb28b2b21f9fd49ade599f68c99e73ce5692cdc" - integrity sha512-E46MnpjMu+ZXRw/5A1tADZKFJADGpSAcsclcaBNfV/B1aRPV3PTTnCpDvYC1wfJ4kwwUh0DRLDH/OpBv+/41pQ== - dependencies: - ember-cli-babel "^7.7.3" - ember-cli-string-utils "^1.1.0" - ember-cli-test-info "^1.0.0" - ember-maybe-import-regenerator@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-maybe-import-regenerator/-/ember-maybe-import-regenerator-1.0.0.tgz#c05453dfd3b65dbec2b569612b01ae70b672dd7e" @@ -7876,14 +7852,16 @@ ember-modifier-manager-polyfill@^1.1.0, ember-modifier-manager-polyfill@^1.2.0: ember-cli-typescript "^4.2.1" ember-compatibility-helpers "^1.2.5" -ember-moment@^8.0.0: - version "8.0.1" - resolved "https://registry.yarnpkg.com/ember-moment/-/ember-moment-8.0.1.tgz#3a11929efeb7fb6bc5c1cc2c9e4c43bd9c500f80" - integrity sha512-YmhcMkH4OUwk1ynypxgWb8/O0E+v2HaZ49rk7yPbsf7EkzAyHn2tXrQPbFW4eWCKgHl+VoRoocLU9ShSIDI7qg== +ember-moment@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/ember-moment/-/ember-moment-9.0.1.tgz#fcf06cb8ef07c8d0108820c1639778590d613b38" + integrity sha512-mwcj2g/37pIQua3uTpJWu/zpcnyvbgg9YmkKR6nhtY7FXBaGSIU3aeG95VAoPcfET9DazkPOyqxVB+Dcd5BP5g== dependencies: - ember-cli-babel "^6.7.2" - ember-getowner-polyfill "^2.2.0" - ember-macro-helpers "^4.2.2" + ember-auto-import "^1.10.1" + ember-cli-babel "^7.23.0" + ember-cli-htmlbars "^5.3.1" + moment "^2.29.1" + moment-timezone "^0.5.33" ember-on-modifier@^1.0.0: version "1.0.1" @@ -12228,11 +12206,23 @@ moment-timezone@^0.5.13: dependencies: moment ">= 2.9.0" +moment-timezone@^0.5.33: + version "0.5.34" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.34.tgz#a75938f7476b88f155d3504a9343f7519d9a405c" + integrity sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg== + dependencies: + moment ">= 2.9.0" + "moment@>= 2.9.0", moment@^2.19.3: version "2.26.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.26.0.tgz#5e1f82c6bafca6e83e808b30c8705eed0dcbd39a" integrity sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw== +moment@^2.29.1: + version "2.29.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" + integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== + morgan@^1.9.0: version "1.10.0" resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" From 7c912123b7cf99ae27041b674232de21cff55686 Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Sun, 12 Dec 2021 19:21:36 -0500 Subject: [PATCH 853/879] Bump ember-composable-helpers from 4.4.1 to 5.0.0 --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 715dfda63..9556255a3 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "ember-cli-moment-shim": "^3.8.0", "ember-cli-sri": "^2.1.1", "ember-cli-uglify": "^3.0.0", - "ember-composable-helpers": "^4.1.2", + "ember-composable-helpers": "^5.0.0", "ember-data": "~3.14.0", "ember-disable-prototype-extensions": "^1.1.3", "ember-export-application-global": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index 77b56f044..1f1cb389f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7633,20 +7633,20 @@ ember-compatibility-helpers@^1.2.4, ember-compatibility-helpers@^1.2.5: fs-extra "^9.1.0" semver "^5.4.1" -ember-composable-helpers@^4.1.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.4.1.tgz#968f0ef72731cc300b377c552f36f20881911472" - integrity sha512-MVx4KGFL6JzsYfCf9OqLCCnr7DN5tG2jFW9EvosvfgCL7gRdNxLqewR4PWPYA882wetmJ9zvcIEUJhFzZ4deaw== +ember-composable-helpers@^4.4.1: + version "4.5.0" + resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.5.0.tgz#94febbdf4348e64f45f7a6f993f326e32540a61e" + integrity sha512-XjpDLyVPsLCy6kd5dIxZonOECCO6AA5sY5Hr6tYUbJg3s5ghFAiFWaNcYraYC+fL2yPJQAswwpfwGlQORUJZkw== dependencies: "@babel/core" "^7.0.0" broccoli-funnel "2.0.1" - ember-cli-babel "^7.11.1" + ember-cli-babel "^7.26.3" resolve "^1.10.0" -ember-composable-helpers@^4.4.1: - version "4.5.0" - resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.5.0.tgz#94febbdf4348e64f45f7a6f993f326e32540a61e" - integrity sha512-XjpDLyVPsLCy6kd5dIxZonOECCO6AA5sY5Hr6tYUbJg3s5ghFAiFWaNcYraYC+fL2yPJQAswwpfwGlQORUJZkw== +ember-composable-helpers@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-5.0.0.tgz#055bab3a3e234ab2917499b1465e968c253ca885" + integrity sha512-gyUrjiSju4QwNrsCLbBpP0FL6VDFZaELNW7Kbcp60xXhjvNjncYgzm4zzYXhT+i1lLA6WEgRZ3lOGgyBORYD0w== dependencies: "@babel/core" "^7.0.0" broccoli-funnel "2.0.1" From 5439b24cb5adea2857ca422ba7452c56c2045e08 Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Sun, 12 Dec 2021 19:37:31 -0500 Subject: [PATCH 854/879] Bump ember-resolver from 8.0.2 to 8.0.3 --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 3248ae0db..7e070cd9b 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "ember-maybe-import-regenerator": "^1.0.0", "ember-moment": "^9.0.1", "ember-qunit": "^5.1.5", - "ember-resolver": "^8.0.2", + "ember-resolver": "^8.0.3", "ember-source": "~3.26.1", "ember-source-channel-url": "^3.0.0", "ember-template-lint": "^3.14.0", diff --git a/yarn.lock b/yarn.lock index df66560cf..5fed6eda5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7888,17 +7888,17 @@ ember-qunit@^5.1.5: silent-error "^1.1.1" validate-peer-dependencies "^1.2.0" -ember-resolver@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-8.0.2.tgz#8a45a744aaf5391eb52b4cb393b3b06d2db1975c" - integrity sha512-BmCoPT8nf5uv0g2QkhMsrG1Gmu6MtXd6igfhCVzCTMTwZ97SxhJKqoMY62EP/av5HVSWBC/Sa1uGU5cQvX1Aog== +ember-resolver@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-8.0.3.tgz#40f243aa58281bf195c695fe84a6b291e204690a" + integrity sha512-fA53fxfG821BRqNiB9mQDuzZpzSRcSAYZTYBlRQOHsJwoYdjyE7idz4YcytbSsa409G5J2kP6B+PiKOBh0odlw== dependencies: - babel-plugin-debug-macros "^0.3.3" - broccoli-funnel "^3.0.3" + babel-plugin-debug-macros "^0.3.4" + broccoli-funnel "^3.0.8" broccoli-merge-trees "^4.2.0" - ember-cli-babel "^7.22.1" - ember-cli-version-checker "^5.1.1" - resolve "^1.17.0" + ember-cli-babel "^7.26.6" + ember-cli-version-checker "^5.1.2" + resolve "^1.20.0" ember-responsive@^4.0.0: version "4.0.1" From 5eb5657ba3b2d3a1d94f56f9fae3dbd82466bb23 Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Sun, 12 Dec 2021 19:39:18 -0500 Subject: [PATCH 855/879] Bump ember-cli-inject-live-reload from 2.0.2 to 2.1.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 3248ae0db..297bf4638 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "ember-cli-fastboot": "^2.0.4", "ember-cli-favicon": "^2.0.0", "ember-cli-htmlbars": "^5.3.1", - "ember-cli-inject-live-reload": "^2.0.1", + "ember-cli-inject-live-reload": "^2.1.0", "ember-cli-moment-shim": "^3.8.0", "ember-cli-sri": "^2.1.1", "ember-cli-uglify": "^3.0.0", diff --git a/yarn.lock b/yarn.lock index df66560cf..7f5abe470 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7271,10 +7271,10 @@ ember-cli-import-polyfill@^0.2.0: resolved "https://registry.yarnpkg.com/ember-cli-import-polyfill/-/ember-cli-import-polyfill-0.2.0.tgz#c1a08a8affb45c97b675926272fe78cf4ca166f2" integrity sha1-waCKiv+0XJe2dZJicv54z0yhZvI= -ember-cli-inject-live-reload@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-2.0.2.tgz#95edb543b386239d35959e5ea9579f5382976ac7" - integrity sha512-HDD6o/kBHT/kUtazklU0OW23q2jigIN42QmcpFdXUSvJ2/2SYA6yIqSUxWfJgISmtn5gTNZ2KPq1p3dLkhJxSQ== +ember-cli-inject-live-reload@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-2.1.0.tgz#ef63c733c133024d5726405a3c247fa12e88a385" + integrity sha512-YV5wYRD5PJHmxaxaJt18u6LE6Y+wo455BnmcpN+hGNlChy2piM9/GMvYgTAz/8Vin8RJ5KekqP/w/NEaRndc/A== dependencies: clean-base-url "^1.0.0" ember-cli-version-checker "^3.1.3" From 1ac6e6c760a05a2e95ba82f1d75d514d8f1c9785 Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Sun, 12 Dec 2021 20:06:48 -0500 Subject: [PATCH 856/879] Bump miragejs from 0.1.31 to 0.1.43 --- package.json | 2 +- yarn.lock | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index c2442ffe3..a0b0948e4 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "ember-get-config": "0.2.4 - 0.5.0", "ember-inflector": "^2.0.0 || ^3.0.0 || ^4.0.2", "lodash-es": "^4.17.11", - "miragejs": "^0.1.31" + "miragejs": "^0.1.43" }, "devDependencies": { "@ember/jquery": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index 5ea7f643c..63fe14551 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8833,10 +8833,10 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -fake-xml-http-request@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-2.1.1.tgz#279fdac235840d7a4dff77d98ec44bce9fc690a6" - integrity sha512-Kn2WYYS6cDBS5jq/voOfSGCA0TafOYAUPbEp8mUVpD/DVV5bQIDjlq+MLLvNUokkbTpjBVlLDaM5PnX+PwZMlw== +fake-xml-http-request@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-2.1.2.tgz#f1786720cae50bbb46273035a0173414f3e85e74" + integrity sha512-HaFMBi7r+oEC9iJNpc3bvcW7Z7iLmM26hPDmlb0mFwyANSsOQAtJxbdWsXITKOzZUyMYK0zYCv3h5yDj9TsiXg== faker@^5.1.0: version "5.5.3" @@ -12119,10 +12119,10 @@ minipass@^2.2.0: safe-buffer "^5.1.2" yallist "^3.0.0" -miragejs@^0.1.31: - version "0.1.41" - resolved "https://registry.yarnpkg.com/miragejs/-/miragejs-0.1.41.tgz#1b06a2d2d9de65624f5bb1cee7ebb4a208f554d0" - integrity sha512-ur8x7sBskgey64vdzKGVCVC3hgKXWl2Cg5lZbxd6OmKrhr9LCCP/Bv7qh4wsQxIMHZnENxybFATXnrQ+rzSOWQ== +miragejs@^0.1.43: + version "0.1.43" + resolved "https://registry.yarnpkg.com/miragejs/-/miragejs-0.1.43.tgz#47a8546b9e3489f806073e681f380ccfe13d757d" + integrity sha512-BhkyxssOZ2i4JqRjWpRnUQu9AFAKHyft8dJbqsg/N64+gCn2vw6vRteMpTKXllLjCPOA9Os8PhGRVXlXs4Ojhw== dependencies: "@miragejs/pretender-node-polyfill" "^0.1.0" inflected "^2.0.4" @@ -12149,7 +12149,7 @@ miragejs@^0.1.31: lodash.uniq "^4.5.0" lodash.uniqby "^4.7.0" lodash.values "^4.3.0" - pretender "^3.4.3" + pretender "^3.4.7" mississippi@^3.0.0: version "3.0.0" @@ -13432,12 +13432,12 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -pretender@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.4.3.tgz#a3b4160516007075d29127262f3a0063d19896e9" - integrity sha512-AlbkBly9R8KR+R0sTCJ/ToOeEoUMtt52QVCetui5zoSmeLOU3S8oobFsyPLm1O2txR6t58qDNysqPnA1vVi8Hg== +pretender@^3.4.7: + version "3.4.7" + resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.4.7.tgz#34a2ae2d1fc9db440a990d50e6c0f5481d8755fc" + integrity sha512-jkPAvt1BfRi0RKamweJdEcnjkeu7Es8yix3bJ+KgBC5VpG/Ln4JE3hYN6vJym4qprm8Xo5adhWpm3HCoft1dOw== dependencies: - fake-xml-http-request "^2.1.1" + fake-xml-http-request "^2.1.2" route-recognizer "^0.3.3" pretty-hrtime@^1.0.3: From 6082b0f5fc966e3d8838c66957c9abd1328fb5f5 Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Sat, 11 Dec 2021 23:19:32 -0500 Subject: [PATCH 857/879] Bump ember-cli-fastboot from 2.0.4 to 3.2.0-beta.5 --- package.json | 4 +-- yarn.lock | 72 +++++++++++++++++++++++++++------------------------- 2 files changed, 39 insertions(+), 37 deletions(-) diff --git a/package.json b/package.json index a0b0948e4..9c077fa60 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "ember-cli-deploy-build": "^2.0.0", "ember-cli-deploy-git": "^1.3.3", "ember-cli-deploy-git-ci": "^1.0.1", - "ember-cli-fastboot": "^2.0.4", + "ember-cli-fastboot": "^3.2.0-beta.5", "ember-cli-favicon": "^2.0.0", "ember-cli-htmlbars": "^5.3.1", "ember-cli-inject-live-reload": "^2.1.0", @@ -93,7 +93,7 @@ "eslint-plugin-node": "^11.1.0", "eslint-plugin-qunit": "^7.1.0", "faker": "^5.1.0", - "fastboot": "^3.0.2", + "fastboot": "^3.2.0-beta.5", "js-yaml": "^4.0.0", "jsdom": "^19.0.0", "loader.js": "^4.7.0", diff --git a/yarn.lock b/yarn.lock index 63fe14551..359b58f51 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3336,6 +3336,11 @@ ast-types@0.13.2: resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.2.tgz#df39b677a911a83f3a049644fb74fdded23cea48" integrity sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA== +ast-types@0.13.3: + version "0.13.3" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.3.tgz#50da3f28d17bdbc7969a3a2d83a0e4a72ae755a7" + integrity sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA== + astral-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" @@ -7175,27 +7180,29 @@ ember-cli-deploy@^1.0.2: rsvp "^3.3.3" silent-error "^1.0.0" -ember-cli-fastboot@^2.0.4: - version "2.2.3" - resolved "https://registry.yarnpkg.com/ember-cli-fastboot/-/ember-cli-fastboot-2.2.3.tgz#d32eba948b2790ec4b5429ff759a8dee932c1e55" - integrity sha512-RdKzTOXHi59VW6a9RB0muCQd15BmY95pWkQ9eLslyeLR38/Uh1EVP+kgWxzJTxODywmMJ9SWW2HPpvxxLDfCEw== +ember-cli-fastboot@^3.2.0-beta.5: + version "3.2.0-beta.5" + resolved "https://registry.yarnpkg.com/ember-cli-fastboot/-/ember-cli-fastboot-3.2.0-beta.5.tgz#c190bfc3a9b42cb0dc2a2861e2812116fbed3dd0" + integrity sha512-1ugII1SFc/BzQNBlJxSJ7+FmkQd6KCKNGJZdSkvYhEeDQ0mmsC1QXMV2bzSRElU4mh5GUN2jf7FsaGtFH5+v/A== dependencies: broccoli-concat "^3.7.1" broccoli-file-creator "^2.1.1" broccoli-funnel "^2.0.1" broccoli-merge-trees "^3.0.1" broccoli-plugin "^1.3.1" - chalk "^2.4.1" - ember-cli-babel "^7.1.0" + chalk "^4.1.2" + ember-cli-babel "^7.26.3" + ember-cli-htmlbars "^5.7.1" ember-cli-lodash-subset "2.0.1" ember-cli-preprocess-registry "^3.1.2" ember-cli-version-checker "^3.0.0" - fastboot "^2.0.0" - fastboot-express-middleware "^2.0.0" + fastboot "3.2.0-beta.5" + fastboot-express-middleware "3.2.0-beta.5" fastboot-transform "^0.1.3" - fs-extra "^7.0.0" + fs-extra "^10.0.0" json-stable-stringify "^1.0.1" md5-hex "^2.0.0" + recast "^0.19.1" silent-error "^1.1.0" ember-cli-favicon@^2.0.0: @@ -8921,14 +8928,13 @@ fast-sourcemap-concat@^2.1.0: source-map-url "^0.3.0" sourcemap-validator "^1.1.0" -fastboot-express-middleware@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fastboot-express-middleware/-/fastboot-express-middleware-2.0.0.tgz#3cb2c4b744e738a709b4336c4166f1a059ab0ffb" - integrity sha512-sJHZrHpo/8jh56t+DTzaDcg6cnHbmXlTSAdfhRZbBa8XDY3TfN+TjHsHd4Z7vouLFU+ISuaZkzKfwGwipW5xwQ== +fastboot-express-middleware@3.2.0-beta.5: + version "3.2.0-beta.5" + resolved "https://registry.yarnpkg.com/fastboot-express-middleware/-/fastboot-express-middleware-3.2.0-beta.5.tgz#3510bc1a4eb4eec8059ae43cbbf07542b6c8f9a5" + integrity sha512-o1NggiJo/AFuj7OloC9hwxyrQUtN7K6CU4mKMBcG9+HC5uAETioWQkBgEy6qcOARzZrFdrsoUSk9KtYr+sqXyQ== dependencies: chalk "^2.0.1" - fastboot "^2.0.1" - request "^2.81.0" + fastboot "3.2.0-beta.5" fastboot-transform@^0.1.3: version "0.1.3" @@ -8938,24 +8944,10 @@ fastboot-transform@^0.1.3: broccoli-stew "^1.5.0" convert-source-map "^1.5.1" -fastboot@^2.0.0, fastboot@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-2.0.3.tgz#0b712e6c590f1b463dc5b12138893bcbbafa2459" - integrity sha512-NNH/o+XhITAQUnW2CC9IDXlcnI74W2BONjtRSRmc01N3uJl/7pcvX9iWTUWu2PYQbQZUBu8HzVFt7GmQ9qw9JQ== - dependencies: - chalk "^2.0.1" - cookie "^0.4.0" - debug "^4.1.0" - najax "^1.0.3" - resolve "^1.8.1" - rsvp "^4.8.0" - simple-dom "^1.4.0" - source-map-support "^0.5.0" - -fastboot@^3.0.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-3.1.2.tgz#c10a97be3a61fbbf9e4bd8abc43373e8739d1787" - integrity sha512-yvhJfIRd4wWWACk+qjJxQI+WBIQ+pyQyp0/fxrQyA/cYJgZAXOHb+22zXJbJXaPku3fHS+gBl7crwovIkl8bhQ== +fastboot@3.2.0-beta.5, fastboot@^3.2.0-beta.5: + version "3.2.0-beta.5" + resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-3.2.0-beta.5.tgz#3d24bcaa0bd844bcc895ec0dbe96f2cd51713c1c" + integrity sha512-PJXdqtYw0aERX+ZiZpg3sR09xkHdGLXH+8g3NWknuT1+ShR93lsdMCrFcvES2Bnq/GC3PxqW/CJpume4E9KLGw== dependencies: chalk "^3.0.0" cookie "^0.4.0" @@ -13820,6 +13812,16 @@ recast@^0.18.1: private "^0.1.8" source-map "~0.6.1" +recast@^0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.19.1.tgz#555f3612a5a10c9f44b9a923875c51ff775de6c8" + integrity sha512-8FCjrBxjeEU2O6I+2hyHyBFH1siJbMBLwIRvVr1T3FD2cL754sOaJDsJ/8h3xYltasbJ8jqWRIhMuDGBSiSbjw== + dependencies: + ast-types "0.13.3" + esprima "~4.0.0" + private "^0.1.8" + source-map "~0.6.1" + redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" @@ -14289,7 +14291,7 @@ rsvp@^3.0.14, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0 resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== -rsvp@^4.7.0, rsvp@^4.8.0, rsvp@^4.8.1, rsvp@^4.8.2, rsvp@^4.8.3, rsvp@^4.8.4, rsvp@^4.8.5: +rsvp@^4.7.0, rsvp@^4.8.1, rsvp@^4.8.2, rsvp@^4.8.3, rsvp@^4.8.4, rsvp@^4.8.5: version "4.8.5" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== @@ -14778,7 +14780,7 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" -source-map-support@^0.5.0, source-map-support@^0.5.16, source-map-support@~0.5.10, source-map-support@~0.5.12: +source-map-support@^0.5.16, source-map-support@~0.5.10, source-map-support@~0.5.12: version "0.5.16" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== From 1d6c3932a4685f3323a1ef07f25a94b6416c553a Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Sat, 11 Dec 2021 23:04:22 -0500 Subject: [PATCH 858/879] Replace ember-ajax with ember-fetch --- package.json | 2 +- .../fastboot-tests/included-files-test.js | 36 ++++++- test-projects/01-basic-app/package.json | 2 +- .../02-app-that-excludes-mirage/package.json | 2 +- yarn.lock | 97 ++++++++++++++----- 5 files changed, 106 insertions(+), 33 deletions(-) diff --git a/package.json b/package.json index 9c077fa60..1dc4a671b 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,6 @@ "@glimmer/tracking": "^1.0.4", "babel-eslint": "^10.0.3", "broccoli-asset-rev": "^3.0.0", - "ember-ajax": "^5.0.0", "ember-cli": "~3.4.4", "ember-cli-addon-docs": "^3.0.0", "ember-cli-addon-docs-esdoc": "^0.2.3", @@ -79,6 +78,7 @@ "ember-data": "~3.14.0", "ember-disable-prototype-extensions": "^1.1.3", "ember-export-application-global": "^2.0.0", + "ember-fetch": "^8.1.1", "ember-load-initializers": "^2.0.0", "ember-maybe-import-regenerator": "^1.0.0", "ember-moment": "^9.0.1", diff --git a/test-projects/01-basic-app/fastboot-tests/included-files-test.js b/test-projects/01-basic-app/fastboot-tests/included-files-test.js index de599e288..515dac4a1 100644 --- a/test-projects/01-basic-app/fastboot-tests/included-files-test.js +++ b/test-projects/01-basic-app/fastboot-tests/included-files-test.js @@ -23,7 +23,14 @@ qModule('basic-app | fastboot | included files', function() { resilient: false }); - let page = await fastboot.visit('/module-count'); + let page = await fastboot.visit('/module-count', { + request: { + url: '/module-count', + protocol: 'https:', + headers: {} + }, + response: {} + }); let html = await page.html(); assert.equal(findTextFromHtml(html, '[data-test-id="environment"]'), 'development'); @@ -42,7 +49,14 @@ qModule('basic-app | fastboot | included files', function() { resilient: false }); - let page = await fastboot.visit('/module-count'); + let page = await fastboot.visit('/module-count', { + request: { + url: '/module-count', + protocol: 'https:', + headers: {} + }, + response: {} + }); let html = await page.html(); assert.equal(findTextFromHtml(html, '[data-test-id="environment"]'), 'test'); @@ -56,7 +70,14 @@ qModule('basic-app | fastboot | included files', function() { distPath: 'dist', resilient: false }); - let page = await fastboot.visit('/module-count'); + let page = await fastboot.visit('/module-count', { + request: { + url: '/module-count', + protocol: 'https:', + headers: {} + }, + response: {} + }); let html = await page.html(); assert.equal(findTextFromHtml(html, '[data-test-id="environment"]'), 'production'); @@ -75,7 +96,14 @@ qModule('basic-app | fastboot | included files', function() { distPath: 'dist', resilient: false }); - let page = await fastboot.visit('/module-count'); + let page = await fastboot.visit('/module-count', { + request: { + url: '/module-count', + protocol: 'https:', + headers: {} + }, + response: {} + }); let html = await page.html(); assert.equal(findTextFromHtml(html, '[data-test-id="environment"]'), 'production'); diff --git a/test-projects/01-basic-app/package.json b/test-projects/01-basic-app/package.json index fa2bc65ce..e413da152 100644 --- a/test-projects/01-basic-app/package.json +++ b/test-projects/01-basic-app/package.json @@ -22,7 +22,6 @@ "@ember/test-helpers": "*", "@glimmer/tracking": "*", "broccoli-asset-rev": "*", - "ember-ajax": "*", "ember-auto-import": "*", "ember-cli": "*", "ember-cli-babel": "*", @@ -35,6 +34,7 @@ "ember-cli-uglify": "*", "ember-data": "*", "ember-export-application-global": "*", + "ember-fetch": "*", "ember-load-initializers": "*", "ember-maybe-import-regenerator": "*", "ember-qunit": "*", diff --git a/test-projects/02-app-that-excludes-mirage/package.json b/test-projects/02-app-that-excludes-mirage/package.json index e1a90d605..2f651330c 100644 --- a/test-projects/02-app-that-excludes-mirage/package.json +++ b/test-projects/02-app-that-excludes-mirage/package.json @@ -21,7 +21,6 @@ "@ember/jquery": "*", "@ember/test-helpers": "*", "broccoli-asset-rev": "*", - "ember-ajax": "*", "ember-auto-import": "*", "ember-cli": "*", "ember-cli-babel": "*", @@ -34,6 +33,7 @@ "ember-cli-uglify": "*", "ember-data": "*", "ember-export-application-global": "*", + "ember-fetch": "*", "ember-load-initializers": "*", "ember-maybe-import-regenerator": "*", "ember-qunit": "*", diff --git a/yarn.lock b/yarn.lock index 359b58f51..cf7d91ff7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2917,6 +2917,11 @@ abortcontroller-polyfill@^1.4.0: resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.5.0.tgz#2c562f530869abbcf88d949a2b60d1d402e87a7c" integrity sha512-O6Xk757Jb4o0LMzMOMdWvxpHWrQzruYBaUruFaIOfAQRnWFxfdXYobw12jrVHGtoXk6WiiyYzc0QWN9aL62HQA== +abortcontroller-polyfill@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz#1b5b487bd6436b5b764fd52a612509702c3144b5" + integrity sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q== + accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -4526,6 +4531,23 @@ broccoli-concat@^4.2.4: lodash.omit "^4.1.0" lodash.uniq "^4.2.0" +broccoli-concat@^4.2.5: + version "4.2.5" + resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-4.2.5.tgz#d578f00094048b5fc87195e82fbdbde20d838d29" + integrity sha512-dFB5ATPwOyV8S2I7a07HxCoutoq23oY//LhM6Mou86cWUTB174rND5aQLR7Fu8FjFFLxoTbkk7y0VPITJ1IQrw== + dependencies: + broccoli-debug "^0.6.5" + broccoli-kitchen-sink-helpers "^0.3.1" + broccoli-plugin "^4.0.2" + ensure-posix-path "^1.0.2" + fast-sourcemap-concat "^2.1.0" + find-index "^1.1.0" + fs-extra "^8.1.0" + fs-tree-diff "^2.0.1" + lodash.merge "^4.6.2" + lodash.omit "^4.1.0" + lodash.uniq "^4.2.0" + broccoli-config-loader@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/broccoli-config-loader/-/broccoli-config-loader-1.0.1.tgz#d10aaf8ebc0cb45c1da5baa82720e1d88d28c80a" @@ -6801,14 +6823,6 @@ elliptic@^6.0.0: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" -ember-ajax@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-5.0.0.tgz#404b17c93194ab37aff86b7b8607d8edab93c9ec" - integrity sha512-Pet0S5VuiO7PDOwyTIF28VHdR7BpugL+jp+6PxNHRQvAq3SkKmVnXN0W06rnOgicH3xX29S46fx7czkKOGB3gA== - dependencies: - ember-cli-babel "^7.5.0" - najax "^1.0.3" - "ember-app-scheduler@^5.1.2 || ^6.0.0 || ^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/ember-app-scheduler/-/ember-app-scheduler-7.0.0.tgz#029fe204ccfc86ccc3ff0447307fad4d1d40e2ab" @@ -7057,7 +7071,7 @@ ember-cli-babel@^6.11.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.6.0: ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.2, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.26.3, ember-cli-babel@^7.26.5, ember-cli-babel@^7.26.6, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.2, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.23.1, ember-cli-babel@^7.26.3, ember-cli-babel@^7.26.5, ember-cli-babel@^7.26.6, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: version "7.26.6" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.6.tgz#322fbbd3baad9dd99e3276ff05bc6faef5e54b39" integrity sha512-040svtfj2RC35j/WMwdWJFusZaXmNoytLAMyBDGLMSlRvznudTxZjGlPV6UupmtTBApy58cEF8Fq4a+COWoEmQ== @@ -7457,7 +7471,7 @@ ember-cli-typescript@^3.1.3, ember-cli-typescript@^3.1.4: stagehand "^1.0.0" walk-sync "^2.0.0" -ember-cli-typescript@^4.2.1: +ember-cli-typescript@^4.1.0, ember-cli-typescript@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-4.2.1.tgz#54d08fc90318cc986f3ea562f93ce58a6cc4c24d" integrity sha512-0iKTZ+/wH6UB/VTWKvGuXlmwiE8HSIGcxHamwNhEC5x1mN3z8RfvsFZdQWYUzIWFN2Tek0gmepGRPTwWdBYl/A== @@ -7760,6 +7774,26 @@ ember-fetch@^8.0.2: node-fetch "^2.6.0" whatwg-fetch "^3.4.0" +ember-fetch@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-8.1.1.tgz#d68d4a58529121a572ec09c39c6a3ad174c83a2e" + integrity sha512-Xi1wNmPtVmfIoFH675AA0ELIdYUcoZ2p+6j9c8eDFjiGJiFesyp01bDtl5ryBI/1VPOByJLsDkT+4C11HixsJw== + dependencies: + abortcontroller-polyfill "^1.7.3" + broccoli-concat "^4.2.5" + broccoli-debug "^0.6.5" + broccoli-merge-trees "^4.2.0" + broccoli-rollup "^2.1.1" + broccoli-stew "^3.0.0" + broccoli-templater "^2.0.1" + calculate-cache-key-for-tree "^2.0.0" + caniuse-api "^3.0.0" + ember-cli-babel "^7.23.1" + ember-cli-typescript "^4.1.0" + ember-cli-version-checker "^5.1.2" + node-fetch "^2.6.1" + whatwg-fetch "^3.6.2" + ember-get-config@, "ember-get-config@0.2.4 - 0.5.0": version "0.5.0" resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.5.0.tgz#8195f3e4c0ff0742182c81ae54aad78d07a24bcf" @@ -10841,11 +10875,6 @@ jpeg-js@^0.3.4: resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.3.7.tgz#471a89d06011640592d314158608690172b1028d" integrity sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ== -jquery-deferred@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/jquery-deferred/-/jquery-deferred-0.3.1.tgz#596eca1caaff54f61b110962b23cafea74c35355" - integrity sha1-WW7KHKr/VPYbEQlisjyv6nTDU1U= - jquery@^3.5.0, jquery@^3.5.1: version "3.6.0" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470" @@ -12278,15 +12307,6 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -najax@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/najax/-/najax-1.0.4.tgz#63fd8dbf15d18f24dc895b3a16fec66c136b8084" - integrity sha512-wsSacA+RkgY1wxRxXCT3tdqzmamEv9PLeoV/ub9SlLf2RngbPMSqc3A7H35XJDfURC0twMmZsnPdsYPkuuFSVg== - dependencies: - jquery-deferred "^0.3.0" - lodash.defaultsdeep "^4.6.0" - qs "^6.2.0" - nan@^2.12.1: version "2.14.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" @@ -12354,6 +12374,13 @@ node-fetch@^2.6.0: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== +node-fetch@^2.6.1: + version "2.6.6" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89" + integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA== + dependencies: + whatwg-url "^5.0.0" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -13598,7 +13625,7 @@ qs@6.7.0: resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== -qs@^6.2.0, qs@^6.4.0: +qs@^6.4.0: version "6.9.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e" integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw== @@ -15659,7 +15686,7 @@ tr46@^3.0.0: dependencies: punycode "^2.1.1" -tr46@~0.0.1: +tr46@~0.0.1, tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= @@ -16188,6 +16215,11 @@ webidl-conversions@^2.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-2.0.1.tgz#3bf8258f7d318c7443c36f2e169402a1a6703506" integrity sha1-O/glj30xjHRDw28uFpQCoaZwNQY= +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + webidl-conversions@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" @@ -16273,6 +16305,11 @@ whatwg-fetch@^3.4.0: resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.5.0.tgz#605a2cd0a7146e5db141e29d1c62ab84c0c4c868" integrity sha512-jXkLtsR42xhXg7akoDKvKWE40eJeI+2KZqcp2h3NsOrRnDvtWX36KcKl30dy+hxECivdk2BVUHVNrPtoMBUx6A== +whatwg-fetch@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + whatwg-mimetype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" @@ -16298,6 +16335,14 @@ whatwg-url@^10.0.0: tr46 "^3.0.0" webidl-conversions "^7.0.0" +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + whatwg-url@^8.0.0, whatwg-url@^8.5.0: version "8.5.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.5.0.tgz#7752b8464fc0903fec89aa9846fc9efe07351fd3" From 29325acd258fbfb71651eead1ad7b8463acc50c9 Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Sat, 11 Dec 2021 21:18:50 -0500 Subject: [PATCH 859/879] Add 3.28 scenario to test matrix --- .github/workflows/ci.yml | 1 + config/ember-try.js | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c81119276..286b8393f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -59,6 +59,7 @@ jobs: try-scenario: - ember-lts-3.20 - ember-lts-3.24 + - ember-lts-3.28 #- ember-release #- ember-beta #- ember-canary diff --git a/config/ember-try.js b/config/ember-try.js index cea80661e..1e83df0aa 100644 --- a/config/ember-try.js +++ b/config/ember-try.js @@ -23,6 +23,14 @@ module.exports = async function () { }, }, }, + { + name: 'ember-lts-3.28', + npm: { + devDependencies: { + 'ember-source': '~3.28.8', + }, + }, + }, { name: 'ember-release', npm: { From e7b7c7f612be762b15601d4dbb27d8b247c38120 Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Sun, 12 Dec 2021 23:42:44 -0500 Subject: [PATCH 860/879] Run ember-cli-update to v3.28.4 --- .editorconfig | 1 - .eslintrc.js | 2 +- .github/workflows/ci.yml | 4 +- .gitignore | 3 + .npmignore | 16 +- .template-lintrc.js | 3 - config/ember-try.js | 11 +- config/environment.js | 2 +- ember-cli-build.js | 9 +- index.js | 2 +- package.json | 37 +- scripts/test.sh | 4 +- test-projects/01-basic-app/.editorconfig | 1 - test-projects/01-basic-app/.gitignore | 19 +- test-projects/01-basic-app/.travis.yml | 29 - test-projects/01-basic-app/README.md | 4 +- .../app/templates/components/.gitkeep | 0 .../01-basic-app/config/ember-cli-update.json | 21 + .../01-basic-app/config/environment.js | 10 +- .../config/optional-features.json | 5 +- test-projects/01-basic-app/config/targets.js | 24 +- test-projects/01-basic-app/ember-cli-build.js | 2 +- test-projects/01-basic-app/package.json | 18 +- test-projects/01-basic-app/testem.js | 25 +- test-projects/01-basic-app/tests/index.html | 2 +- .../02-app-that-excludes-mirage/.editorconfig | 1 - .../02-app-that-excludes-mirage/.gitignore | 19 +- .../02-app-that-excludes-mirage/.travis.yml | 29 - .../02-app-that-excludes-mirage/README.md | 4 +- .../02-app-that-excludes-mirage/app/router.js | 2 +- .../app/templates/components/.gitkeep | 0 .../config/ember-cli-update.json | 20 + .../config/environment.js | 12 +- .../config/optional-features.json | 5 +- .../config/targets.js | 24 +- .../ember-cli-build.js | 2 +- .../02-app-that-excludes-mirage/package.json | 21 +- .../02-app-that-excludes-mirage/testem.js | 26 +- .../tests/index.html | 2 +- testem.js | 20 +- tests/dummy/config/ember-cli-update.json | 21 + tests/dummy/config/environment.js | 10 +- tests/dummy/config/targets.js | 24 +- tests/index.html | 9 +- yarn.lock | 2301 ++++++++--------- 45 files changed, 1411 insertions(+), 1395 deletions(-) delete mode 100644 test-projects/01-basic-app/.travis.yml delete mode 100644 test-projects/01-basic-app/app/templates/components/.gitkeep create mode 100644 test-projects/01-basic-app/config/ember-cli-update.json delete mode 100644 test-projects/02-app-that-excludes-mirage/.travis.yml delete mode 100644 test-projects/02-app-that-excludes-mirage/app/templates/components/.gitkeep create mode 100644 test-projects/02-app-that-excludes-mirage/config/ember-cli-update.json create mode 100644 tests/dummy/config/ember-cli-update.json diff --git a/.editorconfig b/.editorconfig index 219985c22..c35a00240 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,7 +4,6 @@ root = true - [*] end_of_line = lf charset = utf-8 diff --git a/.eslintrc.js b/.eslintrc.js index 36a883d02..4a2a174ea 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -49,7 +49,7 @@ module.exports = { extends: ['plugin:node/recommended'], }, { - // test files + // Test files: files: ['tests/**/*-test.{js,ts}'], extends: ['plugin:qunit/recommended'], }, diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 286b8393f..2f205c94a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,7 +25,7 @@ jobs: - name: Lint run: yarn lint - name: Run Browser Tests - run: yarn test:browser + run: yarn test:ember - name: Run Node Tests run: yarn test:test-projects @@ -43,7 +43,7 @@ jobs: - name: Install Dependencies run: yarn install --no-lockfile - name: Run Browser Tests - run: yarn test:browser + run: yarn test:ember - name: Run Node Tests run: yarn test:test-projects diff --git a/.gitignore b/.gitignore index 2e1cbcb2d..d3a027916 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,10 @@ /node_modules/ # misc +/.env* +/.pnp* /.sass-cache +/.eslintcache /connect.lock /coverage/ /libpeerconnection.log diff --git a/.npmignore b/.npmignore index 40f43e20f..804020bd7 100644 --- a/.npmignore +++ b/.npmignore @@ -9,21 +9,24 @@ /.bowerrc /.editorconfig /.ember-cli +/.env* +/.eslintcache /.eslintignore /.eslintrc.js +/.git/ /.gitignore -/.watchmanconfig +/.prettierignore +/.prettierrc.js +/.template-lintrc.js /.travis.yml +/.watchmanconfig /bower.json /config/ember-try.js -/dist -/scripts -/tmp -**/.gitkeep -bower.json +/CONTRIBUTING.md /ember-cli-build.js /testem.js /tests/ +/yarn-error.log /yarn.lock .gitkeep @@ -37,3 +40,4 @@ bower.json *.md /test-projects +/scripts diff --git a/.template-lintrc.js b/.template-lintrc.js index 3da23f5d6..f35f61c7b 100644 --- a/.template-lintrc.js +++ b/.template-lintrc.js @@ -2,7 +2,4 @@ module.exports = { extends: 'recommended', - rules: { - 'block-indentation': false - } }; diff --git a/config/ember-try.js b/config/ember-try.js index 1e83df0aa..58ac73150 100644 --- a/config/ember-try.js +++ b/config/ember-try.js @@ -41,9 +41,6 @@ module.exports = async function () { 'ember-auto-import': '^2.2.4', 'webpack': '^5.64.4' }, - ember: { - edition: 'octane', - }, }, }, { @@ -56,9 +53,6 @@ module.exports = async function () { 'ember-auto-import': '^2.2.4', 'webpack': '^5.64.4' }, - ember: { - edition: 'octane', - }, }, }, { @@ -71,9 +65,6 @@ module.exports = async function () { 'ember-auto-import': '^2.2.4', 'webpack': '^5.64.4' }, - ember: { - edition: 'octane', - }, }, }, { @@ -100,7 +91,7 @@ module.exports = async function () { }, npm: { devDependencies: { - 'ember-source': '~3.24.0', + 'ember-source': '~3.28.8', }, ember: { edition: 'classic', diff --git a/config/environment.js b/config/environment.js index 758941cfa..5b584ec78 100644 --- a/config/environment.js +++ b/config/environment.js @@ -18,7 +18,7 @@ function usingProxy() { return usingProxyArg || hasGeneratedProxies; } -module.exports = function(environment, appConfig) { +module.exports = function (environment, appConfig) { appConfig['ember-cli-mirage'] = appConfig['ember-cli-mirage'] || {}; appConfig['ember-cli-mirage'].usingProxy = usingProxy(); appConfig['ember-cli-mirage'].useDefaultPassthroughs = true; diff --git a/ember-cli-build.js b/ember-cli-build.js index a24bfde9d..0af5603bf 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -28,5 +28,12 @@ module.exports = function (defaults) { or app's build file. */ - return app.toTree(); + const { maybeEmbroider } = require('@embroider/test-setup'); + return maybeEmbroider(app, { + skipBabel: [ + { + package: 'qunit', + }, + ], + }); }; diff --git a/index.js b/index.js index 83e6214b8..fb05d226b 100644 --- a/index.js +++ b/index.js @@ -5,7 +5,7 @@ const Funnel = require('broccoli-funnel'); const writeFile = require('broccoli-file-creator'); module.exports = { - name: 'ember-cli-mirage', + name: require('./package').name, // isDevelopingAddon: function () { // return true; diff --git a/package.json b/package.json index 1dc4a671b..be669a828 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "url": "https://github.com/miragejs/ember-cli-mirage/issues" }, "scripts": { - "build": "ember build", + "build": "ember build --environment=production", "lint": "npm-run-all --aggregate-output --continue-on-error --parallel \"lint:!(fix)\"", "lint:fix": "npm-run-all --aggregate-output --continue-on-error --parallel lint:*:fix", "lint:hbs": "ember-template-lint .", @@ -32,9 +32,9 @@ "lint:js": "eslint . --cache", "lint:js:fix": "eslint . --fix", "start": "ember serve", - "test": "ember test", - "test:all": "ember try:each", - "test:browser": "ember test --test-port=0", + "test": "npm-run-all lint test:*", + "test:ember": "ember test", + "test:ember-compatibility": "ember try:each", "test:test-projects": "./scripts/test.sh", "prepare": "./scripts/link.sh" }, @@ -43,8 +43,8 @@ "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^3.0.3", "broccoli-merge-trees": "^4.2.0", - "ember-auto-import": "^1.2.19", - "ember-cli-babel": "^7.5.0", + "ember-auto-import": "^1.12.0", + "ember-cli-babel": "^7.26.6", "ember-destroyable-polyfill": "^2.0.3", "ember-get-config": "0.2.4 - 0.5.0", "ember-inflector": "^2.0.0 || ^3.0.0 || ^4.0.2", @@ -55,36 +55,37 @@ "@ember/jquery": "^2.0.0", "@ember/optional-features": "^2.0.0", "@ember/test-helpers": "^2.6.0", + "@embroider/test-setup": "^0.41.0", "@glimmer/component": "^1.0.4", "@glimmer/tracking": "^1.0.4", - "babel-eslint": "^10.0.3", + "babel-eslint": "^10.1.0", "broccoli-asset-rev": "^3.0.0", - "ember-cli": "~3.4.4", + "ember-cli": "~3.28.4", "ember-cli-addon-docs": "^3.0.0", "ember-cli-addon-docs-esdoc": "^0.2.3", - "ember-cli-dependency-checker": "^3.0.0", + "ember-cli-dependency-checker": "^3.2.0", "ember-cli-deploy": "^1.0.2", "ember-cli-deploy-build": "^2.0.0", "ember-cli-deploy-git": "^1.3.3", "ember-cli-deploy-git-ci": "^1.0.1", "ember-cli-fastboot": "^3.2.0-beta.5", "ember-cli-favicon": "^2.0.0", - "ember-cli-htmlbars": "^5.3.1", + "ember-cli-htmlbars": "^5.7.1", "ember-cli-inject-live-reload": "^2.1.0", "ember-cli-moment-shim": "^3.8.0", "ember-cli-sri": "^2.1.1", - "ember-cli-uglify": "^3.0.0", + "ember-cli-terser": "^4.0.2", "ember-composable-helpers": "^5.0.0", - "ember-data": "~3.14.0", + "ember-data": "~3.28.5", "ember-disable-prototype-extensions": "^1.1.3", - "ember-export-application-global": "^2.0.0", + "ember-export-application-global": "^2.0.1", "ember-fetch": "^8.1.1", - "ember-load-initializers": "^2.0.0", + "ember-load-initializers": "^2.1.2", "ember-maybe-import-regenerator": "^1.0.0", "ember-moment": "^9.0.1", "ember-qunit": "^5.1.5", "ember-resolver": "^8.0.3", - "ember-source": "~3.26.1", + "ember-source": "~3.28.8", "ember-source-channel-url": "^3.0.0", "ember-template-lint": "^3.14.0", "ember-try": "^2.0.0", @@ -102,9 +103,7 @@ "qunit-dom": "^2.0.0" }, "resolutions": { - "favicons": "5.3.0", - "ember-auto-import/**/terser-webpack-plugin": "1.2.1", - "ember-data": "3.14.0" + "favicons": "5.3.0" }, "engines": { "node": ">= 10.*" @@ -119,7 +118,7 @@ } }, "ember": { - "edition": "classic" + "edition": "octane" }, "ember-addon": { "configPath": "tests/dummy/config", diff --git a/scripts/test.sh b/scripts/test.sh index 8f73ba394..b3675da7a 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -2,6 +2,6 @@ ./scripts/parallel --tag <= 8.*" + "node": ">= 10.*" + }, + "ember": { + "edition": "octane" }, "volta": { "extends": "../../package.json" diff --git a/test-projects/01-basic-app/testem.js b/test-projects/01-basic-app/testem.js index 3a29d4059..1f6c614e5 100644 --- a/test-projects/01-basic-app/testem.js +++ b/test-projects/01-basic-app/testem.js @@ -1,23 +1,24 @@ +'use strict'; + module.exports = { test_page: 'tests/index.html?hidepassed', disable_watching: true, - launch_in_ci: [ - 'Chrome' - ], - launch_in_dev: [ - ], + launch_in_ci: ['Chrome'], + launch_in_dev: ['Chrome'], + browser_start_timeout: 120, browser_args: { Chrome: { mode: 'ci', args: [ // --no-sandbox is needed when running Chrome inside a container - process.env.TRAVIS ? '--no-sandbox' : null, - - '--disable-gpu', + process.env.CI ? '--no-sandbox' : null, '--headless', + '--disable-dev-shm-usage', + '--disable-software-rasterizer', + '--mute-audio', '--remote-debugging-port=0', - '--window-size=1440,900' - ].filter(Boolean) - } - } + '--window-size=1440,900', + ].filter(Boolean), + }, + }, }; diff --git a/test-projects/01-basic-app/tests/index.html b/test-projects/01-basic-app/tests/index.html index 4bfcf9865..25cdfb5cd 100644 --- a/test-projects/01-basic-app/tests/index.html +++ b/test-projects/01-basic-app/tests/index.html @@ -28,7 +28,7 @@
    - + diff --git a/test-projects/02-app-that-excludes-mirage/.editorconfig b/test-projects/02-app-that-excludes-mirage/.editorconfig index 219985c22..c35a00240 100644 --- a/test-projects/02-app-that-excludes-mirage/.editorconfig +++ b/test-projects/02-app-that-excludes-mirage/.editorconfig @@ -4,7 +4,6 @@ root = true - [*] end_of_line = lf charset = utf-8 diff --git a/test-projects/02-app-that-excludes-mirage/.gitignore b/test-projects/02-app-that-excludes-mirage/.gitignore index 8fa39a63c..4156d2e30 100644 --- a/test-projects/02-app-that-excludes-mirage/.gitignore +++ b/test-projects/02-app-that-excludes-mirage/.gitignore @@ -1,21 +1,24 @@ # See https://help.github.com/ignore-files/ for more about ignoring files. # compiled output -/dist -/tmp +/dist/ +/tmp/ # dependencies -/node_modules -/bower_components +/bower_components/ +/node_modules/ # misc +/.env* +/.pnp* /.sass-cache +/.eslintcache /connect.lock -/coverage/* +/coverage/ /libpeerconnection.log -npm-debug.log* -yarn-error.log -testem.log +/npm-debug.log* +/testem.log +/yarn-error.log # ember-try .node_modules.ember-try/ diff --git a/test-projects/02-app-that-excludes-mirage/.travis.yml b/test-projects/02-app-that-excludes-mirage/.travis.yml deleted file mode 100644 index 68a25a16e..000000000 --- a/test-projects/02-app-that-excludes-mirage/.travis.yml +++ /dev/null @@ -1,29 +0,0 @@ ---- -language: node_js -node_js: - - "6" - -sudo: false -dist: trusty - -addons: - chrome: stable - -cache: - yarn: true - -env: - global: - # See https://git.io/vdao3 for details. - - JOBS=1 - -before_install: - - curl -o- -L https://yarnpkg.com/install.sh | bash - - export PATH=$HOME/.yarn/bin:$PATH - -install: - - yarn install --non-interactive - -script: - - yarn lint:js - - yarn test diff --git a/test-projects/02-app-that-excludes-mirage/README.md b/test-projects/02-app-that-excludes-mirage/README.md index b29133388..7078509d6 100644 --- a/test-projects/02-app-that-excludes-mirage/README.md +++ b/test-projects/02-app-that-excludes-mirage/README.md @@ -36,8 +36,8 @@ Make use of the many generators for code, try `ember help generate` for more det ### Linting -* `yarn lint:js` -* `yarn lint:js --fix` +* `npm run lint` +* `npm run lint:fix` ### Building diff --git a/test-projects/02-app-that-excludes-mirage/app/router.js b/test-projects/02-app-that-excludes-mirage/app/router.js index f602c5f68..90091dca2 100644 --- a/test-projects/02-app-that-excludes-mirage/app/router.js +++ b/test-projects/02-app-that-excludes-mirage/app/router.js @@ -6,4 +6,4 @@ export default class Router extends EmberRouter { rootURL = config.rootURL; } -Router.map(function() {}); +Router.map(function () {}); diff --git a/test-projects/02-app-that-excludes-mirage/app/templates/components/.gitkeep b/test-projects/02-app-that-excludes-mirage/app/templates/components/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/test-projects/02-app-that-excludes-mirage/config/ember-cli-update.json b/test-projects/02-app-that-excludes-mirage/config/ember-cli-update.json new file mode 100644 index 000000000..192c7719f --- /dev/null +++ b/test-projects/02-app-that-excludes-mirage/config/ember-cli-update.json @@ -0,0 +1,20 @@ +{ + "schemaVersion": "1.0.0", + "packages": [ + { + "name": "ember-cli", + "version": "3.28.4", + "blueprints": [ + { + "name": "app", + "outputRepo": "https://github.com/ember-cli/ember-new-output", + "codemodsSource": "ember-app-codemods-manifest@1", + "isBaseBlueprint": true, + "options": [ + "--no-welcome" + ] + } + ] + } + ] +} diff --git a/test-projects/02-app-that-excludes-mirage/config/environment.js b/test-projects/02-app-that-excludes-mirage/config/environment.js index 2e369f75f..688fd2276 100644 --- a/test-projects/02-app-that-excludes-mirage/config/environment.js +++ b/test-projects/02-app-that-excludes-mirage/config/environment.js @@ -1,6 +1,6 @@ 'use strict'; -module.exports = function(environment) { +module.exports = function (environment) { let ENV = { modulePrefix: 'basic-app', environment, @@ -9,12 +9,12 @@ module.exports = function(environment) { EmberENV: { FEATURES: { // Here you can enable experimental features on an ember canary build - // e.g. 'with-controller': true + // e.g. EMBER_NATIVE_DECORATOR_SUPPORT: true }, EXTEND_PROTOTYPES: { // Prevent Ember Data from overriding Date.parse. - Date: false - } + Date: false, + }, }, APP: { @@ -22,8 +22,8 @@ module.exports = function(environment) { // when it is created }, 'ember-cli-mirage': { - excludeFilesFromBuild: true - } + excludeFilesFromBuild: true, + }, }; if (environment === 'development') { diff --git a/test-projects/02-app-that-excludes-mirage/config/optional-features.json b/test-projects/02-app-that-excludes-mirage/config/optional-features.json index 21f1dc719..b26286e2e 100644 --- a/test-projects/02-app-that-excludes-mirage/config/optional-features.json +++ b/test-projects/02-app-that-excludes-mirage/config/optional-features.json @@ -1,3 +1,6 @@ { - "jquery-integration": true + "application-template-wrapper": false, + "default-async-observers": true, + "jquery-integration": false, + "template-only-glimmer-components": true } diff --git a/test-projects/02-app-that-excludes-mirage/config/targets.js b/test-projects/02-app-that-excludes-mirage/config/targets.js index 276d39d41..0b433b73c 100644 --- a/test-projects/02-app-that-excludes-mirage/config/targets.js +++ b/test-projects/02-app-that-excludes-mirage/config/targets.js @@ -3,17 +3,25 @@ const browsers = [ 'last 1 Chrome versions', 'last 1 Firefox versions', - 'last 1 Safari versions' + 'last 1 Safari versions', ]; -const isCI = !!process.env.CI; -const isProduction = process.env.EMBER_ENV === 'production'; - -if (isCI || isProduction) { - browsers.push('ie 11'); -} +// Ember's browser support policy is changing, and IE11 support will end in +// v4.0 onwards. +// +// See https://deprecations.emberjs.com/v3.x#toc_3-0-browser-support-policy +// +// If you need IE11 support on a version of Ember that still offers support +// for it, uncomment the code block below. +// +// const isCI = Boolean(process.env.CI); +// const isProduction = process.env.EMBER_ENV === 'production'; +// +// if (isCI || isProduction) { +// browsers.push('ie 11'); +// } module.exports = { browsers, - node: 'current' + node: 'current', }; diff --git a/test-projects/02-app-that-excludes-mirage/ember-cli-build.js b/test-projects/02-app-that-excludes-mirage/ember-cli-build.js index d690a2531..48e94e9e4 100644 --- a/test-projects/02-app-that-excludes-mirage/ember-cli-build.js +++ b/test-projects/02-app-that-excludes-mirage/ember-cli-build.js @@ -2,7 +2,7 @@ const EmberApp = require('ember-cli/lib/broccoli/ember-app'); -module.exports = function(defaults) { +module.exports = function (defaults) { let app = new EmberApp(defaults, { // Add options here }); diff --git a/test-projects/02-app-that-excludes-mirage/package.json b/test-projects/02-app-that-excludes-mirage/package.json index 2f651330c..acc03f67e 100644 --- a/test-projects/02-app-that-excludes-mirage/package.json +++ b/test-projects/02-app-that-excludes-mirage/package.json @@ -11,15 +11,19 @@ }, "repository": "", "scripts": { - "build": "ember build", - "lint:js": "eslint ./*.js app blueprints config lib server tests", + "build": "ember build --environment=production", "start": "ember serve", - "test": "ember test --test-port=0", + "test": "npm-run-all lint test:*", + "test:ember": "ember test --test-port=0", "test:fastboot": "qunit fastboot-tests/**/*.js" }, "devDependencies": { "@ember/jquery": "*", + "@ember/optional-features": "*", "@ember/test-helpers": "*", + "@embroider/test-setup": "*", + "@glimmer/component": "*", + "@glimmer/tracking": "*", "broccoli-asset-rev": "*", "ember-auto-import": "*", "ember-cli": "*", @@ -30,7 +34,7 @@ "ember-cli-inject-live-reload": "*", "ember-cli-mirage": "*", "ember-cli-sri": "*", - "ember-cli-uglify": "*", + "ember-cli-terser": "*", "ember-data": "*", "ember-export-application-global": "*", "ember-fetch": "*", @@ -39,15 +43,20 @@ "ember-qunit": "*", "ember-resolver": "*", "ember-source": "*", - "eslint-plugin-ember": "*", + "faker": "*", "fastboot": "*", "jsdom": "*", "loader.js": "*", + "miragejs": "*", + "npm-run-all": "*", "qunit": "*", "qunit-dom": "*" }, "engines": { - "node": ">= 8.*" + "node": ">= 10.*" + }, + "ember": { + "edition": "octane" }, "volta": { "extends": "../../package.json" diff --git a/test-projects/02-app-that-excludes-mirage/testem.js b/test-projects/02-app-that-excludes-mirage/testem.js index d1755a4ea..1f6c614e5 100644 --- a/test-projects/02-app-that-excludes-mirage/testem.js +++ b/test-projects/02-app-that-excludes-mirage/testem.js @@ -1,24 +1,24 @@ +'use strict'; + module.exports = { test_page: 'tests/index.html?hidepassed', disable_watching: true, - launch_in_ci: [ - 'Chrome' - ], - launch_in_dev: [ - 'Chrome' - ], + launch_in_ci: ['Chrome'], + launch_in_dev: ['Chrome'], + browser_start_timeout: 120, browser_args: { Chrome: { mode: 'ci', args: [ // --no-sandbox is needed when running Chrome inside a container - process.env.TRAVIS ? '--no-sandbox' : null, - - '--disable-gpu', + process.env.CI ? '--no-sandbox' : null, '--headless', + '--disable-dev-shm-usage', + '--disable-software-rasterizer', + '--mute-audio', '--remote-debugging-port=0', - '--window-size=1440,900' - ].filter(Boolean) - } - } + '--window-size=1440,900', + ].filter(Boolean), + }, + }, }; diff --git a/test-projects/02-app-that-excludes-mirage/tests/index.html b/test-projects/02-app-that-excludes-mirage/tests/index.html index 4bfcf9865..25cdfb5cd 100644 --- a/test-projects/02-app-that-excludes-mirage/tests/index.html +++ b/test-projects/02-app-that-excludes-mirage/tests/index.html @@ -28,7 +28,7 @@
    - + diff --git a/testem.js b/testem.js index 726d18799..ed2f37124 100644 --- a/testem.js +++ b/testem.js @@ -1,25 +1,23 @@ +'use strict'; + module.exports = { test_page: 'tests/index.html?hidepassed', disable_watching: true, - launch_in_ci: [ - 'Chrome' - ], - launch_in_dev: [ - 'Chrome' - ], + launch_in_ci: ['Chrome'], + launch_in_dev: ['Chrome'], + browser_start_timeout: 120, browser_args: { Chrome: { ci: [ // --no-sandbox is needed when running Chrome inside a container process.env.CI ? '--no-sandbox' : null, '--headless', - '--disable-gpu', '--disable-dev-shm-usage', '--disable-software-rasterizer', '--mute-audio', '--remote-debugging-port=0', - '--window-size=1440,900' - ].filter(Boolean) - } - } + '--window-size=1440,900', + ].filter(Boolean), + }, + }, }; diff --git a/tests/dummy/config/ember-cli-update.json b/tests/dummy/config/ember-cli-update.json new file mode 100644 index 000000000..73cc7e5cf --- /dev/null +++ b/tests/dummy/config/ember-cli-update.json @@ -0,0 +1,21 @@ +{ + "schemaVersion": "1.0.0", + "packages": [ + { + "name": "ember-cli", + "version": "3.28.4", + "blueprints": [ + { + "name": "addon", + "outputRepo": "https://github.com/ember-cli/ember-addon-output", + "codemodsSource": "ember-addon-codemods-manifest@1", + "isBaseBlueprint": true, + "options": [ + "--yarn", + "--no-welcome" + ] + } + ] + } + ] +} diff --git a/tests/dummy/config/environment.js b/tests/dummy/config/environment.js index 9379c0920..557fd1513 100644 --- a/tests/dummy/config/environment.js +++ b/tests/dummy/config/environment.js @@ -1,6 +1,6 @@ 'use strict'; -module.exports = function(environment) { +module.exports = function (environment) { let ENV = { modulePrefix: 'dummy', podModulePrefix: 'dummy/pods', @@ -10,12 +10,12 @@ module.exports = function(environment) { EmberENV: { FEATURES: { // Here you can enable experimental features on an ember canary build - // e.g. 'with-controller': true + // e.g. EMBER_NATIVE_DECORATOR_SUPPORT: true }, EXTEND_PROTOTYPES: { // Prevent Ember Data from overriding Date.parse. - Date: false - } + Date: false, + }, }, APP: { @@ -25,7 +25,7 @@ module.exports = function(environment) { 'ember-cli-addon-docs': { showImportPaths: false - } + }, }; if (environment === 'development') { diff --git a/tests/dummy/config/targets.js b/tests/dummy/config/targets.js index 276d39d41..0b433b73c 100644 --- a/tests/dummy/config/targets.js +++ b/tests/dummy/config/targets.js @@ -3,17 +3,25 @@ const browsers = [ 'last 1 Chrome versions', 'last 1 Firefox versions', - 'last 1 Safari versions' + 'last 1 Safari versions', ]; -const isCI = !!process.env.CI; -const isProduction = process.env.EMBER_ENV === 'production'; - -if (isCI || isProduction) { - browsers.push('ie 11'); -} +// Ember's browser support policy is changing, and IE11 support will end in +// v4.0 onwards. +// +// See https://deprecations.emberjs.com/v3.x#toc_3-0-browser-support-policy +// +// If you need IE11 support on a version of Ember that still offers support +// for it, uncomment the code block below. +// +// const isCI = Boolean(process.env.CI); +// const isProduction = process.env.EMBER_ENV === 'production'; +// +// if (isCI || isProduction) { +// browsers.push('ie 11'); +// } module.exports = { browsers, - node: 'current' + node: 'current', }; diff --git a/tests/index.html b/tests/index.html index 24436a9e7..6d13069ac 100644 --- a/tests/index.html +++ b/tests/index.html @@ -28,14 +28,7 @@

    -
    -
    -
    -
    -
    -
    - - + diff --git a/yarn.lock b/yarn.lock index cf7d91ff7..c3ef4d001 100644 --- a/yarn.lock +++ b/yarn.lock @@ -79,7 +79,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.13.10": +"@babel/core@^7.13.10", "@babel/core@^7.13.8": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.0.tgz#c4ff44046f5fe310525cc9eb4ef5147f0c5374d4" integrity sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ== @@ -994,7 +994,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-block-scoping@^7.12.1", "@babel/plugin-transform-block-scoping@^7.6.2", "@babel/plugin-transform-block-scoping@^7.8.3": +"@babel/plugin-transform-block-scoping@^7.12.1", "@babel/plugin-transform-block-scoping@^7.8.3": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz#f0ee727874b42a208a48a586b84c3d222c2bbef1" integrity sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w== @@ -1473,6 +1473,14 @@ "@babel/helper-validator-identifier" "^7.15.7" to-fast-properties "^2.0.0" +"@cnakazawa/watch@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + "@csstools/postcss-sass@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@csstools/postcss-sass/-/postcss-sass-4.0.0.tgz#6617c5096a6b71751ee0b87d2326418b9d97effb" @@ -1488,188 +1496,130 @@ resolved "https://registry.yarnpkg.com/@csstools/sass-import-resolve/-/sass-import-resolve-1.0.0.tgz#32c3cdb2f7af3cd8f0dca357b592e7271f3831b5" integrity sha512-pH4KCsbtBLLe7eqUrw8brcuFO8IZlN36JjdKlOublibVdAIPHCzEnpBWOVUXK5sCf+DpBi8ZtuWtjF0srybdeA== -"@ember-data/-build-infra@3.14.0": - version "3.14.0" - resolved "https://registry.yarnpkg.com/@ember-data/-build-infra/-/-build-infra-3.14.0.tgz#d81242b018038b0bf39bceaa1b0df167398f60b8" - integrity sha512-rF3RDpDe49UnhhNxRLCkOSqO6DDl2zxJB4+1ZYXNjxkWoxRZQ2U/Hzq28+khEz2WFdiGFSaK8jT1tFTZ1xoutw== +"@ember-data/adapter@3.28.5": + version "3.28.5" + resolved "https://registry.yarnpkg.com/@ember-data/adapter/-/adapter-3.28.5.tgz#34c3bca462983197803f2a9f571fc581da7bad7e" + integrity sha512-ywfm5F/yFujnR+UmKw9NHIStrxvEP/nIyL2/7YzZnqbVq8Ny+LVKyuRB0bRY0iZQ+IAWQODbM59A8YjcVRC6Cg== dependencies: - "@babel/plugin-transform-block-scoping" "^7.6.2" - "@ember-data/canary-features" "3.14.0" - "@ember/edition-utils" "^1.1.1" - babel-plugin-debug-macros "^0.3.3" - babel-plugin-feature-flags "^0.3.1" - babel-plugin-filter-imports "^3.0.0" - babel6-plugin-strip-class-callcheck "^6.0.0" - broccoli-debug "^0.6.5" - broccoli-file-creator "^2.1.1" - broccoli-funnel "^2.0.2" - broccoli-merge-trees "^3.0.2" - broccoli-rollup "^4.1.1" - calculate-cache-key-for-tree "^2.0.0" - chalk "^2.4.1" - ember-cli-path-utils "^1.0.0" + "@ember-data/private-build-infra" "3.28.5" + "@ember-data/store" "3.28.5" + "@ember/edition-utils" "^1.2.0" + "@ember/string" "^3.0.0" + ember-cli-babel "^7.26.6" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^4.1.0" + +"@ember-data/canary-features@3.28.5": + version "3.28.5" + resolved "https://registry.yarnpkg.com/@ember-data/canary-features/-/canary-features-3.28.5.tgz#74cee8904deb0462f11f095fd9683114e23cc444" + integrity sha512-mJzaJ6oCeP4QEJ+9BOr0mdsQ2970yECmiBePadoGiJRJ9JRQcc4GoZfaO/W6Ej7nmp/kSWC/Pc3ROaSkq33SJg== + dependencies: + ember-cli-babel "^7.26.6" + ember-cli-typescript "^4.1.0" + +"@ember-data/debug@3.28.5": + version "3.28.5" + resolved "https://registry.yarnpkg.com/@ember-data/debug/-/debug-3.28.5.tgz#d5cfd8fb33d13f30eaa3038cd0d69714561cf3b4" + integrity sha512-NzbeD5Ax6UvJ6/wFt2ud7AZdIfRLeLH+FP9xzmnqT7NN+Eyn9eti4eqwFgyYljALURpCOxLQ/BhQOtUSWfjOFw== + dependencies: + "@ember-data/private-build-infra" "3.28.5" + "@ember/edition-utils" "^1.2.0" + "@ember/string" "^3.0.0" + ember-cli-babel "^7.26.6" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^4.1.0" + +"@ember-data/model@3.28.5": + version "3.28.5" + resolved "https://registry.yarnpkg.com/@ember-data/model/-/model-3.28.5.tgz#5aa2c684226ccf3e633f036795bfdfb87d7d19b4" + integrity sha512-g95kqeJccZxo1f9j95GWYbgJXAhCE7xwSiwIBs68ZzEAHV74dE/2QapwC8wsN9t89fSpDG/Lz8JXf0EUMPoglA== + dependencies: + "@ember-data/canary-features" "3.28.5" + "@ember-data/private-build-infra" "3.28.5" + "@ember-data/store" "3.28.5" + "@ember/edition-utils" "^1.2.0" + "@ember/string" "^3.0.0" + ember-cached-decorator-polyfill "^0.1.4" + ember-cli-babel "^7.26.6" ember-cli-string-utils "^1.1.0" - ember-cli-version-checker "^3.1.2" - esm "^3.2.25" - git-repo-info "^2.0.0" - glob "^7.1.4" - npm-git-info "^1.0.3" - rimraf "^3.0.0" - rsvp "^4.8.5" - silent-error "^1.1.1" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^4.1.0" + ember-compatibility-helpers "^1.2.0" + inflection "~1.13.1" -"@ember-data/-build-infra@3.14.1": - version "3.14.1" - resolved "https://registry.yarnpkg.com/@ember-data/-build-infra/-/-build-infra-3.14.1.tgz#1526a6f5315aa23bc0ea76dfe0ba17318ae11257" - integrity sha512-A8l1SSry6bD4aVgm/ZUUbZJpI6PR0QHdbds+zf2mhcudR8/L/ruT0ooe/oLUds7bo+bbHr2K1ugHs2GbDi1rUg== +"@ember-data/private-build-infra@3.28.5": + version "3.28.5" + resolved "https://registry.yarnpkg.com/@ember-data/private-build-infra/-/private-build-infra-3.28.5.tgz#f3f4ac9f2d728abd3652ae0096ab3b3983841051" + integrity sha512-uyiUE/vBunvulFfVWwf/eFLRl3hBhBFoTG+GTjhTGdosLmACjzcaOGe9bGNhmnGBQZLPckWSgM1qrCKDEQCgPw== dependencies: - "@babel/plugin-transform-block-scoping" "^7.6.2" - "@ember-data/canary-features" "3.14.1" - "@ember/edition-utils" "^1.1.1" + "@babel/plugin-transform-block-scoping" "^7.8.3" + "@ember-data/canary-features" "3.28.5" + "@ember/edition-utils" "^1.2.0" babel-plugin-debug-macros "^0.3.3" - babel-plugin-feature-flags "^0.3.1" - babel-plugin-filter-imports "^3.0.0" + babel-plugin-filter-imports "^4.0.0" babel6-plugin-strip-class-callcheck "^6.0.0" broccoli-debug "^0.6.5" broccoli-file-creator "^2.1.1" - broccoli-funnel "^2.0.2" - broccoli-merge-trees "^3.0.2" - broccoli-rollup "^4.1.1" + broccoli-funnel "^3.0.3" + broccoli-merge-trees "^4.2.0" + broccoli-rollup "^5.0.0" calculate-cache-key-for-tree "^2.0.0" - chalk "^2.4.1" + chalk "^4.0.0" + ember-cli-babel "^7.26.6" ember-cli-path-utils "^1.0.0" ember-cli-string-utils "^1.1.0" - ember-cli-version-checker "^3.1.2" + ember-cli-typescript "^4.1.0" + ember-cli-version-checker "^5.1.1" esm "^3.2.25" - git-repo-info "^2.0.0" - glob "^7.1.4" + git-repo-info "^2.1.1" + glob "^7.1.6" npm-git-info "^1.0.3" - rimraf "^3.0.0" + rimraf "^3.0.2" rsvp "^4.8.5" + semver "^7.1.3" silent-error "^1.1.1" -"@ember-data/adapter@3.14.0": - version "3.14.0" - resolved "https://registry.yarnpkg.com/@ember-data/adapter/-/adapter-3.14.0.tgz#88900b0f77c042079683058c7a291103171fff67" - integrity sha512-bv8kiK3lUNQsMbxOSsk3N/aJ0ZjOe/5k5XH4921r/itxAtjzSYeIsjM0Ziyc9hubkUz3LDXJIU4ARgOUvi6gsw== - dependencies: - "@ember-data/-build-infra" "3.14.0" - "@ember/edition-utils" "^1.1.1" - ember-cli-babel "^7.11.1" - ember-cli-test-info "^1.0.0" - ember-cli-typescript "^3.0.0" - -"@ember-data/adapter@3.14.1": - version "3.14.1" - resolved "https://registry.yarnpkg.com/@ember-data/adapter/-/adapter-3.14.1.tgz#bbb2c2f8c8bdb3d93b50f2cc12c413ab4b18197c" - integrity sha512-xz9Z0tWlU9706V5zCbNAeXhaRZVdyJfdeUamdpAiX2T/RDE3m64bXeH4jOlyYAdWtgr0Yg3B8KF/hDUZuu3Kgw== +"@ember-data/record-data@3.28.5": + version "3.28.5" + resolved "https://registry.yarnpkg.com/@ember-data/record-data/-/record-data-3.28.5.tgz#fbfaf6fafecbd793fba9ca7d8ca1f96926368f28" + integrity sha512-VdJqu1GtYOFVtPWEU7PflGfDT2lZKJqI0rbCN+W2Nf1iLjpzEoB7nM05RnCKL0EhAwn/UKhOh1c3/Ztm5N9YNw== dependencies: - "@ember-data/-build-infra" "3.14.1" - "@ember/edition-utils" "^1.1.1" - ember-cli-babel "^7.11.1" - ember-cli-test-info "^1.0.0" - ember-cli-typescript "^3.0.0" - -"@ember-data/canary-features@3.14.0": - version "3.14.0" - resolved "https://registry.yarnpkg.com/@ember-data/canary-features/-/canary-features-3.14.0.tgz#0474ebcbf0102b3e705a6312c50fb933447b7462" - integrity sha512-VgXZk99tpHG30PLL46RC2TfzM8DLGLcliFfuP/+eo/ZfPJlwAneDJxxBlngAhSDfEFyZML5mXDOnHAxLghX5/A== - dependencies: - ember-cli-babel "^7.11.1" - -"@ember-data/canary-features@3.14.1": - version "3.14.1" - resolved "https://registry.yarnpkg.com/@ember-data/canary-features/-/canary-features-3.14.1.tgz#8bad8b76661644f00c33ba881ea62ce59e9afa84" - integrity sha512-l2XC+ymgv6ipvGo0MZGUdmFbKYkOfybfoH9FkxM/XwvwdbxUqBpUKtVvzHLm3PFgJhV1UIub5M69spsctBK/Ng== - dependencies: - ember-cli-babel "^7.11.1" - -"@ember-data/model@3.14.0": - version "3.14.0" - resolved "https://registry.yarnpkg.com/@ember-data/model/-/model-3.14.0.tgz#6c4a60143837355f0d124404ef256270b841788e" - integrity sha512-VYuZtF+4H672xfpnKdb0yXjUHVQ3nd9nE7wtL58oSbZtiYi6nNVtzGVs66M/e04mZI9zdofAAtUQ3eO1K+JQdg== - dependencies: - "@ember-data/-build-infra" "3.14.0" - "@ember-data/canary-features" "3.14.0" - "@ember-data/store" "3.14.0" - "@ember/edition-utils" "^1.1.1" - ember-cli-babel "^7.11.1" - ember-cli-string-utils "^1.1.0" - ember-cli-test-info "^1.0.0" - ember-cli-typescript "^3.0.0" - ember-compatibility-helpers "^1.2.0" - inflection "1.12.0" - -"@ember-data/model@3.14.1": - version "3.14.1" - resolved "https://registry.yarnpkg.com/@ember-data/model/-/model-3.14.1.tgz#026a84ebea06aff42e86c20b84b4253f72715012" - integrity sha512-IAD2MktqvvF0GSNmqtuW7cETQsemdnb5awAu41paLhtaEurqbeL3P9u7UDuTc9pw3nPa9xDY35wyEBmQZ//sSQ== - dependencies: - "@ember-data/-build-infra" "3.14.1" - "@ember-data/canary-features" "3.14.1" - "@ember-data/store" "3.14.1" - "@ember/edition-utils" "^1.1.1" - ember-cli-babel "^7.11.1" - ember-cli-string-utils "^1.1.0" + "@ember-data/canary-features" "3.28.5" + "@ember-data/private-build-infra" "3.28.5" + "@ember-data/store" "3.28.5" + "@ember/edition-utils" "^1.2.0" + ember-cli-babel "^7.26.6" ember-cli-test-info "^1.0.0" - ember-cli-typescript "^3.0.0" - ember-compatibility-helpers "^1.2.0" - inflection "1.12.0" + ember-cli-typescript "^4.1.0" "@ember-data/rfc395-data@^0.0.4": version "0.0.4" resolved "https://registry.yarnpkg.com/@ember-data/rfc395-data/-/rfc395-data-0.0.4.tgz#ecb86efdf5d7733a76ff14ea651a1b0ed1f8a843" integrity sha512-tGRdvgC9/QMQSuSuJV45xoyhI0Pzjm7A9o/MVVA3HakXIImJbbzx/k/6dO9CUEQXIyS2y0fW6C1XaYOG7rY0FQ== -"@ember-data/serializer@3.14.0": - version "3.14.0" - resolved "https://registry.yarnpkg.com/@ember-data/serializer/-/serializer-3.14.0.tgz#8361d56b8a8170b8e48a6d1945d1cbbd6d7a569a" - integrity sha512-Vh3pv4oB48krrcqCWAztAJZggkQkTRtW59Ii1VZ70JQuFLil3lNbFo1qDGWHCWdPv/9kEqMD50ZTyytMpXqCGA== +"@ember-data/serializer@3.28.5": + version "3.28.5" + resolved "https://registry.yarnpkg.com/@ember-data/serializer/-/serializer-3.28.5.tgz#572ead11e595428607a58cdecd612f6bb97cd114" + integrity sha512-EAkkA0VFhfqf3FYvvdvcqAcA2kfVHimmyI0wFGxDwMUGGAJAA+SnPuPtAjM6YD193SMSsU8ixfjbKH72BFqfJg== dependencies: - "@ember-data/-build-infra" "3.14.0" - "@ember-data/store" "3.14.0" - ember-cli-babel "^7.11.1" - ember-cli-test-info "^1.0.0" - ember-cli-typescript "^3.0.0" - -"@ember-data/serializer@3.14.1": - version "3.14.1" - resolved "https://registry.yarnpkg.com/@ember-data/serializer/-/serializer-3.14.1.tgz#8ce14c68502503f663fbed76dbfd61d965d9a63f" - integrity sha512-DY2iU7vTnsiE5706rsifICV/W5DwTcLkAsuUZoqgXEMVevNtdwuTX+1H9zZ0/cmObnd5dCFjNhC8A8/yYMDmuw== - dependencies: - "@ember-data/-build-infra" "3.14.1" - "@ember-data/store" "3.14.1" - ember-cli-babel "^7.11.1" + "@ember-data/private-build-infra" "3.28.5" + "@ember-data/store" "3.28.5" + ember-cli-babel "^7.26.6" ember-cli-test-info "^1.0.0" - ember-cli-typescript "^3.0.0" - -"@ember-data/store@3.14.0": - version "3.14.0" - resolved "https://registry.yarnpkg.com/@ember-data/store/-/store-3.14.0.tgz#0b1fa76d5d5bed17226e0dfbdba57084bf2579f1" - integrity sha512-Ytr4PgWT7rsMy9XxGz67kAAX7Iz4c56KGiI2SK16HhU+hUOARHRmfKrVKGte5wq3omFAcM+AmgH+xifThHAcsg== - dependencies: - "@ember-data/-build-infra" "3.14.0" - "@ember-data/adapter" "3.14.0" - "@ember-data/canary-features" "3.14.0" - "@ember/ordered-set" "^2.0.3" - ember-cli-babel "^7.11.1" - ember-cli-path-utils "^1.0.0" - ember-cli-typescript "^3.0.0" - heimdalljs "^0.3.0" + ember-cli-typescript "^4.1.0" -"@ember-data/store@3.14.1": - version "3.14.1" - resolved "https://registry.yarnpkg.com/@ember-data/store/-/store-3.14.1.tgz#c85fa0e782ef2c794e4018c3f0e9d54ac095f384" - integrity sha512-+M6mddGQUXaPEFuoFMLL5GxOOekScglws+fuBLV4NuZ0N9h4dnC8Oga04zaSq72+40zW/ZqMQsLZwPJTWLTEXw== +"@ember-data/store@3.28.5": + version "3.28.5" + resolved "https://registry.yarnpkg.com/@ember-data/store/-/store-3.28.5.tgz#a0038a3b09fdcf233bb070438fb8538c509801fa" + integrity sha512-UTCohm4u9V8qaISjO2mhVG2A62g/Gnb0zAPd4CnV84lyowE0LQw1ACN9KWRSgeaTOAUfEWP9MkQeuQQuikYtig== dependencies: - "@ember-data/-build-infra" "3.14.1" - "@ember-data/adapter" "3.14.1" - "@ember-data/canary-features" "3.14.1" - "@ember/ordered-set" "^2.0.3" - ember-cli-babel "^7.11.1" + "@ember-data/canary-features" "3.28.5" + "@ember-data/private-build-infra" "3.28.5" + "@ember/string" "^3.0.0" + "@glimmer/tracking" "^1.0.4" + ember-cli-babel "^7.26.6" ember-cli-path-utils "^1.0.0" - ember-cli-typescript "^3.0.0" - heimdalljs "^0.3.0" + ember-cli-typescript "^4.1.0" "@ember-decorators/component@^6.1.1": version "6.1.1" @@ -1704,7 +1654,7 @@ slash "^3.0.0" tslib "^2.2.0" -"@ember/edition-utils@^1.1.1", "@ember/edition-utils@^1.2.0": +"@ember/edition-utils@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@ember/edition-utils/-/edition-utils-1.2.0.tgz#a039f542dc14c8e8299c81cd5abba95e2459cfa6" integrity sha512-VmVq/8saCaPdesQmftPqbFtxJWrzxNGSQ+e8x8LLe3Hjm36pJ04Q8LeORGZkAeOhldoUX9seLGmSaHeXkIqoog== @@ -1732,14 +1682,6 @@ mkdirp "^1.0.4" silent-error "^1.1.1" -"@ember/ordered-set@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@ember/ordered-set/-/ordered-set-2.0.3.tgz#2ac1ca73b3bd116063cae814898832ef434a57f9" - integrity sha512-F4yfVk6WMc4AUHxeZsC3CaKyTvO0qSZJy7WWHCFTlVDQw6vubn+FvnGdhzpN1F00EiXMI4Tv1tJdSquHcCnYrA== - dependencies: - ember-cli-babel "^6.16.0" - ember-compatibility-helpers "^1.1.1" - "@ember/render-modifiers@^1.0.1": version "1.0.2" resolved "https://registry.yarnpkg.com/@ember/render-modifiers/-/render-modifiers-1.0.2.tgz#2e87c48db49d922ce4850d707215caaac60d8444" @@ -1748,6 +1690,13 @@ ember-cli-babel "^7.10.0" ember-modifier-manager-polyfill "^1.1.0" +"@ember/string@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@ember/string/-/string-3.0.0.tgz#e3a3cc7874c9f64eadfdac644d8b1238721ce289" + integrity sha512-T+7QYDp8ItlQseNveK2lL6OsOO5wg7aNQ/M2RpO8cGwM80oZOnr/Y35HmMfu4ejFEc+F1LPegvu7LGfeJOicWA== + dependencies: + ember-cli-babel "^7.26.6" + "@ember/test-helpers@^2.6.0": version "2.6.0" resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-2.6.0.tgz#d687515c6ab49ba72717fc62046970ef4a72ea9c" @@ -1899,6 +1848,14 @@ semver "^7.3.2" typescript-memoize "^1.0.0-alpha.3" +"@embroider/test-setup@^0.41.0": + version "0.41.0" + resolved "https://registry.yarnpkg.com/@embroider/test-setup/-/test-setup-0.41.0.tgz#7e18fb266ba2f0b131256b303ef4e682f3ca9b20" + integrity sha512-MH8g9G2robf52Ffc1uan21Z/ehwfCHnVa1E5KuI/zau3Ad1HfcRNOGdNwUtpvOr98wPdpTXdJYSg31urcPRUuQ== + dependencies: + lodash "^4.17.20" + resolve "^1.17.0" + "@eslint/eslintrc@^0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" @@ -2110,10 +2067,10 @@ resolved "https://registry.yarnpkg.com/@glimmer/validator/-/validator-0.44.0.tgz#03d127097dc9cb23052cdb7fcae59d0a9dca53e1" integrity sha512-i01plR0EgFVz69GDrEuFgq1NheIjZcyTy3c7q+w7d096ddPVeVcRzU3LKaqCfovvLJ+6lJx40j45ecycASUUyw== -"@glimmer/vm-babel-plugins@0.77.5": - version "0.77.5" - resolved "https://registry.yarnpkg.com/@glimmer/vm-babel-plugins/-/vm-babel-plugins-0.77.5.tgz#daffb6507aa6b08ec36f69d652897d339fdd0007" - integrity sha512-jTBM7fJMrIEy4/bCeI8e7ypR+AuWYzLA+KORCGbnTJtL/NYg4G8qwhQAZBtg1d3KmoqyqaCsyqE6f4/tzJO4eQ== +"@glimmer/vm-babel-plugins@0.80.3": + version "0.80.3" + resolved "https://registry.yarnpkg.com/@glimmer/vm-babel-plugins/-/vm-babel-plugins-0.80.3.tgz#434b62172318cac43830d3ac29818cf2c5f111c1" + integrity sha512-9ej6xlm5MzHBJ5am2l0dbbn8Z0wJoYoMpM8FcrGMlUP6SPMLWxvxpMsApgQo8u6dvZRCjR3/bw3fdf7GOy0AFw== dependencies: babel-plugin-debug-macros "^0.3.4" @@ -2490,16 +2447,60 @@ dependencies: "@types/estree" "*" -"@types/broccoli-plugin@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@types/broccoli-plugin/-/broccoli-plugin-1.3.0.tgz#38f8462fecaebc4e09a32e4d4ed1b9808f75bbca" - integrity sha512-SLk4/hFc2kGvgwNFrpn2O1juxFOllcHAywvlo7VwxfExLzoz1GGJ0oIZCwj5fwSpvHw4AWpZjJ1fUvb62PDayQ== +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/broccoli-plugin@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/broccoli-plugin/-/broccoli-plugin-3.0.0.tgz#290fda2270c47a568edfd0cefab8bb840d8bb7b2" + integrity sha512-f+TcsARR2PovfFRKFdCX0kfH/QoM3ZVD2h1rl2mNvrKO0fq2uBNCBsTU3JanfU4COCt5cXpTfARyUsERlC8vIw== + dependencies: + broccoli-plugin "*" + +"@types/chai-as-promised@^7.1.2": + version "7.1.4" + resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.4.tgz#caf64e76fb056b8c8ced4b761ed499272b737601" + integrity sha512-1y3L1cHePcIm5vXkh1DSGf/zQq5n5xDKG1fpCvf18+uOkpce0Z1ozNFPkyWsVswK7ntN1sZBw3oU6gmN+pDUcA== + dependencies: + "@types/chai" "*" + +"@types/chai@*", "@types/chai@^4.2.9": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.0.tgz#23509ebc1fa32f1b4d50d6a66c4032d5b8eaabdc" + integrity sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw== "@types/color-name@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== +"@types/component-emitter@^1.2.10": + version "1.2.11" + resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.11.tgz#50d47d42b347253817a39709fef03ce66a108506" + integrity sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ== + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/cookie@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + +"@types/cors@^2.8.12": + version "2.8.12" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" + integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== + "@types/ember@^3.1.0": version "3.1.1" resolved "https://registry.yarnpkg.com/@types/ember/-/ember-3.1.1.tgz#401810fa3ba911855d609d334ea77990b9b94802" @@ -2666,6 +2667,25 @@ resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== +"@types/express-serve-static-core@^4.17.18": + version "4.17.26" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.26.tgz#5d9a8eeecb9d5f9d7fc1d85f541512a84638ae88" + integrity sha512-zeu3tpouA043RHxW0gzRxwCHchMgftE8GArRsvYT0ByDMbn19olQHx5jLue0LxWY6iYtXb7rXmuVtSkhy9YZvQ== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@^4.17.2": + version "4.17.13" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" + integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" + "@types/fs-extra@^5.0.5": version "5.1.0" resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-5.1.0.tgz#2a325ef97901504a3828718c390d34b8426a10a1" @@ -2673,6 +2693,13 @@ dependencies: "@types/node" "*" +"@types/fs-extra@^8.1.0": + version "8.1.2" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-8.1.2.tgz#7125cc2e4bdd9bd2fc83005ffdb1d0ba00cca61f" + integrity sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg== + dependencies: + "@types/node" "*" + "@types/glob@*", "@types/glob@^7.1.1": version "7.1.1" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" @@ -2699,6 +2726,11 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + "@types/minimatch@*", "@types/minimatch@^3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -2709,6 +2741,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.31.tgz#d6b4f9645fee17f11319b508fb1001797425da51" integrity sha512-T+wnJno8uh27G9c+1T+a1/WYCHzLeDqtsGJkoEdSp2X8RTh3oOCZQcUnjAx90CS8cmmADX51O0FI/tu9s0yssg== +"@types/node@>=10.0.0": + version "16.11.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.12.tgz#ac7fb693ac587ee182c3780c26eb65546a1a3c10" + integrity sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw== + "@types/node@^9.6.0": version "9.6.55" resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.55.tgz#7cc1358c9c18e71f6c020e410962971863232cf5" @@ -2719,6 +2756,16 @@ resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== +"@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + "@types/rimraf@^2.0.2": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.4.tgz#403887b0b53c6100a6c35d2ab24f6ccc042fec46" @@ -2727,11 +2774,27 @@ "@types/glob" "*" "@types/node" "*" +"@types/rimraf@^2.0.3": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.5.tgz#368fb04d59630b727fc05a74d2ca557f64a8ef98" + integrity sha512-YyP+VfeaqAyFmXoTh3HChxOQMyjByRMsHU7kc5KOJkSlXudhMhQIALbYV7rHh/l8d2lX3VUQzprrcAgWdRuU8g== + dependencies: + "@types/glob" "*" + "@types/node" "*" + "@types/rsvp@*", "@types/rsvp@^4.0.2": version "4.0.3" resolved "https://registry.yarnpkg.com/@types/rsvp/-/rsvp-4.0.3.tgz#4a1223158453257bce09d42b9eef7cfa6d257482" integrity sha512-OpRwxbgx16nL/0/7ol0WoLLyLaMXBvtPOHjqLljnzAB/E7Qk1wtjytxgBhOTBMZvuLXnJUqfnjb4W/QclNFvSA== +"@types/serve-static@*": + version "1.13.10" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" + integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + "@types/sizzle@*": version "2.3.2" resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.2.tgz#a811b8c18e2babab7d542b3365887ae2e4d9de47" @@ -2887,6 +2950,11 @@ "@webassemblyjs/wast-parser" "1.9.0" "@xtuc/long" "4.2.2" +"@xmldom/xmldom@^0.7.1": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.5.tgz#09fa51e356d07d0be200642b0e4f91d8e6dd408d" + integrity sha512-V3BIhmY36fXZ1OtVcI9W+FxQqxVLsPKcNjWigIaa81dLC9IolJl5Mt4Cvhmr0flUnjSpTdrbMTSbXqYqV5dT6A== + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -2986,7 +3054,7 @@ acorn@^6.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^7.0.0, acorn@^7.1.0, acorn@^7.1.1: +acorn@^7.0.0, acorn@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== @@ -3006,11 +3074,6 @@ acorn@^8.5.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.6.0.tgz#e3692ba0eb1a0c83eaa4f37f5fa7368dd7142895" integrity sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw== -after@0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" - integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= - agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -3083,10 +3146,10 @@ ansi-colors@^4.1.1: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-escapes@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" - integrity sha1-06ioOzGapneTZisT52HHkRQiMG4= +ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== ansi-escapes@^4.2.1: version "4.3.1" @@ -3110,6 +3173,11 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + ansi-regex@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" @@ -3245,11 +3313,6 @@ array-equal@^1.0.0: resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -3277,11 +3340,6 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -arraybuffer.slice@~0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" - integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== - arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -3497,7 +3555,7 @@ babel-core@^6.26.0, babel-core@^6.26.3: slash "^1.0.0" source-map "^0.5.7" -babel-eslint@^10.0.3: +babel-eslint@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== @@ -3717,11 +3775,6 @@ babel-plugin-ember-modules-api-polyfill@^3.4.0, babel-plugin-ember-modules-api-p dependencies: ember-rfc176-data "^0.3.17" -babel-plugin-feature-flags@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-feature-flags/-/babel-plugin-feature-flags-0.3.1.tgz#9c827cf9a4eb9a19f725ccb239e85cab02036fc1" - integrity sha1-nIJ8+aTrmhn3JcyyOehcqwIDb8E= - babel-plugin-filter-imports@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-3.0.0.tgz#a849683837ad29960da17492fb32789ab6b09a11" @@ -3761,6 +3814,17 @@ babel-plugin-module-resolver@^3.1.1, babel-plugin-module-resolver@^3.2.0: reselect "^3.0.1" resolve "^1.4.0" +babel-plugin-module-resolver@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.1.0.tgz#22a4f32f7441727ec1fbf4967b863e1e3e9f33e2" + integrity sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA== + dependencies: + find-babel-config "^1.2.0" + glob "^7.1.6" + pkg-up "^3.1.0" + reselect "^4.0.0" + resolve "^1.13.1" + babel-plugin-polyfill-corejs2@^0.1.4: version "0.1.10" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz#a2c5c245f56c0cac3dbddbf0726a46b24f0f81d1" @@ -4147,20 +4211,15 @@ backbone@^1.1.2: dependencies: underscore ">=1.8.3" -backo2@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" - integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= - balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= -base64-arraybuffer@0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" - integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI= +base64-arraybuffer@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.1.tgz#87bd13525626db4a9838e00a508c2b73efcf348c" + integrity sha512-vFIUq7FdLtjZMhATwDul5RZWv2jpXQ09Pd6jcVEOvIsqCWTRFD/ONHNfyOS8dA/Ippi5dsIgpyKWKZaAKZltbA== base64-js@^1.0.2: version "1.3.1" @@ -4172,7 +4231,7 @@ base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base64id@2.0.0: +base64id@2.0.0, base64id@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== @@ -4255,11 +4314,6 @@ blank-object@^1.0.1: resolved "https://registry.yarnpkg.com/blank-object/-/blank-object-1.0.2.tgz#f990793fbe9a8c8dd013fb3219420bec81d5f4b9" integrity sha1-+ZB5P76ajI3QE/syGUIL7IHV9Lk= -blob@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" - integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== - bluebird@^3.1.1, bluebird@^3.4.6, bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" @@ -4323,16 +4377,17 @@ boom@0.4.x: dependencies: hoek "0.9.x" -bower-config@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/bower-config/-/bower-config-1.4.1.tgz#85fd9df367c2b8dbbd0caa4c5f2bad40cd84c2cc" - integrity sha1-hf2d82fCuNu9DKpMXyutQM2Ewsw= +bower-config@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/bower-config/-/bower-config-1.4.3.tgz#3454fecdc5f08e7aa9cc6d556e492be0669689ae" + integrity sha512-MVyyUk3d1S7d2cl6YISViwJBc2VXCkxF5AUFykvN0PQj5FsUiMNSgAYTso18oRFfyZ6XEtjrgg9MAaufHbOwNw== dependencies: graceful-fs "^4.1.3" + minimist "^0.2.1" mout "^1.0.0" - optimist "^0.6.1" osenv "^0.1.3" untildify "^2.1.0" + wordwrap "^0.0.3" bower-endpoint-parser@0.2.2: version "0.2.2" @@ -4370,10 +4425,10 @@ braces@^3.0.1, braces@~3.0.2: dependencies: fill-range "^7.0.1" -broccoli-amd-funnel@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/broccoli-amd-funnel/-/broccoli-amd-funnel-1.3.0.tgz#c4426b4fce976e44295bd74f34725f53bdeb08e3" - integrity sha512-QLjCWblDW//a/5/ivDikVPRHiA+d/1K45meHZA6lAlpHC1c216rcZQYpdlo9PiOJiI4T3tKqDaaM1CDeFDCoVQ== +broccoli-amd-funnel@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/broccoli-amd-funnel/-/broccoli-amd-funnel-2.0.1.tgz#dbdbfd28841731342d538126567c25bea3f15310" + integrity sha512-VRE+0PYAN4jQfkIq3GKRj4U/4UV9rVpLan5ll6fVYV4ziVg4OEfR5GUnILEg++QtR4xSaugRxCPU5XJLDy3bNQ== dependencies: broccoli-plugin "^1.3.0" symlink-or-copy "^1.2.0" @@ -4496,7 +4551,7 @@ broccoli-clean-css@^1.1.0: inline-source-map-comment "^1.0.5" json-stable-stringify "^1.0.0" -broccoli-concat@^3.5.1, broccoli-concat@^3.7.1, broccoli-concat@^3.7.4: +broccoli-concat@^3.7.1, broccoli-concat@^3.7.4: version "3.7.5" resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.7.5.tgz#223beda8c1184252cf08ae020a3d45ffa6a48218" integrity sha512-rDs1Mej3Ej0Cy5yIO9oIQq5+BCv0opAwS2NW7M0BeCsAMeFM42Z/zacDUC6jKc5OV5wiHvGTyCPLnZkMe0h6kQ== @@ -4670,7 +4725,7 @@ broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1, broccoli-funnel@^2.0.2: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-funnel@^3.0.0, broccoli-funnel@^3.0.3, broccoli-funnel@^3.0.6, broccoli-funnel@^3.0.8: +broccoli-funnel@^3.0.0, broccoli-funnel@^3.0.3, broccoli-funnel@^3.0.5, broccoli-funnel@^3.0.6, broccoli-funnel@^3.0.8: version "3.0.8" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.8.tgz#f5b62e2763c3918026a15a3c833edc889971279b" integrity sha512-ng4eIhPYiXqMw6SyGoxPHR3YAwEd2lr9FgBI1CyTbspl4txZovOsmzFkMkGAlu88xyvYXJqHiM2crfLa65T1BQ== @@ -4737,7 +4792,7 @@ broccoli-merge-trees@^4.0.0, broccoli-merge-trees@^4.2.0: broccoli-plugin "^4.0.2" merge-trees "^2.0.0" -broccoli-middleware@^2.0.1: +broccoli-middleware@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/broccoli-middleware/-/broccoli-middleware-2.1.1.tgz#183635bbef4dc1241533ee001a162f013d776cb9" integrity sha512-BK8aPhQpOLsHWiftrqXQr84XsvzUqeaN4PlCQOYg5yM0M+WKAHtX2WFXmicSQZOVgKDyh5aeoNTFkHjBAEBzwQ== @@ -4747,25 +4802,6 @@ broccoli-middleware@^2.0.1: has-ansi "^3.0.0" mime-types "^2.1.18" -broccoli-module-normalizer@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/broccoli-module-normalizer/-/broccoli-module-normalizer-1.3.0.tgz#f9982d9cbb776b4ed754161cc6547784d3eb19de" - integrity sha512-0idZCOtdVG6xXoQ36Psc1ApMCr3lW5DB+WEAOEwHcUoESIBHzwcRPQTxheGIjZ5o0hxpsRYAUH5x0ErtNezbrQ== - dependencies: - broccoli-plugin "^1.3.0" - merge-trees "^1.0.1" - rimraf "^2.6.2" - symlink-or-copy "^1.1.8" - -broccoli-module-unification-reexporter@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/broccoli-module-unification-reexporter/-/broccoli-module-unification-reexporter-1.0.0.tgz#031909c5d3f159ec11d5f9e2346f2861db8acb3e" - integrity sha512-HTi9ua520M20aBZomaiBopsSt3yjL7J/paR3XPjieygK7+ShATBiZdn0B+ZPiniBi4I8JuMn1q0fNFUevtP//A== - dependencies: - broccoli-plugin "^1.3.0" - mkdirp "^0.5.1" - walk-sync "^0.3.2" - broccoli-node-api@^1.6.0, broccoli-node-api@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/broccoli-node-api/-/broccoli-node-api-1.7.0.tgz#391aa6edecd2a42c63c111b4162956b2fa288cb6" @@ -4853,17 +4889,7 @@ broccoli-persistent-filter@^3.0.0, broccoli-persistent-filter@^3.1.0, broccoli-p symlink-or-copy "^1.0.1" sync-disk-cache "^2.0.0" -broccoli-plugin@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.1.0.tgz#73e2cfa05f8ea1e3fc1420c40c3d9e7dc724bf02" - integrity sha1-c+LPoF+OoeP8FCDEDD2efcckvwI= - dependencies: - promise-map-series "^0.2.1" - quick-temp "^0.1.3" - rimraf "^2.3.4" - symlink-or-copy "^1.0.1" - -"broccoli-plugin@1.5.1 - 5", broccoli-plugin@^4.0.0, broccoli-plugin@^4.0.1, broccoli-plugin@^4.0.2, broccoli-plugin@^4.0.3, broccoli-plugin@^4.0.7: +broccoli-plugin@*, "broccoli-plugin@1.5.1 - 5", broccoli-plugin@^4.0.0, broccoli-plugin@^4.0.1, broccoli-plugin@^4.0.2, broccoli-plugin@^4.0.3, broccoli-plugin@^4.0.7: version "4.0.7" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-4.0.7.tgz#dd176a85efe915ed557d913744b181abe05047db" integrity sha512-a4zUsWtA1uns1K7p9rExYVYG99rdKeGRymW0qOCNkvDPHQxVi3yVyJHhQbM3EZwdt2E0mnhr5e0c/bPpJ7p3Wg== @@ -4876,6 +4902,16 @@ broccoli-plugin@1.1.0: rimraf "^3.0.2" symlink-or-copy "^1.3.1" +broccoli-plugin@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.1.0.tgz#73e2cfa05f8ea1e3fc1420c40c3d9e7dc724bf02" + integrity sha1-c+LPoF+OoeP8FCDEDD2efcckvwI= + dependencies: + promise-map-series "^0.2.1" + quick-temp "^0.1.3" + rimraf "^2.3.4" + symlink-or-copy "^1.0.1" + broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli-plugin@^1.2.1, broccoli-plugin@^1.3.0, broccoli-plugin@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.1.tgz#a26315732fb99ed2d9fb58f12a1e14e986b4fabd" @@ -4886,7 +4922,7 @@ broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli rimraf "^2.3.4" symlink-or-copy "^1.1.8" -broccoli-plugin@^2.0.0, broccoli-plugin@^2.1.0: +broccoli-plugin@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-2.1.0.tgz#2fab6c578219cfcc64f773e9616073313fc8b334" integrity sha512-ElE4caljW4slapyEhSD9jU9Uayc8SoSABWdmY9SqbV8DHNxU6xg1jJsPcMm+cXOvggR3+G+OXAYQeFjWVnznaw== @@ -4949,20 +4985,20 @@ broccoli-rollup@^2.1.1: symlink-or-copy "^1.1.8" walk-sync "^0.3.1" -broccoli-rollup@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/broccoli-rollup/-/broccoli-rollup-4.1.1.tgz#7531a24d88ddab9f1bace1c6ee6e6ca74a38d36f" - integrity sha512-hkp0dB5chiemi32t6hLe5bJvxuTOm1TU+SryFlZIs95KT9+94uj0C8w6k6CsZ2HuIdIZg6D252t4gwOlcTXrpA== +broccoli-rollup@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/broccoli-rollup/-/broccoli-rollup-5.0.0.tgz#a77b53bcef1b70e988913fee82265c0a4ca530da" + integrity sha512-QdMuXHwsdz/LOS8zu4HP91Sfi4ofimrOXoYP/lrPdRh7lJYD87Lfq4WzzUhGHsxMfzANIEvl/7qVHKD3cFJ4tA== dependencies: - "@types/broccoli-plugin" "^1.3.0" - broccoli-plugin "^2.0.0" + "@types/broccoli-plugin" "^3.0.0" + broccoli-plugin "^4.0.7" fs-tree-diff "^2.0.1" heimdalljs "^0.2.6" node-modules-path "^1.0.1" - rollup "^1.12.0" + rollup "^2.50.0" rollup-pluginutils "^2.8.1" symlink-or-copy "^1.2.0" - walk-sync "^1.1.3" + walk-sync "^2.2.0" broccoli-slow-trees@^3.0.1: version "3.0.1" @@ -4971,6 +5007,13 @@ broccoli-slow-trees@^3.0.1: dependencies: heimdalljs "^0.2.1" +broccoli-slow-trees@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-3.1.0.tgz#8e48903f59e061bf1213963733b9e61dec2ee5d7" + integrity sha512-FRI7mRTk2wjIDrdNJd6znS7Kmmne4VkAkl8Ix1R/VoePFMD0g0tEl671xswzFqaRjpT9Qu+CC4hdXDLDJBuzMw== + dependencies: + heimdalljs "^0.2.1" + broccoli-source@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-source/-/broccoli-source-1.1.0.tgz#54f0e82c8b73f46580cbbc4f578f0b32fca8f809" @@ -5019,7 +5062,7 @@ broccoli-stew@^1.5.0: symlink-or-copy "^1.2.0" walk-sync "^0.3.0" -broccoli-stew@^2.0.0, broccoli-stew@^2.1.0: +broccoli-stew@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-2.1.0.tgz#ba73add17fda3b9b01d8cfb343a8b613b7136a0a" integrity sha512-tgCkuTWYl4uf7k7ib2D79KFEj2hCgnTUNPMnrCoAha0/4bywcNccmaZVWtL9Ex37yX5h5eAbnM/ak2ULoMwSSw== @@ -5089,22 +5132,51 @@ broccoli-templater@^2.0.1: rimraf "^2.6.2" walk-sync "^0.3.3" -broccoli-uglify-sourcemap@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/broccoli-uglify-sourcemap/-/broccoli-uglify-sourcemap-3.2.0.tgz#d96f1d41f6c18e9a5d49af1a5ab9489cdcac1c6c" - integrity sha512-kkkn8v7kXdWwnZNekq+3ILuTAGkZoaoEMUYCKoER5/uokuoyTjtdYLHaE7UxHkuPEuLfjvJYv21sCCePZ74/2g== +broccoli-terser-sourcemap@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/broccoli-terser-sourcemap/-/broccoli-terser-sourcemap-4.1.0.tgz#5f37441b64a3b6bfb0c67e9af232259c9576f115" + integrity sha512-zkNnjsAbP+M5rG2aMM1EE4BmXPUSxFKmtLUkUs2D1DLTOJQoF1xlOjGWjjKYCFy5tw8t4+tgGJ+HVa2ucJZ8sw== dependencies: async-promise-queue "^1.0.5" - broccoli-plugin "^1.2.1" + broccoli-plugin "^4.0.3" debug "^4.1.0" lodash.defaultsdeep "^4.6.1" - matcher-collection "^2.0.0" - mkdirp "^0.5.0" + matcher-collection "^2.0.1" source-map-url "^0.4.0" - symlink-or-copy "^1.0.1" - terser "^4.3.9" - walk-sync "^1.1.3" - workerpool "^5.0.1" + symlink-or-copy "^1.3.1" + terser "^5.3.0" + walk-sync "^2.2.0" + workerpool "^6.0.0" + +broccoli@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/broccoli/-/broccoli-3.5.2.tgz#60921167d57b43fb5bad527420d62fe532595ef4" + integrity sha512-sWi3b3fTUSVPDsz5KsQ5eCQNVAtLgkIE/HYFkEZXR/07clqmd4E/gFiuwSaqa9b+QTXc1Uemfb7TVWbEIURWDg== + dependencies: + "@types/chai" "^4.2.9" + "@types/chai-as-promised" "^7.1.2" + "@types/express" "^4.17.2" + ansi-html "^0.0.7" + broccoli-node-info "^2.1.0" + broccoli-slow-trees "^3.0.1" + broccoli-source "^3.0.0" + commander "^4.1.1" + connect "^3.6.6" + console-ui "^3.0.4" + esm "^3.2.4" + findup-sync "^4.0.0" + handlebars "^4.7.3" + heimdalljs "^0.2.6" + heimdalljs-logger "^0.1.9" + https "^1.0.0" + mime-types "^2.1.26" + resolve-path "^1.4.0" + rimraf "^3.0.2" + sane "^4.0.0" + tmp "^0.0.33" + tree-sync "^2.0.0" + underscore.string "^3.2.2" + watch-detector "^1.0.0" brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" @@ -5237,7 +5309,7 @@ buffer-alloc-unsafe@^1.1.0: resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== -buffer-alloc@^1.1.0, buffer-alloc@^1.2.0: +buffer-alloc@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== @@ -5320,16 +5392,17 @@ bytes@3.1.0, bytes@^3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== -cacache@^11.0.2: - version "11.3.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.3.tgz#8bd29df8c6a718a6ebd2d010da4d7972ae3bbadc" - integrity sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA== +cacache@^12.0.2: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== dependencies: bluebird "^3.5.5" chownr "^1.1.1" figgy-pudding "^3.5.1" glob "^7.1.4" graceful-fs "^4.1.15" + infer-owner "^1.0.3" lru-cache "^5.1.1" mississippi "^3.0.0" mkdirp "^0.5.1" @@ -5368,13 +5441,6 @@ cacheable-request@^6.0.0: normalize-url "^4.1.0" responselike "^1.0.2" -calculate-cache-key-for-tree@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-1.2.3.tgz#5a5e4fcfa2d374a63e47fe967593f179e8282825" - integrity sha512-PPQorvdNw8K8k7UftCeradwOmKDSDJs8wcqYTtJPEt3fHbZyK8QsorybJA+lOmk0dgE61vX6R+5Kd3W9h4EMGg== - dependencies: - json-stable-stringify "^1.0.1" - calculate-cache-key-for-tree@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-2.0.0.tgz#7ac57f149a4188eacb0a45b210689215d3fef8d6" @@ -5390,28 +5456,15 @@ call-bind@^1.0.0, call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" -callsites@^3.0.0: +callsites@^3.0.0, callsites@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase-css@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== camelcase@^3.0.0: version "3.0.0" @@ -5435,37 +5488,17 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001036: - version "1.0.30001038" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz#44da3cbca2ab6cb6aa83d1be5d324e17f141caff" - integrity sha512-zii9quPo96XfOiRD4TrfYGs+QsGZpb2cGiMAzPjtf/hpFgB6zCPZgJb7I1+EATeMw/o+lG8FyRAnI+CWStHcaQ== - -caniuse-lite@^1.0.30001043: - version "1.0.30001083" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001083.tgz#52410c20c6f029f604f0d45eca0439a82e712442" - integrity sha512-CnYJ27awX4h7yj5glfK7r1TOI13LBytpLzEgfj0s4mY75/F8pnQcYjL+oVpmS38FB59+vU0gscQ9D8tc+lIXvA== - -caniuse-lite@^1.0.30001109: - version "1.0.30001162" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001162.tgz#9f83aad1f42539ce9aab58bb177598f2f8e22ec6" - integrity sha512-E9FktFxaNnp4ky3ucIGzEXLM+Knzlpuq1oN1sFAU0KeayygabGTmOsndpo8QrL4D9pcThlf4D2pUKaDxPCUmVw== - -caniuse-lite@^1.0.30001181: - version "1.0.30001202" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001202.tgz#4cb3bd5e8a808e8cd89e4e66c549989bc8137201" - integrity sha512-ZcijQNqrcF8JNLjzvEiXqX4JUYxoZa7Pvcsd9UD8Kz4TvhTonOSNRsK+qtvpVL4l6+T1Rh4LFtLfnNWg6BGWCQ== - -caniuse-lite@^1.0.30001280: +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001036, caniuse-lite@^1.0.30001043, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001181, caniuse-lite@^1.0.30001280: version "1.0.30001286" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001286.tgz#3e9debad420419618cfdf52dc9b6572b28a8fff6" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001286.tgz" integrity sha512-zaEMRH6xg8ESMi2eQ3R4eZ5qw/hJiVsO/HlLwniIwErij0JDr9P+8V4dtx1l+kLq6j3yy8l8W4fst1lBnat5wQ== -capture-exit@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" - integrity sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28= +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== dependencies: - rsvp "^3.3.3" + rsvp "^4.8.4" cardinal@^1.0.0: version "1.0.0" @@ -5491,7 +5524,7 @@ chalk@^1.0.0, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -5644,10 +5677,10 @@ chrome-trace-event@^1.0.2: dependencies: tslib "^1.9.0" -ci-info@^1.1.3: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" - integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^3.2.0: version "3.3.0" @@ -5694,18 +5727,16 @@ clean-css@^3.4.5: commander "2.8.x" source-map "0.4.x" +clean-stack@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + clean-up-path@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clean-up-path/-/clean-up-path-1.0.0.tgz#de9e8196519912e749c9eaf67c13d64fac72a3e5" integrity sha512-PHGlEF0Z6976qQyN6gM7kKH6EH0RdfZcc8V+QhFe36eRxV0SMH5OUBZG7Bxa9YcreNzyNbK63cGiZxdSZgosRw== -cli-cursor@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" - integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc= - dependencies: - restore-cursor "^1.0.1" - cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" @@ -5720,12 +5751,7 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-spinners@^1.1.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" - integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== - -cli-spinners@^2.5.0: +cli-spinners@^2.0.0, cli-spinners@^2.5.0: version "2.6.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== @@ -5928,11 +5954,16 @@ commander@7.2.0: resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== -commander@^2.19.0, commander@^2.20.0, commander@^2.6.0: +commander@^2.20.0, commander@^2.6.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + commander@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" @@ -5953,26 +5984,11 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= -component-bind@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" - integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= - -component-emitter@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= - component-emitter@^1.2.1, component-emitter@~1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== -component-inherit@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" - integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= - compressible@~2.0.16: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" @@ -5980,7 +5996,7 @@ compressible@~2.0.16: dependencies: mime-db ">= 1.43.0 < 2" -compression@^1.7.3, compression@^1.7.4: +compression@^1.7.4: version "1.7.4" resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== @@ -5998,7 +6014,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.6.2: +concat-stream@^1.5.0, concat-stream@^1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -6008,17 +6024,27 @@ concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.6.2: readable-stream "^2.2.2" typedarray "^0.0.6" -configstore@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-4.0.0.tgz#5933311e95d3687efb592c528b922d9262d227e7" - integrity sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ== +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== dependencies: - dot-prop "^4.1.0" + dot-prop "^5.2.0" graceful-fs "^4.1.2" - make-dir "^1.0.0" - unique-string "^1.0.0" - write-file-atomic "^2.0.0" - xdg-basedir "^3.0.0" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + +connect@^3.6.6: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" console-browserify@^1.1.0: version "1.2.0" @@ -6030,17 +6056,16 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -console-ui@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/console-ui/-/console-ui-2.2.3.tgz#134b92e632f2c0088f78e52b20f1ca22a95b9a91" - integrity sha512-aZm49rntsv264Fw/DM56Z2ehLg1DDxrqof2jFcZOgC03S0nRGSYFIVPx5TbGssrgBhgCvGBY+9mmk0+t/nWXEA== +console-ui@^3.0.4, console-ui@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/console-ui/-/console-ui-3.1.2.tgz#51aef616ff02013c85ccee6a6d77ef7a94202e7a" + integrity sha512-+5j3R4wZJcEYZeXk30whc4ZU/+fWW9JMTNntVuMYpjZJ9n26Cxr0tUBXco1NRjVZRpRVvZ4DDKKKIHNYeUG9Dw== dependencies: chalk "^2.1.0" - inquirer "^2" + inquirer "^6" json-stable-stringify "^1.0.1" - ora "^2.0.0" - through "^2.3.8" - user-info "^1.0.0" + ora "^3.4.0" + through2 "^3.0.1" consolidate@^0.15.1: version "0.15.1" @@ -6167,6 +6192,14 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +cors@~2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" @@ -6260,10 +6293,10 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" -crypto-random-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== css-select-base-adapter@^0.1.1: version "0.1.1" @@ -6375,13 +6408,6 @@ ctype@0.5.3: resolved "https://registry.yarnpkg.com/ctype/-/ctype-0.5.3.tgz#82c18c2461f74114ef16c135224ad0b9144ca12f" integrity sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8= -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= - dependencies: - array-find-index "^1.0.1" - cyclist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" @@ -6436,7 +6462,7 @@ debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.3. dependencies: ms "2.0.0" -debug@4, debug@^4.3.2: +debug@4, debug@^4.3.2, debug@~4.3.1, debug@~4.3.2: version "4.3.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== @@ -6450,21 +6476,14 @@ debug@^3.0.1, debug@^3.1.0, debug@^3.1.1: dependencies: ms "^2.1.1" -debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.1.0: +debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== dependencies: ms "^2.1.1" -debug@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - -decamelize@^1.1.1, decamelize@^1.1.2: +decamelize@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -6595,6 +6614,11 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" @@ -6621,10 +6645,10 @@ detective@^5.2.0: defined "^1.0.0" minimist "^1.1.1" -diff@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +diff@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== diffie-hellman@^5.0.0: version "5.0.3" @@ -6737,12 +6761,12 @@ dot-case@^3.0.3: no-case "^3.0.3" tslib "^1.10.0" -dot-prop@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4" - integrity sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ== +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== dependencies: - is-obj "^1.0.0" + is-obj "^2.0.0" dotenv@^1.2.0: version "1.2.0" @@ -6844,7 +6868,7 @@ ember-assign-polyfill@^2.5.0: ember-cli-babel "^6.16.0" ember-cli-version-checker "^2.0.0" -ember-auto-import@^1.10.1, ember-auto-import@^1.11.2, ember-auto-import@^1.11.3: +ember-auto-import@^1.10.1, ember-auto-import@^1.11.2, ember-auto-import@^1.11.3, ember-auto-import@^1.12.0: version "1.12.0" resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.12.0.tgz#52246b04891090e2608244e65c4c6af7710df12b" integrity sha512-fzMGnyHGfUNFHchpLbJ98Vs/c5H2wZBMR9r/XwW+WOWPisZDGLUPPyhJQsSREPoUQ+o8GvyLaD/rkrKqW8bmgw== @@ -6914,6 +6938,26 @@ ember-auto-import@^1.2.19, ember-auto-import@^1.5.3: walk-sync "^0.3.3" webpack "^4.43.0" +ember-cache-primitive-polyfill@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ember-cache-primitive-polyfill/-/ember-cache-primitive-polyfill-1.0.1.tgz#a27075443bd87e5af286c1cd8a7df24e3b9f6715" + integrity sha512-hSPcvIKarA8wad2/b6jDd/eU+OtKmi6uP+iYQbzi5TQpjsqV6b4QdRqrLk7ClSRRKBAtdTuutx+m+X+WlEd2lw== + dependencies: + ember-cli-babel "^7.22.1" + ember-cli-version-checker "^5.1.1" + ember-compatibility-helpers "^1.2.1" + silent-error "^1.1.1" + +ember-cached-decorator-polyfill@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/ember-cached-decorator-polyfill/-/ember-cached-decorator-polyfill-0.1.4.tgz#f1e2c65cc78d0d9c4ac0e047e643af477eb85ace" + integrity sha512-JOK7kBCWsTVCzmCefK4nr9BACDJk0owt9oIUaVt6Q0UtQ4XeAHmoK5kQ/YtDcxQF1ZevHQFdGhsTR3JLaHNJgA== + dependencies: + "@glimmer/tracking" "^1.0.4" + ember-cache-primitive-polyfill "^1.0.1" + ember-cli-babel "^7.21.0" + ember-cli-babel-plugin-helpers "^1.1.1" + ember-classic-decorator@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/ember-classic-decorator/-/ember-classic-decorator-2.0.1.tgz#3ea29890959ff7ed0d0fa77bc49fca7142c586af" @@ -7071,7 +7115,7 @@ ember-cli-babel@^6.11.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.6.0: ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.2, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.23.1, ember-cli-babel@^7.26.3, ember-cli-babel@^7.26.5, ember-cli-babel@^7.26.6, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.2, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.23.1, ember-cli-babel@^7.26.3, ember-cli-babel@^7.26.5, ember-cli-babel@^7.26.6, ember-cli-babel@^7.7.3: version "7.26.6" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.6.tgz#322fbbd3baad9dd99e3276ff05bc6faef5e54b39" integrity sha512-040svtfj2RC35j/WMwdWJFusZaXmNoytLAMyBDGLMSlRvznudTxZjGlPV6UupmtTBApy58cEF8Fq4a+COWoEmQ== @@ -7104,17 +7148,6 @@ ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cl rimraf "^3.0.1" semver "^5.5.0" -ember-cli-broccoli-sane-watcher@^2.1.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.2.2.tgz#9bb1b04ddeb2c086aecd8693cbaeca1d88dc160c" - integrity sha512-9OLy8x3pdNKC/6xR00IjTL8XyiQU3rb2HLyQSAqHuaZpZcSTKkbAse2ERTsELSINoo/zi/W7qPP5vd5SsHsraw== - dependencies: - broccoli-slow-trees "^3.0.1" - heimdalljs "^0.2.1" - heimdalljs-logger "^0.1.7" - rsvp "^3.0.18" - sane "^2.4.1" - ember-cli-clipboard@^0.15.0: version "0.15.0" resolved "https://registry.yarnpkg.com/ember-cli-clipboard/-/ember-cli-clipboard-0.15.0.tgz#3704baaeab1f0a2df13b3d77632dea7266aabe54" @@ -7126,7 +7159,7 @@ ember-cli-clipboard@^0.15.0: ember-cli-babel "^7.20.2" ember-cli-htmlbars "^4.2.3" -ember-cli-dependency-checker@^3.0.0: +ember-cli-dependency-checker@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-3.2.0.tgz#9202ad9e14d6fda33cffc22a11c343c2a8885330" integrity sha512-dkSmcJ/jY/2ms/S6ph2jXSfOW5VfOpLfg5DFEbra0SaMNgYkNDFF1o0U4OdTsG37L5h/AXWNuVtnOa4TMabz9Q== @@ -7350,7 +7383,7 @@ ember-cli-postcss@^7.0.0: ember-cli-babel "^7.1.0" merge "^2.1.1" -ember-cli-preprocess-registry@^3.1.2: +ember-cli-preprocess-registry@^3.1.2, ember-cli-preprocess-registry@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/ember-cli-preprocess-registry/-/ember-cli-preprocess-registry-3.3.0.tgz#685837a314fbe57224bd54b189f4b9c23907a2de" integrity sha512-60GYpw7VPeB7TvzTLZTuLTlHdOXvayxjAQ+IxM2T04Xkfyu75O2ItbWlftQW7NZVGkaCsXSRAmn22PG03VpLMA== @@ -7382,6 +7415,13 @@ ember-cli-string-utils@^1.0.0, ember-cli-string-utils@^1.1.0: resolved "https://registry.yarnpkg.com/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz#39b677fc2805f55173735376fcef278eaa4452a1" integrity sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE= +ember-cli-terser@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/ember-cli-terser/-/ember-cli-terser-4.0.2.tgz#c436a9e4159f76a615b051cba0584844652b7dcd" + integrity sha512-Ej77K+YhCZImotoi/CU2cfsoZaswoPlGaM5TB3LvjvPDlVPRhxUHO2RsaUVC5lsGeRLRiHCOxVtoJ6GyqexzFA== + dependencies: + broccoli-terser-sourcemap "^4.1.0" + ember-cli-test-info@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-test-info/-/ember-cli-test-info-1.0.0.tgz#ed4e960f249e97523cf891e4aed2072ce84577b4" @@ -7431,26 +7471,6 @@ ember-cli-typescript@^2.0.2: stagehand "^1.0.0" walk-sync "^1.0.0" -ember-cli-typescript@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-3.1.3.tgz#a2c7ec6a8a5e57c38eb52d83e36d8e18c7071e60" - integrity sha512-bFi15H60L9TLYfn9XUzi+RAP1gTWHFtVdSy9IHvxXHlCvTlFZ+2rfuugr/f8reQLz9gvJccKc5TyRD7v+uhx0Q== - dependencies: - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.4.4" - "@babel/plugin-proposal-optional-chaining" "^7.6.0" - "@babel/plugin-transform-typescript" "~7.8.0" - ansi-to-html "^0.6.6" - broccoli-stew "^3.0.0" - debug "^4.0.0" - ember-cli-babel-plugin-helpers "^1.0.0" - execa "^3.0.0" - fs-extra "^8.0.0" - resolve "^1.5.0" - rsvp "^4.8.1" - semver "^6.3.0" - stagehand "^1.0.0" - walk-sync "^2.0.0" - ember-cli-typescript@^3.1.3, ember-cli-typescript@^3.1.4: version "3.1.4" resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-3.1.4.tgz#21d6ccd670d1f2e34c9cce68c6e32c442f46806b" @@ -7487,14 +7507,6 @@ ember-cli-typescript@^4.1.0, ember-cli-typescript@^4.2.1: stagehand "^1.0.0" walk-sync "^2.2.0" -ember-cli-uglify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ember-cli-uglify/-/ember-cli-uglify-3.0.0.tgz#8819665b2cc5fe70e3ba9fe7a94645209bc42fd6" - integrity sha512-n3QxdBfAgBdb2Cnso82Kt/nxm3ppIjnYWM8uhOEhF1aYxNXfM7AJrc+yiqTCDUR61Db8aCpHfAMvChz3kyme7g== - dependencies: - broccoli-uglify-sourcemap "^3.1.0" - lodash.defaultsdeep "^4.6.0" - ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0, ember-cli-version-checker@^2.1.2: version "2.2.0" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.2.0.tgz#47771b731fe0962705e27c8199a9e3825709f3b3" @@ -7503,7 +7515,7 @@ ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0, ember-cli-ve resolve "^1.3.3" semver "^5.3.0" -ember-cli-version-checker@^3.0.0, ember-cli-version-checker@^3.1.2, ember-cli-version-checker@^3.1.3: +ember-cli-version-checker@^3.0.0, ember-cli-version-checker@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-3.1.3.tgz#7c9b4f5ff30fdebcd480b1c06c4de43bb51c522c" integrity sha512-PZNSvpzwWgv68hcXxyjREpj3WWb81A7rtYNQq1lLEgrWIchF8ApKJjWP3NBpHjaatwILkZAV8klair5WFlXAKg== @@ -7529,98 +7541,102 @@ ember-cli-version-checker@^5.1.0, ember-cli-version-checker@^5.1.1, ember-cli-ve semver "^7.3.4" silent-error "^1.1.1" -ember-cli@~3.4.4: - version "3.4.4" - resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.4.4.tgz#8d25b223b2ef3b863310099192da92ab1feeef6b" - integrity sha512-opbdqt9AbNRPr/amemwqi9ENbx/HcqcprxJAW/y8nZAV1gAku+xPY4WNBF6KuClVEKkddbNi4jITLU59rlJcDA== +ember-cli@~3.28.4: + version "3.28.4" + resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.28.4.tgz#784cfeaf5319e409edc3e03e5d99bcfcf18f9e53" + integrity sha512-bRQpZqx1YctDNR7gb5CXfXYkZtieMh4F6v6bZtu+Da8jWTKoGizG1LXsG/Bhs96USPjlZZsErkSBo6qiGjJlcA== dependencies: - amd-name-resolver "^1.2.0" - babel-plugin-transform-es2015-modules-amd "^6.24.1" - bower-config "^1.3.0" + "@babel/core" "^7.13.8" + "@babel/plugin-transform-modules-amd" "^7.12.1" + amd-name-resolver "^1.3.1" + babel-plugin-module-resolver "^4.1.0" + bower-config "^1.4.3" bower-endpoint-parser "0.2.2" - broccoli-amd-funnel "^1.3.0" - broccoli-babel-transpiler "^6.5.0" + broccoli "^3.5.1" + broccoli-amd-funnel "^2.0.1" + broccoli-babel-transpiler "^7.8.0" broccoli-builder "^0.18.14" - broccoli-concat "^3.5.1" + broccoli-concat "^4.2.5" broccoli-config-loader "^1.0.1" broccoli-config-replace "^1.1.2" - broccoli-debug "^0.6.4" - broccoli-funnel "^2.0.1" + broccoli-debug "^0.6.5" + broccoli-funnel "^3.0.5" broccoli-funnel-reducer "^1.0.0" - broccoli-merge-trees "^3.0.0" - broccoli-middleware "^2.0.1" - broccoli-module-normalizer "^1.3.0" - broccoli-module-unification-reexporter "^1.0.0" - broccoli-source "^1.1.0" - broccoli-stew "^2.0.0" - calculate-cache-key-for-tree "^1.1.0" - capture-exit "^1.2.0" - chalk "^2.4.1" - ci-info "^1.1.3" + broccoli-merge-trees "^3.0.2" + broccoli-middleware "^2.1.1" + broccoli-slow-trees "^3.1.0" + broccoli-source "^3.0.0" + broccoli-stew "^3.0.0" + calculate-cache-key-for-tree "^2.0.0" + capture-exit "^2.0.0" + chalk "^4.1.0" + ci-info "^2.0.0" clean-base-url "^1.0.0" - compression "^1.7.3" - configstore "^4.0.0" - console-ui "^2.2.2" + compression "^1.7.4" + configstore "^5.0.1" + console-ui "^3.1.2" core-object "^3.1.5" dag-map "^2.0.2" - diff "^3.5.0" - ember-cli-broccoli-sane-watcher "^2.1.1" + diff "^5.0.0" ember-cli-is-package-missing "^1.0.0" ember-cli-lodash-subset "^2.0.1" ember-cli-normalize-entity-name "^1.0.0" - ember-cli-preprocess-registry "^3.1.2" + ember-cli-preprocess-registry "^3.3.0" ember-cli-string-utils "^1.1.0" - ensure-posix-path "^1.0.2" - execa "^0.10.0" + ember-source-channel-url "^3.0.0" + ensure-posix-path "^1.1.1" + execa "^5.0.0" exit "^0.1.2" - express "^4.16.3" - filesize "^3.6.1" - find-up "^3.0.0" - find-yarn-workspace-root "^1.1.0" - fixturify-project "^1.5.3" - fs-extra "^7.0.0" - fs-tree-diff "^0.5.7" - get-caller-file "^1.0.0" - git-repo-info "^2.0.0" - glob "^7.1.2" - heimdalljs "^0.2.5" - heimdalljs-fs-monitor "^0.2.2" - heimdalljs-graph "^0.3.4" - heimdalljs-logger "^0.1.9" - http-proxy "^1.17.0" + express "^4.17.1" + filesize "^6.1.0" + find-up "^5.0.0" + find-yarn-workspace-root "^2.0.0" + fixturify-project "^2.1.1" + fs-extra "^9.1.0" + fs-tree-diff "^2.0.1" + get-caller-file "^2.0.5" + git-repo-info "^2.1.1" + glob "^7.1.6" + heimdalljs "^0.2.6" + heimdalljs-fs-monitor "^1.1.0" + heimdalljs-graph "^1.0.0" + heimdalljs-logger "^0.1.10" + http-proxy "^1.18.1" inflection "^1.12.0" is-git-url "^1.0.0" - isbinaryfile "^3.0.3" - js-yaml "^3.12.0" + is-language-code "^2.0.0" + isbinaryfile "^4.0.6" + js-yaml "^3.14.0" json-stable-stringify "^1.0.1" leek "0.0.24" - lodash.template "^4.4.0" - markdown-it "^8.4.2" - markdown-it-terminal "0.1.0" + lodash.template "^4.5.0" + markdown-it "^12.0.4" + markdown-it-terminal "0.2.1" minimatch "^3.0.4" - morgan "^1.9.0" - node-modules-path "^1.0.1" + morgan "^1.10.0" nopt "^3.0.6" - npm-package-arg "^6.1.0" - portfinder "^1.0.15" - promise-map-series "^0.2.3" + npm-package-arg "^8.1.1" + p-defer "^3.0.0" + portfinder "^1.0.28" + promise-map-series "^0.3.0" + promise.hash.helper "^1.0.7" quick-temp "^0.1.8" - resolve "^1.8.1" - rsvp "^4.8.3" - sane "^3.0.0" - semver "^5.5.0" - silent-error "^1.1.0" - sort-package-json "^1.15.0" - symlink-or-copy "^1.2.0" - temp "0.8.3" - testem "^2.9.2" - tiny-lr "^1.1.1" - tree-sync "^1.2.2" - uuid "^3.3.2" - validate-npm-package-name "^3.0.0" - walk-sync "^0.3.2" - watch-detector "^0.1.0" - yam "^0.0.24" + resolve "^1.20.0" + resolve-package-path "^3.1.0" + sane "^4.1.0" + semver "^7.3.4" + silent-error "^1.1.1" + sort-package-json "^1.49.0" + symlink-or-copy "^1.3.1" + temp "0.9.4" + testem "^3.2.0" + tiny-lr "^2.0.0" + tree-sync "^2.1.0" + uuid "^8.3.2" + walk-sync "^2.2.0" + watch-detector "^1.0.0" + workerpool "^6.1.4" + yam "^1.0.0" ember-code-snippet@^3.0.0: version "3.0.0" @@ -7635,7 +7651,7 @@ ember-code-snippet@^3.0.0: es6-promise "^1.0.0" glob "^7.1.3" -ember-compatibility-helpers@^1.1.1, ember-compatibility-helpers@^1.1.2, ember-compatibility-helpers@^1.2.0, ember-compatibility-helpers@^1.2.1: +ember-compatibility-helpers@^1.1.2, ember-compatibility-helpers@^1.2.0, ember-compatibility-helpers@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.2.2.tgz#839e0c24190b7a2ec8c39b80e030811b1a95b6d3" integrity sha512-EKyCGOGBvKkBsk6wKfg3GhjTvTTkcEwzl/cv4VYvZM18cihmjGNpliR4BymWsKRWrv4VJLyq15Vhk3NHkSNBag== @@ -7685,38 +7701,25 @@ ember-concurrency@^2.0.0: ember-compatibility-helpers "^1.2.0" ember-destroyable-polyfill "^2.0.2" -ember-data@3.14.0: - version "3.14.0" - resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.14.0.tgz#e36584722bf84aef21a0541e10f2a3016b75b231" - integrity sha512-qmABgVOR/BtQV8mSCskn9EHYewVENGbvMzJfnNZ4EEWVebYQKqy2tAw1DHfiOkCmUk2MpFnJi/UfyH0p4nWhhQ== - dependencies: - "@ember-data/-build-infra" "3.14.0" - "@ember-data/adapter" "3.14.0" - "@ember-data/model" "3.14.0" - "@ember-data/serializer" "3.14.0" - "@ember-data/store" "3.14.0" - "@ember/ordered-set" "^2.0.3" - "@glimmer/env" "^0.1.7" - ember-cli-babel "^7.11.1" - ember-cli-typescript "^3.0.0" - ember-inflector "^3.0.1" - -ember-data@~3.14.0: - version "3.14.1" - resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.14.1.tgz#fb819ae30498b36ac71634fa221377057a382cf0" - integrity sha512-QQ7ufG5C9YAoktJ6kVV4Da5HfhqZrt84eEWCNyXG0eWgEiquz6/FxCHUbreFgSn2x+vGzncqsL6oQj6hIq9JaQ== - dependencies: - "@ember-data/-build-infra" "3.14.1" - "@ember-data/adapter" "3.14.1" - "@ember-data/model" "3.14.1" - "@ember-data/serializer" "3.14.1" - "@ember-data/store" "3.14.1" - "@ember/edition-utils" "^1.1.1" - "@ember/ordered-set" "^2.0.3" +ember-data@~3.28.5: + version "3.28.5" + resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.28.5.tgz#9ba88ed90b8d3ca319cd85f4dfd2c448202f898b" + integrity sha512-7zUlYt4GMAJIDQ977cdOTV7J+bWmchV1+1vFg4iSv9Vx+rBnk8816BcYEqkuDq8VfN9Wp/WwqrPV+qBZZ3lyPg== + dependencies: + "@ember-data/adapter" "3.28.5" + "@ember-data/debug" "3.28.5" + "@ember-data/model" "3.28.5" + "@ember-data/private-build-infra" "3.28.5" + "@ember-data/record-data" "3.28.5" + "@ember-data/serializer" "3.28.5" + "@ember-data/store" "3.28.5" + "@ember/edition-utils" "^1.2.0" + "@ember/string" "^3.0.0" "@glimmer/env" "^0.1.7" - ember-cli-babel "^7.11.1" - ember-cli-typescript "^3.0.0" - ember-inflector "^3.0.1" + broccoli-merge-trees "^4.2.0" + ember-cli-babel "^7.26.6" + ember-cli-typescript "^4.1.0" + ember-inflector "^4.0.1" ember-decorators@^6.1.1: version "6.1.1" @@ -7750,7 +7753,7 @@ ember-disable-prototype-extensions@^1.1.3: resolved "https://registry.yarnpkg.com/ember-disable-prototype-extensions/-/ember-disable-prototype-extensions-1.1.3.tgz#1969135217654b5e278f9fe2d9d4e49b5720329e" integrity sha1-GWkTUhdlS14nj5/i2dTkm1cgMp4= -ember-export-application-global@^2.0.0: +ember-export-application-global@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/ember-export-application-global/-/ember-export-application-global-2.0.1.tgz#b120a70e322ab208defc9e2daebe8d0dfc2dcd46" integrity sha512-B7wiurPgsxsSGzJuPFkpBWnaeuCu2PGpG2BjyrfA1VcL7//o+5RSnZqiCEY326y7qmxb2GoCgo0ft03KBU0rRw== @@ -7818,20 +7821,13 @@ ember-href-to@^4.0.0: dependencies: ember-cli-babel "^7.13.2" -"ember-inflector@^2.0.0 || ^3.0.0 || ^4.0.2": +"ember-inflector@^2.0.0 || ^3.0.0 || ^4.0.2", ember-inflector@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-4.0.2.tgz#4494f1a5f61c1aca7702d59d54024cc92211d8ec" integrity sha512-+oRstEa52mm0jAFzhr51/xtEWpCEykB3SEBr7vUg8YnXUZJ5hKNBppP938q8Zzr9XfJEbzrtDSGjhKwJCJv6FQ== dependencies: ember-cli-babel "^7.26.5" -ember-inflector@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-3.0.1.tgz#04be6df4d7e4000f6d6bd70787cdc995f77be4ab" - integrity sha512-fngrwMsnhkBt51KZgwNwQYxgURwV4lxtoHdjxf7RueGZ5zM7frJLevhHw7pbQNGqXZ3N+MRkhfNOLkdDK9kFdA== - dependencies: - ember-cli-babel "^6.6.0" - ember-keyboard@^6.0.3: version "6.0.4" resolved "https://registry.yarnpkg.com/ember-keyboard/-/ember-keyboard-6.0.4.tgz#396e1be4c815b2972e2a6973dcc45acbc6701e4a" @@ -7843,7 +7839,7 @@ ember-keyboard@^6.0.3: ember-modifier "^2.1.2 || ^3.0.0" ember-modifier-manager-polyfill "^1.2.0" -ember-load-initializers@^2.0.0: +ember-load-initializers@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-2.1.2.tgz#8a47a656c1f64f9b10cecdb4e22a9d52ad9c7efa" integrity sha512-CYR+U/wRxLbrfYN3dh+0Tb6mFaxJKfdyz+wNql6cqTrA0BBi9k6J3AaKXj273TqvEpyyXegQFFkZEiuZdYtgJw== @@ -7983,20 +7979,21 @@ ember-source-channel-url@^3.0.0: dependencies: node-fetch "^2.6.0" -ember-source@~3.26.1: - version "3.26.1" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.26.1.tgz#8c9e8a314fb0da447b944d64f9d92a80a628d7b5" - integrity sha512-5/NATBo5h9m1N52ITVksmjtGlYhGHLl4lDErAWv5/DC9zYe9ZR93NtymR6PEqrRilXc2x0KWd3NlOsWUoJRUOw== +ember-source@~3.28.8: + version "3.28.8" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.28.8.tgz#c58fd4a1538d6c4b9aebe76c764cabf5396c64d9" + integrity sha512-hA15oYzbRdi9983HIemeVzzX2iLcMmSPp6akUiMQhFZYWPrKksbPyLrO6YpZ4hNM8yBjQSDXEkZ1V3yxBRKjUA== dependencies: "@babel/helper-module-imports" "^7.8.3" "@babel/plugin-transform-block-scoping" "^7.8.3" "@babel/plugin-transform-object-assign" "^7.8.3" "@ember/edition-utils" "^1.2.0" - "@glimmer/vm-babel-plugins" "0.77.5" - babel-plugin-debug-macros "^0.3.3" + "@glimmer/vm-babel-plugins" "0.80.3" + babel-plugin-debug-macros "^0.3.4" babel-plugin-filter-imports "^4.0.0" broccoli-concat "^4.2.4" broccoli-debug "^0.6.4" + broccoli-file-creator "^2.1.1" broccoli-funnel "^2.0.2" broccoli-merge-trees "^4.2.0" chalk "^4.0.0" @@ -8145,45 +8142,28 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -engine.io-client@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.5.0.tgz#fc1b4d9616288ce4f2daf06dcf612413dec941c7" - integrity sha512-12wPRfMrugVw/DNyJk34GQ5vIVArEcVMXWugQGGuw2XxUSztFNmJggZmv8IZlLyEdnpO1QB9LkcjeWewO2vxtA== - dependencies: - component-emitter "~1.3.0" - component-inherit "0.0.3" - debug "~3.1.0" - engine.io-parser "~2.2.0" - has-cors "1.1.0" - indexof "0.0.1" - parseqs "0.0.6" - parseuri "0.0.6" - ws "~7.4.2" - xmlhttprequest-ssl "~1.5.4" - yeast "0.1.2" - -engine.io-parser@~2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.1.tgz#57ce5611d9370ee94f99641b589f94c97e4f5da7" - integrity sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg== +engine.io-parser@~5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.2.tgz#69a2ec3ed431da021f0666712d07f106bcffa6ce" + integrity sha512-wuiO7qO/OEkPJSFueuATIXtrxF7/6GTbAO9QLv7nnbjwZ5tYhLm9zxvLwxstRs0dcT0KUlWTjtIOs1T86jt12g== dependencies: - after "0.8.2" - arraybuffer.slice "~0.0.7" - base64-arraybuffer "0.1.4" - blob "0.0.5" - has-binary2 "~1.0.2" + base64-arraybuffer "~1.0.1" -engine.io@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.5.0.tgz#9d6b985c8a39b1fe87cd91eb014de0552259821b" - integrity sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA== +engine.io@~6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.1.0.tgz#459eab0c3724899d7b63a20c3a6835cf92857939" + integrity sha512-ErhZOVu2xweCjEfYcTdkCnEYUiZgkAcBBAhW4jbIvNG8SLU3orAqoJCiytZjYF7eTpVmmCrLDjLIEaPlUAs1uw== dependencies: + "@types/cookie" "^0.4.1" + "@types/cors" "^2.8.12" + "@types/node" ">=10.0.0" accepts "~1.3.4" base64id "2.0.0" cookie "~0.4.1" - debug "~4.1.0" - engine.io-parser "~2.2.0" - ws "~7.4.2" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~5.0.0" + ws "~8.2.3" enhanced-resolve@^4.0.0, enhanced-resolve@^4.3.0: version "4.3.0" @@ -8201,7 +8181,7 @@ enquirer@^2.3.5: dependencies: ansi-colors "^4.1.1" -ensure-posix-path@^1.0.0, ensure-posix-path@^1.0.1, ensure-posix-path@^1.0.2, ensure-posix-path@^1.1.0: +ensure-posix-path@^1.0.0, ensure-posix-path@^1.0.1, ensure-posix-path@^1.0.2, ensure-posix-path@^1.1.0, ensure-posix-path@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.1.1.tgz#3c62bdb19fa4681544289edb2b382adc029179ce" integrity sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw== @@ -8221,6 +8201,11 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== +entities@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" + integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== + errlop@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/errlop/-/errlop-2.2.0.tgz#1ff383f8f917ae328bebb802d6ca69666a42d21b" @@ -8524,7 +8509,7 @@ eslint@^7.32.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -esm@^3.2.25: +esm@^3.2.25, esm@^3.2.4: version "3.2.25" resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== @@ -8622,34 +8607,10 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -exec-file-sync@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/exec-file-sync/-/exec-file-sync-2.0.2.tgz#58d441db46e40de6d1f30de5be022785bd89e328" - integrity sha1-WNRB20bkDebR8w3lvgInhb2J4yg= - dependencies: - is-obj "^1.0.0" - object-assign "^4.0.1" - spawn-sync "^1.0.11" - -exec-sh@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36" - integrity sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw== - dependencies: - merge "^1.2.0" - -execa@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" - integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== - dependencies: - cross-spawn "^6.0.0" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" +exec-sh@^0.3.2: + version "0.3.6" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" + integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== execa@^0.7.0: version "0.7.0" @@ -8743,11 +8704,6 @@ exif-parser@^0.1.12, exif-parser@^0.1.9: resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922" integrity sha1-WKnS1ywCwfbwKg70qRZicrd2CSI= -exit-hook@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" - integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g= - exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -8766,7 +8722,14 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -express@^4.10.7, express@^4.13.1, express@^4.16.3: +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +express@^4.10.7, express@^4.13.1, express@^4.17.1: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== @@ -8817,20 +8780,11 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@~3.0.2: +extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-1.1.1.tgz#12d7b0db850f7ff7e7081baf4005700060c4600b" - integrity sha1-Etew24UPf/fnCBuvQAVwAGDEYAs= - dependencies: - extend "^3.0.0" - spawn-sync "^1.0.15" - tmp "^0.0.29" - external-editor@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" @@ -8854,6 +8808,11 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +extract-stack@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/extract-stack/-/extract-stack-2.0.0.tgz#11367bc865bfcd9bc0db3123e5edb57786f11f9b" + integrity sha512-AEo4zm+TenK7zQorGK1f9mJ8L14hnTDi2ZQPR+Mub1NX8zimka1mXpV5LpH8x9HoUmFSHZCfLHqWvp0Y4FxxzQ== + extract-zip@^1.6.5: version "1.7.0" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" @@ -9020,10 +8979,10 @@ favicons@5.3.0, favicons@~5.3.0: util.promisify "^1.0.0" vinyl "^2.2.0" -faye-websocket@~0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" - integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== dependencies: websocket-driver ">=0.5.1" @@ -9087,16 +9046,16 @@ file-url@^2.0.0: resolved "https://registry.yarnpkg.com/file-url/-/file-url-2.0.2.tgz#e951784d79095127d3713029ab063f40818ca2ae" integrity sha1-6VF4TXkJUSfTcTApqwY/QIGMoq4= -filesize@^3.6.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" - integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== - filesize@^4.1.2: version "4.2.1" resolved "https://registry.yarnpkg.com/filesize/-/filesize-4.2.1.tgz#ab1cb2069db5d415911c1a13e144c0e743bc89bc" integrity sha512-bP82Hi8VRZX/TUBKfE24iiUGsB/sfm2WUrwTQyAzQrhO3V9IhcBBNBXMyzLY5orACxRyYJ3d2HeRVX+eFv4lmA== +filesize@^6.1.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.4.0.tgz#914f50471dd66fdca3cefe628bd0cde4ef769bcd" + integrity sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ== + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -9114,7 +9073,7 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@~1.1.2: +finalhandler@1.1.2, finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== @@ -9127,7 +9086,7 @@ finalhandler@~1.1.2: statuses "~1.5.0" unpipe "~1.0.0" -find-babel-config@^1.1.0: +find-babel-config@^1.1.0, find-babel-config@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.2.0.tgz#a9b7b317eb5b9860cda9d54740a8c8337a2283a2" integrity sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA== @@ -9135,7 +9094,7 @@ find-babel-config@^1.1.0: json5 "^0.5.1" path-exists "^3.0.0" -find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: +find-cache-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== @@ -9187,6 +9146,23 @@ find-yarn-workspace-root@^1.1.0: fs-extra "^4.0.3" micromatch "^3.1.4" +find-yarn-workspace-root@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" + integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== + dependencies: + micromatch "^4.0.2" + +findup-sync@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-4.0.0.tgz#956c9cdde804052b881b428512905c4a5f2cdef0" + integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^4.0.2" + resolve-dir "^1.0.1" + fireworm@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/fireworm/-/fireworm-0.7.1.tgz#ccf20f7941f108883fcddb99383dbe6e1861c758" @@ -9198,7 +9174,7 @@ fireworm@^0.7.0: lodash.flatten "^3.0.2" minimatch "^3.0.2" -fixturify-project@^1.10.0, fixturify-project@^1.5.3: +fixturify-project@^1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/fixturify-project/-/fixturify-project-1.10.0.tgz#091c452a9bb15f09b6b9cc7cf5c0ad559f1d9aad" integrity sha512-L1k9uiBQuN0Yr8tA9Noy2VSQ0dfg0B8qMdvT7Wb5WQKc7f3dn3bzCbSrqlb+etLW+KDV4cBC7R1OvcMg3kcxmA== @@ -9206,6 +9182,15 @@ fixturify-project@^1.10.0, fixturify-project@^1.5.3: fixturify "^1.2.0" tmp "^0.0.33" +fixturify-project@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fixturify-project/-/fixturify-project-2.1.1.tgz#a511dd26700c6b64ac271ef4393e7124f153c81f" + integrity sha512-sP0gGMTr4iQ8Kdq5Ez0CVJOZOGWqzP5dv/veOTdFNywioKjkNWCHBi1q65DMpcNGUGeoOUWehyji274Q2wRgxA== + dependencies: + fixturify "^2.1.0" + tmp "^0.0.33" + type-fest "^0.11.0" + fixturify@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/fixturify/-/fixturify-1.3.0.tgz#163c468093c7c4d90b70cde39fd6325f6528b25d" @@ -9217,6 +9202,18 @@ fixturify@^1.2.0: fs-extra "^7.0.1" matcher-collection "^2.0.0" +fixturify@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fixturify/-/fixturify-2.1.1.tgz#e962d72f062600cb81a9651086f60d822c72d998" + integrity sha512-SRgwIMXlxkb6AUgaVjIX+jCEqdhyXu9hah7mcK+lWynjKtX73Ux1TDv71B7XyaQ+LJxkYRHl5yCL8IycAvQRUw== + dependencies: + "@types/fs-extra" "^8.1.0" + "@types/minimatch" "^3.0.3" + "@types/rimraf" "^2.0.3" + fs-extra "^8.1.0" + matcher-collection "^2.0.1" + walk-sync "^2.0.2" + flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" @@ -9473,7 +9470,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.2.3, fsevents@^1.2.7: +fsevents@^1.2.7: version "1.2.12" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.12.tgz#db7e0d8ec3b0b45724fd4d83d43554a8f1f0de5c" integrity sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q== @@ -9530,7 +9527,7 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^1.0.0, get-caller-file@^1.0.1: +get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== @@ -9623,12 +9620,12 @@ git-config-path@^2.0.0: resolved "https://registry.yarnpkg.com/git-config-path/-/git-config-path-2.0.0.tgz#62633d61af63af4405a5024efd325762f58a181b" integrity sha512-qc8h1KIQbJpp+241id3GuAtkdyJ+IK+LIVtkiFTRKRrmddDzs3SI9CvP1QYmWBFvm1I/PWRwj//of8bgAc0ltA== -git-hooks-list@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/git-hooks-list/-/git-hooks-list-1.0.2.tgz#b023b76872f00d81b353efd1458fb4a165035575" - integrity sha512-C3c/FG6Pgh053+yK/CnNNYJo5mgCa3OeI+cPxPIl0tyMLm1mGfiV0NX0LrhnjVoX7dfkR78WyW2kvFVHvAlneg== +git-hooks-list@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/git-hooks-list/-/git-hooks-list-1.0.3.tgz#be5baaf78203ce342f2f844a9d2b03dba1b45156" + integrity sha512-Y7wLWcrLUXwk2noSka166byGCvhMtDRpgHdzCno1UQv/n/Hegp++a2xBWJL1lJarnKD3SWaljD+0z1ztqxuKyQ== -git-repo-info@^2.0.0, git-repo-info@^2.1.1: +git-repo-info@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-2.1.1.tgz#220ffed8cbae74ef8a80e3052f2ccb5179aed058" integrity sha512-8aCohiDo4jwjOwma4FmYFd3i97urZulL8XL24nIPxuE+GZnfsAyy/g2Shqx6OjUiFKUXZM+Yy+KHnOmmA3FVcg== @@ -9678,6 +9675,26 @@ glob@^7.0.0, glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, gl once "^1.3.0" path-is-absolute "^1.0.0" +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + global@~4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" @@ -9708,10 +9725,10 @@ globalyzer@0.1.0: resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465" integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== -globby@10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.1.tgz#4782c34cb75dd683351335c5829cc3420e606b22" - integrity sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A== +globby@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.0.tgz#abfcd0630037ae174a88590132c2f6804e291072" + integrity sha512-3LifW9M4joGZasyYPz2A1U74zbC/45fvpXUvO/9KbSa+VV0aGZarWkfdgKyR9sExNP0t0x0ss/UMJpNpcaTspw== dependencies: "@types/glob" "^7.1.1" array-union "^2.1.0" @@ -9778,7 +9795,7 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -handlebars@^4.0.13, handlebars@^4.0.4, handlebars@^4.3.1, handlebars@^4.4.2: +handlebars@^4.0.13, handlebars@^4.0.4, handlebars@^4.3.1, handlebars@^4.4.2, handlebars@^4.7.3: version "4.7.7" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== @@ -9822,18 +9839,6 @@ has-bigints@^1.0.1: resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== -has-binary2@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" - integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== - dependencies: - isarray "2.0.1" - -has-cors@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" - integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -9950,18 +9955,21 @@ hawk@1.1.1: hoek "0.9.x" sntp "0.2.x" -heimdalljs-fs-monitor@^0.2.2: - version "0.2.3" - resolved "https://registry.yarnpkg.com/heimdalljs-fs-monitor/-/heimdalljs-fs-monitor-0.2.3.tgz#1aedd4b1c61d86c51f6141fb75c5a3350dc41b15" - integrity sha512-fYAvqSP0CxeOjLrt61B4wux/jqZzdZnS2xfb2oc14NP6BTZ8gtgtR2op6gKFakOR8lm8GN9Xhz1K4A1ZvJ4RQw== +heimdalljs-fs-monitor@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/heimdalljs-fs-monitor/-/heimdalljs-fs-monitor-1.1.1.tgz#bb4021007e88484202402cdf594e3962d70dc4f4" + integrity sha512-BHB8oOXLRlrIaON0MqJSEjGVPDyqt2Y6gu+w2PaEZjrCxeVtZG7etEZp7M4ZQ80HNvnr66KIQ2lot2qdeG8HgQ== dependencies: + callsites "^3.1.0" + clean-stack "^2.2.0" + extract-stack "^2.0.0" heimdalljs "^0.2.3" heimdalljs-logger "^0.1.7" -heimdalljs-graph@^0.3.4: - version "0.3.5" - resolved "https://registry.yarnpkg.com/heimdalljs-graph/-/heimdalljs-graph-0.3.5.tgz#420fbbc8fc3aec5963ddbbf1a5fb47921c4a5927" - integrity sha512-szOy9WZUc7eUInEBQEsoa1G2d+oYHrn6ndZPf76eh8A9ID1zWUCEEsxP3F+CvQx9+EDrg1srdyLUmfVAr8EB4g== +heimdalljs-graph@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/heimdalljs-graph/-/heimdalljs-graph-1.0.0.tgz#0059857952988e54f3a74bb23edaf669f8eaf6af" + integrity sha512-v2AsTERBss0ukm/Qv4BmXrkwsT5x6M1V5Om6E8NcDQ/ruGkERsfsuLi5T8jx8qWzKMGYlwzAd7c/idymxRaPzA== heimdalljs-logger@^0.1.10, heimdalljs-logger@^0.1.7, heimdalljs-logger@^0.1.9, heimdalljs-logger@~0.1.10: version "0.1.10" @@ -9978,13 +9986,6 @@ heimdalljs@^0.2.0, heimdalljs@^0.2.1, heimdalljs@^0.2.3, heimdalljs@^0.2.5, heim dependencies: rsvp "~3.2.1" -heimdalljs@^0.3.0: - version "0.3.3" - resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.3.3.tgz#e92d2c6f77fd46d5bf50b610d28ad31755054d0b" - integrity sha1-6S0sb3f9RtW/ULYQ0orTF1UFTQs= - dependencies: - rsvp "~3.2.1" - highlight.js@^10.7.2: version "10.7.3" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" @@ -10022,12 +10023,19 @@ home-or-tmp@^2.0.0: os-homedir "^1.0.0" os-tmpdir "^1.0.1" -hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== -hosted-git-info@^4.0.2: +hosted-git-info@^4.0.1, hosted-git-info@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961" integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg== @@ -10097,6 +10105,16 @@ http-errors@1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + http-errors@~1.7.2: version "1.7.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" @@ -10122,7 +10140,7 @@ http-proxy-agent@^5.0.0: agent-base "6" debug "4" -http-proxy@^1.13.1, http-proxy@^1.17.0: +http-proxy@^1.13.1, http-proxy@^1.18.1: version "1.18.1" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== @@ -10162,6 +10180,11 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" +https@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https/-/https-1.0.0.tgz#3c37c7ae1a8eeb966904a2ad1e975a194b7ed3a4" + integrity sha1-PDfHrhqO65ZpBKKtHpdaGUt+06Q= + human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" @@ -10265,33 +10288,31 @@ include-path-searcher@^0.1.0: resolved "https://registry.yarnpkg.com/include-path-searcher/-/include-path-searcher-0.1.0.tgz#c0cf2ddfa164fb2eae07bc7ca43a7f191cb4d7bd" integrity sha1-wM8t36Fk+y6uB7x8pDp/GRy0170= -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= - dependencies: - repeating "^2.0.0" - indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= +infer-owner@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== inflected@^2.0.3, inflected@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inflected/-/inflected-2.0.4.tgz#323770961ccbe992a98ea930512e9a82d3d3ef77" integrity sha512-HQPzFLTTUvwfeUH6RAGjD8cHS069mBqXG5n4qaxX7sJXBhVQrsGgF+0ZJGkSuN6a8pcUWB/GXStta11kKi/WvA== -inflection@1.12.0, inflection@^1.12.0: +inflection@^1.12.0: version "1.12.0" resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" integrity sha1-ogCTVlbW9fa8TcdQLhrstwMihBY= +inflection@~1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.13.1.tgz#c5cadd80888a90cf84c2e96e340d7edc85d5f0cb" + integrity sha512-dldYtl2WlN0QDkIDtg8+xFwOS2Tbmp12t1cHa5/YClU6ZQjTFm7B66UcVbh9NQB+HvT5BAd2t5+yKsBkw5pcqA== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -10315,6 +10336,11 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +ini@^1.3.4: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + ini@^1.3.5, ini@~1.3.0: version "1.3.7" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" @@ -10331,24 +10357,23 @@ inline-source-map-comment@^1.0.5: sum-up "^1.0.1" xtend "^4.0.0" -inquirer@^2: - version "2.0.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-2.0.0.tgz#e1351687b90d150ca403ceaa3cefb1e3065bef4b" - integrity sha1-4TUWh7kNFQykA86qPO+x4wZb70s= +inquirer@^6: + version "6.5.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== dependencies: - ansi-escapes "^1.1.0" - chalk "^1.0.0" - cli-cursor "^1.0.1" + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" cli-width "^2.0.0" - external-editor "^1.1.0" + external-editor "^3.0.3" figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.6" - pinkie-promise "^2.0.0" + lodash "^4.17.12" + mute-stream "0.0.7" run-async "^2.2.0" - rx "^4.1.0" - string-width "^2.0.0" - strip-ansi "^3.0.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" through "^2.3.6" inquirer@^7.3.3: @@ -10521,6 +10546,11 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -10596,6 +10626,11 @@ is-interactive@^1.0.0: resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== +is-language-code@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-language-code/-/is-language-code-2.0.0.tgz#6f4d59c551d73b98c45cf9f1d3ce65cee060e65b" + integrity sha512-6xKmRRcP2YdmMBZMVS3uiJRPQgcMYolkD6hFw2Y4KjqyIyaJlCGxUt56tuu0iIV8q9r8kMEo0Gjd/GFwKrgjbw== + is-negative-zero@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" @@ -10620,10 +10655,10 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== is-plain-obj@2.1.0: version "2.1.0" @@ -10717,7 +10752,7 @@ is-type@0.0.1: dependencies: core-util-is "~1.0.0" -is-typedarray@~1.0.0: +is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= @@ -10739,7 +10774,7 @@ is-weakref@^1.0.1: dependencies: call-bind "^1.0.0" -is-windows@^1.0.2: +is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -10749,6 +10784,13 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -10759,17 +10801,10 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= -isarray@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" - integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= - -isbinaryfile@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" - integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== - dependencies: - buffer-alloc "^1.2.0" +isbinaryfile@^4.0.6: + version "4.0.8" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.8.tgz#5d34b94865bd4946633ecc78a026fc76c5b11fcf" + integrity sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w== isemail@3.x.x: version "3.2.0" @@ -10895,7 +10930,7 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@^3.12.0, js-yaml@^3.13.1, js-yaml@^3.2.5, js-yaml@^3.2.7: +js-yaml@^3.13.1, js-yaml@^3.14.0, js-yaml@^3.2.5, js-yaml@^3.2.7: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -11227,6 +11262,13 @@ linkify-it@^2.0.0: dependencies: uc.micro "^1.0.1" +linkify-it@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e" + integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ== + dependencies: + uc.micro "^1.0.1" + linkify-it@~1.2.0: version "1.2.4" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-1.2.4.tgz#0773526c317c8fd13bd534ee1d180ff88abf881a" @@ -11248,10 +11290,10 @@ linkify-it@~1.2.0: match-media "^0.2.0" velocity-animate "^1.5.2" -livereload-js@^2.3.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.4.0.tgz#447c31cf1ea9ab52fc20db615c5ddf678f78009c" - integrity sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw== +livereload-js@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-3.3.2.tgz#c88b009c6e466b15b91faa26fd7c99d620e12651" + integrity sha512-w677WnINxFkuixAoUEXOStewzLYGI76XVag+0JWMMEyjJQKs0ibWZMxkTlB96Lm3EjZ7IeOxVziBEbtxVQqQZA== load-bmfont@^1.2.3, load-bmfont@^1.3.1, load-bmfont@^1.4.0: version "1.4.0" @@ -11658,7 +11700,7 @@ lodash.values@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c= -lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.7.0: +lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.5.1, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -11685,14 +11727,6 @@ loose-envify@^1.0.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - lower-case@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.1.tgz#39eeb36e396115cc05e29422eaea9e692c9408c7" @@ -11744,13 +11778,6 @@ magic-string@^0.24.0: dependencies: sourcemap-codec "^1.4.1" -make-dir@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== - dependencies: - pify "^3.0.0" - make-dir@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -11759,6 +11786,13 @@ make-dir@^2.0.0: pify "^4.0.1" semver "^5.6.0" +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" @@ -11771,11 +11805,6 @@ map-cache@^0.2.2: resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -11783,17 +11812,28 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -markdown-it-terminal@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/markdown-it-terminal/-/markdown-it-terminal-0.1.0.tgz#545abd8dd01c3d62353bfcea71db580b51d22bd9" - integrity sha1-VFq9jdAcPWI1O/zqcdtYC1HSK9k= +markdown-it-terminal@0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/markdown-it-terminal/-/markdown-it-terminal-0.2.1.tgz#670fd5ea824a7dcaa1591dcbeef28bf70aff1705" + integrity sha512-e8hbK9L+IyFac2qY05R7paP+Fqw1T4pSQW3miK3VeG9QmpqBjg5Qzjv/v6C7YNxSNRS2Kp8hUFtm5lWU9eK4lw== dependencies: ansi-styles "^3.0.0" cardinal "^1.0.0" cli-table "^0.3.1" - lodash.merge "^4.6.0" + lodash.merge "^4.6.2" markdown-it "^8.3.1" +markdown-it@^12.0.4: + version "12.3.0" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.3.0.tgz#11490c61b412b8f41530319c005ecdcd4367171f" + integrity sha512-T345UZZ6ejQWTjG6PSEHplzNy5m4kF6zvUpHVDv8Snl/pEU0OxIK0jGg8YLVNwJvT8E0YJC7/2UvssJDk/wQCQ== + dependencies: + argparse "^2.0.1" + entities "~2.1.0" + linkify-it "^3.0.1" + mdurl "^1.0.1" + uc.micro "^1.0.5" + markdown-it@^4.3.0: version "4.4.0" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-4.4.0.tgz#3df373dbea587a9a7fef3e56311b68908f75c414" @@ -11805,7 +11845,7 @@ markdown-it@^4.3.0: mdurl "~1.0.0" uc.micro "^1.0.0" -markdown-it@^8.3.1, markdown-it@^8.4.2: +markdown-it@^8.3.1: version "8.4.2" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54" integrity sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ== @@ -11838,7 +11878,7 @@ matcher-collection@^1.0.0, matcher-collection@^1.1.1: dependencies: minimatch "^3.0.2" -matcher-collection@^2.0.0: +matcher-collection@^2.0.0, matcher-collection@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-2.0.1.tgz#90be1a4cf58d6f2949864f65bb3b0f3e41303b29" integrity sha512-daE62nS2ZQsDg9raM0IlZzLmI2u+7ZapXBwdoeBUKAYERPDDIc0qNqA8E0Rp2D+gspKR7BgIFP52GeujaGXWeQ== @@ -11925,22 +11965,6 @@ memorystream@^0.3.1: resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= -meow@^3.4.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -11976,11 +12000,6 @@ merge2@^1.2.3, merge2@^1.3.0: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== -merge@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" - integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== - merge@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/merge/-/merge-2.1.1.tgz#59ef4bf7e0b3e879186436e8481c06a6c162ca98" @@ -12044,6 +12063,11 @@ mime-db@1.45.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== +mime-db@1.51.0: + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== + mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.19: version "2.1.26" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" @@ -12051,6 +12075,13 @@ mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.19: dependencies: mime-db "1.43.0" +mime-types@^2.1.26: + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== + dependencies: + mime-db "1.51.0" + mime-types@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-1.0.2.tgz#995ae1392ab8affcbfcb2641dd054e943c0d5dce" @@ -12122,15 +12153,15 @@ minimist@1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= -minimist@>=1.2.5, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: +minimist@>=1.2.5, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= +minimist@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.1.tgz#827ba4e7593464e7c221e8c5bed930904ee2c455" + integrity sha512-GY8fANSrTMfBVfInqJAY41QkOM+upUTytK1jZ0c8+3HdHrJxBJ3rF5i9moClXTE8uUSnUo8cAsCoxDXvSY4DHg== minipass@^2.2.0: version "2.9.0" @@ -12210,6 +12241,13 @@ mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@~0.5.1: dependencies: minimist "^1.2.5" +mkdirp@^0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" @@ -12244,7 +12282,7 @@ moment@^2.29.1: resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== -morgan@^1.9.0: +morgan@^1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== @@ -12297,10 +12335,10 @@ mustache@^3.0.0: resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.2.1.tgz#89e78a9d207d78f2799b1e95764a25bf71a28322" integrity sha512-RERvMFdLpaFfSRIEe632yDm5nsd0SDKn8hGmcUwswnyiE5mtdZLDybtHAz6hjJhawokF0hXvGLtx9mrQfm6FkA== -mute-stream@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" - integrity sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s= +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= mute-stream@0.0.8: version "0.0.8" @@ -12420,16 +12458,17 @@ node-modules-path@^1.0.0, node-modules-path@^1.0.1: resolved "https://registry.yarnpkg.com/node-modules-path/-/node-modules-path-1.0.2.tgz#e3acede9b7baf4bc336e3496b58e5b40d517056e" integrity sha512-6Gbjq+d7uhkO7epaKi5DNgUJn7H0gEyA4Jg0Mo1uQOi3Rk50G83LtmhhFyw0LxnAFhtlspkiiw52ISP13qzcBg== -node-notifier@^5.0.1: - version "5.4.3" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" - integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== +node-notifier@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-9.0.1.tgz#cea837f4c5e733936c7b9005e6545cea825d1af4" + integrity sha512-fPNFIp2hF/Dq7qLDzSg4vZ0J4e9v60gJR+Qx7RbjbWqzPDdEqeVpEx5CFeDAELIl+A/woaaNn1fQ5nEVerMxJg== dependencies: growly "^1.3.0" - is-wsl "^1.1.0" - semver "^5.5.0" + is-wsl "^2.2.0" + semver "^7.3.2" shellwords "^0.1.1" - which "^1.3.0" + uuid "^8.3.0" + which "^2.0.2" node-releases@^1.1.52: version "1.1.52" @@ -12470,7 +12509,7 @@ nopt@^3.0.6: dependencies: abbrev "1" -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: +normalize-package-data@^2.3.2: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -12512,14 +12551,13 @@ npm-git-info@^1.0.3: resolved "https://registry.yarnpkg.com/npm-git-info/-/npm-git-info-1.0.3.tgz#a933c42ec321e80d3646e0d6e844afe94630e1d5" integrity sha1-qTPELsMh6A02RuDW6ESv6UYw4dU= -npm-package-arg@^6.1.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.1.tgz#02168cb0a49a2b75bf988a28698de7b529df5cb7" - integrity sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg== +npm-package-arg@^8.1.1: + version "8.1.5" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.5.tgz#3369b2d5fe8fdc674baa7f1786514ddc15466e44" + integrity sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q== dependencies: - hosted-git-info "^2.7.1" - osenv "^0.1.5" - semver "^5.6.0" + hosted-git-info "^4.0.1" + semver "^7.3.4" validate-npm-package-name "^3.0.0" npm-run-all@^4.1.5: @@ -12605,7 +12643,7 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@4.1.1, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@4.1.1, object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -12720,11 +12758,6 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" - integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k= - onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" @@ -12746,14 +12779,6 @@ onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -optimist@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -12778,16 +12803,16 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -ora@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-2.1.0.tgz#6caf2830eb924941861ec53a173799e008b51e5b" - integrity sha512-hNNlAd3gfv/iPmsNxYoAPLvxg7HuPozww7fFonMZvL84tP6Ox5igfk5j/+a9rtJJwqMgKK+JgWsAQik5o0HTLA== +ora@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" + integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== dependencies: - chalk "^2.3.1" + chalk "^2.4.2" cli-cursor "^2.1.0" - cli-spinners "^1.1.0" + cli-spinners "^2.0.0" log-symbols "^2.2.0" - strip-ansi "^4.0.0" + strip-ansi "^5.2.0" wcwidth "^1.0.1" ora@^5.4.0: @@ -12810,7 +12835,7 @@ os-browserify@^0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= -os-homedir@^1.0.0, os-homedir@^1.0.1: +os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= @@ -12822,17 +12847,12 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" -os-shim@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" - integrity sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc= - os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@^0.1.3, osenv@^0.1.5: +osenv@^0.1.3: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== @@ -12845,6 +12865,11 @@ p-cancelable@^1.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== +p-defer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" + integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw== + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -13011,6 +13036,11 @@ parse-ms@^1.0.0: resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" integrity sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0= +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + parse-png@^1.0.0, parse-png@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/parse-png/-/parse-png-1.1.2.tgz#f5c2ad7c7993490986020a284c19aee459711ff2" @@ -13035,16 +13065,6 @@ parse5@^3.0.1: dependencies: "@types/node" "*" -parseqs@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" - integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w== - -parseuri@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a" - integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow== - parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -13055,13 +13075,6 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= -passwd-user@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/passwd-user/-/passwd-user-1.2.1.tgz#a01a5dc639ef007dc56364b8178569080ad3a7b8" - integrity sha1-oBpdxjnvAH3FY2S4F4VpCArTp7g= - dependencies: - exec-file-sync "^2.0.0" - path-browserify@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" @@ -13089,7 +13102,7 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +path-is-absolute@1.0.1, path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= @@ -13283,14 +13296,14 @@ pngjs@^3.0.0, pngjs@^3.2.0, pngjs@^3.3.3: resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== -portfinder@^1.0.15: - version "1.0.25" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca" - integrity sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg== +portfinder@^1.0.28: + version "1.0.28" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== dependencies: async "^2.6.2" debug "^3.1.1" - mkdirp "^0.5.1" + mkdirp "^0.5.5" posix-character-classes@^0.1.0: version "0.1.1" @@ -13471,10 +13484,10 @@ pretty-ms@^3.1.0: dependencies: parse-ms "^1.0.0" -printf@^0.5.1: - version "0.5.3" - resolved "https://registry.yarnpkg.com/printf/-/printf-0.5.3.tgz#8b7eec278d886833312238b2bf42b2b6f250880a" - integrity sha512-t3lYN6vPU5PZXDiEZZqoyXvN8wCsBfi8gPoxTKo2e5hhV673t/KUh+mfO8P8lCOCDC/BWcOGIxKyebxc5FuqLA== +printf@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/printf/-/printf-0.6.1.tgz#b9afa3d3b55b7f2e8b1715272479fc756ed88650" + integrity sha512-is0ctgGdPJ5951KulgfzvHGwJtZ5ck8l042vRkV6jrkpBzTmb/lueTqguWHy2JfVA+RY6gFVlaZgUS0j7S/dsw== private@^0.1.6, private@^0.1.8: version "0.1.8" @@ -13518,7 +13531,7 @@ promise-inflight@^1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= -promise-map-series@^0.2.1, promise-map-series@^0.2.3: +promise-map-series@^0.2.1: version "0.2.3" resolved "https://registry.yarnpkg.com/promise-map-series/-/promise-map-series-0.2.3.tgz#c2d377afc93253f6bd03dbb77755eb88ab20a847" integrity sha1-wtN3r8kyU/a9A9u3d1XriKsgqEc= @@ -13530,6 +13543,11 @@ promise-map-series@^0.3.0: resolved "https://registry.yarnpkg.com/promise-map-series/-/promise-map-series-0.3.0.tgz#41873ca3652bb7a042b387d538552da9b576f8a1" integrity sha512-3npG2NGhTc8BWBolLLf8l/92OxMGaRLbqvIh9wjCHhDXNvk4zsxaTaCpiCunW09qWPrN2zeNSNwRLVBrQQtutA== +promise.hash.helper@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/promise.hash.helper/-/promise.hash.helper-1.0.8.tgz#8c5fa0570f6f96821f52364fd72292b2c5a114f7" + integrity sha512-KYcnXctWUWyVD3W3Ye0ZDuA1N8Szrh85cVCxpG6xYrOk/0CttRtYCmU30nWsUch0NuExQQ63QXvzRE6FLimZmg== + proxy-addr@~2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" @@ -13678,7 +13696,7 @@ qunit@^2.17.2: node-watch "0.7.2" tiny-glob "0.2.9" -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== @@ -13849,14 +13867,6 @@ recast@^0.19.1: private "^0.1.8" source-map "~0.6.1" -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - redeyed@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-1.0.1.tgz#e96c193b40c0816b00aec842698e61185e55498a" @@ -14146,6 +14156,11 @@ reselect@^3.0.1: resolved "https://registry.yarnpkg.com/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147" integrity sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc= +reselect@^4.0.0: + version "4.1.5" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.5.tgz#852c361247198da6756d07d9296c2b51eddb79f6" + integrity sha512-uVdlz8J7OO+ASpBYoz1Zypgx0KasCY20H+N8JD13oUMtPvSHQuscrHop4KbXrbsBcdB9Ds7lVK7eRkBIfO43vQ== + resize-img@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/resize-img/-/resize-img-1.1.2.tgz#fad650faf3ef2c53ea63112bc272d95e9d92550e" @@ -14158,6 +14173,14 @@ resize-img@^1.1.0: jpeg-js "^0.1.1" parse-png "^1.1.1" +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -14187,6 +14210,14 @@ resolve-package-path@^3.1.0: path-root "^0.1.1" resolve "^1.17.0" +resolve-path@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7" + integrity sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc= + dependencies: + http-errors "~1.6.2" + path-is-absolute "1.0.1" + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -14214,14 +14245,6 @@ responselike@^1.0.2: dependencies: lowercase-keys "^1.0.0" -restore-cursor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" - integrity sha1-NGYfRohjJ/7SmRR5FSJS35LapUE= - dependencies: - exit-hook "^1.0.0" - onetime "^1.0.0" - restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -14262,10 +14285,12 @@ rimraf@^3.0.0, rimraf@^3.0.1, rimraf@^3.0.2: dependencies: glob "^7.1.3" -rimraf@~2.2.6: - version "2.2.8" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" - integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" @@ -14299,14 +14324,12 @@ rollup@^0.57.1: signal-exit "^3.0.2" sourcemap-codec "^1.4.1" -rollup@^1.12.0: - version "1.32.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.32.1.tgz#4480e52d9d9e2ae4b46ba0d9ddeaf3163940f9c4" - integrity sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A== - dependencies: - "@types/estree" "*" - "@types/node" "*" - acorn "^7.1.0" +rollup@^2.50.0: + version "2.61.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.61.1.tgz#1a5491f84543cf9e4caf6c61222d9a3f8f2ba454" + integrity sha512-BbTXlEvB8d+XFbK/7E5doIcRtxWPRiqr0eb5vQ0+2paMM04Ye4PZY5nHOQef2ix24l/L0SpLd5hwcH15QHPdvA== + optionalDependencies: + fsevents "~2.3.2" route-recognizer@^0.3.3: version "0.3.4" @@ -14347,10 +14370,12 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rx@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" - integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= +rxjs@^6.4.0: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" rxjs@^6.6.0: version "6.6.2" @@ -14386,38 +14411,20 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sane@^2.4.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" - integrity sha1-tNwYYcIbQn6SlQej51HiosuKs/o= - dependencies: - anymatch "^2.0.0" - capture-exit "^1.2.0" - exec-sh "^0.2.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - watch "~0.18.0" - optionalDependencies: - fsevents "^1.2.3" - -sane@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-3.1.0.tgz#995193b7dc1445ef1fe41ddfca2faf9f111854c6" - integrity sha512-G5GClRRxT1cELXfdAq7UKtUsv8q/ZC5k8lQGmjEm4HcAl3HzBy68iglyNCmw4+0tiXPCBZntslHlRhbnsSws+Q== +sane@^4.0.0, sane@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== dependencies: + "@cnakazawa/watch" "^1.0.3" anymatch "^2.0.0" - capture-exit "^1.2.0" - exec-sh "^0.2.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" execa "^1.0.0" fb-watchman "^2.0.0" micromatch "^3.1.4" minimist "^1.1.1" walker "~1.0.5" - watch "~0.18.0" - optionalDependencies: - fsevents "^1.2.3" sass@^1.16.1: version "1.45.0" @@ -14477,7 +14484,7 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semve resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.5: +semver@^7.1.3, semver@^7.2.1, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== @@ -14510,10 +14517,12 @@ send@0.17.1: range-parser "~1.2.1" statuses "~1.5.0" -serialize-javascript@^1.4.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" - integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A== +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" serve-static@1.14.1: version "1.14.1" @@ -14545,6 +14554,11 @@ setimmediate@^1.0.4: resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + setprototypeof@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" @@ -14710,72 +14724,46 @@ sntp@0.2.x: dependencies: hoek "0.9.x" -socket.io-adapter@~1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz#ab3f0d6f66b8fc7fca3959ab5991f82221789be9" - integrity sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g== +socket.io-adapter@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz#4d6111e4d42e9f7646e365b4f578269821f13486" + integrity sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ== -socket.io-client@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.4.0.tgz#aafb5d594a3c55a34355562fc8aea22ed9119a35" - integrity sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ== - dependencies: - backo2 "1.0.2" - component-bind "1.0.0" - component-emitter "~1.3.0" - debug "~3.1.0" - engine.io-client "~3.5.0" - has-binary2 "~1.0.2" - indexof "0.0.1" - parseqs "0.0.6" - parseuri "0.0.6" - socket.io-parser "~3.3.0" - to-array "0.1.4" - -socket.io-parser@~3.3.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.2.tgz#ef872009d0adcf704f2fbe830191a14752ad50b6" - integrity sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg== +socket.io-parser@~4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" + integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g== dependencies: + "@types/component-emitter" "^1.2.10" component-emitter "~1.3.0" - debug "~3.1.0" - isarray "2.0.1" - -socket.io-parser@~3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.4.1.tgz#b06af838302975837eab2dc980037da24054d64a" - integrity sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A== - dependencies: - component-emitter "1.2.1" - debug "~4.1.0" - isarray "2.0.1" + debug "~4.3.1" -socket.io@^2.1.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.4.1.tgz#95ad861c9a52369d7f1a68acf0d4a1b16da451d2" - integrity sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w== +socket.io@^4.1.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.4.0.tgz#8140a0db2c22235f88a6dceb867e4d5c9bd70507" + integrity sha512-bnpJxswR9ov0Bw6ilhCvO38/1WPtE3eA2dtxi2Iq4/sFebiDJQzgKNYA7AuVVdGW09nrESXd90NbZqtDd9dzRQ== dependencies: - debug "~4.1.0" - engine.io "~3.5.0" - has-binary2 "~1.0.2" - socket.io-adapter "~1.1.0" - socket.io-client "2.4.0" - socket.io-parser "~3.4.0" + accepts "~1.3.4" + base64id "~2.0.0" + debug "~4.3.2" + engine.io "~6.1.0" + socket.io-adapter "~2.3.3" + socket.io-parser "~4.0.4" sort-object-keys@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.3.tgz#bff833fe85cab147b34742e45863453c1e190b45" integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg== -sort-package-json@^1.15.0: - version "1.40.0" - resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.40.0.tgz#81ad8c2bd7dd21b6a127ab4a26186a160f07a157" - integrity sha512-3Uc1kjmQ3SYuKziKghZvA23SihOqGxEjK2QPfFPmd7BMo9rWiJdC2FJWvAZbfhLWapuJrdmkUf6Kp0G4Wtuv5w== +sort-package-json@^1.49.0: + version "1.53.1" + resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.53.1.tgz#8f2672b06314cf04d9a6bcefc75a5f38d600b811" + integrity sha512-ltLORrQuuPMpy23YkWCA8fO7zBOxM4P1j9LcGxci4K2Fk8jmSyCA/ATU6CFyy8qR2HQRx4RBYWzoi78FU/Anuw== dependencies: detect-indent "^6.0.0" detect-newline "3.1.0" - git-hooks-list "1.0.2" - globby "10.0.1" + git-hooks-list "1.0.3" + globby "10.0.0" is-plain-obj "2.1.0" sort-object-keys "^1.1.3" @@ -14807,7 +14795,7 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" -source-map-support@^0.5.16, source-map-support@~0.5.10, source-map-support@~0.5.12: +source-map-support@^0.5.16, source-map-support@~0.5.12: version "0.5.16" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== @@ -14815,6 +14803,14 @@ source-map-support@^0.5.16, source-map-support@~0.5.10, source-map-support@~0.5. buffer-from "^1.0.0" source-map "^0.6.0" +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" @@ -14849,7 +14845,7 @@ source-map@~0.1.x: dependencies: amdefine ">=0.0.4" -source-map@~0.7.3: +source-map@~0.7.2, source-map@~0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== @@ -14874,14 +14870,6 @@ spawn-args@^0.2.0: resolved "https://registry.yarnpkg.com/spawn-args/-/spawn-args-0.2.0.tgz#fb7d0bd1d70fd4316bd9e3dec389e65f9d6361bb" integrity sha1-+30L0dcP1DFr2ePew4nmX51jYbs= -spawn-sync@^1.0.11, spawn-sync@^1.0.15: - version "1.0.15" - resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" - integrity sha1-sAeZVX63+wyDdsKdROih6mfldHY= - dependencies: - concat-stream "^1.4.7" - os-shim "^0.1.2" - spdx-correct@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" @@ -14972,7 +14960,7 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.5.0 < 2", statuses@~1.5.0: +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= @@ -15047,7 +15035,7 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0: +"string-width@^1.0.2 || 2", string-width@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -15152,6 +15140,13 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + strip-ansi@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" @@ -15193,13 +15188,6 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= - dependencies: - get-stdin "^4.0.1" - strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -15372,51 +15360,53 @@ tapable@^1.0.0, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -temp@0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" - integrity sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k= +temp@0.9.4: + version "0.9.4" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.9.4.tgz#cd20a8580cb63635d0e4e9d4bd989d44286e7620" + integrity sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA== dependencies: - os-tmpdir "^1.0.0" - rimraf "~2.2.6" + mkdirp "^0.5.1" + rimraf "~2.6.2" -terser-webpack-plugin@1.2.1, terser-webpack-plugin@^1.4.3: - version "1.2.1" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.1.tgz#7545da9ae5f4f9ae6a0ac961eb46f5e7c845cc26" - integrity sha512-GGSt+gbT0oKcMDmPx4SRSfJPE1XaN3kQRWG4ghxKQw9cn5G9x6aCKSsgYdvyM0na9NJ4Drv0RG6jbBByZ5CMjw== +terser-webpack-plugin@^1.4.3: + version "1.4.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== dependencies: - cacache "^11.0.2" - find-cache-dir "^2.0.0" + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" schema-utils "^1.0.0" - serialize-javascript "^1.4.0" + serialize-javascript "^4.0.0" source-map "^0.6.1" - terser "^3.8.1" - webpack-sources "^1.1.0" - worker-farm "^1.5.2" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" -terser@^3.8.1: - version "3.17.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2" - integrity sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ== +terser@^4.1.2: + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== dependencies: - commander "^2.19.0" + commander "^2.20.0" source-map "~0.6.1" - source-map-support "~0.5.10" + source-map-support "~0.5.12" -terser@^4.3.9: - version "4.6.7" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.7.tgz#478d7f9394ec1907f0e488c5f6a6a9a2bad55e72" - integrity sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g== +terser@^5.3.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" + integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== dependencies: commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" + source-map "~0.7.2" + source-map-support "~0.5.20" -testem@^2.9.2: - version "2.17.0" - resolved "https://registry.yarnpkg.com/testem/-/testem-2.17.0.tgz#1cb4a2a90524a088803dfe52fbf197a6fd73c883" - integrity sha512-PLkIlT523w5rTJPWwR4TL1EiAEa941ECV7d4pMqsB0YdnH+sCTz0loWMKCUSdhR+VijveAZ6anE/JHehE7KqMQ== +testem@^3.2.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/testem/-/testem-3.6.0.tgz#bf5c86944bafd035c18f41f520195cce5eef33a8" + integrity sha512-sXwx2IlOadOhrKf0hsV1Yt/yuYhdfrtJ4dpp7T6pFN62GjMyKifjAv2SFm+4zYHee1JwxheO7JUL0+3iN0rlHw== dependencies: + "@xmldom/xmldom" "^0.7.1" backbone "^1.1.2" bluebird "^3.4.6" charm "^1.0.0" @@ -15436,16 +15426,15 @@ testem@^2.9.2: lodash.uniqby "^4.7.0" mkdirp "^0.5.1" mustache "^3.0.0" - node-notifier "^5.0.1" + node-notifier "^9.0.1" npmlog "^4.0.0" - printf "^0.5.1" + printf "^0.6.1" rimraf "^2.4.4" - socket.io "^2.1.0" + socket.io "^4.1.2" spawn-args "^0.2.0" styled_string "0.0.1" tap-parser "^7.0.0" tmp "0.0.33" - xmldom "^0.1.19" tether@^1.4.0: version "1.4.7" @@ -15490,7 +15479,15 @@ through2@^3.0.0: dependencies: readable-stream "2 || 3" -through@^2.3.6, through@^2.3.8: +through2@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" + integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ== + dependencies: + inherits "^2.0.4" + readable-stream "2 || 3" + +through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -15525,15 +15522,15 @@ tiny-glob@0.2.9: globalyzer "0.1.0" globrex "^0.1.2" -tiny-lr@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.1.1.tgz#9fa547412f238fedb068ee295af8b682c98b2aab" - integrity sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA== +tiny-lr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-2.0.0.tgz#863659d7ce1ed201a117d8197d7f8b9a27bdc085" + integrity sha512-f6nh0VMRvhGx4KCeK1lQ/jaL0Zdb5WdR+Jk8q9OSUQnaSDxAEGH1fgqLZ+cMl5EW3F2MGnCsalBO1IsnnogW1Q== dependencies: body "^5.1.0" debug "^3.1.0" - faye-websocket "~0.10.0" - livereload-js "^2.3.0" + faye-websocket "^0.11.3" + livereload-js "^3.3.1" object-assign "^4.1.0" qs "^6.4.0" @@ -15556,12 +15553,12 @@ tmp@0.0.33, tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmp@^0.0.29: - version "0.0.29" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" - integrity sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA= +tmp@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" + integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== dependencies: - os-tmpdir "~1.0.1" + rimraf "^2.6.3" tmp@^0.2.1: version "0.2.1" @@ -15575,11 +15572,6 @@ tmpl@1.0.x: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== -to-array@0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" - integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= - to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -15702,10 +15694,16 @@ tree-sync@^1.2.2: quick-temp "^0.1.5" walk-sync "^0.3.3" -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= +tree-sync@^2.0.0, tree-sync@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tree-sync/-/tree-sync-2.1.0.tgz#31cbbd41f2936f5390b61e8c9d7cb27e75a212fe" + integrity sha512-OLWW+Nd99NOM53aZ8ilT/YpEiOo6mXD3F4/wLbARqybSZ3Jb8IxHK5UGVbZaae0wtXAyQshVV+SeqVBik+Fbmw== + dependencies: + debug "^4.1.1" + fs-tree-diff "^2.0.1" + mkdirp "^0.5.5" + quick-temp "^0.1.5" + walk-sync "^0.3.3" trim-right@^1.0.1: version "1.0.1" @@ -15776,6 +15774,13 @@ type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -15808,7 +15813,7 @@ unbox-primitive@^1.0.1: has-symbols "^1.0.2" which-boxed-primitive "^1.0.2" -underscore.string@~3.3.4: +underscore.string@^3.2.2, underscore.string@~3.3.4: version "3.3.5" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023" integrity sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg== @@ -15881,12 +15886,12 @@ unique-stream@^2.2.1: json-stable-stringify-without-jsonify "^1.0.1" through2-filter "^3.0.0" -unique-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== dependencies: - crypto-random-string "^1.0.0" + crypto-random-string "^2.0.0" universalify@^0.1.0, universalify@^0.1.2: version "0.1.2" @@ -15972,27 +15977,11 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -user-info@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/user-info/-/user-info-1.0.0.tgz#81c82b7ed63e674c2475667653413b3c76fde239" - integrity sha1-gcgrftY+Z0wkdWZ2U0E7PHb94jk= - dependencies: - os-homedir "^1.0.1" - passwd-user "^1.2.1" - username "^1.0.1" - username-sync@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/username-sync/-/username-sync-1.0.2.tgz#0a3697909fb7b5768d29e2921f573acfdd427592" integrity sha512-ayNkOJdoNSGNDBE46Nkc+l6IXmeugbzahZLSMkwvgRWv5y5ZqNY2IrzcgmkR4z32sj1W3tM3TuTUMqkqBzO+RA== -username@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/username/-/username-1.0.1.tgz#e1f72295e3e58e06f002c6327ce06897a99cd67f" - integrity sha1-4fcilePljgbwAsYyfOBol6mc1n8= - dependencies: - meow "^3.4.0" - utif@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/utif/-/utif-2.0.1.tgz#9e1582d9bbd20011a6588548ed3266298e711759" @@ -16039,6 +16028,11 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuid@^8.3.0, uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + v8-compile-cache@^2.0.3, v8-compile-cache@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" @@ -16067,7 +16061,7 @@ validate-peer-dependencies@^1.2.0: resolve-package-path "^3.1.0" semver "^7.3.2" -vary@~1.1.2: +vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= @@ -16166,24 +16160,15 @@ walker@~1.0.5: dependencies: makeerror "1.0.x" -watch-detector@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/watch-detector/-/watch-detector-0.1.0.tgz#e37b410d149e2a8bf263a4f8b71e2f667633dbf8" - integrity sha512-vfzMMfpjQc88xjETwl2HuE6PjEuxCBeyC4bQmqrHrofdfYWi/4mEJklYbNgSzpqM9PxubsiPIrE5SZ1FDyiQ2w== - dependencies: - heimdalljs-logger "^0.1.9" - quick-temp "^0.1.8" - rsvp "^4.7.0" - semver "^5.4.1" - silent-error "^1.1.0" - -watch@~0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" - integrity sha1-KAlUdsbffJDJYxOJkMClQj60uYY= +watch-detector@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/watch-detector/-/watch-detector-1.0.1.tgz#3106a6b489284ec2ecaef0e65cf1b8ec9117296e" + integrity sha512-8sJ8rvNfg2ciqCa5IxIdmdxU/vuUe9V/jw+thXbdreELSv3+Cq6k8K42cLEL86W2td1PMmfNCWZuAhrZ/sD4mw== dependencies: - exec-sh "^0.2.0" - minimist "^1.2.0" + heimdalljs-logger "^0.1.10" + semver "^6.3.0" + silent-error "^1.1.1" + tmp "^0.1.0" watchpack-chokidar2@^2.0.0: version "2.0.0" @@ -16235,7 +16220,7 @@ webidl-conversions@^7.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== -webpack-sources@^1.1.0, webpack-sources@^1.4.1: +webpack-sources@^1.4.0, webpack-sources@^1.4.1: version "1.4.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== @@ -16368,14 +16353,14 @@ which-module@^1.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= -which@^1.2.10, which@^1.2.9, which@^1.3.0: +which@^1.2.10, which@^1.2.14, which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -which@^2.0.1: +which@^2.0.1, which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== @@ -16394,17 +16379,17 @@ word-wrap@^1.2.3, word-wrap@~1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +wordwrap@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= + wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= - -worker-farm@^1.5.2: +worker-farm@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== @@ -16427,12 +16412,7 @@ workerpool@^3.1.1: object-assign "4.1.1" rsvp "^4.8.4" -workerpool@^5.0.1: - version "5.0.4" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-5.0.4.tgz#4f67cb70ff7550a27ab94de25b0b843cd92059a2" - integrity sha512-Sywova24Ow2NQ24JPB68bI89EdqMDjUXo4OpofK/QMD7C2ZVMloYBgQ5J3PChcBJHj2vspsmGx1/3nBKXtUkXQ== - -workerpool@^6.1.4: +workerpool@^6.0.0, workerpool@^6.1.4: version "6.1.5" resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.5.tgz#0f7cf076b6215fd7e1da903ff6f22ddd1886b581" integrity sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw== @@ -16469,16 +16449,17 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write-file-atomic@^2.0.0: - version "2.4.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" - integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== dependencies: - graceful-fs "^4.1.11" imurmurhash "^0.1.4" + is-typedarray "^1.0.0" signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" -ws@^7.4.4, ws@~7.4.2: +ws@^7.4.4: version "7.4.6" resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== @@ -16488,10 +16469,15 @@ ws@^8.2.3: resolved "https://registry.yarnpkg.com/ws/-/ws-8.3.0.tgz#7185e252c8973a60d57170175ff55fdbd116070d" integrity sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw== -xdg-basedir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" - integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= +ws@~8.2.3: + version "8.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" + integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== + +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== xhr@^2.0.1: version "2.5.0" @@ -16541,16 +16527,6 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xmldom@^0.1.19: - version "0.1.31" - resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" - integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== - -xmlhttprequest-ssl@~1.5.4: - version "1.5.5" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" - integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= - xtend@^4.0.0, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -16586,10 +16562,10 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yam@^0.0.24: - version "0.0.24" - resolved "https://registry.yarnpkg.com/yam/-/yam-0.0.24.tgz#11e9630444735f66a561d29221407de6d037cd95" - integrity sha512-llPF60oFLV8EQimNPR6+KorSaj59L32C4c1db4cr72GaWVWapnhTS2VZeK2K2xLyEOveWtRcNa+dLJBW7EfhYQ== +yam@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yam/-/yam-1.0.0.tgz#7f6c91dc0f5de75a031e6da6b3907c3d25ab0de5" + integrity sha512-Hv9xxHtsJ9228wNhk03xnlDReUuWVvHwM4rIbjdAXYvHLs17xjuyF50N6XXFMN6N0omBaqgOok/MCK3At9fTAg== dependencies: fs-extra "^4.0.2" lodash.merge "^4.6.0" @@ -16646,11 +16622,6 @@ yauzl@^2.10.0: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" -yeast@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" - integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= - yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From 74dfc36ce5506abdafe1f24d0a1406c86f1317ea Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Mon, 13 Dec 2021 22:00:03 -0500 Subject: [PATCH 861/879] Add 3.16 LTS scenario to test matrix --- .github/workflows/ci.yml | 1 + config/ember-try.js | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 286b8393f..e7345ccde 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -57,6 +57,7 @@ jobs: fail-fast: false matrix: try-scenario: + - ember-lts-3.16 - ember-lts-3.20 - ember-lts-3.24 - ember-lts-3.28 diff --git a/config/ember-try.js b/config/ember-try.js index 1e83df0aa..9767b93f0 100644 --- a/config/ember-try.js +++ b/config/ember-try.js @@ -7,6 +7,14 @@ module.exports = async function () { return { useYarn: true, scenarios: [ + { + name: 'ember-lts-3.16', + npm: { + devDependencies: { + 'ember-source': '~3.16.10', + }, + }, + }, { name: 'ember-lts-3.20', npm: { From 89d8dfcf25178846bcfafdf5e175e9e305d0ff50 Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Mon, 13 Dec 2021 22:15:52 -0500 Subject: [PATCH 862/879] Add 3.12 LTS scenario to test matrix --- .github/workflows/ci.yml | 1 + config/ember-try.js | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e7345ccde..064f0cc3f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -57,6 +57,7 @@ jobs: fail-fast: false matrix: try-scenario: + - ember-lts-3.12 - ember-lts-3.16 - ember-lts-3.20 - ember-lts-3.24 diff --git a/config/ember-try.js b/config/ember-try.js index 9767b93f0..a20ec6369 100644 --- a/config/ember-try.js +++ b/config/ember-try.js @@ -7,10 +7,20 @@ module.exports = async function () { return { useYarn: true, scenarios: [ + { + name: 'ember-lts-3.12', + npm: { + devDependencies: { + 'ember-cli': '~3.12.1', + 'ember-source': '~3.12.4', + }, + }, + }, { name: 'ember-lts-3.16', npm: { devDependencies: { + 'ember-cli': '~3.16.2', 'ember-source': '~3.16.10', }, }, @@ -19,6 +29,7 @@ module.exports = async function () { name: 'ember-lts-3.20', npm: { devDependencies: { + 'ember-cli': '~3.20.2', 'ember-source': '~3.20.5', }, }, From 73731c268b34a93365e58246fa129d1744eacfdf Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Sun, 12 Dec 2021 23:44:43 -0500 Subject: [PATCH 863/879] Add prettier per latest addon blueprint --- .eslintrc.js | 1 + .prettierignore | 22 ++++ .prettierrc.js | 5 + addon-test-support/index.js | 6 +- addon-test-support/setup-mirage.js | 12 +- addon/assert.js | 2 +- addon/deprecate-imports.js | 9 +- addon/ember-data.js | 113 ++++++++++-------- addon/factory.js | 2 +- addon/identity-manager.js | 2 +- addon/index.js | 5 +- .../ember-cli-mirage-autostart.js | 7 +- addon/orm/associations/belongs-to.js | 2 +- addon/response.js | 2 +- addon/serializers/ember-data-serializer.js | 91 ++++++++------ addon/server.js | 14 ++- addon/start-mirage.js | 33 +++-- addon/utils/ember-data.js | 4 +- addon/utils/inflector.js | 2 +- addon/utils/read-modules.js | 74 +++++++----- app/initializers/ember-cli-mirage.js | 16 ++- blueprints/ember-cli-mirage/index.js | 24 ++-- blueprints/mirage-factory/index.js | 13 +- blueprints/mirage-fixture/index.js | 14 ++- blueprints/mirage-identity-manager/index.js | 13 +- blueprints/mirage-model/index.js | 11 +- blueprints/mirage-serializer/index.js | 11 +- config/addon-docs.js | 1 - config/deploy.js | 20 ++-- config/ember-try.js | 6 +- config/environment.js | 12 +- ember-cli-build.js | 18 +-- index.js | 65 ++++++---- package.json | 3 + .../app/controllers/application.js | 22 ++-- test-projects/01-basic-app/app/models/book.js | 2 - test-projects/01-basic-app/app/models/user.js | 2 - .../app/pods/crud-demo/controller.js | 8 +- .../01-basic-app/app/pods/crud-demo/route.js | 1 - .../app/pods/module-count/controller.js | 22 ++-- test-projects/01-basic-app/app/router.js | 2 +- .../01-basic-app/config/environment.js | 2 +- test-projects/01-basic-app/ember-cli-build.js | 4 +- .../fastboot-tests/included-files-test.js | 108 ++++++++++------- test-projects/01-basic-app/mirage/config.js | 4 +- .../mirage/factories/nested/thing.js | 2 +- .../01-basic-app/mirage/factories/user.js | 4 +- .../01-basic-app/mirage/fixtures/countries.js | 4 +- .../mirage/fixtures/nested/things.js | 4 +- .../01-basic-app/mirage/fixtures/users.js | 6 +- .../mirage/identity-managers/book.js | 6 +- .../mirage/identity-managers/nested/thing.js | 6 +- .../mirage/models/nested/thing.js | 3 +- .../01-basic-app/mirage/scenarios/default.js | 4 +- .../mirage/serializers/nested/thing.js | 7 +- .../tests/acceptance/crud-demo-test.js | 40 ++++--- .../tests/acceptance/ember-data-test.js | 73 +++++++---- .../tests/acceptance/faker-test.js | 5 +- .../tests/acceptance/fixtures-test.js | 16 +-- .../tests/acceptance/identity-manager-test.js | 12 +- .../acceptance/legacy-start-mirage-test.js | 12 +- .../tests/acceptance/request-tracking-test.js | 36 ++++-- .../tests/acceptance/start-mirage-test.js | 51 +++++--- .../01-basic-app/tests/helpers/destroy-app.js | 2 +- .../tests/helpers/module-for-acceptance.js | 7 +- .../tests/helpers/promise-ajax.js | 4 +- .../01-basic-app/tests/helpers/resolver.js | 2 +- .../app/controllers/application.js | 22 ++-- .../app/services/wifi.js | 2 - .../mirage/config.js | 3 +- .../tests/acceptance/modules-test.js | 10 +- .../acceptance/pre-mirage-initializer-test.js | 8 +- .../tests/helpers/destroy-app.js | 2 +- .../tests/helpers/module-for-acceptance.js | 7 +- .../tests/helpers/promise-ajax.js | 4 +- .../tests/helpers/resolver.js | 2 +- tests/acceptance/home-test.js | 14 +-- tests/dummy/app/adapters/post.js | 66 +++++----- .../app/initializers/es2015-polyfills.js | 31 +++-- tests/dummy/app/models/comment.js | 4 +- tests/dummy/app/models/post.js | 10 +- tests/dummy/app/models/user.js | 2 - tests/dummy/app/pods/application/route.js | 23 ++-- tests/dummy/app/pods/blog/detail/route.js | 2 - tests/dummy/app/pods/blog/index/route.js | 2 - tests/dummy/app/pods/docs/index/route.js | 2 - tests/dummy/app/pods/not-found/route.js | 53 ++++---- tests/dummy/app/router.js | 22 ++-- tests/dummy/app/serializers/address.js | 2 +- tests/dummy/app/serializers/application.js | 8 +- tests/dummy/app/serializers/word-smith.js | 8 +- tests/dummy/config/environment.js | 2 +- tests/dummy/mirage/config.js | 10 +- tests/dummy/mirage/scenarios/default.js | 2 +- .../environment-development-disabled.js | 9 +- .../config/environment-production-enabled.js | 9 +- .../config/environment-test-disabled.js | 9 +- tests/helpers/destroy-app.js | 2 +- tests/helpers/module-for-acceptance.js | 7 +- tests/helpers/promise-ajax.js | 4 +- tests/helpers/resolver.js | 2 +- tests/unit/inflector-test.js | 8 +- .../ember-data-serializer-discover-test.js | 11 +- .../serializers/ember-data-serializer-test.js | 109 ++++++++--------- yarn.lock | 29 +++++ 105 files changed, 952 insertions(+), 688 deletions(-) create mode 100644 .prettierignore create mode 100644 .prettierrc.js diff --git a/.eslintrc.js b/.eslintrc.js index 4a2a174ea..aefaed885 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -14,6 +14,7 @@ module.exports = { extends: [ 'eslint:recommended', 'plugin:ember/recommended', + 'plugin:prettier/recommended', ], env: { browser: true, diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..0eb446e29 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,22 @@ +# unconventional js +/blueprints/*/files/ +/vendor/ + +# compiled output +/dist/ +/tmp/ + +# dependencies +/bower_components/ +/node_modules/ +/test-projects/*/node_modules/ + +# misc +/coverage/ +!.* +.eslintcache + +# ember-try +/.node_modules.ember-try/ +/bower.json.ember-try +/package.json.ember-try diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 000000000..534e6d35a --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = { + singleQuote: true, +}; diff --git a/addon-test-support/index.js b/addon-test-support/index.js index 9642b44dc..2a7030e54 100644 --- a/addon-test-support/index.js +++ b/addon-test-support/index.js @@ -4,6 +4,8 @@ export { setupMirage }; import { dependencySatisfies } from '@embroider/macros'; if (dependencySatisfies('ember-qunit', '*')) { - window.QUnit.config.urlConfig.push({ id: 'mirageLogging', label: 'Mirage logging', }); + window.QUnit.config.urlConfig.push({ + id: 'mirageLogging', + label: 'Mirage logging', + }); } - diff --git a/addon-test-support/setup-mirage.js b/addon-test-support/setup-mirage.js index ec43fa620..aef8bfdb3 100644 --- a/addon-test-support/setup-mirage.js +++ b/addon-test-support/setup-mirage.js @@ -11,17 +11,19 @@ import { settled } from '@ember/test-helpers'; @hide */ export default function setupMirage(hooks = self) { - hooks.beforeEach(function() { + hooks.beforeEach(function () { if (!this.owner) { - throw new Error('You must call one of the ember-qunit setupTest(),' - + ' setupRenderingTest() or setupApplicationTest() methods before' - + ' calling setupMirage()'); + throw new Error( + 'You must call one of the ember-qunit setupTest(),' + + ' setupRenderingTest() or setupApplicationTest() methods before' + + ' calling setupMirage()' + ); } this.server = startMirage(this.owner); }); - hooks.afterEach(function() { + hooks.afterEach(function () { return settled().then(() => { if (this.server) { this.server.shutdown(); diff --git a/addon/assert.js b/addon/assert.js index 60ea7a59e..24f68a498 100644 --- a/addon/assert.js +++ b/addon/assert.js @@ -1 +1 @@ -export { _assert as default } from "miragejs"; +export { _assert as default } from 'miragejs'; diff --git a/addon/deprecate-imports.js b/addon/deprecate-imports.js index 91f8b39af..f481d60bf 100644 --- a/addon/deprecate-imports.js +++ b/addon/deprecate-imports.js @@ -4,13 +4,14 @@ import * as mirage from 'miragejs'; const nonDeprecatedImports = ['default']; -export function initDeprecatedImports () { +export function initDeprecatedImports() { Object.entries(mirage).forEach(([name, value]) => { if (!nonDeprecatedImports.includes(name)) { // eslint-disable-next-line no-import-assign Object.defineProperty(ecMirageExports, name, { - get () { - const message = `Importing '${name}' from 'ember-cli-mirage' is deprecated.` + + get() { + const message = + `Importing '${name}' from 'ember-cli-mirage' is deprecated.` + ` Install the \`miragejs\` package and use ` + `\`import { ${name} } from 'miragejs';\` instead.`; @@ -20,7 +21,7 @@ export function initDeprecatedImports () { for: 'ember-cli-mirage', since: { enabled: '2.3.0', - } + }, }); return value; diff --git a/addon/ember-data.js b/addon/ember-data.js index 6d9b19f32..89f9e5bb2 100644 --- a/addon/ember-data.js +++ b/addon/ember-data.js @@ -5,17 +5,14 @@ import config from 'ember-get-config'; import assert from './assert'; import { hasEmberData, isDsModel } from 'ember-cli-mirage/utils/ember-data'; import { Model, belongsTo, hasMany } from 'miragejs'; -import EmberDataSerializer from "ember-cli-mirage/serializers/ember-data-serializer"; +import EmberDataSerializer from 'ember-cli-mirage/serializers/ember-data-serializer'; import { camelize } from './utils/inflector'; -const { - modulePrefix, - podModulePrefix -} = config; +const { modulePrefix, podModulePrefix } = config; // Caches let DsModels, Models; -let DsSerializers, Serializers +let DsSerializers, Serializers; /** * Get all ember data models under the app's namespaces @@ -32,7 +29,10 @@ export function getDsModels() { let moduleMap = requirejs.entries; let classicModelMatchRegex = new RegExp(`^${modulePrefix}/models/(.*)$`, 'i'); - let podModelMatchRegex = new RegExp(`^${podModulePrefix || modulePrefix}/(.*)/model$`, 'i'); + let podModelMatchRegex = new RegExp( + `^${podModulePrefix || modulePrefix}/(.*)/model$`, + 'i' + ); DsModels = {}; @@ -40,18 +40,18 @@ export function getDsModels() { return DsModels; } - Object.keys(moduleMap) - .forEach((path) => { - let matches = path.match(classicModelMatchRegex) || path.match(podModelMatchRegex); - if (matches && matches[1]) { - let modelName = matches[1]; + Object.keys(moduleMap).forEach((path) => { + let matches = + path.match(classicModelMatchRegex) || path.match(podModelMatchRegex); + if (matches && matches[1]) { + let modelName = matches[1]; - let model = require(path, null, null, true).default; - if (isDsModel(model)) { - DsModels[modelName] = model; - } + let model = require(path, null, null, true).default; + if (isDsModel(model)) { + DsModels[modelName] = model; } - }); + } + }); return DsModels; } @@ -70,7 +70,7 @@ export function discoverEmberDataModels() { let emberDataModels = getDsModels(); Models = {}; - Object.keys(emberDataModels).forEach(modelName => { + Object.keys(emberDataModels).forEach((modelName) => { let model = emberDataModels[modelName]; let attrs = {}; @@ -117,26 +117,33 @@ export function getDsSerializers() { } let moduleMap = requirejs.entries; - let classicSerializerMatchRegex = new RegExp(`^${modulePrefix}/serializers/(.*)$`, 'i'); - let podSerializerMatchRegex = new RegExp(`^${podModulePrefix || modulePrefix}/(.*)/serializer$`, 'i'); + let classicSerializerMatchRegex = new RegExp( + `^${modulePrefix}/serializers/(.*)$`, + 'i' + ); + let podSerializerMatchRegex = new RegExp( + `^${podModulePrefix || modulePrefix}/(.*)/serializer$`, + 'i' + ); - DsSerializers = {} + DsSerializers = {}; if (!hasEmberData) { return DsSerializers; } - Object.keys(moduleMap) - .forEach((path) => { - let matches = path.match(classicSerializerMatchRegex) || path.match(podSerializerMatchRegex); - if (matches && matches[1]) { - let serializerName = matches[1]; + Object.keys(moduleMap).forEach((path) => { + let matches = + path.match(classicSerializerMatchRegex) || + path.match(podSerializerMatchRegex); + if (matches && matches[1]) { + let serializerName = matches[1]; - let serializer = require(path, null, null, true).default; - // in mirage, registering models takes care of camelize, serializers do not - DsSerializers[camelize(serializerName)] = serializer; - } - }); + let serializer = require(path, null, null, true).default; + // in mirage, registering models takes care of camelize, serializers do not + DsSerializers[camelize(serializerName)] = serializer; + } + }); return DsSerializers; } @@ -159,34 +166,43 @@ export function applyEmberDataSerializers(mirageSerializers = {}) { // so if there are any mirage serializers with no ED counterpart, they are in the list Serializers = mirageSerializers; - Object.keys(emberDataSerializers).forEach(serializerName => { + Object.keys(emberDataSerializers).forEach((serializerName) => { let dsSerializer = emberDataSerializers[serializerName]; // Seems I have to create it to get access to some of the properties - dsSerializer = dsSerializer.create ? dsSerializer.create() : new dsSerializer; + dsSerializer = dsSerializer.create + ? dsSerializer.create() + : new dsSerializer(); let transforms; let primaryKey = dsSerializer.primaryKey; let attrs = dsSerializer.attrs; if (primaryKey || attrs) { - - let Serializer = mirageSerializers[serializerName] || mirageSerializers.application || EmberDataSerializer; + let Serializer = + mirageSerializers[serializerName] || + mirageSerializers.application || + EmberDataSerializer; if (attrs) { - let serializer = Serializer.create ? Serializer.create() : new Serializer; + let serializer = Serializer.create + ? Serializer.create() + : new Serializer(); transforms = serializer.transforms || {}; - Object.keys(attrs).forEach(key => { + Object.keys(attrs).forEach((key) => { let transform = attrs[key]; - let serializerTransform = serializer.transforms ? serializer.transforms[key] : {}; - let resolvedTransform = typeof attrs[key] === 'string' - ? { - key: attrs[key] - } - : { - key: attrs[key].key, - }; + let serializerTransform = serializer.transforms + ? serializer.transforms[key] + : {}; + let resolvedTransform = + typeof attrs[key] === 'string' + ? { + key: attrs[key], + } + : { + key: attrs[key].key, + }; if (transform.serialize !== undefined) { resolvedTransform.deserialize = transform.serialize; @@ -196,13 +212,16 @@ export function applyEmberDataSerializers(mirageSerializers = {}) { resolvedTransform.serialize = transform.deserialize; } - transforms[key] = Object.assign(resolvedTransform, serializerTransform); + transforms[key] = Object.assign( + resolvedTransform, + serializerTransform + ); }); } Serializers[serializerName] = Serializer.extend({ primaryKey, - transforms + transforms, }); } }); diff --git a/addon/factory.js b/addon/factory.js index 176972f75..3e1784581 100644 --- a/addon/factory.js +++ b/addon/factory.js @@ -1 +1 @@ -export { Factory as default } from "miragejs"; +export { Factory as default } from 'miragejs'; diff --git a/addon/identity-manager.js b/addon/identity-manager.js index e5d0f06ca..3d26e05f7 100644 --- a/addon/identity-manager.js +++ b/addon/identity-manager.js @@ -1 +1 @@ -export { IdentityManager as default } from "miragejs"; +export { IdentityManager as default } from 'miragejs'; diff --git a/addon/index.js b/addon/index.js index 83147f048..c197e1817 100644 --- a/addon/index.js +++ b/addon/index.js @@ -1,5 +1,8 @@ export { default } from 'miragejs'; -export { discoverEmberDataModels, applyEmberDataSerializers } from './ember-data'; +export { + discoverEmberDataModels, + applyEmberDataSerializers, +} from './ember-data'; export { default as EmberDataSerializer } from 'ember-cli-mirage/serializers/ember-data-serializer'; import { initDeprecatedImports } from './deprecate-imports'; diff --git a/addon/instance-initializers/ember-cli-mirage-autostart.js b/addon/instance-initializers/ember-cli-mirage-autostart.js index 10af9e738..0e18fa9a8 100644 --- a/addon/instance-initializers/ember-cli-mirage-autostart.js +++ b/addon/instance-initializers/ember-cli-mirage-autostart.js @@ -15,9 +15,8 @@ import startMirage from '../start-mirage'; export function initialize(appInstance) { let testContext = getRfc232TestContext(); if (testContext) { - let { - 'ember-cli-mirage': { autostart } = {} - } = appInstance.resolveRegistration('config:environment'); + let { 'ember-cli-mirage': { autostart } = {} } = + appInstance.resolveRegistration('config:environment'); if (autostart) { testContext.server = startMirage(appInstance); @@ -32,5 +31,5 @@ export function initialize(appInstance) { } export default { - initialize + initialize, }; diff --git a/addon/orm/associations/belongs-to.js b/addon/orm/associations/belongs-to.js index 8bafa4831..e75aa4735 100644 --- a/addon/orm/associations/belongs-to.js +++ b/addon/orm/associations/belongs-to.js @@ -1 +1 @@ -export {_ormAssociationsBelongsTo as default } from 'miragejs'; +export { _ormAssociationsBelongsTo as default } from 'miragejs'; diff --git a/addon/response.js b/addon/response.js index f6d034e89..8cd715699 100644 --- a/addon/response.js +++ b/addon/response.js @@ -1 +1 @@ -export { Response as default } from "miragejs"; +export { Response as default } from 'miragejs'; diff --git a/addon/serializers/ember-data-serializer.js b/addon/serializers/ember-data-serializer.js index 0bc2fb704..ccf7756c3 100644 --- a/addon/serializers/ember-data-serializer.js +++ b/addon/serializers/ember-data-serializer.js @@ -1,9 +1,10 @@ -import { RestSerializer, +import { + RestSerializer, _utilsInflectorCamelize as camelize, _utilsInflectorDasherize as dasherize, } from 'miragejs'; -import {isFunction} from "lodash-es"; -import {get} from "@ember/object"; +import { isFunction } from 'lodash-es'; +import { get } from '@ember/object'; /** * This serializer does not use following mirage properties to control how things are serialized @@ -34,7 +35,7 @@ let EmberDataSerializer = RestSerializer.extend({ * The property name for the primary key for mirage and ember data is normally `id`. This allows you * to specify what that property name should be in the JSON. */ - primaryKey: "id", + primaryKey: 'id', /** * Transforms follow the format of ember data serializer attrs as follows @@ -79,8 +80,8 @@ let EmberDataSerializer = RestSerializer.extend({ if (!this._resolvedTransforms) { this._resolvedTransforms = { serialize: {}, - normalize: {} - } + normalize: {}, + }; } return this._resolvedTransforms; @@ -90,13 +91,14 @@ let EmberDataSerializer = RestSerializer.extend({ let resolvedTransforms = this.getResolvedTransforms(); let transforms = this.getTransforms(); - if ( ! resolvedTransforms.serialize[key]) { - let transform = typeof transforms[key] === 'string' - ? {key: transforms[key]} - : Object.assign({}, transforms[key]); + if (!resolvedTransforms.serialize[key]) { + let transform = + typeof transforms[key] === 'string' + ? { key: transforms[key] } + : Object.assign({}, transforms[key]); resolvedTransforms.serialize[key] = Object.assign( - {key: key, serialize: 'ids', deserialize: 'ids'}, + { key: key, serialize: 'ids', deserialize: 'ids' }, transform ); } @@ -107,20 +109,16 @@ let EmberDataSerializer = RestSerializer.extend({ getTransformForNormalize(key) { let resolvedTransforms = this.getResolvedTransforms(); - if ( ! resolvedTransforms.normalize[key]) { + if (!resolvedTransforms.normalize[key]) { let transforms = this.getTransforms(); let foundKey; - let foundTransform = Object.keys(transforms).find(item => { + let foundTransform = Object.keys(transforms).find((item) => { foundKey = item; return transforms[item].key === key; }); let transform = foundTransform - ? Object.assign( - {}, - transforms[foundKey], - { key: foundKey } - ) - : {key: key, serialize: 'ids', deserialize: 'ids'}; + ? Object.assign({}, transforms[foundKey], { key: foundKey }) + : { key: key, serialize: 'ids', deserialize: 'ids' }; resolvedTransforms.normalize[key] = transform; } @@ -137,7 +135,6 @@ let EmberDataSerializer = RestSerializer.extend({ * @private */ _hashForModel(model, removeForeignKeys, didSerialize = {}) { - let attrs = this._attrsForModel(model); let newDidSerialize = Object.assign({}, didSerialize); @@ -152,12 +149,16 @@ let EmberDataSerializer = RestSerializer.extend({ let serializeOption = transform.serialize; - if (associatedResource && - get(newDidSerialize, `${associatedResource.modelName}.${associatedResource.id}`) + if ( + associatedResource && + get( + newDidSerialize, + `${associatedResource.modelName}.${associatedResource.id}` + ) ) { // force it to IDS if we already have serialized it to prevent recursion // TODO: However is the end system wants records, we need to send records, so this really should be do records, dont resurse - serializeOption ='ids'; + serializeOption = 'ids'; } if (serializeOption === 'records') { @@ -167,19 +168,21 @@ let EmberDataSerializer = RestSerializer.extend({ newDidSerialize, true ); - let formattedKey = this._keyForProperty(key) || - this.isCollection(associatedResource) + let formattedKey = + this._keyForProperty(key) || this.isCollection(associatedResource) ? this.keyForRelationship(key) : this.keyForEmbeddedRelationship(key); attrs[formattedKey] = associatedResourceHash; } else { - let formattedKey = this._keyForProperty(key) || - this.keyForRelationshipIds(key); + let formattedKey = + this._keyForProperty(key) || this.keyForRelationshipIds(key); if (this.isCollection(associatedResource)) { - attrs[formattedKey] = model[`${this._container.inflector.singularize(key)}Ids`]; + attrs[formattedKey] = + model[`${this._container.inflector.singularize(key)}Ids`]; } else { - attrs[formattedKey] = model[`${this._container.inflector.singularize(key)}Id`]; + attrs[formattedKey] = + model[`${this._container.inflector.singularize(key)}Id`]; } } } @@ -195,27 +198,42 @@ let EmberDataSerializer = RestSerializer.extend({ }, keyForAttribute(attr) { - if (attr === "id") { + if (attr === 'id') { return this.keyForId(); } - return this._keyForProperty(attr) || RestSerializer.prototype.keyForAttribute.apply(this, arguments); + return ( + this._keyForProperty(attr) || + RestSerializer.prototype.keyForAttribute.apply(this, arguments) + ); }, keyForRelationship(type) { - return this._keyForProperty(type) || RestSerializer.prototype.keyForRelationship.apply(this, arguments); + return ( + this._keyForProperty(type) || + RestSerializer.prototype.keyForRelationship.apply(this, arguments) + ); }, keyForEmbeddedRelationship(attributeName) { - return this._keyForProperty(attributeName) || RestSerializer.prototype.keyForEmbeddedRelationship.apply(this, arguments); + return ( + this._keyForProperty(attributeName) || + RestSerializer.prototype.keyForEmbeddedRelationship.apply(this, arguments) + ); }, keyForRelationshipIds(type) { - return this._keyForProperty(type) || RestSerializer.prototype.keyForRelationshipIds.apply(this, arguments); + return ( + this._keyForProperty(type) || + RestSerializer.prototype.keyForRelationshipIds.apply(this, arguments) + ); }, keyForForeignKey(relationshipName) { - return this._keyForProperty(relationshipName) || RestSerializer.prototype.keyForForeignKey.apply(this, arguments); + return ( + this._keyForProperty(relationshipName) || + RestSerializer.prototype.keyForForeignKey.apply(this, arguments) + ); }, normalize(payload) { @@ -247,7 +265,7 @@ let EmberDataSerializer = RestSerializer.extend({ let relationships = {}; - Object.keys(attrs).forEach(attrKey => { + Object.keys(attrs).forEach((attrKey) => { if (attrKey !== this.primaryKey) { let transform = this.getTransformForNormalize(attrKey); let key = transform.key || attrKey; @@ -286,7 +304,6 @@ let EmberDataSerializer = RestSerializer.extend({ return jsonApiPayload; }, - }); export default EmberDataSerializer; diff --git a/addon/server.js b/addon/server.js index 6ba1b9433..958e6af9e 100644 --- a/addon/server.js +++ b/addon/server.js @@ -8,19 +8,23 @@ export { defaultPassthroughs } from 'miragejs'; @hide */ export default class EmberServer extends Server { - constructor(options) { // Merge models from autogenerated Ember Data models with user defined models if (hasEmberData && options.discoverEmberDataModels) { - options.models = Object.assign({}, discoverEmberDataModels(), options.models); + options.models = Object.assign( + {}, + discoverEmberDataModels(), + options.models + ); } super(options); - - if (typeof location !== 'undefined' && location.search.indexOf('mirageLogging') !== -1) { + if ( + typeof location !== 'undefined' && + location.search.indexOf('mirageLogging') !== -1 + ) { this.logging = true; } } - } diff --git a/addon/start-mirage.js b/addon/start-mirage.js index dae61cda5..610d1e0a1 100644 --- a/addon/start-mirage.js +++ b/addon/start-mirage.js @@ -17,7 +17,10 @@ import { deprecate } from '@ember/debug'; @hide */ -export default function startMirage(owner, { env, baseConfig, testConfig, makeServer } = {}) { +export default function startMirage( + owner, + { env, baseConfig, testConfig, makeServer } = {} +) { if (!env || !baseConfig) { if (!owner) { throw new Error('You must pass `owner` to startMirage()'); @@ -31,14 +34,15 @@ export default function startMirage(owner, { env, baseConfig, testConfig, makeSe } // Deprecate exporting makeServer as NOT the default function - deprecate("Do not export the makeServer function. Please make the makeServer function the default exported function", + deprecate( + 'Do not export the makeServer function. Please make the makeServer function the default exported function', makeServer === undefined, { id: 'ember-cli-mirage-config-makeserver-export', for: 'ember-cli-mirage', since: '2.3.0', until: '3.0.0', - url: 'https://www.ember-cli-mirage.com/docs/advanced/server-configuration' + url: 'https://www.ember-cli-mirage.com/docs/advanced/server-configuration', } ); @@ -58,24 +62,27 @@ export default function startMirage(owner, { env, baseConfig, testConfig, makeSe let mirageEnvironment = env['ember-cli-mirage'] || {}; let discoverEmberDataModels = mirageEnvironment.discoverEmberDataModels; - if (discoverEmberDataModels === undefined) { discoverEmberDataModels = true; } + if (discoverEmberDataModels === undefined) { + discoverEmberDataModels = true; + } let modules = readModules(env.modulePrefix); - let options = Object.assign(modules, - { - environment, - routes, - testConfig, - discoverEmberDataModels - } - ); + let options = Object.assign(modules, { + environment, + routes, + testConfig, + discoverEmberDataModels, + }); options.trackRequests = mirageEnvironment.trackRequests; options.inflector = { singularize, pluralize }; let server; if (makeServer) { server = makeServer(options); - if (typeof location !== 'undefined' && location.search.indexOf('mirageLogging') !== -1) { + if ( + typeof location !== 'undefined' && + location.search.indexOf('mirageLogging') !== -1 + ) { server.logging = true; } } else { diff --git a/addon/utils/ember-data.js b/addon/utils/ember-data.js index aacfca3b3..277a58319 100644 --- a/addon/utils/ember-data.js +++ b/addon/utils/ember-data.js @@ -4,7 +4,9 @@ function _hasEmberData() { let matchRegex1 = /^ember-data/i; let matchRegex2 = /^@ember-data/i; - return !!(Object.keys(requirejs.entries).find(e => !!e.match(matchRegex2) || !!e.match(matchRegex1) )); + return !!Object.keys(requirejs.entries).find( + (e) => !!e.match(matchRegex2) || !!e.match(matchRegex1) + ); } /** diff --git a/addon/utils/inflector.js b/addon/utils/inflector.js index b36902ab8..7a15c098a 100644 --- a/addon/utils/inflector.js +++ b/addon/utils/inflector.js @@ -2,7 +2,7 @@ export { _utilsInflectorCamelize as camelize, _utilsInflectorDasherize as dasherize, _utilsInflectorUnderscore as underscore, - _utilsInflectorCapitalize as capitalize + _utilsInflectorCapitalize as capitalize, } from 'miragejs'; /* diff --git a/addon/utils/read-modules.js b/addon/utils/read-modules.js index 797b295e2..b9ceb4fce 100644 --- a/addon/utils/read-modules.js +++ b/addon/utils/read-modules.js @@ -13,46 +13,60 @@ import require from 'require'; @hide */ -export default function(prefix) { - let modules = ['factories', 'fixtures', 'scenarios', 'models', 'serializers', 'identity-managers']; - let mirageModuleRegExp = new RegExp(`^${prefix}/mirage/(${modules.join('|')})`); +export default function (prefix) { + let modules = [ + 'factories', + 'fixtures', + 'scenarios', + 'models', + 'serializers', + 'identity-managers', + ]; + let mirageModuleRegExp = new RegExp( + `^${prefix}/mirage/(${modules.join('|')})` + ); let modulesMap = modules.reduce((memo, name) => { memo[camelize(name)] = {}; return memo; }, {}); - Object.keys(requirejs.entries).filter(function(key) { - return mirageModuleRegExp.test(key); - }).forEach(function(moduleName) { - if (moduleName.match('.jshint')) { // ignore autogenerated .jshint files - return; - } - let moduleParts = moduleName.split('/'); - let moduleTypeIndex = moduleParts.indexOf('mirage') + 1; - let moduleType = camelize(moduleParts[moduleTypeIndex]); - let moduleKey = moduleParts.slice([moduleTypeIndex + 1]).join('/'); - - if (moduleType === 'scenario') { - assert('Only scenario/default.js is supported at this time.', - moduleKey !== 'default'); - } - - /* + Object.keys(requirejs.entries) + .filter(function (key) { + return mirageModuleRegExp.test(key); + }) + .forEach(function (moduleName) { + if (moduleName.match('.jshint')) { + // ignore autogenerated .jshint files + return; + } + let moduleParts = moduleName.split('/'); + let moduleTypeIndex = moduleParts.indexOf('mirage') + 1; + let moduleType = camelize(moduleParts[moduleTypeIndex]); + let moduleKey = moduleParts.slice([moduleTypeIndex + 1]).join('/'); + + if (moduleType === 'scenario') { + assert( + 'Only scenario/default.js is supported at this time.', + moduleKey !== 'default' + ); + } + + /* Ensure fixture keys are pluralized */ - if (moduleType === 'fixtures') { - moduleKey = pluralize(moduleKey); - } + if (moduleType === 'fixtures') { + moduleKey = pluralize(moduleKey); + } - let module = require(moduleName, null, null, true); - if (!module) { - throw new Error(`${moduleName} must export a ${moduleType}`); - } + let module = require(moduleName, null, null, true); + if (!module) { + throw new Error(`${moduleName} must export a ${moduleType}`); + } - let data = module.default; + let data = module.default; - modulesMap[moduleType][camelize(moduleKey)] = data; - }); + modulesMap[moduleType][camelize(moduleKey)] = data; + }); return modulesMap; } diff --git a/app/initializers/ember-cli-mirage.js b/app/initializers/ember-cli-mirage.js index 38aedc41f..2e6ff32e5 100644 --- a/app/initializers/ember-cli-mirage.js +++ b/app/initializers/ember-cli-mirage.js @@ -17,24 +17,30 @@ export default { name: 'ember-cli-mirage', initialize(application) { if (baseConfig) { - application.register('mirage:base-config', baseConfig, { instantiate: false }); + application.register('mirage:base-config', baseConfig, { + instantiate: false, + }); } if (testConfig) { - application.register('mirage:test-config', testConfig, { instantiate: false }); + application.register('mirage:test-config', testConfig, { + instantiate: false, + }); } if (makeServer) { - application.register('mirage:make-server', makeServer, { instantiate: false }); + application.register('mirage:make-server', makeServer, { + instantiate: false, + }); } ENV['ember-cli-mirage'] = ENV['ember-cli-mirage'] || {}; if (_shouldUseMirage(ENV.environment, ENV['ember-cli-mirage'])) { startMirage(ENV); } - } + }, }; export function startMirage(env = ENV) { - return startMirageImpl(null, { env, baseConfig, testConfig, makeServer}); + return startMirageImpl(null, { env, baseConfig, testConfig, makeServer }); } function _shouldUseMirage(env, addonConfig) { diff --git a/blueprints/ember-cli-mirage/index.js b/blueprints/ember-cli-mirage/index.js index 964b06528..848351cac 100644 --- a/blueprints/ember-cli-mirage/index.js +++ b/blueprints/ember-cli-mirage/index.js @@ -6,37 +6,41 @@ var path = require('path'); var fs = require('fs'); module.exports = { - normalizeEntityName: function() { + normalizeEntityName: function () { // this prevents an error when the entityName is // not specified (since that doesn't actually matter // to us }, - fileMapTokens: function() { + fileMapTokens: function () { var self = this; return { - __root__: function(options) { - if (!!self.project.config()['ember-cli-mirage'] && !!self.project.config()['ember-cli-mirage'].directory) { + __root__: function (options) { + if ( + !!self.project.config()['ember-cli-mirage'] && + !!self.project.config()['ember-cli-mirage'].directory + ) { return self.project.config()['ember-cli-mirage'].directory; } else if (options.inAddon) { return path.join('tests', 'dummy', 'mirage'); } else { return '/mirage'; } - } + }, }; }, - insertShutdownIntoDestroyApp: function() { + insertShutdownIntoDestroyApp: function () { if (fs.existsSync('tests/helpers/destroy-app.js')) { - var shutdownText = ' if (window.server) {\n window.server.shutdown();\n }'; + var shutdownText = + ' if (window.server) {\n window.server.shutdown();\n }'; return this.insertIntoFile('tests/helpers/destroy-app.js', shutdownText, { - after: "run(application, 'destroy');\n" + after: "run(application, 'destroy');\n", }); } }, - afterInstall: function() { + afterInstall: function () { return this.insertShutdownIntoDestroyApp(); - } + }, }; diff --git a/blueprints/mirage-factory/index.js b/blueprints/mirage-factory/index.js index 5530221b3..68136ef74 100644 --- a/blueprints/mirage-factory/index.js +++ b/blueprints/mirage-factory/index.js @@ -6,18 +6,21 @@ var path = require('path'); module.exports = { description: 'Generates a Mirage factory.', - fileMapTokens: function() { + fileMapTokens: function () { var self = this; return { - __root__: function(options) { - if (!!self.project.config()['ember-cli-mirage'] && !!self.project.config()['ember-cli-mirage'].directory) { + __root__: function (options) { + if ( + !!self.project.config()['ember-cli-mirage'] && + !!self.project.config()['ember-cli-mirage'].directory + ) { return self.project.config()['ember-cli-mirage'].directory; } else if (options.inAddon) { return path.join('tests', 'dummy', 'mirage'); } else { return '/mirage'; } - } + }, }; - } + }, }; diff --git a/blueprints/mirage-fixture/index.js b/blueprints/mirage-fixture/index.js index 406639fb8..a62e0de2a 100644 --- a/blueprints/mirage-fixture/index.js +++ b/blueprints/mirage-fixture/index.js @@ -7,19 +7,21 @@ var path = require('path'); module.exports = { description: 'Generates a Mirage fixture.', - fileMapTokens: function() { + fileMapTokens: function () { var self = this; return { - __root__: function(options) { - if (!!self.project.config()['ember-cli-mirage'] && !!self.project.config()['ember-cli-mirage'].directory) { + __root__: function (options) { + if ( + !!self.project.config()['ember-cli-mirage'] && + !!self.project.config()['ember-cli-mirage'].directory + ) { return self.project.config()['ember-cli-mirage'].directory; } else if (options.inAddon) { return path.join('tests', 'dummy', 'mirage'); } else { return '/mirage'; } - } + }, }; - } - + }, }; diff --git a/blueprints/mirage-identity-manager/index.js b/blueprints/mirage-identity-manager/index.js index ceedc9b72..173887d6c 100644 --- a/blueprints/mirage-identity-manager/index.js +++ b/blueprints/mirage-identity-manager/index.js @@ -3,18 +3,21 @@ const path = require('path'); module.exports = { description: 'Generates a Mirage identity manager', - fileMapTokens: function() { + fileMapTokens: function () { var self = this; return { - __root__: function(options) { - if (!!self.project.config()['ember-cli-mirage'] && !!self.project.config()['ember-cli-mirage'].directory) { + __root__: function (options) { + if ( + !!self.project.config()['ember-cli-mirage'] && + !!self.project.config()['ember-cli-mirage'].directory + ) { return self.project.config()['ember-cli-mirage'].directory; } else if (options.inAddon) { return path.join('tests', 'dummy', 'mirage'); } else { return '/mirage'; } - } + }, }; - } + }, }; diff --git a/blueprints/mirage-model/index.js b/blueprints/mirage-model/index.js index fbd32bac4..28eb566b2 100644 --- a/blueprints/mirage-model/index.js +++ b/blueprints/mirage-model/index.js @@ -7,18 +7,21 @@ var path = require('path'); module.exports = { description: 'Generates a Mirage model.', - fileMapTokens: function() { + fileMapTokens: function () { var self = this; return { - __root__: function(options) { - if (!!self.project.config()['ember-cli-mirage'] && !!self.project.config()['ember-cli-mirage'].directory) { + __root__: function (options) { + if ( + !!self.project.config()['ember-cli-mirage'] && + !!self.project.config()['ember-cli-mirage'].directory + ) { return self.project.config()['ember-cli-mirage'].directory; } else if (options.inAddon) { return path.join('tests', 'dummy', 'mirage'); } else { return '/mirage'; } - } + }, }; }, }; diff --git a/blueprints/mirage-serializer/index.js b/blueprints/mirage-serializer/index.js index 1728e57a9..93de68195 100644 --- a/blueprints/mirage-serializer/index.js +++ b/blueprints/mirage-serializer/index.js @@ -7,18 +7,21 @@ var path = require('path'); module.exports = { description: 'Generates a Mirage serializer.', - fileMapTokens: function() { + fileMapTokens: function () { var self = this; return { - __root__: function(options) { - if (!!self.project.config()['ember-cli-mirage'] && !!self.project.config()['ember-cli-mirage'].directory) { + __root__: function (options) { + if ( + !!self.project.config()['ember-cli-mirage'] && + !!self.project.config()['ember-cli-mirage'].directory + ) { return self.project.config()['ember-cli-mirage'].directory; } else if (options.inAddon) { return path.join('tests', 'dummy', 'mirage'); } else { return '/mirage'; } - } + }, }; }, }; diff --git a/config/addon-docs.js b/config/addon-docs.js index 8370a9ef7..fffeb22c5 100644 --- a/config/addon-docs.js +++ b/config/addon-docs.js @@ -10,5 +10,4 @@ module.exports = class extends AddonDocsConfig { getRootURL() { return ''; } - }; diff --git a/config/deploy.js b/config/deploy.js index 134a17174..c93a1ebff 100644 --- a/config/deploy.js +++ b/config/deploy.js @@ -1,26 +1,26 @@ /* eslint-env node */ -"use strict"; +'use strict'; -module.exports = function(deployTarget) { +module.exports = function (deployTarget) { let ENV = { build: {}, git: { - repo: "git@github.com:miragejs/ember-cli-mirage.git" - } + repo: 'git@github.com:miragejs/ember-cli-mirage.git', + }, }; - if (deployTarget === "development") { - ENV.build.environment = "development"; + if (deployTarget === 'development') { + ENV.build.environment = 'development'; // configure other plugins for development deploy target here } - if (deployTarget === "staging") { - ENV.build.environment = "production"; + if (deployTarget === 'staging') { + ENV.build.environment = 'production'; // configure other plugins for staging deploy target here } - if (deployTarget === "production") { - ENV.build.environment = "production"; + if (deployTarget === 'production') { + ENV.build.environment = 'production'; // configure other plugins for production deploy target here } diff --git a/config/ember-try.js b/config/ember-try.js index 335a98882..d2e28290f 100644 --- a/config/ember-try.js +++ b/config/ember-try.js @@ -47,7 +47,7 @@ module.exports = async function () { }, dependencies: { 'ember-auto-import': '^2.2.4', - 'webpack': '^5.64.4' + webpack: '^5.64.4', }, }, }, @@ -59,7 +59,7 @@ module.exports = async function () { }, dependencies: { 'ember-auto-import': '^2.2.4', - 'webpack': '^5.64.4' + webpack: '^5.64.4', }, }, }, @@ -71,7 +71,7 @@ module.exports = async function () { }, dependencies: { 'ember-auto-import': '^2.2.4', - 'webpack': '^5.64.4' + webpack: '^5.64.4', }, }, }, diff --git a/config/environment.js b/config/environment.js index 5b584ec78..cef3b653d 100644 --- a/config/environment.js +++ b/config/environment.js @@ -2,16 +2,20 @@ var fs = require('fs'); function usingProxy() { - var usingProxyArg = !!process.argv.filter(function(arg) { - return arg.indexOf('--proxy') === 0 || arg.indexOf('-pr') === 0 || arg.indexOf('-pxy') === 0; + var usingProxyArg = !!process.argv.filter(function (arg) { + return ( + arg.indexOf('--proxy') === 0 || + arg.indexOf('-pr') === 0 || + arg.indexOf('-pxy') === 0 + ); }).length; var hasGeneratedProxies = false; - var proxiesDir = `${process.env.PWD }/server/proxies`; + var proxiesDir = `${process.env.PWD}/server/proxies`; try { fs.lstatSync(proxiesDir); hasGeneratedProxies = true; - } catch(e) { + } catch (e) { // ignore } diff --git a/ember-cli-build.js b/ember-cli-build.js index 0af5603bf..b8c44a756 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -1,23 +1,23 @@ -"use strict"; +'use strict'; -const EmberAddon = require("ember-cli/lib/broccoli/ember-addon"); +const EmberAddon = require('ember-cli/lib/broccoli/ember-addon'); module.exports = function (defaults) { let app = new EmberAddon(defaults, { - "ember-cli-babel": { + 'ember-cli-babel': { includePolyfill: true, }, - "ember-cli-addon-docs-esdoc": { + 'ember-cli-addon-docs-esdoc': { packages: [ - "ember-cli-mirage", - { name: "miragejs", sourceDirectory: "lib" }, + 'ember-cli-mirage', + { name: 'miragejs', sourceDirectory: 'lib' }, ], }, - "ember-composable-helpers": { - only: ["sort-by"] + 'ember-composable-helpers': { + only: ['sort-by'], }, addons: { - blacklist: ["ember-cli-fastboot"], + blacklist: ['ember-cli-fastboot'], }, }); diff --git a/index.js b/index.js index fb05d226b..33abecc64 100644 --- a/index.js +++ b/index.js @@ -28,7 +28,8 @@ module.exports = { } this.app = app; - this.addonConfig = this.app.project.config(app.env)['ember-cli-mirage'] || {}; + this.addonConfig = + this.app.project.config(app.env)['ember-cli-mirage'] || {}; this.addonBuildConfig = this.app.options['ember-cli-mirage'] || {}; // Call super after initializing config so we can use _shouldIncludeFiles for the node assets @@ -38,8 +39,14 @@ module.exports = { this.mirageDirectory = this.addonBuildConfig.directory; } else if (this.addonConfig.directory) { this.mirageDirectory = this.addonConfig.directory; - } else if (app.project.pkg['ember-addon'] && app.project.pkg['ember-addon'].configPath) { - this.mirageDirectory = path.resolve(app.project.root, path.join('tests', 'dummy', 'mirage')); + } else if ( + app.project.pkg['ember-addon'] && + app.project.pkg['ember-addon'].configPath + ) { + this.mirageDirectory = path.resolve( + app.project.root, + path.join('tests', 'dummy', 'mirage') + ); } else { this.mirageDirectory = path.join(this.app.project.root, '/mirage'); } @@ -57,12 +64,15 @@ module.exports = { if (name === 'app') { // Include a noop initializer, even if Mirage is excluded from the build - return writeFile('initializers/ember-cli-mirage.js', ` + return writeFile( + 'initializers/ember-cli-mirage.js', + ` export default { name: 'ember-cli-mirage', initialize() {} }; - `); + ` + ); } }, @@ -72,29 +82,34 @@ module.exports = { // this conditional can be removed when we no longer support // versions older than 2.5.0 if (this._eachProjectAddonInvoke) { - lintedMirageTrees = this._eachProjectAddonInvoke('lintTree', ['mirage', mirageTree]); + lintedMirageTrees = this._eachProjectAddonInvoke('lintTree', [ + 'mirage', + mirageTree, + ]); } else { - lintedMirageTrees = this.project.addons.map(function(addon) { - if (addon.lintTree) { - return addon.lintTree('mirage', mirageTree); - } - }).filter(Boolean); + lintedMirageTrees = this.project.addons + .map(function (addon) { + if (addon.lintTree) { + return addon.lintTree('mirage', mirageTree); + } + }) + .filter(Boolean); } let lintedMirage = mergeTrees(lintedMirageTrees, { overwrite: true, - annotation: 'TreeMerger (mirage-lint)' + annotation: 'TreeMerger (mirage-lint)', }); return new Funnel(lintedMirage, { - destDir: 'tests/mirage/' + destDir: 'tests/mirage/', }); }, treeForApp(appTree) { - let trees = [ appTree ]; + let trees = [appTree]; let mirageFilesTree = new Funnel(this.mirageDirectory, { - destDir: 'mirage' + destDir: 'mirage', }); trees.push(mirageFilesTree); @@ -111,13 +126,21 @@ module.exports = { } let environment = this.app.env; - let enabledInProd = environment === 'production' && this.addonConfig.enabled; + let enabledInProd = + environment === 'production' && this.addonConfig.enabled; let explicitExcludeFiles = this.addonConfig.excludeFilesFromBuild; if (enabledInProd && explicitExcludeFiles) { - throw new Error('Mirage was explicitly enabled in production, but its files were excluded ' - + 'from the build. Please, use only ENV[\'ember-cli-mirage\'].enabled in ' - + 'production environment.'); + throw new Error( + 'Mirage was explicitly enabled in production, but its files were excluded ' + + "from the build. Please, use only ENV['ember-cli-mirage'].enabled in " + + 'production environment.' + ); } - return enabledInProd || (environment && environment !== 'production' && explicitExcludeFiles !== true); - } + return ( + enabledInProd || + (environment && + environment !== 'production' && + explicitExcludeFiles !== true) + ); + }, }; diff --git a/package.json b/package.json index be669a828..c0a1c29d7 100644 --- a/package.json +++ b/package.json @@ -90,8 +90,10 @@ "ember-template-lint": "^3.14.0", "ember-try": "^2.0.0", "eslint": "^7.32.0", + "eslint-config-prettier": "^8.3.0", "eslint-plugin-ember": "^10.5.8", "eslint-plugin-node": "^11.1.0", + "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-qunit": "^7.1.0", "faker": "^5.1.0", "fastboot": "^3.2.0-beta.5", @@ -99,6 +101,7 @@ "jsdom": "^19.0.0", "loader.js": "^4.7.0", "npm-run-all": "^4.1.5", + "prettier": "^2.5.1", "qunit": "^2.17.2", "qunit-dom": "^2.0.0" }, diff --git a/test-projects/01-basic-app/app/controllers/application.js b/test-projects/01-basic-app/app/controllers/application.js index 123711e15..09c6806ef 100644 --- a/test-projects/01-basic-app/app/controllers/application.js +++ b/test-projects/01-basic-app/app/controllers/application.js @@ -3,19 +3,21 @@ import Controller from '@ember/controller'; import ENV from 'basic-app/config/environment'; export default class extends Controller { - environment = ENV.environment; - get mirageModules () { - return Object.keys(requirejs.entries) - .filter(key => key.match('^ember-cli-mirage')); + get mirageModules() { + return Object.keys(requirejs.entries).filter((key) => + key.match('^ember-cli-mirage') + ); } - get otherIncludedModules () { - return Object.keys(requirejs.entries) - .filter(key => { - return key.match('^pretender') || key.match('^lodash') || key.match('initializers/ember-cli-mirage'); - }); + get otherIncludedModules() { + return Object.keys(requirejs.entries).filter((key) => { + return ( + key.match('^pretender') || + key.match('^lodash') || + key.match('initializers/ember-cli-mirage') + ); + }); } - } diff --git a/test-projects/01-basic-app/app/models/book.js b/test-projects/01-basic-app/app/models/book.js index c0cc14d11..6c8e5117f 100644 --- a/test-projects/01-basic-app/app/models/book.js +++ b/test-projects/01-basic-app/app/models/book.js @@ -1,7 +1,5 @@ import Model, { belongsTo } from '@ember-data/model'; export default class Book extends Model { - @belongsTo() user; - } diff --git a/test-projects/01-basic-app/app/models/user.js b/test-projects/01-basic-app/app/models/user.js index de099dc1a..fc879bf3a 100644 --- a/test-projects/01-basic-app/app/models/user.js +++ b/test-projects/01-basic-app/app/models/user.js @@ -1,11 +1,9 @@ import Model, { attr, hasMany } from '@ember-data/model'; export default class User extends Model { - @attr('string') name; @attr('number') age; @attr('string') email; @hasMany() books; - } diff --git a/test-projects/01-basic-app/app/pods/crud-demo/controller.js b/test-projects/01-basic-app/app/pods/crud-demo/controller.js index 55a73d8c4..4acd8334a 100644 --- a/test-projects/01-basic-app/app/pods/crud-demo/controller.js +++ b/test-projects/01-basic-app/app/pods/crud-demo/controller.js @@ -4,12 +4,11 @@ import { action } from '@ember/object'; import { tracked } from '@glimmer/tracking'; export default class extends Controller { - @service store; @tracked newName; - @action createUser (event) { + @action createUser(event) { event.preventDefault(); let name = this.newName; @@ -22,16 +21,15 @@ export default class extends Controller { }); } - @action updateUser (user, event) { + @action updateUser(user, event) { event.preventDefault(); user.save(); } - @action deleteUser (user, event) { + @action deleteUser(user, event) { event.preventDefault(); user.destroyRecord(); } - } diff --git a/test-projects/01-basic-app/app/pods/crud-demo/route.js b/test-projects/01-basic-app/app/pods/crud-demo/route.js index a39c8fb0a..e4f198d40 100644 --- a/test-projects/01-basic-app/app/pods/crud-demo/route.js +++ b/test-projects/01-basic-app/app/pods/crud-demo/route.js @@ -7,5 +7,4 @@ export default class extends Route { model() { return this.store.findAll('user'); } - } diff --git a/test-projects/01-basic-app/app/pods/module-count/controller.js b/test-projects/01-basic-app/app/pods/module-count/controller.js index 123711e15..09c6806ef 100644 --- a/test-projects/01-basic-app/app/pods/module-count/controller.js +++ b/test-projects/01-basic-app/app/pods/module-count/controller.js @@ -3,19 +3,21 @@ import Controller from '@ember/controller'; import ENV from 'basic-app/config/environment'; export default class extends Controller { - environment = ENV.environment; - get mirageModules () { - return Object.keys(requirejs.entries) - .filter(key => key.match('^ember-cli-mirage')); + get mirageModules() { + return Object.keys(requirejs.entries).filter((key) => + key.match('^ember-cli-mirage') + ); } - get otherIncludedModules () { - return Object.keys(requirejs.entries) - .filter(key => { - return key.match('^pretender') || key.match('^lodash') || key.match('initializers/ember-cli-mirage'); - }); + get otherIncludedModules() { + return Object.keys(requirejs.entries).filter((key) => { + return ( + key.match('^pretender') || + key.match('^lodash') || + key.match('initializers/ember-cli-mirage') + ); + }); } - } diff --git a/test-projects/01-basic-app/app/router.js b/test-projects/01-basic-app/app/router.js index aebed7526..797295e13 100644 --- a/test-projects/01-basic-app/app/router.js +++ b/test-projects/01-basic-app/app/router.js @@ -6,7 +6,7 @@ export default class Router extends EmberRouter { rootURL = config.rootURL; } -Router.map(function() { +Router.map(function () { this.route('module-count'); this.route('crud-demo'); }); diff --git a/test-projects/01-basic-app/config/environment.js b/test-projects/01-basic-app/config/environment.js index 2dc61c183..1af33a9ba 100644 --- a/test-projects/01-basic-app/config/environment.js +++ b/test-projects/01-basic-app/config/environment.js @@ -26,7 +26,7 @@ module.exports = function (environment) { if (process.env.MIRAGE_ENABLED) { ENV['ember-cli-mirage'] = { - enabled: true + enabled: true, }; } diff --git a/test-projects/01-basic-app/ember-cli-build.js b/test-projects/01-basic-app/ember-cli-build.js index d67700813..633f74278 100644 --- a/test-projects/01-basic-app/ember-cli-build.js +++ b/test-projects/01-basic-app/ember-cli-build.js @@ -5,8 +5,8 @@ const EmberApp = require('ember-cli/lib/broccoli/ember-app'); module.exports = function (defaults) { let app = new EmberApp(defaults, { autoImport: { - exclude: ['qunit'] - } + exclude: ['qunit'], + }, }); // Use `app.import` to add additional libraries to the generated diff --git a/test-projects/01-basic-app/fastboot-tests/included-files-test.js b/test-projects/01-basic-app/fastboot-tests/included-files-test.js index 515dac4a1..ae6d5cd34 100644 --- a/test-projects/01-basic-app/fastboot-tests/included-files-test.js +++ b/test-projects/01-basic-app/fastboot-tests/included-files-test.js @@ -6,108 +6,136 @@ const { JSDOM } = jsdom; const findTextFromHtml = (html, selector) => { let document = new JSDOM(html).window.document; - return document.querySelector(selector) - .textContent - .trim(); + return document.querySelector(selector).textContent.trim(); }; -qModule('basic-app | fastboot | included files', function() { - - test('it includes all modules in development by default', async function(assert) { - execFileSync('node', [ - require.resolve('ember-cli/bin/ember'), - 'build' - ]); +qModule('basic-app | fastboot | included files', function () { + test('it includes all modules in development by default', async function (assert) { + execFileSync('node', [require.resolve('ember-cli/bin/ember'), 'build']); let fastboot = new FastBoot({ distPath: 'dist', - resilient: false + resilient: false, }); let page = await fastboot.visit('/module-count', { request: { url: '/module-count', protocol: 'https:', - headers: {} + headers: {}, }, - response: {} + response: {}, }); let html = await page.html(); - assert.equal(findTextFromHtml(html, '[data-test-id="environment"]'), 'development'); - assert.ok(+findTextFromHtml(html, '[data-test-id="mirage-module-count"]') > 1); - assert.ok(+findTextFromHtml(html, '[data-test-id="other-module-count"]') > 1); + assert.equal( + findTextFromHtml(html, '[data-test-id="environment"]'), + 'development' + ); + assert.ok( + +findTextFromHtml(html, '[data-test-id="mirage-module-count"]') > 1 + ); + assert.ok( + +findTextFromHtml(html, '[data-test-id="other-module-count"]') > 1 + ); }); - test('it includes all modules in test by default', async function(assert) { + test('it includes all modules in test by default', async function (assert) { execFileSync('node', [ require.resolve('ember-cli/bin/ember'), 'build', - '--environment=test' + '--environment=test', ]); let fastboot = new FastBoot({ distPath: 'dist', - resilient: false + resilient: false, }); let page = await fastboot.visit('/module-count', { request: { url: '/module-count', protocol: 'https:', - headers: {} + headers: {}, }, - response: {} + response: {}, }); let html = await page.html(); - assert.equal(findTextFromHtml(html, '[data-test-id="environment"]'), 'test'); - assert.ok(+findTextFromHtml(html, '[data-test-id="mirage-module-count"]') > 1); - assert.ok(+findTextFromHtml(html, '[data-test-id="other-module-count"]') > 1); + assert.equal( + findTextFromHtml(html, '[data-test-id="environment"]'), + 'test' + ); + assert.ok( + +findTextFromHtml(html, '[data-test-id="mirage-module-count"]') > 1 + ); + assert.ok( + +findTextFromHtml(html, '[data-test-id="other-module-count"]') > 1 + ); }); - test('it only includes an initializer in production by default', async function(assert) { - execFileSync('node', [require.resolve('ember-cli/bin/ember'), 'build', '-prod']); + test('it only includes an initializer in production by default', async function (assert) { + execFileSync('node', [ + require.resolve('ember-cli/bin/ember'), + 'build', + '-prod', + ]); let fastboot = new FastBoot({ distPath: 'dist', - resilient: false + resilient: false, }); let page = await fastboot.visit('/module-count', { request: { url: '/module-count', protocol: 'https:', - headers: {} + headers: {}, }, - response: {} + response: {}, }); let html = await page.html(); - assert.equal(findTextFromHtml(html, '[data-test-id="environment"]'), 'production'); - assert.equal(findTextFromHtml(html, '[data-test-id="mirage-module-count"]'), '0'); - assert.equal(findTextFromHtml(html, '[data-test-id="other-module-count"]'), '1'); + assert.equal( + findTextFromHtml(html, '[data-test-id="environment"]'), + 'production' + ); + assert.equal( + findTextFromHtml(html, '[data-test-id="mirage-module-count"]'), + '0' + ); + assert.equal( + findTextFromHtml(html, '[data-test-id="other-module-count"]'), + '1' + ); }); - test('all files can be included in production by explicitly setting enabled to true', async function(assert) { + test('all files can be included in production by explicitly setting enabled to true', async function (assert) { process.env.MIRAGE_ENABLED = 'true'; execFileSync('node', [ require.resolve('ember-cli/bin/ember'), 'build', - '-prod' + '-prod', ]); let fastboot = new FastBoot({ distPath: 'dist', - resilient: false + resilient: false, }); let page = await fastboot.visit('/module-count', { request: { url: '/module-count', protocol: 'https:', - headers: {} + headers: {}, }, - response: {} + response: {}, }); let html = await page.html(); - assert.equal(findTextFromHtml(html, '[data-test-id="environment"]'), 'production'); - assert.ok(+findTextFromHtml(html, '[data-test-id="mirage-module-count"]') > 1); - assert.ok(+findTextFromHtml(html, '[data-test-id="other-module-count"]') > 1); + assert.equal( + findTextFromHtml(html, '[data-test-id="environment"]'), + 'production' + ); + assert.ok( + +findTextFromHtml(html, '[data-test-id="mirage-module-count"]') > 1 + ); + assert.ok( + +findTextFromHtml(html, '[data-test-id="other-module-count"]') > 1 + ); }); }); diff --git a/test-projects/01-basic-app/mirage/config.js b/test-projects/01-basic-app/mirage/config.js index daa9f452d..bb5285750 100644 --- a/test-projects/01-basic-app/mirage/config.js +++ b/test-projects/01-basic-app/mirage/config.js @@ -1,5 +1,3 @@ -export default function() { - +export default function () { this.resource('user'); - } diff --git a/test-projects/01-basic-app/mirage/factories/nested/thing.js b/test-projects/01-basic-app/mirage/factories/nested/thing.js index e0d41a181..c2692a773 100644 --- a/test-projects/01-basic-app/mirage/factories/nested/thing.js +++ b/test-projects/01-basic-app/mirage/factories/nested/thing.js @@ -1,5 +1,5 @@ import { Factory } from 'miragejs'; export default Factory.extend({ - name: 'nested factory works!' + name: 'nested factory works!', }); diff --git a/test-projects/01-basic-app/mirage/factories/user.js b/test-projects/01-basic-app/mirage/factories/user.js index ffa9661cf..797df9909 100644 --- a/test-projects/01-basic-app/mirage/factories/user.js +++ b/test-projects/01-basic-app/mirage/factories/user.js @@ -2,9 +2,7 @@ import { Factory } from 'miragejs'; import faker from 'faker'; export default Factory.extend({ - age() { return faker.datatype.number({ min: 32, max: 32 }); - } - + }, }); diff --git a/test-projects/01-basic-app/mirage/fixtures/countries.js b/test-projects/01-basic-app/mirage/fixtures/countries.js index f9b995d1a..129fc618c 100644 --- a/test-projects/01-basic-app/mirage/fixtures/countries.js +++ b/test-projects/01-basic-app/mirage/fixtures/countries.js @@ -1,3 +1 @@ -export default [ - { name: 'United State' } -]; +export default [{ name: 'United State' }]; diff --git a/test-projects/01-basic-app/mirage/fixtures/nested/things.js b/test-projects/01-basic-app/mirage/fixtures/nested/things.js index 5c0aee901..bfd4cb47d 100644 --- a/test-projects/01-basic-app/mirage/fixtures/nested/things.js +++ b/test-projects/01-basic-app/mirage/fixtures/nested/things.js @@ -1,3 +1 @@ -export default [ - { fixtureField: 'nested fixture works!' } -]; +export default [{ fixtureField: 'nested fixture works!' }]; diff --git a/test-projects/01-basic-app/mirage/fixtures/users.js b/test-projects/01-basic-app/mirage/fixtures/users.js index 0148a57fa..42dd95037 100644 --- a/test-projects/01-basic-app/mirage/fixtures/users.js +++ b/test-projects/01-basic-app/mirage/fixtures/users.js @@ -1,5 +1 @@ -export default [ - - { id: 1, name: 'Sam' } - -]; +export default [{ id: 1, name: 'Sam' }]; diff --git a/test-projects/01-basic-app/mirage/identity-managers/book.js b/test-projects/01-basic-app/mirage/identity-managers/book.js index 76f1564ad..4ba1e894f 100644 --- a/test-projects/01-basic-app/mirage/identity-managers/book.js +++ b/test-projects/01-basic-app/mirage/identity-managers/book.js @@ -15,7 +15,9 @@ export default class { let id; if (this._nextId >= alphabet.length) { - throw new Error(`IdentityManager used for testing only supports ${alphabet.length} ids.`); + throw new Error( + `IdentityManager used for testing only supports ${alphabet.length} ids.` + ); } id = alphabet[this._nextId % alphabet.length]; this._ids[id] = true; @@ -52,6 +54,6 @@ export default class { */ reset() { this._nextId = 0; - this._ids = {}; + this._ids = {}; } } diff --git a/test-projects/01-basic-app/mirage/identity-managers/nested/thing.js b/test-projects/01-basic-app/mirage/identity-managers/nested/thing.js index 52271b76d..e7fc3b4e2 100644 --- a/test-projects/01-basic-app/mirage/identity-managers/nested/thing.js +++ b/test-projects/01-basic-app/mirage/identity-managers/nested/thing.js @@ -14,7 +14,9 @@ export default class { let id; if (this._nextId >= 1) { - throw new Error(`IdentityManager used for testing only supports single id.`); + throw new Error( + `IdentityManager used for testing only supports single id.` + ); } id = 'nested identity manager works!'; this._ids[id] = true; @@ -51,6 +53,6 @@ export default class { */ reset() { this._nextId = 0; - this._ids = {}; + this._ids = {}; } } diff --git a/test-projects/01-basic-app/mirage/models/nested/thing.js b/test-projects/01-basic-app/mirage/models/nested/thing.js index 88bbf3c2c..db502f142 100644 --- a/test-projects/01-basic-app/mirage/models/nested/thing.js +++ b/test-projects/01-basic-app/mirage/models/nested/thing.js @@ -1,4 +1,3 @@ import { Model } from 'miragejs'; -export default Model.extend({ -}); +export default Model.extend({}); diff --git a/test-projects/01-basic-app/mirage/scenarios/default.js b/test-projects/01-basic-app/mirage/scenarios/default.js index 0cd90b408..bc83f83ce 100644 --- a/test-projects/01-basic-app/mirage/scenarios/default.js +++ b/test-projects/01-basic-app/mirage/scenarios/default.js @@ -1,7 +1,5 @@ -export default function(server) { - +export default function (server) { server.create('user', { name: 'Yehuda' }); server.create('user', { name: 'Tom' }); server.create('user', { name: 'Leah' }); - } diff --git a/test-projects/01-basic-app/mirage/serializers/nested/thing.js b/test-projects/01-basic-app/mirage/serializers/nested/thing.js index 66d972c4d..103273872 100644 --- a/test-projects/01-basic-app/mirage/serializers/nested/thing.js +++ b/test-projects/01-basic-app/mirage/serializers/nested/thing.js @@ -2,8 +2,11 @@ import ApplicationSerizlizer from '../application'; export default ApplicationSerizlizer.extend({ keyForAttribute(attr) { - const key = ApplicationSerizlizer.prototype.keyForAttribute.call(this, attr); + const key = ApplicationSerizlizer.prototype.keyForAttribute.call( + this, + attr + ); return `nested_thing_${key}`; - } + }, }); diff --git a/test-projects/01-basic-app/tests/acceptance/crud-demo-test.js b/test-projects/01-basic-app/tests/acceptance/crud-demo-test.js index 81e2d30cd..b1c5b6697 100644 --- a/test-projects/01-basic-app/tests/acceptance/crud-demo-test.js +++ b/test-projects/01-basic-app/tests/acceptance/crud-demo-test.js @@ -1,13 +1,19 @@ -import { module, test } from "qunit"; -import { visit, currentRouteName, findAll, fillIn, click } from "@ember/test-helpers"; -import { setupApplicationTest } from "ember-qunit"; -import { setupMirage } from "ember-cli-mirage/test-support"; - -module('Acceptance | Crud demo', function(hooks) { +import { module, test } from 'qunit'; +import { + visit, + currentRouteName, + findAll, + fillIn, + click, +} from '@ember/test-helpers'; +import { setupApplicationTest } from 'ember-qunit'; +import { setupMirage } from 'ember-cli-mirage/test-support'; + +module('Acceptance | Crud demo', function (hooks) { setupApplicationTest(hooks); - setupMirage(hooks) + setupMirage(hooks); - test('I can view the users', async function(assert) { + test('I can view the users', async function (assert) { this.server.createList('user', 3); await visit('/crud-demo'); @@ -15,7 +21,7 @@ module('Acceptance | Crud demo', function(hooks) { assert.equal(findAll('[data-test-id="user"]').length, 3); }); - test('I can create a new user', async function(assert) { + test('I can create a new user', async function (assert) { this.server.create('user', 1); await visit('/crud-demo'); @@ -26,7 +32,7 @@ module('Acceptance | Crud demo', function(hooks) { assert.ok(this.server.db.users.length, 2); }); - test('I can update a user', async function(assert) { + test('I can update a user', async function (assert) { let user = this.server.create('user', { name: 'Yehuda' }); await visit('/crud-demo'); @@ -39,7 +45,7 @@ module('Acceptance | Crud demo', function(hooks) { assert.ok(user.name, 'Katz'); }); - test('I can delete a user', async function(assert) { + test('I can delete a user', async function (assert) { this.server.create('user', { name: 'Yehuda' }); await visit('/crud-demo'); @@ -49,10 +55,14 @@ module('Acceptance | Crud demo', function(hooks) { assert.equal(this.server.db.users.length, 0); }); - test('If the server errors on GET /users, the error template shows', async function(assert) { - this.server.get('/users', { - errors: [ 'improper auth' ] - }, 404); + test('If the server errors on GET /users, the error template shows', async function (assert) { + this.server.get( + '/users', + { + errors: ['improper auth'], + }, + 404 + ); await visit('/crud-demo'); diff --git a/test-projects/01-basic-app/tests/acceptance/ember-data-test.js b/test-projects/01-basic-app/tests/acceptance/ember-data-test.js index c70fb0482..5200c5ba9 100644 --- a/test-projects/01-basic-app/tests/acceptance/ember-data-test.js +++ b/test-projects/01-basic-app/tests/acceptance/ember-data-test.js @@ -6,67 +6,100 @@ import { modelFor } from 'ember-cli-mirage/ember-data'; const CustomTag = Model.extend(); CustomTag.__isCustom__ = true; -module('Acceptance | Ember Data', function(hooks) { - hooks.beforeEach(function() { +module('Acceptance | Ember Data', function (hooks) { + hooks.beforeEach(function () { this.server = new Server({ environment: 'development', discoverEmberDataModels: true, scenarios: { - default() {} + default() {}, }, models: { // Friend exists in dummy/app/models. We want to make sure pre-defined // models take precedence tag: CustomTag, - foo: Model.extend() + foo: Model.extend(), }, - factories: {} + factories: {}, }); }); - hooks.afterEach(function() { + hooks.afterEach(function () { this.server.shutdown(); }); - test(`Ember data models were generated and loaded`, function(assert) { + test(`Ember data models were generated and loaded`, function (assert) { let { schema } = this.server; let registry = schema._registry; assert.ok(registry.foo, 'Mirage model Foo has been registered'); assert.ok(registry.book, 'EmberData model Book has been registered'); assert.ok(registry.user, 'EmberData model User has been registered'); - assert.equal(registry.user.foreignKeys.length, 1, 'EmberData model User has the correct relationships'); - assert.equal(registry.book.foreignKeys.length, 1, 'EmberData model User has the correct relationships'); - assert.equal(registry.user.foreignKeys[0], 'bookIds', 'EmberData model User has the correct relationships'); - assert.equal(registry.book.foreignKeys[0], 'userId', 'EmberData model Book has the correct relationships'); + assert.equal( + registry.user.foreignKeys.length, + 1, + 'EmberData model User has the correct relationships' + ); + assert.equal( + registry.book.foreignKeys.length, + 1, + 'EmberData model User has the correct relationships' + ); + assert.equal( + registry.user.foreignKeys[0], + 'bookIds', + 'EmberData model User has the correct relationships' + ); + assert.equal( + registry.book.foreignKeys[0], + 'userId', + 'EmberData model Book has the correct relationships' + ); }); - test(`It works with nested models`, function(assert) { + test(`It works with nested models`, function (assert) { let { schema } = this.server; let registry = schema._registry; - assert.ok(registry['things/watch'], 'Model things/watch has been registered'); + assert.ok( + registry['things/watch'], + 'Model things/watch has been registered' + ); }); - test(`Defined Mirage models take precedence over autogenerated ones`, function(assert) { + test(`Defined Mirage models take precedence over autogenerated ones`, function (assert) { let { schema } = this.server; let registry = schema._registry; assert.ok(registry.tag, 'Model Tag has been registered'); - assert.ok(registry.tag.class.__isCustom__, 'Model Tag is not the autogenerated one'); + assert.ok( + registry.tag.class.__isCustom__, + 'Model Tag is not the autogenerated one' + ); }); - test(`Auto generated models can be extended via modelFor`, function(assert) { + test(`Auto generated models can be extended via modelFor`, function (assert) { let { schema } = this.server; let registry = schema._registry; assert.ok(registry.book, 'Ember data model Book has been registered'); assert.ok(modelFor('book'), 'Ember data model Book is found'); - assert.equal(typeof modelFor('book').extend, 'function', 'Ember data model Book can be extended'); + assert.equal( + typeof modelFor('book').extend, + 'function', + 'Ember data model Book can be extended' + ); }); - test(`modelFor is only for auto generated models`, function(assert) { - assert.notOk(modelFor('tag').__isCustom__, 'Tag model is not the pre defined one'); - assert.throws(() => modelFor('foo'), /Model of type 'foo' does not exist/, 'Pre defined mirage models cannot be found via modelFor'); + test(`modelFor is only for auto generated models`, function (assert) { + assert.notOk( + modelFor('tag').__isCustom__, + 'Tag model is not the pre defined one' + ); + assert.throws( + () => modelFor('foo'), + /Model of type 'foo' does not exist/, + 'Pre defined mirage models cannot be found via modelFor' + ); }); }); diff --git a/test-projects/01-basic-app/tests/acceptance/faker-test.js b/test-projects/01-basic-app/tests/acceptance/faker-test.js index 485301a13..d6dcad019 100644 --- a/test-projects/01-basic-app/tests/acceptance/faker-test.js +++ b/test-projects/01-basic-app/tests/acceptance/faker-test.js @@ -2,14 +2,13 @@ import { module, test } from 'qunit'; import { setupTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; -module('Acceptance | Faker', function(hooks) { +module('Acceptance | Faker', function (hooks) { setupTest(hooks); setupMirage(hooks); - test('it works', function(assert) { + test('it works', function (assert) { let user = this.server.create('user'); assert.equal(user.age, 32); }); - }); diff --git a/test-projects/01-basic-app/tests/acceptance/fixtures-test.js b/test-projects/01-basic-app/tests/acceptance/fixtures-test.js index 8d9e8c283..ff3e286a1 100644 --- a/test-projects/01-basic-app/tests/acceptance/fixtures-test.js +++ b/test-projects/01-basic-app/tests/acceptance/fixtures-test.js @@ -1,13 +1,13 @@ -import { module, test } from "qunit"; -import { visit } from "@ember/test-helpers"; -import { setupApplicationTest } from "ember-qunit"; -import { setupMirage } from "ember-cli-mirage/test-support"; +import { module, test } from 'qunit'; +import { visit } from '@ember/test-helpers'; +import { setupApplicationTest } from 'ember-qunit'; +import { setupMirage } from 'ember-cli-mirage/test-support'; -module('Acceptance | Fixtures', function(hooks) { +module('Acceptance | Fixtures', function (hooks) { setupApplicationTest(hooks); - setupMirage(hooks) + setupMirage(hooks); - test('I can use fixtures', async function(assert) { + test('I can use fixtures', async function (assert) { this.server.loadFixtures(); await visit('/crud-demo'); @@ -15,7 +15,7 @@ module('Acceptance | Fixtures', function(hooks) { assert.dom('[data-test-id="user"]').exists({ count: 1 }); }); - test('I can use fixtures with the filename api', async function(assert) { + test('I can use fixtures with the filename api', async function (assert) { this.server.loadFixtures('countries'); await visit('/crud-demo'); diff --git a/test-projects/01-basic-app/tests/acceptance/identity-manager-test.js b/test-projects/01-basic-app/tests/acceptance/identity-manager-test.js index c150ed049..ff654e79c 100644 --- a/test-projects/01-basic-app/tests/acceptance/identity-manager-test.js +++ b/test-projects/01-basic-app/tests/acceptance/identity-manager-test.js @@ -1,12 +1,12 @@ -import { module, test } from "qunit"; -import { setupApplicationTest } from "ember-qunit"; -import { setupMirage } from "ember-cli-mirage/test-support"; +import { module, test } from 'qunit'; +import { setupApplicationTest } from 'ember-qunit'; +import { setupMirage } from 'ember-cli-mirage/test-support'; -module('Acceptance | Identity manager', function(hooks) { +module('Acceptance | Identity manager', function (hooks) { setupApplicationTest(hooks); - setupMirage(hooks) + setupMirage(hooks); - test('custom identity managers work', function(assert) { + test('custom identity managers work', function (assert) { let book = this.server.create('book'); assert.equal(book.id, 'a'); diff --git a/test-projects/01-basic-app/tests/acceptance/legacy-start-mirage-test.js b/test-projects/01-basic-app/tests/acceptance/legacy-start-mirage-test.js index 9672be99f..728b0820b 100644 --- a/test-projects/01-basic-app/tests/acceptance/legacy-start-mirage-test.js +++ b/test-projects/01-basic-app/tests/acceptance/legacy-start-mirage-test.js @@ -4,20 +4,20 @@ import destroyApp from '../helpers/destroy-app'; import { startMirage } from 'basic-app/initializers/ember-cli-mirage'; import ENV from 'basic-app/config/environment'; -module('Acceptance | Starting mirage (legacy)', function(hooks) { +module('Acceptance | Starting mirage (legacy)', function (hooks) { let app, oldEnv, addonConfig; - hooks.beforeEach(function() { + hooks.beforeEach(function () { oldEnv = ENV['ember-cli-mirage']; ENV['ember-cli-mirage'] = addonConfig = {}; }); - hooks.afterEach(function() { + hooks.afterEach(function () { destroyApp(app); ENV['ember-cli-mirage'] = oldEnv; }); - test('The server starts automatically when configured with enabled undefined', async function(assert) { + test('The server starts automatically when configured with enabled undefined', async function (assert) { app = startApp(); assert.ok(window.server, 'There is a server after starting'); @@ -29,7 +29,7 @@ module('Acceptance | Starting mirage (legacy)', function(hooks) { assert.dom('[data-test-id="user"]').exists(); }); - test('The server starts automatically when configured with { enabled: true }', async function(assert) { + test('The server starts automatically when configured with { enabled: true }', async function (assert) { addonConfig.enabled = true; app = startApp(); @@ -42,7 +42,7 @@ module('Acceptance | Starting mirage (legacy)', function(hooks) { assert.dom('[data-test-id="user"]').exists(); }); - test('The server can be started manually when configured with { enabled: false }', async function(assert) { + test('The server can be started manually when configured with { enabled: false }', async function (assert) { addonConfig.enabled = false; app = startApp(); diff --git a/test-projects/01-basic-app/tests/acceptance/request-tracking-test.js b/test-projects/01-basic-app/tests/acceptance/request-tracking-test.js index d8146bdf5..bd5fd32c2 100644 --- a/test-projects/01-basic-app/tests/acceptance/request-tracking-test.js +++ b/test-projects/01-basic-app/tests/acceptance/request-tracking-test.js @@ -13,39 +13,55 @@ module('Acceptance | Enabling request tracking', function (hooks) { ENV['ember-cli-mirage'].enabled = undefined; }); - test('Request tracking defaults to false', async function(assert) { + test('Request tracking defaults to false', async function (assert) { App = startApp(); await promiseAjax({ method: 'GET', - url: '/users' + url: '/users', }); - assert.equal(window.server.pretender.handledRequests.length, 0, 'request tracking should be false by default'); + assert.equal( + window.server.pretender.handledRequests.length, + 0, + 'request tracking should be false by default' + ); }); - test('Request tracking treats undefined config as false', async function(assert) { + test('Request tracking treats undefined config as false', async function (assert) { ENV['ember-cli-mirage'] = { trackRequests: undefined }; App = startApp(); await promiseAjax({ method: 'GET', - url: '/users' + url: '/users', }); - assert.equal(window.server.pretender.handledRequests.length, 0, 'request tracking should be false when undefined in config'); + assert.equal( + window.server.pretender.handledRequests.length, + 0, + 'request tracking should be false when undefined in config' + ); }); - test('Request tracking can be set to true in config', async function(assert) { + test('Request tracking can be set to true in config', async function (assert) { ENV['ember-cli-mirage'] = { trackRequests: true }; App = startApp(); await promiseAjax({ method: 'GET', - url: '/users' + url: '/users', }); - assert.equal(window.server.pretender.handledRequests.length, 1, 'request tracking can be turned on in config and track requests'); - assert.equal(window.server.pretender.handledRequests[0].method, 'GET', 'tracked request method should match the requests method'); + assert.equal( + window.server.pretender.handledRequests.length, + 1, + 'request tracking can be turned on in config and track requests' + ); + assert.equal( + window.server.pretender.handledRequests[0].method, + 'GET', + 'tracked request method should match the requests method' + ); }); }); diff --git a/test-projects/01-basic-app/tests/acceptance/start-mirage-test.js b/test-projects/01-basic-app/tests/acceptance/start-mirage-test.js index 7c5b4c985..204e8a32b 100644 --- a/test-projects/01-basic-app/tests/acceptance/start-mirage-test.js +++ b/test-projects/01-basic-app/tests/acceptance/start-mirage-test.js @@ -6,10 +6,10 @@ import { setupMirage } from 'ember-cli-mirage/test-support'; import ENV from 'basic-app/config/environment'; import NestedThingModel from 'basic-app/mirage/models/nested/thing'; -module('Acceptance | Starting mirage', function(hooks) { +module('Acceptance | Starting mirage', function (hooks) { let oldEnv, addonConfig, dynamicAfterEach; - hooks.beforeEach(function() { + hooks.beforeEach(function () { oldEnv = ENV['ember-cli-mirage']; ENV['ember-cli-mirage'] = addonConfig = {}; // When running in non-legacy mode we shoud ignore this, so we set it so we @@ -20,19 +20,23 @@ module('Acceptance | Starting mirage', function(hooks) { dynamicAfterEach = () => undefined; }); - hooks.afterEach(function() { + hooks.afterEach(function () { dynamicAfterEach(); }); - hooks.afterEach(function() { + hooks.afterEach(function () { ENV['ember-cli-mirage'] = oldEnv; }); - module('without autostart', function(hooks) { + module('without autostart', function (hooks) { setupTest(hooks); - test('it does not autostart but can be started manually', async function(assert) { - assert.equal(window.server, undefined, 'There is no global server at first'); + test('it does not autostart but can be started manually', async function (assert) { + assert.equal( + window.server, + undefined, + 'There is no global server at first' + ); let server = startMirage(this.owner); assert.ok(server, 'There is a server after starting'); assert.ok(window.server, 'There is a global server after starting'); @@ -45,22 +49,27 @@ module('Acceptance | Starting mirage', function(hooks) { assert.dom('[data-test-id="user"]').exists(); }); - module('nested mirage modules', function() { - test('it works', async function(assert) { + module('nested mirage modules', function () { + test('it works', async function (assert) { const server = startMirage(this.owner); const model = server.create('nested/thing'); dynamicAfterEach = () => server.shutdown(); assert.ok(model instanceof NestedThingModel, 'models'); - assert.equal(model.id, 'nested identity manager works!', 'identity managers'); + assert.equal( + model.id, + 'nested identity manager works!', + 'identity managers' + ); assert.equal(model.name, 'nested factory works!', 'factories'); - const { attributes } = server.serializerOrRegistry.serialize(model).data; + const { attributes } = + server.serializerOrRegistry.serialize(model).data; assert.ok('nested_thing_name' in attributes, 'serializer'); }); // factories and fixtures have to be tested separately - test('fixtures support', async function(assert) { + test('fixtures support', async function (assert) { const server = startMirage(this.owner); dynamicAfterEach = () => server.shutdown(); @@ -68,15 +77,19 @@ module('Acceptance | Starting mirage', function(hooks) { const model = server.schema.first('nested/thing'); assert.ok(model instanceof NestedThingModel, 'models'); - assert.equal(model.id, 'nested identity manager works!', 'identity managers'); + assert.equal( + model.id, + 'nested identity manager works!', + 'identity managers' + ); assert.equal(model.fixtureField, 'nested fixture works!', 'fixtures'); }); - }) + }); - module('setupMirage()', function(hooks) { + module('setupMirage()', function (hooks) { setupMirage(hooks); - test('it works', async function(assert) { + test('it works', async function (assert) { assert.ok(this.server, 'There is a server'); assert.ok(window.server, 'There is a global server'); dynamicAfterEach = () => { @@ -93,14 +106,14 @@ module('Acceptance | Starting mirage', function(hooks) { }); }); - module('with autostart', function(hooks) { - hooks.beforeEach(function() { + module('with autostart', function (hooks) { + hooks.beforeEach(function () { addonConfig.autostart = true; }); setupTest(hooks); - test('it autostarts', async function(assert) { + test('it autostarts', async function (assert) { assert.ok(this.server, 'There is a server'); assert.ok(window.server, 'There is a global server'); dynamicAfterEach = () => { diff --git a/test-projects/01-basic-app/tests/helpers/destroy-app.js b/test-projects/01-basic-app/tests/helpers/destroy-app.js index f9411f492..a935b7e33 100644 --- a/test-projects/01-basic-app/tests/helpers/destroy-app.js +++ b/test-projects/01-basic-app/tests/helpers/destroy-app.js @@ -1,7 +1,7 @@ import { run } from '@ember/runloop'; export default function destroyApp(application) { - run(function() { + run(function () { application.destroy(); window.server.shutdown(); diff --git a/test-projects/01-basic-app/tests/helpers/module-for-acceptance.js b/test-projects/01-basic-app/tests/helpers/module-for-acceptance.js index 90a93bac2..68cbbdeb8 100644 --- a/test-projects/01-basic-app/tests/helpers/module-for-acceptance.js +++ b/test-projects/01-basic-app/tests/helpers/module-for-acceptance.js @@ -3,7 +3,7 @@ import { resolve } from 'rsvp'; import startApp from '../helpers/start-app'; import destroyApp from '../helpers/destroy-app'; -export default function(name, options = {}) { +export default function (name, options = {}) { module(name, { beforeEach() { this.application = startApp(); @@ -14,8 +14,9 @@ export default function(name, options = {}) { }, afterEach() { - let afterEach = options.afterEach && options.afterEach.apply(this, arguments); + let afterEach = + options.afterEach && options.afterEach.apply(this, arguments); return resolve(afterEach).then(() => destroyApp(this.application)); - } + }, }); } diff --git a/test-projects/01-basic-app/tests/helpers/promise-ajax.js b/test-projects/01-basic-app/tests/helpers/promise-ajax.js index 2c8223f7f..6b746ce18 100644 --- a/test-projects/01-basic-app/tests/helpers/promise-ajax.js +++ b/test-projects/01-basic-app/tests/helpers/promise-ajax.js @@ -5,7 +5,7 @@ import $ from 'jquery'; export default (options) => { return new Promise((resolve, reject) => { $.ajax(options) - .done((data, status, xhr) => resolve({data, status, xhr})) - .fail((xhr, status, error) => reject({xhr, status, error})); + .done((data, status, xhr) => resolve({ data, status, xhr })) + .fail((xhr, status, error) => reject({ xhr, status, error })); }); }; diff --git a/test-projects/01-basic-app/tests/helpers/resolver.js b/test-projects/01-basic-app/tests/helpers/resolver.js index b208d38d0..319b45fc1 100644 --- a/test-projects/01-basic-app/tests/helpers/resolver.js +++ b/test-projects/01-basic-app/tests/helpers/resolver.js @@ -5,7 +5,7 @@ const resolver = Resolver.create(); resolver.namespace = { modulePrefix: config.modulePrefix, - podModulePrefix: config.podModulePrefix + podModulePrefix: config.podModulePrefix, }; export default resolver; diff --git a/test-projects/02-app-that-excludes-mirage/app/controllers/application.js b/test-projects/02-app-that-excludes-mirage/app/controllers/application.js index ac787d4c8..9605e0f1d 100644 --- a/test-projects/02-app-that-excludes-mirage/app/controllers/application.js +++ b/test-projects/02-app-that-excludes-mirage/app/controllers/application.js @@ -4,21 +4,23 @@ import { inject as service } from '@ember/service'; import ENV from 'basic-app/config/environment'; export default class extends Controller { - @service wifi; environment = ENV.environment; - get mirageModules () { - return Object.keys(requirejs.entries) - .filter(key => key.match('^ember-cli-mirage')); + get mirageModules() { + return Object.keys(requirejs.entries).filter((key) => + key.match('^ember-cli-mirage') + ); } - get otherIncludedModules () { - return Object.keys(requirejs.entries) - .filter(key => { - return key.match('^pretender') || key.match('^lodash') || key.match('initializers/ember-cli-mirage'); - }); + get otherIncludedModules() { + return Object.keys(requirejs.entries).filter((key) => { + return ( + key.match('^pretender') || + key.match('^lodash') || + key.match('initializers/ember-cli-mirage') + ); + }); } - } diff --git a/test-projects/02-app-that-excludes-mirage/app/services/wifi.js b/test-projects/02-app-that-excludes-mirage/app/services/wifi.js index a976661ed..b12952cf9 100644 --- a/test-projects/02-app-that-excludes-mirage/app/services/wifi.js +++ b/test-projects/02-app-that-excludes-mirage/app/services/wifi.js @@ -1,7 +1,5 @@ import Service from '@ember/service'; export default class extends Service { - isConnected = true; - } diff --git a/test-projects/02-app-that-excludes-mirage/mirage/config.js b/test-projects/02-app-that-excludes-mirage/mirage/config.js index ab35aa45a..ea9b101e1 100644 --- a/test-projects/02-app-that-excludes-mirage/mirage/config.js +++ b/test-projects/02-app-that-excludes-mirage/mirage/config.js @@ -1,2 +1 @@ -export default function() { -} +export default function () {} diff --git a/test-projects/02-app-that-excludes-mirage/tests/acceptance/modules-test.js b/test-projects/02-app-that-excludes-mirage/tests/acceptance/modules-test.js index 8382a9dd6..8aa58e9b5 100644 --- a/test-projects/02-app-that-excludes-mirage/tests/acceptance/modules-test.js +++ b/test-projects/02-app-that-excludes-mirage/tests/acceptance/modules-test.js @@ -1,11 +1,11 @@ -import { module, test } from "qunit"; -import { visit } from "@ember/test-helpers"; -import { setupApplicationTest } from "ember-qunit"; +import { module, test } from 'qunit'; +import { visit } from '@ember/test-helpers'; +import { setupApplicationTest } from 'ember-qunit'; -module('Acceptance | modules', function(hooks) { +module('Acceptance | modules', function (hooks) { setupApplicationTest(hooks); - test('only 1 module (the no-op initializer) is included in the build', async function(assert) { + test('only 1 module (the no-op initializer) is included in the build', async function (assert) { await visit('/'); assert.dom('[data-test-id="mirage-module-count"]').hasText('0'); diff --git a/test-projects/02-app-that-excludes-mirage/tests/acceptance/pre-mirage-initializer-test.js b/test-projects/02-app-that-excludes-mirage/tests/acceptance/pre-mirage-initializer-test.js index 71e735f0c..54c39b6de 100644 --- a/test-projects/02-app-that-excludes-mirage/tests/acceptance/pre-mirage-initializer-test.js +++ b/test-projects/02-app-that-excludes-mirage/tests/acceptance/pre-mirage-initializer-test.js @@ -1,8 +1,8 @@ -import { module, test } from "qunit"; -import { visit } from "@ember/test-helpers"; -import { setupApplicationTest } from "ember-qunit"; +import { module, test } from 'qunit'; +import { visit } from '@ember/test-helpers'; +import { setupApplicationTest } from 'ember-qunit'; -module('Acceptance | noop initializer test', function(hooks) { +module('Acceptance | noop initializer test', function (hooks) { setupApplicationTest(hooks); test('visiting /noop-initializer-test', async function (assert) { diff --git a/test-projects/02-app-that-excludes-mirage/tests/helpers/destroy-app.js b/test-projects/02-app-that-excludes-mirage/tests/helpers/destroy-app.js index 4d885ca71..07753ba46 100644 --- a/test-projects/02-app-that-excludes-mirage/tests/helpers/destroy-app.js +++ b/test-projects/02-app-that-excludes-mirage/tests/helpers/destroy-app.js @@ -1,7 +1,7 @@ import { run } from '@ember/runloop'; export default function destroyApp(application) { - run(function() { + run(function () { application.destroy(); if (window.server) { diff --git a/test-projects/02-app-that-excludes-mirage/tests/helpers/module-for-acceptance.js b/test-projects/02-app-that-excludes-mirage/tests/helpers/module-for-acceptance.js index 90a93bac2..68cbbdeb8 100644 --- a/test-projects/02-app-that-excludes-mirage/tests/helpers/module-for-acceptance.js +++ b/test-projects/02-app-that-excludes-mirage/tests/helpers/module-for-acceptance.js @@ -3,7 +3,7 @@ import { resolve } from 'rsvp'; import startApp from '../helpers/start-app'; import destroyApp from '../helpers/destroy-app'; -export default function(name, options = {}) { +export default function (name, options = {}) { module(name, { beforeEach() { this.application = startApp(); @@ -14,8 +14,9 @@ export default function(name, options = {}) { }, afterEach() { - let afterEach = options.afterEach && options.afterEach.apply(this, arguments); + let afterEach = + options.afterEach && options.afterEach.apply(this, arguments); return resolve(afterEach).then(() => destroyApp(this.application)); - } + }, }); } diff --git a/test-projects/02-app-that-excludes-mirage/tests/helpers/promise-ajax.js b/test-projects/02-app-that-excludes-mirage/tests/helpers/promise-ajax.js index 2c8223f7f..6b746ce18 100644 --- a/test-projects/02-app-that-excludes-mirage/tests/helpers/promise-ajax.js +++ b/test-projects/02-app-that-excludes-mirage/tests/helpers/promise-ajax.js @@ -5,7 +5,7 @@ import $ from 'jquery'; export default (options) => { return new Promise((resolve, reject) => { $.ajax(options) - .done((data, status, xhr) => resolve({data, status, xhr})) - .fail((xhr, status, error) => reject({xhr, status, error})); + .done((data, status, xhr) => resolve({ data, status, xhr })) + .fail((xhr, status, error) => reject({ xhr, status, error })); }); }; diff --git a/test-projects/02-app-that-excludes-mirage/tests/helpers/resolver.js b/test-projects/02-app-that-excludes-mirage/tests/helpers/resolver.js index b208d38d0..319b45fc1 100644 --- a/test-projects/02-app-that-excludes-mirage/tests/helpers/resolver.js +++ b/test-projects/02-app-that-excludes-mirage/tests/helpers/resolver.js @@ -5,7 +5,7 @@ const resolver = Resolver.create(); resolver.namespace = { modulePrefix: config.modulePrefix, - podModulePrefix: config.podModulePrefix + podModulePrefix: config.podModulePrefix, }; export default resolver; diff --git a/tests/acceptance/home-test.js b/tests/acceptance/home-test.js index 2c40847eb..71f984cc7 100644 --- a/tests/acceptance/home-test.js +++ b/tests/acceptance/home-test.js @@ -1,17 +1,17 @@ -import { module, test } from "qunit"; -import { visit, currentURL } from "@ember/test-helpers"; -import { setupApplicationTest } from "ember-qunit"; +import { module, test } from 'qunit'; +import { visit, currentURL } from '@ember/test-helpers'; +import { setupApplicationTest } from 'ember-qunit'; import { dependencySatisfies } from '@embroider/macros'; -module("Acceptance | home", function(hooks) { +module('Acceptance | home', function (hooks) { setupApplicationTest(hooks); // Ember Addon docs will fail for sources less then 3.16.0 if (dependencySatisfies('ember-source', '^3.16.0')) { - test("the homepage renders without error", async function(assert) { - await visit("/"); + test('the homepage renders without error', async function (assert) { + await visit('/'); - assert.strictEqual(currentURL(), "/", "Correct URL is shown"); + assert.strictEqual(currentURL(), '/', 'Correct URL is shown'); }); } }); diff --git a/tests/dummy/app/adapters/post.js b/tests/dummy/app/adapters/post.js index a64eb105e..7b59fea59 100644 --- a/tests/dummy/app/adapters/post.js +++ b/tests/dummy/app/adapters/post.js @@ -4,37 +4,37 @@ import JSONAPIAdapter from '@ember-data/adapter/json-api'; import $ from 'jquery'; import { Promise } from 'rsvp'; -const BASE_URL = "https://api.github.com/repos/miragejs/ember-cli-mirage"; +const BASE_URL = 'https://api.github.com/repos/miragejs/ember-cli-mirage'; export default class extends JSONAPIAdapter { - findRecord(store, type, id/*, snapshot*/) { + findRecord(store, type, id /*, snapshot*/) { let url = `${BASE_URL}/issues/${id}`; return new Promise((resolve, reject) => { $.getJSON(url).then( - json => { + (json) => { let jsonApiDocument = { data: { id, - type: "posts", + type: 'posts', attributes: { title: json.title, body: json.body, - "issue-url": json.html_url + 'issue-url': json.html_url, }, relationships: { comments: { links: { - related: json.comments_url - } - } - } - } + related: json.comments_url, + }, + }, + }, + }, }; resolve(jsonApiDocument); }, - jqXHR => { + (jqXHR) => { reject(jqXHR); } ); @@ -46,24 +46,24 @@ export default class extends JSONAPIAdapter { return new Promise((resolve, reject) => { $.getJSON(url).then( - json => { + (json) => { this.hasLoadedAllPosts = true; let jsonApiDocument = { - data: json.map(obj => ({ + data: json.map((obj) => ({ id: obj.number, - type: "posts", + type: 'posts', attributes: { title: obj.title, body: obj.body, - "issue-url": obj.html_url - } - })) + 'issue-url': obj.html_url, + }, + })), }; resolve(jsonApiDocument); }, - jqXHR => { + (jqXHR) => { reject(jqXHR); } ); @@ -74,50 +74,50 @@ export default class extends JSONAPIAdapter { return !this.hasLoadedAllPosts; } - findHasMany(store, snapshot, url/*, relationship*/) { + findHasMany(store, snapshot, url /*, relationship*/) { return new Promise((resolve, reject) => { $.getJSON(url).then( - json => { + (json) => { run(() => { let jsonApiDocument = { data: [], included: [] }; let includedUserHash = {}; - json.forEach(obj => { + json.forEach((obj) => { jsonApiDocument.data.push({ id: obj.id, - type: "comments", + type: 'comments', attributes: { body: obj.body, permalink: obj.html_url, - "created-at": obj.created_at + 'created-at': obj.created_at, }, relationships: { user: { - data: { type: "users", id: obj.user.id } - } - } + data: { type: 'users', id: obj.user.id }, + }, + }, }); includedUserHash[obj.user.id] = obj.user; }); - Object.keys(includedUserHash).forEach(key => { + Object.keys(includedUserHash).forEach((key) => { let user = includedUserHash[key]; jsonApiDocument.included.push({ - type: "users", + type: 'users', id: user.id, attributes: { - "avatar-url": user.avatar_url, - "profile-url": user.html_url, - username: user.login - } + 'avatar-url': user.avatar_url, + 'profile-url': user.html_url, + username: user.login, + }, }); }); resolve(jsonApiDocument); }); }, - jqXHR => { + (jqXHR) => { run(() => reject(jqXHR)); } ); diff --git a/tests/dummy/app/initializers/es2015-polyfills.js b/tests/dummy/app/initializers/es2015-polyfills.js index 274eefc05..ddcc1b26a 100644 --- a/tests/dummy/app/initializers/es2015-polyfills.js +++ b/tests/dummy/app/initializers/es2015-polyfills.js @@ -2,12 +2,14 @@ export function initialize(/* container, application */) { // Production steps of ECMA-262, Edition 6, 22.1.2.1 // Reference: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.from if (!Array.from) { - Array.from = (function() { + Array.from = (function () { let toStr = Object.prototype.toString; - let isCallable = function(fn) { - return typeof fn === 'function' || toStr.call(fn) === '[object Function]'; + let isCallable = function (fn) { + return ( + typeof fn === 'function' || toStr.call(fn) === '[object Function]' + ); }; - let toInteger = function(value) { + let toInteger = function (value) { let number = Number(value); if (isNaN(number)) { return 0; @@ -18,13 +20,13 @@ export function initialize(/* container, application */) { return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); }; let maxSafeInteger = Math.pow(2, 53) - 1; - let toLength = function(value) { + let toLength = function (value) { let len = toInteger(value); return Math.min(Math.max(len, 0), maxSafeInteger); }; // The length property of the from method is 1. - return function from(arrayLike/* , mapFn, thisArg */) { + return function from(arrayLike /* , mapFn, thisArg */) { // 1. Let C be the this value. let C = this; let T, kValue; @@ -34,7 +36,9 @@ export function initialize(/* container, application */) { // 3. ReturnIfAbrupt(items). if (arrayLike == null) { - throw new TypeError('Array.from requires an array-like object - not null or undefined'); + throw new TypeError( + 'Array.from requires an array-like object - not null or undefined' + ); } // 4. If mapfn is undefined, then let mapping be false. @@ -43,7 +47,9 @@ export function initialize(/* container, application */) { // 5. else // 5. a If IsCallable(mapfn) is false, throw a TypeError exception. if (!isCallable(mapFn)) { - throw new TypeError('Array.from: when provided, the second argument must be a function'); + throw new TypeError( + 'Array.from: when provided, the second argument must be a function' + ); } // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined. @@ -67,7 +73,10 @@ export function initialize(/* container, application */) { while (k < len) { kValue = items[k]; if (mapFn) { - A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k); + A[k] = + typeof T === 'undefined' + ? mapFn(kValue, k) + : mapFn.call(T, kValue, k); } else { A[k] = kValue; } @@ -78,11 +87,11 @@ export function initialize(/* container, application */) { // 20. Return A. return A; }; - }()); + })(); } } export default { name: 'es2015-polyfills', - initialize + initialize, }; diff --git a/tests/dummy/app/models/comment.js b/tests/dummy/app/models/comment.js index d0b08f3c4..a0f3b2a6f 100644 --- a/tests/dummy/app/models/comment.js +++ b/tests/dummy/app/models/comment.js @@ -3,15 +3,13 @@ import compileMarkdown from 'ember-cli-addon-docs/utils/compile-markdown'; import { htmlSafe } from '@ember/string'; export default class Comment extends Model { - @belongsTo() user; @attr body; @attr permalink; @attr createdAt; - get htmlBody () { + get htmlBody() { return htmlSafe(compileMarkdown(this.body)); } - } diff --git a/tests/dummy/app/models/post.js b/tests/dummy/app/models/post.js index 2e96ba829..587d693b9 100644 --- a/tests/dummy/app/models/post.js +++ b/tests/dummy/app/models/post.js @@ -4,19 +4,18 @@ import compileMarkdown from 'ember-cli-addon-docs/utils/compile-markdown'; import { htmlSafe } from '@ember/string'; export default class Post extends Model { - @hasMany() comments; @attr title; @attr body; @attr issueUrl; - get htmlBody () { + get htmlBody() { return htmlSafe(compileMarkdown(this.body)); } - get meta () { - let lines = this.body.split('\n').map(line => line.trim()); + get meta() { + let lines = this.body.split('\n').map((line) => line.trim()); let firstLine = lines[0]; if (firstLine === '

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

;VDrLp9810Kr~5=HYMikU3LlWg3%;$0~}S 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�CRgAb^zxXe^ckPGp-j5 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%0A0XIJnp{|Ebuqgr6B^t745X}7_X^Fc z`S%Ir-eBUGgv-;N-c5lMc{*w)AWL8p>895ErF>f@TJ5=aSsuYUCf&rg?f5yMO`mG( zb(@$R%T}Gi%+4G6eH(3fi;tGeP$>`2TXd>X{(Ez4gFl<~BM^iB`8V#lu^&Lxahiw` zp?BMB9A*5;Nu5)f>lQ=$M48sKgR$NXR?j|fAa9=ElUv^$x&6_!H9~^rZnLzEJZ%(t zsO$CNm|oTtezvohYeSopOv7guJ*=k;pg%U-t-5#3VK*P8p zUdHw?O)#+(;@1i~0)46^yq;@|Zut2^ZJi2kc;8l(_Lkq-BLH+e_;v38)wv%~%gbz(R_ zOuHx2rEeuEo$caTd0AXnt;OH|r4c=OhDrOit+(05>A8MFxrScRCUt0eY;M zt85hO< z_=(?M>a_hgD^DL!L+VI4`J8Lfq;gmjCH+{2bokC#KTXt|(&AUljd}yfeREukIH%Ea zhqeFKkn0->*l;=fe!mA!i~0(K)FXVDr#os_6AgJ1t&$BPgXKsVa$AfzJ>tcdp57cQ zXP80hTof;LGz;u=vr&dUAt!bYw37tDuPZ6d+MDNMn)hKh;pz$ZSt%*c77ZD@5nNWE zIftEfvv$Pg{344ze|^mm*qyGRf<%La>~cV_$MI04(ca#mz5{sCBTKVaZb$C6{icw9 zHStXJ&rraVu{yyZ`~$r{y<2XBl6%=|zE5Gh1vcJIwR@+Pa3HkA>TnmP@sNN>X>7>w z=Kh&8iY?!$!h)45RzAzUmU$R>Qlp+ zzx(*=$A6@gbca1iWo{pxdUxFGCU3sWfSvfEpPBLY=~hD=-WEpf5?DiXS_cvuB|8RT+KNr?TG1wEb5 z-(pu^-|k)RZ}V_!zhajiTpHP-j)86N=gdv&b^NWp{lD)qN zkskG!n&XZhe9k*+61-tdgjn48zhNxCZrk%rU)D8b@VLcmryw9_m=pAV+tz3@mv3Hd zc}Q_j@v(xhi4NfPH`H(cd#2^9sI@)NB|m3Xap<;6E+~UldHgL-2+6N%(CzVVANnS| z%xf@d^H-2W4h{}Wuq7|em`=qaBvv5lGcnU&nSN;;cgt~7e~|e|o7M&+5&Fsc&sbJ@ zLJr8wUBmk%F1@b8W7vB8wUq?NP@2Qhr!)^;F`cEOT^?ehx!dGOUC z+pv_IEr)dVZ!2oe$5^Xqk*l5?EJk#GZLuhAIgT9#Zmd?mk@b$-J> zF)#G#!y{^};R$xJzC}$}O!e}6Sl)2W4L6<1&)SR$ZgLM^)grR|;Wxm9=FRM2k#=TY_cz>SN%8=czjz;)-eyKTD>aZOM_o+jfS- z;Ij9JAz2T)OEiK>S^NvydxHqTQI+fO>p)<>oST&*-1j$sRO5I1lC5{8TKM_o>hZ^U z3NYfj%==ZEPRZK;vieZ3j2DoK89Ig#RRg3+zer$)WHMb1(rP)oH`rT#_MJw5fE9Ak ziq|tfd)RL8sqZNP-~R23|5?eX0vkyPRb7CTzJo}2G5$=)$f#7Rtk<)o*E%CfF8siS zIbdFCZ-kjwnL5p&{qGriz{W4I%E$!ix`>uN4RB&7v%FW{2xb$QOoR zu~yq%D}J=4D*ioKe+0~L&S^_7t_N^S!v9oypJ&}c?1KWn?ORb6z zzudTUAJC&DA1rz!?+yj>NQ7n88YGfBx~qx46vV0$R&=f6cWVI&g|j8OKlR)24KQ;7SQJKXvg* zXIzRkQxGYA+LL|J>35y!U|E*r*CN~E{!gv1LZR~{viZrz7v_Mi8z@?Dy328QsomXI z%paR*+uv!t41nzu+{I$kyR1(v;E@{JN%Xg0&GB62cJ4is5kJoX&gONF!AFp(l za|8eJu4?O3=|hfzaE0ZscvBs~!~Lb9+w&R?R*;$zOUZ(m=H$a>_YyX0t+>o5vqPt& zKQ)ham-B2N)U=9?wMt&!rSN$2gM1qwUYT_ zFr}^?<|8#3emnpx2jRC)ONHKSW(6(R;!Ewy_SMydSk15L0X2-CZTInepxfZf=o$|GQv*5fEKQ&$yg*G#*M4t~xkp zpRTTlJ!$IlqqyAL!*wm+?w~}f825Sw{mjVyU~>4BLlS*e3c2JnT<)=1lp@*j?_5%6igZ?#k?5L`5~Ljj6pbpCMTr0_dit zaG?Ca#W_R1ODYu_rBX~c;whPQ^je?FVUOcm0!Zz&S|whEy}Jis>$Zh{E;{z8^DC*i z2?N4Uo8bTa-rrXv?Hr#GKB;v1PqnpuLDaK9DWYrH~j!&L;bp0_YORSW9Z~Ia^J)4poeV-uUYF@Y^mh2 zIPPxB3W(!dzvf5imnrL(JMrU@dF0mD$|lN>@`uKU;`(ZH@4Lg5WJF)E*>?W64mWLN;>r4` znr=MEC9qJc`j%~J-SMIoNcqZmyPDue;|+T;Z4_3HmHWLUf#a!_j{pvP*nY0rW6Dpk zyYKfu`g?dxpWSA?IBI&&!z{gpMuIKg$Nl}$CNEdsIVT7*fCw(g%DtwXfK36S>;OEb z_ZOc>7MVaN?sK9x@GFCTxI_+bZxK}?qGRus-Sgry7OOsELx|8~wodR**rO_!g?~GG zt*|#7op=a0xsCwUzb9B_{its*%O<;_XVo)*wLTMdRwHK3oC(3 z`ld)Qh?&2|Q>WWp^=WCMjz2;Pe{bhuGpH9P)k67f7(9cOqK1~cAdo!VA3uR#`IlMp z;4fOB{a?1g&-(D%)c{;|v_<&zxkAJMu*Kcnx8`%#-<#4xjUR!eLq6{jm>zVJzGT)U zEOfeELtY+R_DVZ>-+@UY{_d#|q6x~XQ>XE%l0Rv6z2uz)Rv*>NkRGYzL#;CsXsx$o z=jn9M)U;()#ZMm_zHfi=+-fV0ziEbRRGP~xt&mjN<-RG)zioNbV-`gUp{nyxegoY# z{37OPU|xRj^@v>`r2S30%wAuq=U|`4Q^gh?n8S#({(jf2sS?gme)pe_Vr8Myy*5Re z48)~pZv)^&yjOaUPF3M4>?3MxCmY$Ht9QC6l#h?XBZE+dw%pIxb}kVH_6cGsTd_PSzH8ib zUH|6RozeV#C|hi!3)7NkMVHk}LL=xT?F&rWf2=pcTM(e!?le5`R+p-ffnXbzYU#(tZ2=JI!xgktq$o_VwAP)cFMJ-H{`Vq35BH?t>wD!*6E{@?9;-ZneHG7t*Vi&~W`#$*W| z%xl~pdUz-I8nn$%H5c1$XIB`O_eH0AEx@qNo+bJ7D9rgRYT0#`mJk+p) zKQx+`^!1p&M_ZzJX(v~GXO)6iep~lv8{8Pst?NHhYl=R~N7U|}Av`#J9&<4FY6=&1 z_8C)#4hlMbdR(I=&S&p!M1nc?y4!K0pxUs@Ctnz9naapM1?BEM?McIWZ?c|(YRHOatR^`*O zT5D57Ndws4`u4KVS1jD*T4?|8(%>fNc=DGAC&MqSNdrqCf7^4k19dV{F4~pp4F!QW zD~8qjKHN5*G$;VB8@o10&cEIZ2KoL$(Y~VZIk`_b2p+rRE3YpH&0K~bfoZYk>KUGcI0E*gVF^mYmd=M#I?LdQ85vu$Nj@lKMk9;X$wT18<3 zh3Ul|$4b>j5Sy!yl+Fb+5`W@+x;`+7jl4^D4_KOT!l3x?Fw!KqQ-5!AXest4u=1YZWdXF^sH9cN(l}M57Dw4o`H&aEIkl&QQ_qdg-58l_7Oc>*aSS;jg-V^I`MN=oZ~3FFa;y&zA0D$vP0TA>{R_<%T?d&nyf0jtW$|=y7#$ob}w4({levM}Ny5I|PPrI+)dtmW6%ayjvVD z+>P40GKaxYT-+ku9o zqt?~Dtg8O5{|;U-8xQq;bV3M7B3k9XWnpmrKrdJa>dz@VQuQ8FF7E9~Zux>B_El)0 zC0T$RNGq9)A-bY6lQ25mo>HR@q`e&*qB5=2=eKcxazTp1qjJoTo0tHTUgMN8^b#^6 zAa?eg&GuIp$mU9i?D**N*d`a)q;zYHh<)=@pE{sWZHE2HtJy9uAmd2dtHIydBczoB zmtV0e+t)3pV#%DXwtmH1?s40;XE`5EOC)*$<(Vk$t44vH)tkYS$cgK&s6e8h-<~H= zzIfrk1?=oAh#HD3V15fXWvJy5Q#XGVZJqXpz?)v;?Pz)QezD!6$9X#Ck;S%65g<00 zM=b%j zMQoh!CE=6n{wdviXW+zr>R_N&WeTGD#?FXacW1u`+!$zk^2tNbbtjJl&2!U;@5$T* zUD4#XHT>3U5M|Y>9hH2UE^n#l)M^K$7;bIg?IZaoYTfLWq5K9vJm%sJ(e10;N0I|k*=U|^pxpDW&-*?XX&sJO% zFo!J7{)(6TWzZs~`iw8R>e4D`e{>p+hIV${*XrJ9^%qw<3mqb@*bcQ_l*XNAoqB`U zGnaurng2cJxytQ;AxRSUnaOqI54hhmSYMy%pL%mPPN@~FAdw**eg}%PEB*K*n=k4z z15pA(4X^gA+fyPqxdu{OwK50-_`OE>oLp{Gu(i%6w57ni4;gY^7haU9SFzq|%Rjc! zQa;p|JZsNpJ$8-H=k#$h0u%d}X@U{`O}F}$g|m;Wf>O>_hi(%lX5y{5SvTL{a*$L_)fqjY`N=iTMRaX;*`Al|W ziAY}9IQmY3h(w}03Q^VRRuV4*dQ;Ja{6Dm1Bhcf+_szH4MAqncv&JPT7sP7NmZ%_1*#i_pH=mlb1s0ja3wC|un76fS&dEI z0udto#fF6%!oK;ITD+b{x&4(?rp0^5$kZU;n=tY9@B;1N1;+tB#k=w8g%fcGI>LhK zYa_juvY!h2c1>jaI2p*csfM)15dOmN1kLgOl50)ZxrGnDq*>-LeqK2>-c{vwYpp%f zBF=uLgU<3oAurXyIwxrt2l?EyVU(g{r9Y?HC%Y@C2isCtpYaY-MIQ&Cxaq6*pIp1< z)p@0LX0}vl^2Q0(J~vR>lbj?x5jBB`n{)d}QMaM-&yQ7NI&D_-xW!^;FvK0vKbIGq z6DPdX>-qDtWfUD=Li#$r9S~>)} zA#<6OgzNO&l@HU~cU))!E)paA#nOk^dt97Jg#ISsA{_Te?X$GEddVS%oj5ddgRaFF zODf;>ZY3cPK9rK|0;hzini3J0k7m-`6b$5F6*D&u8XWHhx>BDlx9~Gw>hyM>kI|sXMgiv ztq!eQseMQ)n>l%}T*z(Sqz8@Hdx%BYp#CRBZ8km=6zup;n{HKHRro}1(Yq~9SzZ%CP5Z~xd<>|v;gS0-^iIpGdVkYn=YDQ+ zMCoflTt#=9pLI?I!(N1wV)s;Kn0?*nZYgRV#?k-5ggR1TwEr?RK{_!)$a7`Bf?`qzN+ z(p7K0QRqI%c_SUIWKMRgb#NRvYn|a2`h8*n6DrKb=OzALxKa1?BiWr4i%M-5YN4<^ zTMgJDAK8Vk#4W+!@66BXi%R!y)>zHZ%Aiwvx)T#6tLrH?tx(C6yPhE4lu3t{;9fGG zGDg6xiz!j5 zRj$5c6B(%UD%a~Pldt@n-os#Xm&qU^1J~kv^rhxquedFxRj2o@ESBMwFD>hdS^o!Y zzuvz$=KM{=Bu2(=0Nrc9xwP_j)uKzNTlSY=upgDozPH{t(PHyv-qzfhJ+woJ%U;eF zSuwYcwcHbVas7Jkd?`#CwQ)aXlaF?VQ&O%t#Be0t2Fu~|?9H3n*_y-&n5!c(ffR^A4?fPdUN62MI2l31S%B>d19 z9L8CG3g_qLRj9GzZcMumJ^le*_Q7ck>l^h+|6-R*`k;B8bOxXk%-BnCy8FaB*=Myp zgfYVu&K#h&G)&}k#16o>V6&mYY`crbSe9|)#TIMJ8N?nS&@D2Rucl> zTWGs}`Zm(CK#cwoL81N`JqOzlw*x~*uet=&^dQax5V(}`w-;>DAT5Ay7hjNLvMrDL z+ZD_eTD6^?@GJJ-ERNdrAYD)}hDK)Zy}H0kccJ_er&Vt)rJylmbGe`loA+&P$8XlY z^!3d}{89&Y`j^yN1_N+-w#{?Z-z6S>FP?iVzVrtPLEtTR0pSWIo!}PlGjU%Tn{|9@ zG5xtD13hEkf8JYm&KaX+O=F5fh5kZ4wiuMFftg({-%I`lB_d6qyrti;e~^lKfsXxo zLzF*r`mM>oQH{fuk~4nygke|zvb%+7zc6B7ZqrwU3X}`%c(6lo~UNC5hVJ~5Whl2xvps1f#BXn`(_}!=k++8kegnohTm=BIAv_mf1j6LbG(=y zF@=F>wR*W18+f|r$}I`Q+e6vht-xA)-7JF} zbKRGZ3_BcZCqwBT$|U+-X-MRB7_GTbF3f9CDeabV*@Mg?KX}+ zYw@d!r2Q><&VNFv?_@)5SqhhOIqA-Jj1bQ6>3*rB0uZcgy(zw@ z)%D3(*Y@jt2u{AJWFk#X&~v-{q)d)cWUT35a(SvKh3RpaG04+;e#L&77OU;EK-BC7 zeJtBGpM$Bj=#HMzceu$nMP4>gGV8sY%5_jr!@sYxEV#x5faRG@pQ86hdmJeHaU71; zyWy;9Y#6z}4A(}xQ*HZMDfpF3(W|eHzeu^(JQ1aP8>aNtPY2GiO3Pr`%iNzn2^PDw zgohKGQ(L6b-;FHV%cNI>^3{7~Z@N(M4j(o2?ovo@<}b&<*+o+=Ya0%>H*9~C6-nZE z-my7Jyy!BT&^9OA=v{{iyyf&i^HPgGBoD7q9(UARvd6j6ue!sk=azRIjE~{y1xTWo z(Hgd1#re`y*W_t|mYYBZJ2ksW_;&#vchQpivle9k)MQiM3+wkR!3w5nl>uJ_Ro{=1 zelPIqf(#%^(lS=wE|+mb5oMq|p6~SYcbGu(_IIIZ$8!JSpyW!{_cv|c?k2;;bXD1g zRkZcWw>q$M2I(VA9H%D!%8nc&Z)0W46@h7=5+ygnhkxba9mvZ#x&DQtJ~|}S4YKB` zwaY1mVV4}5qrg|>z+>a)Yv>HZT)_#PU8m#i4D$4>-2e^#lvauO?yKC{7Jl01C_vKA zgD~beY(?2+JNfD|Bp`}{^%q6$%>63U41Dh1g8HCXfm3wgL*K)&;rpN6xOfS_1?y`rTUm+*${LYs7c>7oNjvFYv$bAWE&plZ18}kxo@@ceLpPqU_qR8zuQgZYS z=nTsdCq+Z!n?3hQTpPpWie%>G`K`Swhv~HpM~^EuI(s8`5!uJOC7!37H$=9NSH$ZZ zgu7wh$8H}zU2#et9;b=^`Yc;2(L_ zHK=(4)93LA0n8;YDrLi*pxf-W_@s7GAD8MMq>e5SOOL>~4E)C`()oZ4HhAgH)@%Zm z`$M|yL&wLo*{A>(Wc=Y~70`xGoA_S`W_>5z_kx`X9`G}9bP=;9D(Ma?%4oSsWiH~s zd8^5A8=cP*DUd!%CfBNv{b-ZSKwk>{)D>^M2#rgGp3* zdzryoNzUva6xS>sr}0XSd5Jv#0^JQ>3y5oeW?FmdJ*dC!z7orS4%0rmsvJt6cL4^wr@h zznd1n&H>sI`9^D|jdn};<}>!HErw1s;uWEEST)FfxYU7y~&RUL#*qao|v{l1^ppbq11}J zeVRSZJR+Y=f3ddu4F~zn($3+pr>^QaF;+<;rC5c%t}^AetofIH7t@KbTHf>W4lGkA zd$Y**7oFgL}jFUPs~ zC(UxCMG_ay%w`-A2eV#N77*^Xa;yJP`LE$-T3x=uriBc@kaar4YHhFD?soQoF8s3$ zZ40yU=iD<3sdbyQJ$KEpB-0iOKt#!#wbsbrZ z>*es0t^10IPv}B#H`rAUE~jxe#6s-NhLJvzpCkBA1pP~Mu>G3d!Vm!d7QtjHHQszxH6_tFo zW!h~zXnU8}I$!eyrzOtNirnMORyjA3g`503F~2}w#Giup`1Y_cZn;SK)NwYVdOfGt z7^o936bpVE547VnTd-VSsGS{9TP{#T;7&3mYO{*%k`-g1PmAxdOu{^w+7Db(8R+OE zH`=?YN6vRelor>)XwiE<&3)y(c*Ftgyw=@Yn1g!npChf7Mj*Z(MM(dF}*x^U(ccjc`zB3zc!yn!VDx&ua11$f9Sa9xu z&)sIZ^p`QBMPKsu?PtTW_uD~1xm~R<-v2g`)^N^&LbXDJRXFWDbxEkbi^5qeIv1^+ zPoU&nM^{VeRQ-Y~dwEOl)`-L_0>nQ1w>9;)h#PYB|x~MJ0 zvCtQ?nJ>LLL~wke>id9^9gR!`_BN%xJ6ESxr@d+@Us!Y6{;OCga-iPZfIj`|4~7r| zEC|CXfY^;o+SwfznSg&HRRtyaRe>K~zrF5{W3^vuzjLDNY!+p5<-;Bs`e=oJ|FtLM zBO;tKf2xk={$zArr`60Y`fD_~C!1vRSseccAg}+j+EK}sUF&jN^Q+|3WqWz=p9U2^mxI|z zXLIQ}z@~(?MykTX$EX;7?(NJm`hWNOC||er_M+Fle+O>Cq#-c7U$TgpXf>ji^Mgz~ zcwbakNqWJSDi)5y0hQZ$?upSOn*xT`s&gqqnpDcYS*je{H@-Q|sINS4HePyhoa| zR7d^~|7>qCCxk93VUTHUpAt;9()u|sKIQRwt@IY&4Qrg5F8f$cmFu@&K8C+kicaOR zLtX!t(b7rsQkRS}e4pnV&9>h`|FXflpkydzwX=CB!Vhvfw2;pTrq;bvM*y@#@pa4C z;rF7vYhS;7B?Z|R!1@2?KPnLddh#&%gLQK(_MA=`?WHjSW<#=LJwR#e`(W&hpf|uELCz*Gf&E6{&v}7WKMaehtv64B~sH}UP z9N3P=p0(ei?%vzSX@?UYx3x+LM|XqZ+fC)*S+#3z{MT}cl0I}6yW0Mp| z`R$Hm-7El19MT=qe%I>-?LvZL;>01L~iZo7Zg z_=tK9D{P>~;Yg8xw_>b52bH3De;bYfAkVi#z7wY0dI-gR3KCwRYcE*HkcL!TC2mQ0 zf`pAmg(go8m?~T!TcJ?GdmRS<4OMPYbSL_ve%-~Ti_?7+w_1PNqV|Bb&M(DvDW(LY5 z@zP#WYfrG=enIIQN!kwXY}X09wH@8N)ueL;U$@)mPWiK!KW-P;D>PECKZp+atoe`2 z^dQ4~dvS|*`o|j$gs$_S4u8u3S6q9Xc>#K=Z)Ig&Mh84WcJAOQ>5P(%UX<8EHz;q;AI*V=Y2m-5JgZc&m>o5>y~_oO?Oucpjc-tE`KIef?7y$3;l}fL8l*d7v z2$Yo^d8n}M?>;xrH(%ZHX^s0XwQt~?KZfIbXY^x=`N0m^Iy%OUE(_J9@ zcJ!UKCa<^a=b!gQsb*tW$Ec{xy`Fb^!-m^hw>qQA4EbF-Cz$XX^?o0YM~|yEBw03a z^XtC?EE=7w+}ssz_Eh+8r~~_Scu*0%R*+q_yU>rf5?@J`UqLl|oakNacw*|ke<(i^v~^+Fdo+g} zFd`nCPHTBxRqDgHkDh+$_;5BiJv4Zqe(F?NYdHCrf_tbG)DHXm+vJqb?$-M3U&61v zh6sD-GJ0k!y<6%SxFt_Bjz55!Cr~Gl6KSnHa9Gi`U{6}uddx|A>*UARhiZUCwS5vH- zn+&Qu`(hrE=Dj?#K__nV#j^Pv0)08*ZkG!KgW``-Eh%I|E^#WJER1&*&g8)y7v`tF z9aHf)Uza(UD&)wpkdOy#I4-`=r_G6j_k}wqUlEz#8SB2#tP)GoYLPa)zvYbMU*mW4 zdU42|R$(E9t)5TE7Ra2}rg9eJ38Svzv>Y3M&nowJ`Mzfe`t)t(vrQoL(}vip zzhZx7gf2(|a>6bnae1SkXFFInGO8$oJ?BDwy!NE;o0fzPwOMqIDMwCc0N;8pBMCNR=uJ|F-NaMBZ`*-qQ@xRZK7Z)eL} zp3Th`hFEHRoYkvo9^{(B?Nm8e%~qyG4UE6$ENSP?FjXi7>~TZJvj;OfVgz+;>?E#x z86|*8oX*EHbdcX|2i@WJwcacGqHI4~#$=L+ba!Ho?{V(Ub^FFNuXtDA>#ukH{%$-g zWzCm0FwO@Gf?4yC1zH756njy6U~`#t96-(k!QGd$kB$f}$-3v$5l4KptZdKQ^Y*lu zw(AXHUq_bdvSRby{*OG#f~M9%O>uj0yT7cIc99P zM)|*E_Pv8564Pr54+yDjSZg1eWRsrR~*f3a>s)m@b=qYC>_j(&$j)R&dmuNtzK5K=g{FCF~*%VkP=(^(d4H}l*KEM9Bn zXK?TLvjy6%&N2xMZ@)fB(6HY97Zw$@QX>1ajUK8f-Lnn7KQQ5tc$$^e8_h?6a%=>D zvjS6JRRh4LIodsHxf{9OdhTf$$oc&7bg3!`xo}qC;k}fIY}M>EbH`^-T+A9#x&mY0 zS$ogQFkJ5L^wh=01g&dS*_duyic&xG`+N^jcrEklU!e-_X&DPWYH=sD{`M%fGpjH1 zIhgR_WOXcLm8Sp`65dyN->E(P$)JM_rhG={VhQsxu`$mrS1I!SF;o!vO=-C0h&3IJ zN$;kBkt~7KJ++dVASV*3r_l`{{WoXZ>&+T$=ScN9E8zLk<4i%)6?Ed!!y8=M&s1Cu z|Bl8x-Bn<+O34+042+;|Bls;_q0h&F**| zObUwHsVOnQ{g-8wHfm$jYWqd*B9OqIrn2Yrd}x9WwtD93FQU7>Zx3lOUQsP|cCn7R zMXPu(G8O!^cu|}Fr)C`{C)@GwOo~GiwAQ+)^(_T%4wV{fx5L@-rXay;@F#Ebmifx8 zHoudhi&vseuJ&&$YFx0v9Jv%Cwu(}PX*(vr-w_JF?c1_@N|46%`Vu|d;6S_#{O!!z$8r{mpXB!|qpD620KPA{Dt&=yb^ILeM z32?0Z6hcZ)*L-x@+QT322i0PLE!_cQ>!Tqrc@locj@U7VOY}#?Os+jg+FVdpYmun5 zk4-miH7?y_m%*PKFYUsFyVmmi2k2h+3mCf*_qL;GS(NY8hYab8b{}X?c|c!n{MPJ)5$U(Kl+)wx258G^6#NUcw#WxoVG3t z73^exen{Zyy!Kz%L>k{l3ecS1l*l|5l1@cYsmcxvRm+Y>LO9_VBX<>n8UzIhRSN0c zZ8aqsFF!L2L7`8AW5G67VSLTrB~bZwUyZVQXmLxJTL!h6cxYO*R4DZcTyzKG$%_7Z zewE zk8>0c%>i*3f1rkGzqG$`;RBpu_fO3)yJl9~5O=zP1h-L9Zh8!uvizTs4>>d&OP04j zHw7Trw1s7ocS(m?Z@sd&36eg`0=*$VC7gsKAYLwm%&En4WPgc5|I*=J^hZcv-P6%r zzd!|ULR7|i%7$+IGzLQHj79UHa~$@29iJQynD^(Mb<%s4Du|Q!Hi_t?Fp!4-$lpyE z&JLer5Xa8d*`HNP3-tz;)AvpUym8q9>oMk-IT<=ty}K>r+eb+RVd7>~t7i)OsU33` zIPb5m&nOt;d3q(>+p9Nt>GsI|^tHA^@rfuuXKr=3HKWMl2_2$6c_)A9Mds z%k_DL*V~29So41RyWhF; ztxe6fv>BP{cll^Wt;(r!{PIX|%!f1#Nm|4%S>_+$<7@s!$z1$4P_eEo*SjMnEH9WW z8BzGUWAKsV;h$EqAqU3BP@^fUaq568HS@`RXH%Er*XZ+^wX9z*bf7uipqKW!#c!1a z)gIb+dY|_CHRzH89T?h`VGD3)E|D;>R-h-{6W+*j!d}|uUaSrgIqXgJjcY4yA zQD$RXJH5417h~wHbLSyL7edTctw>jdmt_`%yBUFMsZDgdJD1$TI+cU zs5^IIUoH#Udn*KHW6^%~8lDy5$;s$-MvP*T{mQ-)PS;`c7e!32GW?vBN72ChMb6D1 zK$+1>ck{*-8N5->K;$DC(aHzE2OX}wEM{=RAc*$Y-mQpvh)B77uVN2?D7@Nu7mqRT zyVj{msAHz^qXYv+5we`^Pw1A+PG>POCQ7^K6%=gqw~hTPLau}C07KYzcPbP6Ad#=psuzT~@&Y3KcQT?y)$0PXS1uFQ(Mzk&R zSGV#-r}*_|=dPuE7hZ+;K)hn=al{t*TyK*UEtEVo2@wB{VRAJnZ03jC<#gNS3VZB! zeAbuMaPdN{H@;iiOe@gSsdIbIQ9vShxqiwZy%Pezg3oU`m|B0#<*{@9G@szkTi^Rw zR1ac2zWw@&XD;^|+T)xW?2%{1%Ikdu2WZ}IzF<9D&KLa5T-b2Bmcw*;eG|1zva9}V z_L?n;_`GCXtqQQHTJgIaddu_kQ7Sow{A%IvOJo09@%Jj0GF2^4i87SNHX;Ij1z@>Hd4i|RBgOwXtCI-aX@kClVZ}Qm4A0Eqp zRik|dsCd4@VVdg(H3cPHT$!tp;DqYOI+q9fYIuWer$tQa)3>+(i|>=4sEZH-na$KJ=EwK`uv6%j650A3Q`n0= zG-uc22iLno)8$r&tFN1-w!j**-suwvWuwnqucYW+dnMO|$P-Wo(EMl7>feCy!n_(> zSlVuQ<30;>wi;kIt_2CKE3<78Etg)PSEfRs&epKibw{Jib)&Sy*uQ2@(O?(LsHMSe zH~J%2f7MIXp6243a52WEcJVVUsr|N9OTD}(sQc!a9Bv!iZfxD2GScW7rC%fyrOh1! zo%`a9(%10=6cOX=Ct?@Eyua*SQR$3bt5?EUiS<2%kahMx+r{i<*YoSxf>=1%<*_T1 zb~>q^pOvA&A1~zWGQ=9Ixw~$9JTb#IxUKEhR{$fp=T4*II?j3sQw3ytOQ&w!uYT*T zV5F;!$6{K^7B4*MpwA3)VvGGsD9`C9+qZ}Mkk&`*a`(|#8{)P(a7y*%^=rUVv-7RH zIE)(>JxC%qxRRIqN>W*C)at(g&Sc(wSN2RWc@wSYN`@fA)y=LwE{mBo*;?kse%!lq zWt`KEpnj~4)0)3r)G87scCrb+`x{l1x3wst7)!YusU`-G?S~p}nuA+qGljhR+^oOV z!M_iPR@HuQ?JYAGoN8w?Y^~nF{3kX^g4grUvjug{JdJYW_$ic*b#i?^Zim?XQ}pr~P9!EDG zU(;1h5r^&LWV%T@oyD+o55zKYt<-n&ACTcJ$h{9cpZs*JyB$?1sb+YQ6-J90u zS1=n=u&(EZq+DB%;e7!jZtv!5{=>l{y?{jdg$?ECU<-u*kj znPRZbka=b087+^m?;~>w-DXTui{~wn?%kH5fbeR*u0!otzs>rzDA&veczD}~?cWYhX#Yy^eI# zmT-S}->?JbbG6fCMlHhNd-P1$%6CfFss3AMhlfTJ!ap}U(Qq770^)#m`sjaM)t^@@ zXMx6xq1(6XMs7|U)4J~@tOaa`$aMCLpt;6Tqp=TBih1FO1|Lkh5_&j$Ev5?eSn7#% z4C7;_Z>lgnR7zzW_AmYbFdOy1=(uk`%U!Bt`qhDe2p{h45P6_-gnRpO4ixMLG#qj| zf)H5h81AwHQx|Mm7wP??x~<&v`^J=$MLt0CVY@fjm@T5~VZ!^#E=QEmXi8wflRO|p@_SO_4}jFNpuLloL#=mS8lK@|JcV0(F&K%S`acaEGuCg0_^IWFwn2X5n!=?wRBYX$th=C%K`Hb5ozqc=0udljQqNOP;^2Tc!LKF^?Tosf&I8^Pw@r2Hsm z@+|>Y2f&(3v+i{yWVWx|cvybsmEPWH<|aaUhV|bCPy>T@6hl9y2ezb`lcGxHGrFy@ zZ+T!WBJ;N$@5FD%Q^K1N6kM-J(|ZqjhNxB{idMM7TLOEO5A~~UD7c3u{H0fH;Ar^# z1xV#@DquQ`qMZ!Oz-Lh-^C$t;>uoS7C#7(0qh@b`V|%h)ZN+wHH=L8$j8?*S=b^u_ zP{^bCUf}ac>AioYEl9KSN9TgZ&bg2Imm}@581j&%*>Veb!9MWiZhE5>c*eThxkw*+ zAfKYEf*ry(Vu;nch4zx>R;#Ht6i-ejsw_= z9%1)enARnwQuLhrbv3w*Pu)PsAxfnWzNB^t9JlAXq7I%Sx-&M5sMTYisI-^IRwqCN zmD(|q&(CH?yXH626Z`7(r5n#LM19-7+I_sRqTjF^?o->10MX1P<&NKmvpZc@x?0*d z#u*QFvZPpIx41_OTK>A+lrGpPpg6qP`k%cofp4uS`yQ)+;)@6fio60@nx$FVByH0) zP203h(=2VXHf_3O>6W%>(iK-w5fDK{5LEmCSp+Wn3L8y(4yR|EbCR^_y}g&TzxJ8+nP;9kGyi#J=FDm7X=w3xEEpF}xCN@!T~khT6we&i!m7FHl*^#9ZMq!M3H*fyJn~O1 zM-p*eb9~X$Xv`++lV;sw(PQs2=oZ>r8`^t%y8Grb)9!^pcQDpFKbR|eRQ;{CX${_g z>>i0mZIdINYvY;OrR+d+w%BdO*N88>+FHWP?#=w%(n#yvrbU7KezUsAGNkX0`RTJb`lZw!BcNwwl1 z>DITYhi1Z-hP-02XP_B>uF2BlH0q|;J5v48f;ACyMpMpRQO)zE-)#=oE#n!+n2TC-|cskJwmbW8Zn0L#i)Jw8e?zu2;%nO`#X zYJ>RI#a2)M^wQ`?a3~p7$0q&LnQlwKyQ()f&J8UYG4L5?GwSx{#Yi;SHV}?CPBr20 zjQSK!Bi>deeupB6>yn$pM_W=V+p@mPK0P?E!&mJj8j|?KuS+4Fs;?ulHq$)W);MQg znw=b;9@MNhZ>Uto=vv#rxHfNZig%BVC0f_<%Z>y6dVAyepkg*%FfChrsTEK6hThz) z$&6~dal4G*TV@>NK4U<+(!080O(}A*E_VaIcW!kO-#r~RG+FCs=IcW)bs`oSjZCe1 z=KG4_v3`F;K07cnqjCF}Hx#oYo5|_yjMd{Y1&sN2-^${;bzyZnxzyG;hKEEvj&)nZw`xOyVO6UCuybN8e;iy4cd>cf_*USofqVU};dz zC`T4I`@1(h_=wm-z9-~Yj`#aicFjQZxDp?eY@D-<4f{>l@WWrn?vAXex(eZ5yz4ud zn6x^&4DHIX_NGbvdb)i*HZb0^5*ha8mu)TfoK`u6-`rjHMm-ioq-A7IsT}Uc7jcCg z30423Gp4X)hBTw|>*^)^)#&DwLuK=AMorxvaXhy)xhB-XVp124kC~SHrq+7;@FC*d zd?2YEn{wJME{{4JTU(m(n%gx?DSay1?n-Y?F1tMan*~$Dbhf3z5Xv_9_2!G(b_Kqv zJUwWscdH$qRco}Zce-bGb{I}Xc*cGGo&{|}l~XG-9om*)VX7rr7#&}8=EI#fbE7(p z4}|A8hTFy$R?=o?0AI`*9c&+8P^R-){1SXTWu0#8%&cm{<9XAHYANDg$6wG=&sr`0 zhNXnH!GvEj#3M}O==9jKCWDvThvpWS`p1VuX8gWQr)IvG8}Bql)r(Ve_+-Y{+SF&X6s%c|Ml(7++tLuzj#^rV zz4(rZB0dH^){=``h9^zKDScbS>x^$I0!mejJD4-A6lZipD#OM+zUN)97+LX#jM~ji zhtu1k>6)8ui@Cz~p;mmr&N;uhp)lk-yVH)s&{%#^(P*C=_qExyNo_k`Az5zeo3)yi zNv+F081si>_Q@$vVqKLS2u{1gIpw4(x}lEDsHR7wo$Hq2v38HPaZ+zkb@Wc*S3-xZ zn!pl%)*bju-JP+hNvl>Ax(i070>2!iH?QUpyM^ zY;vskrHk67{^hQCkF|ZylE#Y>UR6?+!Q+_2Fo$o<58ijV+J;zeD-|2#XO8Zo?vOU`ogO% ziD{c_GPD#Jk9S9X_!*lRQw&b^CtU$u@61}gH_#cMi{K-zb0eW1l@0fRNhiKU$k1=> z>}g0?I{F3-4&!t}A0HYpn-Xzlud0Y&Rcvv(RSUT`!%$J#yRg!>(S$#GHlJ51o$D_A zC@S&!GoZ02dgls?(HVb7ORw6g4Nu#`*^Uucz}LHo=VN0!$FhII zXseej(n$nG^1(`4A1s>Ru}AxZL492ZAR^y9q3sf8lD)n_b;XcT@4+&rq+q^ z=BA`kX^KTARcjONou;L^aI-Dzob8E3n(Qc~ z@COVsJuQ>D3FXX;UunbdljBS5R$Wv08+zk-)@OC~x3#D|nXEGFak0@g! z5v{d(-Cwag27}{;mc@9#-sQtLFR1aE*{Od2QX~}~?ie@q&TsgFt=8a~EW(2=!9{pzkU zmo3mSuG*MbRiu|2@@vaF%jAM#-0GfL*i=R5qYLexu58{?m`*!~@U_I6P_T2}q}I>I zvj(qjT^F)7WbxTi+em|R!Whp*;)BBj>aqS6Q|p@2+Erh`A8*1hz@}yv*3+|w6}M() zr06Uz;Pd)M*YX(tLbHE!t}CZr=!uQkY_mfdLx*D;e{vu(+NH*yR~~D&*v9)jL;flJ z;lBlZ2Hxv&MVn@FqvPv3P5YWwU5HMaRV~T>g@|5V=yFDE&TM^fH5fM;`nru#eG@iJ zdOWVCPW+Cg0-s-6@$|-;t*YkG3_dbBugNyGWJAhMe4&`y+%_{{>30SV_{>$e3cu?X zSedY7EX8T7HWgZ%nNV~&+<9*%(T!hv4EO393J$L&Sg+7Fb?fzp$aJ#cP~w-KsjoJ)@{eF;si>(WcbLRhaeE+*V_{j<5uM(2uYpx)THt{=_1@@ZEq z-c_*0Y;6-QOUB;O?lF9LVMt@?v|Ae1@rj5@jom%m;EH?W4VJvJZMwO6y=|(~kjP9A z3@;bVv33{UDbWQt%=k9gqHf-xH=0)P+mDT%xuMl1PcE#?yBaL%aCkGao=uNVtagkI zCYEP)tBFCK*=!$OXqa*0wTpl+kn4%%`=(9!+R+VsVeIH++PfO|wola$Hm$A1-1{!LT!juXxR`dY8Q`olX9Q=BcT9=j>*} zG*zGI9P6LNBaC-`XwK=e>E~jL22G<`QAkBHtxNee7v3tjEY9NF{0r)?Xet)44d;vf z1I_u&pvTo}>l<$$D2!=`@E3D**$(_|tug#@yG&v^r0Fu7b*sJ&^=#ZTyc#g47h`zj z?@}ZO{RQ(%c+=f698=C&oAKt1MY}vOxP;B$kOqH+x^Z|`A4und{f4&wk}P!qutu->zYw!@%iLN_xffqIj>c$ zgj?oDqh7OZI?=O`w@wFpXOzPoQO7ubDc94LQrUg(Du5;j}N8(K#E2 zU9)SU)KEiWRW)NO%({9s<6fg~*xS(+U5^cq;y0-9n~zgN7#&9j)niM83kj{sHam^q zahQwL&t&z9RJT5cKLmh%C;Wu%%pxHGS||wVX-ZY84`An z-x^G3OnApn<;*pO^>eAXHrB7N+UK() z^X8mIziJ<{;cHOvd`z3l_UQ4IOX~E<7`}+a(YB~n4LOyw>mAt6u*_whBkpNqV|Ou< z>yPw#Wv&~)7BXc!q&FB+o0;kGstK0u|hOyb=)YswPK=#``XsU>`04!-SgYP@Nt z-iCJ*I-4Ro`$BlQy|Z7@zaHtB=+N5-yV_?9aVJEaGSKTg{a**)H)R?ByHpMMzwn?sBx$4b5m*kM#O=y zVjgNTbT}tBX0&(*z}}Xbz?Tc^Et|$!9X^mel}e@j=D>VAwvjVK`16PL3PWmXeR{KZ ztuIlmcLq#J#h`gIZ!l}DJ@~?_SR{(Kssd{*E0d1IYOg(T z+gNX4uql*FjEE=&y08nu(*Q0Gir(X@=$?Tl{a>}J^4y@c;+ za4fktuw~)!8iIii^RhP|(zzyl_|V-{mouwQt^{;`krt$U3E!d_W-@ub1lS%K2j+#~Rjc{72T+1k2uGDb9 zXDt=<8XJ@=9ZhRR{DCXmgkna4@1vRu4L5B@mlua4!;yJ=7d{88)y#(TL!o3qJKdMe zgx1aD-81H?bWb0?(RMyPnKdY8hLhvDRs0fA<5<_GQJIOj40wsHr&zzHP)*w>x|^0G zZq4SPG3|2r3?tK_4P8{>&Q5eETAGY0*Q9R=@A52qyXPlI9BcMfg?m7?8fl1ktt<8Z zz*M{0wV}gL;6`F`)6}gl=p*Y3nuM=+LZOVt9hwQe2=6Jbk54;W@wb>$<_6!UD{h{Qv|42|dSm^BT8tc~gFU5-E-R4&Fy1rXy^WaanC5P#bT=TaER&dS(;J*wjSFVz${hhj**h>*0}@$i+MWBs|AHQUn0bhn`|w`L1k`-)Mm#ho;c z8s@u|di((&R{$U6cB<#QJ;k1>sYuY@oYQKp%Y91xr3e*1DLC9|>{GPrgY)`~c~n)8 z7Y~=0yEZiT;HCotZ$s$5rnRDGjQT;Q`y~v_~6qcwDibkpYXg)sMf~usotKw)W#W zPgB%}abM$(cK0mcZww6=+Z3x4O08Kt-(2t5(Dyp#I+_dk)cZ)FU|#NMn(ocEYUZ4l zXwaey70pXsc7H0Uz~9vinp;fab$g~`(7xhKI_G*uHWy}FJ0c0)LaX2JigsX&Zy*v< z*&EjzHd|bZiS@-u($kAKsN(7dqu1V|3M4}KjII)YF+^|4n{%CxuwikjYt>?jYd8FA zb9N#zH8t7mGtL?9ktVfy&Aeh$HRMv$tGxs1rr{R-M6(Is_kdRwW(wjXCzR7kZGPDr(s_L=ZS{rRNNiTC*Qr}Z@f=2*oNTd&!YhuDJ7RFyEuF=YY3oq1 zp|jf_wWNb1t`>b_G3}~1bah5olpC?NsNI3vF*Y38%ry9?$2M2%yWCm5G8rE-_^6( z*RKp)mqzgG`i;}!^>o(S>6%;XiVaL?oZ6LPr=nqOekRhs)-Ye}9&iS_M&tR`c>Peo z)I8kTVjF8+9yZ}Ui}B>jX2XmvIiP6k$j+LB`qpB=v!+u{kF7;5QGC(y#I(U>UsEYY z2jfOfFpqEE$WCTvqCNPlIa4d+Ba4dqd7G)Bvvr~+7*`J~3QHRrm9{V+nCOj9w@(LB zeG^6eBx}Paj~jo(YziCC(Ya(~EW6rT!26muTdFhBu-T~`YB4sZ+g8$x_yq_(ehb4k z*AeN&H@OAphwSskNRwwVnsni>?!;yqM)7ULetcthS5Mda+_F7C7+VWOoADWvVyjg- z9BNc1OmmyP8&+E(h(EUCw+9>DJ;~V>eSLgB`G8^$-|#BhG3Z`{=GYj2z$7;@#XWf5(dP^Tux2Js!uEh&#r zZyk)d790KRna1SAs!25vQ>+`7mIi!<&d&8{bk>$ywl$47yRH4>OVMtpR%7(dPmhe@ z%gB9AO0CY>R~(#jb^AMF_`{<8?lzOY0lxr-XMGz3p-e}IrMo8+$s{`mRSVV>-l4MM z*8$CKZhVMnAmL1|##-h#TU2;!z@cf$Z5EowIy}9b7GqlF^4pqR>EVE5d8i?h99Ohz zvK?)`afNpiZ&xWt7cJq9W(__+)*tFox(6(cd3-`|*fcdAS_!QzHzx7E&Ae{7E#02h zDRtg<)%3(h-sdo7e6zZhVu#skn$x@EU4_08SHd{0@c9+~rorx_elccg-Dr0&B-<^T z<;7LE*)lqbt=DY3!L;G<<8#4&?`Afp?o?`Q=E0-`pK%#>^vu;S;9J9j-F8n$Cb+z; z?^Wg_`17Lu&W?%Z@amv8G}xq8uPR$7%--~n-QGFgGlnnn8J@x~v#Ic?5!dEhO>_7h z?BLv7x_j8E3mI$?PtiQ&UoOVg9{0N1s&~4(boy9!qg&T9+~A(VU-g)E1}4@FA-ohi zGdb62ceeCyZZ1bBn-ei_dv;B~VQU@jRj0G-_5Q9|eBZ=oU=ZKiwutp7i(T&$r11t6J`I)ws5xz&rNDV@gLIOKJjT9>?Dv&HXFx$-MraZNhi)i-6# zWH$%<2Jwzn=j8HaZ+szE=nC80>V2v}k7ja8*J|RuaCj zw!5dr6&}<35)oe_xX_eeol82M%LBH??o6)LlnV~^>TNdN>bh#lmGuqkh8?kWPvb}- ziBGLe;_E%boxMvvp4jH#Vt#3LxVUV{`KR=*zD?ZEre=nmkxslXmT#ZvZjPF~%l_b+ z&DO5$GPWDd_%kN$P^p#6wHl|?DRz2hSxS?_pj*9M(^sJ!mV7GU9{ozGBJ;5 zZOpS4?9jA!t=iI|sIFaSYpb6P;#uE(|D3056n`}->gigU_r|pY?#bM$Ww2voW5GK! zk#?EV!z~-_gR5~}WNxm1#coRVE}QI2+2sk_h9iVuk;FG;Cv|J)P)}Cf*f!ILZxEXz8D(};?E?R6?1J-U!#A% z7;6|@SzepO7p;z&RRejGvSU@f7+tsFS8!YB`!^N}U4!^D6aIeHRO{4im(q`C<2}~7 zfps6gbF6EAAXALQM@EfPMo)9t+Oetd9}N=a$!+ z0`*x{&gY2_ZEmDu`h4fqFt(pMR+H{w{H?37H?Zb(O@}i0lPVg8J3bO@jSaR8=e(|o ze4wv8R~)hgTHK3c%}pa?j?6l~Ok2~}J>EJR#v}iX7JqN2t8;u3Z;Rl&!h6P2o15zV zM8VUYX)q^@YE@d{8>z<^85v#u>ytxq{K=id`drxQ==Nv=Zi9N*-jgsi4$Vw?EfM!v zayr%(h_p-^@Jew(wHTfradfug`PhJ7t5d;^_jIDmU#W+B*_b*dE2 z7S&i|duDlH+}o+knLIs7ZQ43$9vf266n(j5bFNKo@VbM|c~f}2*Q(16Wk-tZi=Frj zc7_?1+ldeD)#J7CfIC#o_%;jpr4D!0)H~L^8t;w89QdQDbDIwJYBZjT#R6G(YPB=C zqEYF3Rg>+}+}vbw)3jvG&owm6oQD^t+&%|hyj?gavoYJ3*~oYbGbi|b4XF3VI)s0= zYQGX1NN;s)wQkk)Q`10A14q9GI<{JHf4`vC-z7%FqyGu0)$oO)fjcp-1GZmU>+QAP zUemx)u7L}1U$0^N3uSDt)$@g|fi%W-`0J=)`%ylwzp$V4TJ5*cr4+6MwzuFuU(-lU z12qjCts0;)ownP-cCYpKqqU`L^?KoI-~zk?pM2h4r*WOO-NBvQx)8_SS;P6-yuPM^ zqd)`n{yKx}QuKv87S?KB)4lijtmHZR=g zqgL~yQ3Drn*5etxzp!Sn9|gAB(fG91>a=?e@NM|o+T89nTH{dD!2Z<$Ypd7#`u=UD znq)N%R6_%oK5xU<_S&nV%^HuI2KKWCYUkwlbL-S(t7)LR8mPSkS6zM9xYabUg${1r zzjfc%z1081MIRxoxzp?M2M95>R;y{Crh%Pk;1S%@p|>CIKXHFQfZuK3Py6e%JRnnL zf5P#K%V#GoM(4ScBZrvFon^{c&I%}3-b(7uuQyj-Y5j?7QoRt6o!;x=p5*{pq_iNG zxiV>Xo4>NsN~eat4tNg#4>!GkpQAYG8~}43K#mGWEG{3Z=d4uA-N`$XAWnTDFP`1s zAjz37F{X0mCFPe2S+{;UqOX~AtnJX)KxA`k8t#sH^mZ=J@cTr0^@B6UTpr?F-1`CeX}S4?ZZf9wmvo`zTMO7Bxxzg=7H;tFvHYm@{ zf9ki8@Lhn)>&ajwQ@)tPPGu$a_nq?M*PFpPM&@#8dRKG$JIi?QLf97kyA;GSi#075 zQfdBD<0@aHawU`EptsXDJ1O?ih3ywP3Fd`<%LMylOR_X#Bs+vvCQR_&7`U%KRq@vlF&o4_Xvrsqk{&MpRZH_eOnSuRJ;l3eXN_iRB*hg_cr)_37 z>~OgDiyZQGr!kIeZ_1~ails4?%cuNrWC))NnwPjFp{&CB1(QSg905Neb_jWq<`N7) zY06+bTW?`nc&-ezCnQ&d+Ucz$4~45vPRbjEyH@8k>ik4zN|++nI70%H}QK1+p{w zX)2XBEl5XNOOVRDh2R@Q{BpoAtP?5!?IL?ttZ!02>9BJ0bH^sRz7C~u&s3FDBfeyh zZ11=8!w4saUqXxV$dl2=gYLOn9A9w{Iwi@UOs>D3GrC&$zY!!`neNgOm*tbKG%%wVyT&sO42fUXez8X ze20Laq7vWE?>dH`I>CCuRZeNF)4~&73ulzi8snVEA&#mvrGkyGnpC0}%lkbtO z>YTx2`0elaVxaB$HX&at<@#uBXWNEMz&D+U*z0whg0a>G!mm_rOWA)9uUf5K>YO@!5Jl4-&TX`HK56%=Q`l zWYdy*M|J8gen!bPh0sdUa=9?`6t+I3dUJEgyLT!F!&NRn?DMlW6qBPIO19}r*Oa`^ z4ez8e`|vd7;x~=!-1u@NlutvJLq5-;j}_u237dssBq@by_Hjdki^u5F5|LA|wvY7t5L-wZQ<-)7+I~B$Uue5hwy!Xr&CR&D?G60s zHW!`^XU1ru%}hV}z=N3&ke?f2K7M++dWfHwy{R`>emQxhRudR~a;Z=+)xdVXoZQk% zyT$Ubd*$WMS4x)xDOkSJ>1j*_B$rNeC}Q@D9P)Lojx8)4@0oth#d~nmvhe2tEzj?( zO7URj7h-!Q@3#vvXK(5)tgn=x(GOcUX_rthjJ~9E$j6BJ$)^{_iu1#`Mvra6w7c^& z7{WX^ByOw?PKrHrVf#f6`5HspvFjn=mQPQPW!r`3#q=#2hg7}gxUg|TJ=V!*W-O0t4 zz_{3Pg$WVU{j$%!U*r&Lh#Mlr%Szjx=Eb%PjoWOy3vpb!JZT<`yh0mTJU?eriqF&w z*TALaV0n~w31w!UdpXMLrZj&#g;0l;jTXXE#4-z0$os|lVQho(RXje+b1D@J;|e`) zOQ+l~n7Uu&kk%B$h;3o{^yFB!U4-o}=Fi|RP1$Fk!3-u|{OrJU#6Wg3}3l* z$^Ej=yr)uY%#Zl>k*`0^LyWdUJ@fS!y*@P4|SY~p*tx%YDOd6n94q%l>z-~Q+x zeiKft6Z(`-wa(m=_*W-PY!mK;uW-BORTp(K@HySQF_nZ)tJ(#r7* z>&?Y>IzNlW?3_m2151}B>;p7k`BOTyzJ&AO(lX0SL&{IGHKb|@`B_`8lv|1mBO`e& zoH<7)eiu%7etsu@();jaIT$JT3l-~rCz3JP&a|Bvzr^h;E=QO~m_jHkzyGqS$@}em znS{KmWw*0Z&@NIx*xB7PjBbS#_9ldV0TYAPP9rS?Zj^(>S}Shkd(FSoGXVwtxP$>xT$`$Ej+%P01U`;(N6!f<|{ z5z8!0PxdnsiSyGj^cc(98hlMLxncDM#t1eYJ;sau^79sk9~o2k2GiMj08=_k$#Ssq zaxS<7gths=&f(j*a(OF@6WYS%v;(vczb%Ef93Mw%iTLeFl2X|2!ZhVRCqh2p7b4u= z)SHZxV8=-5m9Ix(jro4|u10Boq;mLmXRw{$9;AGHJuh z99~Tup2j$Sxk5Qee(v+bzSqX^*(tU&`DrR_m7Unyd^uT;)u}gwbFAEK2|^d(JDZNi z%u;9lg*+HPeTN%~AH$cW!n64xvsex`J>WVio+(?LpNTmfl*V?j#Scg6Y?+nG!N+ys zj2)hHW{d?|J$&D(EzIxFT-m_QYM~OB5MzXSE5mmAo>ZNBSB7(RALZ+cuSa2x<^1Jf zym)VpUK8ibAk;hA&&X0)ota#FMR&6nUQL-Qk%Mp7k!GI4^U2lf@9=$b=AQUUD8GCm zkDcjJSiX?Uon^{O)*qi+b?Qy8L38Eimm>BFzvs@^qd0x35V{_GJDZ*pN@+nXGgp3T zHzSESKNE8}D0#pA&`VN@9PC&tw-3v;{g`zZsWv_I^{tgy)4-wEKqZ*Em(rCl2iJy_ zx5>G-AG;q9HkWYjzn3+u@vdoLzi42m``p!*zkE4Zo4oYAPR@3fn-^5Ob~S!A4eSRE zRJsOs6G$DC^yzq1Bkb!Xy9 z=U^+>hm;&bPVD}rFox`BZFhR@71qP~`=jK1wa}Udjy?_0m@3?FhrZ4|3;!^0Pnfl_ zA>Vx%;dieWvK(T*EVhf|$RV`t&c|@>{&9J81TybhXiWo0k_O0Y;dFmy@tc44h8s@1 zcVA<&9AduAd90nDNntp0_w1Rl8m(#I=+*#vpIiKX`&T&lP2)cNXVUFnM`Ss~d@ILx zF%LR~UE8mryOfS<;YXJS$e7Bt%W3$)j+xX?fiSocGFMUGxWQ+3HDYuHSRSH>`Vjn`?fpFyO+7h zdjsSW***82_fyvX-`U;hWXWowH4W@14bZmg&U?vT)ur71cDj6KuY9NVAiev(S2e5g zt!dzJX@Is>ciKz#PU=dqeGA=A-5F!VHl$NHJqNahv zp#kot*AGOe6nEk|`VaPDDQFB#i9w<=Fpb#+l~Zu0gkskc`j&-v%>#Wk#KO~{AbV1GiT>_N5xWCw%;z!f9OKa z-8u$8wa4J+1*op7Xug;*ig z$0~27^Qh5-<$s>!NJ7R*sq{j=WQ=9YW#c1Tw@b=UPW=wxK1bp!6}H>*K&ErIq7{`% z%Mz8DNdecL>rhzNa`aY>H2Zr^9_IQmhp0wP_mYPgQ>#^)5EG=wk-f)u7VAs(1L@jF z%EEM^KBa3dT@n*>fH>z7>Q%}gk?HYA7Piy+cwy|fGi|>&R5(^^F_u)Lq=*OyrLY?C zi-eg{>35GymG{5{JHS__PCM1-PB5J*lc7>&gEhpY*&VIMvr;Y(dVPMk?~0aNTKVa! zx!+!XsXIx@x2S00>+Z`B*bwkf25+) zKnAk@r1;B)lWVk-wGXCU_>|0lZ$fF?owN?WH|3SfwVM0w<(9d#bfhu9@~2Z+HW`spsc#hgW~UoqnrM{#?LLdb<>k zNcFYSnw8#YBk_F)fz^Kb_p3G(RQlBV&7IYw|2N)&*zuZ`3>5gfi2(FWOmOwh&Cr-uGN@~BIjjy>X(LlA{Z+~=)Z=3V) zy@zksvA;X%>sv?~E6TStxtfW}*qq#STz56Foy(8!K7f0mGzRk1@_l5vXq#WUFUi@& zeEvdTDO?mKeg*qzk58f)^>m<~OBCsL8}FqlE2 z(oZyr6NDX*UB8yfwO82AmPg(rfI7?d3aNQPsc}#mqvcAIx25HBvh@TP&4(W*^pV#- zgsF~HKdfxAHZQ-gz^t2lcD@?@eYgAVuo}n8%gFa|6?-|;l5%)b>ZxXUuvC66nN7!c zRbx$_&r$4?!gskka&eEVCoy+n2#k89`GmABeSnyr)~DR5IAO`OztlKQo_~;e9ciKT zyqdd~&8-28!?X>|9}BoC%XhOp%g@866w7=69`tj%JQAj}VWplLR%URKF`Bh~`KehS zIiHkGO~yc$o0Llm-=)%%%h8s3)?R8}AXS=F`f8nRJ!_(+#W5og{yJ4 zoyK+;UnAQq!btVf@nzHUU55hO!O9@ZCpDsx z_r2xj0{mK$u>BYb%Ry=`a7+cKfcT}$`;KO8=dN4RZtiTIi}|!$UQ^}7?sQF_of9xJ z?`2Piny@&|VlX$Xe0xy}J6XO`nj>SoRLMKHIl1*>-BRVSaW+)EYi{WDw`CJcQitmGjwcj)R;XWOgr^aqW~l-Io|!Sa|;gtbaovgZPK5GIy$M zzg=vrbLSpAt#di~$YZ<^JEbgJwuJKdu<7}($}soPV0&e23HQ6U$O^{f{A> zqG9vw&P8so-SI3hH{HL5*v7?Tu^W2-qxiSH5+D_`r%pz0=$-IOjxE0wCM7#xU_zuR zI}f1iSuGi)OJrlnwxtl0N@0u?HVOH#yX;ponBsgiQYX{D?Setj4pnFkZgQlXw` zzw|pTY|fp!$nCyUZsp{I{s)N4w^b|me}(G#<&=2n($H)2Fk6r>Q@pP(oOj6Q-)$@z zC%LvZjq~zPIbfJ@K0xwINn06??i`mYDTj==QZ*ollgksQ73&-HDfJGZIDh3K7imV>dIr7@ef#pSJ5 zb`4LO4?RaXynUXv#mTL3P%yWVuQi!RH9|>aJls%B8t2J#H!^;a_wl8k5Hb(x)Fiwq ztqoG0AdH-oEE74cR4AE;uwKyfNU}+BtwuPh-AOV?hY4%JN+sU!W^MJ|%)bwAfz2-7 zFK2E4!`0{I_uGZ~I9z>w3z2XI+EGV1cSb(rO|m&@4&~1e$T%wXJdtsUecH$_skH^E z6-e@YgUnkhw7hze>myZrsj?~yC$+n{y+~^>OnZ~%qgUc+yyfCC^utQl)a7f#toVt` zfimx}VoCCHFtO6uE}r8Y&b0>87!P(O*%lY0yR?l@!YlF0_7pUj1K-T8mwbmTHgZ6*~)(i^=F1y~FHkfwWyw~xrY4}K`u z@aQoP>dV(O8&2!v(43*+%fR)K#(26NN!TXD!2{U7XU2M#(qjVaXEB5Hgn%^VVIU(n z84H{=%_kXB96SH0-rR;;N+oW1(uB4dgFV7<@blZ4^xhUTB8d4) z<5hVW$kdCBOXP2wk?Oz==wG7m<-On!2G7(Ftn%A=(A)DfO|ayn9* zNrjO$$Jo$^V>Zpa`v$WLMh>8R-{a{uc_@`>C84c;==H%!!lfi!Vb+Yv<3F359M8=5 zNjO1%LTGFkr)T6~OQc=oa>e;c^A2{N0qNy>loT%0chE`iLv!QFYX!o3N!3SK?{fU4 z_9S6DIh_!{<^1HfgcEOvatG44wfspq_D6wmh-VnuCGh2C6MH-v|Mq$_;NA)^3~{(tj*4@72LmX-q+!`76}Xa&)5N? zO)btR>_a4M}0%>?(OBs!PLDxd4%%O{%8fgog`B=!i4&T zdXd&gpe*4S%IH9flGilEsmo0#&Us{qz&9GWwl!_jSBmj4Q(({jbNTI`^>CUZaQ%ZM^^}K$CGVv z+NP&*ookyj;YU(Gr(2C=W0Idn@|kbQPevXxUXz~{GOm&3kg{>foXO_`z($s`Di}VM z$j{^v(#q;}K+<-n*Y+lG1$SSWE_DLH6%=x>NS;M zBRMTuj>^t~k>ArV2j9suF?uVHl6gqgYYR!wMQGheN_>OvT#5Ji#nRTWov#xHtjy*l%R$#$YNUeJAm^*Bohqvr@RnX{ zVD|&yG&^681NeSg(p`c~d+}3)kBsfy_xH*@GcV?Sq=pFZga!M((!II;U3U^*OJk21 z+okPaGOm%eK~5_rN2RzVwUBW3OuHCN5vt_ZkNUAS0zhTpZ zs}lM7Iayz2^`i3~Af79flbexWnz9lxF7o`SJU#KtVK^Q=l(eUQbo6-A_%4S%{Pe;Z zCAY=NxW-Mvy2)v!2Eog#w%7HaFJ!=rzzzl^N^|+!%c3jfv^A4b)wTVoLNfN zVY&Rc=~$jelM66jXu}`*J)VRaQkYsRiflW?VIFXEY&A#qY--xvTMXElF4*huG4(5yp^lO_+-IlhaDc zLAE)`oY~M)>)paPP{=Z|{K|2Wc}UfZ&#|<;q_z`>kyj#X*v{8B+4t!7own?L`;l^P zj#MKOE|6EPNV(<0$hbz%LB>(3UO~nsGG}h6xdgs*(;luhd9DoQ%tuJ=$DOZ9y%Rv5 zA93dc<<1|t5+99j=8P@(eBF_W@nr0&PMcN2o19k4z9r*QIZ~6$VepX8ft;3~rj(D& zL#kdRZsfXh?Ph7WTsgbp%jk=yB&m*uMwnM$(j1U+5xY)?A zcO~-kbFx0Nex>FtY(Bp0Tzu}2E2otFY{kuY@6ibF zt~)f}is7yy9Qh~t_iGE+_as{ztlJ)E@POG{pO2B6m4xh+z2*EFz~8j!kYelPaq z+4FtO{{O?odm8q#zBS%84ZOfLfbpDrrk-_IZyk+vcE4t`zrde6d}glpdpI-z_gaeI zkEhSr?{)=`v_^1$4b^K;dQAg|RRgdqCVe+O#8xsA9mMI${PuEXpb`mdX=@sIVQT>T zD0BZjnF7{-1^3iO8hjngP ztKE^T0l;Y*rKN28a>I9P`ya_#tjS)}z>%Z@Df_z|%-`Gn`y)wwlqZr&j;{qXD$*A6u1v=Bo5_O_hEguhI`b zH?ymslTLyrI_V^(5~xzy*9Ww(FCGUPkH7x)Kwtm*i!TOx@x>qgDA137^xk`c-h1zp zPXc}N$>04BDE%K?j8Nc)A8s>pn}VxOu1bXYcf$jCQ9?ZbZ>O^CXFfZv6SO`32TuU} z!4m*~@C3jgJOS_rPXPSE699kk1i&9W0q_THPq#m#C!jXl+}t(SJpMR50kjL+qO_Yy zQBK+ya+;m$iOmPCPmcmh`~zL25B~s-;~$`}$3H+X#y>zmihqFKi+_MViGP6p4*x*U z=l>zp*5eyI?i()&Wj1m+mHQj$SV%4LbBsiI9To2LJ+@8jf)69#|7@T-^x~DbBHwvB zbj**Mkni!+&~d;2GV-6;fMZ_v_7UV?eGa|+Ga2On#z(hl9p&opc*Qn7ZY_-Z|Fnej zyyQz4A@9|%p~~^z|KA)cB{$7&aNO-j49NMO5U40(v{mea> zo8tKAP~QXfNPX~4sPEH_+q8~yopss2x2f`_H=whX58*s#ofAf9zxRJAZi-huxlQFH zIP=Ui(VH7wh@r}>#wmXt(jNao%4K-l_jt4pK}df7TiX;;g1-(yZg2rNE=7`0TpgA6 z?GL|ro2uS2kIsMQ0OqDY_j~9aAMzmc4=z9#Ty-t7d~*?9cvb+%G|xSXF8m-ucDo&2 zbjF*JW8&xNqPISdV>%xCIeO?CvG$FfvWC$4gsaPfeWMt+Wh0K=VKi15234Gdk!T5m(sFb@&^|c z1Jrfg2D;>H|AVUrCgehxlpe1r-C3eN#h`Z)j>Xp&1yN$~l8CzS^%JWD|7ClOrm+;J%_!N=b54JrmG zNC1?U09+semzI*?!L4(tJU|u3ccMq$q`=(NuZ*C_#zIs%kALuvZAwe<#pvIu5TGCd zP+9_TfdpKNkn{)(X`jCM87dFZvwB~Se&sv^b36O#H=$?#cp*}$ROs3G+mNRHP3YO5 z9FJpk{wvY5?H{Kkc=lDvZA#1b{e!nqAwbosb@any)^Q%imES`@9=e_?=O?)*wrMHt z{QfharqTj!y6{H`XdUYL?FT6rpcRBLw2pH9M){g;3Ms)~N96_=)R;?4Nq}cGR34zs z|9lNhb1}ET4^N?7+0UK8qjd;E{;`zZrjQc+cnrb0!37dHRQPG9*TB<@{JU&L*9=$DA&-< zf2Zig)lAIdMSr70-tdMu@Ms-^kh5Ru+ol^=&7(7aei|+(_wcC*@MroxZ4?D=;K!|f z?LCwW%7GA&fR3?#nGONzA%vlFx)vhe=vht*3G2|Mg?~}5FMa7tJX(h!q(^`6HieYn zuS1Xq}5jtK{*U)0ef8sS%%K>eC>K*81XFi9yS)P3_I_}&zQKRy)*FAvRkG}&Q zi=X~Fjvx}-Jlmj&fDmPX^nv)}IR9c{o&pe1uvHS{iYyRw;(JA3Oko`sfgdCl_gwkeH(&~E^@fwm<2(Meb4ah@i_Fgo$_UsL7$$35v{x!Ny(nn&vpgaBGH6jIW73c0}r5^!m$_POnUAExpEwOsQ`1Qbi~ zu32>3Z||kbx%Kz9ZAwdU;|NRJZVI5AnvytA>*Uku=8iLv?WL3G=9B?7UU(+D`GVKs z7<2S&bkh@Wpvt)^`GIX(N;{u;%`%l1C})eE`WJ1}L--P`Z7<1=``# zQWD(v?E9%aKyAbKA)vUIocUjr3$O}87)s+DAUT8pg_J<+sNCQJ3AnUW`*7zH=4U^K zzIOR0=GJxPi_zCExsxgfQb2h?X$c;9!}U}M(C*fQ=%KUxIL7snLG^k2}^U%3$HG5-5M&@X@e z2a4M->t4D|5f{_}e&Zjb`F11%*%(~q8{(gJOJ^FNX0v$tVx?t2o*a`!u_av%mI z07^?>`ubT^2vCr~cnxJ|VF`>M_zlGkVn70*auPt#edEnjR1XH~8hecLV+p?TQp(le z-_N6U2tr`YWhkViM`g$jE@r%DXekLk_kSm-JV1d5P+9_TK{;GXO8}z^!~g{efZ{%f zbAyW+kr*mx?ZVj39dn)EyaC;MUleoexcG5&>*NoS>)dnEt+*|_FD{~6-W|g+&aEiA z(J@RFJK9V9*d#VL)WA5KX0Q_Ftm;edDWA@+NMJz9q81zoQv}e zww!@Zn|S~YJp3?4`$onoitE##L#MuVf~qOxg>r$)wJD@I|M3q}X@LeV9;N(sDDmab zp!2_`qUQeR`-iqEZ55nn{|6NUG=XO-K(Qqe2v9EI3Ly+FCBZxKJRZ^l?fF>NbIaa0UyR<-N$cPpcs2-J zftHfs@)uuDr3DHST>iTEJTJj}rt?%em;L)6+mx2zU5isx2vCppT=cGgeG%vBx#I)q z65pRGZkH7PxJ^q*z+KY-J%S&%0@f|Kz!Kw9x)t90QZ*F=bmT3!A)t6he8L;iQaC|-jMy#L4OQOhTAOyJtLqDM}? z9)ZR3=n3uH6hGHE1dyDe{x7`ad93gM?g^BOnFTOZPCL*GVb;k|&<^-9YT`LRxBwfu zltxV$-yjAkq@+ha$PF&w#-*hsfcYon0SY|m`6%!O7nH-Lv;;7QKnzew36$<7+|dQN zg1?jm+%d{`-3jQxZ#yx!@Qcjoz&R&VZpx0mamQT>V5YypT zz7}1!aw?V}dd}78(%u!yo`V%Yu=s$|mL9BRLI}|4<~8V@F|fCXzWq~lq4s+ew+p^| z-!_$#0G?-<)iM<7MbCRDj=hU=K|h5MhSL2M`T~Rig_J;P?QnYu(_7^FDWrMy@(by{ zhH31T*Q3YY_`jfoue}&O{@0J9gzrT3^|LNRV|RTSef_^*i({rPdkB5~#wREVxRjO+ zdM?NYbn-+$dg!gE0Jn!`(SzT3H&xD8H(s_)<+KB>3$s9mhVQu_J#+43z-{hq^vvzk z)N=qcNYEQlS_d!-gb<+7C(c2?d@g}wB5!yaJ^jGR6gQYb0#~4N5-|A5(D>r@=+)o< z4dyo5bOk!?$M2+`gHxY+^ERcQkpF1?D-{AX@!KML`J22rPpt3-^zwIwDGY`f;0m;q z1g?|6L!|{88@vm-9)h`YVlshTSD#6h!=)$2AkP;{@0l0u0m&)~1NDJ%93>|wJLeKoQ9&<|`w}yWGl0T!#yI)GJ zMW_CC9eU;&ytafgmp_Dl<)RTC)~`VlptNkT(hMO$Q|`Obj|XqSF%z5LM?XByPL;#8 z5=&|4?^y?x2PkL-x34UIl=B1)xFXzYEbZqqu-HI)A3HXVQ2XVLI~z7+DDaV!drO;g;$g_Uh8 zXQKoE$oer9H=xsjXHe+&KVxnS$De_Q9{wv@dF=ye=&669&7v9&{pETb^X5OCjKZlW z(A&OeK*P^mu}$kJ*Wgcb+w|PO{T>Y+`x3}=X$}n2o+{ z{qtW!!Nj|$a)2&;>Q>5Mhi2}71q%ND3Q9KM3bF!~(Z40!=^sO_Y2Gte9mt z8&UF(f1#O~8I=6MN4F_12Ztn%yJ?$d+kS;cK4Zms(pPPuk+aUGxW(W0m2D~~0dPwh z`zdZf=L%m$>C^v+x#fQTSCsMm2<7j8HOjQCY|}c*HTs^nZ`0hjQ)u+dFT;7}uWm=9 zr!LU4z3acXshk803kyj1**3(`m8ZUl^#6dpf(^y{QNwS3i{7L@h;+@r+opAtOLNDG z+w`2DHY0Tx%;O91HlX@IH^mKB2Y_p-RRT!UGVj0NhKh5`d1!PyZ98QJ~AApHluh zwEWXsDOaIT;89#t95VLG$F?b?1V7G$bAt=Ga;e0%c)QTlm%dJwGo}6HHkI3xc=I~ADxN0oxgk|dfn+cbm1|_ zpfis<3%&EqCUoXQ*Ws88p85wm`%9DPlH-p@XJ7d~blF$`iOyd8DUNyfS_+-{$Scw1 zC!R>l>@vQ4l4pbDK~ek0Cv=bI?6Tj;uE&%MNfSP#fQF!^StBRCIn*#aN|-r2`<(2H+5jq=mG zRuJ=^wqH;o46UO=U~U8&JW$U480j(R%I|IOYSdbEEZ}t>~K5Pe&Wao6v{w z$)1gYD{;)VH{OIc4z{7|@h<7+EAGc<0{)K9X@Ob5$G&(Ddj0Gd(A{`P;0@P5x=rgS zSN^%zZPSkp{S$$|4&8E%2`%U6DQ-YNP(MZav24ccDHli&F$^tLQ&?4jv_Rpx16qgP z|Ni$=uIs#ir05Md-0*zN&3_-FT(^b)Nzsq>sGg6xChehA4Avtz7O4TV&68c zqg)@t;{e0}y=wdo6va>cLm#7Dzzt#;T1o=2;~*{2OCPR74<2(9mf(HI-+&&SIe{t% zY(OXvC@sNfY`>;LfL`&gSEJ8f4||lCec(mto{uOgZeJLl*`{*103|>5uXQRd&`YlP z3i{>g&`&S@;l=3b|LsKY!M5$MzJ4RR^3Ru{XO-9Bn5$3w8G6QX8zlkQejpoATDEU} zs(}gtdc`@9qVFg>LAKb7&=cX$Q|0{NJMG)Fly=}O1jq;!G)$k30Ih=yO6F2pg5Mh4 zR18o^36yRhZ~-?im6PDA=ekh3=|_m6A4oKy^lvZ4+&=W(CsFz*Z>M?*q=4Q6w2pGc z-eTUSANH=p@2bm#k3 z=)k|D6#e*@`Y2k5K6Uxe(VZV?pd^4iAPG=fwp;VRrb2*z@|Ov8pev1I?i%?Py8Wjg zMhA2{bo-lbLm%Ec4c&e=tP)&z-3YqvmK92ZTXOMjDrZT6)L$CCj7kgiTIFBS7q55+ za6795eIfq<`Y=8RdGFU=i*7pk)#%>7Pve+dTi=H6{SP-)pU*#hA-ZGOg+A{+7RTIu z-AgFD^d5W;1?*FX)={ocef;=s`l)MPjKGiE=NErNpTaYe+rRTxD&*D|y&HY%`!M6W z_P;-dK0Wj*N;Ym!F4YRK!UXjKdhL6kM2}wAgSmb9MXy1Re)BKr#&aG=kDYW7edJAd zqsP*K7`G-B=&{17lmw4mbvnA!YD15G{XQIX_b2Z|kDoR}NzJ8nePAaQY6$dWKk21t z9lB}ht?0q7Pf`-xzxcClTB;R({PVw2X@P#Y?(^vTU->=A_S8k_yZ1eVK8^R-fPVGq z5Jl_I<7c*`?|b;-8Q|>bvOFOUtmPK_SIiNPxWP~l7IFm|28cp z!5_c6PNfBU!%06tK(R)fmnqkOC0@j%bqGRW#A7I=q{l?a4K8@9xKvI880lcQm!UVE zc?W7Z8}{^WpMC;0JnN^*0gDgH14>H(RvLr=y#?>~(YwAM@$0EwU*HBY3@s%A?BzmQ zpf~=_g{Xt=lOi@=RVK9&wZZHeZFuzyJj--DxXHYe~^^yt(}Nz zr6JgVb}g7ODO&a-V#kk_l9G&8M0Zr_4zK9Axn7#RUlHR{RYR7B3_wKrCb2m^(?nWlzhP0~_pN<6cZZV_;uaCcOcUXSvNYCSgIsNtH)Nwa3+jysl+jGC0z z5o=2H>SS*bjQFXa+9<^bX(FJ+^EhcD;JwKbk`a(50!oa)$=)L1x`#Go(Um)pF)LWS zmCjs;G`|QOmOVdd5eL1rRAN@2CFG&ECgIfv&UXqo6=22ZYt`F|!U8XQi@>>#t9WCl zuInt+6+WdBS4OO1)2x{?>K;)I$(p3RHN~2eUXO!r5wIouKe=98lq?$ZDSlAOJxs-c z-SFE}fwFt&YoFS*RKvZQ)R4uIq3|tWwzYWoI9MtE>aCCb8iL-*-XeJLgU__Ca;yBJ zM2= z<|kd6eQ1=7J+ly;5t(d6wXD`CF#?hinG!}xiP1ahHtS?vXC9<*UK3Km%xQ5}22!7j z*LfoMJ(adaV7VW^CY7yRhvi4x^p0Pi^|hDgSzx|}&jMNg!*`LA$N6>X@ykeAXy(<- z)fE5fQM|H?Z?nSxNq*;Ijz-P=4kIGn*0k(x&LwP?$~VoC&v9*bI64r)&C|7Y#>~G( zOErA^v)#zbiNy#CxL<54vg`3spSMvS+=W0{eUy|1V|eXuDJj01i-5q1dY&Px|Kp`w zi!!E;EjzU?$QJI7G zD6Y|uZO%~5(ck+kKWvFp%4{PtO(jM`8=Gz|YOmjHmcHkUyl>XZdCJo#Aa6rCDr9GN z?i(-S$f_jd?BjQ{%B&IC^XN-@UHm@B>oZ^OC~@^^^T^m6p7m+j--1=LSFSeQ#sjWY zoNJg5V>9(wB4|rciG9i%HcfAHl|~K8nr78TYfAL$q+0~+L;lvz=8>%f5V>KIw87Ci z=kd#wm-R|Hf8!OCrnkceE>I2m(YpzlBza3vhwQ$yq-OnSGuSctFnV} zV%Sow{PrbOx9`Bp<-B)JrN56A0fW%kcp59l%=6MxDRtNYFKb>4!m<|Tk*Yp_21_Tr z=^aDtvBa%)*y{ZCqRo$=-KfVFKECjrO1uwP!=|}Io?PFl8j>|hu@P%Z^yXx55imzX z84y+{3=qNG6K0( zZ=+Ura^$^v4JQ)|@sD|{q~zrKMC512Knh>7OJW_3V3c_|C)^T*g#&uqr5q5OaA=QvI zu|x6L&rgfZzpvLLczvvT<99%MC3}m2St8aY`R*qzG~e5$68n@Io2Iup-cUobCMmIr zH6?m;vbPAFBOZP5*hD~y=W)_Rz>E(|NJc=K2q-ZEC*3089nQ?G&4!XlPwuuQ?mm@x z9@emFBH(yK4au6M1zJ#Q~S z@0ZMEwH?bs`+_a{WVL;B&P(&mHJ`3g4cR)_2dDdoh|QVO9-IoFqA@vhYHoenu_+9{ zIr<0KyzG~cd07X=+to#X#0!aQv~`jWP4m*U+w}`}1(L^3gyG5zVV+*vVL~l;^76HGX(}tuE z(nLUs=X26T!0+@dQAz})iGUKlIq4Pwz0BPosNTqL?+8WWj!(qfjiATy>nmTPCt){c z|FzyrOC|1&VF`J|nj|}6I3iu&{5WC;{YAYo_eAfcTLkpN-7H?7mpz_xY~j1bPf+p^ zb0=Y`Mt1br)SBGkBe97!C3v9}PvL<#+|B7bRGo*H>$4Kpxi95-**`6T)vYRtx4@GcpqG)A>ssdQULKUW} zz$OlikD|wse#=a+p+9uyz0c6I-!^6Yf!^6WP^8fh1{_p>@ z`j>zCm;3+E|A^oE?**R!-~au8_?Q3sU;pJ_zWJYCA3bOwsyFkq!R*dA-@KiyrsHp`XJ^Ob#e;*FFCM&_ zEC#3J2QTNR^9M((!SLgF^k9FAzYoXfOH?>mj0dav;@e7Et6of}7t7UxN%!8|ueLVX z=r_+<;N@gCT8=NPKTW2~Iopz|llkm$utJkN_2yQ+`3ULz^NSgA+n;~_w%WjdTaUK! z!>k`BZ^p}x{H=#u+grORwD)jhXO~SLEav9{K)b-p!R+(`U3)qHG@gE2ZK2NLe0Xs- zo~?k;;M?k8Iv&g(?N3%hwf*twWOgu}Ap6DaujAngh<{sojUUE?(Rfk)ho>(#H$m+G z0ANpFJnkED{y1JNr8vp)aO*Dep7dWYCbJcK$;JdYk}){@7nAAe#|zT`8k#=bsy=V+ zY*lZn!RcAG^YGE5osDX^s&*f4Ki=6;NC)%TYA~5C|NQDTM|m=PK3ObRccnMaW}~m^ z%WKeS`E9isX!PTFJQ|NM8uN?AkeMOx=;Hhwl#03Mi}`RlUMZLKpML+U|KbclD-fjO zaQ&yMEO9WOPv2gikNbaEO{SC8W&bUDd+Wllp8oFH?+>1%!q)cn;1A}Dakceud$Y3` z@w5`%XtDq?TqfL{Bc6l$B~_GSYttb{7mGE7eBPD$8YCSrmk0Cde1Vp#gUi7T<9rGZ z9aMiAPp9*rDv{JMG6xXO`I%Qi#=)z<{4ONQFuwVIznMgSnV(TMmUpUu)BpaBcki09 z`}dw-L!5u3S^qxf|3(M)nr=bsi@k9;J{eq0q0qni=8u!{PcTJ(zo266<81!Z?9SEj zVzEHiEVZ{dWNh&IRB|WwB$$LeYu+(Qd``YIJd49n%P`&M#JX>f_PLovUM* zwAE;Q^2HzS)U(mm>;m{nD$3NKS#bP$_#r1vM<>;ttLc1Tm04`WVu1VwfP1XP_wDMz zW(87D*{0{5uMD20u}ze{)6+(P=1(8Si!l;<=kxQ*e(vU4Z3=WWNl?UaY&pVTP7)4Q^#YWQjK1?JKD`FM2oV3SNC zaKI=1(@$rKiB6~U{ROMhi)j6ti+taDNJ+Qpi1Fy?cEoX*n;*lK1Wp zKV^to)Qnj+jen%Q{S`*lBzyFJODUy06wM#rzIfUH{^;$~x6i7rEfZO?HyE*hx`b8} zYBWlUKw}`v^n}vFT)n$z`+>{nrLHO;l#V;oy7?yuU_xf1N`Ocar*S>gCQRtMOtw!5=N@ zN^P+G(4@*}UO_LmQU^?JW4s)A6OgF+M+o&_v8w7uhm5qq91$4_6A^p`oSZs)0F`Z} z=TJ=N^b&LzJU;b;$MnZw-8Y8c1%3u7GAx<9D_sm1UJFi^@j_U8F+Q7rf=UbZBEoRz z%$6r`Z%BTVOsALq&&&j^x(ghqd@y7;h*Y8*!Xo9jN8`iF`}1KiJz33XYh?6fnhKsw z!Pi22jD$^sqPK6*5*;!_C4s70LEPzel%m9ay)185%Zp>oSgUrY$yPUrG3%m_UrdZ0 z$rgSTWn@y4TX_&-WF-M^=S$~JZrizk_1YBIRyHIRz_XOL3XBF-gO-p}R2e~nTZJK% z$ch5lD&n$;a>n&0hpmzjK@>{j*UG2lefrEY4asYj6mip{EpclVHZ~{dM#oQ806KC^ zxR3+kYSuEzG+d?AF3YXPKdkB>On~TjBj1V1`vg{SIKPHs&fS@dlPP*RYSOD7ipR_b3sg&R(+0=*GF5)cxV))dO%641{l&w zEo9@NKbVdBX9L(!Fm9XF(}h8YoUYE$E!J@*Wp7FQ^l}R=P1I--=(!=&7-?_5(WfC= zMec;S>AZ=9A3`R_|t?28K!7m$E-fgr=xxvYrvA#!8X}7FoDDHf?t?V zE~Gj9LsJB{!Sc+M61{7{u#g(fJu@ni@F%f*ei(DDTAf`?6-w{z2UzOFb}7dE6>O|z z@v6QiG#N1dZ3vpQWGlGL(4;|ir(TSPXERaRCDk}c)pU$yOg7@crew9e7|m91u*nJe;P-Ey z_0J*V<34kCGEEeO%(yZ}n-!+l@n;1pQ*cI2`Q8yFpr+MbA`nX^^BP_Kaw4i!`{jic z_(sBv;L$#eK&8zl*UF?6H)Ckih!^M))+Te#C-sX~ZKl zR$L)2X-A-=wEADp=N~~{Atd`;KvYN={T*Ff`N|2@KU#_P2b6$)df`aPy0gJ08|ztw ztG>hye8K`o#eCM!CRShFG&Y>4z?4*|)i)#bNFpO84MUWx13R$_NUsEBJ3yCd%3OS` zHtJIWEr|5isU_htx^Em*FVeLjx`|^0D<6`~eZAght;0f$WIXs_JtbMn9va!%L+2x4 zRf~g(9U*_#;zlAExQ!C3*Y&C!)@DssA)MG{Tq&)d~rerq{<%q#mm>@1$N8Mu@-@GO-Xws^7Xiyj3%FKT_)9DK)T&$FozqI zd%;Jtp<1P8>X1kd5YwS%=~wXHPR^leQ>|sF)|FeOx1|iXAy$u1*GUP$pvy8mw0f#n?y&ntLwxs>!ajY~@K2 zj1Q{?$4d{6?VOPXPut+A$k_IJQrTcIS>8F=J}JQ!3}IZ0k(5WpcWs_*f(Aj?=qED1 zIGxj+aVWOWkNww2TO>_x-?_9`^#b3#%XFeXo%NUF^Zp22qnr1XFKI&w*Q+~5q>=$q z=EGPh>%0RQ-&-Zx%wmn$RIj9L5llPOjm&)l4Vga z#o8e+IWV#v1WSC*vXIO+jf|Y=va$(%H9U` z_?M7kW7M!DZI|I%9fO)cdlQP@)?Xb>Q{!B9GU3_96aa*^)j;pW91TFzax!V@52V2b zCjffAkSpsY7@MpLMJkh$q@|q`*|iHb)E=jQ2mfq|iJBbNM#b2UTk)!aWu57B7CrhU zu&#<;#+PZ*dVFbdo30#$L!<7~WsYMWI#!UPixRZYLwS|RK!h$Dgz_@OcJ@3`F_$*- zh7Kn6fEI7p*IdKwVVxAY+YEVg&{>#=)A_O~%6i2&5zDHv)f!Mg}1fd7}Vkrv@ z#M6x~V5Q2OSLN;P?_a&{+d`xdC&W)yz~){sEH-Ol?{z>*b|DMg`{8xT6sIz%CC;F;W1va2-mzFWp=$xwYJdXTL5}YC*=)|J>E=>t!-=f7H#dW zZ|i^?hM7EwNEPzLzBh~PwTmS3?jB9nV!8>^-_+yH?VHQ&Gd?8JBx;jovk5 zs5n7dfZo;hma?GM0fRO1lXZ_0Mdmo9V{(X!4Jm4KZWilM&HxCt{(!{|ci(hTmd#GL z)WiITOu{k))@HTqCNC*%#Ur*pwP=3CBKTLRyS)u}b*1%-yEcVF(&0D{$~+QdBW#+3 z?ugTYa8d<>Z9M$QWkVuV)9Z@$P3-wK)3x=OzMwEVHUYbzMqW26_&m`+^dR{@SdCjG z289$Df1a$glf9no$Vm}+A2<*_gazg7FVneB%tkd-lQn|-r=tNXGAC34pudA()|oz} zShC$2@emCub~}>idIoUn=u~K1HAMNABi`zE$AI_D!n?);^SElQm^dEvWtm%MEiGUQ z+HmQgz!~mvCq^&Z8&Zktdxy)a0;FK)`AV5U(Do;g_w9SC0cN zWNX7<+yY<}odLN`frjazVrtj{vL#d~(FX3+Scg1Yz8U*#kq3l;LK8_*A;MG6OS)MG zqjH9=9t%X{=$KqlyXh8>4VM%Wm5g0ao+y&oNS=zIPgk~7R%ho7RMeFshU%JPTgpK+ zC2cQ6$WH{Q&ua3Lse5!xhW#37YD!4pBTDzAQ-r{mYpU&}uu5CpinJvhqGq}s5=I`w zK*{=ZP>`twcw9?D(k}NvjUcSC22-dh0=R;dvqQRllW78CvWr0qlOaSpr|y?S(7Q?y zgi5(wgG^RXQmrIs4(fkFEih?xXt=Kru1xBm+KL5>(YZ`^dSudvPltQIKQbJlbRAl! z8~#NBEXoKTu?$%@lDN|*Of29@1PR~O9ZkH}2S}9Q+J!&C> zqAJ*&EzRYU6_R9y91u(ty^fjF#QmSL>uS(rY%khSx1TiZta^{te7%tAFHO4dr?WW> z0c_znlXLoqWr9f(KAH6wnyzuGx>?H(INR{ywsX2;%DOiUXd0e?LA3R{7)GQh4XZ9q zlH1FNMPk5#NFEa#FI}zYWT9KRgx66z23JIGqS_*-IYkO;TuDEJSn51Gnk;d8Y>GI) z!D4W>3_-w2T#5oU_3j}mSs=Y^d&pvS3bz@tbWWlyosUi!RMX#u45xsZ9IMWrg)&w; znhxOXL%sGt=43-I;pKfJBH zf7&bfDs&hdo$H(H3bZL*p0$K?PX@70?mZes}fu!(_=b zreA*btKI6smK=Hb?mObi8jf8rb6`?yI)>A;6~I#P+zg$L<;(@@O6OzNX^~}IfNkgo z1TGJ@&4k^xzp{kG7SEm|DIuCzAPDnIOI%S11=u;oZnOmGY>w!$5_LgX0k)mkAI5aE zu=<8METo2l4TmLQl-kJ_ou%$D-pNu}UXJj*v7@@TIkZ!pc{NpoBhq$OHyzX|&+KeI zdGd&7b{_qM&g>+TSWoUWkL`$mC;6N*%@q5MC+aWZ&P}s9u6dLfL#xcPgHp1dimZ}PEVZ)6vrm)7eAb_T zEI`3B?GFcVk8!ZML@!v+cq9cmhYkKjJ?t*527fMqO4477q#1YUW5*d?usk0RCpc0N z)5i;(s*(9~3HI$osgE*69YYiF<|}MdPX@~_L?<&GmEdIxU706(cwVgi1D>xb8t~lt z`T9Ht(#DS9W(BtQcK%wA;CHopsHZFY2X9|_2yj7v&*!vvH2K$(f}Y8616MpL`g+K z7X+fF!ZLB%sxdd8nDXQJvM)<4wwqQ%O)dUnWK*FU9L;qPPduvsd@|z#0idX@TQ(oV zxCV>yzB<`+oF|8}Cm{;ve{aN4_w)o;p4PI32x=Z4f0iv)o_4sBp;NU| zjv_^RrsG&hcY>tQH=FP^J_TzE-Jy}iMM5|jut`A(SE^An<~%)L^v{;3p#EVz{e≺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%0DwzbyW@RF0F0 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

VA@bJfz2s=# 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%0AqP^i%JY@x!>MmH!A;5d9pvwXQk4@NT% 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 literal 0 HcmV?d00001 diff --git a/tests/dummy/public/assets/branding/eps/Ember-CLI-Mirage-Logo-Horiz-Color.eps b/tests/dummy/public/assets/branding/eps/Ember-CLI-Mirage-Logo-Horiz-Color.eps new file mode 100644 index 0000000000000000000000000000000000000000..d5a3d6b8b8088f5a72c0e4549d293a041ec00f71 GIT binary patch literal 1142098 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�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

GÚµ´îוdÝZy$Ùœ‚Š¥ñuÃQŒ®Ç­ vÔ…Ž˜Íéö 0”¤} +'˜Gò6:€‰±S㙬Í: ìúø¡Q.&ä7­šbÒ2Á6„Ü5DðeW½ó3"ÙF‘ŠJ:Cið›óà­™Ô38úBéÔ*´în.þq•Hè¾ÖÚ+…}‹êÑ xpŸI…)­PÛr'5bŠÇ/€Î/™þÖk[g æ¼G‘Šß›¬íÄM4Qâò+f—籈DZ9ZÂ" ðj¿ST»ÉŒ‡º­íu^>Eù]++o~]>Íëë…§_o¦44´•ÚŸΣ@|Š-+â%G~n5@±+ŠÝŠÂïuJ­è–;¡Û¦¹ÀJ´‡§"ïàÑ(L¬•àv®ôUbs90h8³£7@J²ü‚F²Ñ±ÙJû…çÀkØžc:Á¿ø”­+ök§@˜¯åvz «OG@ý(¶A+…¦TÁO…uMfHÿ˜Iž‡~»H±Ö‚¯’²ÊxœÆFUåI™¹æÝáÔYƒ‚¶’Ä—\)Âm)÷-à÷O3MP—Ñ¿9ÍÚ%Ûš¶ÈAáë¨éx±iQ é#â»5ñ#E¶=ôÊÜSTó×Òx‡V"±Ý ø¢ŽYÅ$ #îÐFÛH·Ñ{w̧™À+QdWµ[öëUÔ1ÕQƒI$¾ˆº8 +¡¶jj‚8PÙ×ÄJø=Û±ºK4§„{»JÙƒ9”¯HŸd‘}ŸûuàŸ,!µÌÝÌiíë{2~H<—ÛÎ:³×:é)œÙàšõN½êEŒ@§ §}ðÔqzw>n‘ i&*½í™Ê‹<›ÑwĽ­€ÏÁ†ó¹’Â)-röq®i<îµjwÎã“\µoÍÜmÓòEzÏÚÀŒDèáØ·Fe®Äå™{ý÷iTˆÄeMZ‘…O‰¸[„úñ“áï' H¬\q;¶Mö™wö™VüU—H£j”ï”O§‚Ñ Å «æ¸!Ø`ëÊ+‰«œçºàÑQº÷ëJ%˜omðþºY”ô×ÔÔpje¦O¡N0u® ×&eu¯G–UN8qçH”Úª+êÜœ9&lŽÏ#`àØܧJø^& +ë¥=ÂTÙ¢ÝIÜÓë(²£h[äa$fÙAcvXâpp‚”_CâªÞÁ¥÷5·‚"éŠ7>ð8¹Ç¬Š Û²ŸL‹ášÿ”øê*ÌL7X%[šY‘ž×r uê?#®P<@Ü›ìù…“ œ•5QSaÐɘT¢êL—Ÿ;ûu³$]…áþ ›°rßF%uᙾ4F«@+s!z9úú¬ÅdÀok²  ,Æ™‘:*¦®.RüÀZÓL ~³J>ÈOÂË[(%òAÆD›mí*ébp\…ŽV¨Šž‰éºùAŠ¨Æ<é\GêúuÓå‰Bª‚¨˜Uúm¶÷lnHiíÚ-Yš«|‚qÈ'¨<¬¿G¨e¦mN{lò2†+P•h‚t¤¯ºÝܸ¯¡’ÆHësV¬Å‘wÔ5É› 2’>¿æ}%ìˆæ¹"Õ‰¹^¾5%P’²ÊF—67ºFȉYºZ@1ØB€’ó+ÐŽ­ô'÷kyŤ殚°F•,Cg´õpï\Ò#êçʯFÍ W §RGÜ¿7y=Ï0O\¿Zjþ/ÑÂﯽkUÕcþâÀ «ms•æÌ>8îxõ4üKžç-‚c¥º" €×PÉPq?‚ry?‚üÆ|?ÈâʲüNqþ~nÍzù®‡¨ôƒ³.÷Þ¤_´&Dxt]Êüíú–VH-èu@Œ¤R¾Öœý"¿E䙪®Ý予ã~žÇGTSnõ•Ú ‚QÖo~€Î3G ‡ vñð«ÐJ[_e™ùàèåõú¾±?4a…ò0ö·ûÛò:†ãØCÕA1àÞRƒ½ÛgÄï7.6Ãðš¿  %ªAdÄá5ˆºœfº´B ›o‹TàJ–çǦₚ¢¼hÖ]W9„îîwj維»í>£°ÿ3…‚Ôå$x ~É9÷à°pºõ¡¯èC‹í87 ` Ϋ×ö‘½ÆÖÿdr¸”ý{?ÏÝ(í(ÜãXÉ6Š$ùµ2Ž˜uK'A¦>ûdÜ¥Àä­Íõ!Œ¶ÌM@¸ïÀûFy“õõs©ŸZ¦LÉK¸‰k@'5é”·2w5ŠO×Pb.L±@ÉhŸIGŒšl}«V»!£³^‹Ç1ý¾?‚wšOÆK\ŸgÑ÷ºÄ÷ºê,Sr]2&Rg°ÞkO;ÎùàªÞ£jlï]ih%œ¤2YòžÈ.)ò5MzÑ¡,WØÃ%¢¼tMÍ~íE6ïA{u×Ü‹kŽu)[¹\j“RRýöP˜]l–®×u4. hø5{8j2JKµJ™XXl('³‘yKóÉ´æÉÜ-ç°DQÐßßõSë?˜âöͨU 2„ìŒö”ù€Ež1,‰qÆÚžábøMÄÊ0žÄîã ãkÆ YXéºXœ°3ÁâDÃ\ÜlŒ8HÎûgD.0“¶;7ï›ó¬× \ðÚãc»ç÷B¥½Å²ÎæuNs±´¼/H»6¾ RŸ?£þjŸ4W.éô÷4~× 8b¯L[?›ÓÁ%¼O–öû»ˆà¾O½< á÷¨qDÕ!.ЕˆÍJîèk\Ÿ*¶,Øšàw_h|«sKJS¨ûàJ¢±Î‡JnÙ¼Ñj!}ÚB;N´×zñÊ7ï‹r +ÕïQKÊe ”›I¡›ýÙ8Ãp·nO¿S5É>A§‹uü-Š*Ÿ®åYPïˆW04r(ê= *ÝÈR€ã‚Ü„•+çpÆdM§º‡*ã¸1 ºë‰˜<6ì2Puƒn+zÒþ_º‡ŠßPã§Z\ʪ¬%Kêß=ìع$YôFѺũ¹j°ÈU7ì2Ù„ü)šÁ|bâõù÷tifª»Çï¢Ð°Y{c×¢7vt^pÿûˆÝB#„Â#ñÔ£7§L¸þ’t—°E*o&_ðÀXDèõ/ìÝz]î3B?úʬ=Oج öó©IÛsLBzmQP‰åĆõþñÛ(¿(Ýÿ“ô. ý—tó¶½{tZã’¥WšQ²žŽlÌD ŽàìY­/yA:‘=ø½D lÓ>Cȉ[×—ë’.Ìéô뎉žîYèâÁª}O¯ZÊÊëlÉϧ[~AÌ|N»ùOë¡Å»fL ¶×¯›ø7X³²ª «Æëdà­C« š×þv‚é‡í&þÂg¸ +P¨®ÄLZ]&}¶J`„(Ž!Õe…bÚNBž.D+1‡—\õ=Û?Ï« D\nƒ‘[Œ’0hZßr%¶MDôàÛ®`äÙ=;‚3çÓw…#°ëu¡;¢†Û!oL¦ñ£Ô e¶BtPagà´ü Ä;ÁýñÀÍsŒÀèB˜¤ïö`²‘ì¿n7¨A†VŠLýõ¤éMHcœò2¯ÌÀO,¢dƒ™Ô4÷5˜¼®m©&¯kAÙ+uÛÞ=kæAÕè'Ñ®ìõ„lÇ•xh\‰|%7j¸º` +Uu'X[ÕGÀÖà#[Ïþ2·{G—%ru~ó(rÄ{|náµ(^ìÜÞ9WÉÍçæÿTƒÿÌÂËOR}CO*R@…ú7yVSyü"™ˆÀo +§+"”˜C¡\ JL¾†ÖºlVÙ©…yûEõ:$"p‘•eË€o»mÊW<¯¶§j™+Ëž\®£Å€®Šð-± ׉å¦rAKÁ¢ð0zX¾j õÔöã·ßŸÿŒï¤8¢Û1ÌF½¸‡¿ 6¥£?ì¨S*)puÉë:zñ*ÎÀRôúpBøÌy@¯ˆ© &&ap…äf7°›>d¡þ~_)¥£Â£ T~.Qä9;†î(XÁ¥U-÷@¬ìWwËÛ—’aâ=ÐFKbc 4–˜· }ªWî`·é$3ójØ +FÁþ[GLTDOáÎþ¹9û’×Ø€­a Ô}LD£rÈ)*[×X‹ö†W²¢;oÚÿXóÕ#ùêu<:F¾¨b­¨ÓoA%=øß‚]6Px‰%…꼈YhØKæe›äâÍqׯ ±eëâ6óuøÄ.¦\¨·T‰·T-ù%&õC¶Ù‚¨h¬'q•/5,SˆîaÀœ„¶ö€±ÿ°hßR´'  Gç}Û¸l›VÊq‰êc2pT6ûšî†¯ U÷5±çÆèYfÖ¬³çeg[@ÃûÞèñûóÕØÞý¢–Û³RÛ• •ÛÂx2çÛ^‰ Þî çQ,£¬§L&A ½$Ь¡æ0«#æ0ïçJäÞà"î3ÅôÀ(Ž”@îâö6vŸunK­2c©5ƒ°:‡À˜•™ß{ßÊ<†*Ýx.tèŠ<ÁH³IBI¬DìÞrhÓ#|G؂ǤÇî$?)u9ݨÕÕûújÞ·:î,ò‰R ¤òÒ4?.ºƒŠcß»kk+³cÈq¼¦¨4O»ÈyFYVeµ/Ù3§±BÄåÞi}ÑsÃ!¹jß?‹$€Jg{æ¨õãUe ˆº¦NêBz‚ØîBpmlP=zŠ|#zŠ'+c¿‚C?l<€™¡6-püë½8j¨ÜŒêéç•ô·~oLëh±,x¶ Põ^ðV¦ÂJƒ"N„7FL显®duxc°'½Àð¹1íážøvÌ`sQ4RyÕ©µ£™4i"fV, íÊ!Û?Ólî© Ð!5y©·~KºìÑ1ÛRG̲·=ñÈ;vÌò5Iól´H.¹þ®¯9¤Â ] ¯2ˆ/š=ÆÖ§ö½±›jMòÃÞÆŠ7û`¡µŒ€´£µÚjvŠSIé +UÐ;B­)ƒ<<ûALjÌVãQÊÅ*VïÜûÈõ¶Ÿò)U¡y2Ô«R÷å1•\Q ¿ M|¼½fD­˜ÔÝ|Ô®„¼®íoñ—J9OÕ…Gà3¾SOGKôÿ±¥­JT<ëÖ°\Ë`{éÀácT³5a)ÖRëñ¼x Tãµúà’É‘[€Mjﯼb-ŸCÑ«g@ ¢c’üà_Îhþœ{Ä +Lq»äšÁ K:øÀp4ù Ež3Ö0¶£> úŽ8‹›ï§*Ú’é(c'Ýñ‘ý¤jÖ·˜ÂT84QîQ¯sRGITÈç)[D ÉOôR)›NMîŒnˆ\´ÇT/»´HY}dB°Ô=ï\¯“Q~áÅägÄmDZ–éyŽ-O~B>Øúé¶3@ ¶s‹a\ +Dôã™UJÓoÍrÝiÌôn’ÐX‚-NÊzŲBt<;i5:p S~lë —Ì=šÑŽ¤Ú ›AìbÞnüCE‘åVÁü²Ì«ƒ-´RTåa¯óy5—íÏÉh©Ï›"©<ÁîˆÀ*¢"ÈýlÛ„-p!#Ô”ŸèBö×ulów8çŽ*á×>ˆ˜^¶KÒ± #|][G +½+‹dE*fpkX–×…~ý9!bRÉX/ÊeÕ~³?¥+:rjH£] ¦ZÏÁû²öóäI¼ ó‡FS‡´¦N»iÓðW’”ß(Pc.2TÈ“x¢„^¾8x@h£GòȱCßHÒ«OÜ]•ÅX;ç.+÷ÞLÒu T± +?"êi õéÌåë[ZMeã¾ËÚ£Ñ i›ÕòwÏzŽà‘Û–ÄË@‚+áõ$úÇ@¾µö÷­ZkûØÞØy¡‹Äžxe¶*E‰G§üÉŽh WµÂÖŠ2^·ƒ^þz¹r¤b}›RÌ#Œcß"öõ—[ˆ• Ø·<‚ˆ’äð(ƒÕ]˜@™f‘#=Ò!m²CÛµ®ê‡€c㸠äë¢w¤·‰fpË" +·Çž~û…H²jRk9œú^öKÁÉ™fñQ`Q`–jÓ˜—ÜÑ0C0CB?é*¬ Bp½ÎŸµ’Âý•ÍmQ+¡À–µz&rC˜¥ Pm”‚ôÏÏDQrìgBÛcG˜ª£ÓYR”Ú\4óž ÅöÛ¨­m–åGïɹ/”O3ÇY Ñßç~‘±É)s[?áü€&Ô‹7s¥Ñ(3ïŠÒ3Ü@gŒ¿.)në²ÛóÑ9©ß[<Œ‰m†ÀäƉ„ºnÉ£{´žËy@Éw:mMañYÈ®¢´{fPÃDç¶(Y…$¥ŽÚÝnß’U4Vµµ˜7æD¹fÙV™û&4d9Ρx…µƒ…ÛÊL«»;êL—_€•¹õϬ”×8vŠ÷¦èe´£"·1_ÖWÒŒõ%wL™uÇÎÿ·a!ëíÄW¶”ëµ/‘ñº·Ì°VsëwÂ4íºFŒˆö kë ^I¿¾% Ö<1ê×¾×écÝ2‹Êí:uFã¼!ÅUj$ñþ3—oê@]îÖ÷Xs)n×~Y“¹ˆâS ±/Ö¢u¬²•6x ·ÎtÈæ»ÎÏUK‰¢UµCûÕ¨t>jÞe+†™ôv_îˆRɪ~Z™ªŸ‚á5Rnb Ðuß”³”Ð%÷ØŽ"dSÛ…Î%ªª¸¢ÇгdÛ™Ïo#"W1Ð,¹ŒˆtŲšˆÈL¬égŒëu¥ÔêwVùæÎSƒaŸN€MG—½íŸV÷O«!°^:¯®á7·…Œ2¾ä³¯íúJ¾3ÍnyÑ3 …ÚîGý¬µï Ù®qRà(WH}ŸóÑÇî©0³{qÖX&Ž;Cu²X†j_‚n?Íã-µöÑìVXé$B٘Ѵû¿F\{iI»£ª|4³bª¸®7á¸IBGŽÜa«Ü9ø¼ üñ$äªu] ³Î$—¦ÖïœçV½˜²¬o•Aý :¶K;±Ï¾J¤çVDœÓРUxsìœë‚0¹ä) Í×…lF“Éû±û `I‡gQðºãuç:QwêjïòÒµ_‘ §}Ž:~8Äõ¯ éÚum¶2ôe¸—vÕx¿§B +1ƒ§'¦†[¢¨hEu6Ù¤0)ó^kNÞ«ˆze¿õÚi¦ñà£ÑF˜ Ñð¡"6›˜ˆ=!wJ›]åfùHïªÂì ¬iFP6²ÁÁYm›DöFù%øÞÂ÷¯dÌIµÊ8®lÓ±Re“FAª°Ù囪öÏ„Á~ÓÅ®ÅýÔW±E(ÛÆ{3ªÕÄo'm¤Ôu§ÔíÚ¼Ò+¼Òö°;×÷ÉÜB z1=O(ÊôÎü܈MZ3ÁعR"‚:Îg6>è›[²~°¾üÑÚérî\ÓuðÚØùê2UÂÞ¢áÄ‹ï€J†ôªIQ/¼}ìØìÛZJNª{W]ç¼R›Så3Å3÷´ûÃÞ©oëw^ç‘j¤ý2ÊŸ@•„4" |*_–ùu! +õ††½@®WÎ#^U=·N·²O6·…x®!ê°»Žè»S|—;Ìl&tù°³¹Ó¹=Up©:¶·C¶ø¥UǽqíÐù@Q‰É [Uk‚Ú ˆ(˜¬jovÀOîC”ôÛ¥ðbTx¼ˆlíîÍûgcÙéLø‘]àD¦ÀºI$Àx^gçgsíC½mñÀA4EZ¯)õ•ÑµØƒ-1Â?Ó”äÏk‰ºë8m†|°§4„ +v%¯Ab ™]3àä[Ú&W!k «é2±ñëö# ™b1ʼ…]¬ òšÞ_'QÊËPVS¼rnÛÉõÛ×Ã;=O´ö†rvñi³Q|©¶”B_t@Ù€ÓÞcdö››áUa4t4." ô ÏÌZ׊àLÊPE7œ\èY mÂnÃÚvÌ°ž}¬ñgýo”dxQÒDîS˂дœáJGägï‡%NË”iŒNÞû4dQz9ªÜ‹cÅÒ[¼ñL^e#M†…1STâõ+*¸Ô¯Hõéz¸¦[ñî:žŠ¾F“^)ôÏ¡Ó¡ËqCÔjBRôGÒe­Z›é}Z—Ñmß*”±iÍ0_£wE1Z$X¦—L6Š Cª§§\ +÷3†¡V?Ší;ÍYÐW4gç£ÇÉ®È!xiŽ(Äê.Û‘‰„X¿U¥þ¬ƒ@Ì ðÍ´%òûáÜ×u¦¼…+7ivcaò ÚIÂŽtc4¯*–ˆ>Ï‚®aDøÕÏ*ÁÁ #“™OŸlSá,C—Ð0šZ3}Ipû÷g1Áó¹ÊýºL¶+WÛïss¼[0òê?à ­[ ùWH’ŒÈ½/„+l¿÷…ztv*Cy¦©ÜÍÛ™ÇÞSW½'oaR+‰^.&ù&TVÏ0—K¸ÍNûB[Q·¶È‹¤;R€Ç¾3C½²žP÷sžáb3¸!¾J5›áê¡·×ag\™);ÞiÕyXVH?T87eü»Qu2:ä²à"ƒé¬šœ?ëŸI.k±é¤°qÙï*à;Yµ…€d6Y–¬<=éÀnvÂÍ)ªœL¨r2Az=™TŒ6P·Ð8R´Ð†î ZÍç•`¿8fIÜ¡ümù ·¨$FóL±U ›~(Wøµ¦3oàN36—. +ùå +ü|­ñÒ‘ŽvኺoˆäÓÃEÖ–‡T0Å£D6[,ÁYæ¿–ÚgÁÙö6Ä 4änk†s£’£:ZÎëtÅÐ}²Ö?§ Íbýüh´¤é ì걉̪›¢Ç• Oõ%DOJö72·X(Üçïz÷²8ÌúÏÝ̽ÁùÇ¡©+¡§¤ôµ“sWÝov ™‚÷Æ> Áx¶™+}:~Žtö“lÂï¥&K™ˆš,ó¬êÝøôú3#^ I6îMš Åu§¸è¾¸­ÍOÛo¹+Hd·é‚J“f«¿väD Hq¥ˆ.‰PGa$š‹½ô+È{ wó¥866ý‘)³Mt¥M$€ç¼S?@1œ9[Iºí –QƒC8€ŽÀؤdóóË&nÃh˜CTõyH±UsFOÊOœ²@ÖTqê^Ér/áà*æOa‹sv7—B“B“û{£¿Ø"|0 žöÓÔ½yp‰lzT'y¥Ðh*#mQ£W.½ñh:÷&@ç‚óõ/¨ŠS[ea›¨±3Qãæ56€5|û%féˆY+›iÍ•îÐ †\lºx‡:MÚzȼÁšÓ¦*5ÜLhTMÚʈ¢'SØZͨ«:æõ Eƒä‹´àPTt{qõd¹ lý|ä\7ç {KvnÔ@æ˵Uƒõ¼|ØBèK5Å|7-væø¦õòº’¨Ïu¥XrÞ©.®­Ü¤˜ØÆö½: Iœ!UãD "í4:Á¬ÿ¼Ç[h+%[¿˜aÝñSÎ-AGJá±5qR ßœÊdäS⃑Ïx~XÒ7ôºšÔ4%L¶z…¾„ž¿…5î8äÁ@é2G˜¥ãb·5¾ç¡ ÷(¼Mg ´=À/Y ·ÏÖ•üÀ`«Ç‚+þ”§%eûyûð"Ï ÂZ ؉eÒ¾’ +(c„·äù_¡6ÙĆIù{s–Ðäyc€ëIyêËݦxíòrG#ñ9¿ÅS%í·Ù™¶”EHG4íÝBÂâ:,zìÉfEàÿmÄþe%"¤Ý•®=BþdC´Miœ‰Æ#*¢úaá ¾Õ÷÷ä]!C ؈+ù¬EìûKZwd^°NÔn½È"zd»€Š— á»d‘FQ—½ù¦L îÜCb~Wk\( +ÂÄðè Ö Y@jPYجòM´uoñÎmç0µÑµ& «JÌ2H@¬?*÷[èòòSh¿'‹ Ê|³¡-(??ïEP×\¢Ð´3ŠÁLÔzzõÿ„ÛfAŽ–Üå¡Ó4¦¾½".‘»ë®¶_1sçí  à ¤ÉÀúx¯Í;:Üì« +¾´5~vë J¦@Z¦dˆh¹ûG?6νRúrþ§ +€aI!²†Tý¨d_c}üpx!W8Ûó¦Þò¥K„½¼xQŽ,ê6^HÓ퉯lÀõQb­jC®I»ý™].Y"WÈIRý­®’-ÛŠEå{é%(é©rÑÛ™3„•Pðf™Ì¨4Å‚¡f)±‡Ð +Ø÷Ò§Ø& À~Ñ}ÏÀ‰pG*Hϧ×uÑh[üO·¢ŠæqnX ¾ÿûÞÃJ5¬HÞÛøº7'B[¼øÓ‰ X“. +ÈÄÐð£g¶ù©»ïù ɸy{3ã>Rñƒ.M§RÅOÇ0i ÞÒ#¸gS»È +#i…ÃÈïZÅEâTü¹…P=Ö÷;…¾KOnœ†FQ©2±ÝVœ¬ïÕÞb!ý—XŠ6Ü!ãF%˼î-üšm“Gƒ}k¹®9ÙrѺÆyhö¹&£ +ÔÝ Åü-ç)é…Á +Ôòë7xN¼ßÿûÏZÝÿ+Oôòùoñ¿ßÙ¹KÛ[/Œ¼s°‘Ú‚¸X“ýÚºn7Cx{ÎKÔ >¿EÉÊsR¾âVF"17-rzþ†‹¨²OûìÝ´»*ßc$‘$NÊùHè=3ƒ)‘ +_ç¦c[…"Ù#®+IÔÂK cE5+ÊÍeT´;™éôçJT~AEöJ0:ª ÊUáòŒP¶D:^$x†C;¶ÓYì<Ö>WX¨¼ôêï$1 ÓO8)ݛ瀶&3$¯DŒCôrîú§0ǯó£šA”»ƒcîï¿F¹”sPã½Óºˆ‹‚7vRèù*b$çÖÛ˜Ø>k/­=x¦kƒZ6ŠÖ©­³o&iº£´°.€UIÏÚ%w¥µ6v‘yº]B:½>#LJrsúïA.¼ŸÆz'œ-àUfLòÀÐO>àYƒ#Ázu#—>‚¨í‰ ÿ_‰XGÕ¨‹¦Ç=lßÓÌ몙³A,ýu ß +’?¤dÌϧt½T†tÐÃa˜­Ç„Â$Ÿ´GtÇBW`Ï®ôy %A°âhhø ªæÓƒBøÙ,¼ Öà!N#Ø›™ï{&"àá…àëûSÑã5¥‘o^Ds|ýŽÛF9ìQå'à/F\þ´µÖx’ AkàBOÇ®3@)ÏÞè‹ßçÆWƒ +9) +qžT±t®f‹ÜÛÖ¿9À¹œ#©JoìÛ7QuKÁ3¬ýJ*Gòn|ŽT§ÂÁ¸m+ê1 ´9mGl¦K¯}ëð®(®¯0 ¾Ê±§†V YógÄ·Cõ#ª‚Õþfíh€@Ú«Ê‘7* @A¨víƒ/E§)m;<ðó~4¾ëV“„fî\Ó{áEkîøÔš[úß×z½¯s ŒB€òö1¶ÔÕ–ˆ8)´qÒþ¢®Xù©þ=Hƒ9°¾},jŽçMÒô¨xÞ³R»‚~;} /?NG‰ˆœ,Ê|±¶ÀDˆsá@äÒIÕÛêÓ®7ÂB·®_­oœü!9ÓW†ñÈË<µêaQ×—D@eŒ¦€r!n"³è="å¨Pð?º´N5-O +ûL\‰þc +U(·mpH¨E+q©ÌŠÞìrùé»n [QÕÎ;L–!Å°ÊË!sRQ½öG8á_ÌÀþżs³`þuÜyñ ÖÜé+”øÛi5IJ†mBÍÒú¦‹²×ÈNå¼'EÃÛå¬Pü’Ë®²BjÛFY˜+5 î”$pž‰Ð¨âYõÀ›îH±ÉSÂe„ô…vòÐÞ9à"A½ÜŽÒcP‚05Ò¯±'7¹ƒg´¦Nöe°0=µôµ—;²w=Ñp|¹"F®#GÃENáµÝ; ñTŠ/ÙWJáñCÝI´¢^ +·Þd*(Ôš^h ›¢ðz Ô]ç™ÚÕÇÌìR5V"h³˜<† h„õ)¦j]$pIÕŠn²ZîDÍ-•MMÝîº/ÐXÍq’YÂX=ä²átuC¹‘åÌßÞ¡k6L„d¤ ˜M»õÓéëp© Ðotûüö óóŸñ%•`¢”-¾;=àœèD® ¿eOQð–æ¹¾cÛØ!Rb‚zä«©y]òT`}l R Iü>¸[¥ÓYøŽ¨êÆ”zà ãSÌëÃ[ JéËtzbQ@mì4Ö¥xEm>p+ºµuôØq^­€*vÀ_=R8îvó˜À9RÓ|²"ãC5¦î¾õ^ZTµ‡ºº¦ k©4ÕÝ-‡è¯Ó !¥8òŒ#œß@…*=CJ–‘ÍX›j4\ÜfhIÉKí²¦–pÐo¨Q#‹åÖEù*neÎÇÖ¦'Â%þ°}™+E˜‡—ž*/¼qD”WQ·îŠ!šÂí‘ÇQm¦ù*Øq‡µ)d‡=OW„‡>mŒÍpê´QrµlÚEñ s¿Ü®Ff%º70 iFd…„*ùšÚŽj[= Dß­ý&*·Z=ôœÊÆÖ´€b€U½ÖT ¯v÷Ê®Í΢6g/ +át„m5áÃß•pUX¯¾9.0Þ2*P—§±óµézÝ„’á䧆œx¦¦þeP=EÅ,Þ黀Z©Ÿ¿ß}EhÖ¬Ù•gú<ÏFb°Ò¯|ÒÅ ´±œ-ˆGyöõ°+´/ð‘ÛVÃu`†í­×M_˜3ˆÆ¯™˜§)‘ªÂko¦_¬ˆÓ¾ ÛÆçB3ò†ðâÏ;Q×ÙÄÀtVE#ÒS[O‡¡ý©ÂɾuFä®NÀ4g4ÕÝãF¶¯‚}ô´&¥äøHÔ<ö•îèÁá†SÙâçÆÂQUúxQ×]Ä=žË­'»Ã40,ø„i–^×n ®[·k®Q¾‡Ö§ñGÄ&žVסg6x‚F' ¨Q7Ƚ–Éu>Ûð €Z^Ú5kùü{òv¼.ÜŸ³~ói –®Ï^ö í}vK9`îKëï3Š=u€Mz‘*G㣬頒#‰WI<åQB¨ á<Ç˸†|†t m6yÖ[ÞÌSÈ »?F2,©™±üDÒZ"}¹ÙEì+±=CU¿°¹Üðß`¬0ÛÁ†Å:íÜÐ7ÿ¹|g-®!54£F4ÀõVŽ×¾˜­îY‰öÔ£Â-ìtNUSÁäÛ’ÁÛÛÉKD«³&¨Í"ýq>*³,·J·æ4ÛºA(hÿ0í¤Â¯y)R¬ÂÛ@ï+§—5ºÁÏéÇ]ö­¦q{ÇjfØQš»m¶ö’./~ è±öÖùÖ&#üПovc¤Äº9Éjì‚T^k>¼Ô +8óŠ7üdèϹ=b‡£˜ÏÊFªmÂv˜WN‹›†OI÷²X0,S·ñHµ ë|mÿÚÿZgA„Xì>É™1üUǵ7(H)úFž~WÛ©¶À—y,ûᨌ6W:ÙÛZتôŠ8# +s%æJ¢y궧!By‡iˆ”\{ÄýõB®Ú¤¯™TqïîTµöý×h]¿â’\í°ÏÐkÖeÖsÞ(NgÊ?·»Ä•ŽV¤î)¸ŸI”/CöârÛsmÙöŽDm «Õ‚* „§Åy®èâË )¶ñ‹9,`¼mÀmƒ›Šø~q/p¥f 58W$4¸lñ݆9QT«}:7vë)¡-c”Zôì ¯ÐûmÎÒÉS˜šNtÏ"«þGz}eS ¯ôªíVýÎÚו wU÷÷É´EÇûÞTj|Ò‘H+u/^¢ßîöè–)dÄßÓË_iïxÎ_ +út$5DÚâø¶òá±N°xÍt6]Ïxe?²J:@é!§5wÔ¬›MDuñ8» cŠúKgo*•8³m]³YâšÓù÷ôûVÅÁhóúúŒ|N6¸9ˆæ…æÆn³n¶óŒ±–®9u»æÜóË3Q‹/²Û31´1T±ÉFK¯Y=„ÔØH¶ðÆ¥8°Æ|ðëx ~œÿJz*Ö1Sþ±–Eî c²qîˆû±A{抷ƒ¡%5P£¿âU¨ë8Œb‹\v°kO‹*¢rãŠP Ú=Oı#žrâ7CQ…®ƒ-½%8tu^ðüÚ6p‚5*ðø(#]¨ªšæx•~¤ ÈŒ ȹ„vM–£«‰ú^žIð3m:¶{vÏÈšºè¬Û7¿‹¢-/§‘ êÈwfw† ¼©üqbÄß·ûê„)µîÈcš66 O¾ÿ …veœqì÷öº’©øgêé|0$šÝ.à8ÄÿW·Ý6m;Ý»Çä>•*á$¯ˆµ]™‰`KF„@E:®Žåsèoë•‚B?‘výêëë,xò€fv4µo`¨Ö±êa‚B½Qu*ÅЃç1_Øèï_Eä3dëôÓž¨yí(Ùàwø=`€#ñEÙ3’{ÏŸ5À\±2Ê×g8©¶ù-šRz–Òâ®qíe eíÛÇÊÉ”›À_ºÝŸ^Ê ÌW ‘ÊUœ§·íIžvÜã4Ïo~Hò¿Žxè»0©ÐÂÉ•Þ¢ª-B~Òz TtÛ,]8«›»¤ƒTº”Hø‘Þ4/´„{‹xÞÐø¹!nvßßœgÞ²­Rw²b(Y °á&ªÄ­æªå«°z‡½‰ð½3J¤ÅæÚH\OÙ|ì²y¶6*wù¾è„c|ŠþO³£öMDî] ]-Ý>ÎóHx§­}ìŒKû‰µtµ¨xŽ²^ª¡YU‰ÉGAÎ{|Ù¹¸gjÛŒ’T“Ä­£rÔö +Jm°‡à©#uT@1øŒñLjñÇñZhŽ˜Ôu„€ÏPò„e srhoôÌV†\ôÎ/0-ï‚rs¥¸†Ì‰àbÂ1Âù>‹*Þ0ÚšSÌÚ1ÀÎñ‘F¯p)¦…QС®ê}‰ð2¢îˆ«¾áZ€”€X}D©Ýô’;uªÔ­ XYa5Õøˆ(¥¢8ð ð?£z6ܵ¦nÒÉ ÄòωðŒE¬—_‚$8¿ävÉD!äTxueg/•Í‘yƒÀUÛ‘ˈ(0ù­ªÛõgC`cËi°Ôñˆ *bGa<Ò)Fò “Ùæ*–Ø /½2<ãÉ_WåJÖuQcL½}×7|(׎°$²ƒòä²3Ùq@0£œÑé¼>þ[ŽR²C ,£Ûº.žiT–뛈1‚$DNk>»Ÿ(…AG„AË.ÃWx6×Ïï\yjiù×ûÈîZeq‚¬Âð"ŸÑ'R·½ #›îø¬¤ñ t#ú˜ÞìKb×Ï{ÖÆðÞ¸þÐ`Ò‚dr·=6m’i¾žªß±g»óðû§‹wZÚY8¿9Í}=ì\ˆ#ÛYjLlg™%?#¾]#ߣXPb–2@GÅv÷¡—Jà¨bÓ8ê¶_ Û¤6^ÆkŒ¢ùy73Òb@Êœ¥Î-uøJ çáÒ#%—¾kF¼~ +6­•þz ô1de©íF¹§è^·ö ³{jo¼û0Y!ŸQš[Ö-É_‰>"þiW’œ½?>ÞΔUPz¸ƒ w/–Èè]ß@HiŒ³’ZÜ›n³?öJFµµ^øÌ+ªéox¢¹]6Ó„E‰¬Œ2;ó€M×÷>ÏŽVÒI,gÔ¹B›˜¬A¤x+1r^€*Œ°(K«y¦_ödmËDFZÇÛ—9¶ß© +hæ|G*ÆÕï+gß +ßhEW#tåTýÞˆ¨Ø]Ÿ~ )Oä£ExÎ BXUÚ¶'¾xê%MX¿)Ìxš=¢Èb<9"ûÔùïÅÄZQê«@ 3ËœGw \3Â.ƒ^FIàG +°°‡™€±S¼,‡§ÞÝ|`$+B¢çBVRìQ•\iJZ½ÝñæJ¹¹›XõØ´Bmìïb… /š³æJÁÙ*_U^OGŽÌºÅ§2;ÌxLkêí:j2þ¸·eÍ2Æön£ á4 7_ݺ©ãƸzµo?ηÕz!½‰ý¸U]/èèµ°Õç½K”ämÊ\çïžô£2'†êùú ºD’t:¸6çØÚnjÝ¿G`¨R¬ÃqžÂ{Ô8SÂ{šô› p +µ¸O+ÍX¶¾¿–i¡í¬KÞÞ:ð¸Ëk|ÊáÛ«xóñq8£>gêäÈhå®T¥ûÅóCh†O£ÐØz™]X@2ÌÍãdLÉ]“­4åN‚JYóøÅmΟT'KÕ%¹O·)L0IÞWŠOº‡TÙ›û£/úzRÿÆà[§›Ç.âèrD³Û,ìÜÈMJ«¶â‰¨z<ÎhD³ Hj8wŒ××u•©Ì ‚þÏMiVLæÚä*e„&U×`ˆ<tÅ+ïrwß¹ÞÇ€ôùº]C³eLSˆ¹Ï£ásyŽ£ZCÀBTK˳/ùq€¢$ÉîkÜ(bWÀnŠ~ÔÍLí *æf•âÑSâßxZuBýtŒ \j[¼¹CéH,4¡µÕŸnìF-í%!²¨¸v´ë¦—ŽmgÂ,|QúV†F×½û¾g,©@„Ñ€— T0·áÞÈD¼ëZþâ½.í›óÌ-‰äËÚ6Æ÷a‹#ög@yh­ì«ŸGñtD^“@Ñ1sËMAŸžsó©XÁjbɺ‡<íì†UuКk#0ž-õ–ú@ô%&yíÝu/9;AzÎú…˜±ñòlå3v¢)]AU +Á áÚ/#µ°\®hH¡œ>J>>I€ËÌÍt²¦€ßÀõ©µ ±íPf žògì²'Åy€ÙU­‚4ÍÅ"—÷œr~íŠBE‡ B ±MOå…¥ +_°:Q<èœuG(c>ûü\[“™¾G­©JË…ÎCeȽº½DíuÕ>«åá¤÷ƒü¾nÇ‚Ç‚ù¨†n ¬õsŠ¦;µ[F/MA5<õ³mÊæÄÑW”GtúѽÐ$†YU~Õoe\¼æ~ "ÒŒœÝõ›®SˆÎ4M8Ð5ÝM NÐk Ѭ‘“oò‹0GC ¹j&&è ãÀ@”K[ï,HA%Ý¥­ÀtyjëÊ‚¬TÞËgăh +cP¾¾9¥nùÒ$ÄêSsk_´‡} ÊyŸƒ¬ñ.ÏgˆH3»F +@ÕךÜ:Mt ÇÐ#˜v-™Tú~Þà9µ¾PEØ9±²äëÝÛÛñC÷£>nbSõê¿ »ûs‚üäÞÿ³üûåÉëÇ/)õþÃ߬8üÅ¿ùñßþë?±òãßþû?þñþø‹÷—ÿå¯ÿô§¿ýÇ¿ÿÝ_þ¯ßý§¿þ»¿ÿÝÏü‡ÿó»?þßý‡¿ù»?ýÇüãÿþ‡_]ô~ù7èÿÿ™ÿ‡¡Æ´ÐœºÖ"‹T³qšËýøI%{üHYYKáW¡‹8ØýÖl¡<×aË–¿þw’­oVÏq“ç|§90×ÔXF Åý m¸?ä ½‰ÏƒJ±)ßßmçeÅyÑ3ÑðvnÉ^÷.1¡Š¨©¼¨ùê/íIôÛïia³Ç.œ%dºEPS¼ïôZõ¶×ÌÈ~ç€2ûuó¦üDß“dX\Àºàú“òÖµ 2àÊÊJyÚ4rp›7{Ù™³GŒ¸A(λ@^½y$¢Ôë +êý@ÇCÇ“w…)RÓþœh^Äk÷ÄhZôt %˜T–â•HQk‹Ì¤Þ´'•Ì„•¼{ ô‚nÑ}ReÃËŠÚL凂µî½ÆeƒçV7‰E "üPzee,Ïæf²”n¸xê/âªøÔ)è‚n6M-I{Úá™o¢ÖÃûÁ‡nætq^œÓ¦ºŸŸ&f4‰æ”…k¾\øñìa"Rd½£\2~à«zªºÔ5ÿÃÑ oþ53o†èþ“‚ÿ +-Í +¾¯µM¸¿ÔÍ}0êϘþ:ØSfwx˜Qü$P€ýì¥àÕ­£Á1Æçàžx¡¿9ˆÛ§ßØ÷@õ¥VÙÍ`M5ÊVîìù‰êVʶBp;ÀýTÛb¨¾YšÎp1I[ÈùÐ9:ßã3÷SÛJ­Äßy{póSíÉ8ø;àçù¡„NZˆ(¼qŸöuYfÃY€>Å·R +ïùûHú_X¶žÔ>Fk±¨BýI "¤jc1¬¸CÑ"âGÕî¿û^<ÆDZC³|ʺÜÕãû!qeX~”㙉MzéÅìJ~Ú«í9ÐÕáã•e—Ú¯=' Ù§¼^tvW²8D&Vw1|é{kµæ ú€eÃÏdâ9·¤ê(d¸?°];Ê¡1ЪÖay8Ï(€Z4%ËO`'Æ>@Æ\‹eÞ1JÔÿÈ@ÛŠŠ¢ï Bõ‹°õ§°ˆ˜ßQ…ª´¤åQòþü;g$W¿9xêµ ¦¸µ_KPü a2f-Âó¾ì… T ×z|j=š½Ô÷vAl®hß/O÷.?EGk½›DÑa¥õx«¸œ<¨P»FÚ)òuí±º„Ø<לô’×zŒ +«c, °=FÏg +,A²#žÒ÷ͱÆ|-(ùvb§´@ˆNÕV}D#n5hÄ*Ÿ¸E Ac][¶¥@Ô¼LßÖZRgÒ1`E]Œh"VZÊ•F—RIZ"€¨Aõ›ˆÚïD¬-§È,¥±s%8°ÜÅŠø<{´Èñèòe ÎmÞsãéT9 ç–n XK¯m-©nP™!/§­†äÀ~ÛØœDyN<—¢É7Û:èÝèW¬·O…Ú²]×ÄN ñÔa%Nm/ü|aÝŸiKåÁ^:{>„à€B? ØPß¾–Gc᲎Ãg˪Î~¦*ùºÅ@b*†+‚lɾ°aFG‡ˆŠBÌ€@±M]hÐ@ëŽÔerŠ;,Œ}!Ëåˆ,»#¢"&ø@ÜdÝaJxa?FNXgŽõŒãøùycšZâ§+ ‘¨{)+I³ž?ì(D.Øû 6 0z{TáQxÇ7*GlÝËfÄh.ñÞ€“:ètìÅ—(šo õMÖª‚¯õlvϳ>"ú‚I¹#ô0ZÃŒ“½î•n ^‰Î Wºv£©è9·b ÿÐ4«ÎñHtt´ ¡@öi5ß#¹òšÍ ˜âJCëßD¸Š·Tcåíà‰„¿ZWäCðb;»†{¥³Zà´Ö¼íc±D˜† +Oú'CÝ">d‘€¿»(±È¯çx¢WÏ@àïìgøûظx +T><ˆE<1ܦÄD²êÚL8ô­w†¿ÃB󫱸ð†=ºÀhR´\§¸¡:kÄ*|qç5Çžb §¦RO w²ÎŒíªÏ…ltý1±±8âY[¥-‘ñ‹ä“áVìÓ=ëFS3¡fQ…Â0.ð1ƒGÇ¢R[ù<àOC¿|Îσl[aƒ£ë~½:(_ð=~nÐëoCñ7îCl–ztرžGK2²º,ø/éruâE±Ï¢tzüc•‰ï§]DþÞö‡¢ë}bãtýˆDt¬¶ª•mj}âß×s0æk¨f­T餖õ£X¤±¢]ž­)ä%[SYÐmyoApò‹f•‡S¿¨¹[’X™­©úu@f,šå-‡§{¼£ŒÚílzƒ.ì@)¥MptM¾¦ÆâßðU<R…åã {A½~‘;з Öèøú;R–úÛBވ⯃pwh¬—žÍ…K$;w}x×ÚÐ~Üd¡%²P ïžhf{a+w¦>½Ä ë-¹ñ0¨ßï÷ã¹UÛ`v»¼„õãØ*ÂŒÒßf['w×5âKÿ6b¦AÒ+Òû‘|D!µ)Æj ¬ûÌ·½­ï4x!ÑÌ·ÆÐÖÄC© EX½ø›|S\è1£S‡ÛÙ¿ŽHòÐ’<·‡&ÖNLÇ]‡³º¾ìÀµK'7î3Úbt·¼w´ÆSæ^Û‘µ±¿e×°F­ÓÐû„Zq™c3Ñ‘«$¹¥b!œÖêã*¦S˜Ì®-ÀZv†zúÚ'¼dàΊmDl‹²;¯¶2u¿:1žöþõ)X¦…tÛn¡Æ¹Ã +“´ž(wï:ó½óoª?@_> ¶òÕžy»–Ïþ 0ULŸÓµÈMÔ8±÷â]àSš‰{ <»†z•àÛé\qÄCA9O×¹öiY~¯,‚j*ŠÈ‚^ü{Ó!N‹ÉÜÞëÞ=W8lâà³F(Æß~‘ ‡Ç…T×E‡4&ZYèä³2—¯jó”׃K×Af>³T©üû©IÆ_8•nÔ†§Ö×#xº›JNéÂFýë‡>òçnß'jçžÌ¶+–ST]raëê4hu`Ëì^”bܺ¹lÔ +ƒmLß²Íó /Z“jÓJ­Öš†ðc ‡,."ï˜6Å7'0$ 0#IB Ù'—¯WPÏÒ¨6ëéupRxÂSñ@dñ‡da±=gªé˜:Ñh)TPŽ *Zé+½¹(’¥€J£Ý[DŽwGßÓâiz°{8~ž0Z(¢ä4ÁôȃZn&lðЪ0Bv"µ&›óI‰q©]³ +QövˆŠ,×ÛjWסãò©üà.IB²aÙ, +ò"¯ç‰vÆHhE ÷ºÒ iKß’|ŸâÇOmñ0+»üwWOC}[• ÂÉÝI*>¯kÞ€LtÎE0à;Z/Ü€ –~e9-eÒƒ£”SÙÛAÝ #9C#nÔ2ªú ûJvLŽò³jî`ˆD£{«‚8d5Š ²s«n›kÕ)΃C¸¥JôÏkù$|~FœiÞïÉÿ… œx»5ŽëâÔÍŠ·H!ôzEH¹°f•:)…*«ÿ‘g éW[óíoÎãá=cZm1!ÊÀ:Nò÷o·Å«ù!Í~FÑ‚£XÞĬï[“Óâ±fÃfŽR¶01:Œ ÍŠ¡³f¡n=¿žÉEÿá +ÇAy÷ªiÂJܨՀÚì%à¢&'šãÑî#f3Œ ¥!Ê`E1ÕæÛ¸ðÐÀ'ªN©Ø á ‘AJ·œï[™Ô3…2"¤¢uß/I“ãaPe™‹¶ ˆª”Ä¥sùi3QJ-QH;Zd »çY)¯o‘„óÇÜ­~FäÙ¼g<çÅ"Eð«EÏs‹x!ÚÅð#ÂQзc÷ëMºzL9…ý…g¾ð½%)$o# LA6( Zc²¢Þ~¿!Lv)06eêÿ< Ha.z5 (×uýQ<ä…hà†©ÒwP‚˜¡s_‚]ËbXäwYH–aßpgü Pi²m¥ÉmòDƒKO¹1vR4‘iôƒ·>úóÀ/Àû´òn•;ŒR¥Ž<¡¢KÐúóa!ŸˆOºTQ¢;‰ÀBLj(-6ä¿®”Õ•öÆIá{jÌÍœ|{žžš¡G VvE¸ýðJlJ!Ëʇ'â’ËÒinî×…•‹t~Ý©sÄ^¦F–n +ZÊàÂ70hûÈVzÕßDÔ+Œ&hTõùIQ |Õç2ºœz¥…h»«¸üù·õ¦Éx-EåÇÏ¿ßYV¥FÀV‚²øGÔ‰¨²a}+¬±•]sñë€ÎëOK~ÿ©ÞȬ ÄKê€y7f•÷õÌäN2~ˆo¯)£CRõ6>O‚FÂï6)(1°E 4ä"bÚrí›×só]‚¨éDC<²?ˆ"ûÃ6È +•³Ä]1@¢ì_2‚KoœCÞêŠÀ ‹ˆ2ž{MSñÜm'åƒä,¡J¼¿ðÉ^~®¯+&]ÂÐP`hZÁ¿“‰Ð[уV&§èÊ´ì9C+ „–t÷.Íöü5,k#¦×ŒïqpO×fb’Ï}D€Sö¶0òû³n¼G)N ¢ó@ýÔùN¥ã¤ûzDR¯ˆ¤Žu7o;ä×çG”8§ùyð‚bwŪyj:e¨6À‡†Í£îÍ%þ)ÁþÏ ‹¾5¨e™¬OMàòcAä& å]hÁ9;Éö˜»0¥k ½sÔl.ÆŒ8ÁšÙ˜É¬ÿ»›Â#£÷cƒNu‰(ˆÒ±$,ëg~ýý <¶®¬óÜ÷ë ˆxˆˆ â))èì›rô²ÌÉ[ýÃlç „ü©B²Ðó‚¿ G¶ú3Öd8·F®ü6×þ½¨5Ó~„"'ÏÙ¦ƒHIãBþ)Æåô@ôë™}ŽÜ­‡´î¦×ȧ6wÒg™yGõRV(w–í°Ñõ ·×ú‹´n—¿ñ×ßD­F_Ðs‡Ð±ïþìöÅ!™o±(éQÕ[£¼ùÊfÉÞ—/ž»ºRF’}GT ‚éãà_åRkΔi—¯Ð +Z¯Õ —”g=Tþ:Ð1Ñ6ig÷¯ƒãˆ0—j×ë +4üCeƒÍÀÍöùÑ ûÐ(dÓ€*›†1Žó›óô+€š‡˜lêh]¬Ÿ Éð3â}ùHõñ= +dÑÒhšó”n:Ò¶j¡„¼C‡¬Ga;ÉaS Í´$PØYDŸ¤hjÉàÀJQt±²=„?·õNØö»Q<¡â +ÃÇ%6óIA >Í~SìS°QF§LÙ9öÓSL'ˆ &°ðSǨ„ ¿ö®òþûîA’“S%¦‰+köÂĆÖî‚”Ñ׆µäµ8’Ö†ïMÃʃ´G¯u¹s~F¤~d+ZÅÇy4?æa`¡îŽqlóÜuã. ·ß#ð¦“I«ùaô~õ¨EåRåµ+b –mTpqzÆUgýõUisl×eü[Äì-L•-1ƒp©ž°7›GôÂX j8ò +ˆQA Uõ›ð­è%ió“â(çð—äÂ-v†ñ ®«tO‡ÎÞ'ð€?ì(a'DØ­ç*ÛwêÛ”äpjœáµT'G^¼&J®®­ ůº¥ +°®x2Y ‚Ä& d+š C^k\:¨»éšÍbG¦{Öè\·¼Ò«ÎÜ)»`AZö›ÇÆÂåÖe¸¹{f¯µ‡9°ã¶'ƒ°=‹©l£xl£¢Mƒdq6ªè÷ös£u|] žQ­n)Â#4¡YL™'hRQ5è fø:ÒTØ F½!¿D‰ôqR…Øç§vòÿ³öv«º,YzÞèÖ¡¬ƒíŒŒß<´7ÆÚØøÄÖQÓ”Ú °ÔBn7øîÏóF~«jÍÙU…­Þ+ÇÌÌ/32bÄïÏ#• xΚf:s¼Ýê=¶c&Ò•/CU¤ BÆdçOrYÎrVøÛ1ß´'ˆ0=ÁñdéìŒøÆxñvM°á˜ëŠ¼=¬@0ÚÉ}û´Êž™¼kaDèh ª)p/5&𽡃*J …‹Ë±@wòc?׃— « ـ׎éÒÇBT¥*ë¢0DYñ6B¾(°ÈÂ(f»¼a •€ÿ9oy³£@‘6À‘-We”ÜŸUÌïšÚ>DL•„ŸqŸB¯è*®;6jE¹Ò›Ä©Ä=Hå<Ù¶Ö—­ùfú´Ë~)ñé ÚGVnê£È˜ƒæôn#•Â`ã"ÓE§(^hÎtøh3øbû6"õ1´JÀÛ¸ŠXDV+qá?ý3ÒE®l5ªþMæÍ5±5Š| ø´VÅi©Xa#SÒ…@T£h¬{Éþ×ùæQ€í%^ e1áÙݵ[Ü;©+o Aúétö£Wz2¼Ø…MŸC¦o*)A¤Zª°Ä£sÍO¢…xiñø$_áN!¢ß‡–EÃçEÙÒ,G hâk€-Ž½2lY´½E:oÿΑ¶Sý]²r¨¤ óih¶¨…¼ +ê#«…o< ”{¡:¾SQ°h^‰^4W’#\‘C´kàySb–0 Xô·aÎö&¦·À±^×>ÈêbfÁH@˜]MÝpÖ ÅA®ÀÖéùš{ÅŸ ¯ÄrfÓ‡žµš'~ªÍ°8 $C‰Ç6|¡²ÓUíZÚ*£…q/eo{±4Ÿ,á]§U£t-˜¿Z°Éw¥b!Fg†aDDÿÊÈÇ^uŠÒHµîý­GؽŒ²ï{?ø*6¤{ûalá c«`íx_ýZ/¥K:: ­–SØŒU6Þr„æšCåœ|+ôº$•ÁšüùÝt·¤œÏFÑubÏÅ*"½Àä£|ØÎúÍ0D¨ 9®ÐϱuVƒ­“µ6•‰ØÍOó!·:¢dÉH®™$Gåh8ß»Pž|ý ’ßÄH35š~'ñq}45ºSºÐ¬¤0}¬ì8þ|ö¦ußJp˜ž{’ý«<Ä) ð ðþ:4Û×Iü*žºZî--x^6sä&Ïá‚??“+ƒ)\=m®ÄŽªò,%ÇAáx”ºýö …+¬µD<—Øt€Zw"L7 ÷[¡:ìÎ +tf¢ +¿AÏ-õs¥g-mÛa9Ïs6>÷Z]“¾–ó.J˜Ô5GO^.®ºÑ‘±2¥qF£uÔ + fàS ¼]g€s5#Å §PQ`=Ý}ZŸ÷lÓŽa…Œƒ½ÁXog§6ÒÊe‡¢LŽ e¸jHŠ¥Œòâϵ¬Ê“‹>!ÊY&·¹ø+Y&™äñŽ²lË(? 3î¢gþ+hÌ—PsªÆ¿8z1±'P"¨…悶lo’s¡šw.¨··¥¨§ÅeZÑ²å ƒÁËÆGcô›ð\ˆæ¹ë:BnªšÝ{I=X'6¹tMwÈˤ&õ.Ö `ën[ZµEñc]Šÿù;ùýoømPî5{mÜÔ(e™ùÏ98PeVÀTD…r§…# °ø+°š7½;"‘SŒ‹ÎfU>cˆö’ó¬èpPËí[7ùÛ¿RàÄ(Y†à(©H¡–ÇÇ… Ô ,£ää®vèÓ ŒM8®ö¿éÓ€»¯£ô¯ìΦêÑiYA×D”’LQÊÇ¢fÕœ…ÄäÙ÷Hÿ²&!¼’ÆtÝ_†ÿ5²¤üu(%ÿýX]*¯í¤MÆÙ÷œV¼e?þs¶[ºͳ}ðB—›`PµÙ(±ÙÀÄžÀÂÒÍGi¶XñeX^è©“àøœ°l†Öf‘WÛßkN>D‘…Bš4¯""3éûôZMávÏ‘~ȳž‘' Q.`e™wö¤…n¡Âìç›ÈžþËÈnÏSé^X_«ÆÉÌi=½…=Vº- vÜ©*ÌkÀ˜î}P»j±jtjÄn>ow¬@zœt†i}:ë%§€E˜€1[-Ê«ƒÁaOƒÙ°è¼ÙÒ1 T¶ßŸ„8W•R]øAÑàÇL¹œ…Ÿ_ËÅN±! ÏO…ŠQ¶'Ÿ=m´ì0—Pßïõô6¯n_ +÷§ õêyìÔO5DçÙƒòðö S¿1‚ûBÒo”D€©zÔÃnŸ éó;[l¤Ü.2]°]»J¥"ÚùI4v½«xúñSYU Îí=?Ž¥#½T£¹gCOJÞ ãDˆ4¶U8 émÀ…i*ykÔôÄYQî.h’¾=.*—ýÓM?R¼ªÅÎMWvºÑ]åUüŸGý´öÞ‰Ó–+†•ÂÞàñ±ßfÌ*Ë€GªÚíìÈ-t<‘ +|žÓ¹¯×æ·£ÓF¿¯Õ³6ŠQû3çÛÓ +úÖÕúÇ"‘°Kƒˆ’~SPP8Lé¤ûé †þSÍ}2 káûÒÏ8%òòÚÐï\´½ô`Jã¸Ò’  7±?Hß¾z/JQFW2†6ëèhÞVkÚ‹X¼å¯$9ö™à¨žl–À*ìõm!ÌHÝ\+fdÃþ–ý}\‚ñƒMAÁùœúÐñ· ‰CïL—‹³—„<ž8_Ü!5ßòœøo˜‰”ifñ@iG²LEeš]b½8K4ÑÅ£ô±÷÷Ðýƒ«{oÿêzû·L¸‘@J +eÖ{Ù’1Ó³¨7 +Ð5j˜*…A¹ùžÐMO/$¯QŠØóêYšµŒÃ½ž"ïAMxÇD}6•ÊC˜ÃÉ(RXË!WR½Ùã‡jÎs@mK¸[‡¾ïÔsŸƒÞÃ>¼žt;ï4e¼ µG-Y—8ÆÞpݯó1™ŠS³íÊBÛ}~ðõ[6¿†˜ZfÝ`$’XÝÆç*#•!䥾¨qvMhoù‹†`û­™]òõ/ù«ìË>ºR)hûv* +tyÿû¸fˆQ<@Õ‡¸ày@¥WDh_á vI+DT‡8óG¢a½¹²cõâ5F9pK‘ÝËî{6ØU¼Å«ü{½éê÷¡†ÙB†¢Ø_¡¶Ì*~à¦BËŠ +;*Zl…mzì'ÀÍ mRÞ_ØŒr7âªTXãdþï½8 /9#b~ÄY®W P†¾Yie9ú€¯vú/”‡¯à`qLš«J œ²‹®­¬M™=yö÷ÑWµ¶Çý¥|ÇΊ˜-©ÂYØçþ÷¸´©,)Fj1°L}©ŸÃ gU65F${5£ÐD½DC*r¨žïA‚š 5Á[°chµˆÂü©ˆ¨¾ e‹ýå>8SRsâfN×^ŸÐ£Wo¢B0{´ßÙ)—ÑÚsªW5‡-3]™êb3#ézÖœú¸°ë î_ÏÁ.r–q9†•¥€m)¨£„‚zŒcÐ誽´uvè`Z±¸ÎÄJÌ'8î¶ïx&àŽùyÅìΚ%é¾Ð¬¼R¨°æŽY%å)vO+%N>ùuug>EyîÓ¼¢˜® +­b ŠòøÖéå¬ïÕMq¡ÂšˆÔ…²öT¡6Þi#Ž«†ÚÂr`FÊÝÜ©‹|ÈéÖÑ]DP—ßPקՈpÁ•¿Š"x*Vjp1„n?Þ³µÓÿOÉ”U§ó'pru:ö'Ķ ‹€¾Öëòµ0XV@7CKê¢V(†¶pÞ€`ó£ц+¢®F;dp4Õ^_Ô+à1R±K u,^ò…ùï”êêÒ¥¥°ò™Ó|ä33qº(<Ác[W²Pïiç£ÓÉ2 kqÁ7ÌþØ2üCÊ|õª-;P5”R¼Á­kÒjf€£bžB~¥ûwÇ‚*ÞT{)®‡ÔÐsä…у€'×c2ý&êSÌjT`ê~^4œ.àá²×© ”êO²ÎÌœu ¾AåPoa˺DQÓ/Øàžfsle¥dä…>Î,Ú~Ô“¸ö—4’=c“øË×|tfBï+xP–Jð “<ïÔÁ÷Ï[¹ÝÏ·ì真=`j­ël)G„xÙ4Eût›X BükÃ)ŠÝryâ- +àè_NÍ@´ö¾¦Ôp‡`<Üû÷Â¥½/¤í +n;ʧº1?ä>?©„£,€pÕn ä»(=´mwsž÷U+šd@"^^ìþSë1‰ÐW«¡mñót%vÔ8¸­¥¿ç¥^NóEÃòc&±ÍÛÞZîà@„GÓ™“ˆ‘{dåø\h z½˜‚+ J•Dñ%‰À ©aSç Jìl1ŒØ +¿³ÓœÂ¹›ŠZÎ…È"x0C‰Wy¼Ñj-Sâ†R/‚sa~ö•Éá•¡ê7t³DYÜîwm&ŠÜ@á%¼çAéîíc5—u o£îëo÷‡§[ý¤‘4³ÁNê!#t¶àEó–ÙÆî5Ê:¶­/å§È¤°½+n؆³kü¸xz^h$0WICTè‚wËÔ>)6¹¨dLJµkÏMòíߪ» +휑<°«©‘ÈõMÕÌ=wìUq¤fc¦Î£9Ôh7~°›¬\j<ý\ÍWŠšÑë-½XLMª¤þŸ'¡”8rð;Üáš['@Ÿ%•(`8DÝÎÄõì2L5#x#Š:ð5!ø «æJÕÕ”~Ï•°>´÷JÁ1kL=e åb(Õ! ÇþÕIßÀÛóô&£4´#¦ÏØÕ¨T¸ŸE}9œ{nbDÛvö =3Òá¹ÒÂ(aéÖ鎠ÉèfD?íQË3ÚðwĻܻ¬ëpJ¦-t?爟­’ÀPöD¸D»žb÷¸¬“¢ì¾{ï!«Â´÷A'C(æ"ÀŒ<#ƒ8‰¨ÂläT×ˉÙÍ +ªS!hëi +ë(_±ŽÝ›k1Oý @®à`^1nËhȶ£øòÀC² ˜ +e ®hVÝ=§qI+Põ­‰<,iÀPôÒÁlìã(äˆGWöæÚ{»Wžì +ÜÅ1’ú:}õ£# +‘ñiCœAøÉú‚ª=Mjµ©” Ý»»ó¾RT­@;ÊÑ)5C0sÚkU›ç<ºæþ[y³èy]° ü#œ®’Ìò=º1®«8iy답œ}׸bFlÕµâ5"¬ú(P…Êt.V7-,ï·lRWjl+‘- = u¡û×s±g*£5…'3a> +ä E¤©«Îv\ét‘ØV`®¯ðÇ:xß~£»gEÌ*íÒÕ¦h.²Ló1#ƒIÑì…[FSÖ©ŒÓL¡î ¥Ï•„`Ýx-Ï80 S®=¥0ýØ6ɉ~D—ÉФjÙÞt¥ÛŠ\ni[ýý ¸`¤Jæ#FýnI§Žlx{d t!B2|踥kdzÃÌ°Ãî¤Ð»“‘ýBw¥wCUD¤‰ ©àñS÷€@:öcaYçÞ4·mñDŠÄÂØóEÚÖ¨?Yà•?¹|DñãËuAÇ„¬ÔXkĉ9‰qÙÏoç@/€= +¡–Q_¥ç(ÒîŬ·ƒYµÕ7ÙÔv˦ÑFÆbÆÝèN#S ÌZ6ª&pƒî“ƒEøö ÆWÅžöi·ÊÁ˜0Pârä$Ãê¬#;¦“^x€ó:°æŠyÎø\@ Êåñ’ZzI]‡ùÖ`,×ü»6±´ÿk‰äñE÷ Íhû¡³¸ÄG$}¹ØÕýn¨ RÝBÑF|ºUsLUùBÙ´Ýc¶£ÒÝz`)÷‹ÈǺZ”Ý÷µò|1ÊdD` ït+oÉ-=H€æn]ñøéI}Ê Îù¯#›-:¶…!J³ÏjÓ/ºÂ–ÀèSñ=^Ó~6¿Ì…q§µU. +Ó1Å¢}ÝäCÖ!*ǘè8¶¿û7¡‘¨@‹=Û8îõdŽ]·ÝãzDôöB‹°¾§¡q³›éL¬0Nv°·yG´y¿@*‡PS hxiÍèˆG“\µŸ¯É'ê"·l}àÌ4={Ž’3Ëþž?ÊqÑT~–\kžzë»Ù¤Lr›e*‡K[m[¾˜«  hRnjÍ*ÁNÒds^UΣV”íÚÙÒGw·Å2y!µ'ÛqP†¿ b‹RK6É ™(ZĬ{)YOôôÜñí£ äâ÷êªùð轉å¤A;®P1öS£fêa¶Ñ%¢8Ѧœ3}÷×äèÔgݞΖU¾ô…®Ë¾Ð¨$®á2ªi-–s–ml úÎÎWêϨJ]™hÕ¬QÎ-j^ÐÀÎg„«‚¥HýèâTùâ篲*½vózúJ +âªFG! Â!Ì¡È;¡V˜‚I<Á¡íÝËñ:(l °¯“v±F®Íe›†ìÌÉêgMO[1Ä¥¶1–PúlˆÑ@ì$>9ûd +>Pq8¢¸·‹j¨vûÖ»¼°•B5go¥þUäÑßÞôïþUoпòDÁœ3ÿ+þï;ŸLQ+”`ÎT>Iáê¬Èص—ãYs†¹gG- +Ù_¢|X‚Ï))_£Ò~¸¾óSÓÉ.ÜÞ»Óä’cˆ £ûŠ‰1 +«ûg†Y­{uËà'nJT­"Fé³Y,Ý“¡Ðéz×;-¸> ô‰Ë½*™hV£î¨å’™NÏS›š EK˜Æˆ¢bwgí)¤Óάûõí¥f“ö¹M°·’â%«¡®m2UK3”¯ï#ô(DõjÍêpC€^˜8¼5‚uÌ—ÐÊ{ŽN)"&îfš}\ 7B•r`4nEIra¬0_Né"0x/ÛNw v‹¿DM*n|µèÂp V‚TùÄÊ­™È×¹Ë?ÏŒ"JÄYÇ1•éT ¢îðl{Á×àÿòó1gžIÏrf5öø§Ó˜YŸ•( >8gºëºŽ0ß$Q á#iø™ÙÀg^¢¦\»’ ã 5è™´Æç¡©Šð¹@~É„^nl?LŸ9&å‚–[ÉjÙb„5Ñ}ª‰|¶¼8 Ò9¾!ºÍ¬ w ˆU€û9Ë €KwÝG¢‹/k‹ï8›ð?‰ðÍt…ÉJŽo¢n‹žÓO³ÏóÒì‹{ËþM„Ï=b Ï•¾D]+‹v#í¿£¥·—*°YCý5A,MôÕm~²sèz=Ÿù .¨/¤jÖýU‰è~æú|¢nlIk¿(‹HMû*þ4yRR_ÊVC\¯Ë&I­‰ðšîü¹²«‡»Vp¢ŒŒÍV³9Û4™´‚h|\?µ=¼Mïs½¸—^€m…›Ù&ß2M{U2$85Žú‚åZ.@ÂËÞÖSg”çïƒQ¢©ôé)7VëÞ€^|~=žÚžÚAV}uÝ…JøÐÎœ~뉉Ž¬)l‘ªæ%õDÔÑ_ÿW­Ž¿³OðXêаÄ<ÝF"Rñtý5âÛ!ù% +ÚkÕ _ŠÇáÇF »{©Z“ I´ølºŸ7ÍÏ£`‘Œb8­ô,N— ±O &3…Ð×:RÈÚ3Ý,`ìëaÿfEêu–ÑÑ\&­Æ\e ¿ºS¡œû~1]\Ï›5•ÿ)hqo‚yýVYíÁo¨‰;ÈÌ@‡çuH9ã |©æûr +–€ç—ëI@È—ä)¿ 9†Xÿ(,ÁÒ­“Ýÿ;$j× ÝýkDjA‡ôŠ·tùöÛS|=».!Ýpà÷Âד ò^‚šÎ:’·—,‚N,£€‘ò‰àIUÉ…6ÿîŒZí'˜§hº‚À} HK Û—éy"Q9ÝœæYÉ/vÃ3àæ]çÚ^;ÁzæthyQ£]þ¦;n eУuJÑ @½Õ:]`Cã¼*S¥³áh@ç׈ì‹úi€Ö»ëükéI“ É"57j0\÷DvÅ2ðÐÕ î±²OÑæ‡}zõúÓ¤Ež8QûµOGuékg†v‰‰py¿À…Í\): ÉÎy(¹GDùpû©Rœ¦TŒÜG4*Šiu¸¡Z¸y=9O»Aú5š?¼s%ÈÂDФøÙøJ» iE˜Š¯¢ÇãÀ*Ðpù2>¨¯ŸŠW¥G#ûÛNÓ£,±W‚f2ãÄ—÷ ,Kp]E0Ó#µ…Òçñ Ieuo K¡»¦.×Î/Âw®`évÚÎ ¼Ê +¸1j`6| +"Ì7` Q„§b´GÝaYÇt&o„mïר¢÷ç@¯Í(ɦw*çpúXaC©jö Íí¾CÜ(1ƒîël¦J®S”Ùm &aM´ð€5©D*ªtOü¬£ Ž’tš_ Oð‹ž‚ÇákÑŠ2‚lß$B‰ó\¨éGAOLÌ8¸äN¹w6­*Ÿ°C!;ú[nŒÚ‘à¨#˜ýZѸý–cýtØc¬÷»yÒ:½dØ{xöcÍ»ËBJMšÕyÎAW3x¯ûü®®3"}Jºs:t£º3ºKwþbÕS5sçé0¶9‹­Ã€À…z7¾;®«¬€°ñî¾ÑMJufK÷²úyHü@„§CÖË+ŽQ#˜RاgÓžøuWM’H/AÂM`×Ká_`9]ÁaG=a;V ¤{œJÇg'¦•’œÕ+†X±ä+¯LbO‚@²Ê9 LõJJPàšêY5ö@b ÜÑ´/^í7r h?)+ëÞRroŠ‡hf'¼â€–“‘… T Ù¢â}1}Ü +R/óÛœ h÷¼ÿŽ–K– §æäAÁÀ Õ¨Ãí­ÇÝè¦È5-9í‡<…¨¬÷?í“!§=?`³–œ€ýv€î}à-@Csò>†Ïüx6‘ñS|/k<¶F?Ê=•¬ä†uy—ƒ³ù“ÜÒÇé׃ãŠH7?ˆ×ž(Þ,90ŽL>“óOdOU`>µå½g…‡)À~ oeìéc ض›y189ƒ’€.8ØVŠ`NC žÓ+ŽÍ¢$WÚ7øÖÜ.°¦zŸMòŸF©s>£s¾G=—h‹WÄjXAé!÷Z&ÍúõÀy»ÓÉâ׃ªJÔ rÌñº`% ‡™D®çðsöÏ<ÐAÅ|Oˆ%çºÁjíbÕw¤_a„î縿¦ø`æ_E'ñœÏÆ +¦“Š×å:KȹíOO#D²Çr…çÁ´æèÝ1d<ëõ¾È} Q5_ dþ5B(–@½è—\¥‹¿> rÀ·|á[¸S z¦‘g ³Òkï=I:îªëÜn +’8U·Ÿ©|òŒ¯ý UÕJ2a¬³dѲÜß8Ä hã_øÀ¯ßü•&•ézFsÏŒð÷ß•ràÖP;îÌçR%7$!€ðs²uüC×Ù¹ã³B.þ-F_¼c÷FRn¢+º¾ùsÊZJ›RÚ¹M_”}Ö¯ÇM¦K4ï1¥ü”ÆžívL‹>}¤dæÎ-ïܯÞÈÑ¥J«hðn0¢Á›RÕ_øLØ6~w0‚gÏYXÛ•…u'°£L©søw¯*!R‰ÔXžò»øolvà=‰ˆ÷ˆ¿»¡TÉ_ ±(šÿúW-7UNê 9÷ñ¦äˆs 6ƒþH`MjÛ=2À>»[p—Êc“uy/ó&0û9í•p/‰ë ;ÜçÀ1¨ïÇúïËA:ïæAáëî]Éb3ñó@ „¯ ös&ÁÏÁ†(" â;¨ ¸‡¶€º š®ja7<Hh¨êÎ7ìdÄA R¨]ü•@ž°ÿ<@çJÉ^ªªVôCËõ ‰·%Ä£øVöã€Ù:Nô¬¢æçóWŒ³­D}ò,Kül“44ê1WÛ/€ý£I¤hª6‹oˆ@rà d%lg +ó$ƒŸƒ +¡õ¡Qµ[Âüú« +×Êëyþwx ’ƒj30Ô ™ËÌlß„‹8 ¶ô«…0Ï’’ò{f™õ¾ìȧ•BmO×qGwk݈ïv¿ +¤S½_üáí; Ý6û´¯QÐüÂ'Ä$E‘|œâ8ù8L_#¾›¹¿Dݶj˜‘:ŒÃŽŒùŽ¢[n\²å–®>ú¡”ÀǹÏÃÄ›Žÿï§8{J¦5Œ9`Ñœ†í*m‰Šâƒ˜qÄÜ¡öi%•’>Ü‘…·ÈÆÒ#1*ÀÙ^Çl”„Ÿ‰ +Y{öžø&"‚ûR¾ø—³CΖ~­ÞÊó͟𤋮ÍÃM¡¦¡² (Ê‚zý·‚˹wëlÃdª§ÄÞ^Ë£ê‰*o”u‚_êœGÈÍ%t8óDh…^*š+%¢}D`ã›+g´>˜ ¤e^¡e‚(7€1Õéh<ÄIÑ|óNd·p3ÁöŒùù½ŽÖÔª4ŠnAÞ!3›gyýÖåzï}<•ô‘²CB çÆ£q õ1Dôë8êmÓ÷è,)qJ“Õ´ÛTø”çöˆ¹QOÖ<œÖu ÁÿÏ!ae¼_C;æÊQã0¢¬O[¨…¢ç7$¥£(ËâyX(÷y.›–ÏÁ  à~Ç­¯ûs¥–ÄÎéTûДýo„ó]„ú9¬–4•¼kx}ä±±H¼+Lfœ—k~ +OòÖcú©1ÅuÍÙeñ¡·¡9ú<‡½½êÞuï2/ƒçƒP6°vû‘5ÅSdb_©µjv?ŠQ_#ö¥·….Ó|ËÍFÍ%–áÔ×*‡Ÿl\§‘pkãXÖŒÒpmcò¡DÓá,4ô30×kõ£õ/½U&ÔÌò³ûŠµšû°mt¸`díÞ_i? +àc/ÁfØÛ …ìeƶ4<úq™(”Y£E¡¢1¯Ó=wK‘ú>e$"èÎ’XÕó—â´ðt?Éæ¨QTØßQQ8Ï›`¼Ü±ýk«];âfDM*tø„9CŒsˆ‡4ª*Æžß‘óÏ•zx¢àŽ—è«úú—[&é!ÌZ’¬¹0ЖÙs¾qÈ’–qT²¾K÷MpøÎl>¤^½ã>ïêoTOT#"št©›Œ;Ç*A 5%‰Ö@B_ ÞTïÄúóü¼’;eÚjRè¸v-P`_ Þù)jÊìÚ@Ftèøñ%Aý)(S>¯Gt>jÚ•½UPæ¹=¿6¶ÐE*PÑ[„"¾--[PÏ×SSDñÑL² ŽÜQ…óª~9$<«/TXÏkn+.¥|‰Àƒ´ +ß»'¡`ù÷`‘ëYÀiàiŸ¿AêD 3ÚÙë’G0ô¾D0þIàªdµ—ëùkXª X’ÓRò´§FS¦¨‘TŽ† +¬jÉ·JG5m&¨#÷y³g¤ÈÂy¾9c#E‚^KŽT»ü«o~±‘ýŒ¤?B‰¯(‹¬^ª-XJ B·sÅIÔ]l3ûåEÃñÐî{?߈&´ÌAó z©$¦Ú¶úâÔwæ[!,dÛ¡h½È;þÍ\fÇÃÎAÚ´ûtó’à~ë àM€7£!#rƒàüŸT)G\Áû¼ö¼­f½u +ÓÃøL +æMN³|]’< +#þ«¡ò©·ÐË)¯Å +¾FäÁ¶ê—?ß³‘…x*ïSÚL‰«’&Уùá›íy³ýsý˜Ý™DaÜçÜhËŽ£‘¦(.¨a0ùÎPú‘fAðñ_£‚y4´õÄ“ò¢…]Aú* H`¨†â HË:0 h%µJÑBõªG¡L¯! DÅ_ –_#úŠ…È.Û(êD‰»ZîÒñ(j+QvŒ÷Ð} +‡l­ñk,Hº™)è…†}|$›öz’û1¾"‘Y%J|šâ¡£Ž0 ˆÁæäxeµåK“îZG[P2lÄûçù]MGxÃê±Ð²/Tªs*ð5i5 +} +3¥¬\"ªØõJ;?õΰÜèTdQŸHò·ôq\ÊžzÙø¸š}™Eóo²-èawµ±§|“l‡ª–áfuæ.]­x&½uÐÈDCQù5"Cÿ9~¸ÃÜý›ó 0BÏ’c# +•Æ~s€ÚyÉÚåš/Sû—¨/Zª4//i›ûÚ#Ðヒeã5Ìóhô1 :#ô×€Ï,¡ñ¡¿}sš½FùfdmóØã†Ú7,0ˆŒbÔ¤õö|î2:#ÿ\ 2Õ0ŠÞ~¢(PÊ>PÀ[  ºÑU!Ç`t]E£>"*Bš‰w>"Š¶ûŽ²j@”n\-WÎâ‚b">Ê¡ +e¬Š/ó:÷bA¼[E~…îs¥"×æ{I]ûAþȉ‹íáAýÉ«?õ…g½+ÃJÚlí À‚RE‘O˜_ybSan±ß›cÙºG Ö¢ñ5"cêÂ}ùóÕ"öÝÑÀ ŠÛ“[«½/¦’¯­¤ÿ[°È}oôK÷­žM_¤4ÂT?€ì½¡¯3@šXâ°<kx {óÙfž£ÕŽpTLßâ$®{¬¿ÌIc§Í?…*èq`cÅÌP¯X~ÌÛŠ¢Ô(Lcèû{Šsœ€™€w¤ª~,Ò…¯û*ßœ¦ÅĽÌD\»:Ã_"ÊË Cúd½â/QWÔEq2¿¼Ž NòhÄûD>'îM•ž?éÉ£ºõ×Ø{Ы¿È ^ÁhaÛeç &ñïùsý«›Ö€G¦Pô&rü5#ŠþFX¢‚;Ö }‹Ÿv+1“YøÆkDѤ{Ägþ¹Ëà_)( .½¾’¿eÝ\J4ïáó¢å‘BL¶vqÝ׫ÆÀ mø9u¥¯çP§Vù.‚FÀP°òB½î¾ýÕžtïcù œ•â…º¾@Á[„…¢¯‚’ª +ýkDJ+™dqÅŽ~謌ú£R ðƒ•_‰Â=Å*Ü•KTjž ùÊùbæå╨{% +c’¿;÷óÄåsº%³çwk÷7L˜©úŒ<[ BtéŸV\dÔ"îUÿ¨VÄÁ¥¾©ø1ñ@Á èw%qª¥ÌJX„ÅJ¢Í%*iüÜÁ7ŠÞÝaƱÂ+n´ZX_¾Äñ¬qïn_Ü/‹¨çü…È9HZm+#ªgh(vàL^Ó”äJÏÉÙ÷xeyëyëyT ¯£Â’m±sãʲ²ß ©>K_ì~€š’†ÂÏJx)ü¬Œ¦@ï·¥Žâ·c8ûÆ©“ÚýdÀäà\±ŽF—Cê.ò?ï@‘jÂÞ ùÞu„—ÀŒ6×g¿*šR{d(õëÇH­à—cÔžÍôXTºIäávVÎTËlx>â$<Ûç +/f64áVlkÑÐ.„;# °ŒG s¿ {ø“ªÛïAÜÀâ*¾4"îתd +¦ýñ¯Bsþ–ø™¸ÿ*÷¯<Ù…Ulÿc‚­ÿǤAóãßþw?þÏÿã_¿XùñßÿÿôOÿ÷û?üûÿíþùŸÿñ¿ý—¿ÿ÷ÿÏßÿ/ÿðŸþËßÿþOÿõÿûûú¿þþúÿéŸÿçÿöOÿïÍE¿ÿ‹ÿýÿë?þÃ?ÿãüû}‰?¹¹çs4ü¿òÿÿ I›käHcÕ>Æ¥RJýÁCï.Ì™ð{žÊŒß!ð`$©Ã*}±è¼râÏñ=ñGsèHLš·¾e*7–Ýao<ïó£±ãQï¾Ü4þص¶ t©ŸÏ—("¨ZÑ©·7 Änaß׌è;!6û˜æ¾ì.±DlΚ݌Fqà¡Ñfy/,ML*¶“ëžÐaå4HdUMŠæ´¡Íxh-qsp*˜Â’áw|–Ê[±üa€JAvÝ͈½;§ÊòÝq5­šˆ0"Ž^Ž7ÑóO(ë"úcÅ»#³<¨ó;¨ò(û7ŠKgzNÄN7ˆ 8–  ¹„Î*ÄNêáí´+nà(Úíõ¨¦úø.EpHïEŽ6ó¸>˜î, õ4ö÷¯CL4³w¶Ü:pFœª¸R5ÏЪЫéí~!—l‡ý²¨Ìë ¶íûfTWs©ÀSV¬Æ}‚=­E®t<õŠÃ +Ê}—A×¼hGJâTt\ŸÌß Ùò¾Òs Á¡¤…Àjf؉ÈéÄ÷R?¢Dñv&ÛÓŒóï{gî_Jñ@8 C»`ÀA0 Þÿ9?Ü=¢Ô& +83Q Í|#:f®l*Kîso%©a‡JÀÀb¼tJÈ…^mî ŽBˆÎ=Í7v'…ÛêÜï¿F—k¾EI¥HÀÄ™}ÍùwÏÚ›ß!‘Ïß´W»_°#ÊIì ¾@ œ×»_ßzWµ_ƒžb5{ÿb¼±ªv­¼þA)ˆO½ßîhªçuýr ÷¿SvóWT;‡-ö ‹5oßÞ­AÓ¸ŽÕ[àÁSÚƒî_ˆ5x>e£ DŽÌxEÔë7"½Pex/=3ÎSõòV®Àˆö÷ŠFL"˜¤&¥¸þ¹ QôöÑæ&2§it¿uœ. Øyä¸ìÇeê㡱Erâ/íe„öB˯á‹×B[”¦ì•B%y&¥ýèhi¡šÓ$}‰xÜ,Mr}«úßD1ìÍ5U)U˜¡úÒ…Y²·á?:{ ´'n‰‘ã¡g€ú—ˆ 3õ³÷¨$ì›ó˜_1º†½’} MÿŠÏïFï{lB¼ÄÁ¢ð@²²¿st›7{ë÷¶1I4â^—£°WfA»x¹v¶\hä Sæu Txj±×®~ž ð7-/ȰɘÎÐá] €š²aoOâÖ[[NáEö¹•>Ú£ª:ˆ^v\y˜hsg–ìÜ/Æ@W–ñ^¨Qr±SÆAÌUL«€jäWPt í³³&V§¦î6¿þËàsL6¡þ^ ôÌ'"`x*{WŒéZµá¿‡GùyåBÑÛ" F–ŠÄž~À8÷v£ÛE¦¡/Ž8õs¼Ku4/D7TÏëmØY”û×KòkË&ÈUD ‡«ÒØyÚ²HÇ£ÿÏâÈ7ü—¾ßϵ³"—¡}è·‡„ª â…=Ø +cŸ¨v±“ ~ì‚|§ñ‹R^]žÇÁyJ9ÔPÚAPCA»JJFh»Ã}¢9hNRPv/ü„½)’ ‹å  ˆ€™É©È’ò°)í©2<¬¾¯Ë=Ü‚!-™¡ž~“Ö>Ô´÷¤Ç̟ݨ¬Ÿ1õ5j¥ ±°Ò—ûͨh÷¸@”2ÑNýSwÝ»«+#©û—€ü´¡?ö’úõ,4½hfÓ;/Þ‡¸úiˆ› عÚK¬úrìVWÍGÌhÇc ¶ÏÅ®aLÑ 1 zÍ•¤€-j9§Äê•òZˆîýžè±35 ënêJ¼}+®mæxŸkøÜàdͳ ž¬wø4-”Pz[ˆ2V£tïREƒù_þý`ÿ¾×†;˜#àt +*†ˆjMbQÊ ++c¿Ý(VU—68(eŸ/`€ž 4÷!IæÞ†e˦!³?¾ 8Nlú½©Ú—¨g¨_ê? èÁ ÃoãÉÈ ÷QñQð: »Qü@؄澞ë_"RD¡¯f¨ŠöÍyÀ½Y㹿¦ÖÑ#²M©,Ö׈u¿Éƒ>•â¯Qx tq>4®öy‹ï+û î×HåâÁлRKºÙ|Ünò+†=Yujïü-F7ģ⟟q@§c?D”jØMc ûe¤T‘ߣPÀªçõì}ézlb&÷üÁ¶Ò­Àêi›]¢,"Ýn)ºÉ '±ëuÕK²qÃ꜌”Ý'"uþRwϸÜÁ!EÉiu˜½ž'+reúʦ¤^Ù܈«e4ÅS4ðTþànA-¿uáAÇØŸ|¡KtÞ͘*>uáPMýN¢ºu‡AëqéK£Í’Îq{à“( ½Î¿C¿tëy>çG5UâÀvï‚dœ»ëaËæ2Ý»PPÿ¢¾Ûrlr<"ÕÊUAñ ÙÖ÷—@¤¥ªÿV>@u\Y[M$Ù,ñSL~FV…IG Íä²’ŸüùLèÝ„ìLñ7 @««¯AJ³Ó1kÔcÖ’2u:Z¬÷ l0…”TäSÓ Ìü7°£“!—²2O¢³ÑdŽÜk¼NpVu“è¿œ”¨ÂVt°™[¹iý ŒÕóX¬e îa«5W‚ßÖÝ{ïïcðˆkêG²Ž/Ñš‡íBTÒ+ý,.|¼çÈùÉ<"Wî“Ζ÷Ø*ˆÚ9Ÿd†ª_áÕ[O½¡+‹zqr›5h÷‹jë<]ÀÑþ.?ê+*êÔ¬/&%I¸¡0‹ãêM §ûqŒ£yÜÔU÷ŸÓqK†¦rùÎ2 kxû1‚5eüštJ,K{¡¤•XáÝa0³ïú×Kwf7¸':¶³è¿egïªîu À;².Ífž¬°÷#Øw«A|šàT‹¥?/te1’ws¹¼r›}¿"ÿ—«ž;(÷:?1&« H·Ÿ0Ó€@èzò)%‘ endstream endobj 78 0 obj <>stream +¾.²œ+NÍ„D× ±:ì£h _ÞòëA¬ŽýN0u¹yû‰PØOϦ¶$¯†ÚÓÎ;î•~³éÊö%Â+á»v#«ù€øøî<—îô Îw£Ü½G¬ø±Eµ2LGjXM£ïÍÝv?\°ZsÎæ<û$÷#¬ï‚Â*Á‚ÒYr:jŽn É”&]¡.ôyŒ¦ñþI­ýXÖ%õK„?©²ÁÇB%³}s ¯yûK ×½®ìDN8+0Àû›ptPðå„ÞÁõ'1zsè=©6i…ÅDç\*=Zz@V”I-5àÅÐßæo¼ÐéïýìöêÓîËi /5vŠ5º»4¤'\¥þï"@7A?¾¤8œ'÷%ŠþàTC +ô¸y^¿“.²(Ê7¤{xy1.A¿D¼ƒ­ƒ­aˆóÍy@Áà ŒõÎbäñÊ…lâ^W£!µ#°®¼m0‰¨Ù{oªÛçJÏ™‡5ôb”èŠù;ÉyüÀ)†¸%<;b¿åe„]JäàXqù +n}®d·sÄÎ Q6.gNOsSœ¡+w‰€j&’!2E²ªžŸ”¬ ±ñûýIh³2ø÷$¥˜ S +¥@ö8—U6؉ŒHun#—™ëYïxÛê|íæ$¿DäJèOÔïþœäÌâÚbˆ›TéN³St pß·Å Q¼wAþÕé>) Ty~Š`ŒÌÏÉDê^Ý®¸@˘j–Œÿ_#¼þ鮘ÈÇ×oN†ÕRÓŒ‘Öâý:Jü_#"×ÀˆŒ}F.ôKT š’¯ ³7üè¯ôX·rÝ€tê5śDzÇmmókÄû¦>ˆLFÿd ·‘ŒÒ¦úŽ/É×v{…o +Oc¼eÎ_£ NùU /Њ3‰Ã·ÑÐHÕ"!‹…˜ÐA8>¢NË\¿Fä‰uU(Öо}sžJA }Ç®ÍÓÉÊúÉÊxbõÉîuìu'IæušàËÁs¶tÏÏ>¹OÿŽ1¦óêã;3`?]Ü¥ï€r + j¬¹Ÿõ摽JTyMäB0Hc»çA@ŒˆkÚB;œýÑÃWÿ‘s,# K1ûûKÐ`Â|¸Bfö¥”‹¾„qPÄ;AÈ:JæÚÉ9f½5ñ u]ÀD¾DdM[v€Hlö·õíyžóEí+ƒ¬C°ºˆfœl ¾‰X‡-/p{}rÙ?B7Ju:Íkš#Ó¶èjÚÙWJËoÂåu_ƒÛ r +­Ý7lo"`ê)áØ«WOÓyU;¢‘ +W-Ós ‘Œ#“­¤,Žõ9oV‡[#r»{§וŠ÷¼d“\YEì;Þ& Þ›(‰Û-Õ6zó5Q§×äî„›,yý@]wÔE¢óƒ}”åZa©Þ2˜aã›d«}#Tº^=‚_£—€39“Õ`õƒí<Ø ; ·Û#¬û‡ ù\>>Ãwgk ßùòÏ_ÙÁb3$a¬éä›k®ŠÞÁ-à‚b΋ò…Ö EÛ€ÙºH¾¾e:⬲8 ŒÚ§¹˜è§Øºÿ/Â3÷HÔ¯x[jBæìê£üDynôÞïýèÈŒ¢ .;þEGõKÄw ä—(ê›ò\)0€h:lgãi.eŽ}Ð…åXC…Ú³¦Ú…U–±ºž×i³a4ì¥w×cïîíHзí9ˆ¾Û>xÛÃŒ®Ú³.x¡‰€»§j/F8IPü·ŽVÝl ¼£ M”E4× +À ¥F¢&«t"x7´ÏhêoË@PÃ.=[ž)‚ ¼áÿ¼%à ´à´ì“fŠæ–Úþ>¯”}PDípø~½¬Q Ð7‚ øª š¨Únç9ã% ›¥Õwx]j©Q¢®TÈø|oU÷E€ÂCóþÐ ¥\ ð¹öoŽwy éËû…þ¤ne›¶w·OwÏY°ÚQƒ‚@ù‚¾]C<¬Õé‡"‚iêcíÄgþæß+À‘\©êQÙt†eƒˆ'Ñ€¤ãBþu}²Dís€TNOTì&$ÙSI#Ê6âŽj¾{z«ì Ðû¤©AòDÀWODO÷ä€ØmØi`׸’(Ô +Äó¹R·%ËÛoåÜOñÏÝâ`•6®Ó›µÐþd:xºó“½¨ì]‡zØ ˜·kªOÀ‰"0¬ +Õh×ñ’O,š˜–Û(‚êØï‡C†É^»Rš4Àùsi,|®ÓPû{ÖÛƒ¬}°"ŠNV‘DPJ'bY'êW°1;B²¾wÀ´¶ï ¼›M£*ÞR;ªˆy½ÏØ©zðäJ³xž{ +ǽ%6yoÔÀö‰ (‚XË!õ¾³DÐÅÌûÓTRª!HÀ}¶lb÷ivræ`=ÐÑô7ï}Éu½CçÄû‹Âø~ú]“I¾Z¹’\ö·…Ξ4­Ž5˜!aw¿ü{ŠóW@Œ¿þÍPˉϒýŸeÏçŸ! ï4¹ðyŽõ=¶sKaÎ 2«h1êE¡HÂþn +—æ‘@(öƒyØÖ)­Ýï¯yaä"{=ZìGûî<ј󕢘>@$ÌÚk6š}ßD ÃÅ¥èãççÐø“¨ªÛìåçÓè#ÉýÒréñÕ5³’+5ÿ…&>ƒ› ¨ú±Vàϧ¾QHD‡†Î<ëiÄ©oß  ó K_º`­‘wg:o·w¼y 6:óÎÝ°†é Ì»ø¿Æ~ðPaΖðtw«ü&(Ë©üYŸ YÀeR…Í×SÀÁ?ëCå°…—RZæ1œ‡<f+Ã4)¶Îõk@¦…_Ò¶¯§ANü!•}ŸÛ7ËI½!ü5ÂAÐÎ x^_¢Ø(š³4@ú¹áynø´Qú¡…hŸ~O;}$‡Ý·|ñ‡ƒ…³3Qà óør°Q±‘¹ B¯s•þbŽlÌ¡ò0/01´åâƒþý`—ÄXi¼ÄÓ=-éPOŸ§4ªžÒøìßD´;`3EF^Ä—(´\úPÝC>ˆ¢¾XúA¸ï‹­°!H y­8<ó®»ìÐAOWO£.÷;!9éJFÛõm2>t˜ãE’²Ñ ‡œѬgbsF[°’ûÏ+e±ì@êõLîM*¬JÏÃi‰4æØŸˆr_á•D¸§æ^\¨ˆÐ``Ë×Ò…ôCˆð¼ËE¶Ÿ7Ã}¤=lyŸµÌÌŠ).è°{Úbþ5â % ª©ŸïŸDÑá§rÉéèèY!dbJ /§ðIzGýnÇ—ˆ?œ¤é^lö^¨PÖúrÄ),>EWË´T¤¶¹b_"PyotŸ€( iSa[ª+’³#¼8Å?poÚOùPöìNú×ø»¯ŸIÚ +ÐLoüËy}­£îCÍ}Ê[VÕof©éRö7RÖyÜ-»¿]÷Ù[>@§Çìká@äµ°ãìªc#ºcž ™Ý H ï]’×A£ès¡LÛ§ G‘— +"QW97Ì|C2ÿV/rÀ=%àºi?8çäé~o…ˆçƒ´êïú0D{SÐ@°FÔ~týd¸{“^¯.W’Ó¤̇òkã9O†Î»Qû…ÌtL¯(Ú´V³€:MÃ*ƒÅÍEvô³Øë3db¿dصL2{7_„ ÿzè¦[$9J`ø€ØLÝ1C̯ÍçJøÞ si¡·',Ü`°„}÷l¹‚ùÞs’pýŠ6héŽr @"k,Ï`$é+ó0—øs¦BŒq÷z¶¬­€(•!$G%„ SæØî˜\€$„ºÛ׈¡š3mˆ=Lêרª ¯·›v0½\zê3ü] +m‚q§¸s¥/Q¾º kmƒÁßÿ<À@ï „£¡NW™®Ác¿‡ô3僯Ûãd ½±ÎÁ€­Šþyz‡Lp§‘‡vÊ †&Q8^{æ9*ÀF94:ðFKèj;jÔ‘êD: mîÑãà¶,ËÞ¹—þšÝd9‡%‹½p]o-ÕjШz'‚] Ö’Þƒ^8˜Lø«0ºËÇj9Ñ«x¾˜¿½ž%ߌÔKý qï¹æ-~cv*ìw»¿ œˆ¥¥ô׈<«–Lñ™y€ßœgòŸ4šâý±ZsDo‡ +Ê!zvS³_Qô~(ñÔ± 3Ì¡ú»s;p4¨£’]:Ã,EØ»NY¤ö†œ/ú™éÁí¹`ÏךYÃÉv/NãÝ@}‰Â·Œ\Ý2Ó$äˆd}ØÕ¨¶ªäW"¤jÑ ×‚ŽZ +¨ßE¼[5yÔI)ì~sžuh¤“¬=^*N“ªL_#¾,ÏInBxG’.P5Ib³¸M«Ã‰«ÁÎgI%%[‡«CuÂ}ÊK[¨A›P¶Ã>ŒI”{Ù!-DªÉ°“MÌä-`¸4ït}/Ýצ8ÒÛ´¡àŸ«yqíWMº§R(öQHŸä2¨Q¢PQÜhØ m‡»W +©þ´¸«ì9ðòw?‘Sаƒ¸‹d¹Å$-=)AèéÓšh¿‰½ûÓN¥¥¤¡Å +ßů{L.I5ºL` =Ut=p¿F}¡'‡¬C{{[_¢H -ir÷tgèº(nMÖ`§ÈˆÐ +M¢=°÷Ï?OY'õTïÕbZÏ4öz4©wØeóØÆâC‚u;ÆNÞÁ_Àÿ½@A¹ÿ_ðRÒÿ„{N?àï„Ô(›†><;³ýóíþç%BÕ"ߤ鑶p=7…ä¤ øWrõ½B~¤®Ò{7=éQu\ ‚€Cé«ÀŸ…Wq¤Yhš,¦Õ¢ÓÜøýdØâ±ïÙR ¸“ù‹­—V±{Q|¿ålíÌÐvóÎ\a\w*j0GX×P€q«4I#.Ðù§áˆñ9+Ä@b¥>¢8ÏuPGûó¯ÂÊð’o¶aËA +P²*q£èÀ#éì +>ý^Iƒ¹©ç¹Û Uþ<Ù% ÌnNð…aÏ3X}G€Ù\Øe¾yœQœ†ƒÔ¨'Òj;a¶Á¼¼ 5ªçDLÿüBÛ‡±{$»5aìÞìJ8n6g{”ñ4¯¸©.¯!,Õì|©ÖÚŸ&0T«7Ý`÷§èE‰¸$(ï®~¹Ôé¡”ýmØmÚèúw +>°—e¥BˆÈÈž»èau•!¢¡bÔùúÊŒ`o¤Fì,߸"Í'PøFCÖÕäFI3[rÛ" £/€C§›>2ÚïÒp˜R(dãÏï„VÌö§N `djoîÆh´ð»¨hÃïzŽí°)HÇ;–­X1Ý9H ™@¡ûT&˜¿Qê+AS15ž`#MDá…ÚdpÒd§X¿¾vÚF¹Tx¼Ë$?-I$€s– #/D,ðT.¤¶ä:«fwŽI][¯Ì@‰ž•“ŠÐa>Ia]7Ã0P®£Ñæó¹ãHªM%ùš¼ÿG*= a»Nû÷÷Ñá#íkÙ²Ñ9ï>g%ÝÈÄV;©´œp×.Õ’IâÄÞ6^ävÏWžVÀ³íÈܼÓQâ ¨[6­Š°FÏæÕÌaÕzÈ® WGD˜4vÍ_$=Lš\@O}½G„GL²ÑVªw3¿#oåÙÙ€r}vhX·´ƒøÃÙwKÆ{;~eø 4I<.ziKô6l8bdëö±ï“þÙ/ã÷¿áÇ(ÒèqøîQlç~/å@è—îdÓï°ê1D,UlLˆbLddiKd»ÈìíÁ {©wè =ÅpüHoª½éWÉÔ(KIO\íšÝ Ða˜9p@ÎòBØS"®r„¥’·bÁ'ž‡€;ÿЬœ™˜7,«‚£8•bXl©@Q ¬ +惭9ä5oñ>áöÃí•ÐÀ·‹¾Úi²÷lh¢)…šämµÙ:ǃ¢[N2"Qµ«í™ ß ßZ·C7OòVê‹ï#Û_äþš‰b +I¥>¬àß»hÈ2”5 t±çÇ©'ªõðÈ®aãj!•ùóBÇ]÷¹”ùC\Òñ¸@·Wy +ïÞ~ÞÒ‚Î*î €tÛ:%ý¦ð7»,OcosŸ¦Ány‚© +6¹;õú´°îq +ž7œá—hU~ŠX œ/%h²÷éOM,‡ÝO”õÿýd§&¦oßýÊ×JÑ +¿«Â>šáúö¥Âlç<بØ>¥­ØÄBLn¬„Ô³'vRvEŸÎUQ9KlZ8)Ú¬a¤=•! \%¹úûó DJ“y)F÷ÙÉ"p3“¾ |l ®žMaéyží5Ï&uRüwŸa¯9Ä+€PyNl¨—~šÙ!•î`;ÛnÅC.Í´ýs ™Ç)ª°'÷FŸp§Òó;ÿ®!Ó{þKàà^³‹îŽ‹5›v[A"â¡+(u§¥ÔÙÎuù~¹î§®J ¯QûiTE“—(™%ŠŸ¨jÙPT¾ÁhŽP;x¬6"…3Sã0¢½#ó†ô\h”wÜæΕH®‰¸£x9£ÎÌñ'¿èºuéVEc©-ÑïS€INMg?a¨ž·½¡ ©±×p’z¸æhÓï9}©QEÒÓ&ÑíÂýÆrlj +3ÊvjªÍMöQ·¿æ°Êø¹°ÊZ4 Tü„°¼TeÑhDŽAE­GWDµÛ¯VÜÇÛ{¶s·£î6ÕòØšEFIÍŠGs—AfIW¸¡¥¤®¸Þ;£=Ÿ+M±G¢“¡Ï|ËFô$Bõ +¥Fö†‰w\gxGLéÆ.#8i€Â¯?%x¤M>! ©LÄS>ókdöß_ÛáH X~ ¼bÝ5D¥¯^Ÿ9ì'N{ÊÍCk¬kÊ*'µ\×Mª‚úªi n7Åç*§…§J‹P¸±Íùr÷ÚhGÏÕ~|×1ƒqSg4Š—š•5àq7u?½d—ÌÀnýºî’3:VXWêW8ÕâetR kYÿ¶ýYÓgÊ¢ŽXêèš3l‘àeØBßúÀ|…9,dW"‘ßÀ¿¬ißAð1ºUë°S +¥i8¯£2ÆÎëEYÒì‡[Œ_£’H{pÖ“$B²ŸüÅ]ï§7lmΧ€‚?õAœ²’¸d¹mrVQ0#ª`b7Õt„^ŽÛ(]m:‰Aeˆ£`!• Ô4;ËC9*TQòB¾=ê÷p®ùLF:°åR›°}‹¶€YJ¥¯º +È4H$ôì>çÏj Ô¢dUÁƒ’ÏÈNnîCcÏ€CD¾‘‚Ó©öD¥x/¶#ñR–5çBzAÕãeÖõ5Šò¸…»ÑïCÒWÛIùŠD¸;ÆΠ¥% Y2”j3쿆œ£‘Öì3Û»ÞXˆ1‡ªÈNÐãF¶—mÔuxýH–šë „ƒ6·\k¤påÓ fw?qyàó`1–½…„ .ñÙüZkÆÃÞÉ€« HHtèäñQïÏÉ|þQEª¹i—œñø€êF‡”›ý d®‘fËs‘•ÅZìì +ÝÑø ÙcöÛñ>UºWJ¬­zt¸]À›‡»¯Ê̺"Š&·VU^åMÿš4 …°1…ì¥Â»M ƒ}‘Š9u÷<4ÙmF”'‘‰Âõ9”Õ»¢}§–Ge'Ï]‡Ïe_g\GÖ,²¾Œd`ÑíèH,|k[xü,>0> ‰F÷,G±„‚×›ÆB»Wœ ÃÝQGU5øS󮢵–ÍLs ,YdÚCÍ2Ž×qFf¸5ǹ@·.-ÒªþFRëû¤Ö‡4ŠjȨ׻ñ›j·Q¡iŽj¡6ƒ1\zp0«cvC4Œ´“Yù†éR­ JB„/Õ1©¡”̙Ӵ§/'Y¡ Ðg5å©PñúYÃYz¨ÆB™¬œª D"…ûö’}ɹjêÂQsÝ…@¾ÌÔ3mÃ!¾$ßÇÊ\O)T$ÒÂשµP³Rø`æDÁ´¿zðXF.(/ŒÒòýúãÓ]Xð`’¦»¾I7LÑIE†ïx$)[죎•†ÒîH]©–ä§îWQ)i«! +îFzï¨7~ÅòG•âDŒD´ë€ÓAÄçJrVöoÁJHKç«öóJä_’FÔ›Qpì¨5Ü ÀÇU£raovRýzÂa‚MÀÈÍâö^gTÿŠL±-»r–"i¾ìZvG+n´©ñ¨5ÂnÑÒ¬$Ê +{Б¦_üûÙ.Ň ‚ AÜ*“Ÿ²û8xH€‹+‰à2Ë:;AuÔ n<Ýž&ÚT²&ù0—ni»•!8Œ +KC¯ÉÇÓ(€ñé´ÅТšÐŸã(°'ùDºƒÎÏyÍñ4ªš¿ +ÄËk˘RºšÂåÙY#¨$5~²§ <Îéí`$þ +wãú`ÍšÕvÆõ!á¸wñõb”^Bm«"‘Ń³Ñ^nÅ‘Á¬ß8YøJX ¿®[ë³HÊ—°Ü2=°Òñà×ÙÌ!žŠt,w­š?ÂToµ<Åc>±Â¨á,ÙUI©H7ȳ«txcá äYã<É=%:=³j`Q¡ÛÕÛ+öž¤Èy„ÆLٕ毆ÅÂÑ_q£Ú/ƒ Lý,ªº¤¤êžaúA™’é÷êI–%ùqÒq™~Lô L]‹^˜àSõ¨2»Ü1 +Ps¿"Ú'ò¸ßÇ‚©‡âš 4»à,ª¾²æ6ÿÊÍ,Þ·ýåõùÏê+ öó§Ä:ì$;Ø‹v‚ ÂÛ‚ï^[È8Úª¨4ØCW©þv}uÞº€M‚îAõXäÉ~òzivµ°Æ>™'QÊÓ¥%ò4U=V ·çA7‘ÀEÓ Ô”d6€¾ð;¢êKÐz"æ%‚Œÿ½ÒÁþgÑW¡ìeä4ñD $Ïf”{1Ž +FKåi²3¦ßó_!ÅMV_©ù{îì1ÓY.=ûÓW{ôÓe¾µv=ì.&»© ªÎg&"áD¦ šê ;“}œ2¨“Ö€ãUtDÎ,†"#ˆ=tj/ÙšëÌUí.!¡ ‹º–³î·h!j’9¯EBO¦`Šü|¹R˜£äRÅIÃè1A_ñÛ&Bõ *ÂVEb4€‘ó‹ž À¦2TKfcêèë×L!6Q!¥ Ä +’\ ìdö¼”4ûéØ‚ÇZ*3œ ±9r"Îélçûd3Á\²ú!:L´ü0° BÔ€õŽ" Ì¿™FÅžjŽ] Ԍ㙰s—žOû–bÐ÷3g̃ƒ_¨Í¨Ä34ó^ÊýôPb³¶?4F¤gÿô"è)ëNeMÂÝΛńqD¡h 3¡ +Å_öܲ÷þýù£°ÇÛN>rQÙAûÛ]‡$>B7;…z@oubS<ÉX4Lˆˆò裈r"lzís”£çÉq~]:iS"×µ’g 7€b(*™[ãc£ƒÎPÏÇ•Å{YEЉ½„-«ð\é¨ô’?4R+²=ÙC˜É‚—$v1ž¥BAèÇMVºŽ›~G— +íFá¬X5€A¦š52U2ç¨ó)ø§ª¥âO•pδªÒÍC¡ŠOüþ~?9ò»&‚®Åà²ÆÁWRB¥\ +„騵¨°<Ø´ŽˆOœä»³†Jç|D«7½L>Y•–¡] 2°scå+x%¤¨>»Ž$ñ0ÈC!O½Àh­Ô_#³Ôßû¹¸3^°¹™§¼êŠ°¨[è:¦ƒÒ—ÈêÔol!8QåÀÚD¡\ÞÒdïFåÒ±{É8¼V£Frö¼sø +‡îœÜfÈ &T52®—$4Þ½‘¢ºR2€nÖ\Ó”Ýý>ügôRaL•Ð@äeÀî`ˆ£ópî(iú%‡ü¦c6‰Rˆ›Çú°E\œY‰9 èfÊgÇåU¨*–7´ –8±œj\¶œÝ^aK጖ÑöØdûE‘¶ÞÚ\C‡T œéê"JšÚVSHpþ¿¢ó/w +Ž£8 Kû »©¯¨:>ö”˜u}O³îj‚±îÝBÉ>ÔÁ®ž‘°æ6³ ƒÝw‡mL” $±yðúÑ:KçhΩu)1ON“eG<°e B´¥Ì4•ås‹|>YÐö¦€êõˆ +vdNc|)#t˜FA˜­.Í™ÅÑÔ²:Z¡iѲú‹@Q‹Qö2ô %ÊZ¸ËÈ‚"‰­€%j¢ëhcÀî¶Sϳ±#öWÖQÜ×v4Y² TU¦âJ–]Ñx·ÖõH @wÁzs¡ :T@½ÒFÂÉMsïRîiþÒ zpôíâi¾bV¸£þé$¹·[U>y8&.pƒ•'ì*”]›Z’èRxžlþ²ÖÙ ÕhªRyì< u‘Õ¨„°QSâdOU«+|èÄĦ|Œù\ÉŸD_ó(úSl¤ž´ýG¿‰–æ',êØ_àz¬AënŒç÷3àÂäØ‘ΕèAºý¨‚ nh’…5Š&',¯*—;ÁçG²>?#ú%ÈøDΧ*—Õ^Òé~é=¤r*aºÂ± ‹.ÇÒ"K¥…^R¬þ¬'õ’‰ÙÜç­ÌÈÈ Fm`= 0‰ Í·ëb>ÕÆÐ+—:JwÁüùþtÔض‡Gÿ éz¤Úï¡Ç½àyÑk µ¾"Ù"ªú{0ÃÞ¯™"”/áŽZ¶KÌŒØâ{~Ûý#®îIR5Rì1=Ê=ßÝ÷Š7¤óÍŽ˜ÊE´úÞÁÎnÛ‰pK2±4*Ÿ+ “C¤žQGP¤ÔÏ)R +‘vþûAô°oÍÿGìžâYIêì2©Ö3XÍ(cÚ©`ÝÇGáhC¯¦_ +ô*WɃ{‰IÌ/5ö”=¦T“'Œ/@ØŒ’ Ë‚^ƒìbúBCö,Õçtí˜DìT u ªQ9[£kH›QÀónX³¢¯Èna¯$l°ùEY ¡&ë:zEÑ +¿Ë£L‘  µže&Hþ)#kƒ¿û7áÂÝ9Ö<ü;„%'¿¨ÅF1-­Ê +˜D“9rR ø~„Óµ^l{É?òCô£-&üB=~ì|6Y)šÂ#û¾}k3(÷N5fx×óV0¡jÉ#üŽXïÊ¥lÕ;"Nû©8n®¬ðI)Ý2!E¹> +ó+΃ öÐQÖjúVlRSœîx¯”JÈ(­OîÅÇ#½ìàð›bÿNÃI6{ª_¨À yìӒ씿ý4J­¬$fDœ$äÁîÝ–Ý`´9ö˜(zOwò@[Zq¨ÂqŽ#$¨«¶B&è¡„ø8[Zi‰65é›­q˜7°–ðrlI»±¹­¬‡Áï×Nf#Ìa fÄÛ³™iñ6Ù_~PÀVöÑý“¶Vô¹šú}]óU +¦­ -&¬=T\ÿàT. $ǘàÐÂxUBXÅöïOÐÁá[QO› +Ü]gÙпǪ§ßÁ˜ì©¯‹ü£¢ó(ÿœv TŽ_ •?tëGÏcçB›ÑÛ¨=ôËéÁB¶Eêyú:m²=¿<æÿLïo +üwÿŠý_}¢¿`JŸÿÿ÷?¼$¿û‘¯Á· +#"C«­º?'¨Q,¾þ#ƒÏÙy'4RŠî_V~H6„ÆÙÁ·éWši•Àôà_](ú•Y ]gj09zìw”ývŽsÚó’:¨F~8Â;ªZk¾•Ã4ŠÏ™¨[û"[ïî `ž!ÆFuÞDЫñ5çPkŽ:Byù܇UìšR*wJEÜú r_Ëú¨Ï¸eŠA:!}aGP=Jy9×»—ãý8¢dþ"4]u»çþÓ`ÊìOf¸²dHaÜ“ñ©S ÉÓc‡›œnd 9šˆ‹èÏøc©@$£Žb†T¸Tûj`…œ„ê$œ*ÎB¿UÚº¸¸åJ”‚ƒcµÕј: }ìÅX4`ö:Bœ´ÚÔÍŽVáÂmwå› &ºq0pDEåÿ’ù÷“!UFøºòÃ÷zÓëz,Tz¦"Ìh.¨ÚÇ£¯YKõÎŒR‚ÂÈòSöYå­!>O “«Á4ÝÝwîE@e;sOÇÇù]‰éîMH_rƒZÌ,·;zöh|¸NQº +ì§\– »EŽAŸAò‰ú5Â+ñ… sy¾9ÕP²p˜%œÄç«ÞEæë¯~6È‘†¯á{™_ƒº+?MapMû,-ýš~¿ž‹° ö+W*–Õ}tïÏO FlQ§Å̤ðþ•;H©´’Švk³¢|ËOŸÇº²§^ñ?ï'ÇAºôÎtˆ"-ÌFÑÊŸ³»€×ìAÀ-"†ý»9³iëªO'"xcÔŒÞidÆ°›Z™ç6z{¼W%Úî!}Ø=ÄÜK¿‹ç) yˆ°š ò»ÅH*õmíu†(Ýá=‘´[ÀÉs€d*<Í©HîOf@Øì¿hš"»éý%¿F¡u;q{\³[N"Œy Ž‡302†å*FŸZ­ä€ ŽŒ¨'â„:,³ç›ƒºt´†òØø½7¶ûôßÿf¬~zÀÊ*| Òb¿x§ c¢«ÄMøªwMŠ÷"ÕñH8:b÷Û9„B®ßѶXA‘Ø‘Á€¾²= Lá¦c\WSµø…„ð:£¤“®ˆ¾­¨6ÅWç<¬ÚDô+ÚZ4Û8 î§kA÷¤ôû~Lz,ÝžwωñÕ*bˆYUІ°Û‰x”·’×ëíÁ²hðÈ9Û“vÿuÔ4°ÔÕäñ*ég=J@䣒Ô#߸†È¹“L¶ 2~ É`e%ÖÊÏ׈CÛÿúçl-`uúar¦8NõÇíçu ¡8(éHä1íUkÑ^ú?»ƒ5áÏŠZE¼‚ˆ¾¬“Ii„A…¢Ü_ÊÇþlZ¥Í<ã^„õxf m†ÚdÁŸ­É­fÚh?S6Ù»4±UÇÂèNRȹIÕåØíT=-’Ò7Û +ŠØ´¸Ìí æºË k(±¢&¬A*æ.Có”á¶É1!ý‘a­A É|d *‡+Nô°“6B[r¥ë…¿ör@8ÈkØÈôC R)ŠÂ5¼f€‹¸©âÀ Um‡´ÂDàt´#f;ëh˜M÷a6é³ì6ƒaõéŽsºrù#6CºÚïÛÜßK0Zq Ÿ”s3¢æiKøçãâj¡ï:¡(RMØ4¸¢uÓýÔ†{Ø88§½"O½äøíûi‚;Ÿß²Å³€Õ>¬ wãÀñG)ÝR¢®šê¯«/§ÉÊô¼æi#j´5D&Ù£m‰ØÚw¬\r¡u4ÊŸÚbLùØW‰›b!s0Y ù¼ÿ\‰"!ÉJ-³‡o¹ÇðS +ÜãW'ÿ8•²–ªؤ§UíFž©êñþ¨húAPqy~üåOæ÷¿ág*!EÜ[Ó:Q:‘¼’ëù@³9Õ…ÛÚ•Q Òˆbo‹ïò³¹AJÝ­TƒVª6CAU^^©»¦]/àéî– _“'ù¢¢'CjX «—3ŽS oD½©D¶Rºë’äö%"›¨'=Óbë×(ŨÔõàEÏT£‚)R;"º9ݨ”Œ"DÓ-pQÉ}ñ"D!v1ø”{öÌq÷‚¦ÑâŒæ\1Žþ=.óÃç2"Â>|ù3úDJ¡ÑþØDÍÍz•ƒy*½Èë\9[.tEʉ`Ê"bzeIà1³Ù?3 +ÊG-¢WÌäÎÌDÓL¬ûÕ'B¥w}…»HŠeY·ƒÔÛ› 5‹êk/Ù × o$–Ò »~.¬e~e-:4Áq5ð¯C]qÝö·‚LmîkÇ6ðK(ú¦2…ÅSŠø5j†è§&&Ì.m#H¡o)©)ðgÂõXG7)}Öšù5â§m ›½× ¶âËyrsðKKî% +g#lmŒ@$ÃÑ_èe¿µô/Q0ÀíDì×6X}{XZÏ” ¥lϲÇ×mf¤æ:i±—)´¨~ðŸ2»ª‰ !´÷&@ꎈg¯É°ÒuÛíÈÎê¼4ñT“í…—Á1¤[A¿Íü\)‚\Ô¨ç!w£ÆºÏ•âÙHIyF5•æ=?6È9”Þ7Z¡}Á=ï‡yÓ]t|æ;I>O„ÿYµŸ(s¦Ã¸sòS‹Uç˜gÿè!÷kÄ¡¬.+ÊÛ¾/Q× •0É_Ò­žï$´¬ƒÐ£¤Oœ0Uîÿåß3³½>Ûû}J«ûò× #,há†ÆÜ<¡c<ߦ‹í0Ýrà×(6×?逪¢ÍLgÌë×{¬Bã„v$†Ž¼áÞ˜ßÇè,J„ý(®(äUG<\X³¥ŽÈÿ:sI%íbî7/âIýæNÏ¡b!,_Z8H,@ÈŠ]ºz„¥·¬~³)RÎ,q“ÈšKSé€Öve…¤}fž)ÎX2ŽS½îÐÐ^‚ÂŽXïã&þõI¤¤Zd«_7Ž•@a/ÁXðîc ÈK‡»G]B&uÆô!JöÅ>BÎ_â.÷q3"µòçh&xq1ìW!ÊýØà9ä/´ï¨3öíà˜ÿÖÞmÕ–%;Ï}‚ýóRÞåŒÈ8d^Ú…1ßؾ*D© K%ä²Ào¿ãûþÈ>Öì}Hk J‚bÍ‘­ç9#Z´öýÛ^hĦ +@·2c§9/ë9͈‚ÒϹ7`â***ñ×R¢?ç:‰¥Ìj(Ò§}Ä{À·¦M¬õ6ƒŸR/ÀrL´G}„^ähoÓÜ3¦¹mnÛÓ•ÇqúŠSÒ*âŸRtö}¥ù²= 5#¾LfÛ±ëŧS]ÅÓ0vÆÊn@ŽžLO>¬oë•–GF´sKÐÕìAÜ×HÖ\0\-Ùà½]•×Ž4;¦¬þ Òžw¾MÏ‘î©8öî†1ç-¤¦rëºi¹¡†|(» ëQ²5êg˜P—]%Ö,k5ׄũ&µžõÁìþëÆÒ§€èå/&± IÄPi~ÓPË‹l¶pìl¡§1Çt¤†W™D}Ï”÷ :õÏ"ª(J#}ò2 +†i|Sm¤†ÒWúÔ-S,o·KXÓv¼¨vÑÁXçƒ 4ê.–À׉ç|2hµ¬‘%Û]yµ3­ùÀãfÊ^’ýöñ4ú ×}Ïî´`¤…5ß®¯,z6ºÉ:šMg³¹ÞñMÄØÙˆù×.Ÿ%jî¨ûá¹4frŒÔ]§ +CMk +9ñl·×ÜáûÏ ÐÖ¥Á®’!íŸÈµ®Ð&‚7d…5tƺKKž*oïË– ±›µâË® l×k¨‰ðˆ"úg +Hì?Bl +e†j.b%‡Ä‘÷Oÿýð=JÌΘƒnãµÖF@\Ì'b$Br¼NkÖÃûFÐÒá?p+îÐMn‘SnáC€Ôšh‰ˆ9ý"<­´ëzÚ^DÜåK×Ǽ Íœ¶wC·Ü 8×öæëEu6Ý Š ‡†WMcj½l¿´Ðû9H‡‘¹FžG¡W¯ÞŒÛPe Y3¶ðu“&ÞÄÝÇ{x^¬ˆdœ­ÝßÑÙ–ÁsS5gÅ;ϬÍ.šç&ÿKð^oˆ©ê›Uu÷~þ‚±ž[Ý°(Ìj"ˆ´{œùli (Îy7 ’n¸ìŒ¯ñDÎÍÓ4Xó~ ÒåJëöf«gáŒÌD9ó Š +‹Ðyô)Ü]"ò6ƒ`òRæU_£Ñce%Þ-~AƒáÜM} £rIÕîS®hI‘E~Âu0ßñˆÿ‘‡Òârý,’K= M¢nÑ~#d »ÒÕMêmƒiÝA óßEÜî +¥y\ì>¢¤Tœ›RÑCƒT19ª8vô¡€G¬Q­¸©8ñ iŸ¹i”?šbl§2Ÿû9Ò¡áD|Ê·ã<Ãð7u£§ñÔSÞClò²â"tådueë[,oîŠÎš ‹Ý”ÿÙ[ cç{Äó}j‡Ø‚Rûi#â·è\Ö3³E\1OäÚ¿‹`ýÓºÙí«²z‡èyÜâìîºÉVfp•§pÞS8§†Ë‚­.L˜°\³*ª×·Mµo"róJðI7ùf½¿ÙÏ£ŠÕs{Ò­v$Ý[å"ð”•]!Ði‚ÔõÌÁ÷ÌzéŽÙ%ÿždm(®Åµ†v/ þVxï#"ª¹-é¤E®+š—‰<‹f¢ôÀ[QS)Gw=‡}ÕÌ~Ï©…¼a“YÆ4 RDMâÞ¾JP%e®æ\QµðŠþ¾Oüî¹}§:OA´’= plˆà+;p[Í9ë% í"Pª¼   +^íå3J¥óÊŠdQá[Ù°µ¼Y¸~F>£³?òì#}D¹Ðæ ¨—€Ël9+Å!a•YpÕ£'‰™Z r"CÍÖz^/eκå(Ïm+G[] ú(èø Ôâm3ŽÑªJŸðˆªxBkc¶ëµÿˆj¡J½]Z¨¯³àÞØ•ú$®cEÊî +訴æ‰Ô<‘¾uS¡}¼{¶\h@=SÄ–¶ SǺ~p›¶RMûØ94`(9“¾”Ö¾‰¨uã +¯7²M]ÿˆºòÊÒ~;w>¢¨x£i\ðf̃ÜŸï·¶>’õPŽ¹äÆï(Ujןš#fƒæ†WîKZ³ÜÑZŒ¶ÁnDSÓ»=¥}ývÁ® ?ÐŽë'5ÕjÆ{ÔZ§)«ÙlέœH„|FüþéâiºÙ’ßìgô‡Æ»¾½’E,2Û ™ÿðíÜø„ê´²õv7©î£Æ3fª¸ÏxÞ7Â:9%m“­ ò ÛùÛùYcM«²6óJ}÷xaɸ—¹.DØ5æß=ÓG—­5­Ééè(+µ¢sýÔeÚ6¸G× J´4Æ,z¿CAô7ŠÑGÄ?íú‘ãöûFX­S¦§-ìšgeÐh…šYäMAÒÁ LõXût&hö'ˆ2A&ΧT60yß3½=š‰!k™4å~Y5GèPCºŽlèc³¡¯›Žüz;W#F=ów–Æë—–:ŒÐº¸Ì/’ôö·@JB±Y˜©ÎÌWp±„ª§4hù[0Jnj È3ŸàÇöÎF¡”D"P­p4©žÅ*¾ºKïOÇTv}Óë©4ßKÕëÝ¡rîÆÞ®2ÂRMÙ}À_ÔîC¡ÙzÄ-j’^¯¨¡ \U¨€Ãd?á¿Sì1b¶Xÿô_ìW?îaýÂm±e„²¾ï›mÎ.èòWÎ_‡p”—Ui€Ï+âA™§v[ï¸ÙTqš¬4Y÷€|(JÝ諧vpÛu¢2JY§ô!÷‹Ó†i×Vú#/œk°9#ì”5™S7a`MfD¬éàÑ}\QJ°À‡Ò±Ù(M Ó³AZ^ýÐ>ËíJ´ Ž{ÏmÊH£’ˆ­8ØåÖ&ÓÅs”Óu"-¸§)•TV"ÈLM› +´«Vå5`?Nœ'­I–Ó Òv ”c|y’I˜™8Ðz×î(ΠFæÙÊ6bpsw¡?Äÿ%}èǦ5ôKr]Ò›¬W³öc/0]‘¬ã>÷CVžŽ¨v •Ü]ÔC²ÈÊÏŸSÀŸQ?Á 1„ôüÁ"MÚËL]NxF@õ›\WŠU70Xç{T=7æÕ"™05jšoRXH§>jº²Å$‘ËsÃȆ—]=(_SœùÍÏõïl®£Ét6H–¿ØÐSB,uüâÝ™áÓLí;³ÉuxÆYóFÖÖnÜÞh2lÅyð¯›\üSGô ¼v¹Ç¶Raò½íµŒ˜ŒLiœÙÛƒae£É +ãyðNÔ]­Ñ i2T’wÕ5-¢Út'B´Îm3/$òFmø,¯ÓunY§UÔdJRo hs³›ÄGS9‚bЃܘENïòż'e?Ç¥fËàO9þü™P3B»ì3§Øó˜ËG{ƉæºwŸgO•I‹*a’ž(ê¹áƒ¹V—Ï~1¦h1¸@Mà3Ê+2uNÉ,K‘IWX{,ŽÂ g¾kRÜPÝ`°ºXë<†]Î}9¬n•ÞîÒnÚ75îˆÚcBt£ð(ÎE²~#yÁMý^)i7´î-Á{ +ü ¨L96^æã%ØT%Žù­õõì÷öÚö˜+^#Â6PA Ú$"xLD´;€¾ý;I$¹s/»Ú&¿íkÿ×£xJ>¸ÆÈ¢ +Çõ("MÅ?Þ…|‡jÙ (NžÑVíúüZ x}ª3OžC«ò ¼4N4r‘t׸T±ÞBtæ7³èœý¾o„Ø4Å1§=–ýÕå:5>AxÇ5MÛëX_:MŸ÷€Ì ç. WQèŸQÊüP#DæÇFdWoñ›  ÍA®Z¿ðo1oÛtó-t¨†!lÀ9 ̲­TTÔÁ–`~F¼¹¼ÔåÁìZ+èщØÑ]ðƒW ]ÀË,¤x³éØÞH<™’Q3 @v”¤6(Mà#‹÷‹mPhÑz°_3“>µô%‚¥//=.‚ªÝp;bÄPºÑG‹…5U¡õ—ãHߣ+Y·«³˜êõ5rQ#}>,éïr.ÄC4mŠ´ºíÇ +Ëæ¼S¸_ýfÄRïÀxqK¤nÉšÕËÜ]ñ‘®¸(D›¬{î]M(ªõóØ°£ +z¸çgD ‘yÔWä¼ïoöKôVÒê ªm×:‚¡°ÂJm,Ü©†˜²>xjF.pò)qyœ˜CÁÜÎ!k÷8±óu™×f5D5/!<ÖD†¡›ìÇáñtm_zö7~ågT@U…¡™¥5¦'ÛœŠŠ]à:Ú&÷žN¨·;"Bõu½/(_–_ +‚^ßì§m‘¤µ¤+Ê؋꽬lLZbßD<äÖÆýT>¢@÷eì‡%‘¶¨ R+5=cå ­d(À%1èìfhCUÃ-ÆãG@ „¾VEbߎ†,p×Ýpn ;9;•JÅCÓÁ9ŽæV0ÝKO +­ •Šò:Ž~r<8aÙº\çç\ù9ɘ ykÔ÷Oá™mŠw´ÌŸàò-¾=¥Ö¯ÆRð ¥>ÈÑq>÷4Ò¸k4SÓì3p•Ê¤ë]?Ÿ#½GñšµÞ‰ðëö"i»†ó8蔳Û(œŸ9RÝYŒ6·ŽðÛ~ŽÍ@ì+Sî÷…ÇÃyZ@)›tÚÑ&/Þ—<à†Së#QS#êÔøaEÕkG­1ê¯öùÜቑÐ2Ì3åÔ>¬ó¾p<„O0vÞ墟PK£Q~ Û6~Q.ú)ª¡n±vSm¹¬Š9Ë Í@«rAuf~¼ffmvΗ&ã¦#-(6PÆÉ‚¶¸óK å’–]Ä­úVÌR(©|β©%¿G­q+Æ kÞáÙ¯˜î]ñµPGõ +aa͘ݬÛ9·§Aßž}Û¢XôöNu—H2çÄu•Š „ŠkY h߯QkDÍ M/¸ Êù+Ž»¾Ñ9^ “ÀuòW¹ãâvãnÚI(6QèÖ²öb)¨4tv(¯róëÖé ¾ Ðì’²EÔ˜G“"ð,éFS±B)í·^vë[ aê-âA1» UÍ{Tµ+©1/Òw…°÷$ ƒ¾Zî†j¼62á3W_ åãÕÒ" ¨#£WUÊzS8£sûÛÝŠ=Ó¸¨óývcåt(§v¥Î& …ëŽõDob(îÇ{¬¯Ù²Å‰ä_†Ùý9A}2ðÿYþ¿rgLj]¿$Öû³þcüø‹óã¿ÿ·þ`åÇ¿ý÷üãÿúñÿî/ÿË_ÿéOøÇ¿ÿÝ_þïßý§¿þÛ¿ÿÝoÿøÿ÷wüŸ¿ûó·úÿøÇÿó9è÷¿ø¯ø‡?üõŸþð7¿[‡øéäî×üŠXÀæ¡° ê“*?¬ìÀ©9]’{éÈZ¸–YY¸2÷\}£-Fí@ðTÐ.kS6ÉZu|þ¥"UËÊ¿*I}«P°¦ÞÈߟ°Á\«Ïj,µ`·£Ä‹™h«#xøµµcQG+r# °ê{µÔ+khj/bÃ[Ä#ŸjC°ÿ¨Žhß®ˆÖœÅú~%P"ÊÖ¼u}£íq¥72ç^4Td<m±MtÒÄbe‘z¯A؈vÑêSf#Å¿ägõD5]ûhewaî½ÿ­úºþ¤òöµò¶²ÖYl¸,5¬YTåi"ü¨‘»!`E°@‰¢QÂjötÖ^9É l%+õÏj¹YØWdFVȺ…hˆÜŸŠXâZi_‘“k!k¿§MUi® ›«Ø>+\XóP ¡pèJùý•!v%=ƒ?þQ•ßˆ.Ý=ˆ¸k /¡­°óí +*‡Šóʱ×èÚ¶xãep=u)Š*ÞtNM@]P‰ê,Ä׳ Üå¿Y¹rÙÕ•DÍM£¨|ÚrÑ'!Q5Z³P|ÀÝ¿+.@qƒ|ˆ ˆ²­_žZ1jF§çt½öïhŒF™Z€,õµ¨¤VÑsž¸è±–z-@-S?«œSà +8”t"'{÷Wœ3Zºi-ñ\ðóªxÔ2Ÿ¶uÛëáùGÁû³†µ˜eœÏßÙk±ÀѲ*,øú +kê"S: +|z¥éãû|µx¼ ÓËÞý{ëõÃõ4ºÅò.lRÊx`)5nwn`X¿nzQ[S‘ŒÖÁéYûP$äó¥X¶™/ÍÊ{@ãL#ƒ!vÑD¨Ô¾Æ·©ë#ò…i!`}=±!'} uaòDÕÝΗ{­GAQa\à5‹™×Q»b¨»"n{*· +åçüŒp-ñ¶&{ã»ýT”±7KÑçâÃ$c9’±œã1ê¼â¹YY|ü~§FT¡ ªÖö1oF­w´¹ +Dœúî©dpïäi$yú—“°'5¦ÀY† µ¢G2¥ÁI7i^ô¼B˜ÁAÕB+À`Öˆqk-”~œukr±ŒAŸ—o‰òÀ ŒêFŒñ¦¼¨ÜÃÊØ+¶‘ŽnKû£ +£ÃgÏpvì4x7çqXÏ3beºœÿz÷ì_N´?ʆ‰ŸÐ‡1ƒñÞžã…«µ…"v¹ux#¢Sk6B2 )o1æ?P€éBÉaº[õÁ•‘¡õw; +3a\Ìoê‘વ~]¯q¥z©ü!õ5ê8ëÁÓ‰’Þ O׈ªGSMÆc™ ¿Å¬ýíõófaoEEo„…Zú3¤Œ@ñxâ‰hŠ·­Ó¿VD·ÌÆþu™d™¿ëU÷D’Ûµ°ð£ë™ãºP>ÓU™øˆÊ+ÌñõÕUˆwL)ôâ¾õ‘õI¨¸¾ËNEú›ýœ§šJZ+ÚW±hËGŽƒˆ²>çAk›.'oÓ”¡ }>bDé2JìQXKÞâY¨±G*Q”WœN¡T¾Å•­Åg‘ LtlØ Û¬«£BuÒ¶ ˆ\ ¿ +(ÿDdý²†eg:ªP¹NÀºd +Üb¯·bÚ›ã ߉ ÕoV0g;íBWèÐ]Wž_4ÿí§Ÿ"º ZÜWØÜ,ûZŒÒu^{ k8WKùöð–`,ÜößVB¾2¯õ}Æõ÷4µ?Ó$ЋlÍÕç7ÛÍ̦-$jÊ{Þûˆ +:^#=*ÆÕò#ÂÀ×J{Z¬LљкoeŸN{¤Ë'R#´½äzbÎÊì\5-~ß föôçÖ{Uty»L·8?ó3 ‹¾ìý}[UZÑ[¬M[Ñò9˜âºÛÊÉÑmjá¦mk+Ïû¯Bš]©["”o4àÌ>¸+²Æn·C¬Î1¸o€ÿï–vBµ©Ô$½½c½°öˆŠ1b«tWÝ´“g3FÌ®ßJi›§œ¢ƒRDŒ§mkز=O î²˜æ¦Ì×ÆA¢„Ä…N¬3Ñ â#·ˆôËS¿ ¸·&Γª}DÝ#òÆ·bW·'ŒL]Ia¨öÒò£Ú ›Â*ˆŽ’k0.B-Þ#2Z¡Ÿ+E‡ð±Š'{°Ô!º+¾Ï7Úñ›dk™OɃÆf |5Þßzè+oþQéú‚7=–GÛƒ»éÑÝYK­,ò7)àBÂÖ‹° ÏúíÞ?¸]–»ùù~ @i®äràkr’BQÓÿîEQI +y¸3Ä—kË1IñÝÇÎ ¼a™×ÓÐc’[—’5•¾J¹îNƒ2 9êrk Z/|VNë‚@Roÿôûˆz ›(K©ú²[\ÎÇ'Ã×:v­~‡]UŽ€^lrÒ­aD>é‚ ö84\sÉÒ‚›Èqgn,ÒÜ­jC­Õ¤—Ç¡'8ÛûýD8ÂÑ º ˆE3Ë~[ßk–yØ¡Ç!ŸŽ_Û?ãPðµ ÉËM3æ±yëŒ8”Ö£ÈÛr.pØÅ5ê§ +h¦vð©­léÌÇG3Z£+Të½o2¬ô±'¹‰œº„üøõ$èY€è±¨QÈz OmG¡ít&×ôl y ­ õ‰KC”8'¾FrчBñÒE;Ç‹Âåº% +mHžvûYƒ\F¾”ˆá= 銊çéZ¦ôžó>œÊˆrV:¶#&ú§¢)ªH+4ZÆg#D\% Z§`ƒî1½ŸäŠå´fªM]ãCµgÎà–í(~¨k¼îFÞÄ; ‰ÛqAn½¯dÝBO=¶ß*|@1g(8§&9|”W?wj”ÇL¥ÍQ× ˺’Œã9ÀØD;[´bª8綵Ùc¼ßòHÌKëv®P÷ÊÀÓæ?ÆC$£C5ùcÄsŠÚéb7-,É”ò¨‘2#©D°î&B;ö•®]jG[5ý:Î6ª…(¤`[;ršÝѶÉÂÍtÕsàZs!2Íb¥ÑîØZêG>§$òka™¹kèjÇË‹­D¨OÃÉÌä3B t¯ñóF„‰’¸fyuÉK×Æ´ +ðo¡„ +œ¿8§âß"$Ïf\q•Ö|ÃÃøŒøZþ¼^?Åhß|ǾÛšø-ëLrÕqAÚñ:W‘€Ûê úgYTßú¬;\É\¾ÙÏZ9ÁQLŒÖÿÓ(¼–å»ÚÂE’¥ +ûHïQb¶˜ tN;Z1¸‡që®´¼ØÅöÙùñ¼oÃB +å–ÍÌýy?=+‚åô9lo0F|ë=`I–+à ²!ÈŸLæñ'®ŠXhTa£ÇQ²aÆ'âP³òVGC¡UþëW“qšÞo5i1zˆªtF»hõs Ÿ…qðŒ8K$ŽîFO˜5Ñ| ˆ£ÄF˜‘²$-ûŠ’9•H9å@EöX’µnTŠ®ãQ~ÄzÓ{¾¨r(N‹£/þ}=ï›&ÓEƒÕó3"O)ðïo~Þ4”Ðs”$鱆Ɣåü.`êÇ +•w%*Ïþ?¢Þˆ'&´–Áœ®ŒÐÉGN ý€ãÔg+Ù¿êgDîYcFw©õ­ãü¶Ÿ;-Îœqs*©:X.ýàéf(ûHoQŠíêŸÌ“×öú„Ž.~£"†Â*Sy"ÄH«÷Y’úñ|£)"¼Z~Þnbzá%œÏ?»Ä’­‹ÕxjïQ3ÖKj¤£ÆÌ äEÔ;êt®¹…Ý ÂþvhŸÃR×{DnÙ¥– +W-*?÷Cšr(1¾âjÛ©Yß©Ù<Õ¬¾êjùå·]%*é˜Þ„ß{áÏZ¹Ç&^ÑÞ vYUPCX‚BçR¦Ûc™…úo†1®7IíŒ2ÖÇÝŸ²ÖØé댈pPÀk¸SX»É“Á>œN„Í_µí={{ªoe„ìv¥o‹wlEX#*H³ûQxé< +& "(¼¬ˆ—î›DW&N¯ì‚³—Dsœ-Ö¥§ÆºÒNTˆM*1ù`Òrp»R`YïÙp퉟 ËülšV;uZÑjkÚæxŽk¦Å-ó}ûïŸf@D:.7Þwrô4¦A„ÂøbPíšå¾K„ˆo'Æ÷¨(›\Jvñ$Ö~.É€+¢ +ï–¶ív©Uñ­”Ø ®Üˆ†PåãI/ñ¤Û¸ûLÇ|º 'ê&r«Î[âÙØÚϱ•Ó*[ös [K5žª‹ý†šÚ ¦Sö51 ’±F³z[™TÅßÖà€PëygQ%©ö‰×^×&Äþ_þÉbÒ™¡›íüÚV¡O -ð–YZ Ò›Pè´˜(’bÖ6Ð¥h^ja5S—ïg£Ê0Ä~nµ 1&+ÎÉ1žˆ¶#îmÀjˆˆ1^R,…¦b»¢™@šÔõ¶¦èæ“„Þ¶sNèºþMDé–åÎÈ´Üqm¼·*eŽ´’4>Úõ( +ê7ª½Tô¤Ög1öS”:uÑvFœ©þ~ò„‰•+bÇF¬Œ8Múõi*{V“uÔ±ë¨S™h_¼ŠxÛحٶ¦žb ¸êwÞs=Üñ´#†Ì/7J(›¸žt>A·õýz8üü´•F‰5N¦IÐD¥r¼öo¹a +=rªÌfÌ͉(ÕîºàeŠˆâC¦Å /Ÿ^Û œ> "Aêv†Ñ ·f5 JwïÊú´üz+V>S㈫V;]Ì•€â;ˤ69äÈ Wy¥=hPî§sª>xËßƯ +2 ¬[/%`È6+²1=bKzøžÜ²ïz,óîè”ÁߣE6ZÏ)ÜÝ·(°NÚI +SÁ@hÓÂk@‰„Ei–b4Ѻ„“Èuî÷x¦ù‘ñäHxâÞë@`àQ}®4û‚“tpDòœ¢êº#™¥ÖwÖ#{nçúØØQU4e‘2=ƒÙ"Fe¶£Ì±¶S"‰èj²Ò>ÌqÎF+Ÿ©G(ê‘‚Ís|@¹t¨ôlŠ?¹,XOIÔVÙùï!¿P­n}ˆq[‚¯â„ÝNÍZWÐ*[ $ÒÚKW®äÆt4°˜j÷Þ¹JŸ=G’Fc?×ãvµÏ5öFm»¨àÝþÜj(™\¶1#".¡‘×TL€Ù!¼cAyV™F´øu^Y^œ³ˆúôHðØ8RW '´+ÏòV@ÑͯqëTgdNUk؅סÈËïÑõªclx~¯ðuÁ×?^ò(þ~mžuhЃµJÇz šÙƒÁ2³,˜é^Òñ>¬4G[ýø{Jó[ óms«¤óŸÉíÏŸÏphôxJÏ6L.ÅâÒs-´í§<¨[ÓŒH@Œ†.”+bM!“fu^u9ß"ò¼†*k7Ô…îÇ~|îëËṟ@×($¨ˆ<ï'åþµé˜dHŸÛÝùúå]¿VHe~Óæ²?£aÚ D ’ŒTw„`8ÍîºJøÖ,¦ ˆI½¯§Ó{ï4FUÛ¶iÝÊÐàWEošˆËÔ%;ZÛÛ .ÀŠU··Ó××.3|÷M<Ù‰g÷T”|±- ¦ú=À— í—`c»>‚X‚²½˜òè®zºsŸ.\¥Q"Nq!ÛKùëÀ€{ ÎAQ¤·ˆßoœÝ]b¾ uŠ‚ºY5*‚*›F=ÅPÓ˜åA)m‹÷SKVêë¦ã€ƒš"½èÖ]W6y¦þM„r¹§r¹óÞè‡Ï(zµë×¥¤‰P‹ƒ\ ^€.@³š©¬—¯¨”£–}«Žç)÷°‘V M£X« T~’g_qIDEí”ðA„_éq%púŠˆ¢Å¸·X,ýëHN“¸F«Wœ:i¤Äè–¾q><}Ý"OÕƒ41.§ãN?("^¢²õÉv}¨©¨&sͶÅHSØŠþš%û.Ì3ñÉÆy¦}qwš¨è ìûjìþ…*R„ÑbJX#ndf”+Aá¯3ªµŒ!ª|Dü~çJ*Ÿ®Cê7û˜$OA@ý" +©`äZQW'»÷TÀÛ ’ðÓ¶èZÖèZ +Õ‚qÞ´àX7¸¡¿Aß8×ç98±zèÇ8ññM ­À¢>•|{ß1ÓÃ_Öù¡w_eXœÂÏzgÜâáÞç¾Ý-·û±'ªÁâäQ—Gô Vh.술@KÍJŬpBœë>’‰Í=°Ö4BÀIÂv})#ön½)žŸaEeŸ1²ÿL6·Šœr&IXï”@êf -}Ü3ˆÓû¤%𠬮gn€Àã3Dc +]Sú³¼ð$`$ ;»1õÀ èÄ¡=ûÀ »Ò‚ ÎqÞ‚”ãí-r¼ÆæØ‹ìîíT¯J!ye@"(`½<ô´?²ØغŸG/åþÞöÒC9Ú»®wˆ¸¢è¢K€¥qè¥&̳TÆW +XÞ (÷Ž4I8`pkÖ´½ƒhcÛ§k +3`MvÑC–WNéIQŒ˜o©Å„™éjJ–däôÆ(’¸†n±j–¤øP[®ù¨$%HÎCŸ‰·ˆ Ÿæ†–UÁ›ß짞®n€QĹ"Ç ì”·þ3‚ïKøíÔpé#ꎅâ<ì ƒÄÔ¿Îeå[¤ ñE÷N¢ä5©¨ 2*7í›vªÝÀ_­ïâéË´áÏ­±5:Ø¥lÅr^ rÓv}€õuhD!x­g«Ä›APo[›ƒüÖ+2*ž +Yl65“WD\F( Öœ +6:>-FPª@â)¢‚)Eâñn›[‹êEŸb>ˆOë}È(àŽÆ0cЕü6«ç2>66%hªpoL `˜Ÿù6íC ©Õ=û¶#˜ií3"˜IO(*óÛý¬œ€ðZç#Óâùª¢ù¹RØ){p3¦†¼ëàïSs*ÖïQk ­a¶rQ +6 ´0B$`5‘Àþø1ö‚2cÉR”lv^BMN“"GP9‚ +h~! …Ë€#DÁ¤Y ÁΪ¼^6ÌQ¿¿ÃGh%Ò ÖSÓ´F±kÆùõž :½Ã:”U XÕ°¿F$̼VMâ½x蘋ѕ¡=uïYPsq$ +\£QSS„É,h(…Havc%c«ÉWÙ Gy ¼gŽ„ÃÀ˜Êÿ¡AÄꮢ^Å(uÆÜ2D L€üºDè6±"ºÈñ·*Gá¦jl®uÝ‘6ì´R½5åöbÏ°,ÚyyŽ}Ek”ðH¶À¨üwY¹“mŸL›N2ù•Ñ"Œ +…+íÈxWF5„¾yYѪù KÑ©°{,µÓçxo_Ì5_n±lz÷qí¹Xö£fu¥ß0T×hȧvSSçD^? ÷RƒI oŸ=êÀ$À™ÑP|áÎ-ÈOµ©?6°‡¼CÚo©©*WöÂT€¾r9ð¢úÎG‚¤Üå€ÚvÝr Ý€ÓZÇA¥ŒÒ'=jûI 9ŠT•lp8fW0+,yKDú ’}ˆ„ïFé>¨ÿè¼]á!Tô9Œ½Öƒm3*‘õôçFä…®]̇Ua¯é’w9¥,{:ØS¹7»òÜìJ^$–ôTîGíõØÔ†ÁS§¨%‹z‰û‹Ð¢™¡å²å¯&[¾Öf#÷C +ºÿr‹÷½Æ—}BF6¤0ØRÿÎ è2~7]ƒo½™ŠN%ïÐ\C"Bñ3ˆë¹²/ò[’ltIjŽ³¤¬"^ÓÕòµJX£oRŸ6㾜2T³Ýô‰ÙÔôÉ•oß.X¨k1›ÿj¢ö¤~ßÊ<ê` ùÿ)ó´ÉíâSöÒJ™zƒÄ·M QrÃ^ô÷H| +gñçk¿IF랧Xæ® ·¼­[úêfI° |¼gÛøNZ\8©Ý@'»?¯Ë+˜ïÜ‚Ñ7•#M ÊMD­Ê0=›óë@™þúúšf|ùÒpÄ#.{ â±bÙävMo9+9N¤t‡¹qmË( pœMäy^fÀ¹¨¦rDˆÕÙNäRnEHÐ^¤‰XÅØŠ¼m¤;wÓgÉÚíL“|ÝYÕj}·NÈS¨Gï„Yš7ªj€·XˆHs$Oª!÷F}€öÒÑ> XIÍçhk·%F‹¼¢Fuag#¢CñZ ÙëÔOþ@vvG`²‡ÿÅ9—dìˆ?èx29^"Î @À¿›S»âθf_´Ý=­SNà8·L¨Š™ ì'uFŽ½?Ñ![b¹]º>µ¾¡˜–*ʹֻ,55!öŽfʯ~¿ý3~Ôž€¼ßM(\qñ •A5lê©·£pû Be RÍl¤+ t+phÀ‡]‹†F­€ýà*z©-o@ n +IÍnaŸ‘ð†ýýb¡¦dT ù7£ +÷ï¢8jæUóT& ¥ÀI2VÄÊJN®PÃðŒÅ»"Ë7ûXÿ®ßõÞ¨ôKìÚ„>±¯[’é€I ½ÝG vß@(jç8«?@!]ë^¨d»: +l]hU·ú¹…•Iõ)LW+Ê4Öl=á*˜ )D‹r)øK(½¸®ø'a”üHUPÇj8¥Il­é­( ³rÐÁOêGaÊ~=æêˆ5#˜3ŒP÷²7E@ëe~‡eAÔˆ²¥F$½B~u<¶R%¶RíÌ ¨ü¼~I¿9Œ—D<ý*¼ÅÁ„!óÜþÝP´AÎÓ®]¶?S¶7½âL½öÒ:À~nO°ípIñïÕ¥ê÷.l¶5âuµ­»OѨêYeÖ¤“tû8­ÝVÐâRwé’UmKöƒäñíÚ+#îÎJlS¼ã1.îƒúðÝε³(z—-šqÊä°‰lÒͲøÖ‰¥;°k‚w”çHënàÎIiqÙ?¥ˆ k4ªö'ëÏ:·›V„p f—ÞËSî½r•g{¬4ìéU¨^Ù…)ù!i`6É@X=ooÕÐSsð¡.¸2˜{Â]Š’´Pš?¿z ÷­š»È£°æÙYíΠˆN^*¯¯ŸãyA³-ztv4pé~Gç±Çö™I·SÎÛf¦Ó0ëR*„\*$—ª]Ö¾HËN¾?íÜZ„qq™/à¥Ð–cË+ÐyTçÄÒã€åDR©ÊÜʾ%«íÏû…Õ­²óÁ±Þ$dàôÌÞØëÈ•c ùŒdÇk™¡[ÛÕ*X9èÀ;ŽØ€â]†¼f´ÕŒ¢XsBq¢H.¸û»æ.kÚ%ã0eUO·úy +‘ÅyêijIà•áY”Hz’?æ% •<ÁßåWlÐ+Æï:¶@ìiÕ²e¿Ø?áhõø×pcò-’+“  ÇŒ íÊä× ¢‰„Ü#…Ó÷šëùÕÔæϹ¬©›è®;vÆw©k ~­…Yš›Hšˆó€Ä¥"8!rÖäIk^rmàí¼Ã^bº®ñ€˜©n&@IÍ íç¦!µ€³~¿´V 4ú¨¤$ +¨­59žµli¡F?Em‘k“¬•¼‘ƒyÄÕ¯­trè£âà«Žçzl2o¯}Æ+jž9’É5—hmsQª¼±H¨ÌBH§±Õ1.5#PØßÇ9µšÅ»}DY •¦Ú<õºDеQš¢^ñ®&_¶hÇÚÂÔáœõÍ9{ 9ˆÈUEÔ“ÁçCØÕìo,–‡ÂúÇzMšbDMc¤š)#©r¤-´™§»¬¬W+逸È]`ai$µ(`ê³ à +‰þ>·vÒJ›Ñ/$ç¨Ë7Éõ¯ãL~!l2>²Qb8Qtï¦Ù1Kò|o=K—™ˆ$Y’J„ödH_º:rîÛq©Ö@*Ë6¨¤|ãçºÅ«aå¾mtõC ;­‚“@|š_øë#díà_ŽL2'MAÏŠômÜfñUëËÛU³¡M+¨Æ#õaâ§Fɣ͓< .–´ÝÀ™]Je¬t“¨;¤”Ú?;øz¬Åwû~.„î ]ß „G«„‚*+¸PGÈ‹˜È±íáh‹Ž†E Ý/èÂÈùò`ÖíÉõ©‰w!}kúo¹áéâ 7Ïàç飰6F–ë¯ÞÄ‚óÆF8ŒTz>‹¡+láõE© ¹ÖîÍ”ž|+$d¿#€Ó—«)g]•yå»yTÂê®O VŒ=÷ )€x¹`12 Ðíd7Ty/óŠíSAå&–¦¼ÍOûR¯õ +œÍŒ‚%P§(@NêKaƨ¹/ik!ÐsŠ,Ý£` ͱ žKÔJ½èÃÓs#†ùƒy´y"_q" +ŸH)ƈ5³Â¹u'„霯# e_QÍ¢#ØN„y3zÜ!!6 ªj呂 ÑÎá!à‡ Ÿ¹ÍdÐóå@÷k½¾FQðハ[¯àñŠer|ÁZõLG´º­‘¬%L,ÑY‚E«Æ=Iî–"³Ë·™ö|œwx{T•Z¯3{¶Ô0ÕV» âÈÊ‘Ë}…eO`Fâîð‰0{<ù×±ª«ê÷b)¥€5AxÊ×d=°VîìG{ƒCüõR@ïE¾ ~Z×®k(¯=¯ì±çQDêV„ypÛ¥©Åýx)Ùµ/ê6P;1¨F¤jv•€Cˆ0IA)ê)3i ½¢€¸&ÊN«@Eô»²×‚AÉç\|Â?ëÞ¤¥kø”ÿMo>¦S¨šÝ_¢ÍÚ6Z›ì{z¾‡[Á»üP·aÇuiuÄÑVGð•ì%Ò#¹öü²v´¿uÝ9Mâ(!¦­L …`ålQeÔ› U©{ÔÈuf¬£ûçýxlÐo¢²WÚsjµ½©ºß^ f„·~gýkÓ¯#ùžë€±zÂÞn¯Ì5§dªþÓe»ÎêÓY PÈ®Ýe¯ïðªC·ïNÚ„ì¢úb“u ]ßzÌU×6†g92²4JlšézžŠßS†ðs6éÎc§ß/ GÏ¥g,FáœâÁùnrî/>ž†¤wj£|«àø¿Ìb¯¸²3%)÷[!ã!Ï EUx¾ÛbŠlÚÔœá%…ª)ñ¶ÁÉ`³ Àâýô l¼]6YS‹”ƒÜê+¡|< ë3zƒë% ¤o!ríÔT´ð˜›­ŽŽ‰öº#ŽÇ¾hëþÓ®ùÉÔAG£ƒ¬š‘ЃßYd<:² ÄÈ»Ý1ÔfxF9~î%QV·¨Íà²J{J\ßF1ë Cvn™i#æW2¯#ID¡èwí]cÚבHºi4Ó¼€J¨ÓamEÙb[ID¡›ÎEÏ©lHë*F1r²˜&=Ç¡ÿLI¨_= ±ãÊnŠtfTö\5ÑUhðÐ@•Q%2@•wį¥3”¥P Ùº†Î*,’àxÅã¼  í÷†µCé1ÕÆȸ`Ez•åŸzhLÏ0!¬€Ý¦vEÇôEFòãÄXé@x'‰ È(—Þ›þ_ƒ1B 4¹XlTïR¨6Mì*Æ0%¿ +ˆËcK‚Ræy½OñPhs ‹D‚I„)4©óÙ½€õœ̪O«3kîà#ô+/>­"|ÅÆ'ΛåõåœH”ò›G…„ù¨1Ò#õ±Ì`?6ñ¶žŠ|òwa¯-œ5º²¼»â[v}\A{åÅ.l–¦¸e‰óÔËÁ/À§“7WpÃeùG*Z¨,’mÑ_?[”v„Ë“½öiegͨ‰fT™l¥ 0$`½;U\gªŸxÐŽq:¼¶mŒ€$·çV§­ÇŽáÎu“pÞÄ_QCh`ïœ(Í@.Ps-²_‚Jaó;,#Å~DsOS¢^·—*Ø» +ÈFýÒØXºIü•ëV|PD—áŸ1øàÏpògDÖç³6R;E9´5°!}ÝÔè©g·\¡,‰9§ãmœÐÖE›> [,ΨM4F!Y¯è'ã$J•ÊjC‘Ä8PjcÀ“ò{kÒ‡®c›cV{>ëUôA[!¨ëA¦ÿéˆæþ zÀ Šþr¨ðʈ/è•SnÛ2ÈC}qrœóa¨Ê?áÆBlQ@aü†Ì>Žàd'*Œ˜ÒM®]÷¤kTÈ©¤ÛÐh‘YxhŠtMÉèå±!¹+(‰ÒÖ¼[$×?¦ ãPÀN›3Hµ#où°~ ÿ‰¥Ô‹?¶)§‘ÀkÔ5RÏ?\çs¤°@{ªPÜW.KmlÎ|ÕDm¢Æ¹)ßò :LäP©í¢«9ÅUË rw†ÎöŠ ¯ø1À¤ð‹¿µHedr“°ç€u©±ð褫…uL›òi¢TÏ@R¶79«È¨¶›ø˜É€(MœY£”®„„‰ýtîM‚'­:óViÔŠ¨Ì¶½ª÷›ž‹&âs= .guöAùZ¦õ—¡ÀµÕ…ËíWÖÊ~¶X…h ]Âà +Ë—õ%ÃÁÐ`fûvÿ!ü¯wŽöÂs L(š¼œ›ï=Â÷V+ò 'W \i@Ò°H‘ 4Û{¨ÙáZ»("çÑ"ºSyU:8Õݺ’a¡Ç¼×ÕU'ÊÛ1æ7Ca'•œ +‹ Üg)puI‚ûH[i·ž[i¤$¦ˆþÞ¹"eãªÉO×j-»QV­ûeb½¹¾L0FMú On.ˆý–K +/2Ô5ZòNªÔ)Ї4„<lP¯ót­Ô‘á´0ŸBôæí|̓*~­åãŒk'Õ +mÀ"è‡>¢Ä¢Ù¤Y~p4'€¨Â±ónvQå½ßbÑ›Ž$¯ŒJúeçÁЧuB4HTƵ W¢=Oÿ”ÔÌß×£:#†á:•r­¦Y°XÕ²¹ÔÏûšÚ;ðªQaÅ"=B`YXú… pϨﰎ ¾¡â1j·Ú y4‡5-ô•‡!ðLŒ%Fƒ Ø|èð®kÄr-¶ ML6²_Ç,6„ù3že‘ʸò-ÖÕË®%èRJb€dð×Q€Ô@pž`ÙP0WÑmW€˜ajor‚`¢JíQä +æà JWóbOøTŒ 5Ýo‡°c4õŽ Iª5P—õ¸é„EЙ«$Õ¥.pß´ë&ÜÞà(¢Âé6&‘õRJ˜*¹Ÿð$=Èî®Äï&#RÔ% ¾Yo¾Ž$ô€ðqÇÂs˜o ”·‰©5ßqg”‡^Õ•T,YØļkH?céºÂó÷MÖX÷eäª/taGþ;ú¤rF}|"˜\cÒ=7ÅÿB«ù€9÷Å€ÃÉÐr Q=–!ï@¥%"Þ.ú +C| U‹lÌK¸nZ›ÛªÏu§N²ÒÊUœÿC1º5÷à¿d/4®SùãV‹'Wì*}¢n?3Ÿßȵa,XÃ?piŽ-¶¾NuJù喝¦’QcÏ]|²–M—¯qD×nK–P¢ž,dzÉÔŽÔP•»ßVñD×Ït×’‡¢#‡æPmZrÇU=g qV"¤óB‚xþç"ŽÖ™èV¢¶ :õHø#òl9Oúæ˜ì sãéYÈf¾†K­ˆ:§8©K.ž8z§×Åj«ym o%A¨ëš +sãîÑz:LÿíŠ9¿)`ÈŠHȞɂTƒÑ⊕*Îå d’zïsû¸!Ž¡íi• Oíˆ0–[e"A´YÀ¿J=6¡”k­‹ÿêÿ ËÍʹËmÈ8ôEóÄ›|þc‹™\2…âòöÛAeÁûƒ ¬QËQ·.Ô]‘›N¦Éz \Êôñ´â@вbâ1æ }b¯˜Q×ÖkGj7]ÍÃ!Y8ØßÖX64£EpáÖgöØë$t$¯Ga-×ÿõØ:ƒ¸ÉZIVº$‰4'åHÄ”KpkVm'H¦ëŸQa¢öÌò É^xpÔi°í2PaÌOűå}¸Z“Ùº®·8‚µÔeíªll=¼úÉ ¡76ž~×qØïš +Š#FÂØ +†p™cCÀÿÇ^ÈJ9¬èà×°ÛÂŽ¨ W¼‘\¸Æ^ +E=7Ô­nVÊ)XaÐdÐ2­Ù[’5Hœ×Ön§[o9jŒlµÈï­ý´TKN5ÚòNE€œö°YÐ’„˜& ”ŽG郙¤pE«e‹ÈÓÎ*'ÌÂØ~œ€¥Š½´¿Pìï¥Õ­‚5˜ÛËÙ¾yðøò`Á‰[4ZLj˜"È^Ryv÷Cɨ釺çzbôÑ)Bü* ïÏ úûÿ;úõŽ~ÅT>ÿ_üÿïüÝE=Õ[1f„ü,½ˆ¹X9«š¿ÛATŠ£tP‚½,ÏÊÓ‘Þ‹<°ã©e’â~b°C,&–¢Ä0–hF¨­F#^Ç"Èʼn8žy·mÇF˜Í—#ÉS4·QFŽá¦»˜æC lƒ*Is| Õa8ڪͧ¢pÜb‹‡û¦Ó¨³¶c¢R* w…ó¼?­§äP¥6µV<©4ÀðQ¡P7Ñžœ$áQä²Äìr=cÍ-Ð _Ppí5<ò©]g¤È ìÛÿ,!ž½¦.r|îŒVô#ìÛ®ú­Íy6èuÒ3x×É]™:ÍàëSW••o ™Q8Ãól®õxþ\w:ÀÁ h–çãuÕ]dçTv~‘ñÓã—8ûZ¿Ó6¶X66#ÛšÞʸ3+–×€ÖµsN•t•iûâ´N¸>#ÌJRsÚð>vcÍJã+P=¹NÑçgÀäúaž, +s˜ `€ $x=<ü¥4ø0§0¡&D’,+Ò»+D’ 9{`(2òÐF/_¿B3Tý¯ÚÜòüMÃ/}­L‰ìÝñÔ•¿?2·ÑÌ\Ûº"0냢Žså×kÜô׺ðÁÎïS?M¸tæ‡#ÞZŽDAŒ +Ñ8Ä@‘À­ïüh9D¥JÜ‹bs+`][L©Ö4ånäüqyic]êä×(¦íÖC(úà ¡Õ6+0Ña°$ÜOªŽbÚÆö[¸Îö݆¶‘'ò•æû{”oÈýàÒÍÞÌ0œžÎéì9]9 Pôuž¼Æµ#αñ?­Æè}›ÝƒÛ®ÉÅÔžÖ‰>{ÿÜþÝ‹úÝÖ£€£8>Uþ«”DùµnXºRs|JCê&ÝÐÝ´xÖÐQÂÎ !|”–%3êoT +¨¿Íí`} ½ßkã ŒBh!2U·QA¡­uj;voh +sT99ø ÜÙ`uUh$wŸ‰ô1aÀU…Ý›6¼*™ë…i©UìÛ±AmƒE¹,?ë™#N…åxÁ®ý¦O{ßàqo½ÀŽ’¶Õ­˜C¾)°ú|ËSß&õ;ØY0^‰õ“[Š}ûŒH1*Tü.­RM&û‘fý›îû™wŠR™|K&.ãpí‘[!ÊzåEó5QúÆó±·sn—>™«Ü§©Ôð(ÊþZþõ/&›ó¯#Ћr°âNW¡Dú%p+Ø°gr>ð9Z©R²=v™ •&nj[8î`üÏGJeÚÔ»X׌֬!¤ô½)k‘Tz(‡W½˜Ÿ•8µ`¤sË-ÂQ…%#ÂË¥éÞ5 SæH¢ƒ/9’ÓŽÑzµ lV”\E£Ž@òxBKm[*‹t”ÙÛVñŽüs=u}&uÎ1[}ÄåoÕØ@³´»\v”)½WÅß{Ì͹¥ÅhÊiGÊz39ãNbr]/Ó3ï~¹­ZJ_IÒ‘™¸é’¶VTçUrÍ9N¬å,ïöm²<–uôÙWk®JÝz°â¥þbQ¸ð&SigL£h†…–"u¡‰ U½{34kŠ²’VDï#b2iwa\™•ôÐi'ëF”Ä¥ɵá¨ûç¥ÎÎ8]@1nžcuH7),÷ôÙ6]Ca²w`$°ù¨Œ»b·v:£À¤:@¥¢Bį}.¿ý3~¢L”³]ö£ào¢)ä¨çãâOB Mj㇀šÕoJÔ».‰*>6é ‰;LDQE]1HëË´òÝ:¿>X]J¢É`Éôê~T3>õ5ÌYz¤çƒ¹¢W[÷OâÇ«™Ú6l=¿c†í^àNŸœBàtªÈèîÝ¢Ô âïDTÛòúuHXûˆH•©îŽ(Ÿìüf7)sFsô{X¿fnSˆh[E>£Gæy·’E¥öÁƒE!á Û€„ËŠRl2æ½ýu'Ž­SO„3ü5vÇ”=ê<€"ÚH#ëЊãgGìÉð‘¢3+ê8²Ÿ¬¯$ï#ÁVYS’„î[ã±µ ‹š@®‰ê×WS,(Lí¡Ð?2C$:#$ÁCÑ-䔀ž•¶1xØ4Å´d¥kßQÄ”$zjYøšS)»Þ6÷J$e‚Ñj[‡%ÊÛ÷ÎÁ)Ó<ô/ë·$5MÉb¨…û…xš!í©by”T‘„:¢šNE0…ö¬«ˆ½çÓx»R?#~¿û"ªÑHš+ðû±Ÿ ÉDu ï&0òÚHM‘;ƒ} ߟ¸G|ì3ŠOÂVÃ(:_ݤâæcm'´Qúõ\s!%Ʊõ…q—VÇx&ãA»<ˆ‚´›¢äŒºÈÙ‘Ýìgr«ÝT[«FRQQžÌFä®NŒÙFÔ•à“¢öëHà˜n…ø¨¡‚w£Æš“r$‹~+¢éi@ÄÈ‹&$C¥rÕÍ"GÊ{¥/ýutÊñ–³pÕC‡AïËC“9ìØæH‘&HÚuÍðÑTQüÄfu÷‘U;®“n,´aÙ̺4½xöFƒ»©3]•F÷˜º¥4âä+ÏÙˆ±#îÇíÑózß8™±¤7ÜGº©wÜÈá_:Ü¢±.e à1öÝZƒ@×[ëis‰+_:=&ghàÐÖ5 +”BŒO¦Ëþí£7E"èßP´U ~ð€Ý[5ñ8~év÷SŒŽ s;‚(+Ó··Æ)ÝÑ̪ZÇ·ð¡\Pìþv×î=ày­¦†:Àû¾ ªêåð™RìÖ›ïty†n[aÑ*™?–Œ˜ 7¿›¦Ö>Á?÷Iù¿³žˆiõ!}ãyÜ\Ma¡S³AcKº +òif„‰`åûj·Û¨=mŸFéoá°«:TBM^k½2!/gí‡åy—ù—2w†AóñÒt“ÜÌKšfv¨þ8R™eôfÍ›åëÖ“`iºp^Ÿ9ÀŒÒÙ&ñDÍ+Q$ß<[™> €4ËDæ ­ƒjÀ(ùqš+Xæ1œûˆÒàæì1¸éa8 +›¾S‡õR‹äVu³éóþŒðHPg ÀŽlã»ýh· KDí +¼‡žO‹aø»ˆà£Ñ9xTJ>b(CÓã¢_9_ÓÕƒ“ijË:k>, €鶡Ãòí3âùB«w÷Œûþf?xñȩê­d¾P¹ ýÒñm‹¨ –(¤~ÕVïÐ8ÑÀw@‰ÀXìË­9w©ìŒ!ma9·¦¿‚,Nݨ­û@½ï3"÷®Œ„¡.ø™Ïý p¥gä³hM)´É˜@±È z`Ϫª@χÐp:³pu¼KD;æ+K®D‰RàG”ú É- ź[yÓÝM3Þ#Ênëë…ûî?£ôrâ ¬š42á ˜©f#¾ ?¢è{¢¼‡(/RQõî/Š)ŽK˜ÐÕ¶Á¼=šA²È6Ø +Ñ(¿p‰oq‰ç«…ðŽýeï¾ccµî*C™¤Œ©gk;eXœv‘%e©ï(×Q“î òLÊ3sûÑ»ò½Í*:ãí_]rÞ‰Dÿ´ËHŽÝ?_“5•µz‹rÍ<÷ºç@⤊’¼éÐGëG†qãŃ õXÉ® ªsQÌ!ˆfE;žŠ‚ý÷Ž˜‰eÄÜõ‰íOD¹_&KÇÎS·¼#áùØ„ç+ì¥#Dèm4=%œø;+_BýΉ@ÚŠÉÃnÛ«bM`ën¶0PÅ–à`ëTE‹¨² +%Ðgj‚´ÞWDlµºFt”ɺPðèÓ¦|Dšh}¦`>‹ ‹8ô¾KÖè5uíïAŸF²g›TOYNþ¢„ÿ‰xQk(ÂqñR+"Öš|îýÜñJ¯‚†Ãú/öë°| )6b ÔâVLP~|¡CÙÅ|på +Ô°9p¾ÛöA!‹"óqGiçZ¤S^,äªýÕT +‚A|†.¥ç:Û’e R3IîêF:÷c¿çÔ°Âb¤ ‹õ–Ÿºþ`;ÁÂÇØÚŸÕ4¿FÍì3bÝRÚ¨q¾º4GŒ"S­»ö [øÜü·° =_7¨œô¸fR ¸ä’¥â’;Å‘¢H-&K¸ÌF‡oAxåÏAÊŒœñ vœÒ¹Mx ¯aN vÇtãV£”tÉŒTðƒô‰pÞ¡AíƒG-é#Ò´hE µŽPãˆÐÑDS%”r,µðpÈ1=Ûõök“­ ,ò`BÛ0oRLÍ8 ônÀkÎüÚjqAøûÊþ#+v‹Ï›Ÿ—üZ‰ „4y<¢ø5¼lÜ‘1öy0P.«1BëS?°Y´™q̽çDƒ÷\ê(aA‘{rß닇U¨¬¡¡;¨DS©ñ‚B/›$Ø#EXV¾aÿ®!=Fõ»PdÇÖ)£ä×a¬¡Øž*9ŽÜÕ{Æ°Ð#‡âH._ÕÐFãÈí¶ŠÔ€'Û5ZŽñe)&;yÜ!íõŽ¬ :ƒ"ÈÀ£çÑX.#u5˜™ÛCfXû¦*U#âæ>_Û½Àiev£ízî­éPA@ï S + žE®ûów÷ +êQ•“5u¼~ƒ,‘äƒ3â¨!{×(ØSûˆà[ 9¼ÄVìGˆ2Èh1;=mkì*~!|DÞ¨iªÃ2÷†‘ É<ük_Îþºê7?çE˜‘ž‹ò%$†›×†žb2]ãoÏ ‹fê†ógƒæ¦o²öl©@ð¥ÜÇB%]…ºã79Š“ÈzŠÝ ;ž¯Êµ[ê;æ!ÚÆÞÛee£ ŽZ©þJ*n“¯¼¦*y€ŸŒ`z%B5¿zG¿ß¡ò,¯Óu~©ŒbýÏ”@‹Mr#Ö6JN¬;pÎLÆ*Aµ÷fóé}Cnî{föñó5Ö¨‡°nWí åM4‹nÍÚß#|Š=Oqc^>ƒ †8R4Àû<»ˆX´«èa‘úÐúç»@¸õ¯ñÂÒ\uC]X Q$zN 8ZÜéÀ”JZ¬=ŠÔ *RsŽ…õÆ:Î"Òµ…Âr ¸¸6œŠ¹\ÄE½¿©uDÔ{!D…¸r¢XlŠÜ˜‘y‹œhT 0Š¾. hpY‡šk¼Ì$6³jÌr_á ãd9µ.%¯Uì-ot*$C̸ïb‹‚³¸„‚ú6ÄlÙ0Ê1°9·è(ÀUæðöµÿL‘PK‡n1·?×pª PÛsz ï‰èˆ+yåRÕTzÒ˜þ××gl?±Bjw"­*1ðÒ8ÕTÒº¹MúÄ|£B©Ç{Ä,úþæƒ~ߣ‰rc€Eæ’ˆÕq1Ÿ#[2¢OüIñBi¤/ï™BFŒ«Jd +¾Ùª>Ô +Qõ9Ä=v%“?7Pˆ4¹jý¼Å¼igÓÙ?$FC佂ºì+âb~7ºú9·F¯ñƒ6*êOS«¤÷ý¬)ÏÚ2½{¹9,tÅ^Áw5#»È½îÚ\/R††âW/«ºº + PÉÛä~áé€8¨,Á-a¿&',•¡â€CÄÚ_û·ëRvkŒ ê7iŽFgà'ÛOÆtEZ7l¬ NËdžYö-/‚I‚4IB˜/@J5¹JR€Eì{N5 K<«éRý<6È#Yl¾ë3"¯ÔVs„¨Xfûf?½Ä)ch‡h+¾F»byzRÇ(‹‹ÂFð• 1ín$yëtч‚M÷ïRò'BÇL#FÉtC ½—-hmTáU9½±†vþ›4ÄšÐÁ›ö< „?þ¾çÐæb'úEE8åÀ\Æíz«Ôc²‡†›%7eÿ3Cô~Ió'ìn@½ÚÆ +clðÓ†KMþKÍÜ×6&jµü1ç\;eR zƒ†ˆsCÕÿ +1”Úûç†à¡ø¢¿Ù¨;¨ç@±­Ià%Xæ˜U+m0¨/“QŠuKi§Ã„p×å¯SЙk=ÓR˜N²T7úê)^»÷ûR©è@ûÑ$u cØ•âÇÌ<(ob»ºË›¸trk¡¨XW\Û&@Ø ŒcS¿´òú;ï +´(/÷S¨z¶]ÊH¶¡môƒvKήj(Б:?ÿQ€øa]ù¾Á¯\ãÑ?7â›­óOäç×<¾}+Ž`Ërì±h>ÂõÈô3 C Ú1ÇÒùÊ7[d²ïAI,?Îik° •ºD(ÝÉàMq½ØT·;-ìÐÂŒ yέ· +8gWø²‘ŠOãUŸV¶êE:nŽÉð+½ÜšÆ.Qù!ä厑¢b³ëïWßb‹…Õöq~¸wkãšÀÀøÍé»3bÔ»Ó•Sÿü;{>W¿Ù8(͸ ÷Dûÿk:œ¶Vö™+PöÔ…Z7S×;øÕz2{²“ÓÏd7œì¾Ÿ"Ÿ|)ï¢c%œˆaÔÍ[¢¢¿VÈÿÎAh1`݃ÙgH¹ÙN˜…uÙr@e˜í’|ßEÖk½.=HÏg,‘ð"™bìÅ1Ñ$Áÿ̈µ60=V±P7üÈnoµ6hÓ^·|‘D”²Áº% +Qx­ɢéOÔ>GªØfq¤51” ¦BÊ"ù(P!¿5÷¾0áÀr ±;ó¥«Ki²9 ô£YÎ| tÙÁß#ö?6ÎNýcRsúJ+!á®—}åR¥Œ_E£¾ßûþÔPÒ"+øJÀ +Ë¡Ž‰Îz‰X¨ ‚¶.‰~#Bÿ•Elg=ÿÞwÝé×½Q€„é_€M 31k–°Àp–º°+V@=jøI‡Ì$nÊ×aÞTqd|+ãðŽô{å52@ã˜Ó²9s"EQ ®œêW*û@2Á&‡j™:ƒÖáb¬{L­/¼H#:¬ÙãW>ß>ß ’p½ŽÑéT²êV×í:} ÿnGµCí•yEסnãÌëÄÜù‡ûñõf%£³>:e'ÔH#ЩâHÅ´d@R¨F\.7Qt:ôå²*8è°£ù (â¾ÝÚh`t­;¢ ìà…]¨¡Ý)CŽ¤sߥ6ç>R…Ô`‡..zŠ0dÖh­k"‘p#[Š¹HcÐwÏùi="ÇêÞ¿‰p +k€ÄÊçÆ¿uòþ›46ŠlúAÒ#ˆjJb6™Ó@däJß'>:Ú¼-ü*å2¶A¿§Ö_”;éÙÐ÷šuϯŠâtÙׂ»|J?2YuíÞ67îmBOóä£*(”콱Φˆ†£ìúÆ@”+Æ×O?Ô®~@}Uâ‚c÷y'óLß΢·íˆû€c=1=âiÛ%Y¿þŒ&E–ϯ±eq¿6Ìz‹Æú‹/ÔÑÓšñý 2Ïd[ï÷²p–œóc@,«pwé5 rŽ#ä×Ô$÷½yý­ª Ç-†ÎzéÇzÂëµvT®”•u’\ËÊìA5õœQŽg˹Æn~2Ïý“SuÄÆð}y±°¨-}‹ØèÏîzô<ïmÊÖÖ£Xó©ÎA$­Ó@ÚÔ5퀈‹¶×½!6Ayߣ¾5—ƒãí·gÍüÒ¢t’j6,YEžuüâï÷vÓƒ ¾óŠ×Æ{D+õVSçæ.ëš$NtÃðˆ^¿šŽ³ÁOÓSh1ïotO0u5ºyáK}m¸¶ï-Ó÷Ø(ã¯yèœZvý¸5Ó©Û}·éÎÛy27¹g‰RÔzdÛ›øßfw2O¯Á<¸þ¸)Ý×ožÐMB«ÙÖgY#=À_§Q ¾‡Än4ORàg^CtNχt€sIA;úóÖ¼r)ReL|k[ùŠÖ˜þÈ5àL¢ÖÔ°Ò®V³/N>ÚuÀv‘&ðÝ<èÖx‚ƒ™@ö¦h7M{/¹ÎcŽÛã³OD‘»t£4…}5JPÁ{*a€~äHuz.—o7PÙ¡Ài;µ7-vÈi9ýÙ©Î|•ãëávRj–:dáEäjÚÔ?ƒËGH»ëžyÛº™ÂØ!¾°ÜCÎ.ßb0¸¥‰Á~¸b‰ê$*Ôé)ó%…ûn³rËæQ‰ûy¢´Êlgm"øÚW-ˆ¼ò1– UltÀ(Y¦?ul­¤Ó5WÊÜùóùjbãßÈ4uKä_6i¬}ím_¢4¦ Ò£Wú9OÄ5 'LÝNSIÏ €vË…˜B®SôA†ð9V7ÌñWôƒ¸ÚÎ<ñA׌3A „á|®2ÄQœ>#"=_ÏáçÂ’D"NrâY£‡©·3ÐpÀ@Ö׺ë|,]Io"'T4¤K³¯«ëý JpDƒ¨8GµkE›,eGñ'܈8ú®¹IIF6ˆÐˆî¦Å`Wtòxˆ +A#`¸c#Ë:Ý "I &™€¶AÆÏqÀçÝr÷%*{ÉÀ‹ó0±3<2¦ ^Å‘LW×àÅù®oÒk¦ìÒ_¾÷žï½ÎÏ€¼w@-Qþëø]Ï­ežõôΠˢ9,þ çwSOÆ-ŸòT4>£ÞàIÊ#£o²Vè$bêï­ÏZÈʸ?#rË@ñº¡tr×oöCƒê”î75'ÚœQPs§’úq7;$èSÙ£Ï[”Bœ:§ +;(žñmщ;Šú”PÔ§¿¾.!oæ'Ÿϧjéêã×á ʇÿ8þçŸ]Uuö™½žÊÛ{Ԍ劒Éè³rܼ}3fe}ª Ìíž´µ½Chn‚åyÈ}¢HKvRRÞ÷sSøQ%lTÅÿÌÎúÎÎyÑFyƒ+W]|‘ üß œcƒ²Pf1Úc­¹NS +i €07mX ÕE‚è Ê< 7îö:ÒÕÉÅ°éÚ‚’ÿYÔ˜8“úqE@ÿÚ¥«Á=¡tµk²Z\p?—‚X±tœ=.áà³(°ýªó5ukŒ†/ÓÙç>Àة籓÷ É.D¿œªÁÆ®òãç=ßMCWNî#ˆCxZÀÔüŒ¸¤$ó²KÀ~òÖŸ£ÔB †Îj t´(ý•Z6ð‰<•¾TZ4®o/ý’!¯DAƒŠ.ý|’þc§kk8d®7dn¡†4" +·+Eäv š‰˜w6HqôH6ÜdÆ´dχ9nl¼Õy7 ¶§Î´²´8Âi+âP+{EXm)Ú±<…»±N_qC"({¬ˆ—‰zwuÒcËã× +ºP؆v"Å©ã +¢…ƒ «R(·Tå´mAÿñ¼:/íýÂoª6p¦Y¨ªÙlŠ…O‘¶<\*>½½£‡Ü&BmoÔžµ…ÎÛ·çäÚ@! ø—B4+Y’® O¡p¥œÜ JîL€¥¨Ì‹gÙ©#>fÓ#3à©H±¥|ˆ|)í™SìžÂõðû§Ÿe•bv¬êÞö²îø^>‡S±2,Ô§xÈ +ꛈo'Á÷(5£íò­wi=ˆFg6„±Š–2m{líZÓZišŸá«ÐñÇÖæMô“îÖnzÐO{­œBÛ–€CFo1%¦ÈvgЇõbà÷VÂi­®• ²*ýgd®Ð¯ÜfÔcœ(`½¤!`ÔŠmD•EAž×[™ÇÈNQø)ú+ÔõZ¸æ¼›‹¡[û5ÖßÌÂü/峬t¡q=z=€ò5ØØa;ÆÞО ¾pžÏÞ8T(àCi^Y­›ýˆ FHxØͮɉ ¬˜uµ8⎡Ԝ»Cæ‹u/sݺú*àãÑa óÌ‹ -“ã·ûÄŠùÞáJª Kƒ)ÙÒuÉ{¿(¡Sä·/s‹qS_o}8el•Y0l”å±Æ&º'€k‹ˆŠRí-1u°a´3ÀºiöA½k+#úÔàéT5dBaVÌב êq¯ úÕ±;;¯¨ØxI‹-®ãI«X{ ¦Rw~°5ß"ʦ´h]^zäÝRR•:]Ÿ9ân¹wŠzùæ+p +,-Lÿ?öÞµÙšã<ÏûüûKª(Wáåô¹'ßDq˜P¶ŠVl©R.@PQ0eýû<×ýtÏZ«{6_}¨Ä,S|÷ôš5k¦§û9Ü°H¶[tQÏÜè2Q{ú{qK)”uã„ý̃ЦœNhÇgá©9> +Åj:ÐX>Ñm …‡CžƒÃùõD†Ê«©H˜Œ3s]Mu?/®öòa rÖ —NLˆ.¼IìNütgÈŸûí–BâOX¯4!]hÃAêxr±‰%“p¹rë ŠšrvKRöï‘/GÁu¾QòÓ¡ˆuê<*"?­P;h¡ÛˆN«Ñ&0„¨Š©ÖR.…ÕA}é™j1*¡Ü€áàÒû”N–³¨?¾ÉñÎFÐER¢&—_Ñð2 ¨d_O@Ñ4Y—¾a½:§˜Êz´£:cè:€¯Ž~3ãQ ¼Š6B8R\ªz€(Iñ=™$ÔY3R +é40Éõ÷”x#mtµ ” UÐIròX΢šŽ<º×«Jè> 9 ]6ºð¿ÊÙi ¿8§€.V!„|lý¨•ÓÜ‹Ô·Ä6=·u„?Wx¡¬À§êa7çÑüèZö…INìVÎÈÛ*r3forçI«ÝGaàªÅåÄÕØÎãŠ:Çé,· –(o¨îvð7©®G®%³»Âã™t::&ÁA»:L ÖVÇÁ¨ÑL`„°E§¤Í5"3;Ðä­ã›¢ËXº<šŽŒR`£ËÇõHαh"!F‰Òñ×ðIJmšÄîÀÆò«¶>Њ„ Ö¯/R¹K ºæ¼YO¦)GÐ~‰¼ÎÙÅ +Ø`…fÎsB)¤p ®¢¶í¨Ð`áOg‰xöóà´-&e²Òu-('t5îZ¼¡yÇ<˜ m©‘tG\𛮸ùŸC³B ïNEÂ".ZJè’I¹oðå@1©cë©Vþí4À]؃Ù0¤'.Þ¼æU›#‰Ú¶˜‚6º÷‡â°@Ý¡øyài,DŒE:–ª)‹†dÝH„2I„²£Õ¾ n`ŸE6“Ú;Öi‚óPÀÁm[Á‰m.j#iÀw©öÖùÄ;@Úz§K{0Š€'ì–+ÈlŒ=ˆ?'¡×%€fé>'a±°F¸ +£½ž0âç7ùæJ¯C¨=€Ô,uT‘²·_UkÐFp‡BËò*³xé›HI!ÕJ‰…];j¼ÔÑây»SU»³žŸ„#³ÌÅƒÄ &³¸:ä›ÄÛDg&þ¬Wcôe”Í—!ßÝOZE!‘)/¿h4H¢ +¸ÎÝ“0ä~àËdÅ&¿žª*ð6êâ.»Æšô×ð*fcœäË>»óú“‹ÂE…c³—:ºŒpØ*€;»Q‡tÙˆaÉîê>âZ62¤6D"ÊÍiSèîïp,ãM¬\‘«u_—>î_öû7 vdPƒ(tj´ÂDÌÓŠ•è²cÓ͈Žv–(>‹ƒ·â8‡E©!·¬dÐt}“Öã6ºP@ú$‘Í‚ÆcÄ° Ï +ýlúAjLA`È{ïü©Eq|€p¸!þEÅdNÓÜþÛ>ÅÊc‡ÒE0jÕq¾´Û‘ F£qÁõÛ‚ÝçÈ—öQÒ®,Ùµ+)dQ+B|ÿìSDµÕ¦¢¢²þ]S +Y¼Ð¶cx¤ÐYaŒt5]39{Á4üÈ/iº:ü?d4èǨѱ²Æå†`)¢ed`Z" +€ö6HMÂEga«±³°Ì ÿrDO. +±'Ä&*qñh;l”6Ú:ׂ3 +- ÊHuä:@­_0Æ&c+‡_OÙÆ‚ŒWº +j æ@˜6¨CQ¿FÑa¥*õg"8 ³h‰c0CCW4 rlýDOŠi‰8MÂ%<Æéšž 7Q¼L]äSUéŽp{Š~QßSp(Ô’oÛŽY «51&œ²ÁuÚFUÃpápQöJcëùZÐiÂîÆß²„ `u|xĽ +WÒnÿ¬Y"‘–ƒø˜P9èMh¨‘@`a·xþ ˆÍo+ôA/ÌÈ?=çýà/ý«l›öu“¦ ^wËè»Fó¶Šm¼9åyòªeÃò¾:âüë ÚØìŸÕ­ÛÞ@ÑÞd +Ù<È N’hx1·B†ä¡ªnqLƒí<¹;Æ„Æ!t6Õ k¢¬´Ø6/C®£°IpïõäñJVX’\ÛP˜e9‘[@¦Fg:G0ëÕq×@QÓŽG{œnÉ’’¤tºx0ãèý< ÝiŒEoÎ!¸*ͯæ™e¢}œ'l«ecÜ°ÙYìˆ6]´©ø¹iˆ‘Gàç"‘˜ó°ÚUÀ¿ I,(é´t¥£Faõuô ìb©Ûi ÌÚ:I™j8› í%·`_VÛ6À â‡'ã¶_*ֳșÇ@E_icÞº¥Žz3 :šä'%ÏnÅ6êp9!‰À°!ŒÓÕ’¦h^¤©Ú¹ö˜ê8è€j¿Mç£ CIÔ×äR÷§œ»¦ŸröU$/Ô­…ƒI.×pê%1†Î2—ð10×D}‰â¹Å<|¦jgÛ4ЮJÿ”TÁ^fÞÔߌQÂxTX³àMÎémUؤ‹×¸Á‡qQñ(–ŠÛVT¿Ñˆ$ÌR›T¿Î<Œà ¥ßbBaNuÌjh/Ê©66í$àh É®h˜=Š“Ye¼&"P‡c”^ð(Rÿ›´¤ì¥ÒÂa–.{-Ù€]‚Y}ªžJ"EÕÞ$~aMIÓˆšàTw¦óTëé‹Ò©è™âP+ÔRÓ¥êçQ‡§È´Ò¥è§vÌøÒÐzðßYÂ~ûÊ8?ÆÞ§ÈL'Î +–D6ˆ7AúãêWÛ˜‡ÑHIÈ-K‚ˆÐ!“õ&>ËØɤ Íß¼& ®æà)áÓ· úËW¤% ¯_@µõïO5-à‚‰ñµ²è”Ö 2§ ŽP¼rƒ€¦ð?Ë ÙKð\¨5ô0ªûy„+x>]öÖ›¾< ©ST!²6‰ý.ÇB{ªh¡>U!;ÄF¤ÛŒž‘:æ¶úÑ€¶ë¨ïÏXG£•f(\Ù¿Ý}Ðøˆî|¢Âˆ°d*ŽMç9d¸ô@,ÚŠ=ºÕšLPù¦Áb‰»4Ë6‚myc¢ÌnÔ‰ìMv§$h#þ `Û6éR‘ˆKyNÚ=x=ûrôª¡_Õ"S?õ“­§ P¬°£VOk$×½K€®šˆÚ¸zQÓñ$Ž6r"Ó`c·]1K‡ã›"Ô\-'·lDðf¦¸(Pò¯®yŒ» šÇ}Ú}a©"þ,SW&Πÿ‘ŽY<îÛ/$‹Id¸×„Ÿš]ÊÕÈ¢©²£lœ¦¿FÐŽ¨ƒ&ÔcÍCŒÀ¦FPÈTµ³÷ȧ¾ñhû à\Í~a-‹·³%æoer  ©áÔˆD œò¹Î$¼Aó‘ŸÃuàƒLnøŒæë›NŸa^ÔÐ.Ye¬BõŠE–$÷ê¿©ó'7¨QÄ ²;Þ‡ ROaMYÑæÓ΂>£óŒõxñHXg«þ¼Amÿ¤2V$NŽÒ™a#°ì|ÈBÕýûb‘;_¨ÈÍkË¢þ7`‘ǼEW6MäB¥6(¦}–r!NC¥\gA7#‚©°óãFZ-Ø[{ ‡]·i–9Êôö“õm”‹/öA–}ódéß ¡r8Œý BoÞ‚º–Ë<êfZ:œz!l”ýFê\”´ÔAý{‘È—ýÀœ¥ºÕ« A]q™Q‡êx6ŸI£ÀE0 +à¬f™Ó²¿¢\§‰ÇqiÒ ä#Åé‡Ú)Ú¬G@‰ æiK“Â/‡~žŸ§N#h€ €¬Éq•ÙéÁ¸˜ú =àie?ƒÚQtÄû,þÈ“µ¥…8«úý8‘ÿ³Ítq WGðé㇈šX€ß³úÄìžÛ¿´ÙÎé8&ÐŒ‡Xè²}:Z’í“ +nÒ2Šl +‰”é5 òä6QŒÔ¥øb—…[É•¤a·éE’,jŸGGY¸Ð¢èB?Y^£ííãqØŒìn5;èų`üA¾ÇŽ$ÄH,k¡|à +Ýýw„üðÐð4UwK¢¢à½¤rD'çà†@¾‰:C””,oŽ j·(ü‚aÚ™Í!y”º@oé …šÜ[ѧ¸Â§iÌlC÷: +ø}F$a½,'W¥Î‡ðú¢³í5ŨîWýY[§(~V„¤9«e§€=}ª|;Qìr>•’qtݵ4 äàžšC¼;`Œ">Xs™Ã&d"È´  ÍöîM¹=Æê½!LqFšV½—‹øB9¦HâÇ΃úç‰ÅåöW]Jû‹èÇv"=—ííC¿vgÎx$y8‘TB>\9ªQ(9ŠœAÑa ÎÓIò> #líd/&œÇ þíÄ3ÃcH +<;Z~Œ*Á¥Ö:¸R)œu]/< Pr~Z*þ5BØ ª24ߤ€f Ùgd ¡›™W¤ºçJ™DÝq*5ÜZŒp$Š.O\ó‚š3[àG_‘Ï~Ä·M‘3y–}‚`f}£.ø?ÒuN!ºÛ–Èz¬Š‘[cu·‚ãS÷Áh®^ O½Í4a%eTrì ~ÜL*^rgï›ÊHÅ–Éêkªü +N÷gCm0F¥&a-Ê€>ñIôImzô=]šŽ”Û1\Š<‰¹‡ÄCwx ùƒ+äF*š)*®‘R¿ht—7ò!°|Ä„‡Ç„!œÔ@U©ÙAŠ†¤_§"àî* +XOMáÿ±Ë`¿ç2Lp8Ù1P,aMG]ËV2®*š;qwâ`SG’>°usà”!2¬½É·<Àq–8@ÐÕèú«Ì‹ƒHTŠKƒzq¾õêQUÊdÓd´# ÈÐZGJCBä 䤂'¥tê|¨ÝÖ-ˆ‡v ÌáÕLõ„ÏNÖPµ»aähKPhª {sÁâµBcçq&;äüìMž ÕbiLî„h8Ž@ÇÌõºýh B htðþ‘b„EÿDwN™ÂYrÁu¤ †@S,ðäËí€ÁJÏИB›QI;?ð£ÆömQB€{Ïz^%uçŒÈt$é@·ŒûIƒK¥k‰NI%¤)q":, ¤íF+ê©€qIJõ è<êØ7‰Ž¶‘†r÷ˆÕÆ`HÚíñtôìCP}‘îAËn4¥Œ‘UƒŒ»8cÔˆ<~!Œ.€öòÉiØÚ°±Â ++³‘r(æ*l'ÃAU‡¾6Í!E0é–ðœš*(»?ô\éXé£RùbÐæ’|UµRHç2NÕ'hv–äÐ5¼ÅaU× 8_qìîµÙ§#ŠÎð7:ˆõ0k%ЀõÄ!#ȽÚS)’Ð!ý2O`¦1Uóû„\¢‰˜^Ǿ¾ÉdPh«¨K{wãý1cî,µ'«zÕ·SíòÝ ²$—ÐtmS23étêzê{$`š¥¾BÚ)]V÷þù=ŽlÒžÓ¡pœ²­]‹Ä`ƒŒp0½s1ë¦r%‚Į*²>P\ˆ»‚'²Ì¢'ӣ߈í;!&¢±ÀKðÏi]P6ûå›KvCó^ºDUÁ8ù©æ·:´aÕ·9çÙh½ùÁ‚ˆ-¹Ì)=ÌÿüNÝudÛHsƒRÕF€óR‰€ý"’¯áP·lŠ4Ðý\W/YRÁn+hX¡ÿÛ•ÞÖ39ŽN=%-É9CæBŠ—}•l0)¬&iDSŠI}t NØ÷#‚r³X1%ÐñàÅÉRˆ”xDÌHýtIÀ©tQÖáIˆ!WEæ²»Ô⪠´N¿Ð ÆY`¹îŠBŽ_^“…J*óÑÁ'Îîï°“©P.¨®Ö¶ B à7ç}ù=ò,ÙSË, AŠzÞ†©³#yYÝè,š£¡kÿ×~3-mM?˜!äج&—#WJ>$èQdz‰69±èšuÈ’€Óy Ñ3dmãÐÇp °†çÃù‰¢¢bVö‘$Íc*Ãù‘¤ˆk±'Y9’~Z%¡< "?H9 q«À‰ÁÃ1YVÛãëÄÝyñ™–Žeui6,PÛ`zÊùEŽ-LËÌ`¥Éƒ{0©#c‘Ï¡xI +3È y(ÑðZt‰ÖÙ²t7?(ž•ŒdNªÔ_ùíÅå\hBi QíyùƒàîI€›€hCû Tß"VhBþT§ Ô $Æ/J³€ižîèC¯…—–.4V~ã)‹H +'±^ÓúÐçÙÿþsæ=9ºF¦æ‰öYR Gz÷µíd¦rù$}Y)ž°ÊzM­±o:ØõÛ±[B1N–sxd-óoIp(":t¿àÝ=©E´Ká,IØb_ eÕ²‘꧓>.Æ«M…EAséwÅMÉÅ1'8è Ý(¥\fzM€¥),pÀÝ3`IˆÎì5ÐNˆÈ(v¨g1Ž©hšPºæÑc4ë¶.Ýàòô¿Gý9¹§üyKüiÞVÀpXüðo tÉŠŠõ\ +ö~H\`D '7Ÿý•ÃdbÒï!U(ÃÞ@~5È‹3í,ÖŽ®.èì˜tµ›>¨°Ïz2,lú%ƒgÑ´L: îL.^™\:Xµ>±íÙ£¥Æž/Ù¦µÔ½§À‚Áô˜š÷¨ž{!?áŒݬÊ]¬,Þ©ƒ”y€Ñ…HÒg%?bÊÁOÄžÉK~ló$u¾X@ÅõDç” +Ž¯EÅÃ6HåIhóPo¡å&ÊÐ!(µCû¥ Ï‘<‘/£ÒY%Ùý¯Q¡NCÆŸ°Hý úɪ‰´yÊʼnu^xЬu_˜s] +áÈQÒ­l>{6/ópŠ@ðÄ·:äxËF­x%• œý—e4‰f¨¼ä:¾vç~7*Bl70髺$,¡ Å?:üBå'[qoKÿç?º ¢®ª¸JÖu‚?ˆ'ØÈ¢ïG±L3*ô0Î3`Âë (¾ÈiŒ@€R¯{~|] Uf«90O¤ #$ð !ÍÍŽ(­_ÁÀW{4®ÓˆT”F„z}OEúÀf™W]Ñë~ŠOâd*ÖE ±F$°U ‰"óÙi3­/[rƹú0!êÃ*ÙE!0EÞžà9§@~‡\$‰ß%)CÑËòIÁ›!Ì’‹Ç +ªÃý€s›>BAª²¤M2`*(¹v'í^ÔtŒö0‹žv|$ÉQWú¤|¢ìËzìXàù*(€ìúÌÒMƒ¡eO¬ +Äß="‡œÈæí÷©SH%(ÌšŒ•²±—p‘³@jƒ©•ü i¾ÏW£+‚Š.+±Íe¢L ¯4–€¼FÂA´ö½W‹Äˆ!ÿKd ÚŽ‡³õì^(L+ˆg”ùI#ä{íáBÆæŠV•ö³€}Õ0Ý‚i P"±øEã/èÒ(|³ Ĥ0 GQ‚l³6 &Ò¿I€šÚà-6±-4¤žÑ¼$"!VÄ6 +¿-*B¨Ê»QlñJÈÅqU–ñAnšž—"€Ëo**ùT|´“ë! ºDP‘x zÐ °³É Ž}è¢çN¡™äˆ–õCd¶<ÞPŠÚ¬'%8ˆV·p +y4뺅–Âçæ`S˹yñ5`‘7~Rt^$Ò¢x–8š™ë€>Ò”b'~Žº±Œ[”° =%r>p30ï®í‚ÿ-´iÆ«°¸—²ž2-ùêº ]õèénÝ) ¾s^ç~ÚêC|8¿Àw[›‰Dû«Nû“ê6Ÿ¢ýbïd:Ú zÈå,uFô‡è±j:þ‡¨s„0Å"ekÔ¿ŠÅƒP”KºÇU¨Zf—`¨T-YHr²òUJÚ]üZX#Šî¶ü7ìn·‹W†Ha-ÐÓ5ë‹"—xú’OU1Ã}3ü, oÑ‹‰W/ª§€Þm%ºë˜d§¹ËÉíMZÕÖAçLÍvByz&g²ùŠéeóQ,†ÓkN×f(Å ZkR…\œ + ÍT x ÓùB0õJ\1'S¸k{DÚ'BYOA=³dƯXª Yy6W?Ps“Nv:}‘šfÕ–U½j£€q'Jg9%§!hÐ%?ôØÔ»—5µØã-QPÌZtUÙ9¶8R§ÿ†©À$NþrSUèÂÈNývFÇaTÔr|Œ̪]M0:ò“>! ­èXý›’¶LàúÅ¿i`ìë•¡*(@³,¬«ê"×,]YQ‰c+Ó:ƒÛ`Ôi¤Ù¨ºØÒåÈ7zUmØ¿©A·`”J=¶î©.ðDvézÂØ0G³k5 +,HAŸ‹àË8‚˜Ûˆ™L µG²d+®n‹P°ÐGgsT¢Á ]6±Ñ!Py9„q¥œÂ}Î/ŽW²˜j‹dA +Ô6¡ ê›uCéE°+¶“𠯄,¢¥9=eT&"`W{‚iZ|ª† n%õ¢4¢´RŒ’7˜¬}S,~O&Å~ =œá=,éÎ榙. šÂ9ªFª¤T¸>Ø=w "z~ÌʨŠLk®?UÑpÏUpç*ÇaAx^°è&mÚ +â)k”ªªXjl7}\ %´¶žÝöHËŒ€«þÅÍf5BÔ¹K*\_ 8\ ‚CN–¾O†ºœüïØËòip@ !‹“à—ršáÒú„aµX^ƒÔ„Ð@Öd \IÙ‹S–ÄÛ¡iWP"(R.‚;8€³ÀÙ ~¸YG™vZnÅ BŒ-ê—8ܼ¹òWPÆj5uBdÝd6°¹àCO[8ÙìDQ9(ÑžÌ]3Åkatªz‘k 'm?M[#¥5I|U5²i4ØÌ>ȉÍÅ ³Ýí—?qB‰ti¡”K=XšÑ]£ b5t=½J(Sü<¢ÄkZº¨uwî‰ æ2é`;.wÆQ€9 š@VAÊE€¦JŠWÌÉ#ŠÄNÇ’Šþj/è?éI¦ÑßN4¹ò,ž5MòsT DD”2’KìIG"¹ˆva`ógà{xC KB•v/Ožy(«RàwceYh…õKŒ7»ƒHTô"hc¼,M¡ìO”3†2.:ªZ¦í45(`TÒW¨‹ðnÜ +yÀ %Á°A‚óPšÇ^…±1ìžqõêõ5ÙЊ q*×o)s‰ÏS²°X¨¯ðýÑýËÔ%Ô:õ†y5ÔצªkÈÀùºcò€…þÍHEªIªWj88¾9‚\pð¼pâ5 °‡ú =4  •{ÕäK²;çhÓ®œR›ôàk®&ÌÒ¦C–1ãpL>»ØS’)h¿##‘pÖFX¢"Æ”ˆ¬1 €¥2¸Dl’êˆ îƒCJ¶ŒÞÕv#'ܧeg#›s¸»qNy Â«—îCuÐfyðb@ÑËuõœ4›ëÛ»ð£ãô¯Þ5ýOô·NÿOÐîŒ3Å A| Î7T^Ô¬ÇLË^õߌAZPPÏ^‰#:üT)ÙTt@»»¨^×ñ$ŠêLãdrˆkèæŽQÅD‹rP±çíÁÓàmIÊô†+":åý|J×[ͦ×.:ÂBèëõÙÉBoX@I1tEÒ(ö}F¡:©ó¤,P­¤ÝUÈŠP•XëbÕÂY+®˜ˆž„pqYƒ÷@{DÉŒwß ©°ÉqŽˆMÅ[»qˆ> +®~Rå«þ“ªçªfÕ3a9v]ÔŠU< +jš "S†,Þ»H/¾øbÀiÀ¤ïrœÁBÊôBH__à„õ@)Þ¿À‰ÍX)3"Á΄‘ïæõŽæ(J±ýR|³Ìî‹•Çêû’ºÅîh„ïÖÔ±÷Eâa<Ç>C‘$fq˜£ p¶Æ®ÂÉ:B_ ÎÄé/^«7£¢ +Ÿ;m×i㡹½I‚ˆØnF°ýp™ýy|Ó>ªhÓ¦ã+IÃXŒ‹ªm©’²£Ë^`öK$–ðÄBè$«&?à?€BØÄŽdMúTpí@¥¹A™(õcLAöØœå£nš'3Ýr +»Ì2ÂÀúÀ‘"UP ‹`„V JÒpr‹]F(9³ Ø5›Ʌ‰ç7©¶g£Î8.£ õ© + +éHS4K⠺뇅|: ŠFP±ÕðÚ4{x‘-÷p³**ºæSi”“jßî®4ôæ@75/Á:ªžÒÔr€QE6tC,@Ñœ>ÈŸaMc«hï ÑS®òºaD#&êɹ‹8gž4yƒœL„)¤ŸFÐÎÙ÷ãwruÒ»â Ä¥Î-Þlôa-0‘Üø)§SMH$xiŠ^î³éÀgcž“%ÚO;TúÕN \ ={4ëábZX‹mÉëX(=öÐ(Ë·u8æ1 ¬%& #*Sßæ5Sd„9@ÎίÅPÍ/L‘/®Îë{œ]$Ú´qàÉ®*kÖÇqéñÂb0Æ2JקIÚFÌ«‘¶A&Nhtm'jRbKû‹SÈ?qŠ§oÊnaoYMkxÌ® +pDXïû¯ ò++a¸= žŠRH—SÒCFUuoÃ[vtñ|9xÀ‚ñ3KžŠ{‚þ‰D›No"Y¸X ¤&F¨·oSô2Zuµ`"¦@Dÿ±Àë÷F› óü`±mP±]VCnSáh'li{l +îÓq‚6QŽà©F¢I@ŠéÆT<îÒ AþœBÐRBTƒÛÝ µ›¡µUL fä+mh}—²¯R\¯INœÒÇÙ÷H"JŸ`= â|‘o’^«`^þMR/·­Ìor8 Z](˜3êpµDTˆåàê8Ìà½l×{uíAœäÆllDËc߈œîëHJ‘UÐ8¦m%Üݱ”ñ8%ˆXŠjÜ`‚É™Û,9I‘Û .¥ŠÔ(ž#UŽñ€0Ž²•±=5ti³ûia”ãµÌìHOi÷uñ{½Êä6sJU¥¦gò¤n¡< ‰Áp—–clµœF¿™ Ïý`†!N†¤¾³ü +±«çÏj–ë XGY‚gú7ícœ$a γ\ ·*r!@€C8±eÃv­­Óä.2Ôd¶*¹fB‡YßEÅÔEñ±÷â³ó]þO¶ ü¹€6®~-²HHoar ÞfŸŒ@ƨ"³ÎûA¢‚vŒƒŒ’ƒŒd:¤T‚¹oœúq ’–ú¤'ÀŽ¨ÄCF 2ÎV€~$UI9e(Gº¦QÄÊÈU†•îTèyÇ8Ú|ÓqµM›#½TŸ-§è«’íõ–ì[€š„& o¿šçèûPÌÅùgeç³!”à`áIQÍÏ%4·"ÇÉ"ÄclŒÚ 85 +äMôkׇ´uû;Ö´ Tu¢*[fѳ8_\,ÌàLUÉyQ—<³›¼heÈCœ˜ÚÝm‰áb’%—òì#ò³1Ìá¦.:±?$í€éõáçñtÊž ·ÎÁF4zÀ-‘V}]-)h˜!ô½¼Ù„Æ"”Ý)êA”S³ @IØ`ƒh÷.¤-À%{ÛK2!b-ÊÀ>º s£uå0@uôŽIVCU#>Ç%Y ÕjœwlÎx’œH3H) +£ä׋|œ`:€zjOö™êi,#¾= é<àÇûÍ(I´yz€¨;àзiÞîy–š•\sÜE¼`È“ŠÔmÙ‚-ÉQñŒôlaéAŠT´‚Æj˜rpŒ’ý‰…¶†{CÜ@¸!ðXÂgY#dÑ(@ÈègÀ»ÄÌU¼K¢G¼ÞÔݲFU¡kဒ)Î# —HÒ£fDõ)#,[Æ^¯Nú(B­ ¢÷"jÏ`â96wEWy[»,ÇÅ:º}ÍwÝsô‰¹ç”õöƒ|×U¯ÞBû¨c wX%ÇÍ/”¦a¢5‰‘呺…{rI½°Ð÷}€¯Uà ´Ø#Îq; `Uœ +E©ªfUÏýÈY¼*@ÎN)¬›Q€¤h›47e“¸6Ô£Zö÷MýÏV1‚p…D‘DÊ B£'êÂ]… +ð€lÚ7 {]ƒó˜&apøE,ÖÍ¡Ä>Š^Iƺ²¶ê5‘ýœ—ï½ü/ú”5µSÌt© +¹æª+•JË lNôŸÍš,|7 cm¬ÌŽ) +ÒÕx«¾Ð4€‰’NMeÎS)‚ID;)ܸ?Špªø1Ù¬ÉjWéÇcD°|B–Š7ͳŽeÐ!èpWÇXáO <‹0!c7ÀùYõEA’»ñ²c°‰&À&¤’4 +1c.'Tÿ&•Ò*»Gr²´Ú_0Fƒ¢4«j4"F”Ц)A¤Äy ƒ]N¦MCö[¡KåBÉ·:‚:¸H"Ђ·I?fz”§(‡åíàÁ¹âçˆpŒü[×6´Äqµ?0s» 6¨yeøfóç¤yËB7̘nJ‡K1zðƒ°Û”¡7ì“À;ê$E†Í˜¢‘Çy:¹>ãÍi ¤>ÑàÂ|Þ»¢BÅ@}c¼€JDk½‰Íß5¸;…“ûùÅÒû±pë RÚ›*‡ë§Ø½" SätoZçA!¦zÈÒac?‰üD§öp8R§3³pj²blì«"ÈVÞÔ Nñÿk¹û"V"Ⱥ’ÇA¾zõº¿HHÇAqÝ7‡x!ð²èSe`ü‰ÚØY)ípq,瀷Âm5v^2#)CT°ÄWêð‚³õ9Iž$8Ô(š…'&ÈŒ úlG è’äµ@1…HÆ?Õ)¥ý>« ‘ŠNÁK r ! +‚Õ"Ê>@?äÓ)Dv<$PËé.:“g/†g¸)ºJ0¤§¡ƒ´r¸;j›S%;HÖšD÷fDÞ0±§ûìæó:H’çmHž£ÛЧÐ8VÃ!yHvùûx´­i™~=&‡æä€Ð+èYDí b¶ÄVM‡íüA¢U?E‚ÉRû¦*/TóS©¬ÎD ¿ ¿ ;€ÅãH¯cù õäÈ+\›Zm: ʇcJ8àS†Óéu–¦_»Ú½5ù[Cá«Wç —€ÛF;É…œ2>]^è)Ó1€'¡ô8H¼w²ß³!½p ³k­ÑÇÓ¡›BI ;šë DñSqQü"‚[ó%£Œ- °™½?”Ä_è7¢†Ÿn>… +þÈä&ÍJC•ôú;y*°Ò£Ž,z©êV€õ‡{¯ïÏCšÚ¤¶µ¢AxBîÌq?0çnT[/¡Žpóq*[’D¬À}¦$Pck9îí8Á´ƒIP‰}TÇNgÝÙ˜ì:õ.(cÙy'5Jé²CŠ¤×Šš¡t…yøRÃØèž4 7]ýìûj>|_µl¾&G“๥+ä¾þ$×&RÌ.—ò¦½è¶‘yäÀ“N= —³!µ)‚*)*‡Óô)}.Æ£È3ãÊßEçïîØ‘ÁgûɵíâzÀºs!“Y20’tÅ.€7Y=K÷)ç¢È#÷.Ãp;HVÁtP wÃð…À'o¹Qþ|Dp™;Š žl퇅&¨u!& +Z5™ÆìÒ]iX¥Ðs¨Ñ]å%ËÉ$b‘¡'ÁaHË|ù>O'ÉR|D³)ê4Ýc ‰9Ñ¡n˜(SQéóW¤‘TÒ6åÐ_n,a .QlhÄZYÒMØÚvÙÈ‹;DÒ@ÐíZ´Ÿîq°;¤…Ò¨º%öéM‰¿Pø=o$úçôP©ƒR¶³ƒeÁL&.ã"”WT 14ú^†N˜nO+å3_cÄ®×ÖŠ4[wïp“Ø·*5Å„~ë/gãòÌ)±Úel?çâ˜&QôæüeÄ"vÊÛˆ»e{UÁ*DqÔ3Fh!9sAr2WS²Âá–-Jp[ÜóàA*®áÉ4 gÐSÔTváwõ%R”…=µ&±Œ¢Vå(PGàø×æn‘=’_ÏüóÆ£Xœ*"æD£ë$Uv—lÈëßôØzGìÝ|\žÑø\4¹žºÌ ‚O‹ŸD¹l…à›¥ê’R23·¨‡Nc„ä>…æ ’SMû87ô2ÚÑ|DÉó‹ÚA§€‘ÎË‚A^ÏH}8Ý]¢ÄK«Î· Ç€$«Ã>-±¢P1©‚-õSH .çEÞtkñä ›Ú¿…»CjVw¾ƒã4)zȨ½×ŠDüÖÙúÔ …E߇ç!šƒ²6L^È[VqQFm®ãé&â´&¨hø_'‹¢ÓSEÒõ¨!ôV×ק©Æ(xþ:%AQQdK óœnõÕ±<þätaPF”§/Pä—R¥ÈŠ5ŠÌõl‰öèf„¬J ÓÓSÒ°¿ñÓk@X0Ä!f± +»Ù ˆá¨Ž<GZÆMïë[‘I»h|ÅÖbñãÉbÇ»ÙÓ˜Ûv‡\¼ Žt +¡#¢¨.ª›";•ÖRTHIG#߀ŽÌ|ër4¿jw®÷Ì(p×q”Ö€§AÎq`\ébdâæê˜,ÌF²ÓŽQœÁF¬; +ª>˜TµTö =Ó«Cxªl.ˆ6ظ¡; +ÿ^¡*Þ^/Ÿ,Ìv¡ˆ' ’iövG¸9q<€ŽØj©÷´f7Ä*d#‚0N‡å”<‚ª4>*f8(]¤Åƒ,ˆ¹ D2ì2Bó«Ò%ÕíV5ÂE©¨ææL2É“+³.7Ë똢¹Å©¢€Ž»Ô~ŽáiÜUª\7#ñ/°zvàa°âŠ=ôNñ–±URq—öÍ— Ç$¨Y Ïßv^樢Qì5 ¸R×èVÇzÓ†rÚI$¼ÓU-дÊÍe‘eô":wîA‹‹ÀXÇÍòJAµŽìo´Å¦ÌðzÈwÈ0ÑJãkSÌÔ_DÅuÃpK™dÝãwr ‰°*_ŸAéDfê²­ ºitN²DÒ·)xäƵMEÄ}þ +‚A"„ÂÊŸºwÓÀ… O +fÜ%T²Ê rƒ@:ÖçƒC.²3Š0[qÒ*ÉX–k0Œ‘eé?!xy²Ë^Qù‡&2‡º×(÷±¸ ¨ë ­QÔ(E|t +=Õ–Œ”V\ÒQÖCBÄHÁ‰L|C ¡&È©\¿!×d{{šž²Ã÷Š@£×ßs3úÓeGÑ‚Ÿ'–àB|àSuh¯p°æ"ÂÒNËók­b ‹÷L°xòhµnSQÑðJ®Ë>˜]SFàÀˆ$ L„éÀápôÇË\•Þ ¨¥6Š=ÎŒa'BF˜TTݨ¥Î-ÈÏ—Ðñ7Òþð7 ÞÐ2’ $Ïð·$©t4BsïS>"Ú3 +Ñ„5ëŸúç0³À½Èí<àÅ ÜÙoº€_2N¿9@=MáHñÑ9]Æ,ªAb³D_8TG`lEJVá½=¦]ìmÀµDÈŠØî +j*ûiÐ‘è –u‡ChÕ2F*Ô)7w ?!‰§ ûvÕ(ºù> +ùTLÜê@سU$:­rPÒ(T9‚üùAÂˈKˆA $¾|–S|ÔïӹNG¨O“Ý^RŽjFêiŽ_ +%pÎq^Þ×$îú&Hœz²ç‡á® +¿ò}Ä_ÁäîZ¿¼^ðw$—B„®%%m>#D˜*µ’Ü¢"Kyï°Íìk‰Œâa™ê>§ÔP‚Û>ú´ŒíŒ'… ÐÇ®à§×9‰ó뢑Æ6¢±—ÎùôÔ‡§ -‚Btp¾C°-¼ªÊÓŽá…ÃÖx:8ß™ +™@± µ HÁ¨80_ ¸=}xªr…G…×cˆýIšâ”@1n÷;+*uΙ¸Åöa†¶:4`þ!9´¥I"ñæ4aè´&Áwøa,°Ñ*¹1Is¨€6¼Ž‚P¥e,bŽh›"¥bU|½¹ߩˆø·ö‹N¿SQÖÚ6‘$‘N°,Tö]ÏÙa’ ¹$ïê,SÀ!N(À&­ÏêçG%V#¨I‰+á,ˆ3áú"7‘¡¥_‡'¢¤– ÇÑ¥¤¡(]Å¢AÓ¸ìtoñlP»;d93¿€|L8{%×ov nÙQ6çïzEF€×»Ö<§ŠqÔ»(ÒJ Úfzšß´ŽbviD 9Ú +%‹.mÉ4”µÚZMˆ"Av˜Ë> Ý£<Øáhm£…¹rÅe@]ÖÛ¼SØ5ùû ö›,mt_ü gœf&é¾ Žcº|Tìc”Eé¿×sºÁg#KjóExBUåKJ=šƒ‡ZPÚ(éïH4Q’>Crx§:"ï½oü«oìóÿᛯ¾ÿ{ÿ`yïËþò·_ÿÿÙ¾ëþéÝûòô3ìš¾ùúŸž®èÝÑ¿üúï¾ÿÜnÿÿúÛï¾ýþcƒÿê»\ÇZô{Ýÿöõ7¿þûïàÏûÕwÿüO·óÏò?ýüéó?ÿö«ñIÿ÷§_ÿú›oÇ_þç·ŸþŸß~ûÅo¾þêmüå-þÙOnþæUð~T9«p…¡R\XM–€ŽÓp€°bù§¥šë?×ÿõ?ÿd!¢;ù<¼¾ÿ»ýÏÿÛþøÏ–¶¿ýÅÛÿõ·¯üó¿Rì½\Éú…Bã}ô²´‹n£æ¯úåÝýÞƒ·çÿö¿Ñã¡~úÅ—ÿ-&> ~õõ—ß¿Ïáÿ·ü·ÊÜ‘ÙŽ‡¾d}Ã2ò{³ÍläæÒ±+T(jÀ¨h”Df:ñ?q›êãàR VF'J‰ÞR ×*ìrÛ@-€p/rÝõt|Ð> ˜šzDI2x—»-M…N£òˆŽðÅF òjœÚÕYþžê#Ôèù +–:/m’"±´.?è¼6IâoøàªÞ‘ìÂTC`³&Ë öÑ%m1ÎÛ½íJõú5àZÀáe6¹òÊÔ*' ²±qpÆ%êíßë4i9,\¿ VY:£oïÞµ¿;íu hÀ¨@õ£Öȱè +keÝ^Ô… +¢ùŠÞWŠž5[0€â9''*%ˆàRÀ=*JNœÆ§00JuMSjÈçÝ—\z°µ_ Üb´Ø¨°°[.b‹h•êz-½¶«³® ¨ãž´¯)‘zá`œI6m|Q!“±n천¯.‰ž €Äæ²ÚµÖaJܬ1isÊ[Yb–õ%Éû€rÄ 3S?æ:Ò&ÙÓÛÓwÔ¨hBÎ9í@ +ˆÑNOâú2œ£¸ +Âï×äÞ¼$Oˆ ycñŒšëUÞMGU(‹ö*X]Luåú=+r‘<°có€š× 4öd_)cd`Šª®o–%¸=; ”V'¡G‰!û±ô´™'(ÔœÝÁr“÷-Ø'È +<%º^Rr½¤Ä +%@êÉ->•êbOLU$²œø±¸­º†(a €G1p#8ò¢–HuCÔ\:y¸!”7é/â"›á,*SBm˾8Ÿ=½au´/ä¹TŽ²ãÍÂèýWà»Xh©þI^íÎä<˜jÅ!Ñ(•(õpVÙý8óίÄ1ÏÞs­²~gŠ |\G €©X]YmVôY$•-+ó$…&_•"¢Å a+O£²•9‚B=«äòñj‘«#ì + .ñˆf‡J†âEº® ]s|'Õc†g×…ö¨êT… ÏHiï4dÛJ$@U‡|§Pzðz[qKõªåÎK—u[E^¸ýÒüZBTw›†d%% ŠÞ©kð¥ž7íÌ㛼ðÿd¡ª’—[—k]6Étg±éàBl7c+Šˆ@ˆi¢I€Fc¡@nËLòJ€vmF®ÄË/ ¡2.{ÉL jU ž€bò–‰½Æj™R¾åªÞ­‰Ü%ÁŽ|ÐØÆÏ ‰KÝþ©w ô€l«J’Ï££a~‰Wíåȃý7¢è¤,Kù‹(W­ìü—ð¨ÅG!¥©Ã¨7Ë›*'®_}u5×XšÄuÁ:[M·*I#a>Û™Ãø%òÏ”´œmDÔÉó WzÁKF0;b$Ê.d3‚ï›{Q¡VLù‰qO„ÙX Q ØesãíÓ_Ûw|“2vTôŠD1>¡°ÝЮã-Ì°ÕÀµ?Á÷³¹ø‰ŠÓ”&q*¶ŸgRJu(ñù €€½é6‡ àíôö×,4Ÿ$(ÏÈò±‘R%ý'–û óý‡|[dãù€¼¡­5U;›A ­›èŸ²Ö|Tc…”æYÞ>¡Y-p†¦z£Ðo뎤n(KÚûÌÜ£¤md³üÓï·}ÒÔ £œ,*?‚}[¥pf¹!¥›âŸÎ<ÿxûôÓûûgÏÿ~ûÙ¿ùî{‹¦¿ûíW6•<]û½sCÙÙ_|a‰ý¶Áo?ýìç¿ø×cþÕß}÷Ûßø¡›[ÿÕwûõç?ÿÅIjýï¾ÿ‹Ý_¿DðÁ³~Íïø#ÌïùßšÌã~ V0í»óz»Æ{UÀÝæú¸É-:0¸@I Oƒ20¤Ÿ"ƒê§çW`ê\Dúáñ¨ ™»)\‚¯PÔb_!+Ëç¹£“É( S¿ò˜qÜËHa¹ÀÙ±ÓÌ9jÛÁøýÔP*~™ÙòªGèRÚåz +b¢úºº@`Çûƒ\xûHbæé¥+9:»¼b-A+UUt=ŪŠH°_/7å¸ÀãB´ rÙó’P¤ÿdÑ‚­ õiõ(¬ýˆhµ³`¬7¥œ.æS0¯Èè±JéʳD¯Ë8¯µz½ —¨'á4WC¾_-Z#Çÿ´†ŠPÈ nAd^U’€®^™+t¡N‰èMqóŸVu¸ŸC !J$hn¤°28Á©tüÜ<øVd¶PJª:ð´å”0ˆ–¶wãX¤UûïP³ÆæYIU¶’#z´ï¶Ü/`wwZ©fd˺£Ü ¬:Ì¢ç0˜K—â +¨!¤FèÌs`-[ÿùŠÏ¿Í¸·TfÚEûG¤Ï}Ô¸ãDÇ®òœpRv³û„»ÚãS®¢lð½|d!…‹Nê_ßIbŠ\³Y„ !m¸r ššIÔ“ÚÌT©0kx¼v!‰¾Âs‚ÅSó¯Høé¼Ò2n{Ç”Ûnû Áf&rjh㿨ÜçÜIë)\Éc‘!O½²L››nC€=:´ÎçÜÔ¢%÷•GÖÊÌhù”ä%ÐÖ/8R`Þ&…1UŠB÷ùs1ü̺é`6í¶âˆ|0ÒtÅxQÛò7!½äö¶9+èR\õz.›×$‡½‚@]^ìYPrxª;€Ò9¢¤^ì8Ý(RÐ0q5ØñQÕ`õ¶‡0©@ìé¹"^5^³íhX?β‰èÛ’ ¡šhKЬ³øng™¾v»^^Š3ôK¤fÇC_ý*éÐõ†µ˜fé*±T‰«§ÈáÂQ™VÃ(œm.³ÜÄÉp.àdèÁ^*zŽ +ý-@,èl<—µ¶OÍb˜4…K³ !àY>ã¾±›=×Ú¸_ì:³0§~ª¦¤-} H·š^Qo„wƒ‡N¯z­ úÕ5·z®¼zî, +Õ@Ê“º|‚•˜ÅäÖÝE@ÛÙc·ë Èg±a>&> e:øN$<$Í(É:i¡©RœU’‚dE±‡tI‰êÂ,zuÑ·’¬} »Ü:ßn?Þߢª$<lŸÇÅc‡p +ìG¼Ng>W5w²n î6Ü–³ ÏÆm‹!Œ ËůÅ1ÕNO‡FªHj+ÉŠò`ÜÒ¡Ôð;]fw‹ýæS‚±mæâR,ª +5úÇâhž†S¦ÖdÃVG%¤!8XêèE­⌼í߉jÐ@ÌK"ë/ÀË7 /ßcªmwB"ú@f$ó}sCcý`ñr“a2t´¿QT¶< U44Iþì/îýóúDù¢Ê—óÍÌà'%<7›œÇÌXgX¢ÃgŽî÷ô29ƒˆ`fßÍmÉÈ!›ŒÜ98pÛ«!#HH´2ÛE,l}»b–üÀV™åí/©èyv+fpÙ“LJÄ•Rù\hÂÙD€ÑÐ…ðk Íö‚SHàø˜å/+¦2 qàL–Å‹öŸ”#¡„%2Áuí£Gy4X 2Kº_i»Ó¯Ü[© +‚u—Ç=„וš.º%zˆ½Ú·äÐåe™‘?Šþ®VåÛ¶CБHq˜u„}ƒ¨yä+ xٕ즀y7éA®û=kD¬ÖMõEû \Yž +KÛ +«‚w +VEwéÜeó•âxs{Çâ¾w-Ç3¨»°ÁŸ ØÂËÖÏ(iãÛ7@×[bÌZzÊ{œAÓ^,H›S n R¸ÉšŒh&È®ÖRª +3×P(A‹ ÈejÍxF°ÄQ¼ŒÅ;ͶLòp׌n=…M›Çð™n"8ö\³ýR3îÓ[ÔɆi{%¢ŸEµÉq³¨ˆe“ómñ&…Û2ÃÌ%JÕÚ§ó³Â+Â_\ÆBÓ©¤Š±ìñ1?‘Z$?ñ¸Òñ5¼™pê†ãSŽ^#sy(ó¦o½*h2‚|ïã­yŒ‘£†óo[Jä3¡&¯{F²ørÄü/ Í~ž‘wIdÞà€>Tižž2¶—Ä  ÛšsJXó×dl±ær,†lj8:‡kQ]SÁ ¥#LwNz?7)&„@YŸ@  ì± @=>!¼Òœmv›ŒòJ:øËÞ¡¬;½d¿‚U¶C’¼\“g–'ñдh3ø\so)n—¡¸Þ÷–µ3BH4±NåPKÒÏB/¦=‘0„p¶’8Mf<8ͨuv­6€™²pOÔÇS¢Sk±¤(.°äÎ>|¶·RnJ +gÖIÒR鈨²)œYë+¬Ç*€®x|â²­ždEkA‡¬ŒÈÇ”ØZëAbòyÒðR?BBN,·ªR™µü$­eACqïlì­z%ÒPvq­—z“D©5ªTµ”Ëq´¬Ø†ñKµMö¹Eºç-ª>´êh/4TjnU1öRæ³Âr~vE”ϵÁ0„N²ðÉõíª&bå©°Âúº«AÊÌRòÏ èFŠº•0÷ÇÙŠž’t‡Re)“T±Ö’©ôxŽ"µö\éz©¸B¸ƒY á.*—_jµpÊ\SËn†êk¥WÑä’ï%ÌØk©s´¶¡¸R|_KÌ>\Þ§ëY­j]JñK‘„Š×Ñ—ú6pT‹÷˜œÈ:Ä·­4ÁV5®µ ®02 +‰f÷gPmõx°™dD^”…h-å — ´ÏþШ¾¬YÊ'Ø+q̲4Ä ÕÔjl¹o{÷¤yÕžÚ €‰&@GX_^%[Ú¨¬1s£æa¿fí˜pÛå°öY0üÖ ³õ9¥¹n¯]‘0•ÕÅMSˆ·)9Ñ·ØG°Y,ðsªGì£Ö¼¶¥°ó¦iìÞŸ{7 ÓQô¢Ðeƒ0~ÑÒ [O³wØÖ ÙGÜý }ÔvcÖæß~s×Þá;I Çùd·Æä6)f3óvNÍÆç2GwtÇ[GõîeØú±Û+µvr··rk¿óv¿¶‘çÚ°µ·eeëZß.O[Ó{[æ¶~ù¶TŽ&ûÝ:»5æ·åzëéo+þ ¸Ý96DÁºíX„±u톻o@¬;èX7ß xñ¼wïpuëß[ø°Enà g²…3™2  Ær?m ˜-Ûð3#‚Û@7·ñ߆ÙÙâȉò™‘ç Ú×ÏîE3îÝ`H[Øü;]Ö‚bÚÂï‰{Ú"÷ -u—lP«-ØPZ[.²¼nsš #¶åF¼l˯öwyÚ>jI÷&nKWÝm¾ù +¾Û’Ö ³÷CFÜäÍ7£–´{nû‚T¼Íû7˜ã~–!¹Õ v¤å]-ÃÑ™³þ±8·ÒɆ½-ÁlÒ­”³¡O·rÐ^}*"mH×­µd·2Ö†±½­‚mÝ­š¶{·ŠÜ¾«ìmãµ>¸“gAqƒ4ß•#7@ô,fnê­ +:×·EÔ­½Õb'¼{+ãn ð»jð†(Ÿ¥ä‚¾¡7ûS {C½oð 0¿Ñ7¼ým1~ƒëo%ý é?»?඙°|mJlÌ„­±±n$/bë¯ìÜŠµ5³s4îZ<•X©?Ë’÷¶–V‘~5Ñ1¿:é¥[ºMDUzÄs“^§›®U%§l¶ÐA9R´¾v¿,|ù@è‘œ^óÖ@kô4èFØõ+Ü7â*r(¨óÃn {;O1¤ËëY”‘òÞ„0äÑ*Ë:-™µµè)¹£ŒöŒÏ­CY»ë/NDuÖ>§"›sHœF<—½_ÚTXƒƒˆU_z´Zm‹q—{t´¨D=7h÷O­ýÝý›×ñöÖVó—··amYï·sm} =¾>Osm·ïsâ®m¿M­µû¿ÍÎ Ø&÷3Ü`{7&Ha­V|ÃÇ)T\·³ÔžˆW5ºðã`4æ#ßJ(l öêÉè2 FŠ›,²oç) "ûÇM€hÙ†%`Ы+ûFÐd]»ŒÐïF½êDƒ†ðqwž.' ]=(.!Âp­`Tè?ÍÕÇ`Tïì>bp+ÖÅö=èdöZIfæ›ë]Gø]÷vžíÞ ÁŠÇ­ˆöòέ<§_ÿd€ñ;£F _kæ#^“£ 5ôE¶QYuqbã,þV—6qS¯"Û×'Q7m“äÿPsr‡·™q÷½Ûˆåú¿œÅ£—Q—Wçq …ÁH»Én'’6¢H¡óðv¿F»å`0H%®5k‰RKT?îæ<ë½Ü¯åcÏäË×góË‹ES$ KížÇ–É+G‹ÕšC!ß:Áh™>QÍ.ïLTX÷‰|¶f¤¯£äæ‚Uf츆l/ |ú&™zfñ¶³zy?÷+X_íý—Ü-ûÙγÝÕu¹z~ë[¶Î?”ÁJ/×r0‹ÇbUõÁ =ݼT@ÚùÄí»ôøÔ2­߳ηqu_Þ¾ú¬q³ö™þÁ ñ¶WC¬ Ýß³ù©õ]ßóν›/Å’ LÔQÊë&û¨r z¶ë ŠD×T­ Izž,rpJ"íʨpfWöÓ¦X14› çQ]}^ +9A§ñ|:x`@‹”ecÜMÆL£‰5Ì•v +‰}¸¥`¦ìÂ;qâQe dÄŒQÑâ‰kJRÆa9Šî2a X{ªWlT`V¢h!8ºžŠ¹=DŠ}îâûGí%s=ˆö¢P'3$MÖöH"+e¤1RÕ‡õBu¥fOëý ‚cä\4^í v*µÚ°ÅH•ÖÝ•”qöÄð3!êTÎÑJǶ®I^ýé=Ý:UY¯à í¡ÔÙK c:߸Es»8t«j%Àn’›ù,#d ;2µ&’ºÈõ‰íçÁ©M·d½„¡Ñtÿ zõÊl ¸‰ÝÝ *{²¾°ZÂøÛÝ”!,X Ê?¤¬wO…QEè <Hþm¿e`‘@j¬OÙïü]Þ²=?öÞŒ_KL´Þö)€äyV‹ ¤»©d0ÊJߣñ¶ÍŸkÉ›…v ™NŸê¯“øŠÅ>Nŧ°õeÀ¤ #?ïò.ÉC¼ËöÁ«>-S~z‹ñÈVX`K뽟×ß}Ü]‚öâeµ8%{G£7Q‰ëRõøвÊ=¾f]$o/n[l×߶-Øó¶Ìeþùî›Ãúö f}ŒûFu7 ö oMû¦¹ÎÈ}ó½MÈ·M|}?¶8`}Åö}÷ªîaÉú¦¿Ѽ±´HåÊ“ŸþýOîå†zú³1$ü@A!Š^9SßfKô¯üí‡n9mÍH¤©ƒ¯i:l¤Féš:O*7ÿêuÖÿ!¤n^nôîÍ~£¿²M‘Þ B†ù` ÞUù”I@/FbÚ&©ü…Дy&Cÿ†©‘pGèÞ£¦ÇÎÕ© +Û\·%DZyõ +7K°â˜;xƒ ÖvT +¤Š«ÿ¦à°pƒöŨÿç¢^Å‚cöìPŽd••&²‚¨Ì¡Äˆ±µvn„üð‰^j# “…‡#‰Ö«¢¶lôΈ_Œ«BŽõ½‘ÕñëH¥Á×ØÇå³€Ñé!CÉ>¿¶® AaOòàT³‘fÓV Ÿ‚ÿ{E!ÑÖ´mÈӚ¯HrŒÅ:AX³ËÀ + ò pRŒïy~ +*‚ªÛÑ4{ ³T»­•E0KSE7ûÅʹvšÇ7!‘ÖO©J6)B²_a5…1àF’t ²Ô9ñâ‚7èu´à/tôõÒüš8ž ¯´¦ ”‡ñ©xÔ1*sk”1ãe'ÙÅnSà–Ø͉<¯œ®¤4G –Ñ?-ÍÓì&¬¨ä«ý¼ƒDε° Ø)ƒŠûèÛñÙO~€ÈšÝ7û9ÇÛ‰~5 ‹”>¹”B³ßÜ|§«v çüôÿâÛ'P0ÅêDêð“R…:q¡W±~(i¡ÛËLÆ#¼¼ñD?@¨@–Ö¦×V{ùhb þw7„hm®ØO/åû>»ÉöÂã†zjœC[mýh°[ÄØ~˜­ô„#áþ}ì‹€W-d±uàÓ?íïk,p´ÿÇùûþ‹äÕ>6Gþ;ÐW»›Ú?HQíb‹`7-ò³Õ'JÙ½‰ìžÜô¢=2–ø¾†ê'…3Ç›mÁï´gPpme{•mßÈ®° ŽðKÑæhZP-–8˜T4”.ä ÚТ¼Tn<0&ÛTVœG¥‰®–;<¬õHVérÍ endstream endobj 79 0 obj <>stream +€×Áo•¤,OŽ‹dy’yPá1ðviü“áÕ >cÃËAŠJŽ€l’L{Æ4¸[’´Ê/±A@=yeÛ#j{ƒÕjò”1Tr~"öÎTT/.5fÅÍôµó(ôP%‘>ŠÎ¢%Ó¢-Qoéåaðr˨lE䘳–a·‡ì$Ëöæã‡? ¶xLö+J¹Á±Â„zçw#Û²o;Úã&€©"ÿ™`‰m·Ïö`K6á§[~½ù´g(1bÕÓîlzqo‚¼sn—…VÂîÝnbygÁDàPlÏ’ƒ×6QP…%`Ñ +ê9‘‰Q$ÀKOŸ–ç²ñ͇ºÚv'†áMbYë[*€T¢y9`ýa =›ámòõ¶¡” 㤋¨_î%éIV_Ðò]Êò –4\+V¤çˆ…¶çIRc/·Z§—¦_'ž!~šLrv3Ÿ‚£0â;¯Ö6-AdÒ–&!½Oíƒ~?`¾+÷lDû¹eïDO„õ붟g}I÷kYßõûß´®û½YW›íö®kÕíSÚÖ¼íaoëæ6_¶õ÷nÞíëø:ov€åX÷ÙpùƒlE~€IÈ“ AÄ$­âlÏOœ½;qmbt¾AÉœç.®M)uÓÓFJ……½ð"}§§Í(µö3Ó·‡]O›ÐWÃ>XsÕÓ¶Ï hɎݤË|£§MA£šBFŽ›ž6 +÷ò3NZå]O[—= íîõ´íÒÜ09IP»ïzÚ3êH«ŒvD˜½µ{õl~&¾ç +LNê-‹~¶Å1Á]e³#p0žs²éX½|v”Gfj¡%Ù.ŸMýˆ¾½þ(-§]>ÛBí2ÓzRÍŽv5Ê‘M qµªfs^‹ÎKH¼‹b[*hÎ`Ñïe³¹{¤Ìvä»Ó.›Í7ùy€¦‡]5;¢¢;E–Ž¼“ÏŽe,X XSÛÕ³%b¯Ô·Ò|£žýñWïex—þùžËh# ÀoCE;96ÊÞ«AâÏå°—†ŠLâÏ-uJ`¶ì}Ò‘Ú}@äOÇKEâ I–’=ž]þ­" p‘­ø¦L‰~Ø·ÙzŠ§°ÝSÛOì `jc¦X;” +IE;RïâPѶE(Éö²ªöÛà ¢´†k½Í¹KFÛ¦XFáÓóÇ5±=4©°×}èhÛä;þ#Ñû‘„´ÿë;íÀŒñýD‹úÃiú ê*nLÏJ´Zîà|X‰½ˆ©CK»åŽ˜1áÕiGnˆ眠ñún¹ÝEÛ›Kã«å,+áK Dj¶ö'Ë‘b° “Wâç.ËÚŒeðÙî=w¢\¦9Ô³îž;ïÞ¿é¹Ãê,î¤{ç¹C­ÔKkÔUT¦]¯ÕtÄðâZA…|gºÅÉÉe[*®£›éNnòk*EåÅtà”ßKÉAïLwä£z"?Bàjº#VU ªjÛy¨uwËÆÄð¥ËºåÎtG³T7-}ݧ‹5~Ê僗áºÃóÍì„w…K¾ÝŸ\Ä(ìf;ÀåDá^=v SÙ³iX¸ +'xë±Cd¤oµ‡vŠf¶Xì@³ÂŽ½éºÜÅaÇ.KmW,;+.«·; ÜãÆa‡.ÃZ+Y´ÊÝa‡÷0«tlûWmsØá×AØœu¨f³ô¬Í6,VS+9èP±‹‚{½(,s ôB$‰…ÏãÔe&†ð`}g[w¦’³Âœ‚º€-š*²Ý AS;„“|"{êHSS¥oeçµÉzÕ\ ÚDYâàOzÕü8ÍK‹z|hY³rèÞ2#8ÖC{;𬡽ôÄÆ9º<ÔX3¯êü;²& +ûÚ¡éEË[$@¡´d}˜©é˜wjJ…Ï?ëŠÏ¿Mr¥Ê7×&:$S¶œKã»!ÃwxxÏbçÜ:Â8œÆ‡ §"ZË@Út®©.ârÏØö´)ž„Ø¥+AïÚŽtúo'ÝÞ"¯"Q§!øÎ óI…§}q²Q™]j+Ã:µå‰“9T â«“ OˆÝv„æÆXCÆ^WNž+‡e;…ïa%½’%âE-^“Gâ`øB¸4öYú•¸2Ãu6åt‡µ–ú•ùEÉ_û…-'ýŠÃ¢ô©ÿÏ"«|ΞßÁ«9HˆèÁ¡/¨à<û ° àkŸ"ª{XÛŒRö˜6„èb‡fjMš—÷¬Hr,­‹á—À7—ƒ=Ó‚U9ɃnÎÉv»Ô½xqcàA«j0¬$(å,æÏ4{àµdë|v†`Î!ÔÇœ³{ýð¯á+E(·¯¬(¾NŠ8ÜŠíñžì³m…ok$ælkåav!‘¬‹Qú!òšöŠûéJrµö>>{j¨3¢×¨GúnÓˆƒäy’CB‹iÜ¡>FWƒÃÖºóÕȆ`6åï$Ó$$€IÌÄ3˜ÓD¶"l(ã#]¢ìûlF¢W\imU¤øÃÁDgÓßájIuÎOXc¥OcѨåMåÉ%EIõ?ß"Vì[†¯Ê–*O'– •Añ9 éöâßÔЂèÍ ¦Pžq=“æz&6•.—˜íÀ³·ÌvÐ/[깈œäþ5nÕ^‡U{=‡Ý ½/ "A§fŽ·—Ô0ÌÀ&%F?ÿúç—kZ^¿Äbœ3r±)ø +1~: ªÈÑQ|½_ã­«–\´ôð»ÔÑ‘ž¬’Ãzø݈C7ˆTHÏOµ Á + +uóé?Ѫ–\ò˜.¨ Ø 2`Ä˳“!´ÄɈ¯“Q=>f0ј~6bdgXæ½ :]/ *ÕÜ £äë¥BtÌ5ÂØ@ˆ÷ü&Ââ7ßZíšçõvS}ƒLò¼ôäx®ÀÐ'Æ`wãá\#0À)`:®çëúÄUñ䤄ܮµ ×fºsÑS”DAóÙê‹·‡Õuú‚YL”öalÉõÅiŒ}]u„éJf·ñ|,ñíÐvóêtæ÷è²E£×íÿvÿ4vjû’µò-Ϲ{5é-×.§à´¿ìˆ§$ª®Í3Ì(¹A ù±ÝÂN¥þlk#Ýìײ4§]cér P(D³°Ý6¿xÆœˆoˆ®ë‘ƒ3!!†®«½†#ö”mSX%ËìoÄ0¡Š¿?$_ë#è‰Q‚>¼ÍíÞB%H ¨ϸŠàœ…ß^T›ñ‰­^¶õàãiì°ºÙFücñä…„‘Õí%„„cü°}á¾j]§³OéùÝ¿?Ç´ëÁ+\ƒö:FP°®Ø¤Š+ïAÛ¥¾Ü1y3e³pôǧ@uPÜ­BM?öC³è>ˆÙKψž)>² XÊš+ÕöÈ?Ž2o"ßõ…Ñ ô‚ @t¥:Ü~z[¬×Ô`¯ä”šÖ×´Å;ö \ b–€vÔÇ›™Q:Š½3s# ¤þœæÙ¥a13ÁSZUafŒd—ÚùªÁÀ\îÒMzó•¤B18ñU2Û¥¤__Ëõ=—Ç ‰þÖ.ÙçÜ»PV%ú˜F.íƒHø—+­e Üzv®Ù…Éçp¹­4]âUPÐÕý†ž_ý‹íJXåfyÈ~„çVPb]T¯´b+ïX©P¥ffn#\[NãÌçÉ÷_üRøÆð°It#’´yG\:AV¹j³hš(0]Ô¯¹ó=©HX¶tcwBã¬Æw\N¼¸¾ ×(ÈmѼ9^àm×°é]2Ï·Y–Ì«¸s*¹®}‘ÿ¹~ð/ɸ5»ɼ—«jÑõn½GÆcÛGüñîF#c.Ü*5y³é<]m•ˆÚçéÔÔ5Í7¥ªñ>ì"Wãå¹×ÈoÚ&±5_ÉMk¼¾·Ú^ׇ†"Ø\ +v ±±nÜJ5f0›kѦ}6Ö­½4_Ùv‘µ±^ªlc•¼5ö+ê&7—ÞÝÆc¬Ó÷îcQßäêæê?îæq§Š77“)¥77›U{oߪî$üæþ¶)Ž}pÓœ{æ­ôàÜ`7åÂmKÞÔ÷­ýI +D›0û,$mšî[ùéV~+^mó³Ü5Ué·ÚØ­¦ý¬¨m’ø[ nUÕ_ xwÒü[ñoø߈‹1ÀZq¼5Øê•›'ÁVêœv[ôÖa+¯n^ +{ÙvõcØGÜù:ì£Ö¼”w ÚRˆ¾uªØêØÛi¶âøv%ÛˆÛ_´ÚîÌZ·ßïîZöç)-]ƒë!/m†}z¬-Šûi¶u8Öɺ¶F¶é¾6Vn_šµ-³½ykCgy×~Ðý»¿t“®•cí>íkÍÒ»º_²ÖÎ׶ômM³mÕÜznwKîÖ±Ûì­Ù·­õ³Ex¿U¬ÅmǙȱCímË»}mïz®ÛâÞ/]wÔ­Ûú¼ _­ÙuÏÞš¹Ûv¿õ‚oƒ…­•¼…[z'[ïú6¤Ù:ß[D´5ÍGµ6Úoî­M¿m[‡Fy.àÖÎbC\1æŠE¸µ³Ø  { »¢ ¶yQÜEØc Ï7ðÆâ¯ØûTa…Žì)Ç›ìIÊðrS·md{&ÛV´=ÖmK»Ûָͱm{ÝfçÜo'÷¶¹o/É l/Úöco_Ø-`ÙÞûwc%0byùomÑôb¡Ü)ÿÿ˜AÄŸ^¨›ißê¶Ý¢‹¶„ÕÜJV¿B!-Õ)tLZš4ଡ଼ٳH$»:*»üŽbw„$E{j¿QìJç®ö,™ úÿöÑ#—W­hIr­¨Þu«ƒS딦ô ×%M§ot­ùŒªV¶Â4ïἪc“ìHÀK¯ý<÷k>És“`I-Ë–nÚkwO㶧Ö$*·]@v¬š,>¢Á|û3ÒØë’œm÷€~‚¶a›ñ¼¹i”u“o†™ÆþË=§*¥L{¹ybR "0ËZ„ovF¿˜émÍOïèsGtkì6Õnô¹Õ%<¹ CDlN[ÄÀÐp$¼šRÞ|hÑ&Þ¿xÕ7ÞÀNò~#V½åí^®’Íû“¸“~ÞŸè¢ ½O…U„zŸQwbÖûÄ\E±÷ɽ +kïïÆ@÷öŠí§Y_ÒýRÖwýþ'b»#ÛÚ²ÞÔmeº}6saÛí¶&n³c[[ogÙ¶Fo³u_Ý×ÿÞæ0kZBYîÝý¥€ÛC•¸ikß{#¹ø²²Øb‘o¤– NWaé&®›7œ8䎣Z=ƒ/8M’š=8‹2NÀš±÷—$€¦ŒmÛØÛî.I +›9GÀ1ÍäV—¤ +9?Þ˜#U°4,Â!7ÜÍ‘êé¿ <©‡ßæ’›”õ~{/o\’JóF^ÊÖï\’ +S„Îå‰òžKR™ßTП¬7.IDÇlötòˆ»KR'XQ¥Ž‘¯oÚ\’ˆÃ-™:¹5 jåf“„Ä™Mbû&éÆ& mn°A©Úr0;7£$`T„“%”´vÇ$’Ê–!Q~¹±NEOÙØî¾úÒú¦Í;‰ó[8ò»»w’€õRìæ—ï¤õíùì'ÿeÞIRKŽ‡«%#Ø)|Vù=ÖI®Ù µö;v£Ÿí3÷N?N„@l„wœ“¸¼ÃÁX–V«€üÇ}ß'öi@(ûžòsxÏ:IÂ},ð. éÆê‡þ@à.¶°Ã¿µåèÞ:éGû@CØÖj‰ùQïûé'Éw-Ëg~öï,wúö×o?ýôÓŸùåúͯ¾ûþ Æúÿô·ß›Lÿ#ëüý×Û.ŽSbê¶l5b•D‘ rÄÞ4úŽiY@„¤ÀÃV‹h‹ÌÇ*…æÒýí`XSåšÐH=5‚"nÇ€bb¢" vÏB‰bë‘/_&ë ¢+q°EË=–Ý•&²¾ž}3 ¼/匵ñ´ëînÍ-”V4pvÈbv–à°ôˆN,Ò”µlb²iaV²°HqÛM%úñïu ygÛÚYq´×¢·ÞÅ)½]‚kçbŒb—Ùe\QáÙC.ü0ÝoT?¦è(Ú }¬Jv#ä~šPlìÖ?›7ˆ!6ïVûÈc1·‰„EZl0Øä, ›(e ÙÁ°%]”­`FrÈ—‡Ki'@õ ¶¤… f³¶uÜË'‘œÁä¡ÆAÀUEºòqÛ½¢[a$¨¶×FÙCÁ#BI´RŽ~ 2Doœ…òí‰/ +aš¶éàÂÏŸÍ©I$U™ðÏŸÁ¥¶D8Òš˜ +ÂhKQ|ÖÌ?¬Mþf»ã*üɲtòëð$QðBš¥9cÈâ™Ê„…ýU!Ö&< FJiT -pÎ +áÊvl-Û»uAwœP³&Ò# #D¨À¥#¡†{ú` j£RÖrª`ÔC²Ãnóü {(€ÔlgÈu5À'¬Û?£pÒAÕŠ `#àx/MkÛNý{høø*k‹#¼T”­Àø)èƒ#êÀëÁÿü¿ì½ë®/ÙuÝ÷ýûKË@׺VÕG±áÄJ:Ž Š… ”V[bà&Š¢ ·÷ü¹Ví½×\›ç¸Ó´hG”xéÚõ¯ªu›÷9ÐTûšö°Sj3E„Õü`2çö%]{òÄ‚¢lˆ:âÏ×ÌøµSh§ý2ƒ|[”OætÑ'R qZ¹F%·ýgÁ'özlûF™Ñ>n³M«ù à[g +éÆóåWÙ:À„ü6$7è­p7Ø{Ô-@H²”ÁœC¶ÂüØ~žÀè [ˆ|E3BŒ¬"iß'Îé`c(6ñ^ h…è¡(Ç-v+ÅÈZ5p]áÓ>}5§ch«Ns(ÇÁ¤]‚º Ji[`n¶¬&¡Ú)8€ÉQJ”úSåÙB­m%›v*a¿’S}̘Û9¯ ŒÖL{¡ŠÂyÎ,p4@!MË]Cñ’‡±£ÚI˜iÁÁ>EâÄj‹ˆ‰{¹´ñ¡j·csU0?ìG=I–AG#©f>Zwè-ÚÜÎ6Ù¶4µºÜgwfs`æ‘î?a¿[µ«`ßÞDqFñs„N´ ¨¾§¨1sIðÌF7ùÃ`©âì°ëÄÐÑ鿘4Ù·’Öo·u‰®¬RS)è 6‰[ÂvbFê(9Ú °b©ž$fmٺƊÝqƒ}åÙB\•u½HDÙé·»è¯á@šR3ÁùÒÁ °÷'Wýf¨F~2g oÄ]6L6¥x§‚Lþxñ§ÛÙ¶ù7]œ%)h^c‰·Ùsúà\ƒ˜Ñ–Gƒœ}¸»|"} 7´øwí-S×:05aQœ»§\¾df:š?Ëž¦£l¢MäKÅ;(|¶ígÆ1ÒH››ˆÖ™¿OËä¼ØéTòlþjc)Ô€šûÜYµËà +‰ÎÆò¬½K‰=:¢nÚñlŠØì œª¯"½’9¤gÝÜ¡ZiNgÒÂ]v\¥YÅ&Ä5êSYÜD•ë°‘û©Ñ99;ØW’`²Mm[ˆÿ±è¶÷µó 1£Êª¨1Žv “X~P¹c`_ ŸÐåVTÔŠúæ›DêU­úv­Oœ0Œ:ÍÆ…&óS8Š·ø(”-b’¯&p©¶µ›=prÇâ¦mí Ë!P´íaà8Áª4C»q4é/åŠÖšMYB„bw50¢0Ç %Ú›ˆÜ› +& Õ[oºià¤dËL×.t«ûÛô8svZ*Z&û(m65ÊÊ<@…BRÎÞf‡H<$±j†ŒQwhÍ©ßÏ£m;•iÖz逽 ×Êlʈ×YUê}eÕqÛŠÒ—OHÄ3uÐ9ô«™ÎÁu/2©l_ÚPÌìîsmObO ä{^PUõñùñhú¬NŠ«0Û ÏLW² ˆÞ…Ûeƒ%gGx–“ŸÜÑ&è*\éüL´²»» VXÉ‚Nï×!"8pØ>²Ûè‡Ån3§)ËŠQ¤K”[¦Gòi*Œ›úœ06Þ*%¬Ò"µË¼šú%Ì~ö@—Íù¡®Ø‹æ<ô&º-ûêÐ$ûO±;.ce„Ê]†âƒ¤»ŒŠn°ÞÅ^ª°*ÝC¦@‹ÐJû¥ö  %Ý•»uy/“«âe^Ý€MO¿–Y¹U⚀½É…Æ!ëU}(•Ql#›ƒª­(«=ÛIÆÂøí3\«ÆöÐŽnö0I˜=2ÖÍ1#i{°‘ëb&²×›éPÏÎç[d©£¬ºy Q?¾—ƒ’.\M’Bò¥ÑîF¿ªÝ3}©éG'¡ù êAö±9Ù®˜`%Âô4«Ç!”‚.SûXj(M +à¦F­K™£ùr`‡Í)”ÈC°WÕ>C„Ðe™.`õl¹£¸cëxIFšY¤0u¨dЩi¥áU{ £ù:ýùø¯î<° +™wx¾„Ì\½9’6ø…x%=D¼Òì¨Sñy–U-M©ì+‚"|ÓM ÍyÅÅ0Ý2De žÏEQ´ŒXªh0="Rí¸ÿ*X½.B€H5ÓüfàaW›©¡ñ„;®êݣг£÷#ÞµÎØû0iJ™ 1Ë°ò×–i¦K®u®or[ÞüÛ“LVdAI] QZAø”pÇnHñ®uj ä%eŸ‚‹\âôÂB¬¤M# PÌv™ÖäIXn¢!4Ùµ†x³?hþÍ¢µ=oº¶w»«Q¢çS)’6›³Á€ª;°z7»šÞháÏçþLèEGÓ‹LoΫ— q5š ÚµžN³Æ”š#¤ØÕöŒ_^œ¡NGj”¤‹ü9Ê㤸itŽÚˆL¬àíÅV«p™·EÙS +Ý`Mœ6°rFÚDGÔKªÖ½(&2$c½±“ã®jU*Ð.)Mí*€¤LR¼Y +T”m5ˆÆËVd¼'ÊuÕDÄ(ÉE_ä•é¥ ÚŒo<0CÌO?¨ŸÝjEûçt[•jÄÁ&Ív0MŠ-*æ{š9Æìqµ!ïô{ÃV³½wÙ„ê~[ͳ÷œúd«XM ¾‘Ä@Ýïؘ,7ÍM(˜d:£éCè“lwPP¢ùDÉËŸ“`÷ÖÏÉ"„<G)ÑŠk8ŽŠ^0Õh ²:¤ÃÙA ”½­EIb­%FΪ +O|±LÛtÖmÖŒÖ-±9µ.‚ og5Ž}ÇP4ùÆæFv£YÝ!Ï.b½ÑXÿ­¾¸ +|„Ø9¶V4ú9¥`.zÆÍiˆŽƒúôQÓпñ:8`x/8©n|¤jèt¸ý©ÍÑOt@ݺQ 2.$  ®ùpÂÑL NL;§è¿Å;v~`¼kõ'‰ÒR]CBXŠ#ø¤H|O¸“g7mÚ¨èÓ瑈1U’ûZ)¡ïáZŽpl¥Æ” +!Š( +6ÑÜJ›'tïAzÁ nÉG¸t3ÉÇM<ẼAªÈŠÌ½¡Éi`h™&b·_!„RÙVA[Œ‚»Itv7‰®¶¦“4gÈž¤~†”'ÝçéZ¿­Ìp>ê]ÝÞç‚Ñ6@BÑ·À €Q{2 <”£ÃC ͺ! A.N^}§ä ´]*#>ÅÓ èqS¥LN7}b…¹‡6b›aò©Ð_³7Ê:êèØJ÷¼I‰]§[›”îšHòÏ>Åê þ=×åu¥zNK—ܲVÈ_g‹$`çÓä‘MÍý‡ ü´#Om ‡¯@œ* QJûL/¾Â36.,¡@°ÛTØw›õ‘‡WÀ‰7£õ&µCg%CB +æÄcwò}tÿK,¹”¨—›$öœœýˆ7N8€¨Ã\–±ÙÜØLIw×qG²‹ +„@‰ßrÞéu˜ö¤¹%ŽéºEöòÝvJîÃýI³;]S‡©5ݬ:^@¬‚§q…~vÛ«¶Bq•)[DÒcàf‘¬»…‘`ÍT¤±YÖMG¤«ã8¼Œ-lÜ +¿:`Š7¹øBÖ}_ÕòÆ>¸Tb÷Ý” +oOO%dEù#(‡ûm=€Wu0 ¢mα€Ä:wi™žsü^!Ô‚šp½LAbæ9piŽ‚MOÄO¥ÐÆq©²a>v•^•ÊÛ†°6_¥'/è}#4+Äì ›°ÁÙ÷b³EÃøü„-«Ü®ha[}û«éÌ;HÿJù6Yú‹|ÂtÜVÍQ†A¶¯JǺâDÅ€ÕåU™±è}–VÏð¬4Ïgs­Éi¤QðNVPr¨¤4wŽ¨RÐÂUí{‡Fš¦H ʼRœpñò챫=`žš(XU`õfø‘Àš‘¡Õá&ê·#¦b#aw_À0d[M!³«db97ú ¡­&³ ï¯øìeQ¹ Æf1‘Ìa"Žœ¢•Ý¨©kZp«!È™´ -œÉ$Wv5&mä¶ñ©ñX®ÒŠQŠ¿N´Ú(7JݦÕq:é69ÝÔX­ázÐbAq6%mcS›,RÈãP€kTíÓI¨÷ ì°ØVóž]IÆÁ›T*¹¸ •Æ˜ ÄA“ ãM‹»Q…kÆ15{¨ÐzqY*PŸMˆ£öqŒ)¸>7=”ŒÉ´ÕôGVJ3o‚ž™ÇN| ^XÕÅÌ +›£7îønx>ï¼ÂøœáP²´ÔÓåa +îzó‡®ÒŸËû@Þ»¡•À‹‚ë/Áéw¬¾³í~ÁÔªÇ"×ö¬ú;a(uZ+Aðã«pâ±µU™6wH3\pp +î}<€ÓJ<§µ| !‰Ê¹h´˜>Ë-6V’¤¸{Óy[$Hg‚ØШý‚,Üab +Ò¢+/†j*x|Í9%ãMkȧRØîŸQ±6ߨpÛ6ÔGlw¨³ˆ§h­Ô'1T||p¢ßŽÁjO‚p 5,;JaVIªi‚°µ8[Q*y‚ÈE@S؇¢7"T ýª˜‚Ž +ÕP[]ªª‚Î •YA݆¯­Ú…bAý‡b³Õ‚5k[C$Ô¾ƒf–Í[(Tݽ±¤BÍ^°ÃBÝ_°åBýàÖ& uˆÁ¶œ%ŒÁ, Á¼ýfWIÌäP‘ÌíßêC—ÊÎ`¶Ï¢Ðiè‡BÒ­Ÿ +Rƒ¿ŠZƒÏjc·¾O(­]]¨P¼°xÇΛ‹w­^á,4åZ¥¼õKß:ç6JÁ;ÿzs×➇ÚïàÙ/äÛø@¨COYkÙC¬"ÖÄoB^OÂ%¡?„\BAÿ6tB(ö¬a¤§5a… + k0+4G„pXh²ØFÓB³FˆÊ…†Ù‹#»aè; Æл²†(C Ì6ÒZiBÄ4táÌPëìÝÙÅg×ÆŸÛBk,8tmCÊ¡I)D¦×>§ÜíRÛ yh» +Áöа5ãô¡ßkæíb!YZÎBÂ!4®mñ9#ï:æBÊ$tÞmS/¡/dnbà’󉽄»ÔQŸÅv£gÌ–”ÆŠ=ÍX‹ß’ÅÂþÒÂ…Yt¬b2¬ã}bÝ‚A#ó~Í©™ùõ Îo’Ã!-w’!!·aŸCËå6»gÂü +Û€ô£¦˜"”ÑI„_^ÓŒz3™·àéQ¯°d+}ŠÀ{¨‡…è'&=ûåÔZfWÓ"ú¤LeÞܧ°m¨Úܘq=yƒ2ì 4·ÉÚšŒÌ8T +Vm³¿ñ9k9~Ëš‰#YÚßm'dMŒÇy]ìê¡ ë³&ê×^Sýq›ìJÂn[+† Õ aß¿-~Çf-ˆ'o­¾ø|70Y):l¡fá™ØëŠûB=Ä8uRºöl0ö…IÍLxû8q/q¢˜Fe¤õ‘mêºÁUmôA‡ÿó ûj¶ãEe9yϯ®SœÛâ+‡‚¦¶e·k_o†qÂV«Š G|ü•œ·á(„†ÛæëÖ;|·®ƒ ωt]S½0Ÿè×åù›¯F]¿ù8uÙÅm.Œã†!;áæ.S@õÞµl©`Â,)îÍ]?UXí ~.^`¼G³(ƒxÞþ°|øw3õî®®7;±¶Nk‹O¸»î€¯…;šž/3ïKý-ëGÚ¤ÛvD#ñLO,²å6CÍS|ñ9ë$ÆoùÜb|÷~ñrÝ$Ò,EõànP¶î“I8†¹‰œC}Õë^#ÍÒÈ\ŸÄÅÛ{Ö6³B.þ@A w™DÿT=ÌyàÆócâêÓyª À>+P1ãg6~Á8ÜqoDBÿüUœºEmg}=U˶£Ï€(ØÛ?´Ûh¶d@$ÆîŽ[?ݦÍÏ—ýõúæõã{¿Û~PŸ0÷ÍH®æ­õ—°÷Íî‘K…}md€Z&@ä(àæ”öt‚½;‰á)aRÃw|0íóØiÁÎd·ô£mÌ“†×ï±”dÇïRŒâÄ 5AÝ䬊™ð"â ‡¢Ù¯ÎÄ?Ó¹pEZ¨§*å DÒ¶h…¼%é1IbÉ„W;.‹|zt+Et…1ÿüT4ÒEj8wV§=]uZ>µì…gj :2qƪ¨Âq(žfþS¾t‡`î1‡zC£|O³æ€“ÝinÏè)Ía¬ƒ¥o§ÄðG‹¦CuÍxÞÒ°ä9ÈlÇP¢ +px9%Ùò)†:s½œ¼ÃI‹±Zœ…‚ld"0ü®ªÅ'®ÐT‡{\¾ùtשIWš$a"4s—§¥‰ò&JNŽ¬Ø aOÜÝX’JÉÍ‹Êl`?¼&Û( p—º™MR•W%¡Dj#Kôky +«¨IX_"¬|=h€D€ÈHéuìô$3ÝBb3kTÀÿO¤i?ûÜÕTØ“‰ÞqñÛÿÚ¬;Ÿp‚ºÙØ–Tƒn¶O˵pv^™»° Û5À«šjZ&ÖL½OWþ¹zãÑæ8‡ñ0=V@õ<‡ dGPØc;¡ïZá3¼ÝV! •"=£, ÈëRøœ¶‘'à)ídÝQ7E³^îñÙç„o!Jr¡éÆ äxålã#Íô “Ї²N„,š(–!‰æÔâ¹Y€{–Q$¯°stl/q#!¨|€L=bØO¢ãÆG% QÇ8æ I#ÑqG Ema'IóçA&#ǃ$X&s^+ÂÁR–í´ívÛÄ–ÐùîHöË;çATKV…ªˆÎ§g”ãO»‡útÒA«èK…è$]”'Çâ‡Ò}jìý¸ë«†}'Ä6ÏYaü”Užn¤ñ~äëÌM=°ø¨F–õ‹šhÝQ¡ívPTŒëNŒÊuÙÌQEo=þ áÇ +¦ÁzãPwG:Z*«Døkç³VÒ韛ã€^áËöJ7OæIʉ”Š¨ LGü ÇÁïʤ\-qmÄ&M;+N*—å Ü…ó%ˆ<çÌÒ&ÚJG)îäQÅgwÉCs…4ÕZšs-:òL§c^(Ç· wrTnX¼Wuç{ûõqÀy‹Hˆ—zñ*”.ûn`gp¾É³ß(i¸NÚ¼ãHMìÃß ¿õ³>aj%R üx†gØŽ(9â»é¹ŠŠ£¥ÕSÈz&•:a+Å/&#ù¼|5:N̈ÿãÜÂä„s Y³zÕÂœÌgÁ=®®8M~™¤ðñd +½¼§¨Žð½„n˜? –ª:›½ÙO8† ”äUHtSsb©·w:{RCÏ}Œ&WRìã¡à%ê´_‡ °ùc+5‰õT®ÔK¨{hé’ª)”¸H®PE\ФàBôx**¼pÅ,ÅÑi»I ¢ ÖÒ¬„Èêaj]»A¢®¤*³sTE‚Úâ >¬Zf¨÷@Y5²…ô­€ÄH嵕,òí5E6utÚn¸Tq¤ù1=òLúE‘“gç3=â(I±q›’<jâŽäEOtò7}žÇÙ?lYDLÆ€ÙlZEž‰ÀQá4?LÉg.q¼á‘·uFàRJ¶¶Ÿ¶'ðnº‹ÒÒ‡µ(»ºcnþgße7ÓwII¤iÈ×í ±”L‘I¿¶MíðMšŽgòž4¦°CØ+ ÿ/9)êŒÜ·Íw*ßzåJ]íäýSŒìk˜1?A“°ì SY) +“'åk_‚ýEë£MñîüåûúŸ—¥‡ ¨*öQ#Õ©˜É_ +VO"Pnewª¶Ìb£ß„h =ÉŸô¤f"º¶2H­HH"h“ÌQÄcMÐ;*mฺ_Šw¤iº¾rQÏd6IÕäŠÞ´ÁðÓ‹ú@ÌF¾X¢…ùxÊdßÙÈŽ+—Ô{ŽÊ¡ˆ´¹oã?8*#!–o5™Z£":VÁµóÂ/:¨¨˜ð<†tàü”ÕÊó¯ŽÄ$]äK¿½·óÚ::7¼‡(=îû,Oœ‡Âþ@ÉPyóó×€6àb^_˜ÄWÈ£èûè{áøÙÓs3lºVIÙ¶£êr3s¦< ¾S ùY?X´¡P³@ú¹[GT“€ƒh÷ëm)‰ì{¿ƒ(*¦f£e|ž²Ù‰üŒ6 s5¬ÇÝÜãĤX;kß<çtÐèCç,¬õ[àØæv²Dÿ[“W¾*$ŸÚ{?#¸C…¼¤’SA¤eRÍ &óAC¯qiÌòAÐô¡Ã +ãP.AÝwML¿Iά6»ƒZ¼ºÙlTh*žÕ¨ÙL¯›íÝ^í3qbŸOÁxÜæ½ïÓrøß‚ê¡üášL$á=?_e|óz¼÷#X¥Dœ‰UÒÄÙ\%ÖvU‚ä ‹„fØQøÆmeøº[7z`Ùñª‘™Dú=òù8±*Œ ŽWòbNá}ûÀôCC!ö+“}°_Ù”7è½#eí"Ì7Bµ}â©qø^fÐìxBÞU +={õi¾íŠx<:¶/ ·øº¨ø‡¯‹ÕÐ>¤ÞW\ì³Èp×D­ñWº®Öʾ¨TMˆ™‰Þ9ÀÄJê¼¢Ð÷V—¨æ0ƒýq½ÀinŸ × :•Åèd|è²w¿9í®Þ}”l·Á]^(šW\¢¶E/¬ŸZZ*Ä}f–¶¸Ïˆ}ʈL„öÉsÅôÐ)e›<Æfœï5릟"‹C$ÒUUO¡ñÚòÁ>œì1к°È*ͼ>VuV)Ñaþ­4>Ý™3Ö&ÀlN±ßQól±WÈÔš€†„M+ÒÁ®-´wËŽC$îL!š˜¶Á‡Jy÷àò¤ O`ǨñVè“ZrošZeó’0ç³>…P–JI…yRNUUp)‹5Üй]æÚy›6íEèPÈL 䆃}‘:(F̈Ÿ‹‹Á‡Íaù"Oí÷ÀØsQ^T .~e˜™Ç`Ë0C[ mº W·›aqÒfA ++gš|OÙ#|@ï¨x¶i¦Ááǽïkó«šÐHœ—ßMØ£JÖÆŒòã‡neƒæô¢:qKØóÓ ï¤*S{JñÆë_{~ +}I¼,{mEvUÝ)7•¦9m´Õ}{?òMiÜ]6ÚÊl˜*ºmœõò²">†\=Ll¤ãÚ(«³¨E ‹%Ãñµ¡{òI`d²™öZK5¦$¨´'m´ÖU„cF:Mw}£µÌ8¥ ë‰òÌ(-ÙÁ¢¿ÁgÛh­‹¤ê,M°u£¶ìc«†„-wõÔÏ9’¼£~ž;µ…kͦű'‚Ú" ‹°Sh¢¿} ¶î‘–¼ošå®Úº/O×ÜH˜/ƒÚRñ5Õ7ÌFy¯¶” §Ô…¹=(ê-j³MùEu¥ÚbZ8¨-¦ƒ`«®*Ä×à'A(–Ëý¨+¢k„pmËßv>RTWŸ?:?Zw½†l;>!¤Eu}æzOö‘ ­ð‹y=ù#­õîwYø”´»ÁG#Û Påõ«¾6m@ápvRëé"ý 4ÖÖF[ý^†õϪ¨~÷ÆùïYO™é_Zlô§˜¨ÖJŠ^W©) oó@9ñì™×áˆzÚ5:ûÛ`ˆ¤Y“6®¬Ê• +"±šåtG'ƒK‚Ö¬]‡ï…˜ èäc$Î(œ5;‹íBƒ[]šø5ñÆÉŸWe0ÈÍÐÿܪ瑉£ƒÚö®zT|q{ªÝAB+94‘Ý¡ÖÉ'" t™˜œ¯L’€³—)×4$(C;ËjAuðÈó$£UÈUŸÒùüL•MTøQ'4WYPæ*b'ÅrÐáÓÄžbØ.Ý@†=Ó‡‘ kJ•uÂH—ÃÑqi®;]>fú)93Þáΰ­‚ýpJÝu½Øæ­òâB&Ÿyñ¥>D;mkÔÕÃnkÔLqÍÀÒ¢?hÛù¡Et­ÁT‰Øz³©Âë!ý¢wœpJTIÇÑO#Ø%xk?¡» +4x°`¦FüĹ/§»a¥W5Ê–¼ráMÅ .….*J–¢¤¿ö†ëaüa¦Ë +x5dïâ½ÐçÆ‚OSéDÿùyÎ]{܇͈¦ÈÖ9SU‘gz’¹9M”|ÜI¯¹¦Ú,hS±"®BP›=pIßd5ÓB“ÈËgÚO”<ûúIí7ZݪŽ ÊžÙl›Ô†AÕd°Ògá‰fÛS_{æ§ÙΊl>©èÝ°H}MNâzšD¬Ùø)Ñ ”}³N]Õ5˜øì·ôá+«ôu2—ŠoÀ*¹ ×ý¢×5zŸlÃÓ_ª`…ýOS&t€Þ»ë¥Ð輎À¯•C; *@\ò.Ér#lHáÍ +Kå)íUCãýT£;±›r#‚ÒI6¦J•Úê6ÞŸ ö¹ýñ Í~ªLÚsÒT¸Ð:w.jzVáÇí°â&@OQ¦YLÞ* •‚ÊήžÕ“ç4¢fä£])ÁèÂnU…2~RœnÝŽï =â>KĶn‚Ú%hçþ&<-œk{ŽkÊ^ë`èú<"Ñþ) hÙ§ÜbßÊIÈ ·{¬â U•Ú¨sšž‹©Øz€éO‚,MUwPŸpÐ’õÁ‰øm|Ùºç2L é.Sÿ…žc“yµ© ª¨³ÀÄkÁ΀Óõå³3< UE˜ Í –½)tÂæfpçLwB¼ ÿ‰ÄªÉs•â gâséÂs6±%wG·íX5ÇÛÅH¼=Íö¥ØÌ«w]ŠÅ ûr…·êárQÁŸj× ž¸Å`QÜQìƒï,kM„Í8åPb K Ýyb‚¹P'0tTÛX–½{P†£O«Þ Ö± +mÝHðÙ¿<0œ…wï±ä¼œ`k/8¸;þ|Äi…ïÔ½ÃI‰ó˜• ²’Ù’/ž‰4ëƒzeÁ=‰Á0‰^4¡Ùœ…š–—ž^Œ· ë©zÙÂô,žü$7•ûÒ‡Oºß)’ønÄgµ¾  ½–Á“R’X#zž(d4.98¶>x;ÅeeÈð¢*T6; +DÓój&eƒcg&™3ÞÉÚ U3‹VÐ6š•“¾Y¥Sfª4˜Y€à((’!"BL˜®è4F¢†"ƒŽÔed†þ¼ +&ˆLa•A'XïL-åé=´$ŸÅ©òÙCñÍ›ã d‹­éÞ3À°3¥–nÖ؜πîEXÓÙê¨?FßDÜ#]{Ï€wʨr‹Å3Ð* ¾8¹Sò¶u ç¡qR#¬ÓèÀD›hZ-ôß5ºz/-Ì…^1½ºX–âi^ÝȔ쌘©Lþ-G/‚[Š®L8‚wuî½Æ¦VˆbûGøÒîP"}Ò ÀN™ØâðK-pa÷\{o^¨F°¸Pÿ˜zôrá=[tšò¢7`ó¤>Cfø °õ25Ü9“AmÍÝÂoRcë¯ikÖö¦— ôÀ+YóÖ|-0€œr†¹Ï[#‡ +2¤ •5o­vÅÊ\u*j7ykiØ3µÏ[3& ÿ(THÂ|yk§m‚(í,ô ƼuÁ·9$ÀÒóKÞZÏáèð€ÔB›)ñqƒ¿I`o%Ýÿ‡öçLù˜ÁþÚSØZØY#ú½$`¿ ÿª”™\µ)÷6m³ú5›T/êŠ þ_ý& À™cà2è\ý(ýõH`#ÑÌ ï?âU'ÒÎî/ +•Ç.ýÓŒêÄ>Py0h´gÿÿ…ùþcÓÒ¡ûDcŽ½‰JDÈ>vo¶²zñÍÖ ‚½ÅØ}V†ò¦§Ó!v?p2Ô‰8¹wCì^Ϲ<ããGäû]ð^ßB³¡}KWÈh Þ'Úl²óMûÐ}úˆ–±†]n˜nö ¢á¾‰Ó‡éü0PŸÀf³sFoµû@=ue‚袾b ÞËÆ$°`ÊÊ +ÔSø¦ðTÇ—€Â!PÏÃ¥”{xéŽz}$ñª% «ºFìS=Œb„=uQâ9îÙp>!ûTºCâѲž‰¯!{ ª:Ì\„<»gÈ~óó%dŸÄ#&ÂéóÕ²ß^…=sEç˶Q!{ûæO7¥Ñž[ Ù›ƒe楄:â¶Ý'Ö@Ÿû‚Ûc÷„ ú%ŠÐ$/dá'l Ñ^B÷&D„KgÆvrŒÜ'ôRh_[cä>auâïv!<¦}ä>ámÒ…Ù³4LŒÜSæ©ägÇ7QwÄ¿þ)†WÌB°y„ó~›OÈ lW¸ çe‘s×ÞÙÁ–:_ÌËs{º:‘Ë`¢‡ò›P[ Äìa¾Ú'JV§J[ĆÙÊUrÍöý€$®jI þ¨A›ueŸ€Í¶#˜·P©Í!mMϵ{eœ:é`cÛ#íSlc˜Mvó2»üxÚïŸCn2R[ì‚—%±$˜ð¥˜ò ˜¬Í‰ªÌŠnA;œqN©%}¹møÞ”¶£Ž ß.ñ»M’º—ù3/¶+fuÆ–¨ŽoLïÙÅ 1Žt©ÓäCp0Çã‡ã|uè~lO¨ñ†“jw”7§Ûž´â‘Dï Baw«ª‘’í5Bõ·Œ¢+3LÀŠ»€n6 icùTpd€²bŠ‚‹^[Dë9D轄K¨F:,×D0gér&s€Yf'&$ÇŹLóqW£¥¹Ñ0,B¦2jªTlŸ@>%ÐLi‡3T *,XÛ ¶"·8…5³| +í\ÐïÒǘÁ¥B]Tп!zpƒº¹N¦¦Ø9êy¯Âù;*ìñxÛL©æâôW²èÑþfø»úLRøhYag;–œâ“î„EŒ?U £<†¶jf‰S…CcúÜ|M»Ñ‡î/Ûx¸ i„‹ø>‡d¥í"}‘‹ÈÎìS¨ÜÎ# A ;ÊK”Ô(èi—à€å|Ž79J«âÞ¿o´‹æÖ*cSz¨d LOÆý#ÿ¯;\¥CÊrÁ&Tòöã%alƒ8h˜qìÌt̨GÛBŽ`ó +˜ƒ.Ër8õ tß’¾¹"á–¡=ÙlXXðA.SÅ R´´åšôéÙÃ’’äS\2¸n6œ”îéªÍzž½ô"¨œ-{xà ì즩>…ø?X`À'ó” ö¡AÕ¬„ +¿‹˜ð’ØJÞŠ$ô¤–PÂÖ¿œÉF›8“9·m€•ë´´¦Ã ‘­ï½½µš^i2©·˜ušÉå_B'‚»`ÔI”¤Ë»MIÌÌ‚­`UDؼ<"‡çXV‡Ãñ˜ 4Õ¥ýs<`3ê8rñ} OÅo'3VÛÖ Ë%š½ÍCààbôFL«2ÛÔ†& {&n÷}ºÜ–« &˜ Þ"œªÆf8¼ùïlënVàðÍF @!^Þ¤;lOš¢àj(zÒ)‚ì>¼êà€G„U ¸^gÉoúÅò©ø&Š6ïšÀÎCðQ6õ@·_šTÈ]˜Ts´“,´!:¡œ™mb”Ç7í%³«žãq”NÀ¿êC“öaë!8û÷)‰ñ õHvÙV(g,úøã:*Iž}ìÒSã”c%ˆ=³NLc¢_#« ×¹o~Þ„8¥(2 L›7‡;¶î +㦔31Ì}™|‚»ŠÁìf<4‡•«À^‘¾$éÞófõí#)a'R¾å›§åÑ}@¤š6›°Žè)Õj‡ ¤)d¾ƒl²íhYh¼ i°9X$QQ¤¥ ­gæc›ÕíÁîði’‡Œü H,jIVÉBã^M¦D¢ø$ngjäHQÀ)JDQñSÞ¬BÒëÉÊ¡›AØÈZ³SÜž]5‰KP$pÈ EaOò €LÚÖ)“Ù+ “—À¢D‹®ÊÇö„ ÖnÁˆ]WP_|#¸ræ²QQ¿W‚|S’D˜[…WA‡fx4¨ƒˆ¤^ÐÀR¨æ©Ët«Ï³ U)´{ß» _³Œ‹Â©ÁŶÈ&¦mØTíëŽh¢P$HC!mØEð«¥CèG-¢öSüðh-1hZ´B;[«‹çÜt gŠÖè*]­7!¬+4ØHòßÑð#xho€Ò±*Šöj5–ìô·ÔWAjÎ2œnÛKgv%Ø­Dâ’â¶Ãä,æ¯o¶:‚†­ +S%šÑù(*؆0Æ>Vøoõ¦à>$…Ó0Ý‹¨¼!Lcߘú>ÂsŒ°ô½ËÀ™rR8„';}u=À”LÀÓ)^¿¸/¬]s ‹ßy?T ¨¬2©,§nœ'd˜2¡po`À¿+þa綅»¦×G‰Šƒç sWpÁ-8#&÷Þï¬À•pÚ2‘¾´q_m‰eœØ©+TX|ÉW:Ü\r`9Ê Ú¾¯àÖ Ùú2ÊU’Â3›¨€0iJó‘ +Äø 9×ÇDóŸñPWNÕ3›ˆ:> +gÔs@¯dwaûPßõäÓ K`…®wm;DP­ûð ßSE-$Ñ€ƒâBŠÂc…§Â{^*°jR›Rí-6ü¦â³U Ðk¨ Å E¶â—@’ï"fäßšDU²ÓNíxF5£v¨Al ±;äˆ'„Þö1À2Üq“‰ +ÝÇX"™³JÕ¸RE1I²‡ê+,OÔø›p&bYß™ ×b4”òu-%É5•OÍÐÇ’„*Y\pû¸,%Ë„ÜBXWÅÜ}ð†tòkh¤ú,û +û3:È6šŠ¨J‰j̓˜ê¦­nŒr»QtºQdÛw-Ç0jzBìôx6V|WˆÍ£Î ‘æ]d¿i$‹Ø`c†€ç«&ŒãŸ(J_’ díðßoÂI0šnsñ1k΃¼Ô˜@µTë!m‚}ãí ×QÅѻ싺/Húe©èMG¦²\¨6Üd‚Ê.‰Ð@$*1£äsG]Ý¡²Tú°í.Š¥«P†kêéæ5ƒFâÄ/ªÁØc*5cLÛ1v†*I€ÍÚ[¤ôTáOa™f˜C‚[¨Û©j¨§q +ڈƹ´ýÅÙxɤGÐgEÖÕ-¦7FuTú¢ ð‡xLà\œ¼Íf¦ž”„¹Ú†Z]TâUr¾jzo^l”«M•MŠ0êi ™›Ç½EºLc¨f®¿uÃW\U@+¸áD “j~Y#Z–‰ûýù[}/5¿¶]Mx"í4ª®_³½IÒg…íláóØ9´Ïé.aŠ4uFc.—[ÄÜU’f€cŸ"‚õ‹õ1ÊoÂhg‡Y»7|Js0vÚ2ˆqHæ(¨Oºx›‘!G–™1¯G­B +k&XØx°­Àp÷—zʲLýVã6ŇZýÃJS…z3êr“XØì”5xړƱ^7^G€7õŠÐäñ÷.Ô€t¢ )žúþ5$Aö94År’N>—¯¦Øý£}¿™4œIŽr8Ô´Ûà~ï.Ó ÂŒ¸¯#Ì N¹ô^À˜•.û¦õ„Ø‚ê¦=ƒ‚^SkGi×ò^Þ‰Dœ¦ÀóÔè…J‹„bN"›7Ê^Ós]ÛÆÆ^>½PöRxJH£c>¯j  Ç!ˆÉîL>Z„bÙZÙÄ”™Ï Þé f‘aqr§áÍKi‰Q“Ê X˜é¾ :Ï<b-ÄàÀãy|É÷ºzš¬^.›göoпvN +ίm„ãPÞ¢Çã bM–¶zšðÞ™8UP÷N‚©-çÉÑþÀ¶ºÛk÷Ý;óSâILÕBgX0ðQ$YHu +´|µ pU/ùù*Â.#ä²Zb¦ÈÍ8&¢`ã—%¶Zs6$?»‡|×U((’Ùi½Ø”´ ª— 8íÓËÂÞ›¥´NÚ>¥ò°©$vµn©JòVJÊ4oW+ùt”Éh`³WÓ\M…‰ü­É”>ë`V ¿ßã‘«O î‰ãávað-€ì€«ÅäÖ+TWðP®Ãéc‚s/ÕѶûÊ ºKp’(@fࣺ§­|,û uÂrï†ÅO+ø— +ºà·êÑß w¸g¹ø›ç¬*\ŠôF¢íî ž›³4p¾ö>,ºŽhNyÎmð§ã«[N>C»üܹ¥‚{Ogâ%Ù N}ñê•(_#('À‚pƒº ¨[ª‚“}€­ +sj!™y 1µ!uÇš'eC$Ü"¢ ½.=Þæ»P Õ”Ú‚æ‚ÑHõÂ5Ü¡6 ³›1BcØG¢¶ƒL@~¸µkôˆò8¥ |ÄÞÅÐ2O³ÈjS [µZ%æuò¸s?¼ ñ}ÀßI1ŠÆ‹t®ÌÔ=‰‚q¶JžNHÔ‡f·ô#qÃ%ÈåªÍe§ÕìŠÇg}Jä.),.jrÖp$:C’7wt_1¬éا—cŸ^#Ÿ£bb);Hé%„X‘VªÃWìÝc¤–;è!Ÿ®Ò»@o)&Â)^°-pS~‚Åe4wQQˆ—ƒÎòª-*S¶¯9‘Š À?-C} €‹ËDîåûð9RLM &j!çn ÂsÌ\‹VÊÖ¼Gé] _¥DVÈæ#©×|€fûÖš\’Ô3ú.¯ÀchpDˆ™ûàjVÜ`R¦)æ1Ôlåtâ§NŠ%¦íø‰é¬¶®—SÑ÷Uu]y­ÈLÉè̓LsæoL," ýxÆï2?Ú´ôTÚÛRzÍaPÒTèÞ›¡5ç„H^.¤«„a ^y;, æ‡´K§f€¸Ûüì5}†VòýBêEp$K +N­a—z±Ìêi1“ÇT´¦ cÈPÜkFÑþŒú;ÕGºfY™[[‹öܲÉN"F¼1>SÕ;­÷X‰î©D%"RfÍ‹BýC³5Ô?ÝǺÞa§ðTÕµù‘Joó«aÀ!×û´– qbB§áÖ|¶û¼òsóH@ÇÇÏ?l¿nþ1 nÍ“Ç Zóíûù ÍoaFª!.ñZ1°ß*kåAØqkñBÜ´kÄ~ó¯Åñ­õÏù ÕÛãªBÖÿ–ñ +TÞ +PßDU¨‘ ân­´ÙJÍP°3…n¨õ b:Ô mÅýZz´*P»ôÎ,}Úª­P95•^(º +ú2omõn( ú;’ Ô£½5!B9[°@BI\°bBiÝÖš•yÁ˜ +E}Á 5[Ãn--œFa(JŒöäZÜìÒovE’Á¼ 5–ÁLþ­¾Su™ÁÈÁP•¡;{?˜·!©F×c­qݺ0¡V6¸B¡Ì6¸S±Žwç–Å»Vï. 1ÔoÍP¿¼:¬±úówìœçÍ]‹>˹ƒÿ>‹À÷îÿZCÝÿP~B¡Œ}Òåðkh$Ô¨J¬ÇßeB5ˆí„†€ +ý»¨RìK@1†v†½ +ÍÛàWlªXƒh±1c ÄÅ7a¼Ø²FcÉI -*ÛˆäÒèâš¡U&ÄFCËÍÛÐjèØ ‘ÙÐõ3c¹³WhŽFk9v+­±èØõ´‹iÇž©56Ú®BX=´omÃó¡ ,D÷c'Ùš!ˆi»LC|Κ±ˆÍqkÖ#6Ùí²'±YoÍÂĆ¿5“w¡:ømT©ž[2Kµ°à.X£[ÌNÉÓZÛø¯Þ·9.v456ê_Se BàzLˆR$Óm•$²t—¬ƒÏU4d&6Ì^k1éÇÜ“Kt»ó¼câ»{vÍ:N-ûÉÈȸ˜¼¬0¬V3~„¢¾æ@eáœ$‹0*@i%æR«h¶eN¨øÈö¬ùXX`„ÙoÓD”n—ÕOY“ÃñKÖsÑš¨þn;3kÂû™×5]®¾˜°,kÚ=.íš¹vÆ.ñ7ÖZ@7çZƒ÷ø®–!ž•µ&"ž·µ¬âó ¿ŒÉ[†ß´ Úº+¶ðqÁdµn‰†Ò’«p†|»šGiVPGŒËêT"ÐÌ,ï6/l@™°Mè;Óò +~½Ãù!ȆŸIn…Ç€õˆ) +í=F…½OœË…¯Â ¶Tý$wv¿µÃSnO4fÄú¦I±0°Îz‡/ç˜ðó8‘·×-¸˜™Ï­Çë"þÍW£ºŸ¶øƒX +%m#C˜iV¹™Ï^o¾U±ž3)¬9"]åðæÆ•¯×?ˆÐìÉÇ~7bwû_©º¯€zdA:-ï‹7¼ÿêïFèêýMµ84™…&4ÚLÈŒø=að3Ïæ~ý~$MÂÁO&+Êz›Ïa+®”^üõ:oá >7ýß½_­ƒíePŽD‘Äæ°áØ€I)Ë¡ìëºG²ê“è²ÿ×]†—”=?O(Ð÷›Ã_&ª¦~=<ºa$ÅTâqAVJÅ ÷P²« +OYŽnüõôÇí„È:-á)qb)öÙõYߺCibP<­˜r9Vr¼«ñHPƒ«bš§ âHÌ +bŽ5÷×?Т_°ZÊ»ã·ùÕ²)7/\ïX?ü»Ø ·¢ ƒ"=ã¸aïŽP"DŒ÷Öêµ¾ŽÀl¢4]SÏO3Ø»ógxý„Ï®Á<‚ÀšèÊD?áÙé9S¡DhF™½×_ñJ“i ÂB¥ÎŒn` (V߸ŒGÅ?µÒPÓÔLšë«x í hÛ¼OÉh"°] ‹)¦·‚òÔu+ÔjeÑvG2Õ÷&­h›‰´@ƒRÕF§¤Nµv8x‹Y©Šê ?@¢Oê€è±¡ŠŸË?Eq>?ÅžëhÍ´%Ðf¦í•%x‰MdñP_*fèÍë +a‚†þÖã&`Ñ™s Fš²™b•”h>F%¶¤$¿Ûûv´¸ +>µ=Wå½EhâMĶÊóC>%išÚ$EñÑg ²I°‚‡g<&“<æÏÉS–¥×Ó‹ÍlÚ«fAè`Jâ†aÏ=ªEiU7;ù«ª¨¬(µU`¸¾¯g,‚Ï$}ýÁgC»Š9,gQD6ëði SÈí"1[_' >&XëÔ?˜ïæ=¤ ›û,ëºÉmäC=Úféû„è»ÿhµÛKÏÿÐYÆØÜÕAd•“6sËŽ©žà8ùîP©C +B{SÏ´9\­{‘;ïö9—a°»S]Áy»TtÁöF6ˆü–Va”Žâ%בmÇȺ£>!¿û)áCàŽ„/XDÕýÚŒÓGŠÜ\2bIq:0h‡(°«/tR’œe„êô¦uivŽV\âBjŒM õwIÄÏ–†³zov(Yä-™’Ps·½8hb#™ü~×äÅQ¦6ëÞœÜ<ÑY©m™Ÿxî”䣅$SSr½Ä³koRøÊܽN©[”Ÿa§-¹4ˆ’ìü\4ÖPê…¨VU¯—¼nÊ°c °ÕÅ0šÊù½ä ?Âsý‚ ƒ·™"<ÌCúa.ƒòخɪƒÂÒ®ZlnŠUn·TФakm¼îî Ô·‡$á°»"Øu¤ÛsŒœU~|ÖNúŒ­…†äñâÿ÷³¿ýjŠz•?·¤/A…U–†‚nó ç—ÿx½Jg#ùPàÓ„¿¹]á_sïÏ> ¾Þàtþëxíÿ»ë|7Ñ;äÎ8ÑpHú}‹Ô°õRgÀÖH[‡Ô¹bë Î®€:Wpý Ng€Ö_q:²þ[œÎ¨?q:??™éoq:~Àé\ôLgÒßbv ý€Ù9ôTg@ÔßBu:¤~Àç úi3@êo:¤þæ9ï!õ`g€ÔßvHýØ õ`g€ÔßvlýعbëÀÎcÿ`ç +­¿vdýØõ·€Y?vNdý‰ÓùùÃñÍ›côŽ4“e¢ûØ, Ú>öŒ»`ýÜ{´¬VÆ]êYlcÒxz–V#ã.Ð'žUÁ;®=ãnÓIFÝ3ù»•qÁ£y£q´owÓ,‚°ã »ôº/”»‰²g3ßlOÑýV#å.ýÝšÝÀ´K±P\Xî'M3(wìÑ(œËŒd\)wÍÈtJ#WÊ]¾Íe¸y>ÇÀƒ™”»À*ø¦Í4¦ç ù.Ÿ€8waxQRž&€hàÜ·öiÝp‹£_µÊ]ØG¥©z"ï;^´Rî¦î&žm+;iiC¹›ØÌ´‰œõȽ»ÞáoZIx±(']ìɄׄ—ˆÕLÓu96ÞR½w¡"y§x l¼xôTV :„×ÂËKk5%çµ²¿7ļë‰üæ«Ÿ’˜÷ï*åÛ¾­¾çåµùŽ–Œ•IÖìÈwD²í +oV¤ˆdÍö6oá„5—rº…•×¦° +ÎkÒÖfê1#míîe'ï¥Öû-Õ⟴=‹i¢²#åE¿åämý‹‡æ”¼ÕvîaóÓ Ž3;þ4uK%ÓÏ~º‘=|¼M}yÐÿêPð]:>޶ŊÿOCÂùîvš/2J®š/2J®š/0Jn5_`” šo2J…7%·j.PJ5(%§š‹L’;5÷PJ®jn¥” Z.PJnµ\ ” ê.’Ku8%wÚ.rJ®Ú.rJ.Ú.RJî´]¤”\µ]¤”\uYä–Üi»H2¹j»H2¹j»È6¹Óv‘mrÕv‘wrÕwŸ?ˆ?‘›òàMÄ#ê»È;ù9ÚÉòòž-ÑìóWÚÉNäÀyÚ]ߙǴ“ö©À¾<ÌŒÂåÀ̸y×ÒIjJ!o< +<ÄÏ<ê±N~Žtòƒ9é$6›iŸWuWÉ´GÎÉ=®‡q’F»íUÙQÙ}€KøSQÖ|´%þ‡ÑuJ¿ìˆÒ„Pi¾m[äº!J«Ç§Òi¬Ä˜ó†(ͤŸ`ãÌÝ?…"µeJ«æ€R`ßì•O;Û i¡—ï-Aš aHš¡löܤ1¢Ã6’.†È@¦êVµ£›ô:'•úÊFË¿†—#¤ñáB 8@Üð£‘ZÑ@®Œm÷?šDræ{“·q~´:(SRåîÞð£U¸6é×4¯J=l[~´šÆ›ˆö•sÿŸRuÅ]K»’¦¤aË&õ}Ú‰m%Ò£•Q>HÕÙ1wÃ;ž4z´œ2…âÜ^ö·EþÔÏ'L³¥ÆŒ7³‡ž½LòÄÖ»ü¨pf½ ÛIÀºêÀíô‡š`ìW§­Ë„0Ù 1{¾å8¯Š~q~4˜ˆî³óÇ2ÛN‘yT}öa.Œp¾è §·ÃD—‰Pʉ.ñ3R9Ñû­&ØìSec6“Ô‡—;¼¤ÊOäI{VUW`¨î°cÝžž&-lV mÖÄé,*‚ "Ñl£»‰4Þ‡·,Ðá ˜—ùO³Ô¨z +™v+ôÊ8n¯jõt4Æ3nbÄc”Ï Õh  úè©»¦ RIû‚B¹ÿxþèì8€ó¥²ÍzHB Ýu€$èa&X\C[gÁi¸ß$î;¨4,E>É€})ŽZÜþ¶…X_ 1žZœÄÄþó¥7n—÷]Õ§Ë,ù&Ý~ê/¯óGbó‡BOí~úq¼¤)Â>Úfq…Ð>„î’ª¬×­`Ÿpj³à*Þì(3ôO²Ð}umv&† y~3l¨÷Þlj~¢þiBPÔ¿nT–»Ù.·F´~ +–“\.¡ÉnFä}åÓB{?$õ!F&©ßdà­s +÷qQï@Í'fGXš¬ßHwÅ,uKKa@Ñwš¥ 3hݨ=Çt½ªa—UÌSZ{ÍøºK{Ýe‡WJÐAM¥„ –ÍMBϱ×sjo«ò”û¢Ï#Ѳ2Oöz®ÂÏÃÙ ïg|ûùAT„iR&LeVÛ% R/,mœa{D üfwM¹¶dùë¶þœæ˜©1 ++îW•æ„vðÙ«ðº.‹»geíäe|”a4zàó)$ ²í¦L»… ¸ÈL묡³¾šÂ‘Ú(ªÓ?èÞmتº s!Øi"2£ä¤ÆA7A…ó‰2˜ß&=ѳYàþ)‚ZF1ÑOÜŽÓsFÍz£QÕ’ê/P ©l“ôÍRvIžµ£麘ZÜì?ˆÑ­-ÚêªnÅPEFRh-=òIŒv^zÌ J¹™â—ù3þ[³½xYðMÀË>³ Ií*úØqH 1Ž¤]¼#Z{ý= ƒRÜ_ÔÇvákŸ¢5êXZS…¥=Y +2À™’ñ:hõ†Ý«hQ2xLÙ9JA°ÐÚtJLÐEgµSùU³ƒ§È2f©pª:«x®ùÖ.€ +õô¾9ºÏM¦g*LýM§/!æUæmÏN*_¿&¾}UÛ–÷V‚Goe¯Lïµ( +ÞžŠœš…™N”pŒéj^÷ЀéWíµ=Gz¾ªùLhãµ ŠÀ$’žSÆÁ ŽE”6Ÿ;:?Úãzåð3–S)ƒ#8þµ{[ÔïQ-z&åc0)ç—àÂàØæ:ÎTÿ©¾£³A·ªò;µ_né¨qoq,æ´•²³žÜÛ¾¶ãÛ<ŠŸëú%µ\­ËéxÆœ­s-€ó×;VêŸlpgËð˜Qbkþ¢”Ö¿úº8dMù£—óÌ+úåß¼ü«Ÿýì¿ûî~ø³_ý毸×= /ŽîöÐÏÙt¬Ô])ÒÓ„pËʧ1•H¡WÏ‚¥dJ•üA'ËÙ†AEѧ Kõ~3cÞ+&A¼fZÛ„[È’’·I‡¥ÔO™Z˜D2ü™ °³÷ÔÉÀ1‘fª3 \Ç»Vr2“‘Ç9p*;å´‡«:;&,-À#ƒ~‹+¢Né›TDdÃø”ÛQ!|ߪô ´×Ô&@.¦™)£Ç; °^е]+»wÐÌ$%2¤~«týé‘QÚ*L£¦LF* ¤#úð¦ˆñ)’29Äñüì¥È„åÁº{³f]TÕü‡$Šàä•Ì¦j„+[óöoáAc3ŸÔÖL>¨z¹ n0@˜8b¥¾‰fS +æ h(1ѺÌÃË™QÌtªÂñµ©>á|©L‡~Áj†wÞ4mè'i”j>'t)؇=0s +¹©.Ô}Àz@ݯª}fªiöL*Òr¦{ªóÙ–IÕ£(îrä§LÁÔ!ß‘…IQlYZ×í+ß2åÇ£=¤ UaØÐ|˜rúPz½›b×l\ÛdPŽ ÖÊÀÇQYÈyfj—ƒøª™˜JÀ:§¿8°’(˜á·Í«ª³D’qøî!”àwÅbCC8ßÝ( LÄHó a9 †âŽ ¹K™4;Ú‚%A¤[Ï?€ó¹d"±–BƒãðX³©fj3!`e]±»P÷Tìš¼ÏMM·)†Ç¤ fÊ\ +Ët&S}PB¸%wÒpW¾­#H*‰W¨zncPä(b4¢”à4~e¨Šr)5iL¨o'Ÿu'ç2e9;ô][F…OªzÌtb³Ä;T&gˆ"\6YGÐdUèðj¶äÚroN¸ÃAPˆnªq¼'ÜÔÏøåË9éZ´[VI©õ†~c›Jqr îb&¸[Ëë^°­Â^`’†‚¤±98ov  ™Þõ'Jp‰¬nþ±C ’ж½þüc›jœPê­NUðŠÒ¬†C~™ÐëÞ>Êwª°ð8c+ c Ü’óÙQ¾ï̯8EdB•žJ“ `èˆã–BPO„†PxR¦÷Af©:ˆAÐmØ2ò…òò#n'ss©…- Ð>æ*rvn¹³;ׂz;맽Çôb÷3â»?SWèˆï“ +Ô®Ÿ¯3ˆ‹—ÖùT¸æÌTx[g%”$V“Cp‡&Ï4f¢¥Äº!L3³é/Ç~QúªQ?.HšÛ¹T25˜ÅI„LR'» è;P2ö5ÉkUŠä–È‘S—%G‹ƒï(ñʲàÕê¿jª°o(Š¥’#ŸÞmȉö%§“÷ßGäCŠÎÖ1zl[Ò×”Ù.¯êŸLv5!sàÅ݇¼ Ñ.fó‘Ãç±;ã‰üjÉî{Ô:d1çuêp¯Gl}T­˜b÷®Ð'aïÞ’ß‹hC)³1¯‡Ì6uî€@‹}G}áUõôU`6x[€ÙÌ"|Æ+ÿv{‡¼ÏNbÏ»¯Qؼ&ÃP Öìtt'ú-û
d‹ÃÞª”W–‘+¹‰m™ºƒ—¹î¤"æ›køÀ|»”FáxVÂ¥¾¢a÷ØêˆvÛKã@${i¨Tn3ÉáÀt|VÇBdßáfv„ã¥R rƧƒR b'wU”«© +òÇmñ¾Ý¦"^–¡P“ÎT>ÖT’ðfô¡¸Èl‡"­Ô¼Íš1 +¿Ô0qp¼Ç#>(9CÞ–Ôßakq€Æf%‡ÞÐeTÄ#=éè:©:Ë^jÕADXP¹ö m_“â¸ä>euÐu +=.‡Ò,éf¼á](,æW°ðâ˜R-MãêÄèÝ›©ˆ YÅ”¡  Û%8åò ¾´jí}s™™v‹u·Œ;€Ô}…j̱§›( !.økÍÝN`{;Ã%¿†˜5ñ“UŠ=ãF7Ø}´È m‚jÊŠÝçHÀy +ëÊ0¬êé4šTuœÀ.i$&(ẖò‰Ž +¾“® šêc­i¬áŽ«z—J [TŸ³p×:^VOý@µZwá´i`›öôþõÛíL¸Þj» Ž ›)P±„çÐZB’ýÛöEÚ|K¸c;¦pW˜Ì/€º;ï–`^ç·ªç1ë°‚#ùÑ: aÕi¨ƺ޺”,“@RÏ­BŠ_øÒvÖ#Û}Û­žOGòÑ7ûÕ\*¿ƒ˜rM›=oªA¦¼y'l{t8‘d%ºÜµÝ¬ÕëQ–³kV’ÏdòðGTï² €áéçfšå³ndÐq +Tÿî%mdÙ  5r«$„Z²ÝQ†*10F‚¾ÆzF žÐßDçÏZ»}„®È¹&Wn÷ºƒ±°© ¥ «æþRl<«Òº dÈ}¯êàUôª)õ•Ï¢cI` Sq£¡ÕY}–¨ß²Üð_moN.½´ó;k„ð÷Ä|~gÈàfRb¾µƒºP¶6f”º®;Z`6og½ööÛ=0îWã/M§Ø¬Û”uc@š ,U9TECT« À§îJƒ¶ ´@!Ò±l¢C|‹Y Ž1 ÄÒÕªîgÝä×¹5æÁ"%g +ùM&Ø\;övŒ€á.ga\ÝŠÓ +­Š¬à …;¶ÎT¸+øb| ^Í,ÌV±Ø;Ñg[o0{ßep%m:dŸ;¡ö?sÃÆ¥ 7ÏòOrg¢ývç¤ÏLa™MÏ!\Í­“ž‹0ÄÁ G"ožSàGò ‘g0Òt ¡ÄxC®T°ÐgN:(oâ yj“°r›ØýéÚt…@êýA ›$bMA\›PLöþ,–¾8šÅÍ:Z*Q4¸bP(Qê‰)Cȯ§[£‡ 3D£Lfe‡÷Þ³®A°FÀÌ6)"FYƒgé|}‹ ,·18÷vë¹»ÙnÄâÖXýwÎûPáYÆG¬‘ÆFˆ•tЈM’?‡rÑ„@Þ­ó%jFuò1DR…B“û»ø«m³K¥Kж¿ d ÷JÇŸû1 ¦Î—°„˜»H× IӹظmÇ>…ÝŸè÷©õ+Æ˯&—sk~âáyÔßÄÈ{ϧ®ì™€¦}´æ`È>g­ÐÛìšL@-'%9”®Y í ã“SÉÑzRÁ‹J`^«mÔ} _ í/X]1W³ªó'WçŽobuGÛÃMÐ’lÛ¦y‘1X‹ @kÛt}åâ”^èOb}´ +| ˳dÐxA²le6À­'Ù B˜µG¯ ™ú´F'¶˜ækkO3Ïù|Áye½|…"Ú´í£¡žèQS¬¸LÖ+{uTBÛy&ª/șއ°™&+θÿô&êÌ*/Ïàb!€BŠTžï2‘a9;ßrŽäšâú5º’€Ä0iM(lN×M0Ü”s~Ö GÂ̺^W…OÂ&:è]í¯c%ïâúŒòñ æXzÚÊ1P@<=ilšûDýæHÿûRþþ»qjqw1Ø!€‰èÙ‹Wup@Óõæñ·ÍV¾š—¸zÃx}N±™?O4 dg;ÏMˆó¼Ñ¬Hq•6iš›:¥`‘S@FE ”àq vsX=ÉFC£kwòaÙ cñR\Çl£)U„TU®~PæÿÈ"±‡@·dVË݆E=ÄèønS¼Á› øiPq]†L¬t|ý¬¦»q $HE0A!øxSòbAåƵ€3§˜æ[ Ô&ö­ižý)ÜiÐÍ0˜áƒÚÔ°|0Ρ9ªîŽð—°SËð7ð¦:¢˜™3cKC9Èõ(1¡“Wš©˜~ÿT}¢nÁŸ²ÿ*}ªHÖǤ1‰7;jXÛÜjÑ@^CÃNÍ>6WØÇ Gaht…M\V›×iTÌ€BBÔÎÓxÐVÜýx×:Ê­¦°?A© ­YŸJ©˜ƒ€çsfH–ìQ|ΚŠßîØŽ)ÜæfͪÅù]³sïVgÉí…¥]’‚ÏžXSŠû-µ¦&ãÎ\Ó›qw¯iÒý)YÓ­ñ°­ Ûx`×Äïþ¼/ùã(6Öt”8K&{+·Ö|ø*ýBJ=ÈÍšßJÝâB;TL1?k +Þª„µ!*”QÃTQ(Øj²PJa(Ç:4Tul5ð, + z;Ô“¬?”¥lÍ…PÞŒP"ì”PjóƸ …:Á" +Å>Á˜Zk†¶¦X(= +†\(_ +&`(ƒ +¦ä7»rªh’®eYÁ´ýí¨£yWÞ äµDlšÔ¡¾lkˆ‡:µ`ƇZ·è +¬%s{—b­¸ žÉ¨Õ‹®ÌüÃÖš ŽÔZR±µ2qïÔ­ŽÑ9\k$¿àŽ­ïZýÜ¥ê3ºÊkñèÞå^‹PãsÖBÖèþ‡‚Ø]a­«1ˆµ67Æ1Öß}†`‚tö þÌ<CJ|“…Y´ÌÚuÞ£¬âyPôQUé¢ïùƒFM+(¼øfJ}æ¯À£BΈ,C»Ò,e!/vá›$W¦~»Yãamô(úý%¾,û"^sÓÊ¥m>{½Ã·ï:êðœ8s÷Ø] KÒA÷Ùx]75p²Ñ ³mz¢™È‰Ù6úáÝM™(j·†²Ú­b~Á%þÓÍ]?•1û?¿…KGì(‘ó}søÃò½ßÐÓû»@¬¨`yCÑ. wŠuÇ u±ðŸœ(3rMEÔÍlŠAç„"i~BB.¡V†4ûæ9cîâ'|0ãß½[HZ¨ÚÝž {¦éù—¿Ë™ßì@PçT¸´Ûxà† +¾cý#Øu¾[·<ˆX%}°»^å§ìyü8ŽÏ·¼9»Ï‡k¯#\DÇó²îëe+PôK€é‡ío>i³ø+¢mob(½œ»;nýt»Á7?÷Å}áøçñuß½9u`'ò#Ù|©LGÎºé„ ¬ºh³K6‡OuË€ +ð¯ŠK8á)aæÂw|0·sªèy£üA\¿6{o_à€0TPÓ,ª!ðS¡¢¢2 iñÀ´|{Ò_àÎ\Ó§=DópÃc¢î_F"7 ˆêt òŒqûú-sR¡è^Ň°³ÙDÂ¥Ù!¢ÒMª¥?2»*—\˜—èéÁ»CDP + Ëq뀎Ðé­<¨¾ÜDãóà )ƒ‡Éý Š™‚Ðv:ˆõ §Ì;ó/@RsêÑZÈDÛŽCµ˜ØÃ)Í–L +òÔ > ˆ’`Q n,J¥Xšš$FK¥”ÍáMu`Wº JR†Þ¨‰¾¸Ëy<°Á7ƒ'îqmô¯òÓ.§`n¶ç­ÂÉf§ÀÇköh¡cGwO8RÈánÍò”ä1Én&ŸJkâw$ÕÛ {ðƒñPDWã’ª`|2Êåa'óÞ²ª7Ã4Êqe"GBöoWXõ&¶pê ‹Yºj™Cä´ë~€‹œ NÖ½ßTa¼Ù‘…\o·ŸÚ$¦±gßïêŒåÍçÙѯåƒÃQœ3Å—PóDSƒØª¶@G–;´œÅupÛ Qvò®€yÁ`~¦j&ìÜ4Uýá"wäs-qã³Pá3ÏY?&˜W÷ßq@XúÖüîóµN‹Ìj—íá´_˜Q’zçn=vžF\W!5‡»>çtäÒƒPí!¢ðö’’j¸€Äêüúeˆ$fh„!lAÄ*léž”ýn“p0pTHæá¨<é¤xÀ”·:·…9§¾„“ š/¥áá\÷6Ì 3è(ôs½ÈjÄUÁŸÚ¯^‚€)­.Bì19´IòR˜,ž(“âÇä` +â.>g™áS‚äÝŽ(Èí9!SÒ‡\Å~%‚ÂY4謰%‚êÛBÃþ jxÝØS‡oEÐüóT›!È0ÄíÁ6LŸ·ƒ>2£PÿˆïÑà-Ü%g!btŠ¤uWhâL_ü ÑàÑ áîâ|—zÉ +izZr¢^Üc3$c0]àâTw Ar5EÚ¢ݱj<Ú}5RÄj ñ.ž H;çÏP ’RpÒ͇HjQö³Å;KˆÀÁj¢͉p¤j'§šdHâϪ#sj{q|Œ"XC;±Ãäù‰È&šúx’#Âf ýè >Š“>׋‚›SM ¥à>Ú¦ú =§¼\au @­.‹*ÏÌç¤$<î7’->œ¹¤_b1g#ûaäÖ= ¶41såíD­ ÃxÉÌ0{Øm‚% ±.hþÙÙ<úãðxªWÊ"g¡dÅî°[úk@õÀ`‚âÐÇHTí +ç£ à¼ÜöÈWš1”!ª’ћʘ3qQ[6aU_¡¨[%2_Ä0s¨IIƒãðĤ‚änÁO ÆèÁ=ÎAbꬨ“{ôH•D•ÍH™°Kí°°Ké{óó¿8ÈË…Sò–•r; xywÀ¼ÝW +æ7R6o¢¶™¹š6Ï¡bv¦¾ cÂN²Š iÒ.ÖõB°oGÉ$&Ê÷UxIÔh|á—g³h”U>³x>“•¦Û\º­‰‚èé‹ØQXRvÆÔª<îHRMhm´«6‰érèô®§ ,x·Æq{±{½}šék–þÏ"HY99lªâþ&ê³= ÓÏŸo's¬bÇéÚx']‡„“š*\>w¾ys\TYHí‘œhAIsb”¢Ñq1árÚžGêc÷J;9î›ö["¡jîæš1ÈyàâÁàÔW˜i N/múJ$³¨¨ô@2ȃó”É$uù{gø!FŠLubhq¢Q[BFyü uÂé‰Ñ®Xï™N1c¤c<"5¥J½¨;;A…:*…wHBæ™Ýâ8¼ªƒ¡<„Â#:`5¯‰jra3ž¼Eþ–ê¨N<`›íÉ1ª¤­tš™J·/ —Ú©Lé2–Òl½>x¤‰|/×gŸC#{)èõ[—ïV¢IZ´OŽ£–œ–]Qºß¾²f3ÄNéùÔ6È¡ +¬ÞðKSm'¢ålN ‘z‰¬Œ¢Yø¹ W£—Ô Dä½Ôð@€ÝW{Yí®®Dqú';S «&Ôç,¼ ÛXTH(+¥ê¯B¶cq½Ã`ÛV)Û1*³ ª“•î|$äDµe5²bãR©eÊ"'‡­õéÀ‰ùWåœSªøfÊßÝ‘ÜAŠ°íuØ}oz,»ø><¥÷ùóôÍWÿ Œ€Muƒð&MKÑCeGa@5y–•€ÿÈ«î§ù‚Ÿ(¼4·Ãd=æ§PÌí°ÓLW&!`½…Ö &nÿêE^™2“ øø/z—¹D4#÷,‹Í´ê×ປòÄá"ÅöŽPÌ.IM%Nh²ç@Ôæ/%ÅžVh»mdb¨·Ý +K®í›Ÿýt#ƒ°Ôµ=h"–AÏþ>À/çHúýSVàО¦Kn4…33ìÂë8IÞ²®«NQczðàQsÄÎs¥‘d§Óþv~`áicˆ–êù›²0éù}V-«6 ’:vBvrÍ“ºVLg9ˆ<„P"be›ä.‚¡ªè d<á„×{rÔþ®=í¡BWØsTo©óîðü¼íj\þJs’LSöÉZÎÇc_øàÄ'ùmúœÕcä©ÈŒØ]ä5œñé"µ³ î˜}u©b˜ÍBRè±±ìLQØ÷æçeÌ7!üç}”ŒRUXœTùƒÏ-#úUàP¿6£¦@I‘ºÔÕ3æ ìâá±Juñ~ÞIt+1D OÛ,_=FaUÐåuÁkvü>ª(÷û¥œ^f?=ÄÞöÒèV™e;Tþö.V$î©êØÓ&z;£ªËsN÷LnS£÷¿å¬ËcôHñÅ1yE½2‘iôÖ*;UæŸÑ&•–]ÑQC%`¨umÌÔïdï©ù«Oäp]ãsp¼jLñLâûm/§žÓ(S¬›ívÖâoT‡§g»½ß­}æ~û©v•¸Ñ{ß—QHQÞGyñë_OÙóëõXƯÇ{?€!Âøƒ\ säÓv-¦x KbØ Q°n6UÏaoF¿îïÏêŠém}•K/ÿæg¿úÕ6û'úW¿ùÍ÷¿þåÏÿäïþgßÿÝ÷õ›ïÿíûNÛ¾ò\|ð¼v¸ªûÀû׿øͯ~m +ü‡Ÿÿé÷¿þÎtòÏÿ·ï‡¯/ÿæOLGÇ»ù¯¿úLïó«¿û§Ÿû«ï¾à7|öo~ÁçüüÏÿéï¾wCòž?üª?þ‡ßüê?üÝ_}÷‹_þÍÏÿâF(2ÌÉ››ÿ—_ÿêý>ÀºR½ƒú9>|ÇŸÿÂÆñþâ¯ó·þÃöÑþô×ßÿößÿ£ù?ÿýç¾…é´¹ùÅ÷ÿ:3ßýí÷ÿé7?ÿÅ/þ?ÿúW¿üÍçnþó_ýÝrï@0<‚aúÝCýwßÿâoþö7_8Ö?ûÕ?þýõJý»í®ü·_ýOü'åçÿö—=~Ê?7þùçÿþW¿üÓ_ÿâ—¿±ýµ_þÙ÷cƒ|ó‡¯þýßñ—Ëÿò³_ÿÃßÿí|ÎcUö?úêxùcû÷üǯ–ÿ¯ÿ•Fdø?þ“ýÃÿjÿãÿµKÿøR_þ÷—ÿëÿ>^þš_ýÙW_››oj‹87ÿõÃW_ƒ …×Þçµoß_Kp„ØÄ|ûæ·»kã·¿|ý¢ÿã«CÐ4¦Ã½D$ j!X€oJŸño¸R®n²Ëôh¢é[j^*\iTS8ú5ÎŒµú¢ôɃVÞ™³X³>µ"té?ÃÄǯÖr¾øŬÔàMl‚ÒÚ÷“ æA$§_®ø>~/½ ã7±žjöùýÞþÍWÿI?/Ð<éúIexŸUFm·3=c!pÎïîwô8.‡‡|;žÞ?i†ÆlœþôF 7ùeÑ6ûEšü"¬·/þ«ãÉdæÆ ÅjÛÆw€01?ÏÔÚí_mnh—dâãò–ò‹f 'Ãœö²ýÞ9MôoÞcò;¹žÆå\ʸ|]c 'eÏŠ´s\<²1¥Ê¥Ž@XîラÜvʼxÍ‹‚b¿xÖùµ°øՔ뼕Æìq‘¤Ä¸Øçï—¼íýƒ+g–Ù|ð1ö:ZU}þ®ïzun¨­ÏqýprÎãEg.“ê G…ÿ<å<|vhX¸Ç½4÷Ç +´P»()´í—颷Î5¾À÷Ù~×7Ï;O¬N2ù‡q¹°Eu9Ý×üà‹ðÖ8ed +ƳëqÍ{±œá¹¯Ëq#Íô%Ø”Ÿ{a¦yfô2Ÿ¯2ö;¹¢9³ŒMf䙢|ä!Ìé™SdþÄ5‡ñl åÃ^¿ø|^wÀ‹7×´‹hÍ%Û1½¢ãuði;ïùi„o^÷ÐuŒ¯EÛØÛ*¤ÔWpïö ¾yäÞÁ4×u>ò‡´Ã‹FzÜçùȉs4‹©øÿU|\-iu†êOÎÉ×ïT?Éömã3òñæ@֔ǚ +Žg^n]4E\´Œi¦ew^ìiì«ôRŸ¡Ûµƒß[ygîUíc‡›§7‘D/¡I€{ûa¯_¼¼p~qMmj¡¿wßwz³™ÇÅ:8éGyÎY›sO Á³‰îñÕÝ¡¤æ¶ïç1åôQž«Ë3†ÔÉÉ˶Úãr©uLõ1…Žò=iLj;Ëëååóá /Îûå¼ü0.“BóË ¿Ø«Ï_%ºZÇEq0–Ç’ùf<àŠ%Øæ½·¼ûÛ³~±Ðy4%b:Òó€;_ó hNOM=MIiS»ÂÜåÍ´i~— –Æظç=¾‚®‚ñößñiÜ;÷]9Ï9ŒRú܌瘱ðߟÃn¾ißb¥µ~ÀwÏœ]é˜×‘½à,óˤ7çÜÝ`ª_s&(ø2¯•)©UŠâÊ°´yÂë¾}];%*õBBñ?|tÿ¸›ZR]†Îõõòû‡¼Ê¼ó>Çjƒ©òȼ{\1{ +€2w÷³ÖÅu¿_ì÷#¦gZd¦ ~ÀØ*徦ì×üZòž¼ëmîø܇ʨ±Yeo?ÿõˆÞ÷³a[/ϸŽgE(Ý×rYÏWסÎóuœÏ—J³ºÙ0„nz3¹™®ÝíÌ/C|>Ö”9§ãËšë[¿ã*ùN¬¹NCƒòÚ±ÄmÎn¹?³ENª¦Æ»¦ò;ɽõöû_âýL²¸¦B¤tX¥y,p±³6Çpy*¹sØ|øšÓ_âò=­¾{yÈ|ËPÕ'éôí|óL¹©‹ù`œãgë>FôÑÜåâYÆ^PíƸØë9/–×)33m W{^|¬ðûõD¼ÿ‚Ï~Zz|ôØB¹œmŠ»ýîÍв÷ù²9´OùDz=—ñöçÜÔyÖÚ~÷Ð(µðt##Ês,¯ácRDæNjƶrÇæl÷#ìâqçy'Ý? î’4îeBü9Ô¡‡Î\>s¬ЦÈz{±SÁï{ŸÇÊççmø›çã3ààÀ„]Ò|hju|ÕyÖúü^TÅMø!ÝèQ9Gøˆ¯qñvØÉé~X¸ýi< ƒ48·T=\’GˆK¯~½ +§e ¾—Ï>fö9U¨õôØEª²_¶k;0ÓÜ"Š%ü0.ל†Ð(ìßλïö¨¥ñB[_‘ú.'¤„c˜©j'|Örìs[Ês-ÛTa©\ÏÅ(¤ÌyÄcnùõ³ÞâÛGÄ¥=.ziˆ3wcÜöáMTJ·ÎÅà*%Ç.©¯6Sa™‚#Vffé{š.l¿H{Ç4;Îü $=VÃýêP+;öt~< ò@slùzý‚ë|b.÷4Pæ©DŠœó©{¥öi’?jÜz?ò¢¥éö|$åŸ=®9Øénrížè÷sã}¿Na¿ŸÇ>q‹w—Óqôç«p¤ÝÅÚ^ŸÛó#ŸëíÏ÷q?ëu>öÉ}¾>àQ·i ÞõÖ-™ƒ}^Ô¯öf^æSS¨¼9"7gz*{§ÔÏÏÌökž†tçÏ|Á¸VÏ×Ï åõ3ó÷z/uGób+›UÙ,쇢#?#(÷”ÁÇ9ʼnööö̾‰ã »â2㦽ºS©"}bA©Ïk¹—碄K_0½Ž4t¯~Ö5e3‚/Û÷¿~X3I _½ŸðóŠWÖùäé©_¯†”’,m\¬óŒû#ð:Š€òüñ í‰ .SûÖ›:Cyšaýºg$“ˆÉ·ãr馡ÀŸË÷9ã¹|´2’73 …-öxÞ­÷Ǿz÷oœkzGKWpp0úùhñWá$·òÛýC¦RÓabð3Ãå2s 'e­ßŽËÀ›K_Ê·û‡Œ§ƒ¬Ò%Ãñ˜1{Štýé„X@Ÿüv\n­ËÇí:‹žàbsƒ->wLV¿g0Wñ®©£¹ìáEüüzu¡]}s „‹y~ÜL·ÅçŽRÿRŸðN›ª‘ŸD¥íI-;Pµ‹’ýq­?a¼V†B¬ØhùQˆ}ÌûèÄãžm®íÙ_¶ß5>˜J{oLÆÌ,æ‡yyÄ.µúÅvOixÑ’:.žÓ0¿f芫#€õXç­uØmögFáËý*b¯ç÷Þè£[ësëŒ[_Žº½ÀëÈFJ”Ó_æf£*Á#ˆK¤Õ·ãòáæ baH{Ä})§”ËïøÜñÂ̹Sê“‘²ËÝ#`-Ò”åˆÞ/û>>¯Z×úžÆÇŽ÷Áoój <¡"ËÌ”«Ü/öc4EžàMðÏ‹ÇtIxÀýXÇC ð²'Ø1íÇø¯çn&Žú›Dpæë\‡…~Ü¡Aù/Ľç¯$I’'ö@ZÑÓ%žL-C‡{ʈŒÔZ˧õ{Uï•îj5Ý=zgöÄìqÉîøá’ÿDš{¸yf‰’ ÀÃÖöt[Ezx¸››ýL:žhUΗ›`Ž+]ª–Œ¨#¬ÀòÓ à¢™AFV# ¢% WÃ?I:¿O­"Q£Š„+h|ð¾lˆ™QLèƆg‚‡ÿæªS-Y<Ëw1ñ ¨¨¶â£O?KäfmF…ÜÂϲO6ˆ”£,¢åmÅD†>ÑG­Ücï}²/¨¸|–Zø¨û>713U‘$æNõÍNÖl îÚbdÖÚPª,~݉OTX/8Ÿ¨pNdiTø–º?€t9[< ö¹ #šU;I&x”¡vt±¥xTP˜÷s?ö>;$*Wv7!|–®¡ê&Ò/ÇD…°@ˆ¸ ŠãôÏ0±©càtíÄ`­û0ÛÄFß1—›Âbä-_?;± +:óØ[B4óõ½G²­êd$"V•L¹B ¢‡èrá{âDŠÏÚBÀ|2OnÐȳbøõIÓSÌ hš*Ezs¨ ý‹H8n’&ZŠ0G©ÊzˆYÉä~EÒg¿@0*»0H„‹…ˆ¿d]$Q° ¾oú0¢êÛCT~/¯n$HT…5ÂZú¾´ÄÑ÷¢ñp¼…ƒ~4„~¬ÿ¸À’1NVL$ûŒÆˆ>³3¢áÛ¼ŒÈÀq" ìx8€™ádEà§j1¢­a4?»ƒÓ0†ü鼄8bͬ}ƒ»6àØäiz–=‚W i.ò¨›Iÿö )ñy•µó¦Â²ûôul<ï0öŽ£Ö× Jaðî^…ýÉR ˜0i ²¥ùÖ÷óÙÌ¥¦ +M…Nx6®0y¶£÷ùw1"üÆ2EJ¥nùˆœµ§‚)S,ûÛGYšê;ÕÛ‚l+¨5ÛgFÔ4ñ,¯5õ‰DQ„ ¡è{óo#z™RxÑð£{¼ÉŸ˜˜‚Î ¶%Ì%èIË´p» b,á`éGû?g5 è$¹ÞbA4ŽÖ,kûYJ¬Æ\áxŽF5 ½xÇDNÄ£Ï,&aã±ªè “ë,1Åo£„G &3²UPü –E|=¦ûÎü‚^„ãM@lü½êgɱß|ҰѽaÉä96¬‰/»"À@Ž7…‡…¿ w‡ke|™)Æå­žq\Ý+3®5( û™ l‚kY[sC¬Ì4þ̇‚|Çø¶-¨"À†%¾cÑb—»"sfD@?¶&ƒNl–s¼ÍÐ-œ‚m 9ÂJ•å¨*n¤N¨œ—Ê{ù¬ âe\úDVæë…Uã÷9•f/c%’>‘uE”ªª‚("OÜ ¯?Á¯~•Æ“¿4æÆG˜Š«Q¬‚ê{ã|¢ÉÛ±ð/“œ`b> w +àÏE0Šç”øŠÅ3âý ýŸ˜ÄÇ6Àö3(Y??9”ÍÞ+ æU |‰µ@8R(âÐé)¿T—?+ä³¥K‡ò°²gU/®0ügyš¡Ø*ߪeøX‚­ˆ®P9€M¤4a m$ûz~>}çª%±ØËÖcDMèuЉuùµñYKd°g5ä jZ2?Œ)aÓ\i +%c +Î`G³¾,Öå§Æ\jþJ +eë[!ži´|R‚ߨ ‘Ê°ëd£àâ<êý»3ù.>J3iÊòßÏÒutÀþ²ÂyY\ÅbÌŸ¢è)úœßÃ'Û‡›Â%Ä\C|(9™sÃ&<·ùùc|öâ9ç–ðé±+ED”¹9UB#ÃŒ"ôñ‹]Xu,Í×ÄyaîÁL6¦ŽeÖ0Aþ¬jéRÅ£h¤?$+Æ»<Õ¶Ö%¤T×¾#Cz@·pa?ïÐʃëËh¾®šØv{;¥4ç¨ ªD¨TÃl]£²Ž¸³Â²¡¬]ýú ,áh¦)Ápì÷ +ª)…긂ÂQÍu¿.B-ËÄÓ%]r¦š +¿ûZ¬Šˆ]1„Léz}œg^2ExÉsÇ}²½ù}~>Ù 6{Ÿðγ>ÀÂdbz_õ‰Ú‹{m!Yû‘Ç 8ñ¤®âŽ›BI0¢†ÐDS0•ý\™©Lù6­ ßÇ>Ñ‘}—…«haàÅÏñ¢–R|ï¸Oäuó¾àSðö8,¶‘l£SÑ9aìLœ—)ÇQ~h‘ÝP¥i(ÏT5ýÚnÈ•5Ð+ÀUª`/]¦Ö +sÛ'bŽ]ëYvk•|~ N´$SÅA-¿Š§ªáº¨¹¡ë%d­fð„³¶l‚È_ D/Ö˜ð›- T?fKÃÓB 1Fö¸© ?ë;ÙY§È†òÛkxÂîaÝÑËi–ü½‰V¡!ìUSÁä&vÂ|WC’ÛS¬ç/zÙ-ÂùOY÷< . M2Õ@#‹Ý3ö· KáMÒé62˜Éf"{ älLÁc(ë߯9Ñ ø~MJTôÛ³5ÜT ¬ ŽRJ£¾®4˜´6ŒsŸ¦ 3…w4äïEJèhfÏÒôŠÎ°Ù=΂ßÖ––Áb¤ø¬©òYÑ¿}P<©ÛžC9€í‚øŸÅÎz[M‘¼@%´aÏZRlh><6l¬)Á Àq5ßãÄOÿ{+eR)L?ûŽµ«QÐR· ¹2F…ÃÌ~`¡%Eæu\ˆª¨– .1‰"&vi•ùRáGæD°hå6úÕ¿Êã&:†|ÙõÕ"LÏ›“âYU7Þ°|—«W}Ûçbÿ÷:ª'õ£–Œ g\8?9n‹g×uE@1à ‚ú 3>q-‘YKF9YMžPž@è,Š5díOqT%=•)džŽÅ{hÀ‰Q¥yo)D݇gŒÈ˜€Áy½™ÚÁwCó3 Ñçš´ +ù=âšWTôq”¬Ëañj¨ØüÐ +[EU+¦ì®X –4m fТX¾AÖ(Á–Œ @F4{Û*@Ø°–ô;¡k#n2ÓòK\ðÜéFÀù带@Ê$Ñ™ÕAPi¾¨Õ¹ Óâ$8€!àŠS‰©5_ èL_¬ñ æDëý LÜû¹@:“C˜‰i÷úºôŽø… +Qeº Öò0¢‚Vœ(ý\$„‘Yv—)~o ÈÁºÑù ží¬¨¹cQCi@(WÐÜ8ËšÏñ,) †·uÖPBÂ(iWò¨%ân.Œ|"»hUhVŒî’‰Ùþêò÷X@eE‹yŠt4~y1NÀRQjqÇ.`Š|*]ºD­|V¾ßK_'R°ùèè ñ×OÅÉŠÊ×µYǾÕF{„»ŒäغØlQÊÈ"àªÄf"±ƒuÄ5MÌà¤èÒ5Ö–…uYYÈ ‡üe®¤¢ Ò¹OŸµüÌ1%)˜Òfø®v=š,ä~pf1Èrp"¢Üê†Ö—®ÊRpvD¨&g€‘F–+,_Ft:Š¨rcÓ²lÔ¿„®?Á–¥< »_&¬s²pM1‚9"=Ùº†ÎVîßÐ ¹¶ª‚¯ÃrWç +‰LÔÑ(Æ ØáI·Œÿ0_a/‹‚) +NÀ™¸T–†m¸7ب + À˜ Ee?“c[ŠŒân„áÐ(b1Üõ´?I„ç|[ÙÅâHžLŒDµñ«Ú1bǶT±e¢˜˜Fd¢¿-Ï ëŸäC•ûž A4ý[ø“ü6Ÿ¬Q@ÖÒ~ldK²ìá‰6ÆnQDÔÆ]}mA6,¬[¡&Q‘©¨Œ- à° Ã2@æ-t¿YÔAY Æ7Ç'R¡þDï³ü,ñf‹+s3lâ‹^þµX#cËZz¶´ÆH •Ñüòs,¬$²vÕHV²Š%ökwÈFºb +þüå2‘Yaª‚l‹Œ`­ bù]Ƙ¦QcƒëTÌHÖ䣖¬òÿs±q|ÓqUM“qt SØTÆäÁrYY¢c±=W–D g'Êb{Lye_`á†L.…%uI<µÓ'3tCÅsC L42Ì y°.Ê–U¬{Ù±¿‘¬K¬e6âç’sª¬¢RX¾Ù%~O±ç<ãXónûnï6’ LâÝ)„X×°vóõÙ“²àE‘`–ßc§!sh–!0Ö››~uŠO4Öý5„üãÍaezŸ×1ÀÕL‚91aðé<±U&-JíªmÔMð_µ‘laÆ7ßõ¶Pæ–Ôz¼KƒPæžHÜ´_Î×2eý3°¨†hJÁó ›¾Kƒá.]ÜêRã°"×a­É,é–7ý(·ètû`é¿nÕÄž(&ºYY÷9‘ël0±)²"K¾-v»–O@‰’KΡ¾GHÍFÞ0^æ^H‹½â,á… ‘*&î„þ5fÙXÙÍ+мÂR+BÐfÃú+î  Âè9¾ŒhØèC‘&*—ÏÏÌ@”û¨k*³º‚ü¼.2XÜ +SJ6ÌVLäwA[ÂʶeM$ëw+íüõ×bRªaÊõ¶üœŸ¨JåÄšJ·ˆj`æ¿\uLbãø)ù_ÅZgÒóG±òA4ª,]äŸ1¢¬ªàOJ¿Œ½.cÕpÂ/Ãù[Ã>ÉÏZ² K¦,&°¤Ñi˜²³µlÙ²NÒP„cÇd€“=Ñ!À +¶d½¬'ÿåüfB‘i0¼a¬ËÍ,? +ˆ2é•‘ + KŒé5ô¥­“u‘Ælð<' Å°\ö¬¬·ÅÏ×é…Ø$5·°‡uíŠ34¬FÇšz ¢Êªtt<¢%cmƒ±ÞÜ6液«ù³Dv_ZWÃû Òcw¸K/çº×Š¨äe^RY^ˆ±8ö I¶oÊâïuëtEÅgY»iñ"pÃwË$›ô^³Ðr2A`Ì|Ú®²+‚$ÙÖð#4â×'ÌõoaÃ+ˇ.Ìym¢‚f#Hg;-[j³Œ&Yµn?SÁ *¶^2Å‘ KiLMEK×_lª2•ŒßC!,[\L°0enã/ÓÄðç‘-®ŽM¦3[²vÊ4d‹[p¢iÊÞS²LÎÜpÆ2üIËOôðWP”š¦ Ø0Y"_nIã[tò‰¸³¦ïêIò¸ß:‘šK|Ãƺ Ý?´ìÆ MÐãú1ϾŠ£@@—8 á#»Q\A4¤‹ÀŸ-÷ž‹ß£þ1yËlñ,FVL 7˜ëÎKLVëè'k4‹ê^ÅHé:uÝZÇ¿Ñž¶ý†58€`U]Gð-j£–’1m\T– ŒÜÃô?– ¡DMÇÖJª)ƒ¿ff¸uÀÀsF¾Å½‘2QZæ;`N6;Aˆ-ž?“5},ÈzRÙÄÂÉöF´…7ÐÆ¢l]Ä'Ù QBØÒ1j©ãObŸÝʤ  ⊾-Èk¯ŽÌäѤúfgÛ4ÃÄwY¶L;Z·ô±ý4AX}£|Kq^‹CT4¦E;>Kß(Ëæ–¬'°åѶ±Y ËÝÑu,‹½¾Ø5X²@ -s£&LúÏ¢ž³Y/A™ã„­Þˆ4¸XŽ“”8Ø‚%II3N“Þ9‹ßÙŠpZTv²ëdµ+j_v™ŠO*²ä—goYˆpôfHå…2ϲdf/Óƒêz–…ZÕþA‹©Byh1ÕÉ’í"ÌzBË–Fs]bo”`†µÎú`ú>üÎݵŒóM6‹l”óüDŸhŠ²iÆ(","Û‰Ù²ÔÜ¢~έ¿^"êf+Êž''ñleÃ2"ÊF% ¹?6ù‹å1,£S ¬Z°Y‚+º›Íwú±+ÍdÛØoqÈXV«†åX„Âz˾šðq2¢l»dË:»¢W::ˆ,ÐedY“ÆþH&'ÖjÚæ†Pe·Y "fõØ)YÎl›‘qÍ?M¶)£ -øö#š²$ž •n[È=°‹qe‘’\p{£Zuív²+ ™‚ÁGV²¥¢ +À ¨Md§ˆuË›ÊH'ÛrvŒ,mÛTå³ÒRÁãÄnyÖMÍÌ ër‹ÊYyY™ ‰4¢aŠûõw—8Ê°0ÿ† v«°„¨"ìJ/ô½b “°~Bšt¦ì’ž~æÅôci„…{õ‰Ì&Ö§^CW5ï4!o¢á UÚ‚L”µÖó]Ä`IÄXì"z†2¢‚ry•¯£2ܡª”݈,¡2K[F>T¢¼ÏŒToh4ÒµCÀÆvt]*lûI!ŒÈ0Š/]¦¦RnB£ c⣊†vTáx¤l= öÐ6~ yÇ°ŒfK%bû×3úD‹ D3¤ÕLyHAöÔ @6 t‘ËDC¶ú1esÊœºh˜ºFسT‘ZÛ·a(g†s¦ÿcŠÙ”òòC…_Ï„.vy#ª˜Ì}¾gÑ'Ë~å'Úé*¼™®ÿ¤AM´âU”ëVlºorª-'_+A”`ÇûQ÷:ø€OÃêÞ'?o„׆…ßÍR6›ÑDê%MÙéÀ]†hûŠÓÈš_l©°œ +ÙUL%8*!]¢Ê@>O]5¯Xçà[b|et[Ç|á[ädMÅt6U7ˆxVÔækþ……>m]0cØ~âˆÿ{Y*À­IŸÈ.Mïâý…€(]B<é˜àÄ×Z"Õ’ŠWˆO N°QN³<ŽÜ8Ó‰`>OÃ2$+ +¦Á4•¶ ›ºÌªäõ…œ¸.5à®ÁˆLî>NV4Œüû@´°ß"{–·?óg “ x %–lºšx™¾‘RÁû3sš`ðL2ßKà=Š“•k+mIžšEñê*&%r— Ér›ù}Û‚¬P™×ØQ¨3“ E,˜G™ÆùDñaª¯ìPV‰&¯ð1-ñ¬pØñ‚sSœ\ŽÂÎdž[‡’Wœ 0!AmY±Ç®ÞÂß‹’]^žAÅõì¦W ç…U—”b *ž ¦J "×VG§>%è^äiÚvâ +‹ +þ ÂJm?cÀBD¹(sŽ8À†fò‡mƒ¦ 8H­]L ÖF)m½™Æ6°èëWtYåir~øŽšØ½“1¾ðù0Ý®bÙ Q׈A¨ ~ž|O»)TNMrjÊ‚nêG¢ü „Hl^ +æ(ÙÅNmZÐADeN e÷áa¢¸ŽhzlÌ×´E$šÂi"˜òDýJTÊnÜÃ-à9eþïutÐòš2ß?ð +#¾2O‘²n=XEh˜3ÆšŽ™Ã¶00aÐuVÅQMFœØ¤0gŒ=+!K;Ñðe»¤>Þ3jp3©’Í€b~÷ÆùDÌÿÄ0UÐÕÂs%¿©XŒÎÉ"_ÙÂ×Â>òÕ±dmgP^â‡ui~v3䘺âû2©ì¹ÀÅæ¬^ +Œk%ºL3›BE¢-r®•Š˜äÅÌEª`£"®(ôµýD-\-LweöÁuõÙŠ°™áf¡7šÙp&f.ZAóK•Ùû¼°1ùùjoŸ¬ÈÌZ%£*˜ ‡ÂÙ…2)U¦qkõ*–ó³ùËoPÛ¸±"S‡ŸW̧d÷Çi˜\ŒÝôØP)sЧ~PÒ’ÙÞçò dá*,H^L‹)Ë¢"€Yì¨øw™à'¥& +ìÚ‚ †øfyŠoHYT ØØØYš'Õc‡Ø½FxUZ[Mõ—%ªKˆw°i‘&B,©‘Ôž†Ä–øDõÝúÏŠh‡†þƒEYÌsýß‹N†þæŠûˆå{’u¿¾/KˆéÿÌ×h6Y{,)‹La~ »fpåo9áùH²P뿈lôÉ G{™èocËeÊDDš—¼¢³ŠèòsÏ °î#ª Øeœ²n×–ù÷Ä`N•'ˆ¦dP¼}‚hAp¡irU&üÌF¿HI Kt±Ñ»Ép-{mÁ‹:v­Eqà‰ Y"B¤Z%:¦<ðújH²ª­¯!²—1OWÑ‹%!)¡~žÑð.^¬¬]Sª‰' +«À˜ÃLf3cÒE4 ѯ'œkºµ˜ÍœvXx#Ò\€¤®O“e#ìÆDY=DDE,»Ü[Ç6=Ž(ZSòM?uhc-?Q%>Ä.A>Q`çÍÊtöU¢6^õïƒð‰ŠdZŒÇ&0LIÄ #Qdû~å¾L$&ñ† +~ò[U6_P0½•0ì#LÂ$ +šaXo ž]—wˆTæ55å[&ã×}á„jQ0ÉŸ‚.Z"Q½ŒÞ1*ÁúE°#Z(° $›•¶!ÏÖÎ`¬.×d/z›bÒÅÆq¶¥m†×søD,ãc[‡u 6Áž²¼—³ÎlçÜ(¡fþl %*†Qz¼RÇ–á_ÎÂ%Ïü(²ÁÞ@6ÏwCÙ%ÚÙò¾ö¢bÐf•ù*®€lÀ"RWðBUŒ*`K~Ç8,Ù XüÁÀ"QA VÈ’u¬eƒJ¡¡ § ɇÜbÅTY†îc>Þƒw³úDÔ•œËůuV+A«XÁrÙ"ñ£&&¬ºSñ0ráCr,ÞSyYW±§ƒ¥¡Â@àÀº?¨XzCÍuŸSž1Ct€¶d’¯¶QÍÿÉ°1Ÿ-±¨Ïæ÷‚LürB®a Fó×µ¶!ì*BEs]`̓-𛬳dÈC‚}C¦|4lDZÔf"å½$£CMW m¤Í‹fë‚(SÄôÜHC—n L°×uôÆaÓÝOßïñ9|CõuS¿ÍÝ=Re–Ar"†šøv ¢)³Ï$’ddŠ¡1l÷òD5¼yDV†((±xŠâž}Šd™xoË°«løñü7˜•ª ¿òšfÔX˜È¼&R Å×aknÀàv` ö“aÙ+c\Q–+¡˜Ò'–ì})¼êåZœˆU‚¼¨>ù·JýEJ!{VDÓ9Q–ß²ÂG3Øè%)»¿èØš‰SQ›ëÔWñŒhbCjØIòó[b= ÒÛ2†ÅV®çäçf%:I±B.M°íE¿1).„ׂ3˜É/ MY‰öKEg†¬H­ñÙ—2þôýØ¡~¼ïÎZßÌco$Îóܬ>°‰Œ~ |ˈšé´Øòþ£l"Ìýga¼Å‰ˆ{ø4{ã&)Ñ8éÓy­[æ g¥J|;G¶ÌW1ÁÃÒLìp­ËâËÝÈ "‘(¯¯cd ñ:Ýh¹oز)‡èUgÈ^µD–;~:¯õ +kòJKŽôq……㘧¿àJŠúz¬±E]‚ð­ëæ¹0²ÌÎ3ðâ k#š‰U ëTÊ­ãý)XÖÇËHdº”j"ñ£éãwY2ÍÝöÃ-Ø«‡lécµ("—Ü–LÍ®`°0IÄ°eq²˜€}YüÃ×öÅûdëî~DfÛÊKB¨lt`ÉþµŒH1ßÖ±Þ[Ž˜¾Iã‰ß‹F ü¦1‘ú®ÈDKz?~ýš°·+ñ2‚jb tžƒGmݪÜ4ÖÔÆh¯{@JV×lÕ”31¹F”»bu¶é',Á+h,UVeŠúAÞ$O‹&+ðY Žœ&Oó9`훪ɪšçå­[}~80N˜Ë]Ÿ,ËR4Y©®éËR´õ¦µžº£ˆLlgƒx`U”Ÿù2)eûz.îpŸ0øθlÇN6¾¼Å@ûóƒ &бSö¥¿da2²Qq}íÊ%ÒÌÊ7eù+Ví±z›]˜ÒŸÎ^G±á¼!ZœéìR +¬G䱎ÏN 1Ÿ&‹•DÇŠ{AVe¼¥ÅUÔ¿UÁ'Š’~æÎEU©kØÄ«ÛŸÛzá°r[´Â…Ó¥“ty·÷>ÊšQQ@ˆ WhÝE¶ –¹«SÇ>š'µ;¥X÷Ê5 jwBpO •{ʘB²OiËŽéÄÀBzž/ŠÓu UeëahɳšsíÁZ×4¬Ý“7D[Œ­ùÆŒ.“ î‘,¯kƒÃÑÅÅä,YÑZ_L¾N}tmˆ°»¶¾°š»Ö?÷.ì>nasÞÌoãddÑ­Rõk4ÚH–ÑJ"Êg, M6æC ~I K]Q"Õï[ì}þuëëAO°%M6[AÐÂÝ<Ø^‘=ST¿3Vûócàà†lÿ©ù57÷‚ŒKÍ/“ò‰è=àÝôУžM&iüò¢¬vÃÓþé ØúO¾ ;‘èÎ|öÁ¿Ý9®<\”^¿{sÓ?}ûöòõƒO,]^ß>|@ŽLNï//v8uÈ;j”5Š…ÿŸ¿_ßT¯î(üÿæßÂ4á_î€ô~GUv:;«Ceç‚=?ü"iò^ ˜cAåòË»Ë/-]“Û’mÍ¿"§½9Äg‰ëàÃ/ø)€_AVöawŽú.BÖ.I³@ù€öoìTMEgYŠÆ(,ÿÒ4m0Ó)¿¶—ùM`ÅM‹0#t2k5¸þoØ’5ëbF+úöƒ3wÁªnÂRÜí0'¬ˆ±Óa³ånk+ïßîkÖk•›äö£õ*ûÿÃ, Ô>«ç±,ʦf¤‰©«¬'»à‘ÍNÓÙ_Öí„÷zäþiÉ«WÒYBo¼9aöüSü4öðÃ÷b;x= ÌÎö(÷bå8µä盓îýÿ=ãÓOXPLž»%a’«‘ŒÇ[ØIê‡\gû³Läyþ‡Šv´ÊîmWˆïDqwÒ‡ÏZþµzŽº&~0ƒM²œízÔÍÏúpÎ?b¿Ø~2HãÓÆJfö +ÞRÄõ›7Hë9Jâúk6†[÷Æ›7׈°;Ðtó“g5ÃR?uMüàý›d9Óõ¨ëúøÓÏQŠriwñ…õáòÉÿù¯/xø±Ey£ê>„ƒcI×>àd8ºO6Ø¥AÏ…tâîAXZ•™*òºÙæY»ðßÔoŒÙþ½Î|­tðËÈìlüÙµ¸c¡Öy|ñ¡¸C2å6ëjjXÁU,Ô»~Ý×(|Xr0ÎÊâ-åÕ§n‹4ןé}á“9†X/Ê'‚ë¿æž~±)¿úƒ‰n¨=5?{“mÉdD5ñÙXì;#š¾ÕʼnÛ¢sÁ¦¡˜þ"pãô¹×bi˜ü$À' ‘guðg‰8ˆ<³ÒÀ—™ÌGõ¹Ùþ’´±¹IüÉw±"Óúè»Xàˆ©¾‹$fê}ô]¬t„ÕA~ô]L0ôëóú#™ç\ðe6+îÔè‡_öé|ÿˈÿÏÐKÓ>¾Ô÷åÿ+Æ»%le¨Îý©|f׃]»ùíþ‚•[ êz˜Ï7†`@lcŽ*›#|´y\½}~™ñÿ•ÿðô |ú°Z0×Úéòå×·ç—ÃZigÞýbÅ‚ÁGHòã§_¾þp‡{UÅb¿½ù¿šý þÿ =ÌNµùDþó/‚A>·òéÛÓÌs„©_ÌÿîNâ´•Ìu¬òÌ®.lo¦;ÓtafVOHóÌ,/µÂ(n5 wêv/³ÍR?H±L;F›Jq ¹cä3íLešozëBÿ’¶Îíæ™Q;Évnã™N $iÂ,›¥Q¶}\Üæw´se4Ž’î0l7JýÓ\ûP-Žòí+oø¼:{cÕOÔâÜn]hÞ2™íG­†Vš[µ#R?ò&ÏÓÞ|G)ų=ÅÃä#FMÉ +í³Úìe¾e5£™–â SÅ®Y‡HÕ¨L˳ÕÕ7ÓßäÇ/oË÷¢™veòÐ:ù¾²z[ž½j|—ëßiµƒH¦mUWº7KæzA³TÜ­«ù¶]›åi@uá]š3‹ÐN”vã¹¾^^ÀÄ oFk†7WÝEkñ¾2y­”VaÚÙ׫A£Ï´ÝÞe¾uµkQ³š­å[g–·ŒYí°VMe:¹ÚAgùÞ¨äz´rR+Û±\Ìj%h7I»‰Lß®XõS£r¤—ö´jØl&3}%?Ró#R9„¡’´§;óé4V,™Äi'NÚ¹úq¡y¦FÉÌ `4žÄrOc¹½´L»j¶c‡¬¡Õk^š6÷ÙÇasOq"V~#]ÝYh…I*;ë5س²Ld:{‰\̬ÕÊ^ÒIeú¦w ;K»|”iœeÇÓÓoê³Û¨é¥ó£lóÜÝæ:§³Qà=Íå:QJ‹°Ý u»¼ô7nç\Ít˃k»¶Œçºa»žÎhã,Ó<·Üq©sÒÜ êÚå¹Óžißµ3³~n”W¤²4œQÔ(«ÅAqpS?üÚ<äz°G±lÓäÙûœ½Oúé|¿Ð»kÿ¶2ÿÖ¬'òCàáiÅI3j×£vöHu§ðWÉü8™õê^ºÓŽ`þ‰U§ +Cµ4/ônßÎ:~õçt©Ë6róòâmçâw•Õ7f묟êáõëY<ÿSÂ…­z±ÿlpù§æÑOfãÂlœ¥ +#XÉd¦«äú0xP/o' +Q«•¤m؈D~/YLf{zi«­V–Éâ$Uœ¦ +Ó´»P½)œ­´4k'QÚÇ¢v+j7ÃFu/UŒÛ ½8HeÛQ«Ö*q£‘€¿ÒªÀHjvÔ›¿nN__íF³Áti7ž¦!­’.*­Hý\u•Â"W¿.4¯Bz5I;éÜÀ(-€Òøü©ºýg©|ÿQÔþUÈÎÌTöe±y‘ÊvŸDhH©Ä­öÓhæQPßJo[Þ]9ÔóÃíX¦‘ÎööÓNPó`b¤·§Ô£V¸4åL­Öeº0ˆh¥¸Uß…EH”ì 2~U›¾­ŒßÐÚqsòâÇ¿ü¯§¯ÿøwÛñ|÷jpñ›Öéwvó$lÖù!êÇI'hTöµJÈlÀ(ö. +íS£8$ÅÉù‹¿ûç!»¾£8¦3m¬¾«.¿1ܱVè„”’’í¸Ý ͧŠ“DajÔNþ³úâM®yš¢M§}Ò +!ÅI“¶á(Î2Nú »kyÇùÚ1ÈŠle¶—.î¤+½¥§ð±°¡iï8•hù^:ÛÝŠÒˆVVsCZ9„ gAË%8¡ç?ÃÿýN"Ó:ªNïÁ’ ÷œE"?N'A½’?Ê×A+MSÎ(ž‘2t›'Gw¿áÚPuƤ|i^¤Ùž^ U½8.¶ÏJƒ«d®OZy®Wwn–R¹AÔ¨ÖÆwƒ‹ÜÑuer]^šµU¶s^ÜÀ? мδ=UèŸïªN@++¹q®u©—–ª‡q2ëÒŒú³ªA³%R=Ëwni´öAº02J3PX´¾Ê´NHã¸Ð¿õæo ãçJy^ž¾(OžeÚ'NÿÜj6¿=|øëàòwš7 ÙY…ï‰ú4‘ß×ÊÅÎMûè§úâ›B÷Ä»áLAì€h… µÊ®R +é5P‰LO+NàKAëÅ ã”»RKǤ~]ž}H ‘íUÇ/r½Û€^ÛM{{éŠáεâ˜qT¶£äÇ gÒlMê;ÑlT«F´J0åì& +©LO/NÃz}7éî§Ëa­bäQÐÚO»ñLÔŽCv+¨7Bz#l€N„E8Jeû m¤«83«vRD:cý±8¼© ï~÷Oÿ“;¿Þ5* jw¥”–ÙÆY±uN« ¥èUØnÓ›Á!Š’ü‰Y ^z +œÖâäQÄ(ð9Ý$`­â< Öbv?•8­‹lóðq"·—*Çé8Ó~^¼(ôžÓÆyº8D[Hvã™ýT>dT gF¼ñ–Jf5›£š%˜vbVtß^ª´p‚j-¨Tµ¤±»éÂV<óånz;ž ¤ËÔhØ5•ƒ©$ëþ±¶x@:n5ÝÁ5ì²BÉ»ÃgÕ›éÕO?üù^<ü6åIó8Û»ÉönÁd ­³ÂàΨ~A³Û Sœþ- /R;Ë¿pz·G7˜ßý)LûQ:нU¶q’oŸgà ´/j“‡áÑ7ÅîE"ß7Ë ³ ì¼2{Û:þ!ß¿®Lï¿ùé¾ÚJ» 8Mí @ì Q“AÄ3}ø÷}¥”¦mZ?¦Í3ó&Hgaxl`#öÓÅýT!¤Ö6Xå#›­åûlóvø$•ñ>‰ƒzM]>²u :ØNžFí½d.¤º1«n8“<€òõV¹Úi‚öAF%l@•Ýd)¨Õ€Á@¤ì§JûéR‚´A<†ŒÚn2¿²âV+*oE ; 0­Â`›€^±¯'QÒ†9›Þ +l `3ø¹îLloÒëAÅ ‚J•`þ1³  k?å†ÒhÉ'a DÐv ¤ŒÌþ sˆš àÓ™ƒzrz7©\à½æÎô¬íBÉBŠ¼ +“ÔòÃT¦½•,ÀÔK3»<á¼—*0“„dq{‘m^·ê_üÁéßo–¯L®~=ºøÔŸU=°kùÎiu|Û=|—ï]ü(¶NòÍ#ÀxµÉËòøMyü¶ØáŒ^é•´LiÞ=z²k€ÆÒ²{üãäú÷óûšÞÿ‘öÏÀØ_þÆ›½Šä†Igª—Wåé«úê[0Ö²í+˜R®uš=J: úLoQž¼¨/¾ž^ýy47S½#P„7#ÕR&¼)t¯to Ú–Öö«Î¤2}9½ýSiöÒ?k½KGûZUu¦À~`‰ìé^ÄnZ Õc°øÀòÚI©;­Ÿ©îd'Uݤ¹KB¤z’4»»°’@Ôj)øy¨—lÌáÀTvëi¼°“*…í¼þ3n÷d¼¯T÷UÏN<0ÀìµéÌŠ³ÖìM¦v±:!Ð}vW+δÂPkÊnÈßM@i&8ú…WD´ª’†ÔzD«G P‹`ƒ‘8³gzvõ8,;pB¡}A* …Æì¦áÎ +íKXÃd¦·ŸrBj9IzûÉpÈ1uûI$a’tAšmÅr |CZþì%A––àEéì„€:-;ÈUöTïi”> YÛáLÌj‚:ÎÖ@íî¤X´d¦¹1þa+àœÛùyœmže[gji*^Ëõ‹µÃÑÉ·îè´^¡{mÔ•ÒÐr±³²+0íóL_©…1Þ @#o•ÌO‚V7U˜ÚQeø,×= ˜eÍYÕe¡{A›Ç´}¦TV©Ò¬<}9ögoöÌ+£~¢Wò½kwü2?¸ÏvnÁ܆磴 ÜÏt²íKgô:Ó}®ÖÎôÚ9àí€QK凴q¬•&`,ÖAšÎOÝþ ÍGŒJ¶yl€çŒo®”—`ó‚Åêöîó·ÑL;B‰\7‘ëÁػ픷«”ACe+ÕámŽa„ÀvÀøFyFw8] §½iÃîl…­°V6ÜU¾ûmÞ’ò‘Q˜Ø)ÎŒyË<ŽØ_…Œˆ6ˆÓBóÌm_äÛ§± ;2¹ö…Z™ïkÅT¾e–†¹ú2×:®Ì^å{W°A¹Ä CÀóÉÂÐ(T&¯ªÓ™ÆqЬî©Nº8H;ÃH¦Xp€‹ZÇ?—àÀv.“ÅAy|ïM_2.ÊvI㬶ú¡sñ‡ìè^-/€¨ºÓ”; +’z¦}åLÞåÇï²À9åU,ÓØ-–îèYÀ€í‚R`æRLÈé^ÚUó£Bç +¤ÓN2G'•å×ÅÑœÌ%ø¿žoŸåz×!Ú~š,÷‚ôƒÓke–æjq {ˆ>ü Xñ6Ìí„ÕÐs}8°ã°; "Âf–4¬ÃÑ)ùI‚ @¦=fð&­˜Ý(%H;)˜Ìy`ª­X~/Uäšn[)Óe–7]R=0ü÷SÅ$iDÍÊ^"“õFÅÖ1hê€ZÝW*[±"--7 +kÞ¯vã +m[Î$ +¦½ÑØÆPJ½BʇÅÞó°Õxµ÷Õ’UšÌ™ÊtŸ†éN¼T+ÿ¸—x5Š ¯š„Òîv˜À¡¤=•I›Q©{‚w;‘¶¿ hL~Ú Íeê»Ì××"åqH-< +OƒÉ­Õ+´¼r@nÐz\-x­ƒ€æÁÄ¢Fá=gPT¦n•ÆA£ú>?jÕazð/¹æ©Y]F /ß9RKã8mÃÙÓ¼ YÖ<ø>×¹Ò +“òôY˜Ö`ÁÃF ­8¨Lž—†w…öIuõÒ¨èå¥Ý8M¦‘L/ ïðûÖÉigb•€‹À²³Û—ñÂ(œé‚–¬LßTWo­Êpí]†Hs_«í(˜l°Õñ-@þùÖqØnî$KµQ‚t+ÃûÖòU[%ÌZ÷ðM¶²«v5o߬ Š3Ÿÿfxóg£yæUeò,]ìGLE`ØJÝ™µÀÊ«o'2aµ¨æºO£ÖlV"¤\*x¯¾§dÙ6裸ݎ۠×êû©Ê~`íÜ.Íú`¡¶ãy`ňQQð„YOZ=&õx¶ f/l"³È).üSÏ÷¢zÙÌw›£‹(©Á^Ĭ6k ˜¬NÌhîD‰U¥ìF0í*™aÜî&iOÍÀ.€s2Yw!½ ˜g_q€ÿé +¨¸Õü¿›Ì•BÒ†ÙÁ¾{´¯ƒ‚šd”Ó¾øæÿK2ß{´¯î'²€Þï+¨Â€Qó°¿zÝ?¸L…¦•«[ùn:R¸¥·›z~0<ùZɵüHË âlGk/OgêNëçN¼RjI»Ì´•|ŸTìŸÎxzõk«:É즊»°¤eU;Gßàq[ç×ßþ·Ûj>¨ºJ¶§ƒs&™Ú +X«Ð9,^\~ó/´sº«xa³6 á.¼Ñ‹Åó¿vÎ~VJ 5•¦±|/BÛü¬úqqð¬uüëòòmcxóúÇÿèÍî¾ ™!µ +ˆì8`ÅBçÖ¬€œ~Ëë¹Ó¹rz× I­Âxy÷[½:ür?ߘvÆ BíÚrqûûÙó?ÓÎy©urøü·AËûÕ~êqP׋#˜ è—rï½Æ`ûQPÝŽ‘`ºäv1p»RŽ*—†W +(+¶b€ÄZa–«_‚©Ö4ÀQ„¿ +è_í«OB&è\ ÝÖšÞA"Û‰e›;)P£LžD´2X[ !á¤'í¦Û:ªO®vT‡»Å`.í Ly1­jF¥ö°‡‘ïgcÐ6èè RbŠŒ½¢38z§»£'t%;à˜ +àà(³ÐÍ×çð/[°•‰ü~¢#識}¥ 8íäÅŸ÷uw?FtÒÚO枆 hO¦ON*?®Ï^¸½³°¡Ùe+ßHÞ“°½Ÿö wRh‚ÙÌ0‰™ÆJ &àFÀù¦;ÎÖW ÒwE€‹À!Z¡ zÓ(ŒjÃg€êÍò „|:ÓJҜوÝPŠC°|ö)0OЮEИ‡fi6‹îN” ï—?ÿ§âà:f~¶†L¡qæ_[ &s@›[­ÃÓ3½Isþ˜- †pqbÕ–ßÿé¿ÿ?'—ßmÅs¶ X—¹Ðw•’U¹p/ Ý»Êê›dù0IÅæ(ô=À¹¼P:`§Òð6lWŸF H!³ X·ÏÔÕÒH)Ug8;xý—ÿîÿˆeê‚š’mUÇ×ZqP½­x{JÇÞðÐèšT¦•°kélwð-ÓwÍJ÷òÍÿK,×y˦²=0lÓ™~:;õÖkÕáÕóoÿuzõã—ûÚ〺')˜ÛD,ÁT~ü™* ׎ + °Ôvc8!e·‹ÓrïÒ®Îv4&ÈÉÇ b5³¥Y¦4+Öà-ß«.A{>à´§†'e5Ád£Õƒúô9c8æûÉ| •¥KdìD°A£ës§y²ˆ}iÄ~4÷ø¢¨Ý j•}Å}Ömgê6ÏAVÿý“ÈÓ QKzqe–– ¥á™(*¥ ˜®ak;JSp`—óv)•ŸÀ‘|¶· =-?PÀÏöA$îÄï^N•\[ÉvrÕUkö*Û»RKÓd¶›d […/Jç{ÀT¤ºÊwÎH ŒµÃtaè o+óÛ¥©]]j.(»YypiÖ–»zmO©‚äs´-(Í}ÍÕÝ1©.`s½«¤3ÖËó(mî«Çîà¶sò]ýä‡Âä!]^„,wmfŒk¥=­¤—Ôuï€4¯Sîʽò†÷®B†—È´bVÖ-¬7#&Xm0zéIÔü*¤lEMæ9~Q_¾®O¯Û‹»@Ú咭©1žD´ýt–¢Ø¾¦õ3«z£°ÄÁü ¨Å$¡’*XFǵÉëæÉ÷»:C\p `؈¹µwb6"Ó8,®ìÚQ”´ãV5”áÙ +Y`ÂFÀ¹ŽØÝí[åoôNqg;‰|X+ª‚ +0ív”ôÌêYuù ÈØôd¦L;[!ÐËù”^‰ªe-ÛkŒnƒ*ìE3 Ã’Fˆ™uuàíéhÎN“ší=ÚKíE³i«7k ·:ƳûI±•Ò8Må|D +˜™íhþL2Xàc r/ ŠTµXf;Æ ç(RÚÍÕNBj%˜tÊÑ“p`r'’ao·Z`0> “½dq—yVá‹*IÒ·Ü`•¨Ñ ¦½@X«µ@׃uÜ €) +º¦}‘©Ä `×N®y ÈêD~”ÈÏ”ÒauúMçô·•Õ{¥82KSQRÉ1@/ž‚ÖÞK9ZŒƒˆ]#•Y¶ºÌ4Ϊów¥ñË´;ÝN»zeeTV á\çÇ_{?&¯á¯â™¾âÌT¾z0]<¶·êýTè?SŠó(Ñj –涶™‹;;¶«gvõ4ÍDð±Ü÷”âÀ¬-RÎ@e²k‘ÎM@ÆLvÓY6½ˆUÃÔϲÝ[Õ]$X¤¬­¡Yf®<ø"°ÂLwEZq®§p^@ŸF”Â~ÐKr ¸‹´OÂÊè¥9 ѪîÛÓÜn,»Éì¥JÒM†wÏŒc™±^:¤•£¸]=kPÌ^0·5w§]Ù9›@ýXF±[i£N£j…xG©Ü8•ĬæcD„Z˜¨Å¹U9,uoœæY Yˆkõ`ÒùÇíäß=? +h £@;? + ì¶xÈ2M{»I7¶FÊy´Á6 (•€R‹èõÚð:[[ÁéÓH$*À'À„»±pHX¼h _?ZO‚Ö^<ÿUÐüÇ= YD¯Õ2lÁ~²È|ù |]XÁU ¤¼ˆZ7œiH+ƒžE†0ñK½Ûtn Þ¼9¿OºÌñ?l\»£·ÍÕ¹Þl=œôÚäžÀ”4º%ۛ盧ùöµ]>¿—r©»hÍ^”foõâ Û>ÖX|í*ží´J2Û ‘ÖŽA=Á&ÞKf‡QÒ€íf¸k¦³`ãŸXå[­뀹ì*çÉÜ4f·ö¹HÚËUVšÓù1*™Ö)i2}4¸áܽs‡Q&9+I ì©Å؆`™ÔÚNÒQÁtÕ½'! ÿ€QÛ›.ÁÒÅ™?gº2¨ÖíÀÀ`•°Ò[!£i\•GoÝþ½å-3•C%ß{³Á>Ý×ʺ3Ö +}RžÛW1½’¶ªÔl‡Í'ûÚ~¬@=–G¦°Û˜Ù°‘¤Ý=æ=Ú3 +³¤ÝÓ2c`§¿{ýûÇ‘½XãW»Ú?l¥wb€ñXØ~ºœÌ ¶ů‚D-ÌRÙa*;UóóÊ`çp¬×:K‘ÎWãѾŒÕë +íëù¹–‚Œƒ4ããVÊ¥þ 8z»É"˜ŸpÍöÓ`,ƒ~¬‚2…ݹÌô·“À0`—ƒ°©ÒÓH6¤”3ÕSgp4àá²á-Mo•Ã<]xÏl§0x+“{«²ˆµd¶§LCEÁxT<€¸´|PlœçZ§;I’ 5ÕZõ•^c¡¢LýØé^e»7É ©¤s½°UÙMöÒE€XÉìÀªŸ©µ“df|zöÓÑýVm_-3ÏC¶_hžé ©öÿ¢Îì!*Xm¨îa¶q®;SÝ…yųÓ™={÷/7ïÿ£­íxq; –xÍÈ÷`47z®›ÐËvi²§¹_EÍ­TÁ*”Ï@®z·1»A<`ÑÙVœŠÚ½t~ H8'ÉüBnš´ÁêߊçZæ 6~¶|)iùyÄhO“N ™Ó,*ÅYŠÙ˜­°ÑÚQjQ«ß½Í–GûI’Î4÷U7¤wãÖVD‡ã¬fÎ:µåã€À¯”B)@S9TÛ²ËKdë'q&B­¤Ù¶ Û]¸° +‹ˆZùÇíÔ£]}'ÆùW»z0Q +2RŠiðÏr‚ôhý"‘õF<3›­=¥¶*ï«U`Ð^÷ÔX +ðE L÷â0-ŸŒ`<3êÌé—.…ÕŠÂ2ÊÛIÐï=ÛU³]Ø ­DìGX–í¬va¦­V@¸¥2}5; º¦{ ‡éh°ˆM€|50mR`{fºO¢ôØÉÂvº2 ;ÀªêÌ­Úñ¾Æ‚¢õ¤]ÓŠ=lû<öim|o×W_Åi”t²Í“lýäØjÁqŽZ8éœWHÕ*ö@V„Ìf*?¥‹B÷¦wò£;µ£4­e›g`k?‰¯Âæã U°ÁÐé %?…¸ 8!bÒ 5¥0ªLæ7?Ï¿sU– ]À!Zìè.u§v~@ £|mµ‹ x1Ú˜,. ü“ožG´¶òQûiWs¦©\8̨§aàæH*X1·}ZŸ¿ØI 3Õ¿„´i4`/˜i–rwã…/w”_í¤÷b¹¸ÕÖàë¼EÒnD5/Sžo'èã ²§ŒôrX)E/H;U «€»Œ/·âdˆ1­ff‡™ê’¡´GK³\uƵ33NáOÃlûXRM,Úø¯¶¢w`Q+×1rÝ$íÇÁ¤ÃBëüi"ÿ8–Û×ë± sÅðpÏU¾s™ÈA•€YàÿïŸF@Õ&ÍZ\¯lGs”HÁ.u8}jq¨äú`ê©Ð˜Ì Tƒ‘¡ †FJ³8í°e'LdðtÇ„[²‚4ĽÓiøya°gT·Aõ5 p…UßIÀÒ/®ë‹WÞø>™G¬ã`~F 7Nk° UóÕÓÚè…Q^ì›Õ”Ûœ½¶+p®ËpØÌ3Œ‘–Vƒ9cº£(mƒÙ¨—º+Å ¨]0$F5dÔá?w¤Š ·SùíxfУV§ÕcZ;£ö1¬º2á ¤ £¼tG·ÅÞ•V\ÚÕr_´íIÓ6㤠+0¡Ý<Ë ‡”bŠöÁx§•%,‹R˜‘ʱíÌ™IbTà„¨±Ÿ(î%ŠtŽãÝùýôê×_¸el9ŠYííXôÔ^ªº¯Ôb8¶¹ÍíD²[áÌN4H:OÙ'!H–âF=[]ÇäN²l:çq@ßF` K]ÝO;O£4˜.âê÷Ò€âÀ–^éöôµátÿa+øåÓH¦ËîÅ‹{qŽs@)¸íË­ÈNÄÓ ÈèY57ÙNë§Õ@Œ?ŠäöT–[à¶ÃV$f«æÞ˜¤Ô*H?#;Hè•G{K-ö¶š,¿ËîÚµƒLëÄ,/6¤ó­´¤­3ÚÚ(2>‚«ŠàÔ¨Ù~¶¼ˆiÎ~<—°:€·"YÀà Òil8ã@,ów‚_nÅv"TeJ¹ »o–£&àºävH³r]@w³䃵•^c«(OfñÄXìý¸ÅòWA.ñêÁŸ Ù)ñwO¿ÚRžëÕð­9 Là@Ûj¹°%0^„Ù›-øœdnœë\Vç/K£;wpUž=7kvã$Ó¹zyúP[½k}§xÉâ$]Ç3=°8˜ÕæLã¹^†“Ûƒ|3k`Ç•E®}fVÃþæ: °®huátNKÃ[R?¥õ³´ü\è\,.;<ù¾Ø=O1[l²Hq&™æ9€d°ÅHeE›‡!>iÎ>Xåig +<Ÿë]g»W +è8³µ¯À«‚ð!õCÍ›Gç83wôÐðO@e9pØ» o‘† Û½XT|m7‘Ó‹£cãN"7Y]8tùΠֈÙ@Ô+; Èގ瀵ŒÂTÍ wHä˜Ê0›À„À],´Tœ+…)Xâ ëÉbܨîD hÕ˜ÙŽ²%ª س]âŒÜöq )­Ì+“gÀ<¡æ!|rœE†ùÆ +l« àœLvЬkÞA>9ßߎföb WíGA+ –c,{¶k•—Þè¾:½¯Mï³í‹¬ƒY kå½´¡=°jIë<׽쟿//îÁ*OŸg:&°ÄàªyøõàæwÕÃo2ísÍ«ÙVmöœ4OAJ˜e@³|÷¼Ø» ÍÃÒV~^èžW—/²3`?xWyþ²{òmëðMiòܬåƒòð{Zùs {šmŸºgƒÓo3í“Da¨•ìÖU¶ÿ¼0¼Ïto´Ê!è»|ç¼¾|©–Æ•Å›ÚÁ·vë<íÎHóÌF­æ{)w˜v†ñ|Oó&ðX¾{êŽî*ó×¥É àUR92™ÈšÆ2}Å]€¤ +õUóPqÆA³–Ì b´2œ}TõÆ$µ#£4}£¨U!•Èótq<@ª‡•ñ³Òð0¡UY‘ÆQÒ™i7DaÀ©;~^Þ¨ÞlŒP †µC£~\\—&ϬƑYÁ;Ö½QªÐWœ¬¡3¸%S˜†^^¤ C@‰ ÚŽ›õ4iª`M&…³V=³×,/aåõÒB)NÃv/ïµ[ðµ8ÍԎ˽0âžDspô€åâv48X‹ÙÚaytÝ8x¨ÌnKãóÙ³ËÓ{°èãÙ¡]?! £6ÎacxQßè•E,ßÏuÏvÒeø +øPj© X¥¸]- NÒùŽ]g›‡víì88ÑÅþC¾s «2ÙM)OÈ·Ù]Ö^fûWÞ졾z•\ú'´¹t†çýËïz׿.Ž® ½³Rïduÿ»BÿR+MA@å;g0Cw Òà,×?ϵOûÇïfw?§¥œ)pcuþøªyø¦qô5éÜÐÖM¦qb¸}Íé§ +Ãlë¬2{^ž>sF·©Ò”}Nÿš4ìÆ!ˆÍüð¹·üº²zW?x_š¾p:g«ûª,߆³=»~\[~][½/Í^»“³¶RÝQ"×…ã̃ ìÐê¼{ünxùCûè]÷ø=ÈäX~»mŸÃǘ‹Cw'«É^M懀=@ڨőU^d§µÙ«BÿŠ¶Ž€Q+Óg´y*ô2í³\ç Ž3~ Õ9ù¦qð¦<®7vôZ"7ÌÔáùKgüþ™* àÉêìañì÷íÓ÷¹ÑMýàmã>çmqt×9}ßXÝweóÞÉËÑÕwÕ‹T~¨—æÌ\Y€±ìöÎ5gÔÁB©‚™l_ìßæºW àí¥ñ+©Ì€?SÅ¡î-JûéõÏãëŸíÖˆ8Ý`¡´Jœ6 wT^÷®¾ÞütðêO·?ÿÇ>{씶OÌêQØt”iUÇÏæW?wϾ/ŽžÒ‰À™u-׳kK@GvDÁqcù²{úucõ²48‹Ó&hŠlç +¤}š¥¨x“çÕåCøE·ÇFÌ·eqx•Ý9“ûêòÕàòûñíîèÌž4î««‡Êê¡q ûxÓç@«N½ñ]÷ä}ÿú§þÍϤ}–*Ž«“gjyP fy\_<”gwý‹Ž¿þëõoþsçòÇÁÙûûÿµyW]½n³zõÏ£»ßo·V7߀嬀¨¯—–ùÎMuõ¾sùÛéó¿”&÷ÃÓo¬Ú + :»¶Ñ=ûyqÿÏ÷¿ý¿ùËÿöüû¹ÿé?Ô^”&7ƒ«ïû×?Ô_ ¯¾;ûú_n~þÏõ£7VceVg™æ²:^™¿˜=ûýòáÍ£7¿ý–/ÿhu­æAezÛ\= ®¬ž|ß¼øÉY¾rg÷ðŸªÛ [üËäá/ã—ÿfôâ/ㇿ´O¾={ó—öÑ orÑ9ÿ¶ºz[Y¾©¼]~ðúσ«_{€ ‹åZZy‡È^ƒ¯¼ÝünöüŸh ê<¾PÝmLÝáE÷ìÿ"é=¼Ü6ÏüßâîÝ«¦³÷@ H v°÷ÎáNïEFeT,K²-ËÝq]—ÄݱS¼qâ$Ž¸'q§n6ûûÝÝ{Î=÷>ô=‡GGÈïû<ßïç /zÁêªPYÕ·²Ý=€w@ù2è-¬Ó±I(±¼®Ÿòf–Ìîì Ž —gâÞܬ3ÖÆC52ÒA…’ÎDhÀ*ms¹˜áXû”Ý—×Ú9#!h,£+EG&’ÝÝHk#T[MìŠ í•K àºß†ÁÚZañR}íÎæúåÞ:RÁ>?gr§ÿú_—‡š©Éó±æ¶P^ÎNíCãˬ‹' *JÅ:by55u&9µonLº™ìlÂ$kHÑêIAÕ¹3sáöŽ¿´âINÇZ§”¤¨²Ñl¤Œ°‰AÝꎉååâÊ]Åå+“Û7/=ö)6pq"Ý»ê/¬™œ™-:B-³·¨&b#Š›Ý`…L¬Ê&'¸Üb ´ +«uÅÅ\ïþçÞ¡“Z‚+™‰=:ÖsÆgý•m&5ÎÞY¾ª£¥ƒõÉj2TÝ +×OKÝýH}½·usþü£h äK÷r½ ¥ÅƒâÂ…d÷TañJeýFaòìÕ‡¿/”—ŒtÔ›h†*kp ‰ÎéÌ̹ÂòU©½Y›;ÓÞ¹‰r©ÌÄFeåŠPÛ$â]ij¿²qKìœs…K\ºáf5„€Êd¼ËæÜÙÙP}=ÜÜ¢D{É_ž'BUW´iö¦¨XÃh3ñNvúr °ª§Bˆ?åMM þ4ÆçA‡A6á½Ù…hýT¬¹ÃÄÊl¬‚ E:Ñá‹ ¾Ü\¸²’l­Mm_¯-€ZÚ}YX8©½“ŸÙO´¶ÃµM¾¸êêʼn3ÅÙ *Ì% +%mkþâR~ö :eëòãÉö¶’ˆ8c”4e½@Æg™ôF¬}ÞÁåuFh $ŽÏN¹âM.7C'ÚÞT7Z]ŃUp1è(xf2R[ ägI!o¡£à†ÒÄž3\÷gg…yÔ_ðg{buÙž2z‹®x;Ö\ +=»/%T©h•ÏvSݘ|6ÙŽÖ—ÏÞý,ŸëÁ<ä§Ï–W®%¦öƒÕ5.3cç«À·±ÒêÔÖ}ÁüŒÚθ‚¹x Žålqá\ªw¾¸|„5::ö„ +…A'ç3³w¦¦|Åu_e×_`¥N¸0¯ÎÉm츃0…ÑÄr&½éž]¨à¾”T[ö§§ÔŽé°ùe*Õw^OjrØÂŒ]§ht +¬EldÆi톚§Á.ÝÑLŽ[ªŠå™@qŽËNƒª”Û«>û6ÌÊá÷Ä…Ù»à•Ÿ½…ÇæzÉêâ[ÏÜùÔML,7³W^¹žž½ý›Ÿ¿RX¸JÅ&6ön]~øeZªè1#V×r³ç:[w':;•©ÛO¼ª¯@ $ëbe9Tßh­]_¹øøäÞSÞôR©µ^ëE}Y‡Ð÷b*Öå Ë©©ó­Û“gOLìu—ÎÕfv.«æNvÉpÝiðÙ™Öæ­æ©|Ù9hA(™Ý G `ç‹0cgRMJ¾ô‚4qZ"°ˆ3 Wd¤áŠÖSÍÍów?›Ÿ:eb¥ÄäA¤µ'”Wó —¡Sðø<¡•Ir‰iètà->ß«.4ׯefö¡fe³éÚæÞõçQoŸj¥'N¥ºgá&2ž›÷ç˜DÇ#M¸ã-™•ÑÃZ„ªÂEeþâÊÁcé‰Ó“‹çº+0þ¹XY„šÏÏž_Ø¿ÿÞgÅüìÄÜîÅ[Ï@ÙKè©8„ k¡|:Þ½”èžwG›“‹gVw¯ùbE£3€‹U<:II³\f¡´t›žÓà"mrÅ%¨B(ö0é9˜7!?{úú““›Wv觉NkÛ|eÝV'üååS÷Üó,#Öì\Ž//q¥¾²™»8¤1w‚›s„uËîD7Z[ONŸ›gØì’ÙÏ·v\bNŽ( æâõõTk-Ù\,LmípRÈD*‘ê–P\##•Xeayï¾Öæ5=)†«Ë`\~^š:¨mPÒ”+\_Û½{çÎGáâ Iîä¤+Öô榓“»Áòb£·ûÂ?ÏtwH>Û\<è}¤¸v£¾v}z÷þâÒ B¨oœ¾¹}ñ1p7à øÐpu=XZŽÔÖÒ3çbÓ¸XY:u½¹pÖâ‘‚¥ÅPcÓ™õffcíæÆ­TïŠ;1Ué_9–:ª@€ðP¾bæÊ&„¸V°0/¤‰òœÁ"Å 7Ts+\j&5yÈð21uŒÒÊÆÉpÅÄå,ü0*"|•Ï-ËQŸóû¤6®¦»[ùÞW˜7sE•Š–N_{ÚÊ ÓÅù ‰Î.šÁ…,ÜI“',.{]-îÇiW¤FC×D[L´ÌÏ9ÅJmr»ÞÛµû2Rs­0w.7³Ÿ>S˜>•n.{•k÷>ùú;¶×®ŒÛ|F*Žxs¾ì_Úò×éÄ”ÙÛ»ôà£Ï¾Îv¬n)ÖÚ ·öbýtïÎìüu" ?LUzçÄÒ∑3y !ŠuPò¥Ìä™ýû_ïfãõhy^aãÌž PÅ›®—W¦7ot–/;¸ŒT[{&6¡w%o‰‰OKkbqE‹ ^±ÌÅÛWV<”ŒMab ñd<‘†Úî1`ög:ÙÉöÆu¡¶bô¤Nê]ƒ:BOòÐT¨Ìg•xg»´p0qúì")Úº9ð¾‰û+Ë×Âõpe9ÑØ c ¥Ã/³y‘¦Š©°73 ež››9“žÜ"Â%ƒÓÇÆÊ|nZ¬­Æ;»áæŽ#Ò6¹¢¾X d²dj6Ú´»z»Ÿ+‰Îv¤¹Á$ÁA¶ÀïlÞ„/=áŠ5P‚[ JzWhÜæÕÚùå›T¼}xܪÇCv_8ÇœãÎè\q°x.QWe6w¤¼P_½™è^t'óSщ]·’œïOtòÓÐÞX«¹z3=uÀ%{”Ø ÂM„ËÑʸİÎa¡"Þd×ïd:§Ê —í\aÛ¿rÏÓî`Y…òV6…Šx¸w>ÝݯÌ]V˜Ýb²UY¸ˆøóJÔ­F#)¨û_ú Ž ª,îÆÜyppã*„Ub|ÿª'Pl®ì'Õä7Nh5ö +Ô>&3¨Ðq‹ÈØõf69¹xÉ›Ÿ”9X­SÐ9Ã*,è +·] ThX‰XÈ05Ôž73GG!`JzgDnñX\a—°ÑÁ@ºíŠ6ðpÍô@=ØX“7fV/Uç÷,î‘ +2Sùînaæ|°´êŠM8ĪÞù åz°X¨/,mÀŠä¦ö»›÷´×nØýR<ۜ۹+X˜‘!¾þW‡Ž…ÍpÉf ·úlî¤Æá7vO2HiñJfâ4Ä«ÉíŠ3dgbáb¶{õç jA”#>µC ‚-Ô‘™\ãf—•‘Á<ŒÜ%Mk™4Ø“+Òp@»ùsZ"ò›¨ïø!8x’v. ãÕ“:»Ÿôåe¦c#š¾JÄÚ¡ÒJ¬¶îüvE d8QÛÈNžÕâAq†`€y¸/¸#J„€ìMvP.cqK&Z²zr¬4«nä&÷1.§´yŒxЩ+¬ŒõB×»ã] J*Úµ³YÂ[é(,™±z*çŠt’íÝÊüÕâÜ•PeUfó i1¥Ù%3“;q&› Hm—?K J‡…‘©ãKwþ¼…JXh u§4¶T[XÝ¿_e÷TkífO e6ÜÐÙ#jÜᎿôƒ÷듃 +‹aÙ8¼Ãœ'9/äV…ÜR³%ÊAòrÆ”L,(•Ø< Ÿq‹…‰…³BeJ†Q&·È$j®XÅ.ÀŠH0H­•õÇÚt¤ïez—s®D<"zâl÷g`Ò¦×/‡+óÎXÕâK뙈Ñ%´Xž#‚ Ü”?^)öœb^åðÔ“6.çÏ-qÒ¤e ±,¯fΦ&¶Äâ *¨î\svv÷.Ì/–Û,ž‚ClS‘É÷OÿÊ? «_ÆxIar¾x´± +R_º”ïíK­u&ZõÅ*k»×ævoè•À5G¨ŽŽP[(o…k§ t|ÄHPÁ4àê‰+ [QeSvw +e$­Í78jUš vâŽS¡*æÏ](Ρ!¥Ž™¨@~š/-0©I ›€Ð¤A}´PHÔÖ-tdP…©6Ò®PÃ.S^õÆ»ý[`Ô˜ÉåçN(ÄwDZÆ:ŒÍÄHr‹[n¢ ,è@Rð´g²»Ÿ›9Ÿîì +ùE+›S A¨›;&3j¼VZºšêî{¤(æ*LKðVN²qq»/Mk|rFHÍ’Þ â +ÙÝñã +Ûñ1“\kW›œVB”é]rtDƒ;}™•íkpñä¨Ùê C÷¡Þ¬Ý“ëóE„†4̧˜žA™âIJ+ôlЛ¨':Ë驱6)V»©ÎlsíÌÄö¹üÂ6”<‰& 4mÙèè°WÙh é'ý’;Rb2”qF²Á|këòƒõÕ}¡Ô1{#VÂ+•¥Î‚»8!Cá÷}‘LÛ- «m6Z´Ðáq+#BÆoŸ¦R3z:‚û£B±CKe:Q°ò1¥ÓgæBŒ”N÷„æŒÁ2Ò"ªaÒ¬ôÑQÌDZ€Ù%Û;˜?b"h»W¤b +àBÜÍ¡|Â#•‹SKµåm*YÒ8ýT¸ÎÄ:F26ndŽ iè&JÈLû’9 ÝxÆ]‰.¬˜ø²¸T DÇQ—ÜÁÚüR´¾f¦¥ q|X§·Ðv§h§Â̯°0cfZùIÈÚÉIH +`‚ïm_n­£ÅãzÛ¨qÅ'Œ®è±1ã‰qó°Ó9x#Ö8¾¾ãÀùÊN±éK÷ØØîÏô¶¯´WöÄr×ȈƒL…{Èh²2;cuÅÒ„e„Ë@I«í¼‰Î$[g‹3—èHmjÃÆ lÌ—jC4pð9"Pp +yèëH}!ÒX`ã%>Ý +dgƒùEobrHaÿ×#²oŸÔÚè˜'TUè‰ÃŠã#F¹ž!}…xi)”[@Ü™!•c@fÕ;|v_êÛc†;ÆôGå›'/ä7øÔ‚IË Œ+X$}±h®Ö™ßœYÝÛ8ýòíÇï~âùÇ_~ãÍŸüü£Oÿð—¿ÿó³/ÿþƒw?Ú¿ñxzbãsý[Ô5NŠH )ÛH•ºÙæ|¹;?¹¼½vöòÕû?ßã§ïyxùàÆÖÕ[û÷>~ñÆ£/¾úö³o¼Ý]Ù^=-Oa¾„‘ ¸Ä<.!žˆ'ÊíúôâäÒÆÊÞù3×ï½ó¡Ço=óÒÎݬ_¹ÿü}O=òÂk/ýð7Þùà•¿wû™×:«g‰€¤Ã9…™4;¼¾p1 UH¿HæŠÝùöÊéÚâfvb¦2·R_Úéí\¼÷ÑgñÁÇÿößûáÏN]½]ì®òR]i¢•FVcáÌxPÚñÒ‚™ Žh¸'Zè®¤Ú áòŸo‡*S3ÛWwïzèòí'ž{íG·Ÿ8{ÏwÎÝ~Ê)*l^µÕ#×;!H_ޙݟ5;.^2Õx±žnÎÖgO-í]¿ùÈs÷>öÌ[ïüêýO~ÿò~¾uùV½w*V˜¶{’€‹*++3Qˆ;Šy“j›Gf¤MDˆOvÍÕ@¶Íg+û×îÿ·—ï}ê»çï}èòýOŸ»ñðÞ]\yðé—ß~ïág_¾xóåówÛ}I¥…V˜œ6*H‰eo|Âé/É+æ‰zº>?³y¡69³²{qãÂõ3Wï}þÕüî«¿ÿþOÿòOûð³/î{â{ÑÜÄ1™í„Üa$bÞØT(»<¦£GTv­•&¼I„IjíÊY)¡Ãb²6·~nûÒ½Ëçnœ»ùð==·xêJaz/ÙÚĹÔñqä›Gµ¸K(V§¦¶6N]8wpõÁGŸxåõ|ðáçŸþî¿úèÓ>ùíþã??ûâ«WðÓ‡ž~izób¬±¦ÆD=ÂûÅë‹‹‘d¡Ò^ØØß:{uïò[?ùÊ[?}åÇ¿xêÕ>üÜËo¼ýó_~üÅ oüäíÿÅßÿãŸ/þð—·Ÿ~}iÿn€±h±—›X‹V¦™P:’.vffOŸ;wóÖ}=ýìÓ/¾òÖ;?ÿè·üÑû¿üï¿|û½¿úóßÿïÿçÿýù_ýø—¿¹úÐ3Ùîš7^Á´à¬_”ÒÅÆäâ*¼æÖwö¯ÞýàSÏ?÷ê}﵇^xíÙ×ð³÷?úÍÇŸ~ùå—ÿûÿúï~ûåÃϼ¼}ñÞpnÂéÍÙ©$í„KËz‡`°¹=|"Wž˜_?}á®[7~êÆwž»ëÑg_|ëg?}ÿ“wýñŸÿö·?ÿý¿~ýÙ—Ÿýþß{ãÞæ‡8—gCM—õHmO¬š«÷&æ7–vÎ]½÷{û·Gžíù×ßþÙŸ¾ÿéïùñï~óùúË_ÿëý7tëOõù³/ÿDÌOœƒ*;(ç˜Á¥F8 £„|$ÛœY=uù¾‡¯<øèw¾÷êÏ~óé{ŸüöŸ¾÷ÒÞùè·_|òû?üòÃOþø§¿üÏÿüÏg¿ûâé—ßܾp#˜i t@n°éìZ„…X"§jÝ•å­ 7ºñГ/¾ùãŸÿæÓÿâƒ×ßùÅoÿø—¿ýç}ò»/>þì³ÿøÏÿüÅGŸÝyÿã¹ÎJ¤¼D…jŠþþlö!9ŠQ"΄¸PA*Ïä›s…Vo~çÜ•ÛüÛ‹¯¿÷᧟~ñÕkÿþó_}üÛÿúßÿýÕßþñÌ«?¸ñÐãçî¼Í†«˜·`ǹj}zf~ckgÿü¥KW¯_»ýàýo¾õæþð‡¯þò—?ûüý_¿ÿÂ+/ž»|era%”­yMƒ#¨±²¨“Ç]>¯OHg +K«Û—ïº}ýö#7xô‰{᧿üà'¿øà•·~ü£Ÿ¼ûÕ_þçùW¾ÿ«oî^¹¯µ°—n.ºü)>ZŽÚ¡L5(Z“K½ÅÕÅ•å+—.}ÿûo}ÿ‡?úÑOÞùè³Ï¿üë?`9Þûð³Ïû»¿ÿã?>ÿòË7ú³«·o·6¹D•äS„/îò“¹jkzi}÷`õÔÙÕÍS—¯]ùõ7ýáG~öûw>øäÍŸüìƒ?üÝ_|úùgŸþÉGŸ|üâë?8{åV²>k! t‹ejÊFE1*è¤L®²°¼|ßí_‡qüô—ϽöæÏßÿÍWùÛßþñÏ_òÑW_}ù«?|ᥗž}é•…Ó—épÑä X¹„‚7^óÅË•Î\srnugïÁÇž|æ…—ž}ùõï¾öýŸ¿ÿë¿ÿóýî«¿¾÷á'?ùÙOþôÕWŸ}ñå‹o¾}ë¡'3õ%-ÆéÈq ¡41:Ô‘,÷â¹æÂÚö­GŸ|òÅWž~õ­w?øè«¿þí«¿ýÇ»|øÑgŸ}õç?ñÇ/ßûõŸ|úñ{ïÿêöcï]¾LWqoDn²iQZÈxBÙ@¤Ø]»vÏï¾ùïï¾ÿáÛïþâó/¾øê/ýäwøõ§¿ûëßþïóÎÏöî{¿xïƒî쩵ó7;›Wq>wBŽªÌµÑe°Qr bÅØb³·¹wpíÖCϽúÖ ¯¿ù½×Þx÷—¿úÇ?ÿùÛ/ÿôîû¿ùÕû¿þðãŸ~ñ¥Ý W¦¶½ÑZ¼²êᢹb3]¨Æ“™êĨùÆÔÄÜÒìÁÕs7o_¿xõüî¹3ñ¬DûÜVœÔZ =B©Ñ15"Ó¢V”áýQ)‘/–•Fs~emnu¥3ÝÙÚ]»vãÂÝ÷^Û¿|eÿΛëç.•&gX1AúÓžx‡ äÕ&Rk&MvÊjw’.ÏêæÅ™•Sáx"Ÿ––—f÷öw¯Ý}×}ßúÑ~øþ‡¿ýàãO>ýü“'_xnûü~erÒŒÒÁ´¢+êÖc,á®lœßÜ¿žªMJÅZ³ÙšíM:µñÔS¼ý“·?úä³Ïÿ»·úök¯¿òÒ‹/<ùø·î¹syu#W›bÁÑÌN3P£Þ“jÈ5ȨSÅÅc‘¥ù…{®ÝùÊK/½ò曯¼òü/ùΟÿüÇg¿ûoÎZ]ž+Tk±|Ùˆ¹Æ´6›+/ƒƒÓ;8+É¡íã™B}ffáÜ™ÓsæÂÁÅËW¯Þyí{/<û£·üÒ+/?ÿܳO?õ—_úÞ½7®o®oF¤¢ÅéSXIµ6á~” ‡ÒVH™W@ŒÏ/m^ºvëÉ endstream endobj 80 0 obj <>stream +§Ÿè‘ï\ºrý‘GÿéÏ~ñÃÿðÞ—»ïîG¸÷ìÞüâB©Ú¥›Ù‰m6Rÿúrhø²ÚBË5¨ÁLFâ¹ÅŵËW®~ï•W•}â‰zà¹gŸ}çÝ÷Ÿzæ»—/ßÕ›_–r%»Ó qFieÇ5ø¸Ê¬1áz+i¶SŒ¦êùúLczÅJ³jÓÙJ«Sn"`Í$/Ó㇎Ê-kvøtVÚŠy»×fŽeýá´GHèLˆÆlÕZPÔéF(¯ƒOÉQï •Ôãþa=zdL5®±™P·ÖDšäÀÞvš£YÎj³Ž†™T­ÝYÜÞ›XXöGcF5ªE5ÖQ=¦°¸&fTGŒÂs‡r(4áŒæ}‡óûø@8ã‰X®TîÎz1 +—*Õt*ÅÒ£Õ©CYΣL”·¬îø7T2#Åðy'›ôr‘\º Å%1À ¾7·X.g“ÉH¹^b9¤ Úè¸õªÐa…eHf<9¦3ŽhÞ3Nq)Û Es‰Xúàòë›))Z-•2Ù\«Qo×K±DNk¶99`Xa;2 ::¨¿Œkûwâ#Dö¥8A£©`ˆ1á¢ÚÌŒ(l2½sTOÜJ40nöè0Þâ F²­¹Õ³B$32¦Â!Óu’‚ óŽÂ; id“#40fþ? 5šЮ1-©´zTãÊ÷Äš:»ï¤ÌD‹ÁÜñ<³Ú½“Sc *ÍU„PÁ[è´Ù[B!WJFWXnó(QnXƒƒÉºÄ›äó«bq%9±OG'•ˆ¥¢©¦ÎÆ~ëèø`G #TK“gSÍÓfWâÈ ~pÔMv XàŽ!ý  +׃Àò_ +ffùĤ\ jLˆGm¢GÕ…Õ"¼±©[“I&Ò>6b>:¦;6®9.Ó ÈôZÔo¦bvoÊ—ž´ºbB¼ÊNa\ +eSzGÐ@„-ŒÔß2•ˆï›ÇÇïTõKH[AÌ-až”ÅŽçæbåµ#£Æc£:™‘°º%g¨IUÔ›Ò"^œ +¦Ë³6V:>n¨²AÕi0÷e _ñë[*02ƒÃ…ë 3¦0¹-Ψ;Tµ¸#ÇÆ *‹×%Ô(±b¥*»ha2c&Ï€Ò®Ç|c:ì›ÇåwœPŽŒA‹ÆT6‹#`uEôvŸÂDËîo è˥ūAƒ*›Z©„F5„ÖîƒÔßßIOáìo,fc >ÝÑ9|ÇÇM'ÇL6\‘ÙW2G•¸ÆêãÂ]" È­ðR¢GuP *Ô'³zÎ(íº=¥•C(‘ WÌL\afÇ•Žãƒúcf³=,,!Nq`|UD¼y¹—™½2kfR®p‡ÖÕ(o"RÍS¾ô¼É•€²7±ÇÇL”'YlïêQþŽ*“+j£%œMºù<üdPŽ|û¨B®Bš“§Ìdx@å°¸b:"de’.±)äVp®4¬pŒÀ¤¡ÜÉqó‰½ÖÂب˜£¹iÍjcÞüá!“õ:¼«7rLaÖ9¿Þ´@†ªÞÄDª½ÈM#l óçPo† +7\á–Å“Ub¢Ì8.·Èh±þ=þÃ+1‘&\–*GÆÌr‹aTÄm™½™3£FY!Vì,œÁÅh(›Ç€ó¼¿ÅTµÌèÒ˜‰ùµýêÌ–ÂâÔ"n(oÔ±1i‡¯DêðŸ:â PxG†´C*Tgïç)G âIö¨p×LFÅT— —+Ì} 6S<`ƒ8—³Ò’õ#x@*ÌZ™øYa}ÕhP‰ +«ŸwT¨÷Ž!­ÆÆZH~\‹Éõhê“°èZT¡“ý°Í,̳«þ¨Ì<¢wê\ns3¨7=öõ6#jT€ÿkr†mtlT׿éÆáÉ!T⛇Ç—ÑRbÛÁ•4H`\Ç É1H…ñ@83Rã÷¨Ñ¥B|2®'bzG¨2}&Q[Г@™´ÍC\q›+¡²ùá_ÑiÌЉÎ«¿ÁõgWêË÷Ek; +›_n¦1oÔ`Dï68b¸¿D‹Xtùó¤¯`&C2­µ Ã*(lÕñaÃà˜å(ü)G@™`þ¡ÌìÁ¼©1¦'åFÊò[ÇU'F­Z”×Ùù¹cøĈÎd÷í ª]'5Ì •óÛ#æ;Fmàn½åƒÊâ…#jû‘²úÊd|Æ[X*ëtróeËõåås÷k©ð°É5lbÔŽˆL`¾›±p  «÷„ Å‹0ÊH–þ/ý-¯qÎäô[ÙˆÙ#éé˜ÍŸÃÅ¢‰‰Ù¼g´Ãe—ð@Ùè AéjˆÊÄ\|Î)ä NAíð«l^‹34Ðß¿E{hDòf îLú²6ªú<$zLcT!r4 uJVoÙá/“|‘Ê&Bà¢e ôA¥MmóÉ°Ù‡êò†Ê3+¨;~lÜ4¨°° •MΡž¼‰NŒé ”ä—¶¯ñÉÖ‘aí°Âª13z»ßáË;¸¼Ú I¡hr…ŽŒŽË­ÃZ xÕDÅ]¡šT_8O„*ýMiŽ©Á= „h!#ŒXñ%&F÷ИقùwüŽaã×/ó¡a³ »C _¬åàR$ŸSØ<' Pr‹ÛL%¾B´ºYZ¸„¸¡ûÜÙæj¬²®³†ÔÌù°‡QY‰À Ü|tXÄÂgæ|™936bôŒÚü¨P Õw²Óû8_7yllæqK2©09GUý½¡­[ŽŽèF4™Ñ +&¨C8¹RâC¤¯5ÉÉ¥þõ¨ìD_L8*а:“_ßß-6ÁBÈôÄ'ä#jTÝÿbѧDüö@EH¶©Hé8LÆëè˜Ñ“bRÓVÞHǨ`yjùÊҥǴ® :ÅŠ7>å‹OR=2Ò9¢r Îpµ½Cøòß>©R;thÿþJw¸Uœ9ˆU7øxeñÔu(*+—òåf‚•±ºnl…[§ñpËDGÑÊ=>WìíBKjlnâÕ`êÍsÉ9œ¯ÊŒ´õ õ÷• X(ÉL¥ ®”Õ£Cm:Ú’[˜ãczHX¦¯ïèQ;“3frFQ6Møó‘âÎ¥ =ÝÑ–__b+::!Gy… Öö¯‡WX}¨'ËÆÚv:î`ât0£A=ý ‚œ"ÔÕ¸ÞRlvEµotE¬lå2jŒÑ“ÃìX§Aè8ê–¨H=1uNçNW¡J«W‹øt?|„ÂÆʬ@¨8Øô€ùÆ€öШyPM¨m~“#ü—XÇyh¢•…cŒØ¼i#RÙ8#!Úu…’ÜHáThïà‚“¾y\ybÜ¢¶q`Ç“f2xBf‘\+A×Xœ" ÆŸž +”ñh–õåL@ÂášOŒÛFT„ Zœ œ«þ†Ò* i\f\„òFÝ©a2¢ÆŽ˜ú7YýV*ãŽM™Y€À!µ¢J/V?¬"ú÷&£Η8© à =qŠ©MÃZt T×ÔcÄ“4P‘q+‹òy›Pâ“š"û—ÿͤ;{éÉó¾üœ ÉŽ'Ù6»D#î×aܸ…9¦¶Û¨h²²Šù2G† z{&ÐDD¾\¤¼äMN„³“+gï³úÓh m®IÝÝää™P}=P^µqY«;Z¬/|ïÕŸ.ž»%·¹ ˜ç²_áÓK¡â¦ÝW¢„r¬²¦qˆ'•¸É)a†+Öóç·‹lzN zŒcÃ-¨½Ù=d Î0ÁH±ló¤éh[*Íï]y¬<{Qf†ì“cSÓ”4㵩ش'1d¢°yá7Õ˜ Çƒ˜7«±òr½{Lï¤éË@mk«3ÖHà”b-V]ŠKzR”›]j`!ÀsÁÌ’Pß±ð%{ xyRiÑØÕ(G…ë_òJÓ|ªg B‡†õÇÆÍ#:ò„Ì6¦§AŠ0®`çò¨·`¤$Ä_Äź=PÖ;ƒð; FWœ V\BÑ®TÚ«zÌ;0nÔXܘZM>!·ÑãÞ´ÃÕ؇•VÄáõ&;V.MÇ:W@<w¸nc¤þNV¨h â:LÔØCr³Ìà1‘`E1= ¾@®C¹1Þ¸vî?˜#e$Â#jÅçö_ÒËõ´’ ß(¹úb FH’«m*«ë;©[OF +y¤™xë o³©.ª’Ѧ3ÞöfzD¸ tQ)/^¹þtaöÌÑ1£ÒBëú× r°Žt¸A…Ã:B¡ÇÍΈÌÌöŸÐaeO“ê +ÅE>?o¡E€w©½nó¥í|U˜D'T\J·¶+½ý™{mlDm§Ùp•OÎ8ú;6Ag Λèp¹Ù1«ç¸å¤^²{>5uΛ·z²gL _.\˜'IJœ´y“˜ðµâŠÖìþ,¯qéf²¹ÄeºFœK7V‹‹Wcûh † uL¨š=ÅÆÚ™kO3ÝA Žñ5#U0»òÔ¢XÜñ§aØ1 —X–éIpœpîteö`åücÑú oba¿2uzH9¼R¨²iïD;»…¹«Íõ‡B•Ó \VJÄY `æ1Ñq³;3f怢Gõ$ÀÞqàįBÊþ=%ÙÅWÞ`²K::©Ãý.±ààó66…°)Ÿs…kbi‰ŽÔõv´Ee¢G NÚ¼0ùHjˆo@‰‚%™!P+- +#arŠàòîĤ7Õ³q«'ç wbÝ`a ’ì‘“žˆB=ƒྂ‘TŽ"l– A‚@1 –”ý]¿<ànfZ²ƒ°Gš£:ò_ Ë­'Ç-mǵ„ÜÌÚ=„IÚÙ¬Õ×G3£ X×ÖyA(, + •É3gïzÆ­#ÞT¨ºÁeæÉP#ÛÞ-t÷ÄÊÚˆÕ3 °Ùè8*H(Éå¡úå¤r¸ü©P¡gr…áxÁ‰¨h•ºþâ"Ÿ …B¥³¹{ó99âÁù\ °­­‹‹‘úF¸¶îIÍh0¿“Ïzbõ!}°ÃWôgêk7SSûý-pu¸™ ++íþa#5 Át„èÖ¥ÍÆòM.Ñö$ZÁ⬠+žPY ¤àŽ7kËwï~fõÒcÙ™³v>+ÆŠ½Í;‘êq-ÔçÏõ¹9Lh +ùÅÂä¦SÈ(¬œXÞb=+“!UÈòþnuîXiAª¯ kñ;uã&7ð€3T±ûsýgA$›:Ÿ«ÀX6^ÏÎœ)-žOMnG›ÞÌ,ÊgQ&üȳ?Ü<¸­#|'U(+͆Ûûbc×jk]ÀŠùÚâÔÚ]ß:iTÙx<Ôâk[‰ÙƒÔܶ°¬ ÂL°ðÀÓoM¯] ²qîD7ÖÞ›:ýPjâ¼Üâ= +vîC •ÛNj‰1 ‡úú—KA:ƒ˜ 4VR°ÒQ­t¼nîHS窷ۂAý2çZÛL¸5f û[\B<±úì\)=ui"°Ò̯âIƒxÇ ðظMÐ9û·Ž€¥Qþ0ðÌfÆâ³B¬ %ÓWzÌ…5vÎ icÝàQ.Í¥¦£µeø;¤ÂHcG¨nz³ ©öдþv¸Ü„q¤?¥±sr++3s£zvXC©ø˜“`“l¤¤Á<*Ô=nu[Ød¤²šŸ½˜_¼bwÇó­µXmYëlÞ—í1Ò$ê/…Ë«Éö.+M¥`\.ã]ppFê Š` JlôШ‚^0;Çç–ü…65c¦¢— +•çq± Æü„P¢#µd}i~÷æÚ…ëKmœ”­Î½öx =”*oÌí=ºwßëùÕ[DtJOEµJKbna¤Ý¢s`‘2‹â?íÈ-ì‘1˘ÞeÀC@w\4Pq"\ –ACª©úüü©ëT¨b¢BZ‡ÇäI=i(­Hyavï@frØ@hiâØ(ªõwB¦´(Jv²ÍM°E."\ÖÆel¾¼+6éJtùâl¾wv㮧3SgŽÈ1°&Þ%CM³; ê„é÷r÷&ÿõ„rÔH“‘®7³êŠt©ÈÄ°rœËJGÔ¨W‡&·®o^{rbûfaî“ì)°àqE+˜Ów½ÌÍjêñ0iéñ”œ›W üƒz•…Šd»¤W:zRù¯w (V…ͯù +k|~ÅLJZT „šŽ ¨ÆÑãörLnb¯ä&7te~b Ø{ÌDöÁc¾Ðm+PÆçˆpÕÄJ&&I„Zö`õÍ„ˆQa›3¨„üBD # L^ýíªúŽ1½RaAÈLÜ1¬>®°Ê­œƒ/Eë›R÷ŒXYð™ísÔæ÷˜—Ïöê+7J ×bÍÝbï ?{‰7N¨0&\·{’:»·ÏÒdÄÌÈ`+T^wòG@„UvlÜ5‚xr9#Ä…þÝ‘6. €í‰·Q6{ã©Öjfj75y:\]h,\(Íœ¥Ä +kH­ídk33±åJL(‰èˆÄí‹4BÙù%v\†`¾p…ZÎPËᯜTá +³ÛêŠBIƒãqé^¶wà +dg×/\{äEW°4f¤ ¸@Š­X}»wúöúϤgÎCéŽ[(.Ù¢ê31Gdö!K‡À‰´QÑ?9Ö:j»ñ;5naúô=çxeõÚóÞÂò‘µs½3¢²FM´ˆXH‰ð—qªèЈÞÖ-õll~ÜìÔÔ‘3ä +U N )®8µë¬óéI6ÕCu‹·AÅ&ÒÓ—uNiDïfâý3Š£ÿÿî +6ÿ€Š8:fÕÚýÑâ‚ÆÆ~ûÈð7Èa¸‚+>eTµx蘜”#A•¡‡Ž)ÆõŒÜä•›½£ DXÞ¿a?,-"d(œž0’A0#8_a•NΓ‘ _qá2Js]Ílzj~"3P2­2{ ¶(M¬ÒÈ—~{Hhȉ• Õú;®N*ÑaˆWDñeÉP… +—|ñJª¾aó$ʳçÊ‹ñö­Xݽ+¤qôw'£…¢(ô$$wghJ(žŠ7÷‹³wéû›?ƒ¼ÄÝ‘:˜æ¨Ñ%·ºµD” µèØê/B”ȶ×Òõ 0Ù=‘ÂLsõÚìþC çؽû»‰Öé/žÞ½çàž§0>­ÅZW á+þìRº³_»jt&¿=l:âJÐñ *¹2 Ý=¢Â¶!‹Aè†s…ë4Ph°l¡ ..Ζ.Y½Y¥Õ+­¥šgÅìBµ·_ë_œ7Ñî@öÂ}ÏS±öq¹C…±~œ°yòÐw€ú&<í 1j }é^ ?Ÿ›:½tþÖê_r‡«gî6“¢ÒÆÑáf ÓrK˜¿> ÂG´„ +©®ócV …¥ÄÄ° âI~^jŒ£'”ÖôÞ£íò‹w%&÷ÍžìCfZÜ{ØâI3 ê\ +V!*m…Ê;GÇ,GN*e:ÌÒ?ßb6P#F*ÜÌæéØ Ð)|â¨Ê¦CÙAe» ¶°G°R[¼´xéq%›ÐÙy(T2XrEê®XÇžg²Ë&wÒL†bùYÄÑ¢do†ä @}Ôföø˜áŽ“Ê£ÃÚCCÚ…º¾ÿô@#£¶ø¬€…Ž€\;¸´+\õe§üù^´¹Å$&P.ë@Š•Ì”ÏBA¼p. ¿F‹U.6©A¥‰B]¢Œ‚• ^ŒMÚè$ô‚ÎÄÜiÄ-Y¡Ù!†€x‚iœr3‡qù`¶G‡ÊF‡Ï‚ûÜá,Né$§¶ ³ûÑòb47Û]>§ÍLě舕u °9=+”Ö\±BSÈÉÞÔ°–‡l¨%ûð€ð(%A¸CÜYS?_øª¿yR®¶±l¤åKÎE*Ûµµ»]¡ +ÈM®^u''AÆ”úë›;:ÉÅÚ±Úêq~RŽáž‚ÃWÑ;ï55Œ)ŒË¸£m=.hl4«X©ˆÜD+ôìœçAŠ3­Sv”V6ÝÚBÜI•™ÕÿŒF5×ý+Ø!¡3)w¬CˆU*ÚDý{ ˜noa çL4ÝX‘Zðƒ;¥À +”Ãù’'1ãϯŽ ;\bÍ+ͱ €EB¨}w [F5D¶2_ë®÷·‰S +Äç*|i%Ú< ª~dÔâË¡ts*á ^W½‰áÏ@¾iúgWT6¿ƒË`þ¬Í÷$:Òš¿°šê^Š«t¬©Ä<¾ÓÍmàXкþ&„f¿L Å1¤²CÅÛëëç2 ô7«gm΄mxˆ‹Þ®‰‰@ÀKMž¿ðøüÁ“©Ù§4ÄòÉÎôf³wÎ)”äVFf¦¿NÄ¢ã}á²ãäŒæ“._ +‹ è‘HŒ›|Ç•Ó˜žÑ`ÇF ý­¶ ”±†¶êàú_Ÿi>ÌO5+½ÍÖÊ…ÎÖ]Ý;{§î.Ϫk:’(L÷Oœ²Q¥ÆýYg°ŽzËN±c$âÌ: Y§µrúþ£ÓbGXef4VϘ–p¸“8D6:ìô§t|–™`Á2®$«‹+gî%…Llß—ûOœ)ú¥i:Ø@Ýéqí‹TŹQ ~hP7ª£Ô¨@ðeè»7 ¤Á†JÙÖÚ¨V÷¿X dÒݽÜÌÙîÆÝ|vz?ÛXšX¹4ªsi¬^=êƒY×âZ›ÛÎD¡›b垃KB¥© Ý¬"Xö—¤ÞA{í¿Ô™œ?óêÛ¿ñÆ:Ãzâ­¸s‘òÊÆ¥'Vž$BíÃ#V“#Hp9è°†¯%šËïÚL¤ë +·Õ8 øÔ¨Á5aJGjÝr#Ç„zÌ@@ˆ…zP"Pr“Kï„‚wAµ0i¿Ø¿Î6Ö„OïohàN˜`„vŸ ,Ï“FMT·Ò­Ó¤ØÖRF;²Œ+ZPZ~ØÄÁkÔÈ^Â4‚xÊÎA•Me¥½±Zké|wír¬¶ØZØëºæ +çQ6æ•ÚL´Þ^º8ep†5¨› +$&Ίé6¤!êS! 48"(#éŸÖž”™ûÛñ™`ºÆM'å‡'åIOOó©.ÎI“ËWÒÍ %b¡r´}&5uŠ ךóçåEÈì6:áOMñÒéûZôĉqÓ7Ë:'€Ì€Tœ·õÏÛ£>àÌQ½Sn ûg‡ôÎc2“ãFNˆ––Ü¡2ÔÒI9j#Ã4ŸUÛÔfFmb<,xð¤Ü6$·Œkà„1>r\Nžá‘\uǹxëÔ•Çg6¯¶™qÂWOóK(3a,ê +Œ]àzW€÷älÎ0»b£jŒð„}¡<ο•Cp›SÝ2Û Ò`ò¾Tº†Õ(€Šñ@¢æ²ySF&f¢¢(—ƒÖ UVèP¶·}g}ñb¢º’ŸØ®.^Ì÷öý¹9»7Êv]ÁœÜä4عqƒ¼cDi³8›dÄ2ðX²¶®#•™Õq'‚¥ùéS÷,|';±³{é¡ÝëO»¥Ž‰Ž[™”…–p¾ì•z±æ¹Ìì5wjc©úF¸ºÊÄš[týÝn9*2bÇDƾ5¨ýöIíQ…ÝÌ•íðwVÖ"ªÛîNŠ…y Ò¢¬j/l_½ùÈwÏÞ(/|ý5h®»vWsõ*)æt„Ïkç'vâåO¤Ê´Hot\‹ZpÑÆH*+;¢#Çõn¥Õ¯³ f2 +ë~ø¤fHf•ëÒ—eB-ÄS0S.uÎðRÝê½éNyérgënˆ„‘önÊÍžH²»zî½+pR(L¢Þ!0qLí4Øü”7]ïnu—/:©¹ã¸ +ÃâŒ2ñ.(ÃR‚©Å ½‰åK—u bnÉBGmtÔ„ùÝbÑÆD‡”6»³Ï¨ãz|\G¨Lîa"¦±²:›çø°Jk£íîˆÜà„J‹&›KUö}¹ùD}”Êò±xÐ'X+ Ð8ǵ.­=èT&~bÜ- C<*­íG)š1¿Lƒ+lcfÄ´3‘oÿæ‘‘o9< 8©°©­ŠKÁ’åoŒ«Q')Ê¥‰PMNùò‹©î¹ds£3±òêßïm_ƒÌiHÈ÷¸ô¤T:6eñ$•6£Â¹ ZÉæŽÂ\i‰)Öêó¥î©D¡/NšiÑÁżᲢÿ ¯ÒÊËŒ¬ÚâGˆpª8Ÿk¬Ô«-”Þî‘õù$‚ø‹6_ÞäŠ;›•î6è$„,6RdB%Ò߆*YÝ’• 'r]©ØÕ #*Dma-¸F©¶¸Gè˜åBù`¢¦Ðã%æ»k½Ó×gvïcÓsO^GD'Î÷w#R{LKÝ¡t‚ô•I¾îðW”ý‡z8\þÿ£÷þ’äºò;ÿ‰ÕHäÝ6ÕåÓûÌÈ°63L†ÉHッ¬ÊòÞtu™îªö¦Ú¡Ñ ×° CCP3ä€$ègDr4’f$j¤•´ç¬vÏþº/qNœêDšˆ÷~ï÷“ñÞ}¹ÂÌ«[`N#“Ф³{9'b…¤7¶ú„I]˜„þD×Eç˜tB‚ÉÁ8 ÉÐ¥xëèäÝq'á¢4?ŸÆ#u.Û—Ë+Z±ßÝ~øÖç¹Î&Àátk';}(dgÙø´_¬N ,)È…ÛO>G•Ò¿>3tê€Ä!ÚIÖ– 9.¦«s >É‚H6\usÃv +b3„\·â'r0/ºG]¬ÓÈH +f±`ª¿r£ÐÙ ´R(3kíæúGíµ{ËOK‹Wùìt}öò[?ü†Œ¶Ì˜‹L*cÉD§¿Ý•»è¼Tck°gÊ·mßvp}T /˜±‹ÔGcƒ»Ïƒm²«À`§ºû¤Z&B‰JgKÈÏ%óíÒô&å PÐEF@TÄ€Í1;HÖì [½’ÅA»` €Þù ?P{RÊ [‘ófœÐZÙÙkjm“Ž¶¬DÄ‚È #øxÕP=t Ï¡xoÐÅÒ„22iÇ'lxÆê š0з+×\X˜³d8Ë'[Õ•›ÝÍ“ÞæƒÙGs»Ë­.Ùý"DE~ÞììÙä! Q=¤7uðEZiÜ Û=!,OZ0—_òe²c'½æã³€z<„xvÒú¢Ûè`&쬇LRjò|¤êÄD€<®@ø|1?SY¸Úß=éï>.®Ü´S*Üòü1¢TÜ\ÊË¥]tâ2ÊA¡ÜÛ0ø¹ïž›0£VŸdprŽ€Á°€OÏTû;7¼¡˜•øükŠ¹™äÌ^¸¹í !µ±wÒ[¿añ Tñs9>Ù¯ö¯´¯Ké>x¹Ð}öâ³tçò_œ6\4û >΂jBb*ÝÜe¢SfˆŸÙ¸ËÆš/:/XP3ªÚQ@j€‰ÄL/Qž^>¬/^1c&gC©«âJ.^_^ܼvë}Ÿ˜WŠ‹ZmÃÌYQÅ ªªš Dšš_Ð + Fˆ;=æ‚ÀuÔ;ßn´5ùÂçŒÄ¹Á>æÜ©qÛ˜s +›è ÅÕH}[¯ïØ0MKvNž¶|õ9(д^ásÓ\¦ÇÄÚ@·mˆhöq¤X̶÷á`þ·¾Ýà &œv¹ðpÔ•Îæ•»oû?ŽI­© k A¨Mµ¼ÞÙ~ÂÅþîÞíÙζÁÛ@ÆÁê`*<â#÷û, +>ƒ‡g§ÎN"c® ‹°ñ~¼ºN6+S[Ýíû‹Ço,¿>sùoüLƪ«Ù©Ë^*BÊ7µØ…«£VrÌBNÚéI+áôcÙ>+—¿szâü¨Ëì¢vÜd'MaÌÁùÙôôÆ]PýÿSÆó“ðɵÉÅ{V4ò—ç“nÊŠòVŒ÷²"RÖ½¶~/Ý¿†ê]T)óÙ~´9h‰ üÞ·sæÃùø6R²ú÷´ÅÍŽšÑ—ÛWÙ/ša*Zñð„?4ê¡Z‘Œ•]œ*ågÊË7#õhu5ݹ”h¬“Jøgû`Kåsn2 +ìÄà‡t!•¯/î¿ÊDj/_0» üKEP}Ì°bÅt¥ËÙi_0qfÜ 2}Ò'Øq ?ˆ^ ýñ\kvm¿Ð[³!¼V]m¬?˜Ý{>³ý¨2Xèï…ÒÝp¬þì{}åÙç~ÉkÉÖnså$VÝ‹U/3Ñ®ÑÏ Çk¸±S§ÆÓãÈ°3Bš‡É†33—n>?XnOÅÍ°hAÂÙÞ•Áv~ö€W=LÚMèVH”`éBRs]+6¸ƒ¸\ÒëÙ©ƒ©;µ…ãÁK!~xýÕ|õM¶±4bgà` P¡ìÀõION,”ö’Ú³ÂÃ`bŒ,•ôA[ž'‘âÂÌÂÞ[|ÙY¾Ú\¿Ý¹ü4½p+5{½¹ùxzë^ën´¶/Ïùõî<ûĉˆ´T Ã5‹W€)PÇl¸ tãÔ°— +F{fÄqzÈòSg†œ$­x<ér%R˜'å¢_Èá‘&ªÔñH›JÌLzY,œ•ó3 #Z)R_ËÍ××ïÖ6NŠ+÷”æ.ïÊÉÞÆþÓ¹K!!ã +‘Á¬’5\ŸCÃSƒíÝMè+cîñÁü‚Ñ?æ˜aÉN:ÏÈ…Y©0¯ÍÍ\º?³{²züZkí¦ÞØðË…¿ý ÖŽ“ÎÁ|3T,§Û— 3GáÜÄgÇ]´ Ô??bÇ&or4Ü`â áÜ +¡”‡Ô˜“ôP5£0 ©)ù~¬2þËèUˆVcµåLw'ÕÚ²³jyI--’j%«.ïÞn¯Ø0 à[¤²4he£7a©2ØiÔ ;¡àêî½havÌÁ€fEt;žØZnúòÍ祩M€E—b3³by5ß?Þ¾õþѳÕ×»™t®2·ºw ÆAŒEŠ«¹þíòâÃXó˜u²ûCۇ㕵3þ!Pam;ÖÂR¬½ç +Dsµ¥Jo¼ÒCÅ`©ˆÊ­0 +G¢½+¦ºÀF²=2\~Ô†äb¬9¨é“ð± ¿²a£cåù€”)Î.¿™èî*Åy,œwâ +Dëg–_=yñUsñØC%˜ÈÌåŒÎäÄ3Ƽ¯ {.LâÁØÔˆ ûW§Æ^u‘Ieõ+þPÑr3r| Áxw··ÿ|éÆù…›*šllô6O¶o½WŸÝ¿tûíÚʵpy¶°xïñåõPj¶·rgûú‹ê 6.1­o¨¥•@¬o$†ŒðËC–3£.¡ºð°ÁPˆp“XÌa៛‘rÓó;w·ï¼-仑úB¶¿?hOT^K´®gïh•u+&Ù±ÁmeN”Þd3„>M'æ¹á¡’Xu:æ f€°èŒ›ƒ–šøLF’Û@ñ˜Ÿ‹òé^núJeñ:pq þq1]èm ëaT©0__¹³víÅÌÞkRi‘ŽU]”ˆpZkñˆT2RDÂEˆÏƒ¡€¹ˆÄòÓ|´fõ &wÐèlÎb ,‹©^¬²êÈ©!›'€C(%R)ÄjKõ•ryÙA¨ó‹ûwŸ~È©9O@Ív¯¤:Wôòë¹è!3ì‚Ž£§ÙúÚ¹Á&³‚›NQzG.®&»‡ÑÆ%˜Ö¯Ü|mçø@x‹_$RY¾»uç{K7>ä‹kDqcâÛßûQíxÌͽ2æ›p‡èèŒ]ñ g'|V_0ßÞÔkëL¨˜ —øôl09óɽÛo\{ükÙ üßÓË+½Û—î~PèÁ| bÓ¤\Ÿt3§GìÿæÌø© 6àÁGùP©ÃyÞbñ0J²7n¥†& P7í˜>ØrÔ-ÀLÚ…†a.NêõXc3ÙÞƒ„2-çsÝÝ|ÿ ²p¸¾rãµdº\º»zôÖÞ£ö.¿êÅíç?n¬Þ§"xnnþÒãP²5⢌H”ÕçNØ 'ÌËz¥œ(ip“@p¹¨Õ×cÝÝúÊ­òÒ¯v׎ós‡J}]®o°éYT­ f5Gë r±™ž) »BI›#Vwl|yÖœlQk|nÞLÃJ Vë^¾„Je(”‡¸´ f›õÓQ/­¹è°V^inÊÏ]OvvÕ +з’˜¨OïÞe§Å\¿¾ùPiìâ€VÄ:µ|Õ…Æ¥°ÌD;H0ÃFêvD1¸h¥…ô:pJyÞ~vÌkòQ>­¬Ñ‘¦’&l¤­;P~Üî7ºq@ò{wßÙ¿ó¢µrCËõiµdr\HÔ©Átÿ¸ð1±xe9^Z§º£6ìÔEÛ¨°#a`Û< š‡Ö|„”,ö%unÂÁ(•úêÍéýWË W¥ü‚—Ë~à¢÷ž¿ß˜½<æKø¹ŒQÇ€=9³—õàádež°•qÒÉù(à¨k­ˆ´ý|AŒVn"ævârÓ‰£ÂŽ©VLªˆKFoÀ| WŒŒ E+±CÀ›áÊ·+\v¢&(à«Òߧ"%9]OWgµâ<Ÿø²Íùé¤æÏ»‹4 ›Ÿo™t±ƒl¤Š;<é£tP• 6â›ÖêÀ•]°ÀF/ã„-á$‚¤œæÍâÌ^cù­U<48ÈÁšŽogÜùMnÆ €—M²±–•n€i”ÁštÐã6ÜâeLˆo¬7V®ç¦÷ø̬›M9(VÊ‹±¦›Ð0>ã Äüt†Uk~&nôqžÁÒdÄŒ[½ü™‹®Óçl§Î[FL˜ =¨€pqàù_zÅd°#fä//XNº.X°Q{`Ša¡¸' {HEÊÏ… Ë8+G€ª/åz—¢Íí`r* eÅXM+õQAƒ9ÖrD8§—#µ-Àz/b˜ +WRáü$4l„Á) +ö’ºÁI;?îD ʇT 9/äf“ÍÍúüáôòÞîÍ'ÍŽLgkîàYgëÉÊÑÛý‰Ú2)ò±zª2·~å!›h‹ÙÙòµîÆ‘êr(Õ&õb$Ó¾z÷­ÛoXq5˜ìSÑ®˜[šÙ{£·÷F´²Ü˜Zÿì«_ì¼Lµõê°Û¥…ýÝûï¾ñÃ_~ø7ÿîÕ¿Þ¼òê?øë»oþP(Ì ùy65«U¶jK÷V®}ØÞzæJD(UƒŸž6øøIoÐMë*F§æò³·øLßCi…ö2!di­LO¢u`&q¹šíî-^y•’¬–ã¢UD®dº‡…¹ÛÁÌŠ“ÌçOÇz„Ö4zJLº ÔV³/üíæ,Ò°ôséXur&Xð…²•ÅÛ©©ËT¬ˆÔ19oE]hì8oö‘^*Œò LÊáá)£B”دõ›Ñò<F<\¶Áâ¤=`ÕD*Û \zJ-™Ñ° AÁ$èEª—p¥Ó8ù˜—Òµlp±CF ¢cl¤† +E@©ÀFZüâ™a7ˆR¡91À… Z0 ƒ™N"#àŸÃfôÜ$tÁB Ɉ vÌáâÁx=V_q5VP²mTHÉ&—˜”ŒuÔÜœœï#A5 ht$ç¥U&ÚâÒ³€ ÏA¸¬ë…“S£€ý”¬7é¤Î9O_´ˆpÂa,”sa2("ˆ˜Í¶·æùî?L´–Q1ÆÇ+õÅ#9×Õ ]%ÛAø”—Ti¥ÂªU>Öð1Q­8›h¬”¼ŸÏ9IPé4JÍòzQ/ôødÃàãôÊ2Ÿ™&º•ÙÃ\{]«õÞÍ“çõ…mVË×f/mßyóðÉ{מýàêÓ¿³tô°µ¸}|ïéúÑÓZÿ`ãúÛåå»Õ•“îÆImþH¯®zh=­^íÓÚÒñ+“Ðõ‡R­!W/¥{WáP2ŠÝ{ú!«>ÁBh¡l_olw·žÌ¾(­Ü6fãòûÏ?Ît·Ýl’ˆ4¼BÉ'Öò½£…«ï&§œ„²óµtsmÄɬs…ìDÌÇå3í`ѵRél5Wn@7×1¥dè¨TDª±Ö†_ʽ£æ€ŸÄ„4¸v\ò² &Z/Í_;xö£üÌ>Hó`¼Ìá¸uÐ8ÂèbE±sh¬£B%©68Dç +“œõs 0uˆ3¥¶L^ ŸhIÙ&A„L¸é ÀB_tÁÁ¬+ ÚH@ÀžðŸ7ÀÃ|€ÛˆûÔ°k°ŽÃŸ‡L¨BÇÚÁLŸMuéh“Ôê¯ÈŠq£Ž90g@B„t87¯V6äò:®–bRIÕ˜hÙ 1¡X+ÞÞÓë;‰Öe„ÏYÀYØñQ“Ÿ— b¤dpàçÆìgGí0`a?ö‘ ”Ifšë&‚ ©P¼m®Ñ‰6&çÀ˜Ä›— .2éD€ BI)®*åÍAÏ+\E„‹6üBȬ Q`.Éê5…\Y?领ͰŸÒÌj‰;ñ°Ù‰æ£™&ÁG¹p2[›)N/gZ3j¾MëE6ÕKýds¾¶´`¨ÚÛܺó¢¶zŒ$+çaZs"œÃ‹Gb¥¹Í›Ñê`Õ ÞVR}>Þ!ÕºƒP¬„ +‹[‡nB……J(½h^ên?ê_~Ü\»-¤§É ~ëÞ³¯÷ú—îù„¼\ÙÐÚW +ëO/?üáÜîƒTc×3ßþxîÒÉ„'xÁ„S±¥¶“›9^½ö¡R˜—cõ[>ؽÿÁˆ‹÷ñF˜R¹³~²qçõû‡r éêâÝ·¯­˜¼A“Ÿ€œlíÍì=»üà“òüM.>½síÍHaáÔˆë•׈•tâ1˜Ëê……ÆÒŸÞ?~ôÞç?GCŸX¥SóT¼Ï¥gößZ¾ùýxcω(Wî¾sxò®˜jƒ1?gôƒÌ2yCn"†Iõ³“øYÙ¼¹íU³—ûÎ+“ß93ñ/^r™`àyìpx¿|gó¤VC„à\G`°™Â¥dyp))Øà  á½LŒ‰wäÒJ~j·³q‡K÷œ˜ çgC©ž ,³w±ÃVÂàbZ¥ø¸ÍC¬^$2Ø q;椣.6i,ñK¹è„ÁK3JAÎϤfö§÷^mnÝÏÎß kcNÂ1ŒZ´+‹k€ôGl”ÅBƒ­°3L•“pHfˆ5ÁÒˆƒ1â +¡…¨ìV/«æAÊSB¡¢oȃŠáXUÍ´!F³ù|”‚ð *R,Î^žÞ¾ÓX: +ÅêrªÉ'Ûî-Ô))Һᑀä'å Gà¼2{ Ãî¹1Á‰ˆ@ÁBªP@6y‚>:ŽÓn<ìÈ~V`·”XµØXLסÐànf±%ÑÚ”2­@8¢Áp”—£  N¸™‹f ã’1çgc.\²ú«›$ؘ˜ìâjcÂÃKÙy¹¸ÄE›åþ~síF¬¹î ȉLmqû¦–öt%×—²Ó\¬AÈY en\¶ûbÐ×+rÁ=!7• Åg¤Ì­Ô6Êð‘T±[쮈•5¡´–è%»J~(?Äļ03½tÐ[¿|°‚,0ÕÔàgXRÈ[ÐqPM¥Ü­“wï>ýÀèåNx†¬Ì¸_óð%¹´.çƒáÔ›ßûòÖ“÷ÆLèé!Ǹæ_­îæ–ïƒ1Ú1ŒVåDÍI@4|ŒÎ'[Àû姶µ%/£“\¤3·›¨Ì}A,á’ŸKÁlÔæ LX|£‡Í hÎêtYÝ~„‹é­Kô ƒwÇÏçaJnt×æ·n‹™©€V23|fÑIeLÆOˆ`ÔäÀÍNÒƒ)¡cl*m.À‘1FÈÑ¡T®<ߘ¿jF%!; Ùâ N؈Á1Sr$75n#Mú‡¨ C€/¸¸Ÿ€Àlˆ‹ ;Êññz¼¾&fØh7×¹,¦¦¨˜¯/'Ês&7 xÐ v\7ø"."«à&-nNˆ†ÔÒ¨8IÎ0 °’½TÜê'Ì œIÎÇ$ƒ±¶ ×!* •ÉËú³§€çAý„àÁx.B¤ <ƒÙÇ™¾Œ3z&,Ȥ _„û<¢bÁMÅ ®€–ïI¹®b J!å,ŒSbšW2`ÄhG .ª¥6/nq#. pL‡sŸ§ÆÁà €ãµ@ƒ©\À€g^†b”R~Þ®Ú$•²Žú˜ÁŠHˆÔ1.ΆÓ>”Ÿ´ÂFàÕ±ð™‹ös#® “B8É+‘R"ß>pìĎƼÁœ›Ž;qÅG†ü&Yl†´ÜéQ÷`]X|:7}X]¹[Z86»Y7"@DØ 3n˜q"À°}”Œ‹)>^ãc5˜Õ>ʈ1ˆÍnÆOêà|AƹpqÌ ¹ý¬ÃC¸}ɽ~£8ˆùTÓv\¶Á!NˆÏ-]^ß¿GË)ªrf6ÝÜÓ‹BuxI³'e÷².T°ûÄy bD¸Š²i + Éõõ££‡ïÛpÑ裘hó…œÀô¢àÁOXáQ#üÞ¤°x9+,½ÁImöq(ï£ÎÇJ³‘Ò¼”éóɧwÐPÖˆ¼VéUW.\“SJnÍËÕ@h™\Üð„ÓhóRœ‚s‘—ΛN_´Ù^2égó."f…€ŤÔL£âÀ"@u-~ÉŽkÀa´ÃüÅ1—ÅÛ;½ç'ÜÀ8 pœ »ÑàȤ+(åÔxÇ‹/çð ^B‡dñÀ +ñò˜ÕTvSQZó¢!« 1Û|0𾩢Ñl³9Ü4ä h>*bƒùqŒîˆÑorQ§Î›‡'¼Nˆ7Úvp½ÞéaŒ6Üác‹S›´˜¶¸?ñàšW R9xqÜyaÄ2nôùahÜ94á±zB$,Dò¼š¥CI70øoÎLž²½2ì¸8Xë³ÀDPèF¹a£ç¥ f4˜¦”r˜T‹RJcVÄèÄ.Lº_:7f¶ûœhÐÑ(N•¦ÔL‹Uó.”7¹Q³Ëà +Ôņ´D3ÙÞc@´`Á$Ì&÷©-`èH£éôø¸Á?n„†.ÚΞ3²AòrH@¥Cqà[´xnu熟RÇL°ÙNU±¸››öca§—™ô‘šë8|!/.›ÝôÅ ïwOFL˜ÝÇóòÙqÆc¬n°a“VdÄq€àtCNG½ˆduPJ'¥Ê+cŽ¿<7ùo^;5dÙÁHI˜äI[»|-¨åFm¨ÑM;1bâp(ï¡â£Àp„Ô­¿÷·“÷¯^:3d´ºˆaŘI‘¬´¾{­·vÕä£.L¸&Ä„ Ÿ°ã>BD‘ †Ã‘Œžï¡ Dªbª(-º! %:³C¤Õ Ûœ„…D½ QàÄýF³™B$jCÈ 72áôYÝJQRÃâ nöÜ„œ²}0?îg4;€V¿hG€Dà3ÁPX<8NkåE;&Y½ŒÅMþ/Å'89;jõ¿2j³‚BÃÁˆÝÇŽY|àH”hJÓtpn«gÌìzŠÖôò·¿´~:’®/KÉ6P Sಙò`¢ŸÖ)±àÅU0ìj¬IÖ­.H:A +^„ó"Aa-NߤÅ)G“ë{G˜ºh|}Öpî‚( Jª Üƒ 29Y'¶:`‹Õ5›ˆ'5aö …(ŠɸRlÖü mó#!5ž,Ô¤hÒÏ-n·ÛãÂj²Ð•—‡ÌçGí'P«¨$ép™Ëħ„xzÜ ›}/ Πሢ'u=¡ÍÎNݸû Wï_˜°Ÿ·ž5!8CR”(ò Ë:\nžçt] P¨Ñ¿9ÿá³K=½ô§_ùÛ_üðÙ½õ•éR)Ç2œËƒØ]@îp?©a¤â¡é÷&¤`>&%eºYPgZÉv5µ0Ó8:X¿¼Ó¿quùéý½‡w¯ïní– +%5¢Ò4áp؇F,f1b€^¹h5ÀgÎNž9;1÷àúF&†fÓ˜ÑãAg½/é³—eh£Îìöø“K¹÷,½y{úùÍöûç~õå½úÝG¿úüæo?¿öOß¼þ¿ÿÇïþæÓ“§·/¯×b1Ý㣜nVT åìLUÞ˜Š´ÓÈTž('ˆéºÞoÅçÚ±ƒµêÛ¶ÿð»ûëßüøý÷Þ¿¹¾º2$zÜh0Ùý6ˆ=;jyéÌ›aB¢Üë†|i’(k5êV4ëSÚ³û›¯=Ü?¹µõ½7úÕÝÌä´ÎôTcn§³~B)§Õ +ø**èf[¾·[¿µUÚjój¿üêé7_=qwñƒûý¿ÿéóù÷_üùÿìûWþüëç?ûôÚölœ¸Vû¤Áéóƒ0¯E&mÝ4qc5õWïîó£'Ÿ½{õ­;ÝO^ÿÛï_ùÓÏžÿü“k?ûðòŸûú?þôö»wª·¶ +Ó¹¨&Æb±  …S©°žrÄ?›gŽ“¯]›y°[>¹\üòý«¿ûúÅŸÿñoþð«~ûÕÉÿüÓûÿßÿýúõÇ'{µÏ^ßúÕWß<ÙŒÈü¤Ñs~Ôitàh ä°[=v“ßi`kï¤ûó©½ÅÜzWÝÞ?è|ñу÷ž\zïÙµ§njjÄæ#=K"HR4ãØr™º>/¿w£ýWo|ñÖþ/>¹÷þâÿùó/þðËÀüé¯þù÷ßÿø­ãå^6"s’å(¡AÜ›—Ñé4|©EÍÊ·ÓŸ?[ýÅg÷¾zÿʧ¯o~ýÑ•ÿôõ³ÿùï¾ÿ_ÿþï|ïùÛ/o=>žKG‚$Eb°¸\ÀO„Ä”Ä÷ä£5õÍÃÌ;Ç¥/^[ø»ý?¼óß¼þ“ïüþËkÿü‹'ÿøÓ“Ÿ}°óó·~ýéþßÙ¾²–Ë¥t È#yà~«8߈͖Å+ó‘ïLÿ퇗?{mñ“×Vþø³7~óÕÿzqù¯ßÞú¿þá“ÿ÷ÿüæŸûοºýßÿðÎÞ?\lE ¯éÂȨÑæñx0ž$[é`Yv•Dë~‡¾³»µ}tPzÿÑÂWïî|ú|ùŸÝúoÿðÅßÿäÙŸ¾~ý_þøéÏ~xc¾ÜêNé¹–á#ªžÖBÕh`¹ˆƒ·¿³õ«¯þÝ—·~ôöÖçonþì“›ÿõ÷üú‹;_½Øúæ“£ÿò›·ÿÙµÏî×Þ¿žßl…’ + ¨‘QËéS#N£QØšQïNƒ»:¯Ÿì•_Ü™ûÅïÿóo^üÇŸ¿ö?}õ¾~úÍÇGß|o÷oÞ˜q\Ü›W¢¸„aŸ'ÀHp VsÕJ½ßL7“T7ìuèwnµ¿|kç§þä{—ýåøùkÿþ¯ÿæ‹[¿ùhçßÿøÆùåã?üøæg¯öÞ=þ_ÿéËÿõŸÿæó×7>ûʽëë(B8½0`/‹ÐÌd‰ÝŽøp§üéÓµ¯^ìýÁ•ùíÿïÿÕ?~ýÚß¾¿÷î½å¥éœ"PõÀ +&CRRt‘&cAßT&x©—¹¾V¸¿•þñëÿ£úÙ>^ûð^ïG¯¯üü£+Ÿ<ß¼u©ºÑ/r… œ"ù$@$ÀbƒŠ¢&Ò‘H”Ck:¾ÑÑ·§¢‡³Ñ·Žë?yoï×_œ|õîáç¯o½åé~ûÉNåÚrf®Î'õ ,.œà²¢Z àL\¢‘àÑ^.tk£ôé“ÅŸ¾·ó»/oþÝþé'¯ýó¯ßÿå§7~õý½?óô_~õúï~°óÅÃÒÉvº“å`¯Ýhóñr!šh±œÊ|+Š¾)Íu4z²Wxv¥úýGKÿíß}ðçß¿÷ÇŸ>ú§_¿ù/üø?¼óñ³õ÷¦[‰F(҇ÓÙ:GÓJŸ¯EëQ¤ónT©[Ë©§‡“ÝÆÕü»7º¿ùìÖ/>¹óÙÓõïÝí?;ì\î%¦²¼DAÎ@¨œÌЈ†pÂk—0[EÅjúz/·ÚJÌîí”_»Ò}~mîµã¹­¦²Ýo6µ©Èuàè(§€ç£8c…Œ¤ã‰¤Â'Dj¶ÝžÊ^êDž6>}uá·Ÿüó/Ÿý죣œÌ~ÿn÷Ézôîœr²šÍyÄŽøüp‚‘–—Ð&-°Û‹!n»ˆ9³"2Wn5è;+úãì‡w{úé“ÿýç¿úçß¼ùû¯ÿàÉÞn¿XÏÆ€é5C¼"];䲇$*ÒY•ª'‚³%e§ŸÙ›ÏÞÞ¬|ô`õãg»Ïoί•›@žŸÑb3ØÍZI´Ó•9Þ¢i‰Á°|TÞœŸÚßš«ÅñK]ùÁnóÃ×®oM,À{WÚÑJJREZä8 Xýa¢úèΧ±PJKTEQ @¾%d>!s•éWô™ÂÁRýòBy­›iåâÍt¼×T‘A1ÔˆÑEL8h˜Š{‘Åâ´[,~—‹'µtj¡•¿4¿¾ÿîÌW/.ýàÑÒO>8þÉ{G?z¾ùÅ“åÜ›qµ±?£J´Ûë²ãoõ… @Ä‹+;áõà©H¬×5ÒQQ}kuéò”v4ýâµõÿúwßÿÏ¿ÿð›Ïî|ùö•ÇGýƒÕR¯$ž“¼Þ€¨DÉNˆ¢h©˜)EBTB$²“à™0ÛLkõ¸Ô‰Ó»½äµõÎv/WVÈ´TƒA†  (`°“ÃFüìˆoh0Só#ˆËIB>M“Q=æt5Ê“KÄx:£r"îáaÂr¹\ºÛÏ87ð³‘L ä,L£qºPš &c¹©îÊT½—WB3¹ð•…ÂB>xy:³ÑNÎçÅ…‚ÔË„§2jFd,£Ã†I‡ÝÇ£\Þ‡ÏÛÿòôØð¨Ùms†B1y5ç|Í8ÝÏ÷§õgG½7®ÏÝÝj­· +j€À!<Îð™¹T÷¦¢ÏáQŠ¤.(P +ù\6“ãZ0®²R( +Ñ,/øIÎŽs#6ÿÁkóó„ò1Úˆ³x9‚Ñ‚ƒ{y™X²às9d&(–HŠ¼BL€ mŸÍ‰ÙÜ„ÙEŒZaâ$¢áì¢\X‚¹-¥R‚`*ÈG=>¤ ËÊÕêl³¹P.÷ä°Ð ä ÎZ\ÈéáÉ1n'b~¾Êl¸ÒаaxÔäGÀË4AˆŠ‚U¤|R™ªÅwæ +KÍÈöLöÒ\£_IÕ“ájBKkŠÍî>=41é¬m?oò½tÑ2dÆ| â¹Tq1žj’!0pZ¦âA8Æú–ë©“«Ûnì_ZîO—‹*Ïáâ˜80ÕŽ)ãn†ÒÛÉÖA²¾MN“T¸Û]¸´×Q“N IR"+¤Ò]KSÞnE]žàȸ÷ìE簳šÑ+ܼU‰`Âbö¸^»1øÆÌpæVã‚Abj©yaÆ`´;€I‹‹Â݃…ýdŒTjÁx×à ~ç¬Ñ`#¼H&äR¤¤*„+>ˆ‘VÈ–\f{˜×#z‘*°÷ÃAåÇЙ!›UüTbÌŒýÅw‡¿óòèÅqÇäyU£>îóÂ4ÁHOxÝì þ`€¸°Œ Ј ¦µ¦ÞØ Å»\´›íîãe;Êx)•Ñª‘ÒªœŸ÷ÑŠe™P¤Øœ¶yÏŒ9Fì®1‰&ÚC…‚M¡tqjW+#ÞIe¸©¸É'º‘°'-¾3Ãf‰^BÇ…¢ŸÍØņÊHÄ¿m¸=ê¤Gܸ‹s¢ŒZEk¬’Ç«/ ÅœWÝd‹„T"å"k²z•àc„”sbfX²"a³_v¢N&«—7Øh7 Ôdü¢1ZIŠÕ©P ?Ì‚™9±´klÓ};›ôp¾€šmn¡l +|u0Ö•2‹jaÏ._t §&‘ÓÉ7X4ô¯OŸðJC,o*åu6Ö3ºù3C‹‹°1ß=k;;¹¨™3k¬Þ3Bò¸›?g@Ç­BiN?ÿÊœ‰óÃŽI+îÆdVÊ“\ldÜ>ir{ýœÜÏ2¸¹13á YpÝ„¨ßyy‚ËÌ{Bi$Ÿ^:ÊNm;Ø$æÜl—ó¤ZF[¹ÞåI$h„8(Å$ZN6 ÞkÄq­j^^¹öŽZ]yÅ‚`-› å·ðHÏËe-°81X–®`ß޳㚓Lj—‰÷q¥N*`H³Ÿ`Fd¦@Á<m ™é€ZuQÑP¼­—Wp1GÉe¿Ã"-¹vI(o„r L¬‰ÙüÌ1®Z`žÛiQ±®8¹¬;˜em™Úï¬ßqÒÑ Ôà ùCy+ªº˜¤7”³ajP)å[Û­1è%.×\ÁªbrÏ)vèm?Áäòl@>»i†ËØ´’f5d âRfˆ3û¹!'3ææ­~ÉEè^6cÅ£\bšÏÌ:iÕPít–[`0 6©¾55û„b÷mó½h'lÊË—|B‹ô`±DÌêeYµLGš¨P´Â½€Ö²KáÂJ8¿4îà¹Ц°p|— ‹ŒAò9 mFu>½àc3çM°=ñK%\ï`‘)¿T™„„ÁF¨±) + NÐÅe™ä,7ÈøŒ_iQÐ:bvqØÂ’·ãq,àó™Ø”ÔL·¡í=Òˆ…tî… ›b~Ù/ÖÆlĈwAÞÝ{éìäwÏ™^ž@LX< ¶™Ø4"–ǭ䤓Á&y ¦™ñˆÐAº”¸ÐÑê¶^Y‚àbc°T`S=;££RÓ$Bµ&eûÉö­C!L«¹@- ÞPÖHZ¹ŠÉÂåPjÚ€„Áðz‡MÍ%¦Ž››Ï²s·­Tø=Ñm/\5‘ `'Ш‡-’Ѿ\Û•›—‰HUóR¾ï—K„V!ŠÉU"Ò Ë|¦ïÒ\²Ý?xÖºt2hU^'“sn.ò=S_k¯ß¹è$±pI¯_Š¶’3×#í=<Ö³³Y>ݯ­ÜT7 ^IÌÌ·Öî–®åúÇÝí'T²ïd’¾ow­…x02дêâýâƒXï¶PÞvS)'ºjÕ³Vr„¸­ÏÑñ>·*—Wí„H¨e¡°Æf–‰øl¢w”_¸=èêŸI¶*.à‘6“èqéyLŸ™„‹ÝBÑvmþÈÇ& ^Äí(Õ]":ƒD§=|Åà GKë||jØÅÙÉ”Ñ]t†I-‡ +[¸Þ7cq9=½¸ûÀËgMø; „ ZÞj^z•ªW^}ñÉ×ziñœ•‡dLkGû×ók’³7éäì$$)Å% N£îì$â –@ÄVÝ ¥—'!³W%Æ ‡Ì~ ]g­ô°G€•^QßržŸðØÉŒ(f¿fC#v"n€T3gsRqmÂͺoÉN2æbÒBaÝE%=tÂÊ!J+Ž·®WîùŬê€Jkl€  +æ©h= Up­’è^eú˜Rñ‡+Áô¢Þ<Ô[‡\jÎËÆü¼Ž2‰®7”†„"¦u0½ïj`À³ÓWÓÝ ÛÁdèX@oÃR-›f2³¤Vi.Nï< ãmPÅÀ{™h;9u_=a²‹|¢Õèï<|ëËdwÃÐüá†VßKOßÈÏÝÒëëNJ»€.˜öpi+©º…Œ1 £Z£0w»±þ$ÖÞô&.WSÝCX®:Ù4›ŽvƒÙe<ÒrKÁôÌ£w܃ +™–”ë2‰Ž…L¹‚e22˜oßÛ¸7½uÿH[‹Šµl÷Fuõ ›ßñIu$”½úà“hyÅä—Q©R[¾}åñÇW^ý´±ó˜LÌØqFk¿ TÖ£ÍKcÀñZ)5=Sœ=uÐg (®Zj‹t PÝøŠ›+·Ðr¼½{üœSÊÿꥱ ?°gÁôJº«ð6¨5“îÐÖµ·C‰),Å'wlDÔFÄ@m +eW“S7g÷ßël¿Ê¨•¥™Î:Î3zOÏ$š›éîåôôTYÁÃ…Xe |¸ ˆR© Š (¬ MØÔl¤±ñ97—ÅN­îÅ{·Só·µî¢”¥X«·õ@ÌÏØ(MÎ(•ÍÆò•ÃgË×Þ-Ì ©^±³›Ú¡õ¦RZIO_U*[±ÆVcåöìÁkr±—kmÔæoÒ‰i·>çdâà‹übK/¢á*¥•‹ý=L­ZˆÈ€5Ró8Pl}*Ý¿^]b’Mö…ÒZmíNsçUµ}Å'7'±ˆ UéhConŒûÉ€^öID퀓JkD´ <çy3æa’¤VÇÕ"¢7‘Ø•Z +å–Åܼ —í˜-/R‘*"¤øL/Ñ¿"WV”Ò²VÝЊ+vBzÊ.„W¹ÌÍ‹¥M2µ œC¤¾Ã&{Þ`²¹™™¹J%fØÄ (@ñ|¡‚”™›Ùº 9—j,]Û¾÷½éÃçÅå;±Î!ï ^ܺ³ÿc,;ȘšÉL¥gŽS3‡‰é«¶@bçøycöÀ…«—HôËË'Å…;ÉÞõìü n^´qp(gAå`z–Ë.ÐéY¿2P€£8g$m¨2 âËg ¾ófø¬³IDª”&«µ&]ìËC6à ANùøŠ‹Íù‚ÅIà)mzëI8Ó7úE;‘`Å"Àu»˜,–ƒéy­²r ¥;ýµ0í È´ZV·Úk'Ý­G©©=.5E„s ³ý«ÖNid´©UvÒ½›‘æžVß‘ŠË¤R”—@„°ÉépmG¬m }Ä’^Ú¨®>`ÓÓZOv.kåÕÒÌÞÒþ£úêPzš’KÍ™ýRóZa~ùðùüÁ­ÍGµõ±ÎeZMoìÝ_¾üØF¨fLóKå€Þ1®lÓ©H(k¹þöB¦Œ¢\\eÒ‹\~-6uuöê‹úꉘšÛyTZºáWK¡Ò2‘Z„Ô)*µ,•v㫨ÚÄÅÌö7˳ǃՎdÜ#”½RVj¾`.ZÞH5¶§W¯–ç®xÄ2Ø–ºm)IÅ€Ò–od“Öå¬VßJK±Ö%!¿ œ0?j Dé²×¹®¬kÍ}­u%Õ¿iб(@ÇÏæ÷€÷«s5Ø`·¸k^–ƒ‰p°þ`ª¾xÜ\<–2@íÛd´Í§¦£å……ÝÇS«·L~‰Öå¹£Úú}®°2Xð®wp¥±²÷HÏõ¬¾à`Åkk+R]ã“=6>«Ýq¿vÑ „KvLÉõ¯öß*n>–»J}[®n!joØΓáj¹·ò«Ÿuá²Ù¯ø˜0lˆXµÂÚ+ãÅ/áR͆ëçLƒOÁ¤*µØä2€SPôh»™¤#7Ãa03h ïå,„æ f(k¹y.Ñ…ÃE*â|X)>3£”— µ¶¿¸Jħ^™ðB+ÙÙOt®b]w0=<9—εwI¥„“™éýòò0þÍõGWSýkh¤f'µÜÌ—–F£ô*"Íi¨…y­¼„ÊE¥ ±š”¬DË3R~d7.á´–ŸábÍ‹v +à-VR±2o‡²‹BnYÊÍó™® —h¹°vôÖÔÞó`~IÈ/©@Uô:)Úó‡@Ül:Ö½i‰åm¥}L&—A¹95Ñ^¼ü@¯,¾<áu3™§7vCù¥Pz6œžÎÖVž¼ñÉÇM¢3ó 5&½\\>™ºò~fñàêâÖ­§ïÿ8V]‡¿Öó©3:è]¯_zS­ïXQ™OM“Sßv÷M³êfÒ˜T•:mߟ޼-çfjýƒ`¼‹HeL®YˆØ8ôÿ³÷^?’¥ÙØ» yVÜátwU¥ oo\ï½÷á½7é}eUVuÙî®vÓ=3d93K.wÉ%¸Ä.„ Aúô¢ÿG:·F»ZéI” òë謌ȈŸ9çgnÜøNÌÊspòÕ91á6¼¢åòêûûŸ¢ùç¬;½Yoý2ž\qîD¿ˆ¾n®Þ‡ÖÄ*ÖËà13¨Z¤>X©ƒçáúÛpõž´Ù_¼;yûgÀ&;5­È\¸n|]Ÿ½ˆ'·Vó°@˜Œ6f·”>Ìá.DÑb橈ԇ­åƒãÕúQgù¢ I$¶Ê´_fiÜ­pMµyÎ^SƳÚ:€¼«Š1y˜y©~¤v/ g†h]ÚêjeIðåú²±y.^øã;ÐcÝË_sÍòógÖøº$F´ vé@Œ×€{V÷2˜ÜU'”úèôËáù‡xùÂ\‰­Ìî$^|,O˜Ú¨ÍC½yØœÝvÖwÞø*Ïy‚ÓÆg¤+~Ïl‚—é+Fk.˜ƒŒÔÚçró¨ÈYjc­ïFßl^þnöì§ç"¬m7ó›oß*'{DHáÁðìËñå—£‹¯@#IÞÌhŸVïÕdÈ‚púìâí@áx£à/xpUÝþ%ëô3¸R“cgpÚ]>½xþÅo›Ó+DéXýgÎð¥Õ½›–6þàf}ûÃé熪T¸ówÍó?óW_šýkkxËø+0ì¯~Ûß¼û¨=Æ[t?œ¼ù—‹§?ß·—ÏÀEüÍ?üOËËïPs¬Þ6N’mÕ;gßDó—”Þ?ºüê?ü/ÿÛ7ÿâ¿Ä®ð¡Ú¹ +æï:'ß5ÖoÜÁ…Ó:|öö/_|÷÷\°ÀÌá-„øØêÝÈÍsÆ[“Æ(ž¯o¿eý)nÍ1cRä’ÓVR8ï¾:|ùBkIþÔ¨øCůžþÀ9³< b^³êÇÏ~ÃÛÓí‚”®Y Ö&¿j®Þƒõ#ŒiØ;ÿÿ?|þá÷O2ÔVQ,+#ÆÝÔ§¯šÓ—À›’3°Wà’`Vq¹auy!¶Îo%ćõåáìM8†ü8¬»Ú>’ê”;%)n¯^þ…1¸ØÃTÞ›’pÑ2^½d½)¡÷H³'øãÖÁ[9^L¹£›hý¦{öËÙÝ﮿ù7Ã«ï ³'E3rU \Lj‘h§iÏX)ÖטÞújcUä#ÂùFI¨ƒ¦g ò• pðëw¿ÕškPÅjûTÜ@„‹Þ¸³zuüî5µÃÚCZÑ›CÖÇó[or]KJïµôæS›EÊ’¢yÐ?™¿rºG{ˆ¾‹y&$­±ð«58=¶ZëÖúnóü‡åó_Å«»„¡ü¹Ñ9/2>@e ‚éóå퟿ý×jÿ®"öÒ¨ /‚ÉME®ïcZº¦•¸묬Ás{ú²Àz¨Ï.¿‰|D=Lí€Õm/ß Ž¾m­?€%¬©ƒ`þJnŒT¥ž_c½îäæö«¿ž^}͘€/°½ã 0Sw¨Þ¯É ¨&³³¯º‹€zûЙÜuŽ¾ZÞý6^Q–ºyÜ :'ó˯ ‹yg.7OÀ¬1 'ÏÆçßF㧤Ò<»ý~yòúãNÎatÁg-žÿÙæå_ÒÖЯ„œ>dµAð>.Ð>nôõÖ±Ý>hŽN¹äÛd–Þ¾ˆ×_!|½€j™’€Òžd¶…hÃkÒž2ö$˜\›0_ÊI}¥Ëáå¯ÀŽ™ý«2Ô¸ ÙÎ]mÚý‹?v¯öã¤ãõró0…I-Hk€[©sL8à +ð¬?‹çÏAÐrÞ oxþµ7{noìÉu´|¦.p³ößÝ”H¢Ü<Ó:|xˆ›ãŠÒ† ½ŽÏkz—ÞWû´5F´ÇÍdÇx«¹xöëªÔ€ŽMÎ?t¿™au/¢ésˆçªÔT¹^_%Ûñ©]µu¢öÎÁ$¢Z‹²Ú”Ñò»'nï8O(YL›¹[Q1mAëNî8{$jõ£³×‡O¿àâ‚)­hl¥7åpU¤m=šF“+»wä Ûg5cZdÀ•wú›wöà"Cè¨RZ·ÄD¼»Ô;ׄ3ÏS®êóýïÀ)oå +fûtyóÓüæ·ZïÙVEÏQ>¬³¸Yfüí‘jÔ…Ý<Š¦w:€d8mL¯8»ƒ«QMiÖDkã§Vÿ +À¼&†­Åmçà-¬¦Ò>ã'Y¶N(}ÐEzë—[Š7_|á +/-DYãd¿/Ú=öÝòø¥d·ÕhO.º‡ŸÏn¿ï½ËS¸E`CÑšÊÎt++dj,ÃùËáÙ7v÷¬ÆGD'´^4»³ºçÓänEX: 7«Ó>úÞž}aOÀŒQ9½¾à(«Ÿ P¸ÆíYEBøIáªÊ:ñìY¼|dÎ_‹õƒšÑ/I­i1FUb`·ÞÙwÃËìÁSXhwx%ÆK)œ _οÆôVMk¢F øýê«¿yñã?Îî~«n«B&4Z¿ÅŒ>@1"÷»¼áÍÍû?̯¾òF‹D˜ÍÊ| :Dˆàø£¯G·¢ErzƒÍs¯Ì:cÒAP áÚl_Á`¸ö*çN¥ø@…¥éžUµnŽuqµÕ[¿²[G[9ìI¶–Å50à¨6ÄYÍÀ²²j3î‚BKã†Ü<Õû7Öø%ˆ:^NºE°=/âéy•wjrTê”5óÇŸ[ý[XÖaA®y@Îx·ª™7gbý¬¹|?8ú¦µz½]’hµ3Þ;~wò꧳7¿ wl¸ìŸ}1¿ûµ=}¶‡ë@ôÑôµÚµp©´ýþÙìêûšÔ„U°WõÃo;Ç_ƒÜâ£Â£J‹³úðŽ˜è‘JCkœÓ—ó›_N¿5Z'ˆÜH¡ï-8¸s@NðàÖð9@à¦ö +”W“êÛ%Æs‡·ý‹_ö.¾\ý*\…Z3°6^ÿdrñ­3¼&!†[§|t¨w.áåIu9µÑŸ½úîog’&]°á¬¿¢©?yÌßϤj© ÌÖ¹ˆÁÆìÞ€Oß«iO²,g$Û¦qþ¤&5P¡A(%\Ñöüiš°ÎÛÜ|¨Ï®K¼o´Oš›÷þä¹Ñ¾„‡Ó˜õ8Cí–ÅŸîäÆìF³g£Ë>ÿíÿ¸yý»¹[`0Ú¿qûg™•EÚ‘&‚’Q;)DI6äq§:œç hᯬÑQ½£ºŠß•ƒ1LNQ>ÝCÿt«šCtVë)þ¤HiT"µN‘†m*Ñ`bw¿$sZ‹Õ™ +»ŸcÓ%…³Cõ2m'{e4Náˆ@«¡.„+ÈNH>\+“púy´|§÷/ +l°U¡Nê=ÖÒîØèž»ã[©¾¡ÌN ç+8OʾÏÁWv“Ïh~?~ú›š9N¡ +¥xV4´ë½1—ë pã‹ï¯¿ÿ·½›ïÙÖf ŒÆFð”B1Þ N¿}ñý¿»ýö߯ÿ"O8(ë¹Ýc­}BYCˆ=¹q*ÖÏ[›¯½á®u+”a5ÖfëX +fIå­ŸªY&ÇÝ“oÝÑ­ÎzÇo¼É ¢´Ùp}¨µ/ë›ÁìLLjÇ'¯ÿøwFL| v/™øP¬ή¿ë¼f¬žß=ê| ¬môneXå`¥5º«—ó‹¯Y«Ç;£xöÄg8¹5:„1jÛ¯ªBf´*€#cPøð¦Îà©à®ôÆ h€"£§j¼Îã*µhgnôoÃåÛÖæ Æ–RFwrñµ¯1­G;‹S‡UØ"„·z{FõÇÑàÔl®üÑ åŒ3„™A$Ý9M1ùÒ\duÎåpÃ;3LnW…æ^EÙ+‹Fã@𩪎«=ܱ^Rw ×zÉÆïeÒm¯âñ „Ö?Köú“ÄCô*—I/ƒ;%®5¿Y^Gª½GižC³Æ´Ú-Ö^Iü,… a"Òèo%ûsò炘¡Ýl@¢ƒñ|ß—¥,1\}Ÿøü¤On Bœ¥Úš•Y¯DŒÙî¼;ûòïW?‰£LòåD‹QÖjsÞ@oÙã§à¤ÄÆ)h`Ö¬ÓªKJku”ÆZmn@aÔF7Rÿ +Œ”Ù9¦&*† §Ïžž¾üéèÕÌñ« +ßdõ®àŽjR„)-ôÌì\†ñgo”æEEhV(ÛŒ‚ÝIUÙ*ïIáá[Œ5¶G7Ë”9ÝAwsÇ؃ª ÁJ©CÈ}S?ú„%¬»ŽÛë—jó ÈùjçbxýãÁë?$ŸHž}'†Kð8ƒÅm{õ¼ÈÅbtÒ>üæäÕ_^ù/—/~Ìïj|uÎ^þ¦½|^bÝ<åäIbÛhKö”UÛ¹šàµG' [ik +hPæbÞ[%Zt®@ +"|Ô[½î¥´ÎÄúiŽ³„ ë(8 %ÞMpþ¬¹ùBšH’½YæBˆT‰Œ–hµx³Ùœ=ÓÛgàžP±!xóí?)ðe6B„F¦¦r[Öœ³ “=¥# -LéfQ ¸ ÄGyW¡o +³i ¯üÑÓŠÐúçÛ5ZURÏà^Ih–Å&¨‹îú•Ó>©Â«(ŸPz(:¹›©(ûå¤,ä ¼&4ÒLøI†Ú¯Šeʨ¶Îê‹7—ïÿöüKBe ns” ФÕWr¸›§BûRé‚×ûvxñSRoˆwÌæÜh­µ¨ø$%tö1×mž6ïÀ} ¢O Æ€ƒ›^ýÍ^äi=…r¸«­c½}Lêm%˜ôß ®ºç„3A¤eŽ…pƒÉd;8s&/ cà†ÀKæ ƒ³‡Fç’qfIÍAgìŽ_¹ÓwRý‚1©*÷Y¦†æ ¯Dœ=1šGR0w:‡vk8€‘ÌAÞ°ÞLjœøÓ×õ¥} s›#&½ü©µzÉɃ’ÔE”ãLãÙsÖîz·¹|5¼øvtò¦»y%Ö7%¹ ZÂi·g·F}•B¤2ãH—ÐǬ7O£æVžß)KvsÓÛ¼¬°n&ÙÆ*£Íìò‡ùÍOr|œ®ŒÑ»xõÛùù×U±AÛSàM§ã ŸêíÓäjD±:ÇÑì)¢¶ž”¥ãæTÜ h¹Á«u+on¿3º§¾þ¤¢Ö¤*wuèŒî +„*°v¼êÌ?‡xΠæ£4µ•ç©à¡µ[–P1vúõõ[ˆ^Λ“ú°@)Äç€s×2äí©1|æ¯Þ¨à¡”¹š‘*+²5­/S%ö;ÕÇ)šÑ†´Ö¯rÂ)lQ¿È… 7Tw‡ÅÝàäÝàôýðü+w| *‘6‡J}ÂníÍûåóß®~Ó<þ èB«³nÕêjëÔ¿ÛÏŒÁ›îÁw£ãoíîE±H­!Ç ÒìZ ´¦¶õæáá‹ßùÀ)iT-S¦è €I…h­ Ÿî¼¾þªwöë¯1©>Ú܃ӲX/òq‘­c*8èE÷àCëð;Ú^ÀœW9Ðo ¹q-ÏU¡QS:áônþì§Ø¹#ùsÊžÀzU¥äëL¥ä •½4*³O‡'_¾þ=å®wªZÓA½¸ã + F;ëGÞôÝá«¿Y¿ø=,3˜J²³ºë¬žãRäÃÒ'×®¼sçï){ªf»Ä%õSê›TEÞ-‰#xræði¸øÀ:3TŒRU±Êز7,ÑzMp1ð'½•èo8g‚I )X"bþDZ ½z9:QAþðT +ÆÛ9F²Çáði}þÊÝ¢R»Æz¤à«þ@ó{˜`‹v¿5¹'7ñü¥aæäIAÊVE*¹¤ª‘ªˆ€i”>ÐÇFû—;{eåÓ}B°Ýå3Zoî…Ï2\–ŽÙú¹³þ¾uú­Ù<(aJÜÙ ŽÞ‚[üù¾[VSd€Y ±}ëôõ8…kþt}ùý“4ýómž@Ù kø´&ÄŸڠ͞ÖX™Í¥O$¿K(Q%ÙJ«îuÏ£Ùs­¹¡Í.<Á‚‚"RP\' 櫾&­žoÌ޵ܺ€ôç=°!­Jrz°¥4íás0Ô½`¥h%x³`|-ÔR´ŸÂLJï¹ýs5^…£Ûöñ·lt@ûKDïg¯ óàNqk”Æ-)(1±~ʇ|tœããOŠü§E6Cè¼=Bù€³u"Gë]óõĤI®¶‚ÇP©iv.ƒÙô|õôÏýÑ-„„b÷ÍÆ2]“ö¹*ugán§?Ê‹2×د(eÚ-ö~|‹6 H÷Î(üí4ÐrGÑüEsý*š?“âe² ›Ù-P6Äv‰rs"¼‰Ò8‚ð ui»Èø˜Úi|íLßYã·z?©Î@=PÑ”Ù'¤¦7|iöîäøT®Ÿrþ*Ù06G×hW ¦EÊÕê§fç–õàÈ€¢F÷iWVÏnh©)}Ú?¬(cÒZXÝk»sU&FŠÖ—ï9w ’‰ ŽH?©\ovŽÀfVx¯*ÊÁÂýxN‚ ×û¹ÄñU¯eq…PAÌHc pZæ;U3ƒ¹¤>¶Ú—R¸ÚiD8 ™¹E˜ ºYÂØC ÒšFó×Þè)©¶Ÿ}øëû?#í9ªIgV›û¸]`|HÏ`hiísÖK6±D™¨(l+'ö´ÆEB¸XgŒ‰Ý<µǬ9„Pß)ñKÛÛ9|/ÏîWuTAÁð‰tø$Ë7¯€O· +Ò^I ++â6È6+ž3ÆðOw±O÷I„‹ËŒŸªhÛ9~–˜Xr—Z´Æ„x+Ϥªr +Ñ@•±Ö[E2¨2~Ü?¾¿_µ9ÿDBYh¹¨"µó|ü¸"ïT¤+Ó­5ÝÁEª¦&%Ñé3gjûÖ¼i$ê½ùáû@ÂfÌI?Ç6ÜÉçã‹_*ÑòI%…ã£,f€ß„xÛ«¨O +rUìëݧ€ü»©ÆG÷`V)µ„•'=pÁf÷*ž¿Î zwà† m5:†`®Ò!È­4fHááÃ?ÝEÓˆQ›’¿T£o+T¸“÷+kÏ+bƒõH{7ÜžeÙB%9mOÄpÔÏ;K½u…ë£*ãJƒ±‡j|ØX¼µÏjò Ìw +l {)Ô΄²AMnÆü/>`Ô5è.ˆ:gô ¨[Ux—š”E“ 5ÎÃå˜&Z礹zëO_‚¶Áäcty³Ó˜\ö^³£ÆC ŒÖ®ñ.ˆRÉî3€zÄèuT Qy¡RãüLU挮Ý<”Ý ¥uxlúŒ^E]ÝÍSdÎîC^è­c6©e6åÌ:#­yX•àÇ¥DÀnžŠñ)ã®#Jtö€±ºÚ]ñá $#¦uäÆAšrÿäIÐî\pÎxj¿*Œ§ß;úÐ?þ¦¦´Ëœï¯!)ª¼ª …êYÜ„˜ž}X¼ø ¥uLèýÆò¨Ä’ç/Gùn;e•Ñ{zc•ýè+“âPÖ ÜðÂ^Mß) 5.¤ÔînžuöÕÇ”³Ò»—¤Ùµ¶Sä ¹à…éª*øŒ{HêSLJÁ!kôvòô~Q,Sþ£4 I˜Œ_Ø£GoÿÕ‹ßü÷áøÕ£4[Âíáì ã½Rr™=eŒê³Ï›«7¼7K!úøèK%:(³õ}ÌIÑqY•r¼~úãwý?ÁUIŠØ&Í™Ý.ø ŽÕ:ê˜Ò©ImÁ5u¹Pâ“s¼7‹©¥B`¹~¥Ô/²dºº@ù ©@ÉÑ!Ð+c @çƒ/ñ1iöýÉ­Áñ»E¦^å"Rir ð… >çÔöarõo÷€”óf¤ÒdåH4›ŒÙFää³›`òÌé]"|\¡]Éóf¯@*;¹jK”¥ÄG­Í{Úh7h¬ÖÍnÓ +˜N(-9>pÆ/ôþMMi¦“"Ë>èÒçRö°¦õAçÈ­€J­u ØU`=!Zz“çVÿ†´ætàFÿ¼[‰Ô³¨,«`ú†v¦„Ùç£õ.áþb¯ŽäŽó¨š.sàÇá}ù£Ùçfœ2(·(ž\‚Ë®I! Ô¦ŽX/ù0nñì×›Ïç&Q7›Ÿ+‡‰=”›'°Ð„6¢Ô­÷ ¤ É"¸c9\ŠK#*¨¸*’:Àµ~‰ ?ÝE¶óìVQØEôf•A´³A fؘ¸Ã[Bnç0K«Ÿ‘¸Ôf™ö²5íÑ~õq +…°!ä>„(dœ?µ|õWÝ‹›/´Öeõ>Ù#6ZÓt…ò€_ŒöYsñF‹Hc,·¸ü¥Ù<mVÚ\ç¶wùãݯþñËßþãÓ÷¿Ë3~ Œ˜Ö'´ï/+B4³Hᆖ„9ÈÎ>êd€LÅeR NrŒWÓ:åN¿Ì'§ˆ“8›´1¤Œ^‰ @úârÓnvW¯ st@ý i4"Ô!m.{r0¤ÒĨ‚lSÛ„9­¯ÞÅë·°Än5Þ/ÑV‰M>­¨pa™«ã*˜…c)Øÿ>.0»%†R›˜W„ˆ0Æ`!­Þ³pþ%Œ(]‘v²4žðf#©4at gÌk1>æüeuS5‘fJë¤uøE´yO¹‹š +ÈÖ€?áz Óš@dU©)ÕOê›o›o.¶òtªª`r ’ò… »¹Ç†Ç˜Ú« hÿÙ>–*qE\ËTÅZòÙâˆ4LjÜ-§Ä‹ªòî0˜¾6ûÏŒ¤ð匶»à£+R]çþà"OÙ ˜õö…T߀֪°qºªoÙ¦û—ëÓíj…ñ$Î;ó"×ÜEŒ]DÛ-‹@èr (“ +¡Í ïo{ë²W‘v‹ ì<É1Ù¤˜²Ÿ•þ±Ì­Õø4OB¸’ë‡Àì`N…í²YSƼ3¶Z«µÞ-Â4Æ@š°¬»u§¢czB¸1Zç€EÀ× åôεÑ<‘½ #Õ³ˆR;Û ¨Ó„³[Óá–£<9XºÃgÎä¥Ð¾¨Ó,XŒjrm@‘ +@0ðõs60ûwöøµT?/²Ñ“<•F$Dˆd’+xù¤-íâæÄžäŒ2ˆBÈM0ûÓ·ÁòsÊ;¬ŠÐO£Âzœ=¬p^‰;c(ѺuðeûèCûð¢tAè‚.J#I8m¸tž‰á¢LMÙÎ1û%럥ð¢L!x«hñyž Ÿ”„0†”SaílrIºWQe¸2â 5A®—©€»Œ\ù|†ˆ¹¦ègõŸÂHçy\íù£;wü¹\?.3.èÛ­»ˆ´Ò.ÖôÏöð<áùÛ͋£ÅSÔJJ>:BÔ'@Í á…è(Z¾ëÿP‘º¨:Æ*ÕA–öwu·ªàr«>¹žþr|ýÛpý!Mx;eðJ‰‰€Ý*r»fŒ„ø ¢Tï^éIé³SÑ ,Q¹«Ä Õ`)S¨쳇(Ù?âÕÇïzRL%µ®oœî%J‰k‚ïF/”RµYfAôî)îÎonŸ Ÿþοʃü(‹ûe¾BÛ²»0[W”5å£C ,®¬@¶ÎÏ 0«ôÊî_Iñz‚kCTÈá†6E¾^–:œ·nl>Ä«/„èUûàŽ)½-»s/ï„úA¸xÝ=ý¦{öK68È…Lñú×Ñü n/«ò±§48#ÒÄOׄ*«ÐØ|µxñWRû@ a+©ÅÙSÖîÓvÛì‹sÒ\ajr†¤ÂÇ{ÆR$,R©KÑ›\?‘ÏÙsÎœfjæVËãÂÕs8p_‰ ”!+ÖšƒÒ~”¡~±]áä$O™J\̇ü¬±x-x³LM(QºÝÚ8í³Oöp°·9ÊWú {wÊeLÿÕÆYRvÙÝ”¹vóeÿ\v·¥©"åAxT¤>Ð_Ž ÷Êê“ 2>g´I½ƒ¨]::nÿrzó“?z!º H%9\ôŽ¿ÞÀÜ(– Žåæ9pAš´!p©ôÎâÑU<½ƒ¹M¡9Kø@^OÊ|†¶m tnÜÉ ¥{Ž‡ñò@ ãC˜:8 €ìmPm¿ï jÓË|˜|¡w¥nÍÁ-ïÎÀËøÃ<Ã*ðÞJÀ›óî„w€U;yÆæ‚E¼ü||ýÃêÍ¿šg»5äD‘d»Çèí"eg0 ¸Fk_ík9<Ü-²û%.9=H¹` gXâCÀ4µy.Å ×ÉuJ‡v—`ß”ú¢öÁmqቬ£Ç˜Þé½³hõbõü§ùó?·&/ªÊ°ÀÖitÎW[„1£Ó¤²gë´f ²,ˆm©ÆZ¼6“ëuOQkŠ€@²çzë\Š€OgÐ9ü<9OBpË>e-ÀœVùF…ñw 4»n÷Äìœ)ÍóšÜ+PQŽ€àlª1¬òQR +GjêÍ1>ÂÍq™mî”Ó?¢1*’vRÛùÓzë Œm†0 m[³;Õ_ü³Ï +0QjãÀ=—Z7Œ=+@d¦é j‚äY‰öŠt(G¢Hjc-J>?IUÕ_ÕX—%ܪ:rAØgC ¼ƒžœF^‹–oÆmŒH¥‡Ju§s48|U&m@Ôã—¥6á̳l¼‡Zy6.²1c AäÔDOTІ2ÖˆÐÏÓ1¼ÅVE¬i]ÌU•vAŒ0{âL^÷®ÿா$Ì1$@z‰¯›­‹ÆòƒØ¼ÁŒYžkd“kWšˆ%%æ9ð)L#h9Ö™@>‚WJã&Ø|Ò:ÃäË× s”ÛÙ¼n¬nùpˆ]T{&ÖÏP)¢õv†ÐÓ˜"&—˜ûˆž®™9ÌÉ¢&*$`z“w:Ãó¯äÖBL’®æHWŠ×Œ;/°!0xréWýHë^sÞ²Èz`Áý± y·böV½Ó_ý;è-&wò¸Î L︠$DZ÷t~óãèü;«uÀé-BŒAÞ××oqk + U`ê`søà ¹~gõN³˜žGÍ*Û€à„l%œEŽ­C²ìVDJïu‰wEÚk!<œü`Bh}Lj§ª 2T“ÜM¾>&´(sEÙ1<‚ ùdO! +cA½ïÕ¬š6ôŸ[ówÁü=È’GYöQ†úóEšÃ¢Ð¬€vjãžÒžOò, °*X¿ÄXýOVLX¥ƒ<žl€ B¦ªÆ^IÍ“!-Ö%ßÝP[EÚ{œcfoEoA›ÃšX/Žß½@”Îadù0|­»…™sÊ\ší+{”Þe!Ìa÷·ËF„I.¼1úW5½Ê“r&Œ»¬/’­Èñ]‘oícv‘‹JɆ1ª´¡‡\x.Ôo¸àŽSåJ,í›ëÉõŸ;“;6\™`¯¦ÁBTe°äf†°A®ØÃWñòƒÒ>.'[C¨ OPÐWÖ°À‡»ˆ˜g©‘|© +×ZŸ¦É'yr° À5’ÅFŽ¯ãæHiŸãöäIIA„VŽðr¸ÊmTiÁË sb îjúx«ªf ©›'z÷)øAµ¾–ÀOv‡vëˆq§¬¿HÞVœ—P²^Ò ícÐÄãŠK!¤Ö”poMÛã„î.í¢>®/Âù[·Qf¼2íݳÉå/^ýµ7zË´U”¶ýø†hìÕLÆ™Ÿø÷íóßî´únQf­Y8z9û_ýiö;xMêõŸýÕèæ7J|ýÆy ­A³2¸R7ʾ¼úæ¿1ºÏØ`•]-4ò\½$¶m‚ ȪÐÖŒÝÍárVóP¾'ùÇíÍL¸Ü'M³u8¿þUUé`Æ fô²|Hdæ © +ÍG„5‹—ß6~4z·ˆØ TãBɘÍC)^¦éhõ+b_‰¯½Ñ{)>ß©¨ÜN¾9}c^Tõþ>iï£:¥tò”ó¤ÀnØ*§Îøë¯Ó„ù¸À—˜nO +BžiåL>ŸÜü¾}ö£Ð<ÏÐ02©öSˆ¹•—ö“‹ÕãŠØV[W‡oþ¶yðmŽ‹IgäžÙÃbtT뻘±‹™¬5ÑëGe6ϪØ&ô¡Ójž—¥ArFøˆF‘›e±^š`0µGªÝÄ +!Z™‹Ådã‹dó¸›B4pñ,ˆ%oZSš¤=–›Þì5¸ÍSÁvAÚ-I9ÌJWå¡—c'Çlçy„¯+á‚ûÛ-óVóÄüNAduÿê7j÷š÷)cšÌI0kŒNÊ´ö‹ýjÌØè¾in~ɇ‡0êÏÒ¤Õ8X?ûev÷íç)j·f +Ñ ¨e-©ë|"¬7ÓA€€y\’+ò2ÍÕWã«?¯ðÍO¶± b@8öÂþQŠIán«“6ÌÞ5©õ2„ëO??|ý·í£ïÕÎÍüïÿDÚäÿïüÕrßÚÃ@î[{È}k¹oía ÷­= ä¾µ‡Ü·ö0ûÖrßÚÃ@î[{È}k¹oía ÷­= ä¾µ‡Ü·ö0ûÖrßÚÃ@î[{È}k¹oía ÷­= ä¾µ‡Ü·ö0ûÖrßÚÃ@î[{È}k¹oía ÷­= ä¾µ‡Ü·ö0ûÖrßÚÃ@î[{È}k¹oía ÷­= ä¾µ‡Ü·ö0ûÖrßÚÃ@î[{È}k¹oía ÷­= ä¾µ‡Ü·ö0ûÖrßÚÃ@î[{È}k“ÿõŸHó·þ‰´ÿr_;]¨ÓëéÏ:æÏö% Ãýxzu½¼ü™ÿ³ýqYº¼Væ×g§ÓËç[4vÝúxŒŸíïìgô^£êÏ:ÖQ“šyÊ)²®¶ ½K(íšØ*ómLŸö S{_ÿcéoÉ_2ö„4%>ÊÑnŽJŠi R•šeÚ¥µç •xŇKÊ™ö 5&Œw§½½2»W¤ +˜ŠÉuÆ ÑRÞ +µFE)N–NYwXꜻRâc½}…›“ªÐ!œ¢ôŠL˜Å-Dîàƈ4GJó¸¬t¶*rR·Yl@ç3¨Qa#Þís.\áÖ0K;1. >¦7R¤Žj-µ}¦÷ŸYÓ·\㬢tr\¥]­yêL^hýkµ}a îØð1ÚÅõ~MiÙ`Ó÷+R‰2«œK¨ LmíU%x/Dlg(/Kùy6¬©]誴)c€*ªÔuº·Zó²"÷Ó”·[Ó÷Q#O»R°äœI–0²˜Î#ΙáJ/‡»iD/Ñk ¼Þ¼c… (mªjOrlw +”_¤üÆ7§¨6ª©ƒDOcv‘+\½ÊÕIm‡*RAMìäHoQ`ÆŠL”§¼<é²æ˜·g¾^¤£=Ôú,Ç>ʱ;ei¿,Ubæ·ÒˆR¦ìóiÛ©ˆÜ„—çH¿&v¾Yb¢tÍ€UÀ´^öv +l3÷«ÚNQ,Ñ!¦ jbPG´5c¬qkúÌld1¥ÌÕ{.ÕXošÁŒLÞ"@D˜®IEî¦ /š„ÚS¢äÍ«´¯FkÂèåY?M˜e.¢¬mÏq©!{ƒ"íW%")ŽzL»¨1ÃÌ9ªö“‚Þb=‹ªU!¢9|*5OÙÖq”ãa™šG·ÍnË|XæB>8tÆï´ÎsL¸8—”Ítò¤%Ì,‘î¨J-øS‘kÙú~Mß)'µør¤•Ô&Ò;%>®Ê>ØXƒõùëñÅ7e9È1ëÍÕîµ·x¯õŸaÎ3'¤>\_þº{ü¡ ÖÓ¸)„GÑòƒ=zY Ìš•ø:Ìd‘ö+lÿX.†OÊ`R.,ÄVÛ) +ImX¹³]ÕzE¡YZ%¾U–ºU¥•þXA3&Y*)!›%œ,a§Ñ¤"Yž°jBTbÜ,n¤-Zø¢C U™zй´[gWÛYf¿,oç¹Gi*…hEˆ"¹Ošóª4¬ð]Ö\óö*UÓ‹”Wf#TîB ”y~›4¦RxTâÂO²ÄŸ¦PˆLZŠîR°%Æÿ,C¥*ZOv4ÿd¿¶£ª”‹+BÖ¸øIŽn”™`·,î# +Ì@Ž v*fw!JKb w–e>Ê r7·a +|…‰´Æ…ѺÖW”1¶›g¯¾ý‡éåWÿìIžóWI•ÅéaOÒ˜ù1‰Â<éí£Z²76fA +Á‚w§¨“Bs~ö­ÎS„¹U1±eõïôÞ3Tj ¼—ªÈë#-©Sš¾…S1<2»W¬=-Q¶èNìÁ•P_¡F3†°¾”³Pǃ£/åxSáCBéÈõS±yÓ"S¤‚)ªpaž²·JÜ^U†pC¤n‰kcʨ*´19ÙC=iâZ³Àùe©©4Ï›‡?tN~o^¥S›B¸àâ¯Qkª´oê‹÷îàiwõÚî_d“Ò:¡n»]U‡¨¹D’Ã6hc”ÔP-Ë»Uu·ªUŤHH¦¦?ÊP{e¹Ê×!’÷pk—tóB§,e"4.+j{§*ÁÊÐûu¯(~¶Oɦ /G¤Ü5¢µâÏ ¤wÊÊ>bîUÕ fU¥íž¨Í 1\g‰÷v‹üv}”Bg(LhDýkÎ[•åÞ~2.6GȀτ6¢dýCx¼$´+B“³g´ÖÎãD¢tI{!F'j|@½ +ëËî¼¾xWâê9Ò.Ð>¦u“"i ´$—à¯ÍîyIŒ—Å2æ”XW€nëô»_ý»åݯ +RXà}ÌÓÛ¹Ý{êžfRÀR,OúU±GÙ>ºä£ Î?f¼5ä­´„`•¦ ë T„ï­YC¹+³u¾ºú±>»K‘&ªt•Æ™;~éN_»ÓWB¼1âÃ÷_ÿÔYo£PmEêWäcÍgNéƒD¥ÔtXn,)ÎgÉn9à%¨@¶ +ÍO2è^†ãAk ½ª‘#ÂÓc?-°;%5O5h÷XˆÎøà˜²æe¡Š–f¯ÄoçéÝ—B5Tl“JŸTz:Êbv5YöËb·€ûvJò“‚¸_5ö+:„Vô2¸µ]æçéŸo—ŸäÙ½²š©z®Iµj$™÷¨Èî 2t‚–s7„>®I]˜vÈhPË0ùYÜœyœ¥w +âNAÊ¡nifª ´2å?ÉQ¿Ø¯}–¦¶’ApÀ\Ræ±bôÒU ˜¨Ì7 n){¡‚«Ã;x’%?Ý«å1xU´]•ÄGE™Pú­Ù›Ý2`fš°FEì²î¡Õ{nwŸƒ¸¢åÐk˜3LÔ”nD»Ú”¼hNw|—Á]ÎÐF/G¹p”¿1‡pǯŒîékL TU @UzÛEy1 ÀRvKònY..Àc +5¶‹ÜãžÇ½’ú8ËoDÐ ”1…„Í^MKŠô +Í,éBŸ1¥^ ^^›„ÒKÕÌýŠ²(T’¡ÿ9Ìѵ[’ReXò³4ô$(GN~B²˜ñƒ‰ '1Ø”Øä="µk2Ìm·ÂE©Š± +D¸¸D»‹<ä`Mn,fîí”øÄH +MX Æ^;Ã×áâK1<$•6§µ«Ïë‹@¸> ŒçMõÆ?¼á‚ÈÁ™pvRÎhž«+µq-„gbý¢¦õÐh¹ã®S„j•{þøUsýEçäëÖÉWT8³ÙX¾UÚ6.Š­šÚW[fÿ9˜5Æ]A—Xg’{$=€>LéªÍ3³û´µúy–mW•QT„Ò&õiBnxUSzÀž0±”9Ù_›Zë¼uðAnŸ‹#gtS껈^[~àDvjJ†°A-Pú8© Ù[’ZFã¨*5·J +AE8òüVIN¼ÜÍalìV’RB |¶ò,Èx?°Ö˜Ø¬™Ó¾¢Y÷RÀ}„m„oj-ˆüí"¤Yø¨~á-2ˆ^aãTÕÌ fZk &±‘Nžú¦"w¤–¨Ða£R›w—0‡E:Ø-‰©ªZ$ƒÝ¢ Q8¢n·(IÐìqŽòM!*ÜvŠ€¥2¼Q™‰@Ô!LÄ꣪ò(K=JáOÒt·Žs´»UaÒŠ´ý8ƒþÉã|%)Õ‚\ ÀÏ1cÏgV•›@ñ +Æ°>y.Õ7Àz¼¿FaEŽA- ^ŸÐ ÛNr® uQå¼4H#¥_äšû¸_⛤1Òâ#ÖŸía*"Õq½Çû ÊSõKr[mwŽ¾QÚg`¯PsRÓ\°–ç\tÂx`·áùYÊ…è‚ÉÓã.Åú%íWY͘ƒÞÞCSÖ‘›`–Aë–¹–ž!b#ƒjŒ=FÁÁ‰ŠÒ©¨=ð¼àX¥àÐê\gi7CZÖ/°Ü`íž””íŠ + Åh=>(@fHX8>ªvÁt§ËZº¬”HVçqO#**õ9ÿ”±Hu„ò½$‹1rô§â)4ƒ‚GèäIà….`ËNY? ‘Öæœ6†`FÒ˜›Ál0¤6¡“lÀ©Ý"iÿb¯º•g äÊ àj\b@'e*äŒaÕ~¾]ÚÎ3{e@"Ó8åí™ä.8wš£“”aÝEUëì"B‰s09fÍ댵ö¬@`¹äùô|‘Qu 5/ôÖm÷1}§*–…¨,ÆÚGt‘3~#CÂzË¢©¥užDã“ÖÌè¿ô_2õ“¤„,•œm(Iõ}Ҥݕؼá7 DŽÚÏÑ~†p-¥úÑ +[Jê¤]bÁB¶vÊR•«óÞ +Ði«ÈRÖDë=ê§U°K"Ŀɹ36X§(÷Q‘‡èôƒìƒ¹ÂäNUhÀZ€â….~¯‹v»€[56„|„‡ÕˆHc:Liº©]¯pͦ=Ê2‰ð&aý±<ÝVI‚à;Aõ8Ç프LWÏ€W¢ýÄa)àâTUã¿[Š¤•Å´Í(uÁSïUõÝŠö8'€ÐBØzQþt;_¡\\lfÁÚ£Ö6FEÎÔ4R +Áq·>Í»U—Û€9I]PÚ”¦¶òü~Uûç;…GYl¯"á­²Qª,=I“{e¥š M]öW¼O +ܧiâç{H‚Ÿ„…ˆuÚl'çúRm¤ªü£tåÑ~ñqªš­i”Ú7(3_ågzÅ]Dï‰õ½ªX¢M\nì£ð; ?‹›Ð=ø…µ§˜ÞË¢ +çªr#O¹ ;ˆ² ÒìÁ Ö[!|Sm¥)&<&UdÓ¨†‘Ö<–ãCÞèýsÔÔÔaM‹|+CE@¼á gò²,6qµ ºœá.ó|=MûÀ’ZëJï_ãZt,S¤½‹[,,‡Þ8¡ÊŸsÆiÂÞ*Ê{U QôµøÄéÝàF¿€þðŠ 'Û¿(»˜©ˆÆüm¼ùµg`¯´æQY3–²&¶pyæøINW…*ë?Êâa± +,$> \‰½gîTèãå 7O¯™»%m· ²¶CÈtMLÔ“<¡˜Au€‚Ï÷äQú DBš4óŒ ¶1q‚ ä*ü¬qA¶¦bœo×YÒ€µÈánk@L¸—C­,‰ õaí—¥ +ç ¿HU._y˜\“¢TMͳ[!þ÷ÊTwAÿo™ý +_$ ·ø»Ovk>Ö=fŒÝų¯þ¾ÈŸìVw ¨D÷»¨p5Á†ýËÿƒ¥÷`rã:ÓFÄ[ÉNDΩÑ9£@h4rÎa€É9Ï01IIQ9ÇUòJÖZɲ夵eÉV¶-Ër\¯÷û¾Ý[uëÞ¼· +5Å"œsÞç}BŸîF4ß?8n™4¹=XÀƒ+V?°" E2ze'SËË6\uàq3z Á+nõ¨`œç°‘œ°‰fïÿÿÅæ>>3øIiÉæ–GHߢ󶇡¾ G(„‹`xè`­µvÛ·Ó64â|ãz E„«±ÌLcõ"®¶±“îd@aã3™Þ…pu×Æ \“œ6àãç ”ÈØT°´Åe%µ=¿}…Mu¿2áž° àx!ljpÇÍ b• ® #éœ9nR‘(©‡Ð²Ý}§ ~eÔs´RP¨WÌf:GS½SH¸ÆË…Þþ¸‡ýê¨å–q§“ŒÃH@_¸H ÚÄIB Ý­… CHU:Ö• ËiÀ9ƒ¯†Ý¬›MÈé›™|ç¡'PÌÖ7NÜñl¢±~ȈyiðºƒCè‡mŒ‡¯S±YBéò¹U3W0ûb¤\AEàsÁ¥ƒwbÔΤW8¨÷ ¹9ðº¢Ñ°3q£Ù)5•Ÿ?}ùiƒ?pó¸Ã†­å Õ1;{ÈHÜ8Rª±êàËfAk,þ É+ZQå0øÛÞɼÒX8~Ÿ 0 4ÁÖêZÑÈߤSÔfoíödsû+£Ž[Æì#FŸÆmk"! Zð8àÓBÄÀךpIÔ|€‹7DJ.Òð +©a Š i£,""äÉchóQ3>fÁ'¬Ì˜™„œi ¤)9\4˜©Î{pÜ=b"`Fz¯<îàGmôÍ“N/•¤åpõ?зë쌓̹™,°4!‡‡«>ÂZÁJ¨¬ÚáÓÓ.6éb’^!ë AìR\¬á³‡âˆMæ„8j ¢9ê ´æ2°ÎX¤i¦4'—Ö#òa€:©Ñ±N¸¼(o‰i+—™ðÝ…aÜÁŒ8'—£îdó>¹e¡sl|ŽUû`®&\¬É4xX·I§¬sCú As2ôî›&l‡ôn;ŒS› dçÉV(Ó³R .¨]ã: sŒZIX +2ÔBUP4 aHâÆì¤ùƪO€dTóryã°sภ¡àm‡uîa½wØàƒBø¥kzÅ¢Þ2z„ +ƒÿЄ úZçU HÔÕÙø’N ›ðIRštÁ°Cz_Ä-T…ì*ðÝìWÆ­Ô¡ ÐeÜâäõvÎF¤xgܵÍð¶>ibë€m/ì ÐMv4róˆeDZ=A£{ðÝÈC`è¨8–7@“³‹Ã ˆþ!= +°I®ÁƇ¼g…†ò ·Œ;† þ!à 8ëHËv~ÜLS|ñÀ Ð<¬ó>Ý„Àx`Ò7b&Ž¬ÂŒx³/ê¡sàUô.yÜÊŽ™Z½´Ò±<Q´&T÷‹y£¼k“ó«MxÜ„§lLAH®†+û|nÅFÆÝL¨Cï †ÁFÞð#ª‚jX( +a'¯óŠ>>… +Y¿TÒKŒ6k¥“CVÚÉç\|øú×–Ùü.‘˜‡ÿ2ú£6*egaÖ±17 †ÇËæ”ⲑi=„h;K +c;4éâF5¯Põ +ëD0Ùœµ‘1·˜±P1û€»2V,dhpšÑŠ‚±‰è<C_ Š*;1 vŠ!m©nnp(f)ÌMç|RÝA¦dúôTg#FMà^̇]¾øIX'“lÑÚéáAM±ÃtHç±0:Ÿb%3.¶hôk¿æd +_4zEÐX+°â{!n;èŒQ\TŠ +·u`õ ~›7hu “fRoç}lÑ‚iÌà‘‡€¡€"ìDÂN¦=|QÚ”\3FG`ÜLýóùn™¼yÌê|ó˜ ÄîÐ-K+9l¦ 5,ÔÍã^È&c6~Ì&êœQm¡bºÏá £‚}OxØ€B& È™ :˸çÀ¸gĈß4îþçX2S·sP‚Q398æ€'`v“N .rÌÂêì•œpp ³ d„}l‰t¬˜ +@Ø´œî[epà^(µèø¢œÛÆ"](=tº˜èû`H`]Æ˦q¹‚‡Z^.&ÄB#t&˜šóì*S±^¬qŒO/Y¨$¤?Ríûäú¸CйlfЬlŠå Ó¤:ͤŠN2††JŽÁþZÓˆFƼBBDÄÈüžUõ¾¨²›èN¶¢ñË.dë` ±Æ‡ìøšK¼Á¦³²ŸsPà7‹÷+>y ×ã®ÁYéÒê´~Àœ¼y°±“)ȆLÇìâ°™²Ctu²&üÇ\â(¬•¥3Žç¨ •ãvñæQR9àð gpÂòKM.¾HGû6ëç 6.E†š'oõštuŒ„œGQ  dkpË`6̈228zq)³7âðk§8¨ÿÇ[t#?㫇ÿtÈ:l7ØÁ'6jåÌþ؉¼iÜg'RTµ I;žæc`;‹€X6XµøÂ7¹nuPõ΀ ‰:ñ´Ã¯GA e¼eÂ;iã˜è ´Þa3 ñ`6j…° ú(€˜¾\‰˜ýÑ!3ö"TyVÃÂÔ¡6Î/T¨XwÜOæ\lÖÍæLÌ­Ä£ÈJAàå}ŸÑ¹D31"…ÒCx´±`q.OJ5,X6ûLˆh§UO ç[Eþ@‰Rš¨Ò6ƒ-+™ôð‡­Äˆ•‹eFcž@Õ.–Í~­RÝ)öyÄQ;78ò€F ¹êdÁM…FnÌ(œš ¶Kvº€J5'•tÒ0΢¹©ÔÔÒÅöÊ2’CfH⢠€Ácm'¦˜œœ—IŒ8è›ôîCÂÃå™Øð*é¼’ˆ¦°@zoÄŠkà´9æÁq!Úê Aê?dÄÇŒ2>Êåý\ѧu®øp«/¢²§_9 Gn†a&†¬ä„{`¨ ÇYµSiXuBXðZ€Ù+:ȶÑñOE­ï än2"z_•Ëh ü?é B;ë=a£/Ĩƒ“€Ä%`*X1:T ¤g†Í¤ 8Ó.ñ6Ñcà6]ÔbÍ,ôa#ñ•aÛW‡­#Ìè 9`vlÆì•ôÖÏ¥‡LÈ-ã¶#2€“›´1:«§m!'íà»\_9d3ãðGƒCt£ª_ÈCœ°²“Â„Ô u„Søˆƒ“ƒò Nª1à †àÀ¿zHËa@Ôƒ…]˜bF¢F’ˆJkMø-lÔ0ø‡bnl÷4ñpĪ %+ÀüÿãAH­Ù-ü³Ðc¨2yó¸ºÏNª6, +QºL£SÁTCÈÒ!ÒÀ0)#,»o@Y`¼ÁÝ ÈÍÌ‘NÜ8:m…—±—0Òï=à+dôƒ{t¡„ˆe5PÇI; &ÁJÄ\\–ŽwÈHÓAf½BXî¦1ÇÁgEB>§À*Boü°Á¯‚%ž°‘$ +áá³°,6"åãK^*=ˆ$.:LĨ‰1‘cVZ¸’î'›[7¹À2nð„† 8èÔˆEµ‰ V>¤Ç†uè¡Iÿ°3S'ý&13ctP!ˆËmœMGÝ2æ8·jìFv8¤óOVâž6ز À~.4frò78§–¼=òàü.¯âóþ`ÙÍeÀ6Xñ˜ƒÉ"Á*"—Íгr‘ˆ5±H}Ì!À$˜ÄI§à1ز ƒÞ‡Wùá}äIŸ¤'Eá±`ÕͶ/ý|† +I¥Œ«6çås^.ƒË%†´Èk=Ÿ‡˜æfÒ#Nþ°†ˆY³/`ÅÂÃvfÐ5vQ縘 *Á¶±w°Ùqwð€‰>d¢ÁÉ{áMè°·¼=“AäŠI|uÂuË„²‰ »Ù¬‹ÍÙ¨ŒƒÎM8Xø;Ø?P^­~D«Å‚7W^‚Æ™€€f§M¾A2Q&$ll°¦ÁK[h"ÚjÒÎ@3ùãh NÊuˆÀêbP,„q «áfSd¸Š+õ›ô8D~!pÚa=jô„M¾¸Á·RƒSMtžÁ Fß2î½eÌBvãè HUH ºÆŽFQ.cpP£FÌä ƒ>¤CÁ›|Q`c¥üÿpóøW†uˆ} Ê +TßÍônðuæ¡ ‡SÀÝÍ“ieଜâ`ÇJïƒ)ö (ä}£gpþ*ðÒIEà1î–%þá é«‡lðvÁ€Änœ •‡ ôÒIXðtƒ¼„é˜1 7„ô,ïÒ±&—ê¹Å¼W*ûà ø;—œsKRqÝÆæÍdÂJjFÇ µQI#srйŠøÍ-BŽsñ,Tu ypÅP_, ‚ÕD„ ®0jǨ ²›É€&ÂõLc_-oJÍ2Èb1à"•ðË50ÉÅ||‘ @>VzR¹•Jæ±H Uš6Ð8wpÔOòñ +6­ŸC¥èø´œ_qŠY€úÄ à½!+ h„”‡*ýq—|š×B˜ü!L©£0`>?ꀭDÂ#Ñ`e|2ªCºÑ»f$ì SD¨ s7ι +Û €N)8¨¬“ÉMúÂF\…øi@¢`õ?cöÁ9Ðì€.›±Â€½ƒ$^¹,áæÀi¤p¥FFê>¹Àh°òiB© Ù4\øÁgqéY¥¼,,0‰ž;PrqyNc€JPS4T!”j¬²æ•M„êàòÞ`öµïWÚ¾z‡‡kì¬ÑøÌ‚˜_ókV:å“«ªXÀ#u ­Z)ÕˆGlž†+:ÞåÓóLb°êã‹îe% þ¨ÎS¹žÄC¥»E33 àðÁ¤„¼§O,º˜èµ‘ôÞÇg€Ï­d&ð ^›bÔ6xBŸóIE3•G” Þ0Ik=RmÛÙÔa >xÛ„K,¸%"ÖbS©è€x5'·Q‡5¤bŸTa8¹Œ•PÁ%šÑ°úd;¤ ŸŒ@¯ ˆ½n. +ïd2629éèàs½Ax‰LúÅiCˆ; Ç õrFoÒ"*¸xKÊOó©£ÕRSÛ\²‰ÞˆªÞ@Ù'Õ]-¤êd3ŒÚM¶vµÖ®7Xªî†„>æàˆä¢ãŒÚŠ4×ÕöN~îDg÷Jtð´ +*»…⤨èVm*ÝÜUªd| +DGïŸp`¯˜wä ”¤ì¬RY–r³L¬jDdP +4ܶ·NQ˳‰žÆƒÝmÍÅA|Ë’jw©D_ÈÎÅZg›ŽWiµ,åûBnšÏMK%¨c[.ÎS€¥HÍ.Û™„WÊùCK&fç¢åõÚâùÚò9¥¼Ä&{h¤†+\¢Í'»áê†XÚŽwN3ÉiÃ$hº(°oó¹E_¤å 7Ãõ].1EÇ@§Ê0k.»H%gˆxŸˆM…s³µ¥st²7æ“¡p zBfˆu«ªNZ–KÀfBÑ{y7eãu!Õ +ç¢M©°èÔ]tJÛA˜Nyød»¸ø+3E¤ÒÀFRÉd5 ú`a%ÖØQêJu°\h¨ä²¾P‰NtéÄT´¾è‚bQñ–Îpà-§L]óÉY`Úpy%Ù=ÚÞºSmïñ¦\‚1ÏiíÝì™Üâ™hsƒKvåL·²p´ºt*ÝÛs Y4X&Ô6­S‰.—èâ¡’ZXpÒI;• b-2ÖÆ#-¹°”é‹wv™™tgSÊöŒ¨j’ÕºJy%ÚÚ‰¶w}¡ª…Ô„Ä”ÓÆì„›Ó™i.ÕÖ7KËZ{×ÃíXu¥¿};—è™°˜gSó\Š¸‘›»5PXu°™+œé¡T:Z •—„ܼ\ZÍ͉w¶ƒ¹é|{ö|pQÔÉdñp[È­„ûÉÞi&ÑW+«1Î+æ€"”ên¦¦¿ÿêé'{û;—ù&ÑŽ57¢­M±0§6׫ËÛ»×Å”s )¿œÒ=>=“š:š>.¦÷ïÊÎ÷(%œç“97km å ¹¾CeçèT~µÓ‘I ¯bILŸÖfÏÆgNkÓ§CåµêÂéPq†MÔõ5!·Ègù¥xc#?*ÖÜxÑ° ƒK@Ñj <_ˆ·¤z'‘ 8‡§Õít‘’´ZWªk‰©}­»ŸëŸ¨-žC¤¼©v€oÙD_Ê-<’céþi¥ºãÖ&Üà@Py9¿ Ô×…Ü›êñ™àRk»ƒ%Bƒœâ²s‘ú¬pnî4m¸¨ˆÓœh ŒO,K™…ÒâÙÌì±Tïhná\¼µ5·w¸W´a¢w¤¹}GÿÈ3Gïì¬Ý*eºl¼©66`ìß`»<5S^º”›9©uvkË ñÍX —€E¹ùdg¿¼|kiùl~æØòé{KóÇa‘| —uÁêFzîT¬½.­äfOÛø¤—B™*L8),˜Kvv[{wµv¯.¼÷Ž§¿Ã'§ÙäBeíZ¬¹ï“ëþP‹IÍú•–ƒËéÑ°73ùƒ …rn*TZˆÔ·ãí} ^—˜OÖ×yé@aiÌÅ’ÝêÂ9)·&ä×cÝ“ry”}~÷š[*ê½2=pVK©©éþ™ââ…LÿèÚ‰{7/=EÆÛÑÊZ}í¶ööåÖÖm¥ÅÓÍí«Ý£÷4—Î_{âÛZgÇ'e•ÂLª{&R˜?S]½ØܽVœ;ÞÛ¸uîÔ½d¤\]8ÖÝ»ªõŽsùÅâò…óÅt;R™f5'§‘ñŸ_ Õ·‚µõTÿhzæ„T˜.ÌíÄ:›\jJÌÎø•r 7,ÌÉùùÚÊ•xsßH±²R^ cZmm”•ÚV¶:7sJÎuB¹.«µ¤Â¼ÚÚŠÖ7ÒݽÒì‘å“w÷¶/[RÑ®8wª±z¡0{2Ý;®¶ö­ßZ¸µµ~›ŽDÙ™S©©#±ÖNcýòÔæÕWž)Í´q!·(®ì¡øüº\9–›»ÄDn#R(N­-‹ù™H}U*Ì)åÅìÔ>›˜ƒ.ÀǪK™Þ^¼±Îk TÊ‚Î é~¬¶on’±f¬¶–œÚ V–}JKÌÏåfö´æ-kÝí@vJ­-–OÁâ‡JsÙþîùû^Tëk°•ó½ë…å ‰©#‘ê*¥N¿Íµ÷—O<”h¬:(YLÔó=˜ËùÖÖÅòÚ¥Öî]Ö¤ì2dØQ; !B*mV×ï,/_Ž¶ŽF»Ç¢­Pq>Ý\ÏOmXð @˜¢Ahò`r–”Ê¥uÙh¹ØÛU–L†Í̇»ò@yÃå%*|¢WHúƒZä€6al™Ù³©™3 —Áì<,N°8•ì¬Æ[‘Ú +°Jgnÿ±߆õ±3±p~º¹~<ëWx¡úZijûž¿vçóßCä\}õ\gïîÊúпͫͭkܱs^yâ5©Øó´ +±šœ:R_¿8â¾Âü©îò©‡Ÿ}#Õß ¦&»»©þ±Ù#wïÝþÌÒ¹ç•ÊN{öhoí<­1Ú@‹¹Eµ¹[^¾4}âá¥óÏÎ-î\ì­ž""e¨Z°´È§ûBfZ­­Îpæô£ÑÚFÜ‚Öö L¼I©-X1§PrðÅhe«¸pÆ#€̈(â*🙳ýòÌñK÷½ØX>„Š…¥Ë™ÙsZg¿±u:…Ío‚3ÄäR¤°îf㑬ÚX›Ú¹ nÂËòZ5Ó=–™:¡µö@ÅøL7×ÝÚ=÷Ðìñë>™žÚ ˆ46‹Ëã½cⲘî9{ß©;ŸÒ­Q7Ï%¦ƒ¥%17£ÔWJKgíéµ³/ë§ÕÅS¼Z›Ù¾¼vþÉÖ‘{úGî^9ûHkçNë;sïÉÛŸu¿šž:šhïfzG*«sógØdwçôÝ3[çÑp1ÑÞNM Wוêznúä̱ËkWƒ…åîà̱ò°•'T»þH Cˆ›M47µòt¡³áS|²-AÂMõ˜D7R^-/Ý +Îìeaù"%Êóé.iŒ¡ªŽLê”ZßµQ'‹çé©Êâ‰ÆÚ¹HsÓi!r®¹sæú Bª‘h®´6o+ÌŸ•Ê«¬Öä-o°„„«‰Ön¸°èbcl¼"fztMvVÎö !Ùí-쯥¢ÕâÌ‘æÆÅúê…ÚÊ­Í•Ó•™Ýpº{ýçÞ|烹#WMxÔÈJ=ZÛRÛ'b­£RaÙ/æÎÝñØS/~']›Ç‚ÅÜìÙôì¹Üü…Êڵͻ¹4ü±Ü]»˜loë}² CBLöÉwªK·^xäuÐîP¾ŸílZñˆ?\Wƒ*5ðéÎÞÊñ{æw¯0‘j±·•h­!¡‚G,J[Î/%ÚG’­=«)ÉN$?çÓPÐP>·L'g‰p5œ™vPa½—&BéXu¾¶tjîØÝZoÏ.{Ä 7çáUh„@ª£Ö¶âÝcùù“í­Ë g”J‹D¸˜DÝ:hß©Gº»×Óýcéînaú˜”›¶113®™o ã ¤•ê +À4·¾zkeé—n{…h(×Që+ÉÞ~~þlzæ“™CÄl4×Z€,™:”¡‚““ÝÂüÉÌÌ1¹ +rôW +ÑÊ‚˜›&UnmZk{Ä” W\”º{êÞ@~î ó°)*ZŸƒ‚Ï VÝb$>Rè秶Íx0ÓÙêïß[X¼=XÚn,_Î.œe3ý\w÷ÈÕçP¥¬»qeÇࢵ'WvӋוM="#tº½  +*U^>__¿<·wïìÎõL÷¸ÚØ棕ÍS÷”föŒXì(°ä)1·&×’½“RqeÖ^N×–1G«°ªërq•KÍÈ…Õd÷X$7Û]» A¨¼aÒ°PÁÉjb¼•ël{;h0ïá@€ÒN*}Ù a¼¹-/ÇKKÑÌ4¬UmîdªœËÌBVE‚5•€DÃÆ{ÝÍ«|ºg£T<ÒàÓÓ¥ù³ÅùÓð(Ï”¨.¹ø&$`Hñ©ãRy ïăÝíËZ}ÃÈŸ¼üXwå¤iHSr~P ~j&"d!hpx#D´ +Dkí&{Ç™dÏè»Ø$­”•lgÒM[± màj2‚Œ6Å&ºzï¡Ãrº,ö‚Å°7‹¸ô´Z_ågµRl®ÎìÝ©¯±«³Z'™ãSóÁò ÊàL57r3Çs3Dzs'ñDÇ!$ɶZ]r0ŠVê¯yxéÌc™™Ó|²çæ’0$e($¿2jÆÍŽ æCùi¹8+ägB•%—”ÆÂùÚòy¨&®”cÕÕâü¹òÒÙÌÔŽ˜lbÁ´•'¼ ŽÛ±I -ÏÊNŸÊ/Þ&×6¤â¼ + ‰V¦³/ç–}ÁÔ…lH§÷ +³ÇÌTÄNEùE€º›Õpµ‰¨]Hèx¸Â':bjÊFD²Ý£Ýíëj}ìJuî„R^µRj(ÞØ>uw$×Ñ!b¨º®M,-_n®]“ +h¤å‘ò‚Zß;uVœuÓZ²¹Ù]¿­8}B­o%‚Ïæóg #”ÜìÌþ½•åË‘ÒZ 9HÏ‘Ì4®,Rй4QJ‹Áü|uþtgë +išÀr+ù«÷¿Lt줊…Êl¼ÅÆÁ÷nV/t7®XýÁdi¶»u;kØÈ ƒ}¼ælƼLÊG'ìhpzã(8„q;²Ñêà¬'`ìH‡Ñ¦ÇüWG]N*!¦æ›ýcvÒ„Áy‚÷ •**-mß¡4–ÌLÈ%hn!m§bzN ¤t6åÓ@Ô€=¥º!e!`=BÆ‚†Q1ÍD +¸”ˆWæÄì4›î‡ªkÀ¡ÜŒšŸ^Ý¿cjóLù‰xu¹±x¶¹z)ÑÞs LrÊ#f`=Sõ5(m$ÚÇ "õå ‹ÇïŸ;r+æk3§îJ4WÍDt°uȤÐP5RZUwa,ŠKN&jòrT8¤½}µºpâÕÒÉG[«—ã¥ù…­Ûk‹·’±:D-È€"ê`´@b– V͈hò‹˜”â ¹X\qÉ'13Í@»Åê..ô[蟊Ap—¨HÆiððn*ÆGëfä°Þ9`‰Ü\ª½—ë‚ý3^>]è«-w± DÊéi°yl´B36B†€¬”æÉH ©ˆ…ë¡âJnêX}é©Ûð°M„3}+&;Iº>˜_WÈ.R¡š›P1) %ó OÕÅÌ|iîlwóZkãjª»oÆÓ.ÚæÍ~ÞIE@!ÎÄëñ✫Í1ƒÊE¹8­,2±( R‘ –h¨ÝÛÚ¿ðˆRNØM.ÊϨ’Ö ¥§ÝT\ï`™`þÕï¾×_:6aEÝD(”‡wØ—6µú¾VßÜ,ÂFF y ù1 Lådãx¸À¨Õ`²¹°u^ë.›éLÊ…ž˜ëRT¤ƒta¡XnNÊ ´Ì#&aÍmDØË%€œ©Xmåè•twSÈM¡ÑŠGÎøDW’ .*ˆ•Ak2­5!Ù°3ÑqGê"øðúN¤¸d#C\²›èm®ž//œH¶VùTÓÎë3ëëgï¢cÅC 7™ä\ 3Ï«ƒÃ¿"–UkìÒjÑŠ0|4ŸÞÒß¹£±v¡8{TÎNEsÝ#g¯oœ½wÌÍy:Þƒ.,Ñ¡š‹ˆ9¡ˆœ†LÐNG™TŸHL3©9­s"Ý;í•òzHTÀ>‘Ἲ•Œ¡2,“rÑ…G' ^ƒÍï¥ÂD0HMѱ¸ eÕô#¤T#ˆ7VÔö–\^BCMN2*iÍBï(*e&ìä¤ÌFELMÇ@e:ûJ~qp ŒƒF„tª±1j#ˆp>˜›ÎM…±!rÑ‚-H‚(…C{–/ÔW/UæÏjm,T·’ @Ì™ÎËðÈkíkåÅ áâ*€yÔN»8‹ñHžŠV‰žZZÕÊë¼R%ÄÌXñ#bqQDÀ¸¤Ù#ŽYH½“¢Õ½“×ãéÖ¸Á iè>R©Qáú`ç‹KM:9XÏde•”ËD¸lð26 z6¡ú…ùÝÊò^²·”œZ,ϯϹuáäÅÆÖI. +X f$p³ÙY\Êê<¬—P>ÆÇŠÁL;Tèò©ª©%³'®<Öß¿ µçýJ‹”b§8¿l-˜Ix~4S gÛ:ŽKITJ›09 îL ¼ê‘2l,«µæ¥bG*415g¢þHJ.V*k[Ú̪WIù¤$ŸšòÁ¢aÒ°ÁiFx° v¥¹St,ƒp¥$¹&ÒX-/fë¤Z;­åÞîÉ@©íbt_ÎÍûøœÉ'Mºë=V$ UW¢%09'{¦¶¶ÅÂ"™èzåè²WÒ"åÏšHÑ„ðX1Û?â—Šz'7¢s{P‰’T í¥cVT6ú%ã!k—– )€px9uíä•Ù#¥BkăpY”_ð‰ÙÃFߨɯsÐnFõñ)“¹qÅAŽv„äL´²Ê-°±êÚÉ«s{ç’EŸœœðÒv6Ìg;„V3S2L$Û–‰H í TDª–fÏ·Vï2=`—ÉP.ZžƒhÀ¨u.Þ´ôu¦¿•™Þ +åÛje6^[O4¶•ÂÒ¤•úÊù–q.å©)«‡;4fÑû,™6óíT}‹V'í̘ó0Q*Z¾Åè=`ô [P<ÜÐÇÔò%WÌ^YL´øh.[ïÍo_Ý?wìÒÝW~æ¾g¿þÌkßzë‡?ýð“ßýé¯ÿô‹¿~÷'^¸ç™ÊÂQZ­.Qw +8ŸÊ§‹µér{±6³ÙYÜ\Ú=yäü•kÚ!³Çj~A‹äÛZu*ßêWfÖûë§wÎÝ}ï“/=ðô×¾óÎ/Þûø·¯}ÿ§'®<Ø_;k®PáØE;2#"˜¥•’›}Â¥ÔÒbaf?^›SkÓ{®?ò¯¯=ðü¿]zàñ+¼pñž'ÎÝõèÕÇ^xííwŸxñµÛï}t÷Ò}T´dC%+"àD ÙQò B¬©•fCÉz¼Ð¯ô7WßÖ[ZÝ;{û±Ûî¾õÚ_㻿ùò¯¿ýÃ_¿øÃ_>øôó‡žýF¶¾pØŒZ—SrË©Ú®Ñ-éí” “8¥DÈ%w“,$¤t²ÔÛ8zñäì^¼çâ½OÜÿôKÛ§¯6WΕf³‘òˆ‰¸iØÅŠZkjyeëıӷ]¼|í±§ž}ýÍï¾ÿÁgŸüæw¿øð“?þõþí??ýüË7¾û£Ç_xuåøí¹é#:é!ÔX²Šæ“™R³;·uì‰ó×Î]¹çÁ'ž{ý;?zý?{þï=ñÒkßzû§?ÿèó—¿õ÷ÿýgý¿¿ò½Ÿ?ü›;î3–m­ÕŽd»+rª’©´æW×Ï\¼xïƒ=ý‹/¼òúwÞù釿þý÷ßûèµÿùÛï~ôåÿúýßÿÏäŸùƒŸÿêÚã_«-Qò} L” Å’ÅJkzi{GO]¸vßcÏý¥7¾õô7¾ùøËß|ñÍïþø½õÑ'_|ñÅÿþ?ÿý᯿xâk¯¼ýt}APêT ÉΧۻFóâÁ°Z¨w6ž¹í®ïyâù{þ奻žzñ•ïüøGï}ü“_~ôÇ¿üåý¯_~úŧ¿ýý7¾õÎÚñ;Á²‘F(5ÃDjáâ\87Uï¯-lÛ9uñÚ>ðô¿>ùõo~ýÍ·üþ'ï}òÛŸô›_}öùþôçÿú_ÿ Ýú£_|öâk?L6V ^aÂNs½¢ƒˆ R. 52µ™ÕýÓWzâêcOýË7Þøñ¯>y÷ã_ëGï¾úýw>üõçÿöw?ÿàãßÿáOÿó?ÿóéo>áµ·NÞvO¢:MHq‹7º)‚XRl-÷÷vOÜvùžÇïyü¹WÞúÁOõÉ~öþ›ïüì׿ÿÓ_þó¿>þÍç}úéüçþìÃOï|ä™úü^¦³Hõ¬ƒû³Q“’$Y9I5‹ÕÆÌFsvmóÔÅ«?ù¯¯¼ùîŸ|òù—ßü÷Ÿþâ£_ÿ×ÿþï/ÿò·¯½ñÝ{æâ‡ÒS´Ò¤ØÈTeuó؉S.Ýqǵ»¯?üØ#o}ç­ßýîw_þéO}úÙ{¿|ïå×_¹xåêÒÖ^ªÖS +3^&áÄB¤ ²bT‰j•jsgÿä•»¾ûá'ï}ô©gÿõåýüýþìý׿óƒïÿð'_þé?`:_ýÛ/¿ñÖÙ«Ín«Ìl‹±²šíd›s©êT¢Øœ]ÚYÛÞßÞÛ½zÇßþöw¾ý½ïÿ‡ï|øég_üùoPŽw?øô³_ÿæ¯ûϾøâ­ýøÚÃÏn¦xµÌEób8QªOÍ®ì={yÿôùý㧯\¿ûµ7ßúå~ðéoßyÿã·~øã÷?úà7ŸþÉgŸ~öÙÇ~üÑ+o~÷üÕKýu”ÓP.Lvbåe<¥‰˜V¬Ö»[»»=üØ›0Žýü¥o¾õÓ÷~õåŸþò—¿ýý—øå—_üâƒ^~õÕ_}}ëÌ)ÝB„•¨5•|/šïtç7f–6öO{ìéç¾öò«/¾öæ¿}óÛ?}ï—ýûÿúÍ—~÷ƒøãþáË/?ýü‹WÞzûÁÇŸ«öw\´jtó&'gCd7Š(uÖòõ™­#'|ê¹ç^yý…7¾ó“÷?üòÏùò/ÿñ“÷?øðÓO¿üã?ÿýïþòý?ùèÝ÷~ñðÓÏœ»ro¢2Å* B]¤¤UéZ<ÓZ\?rýþ'ÞxëßòÞoÿägŸ}þù—úóÇ¿ùÝ/?ùÍŸÿòxŸw~ú㟼û³wßÿ‘§Ÿ?réÞùã×Xµ>j!íþ°Ã'zñ€ÅI`t¨5³vüÜåë>þÒßyùÍ·¾ñÍoýäç¿øÛßÿþë/þð“÷~õ‹÷~ùÁG½ðÊ«go»º²uRÉöòÝýp$[oÍTšSùRujbÔæôòÂÆÎúåkï}øîÛ¯]:{ñÖ|­(EƒË»0ÎCHFitf‰‘²Ë V{º;=³¹wdco~eþÄÙ#×ï¹í¾®_¸rõÂ÷½xG{i5”,ð±J8?ÏÇ„wùy„ +`”À‹áýã·¯îNç JqwgýÜ…³×ï»ë¡'üþ÷¿÷Þ¿~ÿ£?ùìãç^~éä¥ Ý¥¥`"+%*DW2è¡C\0±wìÒñ w—{KÅVoffv}mùôécÏ?ÿäÛ?|ûÃ?ýì·¿yûGoóÍ×_}ååçžyôÁûïÜÝ?Vï-‡@Ñü‚Ÿ;Heܹ†0¸h»— "ù\fgsëþëw¾þꫯ¿õÖë¯ýç?çüý‹ÿö¯·]<½¿»Ñœêå-]8.Æááe"&‚ñ’“bÉ|µÙ_]ݺxë™Gäùžýö·^ÿåïþÅçúóßûÅŸ}öÉ —Ï•›5/!x©(˜a£‹;8f5 ã&ÔO*ªV‹k¥éùåÅõ#gn½õ¶Ë·_¹víÎëßxùÅï¿ýƒW_íë/½øÂóÿòÚ«ßxàž»=ž)¶P!jÅx.!lŒ”Ó©Ê|H+û 1žÌoî¿ãúƒÏ½ðõÇŸü—;®Þýä“ÏüèÇ?ûÞ¾÷À=w<ýÐ}O=úÈÙóç6··ÚSs©ÊLmád(Ó¿q:4ºì@%‹“ôúùL¾¾½}äÊÕkßxý ðJO=ûì£?úÒ‹/¾ó“÷žÿÚ¿]¹r×Úæn±Þ¦⌠™œ¬Éîw"¬ãýT@Ö*‰r¿Ñ_^Ù䃠ݔ`à ÂAý¼jö°GL êÅC~&êÆ$ŒVJÁ)ð±¡XºÖ +n„pú1J’B(ŒZ¶Ê„“´x9„KxؘÎCí&'ŽAÂy ‰W à½))"…"Žs›Î¦ Õron~ûä¹…­ÝX6çc1áÄ ÚŠ­ˆlps&/Ç)¹`ªNJ „ Ó’§Â‘XT§s™d¾«·;‹ëŠ–L¤ÒíîT¥\Ia&¸Éª¤œ åg±`þ«cv³/ « !TR"™z¥YÌ“qU‹«kÛN­TÊtúSZ®ƒ¤ä.å½dÌ`'uVtÒì7ºÇŒ>½Kpðžù@¤Z¬-¦²õB®rùÊG/³SívµVŸîÏõÛ¹BÝ姆ÆtV|hÌ><ᄘ\ƒ+ñ .!EË­˜Ì–ù'ÇÜ>ŒD´t=ÍåŠÍno¹×_%)™Î‡”FÍnî°ÜŠ‹ð±F ^'$PÑ +‚”Še;ÐÔ|¸Tî™ÞºÒY>'*·×Q"ét^Å‚³x@§6Êsç©9ùÇ›'XÄÏ%mˆU¦Ùp,–J¥ ‰T&«IR˜Â)–e¥T+J¢ÉLY/„”Ü4oßåÒv<Þèa˜¬w/eòP~&&F«“ )G…‹^:"E³LX;¤³ŒL¸œh˜d}lUåÜ2*•Æ¬¤•h`ÂìŸ0¸-VÄhv-n7Â†Ô ++ÅQZÆÙ¸ é\ì$0Œ=l„’6éðËz+nödðmdÜä»i™ÚìÆþy-SÕí,d:N^ÃiÅï0é3£“3úÿù nÄàó3qà.£‹·aa;ñòù77#R¢•¨oÈÏãuŒRœˆàôrÝ™}‚‹³Ã[y¥Š_i“+ãmŸ˜¶àaÑ9YY19-å–ÔÆ~²µWZ¸ e&lJ²å7ºyØ41¸£EXÖ¦ÚKçË3gübahÂ3aðfKó^:~`Ò3a§M X5 ¶Õuµ°dq°cN„;Éà`œhÈE¨¾Á©nƒ›LÊ™¹Ãzÿ°Ñ}Øä1»ÇÌór”RŽV–01§åçRµe:R&Ce“ðriT.nÊ&mDô¦Ó ûBct°H‡Ë¨Î×7r#CßaƒÛìã°`QHÍpÚ©”]„•Î:*Ž˜|£fï„Íï$B±ê¦\Xâ“]XÌx¾%'*6TÈ<‚ »è4£ö’Í“&9jA툠åz."lp³vPç¤U6Z㢭—TÐ@e^&ÀƒúŠY‘ *dƒ©)4˜9lòÚQEÔzd“ +v*‰ÊU#³Q:jtÓ7XŒÚô&p‘ÑŽ£L3*jE$‹/xó˜gÄLØPÅI&ìx~b‚‹Ö NÎEE!õî¤ge&7N‡rÓjeÞÍDGLȸÁYMoÆØMz‡Mä„ubÑHzÑMhc “6rh `°“Q3¦ø„¬œ] ÖlX„$åt×/ç­þÉÆŒLxF~?/5w!9¦]MJ«f¿bFB~¹,¦ç¹DßAª‡R˜9­l"b`cBB#F$.µæÎzHõÀ¨³¸TdC¥ Ú€¿LXˆ[†­;1³tÚϧÇì *æÜ\ +“KbrF«ï±‘¶ÎÊèaÑÈȸÉ?ª÷¸Pä˜Áé¦=15G+C“ˆ“T%ƒ)™ÃV¿Î-ܸ h“OM)……òÜÉx}…åèXTªô´˜žEÃ54ãñ 5f! Å×øëPŒË |ÆMk\¤ÆkÝ!£Ì‚:ˆ/²³~¥ª÷Ë2¤åZó[·ÒñÖ4ö²ª—ÜbPmö‰N?·yäÂÔê +*¸ˆ À› Vq¹ÂDÛ\¼¿2R&œlð†&]“vÒM òï†Kkô¢ŸÏ&Ë‹rº3bõ$Øð²q„M°‘:&dŒ`ãÅæ:&ç'옃ú:ȄЬX,”Ÿ·“ÊI—¡¼jrÑM=EwqÀº„TÜÛ‚uö²i;¡›ýzà‹Rz6Q_%•ŠñÆmF¤ÿ‹i\Ê܃‹n˜pn:d<8b™’sL¤í$â&·Úôó)³WrQšÎÀ¶è¼Ft~Z`c9Ñ‚šýaZ)ëÝœÑÃ[|Àòæû¨s‘ª›Rÿé€nTïF(Ü΄CwÊ£vá½ÿ€u[Û½ÜݾmÈAMúX´ÃçW•æ­{T*-ÑÑZ§¿»{ñW ­CD";˜Œ—/ÐÑ^ ·¡G#À NL5ƒ („\$å":¸ÇËà–×l¬Ž1,”ñ‡‹)‡Çêl²…È9\© +ÙùHm‡w|B + ëä⤜Õº Õ½‚æ`bv\A…ÔØàþ-®ƒzЈ5¨3­áÁákРh£“š°2Òab^mñZá´H¶.}†;pÅǧýbÐ¥¤:«{—É`þ° ™°b^:IÀÉu2Ü@¤‚ÑѼºsòºZšÒ¹tVÌé—=TŒ‰6˜HÆ`¼ÖBÄÔÑ;bÁt.ü*È‹©ž›Õˆp±¿u‰Ku7¥9ìõôrI”ÏÈÉn´°`õ'~”ŽÁüïÆÃPçwÓé`j:š›e"e^­[ñð( +Ÿ`Aƒþ@‰6³SÇÛ[wAè¾`mf?×=ê¦â“Ö\ç`aTŸ°ø‡up,ju#ZÝp 9½/lÀc¤ÖMõOÕV.°jÓ„„ñPÖœÍ^ÞŠûàÞƒÐV‡tè°Þ­w2f_DÐMD,ÞÀ¤tò@}³›w‘òW†Í£2‰âÓ˜Pºq}·vP‡@!ÌîÀ¨Eï ƒÅ¨ˆQñ.X­4È´G`¡hÕ-å|á²\^Áb Ÿ” $:Ë»WwîxÚ%¦¼|BHv•ür4¿/¯ñ™ù!;C +驹S\´q˸kÒÁ¸ÉÁõ•ÁôlkõrnꘚïnŸ¾@…EÊÑúj¢»—œ:’ž>‘ž=æg)Ïvïì¥ÖÚYhI'´Š“ÖH¥)m°ê”Ù'9Èèäྲq4PôÊ^±ŒëRjNÊÎZPyÄ脅ܸ¢ÇÁhˆC„,ªp±F¦µÅFÊОÁ쬋՘§XÓ‰®[*XHÕŠG€‚t®ÁùðV,J†k¡Ü%å9/%ªN2<¸A\™<"P±_̺hÕ'f°P‰ŒT´ª÷ð:'= +Òi%)O‹L¿°|Ñ,ØI¦¸ˆ¨›‰ÁGXñ ãRäA¦Ç¬ÄWÇ\ þ çÀc¸\çb]1ÙgUh‚9fp¥âãSv<âã’x]­mñØ@êÜåG¹Hñ¦Û¨ uàc0“~>1jFÍ^‘¡kP! ƒ‰U–ãím6; ¥$£uœpºçc“£&\oç\D +l¤ËǦm˜6éýlàMË:+¡wЇõÈà¢3,†ªÁÜ‚V]8é  ª îÅŠ«:;7¸6™ÔXµ)þ¿$½÷“#éæ÷Oh —=mËÂÛ„KoÈL „÷Þ…ò®ËvUWµ÷nºg¦gšã-=¹$‡k¸ä’»<’»Gò´'íEP'é.!úU/Fˆ‰jLùæ÷û<Ÿ'ÍûŽÁf0¡ IÍ:|s.ÌT—ŒAD å=\ÒKX¤ê“²6J +KÌäö¿•âèzqñ¶R]Ç¥Œ–…òC?÷Rª›Má‚G¸T¾µK(¥ss‚ôÑ© RI6·Ãù…DyqçÆKX-bÑbª¿—Ÿæ¯éÝýhs‘Ë°˜ªw7¿ÿãÚºõ–=„JÉe:ÒŠ·õú!®48­™ní9Éø´òsD´Ç¦WÕê•ìè®T\wPDÈR¢åjïg=Œ7˜ #5&ÞDBE>5Ì56®?ü°¹v×ìÙ§"–¹Ü +©¹ôr(»ÈÄŠ„Áo: ¢bD¸ì„#H4BA ÃZnÄ(%PÛsNêÀÑf0ÞI·÷´ú6ÄÄ-~„p €çc 0JZ÷8iàÑÀËi>ïĘÌ%ºD¤Î-G +«Zmº`òÏ»™KfÄñ@Š¹†ËU,\ór9T­Sñ.mBÁø ^6ÃÄZ¬V'Z­á.D„§L^g@‰ ås@“/Yóó.’bÖàÄçl0ÊÆ€ð†ó#X.òé*×ÐPILt!7™É +‹{茛ˆ;qÝâWž–Q—ï wc²lž FA;Oæ(xéļƒä"Uk@ú³×æÏÏBˆG¸Èwt´”ÜCÅ”tOÐ +gg-sÄŽHŠ“Y)”[É ® ™¡Tz›Iõƒ™a¸´J'ú€.ZÍ­‡Ï>¯­];oôÚ¼{rß  Ž#ŸèqzoÎM[!ÊLšýÒd…X@CÙPa¬Õ·"Õðžî#J”(½%dGz}»88j­Þ\9~‘’œ—íH~…œÌØ:ã êRv$WÖŒp袓s«ùñíÂÒ­py•Á´•ÐH¥’¨mÐñf ”GÂyBøÚbS\-s™Ž\ìçûÛriì¥äbo·¾õ(½p‹v­Khƒ?Tïí]{òY¬4žqRD¤ãåj~¶-lÅëÇjlvP +oš!8μpîrkíÞÎíSÝ+`ó6o¶–NfÎé­­äð85:­­?êï¿«·N€pÁ\œŠ–=<³ÏøÅ’Ñ/Š6@ €½‹€gPÕŽFm“):“—Ãã=¹y ”·Ý|ÞM©l¼FFªˆT@¥©°‰N¼±Í'».m±ûøy'‘0|'Hj¨2eÀ%ùA ¶¬^ÚŒ—³‹áÂ*"×àP%˜¥{§±ÚH²çæ}õ ì€Rj^ r +•ÊL´$(¨%ÛdÖ¯p7?ŸÃ°'û7óg¯ÍÍYàiSd[“‹¶ø%H(#WA#LÊÉN²jA¯­úØØ_àD\ª+åÆj}‹Ë,ðZ­5:<}þm ¢"•hm;ÕÙÕ·’݃Dg?TXqj0R¥»³ ô9IÀ¤RWK›Ý½ç…¥›“)pÝ”ŸKØpuÎËM9 7'cÝhã°wù¹œ†²ƒX}ÍÃÅ.Ùa£‰™~çòÝÓ_ìÞÿ°¼r”ãéúêáã`²}ÑEêS+«ÑÊ:¡õµêVmñ0¨•¬°o^‘²«°Pb¢m ,“ÙêÄtc3×Ý›sQgfÜ&Ÿx ¨·pµ2YD²¥«à{­„$eºå•k­Û…Å£Tÿ \ZÃ"eLH¼ÿ­ŸÞ{ÛM+ÓvLÊ­%†7ã½Ó >œs±€«­¥½§5íµ#JD:W²k÷ +ë¥Úe+bµWŸÿÝòÞýTˆ,fÇéáõ¥“w ·-ðy`çbÔÀy 2í¢S&·Ktb‚ÍCÃŒó)ZùÌ(Ñ?Î-Ýj¼Õ;úð P?¯Íú+ƒ#!10zøÉ— žÀ +.7ŠK÷@ZØæ¯R¡œ ›<à1¢¹ƒ“GG=€¥±ÈYÀ?fÄOhnTA¬àsB7ºW†ü ;q%Ï:Ic@ÝÃÆ1¹(–SËàg +“½c­}.o†×€¦M¦ÃuR>BfÔ‚—-°döËHšsr4ø0?LZÊKɆ“Ù1Ñ‹)ŸlíV×îV·âb¦:ØKw.»X äòª[ÄÔF¢¹›žJ¹@)„\‰–×åì8¸¡Ñ–“J@”¤Ôk/@ôbåõHe[­íH…?—"ä‚ÞÜ â5¡ÒZƒOvòÝíÓç{w¾Ñݾ‹È¹r{ýÆ“£Å@Yzó`ýú×_~YÝ}‹N-A\jÆEc|.^ÙœŸÜ7‚ºI X¤9ñŸO,éœ1`„X¥ºsRq—¡] `±&Ðv¡»±qõ§·|œî"C¾PÞ*‚ÒJ67×®¿Š–ç<´“Œæneô®q22çÂd=?*÷-z¨8*—¹„(U6½ÈfÇ‘úZuõÆÁÓÏKK×ÎY`+BfÌè}¿˜ê’…šŸôr… +çÿâ’Íàå™ä8\Úe“c.¹0ç9Ž…ù¤ »©èâ•g‡O>]8z^[¿/äW­Dì¢u2ÌÉÓïÆ*5!*!$•%§U6¬häÌ dpÉò˜ çÎOÛþâÌÜ”•„Õ–TÝSj{‘ꎟɹ0Ó:¦›rL™°K&ü’…°ø$ÀWŸº²º°ØÛèã “å!"„R4B¥†VL!":ÑöI9Ÿ§õëcJÝOÇ .c6_è$ȘP¯ÉtU“ ǽ¹Ú¦VZ83ç¸h…-°LF©îan|-ÞÚ i¥£[¯:7­D8R^íî¼ÞØ|’îŸÖWïU×îÓ‰Þ%;!$ºx(ïÆÖf’~©ÆÄzsŸŒV϶ã>FØp× ÄS®xù<¥MžŽDä"ìPfˆIY*œ) vKK§…Å“D{³·y§±rƒ‹·¤t/78ÊK WØì‚NÍûAƒˆJ²§—7¦lÄE3J(5.µÀꃠ> ÕÖ´²úE˜M’Ž H.®–Wïx»ÀEËkûwž¼ÿ6Ö0zy¥1ñAº{´zòöþã/Š+·AéšœœðÙ‘S>ᜟu³¥'r‘qëää@ÑEF§¸UÉhG­l.Ÿ¼qûÕvŸ|'\»<ë•p¹“vo„]¸šªo:éëçæ¾vvÞF@®±™%<ÚvQú cAc>®0eÆ^»`5A‚Ŷøà Fyè„eòÀ¾kl¡Œž(.x™0#° Jm—Ïo0É¥¾‹Ê%›‚‹€]ýRô¨IðŽÙÙ=¼Ý±Åæ“l^pé×g¡×f= ±Jzg2ãú¼gÚ†ÍxEë¨Rfô—h(™V¡»Â8Ê6×n5·îe†\ª‹IˆÕädv2^«û©¨b@rêKZýj¦³¾öšLþ ä%#&»À4 ^Ö‹.:Åè>½€©u%Êýbw'ÀD}x(Y[éï>Y»ùîæ­W§/¾—3jýäô{o|FDŠ.*êbÓh¤¥–·‹£›íõGÞ`þës¾s@CØ,ŸYà’ W&@wÏÛ)Û ‹Ð jŒMty@¡±f€Ï‚ØHËÅD}­¶}—m°’nìú7âåÍöêÍÎäàŠÉÇ‹Ñò—ßáÒËҎňI\@BUÐwõ}T´ ƒ‡è¨W£ÕÊÒÉöíWƒÝÇh¤!&z»×^ø™¸ ‘ùD?ZZ«U¶ µ;e§æ]$ÊéTžÀ¼¶£­¶]8lƒ† +Räz&oÐà ‚ÒZ¾þÁðøUuëivñ¦?T>3ë÷úÖõ÷¡ìY£oÆÍZ1p2€"õƽy|Þ87m3»‰Àä|‹oÎÃÍ{Pá~©Ê§W‚o4Ø7&ÍØ&ÓM¸éD@*‘±VgëþÖým`¤¬€Beb 6ÙeÓ#±¸!”/ûļŸÑÓÕ5TLº° 2H¸ÄDj€ú@:pø¥‹FÏ™iÛù9×k³®)+º~²z Wp`!µ@)ÙD[)/©ÕÕTÿŠ]Àä²)ÝðsJ€ñV£ä<ø5>Þ–Ó‹NL³ù8Œ{¨¨X &¤<ÂçA/¸ñ!Q1wÉ ƒf1ˆ'°àYgÐâ— ¹+¯òzÓK*Je. :e”_:ª­ÝL5·R•µñå{‰ú²_H†³£xkŸØ\\Ó{lzÅM‚Ф#52\˜sÑ& ]ÌÐÆå@¸CŲo’/Ô× Ž¯M[ˆ$%J~=Ù:êì½`õ­,î>ó‹@L^ÎñÕÃ(Ÿ—ÓÃtg÷¢š¶T¨F*µy(xÆàyÍà1z9B.‰©!DiN„—Ó-˜KZ|¼ .Û¨âÒà*;6X[\AżÝ/œ ˆÿçæ='‰pº ¢'w°ƒ„.ÄôˆŽ·¹TSkx´^^!€ž ©bo'78ïxÄ‚•ˆZ1™Š4BÙµºkð€ L²ñN8·.ellÑZÇèUÎÌ NºÜÚèŒ÷'ÓÄYQ+ªZ+ÒØIõO€ªŸ3Bñ¦^ìOJ¸/Æ'Úáì€VK _˜“³+vD%å¡–1ÊŽ¢=µ¶[ßÑê»|ºo#B }ûG€cÖM&!ô«f$rÖŽƒŠlÿW_­Ë05™¬^B‚Y/G(=¯÷VO}B¼ÂÒÉÆ7î}ZX»Ì-/’"ùÑòaõVPkX`Áìç¿JÄq/QM/![<ɳJ G:kò)m0&#ÄÌ;‰ Ïdªm眡m“òäò™“TˆP¦Ðßj­v<<^½ú¢¹~[kïyød¶¶<9q*¥lO©å`¬‹…›ÁøÈKg0»1Én,C“¥ÓÒ2a÷ N8dtѤ˜§@dãAµà&ð]~CŽŒ5…D+ßÞÚ¹ö&£ÕÀÀN|y²âL]Í-ó±&M^I¶²õuƒ“zmÆmpsL£#MÐx¸ HCÒåÁžÁEÍ9&V¢åÍâøzeåÆøàE¤¼ z¿ÜÛ^عop³N8 a +%“‹r!".¤@7¥›«¤œ•fí‡èXS©oçVï ÷ÞPs£Åk?þÅÂéÑBÃ-1»žlîÜÿdçÞ§´><;ûÈ-W@/køJ"@s©Am($Çl´à|ÎA„>eð°³ L¹ù—hñÊB¢GªE£‡!ÚêÁ†‚’°øX( +ž!4 ©X›Š6¹Q¢¹./*•U½{(–ÖédŠÕJ½ÃñÞ\¢3ïáÍ~ÅE$p¡«–!Zý0ý9㤠ë‚U§?äÇU9Q-·¥T;×qïA¬±on†«›X¬çå²r¼¾¼u{°õÔÃèSÌâga.C©uTÊ3êä^kFÎ'Ë‹~::9©ŽEÐP—{– ^ì ÁMÏ;IÐãÀygìÄd&|< +K2Zfbµ|{óÕg?ýâoþ¥±vŒ””Ò’\Z)-œdÚ;Á•þò ¯­ÌÅÁhƒÓ{0_2BÒùyøììä +(-3ÄÎXÉssÞ³3® &êêð¨·q{ÖCÛ0ÅÍ$tŒŠ7bµíx}—Ó; XÕ»™Æ† [|œ¨7/ÌÅQº¼xiÞ;m‚ý€øŒWgm$Ðy7&bNJvì~ÑCDÔŠœ³“{êÊ„R'¥\µ¿ÛX¸¸ŸŠ!\ÂGi6/¡!€¾V2”M ö1qR­“]>3Ÿã#=×<¼þà:®´ôúq¢q$%úZnAÎ ýBþ¢† éò@ܳsn#$ºÉ,]èn¾ÙÞ~AkíKœ– R¬bóÿâ¢åkóž)'g Da®Î.x¹„‹V-þÌ”¼.Y4\Pkë ôQZK©^×ÑpY›<ݵÒa6ÝNÜ_[<|s÷î'G¿½rõ,œ#B9XȺ‰è£i;~~š6ù­>aÖIÃB ñ¬;8ç +Ú}p%¦´\qpùò·êë'vZ¦€9Ö¶ÓÝ“HukrŸmº¾}2¡˜õ-ÄX^¨5Û¾Rœ0ñþœ‹óâL*r€ÒFæ|2x¼ÀK0Œ@<-ÞàŒ±Ã|8Ýlßï=Hw¶›×W¯>aULJ‡sC!Õnß)/\õNLä¢Ù…Íñâ¤!7¦ØѨ‹yÈ$&ä Tq¤i³f2Ÿ ×”É7m ¡‚$½¸)Œ)9·xùa±àáâ„ÞL ¯–î€þÆíls dv„Ϫ…¥Hn‰Q¾ˆ¾dòýåY³Õ`ö¯ÍX/™Éy{Lœi€‚?9;/˜}."‚ +9À ©Æ¶¨7A-M[0„Ið‘²Á_œó8ü‚Ã'ðP±i 2k ˜œà4£›>rÑŠœ`BiZÔ9ƒ‰93¸úðã•ÃgÛüÁ ­Ô§Ç«ÛŸöÆFM^¸^€Mà¡BURª„R ~6mpt(¡èU@8vÞ‚°9«Wœ2#3VtÖIX&R)^4xæ‰4.x…´Kar´žÞÚáõòêÑãîÖÝl{§ºpÔÞº[]½©VÖñp^/ÙXÅâ zpÙä !R#¥¼oËwö`OÍ~G€GÅl¬±±|õí{•ŽOï¿{úìs17òñX(øi†s«éþ­ÒÚ±°LHÙB÷ ÑÞÒ}[Ü“Ùne;â#“þ«×ק]ç­¸_nâà±lž¬ˆ*âb>^Û𺠓´ÂpóèÑó÷¿·uãE´¹ùÕeÐÊxïi÷¯¸iEL« Ç™æf(ÙÖK&œ2¹°G„œ–æÝ ÀE$Ú`Õk~&ŽûÙi笶¸iF) ú Õü\NN4F›×"¹.,ÆÃÅQsûÁèÊ  “Ãët¢oñ‡’ùñî­Wv V "ã"nt=ˆÊ…‹Ýñ•ñå¯M;Ï\´€ÂSBfLE›àPSËÔV.ßyÙ DLÌø§|„*Æ눚µ!xp¨&ˆ2¹i»Oœ³¢@Äœ°äFBçì.„ÇŤÅ•–ª-ö·AT¹©T6²Ý T8­{‚õIf`ΠÉźðm¡Bæ’)ZÀ†ì>Þ5¹F÷ªÙ‰ÍY‘)£ Æp!ùWçM_;7ÿ—gçÏNY§­ˆqrlR¾¹ÉôLŒ•s64„ÉEZïHù%¥ºUßÊ÷F ;?þÙ¿®=™¤!­º*—@JåÓKPÞ†H—­ßqQ± söi£ÃìB“ÕmB´BËYàû^F'äŠäú—+ã+™ÆÊ͇o_}üžn#áb´r9RÚÌõNú»o6ÖÔ–nòɾ–l\yDE3ŒsÑqh2ŸX‰Ó´Ö³cQƒ—÷ƒ Nh3ÞЬ7tÖŒM9H³äüš”]¦ÃÅÍýGÕÑ«H¹Ét.ÙáõæÆãÕã·÷ž|;;<*t··¯?—òËB²ÃÅš˜”÷M–bÏ£BàèµY'fCB.B Fú|||7‚1‡R,ÎÚ‰³€LˆÊS¶7¤â_AxSrˆ˜c墓L¼Óݸ×_ÍÖV3õE?'åt8Ñ´NÖ@ ÛàˆÙ+9*J' +õJoÿì äp2Oø$‰ªuD©úØt}tØ!KJÖ½Á¨“5¼8½‹9˜Id+ã\}ÕàDçí¨# ( ¥# Î[1£“õj,Û±BÁÅ«ã½Õ“g+§/¥âz TuÓ©…ÍÛßû鯓¹¡ÑźÃø,£4™H—T[¶É¢$«–«K×ätÇäÄA9Í[P‹‹‚`É‹†E%£.D!„ü´ýsP]³^£›õ¢ŠÝ#xÐLF2ý[Ï>6y§crNt¤Ò²ÖØÖkË£•Ãçïÿ°<Üq¸Ð¿RZ¼®”VÄÌ"¦¶Ì„`­úðÍ’±ú_œŸ9;m!qÆŠÝA 줬7—v®?Æk@¾µŒGŠ¡\W«.Ç{©îF@J)Å…d瀉µC fƘ\âõ­ÖåÔ0×Þb´ŒZh˜cE"N"â¦5ƒ_šƒ8T,2ZÇE'¼\fÆ#œ1ø >ÑAél¢†JT(¿¼}¯:Üãôz¸¸”î——o vžl]{Y߸)—;+WßÿÁ¯ØTßAÅpµJEj,…ÔâW«rAº€—ïLÖLùjZ`ÛW3‚š½!„+áÚ´ƒšuâÀAM®>O–ÉnÀÎNÙxƒ g›Ãƒ$ˆüR®2Ø«/^¡"e+ò± PAµ ¦@’u QqzxAoÊŒµg#Å91å ½_Z¹oï󩾋I8 t„œiyƒñŸ`ô9œOfq§'…d†h #ˆ6»)ðŽ ìèWO®ù¨(«–ØhIÎõ[Û÷GûÏÆû¯¯\y±zü¼Ñ_Gè„©(—ò`²#0Y³)Àf=@£‚Ép²—_¤×M +„¸fqR>Lòe‡¨Y Œò9³RO€Q/Z°s³~›G0Cb€Íqñ¥TäDËK© òø‚QÀùje©¹~sùøÙòñµíû’ÛX»MÄš~)KŸE¥"!;¨6Æ{VLú«óF³ƒt!«W2{‚V_Ð >½ØZ¾r§­dD®¬séžZ^Ê-D{‡X´Æ(ù½“gãÝ{NLñ1L*˹åÖòÁÆÝHa™y¹:zçÃï†WÿüœuÖYÉIêJv¡Ð;R T^Ú{,¦{g Þi'é ãP0’ÈDjqœm¬,n]ïlÜpP +¥•Âù¾”nѱr¦³µqúÆ΃Oµ«mèí=8Tv‘1/p2n'tPiñʺ^]·¡Ò9£Ç19üj¡Õ”‰^²1—&ë˜KgMn£—ò111;Vj—Ãd犛ÒõÜðÙ«ïoÝ| šO6åò¢T éÐm7¡:‰Uk¥Á)ªLÅíVbÂÙ9ŸN¢n÷o<þ›œ‹õ.ﺂY&Þ‹7v‡‡oJ™nwùøäᇥá¡5 ÛAÇáñÉUta'×ûœŸ5À›@‚ƒ¸‹Âè 9¨„˜Yδö£¹^sá`tøtãö»ë·¿±tõ…X1åÒ­Ë¥…«0—`µªŸÏ/öÑqƒ‹5:Y Ä[\Œ ¥KË¢ÖøÚ9ó”Áçðñ6ˆ¶C¬= =&÷÷ÿÎÚ¦,àä`¼'eÆ.2ñõ)ÅϹHÙEÉ°˜`u€îíÝ'…å;drDÆri9Õ›L‰ xï«{Ö¢•mÐøn6>Mæïµzx§_48È×&ËWA³ÜMª.:jƆÔklºá“â‘ÊRcë~¢³—j]. ²Ý]6Vü M`)“rÙϦNLN¤+ùJgãÊí·„Dûµi‡Ÿ‰ƒèH ¸¹¨¤Kj¥E$”=oò‚N· +Dë òƒêÚŸ)÷WvN«ã7!ë­ endstream endobj 81 0 obj <>stream +ËÝÝ×WN^-¾h®]¯.Ÿ„ £hºóÎ{ãš±ˆ‡ÖsýãÞö³të$ݺ*¤F6Li4šiÓJqâΉs&bÎ-ÙP= ”¢Å¥£û¯®?ûØKG潜WÜlŠÒ¹în¡’Üð†J^ZÓêk@«=\rò¸=—qઓˆ–Æ7&ËùAAˆŽ„‚ŸIºP8,°`ÒL$^¹ˆ¨Õ¢µz²³WZ¸¶°÷¨½~{ráRÉ\¿ûÖ·¿üU©»9 x¨J„«¤ÒðÐIK €“ +`VŸv`æ€@©U0Vx¤žœLËóf¢¶¾´~òþg?nÝìí>^}YX_¹ÛÛcñàÉòÁãTûr¦±ö£ŸÿþÑ;ßõ*©²Ñ¶VpøxWŒ6€nœƒ™HÕ†ˆçç=çfœ_;k>?ãAÒEg‚‰!£5Õ5V«aJ™NôÈX‡N ¸ì’©hI«,ŽêõDg§¼v»³û¸½÷¬¶ý$Ö;f3#-7Þ;}¹zôUŠ˜RMLî*Ù¡“«dta²¼»¼`ô›&W +èifôxb'3ÏhÕ•Hu1Ó^]:zºtüìòí·û;÷“Ý=LkzØþÕ9XˆP,ÞÉýf¤Ú( ®V—nEËë¨\2ùx7ðLž‡(3È›R‘Œv…Ìz´¼ÍÄs^Îèe\„ƒ‡K´c•åts üWH¶P>žnoGWòý½Hi%ÞØŒ×7Øx3šnm?l_sSßÍÍÉT6ÉiNVuà^4tùøIªºbôÀÂ\D¢sà +[//^½ÿª¾°b*åÅâŠÚ¸\Y¾}øàÓ[ïü¤³û†_(”›«—Ož¡ ¨±Díryùacãyºw[LAXøðú™æÎy36Ö„˜ÔÄX«›éÁ‰/˜*·7›ãCð›.Gj¤ÖÔ«kÀ8²ƒc5?@˜(ÙhmÊN_4¡“T.–‚z_J-ØÙঃZ-Ý›x:*d1‹)y7¥±Zº±Œk+×7n¿—ÇjkT´â¥c(Ÿqfëú[Ï>ü²·q;Àe…Ä.•mÉî¥'w8á si J/Ì»©?;k¼`ðÏÙ‹›sa1,\ƒ@àQAk€OI03:Ÿ¾Ú¼÷Yeý~€Kåº{ãýg‡>鬜=ü ½}'ÚX©nÜÎ,ß’»áüÊxûÑáÝ[ë·@j“²‹©Î^¼¾L/CÁìŒ mÆyÞà 0qµ@bülWËT´*——"åŵ+} TF‰Îziùt2=Qc'Û¿Q[y¤7w]T¢&—•A9qÉž]b’‹|vк.çÄUƒ— ðé@¨d ‹/úY0hy3ˆÏl +Drˆ)žÂ¤”\—o47îŠõO«…êø l@ˆGªkíG;w>\:y;RßàÓ-§’Þ߸ÅÆŠV%¢5T®€¡À¥,L¤+‹rªí»?dóOgqâ1'®©ùqº¹|äìŒ;L€€ÃÄêl¬šnov¶ïi-_Û8}üòs)^ã¥ÑüðF²±'¥—>~ÆûpõäÖËRgçÒd‘YÅÏç¹äP«]ή§ºG8Ÿ¼qÿí+·_Þ‰E@in=>xôÅæ½ÏåÚŽ“ˆù)õƒ/~²¼sÛè—.³?̧–”Ò6ª^4#.$Tì'Û»ÓvÒ‰**­Ë…•Pn‘–s'ß½óÆ7åtßMDèÉ©øq²±=Þ{xôø³êò-\®£bÕ:¿pnúËó¦³Ón@ƒà£8uôëSNg@ˆåÆ&7cFoBTr²ä¨_Á…‚ŒâR†MvÒÝýÜàU¼V)Ž+Ëךë×wOŸÝ{ûÛÅÑžT]¾õþÉ‹Œ¯~øÅÃW?í^~Ê%º™òêÚÑá\ÞÇÙP•Qª¤˜9× 1^\Ö’Í: ÿpÎêg&ÐZMïì¦GÇíÍ[B¦5Ú¹]Y½ëìj=±°BÆÛ“»šSà\bqlj¾pÎ-A‚Q[WÜrÃŒë^±HÄÛry-*à±:ïÀrŒ4Ðp• +vÀ¶ˆñ)˜×}|Tol÷ö^t÷_TVïæ†Çñ&зºší,? —Õòrgÿy¬{%˜õ&H¬ [7=TØä ƪ[BjH„Šb¢1«G8=œìRúútÑÛ‘)çRÍ>Ñs ³›UR)› Ìæ§A’?yüÑé£ûÛ÷ôò2¯ÛýA>5YΊ™ Ò™æV¦¾Í nêì¬Ûàf " +°-ŒA ð:ÂDrµ±Ë_2{„X³sùþâé[õ›‘Ê:,U&'¤Ô“WŸvW®@`L*ºˆ¸É ²§ä€ÅÍ5×øI¶²Y¼Â¢nõ^01À䪚jÞ{ñáÇ’R>Àf« 7õÆf$?éÀC§ .ÆsåþèšKfÄrŠÒÄ¥Ô!B{mÆcq‘ÞÖ7>ûûY3rn28ƒ^&Áé}5·Í .ÒZÚcÔ¼c2=W‹L,ø©P¶³Y— Ã}­º$&›ùîåÑ•'ýÛåñOµ´Ä$z°”—“­úÂ!«One OxcA*áç¸ ÁϤ”1ºIV`>ÊÚ[÷·î~²påymådaíðïþÛëO?à&“_-§'ÑÚådçp°÷l÷ÞGÝË‹ƒý[o~+˜YÉX¨´–\Í.ÜYºöÑÒõ—•{ûßúòwoëç*nôËó¾»ù\05ŽV6 íík÷ßZ¼ò¨´r½¾y§´rª5×kk×:··o¾}õõÏ€æ»;ÇO>»õò»k×^VVn)¥eBÜÛIk=+ª< DÅ]”T‘Ž4…d—KD´iC5J©¹ˆð<„6£c_¬hÃLÙÑ_ÍåS.Q× +BkE¯­ ™%Tn bãs\žújiPnLbñ‰“…Ü,Âe¼„ÞD¸$p%TLƒúæõ ²i'nƒ0êD/bµ‚œíÕ–Nº[÷x½àÁFNžéøêŽ;Ìî¼ ðŠ91Ý÷šÍbgõ‡-Þ䦰`'"™înwûnyñD.®øżÑÉ‘Ššîù’‹`ã‹b¼ "&óÚËçg}ç.¹ÏN9çí”P¤BHÀüg.Ø­3ï ¾>íÿ»ÿøÖw~¾ã­Ï¾ý·ßûR]S*kb~Eo´7Ÿlßù|pð¦Ô™p¾¿°hEd òóI—æó«••rq9ÀéÕÁ£”x½*,S“´Ö*N6n¼GFr¢^–R-BkG׫«CÅm/[äϧnj޳NÍùx«‰~µ8KdÎÍbR!ÝÚ¥”²Wp©¹ñ0¿p•K÷ƒ‰¥U\Ädˆ– sQRÎR‘2-ó‰©5¿vï§k@éhë(èni¸Qz.^wQ;FC9>;N´ŽèXh1MKi˜K +ñ†Õ'ÎØ(”O‹‰6©Ô@JéÄÔós~P¥F÷R"jpR@„'wz”M€Î9ÈKtÚÉXш7˜˜¬˜#eB™Nº³íañt5VJVÉõ¤ìHI¡ô0^^Õ*ËD(Tt>Q†ù¸êK… çR)’Gs ý½œ—P\¨dñr—ŒÞs³."¼x” +—}”L„PK¥ÁÁ*H¾§Ï³ý-RMË™fgã–V%«£XiHÈy˜ó±¦oÉé."¤ôÚJ¶»ŒU0¹ìeÓé\¼$'kÉêXÎu­ˆ”lnÉÅÅPvÔ\¹^ìÆ3µVg|ÿÙ«Îú¡¨WÚ+G‡Þ»þæ'wÞùöÍ—Ÿ_{ã£Í[Ïû‡·Ÿ¼Ü½õ²½|mïî­Ç­íg£½gíµ[ÉÖ埌¦Zwßþ^{óö :ã$±p>¨wµÖQa|ç‚áô“—Ÿ‹±š QœŒ.-'»‡£ƒ7W®Xß~ +0fï꣧¯¾SúÅ“èÂJQÛ•ñ­õ›ç®y™Øéý· ½y¯bµÑ†˜4"UŠƒkÑ…x³9<èm?…šéíR±:L’‘j0ÑJ÷÷°HÅsB¼ x’R +àX@t³BªS_»síŸT–NA›‡2C‡&×dâ›OˆâûÐÝ%•ÎFó°;Ùá !·‚„Ê +dêg.Þ·Ã +ˆ r¶)©H TˆÙÏO„žõá¡’/˜4¸Y8^4cSV|ÎIÏà6ï?;ç›<ÇaÅÏ™P;ãÓƒPqYÌøTÕ;VXÕ "ÄÊŒJ!Z^‹7÷´Æ.oÕ\,ßR *„ÓýÌà$Ù¹’í_%ä²ìD올UÕDÝê¡/¡‹hÖ†ƒ,Œñ„Í’B®ØÛ  Zɇ3To‡Ï(­ Æ$Ó;B¥„ÅK5 ”z¬v9ÖØŸÌyEljH©.¦”€Ìº‰.åÄd[B¡Õ@×[|ÜœÇ8ÝàÌ^ÚKGaZÃñDª’*ö9%Es¥öRmq«Ø_ŠW|²&æ»Z}9×[kož€0Ôï<ú°}ù>IQ«à¼î%$L'ÒõÕýû©Ö:Ȫ¡ä –_–3C6Þñ01W€àCÊÆÁu?Ç•f¸°ží_,_}£·óP),²¡äƒ'ïüü·ÿyùè ¢T´æž>¸QÝ}yõùV_Ïw×ådñ¾³zôÌMÛi.½k_)/ݾ|çóXuMKw¼øìøégó>Ñ„È6И‘Æp÷ÙÞ£Ïwž~'\^/´6ð“L{Û‡ì˜r®²tòÎÕ׿ÛX»/e¯Üy/Q]?;ï»0ï›w±^:K¥du½»y/(No¿øä‡ÿH†‹ˆÚâók\fY*l,¾¿uÿ[™î‰—ˆÝxüÑõg«ùóK6 t–û™4é\´Ð3Vb{ÿþé·°ôµ –¯7ÿùkÖ33>;˜g£€ý*Ã=J­°z›PÊ çz‚“ÅŒ)BV€Ž„U7r2,¤…ÌP«oWŽ‡{¤ÂØK)ÉÊJ8?¶““ǬL>qÎÅX}ÁÇ99ã0VLÃV7j‚(/Ÿò‰9Ç俼ÏZa^ˆUµÊR~étñä­ÞÁÓÒÚ}µºcô2*ñš ,­ƒ¤?ïæœ0*êÕu4TôPq-7›ä@E;™÷\u aDx¥ œÝ‹ñêhyN)\Ê ‡¤M·âÅ*hF7‚p1BÎr‰Zmåêâá£îæ­pº£å{rnàŸ`a’‹H>é'd"ÁXÍì NYQÇW—0 ,ì§/¡†²Gƒš=Bø *øé¨?¨ab¼nÅÒ­Zw£ÐÞ@Ó«™µåÙþ~¤ØFóA%Š¦d- Ñìf%å‚jÓ>:âB—ŸeÄ´šÑñ®9 GJkZmSJõ˧½{éÞ.Ô²ÅöÆá}½´“±òr¤´(¥»ŒVRæ§5S˜É¼^‰i+n „ý\.œYŠ×ùX›S‚œÈ×FµÑøµ¹£Ôw²ã[¹ÑµXe(?*¤a\Xܼ6Þ½¸    š›œ†e•²ÉIš€›FÊž}üøåg6X:;˜q &LÈu­¾«U6BÑü{_üèÁ›Ÿíä¹ âüÇ[Çå­§ BlEñq-ÛöS ˆ”s}À~•…Ãl{’¬”®g›«6$äÆ#L´ŽIy\L¹á Ù‰¬· ò’Ëësù1BJ'ûGüdï!&WpNëŽv֪Ņ ^WŠKrqÃËícÔ`(e÷Ð/ b(“¤Ä|8Õ¹ ”M J™ç˵îÚMñ0š—ÑœpÈìf&ÛÌi‰ò‚ÉÍ€ ¦T[`“,N¿¤¤ÂñºÁ HR²NRX؉j0—qaQ@„Lʈ ¥J²ƒr TvXÄ&wOæ!1F Pr€VQVÌà@äûW‡’¶€ÙIXÜ4ø""8Yç‘T«~.cõõÊ8R9Qåb¬V"CN-ȱb0”°A$#¥ôB× ÓN?á£@.Ðøh™‘ó`wÀ8X= ^':¹• ÐxÇ œ#¹¸“Ý(ÈUûl¬ð)D˜<‰²IJʈÑBÊ>mð«SÑó³Ð¥yŸÙŽ DfåX¢ž­,ƒ +Ÿ»•€È4*ûùŒ—Ž!l +¹Z/¬—Ïü“çÂ2‹åÅë­íÇõõÛ¿è'”‰zqÁ ^[á4ZÍË™¶œnãbRS‚šFÕá06 ötœVÔ‰žãG(VÁNqʪr¾ƒ«ˆÖÜxXR2«›WwOŸðZ´ªV\)ôNÕÂF€‰{`Ö`§ Xô‘ +„T‚ ²L´EŠ+¹ÝÝ[·žê¦UÂ{(Õ„½zIð’Í.Ü`CïYÜŒ–\¸jƒCï@$RÌ€GøX€–Óõ•D}-R\–sc)9$Ã%¡Êz#œlºòÑ15·+ïÀR”–Ý'Í™½67ÌI1ZJœ™²Ÿ›uÝA˜ÍabÅǤ]hd±H~¨x¨P]'h€1F—g>§‡†@v¶ÁSf?/“9¦¢~24oñ…"åxfèÃU,y0ft°IÎ øSÉ4Œ. ¨(Ù-Nò:L†]>ÂáFpÀ¾ùšÍáv{ü2 u„K¸qÙä¦èÎÛ0»;;å˜3Ã^T¶AA/Bö››ö bmaŸW Nƒq‰­èÊê gMÞéy§É† „2còΘ®@8@D•DEŽ—øpÎGAüËó–³3î sžÙÉc°˜Ñ‰3¡ˆ~Rš³ÎL;ÈP‹5B`ò}.V7º›—š¶øÏ\2: ÄK†œ(OòÑ|}!^ì‹ñŠ”í>ÂàðY= Ê/ˆùÉ°žíåû—ìØŒÅ;ctÍš\0ÆPŒŽe ^UREBIY,#%ª­¥t¡ ~ð‚aʶCz$qˆŠÎØp›7è +ðl8'FË>2lva6ˆpøh8`@0:(¦*±R¡¶® 1&Šå@/Ûü"øC*‚‚|mÚ=kFÜðd×ÎÏÚŒ^ÁE&¹ÆÇ»¡Ô@ÔëÂIJº»rÔJ Š jHv˜®¯‡S7±xhŒ‹áB|rg R¸èy&ؼĜÙm¶{‚NW.Ú ÃP XÆ!Ä;@s¹%綸XÇ ˜ÁÇÙ Ææ&¦ .‡r½  19oGÏÎØM¶À`qëÊ#˜Žš¨ÝMB>Ž“^Tô ‚ÕMN .| ÐgÂ!8‡S"LIîb¶Ú}§P-T(‡‹ÙÉuj':ÖÑgΙLVÌdCgfÝ/Ù§fÜFh^‰Æùpp‹ž)_¾rãâF;î€X *N¿àöóõÂÒ¼% $Ú‘ôЃ„aZsøùY3üWç¬óv +BÂ`{^»hB(™“V7eqó6ôÒ¼§•h>—7HrI6Ò¼`ô|ý’å//ÏÎ8@w‘ÎÊJDß¹z'¤— nÒæç½”Š +<\ pŽp|ïàÞ_üƒ•þìÌÌù›ËÇÅ„¨¦•Dž#»ÇwÆ;7í7möY<ŒÙM›!aTRPÙP4š(&+ËL¸ˆ²ñ3iU’Wý(E2NC(ëòãn/Ra5Ù@9°ã˜Íá`‚Œ’H¹ Öì'Ì^Äå'Øpž‹t°bõ‹—Ì^°ËÐäþ &è­˜ +@"ð™`(œšôÆDE\°àôsÀ Àÿå䬤• .ì‚Ámt£‘ð`BD£[Kåu= öÍê +0Ðópªl¬u¦…ÅøD¡³É €b™‡ÈT€R1>É©U˜Žƒa§[‰\Çåä3¬L„PBtz‹Ó«¥r»'·873ëšùú¢õÒ´ ( ÉÆ݃¢²{E/uyp§Ë7g´OÍÛínŸ"Ëùl²XÈHÀó0.3`aÎi£gÎð!’ÓÃ]šuž9g8óšÁêd˜P‘2nob”H<¯%Jb¤JÚàA=Öš3û_»`¾0e›7B6'NñI*™,¾d´¡v(Sq?•´yø‹³Î S6œEèÈ¥9çœ9`qÑXP GŠ±¹‚3ó°ËÃNºcš³!n?OÎì G2$'¹L¬Ökcïƈp<“«¶#©&„œ~¿?àW¢ñ\µ«f›¯Í8¦ Ó Ô*‰$ƒ`'$¶\Ì,¬¯+™‚É‹Î9',¢ŒBKJ4Kæ’ɬ¾²²pïñëåÎò´š2¹¦ v‚XŽSUYEÏ/ËR2 r¤Íar¹í$ÐõP¾ßß]Ý9Üîl.dêY ñŠâ¥$ ÓÕ~­èt^RÂQYP¤°– XMPK zö->ðéb-ßr‘”žo£\ćs>Œ·{È‹óî¯]´ÚR ˜ž6ÀÐY°ÖKaoi•É@A vØGÈbôN‰%œ–­/±"-’¡´ÙM¸A˜ !”À +*ÉE}¨S*)åI>Îr!Ž¡R‰ˆ‰²‚ +‡H!I„¦áf3»°Ü§8 Š”æ /íGE˜PÜ~Áé弈„’o€uºœn—ÍårH’TË'FµôÖ¸zýpxuüüŃÍíe-AèsÀû*:gòÿÅ™¹sÓv«“bµú>Š"5¬Èá°(†¼~Ü„˜ãÉ cÍ°8)9=)9ýÌÅ9û™ssg/X¦ç¡™ÉG>ƒ…<;å=sÉ}~Öc²6es\8–.øÑ ¦¥pòæ'q&A )“>7m1Ú`á½Ìå°‘¤†rV´“ãÅz©žLå”F-qe³sûtc}³W©ÄËÅ„–HŠ*ÈìüÙ‹ƒÉáñ$–‹ð;2ºÜË•ªz(‰ªŠi ŒÅ¥RIYìêÏîí=}||ÿÖƃ»—ó•Ü´Ñ1m‚<È“ ˆaVxTå‘N9º<ȶ*J2‚¶ŠòÖBþÙý]ðúᇷ÷ýꟾÿÑ'OWWÊ1 Šʧ&‹çâ1†¦’±Z5ÞmgÛÍ\T擉8Í V—Çå†Â’X©›ƒæÒúÚ£—äÚ}'Š˜ÝðŒÀЫ ï!Bþ’ÁsîÜE …õX¬T*f² _òø&ÃÈð¡j¥xtz­Þë‡ãñåíµx. ¡¤ÝO0r—rª…²2 ûƒt¼’z2Ÿ/Ç¢j&&fT|{¹r°3î6²ÕŒ¼9Ì?¼½ýâáÁ‡/o¼ùäèöõ½á°¡'â yP‡›@I h2A‰8ŠóA¼ä[åH£µõÃåôƒýÚ«ûkŸ¿sôÍ—Güõ~ó˼óäÊîöb½^É ;cuŠ@ibp6ª¤#9ïUãKýÜ •__êÞº¶{õÊò½›[/Ÿž<|÷øà¸^­Çqžg<hfÞéð0óVôÂ,d°âç/ZÎ_4Ïœ. 9!!SšÜ¨"² ±d1Ÿ.rñXRgýsö’4¬Ý…XüäÙÚ~öîþí7øñµ»{Åt·9ìF›§C-˜E ††îu„ã±üì¨üéë›ï=\|uðéóÕþÑ“ÿí7ÿù‡÷óÃ;ÿþ«oü_ÿí·÷½g/l\Ým§ÓÉÂyý,¬T<\ÉŠK-mo!1( ¦‘e;Éå~fu¾¶ÓúàÅáïû7¿þ?ýô“çOïï^Þ^m²YíæFÅ‹ç™óÓn«9ÂùuN…‘kp®V!{ºü¯?{õ_ÿÇ¿þÓï¿ó‹oÝøÓ¯_ýâ{wW2rÐçqA«ÁÀ€ ìÔX÷¨ÀÜ»œÿñǧ¿úÉ›ßÿøæûFß}kí¾uã¿xõß½ó‹Ï¯þé7ßø·Ÿ=üøQëÁau{±œÒÕt:RÓáh>dcb ‘ÀV*­ÜÛw–^?n<»Zûѧ7ûóÿôo÷ûþæo¾|ößÿøéÿûþÛýg'íïãàŸ¿|ã½gû M¶ØS¯ÍC“Á°r ;浊„+„›†…àéZþd£¼;Š¯¤ž^þõ7_ÿäÍ£OÞ¹óòõûz<áFØ*²‘S‚½ µÕàî®iŸÜüøýkýþé/¿ûäúÇÿï?ýò÷ÿô?þíó?ýî[ßyÿöÖ¸”Ф +ªZŠ¡È W4r±€õù[+Ú‡…¾sù—ßòå§7¾÷ýŸóÆÿüówþûüÖÿò»O÷Ó'ÿúåýßüèÁ·W ‰˱B¬NŸðDXÍGäq–}±ïzñ£Ûõ¿~{ý_~pë¿ýþ£ûÕ7þþ‹k¿ûÑÿòË7ÿígÏ~ñÙ•üüà×ß;ýéG‡7vÊå|Ò úÈG¡|¹_[ë¦WêµÄÏÿáó«ß{ã»ooÿáïþ‡/ŸÿøëûÁÁÿñŸ¾ûÿüï¿ú/¿ùè_>üß~ÿÑO>½¾ÑO °}zÞ`sJfÙ~!ÔÐ|uÕu:äí¤ì¤^\«úbý˯|ïÕÖ/¿ÿàýOý¯ÿÎþÿú‡ïýâO÷ÖýÑB²Ü÷r"ž,èáV*¸U£ÁŸz¿ÿÏß¹ù/?zð“~øÿ‘ô^Ï–çyçá²%’ºût÷É;ç½Â^9ç¸sÎñì“SŸÓùtN@h$ R”h‰”(1Ø”-UY%K´å[öÔÌÈiæÂ7Ss?vuÝ;¬µ¾÷}žß³Â÷ýàî_üìýÿöw?þÛ_¾ùãÞû럽ü/¿úí¿ûÅ»¿ødô£÷ÚwgZÕ9VX[]zg-;\bZD/&Ê‹ã§û?|sôWÿì“øÕÿ¿üîü³oÿÇ?ÿÎ_ÿôå_ÿþÃõ›Ç?|Õ}¼gŠŒ«†p’Ep¶íµ†ƒñÁ´>­ +Ûòñ\ü§lýÑo]üÙOžýéï?úÛ?zýÿò»ÿ鯾ÿ«_~ð«Ÿ\ü§?yý_þõÿþOÞÿÅ·wð´úÉE¯Y¶’˜”ò’b´knËgêþ¶ýúÌýôNá{Ï:¿øÞù¿ÿWŸþê—ïýÍÏ_ýÿóþÇþWÿüûwþùo?ÿø½ÛɦQΆì%Ñy1Û÷Éý&ûpnþÆEÿçß¹õÇ?|òç?~þßÿÍÿ¿ÿçoþ÷?ÿîÿò£Ç¿óñÙ½–kpI!„$›UͪFÁù’Ší4Ô»÷nu>¹Wÿ“ß¼ý¿þËÏþþ/~ü{_Üú½wÿå÷Ïÿò'Ïö½»<Þ9èvZÕ©ñz"d±…£x•z>_T¨Q¹3/Üß)>;,þÖ«ñŸþîã¿ýå§ü;Ïþù÷ïýè“óï<ÙúòbðîYãhb·«€l,ðJÓô#•]£h°ÚmiÜéýüËÓ?ûÝ‹ûGïÿ»?ù¿ÿÓïþÃßþè_ÿüõßüÁãÿú×ßùïóýû‡¿üÞ§÷ëó¦B ÉpÓN±2“OçȶMwMlÇϼÜÓ¾|Üùêùð>¿ñÿo?þ¯÷»ÿáÏ>ÿ¿þöÿý?üô¯þÙ›Ÿ~uû‡ŸœìÍ*ši“‚‹1v½9VDÑU™ãQq\$·Kè¡ðÁYí;ÏæŸ>œ¼¾Ùþ×Û¿úÅõ³7¿øÎíßÿèà«góG»•¦n 8ËH8eÉ,¯¥œaѤE'}2*ÜÞmݜ՞w>¾è÷ùö÷Þ=úî«£{S÷þľ;õw:Ðë@tÃÀüœZdä’lÔ5_/Wª®^1…Ã^ñþNóÁ<ÿÕ³ÉÏ¿}òo~þôþõWñ“—øéá|´ýåíâGGî§7›‡-U'“$–ƒ€£æg(ëcD¥ÉlÒ¤ÓM“<ê¨÷&â›óÂÍßûh÷ïÿìËÿ÷¿þ‹øÕþî¿øÃ/?<莛%€Þ(®§q>“J♤ƒESlz¸¢öÜ‹ƒÆããæ‡w?ùìæO¿zø½÷_ÝêOAžX,‹l„’QDt+[õÁ¹Sž‰¢%Ñt»èÜ=ÞyrïhTfl;Ÿ=œþÞwß{uoçéI>{¾UÔ,ÏMÝ 87ž³¤‡‰F¯ÓZͯ MÓãpLc銣W¥áIƒÂÅ~çéñ£“þ­íƬUžÖËòï™EC &Ã6 ¡Œ’Z,–NÆb¹LFg¹Q½v2k?Ø+¿w£ü£öÿø‡þðóúãWú»/ÿå÷îþò˳?üøø‡/&Oö=KÌ¢™$#èqLù<ʸ¡$‹"L-_ê• >ŸxØ­±õhÇyTüåwoÿ·÷ÿùï~ï¯ñæ~ûù/žÞì펋†¥‹fU/Lp! NÑê6zyM¨˜lÓ—*:×°åiÝ—­yY|¸[}÷öüþn«ïòuKõTUbçBI~5Ì,­aËÈLE:G’™4c¾eV‹…F±Ø*xE÷e¶¤‹ O1D'WVZ­)$ôlNJää|c= 3'ÓJäÕj©µ³}¾3Þm»Ú~Ë~~Ò9i«öw¶ªÇmó¤cí6ì†×0¥Øúj(˜Jb:¥´S„½´šüÖ¥Õõh6‘ÖX¶ ImO-+Ø´,´Ô'{…¯^îþæ{Gݛݞu<ŽepF³z㨶ý’ŠÏxJàECQ APTÕh·šµ’SöÕ²'[§i¢¬9^I2ÊZ"·B95j˜ä¯%骰’¯.®å5JÕ–I9ׄ(V©šºË³ÇŠ‰–HÓ‰,Í°ë1r5B¦Ù¢ÝD/èAÝnÆ2ä¥ÕàFŠI²¥œ>ାlw ÖZ^ ­®Gr$¼Í7Œ¢i8E×jWÝQùâ¨scš¿¿ß|p49ÔÆU{Xñë¾›Hf/-‚©Å³í×"Ø[+±å(IpˆjÝÓrmʳ¬!uG(«DIÆÎƵO_Üÿìõ“g{ý®§+ M"8IÈùí%iw3+ …­êìiuü¸XÝã{{ûäÁ“0\Ò­YV¥TêÔꃂ_8=§2ˆº¶‰.­¤WÃtœðèÊêiÊcÕJ,ŠdSh2M¬…°(dG¤ 铼R(œL§!ò±Œ@K„¶s|‰wGjy;„¨ßX +‡,JÚëhnW°†8ãb8•Öiö2Ѥ­ò…®®ºÊä§ôÍ0~y9‘¦ÜœPÙˆÒÿ䛫ßx{}eArª®{†YÄ0C ‘•,EgѬB *›S9ÖPlC-‡BøZ„ýiaòP+o+Åíæö…Zî') <Éæ{7ö1&ºYJ–´|wz¸š@/o¤Ö’i¤Ê¾TÜ¥Œ&WY­ÞݹÏxƒ5DO‹‹‡2²B9‚™YÒÎÑf0†]^B'¢l1º9¹‘$ÝåÄp“ùzÂíõ´¸žV63J–+J^_+Žd·m—‡´R„7ðf+ÍxY¾H™]ÖêñNW)MåÂÕK¬ÕJq¥(aÅI;šs2\1ÍäCˆ’¦ \ô«ÁheÁéXÕ¹Q«n+GŠ4¯(f×+Ë¡D0§‹w¦JãfZ¬®'™+™·×’9#4xoFåµ8µ[ÌÉOðy×Ù,!Kf©9Å83A.O&åzŠÎ'i?Œkï¬-¦¿NQguüÎMBï…q7‚ª ÒÔ+Ûfuw5L…Ó&äY³Åû£¡FœpX³G&–V£&5 ý;rq›sÇi¾¼’Âq^ ‚V„ÈOèµqdöÎJ“»jý É—‚ˆ‚q^sz’kðÓjiÛjœz[zól%k¼$/ð¶xhè×ÞÙ¸ÀXwböïºýÛri7œÕ//§b9¾¹”X +à¡"äwÌÆ-¹°Æͬ~5DmÆiRðÓ9ýÊ2œÀµÕT0ÎdiG¶Ú¼RZÛL#Y4§ äâzV(«l¤¤¢Å˜B„ô¾ñv@i#ZÔÊ{7^6wî§än¶²r•qÚ¼×W‹³Öî£ ©†q%§Õ¤Ê,-Wá³I®Ìø[µé£ówÿ©7<¿£C„Ï•Ž´ö=&¿‹*Ía¥»ô×WÇ’ŒŸæ«¬·-•wÌ»pH›!̈’N‚vqµ-·ŒÆç 3BQ+oúçŒÙœ~ÎhÑù™3z`ôïh­©´E›Íöþ+ÚÆuËi ¥9aÒJ3«6eÀ–'óÛoÒbñzŒ +¡ZNkÇ)/#UQ­• =Õíµg÷9²˜Kܧ•¢ ig7„»I&É™k)v#EÇq•3ÛŒ»ÉpZŒfDÁê‘f7N{°ývïÆ3G˜9L@‘“¡· ×„Eihn1ÉvF(åŒNVi¯"æRˆÆÄBV"xSLž6û„Ö&u88U\iQfO*Ì7ÒrœòS\-+µ“\×OÙ,…ˆkÁœè-.Ynfø0¦¢F;kt­#fŒÓÏ +ÅëCk¯!Fp’RCiÝdKJóL©Ý¸ Vc<¡¶h³!ìSŽ¥h®âœå˱œ½¡¹¦”v”âNŒôVbL1qsH¹[²;H`ʵMô›×â«!40š•SL!ŒšqÒ‰bZ–q7B95(\¹4Ë{li—)î"JëÊz.çL«o×wÏ}YžÞ 3vZ.'a|k»Ð‹éÜó“ÅÍ6Í=½¾$µå¬È99cXÞz^Þ{Ï›j‹åí0a‡p“ó·ôÎ}¹~N9‹)È’l6€v' Öà:e÷äʶۿUÞóû·Ìæ‘Ó8Ü»û å 0»çÍwÏ>ßù¬þ±?}PÝ~&8C¯2ŸÝþ LÛ)±¥%TŽíþýòö‹Òü…Ý¿•Ïœ²Þ˜4ˆÚ„ú¤ +3Ú÷žîÞÿ’vú—#Dˆrõæüä™ÝŠ›ÓWB×ð%\©Eq%šS–ÓÒFVç¬ [@åFœ)*•=½q˜½ç%ÅáÌà`º 6µƒ8WŒbFwû\œÁþ®$ù´\CõfŒéü.avAÄâ¨,{}1?¥Œnœ°@ô8n4oØs»}c3¥°Î„ówh{ +¿¡ó¸s5&F©‚^?ÁäƵ‘äò9«Çæt~'g ‚¸±Xµ´“ë À°ƒ¥)Ug—÷sî,LXn6OWSP–z’)C³À÷K¥|„.$(_,n‡k-Æ/fîÅ M³}–3G v-Æl¦Uè;н·–‚ß¼y;@Fè2çmI¥=ÒìoÆù`Zb h“vŒö£L>Á Ý8w]Þ/ n däauäÚnR*PV›ö'<¡7²šÕ­{bq¼‰k´?Ê€ðTk†¸j\$¥6g÷µÚ^ˆ´áð²…¹\;ªì¼šÞýªyôa\¨‡*Û['/Âl>8A¹ËœÑCgúˆÍe¯mµrNõÇP¢´3dóS³s¦7P£®T·ž~5{ðébÚ¨þm¾z”UZÐïñ­­ÛoVÒåýêÖS.…áÑv‡ÉoI•]¥~LöƒÄâa7­¸5:~‰É•ªC]IŹ;|È÷Éâ¢B˜]ìÝÖË;«%É×¢d!#6¤Ú™Ö¹Ç¢tÙ©ï>ü,B8KæzRá¢@Bû÷¦~@YÃ;Ï¿ýßýy¡wz5.nâíoÞkßú¼zø¾X= â–۽괞R–‚dJ¬Ä¸2Ô?|¨ÕÏ)-Š`1Q\]Žæ@»–ââ*bîL¬Ÿ{“§ß\N_ ÒŠ’n4ç'¨|’-‡p/Ê”¥Ê‘Õ½È*ë‹Ù·œ4_ÊHu£s;#T±‚i-ÒqŽòìy÷üãœÙ4jspºÒä•Ý9ŠcÎ0þ ²ýHkÐî gÔúiaú¬0{¦ÔŽP½³‘Ó“bQªl£Z7º´?§ ˆ1‚ÞÜ{Qß¾ÝV«» c\a‹°F\iOjòþ`zòlïâ3±¼.Ÿ•Š[է훟JÍS½2›\üÆoýQuûN˜ósöÄ?®ï½n}PßN þ +:µŽ(õ8ïeF˜+Pþ¤sôáäö—¥­Ç´?eœamûá Ór-íçÏÔæ“ß6Z7Ôúþå0º‰PFcfµ¶¥Ê<Æ×2jŸÏ/î·ß½óñÞ½O®BÛfdÊ5·_o~)·/0kLjÍŸý¬Ø?äÊŒÎ>|þÅOŸûç“‹/øÊ~‚+Kþä³ïÿR)ͯ'¤WÊ'öðIãðÍüîwK³§¸Zëí=Ìw–Sl˜öpg¦÷Žn~»}ðª{ð’uLjÜô·#„!\ÖŸqå}ÒÛõËö_A~½©Ó¿Ïv˜ü”õ'¨Ü¦Îîî½ùÇ4_Ñë§zãX¬ìâÖU;)¾J™ÃêöSøû¥ˆD,©²£·OÜÁíâôÁo\ðêûÝ×ë)q)Dá0jµ›t~›wÓY¥w-&:å­‡¯¾§¸ýüÖÆõPðL­Ÿ×>8xúÛà5Á¬vïÝßÖ*;! +“.æÌl1Á–À›´æÍêÎû‡O~w~ÿÛ’7¸qçuc~›¶ÛRa¤×÷+Ó»õíGõ½§Öàœ±;¥Á øPÒíAkƒ ‚±B›ÈµÃüä×[Y¥fç —w?¬èo?%ݾUšíÞûÌlï'_®î»ƒ»“³7çϾ:{÷w:G¯ŒÚnw~¿µs!¦nï¼¾÷ÂÜ+MîMÎ?<|ú]§»ÛšÝ¿/Vö n½•–ÊðC9s¬ÔO){(øýîÁcÚÆØü"kÔŽPìÂNýà½áíÏ¡&åêÑ»5ºõfzñmoë9æLƒt>BybqR˜ÞÙÌñ\¡YқÆY½[lq ˜óZ”F¤*ï¯K¦déH¨ÝÐZgfë8Á8IÚ,öO…ü4jzc·rðÜœ»½3xÇïž'YôPkžh‹QÞV[Çfï._;rÈ/äênU«Ó»ýBe_®ìƒA€âaZÇjíßû„0Z˜R›Üx÷þÇ¿¿÷ì{ݳ7¥ù3¥¼ úôÞ›'Ÿü4D8)¾dÔö{/ëû¯jûÏ*{/\åâÕ÷&‡O3Œ‡+•Êî³þ٧ݓ7ÕÝ÷šÇŸöt%¡Z+F9jýPižˆõÃœ»88à@WÃ|‚*@gáz)„]‹Ka:ÉVIk̹SÙŸ3òÛË `Bè)Ldä¦vƒä)ïÞ—vã œ3“|*!Nçº3R0ûjýØÜ^¦µúüàÂëì¥9Gô†Åá½­[Ÿnßû¼¶óX©í°v ‚aóàE‘“‚ϧþࢾû~~úØ_XÝ3Þæû7 Bäêž=º0GwYh³WèÝÞüL®ï¥ÄBuþÈïßìí?¾ñäóñÍ7Z}OpzÓý'½ƒÇ”Ùö;ÇgϾwüô7gw?Ýþ¬4$zõ;?9{ôE‚õ¢´Ÿ³ú\a5`Üèû­ƒûo~h4vîM©~ª´o•v^¾øáøæ§fíðèâóÞ×9¯§õÎØÚ)îíµ3«÷°<AySÆlÜýƒþá«ÅÓŽ|1ú¨5$ܦ¶Šý;µÉý½›/úGÏsD.–¥ÞŠ@K +%PÚÞéû Ù NçÐß±z7J³Fû H àÇA•žÅŸtzöà¶?}âÏž×>ÊOŸŠ¥]0 ;¯¾:~ ì7¸Z,°Û=/MÙ3µ2‚Í©µñé«éé+«j¿Å·ôÚ^±ròð‹›Dr–èOúG/G·?Q:ç‹Þ sÆœ?þ¼ÐÚcêâ‰×Ù½üð–^Ý•Ëû„·½™óWR*g÷’´Û:x±ûì·ºw¿°&Ýñ}gxôvW“:oû»O(½ÏÉƉæ\Lê°‘æ0NøW6ñXÎb¬Q‚)\p!Ì¥­eÍäê„S0}ÚY©šâÊQÂΩÅò¨c}DmÖZÇJe›°» Êdô: ”ÞØwûg¬7‚Göwo²å+ J«:R™¿àJÛYµ¾L®Ô[[y·GªÕÆÞ“þÙ8þÓÛŸOî|»vð.•%y¿µÿUi|¡0$Ðœ‰×9öû7(§‹¾QYÕA±¿oµ¡» »ÏÚu¿½¯”¦+I†4:ð‘8ïÆx‡/oiÍS£ufµŽõÆv‚±D§sëåoí<þžÚ¾a´ox *…1ou¶ŽŸdåziûE~öÒìßw·^ñÕ3¨¢¬âU¶N}Vœ¾@³Rc‘Ó'µö ­~h×÷š£ó/óg¯¿øIÊGÙfŒ¤úY÷ìÓç?jœ~ +qõôÞßùÑŸ”†ç›„›ów1o÷ö*»ïüÀ_Ä)G¯í¨Õ¯g÷­¬f¥:m P§ûŸìÝýÐi힪åmÒêÓÎ(Æ–6qœȳÑjÇÀc…í—˜; †Þ:k»AÂÌ*—„ÕÝ Ûzý¢zŠ¶«Ó{•­ «s"”woËi¥nµo€Ë§„rV,3îs‡nó ß;Vk;˜š“Kzm–,Z+ +þ²L~|–0{˜ÞŒdý-Ê0‘qfï¸:Ø?}Ó<|½‰)QT’œvkïÑ"·R‹9"HcP™Ý«mß«Îï#‘j“÷g Õ×btÑ8œßúG­îÁ_^3Ji•K«I:FYryZèì7F'Gwßw;Q:/–åÊ©XØ…˜‘!«÷µò^ïàÙôÆ»q&gËJ붻õ®Ö½'”vÅÊ¢u!°ÏÏÞ/õO!þG™"¢¶ ËÉÍßhï?¯ŒïøCHŸÿçíÇq¡¡wo9“Å´êùÙC³ušáJ£íû?úÿöá'?Åã“ßÑ[·ó“ÇNï¦RžËÞððÖ‡'¿ÂôvB(¦Ôv΋Å=ÊÝBÔ^š¯Z•­ÞÁ#Tk$ÅV‚¯°Åi+Òh†gÃÓW)Ö#µo´ +ìÅËÁþ3Lnn¤æYÑŒ_áRãÊ&¹Öêón÷D¿ß0Š[Ÿ|õ‡7.>º´š¹ BtQúvãÌmœ‚o’rY,ï@J‚£š¤±0Ƶ6áÍRj7g íÎ]£yÓh@à…<ãÎø#Òd”FZnàÖt»{ú_ž_K0¸Ú%ÁÌŽÕ=EÕFŠ+¦…bN«yƒ[”Õ™Rª{fïfaö´yüf÷áw+;ORB‘4›Z}g3£$H/Í;uÓRÕ:„ÝKpŽ^0N7€›)¡À`Φ‚d øŠêmøòÝÛï³n¨˜ñ§\y*œPkùîÙøöÇ1&J(ZBmA×[­µ¾[,½çqn?Á¸ŒHš-½4iŒÏäÂèZ”»å7#-Öd_ÖÁ8Kôz^ï¸ô¬sôÂê/Jkñù­¢dIJÞ8ê¼;¾õ%S:Å•¸dVæz}/LÙ×ìJŒ b*wÅò‘Ô8ÝDÕ8i5·"‚eøb‚ÉCÔõ;7Ë£G^ï"aŒ)ë­3Ê‚ŒDH ÞCÕB}ïàþgˆù‚Ø[›C˜:Žs¥@UoÎîÚ' œ?”ëÇùÑýÎñûVïnˆ,l$e=?im߇.ÆååN ¬A04ꇵ­Gfm?M»³ƒ'Éù×39«)¾9«}ônÿôìXõ #ÆUP¶¼™R£¸µ™Õ’|‰óÆ’?p«Slñ4™Èùs«w?ŠÛ›qv5˜‹gURðsfÓ{i©Hu½¾+ä`îQ‹õ•¶+Û/ Ž ¥¦Ç0}1;ãJ¥ùÿܼÒìyÐq÷å—ã`Rí´XNŠe2?NÉ•0ø¬Ö´ZG´˜Zé«l=P›GRmOªïšC®¦Àx¦¸!1ÎzÑÏðžV˜(ÅñFŠ^K3¯†™[¢UêǘT%X{4;î?áÂôfv³ZÜŠsÇ”Ñ d%Îl˜õ©8ÒÊ°Ù³ß Êó¥þm©<_MqqÒÈ°… bâJ‡Ëï¦äÖFF!€>D|y\üigïukï}¶xx9Ì­g4\ï­%…¢³jšñ.$wd6Ž9I£á4v0)ŸdÌí¤Å:ëMôÚ¾XÚ1†×>ÈnÁhÒþ w&k¨¢KÀEœ7MR­Ökó Wø °PF¬-æûÊ*[‡;ãSRò³nÕç…áæÁ“ÂèöFF‡´nHˆ Jn\^Ë­ÆD\ï­ÓÊì¡T˜Åps5ʥآÙ< [ﬤ¯n¢QTƒ †—XÚóGO¤æ]©¡ § B-åÔjF,-TÈè%¥f˜­@ù‘F7‚ÊVóÐêÜ35Zç„=ˆñ¥ é­§E„÷ã´îVœ=®l?“Êû0ÐJe‡°:¤Q/Ï«[œcÝ8ï¿ïÜÿüäùšÇïsÕƒH΀jön%øHq”*‚v©•½½;·vî«Õy{fÍnA!‡äÌ|~ô zð@ )Ëý#µ4FåZZ¨BQ匞àïÀ΂p] “˜Ò ­CS˜EØÂ:ª$¯Ø;“¼ÑåõÄ¥µØZ’…g+I¹ãË0¬(ãZÅ)ÚJ’§Ü)WÚk§uqøxZ @ìœX­.Ç(3³3bS«ÝK0¬Ë)zM kW#L1’B“°gnçNyôÐëž_ ’Y&_Ý„Ú^O ¬Ä pIÆßFô^Vm’lgv¯Ð9ŽV$Uä²újB ô–^ž¯Å©kAôÎÿœ]ìr9Bù«Èb¡³¶gÕö#¸ÙÜ{´iõoIå=t13§º!QÚÒò}¨ùª¡Òbæ½v´ÐÒ eB. ÷/¼úçmÊjFèn ´Úe ¾z=€¯E·±_ß¼e7’Òr„½²A@骕¥¼ÏÙ$Ç/žöª§Io#.ÐV{á)z3Fùi¾Ú­ö/è®0g‹û¸¿‡˜ãŒÒŒ&HPŠÍ‡³ÊWrz/ªí»\q'Djki:íu(­–S¬3WëG•­GÕç¸5ÜÌBì­Û­£âøöäìõìæûFû5:¥ÙÝÖñK©qx-ÉÑ›sÆZئ½!¢Vš5wžÄHFA*ïØÃGùñÀ-ܤ„Zœö0±¿˜ Ô4í°ÎDoœ¶ö^V§xo¥œå8‹«m ^z ”2¸X9éH0ÅÍŒ#m¨í ¢*•ƒÒüiqþ¨¼óÂèÝ‹Mˆ6jiRŸ?’+»i¨aoŠ›C.¿ _¬.Ç8^mvöøsD®¯¤ˆá¨ÖÍÊ ­~ª·î€Ï,ÇØ4[¼-Bz_(ìAN¿c/­¡¿˜6 Óê1҉眧nVªA>]IIQLíï]ØÍÝ ®ñþÄíßÑêG¼¿ ½’ßYÍ\ æh­±´ BÁlV·ŸÝxÿ§ýó¥ÒöÕM$‘åkã›Ji• RÈ* €i “_ŽÒ‹ y”ÆfÖgƒ¢…Eù<£F¡µ¥×Àøàà¬Déo]‹ÿúåÈz”CÙ"­Õv5N¦Ù| %êÒ怶 ¢p=Ha¬‡rÎj½¾Ž®iLåBYi1W†3•+Ç«áœ3ºÐÐ2¸Ñ£‰Ñ¸avns¥ù&ª_ä¢9;ÍQ¹’Uj|aK©v?#äƒI<œÄÓ”ÆX-È•…Å5šjû¯bBm9NghU4+’]çœe·!AÔæOvŸüfqï ê|™wú4ˆ'iV¿<}tòä·ý°²ûÁFJŽ£ªR³þ$#V ö(gJØ[^ÿZ9N²…p†žàI½¹Xy„--ÇÄMD'œqaòH©äŒfq|S­ïEi”-ÉUXÛî_è-ˆ3yÞªMÎ?OÊUÄ…mÄö°¹û¸08GÄ¢V'÷Àµù⣬wYgP螶æP±ˆËU«y +ðiÔøü<Å×ÀÚ®G(!ÁìnB" , |øQ¹¼ŸSºœ3 ¦^Ýg¬ÞFRŒ“^Vnñ¥£sËëßEä +hi†/ÔçH«—`‹Y¹½ŽØ°GaT‡ +ÁÅâµM„Ñjfy*¸]­º—‘k«)a5JrZUvúÅCs¦˜ß¢Œ>.7”ɹ×ÂôµÁ;ƒœÚ^ŽpI¦˜ä«¨ºXw,É¿‡ÒŠßµj{PZÿh1×µP¼(A­PZ]óKAÌkíuv§™âÛ+(¼a=žUË2…`J¼$ÞZNRr1Ó|éòb~N<Š)3Y¥‹ê}@t> ÏûÖ2"at!>Ô& >¯¹úÁfÎZËèY±BÕ`–G¿8¸=»÷òÎk­.NFGESËœ?’jû¤g + Œ +v–QÒ¤ŒŠyÚé1nÐ#[Ý#K;¤„ü8Ë»qÂXxzszúztö±P; ã.ÊrJ5Fš ÚÓª‡B~FkÞ¤Ýy8ç†3’`µsR~9‚Fp•4zQÜCÄšT݃^ÎeB)úLjTŽä¬œÞ¥m(¹‡öè!€%Œ;kÔüÞ)ã˜Æäç•ÝçƒóW$g £§Ü>ð»GÌ"̉?|89ûp÷ÞotNÞ×[Ç1\7 £Ùé+¿sD•Œ¼‘–¡¶ywLJ ”ñ×c9ÕV'ЭY±jÂ,\í.n´Èï +Fq³Ø=/ïÓÞŒ°Gi¡¶–’`s2°ÄM° Lkºý»PÒ©E³»!Ì€ +Yâ9Þ#D\·yÈù3HOqÂÉ©­`V»´‰‡P3šsVc\Šò)½‡ÉíôbNil+AÖâ"xA77 \sü(%h½²£U÷Ã9ïŸ\‰hEp(Hn5©snˆp. +½3ÙŸDàS-E£@tTa5L_-Ö…åœÄøæjæz„exˆŒ7³Û7·ï|{ë€Ð§bù`=#4±v—2Ú„;ÍùÛt²Þ£Êüõb½!\ÜïuAµ2Öd9—¿žPwVí߆ô%´ ï J\cç¹Ù<ÙÈrËq,ÉZŒ7æüqšóAüi½^Þ,ï># [)¹%½ŒPËýeB)å™\? ƒ4Yr#ÅcR…Ïo#rs±æ \SjgJã6iÏ¡¼ÁÞZEs:i7Rj0£cRwG¤Þ’óCÉëƒDsfNoÞ j“t&ZãÜé]Ðþ.Ûõ4¿ž g§¯½î)&Ë—ƒd!J¹a5P©”â +nç¬2TÜ,ôÏ»¤\` ÙûÍÞî.GÉ¢n¦•WCÕÖJ\¸¼/…HÉíû§aTY]Lc¥f¿¹ý¬µ÷š²Æ+1á‹ó³÷[["„“•à›riO®ìsþtq7B”óc³¹e¼K!r³’BƒÝÓYÊÁ[4jýƒÇ|aº‰Û—ÂlJ¬G¨B”©ÈÕãÍ”´¼‰JV7ߺõ¼Þ^É\ÞÀ¢dÄJëjˆŒ–\šÛ½[P½˜ÚJs•Í¬¾œø,cJo3màRƒ¯jÝ› d(:Eôõ¿¢)±aW¶—ƒè7–"ï,g¶’eKLâúrbQ)€À UW*Nû¸<¹]žÞ©lÝWj»@‰Y¡BÛ}{xùý;£ª;¯Üñ# à„k£J1ÎÚŒ7•jç„È—o«ãGRa¾‰ˆiÖ¡¬vZȧXX"Áøœ;ž¼Ùº÷}ð”•8Ê„Z'Í™=¶²ŸRZvï~qö Õz Ò®öõò4DØÜ + v‚Ý. .¼áã¬Ô†cÁ€ßÚ”³mÕ#9'FçÆqëðu â•'µVFªÃxEHz•äâÊâJœËû•ÉýáùG¥·aWЋ’‡QÚ:eÔÆíáÙ罓P½³š $óÝã|÷(Iš ýâÞ•ÛJëNFjÕ\ b‹õSìþr˜º$ G’‹3‡ûFû•›qÂ\ŽD¢ÔJ0ËÅrJ‚ý1 µKh}L®'HD†Ô;QÂJ‹€^Åõì‚‚´Ê”ÔkWÖRª•}»u&Wâ¤CÕtNc´2«9‰J^ýÀªïY­SÂ%„ú¥Mr-Bd·T9Ëa4-Õ9gÌû[I*-Dëz*'• Ã,ç.ro­bkY µ·äÞoúHpÁmåûåÑ-H‹¿¶”¼b–ÓzBlþ\:$Åw–“¬Öèm?¹´’ýµ+QxCFj‹•ýX΂.N2NV(²NWp;¬U'µBŠ6Ë©´lµ°e6X·Ÿ +ð¥[‰’¨:¤N—ÝK‹EÊê Å]Ê›Cûã*Ä/¼8=èÑîXªA †ê…ÀHšÝœÚÔk»9{°œÕ–B†+*¥-ÆêÕü5Y­åJkˆ‚ã 4’bu%)’Æv·Qµ—æªÀÆ›ˆq=|â¤èb-F…qPu›wç”9¦¬!tîFFC„JŒÊ¯¤Õ´ÜBôëï@‚ “ÞjZX +!PB¸TáMóÄbæ¶_©¯¤Åw6Ðõ”çó)¾DXCDë¡ú·ŒÆ íôÓ” q ‘kËÖóZŒ":çŒÀ“Li)€/¶*É1 Óú\~%¥š1Íx¤\^‹æ³Upäó„у@M±ãtÇ&¢.Çè´Pg½¹ÓÌDµËèfŒlÝw«[qL ¤Äª% +E˜ðZ fœo÷ö>ýÎOh¥¸–Ö’4cÎœ%è… ÔFœý!¡Ö6’B1Öâ`@*”3”³%‚I.+40c€£×¼"WB¹II`òo.gVb‚X\Ü‘¥ÖO(wûZ\ùÆÕ 0[N¬ öh=Á+ù)ço£r7„.btÊû¤ÖPK[˜PXL~Bê¡Ì"§¤(›5»b~¦Uv8w@MʬFI}±|^ŒE…* i¶©üœV#ÍíM“t)Í–H³/–wû¯ZÇo¤Úq×á 0ˆ1Â^„2Ò0¦ÅŒ^ÕÖéË…Ðù¤Tr"UõSÜÏ +ÃÉMüë›ú€E¡fVâb4—gÝ"U/¯&Wƒ¡V7Ò +&wLu5¥¯gŒ$[&Ìa„*‰öч¸9^Ç­oðoÐÕ‡KÕ8®§ ]ð†9lq·'Q¾¼’€¸’Œ:']!¿­7ojÕ£îþ{ZõJ‚–J‚ÓY‰‘×£T„Ì#r[)4æÏ)gÂœëa:”U6ÓÒõ¼‡ë}Ð=¿„Ì*K›ØFJOryȃÊK +5`xÆÙ’Ki±~) _Ë@‰ 3ÎH,@#’¯8å9Ê@›qx`#Á-‡ˆ•0Nñ’Vñ+³r{g5’»"'ôØmOÖÓÚÕý¥p‘Õ£N¯nàY¶bŠÐ¤Y¾ Õui%ýÖR$KÙ¹ÅjzÖZR¤µ`Z $°¿xÎ +¡ÆR€ÂÅZ±ž`Ü´ÿ{%ÝQ@Ä&ü¹dÌâäÉG?ÒòÓ·–³—7¹_2 ¤¹¦ƒí¦iª6 ê*Ëz‹yz•2kµI­ H ú¥¼Ç¸ÓÅ)TNPv•ƒˆ‘æò@DaÜÌ°Àr#³uâöÎÌÖ!iu“° …ÍŒµÌ(ˆPˆ…lB;#(4{ê-ÁäÁ¹q[¬ÝâJ‹ÕÒ|(:#ÁÄS¤«VN…â1eM){ŠiÝÅ„±ëÙXVaôF £°öTÈ ê¾T”/ì/êJ,Jî %F—²Ú0L×Òb[,ìJùPZFH³·}Sj€Lˆ>Jk‹•ë…übf×®EJo+_Ÿ“„bKr¥õEÂ#°¿´¹–¤S A3Í×@NC¸³VJš«‰þ6it¯¥d`æ(å¥àÂZŠ¿åÓbÃl«Õý4ã^|6<~7-µâL%-7„{=)m"´çz +ÄPdý-T]LbGt°Z°°Ë빜Ԉa&”P’°¾.¹SÉ£BJ})ˆ½´=e=ym½áâl¶B’˜5.­¡•þøéåMòZ $%À6Ñj!|åׯ&¾u=Ŭ¢-‡Ù+ë9ø3ˆX¤ÒaÍ^"g]Þ@–#Ôr”*CÅjœði=‚hVi\žÀ_H˜6Håœf†I·Þ SKar#%æ”–RÚ¦ÌN’¶¨+½‘ 3Œæe¶oÉÕÓ¬ÔD¥z†/¯¦¤·Ö²W‚D1 0’\1ˆJ ˆ6ˆÒ̈UL©ÃkÕ–ÂÔj‚‡ +‰B’J1Iä¨F¨mÀHÚ@BA¤šTÞãò³¬T3>È t$£k*˜rrÔÛPlñœ™e³qêåm hhŠÕ( ;ˆð%0Ê4¤*©ŠKuðDøWT¬@jƒ£j´ïð¥#(K1?‡°°8Ý-!¿¯§ÅíÉ徸Ÿ‘jÄ7QýR FF¨CÐÞL ÐG›Y{n/¬$ä¥ (¯–&¡º–IkÊXW(€W¶¯E)P'pºõŒ¼£Q¥GC¡²—/N†yF0M¶[wžÕÛ½ˆQnœ¯e´nZiÅÙÅ=‚? eõ,ë*åùrŒ\,‰žµB“ñÄò) Á[Ã;1T‡†]1Ok먣ÔoÔæOi³si%žÎ™ Ü\Kð7¡Þ®…™K›T„(q…}Pþ«›d .ÂQÍ0ÖFZ…,v¬Öùj”ÛLÊðJä|ÆC1G²àÖJ‚'v7~ýj|%ÊÇ—Ô:ŒÙÅ¥Z8c\Y§®‡ETj… Õi© ¯¤Ô\C (•Åéh©N]°~\îpÞN’«Fp+I;ˆTa¬¡Ó¾%•cT9„ç7Q/J—ãÒH(ªÇ('Í—!ÿ‚àƒÁ÷]wAÕÉÕC°†(áEàWbäZ|±h S“”…ëu6?q»·´Æ)°M‚r¾€ y§¾]œƒ³Çù +(m´Öá +@))•P ÎD8;Nq +¹ ¥ôÕ…ñÉRJ=Ãæq6®A/LW—€yˆŒI%è Σ‹µÌZ@Ψ\eÝa„t “ €¿!”÷ kŠ(=ðˆ`V‡x®Vº¸1fL°yʬd”|)(åç˜ÜŸº!ã!éG¥ñÃí‡0M«ìBSDp ¨`9έ%¨™Êì¢}òíS\ÉéÜJ æ¬ D]Ïh nK!ኜÓ]û:W.‡›À®Å¸¥`.†¦puºƒxçj¹Ë¶ÓBhm)€AsÁW"LN Ê0Í5t…Ô‡(_\ÚÈ^¡ŒööJD2 bR;‘ª'£[_œ¼ú£vöö +LJÁ”¼´™;¾\ÜfŸá«vó†Û½‰«Íå(WÝ£ÍAµ¯'ä嬢€Rƽýç?ûgHUd>Løi¡)•ŽrZŒãëÕ:ì‘~Nšš@/ñÅ9 \m@ƇÁ‚Ö^Ëà,”½CÛóµ´\½™Ñ€©€‹(söŠˆeà| ñ n¥…’V?È™ðý…bG03M;iÊùJä4L­2þpq÷oá„S›iÚE)“\Dð£ÔâÚ^?”‹ÛQÜ +gR®áBq3M/­G6D0#ÒÖÈëßÉJÕͬ²eQ6O…@‚ÝLp)Ú£¬\;áJ{1Ú]Y,²¬—1%#Ubl 8‡ò& •¬7íÚDÕœÙQëGbi/-¶ é æ´!d·`š[‹S¤ÞÕ7³r#%”p³w5¥|ãz2œ–I¥¶gVBäqø]P~³yCð!)¹™V}RvŒ4P°6¦Šª‹‹qí×ýo”EÕ5[[(c)wb«¦œåJ›iš%§Ô(£ ·e€â"PHL9É–‚¨ñ­«Ñ+èå@îj”[Nˆ!€vTÂæëJå Eùë ‘µgiRªʪk1öíë‘w–ãP6)ª% +§µÎ:gŸæÏþ]ÖÛ^«ß¼–Ž¢ Ðzg%Ψà/¼?sÛ7Yk”æ«àòÐqíí§‚;6 æ|,PÜ~~üâ÷ÞÿÁþ7ˆƒ Æ–Rl×:áœÌÌZÒèãz'%”×Ròõ¸¼ +fJä3b $êdQcl>ôuÒá‹SÄ‹:$Ü,_ÉðÅ ¦ú&)Wr†…îázVÏð¥Õ´h”b*Y¡ƒH]À¡ˆaÎIÓ>(F°ñSBÃîÞ¶z·`ˆ¡Ýb¸ÌŠAtqµ"Œ!ÌN2ƤÞÿ}g¹D2Œ› ­pÎLñ5ˆbñÐh݃=Z “KkÙäÂ7ÅJ|!%×½GXcLël¢ÊrŒÀõ&íM¼á]³'£´c (›ÿ”ä¼ë‚‘EH—´'vÿ¡Órqy#»¡”Í-–/îŠREÔ'˜D]Pû·®'–ƒX É®FˆØâÚb5-Ô¢”,G[íiàJEoœ ¥C~±ðe3+ G‡I›2ZZy¾‘‘˜9NÚ}`­0j­D¸+t=Á‚ûSâ·®DˆJj-\n0÷j”¿e¯†0ô·× “0f‡d…:®õ©ãr-L^ ,dçÒ:²¶XLY[Jÿz™³,[c¬éFVÏ]Ê‚³C8};»bt —k¢×½ÞÕF L†õj˜Y +s ®ˆíœÑç½-Ð"ðk`9.¿Ë»J­#¤½¥CDjˆz%%_qðZϨ”ÞQ*‡rý4çÏc|c "Fdqo@ £0àöjŒµ¾ Õ!\葵”ôõŒ£ÞJû0š›iÐ šRvŠ-*‡ 2Ó ²õ:wzg_zó ¦_ÂŒåf x6ÛXÜë{ŠÛÃ8D ß´Ô;Iå“L!IW c‹røÂAœ)^Bd Á­Æ™Z9É£ Ð^Æ”.\ª\ “ü­æ±Þºe«¨ •ñ©²v/ŠÉqÊ&Ncþ¤üf´×1m ‘p­ë½õ¬àÊBéXª“öV5/mdV¢d4gÈ,îàÅ=hÛ¬:L + €=R®®FéåBدLnéu!`;ù0ªbR%Œ©Aâ O›=opÏ]øË(]Ð.Z‰.ÊéÊ&¶÷˜„ÑŠæÌÕ}e¹$ °ã„ýÖrr)@€SäÔ®Ù¾±—‚¹%†9ŒJk‹[z˜kaúíU,„É…¹€ë¡Œž¢ +ˆ´¸óaq 1¡l"¨ŸXÚ‡=}gO2E­z¬ÔnPö8„(À·—ƒèõ(‘¥ý@Œ{ëZr#¥j•½þÉs³½À’—ÎÁ9gÖ Ÿ3Gfçvqü,LâL- RɔײÚÕ(s5B')Ï®W¦Ok»ï½‹•”º‚AÜ-Lù1¾š³fP¥\aB ´ÏR˜…²ŒSÚšªÁP.ÇypŸkQzíêÕ×Ïz€R¦¦ÙkõåÂ6Js!wëÕÚ„VuC(@`™+L“J3¥¶„ÊaeÿT;Ûü×Cx8+QJ[ðv2b7‡°/0¸”ÞlÎ_ÃQåa«¤ÒiõaK’l%N—)£ŸÊÜ‘yLí9ý «{7gŽãL Òq†óI½.åVç8gŒöyaú°0{ŠêC\èµ´k¶n&¥N„ª R# Ɉ6ÑVb¹£?pú÷Û'Ÿ’þ6ˆÀ­H“¨TÊJ¾PÎVZè&˜Å’0n] S°/”˜¦mÒl°Qö “Z˜ÐX —7±¤Åìõ$xŸ –‘Ó»¨ØÒ~{5ó+aœ_œä ¡f³p£¯ÕöyNm®ÆrÁ 'y}ÙŸ}óZÄâí*@]KÒ%ÀEÐÞ¥P.Ã×Aÿg¶XvYé‡0-¡QÚRöZRz{%ȨPa²ö·ž6®…˜K«Ù8¢a¼ŸæòQ¦5ÇîøicïµV=!”6´e´‹ã»à› ˜×A +À%õ1ån¬¤%¨„$ééÅ™UݱÇpl—ã*|óZJóºÂW³R”-Óù=¥~B¶ Ñ$aq°Àx|aYíÇÙ:ü÷R”YIp!ÜX<¿PÜáÊBùWšåAüá8Ã(àj7§ ›ãJ—ÁUóˆ„ém«s£¶û¬{ó‹œ;»ã'V£$%Îd¤Õ ^ÃúÛ¼¿Këôz[œÌ( ¹Ä Ð4ÆÝ"-Àõöâ>:ŸU:ßh{eJ¶0c’Ó{_D„<.—øâÌìžt^·ŽÞë'º²‰ÚY8§—d¼ß ÌébeOoãËk(À6ÃuÖê ‹ûu§q±@’Zœ·EšðSD.ç‡7çIÒ:¼VÓZFlC8àNÑ®nf£¸¢&B~F»[1ª¸™1×SPœ.cÁ(Ká.çNk”j!Ô] +¦Ñ?_ ¤¥År?¸-Aå7N8oÁv5ÅCÛzÍcFkÿ£·6á@1Î@¨‘Þ"57¡2W²«q —›Á¬È„>"´aš­±æâúÈÈr„‰á6PhÝZJ‰00—(j&Q#Ù[œF_3;·xg”å«iº'm9?*ÏBi uÑB¤Ÿ’[k¨u-.n Vµ¾#Ôä‚‚ú¾Í•6²üÄå0c ¾¡ýMÂLHu¹~^ÜýXéÞK 5h(ô n ÞÜé\î^‚on`ÎÚâÞ7J˜‹%æåø)F`9T®C?BVZI +óÓ|E®,¾\Ï(ùþ¹Ó=ÀJœ/ÄYбCžÅI3Ëù«)n%A‹Û„ëQn%&¬'䵸Ï-.$8—ó•­û”7 L°ePÐÕõ´BZ=Dim¢8øâÖ/{Äv1µ@UˆÑœFh5Ú¬àJ`/«v‹Ó—|é¶6Aå7’®·\~Óƒ9“-L[{Ï«[Eo€q^Š°ïíÞ­¤Ø€†ÚDlˆ9¸>p{·Åât-ÁmÄ…ê@qB·¦äö:jC³\ .Ï;½ ®#J7-õrƤòÛpTÌ3`iÛnœ N¾Í .ùÂ<Îå})UÁ’Û!ʹât—¦¯µúNÒûÓ:èôUº ›˜åòJÅû¥*Ò¨Ý Ò«Qz0 T¼Kr%"–I»§ÕHg°šÐ0©¡²2‡«u\«ÁÛ){î\¦Ìþª‡ ©«»fó ü ^ž+yÀ“¬êvÚ6çùÜ$@e×p^€åÆöºUßîî?Ÿ]|HwŽ¤ *"F»Znšë{×1åšYÝwZ§Þ=êå Dþt-!,6݇®‰I¡t˜î?+ny;p1V'Ƹ÷ÃlŒNC‘€¨‹Ò™õ˜´æÁqƒa‘rïvA®ïž~¼¥AñY ‰Ä€¥ÒËÛZaÍ:ý˜XŒIÍMª¸‰çHsR?uÛ‡I.›d]«¹?8úbûñ¯³½ X¦µ¸²è'V”Â@ײ¹ÌøàõßÕ¾¡Ý)hõ͸ʧG…Þôìõ“ðgdJiµÏÕ;ýF+-`žÀ86Ý é™©@Úe/ßþ½Õ<çó³0èj©Ê ¹ŽÒš@ï Rݬ,8§!Õ ¬8‘ÅÅ–’Û©o½à +S?mÛµåøäª5«“²Za± ¤ ²M,,h»ãí +-©ô¨4}W]|eµ`r$PJ((îÀ®.•Ò4È×ñ"·µÒI¶÷\)l zˆt¼_Š^Û+ÔlûiÇ›ŒÖˆ2™Õ¿ãQ¡h5Î2ýÇ|n¤ì•˜˜àòðXIQ¶Àæf™Á£Áé/êû_IÕƒ Ti½À쵨â÷nV/!r]¯/¯_]¼‹%:ÓËöÎî•\ÜFäò&am6Ÿ˜åí$ï'*×)³›iŸ9‹¤ÒñÎÃHqÀjaj5)—R,¡·h½éY!ÌH +%ÙûÃÞ€o˜.ž±”¦´*íôÕêavtî<ˆ2ùõ˜²™P"D:ˆª1ÊLPÖF„[Š˜XÖ + ¥¸÷·™¡6ÒÕmó1™ÏÌÛÇßèÍ1»d¬¡—“ü¨ÒÛM²Ægþnøâ¡Ý½®n}!–õ½ ®,æç»éÃŒOÌfÊ–Š» – o_oYY§ƒ6³’PµËØ“êìUÿø[D¬ÞY'B˜åD9(ûû.@º1¡L;½Úh…(77|´|òûúö{½qêÃóÿÏ?‘1øÿ{ÿ_Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚ¸ ä¦Û@nÚüÿDFníŸÈø/ý~co¢O†Ÿ4ìOüJšèÃ÷¥áñÉôè“Ü'þ~R9:Ñã“ÅþÞðèb…§†¯%KÓáÎZèO¯\ƒ­åóÅAÖÐ5äãÿŸÄ):E%PÅIAh_£(‚N`CQ$ ?$×v½Q©DŠ¢0CQ§ÿñ‹v¼áŸcà8‰`ð"úã»Ð…Ò8ŠÿéEÿèãþ³^ô>në“ú'{Ÿ?aÖBáµF¢R¦Ÿþ§àP/¸ù3;SöOÿT§‘ÿLx$Àú$©OÏãiÉR×¹OÚÞ›½|þéËÚ +Ê '¹Ö]Ãt EHïý[ÿyïðfôßõÿŸ^KÁ,Qêã„ñ5ï½È'~ÿÇ9zÀ®‘)C?i¤ÿ‹”R2™8Ÿ%õ:e6)­ž’kI±N˜Úz ËÚ÷[ÉM9g@Û„XŒ°n„ñvÒÀ” +®T“¬Ë5!ÓÕJ3±0e2cÊáÖ€Ë.¢lÖ—ä}q&Fè„ZæܾT\ðÅ%“áé^\)©´Zòn•Ê‚;ÓJ;fý˜´¨Ô 2LkŹB˜Lcjƒ´z´ÝÓª;I­±†¨Þ¦Ír&Â-„/ŠîȪ…™î†Ù "—RŽ0+ÚÄš^ß7ÛçéáS¡²hˆ³®QÝË ®Œö‰^?Lw.ù³:!Ö%ÍvJ«Çù¼Ÿ0ýˆ’`lTp)½Bè5ªÀgar=ÄdÃL.ÊRz&†kuÆêàZUš™æ£z„¨í “ÝL™~ÜŠ²®’Ÿ +™A˜²Â„ÉY=!3"µV„tƒ˜™`³¼ÕɶŽá>Ïj¬Fø™‰1¹8“‹±Êö7z)½³™A‰³D(£B™6ºp¨8“OÉõad,ΣL6J»¼Ý"–ãlч§ïEøû~#©ø“ +Êe ©DBÉtÓ’Œ³ãî‰ D‘6¼=BçRr« ®LY° +„ÑŠ±Ù!l?jlÄå[ ´NJnQzM¸t¿6<·ë‹0¡%…2猕ò‚ÏC„Bà#ò˜ é j3Heƒ¸Mé-­¸¥dÇ(›Ó‹sÊjEù\²“B‘IXgL*5Û `ŠU(ogÔÖ]àÖˆ°Ç¸Þövó–Ëa\G¥¢Tܲ»gJuÏÃ:ö"",SuûÁ·Åу¤XH +1¿ÌôŸ ÂìÇ„RÄÛ33¥0e‡)o×T©ÁâB%Ηý)s#émÄ¡ÓÞÆDf#!–Pµ!æ·Ò«òøIÿðmRÍG¸4ŸëÍ“ìä¹Ñ>'2ÂÐfw~ôusçuL.I[*l§¯Þ"=!Ò£„X†LÆÙÂàà÷Š½=0b-&lÄ%ocXµÙFV\ª&¤ZB¬%•&ªÕ‚·"¬A˜ñö S™0åqo;²(•NIÅç†I+ˆQ<ƒa&Ê•ó#§¶uµæüIu=*Ü2̈C©mÚ£J›¼=Y eÆ™l’/âjj )BøuÚ*…í„P¸¦~À¡2Y³+»SÉ™$¸Ü½@Œ(éý9ó;þÔz„A—Ô:”ÑM ¥ÕÓHrùͤìÇ4È@„Îo v˜t¡JrÌL“b1„©QÒ^‡$ÄD„+•C«vbTŽ«ïT÷¿û›áÑ«?[ +¹™·Åâð’rAÂþØD…(õã†÷‡±‰4´€”Ÿˆî—J´Tï¿“ +ãe¯!2!×ÒíK³uŽ+LÌõãæHLi$¤jL¬áÖP.lÛÍcÞ&GvNçX*Ïp«AX]X_&3Ñ*;í—ji  ”ÖPË{rõ°†q® H)B„B”qÖ‚U¡ÆÜ0¥™ê„ÖC¥:¡z@=H˜X jLÈ%•ªV=¨.¿lì~QÚzWò„^• +¡4ãJs<=Ôê§åÉs·sÖœ=qÚ‡ao_‚\ØìârsTïâöó[a­ž·jRÝDõMÔ@eo‡Pʼb|IËPÉ>2½I»Q©‘Tz˜6*Gˆ^ß@ȳ_IgÑïE¥ ‘†•VŒÉLÁ×8›i\ÞˆŠ›q`!FfdgÈšµ¨Eϯ„ص¿åB¤ƒ* >» ÓsÆž*ù=9»ŒPYRmxÊ å_Áµ¦v…ÜÒn>ÀÔú¹qpµPÓŽâQÙ;>⎠r’vq¥ƒÈ­(]ˆQ9Rë V°‚3êIi-iøRLªA°° I­ŸŠ˜Or¹•0Ât”/1F^€ËMFï¨Ð¡ãkXâ?_‹±™žYÛ…‹îÉ͘PIJUÊä̦Ör9êm,VRœAoùÀØ•+´·iÉ$)×7R†7½Ý‡Ü‘Zœy[g¤;˜ÞH™Diz'ÁøiU–ÅÉC¥<7ªs±4%¬6—‹Å-øŠóÊ5·q(Æë¨ìÃt„¯ð™iJm¡24c%@Ø!Ú‰ý‘¦ŸH‡é"mŽ„삱µ;I±Œ«u ,Æn³™öþ‚¾Ö8+;ˆÞÐkûzu›uraLºÝt÷¢»÷¡8}Žiõ•&Ĉz?&lbº”Ýr{Oìæ¹·9Xºïí’ÊŒWa~ÌXGÔ€·Óu1Ææ1© +‘ëEÅJBi£jŸ¶çzý +”@ÌÛ +{ŸÏ/|)k=©m$ \i`Þ_ˆÏĹ,"Tg’^Nìµ0ÆÌføòzLL°ù”T ¦ìõ¸²™Ôƒ˜0rÇOn&•(›§­~€ÊøSé@*Ä! ½„·ÁT Ê&Hgৈ\'­1 :@ºWx´ÀT(ìíB=ĨLJ(#\á~ˆõ#º/.ßóSqºi„†è‹PyZmZŹ–AIo$5?fûP=D¤Q¥Åº»zõP.ÌÔ‡{›qq=Æßà+!†*Åö‰%Õ–ß‹‹P*à3et€(ùÜžOHuDª +Έ5êQ€(ƒiMÚ™ÈÅ]½´`¬ÂçTw\ž€*ÒÆåªb@ï0Z›·†1¦£@Uf×㪳 ÀR6êfRÑ.Àc·ÖãÂJ€Œ’_B_ ‹k14c áeãKÞ½R5L»0gBkƒ×€2ƒ·§ä*¥µ)Ûh~@¡„ +ó.ˆ®Í„HjÀ’÷‚$@ÐjPŽì}…9„‰4Ô!7€žäüV‚σ¼Ç”zJ…Ü6¡@4¨U˜$&”¬»¡SjýãNæÙ„èYBI© +kÁ9óL÷IaòR.,i­.µÎìQyrôGšÊêÙ¡YY产B~òCÊ ÇÛ Îªè•c½r"öåòaÊh ±j#×; P¨q\måú«óÝ7µÝWLaf³2}ªÕC|).×Rz[¯Úí 0kœ;ƒ)ñ™·Ó#è#´¦^Ý·›gµÙKäa¾Žj=T„V§ÍmCn‰¹YJk{Bb»²•«Fí ¶x­ÖäÊv¦wšÊ›˜‰Ê5(?p")-D9 ³ïmM8k1‰QjVeUªk ¸ SZ€B´9ˆ¹uÈ$<‰Y ôs)¥v¨Â >EEeîGŵ„¤2ððm”*ÄèÊ&âí#Êg-ʃŒñkMÈu)=ÊÔYk"³à>*‡IuL¬jMPùëqH3öQýÂG„0áKÔavZk &±ô^“§Ì48¤*At'´á©ÐåàJ]t§Ã8›ßLÈTÓù͸ +U8¢n3®Æé ÙJ„ò `:<6‥*|P’+8€¨Ã¸"oö6Pí~˜¹ Wƒl„t€Ž9»´»–”!iqÖY á±E¼Ý¢jÐ ”øÙ眗¡j(ã ’Õ-.”ò°ž˜›ãVQK –¥l›2`Úï\Aí+м,H#­ª~2—«´Õ3JÛ|nä#tL)“fKÌM§Ï¸#Äh'Ôº^;hl¿Õêû`¯p{2:B~®T„â.—]€Ý†×‡ª *$Êf9w*—ØÜjRÖô¶·B‰I÷1µ +f´.iR¨)…}L®„pƒsú888¹‚h DoçǪä—éÆI˜uCt:Æçb|°v« mÑ¡8£c–1hà ËÇÇõ&˜î`Ò&µíÂê¬É ¦ãJ[Èíq΂Ö{¸Øðy]ÌŒ¹aÏxЈÒÀ MÀ–¤ ~*¬䜵º`F‚„"0´Ñ#a’|^ЛqÚù̇®E9(¹$¸ZJp òI¦ XÝn|ºžXr¾$ (í*¡µ@0ኙ©èÎ"t84³·g¬XƇRDuø¥•u7@€[É1*Ÿ`ŠN&'3~D^‰pë`1â2€[ ,å€;.4öïïG¹¿XGÖ"\Š¯H –V‚µ¼É$ä0aÝ¥þb%°ÄÖÀü¼Í'•8Ÿ«åÇpú§¢3R܉à#¬×2¼;AÆ&&%„ ¡–x»ÅgúFýPÈÏ@`¹DÅèù¸XÂõŽQ=4kûlºï'Ì TNJŤ\ +±pàà@eú×*4lv—ŠzeW«xUÄåèôÈj?ÌN^rå]oÿXÆ;ÛPÊ~ÚfÝ™\=*§TŽÞŽ°¹•´TÊÛ>¶âm’v‰ YÛH*¨P³3@§µ8ϤFëL*ïAw `—d¨[pG|~`ÜûqªÐºrE¨ TªÀZ€â…Àï‹÷!°ˆ`·cd:Å aÅau"‚„ ) ¦ µËˆPÑEÀ´ûaÎÞt&B¥ÿ´7ÝZBâ;Eµ6ÒG¦+‡À+±9Ïai àâªñßLHq:&ŒËie)Ó¦ö¡æ&b¬D$Z_bÚOÖ£ã’r5 ÖO¯Ca j(eÐzWÊïÉôÝ0µ‰ª¤ZÌñ6es÷ƒÌZTô£Æ_nÄî‡ ¢€áEùb ©¬ih +_RC=´)«¹ïjL¸¤>õa~RiL.³vgÝ;×—¡õJï‘ûþøJ § FoË€ŒEE-Óñvy%]-OïÉe*'X›T+~Ü~‡ðä ÓƒðÎ0[a\²=T­DdÓü„"Íé\ñÙ&VõÚv± áAÜÛB6ˆ˜T4ª;ji)º³}€Û”Þ¢ÒøX ±ù8 ^÷*3x˜”«¤Þ]ÎŽr§Q±dsÀ’FíØlŸF t“Ÿhg³Ö ,,‡YÙ¡Ê_Èôƒ”³W}¨†(FçŒÒn¦uJZíaåºÇ\a°Ž‰ë˜¶I˜pD®TÆOK[oqgöʨn'¥Bˆá!AÀR¦äz\žÝ_±ATBùÜý0¹‹ã¡ñå<è={acœ |¥Ü(¼fo&ŒÍ$ÈÚ¥6‚) ¨Õ¨¥ÂM€‚{ž{Ê2æDB¶£œ ¶Ñs‚ 侦„|8¥BÎ)O´k!]Ö€˜ÈlÏ@®…iR*'¨´?© l)JåâLŠà  /“SJ1ÒAól"2Ô¿/i@EIôÿzœó#bœ‚ÙJàïîl¦îÜô˜0Jv'ç¯þòw6ÑÍ*äý&¢úpìa¡}TèìÞ÷'‚1‚ämRÈ%Y@E¨–t”rRB±48C„&”1¾%a92I!ÉÚr¦Ês-*+Ný‡]Íi£é}•+µÙ#ÒlÜ ±ë i‚Îf7Û»Á£dÆó‹Ÿ®¢‚U.Ÿó¶[oCi‰ÙQ±¹?=ÿšÉ×-HØàq¥©•÷›;²£kDõT“ZÛ‹ùã‚ð#í¾TÜÎôé­“tiëèñÏ´úòÓ@MP¼àã Åì‚0zPÅáUD¨€ !œÉù90))VZËg)³ôéf bLÊ€PÊj5/ê;o™ìXÍ º;Ïü¤ö“ÍÄ]*%•a&À/z~„m’’À ºwüèj„ö'ÅøG_ ÕŽHPQºZš…PY<T[‰ŠÏ”V´’·Ó,pM‚ÍÄ(+ÉåÖAßz|ç¹éñ«ßFøì½—àò`l“l!Éþ‚)Ë,Ív.¾­Íº‰Ýõ¡Q:sƒ¶IàBê3!A׎ +àipjë*!A¹Rz¨ç§”Y_C`LÀÉ»!Æ B:œZgÕºd÷à˜·‹S`Ïû œ6Ð "'H,cvìÚchó͸àK¤ê‹KàÁ-£IvCv:€E^¤!꾟؈‰Q˜rü˜±‰(w‚)J®)ΰúÏï…îûѪ¦¤6¡¶¥á5ka&Œ¨~°®Ar5Ì$йµ­&„*´ä µþÕ0¡ˆ€ç +‰kQ¯€7€—»—åÍv¦~Èåg¨Z‹s¹¸—X"J +y(*Úl ÙmYë&Å’VZ=\«áj2[˜dW׋SÂj­§¬ Ää;l ¤¹‰))¥B›MÈ3ŸŸÅåJJo„gJ]ª(ÅEvpiŠÕ½¤Þ w®gÆ1uSSz„zJëÐÎ<¡´µò¡VÚqÀµ›‰&ä-˜rB¸?  /¥Þ Ÿ•0Â<+ûvëÈ®ÍÝæÒ—”\8º¿Â6“¤BrçŒ="Í^„É‚ûãC¥øÇK¨´ ΨoUœÁÕzÊS\ÐPpص±¦Ö"4,›îJÅeõ´%Í@À] `a! ¯CT.ÂH} •O¥¾‚˜ +T ÄaÚn˜ÎæÈlÀ¢ÇÙœ?)¯€—…DÊ£:ÆåÓå……µpâpX:ðl µ¢³˜\…nB¹üÄF˜K’™(ámŒ¼ +Ò1ÊmÆc4i”‰ãº`¤€mdWÃ<@&áÞ… +à^Š6ïú±µ»ñŒs€”ÉñÖ €þ¸"½{¨ÀøZˆõ>Ì€a¼¤7âÒºwf"2âtTÚ U¸ãOj¾”V>L׃;v|`EkÜ ku¢4h×,ïtÀVÇ„rL¨#j׬g‡ÏŒöD*j  #LÛPà #?j€|”+ko$dŒ³Ó QmÔ9³Å¦GfãT­$•ÚjRImÜhB_ •3­s-VàGQ¶€ÈuTƒ¨‹>BÁCií\ï‰XØF¤FL4ªBJan+AÊ;ÅÍU(sD™ÃäÇDìG®!R‘°š ¹ˆzØÕLòUÃá5c’a“‘:CÚq¹ª4cÞ•bp[%B÷NåADàÂ¥M§'˜ÔHI5èàÓ"nÆ@½ÄW ºhô$d&¥6¼K´¨²æ­)¿áVCìFB ѹ¤Ôĵ^”­DØJJí2F/JYÀ#+â`{ÁncJ3Êäp¹.g·B õ#,Be’¸ŒKaÔ µ^‚¯$Øb„tÖ¼‚‘"P±ŠJ Ò誹-Ùùâb³ýqù/Wãv7xLJF;ßñá@v+/Y&™üz\‰€×HÈwüxbø+”²­Òœ³ÚÐ}í¢‚|M¸á¡B‚0r3S:ºë'ïùɨð™ŸøË $Y(eùQ–`3.yç„*DLpI¾„Bm\®0xˆ Œ0­uÕü"É—`ŒÖp» 1çx‡7¦çJùÄi?æóKXzèt«ºKÔ0@]•Ò‚3Ü9¥w@äo$Fifê~Ï@AV.î§/ÆiB®û“J»´3ñcfˆ°µæ¥X9Nj-X,LiH¥=µ~¥˜’ŠœÛǼëk³(—÷aFœ+€Cd¬>Ð,"è½8W +Ó…x7àÎIràñ¤Þ°ÅTp¬Eï”1Žóµ•Ùˆñ¡¤ÆmLξ…pƒÍ iÇãk?þÑ8ç–Ji/ì!§÷®æQ©Þœ©µÖâ2 +Ö5¥Ý ``ü}¸µ ›T!uQï|N ¸ÒZw6q(`på léLwÙôL/Ÿ(…]Rk±Fò÷#øÓMLOÉL,Ðz]rg‘”‘$MF©®‰{›ØfDd4ï> +°ZPZ¶Â±grÞÙ Ð<.ÖãTc+PNv?üçwC +ã'ëØ_¬$×" ñ¼+˜ Ä6“zœ-®Æ¤Ïü4*Ö\)ÁÕP¡aAvö bµÌ(Ag?óáw61(ÔpÊF˜BJh`l 0 + 0ãÝDtµ°­·—À~B#C™m&Á,?š@¦ÞÎÒL>ÎVã2È°°Ê~ÈFB½âˆÎšC¹¸ôãðb×Z„ÖŽ1OŠ÷¢ìjRÃkTwI£­8—2C…Á<"H\FïHé1Ÿ®Åéc¡J‰´Û)Ë»TÄÚ}97ãr[qÑ»¤’äóAÒXOŠI $Vœ+’öµq¶2=éí¾ô‘Ö&ª{g¸‚èŒR¨)wãcDÙúž(M£J—KSr-¥À<{Q®HÈõíÓ¯·|ˆ0™Õ¨´'náB†SÜJñ¹XJ§Ôê¦|&V"©wÔâ6ઘ_D¨4­A‰ÖW¢ H 0•O +PÚP9qï¼’¤]pý+QÁ‡é0gðøœÞaõ&4B¸ :Üå"¸íôKªAÔ@¼;ôÕ8ð»‘âr(—ƒZ‰‰à!-« ȶ¸ÓF ·[¨Y‹1+Af#&{ Ž˜ÉgµI€÷ds÷ÂÌðqq5)OP±ŠÊ Òêo¦À,P ÆŽS&åA°m~¼þÔªìRvû³(¦³œ3àì.àÌ@;‡Él”ÎÎ#´IJyÀŠá$„“žˆ¹­üà±Ò8\Ã@šZœ3¯}/D$îF˜n‚ÿ£H¥¡ ¸ +:!„û’¨5D,µ½ÆÖui|v’`r C0|tŽQj”PdIJ`µW ˆar!». õ#81Ýc¬öŸNFm&L®%øبûA¨ì dLq‡vc-.Å3Ñ4¿µ˜âµ‰§a-JºD§5ãT:Œi¬ÞX1wýÈF”ñ + ¥5„h!PÚ )ˆ‚îÂ?]‰úâ<Á,‚+±fŒd ©1j7ëÙÙ3§ð÷ƒÞòy7ÕD`CPà?Y ß]G DI>‹ó¹8Sˆ‚‘dJbf|?&Üð›);Âz§b>^î™ ÙiŒ+•€­ñÿç÷C@µqŠ¦ŒÕ0ïK(¾¬²tÇŸ‚îC¥ÂÀêB×€hŒó%Õ`²BLÚS#j=Êd½´Ódðuç[\ |<;„·‹Å Ü\êÇ-ti¯ÅEpúzqn7µÊn\¨„H Ì8ØÏ®D ÖXU0‡Vy×››„¹–Pœúe@_ëÐì>ïÌ<0#L¬€!”r˜qÁ6¦ôHwDªí‚‘ôáf·áÛu àq5!¬FÙ5P˜Í˜}Æ€©u ¢ +ˆLh„¤XÄõ–R^Hù&µ(s(÷™[ÐIÆ¥Áœª@RÐö’8€H ¦æ1ZD¬ÓFŸ’ž%Á èP@›1i#&ù’´˜ñ\c·6{ôˆ[¯,ËÒ]ÀS s±"4T¬³æ×BÜJ] s¾¸|?ÈÞ 0¾¸ÅmÎlCÅ‚äŽ{wÓÉw}©õh$Æjs3)ß3þ¤ä‹² Ôïn$AÅ—‡Z¤Òní—s±âÿô~(Ó‹pQi#*C;ûÄx´OWBk! +¬ß»€Î¡|°±‡ ÕÆï„ø Ô»·Ê÷Ñ;¬„Ø — °{ï‚júá\1–2îl`Þ­ePÞ¤ãÝßEå(«Ãf„ÞÙŠ˜Úb2#ÆÄ¡gžXœñù‰3áH’Rêðð®F¡¦×ûð.Žãét”<_€Ÿò™¡y—/Y£)»=)72#LkSF›Ò›‚ÓGÄ,¸E£²C›°i„ÚØHë)ÐÌ…öÖKÆjÅi;Ég×PÕëÔ +Qy\mrNd{Lkù‰Ì½˜²S@ÉSp¥肶W›Œ3DÔêOøÝ@ +¼ "” ­…kmDnbJp,€ið<È?`ÞÊäyeò‚Ï,½¸ƒ†*1Ú3à«19Ædïk´t‚&*A[QìXŒ-söDr&`+Õ=`÷ Ì8†Ù ´º” ¹Éga,?!`Úz˜‹’Ù]ŽÐå¤ìÝj"ݦÜõSw}$ÙÇ#(pULºå +œÞŒ`òf”‘YÐÀ+!ôpŒ.ãrÅaÿìŽÿÓ•ÈZˆA=RÎÁêj7L€®‹¯0’Ϻ™ "ÜŠ§¬R–wÅ*LCÈÞõÄ~?Jz÷¯.} *?áJüÙýØOVûPð¨aŠoÐj€Â„ +¤”Æg¡,¡ðBžßÌ@8q¾Âg§fã@-/•âL¯ïV‡JØìž×k{Vû4Ý»D´N\ª&¥J”̓ãð\›\‹òÅ”›‹¾ø8Ühòîˆ0; Ša}ù,ÖŒ1›rv¨–´=dì¡6A?‹ÙIsú¬4¸’rã„çÅŠ€Eˆ\e1ˆdðb´ÑfœnÀ'©@ïƒ+OÊ5¨y>?çr38ŽÈl" ðLÚîbZ# :G®+å=§ó eµ Ô/(î­&5¨Fpy\n×;÷¡ybŒuùÜ„ƒ M, ؘ«¤Ùã2Ãèd.P î&LØq&‹IuÑÝ‚ØãÞ=WY„Éð6tJ“[)µ¤³Q¡ö3Â@êCýøPïhv¨.\k&aÂT>ÂÅ[ë1>%•^gc|%@æ é„ì TkˆpAøSÆZÌ»½å¡´p±†òZF©ûb¼G„EÕå]Z’ˆX'Xç‹KQÜ\ ÓÀª {)²pv.GËeÅíû’B‘£aT·¡>ÞP +Ù…£ÞU§’nƒ·òƒÎaó°‚„ÑÇ´NB +«av#¸JÝñ“>TxwÏæH½¥•wÍÚ®UÛåÜI ò@XALßHj!&®–ÎŒùÜ´0~ 7wÁ éµ6;! $Š3§{VÜznvÏYwŒ)”ËXõÚJ:(ºKù ítÕ +d¾!æÆfkŸËŽ üà³ôÆAnp‘é«ÕÂîãzG/mƒ°glÀŸ>¬)çÅܨ8¼`ÝAL,az‡Ê̸ŽXÚes[˜Ñ¾²c»u€ª£ylu.¨Ì8©ÔigDB¡Z]!?I(¥¤\Š +yL«ÂË„ÜP)/Æ‘Z݇Z¥áAV-Â¥ HåÃíiƒ=D䊟°â|1Âäý Ì.“¶z¸Z¾Ž0é0iÐFð<)•!p¨Úì•mµ´š4Útº—«~&`à€5¥²#•¶P­¾&¨†ÃVq«‹Û}±8W«ÛdºG˜¼•”VNˆD.Cåâ‚Na)½™K cŒ%ì$í à&h‡^3»`{ ½™O©MDª©|>—ÊÀ[P©ÆZ}=¿&î^˜‡Öƒ’‹RY`pp‹œÕÕËótgϨ/Ôʸ¾ýX¯í‚£r%ÊÐé n€Çé¦K»²•2š¡ÀçÆP?kI¢€p€Ô,¸ 5J™jq²”^áœ.eõÁÇAGK…=!;‡gH£ºž”˜7äSÞM­ÎW˜iõ=»}('baÀ8-¹4.L/óóGRy.æGj~ÐÞ}.¦˜Z€²#˜¡R4ñ…1ï ýÓúò TZB®A5š}¨+§{œîÑÙ-&³Å¦¸RÀäBB,q™‘QßÑkÛry‘Pk^8…9íô¨t`S(íh­3£}jw¨µ}9;jï¾1Z'A.OÙ}«ufµ¨õ#¥ºGXmT)Çø´C\ Ì2f#×?-Mº½Ó\ÿ`rD(Á*pî‚1 Ž#¥TC¤ã)º”J =mP©LêM.=´ê‡baÆdzP¨Fm›q: 1Ϻ#>;‚Æ‘+Û¨ìà<Ý9Ö;©tg-eÅøkÃë§re¾&Ä"¼Ò¬ï5·_¸Ã|yË»ΉT^f‡Òí]¨.6ÝÈʳËt{?!”RjÃ;l4Á,+ù1&ý)p(&Ø({©°às3Àøtµ²ô~=ĨC}&¤RJkª¥em~]™_S™@ t78tfD™4®”ÕÒ MW”SËs c£}BççTv–\ëÕm¥<5€¨õÖ‰\ÛË»bq;Û>Ÿ~©Ôv|´ ¬g6ÅâÂ˶;ònZvú€q1¦ B-hå‰YŸgz‡…éÃt÷„ÍOp:e+FX©“†GÙ¸Þ}ç LºïÉH¹ö¬<¨Ït§Or“«Üè.ÎíA¥Ìíö•êR©n& º`±äò¬l]·Ž?oŸ|^˜]éµ¥Ó\_ŒNß6vžf‹Ë ÄÒ_˜ÈÕ¥^] +n¿Ô=N)5T®ÊŹTÜòs§{ÚÜ}Y^\ÛÍýÆâaºµåUkZe™<(ÌŸ¶®iw”*fuÕ+>T$ôŠÝÜÓëËÂäaÿìÃüéÙéãâèÁîãoõêNŒ¯+Õ#­~¤×`¯Ú‡_ØÝsLkn$eÀLR.)…‘;85ÛGNÿ¼}øyyùj;ÓÞël]Ñ Ë½_ *¤Ô–Ý2Û²Ógµwju·4<'­6:ÊjDäF×ÍÝÏwŸýîüݿܹúz÷É7vg_­ngW…ùC«{Xš]ŽÎ¾ÞºþÑî“é6aÖY§e6vŒÆ~}ûEkï•Ó;Þ{öËÖÁ+2×'ŽQ[8í½âü±9¸r&OäÖ¡Rß…oQ%$5x/Kuï]åà}yÿ]eï;¸¿s{ûZu’_˜í£ulwNËÓ«ÎÑÛâì”]„Ï`zšH)ÍÁíÎqyëy}ç “åÐÖ+TÉ2éšRšäFÕíg•å³öîëñÉ—Lº GJ À[­º›nŸByÔ/»ïr£'lf lÀ@`y§sœ›\šíC­¾c4÷g¤Ê‘é‹hÀm½u˜Ÿ<‚ ·ßÉ…).çi½’â² `hkn÷OÞ7^Öw^´¿,Ï>ýœJ{mXÝy>{üýîó_ì¿øÅââ‹ts©•g¥é“€üó.—×÷§ß´÷ßT×ã³Ðøq>Ëeû€¢vû¨¶x68û¢ö¾³ÿòìÝoúG¯ É)£ÆgPu™ÑUãðmqëi¶ÿ }ð1j¨v› ÑíR2Ÿi××󧿜_ÿpúæ7ßÿÝ¿3j{ZíxxñóâìíLXw®ÖØÜÓÛa.KÙí›*tÚÛnÿ8?y\ÞzÀ‹[Úäâÿõ¿·»§>\·kËÑñ—éö…Ù¹,.ß8ƒ‡ÀìG×?'Ò½0å(ž²:­o¿nì~Þ;ùÐÜ}qñú7¿ù[©¼U^L.~ºõø»ù£ŸöOÞÍÿ°|ñëÙéW?ÿÿKeñ„N·rÝýúò9Ò=ú|tþõìúç½ÃW;W_¾ý”ŒŽ_.ŸþPÙy¥wNzg–/_;úÚjlå‡{juœÒ+RyatNÜÉ£Ìø²¾û¢±ÿ:ÝÝë>).êõm«µÏæv{/Ó=t:Gã?+Ïž‘v],rƒc©8TJSÀa€M97~ÔÚ}×Þë´n{©UæéîQiþ¨0¹j,ŸöžŸ½ùÕÎãï-å®wøvzþ¡{ð¦±óª4¦VvçÇ_Ì/Š*E(Q(‰ÖþÛúöóâüÉôò»í‡?¼þÙß÷ß zÓlÛ½s({è£sé _¶¿QóSÌHºWŸYýüä<Ý=Ì NZÛÏ´ê6°t|qtÚÜyZž^•)—nöŽ¿4»ÅñyyöP*Ίã‹ÚöufxFçæVç°½ÿ´2» ƒÊò±ÝÚ.O'o!ùnÿ°µ{ýÕoÿXš\@¦¾Z<ý±{ö¡ºýÝÛõ‘¦R‚Ž8¯m?Ÿ\~}ôú·Ý£·Ë³·ý¯þÇúîS¨îÞ‹Úòº¾ûòàù¯ž~û÷§_þëÜðÉÖÁ‹‹¯¤ÂX­x\l·OJ³ëÁÙ7{¯ÿúô«¿ïyòäëó·b~«–éŸ]³¹WŸ¼úýþ»^_¹ *[l¦«–griK™}Ìè†zÇŸ“&HÁ¦Õ„E<¼2š{Vkw°ÿê›ßþqzöŽq{ÝÓïš_VϦ~¢u‚2ä~¾û:ÐÊùîAiz±ýä»ý?ŽÎ?ˆ•Þw^}ù«ÿFÊu‹ƒƒáñ»ÁÉWjc_Ÿ<,N9Ý£lï8Ó9ˆó kQß.ÏžP,~ûô»¿~úø듧?UŠCx{mùj~zùÍ£øðÏþX›^_½ÿö÷ÿÊ´iwÀ,€º®,>ïœ|ß=ù&ÓÚ?}üų÷?ÚsÚ,kµm­uj÷.ó£G[O~ç¯RZÍníççO þõÊd3¼‚¼U¦—ŸÿêN_ý” €ŸLzPÝySZ¾0[Ç ÕõââúÝï¾ûÝÚŽœŸ”Oò[OKËWã«@!æ&°y>%ºfu‘éž´v^ô|SÛÿÂ?aÍÎôà­U›$DCʷ˳«Îî‹ÁÁóþþãÙÙPûJ3*£æòesûueþXÌh.ÛËG×_þÕÁ«I£Öؾ +ÈOöξ.ï¼´{gVc÷ùûß¾ýÅßšù&aèÕ½LÿÔjïç&ú§ï«‹Ç{ïÿÛÿùÿ¼5JãýÇß]|õ/çϽûüWÞÿaþä×ze÷åç¿yóí߻ހml¿¨n]7wžÏ¿n}®Õ–OÞýjÿÑW\¶WÝz\ß{™]æF—í½7û/?¸ø!Ó=[zwŽ Ö’"(xRiÉæLLÜAuö°2Øë.®(«nÔ¶Òàpë;ju™œN¿å ò²{ö5%ïvŒÆ’ÉO}\)$ÕÄÒvir +)¥XèÚíáÉëéÅ—ùÙC6?gìA{öäóÿYŸVgæÚ=zŸœk•™^S™>“Uç×Ùî ®µòÐjkZNk·:½2kËÓ7»ï娷ÿ|võõäüÃøÁ³ï†û×ÙÆòÇöÿÓ¿ÿ¿Ÿÿ +´Ýs“ÂøQiëuqþ"Ý=c­ö—ßÿÍßþñß5ÆG|¦×>xß8ø²}ôaxñ‹ñÃ_é xr°¼øº¶õ8L;Q& ±¶ HþdtúŇ?üÀÝng·µx˜òlvª†ËAW4O¼úõÑõÏÔü¨·ó¨:¿`Ü.iuÅÜ–Ó9­n=¯ÍŸâZ%W[ä;‡”Õ€5ÚgJí@ÌŽ²Í=LΆ)EtÅÑÑøôíáË_UvžÒÙŸ´„N%h»¾(•—/;Go¶}wüùïÓý1ÛkyVwÜwüöËë»/ËëîÞËt{Q‹q!g6÷)»IÛÜè”pîäü‹áék½±E™·½(MÔvžuŽÞ7öߪÍCÆjÚ; àÀS»­}9Ó%å¢S[vÞ4÷_:}`×ÀwB®[[í=©ÆmK©l‘V=&äp¹týö7vçp%Æ“Z].L@çp s2#ÂêÅç»»íÇq!Ó\<Ú}ö›îÉ·™þãéÙw­ã÷Zs·½¼~þÃ?p¹Aèãovx¿ôQÚq†×“Ÿg‡ÃŒÃØÆÖCðP°Rƒ³¯&—ß>ýÍÁ“›ËW¥éc£0|øö×ýý§Q>rPü”Õ¾H÷.j;oÒ½Ám^¾ø®1>e¬¶R‚¬^:½s½¾ïtÏkË—ùöÁòâCLåG‘ƻݔV±Êóöâaoç —é:P#%¡ïÀ;€ ,Ïgåþi¡¹¹¾©ï¾Ò›àU™Ì‘«àh´òÎòáFc‘KB~j4öúGï{Gïà18ü\vutöüë?ðf¦TÞ~•<Á¿óú÷ËÇßU&W¬ÝyóÝß,¼‰y†´ît.ÅØÏJLtbÎô o^,Œ¨‹óëÚÎ+µ¶e³¸VSrƒ\k$”$Ÿ S¡´OÁ¹àѶµê2L¤’u“Lo'ÓÛy¶Hoì•&—nçÀ, {³óý§ßç'ÄâX,N´ÊÂnõ£Ìà +ª– Š³>»jï¿jï¿l¾ª ̬ٵ­ÒèSs•þîÅç}úùß4÷ßµB¯Á”À”qàPØÜf\ˆ“º”é¸=§w`vöÝá)žnðÙÎøì+XM!7(ŽÎ{G_Nß7·ŸXµŸiD9'˜2âLÆòA\ƒ¾mí½íœüÔ_¥{G¨œ5«óæâ™Ó>£3cX#¼‰]ëí=í¼ŒËyT.dÛ'Pê„VJ3¦´‡.d‡FuaÕ·1ßZ¾X>þ±4y retø:78OÊ%·<}üöWùö"ÄXîè²²ý¦öÝìâçN÷—Ÿ“éŽYš<}ûëJï€P*µÙÃååO{{¯K“G‰ ó‹Ý£éÑçйöÁþ³ß ϾË÷/ìÚžÝØóSˆ´ +ª,ß *g7sý“Lçhtônñègr~Éëü𻓩.P©Ä»­<×Ê {O>,¯~–d3µþÁòÑ·bqŠHLth£‚y—‹”Z§•*Êeö®¾3ŽŠ.¢”¼»ž±ó µ²çÇŒŸlâ)¹jÕ×㬕b\”'h)7ÒÝþéãïsÓÓ¸êâf…0¨Rµ‡` ]!"g4¨¡ör£«t f4› .ËY 5ßÒÕòðÐjíi]wtèá¶÷K½ógßo?ü’ËÔi»ZMOÞÏο©n=³ÚÇjm›´šÏúäK*L«[/aE&gN^ýîðù¯åb¯3Þ¿zûËêì<.¼K‡jsGùþyqt Hð!ÓO©…¥ËÙx­Ç?ŒŽ?{uúæŸÏÏ¿+÷Ž};>ùB*NÀjLˆL­ØÕ)3Š3VŒµøtݨNaæVïî ž¬æž +íVœàzà·»û¶Æ!Û—óC˜g„4¹h&8³Ny(Ñ>¬o=mï¼(€ü¶š”Ñè~…kU&Ý4{@ ó´ÂPÌ4уœëIù—é1韸½íí—“ÓJ~‚YZ«f›»IÞII9èúLçT¥Ý:‘Ý1!–øt –ŒöNOM¬æQÿðýòáÏçW?Ô—ÏâB6ˆ+kÅY#%çÁΔ'WåÞ¡UÛÕ™Q9§çôŽ +õ8åì.—îI™AŠs·v=ûðTÎÝ 1\fÕRº²p{„\cššéüwÿëÿµ{ú2äÑu;p„«lÿaeò¬2yâý±Dʃó2;>D„ÄR¥´²íª¥Q¦6;~ôUeyWl&Ssº;V{)W`Ez0Iœw‹íÃtÓã2ÒªAÎ1KéUÀCg¹8‚¤=xñ³Æò¡ÙÞæ +CÒiÒVÅ(k‹+½ +*cÀ5Íù…Y›¢jÁOB~bŸ<É÷NÉÕkËêâÅìü«ÁñëÚüܨÏP53Ù¿¼|ÿK¥Ø[I\v¦Öíæ‘QòNÿ&Ä"HÖÊôZ)õ’Œj:­½g BvŸ|?½øÐ;xá´¶ íåó÷?^½ÿÐ)»«”w@àe»§Š;ÆÅb +Q¯0fD•‚Zß«{jý°²xÝØyG¥;aZ·«COR¶“„n•ò’;3ÉéáB!¡"KÉY1Ó±ëÛJq +ê Ziý.5ÊØåéƒÒÖ#gpʹ]0M)©®Ìº;/¸t3€JA ÄÆЪïeÏrïW`0…1õéÕ&"ŠÙN¦½×Þ{scœ^‚Ë$Ì¢•¡=û'&çß ÞW¦yw’”ªP9B¦gtLpàà׶žü|pò!Û;‡bÞD\/ñùžïÈ…¡]Ý)õÏ+ƒK#7­ÿ—¤÷ðrÛ:×~ÿ‰ïœ«Ž¦²÷H  öÞË° §÷i4£‘FõjɲeY.qÇÝŽÓ|llj;qOâ8N=9ç|ß=ç®u×½›ºkqÍQÜxß÷y~ÀÞï–1ob@ (íf°»dXmñ jÐ1#áäV7¯#å!ätG@ö¡þ<æ+ôï|‘òˆ‘ãÎΠlñeV—Î r6äO6“Ý•ìÔj¸1®÷2ݹÖú‰‰ÍÝââ&™ +˜ò%[ p³±6ÌÄF-„f”@ )o´Â%k”œsGó¡bûè…‡šk§¤JòGBÒŸª¦º‹Þò„¯Ds_¬2j€a&ì`"*'ŒßÙ¦33&J1©ÜeRU&YrŠq;ñ2›Êfg¥ÖŒÕ/Û˜0%×m`М̅Qm§€µb—îláBÔN2˜?LÇKN"¤„'V@Ť/U-O-7V6étÅèèH“wmT\ec÷˜ŽY´vZÊMÒÀä$XØ3±¼äIöÐPÍÊ&.[‰ÏTñ`L…z4.R±æ:ĤƌäÀ¨Ùâ`0w£#V\Ð:X%Äp¬ž¤„ÃJŠ³›Úë»L²<`0ë.(1aóÄ*m‡TШ7»D%]wWxñ@Õn²³\|‚r³›;«;ájÏƆ‡­¸žðQ±*"åÕëô†Â•yËŸ!mÀD;“K·O–gÎ3ÑÆ(ˆ ˜E¹x Óhà d°ä–Š ¯£ÍÅèø"—¨ˆÙv0?*.ù““#Zì[ûÕ÷ ™`&î“ëZ ¹oP;0fÓXX*PJT–åÂ"âÍè]ƒj§ÅÀ™{”Ö=JËö¥â1³ˆ±Yµ•õ„ÊT +4º 3k;GN_»pëñOüàñ—ßxóí_~òùÿúÿüâëüä½ONÝûxvâ0.úKÔn˜’£©ñT~zåçÜzæµîÚI2˜2¼¢ —?)S5JÓ…ro¡³ºÝXÚÈOÌÔæW›Ë[³[go>úì¯>úôÓßýñ…ŸþâØ¥[åÞš˜jêìŒÎÆöÌßùõ‡ŸýáåŸýòè…û›³Çâ¥iÌ—vQïäÔvñÆpÚûÔ6ÆNÊbº—l­ó1?¾zêʃßùæS?<}óÎ…ŸÞ½÷á«·/>ôôËo}ðð³/Ÿ½~{åô ,Ö9­Ý Ó!:\õ'&ÜBIJ·¹p!˜lf› 3g“3«ÇÏ9síÄ¥›?xõ'¿ÿæøó?¾þóß?þâ«žx!V˜8¨†i\62îOÉù¥™Óc&'CúÓ›6aA3Ê;é0ÂDÂéÆüáÝÍó7Wvïݽþð}=·tìbiz'ÝÞ øÌ€ +ùÎá‘Êõ©éÅ£GŽÙ=wé¡GŸxåõŸ|ôñ—Ÿÿþ¿þäóO>ûÝüó?¾øê›Wòî§_šÞ8_7àa " +á +H„£éR­³xäÔÑ“—v.Ü{ÿÃO¾òãw_ùù¯žzõ§?÷òoýòýO¿zþ·ßú·_ýãßÿóÅŸ¾ëé×—OÝf,Vž-L¬ÇjÓ¬œfËÝ™¹íÝÝë÷?ðØÓÏ>ýâ+?~ç—ŸüîO?ûðÓ—ÿíý·>øô›¿üãÿþþß?ƒ ÿꛟ¿ÿÛKwžÉ÷Öý‰&(˜‚©ly|ri <æoºt㡧~ðÜ«o<öÂkwžíÙ×ò‹?ùí§Ÿýõ×ÿçÿúïO~÷õÃϼ¼yöf¤0áö0:ÍǺ‘ÊŠÅ%Ya¯OLª ‡·Ï\½ÿÞ‡Ÿº÷{Ï]}ôÙü‹w?üì½ß|ú—¿ÿý/ÿø¯ß|ñõøÓ o¼3»q˜C‚/rrËÅç}©Ž/^/4g'Ž,oí^ºyûæcßä¯ýàõ·~ñÑç~þ‡÷?ýýo¿üêÏýÛýïÿÙú|öå·ÃÅi…Õ=¬Ç@åTZ=„w0qZ*Fó­™µcxøâC~ï…WñÛÏ?øìwo¼ûÁK?{ç“ß}õÙþøþÇŸýéÏýŸÿùŸ/~ÿÕÓ/¿¹yæÞPna‚+¬4c&„X’*O5z«+GÏœ»÷νwž|ñÍŸÿò·ŸÿüW½þί~÷§¿þý?þë³ßõé_üûüǯ>ùâòƒº«Ñê2-7´ýþl؈Åé0Áʼ\JUgŠ­ùR{vak÷â­G¾ÿâë|üùç_}óÚ¿ýòןþî¿þÏó÷>óêOî½óøîå[\¤ŽûKÁ×›Ó3 GŽn:}þü¥kWn=ôà›?~óüã7ýë§_|ùáo>|þ•w/\œ\\•ó ²eu…ŒNu‹„'àHÙ\iymóÂÕ[×n=rýö£O|ÿùwßÿèí_}ôÊþ³·ßûæ¯ÿ¾Î^ùÑó¯¾yüâíÅlkÉ#dÄX5Vêȹz(UjO.Ï.­-­®\<þG?úñ~ú³Ÿ½ýÎ'_|ùõßþ NÇñåï~ÿþû—_ý滿¸tëV{qƒOÖ)1C_(]¨·§—?·vìäÚƱ W®½üú›¿ùø“¿øÃ;}öæÛ¿øèÓÿÕWŸùÅ—_~öÉgŸ¾øúON^¼?Ýœs’ƒ yÃU!3Ó1œ R*W¨-®¬ûä›o¾þõÇ?ÿÒKϾôÊâö&R¶»eP¬óüKϾüú_ûÑ/?üÍ?þóÿþ›¿}ðñgoÿâí?óÍ_}ýâ›oÝçÉ\sÙ„‹J3¥2’:;kF D¤«³‰Bkq}óþGŸ|òÅWž~õÇï}ôÉ7ûû7ÿ÷÷>úø“/¾øæ/ùêO_ð›>ûüÓ>üõ­Çß¹p=”­þ¨ÆŽ)M(#å|r>-÷æÖ¯Ü÷ð«oþÛ{~üÖ{¿úò«¯¾ùëß>ûýóùïÿö÷¿ƒ÷yç—¿xïƒ_}ðÑG>öÔúéëÝK„X8¤AõÏ`óXaZcDœ8WnÍn윻rÿç^ýñó¯¿ùÂko¼÷þ¯ÿùŸÿù»¯ÿüÞ‡¿ýõ‡¿ùøÓOŸ~ñ¥ãg.N/núcDmÍÇÇ +åV¶TO¤sõ €Q ãSóËsç.í^¿uíì¥ÓÇwO$ò)&àu”ÉIZFi@•DmB(+ +±T²X®Œ×Æ[ «ëók«ÝéîÑãëWî=sãæ•S.žº|ýðîùÊä NRBÖ—èRÁ¢ÁN™ ÊŽÑNÌMy|kggVEÉb6µ²<·sêø•WxøþŸýì§~ü»>ýìó/?{òùç6OŸªMNzC1&”utE½œ#½¡Õ#§7N]Ë4&SåF«Õž›:vìÈSO=òÖÛo}òÙ_þá÷o½ûÖk¯¿òÒ‹Ï?ùøíûﻼ²v¤Ð˜â€¢Anˆ +Pÿp ¢0áz«‹¦ùD<º¼°xߕ˯¼ôÒ+o¾ùÊ+?xÿýwþò—?=ûÃïŸÙ=¶¶2_ª7âŪ ÷(M0ì ‚‡ÕÅ[\¼“âQ’‰\©93³¸{bûöŸzú‰½ñÊo>þ諯¿úëßþòá¯ß~â‰GNÛÉ”òVÄmÅÀ +MäÞAÝ!…}Hå€P¿(åƒRz¼;Õ››_ß>qâ̹³.]º|å…çŸýÙ[?é•—ðܳO?õ½—_záæ½×6oDSe‡; uR˜±ÊFäl—“2â † Ëç¯ÜÿäÓ?¸óÈ÷Î_¼öÈ#¿û‹_ýôç?½yïùǸñèíŸÜYXZ¬Ô;r¶•ŸØä¢Í»Ó¡]@— FcD­M––Ö/\¼ôÂ+¯¯ôèOܾsû¹gŸ}罟zæ‡.\]XI*˜ÛpFçäTFB¥‡ŒvÂ⤠Œf¥l(Ó,6gƧW g@p3æÖ9Ý; Î#D‰j ±w@¥Ð8¬0¹f'ãÄýæ‡1àc9!’õII³1BN“EÝ^„ö»ÄŒõQ•´“! !ŒZÐýJ½ÊÛQ¯ÉNZ†“À{c Ïp¼†I’ˆÄ"É\¦Ñé.mîL,®±¸ÍE+LÈ°Ñ©°àZ‡WkgfRe%IÜ+P&d'|8#‚²b0†Éx¡RíÍù¥pHŽTjõl&Ã1>›ÓmF9;!¢lŒK´ÞÄ·õjÍŠE7—öóÑB¶”J¤ÂAQ +Š³óKÕj>ŽV›u)^‰±!˜IXQA¡GGµŽµmHiTÚÆLn#Þ3Aó¹T¾'Ç +Éxö܅ˇldR±z¥’ËÚãÍN³OL¶H `T ïÔ6‚_T¦þJ|„ 1 /¥Â±L(‘'YÁlsR4/E +¾@<ž*ÕS椇a‘ç—˜Wm&ê°~+'O E:X@ ,³Ãífd!VIMùÒ™Æúøâ…êÔŽÇ5[-¼ŸD,'ØRcA@‘b1ÓÙ¡åΨÞõ¿¾;btòÖÙ=à,ã„Od9’ ÉÑH<Ï0> Æ—‡õ'½bÖ*òѺ¶¿xóÇÇÉ`å»t{Õ‡”VPBM“Ž¹ü™x¡7·u]ƒøÞ¢Þ$îÏ#a§dÈÑþbÅxâÛ;¬Ý3¤;¨² k`+âC=Qo¨Jñ9wx"ýž$f|Ô„]¢ c’6\ÒA*›Këd¬gÇ8=Dª­$ÄÆ!KJE˜ÕC¸ƒ²bŒÓ#BÚäâ6ÊîŽÒÂßÔìWX€×5¡þ‚RpÐ’ÊF)-„ÁÉŽSY0È%x9€ÉÇ|)+Î3˜Ë'íÕ ›ŒBÇlDærl|ÊÁ¤µ¨ÞÁô°V˜5Z»RmVjÌf;Á‰Y‚ :p&‚Z;7j"F@…sT‚bíDرcZXmq+,ŒÂêÕ¡Aä3ã¢ÃŠæÛók'¥hnL©'Óé¤$÷+À;ŒÕ»KTBÿºwt@aƒ\AP»”&Jçôéˆ|_¼eÆCj;*‡ +ó,Àó`Á‰ùv·ÑJÖZkÜ7¨oee²¿‚® VlžˆöéP~ÔH‘õ„Ç™ø¤X\ —WÓ§˜ØÄ°q t,Ó2ÃÜw¨†û-|¬T¯LžÌ´¶!Orÿ°eXa¥»V<¸gÄ2¬ÇUP`EZ¬„rsbrRc ‡vÄg°3 +ƒËèàLˆhëOuë7™d£ƒcÐ¥ù Ê8 6ª-&T€è8æϲ“NO\JtäüÎgP.cq…¬dÄÁ¦ú-C‰° |g@µgXß!át…po +÷eîH¢0¯®ïWØ*Ìjéô¦Ür‹”ê¨?cBüÊVç`.5 ²R[‡uá„Ü›œ¤Â50˜ÁD™ eu9…Å­ƒƒ&<âáÒ¦Å>¤qèín)Þ0!>…™Öà ꌸHòd |wIJ™Õ%€À猘Öîu¸c^¹îðFª¬z‡ß#5èpÍÉ$õXØÁæ”vß ³à¥ÿ΀fÏ!ݘÊj‘R;\A§'jÁZ;£±y¿;hP#:‡ßˆ†ôpütÒI.)Œ¤ êïwÒÓº†û…#\|\ÌvÍ®À€Ê>¤´Ã„4¦†÷ èöX¨ÐaatøHÏŒHƒ'xŒèÐýÃf z4 vúmîëy“³:'Ða6RƒØ„âT:×À°å‚°`º´Œ¸Ãƒc@WÈ¿¨E5äWÛ9ˆÍx"]2Ô4 ¢ HI¶Ž² vO„ÊÎ (í´/]î· âžCz»'3)‚K{Å"xfXƒÜs@«Ñ#­ÉcÔ»ž¸™”lÚnI…U‚¯Œj]c`ÐP~H³˜,LÇ]ýé¦ ÜÁýÅ}#v#êwù£Nô 5»ïv-QrÝŸœÈt6ƒ…i„‹ãBõçèȸ'Òvøò:<¬†ƒlPƒ€ë¯ñu8ɨŠšq‰äó”TÛ¯„5ÂÙè¨;Ö†ü¹1ˆ5 œ/wOàÁò H(Øg%D+Ño1¢Zmó!raýT}æ¨Öá6!^Þ¨7³YW B›àŸ.&ê —@àí1èQ3Öç)W°æKÏÒ‘DÅ™©h¡¾C´•Ú‰ÁœLʈ +L•æœlbÄH ªàüБ´NKtõ¨ψÉsJT™pÅ’zœt ª.¤û°!Œ³•ˆèñ€³¸Íži‡ +3¨?«¼ÛfÄ€JàíîÌÄæþ¢—¯€ÐÉïìSîЀoJ‡;.¾bD‚*3;¢ÁMàl €#¥V9¼ +›G¬TÂBÆ-.¹6}"ÙX4“A˜M¢lvÇOö$õ°þj`Ìl„@&ºÇÌž~ƒ"&äW›+Ä[ZXÐ@ îOƒj0fñZ]qB¨0áš/\öE*P‚(YmeL˜4ª­µ+ÀO ª1*ƒ?TC>ÜŸ3“J ¥±1 ,¿; ?¤pšPÑŒ‰ÿ²gôИَùÛ6x†Œì!½ûž1hê6»r®¶tf¿±ÑÎ@•JÌøKëRí0“žÄùjsee÷Aµ{Fí¬ÁµRI<РãócÔ£ÓH Å°)”M9ú=^ú-¯ ¡`w N. +ùR& "\¶³qØŸsǺ|~™Vmn„®‘ ¢lÜ#ÜRÁê– .Aûny°ß¿Å´wÌÊk ÎT ÓýË×@S@‰V±a=¢Aƒ&wÊ鯺„*%–)©j'%>V.}X`¿Š@žˆ.¿\Y=‡zUöa­ÓŠ‡œ ¨ÉÔW´3I¥…D)qyóŠ˜nï5jFˆµ`‚+PtñEƒƒIIe»GÞ¯´hœ£&øU;ðÈ 3!!¾Tsñ4)×úMi€zZÉ°ƒŠ²áZ 9¡µyG”obϨíîÚ; +™ñˆWÄÛ.>C‰-ì;€ÂæÖ8¼tJ±úFeñ<âÙçÍ·ÖâµÃf,8b Á˜pTN28¬ŒZ€csóܼÙ³ù°€J5¹¹•Ÿ>Eˆ%•Ýs0æˆ7¥¶RZ»[¡ï÷iµoÔq`Ì  @ͯ±Ò#:bÄHÒ×^8ïæ3ß: >Ô/&<wºÓw×wK{GíàD¨-äžCš1jèßX è Ö€E‘Ò:Z…‹f&nóeØÌ´S(Ú˜8ªN­\\>ÿ˜É#[©;\ó'¦‰©`f–Šv÷ë]¨;Rïl‘â=C¦ƒËŒö×Wz#íò̹xýˆ˜¨-»‚ÊÉg…™Pm5\_Œ´·‰HÛÎÄ‚±Ú}=Wž=RÒ{õˆßˆK¨¿È§ç ±®¶140Òï+tÐ)ˆÎX=§·ÀÈ&ÖÖ8Ø¥–ýK²»ãvw 岤PŒ– >ÒÓk›ÉuwŠ5ª™™¤µ0JШ©?^ë  ¾<ï`LÂÅ&˜PΈúú ‚ÜaW*‹”bÈ3á¢Íuri”ÏpqÌBñC@:µÂ$PoŠŽ6“S»foz@êœ~0»ðZ˜S;}0“DèéA-òíAÓ^4l °³R¨yÂMB©Qvrà;FaÖFÉz˜·‘a x]©¢±Ñ-Mò©ï 詘r Ì$D…©j«çR kî08!;¬,±qp*Ñ@Áœp¤a#‡Tð˜ž4!!‡;Ið5J×9¥£" ¼QofT‹Œðƒcöþ¢3§à¤sÞø„”›&pÄ€Té÷b…ÅQ=Ù_›ŒJ„XáS=p”/A‹±ƒ}Ô„*AÕu…,xñ¥­tTåäP±hç’:Bb3STúßL¶»“<(Îc\BJw}éä ÛÁŒó*{ЀÁt,][ùý£V h'cî@!Z]ö§'"ùÉÕ“8…,ÌÆZë©Þñôä ¹y8X]ƒù¼Ó+7_xõÝ¥Ýû5°×Š Ÿ'Åš˜]–ËX BKÕxmÝè +é»;…Ç=ñY¡x4Ù=Ëeç „dÁy.R3jyG¬”Í!Ů¾,ë¤* ;«ÎUC€} +\fšN͸äŸö%ç3ÑÂ~ðJ.YˆîÏ¢ÆâUZÜ K©.ÈØ5’N· ¤XW°ê7âõu©¼l¡ÂÈ œ ¹îPŒ’ÔÜrˆ,XörH‡1ÊÓ‘&.Vü©i13k%å½£–ƒ*hÌLRÃJ JΗ0¾ˆúK6:…e"ÜÄ‚U‹;^*€Í“ B5TöGjµÎš÷ªlF‡¤@M>¤ŒYÖåM*ŒØ¨Î‰xB ðúÓ]'Ÿeâ]„/!¾œ7Ò„ÙT¿“¶’ 36b²”VŸ’Qg§îCnFy%8<•éÜߘ#c##c-µî_öŽ±h, L§ß‘Á¨äV"ˆ³Rf߈fÔëaÎÜWR¯…ŠVò¥fíl¢Ãez¸\§b-w¢ãÏÍ’‘pµêÒÅkO—æNPÚtÆÜŸ7ȃóÈDÆiy|ÔLj-䎪!®¿C‡“E|I_¦'•—Ä₃ óžê†YLÌrMvåòr¶½Y›=5³u梌á"u1=ãêwl:cuË\²Ëæ”N߀åS³éÞéÌÔ®?¿àôå\B¤´@†«_ö§ñ°¯5O¬ y:Ñà³­tk™ÏõlŸ_+/]ŠOœBƒ \jâRCùÊãë'®<Êõ†.6lt òƒ™¥pyKÈ‚ÃŽ—â WÕ +(ΘøÜéÚܹÕÓÅšGÁáM,žªMmp—?%×–¢­X÷xiþRë𹶠+—“Á¼•ÆÌgg7§„xࢠ+˜½àgAuýQ ÂÂã|õ›_63i3!xÂ%—X„¹ Âe\bÁi„+ËL´iÁxP[ôvf à$ìƒo¤†u($µÎ¡µ‘vw¨¼79éÏÌÂ|Éé+¸#ÝøøñPiìþ1»…Œxr@J6 +XåÂå©`” P1@,éú]¿|@Ý &…Âm)ÌÔ¿ìÕ8‡TÀ¶*©8Ì—CØ4Æåî˜Ê 4šUq`×…ûG^’J‹ÁÒbmòÄÉ«ÏxcMÄŸ‘ëGøÜ%ç;ÇK½pm}ÌéÔÂ0“”PŠ/‚D臓Þå2riÖî‰€ï ”ˆŽ5¹TO(/щ F*Õºǯ?§A|„X––cáòR´y$Ò8ìËÌqÁ-æ}ñæ€>£ `W ,ä›ë×3S§ú-pÍDGt˜0j£¸™ »BÍ`ec|å:Ÿìø’íPyÎJ‡éVJò&Z•³Ço<³vþ±üÌIL̇ãåÙËîh}ÀD×'fƒ…y\jIÅ¥Òä†[Êi|¸z”KÎ:Ù¬.Ðô»Õyã•ÅTs}ÔDì6«ì^àÜr  +ý=€’MŸ«Å9.ÑÌÏœ¨,ÎLnÆZGü¹9TÌ£lä‘gºqî–™ éQ.5éœ +wËQ“xÅbcijýêw‡lzX$ä¶Ø8šœ;—™¿È•V´d„ •n?ýãéõóÃÀPÁ¼7Ù‹wv¦¶ïd&Nkþ@ν4ð‰T:x4П.è `‚ÎJ:)ÉÉÄ´2‰n¤µ•šÚ­¹|ó! A ~öŽ@…ö&i+­L¿Å%Àgã+Ù©s€Öë øU—2"~••~LKfwé¨xiTÜü†pÉŒœ+˜”—•f •>°°³üˆÑ¥tpà¤[=a”Ïò™éXcü¨0:¾%Õ7üùÅLç¨iýv¸FÂŽó”1b¼ÆÉ©!^aáF´ ÿ•¯ÏŸ¼òx0;\–\=2¿óèί×î'cS:6l"Q&.,Žõç f—$Ríðügb]ƒÛ¯t(-+!wg$ÂV:AFš ‚…ª †Ô3Í……c×h¹f§e“Ëg÷¥m¾,­huqnçv079j%®`jbÈ(%7•ýNÈ´ ååt7ßÚ²h%Ÿ‡ù(zâ“ždO,ÏgO¹útnêÄ~ d…Mô(¹yÓ€¡iˆ±~.ú[‡t +CE{þÜš'Ú£££&Àq'5 ~3œ*,«i!"l´m!¢ ä¤Â‚÷ [ô:šïQþÔ!Ý·öŒj]N¡Æ×¥u±¸ +Q)*ÑRÂJû ƒ*ô +;¤Á5vø+Ý ²²8±¼·ÒÎ(úÛCˆx ÜëhÑ.ÈHÝÎ¥ìlš”ÛX¨…ÊÆéìé¿QÀ([~»ª~Ã1˜ÞTiQÊMì5 h'ï+±æFªw"\[ôI¹ÍÝÛ…SZÜ/æg›«÷V¯Ä[Ç˳çŠsçÉÈø!=ÎFš˜/mÆü}/ME!®D…Úrõ°+XÜŠ°³S2° ÀîÚ@ñä 6&MHýÕ‘0ŸÛ—è \’ð'2íµÜÔñÌäv¤¾8¾x¦2s’׸øxª½™noä&Žz’:26ñ¢ãr~aP‡¨ÉæNß3jßjˆ'É$&è(àÊÈî1=Ì6`1Ý Æ<‘&\h¨ê`’I>)Ï•–Ï;ýy3¯¬gZ'ÃùÅúì©FpAeg¼Áü™~@Ç;— á}œ€}EwÀêÛ‰ H`$V +XÇ@v6X\(Lm/Ÿ¾Ý^»Œˆod|íÄ ˆ +ë`ž‰´‚¹YP`¥Â2.4õĘɅвáûf^éÔ#¢TZNNloƒø2V— ¦ÆU6·Âê¡5½óhgëvqéjròäËï츼´ó°Ã—ܧ´›=Zœ…p‘rå¨\Ý: tìҩ͸£½Å>j¥Çl,ˆpˆ+2ñàNÁ'*ô°å†uývf2âàr®P­±t~éüã:ð¸¤A R¡Š'ÚôÄ»Þì›_±{Ó%Ç‹sˆ7jB}.À þ%–€ët`€¸¥uÏîÀ¨iïˆiP‹¬ïïhc Ž€ØBWPc!\|Ö©òSBq6Ö:Ê&'P>)^考x+|¼Œ ×ùø¤•tvõ„­DP¤ñã\fÒ ÌX÷foêÚ ’`(ž@‚GŒn Äã|1”ŸeäªÍpo$OGA¦tÓS›¥¹S±êR¬0×[9)OClÔŸì†k‡q`›³sReÝŸ1»4Én±äògFM¤ +°¡‰ê›DDé€;Ä›·÷ùBØ«0|gHc€9.ڤ磵ÍÆú \c‚…ɵKÞô$¨*m¸»¸aÒ|¼o¬ è‰! NøJ®@iÌâÞ£°îUX•6çsÞXÇBHF˜áã5'ÕØpz¯#DPŠsícvtN8Ølû(âMë!Na¤þï³*Œ.˜–U²?ƒ:›ñÆ»d¸NÇZ¨P‚ålç(ê9ËŽ¯¦ÚGÀ3VoF‹µ(Oˆ_rF(®)¬„]žpßšç’Àl,‘RCi ìu(Œd¾¶Ðèî·‰Ó"Z$à’jbe5ÖÚU}¿Âá WålkDÂA`ñBL¤îO¶I!øBmì_]Ñ‹ÏáBö&|Én°².”Ö2½3Ry‰·t¸Ðw¶µ |,¨uý&„ ¶Bqè1±ÀÛ÷î¾ ƒýfõìNÚð0LÈb¸<>{ÜÎFàe¦¶Î<¾pîÉÌÜ9wj +|'¦»Ó­Ù]·TÑ8Y5ÄÜ%â° ‘ª ç5VœÓž@‹¸G2©²t8&¥…3âÖ~«m+më_¡­»øþí3£+€û™ÖRmv£½z¦{ôjïÈåÙc7ªó§¥úº•‰&KÓý §\L3„w‡š¨¿êwmdf3 +L²Ùää-ý­ÓâVWD±F§Oi"]Þ4‰¸…ŒÙŸ±À0¤\¡*©¥ëK«'nRR l_—û;Δ…Ô4G½Y•• DkÉò¼ÂHì6+Ì´•H± +2óçÓàäJ¾½®0£†þ•`~1ÛÛ)Ìœì¹!æAîçÇ—'VÏ+Ì£ÓoA`”T&Â{16²)^uñiiznNªÊË©Ùsõû„TwráÄ«oýÖïŽZ|ˆ¿æMÎG««GÎ?±zîIRîìsÚ]!’/€\Òp·D€äÜR‡ö<Á20ç£X8 S +«gÀ”™6y56žŒ»„¬ÒJˆV€xÐ! $4vÅ Þ ÔÁf‰PVü©n¤ºäÏO +³rsÛ›'£ãD¨”ßè­ßGGcVF Lxc3€X N¢bè\ÃFRañ˜œ‚òA˜ÀGŠùÎ2«§ê÷.„*sáꢿ¸ˆ†Æmt’—§—N·—®Z)yЀj “NBáҔПkMñéh~"ƒý‹ê¨ˆø*Ô3§°±à *Ìä˜Ñr(ï°ïwÂÇ‚N.á +æ©P)]_¼ýÔÏüèו¹.1ÈMñ¹™ÜÄv¢¾ZimMo3R–•òt¨âVhyÜÉä”îÀ˜sßHÿ-µÅ3¬uíµí6 kœc:Àõ!¯Ü(v6ÇNXI0S"•Pi9\^£å«R{-QYÐÃ~¶ƒêMFÀ€y$Ûç'Ù†TNø&aÆ„ Ôy3ÊãÞmè!¯€„Ÿîyúsêòx ìâRÅÖZeâ(pˆÁtÄNH:mA|ÀúZP Ñ@<¡A…ÅŠúíTØ%ÜÑ&“è€÷±»rªº±sØu,P“Ë[‘Ê&iI© >ÑØô€sû3ñü°¸ûFÍJ‹×ìJ’Á‰æâÍúò RªÒ`$ŸáBÍý­ÍwƬƒFZã:é¬?9a£#&RÐ8˜=ƒzð8¤…F(Íè#¤Z ¸âÏÎ#þ¼Ô_ÝÔ’~O¼v·wbrãæÚÙ'6/?7sìAÔŸÂ})'›4ã!GCzìÀ¨eHií숑t² `‰GÌîQ“[o§*Y ?!¥²í••“÷—ç·õ$Oq,-Ç›Ûbq©?Ï6ÞŸÞohàMÚÁbHž¯5¹r1Û:b¥Ã¸\uNd¦Î€/ÅF­…ÓÉê`v˜I +™)15Eî yHeÿö>µÖì ¶â{‡µ‡Tpÿº=>Saqk¬LÿêÅ}Pm7á"¦€OˆU–½rÄÒ…©#æl`Ôj€XƒÆÃA„†4ðˆÆ¡2‚HJ3td@‹;Aùâ¤W¦øêMð‰ö±‹Ïl\¶ r'È@hz¸¸Œ2q;Ρž ÊæªçðÄ€á!|EWðÅ& O\aÀI_$ Ãù—@æ´6ï Ö"#F\Ó/•Þ…uÔ€£bB|€h@rÁþŒÛéÊ@êɵUFÎÏn^n.MÖW‹›õ¥³ÅÙSBaó§å|Ï*hìn+Æ«¬n c:Øá’\\š WK7Á7UCƒx“¡ÊÂô±û–Ï}/?±uüüãמö¦ºv&ád3&EˆUj6ÞÚÍÍ]ñf¦q.™i‰Ô×Øx `‹¹ßí–×£a6ܵSñï›î2Ðb_ÅÀ3Þ¼º¿#ªó¦Ã¥#›PNÊt7/]ä‡K'o«‹woƒzëW[k—¨pÁL¼ñNqb+Q]ôEër®Mùc*ê Â0›Ò;¹13ì¢ÊâÕ93&AT œ÷}CƵSc&©@ž•Ûˆ¯Ñ)>Ré.žSM§7ìÏv«ËºGo$ŒvvÈHKù¢éÞÚîm‹'8d@´v¢Å¶âa¥Ám…ÚŸmöŽöV.ì2îЀÀp¸cl¢G«àTQK”f'VÎ^6ƒ"æM9˜ÌÄì¸à —a66¢ƒ1wߣª,„ÊLêíÞQ-Š˜ÑÉ™aßÀ¨Þ3˜7ª±ºA¤ÅJ“­e€*§……dó¨T(KçúÖΩÝ*“Ç„…\ÁÂ&© ̈OogLý{”aÔFtT *!ÄÂØèw¨¾³ìÛûÆö j‡´°Áé£ù 8¤tuVLŒ« ¨‡OéÊgI¹Á¥§Å¥Lo7Ý:ÒX}õ§În^ÌhH*ÎòÙ)@©L|ÊáKë`§#Ýù3&"tpT?¤4¨Mˆ²¿» Œ,|è¾’q¾À&Û©ÖJ¡w4Q™9uñֱ˳ñ:ìÏ +bn15¾ÝZ»Y™»Pš:ÅD[R¢½pôLhPÚD†-ý~b9Zn“Ò¸ *l —†m¾›oŸ4¸gñé9.9Mú³‹‡/»ëT¨À¥úí\’êÂåÙ­[ëWžKv63Íååë\zš6èPåÒöþVìi„Í;rmĈê`Ÿ —Üb‹ OÀ·ºÂJ0æ΀˛Ñãûv`2-Dˆ²¨!¾kÂh {c`¬Ld” +7š ç*½cÉÒl¢< 1a÷GªÚþ(~STÛ8ƒC@ÈH¦¼P?¼oØbpÐ̧îû“("”á@Ñ»µÞ&¨“²¸h™•+”ÐßË–+NoÊIE’…^ª<«0"czÄàà„„ÒàðŽiQ¥ååb(ÙÐZœ{ë³Û×fŽ?Àeç¾¢™ŒM,žþáïES¥‰îe’T J‰M—PÓõ7õpy„|qêo¨Œ§1 ¢1'gCüÞ@ÊéšàΦ‡4È¿‚è±)ÍÐ[Y+":ÝQ1ÑÚ½ö¸ÊFÙiå3d¤Á妥ʲ\šîÎl\ä¥|ç0ÀáLëhnr'›ñ&&Q¡¦î[O@*^¼ù’+TþÖá}Cj‰ÃZLivƒÂîb£åêÔêÎuw¸Ê,ä11ëK5¥âd¶·k.8¸X ;m¡Bu ÑDåsŒ\#…2ë¤êK””25€9ZX4⢙”7j¡o–’&2b£ÃVvRؽBöDZˆ/GøÒÓËçŠuZ.û³SñÖV~z·½zeéÄå…S|n²1sì‘ßñÄZ"„ EB,cÉÆ&ïîÊÝt ^ºy¤¿gÊݶÀº»AÕ6LgpiÈ@Œ1  ÆúwŸûÛd×€ÁNw{ÂÊŸ¬vŽDòs©B{½h )¹•›9®fb-1âÈ>Q³¹Ã& Œ ¨ÏþD¯ßÅì’ÚB‚2¢±j3ž1Á~…žÐÜ]¹f'‚!ç æøT«¶|¾{øZïð½3GoÌn]¯´æaR´ BǬ(opô÷lrx’VP£ÜQt< +>H.« ˜Åáw`’ÆHØÑ(_z 1¢q"L†OÌêqP€Ý?鬬ÚâuxRtxœøHÍFyìî ðùBaª:jzëÚôÖ}¥åó: Jneî4ªB\ÚÉeìLá²8ä Xé­kQî»”jƒË‹Z§¶ºµv·¼{¶6}ôœÓ׺D¾0OÇÇ…üTjj;8¾KT ½¾}­·vΈ¬®ÊåùÔtmúd{ᬘ™&/»>öB¦sì_÷kG ¨æŒ.9œÈŒo±± ÂO­_öÆÇ÷(lCF—Á¶¸c€Ô Ù^²23¹´ÓX8i „”ó§[\¼F†ò‰ÆÒÂñûV/< …PiA®¯;}y“+dêã +ëqDZ¸0/çu·_iGÀyŒvîn´ÓÃÁC:êPsnŸÊ¬´v*äMö¥•Hc#Ú8j&d9Õ¹vû…¥S·@3Ñ*ŸŸä²=6ÞuÛŒ ˜ó¥\û8æ+ ÝõíZ+ 0aߨÝNÆ£®vŸ¼ü(Ú¿8&ºå&nšÜI*<®¬u6nr‰fszkûâc¹Î†ÖÁëAÆaáþUdöôï÷4>­ƒQ‚³Ð\i÷ˆˆ71¨¦Æ«GºWNß™?ýÐÔ±l¢­E˜/¯­ä&Ž9éˆG*BL +h± +L¥Ñ£±0eƒ}ñÜ´Wª|g¿zPa7Ø…Ô[a&D€o‘êb¿•Mt«ýF ˜ ñ­l]‰g”VH˜ ZÈx€À–ó“ÇÎß.OX„piovF¨¬¦Oo\xr÷Á×k÷Al&_]Ù¾Šû Æ"¥•üôÅÊÂõøøio¼ õoìÜ—¨®P£Ã@aÍn ë kq1ÞÞ¶»cùúbµ·^é ã˜XrIU¹8„#ÙÞÒ]`#¹ž'XÔ“*¤OåÞœ[nq± =Ì+̤[*ÅÇûšŽ°IØ›Di3`C¥xeÎ-fK3; §Nv·B¥9"X°‘!„‰œYÚ¹ÿÚc¯/œvÐI62qyƒÓÛÈþ ¥óà¨cHCúâcfâ_ö)* Q®1Ó&4„úK#X•*àÝ &º[½ã·Ï=U˜?ï c©æzïðµ O4fŽo^|´¾|&X™).œNLïò•5z¦·|iãìcµù]@m\r2ÖX——Ýñi‹;9¬Ãö(ì*l'ƒZ@! +òD0!O‹|~JÌOν¼qéÑ@¡iÌç¦÷ÛUV“­“¥™KruÍDˆ¢[„g“STt’IÎáRÓA§Œ˜ °Q&îðåt€°˜,䃖V|öÄ’[p@ñÊÅøL/?y²ºp¸8ÿ¤)ö6€…u°a±8×X¾´z汩í[by‰×ì´€srka×ÊZ=,!| Æ%w$^˜äcuÐC>Ôߜň…Œ˜$¤{ñêБ}Ãf‡;‡ +•=¡b¼¾ØX>'U–¬TxnáøåžæÂy‡;œëžLwNF+ë\|Zig† ˜¶wÈ5Võ7™ @LšŽv¤ÒJª»knbLôäù[GOß ÞˆŠ€DªK—\zfñÜÓ|iÕˆ‡ Bxô™×¦WO+!î VC~&6È-£¾â€6Á¾Bûp´¾6¤w‘€•@#‚e>3ãKM’|jûâ3÷}Ÿ·Ì¸Hö/Å÷¢•åÞúÅÍËO§w1¾Œx3©¡Øýc–oPí27Þ +fRï4l(ÕS™èa5tÓBDû[ŽBŒÍØ]AŒKx¢xópª½*ŒTÈw· +Ó'ªó;kǯ»õ\¶»Îeº+»lßx±wì! o¿Ñ\¹JGš‰üìÜæ}þTkÌNë +]Þ(à\µ…²a¼­–ó÷§´ÔR*ɵxw«±|¡²¸Ë&jÝÕÓ…ÙPcMj¬{33®p½?«9ÖÊåÍöônÉîO™½Y@0Bí¨™¯¨1ÙæÍâá:ŸŸsø2X¨Œ…N¾ì+ˆ¿€p=̶ebNF¶3A¹²<¾~£yøFaölª³®‚úV’É­«þܤŸn¾ju':n¹ +ˆub锕ð«lîPq‰up_ÖiXðÖÎÀ´ì6€SºgÐ2 têaŸ‹OŪ«LdÜ€ˆj³'kX]¼Ê‚ê üöåï¿ôXkùœœŸfÂe=ä¶ã~ Sýè´¨ÊBÁl[é46¦£®»åqw¤òE!V=w㱓—sqi‡'Q™½˜™8%WÅtЕŒ)L”ÞIç[› k©a;à”@ã2°[¶àÒÞa«Æ䪌/=ôÔOFÔðþa‹Âè¶QZn ©™`¢ÓbmjÒ†~{®š+2¾dc1ÛÛÊOne:‡¥â”7ZM7WºG¯tÖOç{ë x +¹)*2îäÒ|´VžØ CåþTßÏ£@%̘3Á^ð»‹K(Í.@+N&âK¶ëKç—Î>1qôzif{bnã'?çê£t¿ùÕt¬½,­Díõkkç¾×\¹˜mÞ½ù¬;ÑÕºB¾Ü\¬},9qfêÄ÷¦v­¬\Ê~öõn=ûsVBü˜Ý§túÍLÊë ‹™úò‰ó÷O½”›Ù)/žÉÍ—ªó¥¹…Ó˧n»÷) †éæêÖ•§vx~îÄ…™Ý@nús;Ii\‹ ++e!Â&BU‘«l´‰ñ9”á“㥩íæÒ9F®:pý5wgÜ¡zˆµàõ¦¼ñ–Õ%é €i´òk¬ŒÊL¬͵æòÙüä6Ÿ¼i¥•öŠ!>Q2Ágî8Êd½á:Ê&t0çè/=ÀÇ ¤Éɱï?dÞ7hÓv\p¸8—žÏA½ÖBð{†Œûö!#¡°¸Õ&‚ð'nÉá ‰…Ù`q‰ôJ`‡‹ùÞfl|ךp‹9!^—ËÓ®€ŒqFÎSÁ|¨´©¬§ur †é`Õ-5Ȩ_P°ÓÕÚhcƒ* b O˜’ +üLjüpcngri{ëüÍñ…ílçÈì‰;Gn.ï>:}ôÞd}‰‹”øx#]];yÝ›l ¹™Êü™îú%‘Ú’?ÝöDK‘lûÔåGŽ^¼c"þÔ4ë +ùÅ©í;½í;±êRsbí…×ßÞ¾ö°/ÝŽÖÝ.Ïߺúøß}úÇý$½gw$ו¦û#îš™n5m|zÞû “‘Þ{ƒL ‘ð( ¼eU±XU4E²HQô”¡‘È5ÝRËÛî‘Ô­™éžQ÷Ø»Ö;ë~½'5kÅ•ˆ8gïw?/"Ï>¯~üÃs×^ýð[õÂ[ßV«jeCȯÙÍÃööýÝ[->Ž«uJÎ×ÁàF.XY„¤(ç„Ø4—_¯¬ÝUŠãkW—v(µÄÙ]©°L§:&I£U^Úºö®ç»,¦Z˜Ñ,¯Vן—Š»a¦ÈŸK¯PvÏãY-¡lP[½pâO›³èÓ&.Ò­}B-{P–KÍ­çóËÙtŸNv£âÇ&]h‚¤â…ˆMàJ–ÐËd¢Ì%¸Z¥øµ'ÕØÂH&T[ ÒPMôFQÀÔ³VÝ‹'<¨ŒH9.»’l'Í.*H!MŠiˆux«áŠSnáÒB²«5àRFúâÚ3ÓQ¥1Ê0!,1ë#€O¾æ& þwÚ‹Ÿ\DNû(¢‡éädÇ1#e:éÎnˆJZéªYZÂÕ¬šë‰Ùeà’¤ôÀ*¯•1&Y´jsÉ2ÄY|ª/Ö€7œƒ‰%=½’È-ÏïfØêGÄÅ0{r.üô?0a4AÈåa€"‚i¥ÒÒá:p¾—_Êöwp-­dš­FyèT‡fi€)yˆ±8³)X-%Ý…ù”][Ëvwi³WÊaT:›µJŠSsª+J®ë‚E§¹£GRvØ\»Z^Ú·2µVgåÎÃ7:›G‚]i¯?º÷ÖÕGïßzü­ë¯}tå•w·o¼Ôß:ºyÿµý¯µÇWž{»±óBk÷áðàa{ã†Ó:ãœDªõÜ럶·o>»ˆLù𸜧í®Ñ:_X¹ŽÊ9ZNßí#Á¬¹aÕGÙriìt†‡Ö®¾Sß}0æàâ½o|\E…•ìBjÖÚ••›×ßË-_ Sæå;¯z{3aØ깈¤Ò°X).]ˆÎ[Íæà°·{j¦·O˜õ íàz•N¶Òýƒ¸^qC,o•OjÌEÔ!!˧:õ[W·²z¤¹”8œ÷OG¸#@”x†î>®–H9›È/ÇÉ®ñ¹5X*‡à©@œY«ïT`”l_/­z DÈB”; úL•JÚ™ 0Àq8<±?åB§}ä40n3ѧ¦#“u.ôéyă›\zI*Ž…üKõ»ã‚4AËÀ¼5"´Ž©…DyÃj}ÒjÐZÎÌ·ùTËðrºŸYºätŽ³ý‹˜Rö§’³ž¸bTµdÝ"OÎOÌϸQà…ã\f²8Ÿ+ööc|’Tór¦“êíqÙ%Â(ƒ1ÉôÎ#br1Œ5ÀÔºY;k6ÎMz^‘("bªWK@f˜‰Š9Áik@(ŒÈúÅ;íEã¬í± a2L& Rd+™ª¤Š=JI‰‰\©½Zíû«Ve‰sjB¾kÔǹÞF{û0C­•s‡÷ÞiŸ½FR0*(g‡11‘Ét}ýÜTkxUÉY2óc%3`¬Nˆ2ý1Œ“ԭëQÊBÕ¦\ØÌöÎ^_|¥·÷¼Z1’s÷þãþúßÏ߇ՊÑ<°—®U÷_»øÒ·×/¼˜ïn*Nñ•·?^?ÿp!&ölzÕl—Wož½õ‘YÝ0Ò»/xáÁ‡3aVÜ 1õÆ`ÿáÁ½ö|,—7 ­­Þþn¦½ë$O\9׿´zéñÅ?ilÜ3£ã[o%«›OÍDž‰Ìø™0™FÅ’SÝìnߦ•Âå›/¿ÿãrÖZ\~ƒÍŒÅÂÖêå¯íÜùf¦{)Œ™×^x÷êÃ÷´üó“î8È,$G©4¡wN,’S.l÷ÜË·^õBâŸ?»øçÏ,üë']OLE<(`žÍ šìWZ…±Û˜Z>7DO63ÂÄ<0Y1R—’Õ*0âÓ|f`Ôw+Ë÷ÄÂJ˜PÊšœ_ñà“eVóaÚO¹"<ÆY¬’ Ä(—ÂhÙ@æƒD˜KE„œw²Ä/á².ˆãͪQYͯ^]zµwø ´qG«îÍ…© ÂóV-P–´ÓŸ °¾˜ŒKE»º‰HÅa¹¸%/"xP}&Ä{QÍ‹ÈÀ‰pjTv?$XÕ ò¬ZÂØ”’c¸–H·¬âÂsfMLɲÉZmíâèè^wû†œîùž’[ŠN°ÐaõÎ9QLÁh=Î !ú” ñþéF0.G 5Œi@h)‹1Bž˜sB*DÉD”6â‚€[fºUënÚ[ˆÈÓjJJ¤# +âB”?ã%1Gk帎ºæýQ†ÒZnHZÝ…˜¢—6ŒÚ¶˜ê5Æ—{{·Ó½}ˆ6²ÅöÖÑ»4‚hÇ,õÒHLw)£¤,JÁ¸JMúz%O»PwLŽ²99³ª79³ )^IækÃÚp|@kî©õ½ìÊÜðŠYYÊðiåGÛWVöoî((¨f'†eÔò¼ŸÕT/ß}øÞ ¯}è†Ä§fbS~~>nÇ”ºQß7*[R"ÿÖ׿¸ûèý9þôTh>Èø·ZÊ;@„¸ƒÁYF¶%t 0ï(¹>`¿ÊòQ¶½ ñ#&ë²Íu7,PJÔãbRˆ^ðÁ³®P ŒÐœèGüÑ8&¦þynÒÁ{W*(kt‡{‡ÏkÅeÚ®«ÅU¥¸f‹ž§4ZJyB¤7ÌÄ¡BÈË©>ðeÀ° LšWËœœ/76º×½¸¢Œ0eø i!@Mî™5’ååùŒðÔb|Ú‡ñü…˜‰ IÀ’Z6ˆ‹J¦“éìi¥M!5,.jùQ×*lcÝ€  jt\p2B•h­niÑÕ”lÕg}€$E×Ä…É>Ā،?ž$ÌOȤ ó9)½¤:„M ò@B|òí)ÀgäAªŵBï²VØŠQVb¼A "Q\šYŒHzÙÊ "¨‚ÄP\…(Ü’/ÆþT39¨()ïfᜠá²?‚y0 +Ø7_s{P4†ËmÃl2€*ó€îŒ;OòN/@aDqé ˜/L Çxw€ ÁBmù§|*Î&c¤#M„±Až™ŸžñÍ»aS§æÃS 1LŽa 5YQ¬'ç¢h˜Á?{fñ©©À³Ó¡3“e°ñ9JI&°Q\œvÇž8íÅ¥k6$0ù>kÖçü˜;Lœ^Œ>qr΄øäC8œKäëËV±/X•®x"ج7â +Q jÅe;ÛË-;é‰O-†§æügæýPœ"(Q6³§©©"¦¦\1†“ÕÖjºÐÿÔmKv8ñ ‘˜r£î0íqŒœå./øãî æAPcüœ—ˆÄ5Õ,jËéÚ NI’™¹ìŽ +àÄ"€€|òtàÌ€&öÌ÷\˜÷ãIL©qVWJ- v=³¢šî®] 0€âh£¡géú¦œZ +`úbˆŒ³&Ê[“oÖA y€‹!ˆ‹Äyw›^,x±8ŒÑ¾(  €+›hrD‚@áà­ÐLi)¹Öì3DXwr°Ó³~o„‰|=o1Á™ñ OMyæݱ¥Ñ¹ã{™˜÷"žŒ°Œà„!ó®~z6AEŒ3ÁP}ŽÀ,Œ²(!@„ˆÁ .O$£¢…r¨¼§ö¡cÜAò‰§çç]ñy72u&pâ¤çÔT`Î ’WÄh‹“3€[ìLùìñí8kÍyPoªâ‹ò('aHœYŒ©É¶ž„`" o”;³}åi׌‡Â2¸Ÿ'OÌÄBŽ+@,ú±7rr&‚3Šˆ$—‚0ݦqÖaôæ³s¡¿8¹øgÏÎ=5åÙÁë9”QTÝÞ»xK²Ë³Ü儆ðT®ÄØÌ,Ù:8¼ýÊ×ÿfÿÕSÏL¹ýŠ’‚–V“yFÐ÷/ÜZÙ»îÙÓ ‘ŵ ‚$Li8¯1R"‘,:•1%ÆŠQ“TÅ9-Š8Åsr:ˆ0þ(c!kNaÁƒÇÝ^/ESj2À˜…(¶†ýQŒ‘ó¬ÞõAª+*œ\ƒGN¾ÀŸ‰óv˜Ö¸Ä€D¨àw‚¡ðÅH.Q°B÷C¼/Ê‚þ•U²¢QšõÇŸ ÌùA¡Q:„…9 îÄLåmÛÏæòÇæ¼Ðs9Õv›úK ç’…ÎŽž[Šd +L+©¡Å9‡Õªia·Ò­d®ã @Ò)F…0Â$|axÑ6R¹ýK7b(;uÆ?üõ ×ÉÓ~ 08cr‚ÊÂHÂB}þÈôœçԌLj¨Š’Ï:ÅBF5¿±Æej”0ßé¹Ðô|,‹¾{òŒï‰§gŸxrÖå£(©Hð™@˜&(U·òF²$èEÒ¡â°ÖôBôÉgž=åž™ º}(Á9Dœ_ŒLÍç܈'HC„%wˆ;qÆ÷ì©EFΤ~rÚ7½[ô“qÚõb×Ý~zjò‡˜IvL§Ýp +Ä“]ðÆ0ŠÅ)œåñ\ƬõÚqž Ä1ÙÊäªm=•‹ó’/Æ¢jÂÊU»Z¶ùä”÷ÔlÐj•Òu‡!2åbfysSÍæÃÈ´öAB©¤¨&’¦“sœ¬½¶¶|û…Ëñé…à©yÿ©YFò ËjšÂ B(UÑqLšÅÝÞyÀƒã1Û–òëÜþúÞÑng{9SÏ(†Ä©j˜ OvûuÅA¦s¢*'^e#‰1¯•@ôì™[Œ€K¤‹µ|gÀê);ßFX=‚²‘8ç á'f~Â厉1:}z>†ÎåƒxÙ.5½ÕuNR€‚Ìz ¦:È&%c¬‘­/óf‘Mq)½À1Â%˜à^ÃÙDá!BÃÅ<ÎY +±‘Jꪞ`xA’%ƒq&I¨ÙÌ.û T‘Al0LFÂÔ@”÷…Ù0,"¸Ž1>¿/àwûý^Qkùä°–ÞY©^=\<·òÒËw·wÇFB‡I)± öaDbz>úož˜~ú´Çå#€†¸\‘X„ 0J“UE–A +GQ?b–ÃiŠÃ$Å 8O³¶¬—|QêĴ牧§ŸzvñôLpjÒã(2»ˆ?u*üÄÉÀ3gBóÌí'ÜÞ˜?™éB¡£)ÊN0˜G©$ɧæ½ÐÓ§çÜ sáPÜïuãXP“àr–_j;+£z©î¤rj£–<Þîܼ¼µ¹Ý«T¬r1i$Až{êÄìì¼7Š‰ «s‡ú’ +2îåJU[ÒYA$Ó 8Ú´ÄRIu퇷¼páέ»ÏÍWr§ç¼§çƒ¡ ä‰ç™'UÑ8¸SNŒ—²­ŠêèH«¨ì,çÞÙÇwÞ¹ù›¿y÷§?ûìÝ÷¬¯•M›¡áR“ÍsQ“b)ǬU­n;Ûnæ +ç$-’å]þ?”E¡R-6—š«›÷^{;×îûx!MÍxzE³Væó'gCO?}"Ž@¶i–JÅL6‰C‘É0RœT­Ï_¾RïõeËïnX¹lÁ=QŒRTL*©Â(¥IŽíäóe3¡eL!£¡»ãÊáÞJ·‘­f”íAþù›»/?øÎk×Ý?óêÁ`а“V,Cˆ7€!¸4#A9-8\«¬7Jú°mÓwÏÕÞ¸³ñÑãóßxíüïñů~òíÇ÷÷wGõzYàÅH F€Ü‘qÆ&3B3eu©’Ös׫Z«ýÜR+¿¹Ú½qeÿâñøöõ×\zé…ç.^¨WëVÒâ8* +NÍø¼!jÆ…<{&8ëBŸ9±ø̉…éYŸß}AžÂS†Ò¨t…¼˜O +9Ëtl+…©§N.€„õøã±P€CC +î.›Ð¹¡ùÂùöÍÃÎÝËÃ÷_ýøÝÛï>ÚÿþÊï¾÷àõÑ¿ý䥯>º²³1pÁ™E·ÏëšÇÂn‡‡zi´— ¯VЋkÖ•ýêùÝ +8®uï^ì=znõµ»£÷nüî_ý÷¿þÆwÞ»òÜA1@Ý^Ïœ;‚’F +P bà`Ã@:ü…åáùò/n¿õüè;K¼´þó/îÿ㯿ñóïÜùÕwnýãOßü_ÿý×ýéÃ×în]Üo§ÓN fÃQVÊ’+Yaµe,'— +Ør…jd©QÇ÷3ëKé+{­·_>úí¯ÿí/~ù½ÞéÁý³»Ë@¢çÝ.O0@„³¾'ž9p-èlÔ ” ëŒGgý­‚›ÿË÷.ÿô»>{ïú×î ?yuão¾yí÷?zãÇŸÜúÑGÿø«7ÿðƒç߻׺{TÝ•S¶–N§%--'ò4͘B¬‘Œ¯Uø[¹×o­¾x¡ñðbí‹®ÿú‡ïüñýÛŸãW_>ü¿ÿàÿûþðû_|üðRû³7þå+o=<—4”EwìÔlØ"qZý± 'v ˜_BçúòFþÒVyh]XK=¸2øü/¾ÿèüûo½öâÛJ`&† †åTº—!vìsÆû·—þòkW>ÿÚåŸ|rÿ?üøÿ÷?ùíÏ>#ðû¿zé¿ùæÇ_»¹³RJ"Íš‘¢\"¡Š +èù>wcÍxå¨ðÇgòÙý/?¸öé›ç~økÿñ‡ÿÇ¿ûæ?ÿæƒß|ïþß}yçW_Ü}åæz!)1, Äå‹DOÈZ^WV²ÌË{Ö[W‹ïÞ¬þúæß~ûÆÿí»øé›ßÿú•ß|qëŸ~òè?xø£üÑá/>½ü½w®í•ËyÇò(B 1tܯmtÓk íÚFòëGóÑÅÏ^ßúäõÝßýè«¿üò¥¿|çâ_½}øÿý'ÿû¿ýôŸ~õîï¾|þ¿þöÝï~pu«ŸD Ïé™Yw ‹ +Ãô RÈÔ5ÿåwo/}w/õò•ú/o~ùÞñ§oìüä³»ÿåï?ÿ»ï?þýßü—ß}ú£o?8Øhô‡ËN¹”¤ål¹•¢wj$8ýƒ;ýŸ|ýo¿¸ûÝ·¿óÖ¹}rçŸóá/>¿÷å;‡?ýäÆþåÛ¿ùìÖgÚü蕽î¯|÷ÍÝãÚ'oœ»{¾u0®UËUÉÈ3JX$àÅ&ÅÊ’É”ˆ·ò`à-§®®¥¾v³óý÷/ýâó‡_¾wõ;o~ð`÷µËKŽ›·vŠëÝD%ЃòEHJ,iV“&ùŒ©¦T*«à+eùîAýÓG[?xÿø×_ÜùÛï½ôûï¿þO¿øàgŸÞþù7/ýñ§¯ýËÏßüõ·Ž?©þð¨0(‰(t`Ũ¦²}A´«$ˆš/Û‘#ùÑ¥êãk­o¾¼ý_þ݇üÍû¿ûÁËÿø‹·þåwÿäÛ÷>~¼ÿ΃ÍQ?+k Œ5a2Q(uDŽ3%r£ê¤°a:h±wwò¯]<¼Ð½}¶òÞíá/?»û“Oî}öÚþ×_?¾:¸¸’].):‹P$à* ™©™ŠÔ‰@Ó"6ÛÎþJùl?e£zÿ¸ñúµá·Ö_¿¹~Ø3º‰s={¹ +rK’,`~ZJ‘BZPó¢”,d²9SÉjìZ=u´\:?H>¾ÚýôÕÍ_}zåŸ~öøG߸ñ­‡kß|aøh?õºùðli­,)XƒãÀàHÉ>DÙ‹>4 +X4¨á’†­W¥Ã.wo×yå¸ôÑ +¿ÿÁ£ÿõÇ¿ü§_¾õ›/_ùÖ£KƵN)  ×‹(a„‰„‚H$(SXJãJÛÉJkuóx\¼´Qzþ\ó/žýøñ…7î¬ÝÜkô€_8èóÅ#…¢Û…üf¿r~”yn;óÁ «_¾sþ[/oÿÛßÿÆwß8÷ù£oÝßxçz÷òª¥sQ($YÅË„HÓ¤ ™O¦ëÇfBM Þëè—íë©Ï_ßÿç¿ýæúÍG?ýìÞo_{åÆøÊÙúJ'¥ê +§å§‹°I„5ÂËrz­XOÊlV£J6ŸUèbBèìNFd¸ +¹[ûƒ£•rÃd +ºdIO±B»‚Ì´›<1O-Ï”"â 3lëZ.åS©²c¥Æ¨´Â-Q#c +3±\î‡óaÀq!Y샜ÓíÇÂœc¤\º¼<Ü]î¬TLyµœ¸¶YݬHGŃ¥ÜFEÛ¬ê+ÅÄrÑ*j¼ovÚµ + +.VBhâÄtð/žž›žõFa™¢™¯XRF„{n\–.œÇ7V¾úÜú ‡ýý~Õ¢)!åDQ)®ç‡7P6ì9gN%•eEIR+åR>mdl)c ºLË2'(jœƒ¤8ˆO¹ @\¡Ô<ÌÛ3A‰oK“wyÅt® +GBO—€Ëæ4Åd(ž¦¸@„‰@”òF¨Y6íÁÂT*QÚ2ªÛ¨˜åôÆèÊJJ*3 MÁhµÖz½ÍFcÅHØÀzT%_{zzq.D©t\iÒzCHÔPJŸšvMÏzâø˜­ª)M5R¦^É™ËíÌñzu»—>stream +^NÖzkÓ虹ÐLÅm>»Ê§Vpµ + 9J.Ô–H«9SÂÜdQF”Íx`-Š%ℶ胟™ö‚L„(‡Tkq¡ÄÌnøüSÃíÙ07ç#b”NñVCNµ³’È´1>Àhå0iE™®Õ(½Î51Ýœ¥¤)½¢Ó^T÷c o܈Щ0™tÅÄ0®"œÅêERΰFUÏ ÔtG2ËqŒ#QÔFÉN¹‹$„êŒÑ‹gÃ\n6H>;yr&8"l‘±znH˜ñã3¾IO~”Is¢¯¥K=˜ÖØdy2&BD2HØnD~jfÒþ:„ë´^µ«gQ¥îFL$0MɵÜÊ´w‡y˜MRZ™±Û"é‚T?jPZŒÌB˜ŸöÒ0_rBjH›0“9àÝ~†VNË*U©¸®ÕwÒÝsRadÒ‹1¦­RïòàÒRz¨·¬êžRÚ9UŸZÄž^@<ðdÑпyjîÔL™]­qÎlì éwTyf*ä‹ þ+''›e“ËZqOpV܈1UNºðy?±v8®<; ΩéТŸŒ† W1=3\ôD¡¸Ã&ï³\Qq.Ä/Ädéx0ëÏŸ\‹1¹€É™ÑöÒòQHH#Z9*äH£ÂX )Õ/¯\\Ä$7"Æå<Ÿí‡…87HgH{)ß»¸{ë]«µû¬p¡6^—+‡drK>T[˜,K7‰?½ ’v˜ÉQÖÏŒI³Ã˜`HK.XõbF€0©Â¥–Ô∶Z6%g–œÆ.©•Y£WËD²o´Ï«¹¼É§—­TY½I$Z>T¡ŒÉvZlz€&ša±•JÀ–å˃ý{a.uÚ‡» 9.Wü¸ás\–dÖ+ý#ÚîNz‰°XÉ-ÂXq!fLzâÚLˆš ~D¢µ +ia¡êsÞÇêuL«ù Ü¢¾ æÖÚ°Ö +€ Ç T)ƒ\  :.½ñI“훎«Õ¨X™Ži'\Ì9î{ƃxa)@& ­ÊLƒ“CÄ2®Õyg0ü¸¢óQ¾¤³ˆ•Ê„Vñ ‰™ñ¡ioÜâe2¾xbÊCÄ„¼˜^SË>Ì:ã#b¢µpsI0›X<5}å”Ú… ôF…é¸!Í^XŽ’æœ+d ®p™•^!S+1±üìlL¨M~ì§S^X­ Ï ©>xÞ3A&,ä!¥«"¹‚j5 b~H¬—ìájÍê@ôh{ –¶ÕÝDe{>$RF—¶—‰D\ËC$çã¤óâŽRØ„…â)¤“q½N:"¹×›‹ˆ:Ù5½â +@ÁFÄŸ[G.“Y›}7îPö@+mM‡@X*A2’ü~>½u„p¸Í¥†î˜>ãc&{ȦVÙ‰kí¹5ã#çÃÈ; {OœXüÊIÏ“ ˜‡ÈÐÖŸaZcÞÏ,†yRiRñ¶—L(¤möÁD§ZGNsBDH£zUȯy×+„Ýe@Zm½4Î-r©Î<"v;j“…ä’‹ÎùÅf¯Ð‰†œ¹°^ÊùõìòÍ޹ǥõçýlpˆ“.m^wSÉ€x*&Ô˜ÔØh_0z©dG°*ze7ê”Ý!J-*ÙÓª;Jq ©1·4¾ò¸þá¤mTcŸÉ­GÅ2È÷bgoiÿÞ™0C$êNç|jéFnõ¹äÒ%2½JJaÜÞ}!Ù:pAºVÜèï½Pß¼Uß=bsã0Ÿƒÿ´k-¢€€1€¦µ¶Ô6_L¯<¯6Ž¢l>Ì$nãvë„ŸYˆHˆXåœu.³©”ϳAJ£¬†ZÝŠ;Tf-»r£²ùü¤«Of5·t…N‚À°ˆD•L.ñÙ±°A8«‹èd±›œZjoÜ€…¬ R@\ñ©Ùº@¥V±Ô(¦4]p"UßW2ËÓ1È佘áŠ|~G®’ÎØKdŒÂhë‹Ô8á!O \8ÐÆaïü[¸Þ:¸öê;ŸüЩoôsóˆAØK©ñs•½—skw¸ÜÚ"¢›µm N³!ñÄ"â²>:âÇn] ; !Ù © ÄxiÊÚuÂÏMÇTÔìs…]«{å+SáS ±¦{1Ó·x2He\ˆå%3|v]¯í-DÅÙI÷-#̤#|A­îGØ\ŒËÂr3ûtj”é_«íÞk%5?•.Ý=A•¨n°©m7I»™^”‹cÂlÆM©°åô®:ý«b~Rªsq%È¥øì’ ˆZ#ìáŒcj xit½0<º-åV€ŽÑΪ·éôˆ/®1v³·yutü"—YU œË§–rËW*gò¥-%ÛïŽ_úڹᛶ㉮ݹTÝ®¬ßu:ûaÖ> Tˆ‰?cEÕ¢›vp»[]¾»ÿ(½t‰°{¤Ñʯ¢F+,¨ô(5¸*•vÈäP-oK…ÕgÜÐ| W‹}½<䳓H &9ù¾ýÊÁýÑდ m#®µKÃÛ­³„Ê1¬w0¹týÅOR]OÜÀõf{çùk¯||íÕO»Ç¯0ÙÕáíî‹o~.¦§|€Î³™ÍDërqíÞàÜëéþDÊ×G’µõ©å&,Äè+õ í³¯VÆ7kã”Ù‰ %»¹ïA-jRvŸÎ¬bÖ¨_²}¡¾vøÎê#ÊY&“=ÊîBB…P«+wï½ä1Ìd•Â–RÜà²+ˆÞ†¤jˆÉáZ+7¼~~ÂÃ.Æt>»¬T6Íæ~ªw~¯Ÿµ +«µµ³!î„ GÀ¬åÏÉ!ª›ÒŒŠõS>ÎÈ,]¸ù†h6þÕs§]q€gRa·0¾;¾ò6¨5‹QùðÖÛrvÙ…ênÌ„A€J¨4¨MrélnùÎÚå÷G¯òVsûàvq°O$*¼ÓV +«ÙÞ¹ÂðbatEoî’‰jº¹ ®&3ë µA…¤‰_Kv¥ó ØY­K™•çóÏÛÃ+˜ÙÐÓý•ÃµÊj€µ…ܪÙ<×ݹ·{õñέ÷ªë7ÕüJmpT^>朞Yß-Œ®›ÍÃt÷°»ûüÚ•×ÚJ¹ÐÞ¸ÃeG ncJ9ÌgÀ…âZG,lá‰k7jãK„ÕòQɉ×Èo@±åÂø¹ÖþË &…ÜX­ïµ÷îõŽ_µ–®ÁFo‘Hzp‹KuÞÁ|œ¡¬71knL¯ïQ©%Àœ§¼DŒÏ1v‡´j˜ÓÃÒël~[.ïhåi -ÕØb“-LÍ+Å•ìøšÑÜ5ë;vëÀ®í)è¡\Ú”'³<”ÊZý“ßäì ¹•HÊõÎW¯³ÙU!» + +PåEO¸‰ •Ãômö»¿žœ +&9+͈P†¥Ú" ü”=:|”(ŽÝq-Ȥ@$ø‰$ îŸGµ†TØ°› — ¹0[ÕQ˜68«•j.í=¾œ_¾$æ—©DÃÒøúBL²6“êÙÍãÂÊdï’Ý9Ök;ŒÙJ6¶A„¹Q¢}¬µÏQ }´ºS?h}Q(ŒBœ“\´gë«—¶/¿Ü9{O.ŒX£Þ[½\_µŠ]ÝعúÆÆ•¯öϽÜÞ1=¸ÈY…ƒKv.¾ ,/aÇõíôA $šG\~Qvy|tﵸ@Ѩå [be/½|}íú;³µüÚúñËõíÛq«.×w¨üb-³ù½~!3¸Ž[=R+Ý~«±vs²Ú‘ÉÄÔ¤·P³ KåTã ß=½ÞX¿ÓÚØd[ê%HI6 ”¶¾ug"›œcT×ìÎ^ßN÷Ï«•@b~¬6ˆÒicF=ÑÜ·{—íþµüø…dï +—^èàæãK€ýš®&ìÖvÓ½‹‰êŽ”‚KùÎÖÍÞÖM½Ô~‰I-)ùQª±¹yá•å³w=q³»õíýbuw²àÝfw÷ÒËNyÅK“¯ýÃdkOÉ­™UÔÎÇí3!‰NÔƒ„Y__¹úµÚ¹Wôî³sd´1ke:¨0‰Vcå2®Týq!BÞ¸ óUl˜Öò£ö³óˆ/®“z;@:'=´ 6 ½ë}!·Ì)(úÀhGù\ˆÎxÑD\*NÈC¢²cR‘f­¼!f‡h¢À5R)”RŠ«fc‡²ÚÀÁûkg©Ìò³ €pZ¹Áåìà:F¥Â`r±P^ºÀ˜uLÊG—;÷Àø÷ö_ߓí c—W¯@"@›uZ˜4§kU7ìÆ6nÔb¬­¦Ûz®™j¬ê•5Ýh¢A% +veUL÷ÎIL­‚SüŒéc &³$—¶ÔòŽ^ÞPŠÃ©sFuïÆ×–/½!U¶ÕʶTÅé0zuiã*P€¨PH¯'û7´Æ‘¹t“Éí€(š‹ŠVviëâ‹NsëÉ(Ê'>½{A®lË…µDaTjï>úê'·_ùÆ"žôRiXmó…ÚÎÃåk·»ºux÷µ¾—níΣfÜ^­UÄeWžëœËêûqCÉ/K¹å?u÷ÍXòBo@ŽŒÎ=o”WÛã+Rfˆé Âhû¨ô<¢ÊÈ3Ó½À%»,8²Ã¸V­._nmÜÖÊÛXF¥Rª¾¥–a±@ç7õöy£s¤Öö@ õ¡†MÕMà1§ýäBT@”™YWëÕÚ¢T¢l:?ØïîÝÕä„Z€X­Íó‰Ò¦^sfk>ÄÆ(Õ(#tv6(‚(:åeç"Z˜ÎZÕs™Î52ÑNV7mD¨åŠÊ.È8Ý°Iš}µ´aò˜I« ò΃êÀȃ‘ÇmÒ†„’—r¢œCÕŸŒ'ªFcW­lÊù ÀcÎðl¶\¨ª”׸üÊ"ªEE`—š¨^ºÇ9C¥°¬zˆHäz‡Ù¥c½ºÉf–Q«2a± W¶A•±™(—!Ím¶ÌÒ8YßòËs°ÒJ¾fuBN±v x™dç,ªÕa¥ 0’²—p³½s¤QÔê¹Á…ÆÖ½ÒÚíyXôBÐêS>dZ\ìÝ„#åF ~žö“bz éé áÃu!Ósª«Åöæú¹;fqÙK$¹ôšÝâœ`s€eˆ* 93ª¯ö¶oùɤŸÊˆå}sé–\;dÓ+\v“kÀ°vî¤[Àþ{ÉTLª8­ãîÙ—*«×²»º\ÄËo~Z^ò³E¥¶gt'mÕ“ý Zy+B§Ûãþò×|Û¨drY)ï'»—ŒúY13¬ÖÚÞó›—ÃJ%À¦BR%®w¸Ô7—bR=ÌäôìR}|’‹A®` + ðäÏV˜ZvZ;­­›!ÊÂä"“hÊYð7š«Wa¡40Oq‰fgí&ŸÇÎø8@k…Áu³v¬_ˆ)ª©¥¿µ}üÂÓÓ‘gP‘‹‰DqÇ,nº‰ .³ \Õ npN‘+¨ÕIµ¸ÞJTÏ©¥³jy^àÇÁ¼“vK4#b1,½ t»¶u—É NHD*%µª^Û‚¤bˆN…ÙT\Î[Í=\¯™s#­~Öé_)mÜ[¹ðzvùrˆMaZI.,ÏGÄf…ÀNµ0_‚ä*š¨hCI7I£¶€h!6·€‹ñ`*ାBJüò•ý;”YTLÚ=:3ŽJùdm§³ßG&!> ‚•Ê ëõòX*¬ø&[ïY´ÙæB„ô²’î;;‚Ó>å¥Oz™¹˜æò_Ê€i³êV}£±~µº~]¯mL*”\f’K 1HA„Ë(ÅõêøVgï™Þp£©3~^Ë”ÂÈ'N¨3>j6 ¡ÆeÖùâÖ<$ù1½4¼Ô£“ +I`uíêÙLû¢U?–ÐGf”òn´€Œx0|ÞINa4>z±¸|>Æ&|Û›3µá§Ó>U¡Ô?r*›@i»%6’í£êƽ~Î…9sAAIvËÃ#ňPÆÍ.0kÀª…µüÒE-¿&Ìþørµ»û§NÎRˆq€Ïª¬ßjl=å +@ýÜ1¦³•™I^DŸÊA&M[Þnš¹ÈN:Æséaeí†3À–Ž“­s38g ×A<{0“PËt¢6iÇG:¤Õ%SKÀ$ú)+ÂÙÆ’®˜êÌ…ˆ™læI7 ² hÅÂÌçP*Ñîï¶V/á‚•"¬Õ¢rT+Úìàjm!ÊÓZQ+,󩶜·Ý÷1Å…påÉtcŸÏ ¦C´S#”³Ó±J'WBBy."¢€>î§üÌl €+¬Ý«Žn—Gw¨ÔÚ3nz6"#J}&ȺbòbT +“6  ÞlkÅ ˆ¤Z4ŠË0Ÿ ’š0Â\²ºJ~•K/1÷¡ªU'›{`6 »Ý("Ò€‹h«Ä-B*äÇ\Á‰€…"\~Òï+*.­]ªv¶0Þ&µ‚^8­íÒø²ÓÞŸ‹(À-‚jˆrE\(>3ŸöqˆRUË[ÙþÞéûmÚK‡¨”VÚàœ¥§Î„OÎC^H7 .=²Û—ùÒ9¾LAÞ«¨”ŽK¹—ž¨Zò%7•ᇩ5$è¥5½zSµ¼‹&š>&½ˆY³a.ÆØ~BÕ-Õ¿”^å3«`¢Åì2ªW1µiíæ–ÎhËG™~Æõ}ùèåÍko•6îй±'®ªÕ÷LH±Oí’²£ÑÁýòò‘”T&`Vr!:$À!q­ ~²}>7¾  R™Æº”î@B>Ìæ@PÅÕ:k/ƒ‡ÂuÊÁbÓ›$˜§ï¡œYH ’Vª¾Ã[ígfOÏøf‚0à~*J>&¦"M=Õ„v&ÈàfN¸ü€:?8=,.ÛÓÜÔ‹KDðáÚB<áJr~›KÁ´N…8k(Bþ¤‡\ˆ©A¶„&úfõ Ó¾`ÕvŸ]Ä¢d2Û> b{6Ä.D¥EXU’´‡1¥•J AªÚ?tª^T÷ÄAÙ Qe:ÀâJYÉ füø©EèÿôŽN9ãÁíéØd£-?Òó«D+®ÚÔ{|fM:sJg<Dèr²bÞÉ?éü£ä×'š€i®(‹ +NkõØ*ô&ë%á jSίãj3ÆäN/ 3^Ò,®f:gO{©¹ ?å¡žCAèJÙ±˜ù㉅ ÍLV{˜5çg ½2©)JɇÛa&´ ¤(OàA;*µŠØ£˜Ö‰ˆ%ª +QIwT†˜l\©3™5©rŽN-»0y&L„E[U\ÎÇÅ"e´K…õìÒÅÜò5DoÍGí-$Êë©Î~wçvÿìµ²©Õtÿ\yã_\;¤A¡×Š»¤haHX-Påt¿´|Ù‡™`øÌr¢u1Ù9p Ñš!6ï',˜Kƒ+P)L”ÑUŠ[åÑ\ï"cu½¸1姩ƒC)åœË®é: Sóɇ%@l/Æ$1;N®¤3Ë×Õú‘Ÿ+k#¥»…ÁE!»1lõ­E'‡àôÉîr¤aåû;—^Ž …3aØpH®E…¢\ØRÊ ÎLù¨0•a­%Ti¢JƒuFÀ§ŸòQOÏ@03i›ËføãFˆHj-Êç?=â½°Ô'J+‹ˆÌØ]³q Ö{~|&À=59¹'ä≹XŒu´ÒZnxuûÎÇÝû|zxr>ˆ2ùÎY1Ý‘ ¤r!*†’!“S^bÒG,ÎG5PÁŸšƒAЂ…˜$)¥b¤HÈ®äAáƒsÆKüÅ)ÿŸ=ã™õÒ•"äÂB„šöca*¹!jZ“ЛÔ9½ˆÃ”ÑÆ´:= Y$`ÔPÚå'½2ŒžÝ`ÕOÄÕÈN2ˆZ'Œ®ZÜÖªûtz0)Ï,ĽñD˜NAB6*ægI̱D#Â&ƒˆ;ˆ„q™ÔËÀW:“w4/äWoúØü”Ÿˆ§eùD6Êx¢D~pyåòWS£ËÕ0Æh@<1Õ™ÞÅÍËo/¾“]¹;ü$:ÊîF¸,ˆ=Ü衉%«q^Ên)Ça8£ÎZL)Mv¡ÒS>n>¦ FÇé^sã¸ZJuÎJ…‘—°€²é,ec¥ ìL’ÑóÝÝçA} +¹˜ÞDaLo¡‰Viå’ÓÜq)Ùi§º‡ j3©1fY©QFÓ©m•ç!.…9½´àS-Œ™ä ÄäAi;í!A±Zm8T„.*dVãb6º€bš’[%õú\ócVT(3é±ZݳçbBhi„q +ƒó˜^P©¨P™%À¹!DÂ¥NÍÇH9¯ez¬Y“s£ˆŸ±Ó^Œ–s‚ÑX˜,šÓ¸ä®6¡ÀmOÜ<å&N¹PÆhƥʔ‡’© “ƒ¤É¾cA*5iüî +‹vMÏ@hý_“^øDñ¼´Ò]aiÚÏœX„­ò¨ºr)L¦ž<ÌúAÍÊGIg1ÄZDŸ˜ +,„oL 3ég&ý9/,˜‰Š5HiDÆè3ð}3UkÀ>ä»@|nÓ…ñ|\Ÿ‰(Q®ä‚¤Å(cíTs¿øZfù6j´§'‹¹©@œ KÚnóùUà¤P£bQR cÄ% £Nš €FÀ0R¹–^FŠMv¢ŒéGÕIM/­ö¶n·wî³ù7bB´s>L –œ[c“Ë€aäÒY¸ã¦;³z%Î'§<‘0µîE¬—çs#Ë6ƒŠ§±ã3ž¸WjD„Ü…DûK0·ë[¤Ù\€e29È®\kîÞŸ¼‘ì_BÕ*ð8™ÊØ®­/À:ªuíÖ…îÎó+‡/U7ï(å ¢hN»¿uÓ®®/Bâ\D˜ ¶³ƒñEˆ´g}qÉnåºÇ [£\¨ Ö©6ù¢Er  ÑRµÝt爰úh¢fó3!Ìc\,q” X.™s ¤C“d7]° +"dj‰3ÊYkš¥5Úî÷äG¸T^ŒÊOÏ#.HóÆiÂm\©ÃB%<é)­² œ?jÁ"¢Ípà¢`”@š(Ùe9·êŽ[ÿúY-’žJ‹qÓ…š€.œúŽ`w=ଈ"R^@t¸3í&N»&ûÀ‚î‹gbêW¦#§=¨+ÂHZýDåìðàÕ¥CB¹Ìx6Âi¢5\­ f/n x½‹ÙÁíÉ~CˆÀšeƪÕŠèÝ©xòt@Í~®±܇•#Œ ÀÁ—¯i¥Í¹(=凃”NZÚî„iˆ?¡R­³™•«˜³ +^ÌŠ°ù¸ÚàÈ 1Ó +›àÆ€^r.ÄÀ|–IcBi²ç ó;bqK blfÊ?1íóÆLkÍ…¤ÅˆóÆlcJYH¶x«tÀ×âJà $•0ãÿgï½~dIÓô¾{A}!,w{úœSUYémxï}DFFzïË{s¼í>í¦§wfwvf—»Kì +K"E„IÒ•þýIÒgHŠ$$@T Î×Ùuª²Ò|æ}Ÿ÷÷DDåwÛ9üvtþ³;}‰¹­Ja•·ï¿þ›ÉÙ×:Šl¸"ì9ã.ÔÖáàè/Å`>>ý¸~ö›Ííwó‹Öð‚pÆ`‰Öôfzô&ž›TÛu)ƒ­Ö>.qQ¦fdI;_,.¾¦´¤œ~ŒU×ê_=ÿ‹ãWã nJl¨†‹gÿöøéŸÒÖH‰Q7[ËW­õë`z—^À¸ÍÙMÿè5ãMöH»®„èÐîu/gdxÃfo{ñæÏÂù]ÝîQ¾Ø< 9ã­[›÷u1.Öµxp6;þñ\梒œ©éŒ=ƒø#´r¤ÍYƒÖòÙðü{D¯Þ>–‚u]éEÀçJOÎëRψÃõÛÎÙw<”;cÔn• ‹¤ë4‡ëçEBû*KïÕ_+þ’Ö»ŒÑ-2°EˆÞo¤ªž¬G'ïW·?¬î~\?ýU²} JT¢µ;¼Øã6½øñôÝßo^üÕøæ7 p‚èµdÁùCoro¿µ¦oÃÕwóË?ÛÜü&ž?««MÉ9ƒ)š‰þ,Á{Ó`|uõáïžþô¯QSJœGÊ‘Õ^¡’šýsýZLŽ‡ç¿ZÜÿ…Ö9çíáæâ}wuGZÆ1hhCÞƒƒ>™_þ<¹ú3%>ÁœÓ:øíÄ=…G«i]Ú±î¬wøþøíß°°ÎÌîËñÖ‹¶'È­uh§P¹(q6`¬¹z½¾ýÕÕ·/'çYÚ/ñè%™ÝPŒv×^·¸úøÏÎ?ü½Ö=-ó6Hrvö~vöN°û,}zíÊÉñr|ªÙ'ôtÿ”áE‘rr„…Ò#‡¯{'?k­#Îêi‹Vc§½&”€5Þþô­ö™Õ¹Ð[¼=‚ÈØÝSÆáWR赨*)uÖwvw»_UíxÛ[¿lmÞpö”ÕÚ’Ùñ:+¿³àÍØŠ—“ƒ7ƒƒWƒã¯­Á5ìÕí +mÉé%U£"eAÓä`ŒnÂéSÁ™åI÷qA4ãÕüô­Œ³ óIY¯(mø´uþç“»ßDãK‚w³‹Õõ÷p‹_f…é¥.ß<±¦oZË÷ ¡¹[üÎáùó?ß+)_î3x€Ÿ4ׯYs€,¼‘-üÑY4>õvg.º}*ý(­a{þ´ôÎ_(ÑHÖ Ø5c êpÌ×ð\j.œÁE´xéLž!ý6lÈ„JNÜñM¼~Cè…a´ûgfû¨»}i/‹J§ÈGr°H–O½ÁYoófzó­©tN™`YQÛ$æ!9š›’д{Wîø¹Ö>—‚ ظ®ö +,ød$zÐE…u(ª> ÇÏœþ3¸BæÖ䎭YgV’ÚRëXí^úÓpp”=)KQ–TBF¼„ðJá\í]éýkô?9x_’š»5­*6±Üœ;Ã¥5¸R;ç(èó‹ï{‡ÜÑ…ä aÇÔÖ¾¬ªöólH¨Ý`tê,xËlÃH{%„„>Ð;ÁìuIl7Ô.’Qò&vkUaÌôÓª-ÌüÌêÃ!)Ê\“sçpuµ]d]):ð'ÏF +f ´N¦¦ÕYÿòé¯Æ›§œÞnˆMRëÖ@´ú¸UE5“óWÿð/ÿ7YTø¨"ÄHF³Ï»ilðN³šÓ+«½­ ¥ö*\LDiÑJvF5Æ"„@‰õޥѻ惣i—H³ÆÚN<“?*Ê%6j.Ò+²Úœñó<—|•“Álfó ^Wù0™ÝÓçZëŒÔRÛ…lÒ©Ý9l/ŸêÑ<ýð»KÊ©O¡ß?kÎî;ëÁøÒé9ý cwÓíóX_‹6@»¢Æs%šš­Ý?u'w‚»”ü¥Ý¿h®^¾þ«ã÷oß“FÀ"²Ö05eö”öÖ¦ô½6/üÑEk~Z€‘â&X«°T›o¼ÅkÔ, + Ô:2>]ÔEÌ”¸&cÎüñ½o2e¡LèV{S“½uÊ{›²Ø­Ê=Á_Yý+ÚY‚ĬáÚ½2ú7Ucð¨a(’V‰ò(1Œ;ëéú~uò¢L›ÒJèùswx[•:9Òý*KÑj«2ê]®f(þ\ôHR%\!ºöJÒ“,­8C3ÝMoPZ ©CHIƒPþ8s@j½lÃ1šÛÅÅ·¼7®IMü¸O ;æjó_³„×_ÜþùßÿÏÙÝ“¢’©b¸™4¤€ÖÛÀc”]É ªÑ1Ä•âOÒÏéMVþàÄî šÓËdõÊߥ‡\´Ì;CJkj5B +f "ÊèË>Xîºüa|þ±üÖœ¦ÂÍërŒØ&äD6€XxwtðŒtÚP;¼7]þiëð‡æöû`™îÎ … P´-PÄE{Ü^-Þ;ƒ;gx§wÎÒŒ­*¬’xÝÆœøûhöFk_â•¡¢áüuWÍE<¾´°îRé\QîVjž4ç/ãÙ Rj©vÿüùz²2©Ýk©“î\Í®a3)£“§-§{’|:&‰`‚e5õAñºýŠàŠàH +·SÒeé¨Ì'R°mNŸÛ½³<ÐHl™g"FàyE óL(5ûÇ߶7¯%oúöçzõþKñ1ç­¥ÖQĸ®vžUbØô§Oµvú!–œÚE©E ËTM3>dõ>BH°†jxïâÑ­êYÂø´µ}¸_ò5­@œ¿Aa + H¢ÒÛ«h단§™º'\”°†Ûšƒc5\ÿ"Ç?.HŒ> ÕN‘ò÷«&¾êÀNNýþ9o25µH;EÆ•iÍ gMR—V;ƒåÍöê[|ŽõÎ- 4G ½OÙÓš1Ø¥œ,e×Ħ™'ËçNÿTp‡ êêÖxWö(^ý“ï[›¯•øH‹äpUã'eŸ°µ‡À‚¡Å)HØ=X59’›=9À­ªu²”SæCD'%z‚ 9ÚZí`¤;¼„CQãm¼zÌî•ø€ó¦Ad„Î(O;„™­­Ý=A°qf_ñÒOã쮞ƒ¢‘eÆÇÕp‰B)ÁUÅ#>@MÄoµæ® ³Ú;ù1\¾CX6gÏ`ÒÃÝÍü{Uj²î¤µz.^ËñN¼®u÷(£¡õäèF».FÈ£º2¬kàöy‰oe (CØ^ÞÊѴ·ìÁ]¸xçO_FsÔÊ“<ã@Péªr+˺Zrnõ®¢õ«ÙMz0äIëÖðøÇßý«ó—?³Î˜ ·rçLJŽ9?½ šÞ“JWñÇÉêY‘ €é–èÊ€Ž¼é›æêk ‘,Ž¯~dµ.¶1—:Um”|³}ö[·ºWâ$³Ïý +Âo"Þò”·WwhkÌ_Cùsu›ÕQ£˜UÙ› `Õ¤6\p418þ¶Ìu¡…oN½þ ‚™VzÀ­Ú½Æèý"Ç•˜µÆvçÔëŸñ–’{ûU§@5µø˜²FZçRŠOp⣊ÖC¨¤‡£ã«w†Òo´NƒÉ !ØÐÆ@pGj¼öW£“ïãÕ[ÖY‘Ƭ®MkQäâ$Të²ÎH +Wð¿|h^t îBÔµ6oQkBã]X»Â¥€²z[pF÷ÀŸÝŽÏ¾ï~ ¶á‘Îh6:x¾¸ü• ×P ·w¢úSÖH¥v¼T¡A_ †œÕãTä„ +«wÊ´£‡óx|å$²?3lÁF²ÀÕK0OCméñyLn´t/³c³ÖÚøã+ÚÁÛ)À­^[ƒ;59G ”.ì!„‘W'gFïÉÈû3gtY’“?Þ#!€ñì™Þ:D*Ð60Nqýóòæ׬;%õNgýIAPA‘ *B„˜Yßÿ|ò៸“1XŽN%æ ¦¶«râ–%=5X£³Ê'_™nÕ<‚;@]ȳA–0Y½'{ó\MÝÁrÁVnóçR´­e:’ O,ÑžÙ¹T“+)8äݵݽÒÂE¶¦)wvJDR˜l?Ä›×ßÿóõ¿ö¶wJ!Ä„ØÊÖM”ã<‘^f/‡›áÑ7ã³ïŒöQ‘ ¶×?¹ýKRøVQ(åæüõïþìŸþo ¸*{FYS):Š—ïÌÎ +ǧÝ:†¼;cí©™€¦n‘ „‘Ó0Ú‡ðøX,¤vE8ÃîðYEê‚«ërL.rúW(¯jsÎÆ@Š–ƒ7f¯?o¨CZïKîHr/Þìèí7½J¯þ¿êí#ÉkNߊÆj4eœôÜM÷àmkñœ1”’Ø­­-ê’›­Ò5Þ"ä¦;¸ž\ü¨Ä›º’”_ógV4oð~Dwâ .[ÛÁòëŽKé&Ëp)¡'r¼fý%8Ç™ÜB*ýÉ ´«®µÍþiûà]sùJj#éàFÍμ!α»gÝÃï”Ö¡-þyNL¾*”Ô²“móJ¤?Ž÷…ò÷¾‰¦pÊ ·þàà9\6k÷4”6o£µÓ“q'oÿò⛿KÒ¨;:~ú§—ÚCg|‹…ýì­”`Y—"$‹™lÞ(®Äx 8ä­Ih½Ç9f¿¦efŽ Š|“´k]3$ë7¢3­òMx/…p©cRiWX§@ï9„è,¢È¸ÎñÇÓÿ0ö»ÑÅ/ýÉó2×~”—-­Ý’BÉmÔ—pz?>ùÎ\KáUwòü·ÑølF˜S}öfñüwïÿo~úÛóúÇ¿«©FÌ_ŠþÊèœRæÌì.íÞ…Ñ=£UEl¸VÅÔšÉÍ-$qRUÛ¬?#?9}ÒH§qh•p-‡ Bï}g®æg„U¥+‡Ë²Ô‰ÞZ‰NÕø 8ÄC Í‘äN¡4°Í›ŠÑáðì‡Áù÷Xb¤kt¥IhéÙ +Jï‘úPð`nìîêïn]ͪìy{@™}1ÜÂB6o{Ç?aD%ÊÎV!­›£t§‰p.¶¶j÷ÜÜèÓº–YË蹓ÛÉÕ/û?ÊÉ ëAÙFø•LxŒBFÛc{x;¼øõèâ׋LM)Ò.ïL3ݾÜÅ8 ­wÃ{KX]¨ý“_$ô†à—i‹MÏ-n¤hË8S°œ;8¡íž‘¬»‡ßFË·aºñå‘Ïá£){èôŽ;«g590Ógöð¬Eiƒì7´*ï£úbóñ>M©m»sl´Žú8Ç„9ÆÏ‘ +úNU™Pz¢DFçB±.yÊÎ5RÙÙ«ª•t3åN”þi›3Åßzƒ»šÒ5{gÎð +•æt§aî“ënÖ¶9¹hNÎs LãEËš£¼,ðÁÂ蘽‹pòZ„z – f/Ãñ­Ó>Pía…qIk†ØQ—ÄVŽ p«Êm§{š¬ß¶¾6§ÏØð°‹A§×4ä.€Á>Õz×jû ºŒh¤­1r¤"ÆŸ>qt¢¢¶ºS¬f]‚>ÄXt$\¶è/€Ê$"SJÉvrúãùÇÿnòì÷¼·Æ‹zwÆ2 œ¢Û½ôZ߯á ú•j¨·àÌo.¸«÷Ô¿ ço8oQ`2|pø±½þ`ö® оғ3#^ïS6Œÿàè}÷ø{ÆßÔ´>,ªñÙ¼õ‡çŒÞ✡Ý;=|öçïÿ‰Þ;©êŠC£{^U:$ XEË÷ñö[{ø´¡õ÷jr‰±s‘I¯à5&H[¥}%D‡€=»µ)3®èŒaö×·ßwO¿‘ÛW´…~†”ÖÖã5¥· v&tûç“ËŸ¦×?O¯~fÜ9@\TbÒpÚ¯ë%é[½cÆì—Yw¿ª ÍYÃ'E!Û°P)ÌöYÿ䛚ÞÛ#Ì,Œ¡Ü¢´¸’^Òãå)w§¬“jOH иNÊ]Ñ™«qzåCz‘Oêêê×\¾ÆHwk†à-:›÷ÉögxCª ø6ChÆRÜiƒ žä…šØî¬_]|ø]ÿä5¡$¥§ÎQƒÑ-J3Þì_÷OXÜüeÏ9o+@*½UEéä/G»‚3¼_ßývûòo{ç?—Äv–„p µêF9S6ܘƒ{Di0Ó$Cúd)aÉ9sw𠨆¥,r!ªOžq+ЫO륦JþÜ\´æÏQP} ßÝÝ|pûHÕ1©WÁüNHŽÄöq´~»~ýwñöc øAZÒ ”ØIN¢É ¹yhô¯0,®Ó=¶óËf5D¯âå {pžþšsWNïB‰V cHÚ3½}>ºøypöK³ÃyK¸c9˜Ú݃xv98}o/{'ßÎï~=¿ÿ­Ö½‚ä"SÚË—ýãï„ø”vÖj|¨ÀyH“N‰5i«9ºøÕɇ°§Ï!iµ²'z|¨ÅK%žFËkôTŠÎx/=BBƒ<å`, ±)¹C» `s†·€|=>Ö£Ã2eêzMh2ú°* öõ˜(f÷Lkƒ´wÊòWû”¦yH­Oè£wÑÙ¾|k¶Ê¬IÈA<¹hMïåˆ?ìmãnw \„öfIS ÿÞè>Ýv9¹ õi…ï8k¸ìŠï”ä†ÜFxPöå¯*õò¤·WV8µ£‡S)˜1Þ\éߌo~{øêo:›Vr‚Trz'‹›_¢nB0 TÉî3~ŠZP’bD‚`Oº‹ûÁæÅàð=æ¶ÈµñʱƒâµGe%fü•;{•|pçOáhŒ×@ùÆ÷0uxA ‚ܾàü|Ÿe¼F/ýû…Å‹`õ&Z½1’#xyˆ?æ«`´ÏÌî%¼¹‘-TÕYMõîÉàô›íË¿8ûãû'ÊŒíÄ 5˜6ä¸Ìû¨5þôy8}éô®r ­@èéáA95P[kÂèAÓ¼ñS{\?I¯spgJr +ûæ¯o ·¥÷nÍî¹.Ôhf´–áâ¾öáìÝß¿ûëæÁÚ]×µ¡sÎo"†‡Vÿ.ÝÙsrdž«ŠضY£ëΣôzÝ;®yÈâã`òÔî_¢žª­Õìê›ô8‰ÔÅ­,uäæ Ì)mŒ(µ“«+Œ‘$óÛhv²Î¢.÷«"‚sì °Ê×éV8ö8ßZƒk!Ú’Ú8KBÓ\ÀnRœn÷c cDþá‡`rc[C¤íäè½×9ù£'uL”7ºŒ6ïìÉ+5>ª#2KJ™‹FëˆPÚ ¥gu¯­Î•äoý~zþ2R¤=Ö‚: u1¡½5Š £õ­ÇÃ;éadÔµþé÷áèZ 7’»àìakv½ºúHJ1µªvH{*¶Ž+Ú Ï5kÚ ¡ Ôp Èa­¶RÐ…ž3沦 ðÊbý9nhwZ·ú||Ð:øvñò¿MÎ~£- +’NÃhòltú³5~ŇG5}TI¯]3V?Ýb¾uŒzŠiËi­ä#¼RIˆ`ó¥pÝZ§| ¬ÊÉìâÛÑÙ£·æÂ9çCÇÞZÃ{Îî+Á´,%ÞµÒË¢”بʷ*\Ä™éé>­Ùú鯜É5€÷WPèjUJìÁ¹š×µ*xzé×ðÚŸ¿ÔÛ§ ­ ÛȘ«³uûk#Yö”öÙâî/Ãå{ô–wf5!0º'|0«ë]Âìûó»ãW¿Û<ý³æäR&¢5ÞÏ¿š‡H¨º:„Í1º—ãóš‹» +Ô¸ˆÖFNd«Ø:©jC$KŽ²ä`ŽÎ £«&gR|nönW·¿ƒ˜ˆþ’·§EÚW€Á &gžþù˜9‘£39¾°z×’G¡È¸js zϳMÖ_wN¾iÿÐ=þX²SÑvÊ*ÊÌ—­æ˜·N¼Ñ3„½ì¯ ž{5 …UÖ¯Ž>ð¤b¥öh¥[Ò `̑诋t˜'¼š„™hÑ&ýÛ oÒPÚ»U2 ½µÚ'J´f­a]luæÏw–ÊÑ+¥Ö=á£c9:¦/{r0× Ѻ,töÉ°*@aÒ oÂå 6X€<åÖšœOÒ"·ïƤÀÇ ½O¤h0àÜ)z¨÷žšÃWz÷¯C]Ù‡–.£Ù˃—Ý:x¯õÎj7ÏúXÚ%Êb \‰×§?»Ó2ýh|¯šëºÑË1VMíÚ£ôªò¸$íÕtä ÐGé©FkT5†B´q§O…ø`psRÛU¡Ã9SÎàébtÐ\½gƒm†öÊHêñm0 ?è Ïí.ô¤í$ëxr­&‡Zç¤(¶3œW R,¯ÊQ÷Âéõúþdzw¿o®ž…Q—·sÚY½HÏcZ“`|/^¥×¨o²”õe¦^åC¥¹EÖÔÍ‘>xÖÜþпHwà’ÃU]Nv*J]j"Hu5©µ_7w+7 ‹Ù9I/T{Ýõ«O—4ؾ2±KùX„7¼v{gxk%ÞÖ~ÝœçÄ~ŽëÁIïøûdùŒTÛ¤’„óûƒç¿½þøOÛ›wX¦LÃÎ@ýŒ‘Ý»„häÙHm?ýùßNŸþ•”œ‚Õs Gkõ6³ÿÍ/*_eÖ^,ßþÃæÕ_¹ƒKôó 4We¾YÚ@!‚”ýôâ×ÿc8«uÏ*àjsTÓ‡„5eü!dݱoñ³öÑwÍÕ›šÜݯÛ9®òÍíÔÅ€ÃlUݯŒ1t{—vÿ +î/Gˆæø0Ÿ­[Zë|ù⯼ùK£}%‡‡éœtF›[Rñ¿*°\x¤õŸEëïÆ¿5zWõ“’Ô]ž¿ý½ÍóŒÿeQα‘Ù¿-ûé¾Þéá`t…š6Àìå¬åèd|ö«í‹¿¦Œñ£}¾Ì„'1>@ØïÕ¢Ôõ¡cö^Jþ¢,&Ão®¾ýÓë?÷f¯ò\÷ÿø/¤üÿÝÿ¯Úç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkŸòÐÚç<´öy ­}ÈCkÿû!­“ù/¤ý×…‚wâ¾<üb}Q°›ü?_¼<}þEç‹Â–´Ÿ¿ô._^Þß>—QpE0\†œÞdÊxdÊtŸ_ž_ÞáÎáñáÍi%SÇCUüÿ•¡3Ô§ÿfï¾hˆ’Ȭ(2CÓ<'eDQæŽåyQde†—2·ÿ·â%‚¡dQ$Qb…ÌMú îÓ}2EI¼@1xôéY4+ÒGsÿúÏÞîæÿMŸn¾¸øbúÅÝý/äL¹’™M¿ÿGßaÞ¤tÞœç¯^\ô_bJîþp§sŠ9ùOî.ïîoOO2ŸîÍàî ÃÌ’ÿgoÒoN¿xõŸÎ•‰ñÍîz“¡©L;³\S™“ôñƒ´÷Ÿö˜ÿÃ̱! +ø9ùæ>ý›ü‡Çÿç?züÝÿõöøçÙèöâSx—7§Ê¾ý4¸+˜ +ô&ü‚ôN__ŸB'3ë|±ÄOñò‡¯øéÓ\óüV‚Ϭ3 EcLBúô‹ÿWOHûóïŸôïÿ•2,úH‹ŸºËeÒ'R_ +Ÿz˜F·’°ô³æÅÚãšÜjhmÁ›ŠÁ\t§¬5!)Hñï-cø‡MÍíΩHÑŠ0úU%©Êé6!Œ=âì1©$Š?Ñ[kwpfôNåÖ±qáÚ¾¬)í<©år÷xg¨&[³©õ¯äö×Ü4ìAIl:½C-YÓæPOÎÜÁM0}!D´9['Œ»h¨½ŠÐdœ™n¤hãŽoHw–¡œtGjk„Η¹ÒúFrNŸê½3¡¹®(-Êf‡FE)àü‰7½–o›‡ßë£{ÊUõnEIüñ]ëàƒ¿|éMŸ5WïµÞ®ÊJ"KÖ6´n +”MÈ­'¢7â½Iž¶ñ^Œ5-ËíŠÜ©i=Ö›£cœ;•ÃçÎh{Þš¿ñÇÏ)gY’Û96(paMIìî©Þ:¨ˆa…Ôp£·ŽwQ’J[ WíÅ ¼#¥ueU¤ý½ªVZu¹Ó;u¥'†BtÈùÖ[e™ ÄÇ ¥GéCZJþ/Õ»¬5«Jí<ãbÆj¿&·kR¢E[#>¢ŒaCéç¹æ“ª¶SÕ²¤] mZmóæ@À +Íã’rœ­«K|–²ÊB„§W¥kÍcL¨ýbxQWÚÙºVå£íg¡ôxwÅZ ÑÛ(Í#µ¹¾¦—Þ%õ¡ÛÃK­}XæÃ2…·è2¦ë€ræ%±]â"Ñ[¸ý »}L+¯.†‹šÖ)‰©÷åæ‘ öÈi¯ŠŒ] m1ÝöõFI.¹ðˆŽ9o™nUn +œG›}³­_Ûã;­‹uÜT ,ÓøúÍ_÷ÞFÔ{F÷ªµýÁŸ½ãƒm]TÓ A[5)®ˆQEL·$¡í ~ÕÐG mX`ƒ,™î2X•šé®KÁŒ0´33ºÍÕ‡áñ·Ûg¿&nUmjícoþ²}ò£¿|Ë·Nøè@ +ÖçÏÿr~ósÝ–„Èì]÷OŽ7ßò;yDCÌdCéPZ/þi##ÝàSN°™ºžm˜é®·Î ³Mû‹†9&Ì aLH{N»“Ò§½‘øð "§›ãVÄVEŒK\º×ZMl²fŸP“Š–¿Æ5ëø huØ='÷ˆ«ýŠZ ýš¾S’‹Œß@9K):¦í5e̵è܈ϊlÐÛ¤Öçœ9b€40ü©Ú½kBï=ªˆ¿(rˆL%X[É©ŸjçIY.R~MH?«ýQݯʴœîJô׬>Ø«ªè©vs¤U`\Ì@Uêf©¨"$ˆRš­SÒè—§&Dû˜„ºA©}ô,œ¼ôG/äpï?þæ_>ÿÕíÕôÎYºäá{1>(ñѧ$êÕ¤vóÓOýæ›H³{b$‡œ9ÌññýoÌÞqQŒ2”Å[“æò}°xËÙ#Æh)çÓÎO'Œ=#Ìqݘpá¡Õ»Žæ/´øc+9ˆW/ÌáÎøpõ•['îèfuý“3¸ ŒžèÎœá5~Ƈ‡ u¥ÂQz¯&ÇBÏÓb âÆØsBŸòî†6§¼“~:|‰÷£'øãºÞ!í±;~:¾ú‹Ùíoß6ì.ïÍÞ‰>8Sç\óоžü˜¬^ÏϾ—Ï*é¦A=«wíR;ç´·æ¢S&}Ù‘nÒÝaI'G{9Ú§­tû“2ì”å<éÐÆ‘œš9)©™3ÒÞ0î9zNyÓ,mcžõîUIˆ³”÷¤f–ø&V¶*„u¹™Â׆ҮñÍBÃÊÖŒ\Â,Ô…–*Á*SÓT¸·¬dªÚ^M- 1mÏ´ö¥Ô<—£S»{gµ¯ªb[pfényúÐFœ»aœµÞ¹Šæogú¨,d:d‡sf8Hº]…â‰íGyþQž+R)%œ½¢¬EMêÕÅŽànõp ­Pýi–43¤Ÿg[Œ9Á`± ¤»%ô>£wIµ³[‘ËŒGkÙ_ãœ5—½•ƒ =þKü2u¥µ &·°tÏš×õiŽ ¬å¯|šÆ™Ö°–îš6°ãƒÍÕTCÚIéŽ,'¤5Ͳ~ Ò­•’#§–î Ò\1ÞŒ V”=㽡õ+\Ž®ú'_ÛÃs|n Nùp©¶þ¾r¨¼Ö$™=3zÇû´•gknÓ-`UÈø(0þ>åÓm¼ûu¥Ë˜cŒU¯fŒ{I;[):÷¦@õtŸï{­{™gÃ}ÒÍ’>gϘôãï[ µMé#è ™ÎI”©¨&(3~°öë¡tYsRb£ý†#½BF„i×”®n‹b«À6‹l³Ä¡&b6Dº{ÖaS’Zø-eM…ðªIOO +ŠŒƒÀ®J â¡.¶X}H©½²R ¼|ÃzRÒÓˆ„…ôUÅ®äÌÃþ¹Û9BHgI·ÀDyÚ+óMÚ^(É­7~fõÎ+bª{¹†±_×vŠÜnYæÍQùRoŸ‘΢ŽK«ŠôYôW(”Zç +÷æ”2Çz|¤øÓš!j1î\ŠO¬þ­7¸”Ã¥uœäxxò¡«R\W:¼?O·ø+$—Ù9æO k°KZu/¾V£C²Ü;ƒ&“»?ûýÿpúþ÷u»W7:|s«´lOãÅëöæ­¥[S ÅjR‡¶r|aôŸýgzçFmŸ#wwbvÏJrź,u)sb´ÏµÎ…œœE“§g/~7gM%w)¹ JéWø¸ÌE¨,Òª +MÔ¾,áìÕ­¨¡U—Úe¡¹O»5åË}r¯¦åI¯Ì¢Œ¶®é>ܬ½ÓвŒƒî!hõäB ¶¬=Ç´#£A˘üŠCgv+J¶neëv•KXu\¦@>)wöªòWöIIAÙJ·> VÓ , ÀžÔ.Ñ>*iŒ·r|‚P¼5k€±»{éqž­ñxVŸ²vk§áˆîrrô]Ž„föÁ Ðve͵䪹xÏß®§×ž\F³{>X±îœ´{c»}æL¶ïËB¢7WJ¸¨Ê ^Aù‡Çˆdû1œ?HׄØîŸc•ˆ’=³×Íå‹ÉÙ·_ÿú¿Ÿßý@Ø)ÞªÝ µ{ Ë ·ŽŒþlÀo¢ª˜ ¦X½KЗi üt±ËÍÅO³«ŸKr¯"÷Yw©6ôäXA"$'áøn°ykvNêz÷æ¼—îQêO_¶¶_ë½srûö§­Ÿí’6ˆC6%' v(*" +PSzø>G9¤œ¤{ÒÄGÐyjcÍ9w°ÁBäH3GE:6Þ²ÙZ¼I·®o˜ˆBƒ¼Ó}YP©½ê6çu¹¿×0v*b¶¡i»*Dœ5ÖÞJv—ZxX—{Шºªlï7œ"À )9ÂÉ‘N]J E.Üoè»E¡&´ò„·[12u Ì ‡‡¸!lò¬Ÿn?lŽ+R‚>óî^a†§³ÖXtE6*Pn*D8è•O]9Â.’.ªä“’ Ú«B…ðÊéWô¡Â7?¼5Cy²º„ÖÞ3ö”u0·sJï)±ŠN2ú€P’݆dé§mÚÛYÂH-!DÒc-Ôø¼µþ¶wò“Õ»’Ü©îOVgß O> ü ÁJ Wzû0]vÖ¯ôî ðÃlèqºÑ]8~ê^x£—fïÞ>cý%MqfÍË¢‚Æ9gÑÙ~Ÿÿrvû§“Û_ɽ#˜ÍÑé÷îôYY4¬ ë-½É³hùfMMÎÐ%­unc)µ!}¼;÷Æ÷Ñüõäì'yE›Òî†E¸S)XI‚ðÂ蜱îÕ+G`?mýÉÓÉåÏÎô©5ºnm^æ0Ç´5AøÁ‰dY·,Æ 9ئ{cóq¦nÊö$]Óö8C¨MŒ½€ +IÁAƒïìc&q'øyÀ:+ñ˜ð9•ØÚ©Â)‰-¼~¬‰½º4ÊQé&I ŸLMÆ~°Ö¼55›G­é %<* í"jŸØaÌ)cL@­„Øäï7 Íú'úÅ[”™€ÒE:*3Q…CY„5†I•ÒÇtÅ`ƒÇ´#ŒäDòS +­Š1gOäsØPº9Â*Ò^Cêæ¢:¨Ë5l(aCê@Ív«Šo‘ñpË6 ¥ÞˆT@£öµ`“¥ÝŠ¼SöJJUˆQŽÕhƒ²›!-LZC‰wËÜïÖ¨t+¬ rAt¡Ÿ[5>R[G´3F‰g´ž®‡ïì᪞Ñ9çÂ5å @Ëf{)úèv+=V0yF#$¯4r— }\:„1–Â?¸Ö:GyÞcì¡,ŒÎ‰oåäˆò—„3õ&Og׿v§÷°W\tÀú+½{nžêý[µ} »ÇWäÑ…©)m59µ†Ï•Î ±á1x;Ï…„>›[ÆÃ,ƒu!¤¤>±{÷Œ5*s¾o988kD¹3Ê[Àó±ÚÝ«æìeEIÊR³®uêZ7¬ÝáîS*”ꯂÁeiX–°x}ΛÃt—H¿Dº„”`uvKB‰ñ8{©wîÔøRò6œ1˧Y¬cvªÊã²øU‘+s𳚄º0‡¶dI ~‘k€ÀÀœ+áf¤Ä'e>†qü€Nj]Ý›7¤ø«<©©9R…®œÐ%åž®«œÿå>±_Só$¤=æÝ€×hÉYUj¡†‚™Ó q1*>B°D{x ˆÒnY|\ärûu«.v ¹Ÿê$l(k·ªîÃb4,ˆ[VŒáŽ{³û˧¾SSÿxŸÊTUV™ åxA(aÚªðáN™ýãÝâ~‰ƒ¬ÁüÓ5í†Ö†Õ*06œ>äÔˆìäDO«Jš2ZrBû³cz‹wZ´ÐZ[úLïž°Q\jÆ<ß0œ·òÇςɽÒÜø K[¤Ù'­AYiÁÀÁ‹ZÛï$lû´aö½Ñ­;yšF‘Ú‘šGáòëöÉOêð6ÝWN6ö° EJrf_é£W*"Ç[V•NYlA-íáuž`Ûép°K,ä$KÚ´>4ÚgP§LC“›þâµ9¼CvаKâ?Ò“#­{^”“†è…ú!û0W¼3£ÍÖÄ‹?‹ÏSXDØíºÐdµò+ŽÕD”øSZb‘ÚCJ×¥>4m§¢¦à-µªbóïeÁ; Ú­êYÂüTé†ex%¥“:,w†Z\¤]ÿa6¤f…÷³uEu‡fk‹J§ƒåïVM€£ KŒû‹ý%'‚5®ÀÚsÍ}å”Y_òÖf÷¦$4WÄíΚ“îxªtvJr¦fhÿO²õ +Ÿ§l^ZëI{¯$!)ò¤K§j3t:gÞ½ºþ¸$~™gRý›Œ5T¢Õ~z¬¯%y£"m씨Bc·HWX_ö–tCŽj´á¶Vé¶<Ô5LyÏæi‹P"Á8õﺇo´øÎÕÛÚÕä ’eÜÒâÕ­}Æcor]’CLx‰K÷Ç-q>cöýñ3¸2’ƒ`ù”‹V¬·›‡ cRVº (ÞúCëàkÒ Þ\g'&§5cXR:¨’þäE°|)ø pšÜ=-JqŽ 3” ˆåFw-¿ÞÚ–Ä8Ópò´CT—:þඵx%„Ë:vÖ/ÔÞÁ>cì3nŽð"”5?¸ø5Á^ùãkÒì•y€‡‰ÀR²Ö´—m÷êJ‰6i­³Sv±Xu ‰•#4ð^”¥”ºš ÕĤ&¢®E9ÂÏ‘ÀÚ™èÌJ¬‹&j¯¦#Ë\)x’º§¶JRTSØ^,bêr”¯¬Þ­°¯wâáIE +±U!Ie …IhW¹‚0S‘sHˆÍiSÊ &vr—ÖûðÈ h2k÷‹¬æÉQâ?Oú¨š€ÿ÷j2"zkÂß=ʱ;ŸvtFe„FYÉÉÛ_ý«†Þ}”£su”¼ÏQ.Jaž‹`{Ëç½ÕíN(ÕyA‹½C*PEDK³&ƬÞ¼¦ô£­_°­,©“Jdµ6 ÏLÍ,RaCüw[¶Kþ<ýj&gßÁìqYÙ'Ì},„Ô‚u{óÀc·ŽÏßýã=Z/Ð6¥vY(Xº—ü¡e´úóûÓ·)·÷)·ÄGð€œ=w‡÷ó›ß·¾£œ”šœÉ]Uï–åà'D[³ÝÚ~ã-^6Ï?þwzõe‘/Òˆ>¡h´/yê~¨ê#`0@îdnµÏ¬î9*©`ŒW?°ÁàË\c$­$T óË_No~-·ÖÁú懂àþ"G<.°¬9DOP_¼î% +Ò„5a“Gz¯*H£ñÉ#Ú)å9ƒ³² ÊÒpÛ­‚ÄšŒ1Õ¢SX-¸ià(€ðyö«ý¤È£Ž@¸PÝ€µ¼»ª«íªg”ÑTOÊŒ·…D¦7ÄØnm¢ñY†¶>ëÃ.Á»¥[zn• xcè$GNï)` 9A.PNZÈÒ·h÷7¯X{ø¤,¢ö!(upSçÀQ¼ÑÑ£¾ÙÅRÖõ\ÝÀ+ç7Gyà´ƒû_çX;W•X©•kh;% Õ3­§\›ÐGÑôÞîeJ#z‚Þ¬sî“’˜#]έCØvéÓ6À©5¦&¸œÏÛ#5ZBÒ÷ë&pÂ]L,ê&g ÃÁ5¨ž÷¦yRi5ä&r¶,6)sçk%‡ž‚ès&*æšw¦ð,¬=¦Œ>©w‹»»ïþÞìŸ`óÕŒŒÑ<²ûWñúµÐL5'Ý8¹µÎð.ïŽãÙ=‚­a¤»9 +Ñfqòáç¿ýŸÆ§ïwkšhƒuÓCèû”#ø'Vÿ©Ñ¹ò—oÞº!õÍø= Æкx_P:ØÉ\–Ä`§"A…x¬Ö”ˆv†”3¢­Átõü7óo«Jô¨ÀPj+3æ O»»5ãÓ‘Ò‘;H·ÑE­!”V] Iµ³¾Më]ìwN_üêŸUµö“ªJ¨][Ré‘jå¯Ä†ÁàìæÝ_OÎ>~™cçélM"Ð7¤mÝ„$ô!â“0úà:pT‘k©íW%D!&fóÐ랊Á4CÙ¨˜ÐÉÇe9 +"Ī3Uœ©mðFïFýSTÏ€S–.Q!Ä°lr°Š&7c¤y®¡ç ½H:ù† Ÿ·ˆŠfF3+^A‹Ò‘–ÅŸ­QEŒ ŒŸ£ìG%V´&v| ­þGOÊ;ºL;¬¹äTÉTä +å`]KÂ^E&dp`çSl;„>FJ>*‰{uÔ_—Ñûœ¸Úƒ$fjigQ— “ÒJmkÁ²5}¦vÏhgÒP;tbŒˆÔ»*)Xêí#)„Y[“ÆÀ\ú³;ÎpÎD Œb7õú§|¸ØgÃ,@9açQmQ4sŒÍÚ#)˜cžµîYñެ"Çûusd÷/Û¯ñéÍ‹ä.IÍ8ãd‡õæuÖ]Iñ9a/Ýá3wp ¸*rn]iU…óVbã2÷—ÀæYçI…ÿªHíVxýÝG‹çÑä<™_åI ÅE 5Ü“2“#ML…™œËÑ‘lªrNö'O›O§P¥ÎhŽŸÇöÙ”¸PxÙL™ÏTÄLUÂB(͵Ù?ÃMEJjBP$!ÊnQ€ÄB ¯Ëb§*÷ïÀ¾¢ìi¦®—¥ + TâÐí¤"uùà(X¼…`ÑJ§@Z»EÔe`ý +í1j·9¼,ÐX‹¸—•šÅÔÖEˆí²Ôf¬1²‰V»²D¶¢’B«Æ§»>ïkj®õ«HÒšÜà<=€¤À6*{7`—žøA÷H$”<.0™ª²WMsB*w´ð Hû…†mù›'ED`#SVÒwZ0ŒOJR¶aî§GV1"¿!õ{ V©pqtóu„V·" ÖÃÇyXQÔšäD W5 ìÚÖâ ´º®ëú”rÖÁämûðù†2‡¼3tT¤1 ŒüÄÝš:@ÕΣÂì¬Êb(ùS5X(Í£`öÊ=%íÉi³þ’ó—ÐCäµ>zí®¾3ÆÏñ«šÒ£¬)íbÔýÆèJ,„ËÌn™Ž8kRd<ÔY2aÉ];ÝKR ²;‹g·„ÑI¼ã‰Ís{ø2^~ÔºWXzdz8¾•Ð%ªëˆîLõä\ôV€ü,aËö¼5}Z<3‚¶Õ¿éŸþäÏ^ÖîÏÜJñI Ê|äÎߣ¤»Àb1öÌÜ9Ó—EÖì«É–IϯÕÔnžñjQ·(OXDð^CT¤^ÞM€ÜŤ + xKˆ-ãÀ±öÓCvþqC›TÅV¶®•IWó—ŒÕ…¾•9_iJqZ¯ Ü'ãܹ²w•T9ýFz6°K›SxC8Ó<f ëʺOŠ Œž sXÒÁÔÕÒã9ÔÊ>Êq`¸r€ 4¼È¶Š\¢4ϼáK»w+¸ Å_Szw§*ŸæµFŒÑ“¼©™œUYŸÙï•ø'9&W5d7½ŽV ¡±­ò1`£!w²éÑÐ.gLb—QF§?Ú©ü£ÇålUA`übŸùã]2Sã¥g0Ab9Òk(ý½ºùUA¢)¡uBë3¿ìÜ bÝÖ!µ¿Êsr µÂF”Ücõ£  Q0¨Œ‹b‰òœÞ=Ro¿aÂ~"‘f9fõ1@1M·Í–» ¥·×°€°XåfƒpvÊj‘ò”àÐê_8<ØãÜï.ë0æ¤ñ¤¦ì‘ ¯?¾üy™ j·&§ªóH¹@\Ù[™Íc­u˜iHu9¤í-Ù0=U¤D[«s¦v.FzJ…Ôº%Áß',i±j_ˆŽèð ¡Œ¾ÝÜþ”Âí¥GÔž±.h*É~Q{z—G ¦›´½V›Ç¬5amôsSSû¼5½~õ—o~_•[{5s¯'rz€÷/X­Sg=Ñgû« +¿K‚·rú×ÐU£{Y›’‹îÖd PEì’ú¤Èi¤Ç…lRJàúwkzžñÐgx|Õ[)Þ†Ñge.‡“R;ßÐ`Íò„Ç™S"õ˜­×ÊPaEèu¦/Uo˜kH¤çh»È˜û5a·Ì"))Ö¬.ç™<€ŸrŠhJPí•¥½ª†P£ƒZ*¡BƒODc.ÚKÈ…`ÌË´ÿ'{Ä£}6SMÉü«}¶Pw +©€8U_½ºÔ•£“º2(°ÍšÒ/ñ­,î^Ž¨nçe N#B1ÍÖXË'y®PS«\”ô#íSéÞ^õÝgÕ­v°@»uþÓ²G`¶}t›ö!n„ÒƒÔdêònIÎÖ­´FÃó@¾Ö†€÷T:O*ò#øˆ†±GšE>*ø8À*mÍ„p›caDBŽbȘ][îÓ‰xøÓpt+F˯jrEj«ñ­¡ÿ%¡…t®íšÔ…ÎSR ˜]hE‘ }"7OŒÎE÷à£={–a€¦¡Ák?)K_•øÇU¹Èð¿0ÚE¶Ié$à8¡ÌåI´FCr7»ønpüv•BHÈp£ÁGwd{"ê}Ùêár“@¹U¹SæÓóˆ=>0š9\þá`TŽ´kBh]D>lÔN 1 Á.A©0cvrÍî3 ³ͤ›¿LÝ΃6¹&Ö"µf„½_3¾ÌP¿ÈÙªV£sç ±Ya\Å›íÕåÇ*[“Ó`½å”)· Ò&Ì îâ¾Ü­å:î¬2!¯”`#Y$]Ù™jÁôSuNÍ)Þb§”._zQMUG5ÿb·òxŸBˆ +Z›Ó: ¹Wƒ‘”Fëx§®?®j96ª*願O§{Îôöi] ”ÀVþÿÑN¥¶Á‡5Öß«hyÂÎXeóQEöÑæ€Òz°ºÈ@cCªa²Êr3¥gZ“Ûé´K©d¼Aw©¸5iñÓÑiO7úY.ØCéçB\!D™†§ïõÏ£ù3wtÛÐGe!„‡ý,svM±¨ªzpï9ožãƒ aÇÓ碼öìùôÈf¤Å#ØÞV䶑õV@wÊ£ìÂHæ¹ ÈEøq@˜Ç=Bß«)Ð#ÉÁV`j°Ž%Úd"H£Ïy {xivÏs!P¹¯òÌ^U"åD‚9…ª Åx¸ª €ÄEÊ$äÌ»ì/0-”1•ü­hÍRKÂùÈP@ +D®nfëfžô‘0ãÙíä웯·iX«B²WÕQ§²D£Âª„ˆw+Z¦¬î–”LEÍ7¬’ò¤(çN‹Ô`‰ˆr7Ò«é¬Çyv¿ +FcªƒiíTäiæk +@ýq–ÅÁË#V«l3™<ç¬Îï¾Ü)—нªš­™Ùš…tÎSà +íËÝr¦,ÂÒè*­ ¡írtTƒŒ?*kY:½¶*ÿÉ;ì–•R:°{£ô„@ý8µ_gýGY&½´ á-Äéõ]bG WJë€÷æÀRï3ÎBnÉñA9oŒþ™Ö=É3n(1PÖžâ–ž¢ƒ4÷ñ,¯—¤f$¯õð[­uÄ»ééKÅŸ[ÉÆìè­#Æ]ŠþRôæz¼¥Œ6Ü¢?º‘‚lï̲¬¿Ï‚™{Ë‹ŸäpÑ"Rkgh'Í:,‹]Ι«ñØ°gÜEo=©Û»u$/âEì)Ô›Û;s9>¤œñ/ŠÜã" oBéCÞ]p挽„Ž÷ÿPyG'?ŽN~©µ.yo ]BâaÐh».¥|¯nÕå6•ž`¥ I4@Z•hv¬® ÕèÄŒO`+ ê©°§Ò…G`¸˜ Þší#½sòUE‡åGBÓö+jMh×¥aU’Vz©IYHª Ì~\ç²ÿ“¤÷ðrãºÓÿˆ·ogl‹bjvnäªP¨*TP …B!rΩsÎÍn²I6I1‰")‰ÊaGa¬dÙ’ƒÆr¶d+Û–e9Žgæ½Ùsöìþ =§ODnø~_@Ý{ñÕ°AHUö TÞ):‰Ø¨Ás|Ì5náÀß9ì?¯ég± p‘Îvøó`’!‹ÙHÕîOùh1¨}HåZ˜w e'_ÒÆ™Çu`ð|@>6:iÀ£#às<,Ôò'fT >øÕ à½ÃZÐ)ÏÉ7O˜ü‡ x5ȸƒuñ'4˜L70ÀZ$lñ¥œì ød'T éfÄLOØ9AØ +ô}¢¿æŠÓÙ.*%iðÄ^uÈƹ%ˆŸ£v¬>àg@ß_cÅè2á1-4Ø*Œ:@â©£ã.#ÒôaÌ»äA EçæJàZ‡Í,’FòÈxÿFöá1@Ë„(z—lƒ’Á"㮾d˜ýB@WÿÖÕ! +$qຠtÌä;2bU5³#ý!¢L@ìNÞæ alz@ëÔyìd” ×_-(…ÂLB—Çúw$7£B¶:>Ç!À šÉ´OŒA—ÝâáDZQàUë×OXôÄhõ,o!âx¨éSš”Òt²…q35d Žiña»©ÖÈ»ø¢˜Ÿ%bMHC„Òpp3@"Xò'g‚•M_rÎÁæ ˜¬w¨HÃæÏK˜ p7ŸG…‚ÍŸôÊ0òQ„Ïûâm'—øÁ{ÑŸ™$'½á†™N›ˆ!ÕÁØÛiàŸ4Ì©“Í"|.˜w°™qD2 k äˆÔtð™½ssy:ÞÑ{e26I%æ­¼‹Øü9 •Jº…‚“´iÌ-ð0¼ÌÍg±PŒö¼á6`ÕF¦Ì}ÊRF¢‹S ˜èA ñPç‘O˜© WpÔ.‡÷;åKÂ5mTÊä€^Ú™ i#cÀçZ4 Ø|IR®{¥ +xB ©Ú˜Ô„'|ÂÎÚá‚ +&7P©¢Ç#G!D€4Øà²a•4Ñi$Xö†ë&eöñÊF<¤AD'cè VmLša$bZD—8ngÇÌ´Öæ×Cš°ùíPk¾$Ä^3‡‘7zc:T² +Ãð¾Öü‰UTš*âîqAéäƬ(8¤E'•$Be&Ñ"#U¯œÔW¥ ‰~Ì)YéŒ)˜HÈ8IF*ÐrÅHÆFÝ¢‹Ï~Žh ètDM〔á³ú¼ÁŒÖÍY ÙéOZ©4ä8¨hTl¹¹25ä¬tšŠÏPê¬7ÒÃÂ-3¥ê±Ð¸‹‡r˜prv_”OOKÅ%65ͧg“GÝÌ‚“ÍCgÁLBâ0báa‹¿ï茾 ·ÞØF†,DÌÉd©HKö@ +€J*u»?¡A›sq9(\‡â2sLb’ˆ6ŒL∑wI^_ôÈ ø©A‚ðJ_¤«o±ÙYW¨B'¦˜$tg + Õ¸ì,£6]&*d:¡Ò£¶5nÉèö?&c–1!oðO!¡ø &ìQ±êâKÀðî^¹ÖßBFŸT2â1¯TSÊkryÍÈÕ@uCB0cvÆ„…¼RY(-H•ÕD÷duíŠØYÖÎf̾Ô(åä|r=ZZãs‹h¨¢3bŸI\‚•Šƒ;²Ò@i&Þá³3ŒÚñscv?(…“+ÛkûKÔx¸á‹·\€‡þÝmÙD@|‹£RɪyÂM_¼,.ÊÕ,”ä “húÔ©¶˜4ÌcÅŸêyKBÞÁeôÞ°•Qlß’Qñ®˜YÈOËÏœå3Ó¸Òp +E'—%ÂR©q¹E*½ªžò*-t1Pt"°œ7T9&Õ)›P¶r%®°F„ëXt*½&âS¥„šH°Î©üôYLi Øü0q z¾Ø$¬öG›Íõ-ûÓÀ?b%Í^|‘r Õ‹KLrÊ!L>¨”Ê(a,b!û’m"TðW.ÑΤû6Ò£|EV}ª$gƒÅU¾°ÈçæàÃådSPAF_ÜƦ±p ×ÅÂ2  &Ë*[i +Þ²¿dèšT:À´\fV©mU–ï–*kH¨äOC›»re->yZ:-– ¥æÕ²“[¹é½hcÝì‹;Dª¸Ä‚'\#Â57›–’“FLÑ{ž` VÜBÙŸœŽ5·CÕ5:ÖŽV—˜xc̪ªàrÏÌŠåU±²fcsTö…ëzBÐ#fB¦c-"R K陃òúu®¸ÌÍ6Wî"ÂqW ÷ðHP`Õî:9gÀcÇ´àL‹GÂÄ›™ö©=zNížÕ6Ûµ•¨,ÚÀ–÷7‰FoÜÍU|ê,WÜP§¼á¦”³P*:+¥Eð¹µXótsã¾¹S7Ï7W/Љ¶7\ –Åò•ìJ¥…ÜÌùÊÚu:5iaT³/âðÇ}ÑmGê[ñÖŽ?5ÙÚ¸'ÞÙ±ði‹?A*U¿Ú +–W|™EaÕïb‘&üS Cþˆ%Ü:%wöCíSrë›™ÏMžbSm<\àòó>uŠŒOÒ‰éPq1ÑÛ ––@t£®€CaRœNL†*›‘Æ®=ÎA%ä‚ã쌂I>7®oȵ µy2?uÖÎ$á +¨T¾ÅÃMFx(ÕíhóŸ[uòƒf8TÞŸ˜ä >µ‹Gd¬ <ƒÊs ÈP€u"Þ +Ë0Âj÷”G,š<‚N ŒÊ0±ÉôÔ~¬³il©“gCååîúe p+Ó/Ãpc³´r¹¹yw{ëîêü&VÃC%©¸hdÀþõo—GÚ™é j{W®®åg ð'\œ“K‹ÒjO©ndfΤgöíí™S·Ò½d#©¸¸  .[Œv÷‚•u.=«vNéHEïfØXa“ƒF+ *Õµòú=嵫ӻ·.?ù6©´pe2;-XÚ°ù ¶ìt|Ù@¨#NÎJ«ãŽH¡_­³éI¡°ªlñš¨„R˜èÅwéäô€‰ •Znò,£Îû ÁÚ®?³ÊÞ[»ffR#V?ÖwVÓ‘úÉhótjê ÖÜš?ykéÂh¨"fç ó++—ÊËÓS§J+Wk[7KÓç®=ö¹ºjcâ|²©mBG’½Ó¹¹ó¥µk©îNcñLwï*dr“Ûµõ«rc‡HL¥fjÛ·•Þy*Z²-o8o$d4T%Sla9_ˆ4·¢í“L²•ì®«KD¤NÅÛ>C«­@²ëOôò³WB¥ A‚>3‰³˜TÚ„.óùåxó”ÚÞó«UV­ár™Iö¤ò²XXŒÖÖÓ͙ݕKÀ–1—êîç’ÝhcG*oxåfyòLyᢠDñö^¤¾,¯.Õ—®ž¼òTº»«#b>u’NÍì¡ÈÄ‚?»­v/x…¢Â“Š“ò3T¢-æ˜d—ÏLÅëx¸*U€æ¦cõPq”‹N&j˜š<ë‹6ƒù¹Pi –‚ùy¥¾ÈÎØø2•èªíu¹4ï3rm…Ž×¥üTfjŸMwã͵s÷¾ æaŠ³çªëד3áú¦›óHuð·jecæäáâœÁã§Â…Dúr®¼|>3¡¼v„5&>ö¸…Á¤—r wgf.‰å-±¶-—ÙT/ZZHÔ5nvÜ-@˜Â@h`r¦ùì¼G®áb&ÕX fg Þë±Å5:ÓW^.3=ìôÚ(«O±ùdæBÚ„¶Å:û‘öiË@¼ƒHÕ•ê\¨¼(ägUªÝG^xÆGï r‰Viáx®ðØÂ|º¾róöów?û=»_-Ì­®ßÈ.\†ú-.]--_£ÕÉí³·¯<ö“jX|˜1§Ô7 ç{'ïMööj3{>ýF¤¹H¶¶”ÚZ¤¹ÝÙ¼±~×SÓgŸå³«•ÎVcþ*æ½r_‹iuJ*­ef.´N>8}î©ääÙ©Õó¹=DÈÀ¬ÒSd´é‹µ¤ü\gçvûÔÃb~‘· W¤7TòHe1£/m Sbv95yÚâ+£b0‰sÀWd¬EÅ›™öÎ…{_(Îœ²³©äô¥Xç¬\Ý(._JÁKà ]þ´œ…J7ã!!Ù‘ŠóõÕKí­ë¹¹Dn¸Ø|¶±söÆK(Ÿ f:ÙÉS™©sÞh›/,‹ËþdKM —ßs©‡J«@µ¥»Ö/=™<=½r~jý"ÌŸ+µÀ|qáÂòÁC÷¿ &÷ïºý<À¼„…N@Xw-WO'¦.'§.âíé•3û×Eµló…p¥ŽÇ§éÔ‚[®¬ÞÇf¸BÇÛByðOÈU°=þì"Œ›\\8}ã™é«Züig2áÆ®TÛòÅ'Á«ÁêÚ©û.Ý÷‚_ix„‚T]*ëRm'¿xìÈÜj.Ö®’SñÆVzö‚Ò>ÃæW¾D±³G) B¢‚*-&š[™Îfº½RšÙ·?hÅI9«mÇê'åò:¨«©µåµ³tv®[H%Z_ ŠK©™ó¡Æ6š¡¢ÍÍý{÷î~Â-7“D¸HOSj›/̦§÷ÃÕ•ÖüþËßþinj”òí•Kóç/oÞlnޘݨ¼z“›Û§oíÞõ$¨ø xÓh}+\Y‹56³sçÕÞi\©­žºÑ^>çäRáÊJ¤µÍåøÜ‚ÚÚmoßÎÌ_ $gjý•c™#Zœ“™Ãå.[i;— —×¸ä” â¡,k0P5ñŽ?Þ }J­1½Ûœß÷ˆ¹T{³´x¾0wŸ=Sš=•m¯qÑÚõûŸyóݺ›WÇÝ¢N |AÌ/K•“Áò“œqPêÙË<ñÂÛÑ|ÏH©ýhç¬Ú;ÈÎß_ºADáÉLmþ¼RY±ùÇì$D¥ L¾š›>sðÐë Ýl¢¯.iÝ‚ƒË«qòyðÑêúìÎÍÞÚ¯K5–Ãåy;›´PI„¯øÓáʦR^7á2¯T…D×JEaF@CIuS:—ãb-ƒ‡±b æzùé½îö ¹±nã2',Ô ™°©JùåPm;ÑÛ­,_š<}›IO!\*Þºоɽ‡jk×£Ííhm-ÙÚfÔ–Îœpó¾XÛJÇlt”ÏÍ @s sg²Ó'‰hÅêYµ*f•ÆF¢·mïyc];ÕÐdÈÔl¼í $-ž _©%{»±ö¶? +rôÎÍ'Åì$¥¶P ‚[“+*2îæMimïèÞ9î²àXŸãŸÈ™©H¼l&ê+î@¬ºÜܸ•œº+^)Î\ŠOî㱦Z[Û¼úŒ“Ï µ³£¿éCjø³kÑ©k\viÄî·ÓÑhe 2ÌTfæ\aáRwýVgõz¬¶#WH1»´w3Ý^sÀŽËAž¢Ôy&5¯4v™Ô”›-l]Šæ§í”ŠI0ª þÔiû“sJm[P;µùBåW&ÍÅ&¸L…Êju)ÕXu(jô¡î ;€! •–ÅÌL(=-ÆZ0Vùîn¤¹CÄ:Uí¼Î†Dƒ‡µ¥«d´¡óHn¡HF[éÞ~ªw +™îiHÙáÜÌæù‡\¾04)Tßa2³`ø'o×V.É…EؽôHmvw¼H#þÄÂCü”ÇVƒð$Ð`?ð +ˆ˜¢–הƎWiŒ98®`|†W‡Ì˜Ö@Ä¢[ªA¦p²Ñêx¸6b!-ç©F Õ{±ˆˆ¶¤Â›èø¤lª4×^¿,f‘` p¹JǺd¤È,ašœ‘Ò¢ÚÞQÛÛñî®;\5øZ©H¹iƒ——ÓÍùÓNŸ~$Ö>E* 3¡@“ ”9!¡8øãî l¢åOu|‰6›61Q—ÈÏœƒÙtó™`n.Õ;›™ÞÕW)¥ä +DÇœþ!#9aœÐ»†L8@4ÓÝ‹·öSýùE&ÕÓ{8_¸«nøÕ[ sä„lB+©Öz²³=áô‘S§êf\vK%»Tƒ„îæ²d¸JEê:Dˆ×¶j+ץ +Ø•\÷$Ÿ™Óz$6T\Ù»!¨Õa;ÅæäúnzæRiþš?9ëÊ&á“ +ë{7åTÇŒÉJi©¶p1Õ:)–Á瓽bï4T¯vÚ·²3—„ô<­´èhŠÐÓ0¸2!9lö:韞 +$z¹Þ©êòPËÍ'®Þ÷\ \Õ£’‹Íà¡2ß»”:¨-^Ñ:JºS[¾ uhÀ€øm¤lèß + Z½Ö;­Å  àÆõ«Ã¤þª'`l¡ê•[' ä?7=a*Ò=:áУãÎ8Oð(Ÿ#ØôôÊe¾8=áeM>Ùì‹ê±0íRÀtdX‡8É(5`Ï-2q˜)‹/¦qrN*ê’n&Êv©x 6ÙÜ<°«¶¥Dknãr}é¬3±ÑáPn¦8µ_š»®lPê¤W©[¨Œg¤0“…ŠÅpef¤0s0µs_wó¦'˜JäÛ‹{÷„KsˆØ¿uè8Ùœž æÖ —è¤^qÜJx¸dÊÊÕÜäiˆWÓ»—ç.…Ò½Éå»òSgÐ`¢d@ "¼2î Ü„wP.&B†‹Ðr*5kògAž¨XË å,˜ˆÐo²¹„àÀ¥=BÚ9j!Íž )'ìGGŒ}–P»‘ʺÚØÁ~S1+M6¶óÓçLxØÎÄ|ÑØ<\Ì"˜ñC@æÓ=TÈ9);“rq65«Ö· Ó˜Pй9æbM­ËoDy¨ú@b +\%Ÿò°y3"¹˜8L™­ÿñTŠõÒÝýÚÒµòâÕHmcÂÍ ™0ƒšpF +q&TX ¥ºT0O‡K:¯ÓŸò§zbvÊ,:餓I¡ŒÑÉVËé=ü¡Aý¸ÉãðJŒ\e£-³'4bÀ½Ä«ß}¯9½=¨uš–MÀ¹ô’\Ø «ýÃ"t¨ÉË—Ð!0°ÀTF<äæ’^)PJ“ËçäÚÌFÛŠ?Ù ÔšG†IA#M.6¨v™X_Ë,”c®C8+>rös0h³[W¢µ%ŸZwŠY‹?f£d2”Uª‹DT€f@kbåyŸRÔ{ÅÒ-(ðá…U!5­CYB©…«[¥¹s™É“JyŽŒ”ôÞ@¡½°°LÝ©q;¹’WéÒ±)õ?þÕ A°¬rq “RZ»—ñÖ˜æêåâüAª³å×Eµ¶¹}qÿÖ€™°ÒI,ÔƒÇ%§16oB‚F˜DB¶ûdè ½‘&ny#]¹z2Ú8ee#6‚gÁ>¡\B ÕŠ +(›ñ2¨?er‹ƒ£ÖQÃêá@‚ŽÔ±`Ü…q© õ)uÌN‡Š³ReÙŸ™v²IMFTdäR²±ådbƒztÈf#KEZAP™êŸ˜êo1`v_4R\<®C.P[jk Úf÷§4΀ÆNCX0¥à!(ÏôÔAaîB¶·/W\lA‹†9î€:a' n?üy­²z-3uÀ¥æÌÇõ˜‰\BÊ-$¡LX¨ :bÄ}bn}÷z(Z>1êpù¢P}(Ÿ÷p…þ/"2d$`<•ìêÏ \fÔêÕ¹ fÃ|²™ì­egÖ•Æ´RŸÊôÚ›g&wÏ—w‰(`ŠK¶p³ñŽ›‰[p½›q’A2˜ +Ä*l²FFr¾X>\으òHsã@®ô|ÌLò©jª·(ON ðz1–ërñÊ°Áíf'wùÈøÝÓtfÎÂÄð`\.÷˜T•I–\’ªó‰!âOe³óËr{ÎÊGlŒBFê64sdÔ8a'ÁZ€Ø¥»{X0f'¯ÐjÉÉʸœ âTJr©jyfµ±¶K§+F_Ž6ýjÏFªã6ÿá!ÓÑ‹ÖN˹Y1 &'iôˆ`Ϥò +•œBÃ5«? ºled!SÅBñq”ÒxYw0on:˜Ôˆ‘86l¶8OñÐQ+Ô:ýcÆ€IÈÚéiH + VBšß½ÒÙ<Ï$ËÇ,îQ·Ÿ”˜´Qñ£c¶ããŽaföJ622lô~µã €‰UŸÒ³ó¬:‰só»W»ëg•ê”ͯ Z1=Αñ*"ç'<~W ¬T!,#B mðHv&—îœ+Ï]fbaÀ†Û²ª˜éB4ðJ"TòÉE¨ëXs9ÖZf)Û åÂÅ>9=¤õüÃá‰oœ0¹•‹ÔµâÎí±›Æâ'ÅR¢²),#ÜÞ;0á²xE˜ùƘõŽ1ËÓÍåⶔYöø³V?.“¢/4zK;sg·/ܸòàS÷>ýÒS¯}û­þôÃO~ÿç¿ýǧ_üí»?ùðàæSÙÉ-L*ô·¨}n2KµRùV¦2•o/U§–¦×v7Ï]¹öÐSxêô}­]ºyòÚíƒûŸºë毼ñÎ ß~gj}vã|¼:ƒ‰I¢”"­ \Œ %’Õnsvezu{ýì…37î¿ûѧn?ÿêÞ½o]}èÂÏ>þò·^ýÞ»ß~÷ý×ð‹ŸÿVoãJ™qAë ^^Œ–C©TBéByj©»~º±²“Ÿœ«-®7W÷æ÷îºÿ‰~öþGýæ÷ßüÞO]{°<µ!¥š:;£³±F§àÀÃrª›¨,;ÈðˆÉ‹sñÒÔz¦»­ÎHÅn¤63·{mÿžG¯<øô‹ßúþ¥Ÿ>wß?ðY*VÖºyƒ‹ÓX|`!H±HAfæ>YHTä\=QnfÛ Í…S«goÜzüÅûŸ|þíwùÞÇ¿{íû?=yåvsþ”Zšõpi°‹z;a§‘@ãÓ77acìDDJO%Û¡|WÊ·Ö®?ôϯÝÿì¿\¸ÿÑ+=wþæcgïyøê#ϽöÎ/{áµ»n=¼vá^˜Ö9­Ýç¦Ã´R哾`INwX¥J6³Í¥¹‹é¹õý»¶/Þ8síþ—Þøîo¿üÛïþø·/þø×>ýü§¿/Lp×xm„Ê«3‘üÚ˜™Ñ{L.†àÓˆ?mò„̨ࢄ‰*éÆâÖùÝË÷¯¿yþÖc÷=ùâÊ©«¥Ù³éÎ.dŽ#_;bÂ)¹\Ÿ™]>¹}êâùK×yâé×ßüîû|öÉoÿË?ùðãßüûßÿýÓÏ¿|ã»?zô¹WgwîR[›L± RP©°bB‰¥KµîòöÁÉs×Î^¹yû±g^ûG¯ÿàgϾñ½Ç^|íÛïüôç}þò·øοþìoÿö¯|ïç>÷æêÁ½`ÆâåùÂäf¼6ëdcÙronáôùó·n?ðäs/<÷Êëo¿ûÓó‡ï¿÷Ñkÿúów~ñÑ—úÛÿýÿü¿þå~þëk>ŸŸÚäM L'ΕT¶Üš^Ù€ÇâÖÞÁµ{yö¥ßøö“ßüÖ£/ë…7¿ûã÷>üõGŸ|ñÅÿûÿú¯óÅcÏ¿¶{×ýѤ/xè´ïE+k¯lu8)Y¨N.m¾xÏí›={óŸ^¼ç‰^yûÇ?zïãŸüê£?ýõ¯úÛþêÓ/>ýݾùíwçwîsˆ E6Òö +y.ÕåÔz¡9?¹´½ºwþÚýßÿä??þÒ·^zó¿ÿÉ{Ÿüîçýöן}þÇ?ÿå?ÿ×Aµþè—Ÿ½ðÚ•âì¨Õ7¨÷sŽY)"8•–‹±|{nãÔ•»úÈÿôÍ7~üëO~ñño¾ý£_¼úýw?üÍçÿî÷?ÿàã?üñÏÿýßÿýéo?îµ·v/Þ çZÒXÝcf a!–¤Ê3©õµ“/Ý|ôæ£Ï¼òÖ~úëO~ð³÷ß|÷g¿ùßÿúïÿùño?ÿèÓOÿíßÿýg~z÷COzë±ê*ihûç³y†4(F+¸?"DJ©ê\±½XêÌ/í¿úàãÿüÊ›¿øà“O>ÿò[ÿúÓ_~ô›ÿüßÿõå_ÿþüß½ùèSçï~Ö1¾äÁ…zsvniûäÞÁ…Ë—¯Ý¸þà#½õö[¿ÿýï¿üóŸ?úô³÷~õÞ˯¿rþÊÕéåõH¾Á'ÛVoØèbQŸ„S"/ÊÙ\iuc÷Ê=Þxðñ[?ñô?¿ü£Ÿ¿ÿß½ÿúÛ?øþòåŸÿ ºóÒëßyù·ö¯>ÐY>›m¯PÁŒ¯ÆKÝH®N•:Ó«ó++ëkW/_þÎwÞþÎ÷¾ÿý¾û᧟}ñ—¿ÃtüâƒO?ûÍoÿö÷ûì‹/Þúѯ=ø`gyGHÖI)Cˆ Š § õÎìêÖþ¥Sç6vN]¹~ãµ7ßúÕ~ðéïÞ}ÿã·~øã÷?úà·ŸþÉgŸ~öÙÇ~üÑ+o~÷ÜÕÛéæ‚“D8 Tƒ™7ÇèpPNå +µåµµ|äMhÇ~þâ·Þúé{¿þòÏýëßÿãWøå—_üòƒ^~õÕ^}}ùô&Z¶û"@V”\â 1Q­õÛÓ‹{gyò™ç_~õ…×Þü—o}ç§ïýêoÿñ¿~ûå_~ñÁÇ?üñÿøå—Ÿ~þÅ+o½sûÑgrÍU&™Éq#¡³ûͨ‘®Î' +íåÍÝÛO<óÌ+¯?÷ÆÛ?yÿÃ/ÿò×/ÿúo?yÿƒ?ýôË?ýéó?|ñ‹_½ÿñ'ýâ½_>øäSg¯Ü +gë8ÓØ=c&”‘s\$Š•§6¯ß÷ØoýëOÞûàŸüì³Ï?ÿòÏùø·¿ÿÕ'¿ýË_ÿ +×y÷§?þÉ/~ö‹÷ßèÉg7/Üêí\Ã¥Âq ªwpeuÓ#âÂØr{~çì¥ë·}ñ·_~ó­o~ëÛ?ùù/ÿþÿñ›/þø“÷~ýË÷~õÁG=÷Ê«û¯Î.ïòñF¢¶Á ñB¹-Õé\}bÔRkfrquáÒµó·¼q×µ ûçÏ$ò)F ¸pÒä",3f@Ç È„ u¡~)O%‹åJ«Öj/­o.n¬÷f{'÷7¯ß¼xïý×®\=¸ûÖÖùË•é9VI’Á,—è‘¡¢ÁNš¤ÝC»<>’â6vîš[?M$‹ÙÔÚêÂÙƒýë÷ÞóÀc·¿ÿýï½÷ÁoÞÿèãO>ûø™—_ܽpP›ž„ãL8ë‚èŠ,KÂëÛvndÓ©r£Ýî,ÌÏœ:µý쳿óÃw>üøÓÏ~÷Ûw~ôηÞ|ýÕW^~橇oßw÷ÚÆv¡1¢9|2d@ùÈ5Ȩ Ó[½4-$ÔØêÒò}×ï~ýÕW_ë­×_éç?÷Oúà ÿòÏÏŸÚX[,Õj±jè1“ÛM…àaõ +¯à"”`‚J"WjÎÍ-Ÿ?súáGzö¹§¿óí×õÁûŸñùŸÿò§÷~ùçŸ~üàÒÙL)oE|VfxÌDеŸw:P^’ó!9ÝêÍL-,nž>sæ⥻®\»v÷õo¾üÂ÷ßùÁ«¯¿öÒ‹/<÷ì?½öê7ï¿ycgk'–*;}¢ÖEÜŒ¢þh$Ûc匡BJbiuçòõÛÏ<÷Ò£ÿÓå«7ü©ýøgßûÁ÷î¿yùÉî}âá‡öÏ]ZY®Ô»‘l;?¹ËÆš_-‡ö‚.œŒÆˆZd,QXYÙ¼rõÚ7_¼ÒO?ýð£¿ø ïþä½gŸÿ—+Wî™_ZK*qFçbÇø¸Þa´ãéðÐ~9Î4‹Í¹Ö캋a föøt.ŸÆNÀ<:Hi‚:6>ªqZݬÃ+š]Œ ãïö€eƒÑ,''ÍvÄèp™œ(ê 4ï•2”4¢+a'Â<8lAéÇn;0Ù +ÂR¼·‡Vp¹ÝGãÑd.ÓèöVvÏN.¯ãªÍKšA£kÔ‚i­Ý?j&Æ­Á«HeÂvœÃI E8!(J¡¨SIµP©N-ð²ŽD+µz6“aÎæò™QÖŽK¨?Î&:®@âô6Ú/}lšb…l)•H)!IIó‹+Õj>ŽU›uY-@#=þ°›IXÑà¨Ö:‡&l'ÆÌc¶“ψÀ5´Kå§"ñBRÍ^ºr÷ÖöN&¯W*¹|¡Ójv›5Y09<‡OŒAÖºè á—qS'>B„1#È)%ž 'ò„?h¶¹HZ£NTÕT©Ö˜i4§)†Q¢ –¸< 3qTçéÅàÈ`‘”…2;}>&ŒW¡¨I.il¶–¯TgÎR|Ìlµ¼&ülÐŽ ("¤b¦{–Žt‡õÞÿãëCF—à ‚YÆp.ŒD¢Ép$Uó ÃyÜÜKùùd@Êò᢫kû›X^m¡Ê×èî˜8>f +59)÷òµ0µ°wKƒpoÑ@ãs`$ìdÄá‹êÝܱzÂÔÞqBwtÜ6¨q[¥bp•r^FuRÑþ™$flØ„½’ S ˆäa’6L:¡sŒÛ¼ZcEX»‡Õ;ˆ +áð«H0KÈEJÊê˜Áƒ²z$‚i“Wµ‘v_ì¸ÖýšÃ£ðº&Tìo¨!‚NZ·‘cÜàòÕ3nñ8¼AJÌALFÕÃ¥¬˜Àˆq/'ß9¬96h2:9„ŽÛð°›ÍùÕ'“Тz'cpÒƒŽÁQ³Fk›0iÌf;ÎJYœ 91¿iíì° †qƒ7òÛqÅàðhÝߨ…µthhÜÁ™1Éé ÇòÅsr,72¦Ç!Ót’²ãGá +CÆ §ÝsüŸ‡†ÚÞpט‰Ô¹8="@{ùœÚ6{Äv&\ýÏC—‡7Ú}F+Qko DèÎ=\ÊÊd|…\ªØ¨¨ÆÍéPa؈ƒÈRJ‹Q§¥â†R^OO0ñÉAâDéx¦mv³_?2>Ø?Ñ‚óËõÊô¹Lû´ƒJ´ ŽZãéž Ý1dÔcã X‰–*áÜ‚”œÖðA£á vfÔà5:Y"ÙúKÝú‡LúcÝ£#Ž#cæ£ãÆcæ ‹ :hÕÃgÄì´‹RåD7’ŸÁ„ Êf,Þ°•ˆ:ý©þ‘¡¸¢Cį¿cP߇wyÃX …q§/š(,ªÕÍ㶣£æ á +¤|‘6!×Q>cBxœg« n6ulÜv|Â:¨s6˜[ò'§I¥ƒJ”ýá¬ÎIäF->;d¢^©¡”v-^å¸Æ©·ûdµaB¸Q3>¨wꌘ„‹yB,µ¥*³zƒ<˜_1­=àôÅ‘º3;:nÕ;yJnÐJÍÅ$õÅéÏٹǂ‰cfìkÇ4w׌ۀ‹Æôn§7ä¢b¨µ3[àë–cˆÎÉÑ°Þ­ÀO4aò¨‘0yDHýý“ô´ÞÁþÁÂQVmIÙžÙ+·Ÿ³»qydÂ}ç1ÝCÖ#ãè 7ºD!:eFä C:ôð À GÅ oóÅýñ©@r^çZñGkBë`ÇuÞcƒ–ãc‡'”.­">e`tUAø¢Æ-M8ø ;ëðg¨h7 ¨d'BR’íSbvÉN%6ãvöؘæÒåî8®·Sq7“ÂÙt@*Â3ƒäG´=Òž>å £z¯“RÍDÄåOSJ[.¬ãBeXëAC…ãŽã#“Óï¦Uo¹iƒŠt1¾xç݈ò^>æâcGµŽa³ï«S@Kd¤Î''3ÝÝPaaU,X@ùmQÑŽ“Ëë0eÂ:¦ñ h(±þÿa§‹ˆÙɘ“ !OʵÃcŽÓ€°6:æ‹w|nÄá7 ¬¬–{Ëg°Py +ÊÍYqÉŠ÷˜TOØ(£ƒXÚ<¨ÏÔ:}&$ðF9·?ë+D¨ ÿô21N)ð™†ô¨ÙÓÏSÞPKÏÓÑ)W2Sþhõ˜ÖÑ—`mÅCv<Œ “2¢A¥J .bȈL¸`~ hX‡ÈZWMôô(ÇÉèf¤4nÂ4/õ ˜t¬‹0éþ ØÆÙŠGõˆtdÂ1bñ™©í„ s(Ÿûê˜*ÃÿÚ}Q7£Žšû›n¼\¡“_»sìÐ1 ô”Vº^¡bDBãfÿƒ4ùãÐGc6zܵQzD´’ ¡Z¼‘Úì™dcÙL„Üþ$êϺ}*B%ÜTRïÂ_1P‰¾3Õ?`óë͵â=­;¨q0Ÿ6±¬^V¥Æ)e*X$Å’ƒŒLX“GÖ°õdž­ƒcÎ#ðSƒûÃeøà ‡ñ™31f!56`ùõcúã£.*™=Òÿ¼cøøˆÙîáÁí ¨Fÿq½ï#Ž;FÝ nók—j+uÄƺƒ¨\‹4÷ò³¸T·sn¶cŽRVRk÷êûgBYÝ9ì<2b1z'l(ˆ 4VzH‡I ¾ÎÒeŸù‡#Çûd"С–Ë—þj·|hØ1a!î8®1 †þEQ‡=¡X9Ý¥c•c0P˜dfT—ñgf]Á¢Qépufíêêå'MTÄJ†}JÖ‰™PfžŒõ뽨/Zïîbñ'LC¯íï¯ D;å¹Kj}[JÔVNÝP¹„ŒX˜ ×Ö•úf´u2Ú9G;v&Š×î{äÅòü>”¤ÑÐ#¼“Q¾(¤q©>ac ¨8Ô?W6ä¤S:c¥2®@‰t™xGãô³@²µ£Çà•í>Õî‹£l–cåe\È@yâ.{¿Zb…kf&©A%­[ +6õ×Ãk]"ÊåYµëa^‚ çŒ(×? ȧ®Æ-P±ƒŠ›0ÉFÅ\lrL±ÃFì8H§A˜Hѱfræ¼9>¦Gu.Þ„ˆfoÞBëf'\œ›I"tdz@‹üã€éШcÐ@ÜA·¿@k”ÒÄ%(²‹…>ÆÜ|ÖFFônÁF(ðºrEc£q:röÒÄúÚ1Ýñq§Á-€ƒ™táãÎ +…±)¨§OƳ3¡Ê +oÁT¢bÁN8Ú°áÊñq÷ˆž0!a§/‰ 52ØÒ¹ä!#åÀ€7È k‘vtÄÞßtæ +ºè\@”s `‡ ˆ*ý³XÝÒ°žèïMFe\ª©)hÉ%h)>d°›Ð1`]oØ‚….m¥cã.•Šv6©Ãef†ì/ÿ›ËöÎf§/ˆÅE›Ó=.ÝuPŠ š1aÜé?jð¸éxº¶‰¹ÃÃV‹'h'â>±«®òéÉh~zýÜ®` eãíÍÔÔ~zúL¤¹ªn¸…¼+/7—¿ùÆVÎßÖ¸V,ˆ yBªIÙÕHyÇ#Vh¹ªÖ6^å„·ûRX¨E©óÁâÉdï.6»hÀe &°Ñš ØÞ²’6_”J¤RusY&ÞMU–Î^}²ºpׄ²OÍÌÒ©9o¤K«³\rœ‰ÖÍÃ+ ˜lÁß7º$%0fñË©)æÛÃFÂå‹€4€%ð†ª>¥¡Ö7åòª…T4 +B Lh®/\Q’›{N©â UÀ^žÐyFŒ*ÐÑ&&UøÔ¬”™·‘CÖ£ãŽ3y|Â=fa€Š0¡äŠ(_²Ñ)$XÆ•¦'TµøÂð`• Ã5J.óÑZ­»aÁøq›Ñ€Ä„0)àäã÷‘ Îg½ä¨Ñ3¬s!Tˆ—O÷\B–Q{ˆPB¸\ ÚtûSý“¬PÅJ$̘bôD4Žà˜•³“ e%; º†ÜŒ +cмqåÜÿbŽŒˆŽ¼´TÔ:ÙÿyhäÈEcaÜt +ò*“[ñ°¨¶üræÎ!Í°Á­w³æ¾’,d ²—šKtÎø]63…Eêd¼íKtùÜ<mƒ»¨UW®Þx®´pæȘMçdÌýuƒÌ#mÑ‘Ö°™ÐZp‡/6á`ûßÐáò#\’ËLÉ婸äd0ï©î–[Ìz¤©ù“½Hy5ÛÙ­ÍÌíÝïfcÃFëRzÎÛ?±9 3ïJ.®à‹öÔÖ~¸´ IöðˆÝBÄÏ ¸X²‘`•ã›'Ce  ` À’®êêæ`R öX{ÔLþÏCÃÃ׉q'dÛq¡q°.‡øÓ6ïòÅÇÍ ÑþQ#&¼®»ßò’\Z•–kÓgÎÝó| ÞDøL¤¾-ä–ÈH+ßÝ/MUj›#.n@ëv3 0¨@¡¤P„BèÃI壟™HiÞNE¡¿ Dt¼É¦¦‚å:1ÉÈ¥ZogÿÖ‹„Ã¥B¨´ol…Ë+±æv´±ÅeæŒXÐ'å9µ9¡ÏèìËÁÜrsóVfæ ®wÐQ'8l£Œ˜™P¼áf¨²ÓZ»%$»\²./Xéðq½ËJÊD»±v×þ½Ïo\~2?wÎ#åµ<¿s·/V?f"Àõ ó¡Â"&·åâJizÇ'ç´.A©žd“ó.Ž Õ!hú§ÕÔÊrª¹9lÂï4Ûà|‘š'XèD²™Sð¾ZŒeÍüÜ™ÊÊ…Ìôn¼½ÍçP)ú£¿ð½Kš ñ„eS ÑîÒÚ÷EºÃ& +¼b±±2³yÏ×OØôn t¤ÆÉäÂ¥ÌâU¶´¦%¢þpéáçޞݼ<†Ê-’Sj÷ìÌéG3“4NþÈy +8¢qŸ0cNûË¥ ALÐY )»˜8„V&Ñ‹¶÷R3çëÛ·[»€~ 9 +]´3feúG\Bc¡ãƒ&eRJay¤¿n1{eÈ 'ñŸ‰÷4Nöð˜sÌBYñ¸;#®Xémƒ…«À!õLsiéÔ :R³Ó“—³si—hÅªË g妇­„ÑJMž%#ͱþIÈ´ "é^¾½²hÅDÈ»…œ[,Rê4•œ’Ê ÅùsÛ÷<—›9sXƒ¬øSd¤í¤!C×à#ýZ.à|úŽëFm ›âsTlŠŽM› ÇQ.&f@y3š>ycçú3“»·J‹—ýéy->¦ísúž—Ã…%°š<êu,x '–´ˆtÇ Eï¤cù)’O9¡û‡;†´^W°Æ7ÅÒ¦T\w)*ÓrÂʇ ãèñqÏq ¦±³à¯4öTeqr¼÷˜í=„„‰p#x¼«EEL*ѺMÙýi"Òñ„Û¨Xv +FGݾ°ò ƒŒ€úKðèWÕ?p̦7UZ–s“w Ži]—à•*ñæNjêŒR[æäÜîù‡KZŒ—òóÍõ›•åëj{¿<©¸p™ˆ¶Žë1´éáÒfß÷ÒdÌÁ–Èp'RÝò†Š‡„õ;Ûv×ä)lL—û»#ÝB 6—è¢lç™ÎFnf?3}:Z_n-_¬Ì£•«¶RÝtg'7y’JNêˆøˆ +$ ÆZ‘üÒ€;6`b‰ŽOR‘Ž/Òñk'ô¸ÖpQq€4(˜"!;ŸŸ¿ Ìtå¶.^ü*\³1V\&•ŽÚÜ?ýàÖÝÏgç.tÇ´î0Éž ŽÙý‡'pSByf·ÐÛ’²Ólf 5| (‚V'³³W̾Ԉ%àOô?QýÿOWpôÄ‘1—ÉŒ——nö‡‡¿vçˆF@(Q‰O¨nÂ#G5¤ ÛéÌÀzè¨vÜâ×Øyƒ‡e%¢šþ†ýH¸²‚‘hvÒF†AŒ  biƒI/‘±I±¼9£oÁ»:Ø,Ô`ž™°ÒVFïà ¶èì¬Îæ_ú!Ë¡!+$V6Ò蟸>b=¡C‡!^DÌ“‘­ˆ‰Z¦¹ aã’Õ…óÕ•K‰î6¯¹1 1zû§“1rÙ‡´’»/2#—O%Úå…{,ýß^XDsÔFi\'#FDƒeˆùîf¶¹î$Cv+͵7®/<º|þáý{ÿ%ÙÙ#ƒåÓû÷]ºïYLÊšð‰R©̯f{õÅk6_úÃöÃÀ!T’ILÒ1È•Q¨î=f²„nÀm2àBÃU'“„ØHÙhy¡´zÙÅçu.Q­lfÚç”ür}þ Ñ_\·3Pþâ/Ñj÷˜Æ«GÃX?Nº¹"ÔX};‚r#1j%Á:ŠÙùPq©0szõÂû©ˆ¶6ÎÜë [`¢íPnV.¬bÁæ€1y:b@„¾™séI.­&'÷ÀÛ \Æê J©Ö¸Í7jõ´fÏ>ÑÝ{¸¸rOrúÀÁåïrرÈÊÙÇœ\òÎ1û ™Ò¢0 p‘‘ÊÉHuïȘóð Ý„sö?o±[é›î`‹Œ:îÞqTï6£ì ®Ü„™ˆ:Ùœ7\k¬\^¹ü”zÄ&Í €J†+T¬I©½@vÉŸ_³Ò2¢@Ì„r^È |Ž”Jàú ì±1ë'tG†M‡†LZT}ÿÛm~ƒSt-ô†4Ü+d©h]ÌÏ‹óñöIrò"$µâ E' ñVÆ…4¼ŒQê‚:mDeF)ÅŠ‡FAJcÓn& µ`ö„±@ ¤ŽO¸ Ø!†y‚}‡€ Åp~ž‰Tm^щ‹hžŽA¥ôÒ3»¥…ƒxu%^X˜Z»-Ï:ü1>ÙSj[Øæì‚\Ù¤Ô9³BSÄ'•¼|fØDŒC64‘}ó€H(‚p‡òö~¾5|í„ÆàfÙXGL/Æj»Í{©H ¦7®ÒÓÀã6ÚðÕæ„I jWmlÓã'4Ε¼biÄâ»cÔzhÔ:f£1!ˆw-¸lt3‚ZsÑ1ÑÓó:\*ÎuNAØѹXp°ÙÎI$Ö;ØQ# ñÿðˆuÔèuÓ‘q Ñ_Á ÝŸ ¨=B©Óñ6,yBål÷$|îg[ë©Î6µté™ÌÂ%_jÞˆ•Ò½ÙöüyŸ\Ѹüæ«D¬Ø0IŒVm˜ ±bŒ”¦Ä ;¸G"9né0¦1 9bÄŽŽZûGm[i[ÿÚºWèß>3zEŒKdÚ+µùÎúÅÞÉ{¦¶ïž?uouñ‚\ß´2±di¶ÿÁ)×¹<˜÷…›(_õ)=‘ÃlFÁ$›M.ÁÒÿê4Õêê~£‹3Þ@‡ÈÆD}ÁŒÙ+Â{9ü`RÞðÿÇÑ{>Éqi¾ÿÄ#‰@í»|U–Kï]¥©ÊÊòÞûîêjïÐÝhxo z/‰F$%jFÒPågFÒŒvwfW3koÄÝ»q¿ÞSŒÈ`4Šeòœ|ßç}~™Ç4Äx3×Úغðˆ1ª c‡uy¸ãLMÏ. +Ñ.&¦½‚–hfj«“.êÙQϤ‡wbn€ŒÀ•pr¬^šÙ™tSãÎვHi½0¸X^º4Ø{!\Z¹_ênÎmÝœôp.X0 ôÒ´›r#.&A6¥ˤš‘æé‡èhC«mf—oÌgûók¾ÿÓ?(©þ8B•¦”YM4¶ön¾³uã]:6{lö“QZ-ƒ\¥ák‰É¥³Æ¬˜p‘0çãN +X8P§&½Ü€)0ê–¬>UŒwI½0å¥DO‚x°£ $¬~bAÀsBƒbŠ¶¨H]Éöã ¥4¯•—c}©¸J'ºT´Zìîv^äãí ¯` hn"Ž‹y@¬NXÑAÑu’£.zâÜ°î +„¸®Æ+¥ÙM9ÙʶîÝŠÖWÌƺRYÇ¢]ŸQÍÚâÆÕ™û^&vÚ‰Y̧)½†Ê9FŽµfÔ\¢4 #ÛêX ÕqTÏâ¤O œôÐ.ä8¨¼£b¸>å4)1Ñj®µþô½~ð7__¹@†‹ZqA-.çŽÒ­­úÌÙÞâ‘`D£ÄGël¤ÎǺ°Pœ‚äð±±á:Zˆµ‘ÇÇ}ÇFÝ£Vx¸>*ÅÚ•ÙƒîÚÕ1/mÇ4wÒQʬG«›fm›µXUg¶Óõ5¢Xý¼¨7óx¡Ÿ*ÍŸšðLÃà„´×Çì$Ðy¦RVN´ÉKD@ +zYÍ ¸á˜º¡ÕH9[ém×çÎPQ„û)Ãîã!4¬/„)ZºrÑÓ“SüŒIêe6ÑÒ³à{ü¤Ë6ö/>vך±Úa¼~ Ç{FvNMÏÄÜI Î*ùTiXÜcãž)Hò:2×YÔÚ|6Z§¬8­æåhÙîcÿê¤õÞÓ.ÞŒÀ|AÉÌùø¸›Ö­Aá™Ópœ²!¨’׫«ú(£©UÎ(…UT)ÙÑ­p©VØÝÁ…ùýGÛ×ß9¸ûÝ¥sO0%K„²°˜ñQG#üÄ842°ùÅ1 ‹i`‰Ç<츛uøyP•¼”BÙÂÌ™3—^ª­9h•űº™ê…+Ãq¶©øõá‚RÆÎ×PòBeàQ3­³…™#Æì»yÆä"¡Ö`(mxܯ‚cÒ'{ ºˆ§ÕÇŽ:,(©öÌæÕÁέT{cfýâò¹{\¼‚É)%;+&;³›×Jsç¼lÜ…I|$3·~É,Ìò`š¸°¨—L`bB5wP±F‡ËñùAwžöXƒd(¯I/,†óJÍΟ¹]èíyy“ˆ5’³ò ×@£Äx»·v5ÓØÌŽ=¿Î.0Úׂѧ¦ý}Ìbó° ,^âÙQÛ©idxßӀϜ„X«WÞ‚Øç,~7FÅ,ð Éú¦k€X±bÂ¥I'~rÜë ˆN¿ŒGŠŽX‘1kpÚÞ`LyPGNÚP`'˜PŠ–bŒšÆ¤´šž9wûí¥ýÀ¶Ø4­Õ@M7+›˜ò2ÆE¦}¨zA. ªr9”œ p©I'A‡âZ¬Î_œ°peÎæ“N[Q:æ"¬C©”NNzÇ0*n4ˆ$¢ä}bÊÏ'1µ R/ÖÜb¥åƒ»ë™ÖVeî µq½²|Y/¯âJ.VpѲÕÏzquÚË‚Ú1aG‚¤AÊ9Ñl?–kïº@K-gP@¥L´¾¶xîÅÍo•æÏß|õüƒ÷¥lß/¤a1²T¸¡d—S½+Å•{R~‘3ùÎ^¼µ-¦z[<ÃÕnUfŠfßϤ¾9êþÖˆû„ ¨ ¼"•,ÃQ%\ʙյ sc²‘Ÿ]?¸óðõ7.½i¬ý´<عß۾Øe­I©ÙÊÜaº±J´bÅFIN»± e"bÖËØÅiH²Ãº7L\÷c#®1 lõÐŒVc3h¨à³j¼Þ_¿Îv`ÉT +ýÆæ­þÙ&f/Òñž5JäÛWžB\dĉÚü<(ˆiz sÊÉzW +ÁÙÁ™[ÏŽ¸ž9id“bz@EàR‚¢–®.Ϲ xÙDLÊ…$"$ý„.™5DLŽÙœzÔiˆšöп4nCˆ¹`Ùƒ„NŽ;܈€K «—‘–¬Î÷6ª\ÖÊk™ÎP*ÈÇÆ¡ƒõËP\ì´›sãQ2ÒDÅô©é Hrø÷ð¥ t‹ ·!§§(ÅÅÄ7OLãøÄ_›8vÚ6bCœpˆWóà”råpº;íÄ85kGC˜Z cm9· U6òƒ+¹Þ^nëû?ù‡åƒ{€ •eµ°(UH-C9;"|¼¿zÍMEŸwŒL9-ntj¸» Œ„)ÓjÔ}#Ô²˜™ÉöΔgÓõ¥Ë·_>w÷51ÕB”B¤|&\\ÏvzÛê+·ª —…DÏHϬ½CEÒVŒwÓ&4\O¬ÈÇfh£ëÀ"“>!œ0F}¡1_è˜;í$g©¹9³H+…õÝ;•þ-ËÙár.™Ù‹µ»Ë‡/ïÜûnfö ßÙܼøPÎ-Š‰6m`rÎ?ÜŠ=‡Š`‡@®¹0;rî æ|/iN>‡5R*Œ9ˆc“~`2!* Š²TCÊüÚ„·1-‹HIÐWn:Á˜íÎÚúà\¦ºœ®Í“TSJ¼aî¢Øá°Å';ƒ:JÇóµµrw÷Ø(ä ò² ýIÕkˆVñs©Z¿98: KNÔÄXч{xñ±:,ea&ž)²µåI:á@A9H P:ƒÒ„ ›rbj¬Í´mEðfe°³|ô`éüc¹° U™5»rzà&ãß:íµx7©º)–âL¼¬{kû^~ñ™è“ѺZ\Lv‡K"¿÷õX •Hy$¾‡3G¡áú½6¯à +H“NòÙáöUИ÷º›ŽX0e2(°±*—ªûe3\^¨oÜŒ·w’Í3ùÙƒLg›‹–€††XJ¤Z +pI`'†7Òµ\¹½vöêKb¼õìˆ3À˜à:\ÕljGÝTÂÏ'Œâ<Êœ˜öL·"DÇòƒèÚŸ.õ–¶ÎW[B5Ït¶Ÿ_:zº°ÿBcåbeñHÉ÷#©ö“þöÒ“O-XØKDz½ÃîæƒTó(Õ<'&ûvL4I·h­0ñǦˆãÓĸG¶£± XŒn>½øàmžðñV\ópIʨg;ÛùÞQjæ’/TôцQ[ZíåÃéö|Ú‰ë."R\nç±mÅ|€I¸QTXP‚¤™°Y껉ˆ-¢Z¢½Sœ»0·s§µzuøàRK_¼þÒw¿øªØYŸ€DêúÆ1ˉQI7f㳌шWV8£Ši%:Þ%£m:>Ãg¬°DEŠFyd«ÅÛ[¥•«íí»­ÕÍ{Ñî!—îÙÁÎùÇËQ­€i•øpTÉX&#sÃíÝäsSéá“zÄŽMyY'†¸áÊ3Fe)\™O·–î/>8sõåÞÖÍDg3^.‰}"4«o8ÞŒÔëù™s•…+‘Ò*ª§ý‚ÔL€( àM¹@F:bz5RÚd¢õq?åã‚|@ͤ— ÈÇ[Ñòbª±þ+&š¨`¦Z…þÙ\o'\\2ëëfm3‘TsãðöÌæøo¬—²Itñpc¸Ó¨÷¡¡3‡÷’•¥)¯J˜›H@t °c¥ùs7ŸÖæv¡rN*,éõ3åÅ«û·Þ½òäííb¾ÔX>stŸ¥AŒÅ«gJ‹·ëkSÝ«Rª„)û_L7¶NX°QPa=,Ä$‡…µ²žš9ò³ÉRk½1Øï ò)<\%F¬² +GfæPÏõ!Œ\¤zÚAŸœF‡T.ÙXONÎ9uÒC³F5ÕÖtTÌ RÓrJ£ÕT}… ªK×®¾–éF«+T¤ì££¨8³qñ¥o~Ñ]»ä3b|—Kö ìðÑÃSðsãÁ+JÍMx¨¿86õÜd`ÜNX=¼‹bJ9‚GD£¾ `º88ÿtýÆ{åÕ›A>™íì vìßz§½tþàö­Ík‘úReíjzñŠZßVrKƒÍ;û×ßl®^Ô&gæ“í³¶É¦!63jÇŸu˜ôÓOGlA€BL€‹ãz‰ŠTÔÒB¸4¿röîþ7´r?Þ^-.ž.OTßÊô.U—îÄÛn* QÃÇÊ œøDWÌ,0‰y!³B Ÿuáú¤ +©`¨h„%è´œà3—H€â)LNªùAiþRcí:pq þi=_ì Ípe¥½ygëÚ› G/‡kkBªéçuBŽõÖ®pÑ‚—Ó‰HUË +p9ƒ²ñTy^M¶Ü˜æ„ìáæ,.<ê =7H5Ö@96ê ²q8L´ÆE+©Öz{ó†Qßð2æÊÚù»ß—ÍR5‹ýK¹ÙK‰úŽœZœò £NÜëGWÛ[§†›Ìj!Ç'fê™lÿb²s€ ‰K7_>{õy€ð., H¤±qwïÎë7ÞW«[." ô7>øÁâÖÕ©€üÜb (BrA+nb¡ÊI âFBå™ÝDk{ÄAºPÍKE Q‘šš_ +eçi5{tûÕk/~[Mõ1}lÄÜ ø*D•:ò­Ó.WPŒfÓn~Ô‚‚º Q‰á–£ ó~2‚Ëi.ÑNuv³3G¨VŒr©X^¼ÐX½¸}þÁ—¿[èïÈùþ™+¯½ð½Á¹W@½¸ýô‡3÷ùx']Z^9xQÉö&ü¼Õ­BJ À¹ˆñ᪑hÔ€óW²¶46ª±övªØÞ¼U_¿"¦›ý­«åå‹Ñö¶ÑÞ‘òK¤ÙŽjN¶Aå’ +kø•¬G*‚Ñ›g=jÝ‚Ç|R0[ji%ÊãÑn¶aµF†ë¨RFå¼f[„$,ÄüB$Vßìî¼ÐÙ}¡¼|=;{h6€¾ÕôL{þð¾Rœ×K‹í݇ÑÎY6=ËÆ€Xç6.{)eÚÇF+br–¤x"¢6¿€ð1%ÑNé[§¡“S° ‘j6ÙØâ]'¶x8-Ùö’ê4„Ù4 ù£»o¿ófoóF¬´(˜5G€õ +¨SÃèlØ4Ä b*ÝØH×V#¹þ¤‡:6æ™ô0¶-ÈFA§…„³ÕͲxÅh£}ææüù—ê«—ÃåUX.oÈÉ{Oßí,› +e0¹à&Ìi`OÙ KA:’m¬C¶²[}2ÂGÝbc]6>ƒ©=Ù¸ñ›—î¾Iʹ —®/ßÎÏ]ŽÕ×ù> /œt3˜/õ@Öœ² ~À)Z—óƒãÙQ¯ÕMÖ»¯¼÷ã1 r|št±>&ÎÇzzv)’ž!øpsa‡ÑsÎáò\M2> B™özapXš?ÌÏî•)ÑÈuÎôÏޛݹZìñÔ‹ L¼ Ë95ѬÍíóÑÚp(‹2ôó¨D˜pânD“rzÊCZ…x(3ÓÚ¸¹qý¹³«KGs+û?þò·ï¿Á¿ZLÎEªgíý™Û7Þꜹ]˜Ù½òè;lºo#£¡âJræ\fîÚÂ…·.¾Q?s§ÔÝýο{ù;_:)s* NøCS°â²lr)¯ç[›n¾4öNqébmýZqé¼ÑX­®\h¯]ݼüò¹çßÕ0×Ù:¼÷Þ•Ç­\x\^º¢ }8¶“6º6TŸô2eº©PE:Ü\-‘†5(­ê&” ÞŒŽ~}±"õ›t !_Åó|¼fäÛùæR¬º"¦PµŽH%LÈzqõô×»Hƒð`*øˆÕ/ 7ðpŸöxá *¡R +Ä·kW6âÂí°`#.”ñ1!ÎÈ«™nuᨳqCˆ5‚8Éᜎ¯GÜaŽ€èÀ+e¥TÏKöÀ4ÞP¬^aÚC»`ÑA„ÓíÎæõÒü‘ZX +H¹)//…Ëzª`b”Z²)L(Hf ÓvD§NÚ «'ÆüÇOyŽvM8(?¡IÓÀó?óœÃ1Nâ[#®ã“þ5 ±7E)é k¹h¸¼©lÐ’v¨½^$»û¡ì.ê©V¬¶Hj1\Ö„X‰‰”¢Õxk°ž –A 󑮜¶¢ãv4P0Ì%l>ÄØéi bP‚œÉe­´”íî¶W.ÎoÞ|Ô];*Ìî-_x2»÷hóÊ‹gŸÏ´6äxUMµsåíK¥ÌŒ^\ª¯^ëïÜon(¹.Qf.ß}ýìíWÝ´Ê.òɾ^Z_8zupôj²±Ñ™Ûþä‹Ÿ=x-”›I4×Ý®­ž?¼ÿö«ßûÅû?úÇ—>ür÷ÒKï}÷oï¾ö=­²¢•W¤ÜR¬±×Z¿·yíý™½'˜Vc”\ t~~Þ†¨V8^>%ä–ËK·ÔÂbUf6­(Ä:¡ü›l3IÍbÿhíÒkd8+ÅJr²IBÿbeùv¨°éã +Àù ©ëÚƒ"¯gýL ÔV'ùzs–ð¸‡Ãä|ª¹Mi%®!J±±v;7wŽOõØx›2Ênb¸ + D«N„ƒù©f¨p‰Ž”„xÔ + 4À~mßLÖW€0Ò‘º×­ëÕ$\÷ *¸ô¼Ys’® ¡¬Ä›t´ƒ‡ò´”¢åÌ'D³nóK£v +RR¼EjU@©ÀFº0ýÄxDi‰ù(À…—ˆLº( ÂÑ>åâàŸãNò”q164ìcãÃsät(ÝNµ7½LÜLU¢ÅRËhÙ®œ™”JÍš¥e£¼H„LV‹ ñ,˜b²'ç—ŸCÈÅpjÉÎMö÷ñ>Bs£²ÕÇŸšòsˆðáJ)ù)B/gö–ùž˜émzJM7ÚkWŒR?QéG‹³„šƒ9Sˆ6$³©¦:ˆ˜ŒU—2M6ZÆÔ’•.Æ›E5QMTj¶cCäDcC-̇2ýÆÒÅÒ̶™®6Ûƒ›ž¶W÷¥X¹µt°絋޹öä»—¿áÅ·Ö¯<ì­í_½÷xûÊãÖâ…ëoÔ7î67ôw´V®$šg‚B"’l^ùãÖúÕç¬è¨‹Ä”ë̓üà2®dY%uïñûR´jG4SŠ‹‰Î~ïÑÒÅ7k›÷Ù9wçþÓ ýý€”eâX«!z«<¸²zùíìÜ=óå|wkÂ'¬žò+“Bäraæ°è¢ÙhÌîu7o@Mw·©h bd¸ÂÆ›©Þ.Ûa^4KÀORZ\ ˆÃRFL¶k+×.<ùAyáî¢Ç¸MŽû‡ó8løñiÔAF…ÔL¨°(åúB²ËÅÚ6X—ô4"šS^Êdž -)­˜£¾M›uVÏFs-1Yw¢¢’ê¥gŽí³™Þ9B-¹@+ zÒ©FE×l^úÔtr³ã€…1!pR̺ÛA1Nk9%ÝNv·„Ì e”@Ÿ¤»¨·ú „V‹VÏDë»Ã5¯h9ÙÁ´"YÅ嬔hé@(Œ*Èz«Ÿwâsy‹öјÖ%ÅŒ'ËÉB—Q“r$[l-Tç7 +½³<#$ªR®cԳݕÖú€¡æ`wïΛ­37AOJFb>BöÂt½(ç×ο¾qó;éΑˆ^ºûÖÅoë¹Ðç§ìÈ,¬˜nŸ´Ò£6bs÷æùk/9aùÏY¿qÂò—ÏÚžõ;pàyV!<¼_yv‡ÒË\¬Eh%À¹^v¸™!çdép(^ñà!¡ÂbJLϵÍòÜáìÎ9?ðQZ¢¼¤är8ÍjÚ/»›_$“WÓž csëØ<è4Dù„¤_Ê:‡Sür~!cƒ1Z1Ê ¹…óóG/u÷îWnê•­)¡¢hV=ÀÊÒ1@úÞTÈP!VYEC/eÙYpJNTràá ¯èÄu'ª´¨ìnX2++ åy­HðI¬I=’jš…T4¦<ÂG 5ÃÇ«Õ¥sóûw:ëW”TÛÈuÕìL`h |8O +‰¡lã ‹—=mC_?€0%@i>B"À†2g¢¬á†!M…ò:` LJ€Ø­hªYí¬å[k¨2|šY]¼”éí† =6’cµd(’T$(ˆ–€8æ¤(9Ëê%LJùé°ÝŽ‘Rz¶O›KP WŒêºœìÖÏw·n¤ºÛ0kd +­µý›±â<Ì&¢¥Åpq^Nu£¤,@¦1Ãu½â#6ÜT|VI/„ «B´EHIQçªýj ¼Aoliµ­ÌàJ¶!Z^ÊŠ)ç×/ ¶o߬ L5?¼ Ëi¥i9 ªi¸tëÁÛw¿g‡åcÁQ·8Å‚jͨmåµP$÷ÚŸßzôΔƒ<>ê†`þÍæaiã>ˆ;DQ‚idZ* Dj¶¼_yn?ÓZ‡Å'Çg—3e;òàa&RÃä.%=0kq!“6¯Ç‡²‚ìöùÝŒS‰Þ0\Á{SË8otú[+{·õ«i…µ°æã Ž ˆ1:J:¼´ÓÇ©(Ê$()§${€Ë° \JÔJ‚’+ÕW:+—dØË>ÆpÁ!‹‡ž3oÄKsӀ𨷓>2‚¾Ó˜ØÖ3)«évº½¥W¥d¿4{NÏÍ{I½ÜÞÈÔ— ð × :aCâ~¦ÈêMpJVW@Ö’ŠY›t')Û†¦¸PæÓn,œ°8t&%D̆R3Z¢òq`¨°„ GOÏCbŒ¤Ô ­£œ<ƒQG_¥NÙƒaõÐà‡v¸Ï#©W|ÚægcåA¸Ôw¡"ÊG9£H†Ò¼žW£6·C$#'cùŽ¦]ÂO.0„H‰Qs 9 l^8^:ÊÜxÅ ‹¼%yÓ‹©pÕ.­#B‡3"Q.AÉi)’GHÕêÆG&½Aàթȉ1èÔ„ßâ@P‚¥95¯eÊ‹ ‡ŽÝF@d +•BÚGGNÁX1[í*±ÒñÉÀp^Xz¾4±¹y·¶zÕ„†2.pÑGÃBxƒÖsjº¥¦Z¸”Õ¤¨§PFwDŒK€ö‚ŒóÓú” `’7ÈŠC0†S¼Œrºškãz¢ ®ÈZzyýÜöù{‚‘©j–òÝóz~-Ș^˜sBhK~RƒÑ‹Ê0c b†‰4I)ïGEËno_¹òð]­ÛÁKéDñÓK‚Cµ¸ñI; +üžÕø`Ùëv8dõ ND&¥48yDˆi5U[Š×VÂ…E5;³¤Rôº«+‰&ˆ+?Õ³sÑÒ,·@h9üò¸Åg÷À¼¥åø3§ÇÇåÆ€ŠÒ +`7“b0©¸ý„ÓƒàÀûæªv§Çã Ifc÷àê´‡FwÂŽ9üü±ÓÎq ìCU;ÄBàzª/(Ú=´‘ªs»‚žwùŒéXŽ¢\ äàØ´odÂ5mGBöZ‚î $"Z¼¬šEAÉð€Á¿>a=6êynÜ;6œ‹M¹p& åq{ð™'ÊóÑz˜\֦܄ÝGXÏœšrBˆ ¹P"¹ÚœYèIfÙOª?1éôÛ¼ ʃZ J,ÓÍÎìžr`£Vßè”{lÚ c ÅÈJ4Cº–,ZÒä9^i.¤òð‡tS¦Š•‰CTdÔŽÛ}¬;(pJVŠ”ü¤bqcvˆpúiTÀ 8å¤ü˜®E‹ùê\ª:‹1¡P4 rÙÀý¨òÙϘñÀæ³OùD7'Ôª`vBÉ)Vƒ^ÖR¥CÖ(@.Ž5êáÌlª¶ª$gŠ‹æpd ¤ì¢ü˜h÷ãÅá bd]0®|¤N+y NX…C4Û@sµ©f7øhÛ<ƒŸ·CŒÝCŒLº~$àzÑ(RbÂuLÛƒ3ó»gïÀtdÚ‰:<$äç9)áC%/"Ú<äÈ$äÇeBˆ‚®úìGxçqJ‚)ÙD,6‡?ˆà”¢… +eq)3|Ní]ÇÙ!ú™ãÓÓ6lÚŽŽŽyNžrœõLÙAòÊk +Jø–Xºtæì Œ7§¸‪¸¢' `TÄËÖ o…S³^DiÃÆ,ð7Û&„(à|ž=9P*%%lÊê&&ìè© /Î*ÓB&ÂnKò .ÜxnÊû­SÖ¿~nêبd‡Î✪…c[ç®…b¥Ii>JGÅ4®”ƒ|zÅÜÙ»ñâgEå¿xfôĨÝígX).é)-žã¤ðöáµÁÖeÂXüV/cñЈFu.‰Ä ‰ò"£PÎ 2ÃT%=€R$# +J +B9w÷ø”RôDåAÃ1»ÓÉ°ŒOzÎ ,>Ä 8%LJ;.X³¤Sh24ÀŸÆÄ Ó!H„¾t…+H ‘|¬¾Qa7,º<(àÿòjF6Š“nì¹IÏ”gã"M¹p&Ñd.K€¶ÙÜÁ)' ô\I¶õÕ¯ï´p˜Ï·7ÂÙ @¦Àe2¤tLHðz¦MÐífª϶Ý~H:Ãi0!ÃD%$—±º|F2»}t%ˆó£cî À×'m§FÜ@aHÎå•Ã'ùЈۋ»Üþñ)Çé ‡Ãã×T5—IòiÔüú è—Q+(a®‘)ïøtÐÈ./jÌõÌñÉgž´¹&T Ä´ÇÇRŒ6sF¼(… ¤½AÄðZã–À³ÏYž;mŸ˜‚ì.œ~Tž¶úG'¡);ê€X˜2TÂîNŽ¹ž;må” B‡O»Æ-A«›ÆXC 02lw³£°ÛË ³c·#žOÞâ  O2$/’Ùt´Úma¢àÁÅLg+­p2‹‰!W ´ˆ™­tôLãÙQçéIÈåj• ‡,h„Ì• +é¹ÕU-Ÿö¡ãNÄK(£Ñ²‰GÙD"[Zš»q÷ùR{qÄžvŸžt´Èñ¼®«¢$yýU•‰(Ë“vç´Ûã É`,ÊåÍÝíå­ýÍöú\º–V i>J2<Üí׆LdM‰¨¢&+Fœà Q/‚è¶gÊê?‘*TsíY>œŒåZ(öã¼^òä„ç'mö dS#ÓAÐu6,*±b}¶»°,„T  “ØO¨RäN‘Ń¼‘©Í‰Ñ)¡”ÅCx‚,L†JäDä#~T„)”s¤`r|ˆg¨d<¬…#œ(…”I $‰Ð4Ühdæ{T‘òÂ<䣨š' º|¼‘Q2ì r.·Ë㶻ÝNY–«¹x¿šÚT.îÏžÛ<|áÖúæ¢ #t‚yPû*2>ø«gÆ8l. +hˆÍæú)Š`tESE’B¾îBÌ $KÃB3NŠ,SÂEW€99îxæøø±ç¬#Ðèp#ÿ¤•€²˜–•äžŸÄ™8-&§ðñë”FÁçÅÜN;I@z)eÄ™Vb0_+ÖɬV¯ÆÏ®·¯ž_[]ï–Ëf©7â IÌ.;999íôzƒ2LJJÀ]q]ìf‹•X(ÌKºŠŒÀFM¹XÔæ;±7vîß=¼yeíÖõ3¹rvdÊ92 yƒ4'Q”‘ÖTv)²8“i–µDmԹ܃›ÛàøôÍ«¿û»·¾úÅ'o½sy©q¬Ä£Br¸y.e¸H2­VÌN+Ójd#ªˆ›4/ÚÜ^·Rd©\)4f «+w¿‘mõ\(bñÀ£SÀ<½by³‹ˆ¹S“ÞãÇOb(‹F‹ÅB:÷!¯ØŒª” ç/Ôº=Å47WÌlBIG€`Ô.ÇÕdåT°4 ŽD,‘Ë•¢=•Ò:¾¹XÞÛtê™JZ]ŸÍݾºùÂí½7_ztïàêÅÙÙz,ný0äE%  É%á(.°x>!4Káz1ÜoÅöS·v«Oo®¼ÿäàÛþø«Ïóóï=¹wv{s¾V+I¢ìÈq1Š‹Ahbp&*§ÂYCèVÌ…^v¦™[]è\¹°}îìâËï=¼{ýpï°V©™qS¯p9½Ì„ }n š´á'NZOœ´ŒOºÜnrA"C& µ^͇UQæÈB.•ÏgÍh"ffsì”$¬Ã½÷ª¤½…wûÑ»­«{í[çûï<¹øá[7Þz´ýνÁ~xÿ_~óþß|ôðÕG6Vf‰JrV»Ëi›&|ö„wSx7í[(ãç–Ì Û•ƒÍ28.íwnë>º¾ðøÖü;Vþð“WÿÃo¿ýéÛ®ïRÜîtLÙý8"h ÂÕ t§-Ô¥wŸ_íöüÓ›3ï>\þåç÷þå·ßþå§7óéµùê•ÿý?~û£<¾µvn»•J%‚ï p@°’¦RÎH Mcg.>“'æÊL=ÃÌ·‹½ôòLêÂVóöÿÛ¿ùÕ¯øî;ïßÜ>³9$zÚns@˜•NNºž91â±YÂ| &ÁI sŽ0ïnæ•~#Rc{.öäþîËÏ?¸µ÷ÁkWòÅ{/¾p³PŠÍÎÏu–ÏÎn?ࣟۡ°HTD«QrwƸwؾµWÛ›Q^hýâ‹Ç_}ñôÍ»kïÝ_ü‡Ÿ<ý÷þìÏ¿ÿð§ß¹ôç_=ýéÇ×ö—Ò*ë÷º!«Í‡` CP +vœ§ŸgnœÉ}ÿíó_ýàÑ'o_~ýNÿ£—Vþî;—þøÓ§?ûèÚOß?÷çß¼ò§ŸÜ~ûNóÖ~es¾”Œé©T*¤§”HŽe¹¨¬Ç±¥²xe-ûòµ…çëÎU?÷òo¿|óÏúÑïùíß|ñàþñÝÿïÿùÓõუÖ'¯ìýò‹_{°7T«=xzÒg÷Ò$«x!wr`>›D¸Cøôlž=¿’;Z+m÷ÍÃ¥äý ³Ÿ}ûùw¼óäÚãçoÆ̸ႨÄDVc»ij£Î__1Þ¹1óý×/|öúùŸtï?þìÍÿ÷Ï?ÿý/Þ=ðÇ¿}øçß}çÃׯn ŠqCf9I7’ E†h¸lóyü '\Y2^ÜÏúäÌÏ?¹÷Å»—>~e÷Ëo_úO_>ùŸÿøûÝ»¿ûá½øâæo>¿õâÕå|<Äñ0!6—ßü„¢çÂê ý°e¾v±ðÖÕÚg/¯þý÷®üß¿õ§¯^ùñ~÷ùµýù£?ýäÁOß;û³÷÷~õñù¾µi«TÊ%\ üÄ{Õ•Nj©®_Z‰ð`þïÞ?÷ÉËk½¼ù‡Ÿ¾úë/~ÿÍsûÆÞÿýOýŸÿþÕ¿þæ­?|qû¿ýþ­¼{q­GaÇÈĤÝ )•ãzùPÝð×t÷ùYáÎVêÖVò… µw_Xýâí³?Ýøù'·þë?}ö?~òÇ/_ù÷?|üÓïÝßY©÷ús‰RÏK¨q3‘)Í$»Q¥ÁÇß½Ùû凗ÿþó[?xcïÓ×vúÑÍûÝ{¿úìÎoî}õÑ•ÿòë7~÷ɵOî·Þ½^Þí)Ù¨À2üĤëø± ŸÝn°žn>Û‘/¯$Õß¼³üóïÝÿ×_¿ùöò?ýä¥úòñW^ùêƒÃ½ºòæÕêÑ|¤‘¤£!G‚¬ÆÙHÄ,5íÅn¾›åûâhVxëÖÌ篟ýÉ·/þøƒs¿úüÆ?ýìåþù+¿þìÖ¯¿}öŸxã¿üâÅßÿðæ'/ ^»½¶VL‡!?,1!ÆEY+碥ÝHûýÈèƒÄÓ‹•OžnþþG~ýÙõ_~|õý§Ïÿ×þѧ¯ì|úÆ¥{×·I‚ñÁl°—HÅ…@=F,™ÃYýáÙúÇ·¾xóü—ï]ú÷ß¼÷þÛ/ÿôåË÷îÑÛ÷6ÖçKQ% 2ˆ‹’žUÂYMKè— +!s…ÐÁ p}«r/ÿÃW·ÿáÏÿñ§ï½ÿâÖû÷?xeógß¾ôÑÓÝ[ÍÅj¥T 9NÍD,6¬(f&'e²• wfûsÉ‹KÉׯ¶üÎѯ>{ðÅÛ?}eïÝû›ÏÏ<:Û¸¶QXîDÊY`=—Ÿfä¢n6XZLGµ¤ÆdTrPRníÔ>~´ö“wÎþöó›ÿÇüñËÿú«wññ_~çèÏ_=þ÷_¾òÛïžýìaíÁ~~¶(ã0d÷ ªQIfz’lª,QŽPU™‹ù¯Ì+Ž*O.5¿óÂúýÇ÷þü»wþð“þåW¯ýû>üù÷î|ødûÍû«ó½Œ¢G>ŠÐ‘|±- B4D¯´’í$ÑOÁ;MþÖFîñÅÙ‡gÊoßèÿú“[?ÿèÎ'·?¸»øäâì¹Af®¨†y”¡E”Ô€“ðâ(ÍÀP˜ò4Ljµ•Ø”ÎôrV*÷ÎÖ_¾Ôzmùå«Ë{Ýè~'²ÛÍU@®GÇÓ4|røôæÒÕ­zȃØ]Ž)ä +ÑÌL¾±i¤{‚)ªœ4vWæÎï-·ÒôAßxþ°ûþËׯîÍ]X­€ÏnÎ$¹°© ºªálÔE<„‰ZÍSJ.–iêºÉ¢ˆÂPCÍrÁ‰³ • ëís«õ­~¡WJwóéf:fê"I &ì~Æâp> ŠËåƒ\.ÌïW¶•Ï­öÊóéëëéwï.|ñæÁw_Xÿñ{WüΕ<ÝýìÑÆwï­¼y¹s~Á ØѼêF”ÃtÔ1pÎÅSµt"Æy&²ÕŸ›‹]YN~öòö¿ýýwþóïÞÿê“;Ÿ¿qéÅ+‹ÎÔí¤V=«&:(GyÇò¼®jq…ÏèL1&fT¶‘ºùX;žM ‡ƒìµíÙýA©åòá +‰ ¢¬ âÆíôÉ dÔ˜)Iaá÷q( ëÙd¢L–fRåb“R…‚)ëtPŃQI.•º€Ð˜èÞ“â…ÈY˜v7áó“ʦJsý͹ö UJ‘K«•ÕrèÜ|ag&»RÖW+áA!2W0 ºèš·Y½¢’rÙ‹GNŽCß:>5>é x| +Ã$±l†Ò2ÒM ‹¥ÐùùÄ“+ƒW¯/ßÝëm÷*&ËÐ(­D +ja9׿‚óI€çÀðà$Ï šÒx^…´r©˜KéX(mJa…UAR5Œ“!Zžð`£6؃©Œ–CÄØD¹`™c¡á³¼B*[Aü^Cd‹Å2Y]rŒÈ2‚Ç‹x|”'À8ý̤‹w>&)®•u\Îá<Á…Qœ©É Â4‘$£Ù\êvWëõ‰ô9¨FŠ.?q|Ü:å¥!&…© 6\—"Uœ ŽÛÆ'ÞÓ´¤®Éh¸œÎµÒg—+ëÝøþBñ`¹³Øȵ³‘f&–E=Pàø¨ÅêÎm?í@žs:)D]¼œ«®¥s]Ža4Ï|:„§$d£{pyÿùç6çëUS•iŠ¢.Ž” QÑé€È'f²½ ÙöQ2;Ïñ‘~õàü]å­I)áp&•ªäòD,ϳ*ä&ýÁÐÄ4|rÌ7n§ÜẋmÕGšL(ãr^òá6dʉgîŠ~$fŒàb0.ÚìÏsùyJL©Æ¥¸h+”îÛ‚¡oœ´Û< LDpÆP¢U>ÜDé(‚r Ò*Åšß EÔDáãŒ^âb-·Áš7½zÆâÇ,"õ)Ùg£m—óˆv7ÇK ^IäÇÕJ¨°¬×6RÝP~âRÖ Œ°f±»GJ9ðÓ¡T?\X3+[jqc, ³Ç-¨Nú«cS§-íèõÝh}[J ìõĨ×å—,ñ›'='-¨ŸÏðñ9½°%%vÔ˜¨§lä´›"ø˜SŸ€c9=éeHá2'§&¦!«#cr>ϲä)¯h *.:á Ìo\#ôª›2ÁùGj›à!z ћ䄫%k½Èg–ƒjò ÿEGÅ!ݷ㪳±µ²/å7Ic¸Ä$À PÑŽ‡‰:P•ŒÔ¤L?ZßJ4÷bõ-½¸l–æwï“f‰ÔÌÞQuã^{çùúæ½X÷ Û¿ÈM33ÛÛ¾e§"^!B‹Ï¬DêûéþåÔìåH}ËËçœ2f›ÐÁPÄ'™èQÑfsþÂ`ÿeÔO8pU‹ëñÎÅHýªw=lÖ ²†K¡rΉÊNLõ‰SÕ…ýL– +n:)gæÕÂ’O0=¬ ÜèÎŒµÉ-ºÙ¤Ѫý)Ùíƒ8Ÿ”ƒÕ¢µ©ø׫@ÄÜ°$™u!Þ%µªÑcc³Zq=RÙŒ”ק½2ctØØé‚ßrPñ)Ô8åœdBͯ"Rá´‡Ø8®Ñ‰Y*>‡…VTn„ššó +y À ~¹(f—q£Ã¥°hÏN&˜Ø¬^\÷‚°T!: ’|¿˜š ‚:B%.t›Œ5Oº9‹?„Ê!±,¤WÕÒ£~btƬÿÿì½×“g–/ö®««ÝáD£]yï2+½÷¶L–÷¾ª½7è†! 3ä g†Ü1kgwcµ +]i÷†BR„Þô¢ý?ÒI¬î}PH÷Aê¸Ñß1@w™<ßwÎÏde~Ç?Ñú7Bë¼}üõèê—þ®>­ÓÎþWb £Ê•Æ|m_më½K®~§ý›ÝÌÆþòòkBk'p òJmT¯„Æ)Ó8Á¬y‚(5¦O­ÖQÕóR7ÍÔQ¥¯voÌñs¾~–æZåÞÉõ«Sty=Åoå5. tö|÷‹?²îâÙ»?üÿü¯õéõFV‰’eÎÛoœý|ôä·óï”Îyœt+“G€NႾg +J;#¶ ¼Å+³w+˜iÜŠI“ÆvšìZÏ*A̦+{JﶺóÕÇÛÈf Ë1nš©¤)/ÇÖòB+AVÓ|Km_¸“'±¢öwß*#RU{öø)*w0¥M˜C¦²'6NZ{ï&·¿¦œÝ=¦kî<ƒ¤*/åÆJôæ¼7o¾6ûg\eN•æFﺾû¶¾÷Vï^àÖ8BYy¥¡¶q³GÚÎ;àêg˜½„ œ¼ï¾Ü6:Ç€cb}Ÿv—bóDíŸKÞ|÷êíÉË•Ö>°¼VmìwŽ¾=þA\[í½³—þwÿSçðYRô¨ÒŽ·zÓ;ùvtñ‹úê)"{0tFÓ{Y©Z´ûI±Îz;ã‹_î<ý}sÿ çíòåE÷ð-]^ ZOhž4Þƒ¾vh½Óµ$ÅX»¿çÕöAFê¢ÆLªù×Û?ûõÉóßl@Ù¢ë,‡ß.ÿ^½$ÜcÞÿø/ÙmŠ*³î|yóËw¿ûçwøw;/'µOsbKõv~ü›ÿQolåԜؕ[W¥Å—ýóï>ÿËæÞW¤Ñž¼ªM.¶ B’«’å=kújùø£³o&g_ •¦ ¼ùÓ]MÑÁÛ[§LõЯ¶|5=ÿü‹RÝ-Ï^õ#¾¶+x;¸6âìññ³_<ÿþ©mõ®­þ¥Ò>&Ý%nŒ R‡uïàçë)9Ž¹jûÈ]UæO»_D@ñfåjïtrþu¸ ¬'XV­û˜« +ÀnÖ¼¨O73J¹µÿ꛿Ö+³óId+A<3z·½³_œ}õ÷À5ñ¢ùügo¶´›d*Dù '4rB¸É<î}wþå}ðâjuþèÙ·ýƒ§\i¤Ö—Vï´½ûyïðuïä+w~Ë—ÆÍù#øXP¦2…Òb…2Ѻ絗¤5,ê] »êâMëø—ÝË_z‡_1•™ÛÜ;~þ£3:ÍÉžÖ9­Ì?ß¹ùþöí_ÝüìÇßØÝãÉÁ‹áÑK¥¾[™ÞöNÞWæÏ›;ÏwnyþÕ_–'ÇýgËËï”ö ä-f µD9+½wÍ–²7›œ½áª‹ŒPó½F÷’Ä®õÎ~¾xú[ÈI­sfOŸ,Ÿ|¿ûòÕýwDy7ÎÕRlUiìÔwŸE)I¬ÏwÎTàÀÜ顱šs3ÍajGòV|uÂÔw™æ…Ü}doœáeŽ/ç9§1»–k ÆîZýãöÙ»òü¶2½ñϼÉm^ðÍÁ•é¯ò¡1¼t¦ŸKÝPµÕK­sÃÎîçýÓ÷rûTkŸAâæØí_œ>ÿ m ½»óèg/~ýßž¼ýëÉÍ÷̓·zë õõóï¿üÍ?'èrAjÚÝÓþÉ×½Óoº§oÛ'ïsbûå7½sþÊWI½Ý>~;»ùarõ}çøçƒËèÒn §Óæ0Ö޹>¸RzçTÅŸ`PI)ÇÖ¡²Hk¶ž 6Óôz’Ë Æ]‰•]ÍÛ‹£Ú§Û9ЄPS„5Gµ!aLâø)ïäùïKý³$åä¥dB–«êFÕ.í̌ޥ7µÌ™½ƒ³—Õñ "–•ê¢±x¾ÿä‡Ãç¿í½Ñ»GBiÆppö>†iyÙ“»Þüeïø»ÚîoõÒÜH•Emö2D뜔–/åç”3­OŸ-ÿ¨õN +J½sðÚ›=žž¾yôåoW¿7{'ryº{úåôì 댼ñåÍÛ¿¾üêo÷>ÿíòé̓×Jµ÷ìÍon^ÿ.'TÓœG¹3±¾9Pš¿PºW¤=ó†g/¾ÿ» B±÷VÏÜé£æÞö蔈Ÿê²ô&Ã{LyZš?õv¿ôöÞuÏ~UÛýJi=ûæ¯.߀ö›ƒ¸òìNn›»¯Kã£} +–2º«ëov¯¿qû€öûRcßêž4fWW¯~wôø)ÊU¼ÙÅ×˧¿ÑÇ·þ ïõ¾²sûæ·õáq–0ü;^÷ž×O¬Î±Ö:¥«‡QÊ  ±4Ís•áÙûã·7ùüwîΫÊêEyñœ©ó–TZÌŽ¿d­q–ÒP¾œ¦*„:ÁÆ8‹,í=Œ’ÊåÝeŽ¯o¤ÄQáÜ=ÖÝÓ:7`NôÁhÕNAl¥éeôý äq=#x˜Ñ—Á¬ /õö!]šäX‡·z ¥¬þiev#T—àà8ý“ÇBëèa ©Õ9ø²}ð^l^4¹Þî¿’*SÆèôO¾œÝ|ó¿ûô·;ÏþÐ=û[[æ%oxú®ƒ¤ñäú‚)æìTÇ—Þì[ž`²g7—ngÞ˜º£s¨nº4J=otª7wyž±Çð’¬TÉHe©µo®íá;¼´ú‡9ÞUÊã'_ÿÝÑ›¿6FìÑ£* J}%¹ãýË·€E­×<|_ÛûÚ™½¨ì#un ‹"E½ÚÞ¿~ýc}~ýi /ª}ߧï¼2GÌÞy©w2XÞþþoÿåÛßýÛ8[K MÂ^ª½›ÉÍGïþ©ýØÕëç¿ø‹ú_š‹Û(]¡¼c¢zJVOÚÇ?_}ñÇêêe–-[Ý#£sôaw߈բÚãÜEÐéÅoN>ÿeyxº<ûÊh2îŒ+/3B3J:À, <[;¯”ÚŽ ö!åŒÇG_..¿u†p}HƒÆôÚízOì^¹Ë/Ê«öä ph†.géRy|3˜åcE´&|ëž¾¶'ÏHkT”›Ýƒ§;O~l²žb„EØÓòü‹ÒàÊí)•E´ c‚]œ¡b;œ×!‹6Óru±]ÞZ½ãKËÚøʃ"¢«‰¢™À˼ž$*|eÏÜ¢R3_CÝ¥hŒ<Ìoï¿tÇWr눮ÎsZ Ñ{îè°|An•_Yˆ•EepV›^Ý£aPZÓêî!²Ë™ Ù[€—©­^ÀÒΔ°† #oŸ­,c„—ûÎô²sðjvýýàüÛ(¡§qU-†'¯}ßÊú{D0ö¼½÷¼{ø¼sð4c $o°z3ÃBØýóƒ'¿…ctN€¿à‡[Y^oâZ3˜ç2¬«µvëãÓþòêâóï*ý£4WSšçZûZ©ƒÍËP´ffëdzöv÷Ñϲ|-+´ôáÓÊþÏÌÉs¹y¬´Ï0s†ýàæ»æììšo`ƨ¾x¹óøÏG§ïÚ«gÞø\Äoÿæßßdå¾5yRÞñ·U¯í½r†×¨Ø\¾ø§ÿùõ›ÿ;IÚ|íÈ>­í¼)Oë­­º8òË«7EX£œÜ(#Ê])¶²SDê¸íýéÙkÜìç•aNêÅÿ´cë‹›Åõ7¡Ê˜}©47ÛÅ×óÓ·„6ˆ æ¥4_Cªý‡Q&Q@­õÞW&ÏÀú¤¾ÝØÿÍ_ý÷^þêA]‹Ñ ®ƒé³Rÿ¦Ò¿Þd´–Ò:—³šgËJ}Eš#ººW0&”»(?·íá^ðã°î¼·dJsTï#ZŸtç€Û“ë_H­ƒÍOC@»“kÜèÄ"7(³[?aÝ1À”Þ9q¦ë{_ .¿?~õ—í£/ rƒqfï(Šê9¦ŠH &ˆ:ÀÍ1]šæIJ՜óåIŒt +r'F–ãT 48k¯¸5‚7?~úP™‚*æ½]±uNÝÚäfõô×¾†«mHZÚBÕ»Ã3£wœñ[ïUÅÊ,ÇWb¨Â8C«¹Ó_ÝhõåfZÜHKÌF”®ð+” ÑUªÓêôrvñv|ñÞ\ú e¥Ú~ 3 +P¥eõ/Æg?[=ù=ß¼LÒ@VuÚVï$É–¶rB #ĉ2®M”Ö…Ú¿ŽâF–q‡¯@"¡R#Ç×ÀêzãÇ­åëêô%X ߲†7ly0’b\x~7꽓³?ö¾ÀäÀØÞˬØÌ° ¨zƒ½õÑ`£è-´Þemùb|ù;ý<ÁÔ#yͪí _@“Ú­ì€Ych÷λû¯î)ÂUöξïÜ~ØÉÙ(HuðY£‹ŸÍ®YTz€~IÌ&Ä6.´¢#MºÑ¢™—šbu¥zóJg—ðï&SDïÀ¾H“¥hVÆ©lÑ`drf„5EÔ>¦ö¬Þ±\óœõû+¶߃“›G ÂÊ–¿;_Q›ÿzxͽw}ŽÇoÙÊb; $5B”V^i1µUAk'gÍ;¼AK]€¾öþÆàB힨½cg|.¶òrì¿Ò9‰cPD3¶²'ÔH{‘—»I΃ +m/oÝÑEF¬cÀû|³¨t‘íó²¿c¼Ò<bÊp`½ý—µÅç 3”úÓ¿€|N1Ί¥‰¿_ç«;|cLbV¨¢Š‡JU³¾£7V‘Ê1`37’|NhCÒê½KBíÐBi¹w»8}ÀEX}™Í°•XY±ö$VTE§ïôŽÔÆÒlÁaïe¤~ W^kΞª­ƒ`AÌ26*Ôã˜Cêc±v\ІT§A}>ûœòZ¹"{»ã“o‡'ß óµ¤FMÒš†òr3ãEá=Pjeéô/EI»_îj-Ï;®Œ(=¡ºcuO•æ€y†¶«£³Úü ¬&çí‘å^*pMÐEbu7ÏV9£×=x Â^ZUºþ~_E}ÿüÍxuͨïôÜÞA}ñhpöe}ù4‚Zà i¥ÏjýµÌ(¤5¶‡×í½Wj}/C:Á´XÎàR©ï@6¢x7á€á¡4O¼å—êàsµ¦ ›emÚhRFUš> +ÙÓ¼:H +mH?Æž¤pÍœ»ãÇ@¦öð–.Í3R3ÎTÈ‚I^–sÝ{oÚ‡oÕÖ),´Þ>¢Ý1c÷Z‹ÛÎþ9±š*Y© +ü~ôâ·Wïþ8¸üN윥(L¨3}’“šÅi¶Øe´ONžýzxôÂèŒ|a6H.$èÊ™Ãû×–_tÎ~¢…Ñ­Ù…Ñ\áZ‘;T”=•½#€k3ÉzŸqç<,M}/%Ôøžç«éZ]®…sB™P^žÚym‘Z°¬8_q» Ðy‰­ìŠÍ¥{ ¢. /GôØžù•ÛßO‘Z†ubT Uf÷‘Ò<ƒeÝ.(PkP€ÖÝHñ1ÌÎ˺´W?k-_U'·ãL‘¯µ—!·Ã9V4â„ ,É{‡˜5-ƒX^ï=¯/Ó´›¢ ‹¼XÑ +ædÖZ­ƒP–ÝŒãÿºÿsѹ•b½ æ7úqº'n÷4E:ƒ“· 6ÝÙµu‚û;sƒs®Y›AΧpWý¬î… Œ“(Ê´V_œ¾¬övI©ÄºƒW'í¹Ù½`í9&u¶bd(ÍWú§­Õã­´É«Û)áa„†Ô5Úgzë$K•byQòïöê!L5’•9wäsŠ5È°"5» ”€žà!Ö„Æ)é`Î +Õ)Ú*µdÑÄ¥6eM¥Ö¹1ú\l%3„pPÑÕ1kv)½/” ÀÞE{ÿuçèé.¢E°½½Òð¢±zºsóíÞãïìÑ%n›{Ÿ/¿Vûç›yˆÞéßòeP ‡\u„h6÷G_f˜ +¬‚Ú:*-^×V_€Ü"yAîf¹*¡4ás´pe¡¼cõ¯‡'_wv_KÕ4[ÞÎ +¤1"àa 9Áƒ+í €>À߈¢F†)AnÇ1CoŸ5¾j¼n½·§/²Ê¬ÑÜé¼ÖÚÇäpu—tbí^îw—ãËÕîÞÍ›ßbZ/€è`ÃqsRÔúfïÚ>žÙΈВ«û´5§­™\?Ÿ¾™„pBò·M#Ì^†)g©r«qö¤¨vÁŸ +jš0f'/Kƒã8iJÞNeöÌì]HÞ!ü8S> ¢qŠ3ûë “ëÎà¼søöÑwÿ<»ýµÚ<܈b¹¢Ô]=Ö›{™•±¢"%Ã׶Ӝ¿!Þ`ðÏ"$-ü—j¼ÑÀx3ë¬ÕâƒÉ ¤¹Ÿnfÿl-N‹¸ÐàÌ^ ‚Yj±"¤h…sæœ;ÏÑõ­8KU\,“øVÄ9BEÕß+£¼«µ/A‚XMR%Êž@uBÉö”+ïØýGÎø©Ø<ˆâÖZŒJS%DlàZ»¨w¥ú¾Þ=cJ3T®Åód2O"¬É»Cð•uÿ;š_uO¿ÉÈÝí,‡r†â´ÕRO,ÙÒD÷àËã/ÿ¶qò%^]椖TžqžŒM»³Öîë«/ÿþìõ?´)hYÜÐë+ÁÛA•6ä[Þ¥KûÕÙFû2/Ô“¨¤”§ruÅX¿óˆÐÜÎ(Q̢˫úÎk½sFÙƒÆê±Ñ;IsU@¶¼Ø¼ÃÒì¥5;S“ÜîÎí/ßóZsçtýsti18~SŸßbJì/;ϵ¥Æ «lM„ò¼>¹|+ R븃kŸvïLª¤.PÛVŠ‡’I킇ÕZ§”>Ë; b˜cuNywÉ+Y¦ZÔ†RóÌ?©Î>Ç´6`)*Õ{_0î4'4ŠÚ(Œ• ¢$nA†Jc3Šñf×iíÊ•‰Ù9Aµn° ÓŒhv´ò,æß4ç(µ}Öž‘Ú Çz)ª²™ä6´TžSÆh;%æùF^êà†ßw,/4ü߈îMÜî ¤ÖŸø{ý±>â¥Åî&#˜•ÖãDux2>~ƒðO8°P#x†*0ûã º•¢¨6¯î•FŸýaÿ9¡”ÖYUš„Ò„µGte—ò¹:x½×íƒoý~C¤&W†Ru¨…º;ÛTm+§ë•½Îì)¸4m¢RÓ{ààúGïœÁU¤(ng‰¼àòÕ•è­Ñðç¬^cñ¸uü–©ï´^š©¢r—²g9Ö +Ò[{Zï + ÜxÉHA"Ô¶T;Ä´ßsPëêݽÿ”)`rk;E|̤)‹q‘‚G-BíI•%c µÚB­ÎÒ”CYC7¸1`Ê;fÿ¶<}ÉyÇ0·aD +瘽ëo«“kHVjÅ™zšk`Zß\àj³ Ö+ã›öÁëÎÎãúì†.Íâl´„æ­¼Á™Tšl§™fD½ vqcÈÊkr=Á¨•YcvÄõ ¿•E;³ÁáÛáÉ·¬» +d$LjÜ|7Üÿ"E—‹jxSkžhíSÑÛõ¯FHsJmå NÓ|õA‚‰n^î³€{ּȖI¾¤ØÝÙÙ©¾%K’BAé¥ØzšokËhAÝŽâª;© A>³ò§t-B¤™€?¤ÖF‚ÉÒ®Ö<(MŸ@öÆÛÑ¢µ]ñÙ"ôi±Iµ/µÏÍÉc<WKcV8#m'8Vé—Ú‡Ûqü'ë©Ï¶‹˜Ð. +Ía¥Ik; ¶¨#lÐ>ªëíòè²µó´µû¬½ÿBïƒJ,Êm®4aoöl|ñ«ÎÑ7•ÕkP,  +B ×Y¡ÄWwÕî-íK­Çõù›ÎêµZ?ˆb +"”Yw„ȵ‚P-‘ã=±²X\}¿ÿüo€SY>Ê´Ñ&¥œ©Ð>-èÃÒôEcï-nNsL©3»´Z» º#Ý^Êñà GõùËêâMQÁœ§Ðo#¶¼-‚[)ªœájvÿrxþmì[cÌ!ªö`½RLj×úŒCe#e@Œ)­Óö΋Åí¯P}ºž9Ô‹^[%q0Ú[Zý§‹›ßN¯~…[ã`Ž%Y›\Ö&yÆ1aéýkWžêÃg¨:Uó0NøýSJ³í$»§¡Fòþ™ÃS{ô×YÚÙNÑ)Lev¼(f(=Çþ8´1¡Í¡õrL@†±Æiº ¿B^pÑWAf{—±ºÃ£víöiix£uβŒ—Á „2y³%˜¥Òj³Ú;s{'îðšv—9¹÷ Ê„R4ê_RUÞNÒ€i¨ØË+ÉÛϳµÍ÷Ó­¥¶êãó¢XYQŸ‰PÑÅKûÚôËêîk¹2ç8·6k-Ÿ€[üÓõüF‚ßF¬œ2¢½3­yË+Ÿmç³?=üòA ø§ÓðT)íÓ åBçùrQnå‰\ n1ëÎIú[i•Œú¾3¸*³¢\‡'èmP°í4ST׉ƒù*M¥Áº3¹qÌV üIlH5韬r••Ú¾C Ù †‘q&”1°ºÇTi¾]4·s2*6ôæ>ïNìΙ·z;ó¢9N‹Íf$`ô~^éò +c/¸Ê!nL±Ú8ŠÙ[Ð'å_uÊ°IP½$UXgź ¨Üjbr;ÃÖˆhCÌš Þ8¸$S "òzƒ"Õ&/"Õ1{A8K8~½w@”Ï"x¸ Àrg¹ZAjÒî3§@èõٻŕg[;†i]ðeaÌÙÌHqÌËK`ç<ß\‘þQå¥8áæL¬ +F ³ ¾Êh­Pšòw«¦aæk´=CEÌ*Y®Ž#ŠÛ‘{Bõ <û4C7×"x4#Ì÷_T:ûYˆ”næi·@;ðÅ‹)¦'?üÅ¿åôF('‡ò*#åìå8Ÿc96’¥oAÝH^Nbv(+ƒL…Ë-”-GÒtaÏI{™[ & "†Uë É?ÞFYiøWd½+¶r¸™Õ²‚f£”ž\Z†s’^Û½C\›$pßvA5á’ǘ}£¹OÈuóÆJ ¾O)°%Á™(µ=³}$Væ¬=`Nš±üöy—; ig„©õ¢ìQf—qÆ\u7Ï5¡É83¥uÜ?ýfxù½Ú½L<1C—|SÆx)¾ ÐäïèÕ9Ê3­¾jŒ|^í¥Å6–ªóˆoœg%a´ùá¢>Т3¬’¦jBeS;kÁ|0NÐF'‚è„6Îñ`Á +£v^hÑÎ"Å6A‰Ñ¥]ÌZÎ*LºÇÈŸÆð`A$ÕN–´Ú’« 9Bã˜,í¤¥V‘Aqåy p,ËTäÚ¡5xlv.&§?7;gœÚ”Ëã@†ÙJ³)¦†i#½uÖ?xÇ–Dy+É%ŠzQ·R ૤5Ã@º×Ž@áÇ‹úz”ˆd€ñ¼X?˜b«y¹ ž/ïkÍ3Dé=HÂÛò¢ „ùòRi +:H#Fj—[8iÀD³èHNÜNÐ$Ÿ,HªÙöÚ{­ÑQ0Em%hÿ„žPçJ;aÄÜHp?YO¦0Íð5êîF„, +õ߀"-J-È®ä“õT‘-Q~7=7”×bˆGôXNúËRn·×c,©t³Û_‰ +üóaª£Ž)øs=Î;/õOfm÷“íâZT,HmP&1DLÈc ]„«BVÃA^…ª¿O¯ÞÜc@(Þ\oð•]ÿ” ®ƒÎ±¥$®Å18k ˆ’¤ƒ + å–Îðª2½q†çŒ;ö7a“ëQT…ÜŽ£:&w@Ä‚7áÊKHD„H½fæøZyþ…ÖªtŸˆM¿;"5@E£rH¼ÀTŒöµÜ¸dÝ]¶´K˜ÃØp1SÔy«Cu¡´+×Îpcï (*ÕOý¼Rje ¢%Ã5‹æ"Éue¤ÔÕÚQÑ0Æ™>#ô.H&ÌZ"¦ß¹^®-Áf&Is3E³ÖHÿpN’-/6þ"S/ç„ò\I0@¤.Ài‚,¯§ä`NGÄ®â2öd¤QAÍœf«ô@=T6Ó¢ôá­Ñ9Exïüå‹ËŸ!ê0Ë·m£+[y5Š™Pžá€¡"xû¸áob™Å, Z °µ0E©ý á@ +åé&õÔÊ®Z^árR}=N~hm/= ç7#øVJÌ +8B0$@bÑ~ÂÛ³àÓµ(³ç€Âbyd›â1©ýg¹Ÿn!iÂM`ævRx¦àÏ8æ2úXp¦9Ê]‹`Û)v;-€*ÕN–®Æ+…™nsÕ]Ü‚€ßJ©„¹"!A•c„“d¼é~–dדL¤ PúPo²Î8Ï•b +Éq(ïy9£'Z纨pµ‡J­`Aý$T|§ã˜ ‰‘q\õ…cƒµÁôªt½0n®'Ù`N‚ Iƒ“*ðyà¨K#‘\iS»jëD¬íÕ^–÷¡Ê(Àm¦Ø8"SZ—±FlYÊ)òþnœVëT4E0-@€˜Ô¢DÀU©Rí'Âoq¥ ® fÕ=“š–JíÌ‚º[i€#J†«j­3©qŠª]pâQÜz$c¸Ê=0ÚÑ‚ u-–¢8èöz §­Ç$£¹ƒÊM ÐPNcÜ]©q!xÇr¸r´™f€é¨¶žáp}JÛ ¹}R[ù'C@y¦S+ Ÿ½û«éñË [ÉJ]Ôœ ú0+ø×ÈÞ^¢h…ŠÞ:ØΈ€~Kô¢›“¼w¦´®AÑbc¸x–Á-(Ø€9b†ñ²Þ{Ô=øŠsÆY„rr¤ÊIà7!ß6“üƒ(›¢›bý#ÊdàèÌ*ÊW°"ˆ.X®¹ÃÛ`ZŒæ5xä(wVÌ©¢ r+“{”&í?ÛÈÒR†®0æ˜w&¤ÚM¢öÃ0»•Tpu˜¤Ë¸9GÔ<òê „Û*þéhµGÛ ~R‹Õ£¼ØI‘nž+cj›wåѵ endstream endobj 83 0 obj <>stream +uža[ ²Å«iº±U#¡¸•aˈÔÿ €XïêtdÖ9jHÓÕ|J† eý Âȳ.iõ„ÚNeòÄì_ƒ¶É±eLª“r­Ü;lÌoÙ³Rƒ³G˜àeHD)£61@ ÑÁÄR–¶³,0òR%C˜ÁKHuµ²`õ*ÔHlbŒ^’]ÝÍÃ4BmB]ˆÕî÷2‚rƵŽPY¤˜2øqÆðäÖ)íîbú8"^´À0ÆAWëÒÞbÌ 5¶< ú¿yTk„ÖžÚJ1 ãÁé7–/›«WÎK¦Ù>†¢H‘&¨‚í¬ÊË3í½—£«_pÕUAl–ÇOA%Æ)7‚aÔp[Oð˜ØË“Ð_é7‡Rà€63âzœÊ6Ê×7"¨;°‡Y±‹j±~ˆÈ Pkë1Š ^Hñ”9Çô"ös\›±¸ÔX·bt5? ’E“î•Ú¹Z>ùÝÕ7ÿݽù4€Çój¼ ­G) ã͸™=*uJƒG•ÉcÒl§Åîò9çÌxi+§mÝ *e5=}÷æÇÿ!®Š©%i‘jó‚2g@ºu”r\-Ãx”jjj!Núç4H£ J;„ÚÀ,léˆ+„ tu5AS.bÐ+¦´@烓."7ÍÞåÀû×cX)E8WFXà+G™„Ñá½…õoý €”0WÁY‡–+˜ì¥Yÿ»«w®5Ó¤›,êŒÖ%åFáÖéHŽŽ£ +ç.«³gEµ-ê´€ 5Z®ÇrB4'¸*ëεî•Ø<Ép•€ßdÙ]'tTmg„&趺P)TW€]QÜ œ±Ñ»Pš'ˆ2„¢7J™ ðnqD eYÆšXýÇE­_›¤3Ý(è?ÙÊ'Ñ»‘,HàÇásùÁ#Ù§ ÊÍq{‡à²3ŒµñÜð¿Œ={ô½îgÝ`¸ÿšµ}{ÈVv`¡ Bå[E±Ed(Jï²öT\ ̓ŠKA"ñ­¼ÐŒãöO7Ò#øZŒÚH‹Û9%¢·â0ÃROoŸX/œS„Ò"K­$ŠF(#|º•úl; iS`›¢Pqæðf|óCýà]yö¹P= f7‘4î ­ÏÅ$j¿HÞ^eôXp—ˆÔ–‡Š~%WvA›Å)¨5ß]¾ÿãóïþxúìûffÀˆ Í‚Ð"Íq’*ƒfÜ9cÏHk\[¡‚¶•Õ‚@¦t Uº)'aÌȵħŸ ýSÄ~Ò•¢ÔF¥Fœ°@úæÙŠZ^Ô'7„ᢅJÍ ¢€4*ðí¢<ÆÔ È¡€!UF8#²÷ +r¿4yêNŸÀC¹eH3^Tâ¸ÿmE’°D)σYX1Ö ø÷³(¶ÇP¾’cÜ$å¤.XH¥qnŸCD$³*æ}Þ,û&¤zAëbÖ”vW„9Žâúv†&­WÝ©.>wfÏP}”áÙÊð«¼XÍ  ²SaJ;¥Ù«òìÀÅZ¤¸ârl5Mùí Aw¥Ùn¯r|¬. ý'[¹í8Ë Áñ¿[ì r7Íz å8w”blRo[ý[¹y.ù/Eµ>:É”X{h¶"¨ +‚Yô˜Ò ´Vw)ña ç`ÿxAùéÃT3sHjÃQÙHKia#A¡Æ@™$ tHQî‘æ S‡°.›If#æÃ΃0ò›)›aPéÚœ….ïîFŠeOØÒ˜Ìé§1êaBÎp]Rë*Õ™RnÄ`] MXÖ$¿žsbƒ´G”=“ªû€EÀ× åÄÚ±TÙaÆ”Bi.A× ·AQ +ÚFF„G5Xk¬·ÏµÞ5åd¤~,FÊ¿6 †Z ÈÒ>n/1c + ¼ Ù˜¢+P#¡‚úaÇÑ*ÜÊy°šQðA…E‡"—] •™ˆ¯l«ãgÓ›ßWÞçø6¼I‚°sl…<8lÛ¿Ö÷š,-²`a@ý":j@ï<[Ëóõ<סí}¶r&Õϲ|c+…wû7FûŠ²—qD{‹Ð'`XHµý0É€ñw—ÖðIZèDp,* àÓ9JÓ4¡eÙcû_Î.AØ£0a†0•4û¤5 Í €Ø’›—j÷–)íÇpçA ¤™4åÈøWð’U(Û¢±ÈË}{ŒÖ ¦¹[³ßÞyb¡Æ"EÃqJIÜ Ôv’0â؉s¦ÕùsoùÒ[¼Lsuº ‹i?F‰@ +žãÐö0M9Á ÷0ŒmÅiHì,]úd;¿£)(câŒEûAœZcˆjI\ ù—ôð›IîÓ ‘Àì¼O@ë Ô*°uLõ¯|ð¿CÌéQ¬ è§4O!ÒÏ"džo˜K½ûˆ-­˜úv-Žo¥é"çÅ2â'›ùHÁ0Û'³«wÎè4+%ù_!Šå fÐð”³tÆO«·I¦žå»y€J¾*ši~#ÅåÙj©wÙÞýª{ü=}(ë ð\s€Ý’¬—‘:”»Y*ÖÀt€$ƒòYO +–Y¶Î¹ Õ`)·³°Ïfš ý+^}¸× +d*"Ôw¦ÕPâD|·Õ¹â(ÕJØë»y}P0†rû¼}ú½Ú½‰€üHÐ[ 2YTY}$WP¥O: ˆ—µ& Û@ç³0«•Ú¡ ¹ÌÈkQ"’WÒD)œ02(k‚+CPÚŸÑŸ8š<ÄK}€Œ·aêà dc–zð÷õ4ȉ Òöï_h‰­3¹uFêðòþ0Ï° +¤1¡¬9xsRï‘°j-‚©„5rǺÇo'GUö62ȉ`šaÕ&z1T æàÁ;”¼cÖ^lÄð­8áŸDu°˜ÖŽ“6`_Ùg\ë#ÿ:®VÔÇ`߸Ò2Í7ÁmöeM1©É5RkJ=gr5¹øvxñs¥w•âÚQ¼T”AçLó|µ õig×ïìYÝÍH­b›É–àNeÿzÝݬÒOƒ@R‡buŸqæÀ§˜Öª-ùçI AÄD•˜ÓYNbæF´˜&u½¾#×ö¸Ê~†mDQ'\€ä¬ð.¬òÒo…ÃTÄÊí.ór7WÖ€iˆZêÄÕo÷C–TÈüþ•XÝc,HP¶ÕÁ%oŽþä“(L_žË ¦z‚©ƒ(df ÌÊ Im/±¢M[KÚ\ BWpüïF¶S|†,ê¬ ôßrIãN·sàDÿ42ðš3~"•—E©ƒp,SÒjËÖâ&¨€¨aÌL0^A†pw3«Dp7†»˜Ô‘“¡¼¯‚f¨4MSÍHÑ…XKÒ¡ž“:)΋ÒNNíi½ÛÆñ¯õÉó‚Ü…‚H“%¹zP¿¤+'9i!Ê!ÿÚ•JšvüóÚø¦´®õ Á+ò2Ø|DjkmÿækP€aT¯ÍnË“3Òng¥zV;§K{YÆ)Š^° rí_ o¥Å@Fç´PVÎRþ×9±Bjµöþ ¶ºA˜Z€$€«aDgÜ)¦£¸ î_úUZ +õcÂÇplcš2i³Ë9mRo€Ø+“Æî×RóŽ6ÇÖ"y‘´F9±%¬8åõÝáÉ»Îþ¥:'ÄjvAÞ—¦OòJ +*Š•ÀæÖ¼2}ª4vC91’•Sx’ªµ Âx Še#I£bM*O㤅éDRöNkç€IAhæo;%AƒjbëþícT•'¨:£í%$ÉÇ[ùí4‡)]Pï›%#´ÍÑ#eøÔ>Yòiÿ4ˆ}€ùBävŒª$Ak#¾|i +-ψX¬_r¬´‚Ç+ÌN­HÞß4 M• B{;%mÆùRÅåŽï_ÏÂÀ,à-mŒŠr;C—¢ͬ¤¹ÚzA +‘vÀ¿­»š“‡¨<–½#{¨XÇ!äv0o>LHá< ŒáÔ<ʈ Pž¨ÖÃôqiäoE.u/cdu+§Æ'îohàf9Ž°÷©Ò a-á}R¤… +€¥M¹vÜ;þ¹Ö»Äíi ³63,DŠK. *ȵ}ãŽ_rÞ*áo Áƒ>É‚¾RÚQÒÞHÓÌbÊþMUy¡úÓò B@ fˆ²ÿU#]“¥¼Üá¼ý¼Ú{çÒT5\0Ây3ËzY® +//È=¥u™»k)>E]Ùë§àùÒ”±O Vo«Õ%¦÷qs´]0Ö’à¼4€åaTÞÊñ’·lï=›\¼WZ‡ÛyTDÑ9sl¶Žüï1éªXÙS'þ5ê¥Õz’þÓµh8'•.TM”*îÒ}êÌü\¨ÔŠ¢ú§¡bQ I@ÔEía”ú,„ƒãÃB™#ÿrA̶Ú'.i`¶rÐÄgI–Rˆ/-9{]T»QÒ‰Rõ‚³‘5óâÈ>Ñ› ÌHu©¾×;üjyó£Ñ¹€eZ‹1k€~d™±ç›Ó†û/ÿÁÛÿÑÇ Õ7b,® ìÎÔìñg¡Ÿ¬ç3L£yþCçäÎÃqãÀ<•V0§óH…¼ PöüèÕ?JõsÜš„@WSåQŠÓ^Zèå¥ÔNŠòÄòSëá<€ÏY²Á˜+oö9f·Y®.†ÇïS\-'µ2R#D–€”A¶‘ö‘[~WhÒ)(wüº2'5ÎÒt$P†°½'WŒ;‡Y3I79÷ØèJ®¥Ö’þW»ø(V@²H<ƒ¤ói$›M"ùµBÍÆóI¤€¦´I­íü?> ÉÄs¹d&—Iæ’éÌÚÊR~–EQ)dóù,<)÷áU(š* ÉBáÿåIÿ·[ýÇÓê£ÙGÞG»9¡kÁÐZ̓¨˜ñGÿ!¸”܇ùç«qñ_ÿÊŽaFþ¯É„WÁH%øñé|8v%v­f~Ô\û0›þ;Ä>ü ŽÉý‡HìZ{-L­¥’yÿå³ÿ¨ø¿ü÷/ú÷ÿ¬eàS…‡›]ûðmm}8Bù‹kù šN}TSþ³ S‰ Z 7ò¼WëÎËÐÕéåÄ¢r|#M–þµë7cŽ1µ‡È­8é„‹zõûh¤™r–©$ŠzQ¨Z›s'¤=FµaAd¥fÌ#Ec3oÆÐhŽÏ±%LïRÎw¨1É*ã + +k÷q½¢J„>áÜ•èåå^Šª´QškÄ0;”WÒl-/u¹ÃUV ®¶–dý–Ít>˜•’¸CêÉÛ'ìI^i‡ŠZ’vã”™ËÛˆ˜ª¼·'6Ï•þ¢¼—äja +u¡²«õ®„æ1ï(­KÜ^¤¥V°¨çÅf†ób¸µ•·’L•S„^àË9¾º™bà³Ò´DjFp;Ã×áÀ²œ‡J­,WK1u­~&T“l3€q++EŠ:c ­*H¡œˆIBä¹F8¯Òb¼hàRËhÁ'&q ZÛ)áAçµ(jÆP3Z´ R//÷³B'÷ÖÓb §ÆŠv’(¥ˆ"´á­b¨•¡kaÄØLs0c1̉ FÑq¹Kªƒ$YŠͬòIÿ4Œ¯'˜­“ÂŒåæaóJ Í%Pu=Šý4[OÒÁ¼ /#f†®§ÉJs V!'4¢Ec=Š‡sòVJXÑñ¢ãZºQà;Ee€)Ýjÿ\öæ¡— J˜:dJsÜèsR0 a¥i˜®^’­ +F +øçÌc˜*š¼3-Hn +r‚pPePT‡y¦Ì­í4³•b +~_ÔUQŸg¥ANfù¦ßË›.…²|Šr(g&·O™Ê.nÁ:vÂ$,Seyösgp– ía“ÖBë>j9±%Ü°ß1S‹ j¨ ‡ +~ÏŽS…_ňr /meÄõ„߆/Œ(~["±'Ý[#­™Òº* o»¯¬ÆÜòõccôLhžç´QNî!b{zøu}õ2J—y™²—Îø¥Ú¹Í)£œ2ˆ“%˜ÉXÑLâ6¼ù‡N1¤ßÕa!Ö¢ÄzŒòÛ²5˜í”ЈQ•8U“ÕSOqÕÀ‡æA9©Bý‚*¨¬ßŒ,RP2”ÇôP^ +¤…HV‰Â¯Ò"$R ++YµCµºyõ0„m%؇âÓºbEl‘‡)¦$ë¸<%ÕÉvFŒ¡Fw²lr ABø"õ{'ìC…?ÛÎBfÅ6­)uÇÌO‚èvRˆäýÍÌ?ÞÊ< £)TÏs­‚ÐÎîƒ0‡‘À¬½•æ`ˆµž”Cy²4NWóÚ8A:Á4ÉËa¢ds„òT=ÊG¨ÔU+{7¯ÿ¦øâODsâ7Xì_Ô^ '(";‚[YÁß;§@ PÖˆÔûYÊE¨Êpï5e· òZ’ÎÑU¥y)6γL9MÛIöCk¤Qš©Å©J”¬f¥>m/åú®öã¨Jë=µuD•&Y©–“Ú°¾¨6âÊ«Öò9ëÎ’¤]àjli—®ä¤~ +RÁ% ;‚ªkqb3ÅBŽ¸¥™zœðr\'Ey9Öß>=Ò¤*QÂL0®²_Y¼­í|åÎncŒ•ã+”="Ü æN³JŸóNJ£gzë´>¹U›!¿«ŽMÛ3À.Ìœ¦øvV§ý·-¥Žß>5Án¤ø”¢ýþ ÁŒøiÝL°)²™¼™W6=BÕL'Íõ¨òa’÷ÖS Ì3a-yu=É¡9V6œ—¢¨0ÆŠF$§lÅèõ¹£¢yVûE±µ! ©à矋kaüA æÕSÃ9¢LQyÌX»´±Œ<[óÛÉ¥8^Îr4Û&Ì…\?K³ÞÇÁüZŒÆɲ5€8€8ì0 ^Áøx3÷ñfv;I'=Ë´’t#‚ØÑ‚™çº„Ô¬Ào=A­%„ÍŒ–¦ª,,h‚ëÆ 'MX Ìü,„Ó| +wQ¡ OÈÒu”o±P¡ÃÇ°ÄÿåZ´¨uÄê$X p®G‰r‚ªle@þЇyH³Õ8]ŠømÅ\FíuÏ€ Stñ[–Œ´·ž¶²¢ß{H°ÎÄoœ¡´Ò|-#¶’L-Ç·â¸ÊŠRyጮ™ÒT¨LIwœ“š˜1$ü™楫z퀴‡SôfšOâe\gØFŠ†b,oçä ¢†þòâVN !"cŽÊÀÚ­Yʲ*7‹ZQüýó¹Ú1Y^%ù_Ýã+Ë¢Þ£ía^o+í‹öî{gü,ÍyÛe;'B\€¨ŸF‰4O3½s+×ÏýÖ`J×ï‘ŠŒWà¶ÒÂÃ$»í÷¹v¢E+MU R`½YŽ3ÍÛEä)ï]ˆú°÷pk¾™‘&¸õ„ejix-†I¢ 8“ðçD^ a¡´L [qúa”Œ­ U dä‡1f#ÁÒÀÈÇ[ù)ZˆÔÝ.h[e;£²À‰0 ¸ß^ªi@4øm’öòÒP ÝOŒâŸng? ¢9ªì4 c’`[~\x¸À>„%n.àçqÊKRB/’ ÒÒ\QG´³Ã»sTj$q“Õ‡¥ÑÓ8Q +#j´h愺ß ô€Ð‚â¢Ì©\ßÓîg :ŠÁ›·1¹,Û@½ºûæýß/ßG;Jš9¥[4 ÙöÕÆ©Ñ9/È~ï(±b¦èªÎHçts…S¨"W¥¬Iµ€¬ƒˆ•¤ª¤1ÅͪOäêþäè]ip¹ÈY®Î•÷ôîµÞ¿Õû7”;“Üų/þ‚©Mf Ú$ÓL² LPÚ[¾JɈ°Ü9¿/§B,x„ó/Vª•ª|Ìn&!3Z‹ªm¦¤pÁŽcZajû§Q|=ÎGÐrQ_QÎi­Pe˜ ª (`i6ãäÃHq#Nlg…,í!\áɢʩÁ¬ ̲• Ãy¸o=Î>ˆÒ[)i+)BjE#˜W&ÈÏ"Å?}˜xÁ7|04j@ºúªdƧ1|=ÍÂáAÒú¬ v3L¦*Ô2L~(¯Î|*®Géõ(Îê¬L¨ù Œþd+óI ´å÷‚7 ûã ö#€‰dòUG*yþÿdé=˜Ü¸¯´ß±Á–HNÄÌ çÔhtNh ‘9ç8À`rÎä0‹I¢HŠ•,Yq•¼’µV–夵eÉV¶-Ër\¯÷}ïî­ºuïi¾· +55b€8çy~Owcº`ñÃÃ÷!•Mç€ßŠŽšÉ#Fòˆv1¹duwÜšfmÀ0“¯Ô³kþÌÀ•‡Ž“_zààó6&chgT° +Ì)•ÖÕN ó!«E$x'¿PƒJÛBf@ZçôSÑì²D‰JSò´˜[H6w6O=”™Ù7R²Û_BÃm4ÜÈ€ªx´kç‹Ào DZ—žBF:@_n¡êÂWnÂÕ)¶ÒÝSHDƒDmL˘Tó@#Hu!1#W‰P]ElÆÁ*7ñäR‹Ò&iqÉþêÁ}¾Â܉²C7Iu vPT¨dP'ß›i")7mñWAç 6dÆÎäl`#ÆMĸŸ´€ N¶²È®(÷v7P'F/È{B¹q 85[tu=6àG4®1ƒwÒBi>;™ÀØ<Âä¼BED@£ô. Êਞ° +P` )ãFzÜDëÝÈã¤]5`C“N3 2²C|DO3 BP6*§ÜŸ—HhÜŒÙÁä k@™Á¯ÛÈ„‹ÉNÚ|ffTÈHÃøµ  kÜHMšpÉÃSN a-¨¼²òÆ qˆP?2 öD†ÛFoðÞJ¥l4¬mÆŒE'Í Ô* ÒŠÉF4dÀ¡mtêæ}̃cF\‰„ ’Döõ·…Hý€ŒtÝL +ã’ùæV¬¾öçäó.!+|¼*,aá:à(c~åNpBb–/°ñE"2 cs6.‚æ¡Ó¡ââ¤K·ÓÙPi;Ñ:–îŸLö#‘*„ÍxcIÍ©½²LÚØ›œóåÖ ¬¡R†ä ”•û<ºƒ }&Ã&¾Ìr²y@®ñ¦,LÑ Á¤Ü|Þíƒ"l㡦ɂ{ÂÂ"¾"`¿…LpÉÙdçš%ãÓâ’‘ˆ[y ™„òƒ$2fcÔ.?З”›G;ü#z¡’B|ÚB%FŒ8x“•Ê‚ +¹ù²Á…•„Z£øY¶Ñy×M0·CQ¹Gtøˆ‘žrà-àŸ:WD•»ùŒè¼€ñ?°×2EˆÕ@jÁ#TÕÎà$xŸ+d%RV< ÔjtòG 8˜¦þ&ýÂ[¨­¼Ù+OZ|j«Oc[„h !1>¥<'ìâ‹Ðà°ìP ¸Tws +…j]~;•Â¥¬¡Á7’“Öàh¨ +Ð1€ºqJhp‡@͆´^0ßI+ 1h) odBe€:+õòÅ1 sDƒ™tOy´N?Ø1ê+‚페HX4ƒÇ?¤¶ÿÓάÜ+* ½àb@?K¨¿Šª:oõF¡+¯Q±6¸jÙ…‚™––‰`ÎÅÁ°ʱ‚äœCóz˜œKL8CF<ኜ<í UUÖJÅœ|Õ ‘ªf.g¤Slr6=}ŠI ^Ù}e—ÇÂ-*>‹Eûh°qž¯A$¨.¨'ˆJ 26ï õ,BÕ&Ô€·UvÁˆÉˆX²Ò ËÀº ¤&,IEV2®¶s¨¿d‡GÆÍLÚÌf!óBb¥Â]1½¨ñHj·¨÷†ôÞ0<`ï†Ì¨™‡B¹'2y@¡ZDËoâryÙŒÉV,fõFuNØŽÀ˜ 3y|d ä9¢#&Í‚ÁõÿßÓÜÍe”¯d<ÙÜròéCjϨ‘…pœ|!XÜࡵÖÚíÃlÂB™Ñ° L¹ÙzJ V£™Acõ"¬Œš™)‡2 Ê0±A¦w!XÝ5Ó +5ÑÉ-V#€ŸÓW"¢ÓÒ›]åöüö&ÕýʤcÒÂñBŽƒRăWŠV6´X0@Ò=9l’á8©g»û6^þʸæh"ã ¡.!›éKõN!Á(zûNæ«ãÆC6ƒ‘€¿°á´‰€0(Ý:aÖº'L¸áf.†j7PQ,-7ÕP–CZ 1ÑŠ§¼¾D-HÓ€£„_UÙn·žt€€p»Ö:˜¼ jQÿˆlTѵ•…´ + npù©@Ñ—hŽXÈ›‡Å¢— »)÷¼62Z+ïÀc´T…ò°c0"GO˜iÅÈ”·F‹K6*vXíïƒv0£q'`*À9à(Â|iøf¶Rëqxåq#3nfÓʃSã6j\붹ãï‘)7¸§â§ö ‹ûR*\™²[]¬õvæð”kÜÄØ©¨@lwß¼O®Í4&p#p¾ƒŠ£¾Hú¨ž\„ +±âaXXðM;äi z›‘7yD„žU»D3!Cò%¥ +Ï„‹³à˜‚Ìb£f2aQ[h‘sÐYPixΈÑ˜é ˆ®SÎa bD€C7k›6b hÉ[§\Ãzð_ÆŠEÍÄÑHâˆN)à1ðe#aöJf4èåsÔnZè¤ ”…åaF&, EåæsX°ê ¬L¸ÌÈ.=cg’v:éâ³V +Ì.ÅF!;jÆÌ<('Äyp[0Íq+e£ân>ëì 7 dÜƦ5ˆJˆSÑN°¼î+o≛™t‚ÜIJ·ÒcVÚÆfÔmLÞío©›cä>ÀÕ¤Ñ{Z'ë6eó«þ$€*}Xã¸eÒ<¤qX`œñ/;ïK¶¤LWe"Á\PºÆ~Xm7°„ÔB|U'_Ô"AHâTÂp󪛇dTóþòƨM!.h(xÙµcDãѺa#¨aÀÈ› Ö¡2¸ö˜‘´¢vòj—àæR(ŸõˆU>½DÇgMTrØDÙ¸œËB_cñe&¿‹'æá¿tžˆ™LY˜uTå x\L.TÜÁ#Óf"­m¡aIalCS.å7wñU_1Ý<@“½™Á3u#µ(Ú•1y †Z‡ÒŒ&À&¬v² ݾ*êX¨Œ^9S iKv°Ê¡<˜¤0•s‹u+‘¶IèðSµ×½† ºÜð$¬ŒN+§h-Ôˆ²§ÞQ-:¬öŒiµ;d"2v¦¨óĵž¸. \QçÀG`­Å!öBܶR²“)2ØVêk=fWÀdç§ „ƹ™¢Ñ7z¢Z§D)$‚',DÚÉèP›ôWU\gõMÈ6üá©[UVÐ(pç[Uv0»¡›§,MHxÔ@i!kÉ['\MTfNeÔ6Ÿ ·P!ÝguK ¨€OÀ„£Z/TÈ”9çM8O8ÇtØ-Ž³’©m„……-7Ê1,³›²p*#£¶øìdrÒÊ‚Ï‚‘Av3:Ü1ye¤ýé¾)ÞáÅ[ô綽á.l=tºè»aHVP]ÚŤ1“Z.6?f¤*HÍN<[A +‚d´mpé%#™„ôGÈ}·¿>aåÕ“YÇã && ›e¥Ò„l"& +PAŽXµi§P·AXpŸÁ%X‰0ÛøÍñO…xßåËÝ¢C4î ê/£¾èÿ”3í¬quî0è¼ÙÍ;‰0hŤÃoÄ’ˆXÇCípy›JÏXMÔ_…¬}Xí¾eÊqH‹LÚyÈ¿´'m¢KB'¨í*´fÆc\r&ÝÞ•kkWÍPH8Äê…B¨¤ ‹"x rC°fF‹„Ôå¼0Ôæ/ãbrÿç`Ô¸‰²’I£7 •1êÈÔ€â(¬%U|éÁˆÐƒfZD¿=¥Ú´‹°J43R£:ü+#毎˜Æ´^S²Â옌Á%j¬Œ‡Më‘Cæ1¢€2Ój3£Ò6Sà.ûW†t*?ÔZ*{ø<ÉIƒÐ)/ŸºéÎJ8…·82¥lŸrQ7ÿêæШJÔé Ú½!ÑADd !›½ˆºÐ5¯ P !Kˆ +Ð)T–Ý­H€7Ð"n„tòæÑiü:³óÃ`ývÁ \áôpHúl´åËÌ1ñ¾‹«„qˆŸj;¥CØ pUŒ¯±ÍŒ;ø#åOÍ»8èkš]¥Àƒ0°âqˆ3*¦A$ˆ66èn&`»$Uv~Ò Ça#6¬óŒ=Z}_B„2„ØÇ)  `£v6KÅ:D¸i%².¾ *w‹Ê:¬u›É áTŠÐÖzd@âI3aD"Þ. ËbÆSn®ä"ÓJ$±sС`ãzbLO¨L´„ñPºŸlnÝp«”eL딆µøÔ˜‘7 Z7T¬HãQ£CSž ª2G¦<‡'•ÖÙ}(ŸƒŠä6(WÓ‘‡T¶Q-0€1,5?n"h ¡ÒyÔ™€â ËC­jm¢”œ·“¡šøÊõ O‹Žéˆ1 í¬2³WѾ2¤Q» L('ÐQ‹7ÚŽø*€j ã·ª½cåÚ*ÕÍì0¤öL)«q/®œ²ð ~v4ª·q·ŽY•KË ¼~åú.WÈ%ä=²ƒÍ6˜°¨•Î"*â/ gýE<Úô†ë*+°P•‚‡r6ÊÂ+½¿å×ñO¹E5¼7ÿë TŒrúÒÃeH©H„ÊX jer..çb3˜¿dƃ¹xÏÍç!¦9èô˜µ3GríDÈÜ>“78b¡•®±jWØNgP° ÀÞÊd'ÃzjHOÉ»àE¨¨·؞ΠþŠ™N|uÒ~hÒÙÄŒÅLÖÎäÌdÆJå@Ç&­ üðœ7^?¯ó:¶º3 ÍBéÝJÖ“z$hVN°¦¥4‘ m5e¡!Žé=1ÔW'üuˆ êŠ°+Ò a +ƒÕp0)"XÅBõ[4D~(BдQ ªsõî˜Ö3‘Ê¥&j§¤µ‚‚Q‡&\‡TN0²›¯@MBªB¢Ð54‚²­•×yõÎ 0ðÖ»# Æv2®ÒzþáÖ‰¯ iGÔˆE1å쾃.hÀu†áI«ÓºÌȇ´¢•MPÎXiÜ0eå|¢…¼¯s*ׯ‚.ÝœT?¨Ä?ÑuÈ| +ÞÂk‘èÍ ´Ò@˜P.*iõ¡,¡ðÔJÞ Àt Þ¸7ØàÓ³t¬KE›lªçò.±ì 6àçlrFÈ-‰Åu3“7 ×yÂ8”ÔF&uÞ¨…Î é@ßä8;—ñJUŸ*†ýõÁ°šŸ!ƒZî¸}ÄWvÐàg蔂•ÌÚèÜ”;¨ÃdˆŸZ$¨õ£²(×@³CuÙ™Œ ì +k=`ñ¨Þk#bF¥Œƒzo|Ò‚¦Ã‚M VµC ™°q#zåDö°Î ¥eÇ“oÜ -C¥Tz¯b?!T—rj‰H›ñ$$qÐ:•ÐÙù\Uë4Ê vv4ä&c”TR™°I3‰pi.1 pó‚RhÌLY§œu’11Ùj8džtp%+“×Á”±È°Æ3¦]uÝ:áTYX­rõlÈÉf™XŸOö…d•êzX‡0eeÇLŒ CªujÞP#R[a3}HCl²ç ÖPѦ¿°må «©f¥â4 ¤znTÂÁi¤°P×Ýþ‡•Oã¡Ÿ Á*”¼›ž •×…:ÑsøJv6ÏÊÓöˆô§{ŠJ=€ºòÄâ²;ØFmX¶S+1â2¨r©›œ&c#T¦i¹ýE—XÙÄä“]ærK¾ü +Áj®’Ë.N¡a—¯$d—…Ü +š§3!g¡bzoÚÁ€>*-ÉM©¸*­€&k1v•j0Y€IH6*¡vú¢³ñLöµ±1'›AÅŠšÃ#M$P„Bå’Óˆ?oÄéê V¡qÈø4,T°¼*æØtÏ&æGl‚Þ+{|ðüïÁW#…gò©™Ìô1©²âµ}ùE±ÓY$bÝ`eEÌõ¡ºŸ›ár3b ö±í/ΓPKáš'X¶Ð —˜óH +’ Ù¹Hy½¶x¾¶|.T^b’=4Ü@ƒ6Ñæ’Ý`uC(mÇ:§é䌕ŠzEhº¨ks¹Ew¸å +6ƒõ]61MEÁ§Ê0k6»H&x¬G§ƒ¹ÙÚÒ9*ÙS¹ý°qàz|fv”Õ–ªÊEËþh£i\œƒŽ0±:ŸjŠs‘ƦXXô„ëv:¥­… L¥œœbÙv6|eðF±¤`$™¼)VŠÔ ++ÑÆN¨¾ª®Â– •ŠÐA6>ë–JT¢K%¦#õ-¨.Ø,2ÖR»|VØR¹däšK΂ÒË+Éî±öÖ]r{5ý%ó\¼½›]8“[<in°É®?Ó­,«.J÷ö| ”q¹íÔÉD—Mt1©$lTÒB&Èh‹ˆ¶±pË_XÊôb]_fîlŠÙžÎ ®šdâÝPy%ÒÚ‰´wÝRÕHÄùÄ´…«,¸ƒû23lª©o––/´ö®ÛÑêJû6ÑÓ{STbžIͳIØÄÜÜm¾Âª•ÉŒ™HÐL')S‘ªT^âsóþÒjnîL¬{j;›É·7Ü€åʈ"6:‹Û|n%ØØOöNÓ‰¾\Yu +9t.!ªîfúgúû÷¯ž~¼·q±¿sÉ—Љv´¹im +…9¹¹^]¾ØÞ½î+.8ÅœƒOyüY>ÝãÒƒÔô±ìÌqqafÿîììqg¨äôç¹dÇŸ›‰¶¶ùò†¿¾Cfç¨Tþi¡ÂSN~„%1s:>{668Ÿ9-•×ª §¥â€IÔƒµ5>·Èe|ù¥Xc#?*ÚÜ‚ò¡ÓzV6MDÉ-pp_~!Ö>šêD@96^·PADLRr=T]KLïÇ»û¹þ‰Úâ9D,À+rô–IôÅÜ”G²sîŸUw<Ú¤Ã.ïÏ/„êë|nŽIõ¸Ìt†ˆ·‡œf³sáú¬pnî4iØÉ°›ÛÐ Œ[(‹™…ÒâÙÌìAªw,·p.ÖÚšÛ»Ü%*m˜èmnßÙ?z×àØ]µÛÄL—‰5åÆ(þ)§ËSƒòÒ¥Üàd¼³[[¾oðÑ` TÔ—›OvöËË·•–Ïæ˧ï-͇E¶qIo° U¨n¤çNEÛ{ÁÒJnö´™KZ0QÊtp©0i#½\²³ÛÚ»»µ{uéä½w>ù.9Ã$*k×¢Í}·¿î‘ZtjÖjYÙœ º|9½'VèÏMK¥…p};ÖÞáµ ùd}íáÞñ–TvÖ—ìVΉ¹5>¿ížô—7ÁÙçw¯9Ä¢Æ姲ZJMŸH÷Ï/dúÇÖNÜ»yé "ÖŽTÖêk···/·¶n/-žnn_í»Ñ\:í±oÇ;;n1* RÝ£0‘Âü™êêÅæîµâÜñÞÆms§î%ÂåêÂAwïj¼wœÍ/—/tLÎ_Òípe†NÔllœˆu¸ü¢Tß +ÔÖSýcéÁ ±0S˜Û‰v6ÙÔ´xBe_n&P˜óççk+WbÍ}§/…GË¡ò­Prtd¦ªmeû§sƒSþ\GÊu™xK,ÌË­­H}#ÝÝ+Í]>yOoû2¨%©ÁÆçN5V/fO¦{ÇåÖ>ï·nk­ßn¡¢P¢PÙÁ©ÔôÑhk§±~yzóê‰+O•æNšÙ Ÿ[ðW¡ì¡¸üº¿r›»D‡#b$N®- ùA¸¾*æBåÅìô>“˜ƒ.€‚V—2½½Xc‹7P1 nX\8ǧûÑÚj¬¹ID›ÑÚZrz7PYv‡ZB~.7Ø‹7×ÈH9ÞÝöe§åÚbyñ,¾TšËöwÏß÷¼\_ƒuh¬œïì]/,_HL WWIyø6×Þ_>ñµDcÕJú…D=߃¹œom],¯]jíÞ aMÌ.C†·"ÄÒfuý®òòåHëX¤{ilIÅùts=?½aÄ$=†0EÑär–B•52Þe"åbo7ZY¶Ò&3/5v}eÅyƒå%5ê׺Ÿtóqö"·² cËÌžM ΀]²ó°8ât²³km„k+ *¹ýGžÖÇBGƒù™æúÝðh¬_…“êk¥éí~ã®g¿‡øsõÕs½{*ëwBÿ66¯6·®ùr ç¼òØ+b±¯rò” ±šœ>Z_¿8â¾Âü©îò©‡ž~-Õ߃(ÌKvwSýƒÙ£÷ìÝñÔÒ¹gC•öì±ÞÚy"R£ãŠûr‹rs·¼|iæÄCKçŸ*,œ[ܹØ[=…‡Ë°kÒ"—î󙹶:{üÁÁé¯GjÐB¼í èX“”[°b6¾d劑ÊVqጓÌØÄUÐ+.3#dûåÁñK÷=ßX>HÅÂÒåÌì¹xg¿±u:…Éozý¥pa:ÝÁÄÂ…Y¹±6½sypìzuõïy¥Z¥wüÜ=ß$B…hy¶²pº¼xžNXñúf´±å/Ì‹ ü¬ÁëwÂ^¤¦cÍŠîæ{—Ÿ¬,œYÚ¾¸¸w;­À¯'»ÛPóõK[¾ðÀóÉÆúÂÆÙ;ü” °„Ó—‡°tïœÉ/ÞYX¼È–¶oÛ?{=’k¹ù“œf²K¾âz¸ºÕÞ¹_ªlؘ¤/;·v þÙx°Ç_Ù€u‹7ÖÏÜóÌÒñ«&2ú‰ˆåDï¤Ü=Æg€ÕÙhg÷ôý—ïÞŸì‘áºÜÙ ·÷äîñÚÆUÀ!3ˆ9n¶áŸè +‹ÙÞ±ÒÊ¥äà6©¶ãáóÙSB²nÄ9"œ‹57òýcåÙ£¥Ávsù$Ðþ¤‹áâÕL÷ 3}"ÞÚã2Ý\wk÷Ü×f_wrÉôô.X@¸±Y\¾ëøŠËBºôì}§îz‚O·Æ›˜ ”–„Ü T_)-Mt¶gÖξøæO«‹§8¹6ؾ¼vþñÖÑý£÷¬œ}¸µsƒ÷ÎÜ{òŽ'ÁÝ€7àMÓÓÇíÝLïheõbnþ “ìg°u ííÔÌA°ºª®çfN,¯] –»Ê•cå$€GÈ]O¸ƒ!ÄÍ&š›ñòL¡³áR\²-BÂMõèD7\^-/Ýä xYX¾Fé•ò\º‹„*TVI\ž–ë»F"b£¢‘âœ/=]Y<ÑX;nnzÂ-ÄWÎ5wÎ\ŽO5Í•Öæí…ù³by•‰7ÙDË(!Áj¢µ,,Ú™(«™ž]“õgû‰ÆŸìö–Nö×Î’‘jqp´¹q±¾z¡¶r[såte°Lw¯?ðÌï|0wôª‹¸}yòÄóßI×æ½bnölzö\nþBeí®Úæ=l~Xî®]L¶·5n¿ BBLöAÉwªK·]xøUðn)ßÏv6MXجՠ¡pEº³·rüÆüî:\-ö¶­5D*8…jûóK‰öÑdkÏÎÄCÉN8?çÒ°#à¡\n™JÎâÁj03c%ƒ…Kéhu¾¶tjîàžxoÏ,O8…Iëädh_ª#׶b݃üüÉöÖå…3Š¥E3pù2n_:T]2Ï­¯ÞVY:Á¦Û.>"å:r}%ÙÛÏÏŸMNÑ™9DÈFr=È©¥ì€ œdÔŸìæOfþ8È ð;,TˆT„Ü !CpkSñ¶SHé±”wOÝëËÏ é½N&EFêÀ9(pN êò`ñáB??½mÀ™ÎVÿÞÂâÒvcùrvá,“é纻G¯>ƒ†ÊꛟìP>ô!÷ü•Ýôâµ`eSƒø_:ÝÞ„ ;U^>__¿<·wïìÎõL÷¸ÜØæ"•ÍS7Jƒ=78 +*yJÈ­‰Åµdï¤X\ĤÌú±ËéÚ"ä(VuÝ_\eSa5Ù=çf»kâ*oBšW*ؘ¸kå:›ÅÞÈ;Y0 ´ŒBßAv Œ5·"ååXi)’™µªÍLõ³™YȪH f&h˜X¯»y•K÷̤Œ…\z¦4¶8å¹3²Õå£öò Rlú¸X^àïx°»}9^ßðøò'/?Ò]9©WiÊŸ_ÇC?ãz\2â!dP ¼aYZ¾Ü\»æ/¬ á–SÌór}ïÔxqÖAÅ“ÍÍîúíÅ™r} $8?Z˜oÌŸŽåfû÷V–/‡Kk¾äŒ/=Àà ˜i¨,\P;hÔ— •ùùêüéÎÖ2ÜÔr‡òWï.èXÙ+•™X‹‰÷nV/t7®˜´P:ÕÇ3tj.Þ9‘îv‰y›õ%*€OD0o‚n%„T&eÂ_´c‘I­Kkö¸È ÈûRÓT´taÆ#ŒÜ‚~„”ªC|±ÆŠÜÞò——P©¡ÉFDÄx³Ð;†Š™I 1eب©™(¸Lg?”_T>c¥>jlŒ›q<˜äfr3Ç`lˆ¿hDFÄaÁ’ÂÄ =K‹ê«—*ógãm¯T7 ¨,3 ¬óÃ7×Ú;×Ê‹‚ÅU(æq egeo¸ˆ…ód¤âKôäÒj¼¼Î…ª¸"ù16¦CŒvÒŠð^6ip +*#¡±1|¤ºwòz,ÝšÐz¼|ºÕÈ`]9óŦ¦l,¬g²²JøËx°¬uÑf/ôl"Tèæw+Ë{ÉÞRrz±<¿>8zÛÂÉ‹­“l°, D Ùì,&fÕNÆ‚‰(å¢Å@¦-º\ªÊgj‰Æì‰+ô÷/ÄÛóžPÆ-„ŠâüV µ` àù‘Lu.˜m«­&&Q1­÷ú“ñçÎøÊ«N1ÃD³ñÖ¼X숅¦WΙùˆ'œò+•µ­ø`ÕJ¹Å$—švâyÅ­Í€p€`v¥¹ST4ƒ°"JúrMTŠ3ñ¼­r!Xì´–wz»'}¥¶úÒ}nÞÍåônÿð”}Tã4!¾xu%RÈ)ØÈà™ÜÚ +‹D¢ëòÀ—]b<\îP±¬žŒ´„E‹ÙþQXÔØØ1µÃ‰Š$Ÿ$}i5¡~G´RQ²vi ’‡‹•×N^™=zQ,´Æœ˜ó @Aù·Õ¹Çõµ•rв›K©môÍO¨H‡O"•5)·ÀD«k'¯ÎíKvÝþ䤋²0A.ÛÁã5é÷Éö„e<\…’¶’2"VK³ç[«wŠ™žjóR.Ržƒh@Ëu6Öäã èëL+3³%åÛre6V[O4¶C…¥)ù•aá ;&æ‚©i““R™Æ4n£ÓÏEšùöNª¾…ªSZeð:é)Ò¹ëœ#F 6â¹¼Eú+—_H´¸H.[ïÍo_Ý?wpéž+=ußÓß|ê•7ßúáO?üäwúëß?ýâ¯ßýɇnô¬i™°Õ4:y@.Ò ³Gk>ηãÕé|«_¬÷×OçÞÇ_xàÉo|ç_¼÷ño_ùþOO\y°¿v:×\!ƒ%ÀE‹W2 ><¥B%+4¸E„MÉ¥ÅÂ`?V›“k3{®?ü¯¯<ðì¿]zàÑ+?wñÆcçîþúÕGž{åíw{þ•;îýúî¥ûÈHÉŒŠ&„Ç| _²Ê/ðÑf¼4+%ë±B¿Òß\=~{oiuïì·ßsÛµ¾ùÚwóå_û‡¿~ñ‡¿|ðéç_{ú[Ùú¨7Òn6Ê-§j»:‡¨±v¯È†J¸¿d'c"ìõ%q1,õ6Ž]™)5»s[Nœ¿vîÊ{æÕïüèÕüìÙ×¾÷Ø ¯¼ùöOþÑç/¾ù÷ÿýgý¿¿ô½Ÿ?ôÜ;î˶Öê G³Ýª’©´æW×Ï\¼xïƒ_{ò¹çŸ{éÕï¼óÓýûï¿÷Ñ+ÿþó·ßýèË?þõÿþþß?@‘þå~þ«k~£¶x4”ïƒ`¢ŒM+­™¥í}xl;uáÚ}<ûÍ^{óÉo½þ苯?ÿÆwüÞ‡¿úè“/¾øâÿ_ÿý᯿x쯜¼ãt}ÕI_)œO·wtÜ…‚r¡ÞYØòÄ¿|ëµÿê“w?þõ›?z÷åï¿óá¯?ÿø·¿ûùÿþúŸÿùŸOóùs¯¼uòö‰ê .ÆŒ.Lç í¸±¤ØZî-îힸýòGo<úÌKoý৿úä?{ÿw~öëßÿé/ÿù_ÿæó>ýô?þó?öá§w=üT}~/ÓÙñ¥z&åﳑSF‚ò%*œj;«ÁFsvmóÔÅ«=þ¯/½ñîŸ|òù—¯ÿûOñѯÿëÿ÷—ùÛ7^ûîGŸºx×CRzš +5I&<Ý_YÝ<8qêÂ¥;ï¼vÏõ‡yø­ï¼õ»ßýîË?ýé£O?{ï—ï½øêK¯\]ÚÚKÕz¡ÂÀE'l^‰àeFˆ„"ñJµ¹³òÊÝÝóÐã÷~ý‰§ÿõÅýüýþìýW¿óƒïÿð'_þé?`:ß|õÛ/¾öÖÙ«_›Ý:Wl Ѳœíd›s©êt¢Øœ]ÚYÛÞßÞÛ½zçßþöw¾ý½ïÿ‡ï|øég_üùo°ï~ðég¿þÍ_ÿöŸ}ñÅ[?úñµ‡šÝ:.Lsr™ä…`¢TŸž]Ù9vöòþéóûÇO_¹~Ï+o¼õË>üàÓß¾óþÇoýðÇïôÁo>ÿü“Ï>ýì³?üø£—Þøîù«–úë(GÙD Ù‰–—1_–ò%¢ñbµÞÝÚÝýÚC¼ãøÑÏ_xý­Ÿ¾÷«/ÿô—¿üíï¿üøÃ/¿üâ|ðâË/?ÿò«[g®ˆé§@¬„x3”ïEòîüÆ`icÿÔ¹Gž|æ/¾üü+oüÛëßþé{¿üëßÿ×o¾üó»|üÃÿð_~ùéç_¼ôÖÛ>úLµ¿c§dƒÓÛX3âwˆRg-_l=ùàÏ<óҫϽöŸ¼ÿá—þË—ùŸ¼ÿÁ‡Ÿ~úåÿøùï¿x÷—ïüÉGï¾÷‹‡ž|êÜ•{•i&”1"¤ÎNˆñj0U‹eZ‹ëG¯ßÿØkoýûOÞûàíŸüì³Ï?ÿòOþø7¿ûå'¿ùó_þ¯óÎOü“wöîûï?üä³G/Ý;ü#×Ç„Å´ºæ3Úp/%µkÇÏ]¾þà£/¼ößxë[¯¿ù“Ÿÿâoÿû¯¿øÃOÞûÕ/Þûå}ôÜK/Ÿ½ýêÊÖÉP¶—ïîÃÙzkPiNçKÕéˆQ›3Ë ;ë—¯]¼÷¡{î¸véìÅÛòµ¢ xÎîe¸¨³:+n°^Â/G³ÅB£ÕžéÎ 6÷Žnìï̟ͯ8{ôúÛï{àú…+W/Üuﱋw¶—V¥d‹V‚ùy.Ö°"œÝÃ!¤ÏKòœÜ?~ÇêÞét¾Ð¨wwÖÏ]8{ý¾»¿ö؃ßÿþ÷Þûà×ïôñ'Ÿ}üÌ‹/œ¼t¡»´HdÅDÅ Ñ•8)‰ $ö.¿pO¹·TlõƒÙõµåÓ§ž}öñ·øö‡úÙoóöÞ~ýW_~éÅgžúúƒ÷ßµ»Pï-KàhÞÃŬDh +¹×Ú)‹‹öùÂù\fgsëþëw½úò˯¾õÖ«¯~óç?çüýóÿö¯·_<½¿»Ñœîå7%èì&Äàá¢ÃN:ìåÂ+F“ùj³¿ººuñ¶3_ôágŸ{úÛo¾úËÞÿü‹Ïÿôç?¾÷‹>ýôã.Ÿ+7k.œw‘€a=¢2k‘ =ê!Br¼‹—fæ—×7Žž¹í¶Û/ßqåÚµ»®ëÅç¿ÿö^~õ•o¾ðüsÏþË+/ë÷?vúø¿ÜyõžÇêG?þÙ÷~ð½nÜùä×î{âëŸ=ns{«==—ª j '¥LÿæåÐ4ø²6Âåá2ùúööÑ+W¯}ëÕ×€•žxúé¯?úõžþŸ¼÷ì7þíÊ•»×6w‹õ6ɇ Θ½’ÞÆè-Â8½œ‡ôùã•D¹ßè¯Î¬ìyEÉŠS’7{y#ÂÂ>z8ÙàdŽŒéµFÔ…I:âðŠ^*„“!ŒŽ•¢éJ0^p ¸Íãµ£Áp_ˆ–ËF"4i#Œ.aN&ªvÃ:‹Þ†!DÀŽ°.\ää°7)†E)ìÅ0–eÒÙt¡ZîÍÍoŸ<·°µÍæÜ´OkÇ'm^­“2¡â×:X½‹eC¹@ªNˆ „ R¢‰¥‚áhDŽ¥s™d¾«·;‹ë¡x2‘J·»Ó•rYƒn/ï $„‘ VÊÏzù¯ª,·Ï/7x© +gê•f1_LÆäxL^ÛØîtj¥R¦ÓŸŽçê0HÒŸÀļ‹ˆj-„Ú„NÜ:‡JçÖØy¯™÷…«ÅÚb*[/ä*—¯Üuìàx¹˜n·«µúìL®ßÎêv9<¡ƒ 6aÃ*ËȤ ¾ÑÛ•OâãlBŒ”Ãñb2[Näk¬?êp{9_8ž®#¹\±Ùí-÷úK‚(&Óy)”ò’ƒƒ5“ÊŸbð†¹hëã"8‹à@y^LE³hj.X*÷ŽÎl]é,ŸB‡Ë…Óé¼_Š"8ktâPE¬Ü(Ïó¥æÔúo²yÃ6iFØeŠ F£©TºHeÒ¹š(IŒdhÁ*äJ(Ñg¦Mʇ¤Pn†µo1VÆu.P;*x}Y:TÎÕ×OÝkăo‰@ +U$.åáÓ,8eÆ]dØŠLšO˜GõîI#惄 $:\¸J‹9TH+“ÄA©í¸–íTҊˤXpSò„Ù£wÓ&¯èÂ%„”,Öàb=þ­°ñ† W,Êê¡€ \¤è¢l´d§ÃZ7‡ð™qöU•qXëÖµå5lõÅõnNçd¬^¿ÆŠ]¤ÞIz訩BLÆÅ,º¨°ÉÒÁøÚ86i·¡AÜ—u3 Lªús˨XR™ *ZQߤÁ3©uMˆÎàЄ‘ä +#ÆPÊ11"©íÌ(ŒÕÁù&iõø5&ÌàäµNQë +˜‰˜ÞtP2Ê'2µÙýóñLU£³0éÀ:¹8F…´ð +S6•Eè”Jçùç#ê1íÿGÒ{7·‘féž_b{fªKžžð™HïÒ $¼÷†½'ERžò*©JR©ËWµ©jSÕwºg¦'Æí5;»{olÄ]ûÏ~•=ÐF E™ožsžç—ù¾ç£Lj—+Ìû±d€0àx ò“ÅÕeÎy9ÓÍ´Àót £ô"„bÜ`õŒàÒWfðV1¹Žê=¸2Ý‹‹9/žô“Æbˆ‘³+rq+Õ>ËvO«OåÂƼŸHR¡¶ÁµŸ_sÏO;Z${ØÛzR[½@ÅòÕùèür¬P]ÑéK ÑùíŽBMI©^¦±Ÿ*oyƒìì|!’AD^2¡„&RñéT·i“I%¿v} ½æŠ\w‡nx"³žh˜´P©Hé5³¾…‰E»´æ4·i£Fjµ(“‰q¹„R™¶ e³~Âüà†ûÒ|`BAc2´Z¡“µ„+µŠýó«ËñëËOœÃÔŠà¬röÔkaBg¥L½¿k•îøŒ'6ïGC„f5•òŸÀ`¦K]%S÷'D¹å¨àÇÓa:ǤFÙν(“ñ&ˆ`Ga"¹aç8D]ˆN±f“3»ï—TÐPÊbŒ×Ḟ¨ ¡ :Äš¿îŽºh¤ì“Ë*›P.$9맢´éŠÐÜð^šñ/¹ãP‹\<Á¤11¥L"{ãêÏg£7<„?¡‡ÈLÏÂWL*‡i{9Ä…)¨ÚIÏÇÌO ç´âJª¾aÌnd΅ଽäÁ¯Üð_Yˆ]s“ó~6„™Fn3Bس^ ^ ~òê|‚!@šL ¥°©–÷ü˜AHY%7@•’ÕÜ~æÆ|tÆ…¢TºÚ9!„ììèj–ÐÛ^<åAu¢¡JMÌ­s™qL!\ ¥¼úÀ¬"bÂÆh7\ˆ”¬v×FÉÔ¥™"p¹ÂjU5Õ†ŸÌ{‰¯ù¼buëÊçfLB,F8SªbvÕn²FoÑÇ,Á ‘ÆœYŠ† +.™étÓ‘è¬ÑzûÊ"uFÏczþº]Œﻀvxg¨—7jk÷Ò­B+ÒV‹ÔRnEÌMɦŸÎzðô /5ë% Ŧkü—Gø|„¶9£ÉÛƒ«.tÖ›Z\Ê … ª7–P%Hjv±»~ôˆNwg!¡ðdŒMÅØi‹ ˆjO\ ¡ÜáùÓáî]_B*„7©6p¥Î˜=.=†2r>™í@à]]/È5å)&=HV÷¤Ü&ʲµM%׿áC§ŒJ16°Öhar%DZ›®tö1¥´bg=\ß ™ñ¶³´Òz€Ô/-„C¸–àSî0í2ÔspÑÃT]B®N;`£ŒsŒÍˆÔ5º"bEÎM2­]R¯»Þ· ’6ü/"äp¹¸™.ºa’-B*pÅuù†ÎTÊ®1F/D¤ÝeÁKMÐJŽàÈ—Ü u9.3Æ—¢\1Ê8ƒGåÑQ„KãJ™Tê¸P$Ä.–¸uc)B!…¥ˆ8m°Ã¬æéøæ×…Ñ}nyQ™Ö«P –¢jŒ)²VOÎ’Ù®hµy³ƒòŽ'&‡){1¸±›w%®ÁW/ÕXÉtá=h’ÖkKÎå½qÂòç73ËX˜LE¨ÔÏ.-Î,EJ·3çBÊL@øp ½´ŒƒºíÝ|98~q5H-Ä%Ììó¥]½snnÉÕ-ÚlöÇ7o>û6,åqQ‚L>Æ—is$–Ô„¦Ïx@PtB©J%1íñ2myÍZ-D°0-&+Q¹ˆ[-6ÛE”"®7„ºѯdfyÃW\h‚¶µti1þþ…^^D#tNuVÌâ„1j|ªåÓ3qÁ›PQ©Ì˜ÂðNïè¡Bö©ÍÕ³âàV„J/9óÅ G…qéy/zm1 +Ž%Õ80¡¸O.ãiœñýæÎS6Õq#I\kÁ˜jÅã}ˆ°˜ö„´º²˜¸¶Y +1žxD0BÞ˜´àgB<”¾Éá+Á¨ýõ5ÏÌ´˜Rzªï×wÛ—¸ž(wiÆ»$ƒÓ‹¦Ÿ°¨ô,Š]]“ò½0Pt*"ãÉšRÛÁ¬v\.J™þöÍON^ýŸ²½´m–¶Óµ=>¿~5ÀBn¸vŸ3ÛÎ…‚L„œ®¯Ts“îîËâðvª48~ð‚ +3jfk738ÍÏs+ws“ 67AäBº0øâ—êî=„” áj€ÐC´Mêm£zÀ¦†ž¸$Í…i_ÙtBª R-&Ö0µ%;kraâM(7\Q ,äýŠž c#B +¤Vç¬v¾{Ä5HOµ0 ³6ó~Š5Dä²—LùpJÐbx:Þ‡™d²©×(¹Ä(%9Ó‘Éiƒ ! q厊PŠQ±¦Sq1iUÒhéÔR”_ Ñ3 >‚K¤Z‘òãòö³ˆZ½ ý˜&ÌcÁGøp̓%q¹LH%éYñ7³áËËè| â®´8k fÇl +R£‹ipŽy\¯Çy'€q.K×µ{Þ¸ÄJÎã—ßqFåƒþw"ˆ Ç`&Q>3ãIxb"­U kBƪo§{Çla.%i¶p¹QœÍθñ¥&2 ¡ÌÞZñcöBHDÙ,„7©Ö}ÄR¾¾„La&5Ôâ†Ýظ¤U¦½XñÔb€›®M&m6Õ3*›p|²$¥ + Ad1Lº ê2™(&’Õ˜”wc™j#ZÙÏÚJm›ŸNÿÛ­¯?®o=7Û”V²«ëÉê*f㬡 wB¹¤p©PœÑfãêb,J¥a® ˜­|ÿD¯näš[§O¾Æ¬:™®VÏ+›«[œñ­tÿ 7š˜ZèŽþáŸÿÛñ³¯¼¸£-Öhr©Aª~âtïPfO²ûÅÁyˆÉÎùYD¨Ð鱸gµï–×?ÒêAÖŽÒ†–„¡Ú£êBŒ 9.Õá³}=òŽÝ9JwŽ[ž|úGµ0&ôš3¼m4yg¥¹ö°³ù8;8_Â’³>—K`P¡„òFaNF´jNgsp¾ DRa¬U6­î±TÚíÎ`ýÎÃÏþä%’lª•îœF·2Ýãüøvnt+YÛ Ñ–j&‹ã€¾˜1»Vãh|þYmûé´n„E¥œŸ²ãÒlˆŽpY&3N÷î¬ÜüÌ(¯%Ë“Lw?&efXŒ·ÕÒêèæG?ÿãÙ«š»O¨T3[ìîÝy#ä‡7¸>«µ—nÐöªÝ>îlÝì†3²ý»ZyS|z\àv«S‹½£Êø|1Ì^š¸ü€à («5Ýlû|®Ö´Ò¸¹û¨wü¼¶u¯°z[oì“©&©ä~ó·ÿåÎËo"œ9 µÊ~níivå¡à¬-†EðŠíÑñöù§?Ÿ‹ðëLR£»åý—µƒO´ÎM—S2ï~úO;ç¯æÁPá†ZÞ,®=Þ¾øUmã¹7¡_9Ws×¼ø\˜s% ÒœN—:LðÇ8Œ·1¹Ð*—Ös«÷+Ûφ·¿Z¹÷KÐ ˆŸË hkrOÉM\1yÚâð3)£Wß~ ´ìGð«l²"twL?æÆíˆ0]:/M¦®€ÿñà(mG¬+1ÚqE@+“(°pˆBXc!ĸ\ô˜˜%ºQÛ)ŒnÂ÷@…ù•ûöðŽÞ<ª­=‚š6m‡bÚà­Zˆ2¼˜æA娶’‚Düx~(˜œVÕò½ ªSZ5?8kïÔ>þ„RKíÉyqt3,Ú¸^3š{Je‹´z¹þYuí¡VÙ—B­tóÀ(o‚‚+•u"=±yŠ’V¸¼‹ —i¤Z'VçT«í¢R6jNÿÍv‚´ÅÙ=9?ªŽO~vþâ—ã“p£Ò¿©7ÎÄü¦”ßX lj˜œ’z„MoÝ}wçí6î}Ö9x¥T÷|tæ†oÚ +æâÓ¿Ë´ÁjFÙœ’ŸDÙ<„œÝ:ô©KóÑ@BÊ77y½rmÎÿ×—g} f ´ö¹Ù9OµOQ¾&mÉEIûêlpÖMθ©/íE4ðW^D…¬loœƒ÷v!òòt{ˆm¶À°…5iÒ©—"ZQªœ3¡2«¤ÙE¹,-åp!ã~áòÀ¤Ò×´]մᘦ·Ò9²—ƒ7|˜3˜T¯0¾SÙ|”%íƽgߟúh=ÕÜŸþ¢wô¶¸ú°»÷²½ÿŠË­Ìh%7¦’Õ¥O½4ŸGµŸ™8ý[Lº}Šp€BxlØÝ8O£—«¬=]‰u0ØÉÒ©•Y½T›œ5¶Ö¶.rã•£½Ý'Rv W*“{ÕÉÆÆ]±¼áç +K($ˆjæWœæᬟ¾á!h³#6Dg"8ÆÌXªbbBL‘Qßkî}æNAJ7÷o½xû›¿ˆ™ž+.ÇX›ÏNŠã{{ßÜzóÇúîs]wB2ª¹¼ -¢\õP 1Ê: Da&ë›Þ¨‡™ôlò“Y­£‹/ž÷Ogoÿ¬wn.Ä5ÊhD…|€J/#rŒË'ø +gõY«Qty)o«Vöp­íF“AÓ­ŽGt†1Ü”Ñݾ×Z¿•ªoiµ="=Nè(Rq£¾óqD¨,EU¥4½£¸üÿwWÀ­ÙwÍ……)«Ð= +áÚ‡W?¸²ä…0:bi›JìsÝË{‰ "Õf=äåë>wTñ"ºÕ£b\Î;]°ïdzÇïäêq>b§`vÎäê!Ÿß0»g„Ñð£S»ÞÕê;“ðOLòÄäšlñ#š?®€/ýp!zy!Ī9£iÇõ¥ØœŸ\¼âÂlòÎ@ÊõÌÒ 6>§“åþþ³þñËÒÚm©0ÀÔ|TtBÌ´;™lwQ6í‹ò@mw”VŸv÷?N›?Cy)©ù1ˆær\ôbj˜+ðÎD.nVP¢¹v^Ÿ&ø4B%óÝÕ³·ûOuô컇Ÿÿ}yrŸ·º¿xùÅtªfÓa±H¤Vó¤¾þtxð:.T?\D®B ËriCÊWæ »—,˜m`1€nˆ117–Á…fú ¹ ØÈõ\w¿sò +Ó›~Ì,öÎk«O²Í£áÞÓÑtpËÈjºùâë?Kŵ^&@fè)nàÉ6äX}„MC:€‘XŽñ`Íú^º}ØÚ¾8yþÝäì ‘ê©¹•³GŸ£|Örn5Ý؃k·Nhk<`— !9A˜šy Rv礼q¼ ‘¬Å+UYqDž嘡µóøûµûßµ?-o=E“ÍK (B;ÇH–¯¸ùˆè#á*”ÀE:½»Nÿþ5Wâêœß¡Óû-ÈbLZŠ+á¨Ö–‹»àNá—x„ÔæýÓv.—ÐLf0:~uüêw~8#­¡R¨|¦'æÇbq]­*Í›ˆZEy§ØÞ'Ô|˜L2À zƒOuÀõQí†+viÎm1|y!<ë£ ë§»Æ•`ÂÄÀ2io”eŒº˜šÍm«½WX½«”7H£i‚A*öPÉLH€·6kTá×äìÐ(n…HÛH¤˜±éeB§µ*.W!"T†Vë„Z™ñ`ì€!P¹K¨Õª-‡xÀÿ«K±åƒKŽ;ÊMg°¡+5µ¸Îe‡Ra•´:Tº[_»KC=W +õ•ÓÊä6ü$¦Ö|tÚGlª—,ïZí³å€0#fGzå@+ƒÙ8æì‘+n^ZL,‡¸æàp´ykÚ&ÎGø“±©ÞiaõªúÕåD2Ûwꫳ ×ÁâeäÜP/O8«|á Mï®p‹1´ÕÄÕR²¼žî[³Úæ »{&Wýt軾z|,ÔºiBÔòDP˜… Þþçï÷e˜6«×p¡§³8뤲ݕ½‡ˆ’À«m_¾øÝáË?Ôö_ +•mø -U]ß¹³º÷L°{^Lñ ò{"ÎÆé”™ëÇiãåTU4k,¸G®ìFÌ~„Éå—BôõåØ´ÕvLŠOïÐcúø,Ęt²T[=ìÝ™œ¾X¿ûéæí7{>ï<·‡ç19_îìLoœj?.³VSÈŒI½/d×ã\ s„“ cFtºuZ1Æä¨Â’®0ǨUMÎ V-˜ðY¨†¡ÂdúJnPŸ>ú’·;0°S]žî8Óµ*;rf…Tëî˜læåîÁrˆ½<YŽHAÒæR}ÈJo‚ÓÐœ^sr¾fƒÓ+éæQ}óqk÷ÉæíÏSÍ#ÈýæÊÉÆé«åˆÂô(iÂ(¹ÃlW)¥ÙTìï1F"-é†%¹LßìžTö^®aUÖ·ýóÿüÿèÅõÅh’Ðjù ß?½ýê÷§/ÿÀ9kW–0„ÉpF r¤á}‰€ä²{MÉoŠé.˜óÅ tj9&.LEäù°êJn…±ê®½ ñà' $¼ˆ àE€Ð„Rg3C6ÝÓ+ë¹þ±ÞÜ2[{ÎøŽÚ8àò+l¦ÓX¹³yþ…”-Ådj†é¥Ô€Xƒ˜‚èCýù 3â–£b³Bh¥,#×n®h…ae¸÷q¦·Ÿíéí#2³—ÊF¶»sü|rüiŒwfƒ¤1©ÄZ]B«òÖt®5oTóÍ-”KOoª“)"Ù£ PÏÆr\\ŽpK!r”w>@O;áSiL+1é&ŸéT‡GßýøoüÿÞþ#&Õ0ÛFc·±qQžö&wWw.d»®ØM)ÓÒ=ÉYÁä†+ª][®,LŸÐAhy¢â¼¹º¿2ž÷bK~àúŒêŒÚk÷VŸ/Ä8?iFø\Ë°Ù^¦s’ížIÎÀª39+õ¸îE$ª7—ƒ€y®¾^lnÍ,ÅçÜ +>A.E(kÁÏ@­V´ü(€ª1:)X-£º)NçÔ5i³Ëh•öêYoã.8Êfp)‡°¶?.E‰$Xß(©›¥!ff—£1RGø,cµ„üX.­Áû ŒéTúwv2N÷~®wOË­Ú• £´†*ÕJÐkÅæ6XÜ+‹WT0e.½1>úrxò9gg¼gÔ´LËþú†÷ƒ¥ØlHò&Ò˜T×Ëq)æ,oB¾4€×Œ'ôšÕ9ècíÙ¾©×½iOWF}œ.‡°»›¶î|yöÑïï½ùÓîƒoI½B'+˜RŽÐÈ£¹um1:çF}ˆ²â0¥–x!",†…"*ÅXµ+õÉÍ›O¾ê\8ƒqìœÇ©öñtžmq>}ÚÐ@-#p„”‰ƒä%[àQËûõÉŸ]] Kq*Ej Úèb +TÚÔ"bÀk9®½„a„âé ó<€Ézq49y¾yþqqt<9z¼÷à­˜k“ZQ¯¬)…ñÚÉ‹æƃ˜ ‘ª”.o=ÉÖ×€†"¤ Ò!2cò¤R‰f8¡ÍyÐùi;>†kÖÌyL²fBI¯ï¤j›¬QÙºùI}õvLÊÒN¿°ö¨¶ýNJÉVŸ—ûÇÀì¸\¶jÛ©Ê6o¾/QnÆüÍ/"@xbôåyߌŸÞ·'Mð™ËQÁ“§w‡¢Âu¦S„RŸPè¨NbiÎKâ|NN5—ƒÔÅXU‚ˆÆ#Áfæ¼ø‚7áÁ/Ø® :rÃG€à“ENux£Dª%£4yðÉïvï¼Û† +%Î삦gÛ'¤\DhÓ— `xØd›ÑZÉÂ*—ƒ4—Ì™NÎÏ®y@æ|quÖƒÏûˆ…í–JõÆrl1H‚Q I H.\¯Å•""H£©ç Ne§¹wïÍøø£òð´½qoxüQ{ï©Õ: ôªÓÜ3-/"Ä(Ã@;–üx‚±­ªdûàǪ£[!8SLÈ„ZÎôw|qòò·Íû_ýêởÔÊ:"—0¥–+lª¯WöŠ«ÏûoÕÚ­•kãÛ¹á™R\l‰L»Ý2«d×¾øóùð‡sák> +5úüDmz¦;¢ª”ZÍv²&5»¶vtïõg¿ùûã'Ÿ§ûG6Ï?]={Íg[ÎT‹kíû¥þQ2?t^/¸Ãd‚ÍâJ%€iKì¢;ªú1+BÙ(_€ë~e.´àÁ¼Ž7›Š3!’Tª¹ÞúÑ£TeŒ©Y½¾Þ?ùxýî瀄ùµÇ\nÕ‹&óÕͳgßEÅô\ð!b”ÉÆè¬+(ÄpKÒëãÍ»›7?¾<ºtà ‘ +Ji“M÷áR‚¨•:{7_/G ˆ©•„\ÀåB[j¶‹+…?N Sꎲî@ÔEE,„iŽ_N,¢y@B‚;,†© “JiÆ€ˆÉ"‡§Ï(³(myB䢟u¡„¡”üϯ¹?¸ºô7W–®Ìúæ|xKJF ©ÚßK•VÜAR4*~"IuÎiÕm³}\Û|V]½½¾qúÏÿåÿÜ»÷˜hÈnïõm T¹¸HVý¸FK¹õƒa6s}10ç +z„kº» FBI·8£ ºçÚh)åIeõfkón©·ûô“o¼ùµRâz=ݺ™jUV.VϾìíÜÙ~*çWíÒäðîk6]ò’R˜ËF§ýÄ’3áì•™^ŽË(08mÏÇ“ ñä9d€³Œê¾VÞáôúÑ­×íõs>ÓÒ*Óv.åµÇýÃ7{÷¿9û§òÚ½ÚøääñgZuGɤLŸÔªÈt+ö*¡ÔÁA®-„H?ž Ó¶Z•³ø1&ë‚1ÇLF­/è+˘Ì([Q€²Ù÷&|Dš\-ÀX…¹<Ÿ_ö6”;{¥î*g£¨çú¾é(ºKyâZ0a\®Ö=l­Üº2 &¤(•ôLýIž°º¸ÙFÄbwýÎ`óÔI€,-ßUœoM÷𒜦V0>WnmVº{Ë!b)@Z‚µA(ƒ uÉGº‚¤á´3å‘/ÊÒR¶½y¾wñn÷á×Zý ‘lG¸ÂÆÑó¿ÿ·ÿ-_Ys…ypw¤\æÍ>Ÿ3ÖÀ?ÝÔƒ­f{û‘Q¹C„Ó’—ð†Ù(¦Å ]5+˜ã&­Tç¼Ä_At-Ä]1N˜˜#R˜O•VŸ½û;Î#’C5.7Ò;vïÄéì¬ïÞùì7ÿØ\»8\[½ÛØzl6vÕÒi 3L–6I£!;Îê…µÊð˜·KVm˜ãÃS!:áìeT[ŒJ„ZçíQ˜ËÅ¥Ò|L¹´Œ.#juÄÜ*‘l°ÉêÎÉËöÚ¹ätõúvqõ~sçÙäôíñ£¯»‡OÆÖh÷Áoþò_ÅÂjÍPV›MuÀX*…­÷»r¯Ý€Á«ŽoO÷LyßØÿ¾#¨'žÄ¥­wæ‚ìBˆ}„›>}žn“=ƒ]](f{¼^î¯ÝÎòk•Öä¼»u—M5}Ds‚ÕØtE Ù žc©PLF¨€Þ¬‡„j/¦ê‹az6ÈñÎjc÷EvxK.¬†ù\ˆ¶!#ŒÒ .drŒ Ôg½´9íâÎMÉå Œx£œ'ÂÂO¸¾`:ˆ÷+×6-Z 1Ý0*«ƒ“Wë·ÞmÞúÅîÝÏ÷îÖ[=À¹T”´©#`bºgSB,Ç F y=¿’‡rºî Mè Êö†X„4¡|¢ì‚#äšQÚêIðÖ /yuõÇOTMˆ)»Âš-#7ˆ³ "¤Áç[­íþÁÓûïvîÑ9y•²Pr{ûÏéLÕª˜VCä2¡Õi ä ÝÛ<÷‘Úϯ¹Ò¤’•âàfcã&åD»ÊÐb„Ë.‡EWHôFeo˜ãÉbcGµ{\õÌ.#ADöG¹@T $LWL#ÕÚÖùPÿÿáŠÖKƒO²+Zi3Ìä>œyQ)ÌaÖÀÔŸë‚už½­í¼`òëL¦g4v ++Ó–Èà÷ÞÏÚO·N ñ#bv>:íßë‹É!T]2—§ÛWE‚T„±Â\ÚCêË Yp:b±‡hÙTk»wü*7:/ nÖÖî•Çgb¦ þ9:]ÀÒdŒ&*ÀNLo¤›ÕÖèðîó¯”Üðò\å³ð —ê€ú©L˜Í#RÞnláÉò5w2Ý‹›QÎä‡è…Ú_j®îž>ložFhÃÜŸýb÷â»í;Ÿ÷÷·w.ôÚzº8úöÿñÉ·ÿè!S1Ω¬Þ_9yW\”ºŸ4€FÓ¥!gÖ—¢Ò}ÕM/F4?á$”Fº¾}ïÕwßý.Î¥–â’—2#bµ{•ñYmõ¢8yO6âœmw÷¡VǤüt¹½T +RVˆN76ŸL·ó‹ +Q.›Pj(Ÿ(,H0@z‚Oe›ëa:íC“œÝÍÎ6Î_žO\š¥Ç}õ§ý¯ñÑRT¡’mZo3f/Æå½  '«×0Ñ™ ’ž„ÂZm+*ÕÍOÛò|™ël\üæÇZ;~ºröÉÚƒ¯kWw?Z¹õÅÖí·;·ß†7K½ýú÷ÿûõ·§-9ÕÓÃfRèøXM÷ n\YÄøTÛ«×–bWçC\ñ\›H†¹’[ãí~®½/ÚÒlr¹&3âr©¼íÅT6Ý°[Û‚ÓÍN›ûÏGgo†çï:'o3+÷ÅÒº]Ù<øõ޽ϳNšíÜtVÉ)—ßcÒÓíÝÌuêž>)àæü¤+&©TTœvž±Û»©öVi¸·}ïÓíûïn>ÿfõôU~|NÚý˜X Þ߃Ҧ7>oÆX½ÚäA{ûYºy@ 7"G@wHc)Êz€7µ:“+¥ƒtó„Ïôã’+.&¤@ÍrŒ”rÃLk§Ø߇¯J~@ÈÙâð¸¾~·ºzžjìf{GÙî¡˜í§‹ƒãûŸLNEØà[®4me“_¡RýéN£A*N$oÞ[hïºb +HX˜ÎG¹ +¼ °æÖƒWßu7nZU­ïZ½›­çw>þóoÿetöªÔšý½›ŸÒÉÄX®s³¹óIïð³âÊsµ¸(JêwQêŸ^óó °!ʦÂÚ>*N.¡Ðõ7ïÀo&¤"•ê0vßiïƒp”'÷­ê:Â\cSLwfÜ 71¥rµ!8«Za#€ËN°;Å•©¦JWˤY°¦’é{ûBªÞÙ}|øü×åõû™Î>›nŹ !çgŽõî‡]9|žÊJnƒÒšþ„ˆsÓ.ìúbbÎË%‹KögW\×—ÑE?íHa2Cê(ä•Vì¼`iýþæÃïŽ^þØ:x• +•ñùæ­ww>þýh÷á½O¾ž¼H÷vÛ‡ÏK;όޙ^ÝÝ¿%—÷i{œ*!ÊZŽó ¹˜H6ü@XraЪÀg±H¥âYR+µÍæÖ“þáGàâ þ9«ÖÞ¼6¡dSíýÑÉëÓ?l_|“êÊÅ"Y´æ¬>3õ˜hÑéa´`((­L¹bkË( ä@“~tº9KˆÊ„(Ûªnû‡ #Wæ# !€Ãgºb¦]N^Ú½ãŸÝ?|øæ럴l3!dëOªkOò½s­¸ãBäù …PÖų¯£Ó™é&³&*W¥üšÝ¹YY\ߣäü“WßÜ}þ @ø™é¿¹ýúG/2:§!:ƒ²Ö÷ü—Óç.T»îÂ=¨.¶ÍÆ ™lßðàa<ÙšÜÊÏæLˆ0clMwÚn²²Å•‹O~õâ‹ÿ`W#tŠ›ÞŠßÌ÷N6Ï?¹÷æÇöÎ3ÊèjM´G^T¹ºý›kî+spƒðV¸Jþp6J(™Ê¦;,Í{ÐÍ(›Ÿn9Šš”RC˜4¥•Äü¨8¾U™\fO¶[Íõû­GýƒÇgß½üæOõõs­¶~óÙo.>ÿËæƒ_‚^|òÝ¿o~*åÆ¥æÞþ½/ôÊê"ù ‹7ÛŒšÎõDù8eØù~œ¿^ñ¡"ÔÎî8£³âúýÑÉǽ£gJi°~ú¼µ÷83:³Gçjm—ɧ³š #P.µ¾lD¯DÔ:Œ5¸1zʉ«u:;4šû‰dÊt©ì3ºLªGè-B«0Û*)0ÙAä´Ó;Y9ÿ||ëóÖÞG•µûÙ>Ô·®UmÝÿTolYÍÑ­Ï2ã»BiMpú@¬ÇOc¬îŽ ™ö±RX£“u57ŠÒ"ã’£çGà”>œÞpa<É•BÿTέ‰”'"š…QŒ1ÜQÒr@òo~ûðõ«'/掜íP¡uЩét>Òåq¥Xê—ºéêúr„½²YŽðQ: ¶-!d`вƒó©JgSÉTg<1%ÓÝ|µõð«ÞÁÓTëÓZÓ›Záíwï>p% Àò¤VÓYwØS bj‚KWúûò”­üÞ¸†Kਇ‚³"ä&¤Ñ¶ +ý—ŸÿðäÍŒVMˆ¥ÞÞ'µ§Nï(U]:ˆq…å0À¤æê=ÈšŽ§˜}J«á‚¥íËó1o˜é­ÿòÇÿ¼àÁ¯ÎG—CBœÏIΪUÙM—&´”lŸóV58mÏ5`r(›,Žê›÷›[÷kk·ìö¶šïWÇ7×ï¾];ÞÜ<‡âi5¶ùÜ +¦Uü »qGÊt§SYô©Ÿ'E y)H…q¾g´’+­`r.Yž _ôû»Ÿuv/6öïüçÿï?ý^š6¿Ú)L.Ò›ùÑÉù»³—¿ßü¤>¹õìË¿Jë>&“lì&Ê/¶ývûñ÷½›¯›+·þö_ÿ÷oþö߃lÖ…KHÒ…é¹"6Ó­£ÚðäÑ«¯¶î¾nì>î½hì>´ûýG£Ãç'O¿yð‹A «ãÓûo|öõßí?úºµûÌlìÐÖtn'g¯øk9ÆGÙl˜u *r©¾’SFƒN÷ý„Íš0­/E ðf\æýÅJ÷P¡ ’_ý‡R®k×FµÁ®ÓÙWJÛ„ÑÃÕ&)Wb”1û~i‰iÀŸxuºq@DÄ¥Rœ¶á‡¸”U"Ô"Ä·ìŒÀ•Í…(?¦ B:Dðq>)Ú5£¼ÒÙ¾¿”~B†ƒœ®éx?㎠ J€W­¨ÅÕcûQÀ4ɇêÞ˜ìŽp!L ЩÒøl|òQsë¨ï¢jÕ“ÔTË*® ¼Ãõ„P$庚’JÉk‰éÒz)È…1ãÚru&re6´`ÚJ0&­•Àó_ºðEù¥ ýá\èê22b—£‚'̲z)!Ø 1“jí¥ÛÇœjçÀŽš›÷ ++w’• !Õ°ŠC§»Ã˜¥™²ÓäÓÍLç87¼ ¬çÃ4ˆa)ÝRíY/±è§à€‚11ï‹Kc³î81ÈABÌòvËlîVVnöo_ÜõåÊáE}íöÞ£o×nyòìû»¿(µ\Ç(Žªý½³'Ÿ©å‰ÕØí¼X? ëÕ‰˜ïäꓧo~s÷“_…¹l²²#Ö­æÑöů6/~Uè7Îþá_ÿ׋w¿NV'ùÁØíîÁÃûŸþîWùo?ý§ÿë«?ÿû­'_ýø§ÿøæ×1Ûûfk_­î:ýÛã·'/~šÜþ–4»¼^íÂà׶|¸áÅ’¨œIE¹º×Úýبï$$§=9æ͆쌓µ ¡03ÉÙƒÆúÅá“_3©Šê4µÂ€¶ûõõÇí½O’õ“¸Xç/7ygÅŸP$«‚ðhkO¿ßœ%µI­Vœ±f3@™¸Þè~RÝx W…܈µ[azÚ…&ÊA\Ĥ4c”ÙT“K7å\1ë د³W…Þ>F.Ý‹P–7*D@MR½aÀ¥—²Ý “P:‘¬ÈåÍÜà—Sɧ9­ˆIy%Ûó!꼟%䢚2f(ldˆ´®-¢¥ Þ‰³6ÀEŒN/‡X(ÂÓ™q…sðÏÅ 3ã%æB¼HÅ…ÜtÇ­”,Š£“ŸËۙƄ1ËfeE+o%%‹kÙæžÝÚ¡“YÁtä\“³JaU«í‚Ï¡µFª¸™®l,ûÇ¥8m† Í—f\ñ« a€ˆ8•fõ&ÂÚ "´ÕhLnïù>ü¬¼zÌXE£Ô>³›ëùöz¦±FULÌÊ™¾šÅ1®œÎny|"dZ¤ÑŒ‹ tŽ”mùN¾½iTÆ>\Ë÷úV²¼Þß}ÜœœeKÁhóÕ»ïFwT§5ܽwçõ¯ùûßþéé×?=úâ·GÏ>[=¼óüí×gϾî<:ÿèûÞñ›ÁÉ»õówÃýgùÁÍ„œO}ó÷ãç×½Ä|ˆ!õªàŒíÁ½ÚæSJ¯zñí×?©™Ž7C¼£7vòã;ë·¿Ü}üC÷äS°1ç^úÝŸëëwPµÂçƘÙÅ­akóÙÁÓßU6ÅùÌÃWßÔVN—â +`µ Ñ£|×ZõÉ#°èJ¶ß_»½rò1jiåŒÍt£BžIµ…Ü ¸zN¦Z~LR²Mð“¬YƒkåR˜ZV +£îþ‹GßþKkû!¤y²´æО6Žð#*X”œÃøŒ1œ^NW'p:åµ'JeO6c,0uŠ³”] `& ƒQ^M56ÙT"ăÊs`¡*Ù@„ürDâsxÃCÎú¨Å·඄^YD¦ë8|ÔU7`2rq’¬ï¨Õu¹°":#f©V W²®R´YK7÷³ýs»wÆe{‚UÉT‡J¡$½¸Zš\äGwË«h£‚³ˆrËÒ°ÛV®ë‹q3®èåè‚Ÿ&å.–¥R_9K(9άê¥QaåT.OX» cRZ¹Gh9oœ†j@›ÝLçf¦wkÚóŠË‚ˆh…1i6 ÌFè ¥UÔüЂBaw 뽈´¤HÉ &$Oœ‹siŒ³T=›+´ +õÞ(héJc¸ÝÙ:®¯ng[9ßQ«c»»SYÙ] 6oÝ~ýÃðæ+IÕnQ²§µÆåŠÝ½[¯ +ƒ`Õd~’©î¥51;Šñ™p‚–“æáíÇ(Ÿ¥Ì¾^;(¯Ü[¿óù΃/VN?1k[b2ÿñÛoÿý¿ÿ¿;÷ÞâfËîŸ;“'í³¯|ö—½û¿¨ŽŒ|ý‹ïÿ¼wï'‘œ pRq;3¼ÛÜ~~óÅO™ö¾]}üù÷?ýq Qݸá‡ÄLõÖÎÞ¿þéôÓ?ë̓ÚàðÍ÷ÿRž°d€Ô+«Ûß>øÅßõö_i¥­»/~k\YB®/!Ka1Î)­‘oŒ^ +FíáóÏÿÿ £×qk W÷¥ÒŽV;Ü~ø›ãW[_ÄéÌ“7¿}üîwVuc>ã'!³˜ŽòE65ºáåæ}ôÉ­W_|Ä´®{?¸æù«Ë¾KóH€Ïs¥ÒàýZkç¬Õ!m6scÂt3#Z«d%¸T2׎PÉm`JQ)­ÙÝ“ÖÆýµó×Zm3ΚùÖ®^Ý 0ÓeVnD] ó>D¡å¬d”" ÞÆhA÷Ew”ËD­§Küªˆ\öa²’iÛ­íêö틯VnÚØeµO]q>J(J¶+Ë9@úK)”ЙdÝiÉzŒÍÚ•58¤ ¡¨ÔRL RVÐDd³ ÊÆÔl{R^2´Taz‚±ÒÅA¶>!ÛÁq)Ce)×éì>غóz|ôL/ŽìêŠQ™ S[˜—R5FΣ´A )R´=1aÖGß?ˆ’:ÊšqÚ‚" $Ë´˜%;Hâr‰MÖP. +6©æáv+StƇµá!¡OŸfvvž”Wo¥ê«Bº*˜…dº`ØDª,YV«V“T‹— +ãJyµhUÖ¹ìØ“0R}»s¤Vz;WN_WÎ0Á.ׇ‡w^9-LÈgš;©Æ–VóvJÊÙQÒä§}½rs>ÊŸÐQ©¢—¶Sõ93¤Õ‚bäªõÎú)ü‚Õ?5»§åÍg•õG™ÖT~B)b”²uôhóì%ø.°‚*˜jizV4›îã5M5?~÷»7_ÿèÇ´+K‰ù°â&„ѵ»gvë0™®þúÿôñ—¿w˜«ó1wTóŸÜo +ⲬœµËC”MAÑÀ•¼QYï×Ú¸SaJ^Ôrk{÷Ëý=?žŒP)>Ý%µ*¥"˜à á˾X$N²Ž#a”¤µb~õž<íà½F-J²Çë§û·?±ê‚Ó5ëÛFý0.Õ …ä-!Yĸ`\L°‚ϳjU/¬—°bQ1›²^mööÇûOƒL*ÆÛqÞaIO„Ÿ³dçšî <ï%ýLœIÀZ‰TsÀ†œUŽ2šQ•F§Vã@-¬7×XÕ­cµFÇåÞ^U#”åò><‡ð ÁÀ!yC¨fôlw9NRóM)L6&•Âdœ°2u&M\©$‹3?"¤ª¦’ÓÙSày’7¬‘à,B´Á3qc>ðpXÃåOxB´7ÂÁÑÂtŸGÆj£RɇNk3Õ\ +!eD»Á$K’U32u!™óG^+8µqãB(°À¶œnòFNÆÁ“Àñ†ˆéT.p#ð“¦Hj†‘²1ÒˆÀU·ÄL— ¸2]IˆyV+©éÎÞ05·K€WgÓ×¢3Kˆ'€´À‰F&×-·v §ŽÝGG™"–l¢r)ÎepQ'¥ÒYÑæÕetº.¬´ÕÜz<8yÓ=xDU”6 >§”Râ4¶$.ÙœU5JC£8¤Ô¼b«HðVUH1ç ‡p–+H ¤Kð(ΊJ#)VÒÑ2ª#ʪE9;BéšYÚ;zpöð­lW!Uíúnmå¡U;LðÙ&£4œTSÆŒâJŒÐ0Þ&”2Ÿ0j !tݬœ={öÙ"œåÇåkEp=¦——á SË~üž7‡0-LY~,éEä ®1j —3 Î(vwsÝýT}Ǩljù5FoÄhËpzz~q…p«²‘ižbÚB+€h‹ž¸?‚IZ†Ór—fW"®ˆ€‰Rm!|1L¤ÅRÕ :Y£csPuCd*Ê9`Œ¡0F)cÁ…„b\ØÙÍzP0$q>‡±i”I.y‘dª™-­!”ôib¼‡Jˆà?ÍRÏ&¡Šr:°[–‘ŒÑÃŒàxßjÇŒDbh‚Ñ1ÁÁ¥\„2܌ Ò•Ùࢋ†?*DázÑF<¡ø#\ W;·d«BxRÊ%8'ÁeÑ\pÇç–Bn?ŽÓæ¼;>ïI„z‚N›¹–‘mÈz¥ÒƒsÍ{e>r}1¶0]KºBŸÌ¢Œ¶èO\š 2Éš”é%ÁÀTW¥Lצýqv΋^šq£xœI†™‘ÓÕîF¶¾ªf[cz9ˆøbàö'&[·Žï¾Æ¸´;H"L‘D5'Ô®ø"ÌÜr¡4ZÎÀP@}Fp §$ŠU1V‹$p/€$pŠU ZØd…RËÓçÔ!:Ñå.]u»}¤ÛOÌ/DnÌfç#.?$¯F YY/oqJÍ›w_’RÖ ‚QªJU"¨L²é8¦-yfn˜*®Åpãì */x°Ÿ_õ-Ø(®Ãñ\¾áÆYƒUó¾ë ÓK~bf)Á‰'0:Ž Œ”Sýë®Ø‡3Þ¿¹îº2„ìPRJ4Ì”súàEÒi.G?*ÇY‹PJ”ÞJH¥e0zöüöË/þø?y íg—æ¯ÍûÃ/¨9Õ*š¹ª¨¦Îî¿Ø<}À¥9âñžç‰r8o1Š%&Óé\=ßÚáõ:!fü4UÙB –áY/F 1ŒR‘8M°º•ïœ8éy7s…-zPÚÇÃ(-êU)5a¦Ugà ZetÝfàCHlµœ[ÝÙIäJ‹!tÖó""J'()‘L§ì‚mç­ÍÍÕ/¾Rí/-..ú.λqJ`9NÓTAƒáˆªJ¶b8ÂåYôùݵ,¹X2¯mžî÷.¯æš9ÕùD"DJ ÓÝ~qèt^J(IUHHŠ‘ÆYCÐ*P½€= Ž0¼E¶Ü(ö†œž±Š]”ÓÃŽóî 15çÿ”Ó•¢LöÒb†ÎéEŪ´†ý-^VAAæÝHWEz§‚Ëé(g䛫BªÌ%Ë„œ]òãþ(ƒrŒXA#¸dR#¤"Á›,'s4™Ië =É +¢¬È#ˆE!ív~u< 9PE2ˆpAEOø#‚7Ä…bJè¡(ëõyý>—Ïç‘$©QLÙ½µúíÓáõ+k¯¾öèòþØHê1J xN&g#ôÔì¹Kn§— q:ÃÑ0Iâ´¦$TEE9Á| ÄO0Q4‹ÃYŠ^ñFè©Y÷SçfŸyÖqi.0=Yã(<ï ž¹zê‚ÿüLpÑ»|¤Ëõ‘T¶A™BIŠó¦„Ì¢9wɱàBb1>Œû<.hr¬šVºöÚz³Ò´3…D«‘>»Ü»swçr¿V3«å´‘¶E 2;ÿÌÔüü¢'ŒJ,§ó$yÓ*:î*uKÖ9Qå”AóLÊ”*•Äú²õäÁñË/^{xo÷ÑóÅZáÒ‚çÒb ¥@žAT*Á£ëU“ã•|§–°u´SV÷V‹OÁñÝ÷ïÿú¯¾öÓ¿ùôk¼¼µYMY,#r(Ÿ™lž‹¥h6™±Sº¹ÜÍwÛ…¤ÊÛi“â§/èóI¬ÕËí•öÆÎöã7¿Zè¼hlÉL/<€^1œÙ Å óÁsç¦â(b¥R•J9—O‡£`x2Œ4/×kå«7o5ûÅ4ÇûÛf!@ w§U“Òj¦ƒ²*‚DŠÃ¶ìb±šJj¹”˜Ó°ýqíäpm¹•¯çÔËÃâ ÷÷_{áäý7ï¼ñÒÕû·‡Ã–•6£a$D=~% Ðdœ1ã¬dóªÞªè£®u:Î>ºÒxçáö7ß¾úÑ›W÷óïýò'ööKgGûëÍfU¤p„Aî¨8k‘l* +¥Gòº\Ëêƒï×ÍAa¥SÜÙX¾wëèúÙøÁݽ7_¾ñê‹Ï_;¹Ö¬7Í´Éót0˜žóz‚ôœ}v&0ïÄÎO9ÎO-ÍÎ{}>$à 4‘1ÔV£¤«‚Äåb¶T*˜)Û2ó‘ýÌ…%hX·/ úy,¨®j +¹2J½xµ{ÿ¤÷èæ胷oçk¾öÆÑ/­ýöû/ÿÓ/¿ùo>~õËoÜÚÛÚ¶¬Ãåõ8ñË~ëçB5ìú¦yë¨~u¿ÇÓåG×ûo<¿ñæ£õžlÿö‡_þ?õÑw¿~ëùãr6‰¹<îW£dœ‘(ÂÆ-=î ×ÖÔ'W«¾rù½Ößy¸òá«[?ûÞKÿô«~ö݇¿üîsÿôÓwÿçûÕ_~òäÍG»×ºÙ¬q¡ ‚•1•Z^Üèǫ镾Z£[yz½g¹­•ì­ÃÎW_;ýͯþÍÏñý?xõå‡Gû« Ñ‹.§;÷£âÔ¼÷©ó—üÎ%‹X"’Qb:ëÖ9_§¤ŒÚ´ÆѪõöËWÞzõæ“G'ßzïþ?ÿÆë¯=,W­áúêòÖÙðè —ª‡|n…‰¥´‘"®¬/]ë=:iž¬¨¯ÞêþÍçoþôówÞq÷/ÿî‡ïüË?|öûß|çÇß¾óûŸ¿óãOž;ÝÌ©L8è 8œ¡X%¯ÁúG%úÁAñÏ¿~ó§ñƧ_¿û•Ç£¿´ýWß¾ó»¿ó×?÷ão^ÿý/ßýǾðõÇG§õýõjÆÒ²Ù¬¬e•d‘aØ”m¥ã›5áÞná­ç6^¹Özr½ñ½ïþêGïÿþÿò7?ûè—Ÿ?ùï¿ûðÿûþñw?ÿΓÝOß=ùÙ篿÷äJÚP®èÅù+HŒ ø¢w<äqŸŒ-KÌÍíâÝêÑȼ¶™yùÖð³^ùૼýÜ›¯<´Ì´?ÆFQ‘ÅñB‚éçȽ÷ü¶ñÁƒ•?ÿʭϾró'¿ôïÿúýÿ÷÷?ùÍß|FàwÿöÕßÿúÛßùÊý½µJÚVÔŒ M2…Ô b½„]ð÷6×OKß}ûà'Ÿ¾ôù‡w>y÷Ê>ºó~ôöÿwßþÏ¿þð×ßéï>øËï=zýþV)-³ âô†ÃÀŠVÔÕµ<ûÚ¡ùÞíò×î7?{kçoÿìÞûÍ×þñ§ïþà[·~ý½çþù'oüãŸüøgýÍ“Ÿróû_;½sX­m/ôQ˜D£ØxÐØ^În¶´;Ûéo=Yÿ«o^ÿô­ÝßÚÿí¿ü‹Ï_ýó÷¯ÿÛ¯žüßÿñÿú¿~úÏ¿üÚo?á¿þækñáíÝAEÜ—ææ]þh4Jª,;(É-#ÜÔ|7‡üãÃì£ÃÌk·š¾¶óù×Ï>ygï'Ÿ>ú/ÿÙßýàíßýèÝùí'?þ³—·[ƒÑª]q5mÚ%Kéd˜½Oÿðáàgß¹û·ß{ô_=ùî{W~üñÃÿüëoüü³ÇŸ¿òÓïý§_|õן>÷éËÝŸ¯](…ÏÐÜܼ÷Ü3s!—Ë`üý r¶,ÝݶŸÜh½ÿxë'öò?ÿâýÿ×oýý¿ô÷?zó§ß¹÷Óo]ûË/o¿¿qc=ÙÎP)ÃbQFÐ1&™4«voÜ/õ Ü(ßò_{´ò½¯œýð£Û?øÖõŸïÁßÿõ[ÿð“wñÙ£_|tößðŸþæõß|ÿá§_Z{ïVáå³f%§Â4 1.¤)Q+¦ªÕ¶‰ÓQòÁ^êɱýÎíú§ïìÿæ/Ÿüâ³çöÉýÿñ¾÷?þã_~÷Ýãï~õÎKÏ8B˜$d/Ló‘–…oTèkCíÕ³Ö'o~þþÍ}ãοüòÿë¿þìôÖ_}xãë/í]^¯¦ QLµ‚¢ [ãÙ¬[-ËW×ÊÏÖ_>)}ÿËG÷¯üîÇßøæë‡ß|ií/ÞÝÿëî|üΕGW;ÇãF½Z—"« "A›8Š™/¥Ó‰èÚÔñÐ>]ÍÜÞÌ|å~ïÜøùgO>ÿúíï¾{òáËûoÞ\yã¬ýÜ^yk9Y+zÐÞ0EKÍl3”K%2 :¯kUåÑqó“7vøÁÙ¯¾÷ðo¿ÿêï~ðÖ?ÿüÿùäÁϾ}ã÷?}ó_~öî¯þôì³W›ONKÊ„!—?¦õL~ J¦Êàµ$ÙÐb«VøÞºòÆúÛw:ß~íòùwßøý¯?øí_û§Ÿ¿÷/¿ýÎOþìñwÞ>zÿåõA^Ñ’8—ŠQÉR¥'ñ|J¦¶»™^e‘ã÷h¯øæíá“kËj_0úŧ~òñãOß<úÖ‹ã·o¯¯åW+ªÎ¡4% DHfz.ˆ¡tÒß6É®}´V=om×_:k½ugôÎs[oÝß:é§N—“WúÖjzˆŽ£(˜Ÿ‘3”˜EIN—rùBJÍkÜf3sºZ¹:L¿}{ù“/íüò“[ÿü7oÿø£{údóÛ/ŽÞ8ʼ¸•zrPÙ¬Ê*Àcq8rz€Ð–ËE42TÑð­º|²Ì?Þ·_?«|óŵßýðÿùû?ÿç_¼÷ëÏ_ÿÓ7n\7z•,@¯UC(Ðp@¡ñŒÆWL®——7›©³qùÆvå…+í^9øÎÛ×Þy¸yÿ°Õy¢c.¯{ÁðDùT~¥ÔÞ7rž×’¬eŒ+Û«7O¶º9êêÈxåZÿ›o=ÿdõÖNž»¿’iuSã551)_<éÇÍŸ§Ô©­|GÓL)4™7Ô¼!•MaܶÏ6ê·.÷®ï´GåA5×/å:9ËÔ‚„@»ÂôRǸ‚+^o(àõÆÃa•fº¥âΠvu=÷üå܇/n|þþÕ?}íò¾qÿÜû‹w®|öÆÞŸ¾´ýþÝ囦ÎGp€âT_LA™4B¥œ‰RÅt¶™³-6Ø6c‡=ýúªuo+óÙ[Gÿùo¿ýýÍŸ~úø{_½óú½ñ­ƒæZ/“ÐU^+¨ö2Ê¥QΡÇër3­py®XB^eÊI±_²z9}˜ã¯­ž;ž®U[)¶¤Ë¦, 4‡¢Œ3Àꨩ¹Øôd¦ ÇñpˆEc–®2v9“©ÚfFe-‘Ϊ|Ù”4*ªbÑ”(U«}H葸6ˆ‹éòz¦Ë‡‡ÂÏÊ…luu´¿Ú[«¥”jòÎN}§&__/¯¶kÚN]_+'WËfY¼ó³NG0S ©Ä’S³?9·0;ï‰øC +MÛŠP3åœëçøqU¾¹n¿}oíËÏo½x28ÔM†¦PJI–ÕòVqtã2Ïx0‚cù„$'8N’åD­Z)fœ%çLQWEáE5g¥%ÍùãÓNÄWéD1&XsÒ‹H´`É“ïòÊÙB=S(–/hjŠ¥†æýÁ˜?Dú#´'LÏ{ñY7¢3ÉÊ®Q¿ŒIy^/ᬎbœ¬f¢1ÚDNg³ßßiµÖŒ¤Ñ zPMV¼aüܬc!Hèl\m3zKL60ZŸžuÎλã8<ÌJ$2ZÂȤôZ!µÚÍmÕ/÷Ó§•«[Ëãv±WHvòVÉJù‘sÓKŽàäÞö‹îØS3Þi`ˆ·ŠÝ\±ÏÒtBÀJ—“±¬ÛëŸÜ=}åÁÍ«{ãõVÃT%ŠÄ£(Ž‰é iÈÔbDàì•ÂàV¡w#SXg¹äh´sõæ‹1”s,…RÑõ|6[/–Ú¶Uâ5à#ÂQyn™š ͺHf¹ÝQC„IËy¯' "6çŒ-xP s_TcИÎZ&8]P2 ë s¤`GÉdœÍ²©®œ9£ò¦\N?àIŒ6”TƒÓ;(•Š¡,TZ½Ò {IÕNÛ UNaÇd”P]èùiˆHŹü‚‡ü×_œýÂÓó3‹Ñh\VU3¡eb1*†`<-è’J# ‹Êt\fè„”LÈ9§sc¼Õ·—¯)¹‘”UFgr® „3«“nµíŸŠ¢ ¤ýÍY?r~!8àðdWÈo™5"Q‰Z)5VO)³=UCü䦌—sÇ´žŒ“šÃ;?ëNDh›J4âb9€§ü„áE5ê nχøù´–"LF0[J¦+¦jÉ\‡”2ðV«†(3Âf­AëMÖhHÙ¾hwh5KëÕ “õ`ºOzâF˜É„¨´3*…ˆÊ›œ^¦”gÔõÂ0‘íÉ©jçIV’4›UóÓN¿Ã15úRù ÄæÔ³ á§ç a1Ì•Y³ïBÄ91ç¬É±iב& +Z¶Ò1šŸÜžŒ‹¥ ™– Už™›,$tF¯[õLmºÐ”‘ý¸¦æGZamÖE¸BBŒKÓZ•µº~2íD>Ì µŒÌRH˜õ01¡b·ŽÅ̈IõBlnÆ/¸|,'Úœ’È©u¹¼¥5÷²ËWäÒ8ÀfQ)Ƙ•þ !á­åìH/ïšõCµ²7I<ãÀÏ-¡îØ䦡?zfáâRŒN-k­+©Ö‘˜]sEÔóÓAoX\ò _œòO-¡a.Ï¥Wµò¡h¯¹Pc1¢^p‹>ç¬P\}vÎÒÅÙ ÃGEHCÔk¬”[ 8Ü$.EñÉ÷YΈ´–¢Š—²Ý¸ù…§—¤òvT)áJnýò½ÊêiPÌ¢Z5"(£Æš-93¨®]wಠ•âJQÈBbž`r”µRì_ßîkfgÿY/éÄ,&»¥ÔN¨ô"U¼˜¶4¹-=EþáÛ±e…ØmŽ„ܘJõØ iÅKxpÃO¦P¹ÆgVåuÆ섹Œ’[±[û”VåŒV‘hø0D±†‰Êåd}?Y»¼”hc™±VÉdÞËM¦Pã‚—÷¶ZÚ‰‰å‹n,À¤ãz“²‡dz5®·hb²jv5È—@ᆥŠPØÂŒe6·O \„M[C­²;„²TTš^_È®FÁGHÛOX|fäŠês^v²r/šÙÔj{q­»à§ç¼ÔbH†¾Ý{jÊñŠp7™cÌ!»Žk­Eë TÚ¤æ%-•öÓ6´“ÀDg:§vû!,f1½.ׂMè5ÒZf¡Í®^VNøLoUH«/`óˆRq2ŸÔ5&ÙRŠëN< ÃKÛC±¸•_½ß¿òve뗱󣕻.:½8Ad¢bƒÍŒî5£N÷D³¦×Æq£I[=(QÒèÐé¾VßSËc$Q’ ++ã[o®>™,Õ:b [© +ý^î®=ž ±d²i÷®fVî6žO¯Ü ²k±¢–ÆÝýÓc'¢kåíÁá‹Íçªãû£Ó7¸Â8$bصU¡` дÎîËW²k/$Z§®bÓ Û„Õ™ò±Ka•ê¼½ÅçvÔêÑ:Ðm¶õC±¼Gç6ók÷j;/LVõÉmVn1i( “LÖ©ôŠ_“JÛ¤½áÀ&7»)™•îö½˜˜w"*Ô•¦:×èÌžYªmg,™i©¹ÕÙ°`‹Üóe¡¸§ÔO({ì!sFi}÷Ú+n̘rS—"Ú:é_}Ð;Çw¾ôþÇ?²›»|ü"jÖJfü|íðµÂæC¾°é@õTã2¨Ó|PšràA>ïerP?VçšRÚ[ +*$ãAåiO´kÊÇÏFXjÀ—öÍå[_œ]\Šúq݃§{õ+ß+ŒŽ]ŒO.[½¥õµ­Gvï(ÄY3èäRT*ùX3’(»›°–ë[/,½‘]¹AZ}ÊèG·1£Ktv=3¼-Wö¨ô(Q½,—6λÅ(‘(ôêHȽl1,·Øôä÷ökÇ/­Ÿ¼|Ú6,Z·2zÐ9xC¬Åô®Tî¾òq¦µïŽ„Þîî½pçõïÜùÒ'Ëg¯³ù ?“¬åWÞýLÊ/ù?Sär;ÉÎÍòæãá•·²ƒ[¨\l®_K7¶¦ƒ´‹4Qc 6¯u¾TßoŒïÑ©^T¬Xí#7fº±m ˜ÜnŽ@ýÒÝkÍÍû_x³o´Ni{•J÷ikkd¢¾vüèäñ×ACl^-íªåm>¿†ê]D®Ù¡u +£[ðïSnÎÕ…üªZÛIµ2ý« @¼>Î,m46ïÍù)'¬ÈôˆwSÛ©yÑ˹•k÷ß‘R­õÔÂ%gðL.í—ÆÆ·¾ +^ãˆ('Ï}Uɯ:1Ý…§bÆÐOgüt¼I©VnÞü`xú%Ál_>~P‘Éš`wÕÒF¾¥4º^Z¿¥·÷©d=Û¾ šÐÚ`‚`¬Ð&bq3½|†ªÕˆT³3;7rk/·_°F·ðTKÏÖN^Ñj~Î ©ö•å½Çû·ßÞ{îëõ­û‰âZcxZ]=ãí~ª¹_Z¿›jŸd—O–÷_ؼõ–ÑX«Ž»Ûùü:ÔmT­†„¼Q\ëI¥]"Ùá¬Vc|ƒ4;^:=ÉÅm +Û^-Ÿï½5)Ɖæa÷ðqÿìKæʘÑwi7aò™e»¼g»ÓÛ¸9„Ó›‡tf˜ó¢‡Œ +ÖêQf·ûxv‹+^Vª{ZuÛORË´v¹tOÕòZ~|Çh栗{VçØjìh ôP©ì(“YÉÕm­y…-î9¤{gbam ‘ ý+å»\~CÌo€A€âÅ”º^ÞÚ8yKTcRqùòs§/}kýö;½ÇÙám)7‚@½{òøæËßqbFÍ&Šåõ{¥ûÅÛùõ»~&vÿåÍ[aÊD¥|~ívkïIcçqaíùÊö,ÙŸñK˜Rõ†\Ú”*;|i3žš 8Åë'lè,TmM9c=Ø”‹ Ð\ï1©¾h añéi?0!ôTLm‡ÅjLn8b§¬õ“7’å±+®Ø T‚Lu‡…"¦µäÒ¶Õ>†^&•Òp|fÖ×CŒÁ›LçdåðÉèäµâê ©¸J'« +ã»KQ1ÀYl¦oµÏJkÓýVïLo챩Nºu*D,¬'»gZ÷ + í£5íæqçà±´äíÂðºÕ:hnܸ|óµÞÁc¥´ÎÍþÆÍæø¡Õ¬úöÞíw¶o}ypåµîÑ+ÙáuÞ,ßxyïúë~ÚôV\o1öj Ù>å‹;h¢eUǧßO”×ÆPÚ•j‡ÙÕ»›wßï<ÑŠ›[g¯5/?ˆ›M¥¹GwQs•+îéÍk¹á]ÂìSZùôÁ{­Íû“»Ù\4ÑBô–êÆäj¦u\\>]?¸ÛÚºÕºød[ê7´$—¥mî>œÈ&oõM«w¬7/gWµ= 1€³ Uºç¥,Üh&ÛGVÿ¦5¸S¿˜îßâ³k`@Ç÷ßÞ¾ì׸šl°ÛØÏö¯'ë{r~—‹½ÝûýÝûzÔ~…ͬ¨ÅõLkgçÚë«Üq·–[[÷ºG/KõýÉ ïöJ-ïßxÍ®®ùbòäŽ×ÁIºs¨ÖÄÜfŽãÖLPf’Í™ªŽï®ÝþJãÊëúòµTïÔèœàæÚl@e“ÖÚMB­ûâb˜2<ñTL¨°áZLJYÏ.¢Þ¸Né]?e_p3ÎXŠÔ„> {NÁô!hG„BÉy°d\.OG$/mEå2a­º-åGX²á'4J-J©åTk6»àHÀþÆ[}v ‡Ò* oæ‡w™ì("—€É¥Ruå›jâr¡¼~³µ÷Æ¿ôÚòñ—Šãçˆt7ÀZÕ[ˆHcqv7@s–Íú¶ÕºL(g%²]½Ðδ6ôÚ&t7–lÑÉ’UÛ²ý™…'êð›ò²›[Q*»‰êž^ÝVË#?¥óFýðÞWVo¼#×.'j—MP»Çêõ•íÛ ±”ÝMîi­ÓÔÊ}¶°U´‘ÌüÊîõWìöîÓKHD(Orúò5¥vY)m&Kë•îþ_þøÁë9ˆ´‡ÎÆ]¡´×Ø{²zçÃò»'ÞüðûÙÎþ"–Š[k1s5×ókÏ÷®¾göÎ|„¡WåÂêV÷-¬F„©w P§Ó—ׯ¼`T7ºã[rn„ë-Òèzéì"ª³yæ–¯ñéeŽü(®Õë«7;Û´êeDªbr%ÓÜÕK«1©ÄwôîU£wšh‚‡z1Ç%údÌYµQµAå¶Íë‰Æ1ªÖ"\¶8|ÜdÊK/ÅÔX¢i´¯&+;zi̧:‹A.J'ŒÊ8ÌäçTÑE·ÖBLÞ¬_ÉõîPÉnº¾cAa¦3¢8c& ¹b)*5HTöÃl€™2ÛÐwnL‡ #'»”= +ŠmGx›6ꎸB$ëFk?QÛQŠÛÀcöè^,Õqb µºÉט‘ .µ1½ ºÇÛ#µ´ Q=H& ý“üÊ™^ßár«˜Ùö‹¹TÒk—Áåƒ\.Âç¨T‡IuR•qº¹-Wbr\̪ÅAˆÓI%ÃYÈ2éÞ),¦5cj0’¶VˆTw)ÆSFYkn†×Z»+›c’£V]¿>É­Äd<ÑÎNŠ£“Âð —+¬5­¾è%  åÍááK@8raü þñ’’²#DÌÎH/¡‹¹¾]ß(ww¶®?Ž* ìý‡ÙÖ.Ä•‰Ê5»s¶|ðjmãN¾wlÕ7!E¼öî'õÑ WV‡ÆòdYõôàšVÝ 3ÙîèôÃ?ÿÕµ—¿ŠíBTzU­¥—oÍ)7ÍÎæá ;7ÞŽ©5?— ʵ¸Þã3ëDj%*7ClAϯ4Ç×¥à«~¶´›\¶ÂU»³×Ù½¤M\)³É¶’‡Oq¯½q;&VBó4Ÿl÷6ï£BùÙE|ÆË­•†wScˆ~A¶œÈ¬¼üöŸ^>{ñÜløüæ$ Q©•,ï¥Ê»à›¸˜ãs«’`T„ÁÛ=T©aæ (7âz'Y¿’¨$ª;x!üSVO¶ÃR9$–Q½ ºÝØ}Äæ†ý*WAIbZ]oì"r9ÈdB\&®Íö!¡×A¦¤ÂºÖ<°·*Û×®½•_½ä2¸VQJ«‹aÉ›!Ø©*ˆRÇ’M?c¨Ù6e4–P-È–PÃOSA²|EÔ¼øÚÑC:Õ*¦¬>“[‡ +Çäbº±×;zÉK¥!E‹ÉUèz½:–KkÞÉÖ{&“jù©ÔR˜Çµªš].÷öD»{ÑÃ\ð° ÑDˆ/Š ¿´ctÞlšÍíÖÖíúÖ]½±=q(¥Ê¦W–¢ +HA˜Ï©å­úø¹ÞáTvÛ…ef|‚–ª¥u‘¼ä§g¼´#f bƒÏm åÝEDöázet ü(ÌfüT¢®U?Èu¯›Í3ˆ„^*§V÷£2âÆux¼‘íÒúøô•òêÕ(—ù‚Ø[B˜Úö1Y/@Uª NíÚh#cuÄÒvº{Zß~¨7¯8q{! ªéåê身DjÂÃDi³¸r]+n„ÈÔ`|³¾¼ÿ‡•œå kCΪm=×Ú}!—@ý\ÑDŒÉ#tn1({P}1¢Ø,cö«*ôc“»ÉxÆêÍSš\ôѳŽ¸/"ãœ×Z1µÊQ¡¤–Ö¸4Ì 1Ù_i”Ý…8ÆeW1ÕS'˹S)!;üߧ—Ü):®Ý&Ri˜T-Äç|O÷‚bÞ>«TôêmL.‚ôåW®Ê•-¡¸.”Ö´ú&“¸,ľ°îˆBµˆÔ€NÑD'À]¤šïîëµ-/cGÁ÷©l„/‚#ƒÚ¸ÉŠñ|vTÛ¼çÆ 8±ÒÊYºs0ƒ·‡Zy êÙ§ÈD•I6&ËñQ6e.S™‰>Ú óV˜5{YÊô‚䜇˜yÁEùé<­TÚŽ ŒNvûk \1µÓ¥nŤzD¢±­¬•V…LWÉÁi¼ly) +©¬ js.À9£Š#"‡( èBHuµò6"™(åÕ˜Pš—4B|‰6—ÕâŸ]1÷b ³6N·a6Ik€ËsH2Hf‹³ LR.‡g®ðD`¡0_œ¬÷‘V6oÔ{»¸`QZI/ íÎåÊø¦Ý=Z«Á 1¾LˆåósñY/ªõDu7?¸&Ø/ªÍz˜ Ñ*Û¼½òÌLèÂ"âA8a8øìºÕ½)T®%E‘Àäl\.„ùìD…Í€PqÑy(?<Ñp#¢^ÙÔë`¦‰ê>–l{Ù¬7çC|”µ|¤î–ÜÈn ¹ ˜h)¿ŠéuÖ_=}mçÎ{•í‡LaìŽ' „jÍC?›)öÐ.9¿¾~üRuõT. k0«8Q + 8$®µáõÓÝ«…ñ#€\ÌäZ[r¶‡ˆÅW€¢Š'šœµ +„ë¢ Ie\oS05öÀMÛóˆ ÌLsO0»ççýçæ¼s¸ÎÄŠ—ÍÁ´"TJÏôÐf,‘ê3Ùu¾¸ P烧‡¤%ˆ=í½¼âFE/¡-Å“a¾¢/óÙ1Lët‡^“ÁÄâ7µM¸ +–¤êǹî5³±ÿ¬Pé|÷j{>È-EdG,.IY£¨ÚŒÈ•¥]œØõm¦»ãPEÖRDõs„ZUsÃ9qÑüïõŸ#“œsÖlt²ÑV\׋nT«¬ßÚÔ[‡Bn™¬Ì)ϸq„Ô•t jÞ(ˆ0YùG-nM4לíÎÆ™Yê£l’Ð+nÒFm¥¸E$ÚQ¶pi óP©òF®wpÉC/„i7ýì¥+çÇRnÝO.vr·W)„› >ŽÔkOQ+^ +±Ð.h%°'8 #{Hg6Pk=ªõÂRÅi AA:íŠ(›«M6·)×®0™U'®Ì…È P´Y'”b\*ÓF\.måW®Vï zg1±·”¬nezGË{µm$QÏ®T·ï åÍ‹Œ^+ïSЈ4;`ˆJvPY½éÅS0 Bn5Ù¹žî]ÜBµv+úH3Ægáý˜" ÚXVË»Õõ{…þuÖ\öÆ´FåZ µ +Ê œÏoôø©ÌbXöâI¨mGT–òãìðVfx=·z7Ñ<õñˆ6rv¹4¼.æ×BPÃfÕ:LzOŸì.Gfq°w㵨Xš IÃ¥ËJiW­ƒÏL{éãÌLmcj‹³×!§_ôÒçæ;Y6-¦”¼¸á‹A2M&¡ùt&(xbrký,YYs  +k-§ZÇJi‹µFðÏ3~þ™ÙðGœTÊS Ñ(gk•ÍÂèöå‡ßií¿$dG£þ[ìHÙT&HåRDHÀd¨ô´‡œ,È#•#8ø3 1(Zø_„MSr&JI¤bjŒgÆCþÉEߟwÏ{„ÎJi)LÏúð^Š@‰¦H­Mêm?f_r1ÚDcÖ…\šGfdLeœa²V†ÑóÛ«®x2žh@wBË ‰&i,'Ê—µú“."êù¥¸'ž 1DÌG¤"k¯HÅ1žl…¹´#€ºhˆP(½ +¹Òž|Góbqã¾—+NûÈ0)óZ^H–£J$k ŠÃ›k7¿œY¿‰˜]?›c â‰'0½•ë_ß¹ùÕñõ÷ók‚¢‘%»G[Ëa>µG},¹b¶®Êùím»Â,o49³‡«•ÉÎ#tvÚË/FUÌèÙË×¥Â8ž¨dzriÝCš l&O[£dëL­BœI³zqyÿð÷€XˆêmÌEõ–ìTÖnØíý(ŸQìnfù\›ÍŒ ˜eµAm»±[^Eø *ôÊ.Àg¢4fÓà [k»ä¦ „8­±‰ÓðáMÅÜF\j0Æ20ÀRTS ”Þ\ð>ÜŒˆU6;NÔÍÖ•¨˜- ³vix×›~:kóÑ$|"¢B… |æâb”RŠZ®Ï¥Ja=,gƒÜ¬g”‚h´–&7Íi|z…H´P±â',wvÊ3«ëõµ!*óô ˜÷g#”íòØSÓþ¥ è‰j!6{~²>'ê‰I3©¨-@t> ÏûæÂ<–h@|(.ƒø<`JãŸ>V#|ʼnȎå¬Lûhpòfnõftg'7'òQJEx+&ç«+7 IaFá’J +á"§I£I¥Z€FéÂ:ž]… Å¥{6åÃO¯lôwt÷^âŠ{.4…0v\*xqÍOšJa“K¯Ã(•25tÅS®°À鵸žv#nTÆMjFù¢PX‡^s9LÊÙ­í¨sÇõ¸Ú “Pr×’Ýk–0ït¢h5w©T{)¦Péa~íN{ÿ¥É7’ƒX¢'W[­¥˜ŽiËVçÚòÞ k'¯ÖwªÕm/ªjvw°{ߪo9i!,.„D¨m6ÕÃ…2BYóÞ¸lu +ËgЭ¾ jàŒé¨Ü˜üÐ"½ +(èAµLc?Û;%Í–솸â\P€yŒ‹À`1¥’j]’Nš=åŒ% B¦hœ51ÞD¹Tª²ÉXHO>̈ËUGD9·ˆ:Í7f½L°µk¡ÉšÒØ–Ÿ´ç|ÝÓ*Ê<çÄcz€+ {j;B(•äÅÖøk÷Ñä9äKnÂöPy±°½¦Ao¤«—¡žg}ÜÓ3áó 1žñ‡ÒºàÄ}˜.f‡Éæ!ToL®†˜übD|æbRs1”@…2›ßTd(2퉪ó^vÚI|9™M;/L¹Ÿ™ŽDé|„κcªU§=‹²K±ðÆDÕ¥¼QÛÎ-åúÇù•S©¸”áòd²`‡Õ:®o½XX½Ÿê]bNÒIDÊøè$eö…â>fm²¹»}£Ð».ØÃÅ(¢ B¯…¸t6%ü”Ť:Ç+'Ìø(g˜Ãä8i\kÒù TM6O3ƒÛˆÒôãÉBk[ÍõXr Õ—¤Ÿ‚]³ÛgfçFD¨Á˜»cÀo5ÂXŒ¶€¨î¸á%Ó‰òvuóâ‘Æ•jX(Á|¹qzËøä†ÊÌŒãsùåÓÎþ‹a©9å¦gü Ћ”î¹Ú*‘ìÊå£ÎÞk͵>ëÇ$Óítc+€k +Lýä·+GRõ8,T€jžuÄ&û§$[Ó.₃ L®n$jgˆXñaÚ´sGBÎ;"Œ7.ù Ð “˜ÒŠ‰%?n€Èàj݃ð_!Ð+3™P’ïãjñÙù(.ùduO,Œ}¸åEäP\¡”­düq²fi¬—Öõê.¦wý\éÜ">çÆ“ŸTÓ. 4-Ìä£ÇZ+"}ÑIþÉ¥`\ÈÙõÍ“šZŠ?5›‹èHrElÞ4û×¹TÛá'õt+×=„´øGS Nj:¤úùfÅìöR€f:@+åæèæ¹™È=ë„…ŸßðÆuèâeD¸ m4¸TÖK¸bIÍ5YJ+)Û+Ze‹Nµ"œ ò@°yn€ªCêD |%›!>Cè-.³F˜ChT†bº&—M2Õò[¨¡z!0âZ#.WÔâZ<ÙžŽ(Ó~.Ìd¤ì +¥7…±Õ»ŽhíˆR÷0Ù¹¨ì„qʾ0àñD‡L¹b +ÀÆ‹ÑÄ%/ð‰¤L ‹9/áBAÕ“ljHh=Bï@ç.„•(—÷陫QµM[«à\¸9⦜Q(!TÈ‚ð†X;šèÄ´.œ¿TÚž ñÏ, óA¦ÛG¦ƒlÓ;Q¥ †n·åÒh…ˆ$ı¨X„\6Õ.zYGTeŒ.¸s€ÊN-¡“³ +°Ž˜SZLzc&(/EUhÆeâbnΟ¬VÁȧ±D4Ŭ÷‘6$ŽÅ¨<í%C\‰6‡Fë*0ƒQÎ/ ‹^º½rš*¬øbòRw"JÓƒ˜Çœ#EÙZsýÉ›‘RfÎÏÍhƸ6ð“\ò >Œ·:˜\\p®hbÎÇ&D!\.L Ì`"\9–h£‰®Ÿ©\râ3Îø‚'˜ü‹Óá/Çg&¿È’K;DjtÑ'}áB˜-Η¸dwÞÏJé>c±áD&± º a-\)ËÙ•gO?ÁUgx’S‚D’Ö|z äW™T›HT­àÁÕÉöy^á +€4¸V‹ +v„³âJ×ê¤ÙÙŵŸ[+oܯn?ŠÛNT…À$z±ä$”ᖛʃ4MVô*¬ÒFK´@ äBÉÃ䣩 +—©Ìx– &H¬ øQ°(ÔÌŒ÷ÄÓtj +çg³Ž&BRL¬û©ÂlP'tÓ:n" $†%ûQµƒj½yTÿâú'KÈlA…‚UC˜Ê™€:³†&—=ln&Äq( $ṫ§¸ôH­(…­ÆÆóJa %A +YΨÏxñK§£bMÊËÃ;„1tÆŒK.Ò‘CÂ%7¼‰ª­( {zß‘¦c Ad<À¤!º 3Àá)cEÌŽC|éœ ^–‚¦Œ.ŸY J€F8›7rC„‚2À}4ðÀ‚Ÿ™vb3.Êd%oå¹Úê¬;~ɉM.èÑ6™\ž)œä¦\î¨(OµaÐvÊ@“FØT×¹™ÐSSî‘ŒOvÓÓçâRHq„¤%?öç‹ëN$1µD |1ÓÚ÷S©…}ÖÝaGù +ü9å ´ÌòÍ?TÒý§¦#ç™ ›2Y +1î˜ x ¶"M¨j81¨«mNÖé•r´^Õ + oµ¥Ü:•êO.¹ °ŸHºÑåÁ#BLˆÈ…jaX®«UwRÍ=­º‰ëõÉ"lœ½ ¶a)Êb!›FÊ#ÄÀ'µ–¢ŠŸJí«bùˆ/2ÙÉî !6æ2`âA<%çw¹Ì6¡÷‰d?¦4& ÆÎG¼‰RËKa‰Nö¹ô‘ÛðÊ ¢¬½1©+>#¤º-^2Q:.²âk¼½&¤W!1ŠkÍÑqL*2EÕnH™ì\Ï¥»3]¨rÑjMúÃ5I(¶“Ÿä Ô Ÿ—Ôæd$¨„Ø"È©5¦Üܬ_ +1EÞá‰ÆE@£ Ìì!Ì <`ÏÙ‹6Ä—µê¾\ØQÖæÙ+íçBBÕGåCbe K] +‹QÚs>bÈÓÖ +"O±ôEU°Z°°óóñ¸PöÆ4(¡–Œ²%!ÕŒÂå¡Ô§è¶¶gŸ\\@.¹]€3„P€‚$Fçæ|küôü"~ÑA‚…-À6^¯FÙü_ðÿÉ¥'¦;£Ê´‹~v>:¢:.Õi­éëç¢ÓnbÚC•!|Á‡™K!ÕUôl¯ØÙ€¿äbÊ2@‚3n,Å4n- ú3.bÊ…/ù¸T•²#B«ÈäRÔ•\ð“aJóÒj‡ba7"T¡fs³A᩹ȳÌM@a˜Œ& ' ÚD¥J˜/Ĥóˆ2å"fý,Tˆ’T + GEL®F’É6$”¨PrëLzJ>Ê„.¡€dtÑM8B\\,âj ŠÍ×"Ôd5N57Š†¦˜õÐð£lŒ2©J( B <þáóÚ`Tµc6»eɧ‡&—»ù ä÷ùï%M17f3a¡I|QϹÐ%$æJ´ƒôÑb$¹ˆ·Û3~qÊÊÀÊÙå0—ó‹¸Þg3[´µÆÙà•µ‹Ô œn>,NyIDjb‰—_O÷&C€<Ý1ELVï¼Ý\;ó)[ +TõÑ“ßpÖÀQ#tJÊ §½ àdKôˆîç*”5æs»€F“©vŽ½ˆ + ;bRæC*].o‘ZýÜŒ/×ü¨6çg!oB½]tQç 7–eì Pþ ‹¸7Q S&ÖBH†ÌÙ«zuÖÃ,D8üq‹ÒzPÌîHpkÆÏ≚Müñߌ‡õb)\©SZŠ®pâÙyâ’‹G„ª 3¥jp„Ê’€R™\ŽJX¢ÖŠuÆ\ 07ªH#*ä)½cÔ…ܦ—È9Ñô"bz°Ì´OX ET/a„Øä_|Ð"x} kà.¨:±° ÖàÁL7¼‹ŸóM6õÆä¡£j‰N/§‡JyØÆOQÖF¹´QeÚûàì>6ŠA&jQÚò¢@).d£ Œe’>,á#À‘kP*Þ˜2ë&b¬-¤:„T +Ói€ÉCÐsaÀÕY`ž¥¨²ÐŒÙC&{™Uœ±@§:nÜ€<ŽOþ2—ÛÀô~Tj‚G8"*ÄCFpµÔ@ËÐŒ~:Mí™°ô¯Î9A…ô0&–Á§.¹qÀxHú™îY¶wÍKZΘ¢ä× )ܨT0ícæÔL~pVÛyDš½ “5êG@‰Ž¸¾•çà +ˆÛ”“Š2ÆhÌý!WN6‡â+À.z™)GÜK„)ûÂBèâ¡)†ÅcB\hmj)ÍOœqSq¥•:!¦ì'ó¸ÚAØÌÔBäÒæ +OÏ„@$# &Å¡°Ó=|}çþ·Ž§gG@pÅ©Å8ØñEÇägöa¶¬\N5P¹2íaŠÝRk;‘ä%¿8ÑPJ¯¹qçÆ+¶© +O»0+ÄU„ìV\iqüa·Ž¤ŸL{q+.M-C/8ÐÉ5 T.CƇɂ֞ 'ÀYˆä*™Î…TàêÅ°L\Dh°×(ŸÎw zˆË*¥q\ƒ×·—¢IwL ‘FˆÐA¾üq%&(«3ùõ¯=!É•™B ãRQÎò“ïnÔÒ¦˜yPÝ‘p±ˆr™Å95ï^ðcŽ0Oê]³u +‹iÆC#tãì%?½èg‚¤Ièm±¸Ãd×½djf²É²\êˆIa!拾À9„¹ RI›=ЮEDŽku¹´Åg×C|šÒh\é@vs„˜9« µ|ËA.‹jÍ Aé —®ˆKÅ5ãŒA‡÷å×*—9 ’2›¦—F²½xk£ +ˆ<ù2®¶y¯uù±4©ºJuå:‘˜ÄC"µ ¤ a*a²‹!š%.‰D(nÆCŹ¡¨\€Î:ÄŸ\ð<»€œ_Š_ð0Ó~Þ ÐŽ¨a¶$åÇAš÷ótrb!¥¦œyÎK?}ÉýÌ´Ê&Hd¡D¡ã”ê^}ï‰=¼c´®ÐæhÖ'ñbȃL@ë™™ˆ+,ƒ¿°Ö U; õnˆ-€ËCÇÕF·¸TØÌ·béqftgûî{'ßÛ8~¼U¼ÄèlΡJÝ7€™i½'Z¨Zr¹¹ xÉ'΂™bé0_I:™Ê^:íüCÒw¢“KÄ“:ÄR6f3Ž˜ +è R‚ѱ{P„ó5ÌfgC< QÊG¸zThùA ãFˆ´@1Ü€m”äÊÉÆ‘Þ<„)†vó¢Š#Â;É·®XÂK( =\ýÿÙ{ó渒$Oì ÈôÇjf§»³ŠÅ*^_Ä‹xA‚¸€`â @€÷&’Š8X Ⱥ¶»çn›ÕÎÎhmve’le&íß2}}$Éî/ß‘,frªˆLÔË>˜ð|Gx„‡ßá¾Cò÷·—ÆÏŒ§³vj-¸~;žJ&äÍß­¶þŽ0ú*˜úüü•ró:MÌßo=_y9¹¶wm¹}éjóËprbåùÌæþæ×{{çoÒæv8KœíýÍmÚ$ÈÔÔÆÔúþúÎ?ÜÙùb‹W¾T3vzS_GûBÒ»ôôƒ««{vö!™ºÄíÿâ¬ýrìÚht㜚 [|’,<ÕÓwI—›YÛVS«ÍÇ+[\xøÝ<_>¿²xŸìè`j}zµµü蛋é")Ìsw¿™Zß!]+¸ºö•šûlôê{ƒ¤ÿX|óß~¦‚ñ¥©åÖÄ­Öèµ3zþŒ¾qæò$ ôß\'Í$¸v›ô+ Ï&–wÆ[´._SgFÁv~waü<š)/_ -Ûœ]¹ñtvíàâ••ë«/¦×¿&ÉNÆéoF¯vy!œy:qëéÍÍ››/ÏŒÒ4®‘Фe=Ì~ÌÙ¹«Û×Wwæ7_/"yMºÜܽãùýé¥gãSëçõÌåÉ{DÛ¤Qß:ÎÑ/¤KÓ+íæãïn=ûw×ï~Îo'C!7`4]!…abýõÕÕWãK/i!H.5ªÉ Ú#çãE®8º9N²uæ.­æ¥„øÃ"-:m"²²ãHU¾L”™@³ÝlÿÍË?ü_›ßü³}L¹|mÕNo¤DówiØ«Èõýwë_2aHûMšdP÷Ž¦ïE³÷£™'“«¯§7¾¿ÿ­™}p6$"¥ ¾¶õ‡¥Ç?^_}56AJû£kÍd°L,>þ,˜"Ãíù+­¿Ò7ž\¼z›LÔIb>O¾»±þR_»e¦×§VÛ[ßü‡þ—k«Û®-Ÿ_œXÞšXyyáÊòeâsþ°øôSë¯G¯ÞþÝÅô+=¥¯¯“AïÄ&mÛ+K_G [¤ìMÝzrNÏÄÓdì?Þÿ«•öïÓ¥¯Õ$s>¸ºtmñqpmilœÌ™ù™Û/7wÿîî«?ÝýúOzæ>)º¤}¥ANŸ]ºö•¢knO®¶ôõÛç™Ï.ŒŸ›$Â6“ëñeôùè$IŠëK/noÿþâµÕß]ÿœ ÃôVpuñ|G˜þöâD4û`ùÉͧ¿Ÿ^ß»<Þ$ý¶1võ¬ž¼2sw4œû‹/¢‹ñÒòã·;?þÓííwfDBç$çîì“h&þúíW·Ûý`ï?S÷ÍìÓˆXåì£óW–ÏèÙ3j&šÞ\öÃãƒ|zü_V_þé«xéóËdGÌŒß&éLß çŸ\_;$*»ÿ†ŒRÉhû|Ü ²4Ó÷gÖ¾!U–òK3OÒç =s^øŸõ NEjjrãþµ[÷H Œ]Û »{åÉ3·i«n\¾JJࣹûQóy¼ÔZxüÝãwÿëâÓ?\$õãòäÙËÁ•ÅéæöÂæ›ôæÖÄí¯ ZÜ镤¶‘žÎЬÎÓ¨¾™ZÛ¡‘D7›™GÓ«;WN¬_žºwméå?­½øÛë·÷ÌìC²ŽÓ¹»S+Ïïí®µ¸¾¾»ºýÇûÿpÿð¯®|M,—vÊÒÃãÛ­¿ŒÛjúñøâÖ²Œfi›,^W´ú»wvþ~ûÇÿ:u÷ˆ˜¤ÕÔæµÅ­«‹¯,Þ]x¸7yçu²ðÂÎÂCL¬}L.£ñÍdf}êv‹¶éõ}Rò¯-¶®-l —®]Œnêkë"’}«´1Id\_yqõf‹4íßœKÿì³`bNžËWo][›XÝY~úÝí?^_z~.¼>–Î-nîܺ{øç_DÄüɼ=GJÎÌÓhæ!©‹Ä{?¿|=FüöÎ!Ú.7w._»{Þ.O/¿"+û|´ø›¯ÒÑt‰È#˜zHâïB²úÅåÙß»bÆ—¯ÍßMæîéÙûWnïmìýãÖÛÿ¼üäÇÉæ6m¥éÕí{Kr“æYb$%Wö¦7^“,ø*Y$Jˆ¦6W®=y³¶õÍí—f‰ž|>^&áõ»Ëç®,êfî½m>ûqæþk²h"Âw‚Ä©ñ«4uôÀ„òÒŽ¹ñŒ¾®g¿²s—'Vq~áÁ›¹Gß.<úv¢ùœlybþ4Ï´ +K/®¯ì’m>Ñ|6q‹¤ê½‹ã‹×V¶×Ú¿zü_üåÿy}ãðL8OêÄ9=5½ø`|îîhºxÎÞ YsãîÑüÝãéկό^=;v îÁ´I¦Áø­Çc«ÄÓf7^O­‘º¾<‡™{Wšm2ßfÖ_éÙ‡dm][Ý¿¾òr|þÁø½‰[çÞ~ñã‹ïÿsëû¹ùìG5óøÒÕõ+ ¤ç¼Œf7ãù­ÉÛèì¹yÎ?:•”í©pbåÆÚËä똛[š¤ÅÖÜæë©Û»$OÇo=º÷õïá'IVè¿ç’åôæ6§jâN0¾|æÒ=ÑlÞß_¸w8³ñ:œ~p)½}!&âܘ]£U~…V8Ssû“k¯¢…§—¯n|~™xÚ )?“óOF“E´û™X_$Êßúqnó Ûsñ¿D”ùÕ•sf”À‰[ÏÇ®,^Y\y5¹üurãéÛˆùR͆ë¤u¯;7Õìc.úêíèêª%Ûand’k·Û5çÕ•ù'ÉÌ3µ~ëÞ«G_ÿár²HõÂøòå©»ñ­Öù«k_˜›¯®^]ŸLJN8¹A ÚIç_êë/^Y£W4‚ÉðÆ};ÿDÍܽ4yÛ.>»õìŽÿ÷æ‹¿‹žÒ†"–>6±¾°ùÍöŸ&7ÞÚùç¯Ý9Ü• =y-æoµHžÒ4’.wõÖ3Úd+}-™ŸÌ?¾õ‡¯I¼6ïíüñ΋o'V›ùûæñ±ï&×ÍÔí+swÏÅs_Ù™I¤,œÕs_… ì­ófÁ\GøÀÎmLܺ÷øõßOo¾"…ÐÞxDœ„øê…¤9µör¼Ùºtu•$8R¿Ö_ݸ|m©=zu‰ÌF}}yrùéÌíÇͤì]YzñààžøÖNß»ÍM¬lÛ¹{—®­Œ]¿}ãþAëí?=yý?ÝÜܽ6·O®‘z¿þò¯¢›[´¡.¯“™3±²»ñò¯o>88oç.šuõ'íÖøÖö…«ë´YΓéܽù;/Ç&VÆ›/’Å—×W÷íÿ1“øÆC;u÷Kuã +©Á¤5MßÇñ±ë›é‹tqgrõÉŸŸ¾Ô3ã7Ÿ’öþEx3¼ñxyû÷7[½ÒúRK~sþêoΓø ã+Yxÿô‡Ñ‰Í³vqôÚí14X33wi„×V___{må=GM¬¤7ˆ—>\¸wüìø_n=ûáêêËÑñ•/´jšLò…sñ"©+‹ÿ°ÖþÓÌݽË( 1Kú‰!ýêæãK«gôäÅñ•©;8TÝØü·_%¿»xö`HLàÚ„'ï\˜XžÌÜ}->ûÝØŒ¾¾y!^º-›é»ff“nžÝ|ôC8÷´¡fÏѦÞØŸ»ÿŽìÁÙõ—S+ÄO–¦›7_7·®.o/5²¼n«!µüBºpÖÎÎß}õøðo^|ÿÏ7}Í‘q)iÎ,·—½AsrsnãpñÁ[䨯ï}Lþ›Æ¥ vþÊͧ´k.]¿smí››Oÿúö:p¥ó.¥Íßœ¿r)¹IDBJÝÅäÖg—®ÿöüU²¸É`¹¾¼tÁñÕ•Ço9¥aê¬]"1ñÛà- ‘Ðìú«™Õôê+‹O/Mܾtýþ™øö³Ím¯¶þªùð›ËãK—¯4çï>;úÇWø?–ž|OËÔj÷›¸3µºKLã‹paüVëõŸþﻯÿSÒl“®~ftúêÍç«O~¤=ûßÿçÿìó(œzðð»ÿúäíšYÛ¥q’Ä¡y¸róÑ9{ó\´DªB´@¬ìïÞüÃÿ3ÿ»«+/Γ^}ýÎÅkëc“wõgÑü6íuýîÜÝñÅû¢é¯hÅí’™x0µ¼wwçoÇWÛg“……ͯ[Çÿ¬fîÙùGáüƒóë$”Im›XÝM¡+ôÄíøæóµö¿ßØý§ùßêÉ RÂk«SÍg _O­µ¿ºrû3³L>œY;^zò7Sk¯?fÏE‹8¹õ— ~TsÏ&‹gÍ\:sïbzëw—®6.]U×nÏß{wëé®.¿ü*^øí¥‰±ñúïï.]¿xeõÊò‹[Ï~ÿìíÿv÷ðŸ®o¼>w…&p:™}ø¥^h\œ:‹dõµ`òîì曯ÿò¿mìþû ×Ö’[O–ž|·øøÇÉÛ¯‚Éõ3vþŒ]¸zóÙÜú«ËWÁ<ÕäÝxîñ­‡ï}yêü0×™Ì?ÐÓ—'×Ç®oÉ`g$³÷a +é—¯­M¢ðŠ?П_êdÅ_%eii+œÙHŸNo|³ôü/o>úöbºòÙ¥©3cSìͯÔô¥xn,žÿüÂøg'ôÄúÌêîÔí¯Éú;sy‚hãæÆ+Ræ?¿4yõÖˇoþÓìý㉥¯Óù-ÌÉÊó;Oö/_¹ñggC3ÿüêíoÿåÆÎ?N¬~MXÿÅWÉÍ;»/¿ûçtáþúÆ¿ù2=.\¿½OÚò ôõFDxîÎ×$ÓI7 æ·cÓÁôãta{ãÅß?}ó/ÁÄÆŸfÏéy"§xñ‘ýo¾ÿ2j^º¶ž,Òì'7œ‹›Ë[¿ÿúÿíî«ÿ0{ïífåÿ;%Ÿg'=€ŸëS#2hŸ‘AûÔˆ Ú§FdÐ>5"ƒö©´OÈ }jDíS#2hŸ‘AûÔˆ Ú§FdÐ>5"ƒö©´OÈ }jDíS#2hŸ‘AûÔˆ Ú§FdÐ>5"ƒö©´OÈ }jDíS#2hŸ‘AûÔˆ Ú§FdÐ>5"ƒö©´OÈ }jDíS#2hŸ‘AûÔˆ Ú§FdÐ>5"ƒö©´OÈ }jDíS#2hŸ‘AûÔˆ Ú§FdÐ>5"ƒö©´OÈ }jDíS#2hŸ‘AûÔˆ ÚçÙÿ{J>ËSòùïΞ½q°=»u¼5roaäìÔMû”þ^ÛzsÜ>Y9ûôòÔÑñìnëx÷ð`ëèûÆcÚ4.¯µ·öçäÊ]ÔX9Ú}¹{@ÀõÖÖ^û|ã]:Nÿ ªðî}?2'a<j£’DÓ?ºdÌÚ ´a`6öq‘IÆÂDG:1&H¢êE{¸(&˜IÓ$‰MºÈò]iªâ4ˆc¹¨òºž.ª¼ngäîÈÁÈí‘´qî|ãÞÝ‘Ü7š·ó6}ôöÍÎêÖ1MÉA6™O—VvŽw^ŽŽ +xºMS•ÿadù5~Qü´¾9?·»‡5¸œ}¥¹¿|o©¹|¸ÝÆ×¢¼÷‡ñƹïö÷è§QÖÑîó·Çí7XZ×£­Ò­Ý½í£ö~×Ë7Ž;¿áÿŽ¿Íëz.8{¾qyã`·EÀuzêÁËâ…ï¶öÞÊ•ßýô…[û|Á£T<¾ïïOôŽÉN{÷åÎqÏèø˧ow·wzFÉ]ýÉ1šºùtjïõÎÖSÕ+^»Ûtå°Á5Ÿ•Ãç_·[ÇÓ‡o¶ilÓ‡ØæŒ^0+£Kßô¼^…{.õ€ÑÀ°É±Àö:1Ï·Þ´çŽÚß¼m´zg6¥»>9®ï·>°÷:X¾á«ïìîµ{_þÂ=ŸÃã·GÏ{Åî¨ýæí^ï¬Õ_þÉqÒ½"tðv¥u¼õ®ÕÊßr"‹õvöB»W åÖqóïùèÁ«Ÿ|wFŸãœí;=b×ñO,Ào£Ýƒh^úáÚONg»½ârøº}´u|xÔ3B>9Vë‡oZíù£­×;»­Þ«µ:ÁÍ3s¸ÿúðÍîq{ç—«2½áòlûEc¼6Údœ†Ì4µ ø+1{6ök °¶?N=³Ÿa³_mÑ»÷–wßÔ6`mÖ6`mÖ6à/E,£ú´Xý`2àv 9…v`8 8Ý~×Þ[ßÙÚ>üö—‰Ô³.úæx{¶ýnw êÃvÈßôÉúùÞÛ°úá3DG`?ÆiÓæ·Þ¾y³»u0ýÁeDûðÅ‹7íã}øH®g±Ý»ž±}ŠFïˆô®flŸ„žÑc–Ý¿Âûgøö}ÏêÛ×íÖÛ½­£™Ãƒ7Ç[½oüê' èËß½>|ÚÑ)©e…×A•“ªôIÃb.}D8ePxÂÞîñêÖî‡Lƒác +=KÁWpDäÁ¥ŒÈŒß<"jöþ ³è­£ÝãýöqïááabÕ=»R^õ¾N¯Nb™zG$ì‘ðÄôœ:#áƒ"txìèþãòžKí£—mÌäéW‰Nñ’ürã¨~&GÜÙSâ†ë#³e°p§2ïH¼£™Ãýé£vû‡ž0õŒnh ¨±žÏ{mmï¾í}JüåŸÞí‹t{TRN‚‚{FdXPÛ»{[½‡v‡É3pŠ³Þ–^ïî¾ìYųår·ÞÉ 8w;uÇæN/w«yÚñ´çýdÐ3&ÃÂFOOïiÛòÚ¾û¼g fз{л2VW;xŽ'[í wbŽÝsfn]ë „ÓÀ* Ã"™†¹jÃZÏ‘–™­ƒƒöÞz{¯ÝêÇì©Þøéýâ=a>ÉêŸ~_} ÓcxôŒÞ1!Õ‡8ðb=/ΛþÎÀœÔá—S'Žfwß¼ÞÛjµ÷ÛÇK[¯‡O&=ï¯|Þ s²ž1N¶¿Eê9; úhÐðÿiT¾ªÂ×^±æo½[þò–³ÃÂúfpþt©H¶×³);èl¯÷ëÃXó¥çežÞ‡¼=½§÷vÚ[=g,“²ÚZ:ì=ë4wÃàîÆG‡û½'LñÅŸ^Z@®æ\Ðè´Õ»ëY®>—óAÏÞ½­VëíþÛǨshåoù丵Ùé½ííÝãÝw} —Ýðéê{ßn}ß3)g?Þ:êKÈõƒëM?>ì]¯?<Dz×,rè_¿Ìƒï• +‹w@œ Ÿlß»{{ý$Åîö¼±¶{¯ã&מe²u°»ßÛþ…Ψ wù»Ö©I›é“a± F“:mf@]"Ú6Ó:Ei3uŸÈ"–×7Ó;5 Ëî½àb8SÂî„}(@C"›êÄ™:qæä‘lšÄ™Þ1)Õ‡8ð‰3=ÛHÑ8súÄÑÐ'δNMâLï˜ 'û$Ψ_KâLð¾¡NœiÕ‰3Ã8Óû2 OïCÞ ø™CDÓþÓ’¥âb…}dBÖ‹Q׎øå×â—ÇÉŽáÔ”Œœºùt–«·<íϙד8Ñ–íÓgÔo½¯’Ý…{>½ÖÚ3+{ô‚ ¯þp+Þ4Ь¼o~7¨4èöàÌá|½ï®Ê}ŸÅïÛ{{‡ßöŠçÞîËcú}´…rÅ=£Y¾­vÁÕ.¸ÚW»àd¬§Ôׯv?œH‘ñ—GíöÁ8iíñ݃íÝ—‡ãïv÷ÚÇãGííñã­ƒ:k]w®t?£RWw7åJ%={ì·~ØÝ{ü—y–è¯ÿäõŒS{þèËO—»ãļ?³»l¬4!ßN8wfV짦µC¸z¦•7¯Û-Ò>ú¶1«7žËíËß½&mþ#°ìÜøɱôC8…GYúXÀÚeu¢.+Ò´kgNíÌ©9µ3§væÔÎœtiÀu#ÎçÙaŸNíÌ©9µ3§væü<-YµgªöLýk†²îœÃëš:ÅîŒSyÜûtÖåø*–,Ê!.ϱ·{¼ºµû!÷ìð1†SS™£÷¢^™£ßdÝgÓ§»*GïhÀ«rôŽÈ€Wå8Õ­dN­«[ ª =5Õ­>J‡®åh]ݪ®nõñ&ϯQ„S"@ŸÒwX–³®ju*«Z­ïlm~[·TÚø×”´öÔsé²ú°ÿ`=õaÿ^u„OÍo^¼xÓ>ÆØÚÛ}­Ï°^Ï O·?Àkóùß 4"=7æKšÁ Xá}ô«²>žu Ë¢~„±0(‹sªÝÚµwúŒ¸QeÏöJ§½ ê“Óý`Ò»¤> A­Â gLvÚýd•e—zœLï8}»»ÝGÞ¢»ú“cÔqÔ½î¨v — Z»?SM>ýîä´¸?zG¤v|r.P»?N!k¯Ý§f]j÷Ç€»?`Äoõ‘­U›pCmµú³Õø$h0Ösñ›ç[oÚsGíoÞ¶Z½+i¥»>9‚‡ëǻǭ8‚òF7®¾³»×Ç‘þÂ=ŸÃÞ‰qX¬žÞ놼Ý_io½ëc±ò·|rÌ^mÑ»÷–w{?õ#7÷ˆÓ§¦Á“L5©pŠë/õ.%^î÷®ðÅ' êòKuù¥ª´;¡òKÁXÏíŽ{—‡'€J:â)($U—SªrJu5¥_Æ“tçíÑó·{´ã‡ÖÕXK‚Sƒ}8]†Äü§Ój7ìO)RgOGZïx xZp +3ÐúÀih2Ð:üé*×!ŒÃÓÂÆ‚Úó8ÜžÿcÚ¶§Í÷ßs¢Ð°¹þ{´’þ•ŽÿRek°¶ŒãÕV`_㨭ÀÚ +uq?íÍ™õ…Ì°ð¯{dxHú+Ï÷¶Z¯Æ:|½ÕÚ=þþJ‹7Çßïõî8uWŸØžššÃ·¥Þpí™Ӵ±N¿–ð¯)~T;¼OäìK_lHÔˆ!îoØoãÖgy}¢3,|®Ïî“ë­­>†Â=Ÿþ,kÏZÐÛ£[­v¸o:]6Ó Ò Ûƒ3‡oŽ·>Ô‰/oÕ–ïûä(~»ÓÇ!ø=„iè÷ÑDZËòmÃä\籟šŠa*ì™÷lý°»ÿ¶€Wvý'G*ê¹âT{þè+b»ãÄT­Ù]fÍ~Bª¿Pµ€YáWM·¡‡O÷뙣ûÎÄ}³ôê'àÜ/–7¾{}xÐþ,;7~r,?¢wô°è¾µ‚8$ +b­=õ =ÕÊS­<ÕÊÓ‹öºXë=b‘['?ý#¨°öªQ¼ºµû!bøCÏòñÕ‚Û9dpéà:3_}àÊ<"êé7~3ðlzëh÷xg¿ÝG Šab×½o Þ×éÕI,Sïˆ| W‘ðÄtSš³[‹ÐZ„ž<".B?J…®ÅèIŠÑÞÕ·£½#2àb´_výk” Ã㪮›Jž"Íè/É/7Žá#‹º n Ëá«€ÔkÑ™á³zêFxÿêBHÃA3̵æéÖ7Îp>±¿E깦Å0ì Õܺ}Ë ½¢ÌßzgŠþò!bÃÂ7øpàRt:ˆŒãT9ÍgO± î’"+§þxíè©©Â1Ú³m<èe8N³SnXËqÀIŒu¹s ++<—ü ÙéL ìÛDö0ÄÙ ª÷¾óèç`ÏçC‡…~ w–-5Ü8VæÞ‹öÑÜîÑ©ó‡ ”u>ÞzÞû< ƒkP7zŽ‡0î›ýùþ +÷œ\!°·­µác*§ŽØÆâFÐøuÛ|Mn'Onê×ÂܦO8Q…í!¸s´uðæEïÝ.‡ú‚8¸O£÷‘g j·ÉI¸M>Ƙ3oˆ='œ7µ·÷‹ó†á1‡>Ži ­iè/1†iauvê¦ +žÞ8ØÎZYdyº|x°Jà*£žn¿Ü=Èÿ0²üšŸaä§õï÷Ÿo='Ö|~$hLÑÿî}‹/í‘·#œ–{ßÓ‹ôåk}Û0¥ÆÃÇAc—¯Œj=–&Ê4t8¤*iìà[¥¤™AFé‹2‰!Pv_7Xç΃ÎxVF‚±@‡&JÂØêÀ¦©icqë8Õ–þ5¡ ©0%  MF‡±T+%‘Ž Ò„!]`Ò@¥Q'·…¹ ‚0mÜÛUv,¦§5F£1Ç1!7ªƒ1z[ÒÇ"méa£Zih¹J¥¶qŸ¯ŠÂ(nŒÚ1“Æ}QéX'ôÅŒÅA(‚$cÖ A'ic†Þ)m£áXÙ„ž©Â±001 Qã9jÌX¥ÓÐZ¾‹æMExP†’2c&¤‘àõI6ª˜ÌŒ¼è,‹SqGX»`̬Š¢Ñ†IØPñXlñgœÚ´±9BŒkšÔ„_¦ð„Š-A‚1¢Â%JiQfFh„‘Z=×@«æóCïáõ¦o¡ ]¾D›1­M„÷‘¥5« 8Fhi™Ø†iDë?fÓXk–ÈG¥Xl : +h±¥Läh¤H¸ŠKƒ²I¢C«Óæ&Tˈ$ Œ +ø5XDE“H k"\¥ ”þvÈÇi˜ @j¼"IcCÏ™¡{016Aš1Œ?Ý¥ˆºñ˜$HlÊÃ'ÔT#SiªqSØyLÂÓJC CëÙÈÐ+ G6ÂS Œq…%ÌlÊ7•Phº‰ü”› „†wÄŠf{„6HJSM;}ÑXil¢wB(-¥_Ù/©Ò˜"Ð("&}“Ð$Ó^tÀ{AÓ*† b-³Í·…´sˆb ùåD+d—ë±ÄƒY":7Z¥rMH3IoJcº–´e+ã5&c4ZCÚv&ˆuÈÄAÁ–¤  TÒdÓËB­Ba)ímÚA¡Ðœáá*åmIËB‹á$X5†S'V8†¶´®tÆæдay8ôTm#GW&Æ +O‰¢ŸM IôbÄ{ü'Zˆás« åÈECˆˆ@èm´o@.´´Dšö5-DÌô¥Ò€Ö]‡‰Mp “KjTg§1éæH”ºè®cÞŒ£?5sVEÓFsKû‰.Û%\$üx-ÓBkn,6m•€È™&;s™»Š« $±ÞS@<¥IâÿB™_m#âT¡,8˜Nˆöi†é¥ +ì—’‡F³b yPmÖ@3'5ŽÔ¯È€ÓÑeIL¬a´Å]»[’¶‡ŽCcE•/`–1¢)VQÀ›ˆäÑEz)G®$-„3ŒF΢„&'²,õ’°ÄN$%ê… endstream endobj 5 0 obj <> endobj 35 0 obj <> endobj 44 0 obj [/View/Design] endobj 45 0 obj <>>> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 61 0 obj [60 0 R] endobj 84 0 obj <> endobj xref 0 85 0000000004 65535 f +0000000016 00000 n +0000000173 00000 n +0000044291 00000 n +0000000006 00000 f +0000656362 00000 n +0000000008 00000 f +0000044342 00000 n +0000000009 00000 f +0000000010 00000 f +0000000011 00000 f +0000000012 00000 f +0000000013 00000 f +0000000014 00000 f +0000000015 00000 f +0000000016 00000 f +0000000017 00000 f +0000000020 00000 f +0000656619 00000 n +0000656650 00000 n +0000000021 00000 f +0000000022 00000 f +0000000023 00000 f +0000000024 00000 f +0000000025 00000 f +0000000026 00000 f +0000000027 00000 f +0000000028 00000 f +0000000029 00000 f +0000000030 00000 f +0000000031 00000 f +0000000032 00000 f +0000000033 00000 f +0000000034 00000 f +0000000000 00000 f +0000656432 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000656503 00000 n +0000656534 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000049722 00000 n +0000656735 00000 n +0000044704 00000 n +0000052718 00000 n +0000050035 00000 n +0000049922 00000 n +0000048646 00000 n +0000049161 00000 n +0000049209 00000 n +0000049806 00000 n +0000049837 00000 n +0000050070 00000 n +0000052792 00000 n +0000053144 00000 n +0000054580 00000 n +0000068719 00000 n +0000131658 00000 n +0000197246 00000 n +0000262834 00000 n +0000328422 00000 n +0000394010 00000 n +0000459598 00000 n +0000525186 00000 n +0000590774 00000 n +0000656760 00000 n +trailer <]>> startxref 657001 %%EOF \ No newline at end of file diff --git a/tests/dummy/public/assets/branding/eps/Ember-CLI-Mirage-Logo-Horiz-Black.eps b/tests/dummy/public/assets/branding/eps/Ember-CLI-Mirage-Logo-Horiz-Black.eps new file mode 100644 index 0000000000000000000000000000000000000000..935db9a21a2f70830043978a8ee3aa43ba95fb33 GIT binary patch literal 1139150 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